ZGlmZiAtLWdpdCBhL0RlbW8vZW1iZWQvZGVtby5jIGIvRGVtby9lbWJlZC9kZW1vLmMKaW5kZXggNjAwNWYxMy4uNTViYzgwOCAxMDA2NDQKLS0tIGEvRGVtby9lbWJlZC9kZW1vLmMKKysrIGIvRGVtby9lbWJlZC9kZW1vLmMKQEAgLTYsNDAgKzYsNDAgQEAKIAogbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiB7Ci0JLyogUGFzcyBhcmd2WzBdIHRvIHRoZSBQeXRob24gaW50ZXJwcmV0ZXIgKi8KLQlQeV9TZXRQcm9ncmFtTmFtZShhcmd2WzBdKTsKKyAgICAvKiBQYXNzIGFyZ3ZbMF0gdG8gdGhlIFB5dGhvbiBpbnRlcnByZXRlciAqLworICAgIFB5X1NldFByb2dyYW1OYW1lKGFyZ3ZbMF0pOwogCi0JLyogSW5pdGlhbGl6ZSB0aGUgUHl0aG9uIGludGVycHJldGVyLiAgUmVxdWlyZWQuICovCi0JUHlfSW5pdGlhbGl6ZSgpOworICAgIC8qIEluaXRpYWxpemUgdGhlIFB5dGhvbiBpbnRlcnByZXRlci4gIFJlcXVpcmVkLiAqLworICAgIFB5X0luaXRpYWxpemUoKTsKIAotCS8qIEFkZCBhIHN0YXRpYyBtb2R1bGUgKi8KLQlpbml0eHl6enkoKTsKKyAgICAvKiBBZGQgYSBzdGF0aWMgbW9kdWxlICovCisgICAgaW5pdHh5enp5KCk7CiAKLQkvKiBEZWZpbmUgc3lzLmFyZ3YuICBJdCBpcyB1cCB0byB0aGUgYXBwbGljYXRpb24gaWYgeW91Ci0JICAgd2FudCB0aGlzOyB5b3UgY2FuIGFsc28gbGV0IGl0IHVuZGVmaW5lZCAoc2luY2UgdGhlIFB5dGhvbiAKLQkgICBjb2RlIGlzIGdlbmVyYWxseSBub3QgYSBtYWluIHByb2dyYW0gaXQgaGFzIG5vIGJ1c2luZXNzCi0JICAgdG91Y2hpbmcgc3lzLmFyZ3YuLi4pICovCi0JUHlTeXNfU2V0QXJndihhcmdjLCBhcmd2KTsKKyAgICAvKiBEZWZpbmUgc3lzLmFyZ3YuICBJdCBpcyB1cCB0byB0aGUgYXBwbGljYXRpb24gaWYgeW91CisgICAgICAgd2FudCB0aGlzOyB5b3UgY2FuIGFsc28gbGV0IGl0IHVuZGVmaW5lZCAoc2luY2UgdGhlIFB5dGhvbgorICAgICAgIGNvZGUgaXMgZ2VuZXJhbGx5IG5vdCBhIG1haW4gcHJvZ3JhbSBpdCBoYXMgbm8gYnVzaW5lc3MKKyAgICAgICB0b3VjaGluZyBzeXMuYXJndi4uLikgKi8KKyAgICBQeVN5c19TZXRBcmd2KGFyZ2MsIGFyZ3YpOwogCi0JLyogRG8gc29tZSBhcHBsaWNhdGlvbiBzcGVjaWZpYyBjb2RlICovCi0JcHJpbnRmKCJIZWxsbywgYnJhdmUgbmV3IHdvcmxkXG5cbiIpOworICAgIC8qIERvIHNvbWUgYXBwbGljYXRpb24gc3BlY2lmaWMgY29kZSAqLworICAgIHByaW50ZigiSGVsbG8sIGJyYXZlIG5ldyB3b3JsZFxuXG4iKTsKIAotCS8qIEV4ZWN1dGUgc29tZSBQeXRob24gc3RhdGVtZW50cyAoaW4gbW9kdWxlIF9fbWFpbl9fKSAqLwotCVB5UnVuX1NpbXBsZVN0cmluZygiaW1wb3J0IHN5c1xuIik7Ci0JUHlSdW5fU2ltcGxlU3RyaW5nKCJwcmludCBzeXMuYnVpbHRpbl9tb2R1bGVfbmFtZXNcbiIpOwotCVB5UnVuX1NpbXBsZVN0cmluZygicHJpbnQgc3lzLm1vZHVsZXMua2V5cygpXG4iKTsKLQlQeVJ1bl9TaW1wbGVTdHJpbmcoInByaW50IHN5cy5leGVjdXRhYmxlXG4iKTsKLQlQeVJ1bl9TaW1wbGVTdHJpbmcoInByaW50IHN5cy5hcmd2XG4iKTsKKyAgICAvKiBFeGVjdXRlIHNvbWUgUHl0aG9uIHN0YXRlbWVudHMgKGluIG1vZHVsZSBfX21haW5fXykgKi8KKyAgICBQeVJ1bl9TaW1wbGVTdHJpbmcoImltcG9ydCBzeXNcbiIpOworICAgIFB5UnVuX1NpbXBsZVN0cmluZygicHJpbnQgc3lzLmJ1aWx0aW5fbW9kdWxlX25hbWVzXG4iKTsKKyAgICBQeVJ1bl9TaW1wbGVTdHJpbmcoInByaW50IHN5cy5tb2R1bGVzLmtleXMoKVxuIik7CisgICAgUHlSdW5fU2ltcGxlU3RyaW5nKCJwcmludCBzeXMuZXhlY3V0YWJsZVxuIik7CisgICAgUHlSdW5fU2ltcGxlU3RyaW5nKCJwcmludCBzeXMuYXJndlxuIik7CiAKLQkvKiBOb3RlIHRoYXQgeW91IGNhbiBjYWxsIGFueSBwdWJsaWMgZnVuY3Rpb24gb2YgdGhlIFB5dGhvbgotCSAgIGludGVycHJldGVyIGhlcmUsIGUuZy4gY2FsbF9vYmplY3QoKS4gKi8KKyAgICAvKiBOb3RlIHRoYXQgeW91IGNhbiBjYWxsIGFueSBwdWJsaWMgZnVuY3Rpb24gb2YgdGhlIFB5dGhvbgorICAgICAgIGludGVycHJldGVyIGhlcmUsIGUuZy4gY2FsbF9vYmplY3QoKS4gKi8KIAotCS8qIFNvbWUgbW9yZSBhcHBsaWNhdGlvbiBzcGVjaWZpYyBjb2RlICovCi0JcHJpbnRmKCJcbkdvb2RieWUsIGNydWVsIHdvcmxkXG4iKTsKKyAgICAvKiBTb21lIG1vcmUgYXBwbGljYXRpb24gc3BlY2lmaWMgY29kZSAqLworICAgIHByaW50ZigiXG5Hb29kYnllLCBjcnVlbCB3b3JsZFxuIik7CiAKLQkvKiBFeGl0LCBjbGVhbmluZyB1cCB0aGUgaW50ZXJwcmV0ZXIgKi8KLQlQeV9FeGl0KDApOwotCS8qTk9UUkVBQ0hFRCovCisgICAgLyogRXhpdCwgY2xlYW5pbmcgdXAgdGhlIGludGVycHJldGVyICovCisgICAgUHlfRXhpdCgwKTsKKyAgICAvKk5PVFJFQUNIRUQqLwogfQogCiAvKiBBIHN0YXRpYyBtb2R1bGUgKi8KQEAgLTQ4LDE4ICs0OCwxOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHh5enp5X2ZvbyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QqIGFyZ3MpCiB7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKDQyTCk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKDQyTCk7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiB4eXp6eV9tZXRob2RzW10gPSB7Ci0JeyJmb28iLAkJeHl6enlfZm9vLAlNRVRIX05PQVJHUywKLQkgIlJldHVybiB0aGUgbWVhbmluZyBvZiBldmVyeXRoaW5nLiJ9LAotCXtOVUxMLAkJTlVMTH0JCS8qIHNlbnRpbmVsICovCisgICAgeyJmb28iLCAgICAgICAgICAgICB4eXp6eV9mb28sICAgICAgTUVUSF9OT0FSR1MsCisgICAgICJSZXR1cm4gdGhlIG1lYW5pbmcgb2YgZXZlcnl0aGluZy4ifSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogdm9pZAogaW5pdHh5enp5KHZvaWQpCiB7Ci0JUHlJbXBvcnRfQWRkTW9kdWxlKCJ4eXp6eSIpOwotCVB5X0luaXRNb2R1bGUoInh5enp5IiwgeHl6enlfbWV0aG9kcyk7CisgICAgUHlJbXBvcnRfQWRkTW9kdWxlKCJ4eXp6eSIpOworICAgIFB5X0luaXRNb2R1bGUoInh5enp5IiwgeHl6enlfbWV0aG9kcyk7CiB9CmRpZmYgLS1naXQgYS9EZW1vL2VtYmVkL2xvb3AuYyBiL0RlbW8vZW1iZWQvbG9vcC5jCmluZGV4IGQ1YWY4MjkuLjJmN2ZlNjIgMTAwNjQ0Ci0tLSBhL0RlbW8vZW1iZWQvbG9vcC5jCisrKyBiL0RlbW8vZW1iZWQvbG9vcC5jCkBAIC02LDI4ICs2LDI4IEBACiAKIG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogewotCWludCBjb3VudCA9IC0xOwotCWNoYXIgKmNvbW1hbmQ7CisgICAgaW50IGNvdW50ID0gLTE7CisgICAgY2hhciAqY29tbWFuZDsKIAotCWlmIChhcmdjIDwgMiB8fCBhcmdjID4gMykgewotCQlmcHJpbnRmKHN0ZGVyciwgInVzYWdlOiBsb29wIDxweXRob24tY29tbWFuZD4gW2NvdW50XVxuIik7Ci0JCWV4aXQoMik7Ci0JfQotCWNvbW1hbmQgPSBhcmd2WzFdOworICAgIGlmIChhcmdjIDwgMiB8fCBhcmdjID4gMykgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInVzYWdlOiBsb29wIDxweXRob24tY29tbWFuZD4gW2NvdW50XVxuIik7CisgICAgICAgIGV4aXQoMik7CisgICAgfQorICAgIGNvbW1hbmQgPSBhcmd2WzFdOwogCi0JaWYgKGFyZ2MgPT0gMykgewotCQljb3VudCA9IGF0b2koYXJndlsyXSk7Ci0JfQorICAgIGlmIChhcmdjID09IDMpIHsKKyAgICAgICAgY291bnQgPSBhdG9pKGFyZ3ZbMl0pOworICAgIH0KIAotCVB5X1NldFByb2dyYW1OYW1lKGFyZ3ZbMF0pOworICAgIFB5X1NldFByb2dyYW1OYW1lKGFyZ3ZbMF0pOwogCi0JLyogdW5jb21tZW50IHRoaXMgaWYgeW91IGRvbid0IHdhbnQgdG8gbG9hZCBzaXRlLnB5ICovCi0JLyogUHlfTm9TaXRlRmxhZyA9IDE7ICovCisgICAgLyogdW5jb21tZW50IHRoaXMgaWYgeW91IGRvbid0IHdhbnQgdG8gbG9hZCBzaXRlLnB5ICovCisgICAgLyogUHlfTm9TaXRlRmxhZyA9IDE7ICovCiAKLQl3aGlsZSAoY291bnQgPT0gLTEgfHwgLS1jb3VudCA+PSAwICkgewotCQlQeV9Jbml0aWFsaXplKCk7Ci0JCVB5UnVuX1NpbXBsZVN0cmluZyhjb21tYW5kKTsKLQkJUHlfRmluYWxpemUoKTsKLQl9Ci0JcmV0dXJuIDA7CisgICAgd2hpbGUgKGNvdW50ID09IC0xIHx8IC0tY291bnQgPj0gMCApIHsKKyAgICAgICAgUHlfSW5pdGlhbGl6ZSgpOworICAgICAgICBQeVJ1bl9TaW1wbGVTdHJpbmcoY29tbWFuZCk7CisgICAgICAgIFB5X0ZpbmFsaXplKCk7CisgICAgfQorICAgIHJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvRGVtby9weXN2ci9weXN2ci5jIGIvRGVtby9weXN2ci9weXN2ci5jCmluZGV4IGNjZWQ2ZGEuLjcwNmNkMmEgMTAwNjQ0Ci0tLSBhL0RlbW8vcHlzdnIvcHlzdnIuYworKysgYi9EZW1vL3B5c3ZyL3B5c3ZyLmMKQEAgLTM0LDggKzM0LDggQEAKICNlbmRpZgogCiBzdHJ1Y3Qgd29ya29yZGVyIHsKLQlpbnQgY29ubjsKLQlzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcjsKKyAgICBpbnQgY29ubjsKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcjsKIH07CiAKIC8qIEZvcndhcmQgKi8KQEAgLTU1LDQwICs1NSw0MCBAQAogCiBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKIHsKLQlpbnQgcG9ydCA9IFBPUlQ7Ci0JaW50IGM7CisgICAgaW50IHBvcnQgPSBQT1JUOworICAgIGludCBjOwogCi0JaWYgKGFyZ2MgPiAwICYmIGFyZ3ZbMF0gIT0gTlVMTCAmJiBhcmd2WzBdWzBdICE9ICdcMCcpCi0JCXByb2duYW1lID0gYXJndlswXTsKKyAgICBpZiAoYXJnYyA+IDAgJiYgYXJndlswXSAhPSBOVUxMICYmIGFyZ3ZbMF1bMF0gIT0gJ1wwJykKKyAgICAgICAgcHJvZ25hbWUgPSBhcmd2WzBdOwogCi0Jd2hpbGUgKChjID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJ2IikpICE9IEVPRikgewotCQlzd2l0Y2ggKGMpIHsKLQkJY2FzZSAndic6Ci0JCQlQeV9WZXJib3NlRmxhZysrOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQl1c2FnZSgpOwotCQl9Ci0JfQorICAgIHdoaWxlICgoYyA9IGdldG9wdChhcmdjLCBhcmd2LCAidiIpKSAhPSBFT0YpIHsKKyAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgIGNhc2UgJ3YnOgorICAgICAgICAgICAgUHlfVmVyYm9zZUZsYWcrKzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgdXNhZ2UoKTsKKyAgICAgICAgfQorICAgIH0KIAotCWlmIChvcHRpbmQgPCBhcmdjKSB7Ci0JCWlmIChvcHRpbmQrMSA8IGFyZ2MpIHsKLQkJCW9wcm9nbmFtZSgpOwotCQkJZnByaW50ZihzdGRlcnIsICJ0b28gbWFueSBhcmd1bWVudHNcbiIpOwotCQkJdXNhZ2UoKTsKLQkJfQotCQlwb3J0ID0gYXRvaShhcmd2W29wdGluZF0pOwotCQlpZiAocG9ydCA8PSAwKSB7Ci0JCQlmcHJpbnRmKHN0ZGVyciwgImJhZCBwb3J0ICglcylcbiIsIGFyZ3Zbb3B0aW5kXSk7Ci0JCQl1c2FnZSgpOwotCQl9Ci0JfQorICAgIGlmIChvcHRpbmQgPCBhcmdjKSB7CisgICAgICAgIGlmIChvcHRpbmQrMSA8IGFyZ2MpIHsKKyAgICAgICAgICAgIG9wcm9nbmFtZSgpOworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJ0b28gbWFueSBhcmd1bWVudHNcbiIpOworICAgICAgICAgICAgdXNhZ2UoKTsKKyAgICAgICAgfQorICAgICAgICBwb3J0ID0gYXRvaShhcmd2W29wdGluZF0pOworICAgICAgICBpZiAocG9ydCA8PSAwKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImJhZCBwb3J0ICglcylcbiIsIGFyZ3Zbb3B0aW5kXSk7CisgICAgICAgICAgICB1c2FnZSgpOworICAgICAgICB9CisgICAgfQogCi0JbWFpbl90aHJlYWQocG9ydCk7CisgICAgbWFpbl90aHJlYWQocG9ydCk7CiAKLQlmcHJpbnRmKHN0ZGVyciwgIkJ5ZS5cbiIpOworICAgIGZwcmludGYoc3RkZXJyLCAiQnllLlxuIik7CiAKLQlleGl0KDApOworICAgIGV4aXQoMCk7CiB9CiAKIHN0YXRpYyBjaGFyIHVzYWdlX2xpbmVbXSA9ICJ1c2FnZTogJXMgW3BvcnRdXG4iOwpAQCAtOTYsMTIwICs5NiwxMjAgQEAKIHN0YXRpYyB2b2lkCiB1c2FnZSh2b2lkKQogewotCWZwcmludGYoc3RkZXJyLCB1c2FnZV9saW5lLCBwcm9nbmFtZSk7Ci0JZXhpdCgyKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgdXNhZ2VfbGluZSwgcHJvZ25hbWUpOworICAgIGV4aXQoMik7CiB9CiAKIHN0YXRpYyB2b2lkCiBtYWluX3RocmVhZChpbnQgcG9ydCkKIHsKLQlpbnQgc29jaywgY29ubiwgc2l6ZSwgaTsKLQlzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkciwgY2xpZW50YWRkcjsKKyAgICBpbnQgc29jaywgY29ubiwgc2l6ZSwgaTsKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkciwgY2xpZW50YWRkcjsKIAotCXNvY2sgPSBzb2NrZXQoUEZfSU5FVCwgU09DS19TVFJFQU0sIDApOwotCWlmIChzb2NrIDwgMCkgewotCQlvcHJvZ25hbWUoKTsKLQkJcGVycm9yKCJjYW4ndCBjcmVhdGUgc29ja2V0Iik7Ci0JCWV4aXQoMSk7Ci0JfQorICAgIHNvY2sgPSBzb2NrZXQoUEZfSU5FVCwgU09DS19TVFJFQU0sIDApOworICAgIGlmIChzb2NrIDwgMCkgeworICAgICAgICBvcHJvZ25hbWUoKTsKKyAgICAgICAgcGVycm9yKCJjYW4ndCBjcmVhdGUgc29ja2V0Iik7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQogCiAjaWZkZWYgU09fUkVVU0VBRERSCi0JaSA9IDE7Ci0Jc2V0c29ja29wdChzb2NrLCBTT0xfU09DS0VULCBTT19SRVVTRUFERFIsIChjaGFyICopICZpLCBzaXplb2YgaSk7CisgICAgaSA9IDE7CisgICAgc2V0c29ja29wdChzb2NrLCBTT0xfU09DS0VULCBTT19SRVVTRUFERFIsIChjaGFyICopICZpLCBzaXplb2YgaSk7CiAjZW5kaWYKIAotCW1lbXNldCgoY2hhciAqKSZhZGRyLCAnXDAnLCBzaXplb2YgYWRkcik7Ci0JYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKLQlhZGRyLnNpbl9wb3J0ID0gaHRvbnMocG9ydCk7Ci0JYWRkci5zaW5fYWRkci5zX2FkZHIgPSAwTDsKLQlpZiAoYmluZChzb2NrLCAoc3RydWN0IHNvY2thZGRyICopJmFkZHIsIHNpemVvZiBhZGRyKSA8IDApIHsKLQkJb3Byb2duYW1lKCk7Ci0JCXBlcnJvcigiY2FuJ3QgYmluZCBzb2NrZXQgdG8gYWRkcmVzcyIpOwotCQlleGl0KDEpOwotCX0KKyAgICBtZW1zZXQoKGNoYXIgKikmYWRkciwgJ1wwJywgc2l6ZW9mIGFkZHIpOworICAgIGFkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisgICAgYWRkci5zaW5fcG9ydCA9IGh0b25zKHBvcnQpOworICAgIGFkZHIuc2luX2FkZHIuc19hZGRyID0gMEw7CisgICAgaWYgKGJpbmQoc29jaywgKHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyLCBzaXplb2YgYWRkcikgPCAwKSB7CisgICAgICAgIG9wcm9nbmFtZSgpOworICAgICAgICBwZXJyb3IoImNhbid0IGJpbmQgc29ja2V0IHRvIGFkZHJlc3MiKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CiAKLQlpZiAobGlzdGVuKHNvY2ssIDUpIDwgMCkgewotCQlvcHJvZ25hbWUoKTsKLQkJcGVycm9yKCJjYW4ndCBsaXN0ZW4gb24gc29ja2V0Iik7Ci0JCWV4aXQoMSk7Ci0JfQorICAgIGlmIChsaXN0ZW4oc29jaywgNSkgPCAwKSB7CisgICAgICAgIG9wcm9nbmFtZSgpOworICAgICAgICBwZXJyb3IoImNhbid0IGxpc3RlbiBvbiBzb2NrZXQiKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CiAKLQlmcHJpbnRmKHN0ZGVyciwgIkxpc3RlbmluZyBvbiBwb3J0ICVkLi4uXG4iLCBwb3J0KTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkxpc3RlbmluZyBvbiBwb3J0ICVkLi4uXG4iLCBwb3J0KTsKIAotCWZvciAoaSA9IDA7IDsgaSsrKSB7Ci0JCXNpemUgPSBzaXplb2YgY2xpZW50YWRkcjsKLQkJbWVtc2V0KChjaGFyICopICZjbGllbnRhZGRyLCAnXDAnLCBzaXplKTsKLQkJY29ubiA9IGFjY2VwdChzb2NrLCAoc3RydWN0IHNvY2thZGRyICopICZjbGllbnRhZGRyLCAmc2l6ZSk7Ci0JCWlmIChjb25uIDwgMCkgewotCQkJb3Byb2duYW1lKCk7Ci0JCQlwZXJyb3IoImNhbid0IGFjY2VwdCBjb25uZWN0aW9uIGZyb20gc29ja2V0Iik7Ci0JCQlleGl0KDEpOwotCQl9CisgICAgZm9yIChpID0gMDsgOyBpKyspIHsKKyAgICAgICAgc2l6ZSA9IHNpemVvZiBjbGllbnRhZGRyOworICAgICAgICBtZW1zZXQoKGNoYXIgKikgJmNsaWVudGFkZHIsICdcMCcsIHNpemUpOworICAgICAgICBjb25uID0gYWNjZXB0KHNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmNsaWVudGFkZHIsICZzaXplKTsKKyAgICAgICAgaWYgKGNvbm4gPCAwKSB7CisgICAgICAgICAgICBvcHJvZ25hbWUoKTsKKyAgICAgICAgICAgIHBlcnJvcigiY2FuJ3QgYWNjZXB0IGNvbm5lY3Rpb24gZnJvbSBzb2NrZXQiKTsKKyAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgIH0KIAotCQlzaXplID0gc2l6ZW9mIGFkZHI7Ci0JCW1lbXNldCgoY2hhciAqKSAmYWRkciwgJ1wwJywgc2l6ZSk7Ci0JCWlmIChnZXRzb2NrbmFtZShjb25uLCAoc3RydWN0IHNvY2thZGRyICopJmFkZHIsICZzaXplKSA8IDApIHsKLQkJCW9wcm9nbmFtZSgpOwotCQkJcGVycm9yKCJjYW4ndCBnZXQgc29ja2V0IG5hbWUgb2YgY29ubmVjdGlvbiIpOwotCQkJZXhpdCgxKTsKLQkJfQotCQlpZiAoY2xpZW50YWRkci5zaW5fYWRkci5zX2FkZHIgIT0gYWRkci5zaW5fYWRkci5zX2FkZHIpIHsKLQkJCW9wcm9nbmFtZSgpOwotCQkJcGVycm9yKCJjb25uZWN0aW9uIGZyb20gbm9uLWxvY2FsIGhvc3QgcmVmdXNlZCIpOwotCQkJZnByaW50ZihzdGRlcnIsICIoYWRkcj0lbHgsIGNsaWVudGFkZHI9JWx4KVxuIiwKLQkJCQludG9obChhZGRyLnNpbl9hZGRyLnNfYWRkciksCi0JCQkJbnRvaGwoY2xpZW50YWRkci5zaW5fYWRkci5zX2FkZHIpKTsKLQkJCWNsb3NlKGNvbm4pOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKGkgPT0gNCkgewotCQkJY2xvc2UoY29ubik7Ci0JCQlicmVhazsKLQkJfQotCQljcmVhdGVfdGhyZWFkKGNvbm4sICZjbGllbnRhZGRyKTsKLQl9CisgICAgICAgIHNpemUgPSBzaXplb2YgYWRkcjsKKyAgICAgICAgbWVtc2V0KChjaGFyICopICZhZGRyLCAnXDAnLCBzaXplKTsKKyAgICAgICAgaWYgKGdldHNvY2tuYW1lKGNvbm4sIChzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkciwgJnNpemUpIDwgMCkgeworICAgICAgICAgICAgb3Byb2duYW1lKCk7CisgICAgICAgICAgICBwZXJyb3IoImNhbid0IGdldCBzb2NrZXQgbmFtZSBvZiBjb25uZWN0aW9uIik7CisgICAgICAgICAgICBleGl0KDEpOworICAgICAgICB9CisgICAgICAgIGlmIChjbGllbnRhZGRyLnNpbl9hZGRyLnNfYWRkciAhPSBhZGRyLnNpbl9hZGRyLnNfYWRkcikgeworICAgICAgICAgICAgb3Byb2duYW1lKCk7CisgICAgICAgICAgICBwZXJyb3IoImNvbm5lY3Rpb24gZnJvbSBub24tbG9jYWwgaG9zdCByZWZ1c2VkIik7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIihhZGRyPSVseCwgY2xpZW50YWRkcj0lbHgpXG4iLAorICAgICAgICAgICAgICAgIG50b2hsKGFkZHIuc2luX2FkZHIuc19hZGRyKSwKKyAgICAgICAgICAgICAgICBudG9obChjbGllbnRhZGRyLnNpbl9hZGRyLnNfYWRkcikpOworICAgICAgICAgICAgY2xvc2UoY29ubik7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaSA9PSA0KSB7CisgICAgICAgICAgICBjbG9zZShjb25uKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNyZWF0ZV90aHJlYWQoY29ubiwgJmNsaWVudGFkZHIpOworICAgIH0KIAotCWNsb3NlKHNvY2spOworICAgIGNsb3NlKHNvY2spOwogCi0JaWYgKGd0c3RhdGUpIHsKLQkJUHlFdmFsX0FjcXVpcmVUaHJlYWQoZ3RzdGF0ZSk7Ci0JCWd0c3RhdGUgPSBOVUxMOwotCQlQeV9GaW5hbGl6ZSgpOwotCQkvKiBBbmQgYSBzZWNvbmQgdGltZSwganVzdCBiZWNhdXNlIHdlIGNhbi4gKi8KLQkJUHlfRmluYWxpemUoKTsgLyogVGhpcyBzaG91bGQgYmUgaGFybWxlc3MuICovCi0JfQotCWV4aXQoMCk7CisgICAgaWYgKGd0c3RhdGUpIHsKKyAgICAgICAgUHlFdmFsX0FjcXVpcmVUaHJlYWQoZ3RzdGF0ZSk7CisgICAgICAgIGd0c3RhdGUgPSBOVUxMOworICAgICAgICBQeV9GaW5hbGl6ZSgpOworICAgICAgICAvKiBBbmQgYSBzZWNvbmQgdGltZSwganVzdCBiZWNhdXNlIHdlIGNhbi4gKi8KKyAgICAgICAgUHlfRmluYWxpemUoKTsgLyogVGhpcyBzaG91bGQgYmUgaGFybWxlc3MuICovCisgICAgfQorICAgIGV4aXQoMCk7CiB9CiAKIHN0YXRpYyB2b2lkCiBjcmVhdGVfdGhyZWFkKGludCBjb25uLCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKmFkZHIpCiB7Ci0Jc3RydWN0IHdvcmtvcmRlciAqd29yazsKLQlwdGhyZWFkX3QgdGRhdGE7CisgICAgc3RydWN0IHdvcmtvcmRlciAqd29yazsKKyAgICBwdGhyZWFkX3QgdGRhdGE7CiAKLQl3b3JrID0gbWFsbG9jKHNpemVvZihzdHJ1Y3Qgd29ya29yZGVyKSk7Ci0JaWYgKHdvcmsgPT0gTlVMTCkgewotCQlvcHJvZ25hbWUoKTsKLQkJZnByaW50ZihzdGRlcnIsICJvdXQgb2YgbWVtb3J5IGZvciB0aHJlYWQuXG4iKTsKLQkJY2xvc2UoY29ubik7Ci0JCXJldHVybjsKLQl9Ci0Jd29yay0+Y29ubiA9IGNvbm47Ci0Jd29yay0+YWRkciA9ICphZGRyOworICAgIHdvcmsgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCB3b3Jrb3JkZXIpKTsKKyAgICBpZiAod29yayA9PSBOVUxMKSB7CisgICAgICAgIG9wcm9nbmFtZSgpOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIm91dCBvZiBtZW1vcnkgZm9yIHRocmVhZC5cbiIpOworICAgICAgICBjbG9zZShjb25uKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICB3b3JrLT5jb25uID0gY29ubjsKKyAgICB3b3JrLT5hZGRyID0gKmFkZHI7CiAKLQlpbml0X3B5dGhvbigpOworICAgIGluaXRfcHl0aG9uKCk7CiAKLQlpZiAocHRocmVhZF9jcmVhdGUoJnRkYXRhLCBOVUxMLCAodm9pZCAqKXNlcnZpY2VfdGhyZWFkLCB3b3JrKSA8IDApIHsKLQkJb3Byb2duYW1lKCk7Ci0JCXBlcnJvcigiY2FuJ3QgY3JlYXRlIG5ldyB0aHJlYWQiKTsKLQkJY2xvc2UoY29ubik7Ci0JCXJldHVybjsKLQl9CisgICAgaWYgKHB0aHJlYWRfY3JlYXRlKCZ0ZGF0YSwgTlVMTCwgKHZvaWQgKilzZXJ2aWNlX3RocmVhZCwgd29yaykgPCAwKSB7CisgICAgICAgIG9wcm9nbmFtZSgpOworICAgICAgICBwZXJyb3IoImNhbid0IGNyZWF0ZSBuZXcgdGhyZWFkIik7CisgICAgICAgIGNsb3NlKGNvbm4pOworICAgICAgICByZXR1cm47CisgICAgfQogCi0JaWYgKHB0aHJlYWRfZGV0YWNoKHRkYXRhKSA8IDApIHsKLQkJb3Byb2duYW1lKCk7Ci0JCXBlcnJvcigiY2FuJ3QgZGV0YWNoIGZyb20gdGhyZWFkIik7Ci0JfQorICAgIGlmIChwdGhyZWFkX2RldGFjaCh0ZGF0YSkgPCAwKSB7CisgICAgICAgIG9wcm9nbmFtZSgpOworICAgICAgICBwZXJyb3IoImNhbid0IGRldGFjaCBmcm9tIHRocmVhZCIpOworICAgIH0KIH0KIAogc3RhdGljIFB5VGhyZWFkU3RhdGUgKnRoZV90c3RhdGU7CkBAIC0yMTksMTUyICsyMTksMTUyIEBACiBzdGF0aWMgdm9pZAogaW5pdF9weXRob24odm9pZCkKIHsKLQlpZiAoZ3RzdGF0ZSkKLQkJcmV0dXJuOwotCVB5X0luaXRpYWxpemUoKTsgLyogSW5pdGlhbGl6ZSB0aGUgaW50ZXJwcmV0ZXIgKi8KLQlQeUV2YWxfSW5pdFRocmVhZHMoKTsgLyogQ3JlYXRlIChhbmQgYWNxdWlyZSkgdGhlIGludGVycHJldGVyIGxvY2sgKi8KLQlndHN0YXRlID0gUHlFdmFsX1NhdmVUaHJlYWQoKTsgLyogUmVsZWFzZSB0aGUgdGhyZWFkIHN0YXRlICovCisgICAgaWYgKGd0c3RhdGUpCisgICAgICAgIHJldHVybjsKKyAgICBQeV9Jbml0aWFsaXplKCk7IC8qIEluaXRpYWxpemUgdGhlIGludGVycHJldGVyICovCisgICAgUHlFdmFsX0luaXRUaHJlYWRzKCk7IC8qIENyZWF0ZSAoYW5kIGFjcXVpcmUpIHRoZSBpbnRlcnByZXRlciBsb2NrICovCisgICAgZ3RzdGF0ZSA9IFB5RXZhbF9TYXZlVGhyZWFkKCk7IC8qIFJlbGVhc2UgdGhlIHRocmVhZCBzdGF0ZSAqLwogfQogCiBzdGF0aWMgdm9pZCAqCiBzZXJ2aWNlX3RocmVhZChzdHJ1Y3Qgd29ya29yZGVyICp3b3JrKQogewotCUZJTEUgKmlucHV0LCAqb3V0cHV0OworICAgIEZJTEUgKmlucHV0LCAqb3V0cHV0OwogCi0JZnByaW50ZihzdGRlcnIsICJTdGFydCB0aHJlYWQgZm9yIGNvbm5lY3Rpb24gJWQuXG4iLCB3b3JrLT5jb25uKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlN0YXJ0IHRocmVhZCBmb3IgY29ubmVjdGlvbiAlZC5cbiIsIHdvcmstPmNvbm4pOwogCi0JcHMoKTsKKyAgICBwcygpOwogCi0JaW5wdXQgPSBmZG9wZW4od29yay0+Y29ubiwgInIiKTsKLQlpZiAoaW5wdXQgPT0gTlVMTCkgewotCQlvcHJvZ25hbWUoKTsKLQkJcGVycm9yKCJjYW4ndCBjcmVhdGUgaW5wdXQgc3RyZWFtIik7Ci0JCWdvdG8gZG9uZTsKLQl9CisgICAgaW5wdXQgPSBmZG9wZW4od29yay0+Y29ubiwgInIiKTsKKyAgICBpZiAoaW5wdXQgPT0gTlVMTCkgeworICAgICAgICBvcHJvZ25hbWUoKTsKKyAgICAgICAgcGVycm9yKCJjYW4ndCBjcmVhdGUgaW5wdXQgc3RyZWFtIik7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICB9CiAKLQlvdXRwdXQgPSBmZG9wZW4od29yay0+Y29ubiwgInciKTsKLQlpZiAob3V0cHV0ID09IE5VTEwpIHsKLQkJb3Byb2duYW1lKCk7Ci0JCXBlcnJvcigiY2FuJ3QgY3JlYXRlIG91dHB1dCBzdHJlYW0iKTsKLQkJZmNsb3NlKGlucHV0KTsKLQkJZ290byBkb25lOwotCX0KKyAgICBvdXRwdXQgPSBmZG9wZW4od29yay0+Y29ubiwgInciKTsKKyAgICBpZiAob3V0cHV0ID09IE5VTEwpIHsKKyAgICAgICAgb3Byb2duYW1lKCk7CisgICAgICAgIHBlcnJvcigiY2FuJ3QgY3JlYXRlIG91dHB1dCBzdHJlYW0iKTsKKyAgICAgICAgZmNsb3NlKGlucHV0KTsKKyAgICAgICAgZ290byBkb25lOworICAgIH0KIAotCXNldHZidWYoaW5wdXQsIE5VTEwsIF9JT05CRiwgMCk7Ci0Jc2V0dmJ1ZihvdXRwdXQsIE5VTEwsIF9JT05CRiwgMCk7CisgICAgc2V0dmJ1ZihpbnB1dCwgTlVMTCwgX0lPTkJGLCAwKTsKKyAgICBzZXR2YnVmKG91dHB1dCwgTlVMTCwgX0lPTkJGLCAwKTsKIAotCXJ1bl9pbnRlcnByZXRlcihpbnB1dCwgb3V0cHV0KTsKKyAgICBydW5faW50ZXJwcmV0ZXIoaW5wdXQsIG91dHB1dCk7CiAKLQlmY2xvc2UoaW5wdXQpOwotCWZjbG9zZShvdXRwdXQpOworICAgIGZjbG9zZShpbnB1dCk7CisgICAgZmNsb3NlKG91dHB1dCk7CiAKICAgZG9uZToKLQlmcHJpbnRmKHN0ZGVyciwgIkVuZCB0aHJlYWQgZm9yIGNvbm5lY3Rpb24gJWQuXG4iLCB3b3JrLT5jb25uKTsKLQljbG9zZSh3b3JrLT5jb25uKTsKLQlmcmVlKHdvcmspOworICAgIGZwcmludGYoc3RkZXJyLCAiRW5kIHRocmVhZCBmb3IgY29ubmVjdGlvbiAlZC5cbiIsIHdvcmstPmNvbm4pOworICAgIGNsb3NlKHdvcmstPmNvbm4pOworICAgIGZyZWUod29yayk7CiB9CiAKIHN0YXRpYyB2b2lkCiBvcHJvZ25hbWUodm9pZCkKIHsKLQlpbnQgc2F2ZSA9IGVycm5vOwotCWZwcmludGYoc3RkZXJyLCAiJXM6ICIsIHByb2duYW1lKTsKLQllcnJubyA9IHNhdmU7CisgICAgaW50IHNhdmUgPSBlcnJubzsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiAiLCBwcm9nbmFtZSk7CisgICAgZXJybm8gPSBzYXZlOwogfQogCiBzdGF0aWMgdm9pZAogcnVuX2ludGVycHJldGVyKEZJTEUgKmlucHV0LCBGSUxFICpvdXRwdXQpCiB7Ci0JUHlUaHJlYWRTdGF0ZSAqdHN0YXRlOwotCVB5T2JqZWN0ICpuZXdfc3RkaW4sICpuZXdfc3Rkb3V0OwotCVB5T2JqZWN0ICptYWlubW9kLCAqZ2xvYmFsczsKLQljaGFyIGJ1ZmZlclsxMDAwXTsKLQljaGFyICpwLCAqcTsKLQlpbnQgbiwgZW5kOworICAgIFB5VGhyZWFkU3RhdGUgKnRzdGF0ZTsKKyAgICBQeU9iamVjdCAqbmV3X3N0ZGluLCAqbmV3X3N0ZG91dDsKKyAgICBQeU9iamVjdCAqbWFpbm1vZCwgKmdsb2JhbHM7CisgICAgY2hhciBidWZmZXJbMTAwMF07CisgICAgY2hhciAqcCwgKnE7CisgICAgaW50IG4sIGVuZDsKIAotCVB5RXZhbF9BY3F1aXJlTG9jaygpOwotCXRzdGF0ZSA9IFB5X05ld0ludGVycHJldGVyKCk7Ci0JaWYgKHRzdGF0ZSA9PSBOVUxMKSB7Ci0JCWZwcmludGYob3V0cHV0LCAiU29ycnkgLS0gY2FuJ3QgY3JlYXRlIGFuIGludGVycHJldGVyXG4iKTsKLQkJcmV0dXJuOwotCX0KKyAgICBQeUV2YWxfQWNxdWlyZUxvY2soKTsKKyAgICB0c3RhdGUgPSBQeV9OZXdJbnRlcnByZXRlcigpOworICAgIGlmICh0c3RhdGUgPT0gTlVMTCkgeworICAgICAgICBmcHJpbnRmKG91dHB1dCwgIlNvcnJ5IC0tIGNhbid0IGNyZWF0ZSBhbiBpbnRlcnByZXRlclxuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAKLQltYWlubW9kID0gUHlJbXBvcnRfQWRkTW9kdWxlKCJfX21haW5fXyIpOwotCWdsb2JhbHMgPSBQeU1vZHVsZV9HZXREaWN0KG1haW5tb2QpOwotCVB5X0lOQ1JFRihnbG9iYWxzKTsKKyAgICBtYWlubW9kID0gUHlJbXBvcnRfQWRkTW9kdWxlKCJfX21haW5fXyIpOworICAgIGdsb2JhbHMgPSBQeU1vZHVsZV9HZXREaWN0KG1haW5tb2QpOworICAgIFB5X0lOQ1JFRihnbG9iYWxzKTsKIAotCW5ld19zdGRpbiA9IFB5RmlsZV9Gcm9tRmlsZShpbnB1dCwgIjxzb2NrZXQtaW4+IiwgInIiLCBOVUxMKTsKLQluZXdfc3Rkb3V0ID0gUHlGaWxlX0Zyb21GaWxlKG91dHB1dCwgIjxzb2NrZXQtb3V0PiIsICJ3IiwgTlVMTCk7CisgICAgbmV3X3N0ZGluID0gUHlGaWxlX0Zyb21GaWxlKGlucHV0LCAiPHNvY2tldC1pbj4iLCAiciIsIE5VTEwpOworICAgIG5ld19zdGRvdXQgPSBQeUZpbGVfRnJvbUZpbGUob3V0cHV0LCAiPHNvY2tldC1vdXQ+IiwgInciLCBOVUxMKTsKIAotCVB5U3lzX1NldE9iamVjdCgic3RkaW4iLCBuZXdfc3RkaW4pOwotCVB5U3lzX1NldE9iamVjdCgic3Rkb3V0IiwgbmV3X3N0ZG91dCk7Ci0JUHlTeXNfU2V0T2JqZWN0KCJzdGRlcnIiLCBuZXdfc3Rkb3V0KTsKKyAgICBQeVN5c19TZXRPYmplY3QoInN0ZGluIiwgbmV3X3N0ZGluKTsKKyAgICBQeVN5c19TZXRPYmplY3QoInN0ZG91dCIsIG5ld19zdGRvdXQpOworICAgIFB5U3lzX1NldE9iamVjdCgic3RkZXJyIiwgbmV3X3N0ZG91dCk7CiAKLQlmb3IgKG4gPSAxOyAhUHlFcnJfT2NjdXJyZWQoKTsgbisrKSB7Ci0JCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQkJZnByaW50ZihvdXRwdXQsICIlZD4gIiwgbik7Ci0JCXAgPSBmZ2V0cyhidWZmZXIsIHNpemVvZiBidWZmZXIsIGlucHV0KTsKLQkJUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBmb3IgKG4gPSAxOyAhUHlFcnJfT2NjdXJyZWQoKTsgbisrKSB7CisgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgZnByaW50ZihvdXRwdXQsICIlZD4gIiwgbik7CisgICAgICAgIHAgPSBmZ2V0cyhidWZmZXIsIHNpemVvZiBidWZmZXIsIGlucHV0KTsKKyAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKIAotCQlpZiAocCA9PSBOVUxMKQotCQkJYnJlYWs7Ci0JCWlmIChwWzBdID09ICdcMzc3JyAmJiBwWzFdID09ICdcMzU0JykKLQkJCWJyZWFrOworICAgICAgICBpZiAocCA9PSBOVUxMKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmIChwWzBdID09ICdcMzc3JyAmJiBwWzFdID09ICdcMzU0JykKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCXEgPSBzdHJyY2hyKHAsICdccicpOwotCQlpZiAocSAmJiBxWzFdID09ICdcbicgJiYgcVsyXSA9PSAnXDAnKSB7Ci0JCQkqcSsrID0gJ1xuJzsKLQkJCSpxKysgPSAnXDAnOwotCQl9CisgICAgICAgIHEgPSBzdHJyY2hyKHAsICdccicpOworICAgICAgICBpZiAocSAmJiBxWzFdID09ICdcbicgJiYgcVsyXSA9PSAnXDAnKSB7CisgICAgICAgICAgICAqcSsrID0gJ1xuJzsKKyAgICAgICAgICAgICpxKysgPSAnXDAnOworICAgICAgICB9CiAKLQkJd2hpbGUgKCpwICYmIGlzc3BhY2UoKnApKQotCQkJcCsrOwotCQlpZiAocFswXSA9PSAnIycgfHwgcFswXSA9PSAnXDAnKQotCQkJY29udGludWU7CisgICAgICAgIHdoaWxlICgqcCAmJiBpc3NwYWNlKCpwKSkKKyAgICAgICAgICAgIHArKzsKKyAgICAgICAgaWYgKHBbMF0gPT0gJyMnIHx8IHBbMF0gPT0gJ1wwJykKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWVuZCA9IHJ1bl9jb21tYW5kKGJ1ZmZlciwgZ2xvYmFscyk7Ci0JCWlmIChlbmQgPCAwKQotCQkJUHlFcnJfUHJpbnQoKTsKKyAgICAgICAgZW5kID0gcnVuX2NvbW1hbmQoYnVmZmVyLCBnbG9iYWxzKTsKKyAgICAgICAgaWYgKGVuZCA8IDApCisgICAgICAgICAgICBQeUVycl9QcmludCgpOwogCi0JCWlmIChlbmQpCi0JCQlicmVhazsKLQl9CisgICAgICAgIGlmIChlbmQpCisgICAgICAgICAgICBicmVhazsKKyAgICB9CiAKLQlQeV9YREVDUkVGKGdsb2JhbHMpOwotCVB5X1hERUNSRUYobmV3X3N0ZGluKTsKLQlQeV9YREVDUkVGKG5ld19zdGRvdXQpOworICAgIFB5X1hERUNSRUYoZ2xvYmFscyk7CisgICAgUHlfWERFQ1JFRihuZXdfc3RkaW4pOworICAgIFB5X1hERUNSRUYobmV3X3N0ZG91dCk7CiAKLQlQeV9FbmRJbnRlcnByZXRlcih0c3RhdGUpOwotCVB5RXZhbF9SZWxlYXNlTG9jaygpOworICAgIFB5X0VuZEludGVycHJldGVyKHRzdGF0ZSk7CisgICAgUHlFdmFsX1JlbGVhc2VMb2NrKCk7CiAKLQlmcHJpbnRmKG91dHB1dCwgIkdvb2RieWUhXG4iKTsKKyAgICBmcHJpbnRmKG91dHB1dCwgIkdvb2RieWUhXG4iKTsKIH0KIAogc3RhdGljIGludAogcnVuX2NvbW1hbmQoY2hhciAqYnVmZmVyLCBQeU9iamVjdCAqZ2xvYmFscykKIHsKLQlQeU9iamVjdCAqbSwgKmQsICp2OwotCWZwcmludGYoc3RkZXJyLCAicnVuX2NvbW1hbmQ6ICVzIiwgYnVmZmVyKTsKLQlpZiAoc3RyY2hyKGJ1ZmZlciwgJ1xuJykgPT0gTlVMTCkKLQkJZnByaW50ZihzdGRlcnIsICJcbiIpOwotCXYgPSBQeVJ1bl9TdHJpbmcoYnVmZmVyLCBQeV9zaW5nbGVfaW5wdXQsIGdsb2JhbHMsIGdsb2JhbHMpOwotCWlmICh2ID09IE5VTEwpIHsKLQkJaWYgKFB5RXJyX09jY3VycmVkKCkgPT0gUHlFeGNfU3lzdGVtRXhpdCkgewotCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCXJldHVybiAxOwotCQl9Ci0JCVB5RXJyX1ByaW50KCk7Ci0JCXJldHVybiAwOwotCX0KLQlQeV9ERUNSRUYodik7Ci0JcmV0dXJuIDA7CisgICAgUHlPYmplY3QgKm0sICpkLCAqdjsKKyAgICBmcHJpbnRmKHN0ZGVyciwgInJ1bl9jb21tYW5kOiAlcyIsIGJ1ZmZlcik7CisgICAgaWYgKHN0cmNocihidWZmZXIsICdcbicpID09IE5VTEwpCisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiXG4iKTsKKyAgICB2ID0gUHlSdW5fU3RyaW5nKGJ1ZmZlciwgUHlfc2luZ2xlX2lucHV0LCBnbG9iYWxzLCBnbG9iYWxzKTsKKyAgICBpZiAodiA9PSBOVUxMKSB7CisgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpID09IFB5RXhjX1N5c3RlbUV4aXQpIHsKKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICBQeUVycl9QcmludCgpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgUHlfREVDUkVGKHYpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZAogcHModm9pZCkKIHsKLQljaGFyIGJ1ZmZlclsxMDBdOwotCVB5T1Nfc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwKLQkJICAgICAgInBzIC1sIC1wICVkIDwvZGV2L251bGwgfCBzZWQgMWRcbiIsIGdldHBpZCgpKTsKLQlzeXN0ZW0oYnVmZmVyKTsKKyAgICBjaGFyIGJ1ZmZlclsxMDBdOworICAgIFB5T1Nfc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwKKyAgICAgICAgICAgICAgICAgICJwcyAtbCAtcCAlZCA8L2Rldi9udWxsIHwgc2VkIDFkXG4iLCBnZXRwaWQoKSk7CisgICAgc3lzdGVtKGJ1ZmZlcik7CiB9CmRpZmYgLS1naXQgYS9JbmNsdWRlL2Fic3RyYWN0LmggYi9JbmNsdWRlL2Fic3RyYWN0LmgKaW5kZXggYzg0NDZlYi4uYzc4YWIwMCAxMDA2NDQKLS0tIGEvSW5jbHVkZS9hYnN0cmFjdC5oCisrKyBiL0luY2x1ZGUvYWJzdHJhY3QuaApAQCAtMzIsNyArMzIsNyBAQAogCiAgIElmIHRoZSBwcm9ncmFtbWVyIHdhbnRzIHRvIGdldCBhbiBpdGVtIGZyb20gYW5vdGhlciB0eXBlIG9mIG9iamVjdAogICB0aGF0IHByb3ZpZGVzIHNlcXVlbmNlIGJlaGF2aW9yLCB0aGVyZSBpcyBubyBjbGVhciB3YXkgdG8gZG8gaXQKLSAgY29ycmVjdGx5LiAgCisgIGNvcnJlY3RseS4KIAogICBUaGUgcGVyc2lzdGVudCBwcm9ncmFtbWVyIG1heSBwZXJ1c2Ugb2JqZWN0LmggYW5kIGZpbmQgdGhhdCB0aGUKICAgX3R5cGVvYmplY3Qgc3RydWN0dXJlIHByb3ZpZGVzIGEgbWVhbnMgb2YgaW52b2tpbmcgdXAgdG8gKGN1cnJlbnRseQpAQCAtNDQsNyArNDQsNyBAQAogICBBbHNvLCBjZXJ0YWluIHNlbWFudGljcywgZXNwZWNpYWxseSBtZW1vcnkgbWFuYWdlbWVudCBzZW1hbnRpY3MsIG1heQogICBkaWZmZXIgYnkgdGhlIHR5cGUgb2Ygb2JqZWN0IGJlaW5nIHVzZWQuICBVbmZvcnR1bmF0ZWx5LCB0aGVzZQogICBzZW1hbnRpY3MgYXJlIG5vdCBjbGVhcmx5IGRlc2NyaWJlZCBpbiB0aGUgY3VycmVudCBpbmNsdWRlIGZpbGVzLgotICBBbiBhYnN0cmFjdCBpbnRlcmZhY2UgcHJvdmlkaW5nIG1vcmUgY29uc2lzdGVudCBzZW1hbnRpY3MgaXMgbmVlZGVkLiAKKyAgQW4gYWJzdHJhY3QgaW50ZXJmYWNlIHByb3ZpZGluZyBtb3JlIGNvbnNpc3RlbnQgc2VtYW50aWNzIGlzIG5lZWRlZC4KIAogUHJvcG9zYWwKIApAQCAtNzcsNyArNzcsNyBAQAogICAgIFB5dGhvbiBkaXN0cmlidXRpb25zLgogCiAgIEZyb20gdGhlIHBvaW50IG9mIHZpZXcgb2YgUHl0aG9uIGFjY2Vzc2luZyBzZXJ2aWNlcyBwcm92aWRlZCBieSBDCi0gIG1vZHVsZXM6IAorICBtb2R1bGVzOgogCiAgIC0gIlB5dGhvbiBtb2R1bGUgaW50ZXJmYWNlIjogdGhpcyBpbnRlcmZhY2UgY29uc2lzdCBvZiB0aGUgYmFzaWMKICAgICByb3V0aW5lcyB1c2VkIHRvIGRlZmluZSBtb2R1bGVzIGFuZCB0aGVpciBtZW1iZXJzLiAgTW9zdCBvZiB0aGUKQEAgLTEzMywxMSArMTMzLDExIEBACiAKICAgICAgaW50IFB5T2JqZWN0X1ByaW50KFB5T2JqZWN0ICpvLCBGSUxFICpmcCwgaW50IGZsYWdzKTsKIAotICAgICAgICAgUHJpbnQgYW4gb2JqZWN0LCBvLCBvbiBmaWxlLCBmcC4gIFJldHVybnMgLTEgb24KLQkgZXJyb3IuICBUaGUgZmxhZ3MgYXJndW1lbnQgaXMgdXNlZCB0byBlbmFibGUgY2VydGFpbiBwcmludGluZwotCSBvcHRpb25zLiBUaGUgb25seSBvcHRpb24gY3VycmVudGx5IHN1cHBvcnRlZCBpcyBQeV9QcmludF9SQVcuIAorICAgICBQcmludCBhbiBvYmplY3QsIG8sIG9uIGZpbGUsIGZwLiAgUmV0dXJucyAtMSBvbgorICAgICBlcnJvci4gIFRoZSBmbGFncyBhcmd1bWVudCBpcyB1c2VkIHRvIGVuYWJsZSBjZXJ0YWluIHByaW50aW5nCisgICAgIG9wdGlvbnMuIFRoZSBvbmx5IG9wdGlvbiBjdXJyZW50bHkgc3VwcG9ydGVkIGlzIFB5X1ByaW50X1JBVy4KIAotICAgICAgICAgKFdoYXQgc2hvdWxkIGJlIHNhaWQgYWJvdXQgUHlfUHJpbnRfUkFXPykJCisgICAgIChXaGF0IHNob3VsZCBiZSBzYWlkIGFib3V0IFB5X1ByaW50X1JBVz8pCiAKICAgICAgICAqLwogCkBAIC0xNDUsMTEgKzE0NSwxMSBAQAogCiAgICAgIGludCBQeU9iamVjdF9IYXNBdHRyU3RyaW5nKFB5T2JqZWN0ICpvLCBjaGFyICphdHRyX25hbWUpOwogCi0gICAgICAgICBSZXR1cm5zIDEgaWYgbyBoYXMgdGhlIGF0dHJpYnV0ZSBhdHRyX25hbWUsIGFuZCAwIG90aGVyd2lzZS4KLQkgVGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSBQeXRob24gZXhwcmVzc2lvbjoKLQkgaGFzYXR0cihvLGF0dHJfbmFtZSkuIAorICAgICBSZXR1cm5zIDEgaWYgbyBoYXMgdGhlIGF0dHJpYnV0ZSBhdHRyX25hbWUsIGFuZCAwIG90aGVyd2lzZS4KKyAgICAgVGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSBQeXRob24gZXhwcmVzc2lvbjoKKyAgICAgaGFzYXR0cihvLGF0dHJfbmFtZSkuCiAKLQkgVGhpcyBmdW5jdGlvbiBhbHdheXMgc3VjY2VlZHMuCisgICAgIFRoaXMgZnVuY3Rpb24gYWx3YXlzIHN1Y2NlZWRzLgogCiAgICAgICAgKi8KIApAQCAtMTU3LDkgKzE1Nyw5IEBACiAKICAgICAgUHlPYmplY3QqIFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoUHlPYmplY3QgKm8sIGNoYXIgKmF0dHJfbmFtZSk7CiAKLQkgUmV0cmlldmUgYW4gYXR0cmlidXRlZCBuYW1lZCBhdHRyX25hbWUgZm9ybSBvYmplY3Qgby4KLQkgUmV0dXJucyB0aGUgYXR0cmlidXRlIHZhbHVlIG9uIHN1Y2Nlc3MsIG9yIE5VTEwgb24gZmFpbHVyZS4KLQkgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246IG8uYXR0cl9uYW1lLgorICAgICBSZXRyaWV2ZSBhbiBhdHRyaWJ1dGVkIG5hbWVkIGF0dHJfbmFtZSBmb3JtIG9iamVjdCBvLgorICAgICBSZXR1cm5zIHRoZSBhdHRyaWJ1dGUgdmFsdWUgb24gc3VjY2Vzcywgb3IgTlVMTCBvbiBmYWlsdXJlLgorICAgICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjogby5hdHRyX25hbWUuCiAKICAgICAgICAqLwogCkBAIC0xNjcsMTEgKzE2NywxMSBAQAogCiAgICAgIGludCBQeU9iamVjdF9IYXNBdHRyKFB5T2JqZWN0ICpvLCBQeU9iamVjdCAqYXR0cl9uYW1lKTsKIAotICAgICAgICAgUmV0dXJucyAxIGlmIG8gaGFzIHRoZSBhdHRyaWJ1dGUgYXR0cl9uYW1lLCBhbmQgMCBvdGhlcndpc2UuCi0JIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgUHl0aG9uIGV4cHJlc3Npb246Ci0JIGhhc2F0dHIobyxhdHRyX25hbWUpLiAKKyAgICAgUmV0dXJucyAxIGlmIG8gaGFzIHRoZSBhdHRyaWJ1dGUgYXR0cl9uYW1lLCBhbmQgMCBvdGhlcndpc2UuCisgICAgIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgUHl0aG9uIGV4cHJlc3Npb246CisgICAgIGhhc2F0dHIobyxhdHRyX25hbWUpLgogCi0JIFRoaXMgZnVuY3Rpb24gYWx3YXlzIHN1Y2NlZWRzLgorICAgICBUaGlzIGZ1bmN0aW9uIGFsd2F5cyBzdWNjZWVkcy4KIAogICAgICAgICovCiAKQEAgLTE3OSw5ICsxNzksOSBAQAogCiAgICAgIFB5T2JqZWN0KiBQeU9iamVjdF9HZXRBdHRyKFB5T2JqZWN0ICpvLCBQeU9iamVjdCAqYXR0cl9uYW1lKTsKIAotCSBSZXRyaWV2ZSBhbiBhdHRyaWJ1dGVkIG5hbWVkIGF0dHJfbmFtZSBmb3JtIG9iamVjdCBvLgotCSBSZXR1cm5zIHRoZSBhdHRyaWJ1dGUgdmFsdWUgb24gc3VjY2Vzcywgb3IgTlVMTCBvbiBmYWlsdXJlLgotCSBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjogby5hdHRyX25hbWUuCisgICAgIFJldHJpZXZlIGFuIGF0dHJpYnV0ZWQgbmFtZWQgYXR0cl9uYW1lIGZvcm0gb2JqZWN0IG8uCisgICAgIFJldHVybnMgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBvbiBzdWNjZXNzLCBvciBOVUxMIG9uIGZhaWx1cmUuCisgICAgIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOiBvLmF0dHJfbmFtZS4KIAogICAgICAgICovCiAKQEAgLTE5MCw5ICsxOTAsOSBAQAogCiAgICAgIGludCBQeU9iamVjdF9TZXRBdHRyU3RyaW5nKFB5T2JqZWN0ICpvLCBjaGFyICphdHRyX25hbWUsIFB5T2JqZWN0ICp2KTsKIAotCSBTZXQgdGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgbmFtZWQgYXR0cl9uYW1lLCBmb3Igb2JqZWN0IG8sCi0JIHRvIHRoZSB2YWx1ZSwgdi4gUmV0dXJucyAtMSBvbiBmYWlsdXJlLiAgVGhpcyBpcwotCSB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIHN0YXRlbWVudDogby5hdHRyX25hbWU9di4KKyAgICAgU2V0IHRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlIG5hbWVkIGF0dHJfbmFtZSwgZm9yIG9iamVjdCBvLAorICAgICB0byB0aGUgdmFsdWUsIHYuIFJldHVybnMgLTEgb24gZmFpbHVyZS4gIFRoaXMgaXMKKyAgICAgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBzdGF0ZW1lbnQ6IG8uYXR0cl9uYW1lPXYuCiAKICAgICAgICAqLwogCkBAIC0yMDAsOSArMjAwLDkgQEAKIAogICAgICBpbnQgUHlPYmplY3RfU2V0QXR0cihQeU9iamVjdCAqbywgUHlPYmplY3QgKmF0dHJfbmFtZSwgUHlPYmplY3QgKnYpOwogCi0JIFNldCB0aGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSBuYW1lZCBhdHRyX25hbWUsIGZvciBvYmplY3QgbywKLQkgdG8gdGhlIHZhbHVlLCB2LiBSZXR1cm5zIC0xIG9uIGZhaWx1cmUuICBUaGlzIGlzCi0JIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gc3RhdGVtZW50OiBvLmF0dHJfbmFtZT12LgorICAgICBTZXQgdGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgbmFtZWQgYXR0cl9uYW1lLCBmb3Igb2JqZWN0IG8sCisgICAgIHRvIHRoZSB2YWx1ZSwgdi4gUmV0dXJucyAtMSBvbiBmYWlsdXJlLiAgVGhpcyBpcworICAgICB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIHN0YXRlbWVudDogby5hdHRyX25hbWU9di4KIAogICAgICAgICovCiAKQEAgLTIxMCw5ICsyMTAsOSBAQAogCiAgICAgIGludCBQeU9iamVjdF9EZWxBdHRyU3RyaW5nKFB5T2JqZWN0ICpvLCBjaGFyICphdHRyX25hbWUpOwogCi0JIERlbGV0ZSBhdHRyaWJ1dGUgbmFtZWQgYXR0cl9uYW1lLCBmb3Igb2JqZWN0IG8uIFJldHVybnMKLQkgLTEgb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbgotCSBzdGF0ZW1lbnQ6IGRlbCBvLmF0dHJfbmFtZS4KKyAgICAgRGVsZXRlIGF0dHJpYnV0ZSBuYW1lZCBhdHRyX25hbWUsIGZvciBvYmplY3Qgby4gUmV0dXJucworICAgICAtMSBvbiBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uCisgICAgIHN0YXRlbWVudDogZGVsIG8uYXR0cl9uYW1lLgogCiAgICAgICAgKi8KICNkZWZpbmUgIFB5T2JqZWN0X0RlbEF0dHJTdHJpbmcoTyxBKSBQeU9iamVjdF9TZXRBdHRyU3RyaW5nKChPKSwoQSksTlVMTCkKQEAgLTIyMSw5ICsyMjEsOSBAQAogCiAgICAgIGludCBQeU9iamVjdF9EZWxBdHRyKFB5T2JqZWN0ICpvLCBQeU9iamVjdCAqYXR0cl9uYW1lKTsKIAotCSBEZWxldGUgYXR0cmlidXRlIG5hbWVkIGF0dHJfbmFtZSwgZm9yIG9iamVjdCBvLiBSZXR1cm5zIC0xCi0JIG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24KLQkgc3RhdGVtZW50OiBkZWwgby5hdHRyX25hbWUuCisgICAgIERlbGV0ZSBhdHRyaWJ1dGUgbmFtZWQgYXR0cl9uYW1lLCBmb3Igb2JqZWN0IG8uIFJldHVybnMgLTEKKyAgICAgb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbgorICAgICBzdGF0ZW1lbnQ6IGRlbCBvLmF0dHJfbmFtZS4KIAogICAgICAgICovCiAjZGVmaW5lICBQeU9iamVjdF9EZWxBdHRyKE8sQSkgUHlPYmplY3RfU2V0QXR0cigoTyksKEEpLE5VTEwpCkBAIC0yMzEsMTEgKzIzMSwxMSBAQAogICAgICBQeUFQSV9GVU5DKGludCkgUHlPYmplY3RfQ21wKFB5T2JqZWN0ICpvMSwgUHlPYmplY3QgKm8yLCBpbnQgKnJlc3VsdCk7CiAKICAgICAgICAvKgotCSBDb21wYXJlIHRoZSB2YWx1ZXMgb2YgbzEgYW5kIG8yIHVzaW5nIGEgcm91dGluZSBwcm92aWRlZCBieQotCSBvMSwgaWYgb25lIGV4aXN0cywgb3RoZXJ3aXNlIHdpdGggYSByb3V0aW5lIHByb3ZpZGVkIGJ5IG8yLgotCSBUaGUgcmVzdWx0IG9mIHRoZSBjb21wYXJpc29uIGlzIHJldHVybmVkIGluIHJlc3VsdC4gIFJldHVybnMKLQkgLTEgb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbgotCSBzdGF0ZW1lbnQ6IHJlc3VsdD1jbXAobzEsbzIpLgorICAgICBDb21wYXJlIHRoZSB2YWx1ZXMgb2YgbzEgYW5kIG8yIHVzaW5nIGEgcm91dGluZSBwcm92aWRlZCBieQorICAgICBvMSwgaWYgb25lIGV4aXN0cywgb3RoZXJ3aXNlIHdpdGggYSByb3V0aW5lIHByb3ZpZGVkIGJ5IG8yLgorICAgICBUaGUgcmVzdWx0IG9mIHRoZSBjb21wYXJpc29uIGlzIHJldHVybmVkIGluIHJlc3VsdC4gIFJldHVybnMKKyAgICAgLTEgb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbgorICAgICBzdGF0ZW1lbnQ6IHJlc3VsdD1jbXAobzEsbzIpLgogCiAgICAgICAgKi8KIApAQCAtMjQzLDExICsyNDMsMTEgQEAKIAogICAgICBpbnQgUHlPYmplY3RfQ29tcGFyZShQeU9iamVjdCAqbzEsIFB5T2JqZWN0ICpvMik7CiAKLQkgQ29tcGFyZSB0aGUgdmFsdWVzIG9mIG8xIGFuZCBvMiB1c2luZyBhIHJvdXRpbmUgcHJvdmlkZWQgYnkKLQkgbzEsIGlmIG9uZSBleGlzdHMsIG90aGVyd2lzZSB3aXRoIGEgcm91dGluZSBwcm92aWRlZCBieSBvMi4KLQkgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHRoZSBjb21wYXJpc29uIG9uIHN1Y2Nlc3MuICBPbiBlcnJvciwKLQkgdGhlIHZhbHVlIHJldHVybmVkIGlzIHVuZGVmaW5lZC4gVGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZQotCSBQeXRob24gZXhwcmVzc2lvbjogY21wKG8xLG8yKS4KKyAgICAgQ29tcGFyZSB0aGUgdmFsdWVzIG9mIG8xIGFuZCBvMiB1c2luZyBhIHJvdXRpbmUgcHJvdmlkZWQgYnkKKyAgICAgbzEsIGlmIG9uZSBleGlzdHMsIG90aGVyd2lzZSB3aXRoIGEgcm91dGluZSBwcm92aWRlZCBieSBvMi4KKyAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHRoZSBjb21wYXJpc29uIG9uIHN1Y2Nlc3MuICBPbiBlcnJvciwKKyAgICAgdGhlIHZhbHVlIHJldHVybmVkIGlzIHVuZGVmaW5lZC4gVGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZQorICAgICBQeXRob24gZXhwcmVzc2lvbjogY21wKG8xLG8yKS4KIAogICAgICAgICovCiAKQEAgLTI1NSwxMSArMjU1LDExIEBACiAKICAgICAgUHlPYmplY3QgKlB5T2JqZWN0X1JlcHIoUHlPYmplY3QgKm8pOwogCi0JIENvbXB1dGUgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBvYmplY3QsIG8uICBSZXR1cm5zIHRoZQotCSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb24gc3VjY2VzcywgTlVMTCBvbiBmYWlsdXJlLiAgVGhpcyBpcwotCSB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246IHJlcHIobykuCisgICAgIENvbXB1dGUgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBvYmplY3QsIG8uICBSZXR1cm5zIHRoZQorICAgICBzdHJpbmcgcmVwcmVzZW50YXRpb24gb24gc3VjY2VzcywgTlVMTCBvbiBmYWlsdXJlLiAgVGhpcyBpcworICAgICB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246IHJlcHIobykuCiAKLQkgQ2FsbGVkIGJ5IHRoZSByZXByKCkgYnVpbHQtaW4gZnVuY3Rpb24gYW5kIGJ5IHJldmVyc2UgcXVvdGVzLgorICAgICBDYWxsZWQgYnkgdGhlIHJlcHIoKSBidWlsdC1pbiBmdW5jdGlvbiBhbmQgYnkgcmV2ZXJzZSBxdW90ZXMuCiAKICAgICAgICAqLwogCkBAIC0yNjcsMTIgKzI2NywxMiBAQAogCiAgICAgIFB5T2JqZWN0ICpQeU9iamVjdF9TdHIoUHlPYmplY3QgKm8pOwogCi0JIENvbXB1dGUgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBvYmplY3QsIG8uICBSZXR1cm5zIHRoZQotCSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb24gc3VjY2VzcywgTlVMTCBvbiBmYWlsdXJlLiAgVGhpcyBpcwotCSB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246IHN0cihvKS4pCisgICAgIENvbXB1dGUgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBvYmplY3QsIG8uICBSZXR1cm5zIHRoZQorICAgICBzdHJpbmcgcmVwcmVzZW50YXRpb24gb24gc3VjY2VzcywgTlVMTCBvbiBmYWlsdXJlLiAgVGhpcyBpcworICAgICB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246IHN0cihvKS4pCiAKLQkgQ2FsbGVkIGJ5IHRoZSBzdHIoKSBidWlsdC1pbiBmdW5jdGlvbiBhbmQgYnkgdGhlIHByaW50Ci0JIHN0YXRlbWVudC4KKyAgICAgQ2FsbGVkIGJ5IHRoZSBzdHIoKSBidWlsdC1pbiBmdW5jdGlvbiBhbmQgYnkgdGhlIHByaW50CisgICAgIHN0YXRlbWVudC4KIAogICAgICAgICovCiAKQEAgLTI4MCwxMSArMjgwLDExIEBACiAKICAgICAgUHlPYmplY3QgKlB5T2JqZWN0X1VuaWNvZGUoUHlPYmplY3QgKm8pOwogCi0JIENvbXB1dGUgdGhlIHVuaWNvZGUgcmVwcmVzZW50YXRpb24gb2Ygb2JqZWN0LCBvLiAgUmV0dXJucyB0aGUKLQkgdW5pY29kZSByZXByZXNlbnRhdGlvbiBvbiBzdWNjZXNzLCBOVUxMIG9uIGZhaWx1cmUuICBUaGlzIGlzCi0JIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjogdW5pc3RyKG8pLikKKyAgICAgQ29tcHV0ZSB0aGUgdW5pY29kZSByZXByZXNlbnRhdGlvbiBvZiBvYmplY3QsIG8uICBSZXR1cm5zIHRoZQorICAgICB1bmljb2RlIHJlcHJlc2VudGF0aW9uIG9uIHN1Y2Nlc3MsIE5VTEwgb24gZmFpbHVyZS4gIFRoaXMgaXMKKyAgICAgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOiB1bmlzdHIobykuKQogCi0JIENhbGxlZCBieSB0aGUgdW5pc3RyKCkgYnVpbHQtaW4gZnVuY3Rpb24uCisgICAgIENhbGxlZCBieSB0aGUgdW5pc3RyKCkgYnVpbHQtaW4gZnVuY3Rpb24uCiAKICAgICAgICAqLwogCkBAIC0yOTIsMzQgKzI5MiwzNCBAQAogCiAgICAgIFB5QVBJX0ZVTkMoaW50KSBQeUNhbGxhYmxlX0NoZWNrKFB5T2JqZWN0ICpvKTsKIAotCSBEZXRlcm1pbmUgaWYgdGhlIG9iamVjdCwgbywgaXMgY2FsbGFibGUuICBSZXR1cm4gMSBpZiB0aGUKLQkgb2JqZWN0IGlzIGNhbGxhYmxlIGFuZCAwIG90aGVyd2lzZS4KKyAgICAgRGV0ZXJtaW5lIGlmIHRoZSBvYmplY3QsIG8sIGlzIGNhbGxhYmxlLiAgUmV0dXJuIDEgaWYgdGhlCisgICAgIG9iamVjdCBpcyBjYWxsYWJsZSBhbmQgMCBvdGhlcndpc2UuCiAKLQkgVGhpcyBmdW5jdGlvbiBhbHdheXMgc3VjY2VlZHMuCisgICAgIFRoaXMgZnVuY3Rpb24gYWx3YXlzIHN1Y2NlZWRzLgogCiAgICAgICAgKi8KIAogCiAKICAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU9iamVjdF9DYWxsKFB5T2JqZWN0ICpjYWxsYWJsZV9vYmplY3QsCi0JCQkJCSBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprdyk7CiAKICAgICAgICAvKgotCSBDYWxsIGEgY2FsbGFibGUgUHl0aG9uIG9iamVjdCwgY2FsbGFibGVfb2JqZWN0LCB3aXRoCi0JIGFyZ3VtZW50cyBhbmQga2V5d29yZHMgYXJndW1lbnRzLiAgVGhlICdhcmdzJyBhcmd1bWVudCBjYW4gbm90IGJlCi0JIE5VTEwsIGJ1dCB0aGUgJ2t3JyBhcmd1bWVudCBjYW4gYmUgTlVMTC4KKyAgICAgQ2FsbCBhIGNhbGxhYmxlIFB5dGhvbiBvYmplY3QsIGNhbGxhYmxlX29iamVjdCwgd2l0aAorICAgICBhcmd1bWVudHMgYW5kIGtleXdvcmRzIGFyZ3VtZW50cy4gIFRoZSAnYXJncycgYXJndW1lbnQgY2FuIG5vdCBiZQorICAgICBOVUxMLCBidXQgdGhlICdrdycgYXJndW1lbnQgY2FuIGJlIE5VTEwuCiAKICAgICAgICAqLwotICAgICAKKwogICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5T2JqZWN0X0NhbGxPYmplY3QoUHlPYmplY3QgKmNhbGxhYmxlX29iamVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmFyZ3MpOwogCiAgICAgICAgLyoKLQkgQ2FsbCBhIGNhbGxhYmxlIFB5dGhvbiBvYmplY3QsIGNhbGxhYmxlX29iamVjdCwgd2l0aAotCSBhcmd1bWVudHMgZ2l2ZW4gYnkgdGhlIHR1cGxlLCBhcmdzLiAgSWYgbm8gYXJndW1lbnRzIGFyZQotCSBuZWVkZWQsIHRoZW4gYXJncyBtYXkgYmUgTlVMTC4gIFJldHVybnMgdGhlIHJlc3VsdCBvZiB0aGUKLQkgY2FsbCBvbiBzdWNjZXNzLCBvciBOVUxMIG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50Ci0JIG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjogYXBwbHkobyxhcmdzKS4KKyAgICAgQ2FsbCBhIGNhbGxhYmxlIFB5dGhvbiBvYmplY3QsIGNhbGxhYmxlX29iamVjdCwgd2l0aAorICAgICBhcmd1bWVudHMgZ2l2ZW4gYnkgdGhlIHR1cGxlLCBhcmdzLiAgSWYgbm8gYXJndW1lbnRzIGFyZQorICAgICBuZWVkZWQsIHRoZW4gYXJncyBtYXkgYmUgTlVMTC4gIFJldHVybnMgdGhlIHJlc3VsdCBvZiB0aGUKKyAgICAgY2FsbCBvbiBzdWNjZXNzLCBvciBOVUxMIG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50CisgICAgIG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjogYXBwbHkobyxhcmdzKS4KIAogICAgICAgICovCiAKQEAgLTMyNywxMiArMzI3LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqZm9ybWF0LCAuLi4pOwogCiAgICAgICAgLyoKLQkgQ2FsbCBhIGNhbGxhYmxlIFB5dGhvbiBvYmplY3QsIGNhbGxhYmxlX29iamVjdCwgd2l0aCBhCi0JIHZhcmlhYmxlIG51bWJlciBvZiBDIGFyZ3VtZW50cy4gVGhlIEMgYXJndW1lbnRzIGFyZSBkZXNjcmliZWQKLQkgdXNpbmcgYSBta3ZhbHVlLXN0eWxlIGZvcm1hdCBzdHJpbmcuIFRoZSBmb3JtYXQgbWF5IGJlIE5VTEwsCi0JIGluZGljYXRpbmcgdGhhdCBubyBhcmd1bWVudHMgYXJlIHByb3ZpZGVkLiAgUmV0dXJucyB0aGUKLQkgcmVzdWx0IG9mIHRoZSBjYWxsIG9uIHN1Y2Nlc3MsIG9yIE5VTEwgb24gZmFpbHVyZS4gIFRoaXMgaXMKLQkgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOiBhcHBseShvLGFyZ3MpLgorICAgICBDYWxsIGEgY2FsbGFibGUgUHl0aG9uIG9iamVjdCwgY2FsbGFibGVfb2JqZWN0LCB3aXRoIGEKKyAgICAgdmFyaWFibGUgbnVtYmVyIG9mIEMgYXJndW1lbnRzLiBUaGUgQyBhcmd1bWVudHMgYXJlIGRlc2NyaWJlZAorICAgICB1c2luZyBhIG1rdmFsdWUtc3R5bGUgZm9ybWF0IHN0cmluZy4gVGhlIGZvcm1hdCBtYXkgYmUgTlVMTCwKKyAgICAgaW5kaWNhdGluZyB0aGF0IG5vIGFyZ3VtZW50cyBhcmUgcHJvdmlkZWQuICBSZXR1cm5zIHRoZQorICAgICByZXN1bHQgb2YgdGhlIGNhbGwgb24gc3VjY2Vzcywgb3IgTlVMTCBvbiBmYWlsdXJlLiAgVGhpcyBpcworICAgICB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246IGFwcGx5KG8sYXJncykuCiAKICAgICAgICAqLwogCkBAIC0zNDEsMjkgKzM0MSwyOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpmb3JtYXQsIC4uLik7CiAKICAgICAgICAvKgotCSBDYWxsIHRoZSBtZXRob2QgbmFtZWQgbSBvZiBvYmplY3QgbyB3aXRoIGEgdmFyaWFibGUgbnVtYmVyIG9mCi0JIEMgYXJndW1lbnRzLiAgVGhlIEMgYXJndW1lbnRzIGFyZSBkZXNjcmliZWQgYnkgYSBta3ZhbHVlCi0JIGZvcm1hdCBzdHJpbmcuICBUaGUgZm9ybWF0IG1heSBiZSBOVUxMLCBpbmRpY2F0aW5nIHRoYXQgbm8KLQkgYXJndW1lbnRzIGFyZSBwcm92aWRlZC4gUmV0dXJucyB0aGUgcmVzdWx0IG9mIHRoZSBjYWxsIG9uCi0JIHN1Y2Nlc3MsIG9yIE5VTEwgb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlCi0JIFB5dGhvbiBleHByZXNzaW9uOiBvLm1ldGhvZChhcmdzKS4KKyAgICAgQ2FsbCB0aGUgbWV0aG9kIG5hbWVkIG0gb2Ygb2JqZWN0IG8gd2l0aCBhIHZhcmlhYmxlIG51bWJlciBvZgorICAgICBDIGFyZ3VtZW50cy4gIFRoZSBDIGFyZ3VtZW50cyBhcmUgZGVzY3JpYmVkIGJ5IGEgbWt2YWx1ZQorICAgICBmb3JtYXQgc3RyaW5nLiAgVGhlIGZvcm1hdCBtYXkgYmUgTlVMTCwgaW5kaWNhdGluZyB0aGF0IG5vCisgICAgIGFyZ3VtZW50cyBhcmUgcHJvdmlkZWQuIFJldHVybnMgdGhlIHJlc3VsdCBvZiB0aGUgY2FsbCBvbgorICAgICBzdWNjZXNzLCBvciBOVUxMIG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZQorICAgICBQeXRob24gZXhwcmVzc2lvbjogby5tZXRob2QoYXJncykuCiAgICAgICAgKi8KIAogICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIF9QeU9iamVjdF9DYWxsRnVuY3Rpb25fU2l6ZVQoUHlPYmplY3QgKmNhbGxhYmxlLAotCQkJCQkJCSBjaGFyICpmb3JtYXQsIC4uLik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpmb3JtYXQsIC4uLik7CiAgICAgIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgX1B5T2JqZWN0X0NhbGxNZXRob2RfU2l6ZVQoUHlPYmplY3QgKm8sCi0JCQkJCQkgICAgICAgY2hhciAqbmFtZSwKLQkJCQkJCSAgICAgICBjaGFyICpmb3JtYXQsIC4uLik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpmb3JtYXQsIC4uLik7CiAKICAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKFB5T2JqZWN0ICpjYWxsYWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKTsKIAogICAgICAgIC8qCi0JIENhbGwgYSBjYWxsYWJsZSBQeXRob24gb2JqZWN0LCBjYWxsYWJsZV9vYmplY3QsIHdpdGggYQotCSB2YXJpYWJsZSBudW1iZXIgb2YgQyBhcmd1bWVudHMuICBUaGUgQyBhcmd1bWVudHMgYXJlIHByb3ZpZGVkCi0JIGFzIFB5T2JqZWN0ICogdmFsdWVzLCB0ZXJtaW5hdGVkIGJ5IGEgTlVMTC4gIFJldHVybnMgdGhlCi0JIHJlc3VsdCBvZiB0aGUgY2FsbCBvbiBzdWNjZXNzLCBvciBOVUxMIG9uIGZhaWx1cmUuICBUaGlzIGlzCi0JIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjogYXBwbHkobyxhcmdzKS4KKyAgICAgQ2FsbCBhIGNhbGxhYmxlIFB5dGhvbiBvYmplY3QsIGNhbGxhYmxlX29iamVjdCwgd2l0aCBhCisgICAgIHZhcmlhYmxlIG51bWJlciBvZiBDIGFyZ3VtZW50cy4gIFRoZSBDIGFyZ3VtZW50cyBhcmUgcHJvdmlkZWQKKyAgICAgYXMgUHlPYmplY3QgKiB2YWx1ZXMsIHRlcm1pbmF0ZWQgYnkgYSBOVUxMLiAgUmV0dXJucyB0aGUKKyAgICAgcmVzdWx0IG9mIHRoZSBjYWxsIG9uIHN1Y2Nlc3MsIG9yIE5VTEwgb24gZmFpbHVyZS4gIFRoaXMgaXMKKyAgICAgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOiBhcHBseShvLGFyZ3MpLgogICAgICAgICovCiAKIApAQCAtMzcxLDExICszNzEsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICptLCAuLi4pOwogCiAgICAgICAgLyoKLQkgQ2FsbCB0aGUgbWV0aG9kIG5hbWVkIG0gb2Ygb2JqZWN0IG8gd2l0aCBhIHZhcmlhYmxlIG51bWJlciBvZgotCSBDIGFyZ3VtZW50cy4gIFRoZSBDIGFyZ3VtZW50cyBhcmUgcHJvdmlkZWQgYXMgUHlPYmplY3QgKgotCSB2YWx1ZXMsIHRlcm1pbmF0ZWQgYnkgTlVMTC4gIFJldHVybnMgdGhlIHJlc3VsdCBvZiB0aGUgY2FsbAotCSBvbiBzdWNjZXNzLCBvciBOVUxMIG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mCi0JIHRoZSBQeXRob24gZXhwcmVzc2lvbjogby5tZXRob2QoYXJncykuCisgICAgIENhbGwgdGhlIG1ldGhvZCBuYW1lZCBtIG9mIG9iamVjdCBvIHdpdGggYSB2YXJpYWJsZSBudW1iZXIgb2YKKyAgICAgQyBhcmd1bWVudHMuICBUaGUgQyBhcmd1bWVudHMgYXJlIHByb3ZpZGVkIGFzIFB5T2JqZWN0ICoKKyAgICAgdmFsdWVzLCB0ZXJtaW5hdGVkIGJ5IE5VTEwuICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgdGhlIGNhbGwKKyAgICAgb24gc3VjY2Vzcywgb3IgTlVMTCBvbiBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZgorICAgICB0aGUgUHl0aG9uIGV4cHJlc3Npb246IG8ubWV0aG9kKGFyZ3MpLgogICAgICAgICovCiAKIApAQCAtMzgzLDkgKzM4Myw5IEBACiAKICAgICAgbG9uZyBQeU9iamVjdF9IYXNoKFB5T2JqZWN0ICpvKTsKIAotICAgICAgICAgQ29tcHV0ZSBhbmQgcmV0dXJuIHRoZSBoYXNoLCBoYXNoX3ZhbHVlLCBvZiBhbiBvYmplY3QsIG8uICBPbgotCSBmYWlsdXJlLCByZXR1cm4gLTEuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24KLQkgZXhwcmVzc2lvbjogaGFzaChvKS4KKyAgICAgQ29tcHV0ZSBhbmQgcmV0dXJuIHRoZSBoYXNoLCBoYXNoX3ZhbHVlLCBvZiBhbiBvYmplY3QsIG8uICBPbgorICAgICBmYWlsdXJlLCByZXR1cm4gLTEuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24KKyAgICAgZXhwcmVzc2lvbjogaGFzaChvKS4KIAogICAgICAgICovCiAKQEAgLTM5NCw5ICszOTQsOSBAQAogCiAgICAgIGludCBQeU9iamVjdF9Jc1RydWUoUHlPYmplY3QgKm8pOwogCi0JIFJldHVybnMgMSBpZiB0aGUgb2JqZWN0LCBvLCBpcyBjb25zaWRlcmVkIHRvIGJlIHRydWUsIDAgaWYgbyBpcwotCSBjb25zaWRlcmVkIHRvIGJlIGZhbHNlIGFuZCAtMSBvbiBmYWlsdXJlLiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gdGhlCi0JIFB5dGhvbiBleHByZXNzaW9uOiBub3Qgbm90IG8KKyAgICAgUmV0dXJucyAxIGlmIHRoZSBvYmplY3QsIG8sIGlzIGNvbnNpZGVyZWQgdG8gYmUgdHJ1ZSwgMCBpZiBvIGlzCisgICAgIGNvbnNpZGVyZWQgdG8gYmUgZmFsc2UgYW5kIC0xIG9uIGZhaWx1cmUuIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUKKyAgICAgUHl0aG9uIGV4cHJlc3Npb246IG5vdCBub3QgbwogCiAgICAgICAgKi8KIApAQCAtNDA0LDI3ICs0MDQsMjcgQEAKIAogICAgICBpbnQgUHlPYmplY3RfTm90KFB5T2JqZWN0ICpvKTsKIAotCSBSZXR1cm5zIDAgaWYgdGhlIG9iamVjdCwgbywgaXMgY29uc2lkZXJlZCB0byBiZSB0cnVlLCAxIGlmIG8gaXMKLQkgY29uc2lkZXJlZCB0byBiZSBmYWxzZSBhbmQgLTEgb24gZmFpbHVyZS4gVGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZQotCSBQeXRob24gZXhwcmVzc2lvbjogbm90IG8KKyAgICAgUmV0dXJucyAwIGlmIHRoZSBvYmplY3QsIG8sIGlzIGNvbnNpZGVyZWQgdG8gYmUgdHJ1ZSwgMSBpZiBvIGlzCisgICAgIGNvbnNpZGVyZWQgdG8gYmUgZmFsc2UgYW5kIC0xIG9uIGZhaWx1cmUuIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUKKyAgICAgUHl0aG9uIGV4cHJlc3Npb246IG5vdCBvCiAKICAgICAgICAqLwogCiAgICAgIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlPYmplY3RfVHlwZShQeU9iamVjdCAqbyk7CiAKICAgICAgICAvKgotCSBPbiBzdWNjZXNzLCByZXR1cm5zIGEgdHlwZSBvYmplY3QgY29ycmVzcG9uZGluZyB0byB0aGUgb2JqZWN0Ci0JIHR5cGUgb2Ygb2JqZWN0IG8uIE9uIGZhaWx1cmUsIHJldHVybnMgTlVMTC4gIFRoaXMgaXMKLQkgZXF1aXZhbGVudCB0byB0aGUgUHl0aG9uIGV4cHJlc3Npb246IHR5cGUobykuCisgICAgIE9uIHN1Y2Nlc3MsIHJldHVybnMgYSB0eXBlIG9iamVjdCBjb3JyZXNwb25kaW5nIHRvIHRoZSBvYmplY3QKKyAgICAgdHlwZSBvZiBvYmplY3Qgby4gT24gZmFpbHVyZSwgcmV0dXJucyBOVUxMLiAgVGhpcyBpcworICAgICBlcXVpdmFsZW50IHRvIHRoZSBQeXRob24gZXhwcmVzc2lvbjogdHlwZShvKS4KICAgICAgICAqLwogCiAgICAgIFB5QVBJX0ZVTkMoUHlfc3NpemVfdCkgUHlPYmplY3RfU2l6ZShQeU9iamVjdCAqbyk7CiAKICAgICAgICAvKgotICAgICAgICAgUmV0dXJuIHRoZSBzaXplIG9mIG9iamVjdCBvLiAgSWYgdGhlIG9iamVjdCwgbywgcHJvdmlkZXMKLQkgYm90aCBzZXF1ZW5jZSBhbmQgbWFwcGluZyBwcm90b2NvbHMsIHRoZSBzZXF1ZW5jZSBzaXplIGlzCi0JIHJldHVybmVkLiBPbiBlcnJvciwgLTEgaXMgcmV0dXJuZWQuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50Ci0JIHRvIHRoZSBQeXRob24gZXhwcmVzc2lvbjogbGVuKG8pLgorICAgICBSZXR1cm4gdGhlIHNpemUgb2Ygb2JqZWN0IG8uICBJZiB0aGUgb2JqZWN0LCBvLCBwcm92aWRlcworICAgICBib3RoIHNlcXVlbmNlIGFuZCBtYXBwaW5nIHByb3RvY29scywgdGhlIHNlcXVlbmNlIHNpemUgaXMKKyAgICAgcmV0dXJuZWQuIE9uIGVycm9yLCAtMSBpcyByZXR1cm5lZC4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQKKyAgICAgdG8gdGhlIFB5dGhvbiBleHByZXNzaW9uOiBsZW4obykuCiAKICAgICAgICAqLwogCkBAIC00MzYsMjAzICs0MzYsMjAzIEBACiAgICAgIFB5QVBJX0ZVTkMoUHlfc3NpemVfdCkgX1B5T2JqZWN0X0xlbmd0aEhpbnQoUHlPYmplY3QgKm8sIFB5X3NzaXplX3QpOwogCiAgICAgICAgLyoKLSAgICAgICAgIEd1ZXNzIHRoZSBzaXplIG9mIG9iamVjdCBvIHVzaW5nIGxlbihvKSBvciBvLl9fbGVuZ3RoX2hpbnRfXygpLgotICAgICAgICAgSWYgbmVpdGhlciBvZiB0aG9zZSByZXR1cm4gYSBub24tbmVnYXRpdmUgdmFsdWUsIHRoZW4gcmV0dXJuIHRoZQotICAgICAgICAgZGVmYXVsdCB2YWx1ZS4gIElmIG9uZSBvZiB0aGUgY2FsbHMgZmFpbHMsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyAtMS4KKyAgICAgR3Vlc3MgdGhlIHNpemUgb2Ygb2JqZWN0IG8gdXNpbmcgbGVuKG8pIG9yIG8uX19sZW5ndGhfaGludF9fKCkuCisgICAgIElmIG5laXRoZXIgb2YgdGhvc2UgcmV0dXJuIGEgbm9uLW5lZ2F0aXZlIHZhbHVlLCB0aGVuIHJldHVybiB0aGUKKyAgICAgZGVmYXVsdCB2YWx1ZS4gIElmIG9uZSBvZiB0aGUgY2FsbHMgZmFpbHMsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyAtMS4KICAgICAgICAqLwogCiAgICAgIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlPYmplY3RfR2V0SXRlbShQeU9iamVjdCAqbywgUHlPYmplY3QgKmtleSk7CiAKICAgICAgICAvKgotCSBSZXR1cm4gZWxlbWVudCBvZiBvIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG9iamVjdCwga2V5LCBvciBOVUxMCi0JIG9uIGZhaWx1cmUuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOgotCSBvW2tleV0uCisgICAgIFJldHVybiBlbGVtZW50IG9mIG8gY29ycmVzcG9uZGluZyB0byB0aGUgb2JqZWN0LCBrZXksIG9yIE5VTEwKKyAgICAgb24gZmFpbHVyZS4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246CisgICAgIG9ba2V5XS4KIAogICAgICAgICovCiAKICAgICAgUHlBUElfRlVOQyhpbnQpIFB5T2JqZWN0X1NldEl0ZW0oUHlPYmplY3QgKm8sIFB5T2JqZWN0ICprZXksIFB5T2JqZWN0ICp2KTsKIAogICAgICAgIC8qCi0JIE1hcCB0aGUgb2JqZWN0LCBrZXksIHRvIHRoZSB2YWx1ZSwgdi4gIFJldHVybnMKLQkgLTEgb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbgotCSBzdGF0ZW1lbnQ6IG9ba2V5XT12LgorICAgICBNYXAgdGhlIG9iamVjdCwga2V5LCB0byB0aGUgdmFsdWUsIHYuICBSZXR1cm5zCisgICAgIC0xIG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24KKyAgICAgc3RhdGVtZW50OiBvW2tleV09di4KICAgICAgICAqLwogCiAgICAgIFB5QVBJX0ZVTkMoaW50KSBQeU9iamVjdF9EZWxJdGVtU3RyaW5nKFB5T2JqZWN0ICpvLCBjaGFyICprZXkpOwogCiAgICAgICAgLyoKLSAgICAgICAgIFJlbW92ZSB0aGUgbWFwcGluZyBmb3Igb2JqZWN0LCBrZXksIGZyb20gdGhlIG9iamVjdCAqby4KLSAgICAgICAgIFJldHVybnMgLTEgb24gZmFpbHVyZS4gIFRoaXMgaXMgZXF1aXZhbGVudCB0bwotICAgICAgICAgdGhlIFB5dGhvbiBzdGF0ZW1lbnQ6IGRlbCBvW2tleV0uCisgICAgIFJlbW92ZSB0aGUgbWFwcGluZyBmb3Igb2JqZWN0LCBrZXksIGZyb20gdGhlIG9iamVjdCAqby4KKyAgICAgUmV0dXJucyAtMSBvbiBmYWlsdXJlLiAgVGhpcyBpcyBlcXVpdmFsZW50IHRvCisgICAgIHRoZSBQeXRob24gc3RhdGVtZW50OiBkZWwgb1trZXldLgogICAgICAgICovCiAKICAgICAgUHlBUElfRlVOQyhpbnQpIFB5T2JqZWN0X0RlbEl0ZW0oUHlPYmplY3QgKm8sIFB5T2JqZWN0ICprZXkpOwogCiAgICAgICAgLyoKLQkgRGVsZXRlIHRoZSBtYXBwaW5nIGZvciBrZXkgZnJvbSAqby4gIFJldHVybnMgLTEgb24gZmFpbHVyZS4KLQkgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIHN0YXRlbWVudDogZGVsIG9ba2V5XS4KKyAgICAgRGVsZXRlIHRoZSBtYXBwaW5nIGZvciBrZXkgZnJvbSAqby4gIFJldHVybnMgLTEgb24gZmFpbHVyZS4KKyAgICAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIHN0YXRlbWVudDogZGVsIG9ba2V5XS4KICAgICAgICAqLwogCiAgICAgIFB5QVBJX0ZVTkMoaW50KSBQeU9iamVjdF9Bc0NoYXJCdWZmZXIoUHlPYmplY3QgKm9iaiwKLQkJCQkJICBjb25zdCBjaGFyICoqYnVmZmVyLAotCQkJCQkgIFB5X3NzaXplX3QgKmJ1ZmZlcl9sZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgKmJ1ZmZlcl9sZW4pOwogCi0gICAgICAgLyogCi0JICBUYWtlcyBhbiBhcmJpdHJhcnkgb2JqZWN0IHdoaWNoIG11c3Qgc3VwcG9ydCB0aGUgKGNoYXJhY3RlciwKLQkgIHNpbmdsZSBzZWdtZW50KSBidWZmZXIgaW50ZXJmYWNlIGFuZCByZXR1cm5zIGEgcG9pbnRlciB0byBhCi0JICByZWFkLW9ubHkgbWVtb3J5IGxvY2F0aW9uIHVzZWFibGUgYXMgY2hhcmFjdGVyIGJhc2VkIGlucHV0Ci0JICBmb3Igc3Vic2VxdWVudCBwcm9jZXNzaW5nLgorICAgICAgIC8qCisgICAgICBUYWtlcyBhbiBhcmJpdHJhcnkgb2JqZWN0IHdoaWNoIG11c3Qgc3VwcG9ydCB0aGUgKGNoYXJhY3RlciwKKyAgICAgIHNpbmdsZSBzZWdtZW50KSBidWZmZXIgaW50ZXJmYWNlIGFuZCByZXR1cm5zIGEgcG9pbnRlciB0byBhCisgICAgICByZWFkLW9ubHkgbWVtb3J5IGxvY2F0aW9uIHVzZWFibGUgYXMgY2hhcmFjdGVyIGJhc2VkIGlucHV0CisgICAgICBmb3Igc3Vic2VxdWVudCBwcm9jZXNzaW5nLgogCi0JICAwIGlzIHJldHVybmVkIG9uIHN1Y2Nlc3MuICBidWZmZXIgYW5kIGJ1ZmZlcl9sZW4gYXJlIG9ubHkKLQkgIHNldCBpbiBjYXNlIG5vIGVycm9yIG9jY3Vycy4gT3RoZXJ3aXNlLCAtMSBpcyByZXR1cm5lZCBhbmQKLQkgIGFuIGV4Y2VwdGlvbiBzZXQuCisgICAgICAwIGlzIHJldHVybmVkIG9uIHN1Y2Nlc3MuICBidWZmZXIgYW5kIGJ1ZmZlcl9sZW4gYXJlIG9ubHkKKyAgICAgIHNldCBpbiBjYXNlIG5vIGVycm9yIG9jY3Vycy4gT3RoZXJ3aXNlLCAtMSBpcyByZXR1cm5lZCBhbmQKKyAgICAgIGFuIGV4Y2VwdGlvbiBzZXQuCiAKICAgICAgICAqLwogCiAgICAgIFB5QVBJX0ZVTkMoaW50KSBQeU9iamVjdF9DaGVja1JlYWRCdWZmZXIoUHlPYmplY3QgKm9iaik7CiAKLSAgICAgIC8qICAKLQkgIENoZWNrcyB3aGV0aGVyIGFuIGFyYml0cmFyeSBvYmplY3Qgc3VwcG9ydHMgdGhlIChjaGFyYWN0ZXIsCi0JICBzaW5nbGUgc2VnbWVudCkgYnVmZmVyIGludGVyZmFjZS4gIFJldHVybnMgMSBvbiBzdWNjZXNzLCAwCi0JICBvbiBmYWlsdXJlLgorICAgICAgLyoKKyAgICAgIENoZWNrcyB3aGV0aGVyIGFuIGFyYml0cmFyeSBvYmplY3Qgc3VwcG9ydHMgdGhlIChjaGFyYWN0ZXIsCisgICAgICBzaW5nbGUgc2VnbWVudCkgYnVmZmVyIGludGVyZmFjZS4gIFJldHVybnMgMSBvbiBzdWNjZXNzLCAwCisgICAgICBvbiBmYWlsdXJlLgogCiAgICAgICAqLwogCiAgICAgIFB5QVBJX0ZVTkMoaW50KSBQeU9iamVjdF9Bc1JlYWRCdWZmZXIoUHlPYmplY3QgKm9iaiwKLQkJCQkJICBjb25zdCB2b2lkICoqYnVmZmVyLAotCQkJCQkgIFB5X3NzaXplX3QgKmJ1ZmZlcl9sZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgKmJ1ZmZlcl9sZW4pOwogCi0gICAgICAgLyogCi0JICBTYW1lIGFzIFB5T2JqZWN0X0FzQ2hhckJ1ZmZlcigpIGV4Y2VwdCB0aGF0IHRoaXMgQVBJIGV4cGVjdHMKLQkgIChyZWFkYWJsZSwgc2luZ2xlIHNlZ21lbnQpIGJ1ZmZlciBpbnRlcmZhY2UgYW5kIHJldHVybnMgYQotCSAgcG9pbnRlciB0byBhIHJlYWQtb25seSBtZW1vcnkgbG9jYXRpb24gd2hpY2ggY2FuIGNvbnRhaW4KLQkgIGFyYml0cmFyeSBkYXRhLgorICAgICAgIC8qCisgICAgICBTYW1lIGFzIFB5T2JqZWN0X0FzQ2hhckJ1ZmZlcigpIGV4Y2VwdCB0aGF0IHRoaXMgQVBJIGV4cGVjdHMKKyAgICAgIChyZWFkYWJsZSwgc2luZ2xlIHNlZ21lbnQpIGJ1ZmZlciBpbnRlcmZhY2UgYW5kIHJldHVybnMgYQorICAgICAgcG9pbnRlciB0byBhIHJlYWQtb25seSBtZW1vcnkgbG9jYXRpb24gd2hpY2ggY2FuIGNvbnRhaW4KKyAgICAgIGFyYml0cmFyeSBkYXRhLgogCi0JICAwIGlzIHJldHVybmVkIG9uIHN1Y2Nlc3MuICBidWZmZXIgYW5kIGJ1ZmZlcl9sZW4gYXJlIG9ubHkKLQkgIHNldCBpbiBjYXNlIG5vIGVycm9yIG9jY3VycnMuICBPdGhlcndpc2UsIC0xIGlzIHJldHVybmVkIGFuZAotCSAgYW4gZXhjZXB0aW9uIHNldC4KKyAgICAgIDAgaXMgcmV0dXJuZWQgb24gc3VjY2Vzcy4gIGJ1ZmZlciBhbmQgYnVmZmVyX2xlbiBhcmUgb25seQorICAgICAgc2V0IGluIGNhc2Ugbm8gZXJyb3Igb2NjdXJycy4gIE90aGVyd2lzZSwgLTEgaXMgcmV0dXJuZWQgYW5kCisgICAgICBhbiBleGNlcHRpb24gc2V0LgogCiAgICAgICAgKi8KIAogICAgICBQeUFQSV9GVU5DKGludCkgUHlPYmplY3RfQXNXcml0ZUJ1ZmZlcihQeU9iamVjdCAqb2JqLAotCQkJCQkgICB2b2lkICoqYnVmZmVyLAotCQkJCQkgICBQeV9zc2l6ZV90ICpidWZmZXJfbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgKmJ1ZmZlcl9sZW4pOwogCi0gICAgICAgLyogCi0JICBUYWtlcyBhbiBhcmJpdHJhcnkgb2JqZWN0IHdoaWNoIG11c3Qgc3VwcG9ydCB0aGUgKHdyaXRlYWJsZSwKLQkgIHNpbmdsZSBzZWdtZW50KSBidWZmZXIgaW50ZXJmYWNlIGFuZCByZXR1cm5zIGEgcG9pbnRlciB0byBhCi0JICB3cml0ZWFibGUgbWVtb3J5IGxvY2F0aW9uIGluIGJ1ZmZlciBvZiBzaXplIGJ1ZmZlcl9sZW4uCisgICAgICAgLyoKKyAgICAgIFRha2VzIGFuIGFyYml0cmFyeSBvYmplY3Qgd2hpY2ggbXVzdCBzdXBwb3J0IHRoZSAod3JpdGVhYmxlLAorICAgICAgc2luZ2xlIHNlZ21lbnQpIGJ1ZmZlciBpbnRlcmZhY2UgYW5kIHJldHVybnMgYSBwb2ludGVyIHRvIGEKKyAgICAgIHdyaXRlYWJsZSBtZW1vcnkgbG9jYXRpb24gaW4gYnVmZmVyIG9mIHNpemUgYnVmZmVyX2xlbi4KIAotCSAgMCBpcyByZXR1cm5lZCBvbiBzdWNjZXNzLiAgYnVmZmVyIGFuZCBidWZmZXJfbGVuIGFyZSBvbmx5Ci0JICBzZXQgaW4gY2FzZSBubyBlcnJvciBvY2N1cnJzLiBPdGhlcndpc2UsIC0xIGlzIHJldHVybmVkIGFuZAotCSAgYW4gZXhjZXB0aW9uIHNldC4KKyAgICAgIDAgaXMgcmV0dXJuZWQgb24gc3VjY2Vzcy4gIGJ1ZmZlciBhbmQgYnVmZmVyX2xlbiBhcmUgb25seQorICAgICAgc2V0IGluIGNhc2Ugbm8gZXJyb3Igb2NjdXJycy4gT3RoZXJ3aXNlLCAtMSBpcyByZXR1cm5lZCBhbmQKKyAgICAgIGFuIGV4Y2VwdGlvbiBzZXQuCiAKICAgICAgICAqLwogCi0JLyogbmV3IGJ1ZmZlciBBUEkgKi8KKyAgICAvKiBuZXcgYnVmZmVyIEFQSSAqLwogCiAjZGVmaW5lIFB5T2JqZWN0X0NoZWNrQnVmZmVyKG9iaikgXAotCSgoKG9iaiktPm9iX3R5cGUtPnRwX2FzX2J1ZmZlciAhPSBOVUxMKSAmJgkJCVwKLQkgKFB5VHlwZV9IYXNGZWF0dXJlKChvYmopLT5vYl90eXBlLCBQeV9UUEZMQUdTX0hBVkVfTkVXQlVGRkVSKSkgJiYgXAotCSAoKG9iaiktPm9iX3R5cGUtPnRwX2FzX2J1ZmZlci0+YmZfZ2V0YnVmZmVyICE9IE5VTEwpKQotCQkJICAgIAotCS8qIFJldHVybiAxIGlmIHRoZSBnZXRidWZmZXIgZnVuY3Rpb24gaXMgYXZhaWxhYmxlLCBvdGhlcndpc2UgCi0JICAgcmV0dXJuIDAgKi8KKyAgICAoKChvYmopLT5vYl90eXBlLT50cF9hc19idWZmZXIgIT0gTlVMTCkgJiYgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKFB5VHlwZV9IYXNGZWF0dXJlKChvYmopLT5vYl90eXBlLCBQeV9UUEZMQUdTX0hBVkVfTkVXQlVGRkVSKSkgJiYgXAorICAgICAoKG9iaiktPm9iX3R5cGUtPnRwX2FzX2J1ZmZlci0+YmZfZ2V0YnVmZmVyICE9IE5VTEwpKQogCi0gICAgIFB5QVBJX0ZVTkMoaW50KSBQeU9iamVjdF9HZXRCdWZmZXIoUHlPYmplY3QgKm9iaiwgUHlfYnVmZmVyICp2aWV3LCAKLQkJCQkJaW50IGZsYWdzKTsKKyAgICAvKiBSZXR1cm4gMSBpZiB0aGUgZ2V0YnVmZmVyIGZ1bmN0aW9uIGlzIGF2YWlsYWJsZSwgb3RoZXJ3aXNlCisgICAgICAgcmV0dXJuIDAgKi8KIAotCS8qIFRoaXMgaXMgYSBDLUFQSSB2ZXJzaW9uIG9mIHRoZSBnZXRidWZmZXIgZnVuY3Rpb24gY2FsbC4gIEl0IGNoZWNrcwotICAgICAgIAkgICB0byBtYWtlIHN1cmUgb2JqZWN0IGhhcyB0aGUgcmVxdWlyZWQgZnVuY3Rpb24gcG9pbnRlciBhbmQgaXNzdWVzIHRoZQotCSAgIGNhbGwuICBSZXR1cm5zIC0xIGFuZCByYWlzZXMgYW4gZXJyb3Igb24gZmFpbHVyZSBhbmQgcmV0dXJucyAwIG9uIAotCSAgIHN1Y2Nlc3MKLSAgICAgICAgKi8KKyAgICAgUHlBUElfRlVOQyhpbnQpIFB5T2JqZWN0X0dldEJ1ZmZlcihQeU9iamVjdCAqb2JqLCBQeV9idWZmZXIgKnZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzKTsKKworICAgIC8qIFRoaXMgaXMgYSBDLUFQSSB2ZXJzaW9uIG9mIHRoZSBnZXRidWZmZXIgZnVuY3Rpb24gY2FsbC4gIEl0IGNoZWNrcworICAgICAgIHRvIG1ha2Ugc3VyZSBvYmplY3QgaGFzIHRoZSByZXF1aXJlZCBmdW5jdGlvbiBwb2ludGVyIGFuZCBpc3N1ZXMgdGhlCisgICAgICAgY2FsbC4gIFJldHVybnMgLTEgYW5kIHJhaXNlcyBhbiBlcnJvciBvbiBmYWlsdXJlIGFuZCByZXR1cm5zIDAgb24KKyAgICAgICBzdWNjZXNzCisgICAgKi8KIAogCiAgICAgIFB5QVBJX0ZVTkModm9pZCAqKSBQeUJ1ZmZlcl9HZXRQb2ludGVyKFB5X2J1ZmZlciAqdmlldywgUHlfc3NpemVfdCAqaW5kaWNlcyk7Ci0gICAgICAgIAotICAgICAgICAvKiBHZXQgdGhlIG1lbW9yeSBhcmVhIHBvaW50ZWQgdG8gYnkgdGhlIGluZGljZXMgZm9yIHRoZSBidWZmZXIgZ2l2ZW4uIAotICAgICAgICAgICBOb3RlIHRoYXQgdmlldy0+bmRpbSBpcyB0aGUgYXNzdW1lZCBzaXplIG9mIGluZGljZXMgCi0gICAgICAgICovCisKKyAgICAvKiBHZXQgdGhlIG1lbW9yeSBhcmVhIHBvaW50ZWQgdG8gYnkgdGhlIGluZGljZXMgZm9yIHRoZSBidWZmZXIgZ2l2ZW4uCisgICAgICAgTm90ZSB0aGF0IHZpZXctPm5kaW0gaXMgdGhlIGFzc3VtZWQgc2l6ZSBvZiBpbmRpY2VzCisgICAgKi8KIAogICAgICBQeUFQSV9GVU5DKGludCkgUHlCdWZmZXJfU2l6ZUZyb21Gb3JtYXQoY29uc3QgY2hhciAqKTsKLQkJCi0JLyogUmV0dXJuIHRoZSBpbXBsaWVkIGl0ZW1zaXplIG9mIHRoZSBkYXRhLWZvcm1hdCBhcmVhIGZyb20gYSAKLQkgICBzdHJ1Y3Qtc3R5bGUgZGVzY3JpcHRpb24gKi8KLSAgICAKIAotCQorICAgIC8qIFJldHVybiB0aGUgaW1wbGllZCBpdGVtc2l6ZSBvZiB0aGUgZGF0YS1mb3JtYXQgYXJlYSBmcm9tIGEKKyAgICAgICBzdHJ1Y3Qtc3R5bGUgZGVzY3JpcHRpb24gKi8KKworCisKICAgICAgUHlBUElfRlVOQyhpbnQpIFB5QnVmZmVyX1RvQ29udGlndW91cyh2b2lkICpidWYsIFB5X2J1ZmZlciAqdmlldywKLSAgICAJCQkJCSAgIFB5X3NzaXplX3QgbGVuLCBjaGFyIGZvcnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgbGVuLCBjaGFyIGZvcnQpOwogCi0gICAgIFB5QVBJX0ZVTkMoaW50KSBQeUJ1ZmZlcl9Gcm9tQ29udGlndW91cyhQeV9idWZmZXIgKnZpZXcsIHZvaWQgKmJ1ZiwgCi0gICAgCQkJCQkgICAgIFB5X3NzaXplX3QgbGVuLCBjaGFyIGZvcnQpOworICAgICBQeUFQSV9GVU5DKGludCkgUHlCdWZmZXJfRnJvbUNvbnRpZ3VvdXMoUHlfYnVmZmVyICp2aWV3LCB2b2lkICpidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IGxlbiwgY2hhciBmb3J0KTsKIAogCi0JLyogQ29weSBsZW4gYnl0ZXMgb2YgZGF0YSBmcm9tIHRoZSBjb250aWd1b3VzIGNodW5rIG9mIG1lbW9yeQotCSAgIHBvaW50ZWQgdG8gYnkgYnVmIGludG8gdGhlIGJ1ZmZlciBleHBvcnRlZCBieSBvYmouICBSZXR1cm4KLQkgICAwIG9uIHN1Y2Nlc3MgYW5kIHJldHVybiAtMSBhbmQgcmFpc2UgYSBQeUJ1ZmZlcl9FcnJvciBvbgotCSAgIGVycm9yIChpLmUuIHRoZSBvYmplY3QgZG9lcyBub3QgaGF2ZSBhIGJ1ZmZlciBpbnRlcmZhY2Ugb3IKLQkgICBpdCBpcyBub3Qgd29ya2luZykuCisgICAgLyogQ29weSBsZW4gYnl0ZXMgb2YgZGF0YSBmcm9tIHRoZSBjb250aWd1b3VzIGNodW5rIG9mIG1lbW9yeQorICAgICAgIHBvaW50ZWQgdG8gYnkgYnVmIGludG8gdGhlIGJ1ZmZlciBleHBvcnRlZCBieSBvYmouICBSZXR1cm4KKyAgICAgICAwIG9uIHN1Y2Nlc3MgYW5kIHJldHVybiAtMSBhbmQgcmFpc2UgYSBQeUJ1ZmZlcl9FcnJvciBvbgorICAgICAgIGVycm9yIChpLmUuIHRoZSBvYmplY3QgZG9lcyBub3QgaGF2ZSBhIGJ1ZmZlciBpbnRlcmZhY2Ugb3IKKyAgICAgICBpdCBpcyBub3Qgd29ya2luZykuCiAKLQkgICBJZiBmb3J0IGlzICdGJyBhbmQgdGhlIG9iamVjdCBpcyBtdWx0aS1kaW1lbnNpb25hbCwKLQkgICB0aGVuIHRoZSBkYXRhIHdpbGwgYmUgY29waWVkIGludG8gdGhlIGFycmF5IGluCi0JICAgRm9ydHJhbi1zdHlsZSAoZmlyc3QgZGltZW5zaW9uIHZhcmllcyB0aGUgZmFzdGVzdCkuICBJZgotCSAgIGZvcnQgaXMgJ0MnLCB0aGVuIHRoZSBkYXRhIHdpbGwgYmUgY29waWVkIGludG8gdGhlIGFycmF5Ci0JICAgaW4gQy1zdHlsZSAobGFzdCBkaW1lbnNpb24gdmFyaWVzIHRoZSBmYXN0ZXN0KS4gIElmIGZvcnQKLQkgICBpcyAnQScsIHRoZW4gaXQgZG9lcyBub3QgbWF0dGVyIGFuZCB0aGUgY29weSB3aWxsIGJlIG1hZGUKLQkgICBpbiB3aGF0ZXZlciB3YXkgaXMgbW9yZSBlZmZpY2llbnQuCisgICAgICAgSWYgZm9ydCBpcyAnRicgYW5kIHRoZSBvYmplY3QgaXMgbXVsdGktZGltZW5zaW9uYWwsCisgICAgICAgdGhlbiB0aGUgZGF0YSB3aWxsIGJlIGNvcGllZCBpbnRvIHRoZSBhcnJheSBpbgorICAgICAgIEZvcnRyYW4tc3R5bGUgKGZpcnN0IGRpbWVuc2lvbiB2YXJpZXMgdGhlIGZhc3Rlc3QpLiAgSWYKKyAgICAgICBmb3J0IGlzICdDJywgdGhlbiB0aGUgZGF0YSB3aWxsIGJlIGNvcGllZCBpbnRvIHRoZSBhcnJheQorICAgICAgIGluIEMtc3R5bGUgKGxhc3QgZGltZW5zaW9uIHZhcmllcyB0aGUgZmFzdGVzdCkuICBJZiBmb3J0CisgICAgICAgaXMgJ0EnLCB0aGVuIGl0IGRvZXMgbm90IG1hdHRlciBhbmQgdGhlIGNvcHkgd2lsbCBiZSBtYWRlCisgICAgICAgaW4gd2hhdGV2ZXIgd2F5IGlzIG1vcmUgZWZmaWNpZW50LgogCi0gICAgICAgICovCisgICAgKi8KIAogICAgICBQeUFQSV9GVU5DKGludCkgUHlPYmplY3RfQ29weURhdGEoUHlPYmplY3QgKmRlc3QsIFB5T2JqZWN0ICpzcmMpOwotICAgICAgICAKLSAgICAgICAgLyogQ29weSB0aGUgZGF0YSBmcm9tIHRoZSBzcmMgYnVmZmVyIHRvIHRoZSBidWZmZXIgb2YgZGVzdGluYXRpb24KLSAgICAgICAgICovCisKKyAgICAvKiBDb3B5IHRoZSBkYXRhIGZyb20gdGhlIHNyYyBidWZmZXIgdG8gdGhlIGJ1ZmZlciBvZiBkZXN0aW5hdGlvbgorICAgICAqLwogCiAgICAgIFB5QVBJX0ZVTkMoaW50KSBQeUJ1ZmZlcl9Jc0NvbnRpZ3VvdXMoUHlfYnVmZmVyICp2aWV3LCBjaGFyIGZvcnQpOwogCiAKLSAgICAgUHlBUElfRlVOQyh2b2lkKSBQeUJ1ZmZlcl9GaWxsQ29udGlndW91c1N0cmlkZXMoaW50IG5kaW1zLCAKLQkgIAkJCQkJICAgIFB5X3NzaXplX3QgKnNoYXBlLCAKLQkJCQkJCSAgICBQeV9zc2l6ZV90ICpzdHJpZGVzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGl0ZW1zaXplLAotCSAgICAgCQkJCQkgICAgY2hhciBmb3J0KTsKKyAgICAgUHlBUElfRlVOQyh2b2lkKSBQeUJ1ZmZlcl9GaWxsQ29udGlndW91c1N0cmlkZXMoaW50IG5kaW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgKnNoYXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgKnN0cmlkZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGl0ZW1zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgZm9ydCk7CiAKLSAgICAgICAJLyogIEZpbGwgdGhlIHN0cmlkZXMgYXJyYXkgd2l0aCBieXRlLXN0cmlkZXMgb2YgYSBjb250aWd1b3VzCi0gICAgICAgICAgICAoRm9ydHJhbi1zdHlsZSBpZiBmb3J0IGlzICdGJyBvciBDLXN0eWxlIG90aGVyd2lzZSkKLSAgICAgICAgICAgIGFycmF5IG9mIHRoZSBnaXZlbiBzaGFwZSB3aXRoIHRoZSBnaXZlbiBudW1iZXIgb2YgYnl0ZXMKLSAgICAgICAgICAgIHBlciBlbGVtZW50LgotICAgICAgICAqLworICAgIC8qICBGaWxsIHRoZSBzdHJpZGVzIGFycmF5IHdpdGggYnl0ZS1zdHJpZGVzIG9mIGEgY29udGlndW91cworICAgICAgICAoRm9ydHJhbi1zdHlsZSBpZiBmb3J0IGlzICdGJyBvciBDLXN0eWxlIG90aGVyd2lzZSkKKyAgICAgICAgYXJyYXkgb2YgdGhlIGdpdmVuIHNoYXBlIHdpdGggdGhlIGdpdmVuIG51bWJlciBvZiBieXRlcworICAgICAgICBwZXIgZWxlbWVudC4KKyAgICAqLwogCiAgICAgIFB5QVBJX0ZVTkMoaW50KSBQeUJ1ZmZlcl9GaWxsSW5mbyhQeV9idWZmZXIgKnZpZXcsIFB5T2JqZWN0ICpvLCB2b2lkICpidWYsCi0JCSAgICAgICAgICAgICAJICAgICAgIFB5X3NzaXplX3QgbGVuLCBpbnQgcmVhZG9ubHksCi0JCQkJICAgICAgIGludCBmbGFncyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IGxlbiwgaW50IHJlYWRvbmx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzKTsKIAotICAgICAgICAvKiBGaWxscyBpbiBhIGJ1ZmZlci1pbmZvIHN0cnVjdHVyZSBjb3JyZWN0bHkgZm9yIGFuIGV4cG9ydGVyCi0gICAgICAgICAgIHRoYXQgY2FuIG9ubHkgc2hhcmUgYSBjb250aWd1b3VzIGNodW5rIG9mIG1lbW9yeSBvZgotICAgICAgICAgICAidW5zaWduZWQgYnl0ZXMiIG9mIHRoZSBnaXZlbiBsZW5ndGguIFJldHVybnMgMCBvbiBzdWNjZXNzCi0gICAgICAgICAgIGFuZCAtMSAod2l0aCByYWlzaW5nIGFuIGVycm9yKSBvbiBlcnJvci4KLSAgICAgICAgICovCisgICAgLyogRmlsbHMgaW4gYSBidWZmZXItaW5mbyBzdHJ1Y3R1cmUgY29ycmVjdGx5IGZvciBhbiBleHBvcnRlcgorICAgICAgIHRoYXQgY2FuIG9ubHkgc2hhcmUgYSBjb250aWd1b3VzIGNodW5rIG9mIG1lbW9yeSBvZgorICAgICAgICJ1bnNpZ25lZCBieXRlcyIgb2YgdGhlIGdpdmVuIGxlbmd0aC4gUmV0dXJucyAwIG9uIHN1Y2Nlc3MKKyAgICAgICBhbmQgLTEgKHdpdGggcmFpc2luZyBhbiBlcnJvcikgb24gZXJyb3IuCisgICAgICovCiAKICAgICAgUHlBUElfRlVOQyh2b2lkKSBQeUJ1ZmZlcl9SZWxlYXNlKFB5X2J1ZmZlciAqdmlldyk7CiAKICAgICAgICAvKiBSZWxlYXNlcyBhIFB5X2J1ZmZlciBvYnRhaW5lZCBmcm9tIGdldGJ1ZmZlciBQYXJzZVR1cGxlJ3MgcyouCi0gICAgICAgICovCisgICAgKi8KIAogICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5T2JqZWN0X0Zvcm1hdChQeU9iamVjdCogb2JqLAotCQkJCQkgICAgUHlPYmplY3QgKmZvcm1hdF9zcGVjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmZvcm1hdF9zcGVjKTsKICAgICAgICAvKgotCSBUYWtlcyBhbiBhcmJpdHJhcnkgb2JqZWN0IGFuZCByZXR1cm5zIHRoZSByZXN1bHQgb2YKLQkgY2FsbGluZyBvYmouX19mb3JtYXRfXyhmb3JtYXRfc3BlYykuCisgICAgIFRha2VzIGFuIGFyYml0cmFyeSBvYmplY3QgYW5kIHJldHVybnMgdGhlIHJlc3VsdCBvZgorICAgICBjYWxsaW5nIG9iai5fX2Zvcm1hdF9fKGZvcm1hdF9zcGVjKS4KICAgICAgICAqLwogCiAvKiBJdGVyYXRvcnMgKi8KIAogICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5T2JqZWN0X0dldEl0ZXIoUHlPYmplY3QgKik7CiAgICAgIC8qIFRha2VzIGFuIG9iamVjdCBhbmQgcmV0dXJucyBhbiBpdGVyYXRvciBmb3IgaXQuCi0gICAgICAgIFRoaXMgaXMgdHlwaWNhbGx5IGEgbmV3IGl0ZXJhdG9yIGJ1dCBpZiB0aGUgYXJndW1lbnQKLQlpcyBhbiBpdGVyYXRvciwgdGhpcyByZXR1cm5zIGl0c2VsZi4gKi8KKyAgICBUaGlzIGlzIHR5cGljYWxseSBhIG5ldyBpdGVyYXRvciBidXQgaWYgdGhlIGFyZ3VtZW50CisgICAgaXMgYW4gaXRlcmF0b3IsIHRoaXMgcmV0dXJucyBpdHNlbGYuICovCiAKICNkZWZpbmUgUHlJdGVyX0NoZWNrKG9iaikgXAogICAgIChQeVR5cGVfSGFzRmVhdHVyZSgob2JqKS0+b2JfdHlwZSwgUHlfVFBGTEFHU19IQVZFX0lURVIpICYmIFwKQEAgLTY0MCwyNyArNjQwLDI3IEBACiAKICAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUl0ZXJfTmV4dChQeU9iamVjdCAqKTsKICAgICAgLyogVGFrZXMgYW4gaXRlcmF0b3Igb2JqZWN0IGFuZCBjYWxscyBpdHMgdHBfaXRlcm5leHQgc2xvdCwKLQlyZXR1cm5pbmcgdGhlIG5leHQgdmFsdWUuICBJZiB0aGUgaXRlcmF0b3IgaXMgZXhoYXVzdGVkLAotCXRoaXMgcmV0dXJucyBOVUxMIHdpdGhvdXQgc2V0dGluZyBhbiBleGNlcHRpb24uCi0JTlVMTCB3aXRoIGFuIGV4Y2VwdGlvbiBtZWFucyBhbiBlcnJvciBvY2N1cnJlZC4gKi8KKyAgICByZXR1cm5pbmcgdGhlIG5leHQgdmFsdWUuICBJZiB0aGUgaXRlcmF0b3IgaXMgZXhoYXVzdGVkLAorICAgIHRoaXMgcmV0dXJucyBOVUxMIHdpdGhvdXQgc2V0dGluZyBhbiBleGNlcHRpb24uCisgICAgTlVMTCB3aXRoIGFuIGV4Y2VwdGlvbiBtZWFucyBhbiBlcnJvciBvY2N1cnJlZC4gKi8KIAogLyogIE51bWJlciBQcm90b2NvbDoqLwogCiAgICAgIFB5QVBJX0ZVTkMoaW50KSBQeU51bWJlcl9DaGVjayhQeU9iamVjdCAqbyk7CiAKICAgICAgICAvKgotICAgICAgICAgUmV0dXJucyAxIGlmIHRoZSBvYmplY3QsIG8sIHByb3ZpZGVzIG51bWVyaWMgcHJvdG9jb2xzLCBhbmQKLQkgZmFsc2Ugb3RoZXJ3aXNlLiAKKyAgICAgUmV0dXJucyAxIGlmIHRoZSBvYmplY3QsIG8sIHByb3ZpZGVzIG51bWVyaWMgcHJvdG9jb2xzLCBhbmQKKyAgICAgZmFsc2Ugb3RoZXJ3aXNlLgogCi0JIFRoaXMgZnVuY3Rpb24gYWx3YXlzIHN1Y2NlZWRzLgorICAgICBUaGlzIGZ1bmN0aW9uIGFsd2F5cyBzdWNjZWVkcy4KIAogICAgICAgICovCiAKICAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU51bWJlcl9BZGQoUHlPYmplY3QgKm8xLCBQeU9iamVjdCAqbzIpOwogCiAgICAgICAgLyoKLQkgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGFkZGluZyBvMSBhbmQgbzIsIG9yIG51bGwgb24gZmFpbHVyZS4KLQkgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246IG8xK28yLgorICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYWRkaW5nIG8xIGFuZCBvMiwgb3IgbnVsbCBvbiBmYWlsdXJlLgorICAgICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjogbzErbzIuCiAKIAogICAgICAgICovCkBAIC02NjgsMTggKzY2OCwxOCBAQAogICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5TnVtYmVyX1N1YnRyYWN0KFB5T2JqZWN0ICpvMSwgUHlPYmplY3QgKm8yKTsKIAogICAgICAgIC8qCi0JIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzdWJ0cmFjdGluZyBvMiBmcm9tIG8xLCBvciBudWxsIG9uCi0JIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjoKLQkgbzEtbzIuCisgICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzdWJ0cmFjdGluZyBvMiBmcm9tIG8xLCBvciBudWxsIG9uCisgICAgIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjoKKyAgICAgbzEtbzIuCiAKICAgICAgICAqLwogCiAgICAgIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlOdW1iZXJfTXVsdGlwbHkoUHlPYmplY3QgKm8xLCBQeU9iamVjdCAqbzIpOwogCiAgICAgICAgLyoKLQkgUmV0dXJucyB0aGUgcmVzdWx0IG9mIG11bHRpcGx5aW5nIG8xIGFuZCBvMiwgb3IgbnVsbCBvbgotCSBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246Ci0JIG8xKm8yLgorICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgbXVsdGlwbHlpbmcgbzEgYW5kIG8yLCBvciBudWxsIG9uCisgICAgIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjoKKyAgICAgbzEqbzIuCiAKIAogICAgICAgICovCkBAIC02ODcsOCArNjg3LDggQEAKICAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU51bWJlcl9EaXZpZGUoUHlPYmplY3QgKm8xLCBQeU9iamVjdCAqbzIpOwogCiAgICAgICAgLyoKLQkgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGRpdmlkaW5nIG8xIGJ5IG8yLCBvciBudWxsIG9uIGZhaWx1cmUuCi0JIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOiBvMS9vMi4KKyAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGRpdmlkaW5nIG8xIGJ5IG8yLCBvciBudWxsIG9uIGZhaWx1cmUuCisgICAgIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOiBvMS9vMi4KIAogCiAgICAgICAgKi8KQEAgLTY5Niw5ICs2OTYsOSBAQAogICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5TnVtYmVyX0Zsb29yRGl2aWRlKFB5T2JqZWN0ICpvMSwgUHlPYmplY3QgKm8yKTsKIAogICAgICAgIC8qCi0JIFJldHVybnMgdGhlIHJlc3VsdCBvZiBkaXZpZGluZyBvMSBieSBvMiBnaXZpbmcgYW4gaW50ZWdyYWwgcmVzdWx0LAotCSBvciBudWxsIG9uIGZhaWx1cmUuCi0JIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOiBvMS8vbzIuCisgICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBkaXZpZGluZyBvMSBieSBvMiBnaXZpbmcgYW4gaW50ZWdyYWwgcmVzdWx0LAorICAgICBvciBudWxsIG9uIGZhaWx1cmUuCisgICAgIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOiBvMS8vbzIuCiAKIAogICAgICAgICovCkBAIC03MDYsOSArNzA2LDkgQEAKICAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU51bWJlcl9UcnVlRGl2aWRlKFB5T2JqZWN0ICpvMSwgUHlPYmplY3QgKm8yKTsKIAogICAgICAgIC8qCi0JIFJldHVybnMgdGhlIHJlc3VsdCBvZiBkaXZpZGluZyBvMSBieSBvMiBnaXZpbmcgYSBmbG9hdCByZXN1bHQsCi0JIG9yIG51bGwgb24gZmFpbHVyZS4KLQkgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246IG8xL28yLgorICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgZGl2aWRpbmcgbzEgYnkgbzIgZ2l2aW5nIGEgZmxvYXQgcmVzdWx0LAorICAgICBvciBudWxsIG9uIGZhaWx1cmUuCisgICAgIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOiBvMS9vMi4KIAogCiAgICAgICAgKi8KQEAgLTcxNiw5ICs3MTYsOSBAQAogICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5TnVtYmVyX1JlbWFpbmRlcihQeU9iamVjdCAqbzEsIFB5T2JqZWN0ICpvMik7CiAKICAgICAgICAvKgotCSBSZXR1cm5zIHRoZSByZW1haW5kZXIgb2YgZGl2aWRpbmcgbzEgYnkgbzIsIG9yIG51bGwgb24KLQkgZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOgotCSBvMSVvMi4KKyAgICAgUmV0dXJucyB0aGUgcmVtYWluZGVyIG9mIGRpdmlkaW5nIG8xIGJ5IG8yLCBvciBudWxsIG9uCisgICAgIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjoKKyAgICAgbzElbzIuCiAKIAogICAgICAgICovCkBAIC03MjYsOSArNzI2LDkgQEAKICAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU51bWJlcl9EaXZtb2QoUHlPYmplY3QgKm8xLCBQeU9iamVjdCAqbzIpOwogCiAgICAgICAgLyoKLQkgU2VlIHRoZSBidWlsdC1pbiBmdW5jdGlvbiBkaXZtb2QuICBSZXR1cm5zIE5VTEwgb24gZmFpbHVyZS4KLQkgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246Ci0JIGRpdm1vZChvMSxvMikuCisgICAgIFNlZSB0aGUgYnVpbHQtaW4gZnVuY3Rpb24gZGl2bW9kLiAgUmV0dXJucyBOVUxMIG9uIGZhaWx1cmUuCisgICAgIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOgorICAgICBkaXZtb2QobzEsbzIpLgogCiAKICAgICAgICAqLwpAQCAtNzM3LDQyICs3MzcsNDIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpvMyk7CiAKICAgICAgICAvKgotCSBTZWUgdGhlIGJ1aWx0LWluIGZ1bmN0aW9uIHBvdy4gIFJldHVybnMgTlVMTCBvbiBmYWlsdXJlLgotCSBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjoKLQkgcG93KG8xLG8yLG8zKSwgd2hlcmUgbzMgaXMgb3B0aW9uYWwuCisgICAgIFNlZSB0aGUgYnVpbHQtaW4gZnVuY3Rpb24gcG93LiAgUmV0dXJucyBOVUxMIG9uIGZhaWx1cmUuCisgICAgIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOgorICAgICBwb3cobzEsbzIsbzMpLCB3aGVyZSBvMyBpcyBvcHRpb25hbC4KIAogICAgICAgICovCiAKICAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU51bWJlcl9OZWdhdGl2ZShQeU9iamVjdCAqbyk7CiAKICAgICAgICAvKgotCSBSZXR1cm5zIHRoZSBuZWdhdGlvbiBvZiBvIG9uIHN1Y2Nlc3MsIG9yIG51bGwgb24gZmFpbHVyZS4KLQkgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246IC1vLgorICAgICBSZXR1cm5zIHRoZSBuZWdhdGlvbiBvZiBvIG9uIHN1Y2Nlc3MsIG9yIG51bGwgb24gZmFpbHVyZS4KKyAgICAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246IC1vLgogCiAgICAgICAgKi8KIAogICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5TnVtYmVyX1Bvc2l0aXZlKFB5T2JqZWN0ICpvKTsKIAogICAgICAgIC8qCi0gICAgICAgICBSZXR1cm5zIHRoZSAod2hhdD8pIG9mIG8gb24gc3VjY2Vzcywgb3IgTlVMTCBvbiBmYWlsdXJlLgotCSBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjogK28uCisgICAgIFJldHVybnMgdGhlICh3aGF0Pykgb2YgbyBvbiBzdWNjZXNzLCBvciBOVUxMIG9uIGZhaWx1cmUuCisgICAgIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOiArby4KIAogICAgICAgICovCiAKICAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU51bWJlcl9BYnNvbHV0ZShQeU9iamVjdCAqbyk7CiAKICAgICAgICAvKgotCSBSZXR1cm5zIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiBvLCBvciBudWxsIG9uIGZhaWx1cmUuICBUaGlzIGlzCi0JIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjogYWJzKG8pLgorICAgICBSZXR1cm5zIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiBvLCBvciBudWxsIG9uIGZhaWx1cmUuICBUaGlzIGlzCisgICAgIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjogYWJzKG8pLgogCiAgICAgICAgKi8KIAogICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5TnVtYmVyX0ludmVydChQeU9iamVjdCAqbyk7CiAKICAgICAgICAvKgotCSBSZXR1cm5zIHRoZSBiaXR3aXNlIG5lZ2F0aW9uIG9mIG8gb24gc3VjY2Vzcywgb3IgTlVMTCBvbgotCSBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246Ci0JIH5vLgorICAgICBSZXR1cm5zIHRoZSBiaXR3aXNlIG5lZ2F0aW9uIG9mIG8gb24gc3VjY2Vzcywgb3IgTlVMTCBvbgorICAgICBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246CisgICAgIH5vLgogCiAKICAgICAgICAqLwpAQCAtNzgwLDkgKzc4MCw5IEBACiAgICAgIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlOdW1iZXJfTHNoaWZ0KFB5T2JqZWN0ICpvMSwgUHlPYmplY3QgKm8yKTsKIAogICAgICAgIC8qCi0JIFJldHVybnMgdGhlIHJlc3VsdCBvZiBsZWZ0IHNoaWZ0aW5nIG8xIGJ5IG8yIG9uIHN1Y2Nlc3MsIG9yCi0JIE5VTEwgb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbgotCSBleHByZXNzaW9uOiBvMSA8PCBvMi4KKyAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGxlZnQgc2hpZnRpbmcgbzEgYnkgbzIgb24gc3VjY2Vzcywgb3IKKyAgICAgTlVMTCBvbiBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uCisgICAgIGV4cHJlc3Npb246IG8xIDw8IG8yLgogCiAKICAgICAgICAqLwpAQCAtNzkwLDE4ICs3OTAsMTggQEAKICAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU51bWJlcl9Sc2hpZnQoUHlPYmplY3QgKm8xLCBQeU9iamVjdCAqbzIpOwogCiAgICAgICAgLyoKLQkgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHJpZ2h0IHNoaWZ0aW5nIG8xIGJ5IG8yIG9uIHN1Y2Nlc3MsIG9yCi0JIE5VTEwgb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbgotCSBleHByZXNzaW9uOiBvMSA+PiBvMi4KKyAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHJpZ2h0IHNoaWZ0aW5nIG8xIGJ5IG8yIG9uIHN1Y2Nlc3MsIG9yCisgICAgIE5VTEwgb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbgorICAgICBleHByZXNzaW9uOiBvMSA+PiBvMi4KIAogICAgICAgICovCiAKICAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU51bWJlcl9BbmQoUHlPYmplY3QgKm8xLCBQeU9iamVjdCAqbzIpOwogCiAgICAgICAgLyoKLQkgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGJpdHdpc2UgYW5kIG9mIG8xIGFuZCBvMiBvbiBzdWNjZXNzLCBvcgotCSBOVUxMIG9uIGZhaWx1cmUuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbgotCSBleHByZXNzaW9uOiBvMSZvMi4KKyAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGJpdHdpc2UgYW5kIG9mIG8xIGFuZCBvMiBvbiBzdWNjZXNzLCBvcgorICAgICBOVUxMIG9uIGZhaWx1cmUuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbgorICAgICBleHByZXNzaW9uOiBvMSZvMi4KIAogCiAgICAgICAgKi8KQEAgLTgwOSw5ICs4MDksOSBAQAogICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5TnVtYmVyX1hvcihQeU9iamVjdCAqbzEsIFB5T2JqZWN0ICpvMik7CiAKICAgICAgICAvKgotCSBSZXR1cm5zIHRoZSBiaXR3aXNlIGV4Y2x1c2l2ZSBvciBvZiBvMSBieSBvMiBvbiBzdWNjZXNzLCBvcgotCSBOVUxMIG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24KLQkgZXhwcmVzc2lvbjogbzFebzIuCisgICAgIFJldHVybnMgdGhlIGJpdHdpc2UgZXhjbHVzaXZlIG9yIG9mIG8xIGJ5IG8yIG9uIHN1Y2Nlc3MsIG9yCisgICAgIE5VTEwgb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbgorICAgICBleHByZXNzaW9uOiBvMV5vMi4KIAogCiAgICAgICAgKi8KQEAgLTgxOSw5ICs4MTksOSBAQAogICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5TnVtYmVyX09yKFB5T2JqZWN0ICpvMSwgUHlPYmplY3QgKm8yKTsKIAogICAgICAgIC8qCi0JIFJldHVybnMgdGhlIHJlc3VsdCBvZiBiaXR3aXNlIG9yIG9uIG8xIGFuZCBvMiBvbiBzdWNjZXNzLCBvcgotCSBOVUxMIG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24KLQkgZXhwcmVzc2lvbjogbzF8bzIuCisgICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBiaXR3aXNlIG9yIG9uIG8xIGFuZCBvMiBvbiBzdWNjZXNzLCBvcgorICAgICBOVUxMIG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24KKyAgICAgZXhwcmVzc2lvbjogbzF8bzIuCiAKICAgICAgICAqLwogCkBAIC04MjksMTggKzgyOSwxOCBAQAogCiAgICAgIGludCBQeU51bWJlcl9Db2VyY2UoUHlPYmplY3QgKipwMSwgUHlPYmplY3QgKipwMik7CiAKLQkgVGhpcyBmdW5jdGlvbiB0YWtlcyB0aGUgYWRkcmVzc2VzIG9mIHR3byB2YXJpYWJsZXMgb2YgdHlwZQotCSBQeU9iamVjdCouCisgICAgIFRoaXMgZnVuY3Rpb24gdGFrZXMgdGhlIGFkZHJlc3NlcyBvZiB0d28gdmFyaWFibGVzIG9mIHR5cGUKKyAgICAgUHlPYmplY3QqLgogCi0JIElmIHRoZSBvYmplY3RzIHBvaW50ZWQgdG8gYnkgKnAxIGFuZCAqcDIgaGF2ZSB0aGUgc2FtZSB0eXBlLAotCSBpbmNyZW1lbnQgdGhlaXIgcmVmZXJlbmNlIGNvdW50IGFuZCByZXR1cm4gMCAoc3VjY2VzcykuCi0JIElmIHRoZSBvYmplY3RzIGNhbiBiZSBjb252ZXJ0ZWQgdG8gYSBjb21tb24gbnVtZXJpYyB0eXBlLAotCSByZXBsYWNlICpwMSBhbmQgKnAyIGJ5IHRoZWlyIGNvbnZlcnRlZCB2YWx1ZSAod2l0aCAnbmV3JwotCSByZWZlcmVuY2UgY291bnRzKSwgYW5kIHJldHVybiAwLgotCSBJZiBubyBjb252ZXJzaW9uIGlzIHBvc3NpYmxlLCBvciBpZiBzb21lIG90aGVyIGVycm9yIG9jY3VycywKLQkgcmV0dXJuIC0xIChmYWlsdXJlKSBhbmQgZG9uJ3QgaW5jcmVtZW50IHRoZSByZWZlcmVuY2UgY291bnRzLgotCSBUaGUgY2FsbCBQeU51bWJlcl9Db2VyY2UoJm8xLCAmbzIpIGlzIGVxdWl2YWxlbnQgdG8gdGhlIFB5dGhvbgotCSBzdGF0ZW1lbnQgbzEsIG8yID0gY29lcmNlKG8xLCBvMikuCisgICAgIElmIHRoZSBvYmplY3RzIHBvaW50ZWQgdG8gYnkgKnAxIGFuZCAqcDIgaGF2ZSB0aGUgc2FtZSB0eXBlLAorICAgICBpbmNyZW1lbnQgdGhlaXIgcmVmZXJlbmNlIGNvdW50IGFuZCByZXR1cm4gMCAoc3VjY2VzcykuCisgICAgIElmIHRoZSBvYmplY3RzIGNhbiBiZSBjb252ZXJ0ZWQgdG8gYSBjb21tb24gbnVtZXJpYyB0eXBlLAorICAgICByZXBsYWNlICpwMSBhbmQgKnAyIGJ5IHRoZWlyIGNvbnZlcnRlZCB2YWx1ZSAod2l0aCAnbmV3JworICAgICByZWZlcmVuY2UgY291bnRzKSwgYW5kIHJldHVybiAwLgorICAgICBJZiBubyBjb252ZXJzaW9uIGlzIHBvc3NpYmxlLCBvciBpZiBzb21lIG90aGVyIGVycm9yIG9jY3VycywKKyAgICAgcmV0dXJuIC0xIChmYWlsdXJlKSBhbmQgZG9uJ3QgaW5jcmVtZW50IHRoZSByZWZlcmVuY2UgY291bnRzLgorICAgICBUaGUgY2FsbCBQeU51bWJlcl9Db2VyY2UoJm8xLCAmbzIpIGlzIGVxdWl2YWxlbnQgdG8gdGhlIFB5dGhvbgorICAgICBzdGF0ZW1lbnQgbzEsIG8yID0gY29lcmNlKG8xLCBvMikuCiAKICAgICAgICAqLwogCkBAIC04NDgsMTg0ICs4NDgsMTg0IEBACiAgICAoKG9iaiktPm9iX3R5cGUtPnRwX2FzX251bWJlciAhPSBOVUxMICYmIFwKICAgICBQeVR5cGVfSGFzRmVhdHVyZSgob2JqKS0+b2JfdHlwZSwgUHlfVFBGTEFHU19IQVZFX0lOREVYKSAmJiBcCiAgICAgKG9iaiktPm9iX3R5cGUtPnRwX2FzX251bWJlci0+bmJfaW5kZXggIT0gTlVMTCkKLSAgICAgICAgCisKICAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU51bWJlcl9JbmRleChQeU9iamVjdCAqbyk7CiAKICAgICAgICAvKgotCSBSZXR1cm5zIHRoZSBvYmplY3QgY29udmVydGVkIHRvIGEgUHl0aG9uIGxvbmcgb3IgaW50Ci0JIG9yIE5VTEwgd2l0aCBhbiBlcnJvciByYWlzZWQgb24gZmFpbHVyZS4KKyAgICAgUmV0dXJucyB0aGUgb2JqZWN0IGNvbnZlcnRlZCB0byBhIFB5dGhvbiBsb25nIG9yIGludAorICAgICBvciBOVUxMIHdpdGggYW4gZXJyb3IgcmFpc2VkIG9uIGZhaWx1cmUuCiAgICAgICAgKi8KIAogICAgICBQeUFQSV9GVU5DKFB5X3NzaXplX3QpIFB5TnVtYmVyX0FzU3NpemVfdChQeU9iamVjdCAqbywgUHlPYmplY3QgKmV4Yyk7CiAKICAgICAgICAvKgotICAgICAgICAgUmV0dXJucyB0aGUgSW50ZWdyYWwgaW5zdGFuY2UgY29udmVydGVkIHRvIGFuIGludC4gVGhlCi0gICAgICAgICBpbnN0YW5jZSBpcyBleHBlY3RlZCB0byBiZSBpbnQgb3IgbG9uZyBvciBoYXZlIGFuIF9faW50X18KLSAgICAgICAgIG1ldGhvZC4gU3RlYWxzIGludGVncmFsJ3MgcmVmZXJlbmNlLiBlcnJvcl9mb3JtYXQgd2lsbCBiZQotICAgICAgICAgdXNlZCB0byBjcmVhdGUgdGhlIFR5cGVFcnJvciBpZiBpbnRlZ3JhbCBpc24ndCBhY3R1YWxseSBhbgotICAgICAgICAgSW50ZWdyYWwgaW5zdGFuY2UuIGVycm9yX2Zvcm1hdCBzaG91bGQgYmUgYSBmb3JtYXQgc3RyaW5nCi0gICAgICAgICB0aGF0IGNhbiBhY2NlcHQgYSBjaGFyKiBuYW1pbmcgaW50ZWdyYWwncyB0eXBlLgorICAgICBSZXR1cm5zIHRoZSBJbnRlZ3JhbCBpbnN0YW5jZSBjb252ZXJ0ZWQgdG8gYW4gaW50LiBUaGUKKyAgICAgaW5zdGFuY2UgaXMgZXhwZWN0ZWQgdG8gYmUgaW50IG9yIGxvbmcgb3IgaGF2ZSBhbiBfX2ludF9fCisgICAgIG1ldGhvZC4gU3RlYWxzIGludGVncmFsJ3MgcmVmZXJlbmNlLiBlcnJvcl9mb3JtYXQgd2lsbCBiZQorICAgICB1c2VkIHRvIGNyZWF0ZSB0aGUgVHlwZUVycm9yIGlmIGludGVncmFsIGlzbid0IGFjdHVhbGx5IGFuCisgICAgIEludGVncmFsIGluc3RhbmNlLiBlcnJvcl9mb3JtYXQgc2hvdWxkIGJlIGEgZm9ybWF0IHN0cmluZworICAgICB0aGF0IGNhbiBhY2NlcHQgYSBjaGFyKiBuYW1pbmcgaW50ZWdyYWwncyB0eXBlLgogICAgICAgICovCiAKICAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBfUHlOdW1iZXJfQ29udmVydEludGVncmFsVG9JbnQoCi0gICAgICAgICAgICAgUHlPYmplY3QgKmludGVncmFsLAotICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGVycm9yX2Zvcm1hdCk7CisgICAgICAgICBQeU9iamVjdCAqaW50ZWdyYWwsCisgICAgICAgICBjb25zdCBjaGFyKiBlcnJvcl9mb3JtYXQpOwogCiAgICAgICAgLyoKLSAgICAgICAgUmV0dXJucyB0aGUgb2JqZWN0IGNvbnZlcnRlZCB0byBQeV9zc2l6ZV90IGJ5IGdvaW5nIHRocm91Z2gKLSAgICAgICAgUHlOdW1iZXJfSW5kZXggZmlyc3QuICBJZiBhbiBvdmVyZmxvdyBlcnJvciBvY2N1cnMgd2hpbGUKLSAgICAgICAgY29udmVydGluZyB0aGUgaW50LW9yLWxvbmcgdG8gUHlfc3NpemVfdCwgdGhlbiB0aGUgc2Vjb25kIGFyZ3VtZW50Ci0gICAgICAgIGlzIHRoZSBlcnJvci10eXBlIHRvIHJldHVybi4gIElmIGl0IGlzIE5VTEwsIHRoZW4gdGhlIG92ZXJmbG93IGVycm9yCi0gICAgICAgIGlzIGNsZWFyZWQgYW5kIHRoZSB2YWx1ZSBpcyBjbGlwcGVkLiAKKyAgICBSZXR1cm5zIHRoZSBvYmplY3QgY29udmVydGVkIHRvIFB5X3NzaXplX3QgYnkgZ29pbmcgdGhyb3VnaAorICAgIFB5TnVtYmVyX0luZGV4IGZpcnN0LiAgSWYgYW4gb3ZlcmZsb3cgZXJyb3Igb2NjdXJzIHdoaWxlCisgICAgY29udmVydGluZyB0aGUgaW50LW9yLWxvbmcgdG8gUHlfc3NpemVfdCwgdGhlbiB0aGUgc2Vjb25kIGFyZ3VtZW50CisgICAgaXMgdGhlIGVycm9yLXR5cGUgdG8gcmV0dXJuLiAgSWYgaXQgaXMgTlVMTCwgdGhlbiB0aGUgb3ZlcmZsb3cgZXJyb3IKKyAgICBpcyBjbGVhcmVkIGFuZCB0aGUgdmFsdWUgaXMgY2xpcHBlZC4KICAgICAgICAqLwogCiAgICAgIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlOdW1iZXJfSW50KFB5T2JqZWN0ICpvKTsKIAogICAgICAgIC8qCi0JIFJldHVybnMgdGhlIG8gY29udmVydGVkIHRvIGFuIGludGVnZXIgb2JqZWN0IG9uIHN1Y2Nlc3MsIG9yCi0JIE5VTEwgb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbgotCSBleHByZXNzaW9uOiBpbnQobykuCisgICAgIFJldHVybnMgdGhlIG8gY29udmVydGVkIHRvIGFuIGludGVnZXIgb2JqZWN0IG9uIHN1Y2Nlc3MsIG9yCisgICAgIE5VTEwgb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbgorICAgICBleHByZXNzaW9uOiBpbnQobykuCiAKICAgICAgICAqLwogCiAgICAgIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlOdW1iZXJfTG9uZyhQeU9iamVjdCAqbyk7CiAKICAgICAgICAvKgotCSBSZXR1cm5zIHRoZSBvIGNvbnZlcnRlZCB0byBhIGxvbmcgaW50ZWdlciBvYmplY3Qgb24gc3VjY2VzcywKLQkgb3IgTlVMTCBvbiBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uCi0JIGV4cHJlc3Npb246IGxvbmcobykuCisgICAgIFJldHVybnMgdGhlIG8gY29udmVydGVkIHRvIGEgbG9uZyBpbnRlZ2VyIG9iamVjdCBvbiBzdWNjZXNzLAorICAgICBvciBOVUxMIG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24KKyAgICAgZXhwcmVzc2lvbjogbG9uZyhvKS4KIAogICAgICAgICovCiAKICAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU51bWJlcl9GbG9hdChQeU9iamVjdCAqbyk7CiAKICAgICAgICAvKgotCSBSZXR1cm5zIHRoZSBvIGNvbnZlcnRlZCB0byBhIGZsb2F0IG9iamVjdCBvbiBzdWNjZXNzLCBvciBOVUxMCi0JIG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjoKLQkgZmxvYXQobykuCisgICAgIFJldHVybnMgdGhlIG8gY29udmVydGVkIHRvIGEgZmxvYXQgb2JqZWN0IG9uIHN1Y2Nlc3MsIG9yIE5VTEwKKyAgICAgb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOgorICAgICBmbG9hdChvKS4KICAgICAgICAqLwotCSAKKwogLyogIEluLXBsYWNlIHZhcmlhbnRzIG9mIChzb21lIG9mKSB0aGUgYWJvdmUgbnVtYmVyIHByb3RvY29sIGZ1bmN0aW9ucyAqLwogCiAgICAgIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlOdW1iZXJfSW5QbGFjZUFkZChQeU9iamVjdCAqbzEsIFB5T2JqZWN0ICpvMik7CiAKICAgICAgICAvKgotCSBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYWRkaW5nIG8yIHRvIG8xLCBwb3NzaWJseSBpbi1wbGFjZSwgb3IgbnVsbAotCSBvbiBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246Ci0JIG8xICs9IG8yLgorICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYWRkaW5nIG8yIHRvIG8xLCBwb3NzaWJseSBpbi1wbGFjZSwgb3IgbnVsbAorICAgICBvbiBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246CisgICAgIG8xICs9IG8yLgogCiAgICAgICAgKi8KIAogICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5TnVtYmVyX0luUGxhY2VTdWJ0cmFjdChQeU9iamVjdCAqbzEsIFB5T2JqZWN0ICpvMik7CiAKICAgICAgICAvKgotCSBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc3VidHJhY3RpbmcgbzIgZnJvbSBvMSwgcG9zc2libHkgaW4tcGxhY2Ugb3IKLQkgbnVsbCBvbiBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246Ci0JIG8xIC09IG8yLgorICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc3VidHJhY3RpbmcgbzIgZnJvbSBvMSwgcG9zc2libHkgaW4tcGxhY2Ugb3IKKyAgICAgbnVsbCBvbiBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246CisgICAgIG8xIC09IG8yLgogCiAgICAgICAgKi8KIAogICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5TnVtYmVyX0luUGxhY2VNdWx0aXBseShQeU9iamVjdCAqbzEsIFB5T2JqZWN0ICpvMik7CiAKICAgICAgICAvKgotCSBSZXR1cm5zIHRoZSByZXN1bHQgb2YgbXVsdGlwbHlpbmcgbzEgYnkgbzIsIHBvc3NpYmx5IGluLXBsYWNlLCBvcgotCSBudWxsIG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjoKLQkgbzEgKj0gbzIuCisgICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBtdWx0aXBseWluZyBvMSBieSBvMiwgcG9zc2libHkgaW4tcGxhY2UsIG9yCisgICAgIG51bGwgb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOgorICAgICBvMSAqPSBvMi4KIAogICAgICAgICovCiAKICAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU51bWJlcl9JblBsYWNlRGl2aWRlKFB5T2JqZWN0ICpvMSwgUHlPYmplY3QgKm8yKTsKIAogICAgICAgIC8qCi0JIFJldHVybnMgdGhlIHJlc3VsdCBvZiBkaXZpZGluZyBvMSBieSBvMiwgcG9zc2libHkgaW4tcGxhY2UsIG9yIG51bGwKLQkgb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOgotCSBvMSAvPSBvMi4KKyAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGRpdmlkaW5nIG8xIGJ5IG8yLCBwb3NzaWJseSBpbi1wbGFjZSwgb3IgbnVsbAorICAgICBvbiBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246CisgICAgIG8xIC89IG8yLgogCiAgICAgICAgKi8KIAogICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5TnVtYmVyX0luUGxhY2VGbG9vckRpdmlkZShQeU9iamVjdCAqbzEsCi0JCQkJCQkgICAgICAgUHlPYmplY3QgKm8yKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqbzIpOwogCiAgICAgICAgLyoKLQkgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGRpdmlkaW5nIG8xIGJ5IG8yIGdpdmluZyBhbiBpbnRlZ3JhbCByZXN1bHQsCi0JIHBvc3NpYmx5IGluLXBsYWNlLCBvciBudWxsIG9uIGZhaWx1cmUuCi0JIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOgotCSBvMSAvPSBvMi4KKyAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGRpdmlkaW5nIG8xIGJ5IG8yIGdpdmluZyBhbiBpbnRlZ3JhbCByZXN1bHQsCisgICAgIHBvc3NpYmx5IGluLXBsYWNlLCBvciBudWxsIG9uIGZhaWx1cmUuCisgICAgIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOgorICAgICBvMSAvPSBvMi4KIAogICAgICAgICovCiAKICAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU51bWJlcl9JblBsYWNlVHJ1ZURpdmlkZShQeU9iamVjdCAqbzEsCi0JCQkJCQkgICAgICBQeU9iamVjdCAqbzIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKm8yKTsKIAogICAgICAgIC8qCi0JIFJldHVybnMgdGhlIHJlc3VsdCBvZiBkaXZpZGluZyBvMSBieSBvMiBnaXZpbmcgYSBmbG9hdCByZXN1bHQsCi0JIHBvc3NpYmx5IGluLXBsYWNlLCBvciBudWxsIG9uIGZhaWx1cmUuCi0JIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOgotCSBvMSAvPSBvMi4KKyAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGRpdmlkaW5nIG8xIGJ5IG8yIGdpdmluZyBhIGZsb2F0IHJlc3VsdCwKKyAgICAgcG9zc2libHkgaW4tcGxhY2UsIG9yIG51bGwgb24gZmFpbHVyZS4KKyAgICAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246CisgICAgIG8xIC89IG8yLgogCiAgICAgICAgKi8KIAogICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5TnVtYmVyX0luUGxhY2VSZW1haW5kZXIoUHlPYmplY3QgKm8xLCBQeU9iamVjdCAqbzIpOwogCiAgICAgICAgLyoKLQkgUmV0dXJucyB0aGUgcmVtYWluZGVyIG9mIGRpdmlkaW5nIG8xIGJ5IG8yLCBwb3NzaWJseSBpbi1wbGFjZSwgb3IKLQkgbnVsbCBvbiBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246Ci0JIG8xICU9IG8yLgorICAgICBSZXR1cm5zIHRoZSByZW1haW5kZXIgb2YgZGl2aWRpbmcgbzEgYnkgbzIsIHBvc3NpYmx5IGluLXBsYWNlLCBvcgorICAgICBudWxsIG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjoKKyAgICAgbzEgJT0gbzIuCiAKICAgICAgICAqLwogCiAgICAgIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlOdW1iZXJfSW5QbGFjZVBvd2VyKFB5T2JqZWN0ICpvMSwgUHlPYmplY3QgKm8yLAotICAgICAJCQkJCQkgUHlPYmplY3QgKm8zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqbzMpOwogCiAgICAgICAgLyoKLQkgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHJhaXNpbmcgbzEgdG8gdGhlIHBvd2VyIG9mIG8yLCBwb3NzaWJseQotCSBpbi1wbGFjZSwgb3IgbnVsbCBvbiBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uCi0JIGV4cHJlc3Npb246IG8xICoqPSBvMiwgb3IgcG93KG8xLCBvMiwgbzMpIGlmIG8zIGlzIHByZXNlbnQuCisgICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiByYWlzaW5nIG8xIHRvIHRoZSBwb3dlciBvZiBvMiwgcG9zc2libHkKKyAgICAgaW4tcGxhY2UsIG9yIG51bGwgb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbgorICAgICBleHByZXNzaW9uOiBvMSAqKj0gbzIsIG9yIHBvdyhvMSwgbzIsIG8zKSBpZiBvMyBpcyBwcmVzZW50LgogCiAgICAgICAgKi8KIAogICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5TnVtYmVyX0luUGxhY2VMc2hpZnQoUHlPYmplY3QgKm8xLCBQeU9iamVjdCAqbzIpOwogCiAgICAgICAgLyoKLQkgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGxlZnQgc2hpZnRpbmcgbzEgYnkgbzIsIHBvc3NpYmx5IGluLXBsYWNlLCBvcgotCSBudWxsIG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjoKLQkgbzEgPDw9IG8yLgorICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgbGVmdCBzaGlmdGluZyBvMSBieSBvMiwgcG9zc2libHkgaW4tcGxhY2UsIG9yCisgICAgIG51bGwgb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOgorICAgICBvMSA8PD0gbzIuCiAKICAgICAgICAqLwogCiAgICAgIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlOdW1iZXJfSW5QbGFjZVJzaGlmdChQeU9iamVjdCAqbzEsIFB5T2JqZWN0ICpvMik7CiAKICAgICAgICAvKgotCSBSZXR1cm5zIHRoZSByZXN1bHQgb2YgcmlnaHQgc2hpZnRpbmcgbzEgYnkgbzIsIHBvc3NpYmx5IGluLXBsYWNlIG9yCi0JIG51bGwgb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOgotCSBvMSA+Pj0gbzIuCisgICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiByaWdodCBzaGlmdGluZyBvMSBieSBvMiwgcG9zc2libHkgaW4tcGxhY2Ugb3IKKyAgICAgbnVsbCBvbiBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246CisgICAgIG8xID4+PSBvMi4KIAogICAgICAgICovCiAKICAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU51bWJlcl9JblBsYWNlQW5kKFB5T2JqZWN0ICpvMSwgUHlPYmplY3QgKm8yKTsKIAogICAgICAgIC8qCi0JIFJldHVybnMgdGhlIHJlc3VsdCBvZiBiaXR3aXNlIGFuZCBvZiBvMSBhbmQgbzIsIHBvc3NpYmx5IGluLXBsYWNlLAotCSBvciBudWxsIG9uIGZhaWx1cmUuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbgotCSBleHByZXNzaW9uOiBvMSAmPSBvMi4KKyAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGJpdHdpc2UgYW5kIG9mIG8xIGFuZCBvMiwgcG9zc2libHkgaW4tcGxhY2UsCisgICAgIG9yIG51bGwgb24gZmFpbHVyZS4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uCisgICAgIGV4cHJlc3Npb246IG8xICY9IG8yLgogCiAgICAgICAgKi8KIAogICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5TnVtYmVyX0luUGxhY2VYb3IoUHlPYmplY3QgKm8xLCBQeU9iamVjdCAqbzIpOwogCiAgICAgICAgLyoKLQkgUmV0dXJucyB0aGUgYml0d2lzZSBleGNsdXNpdmUgb3Igb2YgbzEgYnkgbzIsIHBvc3NpYmx5IGluLXBsYWNlLCBvcgotCSBudWxsIG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjoKLQkgbzEgXj0gbzIuCisgICAgIFJldHVybnMgdGhlIGJpdHdpc2UgZXhjbHVzaXZlIG9yIG9mIG8xIGJ5IG8yLCBwb3NzaWJseSBpbi1wbGFjZSwgb3IKKyAgICAgbnVsbCBvbiBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246CisgICAgIG8xIF49IG8yLgogCiAgICAgICAgKi8KIAogICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5TnVtYmVyX0luUGxhY2VPcihQeU9iamVjdCAqbzEsIFB5T2JqZWN0ICpvMik7CiAKICAgICAgICAvKgotCSBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYml0d2lzZSBvciBvZiBvMSBhbmQgbzIsIHBvc3NpYmx5IGluLXBsYWNlLAotCSBvciBudWxsIG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24KLQkgZXhwcmVzc2lvbjogbzEgfD0gbzIuCisgICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBiaXR3aXNlIG9yIG9mIG8xIGFuZCBvMiwgcG9zc2libHkgaW4tcGxhY2UsCisgICAgIG9yIG51bGwgb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbgorICAgICBleHByZXNzaW9uOiBvMSB8PSBvMi4KIAogICAgICAgICovCiAKQEAgLTEwMzMsOSArMTAzMyw5IEBACiAgICAgIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlOdW1iZXJfVG9CYXNlKFB5T2JqZWN0ICpuLCBpbnQgYmFzZSk7CiAKICAgICAgICAvKgotCSBSZXR1cm5zIHRoZSBpbnRlZ2VyIG4gY29udmVydGVkIHRvIGEgc3RyaW5nIHdpdGggYSBiYXNlLCB3aXRoIGEgYmFzZQotCSBtYXJrZXIgb2YgMGIsIDBvIG9yIDB4IHByZWZpeGVkIGlmIGFwcGxpY2FibGUuCi0JIElmIG4gaXMgbm90IGFuIGludCBvYmplY3QsIGl0IGlzIGNvbnZlcnRlZCB3aXRoIFB5TnVtYmVyX0luZGV4IGZpcnN0LgorICAgICBSZXR1cm5zIHRoZSBpbnRlZ2VyIG4gY29udmVydGVkIHRvIGEgc3RyaW5nIHdpdGggYSBiYXNlLCB3aXRoIGEgYmFzZQorICAgICBtYXJrZXIgb2YgMGIsIDBvIG9yIDB4IHByZWZpeGVkIGlmIGFwcGxpY2FibGUuCisgICAgIElmIG4gaXMgbm90IGFuIGludCBvYmplY3QsIGl0IGlzIGNvbnZlcnRlZCB3aXRoIFB5TnVtYmVyX0luZGV4IGZpcnN0LgogICAgICAgICovCiAKIApAQCAtMTA0NCwxNyArMTA0NCwxNyBAQAogICAgICBQeUFQSV9GVU5DKGludCkgUHlTZXF1ZW5jZV9DaGVjayhQeU9iamVjdCAqbyk7CiAKICAgICAgICAvKgotICAgICAgICAgUmV0dXJuIDEgaWYgdGhlIG9iamVjdCBwcm92aWRlcyBzZXF1ZW5jZSBwcm90b2NvbCwgYW5kIHplcm8KLQkgb3RoZXJ3aXNlLiAgCisgICAgIFJldHVybiAxIGlmIHRoZSBvYmplY3QgcHJvdmlkZXMgc2VxdWVuY2UgcHJvdG9jb2wsIGFuZCB6ZXJvCisgICAgIG90aGVyd2lzZS4KIAotCSBUaGlzIGZ1bmN0aW9uIGFsd2F5cyBzdWNjZWVkcy4KKyAgICAgVGhpcyBmdW5jdGlvbiBhbHdheXMgc3VjY2VlZHMuCiAKICAgICAgICAqLwogCiAgICAgIFB5QVBJX0ZVTkMoUHlfc3NpemVfdCkgUHlTZXF1ZW5jZV9TaXplKFB5T2JqZWN0ICpvKTsKIAogICAgICAgIC8qCi0gICAgICAgICBSZXR1cm4gdGhlIHNpemUgb2Ygc2VxdWVuY2Ugb2JqZWN0IG8sIG9yIC0xIG9uIGZhaWx1cmUuCisgICAgIFJldHVybiB0aGUgc2l6ZSBvZiBzZXF1ZW5jZSBvYmplY3Qgbywgb3IgLTEgb24gZmFpbHVyZS4KIAogICAgICAgICovCiAKQEAgLTEwNjcsMTUxICsxMDY3LDE1MSBAQAogICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5U2VxdWVuY2VfQ29uY2F0KFB5T2JqZWN0ICpvMSwgUHlPYmplY3QgKm8yKTsKIAogICAgICAgIC8qCi0JIFJldHVybiB0aGUgY29uY2F0ZW5hdGlvbiBvZiBvMSBhbmQgbzIgb24gc3VjY2VzcywgYW5kIE5VTEwgb24KLQkgZmFpbHVyZS4gICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24KLQkgZXhwcmVzc2lvbjogbzErbzIuCisgICAgIFJldHVybiB0aGUgY29uY2F0ZW5hdGlvbiBvZiBvMSBhbmQgbzIgb24gc3VjY2VzcywgYW5kIE5VTEwgb24KKyAgICAgZmFpbHVyZS4gICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24KKyAgICAgZXhwcmVzc2lvbjogbzErbzIuCiAKICAgICAgICAqLwogCiAgICAgIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlTZXF1ZW5jZV9SZXBlYXQoUHlPYmplY3QgKm8sIFB5X3NzaXplX3QgY291bnQpOwogCiAgICAgICAgLyoKLQkgUmV0dXJuIHRoZSByZXN1bHQgb2YgcmVwZWF0aW5nIHNlcXVlbmNlIG9iamVjdCBvIGNvdW50IHRpbWVzLAotCSBvciBOVUxMIG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24KLQkgZXhwcmVzc2lvbjogbzEqY291bnQuCisgICAgIFJldHVybiB0aGUgcmVzdWx0IG9mIHJlcGVhdGluZyBzZXF1ZW5jZSBvYmplY3QgbyBjb3VudCB0aW1lcywKKyAgICAgb3IgTlVMTCBvbiBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uCisgICAgIGV4cHJlc3Npb246IG8xKmNvdW50LgogCiAgICAgICAgKi8KIAogICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5U2VxdWVuY2VfR2V0SXRlbShQeU9iamVjdCAqbywgUHlfc3NpemVfdCBpKTsKIAogICAgICAgIC8qCi0JIFJldHVybiB0aGUgaXRoIGVsZW1lbnQgb2Ygbywgb3IgTlVMTCBvbiBmYWlsdXJlLiBUaGlzIGlzIHRoZQotCSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjogb1tpXS4KKyAgICAgUmV0dXJuIHRoZSBpdGggZWxlbWVudCBvZiBvLCBvciBOVUxMIG9uIGZhaWx1cmUuIFRoaXMgaXMgdGhlCisgICAgIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOiBvW2ldLgogICAgICAgICovCiAKICAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeVNlcXVlbmNlX0dldFNsaWNlKFB5T2JqZWN0ICpvLCBQeV9zc2l6ZV90IGkxLCBQeV9zc2l6ZV90IGkyKTsKIAogICAgICAgIC8qCi0JIFJldHVybiB0aGUgc2xpY2Ugb2Ygc2VxdWVuY2Ugb2JqZWN0IG8gYmV0d2VlbiBpMSBhbmQgaTIsIG9yCi0JIE5VTEwgb24gZmFpbHVyZS4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uCi0JIGV4cHJlc3Npb246IG9baTE6aTJdLgorICAgICBSZXR1cm4gdGhlIHNsaWNlIG9mIHNlcXVlbmNlIG9iamVjdCBvIGJldHdlZW4gaTEgYW5kIGkyLCBvcgorICAgICBOVUxMIG9uIGZhaWx1cmUuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbgorICAgICBleHByZXNzaW9uOiBvW2kxOmkyXS4KIAogICAgICAgICovCiAKICAgICAgUHlBUElfRlVOQyhpbnQpIFB5U2VxdWVuY2VfU2V0SXRlbShQeU9iamVjdCAqbywgUHlfc3NpemVfdCBpLCBQeU9iamVjdCAqdik7CiAKICAgICAgICAvKgotCSBBc3NpZ24gb2JqZWN0IHYgdG8gdGhlIGl0aCBlbGVtZW50IG9mIG8uICBSZXR1cm5zCi0JIC0xIG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24KLQkgc3RhdGVtZW50OiBvW2ldPXYuCisgICAgIEFzc2lnbiBvYmplY3QgdiB0byB0aGUgaXRoIGVsZW1lbnQgb2Ygby4gIFJldHVybnMKKyAgICAgLTEgb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbgorICAgICBzdGF0ZW1lbnQ6IG9baV09di4KIAogICAgICAgICovCiAKICAgICAgUHlBUElfRlVOQyhpbnQpIFB5U2VxdWVuY2VfRGVsSXRlbShQeU9iamVjdCAqbywgUHlfc3NpemVfdCBpKTsKIAogICAgICAgIC8qCi0JIERlbGV0ZSB0aGUgaXRoIGVsZW1lbnQgb2Ygb2JqZWN0IHYuICBSZXR1cm5zCi0JIC0xIG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24KLQkgc3RhdGVtZW50OiBkZWwgb1tpXS4KKyAgICAgRGVsZXRlIHRoZSBpdGggZWxlbWVudCBvZiBvYmplY3Qgdi4gIFJldHVybnMKKyAgICAgLTEgb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbgorICAgICBzdGF0ZW1lbnQ6IGRlbCBvW2ldLgogICAgICAgICovCiAKICAgICAgUHlBUElfRlVOQyhpbnQpIFB5U2VxdWVuY2VfU2V0U2xpY2UoUHlPYmplY3QgKm8sIFB5X3NzaXplX3QgaTEsIFB5X3NzaXplX3QgaTIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKnYpOwogCiAgICAgICAgLyoKLSAgICAgICAgIEFzc2lnbiB0aGUgc2VxdWVuY2Ugb2JqZWN0LCB2LCB0byB0aGUgc2xpY2UgaW4gc2VxdWVuY2UKLQkgb2JqZWN0LCBvLCBmcm9tIGkxIHRvIGkyLiAgUmV0dXJucyAtMSBvbiBmYWlsdXJlLiBUaGlzIGlzIHRoZQotCSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gc3RhdGVtZW50OiBvW2kxOmkyXT12LgorICAgICBBc3NpZ24gdGhlIHNlcXVlbmNlIG9iamVjdCwgdiwgdG8gdGhlIHNsaWNlIGluIHNlcXVlbmNlCisgICAgIG9iamVjdCwgbywgZnJvbSBpMSB0byBpMi4gIFJldHVybnMgLTEgb24gZmFpbHVyZS4gVGhpcyBpcyB0aGUKKyAgICAgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIHN0YXRlbWVudDogb1tpMTppMl09di4KICAgICAgICAqLwogCiAgICAgIFB5QVBJX0ZVTkMoaW50KSBQeVNlcXVlbmNlX0RlbFNsaWNlKFB5T2JqZWN0ICpvLCBQeV9zc2l6ZV90IGkxLCBQeV9zc2l6ZV90IGkyKTsKIAogICAgICAgIC8qCi0JIERlbGV0ZSB0aGUgc2xpY2UgaW4gc2VxdWVuY2Ugb2JqZWN0LCBvLCBmcm9tIGkxIHRvIGkyLgotCSBSZXR1cm5zIC0xIG9uIGZhaWx1cmUuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbgotCSBzdGF0ZW1lbnQ6IGRlbCBvW2kxOmkyXS4KKyAgICAgRGVsZXRlIHRoZSBzbGljZSBpbiBzZXF1ZW5jZSBvYmplY3QsIG8sIGZyb20gaTEgdG8gaTIuCisgICAgIFJldHVybnMgLTEgb24gZmFpbHVyZS4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uCisgICAgIHN0YXRlbWVudDogZGVsIG9baTE6aTJdLgogICAgICAgICovCiAKICAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeVNlcXVlbmNlX1R1cGxlKFB5T2JqZWN0ICpvKTsKIAogICAgICAgIC8qCi0JIFJldHVybnMgdGhlIHNlcXVlbmNlLCBvLCBhcyBhIHR1cGxlIG9uIHN1Y2Nlc3MsIGFuZCBOVUxMIG9uIGZhaWx1cmUuCi0JIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgUHl0aG9uIGV4cHJlc3Npb246IHR1cGxlKG8pCisgICAgIFJldHVybnMgdGhlIHNlcXVlbmNlLCBvLCBhcyBhIHR1cGxlIG9uIHN1Y2Nlc3MsIGFuZCBOVUxMIG9uIGZhaWx1cmUuCisgICAgIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgUHl0aG9uIGV4cHJlc3Npb246IHR1cGxlKG8pCiAgICAgICAgKi8KIAogCiAgICAgIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlTZXF1ZW5jZV9MaXN0KFB5T2JqZWN0ICpvKTsKICAgICAgICAvKgotCSBSZXR1cm5zIHRoZSBzZXF1ZW5jZSwgbywgYXMgYSBsaXN0IG9uIHN1Y2Nlc3MsIGFuZCBOVUxMIG9uIGZhaWx1cmUuCi0JIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgUHl0aG9uIGV4cHJlc3Npb246IGxpc3QobykKKyAgICAgUmV0dXJucyB0aGUgc2VxdWVuY2UsIG8sIGFzIGEgbGlzdCBvbiBzdWNjZXNzLCBhbmQgTlVMTCBvbiBmYWlsdXJlLgorICAgICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gdGhlIFB5dGhvbiBleHByZXNzaW9uOiBsaXN0KG8pCiAgICAgICAgKi8KIAogICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5U2VxdWVuY2VfRmFzdChQeU9iamVjdCAqbywgY29uc3QgY2hhciogbSk7CiAgICAgICAgLyoKLSAgICAgICAgIFJldHVybnMgdGhlIHNlcXVlbmNlLCBvLCBhcyBhIHR1cGxlLCB1bmxlc3MgaXQncyBhbHJlYWR5IGEKLSAgICAgICAgIHR1cGxlIG9yIGxpc3QuICBVc2UgUHlTZXF1ZW5jZV9GYXN0X0dFVF9JVEVNIHRvIGFjY2VzcyB0aGUKLSAgICAgICAgIG1lbWJlcnMgb2YgdGhpcyBsaXN0LCBhbmQgUHlTZXF1ZW5jZV9GYXN0X0dFVF9TSVpFIHRvIGdldCBpdHMgbGVuZ3RoLgorICAgICBSZXR1cm5zIHRoZSBzZXF1ZW5jZSwgbywgYXMgYSB0dXBsZSwgdW5sZXNzIGl0J3MgYWxyZWFkeSBhCisgICAgIHR1cGxlIG9yIGxpc3QuICBVc2UgUHlTZXF1ZW5jZV9GYXN0X0dFVF9JVEVNIHRvIGFjY2VzcyB0aGUKKyAgICAgbWVtYmVycyBvZiB0aGlzIGxpc3QsIGFuZCBQeVNlcXVlbmNlX0Zhc3RfR0VUX1NJWkUgdG8gZ2V0IGl0cyBsZW5ndGguCiAKLSAgICAgICAgIFJldHVybnMgTlVMTCBvbiBmYWlsdXJlLiAgSWYgdGhlIG9iamVjdCBkb2VzIG5vdCBzdXBwb3J0IGl0ZXJhdGlvbiwKLSAgICAgICAgIHJhaXNlcyBhIFR5cGVFcnJvciBleGNlcHRpb24gd2l0aCBtIGFzIHRoZSBtZXNzYWdlIHRleHQuCisgICAgIFJldHVybnMgTlVMTCBvbiBmYWlsdXJlLiAgSWYgdGhlIG9iamVjdCBkb2VzIG5vdCBzdXBwb3J0IGl0ZXJhdGlvbiwKKyAgICAgcmFpc2VzIGEgVHlwZUVycm9yIGV4Y2VwdGlvbiB3aXRoIG0gYXMgdGhlIG1lc3NhZ2UgdGV4dC4KICAgICAgICAqLwogCiAjZGVmaW5lIFB5U2VxdWVuY2VfRmFzdF9HRVRfU0laRShvKSBcCi0JKFB5TGlzdF9DaGVjayhvKSA/IFB5TGlzdF9HRVRfU0laRShvKSA6IFB5VHVwbGVfR0VUX1NJWkUobykpCisgICAgKFB5TGlzdF9DaGVjayhvKSA/IFB5TGlzdF9HRVRfU0laRShvKSA6IFB5VHVwbGVfR0VUX1NJWkUobykpCiAgICAgICAgLyoKLQkgUmV0dXJuIHRoZSBzaXplIG9mIG8sIGFzc3VtaW5nIHRoYXQgbyB3YXMgcmV0dXJuZWQgYnkKLSAgICAgICAgIFB5U2VxdWVuY2VfRmFzdCBhbmQgaXMgbm90IE5VTEwuCisgICAgIFJldHVybiB0aGUgc2l6ZSBvZiBvLCBhc3N1bWluZyB0aGF0IG8gd2FzIHJldHVybmVkIGJ5CisgICAgIFB5U2VxdWVuY2VfRmFzdCBhbmQgaXMgbm90IE5VTEwuCiAgICAgICAgKi8KIAogI2RlZmluZSBQeVNlcXVlbmNlX0Zhc3RfR0VUX0lURU0obywgaSlcCiAgICAgIChQeUxpc3RfQ2hlY2sobykgPyBQeUxpc3RfR0VUX0lURU0obywgaSkgOiBQeVR1cGxlX0dFVF9JVEVNKG8sIGkpKQogICAgICAgIC8qCi0JIFJldHVybiB0aGUgaXRoIGVsZW1lbnQgb2YgbywgYXNzdW1pbmcgdGhhdCBvIHdhcyByZXR1cm5lZCBieQotICAgICAgICAgUHlTZXF1ZW5jZV9GYXN0LCBhbmQgdGhhdCBpIGlzIHdpdGhpbiBib3VuZHMuCisgICAgIFJldHVybiB0aGUgaXRoIGVsZW1lbnQgb2YgbywgYXNzdW1pbmcgdGhhdCBvIHdhcyByZXR1cm5lZCBieQorICAgICBQeVNlcXVlbmNlX0Zhc3QsIGFuZCB0aGF0IGkgaXMgd2l0aGluIGJvdW5kcy4KICAgICAgICAqLwogCiAjZGVmaW5lIFB5U2VxdWVuY2VfSVRFTShvLCBpKVwKLQkoIFB5X1RZUEUobyktPnRwX2FzX3NlcXVlbmNlLT5zcV9pdGVtKG8sIGkpICkKKyAgICAoIFB5X1RZUEUobyktPnRwX2FzX3NlcXVlbmNlLT5zcV9pdGVtKG8sIGkpICkKICAgICAgICAvKiBBc3N1bWUgdHBfYXNfc2VxdWVuY2UgYW5kIHNxX2l0ZW0gZXhpc3QgYW5kIHRoYXQgaSBkb2VzIG5vdAotCSAgbmVlZCB0byBiZSBjb3JyZWN0ZWQgZm9yIGEgbmVnYXRpdmUgaW5kZXgKLSAgICAgICAqLyAgICAgCisgICAgICBuZWVkIHRvIGJlIGNvcnJlY3RlZCBmb3IgYSBuZWdhdGl2ZSBpbmRleAorICAgICAgICovCiAKICNkZWZpbmUgUHlTZXF1ZW5jZV9GYXN0X0lURU1TKHNmKSBcCi0JKFB5TGlzdF9DaGVjayhzZikgPyAoKFB5TGlzdE9iamVjdCAqKShzZikpLT5vYl9pdGVtIFwKLQkJCSAgOiAoKFB5VHVwbGVPYmplY3QgKikoc2YpKS0+b2JfaXRlbSkKLQkvKiBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSB1bmRlcmx5aW5nIGl0ZW0gYXJyYXkgZm9yCi0gICAgICAgICAgIGFuIG9iamVjdCByZXR1cmVkIGJ5IFB5U2VxdWVuY2VfRmFzdCAqLworICAgIChQeUxpc3RfQ2hlY2soc2YpID8gKChQeUxpc3RPYmplY3QgKikoc2YpKS0+b2JfaXRlbSBcCisgICAgICAgICAgICAgICAgICAgICAgOiAoKFB5VHVwbGVPYmplY3QgKikoc2YpKS0+b2JfaXRlbSkKKyAgICAvKiBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSB1bmRlcmx5aW5nIGl0ZW0gYXJyYXkgZm9yCisgICAgICAgYW4gb2JqZWN0IHJldHVyZWQgYnkgUHlTZXF1ZW5jZV9GYXN0ICovCiAKICAgICAgUHlBUElfRlVOQyhQeV9zc2l6ZV90KSBQeVNlcXVlbmNlX0NvdW50KFB5T2JqZWN0ICpvLCBQeU9iamVjdCAqdmFsdWUpOwogCiAgICAgICAgLyoKLSAgICAgICAgIFJldHVybiB0aGUgbnVtYmVyIG9mIG9jY3VycmVuY2VzIG9uIHZhbHVlIG9uIG8sIHRoYXQgaXMsCi0JIHJldHVybiB0aGUgbnVtYmVyIG9mIGtleXMgZm9yIHdoaWNoIG9ba2V5XT09dmFsdWUuICBPbgotCSBmYWlsdXJlLCByZXR1cm4gLTEuICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gdGhlIFB5dGhvbgotCSBleHByZXNzaW9uOiBvLmNvdW50KHZhbHVlKS4KKyAgICAgUmV0dXJuIHRoZSBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgb24gdmFsdWUgb24gbywgdGhhdCBpcywKKyAgICAgcmV0dXJuIHRoZSBudW1iZXIgb2Yga2V5cyBmb3Igd2hpY2ggb1trZXldPT12YWx1ZS4gIE9uCisgICAgIGZhaWx1cmUsIHJldHVybiAtMS4gIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgUHl0aG9uCisgICAgIGV4cHJlc3Npb246IG8uY291bnQodmFsdWUpLgogICAgICAgICovCiAKICAgICAgUHlBUElfRlVOQyhpbnQpIFB5U2VxdWVuY2VfQ29udGFpbnMoUHlPYmplY3QgKnNlcSwgUHlPYmplY3QgKm9iKTsKICAgICAgICAvKgotICAgICAgICAgUmV0dXJuIC0xIGlmIGVycm9yOyAxIGlmIG9iIGluIHNlcTsgMCBpZiBvYiBub3QgaW4gc2VxLgotICAgICAgICAgVXNlIF9fY29udGFpbnNfXyBpZiBwb3NzaWJsZSwgZWxzZSBfUHlTZXF1ZW5jZV9JdGVyU2VhcmNoKCkuCisgICAgIFJldHVybiAtMSBpZiBlcnJvcjsgMSBpZiBvYiBpbiBzZXE7IDAgaWYgb2Igbm90IGluIHNlcS4KKyAgICAgVXNlIF9fY29udGFpbnNfXyBpZiBwb3NzaWJsZSwgZWxzZSBfUHlTZXF1ZW5jZV9JdGVyU2VhcmNoKCkuCiAgICAgICAgKi8KIAogI2RlZmluZSBQWV9JVEVSU0VBUkNIX0NPVU5UICAgIDEKICNkZWZpbmUgUFlfSVRFUlNFQVJDSF9JTkRFWCAgICAyCiAjZGVmaW5lIFBZX0lURVJTRUFSQ0hfQ09OVEFJTlMgMwogICAgICBQeUFQSV9GVU5DKFB5X3NzaXplX3QpIF9QeVNlcXVlbmNlX0l0ZXJTZWFyY2goUHlPYmplY3QgKnNlcSwKLSAgICAgCQkJCQlQeU9iamVjdCAqb2JqLCBpbnQgb3BlcmF0aW9uKTsKLQkvKgotCSAgSXRlcmF0ZSBvdmVyIHNlcS4gIFJlc3VsdCBkZXBlbmRzIG9uIHRoZSBvcGVyYXRpb246Ci0JICBQWV9JVEVSU0VBUkNIX0NPVU5UOiAgcmV0dXJuICMgb2YgdGltZXMgb2JqIGFwcGVhcnMgaW4gc2VxOyAtMSBpZgotCSAgCWVycm9yLgotCSAgUFlfSVRFUlNFQVJDSF9JTkRFWDogIHJldHVybiAwLWJhc2VkIGluZGV4IG9mIGZpcnN0IG9jY3VycmVuY2Ugb2YKLQkgIAlvYmogaW4gc2VxOyBzZXQgVmFsdWVFcnJvciBhbmQgcmV0dXJuIC0xIGlmIG5vbmUgZm91bmQ7Ci0JICAJYWxzbyByZXR1cm4gLTEgb24gZXJyb3IuCi0JICBQWV9JVEVSU0VBUkNIX0NPTlRBSU5TOiAgcmV0dXJuIDEgaWYgb2JqIGluIHNlcSwgZWxzZSAwOyAtMSBvbgotCSAgCWVycm9yLgotCSovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKm9iaiwgaW50IG9wZXJhdGlvbik7CisgICAgLyoKKyAgICAgIEl0ZXJhdGUgb3ZlciBzZXEuICBSZXN1bHQgZGVwZW5kcyBvbiB0aGUgb3BlcmF0aW9uOgorICAgICAgUFlfSVRFUlNFQVJDSF9DT1VOVDogIHJldHVybiAjIG9mIHRpbWVzIG9iaiBhcHBlYXJzIGluIHNlcTsgLTEgaWYKKyAgICAgICAgZXJyb3IuCisgICAgICBQWV9JVEVSU0VBUkNIX0lOREVYOiAgcmV0dXJuIDAtYmFzZWQgaW5kZXggb2YgZmlyc3Qgb2NjdXJyZW5jZSBvZgorICAgICAgICBvYmogaW4gc2VxOyBzZXQgVmFsdWVFcnJvciBhbmQgcmV0dXJuIC0xIGlmIG5vbmUgZm91bmQ7CisgICAgICAgIGFsc28gcmV0dXJuIC0xIG9uIGVycm9yLgorICAgICAgUFlfSVRFUlNFQVJDSF9DT05UQUlOUzogIHJldHVybiAxIGlmIG9iaiBpbiBzZXEsIGVsc2UgMDsgLTEgb24KKyAgICAgICAgZXJyb3IuCisgICAgKi8KIAogLyogRm9yIERMTC1sZXZlbCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSAqLwogI3VuZGVmIFB5U2VxdWVuY2VfSW4KQEAgLTEyMjEsMTcgKzEyMjEsMTcgQEAKICNkZWZpbmUgUHlTZXF1ZW5jZV9JbiBQeVNlcXVlbmNlX0NvbnRhaW5zCiAKICAgICAgICAvKgotCSBEZXRlcm1pbmUgaWYgbyBjb250YWlucyB2YWx1ZS4gIElmIGFuIGl0ZW0gaW4gbyBpcyBlcXVhbCB0bwotCSBYLCByZXR1cm4gMSwgb3RoZXJ3aXNlIHJldHVybiAwLiAgT24gZXJyb3IsIHJldHVybiAtMS4gIFRoaXMKLQkgaXMgZXF1aXZhbGVudCB0byB0aGUgUHl0aG9uIGV4cHJlc3Npb246IHZhbHVlIGluIG8uCisgICAgIERldGVybWluZSBpZiBvIGNvbnRhaW5zIHZhbHVlLiAgSWYgYW4gaXRlbSBpbiBvIGlzIGVxdWFsIHRvCisgICAgIFgsIHJldHVybiAxLCBvdGhlcndpc2UgcmV0dXJuIDAuICBPbiBlcnJvciwgcmV0dXJuIC0xLiAgVGhpcworICAgICBpcyBlcXVpdmFsZW50IHRvIHRoZSBQeXRob24gZXhwcmVzc2lvbjogdmFsdWUgaW4gby4KICAgICAgICAqLwogCiAgICAgIFB5QVBJX0ZVTkMoUHlfc3NpemVfdCkgUHlTZXF1ZW5jZV9JbmRleChQeU9iamVjdCAqbywgUHlPYmplY3QgKnZhbHVlKTsKIAogICAgICAgIC8qCi0JIFJldHVybiB0aGUgZmlyc3QgaW5kZXggZm9yIHdoaWNoIG9baV09dmFsdWUuICBPbiBlcnJvciwKLQkgcmV0dXJuIC0xLiAgICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gdGhlIFB5dGhvbgotCSBleHByZXNzaW9uOiBvLmluZGV4KHZhbHVlKS4KKyAgICAgUmV0dXJuIHRoZSBmaXJzdCBpbmRleCBmb3Igd2hpY2ggb1tpXT12YWx1ZS4gIE9uIGVycm9yLAorICAgICByZXR1cm4gLTEuICAgIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgUHl0aG9uCisgICAgIGV4cHJlc3Npb246IG8uaW5kZXgodmFsdWUpLgogICAgICAgICovCiAKIC8qIEluLXBsYWNlIHZlcnNpb25zIG9mIHNvbWUgb2YgdGhlIGFib3ZlIFNlcXVlbmNlIGZ1bmN0aW9ucy4gKi8KQEAgLTEyMzksMTggKzEyMzksMTggQEAKICAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeVNlcXVlbmNlX0luUGxhY2VDb25jYXQoUHlPYmplY3QgKm8xLCBQeU9iamVjdCAqbzIpOwogCiAgICAgICAgLyoKLQkgQXBwZW5kIG8yIHRvIG8xLCBpbi1wbGFjZSB3aGVuIHBvc3NpYmxlLiBSZXR1cm4gdGhlIHJlc3VsdGluZwotCSBvYmplY3QsIHdoaWNoIGNvdWxkIGJlIG8xLCBvciBOVUxMIG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZQotCSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjogbzEgKz0gbzIuCisgICAgIEFwcGVuZCBvMiB0byBvMSwgaW4tcGxhY2Ugd2hlbiBwb3NzaWJsZS4gUmV0dXJuIHRoZSByZXN1bHRpbmcKKyAgICAgb2JqZWN0LCB3aGljaCBjb3VsZCBiZSBvMSwgb3IgTlVMTCBvbiBmYWlsdXJlLiAgVGhpcyBpcyB0aGUKKyAgICAgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246IG8xICs9IG8yLgogCiAgICAgICAgKi8KIAogICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5U2VxdWVuY2VfSW5QbGFjZVJlcGVhdChQeU9iamVjdCAqbywgUHlfc3NpemVfdCBjb3VudCk7CiAKICAgICAgICAvKgotCSBSZXBlYXQgbzEgYnkgY291bnQsIGluLXBsYWNlIHdoZW4gcG9zc2libGUuIFJldHVybiB0aGUgcmVzdWx0aW5nCi0JIG9iamVjdCwgd2hpY2ggY291bGQgYmUgbzEsIG9yIE5VTEwgb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlCi0JIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOiBvMSAqPSBjb3VudC4KKyAgICAgUmVwZWF0IG8xIGJ5IGNvdW50LCBpbi1wbGFjZSB3aGVuIHBvc3NpYmxlLiBSZXR1cm4gdGhlIHJlc3VsdGluZworICAgICBvYmplY3QsIHdoaWNoIGNvdWxkIGJlIG8xLCBvciBOVUxMIG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZQorICAgICBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjogbzEgKj0gY291bnQuCiAKICAgICAgICAqLwogCkBAIC0xMjU5LDE4ICsxMjU5LDE4IEBACiAgICAgIFB5QVBJX0ZVTkMoaW50KSBQeU1hcHBpbmdfQ2hlY2soUHlPYmplY3QgKm8pOwogCiAgICAgICAgLyoKLSAgICAgICAgIFJldHVybiAxIGlmIHRoZSBvYmplY3QgcHJvdmlkZXMgbWFwcGluZyBwcm90b2NvbCwgYW5kIHplcm8KLQkgb3RoZXJ3aXNlLiAgCisgICAgIFJldHVybiAxIGlmIHRoZSBvYmplY3QgcHJvdmlkZXMgbWFwcGluZyBwcm90b2NvbCwgYW5kIHplcm8KKyAgICAgb3RoZXJ3aXNlLgogCi0JIFRoaXMgZnVuY3Rpb24gYWx3YXlzIHN1Y2NlZWRzLgorICAgICBUaGlzIGZ1bmN0aW9uIGFsd2F5cyBzdWNjZWVkcy4KICAgICAgICAqLwogCiAgICAgIFB5QVBJX0ZVTkMoUHlfc3NpemVfdCkgUHlNYXBwaW5nX1NpemUoUHlPYmplY3QgKm8pOwogCiAgICAgICAgLyoKLSAgICAgICAgIFJldHVybnMgdGhlIG51bWJlciBvZiBrZXlzIGluIG9iamVjdCBvIG9uIHN1Y2Nlc3MsIGFuZCAtMSBvbgotCSBmYWlsdXJlLiAgRm9yIG9iamVjdHMgdGhhdCBkbyBub3QgcHJvdmlkZSBzZXF1ZW5jZSBwcm90b2NvbCwKLQkgdGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSBQeXRob24gZXhwcmVzc2lvbjogbGVuKG8pLgorICAgICBSZXR1cm5zIHRoZSBudW1iZXIgb2Yga2V5cyBpbiBvYmplY3QgbyBvbiBzdWNjZXNzLCBhbmQgLTEgb24KKyAgICAgZmFpbHVyZS4gIEZvciBvYmplY3RzIHRoYXQgZG8gbm90IHByb3ZpZGUgc2VxdWVuY2UgcHJvdG9jb2wsCisgICAgIHRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgUHl0aG9uIGV4cHJlc3Npb246IGxlbihvKS4KICAgICAgICAqLwogCiAgICAgICAgLyogRm9yIERMTCBjb21wYXRpYmlsaXR5ICovCkBAIC0xMjgzLDkgKzEyODMsOSBAQAogCiAgICAgIGludCBQeU1hcHBpbmdfRGVsSXRlbVN0cmluZyhQeU9iamVjdCAqbywgY2hhciAqa2V5KTsKIAotCSBSZW1vdmUgdGhlIG1hcHBpbmcgZm9yIG9iamVjdCwga2V5LCBmcm9tIHRoZSBvYmplY3QgKm8uCi0JIFJldHVybnMgLTEgb24gZmFpbHVyZS4gIFRoaXMgaXMgZXF1aXZhbGVudCB0bwotCSB0aGUgUHl0aG9uIHN0YXRlbWVudDogZGVsIG9ba2V5XS4KKyAgICAgUmVtb3ZlIHRoZSBtYXBwaW5nIGZvciBvYmplY3QsIGtleSwgZnJvbSB0aGUgb2JqZWN0ICpvLgorICAgICBSZXR1cm5zIC0xIG9uIGZhaWx1cmUuICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8KKyAgICAgdGhlIFB5dGhvbiBzdGF0ZW1lbnQ6IGRlbCBvW2tleV0uCiAgICAgICAgKi8KICNkZWZpbmUgUHlNYXBwaW5nX0RlbEl0ZW1TdHJpbmcoTyxLKSBQeU9iamVjdF9EZWxJdGVtU3RyaW5nKChPKSwoSykpCiAKQEAgLTEyOTMsMzAgKzEyOTMsMzAgQEAKIAogICAgICBpbnQgUHlNYXBwaW5nX0RlbEl0ZW0oUHlPYmplY3QgKm8sIFB5T2JqZWN0ICprZXkpOwogCi0JIFJlbW92ZSB0aGUgbWFwcGluZyBmb3Igb2JqZWN0LCBrZXksIGZyb20gdGhlIG9iamVjdCAqby4KLQkgUmV0dXJucyAtMSBvbiBmYWlsdXJlLiAgVGhpcyBpcyBlcXVpdmFsZW50IHRvCi0JIHRoZSBQeXRob24gc3RhdGVtZW50OiBkZWwgb1trZXldLgorICAgICBSZW1vdmUgdGhlIG1hcHBpbmcgZm9yIG9iamVjdCwga2V5LCBmcm9tIHRoZSBvYmplY3QgKm8uCisgICAgIFJldHVybnMgLTEgb24gZmFpbHVyZS4gIFRoaXMgaXMgZXF1aXZhbGVudCB0bworICAgICB0aGUgUHl0aG9uIHN0YXRlbWVudDogZGVsIG9ba2V5XS4KICAgICAgICAqLwogI2RlZmluZSBQeU1hcHBpbmdfRGVsSXRlbShPLEspIFB5T2JqZWN0X0RlbEl0ZW0oKE8pLChLKSkKIAogICAgICBQeUFQSV9GVU5DKGludCkgUHlNYXBwaW5nX0hhc0tleVN0cmluZyhQeU9iamVjdCAqbywgY2hhciAqa2V5KTsKIAogICAgICAgIC8qCi0JIE9uIHN1Y2Nlc3MsIHJldHVybiAxIGlmIHRoZSBtYXBwaW5nIG9iamVjdCBoYXMgdGhlIGtleSwga2V5LAotCSBhbmQgMCBvdGhlcndpc2UuICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gdGhlIFB5dGhvbiBleHByZXNzaW9uOgotCSBvLmhhc19rZXkoa2V5KS4gCisgICAgIE9uIHN1Y2Nlc3MsIHJldHVybiAxIGlmIHRoZSBtYXBwaW5nIG9iamVjdCBoYXMgdGhlIGtleSwga2V5LAorICAgICBhbmQgMCBvdGhlcndpc2UuICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gdGhlIFB5dGhvbiBleHByZXNzaW9uOgorICAgICBvLmhhc19rZXkoa2V5KS4KIAotCSBUaGlzIGZ1bmN0aW9uIGFsd2F5cyBzdWNjZWVkcy4KKyAgICAgVGhpcyBmdW5jdGlvbiBhbHdheXMgc3VjY2VlZHMuCiAgICAgICAgKi8KIAogICAgICBQeUFQSV9GVU5DKGludCkgUHlNYXBwaW5nX0hhc0tleShQeU9iamVjdCAqbywgUHlPYmplY3QgKmtleSk7CiAKICAgICAgICAvKgotCSBSZXR1cm4gMSBpZiB0aGUgbWFwcGluZyBvYmplY3QgaGFzIHRoZSBrZXksIGtleSwKLQkgYW5kIDAgb3RoZXJ3aXNlLiAgVGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSBQeXRob24gZXhwcmVzc2lvbjoKLQkgby5oYXNfa2V5KGtleSkuIAorICAgICBSZXR1cm4gMSBpZiB0aGUgbWFwcGluZyBvYmplY3QgaGFzIHRoZSBrZXksIGtleSwKKyAgICAgYW5kIDAgb3RoZXJ3aXNlLiAgVGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSBQeXRob24gZXhwcmVzc2lvbjoKKyAgICAgby5oYXNfa2V5KGtleSkuCiAKLQkgVGhpcyBmdW5jdGlvbiBhbHdheXMgc3VjY2VlZHMuCisgICAgIFRoaXMgZnVuY3Rpb24gYWx3YXlzIHN1Y2NlZWRzLgogCiAgICAgICAgKi8KIApAQCAtMTMyNCw5ICsxMzI0LDkgQEAKIAogICAgICBQeU9iamVjdCAqUHlNYXBwaW5nX0tleXMoUHlPYmplY3QgKm8pOwogCi0gICAgICAgICBPbiBzdWNjZXNzLCByZXR1cm4gYSBsaXN0IG9mIHRoZSBrZXlzIGluIG9iamVjdCBvLiAgT24KLQkgZmFpbHVyZSwgcmV0dXJuIE5VTEwuIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgUHl0aG9uCi0JIGV4cHJlc3Npb246IG8ua2V5cygpLgorICAgICBPbiBzdWNjZXNzLCByZXR1cm4gYSBsaXN0IG9mIHRoZSBrZXlzIGluIG9iamVjdCBvLiAgT24KKyAgICAgZmFpbHVyZSwgcmV0dXJuIE5VTEwuIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgUHl0aG9uCisgICAgIGV4cHJlc3Npb246IG8ua2V5cygpLgogICAgICAgICovCiAjZGVmaW5lIFB5TWFwcGluZ19LZXlzKE8pIFB5T2JqZWN0X0NhbGxNZXRob2QoTywia2V5cyIsTlVMTCkKIApAQCAtMTMzNCw5ICsxMzM0LDkgQEAKIAogICAgICBQeU9iamVjdCAqUHlNYXBwaW5nX1ZhbHVlcyhQeU9iamVjdCAqbyk7CiAKLSAgICAgICAgIE9uIHN1Y2Nlc3MsIHJldHVybiBhIGxpc3Qgb2YgdGhlIHZhbHVlcyBpbiBvYmplY3Qgby4gIE9uCi0JIGZhaWx1cmUsIHJldHVybiBOVUxMLiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gdGhlIFB5dGhvbgotCSBleHByZXNzaW9uOiBvLnZhbHVlcygpLgorICAgICBPbiBzdWNjZXNzLCByZXR1cm4gYSBsaXN0IG9mIHRoZSB2YWx1ZXMgaW4gb2JqZWN0IG8uICBPbgorICAgICBmYWlsdXJlLCByZXR1cm4gTlVMTC4gVGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSBQeXRob24KKyAgICAgZXhwcmVzc2lvbjogby52YWx1ZXMoKS4KICAgICAgICAqLwogI2RlZmluZSBQeU1hcHBpbmdfVmFsdWVzKE8pIFB5T2JqZWN0X0NhbGxNZXRob2QoTywidmFsdWVzIixOVUxMKQogCkBAIC0xMzQ0LDEwICsxMzQ0LDEwIEBACiAKICAgICAgUHlPYmplY3QgKlB5TWFwcGluZ19JdGVtcyhQeU9iamVjdCAqbyk7CiAKLSAgICAgICAgIE9uIHN1Y2Nlc3MsIHJldHVybiBhIGxpc3Qgb2YgdGhlIGl0ZW1zIGluIG9iamVjdCBvLCB3aGVyZQotCSBlYWNoIGl0ZW0gaXMgYSB0dXBsZSBjb250YWluaW5nIGEga2V5LXZhbHVlIHBhaXIuICBPbgotCSBmYWlsdXJlLCByZXR1cm4gTlVMTC4gVGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSBQeXRob24KLQkgZXhwcmVzc2lvbjogby5pdGVtcygpLgorICAgICBPbiBzdWNjZXNzLCByZXR1cm4gYSBsaXN0IG9mIHRoZSBpdGVtcyBpbiBvYmplY3Qgbywgd2hlcmUKKyAgICAgZWFjaCBpdGVtIGlzIGEgdHVwbGUgY29udGFpbmluZyBhIGtleS12YWx1ZSBwYWlyLiAgT24KKyAgICAgZmFpbHVyZSwgcmV0dXJuIE5VTEwuIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgUHl0aG9uCisgICAgIGV4cHJlc3Npb246IG8uaXRlbXMoKS4KIAogICAgICAgICovCiAjZGVmaW5lIFB5TWFwcGluZ19JdGVtcyhPKSBQeU9iamVjdF9DYWxsTWV0aG9kKE8sIml0ZW1zIixOVUxMKQpAQCAtMTM1NSwxOCArMTM1NSwxOCBAQAogICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5TWFwcGluZ19HZXRJdGVtU3RyaW5nKFB5T2JqZWN0ICpvLCBjaGFyICprZXkpOwogCiAgICAgICAgLyoKLQkgUmV0dXJuIGVsZW1lbnQgb2YgbyBjb3JyZXNwb25kaW5nIHRvIHRoZSBvYmplY3QsIGtleSwgb3IgTlVMTAotCSBvbiBmYWlsdXJlLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjoKLQkgb1trZXldLgorICAgICBSZXR1cm4gZWxlbWVudCBvZiBvIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG9iamVjdCwga2V5LCBvciBOVUxMCisgICAgIG9uIGZhaWx1cmUuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOgorICAgICBvW2tleV0uCiAgICAgICAgKi8KIAogICAgICBQeUFQSV9GVU5DKGludCkgUHlNYXBwaW5nX1NldEl0ZW1TdHJpbmcoUHlPYmplY3QgKm8sIGNoYXIgKmtleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKnZhbHVlKTsKIAogICAgICAgIC8qCi0JIE1hcCB0aGUgb2JqZWN0LCBrZXksIHRvIHRoZSB2YWx1ZSwgdi4gIFJldHVybnMgCi0JIC0xIG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24KLQkgc3RhdGVtZW50OiBvW2tleV09di4KKyAgICAgTWFwIHRoZSBvYmplY3QsIGtleSwgdG8gdGhlIHZhbHVlLCB2LiAgUmV0dXJucworICAgICAtMSBvbiBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uCisgICAgIHN0YXRlbWVudDogb1trZXldPXYuCiAgICAgICAqLwogCiAKZGlmZiAtLWdpdCBhL0luY2x1ZGUvY2V2YWwuaCBiL0luY2x1ZGUvY2V2YWwuaAppbmRleCBmNDQxMTk3Li40MGY3Yjk0IDEwMDY0NAotLS0gYS9JbmNsdWRlL2NldmFsLmgKKysrIGIvSW5jbHVkZS9jZXZhbC5oCkBAIC04LDcgKzgsNyBAQAogLyogSW50ZXJmYWNlIHRvIHJhbmRvbSBwYXJ0cyBpbiBjZXZhbC5jICovCiAKIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlFdmFsX0NhbGxPYmplY3RXaXRoS2V5d29yZHMoCi0JUHlPYmplY3QgKiwgUHlPYmplY3QgKiwgUHlPYmplY3QgKik7CisgICAgUHlPYmplY3QgKiwgUHlPYmplY3QgKiwgUHlPYmplY3QgKik7CiAKIC8qIERMTC1sZXZlbCBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eTogKi8KICN1bmRlZiBQeUV2YWxfQ2FsbE9iamVjdApAQCAtMTYsNyArMTYsNyBAQAogCiAvKiBJbmxpbmUgdGhpcyAqLwogI2RlZmluZSBQeUV2YWxfQ2FsbE9iamVjdChmdW5jLGFyZykgXAotICAgICAgICBQeUV2YWxfQ2FsbE9iamVjdFdpdGhLZXl3b3JkcyhmdW5jLCBhcmcsIChQeU9iamVjdCAqKU5VTEwpCisgICAgUHlFdmFsX0NhbGxPYmplY3RXaXRoS2V5d29yZHMoZnVuYywgYXJnLCAoUHlPYmplY3QgKilOVUxMKQogCiBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5RXZhbF9DYWxsRnVuY3Rpb24oUHlPYmplY3QgKm9iaiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmb3JtYXQsIC4uLik7CkBAIC01MCwxMCArNTAsMTAgQEAKIFB5QVBJX0ZVTkMoaW50KSBQeV9HZXRSZWN1cnNpb25MaW1pdCh2b2lkKTsKIAogI2RlZmluZSBQeV9FbnRlclJlY3Vyc2l2ZUNhbGwod2hlcmUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSAgICAoX1B5X01ha2VSZWNDaGVjayhQeVRocmVhZFN0YXRlX0dFVCgpLT5yZWN1cnNpb25fZGVwdGgpICYmICBcCi0JICAgICBfUHlfQ2hlY2tSZWN1cnNpdmVDYWxsKHdoZXJlKSkKLSNkZWZpbmUgUHlfTGVhdmVSZWN1cnNpdmVDYWxsKCkJCQkJXAotCSAgICAoLS1QeVRocmVhZFN0YXRlX0dFVCgpLT5yZWN1cnNpb25fZGVwdGgpCisgICAgICAgICAgICAoX1B5X01ha2VSZWNDaGVjayhQeVRocmVhZFN0YXRlX0dFVCgpLT5yZWN1cnNpb25fZGVwdGgpICYmICBcCisgICAgICAgICAgICAgX1B5X0NoZWNrUmVjdXJzaXZlQ2FsbCh3aGVyZSkpCisjZGVmaW5lIFB5X0xlYXZlUmVjdXJzaXZlQ2FsbCgpICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICgtLVB5VGhyZWFkU3RhdGVfR0VUKCktPnJlY3Vyc2lvbl9kZXB0aCkKIFB5QVBJX0ZVTkMoaW50KSBfUHlfQ2hlY2tSZWN1cnNpdmVDYWxsKGNoYXIgKndoZXJlKTsKIFB5QVBJX0RBVEEoaW50KSBfUHlfQ2hlY2tSZWN1cnNpb25MaW1pdDsKICNpZmRlZiBVU0VfU1RBQ0tDSEVDSwpAQCAtNzksMzEgKzc5LDMxIEBACiAgICB0aGF0IGxhc3RzIGEgbG9uZyB0aW1lIGFuZCBkb2Vzbid0IHRvdWNoIFB5dGhvbiBkYXRhKSBjYW4gYWxsb3cgb3RoZXIKICAgIHRocmVhZHMgdG8gcnVuIGFzIGZvbGxvd3M6CiAKLQkuLi5wcmVwYXJhdGlvbnMgaGVyZS4uLgotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQkuLi5ibG9ja2luZyBzeXN0ZW0gY2FsbCBoZXJlLi4uCi0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQkuLi5pbnRlcnByZXQgcmVzdWx0IGhlcmUuLi4KKyAgICAuLi5wcmVwYXJhdGlvbnMgaGVyZS4uLgorICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAuLi5ibG9ja2luZyBzeXN0ZW0gY2FsbCBoZXJlLi4uCisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICAuLi5pbnRlcnByZXQgcmVzdWx0IGhlcmUuLi4KIAogICAgVGhlIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMvUHlfRU5EX0FMTE9XX1RIUkVBRFMgcGFpciBleHBhbmRzIHRvIGEKICAgIHt9LXN1cnJvdW5kZWQgYmxvY2suCiAgICBUbyBsZWF2ZSB0aGUgYmxvY2sgaW4gdGhlIG1pZGRsZSAoZS5nLiwgd2l0aCByZXR1cm4pLCB5b3UgbXVzdCBpbnNlcnQKICAgIGEgbGluZSBjb250YWluaW5nIFB5X0JMT0NLX1RIUkVBRFMgYmVmb3JlIHRoZSByZXR1cm4sIGUuZy4KIAotCWlmICguLi5wcmVtYXR1cmVfZXhpdC4uLikgewotCQlQeV9CTE9DS19USFJFQURTCi0JCVB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICguLi5wcmVtYXR1cmVfZXhpdC4uLikgeworICAgICAgICBQeV9CTE9DS19USFJFQURTCisgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCiAgICBBbiBhbHRlcm5hdGl2ZSBpczoKIAotCVB5X0JMT0NLX1RIUkVBRFMKLQlpZiAoLi4ucHJlbWF0dXJlX2V4aXQuLi4pIHsKLQkJUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JUHlfVU5CTE9DS19USFJFQURTCisgICAgUHlfQkxPQ0tfVEhSRUFEUworICAgIGlmICguLi5wcmVtYXR1cmVfZXhpdC4uLikgeworICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeV9VTkJMT0NLX1RIUkVBRFMKIAogICAgRm9yIGNvbnZlbmllbmNlLCB0aGF0IHRoZSB2YWx1ZSBvZiAnZXJybm8nIGlzIHJlc3RvcmVkIGFjcm9zcwogICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMgYW5kIFB5X0JMT0NLX1RIUkVBRFMuCkBAIC0xMzIsMTIgKzEzMiwxMiBAQAogUHlBUElfRlVOQyh2b2lkKSBQeUV2YWxfUmVJbml0VGhyZWFkcyh2b2lkKTsKIAogI2RlZmluZSBQeV9CRUdJTl9BTExPV19USFJFQURTIHsgXAotCQkJUHlUaHJlYWRTdGF0ZSAqX3NhdmU7IFwKLQkJCV9zYXZlID0gUHlFdmFsX1NhdmVUaHJlYWQoKTsKLSNkZWZpbmUgUHlfQkxPQ0tfVEhSRUFEUwlQeUV2YWxfUmVzdG9yZVRocmVhZChfc2F2ZSk7Ci0jZGVmaW5lIFB5X1VOQkxPQ0tfVEhSRUFEUwlfc2F2ZSA9IFB5RXZhbF9TYXZlVGhyZWFkKCk7Ci0jZGVmaW5lIFB5X0VORF9BTExPV19USFJFQURTCVB5RXZhbF9SZXN0b3JlVGhyZWFkKF9zYXZlKTsgXAotCQkgfQorICAgICAgICAgICAgICAgICAgICAgICAgUHlUaHJlYWRTdGF0ZSAqX3NhdmU7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9zYXZlID0gUHlFdmFsX1NhdmVUaHJlYWQoKTsKKyNkZWZpbmUgUHlfQkxPQ0tfVEhSRUFEUyAgICAgICAgUHlFdmFsX1Jlc3RvcmVUaHJlYWQoX3NhdmUpOworI2RlZmluZSBQeV9VTkJMT0NLX1RIUkVBRFMgICAgICBfc2F2ZSA9IFB5RXZhbF9TYXZlVGhyZWFkKCk7CisjZGVmaW5lIFB5X0VORF9BTExPV19USFJFQURTICAgIFB5RXZhbF9SZXN0b3JlVGhyZWFkKF9zYXZlKTsgXAorICAgICAgICAgICAgICAgICB9CiAKICNlbHNlIC8qICFXSVRIX1RIUkVBRCAqLwogCmRpZmYgLS1naXQgYS9JbmNsdWRlL2RhdGV0aW1lLmggYi9JbmNsdWRlL2RhdGV0aW1lLmgKaW5kZXggMGQzMTBiNC4uMjgzMThlYSAxMDA2NDQKLS0tIGEvSW5jbHVkZS9kYXRldGltZS5oCisrKyBiL0luY2x1ZGUvZGF0ZXRpbWUuaApAQCAtMTEsMTMgKzExLDEzIEBACiAgKiBiaWctZW5kaWFuLCB1bmxlc3Mgb3RoZXJ3aXNlIG5vdGVkOgogICoKICAqIGJ5dGUgb2Zmc2V0Ci0gKiAgMCAJCXllYXIgICAgIDIgYnl0ZXMsIDEtOTk5OQotICogIDIJCW1vbnRoICAgIDEgYnl0ZSwgMS0xMgotICogIDMgCQlkYXkgICAgICAxIGJ5dGUsIDEtMzEKLSAqICA0CQlob3VyICAgICAxIGJ5dGUsIDAtMjMKLSAqICA1IAkJbWludXRlICAgMSBieXRlLCAwLTU5Ci0gKiAgNiAJCXNlY29uZCAgIDEgYnl0ZSwgMC01OQotICogIDcgCQl1c2Vjb25kICAzIGJ5dGVzLCAwLTk5OTk5OQorICogIDAgICAgICAgICAgIHllYXIgICAgIDIgYnl0ZXMsIDEtOTk5OQorICogIDIgICAgICAgICAgIG1vbnRoICAgIDEgYnl0ZSwgMS0xMgorICogIDMgICAgICAgICAgIGRheSAgICAgIDEgYnl0ZSwgMS0zMQorICogIDQgICAgICAgICAgIGhvdXIgICAgIDEgYnl0ZSwgMC0yMworICogIDUgICAgICAgICAgIG1pbnV0ZSAgIDEgYnl0ZSwgMC01OQorICogIDYgICAgICAgICAgIHNlY29uZCAgIDEgYnl0ZSwgMC01OQorICogIDcgICAgICAgICAgIHVzZWNvbmQgIDMgYnl0ZXMsIDAtOTk5OTk5CiAgKiAxMAogICovCiAKQEAgLTMzLDI2ICszMywyNiBAQAogCiB0eXBlZGVmIHN0cnVjdAogewotCVB5T2JqZWN0X0hFQUQKLQlsb25nIGhhc2hjb2RlOwkJLyogLTEgd2hlbiB1bmtub3duICovCi0JaW50IGRheXM7CQkvKiAtTUFYX0RFTFRBX0RBWVMgPD0gZGF5cyA8PSBNQVhfREVMVEFfREFZUyAqLwotCWludCBzZWNvbmRzOwkJLyogMCA8PSBzZWNvbmRzIDwgMjQqMzYwMCBpcyBpbnZhcmlhbnQgKi8KLQlpbnQgbWljcm9zZWNvbmRzOwkvKiAwIDw9IG1pY3Jvc2Vjb25kcyA8IDEwMDAwMDAgaXMgaW52YXJpYW50ICovCisgICAgUHlPYmplY3RfSEVBRAorICAgIGxvbmcgaGFzaGNvZGU7ICAgICAgICAgICAgICAvKiAtMSB3aGVuIHVua25vd24gKi8KKyAgICBpbnQgZGF5czsgICAgICAgICAgICAgICAgICAgLyogLU1BWF9ERUxUQV9EQVlTIDw9IGRheXMgPD0gTUFYX0RFTFRBX0RBWVMgKi8KKyAgICBpbnQgc2Vjb25kczsgICAgICAgICAgICAgICAgLyogMCA8PSBzZWNvbmRzIDwgMjQqMzYwMCBpcyBpbnZhcmlhbnQgKi8KKyAgICBpbnQgbWljcm9zZWNvbmRzOyAgICAgICAgICAgLyogMCA8PSBtaWNyb3NlY29uZHMgPCAxMDAwMDAwIGlzIGludmFyaWFudCAqLwogfSBQeURhdGVUaW1lX0RlbHRhOwogCiB0eXBlZGVmIHN0cnVjdAogewotCVB5T2JqZWN0X0hFQUQJCS8qIGEgcHVyZSBhYnN0cmFjdCBiYXNlIGNsYXNlICovCisgICAgUHlPYmplY3RfSEVBRCAgICAgICAgICAgICAgIC8qIGEgcHVyZSBhYnN0cmFjdCBiYXNlIGNsYXNlICovCiB9IFB5RGF0ZVRpbWVfVFpJbmZvOwogCiAKIC8qIFRoZSBkYXRldGltZSBhbmQgdGltZSB0eXBlcyBoYXZlIGhhc2hjb2RlcywgYW5kIGFuIG9wdGlvbmFsIHR6aW5mbyBtZW1iZXIsCiAgKiBwcmVzZW50IGlmIGFuZCBvbmx5IGlmIGhhc3R6aW5mbyBpcyB0cnVlLgogICovCi0jZGVmaW5lIF9QeVRaSU5GT19IRUFECQlcCi0JUHlPYmplY3RfSEVBRAkJXAotCWxvbmcgaGFzaGNvZGU7CQlcCi0JY2hhciBoYXN0emluZm87CQkvKiBib29sZWFuIGZsYWcgKi8KKyNkZWZpbmUgX1B5VFpJTkZPX0hFQUQgICAgICAgICAgXAorICAgIFB5T2JqZWN0X0hFQUQgICAgICAgICAgICAgICBcCisgICAgbG9uZyBoYXNoY29kZTsgICAgICAgICAgICAgIFwKKyAgICBjaGFyIGhhc3R6aW5mbzsgICAgICAgICAgICAgLyogYm9vbGVhbiBmbGFnICovCiAKIC8qIE5vIF9QeURhdGVUaW1lX0Jhc2VUWkluZm8gaXMgYWxsb2NhdGVkOyBpdCdzIGp1c3QgdG8gaGF2ZSBzb21ldGhpbmcKICAqIGNvbnZlbmllbnQgdG8gY2FzdCB0bywgd2hlbiBnZXR0aW5nIGF0IHRoZSBoYXN0emluZm8gbWVtYmVyIG9mIG9iamVjdHMKQEAgLTYwLDcgKzYwLDcgQEAKICAqLwogdHlwZWRlZiBzdHJ1Y3QKIHsKLQlfUHlUWklORk9fSEVBRAorICAgIF9QeVRaSU5GT19IRUFECiB9IF9QeURhdGVUaW1lX0Jhc2VUWkluZm87CiAKIC8qIEFsbCB0aW1lIG9iamVjdHMgYXJlIG9mIFB5RGF0ZVRpbWVfVGltZVR5cGUsIGJ1dCB0aGF0IGNhbiBiZSBhbGxvY2F0ZWQKQEAgLTY5LDIwICs2OSwyMCBAQAogICogaW50ZXJuYWwgc3RydWN0IHVzZWQgdG8gYWxsb2NhdGUgdGhlIHJpZ2h0IGFtb3VudCBvZiBzcGFjZSBmb3IgdGhlCiAgKiAid2l0aG91dCIgY2FzZS4KICAqLwotI2RlZmluZSBfUHlEYXRlVGltZV9USU1FSEVBRAlcCi0JX1B5VFpJTkZPX0hFQUQJCVwKLQl1bnNpZ25lZCBjaGFyIGRhdGFbX1B5RGF0ZVRpbWVfVElNRV9EQVRBU0laRV07CisjZGVmaW5lIF9QeURhdGVUaW1lX1RJTUVIRUFEICAgIFwKKyAgICBfUHlUWklORk9fSEVBRCAgICAgICAgICAgICAgXAorICAgIHVuc2lnbmVkIGNoYXIgZGF0YVtfUHlEYXRlVGltZV9USU1FX0RBVEFTSVpFXTsKIAogdHlwZWRlZiBzdHJ1Y3QKIHsKLQlfUHlEYXRlVGltZV9USU1FSEVBRAotfSBfUHlEYXRlVGltZV9CYXNlVGltZTsJCS8qIGhhc3R6aW5mbyBmYWxzZSAqLworICAgIF9QeURhdGVUaW1lX1RJTUVIRUFECit9IF9QeURhdGVUaW1lX0Jhc2VUaW1lOyAgICAgICAgIC8qIGhhc3R6aW5mbyBmYWxzZSAqLwogCiB0eXBlZGVmIHN0cnVjdAogewotCV9QeURhdGVUaW1lX1RJTUVIRUFECi0JUHlPYmplY3QgKnR6aW5mbzsKLX0gUHlEYXRlVGltZV9UaW1lOwkJLyogaGFzdHppbmZvIHRydWUgKi8KKyAgICBfUHlEYXRlVGltZV9USU1FSEVBRAorICAgIFB5T2JqZWN0ICp0emluZm87Cit9IFB5RGF0ZVRpbWVfVGltZTsgICAgICAgICAgICAgIC8qIGhhc3R6aW5mbyB0cnVlICovCiAKIAogLyogQWxsIGRhdGV0aW1lIG9iamVjdHMgYXJlIG9mIFB5RGF0ZVRpbWVfRGF0ZVRpbWVUeXBlLCBidXQgdGhhdCBjYW4gYmUKQEAgLTkyLDQ4ICs5Miw0OCBAQAogICovCiB0eXBlZGVmIHN0cnVjdAogewotCV9QeVRaSU5GT19IRUFECi0JdW5zaWduZWQgY2hhciBkYXRhW19QeURhdGVUaW1lX0RBVEVfREFUQVNJWkVdOworICAgIF9QeVRaSU5GT19IRUFECisgICAgdW5zaWduZWQgY2hhciBkYXRhW19QeURhdGVUaW1lX0RBVEVfREFUQVNJWkVdOwogfSBQeURhdGVUaW1lX0RhdGU7CiAKLSNkZWZpbmUgX1B5RGF0ZVRpbWVfREFURVRJTUVIRUFECVwKLQlfUHlUWklORk9fSEVBRAkJCVwKLQl1bnNpZ25lZCBjaGFyIGRhdGFbX1B5RGF0ZVRpbWVfREFURVRJTUVfREFUQVNJWkVdOworI2RlZmluZSBfUHlEYXRlVGltZV9EQVRFVElNRUhFQUQgICAgICAgIFwKKyAgICBfUHlUWklORk9fSEVBRCAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdW5zaWduZWQgY2hhciBkYXRhW19QeURhdGVUaW1lX0RBVEVUSU1FX0RBVEFTSVpFXTsKIAogdHlwZWRlZiBzdHJ1Y3QKIHsKLQlfUHlEYXRlVGltZV9EQVRFVElNRUhFQUQKLX0gX1B5RGF0ZVRpbWVfQmFzZURhdGVUaW1lOwkvKiBoYXN0emluZm8gZmFsc2UgKi8KKyAgICBfUHlEYXRlVGltZV9EQVRFVElNRUhFQUQKK30gX1B5RGF0ZVRpbWVfQmFzZURhdGVUaW1lOyAgICAgLyogaGFzdHppbmZvIGZhbHNlICovCiAKIHR5cGVkZWYgc3RydWN0CiB7Ci0JX1B5RGF0ZVRpbWVfREFURVRJTUVIRUFECi0JUHlPYmplY3QgKnR6aW5mbzsKLX0gUHlEYXRlVGltZV9EYXRlVGltZTsJCS8qIGhhc3R6aW5mbyB0cnVlICovCisgICAgX1B5RGF0ZVRpbWVfREFURVRJTUVIRUFECisgICAgUHlPYmplY3QgKnR6aW5mbzsKK30gUHlEYXRlVGltZV9EYXRlVGltZTsgICAgICAgICAgLyogaGFzdHppbmZvIHRydWUgKi8KIAogCiAvKiBBcHBseSBmb3IgZGF0ZSBhbmQgZGF0ZXRpbWUgaW5zdGFuY2VzLiAqLwogI2RlZmluZSBQeURhdGVUaW1lX0dFVF9ZRUFSKG8pICAgICAoKCgoUHlEYXRlVGltZV9EYXRlKilvKS0+ZGF0YVswXSA8PCA4KSB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFB5RGF0ZVRpbWVfRGF0ZSopbyktPmRhdGFbMV0pCisgICAgICAgICAgICAgICAgICAgICAoKFB5RGF0ZVRpbWVfRGF0ZSopbyktPmRhdGFbMV0pCiAjZGVmaW5lIFB5RGF0ZVRpbWVfR0VUX01PTlRIKG8pICAgICgoKFB5RGF0ZVRpbWVfRGF0ZSopbyktPmRhdGFbMl0pCiAjZGVmaW5lIFB5RGF0ZVRpbWVfR0VUX0RBWShvKSAgICAgICgoKFB5RGF0ZVRpbWVfRGF0ZSopbyktPmRhdGFbM10pCiAKICNkZWZpbmUgUHlEYXRlVGltZV9EQVRFX0dFVF9IT1VSKG8pICAgICAgICAoKChQeURhdGVUaW1lX0RhdGVUaW1lKilvKS0+ZGF0YVs0XSkKICNkZWZpbmUgUHlEYXRlVGltZV9EQVRFX0dFVF9NSU5VVEUobykgICAgICAoKChQeURhdGVUaW1lX0RhdGVUaW1lKilvKS0+ZGF0YVs1XSkKICNkZWZpbmUgUHlEYXRlVGltZV9EQVRFX0dFVF9TRUNPTkQobykgICAgICAoKChQeURhdGVUaW1lX0RhdGVUaW1lKilvKS0+ZGF0YVs2XSkKLSNkZWZpbmUgUHlEYXRlVGltZV9EQVRFX0dFVF9NSUNST1NFQ09ORChvKSAJCVwKLQkoKCgoUHlEYXRlVGltZV9EYXRlVGltZSopbyktPmRhdGFbN10gPDwgMTYpIHwJXAotICAgICAgICAgKCgoUHlEYXRlVGltZV9EYXRlVGltZSopbyktPmRhdGFbOF0gPDwgOCkgIHwJXAotICAgICAgICAgICgoUHlEYXRlVGltZV9EYXRlVGltZSopbyktPmRhdGFbOV0pCisjZGVmaW5lIFB5RGF0ZVRpbWVfREFURV9HRVRfTUlDUk9TRUNPTkQobykgICAgICAgICAgICAgIFwKKyAgICAoKCgoUHlEYXRlVGltZV9EYXRlVGltZSopbyktPmRhdGFbN10gPDwgMTYpIHwgICAgICAgXAorICAgICAoKChQeURhdGVUaW1lX0RhdGVUaW1lKilvKS0+ZGF0YVs4XSA8PCA4KSAgfCAgICAgICBcCisgICAgICAoKFB5RGF0ZVRpbWVfRGF0ZVRpbWUqKW8pLT5kYXRhWzldKQogCiAvKiBBcHBseSBmb3IgdGltZSBpbnN0YW5jZXMuICovCiAjZGVmaW5lIFB5RGF0ZVRpbWVfVElNRV9HRVRfSE9VUihvKSAgICAgICAgKCgoUHlEYXRlVGltZV9UaW1lKilvKS0+ZGF0YVswXSkKICNkZWZpbmUgUHlEYXRlVGltZV9USU1FX0dFVF9NSU5VVEUobykgICAgICAoKChQeURhdGVUaW1lX1RpbWUqKW8pLT5kYXRhWzFdKQogI2RlZmluZSBQeURhdGVUaW1lX1RJTUVfR0VUX1NFQ09ORChvKSAgICAgICgoKFB5RGF0ZVRpbWVfVGltZSopbyktPmRhdGFbMl0pCi0jZGVmaW5lIFB5RGF0ZVRpbWVfVElNRV9HRVRfTUlDUk9TRUNPTkQobykgCQlcCi0JKCgoKFB5RGF0ZVRpbWVfVGltZSopbyktPmRhdGFbM10gPDwgMTYpIHwJXAotICAgICAgICAgKCgoUHlEYXRlVGltZV9UaW1lKilvKS0+ZGF0YVs0XSA8PCA4KSAgfAlcCi0gICAgICAgICAgKChQeURhdGVUaW1lX1RpbWUqKW8pLT5kYXRhWzVdKQorI2RlZmluZSBQeURhdGVUaW1lX1RJTUVfR0VUX01JQ1JPU0VDT05EKG8pICAgICAgICAgICAgICBcCisgICAgKCgoKFB5RGF0ZVRpbWVfVGltZSopbyktPmRhdGFbM10gPDwgMTYpIHwgICAgICAgICAgIFwKKyAgICAgKCgoUHlEYXRlVGltZV9UaW1lKilvKS0+ZGF0YVs0XSA8PCA4KSAgfCAgICAgICAgICAgXAorICAgICAgKChQeURhdGVUaW1lX1RpbWUqKW8pLT5kYXRhWzVdKQogCiAKIC8qIERlZmluZSBzdHJ1Y3R1cmUgZm9yIEMgQVBJLiAqLwpAQCAtMTQ4LDcgKzE0OCw3IEBACiAgICAgLyogY29uc3RydWN0b3JzICovCiAgICAgUHlPYmplY3QgKigqRGF0ZV9Gcm9tRGF0ZSkoaW50LCBpbnQsIGludCwgUHlUeXBlT2JqZWN0Kik7CiAgICAgUHlPYmplY3QgKigqRGF0ZVRpbWVfRnJvbURhdGVBbmRUaW1lKShpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsCi0gICAgICAgICAgICBQeU9iamVjdCosIFB5VHlwZU9iamVjdCopOworICAgICAgICBQeU9iamVjdCosIFB5VHlwZU9iamVjdCopOwogICAgIFB5T2JqZWN0ICooKlRpbWVfRnJvbVRpbWUpKGludCwgaW50LCBpbnQsIGludCwgUHlPYmplY3QqLCBQeVR5cGVPYmplY3QqKTsKICAgICBQeU9iamVjdCAqKCpEZWx0YV9Gcm9tRGVsdGEpKGludCwgaW50LCBpbnQsIGludCwgUHlUeXBlT2JqZWN0Kik7CiAKQEAgLTE4NiwxNCArMTg2LDE0IEBACiBzdGF0aWMgUHlEYXRlVGltZV9DQVBJICpQeURhdGVUaW1lQVBJOwogCiAjZGVmaW5lIFB5RGF0ZVRpbWVfSU1QT1JUIFwKLSAgICAgICAgUHlEYXRlVGltZUFQSSA9IChQeURhdGVUaW1lX0NBUEkqKSBQeUNPYmplY3RfSW1wb3J0KCJkYXRldGltZSIsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRldGltZV9DQVBJIikKKyAgICBQeURhdGVUaW1lQVBJID0gKFB5RGF0ZVRpbWVfQ0FQSSopIFB5Q09iamVjdF9JbXBvcnQoImRhdGV0aW1lIiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0ZXRpbWVfQ0FQSSIpCiAKIC8qIFRoaXMgbWFjcm8gd291bGQgYmUgdXNlZCBpZiBQeUNPYmplY3RfSW1wb3J0RXgoKSB3YXMgY3JlYXRlZC4KICNkZWZpbmUgUHlEYXRlVGltZV9JTVBPUlQgXAotICAgICAgICBQeURhdGVUaW1lQVBJID0gKFB5RGF0ZVRpbWVfQ0FQSSopIFB5Q09iamVjdF9JbXBvcnRFeCgiZGF0ZXRpbWUiLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0ZXRpbWVfQ0FQSSIsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBVEVUSU1FX0FQSV9NQUdJQykKKyAgICBQeURhdGVUaW1lQVBJID0gKFB5RGF0ZVRpbWVfQ0FQSSopIFB5Q09iamVjdF9JbXBvcnRFeCgiZGF0ZXRpbWUiLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRldGltZV9DQVBJIiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQVRFVElNRV9BUElfTUFHSUMpCiAqLwogCiAvKiBNYWNyb3MgZm9yIHR5cGUgY2hlY2tpbmcgd2hlbiBub3QgYnVpbGRpbmcgdGhlIFB5dGhvbiBjb3JlLiAqLwpAQCAtMjE0LDMwICsyMTQsMzAgQEAKIAogLyogTWFjcm9zIGZvciBhY2Nlc3NpbmcgY29uc3RydWN0b3JzIGluIGEgc2ltcGxpZmllZCBmYXNoaW9uLiAqLwogI2RlZmluZSBQeURhdGVfRnJvbURhdGUoeWVhciwgbW9udGgsIGRheSkgXAotCVB5RGF0ZVRpbWVBUEktPkRhdGVfRnJvbURhdGUoeWVhciwgbW9udGgsIGRheSwgUHlEYXRlVGltZUFQSS0+RGF0ZVR5cGUpCisgICAgUHlEYXRlVGltZUFQSS0+RGF0ZV9Gcm9tRGF0ZSh5ZWFyLCBtb250aCwgZGF5LCBQeURhdGVUaW1lQVBJLT5EYXRlVHlwZSkKIAogI2RlZmluZSBQeURhdGVUaW1lX0Zyb21EYXRlQW5kVGltZSh5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW4sIHNlYywgdXNlYykgXAotCVB5RGF0ZVRpbWVBUEktPkRhdGVUaW1lX0Zyb21EYXRlQW5kVGltZSh5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBcCi0JCW1pbiwgc2VjLCB1c2VjLCBQeV9Ob25lLCBQeURhdGVUaW1lQVBJLT5EYXRlVGltZVR5cGUpCisgICAgUHlEYXRlVGltZUFQSS0+RGF0ZVRpbWVfRnJvbURhdGVBbmRUaW1lKHllYXIsIG1vbnRoLCBkYXksIGhvdXIsIFwKKyAgICAgICAgbWluLCBzZWMsIHVzZWMsIFB5X05vbmUsIFB5RGF0ZVRpbWVBUEktPkRhdGVUaW1lVHlwZSkKIAogI2RlZmluZSBQeVRpbWVfRnJvbVRpbWUoaG91ciwgbWludXRlLCBzZWNvbmQsIHVzZWNvbmQpIFwKLQlQeURhdGVUaW1lQVBJLT5UaW1lX0Zyb21UaW1lKGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCB1c2Vjb25kLCBcCi0JCVB5X05vbmUsIFB5RGF0ZVRpbWVBUEktPlRpbWVUeXBlKQorICAgIFB5RGF0ZVRpbWVBUEktPlRpbWVfRnJvbVRpbWUoaG91ciwgbWludXRlLCBzZWNvbmQsIHVzZWNvbmQsIFwKKyAgICAgICAgUHlfTm9uZSwgUHlEYXRlVGltZUFQSS0+VGltZVR5cGUpCiAKICNkZWZpbmUgUHlEZWx0YV9Gcm9tRFNVKGRheXMsIHNlY29uZHMsIHVzZWNvbmRzKSBcCi0JUHlEYXRlVGltZUFQSS0+RGVsdGFfRnJvbURlbHRhKGRheXMsIHNlY29uZHMsIHVzZWNvbmRzLCAxLCBcCi0JCVB5RGF0ZVRpbWVBUEktPkRlbHRhVHlwZSkKKyAgICBQeURhdGVUaW1lQVBJLT5EZWx0YV9Gcm9tRGVsdGEoZGF5cywgc2Vjb25kcywgdXNlY29uZHMsIDEsIFwKKyAgICAgICAgUHlEYXRlVGltZUFQSS0+RGVsdGFUeXBlKQogCiAvKiBNYWNyb3Mgc3VwcG9ydGluZyB0aGUgREIgQVBJLiAqLwogI2RlZmluZSBQeURhdGVUaW1lX0Zyb21UaW1lc3RhbXAoYXJncykgXAotCVB5RGF0ZVRpbWVBUEktPkRhdGVUaW1lX0Zyb21UaW1lc3RhbXAoIFwKLQkJKFB5T2JqZWN0KikgKFB5RGF0ZVRpbWVBUEktPkRhdGVUaW1lVHlwZSksIGFyZ3MsIE5VTEwpCisgICAgUHlEYXRlVGltZUFQSS0+RGF0ZVRpbWVfRnJvbVRpbWVzdGFtcCggXAorICAgICAgICAoUHlPYmplY3QqKSAoUHlEYXRlVGltZUFQSS0+RGF0ZVRpbWVUeXBlKSwgYXJncywgTlVMTCkKIAogI2RlZmluZSBQeURhdGVfRnJvbVRpbWVzdGFtcChhcmdzKSBcCi0JUHlEYXRlVGltZUFQSS0+RGF0ZV9Gcm9tVGltZXN0YW1wKCBcCi0JCShQeU9iamVjdCopIChQeURhdGVUaW1lQVBJLT5EYXRlVHlwZSksIGFyZ3MpCisgICAgUHlEYXRlVGltZUFQSS0+RGF0ZV9Gcm9tVGltZXN0YW1wKCBcCisgICAgICAgIChQeU9iamVjdCopIChQeURhdGVUaW1lQVBJLT5EYXRlVHlwZSksIGFyZ3MpCiAKLSNlbmRpZgkvKiBQeV9CVUlMRF9DT1JFICovCisjZW5kaWYgIC8qIFB5X0JVSUxEX0NPUkUgKi8KIAogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CmRpZmYgLS1naXQgYS9JbmNsdWRlL2Rlc2Nyb2JqZWN0LmggYi9JbmNsdWRlL2Rlc2Nyb2JqZWN0LmgKaW5kZXggNzE4ZjlkNS4uYjU0MjczMiAxMDA2NDQKLS0tIGEvSW5jbHVkZS9kZXNjcm9iamVjdC5oCisrKyBiL0luY2x1ZGUvZGVzY3JvYmplY3QuaApAQCAtOSwyNyArOSwyNyBAQAogdHlwZWRlZiBpbnQgKCpzZXR0ZXIpKFB5T2JqZWN0ICosIFB5T2JqZWN0ICosIHZvaWQgKik7CiAKIHR5cGVkZWYgc3RydWN0IFB5R2V0U2V0RGVmIHsKLQljaGFyICpuYW1lOwotCWdldHRlciBnZXQ7Ci0Jc2V0dGVyIHNldDsKLQljaGFyICpkb2M7Ci0Jdm9pZCAqY2xvc3VyZTsKKyAgICBjaGFyICpuYW1lOworICAgIGdldHRlciBnZXQ7CisgICAgc2V0dGVyIHNldDsKKyAgICBjaGFyICpkb2M7CisgICAgdm9pZCAqY2xvc3VyZTsKIH0gUHlHZXRTZXREZWY7CiAKIHR5cGVkZWYgUHlPYmplY3QgKigqd3JhcHBlcmZ1bmMpKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywKLQkJCQkgdm9pZCAqd3JhcHBlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp3cmFwcGVkKTsKIAogdHlwZWRlZiBQeU9iamVjdCAqKCp3cmFwcGVyZnVuY19rd2RzKShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsCi0JCQkJICAgICAgdm9pZCAqd3JhcHBlZCwgUHlPYmplY3QgKmt3ZHMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp3cmFwcGVkLCBQeU9iamVjdCAqa3dkcyk7CiAKIHN0cnVjdCB3cmFwcGVyYmFzZSB7Ci0JY2hhciAqbmFtZTsKLQlpbnQgb2Zmc2V0OwotCXZvaWQgKmZ1bmN0aW9uOwotCXdyYXBwZXJmdW5jIHdyYXBwZXI7Ci0JY2hhciAqZG9jOwotCWludCBmbGFnczsKLQlQeU9iamVjdCAqbmFtZV9zdHJvYmo7CisgICAgY2hhciAqbmFtZTsKKyAgICBpbnQgb2Zmc2V0OworICAgIHZvaWQgKmZ1bmN0aW9uOworICAgIHdyYXBwZXJmdW5jIHdyYXBwZXI7CisgICAgY2hhciAqZG9jOworICAgIGludCBmbGFnczsKKyAgICBQeU9iamVjdCAqbmFtZV9zdHJvYmo7CiB9OwogCiAvKiBGbGFncyBmb3IgYWJvdmUgc3RydWN0ICovCkBAIC0zOCwzMyArMzgsMzMgQEAKIC8qIFZhcmlvdXMga2luZHMgb2YgZGVzY3JpcHRvciBvYmplY3RzICovCiAKICNkZWZpbmUgUHlEZXNjcl9DT01NT04gXAotCVB5T2JqZWN0X0hFQUQgXAotCVB5VHlwZU9iamVjdCAqZF90eXBlOyBcCi0JUHlPYmplY3QgKmRfbmFtZQorICAgIFB5T2JqZWN0X0hFQUQgXAorICAgIFB5VHlwZU9iamVjdCAqZF90eXBlOyBcCisgICAgUHlPYmplY3QgKmRfbmFtZQogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlEZXNjcl9DT01NT047CisgICAgUHlEZXNjcl9DT01NT047CiB9IFB5RGVzY3JPYmplY3Q7CiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeURlc2NyX0NPTU1PTjsKLQlQeU1ldGhvZERlZiAqZF9tZXRob2Q7CisgICAgUHlEZXNjcl9DT01NT047CisgICAgUHlNZXRob2REZWYgKmRfbWV0aG9kOwogfSBQeU1ldGhvZERlc2NyT2JqZWN0OwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlEZXNjcl9DT01NT047Ci0Jc3RydWN0IFB5TWVtYmVyRGVmICpkX21lbWJlcjsKKyAgICBQeURlc2NyX0NPTU1PTjsKKyAgICBzdHJ1Y3QgUHlNZW1iZXJEZWYgKmRfbWVtYmVyOwogfSBQeU1lbWJlckRlc2NyT2JqZWN0OwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlEZXNjcl9DT01NT047Ci0JUHlHZXRTZXREZWYgKmRfZ2V0c2V0OworICAgIFB5RGVzY3JfQ09NTU9OOworICAgIFB5R2V0U2V0RGVmICpkX2dldHNldDsKIH0gUHlHZXRTZXREZXNjck9iamVjdDsKIAogdHlwZWRlZiBzdHJ1Y3QgewotCVB5RGVzY3JfQ09NTU9OOwotCXN0cnVjdCB3cmFwcGVyYmFzZSAqZF9iYXNlOwotCXZvaWQgKmRfd3JhcHBlZDsgLyogVGhpcyBjYW4gYmUgYW55IGZ1bmN0aW9uIHBvaW50ZXIgKi8KKyAgICBQeURlc2NyX0NPTU1PTjsKKyAgICBzdHJ1Y3Qgd3JhcHBlcmJhc2UgKmRfYmFzZTsKKyAgICB2b2lkICpkX3dyYXBwZWQ7IC8qIFRoaXMgY2FuIGJlIGFueSBmdW5jdGlvbiBwb2ludGVyICovCiB9IFB5V3JhcHBlckRlc2NyT2JqZWN0OwogCiBQeUFQSV9EQVRBKFB5VHlwZU9iamVjdCkgUHlXcmFwcGVyRGVzY3JfVHlwZTsKQEAgLTc1LDExICs3NSwxMSBAQAogUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeURlc2NyX05ld01ldGhvZChQeVR5cGVPYmplY3QgKiwgUHlNZXRob2REZWYgKik7CiBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5RGVzY3JfTmV3Q2xhc3NNZXRob2QoUHlUeXBlT2JqZWN0ICosIFB5TWV0aG9kRGVmICopOwogUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeURlc2NyX05ld01lbWJlcihQeVR5cGVPYmplY3QgKiwKLQkJCQkJICAgICAgIHN0cnVjdCBQeU1lbWJlckRlZiAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IFB5TWVtYmVyRGVmICopOwogUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeURlc2NyX05ld0dldFNldChQeVR5cGVPYmplY3QgKiwKLQkJCQkJICAgICAgIHN0cnVjdCBQeUdldFNldERlZiAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IFB5R2V0U2V0RGVmICopOwogUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeURlc2NyX05ld1dyYXBwZXIoUHlUeXBlT2JqZWN0ICosCi0JCQkJCQlzdHJ1Y3Qgd3JhcHBlcmJhc2UgKiwgdm9pZCAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB3cmFwcGVyYmFzZSAqLCB2b2lkICopOwogI2RlZmluZSBQeURlc2NyX0lzRGF0YShkKSAoUHlfVFlQRShkKS0+dHBfZGVzY3Jfc2V0ICE9IE5VTEwpCiAKIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlEaWN0UHJveHlfTmV3KFB5T2JqZWN0ICopOwpkaWZmIC0tZ2l0IGEvSW5jbHVkZS9kaWN0b2JqZWN0LmggYi9JbmNsdWRlL2RpY3RvYmplY3QuaAppbmRleCBiODNjZDBlLi5iMDQ2ZmM3IDEwMDY0NAotLS0gYS9JbmNsdWRlL2RpY3RvYmplY3QuaAorKysgYi9JbmNsdWRlL2RpY3RvYmplY3QuaApAQCAtNDgsMTMgKzQ4LDEzIEBACiAjZGVmaW5lIFB5RGljdF9NSU5TSVpFIDgKIAogdHlwZWRlZiBzdHJ1Y3QgewotCS8qIENhY2hlZCBoYXNoIGNvZGUgb2YgbWVfa2V5LiAgTm90ZSB0aGF0IGhhc2ggY29kZXMgYXJlIEMgbG9uZ3MuCi0JICogV2UgaGF2ZSB0byB1c2UgUHlfc3NpemVfdCBpbnN0ZWFkIGJlY2F1c2UgZGljdF9wb3BpdGVtKCkgYWJ1c2VzCi0JICogbWVfaGFzaCB0byBob2xkIGEgc2VhcmNoIGZpbmdlci4KLQkgKi8KLQlQeV9zc2l6ZV90IG1lX2hhc2g7Ci0JUHlPYmplY3QgKm1lX2tleTsKLQlQeU9iamVjdCAqbWVfdmFsdWU7CisgICAgLyogQ2FjaGVkIGhhc2ggY29kZSBvZiBtZV9rZXkuICBOb3RlIHRoYXQgaGFzaCBjb2RlcyBhcmUgQyBsb25ncy4KKyAgICAgKiBXZSBoYXZlIHRvIHVzZSBQeV9zc2l6ZV90IGluc3RlYWQgYmVjYXVzZSBkaWN0X3BvcGl0ZW0oKSBhYnVzZXMKKyAgICAgKiBtZV9oYXNoIHRvIGhvbGQgYSBzZWFyY2ggZmluZ2VyLgorICAgICAqLworICAgIFB5X3NzaXplX3QgbWVfaGFzaDsKKyAgICBQeU9iamVjdCAqbWVfa2V5OworICAgIFB5T2JqZWN0ICptZV92YWx1ZTsKIH0gUHlEaWN0RW50cnk7CiAKIC8qCkBAIC02OCwyNCArNjgsMjQgQEAKICovCiB0eXBlZGVmIHN0cnVjdCBfZGljdG9iamVjdCBQeURpY3RPYmplY3Q7CiBzdHJ1Y3QgX2RpY3RvYmplY3QgewotCVB5T2JqZWN0X0hFQUQKLQlQeV9zc2l6ZV90IG1hX2ZpbGw7ICAvKiAjIEFjdGl2ZSArICMgRHVtbXkgKi8KLQlQeV9zc2l6ZV90IG1hX3VzZWQ7ICAvKiAjIEFjdGl2ZSAqLworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBQeV9zc2l6ZV90IG1hX2ZpbGw7ICAvKiAjIEFjdGl2ZSArICMgRHVtbXkgKi8KKyAgICBQeV9zc2l6ZV90IG1hX3VzZWQ7ICAvKiAjIEFjdGl2ZSAqLwogCi0JLyogVGhlIHRhYmxlIGNvbnRhaW5zIG1hX21hc2sgKyAxIHNsb3RzLCBhbmQgdGhhdCdzIGEgcG93ZXIgb2YgMi4KLQkgKiBXZSBzdG9yZSB0aGUgbWFzayBpbnN0ZWFkIG9mIHRoZSBzaXplIGJlY2F1c2UgdGhlIG1hc2sgaXMgbW9yZQotCSAqIGZyZXF1ZW50bHkgbmVlZGVkLgotCSAqLwotCVB5X3NzaXplX3QgbWFfbWFzazsKKyAgICAvKiBUaGUgdGFibGUgY29udGFpbnMgbWFfbWFzayArIDEgc2xvdHMsIGFuZCB0aGF0J3MgYSBwb3dlciBvZiAyLgorICAgICAqIFdlIHN0b3JlIHRoZSBtYXNrIGluc3RlYWQgb2YgdGhlIHNpemUgYmVjYXVzZSB0aGUgbWFzayBpcyBtb3JlCisgICAgICogZnJlcXVlbnRseSBuZWVkZWQuCisgICAgICovCisgICAgUHlfc3NpemVfdCBtYV9tYXNrOwogCi0JLyogbWFfdGFibGUgcG9pbnRzIHRvIG1hX3NtYWxsdGFibGUgZm9yIHNtYWxsIHRhYmxlcywgZWxzZSB0bwotCSAqIGFkZGl0aW9uYWwgbWFsbG9jJ2VkIG1lbW9yeS4gIG1hX3RhYmxlIGlzIG5ldmVyIE5VTEwhICBUaGlzIHJ1bGUKLQkgKiBzYXZlcyByZXBlYXRlZCBydW50aW1lIG51bGwtdGVzdHMgaW4gdGhlIHdvcmtob3JzZSBnZXRpdGVtIGFuZAotCSAqIHNldGl0ZW0gY2FsbHMuCi0JICovCi0JUHlEaWN0RW50cnkgKm1hX3RhYmxlOwotCVB5RGljdEVudHJ5ICooKm1hX2xvb2t1cCkoUHlEaWN0T2JqZWN0ICptcCwgUHlPYmplY3QgKmtleSwgbG9uZyBoYXNoKTsKLQlQeURpY3RFbnRyeSBtYV9zbWFsbHRhYmxlW1B5RGljdF9NSU5TSVpFXTsKKyAgICAvKiBtYV90YWJsZSBwb2ludHMgdG8gbWFfc21hbGx0YWJsZSBmb3Igc21hbGwgdGFibGVzLCBlbHNlIHRvCisgICAgICogYWRkaXRpb25hbCBtYWxsb2MnZWQgbWVtb3J5LiAgbWFfdGFibGUgaXMgbmV2ZXIgTlVMTCEgIFRoaXMgcnVsZQorICAgICAqIHNhdmVzIHJlcGVhdGVkIHJ1bnRpbWUgbnVsbC10ZXN0cyBpbiB0aGUgd29ya2hvcnNlIGdldGl0ZW0gYW5kCisgICAgICogc2V0aXRlbSBjYWxscy4KKyAgICAgKi8KKyAgICBQeURpY3RFbnRyeSAqbWFfdGFibGU7CisgICAgUHlEaWN0RW50cnkgKigqbWFfbG9va3VwKShQeURpY3RPYmplY3QgKm1wLCBQeU9iamVjdCAqa2V5LCBsb25nIGhhc2gpOworICAgIFB5RGljdEVudHJ5IG1hX3NtYWxsdGFibGVbUHlEaWN0X01JTlNJWkVdOwogfTsKIAogUHlBUElfREFUQShQeVR5cGVPYmplY3QpIFB5RGljdF9UeXBlOwpAQCAtMTAwLDkgKzEwMCw5IEBACiBQeUFQSV9GVU5DKGludCkgUHlEaWN0X0RlbEl0ZW0oUHlPYmplY3QgKm1wLCBQeU9iamVjdCAqa2V5KTsKIFB5QVBJX0ZVTkModm9pZCkgUHlEaWN0X0NsZWFyKFB5T2JqZWN0ICptcCk7CiBQeUFQSV9GVU5DKGludCkgUHlEaWN0X05leHQoCi0JUHlPYmplY3QgKm1wLCBQeV9zc2l6ZV90ICpwb3MsIFB5T2JqZWN0ICoqa2V5LCBQeU9iamVjdCAqKnZhbHVlKTsKKyAgICBQeU9iamVjdCAqbXAsIFB5X3NzaXplX3QgKnBvcywgUHlPYmplY3QgKiprZXksIFB5T2JqZWN0ICoqdmFsdWUpOwogUHlBUElfRlVOQyhpbnQpIF9QeURpY3RfTmV4dCgKLQlQeU9iamVjdCAqbXAsIFB5X3NzaXplX3QgKnBvcywgUHlPYmplY3QgKiprZXksIFB5T2JqZWN0ICoqdmFsdWUsIGxvbmcgKmhhc2gpOworICAgIFB5T2JqZWN0ICptcCwgUHlfc3NpemVfdCAqcG9zLCBQeU9iamVjdCAqKmtleSwgUHlPYmplY3QgKip2YWx1ZSwgbG9uZyAqaGFzaCk7CiBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5RGljdF9LZXlzKFB5T2JqZWN0ICptcCk7CiBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5RGljdF9WYWx1ZXMoUHlPYmplY3QgKm1wKTsKIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlEaWN0X0l0ZW1zKFB5T2JqZWN0ICptcCk7CkBAIC0xMjEsOCArMTIxLDggQEAKICAgIGRpY3QudXBkYXRlKG90aGVyKSBpcyBlcXVpdmFsZW50IHRvIFB5RGljdF9NZXJnZShkaWN0LCBvdGhlciwgMSkuCiAqLwogUHlBUElfRlVOQyhpbnQpIFB5RGljdF9NZXJnZShQeU9iamVjdCAqbXAsCi0JCQkJICAgUHlPYmplY3QgKm90aGVyLAotCQkJCSAgIGludCBvdmVycmlkZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpvdGhlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG92ZXJyaWRlKTsKIAogLyogUHlEaWN0X01lcmdlRnJvbVNlcTIgdXBkYXRlcy9tZXJnZXMgZnJvbSBhbiBpdGVyYWJsZSBvYmplY3QgcHJvZHVjaW5nCiAgICBpdGVyYWJsZSBvYmplY3RzIG9mIGxlbmd0aCAyLiAgSWYgb3ZlcnJpZGUgaXMgdHJ1ZSwgdGhlIGxhc3Qgb2NjdXJyZW5jZQpAQCAtMTMwLDggKzEzMCw4IEBACiAgICBpcyBlcXVpdmFsZW50IHRvIGRpY3Q9e307IFB5RGljdF9NZXJnZUZyb21TZXEoZGljdCwgc2VxMiwgMSkuCiAqLwogUHlBUElfRlVOQyhpbnQpIFB5RGljdF9NZXJnZUZyb21TZXEyKFB5T2JqZWN0ICpkLAotCQkJCQkgICBQeU9iamVjdCAqc2VxMiwKLQkJCQkJICAgaW50IG92ZXJyaWRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqc2VxMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3ZlcnJpZGUpOwogCiBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5RGljdF9HZXRJdGVtU3RyaW5nKFB5T2JqZWN0ICpkcCwgY29uc3QgY2hhciAqa2V5KTsKIFB5QVBJX0ZVTkMoaW50KSBQeURpY3RfU2V0SXRlbVN0cmluZyhQeU9iamVjdCAqZHAsIGNvbnN0IGNoYXIgKmtleSwgUHlPYmplY3QgKml0ZW0pOwpkaWZmIC0tZ2l0IGEvSW5jbHVkZS9maWxlb2JqZWN0LmggYi9JbmNsdWRlL2ZpbGVvYmplY3QuaAppbmRleCA5NmMxZTU3Li5jMjMzNGIyIDEwMDY0NAotLS0gYS9JbmNsdWRlL2ZpbGVvYmplY3QuaAorKysgYi9JbmNsdWRlL2ZpbGVvYmplY3QuaApAQCAtOCwyOCArOCwyOCBAQAogI2VuZGlmCiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JRklMRSAqZl9mcDsKLQlQeU9iamVjdCAqZl9uYW1lOwotCVB5T2JqZWN0ICpmX21vZGU7Ci0JaW50ICgqZl9jbG9zZSkoRklMRSAqKTsKLQlpbnQgZl9zb2Z0c3BhY2U7CS8qIEZsYWcgdXNlZCBieSAncHJpbnQnIGNvbW1hbmQgKi8KLQlpbnQgZl9iaW5hcnk7CQkvKiBGbGFnIHdoaWNoIGluZGljYXRlcyB3aGV0aGVyIHRoZSBmaWxlIGlzIAotCQkJCSAgIG9wZW4gaW4gYmluYXJ5ICgxKSBvciB0ZXh0ICgwKSBtb2RlICovCi0JY2hhciogZl9idWY7CQkvKiBBbGxvY2F0ZWQgcmVhZGFoZWFkIGJ1ZmZlciAqLwotCWNoYXIqIGZfYnVmZW5kOwkJLyogUG9pbnRzIGFmdGVyIGxhc3Qgb2NjdXBpZWQgcG9zaXRpb24gKi8KLQljaGFyKiBmX2J1ZnB0cjsJCS8qIEN1cnJlbnQgYnVmZmVyIHBvc2l0aW9uICovCi0JY2hhciAqZl9zZXRidWY7CQkvKiBCdWZmZXIgZm9yIHNldGJ1ZigzKSBhbmQgc2V0dmJ1ZigzKSAqLwotCWludCBmX3VuaXZfbmV3bGluZTsJLyogSGFuZGxlIGFueSBuZXdsaW5lIGNvbnZlbnRpb24gKi8KLQlpbnQgZl9uZXdsaW5ldHlwZXM7CS8qIFR5cGVzIG9mIG5ld2xpbmVzIHNlZW4gKi8KLQlpbnQgZl9za2lwbmV4dGxmOwkvKiBTa2lwIG5leHQgXG4gKi8KLQlQeU9iamVjdCAqZl9lbmNvZGluZzsKLQlQeU9iamVjdCAqZl9lcnJvcnM7Ci0JUHlPYmplY3QgKndlYWtyZWZsaXN0OyAvKiBMaXN0IG9mIHdlYWsgcmVmZXJlbmNlcyAqLwotCWludCB1bmxvY2tlZF9jb3VudDsJLyogTnVtLiBjdXJyZW50bHkgcnVubmluZyBzZWN0aW9ucyBvZiBjb2RlCi0JCQkJICAgdXNpbmcgZl9mcCB3aXRoIHRoZSBHSUwgcmVsZWFzZWQuICovCi0JaW50IHJlYWRhYmxlOwotCWludCB3cml0YWJsZTsKKyAgICBQeU9iamVjdF9IRUFECisgICAgRklMRSAqZl9mcDsKKyAgICBQeU9iamVjdCAqZl9uYW1lOworICAgIFB5T2JqZWN0ICpmX21vZGU7CisgICAgaW50ICgqZl9jbG9zZSkoRklMRSAqKTsKKyAgICBpbnQgZl9zb2Z0c3BhY2U7ICAgICAgICAgICAgLyogRmxhZyB1c2VkIGJ5ICdwcmludCcgY29tbWFuZCAqLworICAgIGludCBmX2JpbmFyeTsgICAgICAgICAgICAgICAvKiBGbGFnIHdoaWNoIGluZGljYXRlcyB3aGV0aGVyIHRoZSBmaWxlIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlbiBpbiBiaW5hcnkgKDEpIG9yIHRleHQgKDApIG1vZGUgKi8KKyAgICBjaGFyKiBmX2J1ZjsgICAgICAgICAgICAgICAgLyogQWxsb2NhdGVkIHJlYWRhaGVhZCBidWZmZXIgKi8KKyAgICBjaGFyKiBmX2J1ZmVuZDsgICAgICAgICAgICAgLyogUG9pbnRzIGFmdGVyIGxhc3Qgb2NjdXBpZWQgcG9zaXRpb24gKi8KKyAgICBjaGFyKiBmX2J1ZnB0cjsgICAgICAgICAgICAgLyogQ3VycmVudCBidWZmZXIgcG9zaXRpb24gKi8KKyAgICBjaGFyICpmX3NldGJ1ZjsgICAgICAgICAgICAgLyogQnVmZmVyIGZvciBzZXRidWYoMykgYW5kIHNldHZidWYoMykgKi8KKyAgICBpbnQgZl91bml2X25ld2xpbmU7ICAgICAgICAgLyogSGFuZGxlIGFueSBuZXdsaW5lIGNvbnZlbnRpb24gKi8KKyAgICBpbnQgZl9uZXdsaW5ldHlwZXM7ICAgICAgICAgLyogVHlwZXMgb2YgbmV3bGluZXMgc2VlbiAqLworICAgIGludCBmX3NraXBuZXh0bGY7ICAgICAgICAgICAvKiBTa2lwIG5leHQgXG4gKi8KKyAgICBQeU9iamVjdCAqZl9lbmNvZGluZzsKKyAgICBQeU9iamVjdCAqZl9lcnJvcnM7CisgICAgUHlPYmplY3QgKndlYWtyZWZsaXN0OyAvKiBMaXN0IG9mIHdlYWsgcmVmZXJlbmNlcyAqLworICAgIGludCB1bmxvY2tlZF9jb3VudDsgICAgICAgICAvKiBOdW0uIGN1cnJlbnRseSBydW5uaW5nIHNlY3Rpb25zIG9mIGNvZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2luZyBmX2ZwIHdpdGggdGhlIEdJTCByZWxlYXNlZC4gKi8KKyAgICBpbnQgcmVhZGFibGU7CisgICAgaW50IHdyaXRhYmxlOwogfSBQeUZpbGVPYmplY3Q7CiAKIFB5QVBJX0RBVEEoUHlUeXBlT2JqZWN0KSBQeUZpbGVfVHlwZTsKZGlmZiAtLWdpdCBhL0luY2x1ZGUvb2JqZWN0LmggYi9JbmNsdWRlL29iamVjdC5oCmluZGV4IGIwMjY4OWMuLjFiYjRkNzggMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvb2JqZWN0LmgKKysrIGIvSW5jbHVkZS9vYmplY3QuaApAQCAtNjMsOSArNjMsOSBAQAogCiAjaWZkZWYgUHlfVFJBQ0VfUkVGUwogLyogRGVmaW5lIHBvaW50ZXJzIHRvIHN1cHBvcnQgYSBkb3VibHktbGlua2VkIGxpc3Qgb2YgYWxsIGxpdmUgaGVhcCBvYmplY3RzLiAqLwotI2RlZmluZSBfUHlPYmplY3RfSEVBRF9FWFRSQQkJXAotCXN0cnVjdCBfb2JqZWN0ICpfb2JfbmV4dDsJXAotCXN0cnVjdCBfb2JqZWN0ICpfb2JfcHJldjsKKyNkZWZpbmUgX1B5T2JqZWN0X0hFQURfRVhUUkEgICAgICAgICAgICBcCisgICAgc3RydWN0IF9vYmplY3QgKl9vYl9uZXh0OyAgICAgICAgICAgXAorICAgIHN0cnVjdCBfb2JqZWN0ICpfb2JfcHJldjsKIAogI2RlZmluZSBfUHlPYmplY3RfRVhUUkFfSU5JVCAwLCAwLAogCkBAIC03NSwxNyArNzUsMTcgQEAKICNlbmRpZgogCiAvKiBQeU9iamVjdF9IRUFEIGRlZmluZXMgdGhlIGluaXRpYWwgc2VnbWVudCBvZiBldmVyeSBQeU9iamVjdC4gKi8KLSNkZWZpbmUgUHlPYmplY3RfSEVBRAkJCVwKLQlfUHlPYmplY3RfSEVBRF9FWFRSQQkJXAotCVB5X3NzaXplX3Qgb2JfcmVmY250OwkJXAotCXN0cnVjdCBfdHlwZW9iamVjdCAqb2JfdHlwZTsKKyNkZWZpbmUgUHlPYmplY3RfSEVBRCAgICAgICAgICAgICAgICAgICBcCisgICAgX1B5T2JqZWN0X0hFQURfRVhUUkEgICAgICAgICAgICAgICAgXAorICAgIFB5X3NzaXplX3Qgb2JfcmVmY250OyAgICAgICAgICAgICAgIFwKKyAgICBzdHJ1Y3QgX3R5cGVvYmplY3QgKm9iX3R5cGU7CiAKLSNkZWZpbmUgUHlPYmplY3RfSEVBRF9JTklUKHR5cGUpCVwKLQlfUHlPYmplY3RfRVhUUkFfSU5JVAkJXAotCTEsIHR5cGUsCisjZGVmaW5lIFB5T2JqZWN0X0hFQURfSU5JVCh0eXBlKSAgICAgICAgXAorICAgIF9QeU9iamVjdF9FWFRSQV9JTklUICAgICAgICAgICAgICAgIFwKKyAgICAxLCB0eXBlLAogCi0jZGVmaW5lIFB5VmFyT2JqZWN0X0hFQURfSU5JVCh0eXBlLCBzaXplKQlcCi0JUHlPYmplY3RfSEVBRF9JTklUKHR5cGUpIHNpemUsCisjZGVmaW5lIFB5VmFyT2JqZWN0X0hFQURfSU5JVCh0eXBlLCBzaXplKSAgICAgICBcCisgICAgUHlPYmplY3RfSEVBRF9JTklUKHR5cGUpIHNpemUsCiAKIC8qIFB5T2JqZWN0X1ZBUl9IRUFEIGRlZmluZXMgdGhlIGluaXRpYWwgc2VnbWVudCBvZiBhbGwgdmFyaWFibGUtc2l6ZQogICogY29udGFpbmVyIG9iamVjdHMuICBUaGVzZSBlbmQgd2l0aCBhIGRlY2xhcmF0aW9uIG9mIGFuIGFycmF5IHdpdGggMQpAQCAtOTMsOSArOTMsOSBAQAogICogaGFzIHJvb20gZm9yIG9iX3NpemUgZWxlbWVudHMuICBOb3RlIHRoYXQgb2Jfc2l6ZSBpcyBhbiBlbGVtZW50IGNvdW50LAogICogbm90IG5lY2Vzc2FyaWx5IGEgYnl0ZSBjb3VudC4KICAqLwotI2RlZmluZSBQeU9iamVjdF9WQVJfSEVBRAkJXAotCVB5T2JqZWN0X0hFQUQJCQlcCi0JUHlfc3NpemVfdCBvYl9zaXplOyAvKiBOdW1iZXIgb2YgaXRlbXMgaW4gdmFyaWFibGUgcGFydCAqLworI2RlZmluZSBQeU9iamVjdF9WQVJfSEVBRCAgICAgICAgICAgICAgIFwKKyAgICBQeU9iamVjdF9IRUFEICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgUHlfc3NpemVfdCBvYl9zaXplOyAvKiBOdW1iZXIgb2YgaXRlbXMgaW4gdmFyaWFibGUgcGFydCAqLwogI2RlZmluZSBQeV9JTlZBTElEX1NJWkUgKFB5X3NzaXplX3QpLTEKIAogLyogTm90aGluZyBpcyBhY3R1YWxseSBkZWNsYXJlZCB0byBiZSBhIFB5T2JqZWN0LCBidXQgZXZlcnkgcG9pbnRlciB0bwpAQCAtMTA0LDE2ICsxMDQsMTYgQEAKICAqIGluIGFkZGl0aW9uLCBiZSBjYXN0IHRvIFB5VmFyT2JqZWN0Ki4KICAqLwogdHlwZWRlZiBzdHJ1Y3QgX29iamVjdCB7Ci0JUHlPYmplY3RfSEVBRAorICAgIFB5T2JqZWN0X0hFQUQKIH0gUHlPYmplY3Q7CiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9WQVJfSEVBRAorICAgIFB5T2JqZWN0X1ZBUl9IRUFECiB9IFB5VmFyT2JqZWN0OwogCi0jZGVmaW5lIFB5X1JFRkNOVChvYikJCSgoKFB5T2JqZWN0Kikob2IpKS0+b2JfcmVmY250KQotI2RlZmluZSBQeV9UWVBFKG9iKQkJKCgoUHlPYmplY3QqKShvYikpLT5vYl90eXBlKQotI2RlZmluZSBQeV9TSVpFKG9iKQkJKCgoUHlWYXJPYmplY3QqKShvYikpLT5vYl9zaXplKQorI2RlZmluZSBQeV9SRUZDTlQob2IpICAgICAgICAgICAoKChQeU9iamVjdCopKG9iKSktPm9iX3JlZmNudCkKKyNkZWZpbmUgUHlfVFlQRShvYikgICAgICAgICAgICAgKCgoUHlPYmplY3QqKShvYikpLT5vYl90eXBlKQorI2RlZmluZSBQeV9TSVpFKG9iKSAgICAgICAgICAgICAoKChQeVZhck9iamVjdCopKG9iKSktPm9iX3NpemUpCiAKIC8qCiBUeXBlIG9iamVjdHMgY29udGFpbiBhIHN0cmluZyBjb250YWluaW5nIHRoZSB0eXBlIG5hbWUgKHRvIGhlbHAgc29tZXdoYXQKQEAgLTE2MiwyNCArMTYyLDI0IEBACiAvKiBQeTNrIGJ1ZmZlciBpbnRlcmZhY2UgKi8KIAogdHlwZWRlZiBzdHJ1Y3QgYnVmZmVyaW5mbyB7Ci0Jdm9pZCAqYnVmOwotCVB5T2JqZWN0ICpvYmo7ICAgICAgICAvKiBib3Jyb3dlZCByZWZlcmVuY2UgKi8KLSAgICAgICAgUHlfc3NpemVfdCBsZW47Ci0gICAgICAgIFB5X3NzaXplX3QgaXRlbXNpemU7ICAvKiBUaGlzIGlzIFB5X3NzaXplX3Qgc28gaXQgY2FuIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVkIHRvIGJ5IHN0cmlkZXMgaW4gc2ltcGxlIGNhc2UuKi8KLSAgICAgICAgaW50IHJlYWRvbmx5OwotICAgICAgICBpbnQgbmRpbTsKLSAgICAgICAgY2hhciAqZm9ybWF0OwotICAgICAgICBQeV9zc2l6ZV90ICpzaGFwZTsKLSAgICAgICAgUHlfc3NpemVfdCAqc3RyaWRlczsKLSAgICAgICAgUHlfc3NpemVfdCAqc3Vib2Zmc2V0czsKLSAgICAgICAgdm9pZCAqaW50ZXJuYWw7CisgICAgdm9pZCAqYnVmOworICAgIFB5T2JqZWN0ICpvYmo7ICAgICAgICAvKiBib3Jyb3dlZCByZWZlcmVuY2UgKi8KKyAgICBQeV9zc2l6ZV90IGxlbjsKKyAgICBQeV9zc2l6ZV90IGl0ZW1zaXplOyAgLyogVGhpcyBpcyBQeV9zc2l6ZV90IHNvIGl0IGNhbiBiZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVkIHRvIGJ5IHN0cmlkZXMgaW4gc2ltcGxlIGNhc2UuKi8KKyAgICBpbnQgcmVhZG9ubHk7CisgICAgaW50IG5kaW07CisgICAgY2hhciAqZm9ybWF0OworICAgIFB5X3NzaXplX3QgKnNoYXBlOworICAgIFB5X3NzaXplX3QgKnN0cmlkZXM7CisgICAgUHlfc3NpemVfdCAqc3Vib2Zmc2V0czsKKyAgICB2b2lkICppbnRlcm5hbDsKIH0gUHlfYnVmZmVyOwogCiB0eXBlZGVmIGludCAoKmdldGJ1ZmZlcnByb2MpKFB5T2JqZWN0ICosIFB5X2J1ZmZlciAqLCBpbnQpOwogdHlwZWRlZiB2b2lkICgqcmVsZWFzZWJ1ZmZlcnByb2MpKFB5T2JqZWN0ICosIFB5X2J1ZmZlciAqKTsKIAotICAgICAgICAvKiBGbGFncyBmb3IgZ2V0dGluZyBidWZmZXJzICovCisgICAgLyogRmxhZ3MgZm9yIGdldHRpbmcgYnVmZmVycyAqLwogI2RlZmluZSBQeUJVRl9TSU1QTEUgMAogI2RlZmluZSBQeUJVRl9XUklUQUJMRSAweDAwMDEKIC8qICB3ZSB1c2VkIHRvIGluY2x1ZGUgYW4gRSwgYmFja3dhcmRzIGNvbXBhdGlibGUgYWxpYXMgICovCkBAIC0yMTUsODggKzIxNSw4OCBAQAogdHlwZWRlZiBpbnQgKCp0cmF2ZXJzZXByb2MpKFB5T2JqZWN0ICosIHZpc2l0cHJvYywgdm9pZCAqKTsKIAogdHlwZWRlZiBzdHJ1Y3QgewotCS8qIEZvciBudW1iZXJzIHdpdGhvdXQgZmxhZyBiaXQgUHlfVFBGTEFHU19DSEVDS1RZUEVTIHNldCwgYWxsCi0JICAgYXJndW1lbnRzIGFyZSBndWFyYW50ZWVkIHRvIGJlIG9mIHRoZSBvYmplY3QncyB0eXBlIChtb2R1bG8KLQkgICBjb2VyY2lvbiBoYWNrcyAtLSBpLmUuIGlmIHRoZSB0eXBlJ3MgY29lcmNpb24gZnVuY3Rpb24KLQkgICByZXR1cm5zIG90aGVyIHR5cGVzLCB0aGVuIHRoZXNlIGFyZSBhbGxvd2VkIGFzIHdlbGwpLiAgTnVtYmVycyB0aGF0Ci0JICAgaGF2ZSB0aGUgUHlfVFBGTEFHU19DSEVDS1RZUEVTIGZsYWcgYml0IHNldCBzaG91bGQgY2hlY2sgKmJvdGgqCi0JICAgYXJndW1lbnRzIGZvciBwcm9wZXIgdHlwZSBhbmQgaW1wbGVtZW50IHRoZSBuZWNlc3NhcnkgY29udmVyc2lvbnMKLQkgICBpbiB0aGUgc2xvdCBmdW5jdGlvbnMgdGhlbXNlbHZlcy4gKi8KKyAgICAvKiBGb3IgbnVtYmVycyB3aXRob3V0IGZsYWcgYml0IFB5X1RQRkxBR1NfQ0hFQ0tUWVBFUyBzZXQsIGFsbAorICAgICAgIGFyZ3VtZW50cyBhcmUgZ3VhcmFudGVlZCB0byBiZSBvZiB0aGUgb2JqZWN0J3MgdHlwZSAobW9kdWxvCisgICAgICAgY29lcmNpb24gaGFja3MgLS0gaS5lLiBpZiB0aGUgdHlwZSdzIGNvZXJjaW9uIGZ1bmN0aW9uCisgICAgICAgcmV0dXJucyBvdGhlciB0eXBlcywgdGhlbiB0aGVzZSBhcmUgYWxsb3dlZCBhcyB3ZWxsKS4gIE51bWJlcnMgdGhhdAorICAgICAgIGhhdmUgdGhlIFB5X1RQRkxBR1NfQ0hFQ0tUWVBFUyBmbGFnIGJpdCBzZXQgc2hvdWxkIGNoZWNrICpib3RoKgorICAgICAgIGFyZ3VtZW50cyBmb3IgcHJvcGVyIHR5cGUgYW5kIGltcGxlbWVudCB0aGUgbmVjZXNzYXJ5IGNvbnZlcnNpb25zCisgICAgICAgaW4gdGhlIHNsb3QgZnVuY3Rpb25zIHRoZW1zZWx2ZXMuICovCiAKLQliaW5hcnlmdW5jIG5iX2FkZDsKLQliaW5hcnlmdW5jIG5iX3N1YnRyYWN0OwotCWJpbmFyeWZ1bmMgbmJfbXVsdGlwbHk7Ci0JYmluYXJ5ZnVuYyBuYl9kaXZpZGU7Ci0JYmluYXJ5ZnVuYyBuYl9yZW1haW5kZXI7Ci0JYmluYXJ5ZnVuYyBuYl9kaXZtb2Q7Ci0JdGVybmFyeWZ1bmMgbmJfcG93ZXI7Ci0JdW5hcnlmdW5jIG5iX25lZ2F0aXZlOwotCXVuYXJ5ZnVuYyBuYl9wb3NpdGl2ZTsKLQl1bmFyeWZ1bmMgbmJfYWJzb2x1dGU7Ci0JaW5xdWlyeSBuYl9ub256ZXJvOwotCXVuYXJ5ZnVuYyBuYl9pbnZlcnQ7Ci0JYmluYXJ5ZnVuYyBuYl9sc2hpZnQ7Ci0JYmluYXJ5ZnVuYyBuYl9yc2hpZnQ7Ci0JYmluYXJ5ZnVuYyBuYl9hbmQ7Ci0JYmluYXJ5ZnVuYyBuYl94b3I7Ci0JYmluYXJ5ZnVuYyBuYl9vcjsKLQljb2VyY2lvbiBuYl9jb2VyY2U7Ci0JdW5hcnlmdW5jIG5iX2ludDsKLQl1bmFyeWZ1bmMgbmJfbG9uZzsKLQl1bmFyeWZ1bmMgbmJfZmxvYXQ7Ci0JdW5hcnlmdW5jIG5iX29jdDsKLQl1bmFyeWZ1bmMgbmJfaGV4OwotCS8qIEFkZGVkIGluIHJlbGVhc2UgMi4wICovCi0JYmluYXJ5ZnVuYyBuYl9pbnBsYWNlX2FkZDsKLQliaW5hcnlmdW5jIG5iX2lucGxhY2Vfc3VidHJhY3Q7Ci0JYmluYXJ5ZnVuYyBuYl9pbnBsYWNlX211bHRpcGx5OwotCWJpbmFyeWZ1bmMgbmJfaW5wbGFjZV9kaXZpZGU7Ci0JYmluYXJ5ZnVuYyBuYl9pbnBsYWNlX3JlbWFpbmRlcjsKLQl0ZXJuYXJ5ZnVuYyBuYl9pbnBsYWNlX3Bvd2VyOwotCWJpbmFyeWZ1bmMgbmJfaW5wbGFjZV9sc2hpZnQ7Ci0JYmluYXJ5ZnVuYyBuYl9pbnBsYWNlX3JzaGlmdDsKLQliaW5hcnlmdW5jIG5iX2lucGxhY2VfYW5kOwotCWJpbmFyeWZ1bmMgbmJfaW5wbGFjZV94b3I7Ci0JYmluYXJ5ZnVuYyBuYl9pbnBsYWNlX29yOworICAgIGJpbmFyeWZ1bmMgbmJfYWRkOworICAgIGJpbmFyeWZ1bmMgbmJfc3VidHJhY3Q7CisgICAgYmluYXJ5ZnVuYyBuYl9tdWx0aXBseTsKKyAgICBiaW5hcnlmdW5jIG5iX2RpdmlkZTsKKyAgICBiaW5hcnlmdW5jIG5iX3JlbWFpbmRlcjsKKyAgICBiaW5hcnlmdW5jIG5iX2Rpdm1vZDsKKyAgICB0ZXJuYXJ5ZnVuYyBuYl9wb3dlcjsKKyAgICB1bmFyeWZ1bmMgbmJfbmVnYXRpdmU7CisgICAgdW5hcnlmdW5jIG5iX3Bvc2l0aXZlOworICAgIHVuYXJ5ZnVuYyBuYl9hYnNvbHV0ZTsKKyAgICBpbnF1aXJ5IG5iX25vbnplcm87CisgICAgdW5hcnlmdW5jIG5iX2ludmVydDsKKyAgICBiaW5hcnlmdW5jIG5iX2xzaGlmdDsKKyAgICBiaW5hcnlmdW5jIG5iX3JzaGlmdDsKKyAgICBiaW5hcnlmdW5jIG5iX2FuZDsKKyAgICBiaW5hcnlmdW5jIG5iX3hvcjsKKyAgICBiaW5hcnlmdW5jIG5iX29yOworICAgIGNvZXJjaW9uIG5iX2NvZXJjZTsKKyAgICB1bmFyeWZ1bmMgbmJfaW50OworICAgIHVuYXJ5ZnVuYyBuYl9sb25nOworICAgIHVuYXJ5ZnVuYyBuYl9mbG9hdDsKKyAgICB1bmFyeWZ1bmMgbmJfb2N0OworICAgIHVuYXJ5ZnVuYyBuYl9oZXg7CisgICAgLyogQWRkZWQgaW4gcmVsZWFzZSAyLjAgKi8KKyAgICBiaW5hcnlmdW5jIG5iX2lucGxhY2VfYWRkOworICAgIGJpbmFyeWZ1bmMgbmJfaW5wbGFjZV9zdWJ0cmFjdDsKKyAgICBiaW5hcnlmdW5jIG5iX2lucGxhY2VfbXVsdGlwbHk7CisgICAgYmluYXJ5ZnVuYyBuYl9pbnBsYWNlX2RpdmlkZTsKKyAgICBiaW5hcnlmdW5jIG5iX2lucGxhY2VfcmVtYWluZGVyOworICAgIHRlcm5hcnlmdW5jIG5iX2lucGxhY2VfcG93ZXI7CisgICAgYmluYXJ5ZnVuYyBuYl9pbnBsYWNlX2xzaGlmdDsKKyAgICBiaW5hcnlmdW5jIG5iX2lucGxhY2VfcnNoaWZ0OworICAgIGJpbmFyeWZ1bmMgbmJfaW5wbGFjZV9hbmQ7CisgICAgYmluYXJ5ZnVuYyBuYl9pbnBsYWNlX3hvcjsKKyAgICBiaW5hcnlmdW5jIG5iX2lucGxhY2Vfb3I7CiAKLQkvKiBBZGRlZCBpbiByZWxlYXNlIDIuMiAqLwotCS8qIFRoZSBmb2xsb3dpbmcgcmVxdWlyZSB0aGUgUHlfVFBGTEFHU19IQVZFX0NMQVNTIGZsYWcgKi8KLQliaW5hcnlmdW5jIG5iX2Zsb29yX2RpdmlkZTsKLQliaW5hcnlmdW5jIG5iX3RydWVfZGl2aWRlOwotCWJpbmFyeWZ1bmMgbmJfaW5wbGFjZV9mbG9vcl9kaXZpZGU7Ci0JYmluYXJ5ZnVuYyBuYl9pbnBsYWNlX3RydWVfZGl2aWRlOworICAgIC8qIEFkZGVkIGluIHJlbGVhc2UgMi4yICovCisgICAgLyogVGhlIGZvbGxvd2luZyByZXF1aXJlIHRoZSBQeV9UUEZMQUdTX0hBVkVfQ0xBU1MgZmxhZyAqLworICAgIGJpbmFyeWZ1bmMgbmJfZmxvb3JfZGl2aWRlOworICAgIGJpbmFyeWZ1bmMgbmJfdHJ1ZV9kaXZpZGU7CisgICAgYmluYXJ5ZnVuYyBuYl9pbnBsYWNlX2Zsb29yX2RpdmlkZTsKKyAgICBiaW5hcnlmdW5jIG5iX2lucGxhY2VfdHJ1ZV9kaXZpZGU7CiAKLQkvKiBBZGRlZCBpbiByZWxlYXNlIDIuNSAqLwotCXVuYXJ5ZnVuYyBuYl9pbmRleDsKKyAgICAvKiBBZGRlZCBpbiByZWxlYXNlIDIuNSAqLworICAgIHVuYXJ5ZnVuYyBuYl9pbmRleDsKIH0gUHlOdW1iZXJNZXRob2RzOwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JbGVuZnVuYyBzcV9sZW5ndGg7Ci0JYmluYXJ5ZnVuYyBzcV9jb25jYXQ7Ci0Jc3NpemVhcmdmdW5jIHNxX3JlcGVhdDsKLQlzc2l6ZWFyZ2Z1bmMgc3FfaXRlbTsKLQlzc2l6ZXNzaXplYXJnZnVuYyBzcV9zbGljZTsKLQlzc2l6ZW9iamFyZ3Byb2Mgc3FfYXNzX2l0ZW07Ci0Jc3NpemVzc2l6ZW9iamFyZ3Byb2Mgc3FfYXNzX3NsaWNlOwotCW9iam9ianByb2Mgc3FfY29udGFpbnM7Ci0JLyogQWRkZWQgaW4gcmVsZWFzZSAyLjAgKi8KLQliaW5hcnlmdW5jIHNxX2lucGxhY2VfY29uY2F0OwotCXNzaXplYXJnZnVuYyBzcV9pbnBsYWNlX3JlcGVhdDsKKyAgICBsZW5mdW5jIHNxX2xlbmd0aDsKKyAgICBiaW5hcnlmdW5jIHNxX2NvbmNhdDsKKyAgICBzc2l6ZWFyZ2Z1bmMgc3FfcmVwZWF0OworICAgIHNzaXplYXJnZnVuYyBzcV9pdGVtOworICAgIHNzaXplc3NpemVhcmdmdW5jIHNxX3NsaWNlOworICAgIHNzaXplb2JqYXJncHJvYyBzcV9hc3NfaXRlbTsKKyAgICBzc2l6ZXNzaXplb2JqYXJncHJvYyBzcV9hc3Nfc2xpY2U7CisgICAgb2Jqb2JqcHJvYyBzcV9jb250YWluczsKKyAgICAvKiBBZGRlZCBpbiByZWxlYXNlIDIuMCAqLworICAgIGJpbmFyeWZ1bmMgc3FfaW5wbGFjZV9jb25jYXQ7CisgICAgc3NpemVhcmdmdW5jIHNxX2lucGxhY2VfcmVwZWF0OwogfSBQeVNlcXVlbmNlTWV0aG9kczsKIAogdHlwZWRlZiBzdHJ1Y3QgewotCWxlbmZ1bmMgbXBfbGVuZ3RoOwotCWJpbmFyeWZ1bmMgbXBfc3Vic2NyaXB0OwotCW9iam9iamFyZ3Byb2MgbXBfYXNzX3N1YnNjcmlwdDsKKyAgICBsZW5mdW5jIG1wX2xlbmd0aDsKKyAgICBiaW5hcnlmdW5jIG1wX3N1YnNjcmlwdDsKKyAgICBvYmpvYmphcmdwcm9jIG1wX2Fzc19zdWJzY3JpcHQ7CiB9IFB5TWFwcGluZ01ldGhvZHM7CiAKIHR5cGVkZWYgc3RydWN0IHsKLQlyZWFkYnVmZmVycHJvYyBiZl9nZXRyZWFkYnVmZmVyOwotCXdyaXRlYnVmZmVycHJvYyBiZl9nZXR3cml0ZWJ1ZmZlcjsKLQlzZWdjb3VudHByb2MgYmZfZ2V0c2VnY291bnQ7Ci0JY2hhcmJ1ZmZlcnByb2MgYmZfZ2V0Y2hhcmJ1ZmZlcjsKLSAgICAgICAgZ2V0YnVmZmVycHJvYyBiZl9nZXRidWZmZXI7Ci0JcmVsZWFzZWJ1ZmZlcnByb2MgYmZfcmVsZWFzZWJ1ZmZlcjsKKyAgICByZWFkYnVmZmVycHJvYyBiZl9nZXRyZWFkYnVmZmVyOworICAgIHdyaXRlYnVmZmVycHJvYyBiZl9nZXR3cml0ZWJ1ZmZlcjsKKyAgICBzZWdjb3VudHByb2MgYmZfZ2V0c2VnY291bnQ7CisgICAgY2hhcmJ1ZmZlcnByb2MgYmZfZ2V0Y2hhcmJ1ZmZlcjsKKyAgICBnZXRidWZmZXJwcm9jIGJmX2dldGJ1ZmZlcjsKKyAgICByZWxlYXNlYnVmZmVycHJvYyBiZl9yZWxlYXNlYnVmZmVyOwogfSBQeUJ1ZmZlclByb2NzOwogCiAKQEAgLTMyMCwxMTAgKzMyMCwxMTAgQEAKIHR5cGVkZWYgUHlPYmplY3QgKigqYWxsb2NmdW5jKShzdHJ1Y3QgX3R5cGVvYmplY3QgKiwgUHlfc3NpemVfdCk7CiAKIHR5cGVkZWYgc3RydWN0IF90eXBlb2JqZWN0IHsKLQlQeU9iamVjdF9WQVJfSEVBRAotCWNvbnN0IGNoYXIgKnRwX25hbWU7IC8qIEZvciBwcmludGluZywgaW4gZm9ybWF0ICI8bW9kdWxlPi48bmFtZT4iICovCi0JUHlfc3NpemVfdCB0cF9iYXNpY3NpemUsIHRwX2l0ZW1zaXplOyAvKiBGb3IgYWxsb2NhdGlvbiAqLworICAgIFB5T2JqZWN0X1ZBUl9IRUFECisgICAgY29uc3QgY2hhciAqdHBfbmFtZTsgLyogRm9yIHByaW50aW5nLCBpbiBmb3JtYXQgIjxtb2R1bGU+LjxuYW1lPiIgKi8KKyAgICBQeV9zc2l6ZV90IHRwX2Jhc2ljc2l6ZSwgdHBfaXRlbXNpemU7IC8qIEZvciBhbGxvY2F0aW9uICovCiAKLQkvKiBNZXRob2RzIHRvIGltcGxlbWVudCBzdGFuZGFyZCBvcGVyYXRpb25zICovCisgICAgLyogTWV0aG9kcyB0byBpbXBsZW1lbnQgc3RhbmRhcmQgb3BlcmF0aW9ucyAqLwogCi0JZGVzdHJ1Y3RvciB0cF9kZWFsbG9jOwotCXByaW50ZnVuYyB0cF9wcmludDsKLQlnZXRhdHRyZnVuYyB0cF9nZXRhdHRyOwotCXNldGF0dHJmdW5jIHRwX3NldGF0dHI7Ci0JY21wZnVuYyB0cF9jb21wYXJlOwotCXJlcHJmdW5jIHRwX3JlcHI7CisgICAgZGVzdHJ1Y3RvciB0cF9kZWFsbG9jOworICAgIHByaW50ZnVuYyB0cF9wcmludDsKKyAgICBnZXRhdHRyZnVuYyB0cF9nZXRhdHRyOworICAgIHNldGF0dHJmdW5jIHRwX3NldGF0dHI7CisgICAgY21wZnVuYyB0cF9jb21wYXJlOworICAgIHJlcHJmdW5jIHRwX3JlcHI7CiAKLQkvKiBNZXRob2Qgc3VpdGVzIGZvciBzdGFuZGFyZCBjbGFzc2VzICovCisgICAgLyogTWV0aG9kIHN1aXRlcyBmb3Igc3RhbmRhcmQgY2xhc3NlcyAqLwogCi0JUHlOdW1iZXJNZXRob2RzICp0cF9hc19udW1iZXI7Ci0JUHlTZXF1ZW5jZU1ldGhvZHMgKnRwX2FzX3NlcXVlbmNlOwotCVB5TWFwcGluZ01ldGhvZHMgKnRwX2FzX21hcHBpbmc7CisgICAgUHlOdW1iZXJNZXRob2RzICp0cF9hc19udW1iZXI7CisgICAgUHlTZXF1ZW5jZU1ldGhvZHMgKnRwX2FzX3NlcXVlbmNlOworICAgIFB5TWFwcGluZ01ldGhvZHMgKnRwX2FzX21hcHBpbmc7CiAKLQkvKiBNb3JlIHN0YW5kYXJkIG9wZXJhdGlvbnMgKGhlcmUgZm9yIGJpbmFyeSBjb21wYXRpYmlsaXR5KSAqLworICAgIC8qIE1vcmUgc3RhbmRhcmQgb3BlcmF0aW9ucyAoaGVyZSBmb3IgYmluYXJ5IGNvbXBhdGliaWxpdHkpICovCiAKLQloYXNoZnVuYyB0cF9oYXNoOwotCXRlcm5hcnlmdW5jIHRwX2NhbGw7Ci0JcmVwcmZ1bmMgdHBfc3RyOwotCWdldGF0dHJvZnVuYyB0cF9nZXRhdHRybzsKLQlzZXRhdHRyb2Z1bmMgdHBfc2V0YXR0cm87CisgICAgaGFzaGZ1bmMgdHBfaGFzaDsKKyAgICB0ZXJuYXJ5ZnVuYyB0cF9jYWxsOworICAgIHJlcHJmdW5jIHRwX3N0cjsKKyAgICBnZXRhdHRyb2Z1bmMgdHBfZ2V0YXR0cm87CisgICAgc2V0YXR0cm9mdW5jIHRwX3NldGF0dHJvOwogCi0JLyogRnVuY3Rpb25zIHRvIGFjY2VzcyBvYmplY3QgYXMgaW5wdXQvb3V0cHV0IGJ1ZmZlciAqLwotCVB5QnVmZmVyUHJvY3MgKnRwX2FzX2J1ZmZlcjsKKyAgICAvKiBGdW5jdGlvbnMgdG8gYWNjZXNzIG9iamVjdCBhcyBpbnB1dC9vdXRwdXQgYnVmZmVyICovCisgICAgUHlCdWZmZXJQcm9jcyAqdHBfYXNfYnVmZmVyOwogCi0JLyogRmxhZ3MgdG8gZGVmaW5lIHByZXNlbmNlIG9mIG9wdGlvbmFsL2V4cGFuZGVkIGZlYXR1cmVzICovCi0JbG9uZyB0cF9mbGFnczsKKyAgICAvKiBGbGFncyB0byBkZWZpbmUgcHJlc2VuY2Ugb2Ygb3B0aW9uYWwvZXhwYW5kZWQgZmVhdHVyZXMgKi8KKyAgICBsb25nIHRwX2ZsYWdzOwogCi0JY29uc3QgY2hhciAqdHBfZG9jOyAvKiBEb2N1bWVudGF0aW9uIHN0cmluZyAqLworICAgIGNvbnN0IGNoYXIgKnRwX2RvYzsgLyogRG9jdW1lbnRhdGlvbiBzdHJpbmcgKi8KIAotCS8qIEFzc2lnbmVkIG1lYW5pbmcgaW4gcmVsZWFzZSAyLjAgKi8KLQkvKiBjYWxsIGZ1bmN0aW9uIGZvciBhbGwgYWNjZXNzaWJsZSBvYmplY3RzICovCi0JdHJhdmVyc2Vwcm9jIHRwX3RyYXZlcnNlOworICAgIC8qIEFzc2lnbmVkIG1lYW5pbmcgaW4gcmVsZWFzZSAyLjAgKi8KKyAgICAvKiBjYWxsIGZ1bmN0aW9uIGZvciBhbGwgYWNjZXNzaWJsZSBvYmplY3RzICovCisgICAgdHJhdmVyc2Vwcm9jIHRwX3RyYXZlcnNlOwogCi0JLyogZGVsZXRlIHJlZmVyZW5jZXMgdG8gY29udGFpbmVkIG9iamVjdHMgKi8KLQlpbnF1aXJ5IHRwX2NsZWFyOworICAgIC8qIGRlbGV0ZSByZWZlcmVuY2VzIHRvIGNvbnRhaW5lZCBvYmplY3RzICovCisgICAgaW5xdWlyeSB0cF9jbGVhcjsKIAotCS8qIEFzc2lnbmVkIG1lYW5pbmcgaW4gcmVsZWFzZSAyLjEgKi8KLQkvKiByaWNoIGNvbXBhcmlzb25zICovCi0JcmljaGNtcGZ1bmMgdHBfcmljaGNvbXBhcmU7CisgICAgLyogQXNzaWduZWQgbWVhbmluZyBpbiByZWxlYXNlIDIuMSAqLworICAgIC8qIHJpY2ggY29tcGFyaXNvbnMgKi8KKyAgICByaWNoY21wZnVuYyB0cF9yaWNoY29tcGFyZTsKIAotCS8qIHdlYWsgcmVmZXJlbmNlIGVuYWJsZXIgKi8KLQlQeV9zc2l6ZV90IHRwX3dlYWtsaXN0b2Zmc2V0OworICAgIC8qIHdlYWsgcmVmZXJlbmNlIGVuYWJsZXIgKi8KKyAgICBQeV9zc2l6ZV90IHRwX3dlYWtsaXN0b2Zmc2V0OwogCi0JLyogQWRkZWQgaW4gcmVsZWFzZSAyLjIgKi8KLQkvKiBJdGVyYXRvcnMgKi8KLQlnZXRpdGVyZnVuYyB0cF9pdGVyOwotCWl0ZXJuZXh0ZnVuYyB0cF9pdGVybmV4dDsKKyAgICAvKiBBZGRlZCBpbiByZWxlYXNlIDIuMiAqLworICAgIC8qIEl0ZXJhdG9ycyAqLworICAgIGdldGl0ZXJmdW5jIHRwX2l0ZXI7CisgICAgaXRlcm5leHRmdW5jIHRwX2l0ZXJuZXh0OwogCi0JLyogQXR0cmlidXRlIGRlc2NyaXB0b3IgYW5kIHN1YmNsYXNzaW5nIHN0dWZmICovCi0Jc3RydWN0IFB5TWV0aG9kRGVmICp0cF9tZXRob2RzOwotCXN0cnVjdCBQeU1lbWJlckRlZiAqdHBfbWVtYmVyczsKLQlzdHJ1Y3QgUHlHZXRTZXREZWYgKnRwX2dldHNldDsKLQlzdHJ1Y3QgX3R5cGVvYmplY3QgKnRwX2Jhc2U7Ci0JUHlPYmplY3QgKnRwX2RpY3Q7Ci0JZGVzY3JnZXRmdW5jIHRwX2Rlc2NyX2dldDsKLQlkZXNjcnNldGZ1bmMgdHBfZGVzY3Jfc2V0OwotCVB5X3NzaXplX3QgdHBfZGljdG9mZnNldDsKLQlpbml0cHJvYyB0cF9pbml0OwotCWFsbG9jZnVuYyB0cF9hbGxvYzsKLQluZXdmdW5jIHRwX25ldzsKLQlmcmVlZnVuYyB0cF9mcmVlOyAvKiBMb3ctbGV2ZWwgZnJlZS1tZW1vcnkgcm91dGluZSAqLwotCWlucXVpcnkgdHBfaXNfZ2M7IC8qIEZvciBQeU9iamVjdF9JU19HQyAqLwotCVB5T2JqZWN0ICp0cF9iYXNlczsKLQlQeU9iamVjdCAqdHBfbXJvOyAvKiBtZXRob2QgcmVzb2x1dGlvbiBvcmRlciAqLwotCVB5T2JqZWN0ICp0cF9jYWNoZTsKLQlQeU9iamVjdCAqdHBfc3ViY2xhc3NlczsKLQlQeU9iamVjdCAqdHBfd2Vha2xpc3Q7Ci0JZGVzdHJ1Y3RvciB0cF9kZWw7CisgICAgLyogQXR0cmlidXRlIGRlc2NyaXB0b3IgYW5kIHN1YmNsYXNzaW5nIHN0dWZmICovCisgICAgc3RydWN0IFB5TWV0aG9kRGVmICp0cF9tZXRob2RzOworICAgIHN0cnVjdCBQeU1lbWJlckRlZiAqdHBfbWVtYmVyczsKKyAgICBzdHJ1Y3QgUHlHZXRTZXREZWYgKnRwX2dldHNldDsKKyAgICBzdHJ1Y3QgX3R5cGVvYmplY3QgKnRwX2Jhc2U7CisgICAgUHlPYmplY3QgKnRwX2RpY3Q7CisgICAgZGVzY3JnZXRmdW5jIHRwX2Rlc2NyX2dldDsKKyAgICBkZXNjcnNldGZ1bmMgdHBfZGVzY3Jfc2V0OworICAgIFB5X3NzaXplX3QgdHBfZGljdG9mZnNldDsKKyAgICBpbml0cHJvYyB0cF9pbml0OworICAgIGFsbG9jZnVuYyB0cF9hbGxvYzsKKyAgICBuZXdmdW5jIHRwX25ldzsKKyAgICBmcmVlZnVuYyB0cF9mcmVlOyAvKiBMb3ctbGV2ZWwgZnJlZS1tZW1vcnkgcm91dGluZSAqLworICAgIGlucXVpcnkgdHBfaXNfZ2M7IC8qIEZvciBQeU9iamVjdF9JU19HQyAqLworICAgIFB5T2JqZWN0ICp0cF9iYXNlczsKKyAgICBQeU9iamVjdCAqdHBfbXJvOyAvKiBtZXRob2QgcmVzb2x1dGlvbiBvcmRlciAqLworICAgIFB5T2JqZWN0ICp0cF9jYWNoZTsKKyAgICBQeU9iamVjdCAqdHBfc3ViY2xhc3NlczsKKyAgICBQeU9iamVjdCAqdHBfd2Vha2xpc3Q7CisgICAgZGVzdHJ1Y3RvciB0cF9kZWw7CiAKLQkvKiBUeXBlIGF0dHJpYnV0ZSBjYWNoZSB2ZXJzaW9uIHRhZy4gQWRkZWQgaW4gdmVyc2lvbiAyLjYgKi8KLQl1bnNpZ25lZCBpbnQgdHBfdmVyc2lvbl90YWc7CisgICAgLyogVHlwZSBhdHRyaWJ1dGUgY2FjaGUgdmVyc2lvbiB0YWcuIEFkZGVkIGluIHZlcnNpb24gMi42ICovCisgICAgdW5zaWduZWQgaW50IHRwX3ZlcnNpb25fdGFnOwogCiAjaWZkZWYgQ09VTlRfQUxMT0NTCi0JLyogdGhlc2UgbXVzdCBiZSBsYXN0IGFuZCBuZXZlciBleHBsaWNpdGx5IGluaXRpYWxpemVkICovCi0JUHlfc3NpemVfdCB0cF9hbGxvY3M7Ci0JUHlfc3NpemVfdCB0cF9mcmVlczsKLQlQeV9zc2l6ZV90IHRwX21heGFsbG9jOwotCXN0cnVjdCBfdHlwZW9iamVjdCAqdHBfcHJldjsKLQlzdHJ1Y3QgX3R5cGVvYmplY3QgKnRwX25leHQ7CisgICAgLyogdGhlc2UgbXVzdCBiZSBsYXN0IGFuZCBuZXZlciBleHBsaWNpdGx5IGluaXRpYWxpemVkICovCisgICAgUHlfc3NpemVfdCB0cF9hbGxvY3M7CisgICAgUHlfc3NpemVfdCB0cF9mcmVlczsKKyAgICBQeV9zc2l6ZV90IHRwX21heGFsbG9jOworICAgIHN0cnVjdCBfdHlwZW9iamVjdCAqdHBfcHJldjsKKyAgICBzdHJ1Y3QgX3R5cGVvYmplY3QgKnRwX25leHQ7CiAjZW5kaWYKIH0gUHlUeXBlT2JqZWN0OwogCiAKIC8qIFRoZSAqcmVhbCogbGF5b3V0IG9mIGEgdHlwZSBvYmplY3Qgd2hlbiBhbGxvY2F0ZWQgb24gdGhlIGhlYXAgKi8KIHR5cGVkZWYgc3RydWN0IF9oZWFwdHlwZW9iamVjdCB7Ci0JLyogTm90ZTogdGhlcmUncyBhIGRlcGVuZGVuY3kgb24gdGhlIG9yZGVyIG9mIHRoZXNlIG1lbWJlcnMKLQkgICBpbiBzbG90cHRyKCkgaW4gdHlwZW9iamVjdC5jIC4gKi8KLQlQeVR5cGVPYmplY3QgaHRfdHlwZTsKLQlQeU51bWJlck1ldGhvZHMgYXNfbnVtYmVyOwotCVB5TWFwcGluZ01ldGhvZHMgYXNfbWFwcGluZzsKLQlQeVNlcXVlbmNlTWV0aG9kcyBhc19zZXF1ZW5jZTsgLyogYXNfc2VxdWVuY2UgY29tZXMgYWZ0ZXIgYXNfbWFwcGluZywKLQkJCQkJICBzbyB0aGF0IHRoZSBtYXBwaW5nIHdpbnMgd2hlbiBib3RoCi0JCQkJCSAgdGhlIG1hcHBpbmcgYW5kIHRoZSBzZXF1ZW5jZSBkZWZpbmUKLQkJCQkJICBhIGdpdmVuIG9wZXJhdG9yIChlLmcuIF9fZ2V0aXRlbV9fKS4KLQkJCQkJICBzZWUgYWRkX29wZXJhdG9ycygpIGluIHR5cGVvYmplY3QuYyAuICovCi0JUHlCdWZmZXJQcm9jcyBhc19idWZmZXI7Ci0JUHlPYmplY3QgKmh0X25hbWUsICpodF9zbG90czsKLQkvKiBoZXJlIGFyZSBvcHRpb25hbCB1c2VyIHNsb3RzLCBmb2xsb3dlZCBieSB0aGUgbWVtYmVycy4gKi8KKyAgICAvKiBOb3RlOiB0aGVyZSdzIGEgZGVwZW5kZW5jeSBvbiB0aGUgb3JkZXIgb2YgdGhlc2UgbWVtYmVycworICAgICAgIGluIHNsb3RwdHIoKSBpbiB0eXBlb2JqZWN0LmMgLiAqLworICAgIFB5VHlwZU9iamVjdCBodF90eXBlOworICAgIFB5TnVtYmVyTWV0aG9kcyBhc19udW1iZXI7CisgICAgUHlNYXBwaW5nTWV0aG9kcyBhc19tYXBwaW5nOworICAgIFB5U2VxdWVuY2VNZXRob2RzIGFzX3NlcXVlbmNlOyAvKiBhc19zZXF1ZW5jZSBjb21lcyBhZnRlciBhc19tYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbyB0aGF0IHRoZSBtYXBwaW5nIHdpbnMgd2hlbiBib3RoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBtYXBwaW5nIGFuZCB0aGUgc2VxdWVuY2UgZGVmaW5lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgZ2l2ZW4gb3BlcmF0b3IgKGUuZy4gX19nZXRpdGVtX18pLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWUgYWRkX29wZXJhdG9ycygpIGluIHR5cGVvYmplY3QuYyAuICovCisgICAgUHlCdWZmZXJQcm9jcyBhc19idWZmZXI7CisgICAgUHlPYmplY3QgKmh0X25hbWUsICpodF9zbG90czsKKyAgICAvKiBoZXJlIGFyZSBvcHRpb25hbCB1c2VyIHNsb3RzLCBmb2xsb3dlZCBieSB0aGUgbWVtYmVycy4gKi8KIH0gUHlIZWFwVHlwZU9iamVjdDsKIAogLyogYWNjZXNzIG1hY3JvIHRvIHRoZSBtZW1iZXJzIHdoaWNoIGFyZSBmbG9hdGluZyAiYmVoaW5kIiB0aGUgb2JqZWN0ICovCkBAIC00MzQsMjAgKzQzNCwyMCBAQAogLyogR2VuZXJpYyB0eXBlIGNoZWNrICovCiBQeUFQSV9GVU5DKGludCkgUHlUeXBlX0lzU3VidHlwZShQeVR5cGVPYmplY3QgKiwgUHlUeXBlT2JqZWN0ICopOwogI2RlZmluZSBQeU9iamVjdF9UeXBlQ2hlY2sob2IsIHRwKSBcCi0JKFB5X1RZUEUob2IpID09ICh0cCkgfHwgUHlUeXBlX0lzU3VidHlwZShQeV9UWVBFKG9iKSwgKHRwKSkpCisgICAgKFB5X1RZUEUob2IpID09ICh0cCkgfHwgUHlUeXBlX0lzU3VidHlwZShQeV9UWVBFKG9iKSwgKHRwKSkpCiAKIFB5QVBJX0RBVEEoUHlUeXBlT2JqZWN0KSBQeVR5cGVfVHlwZTsgLyogYnVpbHQtaW4gJ3R5cGUnICovCiBQeUFQSV9EQVRBKFB5VHlwZU9iamVjdCkgUHlCYXNlT2JqZWN0X1R5cGU7IC8qIGJ1aWx0LWluICdvYmplY3QnICovCiBQeUFQSV9EQVRBKFB5VHlwZU9iamVjdCkgUHlTdXBlcl9UeXBlOyAvKiBidWlsdC1pbiAnc3VwZXInICovCiAKICNkZWZpbmUgUHlUeXBlX0NoZWNrKG9wKSBcCi0JUHlUeXBlX0Zhc3RTdWJjbGFzcyhQeV9UWVBFKG9wKSwgUHlfVFBGTEFHU19UWVBFX1NVQkNMQVNTKQorICAgIFB5VHlwZV9GYXN0U3ViY2xhc3MoUHlfVFlQRShvcCksIFB5X1RQRkxBR1NfVFlQRV9TVUJDTEFTUykKICNkZWZpbmUgUHlUeXBlX0NoZWNrRXhhY3Qob3ApIChQeV9UWVBFKG9wKSA9PSAmUHlUeXBlX1R5cGUpCiAKIFB5QVBJX0ZVTkMoaW50KSBQeVR5cGVfUmVhZHkoUHlUeXBlT2JqZWN0ICopOwogUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeVR5cGVfR2VuZXJpY0FsbG9jKFB5VHlwZU9iamVjdCAqLCBQeV9zc2l6ZV90KTsKIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlUeXBlX0dlbmVyaWNOZXcoUHlUeXBlT2JqZWN0ICosCi0JCQkJCSAgICAgICBQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKiwgUHlPYmplY3QgKik7CiBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIF9QeVR5cGVfTG9va3VwKFB5VHlwZU9iamVjdCAqLCBQeU9iamVjdCAqKTsKIFB5QVBJX0ZVTkModW5zaWduZWQgaW50KSBQeVR5cGVfQ2xlYXJDYWNoZSh2b2lkKTsKIFB5QVBJX0ZVTkModm9pZCkgUHlUeXBlX01vZGlmaWVkKFB5VHlwZU9iamVjdCAqKTsKQEAgLTQ3NSw3ICs0NzUsNyBAQAogUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU9iamVjdF9TZWxmSXRlcihQeU9iamVjdCAqKTsKIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIoUHlPYmplY3QgKiwgUHlPYmplY3QgKik7CiBQeUFQSV9GVU5DKGludCkgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIoUHlPYmplY3QgKiwKLQkJCQkJICAgICAgUHlPYmplY3QgKiwgUHlPYmplY3QgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKiwgUHlPYmplY3QgKik7CiBQeUFQSV9GVU5DKGxvbmcpIFB5T2JqZWN0X0hhc2goUHlPYmplY3QgKik7CiBQeUFQSV9GVU5DKGxvbmcpIFB5T2JqZWN0X0hhc2hOb3RJbXBsZW1lbnRlZChQeU9iamVjdCAqKTsKIFB5QVBJX0ZVTkMoaW50KSBQeU9iamVjdF9Jc1RydWUoUHlPYmplY3QgKik7CkBAIC01MTAsNyArNTEwLDcgQEAKICNkZWZpbmUgUHlPYmplY3RfUkVQUihvYmopIFB5U3RyaW5nX0FTX1NUUklORyhQeU9iamVjdF9SZXByKG9iaikpCiAKIC8qIEZsYWcgYml0cyBmb3IgcHJpbnRpbmc6ICovCi0jZGVmaW5lIFB5X1BSSU5UX1JBVwkxCS8qIE5vIHN0cmluZyBxdW90ZXMgZXRjLiAqLworI2RlZmluZSBQeV9QUklOVF9SQVcgICAgMSAgICAgICAvKiBObyBzdHJpbmcgcXVvdGVzIGV0Yy4gKi8KIAogLyoKIGBUeXBlIGZsYWdzICh0cF9mbGFncykKQEAgLTYwMywyOSArNjAzLDI5IEBACiAjZGVmaW5lIFB5X1RQRkxBR1NfSEFWRV9ORVdCVUZGRVIgKDFMPDwyMSkKIAogLyogVGhlc2UgZmxhZ3MgYXJlIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIGEgdHlwZSBpcyBhIHN1YmNsYXNzLiAqLwotI2RlZmluZSBQeV9UUEZMQUdTX0lOVF9TVUJDTEFTUwkJKDFMPDwyMykKLSNkZWZpbmUgUHlfVFBGTEFHU19MT05HX1NVQkNMQVNTCSgxTDw8MjQpCi0jZGVmaW5lIFB5X1RQRkxBR1NfTElTVF9TVUJDTEFTUwkoMUw8PDI1KQotI2RlZmluZSBQeV9UUEZMQUdTX1RVUExFX1NVQkNMQVNTCSgxTDw8MjYpCi0jZGVmaW5lIFB5X1RQRkxBR1NfU1RSSU5HX1NVQkNMQVNTCSgxTDw8MjcpCi0jZGVmaW5lIFB5X1RQRkxBR1NfVU5JQ09ERV9TVUJDTEFTUwkoMUw8PDI4KQotI2RlZmluZSBQeV9UUEZMQUdTX0RJQ1RfU1VCQ0xBU1MJKDFMPDwyOSkKLSNkZWZpbmUgUHlfVFBGTEFHU19CQVNFX0VYQ19TVUJDTEFTUwkoMUw8PDMwKQotI2RlZmluZSBQeV9UUEZMQUdTX1RZUEVfU1VCQ0xBU1MJKDFMPDwzMSkKKyNkZWZpbmUgUHlfVFBGTEFHU19JTlRfU1VCQ0xBU1MgICAgICAgICAoMUw8PDIzKQorI2RlZmluZSBQeV9UUEZMQUdTX0xPTkdfU1VCQ0xBU1MgICAgICAgICgxTDw8MjQpCisjZGVmaW5lIFB5X1RQRkxBR1NfTElTVF9TVUJDTEFTUyAgICAgICAgKDFMPDwyNSkKKyNkZWZpbmUgUHlfVFBGTEFHU19UVVBMRV9TVUJDTEFTUyAgICAgICAoMUw8PDI2KQorI2RlZmluZSBQeV9UUEZMQUdTX1NUUklOR19TVUJDTEFTUyAgICAgICgxTDw8MjcpCisjZGVmaW5lIFB5X1RQRkxBR1NfVU5JQ09ERV9TVUJDTEFTUyAgICAgKDFMPDwyOCkKKyNkZWZpbmUgUHlfVFBGTEFHU19ESUNUX1NVQkNMQVNTICAgICAgICAoMUw8PDI5KQorI2RlZmluZSBQeV9UUEZMQUdTX0JBU0VfRVhDX1NVQkNMQVNTICAgICgxTDw8MzApCisjZGVmaW5lIFB5X1RQRkxBR1NfVFlQRV9TVUJDTEFTUyAgICAgICAgKDFMPDwzMSkKIAogI2RlZmluZSBQeV9UUEZMQUdTX0RFRkFVTFRfRVhURVJOQUwgKCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X1RQRkxBR1NfSEFWRV9HRVRDSEFSQlVGRkVSIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9UUEZMQUdTX0hBVkVfU0VRVUVOQ0VfSU4gfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X1RQRkxBR1NfSEFWRV9JTlBMQUNFT1BTIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9UUEZMQUdTX0hBVkVfUklDSENPTVBBUkUgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X1RQRkxBR1NfSEFWRV9XRUFLUkVGUyB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfVFBGTEFHU19IQVZFX0lURVIgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X1RQRkxBR1NfSEFWRV9DTEFTUyB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfVFBGTEFHU19IQVZFX1NUQUNLTEVTU19FWFRFTlNJT04gfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X1RQRkxBR1NfSEFWRV9JTkRFWCB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCkKKyAgICAgICAgICAgICAgICAgUHlfVFBGTEFHU19IQVZFX0dFVENIQVJCVUZGRVIgfCBcCisgICAgICAgICAgICAgICAgIFB5X1RQRkxBR1NfSEFWRV9TRVFVRU5DRV9JTiB8IFwKKyAgICAgICAgICAgICAgICAgUHlfVFBGTEFHU19IQVZFX0lOUExBQ0VPUFMgfCBcCisgICAgICAgICAgICAgICAgIFB5X1RQRkxBR1NfSEFWRV9SSUNIQ09NUEFSRSB8IFwKKyAgICAgICAgICAgICAgICAgUHlfVFBGTEFHU19IQVZFX1dFQUtSRUZTIHwgXAorICAgICAgICAgICAgICAgICBQeV9UUEZMQUdTX0hBVkVfSVRFUiB8IFwKKyAgICAgICAgICAgICAgICAgUHlfVFBGTEFHU19IQVZFX0NMQVNTIHwgXAorICAgICAgICAgICAgICAgICBQeV9UUEZMQUdTX0hBVkVfU1RBQ0tMRVNTX0VYVEVOU0lPTiB8IFwKKyAgICAgICAgICAgICAgICAgUHlfVFBGTEFHU19IQVZFX0lOREVYIHwgXAorICAgICAgICAgICAgICAgICAwKQogI2RlZmluZSBQeV9UUEZMQUdTX0RFRkFVTFRfQ09SRSAoUHlfVFBGTEFHU19ERUZBVUxUX0VYVEVSTkFMIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfVFBGTEFHU19IQVZFX1ZFUlNJT05fVEFHKQorICAgICAgICAgICAgICAgICBQeV9UUEZMQUdTX0hBVkVfVkVSU0lPTl9UQUcpCiAKICNpZmRlZiBQeV9CVUlMRF9DT1JFCiAjZGVmaW5lIFB5X1RQRkxBR1NfREVGQVVMVCBQeV9UUEZMQUdTX0RFRkFVTFRfQ09SRQpAQCAtNjgzLDMyICs2ODMsMzIgQEAKICNpZmRlZiBQeV9SRUZfREVCVUcKIFB5QVBJX0RBVEEoUHlfc3NpemVfdCkgX1B5X1JlZlRvdGFsOwogUHlBUElfRlVOQyh2b2lkKSBfUHlfTmVnYXRpdmVSZWZjb3VudChjb25zdCBjaGFyICpmbmFtZSwKLQkJCQkJICAgIGludCBsaW5lbm8sIFB5T2JqZWN0ICpvcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lbm8sIFB5T2JqZWN0ICpvcCk7CiBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIF9QeURpY3RfRHVtbXkodm9pZCk7CiBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIF9QeVNldF9EdW1teSh2b2lkKTsKIFB5QVBJX0ZVTkMoUHlfc3NpemVfdCkgX1B5X0dldFJlZlRvdGFsKHZvaWQpOwotI2RlZmluZSBfUHlfSU5DX1JFRlRPVEFMCV9QeV9SZWZUb3RhbCsrCi0jZGVmaW5lIF9QeV9ERUNfUkVGVE9UQUwJX1B5X1JlZlRvdGFsLS0KLSNkZWZpbmUgX1B5X1JFRl9ERUJVR19DT01NQQksCi0jZGVmaW5lIF9QeV9DSEVDS19SRUZDTlQoT1ApCQkJCQlcCi17CWlmICgoKFB5T2JqZWN0KilPUCktPm9iX3JlZmNudCA8IDApCQkJCVwKLQkJX1B5X05lZ2F0aXZlUmVmY291bnQoX19GSUxFX18sIF9fTElORV9fLAlcCi0JCQkJICAgICAoUHlPYmplY3QgKikoT1ApKTsJCVwKKyNkZWZpbmUgX1B5X0lOQ19SRUZUT1RBTCAgICAgICAgX1B5X1JlZlRvdGFsKysKKyNkZWZpbmUgX1B5X0RFQ19SRUZUT1RBTCAgICAgICAgX1B5X1JlZlRvdGFsLS0KKyNkZWZpbmUgX1B5X1JFRl9ERUJVR19DT01NQSAgICAgLAorI2RlZmluZSBfUHlfQ0hFQ0tfUkVGQ05UKE9QKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgaWYgKCgoUHlPYmplY3QqKU9QKS0+b2JfcmVmY250IDwgMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBfUHlfTmVnYXRpdmVSZWZjb3VudChfX0ZJTEVfXywgX19MSU5FX18sICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFB5T2JqZWN0ICopKE9QKSk7ICAgICAgICAgXAogfQogI2Vsc2UKICNkZWZpbmUgX1B5X0lOQ19SRUZUT1RBTAogI2RlZmluZSBfUHlfREVDX1JFRlRPVEFMCiAjZGVmaW5lIF9QeV9SRUZfREVCVUdfQ09NTUEKLSNkZWZpbmUgX1B5X0NIRUNLX1JFRkNOVChPUCkJLyogYSBzZW1pY29sb24gKi87CisjZGVmaW5lIF9QeV9DSEVDS19SRUZDTlQoT1ApICAgIC8qIGEgc2VtaWNvbG9uICovOwogI2VuZGlmIC8qIFB5X1JFRl9ERUJVRyAqLwogCiAjaWZkZWYgQ09VTlRfQUxMT0NTCiBQeUFQSV9GVU5DKHZvaWQpIGluY19jb3VudChQeVR5cGVPYmplY3QgKik7CiBQeUFQSV9GVU5DKHZvaWQpIGRlY19jb3VudChQeVR5cGVPYmplY3QgKik7Ci0jZGVmaW5lIF9QeV9JTkNfVFBBTExPQ1MoT1ApCWluY19jb3VudChQeV9UWVBFKE9QKSkKLSNkZWZpbmUgX1B5X0lOQ19UUEZSRUVTKE9QKQlkZWNfY291bnQoUHlfVFlQRShPUCkpCi0jZGVmaW5lIF9QeV9ERUNfVFBGUkVFUyhPUCkJUHlfVFlQRShPUCktPnRwX2ZyZWVzLS0KLSNkZWZpbmUgX1B5X0NPVU5UX0FMTE9DU19DT01NQQksCisjZGVmaW5lIF9QeV9JTkNfVFBBTExPQ1MoT1ApICAgIGluY19jb3VudChQeV9UWVBFKE9QKSkKKyNkZWZpbmUgX1B5X0lOQ19UUEZSRUVTKE9QKSAgICAgZGVjX2NvdW50KFB5X1RZUEUoT1ApKQorI2RlZmluZSBfUHlfREVDX1RQRlJFRVMoT1ApICAgICBQeV9UWVBFKE9QKS0+dHBfZnJlZXMtLQorI2RlZmluZSBfUHlfQ09VTlRfQUxMT0NTX0NPTU1BICAsCiAjZWxzZQogI2RlZmluZSBfUHlfSU5DX1RQQUxMT0NTKE9QKQogI2RlZmluZSBfUHlfSU5DX1RQRlJFRVMoT1ApCkBAIC03MjksMjggKzcyOSwyOCBAQAogLyogV2l0aG91dCBQeV9UUkFDRV9SRUZTLCB0aGVyZSdzIGxpdHRsZSBlbm91Z2ggdG8gZG8gdGhhdCB3ZSBleHBhbmQgY29kZQogICogaW5saW5lLgogICovCi0jZGVmaW5lIF9QeV9OZXdSZWZlcmVuY2Uob3ApICgJCQkJXAotCV9QeV9JTkNfVFBBTExPQ1Mob3ApIF9QeV9DT1VOVF9BTExPQ1NfQ09NTUEJXAotCV9QeV9JTkNfUkVGVE9UQUwgIF9QeV9SRUZfREVCVUdfQ09NTUEJCVwKLQlQeV9SRUZDTlQob3ApID0gMSkKKyNkZWZpbmUgX1B5X05ld1JlZmVyZW5jZShvcCkgKCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9QeV9JTkNfVFBBTExPQ1Mob3ApIF9QeV9DT1VOVF9BTExPQ1NfQ09NTUEgICAgICAgICBcCisgICAgX1B5X0lOQ19SRUZUT1RBTCAgX1B5X1JFRl9ERUJVR19DT01NQSAgICAgICAgICAgICAgIFwKKyAgICBQeV9SRUZDTlQob3ApID0gMSkKIAogI2RlZmluZSBfUHlfRm9yZ2V0UmVmZXJlbmNlKG9wKSBfUHlfSU5DX1RQRlJFRVMob3ApCiAKLSNkZWZpbmUgX1B5X0RlYWxsb2Mob3ApICgJCQkJXAotCV9QeV9JTkNfVFBGUkVFUyhvcCkgX1B5X0NPVU5UX0FMTE9DU19DT01NQQlcCi0JKCpQeV9UWVBFKG9wKS0+dHBfZGVhbGxvYykoKFB5T2JqZWN0ICopKG9wKSkpCisjZGVmaW5lIF9QeV9EZWFsbG9jKG9wKSAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfUHlfSU5DX1RQRlJFRVMob3ApIF9QeV9DT1VOVF9BTExPQ1NfQ09NTUEgICAgICAgICAgXAorICAgICgqUHlfVFlQRShvcCktPnRwX2RlYWxsb2MpKChQeU9iamVjdCAqKShvcCkpKQogI2VuZGlmIC8qICFQeV9UUkFDRV9SRUZTICovCiAKLSNkZWZpbmUgUHlfSU5DUkVGKG9wKSAoCQkJCVwKLQlfUHlfSU5DX1JFRlRPVEFMICBfUHlfUkVGX0RFQlVHX0NPTU1BCVwKLQkoKFB5T2JqZWN0Kikob3ApKS0+b2JfcmVmY250KyspCisjZGVmaW5lIFB5X0lOQ1JFRihvcCkgKCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX1B5X0lOQ19SRUZUT1RBTCAgX1B5X1JFRl9ERUJVR19DT01NQSAgICAgICBcCisgICAgKChQeU9iamVjdCopKG9wKSktPm9iX3JlZmNudCsrKQogCi0jZGVmaW5lIFB5X0RFQ1JFRihvcCkJCQkJCVwKLQlpZiAoX1B5X0RFQ19SRUZUT1RBTCAgX1B5X1JFRl9ERUJVR19DT01NQQlcCi0JICAgIC0tKChQeU9iamVjdCopKG9wKSktPm9iX3JlZmNudCAhPSAwKQkJXAotCQlfUHlfQ0hFQ0tfUkVGQ05UKG9wKQkJCVwKLQllbHNlCQkJCQkJXAotCQlfUHlfRGVhbGxvYygoUHlPYmplY3QgKikob3ApKQorI2RlZmluZSBQeV9ERUNSRUYob3ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKF9QeV9ERUNfUkVGVE9UQUwgIF9QeV9SRUZfREVCVUdfQ09NTUEgICAgICAgICAgIFwKKyAgICAgICAgLS0oKFB5T2JqZWN0Kikob3ApKS0+b2JfcmVmY250ICE9IDApICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIF9QeV9DSEVDS19SRUZDTlQob3ApICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBfUHlfRGVhbGxvYygoUHlPYmplY3QgKikob3ApKQogCiAvKiBTYWZlbHkgZGVjcmVmIGBvcGAgYW5kIHNldCBgb3BgIHRvIE5VTEwsIGVzcGVjaWFsbHkgdXNlZnVsIGluIHRwX2NsZWFyCiAgKiBhbmQgdHBfZGVhbGxvYyBpbXBsZW1lbnRhdG9ucy4KQEAgLTc4NiwxNCArNzg2LDE0IEBACiAgKiBQeXRob24gaW50ZWdlcnMgYXJlbid0IGN1cnJlbnRseSB3ZWFrbHkgcmVmZXJlbmNhYmxlLiAgQmVzdCBwcmFjdGljZSBpcwogICogdG8gdXNlIFB5X0NMRUFSKCkgZXZlbiBpZiB5b3UgY2FuJ3QgdGhpbmsgb2YgYSByZWFzb24gZm9yIHdoeSB5b3UgbmVlZCB0by4KICAqLwotI2RlZmluZSBQeV9DTEVBUihvcCkJCQkJXAotICAgICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0gICAgICAgICAgICAgICAgaWYgKG9wKSB7CQkJXAotICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKl9weV90bXAgPSAoUHlPYmplY3QgKikob3ApOwlcCi0gICAgICAgICAgICAgICAgICAgICAgICAob3ApID0gTlVMTDsJCVwKLSAgICAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihfcHlfdG1wKTsJXAotICAgICAgICAgICAgICAgIH0JCQkJXAotICAgICAgICB9IHdoaWxlICgwKQorI2RlZmluZSBQeV9DTEVBUihvcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAob3ApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgUHlPYmplY3QgKl9weV90bXAgPSAoUHlPYmplY3QgKikob3ApOyAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIChvcCkgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIFB5X0RFQ1JFRihfcHlfdG1wKTsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlICgwKQogCiAvKiBNYWNyb3MgdG8gdXNlIGluIGNhc2UgdGhlIG9iamVjdCBwb2ludGVyIG1heSBiZSBOVUxMOiAqLwogI2RlZmluZSBQeV9YSU5DUkVGKG9wKSBpZiAoKG9wKSA9PSBOVUxMKSA7IGVsc2UgUHlfSU5DUkVGKG9wKQpAQCAtOTIwLDEzICs5MjAsMTMgQEAKIHN0YXRpYyB2b2lkCiBteXR5cGVfZGVhbGxvYyhteXR5cGUgKnApCiB7Ci0gICAgICAgIC4uLiBkZWNsYXJhdGlvbnMgZ28gaGVyZSAuLi4KKyAgICAuLi4gZGVjbGFyYXRpb25zIGdvIGhlcmUgLi4uCiAKLSAJUHlPYmplY3RfR0NfVW5UcmFjayhwKTsJICAgLy8gbXVzdCB1bnRyYWNrIGZpcnN0Ci0JUHlfVFJBU0hDQU5fU0FGRV9CRUdJTihwKQotCS4uLiBUaGUgYm9keSBvZiB0aGUgZGVhbGxvY2F0b3IgZ29lcyBoZXJlLCBpbmNsdWRpbmcgYWxsIGNhbGxzIC4uLgotCS4uLiB0byBQeV9ERUNSRUYgb24gY29udGFpbmVkIG9iamVjdHMuICAgICAgICAgICAgICAgICAgICAgICAgIC4uLgotCVB5X1RSQVNIQ0FOX1NBRkVfRU5EKHApCisgICAgUHlPYmplY3RfR0NfVW5UcmFjayhwKTsgICAgICAgIC8vIG11c3QgdW50cmFjayBmaXJzdAorICAgIFB5X1RSQVNIQ0FOX1NBRkVfQkVHSU4ocCkKKyAgICAuLi4gVGhlIGJvZHkgb2YgdGhlIGRlYWxsb2NhdG9yIGdvZXMgaGVyZSwgaW5jbHVkaW5nIGFsbCBjYWxscyAuLi4KKyAgICAuLi4gdG8gUHlfREVDUkVGIG9uIGNvbnRhaW5lZCBvYmplY3RzLiAgICAgICAgICAgICAgICAgICAgICAgICAuLi4KKyAgICBQeV9UUkFTSENBTl9TQUZFX0VORChwKQogfQogCiBDQVVUSU9OOiAgTmV2ZXIgcmV0dXJuIGZyb20gdGhlIG1pZGRsZSBvZiB0aGUgYm9keSEgIElmIHRoZSBib2R5IG5lZWRzIHRvCkBAIC05NTYsMTYgKzk1NiwxNiBAQAogI2RlZmluZSBQeVRyYXNoX1VOV0lORF9MRVZFTCA1MAogCiAjZGVmaW5lIFB5X1RSQVNIQ0FOX1NBRkVfQkVHSU4ob3ApIFwKLQlpZiAoX1B5VHJhc2hfZGVsZXRlX25lc3RpbmcgPCBQeVRyYXNoX1VOV0lORF9MRVZFTCkgeyBcCi0JCSsrX1B5VHJhc2hfZGVsZXRlX25lc3Rpbmc7Ci0JCS8qIFRoZSBib2R5IG9mIHRoZSBkZWFsbG9jYXRvciBpcyBoZXJlLiAqLworICAgIGlmIChfUHlUcmFzaF9kZWxldGVfbmVzdGluZyA8IFB5VHJhc2hfVU5XSU5EX0xFVkVMKSB7IFwKKyAgICAgICAgKytfUHlUcmFzaF9kZWxldGVfbmVzdGluZzsKKyAgICAgICAgLyogVGhlIGJvZHkgb2YgdGhlIGRlYWxsb2NhdG9yIGlzIGhlcmUuICovCiAjZGVmaW5lIFB5X1RSQVNIQ0FOX1NBRkVfRU5EKG9wKSBcCi0JCS0tX1B5VHJhc2hfZGVsZXRlX25lc3Rpbmc7IFwKLQkJaWYgKF9QeVRyYXNoX2RlbGV0ZV9sYXRlciAmJiBfUHlUcmFzaF9kZWxldGVfbmVzdGluZyA8PSAwKSBcCi0JCQlfUHlUcmFzaF9kZXN0cm95X2NoYWluKCk7IFwKLQl9IFwKLQllbHNlIFwKLQkJX1B5VHJhc2hfZGVwb3NpdF9vYmplY3QoKFB5T2JqZWN0KilvcCk7CisgICAgICAgIC0tX1B5VHJhc2hfZGVsZXRlX25lc3Rpbmc7IFwKKyAgICAgICAgaWYgKF9QeVRyYXNoX2RlbGV0ZV9sYXRlciAmJiBfUHlUcmFzaF9kZWxldGVfbmVzdGluZyA8PSAwKSBcCisgICAgICAgICAgICBfUHlUcmFzaF9kZXN0cm95X2NoYWluKCk7IFwKKyAgICB9IFwKKyAgICBlbHNlIFwKKyAgICAgICAgX1B5VHJhc2hfZGVwb3NpdF9vYmplY3QoKFB5T2JqZWN0KilvcCk7CiAKICNpZmRlZiBfX2NwbHVzcGx1cwogfQpkaWZmIC0tZ2l0IGEvSW5jbHVkZS9vYmppbXBsLmggYi9JbmNsdWRlL29iamltcGwuaAppbmRleCBlZjQ3MjE4Li4xOWJlYjc2IDEwMDY0NAotLS0gYS9JbmNsdWRlL29iamltcGwuaAorKysgYi9JbmNsdWRlL29iamltcGwuaApAQCAtMTAxLDM4ICsxMDEsMzggQEAKIAogLyogTWFjcm9zICovCiAjaWZkZWYgV0lUSF9QWU1BTExPQwotI2lmZGVmIFBZTUFMTE9DX0RFQlVHCS8qIFdJVEhfUFlNQUxMT0MgJiYgUFlNQUxMT0NfREVCVUcgKi8KKyNpZmRlZiBQWU1BTExPQ19ERUJVRyAgIC8qIFdJVEhfUFlNQUxMT0MgJiYgUFlNQUxMT0NfREVCVUcgKi8KIFB5QVBJX0ZVTkModm9pZCAqKSBfUHlPYmplY3RfRGVidWdNYWxsb2Moc2l6ZV90IG5ieXRlcyk7CiBQeUFQSV9GVU5DKHZvaWQgKikgX1B5T2JqZWN0X0RlYnVnUmVhbGxvYyh2b2lkICpwLCBzaXplX3QgbmJ5dGVzKTsKIFB5QVBJX0ZVTkModm9pZCkgX1B5T2JqZWN0X0RlYnVnRnJlZSh2b2lkICpwKTsKIFB5QVBJX0ZVTkModm9pZCkgX1B5T2JqZWN0X0RlYnVnRHVtcEFkZHJlc3MoY29uc3Qgdm9pZCAqcCk7CiBQeUFQSV9GVU5DKHZvaWQpIF9QeU9iamVjdF9EZWJ1Z0NoZWNrQWRkcmVzcyhjb25zdCB2b2lkICpwKTsKIFB5QVBJX0ZVTkModm9pZCkgX1B5T2JqZWN0X0RlYnVnTWFsbG9jU3RhdHModm9pZCk7Ci0jZGVmaW5lIFB5T2JqZWN0X01BTExPQwkJX1B5T2JqZWN0X0RlYnVnTWFsbG9jCi0jZGVmaW5lIFB5T2JqZWN0X01hbGxvYwkJX1B5T2JqZWN0X0RlYnVnTWFsbG9jCi0jZGVmaW5lIFB5T2JqZWN0X1JFQUxMT0MJX1B5T2JqZWN0X0RlYnVnUmVhbGxvYwotI2RlZmluZSBQeU9iamVjdF9SZWFsbG9jCV9QeU9iamVjdF9EZWJ1Z1JlYWxsb2MKLSNkZWZpbmUgUHlPYmplY3RfRlJFRQkJX1B5T2JqZWN0X0RlYnVnRnJlZQotI2RlZmluZSBQeU9iamVjdF9GcmVlCQlfUHlPYmplY3RfRGVidWdGcmVlCisjZGVmaW5lIFB5T2JqZWN0X01BTExPQyAgICAgICAgIF9QeU9iamVjdF9EZWJ1Z01hbGxvYworI2RlZmluZSBQeU9iamVjdF9NYWxsb2MgICAgICAgICBfUHlPYmplY3RfRGVidWdNYWxsb2MKKyNkZWZpbmUgUHlPYmplY3RfUkVBTExPQyAgICAgICAgX1B5T2JqZWN0X0RlYnVnUmVhbGxvYworI2RlZmluZSBQeU9iamVjdF9SZWFsbG9jICAgICAgICBfUHlPYmplY3RfRGVidWdSZWFsbG9jCisjZGVmaW5lIFB5T2JqZWN0X0ZSRUUgICAgICAgICAgIF9QeU9iamVjdF9EZWJ1Z0ZyZWUKKyNkZWZpbmUgUHlPYmplY3RfRnJlZSAgICAgICAgICAgX1B5T2JqZWN0X0RlYnVnRnJlZQogCi0jZWxzZQkvKiBXSVRIX1BZTUFMTE9DICYmICEgUFlNQUxMT0NfREVCVUcgKi8KLSNkZWZpbmUgUHlPYmplY3RfTUFMTE9DCQlQeU9iamVjdF9NYWxsb2MKLSNkZWZpbmUgUHlPYmplY3RfUkVBTExPQwlQeU9iamVjdF9SZWFsbG9jCi0jZGVmaW5lIFB5T2JqZWN0X0ZSRUUJCVB5T2JqZWN0X0ZyZWUKKyNlbHNlICAgLyogV0lUSF9QWU1BTExPQyAmJiAhIFBZTUFMTE9DX0RFQlVHICovCisjZGVmaW5lIFB5T2JqZWN0X01BTExPQyAgICAgICAgIFB5T2JqZWN0X01hbGxvYworI2RlZmluZSBQeU9iamVjdF9SRUFMTE9DICAgICAgICBQeU9iamVjdF9SZWFsbG9jCisjZGVmaW5lIFB5T2JqZWN0X0ZSRUUgICAgICAgICAgIFB5T2JqZWN0X0ZyZWUKICNlbmRpZgogCi0jZWxzZQkvKiAhIFdJVEhfUFlNQUxMT0MgKi8KLSNkZWZpbmUgUHlPYmplY3RfTUFMTE9DCQlQeU1lbV9NQUxMT0MKLSNkZWZpbmUgUHlPYmplY3RfUkVBTExPQwlQeU1lbV9SRUFMTE9DCi0jZGVmaW5lIFB5T2JqZWN0X0ZSRUUJCVB5TWVtX0ZSRUUKKyNlbHNlICAgLyogISBXSVRIX1BZTUFMTE9DICovCisjZGVmaW5lIFB5T2JqZWN0X01BTExPQyAgICAgICAgIFB5TWVtX01BTExPQworI2RlZmluZSBQeU9iamVjdF9SRUFMTE9DICAgICAgICBQeU1lbV9SRUFMTE9DCisjZGVmaW5lIFB5T2JqZWN0X0ZSRUUgICAgICAgICAgIFB5TWVtX0ZSRUUKIAotI2VuZGlmCS8qIFdJVEhfUFlNQUxMT0MgKi8KKyNlbmRpZiAgLyogV0lUSF9QWU1BTExPQyAqLwogCi0jZGVmaW5lIFB5T2JqZWN0X0RlbAkJUHlPYmplY3RfRnJlZQotI2RlZmluZSBQeU9iamVjdF9ERUwJCVB5T2JqZWN0X0ZSRUUKKyNkZWZpbmUgUHlPYmplY3RfRGVsICAgICAgICAgICAgUHlPYmplY3RfRnJlZQorI2RlZmluZSBQeU9iamVjdF9ERUwgICAgICAgICAgICBQeU9iamVjdF9GUkVFCiAKIC8qIGZvciBzb3VyY2UgY29tcGF0aWJpbGl0eSB3aXRoIDIuMiAqLwotI2RlZmluZSBfUHlPYmplY3RfRGVsCQlQeU9iamVjdF9GcmVlCisjZGVmaW5lIF9QeU9iamVjdF9EZWwgICAgICAgICAgIFB5T2JqZWN0X0ZyZWUKIAogLyoKICAqIEdlbmVyaWMgb2JqZWN0IGFsbG9jYXRvciBpbnRlcmZhY2UKQEAgLTE0NywxNiArMTQ3LDE2IEBACiBQeUFQSV9GVU5DKFB5VmFyT2JqZWN0ICopIF9QeU9iamVjdF9OZXdWYXIoUHlUeXBlT2JqZWN0ICosIFB5X3NzaXplX3QpOwogCiAjZGVmaW5lIFB5T2JqZWN0X05ldyh0eXBlLCB0eXBlb2JqKSBcCi0JCSggKHR5cGUgKikgX1B5T2JqZWN0X05ldyh0eXBlb2JqKSApCisgICAgICAgICAgICAgICAgKCAodHlwZSAqKSBfUHlPYmplY3RfTmV3KHR5cGVvYmopICkKICNkZWZpbmUgUHlPYmplY3RfTmV3VmFyKHR5cGUsIHR5cGVvYmosIG4pIFwKLQkJKCAodHlwZSAqKSBfUHlPYmplY3RfTmV3VmFyKCh0eXBlb2JqKSwgKG4pKSApCisgICAgICAgICAgICAgICAgKCAodHlwZSAqKSBfUHlPYmplY3RfTmV3VmFyKCh0eXBlb2JqKSwgKG4pKSApCiAKIC8qIE1hY3JvcyB0cmFkaW5nIGJpbmFyeSBjb21wYXRpYmlsaXR5IGZvciBzcGVlZC4gU2VlIGFsc28gcHltZW0uaC4KICAgIE5vdGUgdGhhdCB0aGVzZSBtYWNyb3MgZXhwZWN0IG5vbi1OVUxMIG9iamVjdCBwb2ludGVycy4qLwogI2RlZmluZSBQeU9iamVjdF9JTklUKG9wLCB0eXBlb2JqKSBcCi0JKCBQeV9UWVBFKG9wKSA9ICh0eXBlb2JqKSwgX1B5X05ld1JlZmVyZW5jZSgoUHlPYmplY3QgKikob3ApKSwgKG9wKSApCisgICAgKCBQeV9UWVBFKG9wKSA9ICh0eXBlb2JqKSwgX1B5X05ld1JlZmVyZW5jZSgoUHlPYmplY3QgKikob3ApKSwgKG9wKSApCiAjZGVmaW5lIFB5T2JqZWN0X0lOSVRfVkFSKG9wLCB0eXBlb2JqLCBzaXplKSBcCi0JKCBQeV9TSVpFKG9wKSA9IChzaXplKSwgUHlPYmplY3RfSU5JVCgob3ApLCAodHlwZW9iaikpICkKKyAgICAoIFB5X1NJWkUob3ApID0gKHNpemUpLCBQeU9iamVjdF9JTklUKChvcCksICh0eXBlb2JqKSkgKQogCiAjZGVmaW5lIF9QeU9iamVjdF9TSVpFKHR5cGVvYmopICggKHR5cGVvYmopLT50cF9iYXNpY3NpemUgKQogCkBAIC0xNzQsMTcgKzE3NCwxNyBAQAogIyAgIGVycm9yICJfUHlPYmplY3RfVkFSX1NJWkUgcmVxdWlyZXMgU0laRU9GX1ZPSURfUCBiZSBhIHBvd2VyIG9mIDIiCiAjZW5kaWYKIAotI2RlZmluZSBfUHlPYmplY3RfVkFSX1NJWkUodHlwZW9iaiwgbml0ZW1zKQlcCi0JKHNpemVfdCkJCQkJXAotCSggKCAodHlwZW9iaiktPnRwX2Jhc2ljc2l6ZSArCQlcCi0JICAgIChuaXRlbXMpKih0eXBlb2JqKS0+dHBfaXRlbXNpemUgKwlcCi0JICAgIChTSVpFT0ZfVk9JRF9QIC0gMSkJCQlcCi0JICApICYgfihTSVpFT0ZfVk9JRF9QIC0gMSkJCVwKLQkpCisjZGVmaW5lIF9QeU9iamVjdF9WQVJfU0laRSh0eXBlb2JqLCBuaXRlbXMpICAgICBcCisgICAgKHNpemVfdCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCAoICh0eXBlb2JqKS0+dHBfYmFzaWNzaXplICsgICAgICAgICAgICAgICBcCisgICAgICAgIChuaXRlbXMpKih0eXBlb2JqKS0+dHBfaXRlbXNpemUgKyAgICAgICBcCisgICAgICAgIChTSVpFT0ZfVk9JRF9QIC0gMSkgICAgICAgICAgICAgICAgICAgICBcCisgICAgICApICYgfihTSVpFT0ZfVk9JRF9QIC0gMSkgICAgICAgICAgICAgICAgICBcCisgICAgKQogCiAjZGVmaW5lIFB5T2JqZWN0X05FVyh0eXBlLCB0eXBlb2JqKSBcCiAoICh0eXBlICopIFB5T2JqZWN0X0luaXQoIFwKLQkoUHlPYmplY3QgKikgUHlPYmplY3RfTUFMTE9DKCBfUHlPYmplY3RfU0laRSh0eXBlb2JqKSApLCAodHlwZW9iaikpICkKKyAgICAoUHlPYmplY3QgKikgUHlPYmplY3RfTUFMTE9DKCBfUHlPYmplY3RfU0laRSh0eXBlb2JqKSApLCAodHlwZW9iaikpICkKIAogI2RlZmluZSBQeU9iamVjdF9ORVdfVkFSKHR5cGUsIHR5cGVvYmosIG4pIFwKICggKHR5cGUgKikgUHlPYmplY3RfSW5pdFZhciggXApAQCAtMTk2LDcgKzE5Niw3IEBACiAgICBkaXN0aW5jdGlvbiBiZXR3ZWVuIHR3byBzdGVwcyAoYXQgbGVhc3QpOgogICAgICAgIDEpIHRoZSBhY3R1YWwgYWxsb2NhdGlvbiBvZiB0aGUgb2JqZWN0IHN0b3JhZ2U7CiAgICAgICAgMikgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBQeXRob24gc3BlY2lmaWMgZmllbGRzCi0gICAgICAgICAgaW4gdGhpcyBzdG9yYWdlIHdpdGggUHlPYmplY3Rfe0luaXQsIEluaXRWYXJ9LgorICAgICAgaW4gdGhpcyBzdG9yYWdlIHdpdGggUHlPYmplY3Rfe0luaXQsIEluaXRWYXJ9LgogCiAgICBQeU9iamVjdCAqCiAgICBZb3VyT2JqZWN0X05ldyguLi4pCkBAIC0yMDUsNyArMjA1LDcgQEAKIAogICAgICAgIG9wID0gKFB5T2JqZWN0ICopIFlvdXJfQWxsb2NhdG9yKF9QeU9iamVjdF9TSVpFKFlvdXJUeXBlU3RydWN0KSk7CiAgICAgICAgaWYgKG9wID09IE5VTEwpCi0gICAgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOwogCiAgICAgICAgUHlPYmplY3RfSW5pdChvcCwgJllvdXJUeXBlU3RydWN0KTsKIApAQCAtMjMyLDQ0ICsyMzIsNDQgQEAKIAogLyogVGVzdCBpZiBhbiBvYmplY3QgaGFzIGEgR0MgaGVhZCAqLwogI2RlZmluZSBQeU9iamVjdF9JU19HQyhvKSAoUHlUeXBlX0lTX0dDKFB5X1RZUEUobykpICYmIFwKLQkoUHlfVFlQRShvKS0+dHBfaXNfZ2MgPT0gTlVMTCB8fCBQeV9UWVBFKG8pLT50cF9pc19nYyhvKSkpCisgICAgKFB5X1RZUEUobyktPnRwX2lzX2djID09IE5VTEwgfHwgUHlfVFlQRShvKS0+dHBfaXNfZ2MobykpKQogCiBQeUFQSV9GVU5DKFB5VmFyT2JqZWN0ICopIF9QeU9iamVjdF9HQ19SZXNpemUoUHlWYXJPYmplY3QgKiwgUHlfc3NpemVfdCk7CiAjZGVmaW5lIFB5T2JqZWN0X0dDX1Jlc2l6ZSh0eXBlLCBvcCwgbikgXAotCQkoICh0eXBlICopIF9QeU9iamVjdF9HQ19SZXNpemUoKFB5VmFyT2JqZWN0ICopKG9wKSwgKG4pKSApCisgICAgICAgICAgICAgICAgKCAodHlwZSAqKSBfUHlPYmplY3RfR0NfUmVzaXplKChQeVZhck9iamVjdCAqKShvcCksIChuKSkgKQogCiAvKiBmb3Igc291cmNlIGNvbXBhdGliaWxpdHkgd2l0aCAyLjIgKi8KICNkZWZpbmUgX1B5T2JqZWN0X0dDX0RlbCBQeU9iamVjdF9HQ19EZWwKIAogLyogR0MgaW5mb3JtYXRpb24gaXMgc3RvcmVkIEJFRk9SRSB0aGUgb2JqZWN0IHN0cnVjdHVyZS4gKi8KIHR5cGVkZWYgdW5pb24gX2djX2hlYWQgewotCXN0cnVjdCB7Ci0JCXVuaW9uIF9nY19oZWFkICpnY19uZXh0OwotCQl1bmlvbiBfZ2NfaGVhZCAqZ2NfcHJldjsKLQkJUHlfc3NpemVfdCBnY19yZWZzOwotCX0gZ2M7Ci0JbG9uZyBkb3VibGUgZHVtbXk7ICAvKiBmb3JjZSB3b3JzdC1jYXNlIGFsaWdubWVudCAqLworICAgIHN0cnVjdCB7CisgICAgICAgIHVuaW9uIF9nY19oZWFkICpnY19uZXh0OworICAgICAgICB1bmlvbiBfZ2NfaGVhZCAqZ2NfcHJldjsKKyAgICAgICAgUHlfc3NpemVfdCBnY19yZWZzOworICAgIH0gZ2M7CisgICAgbG9uZyBkb3VibGUgZHVtbXk7ICAvKiBmb3JjZSB3b3JzdC1jYXNlIGFsaWdubWVudCAqLwogfSBQeUdDX0hlYWQ7CiAKIGV4dGVybiBQeUdDX0hlYWQgKl9QeUdDX2dlbmVyYXRpb24wOwogCiAjZGVmaW5lIF9QeV9BU19HQyhvKSAoKFB5R0NfSGVhZCAqKShvKS0xKQogCi0jZGVmaW5lIF9QeUdDX1JFRlNfVU5UUkFDS0VECQkJKC0yKQotI2RlZmluZSBfUHlHQ19SRUZTX1JFQUNIQUJMRQkJCSgtMykKLSNkZWZpbmUgX1B5R0NfUkVGU19URU5UQVRJVkVMWV9VTlJFQUNIQUJMRQkoLTQpCisjZGVmaW5lIF9QeUdDX1JFRlNfVU5UUkFDS0VEICAgICAgICAgICAgICAgICAgICAoLTIpCisjZGVmaW5lIF9QeUdDX1JFRlNfUkVBQ0hBQkxFICAgICAgICAgICAgICAgICAgICAoLTMpCisjZGVmaW5lIF9QeUdDX1JFRlNfVEVOVEFUSVZFTFlfVU5SRUFDSEFCTEUgICAgICAoLTQpCiAKIC8qIFRlbGwgdGhlIEdDIHRvIHRyYWNrIHRoaXMgb2JqZWN0LiAgTkI6IFdoaWxlIHRoZSBvYmplY3QgaXMgdHJhY2tlZCB0aGUKICAqIGNvbGxlY3RvciBpdCBtdXN0IGJlIHNhZmUgdG8gY2FsbCB0aGUgb2JfdHJhdmVyc2UgbWV0aG9kLiAqLwogI2RlZmluZSBfUHlPYmplY3RfR0NfVFJBQ0sobykgZG8geyBcCi0JUHlHQ19IZWFkICpnID0gX1B5X0FTX0dDKG8pOyBcCi0JaWYgKGctPmdjLmdjX3JlZnMgIT0gX1B5R0NfUkVGU19VTlRSQUNLRUQpIFwKLQkJUHlfRmF0YWxFcnJvcigiR0Mgb2JqZWN0IGFscmVhZHkgdHJhY2tlZCIpOyBcCi0JZy0+Z2MuZ2NfcmVmcyA9IF9QeUdDX1JFRlNfUkVBQ0hBQkxFOyBcCi0JZy0+Z2MuZ2NfbmV4dCA9IF9QeUdDX2dlbmVyYXRpb24wOyBcCi0JZy0+Z2MuZ2NfcHJldiA9IF9QeUdDX2dlbmVyYXRpb24wLT5nYy5nY19wcmV2OyBcCi0JZy0+Z2MuZ2NfcHJldi0+Z2MuZ2NfbmV4dCA9IGc7IFwKLQlfUHlHQ19nZW5lcmF0aW9uMC0+Z2MuZ2NfcHJldiA9IGc7IFwKKyAgICBQeUdDX0hlYWQgKmcgPSBfUHlfQVNfR0Mobyk7IFwKKyAgICBpZiAoZy0+Z2MuZ2NfcmVmcyAhPSBfUHlHQ19SRUZTX1VOVFJBQ0tFRCkgXAorICAgICAgICBQeV9GYXRhbEVycm9yKCJHQyBvYmplY3QgYWxyZWFkeSB0cmFja2VkIik7IFwKKyAgICBnLT5nYy5nY19yZWZzID0gX1B5R0NfUkVGU19SRUFDSEFCTEU7IFwKKyAgICBnLT5nYy5nY19uZXh0ID0gX1B5R0NfZ2VuZXJhdGlvbjA7IFwKKyAgICBnLT5nYy5nY19wcmV2ID0gX1B5R0NfZ2VuZXJhdGlvbjAtPmdjLmdjX3ByZXY7IFwKKyAgICBnLT5nYy5nY19wcmV2LT5nYy5nY19uZXh0ID0gZzsgXAorICAgIF9QeUdDX2dlbmVyYXRpb24wLT5nYy5nY19wcmV2ID0gZzsgXAogICAgIH0gd2hpbGUgKDApOwogCiAvKiBUZWxsIHRoZSBHQyB0byBzdG9wIHRyYWNraW5nIHRoaXMgb2JqZWN0LgpAQCAtMjc3LDEyICsyNzcsMTIgQEAKICAqIHdheSB0byBwcm92b2tlIG1lbW9yeSBlcnJvcnMgaWYgY2FsbGluZyBjb2RlIGlzIGNvbmZ1c2VkLgogICovCiAjZGVmaW5lIF9QeU9iamVjdF9HQ19VTlRSQUNLKG8pIGRvIHsgXAotCVB5R0NfSGVhZCAqZyA9IF9QeV9BU19HQyhvKTsgXAotCWFzc2VydChnLT5nYy5nY19yZWZzICE9IF9QeUdDX1JFRlNfVU5UUkFDS0VEKTsgXAotCWctPmdjLmdjX3JlZnMgPSBfUHlHQ19SRUZTX1VOVFJBQ0tFRDsgXAotCWctPmdjLmdjX3ByZXYtPmdjLmdjX25leHQgPSBnLT5nYy5nY19uZXh0OyBcCi0JZy0+Z2MuZ2NfbmV4dC0+Z2MuZ2NfcHJldiA9IGctPmdjLmdjX3ByZXY7IFwKLQlnLT5nYy5nY19uZXh0ID0gTlVMTDsgXAorICAgIFB5R0NfSGVhZCAqZyA9IF9QeV9BU19HQyhvKTsgXAorICAgIGFzc2VydChnLT5nYy5nY19yZWZzICE9IF9QeUdDX1JFRlNfVU5UUkFDS0VEKTsgXAorICAgIGctPmdjLmdjX3JlZnMgPSBfUHlHQ19SRUZTX1VOVFJBQ0tFRDsgXAorICAgIGctPmdjLmdjX3ByZXYtPmdjLmdjX25leHQgPSBnLT5nYy5nY19uZXh0OyBcCisgICAgZy0+Z2MuZ2NfbmV4dC0+Z2MuZ2NfcHJldiA9IGctPmdjLmdjX3ByZXY7IFwKKyAgICBnLT5nYy5nY19uZXh0ID0gTlVMTDsgXAogICAgIH0gd2hpbGUgKDApOwogCiBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIF9QeU9iamVjdF9HQ19NYWxsb2Moc2l6ZV90KTsKQEAgLTI5Myw5ICsyOTMsOSBAQAogUHlBUElfRlVOQyh2b2lkKSBQeU9iamVjdF9HQ19EZWwodm9pZCAqKTsKIAogI2RlZmluZSBQeU9iamVjdF9HQ19OZXcodHlwZSwgdHlwZW9iaikgXAotCQkoICh0eXBlICopIF9QeU9iamVjdF9HQ19OZXcodHlwZW9iaikgKQorICAgICAgICAgICAgICAgICggKHR5cGUgKikgX1B5T2JqZWN0X0dDX05ldyh0eXBlb2JqKSApCiAjZGVmaW5lIFB5T2JqZWN0X0dDX05ld1Zhcih0eXBlLCB0eXBlb2JqLCBuKSBcCi0JCSggKHR5cGUgKikgX1B5T2JqZWN0X0dDX05ld1ZhcigodHlwZW9iaiksIChuKSkgKQorICAgICAgICAgICAgICAgICggKHR5cGUgKikgX1B5T2JqZWN0X0dDX05ld1ZhcigodHlwZW9iaiksIChuKSkgKQogCiAKIC8qIFV0aWxpdHkgbWFjcm8gdG8gaGVscCB3cml0ZSB0cF90cmF2ZXJzZSBmdW5jdGlvbnMuCkBAIC0zMDMsMTQgKzMwMywxNCBAQAogICogInZpc2l0IiBhbmQgImFyZyIuICBUaGlzIGlzIGludGVuZGVkIHRvIGtlZXAgdHBfdHJhdmVyc2UgZnVuY3Rpb25zCiAgKiBsb29raW5nIGFzIG11Y2ggYWxpa2UgYXMgcG9zc2libGUuCiAgKi8KLSNkZWZpbmUgUHlfVklTSVQob3ApCQkJCQkJCVwKLSAgICAgICAgZG8geyAJCQkJCQkJCVwKLSAgICAgICAgICAgICAgICBpZiAob3ApIHsJCQkJCQlcCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgdnJldCA9IHZpc2l0KChQeU9iamVjdCAqKShvcCksIGFyZyk7CVwKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2cmV0KQkJCQkJXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdnJldDsJCQkJXAotICAgICAgICAgICAgICAgIH0JCQkJCQkJXAotICAgICAgICB9IHdoaWxlICgwKQorI2RlZmluZSBQeV9WSVNJVChvcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAob3ApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaW50IHZyZXQgPSB2aXNpdCgoUHlPYmplY3QgKikob3ApLCBhcmcpOyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKHZyZXQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHJldHVybiB2cmV0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKDApCiAKIC8qIFRoaXMgaXMgaGVyZSBmb3IgdGhlIHNha2Ugb2YgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuICBFeHRlbnNpb25zIHRoYXQKICAqIHVzZSB0aGUgb2xkIEdDIEFQSSB3aWxsIHN0aWxsIGNvbXBpbGUgYnV0IHRoZSBvYmplY3RzIHdpbGwgbm90IGJlCkBAIC0zMjQsMTEgKzMyNCwxMSBAQAogCiAvKiBUZXN0IGlmIGEgdHlwZSBzdXBwb3J0cyB3ZWFrIHJlZmVyZW5jZXMgKi8KICNkZWZpbmUgUHlUeXBlX1NVUFBPUlRTX1dFQUtSRUZTKHQpIFwKLSAgICAgICAgKFB5VHlwZV9IYXNGZWF0dXJlKCh0KSwgUHlfVFBGTEFHU19IQVZFX1dFQUtSRUZTKSBcCi0gICAgICAgICAmJiAoKHQpLT50cF93ZWFrbGlzdG9mZnNldCA+IDApKQorICAgIChQeVR5cGVfSGFzRmVhdHVyZSgodCksIFB5X1RQRkxBR1NfSEFWRV9XRUFLUkVGUykgXAorICAgICAmJiAoKHQpLT50cF93ZWFrbGlzdG9mZnNldCA+IDApKQogCiAjZGVmaW5lIFB5T2JqZWN0X0dFVF9XRUFLUkVGU19MSVNUUFRSKG8pIFwKLQkoKFB5T2JqZWN0ICoqKSAoKChjaGFyICopIChvKSkgKyBQeV9UWVBFKG8pLT50cF93ZWFrbGlzdG9mZnNldCkpCisgICAgKChQeU9iamVjdCAqKikgKCgoY2hhciAqKSAobykpICsgUHlfVFlQRShvKS0+dHBfd2Vha2xpc3RvZmZzZXQpKQogCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KZGlmZiAtLWdpdCBhL0luY2x1ZGUvcHllcnJvcnMuaCBiL0luY2x1ZGUvcHllcnJvcnMuaAppbmRleCBhNDIzM2M5Li5lNGY1ZGY2IDEwMDY0NAotLS0gYS9JbmNsdWRlL3B5ZXJyb3JzLmgKKysrIGIvSW5jbHVkZS9weWVycm9ycy5oCkBAIC05NCwyNSArOTQsMjUgQEAKIAogLyogKi8KIAotI2RlZmluZSBQeUV4Y2VwdGlvbkNsYXNzX0NoZWNrKHgpCQkJCQlcCi0JKFB5Q2xhc3NfQ2hlY2soKHgpKSB8fCAoUHlUeXBlX0NoZWNrKCh4KSkgJiYJCQlcCi0JICBQeVR5cGVfRmFzdFN1YmNsYXNzKChQeVR5cGVPYmplY3QqKSh4KSwgUHlfVFBGTEFHU19CQVNFX0VYQ19TVUJDTEFTUykpKQorI2RlZmluZSBQeUV4Y2VwdGlvbkNsYXNzX0NoZWNrKHgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChQeUNsYXNzX0NoZWNrKCh4KSkgfHwgKFB5VHlwZV9DaGVjaygoeCkpICYmICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgUHlUeXBlX0Zhc3RTdWJjbGFzcygoUHlUeXBlT2JqZWN0KikoeCksIFB5X1RQRkxBR1NfQkFTRV9FWENfU1VCQ0xBU1MpKSkKIAotI2RlZmluZSBQeUV4Y2VwdGlvbkluc3RhbmNlX0NoZWNrKHgpCQkJXAotCShQeUluc3RhbmNlX0NoZWNrKCh4KSkgfHwJCQlcCi0JIFB5VHlwZV9GYXN0U3ViY2xhc3MoKHgpLT5vYl90eXBlLCBQeV9UUEZMQUdTX0JBU0VfRVhDX1NVQkNMQVNTKSkKKyNkZWZpbmUgUHlFeGNlcHRpb25JbnN0YW5jZV9DaGVjayh4KSAgICAgICAgICAgICAgICAgICAgXAorICAgIChQeUluc3RhbmNlX0NoZWNrKCh4KSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIFB5VHlwZV9GYXN0U3ViY2xhc3MoKHgpLT5vYl90eXBlLCBQeV9UUEZMQUdTX0JBU0VfRVhDX1NVQkNMQVNTKSkKIAotI2RlZmluZSBQeUV4Y2VwdGlvbkNsYXNzX05hbWUoeCkJCQkJICAgXAotCShQeUNsYXNzX0NoZWNrKCh4KSkJCQkJCSAgIFwKLQkgPyBQeVN0cmluZ19BU19TVFJJTkcoKChQeUNsYXNzT2JqZWN0KikoeCkpLT5jbF9uYW1lKQkgICBcCi0JIDogKGNoYXIgKikoKChQeVR5cGVPYmplY3QqKSh4KSktPnRwX25hbWUpKQorI2RlZmluZSBQeUV4Y2VwdGlvbkNsYXNzX05hbWUoeCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoUHlDbGFzc19DaGVjaygoeCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgID8gUHlTdHJpbmdfQVNfU1RSSU5HKCgoUHlDbGFzc09iamVjdCopKHgpKS0+Y2xfbmFtZSkgICAgICAgICAgXAorICAgICA6IChjaGFyICopKCgoUHlUeXBlT2JqZWN0KikoeCkpLT50cF9uYW1lKSkKIAotI2RlZmluZSBQeUV4Y2VwdGlvbkluc3RhbmNlX0NsYXNzKHgpCQkJCQlcCi0JKChQeUluc3RhbmNlX0NoZWNrKCh4KSkJCQkJCQlcCi0JICA/IChQeU9iamVjdCopKChQeUluc3RhbmNlT2JqZWN0KikoeCkpLT5pbl9jbGFzcwkJXAotCSAgOiAoUHlPYmplY3QqKSgoeCktPm9iX3R5cGUpKSkKKyNkZWZpbmUgUHlFeGNlcHRpb25JbnN0YW5jZV9DbGFzcyh4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKFB5SW5zdGFuY2VfQ2hlY2soKHgpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgID8gKFB5T2JqZWN0KikoKFB5SW5zdGFuY2VPYmplY3QqKSh4KSktPmluX2NsYXNzICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIDogKFB5T2JqZWN0KikoKHgpLT5vYl90eXBlKSkpCiAKLQkKKwogLyogUHJlZGVmaW5lZCBleGNlcHRpb25zICovCiAKIFB5QVBJX0RBVEEoUHlPYmplY3QgKikgUHlFeGNfQmFzZUV4Y2VwdGlvbjsKQEAgLTE4NCwzMyArMTg0LDMzIEBACiBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5RXJyX05vTWVtb3J5KHZvaWQpOwogUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUVycl9TZXRGcm9tRXJybm8oUHlPYmplY3QgKik7CiBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5RXJyX1NldEZyb21FcnJub1dpdGhGaWxlbmFtZU9iamVjdCgKLQlQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKKyAgICBQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlFcnJfU2V0RnJvbUVycm5vV2l0aEZpbGVuYW1lKFB5T2JqZWN0ICosIGNoYXIgKik7CiAjaWZkZWYgUHlfV0lOX1dJREVfRklMRU5BTUVTCiBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5RXJyX1NldEZyb21FcnJub1dpdGhVbmljb2RlRmlsZW5hbWUoCi0JUHlPYmplY3QgKiwgUHlfVU5JQ09ERSAqKTsKKyAgICBQeU9iamVjdCAqLCBQeV9VTklDT0RFICopOwogI2VuZGlmIC8qIFB5X1dJTl9XSURFX0ZJTEVOQU1FUyAqLwogCiBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5RXJyX0Zvcm1hdChQeU9iamVjdCAqLCBjb25zdCBjaGFyICosIC4uLikKLQkJCVB5X0dDQ19BVFRSSUJVVEUoKGZvcm1hdChwcmludGYsIDIsIDMpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBQeV9HQ0NfQVRUUklCVVRFKChmb3JtYXQocHJpbnRmLCAyLCAzKSkpOwogCiAjaWZkZWYgTVNfV0lORE9XUwogUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUVycl9TZXRGcm9tV2luZG93c0VycldpdGhGaWxlbmFtZU9iamVjdCgKLQlpbnQsIGNvbnN0IGNoYXIgKik7CisgICAgaW50LCBjb25zdCBjaGFyICopOwogUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUVycl9TZXRGcm9tV2luZG93c0VycldpdGhGaWxlbmFtZSgKLQlpbnQsIGNvbnN0IGNoYXIgKik7CisgICAgaW50LCBjb25zdCBjaGFyICopOwogI2lmZGVmIFB5X1dJTl9XSURFX0ZJTEVOQU1FUwogUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUVycl9TZXRGcm9tV2luZG93c0VycldpdGhVbmljb2RlRmlsZW5hbWUoCi0JaW50LCBjb25zdCBQeV9VTklDT0RFICopOworICAgIGludCwgY29uc3QgUHlfVU5JQ09ERSAqKTsKICNlbmRpZiAvKiBQeV9XSU5fV0lERV9GSUxFTkFNRVMgKi8KIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnIoaW50KTsKIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlFcnJfU2V0RXhjRnJvbVdpbmRvd3NFcnJXaXRoRmlsZW5hbWVPYmplY3QoCi0JUHlPYmplY3QgKixpbnQsIFB5T2JqZWN0ICopOworICAgIFB5T2JqZWN0ICosaW50LCBQeU9iamVjdCAqKTsKIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlFcnJfU2V0RXhjRnJvbVdpbmRvd3NFcnJXaXRoRmlsZW5hbWUoCi0JUHlPYmplY3QgKixpbnQsIGNvbnN0IGNoYXIgKik7CisgICAgUHlPYmplY3QgKixpbnQsIGNvbnN0IGNoYXIgKik7CiAjaWZkZWYgUHlfV0lOX1dJREVfRklMRU5BTUVTCiBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5RXJyX1NldEV4Y0Zyb21XaW5kb3dzRXJyV2l0aFVuaWNvZGVGaWxlbmFtZSgKLQlQeU9iamVjdCAqLGludCwgY29uc3QgUHlfVU5JQ09ERSAqKTsKKyAgICBQeU9iamVjdCAqLGludCwgY29uc3QgUHlfVU5JQ09ERSAqKTsKICNlbmRpZiAvKiBQeV9XSU5fV0lERV9GSUxFTkFNRVMgKi8KIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlFcnJfU2V0RXhjRnJvbVdpbmRvd3NFcnIoUHlPYmplY3QgKiwgaW50KTsKICNlbmRpZiAvKiBNU19XSU5ET1dTICovCkBAIC0yNDQsMTUgKzI0NCwxNSBAQAogCiAvKiBjcmVhdGUgYSBVbmljb2RlRGVjb2RlRXJyb3Igb2JqZWN0ICovCiBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5VW5pY29kZURlY29kZUVycm9yX0NyZWF0ZSgKLQljb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgUHlfc3NpemVfdCwgUHlfc3NpemVfdCwgUHlfc3NpemVfdCwgY29uc3QgY2hhciAqKTsKKyAgICBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgUHlfc3NpemVfdCwgUHlfc3NpemVfdCwgUHlfc3NpemVfdCwgY29uc3QgY2hhciAqKTsKIAogLyogY3JlYXRlIGEgVW5pY29kZUVuY29kZUVycm9yIG9iamVjdCAqLwogUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeVVuaWNvZGVFbmNvZGVFcnJvcl9DcmVhdGUoCi0JY29uc3QgY2hhciAqLCBjb25zdCBQeV9VTklDT0RFICosIFB5X3NzaXplX3QsIFB5X3NzaXplX3QsIFB5X3NzaXplX3QsIGNvbnN0IGNoYXIgKik7CisgICAgY29uc3QgY2hhciAqLCBjb25zdCBQeV9VTklDT0RFICosIFB5X3NzaXplX3QsIFB5X3NzaXplX3QsIFB5X3NzaXplX3QsIGNvbnN0IGNoYXIgKik7CiAKIC8qIGNyZWF0ZSBhIFVuaWNvZGVUcmFuc2xhdGVFcnJvciBvYmplY3QgKi8KIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlVbmljb2RlVHJhbnNsYXRlRXJyb3JfQ3JlYXRlKAotCWNvbnN0IFB5X1VOSUNPREUgKiwgUHlfc3NpemVfdCwgUHlfc3NpemVfdCwgUHlfc3NpemVfdCwgY29uc3QgY2hhciAqKTsKKyAgICBjb25zdCBQeV9VTklDT0RFICosIFB5X3NzaXplX3QsIFB5X3NzaXplX3QsIFB5X3NzaXplX3QsIGNvbnN0IGNoYXIgKik7CiAKIC8qIGdldCB0aGUgZW5jb2RpbmcgYXR0cmlidXRlICovCiBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5VW5pY29kZUVuY29kZUVycm9yX0dldEVuY29kaW5nKFB5T2JqZWN0ICopOwpAQCAtMjk1LDExICsyOTUsMTEgQEAKIC8qIGFzc2lnbiBhIG5ldyB2YWx1ZSB0byB0aGUgcmVhc29uIGF0dHJpYnV0ZQogICAgcmV0dXJuIDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZSAqLwogUHlBUElfRlVOQyhpbnQpIFB5VW5pY29kZUVuY29kZUVycm9yX1NldFJlYXNvbigKLQlQeU9iamVjdCAqLCBjb25zdCBjaGFyICopOworICAgIFB5T2JqZWN0ICosIGNvbnN0IGNoYXIgKik7CiBQeUFQSV9GVU5DKGludCkgUHlVbmljb2RlRGVjb2RlRXJyb3JfU2V0UmVhc29uKAotCVB5T2JqZWN0ICosIGNvbnN0IGNoYXIgKik7CisgICAgUHlPYmplY3QgKiwgY29uc3QgY2hhciAqKTsKIFB5QVBJX0ZVTkMoaW50KSBQeVVuaWNvZGVUcmFuc2xhdGVFcnJvcl9TZXRSZWFzb24oCi0JUHlPYmplY3QgKiwgY29uc3QgY2hhciAqKTsKKyAgICBQeU9iamVjdCAqLCBjb25zdCBjaGFyICopOwogI2VuZGlmCiAKIApAQCAtMzE5LDkgKzMxOSw5IEBACiAKICNpbmNsdWRlIDxzdGRhcmcuaD4KIFB5QVBJX0ZVTkMoaW50KSBQeU9TX3NucHJpbnRmKGNoYXIgKnN0ciwgc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIgICpmb3JtYXQsIC4uLikKLQkJCVB5X0dDQ19BVFRSSUJVVEUoKGZvcm1hdChwcmludGYsIDMsIDQpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBQeV9HQ0NfQVRUUklCVVRFKChmb3JtYXQocHJpbnRmLCAzLCA0KSkpOwogUHlBUElfRlVOQyhpbnQpIFB5T1NfdnNucHJpbnRmKGNoYXIgKnN0ciwgc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIgICpmb3JtYXQsIHZhX2xpc3QgdmEpCi0JCQlQeV9HQ0NfQVRUUklCVVRFKChmb3JtYXQocHJpbnRmLCAzLCAwKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgUHlfR0NDX0FUVFJJQlVURSgoZm9ybWF0KHByaW50ZiwgMywgMCkpKTsKIAogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CmRpZmYgLS1naXQgYS9JbmNsdWRlL3B5bWFjY29uZmlnLmggYi9JbmNsdWRlL3B5bWFjY29uZmlnLmgKaW5kZXggYjJjYzBiNy4uZmUzYTZkZSAxMDA2NDQKLS0tIGEvSW5jbHVkZS9weW1hY2NvbmZpZy5oCisrKyBiL0luY2x1ZGUvcHltYWNjb25maWcuaApAQCAtNCw3ICs0LDcgQEAKICAgICAgICogVGhpcyBmaWxlIG1vdmVzIHNvbWUgb2YgdGhlIGF1dG9jb25mIG1hZ2ljIHRvIGNvbXBpbGUtdGltZQogICAgICAgKiB3aGVuIGJ1aWxkaW5nIG9uIE1hY09TWC4gVGhpcyBpcyBuZWVkZWQgZm9yIGJ1aWxkaW5nIDQtd2F5CiAgICAgICAqIHVuaXZlcnNhbCBiaW5hcmllcyBhbmQgZm9yIDY0LWJpdCB1bml2ZXJzYWwgYmluYXJpZXMgYmVjYXVzZQotICAgICAgKiB0aGUgdmFsdWVzIHJlZGVmaW5lZCBiZWxvdyBhcmVuJ3QgY29uZmlndXJlLXRpbWUgY29uc3RhbnQgYnV0IAorICAgICAgKiB0aGUgdmFsdWVzIHJlZGVmaW5lZCBiZWxvdyBhcmVuJ3QgY29uZmlndXJlLXRpbWUgY29uc3RhbnQgYnV0CiAgICAgICAqIG9ubHkgY29tcGlsZS10aW1lIGNvbnN0YW50IGluIHRoZXNlIHNjZW5hcmlvcy4KICAgICAgICovCiAKQEAgLTMwLDM2ICszMCwzNiBAQAogCiAjICAgIHVuZGVmIFNJWkVPRl9MT05HCiAjICAgIGlmZGVmIF9fTFA2NF9fCi0jCSBkZWZpbmUgU0laRU9GX19CT09MCQkxCi0jICAgICAgICBkZWZpbmUgU0laRU9GX19CT09MCQkxCi0jICAgICAgICBkZWZpbmUgU0laRU9GX0xPTkcgCQk4Ci0jICAgICAgICBkZWZpbmUgU0laRU9GX1BUSFJFQURfVCAJOAotIyAgICAgICAgZGVmaW5lIFNJWkVPRl9TSVpFX1QgCQk4Ci0jICAgICAgICBkZWZpbmUgU0laRU9GX1RJTUVfVCAJCTgKLSMgICAgICAgIGRlZmluZSBTSVpFT0ZfVk9JRF9QIAkJOAorIyAgICAgICAgZGVmaW5lIFNJWkVPRl9fQk9PTCAgICAgICAgICAgIDEKKyMgICAgICAgIGRlZmluZSBTSVpFT0ZfX0JPT0wgICAgICAgICAgICAxCisjICAgICAgICBkZWZpbmUgU0laRU9GX0xPTkcgICAgICAgICAgICAgOAorIyAgICAgICAgZGVmaW5lIFNJWkVPRl9QVEhSRUFEX1QgICAgICAgIDgKKyMgICAgICAgIGRlZmluZSBTSVpFT0ZfU0laRV9UICAgICAgICAgICA4CisjICAgICAgICBkZWZpbmUgU0laRU9GX1RJTUVfVCAgICAgICAgICAgOAorIyAgICAgICAgZGVmaW5lIFNJWkVPRl9WT0lEX1AgICAgICAgICAgIDgKICMgICAgZWxzZQogIyAgICAgICAgaWZkZWYgX19wcGNfXwotIwkgICAgZGVmaW5lIFNJWkVPRl9fQk9PTAkJNAorIyAgICAgICAgICAgZGVmaW5lIFNJWkVPRl9fQk9PTCAgICAgICAgIDQKICMgICAgICAgIGVsc2UKLSMJICAgIGRlZmluZSBTSVpFT0ZfX0JPT0wJCTEKKyMgICAgICAgICAgIGRlZmluZSBTSVpFT0ZfX0JPT0wgICAgICAgICAxCiAjICAgICAgICBlbmRpZgotIyAgICAgICAgZGVmaW5lIFNJWkVPRl9MT05HIAkJNAotIyAgICAgICAgZGVmaW5lIFNJWkVPRl9QVEhSRUFEX1QgCTQKLSMgICAgICAgIGRlZmluZSBTSVpFT0ZfU0laRV9UIAkJNAotIyAgICAgICAgZGVmaW5lIFNJWkVPRl9USU1FX1QgCQk0Ci0jICAgICAgICBkZWZpbmUgU0laRU9GX1ZPSURfUCAJCTQKKyMgICAgICAgIGRlZmluZSBTSVpFT0ZfTE9ORyAgICAgICAgICAgICA0CisjICAgICAgICBkZWZpbmUgU0laRU9GX1BUSFJFQURfVCAgICAgICAgNAorIyAgICAgICAgZGVmaW5lIFNJWkVPRl9TSVpFX1QgICAgICAgICAgIDQKKyMgICAgICAgIGRlZmluZSBTSVpFT0ZfVElNRV9UICAgICAgICAgICA0CisjICAgICAgICBkZWZpbmUgU0laRU9GX1ZPSURfUCAgICAgICAgICAgNAogIyAgICBlbmRpZgogCiAjICAgIGlmIGRlZmluZWQoX19MUDY0X18pCi0JIC8qIE1hY09TWCAxMC40ICh0aGUgZmlyc3QgcmVsZWFzZSB0byBzdXBwcG9ydCA2NC1iaXQgY29kZQotCSAgKiBhdCBhbGwpIG9ubHkgc3VwcG9ydHMgNjQtYml0IGluIHRoZSBVTklYIGxheWVyLiAKLQkgICogVGhlcmVmb3JlIHN1cnByZXNzIHRoZSB0b29sYm94LWdsdWUgaW4gNjQtYml0IG1vZGUuCi0JICAqLworICAgICAvKiBNYWNPU1ggMTAuNCAodGhlIGZpcnN0IHJlbGVhc2UgdG8gc3VwcHBvcnQgNjQtYml0IGNvZGUKKyAgICAgICogYXQgYWxsKSBvbmx5IHN1cHBvcnRzIDY0LWJpdCBpbiB0aGUgVU5JWCBsYXllci4KKyAgICAgICogVGhlcmVmb3JlIHN1cnByZXNzIHRoZSB0b29sYm94LWdsdWUgaW4gNjQtYml0IG1vZGUuCisgICAgICAqLwogCi0JLyogSW4gNjQtYml0IG1vZGUgc2V0cGdycCBhbHdheXMgaGFzIG5vIGFyZ21lbnRzLCBpbiAzMi1iaXQKLQkgKiBtb2RlIHRoYXQgZGVwZW5kcyBvbiB0aGUgY29tcGlsYXRpb24gZW52aXJvbm1lbnQKLQkgKi8KLSMJdW5kZWYgU0VUUEdSUF9IQVZFX0FSRworICAgIC8qIEluIDY0LWJpdCBtb2RlIHNldHBncnAgYWx3YXlzIGhhcyBubyBhcmdtZW50cywgaW4gMzItYml0CisgICAgICogbW9kZSB0aGF0IGRlcGVuZHMgb24gdGhlIGNvbXBpbGF0aW9uIGVudmlyb25tZW50CisgICAgICovCisjICAgICAgIHVuZGVmIFNFVFBHUlBfSEFWRV9BUkcKIAogIyAgICBlbmRpZgogCkBAIC02NywxNyArNjcsMTcgQEAKICNkZWZpbmUgV09SRFNfQklHRU5ESUFOIDEKICNlbmRpZiAvKiBfX0JJR19FTkRJQU4gKi8KIAotCS8qIAotCSAqIFRoZSBkZWZpbml0aW9uIGluIHB5Y29uZmlnLmggaXMgb25seSB2YWxpZCBvbiB0aGUgT1MgcmVsZWFzZQotCSAqIHdoZXJlIGNvbmZpZ3VyZSByYW4gb24gYW5kIG5vdCBuZWNlc3NhcmlseSBmb3IgYWxsIHN5c3RlbXMgd2hlcmUKLQkgKiB0aGUgZXhlY3V0YWJsZSBjYW4gYmUgdXNlZCBvbi4gCi0JICogCi0JICogU3BlY2lmaWNhbGx5OiBPU1ggMTAuNCBoYXMgbGltaXRlZCBzdXBwb3J0ZWQgZm9yICclemQnLCB3aGlsZQotCSAqIDEwLjUgaGFzIGZ1bGwgc3VwcG9ydCBmb3IgJyV6ZCcuIEEgYmluYXJ5IGJ1aWx0IG9uIDEwLjUgd29uJ3QKLQkgKiB3b3JrIHByb3Blcmx5IG9uIDEwLjQgdW5sZXNzIHdlIHN1cnByZXNzIHRoZSBkZWZpbml0aW9uCi0JICogb2YgUFlfRk9STUFUX1NJWkVfVAotCSAqLwotI3VuZGVmCVBZX0ZPUk1BVF9TSVpFX1QKKyAgICAvKgorICAgICAqIFRoZSBkZWZpbml0aW9uIGluIHB5Y29uZmlnLmggaXMgb25seSB2YWxpZCBvbiB0aGUgT1MgcmVsZWFzZQorICAgICAqIHdoZXJlIGNvbmZpZ3VyZSByYW4gb24gYW5kIG5vdCBuZWNlc3NhcmlseSBmb3IgYWxsIHN5c3RlbXMgd2hlcmUKKyAgICAgKiB0aGUgZXhlY3V0YWJsZSBjYW4gYmUgdXNlZCBvbi4KKyAgICAgKgorICAgICAqIFNwZWNpZmljYWxseTogT1NYIDEwLjQgaGFzIGxpbWl0ZWQgc3VwcG9ydGVkIGZvciAnJXpkJywgd2hpbGUKKyAgICAgKiAxMC41IGhhcyBmdWxsIHN1cHBvcnQgZm9yICclemQnLiBBIGJpbmFyeSBidWlsdCBvbiAxMC41IHdvbid0CisgICAgICogd29yayBwcm9wZXJseSBvbiAxMC40IHVubGVzcyB3ZSBzdXJwcmVzcyB0aGUgZGVmaW5pdGlvbgorICAgICAqIG9mIFBZX0ZPUk1BVF9TSVpFX1QKKyAgICAgKi8KKyN1bmRlZiAgUFlfRk9STUFUX1NJWkVfVAogCiAKICNlbmRpZiAvKiBkZWZpbmVkKF9BUFBMRV9fKSAqLwpkaWZmIC0tZ2l0IGEvSW5jbHVkZS9weXBvcnQuaCBiL0luY2x1ZGUvcHlwb3J0LmgKaW5kZXggNjRiYmIwMy4uZWQ1ZmM1NiAxMDA2NDQKLS0tIGEvSW5jbHVkZS9weXBvcnQuaAorKysgYi9JbmNsdWRlL3B5cG9ydC5oCkBAIC04NiwyMCArODYsMjAgQEAKICAqIGludGVncmFsIHR5cGUuCiAgKi8KICNpZmRlZiBIQVZFX1VJTlRQVFJfVAotdHlwZWRlZiB1aW50cHRyX3QJUHlfdWludHB0cl90OwotdHlwZWRlZiBpbnRwdHJfdAlQeV9pbnRwdHJfdDsKK3R5cGVkZWYgdWludHB0cl90ICAgICAgIFB5X3VpbnRwdHJfdDsKK3R5cGVkZWYgaW50cHRyX3QgICAgICAgIFB5X2ludHB0cl90OwogCiAjZWxpZiBTSVpFT0ZfVk9JRF9QIDw9IFNJWkVPRl9JTlQKLXR5cGVkZWYgdW5zaWduZWQgaW50CVB5X3VpbnRwdHJfdDsKLXR5cGVkZWYgaW50CQlQeV9pbnRwdHJfdDsKK3R5cGVkZWYgdW5zaWduZWQgaW50ICAgIFB5X3VpbnRwdHJfdDsKK3R5cGVkZWYgaW50ICAgICAgICAgICAgIFB5X2ludHB0cl90OwogCiAjZWxpZiBTSVpFT0ZfVk9JRF9QIDw9IFNJWkVPRl9MT05HCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcJUHlfdWludHB0cl90OwotdHlwZWRlZiBsb25nCQlQeV9pbnRwdHJfdDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyAgIFB5X3VpbnRwdHJfdDsKK3R5cGVkZWYgbG9uZyAgICAgICAgICAgIFB5X2ludHB0cl90OwogCiAjZWxpZiBkZWZpbmVkKEhBVkVfTE9OR19MT05HKSAmJiAoU0laRU9GX1ZPSURfUCA8PSBTSVpFT0ZfTE9OR19MT05HKQotdHlwZWRlZiB1bnNpZ25lZCBQWV9MT05HX0xPTkcJUHlfdWludHB0cl90OwotdHlwZWRlZiBQWV9MT05HX0xPTkcJCVB5X2ludHB0cl90OwordHlwZWRlZiB1bnNpZ25lZCBQWV9MT05HX0xPTkcgICBQeV91aW50cHRyX3Q7Cit0eXBlZGVmIFBZX0xPTkdfTE9ORyAgICAgICAgICAgIFB5X2ludHB0cl90OwogCiAjZWxzZQogIyAgIGVycm9yICJQeXRob24gbmVlZHMgYSB0eXBlZGVmIGZvciBQeV91aW50cHRyX3QgaW4gcHlwb3J0LmguIgpAQCAtMTEwLDkgKzExMCw5IEBACiAgKiB1bnNpZ25lZCBpbnRlZ3JhbCB0eXBlKS4gIFNlZSBQRVAgMzUzIGZvciBkZXRhaWxzLgogICovCiAjaWZkZWYgSEFWRV9TU0laRV9UCi10eXBlZGVmIHNzaXplX3QJCVB5X3NzaXplX3Q7Cit0eXBlZGVmIHNzaXplX3QgICAgICAgICBQeV9zc2l6ZV90OwogI2VsaWYgU0laRU9GX1ZPSURfUCA9PSBTSVpFT0ZfU0laRV9UCi10eXBlZGVmIFB5X2ludHB0cl90CVB5X3NzaXplX3Q7Cit0eXBlZGVmIFB5X2ludHB0cl90ICAgICBQeV9zc2l6ZV90OwogI2Vsc2UKICMgICBlcnJvciAiUHl0aG9uIG5lZWRzIGEgdHlwZWRlZiBmb3IgUHlfc3NpemVfdCBpbiBweXBvcnQuaC4iCiAjZW5kaWYKQEAgLTEyMCw3ICsxMjAsNyBAQAogLyogTGFyZ2VzdCBwb3NzaWJsZSB2YWx1ZSBvZiBzaXplX3QuCiAgICBTSVpFX01BWCBpcyBwYXJ0IG9mIEM5OSwgc28gaXQgbWlnaHQgYmUgZGVmaW5lZCBvbiBzb21lCiAgICBwbGF0Zm9ybXMuIElmIGl0IGlzIG5vdCBkZWZpbmVkLCAoc2l6ZV90KS0xIGlzIGEgcG9ydGFibGUKLSAgIGRlZmluaXRpb24gZm9yIEM4OSwgZHVlIHRvIHRoZSB3YXkgc2lnbmVkLT51bnNpZ25lZCAKKyAgIGRlZmluaXRpb24gZm9yIEM4OSwgZHVlIHRvIHRoZSB3YXkgc2lnbmVkLT51bnNpZ25lZAogICAgY29udmVyc2lvbiBpcyBkZWZpbmVkLiAqLwogI2lmZGVmIFNJWkVfTUFYCiAjZGVmaW5lIFBZX1NJWkVfTUFYIFNJWkVfTUFYCkBAIC0xOTYsNyArMTk2LDcgQEAKIC8qIGVuYWJsZSBtb3JlIGFnZ3Jlc3NpdmUgb3B0aW1pemF0aW9uIGZvciB2aXN1YWwgc3R1ZGlvICovCiAjcHJhZ21hIG9wdGltaXplKCJhZ3R3Iiwgb24pCiAjZW5kaWYKLS8qIGlnbm9yZSB3YXJuaW5ncyBpZiB0aGUgY29tcGlsZXIgZGVjaWRlcyBub3QgdG8gaW5saW5lIGEgZnVuY3Rpb24gKi8gCisvKiBpZ25vcmUgd2FybmluZ3MgaWYgdGhlIGNvbXBpbGVyIGRlY2lkZXMgbm90IHRvIGlubGluZSBhIGZ1bmN0aW9uICovCiAjcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTogNDcxMCkKIC8qIGZhc3Rlc3QgcG9zc2libGUgbG9jYWwgY2FsbCB1bmRlciBNU1ZDICovCiAjZGVmaW5lIFB5X0xPQ0FMKHR5cGUpIHN0YXRpYyB0eXBlIF9fZmFzdGNhbGwKQEAgLTIxNiwxNiArMjE2LDE2IEBACiAgKi8KIAogI2lmIGRlZmluZWQoX01TQ19WRVIpCi0jZGVmaW5lIFB5X01FTUNQWSh0YXJnZXQsIHNvdXJjZSwgbGVuZ3RoKSBkbyB7CQkJCVwKLQkJc2l6ZV90IGlfLCBuXyA9IChsZW5ndGgpOwkJCQlcCi0JCWNoYXIgKnRfID0gKHZvaWQqKSAodGFyZ2V0KTsJCQkJXAotCQljb25zdCBjaGFyICpzXyA9ICh2b2lkKikgKHNvdXJjZSk7CQkJXAotCQlpZiAobl8gPj0gMTYpCQkJCQkJXAotCQkJbWVtY3B5KHRfLCBzXywgbl8pOwkJCQlcCi0JCWVsc2UJCQkJCQkJXAotCQkJZm9yIChpXyA9IDA7IGlfIDwgbl87IGlfKyspCQkJXAotCQkJCXRfW2lfXSA9IHNfW2lfXTsJCQlcCi0JfSB3aGlsZSAoMCkKKyNkZWZpbmUgUHlfTUVNQ1BZKHRhcmdldCwgc291cmNlLCBsZW5ndGgpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc2l6ZV90IGlfLCBuXyA9IChsZW5ndGgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY2hhciAqdF8gPSAodm9pZCopICh0YXJnZXQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY29uc3QgY2hhciAqc18gPSAodm9pZCopIChzb3VyY2UpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKG5fID49IDE2KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIG1lbWNweSh0Xywgc18sIG5fKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZvciAoaV8gPSAwOyBpXyA8IG5fOyBpXysrKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB0X1tpX10gPSBzX1tpX107ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlICgwKQogI2Vsc2UKICNkZWZpbmUgUHlfTUVNQ1BZIG1lbWNweQogI2VuZGlmCkBAIC0zMzksNyArMzM5LDcgQEAKICAqLwogI2lmZGVmIFNJR05FRF9SSUdIVF9TSElGVF9aRVJPX0ZJTExTCiAjZGVmaW5lIFB5X0FSSVRITUVUSUNfUklHSFRfU0hJRlQoVFlQRSwgSSwgSikgXAotCSgoSSkgPCAwID8gfigofih1bnNpZ25lZCBUWVBFKShJKSkgPj4gKEopKSA6IChJKSA+PiAoSikpCisgICAgKChJKSA8IDAgPyB+KCh+KHVuc2lnbmVkIFRZUEUpKEkpKSA+PiAoSikpIDogKEkpID4+IChKKSkKICNlbHNlCiAjZGVmaW5lIFB5X0FSSVRITUVUSUNfUklHSFRfU0hJRlQoVFlQRSwgSSwgSikgKChJKSA+PiAoSikpCiAjZW5kaWYKQEAgLTM1OSw3ICszNTksNyBAQAogICovCiAjaWZkZWYgUHlfREVCVUcKICNkZWZpbmUgUHlfU0FGRV9ET1dOQ0FTVChWQUxVRSwgV0lERSwgTkFSUk9XKSBcCi0JKGFzc2VydCgoV0lERSkoTkFSUk9XKShWQUxVRSkgPT0gKFZBTFVFKSksIChOQVJST1cpKFZBTFVFKSkKKyAgICAoYXNzZXJ0KChXSURFKShOQVJST1cpKFZBTFVFKSA9PSAoVkFMVUUpKSwgKE5BUlJPVykoVkFMVUUpKQogI2Vsc2UKICNkZWZpbmUgUHlfU0FGRV9ET1dOQ0FTVChWQUxVRSwgV0lERSwgTkFSUk9XKSAoTkFSUk9XKShWQUxVRSkKICNlbmRpZgpAQCAtMzc5LDEzICszNzksMTMgQEAKICNkZWZpbmUgX1B5X1NFVF9FRE9NX0ZPUl9OQU4oWCkgOwogI2VuZGlmCiAjZGVmaW5lIFB5X1NFVF9FUlJOT19PTl9NQVRIX0VSUk9SKFgpIFwKLQlkbyB7IFwKLQkJaWYgKGVycm5vID09IDApIHsgXAotCQkJaWYgKChYKSA9PSBQeV9IVUdFX1ZBTCB8fCAoWCkgPT0gLVB5X0hVR0VfVkFMKSBcCi0JCQkJZXJybm8gPSBFUkFOR0U7IFwKLQkJCWVsc2UgX1B5X1NFVF9FRE9NX0ZPUl9OQU4oWCkgXAotCQl9IFwKLQl9IHdoaWxlKDApCisgICAgZG8geyBcCisgICAgICAgIGlmIChlcnJubyA9PSAwKSB7IFwKKyAgICAgICAgICAgIGlmICgoWCkgPT0gUHlfSFVHRV9WQUwgfHwgKFgpID09IC1QeV9IVUdFX1ZBTCkgXAorICAgICAgICAgICAgICAgIGVycm5vID0gRVJBTkdFOyBcCisgICAgICAgICAgICBlbHNlIF9QeV9TRVRfRURPTV9GT1JfTkFOKFgpIFwKKyAgICAgICAgfSBcCisgICAgfSB3aGlsZSgwKQogCiAvKiBQeV9TRVRfRVJBTkdFX09OX09WRVJGTE9XKHgpCiAgKiBBbiBhbGlhcyBvZiBQeV9TRVRfRVJSTk9fT05fTUFUSF9FUlJPUiBmb3IgYmFja3dhcmQtY29tcGF0aWJpbGl0eS4KQEAgLTQwNiwyNiArNDA2LDI2IEBACiAgKiAgICBUaGlzIGlzbid0IHJlbGlhYmxlLiAgU2VlIFB5X09WRVJGTE9XRUQgY29tbWVudHMuCiAgKiAgICBYIGFuZCBZIG1heSBiZSBldmFsdWF0ZWQgbW9yZSB0aGFuIG9uY2UuCiAgKi8KLSNkZWZpbmUgUHlfQURKVVNUX0VSQU5HRTEoWCkJCQkJCQlcCi0JZG8gewkJCQkJCQkJXAotCQlpZiAoZXJybm8gPT0gMCkgewkJCQkJXAotCQkJaWYgKChYKSA9PSBQeV9IVUdFX1ZBTCB8fCAoWCkgPT0gLVB5X0hVR0VfVkFMKQlcCi0JCQkJZXJybm8gPSBFUkFOR0U7CQkJCVwKLQkJfQkJCQkJCQlcCi0JCWVsc2UgaWYgKGVycm5vID09IEVSQU5HRSAmJiAoWCkgPT0gMC4wKQkJCVwKLQkJCWVycm5vID0gMDsJCQkJCVwKLQl9IHdoaWxlKDApCisjZGVmaW5lIFB5X0FESlVTVF9FUkFOR0UxKFgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChlcnJubyA9PSAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAoKFgpID09IFB5X0hVR0VfVkFMIHx8IChYKSA9PSAtUHlfSFVHRV9WQUwpICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZXJybm8gPSBFUkFOR0U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGVsc2UgaWYgKGVycm5vID09IEVSQU5HRSAmJiAoWCkgPT0gMC4wKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBlcnJubyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSgwKQogCi0jZGVmaW5lIFB5X0FESlVTVF9FUkFOR0UyKFgsIFkpCQkJCQkJXAotCWRvIHsJCQkJCQkJCVwKLQkJaWYgKChYKSA9PSBQeV9IVUdFX1ZBTCB8fCAoWCkgPT0gLVB5X0hVR0VfVkFMIHx8CVwKLQkJICAgIChZKSA9PSBQeV9IVUdFX1ZBTCB8fCAoWSkgPT0gLVB5X0hVR0VfVkFMKSB7CVwKLQkJCQlpZiAoZXJybm8gPT0gMCkJCQkJXAotCQkJCQllcnJubyA9IEVSQU5HRTsJCQlcCi0JCX0JCQkJCQkJXAotCQllbHNlIGlmIChlcnJubyA9PSBFUkFOR0UpCQkJCVwKLQkJCWVycm5vID0gMDsJCQkJCVwKLQl9IHdoaWxlKDApCisjZGVmaW5lIFB5X0FESlVTVF9FUkFOR0UyKFgsIFkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICgoWCkgPT0gUHlfSFVHRV9WQUwgfHwgKFgpID09IC1QeV9IVUdFX1ZBTCB8fCAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAoWSkgPT0gUHlfSFVHRV9WQUwgfHwgKFkpID09IC1QeV9IVUdFX1ZBTCkgeyAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJybm8gPT0gMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vID0gRVJBTkdFOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGVsc2UgaWYgKGVycm5vID09IEVSQU5HRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBlcnJubyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSgwKQogCiAvKiBQeV9ERVBSRUNBVEVEKHZlcnNpb24pCiAgKiBEZWNsYXJlIGEgdmFyaWFibGUsIHR5cGUsIG9yIGZ1bmN0aW9uIGRlcHJlY2F0ZWQuCkBAIC00MzUsNyArNDM1LDcgQEAKICAqICAgIGV4dGVybiBpbnQgeCgpIFB5X0RFUFJFQ0FURUQoMi41KTsKICAqLwogI2lmIGRlZmluZWQoX19HTlVDX18pICYmICgoX19HTlVDX18gPj0gNCkgfHwgXAotCQkJICAoX19HTlVDX18gPT0gMykgJiYgKF9fR05VQ19NSU5PUl9fID49IDEpKQorICAgICAgICAgICAgICAoX19HTlVDX18gPT0gMykgJiYgKF9fR05VQ19NSU5PUl9fID49IDEpKQogI2RlZmluZSBQeV9ERVBSRUNBVEVEKFZFUlNJT05fVU5VU0VEKSBfX2F0dHJpYnV0ZV9fKChfX2RlcHJlY2F0ZWRfXykpCiAjZWxzZQogI2RlZmluZSBQeV9ERVBSRUNBVEVEKFZFUlNJT05fVU5VU0VEKQpAQCAtNDYxLDcgKzQ2MSw3IEBACiAjZW5kaWYKIAogI2lmZGVmIEhBVkVfX0dFVFBUWQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgkJLyogd2UgbmVlZCB0byBpbXBvcnQgbW9kZV90ICovCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+ICAgICAgICAgIC8qIHdlIG5lZWQgdG8gaW1wb3J0IG1vZGVfdCAqLwogZXh0ZXJuIGNoYXIgKiBfZ2V0cHR5KGludCAqLCBpbnQsIG1vZGVfdCwgaW50KTsKICNlbmRpZgogCkBAIC01NjEsNzEgKzU2MSw3MSBAQAogICBsaW5rYWdlIGhhbmRsaW5nIGFuZCBib3RoIG9mIHRoZXNlIHVzZSBfX2RlY2xzcGVjKCkuCiAqLwogI2lmIGRlZmluZWQoX19DWUdXSU5fXykgfHwgZGVmaW5lZChfX0JFT1NfXykKLSMJZGVmaW5lIEhBVkVfREVDTFNQRUNfRExMCisjICAgICAgIGRlZmluZSBIQVZFX0RFQ0xTUEVDX0RMTAogI2VuZGlmCiAKIC8qIG9ubHkgZ2V0IHNwZWNpYWwgbGlua2FnZSBpZiBidWlsdCBhcyBzaGFyZWQgb3IgcGxhdGZvcm0gaXMgQ3lnd2luICovCiAjaWYgZGVmaW5lZChQeV9FTkFCTEVfU0hBUkVEKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCi0jCWlmIGRlZmluZWQoSEFWRV9ERUNMU1BFQ19ETEwpCi0jCQlpZmRlZiBQeV9CVUlMRF9DT1JFCi0jCQkJZGVmaW5lIFB5QVBJX0ZVTkMoUlRZUEUpIF9fZGVjbHNwZWMoZGxsZXhwb3J0KSBSVFlQRQotIwkJCWRlZmluZSBQeUFQSV9EQVRBKFJUWVBFKSBleHRlcm4gX19kZWNsc3BlYyhkbGxleHBvcnQpIFJUWVBFCi0JCQkvKiBtb2R1bGUgaW5pdCBmdW5jdGlvbnMgaW5zaWRlIHRoZSBjb3JlIG5lZWQgbm8gZXh0ZXJuYWwgbGlua2FnZSAqLwotCQkJLyogZXhjZXB0IGZvciBDeWd3aW4gdG8gaGFuZGxlIGVtYmVkZGluZyAoRklYTUU6IEJlT1MgdG9vPykgKi8KLSMJCQlpZiBkZWZpbmVkKF9fQ1lHV0lOX18pCi0jCQkJCWRlZmluZSBQeU1PRElOSVRfRlVOQyBfX2RlY2xzcGVjKGRsbGV4cG9ydCkgdm9pZAotIwkJCWVsc2UgLyogX19DWUdXSU5fXyAqLwotIwkJCQlkZWZpbmUgUHlNT0RJTklUX0ZVTkMgdm9pZAotIwkJCWVuZGlmIC8qIF9fQ1lHV0lOX18gKi8KLSMJCWVsc2UgLyogUHlfQlVJTERfQ09SRSAqLwotCQkJLyogQnVpbGRpbmcgYW4gZXh0ZW5zaW9uIG1vZHVsZSwgb3IgYW4gZW1iZWRkZWQgc2l0dWF0aW9uICovCi0JCQkvKiBwdWJsaWMgUHl0aG9uIGZ1bmN0aW9ucyBhbmQgZGF0YSBhcmUgaW1wb3J0ZWQgKi8KLQkJCS8qIFVuZGVyIEN5Z3dpbiwgYXV0by1pbXBvcnQgZnVuY3Rpb25zIHRvIHByZXZlbnQgY29tcGlsYXRpb24gKi8KLQkJCS8qIGZhaWx1cmVzIHNpbWlsYXIgdG8gaHR0cDovL3B5dGhvbi5vcmcvZG9jL0ZBUS5odG1sIzMuMjQgKi8KLSMJCQlpZiAhZGVmaW5lZChfX0NZR1dJTl9fKQotIwkJCQlkZWZpbmUgUHlBUElfRlVOQyhSVFlQRSkgX19kZWNsc3BlYyhkbGxpbXBvcnQpIFJUWVBFCi0jCQkJZW5kaWYgLyogIV9fQ1lHV0lOX18gKi8KLSMJCQlkZWZpbmUgUHlBUElfREFUQShSVFlQRSkgZXh0ZXJuIF9fZGVjbHNwZWMoZGxsaW1wb3J0KSBSVFlQRQotCQkJLyogbW9kdWxlIGluaXQgZnVuY3Rpb25zIG91dHNpZGUgdGhlIGNvcmUgbXVzdCBiZSBleHBvcnRlZCAqLwotIwkJCWlmIGRlZmluZWQoX19jcGx1c3BsdXMpCi0jCQkJCWRlZmluZSBQeU1PRElOSVRfRlVOQyBleHRlcm4gIkMiIF9fZGVjbHNwZWMoZGxsZXhwb3J0KSB2b2lkCi0jCQkJZWxzZSAvKiBfX2NwbHVzcGx1cyAqLwotIwkJCQlkZWZpbmUgUHlNT0RJTklUX0ZVTkMgX19kZWNsc3BlYyhkbGxleHBvcnQpIHZvaWQKLSMJCQllbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotIwkJZW5kaWYgLyogUHlfQlVJTERfQ09SRSAqLwotIwllbmRpZiAvKiBIQVZFX0RFQ0xTUEVDICovCisjICAgICAgIGlmIGRlZmluZWQoSEFWRV9ERUNMU1BFQ19ETEwpCisjICAgICAgICAgICAgICAgaWZkZWYgUHlfQlVJTERfQ09SRQorIyAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5lIFB5QVBJX0ZVTkMoUlRZUEUpIF9fZGVjbHNwZWMoZGxsZXhwb3J0KSBSVFlQRQorIyAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5lIFB5QVBJX0RBVEEoUlRZUEUpIGV4dGVybiBfX2RlY2xzcGVjKGRsbGV4cG9ydCkgUlRZUEUKKyAgICAgICAgICAgIC8qIG1vZHVsZSBpbml0IGZ1bmN0aW9ucyBpbnNpZGUgdGhlIGNvcmUgbmVlZCBubyBleHRlcm5hbCBsaW5rYWdlICovCisgICAgICAgICAgICAvKiBleGNlcHQgZm9yIEN5Z3dpbiB0byBoYW5kbGUgZW1iZWRkaW5nIChGSVhNRTogQmVPUyB0b28/KSAqLworIyAgICAgICAgICAgICAgICAgICAgICAgaWYgZGVmaW5lZChfX0NZR1dJTl9fKQorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZpbmUgUHlNT0RJTklUX0ZVTkMgX19kZWNsc3BlYyhkbGxleHBvcnQpIHZvaWQKKyMgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgLyogX19DWUdXSU5fXyAqLworIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZpbmUgUHlNT0RJTklUX0ZVTkMgdm9pZAorIyAgICAgICAgICAgICAgICAgICAgICAgZW5kaWYgLyogX19DWUdXSU5fXyAqLworIyAgICAgICAgICAgICAgIGVsc2UgLyogUHlfQlVJTERfQ09SRSAqLworICAgICAgICAgICAgLyogQnVpbGRpbmcgYW4gZXh0ZW5zaW9uIG1vZHVsZSwgb3IgYW4gZW1iZWRkZWQgc2l0dWF0aW9uICovCisgICAgICAgICAgICAvKiBwdWJsaWMgUHl0aG9uIGZ1bmN0aW9ucyBhbmQgZGF0YSBhcmUgaW1wb3J0ZWQgKi8KKyAgICAgICAgICAgIC8qIFVuZGVyIEN5Z3dpbiwgYXV0by1pbXBvcnQgZnVuY3Rpb25zIHRvIHByZXZlbnQgY29tcGlsYXRpb24gKi8KKyAgICAgICAgICAgIC8qIGZhaWx1cmVzIHNpbWlsYXIgdG8gaHR0cDovL3B5dGhvbi5vcmcvZG9jL0ZBUS5odG1sIzMuMjQgKi8KKyMgICAgICAgICAgICAgICAgICAgICAgIGlmICFkZWZpbmVkKF9fQ1lHV0lOX18pCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmluZSBQeUFQSV9GVU5DKFJUWVBFKSBfX2RlY2xzcGVjKGRsbGltcG9ydCkgUlRZUEUKKyMgICAgICAgICAgICAgICAgICAgICAgIGVuZGlmIC8qICFfX0NZR1dJTl9fICovCisjICAgICAgICAgICAgICAgICAgICAgICBkZWZpbmUgUHlBUElfREFUQShSVFlQRSkgZXh0ZXJuIF9fZGVjbHNwZWMoZGxsaW1wb3J0KSBSVFlQRQorICAgICAgICAgICAgLyogbW9kdWxlIGluaXQgZnVuY3Rpb25zIG91dHNpZGUgdGhlIGNvcmUgbXVzdCBiZSBleHBvcnRlZCAqLworIyAgICAgICAgICAgICAgICAgICAgICAgaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5lIFB5TU9ESU5JVF9GVU5DIGV4dGVybiAiQyIgX19kZWNsc3BlYyhkbGxleHBvcnQpIHZvaWQKKyMgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgLyogX19jcGx1c3BsdXMgKi8KKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5lIFB5TU9ESU5JVF9GVU5DIF9fZGVjbHNwZWMoZGxsZXhwb3J0KSB2b2lkCisjICAgICAgICAgICAgICAgICAgICAgICBlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworIyAgICAgICAgICAgICAgIGVuZGlmIC8qIFB5X0JVSUxEX0NPUkUgKi8KKyMgICAgICAgZW5kaWYgLyogSEFWRV9ERUNMU1BFQyAqLwogI2VuZGlmIC8qIFB5X0VOQUJMRV9TSEFSRUQgKi8KIAogLyogSWYgbm8gZXh0ZXJuYWwgbGlua2FnZSBtYWNyb3MgZGVmaW5lZCBieSBub3csIGNyZWF0ZSBkZWZhdWx0cyAqLwogI2lmbmRlZiBQeUFQSV9GVU5DCi0jCWRlZmluZSBQeUFQSV9GVU5DKFJUWVBFKSBSVFlQRQorIyAgICAgICBkZWZpbmUgUHlBUElfRlVOQyhSVFlQRSkgUlRZUEUKICNlbmRpZgogI2lmbmRlZiBQeUFQSV9EQVRBCi0jCWRlZmluZSBQeUFQSV9EQVRBKFJUWVBFKSBleHRlcm4gUlRZUEUKKyMgICAgICAgZGVmaW5lIFB5QVBJX0RBVEEoUlRZUEUpIGV4dGVybiBSVFlQRQogI2VuZGlmCiAjaWZuZGVmIFB5TU9ESU5JVF9GVU5DCi0jCWlmIGRlZmluZWQoX19jcGx1c3BsdXMpCi0jCQlkZWZpbmUgUHlNT0RJTklUX0ZVTkMgZXh0ZXJuICJDIiB2b2lkCi0jCWVsc2UgLyogX19jcGx1c3BsdXMgKi8KLSMJCWRlZmluZSBQeU1PRElOSVRfRlVOQyB2b2lkCi0jCWVuZGlmIC8qIF9fY3BsdXNwbHVzICovCisjICAgICAgIGlmIGRlZmluZWQoX19jcGx1c3BsdXMpCisjICAgICAgICAgICAgICAgZGVmaW5lIFB5TU9ESU5JVF9GVU5DIGV4dGVybiAiQyIgdm9pZAorIyAgICAgICBlbHNlIC8qIF9fY3BsdXNwbHVzICovCisjICAgICAgICAgICAgICAgZGVmaW5lIFB5TU9ESU5JVF9GVU5DIHZvaWQKKyMgICAgICAgZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KICNlbmRpZgogCiAvKiBEZXByZWNhdGVkIERMX0lNUE9SVCBhbmQgRExfRVhQT1JUIG1hY3JvcyAqLwogI2lmIGRlZmluZWQoUHlfRU5BQkxFX1NIQVJFRCkgJiYgZGVmaW5lZCAoSEFWRV9ERUNMU1BFQ19ETEwpCi0jCWlmIGRlZmluZWQoUHlfQlVJTERfQ09SRSkKLSMJCWRlZmluZSBETF9JTVBPUlQoUlRZUEUpIF9fZGVjbHNwZWMoZGxsZXhwb3J0KSBSVFlQRQotIwkJZGVmaW5lIERMX0VYUE9SVChSVFlQRSkgX19kZWNsc3BlYyhkbGxleHBvcnQpIFJUWVBFCi0jCWVsc2UKLSMJCWRlZmluZSBETF9JTVBPUlQoUlRZUEUpIF9fZGVjbHNwZWMoZGxsaW1wb3J0KSBSVFlQRQotIwkJZGVmaW5lIERMX0VYUE9SVChSVFlQRSkgX19kZWNsc3BlYyhkbGxleHBvcnQpIFJUWVBFCi0jCWVuZGlmCisjICAgICAgIGlmIGRlZmluZWQoUHlfQlVJTERfQ09SRSkKKyMgICAgICAgICAgICAgICBkZWZpbmUgRExfSU1QT1JUKFJUWVBFKSBfX2RlY2xzcGVjKGRsbGV4cG9ydCkgUlRZUEUKKyMgICAgICAgICAgICAgICBkZWZpbmUgRExfRVhQT1JUKFJUWVBFKSBfX2RlY2xzcGVjKGRsbGV4cG9ydCkgUlRZUEUKKyMgICAgICAgZWxzZQorIyAgICAgICAgICAgICAgIGRlZmluZSBETF9JTVBPUlQoUlRZUEUpIF9fZGVjbHNwZWMoZGxsaW1wb3J0KSBSVFlQRQorIyAgICAgICAgICAgICAgIGRlZmluZSBETF9FWFBPUlQoUlRZUEUpIF9fZGVjbHNwZWMoZGxsZXhwb3J0KSBSVFlQRQorIyAgICAgICBlbmRpZgogI2VuZGlmCiAjaWZuZGVmIERMX0VYUE9SVAotIwlkZWZpbmUgRExfRVhQT1JUKFJUWVBFKSBSVFlQRQorIyAgICAgICBkZWZpbmUgRExfRVhQT1JUKFJUWVBFKSBSVFlQRQogI2VuZGlmCiAjaWZuZGVmIERMX0lNUE9SVAotIwlkZWZpbmUgRExfSU1QT1JUKFJUWVBFKSBSVFlQRQorIyAgICAgICBkZWZpbmUgRExfSU1QT1JUKFJUWVBFKSBSVFlQRQogI2VuZGlmCiAvKiBFbmQgb2YgZGVwcmVjYXRlZCBETF8qIG1hY3JvcyAqLwogCkBAIC02MzQsMjcgKzYzNCwyNyBAQAogCiAjaWYgMCAvKiBkaXNhYmxlZCBhbmQgcHJvYmFibHkgb2Jzb2xldGUgKi8KIAotI2lmbmRlZglGRF9TRVRTSVpFCi0jZGVmaW5lCUZEX1NFVFNJWkUJMjU2CisjaWZuZGVmIEZEX1NFVFNJWkUKKyNkZWZpbmUgRkRfU0VUU0laRSAgICAgIDI1NgogI2VuZGlmCiAKICNpZm5kZWYgRkRfU0VUCiAKIHR5cGVkZWYgbG9uZyBmZF9tYXNrOwogCi0jZGVmaW5lIE5GREJJVFMJKHNpemVvZihmZF9tYXNrKSAqIE5CQlkpCS8qIGJpdHMgcGVyIG1hc2sgKi8KKyNkZWZpbmUgTkZEQklUUyAoc2l6ZW9mKGZkX21hc2spICogTkJCWSkgICAgICAgIC8qIGJpdHMgcGVyIG1hc2sgKi8KICNpZm5kZWYgaG93bWFueQotI2RlZmluZQlob3dtYW55KHgsIHkpCSgoKHgpKygoeSktMSkpLyh5KSkKKyNkZWZpbmUgaG93bWFueSh4LCB5KSAgICgoKHgpKygoeSktMSkpLyh5KSkKICNlbmRpZiAvKiBob3dtYW55ICovCiAKLXR5cGVkZWYJc3RydWN0IGZkX3NldCB7Ci0JZmRfbWFzawlmZHNfYml0c1tob3dtYW55KEZEX1NFVFNJWkUsIE5GREJJVFMpXTsKK3R5cGVkZWYgc3RydWN0IGZkX3NldCB7CisgICAgZmRfbWFzayAgICAgZmRzX2JpdHNbaG93bWFueShGRF9TRVRTSVpFLCBORkRCSVRTKV07CiB9IGZkX3NldDsKIAotI2RlZmluZQlGRF9TRVQobiwgcCkJKChwKS0+ZmRzX2JpdHNbKG4pL05GREJJVFNdIHw9ICgxIDw8ICgobikgJSBORkRCSVRTKSkpCi0jZGVmaW5lCUZEX0NMUihuLCBwKQkoKHApLT5mZHNfYml0c1sobikvTkZEQklUU10gJj0gfigxIDw8ICgobikgJSBORkRCSVRTKSkpCi0jZGVmaW5lCUZEX0lTU0VUKG4sIHApCSgocCktPmZkc19iaXRzWyhuKS9ORkRCSVRTXSAmICgxIDw8ICgobikgJSBORkRCSVRTKSkpCi0jZGVmaW5lIEZEX1pFUk8ocCkJbWVtc2V0KChjaGFyICopKHApLCAnXDAnLCBzaXplb2YoKihwKSkpCisjZGVmaW5lIEZEX1NFVChuLCBwKSAgICAoKHApLT5mZHNfYml0c1sobikvTkZEQklUU10gfD0gKDEgPDwgKChuKSAlIE5GREJJVFMpKSkKKyNkZWZpbmUgRkRfQ0xSKG4sIHApICAgICgocCktPmZkc19iaXRzWyhuKS9ORkRCSVRTXSAmPSB+KDEgPDwgKChuKSAlIE5GREJJVFMpKSkKKyNkZWZpbmUgRkRfSVNTRVQobiwgcCkgICgocCktPmZkc19iaXRzWyhuKS9ORkRCSVRTXSAmICgxIDw8ICgobikgJSBORkRCSVRTKSkpCisjZGVmaW5lIEZEX1pFUk8ocCkgICAgICBtZW1zZXQoKGNoYXIgKikocCksICdcMCcsIHNpemVvZigqKHApKSkKIAogI2VuZGlmIC8qIEZEX1NFVCAqLwogCmRpZmYgLS1naXQgYS9JbmNsdWRlL3B5dGhvbnJ1bi5oIGIvSW5jbHVkZS9weXRob25ydW4uaAppbmRleCBiMmIzYWZkLi4wMzliNDk4IDEwMDY0NAotLS0gYS9JbmNsdWRlL3B5dGhvbnJ1bi5oCisrKyBiL0luY2x1ZGUvcHl0aG9ucnVuLmgKQEAgLTE2LDcgKzE2LDcgQEAKICNkZWZpbmUgUHlDRl9PTkxZX0FTVCAweDA0MDAKIAogdHlwZWRlZiBzdHJ1Y3QgewotCWludCBjZl9mbGFnczsgIC8qIGJpdG1hc2sgb2YgQ09feHh4IGZsYWdzIHJlbGV2YW50IHRvIGZ1dHVyZSAqLworICAgIGludCBjZl9mbGFnczsgIC8qIGJpdG1hc2sgb2YgQ09feHh4IGZsYWdzIHJlbGV2YW50IHRvIGZ1dHVyZSAqLwogfSBQeUNvbXBpbGVyRmxhZ3M7CiAKIFB5QVBJX0ZVTkModm9pZCkgUHlfU2V0UHJvZ3JhbU5hbWUoY2hhciAqKTsKQEAgLTM5LDMyICszOSwzMiBAQAogUHlBUElfRlVOQyhpbnQpIFB5UnVuX0ludGVyYWN0aXZlT25lRmxhZ3MoRklMRSAqLCBjb25zdCBjaGFyICosIFB5Q29tcGlsZXJGbGFncyAqKTsKIFB5QVBJX0ZVTkMoaW50KSBQeVJ1bl9JbnRlcmFjdGl2ZUxvb3BGbGFncyhGSUxFICosIGNvbnN0IGNoYXIgKiwgUHlDb21waWxlckZsYWdzICopOwogCi1QeUFQSV9GVU5DKHN0cnVjdCBfbW9kICopIFB5UGFyc2VyX0FTVEZyb21TdHJpbmcoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIAotCQkJCQkJIGludCwgUHlDb21waWxlckZsYWdzICpmbGFncywKK1B5QVBJX0ZVTkMoc3RydWN0IF9tb2QgKikgUHlQYXJzZXJfQVNURnJvbVN0cmluZyhjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQsIFB5Q29tcGlsZXJGbGFncyAqZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlBcmVuYSAqKTsKLVB5QVBJX0ZVTkMoc3RydWN0IF9tb2QgKikgUHlQYXJzZXJfQVNURnJvbUZpbGUoRklMRSAqLCBjb25zdCBjaGFyICosIGludCwgCi0JCQkJCSAgICAgICBjaGFyICosIGNoYXIgKiwKK1B5QVBJX0ZVTkMoc3RydWN0IF9tb2QgKikgUHlQYXJzZXJfQVNURnJvbUZpbGUoRklMRSAqLCBjb25zdCBjaGFyICosIGludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqLCBjaGFyICosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5Q29tcGlsZXJGbGFncyAqLCBpbnQgKiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlBcmVuYSAqKTsKICNkZWZpbmUgUHlQYXJzZXJfU2ltcGxlUGFyc2VTdHJpbmcoUywgQikgXAotICAgICAgICBQeVBhcnNlcl9TaW1wbGVQYXJzZVN0cmluZ0ZsYWdzKFMsIEIsIDApCisgICAgUHlQYXJzZXJfU2ltcGxlUGFyc2VTdHJpbmdGbGFncyhTLCBCLCAwKQogI2RlZmluZSBQeVBhcnNlcl9TaW1wbGVQYXJzZUZpbGUoRlAsIFMsIEIpIFwKLSAgICAgICAgUHlQYXJzZXJfU2ltcGxlUGFyc2VGaWxlRmxhZ3MoRlAsIFMsIEIsIDApCi1QeUFQSV9GVU5DKHN0cnVjdCBfbm9kZSAqKSBQeVBhcnNlcl9TaW1wbGVQYXJzZVN0cmluZ0ZsYWdzKGNvbnN0IGNoYXIgKiwgaW50LCAKLQkJCQkJCQkgIGludCk7CisgICAgUHlQYXJzZXJfU2ltcGxlUGFyc2VGaWxlRmxhZ3MoRlAsIFMsIEIsIDApCitQeUFQSV9GVU5DKHN0cnVjdCBfbm9kZSAqKSBQeVBhcnNlcl9TaW1wbGVQYXJzZVN0cmluZ0ZsYWdzKGNvbnN0IGNoYXIgKiwgaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCk7CiBQeUFQSV9GVU5DKHN0cnVjdCBfbm9kZSAqKSBQeVBhcnNlcl9TaW1wbGVQYXJzZUZpbGVGbGFncyhGSUxFICosIGNvbnN0IGNoYXIgKiwKLQkJCQkJCQlpbnQsIGludCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCwgaW50KTsKIAotUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeVJ1bl9TdHJpbmdGbGFncyhjb25zdCBjaGFyICosIGludCwgUHlPYmplY3QgKiwgCi0JCQkJCSBQeU9iamVjdCAqLCBQeUNvbXBpbGVyRmxhZ3MgKik7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5UnVuX1N0cmluZ0ZsYWdzKGNvbnN0IGNoYXIgKiwgaW50LCBQeU9iamVjdCAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqLCBQeUNvbXBpbGVyRmxhZ3MgKik7CiAKLVB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlSdW5fRmlsZUV4RmxhZ3MoRklMRSAqLCBjb25zdCBjaGFyICosIGludCwgCi0JCQkJCSBQeU9iamVjdCAqLCBQeU9iamVjdCAqLCBpbnQsIAotCQkJCQkgUHlDb21waWxlckZsYWdzICopOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeVJ1bl9GaWxlRXhGbGFncyhGSUxFICosIGNvbnN0IGNoYXIgKiwgaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqLCBQeU9iamVjdCAqLCBpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5Q29tcGlsZXJGbGFncyAqKTsKIAogI2RlZmluZSBQeV9Db21waWxlU3RyaW5nKHN0ciwgcCwgcykgUHlfQ29tcGlsZVN0cmluZ0ZsYWdzKHN0ciwgcCwgcywgTlVMTCkKIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlfQ29tcGlsZVN0cmluZ0ZsYWdzKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBpbnQsCi0JCQkJCSAgICAgUHlDb21waWxlckZsYWdzICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlDb21waWxlckZsYWdzICopOwogUHlBUElfRlVOQyhzdHJ1Y3Qgc3ltdGFibGUgKikgUHlfU3ltdGFibGVTdHJpbmcoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGludCk7CiAKIFB5QVBJX0ZVTkModm9pZCkgUHlFcnJfUHJpbnQodm9pZCk7CkBAIC04NCwyMCArODQsMjAgQEAKICNkZWZpbmUgUHlSdW5fU3RyaW5nKHN0ciwgcywgZywgbCkgUHlSdW5fU3RyaW5nRmxhZ3Moc3RyLCBzLCBnLCBsLCBOVUxMKQogI2RlZmluZSBQeVJ1bl9BbnlGaWxlKGZwLCBuYW1lKSBQeVJ1bl9BbnlGaWxlRXhGbGFncyhmcCwgbmFtZSwgMCwgTlVMTCkKICNkZWZpbmUgUHlSdW5fQW55RmlsZUV4KGZwLCBuYW1lLCBjbG9zZWl0KSBcCi0JUHlSdW5fQW55RmlsZUV4RmxhZ3MoZnAsIG5hbWUsIGNsb3NlaXQsIE5VTEwpCisgICAgUHlSdW5fQW55RmlsZUV4RmxhZ3MoZnAsIG5hbWUsIGNsb3NlaXQsIE5VTEwpCiAjZGVmaW5lIFB5UnVuX0FueUZpbGVGbGFncyhmcCwgbmFtZSwgZmxhZ3MpIFwKLQlQeVJ1bl9BbnlGaWxlRXhGbGFncyhmcCwgbmFtZSwgMCwgZmxhZ3MpCisgICAgUHlSdW5fQW55RmlsZUV4RmxhZ3MoZnAsIG5hbWUsIDAsIGZsYWdzKQogI2RlZmluZSBQeVJ1bl9TaW1wbGVTdHJpbmcocykgUHlSdW5fU2ltcGxlU3RyaW5nRmxhZ3MocywgTlVMTCkKICNkZWZpbmUgUHlSdW5fU2ltcGxlRmlsZShmLCBwKSBQeVJ1bl9TaW1wbGVGaWxlRXhGbGFncyhmLCBwLCAwLCBOVUxMKQogI2RlZmluZSBQeVJ1bl9TaW1wbGVGaWxlRXgoZiwgcCwgYykgUHlSdW5fU2ltcGxlRmlsZUV4RmxhZ3MoZiwgcCwgYywgTlVMTCkKICNkZWZpbmUgUHlSdW5fSW50ZXJhY3RpdmVPbmUoZiwgcCkgUHlSdW5fSW50ZXJhY3RpdmVPbmVGbGFncyhmLCBwLCBOVUxMKQogI2RlZmluZSBQeVJ1bl9JbnRlcmFjdGl2ZUxvb3AoZiwgcCkgUHlSdW5fSW50ZXJhY3RpdmVMb29wRmxhZ3MoZiwgcCwgTlVMTCkKICNkZWZpbmUgUHlSdW5fRmlsZShmcCwgcCwgcywgZywgbCkgXAotICAgICAgICBQeVJ1bl9GaWxlRXhGbGFncyhmcCwgcCwgcywgZywgbCwgMCwgTlVMTCkKKyAgICBQeVJ1bl9GaWxlRXhGbGFncyhmcCwgcCwgcywgZywgbCwgMCwgTlVMTCkKICNkZWZpbmUgUHlSdW5fRmlsZUV4KGZwLCBwLCBzLCBnLCBsLCBjKSBcCi0gICAgICAgIFB5UnVuX0ZpbGVFeEZsYWdzKGZwLCBwLCBzLCBnLCBsLCBjLCBOVUxMKQorICAgIFB5UnVuX0ZpbGVFeEZsYWdzKGZwLCBwLCBzLCBnLCBsLCBjLCBOVUxMKQogI2RlZmluZSBQeVJ1bl9GaWxlRmxhZ3MoZnAsIHAsIHMsIGcsIGwsIGZsYWdzKSBcCi0gICAgICAgIFB5UnVuX0ZpbGVFeEZsYWdzKGZwLCBwLCBzLCBnLCBsLCAwLCBmbGFncykKKyAgICBQeVJ1bl9GaWxlRXhGbGFncyhmcCwgcCwgcywgZywgbCwgMCwgZmxhZ3MpCiAKIC8qIEluIGdldHBhdGguYyAqLwogUHlBUElfRlVOQyhjaGFyICopIFB5X0dldFByb2dyYW1GdWxsUGF0aCh2b2lkKTsKZGlmZiAtLWdpdCBhL0luY2x1ZGUvc2V0b2JqZWN0LmggYi9JbmNsdWRlL3NldG9iamVjdC5oCmluZGV4IDkyYWRmNTIuLjUyYjA3ZDUgMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvc2V0b2JqZWN0LmgKKysrIGIvSW5jbHVkZS9zZXRvYmplY3QuaApAQCAtMjIsOCArMjIsOCBAQAogI2RlZmluZSBQeVNldF9NSU5TSVpFIDgKIAogdHlwZWRlZiBzdHJ1Y3QgewotCWxvbmcgaGFzaDsgICAgICAvKiBjYWNoZWQgaGFzaCBjb2RlIGZvciB0aGUgZW50cnkga2V5ICovCi0JUHlPYmplY3QgKmtleTsKKyAgICBsb25nIGhhc2g7ICAgICAgLyogY2FjaGVkIGhhc2ggY29kZSBmb3IgdGhlIGVudHJ5IGtleSAqLworICAgIFB5T2JqZWN0ICprZXk7CiB9IHNldGVudHJ5OwogCiAKQEAgLTMzLDI3ICszMywyNyBAQAogCiB0eXBlZGVmIHN0cnVjdCBfc2V0b2JqZWN0IFB5U2V0T2JqZWN0Owogc3RydWN0IF9zZXRvYmplY3QgewotCVB5T2JqZWN0X0hFQUQKKyAgICBQeU9iamVjdF9IRUFECiAKLQlQeV9zc2l6ZV90IGZpbGw7ICAvKiAjIEFjdGl2ZSArICMgRHVtbXkgKi8KLQlQeV9zc2l6ZV90IHVzZWQ7ICAvKiAjIEFjdGl2ZSAqLworICAgIFB5X3NzaXplX3QgZmlsbDsgIC8qICMgQWN0aXZlICsgIyBEdW1teSAqLworICAgIFB5X3NzaXplX3QgdXNlZDsgIC8qICMgQWN0aXZlICovCiAKLQkvKiBUaGUgdGFibGUgY29udGFpbnMgbWFzayArIDEgc2xvdHMsIGFuZCB0aGF0J3MgYSBwb3dlciBvZiAyLgotCSAqIFdlIHN0b3JlIHRoZSBtYXNrIGluc3RlYWQgb2YgdGhlIHNpemUgYmVjYXVzZSB0aGUgbWFzayBpcyBtb3JlCi0JICogZnJlcXVlbnRseSBuZWVkZWQuCi0JICovCi0JUHlfc3NpemVfdCBtYXNrOworICAgIC8qIFRoZSB0YWJsZSBjb250YWlucyBtYXNrICsgMSBzbG90cywgYW5kIHRoYXQncyBhIHBvd2VyIG9mIDIuCisgICAgICogV2Ugc3RvcmUgdGhlIG1hc2sgaW5zdGVhZCBvZiB0aGUgc2l6ZSBiZWNhdXNlIHRoZSBtYXNrIGlzIG1vcmUKKyAgICAgKiBmcmVxdWVudGx5IG5lZWRlZC4KKyAgICAgKi8KKyAgICBQeV9zc2l6ZV90IG1hc2s7CiAKLQkvKiB0YWJsZSBwb2ludHMgdG8gc21hbGx0YWJsZSBmb3Igc21hbGwgdGFibGVzLCBlbHNlIHRvCi0JICogYWRkaXRpb25hbCBtYWxsb2MnZWQgbWVtb3J5LiAgdGFibGUgaXMgbmV2ZXIgTlVMTCEgIFRoaXMgcnVsZQotCSAqIHNhdmVzIHJlcGVhdGVkIHJ1bnRpbWUgbnVsbC10ZXN0cy4KLQkgKi8KLQlzZXRlbnRyeSAqdGFibGU7Ci0Jc2V0ZW50cnkgKigqbG9va3VwKShQeVNldE9iamVjdCAqc28sIFB5T2JqZWN0ICprZXksIGxvbmcgaGFzaCk7Ci0Jc2V0ZW50cnkgc21hbGx0YWJsZVtQeVNldF9NSU5TSVpFXTsKKyAgICAvKiB0YWJsZSBwb2ludHMgdG8gc21hbGx0YWJsZSBmb3Igc21hbGwgdGFibGVzLCBlbHNlIHRvCisgICAgICogYWRkaXRpb25hbCBtYWxsb2MnZWQgbWVtb3J5LiAgdGFibGUgaXMgbmV2ZXIgTlVMTCEgIFRoaXMgcnVsZQorICAgICAqIHNhdmVzIHJlcGVhdGVkIHJ1bnRpbWUgbnVsbC10ZXN0cy4KKyAgICAgKi8KKyAgICBzZXRlbnRyeSAqdGFibGU7CisgICAgc2V0ZW50cnkgKigqbG9va3VwKShQeVNldE9iamVjdCAqc28sIFB5T2JqZWN0ICprZXksIGxvbmcgaGFzaCk7CisgICAgc2V0ZW50cnkgc21hbGx0YWJsZVtQeVNldF9NSU5TSVpFXTsKIAotCWxvbmcgaGFzaDsJCS8qIG9ubHkgdXNlZCBieSBmcm96ZW5zZXQgb2JqZWN0cyAqLwotCVB5T2JqZWN0ICp3ZWFrcmVmbGlzdDsJLyogTGlzdCBvZiB3ZWFrIHJlZmVyZW5jZXMgKi8KKyAgICBsb25nIGhhc2g7ICAgICAgICAgICAgICAgICAgLyogb25seSB1c2VkIGJ5IGZyb3plbnNldCBvYmplY3RzICovCisgICAgUHlPYmplY3QgKndlYWtyZWZsaXN0OyAgICAgIC8qIExpc3Qgb2Ygd2VhayByZWZlcmVuY2VzICovCiB9OwogCiBQeUFQSV9EQVRBKFB5VHlwZU9iamVjdCkgUHlTZXRfVHlwZTsKQEAgLTY4LDE3ICs2OCwxNyBAQAogCiAjZGVmaW5lIFB5RnJvemVuU2V0X0NoZWNrRXhhY3Qob2IpIChQeV9UWVBFKG9iKSA9PSAmUHlGcm96ZW5TZXRfVHlwZSkKICNkZWZpbmUgUHlBbnlTZXRfQ2hlY2tFeGFjdChvYikgXAotCShQeV9UWVBFKG9iKSA9PSAmUHlTZXRfVHlwZSB8fCBQeV9UWVBFKG9iKSA9PSAmUHlGcm96ZW5TZXRfVHlwZSkKKyAgICAoUHlfVFlQRShvYikgPT0gJlB5U2V0X1R5cGUgfHwgUHlfVFlQRShvYikgPT0gJlB5RnJvemVuU2V0X1R5cGUpCiAjZGVmaW5lIFB5QW55U2V0X0NoZWNrKG9iKSBcCi0JKFB5X1RZUEUob2IpID09ICZQeVNldF9UeXBlIHx8IFB5X1RZUEUob2IpID09ICZQeUZyb3plblNldF9UeXBlIHx8IFwKLQkgIFB5VHlwZV9Jc1N1YnR5cGUoUHlfVFlQRShvYiksICZQeVNldF9UeXBlKSB8fCBcCi0JICBQeVR5cGVfSXNTdWJ0eXBlKFB5X1RZUEUob2IpLCAmUHlGcm96ZW5TZXRfVHlwZSkpCisgICAgKFB5X1RZUEUob2IpID09ICZQeVNldF9UeXBlIHx8IFB5X1RZUEUob2IpID09ICZQeUZyb3plblNldF9UeXBlIHx8IFwKKyAgICAgIFB5VHlwZV9Jc1N1YnR5cGUoUHlfVFlQRShvYiksICZQeVNldF9UeXBlKSB8fCBcCisgICAgICBQeVR5cGVfSXNTdWJ0eXBlKFB5X1RZUEUob2IpLCAmUHlGcm96ZW5TZXRfVHlwZSkpCiAjZGVmaW5lIFB5U2V0X0NoZWNrKG9iKSBcCi0JKFB5X1RZUEUob2IpID09ICZQeVNldF9UeXBlIHx8IFwKLQlQeVR5cGVfSXNTdWJ0eXBlKFB5X1RZUEUob2IpLCAmUHlTZXRfVHlwZSkpCisgICAgKFB5X1RZUEUob2IpID09ICZQeVNldF9UeXBlIHx8IFwKKyAgICBQeVR5cGVfSXNTdWJ0eXBlKFB5X1RZUEUob2IpLCAmUHlTZXRfVHlwZSkpCiAjZGVmaW5lICAgUHlGcm96ZW5TZXRfQ2hlY2sob2IpIFwKLQkoUHlfVFlQRShvYikgPT0gJlB5RnJvemVuU2V0X1R5cGUgfHwgXAotCSAgUHlUeXBlX0lzU3VidHlwZShQeV9UWVBFKG9iKSwgJlB5RnJvemVuU2V0X1R5cGUpKQorICAgIChQeV9UWVBFKG9iKSA9PSAmUHlGcm96ZW5TZXRfVHlwZSB8fCBcCisgICAgICBQeVR5cGVfSXNTdWJ0eXBlKFB5X1RZUEUob2IpLCAmUHlGcm96ZW5TZXRfVHlwZSkpCiAKIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlTZXRfTmV3KFB5T2JqZWN0ICopOwogUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUZyb3plblNldF9OZXcoUHlPYmplY3QgKik7CmRpZmYgLS1naXQgYS9JbmNsdWRlL3N0cmluZ29iamVjdC5oIGIvSW5jbHVkZS9zdHJpbmdvYmplY3QuaAppbmRleCBkOWYxODQwLi5jMGExZmNhIDEwMDY0NAotLS0gYS9JbmNsdWRlL3N0cmluZ29iamVjdC5oCisrKyBiL0luY2x1ZGUvc3RyaW5nb2JqZWN0LmgKQEAgLTYyLDkgKzYyLDkgQEAKIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoY29uc3QgY2hhciAqLCBQeV9zc2l6ZV90KTsKIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlTdHJpbmdfRnJvbVN0cmluZyhjb25zdCBjaGFyICopOwogUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeVN0cmluZ19Gcm9tRm9ybWF0Vihjb25zdCBjaGFyKiwgdmFfbGlzdCkKLQkJCQlQeV9HQ0NfQVRUUklCVVRFKChmb3JtYXQocHJpbnRmLCAxLCAwKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9HQ0NfQVRUUklCVVRFKChmb3JtYXQocHJpbnRmLCAxLCAwKSkpOwogUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeVN0cmluZ19Gcm9tRm9ybWF0KGNvbnN0IGNoYXIqLCAuLi4pCi0JCQkJUHlfR0NDX0FUVFJJQlVURSgoZm9ybWF0KHByaW50ZiwgMSwgMikpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfR0NDX0FUVFJJQlVURSgoZm9ybWF0KHByaW50ZiwgMSwgMikpKTsKIFB5QVBJX0ZVTkMoUHlfc3NpemVfdCkgUHlTdHJpbmdfU2l6ZShQeU9iamVjdCAqKTsKIFB5QVBJX0ZVTkMoY2hhciAqKSBQeVN0cmluZ19Bc1N0cmluZyhQeU9iamVjdCAqKTsKIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlTdHJpbmdfUmVwcihQeU9iamVjdCAqLCBpbnQpOwpAQCAtNzQsMTAgKzc0LDEwIEBACiBQeUFQSV9GVU5DKGludCkgX1B5U3RyaW5nX0VxKFB5T2JqZWN0ICosIFB5T2JqZWN0Kik7CiBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5U3RyaW5nX0Zvcm1hdChQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgX1B5U3RyaW5nX0Zvcm1hdExvbmcoUHlPYmplY3QqLCBpbnQsIGludCwKLQkJCQkJCSAgaW50LCBjaGFyKiosIGludCopOwotUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeVN0cmluZ19EZWNvZGVFc2NhcGUoY29uc3QgY2hhciAqLCBQeV9zc2l6ZV90LCAKLQkJCQkJCSAgIGNvbnN0IGNoYXIgKiwgUHlfc3NpemVfdCwKLQkJCQkJCSAgIGNvbnN0IGNoYXIgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCwgY2hhcioqLCBpbnQqKTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlTdHJpbmdfRGVjb2RlRXNjYXBlKGNvbnN0IGNoYXIgKiwgUHlfc3NpemVfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiwgUHlfc3NpemVfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKik7CiAKIFB5QVBJX0ZVTkModm9pZCkgUHlTdHJpbmdfSW50ZXJuSW5QbGFjZShQeU9iamVjdCAqKik7CiBQeUFQSV9GVU5DKHZvaWQpIFB5U3RyaW5nX0ludGVybkltbW9ydGFsKFB5T2JqZWN0ICoqKTsKQEAgLTEwNyw3ICsxMDcsNyBAQAogICAgIGNvbnN0IGNoYXIgKmVycm9ycyAgICAgICAgICAvKiBlcnJvciBoYW5kbGluZyAqLwogICAgICk7CiAKLS8qIEVuY29kZXMgYSBjaGFyIGJ1ZmZlciBvZiB0aGUgZ2l2ZW4gc2l6ZSBhbmQgcmV0dXJucyBhIAorLyogRW5jb2RlcyBhIGNoYXIgYnVmZmVyIG9mIHRoZSBnaXZlbiBzaXplIGFuZCByZXR1cm5zIGEKICAgIFB5dGhvbiBvYmplY3QuICovCiAKIFB5QVBJX0ZVTkMoUHlPYmplY3QqKSBQeVN0cmluZ19FbmNvZGUoCkBAIC0xMTcsNTAgKzExNyw1MCBAQAogICAgIGNvbnN0IGNoYXIgKmVycm9ycyAgICAgICAgICAvKiBlcnJvciBoYW5kbGluZyAqLwogICAgICk7CiAKLS8qIEVuY29kZXMgYSBzdHJpbmcgb2JqZWN0IGFuZCByZXR1cm5zIHRoZSByZXN1bHQgYXMgUHl0aG9uIAorLyogRW5jb2RlcyBhIHN0cmluZyBvYmplY3QgYW5kIHJldHVybnMgdGhlIHJlc3VsdCBhcyBQeXRob24KICAgIG9iamVjdC4gKi8KIAogUHlBUElfRlVOQyhQeU9iamVjdCopIFB5U3RyaW5nX0FzRW5jb2RlZE9iamVjdCgKLSAgICBQeU9iamVjdCAqc3RyLAkgCS8qIHN0cmluZyBvYmplY3QgKi8KLSAgICBjb25zdCBjaGFyICplbmNvZGluZywJLyogZW5jb2RpbmcgKi8KLSAgICBjb25zdCBjaGFyICplcnJvcnMJCS8qIGVycm9yIGhhbmRsaW5nICovCisgICAgUHlPYmplY3QgKnN0ciwgICAgICAgICAgICAgIC8qIHN0cmluZyBvYmplY3QgKi8KKyAgICBjb25zdCBjaGFyICplbmNvZGluZywgICAgICAgLyogZW5jb2RpbmcgKi8KKyAgICBjb25zdCBjaGFyICplcnJvcnMgICAgICAgICAgLyogZXJyb3IgaGFuZGxpbmcgKi8KICAgICApOwogCiAvKiBFbmNvZGVzIGEgc3RyaW5nIG9iamVjdCBhbmQgcmV0dXJucyB0aGUgcmVzdWx0IGFzIFB5dGhvbiBzdHJpbmcKLSAgIG9iamVjdC4gICAKLSAgIAorICAgb2JqZWN0LgorCiAgICBJZiB0aGUgY29kZWMgcmV0dXJucyBhbiBVbmljb2RlIG9iamVjdCwgdGhlIG9iamVjdCBpcyBjb252ZXJ0ZWQKICAgIGJhY2sgdG8gYSBzdHJpbmcgdXNpbmcgdGhlIGRlZmF1bHQgZW5jb2RpbmcuCiAKICAgIERFUFJFQ0FURUQgLSB1c2UgUHlTdHJpbmdfQXNFbmNvZGVkT2JqZWN0KCkgaW5zdGVhZC4gKi8KIAogUHlBUElfRlVOQyhQeU9iamVjdCopIFB5U3RyaW5nX0FzRW5jb2RlZFN0cmluZygKLSAgICBQeU9iamVjdCAqc3RyLAkgCS8qIHN0cmluZyBvYmplY3QgKi8KLSAgICBjb25zdCBjaGFyICplbmNvZGluZywJLyogZW5jb2RpbmcgKi8KLSAgICBjb25zdCBjaGFyICplcnJvcnMJCS8qIGVycm9yIGhhbmRsaW5nICovCisgICAgUHlPYmplY3QgKnN0ciwgICAgICAgICAgICAgIC8qIHN0cmluZyBvYmplY3QgKi8KKyAgICBjb25zdCBjaGFyICplbmNvZGluZywgICAgICAgLyogZW5jb2RpbmcgKi8KKyAgICBjb25zdCBjaGFyICplcnJvcnMgICAgICAgICAgLyogZXJyb3IgaGFuZGxpbmcgKi8KICAgICApOwogCi0vKiBEZWNvZGVzIGEgc3RyaW5nIG9iamVjdCBhbmQgcmV0dXJucyB0aGUgcmVzdWx0IGFzIFB5dGhvbiAKKy8qIERlY29kZXMgYSBzdHJpbmcgb2JqZWN0IGFuZCByZXR1cm5zIHRoZSByZXN1bHQgYXMgUHl0aG9uCiAgICBvYmplY3QuICovCiAKIFB5QVBJX0ZVTkMoUHlPYmplY3QqKSBQeVN0cmluZ19Bc0RlY29kZWRPYmplY3QoCi0gICAgUHlPYmplY3QgKnN0ciwJIAkvKiBzdHJpbmcgb2JqZWN0ICovCi0gICAgY29uc3QgY2hhciAqZW5jb2RpbmcsCS8qIGVuY29kaW5nICovCi0gICAgY29uc3QgY2hhciAqZXJyb3JzCQkvKiBlcnJvciBoYW5kbGluZyAqLworICAgIFB5T2JqZWN0ICpzdHIsICAgICAgICAgICAgICAvKiBzdHJpbmcgb2JqZWN0ICovCisgICAgY29uc3QgY2hhciAqZW5jb2RpbmcsICAgICAgIC8qIGVuY29kaW5nICovCisgICAgY29uc3QgY2hhciAqZXJyb3JzICAgICAgICAgIC8qIGVycm9yIGhhbmRsaW5nICovCiAgICAgKTsKIAogLyogRGVjb2RlcyBhIHN0cmluZyBvYmplY3QgYW5kIHJldHVybnMgdGhlIHJlc3VsdCBhcyBQeXRob24gc3RyaW5nCi0gICBvYmplY3QuICAKLSAgIAorICAgb2JqZWN0LgorCiAgICBJZiB0aGUgY29kZWMgcmV0dXJucyBhbiBVbmljb2RlIG9iamVjdCwgdGhlIG9iamVjdCBpcyBjb252ZXJ0ZWQKICAgIGJhY2sgdG8gYSBzdHJpbmcgdXNpbmcgdGhlIGRlZmF1bHQgZW5jb2RpbmcuCiAKICAgIERFUFJFQ0FURUQgLSB1c2UgUHlTdHJpbmdfQXNEZWNvZGVkT2JqZWN0KCkgaW5zdGVhZC4gKi8KIAogUHlBUElfRlVOQyhQeU9iamVjdCopIFB5U3RyaW5nX0FzRGVjb2RlZFN0cmluZygKLSAgICBQeU9iamVjdCAqc3RyLAkgCS8qIHN0cmluZyBvYmplY3QgKi8KLSAgICBjb25zdCBjaGFyICplbmNvZGluZywJLyogZW5jb2RpbmcgKi8KLSAgICBjb25zdCBjaGFyICplcnJvcnMJCS8qIGVycm9yIGhhbmRsaW5nICovCisgICAgUHlPYmplY3QgKnN0ciwgICAgICAgICAgICAgIC8qIHN0cmluZyBvYmplY3QgKi8KKyAgICBjb25zdCBjaGFyICplbmNvZGluZywgICAgICAgLyogZW5jb2RpbmcgKi8KKyAgICBjb25zdCBjaGFyICplcnJvcnMgICAgICAgICAgLyogZXJyb3IgaGFuZGxpbmcgKi8KICAgICApOwogCiAvKiBQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGludGVybmFsIGRhdGEgYnVmZmVyIGFuZCBzaXplIG9mIGEgc3RyaW5nCkBAIC0xNzAsMTEgKzE3MCwxMSBAQAogICAgY2F1c2UgYW4gZXhjZXB0aW9uKS4gICovCiAKIFB5QVBJX0ZVTkMoaW50KSBQeVN0cmluZ19Bc1N0cmluZ0FuZFNpemUoCi0gICAgcmVnaXN0ZXIgUHlPYmplY3QgKm9iaiwJLyogc3RyaW5nIG9yIFVuaWNvZGUgb2JqZWN0ICovCi0gICAgcmVnaXN0ZXIgY2hhciAqKnMsCQkvKiBwb2ludGVyIHRvIGJ1ZmZlciB2YXJpYWJsZSAqLwotICAgIHJlZ2lzdGVyIFB5X3NzaXplX3QgKmxlbgkvKiBwb2ludGVyIHRvIGxlbmd0aCB2YXJpYWJsZSBvciBOVUxMCi0JCQkJICAgKG9ubHkgcG9zc2libGUgZm9yIDAtdGVybWluYXRlZAotCQkJCSAgIHN0cmluZ3MpICovCisgICAgcmVnaXN0ZXIgUHlPYmplY3QgKm9iaiwgICAgIC8qIHN0cmluZyBvciBVbmljb2RlIG9iamVjdCAqLworICAgIHJlZ2lzdGVyIGNoYXIgKipzLCAgICAgICAgICAvKiBwb2ludGVyIHRvIGJ1ZmZlciB2YXJpYWJsZSAqLworICAgIHJlZ2lzdGVyIFB5X3NzaXplX3QgKmxlbiAgICAvKiBwb2ludGVyIHRvIGxlbmd0aCB2YXJpYWJsZSBvciBOVUxMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbmx5IHBvc3NpYmxlIGZvciAwLXRlcm1pbmF0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5ncykgKi8KICAgICApOwogCiAvKiBVc2luZyB0aGUgY3VycmVudCBsb2NhbGUsIGluc2VydCB0aGUgdGhvdXNhbmRzIGdyb3VwaW5nCkBAIC0xODIsMTcgKzE4MiwxNyBAQAogICAgc2VlIE9iamVjdHMvc3RyaW5nbGliL2xvY2FsZXV0aWwuaCAqLwogCiBQeUFQSV9GVU5DKGludCkgX1B5U3RyaW5nX0luc2VydFRob3VzYW5kc0dyb3VwaW5nKGNoYXIgKmJ1ZmZlciwKLQkJCQkJCSAgUHlfc3NpemVfdCBuX2J1ZmZlciwKLQkJCQkJCSAgUHlfc3NpemVfdCBuX2RpZ2l0cywKLQkJCQkJCSAgUHlfc3NpemVfdCBidWZfc2l6ZSwKLQkJCQkJCSAgUHlfc3NpemVfdCAqY291bnQsCi0JCQkJCQkgIGludCBhcHBlbmRfemVyb19jaGFyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBuX2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBuX2RpZ2l0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBidWZfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCAqY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhcHBlbmRfemVyb19jaGFyKTsKIAogLyogRm9ybWF0IHRoZSBvYmplY3QgYmFzZWQgb24gdGhlIGZvcm1hdF9zcGVjLCBhcyBkZWZpbmVkIGluIFBFUCAzMTAxCiAgICAoQWR2YW5jZWQgU3RyaW5nIEZvcm1hdHRpbmcpLiAqLwogUHlBUElfRlVOQyhQeU9iamVjdCAqKSBfUHlCeXRlc19Gb3JtYXRBZHZhbmNlZChQeU9iamVjdCAqb2JqLAotCQkJCQkgICAgICAgY2hhciAqZm9ybWF0X3NwZWMsCi0JCQkJCSAgICAgICBQeV9zc2l6ZV90IGZvcm1hdF9zcGVjX2xlbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmZvcm1hdF9zcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IGZvcm1hdF9zcGVjX2xlbik7CiAKICNpZmRlZiBfX2NwbHVzcGx1cwogfQpkaWZmIC0tZ2l0IGEvSW5jbHVkZS9zdHJ1Y3RtZW1iZXIuaCBiL0luY2x1ZGUvc3RydWN0bWVtYmVyLmgKaW5kZXggMWYyNmI0Mi4uZmU1YjQ0ZSAxMDA2NDQKLS0tIGEvSW5jbHVkZS9zdHJ1Y3RtZW1iZXIuaAorKysgYi9JbmNsdWRlL3N0cnVjdG1lbWJlci5oCkBAIC0yNiw1MCArMjYsNTAgQEAKICAgIHBvaW50ZXIgaXMgTlVMTC4gKi8KIAogc3RydWN0IG1lbWJlcmxpc3QgewotCS8qIE9ic29sZXRlIHZlcnNpb24sIGZvciBiaW5hcnkgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgKi8KLQljaGFyICpuYW1lOwotCWludCB0eXBlOwotCWludCBvZmZzZXQ7Ci0JaW50IGZsYWdzOworICAgIC8qIE9ic29sZXRlIHZlcnNpb24sIGZvciBiaW5hcnkgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgKi8KKyAgICBjaGFyICpuYW1lOworICAgIGludCB0eXBlOworICAgIGludCBvZmZzZXQ7CisgICAgaW50IGZsYWdzOwogfTsKIAogdHlwZWRlZiBzdHJ1Y3QgUHlNZW1iZXJEZWYgewotCS8qIEN1cnJlbnQgdmVyc2lvbiwgdXNlIHRoaXMgKi8KLQljaGFyICpuYW1lOwotCWludCB0eXBlOwotCVB5X3NzaXplX3Qgb2Zmc2V0OwotCWludCBmbGFnczsKLQljaGFyICpkb2M7CisgICAgLyogQ3VycmVudCB2ZXJzaW9uLCB1c2UgdGhpcyAqLworICAgIGNoYXIgKm5hbWU7CisgICAgaW50IHR5cGU7CisgICAgUHlfc3NpemVfdCBvZmZzZXQ7CisgICAgaW50IGZsYWdzOworICAgIGNoYXIgKmRvYzsKIH0gUHlNZW1iZXJEZWY7CiAKIC8qIFR5cGVzICovCi0jZGVmaW5lIFRfU0hPUlQJCTAKLSNkZWZpbmUgVF9JTlQJCTEKLSNkZWZpbmUgVF9MT05HCQkyCi0jZGVmaW5lIFRfRkxPQVQJCTMKLSNkZWZpbmUgVF9ET1VCTEUJNAotI2RlZmluZSBUX1NUUklORwk1Ci0jZGVmaW5lIFRfT0JKRUNUCTYKKyNkZWZpbmUgVF9TSE9SVCAgICAgICAgIDAKKyNkZWZpbmUgVF9JTlQgICAgICAgICAgIDEKKyNkZWZpbmUgVF9MT05HICAgICAgICAgIDIKKyNkZWZpbmUgVF9GTE9BVCAgICAgICAgIDMKKyNkZWZpbmUgVF9ET1VCTEUgICAgICAgIDQKKyNkZWZpbmUgVF9TVFJJTkcgICAgICAgIDUKKyNkZWZpbmUgVF9PQkpFQ1QgICAgICAgIDYKIC8qIFhYWCB0aGUgb3JkZXJpbmcgaGVyZSBpcyB3ZWlyZCBmb3IgYmluYXJ5IGNvbXBhdGliaWxpdHkgKi8KLSNkZWZpbmUgVF9DSEFSCQk3CS8qIDEtY2hhcmFjdGVyIHN0cmluZyAqLwotI2RlZmluZSBUX0JZVEUJCTgJLyogOC1iaXQgc2lnbmVkIGludCAqLworI2RlZmluZSBUX0NIQVIgICAgICAgICAgNyAgICAgICAvKiAxLWNoYXJhY3RlciBzdHJpbmcgKi8KKyNkZWZpbmUgVF9CWVRFICAgICAgICAgIDggICAgICAgLyogOC1iaXQgc2lnbmVkIGludCAqLwogLyogdW5zaWduZWQgdmFyaWFudHM6ICovCi0jZGVmaW5lIFRfVUJZVEUJCTkKLSNkZWZpbmUgVF9VU0hPUlQJMTAKLSNkZWZpbmUgVF9VSU5UCQkxMQotI2RlZmluZSBUX1VMT05HCQkxMgorI2RlZmluZSBUX1VCWVRFICAgICAgICAgOQorI2RlZmluZSBUX1VTSE9SVCAgICAgICAgMTAKKyNkZWZpbmUgVF9VSU5UICAgICAgICAgIDExCisjZGVmaW5lIFRfVUxPTkcgICAgICAgICAxMgogCiAvKiBBZGRlZCBieSBKYWNrOiBzdHJpbmdzIGNvbnRhaW5lZCBpbiB0aGUgc3RydWN0dXJlICovCi0jZGVmaW5lIFRfU1RSSU5HX0lOUExBQ0UJMTMKKyNkZWZpbmUgVF9TVFJJTkdfSU5QTEFDRSAgICAgICAgMTMKIAogLyogQWRkZWQgYnkgTGlsbG86IGJvb2xzIGNvbnRhaW5lZCBpbiB0aGUgc3RydWN0dXJlIChhc3N1bWVkIGNoYXIpICovCi0jZGVmaW5lIFRfQk9PTAkJMTQKKyNkZWZpbmUgVF9CT09MICAgICAgICAgIDE0CiAKLSNkZWZpbmUgVF9PQkpFQ1RfRVgJMTYJLyogTGlrZSBUX09CSkVDVCwgYnV0IHJhaXNlcyBBdHRyaWJ1dGVFcnJvcgotCQkJCSAgIHdoZW4gdGhlIHZhbHVlIGlzIE5VTEwsIGluc3RlYWQgb2YKLQkJCQkgICBjb252ZXJ0aW5nIHRvIE5vbmUuICovCisjZGVmaW5lIFRfT0JKRUNUX0VYICAgICAxNiAgICAgIC8qIExpa2UgVF9PQkpFQ1QsIGJ1dCByYWlzZXMgQXR0cmlidXRlRXJyb3IKKyAgICAgICAgICAgICAgICAgICB3aGVuIHRoZSB2YWx1ZSBpcyBOVUxMLCBpbnN0ZWFkIG9mCisgICAgICAgICAgICAgICAgICAgY29udmVydGluZyB0byBOb25lLiAqLwogI2lmZGVmIEhBVkVfTE9OR19MT05HCi0jZGVmaW5lIFRfTE9OR0xPTkcgICAgICAxNyAgCisjZGVmaW5lIFRfTE9OR0xPTkcgICAgICAxNwogI2RlZmluZSBUX1VMT05HTE9ORyAgICAgIDE4CiAjZW5kaWYgLyogSEFWRV9MT05HX0xPTkcgKi8KIApAQCAtNzcsMTEgKzc3LDExIEBACiAKIAogLyogRmxhZ3MgKi8KLSNkZWZpbmUgUkVBRE9OTFkJMQotI2RlZmluZSBSTwkJUkVBRE9OTFkJCS8qIFNob3J0aGFuZCAqLwotI2RlZmluZSBSRUFEX1JFU1RSSUNURUQJMgorI2RlZmluZSBSRUFET05MWSAgICAgICAgMQorI2RlZmluZSBSTyAgICAgICAgICAgICAgUkVBRE9OTFkgICAgICAgICAgICAgICAgLyogU2hvcnRoYW5kICovCisjZGVmaW5lIFJFQURfUkVTVFJJQ1RFRCAyCiAjZGVmaW5lIFBZX1dSSVRFX1JFU1RSSUNURUQgNAotI2RlZmluZSBSRVNUUklDVEVECShSRUFEX1JFU1RSSUNURUQgfCBQWV9XUklURV9SRVNUUklDVEVEKQorI2RlZmluZSBSRVNUUklDVEVEICAgICAgKFJFQURfUkVTVFJJQ1RFRCB8IFBZX1dSSVRFX1JFU1RSSUNURUQpCiAKIAogLyogT2Jzb2xldGUgQVBJLCBmb3IgYmluYXJ5IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5ICovCmRpZmYgLS1naXQgYS9JbmNsdWRlL3N5bXRhYmxlLmggYi9JbmNsdWRlL3N5bXRhYmxlLmgKaW5kZXggMzJiNGViZi4uNjU3NzViMCAxMDA2NDQKLS0tIGEvSW5jbHVkZS9zeW10YWJsZS5oCisrKyBiL0luY2x1ZGUvc3ltdGFibGUuaApAQCAtMTEsNDAgKzExLDQwIEBACiBzdHJ1Y3QgX3N5bXRhYmxlX2VudHJ5OwogCiBzdHJ1Y3Qgc3ltdGFibGUgewotCWNvbnN0IGNoYXIgKnN0X2ZpbGVuYW1lOyAvKiBuYW1lIG9mIGZpbGUgYmVpbmcgY29tcGlsZWQgKi8KLQlzdHJ1Y3QgX3N5bXRhYmxlX2VudHJ5ICpzdF9jdXI7IC8qIGN1cnJlbnQgc3ltYm9sIHRhYmxlIGVudHJ5ICovCi0Jc3RydWN0IF9zeW10YWJsZV9lbnRyeSAqc3RfdG9wOyAvKiBtb2R1bGUgZW50cnkgKi8KLQlQeU9iamVjdCAqc3Rfc3ltYm9sczsgICAgLyogZGljdGlvbmFyeSBvZiBzeW1ib2wgdGFibGUgZW50cmllcyAqLwotICAgICAgICBQeU9iamVjdCAqc3Rfc3RhY2s7ICAgICAgLyogc3RhY2sgb2YgbmFtZXNwYWNlIGluZm8gKi8KLQlQeU9iamVjdCAqc3RfZ2xvYmFsOyAgICAgLyogYm9ycm93ZWQgcmVmIHRvIE1PRFVMRSBpbiBzdF9zeW1ib2xzICovCi0JaW50IHN0X25ibG9ja3M7ICAgICAgICAgIC8qIG51bWJlciBvZiBibG9ja3MgKi8KLQlQeU9iamVjdCAqc3RfcHJpdmF0ZTsgICAgICAgIC8qIG5hbWUgb2YgY3VycmVudCBjbGFzcyBvciBOVUxMICovCi0gICAgICAgIGludCBzdF90bXBuYW1lOyAgICAgICAgICAvKiB0ZW1wb3JhcnkgbmFtZSBjb3VudGVyICovCi0JUHlGdXR1cmVGZWF0dXJlcyAqc3RfZnV0dXJlOyAvKiBtb2R1bGUncyBmdXR1cmUgZmVhdHVyZXMgKi8KKyAgICBjb25zdCBjaGFyICpzdF9maWxlbmFtZTsgLyogbmFtZSBvZiBmaWxlIGJlaW5nIGNvbXBpbGVkICovCisgICAgc3RydWN0IF9zeW10YWJsZV9lbnRyeSAqc3RfY3VyOyAvKiBjdXJyZW50IHN5bWJvbCB0YWJsZSBlbnRyeSAqLworICAgIHN0cnVjdCBfc3ltdGFibGVfZW50cnkgKnN0X3RvcDsgLyogbW9kdWxlIGVudHJ5ICovCisgICAgUHlPYmplY3QgKnN0X3N5bWJvbHM7ICAgIC8qIGRpY3Rpb25hcnkgb2Ygc3ltYm9sIHRhYmxlIGVudHJpZXMgKi8KKyAgICBQeU9iamVjdCAqc3Rfc3RhY2s7ICAgICAgLyogc3RhY2sgb2YgbmFtZXNwYWNlIGluZm8gKi8KKyAgICBQeU9iamVjdCAqc3RfZ2xvYmFsOyAgICAgLyogYm9ycm93ZWQgcmVmIHRvIE1PRFVMRSBpbiBzdF9zeW1ib2xzICovCisgICAgaW50IHN0X25ibG9ja3M7ICAgICAgICAgIC8qIG51bWJlciBvZiBibG9ja3MgKi8KKyAgICBQeU9iamVjdCAqc3RfcHJpdmF0ZTsgICAgICAgIC8qIG5hbWUgb2YgY3VycmVudCBjbGFzcyBvciBOVUxMICovCisgICAgaW50IHN0X3RtcG5hbWU7ICAgICAgICAgIC8qIHRlbXBvcmFyeSBuYW1lIGNvdW50ZXIgKi8KKyAgICBQeUZ1dHVyZUZlYXR1cmVzICpzdF9mdXR1cmU7IC8qIG1vZHVsZSdzIGZ1dHVyZSBmZWF0dXJlcyAqLwogfTsKIAogdHlwZWRlZiBzdHJ1Y3QgX3N5bXRhYmxlX2VudHJ5IHsKLQlQeU9iamVjdF9IRUFECi0JUHlPYmplY3QgKnN0ZV9pZDsgICAgICAgIC8qIGludDoga2V5IGluIHN0X3N5bWJvbHMgKi8KLQlQeU9iamVjdCAqc3RlX3N5bWJvbHM7ICAgLyogZGljdDogbmFtZSB0byBmbGFncyAqLwotCVB5T2JqZWN0ICpzdGVfbmFtZTsgICAgICAvKiBzdHJpbmc6IG5hbWUgb2YgYmxvY2sgKi8KLQlQeU9iamVjdCAqc3RlX3Zhcm5hbWVzOyAgLyogbGlzdCBvZiB2YXJpYWJsZSBuYW1lcyAqLwotCVB5T2JqZWN0ICpzdGVfY2hpbGRyZW47ICAvKiBsaXN0IG9mIGNoaWxkIGlkcyAqLwotCV9QeV9ibG9ja190eSBzdGVfdHlwZTsgICAvKiBtb2R1bGUsIGNsYXNzLCBvciBmdW5jdGlvbiAqLwotCWludCBzdGVfdW5vcHRpbWl6ZWQ7ICAgICAvKiBmYWxzZSBpZiBuYW1lc3BhY2UgaXMgb3B0aW1pemVkICovCi0JaW50IHN0ZV9uZXN0ZWQ7ICAgICAgLyogdHJ1ZSBpZiBibG9jayBpcyBuZXN0ZWQgKi8KLQl1bnNpZ25lZCBzdGVfZnJlZSA6IDE7ICAgICAgICAvKiB0cnVlIGlmIGJsb2NrIGhhcyBmcmVlIHZhcmlhYmxlcyAqLwotCXVuc2lnbmVkIHN0ZV9jaGlsZF9mcmVlIDogMTsgIC8qIHRydWUgaWYgYSBjaGlsZCBibG9jayBoYXMgZnJlZSB2YXJzLAotCQkJCSAgICAgICAgIGluY2x1ZGluZyBmcmVlIHJlZnMgdG8gZ2xvYmFscyAqLwotCXVuc2lnbmVkIHN0ZV9nZW5lcmF0b3IgOiAxOyAgIC8qIHRydWUgaWYgbmFtZXNwYWNlIGlzIGEgZ2VuZXJhdG9yICovCi0JdW5zaWduZWQgc3RlX3ZhcmFyZ3MgOiAxOyAgICAgLyogdHJ1ZSBpZiBibG9jayBoYXMgdmFyYXJncyAqLwotCXVuc2lnbmVkIHN0ZV92YXJrZXl3b3JkcyA6IDE7IC8qIHRydWUgaWYgYmxvY2sgaGFzIHZhcmtleXdvcmRzICovCi0JdW5zaWduZWQgc3RlX3JldHVybnNfdmFsdWUgOiAxOyAgLyogdHJ1ZSBpZiBuYW1lc3BhY2UgdXNlcyByZXR1cm4gd2l0aAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuIGFyZ3VtZW50ICovCi0JaW50IHN0ZV9saW5lbm87ICAgICAgICAgIC8qIGZpcnN0IGxpbmUgb2YgYmxvY2sgKi8KLQlpbnQgc3RlX29wdF9saW5lbm87ICAgICAgLyogbGluZW5vIG9mIGxhc3QgZXhlYyBvciBpbXBvcnQgKiAqLwotCWludCBzdGVfdG1wbmFtZTsgICAgICAgICAvKiBjb3VudGVyIGZvciBsaXN0Y29tcCB0ZW1wIHZhcnMgKi8KLQlzdHJ1Y3Qgc3ltdGFibGUgKnN0ZV90YWJsZTsKKyAgICBQeU9iamVjdF9IRUFECisgICAgUHlPYmplY3QgKnN0ZV9pZDsgICAgICAgIC8qIGludDoga2V5IGluIHN0X3N5bWJvbHMgKi8KKyAgICBQeU9iamVjdCAqc3RlX3N5bWJvbHM7ICAgLyogZGljdDogbmFtZSB0byBmbGFncyAqLworICAgIFB5T2JqZWN0ICpzdGVfbmFtZTsgICAgICAvKiBzdHJpbmc6IG5hbWUgb2YgYmxvY2sgKi8KKyAgICBQeU9iamVjdCAqc3RlX3Zhcm5hbWVzOyAgLyogbGlzdCBvZiB2YXJpYWJsZSBuYW1lcyAqLworICAgIFB5T2JqZWN0ICpzdGVfY2hpbGRyZW47ICAvKiBsaXN0IG9mIGNoaWxkIGlkcyAqLworICAgIF9QeV9ibG9ja190eSBzdGVfdHlwZTsgICAvKiBtb2R1bGUsIGNsYXNzLCBvciBmdW5jdGlvbiAqLworICAgIGludCBzdGVfdW5vcHRpbWl6ZWQ7ICAgICAvKiBmYWxzZSBpZiBuYW1lc3BhY2UgaXMgb3B0aW1pemVkICovCisgICAgaW50IHN0ZV9uZXN0ZWQ7ICAgICAgLyogdHJ1ZSBpZiBibG9jayBpcyBuZXN0ZWQgKi8KKyAgICB1bnNpZ25lZCBzdGVfZnJlZSA6IDE7ICAgICAgICAvKiB0cnVlIGlmIGJsb2NrIGhhcyBmcmVlIHZhcmlhYmxlcyAqLworICAgIHVuc2lnbmVkIHN0ZV9jaGlsZF9mcmVlIDogMTsgIC8qIHRydWUgaWYgYSBjaGlsZCBibG9jayBoYXMgZnJlZSB2YXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGluZyBmcmVlIHJlZnMgdG8gZ2xvYmFscyAqLworICAgIHVuc2lnbmVkIHN0ZV9nZW5lcmF0b3IgOiAxOyAgIC8qIHRydWUgaWYgbmFtZXNwYWNlIGlzIGEgZ2VuZXJhdG9yICovCisgICAgdW5zaWduZWQgc3RlX3ZhcmFyZ3MgOiAxOyAgICAgLyogdHJ1ZSBpZiBibG9jayBoYXMgdmFyYXJncyAqLworICAgIHVuc2lnbmVkIHN0ZV92YXJrZXl3b3JkcyA6IDE7IC8qIHRydWUgaWYgYmxvY2sgaGFzIHZhcmtleXdvcmRzICovCisgICAgdW5zaWduZWQgc3RlX3JldHVybnNfdmFsdWUgOiAxOyAgLyogdHJ1ZSBpZiBuYW1lc3BhY2UgdXNlcyByZXR1cm4gd2l0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuIGFyZ3VtZW50ICovCisgICAgaW50IHN0ZV9saW5lbm87ICAgICAgICAgIC8qIGZpcnN0IGxpbmUgb2YgYmxvY2sgKi8KKyAgICBpbnQgc3RlX29wdF9saW5lbm87ICAgICAgLyogbGluZW5vIG9mIGxhc3QgZXhlYyBvciBpbXBvcnQgKiAqLworICAgIGludCBzdGVfdG1wbmFtZTsgICAgICAgICAvKiBjb3VudGVyIGZvciBsaXN0Y29tcCB0ZW1wIHZhcnMgKi8KKyAgICBzdHJ1Y3Qgc3ltdGFibGUgKnN0ZV90YWJsZTsKIH0gUHlTVEVudHJ5T2JqZWN0OwogCiBQeUFQSV9EQVRBKFB5VHlwZU9iamVjdCkgUHlTVEVudHJ5X1R5cGU7CkBAIC01Myw4ICs1Myw4IEBACiAKIFB5QVBJX0ZVTkMoaW50KSBQeVNUX0dldFNjb3BlKFB5U1RFbnRyeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKIAotUHlBUElfRlVOQyhzdHJ1Y3Qgc3ltdGFibGUgKikgUHlTeW10YWJsZV9CdWlsZChtb2RfdHksIGNvbnN0IGNoYXIgKiwgCi0JCQkJCSAgICAgIFB5RnV0dXJlRmVhdHVyZXMgKik7CitQeUFQSV9GVU5DKHN0cnVjdCBzeW10YWJsZSAqKSBQeVN5bXRhYmxlX0J1aWxkKG1vZF90eSwgY29uc3QgY2hhciAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RnV0dXJlRmVhdHVyZXMgKik7CiBQeUFQSV9GVU5DKFB5U1RFbnRyeU9iamVjdCAqKSBQeVN5bXRhYmxlX0xvb2t1cChzdHJ1Y3Qgc3ltdGFibGUgKiwgdm9pZCAqKTsKIAogUHlBUElfRlVOQyh2b2lkKSBQeVN5bXRhYmxlX0ZyZWUoc3RydWN0IHN5bXRhYmxlICopOwpAQCAtNzYsNyArNzYsNyBAQAogI2RlZmluZSBERUZfQk9VTkQgKERFRl9MT0NBTCB8IERFRl9QQVJBTSB8IERFRl9JTVBPUlQpCiAKIC8qIEdMT0JBTF9FWFBMSUNJVCBhbmQgR0xPQkFMX0lNUExJQ0lUIGFyZSB1c2VkIGludGVybmFsbHkgYnkgdGhlIHN5bWJvbAotICAgdGFibGUuICBHTE9CQUwgaXMgcmV0dXJuZWQgZnJvbSBQeVNUX0dldFNjb3BlKCkgZm9yIGVpdGhlciBvZiB0aGVtLiAKKyAgIHRhYmxlLiAgR0xPQkFMIGlzIHJldHVybmVkIGZyb20gUHlTVF9HZXRTY29wZSgpIGZvciBlaXRoZXIgb2YgdGhlbS4KICAgIEl0IGlzIHN0b3JlZCBpbiBzdGVfc3ltYm9scyBhdCBiaXRzIDEyLTE0LgogKi8KICNkZWZpbmUgU0NPUEVfT0ZGIDExCmRpZmYgLS1naXQgYS9JbmNsdWRlL3VuaWNvZGVvYmplY3QuaCBiL0luY2x1ZGUvdW5pY29kZW9iamVjdC5oCmluZGV4IDJlMzk5YTAuLmMwYTFjYTEgMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvdW5pY29kZW9iamVjdC5oCisrKyBiL0luY2x1ZGUvdW5pY29kZW9iamVjdC5oCkBAIC0yOCwxNCArMjgsMTQgQEAKICAqCiAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogVGhpcyBVbmljb2RlIFN0cmluZyBUeXBlIGlzCi0gKiAKKyAqCiAgKiBDb3B5cmlnaHQgKGMpIDE5OTkgYnkgU2VjcmV0IExhYnMgQUIKICAqIENvcHlyaWdodCAoYykgMTk5OSBieSBGcmVkcmlrIEx1bmRoCi0gKiAKKyAqCiAgKiBCeSBvYnRhaW5pbmcsIHVzaW5nLCBhbmQvb3IgY29weWluZyB0aGlzIHNvZnR3YXJlIGFuZC9vciBpdHMKICAqIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiwgeW91IGFncmVlIHRoYXQgeW91IGhhdmUgcmVhZCwgdW5kZXJzdG9vZCwKICAqIGFuZCB3aWxsIGNvbXBseSB3aXRoIHRoZSBmb2xsb3dpbmcgdGVybXMgYW5kIGNvbmRpdGlvbnM6Ci0gKiAKKyAqCiAgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKICAqIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIGlzIGhlcmVieQogICogZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXJzIGluIGFsbApAQCAtNDQsNyArNDQsNyBAQAogICogQUIgb3IgdGhlIGF1dGhvciBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0bwogICogZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yCiAgKiBwZXJtaXNzaW9uLgotICogCisgKgogICogU0VDUkVUIExBQlMgQUIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPCiAgKiBUSElTIFNPRlRXQVJFLCBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5ECiAgKiBGSVRORVNTLiAgSU4gTk8gRVZFTlQgU0hBTEwgU0VDUkVUIExBQlMgQUIgT1IgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCkBAIC0xMjQsMTAgKzEyNCwxMCBAQAogICogVXNlIHRoaXMgdHlwZWRlZiB3aGVuIHlvdSBuZWVkIHRvIHJlcHJlc2VudCBhIFVURi0xNiBzdXJyb2dhdGUgcGFpcgogICogYXMgc2luZ2xlIHVuc2lnbmVkIGludGVnZXIuCiAgKi8KLSNpZiBTSVpFT0ZfSU5UID49IDQgCi10eXBlZGVmIHVuc2lnbmVkIGludCBQeV9VQ1M0OyAKKyNpZiBTSVpFT0ZfSU5UID49IDQKK3R5cGVkZWYgdW5zaWduZWQgaW50IFB5X1VDUzQ7CiAjZWxpZiBTSVpFT0ZfTE9ORyA+PSA0Ci10eXBlZGVmIHVuc2lnbmVkIGxvbmcgUHlfVUNTNDsgCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgUHlfVUNTNDsKICNlbmRpZgogCiAvKiBQeV9VTklDT0RFIGlzIHRoZSBuYXRpdmUgVW5pY29kZSBzdG9yYWdlIGZvcm1hdCAoY29kZSB1bml0KSB1c2VkIGJ5CkBAIC0zNjEsNyArMzYxLDcgQEAKIAogICovCiAjZGVmaW5lIFB5X1VOSUNPREVfSVNTUEFDRShjaCkgXAotCSgoY2gpIDwgMTI4VSA/IF9QeV9hc2NpaV93aGl0ZXNwYWNlWyhjaCldIDogX1B5VW5pY29kZV9Jc1doaXRlc3BhY2UoY2gpKQorICAgICgoY2gpIDwgMTI4VSA/IF9QeV9hc2NpaV93aGl0ZXNwYWNlWyhjaCldIDogX1B5VW5pY29kZV9Jc1doaXRlc3BhY2UoY2gpKQogCiAjZGVmaW5lIFB5X1VOSUNPREVfSVNMT1dFUihjaCkgX1B5VW5pY29kZV9Jc0xvd2VyY2FzZShjaCkKICNkZWZpbmUgUHlfVU5JQ09ERV9JU1VQUEVSKGNoKSBfUHlVbmljb2RlX0lzVXBwZXJjYXNlKGNoKQpAQCAtMzg2LDE2ICszODYsMTYgQEAKIAogI2RlZmluZSBQeV9VTklDT0RFX0lTQUxOVU0oY2gpIFwKICAgICAgICAoUHlfVU5JQ09ERV9JU0FMUEhBKGNoKSB8fCBcCi0gICAgICAgIFB5X1VOSUNPREVfSVNERUNJTUFMKGNoKSB8fCBcCi0gICAgICAgIFB5X1VOSUNPREVfSVNESUdJVChjaCkgfHwgXAotICAgICAgICBQeV9VTklDT0RFX0lTTlVNRVJJQyhjaCkpCisgICAgUHlfVU5JQ09ERV9JU0RFQ0lNQUwoY2gpIHx8IFwKKyAgICBQeV9VTklDT0RFX0lTRElHSVQoY2gpIHx8IFwKKyAgICBQeV9VTklDT0RFX0lTTlVNRVJJQyhjaCkpCiAKLSNkZWZpbmUgUHlfVU5JQ09ERV9DT1BZKHRhcmdldCwgc291cmNlLCBsZW5ndGgpCQkJCVwKLQlQeV9NRU1DUFkoKHRhcmdldCksIChzb3VyY2UpLCAobGVuZ3RoKSpzaXplb2YoUHlfVU5JQ09ERSkpCisjZGVmaW5lIFB5X1VOSUNPREVfQ09QWSh0YXJnZXQsIHNvdXJjZSwgbGVuZ3RoKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgUHlfTUVNQ1BZKCh0YXJnZXQpLCAoc291cmNlKSwgKGxlbmd0aCkqc2l6ZW9mKFB5X1VOSUNPREUpKQogCiAjZGVmaW5lIFB5X1VOSUNPREVfRklMTCh0YXJnZXQsIHZhbHVlLCBsZW5ndGgpIFwKICAgICBkbyB7UHlfc3NpemVfdCBpXzsgUHlfVU5JQ09ERSAqdF8gPSAodGFyZ2V0KTsgUHlfVU5JQ09ERSB2XyA9ICh2YWx1ZSk7XAotICAgICAgICBmb3IgKGlfID0gMDsgaV8gPCAobGVuZ3RoKTsgaV8rKykgdF9baV9dID0gdl87XAorICAgIGZvciAoaV8gPSAwOyBpXyA8IChsZW5ndGgpOyBpXysrKSB0X1tpX10gPSB2XztcCiAgICAgfSB3aGlsZSAoMCkKIAogLyogQ2hlY2sgaWYgc3Vic3RyaW5nIG1hdGNoZXMgYXQgZ2l2ZW4gb2Zmc2V0LiAgdGhlIG9mZnNldCBtdXN0IGJlCkBAIC00MTQsMTIgKzQxNCwxMiBAQAogCiB0eXBlZGVmIHN0cnVjdCB7CiAgICAgUHlPYmplY3RfSEVBRAotICAgIFB5X3NzaXplX3QgbGVuZ3RoOwkJLyogTGVuZ3RoIG9mIHJhdyBVbmljb2RlIGRhdGEgaW4gYnVmZmVyICovCi0gICAgUHlfVU5JQ09ERSAqc3RyOwkJLyogUmF3IFVuaWNvZGUgYnVmZmVyICovCi0gICAgbG9uZyBoYXNoOwkJCS8qIEhhc2ggdmFsdWU7IC0xIGlmIG5vdCBzZXQgKi8KLSAgICBQeU9iamVjdCAqZGVmZW5jOwkJLyogKERlZmF1bHQpIEVuY29kZWQgdmVyc2lvbiBhcyBQeXRob24KLQkJCQkgICBzdHJpbmcsIG9yIE5VTEw7IHRoaXMgaXMgdXNlZCBmb3IKLQkJCQkgICBpbXBsZW1lbnRpbmcgdGhlIGJ1ZmZlciBwcm90b2NvbCAqLworICAgIFB5X3NzaXplX3QgbGVuZ3RoOyAgICAgICAgICAvKiBMZW5ndGggb2YgcmF3IFVuaWNvZGUgZGF0YSBpbiBidWZmZXIgKi8KKyAgICBQeV9VTklDT0RFICpzdHI7ICAgICAgICAgICAgLyogUmF3IFVuaWNvZGUgYnVmZmVyICovCisgICAgbG9uZyBoYXNoOyAgICAgICAgICAgICAgICAgIC8qIEhhc2ggdmFsdWU7IC0xIGlmIG5vdCBzZXQgKi8KKyAgICBQeU9iamVjdCAqZGVmZW5jOyAgICAgICAgICAgLyogKERlZmF1bHQpIEVuY29kZWQgdmVyc2lvbiBhcyBQeXRob24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nLCBvciBOVUxMOyB0aGlzIGlzIHVzZWQgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGluZyB0aGUgYnVmZmVyIHByb3RvY29sICovCiB9IFB5VW5pY29kZU9iamVjdDsKIAogUHlBUElfREFUQShQeVR5cGVPYmplY3QpIFB5VW5pY29kZV9UeXBlOwpAQCAtNDMwLDEzICs0MzAsMTMgQEAKIAogLyogRmFzdCBhY2Nlc3MgbWFjcm9zICovCiAjZGVmaW5lIFB5VW5pY29kZV9HRVRfU0laRShvcCkgXAotICAgICAgICAoKChQeVVuaWNvZGVPYmplY3QgKikob3ApKS0+bGVuZ3RoKQorICAgICgoKFB5VW5pY29kZU9iamVjdCAqKShvcCkpLT5sZW5ndGgpCiAjZGVmaW5lIFB5VW5pY29kZV9HRVRfREFUQV9TSVpFKG9wKSBcCi0gICAgICAgICgoKFB5VW5pY29kZU9iamVjdCAqKShvcCkpLT5sZW5ndGggKiBzaXplb2YoUHlfVU5JQ09ERSkpCisgICAgKCgoUHlVbmljb2RlT2JqZWN0ICopKG9wKSktPmxlbmd0aCAqIHNpemVvZihQeV9VTklDT0RFKSkKICNkZWZpbmUgUHlVbmljb2RlX0FTX1VOSUNPREUob3ApIFwKLSAgICAgICAgKCgoUHlVbmljb2RlT2JqZWN0ICopKG9wKSktPnN0cikKKyAgICAoKChQeVVuaWNvZGVPYmplY3QgKikob3ApKS0+c3RyKQogI2RlZmluZSBQeVVuaWNvZGVfQVNfREFUQShvcCkgXAotICAgICAgICAoKGNvbnN0IGNoYXIgKikoKFB5VW5pY29kZU9iamVjdCAqKShvcCkpLT5zdHIpCisgICAgKChjb25zdCBjaGFyICopKChQeVVuaWNvZGVPYmplY3QgKikob3ApKS0+c3RyKQogCiAvKiAtLS0gQ29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIApAQCAtNDUyLDcgKzQ1Miw3IEBACiAvKiAtLS0gUGxhaW4gUHlfVU5JQ09ERSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAogLyogQ3JlYXRlIGEgVW5pY29kZSBPYmplY3QgZnJvbSB0aGUgUHlfVU5JQ09ERSBidWZmZXIgdSBvZiB0aGUgZ2l2ZW4KLSAgIHNpemUuIAorICAgc2l6ZS4KIAogICAgdSBtYXkgYmUgTlVMTCB3aGljaCBjYXVzZXMgdGhlIGNvbnRlbnRzIHRvIGJlIHVuZGVmaW5lZC4gSXQgaXMgdGhlCiAgICB1c2VyJ3MgcmVzcG9uc2liaWxpdHkgdG8gZmlsbCBpbiB0aGUgbmVlZGVkIGRhdGEgYWZ0ZXJ3YXJkcy4gTm90ZQpAQCAtNDgyLDEzICs0ODIsMTMgQEAKICAgIFB5X1VOSUNPREUgYnVmZmVyLiAqLwogCiBQeUFQSV9GVU5DKFB5X1VOSUNPREUgKikgUHlVbmljb2RlX0FzVW5pY29kZSgKLSAgICBQeU9iamVjdCAqdW5pY29kZQkgCS8qIFVuaWNvZGUgb2JqZWN0ICovCisgICAgUHlPYmplY3QgKnVuaWNvZGUgICAgICAgICAgIC8qIFVuaWNvZGUgb2JqZWN0ICovCiAgICAgKTsKIAogLyogR2V0IHRoZSBsZW5ndGggb2YgdGhlIFVuaWNvZGUgb2JqZWN0LiAqLwogCiBQeUFQSV9GVU5DKFB5X3NzaXplX3QpIFB5VW5pY29kZV9HZXRTaXplKAotICAgIFB5T2JqZWN0ICp1bmljb2RlCSAJLyogVW5pY29kZSBvYmplY3QgKi8KKyAgICBQeU9iamVjdCAqdW5pY29kZSAgICAgICAgICAgLyogVW5pY29kZSBvYmplY3QgKi8KICAgICApOwogCiAvKiBHZXQgdGhlIG1heGltdW0gb3JkaW5hbCBmb3IgYSBVbmljb2RlIGNoYXJhY3Rlci4gKi8KQEAgLTUwOSw4ICs1MDksOCBAQAogKi8KIAogUHlBUElfRlVOQyhpbnQpIFB5VW5pY29kZV9SZXNpemUoCi0gICAgUHlPYmplY3QgKip1bmljb2RlLAkJLyogUG9pbnRlciB0byB0aGUgVW5pY29kZSBvYmplY3QgKi8KLSAgICBQeV9zc2l6ZV90IGxlbmd0aAkJLyogTmV3IGxlbmd0aCAqLworICAgIFB5T2JqZWN0ICoqdW5pY29kZSwgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBVbmljb2RlIG9iamVjdCAqLworICAgIFB5X3NzaXplX3QgbGVuZ3RoICAgICAgICAgICAvKiBOZXcgbGVuZ3RoICovCiAgICAgKTsKIAogLyogQ29lcmNlIG9iaiB0byBhbiBVbmljb2RlIG9iamVjdCBhbmQgcmV0dXJuIGEgcmVmZXJlbmNlIHdpdGgKQEAgLTUzMSwxNCArNTMxLDE0IEBACiAqLwogCiBQeUFQSV9GVU5DKFB5T2JqZWN0KikgUHlVbmljb2RlX0Zyb21FbmNvZGVkT2JqZWN0KAotICAgIHJlZ2lzdGVyIFB5T2JqZWN0ICpvYmosIAkvKiBPYmplY3QgKi8KKyAgICByZWdpc3RlciBQeU9iamVjdCAqb2JqLCAgICAgLyogT2JqZWN0ICovCiAgICAgY29uc3QgY2hhciAqZW5jb2RpbmcsICAgICAgIC8qIGVuY29kaW5nICovCiAgICAgY29uc3QgY2hhciAqZXJyb3JzICAgICAgICAgIC8qIGVycm9yIGhhbmRsaW5nICovCiAgICAgKTsKIAogLyogQ29lcmNlIG9iaiB0byBhbiBVbmljb2RlIG9iamVjdCBhbmQgcmV0dXJuIGEgcmVmZXJlbmNlIHdpdGgKICAgICppbmNyZW1lbnRlZCogcmVmY291bnQuCi0gICAKKwogICAgVW5pY29kZSBvYmplY3RzIGFyZSBwYXNzZWQgYmFjayBhcy1pcyAoc3ViY2xhc3NlcyBhcmUgY29udmVydGVkIHRvCiAgICB0cnVlIFVuaWNvZGUgb2JqZWN0cyksIGFsbCBvdGhlciBvYmplY3RzIGFyZSBkZWxlZ2F0ZWQgdG8KICAgIFB5VW5pY29kZV9Gcm9tRW5jb2RlZE9iamVjdChvYmosIE5VTEwsICJzdHJpY3QiKSB3aGljaCByZXN1bHRzIGluCkBAIC01NTAsNyArNTUwLDcgQEAKICovCiAKIFB5QVBJX0ZVTkMoUHlPYmplY3QqKSBQeVVuaWNvZGVfRnJvbU9iamVjdCgKLSAgICByZWdpc3RlciBQeU9iamVjdCAqb2JqIAkvKiBPYmplY3QgKi8KKyAgICByZWdpc3RlciBQeU9iamVjdCAqb2JqICAgICAgLyogT2JqZWN0ICovCiAgICAgKTsKIAogUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeVVuaWNvZGVfRnJvbUZvcm1hdFYoY29uc3QgY2hhciosIHZhX2xpc3QpOwpAQCAtNTU5LDggKzU1OSw4IEBACiAvKiBGb3JtYXQgdGhlIG9iamVjdCBiYXNlZCBvbiB0aGUgZm9ybWF0X3NwZWMsIGFzIGRlZmluZWQgaW4gUEVQIDMxMDEKICAgIChBZHZhbmNlZCBTdHJpbmcgRm9ybWF0dGluZykuICovCiBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIF9QeVVuaWNvZGVfRm9ybWF0QWR2YW5jZWQoUHlPYmplY3QgKm9iaiwKLQkJCQkJCSBQeV9VTklDT0RFICpmb3JtYXRfc3BlYywKLQkJCQkJCSBQeV9zc2l6ZV90IGZvcm1hdF9zcGVjX2xlbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfVU5JQ09ERSAqZm9ybWF0X3NwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBmb3JtYXRfc3BlY19sZW4pOwogCiAvKiAtLS0gd2NoYXJfdCBzdXBwb3J0IGZvciBwbGF0Zm9ybXMgd2hpY2ggc3VwcG9ydCBpdCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIApAQCAtNTk4LDggKzU5OCw4IEBACiAKIC8qIC0tLSBVbmljb2RlIG9yZGluYWxzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKiBDcmVhdGUgYSBVbmljb2RlIE9iamVjdCBmcm9tIHRoZSBnaXZlbiBVbmljb2RlIGNvZGUgcG9pbnQgb3JkaW5hbC4gCi0gCisvKiBDcmVhdGUgYSBVbmljb2RlIE9iamVjdCBmcm9tIHRoZSBnaXZlbiBVbmljb2RlIGNvZGUgcG9pbnQgb3JkaW5hbC4KKwogICAgVGhlIG9yZGluYWwgbXVzdCBiZSBpbiByYW5nZSgweDEwMDAwKSBvbiBuYXJyb3cgUHl0aG9uIGJ1aWxkcwogICAgKFVDUzIpLCBhbmQgcmFuZ2UoMHgxMTAwMDApIG9uIHdpZGUgYnVpbGRzIChVQ1M0KS4gQSBWYWx1ZUVycm9yIGlzCiAgICByYWlzZWQgaW4gY2FzZSBpdCBpcyBub3QuCkBAIC02MTksMTEgKzYxOSwxMSBAQAogCiBQeUFQSV9GVU5DKGludCkgUHlVbmljb2RlX0NsZWFyRnJlZUxpc3Qodm9pZCk7CiAKLS8qID09PSBCdWlsdGluIENvZGVjcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAKKy8qID09PSBCdWlsdGluIENvZGVjcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCiAgICBNYW55IG9mIHRoZXNlIEFQSXMgdGFrZSB0d28gYXJndW1lbnRzIGVuY29kaW5nIGFuZCBlcnJvcnMuIFRoZXNlCiAgICBwYXJhbWV0ZXJzIGVuY29kaW5nIGFuZCBlcnJvcnMgaGF2ZSB0aGUgc2FtZSBzZW1hbnRpY3MgYXMgdGhlIG9uZXMKLSAgIG9mIHRoZSBidWlsdGluIHVuaWNvZGUoKSBBUEkuIAorICAgb2YgdGhlIGJ1aWx0aW4gdW5pY29kZSgpIEFQSS4KIAogICAgU2V0dGluZyBlbmNvZGluZyB0byBOVUxMIGNhdXNlcyB0aGUgZGVmYXVsdCBlbmNvZGluZyB0byBiZSB1c2VkLgogCkBAIC02NDAsNyArNjQwLDcgQEAKIC8qIC0tLSBNYW5hZ2UgdGhlIGRlZmF1bHQgZW5jb2RpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiAvKiBSZXR1cm4gYSBQeXRob24gc3RyaW5nIGhvbGRpbmcgdGhlIGRlZmF1bHQgZW5jb2RlZCB2YWx1ZSBvZiB0aGUKLSAgIFVuaWNvZGUgb2JqZWN0LiAKKyAgIFVuaWNvZGUgb2JqZWN0LgogCiAgICBUaGUgcmVzdWx0aW5nIHN0cmluZyBpcyBjYWNoZWQgaW4gdGhlIFVuaWNvZGUgb2JqZWN0IGZvciBzdWJzZXF1ZW50CiAgICB1c2FnZSBieSB0aGlzIGZ1bmN0aW9uLiBUaGUgY2FjaGVkIHZlcnNpb24gaXMgbmVlZGVkIHRvIGltcGxlbWVudApAQCAtNjYyLDcgKzY2Miw3IEBACiAgICBwcm9jZXNzIGdsb2JhbC4gIFRoaXMgbWF5IGNoYW5nZSBpbiBmdXR1cmUgdmVyc2lvbnMgb2YgdGhlCiAgICBpbnRlcnByZXRlciB0byBiZWNvbWUgYSBwYXJhbWV0ZXIgd2hpY2ggaXMgbWFuYWdlZCBvbiBhIHBlci10aHJlYWQKICAgIGJhc2lzLgotICAgCisKICAqLwogCiBQeUFQSV9GVU5DKGNvbnN0IGNoYXIqKSBQeVVuaWNvZGVfR2V0RGVmYXVsdEVuY29kaW5nKHZvaWQpOwpAQCAtNjcwLDExICs2NzAsMTEgQEAKIC8qIFNldHMgdGhlIGN1cnJlbnRseSBhY3RpdmUgZGVmYXVsdCBlbmNvZGluZy4KIAogICAgUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC0xIGluIGNhc2Ugb2YgYW4gZXJyb3IuCi0gICAKKwogICovCiAKIFB5QVBJX0ZVTkMoaW50KSBQeVVuaWNvZGVfU2V0RGVmYXVsdEVuY29kaW5nKAotICAgIGNvbnN0IGNoYXIgKmVuY29kaW5nCS8qIEVuY29kaW5nIG5hbWUgaW4gc3RhbmRhcmQgZm9ybSAqLworICAgIGNvbnN0IGNoYXIgKmVuY29kaW5nICAgICAgICAvKiBFbmNvZGluZyBuYW1lIGluIHN0YW5kYXJkIGZvcm0gKi8KICAgICApOwogCiAvKiAtLS0gR2VuZXJpYyBDb2RlY3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTY4OSw3ICs2ODksNyBAQAogICAgIGNvbnN0IGNoYXIgKmVycm9ycyAgICAgICAgICAvKiBlcnJvciBoYW5kbGluZyAqLwogICAgICk7CiAKLS8qIEVuY29kZXMgYSBQeV9VTklDT0RFIGJ1ZmZlciBvZiB0aGUgZ2l2ZW4gc2l6ZSBhbmQgcmV0dXJucyBhIAorLyogRW5jb2RlcyBhIFB5X1VOSUNPREUgYnVmZmVyIG9mIHRoZSBnaXZlbiBzaXplIGFuZCByZXR1cm5zIGEKICAgIFB5dGhvbiBzdHJpbmcgb2JqZWN0LiAqLwogCiBQeUFQSV9GVU5DKFB5T2JqZWN0KikgUHlVbmljb2RlX0VuY29kZSgKQEAgLTcwMywxOCArNzAzLDE4IEBACiAgICBvYmplY3QuICovCiAKIFB5QVBJX0ZVTkMoUHlPYmplY3QqKSBQeVVuaWNvZGVfQXNFbmNvZGVkT2JqZWN0KAotICAgIFB5T2JqZWN0ICp1bmljb2RlLAkgCS8qIFVuaWNvZGUgb2JqZWN0ICovCi0gICAgY29uc3QgY2hhciAqZW5jb2RpbmcsCS8qIGVuY29kaW5nICovCi0gICAgY29uc3QgY2hhciAqZXJyb3JzCQkvKiBlcnJvciBoYW5kbGluZyAqLworICAgIFB5T2JqZWN0ICp1bmljb2RlLCAgICAgICAgICAvKiBVbmljb2RlIG9iamVjdCAqLworICAgIGNvbnN0IGNoYXIgKmVuY29kaW5nLCAgICAgICAvKiBlbmNvZGluZyAqLworICAgIGNvbnN0IGNoYXIgKmVycm9ycyAgICAgICAgICAvKiBlcnJvciBoYW5kbGluZyAqLwogICAgICk7CiAKIC8qIEVuY29kZXMgYSBVbmljb2RlIG9iamVjdCBhbmQgcmV0dXJucyB0aGUgcmVzdWx0IGFzIFB5dGhvbiBzdHJpbmcKICAgIG9iamVjdC4gKi8KIAogUHlBUElfRlVOQyhQeU9iamVjdCopIFB5VW5pY29kZV9Bc0VuY29kZWRTdHJpbmcoCi0gICAgUHlPYmplY3QgKnVuaWNvZGUsCSAJLyogVW5pY29kZSBvYmplY3QgKi8KLSAgICBjb25zdCBjaGFyICplbmNvZGluZywJLyogZW5jb2RpbmcgKi8KLSAgICBjb25zdCBjaGFyICplcnJvcnMJCS8qIGVycm9yIGhhbmRsaW5nICovCisgICAgUHlPYmplY3QgKnVuaWNvZGUsICAgICAgICAgIC8qIFVuaWNvZGUgb2JqZWN0ICovCisgICAgY29uc3QgY2hhciAqZW5jb2RpbmcsICAgICAgIC8qIGVuY29kaW5nICovCisgICAgY29uc3QgY2hhciAqZXJyb3JzICAgICAgICAgIC8qIGVycm9yIGhhbmRsaW5nICovCiAgICAgKTsKIAogUHlBUElfRlVOQyhQeU9iamVjdCopIFB5VW5pY29kZV9CdWlsZEVuY29kaW5nTWFwKApAQCAtNzI1LDUxICs3MjUsNTEgQEAKIC8qIC0tLSBVVEYtNyBDb2RlY3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiBQeUFQSV9GVU5DKFB5T2JqZWN0KikgUHlVbmljb2RlX0RlY29kZVVURjcoCi0gICAgY29uc3QgY2hhciAqc3RyaW5nLCAJLyogVVRGLTcgZW5jb2RlZCBzdHJpbmcgKi8KLSAgICBQeV9zc2l6ZV90IGxlbmd0aCwJIAkvKiBzaXplIG9mIHN0cmluZyAqLwotICAgIGNvbnN0IGNoYXIgKmVycm9ycwkJLyogZXJyb3IgaGFuZGxpbmcgKi8KKyAgICBjb25zdCBjaGFyICpzdHJpbmcsICAgICAgICAgLyogVVRGLTcgZW5jb2RlZCBzdHJpbmcgKi8KKyAgICBQeV9zc2l6ZV90IGxlbmd0aCwgICAgICAgICAgLyogc2l6ZSBvZiBzdHJpbmcgKi8KKyAgICBjb25zdCBjaGFyICplcnJvcnMgICAgICAgICAgLyogZXJyb3IgaGFuZGxpbmcgKi8KICAgICApOwogCiBQeUFQSV9GVU5DKFB5T2JqZWN0KikgUHlVbmljb2RlX0RlY29kZVVURjdTdGF0ZWZ1bCgKLSAgICBjb25zdCBjaGFyICpzdHJpbmcsIAkvKiBVVEYtNyBlbmNvZGVkIHN0cmluZyAqLwotICAgIFB5X3NzaXplX3QgbGVuZ3RoLAkgCS8qIHNpemUgb2Ygc3RyaW5nICovCi0gICAgY29uc3QgY2hhciAqZXJyb3JzLAkJLyogZXJyb3IgaGFuZGxpbmcgKi8KLSAgICBQeV9zc2l6ZV90ICpjb25zdW1lZAkvKiBieXRlcyBjb25zdW1lZCAqLworICAgIGNvbnN0IGNoYXIgKnN0cmluZywgICAgICAgICAvKiBVVEYtNyBlbmNvZGVkIHN0cmluZyAqLworICAgIFB5X3NzaXplX3QgbGVuZ3RoLCAgICAgICAgICAvKiBzaXplIG9mIHN0cmluZyAqLworICAgIGNvbnN0IGNoYXIgKmVycm9ycywgICAgICAgICAvKiBlcnJvciBoYW5kbGluZyAqLworICAgIFB5X3NzaXplX3QgKmNvbnN1bWVkICAgICAgICAvKiBieXRlcyBjb25zdW1lZCAqLwogICAgICk7CiAKIFB5QVBJX0ZVTkMoUHlPYmplY3QqKSBQeVVuaWNvZGVfRW5jb2RlVVRGNygKLSAgICBjb25zdCBQeV9VTklDT0RFICpkYXRhLCAJLyogVW5pY29kZSBjaGFyIGJ1ZmZlciAqLwotICAgIFB5X3NzaXplX3QgbGVuZ3RoLAkgCQkvKiBudW1iZXIgb2YgUHlfVU5JQ09ERSBjaGFycyB0byBlbmNvZGUgKi8KKyAgICBjb25zdCBQeV9VTklDT0RFICpkYXRhLCAgICAgLyogVW5pY29kZSBjaGFyIGJ1ZmZlciAqLworICAgIFB5X3NzaXplX3QgbGVuZ3RoLCAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBQeV9VTklDT0RFIGNoYXJzIHRvIGVuY29kZSAqLwogICAgIGludCBlbmNvZGVTZXRPLCAgICAgICAgICAgICAvKiBmb3JjZSB0aGUgZW5jb2RlciB0byBlbmNvZGUgY2hhcmFjdGVycyBpbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQgTywgYXMgZGVzY3JpYmVkIGluIFJGQzIxNTIgKi8KICAgICBpbnQgZW5jb2RlV2hpdGVTcGFjZSwgICAgICAgLyogZm9yY2UgdGhlIGVuY29kZXIgdG8gZW5jb2RlIHNwYWNlLCB0YWIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcnJpYWdlIHJldHVybiBhbmQgbGluZWZlZWQgY2hhcmFjdGVycyAqLwotICAgIGNvbnN0IGNoYXIgKmVycm9ycwkJLyogZXJyb3IgaGFuZGxpbmcgKi8KKyAgICBjb25zdCBjaGFyICplcnJvcnMgICAgICAgICAgLyogZXJyb3IgaGFuZGxpbmcgKi8KICAgICApOwogCiAvKiAtLS0gVVRGLTggQ29kZWNzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAogUHlBUElfRlVOQyhQeU9iamVjdCopIFB5VW5pY29kZV9EZWNvZGVVVEY4KAotICAgIGNvbnN0IGNoYXIgKnN0cmluZywgCS8qIFVURi04IGVuY29kZWQgc3RyaW5nICovCi0gICAgUHlfc3NpemVfdCBsZW5ndGgsCSAJLyogc2l6ZSBvZiBzdHJpbmcgKi8KLSAgICBjb25zdCBjaGFyICplcnJvcnMJCS8qIGVycm9yIGhhbmRsaW5nICovCisgICAgY29uc3QgY2hhciAqc3RyaW5nLCAgICAgICAgIC8qIFVURi04IGVuY29kZWQgc3RyaW5nICovCisgICAgUHlfc3NpemVfdCBsZW5ndGgsICAgICAgICAgIC8qIHNpemUgb2Ygc3RyaW5nICovCisgICAgY29uc3QgY2hhciAqZXJyb3JzICAgICAgICAgIC8qIGVycm9yIGhhbmRsaW5nICovCiAgICAgKTsKIAogUHlBUElfRlVOQyhQeU9iamVjdCopIFB5VW5pY29kZV9EZWNvZGVVVEY4U3RhdGVmdWwoCi0gICAgY29uc3QgY2hhciAqc3RyaW5nLCAJLyogVVRGLTggZW5jb2RlZCBzdHJpbmcgKi8KLSAgICBQeV9zc2l6ZV90IGxlbmd0aCwJIAkvKiBzaXplIG9mIHN0cmluZyAqLwotICAgIGNvbnN0IGNoYXIgKmVycm9ycywJCS8qIGVycm9yIGhhbmRsaW5nICovCi0gICAgUHlfc3NpemVfdCAqY29uc3VtZWQJCS8qIGJ5dGVzIGNvbnN1bWVkICovCisgICAgY29uc3QgY2hhciAqc3RyaW5nLCAgICAgICAgIC8qIFVURi04IGVuY29kZWQgc3RyaW5nICovCisgICAgUHlfc3NpemVfdCBsZW5ndGgsICAgICAgICAgIC8qIHNpemUgb2Ygc3RyaW5nICovCisgICAgY29uc3QgY2hhciAqZXJyb3JzLCAgICAgICAgIC8qIGVycm9yIGhhbmRsaW5nICovCisgICAgUHlfc3NpemVfdCAqY29uc3VtZWQgICAgICAgICAgICAgICAgLyogYnl0ZXMgY29uc3VtZWQgKi8KICAgICApOwogCiBQeUFQSV9GVU5DKFB5T2JqZWN0KikgUHlVbmljb2RlX0FzVVRGOFN0cmluZygKLSAgICBQeU9iamVjdCAqdW5pY29kZQkgCS8qIFVuaWNvZGUgb2JqZWN0ICovCisgICAgUHlPYmplY3QgKnVuaWNvZGUgICAgICAgICAgIC8qIFVuaWNvZGUgb2JqZWN0ICovCiAgICAgKTsKIAogUHlBUElfRlVOQyhQeU9iamVjdCopIFB5VW5pY29kZV9FbmNvZGVVVEY4KAotICAgIGNvbnN0IFB5X1VOSUNPREUgKmRhdGEsIAkvKiBVbmljb2RlIGNoYXIgYnVmZmVyICovCi0gICAgUHlfc3NpemVfdCBsZW5ndGgsCSAJCS8qIG51bWJlciBvZiBQeV9VTklDT0RFIGNoYXJzIHRvIGVuY29kZSAqLwotICAgIGNvbnN0IGNoYXIgKmVycm9ycwkJLyogZXJyb3IgaGFuZGxpbmcgKi8KKyAgICBjb25zdCBQeV9VTklDT0RFICpkYXRhLCAgICAgLyogVW5pY29kZSBjaGFyIGJ1ZmZlciAqLworICAgIFB5X3NzaXplX3QgbGVuZ3RoLCAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBQeV9VTklDT0RFIGNoYXJzIHRvIGVuY29kZSAqLworICAgIGNvbnN0IGNoYXIgKmVycm9ycyAgICAgICAgICAvKiBlcnJvciBoYW5kbGluZyAqLwogICAgICk7CiAKIC8qIC0tLSBVVEYtMzIgQ29kZWNzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtNzc4LDE0ICs3NzgsMTQgQEAKICAgIHRoZSBjb3JyZXNwb25kaW5nIFVuaWNvZGUgb2JqZWN0LgogCiAgICBlcnJvcnMgKGlmIG5vbi1OVUxMKSBkZWZpbmVzIHRoZSBlcnJvciBoYW5kbGluZy4gSXQgZGVmYXVsdHMKLSAgIHRvICJzdHJpY3QiLiAKKyAgIHRvICJzdHJpY3QiLgogCiAgICBJZiBieXRlb3JkZXIgaXMgbm9uLU5VTEwsIHRoZSBkZWNvZGVyIHN0YXJ0cyBkZWNvZGluZyB1c2luZyB0aGUKICAgIGdpdmVuIGJ5dGUgb3JkZXI6CiAKLQkqYnl0ZW9yZGVyID09IC0xOiBsaXR0bGUgZW5kaWFuCi0JKmJ5dGVvcmRlciA9PSAwOiAgbmF0aXZlIG9yZGVyCi0JKmJ5dGVvcmRlciA9PSAxOiAgYmlnIGVuZGlhbgorICAgICpieXRlb3JkZXIgPT0gLTE6IGxpdHRsZSBlbmRpYW4KKyAgICAqYnl0ZW9yZGVyID09IDA6ICBuYXRpdmUgb3JkZXIKKyAgICAqYnl0ZW9yZGVyID09IDE6ICBiaWcgZW5kaWFuCiAKICAgIEluIG5hdGl2ZSBtb2RlLCB0aGUgZmlyc3QgZm91ciBieXRlcyBvZiB0aGUgc3RyZWFtIGFyZSBjaGVja2VkIGZvciBhCiAgICBCT00gbWFyay4gSWYgZm91bmQsIHRoZSBCT00gbWFyayBpcyBhbmFseXNlZCwgdGhlIGJ5dGUgb3JkZXIKQEAgLTc5OCwyOSArNzk4LDI5IEBACiAqLwogCiBQeUFQSV9GVU5DKFB5T2JqZWN0KikgUHlVbmljb2RlX0RlY29kZVVURjMyKAotICAgIGNvbnN0IGNoYXIgKnN0cmluZywgCS8qIFVURi0zMiBlbmNvZGVkIHN0cmluZyAqLwotICAgIFB5X3NzaXplX3QgbGVuZ3RoLAkgCS8qIHNpemUgb2Ygc3RyaW5nICovCi0gICAgY29uc3QgY2hhciAqZXJyb3JzLAkJLyogZXJyb3IgaGFuZGxpbmcgKi8KLSAgICBpbnQgKmJ5dGVvcmRlcgkJLyogcG9pbnRlciB0byBieXRlb3JkZXIgdG8gdXNlCi0JCQkJICAgMD1uYXRpdmU7LTE9TEUsMT1CRTsgdXBkYXRlZCBvbgotCQkJCSAgIGV4aXQgKi8KKyAgICBjb25zdCBjaGFyICpzdHJpbmcsICAgICAgICAgLyogVVRGLTMyIGVuY29kZWQgc3RyaW5nICovCisgICAgUHlfc3NpemVfdCBsZW5ndGgsICAgICAgICAgIC8qIHNpemUgb2Ygc3RyaW5nICovCisgICAgY29uc3QgY2hhciAqZXJyb3JzLCAgICAgICAgIC8qIGVycm9yIGhhbmRsaW5nICovCisgICAgaW50ICpieXRlb3JkZXIgICAgICAgICAgICAgIC8qIHBvaW50ZXIgdG8gYnl0ZW9yZGVyIHRvIHVzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwPW5hdGl2ZTstMT1MRSwxPUJFOyB1cGRhdGVkIG9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQgKi8KICAgICApOwogCiBQeUFQSV9GVU5DKFB5T2JqZWN0KikgUHlVbmljb2RlX0RlY29kZVVURjMyU3RhdGVmdWwoCi0gICAgY29uc3QgY2hhciAqc3RyaW5nLCAJLyogVVRGLTMyIGVuY29kZWQgc3RyaW5nICovCi0gICAgUHlfc3NpemVfdCBsZW5ndGgsCSAJLyogc2l6ZSBvZiBzdHJpbmcgKi8KLSAgICBjb25zdCBjaGFyICplcnJvcnMsCQkvKiBlcnJvciBoYW5kbGluZyAqLwotICAgIGludCAqYnl0ZW9yZGVyLAkJLyogcG9pbnRlciB0byBieXRlb3JkZXIgdG8gdXNlCi0JCQkJICAgMD1uYXRpdmU7LTE9TEUsMT1CRTsgdXBkYXRlZCBvbgotCQkJCSAgIGV4aXQgKi8KLSAgICBQeV9zc2l6ZV90ICpjb25zdW1lZAkvKiBieXRlcyBjb25zdW1lZCAqLworICAgIGNvbnN0IGNoYXIgKnN0cmluZywgICAgICAgICAvKiBVVEYtMzIgZW5jb2RlZCBzdHJpbmcgKi8KKyAgICBQeV9zc2l6ZV90IGxlbmd0aCwgICAgICAgICAgLyogc2l6ZSBvZiBzdHJpbmcgKi8KKyAgICBjb25zdCBjaGFyICplcnJvcnMsICAgICAgICAgLyogZXJyb3IgaGFuZGxpbmcgKi8KKyAgICBpbnQgKmJ5dGVvcmRlciwgICAgICAgICAgICAgLyogcG9pbnRlciB0byBieXRlb3JkZXIgdG8gdXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDA9bmF0aXZlOy0xPUxFLDE9QkU7IHVwZGF0ZWQgb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpdCAqLworICAgIFB5X3NzaXplX3QgKmNvbnN1bWVkICAgICAgICAvKiBieXRlcyBjb25zdW1lZCAqLwogICAgICk7CiAKIC8qIFJldHVybnMgYSBQeXRob24gc3RyaW5nIHVzaW5nIHRoZSBVVEYtMzIgZW5jb2RpbmcgaW4gbmF0aXZlIGJ5dGUKICAgIG9yZGVyLiBUaGUgc3RyaW5nIGFsd2F5cyBzdGFydHMgd2l0aCBhIEJPTSBtYXJrLiAgKi8KIAogUHlBUElfRlVOQyhQeU9iamVjdCopIFB5VW5pY29kZV9Bc1VURjMyU3RyaW5nKAotICAgIFB5T2JqZWN0ICp1bmljb2RlCSAJLyogVW5pY29kZSBvYmplY3QgKi8KKyAgICBQeU9iamVjdCAqdW5pY29kZSAgICAgICAgICAgLyogVW5pY29kZSBvYmplY3QgKi8KICAgICApOwogCiAvKiBSZXR1cm5zIGEgUHl0aG9uIHN0cmluZyBvYmplY3QgaG9sZGluZyB0aGUgVVRGLTMyIGVuY29kZWQgdmFsdWUgb2YKQEAgLTg0MCwxMCArODQwLDEwIEBACiAqLwogCiBQeUFQSV9GVU5DKFB5T2JqZWN0KikgUHlVbmljb2RlX0VuY29kZVVURjMyKAotICAgIGNvbnN0IFB5X1VOSUNPREUgKmRhdGEsIAkvKiBVbmljb2RlIGNoYXIgYnVmZmVyICovCi0gICAgUHlfc3NpemVfdCBsZW5ndGgsCSAJLyogbnVtYmVyIG9mIFB5X1VOSUNPREUgY2hhcnMgdG8gZW5jb2RlICovCi0gICAgY29uc3QgY2hhciAqZXJyb3JzLAkJLyogZXJyb3IgaGFuZGxpbmcgKi8KLSAgICBpbnQgYnl0ZW9yZGVyCQkvKiBieXRlb3JkZXIgdG8gdXNlIDA9Qk9NK25hdGl2ZTstMT1MRSwxPUJFICovCisgICAgY29uc3QgUHlfVU5JQ09ERSAqZGF0YSwgICAgIC8qIFVuaWNvZGUgY2hhciBidWZmZXIgKi8KKyAgICBQeV9zc2l6ZV90IGxlbmd0aCwgICAgICAgICAgLyogbnVtYmVyIG9mIFB5X1VOSUNPREUgY2hhcnMgdG8gZW5jb2RlICovCisgICAgY29uc3QgY2hhciAqZXJyb3JzLCAgICAgICAgIC8qIGVycm9yIGhhbmRsaW5nICovCisgICAgaW50IGJ5dGVvcmRlciAgICAgICAgICAgICAgIC8qIGJ5dGVvcmRlciB0byB1c2UgMD1CT00rbmF0aXZlOy0xPUxFLDE9QkUgKi8KICAgICApOwogCiAvKiAtLS0gVVRGLTE2IENvZGVjcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTg1MiwxNCArODUyLDE0IEBACiAgICB0aGUgY29ycmVzcG9uZGluZyBVbmljb2RlIG9iamVjdC4KIAogICAgZXJyb3JzIChpZiBub24tTlVMTCkgZGVmaW5lcyB0aGUgZXJyb3IgaGFuZGxpbmcuIEl0IGRlZmF1bHRzCi0gICB0byAic3RyaWN0Ii4gCisgICB0byAic3RyaWN0Ii4KIAogICAgSWYgYnl0ZW9yZGVyIGlzIG5vbi1OVUxMLCB0aGUgZGVjb2RlciBzdGFydHMgZGVjb2RpbmcgdXNpbmcgdGhlCiAgICBnaXZlbiBieXRlIG9yZGVyOgogCi0JKmJ5dGVvcmRlciA9PSAtMTogbGl0dGxlIGVuZGlhbgotCSpieXRlb3JkZXIgPT0gMDogIG5hdGl2ZSBvcmRlcgotCSpieXRlb3JkZXIgPT0gMTogIGJpZyBlbmRpYW4KKyAgICAqYnl0ZW9yZGVyID09IC0xOiBsaXR0bGUgZW5kaWFuCisgICAgKmJ5dGVvcmRlciA9PSAwOiAgbmF0aXZlIG9yZGVyCisgICAgKmJ5dGVvcmRlciA9PSAxOiAgYmlnIGVuZGlhbgogCiAgICBJbiBuYXRpdmUgbW9kZSwgdGhlIGZpcnN0IHR3byBieXRlcyBvZiB0aGUgc3RyZWFtIGFyZSBjaGVja2VkIGZvciBhCiAgICBCT00gbWFyay4gSWYgZm91bmQsIHRoZSBCT00gbWFyayBpcyBhbmFseXNlZCwgdGhlIGJ5dGUgb3JkZXIKQEAgLTg3MiwyOSArODcyLDI5IEBACiAqLwogCiBQeUFQSV9GVU5DKFB5T2JqZWN0KikgUHlVbmljb2RlX0RlY29kZVVURjE2KAotICAgIGNvbnN0IGNoYXIgKnN0cmluZywgCS8qIFVURi0xNiBlbmNvZGVkIHN0cmluZyAqLwotICAgIFB5X3NzaXplX3QgbGVuZ3RoLAkgCS8qIHNpemUgb2Ygc3RyaW5nICovCi0gICAgY29uc3QgY2hhciAqZXJyb3JzLAkJLyogZXJyb3IgaGFuZGxpbmcgKi8KLSAgICBpbnQgKmJ5dGVvcmRlcgkJLyogcG9pbnRlciB0byBieXRlb3JkZXIgdG8gdXNlCi0JCQkJICAgMD1uYXRpdmU7LTE9TEUsMT1CRTsgdXBkYXRlZCBvbgotCQkJCSAgIGV4aXQgKi8KKyAgICBjb25zdCBjaGFyICpzdHJpbmcsICAgICAgICAgLyogVVRGLTE2IGVuY29kZWQgc3RyaW5nICovCisgICAgUHlfc3NpemVfdCBsZW5ndGgsICAgICAgICAgIC8qIHNpemUgb2Ygc3RyaW5nICovCisgICAgY29uc3QgY2hhciAqZXJyb3JzLCAgICAgICAgIC8qIGVycm9yIGhhbmRsaW5nICovCisgICAgaW50ICpieXRlb3JkZXIgICAgICAgICAgICAgIC8qIHBvaW50ZXIgdG8gYnl0ZW9yZGVyIHRvIHVzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwPW5hdGl2ZTstMT1MRSwxPUJFOyB1cGRhdGVkIG9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQgKi8KICAgICApOwogCiBQeUFQSV9GVU5DKFB5T2JqZWN0KikgUHlVbmljb2RlX0RlY29kZVVURjE2U3RhdGVmdWwoCi0gICAgY29uc3QgY2hhciAqc3RyaW5nLCAJLyogVVRGLTE2IGVuY29kZWQgc3RyaW5nICovCi0gICAgUHlfc3NpemVfdCBsZW5ndGgsCSAJLyogc2l6ZSBvZiBzdHJpbmcgKi8KLSAgICBjb25zdCBjaGFyICplcnJvcnMsCQkvKiBlcnJvciBoYW5kbGluZyAqLwotICAgIGludCAqYnl0ZW9yZGVyLAkJLyogcG9pbnRlciB0byBieXRlb3JkZXIgdG8gdXNlCi0JCQkJICAgMD1uYXRpdmU7LTE9TEUsMT1CRTsgdXBkYXRlZCBvbgotCQkJCSAgIGV4aXQgKi8KLSAgICBQeV9zc2l6ZV90ICpjb25zdW1lZAkJLyogYnl0ZXMgY29uc3VtZWQgKi8KKyAgICBjb25zdCBjaGFyICpzdHJpbmcsICAgICAgICAgLyogVVRGLTE2IGVuY29kZWQgc3RyaW5nICovCisgICAgUHlfc3NpemVfdCBsZW5ndGgsICAgICAgICAgIC8qIHNpemUgb2Ygc3RyaW5nICovCisgICAgY29uc3QgY2hhciAqZXJyb3JzLCAgICAgICAgIC8qIGVycm9yIGhhbmRsaW5nICovCisgICAgaW50ICpieXRlb3JkZXIsICAgICAgICAgICAgIC8qIHBvaW50ZXIgdG8gYnl0ZW9yZGVyIHRvIHVzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwPW5hdGl2ZTstMT1MRSwxPUJFOyB1cGRhdGVkIG9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQgKi8KKyAgICBQeV9zc2l6ZV90ICpjb25zdW1lZCAgICAgICAgICAgICAgICAvKiBieXRlcyBjb25zdW1lZCAqLwogICAgICk7CiAKIC8qIFJldHVybnMgYSBQeXRob24gc3RyaW5nIHVzaW5nIHRoZSBVVEYtMTYgZW5jb2RpbmcgaW4gbmF0aXZlIGJ5dGUKICAgIG9yZGVyLiBUaGUgc3RyaW5nIGFsd2F5cyBzdGFydHMgd2l0aCBhIEJPTSBtYXJrLiAgKi8KIAogUHlBUElfRlVOQyhQeU9iamVjdCopIFB5VW5pY29kZV9Bc1VURjE2U3RyaW5nKAotICAgIFB5T2JqZWN0ICp1bmljb2RlCSAJLyogVW5pY29kZSBvYmplY3QgKi8KKyAgICBQeU9iamVjdCAqdW5pY29kZSAgICAgICAgICAgLyogVW5pY29kZSBvYmplY3QgKi8KICAgICApOwogCiAvKiBSZXR1cm5zIGEgUHl0aG9uIHN0cmluZyBvYmplY3QgaG9sZGluZyB0aGUgVVRGLTE2IGVuY29kZWQgdmFsdWUgb2YKQEAgLTkxOCw0NCArOTE4LDQ0IEBACiAqLwogCiBQeUFQSV9GVU5DKFB5T2JqZWN0KikgUHlVbmljb2RlX0VuY29kZVVURjE2KAotICAgIGNvbnN0IFB5X1VOSUNPREUgKmRhdGEsIAkvKiBVbmljb2RlIGNoYXIgYnVmZmVyICovCi0gICAgUHlfc3NpemVfdCBsZW5ndGgsCSAJCS8qIG51bWJlciBvZiBQeV9VTklDT0RFIGNoYXJzIHRvIGVuY29kZSAqLwotICAgIGNvbnN0IGNoYXIgKmVycm9ycywJCS8qIGVycm9yIGhhbmRsaW5nICovCi0gICAgaW50IGJ5dGVvcmRlcgkJLyogYnl0ZW9yZGVyIHRvIHVzZSAwPUJPTStuYXRpdmU7LTE9TEUsMT1CRSAqLworICAgIGNvbnN0IFB5X1VOSUNPREUgKmRhdGEsICAgICAvKiBVbmljb2RlIGNoYXIgYnVmZmVyICovCisgICAgUHlfc3NpemVfdCBsZW5ndGgsICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIFB5X1VOSUNPREUgY2hhcnMgdG8gZW5jb2RlICovCisgICAgY29uc3QgY2hhciAqZXJyb3JzLCAgICAgICAgIC8qIGVycm9yIGhhbmRsaW5nICovCisgICAgaW50IGJ5dGVvcmRlciAgICAgICAgICAgICAgIC8qIGJ5dGVvcmRlciB0byB1c2UgMD1CT00rbmF0aXZlOy0xPUxFLDE9QkUgKi8KICAgICApOwogCiAvKiAtLS0gVW5pY29kZS1Fc2NhcGUgQ29kZWNzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAogUHlBUElfRlVOQyhQeU9iamVjdCopIFB5VW5pY29kZV9EZWNvZGVVbmljb2RlRXNjYXBlKAotICAgIGNvbnN0IGNoYXIgKnN0cmluZywgCS8qIFVuaWNvZGUtRXNjYXBlIGVuY29kZWQgc3RyaW5nICovCi0gICAgUHlfc3NpemVfdCBsZW5ndGgsCSAJLyogc2l6ZSBvZiBzdHJpbmcgKi8KLSAgICBjb25zdCBjaGFyICplcnJvcnMJCS8qIGVycm9yIGhhbmRsaW5nICovCisgICAgY29uc3QgY2hhciAqc3RyaW5nLCAgICAgICAgIC8qIFVuaWNvZGUtRXNjYXBlIGVuY29kZWQgc3RyaW5nICovCisgICAgUHlfc3NpemVfdCBsZW5ndGgsICAgICAgICAgIC8qIHNpemUgb2Ygc3RyaW5nICovCisgICAgY29uc3QgY2hhciAqZXJyb3JzICAgICAgICAgIC8qIGVycm9yIGhhbmRsaW5nICovCiAgICAgKTsKIAogUHlBUElfRlVOQyhQeU9iamVjdCopIFB5VW5pY29kZV9Bc1VuaWNvZGVFc2NhcGVTdHJpbmcoCi0gICAgUHlPYmplY3QgKnVuaWNvZGUJIAkvKiBVbmljb2RlIG9iamVjdCAqLworICAgIFB5T2JqZWN0ICp1bmljb2RlICAgICAgICAgICAvKiBVbmljb2RlIG9iamVjdCAqLwogICAgICk7CiAKIFB5QVBJX0ZVTkMoUHlPYmplY3QqKSBQeVVuaWNvZGVfRW5jb2RlVW5pY29kZUVzY2FwZSgKLSAgICBjb25zdCBQeV9VTklDT0RFICpkYXRhLCAJLyogVW5pY29kZSBjaGFyIGJ1ZmZlciAqLwotICAgIFB5X3NzaXplX3QgbGVuZ3RoCSAJCS8qIE51bWJlciBvZiBQeV9VTklDT0RFIGNoYXJzIHRvIGVuY29kZSAqLworICAgIGNvbnN0IFB5X1VOSUNPREUgKmRhdGEsICAgICAvKiBVbmljb2RlIGNoYXIgYnVmZmVyICovCisgICAgUHlfc3NpemVfdCBsZW5ndGggICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIFB5X1VOSUNPREUgY2hhcnMgdG8gZW5jb2RlICovCiAgICAgKTsKIAogLyogLS0tIFJhdy1Vbmljb2RlLUVzY2FwZSBDb2RlY3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKIFB5QVBJX0ZVTkMoUHlPYmplY3QqKSBQeVVuaWNvZGVfRGVjb2RlUmF3VW5pY29kZUVzY2FwZSgKLSAgICBjb25zdCBjaGFyICpzdHJpbmcsIAkvKiBSYXctVW5pY29kZS1Fc2NhcGUgZW5jb2RlZCBzdHJpbmcgKi8KLSAgICBQeV9zc2l6ZV90IGxlbmd0aCwJIAkvKiBzaXplIG9mIHN0cmluZyAqLwotICAgIGNvbnN0IGNoYXIgKmVycm9ycwkJLyogZXJyb3IgaGFuZGxpbmcgKi8KKyAgICBjb25zdCBjaGFyICpzdHJpbmcsICAgICAgICAgLyogUmF3LVVuaWNvZGUtRXNjYXBlIGVuY29kZWQgc3RyaW5nICovCisgICAgUHlfc3NpemVfdCBsZW5ndGgsICAgICAgICAgIC8qIHNpemUgb2Ygc3RyaW5nICovCisgICAgY29uc3QgY2hhciAqZXJyb3JzICAgICAgICAgIC8qIGVycm9yIGhhbmRsaW5nICovCiAgICAgKTsKIAogUHlBUElfRlVOQyhQeU9iamVjdCopIFB5VW5pY29kZV9Bc1Jhd1VuaWNvZGVFc2NhcGVTdHJpbmcoCi0gICAgUHlPYmplY3QgKnVuaWNvZGUJIAkvKiBVbmljb2RlIG9iamVjdCAqLworICAgIFB5T2JqZWN0ICp1bmljb2RlICAgICAgICAgICAvKiBVbmljb2RlIG9iamVjdCAqLwogICAgICk7CiAKIFB5QVBJX0ZVTkMoUHlPYmplY3QqKSBQeVVuaWNvZGVfRW5jb2RlUmF3VW5pY29kZUVzY2FwZSgKLSAgICBjb25zdCBQeV9VTklDT0RFICpkYXRhLCAJLyogVW5pY29kZSBjaGFyIGJ1ZmZlciAqLwotICAgIFB5X3NzaXplX3QgbGVuZ3RoCSAJCS8qIE51bWJlciBvZiBQeV9VTklDT0RFIGNoYXJzIHRvIGVuY29kZSAqLworICAgIGNvbnN0IFB5X1VOSUNPREUgKmRhdGEsICAgICAvKiBVbmljb2RlIGNoYXIgYnVmZmVyICovCisgICAgUHlfc3NpemVfdCBsZW5ndGggICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIFB5X1VOSUNPREUgY2hhcnMgdG8gZW5jb2RlICovCiAgICAgKTsKIAogLyogLS0tIFVuaWNvZGUgSW50ZXJuYWwgQ29kZWMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC05NjgsNTMgKzk2OCw1MyBAQAogICAgIGNvbnN0IGNoYXIgKmVycm9ycwogICAgICk7CiAKLS8qIC0tLSBMYXRpbi0xIENvZGVjcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKy8qIC0tLSBMYXRpbi0xIENvZGVjcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAgICBOb3RlOiBMYXRpbi0xIGNvcnJlc3BvbmRzIHRvIHRoZSBmaXJzdCAyNTYgVW5pY29kZSBvcmRpbmFscy4KIAogKi8KIAogUHlBUElfRlVOQyhQeU9iamVjdCopIFB5VW5pY29kZV9EZWNvZGVMYXRpbjEoCi0gICAgY29uc3QgY2hhciAqc3RyaW5nLCAJLyogTGF0aW4tMSBlbmNvZGVkIHN0cmluZyAqLwotICAgIFB5X3NzaXplX3QgbGVuZ3RoLAkgCS8qIHNpemUgb2Ygc3RyaW5nICovCi0gICAgY29uc3QgY2hhciAqZXJyb3JzCQkvKiBlcnJvciBoYW5kbGluZyAqLworICAgIGNvbnN0IGNoYXIgKnN0cmluZywgICAgICAgICAvKiBMYXRpbi0xIGVuY29kZWQgc3RyaW5nICovCisgICAgUHlfc3NpemVfdCBsZW5ndGgsICAgICAgICAgIC8qIHNpemUgb2Ygc3RyaW5nICovCisgICAgY29uc3QgY2hhciAqZXJyb3JzICAgICAgICAgIC8qIGVycm9yIGhhbmRsaW5nICovCiAgICAgKTsKIAogUHlBUElfRlVOQyhQeU9iamVjdCopIFB5VW5pY29kZV9Bc0xhdGluMVN0cmluZygKLSAgICBQeU9iamVjdCAqdW5pY29kZQkgCS8qIFVuaWNvZGUgb2JqZWN0ICovCisgICAgUHlPYmplY3QgKnVuaWNvZGUgICAgICAgICAgIC8qIFVuaWNvZGUgb2JqZWN0ICovCiAgICAgKTsKIAogUHlBUElfRlVOQyhQeU9iamVjdCopIFB5VW5pY29kZV9FbmNvZGVMYXRpbjEoCi0gICAgY29uc3QgUHlfVU5JQ09ERSAqZGF0YSwgCS8qIFVuaWNvZGUgY2hhciBidWZmZXIgKi8KLSAgICBQeV9zc2l6ZV90IGxlbmd0aCwJIAkJLyogTnVtYmVyIG9mIFB5X1VOSUNPREUgY2hhcnMgdG8gZW5jb2RlICovCi0gICAgY29uc3QgY2hhciAqZXJyb3JzCQkvKiBlcnJvciBoYW5kbGluZyAqLworICAgIGNvbnN0IFB5X1VOSUNPREUgKmRhdGEsICAgICAvKiBVbmljb2RlIGNoYXIgYnVmZmVyICovCisgICAgUHlfc3NpemVfdCBsZW5ndGgsICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIFB5X1VOSUNPREUgY2hhcnMgdG8gZW5jb2RlICovCisgICAgY29uc3QgY2hhciAqZXJyb3JzICAgICAgICAgIC8qIGVycm9yIGhhbmRsaW5nICovCiAgICAgKTsKIAotLyogLS0tIEFTQ0lJIENvZGVjcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorLyogLS0tIEFTQ0lJIENvZGVjcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKICAgIE9ubHkgNy1iaXQgQVNDSUkgZGF0YSBpcyBleGNlcHRlZC4gQWxsIG90aGVyIGNvZGVzIGdlbmVyYXRlIGVycm9ycy4KIAogKi8KIAogUHlBUElfRlVOQyhQeU9iamVjdCopIFB5VW5pY29kZV9EZWNvZGVBU0NJSSgKLSAgICBjb25zdCBjaGFyICpzdHJpbmcsIAkvKiBBU0NJSSBlbmNvZGVkIHN0cmluZyAqLwotICAgIFB5X3NzaXplX3QgbGVuZ3RoLAkgCS8qIHNpemUgb2Ygc3RyaW5nICovCi0gICAgY29uc3QgY2hhciAqZXJyb3JzCQkvKiBlcnJvciBoYW5kbGluZyAqLworICAgIGNvbnN0IGNoYXIgKnN0cmluZywgICAgICAgICAvKiBBU0NJSSBlbmNvZGVkIHN0cmluZyAqLworICAgIFB5X3NzaXplX3QgbGVuZ3RoLCAgICAgICAgICAvKiBzaXplIG9mIHN0cmluZyAqLworICAgIGNvbnN0IGNoYXIgKmVycm9ycyAgICAgICAgICAvKiBlcnJvciBoYW5kbGluZyAqLwogICAgICk7CiAKIFB5QVBJX0ZVTkMoUHlPYmplY3QqKSBQeVVuaWNvZGVfQXNBU0NJSVN0cmluZygKLSAgICBQeU9iamVjdCAqdW5pY29kZQkgCS8qIFVuaWNvZGUgb2JqZWN0ICovCisgICAgUHlPYmplY3QgKnVuaWNvZGUgICAgICAgICAgIC8qIFVuaWNvZGUgb2JqZWN0ICovCiAgICAgKTsKIAogUHlBUElfRlVOQyhQeU9iamVjdCopIFB5VW5pY29kZV9FbmNvZGVBU0NJSSgKLSAgICBjb25zdCBQeV9VTklDT0RFICpkYXRhLCAJLyogVW5pY29kZSBjaGFyIGJ1ZmZlciAqLwotICAgIFB5X3NzaXplX3QgbGVuZ3RoLAkgCQkvKiBOdW1iZXIgb2YgUHlfVU5JQ09ERSBjaGFycyB0byBlbmNvZGUgKi8KLSAgICBjb25zdCBjaGFyICplcnJvcnMJCS8qIGVycm9yIGhhbmRsaW5nICovCisgICAgY29uc3QgUHlfVU5JQ09ERSAqZGF0YSwgICAgIC8qIFVuaWNvZGUgY2hhciBidWZmZXIgKi8KKyAgICBQeV9zc2l6ZV90IGxlbmd0aCwgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgUHlfVU5JQ09ERSBjaGFycyB0byBlbmNvZGUgKi8KKyAgICBjb25zdCBjaGFyICplcnJvcnMgICAgICAgICAgLyogZXJyb3IgaGFuZGxpbmcgKi8KICAgICApOwogCi0vKiAtLS0gQ2hhcmFjdGVyIE1hcCBDb2RlY3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisvKiAtLS0gQ2hhcmFjdGVyIE1hcCBDb2RlY3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotICAgVGhpcyBjb2RlYyB1c2VzIG1hcHBpbmdzIHRvIGVuY29kZSBhbmQgZGVjb2RlIGNoYXJhY3RlcnMuIAorICAgVGhpcyBjb2RlYyB1c2VzIG1hcHBpbmdzIHRvIGVuY29kZSBhbmQgZGVjb2RlIGNoYXJhY3RlcnMuCiAKICAgIERlY29kaW5nIG1hcHBpbmdzIG11c3QgbWFwIHNpbmdsZSBzdHJpbmcgY2hhcmFjdGVycyB0byBzaW5nbGUKICAgIFVuaWNvZGUgY2hhcmFjdGVycywgaW50ZWdlcnMgKHdoaWNoIGFyZSB0aGVuIGludGVycHJldGVkIGFzIFVuaWNvZGUKQEAgLTEwMzUsMjUgKzEwMzUsMjUgQEAKICovCiAKIFB5QVBJX0ZVTkMoUHlPYmplY3QqKSBQeVVuaWNvZGVfRGVjb2RlQ2hhcm1hcCgKLSAgICBjb25zdCBjaGFyICpzdHJpbmcsIAkvKiBFbmNvZGVkIHN0cmluZyAqLwotICAgIFB5X3NzaXplX3QgbGVuZ3RoLAkgCS8qIHNpemUgb2Ygc3RyaW5nICovCi0gICAgUHlPYmplY3QgKm1hcHBpbmcsCQkvKiBjaGFyYWN0ZXIgbWFwcGluZyAKLQkJCQkgICAoY2hhciBvcmRpbmFsIC0+IHVuaWNvZGUgb3JkaW5hbCkgKi8KLSAgICBjb25zdCBjaGFyICplcnJvcnMJCS8qIGVycm9yIGhhbmRsaW5nICovCisgICAgY29uc3QgY2hhciAqc3RyaW5nLCAgICAgICAgIC8qIEVuY29kZWQgc3RyaW5nICovCisgICAgUHlfc3NpemVfdCBsZW5ndGgsICAgICAgICAgIC8qIHNpemUgb2Ygc3RyaW5nICovCisgICAgUHlPYmplY3QgKm1hcHBpbmcsICAgICAgICAgIC8qIGNoYXJhY3RlciBtYXBwaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyIG9yZGluYWwgLT4gdW5pY29kZSBvcmRpbmFsKSAqLworICAgIGNvbnN0IGNoYXIgKmVycm9ycyAgICAgICAgICAvKiBlcnJvciBoYW5kbGluZyAqLwogICAgICk7CiAKIFB5QVBJX0ZVTkMoUHlPYmplY3QqKSBQeVVuaWNvZGVfQXNDaGFybWFwU3RyaW5nKAotICAgIFB5T2JqZWN0ICp1bmljb2RlLAkgCS8qIFVuaWNvZGUgb2JqZWN0ICovCi0gICAgUHlPYmplY3QgKm1hcHBpbmcJCS8qIGNoYXJhY3RlciBtYXBwaW5nIAotCQkJCSAgICh1bmljb2RlIG9yZGluYWwgLT4gY2hhciBvcmRpbmFsKSAqLworICAgIFB5T2JqZWN0ICp1bmljb2RlLCAgICAgICAgICAvKiBVbmljb2RlIG9iamVjdCAqLworICAgIFB5T2JqZWN0ICptYXBwaW5nICAgICAgICAgICAvKiBjaGFyYWN0ZXIgbWFwcGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5pY29kZSBvcmRpbmFsIC0+IGNoYXIgb3JkaW5hbCkgKi8KICAgICApOwogCiBQeUFQSV9GVU5DKFB5T2JqZWN0KikgUHlVbmljb2RlX0VuY29kZUNoYXJtYXAoCi0gICAgY29uc3QgUHlfVU5JQ09ERSAqZGF0YSwgCS8qIFVuaWNvZGUgY2hhciBidWZmZXIgKi8KLSAgICBQeV9zc2l6ZV90IGxlbmd0aCwJIAkvKiBOdW1iZXIgb2YgUHlfVU5JQ09ERSBjaGFycyB0byBlbmNvZGUgKi8KLSAgICBQeU9iamVjdCAqbWFwcGluZywJCS8qIGNoYXJhY3RlciBtYXBwaW5nIAotCQkJCSAgICh1bmljb2RlIG9yZGluYWwgLT4gY2hhciBvcmRpbmFsKSAqLwotICAgIGNvbnN0IGNoYXIgKmVycm9ycwkJLyogZXJyb3IgaGFuZGxpbmcgKi8KKyAgICBjb25zdCBQeV9VTklDT0RFICpkYXRhLCAgICAgLyogVW5pY29kZSBjaGFyIGJ1ZmZlciAqLworICAgIFB5X3NzaXplX3QgbGVuZ3RoLCAgICAgICAgICAvKiBOdW1iZXIgb2YgUHlfVU5JQ09ERSBjaGFycyB0byBlbmNvZGUgKi8KKyAgICBQeU9iamVjdCAqbWFwcGluZywgICAgICAgICAgLyogY2hhcmFjdGVyIG1hcHBpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuaWNvZGUgb3JkaW5hbCAtPiBjaGFyIG9yZGluYWwpICovCisgICAgY29uc3QgY2hhciAqZXJyb3JzICAgICAgICAgIC8qIGVycm9yIGhhbmRsaW5nICovCiAgICAgKTsKIAogLyogVHJhbnNsYXRlIGEgUHlfVU5JQ09ERSBidWZmZXIgb2YgdGhlIGdpdmVuIGxlbmd0aCBieSBhcHBseWluZyBhCkBAIC0xMDYxLDcgKzEwNjEsNyBAQAogICAgb2JqZWN0LgogCiAgICBUaGUgbWFwcGluZyB0YWJsZSBtdXN0IG1hcCBVbmljb2RlIG9yZGluYWwgaW50ZWdlcnMgdG8gVW5pY29kZQotICAgb3JkaW5hbCBpbnRlZ2VycyBvciBOb25lIChjYXVzaW5nIGRlbGV0aW9uIG9mIHRoZSBjaGFyYWN0ZXIpLiAKKyAgIG9yZGluYWwgaW50ZWdlcnMgb3IgTm9uZSAoY2F1c2luZyBkZWxldGlvbiBvZiB0aGUgY2hhcmFjdGVyKS4KIAogICAgTWFwcGluZyB0YWJsZXMgbWF5IGJlIGRpY3Rpb25hcmllcyBvciBzZXF1ZW5jZXMuIFVubWFwcGVkIGNoYXJhY3RlcgogICAgb3JkaW5hbHMgKG9uZXMgd2hpY2ggY2F1c2UgYSBMb29rdXBFcnJvcikgYXJlIGxlZnQgdW50b3VjaGVkIGFuZApAQCAtMTA3MCwxMCArMTA3MCwxMCBAQAogKi8KIAogUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeVVuaWNvZGVfVHJhbnNsYXRlQ2hhcm1hcCgKLSAgICBjb25zdCBQeV9VTklDT0RFICpkYXRhLCAJLyogVW5pY29kZSBjaGFyIGJ1ZmZlciAqLwotICAgIFB5X3NzaXplX3QgbGVuZ3RoLAkgCQkvKiBOdW1iZXIgb2YgUHlfVU5JQ09ERSBjaGFycyB0byBlbmNvZGUgKi8KLSAgICBQeU9iamVjdCAqdGFibGUsCQkvKiBUcmFuc2xhdGUgdGFibGUgKi8KLSAgICBjb25zdCBjaGFyICplcnJvcnMJCS8qIGVycm9yIGhhbmRsaW5nICovCisgICAgY29uc3QgUHlfVU5JQ09ERSAqZGF0YSwgICAgIC8qIFVuaWNvZGUgY2hhciBidWZmZXIgKi8KKyAgICBQeV9zc2l6ZV90IGxlbmd0aCwgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgUHlfVU5JQ09ERSBjaGFycyB0byBlbmNvZGUgKi8KKyAgICBQeU9iamVjdCAqdGFibGUsICAgICAgICAgICAgLyogVHJhbnNsYXRlIHRhYmxlICovCisgICAgY29uc3QgY2hhciAqZXJyb3JzICAgICAgICAgIC8qIGVycm9yIGhhbmRsaW5nICovCiAgICAgKTsKIAogI2lmZGVmIE1TX1dJTjMyCkBAIC0xMTIyLDcgKzExMjIsNyBAQAogCiAgICAgICBOVUxMIG9yICJzdHJpY3QiOiByYWlzZSBhIFZhbHVlRXJyb3IKICAgICAgICJpZ25vcmUiOiBpZ25vcmUgdGhlIHdyb25nIGNoYXJhY3RlcnMgKHRoZXNlIGFyZSBub3QgY29waWVkIHRvIHRoZQotCQlvdXRwdXQgYnVmZmVyKQorICAgICAgICAgICAgICAgIG91dHB1dCBidWZmZXIpCiAgICAgICAicmVwbGFjZSI6IHJlcGxhY2VzIGlsbGVnYWwgY2hhcmFjdGVycyB3aXRoICc/JwogCiAgICBSZXR1cm5zIDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZS4KQEAgLTExMzAsMTAgKzExMzAsMTAgQEAKICovCiAKIFB5QVBJX0ZVTkMoaW50KSBQeVVuaWNvZGVfRW5jb2RlRGVjaW1hbCgKLSAgICBQeV9VTklDT0RFICpzLAkJLyogVW5pY29kZSBidWZmZXIgKi8KLSAgICBQeV9zc2l6ZV90IGxlbmd0aCwJCQkvKiBOdW1iZXIgb2YgUHlfVU5JQ09ERSBjaGFycyB0byBlbmNvZGUgKi8KLSAgICBjaGFyICpvdXRwdXQsCQkvKiBPdXRwdXQgYnVmZmVyOyBtdXN0IGhhdmUgc2l6ZSA+PSBsZW5ndGggKi8KLSAgICBjb25zdCBjaGFyICplcnJvcnMJCS8qIGVycm9yIGhhbmRsaW5nICovCisgICAgUHlfVU5JQ09ERSAqcywgICAgICAgICAgICAgIC8qIFVuaWNvZGUgYnVmZmVyICovCisgICAgUHlfc3NpemVfdCBsZW5ndGgsICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIFB5X1VOSUNPREUgY2hhcnMgdG8gZW5jb2RlICovCisgICAgY2hhciAqb3V0cHV0LCAgICAgICAgICAgICAgIC8qIE91dHB1dCBidWZmZXI7IG11c3QgaGF2ZSBzaXplID49IGxlbmd0aCAqLworICAgIGNvbnN0IGNoYXIgKmVycm9ycyAgICAgICAgICAvKiBlcnJvciBoYW5kbGluZyAqLwogICAgICk7CiAKIC8qIC0tLSBNZXRob2RzICYgU2xvdHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTE0NSw4ICsxMTQ1LDggQEAKIC8qIENvbmNhdCB0d28gc3RyaW5ncyBnaXZpbmcgYSBuZXcgVW5pY29kZSBzdHJpbmcuICovCiAKIFB5QVBJX0ZVTkMoUHlPYmplY3QqKSBQeVVuaWNvZGVfQ29uY2F0KAotICAgIFB5T2JqZWN0ICpsZWZ0LAkgCS8qIExlZnQgc3RyaW5nICovCi0gICAgUHlPYmplY3QgKnJpZ2h0CSAJLyogUmlnaHQgc3RyaW5nICovCisgICAgUHlPYmplY3QgKmxlZnQsICAgICAgICAgICAgIC8qIExlZnQgc3RyaW5nICovCisgICAgUHlPYmplY3QgKnJpZ2h0ICAgICAgICAgICAgIC8qIFJpZ2h0IHN0cmluZyAqLwogICAgICk7CiAKIC8qIFNwbGl0IGEgc3RyaW5nIGdpdmluZyBhIGxpc3Qgb2YgVW5pY29kZSBzdHJpbmdzLgpAQCAtMTE2MSwzNSArMTE2MSwzNSBAQAogKi8KIAogUHlBUElfRlVOQyhQeU9iamVjdCopIFB5VW5pY29kZV9TcGxpdCgKLSAgICBQeU9iamVjdCAqcywJCS8qIFN0cmluZyB0byBzcGxpdCAqLwotICAgIFB5T2JqZWN0ICpzZXAsCQkvKiBTdHJpbmcgc2VwYXJhdG9yICovCi0gICAgUHlfc3NpemVfdCBtYXhzcGxpdAkJLyogTWF4c3BsaXQgY291bnQgKi8KLSAgICApOwkJCisgICAgUHlPYmplY3QgKnMsICAgICAgICAgICAgICAgIC8qIFN0cmluZyB0byBzcGxpdCAqLworICAgIFB5T2JqZWN0ICpzZXAsICAgICAgICAgICAgICAvKiBTdHJpbmcgc2VwYXJhdG9yICovCisgICAgUHlfc3NpemVfdCBtYXhzcGxpdCAgICAgICAgIC8qIE1heHNwbGl0IGNvdW50ICovCisgICAgKTsKIAogLyogRGl0bywgYnV0IHNwbGl0IGF0IGxpbmUgYnJlYWtzLgogCiAgICBDUkxGIGlzIGNvbnNpZGVyZWQgdG8gYmUgb25lIGxpbmUgYnJlYWsuIExpbmUgYnJlYWtzIGFyZSBub3QKICAgIGluY2x1ZGVkIGluIHRoZSByZXN1bHRpbmcgbGlzdC4gKi8KLSAgICAKKwogUHlBUElfRlVOQyhQeU9iamVjdCopIFB5VW5pY29kZV9TcGxpdGxpbmVzKAotICAgIFB5T2JqZWN0ICpzLAkJLyogU3RyaW5nIHRvIHNwbGl0ICovCi0gICAgaW50IGtlZXBlbmRzCQkvKiBJZiB0cnVlLCBsaW5lIGVuZCBtYXJrZXJzIGFyZSBpbmNsdWRlZCAqLwotICAgICk7CQkKKyAgICBQeU9iamVjdCAqcywgICAgICAgICAgICAgICAgLyogU3RyaW5nIHRvIHNwbGl0ICovCisgICAgaW50IGtlZXBlbmRzICAgICAgICAgICAgICAgIC8qIElmIHRydWUsIGxpbmUgZW5kIG1hcmtlcnMgYXJlIGluY2x1ZGVkICovCisgICAgKTsKIAogLyogUGFydGl0aW9uIGEgc3RyaW5nIHVzaW5nIGEgZ2l2ZW4gc2VwYXJhdG9yLiAqLwogCiBQeUFQSV9GVU5DKFB5T2JqZWN0KikgUHlVbmljb2RlX1BhcnRpdGlvbigKLSAgICBQeU9iamVjdCAqcywJCS8qIFN0cmluZyB0byBwYXJ0aXRpb24gKi8KLSAgICBQeU9iamVjdCAqc2VwCQkvKiBTdHJpbmcgc2VwYXJhdG9yICovCi0gICAgKTsJCQorICAgIFB5T2JqZWN0ICpzLCAgICAgICAgICAgICAgICAvKiBTdHJpbmcgdG8gcGFydGl0aW9uICovCisgICAgUHlPYmplY3QgKnNlcCAgICAgICAgICAgICAgIC8qIFN0cmluZyBzZXBhcmF0b3IgKi8KKyAgICApOwogCiAvKiBQYXJ0aXRpb24gYSBzdHJpbmcgdXNpbmcgYSBnaXZlbiBzZXBhcmF0b3IsIHNlYXJjaGluZyBmcm9tIHRoZSBlbmQgb2YgdGhlCiAgICBzdHJpbmcuICovCiAKIFB5QVBJX0ZVTkMoUHlPYmplY3QqKSBQeVVuaWNvZGVfUlBhcnRpdGlvbigKLSAgICBQeU9iamVjdCAqcywJCS8qIFN0cmluZyB0byBwYXJ0aXRpb24gKi8KLSAgICBQeU9iamVjdCAqc2VwCQkvKiBTdHJpbmcgc2VwYXJhdG9yICovCi0gICAgKTsJCQorICAgIFB5T2JqZWN0ICpzLCAgICAgICAgICAgICAgICAvKiBTdHJpbmcgdG8gcGFydGl0aW9uICovCisgICAgUHlPYmplY3QgKnNlcCAgICAgICAgICAgICAgIC8qIFN0cmluZyBzZXBhcmF0b3IgKi8KKyAgICApOwogCiAvKiBTcGxpdCBhIHN0cmluZyBnaXZpbmcgYSBsaXN0IG9mIFVuaWNvZGUgc3RyaW5ncy4KIApAQCAtMTIwNSwxNiArMTIwNSwxNiBAQAogKi8KIAogUHlBUElfRlVOQyhQeU9iamVjdCopIFB5VW5pY29kZV9SU3BsaXQoCi0gICAgUHlPYmplY3QgKnMsCQkvKiBTdHJpbmcgdG8gc3BsaXQgKi8KLSAgICBQeU9iamVjdCAqc2VwLAkJLyogU3RyaW5nIHNlcGFyYXRvciAqLwotICAgIFB5X3NzaXplX3QgbWF4c3BsaXQJCS8qIE1heHNwbGl0IGNvdW50ICovCi0gICAgKTsJCQorICAgIFB5T2JqZWN0ICpzLCAgICAgICAgICAgICAgICAvKiBTdHJpbmcgdG8gc3BsaXQgKi8KKyAgICBQeU9iamVjdCAqc2VwLCAgICAgICAgICAgICAgLyogU3RyaW5nIHNlcGFyYXRvciAqLworICAgIFB5X3NzaXplX3QgbWF4c3BsaXQgICAgICAgICAvKiBNYXhzcGxpdCBjb3VudCAqLworICAgICk7CiAKIC8qIFRyYW5zbGF0ZSBhIHN0cmluZyBieSBhcHBseWluZyBhIGNoYXJhY3RlciBtYXBwaW5nIHRhYmxlIHRvIGl0IGFuZAogICAgcmV0dXJuIHRoZSByZXN1bHRpbmcgVW5pY29kZSBvYmplY3QuCiAKICAgIFRoZSBtYXBwaW5nIHRhYmxlIG11c3QgbWFwIFVuaWNvZGUgb3JkaW5hbCBpbnRlZ2VycyB0byBVbmljb2RlCi0gICBvcmRpbmFsIGludGVnZXJzIG9yIE5vbmUgKGNhdXNpbmcgZGVsZXRpb24gb2YgdGhlIGNoYXJhY3RlcikuIAorICAgb3JkaW5hbCBpbnRlZ2VycyBvciBOb25lIChjYXVzaW5nIGRlbGV0aW9uIG9mIHRoZSBjaGFyYWN0ZXIpLgogCiAgICBNYXBwaW5nIHRhYmxlcyBtYXkgYmUgZGljdGlvbmFyaWVzIG9yIHNlcXVlbmNlcy4gVW5tYXBwZWQgY2hhcmFjdGVyCiAgICBvcmRpbmFscyAob25lcyB3aGljaCBjYXVzZSBhIExvb2t1cEVycm9yKSBhcmUgbGVmdCB1bnRvdWNoZWQgYW5kCkBAIC0xMjIzLDI4ICsxMjIzLDI4IEBACiAqLwogCiBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5VW5pY29kZV9UcmFuc2xhdGUoCi0gICAgUHlPYmplY3QgKnN0ciwJCS8qIFN0cmluZyAqLyAKLSAgICBQeU9iamVjdCAqdGFibGUsCQkvKiBUcmFuc2xhdGUgdGFibGUgKi8KLSAgICBjb25zdCBjaGFyICplcnJvcnMJCS8qIGVycm9yIGhhbmRsaW5nICovCisgICAgUHlPYmplY3QgKnN0ciwgICAgICAgICAgICAgIC8qIFN0cmluZyAqLworICAgIFB5T2JqZWN0ICp0YWJsZSwgICAgICAgICAgICAvKiBUcmFuc2xhdGUgdGFibGUgKi8KKyAgICBjb25zdCBjaGFyICplcnJvcnMgICAgICAgICAgLyogZXJyb3IgaGFuZGxpbmcgKi8KICAgICApOwogCiAvKiBKb2luIGEgc2VxdWVuY2Ugb2Ygc3RyaW5ncyB1c2luZyB0aGUgZ2l2ZW4gc2VwYXJhdG9yIGFuZCByZXR1cm4KICAgIHRoZSByZXN1bHRpbmcgVW5pY29kZSBzdHJpbmcuICovCi0gICAgCisKIFB5QVBJX0ZVTkMoUHlPYmplY3QqKSBQeVVuaWNvZGVfSm9pbigKLSAgICBQeU9iamVjdCAqc2VwYXJhdG9yLCAJLyogU2VwYXJhdG9yIHN0cmluZyAqLwotICAgIFB5T2JqZWN0ICpzZXEJIAkvKiBTZXF1ZW5jZSBvYmplY3QgKi8KKyAgICBQeU9iamVjdCAqc2VwYXJhdG9yLCAgICAgICAgLyogU2VwYXJhdG9yIHN0cmluZyAqLworICAgIFB5T2JqZWN0ICpzZXEgICAgICAgICAgICAgICAvKiBTZXF1ZW5jZSBvYmplY3QgKi8KICAgICApOwogCiAvKiBSZXR1cm4gMSBpZiBzdWJzdHIgbWF0Y2hlcyBzdHJbc3RhcnQ6ZW5kXSBhdCB0aGUgZ2l2ZW4gdGFpbCBlbmQsIDAKICAgIG90aGVyd2lzZS4gKi8KIAogUHlBUElfRlVOQyhQeV9zc2l6ZV90KSBQeVVuaWNvZGVfVGFpbG1hdGNoKAotICAgIFB5T2JqZWN0ICpzdHIsCQkvKiBTdHJpbmcgKi8gCi0gICAgUHlPYmplY3QgKnN1YnN0ciwJCS8qIFByZWZpeCBvciBTdWZmaXggc3RyaW5nICovCi0gICAgUHlfc3NpemVfdCBzdGFydCwJCS8qIFN0YXJ0IGluZGV4ICovCi0gICAgUHlfc3NpemVfdCBlbmQsCQkvKiBTdG9wIGluZGV4ICovCi0gICAgaW50IGRpcmVjdGlvbgkJLyogVGFpbCBlbmQ6IC0xIHByZWZpeCwgKzEgc3VmZml4ICovCisgICAgUHlPYmplY3QgKnN0ciwgICAgICAgICAgICAgIC8qIFN0cmluZyAqLworICAgIFB5T2JqZWN0ICpzdWJzdHIsICAgICAgICAgICAvKiBQcmVmaXggb3IgU3VmZml4IHN0cmluZyAqLworICAgIFB5X3NzaXplX3Qgc3RhcnQsICAgICAgICAgICAvKiBTdGFydCBpbmRleCAqLworICAgIFB5X3NzaXplX3QgZW5kLCAgICAgICAgICAgICAvKiBTdG9wIGluZGV4ICovCisgICAgaW50IGRpcmVjdGlvbiAgICAgICAgICAgICAgIC8qIFRhaWwgZW5kOiAtMSBwcmVmaXgsICsxIHN1ZmZpeCAqLwogICAgICk7CiAKIC8qIFJldHVybiB0aGUgZmlyc3QgcG9zaXRpb24gb2Ygc3Vic3RyIGluIHN0cltzdGFydDplbmRdIHVzaW5nIHRoZQpAQCAtMTI1MiwzOSArMTI1MiwzOSBAQAogICAgYW4gZXJyb3Igb2NjdXJyZWQgYW5kIGFuIGV4Y2VwdGlvbiBpcyBzZXQuICovCiAKIFB5QVBJX0ZVTkMoUHlfc3NpemVfdCkgUHlVbmljb2RlX0ZpbmQoCi0gICAgUHlPYmplY3QgKnN0ciwJCS8qIFN0cmluZyAqLyAKLSAgICBQeU9iamVjdCAqc3Vic3RyLAkJLyogU3Vic3RyaW5nIHRvIGZpbmQgKi8KLSAgICBQeV9zc2l6ZV90IHN0YXJ0LAkJLyogU3RhcnQgaW5kZXggKi8KLSAgICBQeV9zc2l6ZV90IGVuZCwJCS8qIFN0b3AgaW5kZXggKi8KLSAgICBpbnQgZGlyZWN0aW9uCQkvKiBGaW5kIGRpcmVjdGlvbjogKzEgZm9yd2FyZCwgLTEgYmFja3dhcmQgKi8KKyAgICBQeU9iamVjdCAqc3RyLCAgICAgICAgICAgICAgLyogU3RyaW5nICovCisgICAgUHlPYmplY3QgKnN1YnN0ciwgICAgICAgICAgIC8qIFN1YnN0cmluZyB0byBmaW5kICovCisgICAgUHlfc3NpemVfdCBzdGFydCwgICAgICAgICAgIC8qIFN0YXJ0IGluZGV4ICovCisgICAgUHlfc3NpemVfdCBlbmQsICAgICAgICAgICAgIC8qIFN0b3AgaW5kZXggKi8KKyAgICBpbnQgZGlyZWN0aW9uICAgICAgICAgICAgICAgLyogRmluZCBkaXJlY3Rpb246ICsxIGZvcndhcmQsIC0xIGJhY2t3YXJkICovCiAgICAgKTsKIAogLyogQ291bnQgdGhlIG51bWJlciBvZiBvY2N1cnJlbmNlcyBvZiBzdWJzdHIgaW4gc3RyW3N0YXJ0OmVuZF0uICovCiAKIFB5QVBJX0ZVTkMoUHlfc3NpemVfdCkgUHlVbmljb2RlX0NvdW50KAotICAgIFB5T2JqZWN0ICpzdHIsCQkvKiBTdHJpbmcgKi8gCi0gICAgUHlPYmplY3QgKnN1YnN0ciwJCS8qIFN1YnN0cmluZyB0byBjb3VudCAqLwotICAgIFB5X3NzaXplX3Qgc3RhcnQsCQkvKiBTdGFydCBpbmRleCAqLwotICAgIFB5X3NzaXplX3QgZW5kCQkvKiBTdG9wIGluZGV4ICovCisgICAgUHlPYmplY3QgKnN0ciwgICAgICAgICAgICAgIC8qIFN0cmluZyAqLworICAgIFB5T2JqZWN0ICpzdWJzdHIsICAgICAgICAgICAvKiBTdWJzdHJpbmcgdG8gY291bnQgKi8KKyAgICBQeV9zc2l6ZV90IHN0YXJ0LCAgICAgICAgICAgLyogU3RhcnQgaW5kZXggKi8KKyAgICBQeV9zc2l6ZV90IGVuZCAgICAgICAgICAgICAgLyogU3RvcCBpbmRleCAqLwogICAgICk7CiAKIC8qIFJlcGxhY2UgYXQgbW9zdCBtYXhjb3VudCBvY2N1cnJlbmNlcyBvZiBzdWJzdHIgaW4gc3RyIHdpdGggcmVwbHN0cgogICAgYW5kIHJldHVybiB0aGUgcmVzdWx0aW5nIFVuaWNvZGUgb2JqZWN0LiAqLwogCiBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5VW5pY29kZV9SZXBsYWNlKAotICAgIFB5T2JqZWN0ICpzdHIsCQkvKiBTdHJpbmcgKi8gCi0gICAgUHlPYmplY3QgKnN1YnN0ciwJCS8qIFN1YnN0cmluZyB0byBmaW5kICovCi0gICAgUHlPYmplY3QgKnJlcGxzdHIsCQkvKiBTdWJzdHJpbmcgdG8gcmVwbGFjZSAqLwotICAgIFB5X3NzaXplX3QgbWF4Y291bnQJCS8qIE1heC4gbnVtYmVyIG9mIHJlcGxhY2VtZW50cyB0byBhcHBseTsKLQkJCQkgICAtMSA9IGFsbCAqLworICAgIFB5T2JqZWN0ICpzdHIsICAgICAgICAgICAgICAvKiBTdHJpbmcgKi8KKyAgICBQeU9iamVjdCAqc3Vic3RyLCAgICAgICAgICAgLyogU3Vic3RyaW5nIHRvIGZpbmQgKi8KKyAgICBQeU9iamVjdCAqcmVwbHN0ciwgICAgICAgICAgLyogU3Vic3RyaW5nIHRvIHJlcGxhY2UgKi8KKyAgICBQeV9zc2l6ZV90IG1heGNvdW50ICAgICAgICAgLyogTWF4LiBudW1iZXIgb2YgcmVwbGFjZW1lbnRzIHRvIGFwcGx5OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSA9IGFsbCAqLwogICAgICk7CiAKIC8qIENvbXBhcmUgdHdvIHN0cmluZ3MgYW5kIHJldHVybiAtMSwgMCwgMSBmb3IgbGVzcyB0aGFuLCBlcXVhbCwKICAgIGdyZWF0ZXIgdGhhbiByZXNwLiAqLwogCiBQeUFQSV9GVU5DKGludCkgUHlVbmljb2RlX0NvbXBhcmUoCi0gICAgUHlPYmplY3QgKmxlZnQsCQkvKiBMZWZ0IHN0cmluZyAqLyAKLSAgICBQeU9iamVjdCAqcmlnaHQJCS8qIFJpZ2h0IHN0cmluZyAqLworICAgIFB5T2JqZWN0ICpsZWZ0LCAgICAgICAgICAgICAvKiBMZWZ0IHN0cmluZyAqLworICAgIFB5T2JqZWN0ICpyaWdodCAgICAgICAgICAgICAvKiBSaWdodCBzdHJpbmcgKi8KICAgICApOwogCiAvKiBSaWNoIGNvbXBhcmUgdHdvIHN0cmluZ3MgYW5kIHJldHVybiBvbmUgb2YgdGhlIGZvbGxvd2luZzoKQEAgLTEzMDQsMTcgKzEzMDQsMTcgQEAKICovCiAKIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlVbmljb2RlX1JpY2hDb21wYXJlKAotICAgIFB5T2JqZWN0ICpsZWZ0LAkJLyogTGVmdCBzdHJpbmcgKi8gCi0gICAgUHlPYmplY3QgKnJpZ2h0LAkJLyogUmlnaHQgc3RyaW5nICovCi0gICAgaW50IG9wCQkJLyogT3BlcmF0aW9uOiBQeV9FUSwgUHlfTkUsIFB5X0dULCBldGMuICovCisgICAgUHlPYmplY3QgKmxlZnQsICAgICAgICAgICAgIC8qIExlZnQgc3RyaW5nICovCisgICAgUHlPYmplY3QgKnJpZ2h0LCAgICAgICAgICAgIC8qIFJpZ2h0IHN0cmluZyAqLworICAgIGludCBvcCAgICAgICAgICAgICAgICAgICAgICAvKiBPcGVyYXRpb246IFB5X0VRLCBQeV9ORSwgUHlfR1QsIGV0Yy4gKi8KICAgICApOwogCiAvKiBBcHBseSBhIGFyZ3VtZW50IHR1cGxlIG9yIGRpY3Rpb25hcnkgdG8gYSBmb3JtYXQgc3RyaW5nIGFuZCByZXR1cm4KICAgIHRoZSByZXN1bHRpbmcgVW5pY29kZSBzdHJpbmcuICovCiAKIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlVbmljb2RlX0Zvcm1hdCgKLSAgICBQeU9iamVjdCAqZm9ybWF0LAkJLyogRm9ybWF0IHN0cmluZyAqLyAKLSAgICBQeU9iamVjdCAqYXJncwkJLyogQXJndW1lbnQgdHVwbGUgb3IgZGljdGlvbmFyeSAqLworICAgIFB5T2JqZWN0ICpmb3JtYXQsICAgICAgICAgICAvKiBGb3JtYXQgc3RyaW5nICovCisgICAgUHlPYmplY3QgKmFyZ3MgICAgICAgICAgICAgIC8qIEFyZ3VtZW50IHR1cGxlIG9yIGRpY3Rpb25hcnkgKi8KICAgICApOwogCiAvKiBDaGVja3Mgd2hldGhlciBlbGVtZW50IGlzIGNvbnRhaW5lZCBpbiBjb250YWluZXIgYW5kIHJldHVybiAxLzAKQEAgLTEzMjQsOCArMTMyNCw4IEBACiAgICByZXR1cm5lZCBpbiBjYXNlIG9mIGFuIGVycm9yLiAqLwogCiBQeUFQSV9GVU5DKGludCkgUHlVbmljb2RlX0NvbnRhaW5zKAotICAgIFB5T2JqZWN0ICpjb250YWluZXIsCS8qIENvbnRhaW5lciBzdHJpbmcgKi8gCi0gICAgUHlPYmplY3QgKmVsZW1lbnQJCS8qIEVsZW1lbnQgc3RyaW5nICovCisgICAgUHlPYmplY3QgKmNvbnRhaW5lciwgICAgICAgIC8qIENvbnRhaW5lciBzdHJpbmcgKi8KKyAgICBQeU9iamVjdCAqZWxlbWVudCAgICAgICAgICAgLyogRWxlbWVudCBzdHJpbmcgKi8KICAgICApOwogCiAvKiBFeHRlcm5hbGx5IHZpc2libGUgZm9yIHN0ci5zdHJpcCh1bmljb2RlKSAqLwpAQCAtMTM0Miw3MCArMTM0Miw3MCBAQAogUHlBUElfREFUQShjb25zdCB1bnNpZ25lZCBjaGFyKSBfUHlfYXNjaWlfd2hpdGVzcGFjZVtdOwogCiAvKiBUaGVzZSBzaG91bGQgbm90IGJlIHVzZWQgZGlyZWN0bHkuIFVzZSB0aGUgUHlfVU5JQ09ERV9JUyogYW5kCi0gICBQeV9VTklDT0RFX1RPKiBtYWNyb3MgaW5zdGVhZC4gCisgICBQeV9VTklDT0RFX1RPKiBtYWNyb3MgaW5zdGVhZC4KIAogICAgVGhlc2UgQVBJcyBhcmUgaW1wbGVtZW50ZWQgaW4gT2JqZWN0cy91bmljb2RlY3R5cGUuYy4KIAogKi8KIAogUHlBUElfRlVOQyhpbnQpIF9QeVVuaWNvZGVfSXNMb3dlcmNhc2UoCi0gICAgUHlfVU5JQ09ERSBjaCAJLyogVW5pY29kZSBjaGFyYWN0ZXIgKi8KKyAgICBQeV9VTklDT0RFIGNoICAgICAgIC8qIFVuaWNvZGUgY2hhcmFjdGVyICovCiAgICAgKTsKIAogUHlBUElfRlVOQyhpbnQpIF9QeVVuaWNvZGVfSXNVcHBlcmNhc2UoCi0gICAgUHlfVU5JQ09ERSBjaCAJLyogVW5pY29kZSBjaGFyYWN0ZXIgKi8KKyAgICBQeV9VTklDT0RFIGNoICAgICAgIC8qIFVuaWNvZGUgY2hhcmFjdGVyICovCiAgICAgKTsKIAogUHlBUElfRlVOQyhpbnQpIF9QeVVuaWNvZGVfSXNUaXRsZWNhc2UoCi0gICAgUHlfVU5JQ09ERSBjaCAJLyogVW5pY29kZSBjaGFyYWN0ZXIgKi8KKyAgICBQeV9VTklDT0RFIGNoICAgICAgIC8qIFVuaWNvZGUgY2hhcmFjdGVyICovCiAgICAgKTsKIAogUHlBUElfRlVOQyhpbnQpIF9QeVVuaWNvZGVfSXNXaGl0ZXNwYWNlKAotICAgIGNvbnN0IFB5X1VOSUNPREUgY2ggCS8qIFVuaWNvZGUgY2hhcmFjdGVyICovCisgICAgY29uc3QgUHlfVU5JQ09ERSBjaCAgICAgICAgIC8qIFVuaWNvZGUgY2hhcmFjdGVyICovCiAgICAgKTsKIAogUHlBUElfRlVOQyhpbnQpIF9QeVVuaWNvZGVfSXNMaW5lYnJlYWsoCi0gICAgY29uc3QgUHlfVU5JQ09ERSBjaCAJLyogVW5pY29kZSBjaGFyYWN0ZXIgKi8KKyAgICBjb25zdCBQeV9VTklDT0RFIGNoICAgICAgICAgLyogVW5pY29kZSBjaGFyYWN0ZXIgKi8KICAgICApOwogCiBQeUFQSV9GVU5DKFB5X1VOSUNPREUpIF9QeVVuaWNvZGVfVG9Mb3dlcmNhc2UoCi0gICAgUHlfVU5JQ09ERSBjaCAJLyogVW5pY29kZSBjaGFyYWN0ZXIgKi8KKyAgICBQeV9VTklDT0RFIGNoICAgICAgIC8qIFVuaWNvZGUgY2hhcmFjdGVyICovCiAgICAgKTsKIAogUHlBUElfRlVOQyhQeV9VTklDT0RFKSBfUHlVbmljb2RlX1RvVXBwZXJjYXNlKAotICAgIFB5X1VOSUNPREUgY2ggCS8qIFVuaWNvZGUgY2hhcmFjdGVyICovCisgICAgUHlfVU5JQ09ERSBjaCAgICAgICAvKiBVbmljb2RlIGNoYXJhY3RlciAqLwogICAgICk7CiAKIFB5QVBJX0ZVTkMoUHlfVU5JQ09ERSkgX1B5VW5pY29kZV9Ub1RpdGxlY2FzZSgKLSAgICBQeV9VTklDT0RFIGNoIAkvKiBVbmljb2RlIGNoYXJhY3RlciAqLworICAgIFB5X1VOSUNPREUgY2ggICAgICAgLyogVW5pY29kZSBjaGFyYWN0ZXIgKi8KICAgICApOwogCiBQeUFQSV9GVU5DKGludCkgX1B5VW5pY29kZV9Ub0RlY2ltYWxEaWdpdCgKLSAgICBQeV9VTklDT0RFIGNoIAkvKiBVbmljb2RlIGNoYXJhY3RlciAqLworICAgIFB5X1VOSUNPREUgY2ggICAgICAgLyogVW5pY29kZSBjaGFyYWN0ZXIgKi8KICAgICApOwogCiBQeUFQSV9GVU5DKGludCkgX1B5VW5pY29kZV9Ub0RpZ2l0KAotICAgIFB5X1VOSUNPREUgY2ggCS8qIFVuaWNvZGUgY2hhcmFjdGVyICovCisgICAgUHlfVU5JQ09ERSBjaCAgICAgICAvKiBVbmljb2RlIGNoYXJhY3RlciAqLwogICAgICk7CiAKIFB5QVBJX0ZVTkMoZG91YmxlKSBfUHlVbmljb2RlX1RvTnVtZXJpYygKLSAgICBQeV9VTklDT0RFIGNoIAkvKiBVbmljb2RlIGNoYXJhY3RlciAqLworICAgIFB5X1VOSUNPREUgY2ggICAgICAgLyogVW5pY29kZSBjaGFyYWN0ZXIgKi8KICAgICApOwogCiBQeUFQSV9GVU5DKGludCkgX1B5VW5pY29kZV9Jc0RlY2ltYWxEaWdpdCgKLSAgICBQeV9VTklDT0RFIGNoIAkvKiBVbmljb2RlIGNoYXJhY3RlciAqLworICAgIFB5X1VOSUNPREUgY2ggICAgICAgLyogVW5pY29kZSBjaGFyYWN0ZXIgKi8KICAgICApOwogCiBQeUFQSV9GVU5DKGludCkgX1B5VW5pY29kZV9Jc0RpZ2l0KAotICAgIFB5X1VOSUNPREUgY2ggCS8qIFVuaWNvZGUgY2hhcmFjdGVyICovCisgICAgUHlfVU5JQ09ERSBjaCAgICAgICAvKiBVbmljb2RlIGNoYXJhY3RlciAqLwogICAgICk7CiAKIFB5QVBJX0ZVTkMoaW50KSBfUHlVbmljb2RlX0lzTnVtZXJpYygKLSAgICBQeV9VTklDT0RFIGNoIAkvKiBVbmljb2RlIGNoYXJhY3RlciAqLworICAgIFB5X1VOSUNPREUgY2ggICAgICAgLyogVW5pY29kZSBjaGFyYWN0ZXIgKi8KICAgICApOwogCiBQeUFQSV9GVU5DKGludCkgX1B5VW5pY29kZV9Jc0FscGhhKAotICAgIFB5X1VOSUNPREUgY2ggCS8qIFVuaWNvZGUgY2hhcmFjdGVyICovCisgICAgUHlfVU5JQ09ERSBjaCAgICAgICAvKiBVbmljb2RlIGNoYXJhY3RlciAqLwogICAgICk7CiAKICNpZmRlZiBfX2NwbHVzcGx1cwpkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvQ29sb3JQaWNrZXJtb2R1bGUuYyBiL01hYy9Nb2R1bGVzL0NvbG9yUGlja2VybW9kdWxlLmMKaW5kZXggNDQwNjQyNi4uODI0ZDRkMyAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvQ29sb3JQaWNrZXJtb2R1bGUuYworKysgYi9NYWMvTW9kdWxlcy9Db2xvclBpY2tlcm1vZHVsZS5jCkBAIC03LDE1ICs3LDE1IEBACiBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsCiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0CiBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KLXN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgSnVzdCB2YW4gUm9zc3VtIG5vdCBiZSAKLXVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSAKK3N1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgSnVzdCB2YW4gUm9zc3VtIG5vdCBiZQordXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlCiBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uCiAKLUpVU1QgVkFOIFJPU1NVTSBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwgCi1JTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PIAotRVZFTlQgU0hBTEwgSlVTVCBWQU4gUk9TU1VNIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SIAotQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiAKLVVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiAKK0pVU1QgVkFOIFJPU1NVTSBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKK0lOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KK0VWRU5UIFNIQUxMIEpVU1QgVkFOIFJPU1NVTSBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgorQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRgorVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SCiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgogCkBAIC0zNywxNyArMzcsMTcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBjcF9HZXRDb2xvcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUkdCQ29sb3IgaW5Db2xvciwgb3V0Q29sb3I7Ci0JQm9vbGVhbiBvazsKLQlQb2ludCB3aGVyZSA9IHswLCAwfTsKLQlTdHIyNTUgcHJvbXB0OwotCQotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyZPJiIsIFB5TWFjX0dldFN0cjI1NSwgcHJvbXB0LCBRZFJHQl9Db252ZXJ0LCAmaW5Db2xvcikpCi0JCXJldHVybiBOVUxMOwotCQotCW9rID0gR2V0Q29sb3Iod2hlcmUsIHByb21wdCwgJmluQ29sb3IsICZvdXRDb2xvcik7Ci0JCi0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8maCIsIFFkUkdCX05ldywgJm91dENvbG9yLCBvayk7CisgICAgUkdCQ29sb3IgaW5Db2xvciwgb3V0Q29sb3I7CisgICAgQm9vbGVhbiBvazsKKyAgICBQb2ludCB3aGVyZSA9IHswLCAwfTsKKyAgICBTdHIyNTUgcHJvbXB0OworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJk8mIiwgUHlNYWNfR2V0U3RyMjU1LCBwcm9tcHQsIFFkUkdCX0NvbnZlcnQsICZpbkNvbG9yKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBvayA9IEdldENvbG9yKHdoZXJlLCBwcm9tcHQsICZpbkNvbG9yLCAmb3V0Q29sb3IpOworCisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8maCIsIFFkUkdCX05ldywgJm91dENvbG9yLCBvayk7CiB9CiAjZW5kaWYgLyogX19MUDY0X18gKi8KIApAQCAtNTUsMzYgKzU1LDM2IEBACiAKIHN0YXRpYyBzdHJ1Y3QgUHlNZXRob2REZWYgY3BfbWV0aG9kc1tdID0gewogI2lmbmRlZiBfX0xQNjRfXwotCXsiR2V0Q29sb3IiLAkoUHlDRnVuY3Rpb24pY3BfR2V0Q29sb3IsCU1FVEhfVkFSQVJHUywJY3BfR2V0Q29sb3JfX2RvY19ffSwKKyAgICB7IkdldENvbG9yIiwgICAgICAgIChQeUNGdW5jdGlvbiljcF9HZXRDb2xvciwgICAgICAgTUVUSF9WQVJBUkdTLCAgIGNwX0dldENvbG9yX19kb2NfX30sCiAjZW5kaWYgLyogX19MUDY0X18gKi8KLQl7TlVMTCwJIAkJKFB5Q0Z1bmN0aW9uKU5VTEwsIAkJCTAsIAkJCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7TlVMTCwgICAgICAgICAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKU5VTEwsICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiAKIC8qIEluaXRpYWxpemF0aW9uIGZ1bmN0aW9uIGZvciB0aGUgbW9kdWxlICgqbXVzdCogYmUgY2FsbGVkIGluaXRDb2xvclBpY2tlcikgKi8KIAotc3RhdGljIGNoYXIgY3BfbW9kdWxlX2RvY3VtZW50YXRpb25bXSA9IAorc3RhdGljIGNoYXIgY3BfbW9kdWxlX2RvY3VtZW50YXRpb25bXSA9CiAiIgogOwogCiB2b2lkIGluaXRDb2xvclBpY2tlcih2b2lkKQogewotCVB5T2JqZWN0ICptOwotCQotCWlmIChQeUVycl9XYXJuUHkzaygiSW4gMy54LCBDb2xvclBpY2tlciBpcyByZW1vdmVkLiIsIDEpIDwgMCkKLQkJcmV0dXJuOworICAgIFB5T2JqZWN0ICptOwogCi0JLyogQ3JlYXRlIHRoZSBtb2R1bGUgYW5kIGFkZCB0aGUgZnVuY3Rpb25zICovCi0JbSA9IFB5X0luaXRNb2R1bGU0KCJDb2xvclBpY2tlciIsIGNwX21ldGhvZHMsCi0JCWNwX21vZHVsZV9kb2N1bWVudGF0aW9uLAotCQkoUHlPYmplY3QqKU5VTEwsUFlUSE9OX0FQSV9WRVJTSU9OKTsKKyAgICBpZiAoUHlFcnJfV2FyblB5M2soIkluIDMueCwgQ29sb3JQaWNrZXIgaXMgcmVtb3ZlZC4iLCAxKSA8IDApCisgICAgICAgIHJldHVybjsKIAotCS8qIEFkZCBzeW1ib2xpYyBjb25zdGFudHMgdG8gdGhlIG1vZHVsZSBoZXJlICovCi0JCi0JLyogWFhYWCBBZGQgY29uc3RhbnRzIGhlcmUgKi8KLQkKLQkvKiBDaGVjayBmb3IgZXJyb3JzICovCi0JaWYgKFB5RXJyX09jY3VycmVkKCkpCi0JCVB5X0ZhdGFsRXJyb3IoImNhbid0IGluaXRpYWxpemUgbW9kdWxlIENvbG9yUGlja2VyIik7CisgICAgLyogQ3JlYXRlIHRoZSBtb2R1bGUgYW5kIGFkZCB0aGUgZnVuY3Rpb25zICovCisgICAgbSA9IFB5X0luaXRNb2R1bGU0KCJDb2xvclBpY2tlciIsIGNwX21ldGhvZHMsCisgICAgICAgIGNwX21vZHVsZV9kb2N1bWVudGF0aW9uLAorICAgICAgICAoUHlPYmplY3QqKU5VTEwsUFlUSE9OX0FQSV9WRVJTSU9OKTsKKworICAgIC8qIEFkZCBzeW1ib2xpYyBjb25zdGFudHMgdG8gdGhlIG1vZHVsZSBoZXJlICovCisKKyAgICAvKiBYWFhYIEFkZCBjb25zdGFudHMgaGVyZSAqLworCisgICAgLyogQ2hlY2sgZm9yIGVycm9ycyAqLworICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJjYW4ndCBpbml0aWFsaXplIG1vZHVsZSBDb2xvclBpY2tlciIpOwogfQogCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9NYWNPUy5jIGIvTWFjL01vZHVsZXMvTWFjT1MuYwppbmRleCAyNzJmZThkLi43OWIyNzY0IDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9NYWNPUy5jCisrKyBiL01hYy9Nb2R1bGVzL01hY09TLmMKQEAgLTQsMTAgKzQsMTAgQEAKIAogICAgICAgICAgICAgICAgICAgICAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAogCi1QZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMgCi1kb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIAorUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsCiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0Ci1ib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gCitib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWVzIG9mIFN0aWNodGluZyBNYXRoZW1hdGlzY2gKIENlbnRydW0gb3IgQ1dJIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvCiBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4KQEAgLTMxLDcgKzMxLDcgQEAKICNpbmNsdWRlIDxBcHBsaWNhdGlvblNlcnZpY2VzL0FwcGxpY2F0aW9uU2VydmljZXMuaD4KIAogI2lmbmRlZiBIQVZFX09TWDEwNV9TREsKLXR5cGVkZWYgU0ludDE2CUZTSU9SZWZOdW07Cit0eXBlZGVmIFNJbnQxNiAgRlNJT1JlZk51bTsKICNlbmRpZgogCiBzdGF0aWMgUHlPYmplY3QgKk1hY09TX0Vycm9yOyAvKiBFeGNlcHRpb24gTWFjT1MuRXJyb3IgKi8KQEAgLTQzLDkgKzQzLDkgQEAKIC8qIERlY2xhcmF0aW9ucyBmb3Igb2JqZWN0cyBvZiB0eXBlIFJlc291cmNlIGZvcmsgKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewotCVB5T2JqZWN0X0hFQUQKLQlGU0lPUmVmTnVtIGZSZWZOdW07Ci0JaW50IGlzY2xvc2VkOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBGU0lPUmVmTnVtIGZSZWZOdW07CisgICAgaW50IGlzY2xvc2VkOwogfSByZm9iamVjdDsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBSZnR5cGU7CkBAIC01NywxNjYgKzU3LDE2NiBAQAogc3RhdGljIHZvaWQKIGRvX2Nsb3NlKHJmb2JqZWN0ICpzZWxmKQogewotCWlmIChzZWxmLT5pc2Nsb3NlZCApIHJldHVybjsKLQkodm9pZClGU0Nsb3NlRm9yayhzZWxmLT5mUmVmTnVtKTsKLQlzZWxmLT5pc2Nsb3NlZCA9IDE7CisgICAgaWYgKHNlbGYtPmlzY2xvc2VkICkgcmV0dXJuOworICAgICh2b2lkKUZTQ2xvc2VGb3JrKHNlbGYtPmZSZWZOdW0pOworICAgIHNlbGYtPmlzY2xvc2VkID0gMTsKIH0KIAotc3RhdGljIGNoYXIgcmZfcmVhZF9fZG9jX19bXSA9IAorc3RhdGljIGNoYXIgcmZfcmVhZF9fZG9jX19bXSA9CiAiUmVhZCBkYXRhIGZyb20gcmVzb3VyY2UgZm9yayIKIDsKIAogc3RhdGljIFB5T2JqZWN0ICoKIHJmX3JlYWQocmZvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgbjsKLQlQeU9iamVjdCAqdjsKLQlPU0VyciBlcnI7Ci0JQnl0ZUNvdW50IG4yOwotCQotCWlmIChzZWxmLT5pc2Nsb3NlZCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIk9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsIiwgJm4pKQotCQlyZXR1cm4gTlVMTDsKLQkJCi0JdiA9IFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilOVUxMLCBuKTsKLQlpZiAodiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQkJCi0JZXJyID0gRlNSZWFkRm9yayhzZWxmLT5mUmVmTnVtLCBmc0F0TWFyaywgMCwgbiwgUHlTdHJpbmdfQXNTdHJpbmcodiksICZuMik7Ci0JaWYgKGVyciAmJiBlcnIgIT0gZW9mRXJyKSB7Ci0JCVB5TWFjX0Vycm9yKGVycik7Ci0JCVB5X0RFQ1JFRih2KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCV9QeVN0cmluZ19SZXNpemUoJnYsIG4yKTsKLQlyZXR1cm4gdjsKKyAgICBsb25nIG47CisgICAgUHlPYmplY3QgKnY7CisgICAgT1NFcnIgZXJyOworICAgIEJ5dGVDb3VudCBuMjsKKworICAgIGlmIChzZWxmLT5pc2Nsb3NlZCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIk9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImwiLCAmbikpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgdiA9IFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilOVUxMLCBuKTsKKyAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGVyciA9IEZTUmVhZEZvcmsoc2VsZi0+ZlJlZk51bSwgZnNBdE1hcmssIDAsIG4sIFB5U3RyaW5nX0FzU3RyaW5nKHYpLCAmbjIpOworICAgIGlmIChlcnIgJiYgZXJyICE9IGVvZkVycikgeworICAgICAgICBQeU1hY19FcnJvcihlcnIpOworICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBfUHlTdHJpbmdfUmVzaXplKCZ2LCBuMik7CisgICAgcmV0dXJuIHY7CiB9CiAKIAotc3RhdGljIGNoYXIgcmZfd3JpdGVfX2RvY19fW10gPSAKK3N0YXRpYyBjaGFyIHJmX3dyaXRlX19kb2NfX1tdID0KICJXcml0ZSB0byByZXNvdXJjZSBmb3JrIgogOwogCiBzdGF0aWMgUHlPYmplY3QgKgogcmZfd3JpdGUocmZvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKmJ1ZmZlcjsKLQlsb25nIHNpemU7Ci0JT1NFcnIgZXJyOwotCQotCWlmIChzZWxmLT5pc2Nsb3NlZCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIk9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIyIsICZidWZmZXIsICZzaXplKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZXJyID0gRlNXcml0ZUZvcmsoc2VsZi0+ZlJlZk51bSwgZnNBdE1hcmssIDAsIHNpemUsIGJ1ZmZlciwgTlVMTCk7Ci0JaWYgKGVycikgewotCQlQeU1hY19FcnJvcihlcnIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGNoYXIgKmJ1ZmZlcjsKKyAgICBsb25nIHNpemU7CisgICAgT1NFcnIgZXJyOworCisgICAgaWYgKHNlbGYtPmlzY2xvc2VkKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiT3BlcmF0aW9uIG9uIGNsb3NlZCBmaWxlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjIiwgJmJ1ZmZlciwgJnNpemUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBlcnIgPSBGU1dyaXRlRm9yayhzZWxmLT5mUmVmTnVtLCBmc0F0TWFyaywgMCwgc2l6ZSwgYnVmZmVyLCBOVUxMKTsKKyAgICBpZiAoZXJyKSB7CisgICAgICAgIFB5TWFjX0Vycm9yKGVycik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIAotc3RhdGljIGNoYXIgcmZfc2Vla19fZG9jX19bXSA9IAorc3RhdGljIGNoYXIgcmZfc2Vla19fZG9jX19bXSA9CiAiU2V0IGZpbGUgcG9zaXRpb24iCiA7CiAKIHN0YXRpYyBQeU9iamVjdCAqCiByZl9zZWVrKHJmb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFtb3VudDsKLQlpbnQgd2hlbmNlID0gU0VFS19TRVQ7Ci0JaW50IG1vZGU7Ci0JT1NFcnIgZXJyOwotCQotCWlmIChzZWxmLT5pc2Nsb3NlZCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIk9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsfGkiLCAmYW1vdW50LCAmd2hlbmNlKSkgewotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JCi0Jc3dpdGNoICh3aGVuY2UpIHsKLQljYXNlIFNFRUtfQ1VSOgotCQltb2RlID0gZnNGcm9tTWFyazsKLQkJYnJlYWs7Ci0JY2FzZSBTRUVLX0VORDoKLQkJbW9kZSA9IGZzRnJvbUxFT0Y7Ci0JCWJyZWFrOwotCWNhc2UgU0VFS19TRVQ6Ci0JCW1vZGUgPSBmc0Zyb21TdGFydDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJUHlFcnJfQmFkQXJndW1lbnQoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGxvbmcgYW1vdW50OworICAgIGludCB3aGVuY2UgPSBTRUVLX1NFVDsKKyAgICBpbnQgbW9kZTsKKyAgICBPU0VyciBlcnI7CiAKLQllcnIgPSBGU1NldEZvcmtQb3NpdGlvbihzZWxmLT5mUmVmTnVtLCBtb2RlLCBhbW91bnQpOwotCWlmIChlcnIgIT0gbm9FcnIpIHsKLQkJUHlNYWNfRXJyb3IoZXJyKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAoc2VsZi0+aXNjbG9zZWQpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJPcGVyYXRpb24gb24gY2xvc2VkIGZpbGUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibHxpIiwgJmFtb3VudCwgJndoZW5jZSkpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgc3dpdGNoICh3aGVuY2UpIHsKKyAgICBjYXNlIFNFRUtfQ1VSOgorICAgICAgICBtb2RlID0gZnNGcm9tTWFyazsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTRUVLX0VORDoKKyAgICAgICAgbW9kZSA9IGZzRnJvbUxFT0Y7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU0VFS19TRVQ6CisgICAgICAgIG1vZGUgPSBmc0Zyb21TdGFydDsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgUHlFcnJfQmFkQXJndW1lbnQoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgZXJyID0gRlNTZXRGb3JrUG9zaXRpb24oc2VsZi0+ZlJlZk51bSwgbW9kZSwgYW1vdW50KTsKKyAgICBpZiAoZXJyICE9IG5vRXJyKSB7CisgICAgICAgIFB5TWFjX0Vycm9yKGVycik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIAotc3RhdGljIGNoYXIgcmZfdGVsbF9fZG9jX19bXSA9IAorc3RhdGljIGNoYXIgcmZfdGVsbF9fZG9jX19bXSA9CiAiR2V0IGZpbGUgcG9zaXRpb24iCiA7CiAKIHN0YXRpYyBQeU9iamVjdCAqCiByZl90ZWxsKHJmb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGxvbmcgd2hlcmU7Ci0JT1NFcnIgZXJyOwotCQotCWlmIChzZWxmLT5pc2Nsb3NlZCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIk9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgbG9uZyBsb25nIHdoZXJlOworICAgIE9TRXJyIGVycjsKIAotCWVyciA9IEZTR2V0Rm9ya1Bvc2l0aW9uKHNlbGYtPmZSZWZOdW0sICZ3aGVyZSk7Ci0JaWYgKGVyciAhPSBub0VycikgewotCQlQeU1hY19FcnJvcihlcnIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZ0xvbmcod2hlcmUpOworICAgIGlmIChzZWxmLT5pc2Nsb3NlZCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIk9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBlcnIgPSBGU0dldEZvcmtQb3NpdGlvbihzZWxmLT5mUmVmTnVtLCAmd2hlcmUpOworICAgIGlmIChlcnIgIT0gbm9FcnIpIHsKKyAgICAgICAgUHlNYWNfRXJyb3IoZXJyKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmdMb25nKHdoZXJlKTsKIH0KIAotc3RhdGljIGNoYXIgcmZfY2xvc2VfX2RvY19fW10gPSAKK3N0YXRpYyBjaGFyIHJmX2Nsb3NlX19kb2NfX1tdID0KICJDbG9zZSByZXNvdXJjZSBmb3JrIgogOwogCiBzdGF0aWMgUHlPYmplY3QgKgogcmZfY2xvc2UocmZvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCWRvX2Nsb3NlKHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBkb19jbG9zZShzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIAogc3RhdGljIHN0cnVjdCBQeU1ldGhvZERlZiByZl9tZXRob2RzW10gPSB7Ci0geyJyZWFkIiwJKFB5Q0Z1bmN0aW9uKXJmX3JlYWQsCTEsCXJmX3JlYWRfX2RvY19ffSwKLSB7IndyaXRlIiwJKFB5Q0Z1bmN0aW9uKXJmX3dyaXRlLAkxLAlyZl93cml0ZV9fZG9jX199LAotIHsic2VlayIsCShQeUNGdW5jdGlvbilyZl9zZWVrLAkxLAlyZl9zZWVrX19kb2NfX30sCi0geyJ0ZWxsIiwJKFB5Q0Z1bmN0aW9uKXJmX3RlbGwsCTEsCXJmX3RlbGxfX2RvY19ffSwKLSB7ImNsb3NlIiwJKFB5Q0Z1bmN0aW9uKXJmX2Nsb3NlLAkxLAlyZl9jbG9zZV9fZG9jX199LAotIAotCXtOVUxMLAkJTlVMTH0JCS8qIHNlbnRpbmVsICovCisgeyJyZWFkIiwgICAgICAgKFB5Q0Z1bmN0aW9uKXJmX3JlYWQsICAgMSwgICAgICByZl9yZWFkX19kb2NfX30sCisgeyJ3cml0ZSIsICAgICAgKFB5Q0Z1bmN0aW9uKXJmX3dyaXRlLCAgMSwgICAgICByZl93cml0ZV9fZG9jX199LAorIHsic2VlayIsICAgICAgIChQeUNGdW5jdGlvbilyZl9zZWVrLCAgIDEsICAgICAgcmZfc2Vla19fZG9jX199LAorIHsidGVsbCIsICAgICAgIChQeUNGdW5jdGlvbilyZl90ZWxsLCAgIDEsICAgICAgcmZfdGVsbF9fZG9jX199LAorIHsiY2xvc2UiLCAgICAgIChQeUNGdW5jdGlvbilyZl9jbG9zZSwgIDEsICAgICAgcmZfY2xvc2VfX2RvY19ffSwKKworICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiAvKiAtLS0tLS0tLS0tICovCkBAIC0yMjUsNTYgKzIyNSw1NiBAQAogc3RhdGljIHJmb2JqZWN0ICoKIG5ld3Jmb2JqZWN0KHZvaWQpCiB7Ci0JcmZvYmplY3QgKnNlbGY7Ci0JCi0Jc2VsZiA9IFB5T2JqZWN0X05FVyhyZm9iamVjdCwgJlJmdHlwZSk7Ci0JaWYgKHNlbGYgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0Jc2VsZi0+aXNjbG9zZWQgPSAxOwotCXJldHVybiBzZWxmOworICAgIHJmb2JqZWN0ICpzZWxmOworCisgICAgc2VsZiA9IFB5T2JqZWN0X05FVyhyZm9iamVjdCwgJlJmdHlwZSk7CisgICAgaWYgKHNlbGYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgc2VsZi0+aXNjbG9zZWQgPSAxOworICAgIHJldHVybiBzZWxmOwogfQogCiAKIHN0YXRpYyB2b2lkCiByZl9kZWFsbG9jKHJmb2JqZWN0ICpzZWxmKQogewotCWRvX2Nsb3NlKHNlbGYpOwotCVB5T2JqZWN0X0RFTChzZWxmKTsKKyAgICBkb19jbG9zZShzZWxmKTsKKyAgICBQeU9iamVjdF9ERUwoc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiByZl9nZXRhdHRyKHJmb2JqZWN0ICpzZWxmLCBjaGFyICpuYW1lKQogewotCXJldHVybiBQeV9GaW5kTWV0aG9kKHJmX21ldGhvZHMsIChQeU9iamVjdCAqKXNlbGYsIG5hbWUpOworICAgIHJldHVybiBQeV9GaW5kTWV0aG9kKHJmX21ldGhvZHMsIChQeU9iamVjdCAqKXNlbGYsIG5hbWUpOwogfQogCi1zdGF0aWMgY2hhciBSZnR5cGVfX2RvY19fW10gPSAKK3N0YXRpYyBjaGFyIFJmdHlwZV9fZG9jX19bXSA9CiAiUmVzb3VyY2UgZm9yayBmaWxlIG9iamVjdCIKIDsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBSZnR5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSkKLQkwLAkJCQkvKm9iX3NpemUqLwotCSJNYWNPUy5SZXNvdXJjZUZvcmsiLAkJLyp0cF9uYW1lKi8KLQlzaXplb2YocmZvYmplY3QpLAkJLyp0cF9iYXNpY3NpemUqLwotCTAsCQkJCS8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcilyZl9kZWFsbG9jLAkvKnRwX2RlYWxsb2MqLwotCShwcmludGZ1bmMpMCwJCS8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYylyZl9nZXRhdHRyLAkvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYykwLAkvKnRwX3NldGF0dHIqLwotCShjbXBmdW5jKTAsCQkvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYykwLAkJLyp0cF9yZXByKi8KLQkwLAkJCS8qdHBfYXNfbnVtYmVyKi8KLQkwLAkJLyp0cF9hc19zZXF1ZW5jZSovCi0JMCwJCS8qdHBfYXNfbWFwcGluZyovCi0JKGhhc2hmdW5jKTAsCQkvKnRwX2hhc2gqLwotCSh0ZXJuYXJ5ZnVuYykwLAkJLyp0cF9jYWxsKi8KLQkocmVwcmZ1bmMpMCwJCS8qdHBfc3RyKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlKQorICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb2Jfc2l6ZSovCisgICAgIk1hY09TLlJlc291cmNlRm9yayIsICAgICAgICAgICAgICAgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YocmZvYmplY3QpLCAgICAgICAgICAgICAgICAgICAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKXJmX2RlYWxsb2MsICAgICAvKnRwX2RlYWxsb2MqLworICAgIChwcmludGZ1bmMpMCwgICAgICAgICAgICAgICAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpcmZfZ2V0YXR0ciwgICAgICAgICAgICAvKnRwX2dldGF0dHIqLworICAgIChzZXRhdHRyZnVuYykwLCAgICAgLyp0cF9zZXRhdHRyKi8KKyAgICAoY21wZnVuYykwLCAgICAgICAgICAgICAgICAgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpMCwgICAgICAgICAgICAgICAgLyp0cF9yZXByKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19udW1iZXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9hc19zZXF1ZW5jZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX2FzX21hcHBpbmcqLworICAgIChoYXNoZnVuYykwLCAgICAgICAgICAgICAgICAvKnRwX2hhc2gqLworICAgICh0ZXJuYXJ5ZnVuYykwLCAgICAgICAgICAgICAvKnRwX2NhbGwqLworICAgIChyZXByZnVuYykwLCAgICAgICAgICAgICAgICAvKnRwX3N0ciovCiAKLQkvKiBTcGFjZSBmb3IgZnV0dXJlIGV4cGFuc2lvbiAqLwotCTBMLDBMLDBMLDBMLAotCVJmdHlwZV9fZG9jX18gLyogRG9jdW1lbnRhdGlvbiBzdHJpbmcgKi8KKyAgICAvKiBTcGFjZSBmb3IgZnV0dXJlIGV4cGFuc2lvbiAqLworICAgIDBMLDBMLDBMLDBMLAorICAgIFJmdHlwZV9fZG9jX18gLyogRG9jdW1lbnRhdGlvbiBzdHJpbmcgKi8KIH07CiAKIApAQCAtMjg5LDY1ICsyODksNjUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBNYWNPU19HZXRDcmVhdG9yQW5kVHlwZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKmNyZWF0b3IsICp0eXBlLCAqcmVzOwotCU9TRXJyIGVycjsKLQlGU1JlZiByZWY7Ci0JRlNDYXRhbG9nSW5mbwljYXRhbG9naW5mbzsKLQlGaWxlSW5mbyogZmluZm87CisgICAgUHlPYmplY3QgKmNyZWF0b3IsICp0eXBlLCAqcmVzOworICAgIE9TRXJyIGVycjsKKyAgICBGU1JlZiByZWY7CisgICAgRlNDYXRhbG9nSW5mbyAgICAgICBjYXRhbG9naW5mbzsKKyAgICBGaWxlSW5mbyogZmluZm87CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mIiwgUHlNYWNfR2V0RlNSZWYsICZyZWYpKSB7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJiIsIFB5TWFjX0dldEZTUmVmLCAmcmVmKSkgewogI2lmbmRlZiBfX0xQNjRfXwotCQkvKiBUaGlzIGZ1bmN0aW9uIGlzIGRvY3VtZW50ZWQgdG8gdGFrZSBhbiBGU1NwZWMgYXMgd2VsbCwKLQkJICogd2hpY2ggb25seSB3b3JrcyBpbiAzMi1iaXQgbW9kZS4KLQkJICovCi0JCVB5RXJyX0NsZWFyKCk7Ci0JCUZTU3BlYyBmc3M7Ci0JCUZJbmZvIGluZm87CisgICAgICAgIC8qIFRoaXMgZnVuY3Rpb24gaXMgZG9jdW1lbnRlZCB0byB0YWtlIGFuIEZTU3BlYyBhcyB3ZWxsLAorICAgICAgICAgKiB3aGljaCBvbmx5IHdvcmtzIGluIDMyLWJpdCBtb2RlLgorICAgICAgICAgKi8KKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgRlNTcGVjIGZzczsKKyAgICAgICAgRkluZm8gaW5mbzsKIAotCQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mIiwgUHlNYWNfR2V0RlNTcGVjLCAmZnNzKSkKLQkJCXJldHVybiBOVUxMOworICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mIiwgUHlNYWNfR2V0RlNTcGVjLCAmZnNzKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogCi0JCWlmICgoZXJyID0gRlNwR2V0RkluZm8oJmZzcywgJmluZm8pKSAhPSBub0VycikgewotCQkJcmV0dXJuIFB5RXJyX01hYyhNYWNPU19FcnJvciwgZXJyKTsKLQkJfQotCQljcmVhdG9yID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoCi0JCQkJKGNoYXIgKikmaW5mby5mZENyZWF0b3IsIDQpOwotCQl0eXBlID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKikmaW5mby5mZFR5cGUsIDQpOwotCQlyZXMgPSBQeV9CdWlsZFZhbHVlKCJPTyIsIGNyZWF0b3IsIHR5cGUpOwotCQlQeV9ERUNSRUYoY3JlYXRvcik7Ci0JCVB5X0RFQ1JFRih0eXBlKTsKLQkJcmV0dXJuIHJlczsKLSNlbHNlCS8qIF9fTFA2NF9fICovCi0JCXJldHVybiBOVUxMOwotI2VuZGlmCS8qIF9fTFA2NF9fICovCi0JfQorICAgICAgICBpZiAoKGVyciA9IEZTcEdldEZJbmZvKCZmc3MsICZpbmZvKSkgIT0gbm9FcnIpIHsKKyAgICAgICAgICAgIHJldHVybiBQeUVycl9NYWMoTWFjT1NfRXJyb3IsIGVycik7CisgICAgICAgIH0KKyAgICAgICAgY3JlYXRvciA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKAorICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikmaW5mby5mZENyZWF0b3IsIDQpOworICAgICAgICB0eXBlID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKikmaW5mby5mZFR5cGUsIDQpOworICAgICAgICByZXMgPSBQeV9CdWlsZFZhbHVlKCJPTyIsIGNyZWF0b3IsIHR5cGUpOworICAgICAgICBQeV9ERUNSRUYoY3JlYXRvcik7CisgICAgICAgIFB5X0RFQ1JFRih0eXBlKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyNlbHNlICAgLyogX19MUDY0X18gKi8KKyAgICAgICAgcmV0dXJuIE5VTEw7CisjZW5kaWYgIC8qIF9fTFA2NF9fICovCisgICAgfQogCi0JZXJyID0gRlNHZXRDYXRhbG9nSW5mbygmcmVmLCAKLQkJCWtGU0NhdEluZm9GaW5kZXJJbmZvfGtGU0NhdEluZm9Ob2RlRmxhZ3MsICZjYXRhbG9naW5mbywgCi0JCQlOVUxMLCBOVUxMLCBOVUxMKTsKLQlpZiAoZXJyICE9IG5vRXJyKSB7Ci0JCVB5RXJyX01hYyhNYWNPU19FcnJvciwgZXJyKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGVyciA9IEZTR2V0Q2F0YWxvZ0luZm8oJnJlZiwKKyAgICAgICAgICAgICAgICAgICAga0ZTQ2F0SW5mb0ZpbmRlckluZm98a0ZTQ2F0SW5mb05vZGVGbGFncywgJmNhdGFsb2dpbmZvLAorICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICBpZiAoZXJyICE9IG5vRXJyKSB7CisgICAgICAgIFB5RXJyX01hYyhNYWNPU19FcnJvciwgZXJyKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaWYgKChjYXRhbG9naW5mby5ub2RlRmxhZ3MgJiBrRlNOb2RlSXNEaXJlY3RvcnlNYXNrKSAhPSAwKSB7Ci0JCS8qIERpcmVjdG9yeTogZG9lc24ndCBoYXZlIHR5cGUvY3JlYXRvciBpbmZvLgotCQkgKgotCQkgKiBUaGUgc3BlY2lmaWMgZXJyb3IgY29kZSBpcyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoCi0JCSAqIGVhcmxpZXIgdmVyc2lvbnMuCi0JCSAqLwotCQlQeUVycl9NYWMoTWFjT1NfRXJyb3IsIGZuZkVycik7Ci0JCXJldHVybiBOVUxMOworICAgIGlmICgoY2F0YWxvZ2luZm8ubm9kZUZsYWdzICYga0ZTTm9kZUlzRGlyZWN0b3J5TWFzaykgIT0gMCkgeworICAgICAgICAvKiBEaXJlY3Rvcnk6IGRvZXNuJ3QgaGF2ZSB0eXBlL2NyZWF0b3IgaW5mby4KKyAgICAgICAgICoKKyAgICAgICAgICogVGhlIHNwZWNpZmljIGVycm9yIGNvZGUgaXMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aAorICAgICAgICAgKiBlYXJsaWVyIHZlcnNpb25zLgorICAgICAgICAgKi8KKyAgICAgICAgUHlFcnJfTWFjKE1hY09TX0Vycm9yLCBmbmZFcnIpOworICAgICAgICByZXR1cm4gTlVMTDsKIAotCX0gCi0JZmluZm8gPSAoRmlsZUluZm8qKSYoY2F0YWxvZ2luZm8uZmluZGVySW5mbyk7Ci0JY3JlYXRvciA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyKikmKGZpbmZvLT5maWxlQ3JlYXRvciksIDQpOwotCXR5cGUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciopJihmaW5mby0+ZmlsZVR5cGUpLCA0KTsKKyAgICB9CisgICAgZmluZm8gPSAoRmlsZUluZm8qKSYoY2F0YWxvZ2luZm8uZmluZGVySW5mbyk7CisgICAgY3JlYXRvciA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyKikmKGZpbmZvLT5maWxlQ3JlYXRvciksIDQpOworICAgIHR5cGUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciopJihmaW5mby0+ZmlsZVR5cGUpLCA0KTsKIAotCXJlcyA9IFB5X0J1aWxkVmFsdWUoIk9PIiwgY3JlYXRvciwgdHlwZSk7Ci0JUHlfREVDUkVGKGNyZWF0b3IpOwotCVB5X0RFQ1JFRih0eXBlKTsKLQlyZXR1cm4gcmVzOworICAgIHJlcyA9IFB5X0J1aWxkVmFsdWUoIk9PIiwgY3JlYXRvciwgdHlwZSk7CisgICAgUHlfREVDUkVGKGNyZWF0b3IpOworICAgIFB5X0RFQ1JFRih0eXBlKTsKKyAgICByZXR1cm4gcmVzOwogfQogCiBzdGF0aWMgY2hhciBzZXRjcnRwX2RvY1tdID0gIlNldCBNYWNPUyA0LWNoYXIgY3JlYXRvciBhbmQgdHlwZSBmb3IgYSBmaWxlIjsKQEAgLTM1NSw2OCArMzU1LDY4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogTWFjT1NfU2V0Q3JlYXRvckFuZFR5cGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVJlc1R5cGUgY3JlYXRvciwgdHlwZTsKLQlGU1JlZiByZWY7Ci0JRmlsZUluZm8qIGZpbmZvOwotCU9TRXJyIGVycjsKLQlGU0NhdGFsb2dJbmZvCWNhdGFsb2dpbmZvOworICAgIFJlc1R5cGUgY3JlYXRvciwgdHlwZTsKKyAgICBGU1JlZiByZWY7CisgICAgRmlsZUluZm8qIGZpbmZvOworICAgIE9TRXJyIGVycjsKKyAgICBGU0NhdGFsb2dJbmZvICAgICAgIGNhdGFsb2dpbmZvOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJk8mTyYiLAotCQkJUHlNYWNfR2V0RlNSZWYsICZyZWYsIFB5TWFjX0dldE9TVHlwZSwgJmNyZWF0b3IsIFB5TWFjX0dldE9TVHlwZSwgJnR5cGUpKSB7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1JlZiwgJnJlZiwgUHlNYWNfR2V0T1NUeXBlLCAmY3JlYXRvciwgUHlNYWNfR2V0T1NUeXBlLCAmdHlwZSkpIHsKICNpZm5kZWYgX19MUDY0X18KLQkJLyogVHJ5IHRvIGhhbmRsZSBGU1NwZWMgYXJndW1lbnRzLCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSAqLwotCQlGU1NwZWMgZnNzOwotCQlGSW5mbyBpbmZvOworICAgICAgICAvKiBUcnkgdG8gaGFuZGxlIEZTU3BlYyBhcmd1bWVudHMsIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5ICovCisgICAgICAgIEZTU3BlYyBmc3M7CisgICAgICAgIEZJbmZvIGluZm87CiAKLQkJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJk8mTyYiLAotCQkJUHlNYWNfR2V0RlNTcGVjLCAmZnNzLCBQeU1hY19HZXRPU1R5cGUsICZjcmVhdG9yLCBQeU1hY19HZXRPU1R5cGUsICZ0eXBlKSkKLQkJCXJldHVybiBOVUxMOworICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZmc3MsIFB5TWFjX0dldE9TVHlwZSwgJmNyZWF0b3IsIFB5TWFjX0dldE9TVHlwZSwgJnR5cGUpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkJaWYgKChlcnIgPSBGU3BHZXRGSW5mbygmZnNzLCAmaW5mbykpICE9IG5vRXJyKQotCQkJcmV0dXJuIFB5RXJyX01hYyhNYWNPU19FcnJvciwgZXJyKTsKKyAgICAgICAgaWYgKChlcnIgPSBGU3BHZXRGSW5mbygmZnNzLCAmaW5mbykpICE9IG5vRXJyKQorICAgICAgICAgICAgcmV0dXJuIFB5RXJyX01hYyhNYWNPU19FcnJvciwgZXJyKTsKIAotCQlpbmZvLmZkQ3JlYXRvciA9IGNyZWF0b3I7Ci0JCWluZm8uZmRUeXBlID0gdHlwZTsKKyAgICAgICAgaW5mby5mZENyZWF0b3IgPSBjcmVhdG9yOworICAgICAgICBpbmZvLmZkVHlwZSA9IHR5cGU7CiAKLQkJaWYgKChlcnIgPSBGU3BTZXRGSW5mbygmZnNzLCAmaW5mbykpICE9IG5vRXJyKQotCQkJcmV0dXJuIFB5RXJyX01hYyhNYWNPU19FcnJvciwgZXJyKTsKLQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQlyZXR1cm4gUHlfTm9uZTsKKyAgICAgICAgaWYgKChlcnIgPSBGU3BTZXRGSW5mbygmZnNzLCAmaW5mbykpICE9IG5vRXJyKQorICAgICAgICAgICAgcmV0dXJuIFB5RXJyX01hYyhNYWNPU19FcnJvciwgZXJyKTsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICByZXR1cm4gUHlfTm9uZTsKICNlbHNlIC8qIF9fTFA2NF9fICovCi0JCXJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKICNlbmRpZiAvKiBfX0xQNjRfXyAqLwotCX0KLQkKLQllcnIgPSBGU0dldENhdGFsb2dJbmZvKCZyZWYsIAotCQkJa0ZTQ2F0SW5mb0ZpbmRlckluZm98a0ZTQ2F0SW5mb05vZGVGbGFncywgJmNhdGFsb2dpbmZvLCAKLQkJCU5VTEwsIE5VTEwsIE5VTEwpOwotCWlmIChlcnIgIT0gbm9FcnIpIHsKLQkJUHlFcnJfTWFjKE1hY09TX0Vycm9yLCBlcnIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgfQogCi0JaWYgKChjYXRhbG9naW5mby5ub2RlRmxhZ3MgJiBrRlNOb2RlSXNEaXJlY3RvcnlNYXNrKSAhPSAwKSB7Ci0JCS8qIERpcmVjdG9yeTogZG9lc24ndCBoYXZlIHR5cGUvY3JlYXRvciBpbmZvLgotCQkgKgotCQkgKiBUaGUgc3BlY2lmaWMgZXJyb3IgY29kZSBpcyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoCi0JCSAqIGVhcmxpZXIgdmVyc2lvbnMuCi0JCSAqLwotCQlQeUVycl9NYWMoTWFjT1NfRXJyb3IsIGZuZkVycik7Ci0JCXJldHVybiBOVUxMOworICAgIGVyciA9IEZTR2V0Q2F0YWxvZ0luZm8oJnJlZiwKKyAgICAgICAgICAgICAgICAgICAga0ZTQ2F0SW5mb0ZpbmRlckluZm98a0ZTQ2F0SW5mb05vZGVGbGFncywgJmNhdGFsb2dpbmZvLAorICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICBpZiAoZXJyICE9IG5vRXJyKSB7CisgICAgICAgIFB5RXJyX01hYyhNYWNPU19FcnJvciwgZXJyKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JfSAKLQlmaW5mbyA9IChGaWxlSW5mbyopJihjYXRhbG9naW5mby5maW5kZXJJbmZvKTsKLQlmaW5mby0+ZmlsZUNyZWF0b3IgPSBjcmVhdG9yOwotCWZpbmZvLT5maWxlVHlwZSA9IHR5cGU7CisgICAgaWYgKChjYXRhbG9naW5mby5ub2RlRmxhZ3MgJiBrRlNOb2RlSXNEaXJlY3RvcnlNYXNrKSAhPSAwKSB7CisgICAgICAgIC8qIERpcmVjdG9yeTogZG9lc24ndCBoYXZlIHR5cGUvY3JlYXRvciBpbmZvLgorICAgICAgICAgKgorICAgICAgICAgKiBUaGUgc3BlY2lmaWMgZXJyb3IgY29kZSBpcyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoCisgICAgICAgICAqIGVhcmxpZXIgdmVyc2lvbnMuCisgICAgICAgICAqLworICAgICAgICBQeUVycl9NYWMoTWFjT1NfRXJyb3IsIGZuZkVycik7CisgICAgICAgIHJldHVybiBOVUxMOwogCi0JZXJyID0gRlNTZXRDYXRhbG9nSW5mbygmcmVmLCBrRlNDYXRJbmZvRmluZGVySW5mbywgJmNhdGFsb2dpbmZvKTsKLQlpZiAoZXJyICE9IG5vRXJyKSB7Ci0JCVB5RXJyX01hYyhNYWNPU19FcnJvciwgZm5mRXJyKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIH0KKyAgICBmaW5mbyA9IChGaWxlSW5mbyopJihjYXRhbG9naW5mby5maW5kZXJJbmZvKTsKKyAgICBmaW5mby0+ZmlsZUNyZWF0b3IgPSBjcmVhdG9yOworICAgIGZpbmZvLT5maWxlVHlwZSA9IHR5cGU7CiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZXJyID0gRlNTZXRDYXRhbG9nSW5mbygmcmVmLCBrRlNDYXRJbmZvRmluZGVySW5mbywgJmNhdGFsb2dpbmZvKTsKKyAgICBpZiAoZXJyICE9IG5vRXJyKSB7CisgICAgICAgIFB5RXJyX01hYyhNYWNPU19FcnJvciwgZm5mRXJyKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAKQEAgLTQyNSw2NSArNDI1LDY1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogTWFjT1NfR2V0RXJyb3JTdHJpbmcoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBlcnI7Ci0JY2hhciBidWZbMjU2XTsKLQlIYW5kbGUgaDsKLQljaGFyICpzdHI7Ci0Jc3RhdGljIGludCBlcnJvcnNfbG9hZGVkOwotCQotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaSIsICZlcnIpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpbnQgZXJyOworICAgIGNoYXIgYnVmWzI1Nl07CisgICAgSGFuZGxlIGg7CisgICAgY2hhciAqc3RyOworICAgIHN0YXRpYyBpbnQgZXJyb3JzX2xvYWRlZDsKIAotCWggPSBHZXRSZXNvdXJjZSgnRXN0cicsIGVycik7Ci0JaWYgKCFoICYmICFlcnJvcnNfbG9hZGVkKSB7Ci0JCS8qCi0JCSoqIEF0dGVtcHQgdG8gb3BlbiB0aGUgcmVzb3VyY2UgZmlsZSBjb250YWluaW5nIHRoZQotCQkqKiBFc3RyIHJlc291cmNlcy4gV2UgaWdub3JlIGFsbCBlcnJvcnMuIFdlIGFsc28gdHJ5Ci0JCSoqIHRoaXMgb25seSBvbmNlLgotCQkqLwotCQlQeU9iamVjdCAqbSwgKnJ2OwotCQllcnJvcnNfbG9hZGVkID0gMTsKLQkJCi0JCW0gPSBQeUltcG9ydF9JbXBvcnRNb2R1bGVOb0Jsb2NrKCJtYWNyZXNvdXJjZSIpOwotCQlpZiAoIW0pIHsKLQkJCWlmIChQeV9WZXJib3NlRmxhZykKLQkJCQlQeUVycl9QcmludCgpOwotCQkJUHlFcnJfQ2xlYXIoKTsKLQkJfQotCQllbHNlIHsKLQkJCXJ2ID0gUHlPYmplY3RfQ2FsbE1ldGhvZChtLCAib3Blbl9lcnJvcl9yZXNvdXJjZSIsICIiKTsKLQkJCWlmICghcnYpIHsKLQkJCQlpZiAoUHlfVmVyYm9zZUZsYWcpCi0JCQkJCVB5RXJyX1ByaW50KCk7Ci0JCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCVB5X0RFQ1JFRihydik7Ci0JCQkJLyogQW5kIHRyeSBhZ2Fpbi4uLiAqLwotCQkJCWggPSBHZXRSZXNvdXJjZSgnRXN0cicsIGVycik7Ci0JCQl9Ci0JCQlQeV9ERUNSRUYobSk7Ci0JCX0KLQl9Ci0JLyoKLQkqKiBXaGV0aGVyIHRoZSBjb2RlIGFib3ZlIHN1Y2NlZWRlZCBvciBub3QsIHdlIHdvbid0IHRyeQotCSoqIGFnYWluLgotCSovCi0JZXJyb3JzX2xvYWRlZCA9IDE7Ci0JCQotCWlmIChoKSB7Ci0JCUhMb2NrKGgpOwotCQlzdHIgPSAoY2hhciAqKSpoOwotCQltZW1jcHkoYnVmLCBzdHIrMSwgKHVuc2lnbmVkIGNoYXIpc3RyWzBdKTsKLQkJYnVmWyh1bnNpZ25lZCBjaGFyKXN0clswXV0gPSAnXDAnOwotCQlIVW5sb2NrKGgpOwotCQlSZWxlYXNlUmVzb3VyY2UoaCk7Ci0JfQotCWVsc2UgewotCQlQeU9TX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJNYWMgT1MgZXJyb3IgY29kZSAlZCIsIGVycik7Ci0JfQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaSIsICZlcnIpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJzIiwgYnVmKTsKKyAgICBoID0gR2V0UmVzb3VyY2UoJ0VzdHInLCBlcnIpOworICAgIGlmICghaCAmJiAhZXJyb3JzX2xvYWRlZCkgeworICAgICAgICAvKgorICAgICAgICAqKiBBdHRlbXB0IHRvIG9wZW4gdGhlIHJlc291cmNlIGZpbGUgY29udGFpbmluZyB0aGUKKyAgICAgICAgKiogRXN0ciByZXNvdXJjZXMuIFdlIGlnbm9yZSBhbGwgZXJyb3JzLiBXZSBhbHNvIHRyeQorICAgICAgICAqKiB0aGlzIG9ubHkgb25jZS4KKyAgICAgICAgKi8KKyAgICAgICAgUHlPYmplY3QgKm0sICpydjsKKyAgICAgICAgZXJyb3JzX2xvYWRlZCA9IDE7CisKKyAgICAgICAgbSA9IFB5SW1wb3J0X0ltcG9ydE1vZHVsZU5vQmxvY2soIm1hY3Jlc291cmNlIik7CisgICAgICAgIGlmICghbSkgeworICAgICAgICAgICAgaWYgKFB5X1ZlcmJvc2VGbGFnKQorICAgICAgICAgICAgICAgIFB5RXJyX1ByaW50KCk7CisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcnYgPSBQeU9iamVjdF9DYWxsTWV0aG9kKG0sICJvcGVuX2Vycm9yX3Jlc291cmNlIiwgIiIpOworICAgICAgICAgICAgaWYgKCFydikgeworICAgICAgICAgICAgICAgIGlmIChQeV9WZXJib3NlRmxhZykKKyAgICAgICAgICAgICAgICAgICAgUHlFcnJfUHJpbnQoKTsKKyAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHJ2KTsKKyAgICAgICAgICAgICAgICAvKiBBbmQgdHJ5IGFnYWluLi4uICovCisgICAgICAgICAgICAgICAgaCA9IEdldFJlc291cmNlKCdFc3RyJywgZXJyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5X0RFQ1JFRihtKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKgorICAgICoqIFdoZXRoZXIgdGhlIGNvZGUgYWJvdmUgc3VjY2VlZGVkIG9yIG5vdCwgd2Ugd29uJ3QgdHJ5CisgICAgKiogYWdhaW4uCisgICAgKi8KKyAgICBlcnJvcnNfbG9hZGVkID0gMTsKKworICAgIGlmIChoKSB7CisgICAgICAgIEhMb2NrKGgpOworICAgICAgICBzdHIgPSAoY2hhciAqKSpoOworICAgICAgICBtZW1jcHkoYnVmLCBzdHIrMSwgKHVuc2lnbmVkIGNoYXIpc3RyWzBdKTsKKyAgICAgICAgYnVmWyh1bnNpZ25lZCBjaGFyKXN0clswXV0gPSAnXDAnOworICAgICAgICBIVW5sb2NrKGgpOworICAgICAgICBSZWxlYXNlUmVzb3VyY2UoaCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeU9TX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJNYWMgT1MgZXJyb3IgY29kZSAlZCIsIGVycik7CisgICAgfQorCisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoInMiLCBidWYpOwogfQogCiAKQEAgLTQ5NCw0MiArNDk0LDQyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogTWFjT1Nfc3BsYXNoKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgcmVzaWQgPSAtMTsKLQlzdGF0aWMgRGlhbG9nUHRyIGN1cmRpYWxvZyA9IE5VTEw7Ci0JRGlhbG9nUHRyIG9sZGRpYWxvZzsKLQlXaW5kb3dSZWYgdGhlV2luZG93OwotCUNHcmFmUHRyIHRoZVBvcnQ7CisgICAgaW50IHJlc2lkID0gLTE7CisgICAgc3RhdGljIERpYWxvZ1B0ciBjdXJkaWFsb2cgPSBOVUxMOworICAgIERpYWxvZ1B0ciBvbGRkaWFsb2c7CisgICAgV2luZG93UmVmIHRoZVdpbmRvdzsKKyAgICBDR3JhZlB0ciB0aGVQb3J0OwogI2lmIDAKLQlzaG9ydCB4cG9zLCB5cG9zLCB3aWR0aCwgaGVpZ2h0LCBzd2lkdGgsIHNoZWlnaHQ7CisgICAgc2hvcnQgeHBvcywgeXBvcywgd2lkdGgsIGhlaWdodCwgc3dpZHRoLCBzaGVpZ2h0OwogI2VuZGlmCi0JCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8aSIsICZyZXNpZCkpCi0JCXJldHVybiBOVUxMOwotCW9sZGRpYWxvZyA9IGN1cmRpYWxvZzsKLQljdXJkaWFsb2cgPSBOVUxMOwogCi0JaWYgKCByZXNpZCAhPSAtMSApIHsKLQkJY3VyZGlhbG9nID0gR2V0TmV3RGlhbG9nKHJlc2lkLCBOVUxMLCAoV2luZG93UHRyKS0xKTsKLQkJaWYgKCBjdXJkaWFsb2cgKSB7Ci0JCQl0aGVXaW5kb3cgPSBHZXREaWFsb2dXaW5kb3coY3VyZGlhbG9nKTsKLQkJCXRoZVBvcnQgPSBHZXRXaW5kb3dQb3J0KHRoZVdpbmRvdyk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8aSIsICZyZXNpZCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG9sZGRpYWxvZyA9IGN1cmRpYWxvZzsKKyAgICBjdXJkaWFsb2cgPSBOVUxMOworCisgICAgaWYgKCByZXNpZCAhPSAtMSApIHsKKyAgICAgICAgY3VyZGlhbG9nID0gR2V0TmV3RGlhbG9nKHJlc2lkLCBOVUxMLCAoV2luZG93UHRyKS0xKTsKKyAgICAgICAgaWYgKCBjdXJkaWFsb2cgKSB7CisgICAgICAgICAgICB0aGVXaW5kb3cgPSBHZXREaWFsb2dXaW5kb3coY3VyZGlhbG9nKTsKKyAgICAgICAgICAgIHRoZVBvcnQgPSBHZXRXaW5kb3dQb3J0KHRoZVdpbmRvdyk7CiAjaWYgMAotCQkJd2lkdGggPSB0aGVQb3J0LT5wb3J0UmVjdC5yaWdodCAtIHRoZVBvcnQtPnBvcnRSZWN0LmxlZnQ7Ci0JCQloZWlnaHQgPSB0aGVQb3J0LT5wb3J0UmVjdC5ib3R0b20gLSB0aGVQb3J0LT5wb3J0UmVjdC50b3A7Ci0JCQlzd2lkdGggPSBxZC5zY3JlZW5CaXRzLmJvdW5kcy5yaWdodCAtIHFkLnNjcmVlbkJpdHMuYm91bmRzLmxlZnQ7Ci0JCQlzaGVpZ2h0ID0gcWQuc2NyZWVuQml0cy5ib3VuZHMuYm90dG9tIC0gcWQuc2NyZWVuQml0cy5ib3VuZHMudG9wIC0gTE1HZXRNQmFySGVpZ2h0KCk7Ci0JCQl4cG9zID0gKHN3aWR0aC13aWR0aCkvMjsKLQkJCXlwb3MgPSAoc2hlaWdodC1oZWlnaHQpLzUgKyBMTUdldE1CYXJIZWlnaHQoKTsKLQkJCU1vdmVXaW5kb3codGhlV2luZG93LCB4cG9zLCB5cG9zLCAwKTsKLQkJCVNob3dXaW5kb3codGhlV2luZG93KTsKKyAgICAgICAgICAgIHdpZHRoID0gdGhlUG9ydC0+cG9ydFJlY3QucmlnaHQgLSB0aGVQb3J0LT5wb3J0UmVjdC5sZWZ0OworICAgICAgICAgICAgaGVpZ2h0ID0gdGhlUG9ydC0+cG9ydFJlY3QuYm90dG9tIC0gdGhlUG9ydC0+cG9ydFJlY3QudG9wOworICAgICAgICAgICAgc3dpZHRoID0gcWQuc2NyZWVuQml0cy5ib3VuZHMucmlnaHQgLSBxZC5zY3JlZW5CaXRzLmJvdW5kcy5sZWZ0OworICAgICAgICAgICAgc2hlaWdodCA9IHFkLnNjcmVlbkJpdHMuYm91bmRzLmJvdHRvbSAtIHFkLnNjcmVlbkJpdHMuYm91bmRzLnRvcCAtIExNR2V0TUJhckhlaWdodCgpOworICAgICAgICAgICAgeHBvcyA9IChzd2lkdGgtd2lkdGgpLzI7CisgICAgICAgICAgICB5cG9zID0gKHNoZWlnaHQtaGVpZ2h0KS81ICsgTE1HZXRNQmFySGVpZ2h0KCk7CisgICAgICAgICAgICBNb3ZlV2luZG93KHRoZVdpbmRvdywgeHBvcywgeXBvcywgMCk7CisgICAgICAgICAgICBTaG93V2luZG93KHRoZVdpbmRvdyk7CiAjZW5kaWYKLQkJCURyYXdEaWFsb2coY3VyZGlhbG9nKTsKLQkJfQotCX0KLQlpZiAob2xkZGlhbG9nKQotCQlEaXNwb3NlRGlhbG9nKG9sZGRpYWxvZyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgICAgICAgICAgRHJhd0RpYWxvZyhjdXJkaWFsb2cpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChvbGRkaWFsb2cpCisgICAgICAgIERpc3Bvc2VEaWFsb2cob2xkZGlhbG9nKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBjaGFyIERlYnVnU3RyX2RvY1tdID0gIlN3aXRjaCB0byBsb3ctbGV2ZWwgZGVidWdnZXIgd2l0aCBhIG1lc3NhZ2UiOwpAQCAtNTM3LDE1ICs1MzcsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBNYWNPU19EZWJ1Z1N0cihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JU3RyMjU1IG1lc3NhZ2U7Ci0JUHlPYmplY3QgKm9iamVjdCA9IDA7Ci0JCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJnxPIiwgUHlNYWNfR2V0U3RyMjU1LCBtZXNzYWdlLCAmb2JqZWN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JCi0JRGVidWdTdHIobWVzc2FnZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFN0cjI1NSBtZXNzYWdlOworICAgIFB5T2JqZWN0ICpvYmplY3QgPSAwOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJnxPIiwgUHlNYWNfR2V0U3RyMjU1LCBtZXNzYWdlLCAmb2JqZWN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBEZWJ1Z1N0cihtZXNzYWdlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIApAQCAtNTU0LDU5ICs1NTQsNTkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBNYWNPU19TeXNCZWVwKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgZHVyYXRpb24gPSA2OwotCQotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifGkiLCAmZHVyYXRpb24pKQotCQlyZXR1cm4gTlVMTDsKLQlTeXNCZWVwKGR1cmF0aW9uKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaW50IGR1cmF0aW9uID0gNjsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifGkiLCAmZHVyYXRpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTeXNCZWVwKGR1cmF0aW9uKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKICNlbmRpZiAvKiBfX0xQNjRfXyAqLwogCi1zdGF0aWMgY2hhciBXTUF2YWlsYWJsZV9kb2NbXSA9IAotCSJUcnVlIGlmIHRoaXMgcHJvY2VzcyBjYW4gaW50ZXJhY3Qgd2l0aCB0aGUgZGlzcGxheS4iCi0JIldpbGwgZm9yZWdyb3VuZCB0aGUgYXBwbGljYXRpb24gb24gdGhlIGZpcnN0IGNhbGwgYXMgYSBzaWRlLWVmZmVjdC4iCi0JOworc3RhdGljIGNoYXIgV01BdmFpbGFibGVfZG9jW10gPQorICAgICJUcnVlIGlmIHRoaXMgcHJvY2VzcyBjYW4gaW50ZXJhY3Qgd2l0aCB0aGUgZGlzcGxheS4iCisgICAgIldpbGwgZm9yZWdyb3VuZCB0aGUgYXBwbGljYXRpb24gb24gdGhlIGZpcnN0IGNhbGwgYXMgYSBzaWRlLWVmZmVjdC4iCisgICAgOwogCiBzdGF0aWMgUHlPYmplY3QgKgogTWFjT1NfV01BdmFpbGFibGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXN0YXRpYyBQeU9iamVjdCAqcnYgPSBOVUxMOwotCQotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCWlmICghcnYpIHsKLQkJUHJvY2Vzc1NlcmlhbE51bWJlciBwc247Ci0JCQotCQkvKgotCQkqKiBUaGlzIGlzIGEgZmFpcmx5IGlubm9jdW91cyBjYWxsIHRvIG1ha2UgaWYgd2UgZG9uJ3QgaGF2ZSBhIHdpbmRvdwotCQkqKiBtYW5hZ2VyLCBvciBpZiB3ZSBoYXZlIG5vIHBlcm1pc3Npb24gdG8gdGFsayB0byBpdC4gSXQgd2lsbCBwcmludAotCQkqKiBhIG1lc3NhZ2Ugb24gc3RkZXJyLCBidXQgYXQgbGVhc3QgaXQgd29uJ3QgYWJvcnQgdGhlIHByb2Nlc3MuCi0JCSoqIEl0IGFwcGVhcnMgdGhlIGZ1bmN0aW9uIGNhY2hlcyB0aGUgcmVzdWx0IGl0c2VsZiwgYW5kIGl0J3MgY2hlYXAsIHNvCi0JCSoqIG5vIG5lZWQgZm9yIHVzIHRvIGNhY2hlLgotCQkqLworICAgIHN0YXRpYyBQeU9iamVjdCAqcnYgPSBOVUxMOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFydikgeworICAgICAgICBQcm9jZXNzU2VyaWFsTnVtYmVyIHBzbjsKKworICAgICAgICAvKgorICAgICAgICAqKiBUaGlzIGlzIGEgZmFpcmx5IGlubm9jdW91cyBjYWxsIHRvIG1ha2UgaWYgd2UgZG9uJ3QgaGF2ZSBhIHdpbmRvdworICAgICAgICAqKiBtYW5hZ2VyLCBvciBpZiB3ZSBoYXZlIG5vIHBlcm1pc3Npb24gdG8gdGFsayB0byBpdC4gSXQgd2lsbCBwcmludAorICAgICAgICAqKiBhIG1lc3NhZ2Ugb24gc3RkZXJyLCBidXQgYXQgbGVhc3QgaXQgd29uJ3QgYWJvcnQgdGhlIHByb2Nlc3MuCisgICAgICAgICoqIEl0IGFwcGVhcnMgdGhlIGZ1bmN0aW9uIGNhY2hlcyB0aGUgcmVzdWx0IGl0c2VsZiwgYW5kIGl0J3MgY2hlYXAsIHNvCisgICAgICAgICoqIG5vIG5lZWQgZm9yIHVzIHRvIGNhY2hlLgorICAgICAgICAqLwogI2lmZGVmIGtDR051bGxEaXJlY3REaXNwbGF5Ci0JCS8qIE9uIDEwLjEgQ0dNYWluRGlzcGxheUlEKCkgaXNuJ3QgYXZhaWxhYmxlLCBhbmQKLQkJKioga0NHTnVsbERpcmVjdERpc3BsYXkgaXNuJ3QgZGVmaW5lZC4KLQkJKi8KLQkJaWYgKENHTWFpbkRpc3BsYXlJRCgpID09IDApIHsKLQkJCXJ2ID0gUHlfRmFsc2U7Ci0JCX0gZWxzZSB7CisgICAgICAgIC8qIE9uIDEwLjEgQ0dNYWluRGlzcGxheUlEKCkgaXNuJ3QgYXZhaWxhYmxlLCBhbmQKKyAgICAgICAgKioga0NHTnVsbERpcmVjdERpc3BsYXkgaXNuJ3QgZGVmaW5lZC4KKyAgICAgICAgKi8KKyAgICAgICAgaWYgKENHTWFpbkRpc3BsYXlJRCgpID09IDApIHsKKyAgICAgICAgICAgIHJ2ID0gUHlfRmFsc2U7CisgICAgICAgIH0gZWxzZSB7CiAjZWxzZQotCQl7CisgICAgICAgIHsKICNlbmRpZgotCQkJaWYgKEdldEN1cnJlbnRQcm9jZXNzKCZwc24pIDwgMCB8fAotCQkJCVNldEZyb250UHJvY2VzcygmcHNuKSA8IDApIHsKLQkJCQlydiA9IFB5X0ZhbHNlOwotCQkJfSBlbHNlIHsKLQkJCQlydiA9IFB5X1RydWU7Ci0JCQl9Ci0JCX0KLQl9Ci0JUHlfSU5DUkVGKHJ2KTsKLQlyZXR1cm4gcnY7CisgICAgICAgICAgICBpZiAoR2V0Q3VycmVudFByb2Nlc3MoJnBzbikgPCAwIHx8CisgICAgICAgICAgICAgICAgU2V0RnJvbnRQcm9jZXNzKCZwc24pIDwgMCkgeworICAgICAgICAgICAgICAgIHJ2ID0gUHlfRmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJ2ID0gUHlfVHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBQeV9JTkNSRUYocnYpOworICAgIHJldHVybiBydjsKIH0KIAogc3RhdGljIGNoYXIgR2V0VGlja3NfZG9jW10gPSAiUmV0dXJuIG51bWJlciBvZiB0aWNrcyBzaW5jZSBib290dXAiOwpAQCAtNjE0LDcgKzYxNCw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogTWFjT1NfR2V0VGlja3MoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJpIiwgKGludClUaWNrQ291bnQoKSk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLCAoaW50KVRpY2tDb3VudCgpKTsKIH0KIAogc3RhdGljIGNoYXIgb3BlbnJmX2RvY1tdID0gIk9wZW4gcmVzb3VyY2UgZm9yayBvZiBhIGZpbGUiOwpAQCAtNjIyLDEwMCArNjIyLDEwMCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIE1hY09TX29wZW5yZihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JT1NFcnIgZXJyOwotCWNoYXIgKm1vZGUgPSAiciI7Ci0JRlNSZWYgcmVmOwotCVNJbnQ4IHBlcm1pc3Npb24gPSBmc1JkUGVybTsKLQlyZm9iamVjdCAqZnA7Ci0JSEZTVW5pU3RyMjU1IG5hbWU7Ci0JCQotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyZ8cyIsIFB5TWFjX0dldEZTUmVmLCAmcmVmLCAmbW9kZSkpCi0JCXJldHVybiBOVUxMOwotCXdoaWxlICgqbW9kZSkgewotCQlzd2l0Y2ggKCptb2RlKyspIHsKLQkJY2FzZSAnKic6IGJyZWFrOwotCQljYXNlICdyJzogcGVybWlzc2lvbiA9IGZzUmRQZXJtOyBicmVhazsKLQkJY2FzZSAndyc6IHBlcm1pc3Npb24gPSBmc1dyUGVybTsgYnJlYWs7Ci0JCWNhc2UgJ2InOiBicmVhazsKLQkJZGVmYXVsdDoKLQkJCVB5RXJyX0JhZEFyZ3VtZW50KCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KKyAgICBPU0VyciBlcnI7CisgICAgY2hhciAqbW9kZSA9ICJyIjsKKyAgICBGU1JlZiByZWY7CisgICAgU0ludDggcGVybWlzc2lvbiA9IGZzUmRQZXJtOworICAgIHJmb2JqZWN0ICpmcDsKKyAgICBIRlNVbmlTdHIyNTUgbmFtZTsKIAotCWVyciA9IEZTR2V0UmVzb3VyY2VGb3JrTmFtZSgmbmFtZSk7Ci0JaWYgKGVyciAhPSBub0VycikgewotCQlQeU1hY19FcnJvcihlcnIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JCi0JaWYgKCAoZnAgPSBuZXdyZm9iamVjdCgpKSA9PSBOVUxMICkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJnxzIiwgUHlNYWNfR2V0RlNSZWYsICZyZWYsICZtb2RlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgd2hpbGUgKCptb2RlKSB7CisgICAgICAgIHN3aXRjaCAoKm1vZGUrKykgeworICAgICAgICBjYXNlICcqJzogYnJlYWs7CisgICAgICAgIGNhc2UgJ3InOiBwZXJtaXNzaW9uID0gZnNSZFBlcm07IGJyZWFrOworICAgICAgICBjYXNlICd3JzogcGVybWlzc2lvbiA9IGZzV3JQZXJtOyBicmVhazsKKyAgICAgICAgY2FzZSAnYic6IGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgUHlFcnJfQmFkQXJndW1lbnQoKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQogCi0JCi0JZXJyID0gRlNPcGVuRm9yaygmcmVmLCBuYW1lLmxlbmd0aCwgbmFtZS51bmljb2RlLCBwZXJtaXNzaW9uLCAmZnAtPmZSZWZOdW0pOwotCWlmIChlcnIgIT0gbm9FcnIpIHsKLQkJUHlfREVDUkVGKGZwKTsKLQkJUHlNYWNfRXJyb3IoZXJyKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWZwLT5pc2Nsb3NlZCA9IDA7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWZwOworICAgIGVyciA9IEZTR2V0UmVzb3VyY2VGb3JrTmFtZSgmbmFtZSk7CisgICAgaWYgKGVyciAhPSBub0VycikgeworICAgICAgICBQeU1hY19FcnJvcihlcnIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoIChmcCA9IG5ld3Jmb2JqZWN0KCkpID09IE5VTEwgKQorICAgICAgICByZXR1cm4gTlVMTDsKKworCisgICAgZXJyID0gRlNPcGVuRm9yaygmcmVmLCBuYW1lLmxlbmd0aCwgbmFtZS51bmljb2RlLCBwZXJtaXNzaW9uLCAmZnAtPmZSZWZOdW0pOworICAgIGlmIChlcnIgIT0gbm9FcnIpIHsKKyAgICAgICAgUHlfREVDUkVGKGZwKTsKKyAgICAgICAgUHlNYWNfRXJyb3IoZXJyKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGZwLT5pc2Nsb3NlZCA9IDA7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWZwOwogfQogCiAKIAogc3RhdGljIFB5TWV0aG9kRGVmIE1hY09TX01ldGhvZHNbXSA9IHsKLQl7IkdldENyZWF0b3JBbmRUeXBlIiwJCU1hY09TX0dldENyZWF0b3JBbmRUeXBlLCAxLAlnZXRjcnRwX2RvY30sCi0JeyJTZXRDcmVhdG9yQW5kVHlwZSIsCQlNYWNPU19TZXRDcmVhdG9yQW5kVHlwZSwgMSwJc2V0Y3J0cF9kb2N9LAotCXsiR2V0RXJyb3JTdHJpbmciLAkJTWFjT1NfR2V0RXJyb3JTdHJpbmcsCTEsCWdldGVycl9kb2N9LAotCXsib3BlbnJmIiwJCQlNYWNPU19vcGVucmYsIAkJMSwgCW9wZW5yZl9kb2N9LAorICAgIHsiR2V0Q3JlYXRvckFuZFR5cGUiLCAgICAgICAgICAgICAgIE1hY09TX0dldENyZWF0b3JBbmRUeXBlLCAxLCAgICAgZ2V0Y3J0cF9kb2N9LAorICAgIHsiU2V0Q3JlYXRvckFuZFR5cGUiLCAgICAgICAgICAgICAgIE1hY09TX1NldENyZWF0b3JBbmRUeXBlLCAxLCAgICAgc2V0Y3J0cF9kb2N9LAorICAgIHsiR2V0RXJyb3JTdHJpbmciLCAgICAgICAgICAgICAgICAgIE1hY09TX0dldEVycm9yU3RyaW5nLCAgIDEsICAgICAgZ2V0ZXJyX2RvY30sCisgICAgeyJvcGVucmYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjT1Nfb3BlbnJmLCAgICAgICAgICAgMSwgICAgICBvcGVucmZfZG9jfSwKICNpZm5kZWYgX19MUDY0X18KLQl7InNwbGFzaCIsCQkJTWFjT1Nfc3BsYXNoLAkJMSwgCXNwbGFzaF9kb2N9LAotCXsiRGVidWdTdHIiLAkJCU1hY09TX0RlYnVnU3RyLAkJMSwJRGVidWdTdHJfZG9jfSwKLQl7IlN5c0JlZXAiLAkJCU1hY09TX1N5c0JlZXAsCQkxLAlTeXNCZWVwX2RvY30sCisgICAgeyJzcGxhc2giLCAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjT1Nfc3BsYXNoLCAgICAgICAgICAgMSwgICAgICBzcGxhc2hfZG9jfSwKKyAgICB7IkRlYnVnU3RyIiwgICAgICAgICAgICAgICAgICAgICAgICBNYWNPU19EZWJ1Z1N0ciwgICAgICAgICAxLCAgICAgIERlYnVnU3RyX2RvY30sCisgICAgeyJTeXNCZWVwIiwgICAgICAgICAgICAgICAgICAgICAgICAgTWFjT1NfU3lzQmVlcCwgICAgICAgICAgMSwgICAgICBTeXNCZWVwX2RvY30sCiAjZW5kaWYgLyogX19MUDY0X18gKi8KLQl7IkdldFRpY2tzIiwJCQlNYWNPU19HZXRUaWNrcywJCTEsCUdldFRpY2tzX2RvY30sCi0JeyJXTUF2YWlsYWJsZSIsCQkJTWFjT1NfV01BdmFpbGFibGUsCQkxLAlXTUF2YWlsYWJsZV9kb2N9LAotCXtOVUxMLAkJCQlOVUxMfQkJIC8qIFNlbnRpbmVsICovCisgICAgeyJHZXRUaWNrcyIsICAgICAgICAgICAgICAgICAgICAgICAgTWFjT1NfR2V0VGlja3MsICAgICAgICAgMSwgICAgICBHZXRUaWNrc19kb2N9LAorICAgIHsiV01BdmFpbGFibGUiLCAgICAgICAgICAgICAgICAgICAgIE1hY09TX1dNQXZhaWxhYmxlLCAgICAgICAgICAgICAgMSwgICAgICBXTUF2YWlsYWJsZV9kb2N9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAgLyogU2VudGluZWwgKi8KIH07CiAKIAogdm9pZAogaW5pdE1hY09TKHZvaWQpCiB7Ci0JUHlPYmplY3QgKm0sICpkOwotCQotCWlmIChQeUVycl9XYXJuUHkzaygiSW4gMy54LCBNYWNPUyBpcyByZW1vdmVkLiIsIDEpKQotCQlyZXR1cm47Ci0JCi0JbSA9IFB5X0luaXRNb2R1bGUoIk1hY09TIiwgTWFjT1NfTWV0aG9kcyk7Ci0JZCA9IFB5TW9kdWxlX0dldERpY3QobSk7Ci0JCi0JLyogSW5pdGlhbGl6ZSBNYWNPUy5FcnJvciBleGNlcHRpb24gKi8KLQlNYWNPU19FcnJvciA9IFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCk7Ci0JaWYgKE1hY09TX0Vycm9yID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVycm9yIiwgTWFjT1NfRXJyb3IpICE9IDApCi0JCXJldHVybjsKLQlSZnR5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKLQlQeV9JTkNSRUYoJlJmdHlwZSk7Ci0JaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSZXNvdXJjZUZvcmtUeXBlIiwgKFB5T2JqZWN0ICopJlJmdHlwZSkgIT0gMCkKLQkJcmV0dXJuOwotCS8qCi0JKiogVGhpcyBpcyBhIGhhY2s6IHRoZSBmb2xsb3dpbmcgY29uc3RhbnQgYWRkZWQgdG8gdGhlIGlkKCkgb2YgYSBzdHJpbmcKLQkqKiBvYmplY3QgZ2l2ZXMgeW91IHRoZSBhZGRyZXNzIG9mIHRoZSBkYXRhLiBVbmZvcnR1bmF0ZWx5LCBpdCBpcyBuZWVkZWQgZm9yCi0JKiogc29tZSBvZiB0aGUgaW1hZ2UgYW5kIHNvdW5kIHByb2Nlc3NpbmcgaW50ZXJmYWNlcyBvbiB0aGUgbWFjOi0oCi0JKi8KLQl7Ci0JCVB5U3RyaW5nT2JqZWN0ICpwID0gMDsKLQkJbG9uZyBvZmYgPSAobG9uZykmKHAtPm9iX3N2YWxbMF0pOwotCQkKLQkJaWYoIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJzdHJpbmdfaWRfdG9fYnVmZmVyIiwgUHlfQnVpbGRWYWx1ZSgiaSIsIG9mZikpICE9IDApCi0JCQlyZXR1cm47Ci0JfQorICAgIFB5T2JqZWN0ICptLCAqZDsKKworICAgIGlmIChQeUVycl9XYXJuUHkzaygiSW4gMy54LCBNYWNPUyBpcyByZW1vdmVkLiIsIDEpKQorICAgICAgICByZXR1cm47CisKKyAgICBtID0gUHlfSW5pdE1vZHVsZSgiTWFjT1MiLCBNYWNPU19NZXRob2RzKTsKKyAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKworICAgIC8qIEluaXRpYWxpemUgTWFjT1MuRXJyb3IgZXhjZXB0aW9uICovCisgICAgTWFjT1NfRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOworICAgIGlmIChNYWNPU19FcnJvciA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFcnJvciIsIE1hY09TX0Vycm9yKSAhPSAwKQorICAgICAgICByZXR1cm47CisgICAgUmZ0eXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7CisgICAgUHlfSU5DUkVGKCZSZnR5cGUpOworICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUmVzb3VyY2VGb3JrVHlwZSIsIChQeU9iamVjdCAqKSZSZnR5cGUpICE9IDApCisgICAgICAgIHJldHVybjsKKyAgICAvKgorICAgICoqIFRoaXMgaXMgYSBoYWNrOiB0aGUgZm9sbG93aW5nIGNvbnN0YW50IGFkZGVkIHRvIHRoZSBpZCgpIG9mIGEgc3RyaW5nCisgICAgKiogb2JqZWN0IGdpdmVzIHlvdSB0aGUgYWRkcmVzcyBvZiB0aGUgZGF0YS4gVW5mb3J0dW5hdGVseSwgaXQgaXMgbmVlZGVkIGZvcgorICAgICoqIHNvbWUgb2YgdGhlIGltYWdlIGFuZCBzb3VuZCBwcm9jZXNzaW5nIGludGVyZmFjZXMgb24gdGhlIG1hYzotKAorICAgICovCisgICAgeworICAgICAgICBQeVN0cmluZ09iamVjdCAqcCA9IDA7CisgICAgICAgIGxvbmcgb2ZmID0gKGxvbmcpJihwLT5vYl9zdmFsWzBdKTsKKworICAgICAgICBpZiggUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgInN0cmluZ19pZF90b19idWZmZXIiLCBQeV9CdWlsZFZhbHVlKCJpIiwgb2ZmKSkgIT0gMCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICB9CiAjZGVmaW5lIFBZX1JVTlRJTUVNT0RFTCAibWFjaG8iCi0JaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJydW50aW1lbW9kZWwiLCAKLQkJCQlQeV9CdWlsZFZhbHVlKCJzIiwgUFlfUlVOVElNRU1PREVMKSkgIT0gMCkKLQkJcmV0dXJuOworICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAicnVudGltZW1vZGVsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9CdWlsZFZhbHVlKCJzIiwgUFlfUlVOVElNRU1PREVMKSkgIT0gMCkKKyAgICAgICAgcmV0dXJuOwogI2lmIGRlZmluZWQoV0lUSF9ORVhUX0ZSQU1FV09SSykKICNkZWZpbmUgUFlfTElOS01PREVMICJmcmFtZXdvcmsiCiAjZWxpZiBkZWZpbmVkKFB5X0VOQUJMRV9TSEFSRUQpCkBAIC03MjMsOCArNzIzLDggQEAKICNlbHNlCiAjZGVmaW5lIFBZX0xJTktNT0RFTCAic3RhdGljIgogI2VuZGlmCi0JaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJsaW5rbW9kZWwiLCAKLQkJCQlQeV9CdWlsZFZhbHVlKCJzIiwgUFlfTElOS01PREVMKSkgIT0gMCkKLQkJcmV0dXJuOworICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAibGlua21vZGVsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9CdWlsZFZhbHVlKCJzIiwgUFlfTElOS01PREVMKSkgIT0gMCkKKyAgICAgICAgcmV0dXJuOwogCiB9CmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9OYXYuYyBiL01hYy9Nb2R1bGVzL05hdi5jCmluZGV4IDFjMTc3NzYuLmJkMTUzY2YgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL05hdi5jCisrKyBiL01hYy9Nb2R1bGVzL05hdi5jCkBAIC00NCwxNzIgKzQ0LDE3MiBAQAogLyogQ2FsbGJhY2sgZnVuY3Rpb25zICovCiBzdGF0aWMgcGFzY2FsIHZvaWQKIG15X2V2ZW50UHJvYyhOYXZFdmVudENhbGxiYWNrTWVzc2FnZSBjYWxsQmFja1NlbGVjdG9yLAotCQkJIE5hdkNCUmVjUHRyIGNhbGxCYWNrUGFybXMsCi0JCQkgTmF2Q2FsbEJhY2tVc2VyRGF0YSBjYWxsYmFja1VEKQorICAgICAgICAgICAgICAgICAgICAgICAgIE5hdkNCUmVjUHRyIGNhbGxCYWNrUGFybXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgTmF2Q2FsbEJhY2tVc2VyRGF0YSBjYWxsYmFja1VEKQogewotCVB5T2JqZWN0ICpkaWN0ID0gKFB5T2JqZWN0ICopY2FsbGJhY2tVRDsKLQlQeU9iamVjdCAqcHlmdW5jOwotCVB5T2JqZWN0ICpydjsKLQkKLQlpZiAoIWRpY3QpIHJldHVybjsKLQlpZiAoIChweWZ1bmMgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhkaWN0LCAiZXZlbnRQcm9jIikpID09IE5VTEwgKSB7Ci0JCVB5RXJyX1ByaW50KCk7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKCBweWZ1bmMgPT0gUHlfTm9uZSApIHsKLQkJcmV0dXJuOwotCX0KLQlydiA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihweWZ1bmMsICJscyMiLCAobG9uZyljYWxsQmFja1NlbGVjdG9yLAotCQkJKHZvaWQgKiljYWxsQmFja1Bhcm1zLCBzaXplb2YoTmF2Q0JSZWMpKTsKLQlpZiAoIHJ2ICkKLQkJUHlfREVDUkVGKHJ2KTsKLQllbHNlIHsKLQkJUHlTeXNfV3JpdGVTdGRlcnIoIk5hdjogZXhjZXB0aW9uIGluIGV2ZW50UHJvYyBjYWxsYmFja1xuIik7Ci0JCVB5RXJyX1ByaW50KCk7Ci0JfQorICAgIFB5T2JqZWN0ICpkaWN0ID0gKFB5T2JqZWN0ICopY2FsbGJhY2tVRDsKKyAgICBQeU9iamVjdCAqcHlmdW5jOworICAgIFB5T2JqZWN0ICpydjsKKworICAgIGlmICghZGljdCkgcmV0dXJuOworICAgIGlmICggKHB5ZnVuYyA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKGRpY3QsICJldmVudFByb2MiKSkgPT0gTlVMTCApIHsKKyAgICAgICAgUHlFcnJfUHJpbnQoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoIHB5ZnVuYyA9PSBQeV9Ob25lICkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHJ2ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKHB5ZnVuYywgImxzIyIsIChsb25nKWNhbGxCYWNrU2VsZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICh2b2lkICopY2FsbEJhY2tQYXJtcywgc2l6ZW9mKE5hdkNCUmVjKSk7CisgICAgaWYgKCBydiApCisgICAgICAgIFB5X0RFQ1JFRihydik7CisgICAgZWxzZSB7CisgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCJOYXY6IGV4Y2VwdGlvbiBpbiBldmVudFByb2MgY2FsbGJhY2tcbiIpOworICAgICAgICBQeUVycl9QcmludCgpOworICAgIH0KIH0KIAogc3RhdGljIHBhc2NhbCBCb29sZWFuCiBteV9wcmV2aWV3UHJvYyhOYXZDQlJlY1B0ciBjYWxsQmFja1Bhcm1zLAotCQkJICAgTmF2Q2FsbEJhY2tVc2VyRGF0YSBjYWxsYmFja1VEKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgTmF2Q2FsbEJhY2tVc2VyRGF0YSBjYWxsYmFja1VEKQogewotCVB5T2JqZWN0ICpkaWN0ID0gKFB5T2JqZWN0ICopY2FsbGJhY2tVRDsKLQlQeU9iamVjdCAqcHlmdW5jOwotCVB5T2JqZWN0ICpydjsKLQlCb29sZWFuIGNfcnYgPSBmYWxzZTsKLQkKLQlpZiAoIWRpY3QpIHJldHVybiBmYWxzZTsKLQlpZiAoIChweWZ1bmMgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhkaWN0LCAicHJldmlld1Byb2MiKSkgPT0gTlVMTCApIHsKLQkJUHlFcnJfUHJpbnQoKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQlydiA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihweWZ1bmMsICJzIyIsICh2b2lkICopY2FsbEJhY2tQYXJtcywgc2l6ZW9mKE5hdkNCUmVjKSk7Ci0JaWYgKCBydiApIHsKLQkJY19ydiA9IFB5T2JqZWN0X0lzVHJ1ZShydik7Ci0JCVB5X0RFQ1JFRihydik7Ci0JfSBlbHNlIHsKLQkJUHlTeXNfV3JpdGVTdGRlcnIoIk5hdjogZXhjZXB0aW9uIGluIHByZXZpZXdQcm9jIGNhbGxiYWNrXG4iKTsKLQkJUHlFcnJfUHJpbnQoKTsKLQl9Ci0JcmV0dXJuIGNfcnY7CisgICAgUHlPYmplY3QgKmRpY3QgPSAoUHlPYmplY3QgKiljYWxsYmFja1VEOworICAgIFB5T2JqZWN0ICpweWZ1bmM7CisgICAgUHlPYmplY3QgKnJ2OworICAgIEJvb2xlYW4gY19ydiA9IGZhbHNlOworCisgICAgaWYgKCFkaWN0KSByZXR1cm4gZmFsc2U7CisgICAgaWYgKCAocHlmdW5jID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoZGljdCwgInByZXZpZXdQcm9jIikpID09IE5VTEwgKSB7CisgICAgICAgIFB5RXJyX1ByaW50KCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcnYgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24ocHlmdW5jLCAicyMiLCAodm9pZCAqKWNhbGxCYWNrUGFybXMsIHNpemVvZihOYXZDQlJlYykpOworICAgIGlmICggcnYgKSB7CisgICAgICAgIGNfcnYgPSBQeU9iamVjdF9Jc1RydWUocnYpOworICAgICAgICBQeV9ERUNSRUYocnYpOworICAgIH0gZWxzZSB7CisgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCJOYXY6IGV4Y2VwdGlvbiBpbiBwcmV2aWV3UHJvYyBjYWxsYmFja1xuIik7CisgICAgICAgIFB5RXJyX1ByaW50KCk7CisgICAgfQorICAgIHJldHVybiBjX3J2OwogfQogCiBzdGF0aWMgcGFzY2FsIEJvb2xlYW4KIG15X2ZpbHRlclByb2MoQUVEZXNjICp0aGVJdGVtLCB2b2lkICppbmZvLAotCQkJICBOYXZDYWxsQmFja1VzZXJEYXRhIGNhbGxiYWNrVUQsCi0JCQkgIE5hdkZpbHRlck1vZGVzIGZpbHRlck1vZGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgIE5hdkNhbGxCYWNrVXNlckRhdGEgY2FsbGJhY2tVRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTmF2RmlsdGVyTW9kZXMgZmlsdGVyTW9kZSkKIHsKLQlQeU9iamVjdCAqZGljdCA9IChQeU9iamVjdCAqKWNhbGxiYWNrVUQ7Ci0JUHlPYmplY3QgKnB5ZnVuYzsKLQlQeU9iamVjdCAqcnY7Ci0JQm9vbGVhbiBjX3J2ID0gZmFsc2U7Ci0JCi0JaWYgKCFkaWN0KSByZXR1cm4gZmFsc2U7Ci0JaWYgKCAocHlmdW5jID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoZGljdCwgImZpbHRlclByb2MiKSkgPT0gTlVMTCApIHsKLQkJUHlFcnJfUHJpbnQoKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQlydiA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihweWZ1bmMsICJPJnMjaCIsCi0JCUFFRGVzY19OZXdCb3Jyb3dlZCwgdGhlSXRlbSwgaW5mbywgc2l6ZW9mKE5hdkZpbGVPckZvbGRlckluZm8pLCAoc2hvcnQpZmlsdGVyTW9kZSk7Ci0JaWYgKCBydiApIHsKLQkJY19ydiA9IFB5T2JqZWN0X0lzVHJ1ZShydik7Ci0JCVB5X0RFQ1JFRihydik7Ci0JfSBlbHNlIHsKLQkJUHlTeXNfV3JpdGVTdGRlcnIoIk5hdjogZXhjZXB0aW9uIGluIGZpbHRlclByb2MgY2FsbGJhY2tcbiIpOwotCQlQeUVycl9QcmludCgpOwotCX0KLQlyZXR1cm4gY19ydjsKKyAgICBQeU9iamVjdCAqZGljdCA9IChQeU9iamVjdCAqKWNhbGxiYWNrVUQ7CisgICAgUHlPYmplY3QgKnB5ZnVuYzsKKyAgICBQeU9iamVjdCAqcnY7CisgICAgQm9vbGVhbiBjX3J2ID0gZmFsc2U7CisKKyAgICBpZiAoIWRpY3QpIHJldHVybiBmYWxzZTsKKyAgICBpZiAoIChweWZ1bmMgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhkaWN0LCAiZmlsdGVyUHJvYyIpKSA9PSBOVUxMICkgeworICAgICAgICBQeUVycl9QcmludCgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJ2ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKHB5ZnVuYywgIk8mcyNoIiwKKyAgICAgICAgQUVEZXNjX05ld0JvcnJvd2VkLCB0aGVJdGVtLCBpbmZvLCBzaXplb2YoTmF2RmlsZU9yRm9sZGVySW5mbyksIChzaG9ydClmaWx0ZXJNb2RlKTsKKyAgICBpZiAoIHJ2ICkgeworICAgICAgICBjX3J2ID0gUHlPYmplY3RfSXNUcnVlKHJ2KTsKKyAgICAgICAgUHlfREVDUkVGKHJ2KTsKKyAgICB9IGVsc2UgeworICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigiTmF2OiBleGNlcHRpb24gaW4gZmlsdGVyUHJvYyBjYWxsYmFja1xuIik7CisgICAgICAgIFB5RXJyX1ByaW50KCk7CisgICAgfQorICAgIHJldHVybiBjX3J2OwogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogc3RhdGljIGludAogZmlsbGRpYWxvZ29wdGlvbnMoUHlPYmplY3QgKmQsCi0JCUFFRGVzYyAqKmRlZmF1bHRMb2NhdGlvblAsCi0JCU5hdkRpYWxvZ09wdGlvbnMgKm9wdCwKLQkJTmF2RXZlbnRVUFAgKmV2ZW50UHJvY1AsCi0JCU5hdlByZXZpZXdVUFAgKnByZXZpZXdQcm9jUCwKLQkJTmF2T2JqZWN0RmlsdGVyVVBQICpmaWx0ZXJQcm9jUCwKLQkJTmF2VHlwZUxpc3RIYW5kbGUgKnR5cGVMaXN0UCwKLQkJT1NUeXBlICpmaWxlVHlwZVAsCi0JCU9TVHlwZSAqZmlsZUNyZWF0b3JQKQorICAgICAgICAgICAgICAgIEFFRGVzYyAqKmRlZmF1bHRMb2NhdGlvblAsCisgICAgICAgICAgICAgICAgTmF2RGlhbG9nT3B0aW9ucyAqb3B0LAorICAgICAgICAgICAgICAgIE5hdkV2ZW50VVBQICpldmVudFByb2NQLAorICAgICAgICAgICAgICAgIE5hdlByZXZpZXdVUFAgKnByZXZpZXdQcm9jUCwKKyAgICAgICAgICAgICAgICBOYXZPYmplY3RGaWx0ZXJVUFAgKmZpbHRlclByb2NQLAorICAgICAgICAgICAgICAgIE5hdlR5cGVMaXN0SGFuZGxlICp0eXBlTGlzdFAsCisgICAgICAgICAgICAgICAgT1NUeXBlICpmaWxlVHlwZVAsCisgICAgICAgICAgICAgICAgT1NUeXBlICpmaWxlQ3JlYXRvclApCiB7Ci0JUHlfc3NpemVfdCBwb3MgPSAwOwotCVB5T2JqZWN0ICprZXksICp2YWx1ZTsKLQljaGFyICprZXlzdHI7Ci0JQUVEZXNjICpkZWZhdWx0TG9jYXRpb25fc3RvcmFnZTsKLQkKLQlOYXZHZXREZWZhdWx0RGlhbG9nT3B0aW9ucyhvcHQpOworICAgIFB5X3NzaXplX3QgcG9zID0gMDsKKyAgICBQeU9iamVjdCAqa2V5LCAqdmFsdWU7CisgICAgY2hhciAqa2V5c3RyOworICAgIEFFRGVzYyAqZGVmYXVsdExvY2F0aW9uX3N0b3JhZ2U7CiAKLQl3aGlsZSAoIFB5RGljdF9OZXh0KGQsICZwb3MsICZrZXksICZ2YWx1ZSkgKSB7Ci0JCWlmICggIWtleSB8fCAhdmFsdWUgfHwgIVB5U3RyaW5nX0NoZWNrKGtleSkgKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoRXJyb3JPYmplY3QsICJEaWFsb2dPcHRpb24gaGFzIG5vbi1zdHJpbmcga2V5Iik7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlrZXlzdHIgPSBQeVN0cmluZ19Bc1N0cmluZyhrZXkpOwotCQlpZiggc3RyY21wKGtleXN0ciwgImRlZmF1bHRMb2NhdGlvbiIpID09IDAgKSB7Ci0JCQlpZiAoIChkZWZhdWx0TG9jYXRpb25fc3RvcmFnZSA9IFB5TWVtX05FVyhBRURlc2MsIDEpKSA9PSBOVUxMICkgewotCQkJCVB5RXJyX05vTWVtb3J5KCk7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQlpZiAoICFQeUFyZ19QYXJzZSh2YWx1ZSwgIk8mIiwgQUVEZXNjX0NvbnZlcnQsIGRlZmF1bHRMb2NhdGlvbl9zdG9yYWdlKSApIHsKLQkJCQlQeU1lbV9ERUwoZGVmYXVsdExvY2F0aW9uX3N0b3JhZ2UpOwotCQkJCXJldHVybiAwOwotCQkJfQotCQkJKmRlZmF1bHRMb2NhdGlvblAgPSBkZWZhdWx0TG9jYXRpb25fc3RvcmFnZTsKLQkJfSBlbHNlIGlmKCBzdHJjbXAoa2V5c3RyLCAidmVyc2lvbiIpID09IDAgKSB7Ci0JCQlpZiAoICFQeUFyZ19QYXJzZSh2YWx1ZSwgIkgiLCAmb3B0LT52ZXJzaW9uKSApCi0JCQkJcmV0dXJuIDA7Ci0JCX0gZWxzZSBpZiggc3RyY21wKGtleXN0ciwgImRpYWxvZ09wdGlvbkZsYWdzIikgPT0gMCApIHsKLQkJCWlmICggIVB5QXJnX1BhcnNlKHZhbHVlLCAiayIsICZvcHQtPmRpYWxvZ09wdGlvbkZsYWdzKSApCi0JCQkJcmV0dXJuIDA7Ci0JCX0gZWxzZSBpZiggc3RyY21wKGtleXN0ciwgImxvY2F0aW9uIikgPT0gMCApIHsKLQkJCWlmICggIVB5QXJnX1BhcnNlKHZhbHVlLCAiTyYiLCBQeU1hY19HZXRQb2ludCwgJm9wdC0+bG9jYXRpb24pICkKLQkJCQlyZXR1cm4gMDsKLQkJfSBlbHNlIGlmKCBzdHJjbXAoa2V5c3RyLCAiY2xpZW50TmFtZSIpID09IDAgKSB7Ci0JCQlpZiAoICFQeUFyZ19QYXJzZSh2YWx1ZSwgIk8mIiwgUHlNYWNfR2V0U3RyMjU1LCAmb3B0LT5jbGllbnROYW1lKSApCi0JCQkJcmV0dXJuIDA7Ci0JCX0gZWxzZSBpZiggc3RyY21wKGtleXN0ciwgIndpbmRvd1RpdGxlIikgPT0gMCApIHsKLQkJCWlmICggIVB5QXJnX1BhcnNlKHZhbHVlLCAiTyYiLCBQeU1hY19HZXRTdHIyNTUsICZvcHQtPndpbmRvd1RpdGxlKSApCi0JCQkJcmV0dXJuIDA7Ci0JCX0gZWxzZSBpZiggc3RyY21wKGtleXN0ciwgImFjdGlvbkJ1dHRvbkxhYmVsIikgPT0gMCApIHsKLQkJCWlmICggIVB5QXJnX1BhcnNlKHZhbHVlLCAiTyYiLCBQeU1hY19HZXRTdHIyNTUsICZvcHQtPmFjdGlvbkJ1dHRvbkxhYmVsKSApCi0JCQkJcmV0dXJuIDA7Ci0JCX0gZWxzZSBpZiggc3RyY21wKGtleXN0ciwgImNhbmNlbEJ1dHRvbkxhYmVsIikgPT0gMCApIHsKLQkJCWlmICggIVB5QXJnX1BhcnNlKHZhbHVlLCAiTyYiLCBQeU1hY19HZXRTdHIyNTUsICZvcHQtPmNhbmNlbEJ1dHRvbkxhYmVsKSApCi0JCQkJcmV0dXJuIDA7Ci0JCX0gZWxzZSBpZiggc3RyY21wKGtleXN0ciwgInNhdmVkRmlsZU5hbWUiKSA9PSAwICkgewotCQkJaWYgKCAhUHlBcmdfUGFyc2UodmFsdWUsICJPJiIsIFB5TWFjX0dldFN0cjI1NSwgJm9wdC0+c2F2ZWRGaWxlTmFtZSkgKQotCQkJCXJldHVybiAwOwotCQl9IGVsc2UgaWYoIHN0cmNtcChrZXlzdHIsICJtZXNzYWdlIikgPT0gMCApIHsKLQkJCWlmICggIVB5QXJnX1BhcnNlKHZhbHVlLCAiTyYiLCBQeU1hY19HZXRTdHIyNTUsICZvcHQtPm1lc3NhZ2UpICkKLQkJCQlyZXR1cm4gMDsKLQkJfSBlbHNlIGlmKCBzdHJjbXAoa2V5c3RyLCAicHJlZmVyZW5jZUtleSIpID09IDAgKSB7Ci0JCQlpZiAoICFQeUFyZ19QYXJzZSh2YWx1ZSwgIk8mIiwgUHlNYWNfR2V0T1NUeXBlLCAmb3B0LT5wcmVmZXJlbmNlS2V5KSApCi0JCQkJcmV0dXJuIDA7Ci0JCX0gZWxzZSBpZiggc3RyY21wKGtleXN0ciwgInBvcHVwRXh0ZW5zaW9uIikgPT0gMCApIHsKLQkJCWlmICggIVB5QXJnX1BhcnNlKHZhbHVlLCAiTyYiLCBSZXNPYmpfQ29udmVydCwgJm9wdC0+cG9wdXBFeHRlbnNpb24pICkKLQkJCQlyZXR1cm4gMDsKLQkJfSBlbHNlIGlmKCBldmVudFByb2NQICYmIHN0cmNtcChrZXlzdHIsICJldmVudFByb2MiKSA9PSAwICkgewotCQkJKmV2ZW50UHJvY1AgPSBteV9ldmVudFByb2NVUFA7Ci0JCX0gZWxzZSBpZiggcHJldmlld1Byb2NQICYmIHN0cmNtcChrZXlzdHIsICJwcmV2aWV3UHJvYyIpID09IDAgKSB7Ci0JCQkqcHJldmlld1Byb2NQID0gbXlfcHJldmlld1Byb2NVUFA7Ci0JCX0gZWxzZSBpZiggZmlsdGVyUHJvY1AgJiYgc3RyY21wKGtleXN0ciwgImZpbHRlclByb2MiKSA9PSAwICkgewotCQkJKmZpbHRlclByb2NQID0gbXlfZmlsdGVyUHJvY1VQUDsKLQkJfSBlbHNlIGlmKCB0eXBlTGlzdFAgJiYgc3RyY21wKGtleXN0ciwgInR5cGVMaXN0IikgPT0gMCApIHsKLQkJCWlmICggIVB5QXJnX1BhcnNlKHZhbHVlLCAiTyYiLCBSZXNPYmpfQ29udmVydCwgdHlwZUxpc3RQKSApCi0JCQkJcmV0dXJuIDA7Ci0JCX0gZWxzZSBpZiggZmlsZVR5cGVQICYmIHN0cmNtcChrZXlzdHIsICJmaWxlVHlwZSIpID09IDAgKSB7Ci0JCQlpZiAoICFQeUFyZ19QYXJzZSh2YWx1ZSwgIk8mIiwgUHlNYWNfR2V0T1NUeXBlLCBmaWxlVHlwZVApICkKLQkJCQlyZXR1cm4gMDsKLQkJfSBlbHNlIGlmKCBmaWxlQ3JlYXRvclAgJiYgc3RyY21wKGtleXN0ciwgImZpbGVDcmVhdG9yIikgPT0gMCApIHsKLQkJCWlmICggIVB5QXJnX1BhcnNlKHZhbHVlLCAiTyYiLCBQeU1hY19HZXRPU1R5cGUsIGZpbGVDcmVhdG9yUCkgKQotCQkJCXJldHVybiAwOwotCQl9IGVsc2UgewotCQkJUHlFcnJfRm9ybWF0KEVycm9yT2JqZWN0LCAiVW5rbm93biBEaWFsb2dPcHRpb24ga2V5OiAlcyIsIGtleXN0cik7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQlyZXR1cm4gMTsKKyAgICBOYXZHZXREZWZhdWx0RGlhbG9nT3B0aW9ucyhvcHQpOworCisgICAgd2hpbGUgKCBQeURpY3RfTmV4dChkLCAmcG9zLCAma2V5LCAmdmFsdWUpICkgeworICAgICAgICBpZiAoICFrZXkgfHwgIXZhbHVlIHx8ICFQeVN0cmluZ19DaGVjayhrZXkpICkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEVycm9yT2JqZWN0LCAiRGlhbG9nT3B0aW9uIGhhcyBub24tc3RyaW5nIGtleSIpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAga2V5c3RyID0gUHlTdHJpbmdfQXNTdHJpbmcoa2V5KTsKKyAgICAgICAgaWYoIHN0cmNtcChrZXlzdHIsICJkZWZhdWx0TG9jYXRpb24iKSA9PSAwICkgeworICAgICAgICAgICAgaWYgKCAoZGVmYXVsdExvY2F0aW9uX3N0b3JhZ2UgPSBQeU1lbV9ORVcoQUVEZXNjLCAxKSkgPT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCAhUHlBcmdfUGFyc2UodmFsdWUsICJPJiIsIEFFRGVzY19Db252ZXJ0LCBkZWZhdWx0TG9jYXRpb25fc3RvcmFnZSkgKSB7CisgICAgICAgICAgICAgICAgUHlNZW1fREVMKGRlZmF1bHRMb2NhdGlvbl9zdG9yYWdlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpkZWZhdWx0TG9jYXRpb25QID0gZGVmYXVsdExvY2F0aW9uX3N0b3JhZ2U7CisgICAgICAgIH0gZWxzZSBpZiggc3RyY21wKGtleXN0ciwgInZlcnNpb24iKSA9PSAwICkgeworICAgICAgICAgICAgaWYgKCAhUHlBcmdfUGFyc2UodmFsdWUsICJIIiwgJm9wdC0+dmVyc2lvbikgKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9IGVsc2UgaWYoIHN0cmNtcChrZXlzdHIsICJkaWFsb2dPcHRpb25GbGFncyIpID09IDAgKSB7CisgICAgICAgICAgICBpZiAoICFQeUFyZ19QYXJzZSh2YWx1ZSwgImsiLCAmb3B0LT5kaWFsb2dPcHRpb25GbGFncykgKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9IGVsc2UgaWYoIHN0cmNtcChrZXlzdHIsICJsb2NhdGlvbiIpID09IDAgKSB7CisgICAgICAgICAgICBpZiAoICFQeUFyZ19QYXJzZSh2YWx1ZSwgIk8mIiwgUHlNYWNfR2V0UG9pbnQsICZvcHQtPmxvY2F0aW9uKSApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0gZWxzZSBpZiggc3RyY21wKGtleXN0ciwgImNsaWVudE5hbWUiKSA9PSAwICkgeworICAgICAgICAgICAgaWYgKCAhUHlBcmdfUGFyc2UodmFsdWUsICJPJiIsIFB5TWFjX0dldFN0cjI1NSwgJm9wdC0+Y2xpZW50TmFtZSkgKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9IGVsc2UgaWYoIHN0cmNtcChrZXlzdHIsICJ3aW5kb3dUaXRsZSIpID09IDAgKSB7CisgICAgICAgICAgICBpZiAoICFQeUFyZ19QYXJzZSh2YWx1ZSwgIk8mIiwgUHlNYWNfR2V0U3RyMjU1LCAmb3B0LT53aW5kb3dUaXRsZSkgKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9IGVsc2UgaWYoIHN0cmNtcChrZXlzdHIsICJhY3Rpb25CdXR0b25MYWJlbCIpID09IDAgKSB7CisgICAgICAgICAgICBpZiAoICFQeUFyZ19QYXJzZSh2YWx1ZSwgIk8mIiwgUHlNYWNfR2V0U3RyMjU1LCAmb3B0LT5hY3Rpb25CdXR0b25MYWJlbCkgKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9IGVsc2UgaWYoIHN0cmNtcChrZXlzdHIsICJjYW5jZWxCdXR0b25MYWJlbCIpID09IDAgKSB7CisgICAgICAgICAgICBpZiAoICFQeUFyZ19QYXJzZSh2YWx1ZSwgIk8mIiwgUHlNYWNfR2V0U3RyMjU1LCAmb3B0LT5jYW5jZWxCdXR0b25MYWJlbCkgKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9IGVsc2UgaWYoIHN0cmNtcChrZXlzdHIsICJzYXZlZEZpbGVOYW1lIikgPT0gMCApIHsKKyAgICAgICAgICAgIGlmICggIVB5QXJnX1BhcnNlKHZhbHVlLCAiTyYiLCBQeU1hY19HZXRTdHIyNTUsICZvcHQtPnNhdmVkRmlsZU5hbWUpICkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfSBlbHNlIGlmKCBzdHJjbXAoa2V5c3RyLCAibWVzc2FnZSIpID09IDAgKSB7CisgICAgICAgICAgICBpZiAoICFQeUFyZ19QYXJzZSh2YWx1ZSwgIk8mIiwgUHlNYWNfR2V0U3RyMjU1LCAmb3B0LT5tZXNzYWdlKSApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0gZWxzZSBpZiggc3RyY21wKGtleXN0ciwgInByZWZlcmVuY2VLZXkiKSA9PSAwICkgeworICAgICAgICAgICAgaWYgKCAhUHlBcmdfUGFyc2UodmFsdWUsICJPJiIsIFB5TWFjX0dldE9TVHlwZSwgJm9wdC0+cHJlZmVyZW5jZUtleSkgKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9IGVsc2UgaWYoIHN0cmNtcChrZXlzdHIsICJwb3B1cEV4dGVuc2lvbiIpID09IDAgKSB7CisgICAgICAgICAgICBpZiAoICFQeUFyZ19QYXJzZSh2YWx1ZSwgIk8mIiwgUmVzT2JqX0NvbnZlcnQsICZvcHQtPnBvcHVwRXh0ZW5zaW9uKSApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0gZWxzZSBpZiggZXZlbnRQcm9jUCAmJiBzdHJjbXAoa2V5c3RyLCAiZXZlbnRQcm9jIikgPT0gMCApIHsKKyAgICAgICAgICAgICpldmVudFByb2NQID0gbXlfZXZlbnRQcm9jVVBQOworICAgICAgICB9IGVsc2UgaWYoIHByZXZpZXdQcm9jUCAmJiBzdHJjbXAoa2V5c3RyLCAicHJldmlld1Byb2MiKSA9PSAwICkgeworICAgICAgICAgICAgKnByZXZpZXdQcm9jUCA9IG15X3ByZXZpZXdQcm9jVVBQOworICAgICAgICB9IGVsc2UgaWYoIGZpbHRlclByb2NQICYmIHN0cmNtcChrZXlzdHIsICJmaWx0ZXJQcm9jIikgPT0gMCApIHsKKyAgICAgICAgICAgICpmaWx0ZXJQcm9jUCA9IG15X2ZpbHRlclByb2NVUFA7CisgICAgICAgIH0gZWxzZSBpZiggdHlwZUxpc3RQICYmIHN0cmNtcChrZXlzdHIsICJ0eXBlTGlzdCIpID09IDAgKSB7CisgICAgICAgICAgICBpZiAoICFQeUFyZ19QYXJzZSh2YWx1ZSwgIk8mIiwgUmVzT2JqX0NvbnZlcnQsIHR5cGVMaXN0UCkgKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9IGVsc2UgaWYoIGZpbGVUeXBlUCAmJiBzdHJjbXAoa2V5c3RyLCAiZmlsZVR5cGUiKSA9PSAwICkgeworICAgICAgICAgICAgaWYgKCAhUHlBcmdfUGFyc2UodmFsdWUsICJPJiIsIFB5TWFjX0dldE9TVHlwZSwgZmlsZVR5cGVQKSApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0gZWxzZSBpZiggZmlsZUNyZWF0b3JQICYmIHN0cmNtcChrZXlzdHIsICJmaWxlQ3JlYXRvciIpID09IDAgKSB7CisgICAgICAgICAgICBpZiAoICFQeUFyZ19QYXJzZSh2YWx1ZSwgIk8mIiwgUHlNYWNfR2V0T1NUeXBlLCBmaWxlQ3JlYXRvclApICkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChFcnJvck9iamVjdCwgIlVua25vd24gRGlhbG9nT3B0aW9uIGtleTogJXMiLCBrZXlzdHIpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDE7CiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0yMTcsOCArMjE3LDggQEAKIC8qIERlY2xhcmF0aW9ucyBmb3Igb2JqZWN0cyBvZiB0eXBlIE5hdlJlcGx5UmVjb3JkICovCiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JTmF2UmVwbHlSZWNvcmQgaXRzZWxmOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBOYXZSZXBseVJlY29yZCBpdHNlbGY7CiB9IG5hdnJyb2JqZWN0OwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IE5hdnJydHlwZTsKQEAgLTIzNCwxOCArMjM0LDE4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogbmF2X05hdlRyYW5zbGF0ZUZpbGUobmF2cnJvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCU5hdlRyYW5zbGF0aW9uT3B0aW9ucyBob3dUb1RyYW5zbGF0ZTsKLQlPU0VyciBlcnI7CisgICAgTmF2VHJhbnNsYXRpb25PcHRpb25zIGhvd1RvVHJhbnNsYXRlOworICAgIE9TRXJyIGVycjsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiayIsICZob3dUb1RyYW5zbGF0ZSkpCi0JCXJldHVybiBOVUxMOwotCWVyciA9IE5hdlRyYW5zbGF0ZUZpbGUoJnNlbGYtPml0c2VsZiwgaG93VG9UcmFuc2xhdGUpOwotCWlmICggZXJyICkgewotCQlQeUVycl9NYWMoRXJyb3JPYmplY3QsIGVycik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJrIiwgJmhvd1RvVHJhbnNsYXRlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZXJyID0gTmF2VHJhbnNsYXRlRmlsZSgmc2VsZi0+aXRzZWxmLCBob3dUb1RyYW5zbGF0ZSk7CisgICAgaWYgKCBlcnIgKSB7CisgICAgICAgIFB5RXJyX01hYyhFcnJvck9iamVjdCwgZXJyKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIGNoYXIgbmF2X05hdkNvbXBsZXRlU2F2ZV9fZG9jX19bXSA9CkBAIC0yNTUsMjYgKzI1NSwyNiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIG5hdl9OYXZDb21wbGV0ZVNhdmUobmF2cnJvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCU5hdlRyYW5zbGF0aW9uT3B0aW9ucyBob3dUb1RyYW5zbGF0ZTsKLQlPU0VyciBlcnI7CisgICAgTmF2VHJhbnNsYXRpb25PcHRpb25zIGhvd1RvVHJhbnNsYXRlOworICAgIE9TRXJyIGVycjsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiayIsICZob3dUb1RyYW5zbGF0ZSkpCi0JCXJldHVybiBOVUxMOwotCWVyciA9IE5hdkNvbXBsZXRlU2F2ZSgmc2VsZi0+aXRzZWxmLCBob3dUb1RyYW5zbGF0ZSk7Ci0JaWYgKCBlcnIgKSB7Ci0JCVB5RXJyX01hYyhFcnJvck9iamVjdCwgZXJyKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImsiLCAmaG93VG9UcmFuc2xhdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBlcnIgPSBOYXZDb21wbGV0ZVNhdmUoJnNlbGYtPml0c2VsZiwgaG93VG9UcmFuc2xhdGUpOworICAgIGlmICggZXJyICkgeworICAgICAgICBQeUVycl9NYWMoRXJyb3JPYmplY3QsIGVycik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIAogc3RhdGljIHN0cnVjdCBQeU1ldGhvZERlZiBuYXZycl9tZXRob2RzW10gPSB7Ci0geyJOYXZUcmFuc2xhdGVGaWxlIiwJKFB5Q0Z1bmN0aW9uKW5hdl9OYXZUcmFuc2xhdGVGaWxlLAlNRVRIX1ZBUkFSR1MsCW5hdl9OYXZUcmFuc2xhdGVGaWxlX19kb2NfX30sCi0geyJOYXZDb21wbGV0ZVNhdmUiLAkoUHlDRnVuY3Rpb24pbmF2X05hdkNvbXBsZXRlU2F2ZSwJTUVUSF9WQVJBUkdTLAluYXZfTmF2Q29tcGxldGVTYXZlX19kb2NfX30sCi0JCi0Je05VTEwsCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyB7Ik5hdlRyYW5zbGF0ZUZpbGUiLCAgIChQeUNGdW5jdGlvbiluYXZfTmF2VHJhbnNsYXRlRmlsZSwgICAgICBNRVRIX1ZBUkFSR1MsICAgbmF2X05hdlRyYW5zbGF0ZUZpbGVfX2RvY19ffSwKKyB7Ik5hdkNvbXBsZXRlU2F2ZSIsICAgIChQeUNGdW5jdGlvbiluYXZfTmF2Q29tcGxldGVTYXZlLCAgICAgICBNRVRIX1ZBUkFSR1MsICAgbmF2X05hdkNvbXBsZXRlU2F2ZV9fZG9jX199LAorCisgICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIC8qIC0tLS0tLS0tLS0gKi8KQEAgLTI4MywxNjEgKzI4MywxNjEgQEAKIHN0YXRpYyBuYXZycm9iamVjdCAqCiBuZXduYXZycm9iamVjdChOYXZSZXBseVJlY29yZCAqaXRzZWxmKQogewotCW5hdnJyb2JqZWN0ICpzZWxmOwotCQotCXNlbGYgPSBQeU9iamVjdF9ORVcobmF2cnJvYmplY3QsICZOYXZycnR5cGUpOwotCWlmIChzZWxmID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXNlbGYtPml0c2VsZiA9ICppdHNlbGY7Ci0JcmV0dXJuIHNlbGY7CisgICAgbmF2cnJvYmplY3QgKnNlbGY7CisKKyAgICBzZWxmID0gUHlPYmplY3RfTkVXKG5hdnJyb2JqZWN0LCAmTmF2cnJ0eXBlKTsKKyAgICBpZiAoc2VsZiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBzZWxmLT5pdHNlbGYgPSAqaXRzZWxmOworICAgIHJldHVybiBzZWxmOwogfQogCiAKIHN0YXRpYyB2b2lkCiBuYXZycl9kZWFsbG9jKG5hdnJyb2JqZWN0ICpzZWxmKQogewotCU5hdkRpc3Bvc2VSZXBseSgmc2VsZi0+aXRzZWxmKTsKLQlQeU9iamVjdF9ERUwoc2VsZik7CisgICAgTmF2RGlzcG9zZVJlcGx5KCZzZWxmLT5pdHNlbGYpOworICAgIFB5T2JqZWN0X0RFTChzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG5hdnJyX2dldGF0dHIobmF2cnJvYmplY3QgKnNlbGYsIGNoYXIgKm5hbWUpCiB7Ci0JRlNSZWYgZnNyOwotCUZTU3BlYyBmc3M7Ci0JCi0JaWYoIHN0cmNtcChuYW1lLCAiX19tZW1iZXJzX18iKSA9PSAwICkKLQkJcmV0dXJuIFB5X0J1aWxkVmFsdWUoCi0JCQkJInNzc3Nzc3Nzc3MiLCAKLQkJCQkidmVyc2lvbiIsICJ2YWxpZFJlY29yZCIsICJyZXBsYWNpbmciLAotCQkJImlzU3RhdGlvbmVyeSIsICJ0cmFuc2xhdGlvbk5lZWRlZCIsIAotCQkJInNlbGVjdGlvbiIsIAotCQkJInNlbGVjdGlvbl9mc3IiLAotCQkJImZpbGVUcmFuc2xhdGlvbiIsICJrZXlTY3JpcHQiLCAic2F2ZUZpbGVOYW1lIik7CisgICAgRlNSZWYgZnNyOworICAgIEZTU3BlYyBmc3M7CiAKLQlpZiggc3RyY21wKG5hbWUsICJ2ZXJzaW9uIikgPT0gMCApCi0JCXJldHVybiBQeV9CdWlsZFZhbHVlKCJoIiwgc2VsZi0+aXRzZWxmLnZlcnNpb24pOwotCWlmKCBzdHJjbXAobmFtZSwgInZhbGlkUmVjb3JkIikgPT0gMCApCi0JCXJldHVybiBQeV9CdWlsZFZhbHVlKCJsIiwgKGxvbmcpc2VsZi0+aXRzZWxmLnZhbGlkUmVjb3JkKTsKLQlpZiggc3RyY21wKG5hbWUsICJyZXBsYWNpbmciKSA9PSAwICkKLQkJcmV0dXJuIFB5X0J1aWxkVmFsdWUoImwiLCAobG9uZylzZWxmLT5pdHNlbGYucmVwbGFjaW5nKTsKLQlpZiggc3RyY21wKG5hbWUsICJpc1N0YXRpb25lcnkiKSA9PSAwICkKLQkJcmV0dXJuIFB5X0J1aWxkVmFsdWUoImwiLCAobG9uZylzZWxmLT5pdHNlbGYuaXNTdGF0aW9uZXJ5KTsKLQlpZiggc3RyY21wKG5hbWUsICJ0cmFuc2xhdGlvbk5lZWRlZCIpID09IDAgKQotCQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgibCIsIChsb25nKXNlbGYtPml0c2VsZi50cmFuc2xhdGlvbk5lZWRlZCk7Ci0JaWYoIHN0cmNtcChuYW1lLCAic2VsZWN0aW9uIikgPT0gMCApIHsKLQkJU0ludDMyIGk7Ci0JCWxvbmcgY291bnQ7Ci0JCU9TRXJyIGVycjsKLQkJUHlPYmplY3QgKnJ2LCAqcnZpdGVtOwotCQlBRURlc2MgZGVzYzsKLQkJCi0JCWlmICgoZXJyPUFFQ291bnRJdGVtcygmc2VsZi0+aXRzZWxmLnNlbGVjdGlvbiwgJmNvdW50KSkpIHsKLQkJCVB5RXJyX01hYyhFcnJvck9iamVjdCwgZXJyKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWlmICggKHJ2PVB5TGlzdF9OZXcoY291bnQpKSA9PSBOVUxMICkKLQkJCXJldHVybiBOVUxMOwotCQlmb3IoaT0wOyBpPGNvdW50OyBpKyspIHsKLQkJCWRlc2MuZGF0YUhhbmRsZSA9IE5VTEw7Ci0JCQlpZiAoKGVycj1BRUdldE50aERlc2MoJnNlbGYtPml0c2VsZi5zZWxlY3Rpb24sIGkrMSwgdHlwZUZTUywgTlVMTCwgJmRlc2MpKSkgewotCQkJCVB5X0RFQ1JFRihydik7Ci0JCQkJUHlFcnJfTWFjKEVycm9yT2JqZWN0LCBlcnIpOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQkJaWYgKChlcnI9QUVHZXREZXNjRGF0YSgmZGVzYywgJmZzcywgc2l6ZW9mKEZTU3BlYykpKSkgewotCQkJCVB5X0RFQ1JFRihydik7Ci0JCQkJUHlFcnJfTWFjKEVycm9yT2JqZWN0LCBlcnIpOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQkJcnZpdGVtID0gUHlNYWNfQnVpbGRGU1NwZWMoJmZzcyk7Ci0JCQlQeUxpc3RfU2V0SXRlbShydiwgaSwgcnZpdGVtKTsKLQkJCUFFRGlzcG9zZURlc2MoJmRlc2MpOwotCQl9Ci0JCXJldHVybiBydjsKLQl9Ci0JaWYoIHN0cmNtcChuYW1lLCAic2VsZWN0aW9uX2ZzciIpID09IDAgKSB7Ci0JCVNJbnQzMiBpOwotCQlsb25nIGNvdW50OwotCQlPU0VyciBlcnI7Ci0JCVB5T2JqZWN0ICpydiwgKnJ2aXRlbTsKLQkJQUVEZXNjIGRlc2M7Ci0JCQotCQlpZiAoKGVycj1BRUNvdW50SXRlbXMoJnNlbGYtPml0c2VsZi5zZWxlY3Rpb24sICZjb3VudCkpKSB7Ci0JCQlQeUVycl9NYWMoRXJyb3JPYmplY3QsIGVycik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlpZiAoIChydj1QeUxpc3RfTmV3KGNvdW50KSkgPT0gTlVMTCApCi0JCQlyZXR1cm4gTlVMTDsKLQkJZm9yKGk9MDsgaTxjb3VudDsgaSsrKSB7Ci0JCQlkZXNjLmRhdGFIYW5kbGUgPSBOVUxMOwotCQkJaWYgKChlcnI9QUVHZXROdGhEZXNjKCZzZWxmLT5pdHNlbGYuc2VsZWN0aW9uLCBpKzEsIHR5cGVGU1JlZiwgTlVMTCwgJmRlc2MpKSkgewotCQkJCVB5X0RFQ1JFRihydik7Ci0JCQkJUHlFcnJfTWFjKEVycm9yT2JqZWN0LCBlcnIpOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQkJaWYgKChlcnI9QUVHZXREZXNjRGF0YSgmZGVzYywgJmZzciwgc2l6ZW9mKEZTUmVmKSkpKSB7Ci0JCQkJUHlfREVDUkVGKHJ2KTsKLQkJCQlQeUVycl9NYWMoRXJyb3JPYmplY3QsIGVycik7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCQlydml0ZW0gPSBQeU1hY19CdWlsZEZTUmVmKCZmc3IpOwotCQkJUHlMaXN0X1NldEl0ZW0ocnYsIGksIHJ2aXRlbSk7Ci0JCQlBRURpc3Bvc2VEZXNjKCZkZXNjKTsKLQkJfQotCQlyZXR1cm4gcnY7Ci0JfQotCWlmKCBzdHJjbXAobmFtZSwgImZpbGVUcmFuc2xhdGlvbiIpID09IDAgKQotCQlyZXR1cm4gUmVzT2JqX05ldygoSGFuZGxlKXNlbGYtPml0c2VsZi5maWxlVHJhbnNsYXRpb24pOwotCWlmKCBzdHJjbXAobmFtZSwgImtleVNjcmlwdCIpID09IDAgKQotCQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaCIsIChzaG9ydClzZWxmLT5pdHNlbGYua2V5U2NyaXB0KTsKLQlpZiggc3RyY21wKG5hbWUsICJzYXZlRmlsZU5hbWUiKSA9PSAwICkKLQkJcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBzZWxmLT5pdHNlbGYuc2F2ZUZpbGVOYW1lKTsKKyAgICBpZiggc3RyY21wKG5hbWUsICJfX21lbWJlcnNfXyIpID09IDAgKQorICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICJzc3Nzc3Nzc3NzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ2ZXJzaW9uIiwgInZhbGlkUmVjb3JkIiwgInJlcGxhY2luZyIsCisgICAgICAgICAgICAiaXNTdGF0aW9uZXJ5IiwgInRyYW5zbGF0aW9uTmVlZGVkIiwKKyAgICAgICAgICAgICJzZWxlY3Rpb24iLAorICAgICAgICAgICAgInNlbGVjdGlvbl9mc3IiLAorICAgICAgICAgICAgImZpbGVUcmFuc2xhdGlvbiIsICJrZXlTY3JpcHQiLCAic2F2ZUZpbGVOYW1lIik7CisKKyAgICBpZiggc3RyY21wKG5hbWUsICJ2ZXJzaW9uIikgPT0gMCApCisgICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJoIiwgc2VsZi0+aXRzZWxmLnZlcnNpb24pOworICAgIGlmKCBzdHJjbXAobmFtZSwgInZhbGlkUmVjb3JkIikgPT0gMCApCisgICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJsIiwgKGxvbmcpc2VsZi0+aXRzZWxmLnZhbGlkUmVjb3JkKTsKKyAgICBpZiggc3RyY21wKG5hbWUsICJyZXBsYWNpbmciKSA9PSAwICkKKyAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImwiLCAobG9uZylzZWxmLT5pdHNlbGYucmVwbGFjaW5nKTsKKyAgICBpZiggc3RyY21wKG5hbWUsICJpc1N0YXRpb25lcnkiKSA9PSAwICkKKyAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImwiLCAobG9uZylzZWxmLT5pdHNlbGYuaXNTdGF0aW9uZXJ5KTsKKyAgICBpZiggc3RyY21wKG5hbWUsICJ0cmFuc2xhdGlvbk5lZWRlZCIpID09IDAgKQorICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgibCIsIChsb25nKXNlbGYtPml0c2VsZi50cmFuc2xhdGlvbk5lZWRlZCk7CisgICAgaWYoIHN0cmNtcChuYW1lLCAic2VsZWN0aW9uIikgPT0gMCApIHsKKyAgICAgICAgU0ludDMyIGk7CisgICAgICAgIGxvbmcgY291bnQ7CisgICAgICAgIE9TRXJyIGVycjsKKyAgICAgICAgUHlPYmplY3QgKnJ2LCAqcnZpdGVtOworICAgICAgICBBRURlc2MgZGVzYzsKKworICAgICAgICBpZiAoKGVycj1BRUNvdW50SXRlbXMoJnNlbGYtPml0c2VsZi5zZWxlY3Rpb24sICZjb3VudCkpKSB7CisgICAgICAgICAgICBQeUVycl9NYWMoRXJyb3JPYmplY3QsIGVycik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIChydj1QeUxpc3RfTmV3KGNvdW50KSkgPT0gTlVMTCApCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgZm9yKGk9MDsgaTxjb3VudDsgaSsrKSB7CisgICAgICAgICAgICBkZXNjLmRhdGFIYW5kbGUgPSBOVUxMOworICAgICAgICAgICAgaWYgKChlcnI9QUVHZXROdGhEZXNjKCZzZWxmLT5pdHNlbGYuc2VsZWN0aW9uLCBpKzEsIHR5cGVGU1MsIE5VTEwsICZkZXNjKSkpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYocnYpOworICAgICAgICAgICAgICAgIFB5RXJyX01hYyhFcnJvck9iamVjdCwgZXJyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgoZXJyPUFFR2V0RGVzY0RhdGEoJmRlc2MsICZmc3MsIHNpemVvZihGU1NwZWMpKSkpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYocnYpOworICAgICAgICAgICAgICAgIFB5RXJyX01hYyhFcnJvck9iamVjdCwgZXJyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJ2aXRlbSA9IFB5TWFjX0J1aWxkRlNTcGVjKCZmc3MpOworICAgICAgICAgICAgUHlMaXN0X1NldEl0ZW0ocnYsIGksIHJ2aXRlbSk7CisgICAgICAgICAgICBBRURpc3Bvc2VEZXNjKCZkZXNjKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnY7CisgICAgfQorICAgIGlmKCBzdHJjbXAobmFtZSwgInNlbGVjdGlvbl9mc3IiKSA9PSAwICkgeworICAgICAgICBTSW50MzIgaTsKKyAgICAgICAgbG9uZyBjb3VudDsKKyAgICAgICAgT1NFcnIgZXJyOworICAgICAgICBQeU9iamVjdCAqcnYsICpydml0ZW07CisgICAgICAgIEFFRGVzYyBkZXNjOworCisgICAgICAgIGlmICgoZXJyPUFFQ291bnRJdGVtcygmc2VsZi0+aXRzZWxmLnNlbGVjdGlvbiwgJmNvdW50KSkpIHsKKyAgICAgICAgICAgIFB5RXJyX01hYyhFcnJvck9iamVjdCwgZXJyKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGlmICggKHJ2PVB5TGlzdF9OZXcoY291bnQpKSA9PSBOVUxMICkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBmb3IoaT0wOyBpPGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGRlc2MuZGF0YUhhbmRsZSA9IE5VTEw7CisgICAgICAgICAgICBpZiAoKGVycj1BRUdldE50aERlc2MoJnNlbGYtPml0c2VsZi5zZWxlY3Rpb24sIGkrMSwgdHlwZUZTUmVmLCBOVUxMLCAmZGVzYykpKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHJ2KTsKKyAgICAgICAgICAgICAgICBQeUVycl9NYWMoRXJyb3JPYmplY3QsIGVycik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKGVycj1BRUdldERlc2NEYXRhKCZkZXNjLCAmZnNyLCBzaXplb2YoRlNSZWYpKSkpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYocnYpOworICAgICAgICAgICAgICAgIFB5RXJyX01hYyhFcnJvck9iamVjdCwgZXJyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJ2aXRlbSA9IFB5TWFjX0J1aWxkRlNSZWYoJmZzcik7CisgICAgICAgICAgICBQeUxpc3RfU2V0SXRlbShydiwgaSwgcnZpdGVtKTsKKyAgICAgICAgICAgIEFFRGlzcG9zZURlc2MoJmRlc2MpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBydjsKKyAgICB9CisgICAgaWYoIHN0cmNtcChuYW1lLCAiZmlsZVRyYW5zbGF0aW9uIikgPT0gMCApCisgICAgICAgIHJldHVybiBSZXNPYmpfTmV3KChIYW5kbGUpc2VsZi0+aXRzZWxmLmZpbGVUcmFuc2xhdGlvbik7CisgICAgaWYoIHN0cmNtcChuYW1lLCAia2V5U2NyaXB0IikgPT0gMCApCisgICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJoIiwgKHNob3J0KXNlbGYtPml0c2VsZi5rZXlTY3JpcHQpOworICAgIGlmKCBzdHJjbXAobmFtZSwgInNhdmVGaWxlTmFtZSIpID09IDAgKQorICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyYiLCBDRlN0cmluZ1JlZk9ial9OZXcsIHNlbGYtPml0c2VsZi5zYXZlRmlsZU5hbWUpOwogCiAKLQlyZXR1cm4gUHlfRmluZE1ldGhvZChuYXZycl9tZXRob2RzLCAoUHlPYmplY3QgKilzZWxmLCBuYW1lKTsKKyAgICByZXR1cm4gUHlfRmluZE1ldGhvZChuYXZycl9tZXRob2RzLCAoUHlPYmplY3QgKilzZWxmLCBuYW1lKTsKIH0KIAogc3RhdGljIGludAogbmF2cnJfc2V0YXR0cihuYXZycm9iamVjdCAqc2VsZiwgY2hhciAqbmFtZSwgUHlPYmplY3QgKnYpCiB7Ci0JLyogU2V0IGF0dHJpYnV0ZSAnbmFtZScgdG8gdmFsdWUgJ3YnLiB2PT1OVUxMIG1lYW5zIGRlbGV0ZSAqLwotCQotCS8qIFhYWFggQWRkIHlvdXIgb3duIHNldGF0dHIgY29kZSBoZXJlICovCi0JcmV0dXJuIC0xOworICAgIC8qIFNldCBhdHRyaWJ1dGUgJ25hbWUnIHRvIHZhbHVlICd2Jy4gdj09TlVMTCBtZWFucyBkZWxldGUgKi8KKworICAgIC8qIFhYWFggQWRkIHlvdXIgb3duIHNldGF0dHIgY29kZSBoZXJlICovCisgICAgcmV0dXJuIC0xOwogfQogCi1zdGF0aWMgY2hhciBOYXZycnR5cGVfX2RvY19fW10gPSAKK3N0YXRpYyBjaGFyIE5hdnJydHlwZV9fZG9jX19bXSA9CiAiUmVjb3JkIGNvbnRhaW5pbmcgcmVzdWx0IG9mIGEgTmF2IGZpbGUgc2VsZWN0aW9uIGNhbGwuIFVzZSBkaXIoKSBmb3IgbWVtYmVyIG5hbWVzLiIKIDsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBOYXZycnR5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSkKLQkwLAkJCQkvKm9iX3NpemUqLwotCSJOYXYuTmF2UmVwbHlSZWNvcmQiLAkJCS8qdHBfbmFtZSovCi0Jc2l6ZW9mKG5hdnJyb2JqZWN0KSwJCS8qdHBfYmFzaWNzaXplKi8KLQkwLAkJCQkvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpbmF2cnJfZGVhbGxvYywJLyp0cF9kZWFsbG9jKi8KLQkocHJpbnRmdW5jKTAsCQkvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpbmF2cnJfZ2V0YXR0ciwJLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpbmF2cnJfc2V0YXR0ciwJLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykwLAkJLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpMCwJCS8qdHBfcmVwciovCi0JMCwJCQkvKnRwX2FzX251bWJlciovCi0JMCwJCS8qdHBfYXNfc2VxdWVuY2UqLwotCTAsCQkvKnRwX2FzX21hcHBpbmcqLwotCShoYXNoZnVuYykwLAkJLyp0cF9oYXNoKi8KLQkodGVybmFyeWZ1bmMpMCwJCS8qdHBfY2FsbCovCi0JKHJlcHJmdW5jKTAsCQkvKnRwX3N0ciovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSkKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm9iX3NpemUqLworICAgICJOYXYuTmF2UmVwbHlSZWNvcmQiLCAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YobmF2cnJvYmplY3QpLCAgICAgICAgICAgICAgICAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKW5hdnJyX2RlYWxsb2MsICAgICAgICAgIC8qdHBfZGVhbGxvYyovCisgICAgKHByaW50ZnVuYykwLCAgICAgICAgICAgICAgIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYyluYXZycl9nZXRhdHRyLCAgICAgICAgIC8qdHBfZ2V0YXR0ciovCisgICAgKHNldGF0dHJmdW5jKW5hdnJyX3NldGF0dHIsICAgICAgICAgLyp0cF9zZXRhdHRyKi8KKyAgICAoY21wZnVuYykwLCAgICAgICAgICAgICAgICAgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpMCwgICAgICAgICAgICAgICAgLyp0cF9yZXByKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19udW1iZXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9hc19zZXF1ZW5jZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX2FzX21hcHBpbmcqLworICAgIChoYXNoZnVuYykwLCAgICAgICAgICAgICAgICAvKnRwX2hhc2gqLworICAgICh0ZXJuYXJ5ZnVuYykwLCAgICAgICAgICAgICAvKnRwX2NhbGwqLworICAgIChyZXByZnVuYykwLCAgICAgICAgICAgICAgICAvKnRwX3N0ciovCiAKLQkvKiBTcGFjZSBmb3IgZnV0dXJlIGV4cGFuc2lvbiAqLwotCTBMLDBMLDBMLDBMLAotCU5hdnJydHlwZV9fZG9jX18gLyogRG9jdW1lbnRhdGlvbiBzdHJpbmcgKi8KKyAgICAvKiBTcGFjZSBmb3IgZnV0dXJlIGV4cGFuc2lvbiAqLworICAgIDBMLDBMLDBMLDBMLAorICAgIE5hdnJydHlwZV9fZG9jX18gLyogRG9jdW1lbnRhdGlvbiBzdHJpbmcgKi8KIH07CiAKIC8qIEVuZCBvZiBjb2RlIGZvciBOYXZSZXBseVJlY29yZCBvYmplY3RzICovCi0JCQorCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiBzdGF0aWMgY2hhciBuYXZfTmF2R2V0RmlsZV9fZG9jX19bXSA9CkBAIC00NDcsMzIgKzQ0NywzMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIG5hdl9OYXZHZXRGaWxlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3KQogewotCVB5T2JqZWN0ICpkaWN0OwotCUFFRGVzYwkqZGVmYXVsdExvY2F0aW9uID0gTlVMTDsKLQlOYXZSZXBseVJlY29yZCByZXBseTsKLQlOYXZEaWFsb2dPcHRpb25zIGRpYWxvZ09wdGlvbnM7Ci0JTmF2RXZlbnRVUFAgZXZlbnRQcm9jID0gTlVMTDsKLQlOYXZQcmV2aWV3VVBQIHByZXZpZXdQcm9jID0gTlVMTDsKLQlOYXZPYmplY3RGaWx0ZXJVUFAgZmlsdGVyUHJvYyA9IE5VTEw7Ci0JTmF2VHlwZUxpc3RIYW5kbGUgdHlwZUxpc3QgPSBOVUxMOwotCU9TRXJyIGVycjsKKyAgICBQeU9iamVjdCAqZGljdDsKKyAgICBBRURlc2MgICAgICAqZGVmYXVsdExvY2F0aW9uID0gTlVMTDsKKyAgICBOYXZSZXBseVJlY29yZCByZXBseTsKKyAgICBOYXZEaWFsb2dPcHRpb25zIGRpYWxvZ09wdGlvbnM7CisgICAgTmF2RXZlbnRVUFAgZXZlbnRQcm9jID0gTlVMTDsKKyAgICBOYXZQcmV2aWV3VVBQIHByZXZpZXdQcm9jID0gTlVMTDsKKyAgICBOYXZPYmplY3RGaWx0ZXJVUFAgZmlsdGVyUHJvYyA9IE5VTEw7CisgICAgTmF2VHlwZUxpc3RIYW5kbGUgdHlwZUxpc3QgPSBOVUxMOworICAgIE9TRXJyIGVycjsKIAotCWlmICgga3cgJiYgUHlPYmplY3RfSXNUcnVlKGt3KSApIHsKLQkJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI7ZWl0aGVyIGtleXdvcmQgYXJndW1lbnRzIG9yIGRpY3Rpb25hcnkgZXhwZWN0ZWQiKSkKLQkJCXJldHVybiBOVUxMOwotCQlkaWN0ID0ga3c7Ci0JfSBlbHNlIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyEiLCAmUHlEaWN0X1R5cGUsICZkaWN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFmaWxsZGlhbG9nb3B0aW9ucyhkaWN0LCAmZGVmYXVsdExvY2F0aW9uLCAmZGlhbG9nT3B0aW9ucywgJmV2ZW50UHJvYywgJnByZXZpZXdQcm9jLCAmZmlsdGVyUHJvYywgJnR5cGVMaXN0LCBOVUxMLCBOVUxMKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZXJyID0gTmF2R2V0RmlsZShkZWZhdWx0TG9jYXRpb24sICZyZXBseSwgJmRpYWxvZ09wdGlvbnMsCi0JCQlldmVudFByb2MsIHByZXZpZXdQcm9jLCBmaWx0ZXJQcm9jLCB0eXBlTGlzdCwgKHZvaWQgKilkaWN0KTsKLQlQeU1lbV9ERUwoZGVmYXVsdExvY2F0aW9uKTsKLQlpZiAoIGVyciApIHsKLQkJUHlFcnJfTWFjKEVycm9yT2JqZWN0LCBlcnIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIChQeU9iamVjdCAqKW5ld25hdnJyb2JqZWN0KCZyZXBseSk7CisgICAgaWYgKCBrdyAmJiBQeU9iamVjdF9Jc1RydWUoa3cpICkgeworICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjtlaXRoZXIga2V5d29yZCBhcmd1bWVudHMgb3IgZGljdGlvbmFyeSBleHBlY3RlZCIpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGRpY3QgPSBrdzsKKyAgICB9IGVsc2UgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPISIsICZQeURpY3RfVHlwZSwgJmRpY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWZpbGxkaWFsb2dvcHRpb25zKGRpY3QsICZkZWZhdWx0TG9jYXRpb24sICZkaWFsb2dPcHRpb25zLCAmZXZlbnRQcm9jLCAmcHJldmlld1Byb2MsICZmaWx0ZXJQcm9jLCAmdHlwZUxpc3QsIE5VTEwsIE5VTEwpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBlcnIgPSBOYXZHZXRGaWxlKGRlZmF1bHRMb2NhdGlvbiwgJnJlcGx5LCAmZGlhbG9nT3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgZXZlbnRQcm9jLCBwcmV2aWV3UHJvYywgZmlsdGVyUHJvYywgdHlwZUxpc3QsICh2b2lkICopZGljdCk7CisgICAgUHlNZW1fREVMKGRlZmF1bHRMb2NhdGlvbik7CisgICAgaWYgKCBlcnIgKSB7CisgICAgICAgIFB5RXJyX01hYyhFcnJvck9iamVjdCwgZXJyKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiAoUHlPYmplY3QgKiluZXduYXZycm9iamVjdCgmcmVwbHkpOwogfQogCiBzdGF0aWMgY2hhciBuYXZfTmF2UHV0RmlsZV9fZG9jX19bXSA9CkBAIC00ODIsMzEgKzQ4MiwzMSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIG5hdl9OYXZQdXRGaWxlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3KQogewotCVB5T2JqZWN0ICpkaWN0OwotCUFFRGVzYwkqZGVmYXVsdExvY2F0aW9uID0gTlVMTDsKLQlOYXZSZXBseVJlY29yZCByZXBseTsKLQlOYXZEaWFsb2dPcHRpb25zIGRpYWxvZ09wdGlvbnM7Ci0JTmF2RXZlbnRVUFAgZXZlbnRQcm9jID0gTlVMTDsKLQlPU1R5cGUgZmlsZVR5cGU7Ci0JT1NUeXBlIGZpbGVDcmVhdG9yOwotCU9TRXJyIGVycjsKKyAgICBQeU9iamVjdCAqZGljdDsKKyAgICBBRURlc2MgICAgICAqZGVmYXVsdExvY2F0aW9uID0gTlVMTDsKKyAgICBOYXZSZXBseVJlY29yZCByZXBseTsKKyAgICBOYXZEaWFsb2dPcHRpb25zIGRpYWxvZ09wdGlvbnM7CisgICAgTmF2RXZlbnRVUFAgZXZlbnRQcm9jID0gTlVMTDsKKyAgICBPU1R5cGUgZmlsZVR5cGU7CisgICAgT1NUeXBlIGZpbGVDcmVhdG9yOworICAgIE9TRXJyIGVycjsKIAotCWlmICgga3cgJiYgUHlPYmplY3RfSXNUcnVlKGt3KSApIHsKLQkJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI7ZWl0aGVyIGtleXdvcmQgYXJndW1lbnRzIG9yIGRpY3Rpb25hcnkgZXhwZWN0ZWQiKSkKLQkJCXJldHVybiBOVUxMOwotCQlkaWN0ID0ga3c7Ci0JfSBlbHNlIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyEiLCAmUHlEaWN0X1R5cGUsICZkaWN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFmaWxsZGlhbG9nb3B0aW9ucyhkaWN0LCAmZGVmYXVsdExvY2F0aW9uLCAmZGlhbG9nT3B0aW9ucywgJmV2ZW50UHJvYywgTlVMTCwgTlVMTCwgTlVMTCwgJmZpbGVUeXBlLCAmZmlsZUNyZWF0b3IpKQotCQlyZXR1cm4gTlVMTDsKLQllcnIgPSBOYXZQdXRGaWxlKGRlZmF1bHRMb2NhdGlvbiwgJnJlcGx5LCAmZGlhbG9nT3B0aW9ucywKLQkJCWV2ZW50UHJvYywgZmlsZVR5cGUsIGZpbGVDcmVhdG9yLCAodm9pZCAqKWRpY3QpOwotCVB5TWVtX0RFTChkZWZhdWx0TG9jYXRpb24pOwotCWlmICggZXJyICkgewotCQlQeUVycl9NYWMoRXJyb3JPYmplY3QsIGVycik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gKFB5T2JqZWN0ICopbmV3bmF2cnJvYmplY3QoJnJlcGx5KTsKKyAgICBpZiAoIGt3ICYmIFB5T2JqZWN0X0lzVHJ1ZShrdykgKSB7CisgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiO2VpdGhlciBrZXl3b3JkIGFyZ3VtZW50cyBvciBkaWN0aW9uYXJ5IGV4cGVjdGVkIikpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgZGljdCA9IGt3OworICAgIH0gZWxzZSBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8hIiwgJlB5RGljdF9UeXBlLCAmZGljdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZmlsbGRpYWxvZ29wdGlvbnMoZGljdCwgJmRlZmF1bHRMb2NhdGlvbiwgJmRpYWxvZ09wdGlvbnMsICZldmVudFByb2MsIE5VTEwsIE5VTEwsIE5VTEwsICZmaWxlVHlwZSwgJmZpbGVDcmVhdG9yKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZXJyID0gTmF2UHV0RmlsZShkZWZhdWx0TG9jYXRpb24sICZyZXBseSwgJmRpYWxvZ09wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgIGV2ZW50UHJvYywgZmlsZVR5cGUsIGZpbGVDcmVhdG9yLCAodm9pZCAqKWRpY3QpOworICAgIFB5TWVtX0RFTChkZWZhdWx0TG9jYXRpb24pOworICAgIGlmICggZXJyICkgeworICAgICAgICBQeUVycl9NYWMoRXJyb3JPYmplY3QsIGVycik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gKFB5T2JqZWN0ICopbmV3bmF2cnJvYmplY3QoJnJlcGx5KTsKIH0KIAogc3RhdGljIGNoYXIgbmF2X05hdkFza1NhdmVDaGFuZ2VzX19kb2NfX1tdID0KQEAgLTUxNywyNyArNTE3LDI3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogbmF2X05hdkFza1NhdmVDaGFuZ2VzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3KQogewotCVB5T2JqZWN0ICpkaWN0OwotCU5hdkRpYWxvZ09wdGlvbnMgZGlhbG9nT3B0aW9uczsKLQlOYXZBc2tTYXZlQ2hhbmdlc0FjdGlvbiBhY3Rpb247Ci0JTmF2QXNrU2F2ZUNoYW5nZXNSZXN1bHQgcmVwbHk7Ci0JTmF2RXZlbnRVUFAgZXZlbnRQcm9jID0gTlVMTDsKLQlPU0VyciBlcnI7CisgICAgUHlPYmplY3QgKmRpY3Q7CisgICAgTmF2RGlhbG9nT3B0aW9ucyBkaWFsb2dPcHRpb25zOworICAgIE5hdkFza1NhdmVDaGFuZ2VzQWN0aW9uIGFjdGlvbjsKKyAgICBOYXZBc2tTYXZlQ2hhbmdlc1Jlc3VsdCByZXBseTsKKyAgICBOYXZFdmVudFVQUCBldmVudFByb2MgPSBOVUxMOworICAgIE9TRXJyIGVycjsKIAotCWlmICgga3cgJiYgUHlPYmplY3RfSXNUcnVlKGt3KSApIHsKLQkJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJrIiwgJmFjdGlvbikpCi0JCQlyZXR1cm4gTlVMTDsKLQkJZGljdCA9IGt3OwotCX0gZWxzZSBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImxPISIsICZhY3Rpb24sICZQeURpY3RfVHlwZSwgJmRpY3QpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWZpbGxkaWFsb2dvcHRpb25zKGRpY3QsIE5VTEwsICZkaWFsb2dPcHRpb25zLCAmZXZlbnRQcm9jLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZXJyID0gTmF2QXNrU2F2ZUNoYW5nZXMoJmRpYWxvZ09wdGlvbnMsIGFjdGlvbiwgJnJlcGx5LCBldmVudFByb2MsICh2b2lkICopZGljdCk7Ci0JaWYgKCBlcnIgKSB7Ci0JCVB5RXJyX01hYyhFcnJvck9iamVjdCwgZXJyKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJsIiwgKGxvbmcpcmVwbHkpOworICAgIGlmICgga3cgJiYgUHlPYmplY3RfSXNUcnVlKGt3KSApIHsKKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJrIiwgJmFjdGlvbikpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgZGljdCA9IGt3OworICAgIH0gZWxzZSBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImxPISIsICZhY3Rpb24sICZQeURpY3RfVHlwZSwgJmRpY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWZpbGxkaWFsb2dvcHRpb25zKGRpY3QsIE5VTEwsICZkaWFsb2dPcHRpb25zLCAmZXZlbnRQcm9jLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZXJyID0gTmF2QXNrU2F2ZUNoYW5nZXMoJmRpYWxvZ09wdGlvbnMsIGFjdGlvbiwgJnJlcGx5LCBldmVudFByb2MsICh2b2lkICopZGljdCk7CisgICAgaWYgKCBlcnIgKSB7CisgICAgICAgIFB5RXJyX01hYyhFcnJvck9iamVjdCwgZXJyKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJsIiwgKGxvbmcpcmVwbHkpOwogfQogCiBzdGF0aWMgY2hhciBuYXZfTmF2Q3VzdG9tQXNrU2F2ZUNoYW5nZXNfX2RvY19fW10gPQpAQCAtNTQ3LDI2ICs1NDcsMjYgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBuYXZfTmF2Q3VzdG9tQXNrU2F2ZUNoYW5nZXMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3cpCiB7Ci0JUHlPYmplY3QgKmRpY3Q7Ci0JTmF2RGlhbG9nT3B0aW9ucyBkaWFsb2dPcHRpb25zOwotCU5hdkFza1NhdmVDaGFuZ2VzUmVzdWx0IHJlcGx5OwotCU5hdkV2ZW50VVBQIGV2ZW50UHJvYyA9IE5VTEw7Ci0JT1NFcnIgZXJyOworICAgIFB5T2JqZWN0ICpkaWN0OworICAgIE5hdkRpYWxvZ09wdGlvbnMgZGlhbG9nT3B0aW9uczsKKyAgICBOYXZBc2tTYXZlQ2hhbmdlc1Jlc3VsdCByZXBseTsKKyAgICBOYXZFdmVudFVQUCBldmVudFByb2MgPSBOVUxMOworICAgIE9TRXJyIGVycjsKIAotCWlmICgga3cgJiYgUHlPYmplY3RfSXNUcnVlKGt3KSApIHsKLQkJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI7ZWl0aGVyIGtleXdvcmQgYXJndW1lbnRzIG9yIGRpY3Rpb25hcnkgZXhwZWN0ZWQiKSkKLQkJCXJldHVybiBOVUxMOwotCQlkaWN0ID0ga3c7Ci0JfSBlbHNlIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyEiLCAmUHlEaWN0X1R5cGUsICZkaWN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFmaWxsZGlhbG9nb3B0aW9ucyhkaWN0LCBOVUxMLCAmZGlhbG9nT3B0aW9ucywgJmV2ZW50UHJvYywgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCkpCi0JCXJldHVybiBOVUxMOwotCWVyciA9IE5hdkN1c3RvbUFza1NhdmVDaGFuZ2VzKCZkaWFsb2dPcHRpb25zLCAmcmVwbHksIGV2ZW50UHJvYywgKHZvaWQgKilkaWN0KTsKLQlpZiAoIGVyciApIHsKLQkJUHlFcnJfTWFjKEVycm9yT2JqZWN0LCBlcnIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImwiLCAobG9uZylyZXBseSk7CisgICAgaWYgKCBrdyAmJiBQeU9iamVjdF9Jc1RydWUoa3cpICkgeworICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjtlaXRoZXIga2V5d29yZCBhcmd1bWVudHMgb3IgZGljdGlvbmFyeSBleHBlY3RlZCIpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGRpY3QgPSBrdzsKKyAgICB9IGVsc2UgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPISIsICZQeURpY3RfVHlwZSwgJmRpY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWZpbGxkaWFsb2dvcHRpb25zKGRpY3QsIE5VTEwsICZkaWFsb2dPcHRpb25zLCAmZXZlbnRQcm9jLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZXJyID0gTmF2Q3VzdG9tQXNrU2F2ZUNoYW5nZXMoJmRpYWxvZ09wdGlvbnMsICZyZXBseSwgZXZlbnRQcm9jLCAodm9pZCAqKWRpY3QpOworICAgIGlmICggZXJyICkgeworICAgICAgICBQeUVycl9NYWMoRXJyb3JPYmplY3QsIGVycik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgibCIsIChsb25nKXJlcGx5KTsKIH0KIAogc3RhdGljIGNoYXIgbmF2X05hdkFza0Rpc2NhcmRDaGFuZ2VzX19kb2NfX1tdID0KQEAgLTU3NiwyNiArNTc2LDI2IEBACiBzdGF0aWMgUHlPYmplY3QgKgogbmF2X05hdkFza0Rpc2NhcmRDaGFuZ2VzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3KQogewotCVB5T2JqZWN0ICpkaWN0OwotCU5hdkRpYWxvZ09wdGlvbnMgZGlhbG9nT3B0aW9uczsKLQlOYXZBc2tTYXZlQ2hhbmdlc1Jlc3VsdCByZXBseTsKLQlOYXZFdmVudFVQUCBldmVudFByb2MgPSBOVUxMOwotCU9TRXJyIGVycjsKKyAgICBQeU9iamVjdCAqZGljdDsKKyAgICBOYXZEaWFsb2dPcHRpb25zIGRpYWxvZ09wdGlvbnM7CisgICAgTmF2QXNrU2F2ZUNoYW5nZXNSZXN1bHQgcmVwbHk7CisgICAgTmF2RXZlbnRVUFAgZXZlbnRQcm9jID0gTlVMTDsKKyAgICBPU0VyciBlcnI7CiAKLQlpZiAoIGt3ICYmIFB5T2JqZWN0X0lzVHJ1ZShrdykgKSB7Ci0JCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiO2VpdGhlciBrZXl3b3JkIGFyZ3VtZW50cyBvciBkaWN0aW9uYXJ5IGV4cGVjdGVkIikpCi0JCQlyZXR1cm4gTlVMTDsKLQkJZGljdCA9IGt3OwotCX0gZWxzZSBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8hIiwgJlB5RGljdF9UeXBlLCAmZGljdCkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZmlsbGRpYWxvZ29wdGlvbnMoZGljdCwgTlVMTCwgJmRpYWxvZ09wdGlvbnMsICZldmVudFByb2MsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpKQotCQlyZXR1cm4gTlVMTDsKLQllcnIgPSBOYXZBc2tEaXNjYXJkQ2hhbmdlcygmZGlhbG9nT3B0aW9ucywgJnJlcGx5LCBldmVudFByb2MsICh2b2lkICopZGljdCk7Ci0JaWYgKCBlcnIgKSB7Ci0JCVB5RXJyX01hYyhFcnJvck9iamVjdCwgZXJyKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJsIiwgKGxvbmcpcmVwbHkpOworICAgIGlmICgga3cgJiYgUHlPYmplY3RfSXNUcnVlKGt3KSApIHsKKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI7ZWl0aGVyIGtleXdvcmQgYXJndW1lbnRzIG9yIGRpY3Rpb25hcnkgZXhwZWN0ZWQiKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBkaWN0ID0ga3c7CisgICAgfSBlbHNlIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyEiLCAmUHlEaWN0X1R5cGUsICZkaWN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFmaWxsZGlhbG9nb3B0aW9ucyhkaWN0LCBOVUxMLCAmZGlhbG9nT3B0aW9ucywgJmV2ZW50UHJvYywgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGVyciA9IE5hdkFza0Rpc2NhcmRDaGFuZ2VzKCZkaWFsb2dPcHRpb25zLCAmcmVwbHksIGV2ZW50UHJvYywgKHZvaWQgKilkaWN0KTsKKyAgICBpZiAoIGVyciApIHsKKyAgICAgICAgUHlFcnJfTWFjKEVycm9yT2JqZWN0LCBlcnIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImwiLCAobG9uZylyZXBseSk7CiB9CiAKIHN0YXRpYyBjaGFyIG5hdl9OYXZDaG9vc2VGaWxlX19kb2NfX1tdID0KQEAgLTYwNSwzMiArNjA1LDMyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogbmF2X05hdkNob29zZUZpbGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3cpCiB7Ci0JUHlPYmplY3QgKmRpY3Q7Ci0JQUVEZXNjCSpkZWZhdWx0TG9jYXRpb24gPSBOVUxMOwotCU5hdlJlcGx5UmVjb3JkIHJlcGx5OwotCU5hdkRpYWxvZ09wdGlvbnMgZGlhbG9nT3B0aW9uczsKLQlOYXZFdmVudFVQUCBldmVudFByb2MgPSBOVUxMOwotCU5hdlByZXZpZXdVUFAgcHJldmlld1Byb2MgPSBOVUxMOwotCU5hdk9iamVjdEZpbHRlclVQUCBmaWx0ZXJQcm9jID0gTlVMTDsKLQlOYXZUeXBlTGlzdEhhbmRsZSB0eXBlTGlzdCA9IE5VTEw7Ci0JT1NFcnIgZXJyOworICAgIFB5T2JqZWN0ICpkaWN0OworICAgIEFFRGVzYyAgICAgICpkZWZhdWx0TG9jYXRpb24gPSBOVUxMOworICAgIE5hdlJlcGx5UmVjb3JkIHJlcGx5OworICAgIE5hdkRpYWxvZ09wdGlvbnMgZGlhbG9nT3B0aW9uczsKKyAgICBOYXZFdmVudFVQUCBldmVudFByb2MgPSBOVUxMOworICAgIE5hdlByZXZpZXdVUFAgcHJldmlld1Byb2MgPSBOVUxMOworICAgIE5hdk9iamVjdEZpbHRlclVQUCBmaWx0ZXJQcm9jID0gTlVMTDsKKyAgICBOYXZUeXBlTGlzdEhhbmRsZSB0eXBlTGlzdCA9IE5VTEw7CisgICAgT1NFcnIgZXJyOwogCi0JaWYgKCBrdyAmJiBQeU9iamVjdF9Jc1RydWUoa3cpICkgewotCQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjtlaXRoZXIga2V5d29yZCBhcmd1bWVudHMgb3IgZGljdGlvbmFyeSBleHBlY3RlZCIpKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWRpY3QgPSBrdzsKLQl9IGVsc2UgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPISIsICZQeURpY3RfVHlwZSwgJmRpY3QpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWZpbGxkaWFsb2dvcHRpb25zKGRpY3QsICZkZWZhdWx0TG9jYXRpb24sICZkaWFsb2dPcHRpb25zLCAmZXZlbnRQcm9jLCAmcHJldmlld1Byb2MsICZmaWx0ZXJQcm9jLCAmdHlwZUxpc3QsIE5VTEwsIE5VTEwpKQotCQlyZXR1cm4gTlVMTDsKLQllcnIgPSBOYXZDaG9vc2VGaWxlKGRlZmF1bHRMb2NhdGlvbiwgJnJlcGx5LCAmZGlhbG9nT3B0aW9ucywKLQkJCWV2ZW50UHJvYywgcHJldmlld1Byb2MsIGZpbHRlclByb2MsIHR5cGVMaXN0LCAodm9pZCAqKWRpY3QpOwotCVB5TWVtX0RFTChkZWZhdWx0TG9jYXRpb24pOwotCWlmICggZXJyICkgewotCQlQeUVycl9NYWMoRXJyb3JPYmplY3QsIGVycik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gKFB5T2JqZWN0ICopbmV3bmF2cnJvYmplY3QoJnJlcGx5KTsKKyAgICBpZiAoIGt3ICYmIFB5T2JqZWN0X0lzVHJ1ZShrdykgKSB7CisgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiO2VpdGhlciBrZXl3b3JkIGFyZ3VtZW50cyBvciBkaWN0aW9uYXJ5IGV4cGVjdGVkIikpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgZGljdCA9IGt3OworICAgIH0gZWxzZSBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8hIiwgJlB5RGljdF9UeXBlLCAmZGljdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZmlsbGRpYWxvZ29wdGlvbnMoZGljdCwgJmRlZmF1bHRMb2NhdGlvbiwgJmRpYWxvZ09wdGlvbnMsICZldmVudFByb2MsICZwcmV2aWV3UHJvYywgJmZpbHRlclByb2MsICZ0eXBlTGlzdCwgTlVMTCwgTlVMTCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGVyciA9IE5hdkNob29zZUZpbGUoZGVmYXVsdExvY2F0aW9uLCAmcmVwbHksICZkaWFsb2dPcHRpb25zLAorICAgICAgICAgICAgICAgICAgICBldmVudFByb2MsIHByZXZpZXdQcm9jLCBmaWx0ZXJQcm9jLCB0eXBlTGlzdCwgKHZvaWQgKilkaWN0KTsKKyAgICBQeU1lbV9ERUwoZGVmYXVsdExvY2F0aW9uKTsKKyAgICBpZiAoIGVyciApIHsKKyAgICAgICAgUHlFcnJfTWFjKEVycm9yT2JqZWN0LCBlcnIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIChQeU9iamVjdCAqKW5ld25hdnJyb2JqZWN0KCZyZXBseSk7CiB9CiAKIHN0YXRpYyBjaGFyIG5hdl9OYXZDaG9vc2VGb2xkZXJfX2RvY19fW10gPQpAQCAtNjQwLDMwICs2NDAsMzAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBuYXZfTmF2Q2hvb3NlRm9sZGVyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3KQogewotCVB5T2JqZWN0ICpkaWN0OwotCUFFRGVzYwkqZGVmYXVsdExvY2F0aW9uID0gTlVMTDsKLQlOYXZSZXBseVJlY29yZCByZXBseTsKLQlOYXZEaWFsb2dPcHRpb25zIGRpYWxvZ09wdGlvbnM7Ci0JTmF2RXZlbnRVUFAgZXZlbnRQcm9jID0gTlVMTDsKLQlOYXZPYmplY3RGaWx0ZXJVUFAgZmlsdGVyUHJvYyA9IE5VTEw7Ci0JT1NFcnIgZXJyOworICAgIFB5T2JqZWN0ICpkaWN0OworICAgIEFFRGVzYyAgICAgICpkZWZhdWx0TG9jYXRpb24gPSBOVUxMOworICAgIE5hdlJlcGx5UmVjb3JkIHJlcGx5OworICAgIE5hdkRpYWxvZ09wdGlvbnMgZGlhbG9nT3B0aW9uczsKKyAgICBOYXZFdmVudFVQUCBldmVudFByb2MgPSBOVUxMOworICAgIE5hdk9iamVjdEZpbHRlclVQUCBmaWx0ZXJQcm9jID0gTlVMTDsKKyAgICBPU0VyciBlcnI7CiAKLQlpZiAoIGt3ICYmIFB5T2JqZWN0X0lzVHJ1ZShrdykgKSB7Ci0JCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiO2VpdGhlciBrZXl3b3JkIGFyZ3VtZW50cyBvciBkaWN0aW9uYXJ5IGV4cGVjdGVkIikpCi0JCQlyZXR1cm4gTlVMTDsKLQkJZGljdCA9IGt3OwotCX0gZWxzZSBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8hIiwgJlB5RGljdF9UeXBlLCAmZGljdCkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZmlsbGRpYWxvZ29wdGlvbnMoZGljdCwgJmRlZmF1bHRMb2NhdGlvbiwgJmRpYWxvZ09wdGlvbnMsICZldmVudFByb2MsIE5VTEwsICZmaWx0ZXJQcm9jLCBOVUxMLCBOVUxMLCBOVUxMKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZXJyID0gTmF2Q2hvb3NlRm9sZGVyKGRlZmF1bHRMb2NhdGlvbiwgJnJlcGx5LCAmZGlhbG9nT3B0aW9ucywKLQkJCWV2ZW50UHJvYywgZmlsdGVyUHJvYywgKHZvaWQgKilkaWN0KTsKLQlQeU1lbV9ERUwoZGVmYXVsdExvY2F0aW9uKTsKLQlpZiAoIGVyciApIHsKLQkJUHlFcnJfTWFjKEVycm9yT2JqZWN0LCBlcnIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIChQeU9iamVjdCAqKW5ld25hdnJyb2JqZWN0KCZyZXBseSk7CisgICAgaWYgKCBrdyAmJiBQeU9iamVjdF9Jc1RydWUoa3cpICkgeworICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjtlaXRoZXIga2V5d29yZCBhcmd1bWVudHMgb3IgZGljdGlvbmFyeSBleHBlY3RlZCIpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGRpY3QgPSBrdzsKKyAgICB9IGVsc2UgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPISIsICZQeURpY3RfVHlwZSwgJmRpY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWZpbGxkaWFsb2dvcHRpb25zKGRpY3QsICZkZWZhdWx0TG9jYXRpb24sICZkaWFsb2dPcHRpb25zLCAmZXZlbnRQcm9jLCBOVUxMLCAmZmlsdGVyUHJvYywgTlVMTCwgTlVMTCwgTlVMTCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGVyciA9IE5hdkNob29zZUZvbGRlcihkZWZhdWx0TG9jYXRpb24sICZyZXBseSwgJmRpYWxvZ09wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgIGV2ZW50UHJvYywgZmlsdGVyUHJvYywgKHZvaWQgKilkaWN0KTsKKyAgICBQeU1lbV9ERUwoZGVmYXVsdExvY2F0aW9uKTsKKyAgICBpZiAoIGVyciApIHsKKyAgICAgICAgUHlFcnJfTWFjKEVycm9yT2JqZWN0LCBlcnIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIChQeU9iamVjdCAqKW5ld25hdnJyb2JqZWN0KCZyZXBseSk7CiB9CiAKIHN0YXRpYyBjaGFyIG5hdl9OYXZDaG9vc2VWb2x1bWVfX2RvY19fW10gPQpAQCAtNjczLDMwICs2NzMsMzAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBuYXZfTmF2Q2hvb3NlVm9sdW1lKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3KQogewotCVB5T2JqZWN0ICpkaWN0OwotCUFFRGVzYwkqZGVmYXVsdExvY2F0aW9uID0gTlVMTDsKLQlOYXZSZXBseVJlY29yZCByZXBseTsKLQlOYXZEaWFsb2dPcHRpb25zIGRpYWxvZ09wdGlvbnM7Ci0JTmF2RXZlbnRVUFAgZXZlbnRQcm9jID0gTlVMTDsKLQlOYXZPYmplY3RGaWx0ZXJVUFAgZmlsdGVyUHJvYyA9IE5VTEw7Ci0JT1NFcnIgZXJyOworICAgIFB5T2JqZWN0ICpkaWN0OworICAgIEFFRGVzYyAgICAgICpkZWZhdWx0TG9jYXRpb24gPSBOVUxMOworICAgIE5hdlJlcGx5UmVjb3JkIHJlcGx5OworICAgIE5hdkRpYWxvZ09wdGlvbnMgZGlhbG9nT3B0aW9uczsKKyAgICBOYXZFdmVudFVQUCBldmVudFByb2MgPSBOVUxMOworICAgIE5hdk9iamVjdEZpbHRlclVQUCBmaWx0ZXJQcm9jID0gTlVMTDsKKyAgICBPU0VyciBlcnI7CiAKLQlpZiAoIGt3ICYmIFB5T2JqZWN0X0lzVHJ1ZShrdykgKSB7Ci0JCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiO2VpdGhlciBrZXl3b3JkIGFyZ3VtZW50cyBvciBkaWN0aW9uYXJ5IGV4cGVjdGVkIikpCi0JCQlyZXR1cm4gTlVMTDsKLQkJZGljdCA9IGt3OwotCX0gZWxzZSBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8hIiwgJlB5RGljdF9UeXBlLCAmZGljdCkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZmlsbGRpYWxvZ29wdGlvbnMoZGljdCwgJmRlZmF1bHRMb2NhdGlvbiwgJmRpYWxvZ09wdGlvbnMsICZldmVudFByb2MsIE5VTEwsICZmaWx0ZXJQcm9jLCBOVUxMLCBOVUxMLCBOVUxMKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZXJyID0gTmF2Q2hvb3NlVm9sdW1lKGRlZmF1bHRMb2NhdGlvbiwgJnJlcGx5LCAmZGlhbG9nT3B0aW9ucywKLQkJCWV2ZW50UHJvYywgZmlsdGVyUHJvYywgKHZvaWQgKilkaWN0KTsKLQlQeU1lbV9ERUwoZGVmYXVsdExvY2F0aW9uKTsKLQlpZiAoIGVyciApIHsKLQkJUHlFcnJfTWFjKEVycm9yT2JqZWN0LCBlcnIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIChQeU9iamVjdCAqKW5ld25hdnJyb2JqZWN0KCZyZXBseSk7CisgICAgaWYgKCBrdyAmJiBQeU9iamVjdF9Jc1RydWUoa3cpICkgeworICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjtlaXRoZXIga2V5d29yZCBhcmd1bWVudHMgb3IgZGljdGlvbmFyeSBleHBlY3RlZCIpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGRpY3QgPSBrdzsKKyAgICB9IGVsc2UgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPISIsICZQeURpY3RfVHlwZSwgJmRpY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWZpbGxkaWFsb2dvcHRpb25zKGRpY3QsICZkZWZhdWx0TG9jYXRpb24sICZkaWFsb2dPcHRpb25zLCAmZXZlbnRQcm9jLCBOVUxMLCAmZmlsdGVyUHJvYywgTlVMTCwgTlVMTCwgTlVMTCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGVyciA9IE5hdkNob29zZVZvbHVtZShkZWZhdWx0TG9jYXRpb24sICZyZXBseSwgJmRpYWxvZ09wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgIGV2ZW50UHJvYywgZmlsdGVyUHJvYywgKHZvaWQgKilkaWN0KTsKKyAgICBQeU1lbV9ERUwoZGVmYXVsdExvY2F0aW9uKTsKKyAgICBpZiAoIGVyciApIHsKKyAgICAgICAgUHlFcnJfTWFjKEVycm9yT2JqZWN0LCBlcnIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIChQeU9iamVjdCAqKW5ld25hdnJyb2JqZWN0KCZyZXBseSk7CiB9CiAKIHN0YXRpYyBjaGFyIG5hdl9OYXZDaG9vc2VPYmplY3RfX2RvY19fW10gPQpAQCAtNzA2LDMwICs3MDYsMzAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBuYXZfTmF2Q2hvb3NlT2JqZWN0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3KQogewotCVB5T2JqZWN0ICpkaWN0OwotCUFFRGVzYwkqZGVmYXVsdExvY2F0aW9uID0gTlVMTDsKLQlOYXZSZXBseVJlY29yZCByZXBseTsKLQlOYXZEaWFsb2dPcHRpb25zIGRpYWxvZ09wdGlvbnM7Ci0JTmF2RXZlbnRVUFAgZXZlbnRQcm9jID0gTlVMTDsKLQlOYXZPYmplY3RGaWx0ZXJVUFAgZmlsdGVyUHJvYyA9IE5VTEw7Ci0JT1NFcnIgZXJyOworICAgIFB5T2JqZWN0ICpkaWN0OworICAgIEFFRGVzYyAgICAgICpkZWZhdWx0TG9jYXRpb24gPSBOVUxMOworICAgIE5hdlJlcGx5UmVjb3JkIHJlcGx5OworICAgIE5hdkRpYWxvZ09wdGlvbnMgZGlhbG9nT3B0aW9uczsKKyAgICBOYXZFdmVudFVQUCBldmVudFByb2MgPSBOVUxMOworICAgIE5hdk9iamVjdEZpbHRlclVQUCBmaWx0ZXJQcm9jID0gTlVMTDsKKyAgICBPU0VyciBlcnI7CiAKLQlpZiAoIGt3ICYmIFB5T2JqZWN0X0lzVHJ1ZShrdykgKSB7Ci0JCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiO2VpdGhlciBrZXl3b3JkIGFyZ3VtZW50cyBvciBkaWN0aW9uYXJ5IGV4cGVjdGVkIikpCi0JCQlyZXR1cm4gTlVMTDsKLQkJZGljdCA9IGt3OwotCX0gZWxzZSBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8hIiwgJlB5RGljdF9UeXBlLCAmZGljdCkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZmlsbGRpYWxvZ29wdGlvbnMoZGljdCwgJmRlZmF1bHRMb2NhdGlvbiwgJmRpYWxvZ09wdGlvbnMsICZldmVudFByb2MsIE5VTEwsICZmaWx0ZXJQcm9jLCBOVUxMLCBOVUxMLCBOVUxMKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZXJyID0gTmF2Q2hvb3NlT2JqZWN0KGRlZmF1bHRMb2NhdGlvbiwgJnJlcGx5LCAmZGlhbG9nT3B0aW9ucywKLQkJCWV2ZW50UHJvYywgZmlsdGVyUHJvYywgKHZvaWQgKilkaWN0KTsKLQlQeU1lbV9ERUwoZGVmYXVsdExvY2F0aW9uKTsKLQlpZiAoIGVyciApIHsKLQkJUHlFcnJfTWFjKEVycm9yT2JqZWN0LCBlcnIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIChQeU9iamVjdCAqKW5ld25hdnJyb2JqZWN0KCZyZXBseSk7CisgICAgaWYgKCBrdyAmJiBQeU9iamVjdF9Jc1RydWUoa3cpICkgeworICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjtlaXRoZXIga2V5d29yZCBhcmd1bWVudHMgb3IgZGljdGlvbmFyeSBleHBlY3RlZCIpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGRpY3QgPSBrdzsKKyAgICB9IGVsc2UgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPISIsICZQeURpY3RfVHlwZSwgJmRpY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWZpbGxkaWFsb2dvcHRpb25zKGRpY3QsICZkZWZhdWx0TG9jYXRpb24sICZkaWFsb2dPcHRpb25zLCAmZXZlbnRQcm9jLCBOVUxMLCAmZmlsdGVyUHJvYywgTlVMTCwgTlVMTCwgTlVMTCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGVyciA9IE5hdkNob29zZU9iamVjdChkZWZhdWx0TG9jYXRpb24sICZyZXBseSwgJmRpYWxvZ09wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgIGV2ZW50UHJvYywgZmlsdGVyUHJvYywgKHZvaWQgKilkaWN0KTsKKyAgICBQeU1lbV9ERUwoZGVmYXVsdExvY2F0aW9uKTsKKyAgICBpZiAoIGVyciApIHsKKyAgICAgICAgUHlFcnJfTWFjKEVycm9yT2JqZWN0LCBlcnIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIChQeU9iamVjdCAqKW5ld25hdnJyb2JqZWN0KCZyZXBseSk7CiB9CiAKIHN0YXRpYyBjaGFyIG5hdl9OYXZOZXdGb2xkZXJfX2RvY19fW10gPQpAQCAtNzM5LDI4ICs3MzksMjggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBuYXZfTmF2TmV3Rm9sZGVyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3KQogewotCVB5T2JqZWN0ICpkaWN0OwotCUFFRGVzYwkqZGVmYXVsdExvY2F0aW9uID0gTlVMTDsKLQlOYXZSZXBseVJlY29yZCByZXBseTsKLQlOYXZEaWFsb2dPcHRpb25zIGRpYWxvZ09wdGlvbnM7Ci0JTmF2RXZlbnRVUFAgZXZlbnRQcm9jID0gTlVMTDsKLQlPU0VyciBlcnI7CisgICAgUHlPYmplY3QgKmRpY3Q7CisgICAgQUVEZXNjICAgICAgKmRlZmF1bHRMb2NhdGlvbiA9IE5VTEw7CisgICAgTmF2UmVwbHlSZWNvcmQgcmVwbHk7CisgICAgTmF2RGlhbG9nT3B0aW9ucyBkaWFsb2dPcHRpb25zOworICAgIE5hdkV2ZW50VVBQIGV2ZW50UHJvYyA9IE5VTEw7CisgICAgT1NFcnIgZXJyOwogCi0JaWYgKCBrdyAmJiBQeU9iamVjdF9Jc1RydWUoa3cpICkgewotCQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjtlaXRoZXIga2V5d29yZCBhcmd1bWVudHMgb3IgZGljdGlvbmFyeSBleHBlY3RlZCIpKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWRpY3QgPSBrdzsKLQl9IGVsc2UgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPISIsICZQeURpY3RfVHlwZSwgJmRpY3QpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWZpbGxkaWFsb2dvcHRpb25zKGRpY3QsICZkZWZhdWx0TG9jYXRpb24sICZkaWFsb2dPcHRpb25zLCAmZXZlbnRQcm9jLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZXJyID0gTmF2TmV3Rm9sZGVyKGRlZmF1bHRMb2NhdGlvbiwgJnJlcGx5LCAmZGlhbG9nT3B0aW9ucywgZXZlbnRQcm9jLCAodm9pZCAqKWRpY3QpOwotCVB5TWVtX0RFTChkZWZhdWx0TG9jYXRpb24pOwotCWlmICggZXJyICkgewotCQlQeUVycl9NYWMoRXJyb3JPYmplY3QsIGVycik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gKFB5T2JqZWN0ICopbmV3bmF2cnJvYmplY3QoJnJlcGx5KTsKKyAgICBpZiAoIGt3ICYmIFB5T2JqZWN0X0lzVHJ1ZShrdykgKSB7CisgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiO2VpdGhlciBrZXl3b3JkIGFyZ3VtZW50cyBvciBkaWN0aW9uYXJ5IGV4cGVjdGVkIikpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgZGljdCA9IGt3OworICAgIH0gZWxzZSBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8hIiwgJlB5RGljdF9UeXBlLCAmZGljdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZmlsbGRpYWxvZ29wdGlvbnMoZGljdCwgJmRlZmF1bHRMb2NhdGlvbiwgJmRpYWxvZ09wdGlvbnMsICZldmVudFByb2MsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBlcnIgPSBOYXZOZXdGb2xkZXIoZGVmYXVsdExvY2F0aW9uLCAmcmVwbHksICZkaWFsb2dPcHRpb25zLCBldmVudFByb2MsICh2b2lkICopZGljdCk7CisgICAgUHlNZW1fREVMKGRlZmF1bHRMb2NhdGlvbik7CisgICAgaWYgKCBlcnIgKSB7CisgICAgICAgIFB5RXJyX01hYyhFcnJvck9iamVjdCwgZXJyKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiAoUHlPYmplY3QgKiluZXduYXZycm9iamVjdCgmcmVwbHkpOwogfQogCiAjaWYgMApAQCAtNzc0LDEwICs3NzQsMTAgQEAKIG5hdl9OYXZDdXN0b21Db250cm9sKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAjZW5kaWYKIApAQCAtNzg4LDExICs3ODgsMTEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBuYXZfTmF2U2VydmljZXNDYW5SdW4oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCUJvb2xlYW4gcnY7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcnYgPSBOYXZTZXJ2aWNlc0NhblJ1bigpOwotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJsIiwgKGxvbmcpcnYpOworICAgIEJvb2xlYW4gcnY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcnYgPSBOYXZTZXJ2aWNlc0NhblJ1bigpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJsIiwgKGxvbmcpcnYpOwogfQogCiBzdGF0aWMgY2hhciBuYXZfTmF2U2VydmljZXNBdmFpbGFibGVfX2RvY19fW10gPQpAQCAtODAyLDEyICs4MDIsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBuYXZfTmF2U2VydmljZXNBdmFpbGFibGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCUJvb2xlYW4gcnY7Ci0JCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcnYgPSBOYXZTZXJ2aWNlc0F2YWlsYWJsZSgpOwotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJsIiwgKGxvbmcpcnYpOworICAgIEJvb2xlYW4gcnY7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBydiA9IE5hdlNlcnZpY2VzQXZhaWxhYmxlKCk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImwiLCAobG9uZylydik7CiB9CiAvKiBYWCAqLwogc3RhdGljIGNoYXIgbmF2X05hdkxvYWRfX2RvY19fW10gPQpAQCAtODE4LDExICs4MTgsMTEgQEAKIG5hdl9OYXZMb2FkKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCU5hdkxvYWQoKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTmF2TG9hZCgpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIGNoYXIgbmF2X05hdlVubG9hZF9fZG9jX19bXSA9CkBAIC04MzMsMTEgKzgzMywxMSBAQAogbmF2X05hdlVubG9hZChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlOYXZVbmxvYWQoKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTmF2VW5sb2FkKCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgY2hhciBuYXZfTmF2TGlicmFyeVZlcnNpb25fX2RvY19fW10gPQpAQCAtODQ3LDEyICs4NDcsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBuYXZfTmF2TGlicmFyeVZlcnNpb24oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVVJbnQzMiBydjsKLQkKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlydiA9IE5hdkxpYnJhcnlWZXJzaW9uKCk7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImwiLCAobG9uZylydik7CisgICAgVUludDMyIHJ2OworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcnYgPSBOYXZMaWJyYXJ5VmVyc2lvbigpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJsIiwgKGxvbmcpcnYpOwogfQogCiBzdGF0aWMgY2hhciBuYXZfTmF2R2V0RGVmYXVsdERpYWxvZ09wdGlvbnNfX2RvY19fW10gPQpAQCAtODYyLDU5ICs4NjIsNTkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBuYXZfTmF2R2V0RGVmYXVsdERpYWxvZ09wdGlvbnMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCU5hdkRpYWxvZ09wdGlvbnMgZGlhbG9nT3B0aW9uczsKLQlPU0VyciBlcnI7Ci0JCi0JZXJyID0gTmF2R2V0RGVmYXVsdERpYWxvZ09wdGlvbnMoJmRpYWxvZ09wdGlvbnMpOwotCWlmICggZXJyICkgewotCQlQeUVycl9NYWMoRXJyb3JPYmplY3QsIGVycik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgKLQkJCSJ7czpoLHM6bCxzOk8mLHM6TyYsczpPJixzOk8mLHM6TyYsczpPJixzOk8mLHM6TyYsczpPJn0iLAotCQkidmVyc2lvbiIsIGRpYWxvZ09wdGlvbnMudmVyc2lvbiwKLQkJImRpYWxvZ09wdGlvbkZsYWdzIiwgZGlhbG9nT3B0aW9ucy5kaWFsb2dPcHRpb25GbGFncywKLQkJImxvY2F0aW9uIiwgUHlNYWNfQnVpbGRQb2ludCwgZGlhbG9nT3B0aW9ucy5sb2NhdGlvbiwKLQkJImNsaWVudE5hbWUiLCBQeU1hY19CdWlsZFN0cjI1NSwgJmRpYWxvZ09wdGlvbnMuY2xpZW50TmFtZSwKLQkJIndpbmRvd1RpdGxlIiwgUHlNYWNfQnVpbGRTdHIyNTUsICZkaWFsb2dPcHRpb25zLndpbmRvd1RpdGxlLAotCQkiYWN0aW9uQnV0dG9uTGFiZWwiLCBQeU1hY19CdWlsZFN0cjI1NSwgJmRpYWxvZ09wdGlvbnMuYWN0aW9uQnV0dG9uTGFiZWwsCi0JCSJjYW5jZWxCdXR0b25MYWJlbCIsIFB5TWFjX0J1aWxkU3RyMjU1LCAmZGlhbG9nT3B0aW9ucy5jYW5jZWxCdXR0b25MYWJlbCwKLQkJInNhdmVkRmlsZU5hbWUiLCBQeU1hY19CdWlsZFN0cjI1NSwgJmRpYWxvZ09wdGlvbnMuc2F2ZWRGaWxlTmFtZSwKLQkJIm1lc3NhZ2UiLCBQeU1hY19CdWlsZFN0cjI1NSwgJmRpYWxvZ09wdGlvbnMubWVzc2FnZSwKLQkJInByZWZlcmVuY2VLZXkiLCBQeU1hY19CdWlsZE9TVHlwZSwgZGlhbG9nT3B0aW9ucy5wcmVmZXJlbmNlS2V5Ci0JCSwicG9wdXBFeHRlbnNpb24iLCBPcHRSZXNPYmpfTmV3LCBkaWFsb2dPcHRpb25zLnBvcHVwRXh0ZW5zaW9uCi0JCSk7CisgICAgTmF2RGlhbG9nT3B0aW9ucyBkaWFsb2dPcHRpb25zOworICAgIE9TRXJyIGVycjsKKworICAgIGVyciA9IE5hdkdldERlZmF1bHREaWFsb2dPcHRpb25zKCZkaWFsb2dPcHRpb25zKTsKKyAgICBpZiAoIGVyciApIHsKKyAgICAgICAgUHlFcnJfTWFjKEVycm9yT2JqZWN0LCBlcnIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoCisgICAgICAgICAgICAgICAgICAgICJ7czpoLHM6bCxzOk8mLHM6TyYsczpPJixzOk8mLHM6TyYsczpPJixzOk8mLHM6TyYsczpPJn0iLAorICAgICAgICAidmVyc2lvbiIsIGRpYWxvZ09wdGlvbnMudmVyc2lvbiwKKyAgICAgICAgImRpYWxvZ09wdGlvbkZsYWdzIiwgZGlhbG9nT3B0aW9ucy5kaWFsb2dPcHRpb25GbGFncywKKyAgICAgICAgImxvY2F0aW9uIiwgUHlNYWNfQnVpbGRQb2ludCwgZGlhbG9nT3B0aW9ucy5sb2NhdGlvbiwKKyAgICAgICAgImNsaWVudE5hbWUiLCBQeU1hY19CdWlsZFN0cjI1NSwgJmRpYWxvZ09wdGlvbnMuY2xpZW50TmFtZSwKKyAgICAgICAgIndpbmRvd1RpdGxlIiwgUHlNYWNfQnVpbGRTdHIyNTUsICZkaWFsb2dPcHRpb25zLndpbmRvd1RpdGxlLAorICAgICAgICAiYWN0aW9uQnV0dG9uTGFiZWwiLCBQeU1hY19CdWlsZFN0cjI1NSwgJmRpYWxvZ09wdGlvbnMuYWN0aW9uQnV0dG9uTGFiZWwsCisgICAgICAgICJjYW5jZWxCdXR0b25MYWJlbCIsIFB5TWFjX0J1aWxkU3RyMjU1LCAmZGlhbG9nT3B0aW9ucy5jYW5jZWxCdXR0b25MYWJlbCwKKyAgICAgICAgInNhdmVkRmlsZU5hbWUiLCBQeU1hY19CdWlsZFN0cjI1NSwgJmRpYWxvZ09wdGlvbnMuc2F2ZWRGaWxlTmFtZSwKKyAgICAgICAgIm1lc3NhZ2UiLCBQeU1hY19CdWlsZFN0cjI1NSwgJmRpYWxvZ09wdGlvbnMubWVzc2FnZSwKKyAgICAgICAgInByZWZlcmVuY2VLZXkiLCBQeU1hY19CdWlsZE9TVHlwZSwgZGlhbG9nT3B0aW9ucy5wcmVmZXJlbmNlS2V5CisgICAgICAgICwicG9wdXBFeHRlbnNpb24iLCBPcHRSZXNPYmpfTmV3LCBkaWFsb2dPcHRpb25zLnBvcHVwRXh0ZW5zaW9uCisgICAgICAgICk7CiB9CiAKIC8qIExpc3Qgb2YgbWV0aG9kcyBkZWZpbmVkIGluIHRoZSBtb2R1bGUgKi8KIAogc3RhdGljIHN0cnVjdCBQeU1ldGhvZERlZiBuYXZfbWV0aG9kc1tdID0gewotCXsiTmF2R2V0RmlsZSIsCShQeUNGdW5jdGlvbiluYXZfTmF2R2V0RmlsZSwJTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsCW5hdl9OYXZHZXRGaWxlX19kb2NfX30sCi0geyJOYXZQdXRGaWxlIiwJKFB5Q0Z1bmN0aW9uKW5hdl9OYXZQdXRGaWxlLAlNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywJbmF2X05hdlB1dEZpbGVfX2RvY19ffSwKLSB7Ik5hdkFza1NhdmVDaGFuZ2VzIiwJKFB5Q0Z1bmN0aW9uKW5hdl9OYXZBc2tTYXZlQ2hhbmdlcywJTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsCW5hdl9OYXZBc2tTYXZlQ2hhbmdlc19fZG9jX199LAotIHsiTmF2Q3VzdG9tQXNrU2F2ZUNoYW5nZXMiLAkoUHlDRnVuY3Rpb24pbmF2X05hdkN1c3RvbUFza1NhdmVDaGFuZ2VzLAlNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywJbmF2X05hdkN1c3RvbUFza1NhdmVDaGFuZ2VzX19kb2NfX30sCi0geyJOYXZBc2tEaXNjYXJkQ2hhbmdlcyIsCShQeUNGdW5jdGlvbiluYXZfTmF2QXNrRGlzY2FyZENoYW5nZXMsCU1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLAluYXZfTmF2QXNrRGlzY2FyZENoYW5nZXNfX2RvY19ffSwKLSB7Ik5hdkNob29zZUZpbGUiLAkoUHlDRnVuY3Rpb24pbmF2X05hdkNob29zZUZpbGUsCU1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLAluYXZfTmF2Q2hvb3NlRmlsZV9fZG9jX199LAotIHsiTmF2Q2hvb3NlRm9sZGVyIiwJKFB5Q0Z1bmN0aW9uKW5hdl9OYXZDaG9vc2VGb2xkZXIsCU1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLAluYXZfTmF2Q2hvb3NlRm9sZGVyX19kb2NfX30sCi0geyJOYXZDaG9vc2VWb2x1bWUiLAkoUHlDRnVuY3Rpb24pbmF2X05hdkNob29zZVZvbHVtZSwJTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsCW5hdl9OYXZDaG9vc2VWb2x1bWVfX2RvY19ffSwKLSB7Ik5hdkNob29zZU9iamVjdCIsCShQeUNGdW5jdGlvbiluYXZfTmF2Q2hvb3NlT2JqZWN0LAlNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywJbmF2X05hdkNob29zZU9iamVjdF9fZG9jX199LAotIHsiTmF2TmV3Rm9sZGVyIiwJKFB5Q0Z1bmN0aW9uKW5hdl9OYXZOZXdGb2xkZXIsCU1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLAluYXZfTmF2TmV3Rm9sZGVyX19kb2NfX30sCisgICAgeyJOYXZHZXRGaWxlIiwgICAgICAoUHlDRnVuY3Rpb24pbmF2X05hdkdldEZpbGUsICAgIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLCAgICAgbmF2X05hdkdldEZpbGVfX2RvY19ffSwKKyB7Ik5hdlB1dEZpbGUiLCAoUHlDRnVuY3Rpb24pbmF2X05hdlB1dEZpbGUsICAgIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLCAgICAgbmF2X05hdlB1dEZpbGVfX2RvY19ffSwKKyB7Ik5hdkFza1NhdmVDaGFuZ2VzIiwgIChQeUNGdW5jdGlvbiluYXZfTmF2QXNrU2F2ZUNoYW5nZXMsICAgICBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywgICAgIG5hdl9OYXZBc2tTYXZlQ2hhbmdlc19fZG9jX199LAorIHsiTmF2Q3VzdG9tQXNrU2F2ZUNoYW5nZXMiLCAgICAoUHlDRnVuY3Rpb24pbmF2X05hdkN1c3RvbUFza1NhdmVDaGFuZ2VzLCAgICAgICBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywgICAgIG5hdl9OYXZDdXN0b21Bc2tTYXZlQ2hhbmdlc19fZG9jX199LAorIHsiTmF2QXNrRGlzY2FyZENoYW5nZXMiLCAgICAgICAoUHlDRnVuY3Rpb24pbmF2X05hdkFza0Rpc2NhcmRDaGFuZ2VzLCAgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsICAgICBuYXZfTmF2QXNrRGlzY2FyZENoYW5nZXNfX2RvY19ffSwKKyB7Ik5hdkNob29zZUZpbGUiLCAgICAgIChQeUNGdW5jdGlvbiluYXZfTmF2Q2hvb3NlRmlsZSwgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsICAgICBuYXZfTmF2Q2hvb3NlRmlsZV9fZG9jX199LAorIHsiTmF2Q2hvb3NlRm9sZGVyIiwgICAgKFB5Q0Z1bmN0aW9uKW5hdl9OYXZDaG9vc2VGb2xkZXIsICAgICAgIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLCAgICAgbmF2X05hdkNob29zZUZvbGRlcl9fZG9jX199LAorIHsiTmF2Q2hvb3NlVm9sdW1lIiwgICAgKFB5Q0Z1bmN0aW9uKW5hdl9OYXZDaG9vc2VWb2x1bWUsICAgICAgIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLCAgICAgbmF2X05hdkNob29zZVZvbHVtZV9fZG9jX199LAorIHsiTmF2Q2hvb3NlT2JqZWN0IiwgICAgKFB5Q0Z1bmN0aW9uKW5hdl9OYXZDaG9vc2VPYmplY3QsICAgICAgIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLCAgICAgbmF2X05hdkNob29zZU9iamVjdF9fZG9jX199LAorIHsiTmF2TmV3Rm9sZGVyIiwgICAgICAgKFB5Q0Z1bmN0aW9uKW5hdl9OYXZOZXdGb2xkZXIsICBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywgICAgIG5hdl9OYXZOZXdGb2xkZXJfX2RvY19ffSwKICNpZiAwCi0geyJOYXZDdXN0b21Db250cm9sIiwJKFB5Q0Z1bmN0aW9uKW5hdl9OYXZDdXN0b21Db250cm9sLAlNRVRIX1ZBUkFSR1MsCW5hdl9OYXZDdXN0b21Db250cm9sX19kb2NfX30sCisgeyJOYXZDdXN0b21Db250cm9sIiwgICAoUHlDRnVuY3Rpb24pbmF2X05hdkN1c3RvbUNvbnRyb2wsICAgICAgTUVUSF9WQVJBUkdTLCAgIG5hdl9OYXZDdXN0b21Db250cm9sX19kb2NfX30sCiAjZW5kaWYKLSB7Ik5hdlNlcnZpY2VzQ2FuUnVuIiwJKFB5Q0Z1bmN0aW9uKW5hdl9OYXZTZXJ2aWNlc0NhblJ1biwJTUVUSF9WQVJBUkdTLAluYXZfTmF2U2VydmljZXNDYW5SdW5fX2RvY19ffSwKLSB7Ik5hdlNlcnZpY2VzQXZhaWxhYmxlIiwJKFB5Q0Z1bmN0aW9uKW5hdl9OYXZTZXJ2aWNlc0F2YWlsYWJsZSwJTUVUSF9WQVJBUkdTLAluYXZfTmF2U2VydmljZXNBdmFpbGFibGVfX2RvY19ffSwKLSB7Ik5hdkxvYWQiLAkoUHlDRnVuY3Rpb24pbmF2X05hdkxvYWQsCU1FVEhfVkFSQVJHUywJbmF2X05hdkxvYWRfX2RvY19ffSwKLSB7Ik5hdlVubG9hZCIsCShQeUNGdW5jdGlvbiluYXZfTmF2VW5sb2FkLAlNRVRIX1ZBUkFSR1MsCW5hdl9OYXZVbmxvYWRfX2RvY19ffSwKLSB7Ik5hdkxpYnJhcnlWZXJzaW9uIiwJKFB5Q0Z1bmN0aW9uKW5hdl9OYXZMaWJyYXJ5VmVyc2lvbiwJTUVUSF9WQVJBUkdTLAluYXZfTmF2TGlicmFyeVZlcnNpb25fX2RvY19ffSwKLSB7Ik5hdkdldERlZmF1bHREaWFsb2dPcHRpb25zIiwJKFB5Q0Z1bmN0aW9uKW5hdl9OYXZHZXREZWZhdWx0RGlhbG9nT3B0aW9ucywJTUVUSF9WQVJBUkdTLAluYXZfTmF2R2V0RGVmYXVsdERpYWxvZ09wdGlvbnNfX2RvY19ffSwKLQl7TlVMTCwJIChQeUNGdW5jdGlvbilOVUxMLCAwLCBOVUxMfQkJLyogc2VudGluZWwgKi8KKyB7Ik5hdlNlcnZpY2VzQ2FuUnVuIiwgIChQeUNGdW5jdGlvbiluYXZfTmF2U2VydmljZXNDYW5SdW4sICAgICBNRVRIX1ZBUkFSR1MsICAgbmF2X05hdlNlcnZpY2VzQ2FuUnVuX19kb2NfX30sCisgeyJOYXZTZXJ2aWNlc0F2YWlsYWJsZSIsICAgICAgIChQeUNGdW5jdGlvbiluYXZfTmF2U2VydmljZXNBdmFpbGFibGUsICBNRVRIX1ZBUkFSR1MsICAgbmF2X05hdlNlcnZpY2VzQXZhaWxhYmxlX19kb2NfX30sCisgeyJOYXZMb2FkIiwgICAgKFB5Q0Z1bmN0aW9uKW5hdl9OYXZMb2FkLCAgICAgICBNRVRIX1ZBUkFSR1MsICAgbmF2X05hdkxvYWRfX2RvY19ffSwKKyB7Ik5hdlVubG9hZCIsICAoUHlDRnVuY3Rpb24pbmF2X05hdlVubG9hZCwgICAgIE1FVEhfVkFSQVJHUywgICBuYXZfTmF2VW5sb2FkX19kb2NfX30sCisgeyJOYXZMaWJyYXJ5VmVyc2lvbiIsICAoUHlDRnVuY3Rpb24pbmF2X05hdkxpYnJhcnlWZXJzaW9uLCAgICAgTUVUSF9WQVJBUkdTLCAgIG5hdl9OYXZMaWJyYXJ5VmVyc2lvbl9fZG9jX199LAorIHsiTmF2R2V0RGVmYXVsdERpYWxvZ09wdGlvbnMiLCAoUHlDRnVuY3Rpb24pbmF2X05hdkdldERlZmF1bHREaWFsb2dPcHRpb25zLCAgICBNRVRIX1ZBUkFSR1MsICAgbmF2X05hdkdldERlZmF1bHREaWFsb2dPcHRpb25zX19kb2NfX30sCisgICAge05VTEwsICAgICAgIChQeUNGdW5jdGlvbilOVUxMLCAwLCBOVUxMfSAgICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiAKIC8qIEluaXRpYWxpemF0aW9uIGZ1bmN0aW9uIGZvciB0aGUgbW9kdWxlICgqbXVzdCogYmUgY2FsbGVkIGluaXROYXYpICovCiAKLXN0YXRpYyBjaGFyIE5hdl9tb2R1bGVfZG9jdW1lbnRhdGlvbltdID0gCitzdGF0aWMgY2hhciBOYXZfbW9kdWxlX2RvY3VtZW50YXRpb25bXSA9CiAiSW50ZXJmYWNlIHRvIE5hdmlnYXRpb24gU2VydmljZXNcbiIKICJNb3N0IGNhbGxzIGFjY2VwdCBhIE5hdkRpYWxvZ09wdGlvbnMgZGljdGlvbmFyeSBvciBrZXl3b3JkcyB3aXRoIHRoZSBzYW1lIG5hbWVzLCBwYXNzIHt9XG4iCiAiaWYgeW91IHdhbnQgdGhlIGRlZmF1bHQgb3B0aW9ucy5cbiIKQEAgLTkzMCwzOSArOTMwLDM5IEBACiB2b2lkCiBpbml0TmF2KHZvaWQpCiB7Ci0JUHlPYmplY3QgKm0sICpkOwotCQotCWlmIChQeUVycl9XYXJuUHkzaygiSW4gMy54LCBOYXYgaXMgcmVtb3ZlZC4iLCAxKSkKLQkJcmV0dXJuOworICAgIFB5T2JqZWN0ICptLCAqZDsKKworICAgIGlmIChQeUVycl9XYXJuUHkzaygiSW4gMy54LCBOYXYgaXMgcmVtb3ZlZC4iLCAxKSkKKyAgICAgICAgcmV0dXJuOwogCiAjaWZkZWYgX19MUDY0X18KLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW1wb3J0RXJyb3IsICJOYXZpZ2F0aW9uIFNlcnZpY2VzIG5vdCBhdmFpbGFibGUgaW4gNjQtYml0IG1vZGUiKTsKLQlyZXR1cm47CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0ltcG9ydEVycm9yLCAiTmF2aWdhdGlvbiBTZXJ2aWNlcyBub3QgYXZhaWxhYmxlIGluIDY0LWJpdCBtb2RlIik7CisgICAgcmV0dXJuOwogCi0jZWxzZQkvKiAhX19MUDY0X18gKi8KKyNlbHNlICAgLyogIV9fTFA2NF9fICovCiAKLQkvKiBUZXN0IHRoYXQgd2UgaGF2ZSBOYXZTZXJ2aWNlcyAqLwotCWlmICggIU5hdlNlcnZpY2VzQXZhaWxhYmxlKCkgKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwgIk5hdmlnYXRpb24gU2VydmljZXMgbm90IGF2YWlsYWJsZSIpOwotCQlyZXR1cm47Ci0JfQotCS8qIENyZWF0ZSB0aGUgbW9kdWxlIGFuZCBhZGQgdGhlIGZ1bmN0aW9ucyAqLwotCW0gPSBQeV9Jbml0TW9kdWxlNCgiTmF2IiwgbmF2X21ldGhvZHMsCi0JCU5hdl9tb2R1bGVfZG9jdW1lbnRhdGlvbiwKLQkJKFB5T2JqZWN0KilOVUxMLFBZVEhPTl9BUElfVkVSU0lPTik7CisgICAgLyogVGVzdCB0aGF0IHdlIGhhdmUgTmF2U2VydmljZXMgKi8KKyAgICBpZiAoICFOYXZTZXJ2aWNlc0F2YWlsYWJsZSgpICkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW1wb3J0RXJyb3IsICJOYXZpZ2F0aW9uIFNlcnZpY2VzIG5vdCBhdmFpbGFibGUiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvKiBDcmVhdGUgdGhlIG1vZHVsZSBhbmQgYWRkIHRoZSBmdW5jdGlvbnMgKi8KKyAgICBtID0gUHlfSW5pdE1vZHVsZTQoIk5hdiIsIG5hdl9tZXRob2RzLAorICAgICAgICBOYXZfbW9kdWxlX2RvY3VtZW50YXRpb24sCisgICAgICAgIChQeU9iamVjdCopTlVMTCxQWVRIT05fQVBJX1ZFUlNJT04pOwogCi0JLyogQWRkIHNvbWUgc3ltYm9saWMgY29uc3RhbnRzIHRvIHRoZSBtb2R1bGUgKi8KLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQlFcnJvck9iamVjdCA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIk5hdi5lcnJvciIpOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJlcnJvciIsIEVycm9yT2JqZWN0KTsKKyAgICAvKiBBZGQgc29tZSBzeW1ib2xpYyBjb25zdGFudHMgdG8gdGhlIG1vZHVsZSAqLworICAgIGQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOworICAgIEVycm9yT2JqZWN0ID0gUHlTdHJpbmdfRnJvbVN0cmluZygiTmF2LmVycm9yIik7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgImVycm9yIiwgRXJyb3JPYmplY3QpOwogCi0JLyogWFhYWCBBZGQgY29uc3RhbnRzIGhlcmUgKi8KLQkKLQkvKiBTZXQgVVBQcyAqLwotCW15X2V2ZW50UHJvY1VQUCA9IE5ld05hdkV2ZW50VVBQKG15X2V2ZW50UHJvYyk7Ci0JbXlfcHJldmlld1Byb2NVUFAgPSBOZXdOYXZQcmV2aWV3VVBQKG15X3ByZXZpZXdQcm9jKTsKLQlteV9maWx0ZXJQcm9jVVBQID0gTmV3TmF2T2JqZWN0RmlsdGVyVVBQKG15X2ZpbHRlclByb2MpOworICAgIC8qIFhYWFggQWRkIGNvbnN0YW50cyBoZXJlICovCisKKyAgICAvKiBTZXQgVVBQcyAqLworICAgIG15X2V2ZW50UHJvY1VQUCA9IE5ld05hdkV2ZW50VVBQKG15X2V2ZW50UHJvYyk7CisgICAgbXlfcHJldmlld1Byb2NVUFAgPSBOZXdOYXZQcmV2aWV3VVBQKG15X3ByZXZpZXdQcm9jKTsKKyAgICBteV9maWx0ZXJQcm9jVVBQID0gTmV3TmF2T2JqZWN0RmlsdGVyVVBQKG15X2ZpbHRlclByb2MpOwogI2VuZGlmIC8qICFfX0xQNjRfXyAqLwotCQorCiB9CiAKZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL09TQVRlcm1pbm9sb2d5LmMgYi9NYWMvTW9kdWxlcy9PU0FUZXJtaW5vbG9neS5jCmluZGV4IGU1NmEwZGIuLjBiNzZiM2UgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL09TQVRlcm1pbm9sb2d5LmMKKysrIGIvTWFjL01vZHVsZXMvT1NBVGVybWlub2xvZ3kuYwpAQCAtMTUsODQgKzE1LDg0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogUHlPU0FfR2V0QXBwVGVybWlub2xvZ3koUHlPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKQogewotCUFFRGVzYyB0aGVEZXNjID0gezAsMH07Ci0JRlNTcGVjIGZzczsKLQlDb21wb25lbnRJbnN0YW5jZSBkZWZhdWx0Q29tcG9uZW50ID0gTlVMTDsKLQlTSW50MTYgZGVmYXVsdFRlcm1pbm9sb2d5ID0gMDsKLQlCb29sZWFuIGRpZExhdW5jaCA9IDA7Ci0JT1NBRXJyb3IgZXJyOwotCWxvbmcgbW9kZUZsYWdzID0gMDsKLQkKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mfGkiLCBQeU1hY19HZXRGU1NwZWMsICZmc3MsICZtb2RlRmxhZ3MpKQotCQkgcmV0dXJuIE5VTEw7Ci0JCi0JZGVmYXVsdENvbXBvbmVudCA9IE9wZW5EZWZhdWx0Q29tcG9uZW50IChrT1NBQ29tcG9uZW50VHlwZSwgJ2FzY3InKTsKLQllcnIgPSBHZXRDb21wb25lbnRJbnN0YW5jZUVycm9yIChkZWZhdWx0Q29tcG9uZW50KTsKLQlpZiAoZXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoZXJyKTsKLQllcnIgPSBPU0FHZXRBcHBUZXJtaW5vbG9neSAoCi0gICAgCWRlZmF1bHRDb21wb25lbnQsIAotICAgIAltb2RlRmxhZ3MsCi0gICAgCSZmc3MsIAotICAgIAlkZWZhdWx0VGVybWlub2xvZ3ksIAotICAgIAkmZGlkTGF1bmNoLCAKLSAgICAJJnRoZURlc2MKLQkpOwotCWlmIChlcnIpIHJldHVybiBQeU1hY19FcnJvcihlcnIpOwotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJPJmkiLCBBRURlc2NfTmV3LCAmdGhlRGVzYywgZGlkTGF1bmNoKTsKKyAgICBBRURlc2MgdGhlRGVzYyA9IHswLDB9OworICAgIEZTU3BlYyBmc3M7CisgICAgQ29tcG9uZW50SW5zdGFuY2UgZGVmYXVsdENvbXBvbmVudCA9IE5VTEw7CisgICAgU0ludDE2IGRlZmF1bHRUZXJtaW5vbG9neSA9IDA7CisgICAgQm9vbGVhbiBkaWRMYXVuY2ggPSAwOworICAgIE9TQUVycm9yIGVycjsKKyAgICBsb25nIG1vZGVGbGFncyA9IDA7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mfGkiLCBQeU1hY19HZXRGU1NwZWMsICZmc3MsICZtb2RlRmxhZ3MpKQorICAgICAgICAgICAgIHJldHVybiBOVUxMOworCisgICAgZGVmYXVsdENvbXBvbmVudCA9IE9wZW5EZWZhdWx0Q29tcG9uZW50IChrT1NBQ29tcG9uZW50VHlwZSwgJ2FzY3InKTsKKyAgICBlcnIgPSBHZXRDb21wb25lbnRJbnN0YW5jZUVycm9yIChkZWZhdWx0Q29tcG9uZW50KTsKKyAgICBpZiAoZXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoZXJyKTsKKyAgICBlcnIgPSBPU0FHZXRBcHBUZXJtaW5vbG9neSAoCisgICAgZGVmYXVsdENvbXBvbmVudCwKKyAgICBtb2RlRmxhZ3MsCisgICAgJmZzcywKKyAgICBkZWZhdWx0VGVybWlub2xvZ3ksCisgICAgJmRpZExhdW5jaCwKKyAgICAmdGhlRGVzYworICAgICk7CisgICAgaWYgKGVycikgcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8maSIsIEFFRGVzY19OZXcsICZ0aGVEZXNjLCBkaWRMYXVuY2gpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogUHlPU0FfR2V0U3lzVGVybWlub2xvZ3koUHlPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKQogewotCUFFRGVzYyB0aGVEZXNjID0gezAsMH07Ci0JRlNTcGVjIGZzczsKLQlDb21wb25lbnRJbnN0YW5jZSBkZWZhdWx0Q29tcG9uZW50ID0gTlVMTDsKLQlTSW50MTYgZGVmYXVsdFRlcm1pbm9sb2d5ID0gMDsKLQlCb29sZWFuIGRpZExhdW5jaCA9IDA7Ci0JT1NBRXJyb3IgZXJyOwotCWxvbmcgbW9kZUZsYWdzID0gMDsKLQkKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mfGkiLCBQeU1hY19HZXRGU1NwZWMsICZmc3MsICZtb2RlRmxhZ3MpKQotCQkgcmV0dXJuIE5VTEw7Ci0JCi0JZGVmYXVsdENvbXBvbmVudCA9IE9wZW5EZWZhdWx0Q29tcG9uZW50IChrT1NBQ29tcG9uZW50VHlwZSwgJ2FzY3InKTsKLQllcnIgPSBHZXRDb21wb25lbnRJbnN0YW5jZUVycm9yIChkZWZhdWx0Q29tcG9uZW50KTsKLQlpZiAoZXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoZXJyKTsKLQllcnIgPSBPU0FHZXRBcHBUZXJtaW5vbG9neSAoCi0gICAgCWRlZmF1bHRDb21wb25lbnQsIAotICAgIAltb2RlRmxhZ3MsCi0gICAgCSZmc3MsIAotICAgIAlkZWZhdWx0VGVybWlub2xvZ3ksIAotICAgIAkmZGlkTGF1bmNoLCAKLSAgICAJJnRoZURlc2MKLQkpOwotCWlmIChlcnIpIHJldHVybiBQeU1hY19FcnJvcihlcnIpOwotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJPJmkiLCBBRURlc2NfTmV3LCAmdGhlRGVzYywgZGlkTGF1bmNoKTsKKyAgICBBRURlc2MgdGhlRGVzYyA9IHswLDB9OworICAgIEZTU3BlYyBmc3M7CisgICAgQ29tcG9uZW50SW5zdGFuY2UgZGVmYXVsdENvbXBvbmVudCA9IE5VTEw7CisgICAgU0ludDE2IGRlZmF1bHRUZXJtaW5vbG9neSA9IDA7CisgICAgQm9vbGVhbiBkaWRMYXVuY2ggPSAwOworICAgIE9TQUVycm9yIGVycjsKKyAgICBsb25nIG1vZGVGbGFncyA9IDA7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mfGkiLCBQeU1hY19HZXRGU1NwZWMsICZmc3MsICZtb2RlRmxhZ3MpKQorICAgICAgICAgICAgIHJldHVybiBOVUxMOworCisgICAgZGVmYXVsdENvbXBvbmVudCA9IE9wZW5EZWZhdWx0Q29tcG9uZW50IChrT1NBQ29tcG9uZW50VHlwZSwgJ2FzY3InKTsKKyAgICBlcnIgPSBHZXRDb21wb25lbnRJbnN0YW5jZUVycm9yIChkZWZhdWx0Q29tcG9uZW50KTsKKyAgICBpZiAoZXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoZXJyKTsKKyAgICBlcnIgPSBPU0FHZXRBcHBUZXJtaW5vbG9neSAoCisgICAgZGVmYXVsdENvbXBvbmVudCwKKyAgICBtb2RlRmxhZ3MsCisgICAgJmZzcywKKyAgICBkZWZhdWx0VGVybWlub2xvZ3ksCisgICAgJmRpZExhdW5jaCwKKyAgICAmdGhlRGVzYworICAgICk7CisgICAgaWYgKGVycikgcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8maSIsIEFFRGVzY19OZXcsICZ0aGVEZXNjLCBkaWRMYXVuY2gpOwogfQogI2VuZGlmIC8qICFfX0xQNjRfXyAqLwogCi0vKiAKKy8qCiAgKiBMaXN0IG9mIG1ldGhvZHMgZGVmaW5lZCBpbiB0aGUgbW9kdWxlCiAgKi8KIHN0YXRpYyBzdHJ1Y3QgUHlNZXRob2REZWYgT1NBVGVybWlub2xvZ3lfbWV0aG9kc1tdID0KIHsKICNpZm5kZWYgX19MUDY0X18KLSAgCXsiR2V0QXBwVGVybWlub2xvZ3kiLCAKLQkJKFB5Q0Z1bmN0aW9uKSBQeU9TQV9HZXRBcHBUZXJtaW5vbG9neSwKLQkJTUVUSF9WQVJBUkdTLAotCQkiR2V0IGFuIGFwcGxpY2F0aW9ucyB0ZXJtaW5vbG9neSwgYXMgYW4gQUVEZXNjIG9iamVjdC4ifSwKLSAgCXsiR2V0U3lzVGVybWlub2xvZ3kiLCAKLQkJKFB5Q0Z1bmN0aW9uKSBQeU9TQV9HZXRTeXNUZXJtaW5vbG9neSwKLQkJTUVUSF9WQVJBUkdTLAotCQkiR2V0IGFuIGFwcGxpY2F0aW9ucyBzeXN0ZW0gdGVybWlub2xvZ3ksIGFzIGFuIEFFRGVzYyBvYmplY3QuIn0sCisgICAgeyJHZXRBcHBUZXJtaW5vbG9neSIsCisgICAgICAgIChQeUNGdW5jdGlvbikgUHlPU0FfR2V0QXBwVGVybWlub2xvZ3ksCisgICAgICAgIE1FVEhfVkFSQVJHUywKKyAgICAgICAgIkdldCBhbiBhcHBsaWNhdGlvbnMgdGVybWlub2xvZ3ksIGFzIGFuIEFFRGVzYyBvYmplY3QuIn0sCisgICAgeyJHZXRTeXNUZXJtaW5vbG9neSIsCisgICAgICAgIChQeUNGdW5jdGlvbikgUHlPU0FfR2V0U3lzVGVybWlub2xvZ3ksCisgICAgICAgIE1FVEhfVkFSQVJHUywKKyAgICAgICAgIkdldCBhbiBhcHBsaWNhdGlvbnMgc3lzdGVtIHRlcm1pbm9sb2d5LCBhcyBhbiBBRURlc2Mgb2JqZWN0LiJ9LAogI2VuZGlmIC8qICFfX0xQNjRfXyAqLwotCXtOVUxMLCAoUHlDRnVuY3Rpb24pIE5VTEwsIDAsIE5VTEx9CisgICAge05VTEwsIChQeUNGdW5jdGlvbikgTlVMTCwgMCwgTlVMTH0KIH07CiAKIHZvaWQKIGluaXRPU0FUZXJtaW5vbG9neSh2b2lkKQogewotCWlmIChQeUVycl9XYXJuUHkzaygiSW4gMy54LCBPU0FUZXJtaW5vbG9neSBpcyByZW1vdmVkLiIsIDEpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0luaXRNb2R1bGUoIk9TQVRlcm1pbm9sb2d5IiwgT1NBVGVybWlub2xvZ3lfbWV0aG9kcyk7CisgICAgaWYgKFB5RXJyX1dhcm5QeTNrKCJJbiAzLngsIE9TQVRlcm1pbm9sb2d5IGlzIHJlbW92ZWQuIiwgMSkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfSW5pdE1vZHVsZSgiT1NBVGVybWlub2xvZ3kiLCBPU0FUZXJtaW5vbG9neV9tZXRob2RzKTsKIH0KZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL19zY3Byb3h5LmMgYi9NYWMvTW9kdWxlcy9fc2Nwcm94eS5jCmluZGV4IDlmNGMxYTQuLmRkNWEyOTMgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL19zY3Byb3h5LmMKKysrIGIvTWFjL01vZHVsZXMvX3NjcHJveHkuYwpAQCAtNSwxNjIgKzUsMTYyIEBACiAjaW5jbHVkZSA8UHl0aG9uLmg+CiAjaW5jbHVkZSA8U3lzdGVtQ29uZmlndXJhdGlvbi9TeXN0ZW1Db25maWd1cmF0aW9uLmg+CiAKLXN0YXRpYyBpbnQzMl90IAorc3RhdGljIGludDMyX3QKIGNmbnVtX3RvX2ludDMyKENGTnVtYmVyUmVmIG51bSkKIHsKLQlpbnQzMl90IHJlc3VsdDsKKyAgICBpbnQzMl90IHJlc3VsdDsKIAotCUNGTnVtYmVyR2V0VmFsdWUobnVtLCBrQ0ZOdW1iZXJTSW50MzJUeXBlLCAmcmVzdWx0KTsKLQlyZXR1cm4gcmVzdWx0OworICAgIENGTnVtYmVyR2V0VmFsdWUobnVtLCBrQ0ZOdW1iZXJTSW50MzJUeXBlLCAmcmVzdWx0KTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgUHlPYmplY3QqCiBjZnN0cmluZ190b19weXN0cmluZyhDRlN0cmluZ1JlZiByZWYpCiB7Ci0JY29uc3QgY2hhciogczsgCisgICAgY29uc3QgY2hhciogczsKIAotCXMgPSBDRlN0cmluZ0dldENTdHJpbmdQdHIocmVmLCBrQ0ZTdHJpbmdFbmNvZGluZ1VURjgpOwotCWlmIChzKSB7Ci0JCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKHMpOworICAgIHMgPSBDRlN0cmluZ0dldENTdHJpbmdQdHIocmVmLCBrQ0ZTdHJpbmdFbmNvZGluZ1VURjgpOworICAgIGlmIChzKSB7CisgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKHMpOwogCi0JfSBlbHNlIHsKLQkJQ0ZJbmRleCBsZW4gPSBDRlN0cmluZ0dldExlbmd0aChyZWYpOwotCQlCb29sZWFuIG9rOwotCQlQeU9iamVjdCogcmVzdWx0OwotCQlyZXN1bHQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBsZW4qNCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQ0ZJbmRleCBsZW4gPSBDRlN0cmluZ0dldExlbmd0aChyZWYpOworICAgICAgICBCb29sZWFuIG9rOworICAgICAgICBQeU9iamVjdCogcmVzdWx0OworICAgICAgICByZXN1bHQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBsZW4qNCk7CiAKLQkJb2sgPSBDRlN0cmluZ0dldENTdHJpbmcocmVmLCAKLQkJCQlQeVN0cmluZ19BU19TVFJJTkcocmVzdWx0KSwKLQkJCQlQeVN0cmluZ19HRVRfU0laRShyZXN1bHQpLAotCQkJCWtDRlN0cmluZ0VuY29kaW5nVVRGOCk7Ci0JCWlmICghb2spIHsKLQkJCVB5X0RFQ1JFRihyZXN1bHQpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0gZWxzZSB7Ci0JCQlfUHlTdHJpbmdfUmVzaXplKCZyZXN1bHQsIAotCQkJCXN0cmxlbihQeVN0cmluZ19BU19TVFJJTkcocmVzdWx0KSkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQorICAgICAgICBvayA9IENGU3RyaW5nR2V0Q1N0cmluZyhyZWYsCisgICAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcocmVzdWx0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0dFVF9TSVpFKHJlc3VsdCksCisgICAgICAgICAgICAgICAgICAgICAgICBrQ0ZTdHJpbmdFbmNvZGluZ1VURjgpOworICAgICAgICBpZiAoIW9rKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgX1B5U3RyaW5nX1Jlc2l6ZSgmcmVzdWx0LAorICAgICAgICAgICAgICAgIHN0cmxlbihQeVN0cmluZ19BU19TVFJJTkcocmVzdWx0KSkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQogfQogCiAKIHN0YXRpYyBQeU9iamVjdCoKIGdldF9wcm94eV9zZXR0aW5ncyhQeU9iamVjdCogbW9kIF9fYXR0cmlidXRlX18oKF9fdW51c2VkX18pKSkKIHsKLQlDRkRpY3Rpb25hcnlSZWYgcHJveHlEaWN0ID0gTlVMTDsKLQlDRk51bWJlclJlZiBhTnVtID0gTlVMTDsKLQlDRkFycmF5UmVmIGFuQXJyYXkgPSBOVUxMOwotCVB5T2JqZWN0KiByZXN1bHQgPSBOVUxMOwotCVB5T2JqZWN0KiB2OwotCWludCByOworICAgIENGRGljdGlvbmFyeVJlZiBwcm94eURpY3QgPSBOVUxMOworICAgIENGTnVtYmVyUmVmIGFOdW0gPSBOVUxMOworICAgIENGQXJyYXlSZWYgYW5BcnJheSA9IE5VTEw7CisgICAgUHlPYmplY3QqIHJlc3VsdCA9IE5VTEw7CisgICAgUHlPYmplY3QqIHY7CisgICAgaW50IHI7CiAKLQlwcm94eURpY3QgPSBTQ0R5bmFtaWNTdG9yZUNvcHlQcm94aWVzKE5VTEwpOwotCWlmICghcHJveHlEaWN0KSB7Ci0JCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJcmV0dXJuIFB5X05vbmU7Ci0JfQorICAgIHByb3h5RGljdCA9IFNDRHluYW1pY1N0b3JlQ29weVByb3hpZXMoTlVMTCk7CisgICAgaWYgKCFwcm94eURpY3QpIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICB9CiAKLQlyZXN1bHQgPSBQeURpY3RfTmV3KCk7Ci0JaWYgKHJlc3VsdCA9PSBOVUxMKSBnb3RvIGVycm9yOworICAgIHJlc3VsdCA9IFB5RGljdF9OZXcoKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpIGdvdG8gZXJyb3I7CiAKLQlpZiAoJmtTQ1Byb3BOZXRQcm94aWVzRXhjbHVkZVNpbXBsZUhvc3RuYW1lcyAhPSBOVUxMKSB7Ci0JCWFOdW0gPSBDRkRpY3Rpb25hcnlHZXRWYWx1ZShwcm94eURpY3QsIAotCQkJa1NDUHJvcE5ldFByb3hpZXNFeGNsdWRlU2ltcGxlSG9zdG5hbWVzKTsKLQkJaWYgKGFOdW0gPT0gTlVMTCkgewotCQkJdiA9IFB5Qm9vbF9Gcm9tTG9uZygxKTsKLQkJfSBlbHNlIHsKLQkJCXYgPSBQeUJvb2xfRnJvbUxvbmcoY2ZudW1fdG9faW50MzIoYU51bSkpOwotCQl9Ci0JfSAgZWxzZSB7Ci0JCXYgPSBQeUJvb2xfRnJvbUxvbmcoMSk7Ci0JfQorICAgIGlmICgma1NDUHJvcE5ldFByb3hpZXNFeGNsdWRlU2ltcGxlSG9zdG5hbWVzICE9IE5VTEwpIHsKKyAgICAgICAgYU51bSA9IENGRGljdGlvbmFyeUdldFZhbHVlKHByb3h5RGljdCwKKyAgICAgICAgICAgIGtTQ1Byb3BOZXRQcm94aWVzRXhjbHVkZVNpbXBsZUhvc3RuYW1lcyk7CisgICAgICAgIGlmIChhTnVtID09IE5VTEwpIHsKKyAgICAgICAgICAgIHYgPSBQeUJvb2xfRnJvbUxvbmcoMSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB2ID0gUHlCb29sX0Zyb21Mb25nKGNmbnVtX3RvX2ludDMyKGFOdW0pKTsKKyAgICAgICAgfQorICAgIH0gIGVsc2UgeworICAgICAgICB2ID0gUHlCb29sX0Zyb21Mb25nKDEpOworICAgIH0KIAotCWlmICh2ID09IE5VTEwpIGdvdG8gZXJyb3I7CisgICAgaWYgKHYgPT0gTlVMTCkgZ290byBlcnJvcjsKIAotCXIgPSBQeURpY3RfU2V0SXRlbVN0cmluZyhyZXN1bHQsICJleGNsdWRlX3NpbXBsZSIsIHYpOwotCVB5X0RFQ1JFRih2KTsgdiA9IE5VTEw7Ci0JaWYgKHIgPT0gLTEpIGdvdG8gZXJyb3I7CisgICAgciA9IFB5RGljdF9TZXRJdGVtU3RyaW5nKHJlc3VsdCwgImV4Y2x1ZGVfc2ltcGxlIiwgdik7CisgICAgUHlfREVDUkVGKHYpOyB2ID0gTlVMTDsKKyAgICBpZiAociA9PSAtMSkgZ290byBlcnJvcjsKIAotCWFuQXJyYXkgPSBDRkRpY3Rpb25hcnlHZXRWYWx1ZShwcm94eURpY3QsIAotCQkJa1NDUHJvcE5ldFByb3hpZXNFeGNlcHRpb25zTGlzdCk7Ci0JaWYgKGFuQXJyYXkgIT0gTlVMTCkgewotCQlDRkluZGV4IGxlbiA9IENGQXJyYXlHZXRDb3VudChhbkFycmF5KTsKLQkJQ0ZJbmRleCBpOwotCQl2ID0gUHlUdXBsZV9OZXcobGVuKTsKLQkJaWYgKHYgPT0gTlVMTCkgZ290byBlcnJvcjsKKyAgICBhbkFycmF5ID0gQ0ZEaWN0aW9uYXJ5R2V0VmFsdWUocHJveHlEaWN0LAorICAgICAgICAgICAgICAgICAgICBrU0NQcm9wTmV0UHJveGllc0V4Y2VwdGlvbnNMaXN0KTsKKyAgICBpZiAoYW5BcnJheSAhPSBOVUxMKSB7CisgICAgICAgIENGSW5kZXggbGVuID0gQ0ZBcnJheUdldENvdW50KGFuQXJyYXkpOworICAgICAgICBDRkluZGV4IGk7CisgICAgICAgIHYgPSBQeVR1cGxlX05ldyhsZW4pOworICAgICAgICBpZiAodiA9PSBOVUxMKSBnb3RvIGVycm9yOwogCi0JCXIgPSBQeURpY3RfU2V0SXRlbVN0cmluZyhyZXN1bHQsICJleGNlcHRpb25zIiwgdik7Ci0JCVB5X0RFQ1JFRih2KTsKLQkJaWYgKHIgPT0gLTEpIGdvdG8gZXJyb3I7CisgICAgICAgIHIgPSBQeURpY3RfU2V0SXRlbVN0cmluZyhyZXN1bHQsICJleGNlcHRpb25zIiwgdik7CisgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgaWYgKHIgPT0gLTEpIGdvdG8gZXJyb3I7CiAKLQkJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQlDRlN0cmluZ1JlZiBhU3RyaW5nID0gTlVMTDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgICAgICBDRlN0cmluZ1JlZiBhU3RyaW5nID0gTlVMTDsKIAotCQkJYVN0cmluZyA9IENGQXJyYXlHZXRWYWx1ZUF0SW5kZXgoYW5BcnJheSwgaSk7Ci0JCQlpZiAoYVN0cmluZyA9PSBOVUxMKSB7Ci0JCQkJUHlUdXBsZV9TZXRJdGVtKHYsIGksIFB5X05vbmUpOwotCQkJCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJCX0gZWxzZSB7Ci0JCQkJUHlPYmplY3QqIHQgPSBjZnN0cmluZ190b19weXN0cmluZyhhU3RyaW5nKTsKLQkJCQlpZiAoIXQpIHsKLQkJCQkJUHlUdXBsZV9TZXRJdGVtKHYsIGksIFB5X05vbmUpOwotCQkJCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJUHlUdXBsZV9TZXRJdGVtKHYsIGksIHQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KKyAgICAgICAgICAgIGFTdHJpbmcgPSBDRkFycmF5R2V0VmFsdWVBdEluZGV4KGFuQXJyYXksIGkpOworICAgICAgICAgICAgaWYgKGFTdHJpbmcgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5VHVwbGVfU2V0SXRlbSh2LCBpLCBQeV9Ob25lKTsKKyAgICAgICAgICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFB5T2JqZWN0KiB0ID0gY2ZzdHJpbmdfdG9fcHlzdHJpbmcoYVN0cmluZyk7CisgICAgICAgICAgICAgICAgaWYgKCF0KSB7CisgICAgICAgICAgICAgICAgICAgIFB5VHVwbGVfU2V0SXRlbSh2LCBpLCBQeV9Ob25lKTsKKyAgICAgICAgICAgICAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIFB5VHVwbGVfU2V0SXRlbSh2LCBpLCB0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAKLQlDRlJlbGVhc2UocHJveHlEaWN0KTsKLQlyZXR1cm4gcmVzdWx0OworICAgIENGUmVsZWFzZShwcm94eURpY3QpOworICAgIHJldHVybiByZXN1bHQ7CiAKIGVycm9yOgotCWlmIChwcm94eURpY3QpICBDRlJlbGVhc2UocHJveHlEaWN0KTsKLQlQeV9YREVDUkVGKHJlc3VsdCk7Ci0JcmV0dXJuIE5VTEw7CisgICAgaWYgKHByb3h5RGljdCkgIENGUmVsZWFzZShwcm94eURpY3QpOworICAgIFB5X1hERUNSRUYocmVzdWx0KTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIGludAogc2V0X3Byb3h5KFB5T2JqZWN0KiBwcm94aWVzLCBjaGFyKiBwcm90bywgQ0ZEaWN0aW9uYXJ5UmVmIHByb3h5RGljdCwKLQkJQ0ZTdHJpbmdSZWYgZW5hYmxlZEtleSwgCi0JCUNGU3RyaW5nUmVmIGhvc3RLZXksIENGU3RyaW5nUmVmIHBvcnRLZXkpCisgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWYgZW5hYmxlZEtleSwKKyAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZiBob3N0S2V5LCBDRlN0cmluZ1JlZiBwb3J0S2V5KQogewotCUNGTnVtYmVyUmVmIGFOdW07CisgICAgQ0ZOdW1iZXJSZWYgYU51bTsKIAotCWFOdW0gPSBDRkRpY3Rpb25hcnlHZXRWYWx1ZShwcm94eURpY3QsIGVuYWJsZWRLZXkpOwotCWlmIChhTnVtICYmIGNmbnVtX3RvX2ludDMyKGFOdW0pKSB7Ci0JCUNGU3RyaW5nUmVmIGhvc3RTdHJpbmc7CisgICAgYU51bSA9IENGRGljdGlvbmFyeUdldFZhbHVlKHByb3h5RGljdCwgZW5hYmxlZEtleSk7CisgICAgaWYgKGFOdW0gJiYgY2ZudW1fdG9faW50MzIoYU51bSkpIHsKKyAgICAgICAgQ0ZTdHJpbmdSZWYgaG9zdFN0cmluZzsKIAotCQlob3N0U3RyaW5nID0gQ0ZEaWN0aW9uYXJ5R2V0VmFsdWUocHJveHlEaWN0LCBob3N0S2V5KTsKLQkJYU51bSA9IENGRGljdGlvbmFyeUdldFZhbHVlKHByb3h5RGljdCwgcG9ydEtleSk7CisgICAgICAgIGhvc3RTdHJpbmcgPSBDRkRpY3Rpb25hcnlHZXRWYWx1ZShwcm94eURpY3QsIGhvc3RLZXkpOworICAgICAgICBhTnVtID0gQ0ZEaWN0aW9uYXJ5R2V0VmFsdWUocHJveHlEaWN0LCBwb3J0S2V5KTsKIAotCQlpZiAoaG9zdFN0cmluZykgewotCQkJaW50IHI7Ci0JCQlQeU9iamVjdCogaCA9IGNmc3RyaW5nX3RvX3B5c3RyaW5nKGhvc3RTdHJpbmcpOwotCQkJUHlPYmplY3QqIHY7Ci0JCQlpZiAoaCkgewotCQkJCWlmIChhTnVtKSB7Ci0JCQkJCWludDMyX3QgcG9ydCA9IGNmbnVtX3RvX2ludDMyKGFOdW0pOwotCQkJCQl2ID0gUHlTdHJpbmdfRnJvbUZvcm1hdCgiaHR0cDovLyVzOiVsZCIsCi0JCQkJCQlQeVN0cmluZ19BU19TVFJJTkcoaCksCi0JCQkJCQkobG9uZylwb3J0KTsKLQkJCQl9IGVsc2UgewotCQkJCQl2ID0gUHlTdHJpbmdfRnJvbUZvcm1hdCgiaHR0cDovLyVzIiwKLQkJCQkJCVB5U3RyaW5nX0FTX1NUUklORyhoKSk7Ci0JCQkJfQotCQkJCVB5X0RFQ1JFRihoKTsKLQkJCQlpZiAoIXYpIHJldHVybiAtMTsKLQkJCQlyID0gUHlEaWN0X1NldEl0ZW1TdHJpbmcocHJveGllcywgcHJvdG8sCi0JCQkJCXYpOwotCQkJCVB5X0RFQ1JFRih2KTsKLQkJCQlyZXR1cm4gcjsKLQkJCX0KLQkJfQorICAgICAgICBpZiAoaG9zdFN0cmluZykgeworICAgICAgICAgICAgaW50IHI7CisgICAgICAgICAgICBQeU9iamVjdCogaCA9IGNmc3RyaW5nX3RvX3B5c3RyaW5nKGhvc3RTdHJpbmcpOworICAgICAgICAgICAgUHlPYmplY3QqIHY7CisgICAgICAgICAgICBpZiAoaCkgeworICAgICAgICAgICAgICAgIGlmIChhTnVtKSB7CisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcG9ydCA9IGNmbnVtX3RvX2ludDMyKGFOdW0pOworICAgICAgICAgICAgICAgICAgICB2ID0gUHlTdHJpbmdfRnJvbUZvcm1hdCgiaHR0cDovLyVzOiVsZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcoaCksCisgICAgICAgICAgICAgICAgICAgICAgICAobG9uZylwb3J0KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB2ID0gUHlTdHJpbmdfRnJvbUZvcm1hdCgiaHR0cDovLyVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FTX1NUUklORyhoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihoKTsKKyAgICAgICAgICAgICAgICBpZiAoIXYpIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICByID0gUHlEaWN0X1NldEl0ZW1TdHJpbmcocHJveGllcywgcHJvdG8sCisgICAgICAgICAgICAgICAgICAgIHYpOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JfQotCXJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogCkBAIC0xNjgsNjQgKzE2OCw2NCBAQAogc3RhdGljIFB5T2JqZWN0KgogZ2V0X3Byb3hpZXMoUHlPYmplY3QqIG1vZCBfX2F0dHJpYnV0ZV9fKChfX3VudXNlZF9fKSkpCiB7Ci0JUHlPYmplY3QqIHJlc3VsdCA9IE5VTEw7Ci0JaW50IHI7Ci0JQ0ZEaWN0aW9uYXJ5UmVmIHByb3h5RGljdCA9IE5VTEw7CisgICAgUHlPYmplY3QqIHJlc3VsdCA9IE5VTEw7CisgICAgaW50IHI7CisgICAgQ0ZEaWN0aW9uYXJ5UmVmIHByb3h5RGljdCA9IE5VTEw7CiAKLQlwcm94eURpY3QgPSBTQ0R5bmFtaWNTdG9yZUNvcHlQcm94aWVzKE5VTEwpOwotCWlmIChwcm94eURpY3QgPT0gTlVMTCkgewotCQlyZXR1cm4gUHlEaWN0X05ldygpOwotCX0KKyAgICBwcm94eURpY3QgPSBTQ0R5bmFtaWNTdG9yZUNvcHlQcm94aWVzKE5VTEwpOworICAgIGlmIChwcm94eURpY3QgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gUHlEaWN0X05ldygpOworICAgIH0KIAotCXJlc3VsdCA9IFB5RGljdF9OZXcoKTsKLQlpZiAocmVzdWx0ID09IE5VTEwpIGdvdG8gZXJyb3I7CisgICAgcmVzdWx0ID0gUHlEaWN0X05ldygpOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCkgZ290byBlcnJvcjsKIAotCXIgPSBzZXRfcHJveHkocmVzdWx0LCAiaHR0cCIsIHByb3h5RGljdCwKLQkJa1NDUHJvcE5ldFByb3hpZXNIVFRQRW5hYmxlLAotCQlrU0NQcm9wTmV0UHJveGllc0hUVFBQcm94eSwKLQkJa1NDUHJvcE5ldFByb3hpZXNIVFRQUG9ydCk7Ci0JaWYgKHIgPT0gLTEpIGdvdG8gZXJyb3I7Ci0JciA9IHNldF9wcm94eShyZXN1bHQsICJodHRwcyIsIHByb3h5RGljdCwKLQkJa1NDUHJvcE5ldFByb3hpZXNIVFRQU0VuYWJsZSwKLQkJa1NDUHJvcE5ldFByb3hpZXNIVFRQU1Byb3h5LAotCQlrU0NQcm9wTmV0UHJveGllc0hUVFBTUG9ydCk7Ci0JaWYgKHIgPT0gLTEpIGdvdG8gZXJyb3I7Ci0JciA9IHNldF9wcm94eShyZXN1bHQsICJmdHAiLCBwcm94eURpY3QsCi0JCWtTQ1Byb3BOZXRQcm94aWVzRlRQRW5hYmxlLAotCQlrU0NQcm9wTmV0UHJveGllc0ZUUFByb3h5LAotCQlrU0NQcm9wTmV0UHJveGllc0ZUUFBvcnQpOwotCWlmIChyID09IC0xKSBnb3RvIGVycm9yOwotCXIgPSBzZXRfcHJveHkocmVzdWx0LCAiZ29waGVyIiwgcHJveHlEaWN0LAotCQlrU0NQcm9wTmV0UHJveGllc0dvcGhlckVuYWJsZSwKLQkJa1NDUHJvcE5ldFByb3hpZXNHb3BoZXJQcm94eSwKLQkJa1NDUHJvcE5ldFByb3hpZXNHb3BoZXJQb3J0KTsKLQlpZiAociA9PSAtMSkgZ290byBlcnJvcjsKKyAgICByID0gc2V0X3Byb3h5KHJlc3VsdCwgImh0dHAiLCBwcm94eURpY3QsCisgICAgICAgIGtTQ1Byb3BOZXRQcm94aWVzSFRUUEVuYWJsZSwKKyAgICAgICAga1NDUHJvcE5ldFByb3hpZXNIVFRQUHJveHksCisgICAgICAgIGtTQ1Byb3BOZXRQcm94aWVzSFRUUFBvcnQpOworICAgIGlmIChyID09IC0xKSBnb3RvIGVycm9yOworICAgIHIgPSBzZXRfcHJveHkocmVzdWx0LCAiaHR0cHMiLCBwcm94eURpY3QsCisgICAgICAgIGtTQ1Byb3BOZXRQcm94aWVzSFRUUFNFbmFibGUsCisgICAgICAgIGtTQ1Byb3BOZXRQcm94aWVzSFRUUFNQcm94eSwKKyAgICAgICAga1NDUHJvcE5ldFByb3hpZXNIVFRQU1BvcnQpOworICAgIGlmIChyID09IC0xKSBnb3RvIGVycm9yOworICAgIHIgPSBzZXRfcHJveHkocmVzdWx0LCAiZnRwIiwgcHJveHlEaWN0LAorICAgICAgICBrU0NQcm9wTmV0UHJveGllc0ZUUEVuYWJsZSwKKyAgICAgICAga1NDUHJvcE5ldFByb3hpZXNGVFBQcm94eSwKKyAgICAgICAga1NDUHJvcE5ldFByb3hpZXNGVFBQb3J0KTsKKyAgICBpZiAociA9PSAtMSkgZ290byBlcnJvcjsKKyAgICByID0gc2V0X3Byb3h5KHJlc3VsdCwgImdvcGhlciIsIHByb3h5RGljdCwKKyAgICAgICAga1NDUHJvcE5ldFByb3hpZXNHb3BoZXJFbmFibGUsCisgICAgICAgIGtTQ1Byb3BOZXRQcm94aWVzR29waGVyUHJveHksCisgICAgICAgIGtTQ1Byb3BOZXRQcm94aWVzR29waGVyUG9ydCk7CisgICAgaWYgKHIgPT0gLTEpIGdvdG8gZXJyb3I7CiAKLQlDRlJlbGVhc2UocHJveHlEaWN0KTsKLQlyZXR1cm4gcmVzdWx0OworICAgIENGUmVsZWFzZShwcm94eURpY3QpOworICAgIHJldHVybiByZXN1bHQ7CiBlcnJvcjoKLQlpZiAocHJveHlEaWN0KSAgQ0ZSZWxlYXNlKHByb3h5RGljdCk7Ci0JUHlfWERFQ1JFRihyZXN1bHQpOwotCXJldHVybiBOVUxMOworICAgIGlmIChwcm94eURpY3QpICBDRlJlbGVhc2UocHJveHlEaWN0KTsKKyAgICBQeV9YREVDUkVGKHJlc3VsdCk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBtb2RfbWV0aG9kc1tdID0gewotCXsKLQkJIl9nZXRfcHJveHlfc2V0dGluZ3MiLAotCQkoUHlDRnVuY3Rpb24pZ2V0X3Byb3h5X3NldHRpbmdzLAotCQlNRVRIX05PQVJHUywKLQkJTlVMTCwKLQl9LAotCXsKLQkJIl9nZXRfcHJveGllcyIsCi0JCShQeUNGdW5jdGlvbilnZXRfcHJveGllcywKLQkJTUVUSF9OT0FSR1MsCi0JCU5VTEwsCi0JfSwKLQl7IDAsIDAsIDAsIDAgfQorICAgIHsKKyAgICAgICAgIl9nZXRfcHJveHlfc2V0dGluZ3MiLAorICAgICAgICAoUHlDRnVuY3Rpb24pZ2V0X3Byb3h5X3NldHRpbmdzLAorICAgICAgICBNRVRIX05PQVJHUywKKyAgICAgICAgTlVMTCwKKyAgICB9LAorICAgIHsKKyAgICAgICAgIl9nZXRfcHJveGllcyIsCisgICAgICAgIChQeUNGdW5jdGlvbilnZXRfcHJveGllcywKKyAgICAgICAgTUVUSF9OT0FSR1MsCisgICAgICAgIE5VTEwsCisgICAgfSwKKyAgICB7IDAsIDAsIDAsIDAgfQogfTsKIAogdm9pZCBpbml0X3NjcHJveHkodm9pZCkKIHsKLQkodm9pZClQeV9Jbml0TW9kdWxlNCgiX3NjcHJveHkiLCBtb2RfbWV0aG9kcywgTlVMTCwgTlVMTCwgUFlUSE9OX0FQSV9WRVJTSU9OKTsKKyAgICAodm9pZClQeV9Jbml0TW9kdWxlNCgiX3NjcHJveHkiLCBtb2RfbWV0aG9kcywgTlVMTCwgTlVMTCwgUFlUSE9OX0FQSV9WRVJTSU9OKTsKIH0KZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL2FlL19BRW1vZHVsZS5jIGIvTWFjL01vZHVsZXMvYWUvX0FFbW9kdWxlLmMKaW5kZXggMDkxMDVhNS4uMjFhMmQ0MCAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvYWUvX0FFbW9kdWxlLmMKKysrIGIvTWFjL01vZHVsZXMvYWUvX0FFbW9kdWxlLmMKQEAgLTEzLDkgKzEzLDkgQEAKIAogLyogTWFjcm8gdG8gdGVzdCB3aGV0aGVyIGEgd2Vhay1sb2FkZWQgQ0ZNIGZ1bmN0aW9uIGV4aXN0cyAqLwogI2RlZmluZSBQeU1hY19QUkVDSEVDSyhydG4pIGRvIHsgaWYgKCAmcnRuID09IE5VTEwgKSAge1wKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsIFwKLSAgICAgICAgIk5vdCBhdmFpbGFibGUgaW4gdGhpcyBzaGFyZWQgbGlicmFyeS9PUyB2ZXJzaW9uIik7IFwKLSAgICAgICAgcmV0dXJuIE5VTEw7IFwKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgXAorICAgICJOb3QgYXZhaWxhYmxlIGluIHRoaXMgc2hhcmVkIGxpYnJhcnkvT1MgdmVyc2lvbiIpOyBcCisgICAgcmV0dXJuIE5VTEw7IFwKICAgICB9fSB3aGlsZSgwKQogCiAKQEAgLTM4LDkgKzM4LDkgQEAKIAogc3RhdGljIHBhc2NhbCBCb29sZWFuIEFFSWRsZVByb2MoRXZlbnRSZWNvcmQgKnRoZUV2ZW50LCBsb25nICpzbGVlcFRpbWUsIFJnbkhhbmRsZSAqbW91c2VSZ24pCiB7Ci0gICAgICAgIGlmICggUHlPU19JbnRlcnJ1cHRPY2N1cnJlZCgpICkKLSAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKCBQeU9TX0ludGVycnVwdE9jY3VycmVkKCkgKQorICAgICAgICByZXR1cm4gMTsKKyAgICByZXR1cm4gMDsKIH0KIAogQUVJZGxlVVBQIHVwcF9BRUlkbGVQcm9jOwpAQCAtNTQsODA3ICs1NCw4MDcgQEAKICNkZWZpbmUgQUVEZXNjX0NoZWNrKHgpICgoeCktPm9iX3R5cGUgPT0gJkFFRGVzY19UeXBlIHx8IFB5T2JqZWN0X1R5cGVDaGVjaygoeCksICZBRURlc2NfVHlwZSkpCiAKIHR5cGVkZWYgc3RydWN0IEFFRGVzY09iamVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCUFFRGVzYyBvYl9pdHNlbGY7Ci0JaW50IG9iX293bmVkOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBBRURlc2Mgb2JfaXRzZWxmOworICAgIGludCBvYl9vd25lZDsKIH0gQUVEZXNjT2JqZWN0OwogCiBQeU9iamVjdCAqQUVEZXNjX05ldyhBRURlc2MgKml0c2VsZikKIHsKLQlBRURlc2NPYmplY3QgKml0OwotCWl0ID0gUHlPYmplY3RfTkVXKEFFRGVzY09iamVjdCwgJkFFRGVzY19UeXBlKTsKLQlpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JaXQtPm9iX2l0c2VsZiA9ICppdHNlbGY7Ci0JaXQtPm9iX293bmVkID0gMTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgQUVEZXNjT2JqZWN0ICppdDsKKyAgICBpdCA9IFB5T2JqZWN0X05FVyhBRURlc2NPYmplY3QsICZBRURlc2NfVHlwZSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIGl0LT5vYl9pdHNlbGYgPSAqaXRzZWxmOworICAgIGl0LT5vYl9vd25lZCA9IDE7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogCiBpbnQgQUVEZXNjX0NvbnZlcnQoUHlPYmplY3QgKnYsIEFFRGVzYyAqcF9pdHNlbGYpCiB7Ci0JaWYgKCFBRURlc2NfQ2hlY2sodikpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiQUVEZXNjIHJlcXVpcmVkIik7Ci0JCXJldHVybiAwOwotCX0KLQkqcF9pdHNlbGYgPSAoKEFFRGVzY09iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0JcmV0dXJuIDE7CisgICAgaWYgKCFBRURlc2NfQ2hlY2sodikpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiQUVEZXNjIHJlcXVpcmVkIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAqcF9pdHNlbGYgPSAoKEFFRGVzY09iamVjdCAqKXYpLT5vYl9pdHNlbGY7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyB2b2lkIEFFRGVzY19kZWFsbG9jKEFFRGVzY09iamVjdCAqc2VsZikKIHsKLQlpZiAoc2VsZi0+b2Jfb3duZWQpIEFFRGlzcG9zZURlc2MoJnNlbGYtPm9iX2l0c2VsZik7Ci0Jc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKKyAgICBpZiAoc2VsZi0+b2Jfb3duZWQpIEFFRGlzcG9zZURlc2MoJnNlbGYtPm9iX2l0c2VsZik7CisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBRURlc2NfQUVDb2VyY2VEZXNjKEFFRGVzY09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlEZXNjVHlwZSB0b1R5cGU7Ci0JQUVEZXNjIHJlc3VsdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBEZXNjVHlwZSB0b1R5cGU7CisgICAgQUVEZXNjIHJlc3VsdDsKICNpZm5kZWYgQUVDb2VyY2VEZXNjCi0JUHlNYWNfUFJFQ0hFQ0soQUVDb2VyY2VEZXNjKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBRUNvZXJjZURlc2MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0b1R5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQUVDb2VyY2VEZXNjKCZfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgdG9UeXBlLAotCSAgICAgICAgICAgICAgICAgICAgJnJlc3VsdCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19OZXcsICZyZXN1bHQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdG9UeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFFQ29lcmNlRGVzYygmX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRvVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBRURlc2NfTmV3LCAmcmVzdWx0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBRURlc2NfQUVEdXBsaWNhdGVEZXNjKEFFRGVzY09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlBRURlc2MgcmVzdWx0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEFFRGVzYyByZXN1bHQ7CiAjaWZuZGVmIEFFRHVwbGljYXRlRGVzYwotCVB5TWFjX1BSRUNIRUNLKEFFRHVwbGljYXRlRGVzYyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQUVEdXBsaWNhdGVEZXNjKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQUVEdXBsaWNhdGVEZXNjKCZfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19OZXcsICZyZXN1bHQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQUVEdXBsaWNhdGVEZXNjKCZfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19OZXcsICZyZXN1bHQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFFRGVzY19BRUNvdW50SXRlbXMoQUVEZXNjT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCWxvbmcgdGhlQ291bnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgbG9uZyB0aGVDb3VudDsKICNpZm5kZWYgQUVDb3VudEl0ZW1zCi0JUHlNYWNfUFJFQ0hFQ0soQUVDb3VudEl0ZW1zKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBRUNvdW50SXRlbXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBRUNvdW50SXRlbXMoJl9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAmdGhlQ291bnQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIHRoZUNvdW50KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFFQ291bnRJdGVtcygmX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVDb3VudCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgdGhlQ291bnQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFFRGVzY19BRVB1dFB0cihBRURlc2NPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JbG9uZyBpbmRleDsKLQlEZXNjVHlwZSB0eXBlQ29kZTsKLQljaGFyICpkYXRhUHRyX19pbl9fOwotCWxvbmcgZGF0YVB0cl9fbGVuX187Ci0JaW50IGRhdGFQdHJfX2luX2xlbl9fOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIGxvbmcgaW5kZXg7CisgICAgRGVzY1R5cGUgdHlwZUNvZGU7CisgICAgY2hhciAqZGF0YVB0cl9faW5fXzsKKyAgICBsb25nIGRhdGFQdHJfX2xlbl9fOworICAgIGludCBkYXRhUHRyX19pbl9sZW5fXzsKICNpZm5kZWYgQUVQdXRQdHIKLQlQeU1hY19QUkVDSEVDSyhBRVB1dFB0cik7CisgICAgUHlNYWNfUFJFQ0hFQ0soQUVQdXRQdHIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mcyMiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnR5cGVDb2RlLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGF0YVB0cl9faW5fXywgJmRhdGFQdHJfX2luX2xlbl9fKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZGF0YVB0cl9fbGVuX18gPSBkYXRhUHRyX19pbl9sZW5fXzsKLQlfZXJyID0gQUVQdXRQdHIoJl9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgIGluZGV4LAotCSAgICAgICAgICAgICAgICB0eXBlQ29kZSwKLQkgICAgICAgICAgICAgICAgZGF0YVB0cl9faW5fXywgZGF0YVB0cl9fbGVuX18pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJnMjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0eXBlQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFQdHJfX2luX18sICZkYXRhUHRyX19pbl9sZW5fXykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGRhdGFQdHJfX2xlbl9fID0gZGF0YVB0cl9faW5fbGVuX187CisgICAgX2VyciA9IEFFUHV0UHRyKCZfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgdHlwZUNvZGUsCisgICAgICAgICAgICAgICAgICAgIGRhdGFQdHJfX2luX18sIGRhdGFQdHJfX2xlbl9fKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBRURlc2NfQUVQdXREZXNjKEFFRGVzY09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlsb25nIGluZGV4OwotCUFFRGVzYyB0aGVBRURlc2M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgbG9uZyBpbmRleDsKKyAgICBBRURlc2MgdGhlQUVEZXNjOwogI2lmbmRlZiBBRVB1dERlc2MKLQlQeU1hY19QUkVDSEVDSyhBRVB1dERlc2MpOworICAgIFB5TWFjX1BSRUNIRUNLKEFFUHV0RGVzYyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19Db252ZXJ0LCAmdGhlQUVEZXNjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEFFUHV0RGVzYygmX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgIGluZGV4LAotCSAgICAgICAgICAgICAgICAgJnRoZUFFRGVzYyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBBRURlc2NfQ29udmVydCwgJnRoZUFFRGVzYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBBRVB1dERlc2MoJl9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICZ0aGVBRURlc2MpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFFRGVzY19BRUdldE50aFB0cihBRURlc2NPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JbG9uZyBpbmRleDsKLQlEZXNjVHlwZSBkZXNpcmVkVHlwZTsKLQlBRUtleXdvcmQgdGhlQUVLZXl3b3JkOwotCURlc2NUeXBlIHR5cGVDb2RlOwotCWNoYXIgKmRhdGFQdHJfX291dF9fOwotCWxvbmcgZGF0YVB0cl9fbGVuX187Ci0JaW50IGRhdGFQdHJfX2luX2xlbl9fOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIGxvbmcgaW5kZXg7CisgICAgRGVzY1R5cGUgZGVzaXJlZFR5cGU7CisgICAgQUVLZXl3b3JkIHRoZUFFS2V5d29yZDsKKyAgICBEZXNjVHlwZSB0eXBlQ29kZTsKKyAgICBjaGFyICpkYXRhUHRyX19vdXRfXzsKKyAgICBsb25nIGRhdGFQdHJfX2xlbl9fOworICAgIGludCBkYXRhUHRyX19pbl9sZW5fXzsKICNpZm5kZWYgQUVHZXROdGhQdHIKLQlQeU1hY19QUkVDSEVDSyhBRUdldE50aFB0cik7CisgICAgUHlNYWNfUFJFQ0hFQ0soQUVHZXROdGhQdHIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8maSIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGVzaXJlZFR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZkYXRhUHRyX19pbl9sZW5fXykpCi0JCXJldHVybiBOVUxMOwotCWlmICgoZGF0YVB0cl9fb3V0X18gPSBtYWxsb2MoZGF0YVB0cl9faW5fbGVuX18pKSA9PSBOVUxMKQotCXsKLQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJZ290byBkYXRhUHRyX19lcnJvcl9fOwotCX0KLQlkYXRhUHRyX19sZW5fXyA9IGRhdGFQdHJfX2luX2xlbl9fOwotCV9lcnIgPSBBRUdldE50aFB0cigmX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgaW5kZXgsCi0JICAgICAgICAgICAgICAgICAgIGRlc2lyZWRUeXBlLAotCSAgICAgICAgICAgICAgICAgICAmdGhlQUVLZXl3b3JkLAotCSAgICAgICAgICAgICAgICAgICAmdHlwZUNvZGUsCi0JICAgICAgICAgICAgICAgICAgIGRhdGFQdHJfX291dF9fLCBkYXRhUHRyX19sZW5fXywgJmRhdGFQdHJfX2xlbl9fKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mcyMiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCB0aGVBRUtleXdvcmQsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIHR5cGVDb2RlLAotCSAgICAgICAgICAgICAgICAgICAgIGRhdGFQdHJfX291dF9fLCAoaW50KWRhdGFQdHJfX2xlbl9fKTsKLQlmcmVlKGRhdGFQdHJfX291dF9fKTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyZpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkZXNpcmVkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFQdHJfX2luX2xlbl9fKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKChkYXRhUHRyX19vdXRfXyA9IG1hbGxvYyhkYXRhUHRyX19pbl9sZW5fXykpID09IE5VTEwpCisgICAgeworICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICBnb3RvIGRhdGFQdHJfX2Vycm9yX187CisgICAgfQorICAgIGRhdGFQdHJfX2xlbl9fID0gZGF0YVB0cl9faW5fbGVuX187CisgICAgX2VyciA9IEFFR2V0TnRoUHRyKCZfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgZGVzaXJlZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICZ0aGVBRUtleXdvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICZ0eXBlQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgZGF0YVB0cl9fb3V0X18sIGRhdGFQdHJfX2xlbl9fLCAmZGF0YVB0cl9fbGVuX18pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mTyZzIyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIHRoZUFFS2V5d29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgdHlwZUNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVB0cl9fb3V0X18sIChpbnQpZGF0YVB0cl9fbGVuX18pOworICAgIGZyZWUoZGF0YVB0cl9fb3V0X18pOwogIGRhdGFQdHJfX2Vycm9yX186IDsKLQlyZXR1cm4gX3JlczsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBRURlc2NfQUVHZXROdGhEZXNjKEFFRGVzY09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlsb25nIGluZGV4OwotCURlc2NUeXBlIGRlc2lyZWRUeXBlOwotCUFFS2V5d29yZCB0aGVBRUtleXdvcmQ7Ci0JQUVEZXNjIHJlc3VsdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBsb25nIGluZGV4OworICAgIERlc2NUeXBlIGRlc2lyZWRUeXBlOworICAgIEFFS2V5d29yZCB0aGVBRUtleXdvcmQ7CisgICAgQUVEZXNjIHJlc3VsdDsKICNpZm5kZWYgQUVHZXROdGhEZXNjCi0JUHlNYWNfUFJFQ0hFQ0soQUVHZXROdGhEZXNjKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBRUdldE50aERlc2MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluZGV4LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkZXNpcmVkVHlwZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBRUdldE50aERlc2MoJl9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICBpbmRleCwKLQkgICAgICAgICAgICAgICAgICAgIGRlc2lyZWRUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgJnRoZUFFS2V5d29yZCwKLQkgICAgICAgICAgICAgICAgICAgICZyZXN1bHQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCB0aGVBRUtleXdvcmQsCi0JICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX05ldywgJnJlc3VsdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkZXNpcmVkVHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBBRUdldE50aERlc2MoJl9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc2lyZWRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUFFS2V5d29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCB0aGVBRUtleXdvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX05ldywgJnJlc3VsdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQUVEZXNjX0FFU2l6ZU9mTnRoSXRlbShBRURlc2NPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JbG9uZyBpbmRleDsKLQlEZXNjVHlwZSB0eXBlQ29kZTsKLQlTaXplIGRhdGFTaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIGxvbmcgaW5kZXg7CisgICAgRGVzY1R5cGUgdHlwZUNvZGU7CisgICAgU2l6ZSBkYXRhU2l6ZTsKICNpZm5kZWYgQUVTaXplT2ZOdGhJdGVtCi0JUHlNYWNfUFJFQ0hFQ0soQUVTaXplT2ZOdGhJdGVtKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBRVNpemVPZk50aEl0ZW0pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBRVNpemVPZk50aEl0ZW0oJl9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICAgICZ0eXBlQ29kZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICZkYXRhU2l6ZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgdHlwZUNvZGUsCi0JICAgICAgICAgICAgICAgICAgICAgZGF0YVNpemUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQUVTaXplT2ZOdGhJdGVtKCZfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHlwZUNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVNpemUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIHR5cGVDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTaXplKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBRURlc2NfQUVEZWxldGVJdGVtKEFFRGVzY09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlsb25nIGluZGV4OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIGxvbmcgaW5kZXg7CiAjaWZuZGVmIEFFRGVsZXRlSXRlbQotCVB5TWFjX1BSRUNIRUNLKEFFRGVsZXRlSXRlbSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQUVEZWxldGVJdGVtKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQUVEZWxldGVJdGVtKCZfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgaW5kZXgpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQUVEZWxldGVJdGVtKCZfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFFRGVzY19BRVB1dFBhcmFtUHRyKEFFRGVzY09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlBRUtleXdvcmQgdGhlQUVLZXl3b3JkOwotCURlc2NUeXBlIHR5cGVDb2RlOwotCWNoYXIgKmRhdGFQdHJfX2luX187Ci0JbG9uZyBkYXRhUHRyX19sZW5fXzsKLQlpbnQgZGF0YVB0cl9faW5fbGVuX187CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgQUVLZXl3b3JkIHRoZUFFS2V5d29yZDsKKyAgICBEZXNjVHlwZSB0eXBlQ29kZTsKKyAgICBjaGFyICpkYXRhUHRyX19pbl9fOworICAgIGxvbmcgZGF0YVB0cl9fbGVuX187CisgICAgaW50IGRhdGFQdHJfX2luX2xlbl9fOwogI2lmbmRlZiBBRVB1dFBhcmFtUHRyCi0JUHlNYWNfUFJFQ0hFQ0soQUVQdXRQYXJhbVB0cik7CisgICAgUHlNYWNfUFJFQ0hFQ0soQUVQdXRQYXJhbVB0cik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mcyMiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVBRUtleXdvcmQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnR5cGVDb2RlLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGF0YVB0cl9faW5fXywgJmRhdGFQdHJfX2luX2xlbl9fKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZGF0YVB0cl9fbGVuX18gPSBkYXRhUHRyX19pbl9sZW5fXzsKLQlfZXJyID0gQUVQdXRQYXJhbVB0cigmX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICB0aGVBRUtleXdvcmQsCi0JICAgICAgICAgICAgICAgICAgICAgdHlwZUNvZGUsCi0JICAgICAgICAgICAgICAgICAgICAgZGF0YVB0cl9faW5fXywgZGF0YVB0cl9fbGVuX18pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZzIyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZUFFS2V5d29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdHlwZUNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUHRyX19pbl9fLCAmZGF0YVB0cl9faW5fbGVuX18pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBkYXRhUHRyX19sZW5fXyA9IGRhdGFQdHJfX2luX2xlbl9fOworICAgIF9lcnIgPSBBRVB1dFBhcmFtUHRyKCZfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRoZUFFS2V5d29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUHRyX19pbl9fLCBkYXRhUHRyX19sZW5fXyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQUVEZXNjX0FFUHV0UGFyYW1EZXNjKEFFRGVzY09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlBRUtleXdvcmQgdGhlQUVLZXl3b3JkOwotCUFFRGVzYyB0aGVBRURlc2M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgQUVLZXl3b3JkIHRoZUFFS2V5d29yZDsKKyAgICBBRURlc2MgdGhlQUVEZXNjOwogI2lmbmRlZiBBRVB1dFBhcmFtRGVzYwotCVB5TWFjX1BSRUNIRUNLKEFFUHV0UGFyYW1EZXNjKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBRVB1dFBhcmFtRGVzYyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlQUVLZXl3b3JkLAotCSAgICAgICAgICAgICAgICAgICAgICBBRURlc2NfQ29udmVydCwgJnRoZUFFRGVzYykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBRVB1dFBhcmFtRGVzYygmX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgdGhlQUVLZXl3b3JkLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGhlQUVEZXNjKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlQUVLZXl3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBRURlc2NfQ29udmVydCwgJnRoZUFFRGVzYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBBRVB1dFBhcmFtRGVzYygmX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlQUVLZXl3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlQUVEZXNjKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBRURlc2NfQUVHZXRQYXJhbVB0cihBRURlc2NPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JQUVLZXl3b3JkIHRoZUFFS2V5d29yZDsKLQlEZXNjVHlwZSBkZXNpcmVkVHlwZTsKLQlEZXNjVHlwZSB0eXBlQ29kZTsKLQljaGFyICpkYXRhUHRyX19vdXRfXzsKLQlsb25nIGRhdGFQdHJfX2xlbl9fOwotCWludCBkYXRhUHRyX19pbl9sZW5fXzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBBRUtleXdvcmQgdGhlQUVLZXl3b3JkOworICAgIERlc2NUeXBlIGRlc2lyZWRUeXBlOworICAgIERlc2NUeXBlIHR5cGVDb2RlOworICAgIGNoYXIgKmRhdGFQdHJfX291dF9fOworICAgIGxvbmcgZGF0YVB0cl9fbGVuX187CisgICAgaW50IGRhdGFQdHJfX2luX2xlbl9fOwogI2lmbmRlZiBBRUdldFBhcmFtUHRyCi0JUHlNYWNfUFJFQ0hFQ0soQUVHZXRQYXJhbVB0cik7CisgICAgUHlNYWNfUFJFQ0hFQ0soQUVHZXRQYXJhbVB0cik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maSIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZUFFS2V5d29yZCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGVzaXJlZFR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZkYXRhUHRyX19pbl9sZW5fXykpCi0JCXJldHVybiBOVUxMOwotCWlmICgoZGF0YVB0cl9fb3V0X18gPSBtYWxsb2MoZGF0YVB0cl9faW5fbGVuX18pKSA9PSBOVUxMKQotCXsKLQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJZ290byBkYXRhUHRyX19lcnJvcl9fOwotCX0KLQlkYXRhUHRyX19sZW5fXyA9IGRhdGFQdHJfX2luX2xlbl9fOwotCV9lcnIgPSBBRUdldFBhcmFtUHRyKCZfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgIHRoZUFFS2V5d29yZCwKLQkgICAgICAgICAgICAgICAgICAgICBkZXNpcmVkVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAmdHlwZUNvZGUsCi0JICAgICAgICAgICAgICAgICAgICAgZGF0YVB0cl9fb3V0X18sIGRhdGFQdHJfX2xlbl9fLCAmZGF0YVB0cl9fbGVuX18pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mcyMiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCB0eXBlQ29kZSwKLQkgICAgICAgICAgICAgICAgICAgICBkYXRhUHRyX19vdXRfXywgKGludClkYXRhUHRyX19sZW5fXyk7Ci0JZnJlZShkYXRhUHRyX19vdXRfXyk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVBRUtleXdvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRlc2lyZWRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVB0cl9faW5fbGVuX18pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoKGRhdGFQdHJfX291dF9fID0gbWFsbG9jKGRhdGFQdHJfX2luX2xlbl9fKSkgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIGdvdG8gZGF0YVB0cl9fZXJyb3JfXzsKKyAgICB9CisgICAgZGF0YVB0cl9fbGVuX18gPSBkYXRhUHRyX19pbl9sZW5fXzsKKyAgICBfZXJyID0gQUVHZXRQYXJhbVB0cigmX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0aGVBRUtleXdvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgZGVzaXJlZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgJnR5cGVDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFQdHJfX291dF9fLCBkYXRhUHRyX19sZW5fXywgJmRhdGFQdHJfX2xlbl9fKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJnMjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgdHlwZUNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVB0cl9fb3V0X18sIChpbnQpZGF0YVB0cl9fbGVuX18pOworICAgIGZyZWUoZGF0YVB0cl9fb3V0X18pOwogIGRhdGFQdHJfX2Vycm9yX186IDsKLQlyZXR1cm4gX3JlczsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBRURlc2NfQUVHZXRQYXJhbURlc2MoQUVEZXNjT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUFFS2V5d29yZCB0aGVBRUtleXdvcmQ7Ci0JRGVzY1R5cGUgZGVzaXJlZFR5cGU7Ci0JQUVEZXNjIHJlc3VsdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBBRUtleXdvcmQgdGhlQUVLZXl3b3JkOworICAgIERlc2NUeXBlIGRlc2lyZWRUeXBlOworICAgIEFFRGVzYyByZXN1bHQ7CiAjaWZuZGVmIEFFR2V0UGFyYW1EZXNjCi0JUHlNYWNfUFJFQ0hFQ0soQUVHZXRQYXJhbURlc2MpOworICAgIFB5TWFjX1BSRUNIRUNLKEFFR2V0UGFyYW1EZXNjKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVBRUtleXdvcmQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRlc2lyZWRUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEFFR2V0UGFyYW1EZXNjKCZfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICB0aGVBRUtleXdvcmQsCi0JICAgICAgICAgICAgICAgICAgICAgIGRlc2lyZWRUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX05ldywgJnJlc3VsdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZUFFS2V5d29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGVzaXJlZFR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQUVHZXRQYXJhbURlc2MoJl9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZUFFS2V5d29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzaXJlZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBRURlc2NfTmV3LCAmcmVzdWx0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBRURlc2NfQUVTaXplT2ZQYXJhbShBRURlc2NPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JQUVLZXl3b3JkIHRoZUFFS2V5d29yZDsKLQlEZXNjVHlwZSB0eXBlQ29kZTsKLQlTaXplIGRhdGFTaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEFFS2V5d29yZCB0aGVBRUtleXdvcmQ7CisgICAgRGVzY1R5cGUgdHlwZUNvZGU7CisgICAgU2l6ZSBkYXRhU2l6ZTsKICNpZm5kZWYgQUVTaXplT2ZQYXJhbQotCVB5TWFjX1BSRUNIRUNLKEFFU2l6ZU9mUGFyYW0pOworICAgIFB5TWFjX1BSRUNIRUNLKEFFU2l6ZU9mUGFyYW0pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVBRUtleXdvcmQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQUVTaXplT2ZQYXJhbSgmX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICB0aGVBRUtleXdvcmQsCi0JICAgICAgICAgICAgICAgICAgICAgJnR5cGVDb2RlLAotCSAgICAgICAgICAgICAgICAgICAgICZkYXRhU2l6ZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgdHlwZUNvZGUsCi0JICAgICAgICAgICAgICAgICAgICAgZGF0YVNpemUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlQUVLZXl3b3JkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFFU2l6ZU9mUGFyYW0oJl9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgdGhlQUVLZXl3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICZ0eXBlQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVNpemUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIHR5cGVDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTaXplKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBRURlc2NfQUVEZWxldGVQYXJhbShBRURlc2NPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JQUVLZXl3b3JkIHRoZUFFS2V5d29yZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBBRUtleXdvcmQgdGhlQUVLZXl3b3JkOwogI2lmbmRlZiBBRURlbGV0ZVBhcmFtCi0JUHlNYWNfUFJFQ0hFQ0soQUVEZWxldGVQYXJhbSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQUVEZWxldGVQYXJhbSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZUFFS2V5d29yZCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBRURlbGV0ZVBhcmFtKCZfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgIHRoZUFFS2V5d29yZCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVBRUtleXdvcmQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQUVEZWxldGVQYXJhbSgmX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0aGVBRUtleXdvcmQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFFRGVzY19BRUdldEF0dHJpYnV0ZVB0cihBRURlc2NPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JQUVLZXl3b3JkIHRoZUFFS2V5d29yZDsKLQlEZXNjVHlwZSBkZXNpcmVkVHlwZTsKLQlEZXNjVHlwZSB0eXBlQ29kZTsKLQljaGFyICpkYXRhUHRyX19vdXRfXzsKLQlsb25nIGRhdGFQdHJfX2xlbl9fOwotCWludCBkYXRhUHRyX19pbl9sZW5fXzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBBRUtleXdvcmQgdGhlQUVLZXl3b3JkOworICAgIERlc2NUeXBlIGRlc2lyZWRUeXBlOworICAgIERlc2NUeXBlIHR5cGVDb2RlOworICAgIGNoYXIgKmRhdGFQdHJfX291dF9fOworICAgIGxvbmcgZGF0YVB0cl9fbGVuX187CisgICAgaW50IGRhdGFQdHJfX2luX2xlbl9fOwogI2lmbmRlZiBBRUdldEF0dHJpYnV0ZVB0cgotCVB5TWFjX1BSRUNIRUNLKEFFR2V0QXR0cmlidXRlUHRyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBRUdldEF0dHJpYnV0ZVB0cik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maSIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZUFFS2V5d29yZCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGVzaXJlZFR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZkYXRhUHRyX19pbl9sZW5fXykpCi0JCXJldHVybiBOVUxMOwotCWlmICgoZGF0YVB0cl9fb3V0X18gPSBtYWxsb2MoZGF0YVB0cl9faW5fbGVuX18pKSA9PSBOVUxMKQotCXsKLQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJZ290byBkYXRhUHRyX19lcnJvcl9fOwotCX0KLQlkYXRhUHRyX19sZW5fXyA9IGRhdGFQdHJfX2luX2xlbl9fOwotCV9lcnIgPSBBRUdldEF0dHJpYnV0ZVB0cigmX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgdGhlQUVLZXl3b3JkLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBkZXNpcmVkVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJnR5cGVDb2RlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUHRyX19vdXRfXywgZGF0YVB0cl9fbGVuX18sICZkYXRhUHRyX19sZW5fXyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZzIyIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIHR5cGVDb2RlLAotCSAgICAgICAgICAgICAgICAgICAgIGRhdGFQdHJfX291dF9fLCAoaW50KWRhdGFQdHJfX2xlbl9fKTsKLQlmcmVlKGRhdGFQdHJfX291dF9fKTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZUFFS2V5d29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGVzaXJlZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUHRyX19pbl9sZW5fXykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICgoZGF0YVB0cl9fb3V0X18gPSBtYWxsb2MoZGF0YVB0cl9faW5fbGVuX18pKSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgZ290byBkYXRhUHRyX19lcnJvcl9fOworICAgIH0KKyAgICBkYXRhUHRyX19sZW5fXyA9IGRhdGFQdHJfX2luX2xlbl9fOworICAgIF9lcnIgPSBBRUdldEF0dHJpYnV0ZVB0cigmX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlQUVLZXl3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNpcmVkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnR5cGVDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUHRyX19vdXRfXywgZGF0YVB0cl9fbGVuX18sICZkYXRhUHRyX19sZW5fXyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZzIyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIHR5cGVDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFQdHJfX291dF9fLCAoaW50KWRhdGFQdHJfX2xlbl9fKTsKKyAgICBmcmVlKGRhdGFQdHJfX291dF9fKTsKICBkYXRhUHRyX19lcnJvcl9fOiA7Ci0JcmV0dXJuIF9yZXM7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQUVEZXNjX0FFR2V0QXR0cmlidXRlRGVzYyhBRURlc2NPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JQUVLZXl3b3JkIHRoZUFFS2V5d29yZDsKLQlEZXNjVHlwZSBkZXNpcmVkVHlwZTsKLQlBRURlc2MgcmVzdWx0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEFFS2V5d29yZCB0aGVBRUtleXdvcmQ7CisgICAgRGVzY1R5cGUgZGVzaXJlZFR5cGU7CisgICAgQUVEZXNjIHJlc3VsdDsKICNpZm5kZWYgQUVHZXRBdHRyaWJ1dGVEZXNjCi0JUHlNYWNfUFJFQ0hFQ0soQUVHZXRBdHRyaWJ1dGVEZXNjKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBRUdldEF0dHJpYnV0ZURlc2MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZUFFS2V5d29yZCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGVzaXJlZFR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQUVHZXRBdHRyaWJ1dGVEZXNjKCZfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlQUVLZXl3b3JkLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzaXJlZFR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX05ldywgJnJlc3VsdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZUFFS2V5d29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGVzaXJlZFR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQUVHZXRBdHRyaWJ1dGVEZXNjKCZfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlQUVLZXl3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzaXJlZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX05ldywgJnJlc3VsdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQUVEZXNjX0FFU2l6ZU9mQXR0cmlidXRlKEFFRGVzY09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlBRUtleXdvcmQgdGhlQUVLZXl3b3JkOwotCURlc2NUeXBlIHR5cGVDb2RlOwotCVNpemUgZGF0YVNpemU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgQUVLZXl3b3JkIHRoZUFFS2V5d29yZDsKKyAgICBEZXNjVHlwZSB0eXBlQ29kZTsKKyAgICBTaXplIGRhdGFTaXplOwogI2lmbmRlZiBBRVNpemVPZkF0dHJpYnV0ZQotCVB5TWFjX1BSRUNIRUNLKEFFU2l6ZU9mQXR0cmlidXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBRVNpemVPZkF0dHJpYnV0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZUFFS2V5d29yZCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBRVNpemVPZkF0dHJpYnV0ZSgmX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgdGhlQUVLZXl3b3JkLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmdHlwZUNvZGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhU2l6ZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgdHlwZUNvZGUsCi0JICAgICAgICAgICAgICAgICAgICAgZGF0YVNpemUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlQUVLZXl3b3JkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFFU2l6ZU9mQXR0cmlidXRlKCZfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVBRUtleXdvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0eXBlQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFTaXplKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCB0eXBlQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhU2l6ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQUVEZXNjX0FFUHV0QXR0cmlidXRlUHRyKEFFRGVzY09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlBRUtleXdvcmQgdGhlQUVLZXl3b3JkOwotCURlc2NUeXBlIHR5cGVDb2RlOwotCWNoYXIgKmRhdGFQdHJfX2luX187Ci0JbG9uZyBkYXRhUHRyX19sZW5fXzsKLQlpbnQgZGF0YVB0cl9faW5fbGVuX187CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgQUVLZXl3b3JkIHRoZUFFS2V5d29yZDsKKyAgICBEZXNjVHlwZSB0eXBlQ29kZTsKKyAgICBjaGFyICpkYXRhUHRyX19pbl9fOworICAgIGxvbmcgZGF0YVB0cl9fbGVuX187CisgICAgaW50IGRhdGFQdHJfX2luX2xlbl9fOwogI2lmbmRlZiBBRVB1dEF0dHJpYnV0ZVB0cgotCVB5TWFjX1BSRUNIRUNLKEFFUHV0QXR0cmlidXRlUHRyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBRVB1dEF0dHJpYnV0ZVB0cik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mcyMiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVBRUtleXdvcmQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnR5cGVDb2RlLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGF0YVB0cl9faW5fXywgJmRhdGFQdHJfX2luX2xlbl9fKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZGF0YVB0cl9fbGVuX18gPSBkYXRhUHRyX19pbl9sZW5fXzsKLQlfZXJyID0gQUVQdXRBdHRyaWJ1dGVQdHIoJl9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIHRoZUFFS2V5d29yZCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZUNvZGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFQdHJfX2luX18sIGRhdGFQdHJfX2xlbl9fKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mcyMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVBRUtleXdvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnR5cGVDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVB0cl9faW5fXywgJmRhdGFQdHJfX2luX2xlbl9fKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZGF0YVB0cl9fbGVuX18gPSBkYXRhUHRyX19pbl9sZW5fXzsKKyAgICBfZXJyID0gQUVQdXRBdHRyaWJ1dGVQdHIoJl9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZUFFS2V5d29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZUNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFQdHJfX2luX18sIGRhdGFQdHJfX2xlbl9fKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBRURlc2NfQUVQdXRBdHRyaWJ1dGVEZXNjKEFFRGVzY09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlBRUtleXdvcmQgdGhlQUVLZXl3b3JkOwotCUFFRGVzYyB0aGVBRURlc2M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgQUVLZXl3b3JkIHRoZUFFS2V5d29yZDsKKyAgICBBRURlc2MgdGhlQUVEZXNjOwogI2lmbmRlZiBBRVB1dEF0dHJpYnV0ZURlc2MKLQlQeU1hY19QUkVDSEVDSyhBRVB1dEF0dHJpYnV0ZURlc2MpOworICAgIFB5TWFjX1BSRUNIRUNLKEFFUHV0QXR0cmlidXRlRGVzYyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlQUVLZXl3b3JkLAotCSAgICAgICAgICAgICAgICAgICAgICBBRURlc2NfQ29udmVydCwgJnRoZUFFRGVzYykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBRVB1dEF0dHJpYnV0ZURlc2MoJl9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVBRUtleXdvcmQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlQUVEZXNjKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlQUVLZXl3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBRURlc2NfQ29udmVydCwgJnRoZUFFRGVzYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBBRVB1dEF0dHJpYnV0ZURlc2MoJl9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVBRUtleXdvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlQUVEZXNjKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBRURlc2NfQUVHZXREZXNjRGF0YVNpemUoQUVEZXNjT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTaXplIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgU2l6ZSBfcnY7CiAjaWZuZGVmIEFFR2V0RGVzY0RhdGFTaXplCi0JUHlNYWNfUFJFQ0hFQ0soQUVHZXREZXNjRGF0YVNpemUpOworICAgIFB5TWFjX1BSRUNIRUNLKEFFR2V0RGVzY0RhdGFTaXplKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBBRUdldERlc2NEYXRhU2l6ZSgmX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEFFR2V0RGVzY0RhdGFTaXplKCZfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBRURlc2NfQUVTZW5kKEFFRGVzY09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlBcHBsZUV2ZW50IHJlcGx5OwotCUFFU2VuZE1vZGUgc2VuZE1vZGU7Ci0JQUVTZW5kUHJpb3JpdHkgc2VuZFByaW9yaXR5OwotCWxvbmcgdGltZU91dEluVGlja3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgQXBwbGVFdmVudCByZXBseTsKKyAgICBBRVNlbmRNb2RlIHNlbmRNb2RlOworICAgIEFFU2VuZFByaW9yaXR5IHNlbmRQcmlvcml0eTsKKyAgICBsb25nIHRpbWVPdXRJblRpY2tzOwogI2lmbmRlZiBBRVNlbmQKLQlQeU1hY19QUkVDSEVDSyhBRVNlbmQpOworICAgIFB5TWFjX1BSRUNIRUNLKEFFU2VuZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsaGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2VuZE1vZGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZzZW5kUHJpb3JpdHksCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aW1lT3V0SW5UaWNrcykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBRVNlbmQoJl9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAmcmVwbHksCi0JICAgICAgICAgICAgICBzZW5kTW9kZSwKLQkgICAgICAgICAgICAgIHNlbmRQcmlvcml0eSwKLQkgICAgICAgICAgICAgIHRpbWVPdXRJblRpY2tzLAotCSAgICAgICAgICAgICAgdXBwX0FFSWRsZVByb2MsCi0JICAgICAgICAgICAgICAoQUVGaWx0ZXJVUFApMCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19OZXcsICZyZXBseSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGhsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlbmRNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VuZFByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGltZU91dEluVGlja3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQUVTZW5kKCZfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgJnJlcGx5LAorICAgICAgICAgICAgICAgICAgc2VuZE1vZGUsCisgICAgICAgICAgICAgICAgICBzZW5kUHJpb3JpdHksCisgICAgICAgICAgICAgICAgICB0aW1lT3V0SW5UaWNrcywKKyAgICAgICAgICAgICAgICAgIHVwcF9BRUlkbGVQcm9jLAorICAgICAgICAgICAgICAgICAgKEFFRmlsdGVyVVBQKTApOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBRURlc2NfTmV3LCAmcmVwbHkpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFFRGVzY19BRVJlc2V0VGltZXIoQUVEZXNjT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOwogI2lmbmRlZiBBRVJlc2V0VGltZXIKLQlQeU1hY19QUkVDSEVDSyhBRVJlc2V0VGltZXIpOworICAgIFB5TWFjX1BSRUNIRUNLKEFFUmVzZXRUaW1lcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEFFUmVzZXRUaW1lcigmX3NlbGYtPm9iX2l0c2VsZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBBRVJlc2V0VGltZXIoJl9zZWxmLT5vYl9pdHNlbGYpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFFRGVzY19BRVN1c3BlbmRUaGVDdXJyZW50RXZlbnQoQUVEZXNjT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOwogI2lmbmRlZiBBRVN1c3BlbmRUaGVDdXJyZW50RXZlbnQKLQlQeU1hY19QUkVDSEVDSyhBRVN1c3BlbmRUaGVDdXJyZW50RXZlbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKEFFU3VzcGVuZFRoZUN1cnJlbnRFdmVudCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEFFU3VzcGVuZFRoZUN1cnJlbnRFdmVudCgmX3NlbGYtPm9iX2l0c2VsZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBBRVN1c3BlbmRUaGVDdXJyZW50RXZlbnQoJl9zZWxmLT5vYl9pdHNlbGYpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFFRGVzY19BRVJlc3VtZVRoZUN1cnJlbnRFdmVudChBRURlc2NPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JQXBwbGVFdmVudCByZXBseTsKLQlBRUV2ZW50SGFuZGxlclVQUCBkaXNwYXRjaGVyX19wcm9jX18gPSB1cHBfR2VuZXJpY0V2ZW50SGFuZGxlcjsKLQlQeU9iamVjdCAqZGlzcGF0Y2hlcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBBcHBsZUV2ZW50IHJlcGx5OworICAgIEFFRXZlbnRIYW5kbGVyVVBQIGRpc3BhdGNoZXJfX3Byb2NfXyA9IHVwcF9HZW5lcmljRXZlbnRIYW5kbGVyOworICAgIFB5T2JqZWN0ICpkaXNwYXRjaGVyOwogI2lmbmRlZiBBRVJlc3VtZVRoZUN1cnJlbnRFdmVudAotCVB5TWFjX1BSRUNIRUNLKEFFUmVzdW1lVGhlQ3VycmVudEV2ZW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhBRVJlc3VtZVRoZUN1cnJlbnRFdmVudCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8iLAotCSAgICAgICAgICAgICAgICAgICAgICBBRURlc2NfQ29udmVydCwgJnJlcGx5LAotCSAgICAgICAgICAgICAgICAgICAgICAmZGlzcGF0Y2hlcikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBRVJlc3VtZVRoZUN1cnJlbnRFdmVudCgmX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlcGx5LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaGVyX19wcm9jX18sIAotCQkJCSAgICAgICAoU1JlZkNvbilkaXNwYXRjaGVyKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlQeV9JTkNSRUYoZGlzcGF0Y2hlcik7IC8qIFhYWCBsZWFrLCBidXQgbmVlZGVkICovCi0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX0NvbnZlcnQsICZyZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRpc3BhdGNoZXIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQUVSZXN1bWVUaGVDdXJyZW50RXZlbnQoJl9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2hlcl9fcHJvY19fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU1JlZkNvbilkaXNwYXRjaGVyKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoZGlzcGF0Y2hlcik7IC8qIFhYWCBsZWFrLCBidXQgbmVlZGVkICovCisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQUVEZXNjX0FFR2V0VGhlQ3VycmVudEV2ZW50KEFFRGVzY09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKICNpZm5kZWYgQUVHZXRUaGVDdXJyZW50RXZlbnQKLQlQeU1hY19QUkVDSEVDSyhBRUdldFRoZUN1cnJlbnRFdmVudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQUVHZXRUaGVDdXJyZW50RXZlbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBRUdldFRoZUN1cnJlbnRFdmVudCgmX3NlbGYtPm9iX2l0c2VsZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBBRUdldFRoZUN1cnJlbnRFdmVudCgmX3NlbGYtPm9iX2l0c2VsZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQUVEZXNjX0FFU2V0VGhlQ3VycmVudEV2ZW50KEFFRGVzY09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKICNpZm5kZWYgQUVTZXRUaGVDdXJyZW50RXZlbnQKLQlQeU1hY19QUkVDSEVDSyhBRVNldFRoZUN1cnJlbnRFdmVudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQUVTZXRUaGVDdXJyZW50RXZlbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBRVNldFRoZUN1cnJlbnRFdmVudCgmX3NlbGYtPm9iX2l0c2VsZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBBRVNldFRoZUN1cnJlbnRFdmVudCgmX3NlbGYtPm9iX2l0c2VsZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQUVEZXNjX0FFUmVzb2x2ZShBRURlc2NPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0Jc2hvcnQgY2FsbGJhY2tGbGFnczsKLQlBRURlc2MgdGhlVG9rZW47CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgc2hvcnQgY2FsbGJhY2tGbGFnczsKKyAgICBBRURlc2MgdGhlVG9rZW47CiAjaWZuZGVmIEFFUmVzb2x2ZQotCVB5TWFjX1BSRUNIRUNLKEFFUmVzb2x2ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQUVSZXNvbHZlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmY2FsbGJhY2tGbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBRVJlc29sdmUoJl9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICBjYWxsYmFja0ZsYWdzLAotCSAgICAgICAgICAgICAgICAgJnRoZVRva2VuKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX05ldywgJnRoZVRva2VuKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNhbGxiYWNrRmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQUVSZXNvbHZlKCZfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICZ0aGVUb2tlbik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19OZXcsICZ0aGVUb2tlbik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQUVEZXNjX0F1dG9EaXNwb3NlKEFFRGVzY09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogCi0JaW50IG9ub2ZmLCBvbGQ7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaSIsICZvbm9mZikpCi0JICAgICAgICByZXR1cm4gTlVMTDsKLQlvbGQgPSBfc2VsZi0+b2Jfb3duZWQ7Ci0JX3NlbGYtPm9iX293bmVkID0gb25vZmY7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImkiLCBvbGQpOwotCXJldHVybiBfcmVzOworICAgIGludCBvbm9mZiwgb2xkOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImkiLCAmb25vZmYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBvbGQgPSBfc2VsZi0+b2Jfb3duZWQ7CisgICAgX3NlbGYtPm9iX293bmVkID0gb25vZmY7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImkiLCBvbGQpOworICAgIHJldHVybiBfcmVzOwogCiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBBRURlc2NfbWV0aG9kc1tdID0gewotCXsiQUVDb2VyY2VEZXNjIiwgKFB5Q0Z1bmN0aW9uKUFFRGVzY19BRUNvZXJjZURlc2MsIDEsCi0JIFB5RG9jX1NUUigiKERlc2NUeXBlIHRvVHlwZSkgLT4gKEFFRGVzYyByZXN1bHQpIil9LAotCXsiQUVEdXBsaWNhdGVEZXNjIiwgKFB5Q0Z1bmN0aW9uKUFFRGVzY19BRUR1cGxpY2F0ZURlc2MsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEFFRGVzYyByZXN1bHQpIil9LAotCXsiQUVDb3VudEl0ZW1zIiwgKFB5Q0Z1bmN0aW9uKUFFRGVzY19BRUNvdW50SXRlbXMsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKGxvbmcgdGhlQ291bnQpIil9LAotCXsiQUVQdXRQdHIiLCAoUHlDRnVuY3Rpb24pQUVEZXNjX0FFUHV0UHRyLCAxLAotCSBQeURvY19TVFIoIihsb25nIGluZGV4LCBEZXNjVHlwZSB0eXBlQ29kZSwgQnVmZmVyIGRhdGFQdHIpIC0+IE5vbmUiKX0sCi0JeyJBRVB1dERlc2MiLCAoUHlDRnVuY3Rpb24pQUVEZXNjX0FFUHV0RGVzYywgMSwKLQkgUHlEb2NfU1RSKCIobG9uZyBpbmRleCwgQUVEZXNjIHRoZUFFRGVzYykgLT4gTm9uZSIpfSwKLQl7IkFFR2V0TnRoUHRyIiwgKFB5Q0Z1bmN0aW9uKUFFRGVzY19BRUdldE50aFB0ciwgMSwKLQkgUHlEb2NfU1RSKCIobG9uZyBpbmRleCwgRGVzY1R5cGUgZGVzaXJlZFR5cGUsIEJ1ZmZlciBkYXRhUHRyKSAtPiAoQUVLZXl3b3JkIHRoZUFFS2V5d29yZCwgRGVzY1R5cGUgdHlwZUNvZGUsIEJ1ZmZlciBkYXRhUHRyKSIpfSwKLQl7IkFFR2V0TnRoRGVzYyIsIChQeUNGdW5jdGlvbilBRURlc2NfQUVHZXROdGhEZXNjLCAxLAotCSBQeURvY19TVFIoIihsb25nIGluZGV4LCBEZXNjVHlwZSBkZXNpcmVkVHlwZSkgLT4gKEFFS2V5d29yZCB0aGVBRUtleXdvcmQsIEFFRGVzYyByZXN1bHQpIil9LAotCXsiQUVTaXplT2ZOdGhJdGVtIiwgKFB5Q0Z1bmN0aW9uKUFFRGVzY19BRVNpemVPZk50aEl0ZW0sIDEsCi0JIFB5RG9jX1NUUigiKGxvbmcgaW5kZXgpIC0+IChEZXNjVHlwZSB0eXBlQ29kZSwgU2l6ZSBkYXRhU2l6ZSkiKX0sCi0JeyJBRURlbGV0ZUl0ZW0iLCAoUHlDRnVuY3Rpb24pQUVEZXNjX0FFRGVsZXRlSXRlbSwgMSwKLQkgUHlEb2NfU1RSKCIobG9uZyBpbmRleCkgLT4gTm9uZSIpfSwKLQl7IkFFUHV0UGFyYW1QdHIiLCAoUHlDRnVuY3Rpb24pQUVEZXNjX0FFUHV0UGFyYW1QdHIsIDEsCi0JIFB5RG9jX1NUUigiKEFFS2V5d29yZCB0aGVBRUtleXdvcmQsIERlc2NUeXBlIHR5cGVDb2RlLCBCdWZmZXIgZGF0YVB0cikgLT4gTm9uZSIpfSwKLQl7IkFFUHV0UGFyYW1EZXNjIiwgKFB5Q0Z1bmN0aW9uKUFFRGVzY19BRVB1dFBhcmFtRGVzYywgMSwKLQkgUHlEb2NfU1RSKCIoQUVLZXl3b3JkIHRoZUFFS2V5d29yZCwgQUVEZXNjIHRoZUFFRGVzYykgLT4gTm9uZSIpfSwKLQl7IkFFR2V0UGFyYW1QdHIiLCAoUHlDRnVuY3Rpb24pQUVEZXNjX0FFR2V0UGFyYW1QdHIsIDEsCi0JIFB5RG9jX1NUUigiKEFFS2V5d29yZCB0aGVBRUtleXdvcmQsIERlc2NUeXBlIGRlc2lyZWRUeXBlLCBCdWZmZXIgZGF0YVB0cikgLT4gKERlc2NUeXBlIHR5cGVDb2RlLCBCdWZmZXIgZGF0YVB0cikiKX0sCi0JeyJBRUdldFBhcmFtRGVzYyIsIChQeUNGdW5jdGlvbilBRURlc2NfQUVHZXRQYXJhbURlc2MsIDEsCi0JIFB5RG9jX1NUUigiKEFFS2V5d29yZCB0aGVBRUtleXdvcmQsIERlc2NUeXBlIGRlc2lyZWRUeXBlKSAtPiAoQUVEZXNjIHJlc3VsdCkiKX0sCi0JeyJBRVNpemVPZlBhcmFtIiwgKFB5Q0Z1bmN0aW9uKUFFRGVzY19BRVNpemVPZlBhcmFtLCAxLAotCSBQeURvY19TVFIoIihBRUtleXdvcmQgdGhlQUVLZXl3b3JkKSAtPiAoRGVzY1R5cGUgdHlwZUNvZGUsIFNpemUgZGF0YVNpemUpIil9LAotCXsiQUVEZWxldGVQYXJhbSIsIChQeUNGdW5jdGlvbilBRURlc2NfQUVEZWxldGVQYXJhbSwgMSwKLQkgUHlEb2NfU1RSKCIoQUVLZXl3b3JkIHRoZUFFS2V5d29yZCkgLT4gTm9uZSIpfSwKLQl7IkFFR2V0QXR0cmlidXRlUHRyIiwgKFB5Q0Z1bmN0aW9uKUFFRGVzY19BRUdldEF0dHJpYnV0ZVB0ciwgMSwKLQkgUHlEb2NfU1RSKCIoQUVLZXl3b3JkIHRoZUFFS2V5d29yZCwgRGVzY1R5cGUgZGVzaXJlZFR5cGUsIEJ1ZmZlciBkYXRhUHRyKSAtPiAoRGVzY1R5cGUgdHlwZUNvZGUsIEJ1ZmZlciBkYXRhUHRyKSIpfSwKLQl7IkFFR2V0QXR0cmlidXRlRGVzYyIsIChQeUNGdW5jdGlvbilBRURlc2NfQUVHZXRBdHRyaWJ1dGVEZXNjLCAxLAotCSBQeURvY19TVFIoIihBRUtleXdvcmQgdGhlQUVLZXl3b3JkLCBEZXNjVHlwZSBkZXNpcmVkVHlwZSkgLT4gKEFFRGVzYyByZXN1bHQpIil9LAotCXsiQUVTaXplT2ZBdHRyaWJ1dGUiLCAoUHlDRnVuY3Rpb24pQUVEZXNjX0FFU2l6ZU9mQXR0cmlidXRlLCAxLAotCSBQeURvY19TVFIoIihBRUtleXdvcmQgdGhlQUVLZXl3b3JkKSAtPiAoRGVzY1R5cGUgdHlwZUNvZGUsIFNpemUgZGF0YVNpemUpIil9LAotCXsiQUVQdXRBdHRyaWJ1dGVQdHIiLCAoUHlDRnVuY3Rpb24pQUVEZXNjX0FFUHV0QXR0cmlidXRlUHRyLCAxLAotCSBQeURvY19TVFIoIihBRUtleXdvcmQgdGhlQUVLZXl3b3JkLCBEZXNjVHlwZSB0eXBlQ29kZSwgQnVmZmVyIGRhdGFQdHIpIC0+IE5vbmUiKX0sCi0JeyJBRVB1dEF0dHJpYnV0ZURlc2MiLCAoUHlDRnVuY3Rpb24pQUVEZXNjX0FFUHV0QXR0cmlidXRlRGVzYywgMSwKLQkgUHlEb2NfU1RSKCIoQUVLZXl3b3JkIHRoZUFFS2V5d29yZCwgQUVEZXNjIHRoZUFFRGVzYykgLT4gTm9uZSIpfSwKLQl7IkFFR2V0RGVzY0RhdGFTaXplIiwgKFB5Q0Z1bmN0aW9uKUFFRGVzY19BRUdldERlc2NEYXRhU2l6ZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoU2l6ZSBfcnYpIil9LAotCXsiQUVTZW5kIiwgKFB5Q0Z1bmN0aW9uKUFFRGVzY19BRVNlbmQsIDEsCi0JIFB5RG9jX1NUUigiKEFFU2VuZE1vZGUgc2VuZE1vZGUsIEFFU2VuZFByaW9yaXR5IHNlbmRQcmlvcml0eSwgbG9uZyB0aW1lT3V0SW5UaWNrcykgLT4gKEFwcGxlRXZlbnQgcmVwbHkpIil9LAotCXsiQUVSZXNldFRpbWVyIiwgKFB5Q0Z1bmN0aW9uKUFFRGVzY19BRVJlc2V0VGltZXIsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkFFU3VzcGVuZFRoZUN1cnJlbnRFdmVudCIsIChQeUNGdW5jdGlvbilBRURlc2NfQUVTdXNwZW5kVGhlQ3VycmVudEV2ZW50LCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJBRVJlc3VtZVRoZUN1cnJlbnRFdmVudCIsIChQeUNGdW5jdGlvbilBRURlc2NfQUVSZXN1bWVUaGVDdXJyZW50RXZlbnQsIDEsCi0JIFB5RG9jX1NUUigiKEFwcGxlRXZlbnQgcmVwbHksIEV2ZW50SGFuZGxlciBkaXNwYXRjaGVyKSAtPiBOb25lIil9LAotCXsiQUVHZXRUaGVDdXJyZW50RXZlbnQiLCAoUHlDRnVuY3Rpb24pQUVEZXNjX0FFR2V0VGhlQ3VycmVudEV2ZW50LCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJBRVNldFRoZUN1cnJlbnRFdmVudCIsIChQeUNGdW5jdGlvbilBRURlc2NfQUVTZXRUaGVDdXJyZW50RXZlbnQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkFFUmVzb2x2ZSIsIChQeUNGdW5jdGlvbilBRURlc2NfQUVSZXNvbHZlLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBjYWxsYmFja0ZsYWdzKSAtPiAoQUVEZXNjIHRoZVRva2VuKSIpfSwKLQl7IkF1dG9EaXNwb3NlIiwgKFB5Q0Z1bmN0aW9uKUFFRGVzY19BdXRvRGlzcG9zZSwgMSwKLQkgUHlEb2NfU1RSKCIoaW50KS0+aW50LiBBdXRvbWF0aWNhbGx5IEFFRGlzcG9zZURlc2MgdGhlIG9iamVjdCBvbiBQeXRob24gb2JqZWN0IGNsZWFudXAiKX0sCi0Je05VTEwsIE5VTEwsIDB9CisgICAgeyJBRUNvZXJjZURlc2MiLCAoUHlDRnVuY3Rpb24pQUVEZXNjX0FFQ29lcmNlRGVzYywgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGVzY1R5cGUgdG9UeXBlKSAtPiAoQUVEZXNjIHJlc3VsdCkiKX0sCisgICAgeyJBRUR1cGxpY2F0ZURlc2MiLCAoUHlDRnVuY3Rpb24pQUVEZXNjX0FFRHVwbGljYXRlRGVzYywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQUVEZXNjIHJlc3VsdCkiKX0sCisgICAgeyJBRUNvdW50SXRlbXMiLCAoUHlDRnVuY3Rpb24pQUVEZXNjX0FFQ291bnRJdGVtcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAobG9uZyB0aGVDb3VudCkiKX0sCisgICAgeyJBRVB1dFB0ciIsIChQeUNGdW5jdGlvbilBRURlc2NfQUVQdXRQdHIsIDEsCisgICAgIFB5RG9jX1NUUigiKGxvbmcgaW5kZXgsIERlc2NUeXBlIHR5cGVDb2RlLCBCdWZmZXIgZGF0YVB0cikgLT4gTm9uZSIpfSwKKyAgICB7IkFFUHV0RGVzYyIsIChQeUNGdW5jdGlvbilBRURlc2NfQUVQdXREZXNjLCAxLAorICAgICBQeURvY19TVFIoIihsb25nIGluZGV4LCBBRURlc2MgdGhlQUVEZXNjKSAtPiBOb25lIil9LAorICAgIHsiQUVHZXROdGhQdHIiLCAoUHlDRnVuY3Rpb24pQUVEZXNjX0FFR2V0TnRoUHRyLCAxLAorICAgICBQeURvY19TVFIoIihsb25nIGluZGV4LCBEZXNjVHlwZSBkZXNpcmVkVHlwZSwgQnVmZmVyIGRhdGFQdHIpIC0+IChBRUtleXdvcmQgdGhlQUVLZXl3b3JkLCBEZXNjVHlwZSB0eXBlQ29kZSwgQnVmZmVyIGRhdGFQdHIpIil9LAorICAgIHsiQUVHZXROdGhEZXNjIiwgKFB5Q0Z1bmN0aW9uKUFFRGVzY19BRUdldE50aERlc2MsIDEsCisgICAgIFB5RG9jX1NUUigiKGxvbmcgaW5kZXgsIERlc2NUeXBlIGRlc2lyZWRUeXBlKSAtPiAoQUVLZXl3b3JkIHRoZUFFS2V5d29yZCwgQUVEZXNjIHJlc3VsdCkiKX0sCisgICAgeyJBRVNpemVPZk50aEl0ZW0iLCAoUHlDRnVuY3Rpb24pQUVEZXNjX0FFU2l6ZU9mTnRoSXRlbSwgMSwKKyAgICAgUHlEb2NfU1RSKCIobG9uZyBpbmRleCkgLT4gKERlc2NUeXBlIHR5cGVDb2RlLCBTaXplIGRhdGFTaXplKSIpfSwKKyAgICB7IkFFRGVsZXRlSXRlbSIsIChQeUNGdW5jdGlvbilBRURlc2NfQUVEZWxldGVJdGVtLCAxLAorICAgICBQeURvY19TVFIoIihsb25nIGluZGV4KSAtPiBOb25lIil9LAorICAgIHsiQUVQdXRQYXJhbVB0ciIsIChQeUNGdW5jdGlvbilBRURlc2NfQUVQdXRQYXJhbVB0ciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQUVLZXl3b3JkIHRoZUFFS2V5d29yZCwgRGVzY1R5cGUgdHlwZUNvZGUsIEJ1ZmZlciBkYXRhUHRyKSAtPiBOb25lIil9LAorICAgIHsiQUVQdXRQYXJhbURlc2MiLCAoUHlDRnVuY3Rpb24pQUVEZXNjX0FFUHV0UGFyYW1EZXNjLCAxLAorICAgICBQeURvY19TVFIoIihBRUtleXdvcmQgdGhlQUVLZXl3b3JkLCBBRURlc2MgdGhlQUVEZXNjKSAtPiBOb25lIil9LAorICAgIHsiQUVHZXRQYXJhbVB0ciIsIChQeUNGdW5jdGlvbilBRURlc2NfQUVHZXRQYXJhbVB0ciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQUVLZXl3b3JkIHRoZUFFS2V5d29yZCwgRGVzY1R5cGUgZGVzaXJlZFR5cGUsIEJ1ZmZlciBkYXRhUHRyKSAtPiAoRGVzY1R5cGUgdHlwZUNvZGUsIEJ1ZmZlciBkYXRhUHRyKSIpfSwKKyAgICB7IkFFR2V0UGFyYW1EZXNjIiwgKFB5Q0Z1bmN0aW9uKUFFRGVzY19BRUdldFBhcmFtRGVzYywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQUVLZXl3b3JkIHRoZUFFS2V5d29yZCwgRGVzY1R5cGUgZGVzaXJlZFR5cGUpIC0+IChBRURlc2MgcmVzdWx0KSIpfSwKKyAgICB7IkFFU2l6ZU9mUGFyYW0iLCAoUHlDRnVuY3Rpb24pQUVEZXNjX0FFU2l6ZU9mUGFyYW0sIDEsCisgICAgIFB5RG9jX1NUUigiKEFFS2V5d29yZCB0aGVBRUtleXdvcmQpIC0+IChEZXNjVHlwZSB0eXBlQ29kZSwgU2l6ZSBkYXRhU2l6ZSkiKX0sCisgICAgeyJBRURlbGV0ZVBhcmFtIiwgKFB5Q0Z1bmN0aW9uKUFFRGVzY19BRURlbGV0ZVBhcmFtLCAxLAorICAgICBQeURvY19TVFIoIihBRUtleXdvcmQgdGhlQUVLZXl3b3JkKSAtPiBOb25lIil9LAorICAgIHsiQUVHZXRBdHRyaWJ1dGVQdHIiLCAoUHlDRnVuY3Rpb24pQUVEZXNjX0FFR2V0QXR0cmlidXRlUHRyLCAxLAorICAgICBQeURvY19TVFIoIihBRUtleXdvcmQgdGhlQUVLZXl3b3JkLCBEZXNjVHlwZSBkZXNpcmVkVHlwZSwgQnVmZmVyIGRhdGFQdHIpIC0+IChEZXNjVHlwZSB0eXBlQ29kZSwgQnVmZmVyIGRhdGFQdHIpIil9LAorICAgIHsiQUVHZXRBdHRyaWJ1dGVEZXNjIiwgKFB5Q0Z1bmN0aW9uKUFFRGVzY19BRUdldEF0dHJpYnV0ZURlc2MsIDEsCisgICAgIFB5RG9jX1NUUigiKEFFS2V5d29yZCB0aGVBRUtleXdvcmQsIERlc2NUeXBlIGRlc2lyZWRUeXBlKSAtPiAoQUVEZXNjIHJlc3VsdCkiKX0sCisgICAgeyJBRVNpemVPZkF0dHJpYnV0ZSIsIChQeUNGdW5jdGlvbilBRURlc2NfQUVTaXplT2ZBdHRyaWJ1dGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEFFS2V5d29yZCB0aGVBRUtleXdvcmQpIC0+IChEZXNjVHlwZSB0eXBlQ29kZSwgU2l6ZSBkYXRhU2l6ZSkiKX0sCisgICAgeyJBRVB1dEF0dHJpYnV0ZVB0ciIsIChQeUNGdW5jdGlvbilBRURlc2NfQUVQdXRBdHRyaWJ1dGVQdHIsIDEsCisgICAgIFB5RG9jX1NUUigiKEFFS2V5d29yZCB0aGVBRUtleXdvcmQsIERlc2NUeXBlIHR5cGVDb2RlLCBCdWZmZXIgZGF0YVB0cikgLT4gTm9uZSIpfSwKKyAgICB7IkFFUHV0QXR0cmlidXRlRGVzYyIsIChQeUNGdW5jdGlvbilBRURlc2NfQUVQdXRBdHRyaWJ1dGVEZXNjLCAxLAorICAgICBQeURvY19TVFIoIihBRUtleXdvcmQgdGhlQUVLZXl3b3JkLCBBRURlc2MgdGhlQUVEZXNjKSAtPiBOb25lIil9LAorICAgIHsiQUVHZXREZXNjRGF0YVNpemUiLCAoUHlDRnVuY3Rpb24pQUVEZXNjX0FFR2V0RGVzY0RhdGFTaXplLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChTaXplIF9ydikiKX0sCisgICAgeyJBRVNlbmQiLCAoUHlDRnVuY3Rpb24pQUVEZXNjX0FFU2VuZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQUVTZW5kTW9kZSBzZW5kTW9kZSwgQUVTZW5kUHJpb3JpdHkgc2VuZFByaW9yaXR5LCBsb25nIHRpbWVPdXRJblRpY2tzKSAtPiAoQXBwbGVFdmVudCByZXBseSkiKX0sCisgICAgeyJBRVJlc2V0VGltZXIiLCAoUHlDRnVuY3Rpb24pQUVEZXNjX0FFUmVzZXRUaW1lciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiQUVTdXNwZW5kVGhlQ3VycmVudEV2ZW50IiwgKFB5Q0Z1bmN0aW9uKUFFRGVzY19BRVN1c3BlbmRUaGVDdXJyZW50RXZlbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkFFUmVzdW1lVGhlQ3VycmVudEV2ZW50IiwgKFB5Q0Z1bmN0aW9uKUFFRGVzY19BRVJlc3VtZVRoZUN1cnJlbnRFdmVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQXBwbGVFdmVudCByZXBseSwgRXZlbnRIYW5kbGVyIGRpc3BhdGNoZXIpIC0+IE5vbmUiKX0sCisgICAgeyJBRUdldFRoZUN1cnJlbnRFdmVudCIsIChQeUNGdW5jdGlvbilBRURlc2NfQUVHZXRUaGVDdXJyZW50RXZlbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkFFU2V0VGhlQ3VycmVudEV2ZW50IiwgKFB5Q0Z1bmN0aW9uKUFFRGVzY19BRVNldFRoZUN1cnJlbnRFdmVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiQUVSZXNvbHZlIiwgKFB5Q0Z1bmN0aW9uKUFFRGVzY19BRVJlc29sdmUsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGNhbGxiYWNrRmxhZ3MpIC0+IChBRURlc2MgdGhlVG9rZW4pIil9LAorICAgIHsiQXV0b0Rpc3Bvc2UiLCAoUHlDRnVuY3Rpb24pQUVEZXNjX0F1dG9EaXNwb3NlLCAxLAorICAgICBQeURvY19TVFIoIihpbnQpLT5pbnQuIEF1dG9tYXRpY2FsbHkgQUVEaXNwb3NlRGVzYyB0aGUgb2JqZWN0IG9uIFB5dGhvbiBvYmplY3QgY2xlYW51cCIpfSwKKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqQUVEZXNjX2dldF90eXBlKEFFRGVzY09iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlNYWNfQnVpbGRPU1R5cGUoc2VsZi0+b2JfaXRzZWxmLmRlc2NyaXB0b3JUeXBlKTsKKyAgICByZXR1cm4gUHlNYWNfQnVpbGRPU1R5cGUoc2VsZi0+b2JfaXRzZWxmLmRlc2NyaXB0b3JUeXBlKTsKIH0KIAogI2RlZmluZSBBRURlc2Nfc2V0X3R5cGUgTlVMTAogCiBzdGF0aWMgUHlPYmplY3QgKkFFRGVzY19nZXRfZGF0YShBRURlc2NPYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JUHlPYmplY3QgKnJlczsKLQlTaXplIHNpemU7Ci0JY2hhciAqcHRyOwotCU9TRXJyIGVycjsKKyAgICBQeU9iamVjdCAqcmVzOworICAgIFNpemUgc2l6ZTsKKyAgICBjaGFyICpwdHI7CisgICAgT1NFcnIgZXJyOwogCi0Jc2l6ZSA9IEFFR2V0RGVzY0RhdGFTaXplKCZzZWxmLT5vYl9pdHNlbGYpOwotCWlmICggKHJlcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIHNpemUpKSA9PSBOVUxMICkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCAocHRyID0gUHlTdHJpbmdfQXNTdHJpbmcocmVzKSkgPT0gTlVMTCApCi0JCXJldHVybiBOVUxMOwotCWlmICggKGVycj1BRUdldERlc2NEYXRhKCZzZWxmLT5vYl9pdHNlbGYsIHB0ciwgc2l6ZSkpIDwgMCApCi0JCXJldHVybiBQeU1hY19FcnJvcihlcnIpOwotCXJldHVybiByZXM7CisgICAgc2l6ZSA9IEFFR2V0RGVzY0RhdGFTaXplKCZzZWxmLT5vYl9pdHNlbGYpOworICAgIGlmICggKHJlcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIHNpemUpKSA9PSBOVUxMICkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCAocHRyID0gUHlTdHJpbmdfQXNTdHJpbmcocmVzKSkgPT0gTlVMTCApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICggKGVycj1BRUdldERlc2NEYXRhKCZzZWxmLT5vYl9pdHNlbGYsIHB0ciwgc2l6ZSkpIDwgMCApCisgICAgICAgIHJldHVybiBQeU1hY19FcnJvcihlcnIpOworICAgIHJldHVybiByZXM7CiB9CiAKICNkZWZpbmUgQUVEZXNjX3NldF9kYXRhIE5VTEwKIAogc3RhdGljIFB5R2V0U2V0RGVmIEFFRGVzY19nZXRzZXRsaXN0W10gPSB7Ci0JeyJ0eXBlIiwgKGdldHRlcilBRURlc2NfZ2V0X3R5cGUsIChzZXR0ZXIpQUVEZXNjX3NldF90eXBlLCAiVHlwZSBvZiB0aGlzIEFFRGVzYyJ9LAotCXsiZGF0YSIsIChnZXR0ZXIpQUVEZXNjX2dldF9kYXRhLCAoc2V0dGVyKUFFRGVzY19zZXRfZGF0YSwgIlRoZSByYXcgZGF0YSBpbiB0aGlzIEFFRGVzYyJ9LAotCXtOVUxMLCBOVUxMLCBOVUxMLCBOVUxMfSwKKyAgICB7InR5cGUiLCAoZ2V0dGVyKUFFRGVzY19nZXRfdHlwZSwgKHNldHRlcilBRURlc2Nfc2V0X3R5cGUsICJUeXBlIG9mIHRoaXMgQUVEZXNjIn0sCisgICAgeyJkYXRhIiwgKGdldHRlcilBRURlc2NfZ2V0X2RhdGEsIChzZXR0ZXIpQUVEZXNjX3NldF9kYXRhLCAiVGhlIHJhdyBkYXRhIGluIHRoaXMgQUVEZXNjIn0sCisgICAge05VTEwsIE5VTEwsIE5VTEwsIE5VTEx9LAogfTsKIAogCkBAIC04NjksNjEgKzg2OSw2MSBAQAogCiBzdGF0aWMgUHlPYmplY3QgKkFFRGVzY190cF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlQeU9iamVjdCAqX3NlbGY7Ci0JQUVEZXNjIGl0c2VsZjsKLQljaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKKyAgICBQeU9iamVjdCAqX3NlbGY7CisgICAgQUVEZXNjIGl0c2VsZjsKKyAgICBjaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIEFFRGVzY19Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7Ci0JaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkoKEFFRGVzY09iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiBfc2VsZjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBBRURlc2NfQ29udmVydCwgJml0c2VsZikpIHJldHVybiBOVUxMOworICAgIGlmICgoX3NlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgKChBRURlc2NPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICByZXR1cm4gX3NlbGY7CiB9CiAKICNkZWZpbmUgQUVEZXNjX3RwX2ZyZWUgUHlPYmplY3RfRGVsCiAKIAogUHlUeXBlT2JqZWN0IEFFRGVzY19UeXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQotCTAsIC8qb2Jfc2l6ZSovCi0JIl9BRS5BRURlc2MiLCAvKnRwX25hbWUqLwotCXNpemVvZihBRURlc2NPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCi0JMCwgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKSBBRURlc2NfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KLQkwLCAvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykgQUVEZXNjX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCi0JKHJlcHJmdW5jKSBBRURlc2NfcmVwciwgLyp0cF9yZXByKi8KLQkoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCi0JKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpIEFFRGVzY19oYXNoLCAvKnRwX2hhc2gqLwotCTAsIC8qdHBfY2FsbCovCi0JMCwgLyp0cF9zdHIqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KLQlQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLwotCTAsIC8qdHBfYXNfYnVmZmVyKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQkwLCAvKnRwX2RvYyovCi0JMCwgLyp0cF90cmF2ZXJzZSovCi0JMCwgLyp0cF9jbGVhciovCi0JMCwgLyp0cF9yaWNoY29tcGFyZSovCi0JMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCi0JMCwgLyp0cF9pdGVyKi8KLQkwLCAvKnRwX2l0ZXJuZXh0Ki8KLQlBRURlc2NfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLwotCTAsIC8qdHBfbWVtYmVycyovCi0JQUVEZXNjX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KLQkwLCAvKnRwX2Jhc2UqLwotCTAsIC8qdHBfZGljdCovCi0JMCwgLyp0cF9kZXNjcl9nZXQqLwotCTAsIC8qdHBfZGVzY3Jfc2V0Ki8KLQkwLCAvKnRwX2RpY3RvZmZzZXQqLwotCUFFRGVzY190cF9pbml0LCAvKiB0cF9pbml0ICovCi0JQUVEZXNjX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLwotCUFFRGVzY190cF9uZXcsIC8qIHRwX25ldyAqLwotCUFFRGVzY190cF9mcmVlLCAvKiB0cF9mcmVlICovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgLypvYl9zaXplKi8KKyAgICAiX0FFLkFFRGVzYyIsIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKEFFRGVzY09iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpIEFFRGVzY19kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgIDAsIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLworICAgIChzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLworICAgIChjbXBmdW5jKSBBRURlc2NfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpIEFFRGVzY19yZXByLCAvKnRwX3JlcHIqLworICAgIChQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIChQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLworICAgIChoYXNoZnVuYykgQUVEZXNjX2hhc2gsIC8qdHBfaGFzaCovCisgICAgMCwgLyp0cF9jYWxsKi8KKyAgICAwLCAvKnRwX3N0ciovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLworICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCisgICAgMCwgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLworICAgIDAsIC8qdHBfZG9jKi8KKyAgICAwLCAvKnRwX3RyYXZlcnNlKi8KKyAgICAwLCAvKnRwX2NsZWFyKi8KKyAgICAwLCAvKnRwX3JpY2hjb21wYXJlKi8KKyAgICAwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KKyAgICAwLCAvKnRwX2l0ZXIqLworICAgIDAsIC8qdHBfaXRlcm5leHQqLworICAgIEFFRGVzY19tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCisgICAgMCwgLyp0cF9tZW1iZXJzKi8KKyAgICBBRURlc2NfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLworICAgIDAsIC8qdHBfYmFzZSovCisgICAgMCwgLyp0cF9kaWN0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX2dldCovCisgICAgMCwgLyp0cF9kZXNjcl9zZXQqLworICAgIDAsIC8qdHBfZGljdG9mZnNldCovCisgICAgQUVEZXNjX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KKyAgICBBRURlc2NfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCisgICAgQUVEZXNjX3RwX25ldywgLyogdHBfbmV3ICovCisgICAgQUVEZXNjX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSBFbmQgb2JqZWN0IHR5cGUgQUVEZXNjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtOTMxLDQ1NSArOTMxLDQ1NSBAQAogCiBzdGF0aWMgUHlPYmplY3QgKkFFX0FFQ29lcmNlUHRyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCURlc2NUeXBlIHR5cGVDb2RlOwotCWNoYXIgKmRhdGFQdHJfX2luX187Ci0JbG9uZyBkYXRhUHRyX19sZW5fXzsKLQlpbnQgZGF0YVB0cl9faW5fbGVuX187Ci0JRGVzY1R5cGUgdG9UeXBlOwotCUFFRGVzYyByZXN1bHQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgRGVzY1R5cGUgdHlwZUNvZGU7CisgICAgY2hhciAqZGF0YVB0cl9faW5fXzsKKyAgICBsb25nIGRhdGFQdHJfX2xlbl9fOworICAgIGludCBkYXRhUHRyX19pbl9sZW5fXzsKKyAgICBEZXNjVHlwZSB0b1R5cGU7CisgICAgQUVEZXNjIHJlc3VsdDsKICNpZm5kZWYgQUVDb2VyY2VQdHIKLQlQeU1hY19QUkVDSEVDSyhBRUNvZXJjZVB0cik7CisgICAgUHlNYWNfUFJFQ0hFQ0soQUVDb2VyY2VQdHIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzI08mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdHlwZUNvZGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZkYXRhUHRyX19pbl9fLCAmZGF0YVB0cl9faW5fbGVuX18sCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRvVHlwZSkpCi0JCXJldHVybiBOVUxMOwotCWRhdGFQdHJfX2xlbl9fID0gZGF0YVB0cl9faW5fbGVuX187Ci0JX2VyciA9IEFFQ29lcmNlUHRyKHR5cGVDb2RlLAotCSAgICAgICAgICAgICAgICAgICBkYXRhUHRyX19pbl9fLCBkYXRhUHRyX19sZW5fXywKLQkgICAgICAgICAgICAgICAgICAgdG9UeXBlLAotCSAgICAgICAgICAgICAgICAgICAmcmVzdWx0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX05ldywgJnJlc3VsdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzI08mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdHlwZUNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUHRyX19pbl9fLCAmZGF0YVB0cl9faW5fbGVuX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRvVHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGRhdGFQdHJfX2xlbl9fID0gZGF0YVB0cl9faW5fbGVuX187CisgICAgX2VyciA9IEFFQ29lcmNlUHRyKHR5cGVDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICBkYXRhUHRyX19pbl9fLCBkYXRhUHRyX19sZW5fXywKKyAgICAgICAgICAgICAgICAgICAgICAgdG9UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX05ldywgJnJlc3VsdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQUVfQUVDcmVhdGVEZXNjKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCURlc2NUeXBlIHR5cGVDb2RlOwotCWNoYXIgKmRhdGFQdHJfX2luX187Ci0JbG9uZyBkYXRhUHRyX19sZW5fXzsKLQlpbnQgZGF0YVB0cl9faW5fbGVuX187Ci0JQUVEZXNjIHJlc3VsdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBEZXNjVHlwZSB0eXBlQ29kZTsKKyAgICBjaGFyICpkYXRhUHRyX19pbl9fOworICAgIGxvbmcgZGF0YVB0cl9fbGVuX187CisgICAgaW50IGRhdGFQdHJfX2luX2xlbl9fOworICAgIEFFRGVzYyByZXN1bHQ7CiAjaWZuZGVmIEFFQ3JlYXRlRGVzYwotCVB5TWFjX1BSRUNIRUNLKEFFQ3JlYXRlRGVzYyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQUVDcmVhdGVEZXNjKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyMiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0eXBlQ29kZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRhdGFQdHJfX2luX18sICZkYXRhUHRyX19pbl9sZW5fXykpCi0JCXJldHVybiBOVUxMOwotCWRhdGFQdHJfX2xlbl9fID0gZGF0YVB0cl9faW5fbGVuX187Ci0JX2VyciA9IEFFQ3JlYXRlRGVzYyh0eXBlQ29kZSwKLQkgICAgICAgICAgICAgICAgICAgIGRhdGFQdHJfX2luX18sIGRhdGFQdHJfX2xlbl9fLAotCSAgICAgICAgICAgICAgICAgICAgJnJlc3VsdCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19OZXcsICZyZXN1bHQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0eXBlQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFQdHJfX2luX18sICZkYXRhUHRyX19pbl9sZW5fXykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGRhdGFQdHJfX2xlbl9fID0gZGF0YVB0cl9faW5fbGVuX187CisgICAgX2VyciA9IEFFQ3JlYXRlRGVzYyh0eXBlQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFQdHJfX2luX18sIGRhdGFQdHJfX2xlbl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19OZXcsICZyZXN1bHQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFFX0FFQ3JlYXRlTGlzdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQljaGFyICpmYWN0b3JpbmdQdHJfX2luX187Ci0JbG9uZyBmYWN0b3JpbmdQdHJfX2xlbl9fOwotCWludCBmYWN0b3JpbmdQdHJfX2luX2xlbl9fOwotCUJvb2xlYW4gaXNSZWNvcmQ7Ci0JQUVEZXNjTGlzdCByZXN1bHRMaXN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIGNoYXIgKmZhY3RvcmluZ1B0cl9faW5fXzsKKyAgICBsb25nIGZhY3RvcmluZ1B0cl9fbGVuX187CisgICAgaW50IGZhY3RvcmluZ1B0cl9faW5fbGVuX187CisgICAgQm9vbGVhbiBpc1JlY29yZDsKKyAgICBBRURlc2NMaXN0IHJlc3VsdExpc3Q7CiAjaWZuZGVmIEFFQ3JlYXRlTGlzdAotCVB5TWFjX1BSRUNIRUNLKEFFQ3JlYXRlTGlzdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQUVDcmVhdGVMaXN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInMjYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZmYWN0b3JpbmdQdHJfX2luX18sICZmYWN0b3JpbmdQdHJfX2luX2xlbl9fLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXNSZWNvcmQpKQotCQlyZXR1cm4gTlVMTDsKLQlmYWN0b3JpbmdQdHJfX2xlbl9fID0gZmFjdG9yaW5nUHRyX19pbl9sZW5fXzsKLQlfZXJyID0gQUVDcmVhdGVMaXN0KGZhY3RvcmluZ1B0cl9faW5fXywgZmFjdG9yaW5nUHRyX19sZW5fXywKLQkgICAgICAgICAgICAgICAgICAgIGlzUmVjb3JkLAotCSAgICAgICAgICAgICAgICAgICAgJnJlc3VsdExpc3QpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBBRURlc2NfTmV3LCAmcmVzdWx0TGlzdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAicyNiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZhY3RvcmluZ1B0cl9faW5fXywgJmZhY3RvcmluZ1B0cl9faW5fbGVuX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpc1JlY29yZCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGZhY3RvcmluZ1B0cl9fbGVuX18gPSBmYWN0b3JpbmdQdHJfX2luX2xlbl9fOworICAgIF9lcnIgPSBBRUNyZWF0ZUxpc3QoZmFjdG9yaW5nUHRyX19pbl9fLCBmYWN0b3JpbmdQdHJfX2xlbl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgaXNSZWNvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0TGlzdCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19OZXcsICZyZXN1bHRMaXN0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBRV9BRUNyZWF0ZUFwcGxlRXZlbnQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JQUVFdmVudENsYXNzIHRoZUFFRXZlbnRDbGFzczsKLQlBRUV2ZW50SUQgdGhlQUVFdmVudElEOwotCUFFQWRkcmVzc0Rlc2MgdGFyZ2V0OwotCUFFUmV0dXJuSUQgcmV0dXJuSUQ7Ci0JQUVUcmFuc2FjdGlvbklEIHRyYW5zYWN0aW9uSUQ7Ci0JQXBwbGVFdmVudCByZXN1bHQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgQUVFdmVudENsYXNzIHRoZUFFRXZlbnRDbGFzczsKKyAgICBBRUV2ZW50SUQgdGhlQUVFdmVudElEOworICAgIEFFQWRkcmVzc0Rlc2MgdGFyZ2V0OworICAgIEFFUmV0dXJuSUQgcmV0dXJuSUQ7CisgICAgQUVUcmFuc2FjdGlvbklEIHRyYW5zYWN0aW9uSUQ7CisgICAgQXBwbGVFdmVudCByZXN1bHQ7CiAjaWZuZGVmIEFFQ3JlYXRlQXBwbGVFdmVudAotCVB5TWFjX1BSRUNIRUNLKEFFQ3JlYXRlQXBwbGVFdmVudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQUVDcmVhdGVBcHBsZUV2ZW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmhsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlQUVFdmVudENsYXNzLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVBRUV2ZW50SUQsCi0JICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19Db252ZXJ0LCAmdGFyZ2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAmcmV0dXJuSUQsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0cmFuc2FjdGlvbklEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEFFQ3JlYXRlQXBwbGVFdmVudCh0aGVBRUV2ZW50Q2xhc3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVBRUV2ZW50SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmdGFyZ2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuSUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbklELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19OZXcsICZyZXN1bHQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmhsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlQUVFdmVudENsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVBRUV2ZW50SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19Db252ZXJ0LCAmdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmV0dXJuSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFuc2FjdGlvbklEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFFQ3JlYXRlQXBwbGVFdmVudCh0aGVBRUV2ZW50Q2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVBRUV2ZW50SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbklELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19OZXcsICZyZXN1bHQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFFX0FFUmVwbGFjZURlc2NEYXRhKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCURlc2NUeXBlIHR5cGVDb2RlOwotCWNoYXIgKmRhdGFQdHJfX2luX187Ci0JbG9uZyBkYXRhUHRyX19sZW5fXzsKLQlpbnQgZGF0YVB0cl9faW5fbGVuX187Ci0JQUVEZXNjIHRoZUFFRGVzYzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBEZXNjVHlwZSB0eXBlQ29kZTsKKyAgICBjaGFyICpkYXRhUHRyX19pbl9fOworICAgIGxvbmcgZGF0YVB0cl9fbGVuX187CisgICAgaW50IGRhdGFQdHJfX2luX2xlbl9fOworICAgIEFFRGVzYyB0aGVBRURlc2M7CiAjaWZuZGVmIEFFUmVwbGFjZURlc2NEYXRhCi0JUHlNYWNfUFJFQ0hFQ0soQUVSZXBsYWNlRGVzY0RhdGEpOworICAgIFB5TWFjX1BSRUNIRUNLKEFFUmVwbGFjZURlc2NEYXRhKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyMiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0eXBlQ29kZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRhdGFQdHJfX2luX18sICZkYXRhUHRyX19pbl9sZW5fXykpCi0JCXJldHVybiBOVUxMOwotCWRhdGFQdHJfX2xlbl9fID0gZGF0YVB0cl9faW5fbGVuX187Ci0JX2VyciA9IEFFUmVwbGFjZURlc2NEYXRhKHR5cGVDb2RlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUHRyX19pbl9fLCBkYXRhUHRyX19sZW5fXywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUFFRGVzYyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19OZXcsICZ0aGVBRURlc2MpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0eXBlQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFQdHJfX2luX18sICZkYXRhUHRyX19pbl9sZW5fXykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGRhdGFQdHJfX2xlbl9fID0gZGF0YVB0cl9faW5fbGVuX187CisgICAgX2VyciA9IEFFUmVwbGFjZURlc2NEYXRhKHR5cGVDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUHRyX19pbl9fLCBkYXRhUHRyX19sZW5fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUFFRGVzYyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19OZXcsICZ0aGVBRURlc2MpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFFX0FFUHJvY2Vzc0FwcGxlRXZlbnQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JRXZlbnRSZWNvcmQgdGhlRXZlbnRSZWNvcmQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgRXZlbnRSZWNvcmQgdGhlRXZlbnRSZWNvcmQ7CiAjaWZuZGVmIEFFUHJvY2Vzc0FwcGxlRXZlbnQKLQlQeU1hY19QUkVDSEVDSyhBRVByb2Nlc3NBcHBsZUV2ZW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhBRVByb2Nlc3NBcHBsZUV2ZW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RXZlbnRSZWNvcmQsICZ0aGVFdmVudFJlY29yZCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBRVByb2Nlc3NBcHBsZUV2ZW50KCZ0aGVFdmVudFJlY29yZCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRFdmVudFJlY29yZCwgJnRoZUV2ZW50UmVjb3JkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFFUHJvY2Vzc0FwcGxlRXZlbnQoJnRoZUV2ZW50UmVjb3JkKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBRV9BRUdldEludGVyYWN0aW9uQWxsb3dlZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlBRUludGVyYWN0QWxsb3dlZCBsZXZlbDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBBRUludGVyYWN0QWxsb3dlZCBsZXZlbDsKICNpZm5kZWYgQUVHZXRJbnRlcmFjdGlvbkFsbG93ZWQKLQlQeU1hY19QUkVDSEVDSyhBRUdldEludGVyYWN0aW9uQWxsb3dlZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQUVHZXRJbnRlcmFjdGlvbkFsbG93ZWQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBRUdldEludGVyYWN0aW9uQWxsb3dlZCgmbGV2ZWwpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIGxldmVsKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFFR2V0SW50ZXJhY3Rpb25BbGxvd2VkKCZsZXZlbCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFFX0FFU2V0SW50ZXJhY3Rpb25BbGxvd2VkKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUFFSW50ZXJhY3RBbGxvd2VkIGxldmVsOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEFFSW50ZXJhY3RBbGxvd2VkIGxldmVsOwogI2lmbmRlZiBBRVNldEludGVyYWN0aW9uQWxsb3dlZAotCVB5TWFjX1BSRUNIRUNLKEFFU2V0SW50ZXJhY3Rpb25BbGxvd2VkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBRVNldEludGVyYWN0aW9uQWxsb3dlZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmxldmVsKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEFFU2V0SW50ZXJhY3Rpb25BbGxvd2VkKGxldmVsKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmxldmVsKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFFU2V0SW50ZXJhY3Rpb25BbGxvd2VkKGxldmVsKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBRV9BRUludGVyYWN0V2l0aFVzZXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JbG9uZyB0aW1lT3V0SW5UaWNrczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBsb25nIHRpbWVPdXRJblRpY2tzOwogI2lmbmRlZiBBRUludGVyYWN0V2l0aFVzZXIKLQlQeU1hY19QUkVDSEVDSyhBRUludGVyYWN0V2l0aFVzZXIpOworICAgIFB5TWFjX1BSRUNIRUNLKEFFSW50ZXJhY3RXaXRoVXNlcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRpbWVPdXRJblRpY2tzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEFFSW50ZXJhY3RXaXRoVXNlcih0aW1lT3V0SW5UaWNrcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIChOTVJlY1B0cikwLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgdXBwX0FFSWRsZVByb2MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGltZU91dEluVGlja3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQUVJbnRlcmFjdFdpdGhVc2VyKHRpbWVPdXRJblRpY2tzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE5NUmVjUHRyKTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cHBfQUVJZGxlUHJvYyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQUVfQUVJbnN0YWxsRXZlbnRIYW5kbGVyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUFFRXZlbnRDbGFzcyB0aGVBRUV2ZW50Q2xhc3M7Ci0JQUVFdmVudElEIHRoZUFFRXZlbnRJRDsKLQlBRUV2ZW50SGFuZGxlclVQUCBoYW5kbGVyX19wcm9jX18gPSB1cHBfR2VuZXJpY0V2ZW50SGFuZGxlcjsKLQlQeU9iamVjdCAqaGFuZGxlcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBBRUV2ZW50Q2xhc3MgdGhlQUVFdmVudENsYXNzOworICAgIEFFRXZlbnRJRCB0aGVBRUV2ZW50SUQ7CisgICAgQUVFdmVudEhhbmRsZXJVUFAgaGFuZGxlcl9fcHJvY19fID0gdXBwX0dlbmVyaWNFdmVudEhhbmRsZXI7CisgICAgUHlPYmplY3QgKmhhbmRsZXI7CiAjaWZuZGVmIEFFSW5zdGFsbEV2ZW50SGFuZGxlcgotCVB5TWFjX1BSRUNIRUNLKEFFSW5zdGFsbEV2ZW50SGFuZGxlcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soQUVJbnN0YWxsRXZlbnRIYW5kbGVyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlQUVFdmVudENsYXNzLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVBRUV2ZW50SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICZoYW5kbGVyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEFFSW5zdGFsbEV2ZW50SGFuZGxlcih0aGVBRUV2ZW50Q2xhc3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVBRUV2ZW50SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyX19wcm9jX18sIChTUmVmQ29uKWhhbmRsZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlQeV9JTkNSRUYoaGFuZGxlcik7IC8qIFhYWCBsZWFrLCBidXQgbmVlZGVkICovCi0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVBRUV2ZW50Q2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZUFFRXZlbnRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmhhbmRsZXIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQUVJbnN0YWxsRXZlbnRIYW5kbGVyKHRoZUFFRXZlbnRDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZUFFRXZlbnRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXJfX3Byb2NfXywgKFNSZWZDb24paGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihoYW5kbGVyKTsgLyogWFhYIGxlYWssIGJ1dCBuZWVkZWQgKi8KKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBRV9BRVJlbW92ZUV2ZW50SGFuZGxlcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlBRUV2ZW50Q2xhc3MgdGhlQUVFdmVudENsYXNzOwotCUFFRXZlbnRJRCB0aGVBRUV2ZW50SUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgQUVFdmVudENsYXNzIHRoZUFFRXZlbnRDbGFzczsKKyAgICBBRUV2ZW50SUQgdGhlQUVFdmVudElEOwogI2lmbmRlZiBBRVJlbW92ZUV2ZW50SGFuZGxlcgotCVB5TWFjX1BSRUNIRUNLKEFFUmVtb3ZlRXZlbnRIYW5kbGVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBRVJlbW92ZUV2ZW50SGFuZGxlcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlQUVFdmVudENsYXNzLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVBRUV2ZW50SUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQUVSZW1vdmVFdmVudEhhbmRsZXIodGhlQUVFdmVudENsYXNzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVBRUV2ZW50SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwcF9HZW5lcmljRXZlbnRIYW5kbGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlQUVFdmVudENsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVBRUV2ZW50SUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQUVSZW1vdmVFdmVudEhhbmRsZXIodGhlQUVFdmVudENsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVBRUV2ZW50SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwcF9HZW5lcmljRXZlbnRIYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBRV9BRUdldEV2ZW50SGFuZGxlcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlBRUV2ZW50Q2xhc3MgdGhlQUVFdmVudENsYXNzOwotCUFFRXZlbnRJRCB0aGVBRUV2ZW50SUQ7Ci0JQUVFdmVudEhhbmRsZXJVUFAgaGFuZGxlcl9fcHJvY19fID0gdXBwX0dlbmVyaWNFdmVudEhhbmRsZXI7Ci0JUHlPYmplY3QgKmhhbmRsZXI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgQUVFdmVudENsYXNzIHRoZUFFRXZlbnRDbGFzczsKKyAgICBBRUV2ZW50SUQgdGhlQUVFdmVudElEOworICAgIEFFRXZlbnRIYW5kbGVyVVBQIGhhbmRsZXJfX3Byb2NfXyA9IHVwcF9HZW5lcmljRXZlbnRIYW5kbGVyOworICAgIFB5T2JqZWN0ICpoYW5kbGVyOwogI2lmbmRlZiBBRUdldEV2ZW50SGFuZGxlcgotCVB5TWFjX1BSRUNIRUNLKEFFR2V0RXZlbnRIYW5kbGVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBRUdldEV2ZW50SGFuZGxlcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlQUVFdmVudENsYXNzLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVBRUV2ZW50SUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQUVHZXRFdmVudEhhbmRsZXIodGhlQUVFdmVudENsYXNzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICB0aGVBRUV2ZW50SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZoYW5kbGVyX19wcm9jX18sIChTUmVmQ29uICopJmhhbmRsZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIDApOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8iLAotCSAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXIpOwotCVB5X0lOQ1JFRihoYW5kbGVyKTsgLyogWFhYIGxlYWssIGJ1dCBuZWVkZWQgKi8KLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlQUVFdmVudENsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVBRUV2ZW50SUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQUVHZXRFdmVudEhhbmRsZXIodGhlQUVFdmVudENsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVBRUV2ZW50SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoYW5kbGVyX19wcm9jX18sIChTUmVmQ29uICopJmhhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8iLAorICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXIpOworICAgIFB5X0lOQ1JFRihoYW5kbGVyKTsgLyogWFhYIGxlYWssIGJ1dCBuZWVkZWQgKi8KKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBRV9BRUluc3RhbGxTcGVjaWFsSGFuZGxlcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlBRUtleXdvcmQgZnVuY3Rpb25DbGFzczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBBRUtleXdvcmQgZnVuY3Rpb25DbGFzczsKICNpZm5kZWYgQUVJbnN0YWxsU3BlY2lhbEhhbmRsZXIKLQlQeU1hY19QUkVDSEVDSyhBRUluc3RhbGxTcGVjaWFsSGFuZGxlcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soQUVJbnN0YWxsU3BlY2lhbEhhbmRsZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZmdW5jdGlvbkNsYXNzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEFFSW5zdGFsbFNwZWNpYWxIYW5kbGVyKGZ1bmN0aW9uQ2xhc3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwcF9HZW5lcmljRXZlbnRIYW5kbGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmZ1bmN0aW9uQ2xhc3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQUVJbnN0YWxsU3BlY2lhbEhhbmRsZXIoZnVuY3Rpb25DbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBwX0dlbmVyaWNFdmVudEhhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFFX0FFUmVtb3ZlU3BlY2lhbEhhbmRsZXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JQUVLZXl3b3JkIGZ1bmN0aW9uQ2xhc3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgQUVLZXl3b3JkIGZ1bmN0aW9uQ2xhc3M7CiAjaWZuZGVmIEFFUmVtb3ZlU3BlY2lhbEhhbmRsZXIKLQlQeU1hY19QUkVDSEVDSyhBRVJlbW92ZVNwZWNpYWxIYW5kbGVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBRVJlbW92ZVNwZWNpYWxIYW5kbGVyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZnVuY3Rpb25DbGFzcykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBRVJlbW92ZVNwZWNpYWxIYW5kbGVyKGZ1bmN0aW9uQ2xhc3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBwX0dlbmVyaWNFdmVudEhhbmRsZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZmdW5jdGlvbkNsYXNzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFFUmVtb3ZlU3BlY2lhbEhhbmRsZXIoZnVuY3Rpb25DbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cHBfR2VuZXJpY0V2ZW50SGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBRV9BRU1hbmFnZXJJbmZvKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUFFS2V5d29yZCBrZXlXb3JkOwotCWxvbmcgcmVzdWx0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEFFS2V5d29yZCBrZXlXb3JkOworICAgIGxvbmcgcmVzdWx0OwogI2lmbmRlZiBBRU1hbmFnZXJJbmZvCi0JUHlNYWNfUFJFQ0hFQ0soQUVNYW5hZ2VySW5mbyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQUVNYW5hZ2VySW5mbyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmtleVdvcmQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQUVNYW5hZ2VySW5mbyhrZXlXb3JkLAotCSAgICAgICAgICAgICAgICAgICAgICZyZXN1bHQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZrZXlXb3JkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFFTWFuYWdlckluZm8oa2V5V29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFFX0FFT2JqZWN0SW5pdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKICNpZm5kZWYgQUVPYmplY3RJbml0Ci0JUHlNYWNfUFJFQ0hFQ0soQUVPYmplY3RJbml0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhBRU9iamVjdEluaXQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBRU9iamVjdEluaXQoKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFFT2JqZWN0SW5pdCgpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFFX0FFRGlzcG9zZVRva2VuKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUFFRGVzYyB0aGVUb2tlbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBBRURlc2MgdGhlVG9rZW47CiAjaWZuZGVmIEFFRGlzcG9zZVRva2VuCi0JUHlNYWNfUFJFQ0hFQ0soQUVEaXNwb3NlVG9rZW4pOworICAgIFB5TWFjX1BSRUNIRUNLKEFFRGlzcG9zZVRva2VuKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQUVEaXNwb3NlVG9rZW4oJnRoZVRva2VuKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX05ldywgJnRoZVRva2VuKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFFRGlzcG9zZVRva2VuKCZ0aGVUb2tlbik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19OZXcsICZ0aGVUb2tlbik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQUVfQUVDYWxsT2JqZWN0QWNjZXNzb3IoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JRGVzY1R5cGUgZGVzaXJlZENsYXNzOwotCUFFRGVzYyBjb250YWluZXJUb2tlbjsKLQlEZXNjVHlwZSBjb250YWluZXJDbGFzczsKLQlEZXNjVHlwZSBrZXlGb3JtOwotCUFFRGVzYyBrZXlEYXRhOwotCUFFRGVzYyB0b2tlbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBEZXNjVHlwZSBkZXNpcmVkQ2xhc3M7CisgICAgQUVEZXNjIGNvbnRhaW5lclRva2VuOworICAgIERlc2NUeXBlIGNvbnRhaW5lckNsYXNzOworICAgIERlc2NUeXBlIGtleUZvcm07CisgICAgQUVEZXNjIGtleURhdGE7CisgICAgQUVEZXNjIHRva2VuOwogI2lmbmRlZiBBRUNhbGxPYmplY3RBY2Nlc3NvcgotCVB5TWFjX1BSRUNIRUNLKEFFQ2FsbE9iamVjdEFjY2Vzc29yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBRUNhbGxPYmplY3RBY2Nlc3Nvcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGVzaXJlZENsYXNzLAotCSAgICAgICAgICAgICAgICAgICAgICBBRURlc2NfQ29udmVydCwgJmNvbnRhaW5lclRva2VuLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjb250YWluZXJDbGFzcywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAma2V5Rm9ybSwKLQkgICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX0NvbnZlcnQsICZrZXlEYXRhKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEFFQ2FsbE9iamVjdEFjY2Vzc29yKGRlc2lyZWRDbGFzcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbnRhaW5lclRva2VuLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXJDbGFzcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5Rm9ybSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtleURhdGEsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0b2tlbik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19OZXcsICZ0b2tlbik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRlc2lyZWRDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX0NvbnZlcnQsICZjb250YWluZXJUb2tlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY29udGFpbmVyQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmtleUZvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19Db252ZXJ0LCAma2V5RGF0YSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBBRUNhbGxPYmplY3RBY2Nlc3NvcihkZXNpcmVkQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb250YWluZXJUb2tlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleUZvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXlEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG9rZW4pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBRURlc2NfTmV3LCAmdG9rZW4pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgQUVfbWV0aG9kc1tdID0gewotCXsiQUVDb2VyY2VQdHIiLCAoUHlDRnVuY3Rpb24pQUVfQUVDb2VyY2VQdHIsIDEsCi0JIFB5RG9jX1NUUigiKERlc2NUeXBlIHR5cGVDb2RlLCBCdWZmZXIgZGF0YVB0ciwgRGVzY1R5cGUgdG9UeXBlKSAtPiAoQUVEZXNjIHJlc3VsdCkiKX0sCi0JeyJBRUNyZWF0ZURlc2MiLCAoUHlDRnVuY3Rpb24pQUVfQUVDcmVhdGVEZXNjLCAxLAotCSBQeURvY19TVFIoIihEZXNjVHlwZSB0eXBlQ29kZSwgQnVmZmVyIGRhdGFQdHIpIC0+IChBRURlc2MgcmVzdWx0KSIpfSwKLQl7IkFFQ3JlYXRlTGlzdCIsIChQeUNGdW5jdGlvbilBRV9BRUNyZWF0ZUxpc3QsIDEsCi0JIFB5RG9jX1NUUigiKEJ1ZmZlciBmYWN0b3JpbmdQdHIsIEJvb2xlYW4gaXNSZWNvcmQpIC0+IChBRURlc2NMaXN0IHJlc3VsdExpc3QpIil9LAotCXsiQUVDcmVhdGVBcHBsZUV2ZW50IiwgKFB5Q0Z1bmN0aW9uKUFFX0FFQ3JlYXRlQXBwbGVFdmVudCwgMSwKLQkgUHlEb2NfU1RSKCIoQUVFdmVudENsYXNzIHRoZUFFRXZlbnRDbGFzcywgQUVFdmVudElEIHRoZUFFRXZlbnRJRCwgQUVBZGRyZXNzRGVzYyB0YXJnZXQsIEFFUmV0dXJuSUQgcmV0dXJuSUQsIEFFVHJhbnNhY3Rpb25JRCB0cmFuc2FjdGlvbklEKSAtPiAoQXBwbGVFdmVudCByZXN1bHQpIil9LAotCXsiQUVSZXBsYWNlRGVzY0RhdGEiLCAoUHlDRnVuY3Rpb24pQUVfQUVSZXBsYWNlRGVzY0RhdGEsIDEsCi0JIFB5RG9jX1NUUigiKERlc2NUeXBlIHR5cGVDb2RlLCBCdWZmZXIgZGF0YVB0cikgLT4gKEFFRGVzYyB0aGVBRURlc2MpIil9LAotCXsiQUVQcm9jZXNzQXBwbGVFdmVudCIsIChQeUNGdW5jdGlvbilBRV9BRVByb2Nlc3NBcHBsZUV2ZW50LCAxLAotCSBQeURvY19TVFIoIihFdmVudFJlY29yZCB0aGVFdmVudFJlY29yZCkgLT4gTm9uZSIpfSwKLQl7IkFFR2V0SW50ZXJhY3Rpb25BbGxvd2VkIiwgKFB5Q0Z1bmN0aW9uKUFFX0FFR2V0SW50ZXJhY3Rpb25BbGxvd2VkLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChBRUludGVyYWN0QWxsb3dlZCBsZXZlbCkiKX0sCi0JeyJBRVNldEludGVyYWN0aW9uQWxsb3dlZCIsIChQeUNGdW5jdGlvbilBRV9BRVNldEludGVyYWN0aW9uQWxsb3dlZCwgMSwKLQkgUHlEb2NfU1RSKCIoQUVJbnRlcmFjdEFsbG93ZWQgbGV2ZWwpIC0+IE5vbmUiKX0sCi0JeyJBRUludGVyYWN0V2l0aFVzZXIiLCAoUHlDRnVuY3Rpb24pQUVfQUVJbnRlcmFjdFdpdGhVc2VyLCAxLAotCSBQeURvY19TVFIoIihsb25nIHRpbWVPdXRJblRpY2tzKSAtPiBOb25lIil9LAotCXsiQUVJbnN0YWxsRXZlbnRIYW5kbGVyIiwgKFB5Q0Z1bmN0aW9uKUFFX0FFSW5zdGFsbEV2ZW50SGFuZGxlciwgMSwKLQkgUHlEb2NfU1RSKCIoQUVFdmVudENsYXNzIHRoZUFFRXZlbnRDbGFzcywgQUVFdmVudElEIHRoZUFFRXZlbnRJRCwgRXZlbnRIYW5kbGVyIGhhbmRsZXIpIC0+IE5vbmUiKX0sCi0JeyJBRVJlbW92ZUV2ZW50SGFuZGxlciIsIChQeUNGdW5jdGlvbilBRV9BRVJlbW92ZUV2ZW50SGFuZGxlciwgMSwKLQkgUHlEb2NfU1RSKCIoQUVFdmVudENsYXNzIHRoZUFFRXZlbnRDbGFzcywgQUVFdmVudElEIHRoZUFFRXZlbnRJRCkgLT4gTm9uZSIpfSwKLQl7IkFFR2V0RXZlbnRIYW5kbGVyIiwgKFB5Q0Z1bmN0aW9uKUFFX0FFR2V0RXZlbnRIYW5kbGVyLCAxLAotCSBQeURvY19TVFIoIihBRUV2ZW50Q2xhc3MgdGhlQUVFdmVudENsYXNzLCBBRUV2ZW50SUQgdGhlQUVFdmVudElEKSAtPiAoRXZlbnRIYW5kbGVyIGhhbmRsZXIpIil9LAotCXsiQUVJbnN0YWxsU3BlY2lhbEhhbmRsZXIiLCAoUHlDRnVuY3Rpb24pQUVfQUVJbnN0YWxsU3BlY2lhbEhhbmRsZXIsIDEsCi0JIFB5RG9jX1NUUigiKEFFS2V5d29yZCBmdW5jdGlvbkNsYXNzKSAtPiBOb25lIil9LAotCXsiQUVSZW1vdmVTcGVjaWFsSGFuZGxlciIsIChQeUNGdW5jdGlvbilBRV9BRVJlbW92ZVNwZWNpYWxIYW5kbGVyLCAxLAotCSBQeURvY19TVFIoIihBRUtleXdvcmQgZnVuY3Rpb25DbGFzcykgLT4gTm9uZSIpfSwKLQl7IkFFTWFuYWdlckluZm8iLCAoUHlDRnVuY3Rpb24pQUVfQUVNYW5hZ2VySW5mbywgMSwKLQkgUHlEb2NfU1RSKCIoQUVLZXl3b3JkIGtleVdvcmQpIC0+IChsb25nIHJlc3VsdCkiKX0sCi0JeyJBRU9iamVjdEluaXQiLCAoUHlDRnVuY3Rpb24pQUVfQUVPYmplY3RJbml0LCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJBRURpc3Bvc2VUb2tlbiIsIChQeUNGdW5jdGlvbilBRV9BRURpc3Bvc2VUb2tlbiwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQUVEZXNjIHRoZVRva2VuKSIpfSwKLQl7IkFFQ2FsbE9iamVjdEFjY2Vzc29yIiwgKFB5Q0Z1bmN0aW9uKUFFX0FFQ2FsbE9iamVjdEFjY2Vzc29yLCAxLAotCSBQeURvY19TVFIoIihEZXNjVHlwZSBkZXNpcmVkQ2xhc3MsIEFFRGVzYyBjb250YWluZXJUb2tlbiwgRGVzY1R5cGUgY29udGFpbmVyQ2xhc3MsIERlc2NUeXBlIGtleUZvcm0sIEFFRGVzYyBrZXlEYXRhKSAtPiAoQUVEZXNjIHRva2VuKSIpfSwKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7IkFFQ29lcmNlUHRyIiwgKFB5Q0Z1bmN0aW9uKUFFX0FFQ29lcmNlUHRyLCAxLAorICAgICBQeURvY19TVFIoIihEZXNjVHlwZSB0eXBlQ29kZSwgQnVmZmVyIGRhdGFQdHIsIERlc2NUeXBlIHRvVHlwZSkgLT4gKEFFRGVzYyByZXN1bHQpIil9LAorICAgIHsiQUVDcmVhdGVEZXNjIiwgKFB5Q0Z1bmN0aW9uKUFFX0FFQ3JlYXRlRGVzYywgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGVzY1R5cGUgdHlwZUNvZGUsIEJ1ZmZlciBkYXRhUHRyKSAtPiAoQUVEZXNjIHJlc3VsdCkiKX0sCisgICAgeyJBRUNyZWF0ZUxpc3QiLCAoUHlDRnVuY3Rpb24pQUVfQUVDcmVhdGVMaXN0LCAxLAorICAgICBQeURvY19TVFIoIihCdWZmZXIgZmFjdG9yaW5nUHRyLCBCb29sZWFuIGlzUmVjb3JkKSAtPiAoQUVEZXNjTGlzdCByZXN1bHRMaXN0KSIpfSwKKyAgICB7IkFFQ3JlYXRlQXBwbGVFdmVudCIsIChQeUNGdW5jdGlvbilBRV9BRUNyZWF0ZUFwcGxlRXZlbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKEFFRXZlbnRDbGFzcyB0aGVBRUV2ZW50Q2xhc3MsIEFFRXZlbnRJRCB0aGVBRUV2ZW50SUQsIEFFQWRkcmVzc0Rlc2MgdGFyZ2V0LCBBRVJldHVybklEIHJldHVybklELCBBRVRyYW5zYWN0aW9uSUQgdHJhbnNhY3Rpb25JRCkgLT4gKEFwcGxlRXZlbnQgcmVzdWx0KSIpfSwKKyAgICB7IkFFUmVwbGFjZURlc2NEYXRhIiwgKFB5Q0Z1bmN0aW9uKUFFX0FFUmVwbGFjZURlc2NEYXRhLCAxLAorICAgICBQeURvY19TVFIoIihEZXNjVHlwZSB0eXBlQ29kZSwgQnVmZmVyIGRhdGFQdHIpIC0+IChBRURlc2MgdGhlQUVEZXNjKSIpfSwKKyAgICB7IkFFUHJvY2Vzc0FwcGxlRXZlbnQiLCAoUHlDRnVuY3Rpb24pQUVfQUVQcm9jZXNzQXBwbGVFdmVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRXZlbnRSZWNvcmQgdGhlRXZlbnRSZWNvcmQpIC0+IE5vbmUiKX0sCisgICAgeyJBRUdldEludGVyYWN0aW9uQWxsb3dlZCIsIChQeUNGdW5jdGlvbilBRV9BRUdldEludGVyYWN0aW9uQWxsb3dlZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQUVJbnRlcmFjdEFsbG93ZWQgbGV2ZWwpIil9LAorICAgIHsiQUVTZXRJbnRlcmFjdGlvbkFsbG93ZWQiLCAoUHlDRnVuY3Rpb24pQUVfQUVTZXRJbnRlcmFjdGlvbkFsbG93ZWQsIDEsCisgICAgIFB5RG9jX1NUUigiKEFFSW50ZXJhY3RBbGxvd2VkIGxldmVsKSAtPiBOb25lIil9LAorICAgIHsiQUVJbnRlcmFjdFdpdGhVc2VyIiwgKFB5Q0Z1bmN0aW9uKUFFX0FFSW50ZXJhY3RXaXRoVXNlciwgMSwKKyAgICAgUHlEb2NfU1RSKCIobG9uZyB0aW1lT3V0SW5UaWNrcykgLT4gTm9uZSIpfSwKKyAgICB7IkFFSW5zdGFsbEV2ZW50SGFuZGxlciIsIChQeUNGdW5jdGlvbilBRV9BRUluc3RhbGxFdmVudEhhbmRsZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKEFFRXZlbnRDbGFzcyB0aGVBRUV2ZW50Q2xhc3MsIEFFRXZlbnRJRCB0aGVBRUV2ZW50SUQsIEV2ZW50SGFuZGxlciBoYW5kbGVyKSAtPiBOb25lIil9LAorICAgIHsiQUVSZW1vdmVFdmVudEhhbmRsZXIiLCAoUHlDRnVuY3Rpb24pQUVfQUVSZW1vdmVFdmVudEhhbmRsZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKEFFRXZlbnRDbGFzcyB0aGVBRUV2ZW50Q2xhc3MsIEFFRXZlbnRJRCB0aGVBRUV2ZW50SUQpIC0+IE5vbmUiKX0sCisgICAgeyJBRUdldEV2ZW50SGFuZGxlciIsIChQeUNGdW5jdGlvbilBRV9BRUdldEV2ZW50SGFuZGxlciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQUVFdmVudENsYXNzIHRoZUFFRXZlbnRDbGFzcywgQUVFdmVudElEIHRoZUFFRXZlbnRJRCkgLT4gKEV2ZW50SGFuZGxlciBoYW5kbGVyKSIpfSwKKyAgICB7IkFFSW5zdGFsbFNwZWNpYWxIYW5kbGVyIiwgKFB5Q0Z1bmN0aW9uKUFFX0FFSW5zdGFsbFNwZWNpYWxIYW5kbGVyLCAxLAorICAgICBQeURvY19TVFIoIihBRUtleXdvcmQgZnVuY3Rpb25DbGFzcykgLT4gTm9uZSIpfSwKKyAgICB7IkFFUmVtb3ZlU3BlY2lhbEhhbmRsZXIiLCAoUHlDRnVuY3Rpb24pQUVfQUVSZW1vdmVTcGVjaWFsSGFuZGxlciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQUVLZXl3b3JkIGZ1bmN0aW9uQ2xhc3MpIC0+IE5vbmUiKX0sCisgICAgeyJBRU1hbmFnZXJJbmZvIiwgKFB5Q0Z1bmN0aW9uKUFFX0FFTWFuYWdlckluZm8sIDEsCisgICAgIFB5RG9jX1NUUigiKEFFS2V5d29yZCBrZXlXb3JkKSAtPiAobG9uZyByZXN1bHQpIil9LAorICAgIHsiQUVPYmplY3RJbml0IiwgKFB5Q0Z1bmN0aW9uKUFFX0FFT2JqZWN0SW5pdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiQUVEaXNwb3NlVG9rZW4iLCAoUHlDRnVuY3Rpb24pQUVfQUVEaXNwb3NlVG9rZW4sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEFFRGVzYyB0aGVUb2tlbikiKX0sCisgICAgeyJBRUNhbGxPYmplY3RBY2Nlc3NvciIsIChQeUNGdW5jdGlvbilBRV9BRUNhbGxPYmplY3RBY2Nlc3NvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGVzY1R5cGUgZGVzaXJlZENsYXNzLCBBRURlc2MgY29udGFpbmVyVG9rZW4sIERlc2NUeXBlIGNvbnRhaW5lckNsYXNzLCBEZXNjVHlwZSBrZXlGb3JtLCBBRURlc2Mga2V5RGF0YSkgLT4gKEFFRGVzYyB0b2tlbikiKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAKQEAgLTEzODcsNzIgKzEzODcsNzIgQEAKIHN0YXRpYyBwYXNjYWwgT1NFcnIKIEdlbmVyaWNFdmVudEhhbmRsZXIoY29uc3QgQXBwbGVFdmVudCAqcmVxdWVzdCwgQXBwbGVFdmVudCAqcmVwbHksIHJlZmNvbnR5cGUgcmVmY29uKQogewotICAgICAgICBQeU9iamVjdCAqaGFuZGxlciA9IChQeU9iamVjdCAqKXJlZmNvbjsKLSAgICAgICAgQUVEZXNjT2JqZWN0ICpyZXF1ZXN0T2JqZWN0LCAqcmVwbHlPYmplY3Q7Ci0gICAgICAgIFB5T2JqZWN0ICphcmdzLCAqcmVzOwotICAgICAgICBpZiAoKHJlcXVlc3RPYmplY3QgPSAoQUVEZXNjT2JqZWN0ICopQUVEZXNjX05ldygoQXBwbGVFdmVudCAqKXJlcXVlc3QpKSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIGlmICgocmVwbHlPYmplY3QgPSAoQUVEZXNjT2JqZWN0ICopQUVEZXNjX05ldyhyZXBseSkpID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYocmVxdWVzdE9iamVjdCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIGlmICgoYXJncyA9IFB5X0J1aWxkVmFsdWUoIk9PIiwgcmVxdWVzdE9iamVjdCwgcmVwbHlPYmplY3QpKSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKHJlcXVlc3RPYmplY3QpOwotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihyZXBseU9iamVjdCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIHJlcyA9IFB5RXZhbF9DYWxsT2JqZWN0KGhhbmRsZXIsIGFyZ3MpOwotICAgICAgICByZXF1ZXN0T2JqZWN0LT5vYl9pdHNlbGYuZGVzY3JpcHRvclR5cGUgPSAnbnVsbCc7Ci0gICAgICAgIHJlcXVlc3RPYmplY3QtPm9iX2l0c2VsZi5kYXRhSGFuZGxlID0gTlVMTDsKLSAgICAgICAgcmVwbHlPYmplY3QtPm9iX2l0c2VsZi5kZXNjcmlwdG9yVHlwZSA9ICdudWxsJzsKLSAgICAgICAgcmVwbHlPYmplY3QtPm9iX2l0c2VsZi5kYXRhSGFuZGxlID0gTlVMTDsKLSAgICAgICAgUHlfREVDUkVGKGFyZ3MpOwotICAgICAgICBpZiAocmVzID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigiRXhjZXB0aW9uIGluIEFFIGV2ZW50IGhhbmRsZXIgZnVuY3Rpb25cbiIpOwotICAgICAgICAgICAgICAgIFB5RXJyX1ByaW50KCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIFB5X0RFQ1JFRihyZXMpOwotICAgICAgICByZXR1cm4gbm9FcnI7CisgICAgUHlPYmplY3QgKmhhbmRsZXIgPSAoUHlPYmplY3QgKilyZWZjb247CisgICAgQUVEZXNjT2JqZWN0ICpyZXF1ZXN0T2JqZWN0LCAqcmVwbHlPYmplY3Q7CisgICAgUHlPYmplY3QgKmFyZ3MsICpyZXM7CisgICAgaWYgKChyZXF1ZXN0T2JqZWN0ID0gKEFFRGVzY09iamVjdCAqKUFFRGVzY19OZXcoKEFwcGxlRXZlbnQgKilyZXF1ZXN0KSkgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICgocmVwbHlPYmplY3QgPSAoQUVEZXNjT2JqZWN0ICopQUVEZXNjX05ldyhyZXBseSkpID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKHJlcXVlc3RPYmplY3QpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICgoYXJncyA9IFB5X0J1aWxkVmFsdWUoIk9PIiwgcmVxdWVzdE9iamVjdCwgcmVwbHlPYmplY3QpKSA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihyZXF1ZXN0T2JqZWN0KTsKKyAgICAgICAgUHlfREVDUkVGKHJlcGx5T2JqZWN0KTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXMgPSBQeUV2YWxfQ2FsbE9iamVjdChoYW5kbGVyLCBhcmdzKTsKKyAgICByZXF1ZXN0T2JqZWN0LT5vYl9pdHNlbGYuZGVzY3JpcHRvclR5cGUgPSAnbnVsbCc7CisgICAgcmVxdWVzdE9iamVjdC0+b2JfaXRzZWxmLmRhdGFIYW5kbGUgPSBOVUxMOworICAgIHJlcGx5T2JqZWN0LT5vYl9pdHNlbGYuZGVzY3JpcHRvclR5cGUgPSAnbnVsbCc7CisgICAgcmVwbHlPYmplY3QtPm9iX2l0c2VsZi5kYXRhSGFuZGxlID0gTlVMTDsKKyAgICBQeV9ERUNSRUYoYXJncyk7CisgICAgaWYgKHJlcyA9PSBOVUxMKSB7CisgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCJFeGNlcHRpb24gaW4gQUUgZXZlbnQgaGFuZGxlciBmdW5jdGlvblxuIik7CisgICAgICAgIFB5RXJyX1ByaW50KCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgUHlfREVDUkVGKHJlcyk7CisgICAgcmV0dXJuIG5vRXJyOwogfQogCiBQeU9iamVjdCAqQUVEZXNjX05ld0JvcnJvd2VkKEFFRGVzYyAqaXRzZWxmKQogewotICAgICAgICBQeU9iamVjdCAqaXQ7CisgICAgUHlPYmplY3QgKml0OwogCi0gICAgICAgIGl0ID0gQUVEZXNjX05ldyhpdHNlbGYpOwotICAgICAgICBpZiAoaXQpCi0gICAgICAgICAgICAgICAgKChBRURlc2NPYmplY3QgKilpdCktPm9iX293bmVkID0gMDsKLSAgICAgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIGl0ID0gQUVEZXNjX05ldyhpdHNlbGYpOworICAgIGlmIChpdCkKKyAgICAgICAgKChBRURlc2NPYmplY3QgKilpdCktPm9iX293bmVkID0gMDsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiAKIAogCiB2b2lkIGluaXRfQUUodm9pZCkKIHsKLQlQeU9iamVjdCAqbTsKLQlQeU9iamVjdCAqZDsKKyAgICBQeU9iamVjdCAqbTsKKyAgICBQeU9iamVjdCAqZDsKIAotICAgICAgICB1cHBfQUVJZGxlUHJvYyA9IE5ld0FFSWRsZVVQUChBRUlkbGVQcm9jKTsKLSAgICAgICAgdXBwX0dlbmVyaWNFdmVudEhhbmRsZXIgPSBOZXdBRUV2ZW50SGFuZGxlclVQUChHZW5lcmljRXZlbnRIYW5kbGVyKTsKLSAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoQUVEZXNjICosIEFFRGVzY19OZXcpOwotICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhBRURlc2MgKiwgQUVEZXNjX05ld0JvcnJvd2VkKTsKLSAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKEFFRGVzYywgQUVEZXNjX0NvbnZlcnQpOworICAgIHVwcF9BRUlkbGVQcm9jID0gTmV3QUVJZGxlVVBQKEFFSWRsZVByb2MpOworICAgIHVwcF9HZW5lcmljRXZlbnRIYW5kbGVyID0gTmV3QUVFdmVudEhhbmRsZXJVUFAoR2VuZXJpY0V2ZW50SGFuZGxlcik7CisgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoQUVEZXNjICosIEFFRGVzY19OZXcpOworICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKEFFRGVzYyAqLCBBRURlc2NfTmV3Qm9ycm93ZWQpOworICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChBRURlc2MsIEFFRGVzY19Db252ZXJ0KTsKIAotCW0gPSBQeV9Jbml0TW9kdWxlKCJfQUUiLCBBRV9tZXRob2RzKTsKLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQlBRV9FcnJvciA9IFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCk7Ci0JaWYgKEFFX0Vycm9yID09IE5VTEwgfHwKLQkgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVycm9yIiwgQUVfRXJyb3IpICE9IDApCi0JCXJldHVybjsKLQlBRURlc2NfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCWlmIChQeVR5cGVfUmVhZHkoJkFFRGVzY19UeXBlKSA8IDApIHJldHVybjsKLQlQeV9JTkNSRUYoJkFFRGVzY19UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkFFRGVzYyIsIChQeU9iamVjdCAqKSZBRURlc2NfVHlwZSk7Ci0JLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCi0JUHlfSU5DUkVGKCZBRURlc2NfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJBRURlc2NUeXBlIiwgKFB5T2JqZWN0ICopJkFFRGVzY19UeXBlKTsKKyAgICBtID0gUHlfSW5pdE1vZHVsZSgiX0FFIiwgQUVfbWV0aG9kcyk7CisgICAgZCA9IFB5TW9kdWxlX0dldERpY3QobSk7CisgICAgQUVfRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOworICAgIGlmIChBRV9FcnJvciA9PSBOVUxMIHx8CisgICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFcnJvciIsIEFFX0Vycm9yKSAhPSAwKQorICAgICAgICByZXR1cm47CisgICAgQUVEZXNjX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZBRURlc2NfVHlwZSkgPCAwKSByZXR1cm47CisgICAgUHlfSU5DUkVGKCZBRURlc2NfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJBRURlc2MiLCAoUHlPYmplY3QgKikmQUVEZXNjX1R5cGUpOworICAgIC8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLworICAgIFB5X0lOQ1JFRigmQUVEZXNjX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiQUVEZXNjVHlwZSIsIChQeU9iamVjdCAqKSZBRURlc2NfVHlwZSk7CiB9CiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT0gRW5kIG1vZHVsZSBfQUUgPT09PT09PT09PT09PT09PT09PT09PT09PSAqLwpkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvYWgvX0FIbW9kdWxlLmMgYi9NYWMvTW9kdWxlcy9haC9fQUhtb2R1bGUuYwppbmRleCAxNjBhODQ1Li43M2FiNDM3IDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9haC9fQUhtb2R1bGUuYworKysgYi9NYWMvTW9kdWxlcy9haC9fQUhtb2R1bGUuYwpAQCAtOSw5ICs5LDkgQEAKIAogLyogTWFjcm8gdG8gdGVzdCB3aGV0aGVyIGEgd2Vhay1sb2FkZWQgQ0ZNIGZ1bmN0aW9uIGV4aXN0cyAqLwogI2RlZmluZSBQeU1hY19QUkVDSEVDSyhydG4pIGRvIHsgaWYgKCAmcnRuID09IE5VTEwgKSAge1wKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsIFwKLSAgICAgICAgIk5vdCBhdmFpbGFibGUgaW4gdGhpcyBzaGFyZWQgbGlicmFyeS9PUyB2ZXJzaW9uIik7IFwKLSAgICAgICAgcmV0dXJuIE5VTEw7IFwKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgXAorICAgICJOb3QgYXZhaWxhYmxlIGluIHRoaXMgc2hhcmVkIGxpYnJhcnkvT1MgdmVyc2lvbiIpOyBcCisgICAgcmV0dXJuIE5VTEw7IFwKICAgICB9fSB3aGlsZSgwKQogCiAKQEAgLTIyLDEwMyArMjIsMTAzIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqQWhfQUhTZWFyY2goUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JQ0ZTdHJpbmdSZWYgYm9va25hbWU7Ci0JQ0ZTdHJpbmdSZWYgcXVlcnk7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZib29rbmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnF1ZXJ5KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEFIU2VhcmNoKGJvb2tuYW1lLAotCSAgICAgICAgICAgICAgICBxdWVyeSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgQ0ZTdHJpbmdSZWYgYm9va25hbWU7CisgICAgQ0ZTdHJpbmdSZWYgcXVlcnk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZib29rbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnF1ZXJ5KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFIU2VhcmNoKGJvb2tuYW1lLAorICAgICAgICAgICAgICAgICAgICBxdWVyeSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQWhfQUhHb3RvTWFpblRPQyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlBSFRPQ1R5cGUgdG9jdHlwZTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRvY3R5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQUhHb3RvTWFpblRPQyh0b2N0eXBlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBBSFRPQ1R5cGUgdG9jdHlwZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRvY3R5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQUhHb3RvTWFpblRPQyh0b2N0eXBlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBaF9BSEdvdG9QYWdlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUNGU3RyaW5nUmVmIGJvb2tuYW1lOwotCUNGU3RyaW5nUmVmIHBhdGg7Ci0JQ0ZTdHJpbmdSZWYgYW5jaG9yOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZib29rbmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnBhdGgsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZhbmNob3IpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQUhHb3RvUGFnZShib29rbmFtZSwKLQkgICAgICAgICAgICAgICAgICBwYXRoLAotCSAgICAgICAgICAgICAgICAgIGFuY2hvcik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgQ0ZTdHJpbmdSZWYgYm9va25hbWU7CisgICAgQ0ZTdHJpbmdSZWYgcGF0aDsKKyAgICBDRlN0cmluZ1JlZiBhbmNob3I7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmJvb2tuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmFuY2hvcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBBSEdvdG9QYWdlKGJvb2tuYW1lLAorICAgICAgICAgICAgICAgICAgICAgIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgYW5jaG9yKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBaF9BSExvb2t1cEFuY2hvcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlDRlN0cmluZ1JlZiBib29rbmFtZTsKLQlDRlN0cmluZ1JlZiBhbmNob3I7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZib29rbmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmFuY2hvcikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBSExvb2t1cEFuY2hvcihib29rbmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgYW5jaG9yKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBDRlN0cmluZ1JlZiBib29rbmFtZTsKKyAgICBDRlN0cmluZ1JlZiBhbmNob3I7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZib29rbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmFuY2hvcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBBSExvb2t1cEFuY2hvcihib29rbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jaG9yKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBaF9BSFJlZ2lzdGVySGVscEJvb2soUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JRlNSZWYgYXBwQnVuZGxlUmVmOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNSZWYsICZhcHBCdW5kbGVSZWYpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQUhSZWdpc3RlckhlbHBCb29rKCZhcHBCdW5kbGVSZWYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIEZTUmVmIGFwcEJ1bmRsZVJlZjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTUmVmLCAmYXBwQnVuZGxlUmVmKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFIUmVnaXN0ZXJIZWxwQm9vaygmYXBwQnVuZGxlUmVmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIEFoX21ldGhvZHNbXSA9IHsKLQl7IkFIU2VhcmNoIiwgKFB5Q0Z1bmN0aW9uKUFoX0FIU2VhcmNoLCAxLAotCSBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBib29rbmFtZSwgQ0ZTdHJpbmdSZWYgcXVlcnkpIC0+IE5vbmUiKX0sCi0JeyJBSEdvdG9NYWluVE9DIiwgKFB5Q0Z1bmN0aW9uKUFoX0FIR290b01haW5UT0MsIDEsCi0JIFB5RG9jX1NUUigiKEFIVE9DVHlwZSB0b2N0eXBlKSAtPiBOb25lIil9LAotCXsiQUhHb3RvUGFnZSIsIChQeUNGdW5jdGlvbilBaF9BSEdvdG9QYWdlLCAxLAotCSBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBib29rbmFtZSwgQ0ZTdHJpbmdSZWYgcGF0aCwgQ0ZTdHJpbmdSZWYgYW5jaG9yKSAtPiBOb25lIil9LAotCXsiQUhMb29rdXBBbmNob3IiLCAoUHlDRnVuY3Rpb24pQWhfQUhMb29rdXBBbmNob3IsIDEsCi0JIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIGJvb2tuYW1lLCBDRlN0cmluZ1JlZiBhbmNob3IpIC0+IE5vbmUiKX0sCi0JeyJBSFJlZ2lzdGVySGVscEJvb2siLCAoUHlDRnVuY3Rpb24pQWhfQUhSZWdpc3RlckhlbHBCb29rLCAxLAotCSBQeURvY19TVFIoIihGU1JlZiBhcHBCdW5kbGVSZWYpIC0+IE5vbmUiKX0sCi0Je05VTEwsIE5VTEwsIDB9CisgICAgeyJBSFNlYXJjaCIsIChQeUNGdW5jdGlvbilBaF9BSFNlYXJjaCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgYm9va25hbWUsIENGU3RyaW5nUmVmIHF1ZXJ5KSAtPiBOb25lIil9LAorICAgIHsiQUhHb3RvTWFpblRPQyIsIChQeUNGdW5jdGlvbilBaF9BSEdvdG9NYWluVE9DLCAxLAorICAgICBQeURvY19TVFIoIihBSFRPQ1R5cGUgdG9jdHlwZSkgLT4gTm9uZSIpfSwKKyAgICB7IkFIR290b1BhZ2UiLCAoUHlDRnVuY3Rpb24pQWhfQUhHb3RvUGFnZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgYm9va25hbWUsIENGU3RyaW5nUmVmIHBhdGgsIENGU3RyaW5nUmVmIGFuY2hvcikgLT4gTm9uZSIpfSwKKyAgICB7IkFITG9va3VwQW5jaG9yIiwgKFB5Q0Z1bmN0aW9uKUFoX0FITG9va3VwQW5jaG9yLCAxLAorICAgICBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBib29rbmFtZSwgQ0ZTdHJpbmdSZWYgYW5jaG9yKSAtPiBOb25lIil9LAorICAgIHsiQUhSZWdpc3RlckhlbHBCb29rIiwgKFB5Q0Z1bmN0aW9uKUFoX0FIUmVnaXN0ZXJIZWxwQm9vaywgMSwKKyAgICAgUHlEb2NfU1RSKCIoRlNSZWYgYXBwQnVuZGxlUmVmKSAtPiBOb25lIil9LAorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogCkBAIC0xMjYsMTggKzEyNiwxOCBAQAogCiB2b2lkIGluaXRfQUgodm9pZCkKIHsKLQlQeU9iamVjdCAqbTsKLQlQeU9iamVjdCAqZDsKKyAgICBQeU9iamVjdCAqbTsKKyAgICBQeU9iamVjdCAqZDsKIAogCiAKIAotCW0gPSBQeV9Jbml0TW9kdWxlKCJfQUgiLCBBaF9tZXRob2RzKTsKLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQlBaF9FcnJvciA9IFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCk7Ci0JaWYgKEFoX0Vycm9yID09IE5VTEwgfHwKLQkgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVycm9yIiwgQWhfRXJyb3IpICE9IDApCi0JCXJldHVybjsKKyAgICBtID0gUHlfSW5pdE1vZHVsZSgiX0FIIiwgQWhfbWV0aG9kcyk7CisgICAgZCA9IFB5TW9kdWxlX0dldERpY3QobSk7CisgICAgQWhfRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOworICAgIGlmIChBaF9FcnJvciA9PSBOVUxMIHx8CisgICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFcnJvciIsIEFoX0Vycm9yKSAhPSAwKQorICAgICAgICByZXR1cm47CiB9CiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT0gRW5kIG1vZHVsZSBfQUggPT09PT09PT09PT09PT09PT09PT09PT09PSAqLwpkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvYXBwL19BcHBtb2R1bGUuYyBiL01hYy9Nb2R1bGVzL2FwcC9fQXBwbW9kdWxlLmMKaW5kZXggNTJkMTdmNS4uYzc5MTgwNyAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvYXBwL19BcHBtb2R1bGUuYworKysgYi9NYWMvTW9kdWxlcy9hcHAvX0FwcG1vZHVsZS5jCkBAIC00LDE2ICs0LDE2IEBACiAjaW5jbHVkZSAiUHl0aG9uLmgiCiAKICNpZm5kZWYgX19MUDY0X18KLQkvKiBDYXJib24gR1VJIHN0dWZmLCBub3QgYXZhaWxhYmxlIGluIDY0LWJpdCBtb2RlICovCisgICAgLyogQ2FyYm9uIEdVSSBzdHVmZiwgbm90IGF2YWlsYWJsZSBpbiA2NC1iaXQgbW9kZSAqLwogCiAKICNpbmNsdWRlICJweW1hY3Rvb2xib3guaCIKIAogLyogTWFjcm8gdG8gdGVzdCB3aGV0aGVyIGEgd2Vhay1sb2FkZWQgQ0ZNIGZ1bmN0aW9uIGV4aXN0cyAqLwogI2RlZmluZSBQeU1hY19QUkVDSEVDSyhydG4pIGRvIHsgaWYgKCAmcnRuID09IE5VTEwgKSAge1wKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsIFwKLSAgICAgICAgIk5vdCBhdmFpbGFibGUgaW4gdGhpcyBzaGFyZWQgbGlicmFyeS9PUyB2ZXJzaW9uIik7IFwKLSAgICAgICAgcmV0dXJuIE5VTEw7IFwKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgXAorICAgICJOb3QgYXZhaWxhYmxlIGluIHRoaXMgc2hhcmVkIGxpYnJhcnkvT1MgdmVyc2lvbiIpOyBcCisgICAgcmV0dXJuIE5VTEw7IFwKICAgICB9fSB3aGlsZSgwKQogCiAKQEAgLTIyLDcgKzIyLDcgQEAKIAogc3RhdGljIGludCBUaGVtZUJ1dHRvbkRyYXdJbmZvX0NvbnZlcnQoUHlPYmplY3QgKnYsIFRoZW1lQnV0dG9uRHJhd0luZm8gKnBfaXRzZWxmKQogewotICAgICAgICByZXR1cm4gUHlBcmdfUGFyc2UodiwgIihpSEgpIiwgJnBfaXRzZWxmLT5zdGF0ZSwgJnBfaXRzZWxmLT52YWx1ZSwgJnBfaXRzZWxmLT5hZG9ybm1lbnQpOworICAgIHJldHVybiBQeUFyZ19QYXJzZSh2LCAiKGlISCkiLCAmcF9pdHNlbGYtPnN0YXRlLCAmcF9pdHNlbGYtPnZhbHVlLCAmcF9pdHNlbGYtPmFkb3JubWVudCk7CiB9CiAKIApAQCAtMzUsNzUgKzM1LDc1IEBACiAjZGVmaW5lIFRoZW1lRHJhd2luZ1N0YXRlT2JqX0NoZWNrKHgpICgoeCktPm9iX3R5cGUgPT0gJlRoZW1lRHJhd2luZ1N0YXRlX1R5cGUgfHwgUHlPYmplY3RfVHlwZUNoZWNrKCh4KSwgJlRoZW1lRHJhd2luZ1N0YXRlX1R5cGUpKQogCiB0eXBlZGVmIHN0cnVjdCBUaGVtZURyYXdpbmdTdGF0ZU9iamVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCVRoZW1lRHJhd2luZ1N0YXRlIG9iX2l0c2VsZjsKKyAgICBQeU9iamVjdF9IRUFECisgICAgVGhlbWVEcmF3aW5nU3RhdGUgb2JfaXRzZWxmOwogfSBUaGVtZURyYXdpbmdTdGF0ZU9iamVjdDsKIAogUHlPYmplY3QgKlRoZW1lRHJhd2luZ1N0YXRlT2JqX05ldyhUaGVtZURyYXdpbmdTdGF0ZSBpdHNlbGYpCiB7Ci0JVGhlbWVEcmF3aW5nU3RhdGVPYmplY3QgKml0OwotCWl0ID0gUHlPYmplY3RfTkVXKFRoZW1lRHJhd2luZ1N0YXRlT2JqZWN0LCAmVGhlbWVEcmF3aW5nU3RhdGVfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOwotCWl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIFRoZW1lRHJhd2luZ1N0YXRlT2JqZWN0ICppdDsKKyAgICBpdCA9IFB5T2JqZWN0X05FVyhUaGVtZURyYXdpbmdTdGF0ZU9iamVjdCwgJlRoZW1lRHJhd2luZ1N0YXRlX1R5cGUpOworICAgIGlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICBpdC0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIHJldHVybiAoUHlPYmplY3QgKilpdDsKIH0KIAogaW50IFRoZW1lRHJhd2luZ1N0YXRlT2JqX0NvbnZlcnQoUHlPYmplY3QgKnYsIFRoZW1lRHJhd2luZ1N0YXRlICpwX2l0c2VsZikKIHsKLQlpZiAoIVRoZW1lRHJhd2luZ1N0YXRlT2JqX0NoZWNrKHYpKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIlRoZW1lRHJhd2luZ1N0YXRlIHJlcXVpcmVkIik7Ci0JCXJldHVybiAwOwotCX0KLQkqcF9pdHNlbGYgPSAoKFRoZW1lRHJhd2luZ1N0YXRlT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKLQlyZXR1cm4gMTsKKyAgICBpZiAoIVRoZW1lRHJhd2luZ1N0YXRlT2JqX0NoZWNrKHYpKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIlRoZW1lRHJhd2luZ1N0YXRlIHJlcXVpcmVkIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAqcF9pdHNlbGYgPSAoKFRoZW1lRHJhd2luZ1N0YXRlT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIHZvaWQgVGhlbWVEcmF3aW5nU3RhdGVPYmpfZGVhbGxvYyhUaGVtZURyYXdpbmdTdGF0ZU9iamVjdCAqc2VsZikKIHsKLQkvKiBDbGVhbnVwIG9mIHNlbGYtPm9iX2l0c2VsZiBnb2VzIGhlcmUgKi8KLQlzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOworICAgIC8qIENsZWFudXAgb2Ygc2VsZi0+b2JfaXRzZWxmIGdvZXMgaGVyZSAqLworICAgIHNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVGhlbWVEcmF3aW5nU3RhdGVPYmpfU2V0VGhlbWVEcmF3aW5nU3RhdGUoVGhlbWVEcmF3aW5nU3RhdGVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9ydjsKLQlCb29sZWFuIGluRGlzcG9zZU5vdzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX3J2OworICAgIEJvb2xlYW4gaW5EaXNwb3NlTm93OwogI2lmbmRlZiBTZXRUaGVtZURyYXdpbmdTdGF0ZQotCVB5TWFjX1BSRUNIRUNLKFNldFRoZW1lRHJhd2luZ1N0YXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRUaGVtZURyYXdpbmdTdGF0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluRGlzcG9zZU5vdykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNldFRoZW1lRHJhd2luZ1N0YXRlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5EaXNwb3NlTm93KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluRGlzcG9zZU5vdykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNldFRoZW1lRHJhd2luZ1N0YXRlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5EaXNwb3NlTm93KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUaGVtZURyYXdpbmdTdGF0ZU9ial9EaXNwb3NlVGhlbWVEcmF3aW5nU3RhdGUoVGhlbWVEcmF3aW5nU3RhdGVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX3J2OwogI2lmbmRlZiBEaXNwb3NlVGhlbWVEcmF3aW5nU3RhdGUKLQlQeU1hY19QUkVDSEVDSyhEaXNwb3NlVGhlbWVEcmF3aW5nU3RhdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKERpc3Bvc2VUaGVtZURyYXdpbmdTdGF0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGlzcG9zZVRoZW1lRHJhd2luZ1N0YXRlKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEaXNwb3NlVGhlbWVEcmF3aW5nU3RhdGUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBUaGVtZURyYXdpbmdTdGF0ZU9ial9tZXRob2RzW10gPSB7Ci0JeyJTZXRUaGVtZURyYXdpbmdTdGF0ZSIsIChQeUNGdW5jdGlvbilUaGVtZURyYXdpbmdTdGF0ZU9ial9TZXRUaGVtZURyYXdpbmdTdGF0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoQm9vbGVhbiBpbkRpc3Bvc2VOb3cpIC0+IChPU1N0YXR1cyBfcnYpIil9LAotCXsiRGlzcG9zZVRoZW1lRHJhd2luZ1N0YXRlIiwgKFB5Q0Z1bmN0aW9uKVRoZW1lRHJhd2luZ1N0YXRlT2JqX0Rpc3Bvc2VUaGVtZURyYXdpbmdTdGF0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoT1NTdGF0dXMgX3J2KSIpfSwKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7IlNldFRoZW1lRHJhd2luZ1N0YXRlIiwgKFB5Q0Z1bmN0aW9uKVRoZW1lRHJhd2luZ1N0YXRlT2JqX1NldFRoZW1lRHJhd2luZ1N0YXRlLCAxLAorICAgICBQeURvY19TVFIoIihCb29sZWFuIGluRGlzcG9zZU5vdykgLT4gKE9TU3RhdHVzIF9ydikiKX0sCisgICAgeyJEaXNwb3NlVGhlbWVEcmF3aW5nU3RhdGUiLCAoUHlDRnVuY3Rpb24pVGhlbWVEcmF3aW5nU3RhdGVPYmpfRGlzcG9zZVRoZW1lRHJhd2luZ1N0YXRlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChPU1N0YXR1cyBfcnYpIil9LAorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogI2RlZmluZSBUaGVtZURyYXdpbmdTdGF0ZU9ial9nZXRzZXRsaXN0IE5VTEwKQEAgLTEyMCw2MSArMTIwLDYxIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqVGhlbWVEcmF3aW5nU3RhdGVPYmpfdHBfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKl9hcmdzLCBQeU9iamVjdCAqX2t3ZHMpCiB7Ci0JUHlPYmplY3QgKl9zZWxmOwotCVRoZW1lRHJhd2luZ1N0YXRlIGl0c2VsZjsKLQljaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKKyAgICBQeU9iamVjdCAqX3NlbGY7CisgICAgVGhlbWVEcmF3aW5nU3RhdGUgaXRzZWxmOworICAgIGNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgVGhlbWVEcmF3aW5nU3RhdGVPYmpfQ29udmVydCwgJml0c2VsZikpIHJldHVybiBOVUxMOwotCWlmICgoX3NlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JKChUaGVtZURyYXdpbmdTdGF0ZU9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiBfc2VsZjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBUaGVtZURyYXdpbmdTdGF0ZU9ial9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAoKFRoZW1lRHJhd2luZ1N0YXRlT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgcmV0dXJuIF9zZWxmOwogfQogCiAjZGVmaW5lIFRoZW1lRHJhd2luZ1N0YXRlT2JqX3RwX2ZyZWUgUHlPYmplY3RfRGVsCiAKIAogUHlUeXBlT2JqZWN0IFRoZW1lRHJhd2luZ1N0YXRlX1R5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCi0JMCwgLypvYl9zaXplKi8KLQkiX0FwcC5UaGVtZURyYXdpbmdTdGF0ZSIsIC8qdHBfbmFtZSovCi0Jc2l6ZW9mKFRoZW1lRHJhd2luZ1N0YXRlT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLwotCTAsIC8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcikgVGhlbWVEcmF3aW5nU3RhdGVPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KLQkwLCAvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykgVGhlbWVEcmF3aW5nU3RhdGVPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpIFRoZW1lRHJhd2luZ1N0YXRlT2JqX3JlcHIsIC8qdHBfcmVwciovCi0JKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLwotCShQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCi0JKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCi0JKGhhc2hmdW5jKSBUaGVtZURyYXdpbmdTdGF0ZU9ial9oYXNoLCAvKnRwX2hhc2gqLwotCTAsIC8qdHBfY2FsbCovCi0JMCwgLyp0cF9zdHIqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KLQlQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLwotCTAsIC8qdHBfYXNfYnVmZmVyKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQkwLCAvKnRwX2RvYyovCi0JMCwgLyp0cF90cmF2ZXJzZSovCi0JMCwgLyp0cF9jbGVhciovCi0JMCwgLyp0cF9yaWNoY29tcGFyZSovCi0JMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCi0JMCwgLyp0cF9pdGVyKi8KLQkwLCAvKnRwX2l0ZXJuZXh0Ki8KLQlUaGVtZURyYXdpbmdTdGF0ZU9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCi0JMCwgLyp0cF9tZW1iZXJzKi8KLQlUaGVtZURyYXdpbmdTdGF0ZU9ial9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCi0JMCwgLyp0cF9iYXNlKi8KLQkwLCAvKnRwX2RpY3QqLwotCTAsIC8qdHBfZGVzY3JfZ2V0Ki8KLQkwLCAvKnRwX2Rlc2NyX3NldCovCi0JMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KLQlUaGVtZURyYXdpbmdTdGF0ZU9ial90cF9pbml0LCAvKiB0cF9pbml0ICovCi0JVGhlbWVEcmF3aW5nU3RhdGVPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCi0JVGhlbWVEcmF3aW5nU3RhdGVPYmpfdHBfbmV3LCAvKiB0cF9uZXcgKi8KLQlUaGVtZURyYXdpbmdTdGF0ZU9ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgLypvYl9zaXplKi8KKyAgICAiX0FwcC5UaGVtZURyYXdpbmdTdGF0ZSIsIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKFRoZW1lRHJhd2luZ1N0YXRlT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLworICAgIDAsIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcikgVGhlbWVEcmF3aW5nU3RhdGVPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KKyAgICAoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KKyAgICAoY21wZnVuYykgVGhlbWVEcmF3aW5nU3RhdGVPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpIFRoZW1lRHJhd2luZ1N0YXRlT2JqX3JlcHIsIC8qdHBfcmVwciovCisgICAgKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLworICAgIChQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKSBUaGVtZURyYXdpbmdTdGF0ZU9ial9oYXNoLCAvKnRwX2hhc2gqLworICAgIDAsIC8qdHBfY2FsbCovCisgICAgMCwgLyp0cF9zdHIqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KKyAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLworICAgIDAsIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAvKnRwX2RvYyovCisgICAgMCwgLyp0cF90cmF2ZXJzZSovCisgICAgMCwgLyp0cF9jbGVhciovCisgICAgMCwgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgLyp0cF9pdGVyKi8KKyAgICAwLCAvKnRwX2l0ZXJuZXh0Ki8KKyAgICBUaGVtZURyYXdpbmdTdGF0ZU9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCisgICAgMCwgLyp0cF9tZW1iZXJzKi8KKyAgICBUaGVtZURyYXdpbmdTdGF0ZU9ial9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCisgICAgMCwgLyp0cF9iYXNlKi8KKyAgICAwLCAvKnRwX2RpY3QqLworICAgIDAsIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICBUaGVtZURyYXdpbmdTdGF0ZU9ial90cF9pbml0LCAvKiB0cF9pbml0ICovCisgICAgVGhlbWVEcmF3aW5nU3RhdGVPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCisgICAgVGhlbWVEcmF3aW5nU3RhdGVPYmpfdHBfbmV3LCAvKiB0cF9uZXcgKi8KKyAgICBUaGVtZURyYXdpbmdTdGF0ZU9ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0gRW5kIG9iamVjdCB0eXBlIFRoZW1lRHJhd2luZ1N0YXRlIC0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTE4MiwxNjIyICsxODIsMTYyMiBAQAogCiBzdGF0aWMgUHlPYmplY3QgKkFwcF9SZWdpc3RlckFwcGVhcmFuY2VDbGllbnQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CiAjaWZuZGVmIFJlZ2lzdGVyQXBwZWFyYW5jZUNsaWVudAotCVB5TWFjX1BSRUNIRUNLKFJlZ2lzdGVyQXBwZWFyYW5jZUNsaWVudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUmVnaXN0ZXJBcHBlYXJhbmNlQ2xpZW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUmVnaXN0ZXJBcHBlYXJhbmNlQ2xpZW50KCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBSZWdpc3RlckFwcGVhcmFuY2VDbGllbnQoKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfVW5yZWdpc3RlckFwcGVhcmFuY2VDbGllbnQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CiAjaWZuZGVmIFVucmVnaXN0ZXJBcHBlYXJhbmNlQ2xpZW50Ci0JUHlNYWNfUFJFQ0hFQ0soVW5yZWdpc3RlckFwcGVhcmFuY2VDbGllbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKFVucmVnaXN0ZXJBcHBlYXJhbmNlQ2xpZW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gVW5yZWdpc3RlckFwcGVhcmFuY2VDbGllbnQoKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFVucmVnaXN0ZXJBcHBlYXJhbmNlQ2xpZW50KCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX1NldFRoZW1lUGVuKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVRoZW1lQnJ1c2ggaW5CcnVzaDsKLQlTSW50MTYgaW5EZXB0aDsKLQlCb29sZWFuIGluSXNDb2xvckRldmljZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBUaGVtZUJydXNoIGluQnJ1c2g7CisgICAgU0ludDE2IGluRGVwdGg7CisgICAgQm9vbGVhbiBpbklzQ29sb3JEZXZpY2U7CiAjaWZuZGVmIFNldFRoZW1lUGVuCi0JUHlNYWNfUFJFQ0hFQ0soU2V0VGhlbWVQZW4pOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFRoZW1lUGVuKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkJydXNoLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5EZXB0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluSXNDb2xvckRldmljZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRUaGVtZVBlbihpbkJydXNoLAotCSAgICAgICAgICAgICAgICAgICBpbkRlcHRoLAotCSAgICAgICAgICAgICAgICAgICBpbklzQ29sb3JEZXZpY2UpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkJydXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5EZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluSXNDb2xvckRldmljZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRUaGVtZVBlbihpbkJydXNoLAorICAgICAgICAgICAgICAgICAgICAgICBpbkRlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICBpbklzQ29sb3JEZXZpY2UpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFwcF9TZXRUaGVtZUJhY2tncm91bmQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVGhlbWVCcnVzaCBpbkJydXNoOwotCVNJbnQxNiBpbkRlcHRoOwotCUJvb2xlYW4gaW5Jc0NvbG9yRGV2aWNlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFRoZW1lQnJ1c2ggaW5CcnVzaDsKKyAgICBTSW50MTYgaW5EZXB0aDsKKyAgICBCb29sZWFuIGluSXNDb2xvckRldmljZTsKICNpZm5kZWYgU2V0VGhlbWVCYWNrZ3JvdW5kCi0JUHlNYWNfUFJFQ0hFQ0soU2V0VGhlbWVCYWNrZ3JvdW5kKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRUaGVtZUJhY2tncm91bmQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGhiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluQnJ1c2gsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkRlcHRoLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5Jc0NvbG9yRGV2aWNlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldFRoZW1lQmFja2dyb3VuZChpbkJydXNoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgaW5EZXB0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXNDb2xvckRldmljZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGhiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQnJ1c2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkRlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Jc0NvbG9yRGV2aWNlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldFRoZW1lQmFja2dyb3VuZChpbkJydXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5EZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXNDb2xvckRldmljZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX1NldFRoZW1lVGV4dENvbG9yKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVRoZW1lVGV4dENvbG9yIGluQ29sb3I7Ci0JU0ludDE2IGluRGVwdGg7Ci0JQm9vbGVhbiBpbklzQ29sb3JEZXZpY2U7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVGhlbWVUZXh0Q29sb3IgaW5Db2xvcjsKKyAgICBTSW50MTYgaW5EZXB0aDsKKyAgICBCb29sZWFuIGluSXNDb2xvckRldmljZTsKICNpZm5kZWYgU2V0VGhlbWVUZXh0Q29sb3IKLQlQeU1hY19QUkVDSEVDSyhTZXRUaGVtZVRleHRDb2xvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0VGhlbWVUZXh0Q29sb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGhiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluQ29sb3IsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkRlcHRoLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5Jc0NvbG9yRGV2aWNlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldFRoZW1lVGV4dENvbG9yKGluQ29sb3IsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGluRGVwdGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGluSXNDb2xvckRldmljZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGhiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQ29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkRlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Jc0NvbG9yRGV2aWNlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldFRoZW1lVGV4dENvbG9yKGluQ29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXNDb2xvckRldmljZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX1NldFRoZW1lV2luZG93QmFja2dyb3VuZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlXaW5kb3dQdHIgaW5XaW5kb3c7Ci0JVGhlbWVCcnVzaCBpbkJydXNoOwotCUJvb2xlYW4gaW5VcGRhdGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93UHRyIGluV2luZG93OworICAgIFRoZW1lQnJ1c2ggaW5CcnVzaDsKKyAgICBCb29sZWFuIGluVXBkYXRlOwogI2lmbmRlZiBTZXRUaGVtZVdpbmRvd0JhY2tncm91bmQKLQlQeU1hY19QUkVDSEVDSyhTZXRUaGVtZVdpbmRvd0JhY2tncm91bmQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFRoZW1lV2luZG93QmFja2dyb3VuZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpbldpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgJmluQnJ1c2gsCi0JICAgICAgICAgICAgICAgICAgICAgICZpblVwZGF0ZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRUaGVtZVdpbmRvd0JhY2tncm91bmQoaW5XaW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkJydXNoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5VcGRhdGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmluV2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5CcnVzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluVXBkYXRlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldFRoZW1lV2luZG93QmFja2dyb3VuZChpbldpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQnJ1c2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblVwZGF0ZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX0RyYXdUaGVtZVdpbmRvd0hlYWRlcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlSZWN0IGluUmVjdDsKLQlUaGVtZURyYXdTdGF0ZSBpblN0YXRlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFJlY3QgaW5SZWN0OworICAgIFRoZW1lRHJhd1N0YXRlIGluU3RhdGU7CiAjaWZuZGVmIERyYXdUaGVtZVdpbmRvd0hlYWRlcgotCVB5TWFjX1BSRUNIRUNLKERyYXdUaGVtZVdpbmRvd0hlYWRlcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soRHJhd1RoZW1lV2luZG93SGVhZGVyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpblJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICZpblN0YXRlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IERyYXdUaGVtZVdpbmRvd0hlYWRlcigmaW5SZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5TdGF0ZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmluUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluU3RhdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRHJhd1RoZW1lV2luZG93SGVhZGVyKCZpblJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblN0YXRlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfRHJhd1RoZW1lV2luZG93TGlzdFZpZXdIZWFkZXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JUmVjdCBpblJlY3Q7Ci0JVGhlbWVEcmF3U3RhdGUgaW5TdGF0ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBSZWN0IGluUmVjdDsKKyAgICBUaGVtZURyYXdTdGF0ZSBpblN0YXRlOwogI2lmbmRlZiBEcmF3VGhlbWVXaW5kb3dMaXN0Vmlld0hlYWRlcgotCVB5TWFjX1BSRUNIRUNLKERyYXdUaGVtZVdpbmRvd0xpc3RWaWV3SGVhZGVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEcmF3VGhlbWVXaW5kb3dMaXN0Vmlld0hlYWRlcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5SZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5TdGF0ZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBEcmF3VGhlbWVXaW5kb3dMaXN0Vmlld0hlYWRlcigmaW5SZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblN0YXRlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5SZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5TdGF0ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBEcmF3VGhlbWVXaW5kb3dMaXN0Vmlld0hlYWRlcigmaW5SZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblN0YXRlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfRHJhd1RoZW1lUGxhY2FyZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlSZWN0IGluUmVjdDsKLQlUaGVtZURyYXdTdGF0ZSBpblN0YXRlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFJlY3QgaW5SZWN0OworICAgIFRoZW1lRHJhd1N0YXRlIGluU3RhdGU7CiAjaWZuZGVmIERyYXdUaGVtZVBsYWNhcmQKLQlQeU1hY19QUkVDSEVDSyhEcmF3VGhlbWVQbGFjYXJkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEcmF3VGhlbWVQbGFjYXJkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpblJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICZpblN0YXRlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IERyYXdUaGVtZVBsYWNhcmQoJmluUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICBpblN0YXRlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5SZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5TdGF0ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBEcmF3VGhlbWVQbGFjYXJkKCZpblJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5TdGF0ZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX0RyYXdUaGVtZUVkaXRUZXh0RnJhbWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JUmVjdCBpblJlY3Q7Ci0JVGhlbWVEcmF3U3RhdGUgaW5TdGF0ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBSZWN0IGluUmVjdDsKKyAgICBUaGVtZURyYXdTdGF0ZSBpblN0YXRlOwogI2lmbmRlZiBEcmF3VGhlbWVFZGl0VGV4dEZyYW1lCi0JUHlNYWNfUFJFQ0hFQ0soRHJhd1RoZW1lRWRpdFRleHRGcmFtZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRHJhd1RoZW1lRWRpdFRleHRGcmFtZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5SZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5TdGF0ZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBEcmF3VGhlbWVFZGl0VGV4dEZyYW1lKCZpblJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5TdGF0ZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmluUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluU3RhdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRHJhd1RoZW1lRWRpdFRleHRGcmFtZSgmaW5SZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluU3RhdGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFwcF9EcmF3VGhlbWVMaXN0Qm94RnJhbWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JUmVjdCBpblJlY3Q7Ci0JVGhlbWVEcmF3U3RhdGUgaW5TdGF0ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBSZWN0IGluUmVjdDsKKyAgICBUaGVtZURyYXdTdGF0ZSBpblN0YXRlOwogI2lmbmRlZiBEcmF3VGhlbWVMaXN0Qm94RnJhbWUKLQlQeU1hY19QUkVDSEVDSyhEcmF3VGhlbWVMaXN0Qm94RnJhbWUpOworICAgIFB5TWFjX1BSRUNIRUNLKERyYXdUaGVtZUxpc3RCb3hGcmFtZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5SZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5TdGF0ZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBEcmF3VGhlbWVMaXN0Qm94RnJhbWUoJmluUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluU3RhdGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpblJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblN0YXRlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IERyYXdUaGVtZUxpc3RCb3hGcmFtZSgmaW5SZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5TdGF0ZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX0RyYXdUaGVtZUZvY3VzUmVjdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlSZWN0IGluUmVjdDsKLQlCb29sZWFuIGluSGFzRm9jdXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgUmVjdCBpblJlY3Q7CisgICAgQm9vbGVhbiBpbkhhc0ZvY3VzOwogI2lmbmRlZiBEcmF3VGhlbWVGb2N1c1JlY3QKLQlQeU1hY19QUkVDSEVDSyhEcmF3VGhlbWVGb2N1c1JlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKERyYXdUaGVtZUZvY3VzUmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmIiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5SZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5IYXNGb2N1cykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBEcmF3VGhlbWVGb2N1c1JlY3QoJmluUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGluSGFzRm9jdXMpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpblJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkhhc0ZvY3VzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IERyYXdUaGVtZUZvY3VzUmVjdCgmaW5SZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5IYXNGb2N1cyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX0RyYXdUaGVtZVByaW1hcnlHcm91cChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlSZWN0IGluUmVjdDsKLQlUaGVtZURyYXdTdGF0ZSBpblN0YXRlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFJlY3QgaW5SZWN0OworICAgIFRoZW1lRHJhd1N0YXRlIGluU3RhdGU7CiAjaWZuZGVmIERyYXdUaGVtZVByaW1hcnlHcm91cAotCVB5TWFjX1BSRUNIRUNLKERyYXdUaGVtZVByaW1hcnlHcm91cCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRHJhd1RoZW1lUHJpbWFyeUdyb3VwKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpblJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICZpblN0YXRlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IERyYXdUaGVtZVByaW1hcnlHcm91cCgmaW5SZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5TdGF0ZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmluUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluU3RhdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRHJhd1RoZW1lUHJpbWFyeUdyb3VwKCZpblJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblN0YXRlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfRHJhd1RoZW1lU2Vjb25kYXJ5R3JvdXAoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JUmVjdCBpblJlY3Q7Ci0JVGhlbWVEcmF3U3RhdGUgaW5TdGF0ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBSZWN0IGluUmVjdDsKKyAgICBUaGVtZURyYXdTdGF0ZSBpblN0YXRlOwogI2lmbmRlZiBEcmF3VGhlbWVTZWNvbmRhcnlHcm91cAotCVB5TWFjX1BSRUNIRUNLKERyYXdUaGVtZVNlY29uZGFyeUdyb3VwKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEcmF3VGhlbWVTZWNvbmRhcnlHcm91cCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5SZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5TdGF0ZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBEcmF3VGhlbWVTZWNvbmRhcnlHcm91cCgmaW5SZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblN0YXRlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5SZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5TdGF0ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBEcmF3VGhlbWVTZWNvbmRhcnlHcm91cCgmaW5SZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblN0YXRlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfRHJhd1RoZW1lU2VwYXJhdG9yKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVJlY3QgaW5SZWN0OwotCVRoZW1lRHJhd1N0YXRlIGluU3RhdGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgUmVjdCBpblJlY3Q7CisgICAgVGhlbWVEcmF3U3RhdGUgaW5TdGF0ZTsKICNpZm5kZWYgRHJhd1RoZW1lU2VwYXJhdG9yCi0JUHlNYWNfUFJFQ0hFQ0soRHJhd1RoZW1lU2VwYXJhdG9yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEcmF3VGhlbWVTZXBhcmF0b3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmluUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluU3RhdGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRHJhd1RoZW1lU2VwYXJhdG9yKCZpblJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBpblN0YXRlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5SZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5TdGF0ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBEcmF3VGhlbWVTZXBhcmF0b3IoJmluUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluU3RhdGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFwcF9EcmF3VGhlbWVNb2RlbGVzc0RpYWxvZ0ZyYW1lKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVJlY3QgaW5SZWN0OwotCVRoZW1lRHJhd1N0YXRlIGluU3RhdGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgUmVjdCBpblJlY3Q7CisgICAgVGhlbWVEcmF3U3RhdGUgaW5TdGF0ZTsKICNpZm5kZWYgRHJhd1RoZW1lTW9kZWxlc3NEaWFsb2dGcmFtZQotCVB5TWFjX1BSRUNIRUNLKERyYXdUaGVtZU1vZGVsZXNzRGlhbG9nRnJhbWUpOworICAgIFB5TWFjX1BSRUNIRUNLKERyYXdUaGVtZU1vZGVsZXNzRGlhbG9nRnJhbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmluUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluU3RhdGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRHJhd1RoZW1lTW9kZWxlc3NEaWFsb2dGcmFtZSgmaW5SZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluU3RhdGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpblJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblN0YXRlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IERyYXdUaGVtZU1vZGVsZXNzRGlhbG9nRnJhbWUoJmluUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblN0YXRlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfRHJhd1RoZW1lR2VuZXJpY1dlbGwoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JUmVjdCBpblJlY3Q7Ci0JVGhlbWVEcmF3U3RhdGUgaW5TdGF0ZTsKLQlCb29sZWFuIGluRmlsbENlbnRlcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBSZWN0IGluUmVjdDsKKyAgICBUaGVtZURyYXdTdGF0ZSBpblN0YXRlOworICAgIEJvb2xlYW4gaW5GaWxsQ2VudGVyOwogI2lmbmRlZiBEcmF3VGhlbWVHZW5lcmljV2VsbAotCVB5TWFjX1BSRUNIRUNLKERyYXdUaGVtZUdlbmVyaWNXZWxsKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEcmF3VGhlbWVHZW5lcmljV2VsbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmluUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluU3RhdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkZpbGxDZW50ZXIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRHJhd1RoZW1lR2VuZXJpY1dlbGwoJmluUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5TdGF0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5GaWxsQ2VudGVyKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmluUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkZpbGxDZW50ZXIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRHJhd1RoZW1lR2VuZXJpY1dlbGwoJmluUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5TdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5GaWxsQ2VudGVyKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfRHJhd1RoZW1lRm9jdXNSZWdpb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JQm9vbGVhbiBpbkhhc0ZvY3VzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIEJvb2xlYW4gaW5IYXNGb2N1czsKICNpZm5kZWYgRHJhd1RoZW1lRm9jdXNSZWdpb24KLQlQeU1hY19QUkVDSEVDSyhEcmF3VGhlbWVGb2N1c1JlZ2lvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soRHJhd1RoZW1lRm9jdXNSZWdpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkhhc0ZvY3VzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IERyYXdUaGVtZUZvY3VzUmVnaW9uKChSZ25IYW5kbGUpMCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5IYXNGb2N1cyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkhhc0ZvY3VzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IERyYXdUaGVtZUZvY3VzUmVnaW9uKChSZ25IYW5kbGUpMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5IYXNGb2N1cyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX0lzVGhlbWVJbkNvbG9yKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlTSW50MTYgaW5EZXB0aDsKLQlCb29sZWFuIGluSXNDb2xvckRldmljZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgU0ludDE2IGluRGVwdGg7CisgICAgQm9vbGVhbiBpbklzQ29sb3JEZXZpY2U7CiAjaWZuZGVmIElzVGhlbWVJbkNvbG9yCi0JUHlNYWNfUFJFQ0hFQ0soSXNUaGVtZUluQ29sb3IpOworICAgIFB5TWFjX1BSRUNIRUNLKElzVGhlbWVJbkNvbG9yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluRGVwdGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbklzQ29sb3JEZXZpY2UpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBJc1RoZW1lSW5Db2xvcihpbkRlcHRoLAotCSAgICAgICAgICAgICAgICAgICAgIGluSXNDb2xvckRldmljZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5EZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluSXNDb2xvckRldmljZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IElzVGhlbWVJbkNvbG9yKGluRGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW5Jc0NvbG9yRGV2aWNlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfR2V0VGhlbWVBY2NlbnRDb2xvcnMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JQ1RhYkhhbmRsZSBvdXRDb2xvcnM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgQ1RhYkhhbmRsZSBvdXRDb2xvcnM7CiAjaWZuZGVmIEdldFRoZW1lQWNjZW50Q29sb3JzCi0JUHlNYWNfUFJFQ0hFQ0soR2V0VGhlbWVBY2NlbnRDb2xvcnMpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFRoZW1lQWNjZW50Q29sb3JzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0VGhlbWVBY2NlbnRDb2xvcnMoJm91dENvbG9ycyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIG91dENvbG9ycyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRUaGVtZUFjY2VudENvbG9ycygmb3V0Q29sb3JzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgb3V0Q29sb3JzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfRHJhd1RoZW1lTWVudUJhckJhY2tncm91bmQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JUmVjdCBpbkJvdW5kczsKLQlUaGVtZU1lbnVCYXJTdGF0ZSBpblN0YXRlOwotCVVJbnQzMiBpbkF0dHJpYnV0ZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgUmVjdCBpbkJvdW5kczsKKyAgICBUaGVtZU1lbnVCYXJTdGF0ZSBpblN0YXRlOworICAgIFVJbnQzMiBpbkF0dHJpYnV0ZXM7CiAjaWZuZGVmIERyYXdUaGVtZU1lbnVCYXJCYWNrZ3JvdW5kCi0JUHlNYWNfUFJFQ0hFQ0soRHJhd1RoZW1lTWVudUJhckJhY2tncm91bmQpOworICAgIFB5TWFjX1BSRUNIRUNLKERyYXdUaGVtZU1lbnVCYXJCYWNrZ3JvdW5kKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mSGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5Cb3VuZHMsCi0JICAgICAgICAgICAgICAgICAgICAgICZpblN0YXRlLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5BdHRyaWJ1dGVzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IERyYXdUaGVtZU1lbnVCYXJCYWNrZ3JvdW5kKCZpbkJvdW5kcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5TdGF0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5BdHRyaWJ1dGVzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJkhsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmluQm91bmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5TdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQXR0cmlidXRlcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBEcmF3VGhlbWVNZW51QmFyQmFja2dyb3VuZCgmaW5Cb3VuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQXR0cmlidXRlcyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX0dldFRoZW1lTWVudUJhckhlaWdodChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlTSW50MTYgb3V0SGVpZ2h0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFNJbnQxNiBvdXRIZWlnaHQ7CiAjaWZuZGVmIEdldFRoZW1lTWVudUJhckhlaWdodAotCVB5TWFjX1BSRUNIRUNLKEdldFRoZW1lTWVudUJhckhlaWdodCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VGhlbWVNZW51QmFySGVpZ2h0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0VGhlbWVNZW51QmFySGVpZ2h0KCZvdXRIZWlnaHQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIG91dEhlaWdodCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRUaGVtZU1lbnVCYXJIZWlnaHQoJm91dEhlaWdodCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0SGVpZ2h0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfRHJhd1RoZW1lTWVudUJhY2tncm91bmQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JUmVjdCBpbk1lbnVSZWN0OwotCVRoZW1lTWVudVR5cGUgaW5NZW51VHlwZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBSZWN0IGluTWVudVJlY3Q7CisgICAgVGhlbWVNZW51VHlwZSBpbk1lbnVUeXBlOwogI2lmbmRlZiBEcmF3VGhlbWVNZW51QmFja2dyb3VuZAotCVB5TWFjX1BSRUNIRUNLKERyYXdUaGVtZU1lbnVCYWNrZ3JvdW5kKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEcmF3VGhlbWVNZW51QmFja2dyb3VuZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJkgiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5NZW51UmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluTWVudVR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRHJhd1RoZW1lTWVudUJhY2tncm91bmQoJmluTWVudVJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluTWVudVR5cGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpbk1lbnVSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5NZW51VHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBEcmF3VGhlbWVNZW51QmFja2dyb3VuZCgmaW5NZW51UmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5NZW51VHlwZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX0dldFRoZW1lTWVudUJhY2tncm91bmRSZWdpb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JUmVjdCBpbk1lbnVSZWN0OwotCVRoZW1lTWVudVR5cGUgbWVudVR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgUmVjdCBpbk1lbnVSZWN0OworICAgIFRoZW1lTWVudVR5cGUgbWVudVR5cGU7CiAjaWZuZGVmIEdldFRoZW1lTWVudUJhY2tncm91bmRSZWdpb24KLQlQeU1hY19QUkVDSEVDSyhHZXRUaGVtZU1lbnVCYWNrZ3JvdW5kUmVnaW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRUaGVtZU1lbnVCYWNrZ3JvdW5kUmVnaW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mSCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpbk1lbnVSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmbWVudVR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0VGhlbWVNZW51QmFja2dyb3VuZFJlZ2lvbigmaW5NZW51UmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW51VHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUmduSGFuZGxlKTApOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpbk1lbnVSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVudVR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0VGhlbWVNZW51QmFja2dyb3VuZFJlZ2lvbigmaW5NZW51UmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW51VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUmduSGFuZGxlKTApOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFwcF9EcmF3VGhlbWVNZW51U2VwYXJhdG9yKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVJlY3QgaW5JdGVtUmVjdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBSZWN0IGluSXRlbVJlY3Q7CiAjaWZuZGVmIERyYXdUaGVtZU1lbnVTZXBhcmF0b3IKLQlQeU1hY19QUkVDSEVDSyhEcmF3VGhlbWVNZW51U2VwYXJhdG9yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEcmF3VGhlbWVNZW51U2VwYXJhdG9yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmluSXRlbVJlY3QpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRHJhd1RoZW1lTWVudVNlcGFyYXRvcigmaW5JdGVtUmVjdCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5JdGVtUmVjdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBEcmF3VGhlbWVNZW51U2VwYXJhdG9yKCZpbkl0ZW1SZWN0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfR2V0VGhlbWVNZW51U2VwYXJhdG9ySGVpZ2h0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVNJbnQxNiBvdXRIZWlnaHQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgU0ludDE2IG91dEhlaWdodDsKICNpZm5kZWYgR2V0VGhlbWVNZW51U2VwYXJhdG9ySGVpZ2h0Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0VGhlbWVNZW51U2VwYXJhdG9ySGVpZ2h0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRUaGVtZU1lbnVTZXBhcmF0b3JIZWlnaHQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRUaGVtZU1lbnVTZXBhcmF0b3JIZWlnaHQoJm91dEhlaWdodCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0SGVpZ2h0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldFRoZW1lTWVudVNlcGFyYXRvckhlaWdodCgmb3V0SGVpZ2h0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRIZWlnaHQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFwcF9HZXRUaGVtZU1lbnVJdGVtRXh0cmEoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVGhlbWVNZW51SXRlbVR5cGUgaW5JdGVtVHlwZTsKLQlTSW50MTYgb3V0SGVpZ2h0OwotCVNJbnQxNiBvdXRXaWR0aDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBUaGVtZU1lbnVJdGVtVHlwZSBpbkl0ZW1UeXBlOworICAgIFNJbnQxNiBvdXRIZWlnaHQ7CisgICAgU0ludDE2IG91dFdpZHRoOwogI2lmbmRlZiBHZXRUaGVtZU1lbnVJdGVtRXh0cmEKLQlQeU1hY19QUkVDSEVDSyhHZXRUaGVtZU1lbnVJdGVtRXh0cmEpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFRoZW1lTWVudUl0ZW1FeHRyYSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJIIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbVR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0VGhlbWVNZW51SXRlbUV4dHJhKGluSXRlbVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0SGVpZ2h0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFdpZHRoKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0SGVpZ2h0LAotCSAgICAgICAgICAgICAgICAgICAgIG91dFdpZHRoKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbVR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0VGhlbWVNZW51SXRlbUV4dHJhKGluSXRlbVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0SGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFdpZHRoKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0SGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dFdpZHRoKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfR2V0VGhlbWVNZW51VGl0bGVFeHRyYShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlTSW50MTYgb3V0V2lkdGg7Ci0JQm9vbGVhbiBpbklzU3F1aXNoZWQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgU0ludDE2IG91dFdpZHRoOworICAgIEJvb2xlYW4gaW5Jc1NxdWlzaGVkOwogI2lmbmRlZiBHZXRUaGVtZU1lbnVUaXRsZUV4dHJhCi0JUHlNYWNfUFJFQ0hFQ0soR2V0VGhlbWVNZW51VGl0bGVFeHRyYSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VGhlbWVNZW51VGl0bGVFeHRyYSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluSXNTcXVpc2hlZCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRUaGVtZU1lbnVUaXRsZUV4dHJhKCZvdXRXaWR0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbklzU3F1aXNoZWQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIG91dFdpZHRoKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluSXNTcXVpc2hlZCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRUaGVtZU1lbnVUaXRsZUV4dHJhKCZvdXRXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbklzU3F1aXNoZWQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dFdpZHRoKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfRHJhd1RoZW1lVGFiUGFuZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlSZWN0IGluUmVjdDsKLQlUaGVtZURyYXdTdGF0ZSBpblN0YXRlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFJlY3QgaW5SZWN0OworICAgIFRoZW1lRHJhd1N0YXRlIGluU3RhdGU7CiAjaWZuZGVmIERyYXdUaGVtZVRhYlBhbmUKLQlQeU1hY19QUkVDSEVDSyhEcmF3VGhlbWVUYWJQYW5lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEcmF3VGhlbWVUYWJQYW5lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpblJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICZpblN0YXRlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IERyYXdUaGVtZVRhYlBhbmUoJmluUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICBpblN0YXRlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5SZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5TdGF0ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBEcmF3VGhlbWVUYWJQYW5lKCZpblJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5TdGF0ZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX0dldFRoZW1lVGFiUmVnaW9uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVJlY3QgaW5SZWN0OwotCVRoZW1lVGFiU3R5bGUgaW5TdHlsZTsKLQlUaGVtZVRhYkRpcmVjdGlvbiBpbkRpcmVjdGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBSZWN0IGluUmVjdDsKKyAgICBUaGVtZVRhYlN0eWxlIGluU3R5bGU7CisgICAgVGhlbWVUYWJEaXJlY3Rpb24gaW5EaXJlY3Rpb247CiAjaWZuZGVmIEdldFRoZW1lVGFiUmVnaW9uCi0JUHlNYWNfUFJFQ0hFQ0soR2V0VGhlbWVUYWJSZWdpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFRoZW1lVGFiUmVnaW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mSEgiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5SZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5TdHlsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluRGlyZWN0aW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldFRoZW1lVGFiUmVnaW9uKCZpblJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGluU3R5bGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGluRGlyZWN0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAoUmduSGFuZGxlKTApOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mSEgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5SZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5TdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluRGlyZWN0aW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldFRoZW1lVGFiUmVnaW9uKCZpblJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluU3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRGlyZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUmduSGFuZGxlKTApOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFwcF9TZXRUaGVtZUN1cnNvcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlUaGVtZUN1cnNvciBpbkN1cnNvcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBUaGVtZUN1cnNvciBpbkN1cnNvcjsKICNpZm5kZWYgU2V0VGhlbWVDdXJzb3IKLQlQeU1hY19QUkVDSEVDSyhTZXRUaGVtZUN1cnNvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0VGhlbWVDdXJzb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkN1cnNvcikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRUaGVtZUN1cnNvcihpbkN1cnNvcik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkN1cnNvcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRUaGVtZUN1cnNvcihpbkN1cnNvcik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX1NldEFuaW1hdGVkVGhlbWVDdXJzb3IoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVGhlbWVDdXJzb3IgaW5DdXJzb3I7Ci0JVUludDMyIGluQW5pbWF0aW9uU3RlcDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBUaGVtZUN1cnNvciBpbkN1cnNvcjsKKyAgICBVSW50MzIgaW5BbmltYXRpb25TdGVwOwogI2lmbmRlZiBTZXRBbmltYXRlZFRoZW1lQ3Vyc29yCi0JUHlNYWNfUFJFQ0hFQ0soU2V0QW5pbWF0ZWRUaGVtZUN1cnNvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0QW5pbWF0ZWRUaGVtZUN1cnNvcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkN1cnNvciwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluQW5pbWF0aW9uU3RlcCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRBbmltYXRlZFRoZW1lQ3Vyc29yKGluQ3Vyc29yLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQW5pbWF0aW9uU3RlcCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5DdXJzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkFuaW1hdGlvblN0ZXApKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0QW5pbWF0ZWRUaGVtZUN1cnNvcihpbkN1cnNvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkFuaW1hdGlvblN0ZXApOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFwcF9HZXRUaGVtZVNjcm9sbEJhclRodW1iU3R5bGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVGhlbWVTY3JvbGxCYXJUaHVtYlN0eWxlIG91dFN0eWxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFRoZW1lU2Nyb2xsQmFyVGh1bWJTdHlsZSBvdXRTdHlsZTsKICNpZm5kZWYgR2V0VGhlbWVTY3JvbGxCYXJUaHVtYlN0eWxlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0VGhlbWVTY3JvbGxCYXJUaHVtYlN0eWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRUaGVtZVNjcm9sbEJhclRodW1iU3R5bGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRUaGVtZVNjcm9sbEJhclRodW1iU3R5bGUoJm91dFN0eWxlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJIIiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRTdHlsZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRUaGVtZVNjcm9sbEJhclRodW1iU3R5bGUoJm91dFN0eWxlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRTdHlsZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX0dldFRoZW1lU2Nyb2xsQmFyQXJyb3dTdHlsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlUaGVtZVNjcm9sbEJhckFycm93U3R5bGUgb3V0U3R5bGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVGhlbWVTY3JvbGxCYXJBcnJvd1N0eWxlIG91dFN0eWxlOwogI2lmbmRlZiBHZXRUaGVtZVNjcm9sbEJhckFycm93U3R5bGUKLQlQeU1hY19QUkVDSEVDSyhHZXRUaGVtZVNjcm9sbEJhckFycm93U3R5bGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFRoZW1lU2Nyb2xsQmFyQXJyb3dTdHlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldFRoZW1lU2Nyb2xsQmFyQXJyb3dTdHlsZSgmb3V0U3R5bGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIkgiLAotCSAgICAgICAgICAgICAgICAgICAgIG91dFN0eWxlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldFRoZW1lU2Nyb2xsQmFyQXJyb3dTdHlsZSgmb3V0U3R5bGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIkgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dFN0eWxlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfR2V0VGhlbWVDaGVja0JveFN0eWxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVRoZW1lQ2hlY2tCb3hTdHlsZSBvdXRTdHlsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBUaGVtZUNoZWNrQm94U3R5bGUgb3V0U3R5bGU7CiAjaWZuZGVmIEdldFRoZW1lQ2hlY2tCb3hTdHlsZQotCVB5TWFjX1BSRUNIRUNLKEdldFRoZW1lQ2hlY2tCb3hTdHlsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VGhlbWVDaGVja0JveFN0eWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0VGhlbWVDaGVja0JveFN0eWxlKCZvdXRTdHlsZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiSCIsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0U3R5bGUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0VGhlbWVDaGVja0JveFN0eWxlKCZvdXRTdHlsZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0U3R5bGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFwcF9Vc2VUaGVtZUZvbnQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVGhlbWVGb250SUQgaW5Gb250SUQ7Ci0JU2NyaXB0Q29kZSBpblNjcmlwdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBUaGVtZUZvbnRJRCBpbkZvbnRJRDsKKyAgICBTY3JpcHRDb2RlIGluU2NyaXB0OwogI2lmbmRlZiBVc2VUaGVtZUZvbnQKLQlQeU1hY19QUkVDSEVDSyhVc2VUaGVtZUZvbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKFVzZVRoZW1lRm9udCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJIaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkZvbnRJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluU2NyaXB0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFVzZVRoZW1lRm9udChpbkZvbnRJRCwKLQkgICAgICAgICAgICAgICAgICAgIGluU2NyaXB0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJIaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkZvbnRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluU2NyaXB0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFVzZVRoZW1lRm9udChpbkZvbnRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGluU2NyaXB0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfRHJhd1RoZW1lVGV4dEJveChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlDRlN0cmluZ1JlZiBpblN0cmluZzsKLQlUaGVtZUZvbnRJRCBpbkZvbnRJRDsKLQlUaGVtZURyYXdTdGF0ZSBpblN0YXRlOwotCUJvb2xlYW4gaW5XcmFwVG9XaWR0aDsKLQlSZWN0IGluQm91bmRpbmdCb3g7Ci0JU0ludDE2IGluSnVzdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBDRlN0cmluZ1JlZiBpblN0cmluZzsKKyAgICBUaGVtZUZvbnRJRCBpbkZvbnRJRDsKKyAgICBUaGVtZURyYXdTdGF0ZSBpblN0YXRlOworICAgIEJvb2xlYW4gaW5XcmFwVG9XaWR0aDsKKyAgICBSZWN0IGluQm91bmRpbmdCb3g7CisgICAgU0ludDE2IGluSnVzdDsKICNpZm5kZWYgRHJhd1RoZW1lVGV4dEJveAotCVB5TWFjX1BSRUNIRUNLKERyYXdUaGVtZVRleHRCb3gpOworICAgIFB5TWFjX1BSRUNIRUNLKERyYXdUaGVtZVRleHRCb3gpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZIbGJPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmaW5TdHJpbmcsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkZvbnRJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluU3RhdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbldyYXBUb1dpZHRoLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5Cb3VuZGluZ0JveCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluSnVzdCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBEcmF3VGhlbWVUZXh0Qm94KGluU3RyaW5nLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGluRm9udElELAotCSAgICAgICAgICAgICAgICAgICAgICAgIGluU3RhdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgaW5XcmFwVG9XaWR0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAmaW5Cb3VuZGluZ0JveCwKLQkgICAgICAgICAgICAgICAgICAgICAgICBpbkp1c3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZIbGJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmaW5TdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkZvbnRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbldyYXBUb1dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5Cb3VuZGluZ0JveCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluSnVzdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBEcmF3VGhlbWVUZXh0Qm94KGluU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRm9udElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5XcmFwVG9XaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Cb3VuZGluZ0JveCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkp1c3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX1RydW5jYXRlVGhlbWVUZXh0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUNGTXV0YWJsZVN0cmluZ1JlZiBpblN0cmluZzsKLQlUaGVtZUZvbnRJRCBpbkZvbnRJRDsKLQlUaGVtZURyYXdTdGF0ZSBpblN0YXRlOwotCVNJbnQxNiBpblBpeGVsV2lkdGhMaW1pdDsKLQlUcnVuY0NvZGUgaW5UcnVuY1doZXJlOwotCUJvb2xlYW4gb3V0VHJ1bmNhdGVkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIENGTXV0YWJsZVN0cmluZ1JlZiBpblN0cmluZzsKKyAgICBUaGVtZUZvbnRJRCBpbkZvbnRJRDsKKyAgICBUaGVtZURyYXdTdGF0ZSBpblN0YXRlOworICAgIFNJbnQxNiBpblBpeGVsV2lkdGhMaW1pdDsKKyAgICBUcnVuY0NvZGUgaW5UcnVuY1doZXJlOworICAgIEJvb2xlYW4gb3V0VHJ1bmNhdGVkOwogI2lmbmRlZiBUcnVuY2F0ZVRoZW1lVGV4dAotCVB5TWFjX1BSRUNIRUNLKFRydW5jYXRlVGhlbWVUZXh0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhUcnVuY2F0ZVRoZW1lVGV4dCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJkhsaGgiLAotCSAgICAgICAgICAgICAgICAgICAgICBDRk11dGFibGVTdHJpbmdSZWZPYmpfQ29udmVydCwgJmluU3RyaW5nLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5Gb250SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICZpblN0YXRlLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5QaXhlbFdpZHRoTGltaXQsCi0JICAgICAgICAgICAgICAgICAgICAgICZpblRydW5jV2hlcmUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gVHJ1bmNhdGVUaGVtZVRleHQoaW5TdHJpbmcsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGluRm9udElELAotCSAgICAgICAgICAgICAgICAgICAgICAgICBpblN0YXRlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBpblBpeGVsV2lkdGhMaW1pdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgaW5UcnVuY1doZXJlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0VHJ1bmNhdGVkKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRUcnVuY2F0ZWQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mSGxoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGTXV0YWJsZVN0cmluZ1JlZk9ial9Db252ZXJ0LCAmaW5TdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkZvbnRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblBpeGVsV2lkdGhMaW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluVHJ1bmNXaGVyZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBUcnVuY2F0ZVRoZW1lVGV4dChpblN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Gb250SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluUGl4ZWxXaWR0aExpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblRydW5jV2hlcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRUcnVuY2F0ZWQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dFRydW5jYXRlZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX0dldFRoZW1lVGV4dERpbWVuc2lvbnMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JQ0ZTdHJpbmdSZWYgaW5TdHJpbmc7Ci0JVGhlbWVGb250SUQgaW5Gb250SUQ7Ci0JVGhlbWVEcmF3U3RhdGUgaW5TdGF0ZTsKLQlCb29sZWFuIGluV3JhcFRvV2lkdGg7Ci0JUG9pbnQgaW9Cb3VuZHM7Ci0JU0ludDE2IG91dEJhc2VsaW5lOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIENGU3RyaW5nUmVmIGluU3RyaW5nOworICAgIFRoZW1lRm9udElEIGluRm9udElEOworICAgIFRoZW1lRHJhd1N0YXRlIGluU3RhdGU7CisgICAgQm9vbGVhbiBpbldyYXBUb1dpZHRoOworICAgIFBvaW50IGlvQm91bmRzOworICAgIFNJbnQxNiBvdXRCYXNlbGluZTsKICNpZm5kZWYgR2V0VGhlbWVUZXh0RGltZW5zaW9ucwotCVB5TWFjX1BSRUNIRUNLKEdldFRoZW1lVGV4dERpbWVuc2lvbnMpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFRoZW1lVGV4dERpbWVuc2lvbnMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZIbGJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZpblN0cmluZywKLQkgICAgICAgICAgICAgICAgICAgICAgJmluRm9udElELAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5TdGF0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluV3JhcFRvV2lkdGgsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmaW9Cb3VuZHMpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0VGhlbWVUZXh0RGltZW5zaW9ucyhpblN0cmluZywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkZvbnRJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblN0YXRlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluV3JhcFRvV2lkdGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlvQm91bmRzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRCYXNlbGluZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFBvaW50LCBpb0JvdW5kcywKLQkgICAgICAgICAgICAgICAgICAgICBvdXRCYXNlbGluZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZIbGJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZpblN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluRm9udElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5TdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluV3JhcFRvV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmaW9Cb3VuZHMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0VGhlbWVUZXh0RGltZW5zaW9ucyhpblN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkZvbnRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluV3JhcFRvV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlvQm91bmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRCYXNlbGluZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFBvaW50LCBpb0JvdW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRCYXNlbGluZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX0dldFRoZW1lVGV4dFNoYWRvd091dHNldChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlUaGVtZUZvbnRJRCBpbkZvbnRJRDsKLQlUaGVtZURyYXdTdGF0ZSBpblN0YXRlOwotCVJlY3Qgb3V0T3V0c2V0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFRoZW1lRm9udElEIGluRm9udElEOworICAgIFRoZW1lRHJhd1N0YXRlIGluU3RhdGU7CisgICAgUmVjdCBvdXRPdXRzZXQ7CiAjaWZuZGVmIEdldFRoZW1lVGV4dFNoYWRvd091dHNldAotCVB5TWFjX1BSRUNIRUNLKEdldFRoZW1lVGV4dFNoYWRvd091dHNldCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VGhlbWVUZXh0U2hhZG93T3V0c2V0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIkhsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluRm9udElELAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5TdGF0ZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRUaGVtZVRleHRTaGFkb3dPdXRzZXQoaW5Gb250SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblN0YXRlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dE91dHNldCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJm91dE91dHNldCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiSGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Gb250SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblN0YXRlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldFRoZW1lVGV4dFNoYWRvd091dHNldChpbkZvbnRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0T3V0c2V0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmb3V0T3V0c2V0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfRHJhd1RoZW1lU2Nyb2xsQmFyQXJyb3dzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVJlY3QgYm91bmRzOwotCVRoZW1lVHJhY2tFbmFibGVTdGF0ZSBlbmFibGVTdGF0ZTsKLQlUaGVtZVRyYWNrUHJlc3NTdGF0ZSBwcmVzc1N0YXRlOwotCUJvb2xlYW4gaXNIb3JpejsKLQlSZWN0IHRyYWNrQm91bmRzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFJlY3QgYm91bmRzOworICAgIFRoZW1lVHJhY2tFbmFibGVTdGF0ZSBlbmFibGVTdGF0ZTsKKyAgICBUaGVtZVRyYWNrUHJlc3NTdGF0ZSBwcmVzc1N0YXRlOworICAgIEJvb2xlYW4gaXNIb3JpejsKKyAgICBSZWN0IHRyYWNrQm91bmRzOwogI2lmbmRlZiBEcmF3VGhlbWVTY3JvbGxCYXJBcnJvd3MKLQlQeU1hY19QUkVDSEVDSyhEcmF3VGhlbWVTY3JvbGxCYXJBcnJvd3MpOworICAgIFB5TWFjX1BSRUNIRUNLKERyYXdUaGVtZVNjcm9sbEJhckFycm93cyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmJiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHMsCi0JICAgICAgICAgICAgICAgICAgICAgICZlbmFibGVTdGF0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnByZXNzU3RhdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZpc0hvcml6KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IERyYXdUaGVtZVNjcm9sbEJhckFycm93cygmYm91bmRzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlU3RhdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVzc1N0YXRlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNIb3JpeiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFja0JvdW5kcyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJnRyYWNrQm91bmRzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmJiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmFibGVTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnByZXNzU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpc0hvcml6KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IERyYXdUaGVtZVNjcm9sbEJhckFycm93cygmYm91bmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVzc1N0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNIb3JpeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFja0JvdW5kcyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJnRyYWNrQm91bmRzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfR2V0VGhlbWVTY3JvbGxCYXJUcmFja1JlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JUmVjdCBib3VuZHM7Ci0JVGhlbWVUcmFja0VuYWJsZVN0YXRlIGVuYWJsZVN0YXRlOwotCVRoZW1lVHJhY2tQcmVzc1N0YXRlIHByZXNzU3RhdGU7Ci0JQm9vbGVhbiBpc0hvcml6OwotCVJlY3QgdHJhY2tCb3VuZHM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgUmVjdCBib3VuZHM7CisgICAgVGhlbWVUcmFja0VuYWJsZVN0YXRlIGVuYWJsZVN0YXRlOworICAgIFRoZW1lVHJhY2tQcmVzc1N0YXRlIHByZXNzU3RhdGU7CisgICAgQm9vbGVhbiBpc0hvcml6OworICAgIFJlY3QgdHJhY2tCb3VuZHM7CiAjaWZuZGVmIEdldFRoZW1lU2Nyb2xsQmFyVHJhY2tSZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0VGhlbWVTY3JvbGxCYXJUcmFja1JlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFRoZW1lU2Nyb2xsQmFyVHJhY2tSZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYmJiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kcywKLQkgICAgICAgICAgICAgICAgICAgICAgJmVuYWJsZVN0YXRlLAotCSAgICAgICAgICAgICAgICAgICAgICAmcHJlc3NTdGF0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlzSG9yaXopKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0VGhlbWVTY3JvbGxCYXJUcmFja1JlY3QoJmJvdW5kcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlU3RhdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXNzU3RhdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzSG9yaXosCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFja0JvdW5kcyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJnRyYWNrQm91bmRzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmJiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmFibGVTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnByZXNzU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpc0hvcml6KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldFRoZW1lU2Nyb2xsQmFyVHJhY2tSZWN0KCZib3VuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZVN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVzc1N0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0hvcml6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHJhY2tCb3VuZHMpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZ0cmFja0JvdW5kcyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX0hpdFRlc3RUaGVtZVNjcm9sbEJhckFycm93cyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JUmVjdCBzY3JvbGxCYXJCb3VuZHM7Ci0JVGhlbWVUcmFja0VuYWJsZVN0YXRlIGVuYWJsZVN0YXRlOwotCVRoZW1lVHJhY2tQcmVzc1N0YXRlIHByZXNzU3RhdGU7Ci0JQm9vbGVhbiBpc0hvcml6OwotCVBvaW50IHB0SGl0OwotCVJlY3QgdHJhY2tCb3VuZHM7Ci0JQ29udHJvbFBhcnRDb2RlIHBhcnRjb2RlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBSZWN0IHNjcm9sbEJhckJvdW5kczsKKyAgICBUaGVtZVRyYWNrRW5hYmxlU3RhdGUgZW5hYmxlU3RhdGU7CisgICAgVGhlbWVUcmFja1ByZXNzU3RhdGUgcHJlc3NTdGF0ZTsKKyAgICBCb29sZWFuIGlzSG9yaXo7CisgICAgUG9pbnQgcHRIaXQ7CisgICAgUmVjdCB0cmFja0JvdW5kczsKKyAgICBDb250cm9sUGFydENvZGUgcGFydGNvZGU7CiAjaWZuZGVmIEhpdFRlc3RUaGVtZVNjcm9sbEJhckFycm93cwotCVB5TWFjX1BSRUNIRUNLKEhpdFRlc3RUaGVtZVNjcm9sbEJhckFycm93cyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSGl0VGVzdFRoZW1lU2Nyb2xsQmFyQXJyb3dzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYmJiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmc2Nyb2xsQmFyQm91bmRzLAotCSAgICAgICAgICAgICAgICAgICAgICAmZW5hYmxlU3RhdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZwcmVzc1N0YXRlLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXNIb3JpeiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZwdEhpdCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEhpdFRlc3RUaGVtZVNjcm9sbEJhckFycm93cygmc2Nyb2xsQmFyQm91bmRzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVTdGF0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlc3NTdGF0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNIb3JpeiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRIaXQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFja0JvdW5kcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnRjb2RlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJnRyYWNrQm91bmRzLAotCSAgICAgICAgICAgICAgICAgICAgIHBhcnRjb2RlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmJiYk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnNjcm9sbEJhckJvdW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmVuYWJsZVN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJlc3NTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlzSG9yaXosCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmcHRIaXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBIaXRUZXN0VGhlbWVTY3JvbGxCYXJBcnJvd3MoJnNjcm9sbEJhckJvdW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXNzU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzSG9yaXosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0SGl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHJhY2tCb3VuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJ0Y29kZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZ0cmFja0JvdW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0Y29kZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX0RyYXdUaGVtZVNjcm9sbEJhckRlbGltaXRlcnMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVGhlbWVXaW5kb3dUeXBlIGZsYXZvcjsKLQlSZWN0IGluQ29udFJlY3Q7Ci0JVGhlbWVEcmF3U3RhdGUgc3RhdGU7Ci0JVGhlbWVXaW5kb3dBdHRyaWJ1dGVzIGF0dHJpYnV0ZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVGhlbWVXaW5kb3dUeXBlIGZsYXZvcjsKKyAgICBSZWN0IGluQ29udFJlY3Q7CisgICAgVGhlbWVEcmF3U3RhdGUgc3RhdGU7CisgICAgVGhlbWVXaW5kb3dBdHRyaWJ1dGVzIGF0dHJpYnV0ZXM7CiAjaWZuZGVmIERyYXdUaGVtZVNjcm9sbEJhckRlbGltaXRlcnMKLQlQeU1hY19QUkVDSEVDSyhEcmF3VGhlbWVTY3JvbGxCYXJEZWxpbWl0ZXJzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEcmF3VGhlbWVTY3JvbGxCYXJEZWxpbWl0ZXJzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIkhPJmxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYXZvciwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmluQ29udFJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICZzdGF0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmF0dHJpYnV0ZXMpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRHJhd1RoZW1lU2Nyb2xsQmFyRGVsaW1pdGVycyhmbGF2b3IsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQ29udFJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiSE8mbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhdm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5Db250UmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYXR0cmlidXRlcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBEcmF3VGhlbWVTY3JvbGxCYXJEZWxpbWl0ZXJzKGZsYXZvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Db250UmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfRHJhd1RoZW1lQnV0dG9uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVJlY3QgaW5Cb3VuZHM7Ci0JVUludDE2IGluS2luZDsKLQlUaGVtZUJ1dHRvbkRyYXdJbmZvIGluTmV3SW5mbzsKLQlUaGVtZUJ1dHRvbkRyYXdJbmZvIGluUHJldkluZm87Ci0JVUludDMyIGluVXNlckRhdGE7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgUmVjdCBpbkJvdW5kczsKKyAgICBVSW50MTYgaW5LaW5kOworICAgIFRoZW1lQnV0dG9uRHJhd0luZm8gaW5OZXdJbmZvOworICAgIFRoZW1lQnV0dG9uRHJhd0luZm8gaW5QcmV2SW5mbzsKKyAgICBVSW50MzIgaW5Vc2VyRGF0YTsKICNpZm5kZWYgRHJhd1RoZW1lQnV0dG9uCi0JUHlNYWNfUFJFQ0hFQ0soRHJhd1RoZW1lQnV0dG9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEcmF3VGhlbWVCdXR0b24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZITyZPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5Cb3VuZHMsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbktpbmQsCi0JICAgICAgICAgICAgICAgICAgICAgIFRoZW1lQnV0dG9uRHJhd0luZm9fQ29udmVydCwgJmluTmV3SW5mbywKLQkgICAgICAgICAgICAgICAgICAgICAgVGhlbWVCdXR0b25EcmF3SW5mb19Db252ZXJ0LCAmaW5QcmV2SW5mbywKLQkgICAgICAgICAgICAgICAgICAgICAgJmluVXNlckRhdGEpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRHJhd1RoZW1lQnV0dG9uKCZpbkJvdW5kcywKLQkgICAgICAgICAgICAgICAgICAgICAgIGluS2luZCwKLQkgICAgICAgICAgICAgICAgICAgICAgICZpbk5ld0luZm8sCi0JICAgICAgICAgICAgICAgICAgICAgICAmaW5QcmV2SW5mbywKLQkgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCi0JICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAotCSAgICAgICAgICAgICAgICAgICAgICAgaW5Vc2VyRGF0YSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZITyZPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5Cb3VuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbktpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZW1lQnV0dG9uRHJhd0luZm9fQ29udmVydCwgJmluTmV3SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlbWVCdXR0b25EcmF3SW5mb19Db252ZXJ0LCAmaW5QcmV2SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluVXNlckRhdGEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRHJhd1RoZW1lQnV0dG9uKCZpbkJvdW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGluS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbk5ld0luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5QcmV2SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Vc2VyRGF0YSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX0dldFRoZW1lQnV0dG9uUmVnaW9uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVJlY3QgaW5Cb3VuZHM7Ci0JVUludDE2IGluS2luZDsKLQlUaGVtZUJ1dHRvbkRyYXdJbmZvIGluTmV3SW5mbzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBSZWN0IGluQm91bmRzOworICAgIFVJbnQxNiBpbktpbmQ7CisgICAgVGhlbWVCdXR0b25EcmF3SW5mbyBpbk5ld0luZm87CiAjaWZuZGVmIEdldFRoZW1lQnV0dG9uUmVnaW9uCi0JUHlNYWNfUFJFQ0hFQ0soR2V0VGhlbWVCdXR0b25SZWdpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFRoZW1lQnV0dG9uUmVnaW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mSE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmluQm91bmRzLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5LaW5kLAotCSAgICAgICAgICAgICAgICAgICAgICBUaGVtZUJ1dHRvbkRyYXdJbmZvX0NvbnZlcnQsICZpbk5ld0luZm8pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0VGhlbWVCdXR0b25SZWdpb24oJmluQm91bmRzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbktpbmQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbk5ld0luZm8sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIChSZ25IYW5kbGUpMCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZITyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5Cb3VuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbktpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZW1lQnV0dG9uRHJhd0luZm9fQ29udmVydCwgJmluTmV3SW5mbykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRUaGVtZUJ1dHRvblJlZ2lvbigmaW5Cb3VuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluTmV3SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFJnbkhhbmRsZSkwKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfR2V0VGhlbWVCdXR0b25Db250ZW50Qm91bmRzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVJlY3QgaW5Cb3VuZHM7Ci0JVUludDE2IGluS2luZDsKLQlUaGVtZUJ1dHRvbkRyYXdJbmZvIGluRHJhd0luZm87Ci0JUmVjdCBvdXRCb3VuZHM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgUmVjdCBpbkJvdW5kczsKKyAgICBVSW50MTYgaW5LaW5kOworICAgIFRoZW1lQnV0dG9uRHJhd0luZm8gaW5EcmF3SW5mbzsKKyAgICBSZWN0IG91dEJvdW5kczsKICNpZm5kZWYgR2V0VGhlbWVCdXR0b25Db250ZW50Qm91bmRzCi0JUHlNYWNfUFJFQ0hFQ0soR2V0VGhlbWVCdXR0b25Db250ZW50Qm91bmRzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRUaGVtZUJ1dHRvbkNvbnRlbnRCb3VuZHMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZITyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5Cb3VuZHMsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbktpbmQsCi0JICAgICAgICAgICAgICAgICAgICAgIFRoZW1lQnV0dG9uRHJhd0luZm9fQ29udmVydCwgJmluRHJhd0luZm8pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0VGhlbWVCdXR0b25Db250ZW50Qm91bmRzKCZpbkJvdW5kcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluS2luZCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkRyYXdJbmZvLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEJvdW5kcyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJm91dEJvdW5kcyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZITyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5Cb3VuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbktpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZW1lQnV0dG9uRHJhd0luZm9fQ29udmVydCwgJmluRHJhd0luZm8pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0VGhlbWVCdXR0b25Db250ZW50Qm91bmRzKCZpbkJvdW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkRyYXdJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEJvdW5kcyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJm91dEJvdW5kcyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX0dldFRoZW1lQnV0dG9uQmFja2dyb3VuZEJvdW5kcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlSZWN0IGluQm91bmRzOwotCVVJbnQxNiBpbktpbmQ7Ci0JVGhlbWVCdXR0b25EcmF3SW5mbyBpbkRyYXdJbmZvOwotCVJlY3Qgb3V0Qm91bmRzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFJlY3QgaW5Cb3VuZHM7CisgICAgVUludDE2IGluS2luZDsKKyAgICBUaGVtZUJ1dHRvbkRyYXdJbmZvIGluRHJhd0luZm87CisgICAgUmVjdCBvdXRCb3VuZHM7CiAjaWZuZGVmIEdldFRoZW1lQnV0dG9uQmFja2dyb3VuZEJvdW5kcwotCVB5TWFjX1BSRUNIRUNLKEdldFRoZW1lQnV0dG9uQmFja2dyb3VuZEJvdW5kcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VGhlbWVCdXR0b25CYWNrZ3JvdW5kQm91bmRzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mSE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmluQm91bmRzLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5LaW5kLAotCSAgICAgICAgICAgICAgICAgICAgICBUaGVtZUJ1dHRvbkRyYXdJbmZvX0NvbnZlcnQsICZpbkRyYXdJbmZvKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldFRoZW1lQnV0dG9uQmFja2dyb3VuZEJvdW5kcygmaW5Cb3VuZHMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbktpbmQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5EcmF3SW5mbywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRCb3VuZHMpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZvdXRCb3VuZHMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mSE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmluQm91bmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5LaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUaGVtZUJ1dHRvbkRyYXdJbmZvX0NvbnZlcnQsICZpbkRyYXdJbmZvKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldFRoZW1lQnV0dG9uQmFja2dyb3VuZEJvdW5kcygmaW5Cb3VuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbktpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5EcmF3SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRCb3VuZHMpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZvdXRCb3VuZHMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFwcF9QbGF5VGhlbWVTb3VuZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlUaGVtZVNvdW5kS2luZCBraW5kOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFRoZW1lU291bmRLaW5kIGtpbmQ7CiAjaWZuZGVmIFBsYXlUaGVtZVNvdW5kCi0JUHlNYWNfUFJFQ0hFQ0soUGxheVRoZW1lU291bmQpOworICAgIFB5TWFjX1BSRUNIRUNLKFBsYXlUaGVtZVNvdW5kKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAma2luZCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBQbGF5VGhlbWVTb3VuZChraW5kKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmtpbmQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUGxheVRoZW1lU291bmQoa2luZCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX0JlZ2luVGhlbWVEcmFnU291bmQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVGhlbWVEcmFnU291bmRLaW5kIGtpbmQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVGhlbWVEcmFnU291bmRLaW5kIGtpbmQ7CiAjaWZuZGVmIEJlZ2luVGhlbWVEcmFnU291bmQKLQlQeU1hY19QUkVDSEVDSyhCZWdpblRoZW1lRHJhZ1NvdW5kKTsKKyAgICBQeU1hY19QUkVDSEVDSyhCZWdpblRoZW1lRHJhZ1NvdW5kKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAma2luZCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBCZWdpblRoZW1lRHJhZ1NvdW5kKGtpbmQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAma2luZCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBCZWdpblRoZW1lRHJhZ1NvdW5kKGtpbmQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFwcF9FbmRUaGVtZURyYWdTb3VuZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKICNpZm5kZWYgRW5kVGhlbWVEcmFnU291bmQKLQlQeU1hY19QUkVDSEVDSyhFbmRUaGVtZURyYWdTb3VuZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRW5kVGhlbWVEcmFnU291bmQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBFbmRUaGVtZURyYWdTb3VuZCgpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRW5kVGhlbWVEcmFnU291bmQoKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfRHJhd1RoZW1lVGlja01hcmsoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JUmVjdCBib3VuZHM7Ci0JVGhlbWVEcmF3U3RhdGUgc3RhdGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgUmVjdCBib3VuZHM7CisgICAgVGhlbWVEcmF3U3RhdGUgc3RhdGU7CiAjaWZuZGVmIERyYXdUaGVtZVRpY2tNYXJrCi0JUHlNYWNfUFJFQ0hFQ0soRHJhd1RoZW1lVGlja01hcmspOworICAgIFB5TWFjX1BSRUNIRUNLKERyYXdUaGVtZVRpY2tNYXJrKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHMsCi0JICAgICAgICAgICAgICAgICAgICAgICZzdGF0ZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBEcmF3VGhlbWVUaWNrTWFyaygmYm91bmRzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXRlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IERyYXdUaGVtZVRpY2tNYXJrKCZib3VuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfRHJhd1RoZW1lQ2hhc2luZ0Fycm93cyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlSZWN0IGJvdW5kczsKLQlVSW50MzIgaW5kZXg7Ci0JVGhlbWVEcmF3U3RhdGUgc3RhdGU7Ci0JVUludDMyIGVyYXNlRGF0YTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBSZWN0IGJvdW5kczsKKyAgICBVSW50MzIgaW5kZXg7CisgICAgVGhlbWVEcmF3U3RhdGUgc3RhdGU7CisgICAgVUludDMyIGVyYXNlRGF0YTsKICNpZm5kZWYgRHJhd1RoZW1lQ2hhc2luZ0Fycm93cwotCVB5TWFjX1BSRUNIRUNLKERyYXdUaGVtZUNoYXNpbmdBcnJvd3MpOworICAgIFB5TWFjX1BSRUNIRUNLKERyYXdUaGVtZUNoYXNpbmdBcnJvd3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgICZzdGF0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmVyYXNlRGF0YSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBEcmF3VGhlbWVDaGFzaW5nQXJyb3dzKCZib3VuZHMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcmFzZURhdGEpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZlcmFzZURhdGEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRHJhd1RoZW1lQ2hhc2luZ0Fycm93cygmYm91bmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJhc2VEYXRhKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfRHJhd1RoZW1lUG9wdXBBcnJvdyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlSZWN0IGJvdW5kczsKLQlUaGVtZUFycm93T3JpZW50YXRpb24gb3JpZW50YXRpb247Ci0JVGhlbWVQb3B1cEFycm93U2l6ZSBzaXplOwotCVRoZW1lRHJhd1N0YXRlIHN0YXRlOwotCVVJbnQzMiBlcmFzZURhdGE7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgUmVjdCBib3VuZHM7CisgICAgVGhlbWVBcnJvd09yaWVudGF0aW9uIG9yaWVudGF0aW9uOworICAgIFRoZW1lUG9wdXBBcnJvd1NpemUgc2l6ZTsKKyAgICBUaGVtZURyYXdTdGF0ZSBzdGF0ZTsKKyAgICBVSW50MzIgZXJhc2VEYXRhOwogI2lmbmRlZiBEcmF3VGhlbWVQb3B1cEFycm93Ci0JUHlNYWNfUFJFQ0hFQ0soRHJhd1RoZW1lUG9wdXBBcnJvdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRHJhd1RoZW1lUG9wdXBBcnJvdyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJkhIbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzLAotCSAgICAgICAgICAgICAgICAgICAgICAmb3JpZW50YXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICZzaXplLAotCSAgICAgICAgICAgICAgICAgICAgICAmc3RhdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZlcmFzZURhdGEpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRHJhd1RoZW1lUG9wdXBBcnJvdygmYm91bmRzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWVudGF0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBlcmFzZURhdGEpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mSEhsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZvcmllbnRhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmVyYXNlRGF0YSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBEcmF3VGhlbWVQb3B1cEFycm93KCZib3VuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZW50YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyYXNlRGF0YSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX0RyYXdUaGVtZVN0YW5kYWxvbmVHcm93Qm94KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVBvaW50IG9yaWdpbjsKLQlUaGVtZUdyb3dEaXJlY3Rpb24gZ3Jvd0RpcmVjdGlvbjsKLQlCb29sZWFuIGlzU21hbGw7Ci0JVGhlbWVEcmF3U3RhdGUgc3RhdGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgUG9pbnQgb3JpZ2luOworICAgIFRoZW1lR3Jvd0RpcmVjdGlvbiBncm93RGlyZWN0aW9uOworICAgIEJvb2xlYW4gaXNTbWFsbDsKKyAgICBUaGVtZURyYXdTdGF0ZSBzdGF0ZTsKICNpZm5kZWYgRHJhd1RoZW1lU3RhbmRhbG9uZUdyb3dCb3gKLQlQeU1hY19QUkVDSEVDSyhEcmF3VGhlbWVTdGFuZGFsb25lR3Jvd0JveCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRHJhd1RoZW1lU3RhbmRhbG9uZUdyb3dCb3gpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZIYmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJm9yaWdpbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmdyb3dEaXJlY3Rpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICZpc1NtYWxsLAotCSAgICAgICAgICAgICAgICAgICAgICAmc3RhdGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRHJhd1RoZW1lU3RhbmRhbG9uZUdyb3dCb3gob3JpZ2luLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm93RGlyZWN0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1NtYWxsLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZIYmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJm9yaWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmdyb3dEaXJlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpc1NtYWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRHJhd1RoZW1lU3RhbmRhbG9uZUdyb3dCb3gob3JpZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm93RGlyZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1NtYWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX0RyYXdUaGVtZVN0YW5kYWxvbmVOb0dyb3dCb3goUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JUG9pbnQgb3JpZ2luOwotCVRoZW1lR3Jvd0RpcmVjdGlvbiBncm93RGlyZWN0aW9uOwotCUJvb2xlYW4gaXNTbWFsbDsKLQlUaGVtZURyYXdTdGF0ZSBzdGF0ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBQb2ludCBvcmlnaW47CisgICAgVGhlbWVHcm93RGlyZWN0aW9uIGdyb3dEaXJlY3Rpb247CisgICAgQm9vbGVhbiBpc1NtYWxsOworICAgIFRoZW1lRHJhd1N0YXRlIHN0YXRlOwogI2lmbmRlZiBEcmF3VGhlbWVTdGFuZGFsb25lTm9Hcm93Qm94Ci0JUHlNYWNfUFJFQ0hFQ0soRHJhd1RoZW1lU3RhbmRhbG9uZU5vR3Jvd0JveCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRHJhd1RoZW1lU3RhbmRhbG9uZU5vR3Jvd0JveCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJkhibCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmb3JpZ2luLAotCSAgICAgICAgICAgICAgICAgICAgICAmZ3Jvd0RpcmVjdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlzU21hbGwsCi0JICAgICAgICAgICAgICAgICAgICAgICZzdGF0ZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBEcmF3VGhlbWVTdGFuZGFsb25lTm9Hcm93Qm94KG9yaWdpbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm93RGlyZWN0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU21hbGwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mSGJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZvcmlnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZncm93RGlyZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXNTbWFsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXRlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IERyYXdUaGVtZVN0YW5kYWxvbmVOb0dyb3dCb3gob3JpZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3dEaXJlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTbWFsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX0dldFRoZW1lU3RhbmRhbG9uZUdyb3dCb3hCb3VuZHMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JUG9pbnQgb3JpZ2luOwotCVRoZW1lR3Jvd0RpcmVjdGlvbiBncm93RGlyZWN0aW9uOwotCUJvb2xlYW4gaXNTbWFsbDsKLQlSZWN0IGJvdW5kczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBQb2ludCBvcmlnaW47CisgICAgVGhlbWVHcm93RGlyZWN0aW9uIGdyb3dEaXJlY3Rpb247CisgICAgQm9vbGVhbiBpc1NtYWxsOworICAgIFJlY3QgYm91bmRzOwogI2lmbmRlZiBHZXRUaGVtZVN0YW5kYWxvbmVHcm93Qm94Qm91bmRzCi0JUHlNYWNfUFJFQ0hFQ0soR2V0VGhlbWVTdGFuZGFsb25lR3Jvd0JveEJvdW5kcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VGhlbWVTdGFuZGFsb25lR3Jvd0JveEJvdW5kcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJkhiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZvcmlnaW4sCi0JICAgICAgICAgICAgICAgICAgICAgICZncm93RGlyZWN0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXNTbWFsbCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRUaGVtZVN0YW5kYWxvbmVHcm93Qm94Qm91bmRzKG9yaWdpbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm93RGlyZWN0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU21hbGwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kcyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmJvdW5kcyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZIYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmb3JpZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZ3Jvd0RpcmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlzU21hbGwpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0VGhlbWVTdGFuZGFsb25lR3Jvd0JveEJvdW5kcyhvcmlnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3Jvd0RpcmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1NtYWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHMpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZib3VuZHMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFwcF9Ob3JtYWxpemVUaGVtZURyYXdpbmdTdGF0ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKICNpZm5kZWYgTm9ybWFsaXplVGhlbWVEcmF3aW5nU3RhdGUKLQlQeU1hY19QUkVDSEVDSyhOb3JtYWxpemVUaGVtZURyYXdpbmdTdGF0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTm9ybWFsaXplVGhlbWVEcmF3aW5nU3RhdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBOb3JtYWxpemVUaGVtZURyYXdpbmdTdGF0ZSgpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gTm9ybWFsaXplVGhlbWVEcmF3aW5nU3RhdGUoKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfR2V0VGhlbWVEcmF3aW5nU3RhdGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVGhlbWVEcmF3aW5nU3RhdGUgb3V0U3RhdGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVGhlbWVEcmF3aW5nU3RhdGUgb3V0U3RhdGU7CiAjaWZuZGVmIEdldFRoZW1lRHJhd2luZ1N0YXRlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0VGhlbWVEcmF3aW5nU3RhdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFRoZW1lRHJhd2luZ1N0YXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0VGhlbWVEcmF3aW5nU3RhdGUoJm91dFN0YXRlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgVGhlbWVEcmF3aW5nU3RhdGVPYmpfTmV3LCBvdXRTdGF0ZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRUaGVtZURyYXdpbmdTdGF0ZSgmb3V0U3RhdGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUaGVtZURyYXdpbmdTdGF0ZU9ial9OZXcsIG91dFN0YXRlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfQXBwbHlUaGVtZUJhY2tncm91bmQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVGhlbWVCYWNrZ3JvdW5kS2luZCBpbktpbmQ7Ci0JUmVjdCBib3VuZHM7Ci0JVGhlbWVEcmF3U3RhdGUgaW5TdGF0ZTsKLQlTSW50MTYgaW5EZXB0aDsKLQlCb29sZWFuIGluQ29sb3JEZXY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVGhlbWVCYWNrZ3JvdW5kS2luZCBpbktpbmQ7CisgICAgUmVjdCBib3VuZHM7CisgICAgVGhlbWVEcmF3U3RhdGUgaW5TdGF0ZTsKKyAgICBTSW50MTYgaW5EZXB0aDsKKyAgICBCb29sZWFuIGluQ29sb3JEZXY7CiAjaWZuZGVmIEFwcGx5VGhlbWVCYWNrZ3JvdW5kCi0JUHlNYWNfUFJFQ0hFQ0soQXBwbHlUaGVtZUJhY2tncm91bmQpOworICAgIFB5TWFjX1BSRUNIRUNLKEFwcGx5VGhlbWVCYWNrZ3JvdW5kKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJmxoYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbktpbmQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHMsCi0JICAgICAgICAgICAgICAgICAgICAgICZpblN0YXRlLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5EZXB0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluQ29sb3JEZXYpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQXBwbHlUaGVtZUJhY2tncm91bmQoaW5LaW5kLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblN0YXRlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkRlcHRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkNvbG9yRGV2KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyZsaGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5LaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5TdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluRGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkNvbG9yRGV2KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFwcGx5VGhlbWVCYWNrZ3JvdW5kKGluS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5TdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5EZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Db2xvckRldik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX1NldFRoZW1lVGV4dENvbG9yRm9yV2luZG93KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVdpbmRvd1B0ciB3aW5kb3c7Ci0JQm9vbGVhbiBpc0FjdGl2ZTsKLQlTSW50MTYgZGVwdGg7Ci0JQm9vbGVhbiBpc0NvbG9yRGV2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd1B0ciB3aW5kb3c7CisgICAgQm9vbGVhbiBpc0FjdGl2ZTsKKyAgICBTSW50MTYgZGVwdGg7CisgICAgQm9vbGVhbiBpc0NvbG9yRGV2OwogI2lmbmRlZiBTZXRUaGVtZVRleHRDb2xvckZvcldpbmRvdwotCVB5TWFjX1BSRUNIRUNLKFNldFRoZW1lVGV4dENvbG9yRm9yV2luZG93KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRUaGVtZVRleHRDb2xvckZvcldpbmRvdyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmJoYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICAmaXNBY3RpdmUsCi0JICAgICAgICAgICAgICAgICAgICAgICZkZXB0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlzQ29sb3JEZXYpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0VGhlbWVUZXh0Q29sb3JGb3JXaW5kb3cod2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0FjdGl2ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQ29sb3JEZXYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYmhiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpc0FjdGl2ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXNDb2xvckRldikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRUaGVtZVRleHRDb2xvckZvcldpbmRvdyh3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQWN0aXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNDb2xvckRldik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX0lzVmFsaWRBcHBlYXJhbmNlRmlsZVR5cGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCU9TVHlwZSBmaWxlVHlwZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgT1NUeXBlIGZpbGVUeXBlOwogI2lmbmRlZiBJc1ZhbGlkQXBwZWFyYW5jZUZpbGVUeXBlCi0JUHlNYWNfUFJFQ0hFQ0soSXNWYWxpZEFwcGVhcmFuY2VGaWxlVHlwZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSXNWYWxpZEFwcGVhcmFuY2VGaWxlVHlwZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmZpbGVUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gSXNWYWxpZEFwcGVhcmFuY2VGaWxlVHlwZShmaWxlVHlwZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZmaWxlVHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IElzVmFsaWRBcHBlYXJhbmNlRmlsZVR5cGUoZmlsZVR5cGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFwcF9HZXRUaGVtZUJydXNoQXNDb2xvcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlUaGVtZUJydXNoIGluQnJ1c2g7Ci0JU0ludDE2IGluRGVwdGg7Ci0JQm9vbGVhbiBpbkNvbG9yRGV2OwotCVJHQkNvbG9yIG91dENvbG9yOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFRoZW1lQnJ1c2ggaW5CcnVzaDsKKyAgICBTSW50MTYgaW5EZXB0aDsKKyAgICBCb29sZWFuIGluQ29sb3JEZXY7CisgICAgUkdCQ29sb3Igb3V0Q29sb3I7CiAjaWZuZGVmIEdldFRoZW1lQnJ1c2hBc0NvbG9yCi0JUHlNYWNfUFJFQ0hFQ0soR2V0VGhlbWVCcnVzaEFzQ29sb3IpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFRoZW1lQnJ1c2hBc0NvbG9yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkJydXNoLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5EZXB0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluQ29sb3JEZXYpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0VGhlbWVCcnVzaEFzQ29sb3IoaW5CcnVzaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5EZXB0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Db2xvckRldiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbG9yKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUWRSR0JfTmV3LCAmb3V0Q29sb3IpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkJydXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5EZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQ29sb3JEZXYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0VGhlbWVCcnVzaEFzQ29sb3IoaW5CcnVzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5EZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Db2xvckRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbG9yKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUWRSR0JfTmV3LCAmb3V0Q29sb3IpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFwcF9HZXRUaGVtZVRleHRDb2xvcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlUaGVtZVRleHRDb2xvciBpbkNvbG9yOwotCVNJbnQxNiBpbkRlcHRoOwotCUJvb2xlYW4gaW5Db2xvckRldjsKLQlSR0JDb2xvciBvdXRDb2xvcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBUaGVtZVRleHRDb2xvciBpbkNvbG9yOworICAgIFNJbnQxNiBpbkRlcHRoOworICAgIEJvb2xlYW4gaW5Db2xvckRldjsKKyAgICBSR0JDb2xvciBvdXRDb2xvcjsKICNpZm5kZWYgR2V0VGhlbWVUZXh0Q29sb3IKLQlQeU1hY19QUkVDSEVDSyhHZXRUaGVtZVRleHRDb2xvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VGhlbWVUZXh0Q29sb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGhiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluQ29sb3IsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkRlcHRoLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5Db2xvckRldikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRUaGVtZVRleHRDb2xvcihpbkNvbG9yLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBpbkRlcHRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBpbkNvbG9yRGV2LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29sb3IpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZvdXRDb2xvcik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGhiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQ29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkRlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Db2xvckRldikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRUaGVtZVRleHRDb2xvcihpbkNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkRlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkNvbG9yRGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29sb3IpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZvdXRDb2xvcik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX0dldFRoZW1lTWV0cmljKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVRoZW1lTWV0cmljIGluTWV0cmljOwotCVNJbnQzMiBvdXRNZXRyaWM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVGhlbWVNZXRyaWMgaW5NZXRyaWM7CisgICAgU0ludDMyIG91dE1ldHJpYzsKICNpZm5kZWYgR2V0VGhlbWVNZXRyaWMKLQlQeU1hY19QUkVDSEVDSyhHZXRUaGVtZU1ldHJpYyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VGhlbWVNZXRyaWMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbk1ldHJpYykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRUaGVtZU1ldHJpYyhpbk1ldHJpYywKLQkgICAgICAgICAgICAgICAgICAgICAgJm91dE1ldHJpYyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0TWV0cmljKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluTWV0cmljKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldFRoZW1lTWV0cmljKGluTWV0cmljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0TWV0cmljKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRNZXRyaWMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgQXBwX21ldGhvZHNbXSA9IHsKLQl7IlJlZ2lzdGVyQXBwZWFyYW5jZUNsaWVudCIsIChQeUNGdW5jdGlvbilBcHBfUmVnaXN0ZXJBcHBlYXJhbmNlQ2xpZW50LCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJVbnJlZ2lzdGVyQXBwZWFyYW5jZUNsaWVudCIsIChQeUNGdW5jdGlvbilBcHBfVW5yZWdpc3RlckFwcGVhcmFuY2VDbGllbnQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IlNldFRoZW1lUGVuIiwgKFB5Q0Z1bmN0aW9uKUFwcF9TZXRUaGVtZVBlbiwgMSwKLQkgUHlEb2NfU1RSKCIoVGhlbWVCcnVzaCBpbkJydXNoLCBTSW50MTYgaW5EZXB0aCwgQm9vbGVhbiBpbklzQ29sb3JEZXZpY2UpIC0+IE5vbmUiKX0sCi0JeyJTZXRUaGVtZUJhY2tncm91bmQiLCAoUHlDRnVuY3Rpb24pQXBwX1NldFRoZW1lQmFja2dyb3VuZCwgMSwKLQkgUHlEb2NfU1RSKCIoVGhlbWVCcnVzaCBpbkJydXNoLCBTSW50MTYgaW5EZXB0aCwgQm9vbGVhbiBpbklzQ29sb3JEZXZpY2UpIC0+IE5vbmUiKX0sCi0JeyJTZXRUaGVtZVRleHRDb2xvciIsIChQeUNGdW5jdGlvbilBcHBfU2V0VGhlbWVUZXh0Q29sb3IsIDEsCi0JIFB5RG9jX1NUUigiKFRoZW1lVGV4dENvbG9yIGluQ29sb3IsIFNJbnQxNiBpbkRlcHRoLCBCb29sZWFuIGluSXNDb2xvckRldmljZSkgLT4gTm9uZSIpfSwKLQl7IlNldFRoZW1lV2luZG93QmFja2dyb3VuZCIsIChQeUNGdW5jdGlvbilBcHBfU2V0VGhlbWVXaW5kb3dCYWNrZ3JvdW5kLCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQdHIgaW5XaW5kb3csIFRoZW1lQnJ1c2ggaW5CcnVzaCwgQm9vbGVhbiBpblVwZGF0ZSkgLT4gTm9uZSIpfSwKLQl7IkRyYXdUaGVtZVdpbmRvd0hlYWRlciIsIChQeUNGdW5jdGlvbilBcHBfRHJhd1RoZW1lV2luZG93SGVhZGVyLCAxLAotCSBQeURvY19TVFIoIihSZWN0IGluUmVjdCwgVGhlbWVEcmF3U3RhdGUgaW5TdGF0ZSkgLT4gTm9uZSIpfSwKLQl7IkRyYXdUaGVtZVdpbmRvd0xpc3RWaWV3SGVhZGVyIiwgKFB5Q0Z1bmN0aW9uKUFwcF9EcmF3VGhlbWVXaW5kb3dMaXN0Vmlld0hlYWRlciwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCBpblJlY3QsIFRoZW1lRHJhd1N0YXRlIGluU3RhdGUpIC0+IE5vbmUiKX0sCi0JeyJEcmF3VGhlbWVQbGFjYXJkIiwgKFB5Q0Z1bmN0aW9uKUFwcF9EcmF3VGhlbWVQbGFjYXJkLCAxLAotCSBQeURvY19TVFIoIihSZWN0IGluUmVjdCwgVGhlbWVEcmF3U3RhdGUgaW5TdGF0ZSkgLT4gTm9uZSIpfSwKLQl7IkRyYXdUaGVtZUVkaXRUZXh0RnJhbWUiLCAoUHlDRnVuY3Rpb24pQXBwX0RyYXdUaGVtZUVkaXRUZXh0RnJhbWUsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgaW5SZWN0LCBUaGVtZURyYXdTdGF0ZSBpblN0YXRlKSAtPiBOb25lIil9LAotCXsiRHJhd1RoZW1lTGlzdEJveEZyYW1lIiwgKFB5Q0Z1bmN0aW9uKUFwcF9EcmF3VGhlbWVMaXN0Qm94RnJhbWUsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgaW5SZWN0LCBUaGVtZURyYXdTdGF0ZSBpblN0YXRlKSAtPiBOb25lIil9LAotCXsiRHJhd1RoZW1lRm9jdXNSZWN0IiwgKFB5Q0Z1bmN0aW9uKUFwcF9EcmF3VGhlbWVGb2N1c1JlY3QsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgaW5SZWN0LCBCb29sZWFuIGluSGFzRm9jdXMpIC0+IE5vbmUiKX0sCi0JeyJEcmF3VGhlbWVQcmltYXJ5R3JvdXAiLCAoUHlDRnVuY3Rpb24pQXBwX0RyYXdUaGVtZVByaW1hcnlHcm91cCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCBpblJlY3QsIFRoZW1lRHJhd1N0YXRlIGluU3RhdGUpIC0+IE5vbmUiKX0sCi0JeyJEcmF3VGhlbWVTZWNvbmRhcnlHcm91cCIsIChQeUNGdW5jdGlvbilBcHBfRHJhd1RoZW1lU2Vjb25kYXJ5R3JvdXAsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgaW5SZWN0LCBUaGVtZURyYXdTdGF0ZSBpblN0YXRlKSAtPiBOb25lIil9LAotCXsiRHJhd1RoZW1lU2VwYXJhdG9yIiwgKFB5Q0Z1bmN0aW9uKUFwcF9EcmF3VGhlbWVTZXBhcmF0b3IsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgaW5SZWN0LCBUaGVtZURyYXdTdGF0ZSBpblN0YXRlKSAtPiBOb25lIil9LAotCXsiRHJhd1RoZW1lTW9kZWxlc3NEaWFsb2dGcmFtZSIsIChQeUNGdW5jdGlvbilBcHBfRHJhd1RoZW1lTW9kZWxlc3NEaWFsb2dGcmFtZSwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCBpblJlY3QsIFRoZW1lRHJhd1N0YXRlIGluU3RhdGUpIC0+IE5vbmUiKX0sCi0JeyJEcmF3VGhlbWVHZW5lcmljV2VsbCIsIChQeUNGdW5jdGlvbilBcHBfRHJhd1RoZW1lR2VuZXJpY1dlbGwsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgaW5SZWN0LCBUaGVtZURyYXdTdGF0ZSBpblN0YXRlLCBCb29sZWFuIGluRmlsbENlbnRlcikgLT4gTm9uZSIpfSwKLQl7IkRyYXdUaGVtZUZvY3VzUmVnaW9uIiwgKFB5Q0Z1bmN0aW9uKUFwcF9EcmF3VGhlbWVGb2N1c1JlZ2lvbiwgMSwKLQkgUHlEb2NfU1RSKCIoQm9vbGVhbiBpbkhhc0ZvY3VzKSAtPiBOb25lIil9LAotCXsiSXNUaGVtZUluQ29sb3IiLCAoUHlDRnVuY3Rpb24pQXBwX0lzVGhlbWVJbkNvbG9yLCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgaW5EZXB0aCwgQm9vbGVhbiBpbklzQ29sb3JEZXZpY2UpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJHZXRUaGVtZUFjY2VudENvbG9ycyIsIChQeUNGdW5jdGlvbilBcHBfR2V0VGhlbWVBY2NlbnRDb2xvcnMsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENUYWJIYW5kbGUgb3V0Q29sb3JzKSIpfSwKLQl7IkRyYXdUaGVtZU1lbnVCYXJCYWNrZ3JvdW5kIiwgKFB5Q0Z1bmN0aW9uKUFwcF9EcmF3VGhlbWVNZW51QmFyQmFja2dyb3VuZCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCBpbkJvdW5kcywgVGhlbWVNZW51QmFyU3RhdGUgaW5TdGF0ZSwgVUludDMyIGluQXR0cmlidXRlcykgLT4gTm9uZSIpfSwKLQl7IkdldFRoZW1lTWVudUJhckhlaWdodCIsIChQeUNGdW5jdGlvbilBcHBfR2V0VGhlbWVNZW51QmFySGVpZ2h0LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChTSW50MTYgb3V0SGVpZ2h0KSIpfSwKLQl7IkRyYXdUaGVtZU1lbnVCYWNrZ3JvdW5kIiwgKFB5Q0Z1bmN0aW9uKUFwcF9EcmF3VGhlbWVNZW51QmFja2dyb3VuZCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCBpbk1lbnVSZWN0LCBUaGVtZU1lbnVUeXBlIGluTWVudVR5cGUpIC0+IE5vbmUiKX0sCi0JeyJHZXRUaGVtZU1lbnVCYWNrZ3JvdW5kUmVnaW9uIiwgKFB5Q0Z1bmN0aW9uKUFwcF9HZXRUaGVtZU1lbnVCYWNrZ3JvdW5kUmVnaW9uLCAxLAotCSBQeURvY19TVFIoIihSZWN0IGluTWVudVJlY3QsIFRoZW1lTWVudVR5cGUgbWVudVR5cGUpIC0+IE5vbmUiKX0sCi0JeyJEcmF3VGhlbWVNZW51U2VwYXJhdG9yIiwgKFB5Q0Z1bmN0aW9uKUFwcF9EcmF3VGhlbWVNZW51U2VwYXJhdG9yLCAxLAotCSBQeURvY19TVFIoIihSZWN0IGluSXRlbVJlY3QpIC0+IE5vbmUiKX0sCi0JeyJHZXRUaGVtZU1lbnVTZXBhcmF0b3JIZWlnaHQiLCAoUHlDRnVuY3Rpb24pQXBwX0dldFRoZW1lTWVudVNlcGFyYXRvckhlaWdodCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoU0ludDE2IG91dEhlaWdodCkiKX0sCi0JeyJHZXRUaGVtZU1lbnVJdGVtRXh0cmEiLCAoUHlDRnVuY3Rpb24pQXBwX0dldFRoZW1lTWVudUl0ZW1FeHRyYSwgMSwKLQkgUHlEb2NfU1RSKCIoVGhlbWVNZW51SXRlbVR5cGUgaW5JdGVtVHlwZSkgLT4gKFNJbnQxNiBvdXRIZWlnaHQsIFNJbnQxNiBvdXRXaWR0aCkiKX0sCi0JeyJHZXRUaGVtZU1lbnVUaXRsZUV4dHJhIiwgKFB5Q0Z1bmN0aW9uKUFwcF9HZXRUaGVtZU1lbnVUaXRsZUV4dHJhLCAxLAotCSBQeURvY19TVFIoIihCb29sZWFuIGluSXNTcXVpc2hlZCkgLT4gKFNJbnQxNiBvdXRXaWR0aCkiKX0sCi0JeyJEcmF3VGhlbWVUYWJQYW5lIiwgKFB5Q0Z1bmN0aW9uKUFwcF9EcmF3VGhlbWVUYWJQYW5lLCAxLAotCSBQeURvY19TVFIoIihSZWN0IGluUmVjdCwgVGhlbWVEcmF3U3RhdGUgaW5TdGF0ZSkgLT4gTm9uZSIpfSwKLQl7IkdldFRoZW1lVGFiUmVnaW9uIiwgKFB5Q0Z1bmN0aW9uKUFwcF9HZXRUaGVtZVRhYlJlZ2lvbiwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCBpblJlY3QsIFRoZW1lVGFiU3R5bGUgaW5TdHlsZSwgVGhlbWVUYWJEaXJlY3Rpb24gaW5EaXJlY3Rpb24pIC0+IE5vbmUiKX0sCi0JeyJTZXRUaGVtZUN1cnNvciIsIChQeUNGdW5jdGlvbilBcHBfU2V0VGhlbWVDdXJzb3IsIDEsCi0JIFB5RG9jX1NUUigiKFRoZW1lQ3Vyc29yIGluQ3Vyc29yKSAtPiBOb25lIil9LAotCXsiU2V0QW5pbWF0ZWRUaGVtZUN1cnNvciIsIChQeUNGdW5jdGlvbilBcHBfU2V0QW5pbWF0ZWRUaGVtZUN1cnNvciwgMSwKLQkgUHlEb2NfU1RSKCIoVGhlbWVDdXJzb3IgaW5DdXJzb3IsIFVJbnQzMiBpbkFuaW1hdGlvblN0ZXApIC0+IE5vbmUiKX0sCi0JeyJHZXRUaGVtZVNjcm9sbEJhclRodW1iU3R5bGUiLCAoUHlDRnVuY3Rpb24pQXBwX0dldFRoZW1lU2Nyb2xsQmFyVGh1bWJTdHlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVGhlbWVTY3JvbGxCYXJUaHVtYlN0eWxlIG91dFN0eWxlKSIpfSwKLQl7IkdldFRoZW1lU2Nyb2xsQmFyQXJyb3dTdHlsZSIsIChQeUNGdW5jdGlvbilBcHBfR2V0VGhlbWVTY3JvbGxCYXJBcnJvd1N0eWxlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChUaGVtZVNjcm9sbEJhckFycm93U3R5bGUgb3V0U3R5bGUpIil9LAotCXsiR2V0VGhlbWVDaGVja0JveFN0eWxlIiwgKFB5Q0Z1bmN0aW9uKUFwcF9HZXRUaGVtZUNoZWNrQm94U3R5bGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFRoZW1lQ2hlY2tCb3hTdHlsZSBvdXRTdHlsZSkiKX0sCi0JeyJVc2VUaGVtZUZvbnQiLCAoUHlDRnVuY3Rpb24pQXBwX1VzZVRoZW1lRm9udCwgMSwKLQkgUHlEb2NfU1RSKCIoVGhlbWVGb250SUQgaW5Gb250SUQsIFNjcmlwdENvZGUgaW5TY3JpcHQpIC0+IE5vbmUiKX0sCi0JeyJEcmF3VGhlbWVUZXh0Qm94IiwgKFB5Q0Z1bmN0aW9uKUFwcF9EcmF3VGhlbWVUZXh0Qm94LCAxLAotCSBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBpblN0cmluZywgVGhlbWVGb250SUQgaW5Gb250SUQsIFRoZW1lRHJhd1N0YXRlIGluU3RhdGUsIEJvb2xlYW4gaW5XcmFwVG9XaWR0aCwgUmVjdCBpbkJvdW5kaW5nQm94LCBTSW50MTYgaW5KdXN0KSAtPiBOb25lIil9LAotCXsiVHJ1bmNhdGVUaGVtZVRleHQiLCAoUHlDRnVuY3Rpb24pQXBwX1RydW5jYXRlVGhlbWVUZXh0LCAxLAotCSBQeURvY19TVFIoIihDRk11dGFibGVTdHJpbmdSZWYgaW5TdHJpbmcsIFRoZW1lRm9udElEIGluRm9udElELCBUaGVtZURyYXdTdGF0ZSBpblN0YXRlLCBTSW50MTYgaW5QaXhlbFdpZHRoTGltaXQsIFRydW5jQ29kZSBpblRydW5jV2hlcmUpIC0+IChCb29sZWFuIG91dFRydW5jYXRlZCkiKX0sCi0JeyJHZXRUaGVtZVRleHREaW1lbnNpb25zIiwgKFB5Q0Z1bmN0aW9uKUFwcF9HZXRUaGVtZVRleHREaW1lbnNpb25zLCAxLAotCSBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBpblN0cmluZywgVGhlbWVGb250SUQgaW5Gb250SUQsIFRoZW1lRHJhd1N0YXRlIGluU3RhdGUsIEJvb2xlYW4gaW5XcmFwVG9XaWR0aCwgUG9pbnQgaW9Cb3VuZHMpIC0+IChQb2ludCBpb0JvdW5kcywgU0ludDE2IG91dEJhc2VsaW5lKSIpfSwKLQl7IkdldFRoZW1lVGV4dFNoYWRvd091dHNldCIsIChQeUNGdW5jdGlvbilBcHBfR2V0VGhlbWVUZXh0U2hhZG93T3V0c2V0LCAxLAotCSBQeURvY19TVFIoIihUaGVtZUZvbnRJRCBpbkZvbnRJRCwgVGhlbWVEcmF3U3RhdGUgaW5TdGF0ZSkgLT4gKFJlY3Qgb3V0T3V0c2V0KSIpfSwKLQl7IkRyYXdUaGVtZVNjcm9sbEJhckFycm93cyIsIChQeUNGdW5jdGlvbilBcHBfRHJhd1RoZW1lU2Nyb2xsQmFyQXJyb3dzLCAxLAotCSBQeURvY19TVFIoIihSZWN0IGJvdW5kcywgVGhlbWVUcmFja0VuYWJsZVN0YXRlIGVuYWJsZVN0YXRlLCBUaGVtZVRyYWNrUHJlc3NTdGF0ZSBwcmVzc1N0YXRlLCBCb29sZWFuIGlzSG9yaXopIC0+IChSZWN0IHRyYWNrQm91bmRzKSIpfSwKLQl7IkdldFRoZW1lU2Nyb2xsQmFyVHJhY2tSZWN0IiwgKFB5Q0Z1bmN0aW9uKUFwcF9HZXRUaGVtZVNjcm9sbEJhclRyYWNrUmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCBib3VuZHMsIFRoZW1lVHJhY2tFbmFibGVTdGF0ZSBlbmFibGVTdGF0ZSwgVGhlbWVUcmFja1ByZXNzU3RhdGUgcHJlc3NTdGF0ZSwgQm9vbGVhbiBpc0hvcml6KSAtPiAoUmVjdCB0cmFja0JvdW5kcykiKX0sCi0JeyJIaXRUZXN0VGhlbWVTY3JvbGxCYXJBcnJvd3MiLCAoUHlDRnVuY3Rpb24pQXBwX0hpdFRlc3RUaGVtZVNjcm9sbEJhckFycm93cywgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCBzY3JvbGxCYXJCb3VuZHMsIFRoZW1lVHJhY2tFbmFibGVTdGF0ZSBlbmFibGVTdGF0ZSwgVGhlbWVUcmFja1ByZXNzU3RhdGUgcHJlc3NTdGF0ZSwgQm9vbGVhbiBpc0hvcml6LCBQb2ludCBwdEhpdCkgLT4gKEJvb2xlYW4gX3J2LCBSZWN0IHRyYWNrQm91bmRzLCBDb250cm9sUGFydENvZGUgcGFydGNvZGUpIil9LAotCXsiRHJhd1RoZW1lU2Nyb2xsQmFyRGVsaW1pdGVycyIsIChQeUNGdW5jdGlvbilBcHBfRHJhd1RoZW1lU2Nyb2xsQmFyRGVsaW1pdGVycywgMSwKLQkgUHlEb2NfU1RSKCIoVGhlbWVXaW5kb3dUeXBlIGZsYXZvciwgUmVjdCBpbkNvbnRSZWN0LCBUaGVtZURyYXdTdGF0ZSBzdGF0ZSwgVGhlbWVXaW5kb3dBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIC0+IE5vbmUiKX0sCi0JeyJEcmF3VGhlbWVCdXR0b24iLCAoUHlDRnVuY3Rpb24pQXBwX0RyYXdUaGVtZUJ1dHRvbiwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCBpbkJvdW5kcywgVUludDE2IGluS2luZCwgVGhlbWVCdXR0b25EcmF3SW5mbyBpbk5ld0luZm8sIFRoZW1lQnV0dG9uRHJhd0luZm8gaW5QcmV2SW5mbywgVUludDMyIGluVXNlckRhdGEpIC0+IE5vbmUiKX0sCi0JeyJHZXRUaGVtZUJ1dHRvblJlZ2lvbiIsIChQeUNGdW5jdGlvbilBcHBfR2V0VGhlbWVCdXR0b25SZWdpb24sIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgaW5Cb3VuZHMsIFVJbnQxNiBpbktpbmQsIFRoZW1lQnV0dG9uRHJhd0luZm8gaW5OZXdJbmZvKSAtPiBOb25lIil9LAotCXsiR2V0VGhlbWVCdXR0b25Db250ZW50Qm91bmRzIiwgKFB5Q0Z1bmN0aW9uKUFwcF9HZXRUaGVtZUJ1dHRvbkNvbnRlbnRCb3VuZHMsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgaW5Cb3VuZHMsIFVJbnQxNiBpbktpbmQsIFRoZW1lQnV0dG9uRHJhd0luZm8gaW5EcmF3SW5mbykgLT4gKFJlY3Qgb3V0Qm91bmRzKSIpfSwKLQl7IkdldFRoZW1lQnV0dG9uQmFja2dyb3VuZEJvdW5kcyIsIChQeUNGdW5jdGlvbilBcHBfR2V0VGhlbWVCdXR0b25CYWNrZ3JvdW5kQm91bmRzLCAxLAotCSBQeURvY19TVFIoIihSZWN0IGluQm91bmRzLCBVSW50MTYgaW5LaW5kLCBUaGVtZUJ1dHRvbkRyYXdJbmZvIGluRHJhd0luZm8pIC0+IChSZWN0IG91dEJvdW5kcykiKX0sCi0JeyJQbGF5VGhlbWVTb3VuZCIsIChQeUNGdW5jdGlvbilBcHBfUGxheVRoZW1lU291bmQsIDEsCi0JIFB5RG9jX1NUUigiKFRoZW1lU291bmRLaW5kIGtpbmQpIC0+IE5vbmUiKX0sCi0JeyJCZWdpblRoZW1lRHJhZ1NvdW5kIiwgKFB5Q0Z1bmN0aW9uKUFwcF9CZWdpblRoZW1lRHJhZ1NvdW5kLCAxLAotCSBQeURvY19TVFIoIihUaGVtZURyYWdTb3VuZEtpbmQga2luZCkgLT4gTm9uZSIpfSwKLQl7IkVuZFRoZW1lRHJhZ1NvdW5kIiwgKFB5Q0Z1bmN0aW9uKUFwcF9FbmRUaGVtZURyYWdTb3VuZCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiRHJhd1RoZW1lVGlja01hcmsiLCAoUHlDRnVuY3Rpb24pQXBwX0RyYXdUaGVtZVRpY2tNYXJrLCAxLAotCSBQeURvY19TVFIoIihSZWN0IGJvdW5kcywgVGhlbWVEcmF3U3RhdGUgc3RhdGUpIC0+IE5vbmUiKX0sCi0JeyJEcmF3VGhlbWVDaGFzaW5nQXJyb3dzIiwgKFB5Q0Z1bmN0aW9uKUFwcF9EcmF3VGhlbWVDaGFzaW5nQXJyb3dzLCAxLAotCSBQeURvY19TVFIoIihSZWN0IGJvdW5kcywgVUludDMyIGluZGV4LCBUaGVtZURyYXdTdGF0ZSBzdGF0ZSwgVUludDMyIGVyYXNlRGF0YSkgLT4gTm9uZSIpfSwKLQl7IkRyYXdUaGVtZVBvcHVwQXJyb3ciLCAoUHlDRnVuY3Rpb24pQXBwX0RyYXdUaGVtZVBvcHVwQXJyb3csIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgYm91bmRzLCBUaGVtZUFycm93T3JpZW50YXRpb24gb3JpZW50YXRpb24sIFRoZW1lUG9wdXBBcnJvd1NpemUgc2l6ZSwgVGhlbWVEcmF3U3RhdGUgc3RhdGUsIFVJbnQzMiBlcmFzZURhdGEpIC0+IE5vbmUiKX0sCi0JeyJEcmF3VGhlbWVTdGFuZGFsb25lR3Jvd0JveCIsIChQeUNGdW5jdGlvbilBcHBfRHJhd1RoZW1lU3RhbmRhbG9uZUdyb3dCb3gsIDEsCi0JIFB5RG9jX1NUUigiKFBvaW50IG9yaWdpbiwgVGhlbWVHcm93RGlyZWN0aW9uIGdyb3dEaXJlY3Rpb24sIEJvb2xlYW4gaXNTbWFsbCwgVGhlbWVEcmF3U3RhdGUgc3RhdGUpIC0+IE5vbmUiKX0sCi0JeyJEcmF3VGhlbWVTdGFuZGFsb25lTm9Hcm93Qm94IiwgKFB5Q0Z1bmN0aW9uKUFwcF9EcmF3VGhlbWVTdGFuZGFsb25lTm9Hcm93Qm94LCAxLAotCSBQeURvY19TVFIoIihQb2ludCBvcmlnaW4sIFRoZW1lR3Jvd0RpcmVjdGlvbiBncm93RGlyZWN0aW9uLCBCb29sZWFuIGlzU21hbGwsIFRoZW1lRHJhd1N0YXRlIHN0YXRlKSAtPiBOb25lIil9LAotCXsiR2V0VGhlbWVTdGFuZGFsb25lR3Jvd0JveEJvdW5kcyIsIChQeUNGdW5jdGlvbilBcHBfR2V0VGhlbWVTdGFuZGFsb25lR3Jvd0JveEJvdW5kcywgMSwKLQkgUHlEb2NfU1RSKCIoUG9pbnQgb3JpZ2luLCBUaGVtZUdyb3dEaXJlY3Rpb24gZ3Jvd0RpcmVjdGlvbiwgQm9vbGVhbiBpc1NtYWxsKSAtPiAoUmVjdCBib3VuZHMpIil9LAotCXsiTm9ybWFsaXplVGhlbWVEcmF3aW5nU3RhdGUiLCAoUHlDRnVuY3Rpb24pQXBwX05vcm1hbGl6ZVRoZW1lRHJhd2luZ1N0YXRlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJHZXRUaGVtZURyYXdpbmdTdGF0ZSIsIChQeUNGdW5jdGlvbilBcHBfR2V0VGhlbWVEcmF3aW5nU3RhdGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFRoZW1lRHJhd2luZ1N0YXRlIG91dFN0YXRlKSIpfSwKLQl7IkFwcGx5VGhlbWVCYWNrZ3JvdW5kIiwgKFB5Q0Z1bmN0aW9uKUFwcF9BcHBseVRoZW1lQmFja2dyb3VuZCwgMSwKLQkgUHlEb2NfU1RSKCIoVGhlbWVCYWNrZ3JvdW5kS2luZCBpbktpbmQsIFJlY3QgYm91bmRzLCBUaGVtZURyYXdTdGF0ZSBpblN0YXRlLCBTSW50MTYgaW5EZXB0aCwgQm9vbGVhbiBpbkNvbG9yRGV2KSAtPiBOb25lIil9LAotCXsiU2V0VGhlbWVUZXh0Q29sb3JGb3JXaW5kb3ciLCAoUHlDRnVuY3Rpb24pQXBwX1NldFRoZW1lVGV4dENvbG9yRm9yV2luZG93LCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQdHIgd2luZG93LCBCb29sZWFuIGlzQWN0aXZlLCBTSW50MTYgZGVwdGgsIEJvb2xlYW4gaXNDb2xvckRldikgLT4gTm9uZSIpfSwKLQl7IklzVmFsaWRBcHBlYXJhbmNlRmlsZVR5cGUiLCAoUHlDRnVuY3Rpb24pQXBwX0lzVmFsaWRBcHBlYXJhbmNlRmlsZVR5cGUsIDEsCi0JIFB5RG9jX1NUUigiKE9TVHlwZSBmaWxlVHlwZSkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IkdldFRoZW1lQnJ1c2hBc0NvbG9yIiwgKFB5Q0Z1bmN0aW9uKUFwcF9HZXRUaGVtZUJydXNoQXNDb2xvciwgMSwKLQkgUHlEb2NfU1RSKCIoVGhlbWVCcnVzaCBpbkJydXNoLCBTSW50MTYgaW5EZXB0aCwgQm9vbGVhbiBpbkNvbG9yRGV2KSAtPiAoUkdCQ29sb3Igb3V0Q29sb3IpIil9LAotCXsiR2V0VGhlbWVUZXh0Q29sb3IiLCAoUHlDRnVuY3Rpb24pQXBwX0dldFRoZW1lVGV4dENvbG9yLCAxLAotCSBQeURvY19TVFIoIihUaGVtZVRleHRDb2xvciBpbkNvbG9yLCBTSW50MTYgaW5EZXB0aCwgQm9vbGVhbiBpbkNvbG9yRGV2KSAtPiAoUkdCQ29sb3Igb3V0Q29sb3IpIil9LAotCXsiR2V0VGhlbWVNZXRyaWMiLCAoUHlDRnVuY3Rpb24pQXBwX0dldFRoZW1lTWV0cmljLCAxLAotCSBQeURvY19TVFIoIihUaGVtZU1ldHJpYyBpbk1ldHJpYykgLT4gKFNJbnQzMiBvdXRNZXRyaWMpIil9LAotCXtOVUxMLCBOVUxMLCAwfQorICAgIHsiUmVnaXN0ZXJBcHBlYXJhbmNlQ2xpZW50IiwgKFB5Q0Z1bmN0aW9uKUFwcF9SZWdpc3RlckFwcGVhcmFuY2VDbGllbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IlVucmVnaXN0ZXJBcHBlYXJhbmNlQ2xpZW50IiwgKFB5Q0Z1bmN0aW9uKUFwcF9VbnJlZ2lzdGVyQXBwZWFyYW5jZUNsaWVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiU2V0VGhlbWVQZW4iLCAoUHlDRnVuY3Rpb24pQXBwX1NldFRoZW1lUGVuLCAxLAorICAgICBQeURvY19TVFIoIihUaGVtZUJydXNoIGluQnJ1c2gsIFNJbnQxNiBpbkRlcHRoLCBCb29sZWFuIGluSXNDb2xvckRldmljZSkgLT4gTm9uZSIpfSwKKyAgICB7IlNldFRoZW1lQmFja2dyb3VuZCIsIChQeUNGdW5jdGlvbilBcHBfU2V0VGhlbWVCYWNrZ3JvdW5kLCAxLAorICAgICBQeURvY19TVFIoIihUaGVtZUJydXNoIGluQnJ1c2gsIFNJbnQxNiBpbkRlcHRoLCBCb29sZWFuIGluSXNDb2xvckRldmljZSkgLT4gTm9uZSIpfSwKKyAgICB7IlNldFRoZW1lVGV4dENvbG9yIiwgKFB5Q0Z1bmN0aW9uKUFwcF9TZXRUaGVtZVRleHRDb2xvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGhlbWVUZXh0Q29sb3IgaW5Db2xvciwgU0ludDE2IGluRGVwdGgsIEJvb2xlYW4gaW5Jc0NvbG9yRGV2aWNlKSAtPiBOb25lIil9LAorICAgIHsiU2V0VGhlbWVXaW5kb3dCYWNrZ3JvdW5kIiwgKFB5Q0Z1bmN0aW9uKUFwcF9TZXRUaGVtZVdpbmRvd0JhY2tncm91bmQsIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBpbldpbmRvdywgVGhlbWVCcnVzaCBpbkJydXNoLCBCb29sZWFuIGluVXBkYXRlKSAtPiBOb25lIil9LAorICAgIHsiRHJhd1RoZW1lV2luZG93SGVhZGVyIiwgKFB5Q0Z1bmN0aW9uKUFwcF9EcmF3VGhlbWVXaW5kb3dIZWFkZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgaW5SZWN0LCBUaGVtZURyYXdTdGF0ZSBpblN0YXRlKSAtPiBOb25lIil9LAorICAgIHsiRHJhd1RoZW1lV2luZG93TGlzdFZpZXdIZWFkZXIiLCAoUHlDRnVuY3Rpb24pQXBwX0RyYXdUaGVtZVdpbmRvd0xpc3RWaWV3SGVhZGVyLCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IGluUmVjdCwgVGhlbWVEcmF3U3RhdGUgaW5TdGF0ZSkgLT4gTm9uZSIpfSwKKyAgICB7IkRyYXdUaGVtZVBsYWNhcmQiLCAoUHlDRnVuY3Rpb24pQXBwX0RyYXdUaGVtZVBsYWNhcmQsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgaW5SZWN0LCBUaGVtZURyYXdTdGF0ZSBpblN0YXRlKSAtPiBOb25lIil9LAorICAgIHsiRHJhd1RoZW1lRWRpdFRleHRGcmFtZSIsIChQeUNGdW5jdGlvbilBcHBfRHJhd1RoZW1lRWRpdFRleHRGcmFtZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCBpblJlY3QsIFRoZW1lRHJhd1N0YXRlIGluU3RhdGUpIC0+IE5vbmUiKX0sCisgICAgeyJEcmF3VGhlbWVMaXN0Qm94RnJhbWUiLCAoUHlDRnVuY3Rpb24pQXBwX0RyYXdUaGVtZUxpc3RCb3hGcmFtZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCBpblJlY3QsIFRoZW1lRHJhd1N0YXRlIGluU3RhdGUpIC0+IE5vbmUiKX0sCisgICAgeyJEcmF3VGhlbWVGb2N1c1JlY3QiLCAoUHlDRnVuY3Rpb24pQXBwX0RyYXdUaGVtZUZvY3VzUmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCBpblJlY3QsIEJvb2xlYW4gaW5IYXNGb2N1cykgLT4gTm9uZSIpfSwKKyAgICB7IkRyYXdUaGVtZVByaW1hcnlHcm91cCIsIChQeUNGdW5jdGlvbilBcHBfRHJhd1RoZW1lUHJpbWFyeUdyb3VwLCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IGluUmVjdCwgVGhlbWVEcmF3U3RhdGUgaW5TdGF0ZSkgLT4gTm9uZSIpfSwKKyAgICB7IkRyYXdUaGVtZVNlY29uZGFyeUdyb3VwIiwgKFB5Q0Z1bmN0aW9uKUFwcF9EcmF3VGhlbWVTZWNvbmRhcnlHcm91cCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCBpblJlY3QsIFRoZW1lRHJhd1N0YXRlIGluU3RhdGUpIC0+IE5vbmUiKX0sCisgICAgeyJEcmF3VGhlbWVTZXBhcmF0b3IiLCAoUHlDRnVuY3Rpb24pQXBwX0RyYXdUaGVtZVNlcGFyYXRvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCBpblJlY3QsIFRoZW1lRHJhd1N0YXRlIGluU3RhdGUpIC0+IE5vbmUiKX0sCisgICAgeyJEcmF3VGhlbWVNb2RlbGVzc0RpYWxvZ0ZyYW1lIiwgKFB5Q0Z1bmN0aW9uKUFwcF9EcmF3VGhlbWVNb2RlbGVzc0RpYWxvZ0ZyYW1lLCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IGluUmVjdCwgVGhlbWVEcmF3U3RhdGUgaW5TdGF0ZSkgLT4gTm9uZSIpfSwKKyAgICB7IkRyYXdUaGVtZUdlbmVyaWNXZWxsIiwgKFB5Q0Z1bmN0aW9uKUFwcF9EcmF3VGhlbWVHZW5lcmljV2VsbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCBpblJlY3QsIFRoZW1lRHJhd1N0YXRlIGluU3RhdGUsIEJvb2xlYW4gaW5GaWxsQ2VudGVyKSAtPiBOb25lIil9LAorICAgIHsiRHJhd1RoZW1lRm9jdXNSZWdpb24iLCAoUHlDRnVuY3Rpb24pQXBwX0RyYXdUaGVtZUZvY3VzUmVnaW9uLCAxLAorICAgICBQeURvY19TVFIoIihCb29sZWFuIGluSGFzRm9jdXMpIC0+IE5vbmUiKX0sCisgICAgeyJJc1RoZW1lSW5Db2xvciIsIChQeUNGdW5jdGlvbilBcHBfSXNUaGVtZUluQ29sb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiBpbkRlcHRoLCBCb29sZWFuIGluSXNDb2xvckRldmljZSkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IkdldFRoZW1lQWNjZW50Q29sb3JzIiwgKFB5Q0Z1bmN0aW9uKUFwcF9HZXRUaGVtZUFjY2VudENvbG9ycywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ1RhYkhhbmRsZSBvdXRDb2xvcnMpIil9LAorICAgIHsiRHJhd1RoZW1lTWVudUJhckJhY2tncm91bmQiLCAoUHlDRnVuY3Rpb24pQXBwX0RyYXdUaGVtZU1lbnVCYXJCYWNrZ3JvdW5kLCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IGluQm91bmRzLCBUaGVtZU1lbnVCYXJTdGF0ZSBpblN0YXRlLCBVSW50MzIgaW5BdHRyaWJ1dGVzKSAtPiBOb25lIil9LAorICAgIHsiR2V0VGhlbWVNZW51QmFySGVpZ2h0IiwgKFB5Q0Z1bmN0aW9uKUFwcF9HZXRUaGVtZU1lbnVCYXJIZWlnaHQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFNJbnQxNiBvdXRIZWlnaHQpIil9LAorICAgIHsiRHJhd1RoZW1lTWVudUJhY2tncm91bmQiLCAoUHlDRnVuY3Rpb24pQXBwX0RyYXdUaGVtZU1lbnVCYWNrZ3JvdW5kLCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IGluTWVudVJlY3QsIFRoZW1lTWVudVR5cGUgaW5NZW51VHlwZSkgLT4gTm9uZSIpfSwKKyAgICB7IkdldFRoZW1lTWVudUJhY2tncm91bmRSZWdpb24iLCAoUHlDRnVuY3Rpb24pQXBwX0dldFRoZW1lTWVudUJhY2tncm91bmRSZWdpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgaW5NZW51UmVjdCwgVGhlbWVNZW51VHlwZSBtZW51VHlwZSkgLT4gTm9uZSIpfSwKKyAgICB7IkRyYXdUaGVtZU1lbnVTZXBhcmF0b3IiLCAoUHlDRnVuY3Rpb24pQXBwX0RyYXdUaGVtZU1lbnVTZXBhcmF0b3IsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgaW5JdGVtUmVjdCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldFRoZW1lTWVudVNlcGFyYXRvckhlaWdodCIsIChQeUNGdW5jdGlvbilBcHBfR2V0VGhlbWVNZW51U2VwYXJhdG9ySGVpZ2h0LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChTSW50MTYgb3V0SGVpZ2h0KSIpfSwKKyAgICB7IkdldFRoZW1lTWVudUl0ZW1FeHRyYSIsIChQeUNGdW5jdGlvbilBcHBfR2V0VGhlbWVNZW51SXRlbUV4dHJhLCAxLAorICAgICBQeURvY19TVFIoIihUaGVtZU1lbnVJdGVtVHlwZSBpbkl0ZW1UeXBlKSAtPiAoU0ludDE2IG91dEhlaWdodCwgU0ludDE2IG91dFdpZHRoKSIpfSwKKyAgICB7IkdldFRoZW1lTWVudVRpdGxlRXh0cmEiLCAoUHlDRnVuY3Rpb24pQXBwX0dldFRoZW1lTWVudVRpdGxlRXh0cmEsIDEsCisgICAgIFB5RG9jX1NUUigiKEJvb2xlYW4gaW5Jc1NxdWlzaGVkKSAtPiAoU0ludDE2IG91dFdpZHRoKSIpfSwKKyAgICB7IkRyYXdUaGVtZVRhYlBhbmUiLCAoUHlDRnVuY3Rpb24pQXBwX0RyYXdUaGVtZVRhYlBhbmUsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgaW5SZWN0LCBUaGVtZURyYXdTdGF0ZSBpblN0YXRlKSAtPiBOb25lIil9LAorICAgIHsiR2V0VGhlbWVUYWJSZWdpb24iLCAoUHlDRnVuY3Rpb24pQXBwX0dldFRoZW1lVGFiUmVnaW9uLCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IGluUmVjdCwgVGhlbWVUYWJTdHlsZSBpblN0eWxlLCBUaGVtZVRhYkRpcmVjdGlvbiBpbkRpcmVjdGlvbikgLT4gTm9uZSIpfSwKKyAgICB7IlNldFRoZW1lQ3Vyc29yIiwgKFB5Q0Z1bmN0aW9uKUFwcF9TZXRUaGVtZUN1cnNvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGhlbWVDdXJzb3IgaW5DdXJzb3IpIC0+IE5vbmUiKX0sCisgICAgeyJTZXRBbmltYXRlZFRoZW1lQ3Vyc29yIiwgKFB5Q0Z1bmN0aW9uKUFwcF9TZXRBbmltYXRlZFRoZW1lQ3Vyc29yLCAxLAorICAgICBQeURvY19TVFIoIihUaGVtZUN1cnNvciBpbkN1cnNvciwgVUludDMyIGluQW5pbWF0aW9uU3RlcCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldFRoZW1lU2Nyb2xsQmFyVGh1bWJTdHlsZSIsIChQeUNGdW5jdGlvbilBcHBfR2V0VGhlbWVTY3JvbGxCYXJUaHVtYlN0eWxlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChUaGVtZVNjcm9sbEJhclRodW1iU3R5bGUgb3V0U3R5bGUpIil9LAorICAgIHsiR2V0VGhlbWVTY3JvbGxCYXJBcnJvd1N0eWxlIiwgKFB5Q0Z1bmN0aW9uKUFwcF9HZXRUaGVtZVNjcm9sbEJhckFycm93U3R5bGUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFRoZW1lU2Nyb2xsQmFyQXJyb3dTdHlsZSBvdXRTdHlsZSkiKX0sCisgICAgeyJHZXRUaGVtZUNoZWNrQm94U3R5bGUiLCAoUHlDRnVuY3Rpb24pQXBwX0dldFRoZW1lQ2hlY2tCb3hTdHlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVGhlbWVDaGVja0JveFN0eWxlIG91dFN0eWxlKSIpfSwKKyAgICB7IlVzZVRoZW1lRm9udCIsIChQeUNGdW5jdGlvbilBcHBfVXNlVGhlbWVGb250LCAxLAorICAgICBQeURvY19TVFIoIihUaGVtZUZvbnRJRCBpbkZvbnRJRCwgU2NyaXB0Q29kZSBpblNjcmlwdCkgLT4gTm9uZSIpfSwKKyAgICB7IkRyYXdUaGVtZVRleHRCb3giLCAoUHlDRnVuY3Rpb24pQXBwX0RyYXdUaGVtZVRleHRCb3gsIDEsCisgICAgIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIGluU3RyaW5nLCBUaGVtZUZvbnRJRCBpbkZvbnRJRCwgVGhlbWVEcmF3U3RhdGUgaW5TdGF0ZSwgQm9vbGVhbiBpbldyYXBUb1dpZHRoLCBSZWN0IGluQm91bmRpbmdCb3gsIFNJbnQxNiBpbkp1c3QpIC0+IE5vbmUiKX0sCisgICAgeyJUcnVuY2F0ZVRoZW1lVGV4dCIsIChQeUNGdW5jdGlvbilBcHBfVHJ1bmNhdGVUaGVtZVRleHQsIDEsCisgICAgIFB5RG9jX1NUUigiKENGTXV0YWJsZVN0cmluZ1JlZiBpblN0cmluZywgVGhlbWVGb250SUQgaW5Gb250SUQsIFRoZW1lRHJhd1N0YXRlIGluU3RhdGUsIFNJbnQxNiBpblBpeGVsV2lkdGhMaW1pdCwgVHJ1bmNDb2RlIGluVHJ1bmNXaGVyZSkgLT4gKEJvb2xlYW4gb3V0VHJ1bmNhdGVkKSIpfSwKKyAgICB7IkdldFRoZW1lVGV4dERpbWVuc2lvbnMiLCAoUHlDRnVuY3Rpb24pQXBwX0dldFRoZW1lVGV4dERpbWVuc2lvbnMsIDEsCisgICAgIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIGluU3RyaW5nLCBUaGVtZUZvbnRJRCBpbkZvbnRJRCwgVGhlbWVEcmF3U3RhdGUgaW5TdGF0ZSwgQm9vbGVhbiBpbldyYXBUb1dpZHRoLCBQb2ludCBpb0JvdW5kcykgLT4gKFBvaW50IGlvQm91bmRzLCBTSW50MTYgb3V0QmFzZWxpbmUpIil9LAorICAgIHsiR2V0VGhlbWVUZXh0U2hhZG93T3V0c2V0IiwgKFB5Q0Z1bmN0aW9uKUFwcF9HZXRUaGVtZVRleHRTaGFkb3dPdXRzZXQsIDEsCisgICAgIFB5RG9jX1NUUigiKFRoZW1lRm9udElEIGluRm9udElELCBUaGVtZURyYXdTdGF0ZSBpblN0YXRlKSAtPiAoUmVjdCBvdXRPdXRzZXQpIil9LAorICAgIHsiRHJhd1RoZW1lU2Nyb2xsQmFyQXJyb3dzIiwgKFB5Q0Z1bmN0aW9uKUFwcF9EcmF3VGhlbWVTY3JvbGxCYXJBcnJvd3MsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgYm91bmRzLCBUaGVtZVRyYWNrRW5hYmxlU3RhdGUgZW5hYmxlU3RhdGUsIFRoZW1lVHJhY2tQcmVzc1N0YXRlIHByZXNzU3RhdGUsIEJvb2xlYW4gaXNIb3JpeikgLT4gKFJlY3QgdHJhY2tCb3VuZHMpIil9LAorICAgIHsiR2V0VGhlbWVTY3JvbGxCYXJUcmFja1JlY3QiLCAoUHlDRnVuY3Rpb24pQXBwX0dldFRoZW1lU2Nyb2xsQmFyVHJhY2tSZWN0LCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IGJvdW5kcywgVGhlbWVUcmFja0VuYWJsZVN0YXRlIGVuYWJsZVN0YXRlLCBUaGVtZVRyYWNrUHJlc3NTdGF0ZSBwcmVzc1N0YXRlLCBCb29sZWFuIGlzSG9yaXopIC0+IChSZWN0IHRyYWNrQm91bmRzKSIpfSwKKyAgICB7IkhpdFRlc3RUaGVtZVNjcm9sbEJhckFycm93cyIsIChQeUNGdW5jdGlvbilBcHBfSGl0VGVzdFRoZW1lU2Nyb2xsQmFyQXJyb3dzLCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IHNjcm9sbEJhckJvdW5kcywgVGhlbWVUcmFja0VuYWJsZVN0YXRlIGVuYWJsZVN0YXRlLCBUaGVtZVRyYWNrUHJlc3NTdGF0ZSBwcmVzc1N0YXRlLCBCb29sZWFuIGlzSG9yaXosIFBvaW50IHB0SGl0KSAtPiAoQm9vbGVhbiBfcnYsIFJlY3QgdHJhY2tCb3VuZHMsIENvbnRyb2xQYXJ0Q29kZSBwYXJ0Y29kZSkiKX0sCisgICAgeyJEcmF3VGhlbWVTY3JvbGxCYXJEZWxpbWl0ZXJzIiwgKFB5Q0Z1bmN0aW9uKUFwcF9EcmF3VGhlbWVTY3JvbGxCYXJEZWxpbWl0ZXJzLCAxLAorICAgICBQeURvY19TVFIoIihUaGVtZVdpbmRvd1R5cGUgZmxhdm9yLCBSZWN0IGluQ29udFJlY3QsIFRoZW1lRHJhd1N0YXRlIHN0YXRlLCBUaGVtZVdpbmRvd0F0dHJpYnV0ZXMgYXR0cmlidXRlcykgLT4gTm9uZSIpfSwKKyAgICB7IkRyYXdUaGVtZUJ1dHRvbiIsIChQeUNGdW5jdGlvbilBcHBfRHJhd1RoZW1lQnV0dG9uLCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IGluQm91bmRzLCBVSW50MTYgaW5LaW5kLCBUaGVtZUJ1dHRvbkRyYXdJbmZvIGluTmV3SW5mbywgVGhlbWVCdXR0b25EcmF3SW5mbyBpblByZXZJbmZvLCBVSW50MzIgaW5Vc2VyRGF0YSkgLT4gTm9uZSIpfSwKKyAgICB7IkdldFRoZW1lQnV0dG9uUmVnaW9uIiwgKFB5Q0Z1bmN0aW9uKUFwcF9HZXRUaGVtZUJ1dHRvblJlZ2lvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCBpbkJvdW5kcywgVUludDE2IGluS2luZCwgVGhlbWVCdXR0b25EcmF3SW5mbyBpbk5ld0luZm8pIC0+IE5vbmUiKX0sCisgICAgeyJHZXRUaGVtZUJ1dHRvbkNvbnRlbnRCb3VuZHMiLCAoUHlDRnVuY3Rpb24pQXBwX0dldFRoZW1lQnV0dG9uQ29udGVudEJvdW5kcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCBpbkJvdW5kcywgVUludDE2IGluS2luZCwgVGhlbWVCdXR0b25EcmF3SW5mbyBpbkRyYXdJbmZvKSAtPiAoUmVjdCBvdXRCb3VuZHMpIil9LAorICAgIHsiR2V0VGhlbWVCdXR0b25CYWNrZ3JvdW5kQm91bmRzIiwgKFB5Q0Z1bmN0aW9uKUFwcF9HZXRUaGVtZUJ1dHRvbkJhY2tncm91bmRCb3VuZHMsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgaW5Cb3VuZHMsIFVJbnQxNiBpbktpbmQsIFRoZW1lQnV0dG9uRHJhd0luZm8gaW5EcmF3SW5mbykgLT4gKFJlY3Qgb3V0Qm91bmRzKSIpfSwKKyAgICB7IlBsYXlUaGVtZVNvdW5kIiwgKFB5Q0Z1bmN0aW9uKUFwcF9QbGF5VGhlbWVTb3VuZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGhlbWVTb3VuZEtpbmQga2luZCkgLT4gTm9uZSIpfSwKKyAgICB7IkJlZ2luVGhlbWVEcmFnU291bmQiLCAoUHlDRnVuY3Rpb24pQXBwX0JlZ2luVGhlbWVEcmFnU291bmQsIDEsCisgICAgIFB5RG9jX1NUUigiKFRoZW1lRHJhZ1NvdW5kS2luZCBraW5kKSAtPiBOb25lIil9LAorICAgIHsiRW5kVGhlbWVEcmFnU291bmQiLCAoUHlDRnVuY3Rpb24pQXBwX0VuZFRoZW1lRHJhZ1NvdW5kLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJEcmF3VGhlbWVUaWNrTWFyayIsIChQeUNGdW5jdGlvbilBcHBfRHJhd1RoZW1lVGlja01hcmssIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgYm91bmRzLCBUaGVtZURyYXdTdGF0ZSBzdGF0ZSkgLT4gTm9uZSIpfSwKKyAgICB7IkRyYXdUaGVtZUNoYXNpbmdBcnJvd3MiLCAoUHlDRnVuY3Rpb24pQXBwX0RyYXdUaGVtZUNoYXNpbmdBcnJvd3MsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgYm91bmRzLCBVSW50MzIgaW5kZXgsIFRoZW1lRHJhd1N0YXRlIHN0YXRlLCBVSW50MzIgZXJhc2VEYXRhKSAtPiBOb25lIil9LAorICAgIHsiRHJhd1RoZW1lUG9wdXBBcnJvdyIsIChQeUNGdW5jdGlvbilBcHBfRHJhd1RoZW1lUG9wdXBBcnJvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCBib3VuZHMsIFRoZW1lQXJyb3dPcmllbnRhdGlvbiBvcmllbnRhdGlvbiwgVGhlbWVQb3B1cEFycm93U2l6ZSBzaXplLCBUaGVtZURyYXdTdGF0ZSBzdGF0ZSwgVUludDMyIGVyYXNlRGF0YSkgLT4gTm9uZSIpfSwKKyAgICB7IkRyYXdUaGVtZVN0YW5kYWxvbmVHcm93Qm94IiwgKFB5Q0Z1bmN0aW9uKUFwcF9EcmF3VGhlbWVTdGFuZGFsb25lR3Jvd0JveCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgb3JpZ2luLCBUaGVtZUdyb3dEaXJlY3Rpb24gZ3Jvd0RpcmVjdGlvbiwgQm9vbGVhbiBpc1NtYWxsLCBUaGVtZURyYXdTdGF0ZSBzdGF0ZSkgLT4gTm9uZSIpfSwKKyAgICB7IkRyYXdUaGVtZVN0YW5kYWxvbmVOb0dyb3dCb3giLCAoUHlDRnVuY3Rpb24pQXBwX0RyYXdUaGVtZVN0YW5kYWxvbmVOb0dyb3dCb3gsIDEsCisgICAgIFB5RG9jX1NUUigiKFBvaW50IG9yaWdpbiwgVGhlbWVHcm93RGlyZWN0aW9uIGdyb3dEaXJlY3Rpb24sIEJvb2xlYW4gaXNTbWFsbCwgVGhlbWVEcmF3U3RhdGUgc3RhdGUpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRUaGVtZVN0YW5kYWxvbmVHcm93Qm94Qm91bmRzIiwgKFB5Q0Z1bmN0aW9uKUFwcF9HZXRUaGVtZVN0YW5kYWxvbmVHcm93Qm94Qm91bmRzLCAxLAorICAgICBQeURvY19TVFIoIihQb2ludCBvcmlnaW4sIFRoZW1lR3Jvd0RpcmVjdGlvbiBncm93RGlyZWN0aW9uLCBCb29sZWFuIGlzU21hbGwpIC0+IChSZWN0IGJvdW5kcykiKX0sCisgICAgeyJOb3JtYWxpemVUaGVtZURyYXdpbmdTdGF0ZSIsIChQeUNGdW5jdGlvbilBcHBfTm9ybWFsaXplVGhlbWVEcmF3aW5nU3RhdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldFRoZW1lRHJhd2luZ1N0YXRlIiwgKFB5Q0Z1bmN0aW9uKUFwcF9HZXRUaGVtZURyYXdpbmdTdGF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVGhlbWVEcmF3aW5nU3RhdGUgb3V0U3RhdGUpIil9LAorICAgIHsiQXBwbHlUaGVtZUJhY2tncm91bmQiLCAoUHlDRnVuY3Rpb24pQXBwX0FwcGx5VGhlbWVCYWNrZ3JvdW5kLCAxLAorICAgICBQeURvY19TVFIoIihUaGVtZUJhY2tncm91bmRLaW5kIGluS2luZCwgUmVjdCBib3VuZHMsIFRoZW1lRHJhd1N0YXRlIGluU3RhdGUsIFNJbnQxNiBpbkRlcHRoLCBCb29sZWFuIGluQ29sb3JEZXYpIC0+IE5vbmUiKX0sCisgICAgeyJTZXRUaGVtZVRleHRDb2xvckZvcldpbmRvdyIsIChQeUNGdW5jdGlvbilBcHBfU2V0VGhlbWVUZXh0Q29sb3JGb3JXaW5kb3csIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIEJvb2xlYW4gaXNBY3RpdmUsIFNJbnQxNiBkZXB0aCwgQm9vbGVhbiBpc0NvbG9yRGV2KSAtPiBOb25lIil9LAorICAgIHsiSXNWYWxpZEFwcGVhcmFuY2VGaWxlVHlwZSIsIChQeUNGdW5jdGlvbilBcHBfSXNWYWxpZEFwcGVhcmFuY2VGaWxlVHlwZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoT1NUeXBlIGZpbGVUeXBlKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiR2V0VGhlbWVCcnVzaEFzQ29sb3IiLCAoUHlDRnVuY3Rpb24pQXBwX0dldFRoZW1lQnJ1c2hBc0NvbG9yLCAxLAorICAgICBQeURvY19TVFIoIihUaGVtZUJydXNoIGluQnJ1c2gsIFNJbnQxNiBpbkRlcHRoLCBCb29sZWFuIGluQ29sb3JEZXYpIC0+IChSR0JDb2xvciBvdXRDb2xvcikiKX0sCisgICAgeyJHZXRUaGVtZVRleHRDb2xvciIsIChQeUNGdW5jdGlvbilBcHBfR2V0VGhlbWVUZXh0Q29sb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKFRoZW1lVGV4dENvbG9yIGluQ29sb3IsIFNJbnQxNiBpbkRlcHRoLCBCb29sZWFuIGluQ29sb3JEZXYpIC0+IChSR0JDb2xvciBvdXRDb2xvcikiKX0sCisgICAgeyJHZXRUaGVtZU1ldHJpYyIsIChQeUNGdW5jdGlvbilBcHBfR2V0VGhlbWVNZXRyaWMsIDEsCisgICAgIFB5RG9jX1NUUigiKFRoZW1lTWV0cmljIGluTWV0cmljKSAtPiAoU0ludDMyIG91dE1ldHJpYykiKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAKLSNlbHNlICAJLyogX19MUDY0X18gKi8KKyNlbHNlICAgLyogX19MUDY0X18gKi8KIAogc3RhdGljIFB5TWV0aG9kRGVmIEFwcF9tZXRob2RzW10gPSB7Ci0Je05VTEwsIE5VTEwsIDB9CisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAjZW5kaWYgLyogX19MUDY0X18gKi8KQEAgLTE4MDUsMjYgKzE4MDUsMjYgQEAKIAogdm9pZCBpbml0X0FwcCh2b2lkKQogewotCVB5T2JqZWN0ICptOworICAgIFB5T2JqZWN0ICptOwogI2lmbmRlZiBfX0xQNjRfXwotCVB5T2JqZWN0ICpkOworICAgIFB5T2JqZWN0ICpkOwogI2VuZGlmIC8qICFfX0xQNjRfXyAqLwogCiAKLQltID0gUHlfSW5pdE1vZHVsZSgiX0FwcCIsIEFwcF9tZXRob2RzKTsKKyAgICBtID0gUHlfSW5pdE1vZHVsZSgiX0FwcCIsIEFwcF9tZXRob2RzKTsKICNpZm5kZWYgX19MUDY0X18KLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQlBcHBfRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOwotCWlmIChBcHBfRXJyb3IgPT0gTlVMTCB8fAotCSAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRXJyb3IiLCBBcHBfRXJyb3IpICE9IDApCi0JCXJldHVybjsKLQlUaGVtZURyYXdpbmdTdGF0ZV9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmVGhlbWVEcmF3aW5nU3RhdGVfVHlwZSkgPCAwKSByZXR1cm47Ci0JUHlfSU5DUkVGKCZUaGVtZURyYXdpbmdTdGF0ZV9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIlRoZW1lRHJhd2luZ1N0YXRlIiwgKFB5T2JqZWN0ICopJlRoZW1lRHJhd2luZ1N0YXRlX1R5cGUpOwotCS8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLwotCVB5X0lOQ1JFRigmVGhlbWVEcmF3aW5nU3RhdGVfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJUaGVtZURyYXdpbmdTdGF0ZVR5cGUiLCAoUHlPYmplY3QgKikmVGhlbWVEcmF3aW5nU3RhdGVfVHlwZSk7CisgICAgZCA9IFB5TW9kdWxlX0dldERpY3QobSk7CisgICAgQXBwX0Vycm9yID0gUHlNYWNfR2V0T1NFcnJFeGNlcHRpb24oKTsKKyAgICBpZiAoQXBwX0Vycm9yID09IE5VTEwgfHwKKyAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVycm9yIiwgQXBwX0Vycm9yKSAhPSAwKQorICAgICAgICByZXR1cm47CisgICAgVGhlbWVEcmF3aW5nU3RhdGVfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJlRoZW1lRHJhd2luZ1N0YXRlX1R5cGUpIDwgMCkgcmV0dXJuOworICAgIFB5X0lOQ1JFRigmVGhlbWVEcmF3aW5nU3RhdGVfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJUaGVtZURyYXdpbmdTdGF0ZSIsIChQeU9iamVjdCAqKSZUaGVtZURyYXdpbmdTdGF0ZV9UeXBlKTsKKyAgICAvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KKyAgICBQeV9JTkNSRUYoJlRoZW1lRHJhd2luZ1N0YXRlX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiVGhlbWVEcmF3aW5nU3RhdGVUeXBlIiwgKFB5T2JqZWN0ICopJlRoZW1lRHJhd2luZ1N0YXRlX1R5cGUpOwogI2VuZGlmIC8qIF9fTFA2NF9fICovCiB9CiAKZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL2F1dG9HSUwuYyBiL01hYy9Nb2R1bGVzL2F1dG9HSUwuYwppbmRleCBhZjJlNjk5Li4zYmMxNTkzIDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9hdXRvR0lMLmMKKysrIGIvTWFjL01vZHVsZXMvYXV0b0dJTC5jCkBAIC0xNiw5MyArMTYsOTMgQEAKIAogCiBzdGF0aWMgdm9pZCBhdXRvR0lMQ2FsbGJhY2soQ0ZSdW5Mb29wT2JzZXJ2ZXJSZWYgb2JzZXJ2ZXIsCi0JCQkgICAgQ0ZSdW5Mb29wQWN0aXZpdHkgYWN0aXZpdHksCi0JCQkgICAgdm9pZCAqaW5mbykgewotCVB5VGhyZWFkU3RhdGUgKipwX3RzdGF0ZSA9IChQeVRocmVhZFN0YXRlICoqKWluZm87CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZSdW5Mb29wQWN0aXZpdHkgYWN0aXZpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqaW5mbykgeworICAgIFB5VGhyZWFkU3RhdGUgKipwX3RzdGF0ZSA9IChQeVRocmVhZFN0YXRlICoqKWluZm87CiAKLQlzd2l0Y2ggKGFjdGl2aXR5KSB7Ci0JY2FzZSBrQ0ZSdW5Mb29wQmVmb3JlV2FpdGluZzoKLQkJLyogZ29pbmcgdG8gc2xlZXAsIHJlbGVhc2UgR0lMICovCisgICAgc3dpdGNoIChhY3Rpdml0eSkgeworICAgIGNhc2Uga0NGUnVuTG9vcEJlZm9yZVdhaXRpbmc6CisgICAgICAgIC8qIGdvaW5nIHRvIHNsZWVwLCByZWxlYXNlIEdJTCAqLwogI2lmZGVmIEFVVE9HSUxfREVCVUcKLQkJZnByaW50ZihzdGRlcnIsICJnb2luZyB0byBzbGVlcCwgcmVsZWFzZSBHSUxcbiIpOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImdvaW5nIHRvIHNsZWVwLCByZWxlYXNlIEdJTFxuIik7CiAjZW5kaWYKLQkJKnBfdHN0YXRlID0gUHlFdmFsX1NhdmVUaHJlYWQoKTsKLQkJYnJlYWs7Ci0JY2FzZSBrQ0ZSdW5Mb29wQWZ0ZXJXYWl0aW5nOgotCQkvKiB3YWtpbmcgdXAsIGFjcXVpcmUgR0lMICovCisgICAgICAgICpwX3RzdGF0ZSA9IFB5RXZhbF9TYXZlVGhyZWFkKCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Uga0NGUnVuTG9vcEFmdGVyV2FpdGluZzoKKyAgICAgICAgLyogd2FraW5nIHVwLCBhY3F1aXJlIEdJTCAqLwogI2lmZGVmIEFVVE9HSUxfREVCVUcKLQkJZnByaW50ZihzdGRlcnIsICJ3YWtpbmcgdXAsIGFjcXVpcmUgR0lMXG4iKTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJ3YWtpbmcgdXAsIGFjcXVpcmUgR0lMXG4iKTsKICNlbmRpZgotCQlQeUV2YWxfUmVzdG9yZVRocmVhZCgqcF90c3RhdGUpOwotCQkqcF90c3RhdGUgPSBOVUxMOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9CisgICAgICAgIFB5RXZhbF9SZXN0b3JlVGhyZWFkKCpwX3RzdGF0ZSk7CisgICAgICAgICpwX3RzdGF0ZSA9IE5VTEw7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KIH0KIAogc3RhdGljIHZvaWQgaW5mb1JlbGVhc2UoY29uc3Qgdm9pZCAqaW5mbykgewotCS8qIFhYWCBUaGlzIHNob3VsZCBnZXQgY2FsbGVkIHdoZW4gdGhlIHJ1biBsb29wIGlzIGRlYWxsb2NhdGVkLAotCSAgIGJ1dCB0aGlzIGRvZXNuJ3Qgc2VlbSB0byBoYXBwZW4uIFNvIGZvciBub3c6IGxlYWsuICovCi0JUHlNZW1fRnJlZSgodm9pZCAqKWluZm8pOworICAgIC8qIFhYWCBUaGlzIHNob3VsZCBnZXQgY2FsbGVkIHdoZW4gdGhlIHJ1biBsb29wIGlzIGRlYWxsb2NhdGVkLAorICAgICAgIGJ1dCB0aGlzIGRvZXNuJ3Qgc2VlbSB0byBoYXBwZW4uIFNvIGZvciBub3c6IGxlYWsuICovCisgICAgUHlNZW1fRnJlZSgodm9pZCAqKWluZm8pOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYXV0b0dJTF9pbnN0YWxsQXV0b0dJTChQeU9iamVjdCAqc2VsZikKIHsKLQlQeU9iamVjdCAqdHN0YXRlX2RpY3QgPSBQeVRocmVhZFN0YXRlX0dldERpY3QoKTsKLQlQeU9iamVjdCAqdjsKLQlDRlJ1bkxvb3BSZWYgcmw7Ci0JUHlUaHJlYWRTdGF0ZSAqKnBfdHN0YXRlOyAgLyogZm9yIHVzZSBpbiB0aGUgaW5mbyBmaWVsZCAqLwotCUNGUnVuTG9vcE9ic2VydmVyQ29udGV4dCBjb250ZXh0ID0gezAsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEx9OwotCUNGUnVuTG9vcE9ic2VydmVyUmVmIG9ic2VydmVyOworICAgIFB5T2JqZWN0ICp0c3RhdGVfZGljdCA9IFB5VGhyZWFkU3RhdGVfR2V0RGljdCgpOworICAgIFB5T2JqZWN0ICp2OworICAgIENGUnVuTG9vcFJlZiBybDsKKyAgICBQeVRocmVhZFN0YXRlICoqcF90c3RhdGU7ICAvKiBmb3IgdXNlIGluIHRoZSBpbmZvIGZpZWxkICovCisgICAgQ0ZSdW5Mb29wT2JzZXJ2ZXJDb250ZXh0IGNvbnRleHQgPSB7MCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTH07CisgICAgQ0ZSdW5Mb29wT2JzZXJ2ZXJSZWYgb2JzZXJ2ZXI7CiAKLQlpZiAodHN0YXRlX2RpY3QgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JdiA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKHRzdGF0ZV9kaWN0LCAiYXV0b0dJTC5JbnN0YWxsZWRBdXRvR0lMIik7Ci0JaWYgKHYgIT0gTlVMTCkgewotCQkvKiB3ZSd2ZSBhbHJlYWR5IGluc3RhbGxlZCBhIGNhbGxiYWNrIGZvciB0aGlzIHRocmVhZCAqLwotCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCXJldHVybiBQeV9Ob25lOwotCX0KKyAgICBpZiAodHN0YXRlX2RpY3QgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgdiA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKHRzdGF0ZV9kaWN0LCAiYXV0b0dJTC5JbnN0YWxsZWRBdXRvR0lMIik7CisgICAgaWYgKHYgIT0gTlVMTCkgeworICAgICAgICAvKiB3ZSd2ZSBhbHJlYWR5IGluc3RhbGxlZCBhIGNhbGxiYWNrIGZvciB0aGlzIHRocmVhZCAqLworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIHJldHVybiBQeV9Ob25lOworICAgIH0KIAotCXJsID0gQ0ZSdW5Mb29wR2V0Q3VycmVudCgpOwotCWlmIChybCA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhBdXRvR0lMRXJyb3IsCi0JCQkJImNhbid0IGdldCBydW4gbG9vcCBmb3IgY3VycmVudCB0aHJlYWQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIHJsID0gQ0ZSdW5Mb29wR2V0Q3VycmVudCgpOworICAgIGlmIChybCA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdXRvR0lMRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiY2FuJ3QgZ2V0IHJ1biBsb29wIGZvciBjdXJyZW50IHRocmVhZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlwX3RzdGF0ZSA9IFB5TWVtX01hbGxvYyhzaXplb2YoUHlUaHJlYWRTdGF0ZSAqKSk7Ci0JaWYgKHBfdHN0YXRlID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX01lbW9yeUVycm9yLAotCQkJCSJub3QgZW5vdWdoIG1lbW9yeSB0byBhbGxvY2F0ZSAiCi0JCQkJInRzdGF0ZSBwb2ludGVyIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQkqcF90c3RhdGUgPSBOVUxMOwotCWNvbnRleHQuaW5mbyA9ICh2b2lkICopcF90c3RhdGU7Ci0JY29udGV4dC5yZWxlYXNlID0gaW5mb1JlbGVhc2U7CisgICAgcF90c3RhdGUgPSBQeU1lbV9NYWxsb2Moc2l6ZW9mKFB5VGhyZWFkU3RhdGUgKikpOworICAgIGlmIChwX3RzdGF0ZSA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19NZW1vcnlFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJub3QgZW5vdWdoIG1lbW9yeSB0byBhbGxvY2F0ZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAidHN0YXRlIHBvaW50ZXIiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgICpwX3RzdGF0ZSA9IE5VTEw7CisgICAgY29udGV4dC5pbmZvID0gKHZvaWQgKilwX3RzdGF0ZTsKKyAgICBjb250ZXh0LnJlbGVhc2UgPSBpbmZvUmVsZWFzZTsKIAotCW9ic2VydmVyID0gQ0ZSdW5Mb29wT2JzZXJ2ZXJDcmVhdGUoCi0JCU5VTEwsCi0JCWtDRlJ1bkxvb3BCZWZvcmVXYWl0aW5nIHwga0NGUnVuTG9vcEFmdGVyV2FpdGluZywKLQkJMSwgMCwgYXV0b0dJTENhbGxiYWNrLCAmY29udGV4dCk7Ci0JaWYgKG9ic2VydmVyID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKEF1dG9HSUxFcnJvciwKLQkJCQkiY2FuJ3QgY3JlYXRlIGV2ZW50IGxvb3Agb2JzZXJ2ZXIiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCUNGUnVuTG9vcEFkZE9ic2VydmVyKHJsLCBvYnNlcnZlciwga0NGUnVuTG9vcERlZmF1bHRNb2RlKTsKLQkvKiBYWFggaG93IHRvIGNoZWNrIGZvciBlcnJvcnM/ICovCisgICAgb2JzZXJ2ZXIgPSBDRlJ1bkxvb3BPYnNlcnZlckNyZWF0ZSgKKyAgICAgICAgTlVMTCwKKyAgICAgICAga0NGUnVuTG9vcEJlZm9yZVdhaXRpbmcgfCBrQ0ZSdW5Mb29wQWZ0ZXJXYWl0aW5nLAorICAgICAgICAxLCAwLCBhdXRvR0lMQ2FsbGJhY2ssICZjb250ZXh0KTsKKyAgICBpZiAob2JzZXJ2ZXIgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXV0b0dJTEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImNhbid0IGNyZWF0ZSBldmVudCBsb29wIG9ic2VydmVyIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBDRlJ1bkxvb3BBZGRPYnNlcnZlcihybCwgb2JzZXJ2ZXIsIGtDRlJ1bkxvb3BEZWZhdWx0TW9kZSk7CisgICAgLyogWFhYIGhvdyB0byBjaGVjayBmb3IgZXJyb3JzPyAqLwogCi0JLyogcmVnaXN0ZXIgdGhhdCB3ZSBoYXZlIGluc3RhbGxlZCBhIGNhbGxiYWNrIGZvciB0aGlzIHRocmVhZCAqLwotCWlmIChQeURpY3RfU2V0SXRlbVN0cmluZyh0c3RhdGVfZGljdCwgImF1dG9HSUwuSW5zdGFsbGVkQXV0b0dJTCIsCi0JCQkJIFB5X05vbmUpIDwgMCkKLQkJcmV0dXJuIE5VTEw7CisgICAgLyogcmVnaXN0ZXIgdGhhdCB3ZSBoYXZlIGluc3RhbGxlZCBhIGNhbGxiYWNrIGZvciB0aGlzIHRocmVhZCAqLworICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyh0c3RhdGVfZGljdCwgImF1dG9HSUwuSW5zdGFsbGVkQXV0b0dJTCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X05vbmUpIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBQeURvY19TVFJWQVIoYXV0b0dJTF9pbnN0YWxsQXV0b0dJTF9kb2MsCkBAIC0xMTQsMTMgKzExNCwxMyBAQAogKTsKIAogc3RhdGljIFB5TWV0aG9kRGVmIGF1dG9HSUxfbWV0aG9kc1tdID0gewotCXsKLQkJImluc3RhbGxBdXRvR0lMIiwKLQkJKFB5Q0Z1bmN0aW9uKWF1dG9HSUxfaW5zdGFsbEF1dG9HSUwsCi0JCU1FVEhfTk9BUkdTLAotCQlhdXRvR0lMX2luc3RhbGxBdXRvR0lMX2RvYwotCX0sCi0JeyAwLCAwLCAwLCAwIH0gLyogc2VudGluZWwgKi8KKyAgICB7CisgICAgICAgICJpbnN0YWxsQXV0b0dJTCIsCisgICAgICAgIChQeUNGdW5jdGlvbilhdXRvR0lMX2luc3RhbGxBdXRvR0lMLAorICAgICAgICBNRVRIX05PQVJHUywKKyAgICAgICAgYXV0b0dJTF9pbnN0YWxsQXV0b0dJTF9kb2MKKyAgICB9LAorICAgIHsgMCwgMCwgMCwgMCB9IC8qIHNlbnRpbmVsICovCiB9OwogCiBQeURvY19TVFJWQVIoYXV0b0dJTF9kb2NzLApAQCAtMTMyLDIxICsxMzIsMjEgQEAKIFB5TU9ESU5JVF9GVU5DCiBpbml0YXV0b0dJTCh2b2lkKQogewotCVB5T2JqZWN0ICptb2Q7CisgICAgUHlPYmplY3QgKm1vZDsKIAotCWlmIChQeUVycl9XYXJuUHkzaygiSW4gMy54LCB0aGUgYXV0b0dJTCBtb2R1bGUgaXMgcmVtb3ZlZC4iLCAxKSA8IDApCi0JCXJldHVybjsKKyAgICBpZiAoUHlFcnJfV2FyblB5M2soIkluIDMueCwgdGhlIGF1dG9HSUwgbW9kdWxlIGlzIHJlbW92ZWQuIiwgMSkgPCAwKQorICAgICAgICByZXR1cm47CiAKLQltb2QgPSBQeV9Jbml0TW9kdWxlNCgiYXV0b0dJTCIsIGF1dG9HSUxfbWV0aG9kcywgYXV0b0dJTF9kb2NzLAotCQkJICAgICBOVUxMLCBQWVRIT05fQVBJX1ZFUlNJT04pOwotCWlmIChtb2QgPT0gTlVMTCkKLQkJcmV0dXJuOwotCUF1dG9HSUxFcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbigiYXV0b0dJTC5BdXRvR0lMRXJyb3IiLAotCQkJCQkgIFB5RXhjX0V4Y2VwdGlvbiwgTlVMTCk7Ci0JaWYgKEF1dG9HSUxFcnJvciA9PSBOVUxMKQotCQlyZXR1cm47Ci0JUHlfSU5DUkVGKEF1dG9HSUxFcnJvcik7Ci0JaWYgKFB5TW9kdWxlX0FkZE9iamVjdChtb2QsICJBdXRvR0lMRXJyb3IiLAotCQkJICAgICAgIEF1dG9HSUxFcnJvcikgPCAwKQotCQlyZXR1cm47CisgICAgbW9kID0gUHlfSW5pdE1vZHVsZTQoImF1dG9HSUwiLCBhdXRvR0lMX21ldGhvZHMsIGF1dG9HSUxfZG9jcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBQWVRIT05fQVBJX1ZFUlNJT04pOworICAgIGlmIChtb2QgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOworICAgIEF1dG9HSUxFcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbigiYXV0b0dJTC5BdXRvR0lMRXJyb3IiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUV4Y19FeGNlcHRpb24sIE5VTEwpOworICAgIGlmIChBdXRvR0lMRXJyb3IgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0lOQ1JFRihBdXRvR0lMRXJyb3IpOworICAgIGlmIChQeU1vZHVsZV9BZGRPYmplY3QobW9kLCAiQXV0b0dJTEVycm9yIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1dG9HSUxFcnJvcikgPCAwKQorICAgICAgICByZXR1cm47CiB9CmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9jYXJib25ldnQvX0NhcmJvbkV2dG1vZHVsZS5jIGIvTWFjL01vZHVsZXMvY2FyYm9uZXZ0L19DYXJib25FdnRtb2R1bGUuYwppbmRleCA2NmU0ZTI3Li40OWU5NDhhIDEwMDc1NQotLS0gYS9NYWMvTW9kdWxlcy9jYXJib25ldnQvX0NhcmJvbkV2dG1vZHVsZS5jCisrKyBiL01hYy9Nb2R1bGVzL2NhcmJvbmV2dC9fQ2FyYm9uRXZ0bW9kdWxlLmMKQEAgLTksOSArOSw5IEBACiAKIC8qIE1hY3JvIHRvIHRlc3Qgd2hldGhlciBhIHdlYWstbG9hZGVkIENGTSBmdW5jdGlvbiBleGlzdHMgKi8KICNkZWZpbmUgUHlNYWNfUFJFQ0hFQ0socnRuKSBkbyB7IGlmICggJnJ0biA9PSBOVUxMICkgIHtcCi0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yLCBcCi0gICAgICAgICJOb3QgYXZhaWxhYmxlIGluIHRoaXMgc2hhcmVkIGxpYnJhcnkvT1MgdmVyc2lvbiIpOyBcCi0gICAgICAgIHJldHVybiBOVUxMOyBcCisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsIFwKKyAgICAiTm90IGF2YWlsYWJsZSBpbiB0aGlzIHNoYXJlZCBsaWJyYXJ5L09TIHZlcnNpb24iKTsgXAorICAgIHJldHVybiBOVUxMOyBcCiAgICAgfX0gd2hpbGUoMCkKIAogCkBAIC0zMCwxNyArMzAsMTcgQEAKIHN0YXRpYyBQeU9iamVjdCoKIEV2ZW50VHlwZVNwZWNfTmV3KEV2ZW50VHlwZVNwZWMgKmluKQogewotICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgibGwiLCBpbi0+ZXZlbnRDbGFzcywgaW4tPmV2ZW50S2luZCk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImxsIiwgaW4tPmV2ZW50Q2xhc3MsIGluLT5ldmVudEtpbmQpOwogfQogCiBzdGF0aWMgaW50CiBFdmVudFR5cGVTcGVjX0NvbnZlcnQoUHlPYmplY3QgKnYsIEV2ZW50VHlwZVNwZWMgKm91dCkKIHsKLSAgICAgICAgaWYgKFB5QXJnX1BhcnNlKHYsICIoTyZsKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICYob3V0LT5ldmVudENsYXNzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICYob3V0LT5ldmVudEtpbmQpKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKFB5QXJnX1BhcnNlKHYsICIoTyZsKSIsCisgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJihvdXQtPmV2ZW50Q2xhc3MpLAorICAgICAgICAgICAgICAgICAgICAmKG91dC0+ZXZlbnRLaW5kKSkpCisgICAgICAgIHJldHVybiAxOworICAgIHJldHVybiAwOwogfQogCiAvKioqKioqKioqKiBlbmQgRXZlbnRUeXBlU3BlYyAqKioqKioqLwpAQCAtNTEsMTUgKzUxLDE1IEBACiBzdGF0aWMgUHlPYmplY3QqCiBISVBvaW50X05ldyhISVBvaW50ICppbikKIHsKLSAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImZmIiwgaW4tPngsIGluLT55KTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiZmYiLCBpbi0+eCwgaW4tPnkpOwogfQogCiBzdGF0aWMgaW50CiBISVBvaW50X0NvbnZlcnQoUHlPYmplY3QgKnYsIEhJUG9pbnQgKm91dCkKIHsKLSAgICAgICAgaWYgKFB5QXJnX1BhcnNlVHVwbGUodiwgImZmIiwgJihvdXQtPngpLCAmKG91dC0+eSkpKQotICAgICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoUHlBcmdfUGFyc2VUdXBsZSh2LCAiZmYiLCAmKG91dC0+eCksICYob3V0LT55KSkpCisgICAgICAgIHJldHVybiAxOworICAgIHJldHVybiBOVUxMOwogfQogI2VuZGlmCiAKQEAgLTcwLDE1ICs3MCwxNSBAQAogc3RhdGljIFB5T2JqZWN0KgogRXZlbnRIb3RLZXlJRF9OZXcoRXZlbnRIb3RLZXlJRCAqaW4pCiB7Ci0gICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJsbCIsIGluLT5zaWduYXR1cmUsIGluLT5pZCk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImxsIiwgaW4tPnNpZ25hdHVyZSwgaW4tPmlkKTsKIH0KIAogc3RhdGljIGludAogRXZlbnRIb3RLZXlJRF9Db252ZXJ0KFB5T2JqZWN0ICp2LCBFdmVudEhvdEtleUlEICpvdXQpCiB7Ci0gICAgICAgIGlmIChQeUFyZ19QYXJzZVR1cGxlKHYsICJsbCIsICZvdXQtPnNpZ25hdHVyZSwgJm91dC0+aWQpKQotICAgICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoUHlBcmdfUGFyc2VUdXBsZSh2LCAibGwiLCAmb3V0LT5zaWduYXR1cmUsICZvdXQtPmlkKSkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgcmV0dXJuIDA7CiB9CiAKIC8qKioqKioqKioqIGVuZCBFdmVudEhvdEtleUlEICoqKioqKiovCkBAIC04OSwyNyArODksMjcgQEAKIAogc3RhdGljIHBhc2NhbCBPU1N0YXR1cwogbXlFdmVudEhhbmRsZXIoRXZlbnRIYW5kbGVyQ2FsbFJlZiBoYW5kbGVyUmVmLCBFdmVudFJlZiBldmVudCwgdm9pZCAqb3V0UHlPYmplY3QpIHsKLSAgICAgICAgUHlPYmplY3QgKnJldFZhbHVlOwotICAgICAgICBpbnQgc3RhdHVzOworICAgIFB5T2JqZWN0ICpyZXRWYWx1ZTsKKyAgICBpbnQgc3RhdHVzOwogCi0gICAgICAgIHJldFZhbHVlID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKChQeU9iamVjdCAqKW91dFB5T2JqZWN0LCAiTyZPJiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50SGFuZGxlckNhbGxSZWZfTmV3LCBoYW5kbGVyUmVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudFJlZl9OZXcsIGV2ZW50KTsKLSAgICAgICAgaWYgKHJldFZhbHVlID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigiRXJyb3IgaW4gZXZlbnQgaGFuZGxlciBjYWxsYmFjazpcbiIpOwotICAgICAgICAgICAgICAgIFB5RXJyX1ByaW50KCk7ICAvKiB0aGlzIGFsc28gY2xlYXJzIHRoZSBlcnJvciAqLwotICAgICAgICAgICAgICAgIHN0YXR1cyA9IG5vRXJyOyAvKiBjb21wbGFpbj8gaG93PyAqLwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChyZXRWYWx1ZSA9PSBQeV9Ob25lKQotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gbm9FcnI7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoUHlJbnRfQ2hlY2socmV0VmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBQeUludF9Bc0xvbmcocmV0VmFsdWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gbm9FcnI7IC8qIHdyb25nIG9iamVjdCB0eXBlLCBjb21wbGFpbj8gKi8KLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYocmV0VmFsdWUpOwotICAgICAgICB9CisgICAgcmV0VmFsdWUgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oKFB5T2JqZWN0ICopb3V0UHlPYmplY3QsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudEhhbmRsZXJDYWxsUmVmX05ldywgaGFuZGxlclJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudFJlZl9OZXcsIGV2ZW50KTsKKyAgICBpZiAocmV0VmFsdWUgPT0gTlVMTCkgeworICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigiRXJyb3IgaW4gZXZlbnQgaGFuZGxlciBjYWxsYmFjazpcbiIpOworICAgICAgICBQeUVycl9QcmludCgpOyAgLyogdGhpcyBhbHNvIGNsZWFycyB0aGUgZXJyb3IgKi8KKyAgICAgICAgc3RhdHVzID0gbm9FcnI7IC8qIGNvbXBsYWluPyBob3c/ICovCisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHJldFZhbHVlID09IFB5X05vbmUpCisgICAgICAgICAgICBzdGF0dXMgPSBub0VycjsKKyAgICAgICAgZWxzZSBpZiAoUHlJbnRfQ2hlY2socmV0VmFsdWUpKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBQeUludF9Bc0xvbmcocmV0VmFsdWUpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHN0YXR1cyA9IG5vRXJyOyAvKiB3cm9uZyBvYmplY3QgdHlwZSwgY29tcGxhaW4/ICovCisgICAgICAgIFB5X0RFQ1JFRihyZXRWYWx1ZSk7CisgICAgfQogCi0gICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgcmV0dXJuIHN0YXR1czsKIH0KIAogLyoqKioqKioqIGVuZCBteUV2ZW50SGFuZGxlciAqKioqKioqKioqKi8KQEAgLTEyNCwyNjggKzEyNCwyNjggQEAKICNkZWZpbmUgRXZlbnRSZWZfQ2hlY2soeCkgKCh4KS0+b2JfdHlwZSA9PSAmRXZlbnRSZWZfVHlwZSB8fCBQeU9iamVjdF9UeXBlQ2hlY2soKHgpLCAmRXZlbnRSZWZfVHlwZSkpCiAKIHR5cGVkZWYgc3RydWN0IEV2ZW50UmVmT2JqZWN0IHsKLQlQeU9iamVjdF9IRUFECi0JRXZlbnRSZWYgb2JfaXRzZWxmOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBFdmVudFJlZiBvYl9pdHNlbGY7CiB9IEV2ZW50UmVmT2JqZWN0OwogCiBQeU9iamVjdCAqRXZlbnRSZWZfTmV3KEV2ZW50UmVmIGl0c2VsZikKIHsKLQlFdmVudFJlZk9iamVjdCAqaXQ7Ci0JaXQgPSBQeU9iamVjdF9ORVcoRXZlbnRSZWZPYmplY3QsICZFdmVudFJlZl9UeXBlKTsKLQlpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgRXZlbnRSZWZPYmplY3QgKml0OworICAgIGl0ID0gUHlPYmplY3RfTkVXKEV2ZW50UmVmT2JqZWN0LCAmRXZlbnRSZWZfVHlwZSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIGl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogCiBpbnQgRXZlbnRSZWZfQ29udmVydChQeU9iamVjdCAqdiwgRXZlbnRSZWYgKnBfaXRzZWxmKQogewotCWlmICghRXZlbnRSZWZfQ2hlY2sodikpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiRXZlbnRSZWYgcmVxdWlyZWQiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCSpwX2l0c2VsZiA9ICgoRXZlbnRSZWZPYmplY3QgKil2KS0+b2JfaXRzZWxmOwotCXJldHVybiAxOworICAgIGlmICghRXZlbnRSZWZfQ2hlY2sodikpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiRXZlbnRSZWYgcmVxdWlyZWQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICpwX2l0c2VsZiA9ICgoRXZlbnRSZWZPYmplY3QgKil2KS0+b2JfaXRzZWxmOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgdm9pZCBFdmVudFJlZl9kZWFsbG9jKEV2ZW50UmVmT2JqZWN0ICpzZWxmKQogewotCS8qIENsZWFudXAgb2Ygc2VsZi0+b2JfaXRzZWxmIGdvZXMgaGVyZSAqLwotCXNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CisgICAgLyogQ2xlYW51cCBvZiBzZWxmLT5vYl9pdHNlbGYgZ29lcyBoZXJlICovCisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpFdmVudFJlZl9SZXRhaW5FdmVudChFdmVudFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JRXZlbnRSZWYgX3J2OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBSZXRhaW5FdmVudChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEV2ZW50UmVmX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgRXZlbnRSZWYgX3J2OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBSZXRhaW5FdmVudChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50UmVmX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpFdmVudFJlZl9HZXRFdmVudFJldGFpbkNvdW50KEV2ZW50UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlVSW50MzIgX3J2OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRFdmVudFJldGFpbkNvdW50KF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBVSW50MzIgX3J2OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRFdmVudFJldGFpbkNvdW50KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkV2ZW50UmVmX1JlbGVhc2VFdmVudChFdmVudFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCVJlbGVhc2VFdmVudChfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBSZWxlYXNlRXZlbnQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkV2ZW50UmVmX1NldEV2ZW50UGFyYW1ldGVyKEV2ZW50UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCU9TVHlwZSBpbk5hbWU7Ci0JT1NUeXBlIGluVHlwZTsKLQljaGFyICppbkRhdGFQdHJfX2luX187Ci0JbG9uZyBpbkRhdGFQdHJfX2xlbl9fOwotCWludCBpbkRhdGFQdHJfX2luX2xlbl9fOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZzIyIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmluTmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaW5UeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5EYXRhUHRyX19pbl9fLCAmaW5EYXRhUHRyX19pbl9sZW5fXykpCi0JCXJldHVybiBOVUxMOwotCWluRGF0YVB0cl9fbGVuX18gPSBpbkRhdGFQdHJfX2luX2xlbl9fOwotCV9lcnIgPSBTZXRFdmVudFBhcmFtZXRlcihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBpbk5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGluVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgaW5EYXRhUHRyX19sZW5fXywgaW5EYXRhUHRyX19pbl9fKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBPU1R5cGUgaW5OYW1lOworICAgIE9TVHlwZSBpblR5cGU7CisgICAgY2hhciAqaW5EYXRhUHRyX19pbl9fOworICAgIGxvbmcgaW5EYXRhUHRyX19sZW5fXzsKKyAgICBpbnQgaW5EYXRhUHRyX19pbl9sZW5fXzsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mcyMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpbk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmluVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluRGF0YVB0cl9faW5fXywgJmluRGF0YVB0cl9faW5fbGVuX18pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpbkRhdGFQdHJfX2xlbl9fID0gaW5EYXRhUHRyX19pbl9sZW5fXzsKKyAgICBfZXJyID0gU2V0RXZlbnRQYXJhbWV0ZXIoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRGF0YVB0cl9fbGVuX18sIGluRGF0YVB0cl9faW5fXyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRXZlbnRSZWZfR2V0RXZlbnRDbGFzcyhFdmVudFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVUludDMyIF9ydjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0RXZlbnRDbGFzcyhfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVUludDMyIF9ydjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0RXZlbnRDbGFzcyhfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpFdmVudFJlZl9HZXRFdmVudEtpbmQoRXZlbnRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVVJbnQzMiBfcnY7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldEV2ZW50S2luZChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVUludDMyIF9ydjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0RXZlbnRLaW5kKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkV2ZW50UmVmX0dldEV2ZW50VGltZShFdmVudFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JZG91YmxlIF9ydjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0RXZlbnRUaW1lKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJkIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBkb3VibGUgX3J2OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRFdmVudFRpbWUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRXZlbnRSZWZfU2V0RXZlbnRUaW1lKEV2ZW50UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCWRvdWJsZSBpblRpbWU7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiZCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpblRpbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0RXZlbnRUaW1lKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICBpblRpbWUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIGRvdWJsZSBpblRpbWU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblRpbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0RXZlbnRUaW1lKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICBpblRpbWUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkV2ZW50UmVmX0lzVXNlckNhbmNlbEV2ZW50UmVmKEV2ZW50UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gSXNVc2VyQ2FuY2VsRXZlbnRSZWYoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBJc1VzZXJDYW5jZWxFdmVudFJlZihfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpFdmVudFJlZl9Db252ZXJ0RXZlbnRSZWZUb0V2ZW50UmVjb3JkKEV2ZW50UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlFdmVudFJlY29yZCBvdXRFdmVudDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ29udmVydEV2ZW50UmVmVG9FdmVudFJlY29yZChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEV2ZW50KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRFdmVudFJlY29yZCwgJm91dEV2ZW50KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgRXZlbnRSZWNvcmQgb3V0RXZlbnQ7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENvbnZlcnRFdmVudFJlZlRvRXZlbnRSZWNvcmQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRFdmVudCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRXZlbnRSZWNvcmQsICZvdXRFdmVudCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRXZlbnRSZWZfSXNFdmVudEluTWFzayhFdmVudFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JVUludDE2IGluTWFzazsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJIIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluTWFzaykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IElzRXZlbnRJbk1hc2soX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgIGluTWFzayk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIFVJbnQxNiBpbk1hc2s7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbk1hc2spKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBJc0V2ZW50SW5NYXNrKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICBpbk1hc2spOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkV2ZW50UmVmX1NlbmRFdmVudFRvRXZlbnRUYXJnZXQoRXZlbnRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JRXZlbnRUYXJnZXRSZWYgaW5UYXJnZXQ7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBFdmVudFRhcmdldFJlZl9Db252ZXJ0LCAmaW5UYXJnZXQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2VuZEV2ZW50VG9FdmVudFRhcmdldChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluVGFyZ2V0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBFdmVudFRhcmdldFJlZiBpblRhcmdldDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50VGFyZ2V0UmVmX0NvbnZlcnQsICZpblRhcmdldCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZW5kRXZlbnRUb0V2ZW50VGFyZ2V0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5UYXJnZXQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkV2ZW50UmVmX0dldEV2ZW50UGFyYW1ldGVyKEV2ZW50UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAKLQlVSW50MzIgYnVmZmVyU2l6ZTsKLQlFdmVudFBhcmFtTmFtZSBpbk5hbWU7Ci0JRXZlbnRQYXJhbVR5cGUgaW5UeXBlOwotCU9TRXJyIF9lcnI7Ci0Jdm9pZCAqIGJ1ZmZlcjsKKyAgICBVSW50MzIgYnVmZmVyU2l6ZTsKKyAgICBFdmVudFBhcmFtTmFtZSBpbk5hbWU7CisgICAgRXZlbnRQYXJhbVR5cGUgaW5UeXBlOworICAgIE9TRXJyIF9lcnI7CisgICAgdm9pZCAqIGJ1ZmZlcjsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLCBQeU1hY19HZXRPU1R5cGUsICZpbk5hbWUsIFB5TWFjX0dldE9TVHlwZSwgJmluVHlwZSkpCi0JICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsIFB5TWFjX0dldE9TVHlwZSwgJmluTmFtZSwgUHlNYWNfR2V0T1NUeXBlLCAmaW5UeXBlKSkKKyAgICAgICAgICByZXR1cm4gTlVMTDsKIAotCS8qIEZpZ3VyZSBvdXQgdGhlIHNpemUgYnkgcGFzc2luZyBhIG51bGwgYnVmZmVyIHRvIEdldEV2ZW50UGFyYW1ldGVyICovCi0JX2VyciA9IEdldEV2ZW50UGFyYW1ldGVyKF9zZWxmLT5vYl9pdHNlbGYsIGluTmFtZSwgaW5UeXBlLCBOVUxMLCAwLCAmYnVmZmVyU2l6ZSwgTlVMTCk7CisgICAgLyogRmlndXJlIG91dCB0aGUgc2l6ZSBieSBwYXNzaW5nIGEgbnVsbCBidWZmZXIgdG8gR2V0RXZlbnRQYXJhbWV0ZXIgKi8KKyAgICBfZXJyID0gR2V0RXZlbnRQYXJhbWV0ZXIoX3NlbGYtPm9iX2l0c2VsZiwgaW5OYW1lLCBpblR5cGUsIE5VTEwsIDAsICZidWZmZXJTaXplLCBOVUxMKTsKIAotCWlmIChfZXJyICE9IG5vRXJyKQotCSAgICAgIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlidWZmZXIgPSBQeU1lbV9ORVcoY2hhciwgYnVmZmVyU2l6ZSk7Ci0JaWYgKGJ1ZmZlciA9PSBOVUxMKQotCSAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIGlmIChfZXJyICE9IG5vRXJyKQorICAgICAgICAgIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBidWZmZXIgPSBQeU1lbV9ORVcoY2hhciwgYnVmZmVyU2l6ZSk7CisgICAgaWYgKGJ1ZmZlciA9PSBOVUxMKQorICAgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOwogCi0JX2VyciA9IEdldEV2ZW50UGFyYW1ldGVyKF9zZWxmLT5vYl9pdHNlbGYsIGluTmFtZSwgaW5UeXBlLCBOVUxMLCBidWZmZXJTaXplLCBOVUxMLCBidWZmZXIpOworICAgIF9lcnIgPSBHZXRFdmVudFBhcmFtZXRlcihfc2VsZi0+b2JfaXRzZWxmLCBpbk5hbWUsIGluVHlwZSwgTlVMTCwgYnVmZmVyU2l6ZSwgTlVMTCwgYnVmZmVyKTsKIAotCWlmIChfZXJyICE9IG5vRXJyKSB7Ci0JICAgICAgUHlNZW1fREVMKGJ1ZmZlcik7Ci0JICAgICAgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCX0KLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgicyMiLCBidWZmZXIsIGJ1ZmZlclNpemUpOwotCVB5TWVtX0RFTChidWZmZXIpOwotCXJldHVybiBfcmVzOworICAgIGlmIChfZXJyICE9IG5vRXJyKSB7CisgICAgICAgICAgUHlNZW1fREVMKGJ1ZmZlcik7CisgICAgICAgICAgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIH0KKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgicyMiLCBidWZmZXIsIGJ1ZmZlclNpemUpOworICAgIFB5TWVtX0RFTChidWZmZXIpOworICAgIHJldHVybiBfcmVzOwogCiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBFdmVudFJlZl9tZXRob2RzW10gPSB7Ci0JeyJSZXRhaW5FdmVudCIsIChQeUNGdW5jdGlvbilFdmVudFJlZl9SZXRhaW5FdmVudCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoRXZlbnRSZWYgX3J2KSIpfSwKLQl7IkdldEV2ZW50UmV0YWluQ291bnQiLCAoUHlDRnVuY3Rpb24pRXZlbnRSZWZfR2V0RXZlbnRSZXRhaW5Db3VudCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVUludDMyIF9ydikiKX0sCi0JeyJSZWxlYXNlRXZlbnQiLCAoUHlDRnVuY3Rpb24pRXZlbnRSZWZfUmVsZWFzZUV2ZW50LCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJTZXRFdmVudFBhcmFtZXRlciIsIChQeUNGdW5jdGlvbilFdmVudFJlZl9TZXRFdmVudFBhcmFtZXRlciwgMSwKLQkgUHlEb2NfU1RSKCIoT1NUeXBlIGluTmFtZSwgT1NUeXBlIGluVHlwZSwgQnVmZmVyIGluRGF0YVB0cikgLT4gTm9uZSIpfSwKLQl7IkdldEV2ZW50Q2xhc3MiLCAoUHlDRnVuY3Rpb24pRXZlbnRSZWZfR2V0RXZlbnRDbGFzcywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVUludDMyIF9ydikiKX0sCi0JeyJHZXRFdmVudEtpbmQiLCAoUHlDRnVuY3Rpb24pRXZlbnRSZWZfR2V0RXZlbnRLaW5kLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChVSW50MzIgX3J2KSIpfSwKLQl7IkdldEV2ZW50VGltZSIsIChQeUNGdW5jdGlvbilFdmVudFJlZl9HZXRFdmVudFRpbWUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKGRvdWJsZSBfcnYpIil9LAotCXsiU2V0RXZlbnRUaW1lIiwgKFB5Q0Z1bmN0aW9uKUV2ZW50UmVmX1NldEV2ZW50VGltZSwgMSwKLQkgUHlEb2NfU1RSKCIoZG91YmxlIGluVGltZSkgLT4gTm9uZSIpfSwKLQl7IklzVXNlckNhbmNlbEV2ZW50UmVmIiwgKFB5Q0Z1bmN0aW9uKUV2ZW50UmVmX0lzVXNlckNhbmNlbEV2ZW50UmVmLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJDb252ZXJ0RXZlbnRSZWZUb0V2ZW50UmVjb3JkIiwgKFB5Q0Z1bmN0aW9uKUV2ZW50UmVmX0NvbnZlcnRFdmVudFJlZlRvRXZlbnRSZWNvcmQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2LCBFdmVudFJlY29yZCBvdXRFdmVudCkiKX0sCi0JeyJJc0V2ZW50SW5NYXNrIiwgKFB5Q0Z1bmN0aW9uKUV2ZW50UmVmX0lzRXZlbnRJbk1hc2ssIDEsCi0JIFB5RG9jX1NUUigiKFVJbnQxNiBpbk1hc2spIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJTZW5kRXZlbnRUb0V2ZW50VGFyZ2V0IiwgKFB5Q0Z1bmN0aW9uKUV2ZW50UmVmX1NlbmRFdmVudFRvRXZlbnRUYXJnZXQsIDEsCi0JIFB5RG9jX1NUUigiKEV2ZW50VGFyZ2V0UmVmIGluVGFyZ2V0KSAtPiBOb25lIil9LAotCXsiR2V0RXZlbnRQYXJhbWV0ZXIiLCAoUHlDRnVuY3Rpb24pRXZlbnRSZWZfR2V0RXZlbnRQYXJhbWV0ZXIsIDEsCi0JIFB5RG9jX1NUUigiKEV2ZW50UGFyYW1OYW1lIGV2ZW50TmFtZSwgRXZlbnRQYXJhbVR5cGUgZXZlbnRUeXBlKSAtPiAoU3RyaW5nIGV2ZW50UGFyYW1EYXRhKSIpfSwKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7IlJldGFpbkV2ZW50IiwgKFB5Q0Z1bmN0aW9uKUV2ZW50UmVmX1JldGFpbkV2ZW50LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChFdmVudFJlZiBfcnYpIil9LAorICAgIHsiR2V0RXZlbnRSZXRhaW5Db3VudCIsIChQeUNGdW5jdGlvbilFdmVudFJlZl9HZXRFdmVudFJldGFpbkNvdW50LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChVSW50MzIgX3J2KSIpfSwKKyAgICB7IlJlbGVhc2VFdmVudCIsIChQeUNGdW5jdGlvbilFdmVudFJlZl9SZWxlYXNlRXZlbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IlNldEV2ZW50UGFyYW1ldGVyIiwgKFB5Q0Z1bmN0aW9uKUV2ZW50UmVmX1NldEV2ZW50UGFyYW1ldGVyLCAxLAorICAgICBQeURvY19TVFIoIihPU1R5cGUgaW5OYW1lLCBPU1R5cGUgaW5UeXBlLCBCdWZmZXIgaW5EYXRhUHRyKSAtPiBOb25lIil9LAorICAgIHsiR2V0RXZlbnRDbGFzcyIsIChQeUNGdW5jdGlvbilFdmVudFJlZl9HZXRFdmVudENsYXNzLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChVSW50MzIgX3J2KSIpfSwKKyAgICB7IkdldEV2ZW50S2luZCIsIChQeUNGdW5jdGlvbilFdmVudFJlZl9HZXRFdmVudEtpbmQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQzMiBfcnYpIil9LAorICAgIHsiR2V0RXZlbnRUaW1lIiwgKFB5Q0Z1bmN0aW9uKUV2ZW50UmVmX0dldEV2ZW50VGltZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoZG91YmxlIF9ydikiKX0sCisgICAgeyJTZXRFdmVudFRpbWUiLCAoUHlDRnVuY3Rpb24pRXZlbnRSZWZfU2V0RXZlbnRUaW1lLCAxLAorICAgICBQeURvY19TVFIoIihkb3VibGUgaW5UaW1lKSAtPiBOb25lIil9LAorICAgIHsiSXNVc2VyQ2FuY2VsRXZlbnRSZWYiLCAoUHlDRnVuY3Rpb24pRXZlbnRSZWZfSXNVc2VyQ2FuY2VsRXZlbnRSZWYsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IkNvbnZlcnRFdmVudFJlZlRvRXZlbnRSZWNvcmQiLCAoUHlDRnVuY3Rpb24pRXZlbnRSZWZfQ29udmVydEV2ZW50UmVmVG9FdmVudFJlY29yZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYsIEV2ZW50UmVjb3JkIG91dEV2ZW50KSIpfSwKKyAgICB7IklzRXZlbnRJbk1hc2siLCAoUHlDRnVuY3Rpb24pRXZlbnRSZWZfSXNFdmVudEluTWFzaywgMSwKKyAgICAgUHlEb2NfU1RSKCIoVUludDE2IGluTWFzaykgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IlNlbmRFdmVudFRvRXZlbnRUYXJnZXQiLCAoUHlDRnVuY3Rpb24pRXZlbnRSZWZfU2VuZEV2ZW50VG9FdmVudFRhcmdldCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRXZlbnRUYXJnZXRSZWYgaW5UYXJnZXQpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRFdmVudFBhcmFtZXRlciIsIChQeUNGdW5jdGlvbilFdmVudFJlZl9HZXRFdmVudFBhcmFtZXRlciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRXZlbnRQYXJhbU5hbWUgZXZlbnROYW1lLCBFdmVudFBhcmFtVHlwZSBldmVudFR5cGUpIC0+IChTdHJpbmcgZXZlbnRQYXJhbURhdGEpIil9LAorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogI2RlZmluZSBFdmVudFJlZl9nZXRzZXRsaXN0IE5VTEwKQEAgLTQwMiw2MSArNDAyLDYxIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqRXZlbnRSZWZfdHBfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKl9hcmdzLCBQeU9iamVjdCAqX2t3ZHMpCiB7Ci0JUHlPYmplY3QgKl9zZWxmOwotCUV2ZW50UmVmIGl0c2VsZjsKLQljaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKKyAgICBQeU9iamVjdCAqX3NlbGY7CisgICAgRXZlbnRSZWYgaXRzZWxmOworICAgIGNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgRXZlbnRSZWZfQ29udmVydCwgJml0c2VsZikpIHJldHVybiBOVUxMOwotCWlmICgoX3NlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JKChFdmVudFJlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiBfc2VsZjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBFdmVudFJlZl9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAoKEV2ZW50UmVmT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgcmV0dXJuIF9zZWxmOwogfQogCiAjZGVmaW5lIEV2ZW50UmVmX3RwX2ZyZWUgUHlPYmplY3RfRGVsCiAKIAogUHlUeXBlT2JqZWN0IEV2ZW50UmVmX1R5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCi0JMCwgLypvYl9zaXplKi8KLQkiX0NhcmJvbkV2dC5FdmVudFJlZiIsIC8qdHBfbmFtZSovCi0Jc2l6ZW9mKEV2ZW50UmVmT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLwotCTAsIC8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcikgRXZlbnRSZWZfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KLQkwLCAvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykgRXZlbnRSZWZfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpIEV2ZW50UmVmX3JlcHIsIC8qdHBfcmVwciovCi0JKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLwotCShQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCi0JKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCi0JKGhhc2hmdW5jKSBFdmVudFJlZl9oYXNoLCAvKnRwX2hhc2gqLwotCTAsIC8qdHBfY2FsbCovCi0JMCwgLyp0cF9zdHIqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KLQlQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLwotCTAsIC8qdHBfYXNfYnVmZmVyKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQkwLCAvKnRwX2RvYyovCi0JMCwgLyp0cF90cmF2ZXJzZSovCi0JMCwgLyp0cF9jbGVhciovCi0JMCwgLyp0cF9yaWNoY29tcGFyZSovCi0JMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCi0JMCwgLyp0cF9pdGVyKi8KLQkwLCAvKnRwX2l0ZXJuZXh0Ki8KLQlFdmVudFJlZl9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCi0JMCwgLyp0cF9tZW1iZXJzKi8KLQlFdmVudFJlZl9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCi0JMCwgLyp0cF9iYXNlKi8KLQkwLCAvKnRwX2RpY3QqLwotCTAsIC8qdHBfZGVzY3JfZ2V0Ki8KLQkwLCAvKnRwX2Rlc2NyX3NldCovCi0JMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KLQlFdmVudFJlZl90cF9pbml0LCAvKiB0cF9pbml0ICovCi0JRXZlbnRSZWZfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCi0JRXZlbnRSZWZfdHBfbmV3LCAvKiB0cF9uZXcgKi8KLQlFdmVudFJlZl90cF9mcmVlLCAvKiB0cF9mcmVlICovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgLypvYl9zaXplKi8KKyAgICAiX0NhcmJvbkV2dC5FdmVudFJlZiIsIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKEV2ZW50UmVmT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLworICAgIDAsIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcikgRXZlbnRSZWZfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KKyAgICAoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KKyAgICAoY21wZnVuYykgRXZlbnRSZWZfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpIEV2ZW50UmVmX3JlcHIsIC8qdHBfcmVwciovCisgICAgKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLworICAgIChQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKSBFdmVudFJlZl9oYXNoLCAvKnRwX2hhc2gqLworICAgIDAsIC8qdHBfY2FsbCovCisgICAgMCwgLyp0cF9zdHIqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KKyAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLworICAgIDAsIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAvKnRwX2RvYyovCisgICAgMCwgLyp0cF90cmF2ZXJzZSovCisgICAgMCwgLyp0cF9jbGVhciovCisgICAgMCwgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgLyp0cF9pdGVyKi8KKyAgICAwLCAvKnRwX2l0ZXJuZXh0Ki8KKyAgICBFdmVudFJlZl9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCisgICAgMCwgLyp0cF9tZW1iZXJzKi8KKyAgICBFdmVudFJlZl9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCisgICAgMCwgLyp0cF9iYXNlKi8KKyAgICAwLCAvKnRwX2RpY3QqLworICAgIDAsIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICBFdmVudFJlZl90cF9pbml0LCAvKiB0cF9pbml0ICovCisgICAgRXZlbnRSZWZfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCisgICAgRXZlbnRSZWZfdHBfbmV3LCAvKiB0cF9uZXcgKi8KKyAgICBFdmVudFJlZl90cF9mcmVlLCAvKiB0cF9mcmVlICovCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLSBFbmQgb2JqZWN0IHR5cGUgRXZlbnRSZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTQ2OSwxNDQgKzQ2OSwxNDQgQEAKICNkZWZpbmUgRXZlbnRRdWV1ZVJlZl9DaGVjayh4KSAoKHgpLT5vYl90eXBlID09ICZFdmVudFF1ZXVlUmVmX1R5cGUgfHwgUHlPYmplY3RfVHlwZUNoZWNrKCh4KSwgJkV2ZW50UXVldWVSZWZfVHlwZSkpCiAKIHR5cGVkZWYgc3RydWN0IEV2ZW50UXVldWVSZWZPYmplY3QgewotCVB5T2JqZWN0X0hFQUQKLQlFdmVudFF1ZXVlUmVmIG9iX2l0c2VsZjsKKyAgICBQeU9iamVjdF9IRUFECisgICAgRXZlbnRRdWV1ZVJlZiBvYl9pdHNlbGY7CiB9IEV2ZW50UXVldWVSZWZPYmplY3Q7CiAKIFB5T2JqZWN0ICpFdmVudFF1ZXVlUmVmX05ldyhFdmVudFF1ZXVlUmVmIGl0c2VsZikKIHsKLQlFdmVudFF1ZXVlUmVmT2JqZWN0ICppdDsKLQlpdCA9IFB5T2JqZWN0X05FVyhFdmVudFF1ZXVlUmVmT2JqZWN0LCAmRXZlbnRRdWV1ZVJlZl9UeXBlKTsKLQlpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgRXZlbnRRdWV1ZVJlZk9iamVjdCAqaXQ7CisgICAgaXQgPSBQeU9iamVjdF9ORVcoRXZlbnRRdWV1ZVJlZk9iamVjdCwgJkV2ZW50UXVldWVSZWZfVHlwZSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIGl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogCiBpbnQgRXZlbnRRdWV1ZVJlZl9Db252ZXJ0KFB5T2JqZWN0ICp2LCBFdmVudFF1ZXVlUmVmICpwX2l0c2VsZikKIHsKLQlpZiAoIUV2ZW50UXVldWVSZWZfQ2hlY2sodikpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiRXZlbnRRdWV1ZVJlZiByZXF1aXJlZCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JKnBfaXRzZWxmID0gKChFdmVudFF1ZXVlUmVmT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKLQlyZXR1cm4gMTsKKyAgICBpZiAoIUV2ZW50UXVldWVSZWZfQ2hlY2sodikpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiRXZlbnRRdWV1ZVJlZiByZXF1aXJlZCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgKnBfaXRzZWxmID0gKChFdmVudFF1ZXVlUmVmT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIHZvaWQgRXZlbnRRdWV1ZVJlZl9kZWFsbG9jKEV2ZW50UXVldWVSZWZPYmplY3QgKnNlbGYpCiB7Ci0JLyogQ2xlYW51cCBvZiBzZWxmLT5vYl9pdHNlbGYgZ29lcyBoZXJlICovCi0Jc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKKyAgICAvKiBDbGVhbnVwIG9mIHNlbGYtPm9iX2l0c2VsZiBnb2VzIGhlcmUgKi8KKyAgICBzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkV2ZW50UXVldWVSZWZfUG9zdEV2ZW50VG9RdWV1ZShFdmVudFF1ZXVlUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUV2ZW50UmVmIGluRXZlbnQ7Ci0JU0ludDE2IGluUHJpb3JpdHk7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgRXZlbnRSZWZfQ29udmVydCwgJmluRXZlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICZpblByaW9yaXR5KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFBvc3RFdmVudFRvUXVldWUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICBpbkV2ZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgIGluUHJpb3JpdHkpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIEV2ZW50UmVmIGluRXZlbnQ7CisgICAgU0ludDE2IGluUHJpb3JpdHk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRSZWZfQ29udmVydCwgJmluRXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblByaW9yaXR5KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFBvc3RFdmVudFRvUXVldWUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluUHJpb3JpdHkpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkV2ZW50UXVldWVSZWZfRmx1c2hFdmVudHNNYXRjaGluZ0xpc3RGcm9tUXVldWUoRXZlbnRRdWV1ZVJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MzIgaW5OdW1UeXBlczsKLQlFdmVudFR5cGVTcGVjIGluTGlzdDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5OdW1UeXBlcywKLQkgICAgICAgICAgICAgICAgICAgICAgRXZlbnRUeXBlU3BlY19Db252ZXJ0LCAmaW5MaXN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEZsdXNoRXZlbnRzTWF0Y2hpbmdMaXN0RnJvbVF1ZXVlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluTnVtVHlwZXMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkxpc3QpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQzMiBpbk51bVR5cGVzOworICAgIEV2ZW50VHlwZVNwZWMgaW5MaXN0OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbk51bVR5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudFR5cGVTcGVjX0NvbnZlcnQsICZpbkxpc3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRmx1c2hFdmVudHNNYXRjaGluZ0xpc3RGcm9tUXVldWUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5OdW1UeXBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluTGlzdCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRXZlbnRRdWV1ZVJlZl9GbHVzaEV2ZW50UXVldWUoRXZlbnRRdWV1ZVJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEZsdXNoRXZlbnRRdWV1ZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEZsdXNoRXZlbnRRdWV1ZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpFdmVudFF1ZXVlUmVmX0dldE51bUV2ZW50c0luUXVldWUoRXZlbnRRdWV1ZVJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVUludDMyIF9ydjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TnVtRXZlbnRzSW5RdWV1ZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVUludDMyIF9ydjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TnVtRXZlbnRzSW5RdWV1ZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpFdmVudFF1ZXVlUmVmX1JlbW92ZUV2ZW50RnJvbVF1ZXVlKEV2ZW50UXVldWVSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JRXZlbnRSZWYgaW5FdmVudDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIEV2ZW50UmVmX0NvbnZlcnQsICZpbkV2ZW50KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFJlbW92ZUV2ZW50RnJvbVF1ZXVlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRXZlbnQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIEV2ZW50UmVmIGluRXZlbnQ7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudFJlZl9Db252ZXJ0LCAmaW5FdmVudCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBSZW1vdmVFdmVudEZyb21RdWV1ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkV2ZW50KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpFdmVudFF1ZXVlUmVmX0lzRXZlbnRJblF1ZXVlKEV2ZW50UXVldWVSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCUV2ZW50UmVmIGluRXZlbnQ7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBFdmVudFJlZl9Db252ZXJ0LCAmaW5FdmVudCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IElzRXZlbnRJblF1ZXVlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgaW5FdmVudCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIEV2ZW50UmVmIGluRXZlbnQ7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudFJlZl9Db252ZXJ0LCAmaW5FdmVudCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IElzRXZlbnRJblF1ZXVlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW5FdmVudCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBFdmVudFF1ZXVlUmVmX21ldGhvZHNbXSA9IHsKLQl7IlBvc3RFdmVudFRvUXVldWUiLCAoUHlDRnVuY3Rpb24pRXZlbnRRdWV1ZVJlZl9Qb3N0RXZlbnRUb1F1ZXVlLCAxLAotCSBQeURvY19TVFIoIihFdmVudFJlZiBpbkV2ZW50LCBTSW50MTYgaW5Qcmlvcml0eSkgLT4gTm9uZSIpfSwKLQl7IkZsdXNoRXZlbnRzTWF0Y2hpbmdMaXN0RnJvbVF1ZXVlIiwgKFB5Q0Z1bmN0aW9uKUV2ZW50UXVldWVSZWZfRmx1c2hFdmVudHNNYXRjaGluZ0xpc3RGcm9tUXVldWUsIDEsCi0JIFB5RG9jX1NUUigiKFVJbnQzMiBpbk51bVR5cGVzLCBFdmVudFR5cGVTcGVjIGluTGlzdCkgLT4gTm9uZSIpfSwKLQl7IkZsdXNoRXZlbnRRdWV1ZSIsIChQeUNGdW5jdGlvbilFdmVudFF1ZXVlUmVmX0ZsdXNoRXZlbnRRdWV1ZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiR2V0TnVtRXZlbnRzSW5RdWV1ZSIsIChQeUNGdW5jdGlvbilFdmVudFF1ZXVlUmVmX0dldE51bUV2ZW50c0luUXVldWUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQzMiBfcnYpIil9LAotCXsiUmVtb3ZlRXZlbnRGcm9tUXVldWUiLCAoUHlDRnVuY3Rpb24pRXZlbnRRdWV1ZVJlZl9SZW1vdmVFdmVudEZyb21RdWV1ZSwgMSwKLQkgUHlEb2NfU1RSKCIoRXZlbnRSZWYgaW5FdmVudCkgLT4gTm9uZSIpfSwKLQl7IklzRXZlbnRJblF1ZXVlIiwgKFB5Q0Z1bmN0aW9uKUV2ZW50UXVldWVSZWZfSXNFdmVudEluUXVldWUsIDEsCi0JIFB5RG9jX1NUUigiKEV2ZW50UmVmIGluRXZlbnQpIC0+IChCb29sZWFuIF9ydikiKX0sCi0Je05VTEwsIE5VTEwsIDB9CisgICAgeyJQb3N0RXZlbnRUb1F1ZXVlIiwgKFB5Q0Z1bmN0aW9uKUV2ZW50UXVldWVSZWZfUG9zdEV2ZW50VG9RdWV1ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRXZlbnRSZWYgaW5FdmVudCwgU0ludDE2IGluUHJpb3JpdHkpIC0+IE5vbmUiKX0sCisgICAgeyJGbHVzaEV2ZW50c01hdGNoaW5nTGlzdEZyb21RdWV1ZSIsIChQeUNGdW5jdGlvbilFdmVudFF1ZXVlUmVmX0ZsdXNoRXZlbnRzTWF0Y2hpbmdMaXN0RnJvbVF1ZXVlLCAxLAorICAgICBQeURvY19TVFIoIihVSW50MzIgaW5OdW1UeXBlcywgRXZlbnRUeXBlU3BlYyBpbkxpc3QpIC0+IE5vbmUiKX0sCisgICAgeyJGbHVzaEV2ZW50UXVldWUiLCAoUHlDRnVuY3Rpb24pRXZlbnRRdWV1ZVJlZl9GbHVzaEV2ZW50UXVldWUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldE51bUV2ZW50c0luUXVldWUiLCAoUHlDRnVuY3Rpb24pRXZlbnRRdWV1ZVJlZl9HZXROdW1FdmVudHNJblF1ZXVlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChVSW50MzIgX3J2KSIpfSwKKyAgICB7IlJlbW92ZUV2ZW50RnJvbVF1ZXVlIiwgKFB5Q0Z1bmN0aW9uKUV2ZW50UXVldWVSZWZfUmVtb3ZlRXZlbnRGcm9tUXVldWUsIDEsCisgICAgIFB5RG9jX1NUUigiKEV2ZW50UmVmIGluRXZlbnQpIC0+IE5vbmUiKX0sCisgICAgeyJJc0V2ZW50SW5RdWV1ZSIsIChQeUNGdW5jdGlvbilFdmVudFF1ZXVlUmVmX0lzRXZlbnRJblF1ZXVlLCAxLAorICAgICBQeURvY19TVFIoIihFdmVudFJlZiBpbkV2ZW50KSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogI2RlZmluZSBFdmVudFF1ZXVlUmVmX2dldHNldGxpc3QgTlVMTApAQCAtNjIzLDYxICs2MjMsNjEgQEAKIAogc3RhdGljIFB5T2JqZWN0ICpFdmVudFF1ZXVlUmVmX3RwX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICpfYXJncywgUHlPYmplY3QgKl9rd2RzKQogewotCVB5T2JqZWN0ICpfc2VsZjsKLQlFdmVudFF1ZXVlUmVmIGl0c2VsZjsKLQljaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKKyAgICBQeU9iamVjdCAqX3NlbGY7CisgICAgRXZlbnRRdWV1ZVJlZiBpdHNlbGY7CisgICAgY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBFdmVudFF1ZXVlUmVmX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKLQlpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOwotCSgoRXZlbnRRdWV1ZVJlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiBfc2VsZjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBFdmVudFF1ZXVlUmVmX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOworICAgICgoRXZlbnRRdWV1ZVJlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIHJldHVybiBfc2VsZjsKIH0KIAogI2RlZmluZSBFdmVudFF1ZXVlUmVmX3RwX2ZyZWUgUHlPYmplY3RfRGVsCiAKIAogUHlUeXBlT2JqZWN0IEV2ZW50UXVldWVSZWZfVHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKLQkwLCAvKm9iX3NpemUqLwotCSJfQ2FyYm9uRXZ0LkV2ZW50UXVldWVSZWYiLCAvKnRwX25hbWUqLwotCXNpemVvZihFdmVudFF1ZXVlUmVmT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLwotCTAsIC8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcikgRXZlbnRRdWV1ZVJlZl9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsIC8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLwotCShjbXBmdW5jKSBFdmVudFF1ZXVlUmVmX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCi0JKHJlcHJmdW5jKSBFdmVudFF1ZXVlUmVmX3JlcHIsIC8qdHBfcmVwciovCi0JKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLwotCShQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCi0JKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCi0JKGhhc2hmdW5jKSBFdmVudFF1ZXVlUmVmX2hhc2gsIC8qdHBfaGFzaCovCi0JMCwgLyp0cF9jYWxsKi8KLQkwLCAvKnRwX3N0ciovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLwotCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCi0JMCwgLyp0cF9hc19idWZmZXIqLwotCVB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCTAsIC8qdHBfZG9jKi8KLQkwLCAvKnRwX3RyYXZlcnNlKi8KLQkwLCAvKnRwX2NsZWFyKi8KLQkwLCAvKnRwX3JpY2hjb21wYXJlKi8KLQkwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLQkwLCAvKnRwX2l0ZXIqLwotCTAsIC8qdHBfaXRlcm5leHQqLwotCUV2ZW50UXVldWVSZWZfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLwotCTAsIC8qdHBfbWVtYmVycyovCi0JRXZlbnRRdWV1ZVJlZl9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCi0JMCwgLyp0cF9iYXNlKi8KLQkwLCAvKnRwX2RpY3QqLwotCTAsIC8qdHBfZGVzY3JfZ2V0Ki8KLQkwLCAvKnRwX2Rlc2NyX3NldCovCi0JMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KLQlFdmVudFF1ZXVlUmVmX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KLQlFdmVudFF1ZXVlUmVmX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLwotCUV2ZW50UXVldWVSZWZfdHBfbmV3LCAvKiB0cF9uZXcgKi8KLQlFdmVudFF1ZXVlUmVmX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAvKm9iX3NpemUqLworICAgICJfQ2FyYm9uRXZ0LkV2ZW50UXVldWVSZWYiLCAvKnRwX25hbWUqLworICAgIHNpemVvZihFdmVudFF1ZXVlUmVmT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLworICAgIDAsIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcikgRXZlbnRRdWV1ZVJlZl9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgIDAsIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLworICAgIChzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLworICAgIChjbXBmdW5jKSBFdmVudFF1ZXVlUmVmX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCisgICAgKHJlcHJmdW5jKSBFdmVudFF1ZXVlUmVmX3JlcHIsIC8qdHBfcmVwciovCisgICAgKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLworICAgIChQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKSBFdmVudFF1ZXVlUmVmX2hhc2gsIC8qdHBfaGFzaCovCisgICAgMCwgLyp0cF9jYWxsKi8KKyAgICAwLCAvKnRwX3N0ciovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLworICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCisgICAgMCwgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLworICAgIDAsIC8qdHBfZG9jKi8KKyAgICAwLCAvKnRwX3RyYXZlcnNlKi8KKyAgICAwLCAvKnRwX2NsZWFyKi8KKyAgICAwLCAvKnRwX3JpY2hjb21wYXJlKi8KKyAgICAwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KKyAgICAwLCAvKnRwX2l0ZXIqLworICAgIDAsIC8qdHBfaXRlcm5leHQqLworICAgIEV2ZW50UXVldWVSZWZfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLworICAgIDAsIC8qdHBfbWVtYmVycyovCisgICAgRXZlbnRRdWV1ZVJlZl9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCisgICAgMCwgLyp0cF9iYXNlKi8KKyAgICAwLCAvKnRwX2RpY3QqLworICAgIDAsIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICBFdmVudFF1ZXVlUmVmX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KKyAgICBFdmVudFF1ZXVlUmVmX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLworICAgIEV2ZW50UXVldWVSZWZfdHBfbmV3LCAvKiB0cF9uZXcgKi8KKyAgICBFdmVudFF1ZXVlUmVmX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tIEVuZCBvYmplY3QgdHlwZSBFdmVudFF1ZXVlUmVmIC0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtNjkwLDUzICs2OTAsNTMgQEAKICNkZWZpbmUgRXZlbnRMb29wUmVmX0NoZWNrKHgpICgoeCktPm9iX3R5cGUgPT0gJkV2ZW50TG9vcFJlZl9UeXBlIHx8IFB5T2JqZWN0X1R5cGVDaGVjaygoeCksICZFdmVudExvb3BSZWZfVHlwZSkpCiAKIHR5cGVkZWYgc3RydWN0IEV2ZW50TG9vcFJlZk9iamVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCUV2ZW50TG9vcFJlZiBvYl9pdHNlbGY7CisgICAgUHlPYmplY3RfSEVBRAorICAgIEV2ZW50TG9vcFJlZiBvYl9pdHNlbGY7CiB9IEV2ZW50TG9vcFJlZk9iamVjdDsKIAogUHlPYmplY3QgKkV2ZW50TG9vcFJlZl9OZXcoRXZlbnRMb29wUmVmIGl0c2VsZikKIHsKLQlFdmVudExvb3BSZWZPYmplY3QgKml0OwotCWl0ID0gUHlPYmplY3RfTkVXKEV2ZW50TG9vcFJlZk9iamVjdCwgJkV2ZW50TG9vcFJlZl9UeXBlKTsKLQlpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgRXZlbnRMb29wUmVmT2JqZWN0ICppdDsKKyAgICBpdCA9IFB5T2JqZWN0X05FVyhFdmVudExvb3BSZWZPYmplY3QsICZFdmVudExvb3BSZWZfVHlwZSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIGl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogCiBpbnQgRXZlbnRMb29wUmVmX0NvbnZlcnQoUHlPYmplY3QgKnYsIEV2ZW50TG9vcFJlZiAqcF9pdHNlbGYpCiB7Ci0JaWYgKCFFdmVudExvb3BSZWZfQ2hlY2sodikpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiRXZlbnRMb29wUmVmIHJlcXVpcmVkIik7Ci0JCXJldHVybiAwOwotCX0KLQkqcF9pdHNlbGYgPSAoKEV2ZW50TG9vcFJlZk9iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0JcmV0dXJuIDE7CisgICAgaWYgKCFFdmVudExvb3BSZWZfQ2hlY2sodikpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiRXZlbnRMb29wUmVmIHJlcXVpcmVkIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAqcF9pdHNlbGYgPSAoKEV2ZW50TG9vcFJlZk9iamVjdCAqKXYpLT5vYl9pdHNlbGY7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyB2b2lkIEV2ZW50TG9vcFJlZl9kZWFsbG9jKEV2ZW50TG9vcFJlZk9iamVjdCAqc2VsZikKIHsKLQkvKiBDbGVhbnVwIG9mIHNlbGYtPm9iX2l0c2VsZiBnb2VzIGhlcmUgKi8KLQlzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOworICAgIC8qIENsZWFudXAgb2Ygc2VsZi0+b2JfaXRzZWxmIGdvZXMgaGVyZSAqLworICAgIHNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRXZlbnRMb29wUmVmX1F1aXRFdmVudExvb3AoRXZlbnRMb29wUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUXVpdEV2ZW50TG9vcChfc2VsZi0+b2JfaXRzZWxmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFF1aXRFdmVudExvb3AoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBFdmVudExvb3BSZWZfbWV0aG9kc1tdID0gewotCXsiUXVpdEV2ZW50TG9vcCIsIChQeUNGdW5jdGlvbilFdmVudExvb3BSZWZfUXVpdEV2ZW50TG9vcCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXtOVUxMLCBOVUxMLCAwfQorICAgIHsiUXVpdEV2ZW50TG9vcCIsIChQeUNGdW5jdGlvbilFdmVudExvb3BSZWZfUXVpdEV2ZW50TG9vcCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogI2RlZmluZSBFdmVudExvb3BSZWZfZ2V0c2V0bGlzdCBOVUxMCkBAIC03NTMsNjEgKzc1Myw2MSBAQAogCiBzdGF0aWMgUHlPYmplY3QgKkV2ZW50TG9vcFJlZl90cF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlQeU9iamVjdCAqX3NlbGY7Ci0JRXZlbnRMb29wUmVmIGl0c2VsZjsKLQljaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKKyAgICBQeU9iamVjdCAqX3NlbGY7CisgICAgRXZlbnRMb29wUmVmIGl0c2VsZjsKKyAgICBjaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIEV2ZW50TG9vcFJlZl9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7Ci0JaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkoKEV2ZW50TG9vcFJlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiBfc2VsZjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBFdmVudExvb3BSZWZfQ29udmVydCwgJml0c2VsZikpIHJldHVybiBOVUxMOworICAgIGlmICgoX3NlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgKChFdmVudExvb3BSZWZPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICByZXR1cm4gX3NlbGY7CiB9CiAKICNkZWZpbmUgRXZlbnRMb29wUmVmX3RwX2ZyZWUgUHlPYmplY3RfRGVsCiAKIAogUHlUeXBlT2JqZWN0IEV2ZW50TG9vcFJlZl9UeXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQotCTAsIC8qb2Jfc2l6ZSovCi0JIl9DYXJib25FdnQuRXZlbnRMb29wUmVmIiwgLyp0cF9uYW1lKi8KLQlzaXplb2YoRXZlbnRMb29wUmVmT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLwotCTAsIC8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcikgRXZlbnRMb29wUmVmX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCi0JMCwgLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCi0JKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCi0JKGNtcGZ1bmMpIEV2ZW50TG9vcFJlZl9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYykgRXZlbnRMb29wUmVmX3JlcHIsIC8qdHBfcmVwciovCi0JKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLwotCShQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCi0JKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCi0JKGhhc2hmdW5jKSBFdmVudExvb3BSZWZfaGFzaCwgLyp0cF9oYXNoKi8KLQkwLCAvKnRwX2NhbGwqLwotCTAsIC8qdHBfc3RyKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCi0JUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KLQkwLCAvKnRwX2FzX2J1ZmZlciovCi0JUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCi0JMCwgLyp0cF9kb2MqLwotCTAsIC8qdHBfdHJhdmVyc2UqLwotCTAsIC8qdHBfY2xlYXIqLwotCTAsIC8qdHBfcmljaGNvbXBhcmUqLwotCTAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLwotCTAsIC8qdHBfaXRlciovCi0JMCwgLyp0cF9pdGVybmV4dCovCi0JRXZlbnRMb29wUmVmX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KLQkwLCAvKnRwX21lbWJlcnMqLwotCUV2ZW50TG9vcFJlZl9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCi0JMCwgLyp0cF9iYXNlKi8KLQkwLCAvKnRwX2RpY3QqLwotCTAsIC8qdHBfZGVzY3JfZ2V0Ki8KLQkwLCAvKnRwX2Rlc2NyX3NldCovCi0JMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KLQlFdmVudExvb3BSZWZfdHBfaW5pdCwgLyogdHBfaW5pdCAqLwotCUV2ZW50TG9vcFJlZl90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KLQlFdmVudExvb3BSZWZfdHBfbmV3LCAvKiB0cF9uZXcgKi8KLQlFdmVudExvb3BSZWZfdHBfZnJlZSwgLyogdHBfZnJlZSAqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgIDAsIC8qb2Jfc2l6ZSovCisgICAgIl9DYXJib25FdnQuRXZlbnRMb29wUmVmIiwgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoRXZlbnRMb29wUmVmT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLworICAgIDAsIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcikgRXZlbnRMb29wUmVmX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgMCwgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCisgICAgKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCisgICAgKGNtcGZ1bmMpIEV2ZW50TG9vcFJlZl9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLworICAgIChyZXByZnVuYykgRXZlbnRMb29wUmVmX3JlcHIsIC8qdHBfcmVwciovCisgICAgKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLworICAgIChQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKSBFdmVudExvb3BSZWZfaGFzaCwgLyp0cF9oYXNoKi8KKyAgICAwLCAvKnRwX2NhbGwqLworICAgIDAsIC8qdHBfc3RyKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCisgICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgMCwgLyp0cF9kb2MqLworICAgIDAsIC8qdHBfdHJhdmVyc2UqLworICAgIDAsIC8qdHBfY2xlYXIqLworICAgIDAsIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsIC8qdHBfaXRlciovCisgICAgMCwgLyp0cF9pdGVybmV4dCovCisgICAgRXZlbnRMb29wUmVmX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAvKnRwX21lbWJlcnMqLworICAgIEV2ZW50TG9vcFJlZl9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCisgICAgMCwgLyp0cF9iYXNlKi8KKyAgICAwLCAvKnRwX2RpY3QqLworICAgIDAsIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICBFdmVudExvb3BSZWZfdHBfaW5pdCwgLyogdHBfaW5pdCAqLworICAgIEV2ZW50TG9vcFJlZl90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KKyAgICBFdmVudExvb3BSZWZfdHBfbmV3LCAvKiB0cF9uZXcgKi8KKyAgICBFdmVudExvb3BSZWZfdHBfZnJlZSwgLyogdHBfZnJlZSAqLwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tIEVuZCBvYmplY3QgdHlwZSBFdmVudExvb3BSZWYgLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC04MjAsNzEgKzgyMCw3MSBAQAogI2RlZmluZSBFdmVudExvb3BUaW1lclJlZl9DaGVjayh4KSAoKHgpLT5vYl90eXBlID09ICZFdmVudExvb3BUaW1lclJlZl9UeXBlIHx8IFB5T2JqZWN0X1R5cGVDaGVjaygoeCksICZFdmVudExvb3BUaW1lclJlZl9UeXBlKSkKIAogdHlwZWRlZiBzdHJ1Y3QgRXZlbnRMb29wVGltZXJSZWZPYmplY3QgewotCVB5T2JqZWN0X0hFQUQKLQlFdmVudExvb3BUaW1lclJlZiBvYl9pdHNlbGY7CisgICAgUHlPYmplY3RfSEVBRAorICAgIEV2ZW50TG9vcFRpbWVyUmVmIG9iX2l0c2VsZjsKIH0gRXZlbnRMb29wVGltZXJSZWZPYmplY3Q7CiAKIFB5T2JqZWN0ICpFdmVudExvb3BUaW1lclJlZl9OZXcoRXZlbnRMb29wVGltZXJSZWYgaXRzZWxmKQogewotCUV2ZW50TG9vcFRpbWVyUmVmT2JqZWN0ICppdDsKLQlpdCA9IFB5T2JqZWN0X05FVyhFdmVudExvb3BUaW1lclJlZk9iamVjdCwgJkV2ZW50TG9vcFRpbWVyUmVmX1R5cGUpOwotCWlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQlpdC0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiAoUHlPYmplY3QgKilpdDsKKyAgICBFdmVudExvb3BUaW1lclJlZk9iamVjdCAqaXQ7CisgICAgaXQgPSBQeU9iamVjdF9ORVcoRXZlbnRMb29wVGltZXJSZWZPYmplY3QsICZFdmVudExvb3BUaW1lclJlZl9UeXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiAKIGludCBFdmVudExvb3BUaW1lclJlZl9Db252ZXJ0KFB5T2JqZWN0ICp2LCBFdmVudExvb3BUaW1lclJlZiAqcF9pdHNlbGYpCiB7Ci0JaWYgKCFFdmVudExvb3BUaW1lclJlZl9DaGVjayh2KSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJFdmVudExvb3BUaW1lclJlZiByZXF1aXJlZCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JKnBfaXRzZWxmID0gKChFdmVudExvb3BUaW1lclJlZk9iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0JcmV0dXJuIDE7CisgICAgaWYgKCFFdmVudExvb3BUaW1lclJlZl9DaGVjayh2KSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJFdmVudExvb3BUaW1lclJlZiByZXF1aXJlZCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgKnBfaXRzZWxmID0gKChFdmVudExvb3BUaW1lclJlZk9iamVjdCAqKXYpLT5vYl9pdHNlbGY7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyB2b2lkIEV2ZW50TG9vcFRpbWVyUmVmX2RlYWxsb2MoRXZlbnRMb29wVGltZXJSZWZPYmplY3QgKnNlbGYpCiB7Ci0JLyogQ2xlYW51cCBvZiBzZWxmLT5vYl9pdHNlbGYgZ29lcyBoZXJlICovCi0Jc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKKyAgICAvKiBDbGVhbnVwIG9mIHNlbGYtPm9iX2l0c2VsZiBnb2VzIGhlcmUgKi8KKyAgICBzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkV2ZW50TG9vcFRpbWVyUmVmX1JlbW92ZUV2ZW50TG9vcFRpbWVyKEV2ZW50TG9vcFRpbWVyUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUmVtb3ZlRXZlbnRMb29wVGltZXIoX3NlbGYtPm9iX2l0c2VsZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBSZW1vdmVFdmVudExvb3BUaW1lcihfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpFdmVudExvb3BUaW1lclJlZl9TZXRFdmVudExvb3BUaW1lck5leHRGaXJlVGltZShFdmVudExvb3BUaW1lclJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlkb3VibGUgaW5OZXh0RmlyZTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJkIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluTmV4dEZpcmUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0RXZlbnRMb29wVGltZXJOZXh0RmlyZVRpbWUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5OZXh0RmlyZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgZG91YmxlIGluTmV4dEZpcmU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbk5leHRGaXJlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldEV2ZW50TG9vcFRpbWVyTmV4dEZpcmVUaW1lKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluTmV4dEZpcmUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgRXZlbnRMb29wVGltZXJSZWZfbWV0aG9kc1tdID0gewotCXsiUmVtb3ZlRXZlbnRMb29wVGltZXIiLCAoUHlDRnVuY3Rpb24pRXZlbnRMb29wVGltZXJSZWZfUmVtb3ZlRXZlbnRMb29wVGltZXIsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IlNldEV2ZW50TG9vcFRpbWVyTmV4dEZpcmVUaW1lIiwgKFB5Q0Z1bmN0aW9uKUV2ZW50TG9vcFRpbWVyUmVmX1NldEV2ZW50TG9vcFRpbWVyTmV4dEZpcmVUaW1lLCAxLAotCSBQeURvY19TVFIoIihkb3VibGUgaW5OZXh0RmlyZSkgLT4gTm9uZSIpfSwKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7IlJlbW92ZUV2ZW50TG9vcFRpbWVyIiwgKFB5Q0Z1bmN0aW9uKUV2ZW50TG9vcFRpbWVyUmVmX1JlbW92ZUV2ZW50TG9vcFRpbWVyLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJTZXRFdmVudExvb3BUaW1lck5leHRGaXJlVGltZSIsIChQeUNGdW5jdGlvbilFdmVudExvb3BUaW1lclJlZl9TZXRFdmVudExvb3BUaW1lck5leHRGaXJlVGltZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoZG91YmxlIGluTmV4dEZpcmUpIC0+IE5vbmUiKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAjZGVmaW5lIEV2ZW50TG9vcFRpbWVyUmVmX2dldHNldGxpc3QgTlVMTApAQCAtOTAxLDYxICs5MDEsNjEgQEAKIAogc3RhdGljIFB5T2JqZWN0ICpFdmVudExvb3BUaW1lclJlZl90cF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlQeU9iamVjdCAqX3NlbGY7Ci0JRXZlbnRMb29wVGltZXJSZWYgaXRzZWxmOwotCWNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OworICAgIFB5T2JqZWN0ICpfc2VsZjsKKyAgICBFdmVudExvb3BUaW1lclJlZiBpdHNlbGY7CisgICAgY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBFdmVudExvb3BUaW1lclJlZl9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7Ci0JaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkoKEV2ZW50TG9vcFRpbWVyUmVmT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JcmV0dXJuIF9zZWxmOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIEV2ZW50TG9vcFRpbWVyUmVmX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOworICAgICgoRXZlbnRMb29wVGltZXJSZWZPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICByZXR1cm4gX3NlbGY7CiB9CiAKICNkZWZpbmUgRXZlbnRMb29wVGltZXJSZWZfdHBfZnJlZSBQeU9iamVjdF9EZWwKIAogCiBQeVR5cGVPYmplY3QgRXZlbnRMb29wVGltZXJSZWZfVHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKLQkwLCAvKm9iX3NpemUqLwotCSJfQ2FyYm9uRXZ0LkV2ZW50TG9vcFRpbWVyUmVmIiwgLyp0cF9uYW1lKi8KLQlzaXplb2YoRXZlbnRMb29wVGltZXJSZWZPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCi0JMCwgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKSBFdmVudExvb3BUaW1lclJlZl9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsIC8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLwotCShjbXBmdW5jKSBFdmVudExvb3BUaW1lclJlZl9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYykgRXZlbnRMb29wVGltZXJSZWZfcmVwciwgLyp0cF9yZXByKi8KLQkoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCi0JKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpIEV2ZW50TG9vcFRpbWVyUmVmX2hhc2gsIC8qdHBfaGFzaCovCi0JMCwgLyp0cF9jYWxsKi8KLQkwLCAvKnRwX3N0ciovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLwotCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCi0JMCwgLyp0cF9hc19idWZmZXIqLwotCVB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCTAsIC8qdHBfZG9jKi8KLQkwLCAvKnRwX3RyYXZlcnNlKi8KLQkwLCAvKnRwX2NsZWFyKi8KLQkwLCAvKnRwX3JpY2hjb21wYXJlKi8KLQkwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLQkwLCAvKnRwX2l0ZXIqLwotCTAsIC8qdHBfaXRlcm5leHQqLwotCUV2ZW50TG9vcFRpbWVyUmVmX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KLQkwLCAvKnRwX21lbWJlcnMqLwotCUV2ZW50TG9vcFRpbWVyUmVmX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KLQkwLCAvKnRwX2Jhc2UqLwotCTAsIC8qdHBfZGljdCovCi0JMCwgLyp0cF9kZXNjcl9nZXQqLwotCTAsIC8qdHBfZGVzY3Jfc2V0Ki8KLQkwLCAvKnRwX2RpY3RvZmZzZXQqLwotCUV2ZW50TG9vcFRpbWVyUmVmX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KLQlFdmVudExvb3BUaW1lclJlZl90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KLQlFdmVudExvb3BUaW1lclJlZl90cF9uZXcsIC8qIHRwX25ldyAqLwotCUV2ZW50TG9vcFRpbWVyUmVmX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAvKm9iX3NpemUqLworICAgICJfQ2FyYm9uRXZ0LkV2ZW50TG9vcFRpbWVyUmVmIiwgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoRXZlbnRMb29wVGltZXJSZWZPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKSBFdmVudExvb3BUaW1lclJlZl9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgIDAsIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLworICAgIChzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLworICAgIChjbXBmdW5jKSBFdmVudExvb3BUaW1lclJlZl9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLworICAgIChyZXByZnVuYykgRXZlbnRMb29wVGltZXJSZWZfcmVwciwgLyp0cF9yZXByKi8KKyAgICAoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCisgICAgKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAoaGFzaGZ1bmMpIEV2ZW50TG9vcFRpbWVyUmVmX2hhc2gsIC8qdHBfaGFzaCovCisgICAgMCwgLyp0cF9jYWxsKi8KKyAgICAwLCAvKnRwX3N0ciovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLworICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCisgICAgMCwgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLworICAgIDAsIC8qdHBfZG9jKi8KKyAgICAwLCAvKnRwX3RyYXZlcnNlKi8KKyAgICAwLCAvKnRwX2NsZWFyKi8KKyAgICAwLCAvKnRwX3JpY2hjb21wYXJlKi8KKyAgICAwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KKyAgICAwLCAvKnRwX2l0ZXIqLworICAgIDAsIC8qdHBfaXRlcm5leHQqLworICAgIEV2ZW50TG9vcFRpbWVyUmVmX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAvKnRwX21lbWJlcnMqLworICAgIEV2ZW50TG9vcFRpbWVyUmVmX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KKyAgICAwLCAvKnRwX2Jhc2UqLworICAgIDAsIC8qdHBfZGljdCovCisgICAgMCwgLyp0cF9kZXNjcl9nZXQqLworICAgIDAsIC8qdHBfZGVzY3Jfc2V0Ki8KKyAgICAwLCAvKnRwX2RpY3RvZmZzZXQqLworICAgIEV2ZW50TG9vcFRpbWVyUmVmX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KKyAgICBFdmVudExvb3BUaW1lclJlZl90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KKyAgICBFdmVudExvb3BUaW1lclJlZl90cF9uZXcsIC8qIHRwX25ldyAqLworICAgIEV2ZW50TG9vcFRpbWVyUmVmX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLSBFbmQgb2JqZWN0IHR5cGUgRXZlbnRMb29wVGltZXJSZWYgLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtOTY4LDExNiArOTY4LDExNiBAQAogI2RlZmluZSBFdmVudEhhbmRsZXJSZWZfQ2hlY2soeCkgKCh4KS0+b2JfdHlwZSA9PSAmRXZlbnRIYW5kbGVyUmVmX1R5cGUgfHwgUHlPYmplY3RfVHlwZUNoZWNrKCh4KSwgJkV2ZW50SGFuZGxlclJlZl9UeXBlKSkKIAogdHlwZWRlZiBzdHJ1Y3QgRXZlbnRIYW5kbGVyUmVmT2JqZWN0IHsKLQlQeU9iamVjdF9IRUFECi0JRXZlbnRIYW5kbGVyUmVmIG9iX2l0c2VsZjsKLQlQeU9iamVjdCAqb2JfY2FsbGJhY2s7CisgICAgUHlPYmplY3RfSEVBRAorICAgIEV2ZW50SGFuZGxlclJlZiBvYl9pdHNlbGY7CisgICAgUHlPYmplY3QgKm9iX2NhbGxiYWNrOwogfSBFdmVudEhhbmRsZXJSZWZPYmplY3Q7CiAKIFB5T2JqZWN0ICpFdmVudEhhbmRsZXJSZWZfTmV3KEV2ZW50SGFuZGxlclJlZiBpdHNlbGYpCiB7Ci0JRXZlbnRIYW5kbGVyUmVmT2JqZWN0ICppdDsKLQlpdCA9IFB5T2JqZWN0X05FVyhFdmVudEhhbmRsZXJSZWZPYmplY3QsICZFdmVudEhhbmRsZXJSZWZfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOwotCWl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JaXQtPm9iX2NhbGxiYWNrID0gTlVMTDsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgRXZlbnRIYW5kbGVyUmVmT2JqZWN0ICppdDsKKyAgICBpdCA9IFB5T2JqZWN0X05FVyhFdmVudEhhbmRsZXJSZWZPYmplY3QsICZFdmVudEhhbmRsZXJSZWZfVHlwZSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIGl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgaXQtPm9iX2NhbGxiYWNrID0gTlVMTDsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiAKIGludCBFdmVudEhhbmRsZXJSZWZfQ29udmVydChQeU9iamVjdCAqdiwgRXZlbnRIYW5kbGVyUmVmICpwX2l0c2VsZikKIHsKLQlpZiAoIUV2ZW50SGFuZGxlclJlZl9DaGVjayh2KSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJFdmVudEhhbmRsZXJSZWYgcmVxdWlyZWQiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCSpwX2l0c2VsZiA9ICgoRXZlbnRIYW5kbGVyUmVmT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKLQlyZXR1cm4gMTsKKyAgICBpZiAoIUV2ZW50SGFuZGxlclJlZl9DaGVjayh2KSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJFdmVudEhhbmRsZXJSZWYgcmVxdWlyZWQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICpwX2l0c2VsZiA9ICgoRXZlbnRIYW5kbGVyUmVmT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIHZvaWQgRXZlbnRIYW5kbGVyUmVmX2RlYWxsb2MoRXZlbnRIYW5kbGVyUmVmT2JqZWN0ICpzZWxmKQogewotCWlmIChzZWxmLT5vYl9pdHNlbGYgIT0gTlVMTCkgewotCQlSZW1vdmVFdmVudEhhbmRsZXIoc2VsZi0+b2JfaXRzZWxmKTsKLQkJUHlfREVDUkVGKHNlbGYtPm9iX2NhbGxiYWNrKTsKLQl9Ci0Jc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKKyAgICBpZiAoc2VsZi0+b2JfaXRzZWxmICE9IE5VTEwpIHsKKyAgICAgICAgUmVtb3ZlRXZlbnRIYW5kbGVyKHNlbGYtPm9iX2l0c2VsZik7CisgICAgICAgIFB5X0RFQ1JFRihzZWxmLT5vYl9jYWxsYmFjayk7CisgICAgfQorICAgIHNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRXZlbnRIYW5kbGVyUmVmX0FkZEV2ZW50VHlwZXNUb0hhbmRsZXIoRXZlbnRIYW5kbGVyUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVVJbnQzMiBpbk51bVR5cGVzOwotCUV2ZW50VHlwZVNwZWMgaW5MaXN0OwotCWlmIChfc2VsZi0+b2JfaXRzZWxmID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKENhcmJvbkV2ZW50c19FcnJvciwgIkhhbmRsZXIgaGFzIGJlZW4gcmVtb3ZlZCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluTnVtVHlwZXMsCi0JICAgICAgICAgICAgICAgICAgICAgIEV2ZW50VHlwZVNwZWNfQ29udmVydCwgJmluTGlzdCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBZGRFdmVudFR5cGVzVG9IYW5kbGVyKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5OdW1UeXBlcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5MaXN0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBVSW50MzIgaW5OdW1UeXBlczsKKyAgICBFdmVudFR5cGVTcGVjIGluTGlzdDsKKyAgICBpZiAoX3NlbGYtPm9iX2l0c2VsZiA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhDYXJib25FdmVudHNfRXJyb3IsICJIYW5kbGVyIGhhcyBiZWVuIHJlbW92ZWQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbk51bVR5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudFR5cGVTcGVjX0NvbnZlcnQsICZpbkxpc3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQWRkRXZlbnRUeXBlc1RvSGFuZGxlcihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluTnVtVHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluTGlzdCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRXZlbnRIYW5kbGVyUmVmX1JlbW92ZUV2ZW50VHlwZXNGcm9tSGFuZGxlcihFdmVudEhhbmRsZXJSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVUludDMyIGluTnVtVHlwZXM7Ci0JRXZlbnRUeXBlU3BlYyBpbkxpc3Q7Ci0JaWYgKF9zZWxmLT5vYl9pdHNlbGYgPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoQ2FyYm9uRXZlbnRzX0Vycm9yLCAiSGFuZGxlciBoYXMgYmVlbiByZW1vdmVkIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5OdW1UeXBlcywKLQkgICAgICAgICAgICAgICAgICAgICAgRXZlbnRUeXBlU3BlY19Db252ZXJ0LCAmaW5MaXN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFJlbW92ZUV2ZW50VHlwZXNGcm9tSGFuZGxlcihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5OdW1UeXBlcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkxpc3QpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQzMiBpbk51bVR5cGVzOworICAgIEV2ZW50VHlwZVNwZWMgaW5MaXN0OworICAgIGlmIChfc2VsZi0+b2JfaXRzZWxmID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKENhcmJvbkV2ZW50c19FcnJvciwgIkhhbmRsZXIgaGFzIGJlZW4gcmVtb3ZlZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluTnVtVHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50VHlwZVNwZWNfQ29udmVydCwgJmluTGlzdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBSZW1vdmVFdmVudFR5cGVzRnJvbUhhbmRsZXIoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluTnVtVHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5MaXN0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpFdmVudEhhbmRsZXJSZWZfUmVtb3ZlRXZlbnRIYW5kbGVyKEV2ZW50SGFuZGxlclJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogCi0JT1NTdGF0dXMgX2VycjsKLQlpZiAoX3NlbGYtPm9iX2l0c2VsZiA9PSBOVUxMKSB7Ci0JICAgICAgICBQeUVycl9TZXRTdHJpbmcoQ2FyYm9uRXZlbnRzX0Vycm9yLCAiSGFuZGxlciBoYXMgYmVlbiByZW1vdmVkIik7Ci0JICAgICAgICByZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JICAgICAgICByZXR1cm4gTlVMTDsKLQlfZXJyID0gUmVtb3ZlRXZlbnRIYW5kbGVyKF9zZWxmLT5vYl9pdHNlbGYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3NlbGYtPm9iX2l0c2VsZiA9IE5VTEw7Ci0JUHlfREVDUkVGKF9zZWxmLT5vYl9jYWxsYmFjayk7Ci0JX3NlbGYtPm9iX2NhbGxiYWNrID0gTlVMTDsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBpZiAoX3NlbGYtPm9iX2l0c2VsZiA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhDYXJib25FdmVudHNfRXJyb3IsICJIYW5kbGVyIGhhcyBiZWVuIHJlbW92ZWQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUmVtb3ZlRXZlbnRIYW5kbGVyKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3NlbGYtPm9iX2l0c2VsZiA9IE5VTEw7CisgICAgUHlfREVDUkVGKF9zZWxmLT5vYl9jYWxsYmFjayk7CisgICAgX3NlbGYtPm9iX2NhbGxiYWNrID0gTlVMTDsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBFdmVudEhhbmRsZXJSZWZfbWV0aG9kc1tdID0gewotCXsiQWRkRXZlbnRUeXBlc1RvSGFuZGxlciIsIChQeUNGdW5jdGlvbilFdmVudEhhbmRsZXJSZWZfQWRkRXZlbnRUeXBlc1RvSGFuZGxlciwgMSwKLQkgUHlEb2NfU1RSKCIoVUludDMyIGluTnVtVHlwZXMsIEV2ZW50VHlwZVNwZWMgaW5MaXN0KSAtPiBOb25lIil9LAotCXsiUmVtb3ZlRXZlbnRUeXBlc0Zyb21IYW5kbGVyIiwgKFB5Q0Z1bmN0aW9uKUV2ZW50SGFuZGxlclJlZl9SZW1vdmVFdmVudFR5cGVzRnJvbUhhbmRsZXIsIDEsCi0JIFB5RG9jX1NUUigiKFVJbnQzMiBpbk51bVR5cGVzLCBFdmVudFR5cGVTcGVjIGluTGlzdCkgLT4gTm9uZSIpfSwKLQl7IlJlbW92ZUV2ZW50SGFuZGxlciIsIChQeUNGdW5jdGlvbilFdmVudEhhbmRsZXJSZWZfUmVtb3ZlRXZlbnRIYW5kbGVyLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0Je05VTEwsIE5VTEwsIDB9CisgICAgeyJBZGRFdmVudFR5cGVzVG9IYW5kbGVyIiwgKFB5Q0Z1bmN0aW9uKUV2ZW50SGFuZGxlclJlZl9BZGRFdmVudFR5cGVzVG9IYW5kbGVyLCAxLAorICAgICBQeURvY19TVFIoIihVSW50MzIgaW5OdW1UeXBlcywgRXZlbnRUeXBlU3BlYyBpbkxpc3QpIC0+IE5vbmUiKX0sCisgICAgeyJSZW1vdmVFdmVudFR5cGVzRnJvbUhhbmRsZXIiLCAoUHlDRnVuY3Rpb24pRXZlbnRIYW5kbGVyUmVmX1JlbW92ZUV2ZW50VHlwZXNGcm9tSGFuZGxlciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVUludDMyIGluTnVtVHlwZXMsIEV2ZW50VHlwZVNwZWMgaW5MaXN0KSAtPiBOb25lIil9LAorICAgIHsiUmVtb3ZlRXZlbnRIYW5kbGVyIiwgKFB5Q0Z1bmN0aW9uKUV2ZW50SGFuZGxlclJlZl9SZW1vdmVFdmVudEhhbmRsZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKICNkZWZpbmUgRXZlbnRIYW5kbGVyUmVmX2dldHNldGxpc3QgTlVMTApAQCAtMTA5NCw2MSArMTA5NCw2MSBAQAogCiBzdGF0aWMgUHlPYmplY3QgKkV2ZW50SGFuZGxlclJlZl90cF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlQeU9iamVjdCAqX3NlbGY7Ci0JRXZlbnRIYW5kbGVyUmVmIGl0c2VsZjsKLQljaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKKyAgICBQeU9iamVjdCAqX3NlbGY7CisgICAgRXZlbnRIYW5kbGVyUmVmIGl0c2VsZjsKKyAgICBjaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIEV2ZW50SGFuZGxlclJlZl9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7Ci0JaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkoKEV2ZW50SGFuZGxlclJlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiBfc2VsZjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBFdmVudEhhbmRsZXJSZWZfQ29udmVydCwgJml0c2VsZikpIHJldHVybiBOVUxMOworICAgIGlmICgoX3NlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgKChFdmVudEhhbmRsZXJSZWZPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICByZXR1cm4gX3NlbGY7CiB9CiAKICNkZWZpbmUgRXZlbnRIYW5kbGVyUmVmX3RwX2ZyZWUgUHlPYmplY3RfRGVsCiAKIAogUHlUeXBlT2JqZWN0IEV2ZW50SGFuZGxlclJlZl9UeXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQotCTAsIC8qb2Jfc2l6ZSovCi0JIl9DYXJib25FdnQuRXZlbnRIYW5kbGVyUmVmIiwgLyp0cF9uYW1lKi8KLQlzaXplb2YoRXZlbnRIYW5kbGVyUmVmT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLwotCTAsIC8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcikgRXZlbnRIYW5kbGVyUmVmX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCi0JMCwgLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCi0JKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCi0JKGNtcGZ1bmMpIEV2ZW50SGFuZGxlclJlZl9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYykgRXZlbnRIYW5kbGVyUmVmX3JlcHIsIC8qdHBfcmVwciovCi0JKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLwotCShQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCi0JKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCi0JKGhhc2hmdW5jKSBFdmVudEhhbmRsZXJSZWZfaGFzaCwgLyp0cF9oYXNoKi8KLQkwLCAvKnRwX2NhbGwqLwotCTAsIC8qdHBfc3RyKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCi0JUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KLQkwLCAvKnRwX2FzX2J1ZmZlciovCi0JUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCi0JMCwgLyp0cF9kb2MqLwotCTAsIC8qdHBfdHJhdmVyc2UqLwotCTAsIC8qdHBfY2xlYXIqLwotCTAsIC8qdHBfcmljaGNvbXBhcmUqLwotCTAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLwotCTAsIC8qdHBfaXRlciovCi0JMCwgLyp0cF9pdGVybmV4dCovCi0JRXZlbnRIYW5kbGVyUmVmX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KLQkwLCAvKnRwX21lbWJlcnMqLwotCUV2ZW50SGFuZGxlclJlZl9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCi0JMCwgLyp0cF9iYXNlKi8KLQkwLCAvKnRwX2RpY3QqLwotCTAsIC8qdHBfZGVzY3JfZ2V0Ki8KLQkwLCAvKnRwX2Rlc2NyX3NldCovCi0JMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KLQlFdmVudEhhbmRsZXJSZWZfdHBfaW5pdCwgLyogdHBfaW5pdCAqLwotCUV2ZW50SGFuZGxlclJlZl90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KLQlFdmVudEhhbmRsZXJSZWZfdHBfbmV3LCAvKiB0cF9uZXcgKi8KLQlFdmVudEhhbmRsZXJSZWZfdHBfZnJlZSwgLyogdHBfZnJlZSAqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgIDAsIC8qb2Jfc2l6ZSovCisgICAgIl9DYXJib25FdnQuRXZlbnRIYW5kbGVyUmVmIiwgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoRXZlbnRIYW5kbGVyUmVmT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLworICAgIDAsIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcikgRXZlbnRIYW5kbGVyUmVmX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgMCwgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCisgICAgKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCisgICAgKGNtcGZ1bmMpIEV2ZW50SGFuZGxlclJlZl9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLworICAgIChyZXByZnVuYykgRXZlbnRIYW5kbGVyUmVmX3JlcHIsIC8qdHBfcmVwciovCisgICAgKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLworICAgIChQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKSBFdmVudEhhbmRsZXJSZWZfaGFzaCwgLyp0cF9oYXNoKi8KKyAgICAwLCAvKnRwX2NhbGwqLworICAgIDAsIC8qdHBfc3RyKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCisgICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgMCwgLyp0cF9kb2MqLworICAgIDAsIC8qdHBfdHJhdmVyc2UqLworICAgIDAsIC8qdHBfY2xlYXIqLworICAgIDAsIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsIC8qdHBfaXRlciovCisgICAgMCwgLyp0cF9pdGVybmV4dCovCisgICAgRXZlbnRIYW5kbGVyUmVmX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAvKnRwX21lbWJlcnMqLworICAgIEV2ZW50SGFuZGxlclJlZl9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCisgICAgMCwgLyp0cF9iYXNlKi8KKyAgICAwLCAvKnRwX2RpY3QqLworICAgIDAsIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICBFdmVudEhhbmRsZXJSZWZfdHBfaW5pdCwgLyogdHBfaW5pdCAqLworICAgIEV2ZW50SGFuZGxlclJlZl90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KKyAgICBFdmVudEhhbmRsZXJSZWZfdHBfbmV3LCAvKiB0cF9uZXcgKi8KKyAgICBFdmVudEhhbmRsZXJSZWZfdHBfZnJlZSwgLyogdHBfZnJlZSAqLwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLSBFbmQgb2JqZWN0IHR5cGUgRXZlbnRIYW5kbGVyUmVmIC0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0xMTYxLDU2ICsxMTYxLDU2IEBACiAjZGVmaW5lIEV2ZW50SGFuZGxlckNhbGxSZWZfQ2hlY2soeCkgKCh4KS0+b2JfdHlwZSA9PSAmRXZlbnRIYW5kbGVyQ2FsbFJlZl9UeXBlIHx8IFB5T2JqZWN0X1R5cGVDaGVjaygoeCksICZFdmVudEhhbmRsZXJDYWxsUmVmX1R5cGUpKQogCiB0eXBlZGVmIHN0cnVjdCBFdmVudEhhbmRsZXJDYWxsUmVmT2JqZWN0IHsKLQlQeU9iamVjdF9IRUFECi0JRXZlbnRIYW5kbGVyQ2FsbFJlZiBvYl9pdHNlbGY7CisgICAgUHlPYmplY3RfSEVBRAorICAgIEV2ZW50SGFuZGxlckNhbGxSZWYgb2JfaXRzZWxmOwogfSBFdmVudEhhbmRsZXJDYWxsUmVmT2JqZWN0OwogCiBQeU9iamVjdCAqRXZlbnRIYW5kbGVyQ2FsbFJlZl9OZXcoRXZlbnRIYW5kbGVyQ2FsbFJlZiBpdHNlbGYpCiB7Ci0JRXZlbnRIYW5kbGVyQ2FsbFJlZk9iamVjdCAqaXQ7Ci0JaXQgPSBQeU9iamVjdF9ORVcoRXZlbnRIYW5kbGVyQ2FsbFJlZk9iamVjdCwgJkV2ZW50SGFuZGxlckNhbGxSZWZfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOwotCWl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIEV2ZW50SGFuZGxlckNhbGxSZWZPYmplY3QgKml0OworICAgIGl0ID0gUHlPYmplY3RfTkVXKEV2ZW50SGFuZGxlckNhbGxSZWZPYmplY3QsICZFdmVudEhhbmRsZXJDYWxsUmVmX1R5cGUpOworICAgIGlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICBpdC0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIHJldHVybiAoUHlPYmplY3QgKilpdDsKIH0KIAogaW50IEV2ZW50SGFuZGxlckNhbGxSZWZfQ29udmVydChQeU9iamVjdCAqdiwgRXZlbnRIYW5kbGVyQ2FsbFJlZiAqcF9pdHNlbGYpCiB7Ci0JaWYgKCFFdmVudEhhbmRsZXJDYWxsUmVmX0NoZWNrKHYpKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkV2ZW50SGFuZGxlckNhbGxSZWYgcmVxdWlyZWQiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCSpwX2l0c2VsZiA9ICgoRXZlbnRIYW5kbGVyQ2FsbFJlZk9iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0JcmV0dXJuIDE7CisgICAgaWYgKCFFdmVudEhhbmRsZXJDYWxsUmVmX0NoZWNrKHYpKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkV2ZW50SGFuZGxlckNhbGxSZWYgcmVxdWlyZWQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICpwX2l0c2VsZiA9ICgoRXZlbnRIYW5kbGVyQ2FsbFJlZk9iamVjdCAqKXYpLT5vYl9pdHNlbGY7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyB2b2lkIEV2ZW50SGFuZGxlckNhbGxSZWZfZGVhbGxvYyhFdmVudEhhbmRsZXJDYWxsUmVmT2JqZWN0ICpzZWxmKQogewotCS8qIENsZWFudXAgb2Ygc2VsZi0+b2JfaXRzZWxmIGdvZXMgaGVyZSAqLwotCXNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CisgICAgLyogQ2xlYW51cCBvZiBzZWxmLT5vYl9pdHNlbGYgZ29lcyBoZXJlICovCisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpFdmVudEhhbmRsZXJDYWxsUmVmX0NhbGxOZXh0RXZlbnRIYW5kbGVyKEV2ZW50SGFuZGxlckNhbGxSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JRXZlbnRSZWYgaW5FdmVudDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIEV2ZW50UmVmX0NvbnZlcnQsICZpbkV2ZW50KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENhbGxOZXh0RXZlbnRIYW5kbGVyKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRXZlbnQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIEV2ZW50UmVmIGluRXZlbnQ7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudFJlZl9Db252ZXJ0LCAmaW5FdmVudCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDYWxsTmV4dEV2ZW50SGFuZGxlcihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkV2ZW50KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIEV2ZW50SGFuZGxlckNhbGxSZWZfbWV0aG9kc1tdID0gewotCXsiQ2FsbE5leHRFdmVudEhhbmRsZXIiLCAoUHlDRnVuY3Rpb24pRXZlbnRIYW5kbGVyQ2FsbFJlZl9DYWxsTmV4dEV2ZW50SGFuZGxlciwgMSwKLQkgUHlEb2NfU1RSKCIoRXZlbnRSZWYgaW5FdmVudCkgLT4gTm9uZSIpfSwKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7IkNhbGxOZXh0RXZlbnRIYW5kbGVyIiwgKFB5Q0Z1bmN0aW9uKUV2ZW50SGFuZGxlckNhbGxSZWZfQ2FsbE5leHRFdmVudEhhbmRsZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKEV2ZW50UmVmIGluRXZlbnQpIC0+IE5vbmUiKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAjZGVmaW5lIEV2ZW50SGFuZGxlckNhbGxSZWZfZ2V0c2V0bGlzdCBOVUxMCkBAIC0xMjI3LDYxICsxMjI3LDYxIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqRXZlbnRIYW5kbGVyQ2FsbFJlZl90cF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlQeU9iamVjdCAqX3NlbGY7Ci0JRXZlbnRIYW5kbGVyQ2FsbFJlZiBpdHNlbGY7Ci0JY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CisgICAgUHlPYmplY3QgKl9zZWxmOworICAgIEV2ZW50SGFuZGxlckNhbGxSZWYgaXRzZWxmOworICAgIGNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgRXZlbnRIYW5kbGVyQ2FsbFJlZl9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7Ci0JaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkoKEV2ZW50SGFuZGxlckNhbGxSZWZPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlyZXR1cm4gX3NlbGY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgRXZlbnRIYW5kbGVyQ2FsbFJlZl9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAoKEV2ZW50SGFuZGxlckNhbGxSZWZPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICByZXR1cm4gX3NlbGY7CiB9CiAKICNkZWZpbmUgRXZlbnRIYW5kbGVyQ2FsbFJlZl90cF9mcmVlIFB5T2JqZWN0X0RlbAogCiAKIFB5VHlwZU9iamVjdCBFdmVudEhhbmRsZXJDYWxsUmVmX1R5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCi0JMCwgLypvYl9zaXplKi8KLQkiX0NhcmJvbkV2dC5FdmVudEhhbmRsZXJDYWxsUmVmIiwgLyp0cF9uYW1lKi8KLQlzaXplb2YoRXZlbnRIYW5kbGVyQ2FsbFJlZk9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KLQkwLCAvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpIEV2ZW50SGFuZGxlckNhbGxSZWZfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KLQkwLCAvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykgRXZlbnRIYW5kbGVyQ2FsbFJlZl9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYykgRXZlbnRIYW5kbGVyQ2FsbFJlZl9yZXByLCAvKnRwX3JlcHIqLwotCShQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KLQkoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLwotCShQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYykgRXZlbnRIYW5kbGVyQ2FsbFJlZl9oYXNoLCAvKnRwX2hhc2gqLwotCTAsIC8qdHBfY2FsbCovCi0JMCwgLyp0cF9zdHIqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KLQlQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLwotCTAsIC8qdHBfYXNfYnVmZmVyKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQkwLCAvKnRwX2RvYyovCi0JMCwgLyp0cF90cmF2ZXJzZSovCi0JMCwgLyp0cF9jbGVhciovCi0JMCwgLyp0cF9yaWNoY29tcGFyZSovCi0JMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCi0JMCwgLyp0cF9pdGVyKi8KLQkwLCAvKnRwX2l0ZXJuZXh0Ki8KLQlFdmVudEhhbmRsZXJDYWxsUmVmX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KLQkwLCAvKnRwX21lbWJlcnMqLwotCUV2ZW50SGFuZGxlckNhbGxSZWZfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLwotCTAsIC8qdHBfYmFzZSovCi0JMCwgLyp0cF9kaWN0Ki8KLQkwLCAvKnRwX2Rlc2NyX2dldCovCi0JMCwgLyp0cF9kZXNjcl9zZXQqLwotCTAsIC8qdHBfZGljdG9mZnNldCovCi0JRXZlbnRIYW5kbGVyQ2FsbFJlZl90cF9pbml0LCAvKiB0cF9pbml0ICovCi0JRXZlbnRIYW5kbGVyQ2FsbFJlZl90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KLQlFdmVudEhhbmRsZXJDYWxsUmVmX3RwX25ldywgLyogdHBfbmV3ICovCi0JRXZlbnRIYW5kbGVyQ2FsbFJlZl90cF9mcmVlLCAvKiB0cF9mcmVlICovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgLypvYl9zaXplKi8KKyAgICAiX0NhcmJvbkV2dC5FdmVudEhhbmRsZXJDYWxsUmVmIiwgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoRXZlbnRIYW5kbGVyQ2FsbFJlZk9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpIEV2ZW50SGFuZGxlckNhbGxSZWZfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KKyAgICAoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KKyAgICAoY21wZnVuYykgRXZlbnRIYW5kbGVyQ2FsbFJlZl9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLworICAgIChyZXByZnVuYykgRXZlbnRIYW5kbGVyQ2FsbFJlZl9yZXByLCAvKnRwX3JlcHIqLworICAgIChQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIChQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLworICAgIChoYXNoZnVuYykgRXZlbnRIYW5kbGVyQ2FsbFJlZl9oYXNoLCAvKnRwX2hhc2gqLworICAgIDAsIC8qdHBfY2FsbCovCisgICAgMCwgLyp0cF9zdHIqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KKyAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLworICAgIDAsIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAvKnRwX2RvYyovCisgICAgMCwgLyp0cF90cmF2ZXJzZSovCisgICAgMCwgLyp0cF9jbGVhciovCisgICAgMCwgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgLyp0cF9pdGVyKi8KKyAgICAwLCAvKnRwX2l0ZXJuZXh0Ki8KKyAgICBFdmVudEhhbmRsZXJDYWxsUmVmX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAvKnRwX21lbWJlcnMqLworICAgIEV2ZW50SGFuZGxlckNhbGxSZWZfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLworICAgIDAsIC8qdHBfYmFzZSovCisgICAgMCwgLyp0cF9kaWN0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX2dldCovCisgICAgMCwgLyp0cF9kZXNjcl9zZXQqLworICAgIDAsIC8qdHBfZGljdG9mZnNldCovCisgICAgRXZlbnRIYW5kbGVyQ2FsbFJlZl90cF9pbml0LCAvKiB0cF9pbml0ICovCisgICAgRXZlbnRIYW5kbGVyQ2FsbFJlZl90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KKyAgICBFdmVudEhhbmRsZXJDYWxsUmVmX3RwX25ldywgLyogdHBfbmV3ICovCisgICAgRXZlbnRIYW5kbGVyQ2FsbFJlZl90cF9mcmVlLCAvKiB0cF9mcmVlICovCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLSBFbmQgb2JqZWN0IHR5cGUgRXZlbnRIYW5kbGVyQ2FsbFJlZiAtLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTEyOTQsNzggKzEyOTQsNzggQEAKICNkZWZpbmUgRXZlbnRUYXJnZXRSZWZfQ2hlY2soeCkgKCh4KS0+b2JfdHlwZSA9PSAmRXZlbnRUYXJnZXRSZWZfVHlwZSB8fCBQeU9iamVjdF9UeXBlQ2hlY2soKHgpLCAmRXZlbnRUYXJnZXRSZWZfVHlwZSkpCiAKIHR5cGVkZWYgc3RydWN0IEV2ZW50VGFyZ2V0UmVmT2JqZWN0IHsKLQlQeU9iamVjdF9IRUFECi0JRXZlbnRUYXJnZXRSZWYgb2JfaXRzZWxmOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBFdmVudFRhcmdldFJlZiBvYl9pdHNlbGY7CiB9IEV2ZW50VGFyZ2V0UmVmT2JqZWN0OwogCiBQeU9iamVjdCAqRXZlbnRUYXJnZXRSZWZfTmV3KEV2ZW50VGFyZ2V0UmVmIGl0c2VsZikKIHsKLQlFdmVudFRhcmdldFJlZk9iamVjdCAqaXQ7Ci0JaXQgPSBQeU9iamVjdF9ORVcoRXZlbnRUYXJnZXRSZWZPYmplY3QsICZFdmVudFRhcmdldFJlZl9UeXBlKTsKLQlpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgRXZlbnRUYXJnZXRSZWZPYmplY3QgKml0OworICAgIGl0ID0gUHlPYmplY3RfTkVXKEV2ZW50VGFyZ2V0UmVmT2JqZWN0LCAmRXZlbnRUYXJnZXRSZWZfVHlwZSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIGl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogCiBpbnQgRXZlbnRUYXJnZXRSZWZfQ29udmVydChQeU9iamVjdCAqdiwgRXZlbnRUYXJnZXRSZWYgKnBfaXRzZWxmKQogewotCWlmICghRXZlbnRUYXJnZXRSZWZfQ2hlY2sodikpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiRXZlbnRUYXJnZXRSZWYgcmVxdWlyZWQiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCSpwX2l0c2VsZiA9ICgoRXZlbnRUYXJnZXRSZWZPYmplY3QgKil2KS0+b2JfaXRzZWxmOwotCXJldHVybiAxOworICAgIGlmICghRXZlbnRUYXJnZXRSZWZfQ2hlY2sodikpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiRXZlbnRUYXJnZXRSZWYgcmVxdWlyZWQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICpwX2l0c2VsZiA9ICgoRXZlbnRUYXJnZXRSZWZPYmplY3QgKil2KS0+b2JfaXRzZWxmOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgdm9pZCBFdmVudFRhcmdldFJlZl9kZWFsbG9jKEV2ZW50VGFyZ2V0UmVmT2JqZWN0ICpzZWxmKQogewotCS8qIENsZWFudXAgb2Ygc2VsZi0+b2JfaXRzZWxmIGdvZXMgaGVyZSAqLwotCXNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CisgICAgLyogQ2xlYW51cCBvZiBzZWxmLT5vYl9pdHNlbGYgZ29lcyBoZXJlICovCisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpFdmVudFRhcmdldFJlZl9JbnN0YWxsU3RhbmRhcmRFdmVudEhhbmRsZXIoRXZlbnRUYXJnZXRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBJbnN0YWxsU3RhbmRhcmRFdmVudEhhbmRsZXIoX3NlbGYtPm9iX2l0c2VsZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBJbnN0YWxsU3RhbmRhcmRFdmVudEhhbmRsZXIoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRXZlbnRUYXJnZXRSZWZfSW5zdGFsbEV2ZW50SGFuZGxlcihFdmVudFRhcmdldFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogCi0JRXZlbnRUeXBlU3BlYyBpblNwZWM7Ci0JUHlPYmplY3QgKmNhbGxiYWNrOwotCUV2ZW50SGFuZGxlclJlZiBvdXRSZWY7Ci0JT1NTdGF0dXMgX2VycjsKKyAgICBFdmVudFR5cGVTcGVjIGluU3BlYzsKKyAgICBQeU9iamVjdCAqY2FsbGJhY2s7CisgICAgRXZlbnRIYW5kbGVyUmVmIG91dFJlZjsKKyAgICBPU1N0YXR1cyBfZXJyOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPIiwgRXZlbnRUeXBlU3BlY19Db252ZXJ0LCAmaW5TcGVjLCAmY2FsbGJhY2spKQotCSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPIiwgRXZlbnRUeXBlU3BlY19Db252ZXJ0LCAmaW5TcGVjLCAmY2FsbGJhY2spKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCV9lcnIgPSBJbnN0YWxsRXZlbnRIYW5kbGVyKF9zZWxmLT5vYl9pdHNlbGYsIG15RXZlbnRIYW5kbGVyVVBQLCAxLCAmaW5TcGVjLCAodm9pZCAqKWNhbGxiYWNrLCAmb3V0UmVmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9lcnIgPSBJbnN0YWxsRXZlbnRIYW5kbGVyKF9zZWxmLT5vYl9pdHNlbGYsIG15RXZlbnRIYW5kbGVyVVBQLCAxLCAmaW5TcGVjLCAodm9pZCAqKWNhbGxiYWNrLCAmb3V0UmVmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwogCi0JX3JlcyA9IEV2ZW50SGFuZGxlclJlZl9OZXcob3V0UmVmKTsKLQlpZiAoX3JlcyAhPSBOVUxMKSB7Ci0JICAgICAgICAoKEV2ZW50SGFuZGxlclJlZk9iamVjdCopX3JlcyktPm9iX2NhbGxiYWNrID0gY2FsbGJhY2s7Ci0JICAgICAgICBQeV9JTkNSRUYoY2FsbGJhY2spOwotCX0KLQlyZXR1cm4gX3JlczsKKyAgICBfcmVzID0gRXZlbnRIYW5kbGVyUmVmX05ldyhvdXRSZWYpOworICAgIGlmIChfcmVzICE9IE5VTEwpIHsKKyAgICAgICAgKChFdmVudEhhbmRsZXJSZWZPYmplY3QqKV9yZXMpLT5vYl9jYWxsYmFjayA9IGNhbGxiYWNrOworICAgICAgICBQeV9JTkNSRUYoY2FsbGJhY2spOworICAgIH0KKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIEV2ZW50VGFyZ2V0UmVmX21ldGhvZHNbXSA9IHsKLQl7Ikluc3RhbGxTdGFuZGFyZEV2ZW50SGFuZGxlciIsIChQeUNGdW5jdGlvbilFdmVudFRhcmdldFJlZl9JbnN0YWxsU3RhbmRhcmRFdmVudEhhbmRsZXIsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7Ikluc3RhbGxFdmVudEhhbmRsZXIiLCAoUHlDRnVuY3Rpb24pRXZlbnRUYXJnZXRSZWZfSW5zdGFsbEV2ZW50SGFuZGxlciwgMSwKLQkgUHlEb2NfU1RSKCIoRXZlbnRUeXBlU3BlYyBpblNwZWMsIE1ldGhvZCBjYWxsYmFjaykgLT4gKEV2ZW50SGFuZGxlclJlZiBvdXRSZWYpIil9LAotCXtOVUxMLCBOVUxMLCAwfQorICAgIHsiSW5zdGFsbFN0YW5kYXJkRXZlbnRIYW5kbGVyIiwgKFB5Q0Z1bmN0aW9uKUV2ZW50VGFyZ2V0UmVmX0luc3RhbGxTdGFuZGFyZEV2ZW50SGFuZGxlciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiSW5zdGFsbEV2ZW50SGFuZGxlciIsIChQeUNGdW5jdGlvbilFdmVudFRhcmdldFJlZl9JbnN0YWxsRXZlbnRIYW5kbGVyLCAxLAorICAgICBQeURvY19TVFIoIihFdmVudFR5cGVTcGVjIGluU3BlYywgTWV0aG9kIGNhbGxiYWNrKSAtPiAoRXZlbnRIYW5kbGVyUmVmIG91dFJlZikiKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAjZGVmaW5lIEV2ZW50VGFyZ2V0UmVmX2dldHNldGxpc3QgTlVMTApAQCAtMTM4Miw2MSArMTM4Miw2MSBAQAogCiBzdGF0aWMgUHlPYmplY3QgKkV2ZW50VGFyZ2V0UmVmX3RwX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICpfYXJncywgUHlPYmplY3QgKl9rd2RzKQogewotCVB5T2JqZWN0ICpfc2VsZjsKLQlFdmVudFRhcmdldFJlZiBpdHNlbGY7Ci0JY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CisgICAgUHlPYmplY3QgKl9zZWxmOworICAgIEV2ZW50VGFyZ2V0UmVmIGl0c2VsZjsKKyAgICBjaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIEV2ZW50VGFyZ2V0UmVmX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKLQlpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOwotCSgoRXZlbnRUYXJnZXRSZWZPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlyZXR1cm4gX3NlbGY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgRXZlbnRUYXJnZXRSZWZfQ29udmVydCwgJml0c2VsZikpIHJldHVybiBOVUxMOworICAgIGlmICgoX3NlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgKChFdmVudFRhcmdldFJlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIHJldHVybiBfc2VsZjsKIH0KIAogI2RlZmluZSBFdmVudFRhcmdldFJlZl90cF9mcmVlIFB5T2JqZWN0X0RlbAogCiAKIFB5VHlwZU9iamVjdCBFdmVudFRhcmdldFJlZl9UeXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQotCTAsIC8qb2Jfc2l6ZSovCi0JIl9DYXJib25FdnQuRXZlbnRUYXJnZXRSZWYiLCAvKnRwX25hbWUqLwotCXNpemVvZihFdmVudFRhcmdldFJlZk9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KLQkwLCAvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpIEV2ZW50VGFyZ2V0UmVmX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCi0JMCwgLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCi0JKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCi0JKGNtcGZ1bmMpIEV2ZW50VGFyZ2V0UmVmX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCi0JKHJlcHJmdW5jKSBFdmVudFRhcmdldFJlZl9yZXByLCAvKnRwX3JlcHIqLwotCShQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KLQkoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLwotCShQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYykgRXZlbnRUYXJnZXRSZWZfaGFzaCwgLyp0cF9oYXNoKi8KLQkwLCAvKnRwX2NhbGwqLwotCTAsIC8qdHBfc3RyKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCi0JUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KLQkwLCAvKnRwX2FzX2J1ZmZlciovCi0JUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCi0JMCwgLyp0cF9kb2MqLwotCTAsIC8qdHBfdHJhdmVyc2UqLwotCTAsIC8qdHBfY2xlYXIqLwotCTAsIC8qdHBfcmljaGNvbXBhcmUqLwotCTAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLwotCTAsIC8qdHBfaXRlciovCi0JMCwgLyp0cF9pdGVybmV4dCovCi0JRXZlbnRUYXJnZXRSZWZfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLwotCTAsIC8qdHBfbWVtYmVycyovCi0JRXZlbnRUYXJnZXRSZWZfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLwotCTAsIC8qdHBfYmFzZSovCi0JMCwgLyp0cF9kaWN0Ki8KLQkwLCAvKnRwX2Rlc2NyX2dldCovCi0JMCwgLyp0cF9kZXNjcl9zZXQqLwotCTAsIC8qdHBfZGljdG9mZnNldCovCi0JRXZlbnRUYXJnZXRSZWZfdHBfaW5pdCwgLyogdHBfaW5pdCAqLwotCUV2ZW50VGFyZ2V0UmVmX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLwotCUV2ZW50VGFyZ2V0UmVmX3RwX25ldywgLyogdHBfbmV3ICovCi0JRXZlbnRUYXJnZXRSZWZfdHBfZnJlZSwgLyogdHBfZnJlZSAqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgIDAsIC8qb2Jfc2l6ZSovCisgICAgIl9DYXJib25FdnQuRXZlbnRUYXJnZXRSZWYiLCAvKnRwX25hbWUqLworICAgIHNpemVvZihFdmVudFRhcmdldFJlZk9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpIEV2ZW50VGFyZ2V0UmVmX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgMCwgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCisgICAgKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCisgICAgKGNtcGZ1bmMpIEV2ZW50VGFyZ2V0UmVmX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCisgICAgKHJlcHJmdW5jKSBFdmVudFRhcmdldFJlZl9yZXByLCAvKnRwX3JlcHIqLworICAgIChQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIChQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLworICAgIChoYXNoZnVuYykgRXZlbnRUYXJnZXRSZWZfaGFzaCwgLyp0cF9oYXNoKi8KKyAgICAwLCAvKnRwX2NhbGwqLworICAgIDAsIC8qdHBfc3RyKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCisgICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgMCwgLyp0cF9kb2MqLworICAgIDAsIC8qdHBfdHJhdmVyc2UqLworICAgIDAsIC8qdHBfY2xlYXIqLworICAgIDAsIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsIC8qdHBfaXRlciovCisgICAgMCwgLyp0cF9pdGVybmV4dCovCisgICAgRXZlbnRUYXJnZXRSZWZfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLworICAgIDAsIC8qdHBfbWVtYmVycyovCisgICAgRXZlbnRUYXJnZXRSZWZfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLworICAgIDAsIC8qdHBfYmFzZSovCisgICAgMCwgLyp0cF9kaWN0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX2dldCovCisgICAgMCwgLyp0cF9kZXNjcl9zZXQqLworICAgIDAsIC8qdHBfZGljdG9mZnNldCovCisgICAgRXZlbnRUYXJnZXRSZWZfdHBfaW5pdCwgLyogdHBfaW5pdCAqLworICAgIEV2ZW50VGFyZ2V0UmVmX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLworICAgIEV2ZW50VGFyZ2V0UmVmX3RwX25ldywgLyogdHBfbmV3ICovCisgICAgRXZlbnRUYXJnZXRSZWZfdHBfZnJlZSwgLyogdHBfZnJlZSAqLwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0gRW5kIG9iamVjdCB0eXBlIEV2ZW50VGFyZ2V0UmVmIC0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0xNDQ5LDUzICsxNDQ5LDUzIEBACiAjZGVmaW5lIEV2ZW50SG90S2V5UmVmX0NoZWNrKHgpICgoeCktPm9iX3R5cGUgPT0gJkV2ZW50SG90S2V5UmVmX1R5cGUgfHwgUHlPYmplY3RfVHlwZUNoZWNrKCh4KSwgJkV2ZW50SG90S2V5UmVmX1R5cGUpKQogCiB0eXBlZGVmIHN0cnVjdCBFdmVudEhvdEtleVJlZk9iamVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCUV2ZW50SG90S2V5UmVmIG9iX2l0c2VsZjsKKyAgICBQeU9iamVjdF9IRUFECisgICAgRXZlbnRIb3RLZXlSZWYgb2JfaXRzZWxmOwogfSBFdmVudEhvdEtleVJlZk9iamVjdDsKIAogUHlPYmplY3QgKkV2ZW50SG90S2V5UmVmX05ldyhFdmVudEhvdEtleVJlZiBpdHNlbGYpCiB7Ci0JRXZlbnRIb3RLZXlSZWZPYmplY3QgKml0OwotCWl0ID0gUHlPYmplY3RfTkVXKEV2ZW50SG90S2V5UmVmT2JqZWN0LCAmRXZlbnRIb3RLZXlSZWZfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOwotCWl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIEV2ZW50SG90S2V5UmVmT2JqZWN0ICppdDsKKyAgICBpdCA9IFB5T2JqZWN0X05FVyhFdmVudEhvdEtleVJlZk9iamVjdCwgJkV2ZW50SG90S2V5UmVmX1R5cGUpOworICAgIGlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICBpdC0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIHJldHVybiAoUHlPYmplY3QgKilpdDsKIH0KIAogaW50IEV2ZW50SG90S2V5UmVmX0NvbnZlcnQoUHlPYmplY3QgKnYsIEV2ZW50SG90S2V5UmVmICpwX2l0c2VsZikKIHsKLQlpZiAoIUV2ZW50SG90S2V5UmVmX0NoZWNrKHYpKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkV2ZW50SG90S2V5UmVmIHJlcXVpcmVkIik7Ci0JCXJldHVybiAwOwotCX0KLQkqcF9pdHNlbGYgPSAoKEV2ZW50SG90S2V5UmVmT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKLQlyZXR1cm4gMTsKKyAgICBpZiAoIUV2ZW50SG90S2V5UmVmX0NoZWNrKHYpKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkV2ZW50SG90S2V5UmVmIHJlcXVpcmVkIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAqcF9pdHNlbGYgPSAoKEV2ZW50SG90S2V5UmVmT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIHZvaWQgRXZlbnRIb3RLZXlSZWZfZGVhbGxvYyhFdmVudEhvdEtleVJlZk9iamVjdCAqc2VsZikKIHsKLQkvKiBDbGVhbnVwIG9mIHNlbGYtPm9iX2l0c2VsZiBnb2VzIGhlcmUgKi8KLQlzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOworICAgIC8qIENsZWFudXAgb2Ygc2VsZi0+b2JfaXRzZWxmIGdvZXMgaGVyZSAqLworICAgIHNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRXZlbnRIb3RLZXlSZWZfVW5yZWdpc3RlckV2ZW50SG90S2V5KEV2ZW50SG90S2V5UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gVW5yZWdpc3RlckV2ZW50SG90S2V5KF9zZWxmLT5vYl9pdHNlbGYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVW5yZWdpc3RlckV2ZW50SG90S2V5KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgRXZlbnRIb3RLZXlSZWZfbWV0aG9kc1tdID0gewotCXsiVW5yZWdpc3RlckV2ZW50SG90S2V5IiwgKFB5Q0Z1bmN0aW9uKUV2ZW50SG90S2V5UmVmX1VucmVnaXN0ZXJFdmVudEhvdEtleSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXtOVUxMLCBOVUxMLCAwfQorICAgIHsiVW5yZWdpc3RlckV2ZW50SG90S2V5IiwgKFB5Q0Z1bmN0aW9uKUV2ZW50SG90S2V5UmVmX1VucmVnaXN0ZXJFdmVudEhvdEtleSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogI2RlZmluZSBFdmVudEhvdEtleVJlZl9nZXRzZXRsaXN0IE5VTEwKQEAgLTE1MTIsNjEgKzE1MTIsNjEgQEAKIAogc3RhdGljIFB5T2JqZWN0ICpFdmVudEhvdEtleVJlZl90cF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlQeU9iamVjdCAqX3NlbGY7Ci0JRXZlbnRIb3RLZXlSZWYgaXRzZWxmOwotCWNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OworICAgIFB5T2JqZWN0ICpfc2VsZjsKKyAgICBFdmVudEhvdEtleVJlZiBpdHNlbGY7CisgICAgY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBFdmVudEhvdEtleVJlZl9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7Ci0JaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkoKEV2ZW50SG90S2V5UmVmT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JcmV0dXJuIF9zZWxmOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIEV2ZW50SG90S2V5UmVmX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOworICAgICgoRXZlbnRIb3RLZXlSZWZPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICByZXR1cm4gX3NlbGY7CiB9CiAKICNkZWZpbmUgRXZlbnRIb3RLZXlSZWZfdHBfZnJlZSBQeU9iamVjdF9EZWwKIAogCiBQeVR5cGVPYmplY3QgRXZlbnRIb3RLZXlSZWZfVHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKLQkwLCAvKm9iX3NpemUqLwotCSJfQ2FyYm9uRXZ0LkV2ZW50SG90S2V5UmVmIiwgLyp0cF9uYW1lKi8KLQlzaXplb2YoRXZlbnRIb3RLZXlSZWZPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCi0JMCwgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKSBFdmVudEhvdEtleVJlZl9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsIC8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLwotCShjbXBmdW5jKSBFdmVudEhvdEtleVJlZl9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYykgRXZlbnRIb3RLZXlSZWZfcmVwciwgLyp0cF9yZXByKi8KLQkoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCi0JKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpIEV2ZW50SG90S2V5UmVmX2hhc2gsIC8qdHBfaGFzaCovCi0JMCwgLyp0cF9jYWxsKi8KLQkwLCAvKnRwX3N0ciovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLwotCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCi0JMCwgLyp0cF9hc19idWZmZXIqLwotCVB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCTAsIC8qdHBfZG9jKi8KLQkwLCAvKnRwX3RyYXZlcnNlKi8KLQkwLCAvKnRwX2NsZWFyKi8KLQkwLCAvKnRwX3JpY2hjb21wYXJlKi8KLQkwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLQkwLCAvKnRwX2l0ZXIqLwotCTAsIC8qdHBfaXRlcm5leHQqLwotCUV2ZW50SG90S2V5UmVmX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KLQkwLCAvKnRwX21lbWJlcnMqLwotCUV2ZW50SG90S2V5UmVmX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KLQkwLCAvKnRwX2Jhc2UqLwotCTAsIC8qdHBfZGljdCovCi0JMCwgLyp0cF9kZXNjcl9nZXQqLwotCTAsIC8qdHBfZGVzY3Jfc2V0Ki8KLQkwLCAvKnRwX2RpY3RvZmZzZXQqLwotCUV2ZW50SG90S2V5UmVmX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KLQlFdmVudEhvdEtleVJlZl90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KLQlFdmVudEhvdEtleVJlZl90cF9uZXcsIC8qIHRwX25ldyAqLwotCUV2ZW50SG90S2V5UmVmX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAvKm9iX3NpemUqLworICAgICJfQ2FyYm9uRXZ0LkV2ZW50SG90S2V5UmVmIiwgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoRXZlbnRIb3RLZXlSZWZPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKSBFdmVudEhvdEtleVJlZl9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgIDAsIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLworICAgIChzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLworICAgIChjbXBmdW5jKSBFdmVudEhvdEtleVJlZl9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLworICAgIChyZXByZnVuYykgRXZlbnRIb3RLZXlSZWZfcmVwciwgLyp0cF9yZXByKi8KKyAgICAoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCisgICAgKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAoaGFzaGZ1bmMpIEV2ZW50SG90S2V5UmVmX2hhc2gsIC8qdHBfaGFzaCovCisgICAgMCwgLyp0cF9jYWxsKi8KKyAgICAwLCAvKnRwX3N0ciovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLworICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCisgICAgMCwgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLworICAgIDAsIC8qdHBfZG9jKi8KKyAgICAwLCAvKnRwX3RyYXZlcnNlKi8KKyAgICAwLCAvKnRwX2NsZWFyKi8KKyAgICAwLCAvKnRwX3JpY2hjb21wYXJlKi8KKyAgICAwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KKyAgICAwLCAvKnRwX2l0ZXIqLworICAgIDAsIC8qdHBfaXRlcm5leHQqLworICAgIEV2ZW50SG90S2V5UmVmX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAvKnRwX21lbWJlcnMqLworICAgIEV2ZW50SG90S2V5UmVmX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KKyAgICAwLCAvKnRwX2Jhc2UqLworICAgIDAsIC8qdHBfZGljdCovCisgICAgMCwgLyp0cF9kZXNjcl9nZXQqLworICAgIDAsIC8qdHBfZGVzY3Jfc2V0Ki8KKyAgICAwLCAvKnRwX2RpY3RvZmZzZXQqLworICAgIEV2ZW50SG90S2V5UmVmX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KKyAgICBFdmVudEhvdEtleVJlZl90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KKyAgICBFdmVudEhvdEtleVJlZl90cF9uZXcsIC8qIHRwX25ldyAqLworICAgIEV2ZW50SG90S2V5UmVmX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tIEVuZCBvYmplY3QgdHlwZSBFdmVudEhvdEtleVJlZiAtLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMTU3NCw1NzcgKzE1NzQsNTc3IEBACiAKIHN0YXRpYyBQeU9iamVjdCAqQ2FyYm9uRXZlbnRzX0dldEN1cnJlbnRFdmVudExvb3AoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUV2ZW50TG9vcFJlZiBfcnY7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldEN1cnJlbnRFdmVudExvb3AoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEV2ZW50TG9vcFJlZl9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEV2ZW50TG9vcFJlZiBfcnY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldEN1cnJlbnRFdmVudExvb3AoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50TG9vcFJlZl9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ2FyYm9uRXZlbnRzX0dldE1haW5FdmVudExvb3AoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUV2ZW50TG9vcFJlZiBfcnY7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldE1haW5FdmVudExvb3AoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEV2ZW50TG9vcFJlZl9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEV2ZW50TG9vcFJlZiBfcnY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE1haW5FdmVudExvb3AoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50TG9vcFJlZl9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ2FyYm9uRXZlbnRzX1J1bkN1cnJlbnRFdmVudExvb3AoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JZG91YmxlIGluVGltZW91dDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJkIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluVGltZW91dCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBSdW5DdXJyZW50RXZlbnRMb29wKGluVGltZW91dCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgZG91YmxlIGluVGltZW91dDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluVGltZW91dCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBSdW5DdXJyZW50RXZlbnRMb29wKGluVGltZW91dCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ2FyYm9uRXZlbnRzX1JlY2VpdmVOZXh0RXZlbnQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVUludDMyIGluTnVtVHlwZXM7Ci0JRXZlbnRUeXBlU3BlYyBpbkxpc3Q7Ci0JZG91YmxlIGluVGltZW91dDsKLQlCb29sZWFuIGluUHVsbEV2ZW50OwotCUV2ZW50UmVmIG91dEV2ZW50OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJmRiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluTnVtVHlwZXMsCi0JICAgICAgICAgICAgICAgICAgICAgIEV2ZW50VHlwZVNwZWNfQ29udmVydCwgJmluTGlzdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluVGltZW91dCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluUHVsbEV2ZW50KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFJlY2VpdmVOZXh0RXZlbnQoaW5OdW1UeXBlcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAmaW5MaXN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgIGluVGltZW91dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICBpblB1bGxFdmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAmb3V0RXZlbnQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBFdmVudFJlZl9OZXcsIG91dEV2ZW50KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBVSW50MzIgaW5OdW1UeXBlczsKKyAgICBFdmVudFR5cGVTcGVjIGluTGlzdDsKKyAgICBkb3VibGUgaW5UaW1lb3V0OworICAgIEJvb2xlYW4gaW5QdWxsRXZlbnQ7CisgICAgRXZlbnRSZWYgb3V0RXZlbnQ7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mZGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5OdW1UeXBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRUeXBlU3BlY19Db252ZXJ0LCAmaW5MaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5UaW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5QdWxsRXZlbnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUmVjZWl2ZU5leHRFdmVudChpbk51bVR5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5UaW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluUHVsbEV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRFdmVudCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50UmVmX05ldywgb3V0RXZlbnQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNhcmJvbkV2ZW50c19HZXRDdXJyZW50RXZlbnRRdWV1ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JRXZlbnRRdWV1ZVJlZiBfcnY7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldEN1cnJlbnRFdmVudFF1ZXVlKCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBFdmVudFF1ZXVlUmVmX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgRXZlbnRRdWV1ZVJlZiBfcnY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldEN1cnJlbnRFdmVudFF1ZXVlKCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudFF1ZXVlUmVmX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDYXJib25FdmVudHNfR2V0TWFpbkV2ZW50UXVldWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUV2ZW50UXVldWVSZWYgX3J2OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRNYWluRXZlbnRRdWV1ZSgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgRXZlbnRRdWV1ZVJlZl9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEV2ZW50UXVldWVSZWYgX3J2OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRNYWluRXZlbnRRdWV1ZSgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRRdWV1ZVJlZl9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ2FyYm9uRXZlbnRzX0dldEN1cnJlbnRFdmVudFRpbWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWRvdWJsZSBfcnY7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldEN1cnJlbnRFdmVudFRpbWUoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiZCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgZG91YmxlIF9ydjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0Q3VycmVudEV2ZW50VGltZSgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNhcmJvbkV2ZW50c19UcmFja01vdXNlTG9jYXRpb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JR3JhZlB0ciBpblBvcnQ7Ci0JUG9pbnQgb3V0UHQ7Ci0JVUludDE2IG91dFJlc3VsdDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfQ29udmVydCwgJmluUG9ydCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBUcmFja01vdXNlTG9jYXRpb24oaW5Qb3J0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFB0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFJlc3VsdCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZIIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFBvaW50LCBvdXRQdCwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRSZXN1bHQpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIEdyYWZQdHIgaW5Qb3J0OworICAgIFBvaW50IG91dFB0OworICAgIFVJbnQxNiBvdXRSZXN1bHQ7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX0NvbnZlcnQsICZpblBvcnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVHJhY2tNb3VzZUxvY2F0aW9uKGluUG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRQdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRSZXN1bHQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRQb2ludCwgb3V0UHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0UmVzdWx0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDYXJib25FdmVudHNfVHJhY2tNb3VzZUxvY2F0aW9uV2l0aE9wdGlvbnMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JR3JhZlB0ciBpblBvcnQ7Ci0JT3B0aW9uQml0cyBpbk9wdGlvbnM7Ci0JZG91YmxlIGluVGltZW91dDsKLQlQb2ludCBvdXRQdDsKLQlVSW50MzIgb3V0TW9kaWZpZXJzOwotCVVJbnQxNiBvdXRSZXN1bHQ7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsZCIsCi0JICAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfQ29udmVydCwgJmluUG9ydCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluT3B0aW9ucywKLQkgICAgICAgICAgICAgICAgICAgICAgJmluVGltZW91dCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBUcmFja01vdXNlTG9jYXRpb25XaXRoT3B0aW9ucyhpblBvcnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluT3B0aW9ucywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5UaW1lb3V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0UHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRNb2RpZmllcnMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRSZXN1bHQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mbEgiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUG9pbnQsIG91dFB0LAotCSAgICAgICAgICAgICAgICAgICAgIG91dE1vZGlmaWVycywKLQkgICAgICAgICAgICAgICAgICAgICBvdXRSZXN1bHQpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIEdyYWZQdHIgaW5Qb3J0OworICAgIE9wdGlvbkJpdHMgaW5PcHRpb25zOworICAgIGRvdWJsZSBpblRpbWVvdXQ7CisgICAgUG9pbnQgb3V0UHQ7CisgICAgVUludDMyIG91dE1vZGlmaWVyczsKKyAgICBVSW50MTYgb3V0UmVzdWx0OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX0NvbnZlcnQsICZpblBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbk9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblRpbWVvdXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVHJhY2tNb3VzZUxvY2F0aW9uV2l0aE9wdGlvbnMoaW5Qb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbk9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluVGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0TW9kaWZpZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0UmVzdWx0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmxIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFBvaW50LCBvdXRQdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRNb2RpZmllcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0UmVzdWx0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDYXJib25FdmVudHNfVHJhY2tNb3VzZVJlZ2lvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlHcmFmUHRyIGluUG9ydDsKLQlSZ25IYW5kbGUgaW5SZWdpb247Ci0JQm9vbGVhbiBpb1dhc0luUmduOwotCVVJbnQxNiBvdXRSZXN1bHQ7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmIiLAotCSAgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX0NvbnZlcnQsICZpblBvcnQsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaW5SZWdpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICZpb1dhc0luUmduKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFRyYWNrTW91c2VSZWdpb24oaW5Qb3J0LAotCSAgICAgICAgICAgICAgICAgICAgICAgIGluUmVnaW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICZpb1dhc0luUmduLAotCSAgICAgICAgICAgICAgICAgICAgICAgICZvdXRSZXN1bHQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImJIIiwKLQkgICAgICAgICAgICAgICAgICAgICBpb1dhc0luUmduLAotCSAgICAgICAgICAgICAgICAgICAgIG91dFJlc3VsdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgR3JhZlB0ciBpblBvcnQ7CisgICAgUmduSGFuZGxlIGluUmVnaW9uOworICAgIEJvb2xlYW4gaW9XYXNJblJnbjsKKyAgICBVSW50MTYgb3V0UmVzdWx0OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhZk9ial9Db252ZXJ0LCAmaW5Qb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmluUmVnaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW9XYXNJblJnbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBUcmFja01vdXNlUmVnaW9uKGluUG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblJlZ2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW9XYXNJblJnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0UmVzdWx0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW9XYXNJblJnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRSZXN1bHQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNhcmJvbkV2ZW50c19HZXRMYXN0VXNlckV2ZW50VGltZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JZG91YmxlIF9ydjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TGFzdFVzZXJFdmVudFRpbWUoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiZCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgZG91YmxlIF9ydjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TGFzdFVzZXJFdmVudFRpbWUoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDYXJib25FdmVudHNfSXNNb3VzZUNvYWxlc2NpbmdFbmFibGVkKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gSXNNb3VzZUNvYWxlc2NpbmdFbmFibGVkKCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBJc01vdXNlQ29hbGVzY2luZ0VuYWJsZWQoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDYXJib25FdmVudHNfU2V0TW91c2VDb2FsZXNjaW5nRW5hYmxlZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlCb29sZWFuIGluTmV3U3RhdGU7Ci0JQm9vbGVhbiBvdXRPbGRTdGF0ZTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluTmV3U3RhdGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0TW91c2VDb2FsZXNjaW5nRW5hYmxlZChpbk5ld1N0YXRlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRPbGRTdGF0ZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0T2xkU3RhdGUpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIEJvb2xlYW4gaW5OZXdTdGF0ZTsKKyAgICBCb29sZWFuIG91dE9sZFN0YXRlOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5OZXdTdGF0ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRNb3VzZUNvYWxlc2NpbmdFbmFibGVkKGluTmV3U3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dE9sZFN0YXRlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRPbGRTdGF0ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ2FyYm9uRXZlbnRzX0dldFdpbmRvd0V2ZW50VGFyZ2V0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlFdmVudFRhcmdldFJlZiBfcnY7Ci0JV2luZG93UHRyIGluV2luZG93OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpbldpbmRvdykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFdpbmRvd0V2ZW50VGFyZ2V0KGluV2luZG93KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEV2ZW50VGFyZ2V0UmVmX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgRXZlbnRUYXJnZXRSZWYgX3J2OworICAgIFdpbmRvd1B0ciBpbldpbmRvdzsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3cpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRXaW5kb3dFdmVudFRhcmdldChpbldpbmRvdyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudFRhcmdldFJlZl9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ2FyYm9uRXZlbnRzX0dldENvbnRyb2xFdmVudFRhcmdldChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JRXZlbnRUYXJnZXRSZWYgX3J2OwotCUNvbnRyb2xIYW5kbGUgaW5Db250cm9sOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX0NvbnZlcnQsICZpbkNvbnRyb2wpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRDb250cm9sRXZlbnRUYXJnZXQoaW5Db250cm9sKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEV2ZW50VGFyZ2V0UmVmX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgRXZlbnRUYXJnZXRSZWYgX3J2OworICAgIENvbnRyb2xIYW5kbGUgaW5Db250cm9sOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX0NvbnZlcnQsICZpbkNvbnRyb2wpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRDb250cm9sRXZlbnRUYXJnZXQoaW5Db250cm9sKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50VGFyZ2V0UmVmX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDYXJib25FdmVudHNfR2V0TWVudUV2ZW50VGFyZ2V0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlFdmVudFRhcmdldFJlZiBfcnY7Ci0JTWVudUhhbmRsZSBpbk1lbnU7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBNZW51T2JqX0NvbnZlcnQsICZpbk1lbnUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRNZW51RXZlbnRUYXJnZXQoaW5NZW51KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEV2ZW50VGFyZ2V0UmVmX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgRXZlbnRUYXJnZXRSZWYgX3J2OworICAgIE1lbnVIYW5kbGUgaW5NZW51OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTWVudU9ial9Db252ZXJ0LCAmaW5NZW51KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TWVudUV2ZW50VGFyZ2V0KGluTWVudSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudFRhcmdldFJlZl9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ2FyYm9uRXZlbnRzX0dldEFwcGxpY2F0aW9uRXZlbnRUYXJnZXQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUV2ZW50VGFyZ2V0UmVmIF9ydjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0QXBwbGljYXRpb25FdmVudFRhcmdldCgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgRXZlbnRUYXJnZXRSZWZfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBFdmVudFRhcmdldFJlZiBfcnY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldEFwcGxpY2F0aW9uRXZlbnRUYXJnZXQoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50VGFyZ2V0UmVmX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDYXJib25FdmVudHNfR2V0VXNlckZvY3VzRXZlbnRUYXJnZXQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUV2ZW50VGFyZ2V0UmVmIF9ydjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0VXNlckZvY3VzRXZlbnRUYXJnZXQoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEV2ZW50VGFyZ2V0UmVmX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgRXZlbnRUYXJnZXRSZWYgX3J2OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRVc2VyRm9jdXNFdmVudFRhcmdldCgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRUYXJnZXRSZWZfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNhcmJvbkV2ZW50c19HZXRFdmVudERpc3BhdGNoZXJUYXJnZXQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUV2ZW50VGFyZ2V0UmVmIF9ydjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0RXZlbnREaXNwYXRjaGVyVGFyZ2V0KCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBFdmVudFRhcmdldFJlZl9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEV2ZW50VGFyZ2V0UmVmIF9ydjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0RXZlbnREaXNwYXRjaGVyVGFyZ2V0KCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudFRhcmdldFJlZl9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ2FyYm9uRXZlbnRzX1J1bkFwcGxpY2F0aW9uRXZlbnRMb29wKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JUnVuQXBwbGljYXRpb25FdmVudExvb3AoKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBSdW5BcHBsaWNhdGlvbkV2ZW50TG9vcCgpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDYXJib25FdmVudHNfUXVpdEFwcGxpY2F0aW9uRXZlbnRMb29wKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JUXVpdEFwcGxpY2F0aW9uRXZlbnRMb29wKCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUXVpdEFwcGxpY2F0aW9uRXZlbnRMb29wKCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNhcmJvbkV2ZW50c19SdW5BcHBNb2RhbExvb3BGb3JXaW5kb3coUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93UHRyIGluV2luZG93OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpbldpbmRvdykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBSdW5BcHBNb2RhbExvb3BGb3JXaW5kb3coaW5XaW5kb3cpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd1B0ciBpbldpbmRvdzsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3cpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUnVuQXBwTW9kYWxMb29wRm9yV2luZG93KGluV2luZG93KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDYXJib25FdmVudHNfUXVpdEFwcE1vZGFsTG9vcEZvcldpbmRvdyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlXaW5kb3dQdHIgaW5XaW5kb3c7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmluV2luZG93KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFF1aXRBcHBNb2RhbExvb3BGb3JXaW5kb3coaW5XaW5kb3cpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd1B0ciBpbldpbmRvdzsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3cpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUXVpdEFwcE1vZGFsTG9vcEZvcldpbmRvdyhpbldpbmRvdyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ2FyYm9uRXZlbnRzX0JlZ2luQXBwTW9kYWxTdGF0ZUZvcldpbmRvdyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlXaW5kb3dQdHIgaW5XaW5kb3c7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmluV2luZG93KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEJlZ2luQXBwTW9kYWxTdGF0ZUZvcldpbmRvdyhpbldpbmRvdyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93UHRyIGluV2luZG93OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpbldpbmRvdykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBCZWdpbkFwcE1vZGFsU3RhdGVGb3JXaW5kb3coaW5XaW5kb3cpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNhcmJvbkV2ZW50c19FbmRBcHBNb2RhbFN0YXRlRm9yV2luZG93KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVdpbmRvd1B0ciBpbldpbmRvdzsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3cpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRW5kQXBwTW9kYWxTdGF0ZUZvcldpbmRvdyhpbldpbmRvdyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93UHRyIGluV2luZG93OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpbldpbmRvdykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBFbmRBcHBNb2RhbFN0YXRlRm9yV2luZG93KGluV2luZG93KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDYXJib25FdmVudHNfU2V0VXNlckZvY3VzV2luZG93KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVdpbmRvd1B0ciBpbldpbmRvdzsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3cpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0VXNlckZvY3VzV2luZG93KGluV2luZG93KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBXaW5kb3dQdHIgaW5XaW5kb3c7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmluV2luZG93KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldFVzZXJGb2N1c1dpbmRvdyhpbldpbmRvdyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ2FyYm9uRXZlbnRzX0dldFVzZXJGb2N1c1dpbmRvdyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JV2luZG93UHRyIF9ydjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0VXNlckZvY3VzV2luZG93KCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBXaW5kb3dQdHIgX3J2OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRVc2VyRm9jdXNXaW5kb3coKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ2FyYm9uRXZlbnRzX1NldFdpbmRvd0RlZmF1bHRCdXR0b24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93UHRyIGluV2luZG93OwotCUNvbnRyb2xIYW5kbGUgaW5Db250cm9sOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmluV2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfQ29udmVydCwgJmluQ29udHJvbCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRXaW5kb3dEZWZhdWx0QnV0dG9uKGluV2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQ29udHJvbCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93UHRyIGluV2luZG93OworICAgIENvbnRyb2xIYW5kbGUgaW5Db250cm9sOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmluV2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfQ29udmVydCwgJmluQ29udHJvbCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRXaW5kb3dEZWZhdWx0QnV0dG9uKGluV2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQ29udHJvbCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ2FyYm9uRXZlbnRzX1NldFdpbmRvd0NhbmNlbEJ1dHRvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlXaW5kb3dQdHIgaW5XaW5kb3c7Ci0JQ29udHJvbEhhbmRsZSBpbkNvbnRyb2w7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9Db252ZXJ0LCAmaW5Db250cm9sKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldFdpbmRvd0NhbmNlbEJ1dHRvbihpbldpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQ29udHJvbCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93UHRyIGluV2luZG93OworICAgIENvbnRyb2xIYW5kbGUgaW5Db250cm9sOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmluV2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfQ29udmVydCwgJmluQ29udHJvbCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRXaW5kb3dDYW5jZWxCdXR0b24oaW5XaW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkNvbnRyb2wpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNhcmJvbkV2ZW50c19HZXRXaW5kb3dEZWZhdWx0QnV0dG9uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVdpbmRvd1B0ciBpbldpbmRvdzsKLQlDb250cm9sSGFuZGxlIG91dENvbnRyb2w7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmluV2luZG93KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldFdpbmRvd0RlZmF1bHRCdXR0b24oaW5XaW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBvdXRDb250cm9sKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBXaW5kb3dQdHIgaW5XaW5kb3c7CisgICAgQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpbldpbmRvdykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRXaW5kb3dEZWZhdWx0QnV0dG9uKGluV2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ2FyYm9uRXZlbnRzX0dldFdpbmRvd0NhbmNlbEJ1dHRvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlXaW5kb3dQdHIgaW5XaW5kb3c7Ci0JQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpbldpbmRvdykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRXaW5kb3dDYW5jZWxCdXR0b24oaW5XaW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd1B0ciBpbldpbmRvdzsKKyAgICBDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmluV2luZG93KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldFdpbmRvd0NhbmNlbEJ1dHRvbihpbldpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ2FyYm9uRXZlbnRzX1JlZ2lzdGVyRXZlbnRIb3RLZXkoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVUludDMyIGluSG90S2V5Q29kZTsKLQlVSW50MzIgaW5Ib3RLZXlNb2RpZmllcnM7Ci0JRXZlbnRIb3RLZXlJRCBpbkhvdEtleUlEOwotCUV2ZW50VGFyZ2V0UmVmIGluVGFyZ2V0OwotCU9wdGlvbkJpdHMgaW5PcHRpb25zOwotCUV2ZW50SG90S2V5UmVmIG91dFJlZjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbE8mTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluSG90S2V5Q29kZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluSG90S2V5TW9kaWZpZXJzLAotCSAgICAgICAgICAgICAgICAgICAgICBFdmVudEhvdEtleUlEX0NvbnZlcnQsICZpbkhvdEtleUlELAotCSAgICAgICAgICAgICAgICAgICAgICBFdmVudFRhcmdldFJlZl9Db252ZXJ0LCAmaW5UYXJnZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbk9wdGlvbnMpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUmVnaXN0ZXJFdmVudEhvdEtleShpbkhvdEtleUNvZGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Ib3RLZXlNb2RpZmllcnMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Ib3RLZXlJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBpblRhcmdldCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBpbk9wdGlvbnMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFJlZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEV2ZW50SG90S2V5UmVmX05ldywgb3V0UmVmKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBVSW50MzIgaW5Ib3RLZXlDb2RlOworICAgIFVJbnQzMiBpbkhvdEtleU1vZGlmaWVyczsKKyAgICBFdmVudEhvdEtleUlEIGluSG90S2V5SUQ7CisgICAgRXZlbnRUYXJnZXRSZWYgaW5UYXJnZXQ7CisgICAgT3B0aW9uQml0cyBpbk9wdGlvbnM7CisgICAgRXZlbnRIb3RLZXlSZWYgb3V0UmVmOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsTyZPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Ib3RLZXlDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Ib3RLZXlNb2RpZmllcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50SG90S2V5SURfQ29udmVydCwgJmluSG90S2V5SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50VGFyZ2V0UmVmX0NvbnZlcnQsICZpblRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluT3B0aW9ucykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBSZWdpc3RlckV2ZW50SG90S2V5KGluSG90S2V5Q29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkhvdEtleU1vZGlmaWVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkhvdEtleUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluVGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluT3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0UmVmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRIb3RLZXlSZWZfTmV3LCBvdXRSZWYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgQ2FyYm9uRXZlbnRzX21ldGhvZHNbXSA9IHsKLQl7IkdldEN1cnJlbnRFdmVudExvb3AiLCAoUHlDRnVuY3Rpb24pQ2FyYm9uRXZlbnRzX0dldEN1cnJlbnRFdmVudExvb3AsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEV2ZW50TG9vcFJlZiBfcnYpIil9LAotCXsiR2V0TWFpbkV2ZW50TG9vcCIsIChQeUNGdW5jdGlvbilDYXJib25FdmVudHNfR2V0TWFpbkV2ZW50TG9vcCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoRXZlbnRMb29wUmVmIF9ydikiKX0sCi0JeyJSdW5DdXJyZW50RXZlbnRMb29wIiwgKFB5Q0Z1bmN0aW9uKUNhcmJvbkV2ZW50c19SdW5DdXJyZW50RXZlbnRMb29wLCAxLAotCSBQeURvY19TVFIoIihkb3VibGUgaW5UaW1lb3V0KSAtPiBOb25lIil9LAotCXsiUmVjZWl2ZU5leHRFdmVudCIsIChQeUNGdW5jdGlvbilDYXJib25FdmVudHNfUmVjZWl2ZU5leHRFdmVudCwgMSwKLQkgUHlEb2NfU1RSKCIoVUludDMyIGluTnVtVHlwZXMsIEV2ZW50VHlwZVNwZWMgaW5MaXN0LCBkb3VibGUgaW5UaW1lb3V0LCBCb29sZWFuIGluUHVsbEV2ZW50KSAtPiAoRXZlbnRSZWYgb3V0RXZlbnQpIil9LAotCXsiR2V0Q3VycmVudEV2ZW50UXVldWUiLCAoUHlDRnVuY3Rpb24pQ2FyYm9uRXZlbnRzX0dldEN1cnJlbnRFdmVudFF1ZXVlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChFdmVudFF1ZXVlUmVmIF9ydikiKX0sCi0JeyJHZXRNYWluRXZlbnRRdWV1ZSIsIChQeUNGdW5jdGlvbilDYXJib25FdmVudHNfR2V0TWFpbkV2ZW50UXVldWUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEV2ZW50UXVldWVSZWYgX3J2KSIpfSwKLQl7IkdldEN1cnJlbnRFdmVudFRpbWUiLCAoUHlDRnVuY3Rpb24pQ2FyYm9uRXZlbnRzX0dldEN1cnJlbnRFdmVudFRpbWUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKGRvdWJsZSBfcnYpIil9LAotCXsiVHJhY2tNb3VzZUxvY2F0aW9uIiwgKFB5Q0Z1bmN0aW9uKUNhcmJvbkV2ZW50c19UcmFja01vdXNlTG9jYXRpb24sIDEsCi0JIFB5RG9jX1NUUigiKEdyYWZQdHIgaW5Qb3J0KSAtPiAoUG9pbnQgb3V0UHQsIFVJbnQxNiBvdXRSZXN1bHQpIil9LAotCXsiVHJhY2tNb3VzZUxvY2F0aW9uV2l0aE9wdGlvbnMiLCAoUHlDRnVuY3Rpb24pQ2FyYm9uRXZlbnRzX1RyYWNrTW91c2VMb2NhdGlvbldpdGhPcHRpb25zLCAxLAotCSBQeURvY19TVFIoIihHcmFmUHRyIGluUG9ydCwgT3B0aW9uQml0cyBpbk9wdGlvbnMsIGRvdWJsZSBpblRpbWVvdXQpIC0+IChQb2ludCBvdXRQdCwgVUludDMyIG91dE1vZGlmaWVycywgVUludDE2IG91dFJlc3VsdCkiKX0sCi0JeyJUcmFja01vdXNlUmVnaW9uIiwgKFB5Q0Z1bmN0aW9uKUNhcmJvbkV2ZW50c19UcmFja01vdXNlUmVnaW9uLCAxLAotCSBQeURvY19TVFIoIihHcmFmUHRyIGluUG9ydCwgUmduSGFuZGxlIGluUmVnaW9uLCBCb29sZWFuIGlvV2FzSW5SZ24pIC0+IChCb29sZWFuIGlvV2FzSW5SZ24sIFVJbnQxNiBvdXRSZXN1bHQpIil9LAotCXsiR2V0TGFzdFVzZXJFdmVudFRpbWUiLCAoUHlDRnVuY3Rpb24pQ2FyYm9uRXZlbnRzX0dldExhc3RVc2VyRXZlbnRUaW1lLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChkb3VibGUgX3J2KSIpfSwKLQl7IklzTW91c2VDb2FsZXNjaW5nRW5hYmxlZCIsIChQeUNGdW5jdGlvbilDYXJib25FdmVudHNfSXNNb3VzZUNvYWxlc2NpbmdFbmFibGVkLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJTZXRNb3VzZUNvYWxlc2NpbmdFbmFibGVkIiwgKFB5Q0Z1bmN0aW9uKUNhcmJvbkV2ZW50c19TZXRNb3VzZUNvYWxlc2NpbmdFbmFibGVkLCAxLAotCSBQeURvY19TVFIoIihCb29sZWFuIGluTmV3U3RhdGUpIC0+IChCb29sZWFuIG91dE9sZFN0YXRlKSIpfSwKLQl7IkdldFdpbmRvd0V2ZW50VGFyZ2V0IiwgKFB5Q0Z1bmN0aW9uKUNhcmJvbkV2ZW50c19HZXRXaW5kb3dFdmVudFRhcmdldCwgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluV2luZG93KSAtPiAoRXZlbnRUYXJnZXRSZWYgX3J2KSIpfSwKLQl7IkdldENvbnRyb2xFdmVudFRhcmdldCIsIChQeUNGdW5jdGlvbilDYXJib25FdmVudHNfR2V0Q29udHJvbEV2ZW50VGFyZ2V0LCAxLAotCSBQeURvY19TVFIoIihDb250cm9sSGFuZGxlIGluQ29udHJvbCkgLT4gKEV2ZW50VGFyZ2V0UmVmIF9ydikiKX0sCi0JeyJHZXRNZW51RXZlbnRUYXJnZXQiLCAoUHlDRnVuY3Rpb24pQ2FyYm9uRXZlbnRzX0dldE1lbnVFdmVudFRhcmdldCwgMSwKLQkgUHlEb2NfU1RSKCIoTWVudUhhbmRsZSBpbk1lbnUpIC0+IChFdmVudFRhcmdldFJlZiBfcnYpIil9LAotCXsiR2V0QXBwbGljYXRpb25FdmVudFRhcmdldCIsIChQeUNGdW5jdGlvbilDYXJib25FdmVudHNfR2V0QXBwbGljYXRpb25FdmVudFRhcmdldCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoRXZlbnRUYXJnZXRSZWYgX3J2KSIpfSwKLQl7IkdldFVzZXJGb2N1c0V2ZW50VGFyZ2V0IiwgKFB5Q0Z1bmN0aW9uKUNhcmJvbkV2ZW50c19HZXRVc2VyRm9jdXNFdmVudFRhcmdldCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoRXZlbnRUYXJnZXRSZWYgX3J2KSIpfSwKLQl7IkdldEV2ZW50RGlzcGF0Y2hlclRhcmdldCIsIChQeUNGdW5jdGlvbilDYXJib25FdmVudHNfR2V0RXZlbnREaXNwYXRjaGVyVGFyZ2V0LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChFdmVudFRhcmdldFJlZiBfcnYpIil9LAotCXsiUnVuQXBwbGljYXRpb25FdmVudExvb3AiLCAoUHlDRnVuY3Rpb24pQ2FyYm9uRXZlbnRzX1J1bkFwcGxpY2F0aW9uRXZlbnRMb29wLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJRdWl0QXBwbGljYXRpb25FdmVudExvb3AiLCAoUHlDRnVuY3Rpb24pQ2FyYm9uRXZlbnRzX1F1aXRBcHBsaWNhdGlvbkV2ZW50TG9vcCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiUnVuQXBwTW9kYWxMb29wRm9yV2luZG93IiwgKFB5Q0Z1bmN0aW9uKUNhcmJvbkV2ZW50c19SdW5BcHBNb2RhbExvb3BGb3JXaW5kb3csIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBpbldpbmRvdykgLT4gTm9uZSIpfSwKLQl7IlF1aXRBcHBNb2RhbExvb3BGb3JXaW5kb3ciLCAoUHlDRnVuY3Rpb24pQ2FyYm9uRXZlbnRzX1F1aXRBcHBNb2RhbExvb3BGb3JXaW5kb3csIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBpbldpbmRvdykgLT4gTm9uZSIpfSwKLQl7IkJlZ2luQXBwTW9kYWxTdGF0ZUZvcldpbmRvdyIsIChQeUNGdW5jdGlvbilDYXJib25FdmVudHNfQmVnaW5BcHBNb2RhbFN0YXRlRm9yV2luZG93LCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQdHIgaW5XaW5kb3cpIC0+IE5vbmUiKX0sCi0JeyJFbmRBcHBNb2RhbFN0YXRlRm9yV2luZG93IiwgKFB5Q0Z1bmN0aW9uKUNhcmJvbkV2ZW50c19FbmRBcHBNb2RhbFN0YXRlRm9yV2luZG93LCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQdHIgaW5XaW5kb3cpIC0+IE5vbmUiKX0sCi0JeyJTZXRVc2VyRm9jdXNXaW5kb3ciLCAoUHlDRnVuY3Rpb24pQ2FyYm9uRXZlbnRzX1NldFVzZXJGb2N1c1dpbmRvdywgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluV2luZG93KSAtPiBOb25lIil9LAotCXsiR2V0VXNlckZvY3VzV2luZG93IiwgKFB5Q0Z1bmN0aW9uKUNhcmJvbkV2ZW50c19HZXRVc2VyRm9jdXNXaW5kb3csIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFdpbmRvd1B0ciBfcnYpIil9LAotCXsiU2V0V2luZG93RGVmYXVsdEJ1dHRvbiIsIChQeUNGdW5jdGlvbilDYXJib25FdmVudHNfU2V0V2luZG93RGVmYXVsdEJ1dHRvbiwgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluV2luZG93LCBDb250cm9sSGFuZGxlIGluQ29udHJvbCkgLT4gTm9uZSIpfSwKLQl7IlNldFdpbmRvd0NhbmNlbEJ1dHRvbiIsIChQeUNGdW5jdGlvbilDYXJib25FdmVudHNfU2V0V2luZG93Q2FuY2VsQnV0dG9uLCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQdHIgaW5XaW5kb3csIENvbnRyb2xIYW5kbGUgaW5Db250cm9sKSAtPiBOb25lIil9LAotCXsiR2V0V2luZG93RGVmYXVsdEJ1dHRvbiIsIChQeUNGdW5jdGlvbilDYXJib25FdmVudHNfR2V0V2luZG93RGVmYXVsdEJ1dHRvbiwgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluV2luZG93KSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKLQl7IkdldFdpbmRvd0NhbmNlbEJ1dHRvbiIsIChQeUNGdW5jdGlvbilDYXJib25FdmVudHNfR2V0V2luZG93Q2FuY2VsQnV0dG9uLCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQdHIgaW5XaW5kb3cpIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAotCXsiUmVnaXN0ZXJFdmVudEhvdEtleSIsIChQeUNGdW5jdGlvbilDYXJib25FdmVudHNfUmVnaXN0ZXJFdmVudEhvdEtleSwgMSwKLQkgUHlEb2NfU1RSKCIoVUludDMyIGluSG90S2V5Q29kZSwgVUludDMyIGluSG90S2V5TW9kaWZpZXJzLCBFdmVudEhvdEtleUlEIGluSG90S2V5SUQsIEV2ZW50VGFyZ2V0UmVmIGluVGFyZ2V0LCBPcHRpb25CaXRzIGluT3B0aW9ucykgLT4gKEV2ZW50SG90S2V5UmVmIG91dFJlZikiKX0sCi0Je05VTEwsIE5VTEwsIDB9CisgICAgeyJHZXRDdXJyZW50RXZlbnRMb29wIiwgKFB5Q0Z1bmN0aW9uKUNhcmJvbkV2ZW50c19HZXRDdXJyZW50RXZlbnRMb29wLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChFdmVudExvb3BSZWYgX3J2KSIpfSwKKyAgICB7IkdldE1haW5FdmVudExvb3AiLCAoUHlDRnVuY3Rpb24pQ2FyYm9uRXZlbnRzX0dldE1haW5FdmVudExvb3AsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEV2ZW50TG9vcFJlZiBfcnYpIil9LAorICAgIHsiUnVuQ3VycmVudEV2ZW50TG9vcCIsIChQeUNGdW5jdGlvbilDYXJib25FdmVudHNfUnVuQ3VycmVudEV2ZW50TG9vcCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoZG91YmxlIGluVGltZW91dCkgLT4gTm9uZSIpfSwKKyAgICB7IlJlY2VpdmVOZXh0RXZlbnQiLCAoUHlDRnVuY3Rpb24pQ2FyYm9uRXZlbnRzX1JlY2VpdmVOZXh0RXZlbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKFVJbnQzMiBpbk51bVR5cGVzLCBFdmVudFR5cGVTcGVjIGluTGlzdCwgZG91YmxlIGluVGltZW91dCwgQm9vbGVhbiBpblB1bGxFdmVudCkgLT4gKEV2ZW50UmVmIG91dEV2ZW50KSIpfSwKKyAgICB7IkdldEN1cnJlbnRFdmVudFF1ZXVlIiwgKFB5Q0Z1bmN0aW9uKUNhcmJvbkV2ZW50c19HZXRDdXJyZW50RXZlbnRRdWV1ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoRXZlbnRRdWV1ZVJlZiBfcnYpIil9LAorICAgIHsiR2V0TWFpbkV2ZW50UXVldWUiLCAoUHlDRnVuY3Rpb24pQ2FyYm9uRXZlbnRzX0dldE1haW5FdmVudFF1ZXVlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChFdmVudFF1ZXVlUmVmIF9ydikiKX0sCisgICAgeyJHZXRDdXJyZW50RXZlbnRUaW1lIiwgKFB5Q0Z1bmN0aW9uKUNhcmJvbkV2ZW50c19HZXRDdXJyZW50RXZlbnRUaW1lLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChkb3VibGUgX3J2KSIpfSwKKyAgICB7IlRyYWNrTW91c2VMb2NhdGlvbiIsIChQeUNGdW5jdGlvbilDYXJib25FdmVudHNfVHJhY2tNb3VzZUxvY2F0aW9uLCAxLAorICAgICBQeURvY19TVFIoIihHcmFmUHRyIGluUG9ydCkgLT4gKFBvaW50IG91dFB0LCBVSW50MTYgb3V0UmVzdWx0KSIpfSwKKyAgICB7IlRyYWNrTW91c2VMb2NhdGlvbldpdGhPcHRpb25zIiwgKFB5Q0Z1bmN0aW9uKUNhcmJvbkV2ZW50c19UcmFja01vdXNlTG9jYXRpb25XaXRoT3B0aW9ucywgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhZlB0ciBpblBvcnQsIE9wdGlvbkJpdHMgaW5PcHRpb25zLCBkb3VibGUgaW5UaW1lb3V0KSAtPiAoUG9pbnQgb3V0UHQsIFVJbnQzMiBvdXRNb2RpZmllcnMsIFVJbnQxNiBvdXRSZXN1bHQpIil9LAorICAgIHsiVHJhY2tNb3VzZVJlZ2lvbiIsIChQeUNGdW5jdGlvbilDYXJib25FdmVudHNfVHJhY2tNb3VzZVJlZ2lvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhZlB0ciBpblBvcnQsIFJnbkhhbmRsZSBpblJlZ2lvbiwgQm9vbGVhbiBpb1dhc0luUmduKSAtPiAoQm9vbGVhbiBpb1dhc0luUmduLCBVSW50MTYgb3V0UmVzdWx0KSIpfSwKKyAgICB7IkdldExhc3RVc2VyRXZlbnRUaW1lIiwgKFB5Q0Z1bmN0aW9uKUNhcmJvbkV2ZW50c19HZXRMYXN0VXNlckV2ZW50VGltZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoZG91YmxlIF9ydikiKX0sCisgICAgeyJJc01vdXNlQ29hbGVzY2luZ0VuYWJsZWQiLCAoUHlDRnVuY3Rpb24pQ2FyYm9uRXZlbnRzX0lzTW91c2VDb2FsZXNjaW5nRW5hYmxlZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiU2V0TW91c2VDb2FsZXNjaW5nRW5hYmxlZCIsIChQeUNGdW5jdGlvbilDYXJib25FdmVudHNfU2V0TW91c2VDb2FsZXNjaW5nRW5hYmxlZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQm9vbGVhbiBpbk5ld1N0YXRlKSAtPiAoQm9vbGVhbiBvdXRPbGRTdGF0ZSkiKX0sCisgICAgeyJHZXRXaW5kb3dFdmVudFRhcmdldCIsIChQeUNGdW5jdGlvbilDYXJib25FdmVudHNfR2V0V2luZG93RXZlbnRUYXJnZXQsIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBpbldpbmRvdykgLT4gKEV2ZW50VGFyZ2V0UmVmIF9ydikiKX0sCisgICAgeyJHZXRDb250cm9sRXZlbnRUYXJnZXQiLCAoUHlDRnVuY3Rpb24pQ2FyYm9uRXZlbnRzX0dldENvbnRyb2xFdmVudFRhcmdldCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ29udHJvbEhhbmRsZSBpbkNvbnRyb2wpIC0+IChFdmVudFRhcmdldFJlZiBfcnYpIil9LAorICAgIHsiR2V0TWVudUV2ZW50VGFyZ2V0IiwgKFB5Q0Z1bmN0aW9uKUNhcmJvbkV2ZW50c19HZXRNZW51RXZlbnRUYXJnZXQsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lbnVIYW5kbGUgaW5NZW51KSAtPiAoRXZlbnRUYXJnZXRSZWYgX3J2KSIpfSwKKyAgICB7IkdldEFwcGxpY2F0aW9uRXZlbnRUYXJnZXQiLCAoUHlDRnVuY3Rpb24pQ2FyYm9uRXZlbnRzX0dldEFwcGxpY2F0aW9uRXZlbnRUYXJnZXQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEV2ZW50VGFyZ2V0UmVmIF9ydikiKX0sCisgICAgeyJHZXRVc2VyRm9jdXNFdmVudFRhcmdldCIsIChQeUNGdW5jdGlvbilDYXJib25FdmVudHNfR2V0VXNlckZvY3VzRXZlbnRUYXJnZXQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEV2ZW50VGFyZ2V0UmVmIF9ydikiKX0sCisgICAgeyJHZXRFdmVudERpc3BhdGNoZXJUYXJnZXQiLCAoUHlDRnVuY3Rpb24pQ2FyYm9uRXZlbnRzX0dldEV2ZW50RGlzcGF0Y2hlclRhcmdldCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoRXZlbnRUYXJnZXRSZWYgX3J2KSIpfSwKKyAgICB7IlJ1bkFwcGxpY2F0aW9uRXZlbnRMb29wIiwgKFB5Q0Z1bmN0aW9uKUNhcmJvbkV2ZW50c19SdW5BcHBsaWNhdGlvbkV2ZW50TG9vcCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiUXVpdEFwcGxpY2F0aW9uRXZlbnRMb29wIiwgKFB5Q0Z1bmN0aW9uKUNhcmJvbkV2ZW50c19RdWl0QXBwbGljYXRpb25FdmVudExvb3AsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IlJ1bkFwcE1vZGFsTG9vcEZvcldpbmRvdyIsIChQeUNGdW5jdGlvbilDYXJib25FdmVudHNfUnVuQXBwTW9kYWxMb29wRm9yV2luZG93LCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgaW5XaW5kb3cpIC0+IE5vbmUiKX0sCisgICAgeyJRdWl0QXBwTW9kYWxMb29wRm9yV2luZG93IiwgKFB5Q0Z1bmN0aW9uKUNhcmJvbkV2ZW50c19RdWl0QXBwTW9kYWxMb29wRm9yV2luZG93LCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgaW5XaW5kb3cpIC0+IE5vbmUiKX0sCisgICAgeyJCZWdpbkFwcE1vZGFsU3RhdGVGb3JXaW5kb3ciLCAoUHlDRnVuY3Rpb24pQ2FyYm9uRXZlbnRzX0JlZ2luQXBwTW9kYWxTdGF0ZUZvcldpbmRvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluV2luZG93KSAtPiBOb25lIil9LAorICAgIHsiRW5kQXBwTW9kYWxTdGF0ZUZvcldpbmRvdyIsIChQeUNGdW5jdGlvbilDYXJib25FdmVudHNfRW5kQXBwTW9kYWxTdGF0ZUZvcldpbmRvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluV2luZG93KSAtPiBOb25lIil9LAorICAgIHsiU2V0VXNlckZvY3VzV2luZG93IiwgKFB5Q0Z1bmN0aW9uKUNhcmJvbkV2ZW50c19TZXRVc2VyRm9jdXNXaW5kb3csIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBpbldpbmRvdykgLT4gTm9uZSIpfSwKKyAgICB7IkdldFVzZXJGb2N1c1dpbmRvdyIsIChQeUNGdW5jdGlvbilDYXJib25FdmVudHNfR2V0VXNlckZvY3VzV2luZG93LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChXaW5kb3dQdHIgX3J2KSIpfSwKKyAgICB7IlNldFdpbmRvd0RlZmF1bHRCdXR0b24iLCAoUHlDRnVuY3Rpb24pQ2FyYm9uRXZlbnRzX1NldFdpbmRvd0RlZmF1bHRCdXR0b24sIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBpbldpbmRvdywgQ29udHJvbEhhbmRsZSBpbkNvbnRyb2wpIC0+IE5vbmUiKX0sCisgICAgeyJTZXRXaW5kb3dDYW5jZWxCdXR0b24iLCAoUHlDRnVuY3Rpb24pQ2FyYm9uRXZlbnRzX1NldFdpbmRvd0NhbmNlbEJ1dHRvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluV2luZG93LCBDb250cm9sSGFuZGxlIGluQ29udHJvbCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldFdpbmRvd0RlZmF1bHRCdXR0b24iLCAoUHlDRnVuY3Rpb24pQ2FyYm9uRXZlbnRzX0dldFdpbmRvd0RlZmF1bHRCdXR0b24sIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBpbldpbmRvdykgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCisgICAgeyJHZXRXaW5kb3dDYW5jZWxCdXR0b24iLCAoUHlDRnVuY3Rpb24pQ2FyYm9uRXZlbnRzX0dldFdpbmRvd0NhbmNlbEJ1dHRvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluV2luZG93KSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKKyAgICB7IlJlZ2lzdGVyRXZlbnRIb3RLZXkiLCAoUHlDRnVuY3Rpb24pQ2FyYm9uRXZlbnRzX1JlZ2lzdGVyRXZlbnRIb3RLZXksIDEsCisgICAgIFB5RG9jX1NUUigiKFVJbnQzMiBpbkhvdEtleUNvZGUsIFVJbnQzMiBpbkhvdEtleU1vZGlmaWVycywgRXZlbnRIb3RLZXlJRCBpbkhvdEtleUlELCBFdmVudFRhcmdldFJlZiBpblRhcmdldCwgT3B0aW9uQml0cyBpbk9wdGlvbnMpIC0+IChFdmVudEhvdEtleVJlZiBvdXRSZWYpIil9LAorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogI2Vsc2UgLyogX19MUDY0X18gKi8KIAogc3RhdGljIFB5TWV0aG9kRGVmIENhcmJvbkV2ZW50c19tZXRob2RzW10gPSB7Ci0Je05VTEwsIE5VTEwsIDB9CisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAjZW5kaWYgLyogX19MUDY0X18gKi8KQEAgLTIxNTMsNzcgKzIxNTMsNzcgQEAKIAogdm9pZCBpbml0X0NhcmJvbkV2dCh2b2lkKQogewotCVB5T2JqZWN0ICptOworICAgIFB5T2JqZWN0ICptOwogI2lmbmRlZiBfX0xQNjRfXwotCVB5T2JqZWN0ICpkOworICAgIFB5T2JqZWN0ICpkOwogI2VuZGlmIC8qICFfX0xQNjRfXyAqLwogCiAKLQltID0gUHlfSW5pdE1vZHVsZSgiX0NhcmJvbkV2dCIsIENhcmJvbkV2ZW50c19tZXRob2RzKTsKKyAgICBtID0gUHlfSW5pdE1vZHVsZSgiX0NhcmJvbkV2dCIsIENhcmJvbkV2ZW50c19tZXRob2RzKTsKIAogI2lmbmRlZiBfX0xQNjRfXwotCW15RXZlbnRIYW5kbGVyVVBQID0gTmV3RXZlbnRIYW5kbGVyVVBQKG15RXZlbnRIYW5kbGVyKTsKLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQlDYXJib25FdmVudHNfRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOwotCWlmIChDYXJib25FdmVudHNfRXJyb3IgPT0gTlVMTCB8fAotCSAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRXJyb3IiLCBDYXJib25FdmVudHNfRXJyb3IpICE9IDApCi0JCXJldHVybjsKLQlFdmVudFJlZl9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmRXZlbnRSZWZfVHlwZSkgPCAwKSByZXR1cm47Ci0JUHlfSU5DUkVGKCZFdmVudFJlZl9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkV2ZW50UmVmIiwgKFB5T2JqZWN0ICopJkV2ZW50UmVmX1R5cGUpOwotCS8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLwotCVB5X0lOQ1JFRigmRXZlbnRSZWZfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJFdmVudFJlZlR5cGUiLCAoUHlPYmplY3QgKikmRXZlbnRSZWZfVHlwZSk7Ci0JRXZlbnRRdWV1ZVJlZl9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmRXZlbnRRdWV1ZVJlZl9UeXBlKSA8IDApIHJldHVybjsKLQlQeV9JTkNSRUYoJkV2ZW50UXVldWVSZWZfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJFdmVudFF1ZXVlUmVmIiwgKFB5T2JqZWN0ICopJkV2ZW50UXVldWVSZWZfVHlwZSk7Ci0JLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCi0JUHlfSU5DUkVGKCZFdmVudFF1ZXVlUmVmX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiRXZlbnRRdWV1ZVJlZlR5cGUiLCAoUHlPYmplY3QgKikmRXZlbnRRdWV1ZVJlZl9UeXBlKTsKLQlFdmVudExvb3BSZWZfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCWlmIChQeVR5cGVfUmVhZHkoJkV2ZW50TG9vcFJlZl9UeXBlKSA8IDApIHJldHVybjsKLQlQeV9JTkNSRUYoJkV2ZW50TG9vcFJlZl9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkV2ZW50TG9vcFJlZiIsIChQeU9iamVjdCAqKSZFdmVudExvb3BSZWZfVHlwZSk7Ci0JLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCi0JUHlfSU5DUkVGKCZFdmVudExvb3BSZWZfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJFdmVudExvb3BSZWZUeXBlIiwgKFB5T2JqZWN0ICopJkV2ZW50TG9vcFJlZl9UeXBlKTsKLQlFdmVudExvb3BUaW1lclJlZl9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmRXZlbnRMb29wVGltZXJSZWZfVHlwZSkgPCAwKSByZXR1cm47Ci0JUHlfSU5DUkVGKCZFdmVudExvb3BUaW1lclJlZl9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkV2ZW50TG9vcFRpbWVyUmVmIiwgKFB5T2JqZWN0ICopJkV2ZW50TG9vcFRpbWVyUmVmX1R5cGUpOwotCS8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLwotCVB5X0lOQ1JFRigmRXZlbnRMb29wVGltZXJSZWZfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJFdmVudExvb3BUaW1lclJlZlR5cGUiLCAoUHlPYmplY3QgKikmRXZlbnRMb29wVGltZXJSZWZfVHlwZSk7Ci0JRXZlbnRIYW5kbGVyUmVmX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKLQlpZiAoUHlUeXBlX1JlYWR5KCZFdmVudEhhbmRsZXJSZWZfVHlwZSkgPCAwKSByZXR1cm47Ci0JUHlfSU5DUkVGKCZFdmVudEhhbmRsZXJSZWZfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJFdmVudEhhbmRsZXJSZWYiLCAoUHlPYmplY3QgKikmRXZlbnRIYW5kbGVyUmVmX1R5cGUpOwotCS8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLwotCVB5X0lOQ1JFRigmRXZlbnRIYW5kbGVyUmVmX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiRXZlbnRIYW5kbGVyUmVmVHlwZSIsIChQeU9iamVjdCAqKSZFdmVudEhhbmRsZXJSZWZfVHlwZSk7Ci0JRXZlbnRIYW5kbGVyQ2FsbFJlZl9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmRXZlbnRIYW5kbGVyQ2FsbFJlZl9UeXBlKSA8IDApIHJldHVybjsKLQlQeV9JTkNSRUYoJkV2ZW50SGFuZGxlckNhbGxSZWZfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJFdmVudEhhbmRsZXJDYWxsUmVmIiwgKFB5T2JqZWN0ICopJkV2ZW50SGFuZGxlckNhbGxSZWZfVHlwZSk7Ci0JLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCi0JUHlfSU5DUkVGKCZFdmVudEhhbmRsZXJDYWxsUmVmX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiRXZlbnRIYW5kbGVyQ2FsbFJlZlR5cGUiLCAoUHlPYmplY3QgKikmRXZlbnRIYW5kbGVyQ2FsbFJlZl9UeXBlKTsKLQlFdmVudFRhcmdldFJlZl9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmRXZlbnRUYXJnZXRSZWZfVHlwZSkgPCAwKSByZXR1cm47Ci0JUHlfSU5DUkVGKCZFdmVudFRhcmdldFJlZl9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkV2ZW50VGFyZ2V0UmVmIiwgKFB5T2JqZWN0ICopJkV2ZW50VGFyZ2V0UmVmX1R5cGUpOwotCS8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLwotCVB5X0lOQ1JFRigmRXZlbnRUYXJnZXRSZWZfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJFdmVudFRhcmdldFJlZlR5cGUiLCAoUHlPYmplY3QgKikmRXZlbnRUYXJnZXRSZWZfVHlwZSk7Ci0JRXZlbnRIb3RLZXlSZWZfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCWlmIChQeVR5cGVfUmVhZHkoJkV2ZW50SG90S2V5UmVmX1R5cGUpIDwgMCkgcmV0dXJuOwotCVB5X0lOQ1JFRigmRXZlbnRIb3RLZXlSZWZfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJFdmVudEhvdEtleVJlZiIsIChQeU9iamVjdCAqKSZFdmVudEhvdEtleVJlZl9UeXBlKTsKLQkvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KLQlQeV9JTkNSRUYoJkV2ZW50SG90S2V5UmVmX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiRXZlbnRIb3RLZXlSZWZUeXBlIiwgKFB5T2JqZWN0ICopJkV2ZW50SG90S2V5UmVmX1R5cGUpOworICAgIG15RXZlbnRIYW5kbGVyVVBQID0gTmV3RXZlbnRIYW5kbGVyVVBQKG15RXZlbnRIYW5kbGVyKTsKKyAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICBDYXJib25FdmVudHNfRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOworICAgIGlmIChDYXJib25FdmVudHNfRXJyb3IgPT0gTlVMTCB8fAorICAgICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRXJyb3IiLCBDYXJib25FdmVudHNfRXJyb3IpICE9IDApCisgICAgICAgIHJldHVybjsKKyAgICBFdmVudFJlZl9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmRXZlbnRSZWZfVHlwZSkgPCAwKSByZXR1cm47CisgICAgUHlfSU5DUkVGKCZFdmVudFJlZl9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkV2ZW50UmVmIiwgKFB5T2JqZWN0ICopJkV2ZW50UmVmX1R5cGUpOworICAgIC8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLworICAgIFB5X0lOQ1JFRigmRXZlbnRSZWZfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJFdmVudFJlZlR5cGUiLCAoUHlPYmplY3QgKikmRXZlbnRSZWZfVHlwZSk7CisgICAgRXZlbnRRdWV1ZVJlZl9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmRXZlbnRRdWV1ZVJlZl9UeXBlKSA8IDApIHJldHVybjsKKyAgICBQeV9JTkNSRUYoJkV2ZW50UXVldWVSZWZfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJFdmVudFF1ZXVlUmVmIiwgKFB5T2JqZWN0ICopJkV2ZW50UXVldWVSZWZfVHlwZSk7CisgICAgLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCisgICAgUHlfSU5DUkVGKCZFdmVudFF1ZXVlUmVmX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiRXZlbnRRdWV1ZVJlZlR5cGUiLCAoUHlPYmplY3QgKikmRXZlbnRRdWV1ZVJlZl9UeXBlKTsKKyAgICBFdmVudExvb3BSZWZfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJkV2ZW50TG9vcFJlZl9UeXBlKSA8IDApIHJldHVybjsKKyAgICBQeV9JTkNSRUYoJkV2ZW50TG9vcFJlZl9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkV2ZW50TG9vcFJlZiIsIChQeU9iamVjdCAqKSZFdmVudExvb3BSZWZfVHlwZSk7CisgICAgLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCisgICAgUHlfSU5DUkVGKCZFdmVudExvb3BSZWZfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJFdmVudExvb3BSZWZUeXBlIiwgKFB5T2JqZWN0ICopJkV2ZW50TG9vcFJlZl9UeXBlKTsKKyAgICBFdmVudExvb3BUaW1lclJlZl9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmRXZlbnRMb29wVGltZXJSZWZfVHlwZSkgPCAwKSByZXR1cm47CisgICAgUHlfSU5DUkVGKCZFdmVudExvb3BUaW1lclJlZl9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkV2ZW50TG9vcFRpbWVyUmVmIiwgKFB5T2JqZWN0ICopJkV2ZW50TG9vcFRpbWVyUmVmX1R5cGUpOworICAgIC8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLworICAgIFB5X0lOQ1JFRigmRXZlbnRMb29wVGltZXJSZWZfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJFdmVudExvb3BUaW1lclJlZlR5cGUiLCAoUHlPYmplY3QgKikmRXZlbnRMb29wVGltZXJSZWZfVHlwZSk7CisgICAgRXZlbnRIYW5kbGVyUmVmX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZFdmVudEhhbmRsZXJSZWZfVHlwZSkgPCAwKSByZXR1cm47CisgICAgUHlfSU5DUkVGKCZFdmVudEhhbmRsZXJSZWZfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJFdmVudEhhbmRsZXJSZWYiLCAoUHlPYmplY3QgKikmRXZlbnRIYW5kbGVyUmVmX1R5cGUpOworICAgIC8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLworICAgIFB5X0lOQ1JFRigmRXZlbnRIYW5kbGVyUmVmX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiRXZlbnRIYW5kbGVyUmVmVHlwZSIsIChQeU9iamVjdCAqKSZFdmVudEhhbmRsZXJSZWZfVHlwZSk7CisgICAgRXZlbnRIYW5kbGVyQ2FsbFJlZl9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmRXZlbnRIYW5kbGVyQ2FsbFJlZl9UeXBlKSA8IDApIHJldHVybjsKKyAgICBQeV9JTkNSRUYoJkV2ZW50SGFuZGxlckNhbGxSZWZfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJFdmVudEhhbmRsZXJDYWxsUmVmIiwgKFB5T2JqZWN0ICopJkV2ZW50SGFuZGxlckNhbGxSZWZfVHlwZSk7CisgICAgLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCisgICAgUHlfSU5DUkVGKCZFdmVudEhhbmRsZXJDYWxsUmVmX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiRXZlbnRIYW5kbGVyQ2FsbFJlZlR5cGUiLCAoUHlPYmplY3QgKikmRXZlbnRIYW5kbGVyQ2FsbFJlZl9UeXBlKTsKKyAgICBFdmVudFRhcmdldFJlZl9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmRXZlbnRUYXJnZXRSZWZfVHlwZSkgPCAwKSByZXR1cm47CisgICAgUHlfSU5DUkVGKCZFdmVudFRhcmdldFJlZl9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkV2ZW50VGFyZ2V0UmVmIiwgKFB5T2JqZWN0ICopJkV2ZW50VGFyZ2V0UmVmX1R5cGUpOworICAgIC8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLworICAgIFB5X0lOQ1JFRigmRXZlbnRUYXJnZXRSZWZfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJFdmVudFRhcmdldFJlZlR5cGUiLCAoUHlPYmplY3QgKikmRXZlbnRUYXJnZXRSZWZfVHlwZSk7CisgICAgRXZlbnRIb3RLZXlSZWZfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJkV2ZW50SG90S2V5UmVmX1R5cGUpIDwgMCkgcmV0dXJuOworICAgIFB5X0lOQ1JFRigmRXZlbnRIb3RLZXlSZWZfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJFdmVudEhvdEtleVJlZiIsIChQeU9iamVjdCAqKSZFdmVudEhvdEtleVJlZl9UeXBlKTsKKyAgICAvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KKyAgICBQeV9JTkNSRUYoJkV2ZW50SG90S2V5UmVmX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiRXZlbnRIb3RLZXlSZWZUeXBlIiwgKFB5T2JqZWN0ICopJkV2ZW50SG90S2V5UmVmX1R5cGUpOwogI2VuZGlmIC8qICFfX0xQNjRfXyAqLwogfQogCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9jZi9fQ0Ztb2R1bGUuYyBiL01hYy9Nb2R1bGVzL2NmL19DRm1vZHVsZS5jCmluZGV4IDA5MDRhZTEuLmVlNjdjNzAgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL2NmL19DRm1vZHVsZS5jCisrKyBiL01hYy9Nb2R1bGVzL2NmL19DRm1vZHVsZS5jCkBAIC05LDkgKzksOSBAQAogCiAvKiBNYWNybyB0byB0ZXN0IHdoZXRoZXIgYSB3ZWFrLWxvYWRlZCBDRk0gZnVuY3Rpb24gZXhpc3RzICovCiAjZGVmaW5lIFB5TWFjX1BSRUNIRUNLKHJ0bikgZG8geyBpZiAoICZydG4gPT0gTlVMTCApICB7XAotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgXAotICAgICAgICAiTm90IGF2YWlsYWJsZSBpbiB0aGlzIHNoYXJlZCBsaWJyYXJ5L09TIHZlcnNpb24iKTsgXAotICAgICAgICByZXR1cm4gTlVMTDsgXAorICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yLCBcCisgICAgIk5vdCBhdmFpbGFibGUgaW4gdGhpcyBzaGFyZWQgbGlicmFyeS9PUyB2ZXJzaW9uIik7IFwKKyAgICByZXR1cm4gTlVMTDsgXAogICAgIH19IHdoaWxlKDApCiAKIApAQCAtODQsMTkgKzg0LDE5IEBACiBQeU9iamVjdCAqQ0ZSYW5nZV9OZXcoQ0ZSYW5nZSAqaXRzZWxmKQogewogCi0gICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJsbCIsIChsb25nKWl0c2VsZi0+bG9jYXRpb24sIChsb25nKWl0c2VsZi0+bGVuZ3RoKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgibGwiLCAobG9uZylpdHNlbGYtPmxvY2F0aW9uLCAobG9uZylpdHNlbGYtPmxlbmd0aCk7CiB9CiAKIGludAogQ0ZSYW5nZV9Db252ZXJ0KFB5T2JqZWN0ICp2LCBDRlJhbmdlICpwX2l0c2VsZikKIHsKLSAgICAgICAgbG9uZyBsb2NhdGlvbiwgbGVuZ3RoOworICAgIGxvbmcgbG9jYXRpb24sIGxlbmd0aDsKIAotICAgICAgICBpZiggIVB5QXJnX1BhcnNlVHVwbGUodiwgImxsIiwgJmxvY2F0aW9uLCAmbGVuZ3RoKSApCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIHBfaXRzZWxmLT5sb2NhdGlvbiA9IChDRkluZGV4KWxvY2F0aW9uOwotICAgICAgICBwX2l0c2VsZi0+bGVuZ3RoID0gKENGSW5kZXgpbGVuZ3RoOwotICAgICAgICByZXR1cm4gMTsKKyAgICBpZiggIVB5QXJnX1BhcnNlVHVwbGUodiwgImxsIiwgJmxvY2F0aW9uLCAmbGVuZ3RoKSApCisgICAgICAgIHJldHVybiAwOworICAgIHBfaXRzZWxmLT5sb2NhdGlvbiA9IChDRkluZGV4KWxvY2F0aW9uOworICAgIHBfaXRzZWxmLT5sZW5ndGggPSAoQ0ZJbmRleClsZW5ndGg7CisgICAgcmV0dXJuIDE7CiB9CiAKIC8qIE9wdGlvbmFsIENGVVJMIGFyZ3VtZW50IG9yIE5vbmUgKHBhc3NlZCBhcyBOVUxMKSAqLwpAQCAtMTA0LDggKzEwNCw4IEBACiBPcHRpb25hbENGVVJMUmVmT2JqX0NvbnZlcnQoUHlPYmplY3QgKnYsIENGVVJMUmVmICpwX2l0c2VsZikKIHsKICAgICBpZiAoIHYgPT0gUHlfTm9uZSApIHsKLSAgICAgICAgcF9pdHNlbGYgPSBOVUxMOwotICAgICAgICByZXR1cm4gMTsKKyAgICBwX2l0c2VsZiA9IE5VTEw7CisgICAgcmV0dXJuIDE7CiAgICAgfQogICAgIHJldHVybiBDRlVSTFJlZk9ial9Db252ZXJ0KHYsIHBfaXRzZWxmKTsKIH0KQEAgLTExOSwyNjIgKzExOSwyNjIgQEAKICNkZWZpbmUgQ0ZUeXBlUmVmT2JqX0NoZWNrKHgpICgoeCktPm9iX3R5cGUgPT0gJkNGVHlwZVJlZl9UeXBlIHx8IFB5T2JqZWN0X1R5cGVDaGVjaygoeCksICZDRlR5cGVSZWZfVHlwZSkpCiAKIHR5cGVkZWYgc3RydWN0IENGVHlwZVJlZk9iamVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCUNGVHlwZVJlZiBvYl9pdHNlbGY7Ci0Jdm9pZCAoKm9iX2ZyZWVpdCkoQ0ZUeXBlUmVmIHB0cik7CisgICAgUHlPYmplY3RfSEVBRAorICAgIENGVHlwZVJlZiBvYl9pdHNlbGY7CisgICAgdm9pZCAoKm9iX2ZyZWVpdCkoQ0ZUeXBlUmVmIHB0cik7CiB9IENGVHlwZVJlZk9iamVjdDsKIAogUHlPYmplY3QgKkNGVHlwZVJlZk9ial9OZXcoQ0ZUeXBlUmVmIGl0c2VsZikKIHsKLQlDRlR5cGVSZWZPYmplY3QgKml0OwotCWlmIChpdHNlbGYgPT0gTlVMTCkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJjYW5ub3Qgd3JhcCBOVUxMIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpdCA9IFB5T2JqZWN0X05FVyhDRlR5cGVSZWZPYmplY3QsICZDRlR5cGVSZWZfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOwotCWl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JaXQtPm9iX2ZyZWVpdCA9IENGUmVsZWFzZTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgQ0ZUeXBlUmVmT2JqZWN0ICppdDsKKyAgICBpZiAoaXRzZWxmID09IE5VTEwpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAiY2Fubm90IHdyYXAgTlVMTCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaXQgPSBQeU9iamVjdF9ORVcoQ0ZUeXBlUmVmT2JqZWN0LCAmQ0ZUeXBlUmVmX1R5cGUpOworICAgIGlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICBpdC0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIGl0LT5vYl9mcmVlaXQgPSBDRlJlbGVhc2U7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogCiBpbnQgQ0ZUeXBlUmVmT2JqX0NvbnZlcnQoUHlPYmplY3QgKnYsIENGVHlwZVJlZiAqcF9pdHNlbGYpCiB7CiAKLQlpZiAodiA9PSBQeV9Ob25lKSB7ICpwX2l0c2VsZiA9IE5VTEw7IHJldHVybiAxOyB9Ci0JLyogQ2hlY2sgZm9yIG90aGVyIENGIG9iamVjdHMgaGVyZSAqLworICAgIGlmICh2ID09IFB5X05vbmUpIHsgKnBfaXRzZWxmID0gTlVMTDsgcmV0dXJuIDE7IH0KKyAgICAvKiBDaGVjayBmb3Igb3RoZXIgQ0Ygb2JqZWN0cyBoZXJlICovCiAKLQlpZiAoIUNGVHlwZVJlZk9ial9DaGVjayh2KSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJDRlR5cGVSZWYgcmVxdWlyZWQiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCSpwX2l0c2VsZiA9ICgoQ0ZUeXBlUmVmT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKLQlyZXR1cm4gMTsKKyAgICBpZiAoIUNGVHlwZVJlZk9ial9DaGVjayh2KSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJDRlR5cGVSZWYgcmVxdWlyZWQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICpwX2l0c2VsZiA9ICgoQ0ZUeXBlUmVmT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIHZvaWQgQ0ZUeXBlUmVmT2JqX2RlYWxsb2MoQ0ZUeXBlUmVmT2JqZWN0ICpzZWxmKQogewotCWlmIChzZWxmLT5vYl9mcmVlaXQgJiYgc2VsZi0+b2JfaXRzZWxmKQotCXsKLQkJc2VsZi0+b2JfZnJlZWl0KChDRlR5cGVSZWYpc2VsZi0+b2JfaXRzZWxmKTsKLQkJc2VsZi0+b2JfaXRzZWxmID0gTlVMTDsKLQl9Ci0Jc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKKyAgICBpZiAoc2VsZi0+b2JfZnJlZWl0ICYmIHNlbGYtPm9iX2l0c2VsZikKKyAgICB7CisgICAgICAgIHNlbGYtPm9iX2ZyZWVpdCgoQ0ZUeXBlUmVmKXNlbGYtPm9iX2l0c2VsZik7CisgICAgICAgIHNlbGYtPm9iX2l0c2VsZiA9IE5VTEw7CisgICAgfQorICAgIHNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZUeXBlUmVmT2JqX0NGR2V0VHlwZUlEKENGVHlwZVJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZUeXBlSUQgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlR5cGVJRCBfcnY7CiAjaWZuZGVmIENGR2V0VHlwZUlECi0JUHlNYWNfUFJFQ0hFQ0soQ0ZHZXRUeXBlSUQpOworICAgIFB5TWFjX1BSRUNIRUNLKENGR2V0VHlwZUlEKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRkdldFR5cGVJRChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZHZXRUeXBlSUQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZUeXBlUmVmT2JqX0NGUmV0YWluKENGVHlwZVJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZUeXBlUmVmIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZUeXBlUmVmIF9ydjsKICNpZm5kZWYgQ0ZSZXRhaW4KLQlQeU1hY19QUkVDSEVDSyhDRlJldGFpbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZSZXRhaW4pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGUmV0YWluKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZUeXBlUmVmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZSZXRhaW4oX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlR5cGVSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGVHlwZVJlZk9ial9DRlJlbGVhc2UoQ0ZUeXBlUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIENGUmVsZWFzZQotCVB5TWFjX1BSRUNIRUNLKENGUmVsZWFzZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZSZWxlYXNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlDRlJlbGVhc2UoX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDRlJlbGVhc2UoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGVHlwZVJlZk9ial9DRkdldFJldGFpbkNvdW50KENGVHlwZVJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZJbmRleCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGSW5kZXggX3J2OwogI2lmbmRlZiBDRkdldFJldGFpbkNvdW50Ci0JUHlNYWNfUFJFQ0hFQ0soQ0ZHZXRSZXRhaW5Db3VudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZHZXRSZXRhaW5Db3VudCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZHZXRSZXRhaW5Db3VudChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZHZXRSZXRhaW5Db3VudChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRlR5cGVSZWZPYmpfQ0ZFcXVhbChDRlR5cGVSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCUNGVHlwZVJlZiBjZjI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIENGVHlwZVJlZiBjZjI7CiAjaWZuZGVmIENGRXF1YWwKLQlQeU1hY19QUkVDSEVDSyhDRkVxdWFsKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRkVxdWFsKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZUeXBlUmVmT2JqX0NvbnZlcnQsICZjZjIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRkVxdWFsKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICBjZjIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZUeXBlUmVmT2JqX0NvbnZlcnQsICZjZjIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRkVxdWFsKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICBjZjIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGVHlwZVJlZk9ial9DRkhhc2goQ0ZUeXBlUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRkhhc2hDb2RlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZIYXNoQ29kZSBfcnY7CiAjaWZuZGVmIENGSGFzaAotCVB5TWFjX1BSRUNIRUNLKENGSGFzaCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZIYXNoKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRkhhc2goX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGSGFzaChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRlR5cGVSZWZPYmpfQ0ZDb3B5RGVzY3JpcHRpb24oQ0ZUeXBlUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ1JlZiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGU3RyaW5nUmVmIF9ydjsKICNpZm5kZWYgQ0ZDb3B5RGVzY3JpcHRpb24KLQlQeU1hY19QUkVDSEVDSyhDRkNvcHlEZXNjcmlwdGlvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZDb3B5RGVzY3JpcHRpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGQ29weURlc2NyaXB0aW9uKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRkNvcHlEZXNjcmlwdGlvbihfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRlR5cGVSZWZPYmpfQ0ZQcm9wZXJ0eUxpc3RDcmVhdGVYTUxEYXRhKENGVHlwZVJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZEYXRhUmVmIF9ydjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZQcm9wZXJ0eUxpc3RDcmVhdGVYTUxEYXRhKChDRkFsbG9jYXRvclJlZilOVUxMLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGRGF0YVJlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGRGF0YVJlZiBfcnY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGUHJvcGVydHlMaXN0Q3JlYXRlWE1MRGF0YSgoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRkRhdGFSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGVHlwZVJlZk9ial9DRlByb3BlcnR5TGlzdENyZWF0ZURlZXBDb3B5KENGVHlwZVJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZUeXBlUmVmIF9ydjsKLQlDRk9wdGlvbkZsYWdzIG11dGFiaWxpdHlPcHRpb247Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZtdXRhYmlsaXR5T3B0aW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZQcm9wZXJ0eUxpc3RDcmVhdGVEZWVwQ29weSgoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRhYmlsaXR5T3B0aW9uKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGVHlwZVJlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGVHlwZVJlZiBfcnY7CisgICAgQ0ZPcHRpb25GbGFncyBtdXRhYmlsaXR5T3B0aW9uOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbXV0YWJpbGl0eU9wdGlvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGUHJvcGVydHlMaXN0Q3JlYXRlRGVlcENvcHkoKENGQWxsb2NhdG9yUmVmKU5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXV0YWJpbGl0eU9wdGlvbik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlR5cGVSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGVHlwZVJlZk9ial9DRlNob3coQ0ZUeXBlUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIENGU2hvdwotCVB5TWFjX1BSRUNIRUNLKENGU2hvdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZTaG93KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlDRlNob3coX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDRlNob3coX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGVHlwZVJlZk9ial9DRlByb3BlcnR5TGlzdENyZWF0ZUZyb21YTUxEYXRhKENGVHlwZVJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogCi0JQ0ZUeXBlUmVmIF9ydjsKLQlDRk9wdGlvbkZsYWdzIG11dGFiaWxpdHlPcHRpb247Ci0JQ0ZTdHJpbmdSZWYgZXJyb3JTdHJpbmc7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZtdXRhYmlsaXR5T3B0aW9uKSkKLQkgICAgICAgIHJldHVybiBOVUxMOwotCV9ydiA9IENGUHJvcGVydHlMaXN0Q3JlYXRlRnJvbVhNTERhdGEoKENGQWxsb2NhdG9yUmVmKU5VTEwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXV0YWJpbGl0eU9wdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvclN0cmluZyk7Ci0JaWYgKGVycm9yU3RyaW5nKQotCSAgICAgICAgQ0ZSZWxlYXNlKGVycm9yU3RyaW5nKTsKLQlpZiAoX3J2ID09IE5VTEwpIHsKLQkgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJQYXJzZSBlcnJvciBpbiBYTUwgZGF0YSIpOwotCSAgICAgICAgcmV0dXJuIE5VTEw7Ci0JfQotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZUeXBlUmVmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBDRlR5cGVSZWYgX3J2OworICAgIENGT3B0aW9uRmxhZ3MgbXV0YWJpbGl0eU9wdGlvbjsKKyAgICBDRlN0cmluZ1JlZiBlcnJvclN0cmluZzsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm11dGFiaWxpdHlPcHRpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlByb3BlcnR5TGlzdENyZWF0ZUZyb21YTUxEYXRhKChDRkFsbG9jYXRvclJlZilOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGFiaWxpdHlPcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3JTdHJpbmcpOworICAgIGlmIChlcnJvclN0cmluZykKKyAgICAgICAgQ0ZSZWxlYXNlKGVycm9yU3RyaW5nKTsKKyAgICBpZiAoX3J2ID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgIlBhcnNlIGVycm9yIGluIFhNTCBkYXRhIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGVHlwZVJlZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiAKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRlR5cGVSZWZPYmpfdG9QeXRob24oQ0ZUeXBlUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAKLQlfcmVzID0gUHlDRl9DRjJQeXRob24oX3NlbGYtPm9iX2l0c2VsZik7Ci0JcmV0dXJuIF9yZXM7CisgICAgX3JlcyA9IFB5Q0ZfQ0YyUHl0aG9uKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIHJldHVybiBfcmVzOwogCiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBDRlR5cGVSZWZPYmpfbWV0aG9kc1tdID0gewotCXsiQ0ZHZXRUeXBlSUQiLCAoUHlDRnVuY3Rpb24pQ0ZUeXBlUmVmT2JqX0NGR2V0VHlwZUlELCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDRlR5cGVJRCBfcnYpIil9LAotCXsiQ0ZSZXRhaW4iLCAoUHlDRnVuY3Rpb24pQ0ZUeXBlUmVmT2JqX0NGUmV0YWluLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDRlR5cGVSZWYgX3J2KSIpfSwKLQl7IkNGUmVsZWFzZSIsIChQeUNGdW5jdGlvbilDRlR5cGVSZWZPYmpfQ0ZSZWxlYXNlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJDRkdldFJldGFpbkNvdW50IiwgKFB5Q0Z1bmN0aW9uKUNGVHlwZVJlZk9ial9DRkdldFJldGFpbkNvdW50LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDRkluZGV4IF9ydikiKX0sCi0JeyJDRkVxdWFsIiwgKFB5Q0Z1bmN0aW9uKUNGVHlwZVJlZk9ial9DRkVxdWFsLCAxLAotCSBQeURvY19TVFIoIihDRlR5cGVSZWYgY2YyKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiQ0ZIYXNoIiwgKFB5Q0Z1bmN0aW9uKUNGVHlwZVJlZk9ial9DRkhhc2gsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENGSGFzaENvZGUgX3J2KSIpfSwKLQl7IkNGQ29weURlc2NyaXB0aW9uIiwgKFB5Q0Z1bmN0aW9uKUNGVHlwZVJlZk9ial9DRkNvcHlEZXNjcmlwdGlvbiwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKLQl7IkNGUHJvcGVydHlMaXN0Q3JlYXRlWE1MRGF0YSIsIChQeUNGdW5jdGlvbilDRlR5cGVSZWZPYmpfQ0ZQcm9wZXJ0eUxpc3RDcmVhdGVYTUxEYXRhLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDRkRhdGFSZWYgX3J2KSIpfSwKLQl7IkNGUHJvcGVydHlMaXN0Q3JlYXRlRGVlcENvcHkiLCAoUHlDRnVuY3Rpb24pQ0ZUeXBlUmVmT2JqX0NGUHJvcGVydHlMaXN0Q3JlYXRlRGVlcENvcHksIDEsCi0JIFB5RG9jX1NUUigiKENGT3B0aW9uRmxhZ3MgbXV0YWJpbGl0eU9wdGlvbikgLT4gKENGVHlwZVJlZiBfcnYpIil9LAotCXsiQ0ZTaG93IiwgKFB5Q0Z1bmN0aW9uKUNGVHlwZVJlZk9ial9DRlNob3csIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkNGUHJvcGVydHlMaXN0Q3JlYXRlRnJvbVhNTERhdGEiLCAoUHlDRnVuY3Rpb24pQ0ZUeXBlUmVmT2JqX0NGUHJvcGVydHlMaXN0Q3JlYXRlRnJvbVhNTERhdGEsIDEsCi0JIFB5RG9jX1NUUigiKENGT3B0aW9uRmxhZ3MgbXV0YWJpbGl0eU9wdGlvbikgLT4gKENGVHlwZVJlZk9iaikiKX0sCi0JeyJ0b1B5dGhvbiIsIChQeUNGdW5jdGlvbilDRlR5cGVSZWZPYmpfdG9QeXRob24sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKHB5dGhvbl9vYmplY3QpIil9LAotCXtOVUxMLCBOVUxMLCAwfQorICAgIHsiQ0ZHZXRUeXBlSUQiLCAoUHlDRnVuY3Rpb24pQ0ZUeXBlUmVmT2JqX0NGR2V0VHlwZUlELCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDRlR5cGVJRCBfcnYpIil9LAorICAgIHsiQ0ZSZXRhaW4iLCAoUHlDRnVuY3Rpb24pQ0ZUeXBlUmVmT2JqX0NGUmV0YWluLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDRlR5cGVSZWYgX3J2KSIpfSwKKyAgICB7IkNGUmVsZWFzZSIsIChQeUNGdW5jdGlvbilDRlR5cGVSZWZPYmpfQ0ZSZWxlYXNlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJDRkdldFJldGFpbkNvdW50IiwgKFB5Q0Z1bmN0aW9uKUNGVHlwZVJlZk9ial9DRkdldFJldGFpbkNvdW50LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDRkluZGV4IF9ydikiKX0sCisgICAgeyJDRkVxdWFsIiwgKFB5Q0Z1bmN0aW9uKUNGVHlwZVJlZk9ial9DRkVxdWFsLCAxLAorICAgICBQeURvY19TVFIoIihDRlR5cGVSZWYgY2YyKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiQ0ZIYXNoIiwgKFB5Q0Z1bmN0aW9uKUNGVHlwZVJlZk9ial9DRkhhc2gsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENGSGFzaENvZGUgX3J2KSIpfSwKKyAgICB7IkNGQ29weURlc2NyaXB0aW9uIiwgKFB5Q0Z1bmN0aW9uKUNGVHlwZVJlZk9ial9DRkNvcHlEZXNjcmlwdGlvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKKyAgICB7IkNGUHJvcGVydHlMaXN0Q3JlYXRlWE1MRGF0YSIsIChQeUNGdW5jdGlvbilDRlR5cGVSZWZPYmpfQ0ZQcm9wZXJ0eUxpc3RDcmVhdGVYTUxEYXRhLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDRkRhdGFSZWYgX3J2KSIpfSwKKyAgICB7IkNGUHJvcGVydHlMaXN0Q3JlYXRlRGVlcENvcHkiLCAoUHlDRnVuY3Rpb24pQ0ZUeXBlUmVmT2JqX0NGUHJvcGVydHlMaXN0Q3JlYXRlRGVlcENvcHksIDEsCisgICAgIFB5RG9jX1NUUigiKENGT3B0aW9uRmxhZ3MgbXV0YWJpbGl0eU9wdGlvbikgLT4gKENGVHlwZVJlZiBfcnYpIil9LAorICAgIHsiQ0ZTaG93IiwgKFB5Q0Z1bmN0aW9uKUNGVHlwZVJlZk9ial9DRlNob3csIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkNGUHJvcGVydHlMaXN0Q3JlYXRlRnJvbVhNTERhdGEiLCAoUHlDRnVuY3Rpb24pQ0ZUeXBlUmVmT2JqX0NGUHJvcGVydHlMaXN0Q3JlYXRlRnJvbVhNTERhdGEsIDEsCisgICAgIFB5RG9jX1NUUigiKENGT3B0aW9uRmxhZ3MgbXV0YWJpbGl0eU9wdGlvbikgLT4gKENGVHlwZVJlZk9iaikiKX0sCisgICAgeyJ0b1B5dGhvbiIsIChQeUNGdW5jdGlvbilDRlR5cGVSZWZPYmpfdG9QeXRob24sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKHB5dGhvbl9vYmplY3QpIil9LAorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogI2RlZmluZSBDRlR5cGVSZWZPYmpfZ2V0c2V0bGlzdCBOVUxMCkBAIC0zODIsOTMgKzM4Miw5MyBAQAogCiBzdGF0aWMgaW50IENGVHlwZVJlZk9ial9jb21wYXJlKENGVHlwZVJlZk9iamVjdCAqc2VsZiwgQ0ZUeXBlUmVmT2JqZWN0ICpvdGhlcikKIHsKLQkvKiBYWFhYIE9yIHNob3VsZCB3ZSB1c2UgQ0ZFcXVhbD8/ICovCi0JaWYgKCBzZWxmLT5vYl9pdHNlbGYgPiBvdGhlci0+b2JfaXRzZWxmICkgcmV0dXJuIDE7Ci0JaWYgKCBzZWxmLT5vYl9pdHNlbGYgPCBvdGhlci0+b2JfaXRzZWxmICkgcmV0dXJuIC0xOwotCXJldHVybiAwOworICAgIC8qIFhYWFggT3Igc2hvdWxkIHdlIHVzZSBDRkVxdWFsPz8gKi8KKyAgICBpZiAoIHNlbGYtPm9iX2l0c2VsZiA+IG90aGVyLT5vYl9pdHNlbGYgKSByZXR1cm4gMTsKKyAgICBpZiAoIHNlbGYtPm9iX2l0c2VsZiA8IG90aGVyLT5vYl9pdHNlbGYgKSByZXR1cm4gLTE7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqIENGVHlwZVJlZk9ial9yZXByKENGVHlwZVJlZk9iamVjdCAqc2VsZikKIHsKLQljaGFyIGJ1ZlsxMDBdOwotCXNwcmludGYoYnVmLCAiPENGVHlwZVJlZiB0eXBlLSVkIG9iamVjdCBhdCAweCU4Ljh4IGZvciAweCU4Ljh4PiIsIChpbnQpQ0ZHZXRUeXBlSUQoc2VsZi0+b2JfaXRzZWxmKSwgKHVuc2lnbmVkKXNlbGYsICh1bnNpZ25lZClzZWxmLT5vYl9pdHNlbGYpOwotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CisgICAgY2hhciBidWZbMTAwXTsKKyAgICBzcHJpbnRmKGJ1ZiwgIjxDRlR5cGVSZWYgdHlwZS0lZCBvYmplY3QgYXQgMHglOC44eCBmb3IgMHglOC44eD4iLCAoaW50KUNGR2V0VHlwZUlEKHNlbGYtPm9iX2l0c2VsZiksICh1bnNpZ25lZClzZWxmLCAodW5zaWduZWQpc2VsZi0+b2JfaXRzZWxmKTsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOwogfQogCiBzdGF0aWMgaW50IENGVHlwZVJlZk9ial9oYXNoKENGVHlwZVJlZk9iamVjdCAqc2VsZikKIHsKLQkvKiBYWFhYIE9yIHNob3VsZCB3ZSB1c2UgQ0ZIYXNoPz8gKi8KLQlyZXR1cm4gKGludClzZWxmLT5vYl9pdHNlbGY7CisgICAgLyogWFhYWCBPciBzaG91bGQgd2UgdXNlIENGSGFzaD8/ICovCisgICAgcmV0dXJuIChpbnQpc2VsZi0+b2JfaXRzZWxmOwogfQogc3RhdGljIGludCBDRlR5cGVSZWZPYmpfdHBfaW5pdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncywgUHlPYmplY3QgKl9rd2RzKQogewotCUNGVHlwZVJlZiBpdHNlbGY7Ci0JY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CisgICAgQ0ZUeXBlUmVmIGl0c2VsZjsKKyAgICBjaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKIAotCWlmIChQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgQ0ZUeXBlUmVmT2JqX0NvbnZlcnQsICZpdHNlbGYpKQotCXsKLQkJKChDRlR5cGVSZWZPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiAtMTsKKyAgICBpZiAoUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIENGVHlwZVJlZk9ial9Db252ZXJ0LCAmaXRzZWxmKSkKKyAgICB7CisgICAgICAgICgoQ0ZUeXBlUmVmT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gLTE7CiB9CiAKICNkZWZpbmUgQ0ZUeXBlUmVmT2JqX3RwX2FsbG9jIFB5VHlwZV9HZW5lcmljQWxsb2MKIAogc3RhdGljIFB5T2JqZWN0ICpDRlR5cGVSZWZPYmpfdHBfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKl9hcmdzLCBQeU9iamVjdCAqX2t3ZHMpCiB7Ci0JUHlPYmplY3QgKnNlbGY7Ci0JaWYgKChzZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOwotCSgoQ0ZUeXBlUmVmT2JqZWN0ICopc2VsZiktPm9iX2l0c2VsZiA9IE5VTEw7Ci0JKChDRlR5cGVSZWZPYmplY3QgKilzZWxmKS0+b2JfZnJlZWl0ID0gQ0ZSZWxlYXNlOwotCXJldHVybiBzZWxmOworICAgIFB5T2JqZWN0ICpzZWxmOworICAgIGlmICgoc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAoKENGVHlwZVJlZk9iamVjdCAqKXNlbGYpLT5vYl9pdHNlbGYgPSBOVUxMOworICAgICgoQ0ZUeXBlUmVmT2JqZWN0ICopc2VsZiktPm9iX2ZyZWVpdCA9IENGUmVsZWFzZTsKKyAgICByZXR1cm4gc2VsZjsKIH0KIAogI2RlZmluZSBDRlR5cGVSZWZPYmpfdHBfZnJlZSBQeU9iamVjdF9EZWwKIAogCiBQeVR5cGVPYmplY3QgQ0ZUeXBlUmVmX1R5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCi0JMCwgLypvYl9zaXplKi8KLQkiX0NGLkNGVHlwZVJlZiIsIC8qdHBfbmFtZSovCi0Jc2l6ZW9mKENGVHlwZVJlZk9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KLQkwLCAvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpIENGVHlwZVJlZk9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsIC8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLwotCShjbXBmdW5jKSBDRlR5cGVSZWZPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpIENGVHlwZVJlZk9ial9yZXByLCAvKnRwX3JlcHIqLwotCShQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KLQkoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLwotCShQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYykgQ0ZUeXBlUmVmT2JqX2hhc2gsIC8qdHBfaGFzaCovCi0JMCwgLyp0cF9jYWxsKi8KLQkwLCAvKnRwX3N0ciovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLwotCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCi0JMCwgLyp0cF9hc19idWZmZXIqLwotCVB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCTAsIC8qdHBfZG9jKi8KLQkwLCAvKnRwX3RyYXZlcnNlKi8KLQkwLCAvKnRwX2NsZWFyKi8KLQkwLCAvKnRwX3JpY2hjb21wYXJlKi8KLQkwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLQkwLCAvKnRwX2l0ZXIqLwotCTAsIC8qdHBfaXRlcm5leHQqLwotCUNGVHlwZVJlZk9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCi0JMCwgLyp0cF9tZW1iZXJzKi8KLQlDRlR5cGVSZWZPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLwotCTAsIC8qdHBfYmFzZSovCi0JMCwgLyp0cF9kaWN0Ki8KLQkwLCAvKnRwX2Rlc2NyX2dldCovCi0JMCwgLyp0cF9kZXNjcl9zZXQqLwotCTAsIC8qdHBfZGljdG9mZnNldCovCi0JQ0ZUeXBlUmVmT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KLQlDRlR5cGVSZWZPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCi0JQ0ZUeXBlUmVmT2JqX3RwX25ldywgLyogdHBfbmV3ICovCi0JQ0ZUeXBlUmVmT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAvKm9iX3NpemUqLworICAgICJfQ0YuQ0ZUeXBlUmVmIiwgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoQ0ZUeXBlUmVmT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLworICAgIDAsIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcikgQ0ZUeXBlUmVmT2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgMCwgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCisgICAgKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCisgICAgKGNtcGZ1bmMpIENGVHlwZVJlZk9ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLworICAgIChyZXByZnVuYykgQ0ZUeXBlUmVmT2JqX3JlcHIsIC8qdHBfcmVwciovCisgICAgKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLworICAgIChQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKSBDRlR5cGVSZWZPYmpfaGFzaCwgLyp0cF9oYXNoKi8KKyAgICAwLCAvKnRwX2NhbGwqLworICAgIDAsIC8qdHBfc3RyKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCisgICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgMCwgLyp0cF9kb2MqLworICAgIDAsIC8qdHBfdHJhdmVyc2UqLworICAgIDAsIC8qdHBfY2xlYXIqLworICAgIDAsIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsIC8qdHBfaXRlciovCisgICAgMCwgLyp0cF9pdGVybmV4dCovCisgICAgQ0ZUeXBlUmVmT2JqX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAvKnRwX21lbWJlcnMqLworICAgIENGVHlwZVJlZk9ial9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCisgICAgMCwgLyp0cF9iYXNlKi8KKyAgICAwLCAvKnRwX2RpY3QqLworICAgIDAsIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICBDRlR5cGVSZWZPYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLworICAgIENGVHlwZVJlZk9ial90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KKyAgICBDRlR5cGVSZWZPYmpfdHBfbmV3LCAvKiB0cF9uZXcgKi8KKyAgICBDRlR5cGVSZWZPYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLSBFbmQgb2JqZWN0IHR5cGUgQ0ZUeXBlUmVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC00ODEsMTA0ICs0ODEsMTA0IEBACiAjZGVmaW5lIENGQXJyYXlSZWZPYmpfQ2hlY2soeCkgKCh4KS0+b2JfdHlwZSA9PSAmQ0ZBcnJheVJlZl9UeXBlIHx8IFB5T2JqZWN0X1R5cGVDaGVjaygoeCksICZDRkFycmF5UmVmX1R5cGUpKQogCiB0eXBlZGVmIHN0cnVjdCBDRkFycmF5UmVmT2JqZWN0IHsKLQlQeU9iamVjdF9IRUFECi0JQ0ZBcnJheVJlZiBvYl9pdHNlbGY7Ci0Jdm9pZCAoKm9iX2ZyZWVpdCkoQ0ZUeXBlUmVmIHB0cik7CisgICAgUHlPYmplY3RfSEVBRAorICAgIENGQXJyYXlSZWYgb2JfaXRzZWxmOworICAgIHZvaWQgKCpvYl9mcmVlaXQpKENGVHlwZVJlZiBwdHIpOwogfSBDRkFycmF5UmVmT2JqZWN0OwogCiBQeU9iamVjdCAqQ0ZBcnJheVJlZk9ial9OZXcoQ0ZBcnJheVJlZiBpdHNlbGYpCiB7Ci0JQ0ZBcnJheVJlZk9iamVjdCAqaXQ7Ci0JaWYgKGl0c2VsZiA9PSBOVUxMKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgImNhbm5vdCB3cmFwIE5VTEwiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWl0ID0gUHlPYmplY3RfTkVXKENGQXJyYXlSZWZPYmplY3QsICZDRkFycmF5UmVmX1R5cGUpOwotCWlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkvKiBYWFhYIFNob3VsZCB3ZSB0cF9pbml0IG9yIHRwX25ldyBvdXIgYmFzZXR5cGU/ICovCi0JaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlpdC0+b2JfZnJlZWl0ID0gQ0ZSZWxlYXNlOwotCXJldHVybiAoUHlPYmplY3QgKilpdDsKKyAgICBDRkFycmF5UmVmT2JqZWN0ICppdDsKKyAgICBpZiAoaXRzZWxmID09IE5VTEwpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAiY2Fubm90IHdyYXAgTlVMTCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaXQgPSBQeU9iamVjdF9ORVcoQ0ZBcnJheVJlZk9iamVjdCwgJkNGQXJyYXlSZWZfVHlwZSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIC8qIFhYWFggU2hvdWxkIHdlIHRwX2luaXQgb3IgdHBfbmV3IG91ciBiYXNldHlwZT8gKi8KKyAgICBpdC0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIGl0LT5vYl9mcmVlaXQgPSBDRlJlbGVhc2U7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogCiBpbnQgQ0ZBcnJheVJlZk9ial9Db252ZXJ0KFB5T2JqZWN0ICp2LCBDRkFycmF5UmVmICpwX2l0c2VsZikKIHsKIAotCWlmICh2ID09IFB5X05vbmUpIHsgKnBfaXRzZWxmID0gTlVMTDsgcmV0dXJuIDE7IH0KLQkvKiBDaGVjayBmb3Igb3RoZXIgQ0Ygb2JqZWN0cyBoZXJlICovCisgICAgaWYgKHYgPT0gUHlfTm9uZSkgeyAqcF9pdHNlbGYgPSBOVUxMOyByZXR1cm4gMTsgfQorICAgIC8qIENoZWNrIGZvciBvdGhlciBDRiBvYmplY3RzIGhlcmUgKi8KIAotCWlmICghQ0ZBcnJheVJlZk9ial9DaGVjayh2KSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJDRkFycmF5UmVmIHJlcXVpcmVkIik7Ci0JCXJldHVybiAwOwotCX0KLQkqcF9pdHNlbGYgPSAoKENGQXJyYXlSZWZPYmplY3QgKil2KS0+b2JfaXRzZWxmOwotCXJldHVybiAxOworICAgIGlmICghQ0ZBcnJheVJlZk9ial9DaGVjayh2KSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJDRkFycmF5UmVmIHJlcXVpcmVkIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAqcF9pdHNlbGYgPSAoKENGQXJyYXlSZWZPYmplY3QgKil2KS0+b2JfaXRzZWxmOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgdm9pZCBDRkFycmF5UmVmT2JqX2RlYWxsb2MoQ0ZBcnJheVJlZk9iamVjdCAqc2VsZikKIHsKLQlpZiAoc2VsZi0+b2JfZnJlZWl0ICYmIHNlbGYtPm9iX2l0c2VsZikKLQl7Ci0JCXNlbGYtPm9iX2ZyZWVpdCgoQ0ZUeXBlUmVmKXNlbGYtPm9iX2l0c2VsZik7Ci0JCXNlbGYtPm9iX2l0c2VsZiA9IE5VTEw7Ci0JfQotCUNGVHlwZVJlZl9UeXBlLnRwX2RlYWxsb2MoKFB5T2JqZWN0ICopc2VsZik7CisgICAgaWYgKHNlbGYtPm9iX2ZyZWVpdCAmJiBzZWxmLT5vYl9pdHNlbGYpCisgICAgeworICAgICAgICBzZWxmLT5vYl9mcmVlaXQoKENGVHlwZVJlZilzZWxmLT5vYl9pdHNlbGYpOworICAgICAgICBzZWxmLT5vYl9pdHNlbGYgPSBOVUxMOworICAgIH0KKyAgICBDRlR5cGVSZWZfVHlwZS50cF9kZWFsbG9jKChQeU9iamVjdCAqKXNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGQXJyYXlSZWZPYmpfQ0ZBcnJheUNyZWF0ZUNvcHkoQ0ZBcnJheVJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZBcnJheVJlZiBfcnY7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGQXJyYXlDcmVhdGVDb3B5KChDRkFsbG9jYXRvclJlZilOVUxMLAotCSAgICAgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZBcnJheVJlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGQXJyYXlSZWYgX3J2OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRkFycmF5Q3JlYXRlQ29weSgoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGQXJyYXlSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGQXJyYXlSZWZPYmpfQ0ZBcnJheUdldENvdW50KENGQXJyYXlSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGSW5kZXggX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRkluZGV4IF9ydjsKICNpZm5kZWYgQ0ZBcnJheUdldENvdW50Ci0JUHlNYWNfUFJFQ0hFQ0soQ0ZBcnJheUdldENvdW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRkFycmF5R2V0Q291bnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGQXJyYXlHZXRDb3VudChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZBcnJheUdldENvdW50KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGQXJyYXlSZWZPYmpfQ0ZTdHJpbmdDcmVhdGVCeUNvbWJpbmluZ1N0cmluZ3MoQ0ZBcnJheVJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZTdHJpbmdSZWYgX3J2OwotCUNGU3RyaW5nUmVmIHNlcGFyYXRvclN0cmluZzsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZzZXBhcmF0b3JTdHJpbmcpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRlN0cmluZ0NyZWF0ZUJ5Q29tYmluaW5nU3RyaW5ncygoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcGFyYXRvclN0cmluZyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGU3RyaW5nUmVmIF9ydjsKKyAgICBDRlN0cmluZ1JlZiBzZXBhcmF0b3JTdHJpbmc7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmc2VwYXJhdG9yU3RyaW5nKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZTdHJpbmdDcmVhdGVCeUNvbWJpbmluZ1N0cmluZ3MoKENGQWxsb2NhdG9yUmVmKU5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXBhcmF0b3JTdHJpbmcpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgQ0ZBcnJheVJlZk9ial9tZXRob2RzW10gPSB7Ci0JeyJDRkFycmF5Q3JlYXRlQ29weSIsIChQeUNGdW5jdGlvbilDRkFycmF5UmVmT2JqX0NGQXJyYXlDcmVhdGVDb3B5LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDRkFycmF5UmVmIF9ydikiKX0sCi0JeyJDRkFycmF5R2V0Q291bnQiLCAoUHlDRnVuY3Rpb24pQ0ZBcnJheVJlZk9ial9DRkFycmF5R2V0Q291bnQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENGSW5kZXggX3J2KSIpfSwKLQl7IkNGU3RyaW5nQ3JlYXRlQnlDb21iaW5pbmdTdHJpbmdzIiwgKFB5Q0Z1bmN0aW9uKUNGQXJyYXlSZWZPYmpfQ0ZTdHJpbmdDcmVhdGVCeUNvbWJpbmluZ1N0cmluZ3MsIDEsCi0JIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIHNlcGFyYXRvclN0cmluZykgLT4gKENGU3RyaW5nUmVmIF9ydikiKX0sCi0Je05VTEwsIE5VTEwsIDB9CisgICAgeyJDRkFycmF5Q3JlYXRlQ29weSIsIChQeUNGdW5jdGlvbilDRkFycmF5UmVmT2JqX0NGQXJyYXlDcmVhdGVDb3B5LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDRkFycmF5UmVmIF9ydikiKX0sCisgICAgeyJDRkFycmF5R2V0Q291bnQiLCAoUHlDRnVuY3Rpb24pQ0ZBcnJheVJlZk9ial9DRkFycmF5R2V0Q291bnQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENGSW5kZXggX3J2KSIpfSwKKyAgICB7IkNGU3RyaW5nQ3JlYXRlQnlDb21iaW5pbmdTdHJpbmdzIiwgKFB5Q0Z1bmN0aW9uKUNGQXJyYXlSZWZPYmpfQ0ZTdHJpbmdDcmVhdGVCeUNvbWJpbmluZ1N0cmluZ3MsIDEsCisgICAgIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIHNlcGFyYXRvclN0cmluZykgLT4gKENGU3RyaW5nUmVmIF9ydikiKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAjZGVmaW5lIENGQXJyYXlSZWZPYmpfZ2V0c2V0bGlzdCBOVUxMCkBAIC01ODYsMTAwICs1ODYsMTAwIEBACiAKIHN0YXRpYyBpbnQgQ0ZBcnJheVJlZk9ial9jb21wYXJlKENGQXJyYXlSZWZPYmplY3QgKnNlbGYsIENGQXJyYXlSZWZPYmplY3QgKm90aGVyKQogewotCS8qIFhYWFggT3Igc2hvdWxkIHdlIHVzZSBDRkVxdWFsPz8gKi8KLQlpZiAoIHNlbGYtPm9iX2l0c2VsZiA+IG90aGVyLT5vYl9pdHNlbGYgKSByZXR1cm4gMTsKLQlpZiAoIHNlbGYtPm9iX2l0c2VsZiA8IG90aGVyLT5vYl9pdHNlbGYgKSByZXR1cm4gLTE7Ci0JcmV0dXJuIDA7CisgICAgLyogWFhYWCBPciBzaG91bGQgd2UgdXNlIENGRXF1YWw/PyAqLworICAgIGlmICggc2VsZi0+b2JfaXRzZWxmID4gb3RoZXItPm9iX2l0c2VsZiApIHJldHVybiAxOworICAgIGlmICggc2VsZi0+b2JfaXRzZWxmIDwgb3RoZXItPm9iX2l0c2VsZiApIHJldHVybiAtMTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICogQ0ZBcnJheVJlZk9ial9yZXByKENGQXJyYXlSZWZPYmplY3QgKnNlbGYpCiB7Ci0JY2hhciBidWZbMTAwXTsKLQlzcHJpbnRmKGJ1ZiwgIjxDRkFycmF5UmVmIG9iamVjdCBhdCAweCU4Ljh4IGZvciAweCU4Ljh4PiIsICh1bnNpZ25lZClzZWxmLCAodW5zaWduZWQpc2VsZi0+b2JfaXRzZWxmKTsKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOworICAgIGNoYXIgYnVmWzEwMF07CisgICAgc3ByaW50ZihidWYsICI8Q0ZBcnJheVJlZiBvYmplY3QgYXQgMHglOC44eCBmb3IgMHglOC44eD4iLCAodW5zaWduZWQpc2VsZiwgKHVuc2lnbmVkKXNlbGYtPm9iX2l0c2VsZik7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmKTsKIH0KIAogc3RhdGljIGludCBDRkFycmF5UmVmT2JqX2hhc2goQ0ZBcnJheVJlZk9iamVjdCAqc2VsZikKIHsKLQkvKiBYWFhYIE9yIHNob3VsZCB3ZSB1c2UgQ0ZIYXNoPz8gKi8KLQlyZXR1cm4gKGludClzZWxmLT5vYl9pdHNlbGY7CisgICAgLyogWFhYWCBPciBzaG91bGQgd2UgdXNlIENGSGFzaD8/ICovCisgICAgcmV0dXJuIChpbnQpc2VsZi0+b2JfaXRzZWxmOwogfQogc3RhdGljIGludCBDRkFycmF5UmVmT2JqX3RwX2luaXQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlDRkFycmF5UmVmIGl0c2VsZjsKLQljaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKKyAgICBDRkFycmF5UmVmIGl0c2VsZjsKKyAgICBjaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKIAotCWlmIChQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgQ0ZBcnJheVJlZk9ial9Db252ZXJ0LCAmaXRzZWxmKSkKLQl7Ci0JCSgoQ0ZBcnJheVJlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCQlyZXR1cm4gMDsKLQl9CisgICAgaWYgKFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBDRkFycmF5UmVmT2JqX0NvbnZlcnQsICZpdHNlbGYpKQorICAgIHsKKyAgICAgICAgKChDRkFycmF5UmVmT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgICAgIHJldHVybiAwOworICAgIH0KIAotCS8qIEFueSBDRlR5cGVSZWYgZGVzY2VuZGVudCBpcyBhbGxvd2VkIGFzIGluaXRpYWxpemVyIHRvbyAqLwotCWlmIChQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgQ0ZUeXBlUmVmT2JqX0NvbnZlcnQsICZpdHNlbGYpKQotCXsKLQkJKChDRkFycmF5UmVmT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JCXJldHVybiAwOwotCX0KLQlyZXR1cm4gLTE7CisgICAgLyogQW55IENGVHlwZVJlZiBkZXNjZW5kZW50IGlzIGFsbG93ZWQgYXMgaW5pdGlhbGl6ZXIgdG9vICovCisgICAgaWYgKFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBDRlR5cGVSZWZPYmpfQ29udmVydCwgJml0c2VsZikpCisgICAgeworICAgICAgICAoKENGQXJyYXlSZWZPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAtMTsKIH0KIAogI2RlZmluZSBDRkFycmF5UmVmT2JqX3RwX2FsbG9jIFB5VHlwZV9HZW5lcmljQWxsb2MKIAogc3RhdGljIFB5T2JqZWN0ICpDRkFycmF5UmVmT2JqX3RwX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICpfYXJncywgUHlPYmplY3QgKl9rd2RzKQogewotCVB5T2JqZWN0ICpzZWxmOwotCWlmICgoc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkoKENGQXJyYXlSZWZPYmplY3QgKilzZWxmKS0+b2JfaXRzZWxmID0gTlVMTDsKLQkoKENGQXJyYXlSZWZPYmplY3QgKilzZWxmKS0+b2JfZnJlZWl0ID0gQ0ZSZWxlYXNlOwotCXJldHVybiBzZWxmOworICAgIFB5T2JqZWN0ICpzZWxmOworICAgIGlmICgoc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAoKENGQXJyYXlSZWZPYmplY3QgKilzZWxmKS0+b2JfaXRzZWxmID0gTlVMTDsKKyAgICAoKENGQXJyYXlSZWZPYmplY3QgKilzZWxmKS0+b2JfZnJlZWl0ID0gQ0ZSZWxlYXNlOworICAgIHJldHVybiBzZWxmOwogfQogCiAjZGVmaW5lIENGQXJyYXlSZWZPYmpfdHBfZnJlZSBQeU9iamVjdF9EZWwKIAogCiBQeVR5cGVPYmplY3QgQ0ZBcnJheVJlZl9UeXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQotCTAsIC8qb2Jfc2l6ZSovCi0JIl9DRi5DRkFycmF5UmVmIiwgLyp0cF9uYW1lKi8KLQlzaXplb2YoQ0ZBcnJheVJlZk9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KLQkwLCAvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpIENGQXJyYXlSZWZPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KLQkwLCAvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykgQ0ZBcnJheVJlZk9ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYykgQ0ZBcnJheVJlZk9ial9yZXByLCAvKnRwX3JlcHIqLwotCShQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KLQkoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLwotCShQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYykgQ0ZBcnJheVJlZk9ial9oYXNoLCAvKnRwX2hhc2gqLwotCTAsIC8qdHBfY2FsbCovCi0JMCwgLyp0cF9zdHIqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KLQlQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLwotCTAsIC8qdHBfYXNfYnVmZmVyKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQkwLCAvKnRwX2RvYyovCi0JMCwgLyp0cF90cmF2ZXJzZSovCi0JMCwgLyp0cF9jbGVhciovCi0JMCwgLyp0cF9yaWNoY29tcGFyZSovCi0JMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCi0JMCwgLyp0cF9pdGVyKi8KLQkwLCAvKnRwX2l0ZXJuZXh0Ki8KLQlDRkFycmF5UmVmT2JqX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KLQkwLCAvKnRwX21lbWJlcnMqLwotCUNGQXJyYXlSZWZPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLwotCTAsIC8qdHBfYmFzZSovCi0JMCwgLyp0cF9kaWN0Ki8KLQkwLCAvKnRwX2Rlc2NyX2dldCovCi0JMCwgLyp0cF9kZXNjcl9zZXQqLwotCTAsIC8qdHBfZGljdG9mZnNldCovCi0JQ0ZBcnJheVJlZk9ial90cF9pbml0LCAvKiB0cF9pbml0ICovCi0JQ0ZBcnJheVJlZk9ial90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KLQlDRkFycmF5UmVmT2JqX3RwX25ldywgLyogdHBfbmV3ICovCi0JQ0ZBcnJheVJlZk9ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgLypvYl9zaXplKi8KKyAgICAiX0NGLkNGQXJyYXlSZWYiLCAvKnRwX25hbWUqLworICAgIHNpemVvZihDRkFycmF5UmVmT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLworICAgIDAsIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcikgQ0ZBcnJheVJlZk9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgIDAsIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLworICAgIChzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLworICAgIChjbXBmdW5jKSBDRkFycmF5UmVmT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCisgICAgKHJlcHJmdW5jKSBDRkFycmF5UmVmT2JqX3JlcHIsIC8qdHBfcmVwciovCisgICAgKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLworICAgIChQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKSBDRkFycmF5UmVmT2JqX2hhc2gsIC8qdHBfaGFzaCovCisgICAgMCwgLyp0cF9jYWxsKi8KKyAgICAwLCAvKnRwX3N0ciovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLworICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCisgICAgMCwgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLworICAgIDAsIC8qdHBfZG9jKi8KKyAgICAwLCAvKnRwX3RyYXZlcnNlKi8KKyAgICAwLCAvKnRwX2NsZWFyKi8KKyAgICAwLCAvKnRwX3JpY2hjb21wYXJlKi8KKyAgICAwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KKyAgICAwLCAvKnRwX2l0ZXIqLworICAgIDAsIC8qdHBfaXRlcm5leHQqLworICAgIENGQXJyYXlSZWZPYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLworICAgIDAsIC8qdHBfbWVtYmVycyovCisgICAgQ0ZBcnJheVJlZk9ial9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCisgICAgMCwgLyp0cF9iYXNlKi8KKyAgICAwLCAvKnRwX2RpY3QqLworICAgIDAsIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICBDRkFycmF5UmVmT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KKyAgICBDRkFycmF5UmVmT2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLworICAgIENGQXJyYXlSZWZPYmpfdHBfbmV3LCAvKiB0cF9uZXcgKi8KKyAgICBDRkFycmF5UmVmT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0gRW5kIG9iamVjdCB0eXBlIENGQXJyYXlSZWYgLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtNjkyLDEzMyArNjkyLDEzMyBAQAogI2RlZmluZSBDRk11dGFibGVBcnJheVJlZk9ial9DaGVjayh4KSAoKHgpLT5vYl90eXBlID09ICZDRk11dGFibGVBcnJheVJlZl9UeXBlIHx8IFB5T2JqZWN0X1R5cGVDaGVjaygoeCksICZDRk11dGFibGVBcnJheVJlZl9UeXBlKSkKIAogdHlwZWRlZiBzdHJ1Y3QgQ0ZNdXRhYmxlQXJyYXlSZWZPYmplY3QgewotCVB5T2JqZWN0X0hFQUQKLQlDRk11dGFibGVBcnJheVJlZiBvYl9pdHNlbGY7Ci0Jdm9pZCAoKm9iX2ZyZWVpdCkoQ0ZUeXBlUmVmIHB0cik7CisgICAgUHlPYmplY3RfSEVBRAorICAgIENGTXV0YWJsZUFycmF5UmVmIG9iX2l0c2VsZjsKKyAgICB2b2lkICgqb2JfZnJlZWl0KShDRlR5cGVSZWYgcHRyKTsKIH0gQ0ZNdXRhYmxlQXJyYXlSZWZPYmplY3Q7CiAKIFB5T2JqZWN0ICpDRk11dGFibGVBcnJheVJlZk9ial9OZXcoQ0ZNdXRhYmxlQXJyYXlSZWYgaXRzZWxmKQogewotCUNGTXV0YWJsZUFycmF5UmVmT2JqZWN0ICppdDsKLQlpZiAoaXRzZWxmID09IE5VTEwpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAiY2Fubm90IHdyYXAgTlVMTCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaXQgPSBQeU9iamVjdF9ORVcoQ0ZNdXRhYmxlQXJyYXlSZWZPYmplY3QsICZDRk11dGFibGVBcnJheVJlZl9UeXBlKTsKLQlpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JLyogWFhYWCBTaG91bGQgd2UgdHBfaW5pdCBvciB0cF9uZXcgb3VyIGJhc2V0eXBlPyAqLwotCWl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JaXQtPm9iX2ZyZWVpdCA9IENGUmVsZWFzZTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgQ0ZNdXRhYmxlQXJyYXlSZWZPYmplY3QgKml0OworICAgIGlmIChpdHNlbGYgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJjYW5ub3Qgd3JhcCBOVUxMIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpdCA9IFB5T2JqZWN0X05FVyhDRk11dGFibGVBcnJheVJlZk9iamVjdCwgJkNGTXV0YWJsZUFycmF5UmVmX1R5cGUpOworICAgIGlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAvKiBYWFhYIFNob3VsZCB3ZSB0cF9pbml0IG9yIHRwX25ldyBvdXIgYmFzZXR5cGU/ICovCisgICAgaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICBpdC0+b2JfZnJlZWl0ID0gQ0ZSZWxlYXNlOworICAgIHJldHVybiAoUHlPYmplY3QgKilpdDsKIH0KIAogaW50IENGTXV0YWJsZUFycmF5UmVmT2JqX0NvbnZlcnQoUHlPYmplY3QgKnYsIENGTXV0YWJsZUFycmF5UmVmICpwX2l0c2VsZikKIHsKIAotCWlmICh2ID09IFB5X05vbmUpIHsgKnBfaXRzZWxmID0gTlVMTDsgcmV0dXJuIDE7IH0KLQkvKiBDaGVjayBmb3Igb3RoZXIgQ0Ygb2JqZWN0cyBoZXJlICovCisgICAgaWYgKHYgPT0gUHlfTm9uZSkgeyAqcF9pdHNlbGYgPSBOVUxMOyByZXR1cm4gMTsgfQorICAgIC8qIENoZWNrIGZvciBvdGhlciBDRiBvYmplY3RzIGhlcmUgKi8KIAotCWlmICghQ0ZNdXRhYmxlQXJyYXlSZWZPYmpfQ2hlY2sodikpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiQ0ZNdXRhYmxlQXJyYXlSZWYgcmVxdWlyZWQiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCSpwX2l0c2VsZiA9ICgoQ0ZNdXRhYmxlQXJyYXlSZWZPYmplY3QgKil2KS0+b2JfaXRzZWxmOwotCXJldHVybiAxOworICAgIGlmICghQ0ZNdXRhYmxlQXJyYXlSZWZPYmpfQ2hlY2sodikpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiQ0ZNdXRhYmxlQXJyYXlSZWYgcmVxdWlyZWQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICpwX2l0c2VsZiA9ICgoQ0ZNdXRhYmxlQXJyYXlSZWZPYmplY3QgKil2KS0+b2JfaXRzZWxmOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgdm9pZCBDRk11dGFibGVBcnJheVJlZk9ial9kZWFsbG9jKENGTXV0YWJsZUFycmF5UmVmT2JqZWN0ICpzZWxmKQogewotCWlmIChzZWxmLT5vYl9mcmVlaXQgJiYgc2VsZi0+b2JfaXRzZWxmKQotCXsKLQkJc2VsZi0+b2JfZnJlZWl0KChDRlR5cGVSZWYpc2VsZi0+b2JfaXRzZWxmKTsKLQkJc2VsZi0+b2JfaXRzZWxmID0gTlVMTDsKLQl9Ci0JQ0ZBcnJheVJlZl9UeXBlLnRwX2RlYWxsb2MoKFB5T2JqZWN0ICopc2VsZik7CisgICAgaWYgKHNlbGYtPm9iX2ZyZWVpdCAmJiBzZWxmLT5vYl9pdHNlbGYpCisgICAgeworICAgICAgICBzZWxmLT5vYl9mcmVlaXQoKENGVHlwZVJlZilzZWxmLT5vYl9pdHNlbGYpOworICAgICAgICBzZWxmLT5vYl9pdHNlbGYgPSBOVUxMOworICAgIH0KKyAgICBDRkFycmF5UmVmX1R5cGUudHBfZGVhbGxvYygoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRk11dGFibGVBcnJheVJlZk9ial9DRkFycmF5UmVtb3ZlVmFsdWVBdEluZGV4KENGTXV0YWJsZUFycmF5UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRkluZGV4IGlkeDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZJbmRleCBpZHg7CiAjaWZuZGVmIENGQXJyYXlSZW1vdmVWYWx1ZUF0SW5kZXgKLQlQeU1hY19QUkVDSEVDSyhDRkFycmF5UmVtb3ZlVmFsdWVBdEluZGV4KTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRkFycmF5UmVtb3ZlVmFsdWVBdEluZGV4KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaWR4KSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0ZBcnJheVJlbW92ZVZhbHVlQXRJbmRleChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgaWR4KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpZHgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDRkFycmF5UmVtb3ZlVmFsdWVBdEluZGV4KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZHgpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRk11dGFibGVBcnJheVJlZk9ial9DRkFycmF5UmVtb3ZlQWxsVmFsdWVzKENGTXV0YWJsZUFycmF5UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIENGQXJyYXlSZW1vdmVBbGxWYWx1ZXMKLQlQeU1hY19QUkVDSEVDSyhDRkFycmF5UmVtb3ZlQWxsVmFsdWVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRkFycmF5UmVtb3ZlQWxsVmFsdWVzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlDRkFycmF5UmVtb3ZlQWxsVmFsdWVzKF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0ZBcnJheVJlbW92ZUFsbFZhbHVlcyhfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZNdXRhYmxlQXJyYXlSZWZPYmpfQ0ZBcnJheUV4Y2hhbmdlVmFsdWVzQXRJbmRpY2VzKENGTXV0YWJsZUFycmF5UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRkluZGV4IGlkeDE7Ci0JQ0ZJbmRleCBpZHgyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRkluZGV4IGlkeDE7CisgICAgQ0ZJbmRleCBpZHgyOwogI2lmbmRlZiBDRkFycmF5RXhjaGFuZ2VWYWx1ZXNBdEluZGljZXMKLQlQeU1hY19QUkVDSEVDSyhDRkFycmF5RXhjaGFuZ2VWYWx1ZXNBdEluZGljZXMpOworICAgIFB5TWFjX1BSRUNIRUNLKENGQXJyYXlFeGNoYW5nZVZhbHVlc0F0SW5kaWNlcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpZHgxLAotCSAgICAgICAgICAgICAgICAgICAgICAmaWR4MikpCi0JCXJldHVybiBOVUxMOwotCUNGQXJyYXlFeGNoYW5nZVZhbHVlc0F0SW5kaWNlcyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZHgxLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZHgyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaWR4MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlkeDIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDRkFycmF5RXhjaGFuZ2VWYWx1ZXNBdEluZGljZXMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWR4MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWR4Mik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGTXV0YWJsZUFycmF5UmVmT2JqX0NGQXJyYXlBcHBlbmRBcnJheShDRk11dGFibGVBcnJheVJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZBcnJheVJlZiBvdGhlckFycmF5OwotCUNGUmFuZ2Ugb3RoZXJSYW5nZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZBcnJheVJlZiBvdGhlckFycmF5OworICAgIENGUmFuZ2Ugb3RoZXJSYW5nZTsKICNpZm5kZWYgQ0ZBcnJheUFwcGVuZEFycmF5Ci0JUHlNYWNfUFJFQ0hFQ0soQ0ZBcnJheUFwcGVuZEFycmF5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRkFycmF5QXBwZW5kQXJyYXkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGQXJyYXlSZWZPYmpfQ29udmVydCwgJm90aGVyQXJyYXksCi0JICAgICAgICAgICAgICAgICAgICAgIENGUmFuZ2VfQ29udmVydCwgJm90aGVyUmFuZ2UpKQotCQlyZXR1cm4gTlVMTDsKLQlDRkFycmF5QXBwZW5kQXJyYXkoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgb3RoZXJBcnJheSwKLQkgICAgICAgICAgICAgICAgICAgb3RoZXJSYW5nZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRkFycmF5UmVmT2JqX0NvbnZlcnQsICZvdGhlckFycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlJhbmdlX0NvbnZlcnQsICZvdGhlclJhbmdlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0ZBcnJheUFwcGVuZEFycmF5KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgIG90aGVyQXJyYXksCisgICAgICAgICAgICAgICAgICAgICAgIG90aGVyUmFuZ2UpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIENGTXV0YWJsZUFycmF5UmVmT2JqX21ldGhvZHNbXSA9IHsKLQl7IkNGQXJyYXlSZW1vdmVWYWx1ZUF0SW5kZXgiLCAoUHlDRnVuY3Rpb24pQ0ZNdXRhYmxlQXJyYXlSZWZPYmpfQ0ZBcnJheVJlbW92ZVZhbHVlQXRJbmRleCwgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZJbmRleCBpZHgpIC0+IE5vbmUiKX0sCi0JeyJDRkFycmF5UmVtb3ZlQWxsVmFsdWVzIiwgKFB5Q0Z1bmN0aW9uKUNGTXV0YWJsZUFycmF5UmVmT2JqX0NGQXJyYXlSZW1vdmVBbGxWYWx1ZXMsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkNGQXJyYXlFeGNoYW5nZVZhbHVlc0F0SW5kaWNlcyIsIChQeUNGdW5jdGlvbilDRk11dGFibGVBcnJheVJlZk9ial9DRkFycmF5RXhjaGFuZ2VWYWx1ZXNBdEluZGljZXMsIDEsCi0JIFB5RG9jX1NUUigiKENGSW5kZXggaWR4MSwgQ0ZJbmRleCBpZHgyKSAtPiBOb25lIil9LAotCXsiQ0ZBcnJheUFwcGVuZEFycmF5IiwgKFB5Q0Z1bmN0aW9uKUNGTXV0YWJsZUFycmF5UmVmT2JqX0NGQXJyYXlBcHBlbmRBcnJheSwgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZBcnJheVJlZiBvdGhlckFycmF5LCBDRlJhbmdlIG90aGVyUmFuZ2UpIC0+IE5vbmUiKX0sCi0Je05VTEwsIE5VTEwsIDB9CisgICAgeyJDRkFycmF5UmVtb3ZlVmFsdWVBdEluZGV4IiwgKFB5Q0Z1bmN0aW9uKUNGTXV0YWJsZUFycmF5UmVmT2JqX0NGQXJyYXlSZW1vdmVWYWx1ZUF0SW5kZXgsIDEsCisgICAgIFB5RG9jX1NUUigiKENGSW5kZXggaWR4KSAtPiBOb25lIil9LAorICAgIHsiQ0ZBcnJheVJlbW92ZUFsbFZhbHVlcyIsIChQeUNGdW5jdGlvbilDRk11dGFibGVBcnJheVJlZk9ial9DRkFycmF5UmVtb3ZlQWxsVmFsdWVzLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJDRkFycmF5RXhjaGFuZ2VWYWx1ZXNBdEluZGljZXMiLCAoUHlDRnVuY3Rpb24pQ0ZNdXRhYmxlQXJyYXlSZWZPYmpfQ0ZBcnJheUV4Y2hhbmdlVmFsdWVzQXRJbmRpY2VzLCAxLAorICAgICBQeURvY19TVFIoIihDRkluZGV4IGlkeDEsIENGSW5kZXggaWR4MikgLT4gTm9uZSIpfSwKKyAgICB7IkNGQXJyYXlBcHBlbmRBcnJheSIsIChQeUNGdW5jdGlvbilDRk11dGFibGVBcnJheVJlZk9ial9DRkFycmF5QXBwZW5kQXJyYXksIDEsCisgICAgIFB5RG9jX1NUUigiKENGQXJyYXlSZWYgb3RoZXJBcnJheSwgQ0ZSYW5nZSBvdGhlclJhbmdlKSAtPiBOb25lIil9LAorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogI2RlZmluZSBDRk11dGFibGVBcnJheVJlZk9ial9nZXRzZXRsaXN0IE5VTEwKQEAgLTgyNiwxMDAgKzgyNiwxMDAgQEAKIAogc3RhdGljIGludCBDRk11dGFibGVBcnJheVJlZk9ial9jb21wYXJlKENGTXV0YWJsZUFycmF5UmVmT2JqZWN0ICpzZWxmLCBDRk11dGFibGVBcnJheVJlZk9iamVjdCAqb3RoZXIpCiB7Ci0JLyogWFhYWCBPciBzaG91bGQgd2UgdXNlIENGRXF1YWw/PyAqLwotCWlmICggc2VsZi0+b2JfaXRzZWxmID4gb3RoZXItPm9iX2l0c2VsZiApIHJldHVybiAxOwotCWlmICggc2VsZi0+b2JfaXRzZWxmIDwgb3RoZXItPm9iX2l0c2VsZiApIHJldHVybiAtMTsKLQlyZXR1cm4gMDsKKyAgICAvKiBYWFhYIE9yIHNob3VsZCB3ZSB1c2UgQ0ZFcXVhbD8/ICovCisgICAgaWYgKCBzZWxmLT5vYl9pdHNlbGYgPiBvdGhlci0+b2JfaXRzZWxmICkgcmV0dXJuIDE7CisgICAgaWYgKCBzZWxmLT5vYl9pdHNlbGYgPCBvdGhlci0+b2JfaXRzZWxmICkgcmV0dXJuIC0xOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKiBDRk11dGFibGVBcnJheVJlZk9ial9yZXByKENGTXV0YWJsZUFycmF5UmVmT2JqZWN0ICpzZWxmKQogewotCWNoYXIgYnVmWzEwMF07Ci0Jc3ByaW50ZihidWYsICI8Q0ZNdXRhYmxlQXJyYXlSZWYgb2JqZWN0IGF0IDB4JTguOHggZm9yIDB4JTguOHg+IiwgKHVuc2lnbmVkKXNlbGYsICh1bnNpZ25lZClzZWxmLT5vYl9pdHNlbGYpOwotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CisgICAgY2hhciBidWZbMTAwXTsKKyAgICBzcHJpbnRmKGJ1ZiwgIjxDRk11dGFibGVBcnJheVJlZiBvYmplY3QgYXQgMHglOC44eCBmb3IgMHglOC44eD4iLCAodW5zaWduZWQpc2VsZiwgKHVuc2lnbmVkKXNlbGYtPm9iX2l0c2VsZik7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmKTsKIH0KIAogc3RhdGljIGludCBDRk11dGFibGVBcnJheVJlZk9ial9oYXNoKENGTXV0YWJsZUFycmF5UmVmT2JqZWN0ICpzZWxmKQogewotCS8qIFhYWFggT3Igc2hvdWxkIHdlIHVzZSBDRkhhc2g/PyAqLwotCXJldHVybiAoaW50KXNlbGYtPm9iX2l0c2VsZjsKKyAgICAvKiBYWFhYIE9yIHNob3VsZCB3ZSB1c2UgQ0ZIYXNoPz8gKi8KKyAgICByZXR1cm4gKGludClzZWxmLT5vYl9pdHNlbGY7CiB9CiBzdGF0aWMgaW50IENGTXV0YWJsZUFycmF5UmVmT2JqX3RwX2luaXQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlDRk11dGFibGVBcnJheVJlZiBpdHNlbGY7Ci0JY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CisgICAgQ0ZNdXRhYmxlQXJyYXlSZWYgaXRzZWxmOworICAgIGNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OwogCi0JaWYgKFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBDRk11dGFibGVBcnJheVJlZk9ial9Db252ZXJ0LCAmaXRzZWxmKSkKLQl7Ci0JCSgoQ0ZNdXRhYmxlQXJyYXlSZWZPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQkJcmV0dXJuIDA7Ci0JfQorICAgIGlmIChQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgQ0ZNdXRhYmxlQXJyYXlSZWZPYmpfQ29udmVydCwgJml0c2VsZikpCisgICAgeworICAgICAgICAoKENGTXV0YWJsZUFycmF5UmVmT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgICAgIHJldHVybiAwOworICAgIH0KIAotCS8qIEFueSBDRlR5cGVSZWYgZGVzY2VuZGVudCBpcyBhbGxvd2VkIGFzIGluaXRpYWxpemVyIHRvbyAqLwotCWlmIChQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgQ0ZUeXBlUmVmT2JqX0NvbnZlcnQsICZpdHNlbGYpKQotCXsKLQkJKChDRk11dGFibGVBcnJheVJlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIC0xOworICAgIC8qIEFueSBDRlR5cGVSZWYgZGVzY2VuZGVudCBpcyBhbGxvd2VkIGFzIGluaXRpYWxpemVyIHRvbyAqLworICAgIGlmIChQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgQ0ZUeXBlUmVmT2JqX0NvbnZlcnQsICZpdHNlbGYpKQorICAgIHsKKyAgICAgICAgKChDRk11dGFibGVBcnJheVJlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIC0xOwogfQogCiAjZGVmaW5lIENGTXV0YWJsZUFycmF5UmVmT2JqX3RwX2FsbG9jIFB5VHlwZV9HZW5lcmljQWxsb2MKIAogc3RhdGljIFB5T2JqZWN0ICpDRk11dGFibGVBcnJheVJlZk9ial90cF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlQeU9iamVjdCAqc2VsZjsKLQlpZiAoKHNlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JKChDRk11dGFibGVBcnJheVJlZk9iamVjdCAqKXNlbGYpLT5vYl9pdHNlbGYgPSBOVUxMOwotCSgoQ0ZNdXRhYmxlQXJyYXlSZWZPYmplY3QgKilzZWxmKS0+b2JfZnJlZWl0ID0gQ0ZSZWxlYXNlOwotCXJldHVybiBzZWxmOworICAgIFB5T2JqZWN0ICpzZWxmOworICAgIGlmICgoc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAoKENGTXV0YWJsZUFycmF5UmVmT2JqZWN0ICopc2VsZiktPm9iX2l0c2VsZiA9IE5VTEw7CisgICAgKChDRk11dGFibGVBcnJheVJlZk9iamVjdCAqKXNlbGYpLT5vYl9mcmVlaXQgPSBDRlJlbGVhc2U7CisgICAgcmV0dXJuIHNlbGY7CiB9CiAKICNkZWZpbmUgQ0ZNdXRhYmxlQXJyYXlSZWZPYmpfdHBfZnJlZSBQeU9iamVjdF9EZWwKIAogCiBQeVR5cGVPYmplY3QgQ0ZNdXRhYmxlQXJyYXlSZWZfVHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKLQkwLCAvKm9iX3NpemUqLwotCSJfQ0YuQ0ZNdXRhYmxlQXJyYXlSZWYiLCAvKnRwX25hbWUqLwotCXNpemVvZihDRk11dGFibGVBcnJheVJlZk9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KLQkwLCAvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpIENGTXV0YWJsZUFycmF5UmVmT2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCi0JMCwgLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCi0JKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCi0JKGNtcGZ1bmMpIENGTXV0YWJsZUFycmF5UmVmT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCi0JKHJlcHJmdW5jKSBDRk11dGFibGVBcnJheVJlZk9ial9yZXByLCAvKnRwX3JlcHIqLwotCShQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KLQkoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLwotCShQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYykgQ0ZNdXRhYmxlQXJyYXlSZWZPYmpfaGFzaCwgLyp0cF9oYXNoKi8KLQkwLCAvKnRwX2NhbGwqLwotCTAsIC8qdHBfc3RyKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCi0JUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KLQkwLCAvKnRwX2FzX2J1ZmZlciovCi0JUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCi0JMCwgLyp0cF9kb2MqLwotCTAsIC8qdHBfdHJhdmVyc2UqLwotCTAsIC8qdHBfY2xlYXIqLwotCTAsIC8qdHBfcmljaGNvbXBhcmUqLwotCTAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLwotCTAsIC8qdHBfaXRlciovCi0JMCwgLyp0cF9pdGVybmV4dCovCi0JQ0ZNdXRhYmxlQXJyYXlSZWZPYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLwotCTAsIC8qdHBfbWVtYmVycyovCi0JQ0ZNdXRhYmxlQXJyYXlSZWZPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLwotCTAsIC8qdHBfYmFzZSovCi0JMCwgLyp0cF9kaWN0Ki8KLQkwLCAvKnRwX2Rlc2NyX2dldCovCi0JMCwgLyp0cF9kZXNjcl9zZXQqLwotCTAsIC8qdHBfZGljdG9mZnNldCovCi0JQ0ZNdXRhYmxlQXJyYXlSZWZPYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLwotCUNGTXV0YWJsZUFycmF5UmVmT2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLwotCUNGTXV0YWJsZUFycmF5UmVmT2JqX3RwX25ldywgLyogdHBfbmV3ICovCi0JQ0ZNdXRhYmxlQXJyYXlSZWZPYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgIDAsIC8qb2Jfc2l6ZSovCisgICAgIl9DRi5DRk11dGFibGVBcnJheVJlZiIsIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKENGTXV0YWJsZUFycmF5UmVmT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLworICAgIDAsIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcikgQ0ZNdXRhYmxlQXJyYXlSZWZPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KKyAgICAoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KKyAgICAoY21wZnVuYykgQ0ZNdXRhYmxlQXJyYXlSZWZPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpIENGTXV0YWJsZUFycmF5UmVmT2JqX3JlcHIsIC8qdHBfcmVwciovCisgICAgKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLworICAgIChQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKSBDRk11dGFibGVBcnJheVJlZk9ial9oYXNoLCAvKnRwX2hhc2gqLworICAgIDAsIC8qdHBfY2FsbCovCisgICAgMCwgLyp0cF9zdHIqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KKyAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLworICAgIDAsIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAvKnRwX2RvYyovCisgICAgMCwgLyp0cF90cmF2ZXJzZSovCisgICAgMCwgLyp0cF9jbGVhciovCisgICAgMCwgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgLyp0cF9pdGVyKi8KKyAgICAwLCAvKnRwX2l0ZXJuZXh0Ki8KKyAgICBDRk11dGFibGVBcnJheVJlZk9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCisgICAgMCwgLyp0cF9tZW1iZXJzKi8KKyAgICBDRk11dGFibGVBcnJheVJlZk9ial9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCisgICAgMCwgLyp0cF9iYXNlKi8KKyAgICAwLCAvKnRwX2RpY3QqLworICAgIDAsIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICBDRk11dGFibGVBcnJheVJlZk9ial90cF9pbml0LCAvKiB0cF9pbml0ICovCisgICAgQ0ZNdXRhYmxlQXJyYXlSZWZPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCisgICAgQ0ZNdXRhYmxlQXJyYXlSZWZPYmpfdHBfbmV3LCAvKiB0cF9uZXcgKi8KKyAgICBDRk11dGFibGVBcnJheVJlZk9ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0gRW5kIG9iamVjdCB0eXBlIENGTXV0YWJsZUFycmF5UmVmIC0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTkzMiw4NiArOTMyLDg2IEBACiAjZGVmaW5lIENGRGljdGlvbmFyeVJlZk9ial9DaGVjayh4KSAoKHgpLT5vYl90eXBlID09ICZDRkRpY3Rpb25hcnlSZWZfVHlwZSB8fCBQeU9iamVjdF9UeXBlQ2hlY2soKHgpLCAmQ0ZEaWN0aW9uYXJ5UmVmX1R5cGUpKQogCiB0eXBlZGVmIHN0cnVjdCBDRkRpY3Rpb25hcnlSZWZPYmplY3QgewotCVB5T2JqZWN0X0hFQUQKLQlDRkRpY3Rpb25hcnlSZWYgb2JfaXRzZWxmOwotCXZvaWQgKCpvYl9mcmVlaXQpKENGVHlwZVJlZiBwdHIpOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBDRkRpY3Rpb25hcnlSZWYgb2JfaXRzZWxmOworICAgIHZvaWQgKCpvYl9mcmVlaXQpKENGVHlwZVJlZiBwdHIpOwogfSBDRkRpY3Rpb25hcnlSZWZPYmplY3Q7CiAKIFB5T2JqZWN0ICpDRkRpY3Rpb25hcnlSZWZPYmpfTmV3KENGRGljdGlvbmFyeVJlZiBpdHNlbGYpCiB7Ci0JQ0ZEaWN0aW9uYXJ5UmVmT2JqZWN0ICppdDsKLQlpZiAoaXRzZWxmID09IE5VTEwpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAiY2Fubm90IHdyYXAgTlVMTCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaXQgPSBQeU9iamVjdF9ORVcoQ0ZEaWN0aW9uYXJ5UmVmT2JqZWN0LCAmQ0ZEaWN0aW9uYXJ5UmVmX1R5cGUpOwotCWlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkvKiBYWFhYIFNob3VsZCB3ZSB0cF9pbml0IG9yIHRwX25ldyBvdXIgYmFzZXR5cGU/ICovCi0JaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlpdC0+b2JfZnJlZWl0ID0gQ0ZSZWxlYXNlOwotCXJldHVybiAoUHlPYmplY3QgKilpdDsKKyAgICBDRkRpY3Rpb25hcnlSZWZPYmplY3QgKml0OworICAgIGlmIChpdHNlbGYgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJjYW5ub3Qgd3JhcCBOVUxMIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpdCA9IFB5T2JqZWN0X05FVyhDRkRpY3Rpb25hcnlSZWZPYmplY3QsICZDRkRpY3Rpb25hcnlSZWZfVHlwZSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIC8qIFhYWFggU2hvdWxkIHdlIHRwX2luaXQgb3IgdHBfbmV3IG91ciBiYXNldHlwZT8gKi8KKyAgICBpdC0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIGl0LT5vYl9mcmVlaXQgPSBDRlJlbGVhc2U7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogCiBpbnQgQ0ZEaWN0aW9uYXJ5UmVmT2JqX0NvbnZlcnQoUHlPYmplY3QgKnYsIENGRGljdGlvbmFyeVJlZiAqcF9pdHNlbGYpCiB7CiAKLQlpZiAodiA9PSBQeV9Ob25lKSB7ICpwX2l0c2VsZiA9IE5VTEw7IHJldHVybiAxOyB9Ci0JLyogQ2hlY2sgZm9yIG90aGVyIENGIG9iamVjdHMgaGVyZSAqLworICAgIGlmICh2ID09IFB5X05vbmUpIHsgKnBfaXRzZWxmID0gTlVMTDsgcmV0dXJuIDE7IH0KKyAgICAvKiBDaGVjayBmb3Igb3RoZXIgQ0Ygb2JqZWN0cyBoZXJlICovCiAKLQlpZiAoIUNGRGljdGlvbmFyeVJlZk9ial9DaGVjayh2KSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJDRkRpY3Rpb25hcnlSZWYgcmVxdWlyZWQiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCSpwX2l0c2VsZiA9ICgoQ0ZEaWN0aW9uYXJ5UmVmT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKLQlyZXR1cm4gMTsKKyAgICBpZiAoIUNGRGljdGlvbmFyeVJlZk9ial9DaGVjayh2KSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJDRkRpY3Rpb25hcnlSZWYgcmVxdWlyZWQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICpwX2l0c2VsZiA9ICgoQ0ZEaWN0aW9uYXJ5UmVmT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIHZvaWQgQ0ZEaWN0aW9uYXJ5UmVmT2JqX2RlYWxsb2MoQ0ZEaWN0aW9uYXJ5UmVmT2JqZWN0ICpzZWxmKQogewotCWlmIChzZWxmLT5vYl9mcmVlaXQgJiYgc2VsZi0+b2JfaXRzZWxmKQotCXsKLQkJc2VsZi0+b2JfZnJlZWl0KChDRlR5cGVSZWYpc2VsZi0+b2JfaXRzZWxmKTsKLQkJc2VsZi0+b2JfaXRzZWxmID0gTlVMTDsKLQl9Ci0JQ0ZUeXBlUmVmX1R5cGUudHBfZGVhbGxvYygoUHlPYmplY3QgKilzZWxmKTsKKyAgICBpZiAoc2VsZi0+b2JfZnJlZWl0ICYmIHNlbGYtPm9iX2l0c2VsZikKKyAgICB7CisgICAgICAgIHNlbGYtPm9iX2ZyZWVpdCgoQ0ZUeXBlUmVmKXNlbGYtPm9iX2l0c2VsZik7CisgICAgICAgIHNlbGYtPm9iX2l0c2VsZiA9IE5VTEw7CisgICAgfQorICAgIENGVHlwZVJlZl9UeXBlLnRwX2RlYWxsb2MoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZEaWN0aW9uYXJ5UmVmT2JqX0NGRGljdGlvbmFyeUNyZWF0ZUNvcHkoQ0ZEaWN0aW9uYXJ5UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRkRpY3Rpb25hcnlSZWYgX3J2OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRkRpY3Rpb25hcnlDcmVhdGVDb3B5KChDRkFsbG9jYXRvclJlZilOVUxMLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRkRpY3Rpb25hcnlSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRkRpY3Rpb25hcnlSZWYgX3J2OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRkRpY3Rpb25hcnlDcmVhdGVDb3B5KChDRkFsbG9jYXRvclJlZilOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRkRpY3Rpb25hcnlSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGRGljdGlvbmFyeVJlZk9ial9DRkRpY3Rpb25hcnlHZXRDb3VudChDRkRpY3Rpb25hcnlSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGSW5kZXggX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRkluZGV4IF9ydjsKICNpZm5kZWYgQ0ZEaWN0aW9uYXJ5R2V0Q291bnQKLQlQeU1hY19QUkVDSEVDSyhDRkRpY3Rpb25hcnlHZXRDb3VudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZEaWN0aW9uYXJ5R2V0Q291bnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGRGljdGlvbmFyeUdldENvdW50KF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRkRpY3Rpb25hcnlHZXRDb3VudChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIENGRGljdGlvbmFyeVJlZk9ial9tZXRob2RzW10gPSB7Ci0JeyJDRkRpY3Rpb25hcnlDcmVhdGVDb3B5IiwgKFB5Q0Z1bmN0aW9uKUNGRGljdGlvbmFyeVJlZk9ial9DRkRpY3Rpb25hcnlDcmVhdGVDb3B5LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDRkRpY3Rpb25hcnlSZWYgX3J2KSIpfSwKLQl7IkNGRGljdGlvbmFyeUdldENvdW50IiwgKFB5Q0Z1bmN0aW9uKUNGRGljdGlvbmFyeVJlZk9ial9DRkRpY3Rpb25hcnlHZXRDb3VudCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZJbmRleCBfcnYpIil9LAotCXtOVUxMLCBOVUxMLCAwfQorICAgIHsiQ0ZEaWN0aW9uYXJ5Q3JlYXRlQ29weSIsIChQeUNGdW5jdGlvbilDRkRpY3Rpb25hcnlSZWZPYmpfQ0ZEaWN0aW9uYXJ5Q3JlYXRlQ29weSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZEaWN0aW9uYXJ5UmVmIF9ydikiKX0sCisgICAgeyJDRkRpY3Rpb25hcnlHZXRDb3VudCIsIChQeUNGdW5jdGlvbilDRkRpY3Rpb25hcnlSZWZPYmpfQ0ZEaWN0aW9uYXJ5R2V0Q291bnQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENGSW5kZXggX3J2KSIpfSwKKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKICNkZWZpbmUgQ0ZEaWN0aW9uYXJ5UmVmT2JqX2dldHNldGxpc3QgTlVMTApAQCAtMTAxOSwxMDAgKzEwMTksMTAwIEBACiAKIHN0YXRpYyBpbnQgQ0ZEaWN0aW9uYXJ5UmVmT2JqX2NvbXBhcmUoQ0ZEaWN0aW9uYXJ5UmVmT2JqZWN0ICpzZWxmLCBDRkRpY3Rpb25hcnlSZWZPYmplY3QgKm90aGVyKQogewotCS8qIFhYWFggT3Igc2hvdWxkIHdlIHVzZSBDRkVxdWFsPz8gKi8KLQlpZiAoIHNlbGYtPm9iX2l0c2VsZiA+IG90aGVyLT5vYl9pdHNlbGYgKSByZXR1cm4gMTsKLQlpZiAoIHNlbGYtPm9iX2l0c2VsZiA8IG90aGVyLT5vYl9pdHNlbGYgKSByZXR1cm4gLTE7Ci0JcmV0dXJuIDA7CisgICAgLyogWFhYWCBPciBzaG91bGQgd2UgdXNlIENGRXF1YWw/PyAqLworICAgIGlmICggc2VsZi0+b2JfaXRzZWxmID4gb3RoZXItPm9iX2l0c2VsZiApIHJldHVybiAxOworICAgIGlmICggc2VsZi0+b2JfaXRzZWxmIDwgb3RoZXItPm9iX2l0c2VsZiApIHJldHVybiAtMTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICogQ0ZEaWN0aW9uYXJ5UmVmT2JqX3JlcHIoQ0ZEaWN0aW9uYXJ5UmVmT2JqZWN0ICpzZWxmKQogewotCWNoYXIgYnVmWzEwMF07Ci0Jc3ByaW50ZihidWYsICI8Q0ZEaWN0aW9uYXJ5UmVmIG9iamVjdCBhdCAweCU4Ljh4IGZvciAweCU4Ljh4PiIsICh1bnNpZ25lZClzZWxmLCAodW5zaWduZWQpc2VsZi0+b2JfaXRzZWxmKTsKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOworICAgIGNoYXIgYnVmWzEwMF07CisgICAgc3ByaW50ZihidWYsICI8Q0ZEaWN0aW9uYXJ5UmVmIG9iamVjdCBhdCAweCU4Ljh4IGZvciAweCU4Ljh4PiIsICh1bnNpZ25lZClzZWxmLCAodW5zaWduZWQpc2VsZi0+b2JfaXRzZWxmKTsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOwogfQogCiBzdGF0aWMgaW50IENGRGljdGlvbmFyeVJlZk9ial9oYXNoKENGRGljdGlvbmFyeVJlZk9iamVjdCAqc2VsZikKIHsKLQkvKiBYWFhYIE9yIHNob3VsZCB3ZSB1c2UgQ0ZIYXNoPz8gKi8KLQlyZXR1cm4gKGludClzZWxmLT5vYl9pdHNlbGY7CisgICAgLyogWFhYWCBPciBzaG91bGQgd2UgdXNlIENGSGFzaD8/ICovCisgICAgcmV0dXJuIChpbnQpc2VsZi0+b2JfaXRzZWxmOwogfQogc3RhdGljIGludCBDRkRpY3Rpb25hcnlSZWZPYmpfdHBfaW5pdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncywgUHlPYmplY3QgKl9rd2RzKQogewotCUNGRGljdGlvbmFyeVJlZiBpdHNlbGY7Ci0JY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CisgICAgQ0ZEaWN0aW9uYXJ5UmVmIGl0c2VsZjsKKyAgICBjaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKIAotCWlmIChQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgQ0ZEaWN0aW9uYXJ5UmVmT2JqX0NvbnZlcnQsICZpdHNlbGYpKQotCXsKLQkJKChDRkRpY3Rpb25hcnlSZWZPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQkJcmV0dXJuIDA7Ci0JfQorICAgIGlmIChQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgQ0ZEaWN0aW9uYXJ5UmVmT2JqX0NvbnZlcnQsICZpdHNlbGYpKQorICAgIHsKKyAgICAgICAgKChDRkRpY3Rpb25hcnlSZWZPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCi0JLyogQW55IENGVHlwZVJlZiBkZXNjZW5kZW50IGlzIGFsbG93ZWQgYXMgaW5pdGlhbGl6ZXIgdG9vICovCi0JaWYgKFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBDRlR5cGVSZWZPYmpfQ29udmVydCwgJml0c2VsZikpCi0JewotCQkoKENGRGljdGlvbmFyeVJlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIC0xOworICAgIC8qIEFueSBDRlR5cGVSZWYgZGVzY2VuZGVudCBpcyBhbGxvd2VkIGFzIGluaXRpYWxpemVyIHRvbyAqLworICAgIGlmIChQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgQ0ZUeXBlUmVmT2JqX0NvbnZlcnQsICZpdHNlbGYpKQorICAgIHsKKyAgICAgICAgKChDRkRpY3Rpb25hcnlSZWZPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAtMTsKIH0KIAogI2RlZmluZSBDRkRpY3Rpb25hcnlSZWZPYmpfdHBfYWxsb2MgUHlUeXBlX0dlbmVyaWNBbGxvYwogCiBzdGF0aWMgUHlPYmplY3QgKkNGRGljdGlvbmFyeVJlZk9ial90cF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlQeU9iamVjdCAqc2VsZjsKLQlpZiAoKHNlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JKChDRkRpY3Rpb25hcnlSZWZPYmplY3QgKilzZWxmKS0+b2JfaXRzZWxmID0gTlVMTDsKLQkoKENGRGljdGlvbmFyeVJlZk9iamVjdCAqKXNlbGYpLT5vYl9mcmVlaXQgPSBDRlJlbGVhc2U7Ci0JcmV0dXJuIHNlbGY7CisgICAgUHlPYmplY3QgKnNlbGY7CisgICAgaWYgKChzZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOworICAgICgoQ0ZEaWN0aW9uYXJ5UmVmT2JqZWN0ICopc2VsZiktPm9iX2l0c2VsZiA9IE5VTEw7CisgICAgKChDRkRpY3Rpb25hcnlSZWZPYmplY3QgKilzZWxmKS0+b2JfZnJlZWl0ID0gQ0ZSZWxlYXNlOworICAgIHJldHVybiBzZWxmOwogfQogCiAjZGVmaW5lIENGRGljdGlvbmFyeVJlZk9ial90cF9mcmVlIFB5T2JqZWN0X0RlbAogCiAKIFB5VHlwZU9iamVjdCBDRkRpY3Rpb25hcnlSZWZfVHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKLQkwLCAvKm9iX3NpemUqLwotCSJfQ0YuQ0ZEaWN0aW9uYXJ5UmVmIiwgLyp0cF9uYW1lKi8KLQlzaXplb2YoQ0ZEaWN0aW9uYXJ5UmVmT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLwotCTAsIC8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcikgQ0ZEaWN0aW9uYXJ5UmVmT2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCi0JMCwgLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCi0JKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCi0JKGNtcGZ1bmMpIENGRGljdGlvbmFyeVJlZk9ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYykgQ0ZEaWN0aW9uYXJ5UmVmT2JqX3JlcHIsIC8qdHBfcmVwciovCi0JKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLwotCShQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCi0JKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCi0JKGhhc2hmdW5jKSBDRkRpY3Rpb25hcnlSZWZPYmpfaGFzaCwgLyp0cF9oYXNoKi8KLQkwLCAvKnRwX2NhbGwqLwotCTAsIC8qdHBfc3RyKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCi0JUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KLQkwLCAvKnRwX2FzX2J1ZmZlciovCi0JUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCi0JMCwgLyp0cF9kb2MqLwotCTAsIC8qdHBfdHJhdmVyc2UqLwotCTAsIC8qdHBfY2xlYXIqLwotCTAsIC8qdHBfcmljaGNvbXBhcmUqLwotCTAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLwotCTAsIC8qdHBfaXRlciovCi0JMCwgLyp0cF9pdGVybmV4dCovCi0JQ0ZEaWN0aW9uYXJ5UmVmT2JqX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KLQkwLCAvKnRwX21lbWJlcnMqLwotCUNGRGljdGlvbmFyeVJlZk9ial9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCi0JMCwgLyp0cF9iYXNlKi8KLQkwLCAvKnRwX2RpY3QqLwotCTAsIC8qdHBfZGVzY3JfZ2V0Ki8KLQkwLCAvKnRwX2Rlc2NyX3NldCovCi0JMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KLQlDRkRpY3Rpb25hcnlSZWZPYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLwotCUNGRGljdGlvbmFyeVJlZk9ial90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KLQlDRkRpY3Rpb25hcnlSZWZPYmpfdHBfbmV3LCAvKiB0cF9uZXcgKi8KLQlDRkRpY3Rpb25hcnlSZWZPYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgIDAsIC8qb2Jfc2l6ZSovCisgICAgIl9DRi5DRkRpY3Rpb25hcnlSZWYiLCAvKnRwX25hbWUqLworICAgIHNpemVvZihDRkRpY3Rpb25hcnlSZWZPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKSBDRkRpY3Rpb25hcnlSZWZPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KKyAgICAoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KKyAgICAoY21wZnVuYykgQ0ZEaWN0aW9uYXJ5UmVmT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCisgICAgKHJlcHJmdW5jKSBDRkRpY3Rpb25hcnlSZWZPYmpfcmVwciwgLyp0cF9yZXByKi8KKyAgICAoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCisgICAgKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAoaGFzaGZ1bmMpIENGRGljdGlvbmFyeVJlZk9ial9oYXNoLCAvKnRwX2hhc2gqLworICAgIDAsIC8qdHBfY2FsbCovCisgICAgMCwgLyp0cF9zdHIqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KKyAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLworICAgIDAsIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAvKnRwX2RvYyovCisgICAgMCwgLyp0cF90cmF2ZXJzZSovCisgICAgMCwgLyp0cF9jbGVhciovCisgICAgMCwgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgLyp0cF9pdGVyKi8KKyAgICAwLCAvKnRwX2l0ZXJuZXh0Ki8KKyAgICBDRkRpY3Rpb25hcnlSZWZPYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLworICAgIDAsIC8qdHBfbWVtYmVycyovCisgICAgQ0ZEaWN0aW9uYXJ5UmVmT2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KKyAgICAwLCAvKnRwX2Jhc2UqLworICAgIDAsIC8qdHBfZGljdCovCisgICAgMCwgLyp0cF9kZXNjcl9nZXQqLworICAgIDAsIC8qdHBfZGVzY3Jfc2V0Ki8KKyAgICAwLCAvKnRwX2RpY3RvZmZzZXQqLworICAgIENGRGljdGlvbmFyeVJlZk9ial90cF9pbml0LCAvKiB0cF9pbml0ICovCisgICAgQ0ZEaWN0aW9uYXJ5UmVmT2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLworICAgIENGRGljdGlvbmFyeVJlZk9ial90cF9uZXcsIC8qIHRwX25ldyAqLworICAgIENGRGljdGlvbmFyeVJlZk9ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tIEVuZCBvYmplY3QgdHlwZSBDRkRpY3Rpb25hcnlSZWYgLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTExMjUsNzAgKzExMjUsNzAgQEAKICNkZWZpbmUgQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9ial9DaGVjayh4KSAoKHgpLT5vYl90eXBlID09ICZDRk11dGFibGVEaWN0aW9uYXJ5UmVmX1R5cGUgfHwgUHlPYmplY3RfVHlwZUNoZWNrKCh4KSwgJkNGTXV0YWJsZURpY3Rpb25hcnlSZWZfVHlwZSkpCiAKIHR5cGVkZWYgc3RydWN0IENGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmplY3QgewotCVB5T2JqZWN0X0hFQUQKLQlDRk11dGFibGVEaWN0aW9uYXJ5UmVmIG9iX2l0c2VsZjsKLQl2b2lkICgqb2JfZnJlZWl0KShDRlR5cGVSZWYgcHRyKTsKKyAgICBQeU9iamVjdF9IRUFECisgICAgQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZiBvYl9pdHNlbGY7CisgICAgdm9pZCAoKm9iX2ZyZWVpdCkoQ0ZUeXBlUmVmIHB0cik7CiB9IENGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmplY3Q7CiAKIFB5T2JqZWN0ICpDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqX05ldyhDRk11dGFibGVEaWN0aW9uYXJ5UmVmIGl0c2VsZikKIHsKLQlDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqZWN0ICppdDsKLQlpZiAoaXRzZWxmID09IE5VTEwpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAiY2Fubm90IHdyYXAgTlVMTCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaXQgPSBQeU9iamVjdF9ORVcoQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9iamVjdCwgJkNGTXV0YWJsZURpY3Rpb25hcnlSZWZfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOwotCS8qIFhYWFggU2hvdWxkIHdlIHRwX2luaXQgb3IgdHBfbmV3IG91ciBiYXNldHlwZT8gKi8KLQlpdC0+b2JfaXRzZWxmID0gaXRzZWxmOwotCWl0LT5vYl9mcmVlaXQgPSBDRlJlbGVhc2U7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIENGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmplY3QgKml0OworICAgIGlmIChpdHNlbGYgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJjYW5ub3Qgd3JhcCBOVUxMIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpdCA9IFB5T2JqZWN0X05FVyhDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqZWN0LCAmQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZl9UeXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgLyogWFhYWCBTaG91bGQgd2UgdHBfaW5pdCBvciB0cF9uZXcgb3VyIGJhc2V0eXBlPyAqLworICAgIGl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgaXQtPm9iX2ZyZWVpdCA9IENGUmVsZWFzZTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiAKIGludCBDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqX0NvbnZlcnQoUHlPYmplY3QgKnYsIENGTXV0YWJsZURpY3Rpb25hcnlSZWYgKnBfaXRzZWxmKQogewogCi0JaWYgKHYgPT0gUHlfTm9uZSkgeyAqcF9pdHNlbGYgPSBOVUxMOyByZXR1cm4gMTsgfQotCS8qIENoZWNrIGZvciBvdGhlciBDRiBvYmplY3RzIGhlcmUgKi8KKyAgICBpZiAodiA9PSBQeV9Ob25lKSB7ICpwX2l0c2VsZiA9IE5VTEw7IHJldHVybiAxOyB9CisgICAgLyogQ2hlY2sgZm9yIG90aGVyIENGIG9iamVjdHMgaGVyZSAqLwogCi0JaWYgKCFDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqX0NoZWNrKHYpKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkNGTXV0YWJsZURpY3Rpb25hcnlSZWYgcmVxdWlyZWQiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCSpwX2l0c2VsZiA9ICgoQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0JcmV0dXJuIDE7CisgICAgaWYgKCFDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqX0NoZWNrKHYpKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkNGTXV0YWJsZURpY3Rpb25hcnlSZWYgcmVxdWlyZWQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICpwX2l0c2VsZiA9ICgoQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9iamVjdCAqKXYpLT5vYl9pdHNlbGY7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyB2b2lkIENGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmpfZGVhbGxvYyhDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqZWN0ICpzZWxmKQogewotCWlmIChzZWxmLT5vYl9mcmVlaXQgJiYgc2VsZi0+b2JfaXRzZWxmKQotCXsKLQkJc2VsZi0+b2JfZnJlZWl0KChDRlR5cGVSZWYpc2VsZi0+b2JfaXRzZWxmKTsKLQkJc2VsZi0+b2JfaXRzZWxmID0gTlVMTDsKLQl9Ci0JQ0ZEaWN0aW9uYXJ5UmVmX1R5cGUudHBfZGVhbGxvYygoUHlPYmplY3QgKilzZWxmKTsKKyAgICBpZiAoc2VsZi0+b2JfZnJlZWl0ICYmIHNlbGYtPm9iX2l0c2VsZikKKyAgICB7CisgICAgICAgIHNlbGYtPm9iX2ZyZWVpdCgoQ0ZUeXBlUmVmKXNlbGYtPm9iX2l0c2VsZik7CisgICAgICAgIHNlbGYtPm9iX2l0c2VsZiA9IE5VTEw7CisgICAgfQorICAgIENGRGljdGlvbmFyeVJlZl9UeXBlLnRwX2RlYWxsb2MoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9ial9DRkRpY3Rpb25hcnlSZW1vdmVBbGxWYWx1ZXMoQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBDRkRpY3Rpb25hcnlSZW1vdmVBbGxWYWx1ZXMKLQlQeU1hY19QUkVDSEVDSyhDRkRpY3Rpb25hcnlSZW1vdmVBbGxWYWx1ZXMpOworICAgIFB5TWFjX1BSRUNIRUNLKENGRGljdGlvbmFyeVJlbW92ZUFsbFZhbHVlcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0ZEaWN0aW9uYXJ5UmVtb3ZlQWxsVmFsdWVzKF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0ZEaWN0aW9uYXJ5UmVtb3ZlQWxsVmFsdWVzKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIENGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmpfbWV0aG9kc1tdID0gewotCXsiQ0ZEaWN0aW9uYXJ5UmVtb3ZlQWxsVmFsdWVzIiwgKFB5Q0Z1bmN0aW9uKUNGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmpfQ0ZEaWN0aW9uYXJ5UmVtb3ZlQWxsVmFsdWVzLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0Je05VTEwsIE5VTEwsIDB9CisgICAgeyJDRkRpY3Rpb25hcnlSZW1vdmVBbGxWYWx1ZXMiLCAoUHlDRnVuY3Rpb24pQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9ial9DRkRpY3Rpb25hcnlSZW1vdmVBbGxWYWx1ZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKICNkZWZpbmUgQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9ial9nZXRzZXRsaXN0IE5VTEwKQEAgLTExOTYsMTAwICsxMTk2LDEwMCBAQAogCiBzdGF0aWMgaW50IENGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmpfY29tcGFyZShDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqZWN0ICpzZWxmLCBDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqZWN0ICpvdGhlcikKIHsKLQkvKiBYWFhYIE9yIHNob3VsZCB3ZSB1c2UgQ0ZFcXVhbD8/ICovCi0JaWYgKCBzZWxmLT5vYl9pdHNlbGYgPiBvdGhlci0+b2JfaXRzZWxmICkgcmV0dXJuIDE7Ci0JaWYgKCBzZWxmLT5vYl9pdHNlbGYgPCBvdGhlci0+b2JfaXRzZWxmICkgcmV0dXJuIC0xOwotCXJldHVybiAwOworICAgIC8qIFhYWFggT3Igc2hvdWxkIHdlIHVzZSBDRkVxdWFsPz8gKi8KKyAgICBpZiAoIHNlbGYtPm9iX2l0c2VsZiA+IG90aGVyLT5vYl9pdHNlbGYgKSByZXR1cm4gMTsKKyAgICBpZiAoIHNlbGYtPm9iX2l0c2VsZiA8IG90aGVyLT5vYl9pdHNlbGYgKSByZXR1cm4gLTE7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqIENGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmpfcmVwcihDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqZWN0ICpzZWxmKQogewotCWNoYXIgYnVmWzEwMF07Ci0Jc3ByaW50ZihidWYsICI8Q0ZNdXRhYmxlRGljdGlvbmFyeVJlZiBvYmplY3QgYXQgMHglOC44eCBmb3IgMHglOC44eD4iLCAodW5zaWduZWQpc2VsZiwgKHVuc2lnbmVkKXNlbGYtPm9iX2l0c2VsZik7Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmKTsKKyAgICBjaGFyIGJ1ZlsxMDBdOworICAgIHNwcmludGYoYnVmLCAiPENGTXV0YWJsZURpY3Rpb25hcnlSZWYgb2JqZWN0IGF0IDB4JTguOHggZm9yIDB4JTguOHg+IiwgKHVuc2lnbmVkKXNlbGYsICh1bnNpZ25lZClzZWxmLT5vYl9pdHNlbGYpOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CiB9CiAKIHN0YXRpYyBpbnQgQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9ial9oYXNoKENGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmplY3QgKnNlbGYpCiB7Ci0JLyogWFhYWCBPciBzaG91bGQgd2UgdXNlIENGSGFzaD8/ICovCi0JcmV0dXJuIChpbnQpc2VsZi0+b2JfaXRzZWxmOworICAgIC8qIFhYWFggT3Igc2hvdWxkIHdlIHVzZSBDRkhhc2g/PyAqLworICAgIHJldHVybiAoaW50KXNlbGYtPm9iX2l0c2VsZjsKIH0KIHN0YXRpYyBpbnQgQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9ial90cF9pbml0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzLCBQeU9iamVjdCAqX2t3ZHMpCiB7Ci0JQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZiBpdHNlbGY7Ci0JY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CisgICAgQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZiBpdHNlbGY7CisgICAgY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CiAKLQlpZiAoUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIENGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmpfQ29udmVydCwgJml0c2VsZikpCi0JewotCQkoKENGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQkJcmV0dXJuIDA7Ci0JfQorICAgIGlmIChQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9ial9Db252ZXJ0LCAmaXRzZWxmKSkKKyAgICB7CisgICAgICAgICgoQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLQkvKiBBbnkgQ0ZUeXBlUmVmIGRlc2NlbmRlbnQgaXMgYWxsb3dlZCBhcyBpbml0aWFsaXplciB0b28gKi8KLQlpZiAoUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIENGVHlwZVJlZk9ial9Db252ZXJ0LCAmaXRzZWxmKSkKLQl7Ci0JCSgoQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIC0xOworICAgIC8qIEFueSBDRlR5cGVSZWYgZGVzY2VuZGVudCBpcyBhbGxvd2VkIGFzIGluaXRpYWxpemVyIHRvbyAqLworICAgIGlmIChQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgQ0ZUeXBlUmVmT2JqX0NvbnZlcnQsICZpdHNlbGYpKQorICAgIHsKKyAgICAgICAgKChDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gLTE7CiB9CiAKICNkZWZpbmUgQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9ial90cF9hbGxvYyBQeVR5cGVfR2VuZXJpY0FsbG9jCiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9ial90cF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlQeU9iamVjdCAqc2VsZjsKLQlpZiAoKHNlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JKChDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqZWN0ICopc2VsZiktPm9iX2l0c2VsZiA9IE5VTEw7Ci0JKChDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqZWN0ICopc2VsZiktPm9iX2ZyZWVpdCA9IENGUmVsZWFzZTsKLQlyZXR1cm4gc2VsZjsKKyAgICBQeU9iamVjdCAqc2VsZjsKKyAgICBpZiAoKHNlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgKChDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqZWN0ICopc2VsZiktPm9iX2l0c2VsZiA9IE5VTEw7CisgICAgKChDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqZWN0ICopc2VsZiktPm9iX2ZyZWVpdCA9IENGUmVsZWFzZTsKKyAgICByZXR1cm4gc2VsZjsKIH0KIAogI2RlZmluZSBDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqX3RwX2ZyZWUgUHlPYmplY3RfRGVsCiAKIAogUHlUeXBlT2JqZWN0IENGTXV0YWJsZURpY3Rpb25hcnlSZWZfVHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKLQkwLCAvKm9iX3NpemUqLwotCSJfQ0YuQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZiIsIC8qdHBfbmFtZSovCi0Jc2l6ZW9mKENGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCi0JMCwgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKSBDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCi0JMCwgLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCi0JKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCi0JKGNtcGZ1bmMpIENGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpIENGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmpfcmVwciwgLyp0cF9yZXByKi8KLQkoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCi0JKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpIENGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmpfaGFzaCwgLyp0cF9oYXNoKi8KLQkwLCAvKnRwX2NhbGwqLwotCTAsIC8qdHBfc3RyKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCi0JUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KLQkwLCAvKnRwX2FzX2J1ZmZlciovCi0JUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCi0JMCwgLyp0cF9kb2MqLwotCTAsIC8qdHBfdHJhdmVyc2UqLwotCTAsIC8qdHBfY2xlYXIqLwotCTAsIC8qdHBfcmljaGNvbXBhcmUqLwotCTAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLwotCTAsIC8qdHBfaXRlciovCi0JMCwgLyp0cF9pdGVybmV4dCovCi0JQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCi0JMCwgLyp0cF9tZW1iZXJzKi8KLQlDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KLQkwLCAvKnRwX2Jhc2UqLwotCTAsIC8qdHBfZGljdCovCi0JMCwgLyp0cF9kZXNjcl9nZXQqLwotCTAsIC8qdHBfZGVzY3Jfc2V0Ki8KLQkwLCAvKnRwX2RpY3RvZmZzZXQqLwotCUNGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLwotCUNGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCi0JQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9ial90cF9uZXcsIC8qIHRwX25ldyAqLwotCUNGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgIDAsIC8qb2Jfc2l6ZSovCisgICAgIl9DRi5DRk11dGFibGVEaWN0aW9uYXJ5UmVmIiwgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpIENGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KKyAgICAoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KKyAgICAoY21wZnVuYykgQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLworICAgIChyZXByZnVuYykgQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9ial9yZXByLCAvKnRwX3JlcHIqLworICAgIChQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIChQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLworICAgIChoYXNoZnVuYykgQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9ial9oYXNoLCAvKnRwX2hhc2gqLworICAgIDAsIC8qdHBfY2FsbCovCisgICAgMCwgLyp0cF9zdHIqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KKyAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLworICAgIDAsIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAvKnRwX2RvYyovCisgICAgMCwgLyp0cF90cmF2ZXJzZSovCisgICAgMCwgLyp0cF9jbGVhciovCisgICAgMCwgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgLyp0cF9pdGVyKi8KKyAgICAwLCAvKnRwX2l0ZXJuZXh0Ki8KKyAgICBDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAvKnRwX21lbWJlcnMqLworICAgIENGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLworICAgIDAsIC8qdHBfYmFzZSovCisgICAgMCwgLyp0cF9kaWN0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX2dldCovCisgICAgMCwgLyp0cF9kZXNjcl9zZXQqLworICAgIDAsIC8qdHBfZGljdG9mZnNldCovCisgICAgQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9ial90cF9pbml0LCAvKiB0cF9pbml0ICovCisgICAgQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9ial90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KKyAgICBDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqX3RwX25ldywgLyogdHBfbmV3ICovCisgICAgQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tIEVuZCBvYmplY3QgdHlwZSBDRk11dGFibGVEaWN0aW9uYXJ5UmVmIC0tLS0tLS0tLS0tLS0gKi8KQEAgLTEzMDIsMTI0ICsxMzAyLDEyNCBAQAogI2RlZmluZSBDRkRhdGFSZWZPYmpfQ2hlY2soeCkgKCh4KS0+b2JfdHlwZSA9PSAmQ0ZEYXRhUmVmX1R5cGUgfHwgUHlPYmplY3RfVHlwZUNoZWNrKCh4KSwgJkNGRGF0YVJlZl9UeXBlKSkKIAogdHlwZWRlZiBzdHJ1Y3QgQ0ZEYXRhUmVmT2JqZWN0IHsKLQlQeU9iamVjdF9IRUFECi0JQ0ZEYXRhUmVmIG9iX2l0c2VsZjsKLQl2b2lkICgqb2JfZnJlZWl0KShDRlR5cGVSZWYgcHRyKTsKKyAgICBQeU9iamVjdF9IRUFECisgICAgQ0ZEYXRhUmVmIG9iX2l0c2VsZjsKKyAgICB2b2lkICgqb2JfZnJlZWl0KShDRlR5cGVSZWYgcHRyKTsKIH0gQ0ZEYXRhUmVmT2JqZWN0OwogCiBQeU9iamVjdCAqQ0ZEYXRhUmVmT2JqX05ldyhDRkRhdGFSZWYgaXRzZWxmKQogewotCUNGRGF0YVJlZk9iamVjdCAqaXQ7Ci0JaWYgKGl0c2VsZiA9PSBOVUxMKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgImNhbm5vdCB3cmFwIE5VTEwiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWl0ID0gUHlPYmplY3RfTkVXKENGRGF0YVJlZk9iamVjdCwgJkNGRGF0YVJlZl9UeXBlKTsKLQlpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JLyogWFhYWCBTaG91bGQgd2UgdHBfaW5pdCBvciB0cF9uZXcgb3VyIGJhc2V0eXBlPyAqLwotCWl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JaXQtPm9iX2ZyZWVpdCA9IENGUmVsZWFzZTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgQ0ZEYXRhUmVmT2JqZWN0ICppdDsKKyAgICBpZiAoaXRzZWxmID09IE5VTEwpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAiY2Fubm90IHdyYXAgTlVMTCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaXQgPSBQeU9iamVjdF9ORVcoQ0ZEYXRhUmVmT2JqZWN0LCAmQ0ZEYXRhUmVmX1R5cGUpOworICAgIGlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAvKiBYWFhYIFNob3VsZCB3ZSB0cF9pbml0IG9yIHRwX25ldyBvdXIgYmFzZXR5cGU/ICovCisgICAgaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICBpdC0+b2JfZnJlZWl0ID0gQ0ZSZWxlYXNlOworICAgIHJldHVybiAoUHlPYmplY3QgKilpdDsKIH0KIAogaW50IENGRGF0YVJlZk9ial9Db252ZXJ0KFB5T2JqZWN0ICp2LCBDRkRhdGFSZWYgKnBfaXRzZWxmKQogewogCi0JaWYgKHYgPT0gUHlfTm9uZSkgeyAqcF9pdHNlbGYgPSBOVUxMOyByZXR1cm4gMTsgfQotCWlmIChQeVN0cmluZ19DaGVjayh2KSkgewotCSAgICBjaGFyICpjU3RyOwotCSAgICBQeV9zc2l6ZV90IGNMZW47Ci0JICAgIGlmKCBQeVN0cmluZ19Bc1N0cmluZ0FuZFNpemUodiwgJmNTdHIsICZjTGVuKSA8IDAgKSByZXR1cm4gMDsKLQkgICAgKnBfaXRzZWxmID0gQ0ZEYXRhQ3JlYXRlKChDRkFsbG9jYXRvclJlZilOVUxMLCAodW5zaWduZWQgY2hhciAqKWNTdHIsIGNMZW4pOwotCSAgICByZXR1cm4gMTsKLQl9CisgICAgaWYgKHYgPT0gUHlfTm9uZSkgeyAqcF9pdHNlbGYgPSBOVUxMOyByZXR1cm4gMTsgfQorICAgIGlmIChQeVN0cmluZ19DaGVjayh2KSkgeworICAgICAgICBjaGFyICpjU3RyOworICAgICAgICBQeV9zc2l6ZV90IGNMZW47CisgICAgICAgIGlmKCBQeVN0cmluZ19Bc1N0cmluZ0FuZFNpemUodiwgJmNTdHIsICZjTGVuKSA8IDAgKSByZXR1cm4gMDsKKyAgICAgICAgKnBfaXRzZWxmID0gQ0ZEYXRhQ3JlYXRlKChDRkFsbG9jYXRvclJlZilOVUxMLCAodW5zaWduZWQgY2hhciAqKWNTdHIsIGNMZW4pOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CiAKLQlpZiAoIUNGRGF0YVJlZk9ial9DaGVjayh2KSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJDRkRhdGFSZWYgcmVxdWlyZWQiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCSpwX2l0c2VsZiA9ICgoQ0ZEYXRhUmVmT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKLQlyZXR1cm4gMTsKKyAgICBpZiAoIUNGRGF0YVJlZk9ial9DaGVjayh2KSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJDRkRhdGFSZWYgcmVxdWlyZWQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICpwX2l0c2VsZiA9ICgoQ0ZEYXRhUmVmT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIHZvaWQgQ0ZEYXRhUmVmT2JqX2RlYWxsb2MoQ0ZEYXRhUmVmT2JqZWN0ICpzZWxmKQogewotCWlmIChzZWxmLT5vYl9mcmVlaXQgJiYgc2VsZi0+b2JfaXRzZWxmKQotCXsKLQkJc2VsZi0+b2JfZnJlZWl0KChDRlR5cGVSZWYpc2VsZi0+b2JfaXRzZWxmKTsKLQkJc2VsZi0+b2JfaXRzZWxmID0gTlVMTDsKLQl9Ci0JQ0ZUeXBlUmVmX1R5cGUudHBfZGVhbGxvYygoUHlPYmplY3QgKilzZWxmKTsKKyAgICBpZiAoc2VsZi0+b2JfZnJlZWl0ICYmIHNlbGYtPm9iX2l0c2VsZikKKyAgICB7CisgICAgICAgIHNlbGYtPm9iX2ZyZWVpdCgoQ0ZUeXBlUmVmKXNlbGYtPm9iX2l0c2VsZik7CisgICAgICAgIHNlbGYtPm9iX2l0c2VsZiA9IE5VTEw7CisgICAgfQorICAgIENGVHlwZVJlZl9UeXBlLnRwX2RlYWxsb2MoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZEYXRhUmVmT2JqX0NGRGF0YUNyZWF0ZUNvcHkoQ0ZEYXRhUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRkRhdGFSZWYgX3J2OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRkRhdGFDcmVhdGVDb3B5KChDRkFsbG9jYXRvclJlZilOVUxMLAotCSAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRkRhdGFSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRkRhdGFSZWYgX3J2OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRkRhdGFDcmVhdGVDb3B5KChDRkFsbG9jYXRvclJlZilOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRkRhdGFSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGRGF0YVJlZk9ial9DRkRhdGFHZXRMZW5ndGgoQ0ZEYXRhUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRkluZGV4IF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZJbmRleCBfcnY7CiAjaWZuZGVmIENGRGF0YUdldExlbmd0aAotCVB5TWFjX1BSRUNIRUNLKENGRGF0YUdldExlbmd0aCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZEYXRhR2V0TGVuZ3RoKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRkRhdGFHZXRMZW5ndGgoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGRGF0YUdldExlbmd0aChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRkRhdGFSZWZPYmpfQ0ZTdHJpbmdDcmVhdGVGcm9tRXh0ZXJuYWxSZXByZXNlbnRhdGlvbihDRkRhdGFSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGU3RyaW5nUmVmIF9ydjsKLQlDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZW5jb2RpbmcpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRlN0cmluZ0NyZWF0ZUZyb21FeHRlcm5hbFJlcHJlc2VudGF0aW9uKChDRkFsbG9jYXRvclJlZilOVUxMLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZTdHJpbmdSZWYgX3J2OworICAgIENGU3RyaW5nRW5jb2RpbmcgZW5jb2Rpbmc7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmNvZGluZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGU3RyaW5nQ3JlYXRlRnJvbUV4dGVybmFsUmVwcmVzZW50YXRpb24oKENGQWxsb2NhdG9yUmVmKU5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGRGF0YVJlZk9ial9DRkRhdGFHZXREYXRhKENGRGF0YVJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogCi0JaW50IHNpemUgPSBDRkRhdGFHZXRMZW5ndGgoX3NlbGYtPm9iX2l0c2VsZik7Ci0JY2hhciAqZGF0YSA9IChjaGFyICopQ0ZEYXRhR2V0Qnl0ZVB0cihfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBpbnQgc2l6ZSA9IENGRGF0YUdldExlbmd0aChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBjaGFyICpkYXRhID0gKGNoYXIgKilDRkRhdGFHZXRCeXRlUHRyKF9zZWxmLT5vYl9pdHNlbGYpOwogCi0JX3JlcyA9IChQeU9iamVjdCAqKVB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGRhdGEsIHNpemUpOwotCXJldHVybiBfcmVzOworICAgIF9yZXMgPSAoUHlPYmplY3QgKilQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShkYXRhLCBzaXplKTsKKyAgICByZXR1cm4gX3JlczsKIAogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgQ0ZEYXRhUmVmT2JqX21ldGhvZHNbXSA9IHsKLQl7IkNGRGF0YUNyZWF0ZUNvcHkiLCAoUHlDRnVuY3Rpb24pQ0ZEYXRhUmVmT2JqX0NGRGF0YUNyZWF0ZUNvcHksIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENGRGF0YVJlZiBfcnYpIil9LAotCXsiQ0ZEYXRhR2V0TGVuZ3RoIiwgKFB5Q0Z1bmN0aW9uKUNGRGF0YVJlZk9ial9DRkRhdGFHZXRMZW5ndGgsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENGSW5kZXggX3J2KSIpfSwKLQl7IkNGU3RyaW5nQ3JlYXRlRnJvbUV4dGVybmFsUmVwcmVzZW50YXRpb24iLCAoUHlDRnVuY3Rpb24pQ0ZEYXRhUmVmT2JqX0NGU3RyaW5nQ3JlYXRlRnJvbUV4dGVybmFsUmVwcmVzZW50YXRpb24sIDEsCi0JIFB5RG9jX1NUUigiKENGU3RyaW5nRW5jb2RpbmcgZW5jb2RpbmcpIC0+IChDRlN0cmluZ1JlZiBfcnYpIil9LAotCXsiQ0ZEYXRhR2V0RGF0YSIsIChQeUNGdW5jdGlvbilDRkRhdGFSZWZPYmpfQ0ZEYXRhR2V0RGF0YSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoc3RyaW5nIF9ydikiKX0sCi0Je05VTEwsIE5VTEwsIDB9CisgICAgeyJDRkRhdGFDcmVhdGVDb3B5IiwgKFB5Q0Z1bmN0aW9uKUNGRGF0YVJlZk9ial9DRkRhdGFDcmVhdGVDb3B5LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDRkRhdGFSZWYgX3J2KSIpfSwKKyAgICB7IkNGRGF0YUdldExlbmd0aCIsIChQeUNGdW5jdGlvbilDRkRhdGFSZWZPYmpfQ0ZEYXRhR2V0TGVuZ3RoLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDRkluZGV4IF9ydikiKX0sCisgICAgeyJDRlN0cmluZ0NyZWF0ZUZyb21FeHRlcm5hbFJlcHJlc2VudGF0aW9uIiwgKFB5Q0Z1bmN0aW9uKUNGRGF0YVJlZk9ial9DRlN0cmluZ0NyZWF0ZUZyb21FeHRlcm5hbFJlcHJlc2VudGF0aW9uLCAxLAorICAgICBQeURvY19TVFIoIihDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKKyAgICB7IkNGRGF0YUdldERhdGEiLCAoUHlDRnVuY3Rpb24pQ0ZEYXRhUmVmT2JqX0NGRGF0YUdldERhdGEsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKHN0cmluZyBfcnYpIil9LAorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogI2RlZmluZSBDRkRhdGFSZWZPYmpfZ2V0c2V0bGlzdCBOVUxMCkBAIC0xNDI3LDEwMCArMTQyNywxMDAgQEAKIAogc3RhdGljIGludCBDRkRhdGFSZWZPYmpfY29tcGFyZShDRkRhdGFSZWZPYmplY3QgKnNlbGYsIENGRGF0YVJlZk9iamVjdCAqb3RoZXIpCiB7Ci0JLyogWFhYWCBPciBzaG91bGQgd2UgdXNlIENGRXF1YWw/PyAqLwotCWlmICggc2VsZi0+b2JfaXRzZWxmID4gb3RoZXItPm9iX2l0c2VsZiApIHJldHVybiAxOwotCWlmICggc2VsZi0+b2JfaXRzZWxmIDwgb3RoZXItPm9iX2l0c2VsZiApIHJldHVybiAtMTsKLQlyZXR1cm4gMDsKKyAgICAvKiBYWFhYIE9yIHNob3VsZCB3ZSB1c2UgQ0ZFcXVhbD8/ICovCisgICAgaWYgKCBzZWxmLT5vYl9pdHNlbGYgPiBvdGhlci0+b2JfaXRzZWxmICkgcmV0dXJuIDE7CisgICAgaWYgKCBzZWxmLT5vYl9pdHNlbGYgPCBvdGhlci0+b2JfaXRzZWxmICkgcmV0dXJuIC0xOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKiBDRkRhdGFSZWZPYmpfcmVwcihDRkRhdGFSZWZPYmplY3QgKnNlbGYpCiB7Ci0JY2hhciBidWZbMTAwXTsKLQlzcHJpbnRmKGJ1ZiwgIjxDRkRhdGFSZWYgb2JqZWN0IGF0IDB4JTguOHggZm9yIDB4JTguOHg+IiwgKHVuc2lnbmVkKXNlbGYsICh1bnNpZ25lZClzZWxmLT5vYl9pdHNlbGYpOwotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CisgICAgY2hhciBidWZbMTAwXTsKKyAgICBzcHJpbnRmKGJ1ZiwgIjxDRkRhdGFSZWYgb2JqZWN0IGF0IDB4JTguOHggZm9yIDB4JTguOHg+IiwgKHVuc2lnbmVkKXNlbGYsICh1bnNpZ25lZClzZWxmLT5vYl9pdHNlbGYpOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CiB9CiAKIHN0YXRpYyBpbnQgQ0ZEYXRhUmVmT2JqX2hhc2goQ0ZEYXRhUmVmT2JqZWN0ICpzZWxmKQogewotCS8qIFhYWFggT3Igc2hvdWxkIHdlIHVzZSBDRkhhc2g/PyAqLwotCXJldHVybiAoaW50KXNlbGYtPm9iX2l0c2VsZjsKKyAgICAvKiBYWFhYIE9yIHNob3VsZCB3ZSB1c2UgQ0ZIYXNoPz8gKi8KKyAgICByZXR1cm4gKGludClzZWxmLT5vYl9pdHNlbGY7CiB9CiBzdGF0aWMgaW50IENGRGF0YVJlZk9ial90cF9pbml0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzLCBQeU9iamVjdCAqX2t3ZHMpCiB7Ci0JQ0ZEYXRhUmVmIGl0c2VsZjsKLQljaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKKyAgICBDRkRhdGFSZWYgaXRzZWxmOworICAgIGNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OwogCi0JaWYgKFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBDRkRhdGFSZWZPYmpfQ29udmVydCwgJml0c2VsZikpCi0JewotCQkoKENGRGF0YVJlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCQlyZXR1cm4gMDsKLQl9CisgICAgaWYgKFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBDRkRhdGFSZWZPYmpfQ29udmVydCwgJml0c2VsZikpCisgICAgeworICAgICAgICAoKENGRGF0YVJlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLQkvKiBBbnkgQ0ZUeXBlUmVmIGRlc2NlbmRlbnQgaXMgYWxsb3dlZCBhcyBpbml0aWFsaXplciB0b28gKi8KLQlpZiAoUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIENGVHlwZVJlZk9ial9Db252ZXJ0LCAmaXRzZWxmKSkKLQl7Ci0JCSgoQ0ZEYXRhUmVmT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JCXJldHVybiAwOwotCX0KLQlyZXR1cm4gLTE7CisgICAgLyogQW55IENGVHlwZVJlZiBkZXNjZW5kZW50IGlzIGFsbG93ZWQgYXMgaW5pdGlhbGl6ZXIgdG9vICovCisgICAgaWYgKFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBDRlR5cGVSZWZPYmpfQ29udmVydCwgJml0c2VsZikpCisgICAgeworICAgICAgICAoKENGRGF0YVJlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIC0xOwogfQogCiAjZGVmaW5lIENGRGF0YVJlZk9ial90cF9hbGxvYyBQeVR5cGVfR2VuZXJpY0FsbG9jCiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZEYXRhUmVmT2JqX3RwX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICpfYXJncywgUHlPYmplY3QgKl9rd2RzKQogewotCVB5T2JqZWN0ICpzZWxmOwotCWlmICgoc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkoKENGRGF0YVJlZk9iamVjdCAqKXNlbGYpLT5vYl9pdHNlbGYgPSBOVUxMOwotCSgoQ0ZEYXRhUmVmT2JqZWN0ICopc2VsZiktPm9iX2ZyZWVpdCA9IENGUmVsZWFzZTsKLQlyZXR1cm4gc2VsZjsKKyAgICBQeU9iamVjdCAqc2VsZjsKKyAgICBpZiAoKHNlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgKChDRkRhdGFSZWZPYmplY3QgKilzZWxmKS0+b2JfaXRzZWxmID0gTlVMTDsKKyAgICAoKENGRGF0YVJlZk9iamVjdCAqKXNlbGYpLT5vYl9mcmVlaXQgPSBDRlJlbGVhc2U7CisgICAgcmV0dXJuIHNlbGY7CiB9CiAKICNkZWZpbmUgQ0ZEYXRhUmVmT2JqX3RwX2ZyZWUgUHlPYmplY3RfRGVsCiAKIAogUHlUeXBlT2JqZWN0IENGRGF0YVJlZl9UeXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQotCTAsIC8qb2Jfc2l6ZSovCi0JIl9DRi5DRkRhdGFSZWYiLCAvKnRwX25hbWUqLwotCXNpemVvZihDRkRhdGFSZWZPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCi0JMCwgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKSBDRkRhdGFSZWZPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KLQkwLCAvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykgQ0ZEYXRhUmVmT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCi0JKHJlcHJmdW5jKSBDRkRhdGFSZWZPYmpfcmVwciwgLyp0cF9yZXByKi8KLQkoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCi0JKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpIENGRGF0YVJlZk9ial9oYXNoLCAvKnRwX2hhc2gqLwotCTAsIC8qdHBfY2FsbCovCi0JMCwgLyp0cF9zdHIqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KLQlQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLwotCTAsIC8qdHBfYXNfYnVmZmVyKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQkwLCAvKnRwX2RvYyovCi0JMCwgLyp0cF90cmF2ZXJzZSovCi0JMCwgLyp0cF9jbGVhciovCi0JMCwgLyp0cF9yaWNoY29tcGFyZSovCi0JMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCi0JMCwgLyp0cF9pdGVyKi8KLQkwLCAvKnRwX2l0ZXJuZXh0Ki8KLQlDRkRhdGFSZWZPYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLwotCTAsIC8qdHBfbWVtYmVycyovCi0JQ0ZEYXRhUmVmT2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KLQkwLCAvKnRwX2Jhc2UqLwotCTAsIC8qdHBfZGljdCovCi0JMCwgLyp0cF9kZXNjcl9nZXQqLwotCTAsIC8qdHBfZGVzY3Jfc2V0Ki8KLQkwLCAvKnRwX2RpY3RvZmZzZXQqLwotCUNGRGF0YVJlZk9ial90cF9pbml0LCAvKiB0cF9pbml0ICovCi0JQ0ZEYXRhUmVmT2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLwotCUNGRGF0YVJlZk9ial90cF9uZXcsIC8qIHRwX25ldyAqLwotCUNGRGF0YVJlZk9ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgLypvYl9zaXplKi8KKyAgICAiX0NGLkNGRGF0YVJlZiIsIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKENGRGF0YVJlZk9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpIENGRGF0YVJlZk9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgIDAsIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLworICAgIChzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLworICAgIChjbXBmdW5jKSBDRkRhdGFSZWZPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpIENGRGF0YVJlZk9ial9yZXByLCAvKnRwX3JlcHIqLworICAgIChQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIChQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLworICAgIChoYXNoZnVuYykgQ0ZEYXRhUmVmT2JqX2hhc2gsIC8qdHBfaGFzaCovCisgICAgMCwgLyp0cF9jYWxsKi8KKyAgICAwLCAvKnRwX3N0ciovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLworICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCisgICAgMCwgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLworICAgIDAsIC8qdHBfZG9jKi8KKyAgICAwLCAvKnRwX3RyYXZlcnNlKi8KKyAgICAwLCAvKnRwX2NsZWFyKi8KKyAgICAwLCAvKnRwX3JpY2hjb21wYXJlKi8KKyAgICAwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KKyAgICAwLCAvKnRwX2l0ZXIqLworICAgIDAsIC8qdHBfaXRlcm5leHQqLworICAgIENGRGF0YVJlZk9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCisgICAgMCwgLyp0cF9tZW1iZXJzKi8KKyAgICBDRkRhdGFSZWZPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLworICAgIDAsIC8qdHBfYmFzZSovCisgICAgMCwgLyp0cF9kaWN0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX2dldCovCisgICAgMCwgLyp0cF9kZXNjcl9zZXQqLworICAgIDAsIC8qdHBfZGljdG9mZnNldCovCisgICAgQ0ZEYXRhUmVmT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KKyAgICBDRkRhdGFSZWZPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCisgICAgQ0ZEYXRhUmVmT2JqX3RwX25ldywgLyogdHBfbmV3ICovCisgICAgQ0ZEYXRhUmVmT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0gRW5kIG9iamVjdCB0eXBlIENGRGF0YVJlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMTUzMywxNTggKzE1MzMsMTU4IEBACiAjZGVmaW5lIENGTXV0YWJsZURhdGFSZWZPYmpfQ2hlY2soeCkgKCh4KS0+b2JfdHlwZSA9PSAmQ0ZNdXRhYmxlRGF0YVJlZl9UeXBlIHx8IFB5T2JqZWN0X1R5cGVDaGVjaygoeCksICZDRk11dGFibGVEYXRhUmVmX1R5cGUpKQogCiB0eXBlZGVmIHN0cnVjdCBDRk11dGFibGVEYXRhUmVmT2JqZWN0IHsKLQlQeU9iamVjdF9IRUFECi0JQ0ZNdXRhYmxlRGF0YVJlZiBvYl9pdHNlbGY7Ci0Jdm9pZCAoKm9iX2ZyZWVpdCkoQ0ZUeXBlUmVmIHB0cik7CisgICAgUHlPYmplY3RfSEVBRAorICAgIENGTXV0YWJsZURhdGFSZWYgb2JfaXRzZWxmOworICAgIHZvaWQgKCpvYl9mcmVlaXQpKENGVHlwZVJlZiBwdHIpOwogfSBDRk11dGFibGVEYXRhUmVmT2JqZWN0OwogCiBQeU9iamVjdCAqQ0ZNdXRhYmxlRGF0YVJlZk9ial9OZXcoQ0ZNdXRhYmxlRGF0YVJlZiBpdHNlbGYpCiB7Ci0JQ0ZNdXRhYmxlRGF0YVJlZk9iamVjdCAqaXQ7Ci0JaWYgKGl0c2VsZiA9PSBOVUxMKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgImNhbm5vdCB3cmFwIE5VTEwiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWl0ID0gUHlPYmplY3RfTkVXKENGTXV0YWJsZURhdGFSZWZPYmplY3QsICZDRk11dGFibGVEYXRhUmVmX1R5cGUpOwotCWlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkvKiBYWFhYIFNob3VsZCB3ZSB0cF9pbml0IG9yIHRwX25ldyBvdXIgYmFzZXR5cGU/ICovCi0JaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlpdC0+b2JfZnJlZWl0ID0gQ0ZSZWxlYXNlOwotCXJldHVybiAoUHlPYmplY3QgKilpdDsKKyAgICBDRk11dGFibGVEYXRhUmVmT2JqZWN0ICppdDsKKyAgICBpZiAoaXRzZWxmID09IE5VTEwpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAiY2Fubm90IHdyYXAgTlVMTCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaXQgPSBQeU9iamVjdF9ORVcoQ0ZNdXRhYmxlRGF0YVJlZk9iamVjdCwgJkNGTXV0YWJsZURhdGFSZWZfVHlwZSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIC8qIFhYWFggU2hvdWxkIHdlIHRwX2luaXQgb3IgdHBfbmV3IG91ciBiYXNldHlwZT8gKi8KKyAgICBpdC0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIGl0LT5vYl9mcmVlaXQgPSBDRlJlbGVhc2U7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogCiBpbnQgQ0ZNdXRhYmxlRGF0YVJlZk9ial9Db252ZXJ0KFB5T2JqZWN0ICp2LCBDRk11dGFibGVEYXRhUmVmICpwX2l0c2VsZikKIHsKIAotCWlmICh2ID09IFB5X05vbmUpIHsgKnBfaXRzZWxmID0gTlVMTDsgcmV0dXJuIDE7IH0KLQkvKiBDaGVjayBmb3Igb3RoZXIgQ0Ygb2JqZWN0cyBoZXJlICovCisgICAgaWYgKHYgPT0gUHlfTm9uZSkgeyAqcF9pdHNlbGYgPSBOVUxMOyByZXR1cm4gMTsgfQorICAgIC8qIENoZWNrIGZvciBvdGhlciBDRiBvYmplY3RzIGhlcmUgKi8KIAotCWlmICghQ0ZNdXRhYmxlRGF0YVJlZk9ial9DaGVjayh2KSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJDRk11dGFibGVEYXRhUmVmIHJlcXVpcmVkIik7Ci0JCXJldHVybiAwOwotCX0KLQkqcF9pdHNlbGYgPSAoKENGTXV0YWJsZURhdGFSZWZPYmplY3QgKil2KS0+b2JfaXRzZWxmOwotCXJldHVybiAxOworICAgIGlmICghQ0ZNdXRhYmxlRGF0YVJlZk9ial9DaGVjayh2KSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJDRk11dGFibGVEYXRhUmVmIHJlcXVpcmVkIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAqcF9pdHNlbGYgPSAoKENGTXV0YWJsZURhdGFSZWZPYmplY3QgKil2KS0+b2JfaXRzZWxmOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgdm9pZCBDRk11dGFibGVEYXRhUmVmT2JqX2RlYWxsb2MoQ0ZNdXRhYmxlRGF0YVJlZk9iamVjdCAqc2VsZikKIHsKLQlpZiAoc2VsZi0+b2JfZnJlZWl0ICYmIHNlbGYtPm9iX2l0c2VsZikKLQl7Ci0JCXNlbGYtPm9iX2ZyZWVpdCgoQ0ZUeXBlUmVmKXNlbGYtPm9iX2l0c2VsZik7Ci0JCXNlbGYtPm9iX2l0c2VsZiA9IE5VTEw7Ci0JfQotCUNGRGF0YVJlZl9UeXBlLnRwX2RlYWxsb2MoKFB5T2JqZWN0ICopc2VsZik7CisgICAgaWYgKHNlbGYtPm9iX2ZyZWVpdCAmJiBzZWxmLT5vYl9pdHNlbGYpCisgICAgeworICAgICAgICBzZWxmLT5vYl9mcmVlaXQoKENGVHlwZVJlZilzZWxmLT5vYl9pdHNlbGYpOworICAgICAgICBzZWxmLT5vYl9pdHNlbGYgPSBOVUxMOworICAgIH0KKyAgICBDRkRhdGFSZWZfVHlwZS50cF9kZWFsbG9jKChQeU9iamVjdCAqKXNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGTXV0YWJsZURhdGFSZWZPYmpfQ0ZEYXRhU2V0TGVuZ3RoKENGTXV0YWJsZURhdGFSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGSW5kZXggbGVuZ3RoOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRkluZGV4IGxlbmd0aDsKICNpZm5kZWYgQ0ZEYXRhU2V0TGVuZ3RoCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZEYXRhU2V0TGVuZ3RoKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRkRhdGFTZXRMZW5ndGgpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZsZW5ndGgpKQotCQlyZXR1cm4gTlVMTDsKLQlDRkRhdGFTZXRMZW5ndGgoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgbGVuZ3RoKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZsZW5ndGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDRkRhdGFTZXRMZW5ndGgoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgbGVuZ3RoKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZNdXRhYmxlRGF0YVJlZk9ial9DRkRhdGFJbmNyZWFzZUxlbmd0aChDRk11dGFibGVEYXRhUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRkluZGV4IGV4dHJhTGVuZ3RoOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRkluZGV4IGV4dHJhTGVuZ3RoOwogI2lmbmRlZiBDRkRhdGFJbmNyZWFzZUxlbmd0aAotCVB5TWFjX1BSRUNIRUNLKENGRGF0YUluY3JlYXNlTGVuZ3RoKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRkRhdGFJbmNyZWFzZUxlbmd0aCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmV4dHJhTGVuZ3RoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0ZEYXRhSW5jcmVhc2VMZW5ndGgoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICBleHRyYUxlbmd0aCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZXh0cmFMZW5ndGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDRkRhdGFJbmNyZWFzZUxlbmd0aChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhTGVuZ3RoKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZNdXRhYmxlRGF0YVJlZk9ial9DRkRhdGFBcHBlbmRCeXRlcyhDRk11dGFibGVEYXRhUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQl1bnNpZ25lZCBjaGFyICpieXRlc19faW5fXzsKLQlsb25nIGJ5dGVzX19sZW5fXzsKLQlpbnQgYnl0ZXNfX2luX2xlbl9fOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICB1bnNpZ25lZCBjaGFyICpieXRlc19faW5fXzsKKyAgICBsb25nIGJ5dGVzX19sZW5fXzsKKyAgICBpbnQgYnl0ZXNfX2luX2xlbl9fOwogI2lmbmRlZiBDRkRhdGFBcHBlbmRCeXRlcwotCVB5TWFjX1BSRUNIRUNLKENGRGF0YUFwcGVuZEJ5dGVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRkRhdGFBcHBlbmRCeXRlcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzIyIsCi0JICAgICAgICAgICAgICAgICAgICAgICZieXRlc19faW5fXywgJmJ5dGVzX19pbl9sZW5fXykpCi0JCXJldHVybiBOVUxMOwotCWJ5dGVzX19sZW5fXyA9IGJ5dGVzX19pbl9sZW5fXzsKLQlDRkRhdGFBcHBlbmRCeXRlcyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgIGJ5dGVzX19pbl9fLCBieXRlc19fbGVuX18pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzIyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZieXRlc19faW5fXywgJmJ5dGVzX19pbl9sZW5fXykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGJ5dGVzX19sZW5fXyA9IGJ5dGVzX19pbl9sZW5fXzsKKyAgICBDRkRhdGFBcHBlbmRCeXRlcyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzX19pbl9fLCBieXRlc19fbGVuX18pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRk11dGFibGVEYXRhUmVmT2JqX0NGRGF0YVJlcGxhY2VCeXRlcyhDRk11dGFibGVEYXRhUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlJhbmdlIHJhbmdlOwotCXVuc2lnbmVkIGNoYXIgKm5ld0J5dGVzX19pbl9fOwotCWxvbmcgbmV3Qnl0ZXNfX2xlbl9fOwotCWludCBuZXdCeXRlc19faW5fbGVuX187CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGUmFuZ2UgcmFuZ2U7CisgICAgdW5zaWduZWQgY2hhciAqbmV3Qnl0ZXNfX2luX187CisgICAgbG9uZyBuZXdCeXRlc19fbGVuX187CisgICAgaW50IG5ld0J5dGVzX19pbl9sZW5fXzsKICNpZm5kZWYgQ0ZEYXRhUmVwbGFjZUJ5dGVzCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZEYXRhUmVwbGFjZUJ5dGVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRkRhdGFSZXBsYWNlQnl0ZXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIyIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGUmFuZ2VfQ29udmVydCwgJnJhbmdlLAotCSAgICAgICAgICAgICAgICAgICAgICAmbmV3Qnl0ZXNfX2luX18sICZuZXdCeXRlc19faW5fbGVuX18pKQotCQlyZXR1cm4gTlVMTDsKLQluZXdCeXRlc19fbGVuX18gPSBuZXdCeXRlc19faW5fbGVuX187Ci0JQ0ZEYXRhUmVwbGFjZUJ5dGVzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgIHJhbmdlLAotCSAgICAgICAgICAgICAgICAgICBuZXdCeXRlc19faW5fXywgbmV3Qnl0ZXNfX2xlbl9fKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGUmFuZ2VfQ29udmVydCwgJnJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbmV3Qnl0ZXNfX2luX18sICZuZXdCeXRlc19faW5fbGVuX18pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBuZXdCeXRlc19fbGVuX18gPSBuZXdCeXRlc19faW5fbGVuX187CisgICAgQ0ZEYXRhUmVwbGFjZUJ5dGVzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICBuZXdCeXRlc19faW5fXywgbmV3Qnl0ZXNfX2xlbl9fKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZNdXRhYmxlRGF0YVJlZk9ial9DRkRhdGFEZWxldGVCeXRlcyhDRk11dGFibGVEYXRhUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlJhbmdlIHJhbmdlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlJhbmdlIHJhbmdlOwogI2lmbmRlZiBDRkRhdGFEZWxldGVCeXRlcwotCVB5TWFjX1BSRUNIRUNLKENGRGF0YURlbGV0ZUJ5dGVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRkRhdGFEZWxldGVCeXRlcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGUmFuZ2VfQ29udmVydCwgJnJhbmdlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0ZEYXRhRGVsZXRlQnl0ZXMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICByYW5nZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZSYW5nZV9Db252ZXJ0LCAmcmFuZ2UpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDRkRhdGFEZWxldGVCeXRlcyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgIHJhbmdlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBDRk11dGFibGVEYXRhUmVmT2JqX21ldGhvZHNbXSA9IHsKLQl7IkNGRGF0YVNldExlbmd0aCIsIChQeUNGdW5jdGlvbilDRk11dGFibGVEYXRhUmVmT2JqX0NGRGF0YVNldExlbmd0aCwgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZJbmRleCBsZW5ndGgpIC0+IE5vbmUiKX0sCi0JeyJDRkRhdGFJbmNyZWFzZUxlbmd0aCIsIChQeUNGdW5jdGlvbilDRk11dGFibGVEYXRhUmVmT2JqX0NGRGF0YUluY3JlYXNlTGVuZ3RoLCAxLAotCSBQeURvY19TVFIoIihDRkluZGV4IGV4dHJhTGVuZ3RoKSAtPiBOb25lIil9LAotCXsiQ0ZEYXRhQXBwZW5kQnl0ZXMiLCAoUHlDRnVuY3Rpb24pQ0ZNdXRhYmxlRGF0YVJlZk9ial9DRkRhdGFBcHBlbmRCeXRlcywgMSwKLQkgUHlEb2NfU1RSKCIoQnVmZmVyIGJ5dGVzKSAtPiBOb25lIil9LAotCXsiQ0ZEYXRhUmVwbGFjZUJ5dGVzIiwgKFB5Q0Z1bmN0aW9uKUNGTXV0YWJsZURhdGFSZWZPYmpfQ0ZEYXRhUmVwbGFjZUJ5dGVzLCAxLAotCSBQeURvY19TVFIoIihDRlJhbmdlIHJhbmdlLCBCdWZmZXIgbmV3Qnl0ZXMpIC0+IE5vbmUiKX0sCi0JeyJDRkRhdGFEZWxldGVCeXRlcyIsIChQeUNGdW5jdGlvbilDRk11dGFibGVEYXRhUmVmT2JqX0NGRGF0YURlbGV0ZUJ5dGVzLCAxLAotCSBQeURvY19TVFIoIihDRlJhbmdlIHJhbmdlKSAtPiBOb25lIil9LAotCXtOVUxMLCBOVUxMLCAwfQorICAgIHsiQ0ZEYXRhU2V0TGVuZ3RoIiwgKFB5Q0Z1bmN0aW9uKUNGTXV0YWJsZURhdGFSZWZPYmpfQ0ZEYXRhU2V0TGVuZ3RoLCAxLAorICAgICBQeURvY19TVFIoIihDRkluZGV4IGxlbmd0aCkgLT4gTm9uZSIpfSwKKyAgICB7IkNGRGF0YUluY3JlYXNlTGVuZ3RoIiwgKFB5Q0Z1bmN0aW9uKUNGTXV0YWJsZURhdGFSZWZPYmpfQ0ZEYXRhSW5jcmVhc2VMZW5ndGgsIDEsCisgICAgIFB5RG9jX1NUUigiKENGSW5kZXggZXh0cmFMZW5ndGgpIC0+IE5vbmUiKX0sCisgICAgeyJDRkRhdGFBcHBlbmRCeXRlcyIsIChQeUNGdW5jdGlvbilDRk11dGFibGVEYXRhUmVmT2JqX0NGRGF0YUFwcGVuZEJ5dGVzLCAxLAorICAgICBQeURvY19TVFIoIihCdWZmZXIgYnl0ZXMpIC0+IE5vbmUiKX0sCisgICAgeyJDRkRhdGFSZXBsYWNlQnl0ZXMiLCAoUHlDRnVuY3Rpb24pQ0ZNdXRhYmxlRGF0YVJlZk9ial9DRkRhdGFSZXBsYWNlQnl0ZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKENGUmFuZ2UgcmFuZ2UsIEJ1ZmZlciBuZXdCeXRlcykgLT4gTm9uZSIpfSwKKyAgICB7IkNGRGF0YURlbGV0ZUJ5dGVzIiwgKFB5Q0Z1bmN0aW9uKUNGTXV0YWJsZURhdGFSZWZPYmpfQ0ZEYXRhRGVsZXRlQnl0ZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKENGUmFuZ2UgcmFuZ2UpIC0+IE5vbmUiKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAjZGVmaW5lIENGTXV0YWJsZURhdGFSZWZPYmpfZ2V0c2V0bGlzdCBOVUxMCkBAIC0xNjkyLDEwMCArMTY5MiwxMDAgQEAKIAogc3RhdGljIGludCBDRk11dGFibGVEYXRhUmVmT2JqX2NvbXBhcmUoQ0ZNdXRhYmxlRGF0YVJlZk9iamVjdCAqc2VsZiwgQ0ZNdXRhYmxlRGF0YVJlZk9iamVjdCAqb3RoZXIpCiB7Ci0JLyogWFhYWCBPciBzaG91bGQgd2UgdXNlIENGRXF1YWw/PyAqLwotCWlmICggc2VsZi0+b2JfaXRzZWxmID4gb3RoZXItPm9iX2l0c2VsZiApIHJldHVybiAxOwotCWlmICggc2VsZi0+b2JfaXRzZWxmIDwgb3RoZXItPm9iX2l0c2VsZiApIHJldHVybiAtMTsKLQlyZXR1cm4gMDsKKyAgICAvKiBYWFhYIE9yIHNob3VsZCB3ZSB1c2UgQ0ZFcXVhbD8/ICovCisgICAgaWYgKCBzZWxmLT5vYl9pdHNlbGYgPiBvdGhlci0+b2JfaXRzZWxmICkgcmV0dXJuIDE7CisgICAgaWYgKCBzZWxmLT5vYl9pdHNlbGYgPCBvdGhlci0+b2JfaXRzZWxmICkgcmV0dXJuIC0xOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKiBDRk11dGFibGVEYXRhUmVmT2JqX3JlcHIoQ0ZNdXRhYmxlRGF0YVJlZk9iamVjdCAqc2VsZikKIHsKLQljaGFyIGJ1ZlsxMDBdOwotCXNwcmludGYoYnVmLCAiPENGTXV0YWJsZURhdGFSZWYgb2JqZWN0IGF0IDB4JTguOHggZm9yIDB4JTguOHg+IiwgKHVuc2lnbmVkKXNlbGYsICh1bnNpZ25lZClzZWxmLT5vYl9pdHNlbGYpOwotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CisgICAgY2hhciBidWZbMTAwXTsKKyAgICBzcHJpbnRmKGJ1ZiwgIjxDRk11dGFibGVEYXRhUmVmIG9iamVjdCBhdCAweCU4Ljh4IGZvciAweCU4Ljh4PiIsICh1bnNpZ25lZClzZWxmLCAodW5zaWduZWQpc2VsZi0+b2JfaXRzZWxmKTsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOwogfQogCiBzdGF0aWMgaW50IENGTXV0YWJsZURhdGFSZWZPYmpfaGFzaChDRk11dGFibGVEYXRhUmVmT2JqZWN0ICpzZWxmKQogewotCS8qIFhYWFggT3Igc2hvdWxkIHdlIHVzZSBDRkhhc2g/PyAqLwotCXJldHVybiAoaW50KXNlbGYtPm9iX2l0c2VsZjsKKyAgICAvKiBYWFhYIE9yIHNob3VsZCB3ZSB1c2UgQ0ZIYXNoPz8gKi8KKyAgICByZXR1cm4gKGludClzZWxmLT5vYl9pdHNlbGY7CiB9CiBzdGF0aWMgaW50IENGTXV0YWJsZURhdGFSZWZPYmpfdHBfaW5pdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncywgUHlPYmplY3QgKl9rd2RzKQogewotCUNGTXV0YWJsZURhdGFSZWYgaXRzZWxmOwotCWNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OworICAgIENGTXV0YWJsZURhdGFSZWYgaXRzZWxmOworICAgIGNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OwogCi0JaWYgKFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBDRk11dGFibGVEYXRhUmVmT2JqX0NvbnZlcnQsICZpdHNlbGYpKQotCXsKLQkJKChDRk11dGFibGVEYXRhUmVmT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JCXJldHVybiAwOwotCX0KKyAgICBpZiAoUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIENGTXV0YWJsZURhdGFSZWZPYmpfQ29udmVydCwgJml0c2VsZikpCisgICAgeworICAgICAgICAoKENGTXV0YWJsZURhdGFSZWZPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCi0JLyogQW55IENGVHlwZVJlZiBkZXNjZW5kZW50IGlzIGFsbG93ZWQgYXMgaW5pdGlhbGl6ZXIgdG9vICovCi0JaWYgKFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBDRlR5cGVSZWZPYmpfQ29udmVydCwgJml0c2VsZikpCi0JewotCQkoKENGTXV0YWJsZURhdGFSZWZPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiAtMTsKKyAgICAvKiBBbnkgQ0ZUeXBlUmVmIGRlc2NlbmRlbnQgaXMgYWxsb3dlZCBhcyBpbml0aWFsaXplciB0b28gKi8KKyAgICBpZiAoUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIENGVHlwZVJlZk9ial9Db252ZXJ0LCAmaXRzZWxmKSkKKyAgICB7CisgICAgICAgICgoQ0ZNdXRhYmxlRGF0YVJlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIC0xOwogfQogCiAjZGVmaW5lIENGTXV0YWJsZURhdGFSZWZPYmpfdHBfYWxsb2MgUHlUeXBlX0dlbmVyaWNBbGxvYwogCiBzdGF0aWMgUHlPYmplY3QgKkNGTXV0YWJsZURhdGFSZWZPYmpfdHBfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKl9hcmdzLCBQeU9iamVjdCAqX2t3ZHMpCiB7Ci0JUHlPYmplY3QgKnNlbGY7Ci0JaWYgKChzZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOwotCSgoQ0ZNdXRhYmxlRGF0YVJlZk9iamVjdCAqKXNlbGYpLT5vYl9pdHNlbGYgPSBOVUxMOwotCSgoQ0ZNdXRhYmxlRGF0YVJlZk9iamVjdCAqKXNlbGYpLT5vYl9mcmVlaXQgPSBDRlJlbGVhc2U7Ci0JcmV0dXJuIHNlbGY7CisgICAgUHlPYmplY3QgKnNlbGY7CisgICAgaWYgKChzZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOworICAgICgoQ0ZNdXRhYmxlRGF0YVJlZk9iamVjdCAqKXNlbGYpLT5vYl9pdHNlbGYgPSBOVUxMOworICAgICgoQ0ZNdXRhYmxlRGF0YVJlZk9iamVjdCAqKXNlbGYpLT5vYl9mcmVlaXQgPSBDRlJlbGVhc2U7CisgICAgcmV0dXJuIHNlbGY7CiB9CiAKICNkZWZpbmUgQ0ZNdXRhYmxlRGF0YVJlZk9ial90cF9mcmVlIFB5T2JqZWN0X0RlbAogCiAKIFB5VHlwZU9iamVjdCBDRk11dGFibGVEYXRhUmVmX1R5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCi0JMCwgLypvYl9zaXplKi8KLQkiX0NGLkNGTXV0YWJsZURhdGFSZWYiLCAvKnRwX25hbWUqLwotCXNpemVvZihDRk11dGFibGVEYXRhUmVmT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLwotCTAsIC8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcikgQ0ZNdXRhYmxlRGF0YVJlZk9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsIC8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLwotCShjbXBmdW5jKSBDRk11dGFibGVEYXRhUmVmT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCi0JKHJlcHJmdW5jKSBDRk11dGFibGVEYXRhUmVmT2JqX3JlcHIsIC8qdHBfcmVwciovCi0JKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLwotCShQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCi0JKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCi0JKGhhc2hmdW5jKSBDRk11dGFibGVEYXRhUmVmT2JqX2hhc2gsIC8qdHBfaGFzaCovCi0JMCwgLyp0cF9jYWxsKi8KLQkwLCAvKnRwX3N0ciovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLwotCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCi0JMCwgLyp0cF9hc19idWZmZXIqLwotCVB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCTAsIC8qdHBfZG9jKi8KLQkwLCAvKnRwX3RyYXZlcnNlKi8KLQkwLCAvKnRwX2NsZWFyKi8KLQkwLCAvKnRwX3JpY2hjb21wYXJlKi8KLQkwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLQkwLCAvKnRwX2l0ZXIqLwotCTAsIC8qdHBfaXRlcm5leHQqLwotCUNGTXV0YWJsZURhdGFSZWZPYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLwotCTAsIC8qdHBfbWVtYmVycyovCi0JQ0ZNdXRhYmxlRGF0YVJlZk9ial9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCi0JMCwgLyp0cF9iYXNlKi8KLQkwLCAvKnRwX2RpY3QqLwotCTAsIC8qdHBfZGVzY3JfZ2V0Ki8KLQkwLCAvKnRwX2Rlc2NyX3NldCovCi0JMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KLQlDRk11dGFibGVEYXRhUmVmT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KLQlDRk11dGFibGVEYXRhUmVmT2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLwotCUNGTXV0YWJsZURhdGFSZWZPYmpfdHBfbmV3LCAvKiB0cF9uZXcgKi8KLQlDRk11dGFibGVEYXRhUmVmT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAvKm9iX3NpemUqLworICAgICJfQ0YuQ0ZNdXRhYmxlRGF0YVJlZiIsIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKENGTXV0YWJsZURhdGFSZWZPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKSBDRk11dGFibGVEYXRhUmVmT2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgMCwgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCisgICAgKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCisgICAgKGNtcGZ1bmMpIENGTXV0YWJsZURhdGFSZWZPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpIENGTXV0YWJsZURhdGFSZWZPYmpfcmVwciwgLyp0cF9yZXByKi8KKyAgICAoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCisgICAgKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAoaGFzaGZ1bmMpIENGTXV0YWJsZURhdGFSZWZPYmpfaGFzaCwgLyp0cF9oYXNoKi8KKyAgICAwLCAvKnRwX2NhbGwqLworICAgIDAsIC8qdHBfc3RyKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCisgICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgMCwgLyp0cF9kb2MqLworICAgIDAsIC8qdHBfdHJhdmVyc2UqLworICAgIDAsIC8qdHBfY2xlYXIqLworICAgIDAsIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsIC8qdHBfaXRlciovCisgICAgMCwgLyp0cF9pdGVybmV4dCovCisgICAgQ0ZNdXRhYmxlRGF0YVJlZk9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCisgICAgMCwgLyp0cF9tZW1iZXJzKi8KKyAgICBDRk11dGFibGVEYXRhUmVmT2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KKyAgICAwLCAvKnRwX2Jhc2UqLworICAgIDAsIC8qdHBfZGljdCovCisgICAgMCwgLyp0cF9kZXNjcl9nZXQqLworICAgIDAsIC8qdHBfZGVzY3Jfc2V0Ki8KKyAgICAwLCAvKnRwX2RpY3RvZmZzZXQqLworICAgIENGTXV0YWJsZURhdGFSZWZPYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLworICAgIENGTXV0YWJsZURhdGFSZWZPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCisgICAgQ0ZNdXRhYmxlRGF0YVJlZk9ial90cF9uZXcsIC8qIHRwX25ldyAqLworICAgIENGTXV0YWJsZURhdGFSZWZPYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLSBFbmQgb2JqZWN0IHR5cGUgQ0ZNdXRhYmxlRGF0YVJlZiAtLS0tLS0tLS0tLS0tLS0tICovCkBAIC0xNzk4LDYzNiArMTc5OCw2MzYgQEAKICNkZWZpbmUgQ0ZTdHJpbmdSZWZPYmpfQ2hlY2soeCkgKCh4KS0+b2JfdHlwZSA9PSAmQ0ZTdHJpbmdSZWZfVHlwZSB8fCBQeU9iamVjdF9UeXBlQ2hlY2soKHgpLCAmQ0ZTdHJpbmdSZWZfVHlwZSkpCiAKIHR5cGVkZWYgc3RydWN0IENGU3RyaW5nUmVmT2JqZWN0IHsKLQlQeU9iamVjdF9IRUFECi0JQ0ZTdHJpbmdSZWYgb2JfaXRzZWxmOwotCXZvaWQgKCpvYl9mcmVlaXQpKENGVHlwZVJlZiBwdHIpOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBDRlN0cmluZ1JlZiBvYl9pdHNlbGY7CisgICAgdm9pZCAoKm9iX2ZyZWVpdCkoQ0ZUeXBlUmVmIHB0cik7CiB9IENGU3RyaW5nUmVmT2JqZWN0OwogCiBQeU9iamVjdCAqQ0ZTdHJpbmdSZWZPYmpfTmV3KENGU3RyaW5nUmVmIGl0c2VsZikKIHsKLQlDRlN0cmluZ1JlZk9iamVjdCAqaXQ7Ci0JaWYgKGl0c2VsZiA9PSBOVUxMKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgImNhbm5vdCB3cmFwIE5VTEwiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWl0ID0gUHlPYmplY3RfTkVXKENGU3RyaW5nUmVmT2JqZWN0LCAmQ0ZTdHJpbmdSZWZfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOwotCS8qIFhYWFggU2hvdWxkIHdlIHRwX2luaXQgb3IgdHBfbmV3IG91ciBiYXNldHlwZT8gKi8KLQlpdC0+b2JfaXRzZWxmID0gaXRzZWxmOwotCWl0LT5vYl9mcmVlaXQgPSBDRlJlbGVhc2U7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIENGU3RyaW5nUmVmT2JqZWN0ICppdDsKKyAgICBpZiAoaXRzZWxmID09IE5VTEwpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAiY2Fubm90IHdyYXAgTlVMTCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaXQgPSBQeU9iamVjdF9ORVcoQ0ZTdHJpbmdSZWZPYmplY3QsICZDRlN0cmluZ1JlZl9UeXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgLyogWFhYWCBTaG91bGQgd2UgdHBfaW5pdCBvciB0cF9uZXcgb3VyIGJhc2V0eXBlPyAqLworICAgIGl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgaXQtPm9iX2ZyZWVpdCA9IENGUmVsZWFzZTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiAKIGludCBDRlN0cmluZ1JlZk9ial9Db252ZXJ0KFB5T2JqZWN0ICp2LCBDRlN0cmluZ1JlZiAqcF9pdHNlbGYpCiB7CiAKLQlpZiAodiA9PSBQeV9Ob25lKSB7ICpwX2l0c2VsZiA9IE5VTEw7IHJldHVybiAxOyB9Ci0JaWYgKFB5U3RyaW5nX0NoZWNrKHYpKSB7Ci0JICAgIGNoYXIgKmNTdHI7Ci0JICAgIGlmICghUHlBcmdfUGFyc2UodiwgImVzIiwgImFzY2lpIiwgJmNTdHIpKQotCSAgICAgICAgcmV0dXJuIDA7Ci0JICAgICAgICAqcF9pdHNlbGYgPSBDRlN0cmluZ0NyZWF0ZVdpdGhDU3RyaW5nKChDRkFsbG9jYXRvclJlZilOVUxMLCBjU3RyLCBrQ0ZTdHJpbmdFbmNvZGluZ0FTQ0lJKTsKLQkJUHlNZW1fRnJlZShjU3RyKTsKLQkgICAgICAgIHJldHVybiAxOwotCX0KLQlpZiAoUHlVbmljb2RlX0NoZWNrKHYpKSB7Ci0JICAgICAgICAvKiBXZSB1c2UgdGhlIENGIHR5cGVzIGhlcmUsIGlmIFB5dGhvbiB3YXMgY29uZmlndXJlZCBkaWZmZXJlbnRseSB0aGF0IHdpbGwgZ2l2ZSBhbiBlcnJvciAqLwotCSAgICAgICAgQ0ZJbmRleCBzaXplID0gUHlVbmljb2RlX0dldFNpemUodik7Ci0JICAgICAgICBVbmlDaGFyICp1bmljaGFycyA9IFB5VW5pY29kZV9Bc1VuaWNvZGUodik7Ci0JICAgICAgICBpZiAoIXVuaWNoYXJzKSByZXR1cm4gMDsKLQkgICAgICAgICpwX2l0c2VsZiA9IENGU3RyaW5nQ3JlYXRlV2l0aENoYXJhY3RlcnMoKENGQWxsb2NhdG9yUmVmKU5VTEwsIHVuaWNoYXJzLCBzaXplKTsKLQkgICAgICAgIHJldHVybiAxOwotCX0KKyAgICBpZiAodiA9PSBQeV9Ob25lKSB7ICpwX2l0c2VsZiA9IE5VTEw7IHJldHVybiAxOyB9CisgICAgaWYgKFB5U3RyaW5nX0NoZWNrKHYpKSB7CisgICAgICAgIGNoYXIgKmNTdHI7CisgICAgICAgIGlmICghUHlBcmdfUGFyc2UodiwgImVzIiwgImFzY2lpIiwgJmNTdHIpKQorICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgKnBfaXRzZWxmID0gQ0ZTdHJpbmdDcmVhdGVXaXRoQ1N0cmluZygoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwgY1N0ciwga0NGU3RyaW5nRW5jb2RpbmdBU0NJSSk7CisgICAgICAgIFB5TWVtX0ZyZWUoY1N0cik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAoUHlVbmljb2RlX0NoZWNrKHYpKSB7CisgICAgICAgIC8qIFdlIHVzZSB0aGUgQ0YgdHlwZXMgaGVyZSwgaWYgUHl0aG9uIHdhcyBjb25maWd1cmVkIGRpZmZlcmVudGx5IHRoYXQgd2lsbCBnaXZlIGFuIGVycm9yICovCisgICAgICAgIENGSW5kZXggc2l6ZSA9IFB5VW5pY29kZV9HZXRTaXplKHYpOworICAgICAgICBVbmlDaGFyICp1bmljaGFycyA9IFB5VW5pY29kZV9Bc1VuaWNvZGUodik7CisgICAgICAgIGlmICghdW5pY2hhcnMpIHJldHVybiAwOworICAgICAgICAqcF9pdHNlbGYgPSBDRlN0cmluZ0NyZWF0ZVdpdGhDaGFyYWN0ZXJzKChDRkFsbG9jYXRvclJlZilOVUxMLCB1bmljaGFycywgc2l6ZSk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KIAogCi0JaWYgKCFDRlN0cmluZ1JlZk9ial9DaGVjayh2KSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJDRlN0cmluZ1JlZiByZXF1aXJlZCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JKnBfaXRzZWxmID0gKChDRlN0cmluZ1JlZk9iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0JcmV0dXJuIDE7CisgICAgaWYgKCFDRlN0cmluZ1JlZk9ial9DaGVjayh2KSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJDRlN0cmluZ1JlZiByZXF1aXJlZCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgKnBfaXRzZWxmID0gKChDRlN0cmluZ1JlZk9iamVjdCAqKXYpLT5vYl9pdHNlbGY7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyB2b2lkIENGU3RyaW5nUmVmT2JqX2RlYWxsb2MoQ0ZTdHJpbmdSZWZPYmplY3QgKnNlbGYpCiB7Ci0JaWYgKHNlbGYtPm9iX2ZyZWVpdCAmJiBzZWxmLT5vYl9pdHNlbGYpCi0JewotCQlzZWxmLT5vYl9mcmVlaXQoKENGVHlwZVJlZilzZWxmLT5vYl9pdHNlbGYpOwotCQlzZWxmLT5vYl9pdHNlbGYgPSBOVUxMOwotCX0KLQlDRlR5cGVSZWZfVHlwZS50cF9kZWFsbG9jKChQeU9iamVjdCAqKXNlbGYpOworICAgIGlmIChzZWxmLT5vYl9mcmVlaXQgJiYgc2VsZi0+b2JfaXRzZWxmKQorICAgIHsKKyAgICAgICAgc2VsZi0+b2JfZnJlZWl0KChDRlR5cGVSZWYpc2VsZi0+b2JfaXRzZWxmKTsKKyAgICAgICAgc2VsZi0+b2JfaXRzZWxmID0gTlVMTDsKKyAgICB9CisgICAgQ0ZUeXBlUmVmX1R5cGUudHBfZGVhbGxvYygoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRlN0cmluZ1JlZk9ial9DRlN0cmluZ0NyZWF0ZVdpdGhTdWJzdHJpbmcoQ0ZTdHJpbmdSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGU3RyaW5nUmVmIF9ydjsKLQlDRlJhbmdlIHJhbmdlOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZSYW5nZV9Db252ZXJ0LCAmcmFuZ2UpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRlN0cmluZ0NyZWF0ZVdpdGhTdWJzdHJpbmcoKENGQWxsb2NhdG9yUmVmKU5VTEwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZTdHJpbmdSZWYgX3J2OworICAgIENGUmFuZ2UgcmFuZ2U7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlJhbmdlX0NvbnZlcnQsICZyYW5nZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGU3RyaW5nQ3JlYXRlV2l0aFN1YnN0cmluZygoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nQ3JlYXRlQ29weShDRlN0cmluZ1JlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZTdHJpbmdSZWYgX3J2OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRlN0cmluZ0NyZWF0ZUNvcHkoKENGQWxsb2NhdG9yUmVmKU5VTEwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlN0cmluZ1JlZiBfcnY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGU3RyaW5nQ3JlYXRlQ29weSgoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdHZXRMZW5ndGgoQ0ZTdHJpbmdSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGSW5kZXggX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRkluZGV4IF9ydjsKICNpZm5kZWYgQ0ZTdHJpbmdHZXRMZW5ndGgKLQlQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0dldExlbmd0aCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdHZXRMZW5ndGgpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGU3RyaW5nR2V0TGVuZ3RoKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlN0cmluZ0dldExlbmd0aChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRlN0cmluZ1JlZk9ial9DRlN0cmluZ0dldEJ5dGVzKENGU3RyaW5nUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRkluZGV4IF9ydjsKLQlDRlJhbmdlIHJhbmdlOwotCUNGU3RyaW5nRW5jb2RpbmcgZW5jb2Rpbmc7Ci0JVUludDggbG9zc0J5dGU7Ci0JQm9vbGVhbiBpc0V4dGVybmFsUmVwcmVzZW50YXRpb247Ci0JVUludDggYnVmZmVyOwotCUNGSW5kZXggbWF4QnVmTGVuOwotCUNGSW5kZXggdXNlZEJ1ZkxlbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZJbmRleCBfcnY7CisgICAgQ0ZSYW5nZSByYW5nZTsKKyAgICBDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nOworICAgIFVJbnQ4IGxvc3NCeXRlOworICAgIEJvb2xlYW4gaXNFeHRlcm5hbFJlcHJlc2VudGF0aW9uOworICAgIFVJbnQ4IGJ1ZmZlcjsKKyAgICBDRkluZGV4IG1heEJ1ZkxlbjsKKyAgICBDRkluZGV4IHVzZWRCdWZMZW47CiAjaWZuZGVmIENGU3RyaW5nR2V0Qnl0ZXMKLQlQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0dldEJ5dGVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0dldEJ5dGVzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGUmFuZ2VfQ29udmVydCwgJnJhbmdlLAotCSAgICAgICAgICAgICAgICAgICAgICAmZW5jb2RpbmcsCi0JICAgICAgICAgICAgICAgICAgICAgICZsb3NzQnl0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlzRXh0ZXJuYWxSZXByZXNlbnRhdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1heEJ1ZkxlbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGU3RyaW5nR2V0Qnl0ZXMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLAotCSAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcsCi0JICAgICAgICAgICAgICAgICAgICAgICBsb3NzQnl0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgIGlzRXh0ZXJuYWxSZXByZXNlbnRhdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICZidWZmZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICBtYXhCdWZMZW4sCi0JICAgICAgICAgICAgICAgICAgICAgICAmdXNlZEJ1Zkxlbik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKLQkgICAgICAgICAgICAgICAgICAgICB1c2VkQnVmTGVuKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlJhbmdlX0NvbnZlcnQsICZyYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmVuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbG9zc0J5dGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpc0V4dGVybmFsUmVwcmVzZW50YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXhCdWZMZW4pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlN0cmluZ0dldEJ5dGVzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9zc0J5dGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0V4dGVybmFsUmVwcmVzZW50YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4QnVmTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVzZWRCdWZMZW4pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsYmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZEJ1Zkxlbik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdDcmVhdGVFeHRlcm5hbFJlcHJlc2VudGF0aW9uKENGU3RyaW5nUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRkRhdGFSZWYgX3J2OwotCUNGU3RyaW5nRW5jb2RpbmcgZW5jb2Rpbmc7Ci0JVUludDggbG9zc0J5dGU7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZW5jb2RpbmcsCi0JICAgICAgICAgICAgICAgICAgICAgICZsb3NzQnl0ZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGU3RyaW5nQ3JlYXRlRXh0ZXJuYWxSZXByZXNlbnRhdGlvbigoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvc3NCeXRlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGRGF0YVJlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGRGF0YVJlZiBfcnY7CisgICAgQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZzsKKyAgICBVSW50OCBsb3NzQnl0ZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmxvc3NCeXRlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZTdHJpbmdDcmVhdGVFeHRlcm5hbFJlcHJlc2VudGF0aW9uKChDRkFsbG9jYXRvclJlZilOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9zc0J5dGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZEYXRhUmVmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRlN0cmluZ1JlZk9ial9DRlN0cmluZ0dldFNtYWxsZXN0RW5jb2RpbmcoQ0ZTdHJpbmdSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGU3RyaW5nRW5jb2RpbmcgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlN0cmluZ0VuY29kaW5nIF9ydjsKICNpZm5kZWYgQ0ZTdHJpbmdHZXRTbWFsbGVzdEVuY29kaW5nCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdHZXRTbWFsbGVzdEVuY29kaW5nKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0dldFNtYWxsZXN0RW5jb2RpbmcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGU3RyaW5nR2V0U21hbGxlc3RFbmNvZGluZyhfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZTdHJpbmdHZXRTbWFsbGVzdEVuY29kaW5nKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nR2V0RmFzdGVzdEVuY29kaW5nKENGU3RyaW5nUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ0VuY29kaW5nIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZTdHJpbmdFbmNvZGluZyBfcnY7CiAjaWZuZGVmIENGU3RyaW5nR2V0RmFzdGVzdEVuY29kaW5nCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdHZXRGYXN0ZXN0RW5jb2RpbmcpOworICAgIFB5TWFjX1BSRUNIRUNLKENGU3RyaW5nR2V0RmFzdGVzdEVuY29kaW5nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRlN0cmluZ0dldEZhc3Rlc3RFbmNvZGluZyhfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZTdHJpbmdHZXRGYXN0ZXN0RW5jb2RpbmcoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdDb21wYXJlV2l0aE9wdGlvbnMoQ0ZTdHJpbmdSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGQ29tcGFyaXNvblJlc3VsdCBfcnY7Ci0JQ0ZTdHJpbmdSZWYgdGhlU3RyaW5nMjsKLQlDRlJhbmdlIHJhbmdlVG9Db21wYXJlOwotCUNGT3B0aW9uRmxhZ3MgY29tcGFyZU9wdGlvbnM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGQ29tcGFyaXNvblJlc3VsdCBfcnY7CisgICAgQ0ZTdHJpbmdSZWYgdGhlU3RyaW5nMjsKKyAgICBDRlJhbmdlIHJhbmdlVG9Db21wYXJlOworICAgIENGT3B0aW9uRmxhZ3MgY29tcGFyZU9wdGlvbnM7CiAjaWZuZGVmIENGU3RyaW5nQ29tcGFyZVdpdGhPcHRpb25zCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdDb21wYXJlV2l0aE9wdGlvbnMpOworICAgIFB5TWFjX1BSRUNIRUNLKENGU3RyaW5nQ29tcGFyZVdpdGhPcHRpb25zKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnRoZVN0cmluZzIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGUmFuZ2VfQ29udmVydCwgJnJhbmdlVG9Db21wYXJlLAotCSAgICAgICAgICAgICAgICAgICAgICAmY29tcGFyZU9wdGlvbnMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRlN0cmluZ0NvbXBhcmVXaXRoT3B0aW9ucyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZVN0cmluZzIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2VUb0NvbXBhcmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyZU9wdGlvbnMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnRoZVN0cmluZzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGUmFuZ2VfQ29udmVydCwgJnJhbmdlVG9Db21wYXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY29tcGFyZU9wdGlvbnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlN0cmluZ0NvbXBhcmVXaXRoT3B0aW9ucyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZVN0cmluZzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2VUb0NvbXBhcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyZU9wdGlvbnMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nQ29tcGFyZShDRlN0cmluZ1JlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZDb21wYXJpc29uUmVzdWx0IF9ydjsKLQlDRlN0cmluZ1JlZiB0aGVTdHJpbmcyOwotCUNGT3B0aW9uRmxhZ3MgY29tcGFyZU9wdGlvbnM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGQ29tcGFyaXNvblJlc3VsdCBfcnY7CisgICAgQ0ZTdHJpbmdSZWYgdGhlU3RyaW5nMjsKKyAgICBDRk9wdGlvbkZsYWdzIGNvbXBhcmVPcHRpb25zOwogI2lmbmRlZiBDRlN0cmluZ0NvbXBhcmUKLQlQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0NvbXBhcmUpOworICAgIFB5TWFjX1BSRUNIRUNLKENGU3RyaW5nQ29tcGFyZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdGhlU3RyaW5nMiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNvbXBhcmVPcHRpb25zKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZTdHJpbmdDb21wYXJlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgIHRoZVN0cmluZzIsCi0JICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmVPcHRpb25zKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdGhlU3RyaW5nMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbXBhcmVPcHRpb25zKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZTdHJpbmdDb21wYXJlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZVN0cmluZzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmVPcHRpb25zKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRlN0cmluZ1JlZk9ial9DRlN0cmluZ0ZpbmRXaXRoT3B0aW9ucyhDRlN0cmluZ1JlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JQ0ZTdHJpbmdSZWYgc3RyaW5nVG9GaW5kOwotCUNGUmFuZ2UgcmFuZ2VUb1NlYXJjaDsKLQlDRk9wdGlvbkZsYWdzIHNlYXJjaE9wdGlvbnM7Ci0JQ0ZSYW5nZSByZXN1bHQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIENGU3RyaW5nUmVmIHN0cmluZ1RvRmluZDsKKyAgICBDRlJhbmdlIHJhbmdlVG9TZWFyY2g7CisgICAgQ0ZPcHRpb25GbGFncyBzZWFyY2hPcHRpb25zOworICAgIENGUmFuZ2UgcmVzdWx0OwogI2lmbmRlZiBDRlN0cmluZ0ZpbmRXaXRoT3B0aW9ucwotCVB5TWFjX1BSRUNIRUNLKENGU3RyaW5nRmluZFdpdGhPcHRpb25zKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0ZpbmRXaXRoT3B0aW9ucyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZzdHJpbmdUb0ZpbmQsCi0JICAgICAgICAgICAgICAgICAgICAgIENGUmFuZ2VfQ29udmVydCwgJnJhbmdlVG9TZWFyY2gsCi0JICAgICAgICAgICAgICAgICAgICAgICZzZWFyY2hPcHRpb25zKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZTdHJpbmdGaW5kV2l0aE9wdGlvbnMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb0ZpbmQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2VUb1NlYXJjaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hPcHRpb25zLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlJhbmdlX05ldywgcmVzdWx0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZzdHJpbmdUb0ZpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGUmFuZ2VfQ29udmVydCwgJnJhbmdlVG9TZWFyY2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzZWFyY2hPcHRpb25zKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZTdHJpbmdGaW5kV2l0aE9wdGlvbnMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb0ZpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2VUb1NlYXJjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hPcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlJhbmdlX05ldywgcmVzdWx0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRlN0cmluZ1JlZk9ial9DRlN0cmluZ0NyZWF0ZUFycmF5V2l0aEZpbmRSZXN1bHRzKENGU3RyaW5nUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRkFycmF5UmVmIF9ydjsKLQlDRlN0cmluZ1JlZiBzdHJpbmdUb0ZpbmQ7Ci0JQ0ZSYW5nZSByYW5nZVRvU2VhcmNoOwotCUNGT3B0aW9uRmxhZ3MgY29tcGFyZU9wdGlvbnM7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmc3RyaW5nVG9GaW5kLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlJhbmdlX0NvbnZlcnQsICZyYW5nZVRvU2VhcmNoLAotCSAgICAgICAgICAgICAgICAgICAgICAmY29tcGFyZU9wdGlvbnMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRlN0cmluZ0NyZWF0ZUFycmF5V2l0aEZpbmRSZXN1bHRzKChDRkFsbG9jYXRvclJlZilOVUxMLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvRmluZCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlVG9TZWFyY2gsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlT3B0aW9ucyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRkFycmF5UmVmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZBcnJheVJlZiBfcnY7CisgICAgQ0ZTdHJpbmdSZWYgc3RyaW5nVG9GaW5kOworICAgIENGUmFuZ2UgcmFuZ2VUb1NlYXJjaDsKKyAgICBDRk9wdGlvbkZsYWdzIGNvbXBhcmVPcHRpb25zOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnN0cmluZ1RvRmluZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZSYW5nZV9Db252ZXJ0LCAmcmFuZ2VUb1NlYXJjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbXBhcmVPcHRpb25zKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZTdHJpbmdDcmVhdGVBcnJheVdpdGhGaW5kUmVzdWx0cygoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb0ZpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZVRvU2VhcmNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyZU9wdGlvbnMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZBcnJheVJlZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdGaW5kKENGU3RyaW5nUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlJhbmdlIF9ydjsKLQlDRlN0cmluZ1JlZiBzdHJpbmdUb0ZpbmQ7Ci0JQ0ZPcHRpb25GbGFncyBjb21wYXJlT3B0aW9uczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZSYW5nZSBfcnY7CisgICAgQ0ZTdHJpbmdSZWYgc3RyaW5nVG9GaW5kOworICAgIENGT3B0aW9uRmxhZ3MgY29tcGFyZU9wdGlvbnM7CiAjaWZuZGVmIENGU3RyaW5nRmluZAotCVB5TWFjX1BSRUNIRUNLKENGU3RyaW5nRmluZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdGaW5kKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZzdHJpbmdUb0ZpbmQsCi0JICAgICAgICAgICAgICAgICAgICAgICZjb21wYXJlT3B0aW9ucykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGU3RyaW5nRmluZChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICBzdHJpbmdUb0ZpbmQsCi0JICAgICAgICAgICAgICAgICAgIGNvbXBhcmVPcHRpb25zKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGUmFuZ2VfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZzdHJpbmdUb0ZpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjb21wYXJlT3B0aW9ucykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGU3RyaW5nRmluZChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb0ZpbmQsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmVPcHRpb25zKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGUmFuZ2VfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nSGFzUHJlZml4KENGU3RyaW5nUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlDRlN0cmluZ1JlZiBwcmVmaXg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIENGU3RyaW5nUmVmIHByZWZpeDsKICNpZm5kZWYgQ0ZTdHJpbmdIYXNQcmVmaXgKLQlQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0hhc1ByZWZpeCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdIYXNQcmVmaXgpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmcHJlZml4KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZTdHJpbmdIYXNQcmVmaXgoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnByZWZpeCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGU3RyaW5nSGFzUHJlZml4KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRlN0cmluZ1JlZk9ial9DRlN0cmluZ0hhc1N1ZmZpeChDRlN0cmluZ1JlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JQ0ZTdHJpbmdSZWYgc3VmZml4OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBDRlN0cmluZ1JlZiBzdWZmaXg7CiAjaWZuZGVmIENGU3RyaW5nSGFzU3VmZml4Ci0JUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdIYXNTdWZmaXgpOworICAgIFB5TWFjX1BSRUNIRUNLKENGU3RyaW5nSGFzU3VmZml4KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnN1ZmZpeCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGU3RyaW5nSGFzU3VmZml4KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgc3VmZml4KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZzdWZmaXgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlN0cmluZ0hhc1N1ZmZpeChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1ZmZpeCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdHZXRMaW5lQm91bmRzKENGU3RyaW5nUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlJhbmdlIHJhbmdlOwotCUNGSW5kZXggbGluZUJlZ2luSW5kZXg7Ci0JQ0ZJbmRleCBsaW5lRW5kSW5kZXg7Ci0JQ0ZJbmRleCBjb250ZW50c0VuZEluZGV4OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlJhbmdlIHJhbmdlOworICAgIENGSW5kZXggbGluZUJlZ2luSW5kZXg7CisgICAgQ0ZJbmRleCBsaW5lRW5kSW5kZXg7CisgICAgQ0ZJbmRleCBjb250ZW50c0VuZEluZGV4OwogI2lmbmRlZiBDRlN0cmluZ0dldExpbmVCb3VuZHMKLQlQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0dldExpbmVCb3VuZHMpOworICAgIFB5TWFjX1BSRUNIRUNLKENGU3RyaW5nR2V0TGluZUJvdW5kcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGUmFuZ2VfQ29udmVydCwgJnJhbmdlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0ZTdHJpbmdHZXRMaW5lQm91bmRzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLAotCSAgICAgICAgICAgICAgICAgICAgICAmbGluZUJlZ2luSW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgICZsaW5lRW5kSW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgICZjb250ZW50c0VuZEluZGV4KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBsaW5lQmVnaW5JbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICBsaW5lRW5kSW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgY29udGVudHNFbmRJbmRleCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlJhbmdlX0NvbnZlcnQsICZyYW5nZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENGU3RyaW5nR2V0TGluZUJvdW5kcyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmxpbmVCZWdpbkluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbGluZUVuZEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY29udGVudHNFbmRJbmRleCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgbGluZUJlZ2luSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgbGluZUVuZEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRzRW5kSW5kZXgpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nQ3JlYXRlQXJyYXlCeVNlcGFyYXRpbmdTdHJpbmdzKENGU3RyaW5nUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRkFycmF5UmVmIF9ydjsKLQlDRlN0cmluZ1JlZiBzZXBhcmF0b3JTdHJpbmc7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmc2VwYXJhdG9yU3RyaW5nKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZTdHJpbmdDcmVhdGVBcnJheUJ5U2VwYXJhdGluZ1N0cmluZ3MoKENGQWxsb2NhdG9yUmVmKU5VTEwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXBhcmF0b3JTdHJpbmcpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZBcnJheVJlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGQXJyYXlSZWYgX3J2OworICAgIENGU3RyaW5nUmVmIHNlcGFyYXRvclN0cmluZzsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZzZXBhcmF0b3JTdHJpbmcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlN0cmluZ0NyZWF0ZUFycmF5QnlTZXBhcmF0aW5nU3RyaW5ncygoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcGFyYXRvclN0cmluZyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRkFycmF5UmVmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRlN0cmluZ1JlZk9ial9DRlN0cmluZ0dldEludFZhbHVlKENGU3RyaW5nUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTSW50MzIgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTSW50MzIgX3J2OwogI2lmbmRlZiBDRlN0cmluZ0dldEludFZhbHVlCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdHZXRJbnRWYWx1ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdHZXRJbnRWYWx1ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZTdHJpbmdHZXRJbnRWYWx1ZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZTdHJpbmdHZXRJbnRWYWx1ZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRlN0cmluZ1JlZk9ial9DRlN0cmluZ0dldERvdWJsZVZhbHVlKENGU3RyaW5nUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlkb3VibGUgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBkb3VibGUgX3J2OwogI2lmbmRlZiBDRlN0cmluZ0dldERvdWJsZVZhbHVlCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdHZXREb3VibGVWYWx1ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdHZXREb3VibGVWYWx1ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZTdHJpbmdHZXREb3VibGVWYWx1ZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiZCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZTdHJpbmdHZXREb3VibGVWYWx1ZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRlN0cmluZ1JlZk9ial9DRlN0cmluZ0NvbnZlcnRJQU5BQ2hhclNldE5hbWVUb0VuY29kaW5nKENGU3RyaW5nUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ0VuY29kaW5nIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZTdHJpbmdFbmNvZGluZyBfcnY7CiAjaWZuZGVmIENGU3RyaW5nQ29udmVydElBTkFDaGFyU2V0TmFtZVRvRW5jb2RpbmcKLQlQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0NvbnZlcnRJQU5BQ2hhclNldE5hbWVUb0VuY29kaW5nKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0NvbnZlcnRJQU5BQ2hhclNldE5hbWVUb0VuY29kaW5nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRlN0cmluZ0NvbnZlcnRJQU5BQ2hhclNldE5hbWVUb0VuY29kaW5nKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlN0cmluZ0NvbnZlcnRJQU5BQ2hhclNldE5hbWVUb0VuY29kaW5nKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGU3RyaW5nUmVmT2JqX0NGU2hvd1N0cihDRlN0cmluZ1JlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBDRlNob3dTdHIKLQlQeU1hY19QUkVDSEVDSyhDRlNob3dTdHIpOworICAgIFB5TWFjX1BSRUNIRUNLKENGU2hvd1N0cik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0ZTaG93U3RyKF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0ZTaG93U3RyKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRlN0cmluZ1JlZk9ial9DRlVSTENyZWF0ZVdpdGhTdHJpbmcoQ0ZTdHJpbmdSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGVVJMUmVmIF9ydjsKLQlDRlVSTFJlZiBiYXNlVVJMOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWxDRlVSTFJlZk9ial9Db252ZXJ0LCAmYmFzZVVSTCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGVVJMQ3JlYXRlV2l0aFN0cmluZygoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZVVSTCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlVSTFJlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGVVJMUmVmIF9ydjsKKyAgICBDRlVSTFJlZiBiYXNlVVJMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWxDRlVSTFJlZk9ial9Db252ZXJ0LCAmYmFzZVVSTCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGVVJMQ3JlYXRlV2l0aFN0cmluZygoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZVVSTCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlVSTFJlZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZTdHJpbmdSZWZPYmpfQ0ZVUkxDcmVhdGVXaXRoRmlsZVN5c3RlbVBhdGgoQ0ZTdHJpbmdSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGVVJMUmVmIF9ydjsKLQlDRlVSTFBhdGhTdHlsZSBwYXRoU3R5bGU7Ci0JQm9vbGVhbiBpc0RpcmVjdG9yeTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZwYXRoU3R5bGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZpc0RpcmVjdG9yeSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGVVJMQ3JlYXRlV2l0aEZpbGVTeXN0ZW1QYXRoKChDRkFsbG9jYXRvclJlZilOVUxMLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aFN0eWxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRGlyZWN0b3J5KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGVVJMUmVmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZVUkxSZWYgX3J2OworICAgIENGVVJMUGF0aFN0eWxlIHBhdGhTdHlsZTsKKyAgICBCb29sZWFuIGlzRGlyZWN0b3J5OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhdGhTdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlzRGlyZWN0b3J5KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZVUkxDcmVhdGVXaXRoRmlsZVN5c3RlbVBhdGgoKENGQWxsb2NhdG9yUmVmKU5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoU3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNEaXJlY3RvcnkpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZVUkxSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGU3RyaW5nUmVmT2JqX0NGVVJMQ3JlYXRlV2l0aEZpbGVTeXN0ZW1QYXRoUmVsYXRpdmVUb0Jhc2UoQ0ZTdHJpbmdSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGVVJMUmVmIF9ydjsKLQlDRlVSTFBhdGhTdHlsZSBwYXRoU3R5bGU7Ci0JQm9vbGVhbiBpc0RpcmVjdG9yeTsKLQlDRlVSTFJlZiBiYXNlVVJMOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcGF0aFN0eWxlLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXNEaXJlY3RvcnksCi0JICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsQ0ZVUkxSZWZPYmpfQ29udmVydCwgJmJhc2VVUkwpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRlVSTENyZWF0ZVdpdGhGaWxlU3lzdGVtUGF0aFJlbGF0aXZlVG9CYXNlKChDRkFsbG9jYXRvclJlZilOVUxMLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhTdHlsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRGlyZWN0b3J5LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZVVSTCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlVSTFJlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGVVJMUmVmIF9ydjsKKyAgICBDRlVSTFBhdGhTdHlsZSBwYXRoU3R5bGU7CisgICAgQm9vbGVhbiBpc0RpcmVjdG9yeTsKKyAgICBDRlVSTFJlZiBiYXNlVVJMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGF0aFN0eWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXNEaXJlY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsQ0ZVUkxSZWZPYmpfQ29udmVydCwgJmJhc2VVUkwpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlVSTENyZWF0ZVdpdGhGaWxlU3lzdGVtUGF0aFJlbGF0aXZlVG9CYXNlKChDRkFsbG9jYXRvclJlZilOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhTdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRGlyZWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZVVSTCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlVSTFJlZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZTdHJpbmdSZWZPYmpfQ0ZVUkxDcmVhdGVTdHJpbmdCeVJlcGxhY2luZ1BlcmNlbnRFc2NhcGVzKENGU3RyaW5nUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ1JlZiBfcnY7Ci0JQ0ZTdHJpbmdSZWYgY2hhcmFjdGVyc1RvTGVhdmVFc2NhcGVkOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmNoYXJhY3RlcnNUb0xlYXZlRXNjYXBlZCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGVVJMQ3JlYXRlU3RyaW5nQnlSZXBsYWNpbmdQZXJjZW50RXNjYXBlcygoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyc1RvTGVhdmVFc2NhcGVkKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZTdHJpbmdSZWYgX3J2OworICAgIENGU3RyaW5nUmVmIGNoYXJhY3RlcnNUb0xlYXZlRXNjYXBlZDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZjaGFyYWN0ZXJzVG9MZWF2ZUVzY2FwZWQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlVSTENyZWF0ZVN0cmluZ0J5UmVwbGFjaW5nUGVyY2VudEVzY2FwZXMoKENGQWxsb2NhdG9yUmVmKU5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlcnNUb0xlYXZlRXNjYXBlZCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZTdHJpbmdSZWZPYmpfQ0ZVUkxDcmVhdGVTdHJpbmdCeUFkZGluZ1BlcmNlbnRFc2NhcGVzKENGU3RyaW5nUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ1JlZiBfcnY7Ci0JQ0ZTdHJpbmdSZWYgY2hhcmFjdGVyc1RvTGVhdmVVbmVzY2FwZWQ7Ci0JQ0ZTdHJpbmdSZWYgbGVnYWxVUkxDaGFyYWN0ZXJzVG9CZUVzY2FwZWQ7Ci0JQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZzsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZjaGFyYWN0ZXJzVG9MZWF2ZVVuZXNjYXBlZCwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmxlZ2FsVVJMQ2hhcmFjdGVyc1RvQmVFc2NhcGVkLAotCSAgICAgICAgICAgICAgICAgICAgICAmZW5jb2RpbmcpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRlVSTENyZWF0ZVN0cmluZ0J5QWRkaW5nUGVyY2VudEVzY2FwZXMoKENGQWxsb2NhdG9yUmVmKU5VTEwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlcnNUb0xlYXZlVW5lc2NhcGVkLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdhbFVSTENoYXJhY3RlcnNUb0JlRXNjYXBlZCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlN0cmluZ1JlZiBfcnY7CisgICAgQ0ZTdHJpbmdSZWYgY2hhcmFjdGVyc1RvTGVhdmVVbmVzY2FwZWQ7CisgICAgQ0ZTdHJpbmdSZWYgbGVnYWxVUkxDaGFyYWN0ZXJzVG9CZUVzY2FwZWQ7CisgICAgQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZzsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZjaGFyYWN0ZXJzVG9MZWF2ZVVuZXNjYXBlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmxlZ2FsVVJMQ2hhcmFjdGVyc1RvQmVFc2NhcGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5jb2RpbmcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlVSTENyZWF0ZVN0cmluZ0J5QWRkaW5nUGVyY2VudEVzY2FwZXMoKENGQWxsb2NhdG9yUmVmKU5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlcnNUb0xlYXZlVW5lc2NhcGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdhbFVSTENoYXJhY3RlcnNUb0JlRXNjYXBlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nR2V0U3RyaW5nKENGU3RyaW5nUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAKLQlpbnQgc2l6ZSA9IENGU3RyaW5nR2V0TGVuZ3RoKF9zZWxmLT5vYl9pdHNlbGYpKzE7Ci0JY2hhciAqZGF0YSA9IG1hbGxvYyhzaXplKTsKKyAgICBpbnQgc2l6ZSA9IENGU3RyaW5nR2V0TGVuZ3RoKF9zZWxmLT5vYl9pdHNlbGYpKzE7CisgICAgY2hhciAqZGF0YSA9IG1hbGxvYyhzaXplKTsKIAotCWlmKCBkYXRhID09IE5VTEwgKSByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQlpZiAoIENGU3RyaW5nR2V0Q1N0cmluZyhfc2VsZi0+b2JfaXRzZWxmLCBkYXRhLCBzaXplLCAwKSApIHsKLQkgICAgICAgIF9yZXMgPSAoUHlPYmplY3QgKilQeVN0cmluZ19Gcm9tU3RyaW5nKGRhdGEpOwotCX0gZWxzZSB7Ci0JICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAiQ0ZTdHJpbmdHZXRDU3RyaW5nIGNvdWxkIG5vdCBmaXQgdGhlIHN0cmluZyIpOwotCSAgICAgICAgX3JlcyA9IE5VTEw7Ci0JfQotCWZyZWUoZGF0YSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYoIGRhdGEgPT0gTlVMTCApIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIGlmICggQ0ZTdHJpbmdHZXRDU3RyaW5nKF9zZWxmLT5vYl9pdHNlbGYsIGRhdGEsIHNpemUsIDApICkgeworICAgICAgICBfcmVzID0gKFB5T2JqZWN0ICopUHlTdHJpbmdfRnJvbVN0cmluZyhkYXRhKTsKKyAgICB9IGVsc2UgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAiQ0ZTdHJpbmdHZXRDU3RyaW5nIGNvdWxkIG5vdCBmaXQgdGhlIHN0cmluZyIpOworICAgICAgICBfcmVzID0gTlVMTDsKKyAgICB9CisgICAgZnJlZShkYXRhKTsKKyAgICByZXR1cm4gX3JlczsKIAogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nR2V0VW5pY29kZShDRlN0cmluZ1JlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogCi0JaW50IHNpemUgPSBDRlN0cmluZ0dldExlbmd0aChfc2VsZi0+b2JfaXRzZWxmKSsxOwotCVB5X1VOSUNPREUgKmRhdGEgPSBtYWxsb2Moc2l6ZSpzaXplb2YoUHlfVU5JQ09ERSkpOwotCUNGUmFuZ2UgcmFuZ2U7CisgICAgaW50IHNpemUgPSBDRlN0cmluZ0dldExlbmd0aChfc2VsZi0+b2JfaXRzZWxmKSsxOworICAgIFB5X1VOSUNPREUgKmRhdGEgPSBtYWxsb2Moc2l6ZSpzaXplb2YoUHlfVU5JQ09ERSkpOworICAgIENGUmFuZ2UgcmFuZ2U7CiAKLQlyYW5nZS5sb2NhdGlvbiA9IDA7Ci0JcmFuZ2UubGVuZ3RoID0gc2l6ZTsKLQlpZiggZGF0YSA9PSBOVUxMICkgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JQ0ZTdHJpbmdHZXRDaGFyYWN0ZXJzKF9zZWxmLT5vYl9pdHNlbGYsIHJhbmdlLCBkYXRhKTsKLQlfcmVzID0gKFB5T2JqZWN0ICopUHlVbmljb2RlX0Zyb21Vbmljb2RlKGRhdGEsIHNpemUtMSk7Ci0JZnJlZShkYXRhKTsKLQlyZXR1cm4gX3JlczsKKyAgICByYW5nZS5sb2NhdGlvbiA9IDA7CisgICAgcmFuZ2UubGVuZ3RoID0gc2l6ZTsKKyAgICBpZiggZGF0YSA9PSBOVUxMICkgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgQ0ZTdHJpbmdHZXRDaGFyYWN0ZXJzKF9zZWxmLT5vYl9pdHNlbGYsIHJhbmdlLCBkYXRhKTsKKyAgICBfcmVzID0gKFB5T2JqZWN0ICopUHlVbmljb2RlX0Zyb21Vbmljb2RlKGRhdGEsIHNpemUtMSk7CisgICAgZnJlZShkYXRhKTsKKyAgICByZXR1cm4gX3JlczsKIAogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgQ0ZTdHJpbmdSZWZPYmpfbWV0aG9kc1tdID0gewotCXsiQ0ZTdHJpbmdDcmVhdGVXaXRoU3Vic3RyaW5nIiwgKFB5Q0Z1bmN0aW9uKUNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nQ3JlYXRlV2l0aFN1YnN0cmluZywgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZSYW5nZSByYW5nZSkgLT4gKENGU3RyaW5nUmVmIF9ydikiKX0sCi0JeyJDRlN0cmluZ0NyZWF0ZUNvcHkiLCAoUHlDRnVuY3Rpb24pQ0ZTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdDcmVhdGVDb3B5LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDRlN0cmluZ1JlZiBfcnYpIil9LAotCXsiQ0ZTdHJpbmdHZXRMZW5ndGgiLCAoUHlDRnVuY3Rpb24pQ0ZTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdHZXRMZW5ndGgsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENGSW5kZXggX3J2KSIpfSwKLQl7IkNGU3RyaW5nR2V0Qnl0ZXMiLCAoUHlDRnVuY3Rpb24pQ0ZTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdHZXRCeXRlcywgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZSYW5nZSByYW5nZSwgQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZywgVUludDggbG9zc0J5dGUsIEJvb2xlYW4gaXNFeHRlcm5hbFJlcHJlc2VudGF0aW9uLCBDRkluZGV4IG1heEJ1ZkxlbikgLT4gKENGSW5kZXggX3J2LCBVSW50OCBidWZmZXIsIENGSW5kZXggdXNlZEJ1ZkxlbikiKX0sCi0JeyJDRlN0cmluZ0NyZWF0ZUV4dGVybmFsUmVwcmVzZW50YXRpb24iLCAoUHlDRnVuY3Rpb24pQ0ZTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdDcmVhdGVFeHRlcm5hbFJlcHJlc2VudGF0aW9uLCAxLAotCSBQeURvY19TVFIoIihDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nLCBVSW50OCBsb3NzQnl0ZSkgLT4gKENGRGF0YVJlZiBfcnYpIil9LAotCXsiQ0ZTdHJpbmdHZXRTbWFsbGVzdEVuY29kaW5nIiwgKFB5Q0Z1bmN0aW9uKUNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nR2V0U21hbGxlc3RFbmNvZGluZywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZTdHJpbmdFbmNvZGluZyBfcnYpIil9LAotCXsiQ0ZTdHJpbmdHZXRGYXN0ZXN0RW5jb2RpbmciLCAoUHlDRnVuY3Rpb24pQ0ZTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdHZXRGYXN0ZXN0RW5jb2RpbmcsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENGU3RyaW5nRW5jb2RpbmcgX3J2KSIpfSwKLQl7IkNGU3RyaW5nQ29tcGFyZVdpdGhPcHRpb25zIiwgKFB5Q0Z1bmN0aW9uKUNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nQ29tcGFyZVdpdGhPcHRpb25zLCAxLAotCSBQeURvY19TVFIoIihDRlN0cmluZ1JlZiB0aGVTdHJpbmcyLCBDRlJhbmdlIHJhbmdlVG9Db21wYXJlLCBDRk9wdGlvbkZsYWdzIGNvbXBhcmVPcHRpb25zKSAtPiAoQ0ZDb21wYXJpc29uUmVzdWx0IF9ydikiKX0sCi0JeyJDRlN0cmluZ0NvbXBhcmUiLCAoUHlDRnVuY3Rpb24pQ0ZTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdDb21wYXJlLCAxLAotCSBQeURvY19TVFIoIihDRlN0cmluZ1JlZiB0aGVTdHJpbmcyLCBDRk9wdGlvbkZsYWdzIGNvbXBhcmVPcHRpb25zKSAtPiAoQ0ZDb21wYXJpc29uUmVzdWx0IF9ydikiKX0sCi0JeyJDRlN0cmluZ0ZpbmRXaXRoT3B0aW9ucyIsIChQeUNGdW5jdGlvbilDRlN0cmluZ1JlZk9ial9DRlN0cmluZ0ZpbmRXaXRoT3B0aW9ucywgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgc3RyaW5nVG9GaW5kLCBDRlJhbmdlIHJhbmdlVG9TZWFyY2gsIENGT3B0aW9uRmxhZ3Mgc2VhcmNoT3B0aW9ucykgLT4gKEJvb2xlYW4gX3J2LCBDRlJhbmdlIHJlc3VsdCkiKX0sCi0JeyJDRlN0cmluZ0NyZWF0ZUFycmF5V2l0aEZpbmRSZXN1bHRzIiwgKFB5Q0Z1bmN0aW9uKUNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nQ3JlYXRlQXJyYXlXaXRoRmluZFJlc3VsdHMsIDEsCi0JIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIHN0cmluZ1RvRmluZCwgQ0ZSYW5nZSByYW5nZVRvU2VhcmNoLCBDRk9wdGlvbkZsYWdzIGNvbXBhcmVPcHRpb25zKSAtPiAoQ0ZBcnJheVJlZiBfcnYpIil9LAotCXsiQ0ZTdHJpbmdGaW5kIiwgKFB5Q0Z1bmN0aW9uKUNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nRmluZCwgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgc3RyaW5nVG9GaW5kLCBDRk9wdGlvbkZsYWdzIGNvbXBhcmVPcHRpb25zKSAtPiAoQ0ZSYW5nZSBfcnYpIil9LAotCXsiQ0ZTdHJpbmdIYXNQcmVmaXgiLCAoUHlDRnVuY3Rpb24pQ0ZTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdIYXNQcmVmaXgsIDEsCi0JIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIHByZWZpeCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IkNGU3RyaW5nSGFzU3VmZml4IiwgKFB5Q0Z1bmN0aW9uKUNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nSGFzU3VmZml4LCAxLAotCSBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBzdWZmaXgpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJDRlN0cmluZ0dldExpbmVCb3VuZHMiLCAoUHlDRnVuY3Rpb24pQ0ZTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdHZXRMaW5lQm91bmRzLCAxLAotCSBQeURvY19TVFIoIihDRlJhbmdlIHJhbmdlKSAtPiAoQ0ZJbmRleCBsaW5lQmVnaW5JbmRleCwgQ0ZJbmRleCBsaW5lRW5kSW5kZXgsIENGSW5kZXggY29udGVudHNFbmRJbmRleCkiKX0sCi0JeyJDRlN0cmluZ0NyZWF0ZUFycmF5QnlTZXBhcmF0aW5nU3RyaW5ncyIsIChQeUNGdW5jdGlvbilDRlN0cmluZ1JlZk9ial9DRlN0cmluZ0NyZWF0ZUFycmF5QnlTZXBhcmF0aW5nU3RyaW5ncywgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgc2VwYXJhdG9yU3RyaW5nKSAtPiAoQ0ZBcnJheVJlZiBfcnYpIil9LAotCXsiQ0ZTdHJpbmdHZXRJbnRWYWx1ZSIsIChQeUNGdW5jdGlvbilDRlN0cmluZ1JlZk9ial9DRlN0cmluZ0dldEludFZhbHVlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChTSW50MzIgX3J2KSIpfSwKLQl7IkNGU3RyaW5nR2V0RG91YmxlVmFsdWUiLCAoUHlDRnVuY3Rpb24pQ0ZTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdHZXREb3VibGVWYWx1ZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoZG91YmxlIF9ydikiKX0sCi0JeyJDRlN0cmluZ0NvbnZlcnRJQU5BQ2hhclNldE5hbWVUb0VuY29kaW5nIiwgKFB5Q0Z1bmN0aW9uKUNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nQ29udmVydElBTkFDaGFyU2V0TmFtZVRvRW5jb2RpbmcsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENGU3RyaW5nRW5jb2RpbmcgX3J2KSIpfSwKLQl7IkNGU2hvd1N0ciIsIChQeUNGdW5jdGlvbilDRlN0cmluZ1JlZk9ial9DRlNob3dTdHIsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkNGVVJMQ3JlYXRlV2l0aFN0cmluZyIsIChQeUNGdW5jdGlvbilDRlN0cmluZ1JlZk9ial9DRlVSTENyZWF0ZVdpdGhTdHJpbmcsIDEsCi0JIFB5RG9jX1NUUigiKENGVVJMUmVmIGJhc2VVUkwpIC0+IChDRlVSTFJlZiBfcnYpIil9LAotCXsiQ0ZVUkxDcmVhdGVXaXRoRmlsZVN5c3RlbVBhdGgiLCAoUHlDRnVuY3Rpb24pQ0ZTdHJpbmdSZWZPYmpfQ0ZVUkxDcmVhdGVXaXRoRmlsZVN5c3RlbVBhdGgsIDEsCi0JIFB5RG9jX1NUUigiKENGVVJMUGF0aFN0eWxlIHBhdGhTdHlsZSwgQm9vbGVhbiBpc0RpcmVjdG9yeSkgLT4gKENGVVJMUmVmIF9ydikiKX0sCi0JeyJDRlVSTENyZWF0ZVdpdGhGaWxlU3lzdGVtUGF0aFJlbGF0aXZlVG9CYXNlIiwgKFB5Q0Z1bmN0aW9uKUNGU3RyaW5nUmVmT2JqX0NGVVJMQ3JlYXRlV2l0aEZpbGVTeXN0ZW1QYXRoUmVsYXRpdmVUb0Jhc2UsIDEsCi0JIFB5RG9jX1NUUigiKENGVVJMUGF0aFN0eWxlIHBhdGhTdHlsZSwgQm9vbGVhbiBpc0RpcmVjdG9yeSwgQ0ZVUkxSZWYgYmFzZVVSTCkgLT4gKENGVVJMUmVmIF9ydikiKX0sCi0JeyJDRlVSTENyZWF0ZVN0cmluZ0J5UmVwbGFjaW5nUGVyY2VudEVzY2FwZXMiLCAoUHlDRnVuY3Rpb24pQ0ZTdHJpbmdSZWZPYmpfQ0ZVUkxDcmVhdGVTdHJpbmdCeVJlcGxhY2luZ1BlcmNlbnRFc2NhcGVzLCAxLAotCSBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBjaGFyYWN0ZXJzVG9MZWF2ZUVzY2FwZWQpIC0+IChDRlN0cmluZ1JlZiBfcnYpIil9LAotCXsiQ0ZVUkxDcmVhdGVTdHJpbmdCeUFkZGluZ1BlcmNlbnRFc2NhcGVzIiwgKFB5Q0Z1bmN0aW9uKUNGU3RyaW5nUmVmT2JqX0NGVVJMQ3JlYXRlU3RyaW5nQnlBZGRpbmdQZXJjZW50RXNjYXBlcywgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgY2hhcmFjdGVyc1RvTGVhdmVVbmVzY2FwZWQsIENGU3RyaW5nUmVmIGxlZ2FsVVJMQ2hhcmFjdGVyc1RvQmVFc2NhcGVkLCBDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKLQl7IkNGU3RyaW5nR2V0U3RyaW5nIiwgKFB5Q0Z1bmN0aW9uKUNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nR2V0U3RyaW5nLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChzdHJpbmcgX3J2KSIpfSwKLQl7IkNGU3RyaW5nR2V0VW5pY29kZSIsIChQeUNGdW5jdGlvbilDRlN0cmluZ1JlZk9ial9DRlN0cmluZ0dldFVuaWNvZGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKHVuaWNvZGUgX3J2KSIpfSwKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7IkNGU3RyaW5nQ3JlYXRlV2l0aFN1YnN0cmluZyIsIChQeUNGdW5jdGlvbilDRlN0cmluZ1JlZk9ial9DRlN0cmluZ0NyZWF0ZVdpdGhTdWJzdHJpbmcsIDEsCisgICAgIFB5RG9jX1NUUigiKENGUmFuZ2UgcmFuZ2UpIC0+IChDRlN0cmluZ1JlZiBfcnYpIil9LAorICAgIHsiQ0ZTdHJpbmdDcmVhdGVDb3B5IiwgKFB5Q0Z1bmN0aW9uKUNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nQ3JlYXRlQ29weSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKKyAgICB7IkNGU3RyaW5nR2V0TGVuZ3RoIiwgKFB5Q0Z1bmN0aW9uKUNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nR2V0TGVuZ3RoLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDRkluZGV4IF9ydikiKX0sCisgICAgeyJDRlN0cmluZ0dldEJ5dGVzIiwgKFB5Q0Z1bmN0aW9uKUNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nR2V0Qnl0ZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKENGUmFuZ2UgcmFuZ2UsIENGU3RyaW5nRW5jb2RpbmcgZW5jb2RpbmcsIFVJbnQ4IGxvc3NCeXRlLCBCb29sZWFuIGlzRXh0ZXJuYWxSZXByZXNlbnRhdGlvbiwgQ0ZJbmRleCBtYXhCdWZMZW4pIC0+IChDRkluZGV4IF9ydiwgVUludDggYnVmZmVyLCBDRkluZGV4IHVzZWRCdWZMZW4pIil9LAorICAgIHsiQ0ZTdHJpbmdDcmVhdGVFeHRlcm5hbFJlcHJlc2VudGF0aW9uIiwgKFB5Q0Z1bmN0aW9uKUNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nQ3JlYXRlRXh0ZXJuYWxSZXByZXNlbnRhdGlvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZywgVUludDggbG9zc0J5dGUpIC0+IChDRkRhdGFSZWYgX3J2KSIpfSwKKyAgICB7IkNGU3RyaW5nR2V0U21hbGxlc3RFbmNvZGluZyIsIChQeUNGdW5jdGlvbilDRlN0cmluZ1JlZk9ial9DRlN0cmluZ0dldFNtYWxsZXN0RW5jb2RpbmcsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENGU3RyaW5nRW5jb2RpbmcgX3J2KSIpfSwKKyAgICB7IkNGU3RyaW5nR2V0RmFzdGVzdEVuY29kaW5nIiwgKFB5Q0Z1bmN0aW9uKUNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nR2V0RmFzdGVzdEVuY29kaW5nLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDRlN0cmluZ0VuY29kaW5nIF9ydikiKX0sCisgICAgeyJDRlN0cmluZ0NvbXBhcmVXaXRoT3B0aW9ucyIsIChQeUNGdW5jdGlvbilDRlN0cmluZ1JlZk9ial9DRlN0cmluZ0NvbXBhcmVXaXRoT3B0aW9ucywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgdGhlU3RyaW5nMiwgQ0ZSYW5nZSByYW5nZVRvQ29tcGFyZSwgQ0ZPcHRpb25GbGFncyBjb21wYXJlT3B0aW9ucykgLT4gKENGQ29tcGFyaXNvblJlc3VsdCBfcnYpIil9LAorICAgIHsiQ0ZTdHJpbmdDb21wYXJlIiwgKFB5Q0Z1bmN0aW9uKUNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nQ29tcGFyZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgdGhlU3RyaW5nMiwgQ0ZPcHRpb25GbGFncyBjb21wYXJlT3B0aW9ucykgLT4gKENGQ29tcGFyaXNvblJlc3VsdCBfcnYpIil9LAorICAgIHsiQ0ZTdHJpbmdGaW5kV2l0aE9wdGlvbnMiLCAoUHlDRnVuY3Rpb24pQ0ZTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdGaW5kV2l0aE9wdGlvbnMsIDEsCisgICAgIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIHN0cmluZ1RvRmluZCwgQ0ZSYW5nZSByYW5nZVRvU2VhcmNoLCBDRk9wdGlvbkZsYWdzIHNlYXJjaE9wdGlvbnMpIC0+IChCb29sZWFuIF9ydiwgQ0ZSYW5nZSByZXN1bHQpIil9LAorICAgIHsiQ0ZTdHJpbmdDcmVhdGVBcnJheVdpdGhGaW5kUmVzdWx0cyIsIChQeUNGdW5jdGlvbilDRlN0cmluZ1JlZk9ial9DRlN0cmluZ0NyZWF0ZUFycmF5V2l0aEZpbmRSZXN1bHRzLCAxLAorICAgICBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBzdHJpbmdUb0ZpbmQsIENGUmFuZ2UgcmFuZ2VUb1NlYXJjaCwgQ0ZPcHRpb25GbGFncyBjb21wYXJlT3B0aW9ucykgLT4gKENGQXJyYXlSZWYgX3J2KSIpfSwKKyAgICB7IkNGU3RyaW5nRmluZCIsIChQeUNGdW5jdGlvbilDRlN0cmluZ1JlZk9ial9DRlN0cmluZ0ZpbmQsIDEsCisgICAgIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIHN0cmluZ1RvRmluZCwgQ0ZPcHRpb25GbGFncyBjb21wYXJlT3B0aW9ucykgLT4gKENGUmFuZ2UgX3J2KSIpfSwKKyAgICB7IkNGU3RyaW5nSGFzUHJlZml4IiwgKFB5Q0Z1bmN0aW9uKUNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nSGFzUHJlZml4LCAxLAorICAgICBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBwcmVmaXgpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJDRlN0cmluZ0hhc1N1ZmZpeCIsIChQeUNGdW5jdGlvbilDRlN0cmluZ1JlZk9ial9DRlN0cmluZ0hhc1N1ZmZpeCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgc3VmZml4KSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiQ0ZTdHJpbmdHZXRMaW5lQm91bmRzIiwgKFB5Q0Z1bmN0aW9uKUNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nR2V0TGluZUJvdW5kcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZSYW5nZSByYW5nZSkgLT4gKENGSW5kZXggbGluZUJlZ2luSW5kZXgsIENGSW5kZXggbGluZUVuZEluZGV4LCBDRkluZGV4IGNvbnRlbnRzRW5kSW5kZXgpIil9LAorICAgIHsiQ0ZTdHJpbmdDcmVhdGVBcnJheUJ5U2VwYXJhdGluZ1N0cmluZ3MiLCAoUHlDRnVuY3Rpb24pQ0ZTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdDcmVhdGVBcnJheUJ5U2VwYXJhdGluZ1N0cmluZ3MsIDEsCisgICAgIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIHNlcGFyYXRvclN0cmluZykgLT4gKENGQXJyYXlSZWYgX3J2KSIpfSwKKyAgICB7IkNGU3RyaW5nR2V0SW50VmFsdWUiLCAoUHlDRnVuY3Rpb24pQ0ZTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdHZXRJbnRWYWx1ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoU0ludDMyIF9ydikiKX0sCisgICAgeyJDRlN0cmluZ0dldERvdWJsZVZhbHVlIiwgKFB5Q0Z1bmN0aW9uKUNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nR2V0RG91YmxlVmFsdWUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKGRvdWJsZSBfcnYpIil9LAorICAgIHsiQ0ZTdHJpbmdDb252ZXJ0SUFOQUNoYXJTZXROYW1lVG9FbmNvZGluZyIsIChQeUNGdW5jdGlvbilDRlN0cmluZ1JlZk9ial9DRlN0cmluZ0NvbnZlcnRJQU5BQ2hhclNldE5hbWVUb0VuY29kaW5nLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDRlN0cmluZ0VuY29kaW5nIF9ydikiKX0sCisgICAgeyJDRlNob3dTdHIiLCAoUHlDRnVuY3Rpb24pQ0ZTdHJpbmdSZWZPYmpfQ0ZTaG93U3RyLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJDRlVSTENyZWF0ZVdpdGhTdHJpbmciLCAoUHlDRnVuY3Rpb24pQ0ZTdHJpbmdSZWZPYmpfQ0ZVUkxDcmVhdGVXaXRoU3RyaW5nLCAxLAorICAgICBQeURvY19TVFIoIihDRlVSTFJlZiBiYXNlVVJMKSAtPiAoQ0ZVUkxSZWYgX3J2KSIpfSwKKyAgICB7IkNGVVJMQ3JlYXRlV2l0aEZpbGVTeXN0ZW1QYXRoIiwgKFB5Q0Z1bmN0aW9uKUNGU3RyaW5nUmVmT2JqX0NGVVJMQ3JlYXRlV2l0aEZpbGVTeXN0ZW1QYXRoLCAxLAorICAgICBQeURvY19TVFIoIihDRlVSTFBhdGhTdHlsZSBwYXRoU3R5bGUsIEJvb2xlYW4gaXNEaXJlY3RvcnkpIC0+IChDRlVSTFJlZiBfcnYpIil9LAorICAgIHsiQ0ZVUkxDcmVhdGVXaXRoRmlsZVN5c3RlbVBhdGhSZWxhdGl2ZVRvQmFzZSIsIChQeUNGdW5jdGlvbilDRlN0cmluZ1JlZk9ial9DRlVSTENyZWF0ZVdpdGhGaWxlU3lzdGVtUGF0aFJlbGF0aXZlVG9CYXNlLCAxLAorICAgICBQeURvY19TVFIoIihDRlVSTFBhdGhTdHlsZSBwYXRoU3R5bGUsIEJvb2xlYW4gaXNEaXJlY3RvcnksIENGVVJMUmVmIGJhc2VVUkwpIC0+IChDRlVSTFJlZiBfcnYpIil9LAorICAgIHsiQ0ZVUkxDcmVhdGVTdHJpbmdCeVJlcGxhY2luZ1BlcmNlbnRFc2NhcGVzIiwgKFB5Q0Z1bmN0aW9uKUNGU3RyaW5nUmVmT2JqX0NGVVJMQ3JlYXRlU3RyaW5nQnlSZXBsYWNpbmdQZXJjZW50RXNjYXBlcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgY2hhcmFjdGVyc1RvTGVhdmVFc2NhcGVkKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKKyAgICB7IkNGVVJMQ3JlYXRlU3RyaW5nQnlBZGRpbmdQZXJjZW50RXNjYXBlcyIsIChQeUNGdW5jdGlvbilDRlN0cmluZ1JlZk9ial9DRlVSTENyZWF0ZVN0cmluZ0J5QWRkaW5nUGVyY2VudEVzY2FwZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIGNoYXJhY3RlcnNUb0xlYXZlVW5lc2NhcGVkLCBDRlN0cmluZ1JlZiBsZWdhbFVSTENoYXJhY3RlcnNUb0JlRXNjYXBlZCwgQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZykgLT4gKENGU3RyaW5nUmVmIF9ydikiKX0sCisgICAgeyJDRlN0cmluZ0dldFN0cmluZyIsIChQeUNGdW5jdGlvbilDRlN0cmluZ1JlZk9ial9DRlN0cmluZ0dldFN0cmluZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoc3RyaW5nIF9ydikiKX0sCisgICAgeyJDRlN0cmluZ0dldFVuaWNvZGUiLCAoUHlDRnVuY3Rpb24pQ0ZTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdHZXRVbmljb2RlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+ICh1bmljb2RlIF9ydikiKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAjZGVmaW5lIENGU3RyaW5nUmVmT2JqX2dldHNldGxpc3QgTlVMTApAQCAtMjQzNSwxMDAgKzI0MzUsMTAwIEBACiAKIHN0YXRpYyBpbnQgQ0ZTdHJpbmdSZWZPYmpfY29tcGFyZShDRlN0cmluZ1JlZk9iamVjdCAqc2VsZiwgQ0ZTdHJpbmdSZWZPYmplY3QgKm90aGVyKQogewotCS8qIFhYWFggT3Igc2hvdWxkIHdlIHVzZSBDRkVxdWFsPz8gKi8KLQlpZiAoIHNlbGYtPm9iX2l0c2VsZiA+IG90aGVyLT5vYl9pdHNlbGYgKSByZXR1cm4gMTsKLQlpZiAoIHNlbGYtPm9iX2l0c2VsZiA8IG90aGVyLT5vYl9pdHNlbGYgKSByZXR1cm4gLTE7Ci0JcmV0dXJuIDA7CisgICAgLyogWFhYWCBPciBzaG91bGQgd2UgdXNlIENGRXF1YWw/PyAqLworICAgIGlmICggc2VsZi0+b2JfaXRzZWxmID4gb3RoZXItPm9iX2l0c2VsZiApIHJldHVybiAxOworICAgIGlmICggc2VsZi0+b2JfaXRzZWxmIDwgb3RoZXItPm9iX2l0c2VsZiApIHJldHVybiAtMTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICogQ0ZTdHJpbmdSZWZPYmpfcmVwcihDRlN0cmluZ1JlZk9iamVjdCAqc2VsZikKIHsKLQljaGFyIGJ1ZlsxMDBdOwotCXNwcmludGYoYnVmLCAiPENGU3RyaW5nUmVmIG9iamVjdCBhdCAweCU4Ljh4IGZvciAweCU4Ljh4PiIsICh1bnNpZ25lZClzZWxmLCAodW5zaWduZWQpc2VsZi0+b2JfaXRzZWxmKTsKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOworICAgIGNoYXIgYnVmWzEwMF07CisgICAgc3ByaW50ZihidWYsICI8Q0ZTdHJpbmdSZWYgb2JqZWN0IGF0IDB4JTguOHggZm9yIDB4JTguOHg+IiwgKHVuc2lnbmVkKXNlbGYsICh1bnNpZ25lZClzZWxmLT5vYl9pdHNlbGYpOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CiB9CiAKIHN0YXRpYyBpbnQgQ0ZTdHJpbmdSZWZPYmpfaGFzaChDRlN0cmluZ1JlZk9iamVjdCAqc2VsZikKIHsKLQkvKiBYWFhYIE9yIHNob3VsZCB3ZSB1c2UgQ0ZIYXNoPz8gKi8KLQlyZXR1cm4gKGludClzZWxmLT5vYl9pdHNlbGY7CisgICAgLyogWFhYWCBPciBzaG91bGQgd2UgdXNlIENGSGFzaD8/ICovCisgICAgcmV0dXJuIChpbnQpc2VsZi0+b2JfaXRzZWxmOwogfQogc3RhdGljIGludCBDRlN0cmluZ1JlZk9ial90cF9pbml0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzLCBQeU9iamVjdCAqX2t3ZHMpCiB7Ci0JQ0ZTdHJpbmdSZWYgaXRzZWxmOwotCWNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OworICAgIENGU3RyaW5nUmVmIGl0c2VsZjsKKyAgICBjaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKIAotCWlmIChQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJml0c2VsZikpCi0JewotCQkoKENGU3RyaW5nUmVmT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JCXJldHVybiAwOwotCX0KKyAgICBpZiAoUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZpdHNlbGYpKQorICAgIHsKKyAgICAgICAgKChDRlN0cmluZ1JlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLQkvKiBBbnkgQ0ZUeXBlUmVmIGRlc2NlbmRlbnQgaXMgYWxsb3dlZCBhcyBpbml0aWFsaXplciB0b28gKi8KLQlpZiAoUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIENGVHlwZVJlZk9ial9Db252ZXJ0LCAmaXRzZWxmKSkKLQl7Ci0JCSgoQ0ZTdHJpbmdSZWZPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiAtMTsKKyAgICAvKiBBbnkgQ0ZUeXBlUmVmIGRlc2NlbmRlbnQgaXMgYWxsb3dlZCBhcyBpbml0aWFsaXplciB0b28gKi8KKyAgICBpZiAoUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIENGVHlwZVJlZk9ial9Db252ZXJ0LCAmaXRzZWxmKSkKKyAgICB7CisgICAgICAgICgoQ0ZTdHJpbmdSZWZPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAtMTsKIH0KIAogI2RlZmluZSBDRlN0cmluZ1JlZk9ial90cF9hbGxvYyBQeVR5cGVfR2VuZXJpY0FsbG9jCiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZTdHJpbmdSZWZPYmpfdHBfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKl9hcmdzLCBQeU9iamVjdCAqX2t3ZHMpCiB7Ci0JUHlPYmplY3QgKnNlbGY7Ci0JaWYgKChzZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOwotCSgoQ0ZTdHJpbmdSZWZPYmplY3QgKilzZWxmKS0+b2JfaXRzZWxmID0gTlVMTDsKLQkoKENGU3RyaW5nUmVmT2JqZWN0ICopc2VsZiktPm9iX2ZyZWVpdCA9IENGUmVsZWFzZTsKLQlyZXR1cm4gc2VsZjsKKyAgICBQeU9iamVjdCAqc2VsZjsKKyAgICBpZiAoKHNlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgKChDRlN0cmluZ1JlZk9iamVjdCAqKXNlbGYpLT5vYl9pdHNlbGYgPSBOVUxMOworICAgICgoQ0ZTdHJpbmdSZWZPYmplY3QgKilzZWxmKS0+b2JfZnJlZWl0ID0gQ0ZSZWxlYXNlOworICAgIHJldHVybiBzZWxmOwogfQogCiAjZGVmaW5lIENGU3RyaW5nUmVmT2JqX3RwX2ZyZWUgUHlPYmplY3RfRGVsCiAKIAogUHlUeXBlT2JqZWN0IENGU3RyaW5nUmVmX1R5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCi0JMCwgLypvYl9zaXplKi8KLQkiX0NGLkNGU3RyaW5nUmVmIiwgLyp0cF9uYW1lKi8KLQlzaXplb2YoQ0ZTdHJpbmdSZWZPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCi0JMCwgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKSBDRlN0cmluZ1JlZk9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsIC8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLwotCShjbXBmdW5jKSBDRlN0cmluZ1JlZk9ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYykgQ0ZTdHJpbmdSZWZPYmpfcmVwciwgLyp0cF9yZXByKi8KLQkoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCi0JKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpIENGU3RyaW5nUmVmT2JqX2hhc2gsIC8qdHBfaGFzaCovCi0JMCwgLyp0cF9jYWxsKi8KLQkwLCAvKnRwX3N0ciovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLwotCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCi0JMCwgLyp0cF9hc19idWZmZXIqLwotCVB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCTAsIC8qdHBfZG9jKi8KLQkwLCAvKnRwX3RyYXZlcnNlKi8KLQkwLCAvKnRwX2NsZWFyKi8KLQkwLCAvKnRwX3JpY2hjb21wYXJlKi8KLQkwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLQkwLCAvKnRwX2l0ZXIqLwotCTAsIC8qdHBfaXRlcm5leHQqLwotCUNGU3RyaW5nUmVmT2JqX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KLQkwLCAvKnRwX21lbWJlcnMqLwotCUNGU3RyaW5nUmVmT2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KLQkwLCAvKnRwX2Jhc2UqLwotCTAsIC8qdHBfZGljdCovCi0JMCwgLyp0cF9kZXNjcl9nZXQqLwotCTAsIC8qdHBfZGVzY3Jfc2V0Ki8KLQkwLCAvKnRwX2RpY3RvZmZzZXQqLwotCUNGU3RyaW5nUmVmT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KLQlDRlN0cmluZ1JlZk9ial90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KLQlDRlN0cmluZ1JlZk9ial90cF9uZXcsIC8qIHRwX25ldyAqLwotCUNGU3RyaW5nUmVmT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAvKm9iX3NpemUqLworICAgICJfQ0YuQ0ZTdHJpbmdSZWYiLCAvKnRwX25hbWUqLworICAgIHNpemVvZihDRlN0cmluZ1JlZk9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpIENGU3RyaW5nUmVmT2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgMCwgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCisgICAgKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCisgICAgKGNtcGZ1bmMpIENGU3RyaW5nUmVmT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCisgICAgKHJlcHJmdW5jKSBDRlN0cmluZ1JlZk9ial9yZXByLCAvKnRwX3JlcHIqLworICAgIChQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIChQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLworICAgIChoYXNoZnVuYykgQ0ZTdHJpbmdSZWZPYmpfaGFzaCwgLyp0cF9oYXNoKi8KKyAgICAwLCAvKnRwX2NhbGwqLworICAgIDAsIC8qdHBfc3RyKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCisgICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgMCwgLyp0cF9kb2MqLworICAgIDAsIC8qdHBfdHJhdmVyc2UqLworICAgIDAsIC8qdHBfY2xlYXIqLworICAgIDAsIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsIC8qdHBfaXRlciovCisgICAgMCwgLyp0cF9pdGVybmV4dCovCisgICAgQ0ZTdHJpbmdSZWZPYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLworICAgIDAsIC8qdHBfbWVtYmVycyovCisgICAgQ0ZTdHJpbmdSZWZPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLworICAgIDAsIC8qdHBfYmFzZSovCisgICAgMCwgLyp0cF9kaWN0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX2dldCovCisgICAgMCwgLyp0cF9kZXNjcl9zZXQqLworICAgIDAsIC8qdHBfZGljdG9mZnNldCovCisgICAgQ0ZTdHJpbmdSZWZPYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLworICAgIENGU3RyaW5nUmVmT2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLworICAgIENGU3RyaW5nUmVmT2JqX3RwX25ldywgLyogdHBfbmV3ICovCisgICAgQ0ZTdHJpbmdSZWZPYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tIEVuZCBvYmplY3QgdHlwZSBDRlN0cmluZ1JlZiAtLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0yNTQxLDI4MSArMjU0MSwyODEgQEAKICNkZWZpbmUgQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX0NoZWNrKHgpICgoeCktPm9iX3R5cGUgPT0gJkNGTXV0YWJsZVN0cmluZ1JlZl9UeXBlIHx8IFB5T2JqZWN0X1R5cGVDaGVjaygoeCksICZDRk11dGFibGVTdHJpbmdSZWZfVHlwZSkpCiAKIHR5cGVkZWYgc3RydWN0IENGTXV0YWJsZVN0cmluZ1JlZk9iamVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCUNGTXV0YWJsZVN0cmluZ1JlZiBvYl9pdHNlbGY7Ci0Jdm9pZCAoKm9iX2ZyZWVpdCkoQ0ZUeXBlUmVmIHB0cik7CisgICAgUHlPYmplY3RfSEVBRAorICAgIENGTXV0YWJsZVN0cmluZ1JlZiBvYl9pdHNlbGY7CisgICAgdm9pZCAoKm9iX2ZyZWVpdCkoQ0ZUeXBlUmVmIHB0cik7CiB9IENGTXV0YWJsZVN0cmluZ1JlZk9iamVjdDsKIAogUHlPYmplY3QgKkNGTXV0YWJsZVN0cmluZ1JlZk9ial9OZXcoQ0ZNdXRhYmxlU3RyaW5nUmVmIGl0c2VsZikKIHsKLQlDRk11dGFibGVTdHJpbmdSZWZPYmplY3QgKml0OwotCWlmIChpdHNlbGYgPT0gTlVMTCkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJjYW5ub3Qgd3JhcCBOVUxMIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpdCA9IFB5T2JqZWN0X05FVyhDRk11dGFibGVTdHJpbmdSZWZPYmplY3QsICZDRk11dGFibGVTdHJpbmdSZWZfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOwotCS8qIFhYWFggU2hvdWxkIHdlIHRwX2luaXQgb3IgdHBfbmV3IG91ciBiYXNldHlwZT8gKi8KLQlpdC0+b2JfaXRzZWxmID0gaXRzZWxmOwotCWl0LT5vYl9mcmVlaXQgPSBDRlJlbGVhc2U7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIENGTXV0YWJsZVN0cmluZ1JlZk9iamVjdCAqaXQ7CisgICAgaWYgKGl0c2VsZiA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgImNhbm5vdCB3cmFwIE5VTEwiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGl0ID0gUHlPYmplY3RfTkVXKENGTXV0YWJsZVN0cmluZ1JlZk9iamVjdCwgJkNGTXV0YWJsZVN0cmluZ1JlZl9UeXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgLyogWFhYWCBTaG91bGQgd2UgdHBfaW5pdCBvciB0cF9uZXcgb3VyIGJhc2V0eXBlPyAqLworICAgIGl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgaXQtPm9iX2ZyZWVpdCA9IENGUmVsZWFzZTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiAKIGludCBDRk11dGFibGVTdHJpbmdSZWZPYmpfQ29udmVydChQeU9iamVjdCAqdiwgQ0ZNdXRhYmxlU3RyaW5nUmVmICpwX2l0c2VsZikKIHsKIAotCWlmICh2ID09IFB5X05vbmUpIHsgKnBfaXRzZWxmID0gTlVMTDsgcmV0dXJuIDE7IH0KLQkvKiBDaGVjayBmb3Igb3RoZXIgQ0Ygb2JqZWN0cyBoZXJlICovCisgICAgaWYgKHYgPT0gUHlfTm9uZSkgeyAqcF9pdHNlbGYgPSBOVUxMOyByZXR1cm4gMTsgfQorICAgIC8qIENoZWNrIGZvciBvdGhlciBDRiBvYmplY3RzIGhlcmUgKi8KIAotCWlmICghQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX0NoZWNrKHYpKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkNGTXV0YWJsZVN0cmluZ1JlZiByZXF1aXJlZCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JKnBfaXRzZWxmID0gKChDRk11dGFibGVTdHJpbmdSZWZPYmplY3QgKil2KS0+b2JfaXRzZWxmOwotCXJldHVybiAxOworICAgIGlmICghQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX0NoZWNrKHYpKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkNGTXV0YWJsZVN0cmluZ1JlZiByZXF1aXJlZCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgKnBfaXRzZWxmID0gKChDRk11dGFibGVTdHJpbmdSZWZPYmplY3QgKil2KS0+b2JfaXRzZWxmOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgdm9pZCBDRk11dGFibGVTdHJpbmdSZWZPYmpfZGVhbGxvYyhDRk11dGFibGVTdHJpbmdSZWZPYmplY3QgKnNlbGYpCiB7Ci0JaWYgKHNlbGYtPm9iX2ZyZWVpdCAmJiBzZWxmLT5vYl9pdHNlbGYpCi0JewotCQlzZWxmLT5vYl9mcmVlaXQoKENGVHlwZVJlZilzZWxmLT5vYl9pdHNlbGYpOwotCQlzZWxmLT5vYl9pdHNlbGYgPSBOVUxMOwotCX0KLQlDRlN0cmluZ1JlZl9UeXBlLnRwX2RlYWxsb2MoKFB5T2JqZWN0ICopc2VsZik7CisgICAgaWYgKHNlbGYtPm9iX2ZyZWVpdCAmJiBzZWxmLT5vYl9pdHNlbGYpCisgICAgeworICAgICAgICBzZWxmLT5vYl9mcmVlaXQoKENGVHlwZVJlZilzZWxmLT5vYl9pdHNlbGYpOworICAgICAgICBzZWxmLT5vYl9pdHNlbGYgPSBOVUxMOworICAgIH0KKyAgICBDRlN0cmluZ1JlZl9UeXBlLnRwX2RlYWxsb2MoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX0NGU3RyaW5nQXBwZW5kKENGTXV0YWJsZVN0cmluZ1JlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZTdHJpbmdSZWYgYXBwZW5kZWRTdHJpbmc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGU3RyaW5nUmVmIGFwcGVuZGVkU3RyaW5nOwogI2lmbmRlZiBDRlN0cmluZ0FwcGVuZAotCVB5TWFjX1BSRUNIRUNLKENGU3RyaW5nQXBwZW5kKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0FwcGVuZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZhcHBlbmRlZFN0cmluZykpCi0JCXJldHVybiBOVUxMOwotCUNGU3RyaW5nQXBwZW5kKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgYXBwZW5kZWRTdHJpbmcpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZhcHBlbmRlZFN0cmluZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENGU3RyaW5nQXBwZW5kKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgYXBwZW5kZWRTdHJpbmcpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRk11dGFibGVTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdBcHBlbmRDaGFyYWN0ZXJzKENGTXV0YWJsZVN0cmluZ1JlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVW5pQ2hhciAqY2hhcnNfX2luX187Ci0JVW5pQ2hhckNvdW50IGNoYXJzX19sZW5fXzsKLQlpbnQgY2hhcnNfX2luX2xlbl9fOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBVbmlDaGFyICpjaGFyc19faW5fXzsKKyAgICBVbmlDaGFyQ291bnQgY2hhcnNfX2xlbl9fOworICAgIGludCBjaGFyc19faW5fbGVuX187CiAjaWZuZGVmIENGU3RyaW5nQXBwZW5kQ2hhcmFjdGVycwotCVB5TWFjX1BSRUNIRUNLKENGU3RyaW5nQXBwZW5kQ2hhcmFjdGVycyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdBcHBlbmRDaGFyYWN0ZXJzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInUjIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNoYXJzX19pbl9fLCAmY2hhcnNfX2luX2xlbl9fKSkKLQkJcmV0dXJuIE5VTEw7Ci0JY2hhcnNfX2xlbl9fID0gY2hhcnNfX2luX2xlbl9fOwotCUNGU3RyaW5nQXBwZW5kQ2hhcmFjdGVycyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyc19faW5fXywgY2hhcnNfX2xlbl9fKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAidSMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY2hhcnNfX2luX18sICZjaGFyc19faW5fbGVuX18pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBjaGFyc19fbGVuX18gPSBjaGFyc19faW5fbGVuX187CisgICAgQ0ZTdHJpbmdBcHBlbmRDaGFyYWN0ZXJzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzX19pbl9fLCBjaGFyc19fbGVuX18pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRk11dGFibGVTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdBcHBlbmRQYXNjYWxTdHJpbmcoQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTdHIyNTUgcFN0cjsKLQlDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTdHIyNTUgcFN0cjsKKyAgICBDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nOwogI2lmbmRlZiBDRlN0cmluZ0FwcGVuZFBhc2NhbFN0cmluZwotCVB5TWFjX1BSRUNIRUNLKENGU3RyaW5nQXBwZW5kUGFzY2FsU3RyaW5nKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0FwcGVuZFBhc2NhbFN0cmluZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIHBTdHIsCi0JICAgICAgICAgICAgICAgICAgICAgICZlbmNvZGluZykpCi0JCXJldHVybiBOVUxMOwotCUNGU3RyaW5nQXBwZW5kUGFzY2FsU3RyaW5nKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN0ciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgcFN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmVuY29kaW5nKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0ZTdHJpbmdBcHBlbmRQYXNjYWxTdHJpbmcoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX0NGU3RyaW5nQXBwZW5kQ1N0cmluZyhDRk11dGFibGVTdHJpbmdSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWNoYXIqIGNTdHI7Ci0JQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgY2hhciogY1N0cjsKKyAgICBDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nOwogI2lmbmRlZiBDRlN0cmluZ0FwcGVuZENTdHJpbmcKLQlQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0FwcGVuZENTdHJpbmcpOworICAgIFB5TWFjX1BSRUNIRUNLKENGU3RyaW5nQXBwZW5kQ1N0cmluZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZjU3RyLAotCSAgICAgICAgICAgICAgICAgICAgICAmZW5jb2RpbmcpKQotCQlyZXR1cm4gTlVMTDsKLQlDRlN0cmluZ0FwcGVuZENTdHJpbmcoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgY1N0ciwKLQkgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5jb2RpbmcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDRlN0cmluZ0FwcGVuZENTdHJpbmcoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY1N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRk11dGFibGVTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdJbnNlcnQoQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRkluZGV4IGlkeDsKLQlDRlN0cmluZ1JlZiBpbnNlcnRlZFN0cjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZJbmRleCBpZHg7CisgICAgQ0ZTdHJpbmdSZWYgaW5zZXJ0ZWRTdHI7CiAjaWZuZGVmIENGU3RyaW5nSW5zZXJ0Ci0JUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdJbnNlcnQpOworICAgIFB5TWFjX1BSRUNIRUNLKENGU3RyaW5nSW5zZXJ0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpZHgsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZpbnNlcnRlZFN0cikpCi0JCXJldHVybiBOVUxMOwotCUNGU3RyaW5nSW5zZXJ0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgaWR4LAotCSAgICAgICAgICAgICAgIGluc2VydGVkU3RyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmluc2VydGVkU3RyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0ZTdHJpbmdJbnNlcnQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICBpZHgsCisgICAgICAgICAgICAgICAgICAgaW5zZXJ0ZWRTdHIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRk11dGFibGVTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdEZWxldGUoQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlJhbmdlIHJhbmdlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlJhbmdlIHJhbmdlOwogI2lmbmRlZiBDRlN0cmluZ0RlbGV0ZQotCVB5TWFjX1BSRUNIRUNLKENGU3RyaW5nRGVsZXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0RlbGV0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGUmFuZ2VfQ29udmVydCwgJnJhbmdlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0ZTdHJpbmdEZWxldGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICByYW5nZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZSYW5nZV9Db252ZXJ0LCAmcmFuZ2UpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDRlN0cmluZ0RlbGV0ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgIHJhbmdlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX0NGU3RyaW5nUmVwbGFjZShDRk11dGFibGVTdHJpbmdSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGUmFuZ2UgcmFuZ2U7Ci0JQ0ZTdHJpbmdSZWYgcmVwbGFjZW1lbnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGUmFuZ2UgcmFuZ2U7CisgICAgQ0ZTdHJpbmdSZWYgcmVwbGFjZW1lbnQ7CiAjaWZuZGVmIENGU3RyaW5nUmVwbGFjZQotCVB5TWFjX1BSRUNIRUNLKENGU3RyaW5nUmVwbGFjZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdSZXBsYWNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlJhbmdlX0NvbnZlcnQsICZyYW5nZSwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnJlcGxhY2VtZW50KSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0ZTdHJpbmdSZXBsYWNlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgIHJhbmdlLAotCSAgICAgICAgICAgICAgICByZXBsYWNlbWVudCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlJhbmdlX0NvbnZlcnQsICZyYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnJlcGxhY2VtZW50KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0ZTdHJpbmdSZXBsYWNlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgIHJhbmdlLAorICAgICAgICAgICAgICAgICAgICByZXBsYWNlbWVudCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGTXV0YWJsZVN0cmluZ1JlZk9ial9DRlN0cmluZ1JlcGxhY2VBbGwoQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ1JlZiByZXBsYWNlbWVudDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZTdHJpbmdSZWYgcmVwbGFjZW1lbnQ7CiAjaWZuZGVmIENGU3RyaW5nUmVwbGFjZUFsbAotCVB5TWFjX1BSRUNIRUNLKENGU3RyaW5nUmVwbGFjZUFsbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdSZXBsYWNlQWxsKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnJlcGxhY2VtZW50KSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0ZTdHJpbmdSZXBsYWNlQWxsKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgIHJlcGxhY2VtZW50KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmcmVwbGFjZW1lbnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDRlN0cmluZ1JlcGxhY2VBbGwoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZW1lbnQpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRk11dGFibGVTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdQYWQoQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ1JlZiBwYWRTdHJpbmc7Ci0JQ0ZJbmRleCBsZW5ndGg7Ci0JQ0ZJbmRleCBpbmRleEludG9QYWQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGU3RyaW5nUmVmIHBhZFN0cmluZzsKKyAgICBDRkluZGV4IGxlbmd0aDsKKyAgICBDRkluZGV4IGluZGV4SW50b1BhZDsKICNpZm5kZWYgQ0ZTdHJpbmdQYWQKLQlQeU1hY19QUkVDSEVDSyhDRlN0cmluZ1BhZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdQYWQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZwYWRTdHJpbmcsCi0JICAgICAgICAgICAgICAgICAgICAgICZsZW5ndGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbmRleEludG9QYWQpKQotCQlyZXR1cm4gTlVMTDsKLQlDRlN0cmluZ1BhZChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgIHBhZFN0cmluZywKLQkgICAgICAgICAgICBsZW5ndGgsCi0JICAgICAgICAgICAgaW5kZXhJbnRvUGFkKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZwYWRTdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmRleEludG9QYWQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDRlN0cmluZ1BhZChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgIHBhZFN0cmluZywKKyAgICAgICAgICAgICAgICBsZW5ndGgsCisgICAgICAgICAgICAgICAgaW5kZXhJbnRvUGFkKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX0NGU3RyaW5nVHJpbShDRk11dGFibGVTdHJpbmdSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGU3RyaW5nUmVmIHRyaW1TdHJpbmc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGU3RyaW5nUmVmIHRyaW1TdHJpbmc7CiAjaWZuZGVmIENGU3RyaW5nVHJpbQotCVB5TWFjX1BSRUNIRUNLKENGU3RyaW5nVHJpbSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdUcmltKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnRyaW1TdHJpbmcpKQotCQlyZXR1cm4gTlVMTDsKLQlDRlN0cmluZ1RyaW0oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgdHJpbVN0cmluZyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnRyaW1TdHJpbmcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDRlN0cmluZ1RyaW0oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgdHJpbVN0cmluZyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGTXV0YWJsZVN0cmluZ1JlZk9ial9DRlN0cmluZ1RyaW1XaGl0ZXNwYWNlKENGTXV0YWJsZVN0cmluZ1JlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBDRlN0cmluZ1RyaW1XaGl0ZXNwYWNlCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdUcmltV2hpdGVzcGFjZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdUcmltV2hpdGVzcGFjZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0ZTdHJpbmdUcmltV2hpdGVzcGFjZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENGU3RyaW5nVHJpbVdoaXRlc3BhY2UoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX21ldGhvZHNbXSA9IHsKLQl7IkNGU3RyaW5nQXBwZW5kIiwgKFB5Q0Z1bmN0aW9uKUNGTXV0YWJsZVN0cmluZ1JlZk9ial9DRlN0cmluZ0FwcGVuZCwgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgYXBwZW5kZWRTdHJpbmcpIC0+IE5vbmUiKX0sCi0JeyJDRlN0cmluZ0FwcGVuZENoYXJhY3RlcnMiLCAoUHlDRnVuY3Rpb24pQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX0NGU3RyaW5nQXBwZW5kQ2hhcmFjdGVycywgMSwKLQkgUHlEb2NfU1RSKCIoQnVmZmVyIGNoYXJzKSAtPiBOb25lIil9LAotCXsiQ0ZTdHJpbmdBcHBlbmRQYXNjYWxTdHJpbmciLCAoUHlDRnVuY3Rpb24pQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX0NGU3RyaW5nQXBwZW5kUGFzY2FsU3RyaW5nLCAxLAotCSBQeURvY19TVFIoIihTdHIyNTUgcFN0ciwgQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZykgLT4gTm9uZSIpfSwKLQl7IkNGU3RyaW5nQXBwZW5kQ1N0cmluZyIsIChQeUNGdW5jdGlvbilDRk11dGFibGVTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdBcHBlbmRDU3RyaW5nLCAxLAotCSBQeURvY19TVFIoIihjaGFyKiBjU3RyLCBDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nKSAtPiBOb25lIil9LAotCXsiQ0ZTdHJpbmdJbnNlcnQiLCAoUHlDRnVuY3Rpb24pQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX0NGU3RyaW5nSW5zZXJ0LCAxLAotCSBQeURvY19TVFIoIihDRkluZGV4IGlkeCwgQ0ZTdHJpbmdSZWYgaW5zZXJ0ZWRTdHIpIC0+IE5vbmUiKX0sCi0JeyJDRlN0cmluZ0RlbGV0ZSIsIChQeUNGdW5jdGlvbilDRk11dGFibGVTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdEZWxldGUsIDEsCi0JIFB5RG9jX1NUUigiKENGUmFuZ2UgcmFuZ2UpIC0+IE5vbmUiKX0sCi0JeyJDRlN0cmluZ1JlcGxhY2UiLCAoUHlDRnVuY3Rpb24pQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX0NGU3RyaW5nUmVwbGFjZSwgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZSYW5nZSByYW5nZSwgQ0ZTdHJpbmdSZWYgcmVwbGFjZW1lbnQpIC0+IE5vbmUiKX0sCi0JeyJDRlN0cmluZ1JlcGxhY2VBbGwiLCAoUHlDRnVuY3Rpb24pQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX0NGU3RyaW5nUmVwbGFjZUFsbCwgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgcmVwbGFjZW1lbnQpIC0+IE5vbmUiKX0sCi0JeyJDRlN0cmluZ1BhZCIsIChQeUNGdW5jdGlvbilDRk11dGFibGVTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdQYWQsIDEsCi0JIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIHBhZFN0cmluZywgQ0ZJbmRleCBsZW5ndGgsIENGSW5kZXggaW5kZXhJbnRvUGFkKSAtPiBOb25lIil9LAotCXsiQ0ZTdHJpbmdUcmltIiwgKFB5Q0Z1bmN0aW9uKUNGTXV0YWJsZVN0cmluZ1JlZk9ial9DRlN0cmluZ1RyaW0sIDEsCi0JIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIHRyaW1TdHJpbmcpIC0+IE5vbmUiKX0sCi0JeyJDRlN0cmluZ1RyaW1XaGl0ZXNwYWNlIiwgKFB5Q0Z1bmN0aW9uKUNGTXV0YWJsZVN0cmluZ1JlZk9ial9DRlN0cmluZ1RyaW1XaGl0ZXNwYWNlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0Je05VTEwsIE5VTEwsIDB9CisgICAgeyJDRlN0cmluZ0FwcGVuZCIsIChQeUNGdW5jdGlvbilDRk11dGFibGVTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdBcHBlbmQsIDEsCisgICAgIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIGFwcGVuZGVkU3RyaW5nKSAtPiBOb25lIil9LAorICAgIHsiQ0ZTdHJpbmdBcHBlbmRDaGFyYWN0ZXJzIiwgKFB5Q0Z1bmN0aW9uKUNGTXV0YWJsZVN0cmluZ1JlZk9ial9DRlN0cmluZ0FwcGVuZENoYXJhY3RlcnMsIDEsCisgICAgIFB5RG9jX1NUUigiKEJ1ZmZlciBjaGFycykgLT4gTm9uZSIpfSwKKyAgICB7IkNGU3RyaW5nQXBwZW5kUGFzY2FsU3RyaW5nIiwgKFB5Q0Z1bmN0aW9uKUNGTXV0YWJsZVN0cmluZ1JlZk9ial9DRlN0cmluZ0FwcGVuZFBhc2NhbFN0cmluZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoU3RyMjU1IHBTdHIsIENGU3RyaW5nRW5jb2RpbmcgZW5jb2RpbmcpIC0+IE5vbmUiKX0sCisgICAgeyJDRlN0cmluZ0FwcGVuZENTdHJpbmciLCAoUHlDRnVuY3Rpb24pQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX0NGU3RyaW5nQXBwZW5kQ1N0cmluZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoY2hhciogY1N0ciwgQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZykgLT4gTm9uZSIpfSwKKyAgICB7IkNGU3RyaW5nSW5zZXJ0IiwgKFB5Q0Z1bmN0aW9uKUNGTXV0YWJsZVN0cmluZ1JlZk9ial9DRlN0cmluZ0luc2VydCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZJbmRleCBpZHgsIENGU3RyaW5nUmVmIGluc2VydGVkU3RyKSAtPiBOb25lIil9LAorICAgIHsiQ0ZTdHJpbmdEZWxldGUiLCAoUHlDRnVuY3Rpb24pQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX0NGU3RyaW5nRGVsZXRlLCAxLAorICAgICBQeURvY19TVFIoIihDRlJhbmdlIHJhbmdlKSAtPiBOb25lIil9LAorICAgIHsiQ0ZTdHJpbmdSZXBsYWNlIiwgKFB5Q0Z1bmN0aW9uKUNGTXV0YWJsZVN0cmluZ1JlZk9ial9DRlN0cmluZ1JlcGxhY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKENGUmFuZ2UgcmFuZ2UsIENGU3RyaW5nUmVmIHJlcGxhY2VtZW50KSAtPiBOb25lIil9LAorICAgIHsiQ0ZTdHJpbmdSZXBsYWNlQWxsIiwgKFB5Q0Z1bmN0aW9uKUNGTXV0YWJsZVN0cmluZ1JlZk9ial9DRlN0cmluZ1JlcGxhY2VBbGwsIDEsCisgICAgIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIHJlcGxhY2VtZW50KSAtPiBOb25lIil9LAorICAgIHsiQ0ZTdHJpbmdQYWQiLCAoUHlDRnVuY3Rpb24pQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX0NGU3RyaW5nUGFkLCAxLAorICAgICBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBwYWRTdHJpbmcsIENGSW5kZXggbGVuZ3RoLCBDRkluZGV4IGluZGV4SW50b1BhZCkgLT4gTm9uZSIpfSwKKyAgICB7IkNGU3RyaW5nVHJpbSIsIChQeUNGdW5jdGlvbilDRk11dGFibGVTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdUcmltLCAxLAorICAgICBQeURvY19TVFIoIihDRlN0cmluZ1JlZiB0cmltU3RyaW5nKSAtPiBOb25lIil9LAorICAgIHsiQ0ZTdHJpbmdUcmltV2hpdGVzcGFjZSIsIChQeUNGdW5jdGlvbilDRk11dGFibGVTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdUcmltV2hpdGVzcGFjZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogI2RlZmluZSBDRk11dGFibGVTdHJpbmdSZWZPYmpfZ2V0c2V0bGlzdCBOVUxMCkBAIC0yODIzLDEwMCArMjgyMywxMDAgQEAKIAogc3RhdGljIGludCBDRk11dGFibGVTdHJpbmdSZWZPYmpfY29tcGFyZShDRk11dGFibGVTdHJpbmdSZWZPYmplY3QgKnNlbGYsIENGTXV0YWJsZVN0cmluZ1JlZk9iamVjdCAqb3RoZXIpCiB7Ci0JLyogWFhYWCBPciBzaG91bGQgd2UgdXNlIENGRXF1YWw/PyAqLwotCWlmICggc2VsZi0+b2JfaXRzZWxmID4gb3RoZXItPm9iX2l0c2VsZiApIHJldHVybiAxOwotCWlmICggc2VsZi0+b2JfaXRzZWxmIDwgb3RoZXItPm9iX2l0c2VsZiApIHJldHVybiAtMTsKLQlyZXR1cm4gMDsKKyAgICAvKiBYWFhYIE9yIHNob3VsZCB3ZSB1c2UgQ0ZFcXVhbD8/ICovCisgICAgaWYgKCBzZWxmLT5vYl9pdHNlbGYgPiBvdGhlci0+b2JfaXRzZWxmICkgcmV0dXJuIDE7CisgICAgaWYgKCBzZWxmLT5vYl9pdHNlbGYgPCBvdGhlci0+b2JfaXRzZWxmICkgcmV0dXJuIC0xOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKiBDRk11dGFibGVTdHJpbmdSZWZPYmpfcmVwcihDRk11dGFibGVTdHJpbmdSZWZPYmplY3QgKnNlbGYpCiB7Ci0JY2hhciBidWZbMTAwXTsKLQlzcHJpbnRmKGJ1ZiwgIjxDRk11dGFibGVTdHJpbmdSZWYgb2JqZWN0IGF0IDB4JTguOHggZm9yIDB4JTguOHg+IiwgKHVuc2lnbmVkKXNlbGYsICh1bnNpZ25lZClzZWxmLT5vYl9pdHNlbGYpOwotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CisgICAgY2hhciBidWZbMTAwXTsKKyAgICBzcHJpbnRmKGJ1ZiwgIjxDRk11dGFibGVTdHJpbmdSZWYgb2JqZWN0IGF0IDB4JTguOHggZm9yIDB4JTguOHg+IiwgKHVuc2lnbmVkKXNlbGYsICh1bnNpZ25lZClzZWxmLT5vYl9pdHNlbGYpOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CiB9CiAKIHN0YXRpYyBpbnQgQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX2hhc2goQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqZWN0ICpzZWxmKQogewotCS8qIFhYWFggT3Igc2hvdWxkIHdlIHVzZSBDRkhhc2g/PyAqLwotCXJldHVybiAoaW50KXNlbGYtPm9iX2l0c2VsZjsKKyAgICAvKiBYWFhYIE9yIHNob3VsZCB3ZSB1c2UgQ0ZIYXNoPz8gKi8KKyAgICByZXR1cm4gKGludClzZWxmLT5vYl9pdHNlbGY7CiB9CiBzdGF0aWMgaW50IENGTXV0YWJsZVN0cmluZ1JlZk9ial90cF9pbml0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzLCBQeU9iamVjdCAqX2t3ZHMpCiB7Ci0JQ0ZNdXRhYmxlU3RyaW5nUmVmIGl0c2VsZjsKLQljaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKKyAgICBDRk11dGFibGVTdHJpbmdSZWYgaXRzZWxmOworICAgIGNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OwogCi0JaWYgKFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBDRk11dGFibGVTdHJpbmdSZWZPYmpfQ29udmVydCwgJml0c2VsZikpCi0JewotCQkoKENGTXV0YWJsZVN0cmluZ1JlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCQlyZXR1cm4gMDsKLQl9CisgICAgaWYgKFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBDRk11dGFibGVTdHJpbmdSZWZPYmpfQ29udmVydCwgJml0c2VsZikpCisgICAgeworICAgICAgICAoKENGTXV0YWJsZVN0cmluZ1JlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLQkvKiBBbnkgQ0ZUeXBlUmVmIGRlc2NlbmRlbnQgaXMgYWxsb3dlZCBhcyBpbml0aWFsaXplciB0b28gKi8KLQlpZiAoUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIENGVHlwZVJlZk9ial9Db252ZXJ0LCAmaXRzZWxmKSkKLQl7Ci0JCSgoQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JCXJldHVybiAwOwotCX0KLQlyZXR1cm4gLTE7CisgICAgLyogQW55IENGVHlwZVJlZiBkZXNjZW5kZW50IGlzIGFsbG93ZWQgYXMgaW5pdGlhbGl6ZXIgdG9vICovCisgICAgaWYgKFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBDRlR5cGVSZWZPYmpfQ29udmVydCwgJml0c2VsZikpCisgICAgeworICAgICAgICAoKENGTXV0YWJsZVN0cmluZ1JlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIC0xOwogfQogCiAjZGVmaW5lIENGTXV0YWJsZVN0cmluZ1JlZk9ial90cF9hbGxvYyBQeVR5cGVfR2VuZXJpY0FsbG9jCiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX3RwX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICpfYXJncywgUHlPYmplY3QgKl9rd2RzKQogewotCVB5T2JqZWN0ICpzZWxmOwotCWlmICgoc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkoKENGTXV0YWJsZVN0cmluZ1JlZk9iamVjdCAqKXNlbGYpLT5vYl9pdHNlbGYgPSBOVUxMOwotCSgoQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqZWN0ICopc2VsZiktPm9iX2ZyZWVpdCA9IENGUmVsZWFzZTsKLQlyZXR1cm4gc2VsZjsKKyAgICBQeU9iamVjdCAqc2VsZjsKKyAgICBpZiAoKHNlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgKChDRk11dGFibGVTdHJpbmdSZWZPYmplY3QgKilzZWxmKS0+b2JfaXRzZWxmID0gTlVMTDsKKyAgICAoKENGTXV0YWJsZVN0cmluZ1JlZk9iamVjdCAqKXNlbGYpLT5vYl9mcmVlaXQgPSBDRlJlbGVhc2U7CisgICAgcmV0dXJuIHNlbGY7CiB9CiAKICNkZWZpbmUgQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX3RwX2ZyZWUgUHlPYmplY3RfRGVsCiAKIAogUHlUeXBlT2JqZWN0IENGTXV0YWJsZVN0cmluZ1JlZl9UeXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQotCTAsIC8qb2Jfc2l6ZSovCi0JIl9DRi5DRk11dGFibGVTdHJpbmdSZWYiLCAvKnRwX25hbWUqLwotCXNpemVvZihDRk11dGFibGVTdHJpbmdSZWZPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCi0JMCwgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKSBDRk11dGFibGVTdHJpbmdSZWZPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KLQkwLCAvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykgQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCi0JKHJlcHJmdW5jKSBDRk11dGFibGVTdHJpbmdSZWZPYmpfcmVwciwgLyp0cF9yZXByKi8KLQkoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCi0JKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpIENGTXV0YWJsZVN0cmluZ1JlZk9ial9oYXNoLCAvKnRwX2hhc2gqLwotCTAsIC8qdHBfY2FsbCovCi0JMCwgLyp0cF9zdHIqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KLQlQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLwotCTAsIC8qdHBfYXNfYnVmZmVyKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQkwLCAvKnRwX2RvYyovCi0JMCwgLyp0cF90cmF2ZXJzZSovCi0JMCwgLyp0cF9jbGVhciovCi0JMCwgLyp0cF9yaWNoY29tcGFyZSovCi0JMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCi0JMCwgLyp0cF9pdGVyKi8KLQkwLCAvKnRwX2l0ZXJuZXh0Ki8KLQlDRk11dGFibGVTdHJpbmdSZWZPYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLwotCTAsIC8qdHBfbWVtYmVycyovCi0JQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KLQkwLCAvKnRwX2Jhc2UqLwotCTAsIC8qdHBfZGljdCovCi0JMCwgLyp0cF9kZXNjcl9nZXQqLwotCTAsIC8qdHBfZGVzY3Jfc2V0Ki8KLQkwLCAvKnRwX2RpY3RvZmZzZXQqLwotCUNGTXV0YWJsZVN0cmluZ1JlZk9ial90cF9pbml0LCAvKiB0cF9pbml0ICovCi0JQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLwotCUNGTXV0YWJsZVN0cmluZ1JlZk9ial90cF9uZXcsIC8qIHRwX25ldyAqLwotCUNGTXV0YWJsZVN0cmluZ1JlZk9ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgLypvYl9zaXplKi8KKyAgICAiX0NGLkNGTXV0YWJsZVN0cmluZ1JlZiIsIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKENGTXV0YWJsZVN0cmluZ1JlZk9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpIENGTXV0YWJsZVN0cmluZ1JlZk9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgIDAsIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLworICAgIChzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLworICAgIChjbXBmdW5jKSBDRk11dGFibGVTdHJpbmdSZWZPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpIENGTXV0YWJsZVN0cmluZ1JlZk9ial9yZXByLCAvKnRwX3JlcHIqLworICAgIChQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIChQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLworICAgIChoYXNoZnVuYykgQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX2hhc2gsIC8qdHBfaGFzaCovCisgICAgMCwgLyp0cF9jYWxsKi8KKyAgICAwLCAvKnRwX3N0ciovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLworICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCisgICAgMCwgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLworICAgIDAsIC8qdHBfZG9jKi8KKyAgICAwLCAvKnRwX3RyYXZlcnNlKi8KKyAgICAwLCAvKnRwX2NsZWFyKi8KKyAgICAwLCAvKnRwX3JpY2hjb21wYXJlKi8KKyAgICAwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KKyAgICAwLCAvKnRwX2l0ZXIqLworICAgIDAsIC8qdHBfaXRlcm5leHQqLworICAgIENGTXV0YWJsZVN0cmluZ1JlZk9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCisgICAgMCwgLyp0cF9tZW1iZXJzKi8KKyAgICBDRk11dGFibGVTdHJpbmdSZWZPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLworICAgIDAsIC8qdHBfYmFzZSovCisgICAgMCwgLyp0cF9kaWN0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX2dldCovCisgICAgMCwgLyp0cF9kZXNjcl9zZXQqLworICAgIDAsIC8qdHBfZGljdG9mZnNldCovCisgICAgQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KKyAgICBDRk11dGFibGVTdHJpbmdSZWZPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCisgICAgQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX3RwX25ldywgLyogdHBfbmV3ICovCisgICAgQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLSBFbmQgb2JqZWN0IHR5cGUgQ0ZNdXRhYmxlU3RyaW5nUmVmIC0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMjkyOSw1NDUgKzI5MjksNTQ1IEBACiAjZGVmaW5lIENGVVJMUmVmT2JqX0NoZWNrKHgpICgoeCktPm9iX3R5cGUgPT0gJkNGVVJMUmVmX1R5cGUgfHwgUHlPYmplY3RfVHlwZUNoZWNrKCh4KSwgJkNGVVJMUmVmX1R5cGUpKQogCiB0eXBlZGVmIHN0cnVjdCBDRlVSTFJlZk9iamVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCUNGVVJMUmVmIG9iX2l0c2VsZjsKLQl2b2lkICgqb2JfZnJlZWl0KShDRlR5cGVSZWYgcHRyKTsKKyAgICBQeU9iamVjdF9IRUFECisgICAgQ0ZVUkxSZWYgb2JfaXRzZWxmOworICAgIHZvaWQgKCpvYl9mcmVlaXQpKENGVHlwZVJlZiBwdHIpOwogfSBDRlVSTFJlZk9iamVjdDsKIAogUHlPYmplY3QgKkNGVVJMUmVmT2JqX05ldyhDRlVSTFJlZiBpdHNlbGYpCiB7Ci0JQ0ZVUkxSZWZPYmplY3QgKml0OwotCWlmIChpdHNlbGYgPT0gTlVMTCkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJjYW5ub3Qgd3JhcCBOVUxMIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpdCA9IFB5T2JqZWN0X05FVyhDRlVSTFJlZk9iamVjdCwgJkNGVVJMUmVmX1R5cGUpOwotCWlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkvKiBYWFhYIFNob3VsZCB3ZSB0cF9pbml0IG9yIHRwX25ldyBvdXIgYmFzZXR5cGU/ICovCi0JaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlpdC0+b2JfZnJlZWl0ID0gQ0ZSZWxlYXNlOwotCXJldHVybiAoUHlPYmplY3QgKilpdDsKKyAgICBDRlVSTFJlZk9iamVjdCAqaXQ7CisgICAgaWYgKGl0c2VsZiA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgImNhbm5vdCB3cmFwIE5VTEwiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGl0ID0gUHlPYmplY3RfTkVXKENGVVJMUmVmT2JqZWN0LCAmQ0ZVUkxSZWZfVHlwZSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIC8qIFhYWFggU2hvdWxkIHdlIHRwX2luaXQgb3IgdHBfbmV3IG91ciBiYXNldHlwZT8gKi8KKyAgICBpdC0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIGl0LT5vYl9mcmVlaXQgPSBDRlJlbGVhc2U7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogCiBpbnQgQ0ZVUkxSZWZPYmpfQ29udmVydChQeU9iamVjdCAqdiwgQ0ZVUkxSZWYgKnBfaXRzZWxmKQogewogCi0JaWYgKHYgPT0gUHlfTm9uZSkgeyAqcF9pdHNlbGYgPSBOVUxMOyByZXR1cm4gMTsgfQotCS8qIENoZWNrIGZvciBvdGhlciBDRiBvYmplY3RzIGhlcmUgKi8KKyAgICBpZiAodiA9PSBQeV9Ob25lKSB7ICpwX2l0c2VsZiA9IE5VTEw7IHJldHVybiAxOyB9CisgICAgLyogQ2hlY2sgZm9yIG90aGVyIENGIG9iamVjdHMgaGVyZSAqLwogCi0JaWYgKCFDRlVSTFJlZk9ial9DaGVjayh2KSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJDRlVSTFJlZiByZXF1aXJlZCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JKnBfaXRzZWxmID0gKChDRlVSTFJlZk9iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0JcmV0dXJuIDE7CisgICAgaWYgKCFDRlVSTFJlZk9ial9DaGVjayh2KSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJDRlVSTFJlZiByZXF1aXJlZCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgKnBfaXRzZWxmID0gKChDRlVSTFJlZk9iamVjdCAqKXYpLT5vYl9pdHNlbGY7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyB2b2lkIENGVVJMUmVmT2JqX2RlYWxsb2MoQ0ZVUkxSZWZPYmplY3QgKnNlbGYpCiB7Ci0JaWYgKHNlbGYtPm9iX2ZyZWVpdCAmJiBzZWxmLT5vYl9pdHNlbGYpCi0JewotCQlzZWxmLT5vYl9mcmVlaXQoKENGVHlwZVJlZilzZWxmLT5vYl9pdHNlbGYpOwotCQlzZWxmLT5vYl9pdHNlbGYgPSBOVUxMOwotCX0KLQlDRlR5cGVSZWZfVHlwZS50cF9kZWFsbG9jKChQeU9iamVjdCAqKXNlbGYpOworICAgIGlmIChzZWxmLT5vYl9mcmVlaXQgJiYgc2VsZi0+b2JfaXRzZWxmKQorICAgIHsKKyAgICAgICAgc2VsZi0+b2JfZnJlZWl0KChDRlR5cGVSZWYpc2VsZi0+b2JfaXRzZWxmKTsKKyAgICAgICAgc2VsZi0+b2JfaXRzZWxmID0gTlVMTDsKKyAgICB9CisgICAgQ0ZUeXBlUmVmX1R5cGUudHBfZGVhbGxvYygoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRlVSTFJlZk9ial9DRlVSTENyZWF0ZURhdGEoQ0ZVUkxSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGRGF0YVJlZiBfcnY7Ci0JQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZzsKLQlCb29sZWFuIGVzY2FwZVdoaXRlc3BhY2U7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZW5jb2RpbmcsCi0JICAgICAgICAgICAgICAgICAgICAgICZlc2NhcGVXaGl0ZXNwYWNlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZVUkxDcmVhdGVEYXRhKChDRkFsbG9jYXRvclJlZilOVUxMLAotCSAgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZywKLQkgICAgICAgICAgICAgICAgICAgICAgZXNjYXBlV2hpdGVzcGFjZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRkRhdGFSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRkRhdGFSZWYgX3J2OworICAgIENGU3RyaW5nRW5jb2RpbmcgZW5jb2Rpbmc7CisgICAgQm9vbGVhbiBlc2NhcGVXaGl0ZXNwYWNlOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmVuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZXNjYXBlV2hpdGVzcGFjZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGVVJMQ3JlYXRlRGF0YSgoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGVzY2FwZVdoaXRlc3BhY2UpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZEYXRhUmVmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRlVSTFJlZk9ial9DRlVSTEdldEZpbGVTeXN0ZW1SZXByZXNlbnRhdGlvbihDRlVSTFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JQm9vbGVhbiByZXNvbHZlQWdhaW5zdEJhc2U7Ci0JVUludDggYnVmZmVyOwotCUNGSW5kZXggbWF4QnVmTGVuOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBCb29sZWFuIHJlc29sdmVBZ2FpbnN0QmFzZTsKKyAgICBVSW50OCBidWZmZXI7CisgICAgQ0ZJbmRleCBtYXhCdWZMZW47CiAjaWZuZGVmIENGVVJMR2V0RmlsZVN5c3RlbVJlcHJlc2VudGF0aW9uCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZVUkxHZXRGaWxlU3lzdGVtUmVwcmVzZW50YXRpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKENGVVJMR2V0RmlsZVN5c3RlbVJlcHJlc2VudGF0aW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJlc29sdmVBZ2FpbnN0QmFzZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1heEJ1ZkxlbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGVVJMR2V0RmlsZVN5c3RlbVJlcHJlc2VudGF0aW9uKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZUFnYWluc3RCYXNlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZidWZmZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4QnVmTGVuKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBidWZmZXIpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc29sdmVBZ2FpbnN0QmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1heEJ1ZkxlbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGVVJMR2V0RmlsZVN5c3RlbVJlcHJlc2VudGF0aW9uKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZUFnYWluc3RCYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4QnVmTGVuKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGVVJMUmVmT2JqX0NGVVJMQ29weUFic29sdXRlVVJMKENGVVJMUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlVSTFJlZiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGVVJMUmVmIF9ydjsKICNpZm5kZWYgQ0ZVUkxDb3B5QWJzb2x1dGVVUkwKLQlQeU1hY19QUkVDSEVDSyhDRlVSTENvcHlBYnNvbHV0ZVVSTCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZVUkxDb3B5QWJzb2x1dGVVUkwpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGVVJMQ29weUFic29sdXRlVVJMKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZVUkxSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlVSTENvcHlBYnNvbHV0ZVVSTChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGVVJMUmVmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRlVSTFJlZk9ial9DRlVSTEdldFN0cmluZyhDRlVSTFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZTdHJpbmdSZWYgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlN0cmluZ1JlZiBfcnY7CiAjaWZuZGVmIENGVVJMR2V0U3RyaW5nCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZVUkxHZXRTdHJpbmcpOworICAgIFB5TWFjX1BSRUNIRUNLKENGVVJMR2V0U3RyaW5nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRlVSTEdldFN0cmluZyhfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZVUkxHZXRTdHJpbmcoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZVUkxSZWZPYmpfQ0ZVUkxHZXRCYXNlVVJMKENGVVJMUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlVSTFJlZiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGVVJMUmVmIF9ydjsKICNpZm5kZWYgQ0ZVUkxHZXRCYXNlVVJMCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZVUkxHZXRCYXNlVVJMKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlVSTEdldEJhc2VVUkwpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGVVJMR2V0QmFzZVVSTChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGVVJMUmVmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZVUkxHZXRCYXNlVVJMKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZVUkxSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGVVJMUmVmT2JqX0NGVVJMQ2FuQmVEZWNvbXBvc2VkKENGVVJMUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CiAjaWZuZGVmIENGVVJMQ2FuQmVEZWNvbXBvc2VkCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZVUkxDYW5CZURlY29tcG9zZWQpOworICAgIFB5TWFjX1BSRUNIRUNLKENGVVJMQ2FuQmVEZWNvbXBvc2VkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRlVSTENhbkJlRGVjb21wb3NlZChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZVUkxDYW5CZURlY29tcG9zZWQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZVUkxSZWZPYmpfQ0ZVUkxDb3B5U2NoZW1lKENGVVJMUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ1JlZiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGU3RyaW5nUmVmIF9ydjsKICNpZm5kZWYgQ0ZVUkxDb3B5U2NoZW1lCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZVUkxDb3B5U2NoZW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlVSTENvcHlTY2hlbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGVVJMQ29weVNjaGVtZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZVUkxDb3B5U2NoZW1lKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGVVJMUmVmT2JqX0NGVVJMQ29weU5ldExvY2F0aW9uKENGVVJMUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ1JlZiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGU3RyaW5nUmVmIF9ydjsKICNpZm5kZWYgQ0ZVUkxDb3B5TmV0TG9jYXRpb24KLQlQeU1hY19QUkVDSEVDSyhDRlVSTENvcHlOZXRMb2NhdGlvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZVUkxDb3B5TmV0TG9jYXRpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGVVJMQ29weU5ldExvY2F0aW9uKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlVSTENvcHlOZXRMb2NhdGlvbihfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRlVSTFJlZk9ial9DRlVSTENvcHlQYXRoKENGVVJMUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ1JlZiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGU3RyaW5nUmVmIF9ydjsKICNpZm5kZWYgQ0ZVUkxDb3B5UGF0aAotCVB5TWFjX1BSRUNIRUNLKENGVVJMQ29weVBhdGgpOworICAgIFB5TWFjX1BSRUNIRUNLKENGVVJMQ29weVBhdGgpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGVVJMQ29weVBhdGgoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGVVJMQ29weVBhdGgoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZVUkxSZWZPYmpfQ0ZVUkxDb3B5U3RyaWN0UGF0aChDRlVSTFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZTdHJpbmdSZWYgX3J2OwotCUJvb2xlYW4gaXNBYnNvbHV0ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZTdHJpbmdSZWYgX3J2OworICAgIEJvb2xlYW4gaXNBYnNvbHV0ZTsKICNpZm5kZWYgQ0ZVUkxDb3B5U3RyaWN0UGF0aAotCVB5TWFjX1BSRUNIRUNLKENGVVJMQ29weVN0cmljdFBhdGgpOworICAgIFB5TWFjX1BSRUNIRUNLKENGVVJMQ29weVN0cmljdFBhdGgpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGVVJMQ29weVN0cmljdFBhdGgoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZpc0Fic29sdXRlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBpc0Fic29sdXRlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZVUkxDb3B5U3RyaWN0UGF0aChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlzQWJzb2x1dGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGlzQWJzb2x1dGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGVVJMUmVmT2JqX0NGVVJMQ29weUZpbGVTeXN0ZW1QYXRoKENGVVJMUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ1JlZiBfcnY7Ci0JQ0ZVUkxQYXRoU3R5bGUgcGF0aFN0eWxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlN0cmluZ1JlZiBfcnY7CisgICAgQ0ZVUkxQYXRoU3R5bGUgcGF0aFN0eWxlOwogI2lmbmRlZiBDRlVSTENvcHlGaWxlU3lzdGVtUGF0aAotCVB5TWFjX1BSRUNIRUNLKENGVVJMQ29weUZpbGVTeXN0ZW1QYXRoKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlVSTENvcHlGaWxlU3lzdGVtUGF0aCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnBhdGhTdHlsZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGVVJMQ29weUZpbGVTeXN0ZW1QYXRoKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aFN0eWxlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhdGhTdHlsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGVVJMQ29weUZpbGVTeXN0ZW1QYXRoKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aFN0eWxlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRlVSTFJlZk9ial9DRlVSTEhhc0RpcmVjdG9yeVBhdGgoQ0ZVUkxSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKICNpZm5kZWYgQ0ZVUkxIYXNEaXJlY3RvcnlQYXRoCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZVUkxIYXNEaXJlY3RvcnlQYXRoKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlVSTEhhc0RpcmVjdG9yeVBhdGgpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGVVJMSGFzRGlyZWN0b3J5UGF0aChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZVUkxIYXNEaXJlY3RvcnlQYXRoKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGVVJMUmVmT2JqX0NGVVJMQ29weVJlc291cmNlU3BlY2lmaWVyKENGVVJMUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ1JlZiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGU3RyaW5nUmVmIF9ydjsKICNpZm5kZWYgQ0ZVUkxDb3B5UmVzb3VyY2VTcGVjaWZpZXIKLQlQeU1hY19QUkVDSEVDSyhDRlVSTENvcHlSZXNvdXJjZVNwZWNpZmllcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZVUkxDb3B5UmVzb3VyY2VTcGVjaWZpZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGVVJMQ29weVJlc291cmNlU3BlY2lmaWVyKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlVSTENvcHlSZXNvdXJjZVNwZWNpZmllcihfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRlVSTFJlZk9ial9DRlVSTENvcHlIb3N0TmFtZShDRlVSTFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZTdHJpbmdSZWYgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlN0cmluZ1JlZiBfcnY7CiAjaWZuZGVmIENGVVJMQ29weUhvc3ROYW1lCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZVUkxDb3B5SG9zdE5hbWUpOworICAgIFB5TWFjX1BSRUNIRUNLKENGVVJMQ29weUhvc3ROYW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRlVSTENvcHlIb3N0TmFtZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZVUkxDb3B5SG9zdE5hbWUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZVUkxSZWZPYmpfQ0ZVUkxHZXRQb3J0TnVtYmVyKENGVVJMUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTSW50MzIgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTSW50MzIgX3J2OwogI2lmbmRlZiBDRlVSTEdldFBvcnROdW1iZXIKLQlQeU1hY19QUkVDSEVDSyhDRlVSTEdldFBvcnROdW1iZXIpOworICAgIFB5TWFjX1BSRUNIRUNLKENGVVJMR2V0UG9ydE51bWJlcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZVUkxHZXRQb3J0TnVtYmVyKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlVSTEdldFBvcnROdW1iZXIoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZVUkxSZWZPYmpfQ0ZVUkxDb3B5VXNlck5hbWUoQ0ZVUkxSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGU3RyaW5nUmVmIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZTdHJpbmdSZWYgX3J2OwogI2lmbmRlZiBDRlVSTENvcHlVc2VyTmFtZQotCVB5TWFjX1BSRUNIRUNLKENGVVJMQ29weVVzZXJOYW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlVSTENvcHlVc2VyTmFtZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZVUkxDb3B5VXNlck5hbWUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGVVJMQ29weVVzZXJOYW1lKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGVVJMUmVmT2JqX0NGVVJMQ29weVBhc3N3b3JkKENGVVJMUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ1JlZiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGU3RyaW5nUmVmIF9ydjsKICNpZm5kZWYgQ0ZVUkxDb3B5UGFzc3dvcmQKLQlQeU1hY19QUkVDSEVDSyhDRlVSTENvcHlQYXNzd29yZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZVUkxDb3B5UGFzc3dvcmQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGVVJMQ29weVBhc3N3b3JkKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlVSTENvcHlQYXNzd29yZChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRlVSTFJlZk9ial9DRlVSTENvcHlQYXJhbWV0ZXJTdHJpbmcoQ0ZVUkxSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGU3RyaW5nUmVmIF9ydjsKLQlDRlN0cmluZ1JlZiBjaGFyYWN0ZXJzVG9MZWF2ZUVzY2FwZWQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGU3RyaW5nUmVmIF9ydjsKKyAgICBDRlN0cmluZ1JlZiBjaGFyYWN0ZXJzVG9MZWF2ZUVzY2FwZWQ7CiAjaWZuZGVmIENGVVJMQ29weVBhcmFtZXRlclN0cmluZwotCVB5TWFjX1BSRUNIRUNLKENGVVJMQ29weVBhcmFtZXRlclN0cmluZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZVUkxDb3B5UGFyYW1ldGVyU3RyaW5nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmNoYXJhY3RlcnNUb0xlYXZlRXNjYXBlZCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGVVJMQ29weVBhcmFtZXRlclN0cmluZyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXJzVG9MZWF2ZUVzY2FwZWQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmNoYXJhY3RlcnNUb0xlYXZlRXNjYXBlZCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGVVJMQ29weVBhcmFtZXRlclN0cmluZyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXJzVG9MZWF2ZUVzY2FwZWQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGVVJMUmVmT2JqX0NGVVJMQ29weVF1ZXJ5U3RyaW5nKENGVVJMUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ1JlZiBfcnY7Ci0JQ0ZTdHJpbmdSZWYgY2hhcmFjdGVyc1RvTGVhdmVFc2NhcGVkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlN0cmluZ1JlZiBfcnY7CisgICAgQ0ZTdHJpbmdSZWYgY2hhcmFjdGVyc1RvTGVhdmVFc2NhcGVkOwogI2lmbmRlZiBDRlVSTENvcHlRdWVyeVN0cmluZwotCVB5TWFjX1BSRUNIRUNLKENGVVJMQ29weVF1ZXJ5U3RyaW5nKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlVSTENvcHlRdWVyeVN0cmluZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZjaGFyYWN0ZXJzVG9MZWF2ZUVzY2FwZWQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRlVSTENvcHlRdWVyeVN0cmluZyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlcnNUb0xlYXZlRXNjYXBlZCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmY2hhcmFjdGVyc1RvTGVhdmVFc2NhcGVkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZVUkxDb3B5UXVlcnlTdHJpbmcoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXJzVG9MZWF2ZUVzY2FwZWQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGVVJMUmVmT2JqX0NGVVJMQ29weUZyYWdtZW50KENGVVJMUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ1JlZiBfcnY7Ci0JQ0ZTdHJpbmdSZWYgY2hhcmFjdGVyc1RvTGVhdmVFc2NhcGVkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlN0cmluZ1JlZiBfcnY7CisgICAgQ0ZTdHJpbmdSZWYgY2hhcmFjdGVyc1RvTGVhdmVFc2NhcGVkOwogI2lmbmRlZiBDRlVSTENvcHlGcmFnbWVudAotCVB5TWFjX1BSRUNIRUNLKENGVVJMQ29weUZyYWdtZW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlVSTENvcHlGcmFnbWVudCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZjaGFyYWN0ZXJzVG9MZWF2ZUVzY2FwZWQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRlVSTENvcHlGcmFnbWVudChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlcnNUb0xlYXZlRXNjYXBlZCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmY2hhcmFjdGVyc1RvTGVhdmVFc2NhcGVkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZVUkxDb3B5RnJhZ21lbnQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXJzVG9MZWF2ZUVzY2FwZWQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGVVJMUmVmT2JqX0NGVVJMQ29weUxhc3RQYXRoQ29tcG9uZW50KENGVVJMUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ1JlZiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGU3RyaW5nUmVmIF9ydjsKICNpZm5kZWYgQ0ZVUkxDb3B5TGFzdFBhdGhDb21wb25lbnQKLQlQeU1hY19QUkVDSEVDSyhDRlVSTENvcHlMYXN0UGF0aENvbXBvbmVudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZVUkxDb3B5TGFzdFBhdGhDb21wb25lbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGVVJMQ29weUxhc3RQYXRoQ29tcG9uZW50KF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlVSTENvcHlMYXN0UGF0aENvbXBvbmVudChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRlVSTFJlZk9ial9DRlVSTENvcHlQYXRoRXh0ZW5zaW9uKENGVVJMUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ1JlZiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGU3RyaW5nUmVmIF9ydjsKICNpZm5kZWYgQ0ZVUkxDb3B5UGF0aEV4dGVuc2lvbgotCVB5TWFjX1BSRUNIRUNLKENGVVJMQ29weVBhdGhFeHRlbnNpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKENGVVJMQ29weVBhdGhFeHRlbnNpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGVVJMQ29weVBhdGhFeHRlbnNpb24oX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGVVJMQ29weVBhdGhFeHRlbnNpb24oX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZVUkxSZWZPYmpfQ0ZVUkxDcmVhdGVDb3B5QXBwZW5kaW5nUGF0aENvbXBvbmVudChDRlVSTFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZVUkxSZWYgX3J2OwotCUNGU3RyaW5nUmVmIHBhdGhDb21wb25lbnQ7Ci0JQm9vbGVhbiBpc0RpcmVjdG9yeTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmcGF0aENvbXBvbmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlzRGlyZWN0b3J5KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZVUkxDcmVhdGVDb3B5QXBwZW5kaW5nUGF0aENvbXBvbmVudCgoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoQ29tcG9uZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNEaXJlY3RvcnkpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZVUkxSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlVSTFJlZiBfcnY7CisgICAgQ0ZTdHJpbmdSZWYgcGF0aENvbXBvbmVudDsKKyAgICBCb29sZWFuIGlzRGlyZWN0b3J5OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZwYXRoQ29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXNEaXJlY3RvcnkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlVSTENyZWF0ZUNvcHlBcHBlbmRpbmdQYXRoQ29tcG9uZW50KChDRkFsbG9jYXRvclJlZilOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhDb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0RpcmVjdG9yeSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlVSTFJlZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZVUkxSZWZPYmpfQ0ZVUkxDcmVhdGVDb3B5RGVsZXRpbmdMYXN0UGF0aENvbXBvbmVudChDRlVSTFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZVUkxSZWYgX3J2OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRlVSTENyZWF0ZUNvcHlEZWxldGluZ0xhc3RQYXRoQ29tcG9uZW50KChDRkFsbG9jYXRvclJlZilOVUxMLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlVSTFJlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGVVJMUmVmIF9ydjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZVUkxDcmVhdGVDb3B5RGVsZXRpbmdMYXN0UGF0aENvbXBvbmVudCgoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZVUkxSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGVVJMUmVmT2JqX0NGVVJMQ3JlYXRlQ29weUFwcGVuZGluZ1BhdGhFeHRlbnNpb24oQ0ZVUkxSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGVVJMUmVmIF9ydjsKLQlDRlN0cmluZ1JlZiBleHRlbnNpb247Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmZXh0ZW5zaW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZVUkxDcmVhdGVDb3B5QXBwZW5kaW5nUGF0aEV4dGVuc2lvbigoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZVUkxSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlVSTFJlZiBfcnY7CisgICAgQ0ZTdHJpbmdSZWYgZXh0ZW5zaW9uOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmV4dGVuc2lvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGVVJMQ3JlYXRlQ29weUFwcGVuZGluZ1BhdGhFeHRlbnNpb24oKENGQWxsb2NhdG9yUmVmKU5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGVVJMUmVmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRlVSTFJlZk9ial9DRlVSTENyZWF0ZUNvcHlEZWxldGluZ1BhdGhFeHRlbnNpb24oQ0ZVUkxSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGVVJMUmVmIF9ydjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZVUkxDcmVhdGVDb3B5RGVsZXRpbmdQYXRoRXh0ZW5zaW9uKChDRkFsbG9jYXRvclJlZilOVUxMLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGVVJMUmVmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZVUkxSZWYgX3J2OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlVSTENyZWF0ZUNvcHlEZWxldGluZ1BhdGhFeHRlbnNpb24oKENGQWxsb2NhdG9yUmVmKU5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZVUkxSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGVVJMUmVmT2JqX0NGVVJMR2V0RlNSZWYoQ0ZVUkxSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCUZTUmVmIGZzUmVmOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBGU1JlZiBmc1JlZjsKICNpZm5kZWYgQ0ZVUkxHZXRGU1JlZgotCVB5TWFjX1BSRUNIRUNLKENGVVJMR2V0RlNSZWYpOworICAgIFB5TWFjX1BSRUNIRUNLKENGVVJMR2V0RlNSZWYpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGVVJMR2V0RlNSZWYoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICZmc1JlZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRlNSZWYsICZmc1JlZik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGVVJMR2V0RlNSZWYoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICZmc1JlZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRlNSZWYsICZmc1JlZik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBDRlVSTFJlZk9ial9tZXRob2RzW10gPSB7Ci0JeyJDRlVSTENyZWF0ZURhdGEiLCAoUHlDRnVuY3Rpb24pQ0ZVUkxSZWZPYmpfQ0ZVUkxDcmVhdGVEYXRhLCAxLAotCSBQeURvY19TVFIoIihDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nLCBCb29sZWFuIGVzY2FwZVdoaXRlc3BhY2UpIC0+IChDRkRhdGFSZWYgX3J2KSIpfSwKLQl7IkNGVVJMR2V0RmlsZVN5c3RlbVJlcHJlc2VudGF0aW9uIiwgKFB5Q0Z1bmN0aW9uKUNGVVJMUmVmT2JqX0NGVVJMR2V0RmlsZVN5c3RlbVJlcHJlc2VudGF0aW9uLCAxLAotCSBQeURvY19TVFIoIihCb29sZWFuIHJlc29sdmVBZ2FpbnN0QmFzZSwgQ0ZJbmRleCBtYXhCdWZMZW4pIC0+IChCb29sZWFuIF9ydiwgVUludDggYnVmZmVyKSIpfSwKLQl7IkNGVVJMQ29weUFic29sdXRlVVJMIiwgKFB5Q0Z1bmN0aW9uKUNGVVJMUmVmT2JqX0NGVVJMQ29weUFic29sdXRlVVJMLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDRlVSTFJlZiBfcnYpIil9LAotCXsiQ0ZVUkxHZXRTdHJpbmciLCAoUHlDRnVuY3Rpb24pQ0ZVUkxSZWZPYmpfQ0ZVUkxHZXRTdHJpbmcsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENGU3RyaW5nUmVmIF9ydikiKX0sCi0JeyJDRlVSTEdldEJhc2VVUkwiLCAoUHlDRnVuY3Rpb24pQ0ZVUkxSZWZPYmpfQ0ZVUkxHZXRCYXNlVVJMLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDRlVSTFJlZiBfcnYpIil9LAotCXsiQ0ZVUkxDYW5CZURlY29tcG9zZWQiLCAoUHlDRnVuY3Rpb24pQ0ZVUkxSZWZPYmpfQ0ZVUkxDYW5CZURlY29tcG9zZWQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IkNGVVJMQ29weVNjaGVtZSIsIChQeUNGdW5jdGlvbilDRlVSTFJlZk9ial9DRlVSTENvcHlTY2hlbWUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENGU3RyaW5nUmVmIF9ydikiKX0sCi0JeyJDRlVSTENvcHlOZXRMb2NhdGlvbiIsIChQeUNGdW5jdGlvbilDRlVSTFJlZk9ial9DRlVSTENvcHlOZXRMb2NhdGlvbiwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKLQl7IkNGVVJMQ29weVBhdGgiLCAoUHlDRnVuY3Rpb24pQ0ZVUkxSZWZPYmpfQ0ZVUkxDb3B5UGF0aCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKLQl7IkNGVVJMQ29weVN0cmljdFBhdGgiLCAoUHlDRnVuY3Rpb24pQ0ZVUkxSZWZPYmpfQ0ZVUkxDb3B5U3RyaWN0UGF0aCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2LCBCb29sZWFuIGlzQWJzb2x1dGUpIil9LAotCXsiQ0ZVUkxDb3B5RmlsZVN5c3RlbVBhdGgiLCAoUHlDRnVuY3Rpb24pQ0ZVUkxSZWZPYmpfQ0ZVUkxDb3B5RmlsZVN5c3RlbVBhdGgsIDEsCi0JIFB5RG9jX1NUUigiKENGVVJMUGF0aFN0eWxlIHBhdGhTdHlsZSkgLT4gKENGU3RyaW5nUmVmIF9ydikiKX0sCi0JeyJDRlVSTEhhc0RpcmVjdG9yeVBhdGgiLCAoUHlDRnVuY3Rpb24pQ0ZVUkxSZWZPYmpfQ0ZVUkxIYXNEaXJlY3RvcnlQYXRoLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJDRlVSTENvcHlSZXNvdXJjZVNwZWNpZmllciIsIChQeUNGdW5jdGlvbilDRlVSTFJlZk9ial9DRlVSTENvcHlSZXNvdXJjZVNwZWNpZmllciwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKLQl7IkNGVVJMQ29weUhvc3ROYW1lIiwgKFB5Q0Z1bmN0aW9uKUNGVVJMUmVmT2JqX0NGVVJMQ29weUhvc3ROYW1lLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDRlN0cmluZ1JlZiBfcnYpIil9LAotCXsiQ0ZVUkxHZXRQb3J0TnVtYmVyIiwgKFB5Q0Z1bmN0aW9uKUNGVVJMUmVmT2JqX0NGVVJMR2V0UG9ydE51bWJlciwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoU0ludDMyIF9ydikiKX0sCi0JeyJDRlVSTENvcHlVc2VyTmFtZSIsIChQeUNGdW5jdGlvbilDRlVSTFJlZk9ial9DRlVSTENvcHlVc2VyTmFtZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKLQl7IkNGVVJMQ29weVBhc3N3b3JkIiwgKFB5Q0Z1bmN0aW9uKUNGVVJMUmVmT2JqX0NGVVJMQ29weVBhc3N3b3JkLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDRlN0cmluZ1JlZiBfcnYpIil9LAotCXsiQ0ZVUkxDb3B5UGFyYW1ldGVyU3RyaW5nIiwgKFB5Q0Z1bmN0aW9uKUNGVVJMUmVmT2JqX0NGVVJMQ29weVBhcmFtZXRlclN0cmluZywgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgY2hhcmFjdGVyc1RvTGVhdmVFc2NhcGVkKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKLQl7IkNGVVJMQ29weVF1ZXJ5U3RyaW5nIiwgKFB5Q0Z1bmN0aW9uKUNGVVJMUmVmT2JqX0NGVVJMQ29weVF1ZXJ5U3RyaW5nLCAxLAotCSBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBjaGFyYWN0ZXJzVG9MZWF2ZUVzY2FwZWQpIC0+IChDRlN0cmluZ1JlZiBfcnYpIil9LAotCXsiQ0ZVUkxDb3B5RnJhZ21lbnQiLCAoUHlDRnVuY3Rpb24pQ0ZVUkxSZWZPYmpfQ0ZVUkxDb3B5RnJhZ21lbnQsIDEsCi0JIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIGNoYXJhY3RlcnNUb0xlYXZlRXNjYXBlZCkgLT4gKENGU3RyaW5nUmVmIF9ydikiKX0sCi0JeyJDRlVSTENvcHlMYXN0UGF0aENvbXBvbmVudCIsIChQeUNGdW5jdGlvbilDRlVSTFJlZk9ial9DRlVSTENvcHlMYXN0UGF0aENvbXBvbmVudCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKLQl7IkNGVVJMQ29weVBhdGhFeHRlbnNpb24iLCAoUHlDRnVuY3Rpb24pQ0ZVUkxSZWZPYmpfQ0ZVUkxDb3B5UGF0aEV4dGVuc2lvbiwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKLQl7IkNGVVJMQ3JlYXRlQ29weUFwcGVuZGluZ1BhdGhDb21wb25lbnQiLCAoUHlDRnVuY3Rpb24pQ0ZVUkxSZWZPYmpfQ0ZVUkxDcmVhdGVDb3B5QXBwZW5kaW5nUGF0aENvbXBvbmVudCwgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgcGF0aENvbXBvbmVudCwgQm9vbGVhbiBpc0RpcmVjdG9yeSkgLT4gKENGVVJMUmVmIF9ydikiKX0sCi0JeyJDRlVSTENyZWF0ZUNvcHlEZWxldGluZ0xhc3RQYXRoQ29tcG9uZW50IiwgKFB5Q0Z1bmN0aW9uKUNGVVJMUmVmT2JqX0NGVVJMQ3JlYXRlQ29weURlbGV0aW5nTGFzdFBhdGhDb21wb25lbnQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENGVVJMUmVmIF9ydikiKX0sCi0JeyJDRlVSTENyZWF0ZUNvcHlBcHBlbmRpbmdQYXRoRXh0ZW5zaW9uIiwgKFB5Q0Z1bmN0aW9uKUNGVVJMUmVmT2JqX0NGVVJMQ3JlYXRlQ29weUFwcGVuZGluZ1BhdGhFeHRlbnNpb24sIDEsCi0JIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIGV4dGVuc2lvbikgLT4gKENGVVJMUmVmIF9ydikiKX0sCi0JeyJDRlVSTENyZWF0ZUNvcHlEZWxldGluZ1BhdGhFeHRlbnNpb24iLCAoUHlDRnVuY3Rpb24pQ0ZVUkxSZWZPYmpfQ0ZVUkxDcmVhdGVDb3B5RGVsZXRpbmdQYXRoRXh0ZW5zaW9uLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDRlVSTFJlZiBfcnYpIil9LAotCXsiQ0ZVUkxHZXRGU1JlZiIsIChQeUNGdW5jdGlvbilDRlVSTFJlZk9ial9DRlVSTEdldEZTUmVmLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydiwgRlNSZWYgZnNSZWYpIil9LAotCXtOVUxMLCBOVUxMLCAwfQorICAgIHsiQ0ZVUkxDcmVhdGVEYXRhIiwgKFB5Q0Z1bmN0aW9uKUNGVVJMUmVmT2JqX0NGVVJMQ3JlYXRlRGF0YSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZywgQm9vbGVhbiBlc2NhcGVXaGl0ZXNwYWNlKSAtPiAoQ0ZEYXRhUmVmIF9ydikiKX0sCisgICAgeyJDRlVSTEdldEZpbGVTeXN0ZW1SZXByZXNlbnRhdGlvbiIsIChQeUNGdW5jdGlvbilDRlVSTFJlZk9ial9DRlVSTEdldEZpbGVTeXN0ZW1SZXByZXNlbnRhdGlvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQm9vbGVhbiByZXNvbHZlQWdhaW5zdEJhc2UsIENGSW5kZXggbWF4QnVmTGVuKSAtPiAoQm9vbGVhbiBfcnYsIFVJbnQ4IGJ1ZmZlcikiKX0sCisgICAgeyJDRlVSTENvcHlBYnNvbHV0ZVVSTCIsIChQeUNGdW5jdGlvbilDRlVSTFJlZk9ial9DRlVSTENvcHlBYnNvbHV0ZVVSTCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZVUkxSZWYgX3J2KSIpfSwKKyAgICB7IkNGVVJMR2V0U3RyaW5nIiwgKFB5Q0Z1bmN0aW9uKUNGVVJMUmVmT2JqX0NGVVJMR2V0U3RyaW5nLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDRlN0cmluZ1JlZiBfcnYpIil9LAorICAgIHsiQ0ZVUkxHZXRCYXNlVVJMIiwgKFB5Q0Z1bmN0aW9uKUNGVVJMUmVmT2JqX0NGVVJMR2V0QmFzZVVSTCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZVUkxSZWYgX3J2KSIpfSwKKyAgICB7IkNGVVJMQ2FuQmVEZWNvbXBvc2VkIiwgKFB5Q0Z1bmN0aW9uKUNGVVJMUmVmT2JqX0NGVVJMQ2FuQmVEZWNvbXBvc2VkLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJDRlVSTENvcHlTY2hlbWUiLCAoUHlDRnVuY3Rpb24pQ0ZVUkxSZWZPYmpfQ0ZVUkxDb3B5U2NoZW1lLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDRlN0cmluZ1JlZiBfcnYpIil9LAorICAgIHsiQ0ZVUkxDb3B5TmV0TG9jYXRpb24iLCAoUHlDRnVuY3Rpb24pQ0ZVUkxSZWZPYmpfQ0ZVUkxDb3B5TmV0TG9jYXRpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENGU3RyaW5nUmVmIF9ydikiKX0sCisgICAgeyJDRlVSTENvcHlQYXRoIiwgKFB5Q0Z1bmN0aW9uKUNGVVJMUmVmT2JqX0NGVVJMQ29weVBhdGgsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENGU3RyaW5nUmVmIF9ydikiKX0sCisgICAgeyJDRlVSTENvcHlTdHJpY3RQYXRoIiwgKFB5Q0Z1bmN0aW9uKUNGVVJMUmVmT2JqX0NGVVJMQ29weVN0cmljdFBhdGgsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENGU3RyaW5nUmVmIF9ydiwgQm9vbGVhbiBpc0Fic29sdXRlKSIpfSwKKyAgICB7IkNGVVJMQ29weUZpbGVTeXN0ZW1QYXRoIiwgKFB5Q0Z1bmN0aW9uKUNGVVJMUmVmT2JqX0NGVVJMQ29weUZpbGVTeXN0ZW1QYXRoLCAxLAorICAgICBQeURvY19TVFIoIihDRlVSTFBhdGhTdHlsZSBwYXRoU3R5bGUpIC0+IChDRlN0cmluZ1JlZiBfcnYpIil9LAorICAgIHsiQ0ZVUkxIYXNEaXJlY3RvcnlQYXRoIiwgKFB5Q0Z1bmN0aW9uKUNGVVJMUmVmT2JqX0NGVVJMSGFzRGlyZWN0b3J5UGF0aCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiQ0ZVUkxDb3B5UmVzb3VyY2VTcGVjaWZpZXIiLCAoUHlDRnVuY3Rpb24pQ0ZVUkxSZWZPYmpfQ0ZVUkxDb3B5UmVzb3VyY2VTcGVjaWZpZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENGU3RyaW5nUmVmIF9ydikiKX0sCisgICAgeyJDRlVSTENvcHlIb3N0TmFtZSIsIChQeUNGdW5jdGlvbilDRlVSTFJlZk9ial9DRlVSTENvcHlIb3N0TmFtZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKKyAgICB7IkNGVVJMR2V0UG9ydE51bWJlciIsIChQeUNGdW5jdGlvbilDRlVSTFJlZk9ial9DRlVSTEdldFBvcnROdW1iZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFNJbnQzMiBfcnYpIil9LAorICAgIHsiQ0ZVUkxDb3B5VXNlck5hbWUiLCAoUHlDRnVuY3Rpb24pQ0ZVUkxSZWZPYmpfQ0ZVUkxDb3B5VXNlck5hbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENGU3RyaW5nUmVmIF9ydikiKX0sCisgICAgeyJDRlVSTENvcHlQYXNzd29yZCIsIChQeUNGdW5jdGlvbilDRlVSTFJlZk9ial9DRlVSTENvcHlQYXNzd29yZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKKyAgICB7IkNGVVJMQ29weVBhcmFtZXRlclN0cmluZyIsIChQeUNGdW5jdGlvbilDRlVSTFJlZk9ial9DRlVSTENvcHlQYXJhbWV0ZXJTdHJpbmcsIDEsCisgICAgIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIGNoYXJhY3RlcnNUb0xlYXZlRXNjYXBlZCkgLT4gKENGU3RyaW5nUmVmIF9ydikiKX0sCisgICAgeyJDRlVSTENvcHlRdWVyeVN0cmluZyIsIChQeUNGdW5jdGlvbilDRlVSTFJlZk9ial9DRlVSTENvcHlRdWVyeVN0cmluZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgY2hhcmFjdGVyc1RvTGVhdmVFc2NhcGVkKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKKyAgICB7IkNGVVJMQ29weUZyYWdtZW50IiwgKFB5Q0Z1bmN0aW9uKUNGVVJMUmVmT2JqX0NGVVJMQ29weUZyYWdtZW50LCAxLAorICAgICBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBjaGFyYWN0ZXJzVG9MZWF2ZUVzY2FwZWQpIC0+IChDRlN0cmluZ1JlZiBfcnYpIil9LAorICAgIHsiQ0ZVUkxDb3B5TGFzdFBhdGhDb21wb25lbnQiLCAoUHlDRnVuY3Rpb24pQ0ZVUkxSZWZPYmpfQ0ZVUkxDb3B5TGFzdFBhdGhDb21wb25lbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENGU3RyaW5nUmVmIF9ydikiKX0sCisgICAgeyJDRlVSTENvcHlQYXRoRXh0ZW5zaW9uIiwgKFB5Q0Z1bmN0aW9uKUNGVVJMUmVmT2JqX0NGVVJMQ29weVBhdGhFeHRlbnNpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENGU3RyaW5nUmVmIF9ydikiKX0sCisgICAgeyJDRlVSTENyZWF0ZUNvcHlBcHBlbmRpbmdQYXRoQ29tcG9uZW50IiwgKFB5Q0Z1bmN0aW9uKUNGVVJMUmVmT2JqX0NGVVJMQ3JlYXRlQ29weUFwcGVuZGluZ1BhdGhDb21wb25lbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIHBhdGhDb21wb25lbnQsIEJvb2xlYW4gaXNEaXJlY3RvcnkpIC0+IChDRlVSTFJlZiBfcnYpIil9LAorICAgIHsiQ0ZVUkxDcmVhdGVDb3B5RGVsZXRpbmdMYXN0UGF0aENvbXBvbmVudCIsIChQeUNGdW5jdGlvbilDRlVSTFJlZk9ial9DRlVSTENyZWF0ZUNvcHlEZWxldGluZ0xhc3RQYXRoQ29tcG9uZW50LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDRlVSTFJlZiBfcnYpIil9LAorICAgIHsiQ0ZVUkxDcmVhdGVDb3B5QXBwZW5kaW5nUGF0aEV4dGVuc2lvbiIsIChQeUNGdW5jdGlvbilDRlVSTFJlZk9ial9DRlVSTENyZWF0ZUNvcHlBcHBlbmRpbmdQYXRoRXh0ZW5zaW9uLCAxLAorICAgICBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBleHRlbnNpb24pIC0+IChDRlVSTFJlZiBfcnYpIil9LAorICAgIHsiQ0ZVUkxDcmVhdGVDb3B5RGVsZXRpbmdQYXRoRXh0ZW5zaW9uIiwgKFB5Q0Z1bmN0aW9uKUNGVVJMUmVmT2JqX0NGVVJMQ3JlYXRlQ29weURlbGV0aW5nUGF0aEV4dGVuc2lvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZVUkxSZWYgX3J2KSIpfSwKKyAgICB7IkNGVVJMR2V0RlNSZWYiLCAoUHlDRnVuY3Rpb24pQ0ZVUkxSZWZPYmpfQ0ZVUkxHZXRGU1JlZiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYsIEZTUmVmIGZzUmVmKSIpfSwKKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKICNkZWZpbmUgQ0ZVUkxSZWZPYmpfZ2V0c2V0bGlzdCBOVUxMCkBAIC0zNDc1LDEwMCArMzQ3NSwxMDAgQEAKIAogc3RhdGljIGludCBDRlVSTFJlZk9ial9jb21wYXJlKENGVVJMUmVmT2JqZWN0ICpzZWxmLCBDRlVSTFJlZk9iamVjdCAqb3RoZXIpCiB7Ci0JLyogWFhYWCBPciBzaG91bGQgd2UgdXNlIENGRXF1YWw/PyAqLwotCWlmICggc2VsZi0+b2JfaXRzZWxmID4gb3RoZXItPm9iX2l0c2VsZiApIHJldHVybiAxOwotCWlmICggc2VsZi0+b2JfaXRzZWxmIDwgb3RoZXItPm9iX2l0c2VsZiApIHJldHVybiAtMTsKLQlyZXR1cm4gMDsKKyAgICAvKiBYWFhYIE9yIHNob3VsZCB3ZSB1c2UgQ0ZFcXVhbD8/ICovCisgICAgaWYgKCBzZWxmLT5vYl9pdHNlbGYgPiBvdGhlci0+b2JfaXRzZWxmICkgcmV0dXJuIDE7CisgICAgaWYgKCBzZWxmLT5vYl9pdHNlbGYgPCBvdGhlci0+b2JfaXRzZWxmICkgcmV0dXJuIC0xOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKiBDRlVSTFJlZk9ial9yZXByKENGVVJMUmVmT2JqZWN0ICpzZWxmKQogewotCWNoYXIgYnVmWzEwMF07Ci0Jc3ByaW50ZihidWYsICI8Q0ZVUkwgb2JqZWN0IGF0IDB4JTguOHggZm9yIDB4JTguOHg+IiwgKHVuc2lnbmVkKXNlbGYsICh1bnNpZ25lZClzZWxmLT5vYl9pdHNlbGYpOwotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CisgICAgY2hhciBidWZbMTAwXTsKKyAgICBzcHJpbnRmKGJ1ZiwgIjxDRlVSTCBvYmplY3QgYXQgMHglOC44eCBmb3IgMHglOC44eD4iLCAodW5zaWduZWQpc2VsZiwgKHVuc2lnbmVkKXNlbGYtPm9iX2l0c2VsZik7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmKTsKIH0KIAogc3RhdGljIGludCBDRlVSTFJlZk9ial9oYXNoKENGVVJMUmVmT2JqZWN0ICpzZWxmKQogewotCS8qIFhYWFggT3Igc2hvdWxkIHdlIHVzZSBDRkhhc2g/PyAqLwotCXJldHVybiAoaW50KXNlbGYtPm9iX2l0c2VsZjsKKyAgICAvKiBYWFhYIE9yIHNob3VsZCB3ZSB1c2UgQ0ZIYXNoPz8gKi8KKyAgICByZXR1cm4gKGludClzZWxmLT5vYl9pdHNlbGY7CiB9CiBzdGF0aWMgaW50IENGVVJMUmVmT2JqX3RwX2luaXQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlDRlVSTFJlZiBpdHNlbGY7Ci0JY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CisgICAgQ0ZVUkxSZWYgaXRzZWxmOworICAgIGNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OwogCi0JaWYgKFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBDRlVSTFJlZk9ial9Db252ZXJ0LCAmaXRzZWxmKSkKLQl7Ci0JCSgoQ0ZVUkxSZWZPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQkJcmV0dXJuIDA7Ci0JfQorICAgIGlmIChQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgQ0ZVUkxSZWZPYmpfQ29udmVydCwgJml0c2VsZikpCisgICAgeworICAgICAgICAoKENGVVJMUmVmT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgICAgIHJldHVybiAwOworICAgIH0KIAotCS8qIEFueSBDRlR5cGVSZWYgZGVzY2VuZGVudCBpcyBhbGxvd2VkIGFzIGluaXRpYWxpemVyIHRvbyAqLwotCWlmIChQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgQ0ZUeXBlUmVmT2JqX0NvbnZlcnQsICZpdHNlbGYpKQotCXsKLQkJKChDRlVSTFJlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIC0xOworICAgIC8qIEFueSBDRlR5cGVSZWYgZGVzY2VuZGVudCBpcyBhbGxvd2VkIGFzIGluaXRpYWxpemVyIHRvbyAqLworICAgIGlmIChQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgQ0ZUeXBlUmVmT2JqX0NvbnZlcnQsICZpdHNlbGYpKQorICAgIHsKKyAgICAgICAgKChDRlVSTFJlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIC0xOwogfQogCiAjZGVmaW5lIENGVVJMUmVmT2JqX3RwX2FsbG9jIFB5VHlwZV9HZW5lcmljQWxsb2MKIAogc3RhdGljIFB5T2JqZWN0ICpDRlVSTFJlZk9ial90cF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlQeU9iamVjdCAqc2VsZjsKLQlpZiAoKHNlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JKChDRlVSTFJlZk9iamVjdCAqKXNlbGYpLT5vYl9pdHNlbGYgPSBOVUxMOwotCSgoQ0ZVUkxSZWZPYmplY3QgKilzZWxmKS0+b2JfZnJlZWl0ID0gQ0ZSZWxlYXNlOwotCXJldHVybiBzZWxmOworICAgIFB5T2JqZWN0ICpzZWxmOworICAgIGlmICgoc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAoKENGVVJMUmVmT2JqZWN0ICopc2VsZiktPm9iX2l0c2VsZiA9IE5VTEw7CisgICAgKChDRlVSTFJlZk9iamVjdCAqKXNlbGYpLT5vYl9mcmVlaXQgPSBDRlJlbGVhc2U7CisgICAgcmV0dXJuIHNlbGY7CiB9CiAKICNkZWZpbmUgQ0ZVUkxSZWZPYmpfdHBfZnJlZSBQeU9iamVjdF9EZWwKIAogCiBQeVR5cGVPYmplY3QgQ0ZVUkxSZWZfVHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKLQkwLCAvKm9iX3NpemUqLwotCSJfQ0YuQ0ZVUkxSZWYiLCAvKnRwX25hbWUqLwotCXNpemVvZihDRlVSTFJlZk9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KLQkwLCAvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpIENGVVJMUmVmT2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCi0JMCwgLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCi0JKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCi0JKGNtcGZ1bmMpIENGVVJMUmVmT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCi0JKHJlcHJmdW5jKSBDRlVSTFJlZk9ial9yZXByLCAvKnRwX3JlcHIqLwotCShQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KLQkoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLwotCShQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYykgQ0ZVUkxSZWZPYmpfaGFzaCwgLyp0cF9oYXNoKi8KLQkwLCAvKnRwX2NhbGwqLwotCTAsIC8qdHBfc3RyKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCi0JUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KLQkwLCAvKnRwX2FzX2J1ZmZlciovCi0JUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCi0JMCwgLyp0cF9kb2MqLwotCTAsIC8qdHBfdHJhdmVyc2UqLwotCTAsIC8qdHBfY2xlYXIqLwotCTAsIC8qdHBfcmljaGNvbXBhcmUqLwotCTAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLwotCTAsIC8qdHBfaXRlciovCi0JMCwgLyp0cF9pdGVybmV4dCovCi0JQ0ZVUkxSZWZPYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLwotCTAsIC8qdHBfbWVtYmVycyovCi0JQ0ZVUkxSZWZPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLwotCTAsIC8qdHBfYmFzZSovCi0JMCwgLyp0cF9kaWN0Ki8KLQkwLCAvKnRwX2Rlc2NyX2dldCovCi0JMCwgLyp0cF9kZXNjcl9zZXQqLwotCTAsIC8qdHBfZGljdG9mZnNldCovCi0JQ0ZVUkxSZWZPYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLwotCUNGVVJMUmVmT2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLwotCUNGVVJMUmVmT2JqX3RwX25ldywgLyogdHBfbmV3ICovCi0JQ0ZVUkxSZWZPYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgIDAsIC8qb2Jfc2l6ZSovCisgICAgIl9DRi5DRlVSTFJlZiIsIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKENGVVJMUmVmT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLworICAgIDAsIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcikgQ0ZVUkxSZWZPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KKyAgICAoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KKyAgICAoY21wZnVuYykgQ0ZVUkxSZWZPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpIENGVVJMUmVmT2JqX3JlcHIsIC8qdHBfcmVwciovCisgICAgKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLworICAgIChQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKSBDRlVSTFJlZk9ial9oYXNoLCAvKnRwX2hhc2gqLworICAgIDAsIC8qdHBfY2FsbCovCisgICAgMCwgLyp0cF9zdHIqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KKyAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLworICAgIDAsIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAvKnRwX2RvYyovCisgICAgMCwgLyp0cF90cmF2ZXJzZSovCisgICAgMCwgLyp0cF9jbGVhciovCisgICAgMCwgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgLyp0cF9pdGVyKi8KKyAgICAwLCAvKnRwX2l0ZXJuZXh0Ki8KKyAgICBDRlVSTFJlZk9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCisgICAgMCwgLyp0cF9tZW1iZXJzKi8KKyAgICBDRlVSTFJlZk9ial9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCisgICAgMCwgLyp0cF9iYXNlKi8KKyAgICAwLCAvKnRwX2RpY3QqLworICAgIDAsIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICBDRlVSTFJlZk9ial90cF9pbml0LCAvKiB0cF9pbml0ICovCisgICAgQ0ZVUkxSZWZPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCisgICAgQ0ZVUkxSZWZPYmpfdHBfbmV3LCAvKiB0cF9uZXcgKi8KKyAgICBDRlVSTFJlZk9ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLSBFbmQgb2JqZWN0IHR5cGUgQ0ZVUkxSZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTM1NzYsMTI1MCArMzU3NiwxMjUwIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZfX19DRlJhbmdlTWFrZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZSYW5nZSBfcnY7Ci0JQ0ZJbmRleCBsb2M7Ci0JQ0ZJbmRleCBsZW47CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGUmFuZ2UgX3J2OworICAgIENGSW5kZXggbG9jOworICAgIENGSW5kZXggbGVuOwogI2lmbmRlZiBfX0NGUmFuZ2VNYWtlCi0JUHlNYWNfUFJFQ0hFQ0soX19DRlJhbmdlTWFrZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soX19DRlJhbmdlTWFrZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZsb2MsCi0JICAgICAgICAgICAgICAgICAgICAgICZsZW4pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBfX0NGUmFuZ2VNYWtlKGxvYywKLQkgICAgICAgICAgICAgICAgICAgIGxlbik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlJhbmdlX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZsb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZsZW4pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBfX0NGUmFuZ2VNYWtlKGxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlbik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlJhbmdlX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRl9DRkFsbG9jYXRvckdldFR5cGVJRChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZUeXBlSUQgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlR5cGVJRCBfcnY7CiAjaWZuZGVmIENGQWxsb2NhdG9yR2V0VHlwZUlECi0JUHlNYWNfUFJFQ0hFQ0soQ0ZBbGxvY2F0b3JHZXRUeXBlSUQpOworICAgIFB5TWFjX1BSRUNIRUNLKENGQWxsb2NhdG9yR2V0VHlwZUlEKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRkFsbG9jYXRvckdldFR5cGVJRCgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRkFsbG9jYXRvckdldFR5cGVJRCgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGX0NGQWxsb2NhdG9yR2V0UHJlZmVycmVkU2l6ZUZvclNpemUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGSW5kZXggX3J2OwotCUNGSW5kZXggc2l6ZTsKLQlDRk9wdGlvbkZsYWdzIGhpbnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGSW5kZXggX3J2OworICAgIENGSW5kZXggc2l6ZTsKKyAgICBDRk9wdGlvbkZsYWdzIGhpbnQ7CiAjaWZuZGVmIENGQWxsb2NhdG9yR2V0UHJlZmVycmVkU2l6ZUZvclNpemUKLQlQeU1hY19QUkVDSEVDSyhDRkFsbG9jYXRvckdldFByZWZlcnJlZFNpemVGb3JTaXplKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRkFsbG9jYXRvckdldFByZWZlcnJlZFNpemVGb3JTaXplKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNpemUsCi0JICAgICAgICAgICAgICAgICAgICAgICZoaW50KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZBbGxvY2F0b3JHZXRQcmVmZXJyZWRTaXplRm9yU2l6ZSgoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaW50KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaGludCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGQWxsb2NhdG9yR2V0UHJlZmVycmVkU2l6ZUZvclNpemUoKENGQWxsb2NhdG9yUmVmKU5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGludCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZfQ0ZDb3B5VHlwZUlERGVzY3JpcHRpb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGU3RyaW5nUmVmIF9ydjsKLQlDRlR5cGVJRCB0eXBlX2lkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlN0cmluZ1JlZiBfcnY7CisgICAgQ0ZUeXBlSUQgdHlwZV9pZDsKICNpZm5kZWYgQ0ZDb3B5VHlwZUlERGVzY3JpcHRpb24KLQlQeU1hY19QUkVDSEVDSyhDRkNvcHlUeXBlSUREZXNjcmlwdGlvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZDb3B5VHlwZUlERGVzY3JpcHRpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0eXBlX2lkKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZDb3B5VHlwZUlERGVzY3JpcHRpb24odHlwZV9pZCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0eXBlX2lkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZDb3B5VHlwZUlERGVzY3JpcHRpb24odHlwZV9pZCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZfQ0ZBcnJheUdldFR5cGVJRChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZUeXBlSUQgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlR5cGVJRCBfcnY7CiAjaWZuZGVmIENGQXJyYXlHZXRUeXBlSUQKLQlQeU1hY19QUkVDSEVDSyhDRkFycmF5R2V0VHlwZUlEKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRkFycmF5R2V0VHlwZUlEKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRkFycmF5R2V0VHlwZUlEKCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGQXJyYXlHZXRUeXBlSUQoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRl9DRkFycmF5Q3JlYXRlTXV0YWJsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZNdXRhYmxlQXJyYXlSZWYgX3J2OwotCUNGSW5kZXggY2FwYWNpdHk7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGTXV0YWJsZUFycmF5UmVmIF9ydjsKKyAgICBDRkluZGV4IGNhcGFjaXR5OwogI2lmbmRlZiBDRkFycmF5Q3JlYXRlTXV0YWJsZQotCVB5TWFjX1BSRUNIRUNLKENGQXJyYXlDcmVhdGVNdXRhYmxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRkFycmF5Q3JlYXRlTXV0YWJsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNhcGFjaXR5KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZBcnJheUNyZWF0ZU11dGFibGUoKENGQWxsb2NhdG9yUmVmKU5VTEwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwYWNpdHksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtDRlR5cGVBcnJheUNhbGxCYWNrcyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRk11dGFibGVBcnJheVJlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjYXBhY2l0eSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGQXJyYXlDcmVhdGVNdXRhYmxlKChDRkFsbG9jYXRvclJlZilOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGFjaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrQ0ZUeXBlQXJyYXlDYWxsQmFja3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZNdXRhYmxlQXJyYXlSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGX0NGQXJyYXlDcmVhdGVNdXRhYmxlQ29weShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZNdXRhYmxlQXJyYXlSZWYgX3J2OwotCUNGSW5kZXggY2FwYWNpdHk7Ci0JQ0ZBcnJheVJlZiB0aGVBcnJheTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZNdXRhYmxlQXJyYXlSZWYgX3J2OworICAgIENGSW5kZXggY2FwYWNpdHk7CisgICAgQ0ZBcnJheVJlZiB0aGVBcnJheTsKICNpZm5kZWYgQ0ZBcnJheUNyZWF0ZU11dGFibGVDb3B5Ci0JUHlNYWNfUFJFQ0hFQ0soQ0ZBcnJheUNyZWF0ZU11dGFibGVDb3B5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRkFycmF5Q3JlYXRlTXV0YWJsZUNvcHkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNhcGFjaXR5LAotCSAgICAgICAgICAgICAgICAgICAgICBDRkFycmF5UmVmT2JqX0NvbnZlcnQsICZ0aGVBcnJheSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGQXJyYXlDcmVhdGVNdXRhYmxlQ29weSgoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwYWNpdHksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZUFycmF5KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGTXV0YWJsZUFycmF5UmVmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY2FwYWNpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGQXJyYXlSZWZPYmpfQ29udmVydCwgJnRoZUFycmF5KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZBcnJheUNyZWF0ZU11dGFibGVDb3B5KChDRkFsbG9jYXRvclJlZilOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBhY2l0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlQXJyYXkpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZNdXRhYmxlQXJyYXlSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGX0NGRGF0YUdldFR5cGVJRChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZUeXBlSUQgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlR5cGVJRCBfcnY7CiAjaWZuZGVmIENGRGF0YUdldFR5cGVJRAotCVB5TWFjX1BSRUNIRUNLKENGRGF0YUdldFR5cGVJRCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZEYXRhR2V0VHlwZUlEKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRkRhdGFHZXRUeXBlSUQoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZEYXRhR2V0VHlwZUlEKCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZfQ0ZEYXRhQ3JlYXRlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRkRhdGFSZWYgX3J2OwotCXVuc2lnbmVkIGNoYXIgKmJ5dGVzX19pbl9fOwotCWxvbmcgYnl0ZXNfX2xlbl9fOwotCWludCBieXRlc19faW5fbGVuX187CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGRGF0YVJlZiBfcnY7CisgICAgdW5zaWduZWQgY2hhciAqYnl0ZXNfX2luX187CisgICAgbG9uZyBieXRlc19fbGVuX187CisgICAgaW50IGJ5dGVzX19pbl9sZW5fXzsKICNpZm5kZWYgQ0ZEYXRhQ3JlYXRlCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZEYXRhQ3JlYXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRkRhdGFDcmVhdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAicyMiLAotCSAgICAgICAgICAgICAgICAgICAgICAmYnl0ZXNfX2luX18sICZieXRlc19faW5fbGVuX18pKQotCQlyZXR1cm4gTlVMTDsKLQlieXRlc19fbGVuX18gPSBieXRlc19faW5fbGVuX187Ci0JX3J2ID0gQ0ZEYXRhQ3JlYXRlKChDRkFsbG9jYXRvclJlZilOVUxMLAotCSAgICAgICAgICAgICAgICAgICBieXRlc19faW5fXywgYnl0ZXNfX2xlbl9fKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGRGF0YVJlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAicyMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYnl0ZXNfX2luX18sICZieXRlc19faW5fbGVuX18pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBieXRlc19fbGVuX18gPSBieXRlc19faW5fbGVuX187CisgICAgX3J2ID0gQ0ZEYXRhQ3JlYXRlKChDRkFsbG9jYXRvclJlZilOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICBieXRlc19faW5fXywgYnl0ZXNfX2xlbl9fKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGRGF0YVJlZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZfQ0ZEYXRhQ3JlYXRlV2l0aEJ5dGVzTm9Db3B5KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRkRhdGFSZWYgX3J2OwotCXVuc2lnbmVkIGNoYXIgKmJ5dGVzX19pbl9fOwotCWxvbmcgYnl0ZXNfX2xlbl9fOwotCWludCBieXRlc19faW5fbGVuX187CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGRGF0YVJlZiBfcnY7CisgICAgdW5zaWduZWQgY2hhciAqYnl0ZXNfX2luX187CisgICAgbG9uZyBieXRlc19fbGVuX187CisgICAgaW50IGJ5dGVzX19pbl9sZW5fXzsKICNpZm5kZWYgQ0ZEYXRhQ3JlYXRlV2l0aEJ5dGVzTm9Db3B5Ci0JUHlNYWNfUFJFQ0hFQ0soQ0ZEYXRhQ3JlYXRlV2l0aEJ5dGVzTm9Db3B5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRkRhdGFDcmVhdGVXaXRoQnl0ZXNOb0NvcHkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAicyMiLAotCSAgICAgICAgICAgICAgICAgICAgICAmYnl0ZXNfX2luX18sICZieXRlc19faW5fbGVuX18pKQotCQlyZXR1cm4gTlVMTDsKLQlieXRlc19fbGVuX18gPSBieXRlc19faW5fbGVuX187Ci0JX3J2ID0gQ0ZEYXRhQ3JlYXRlV2l0aEJ5dGVzTm9Db3B5KChDRkFsbG9jYXRvclJlZilOVUxMLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlc19faW5fXywgYnl0ZXNfX2xlbl9fLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ0ZBbGxvY2F0b3JSZWYpTlVMTCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRkRhdGFSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInMjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ5dGVzX19pbl9fLCAmYnl0ZXNfX2luX2xlbl9fKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYnl0ZXNfX2xlbl9fID0gYnl0ZXNfX2luX2xlbl9fOworICAgIF9ydiA9IENGRGF0YUNyZWF0ZVdpdGhCeXRlc05vQ29weSgoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNfX2luX18sIGJ5dGVzX19sZW5fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKENGQWxsb2NhdG9yUmVmKU5VTEwpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZEYXRhUmVmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRl9DRkRhdGFDcmVhdGVNdXRhYmxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRk11dGFibGVEYXRhUmVmIF9ydjsKLQlDRkluZGV4IGNhcGFjaXR5OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRk11dGFibGVEYXRhUmVmIF9ydjsKKyAgICBDRkluZGV4IGNhcGFjaXR5OwogI2lmbmRlZiBDRkRhdGFDcmVhdGVNdXRhYmxlCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZEYXRhQ3JlYXRlTXV0YWJsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZEYXRhQ3JlYXRlTXV0YWJsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNhcGFjaXR5KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZEYXRhQ3JlYXRlTXV0YWJsZSgoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGFjaXR5KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGTXV0YWJsZURhdGFSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY2FwYWNpdHkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRkRhdGFDcmVhdGVNdXRhYmxlKChDRkFsbG9jYXRvclJlZilOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwYWNpdHkpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZNdXRhYmxlRGF0YVJlZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZfQ0ZEYXRhQ3JlYXRlTXV0YWJsZUNvcHkoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGTXV0YWJsZURhdGFSZWYgX3J2OwotCUNGSW5kZXggY2FwYWNpdHk7Ci0JQ0ZEYXRhUmVmIHRoZURhdGE7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGTXV0YWJsZURhdGFSZWYgX3J2OworICAgIENGSW5kZXggY2FwYWNpdHk7CisgICAgQ0ZEYXRhUmVmIHRoZURhdGE7CiAjaWZuZGVmIENGRGF0YUNyZWF0ZU11dGFibGVDb3B5Ci0JUHlNYWNfUFJFQ0hFQ0soQ0ZEYXRhQ3JlYXRlTXV0YWJsZUNvcHkpOworICAgIFB5TWFjX1BSRUNIRUNLKENGRGF0YUNyZWF0ZU11dGFibGVDb3B5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZjYXBhY2l0eSwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZEYXRhUmVmT2JqX0NvbnZlcnQsICZ0aGVEYXRhKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZEYXRhQ3JlYXRlTXV0YWJsZUNvcHkoKENGQWxsb2NhdG9yUmVmKU5VTEwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwYWNpdHksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlRGF0YSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRk11dGFibGVEYXRhUmVmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY2FwYWNpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGRGF0YVJlZk9ial9Db252ZXJ0LCAmdGhlRGF0YSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGRGF0YUNyZWF0ZU11dGFibGVDb3B5KChDRkFsbG9jYXRvclJlZilOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGFjaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZURhdGEpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZNdXRhYmxlRGF0YVJlZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZfQ0ZEaWN0aW9uYXJ5R2V0VHlwZUlEKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlR5cGVJRCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGVHlwZUlEIF9ydjsKICNpZm5kZWYgQ0ZEaWN0aW9uYXJ5R2V0VHlwZUlECi0JUHlNYWNfUFJFQ0hFQ0soQ0ZEaWN0aW9uYXJ5R2V0VHlwZUlEKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRkRpY3Rpb25hcnlHZXRUeXBlSUQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGRGljdGlvbmFyeUdldFR5cGVJRCgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRkRpY3Rpb25hcnlHZXRUeXBlSUQoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRl9DRkRpY3Rpb25hcnlDcmVhdGVNdXRhYmxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRk11dGFibGVEaWN0aW9uYXJ5UmVmIF9ydjsKLQlDRkluZGV4IGNhcGFjaXR5OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRk11dGFibGVEaWN0aW9uYXJ5UmVmIF9ydjsKKyAgICBDRkluZGV4IGNhcGFjaXR5OwogI2lmbmRlZiBDRkRpY3Rpb25hcnlDcmVhdGVNdXRhYmxlCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZEaWN0aW9uYXJ5Q3JlYXRlTXV0YWJsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZEaWN0aW9uYXJ5Q3JlYXRlTXV0YWJsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNhcGFjaXR5KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZEaWN0aW9uYXJ5Q3JlYXRlTXV0YWJsZSgoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGFjaXR5LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtDRlR5cGVEaWN0aW9uYXJ5S2V5Q2FsbEJhY2tzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtDRlR5cGVEaWN0aW9uYXJ5VmFsdWVDYWxsQmFja3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjYXBhY2l0eSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGRGljdGlvbmFyeUNyZWF0ZU11dGFibGUoKENGQWxsb2NhdG9yUmVmKU5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBhY2l0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrQ0ZUeXBlRGljdGlvbmFyeUtleUNhbGxCYWNrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrQ0ZUeXBlRGljdGlvbmFyeVZhbHVlQ2FsbEJhY2tzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGX0NGRGljdGlvbmFyeUNyZWF0ZU11dGFibGVDb3B5KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRk11dGFibGVEaWN0aW9uYXJ5UmVmIF9ydjsKLQlDRkluZGV4IGNhcGFjaXR5OwotCUNGRGljdGlvbmFyeVJlZiB0aGVEaWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRk11dGFibGVEaWN0aW9uYXJ5UmVmIF9ydjsKKyAgICBDRkluZGV4IGNhcGFjaXR5OworICAgIENGRGljdGlvbmFyeVJlZiB0aGVEaWN0OwogI2lmbmRlZiBDRkRpY3Rpb25hcnlDcmVhdGVNdXRhYmxlQ29weQotCVB5TWFjX1BSRUNIRUNLKENGRGljdGlvbmFyeUNyZWF0ZU11dGFibGVDb3B5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRkRpY3Rpb25hcnlDcmVhdGVNdXRhYmxlQ29weSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmY2FwYWNpdHksCi0JICAgICAgICAgICAgICAgICAgICAgIENGRGljdGlvbmFyeVJlZk9ial9Db252ZXJ0LCAmdGhlRGljdCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGRGljdGlvbmFyeUNyZWF0ZU11dGFibGVDb3B5KChDRkFsbG9jYXRvclJlZilOVUxMLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGFjaXR5LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZURpY3QpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNhcGFjaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRkRpY3Rpb25hcnlSZWZPYmpfQ29udmVydCwgJnRoZURpY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRkRpY3Rpb25hcnlDcmVhdGVNdXRhYmxlQ29weSgoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBhY2l0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVEaWN0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGX0NGUHJlZmVyZW5jZXNDb3B5QXBwVmFsdWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGVHlwZVJlZiBfcnY7Ci0JQ0ZTdHJpbmdSZWYga2V5OwotCUNGU3RyaW5nUmVmIGFwcGxpY2F0aW9uSUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGVHlwZVJlZiBfcnY7CisgICAgQ0ZTdHJpbmdSZWYga2V5OworICAgIENGU3RyaW5nUmVmIGFwcGxpY2F0aW9uSUQ7CiAjaWZuZGVmIENGUHJlZmVyZW5jZXNDb3B5QXBwVmFsdWUKLQlQeU1hY19QUkVDSEVDSyhDRlByZWZlcmVuY2VzQ29weUFwcFZhbHVlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlByZWZlcmVuY2VzQ29weUFwcFZhbHVlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAma2V5LAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmYXBwbGljYXRpb25JRCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGUHJlZmVyZW5jZXNDb3B5QXBwVmFsdWUoa2V5LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb25JRCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlR5cGVSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAma2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmYXBwbGljYXRpb25JRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGUHJlZmVyZW5jZXNDb3B5QXBwVmFsdWUoa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb25JRCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlR5cGVSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGX0NGUHJlZmVyZW5jZXNHZXRBcHBCb29sZWFuVmFsdWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCUNGU3RyaW5nUmVmIGtleTsKLQlDRlN0cmluZ1JlZiBhcHBsaWNhdGlvbklEOwotCUJvb2xlYW4ga2V5RXhpc3RzQW5kSGFzVmFsaWRGb3JtYXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIENGU3RyaW5nUmVmIGtleTsKKyAgICBDRlN0cmluZ1JlZiBhcHBsaWNhdGlvbklEOworICAgIEJvb2xlYW4ga2V5RXhpc3RzQW5kSGFzVmFsaWRGb3JtYXQ7CiAjaWZuZGVmIENGUHJlZmVyZW5jZXNHZXRBcHBCb29sZWFuVmFsdWUKLQlQeU1hY19QUkVDSEVDSyhDRlByZWZlcmVuY2VzR2V0QXBwQm9vbGVhblZhbHVlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlByZWZlcmVuY2VzR2V0QXBwQm9vbGVhblZhbHVlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAma2V5LAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmYXBwbGljYXRpb25JRCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGUHJlZmVyZW5jZXNHZXRBcHBCb29sZWFuVmFsdWUoa2V5LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb25JRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXlFeGlzdHNBbmRIYXNWYWxpZEZvcm1hdCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAga2V5RXhpc3RzQW5kSGFzVmFsaWRGb3JtYXQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAma2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmYXBwbGljYXRpb25JRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGUHJlZmVyZW5jZXNHZXRBcHBCb29sZWFuVmFsdWUoa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb25JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXlFeGlzdHNBbmRIYXNWYWxpZEZvcm1hdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAga2V5RXhpc3RzQW5kSGFzVmFsaWRGb3JtYXQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGX0NGUHJlZmVyZW5jZXNHZXRBcHBJbnRlZ2VyVmFsdWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGSW5kZXggX3J2OwotCUNGU3RyaW5nUmVmIGtleTsKLQlDRlN0cmluZ1JlZiBhcHBsaWNhdGlvbklEOwotCUJvb2xlYW4ga2V5RXhpc3RzQW5kSGFzVmFsaWRGb3JtYXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGSW5kZXggX3J2OworICAgIENGU3RyaW5nUmVmIGtleTsKKyAgICBDRlN0cmluZ1JlZiBhcHBsaWNhdGlvbklEOworICAgIEJvb2xlYW4ga2V5RXhpc3RzQW5kSGFzVmFsaWRGb3JtYXQ7CiAjaWZuZGVmIENGUHJlZmVyZW5jZXNHZXRBcHBJbnRlZ2VyVmFsdWUKLQlQeU1hY19QUkVDSEVDSyhDRlByZWZlcmVuY2VzR2V0QXBwSW50ZWdlclZhbHVlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlByZWZlcmVuY2VzR2V0QXBwSW50ZWdlclZhbHVlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAma2V5LAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmYXBwbGljYXRpb25JRCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGUHJlZmVyZW5jZXNHZXRBcHBJbnRlZ2VyVmFsdWUoa2V5LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb25JRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXlFeGlzdHNBbmRIYXNWYWxpZEZvcm1hdCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAga2V5RXhpc3RzQW5kSGFzVmFsaWRGb3JtYXQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAma2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmYXBwbGljYXRpb25JRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGUHJlZmVyZW5jZXNHZXRBcHBJbnRlZ2VyVmFsdWUoa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb25JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXlFeGlzdHNBbmRIYXNWYWxpZEZvcm1hdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAga2V5RXhpc3RzQW5kSGFzVmFsaWRGb3JtYXQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGX0NGUHJlZmVyZW5jZXNTZXRBcHBWYWx1ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZTdHJpbmdSZWYga2V5OwotCUNGVHlwZVJlZiB2YWx1ZTsKLQlDRlN0cmluZ1JlZiBhcHBsaWNhdGlvbklEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlN0cmluZ1JlZiBrZXk7CisgICAgQ0ZUeXBlUmVmIHZhbHVlOworICAgIENGU3RyaW5nUmVmIGFwcGxpY2F0aW9uSUQ7CiAjaWZuZGVmIENGUHJlZmVyZW5jZXNTZXRBcHBWYWx1ZQotCVB5TWFjX1BSRUNIRUNLKENGUHJlZmVyZW5jZXNTZXRBcHBWYWx1ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZQcmVmZXJlbmNlc1NldEFwcFZhbHVlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZrZXksCi0JICAgICAgICAgICAgICAgICAgICAgIENGVHlwZVJlZk9ial9Db252ZXJ0LCAmdmFsdWUsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZhcHBsaWNhdGlvbklEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0ZQcmVmZXJlbmNlc1NldEFwcFZhbHVlKGtleSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uSUQpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAma2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlR5cGVSZWZPYmpfQ29udmVydCwgJnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmYXBwbGljYXRpb25JRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENGUHJlZmVyZW5jZXNTZXRBcHBWYWx1ZShrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbklEKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZfQ0ZQcmVmZXJlbmNlc0FkZFN1aXRlUHJlZmVyZW5jZXNUb0FwcChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZTdHJpbmdSZWYgYXBwbGljYXRpb25JRDsKLQlDRlN0cmluZ1JlZiBzdWl0ZUlEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlN0cmluZ1JlZiBhcHBsaWNhdGlvbklEOworICAgIENGU3RyaW5nUmVmIHN1aXRlSUQ7CiAjaWZuZGVmIENGUHJlZmVyZW5jZXNBZGRTdWl0ZVByZWZlcmVuY2VzVG9BcHAKLQlQeU1hY19QUkVDSEVDSyhDRlByZWZlcmVuY2VzQWRkU3VpdGVQcmVmZXJlbmNlc1RvQXBwKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlByZWZlcmVuY2VzQWRkU3VpdGVQcmVmZXJlbmNlc1RvQXBwKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmYXBwbGljYXRpb25JRCwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnN1aXRlSUQpKQotCQlyZXR1cm4gTlVMTDsKLQlDRlByZWZlcmVuY2VzQWRkU3VpdGVQcmVmZXJlbmNlc1RvQXBwKGFwcGxpY2F0aW9uSUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWl0ZUlEKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZhcHBsaWNhdGlvbklELAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmc3VpdGVJRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENGUHJlZmVyZW5jZXNBZGRTdWl0ZVByZWZlcmVuY2VzVG9BcHAoYXBwbGljYXRpb25JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1aXRlSUQpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRl9DRlByZWZlcmVuY2VzUmVtb3ZlU3VpdGVQcmVmZXJlbmNlc0Zyb21BcHAoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGU3RyaW5nUmVmIGFwcGxpY2F0aW9uSUQ7Ci0JQ0ZTdHJpbmdSZWYgc3VpdGVJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZTdHJpbmdSZWYgYXBwbGljYXRpb25JRDsKKyAgICBDRlN0cmluZ1JlZiBzdWl0ZUlEOwogI2lmbmRlZiBDRlByZWZlcmVuY2VzUmVtb3ZlU3VpdGVQcmVmZXJlbmNlc0Zyb21BcHAKLQlQeU1hY19QUkVDSEVDSyhDRlByZWZlcmVuY2VzUmVtb3ZlU3VpdGVQcmVmZXJlbmNlc0Zyb21BcHApOworICAgIFB5TWFjX1BSRUNIRUNLKENGUHJlZmVyZW5jZXNSZW1vdmVTdWl0ZVByZWZlcmVuY2VzRnJvbUFwcCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmFwcGxpY2F0aW9uSUQsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZzdWl0ZUlEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0ZQcmVmZXJlbmNlc1JlbW92ZVN1aXRlUHJlZmVyZW5jZXNGcm9tQXBwKGFwcGxpY2F0aW9uSUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1aXRlSUQpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmFwcGxpY2F0aW9uSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZzdWl0ZUlEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0ZQcmVmZXJlbmNlc1JlbW92ZVN1aXRlUHJlZmVyZW5jZXNGcm9tQXBwKGFwcGxpY2F0aW9uSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1aXRlSUQpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRl9DRlByZWZlcmVuY2VzQXBwU3luY2hyb25pemUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCUNGU3RyaW5nUmVmIGFwcGxpY2F0aW9uSUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIENGU3RyaW5nUmVmIGFwcGxpY2F0aW9uSUQ7CiAjaWZuZGVmIENGUHJlZmVyZW5jZXNBcHBTeW5jaHJvbml6ZQotCVB5TWFjX1BSRUNIRUNLKENGUHJlZmVyZW5jZXNBcHBTeW5jaHJvbml6ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZQcmVmZXJlbmNlc0FwcFN5bmNocm9uaXplKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmFwcGxpY2F0aW9uSUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRlByZWZlcmVuY2VzQXBwU3luY2hyb25pemUoYXBwbGljYXRpb25JRCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmYXBwbGljYXRpb25JRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGUHJlZmVyZW5jZXNBcHBTeW5jaHJvbml6ZShhcHBsaWNhdGlvbklEKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRl9DRlByZWZlcmVuY2VzQ29weVZhbHVlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlR5cGVSZWYgX3J2OwotCUNGU3RyaW5nUmVmIGtleTsKLQlDRlN0cmluZ1JlZiBhcHBsaWNhdGlvbklEOwotCUNGU3RyaW5nUmVmIHVzZXJOYW1lOwotCUNGU3RyaW5nUmVmIGhvc3ROYW1lOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlR5cGVSZWYgX3J2OworICAgIENGU3RyaW5nUmVmIGtleTsKKyAgICBDRlN0cmluZ1JlZiBhcHBsaWNhdGlvbklEOworICAgIENGU3RyaW5nUmVmIHVzZXJOYW1lOworICAgIENGU3RyaW5nUmVmIGhvc3ROYW1lOwogI2lmbmRlZiBDRlByZWZlcmVuY2VzQ29weVZhbHVlCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZQcmVmZXJlbmNlc0NvcHlWYWx1ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZQcmVmZXJlbmNlc0NvcHlWYWx1ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZrZXksCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZhcHBsaWNhdGlvbklELAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdXNlck5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZob3N0TmFtZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGUHJlZmVyZW5jZXNDb3B5VmFsdWUoa2V5LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb25JRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJOYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdE5hbWUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZUeXBlUmVmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZhcHBsaWNhdGlvbklELAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdXNlck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZob3N0TmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGUHJlZmVyZW5jZXNDb3B5VmFsdWUoa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb25JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdE5hbWUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZUeXBlUmVmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRl9DRlByZWZlcmVuY2VzQ29weU11bHRpcGxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRkRpY3Rpb25hcnlSZWYgX3J2OwotCUNGQXJyYXlSZWYga2V5c1RvRmV0Y2g7Ci0JQ0ZTdHJpbmdSZWYgYXBwbGljYXRpb25JRDsKLQlDRlN0cmluZ1JlZiB1c2VyTmFtZTsKLQlDRlN0cmluZ1JlZiBob3N0TmFtZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZEaWN0aW9uYXJ5UmVmIF9ydjsKKyAgICBDRkFycmF5UmVmIGtleXNUb0ZldGNoOworICAgIENGU3RyaW5nUmVmIGFwcGxpY2F0aW9uSUQ7CisgICAgQ0ZTdHJpbmdSZWYgdXNlck5hbWU7CisgICAgQ0ZTdHJpbmdSZWYgaG9zdE5hbWU7CiAjaWZuZGVmIENGUHJlZmVyZW5jZXNDb3B5TXVsdGlwbGUKLQlQeU1hY19QUkVDSEVDSyhDRlByZWZlcmVuY2VzQ29weU11bHRpcGxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlByZWZlcmVuY2VzQ29weU11bHRpcGxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZBcnJheVJlZk9ial9Db252ZXJ0LCAma2V5c1RvRmV0Y2gsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZhcHBsaWNhdGlvbklELAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdXNlck5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZob3N0TmFtZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGUHJlZmVyZW5jZXNDb3B5TXVsdGlwbGUoa2V5c1RvRmV0Y2gsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbklELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlck5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3N0TmFtZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRkRpY3Rpb25hcnlSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZBcnJheVJlZk9ial9Db252ZXJ0LCAma2V5c1RvRmV0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZhcHBsaWNhdGlvbklELAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdXNlck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZob3N0TmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGUHJlZmVyZW5jZXNDb3B5TXVsdGlwbGUoa2V5c1RvRmV0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbklELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3N0TmFtZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRkRpY3Rpb25hcnlSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGX0NGUHJlZmVyZW5jZXNTZXRWYWx1ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZTdHJpbmdSZWYga2V5OwotCUNGVHlwZVJlZiB2YWx1ZTsKLQlDRlN0cmluZ1JlZiBhcHBsaWNhdGlvbklEOwotCUNGU3RyaW5nUmVmIHVzZXJOYW1lOwotCUNGU3RyaW5nUmVmIGhvc3ROYW1lOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlN0cmluZ1JlZiBrZXk7CisgICAgQ0ZUeXBlUmVmIHZhbHVlOworICAgIENGU3RyaW5nUmVmIGFwcGxpY2F0aW9uSUQ7CisgICAgQ0ZTdHJpbmdSZWYgdXNlck5hbWU7CisgICAgQ0ZTdHJpbmdSZWYgaG9zdE5hbWU7CiAjaWZuZGVmIENGUHJlZmVyZW5jZXNTZXRWYWx1ZQotCVB5TWFjX1BSRUNIRUNLKENGUHJlZmVyZW5jZXNTZXRWYWx1ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZQcmVmZXJlbmNlc1NldFZhbHVlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAma2V5LAotCSAgICAgICAgICAgICAgICAgICAgICBDRlR5cGVSZWZPYmpfQ29udmVydCwgJnZhbHVlLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmYXBwbGljYXRpb25JRCwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnVzZXJOYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmaG9zdE5hbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlDRlByZWZlcmVuY2VzU2V0VmFsdWUoa2V5LAotCSAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb25JRCwKLQkgICAgICAgICAgICAgICAgICAgICAgdXNlck5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgIGhvc3ROYW1lKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGVHlwZVJlZk9ial9Db252ZXJ0LCAmdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZhcHBsaWNhdGlvbklELAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdXNlck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZob3N0TmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENGUHJlZmVyZW5jZXNTZXRWYWx1ZShrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbklELAorICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdE5hbWUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRl9DRlByZWZlcmVuY2VzU2V0TXVsdGlwbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGRGljdGlvbmFyeVJlZiBrZXlzVG9TZXQ7Ci0JQ0ZBcnJheVJlZiBrZXlzVG9SZW1vdmU7Ci0JQ0ZTdHJpbmdSZWYgYXBwbGljYXRpb25JRDsKLQlDRlN0cmluZ1JlZiB1c2VyTmFtZTsKLQlDRlN0cmluZ1JlZiBob3N0TmFtZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZEaWN0aW9uYXJ5UmVmIGtleXNUb1NldDsKKyAgICBDRkFycmF5UmVmIGtleXNUb1JlbW92ZTsKKyAgICBDRlN0cmluZ1JlZiBhcHBsaWNhdGlvbklEOworICAgIENGU3RyaW5nUmVmIHVzZXJOYW1lOworICAgIENGU3RyaW5nUmVmIGhvc3ROYW1lOwogI2lmbmRlZiBDRlByZWZlcmVuY2VzU2V0TXVsdGlwbGUKLQlQeU1hY19QUkVDSEVDSyhDRlByZWZlcmVuY2VzU2V0TXVsdGlwbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKENGUHJlZmVyZW5jZXNTZXRNdWx0aXBsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZEaWN0aW9uYXJ5UmVmT2JqX0NvbnZlcnQsICZrZXlzVG9TZXQsCi0JICAgICAgICAgICAgICAgICAgICAgIENGQXJyYXlSZWZPYmpfQ29udmVydCwgJmtleXNUb1JlbW92ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmFwcGxpY2F0aW9uSUQsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZ1c2VyTmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmhvc3ROYW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0ZQcmVmZXJlbmNlc1NldE11bHRpcGxlKGtleXNUb1NldCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAga2V5c1RvUmVtb3ZlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbklELAotCSAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyTmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdE5hbWUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZEaWN0aW9uYXJ5UmVmT2JqX0NvbnZlcnQsICZrZXlzVG9TZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGQXJyYXlSZWZPYmpfQ29udmVydCwgJmtleXNUb1JlbW92ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmFwcGxpY2F0aW9uSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZ1c2VyTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmhvc3ROYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0ZQcmVmZXJlbmNlc1NldE11bHRpcGxlKGtleXNUb1NldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5c1RvUmVtb3ZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbklELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdE5hbWUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRl9DRlByZWZlcmVuY2VzU3luY2hyb25pemUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCUNGU3RyaW5nUmVmIGFwcGxpY2F0aW9uSUQ7Ci0JQ0ZTdHJpbmdSZWYgdXNlck5hbWU7Ci0JQ0ZTdHJpbmdSZWYgaG9zdE5hbWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIENGU3RyaW5nUmVmIGFwcGxpY2F0aW9uSUQ7CisgICAgQ0ZTdHJpbmdSZWYgdXNlck5hbWU7CisgICAgQ0ZTdHJpbmdSZWYgaG9zdE5hbWU7CiAjaWZuZGVmIENGUHJlZmVyZW5jZXNTeW5jaHJvbml6ZQotCVB5TWFjX1BSRUNIRUNLKENGUHJlZmVyZW5jZXNTeW5jaHJvbml6ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZQcmVmZXJlbmNlc1N5bmNocm9uaXplKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZhcHBsaWNhdGlvbklELAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdXNlck5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZob3N0TmFtZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGUHJlZmVyZW5jZXNTeW5jaHJvbml6ZShhcHBsaWNhdGlvbklELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyTmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdE5hbWUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZhcHBsaWNhdGlvbklELAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdXNlck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZob3N0TmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGUHJlZmVyZW5jZXNTeW5jaHJvbml6ZShhcHBsaWNhdGlvbklELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdE5hbWUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGX0NGUHJlZmVyZW5jZXNDb3B5QXBwbGljYXRpb25MaXN0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRkFycmF5UmVmIF9ydjsKLQlDRlN0cmluZ1JlZiB1c2VyTmFtZTsKLQlDRlN0cmluZ1JlZiBob3N0TmFtZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZBcnJheVJlZiBfcnY7CisgICAgQ0ZTdHJpbmdSZWYgdXNlck5hbWU7CisgICAgQ0ZTdHJpbmdSZWYgaG9zdE5hbWU7CiAjaWZuZGVmIENGUHJlZmVyZW5jZXNDb3B5QXBwbGljYXRpb25MaXN0Ci0JUHlNYWNfUFJFQ0hFQ0soQ0ZQcmVmZXJlbmNlc0NvcHlBcHBsaWNhdGlvbkxpc3QpOworICAgIFB5TWFjX1BSRUNIRUNLKENGUHJlZmVyZW5jZXNDb3B5QXBwbGljYXRpb25MaXN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdXNlck5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZob3N0TmFtZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGUHJlZmVyZW5jZXNDb3B5QXBwbGljYXRpb25MaXN0KHVzZXJOYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3ROYW1lKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGQXJyYXlSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdXNlck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZob3N0TmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGUHJlZmVyZW5jZXNDb3B5QXBwbGljYXRpb25MaXN0KHVzZXJOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3ROYW1lKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGQXJyYXlSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGX0NGUHJlZmVyZW5jZXNDb3B5S2V5TGlzdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZBcnJheVJlZiBfcnY7Ci0JQ0ZTdHJpbmdSZWYgYXBwbGljYXRpb25JRDsKLQlDRlN0cmluZ1JlZiB1c2VyTmFtZTsKLQlDRlN0cmluZ1JlZiBob3N0TmFtZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZBcnJheVJlZiBfcnY7CisgICAgQ0ZTdHJpbmdSZWYgYXBwbGljYXRpb25JRDsKKyAgICBDRlN0cmluZ1JlZiB1c2VyTmFtZTsKKyAgICBDRlN0cmluZ1JlZiBob3N0TmFtZTsKICNpZm5kZWYgQ0ZQcmVmZXJlbmNlc0NvcHlLZXlMaXN0Ci0JUHlNYWNfUFJFQ0hFQ0soQ0ZQcmVmZXJlbmNlc0NvcHlLZXlMaXN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlByZWZlcmVuY2VzQ29weUtleUxpc3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmFwcGxpY2F0aW9uSUQsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZ1c2VyTmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmhvc3ROYW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZQcmVmZXJlbmNlc0NvcHlLZXlMaXN0KGFwcGxpY2F0aW9uSUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJOYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3N0TmFtZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRkFycmF5UmVmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmYXBwbGljYXRpb25JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnVzZXJOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmaG9zdE5hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlByZWZlcmVuY2VzQ29weUtleUxpc3QoYXBwbGljYXRpb25JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3ROYW1lKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGQXJyYXlSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGX0NGU3RyaW5nR2V0VHlwZUlEKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlR5cGVJRCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGVHlwZUlEIF9ydjsKICNpZm5kZWYgQ0ZTdHJpbmdHZXRUeXBlSUQKLQlQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0dldFR5cGVJRCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdHZXRUeXBlSUQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGU3RyaW5nR2V0VHlwZUlEKCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGU3RyaW5nR2V0VHlwZUlEKCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZfQ0ZTdHJpbmdDcmVhdGVXaXRoUGFzY2FsU3RyaW5nKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ1JlZiBfcnY7Ci0JU3RyMjU1IHBTdHI7Ci0JQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZTdHJpbmdSZWYgX3J2OworICAgIFN0cjI1NSBwU3RyOworICAgIENGU3RyaW5nRW5jb2RpbmcgZW5jb2Rpbmc7CiAjaWZuZGVmIENGU3RyaW5nQ3JlYXRlV2l0aFBhc2NhbFN0cmluZwotCVB5TWFjX1BSRUNIRUNLKENGU3RyaW5nQ3JlYXRlV2l0aFBhc2NhbFN0cmluZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdDcmVhdGVXaXRoUGFzY2FsU3RyaW5nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgcFN0ciwKLQkgICAgICAgICAgICAgICAgICAgICAgJmVuY29kaW5nKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZTdHJpbmdDcmVhdGVXaXRoUGFzY2FsU3RyaW5nKChDRkFsbG9jYXRvclJlZilOVUxMLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3RyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBwU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5jb2RpbmcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlN0cmluZ0NyZWF0ZVdpdGhQYXNjYWxTdHJpbmcoKENGQWxsb2NhdG9yUmVmKU5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRl9DRlN0cmluZ0NyZWF0ZVdpdGhDU3RyaW5nKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ1JlZiBfcnY7Ci0JY2hhciogY1N0cjsKLQlDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlN0cmluZ1JlZiBfcnY7CisgICAgY2hhciogY1N0cjsKKyAgICBDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nOwogI2lmbmRlZiBDRlN0cmluZ0NyZWF0ZVdpdGhDU3RyaW5nCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdDcmVhdGVXaXRoQ1N0cmluZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdDcmVhdGVXaXRoQ1N0cmluZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZjU3RyLAotCSAgICAgICAgICAgICAgICAgICAgICAmZW5jb2RpbmcpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRlN0cmluZ0NyZWF0ZVdpdGhDU3RyaW5nKChDRkFsbG9jYXRvclJlZilOVUxMLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY1N0ciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5jb2RpbmcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlN0cmluZ0NyZWF0ZVdpdGhDU3RyaW5nKChDRkFsbG9jYXRvclJlZilOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY1N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRl9DRlN0cmluZ0NyZWF0ZVdpdGhDaGFyYWN0ZXJzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ1JlZiBfcnY7Ci0JVW5pQ2hhciAqY2hhcnNfX2luX187Ci0JVW5pQ2hhckNvdW50IGNoYXJzX19sZW5fXzsKLQlpbnQgY2hhcnNfX2luX2xlbl9fOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlN0cmluZ1JlZiBfcnY7CisgICAgVW5pQ2hhciAqY2hhcnNfX2luX187CisgICAgVW5pQ2hhckNvdW50IGNoYXJzX19sZW5fXzsKKyAgICBpbnQgY2hhcnNfX2luX2xlbl9fOwogI2lmbmRlZiBDRlN0cmluZ0NyZWF0ZVdpdGhDaGFyYWN0ZXJzCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdDcmVhdGVXaXRoQ2hhcmFjdGVycyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdDcmVhdGVXaXRoQ2hhcmFjdGVycyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJ1IyIsCi0JICAgICAgICAgICAgICAgICAgICAgICZjaGFyc19faW5fXywgJmNoYXJzX19pbl9sZW5fXykpCi0JCXJldHVybiBOVUxMOwotCWNoYXJzX19sZW5fXyA9IGNoYXJzX19pbl9sZW5fXzsKLQlfcnYgPSBDRlN0cmluZ0NyZWF0ZVdpdGhDaGFyYWN0ZXJzKChDRkFsbG9jYXRvclJlZilOVUxMLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnNfX2luX18sIGNoYXJzX19sZW5fXyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAidSMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY2hhcnNfX2luX18sICZjaGFyc19faW5fbGVuX18pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBjaGFyc19fbGVuX18gPSBjaGFyc19faW5fbGVuX187CisgICAgX3J2ID0gQ0ZTdHJpbmdDcmVhdGVXaXRoQ2hhcmFjdGVycygoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzX19pbl9fLCBjaGFyc19fbGVuX18pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGX0NGU3RyaW5nQ3JlYXRlV2l0aFBhc2NhbFN0cmluZ05vQ29weShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZTdHJpbmdSZWYgX3J2OwotCVN0cjI1NSBwU3RyOwotCUNGU3RyaW5nRW5jb2RpbmcgZW5jb2Rpbmc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGU3RyaW5nUmVmIF9ydjsKKyAgICBTdHIyNTUgcFN0cjsKKyAgICBDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nOwogI2lmbmRlZiBDRlN0cmluZ0NyZWF0ZVdpdGhQYXNjYWxTdHJpbmdOb0NvcHkKLQlQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0NyZWF0ZVdpdGhQYXNjYWxTdHJpbmdOb0NvcHkpOworICAgIFB5TWFjX1BSRUNIRUNLKENGU3RyaW5nQ3JlYXRlV2l0aFBhc2NhbFN0cmluZ05vQ29weSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIHBTdHIsCi0JICAgICAgICAgICAgICAgICAgICAgICZlbmNvZGluZykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGU3RyaW5nQ3JlYXRlV2l0aFBhc2NhbFN0cmluZ05vQ29weSgoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN0ciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDRkFsbG9jYXRvclJlZilOVUxMKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIHBTdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmNvZGluZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGU3RyaW5nQ3JlYXRlV2l0aFBhc2NhbFN0cmluZ05vQ29weSgoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDRkFsbG9jYXRvclJlZilOVUxMKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRl9DRlN0cmluZ0NyZWF0ZVdpdGhDU3RyaW5nTm9Db3B5KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ1JlZiBfcnY7Ci0JY2hhciogY1N0cjsKLQlDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlN0cmluZ1JlZiBfcnY7CisgICAgY2hhciogY1N0cjsKKyAgICBDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nOwogI2lmbmRlZiBDRlN0cmluZ0NyZWF0ZVdpdGhDU3RyaW5nTm9Db3B5Ci0JUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdDcmVhdGVXaXRoQ1N0cmluZ05vQ29weSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdDcmVhdGVXaXRoQ1N0cmluZ05vQ29weSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZjU3RyLAotCSAgICAgICAgICAgICAgICAgICAgICAmZW5jb2RpbmcpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRlN0cmluZ0NyZWF0ZVdpdGhDU3RyaW5nTm9Db3B5KChDRkFsbG9jYXRvclJlZilOVUxMLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY1N0ciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKENGQWxsb2NhdG9yUmVmKU5VTEwpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInNsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNTdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmNvZGluZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGU3RyaW5nQ3JlYXRlV2l0aENTdHJpbmdOb0NvcHkoKENGQWxsb2NhdG9yUmVmKU5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ0ZBbGxvY2F0b3JSZWYpTlVMTCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZfQ0ZTdHJpbmdDcmVhdGVXaXRoQ2hhcmFjdGVyc05vQ29weShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZTdHJpbmdSZWYgX3J2OwotCVVuaUNoYXIgKmNoYXJzX19pbl9fOwotCVVuaUNoYXJDb3VudCBjaGFyc19fbGVuX187Ci0JaW50IGNoYXJzX19pbl9sZW5fXzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZTdHJpbmdSZWYgX3J2OworICAgIFVuaUNoYXIgKmNoYXJzX19pbl9fOworICAgIFVuaUNoYXJDb3VudCBjaGFyc19fbGVuX187CisgICAgaW50IGNoYXJzX19pbl9sZW5fXzsKICNpZm5kZWYgQ0ZTdHJpbmdDcmVhdGVXaXRoQ2hhcmFjdGVyc05vQ29weQotCVB5TWFjX1BSRUNIRUNLKENGU3RyaW5nQ3JlYXRlV2l0aENoYXJhY3RlcnNOb0NvcHkpOworICAgIFB5TWFjX1BSRUNIRUNLKENGU3RyaW5nQ3JlYXRlV2l0aENoYXJhY3RlcnNOb0NvcHkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAidSMiLAotCSAgICAgICAgICAgICAgICAgICAgICAmY2hhcnNfX2luX18sICZjaGFyc19faW5fbGVuX18pKQotCQlyZXR1cm4gTlVMTDsKLQljaGFyc19fbGVuX18gPSBjaGFyc19faW5fbGVuX187Ci0JX3J2ID0gQ0ZTdHJpbmdDcmVhdGVXaXRoQ2hhcmFjdGVyc05vQ29weSgoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzX19pbl9fLCBjaGFyc19fbGVuX18sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ0ZBbGxvY2F0b3JSZWYpTlVMTCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAidSMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY2hhcnNfX2luX18sICZjaGFyc19faW5fbGVuX18pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBjaGFyc19fbGVuX18gPSBjaGFyc19faW5fbGVuX187CisgICAgX3J2ID0gQ0ZTdHJpbmdDcmVhdGVXaXRoQ2hhcmFjdGVyc05vQ29weSgoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzX19pbl9fLCBjaGFyc19fbGVuX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ0ZBbGxvY2F0b3JSZWYpTlVMTCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZfQ0ZTdHJpbmdDcmVhdGVNdXRhYmxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRk11dGFibGVTdHJpbmdSZWYgX3J2OwotCUNGSW5kZXggbWF4TGVuZ3RoOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRk11dGFibGVTdHJpbmdSZWYgX3J2OworICAgIENGSW5kZXggbWF4TGVuZ3RoOwogI2lmbmRlZiBDRlN0cmluZ0NyZWF0ZU11dGFibGUKLQlQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0NyZWF0ZU11dGFibGUpOworICAgIFB5TWFjX1BSRUNIRUNLKENGU3RyaW5nQ3JlYXRlTXV0YWJsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1heExlbmd0aCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGU3RyaW5nQ3JlYXRlTXV0YWJsZSgoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4TGVuZ3RoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGTXV0YWJsZVN0cmluZ1JlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXhMZW5ndGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlN0cmluZ0NyZWF0ZU11dGFibGUoKENGQWxsb2NhdG9yUmVmKU5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heExlbmd0aCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRk11dGFibGVTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGX0NGU3RyaW5nQ3JlYXRlTXV0YWJsZUNvcHkoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGTXV0YWJsZVN0cmluZ1JlZiBfcnY7Ci0JQ0ZJbmRleCBtYXhMZW5ndGg7Ci0JQ0ZTdHJpbmdSZWYgdGhlU3RyaW5nOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRk11dGFibGVTdHJpbmdSZWYgX3J2OworICAgIENGSW5kZXggbWF4TGVuZ3RoOworICAgIENGU3RyaW5nUmVmIHRoZVN0cmluZzsKICNpZm5kZWYgQ0ZTdHJpbmdDcmVhdGVNdXRhYmxlQ29weQotCVB5TWFjX1BSRUNIRUNLKENGU3RyaW5nQ3JlYXRlTXV0YWJsZUNvcHkpOworICAgIFB5TWFjX1BSRUNIRUNLKENGU3RyaW5nQ3JlYXRlTXV0YWJsZUNvcHkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1heExlbmd0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnRoZVN0cmluZykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGU3RyaW5nQ3JlYXRlTXV0YWJsZUNvcHkoKENGQWxsb2NhdG9yUmVmKU5VTEwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhMZW5ndGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVTdHJpbmcpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWF4TGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdGhlU3RyaW5nKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZTdHJpbmdDcmVhdGVNdXRhYmxlQ29weSgoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heExlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZVN0cmluZyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRk11dGFibGVTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGX0NGU3RyaW5nQ3JlYXRlV2l0aEJ5dGVzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ1JlZiBfcnY7Ci0JdW5zaWduZWQgY2hhciAqYnl0ZXNfX2luX187Ci0JbG9uZyBieXRlc19fbGVuX187Ci0JaW50IGJ5dGVzX19pbl9sZW5fXzsKLQlDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nOwotCUJvb2xlYW4gaXNFeHRlcm5hbFJlcHJlc2VudGF0aW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlN0cmluZ1JlZiBfcnY7CisgICAgdW5zaWduZWQgY2hhciAqYnl0ZXNfX2luX187CisgICAgbG9uZyBieXRlc19fbGVuX187CisgICAgaW50IGJ5dGVzX19pbl9sZW5fXzsKKyAgICBDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nOworICAgIEJvb2xlYW4gaXNFeHRlcm5hbFJlcHJlc2VudGF0aW9uOwogI2lmbmRlZiBDRlN0cmluZ0NyZWF0ZVdpdGhCeXRlcwotCVB5TWFjX1BSRUNIRUNLKENGU3RyaW5nQ3JlYXRlV2l0aEJ5dGVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0NyZWF0ZVdpdGhCeXRlcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzI2xsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmJ5dGVzX19pbl9fLCAmYnl0ZXNfX2luX2xlbl9fLAotCSAgICAgICAgICAgICAgICAgICAgICAmZW5jb2RpbmcsCi0JICAgICAgICAgICAgICAgICAgICAgICZpc0V4dGVybmFsUmVwcmVzZW50YXRpb24pKQotCQlyZXR1cm4gTlVMTDsKLQlieXRlc19fbGVuX18gPSBieXRlc19faW5fbGVuX187Ci0JX3J2ID0gQ0ZTdHJpbmdDcmVhdGVXaXRoQnl0ZXMoKENGQWxsb2NhdG9yUmVmKU5VTEwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNfX2luX18sIGJ5dGVzX19sZW5fXywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0V4dGVybmFsUmVwcmVzZW50YXRpb24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInMjbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYnl0ZXNfX2luX18sICZieXRlc19faW5fbGVuX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlzRXh0ZXJuYWxSZXByZXNlbnRhdGlvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGJ5dGVzX19sZW5fXyA9IGJ5dGVzX19pbl9sZW5fXzsKKyAgICBfcnYgPSBDRlN0cmluZ0NyZWF0ZVdpdGhCeXRlcygoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlc19faW5fXywgYnl0ZXNfX2xlbl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRXh0ZXJuYWxSZXByZXNlbnRhdGlvbik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZfQ0ZTdHJpbmdHZXRTeXN0ZW1FbmNvZGluZyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZTdHJpbmdFbmNvZGluZyBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGU3RyaW5nRW5jb2RpbmcgX3J2OwogI2lmbmRlZiBDRlN0cmluZ0dldFN5c3RlbUVuY29kaW5nCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdHZXRTeXN0ZW1FbmNvZGluZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdHZXRTeXN0ZW1FbmNvZGluZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZTdHJpbmdHZXRTeXN0ZW1FbmNvZGluZygpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlN0cmluZ0dldFN5c3RlbUVuY29kaW5nKCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZfQ0ZTdHJpbmdHZXRNYXhpbXVtU2l6ZUZvckVuY29kaW5nKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRkluZGV4IF9ydjsKLQlDRkluZGV4IGxlbmd0aDsKLQlDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRkluZGV4IF9ydjsKKyAgICBDRkluZGV4IGxlbmd0aDsKKyAgICBDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nOwogI2lmbmRlZiBDRlN0cmluZ0dldE1heGltdW1TaXplRm9yRW5jb2RpbmcKLQlQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0dldE1heGltdW1TaXplRm9yRW5jb2RpbmcpOworICAgIFB5TWFjX1BSRUNIRUNLKENGU3RyaW5nR2V0TWF4aW11bVNpemVGb3JFbmNvZGluZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZsZW5ndGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZlbmNvZGluZykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGU3RyaW5nR2V0TWF4aW11bVNpemVGb3JFbmNvZGluZyhsZW5ndGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmNvZGluZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGU3RyaW5nR2V0TWF4aW11bVNpemVGb3JFbmNvZGluZyhsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRl9DRlN0cmluZ0lzRW5jb2RpbmdBdmFpbGFibGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCUNGU3RyaW5nRW5jb2RpbmcgZW5jb2Rpbmc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIENGU3RyaW5nRW5jb2RpbmcgZW5jb2Rpbmc7CiAjaWZuZGVmIENGU3RyaW5nSXNFbmNvZGluZ0F2YWlsYWJsZQotCVB5TWFjX1BSRUNIRUNLKENGU3RyaW5nSXNFbmNvZGluZ0F2YWlsYWJsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdJc0VuY29kaW5nQXZhaWxhYmxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZW5jb2RpbmcpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRlN0cmluZ0lzRW5jb2RpbmdBdmFpbGFibGUoZW5jb2RpbmcpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5jb2RpbmcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlN0cmluZ0lzRW5jb2RpbmdBdmFpbGFibGUoZW5jb2RpbmcpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGX0NGU3RyaW5nR2V0TmFtZU9mRW5jb2RpbmcoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGU3RyaW5nUmVmIF9ydjsKLQlDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlN0cmluZ1JlZiBfcnY7CisgICAgQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZzsKICNpZm5kZWYgQ0ZTdHJpbmdHZXROYW1lT2ZFbmNvZGluZwotCVB5TWFjX1BSRUNIRUNLKENGU3RyaW5nR2V0TmFtZU9mRW5jb2RpbmcpOworICAgIFB5TWFjX1BSRUNIRUNLKENGU3RyaW5nR2V0TmFtZU9mRW5jb2RpbmcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZlbmNvZGluZykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGU3RyaW5nR2V0TmFtZU9mRW5jb2RpbmcoZW5jb2RpbmcpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5jb2RpbmcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlN0cmluZ0dldE5hbWVPZkVuY29kaW5nKGVuY29kaW5nKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRl9DRlN0cmluZ0NvbnZlcnRFbmNvZGluZ1RvTlNTdHJpbmdFbmNvZGluZyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVUludDMyIF9ydjsKLQlDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBVSW50MzIgX3J2OworICAgIENGU3RyaW5nRW5jb2RpbmcgZW5jb2Rpbmc7CiAjaWZuZGVmIENGU3RyaW5nQ29udmVydEVuY29kaW5nVG9OU1N0cmluZ0VuY29kaW5nCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdDb252ZXJ0RW5jb2RpbmdUb05TU3RyaW5nRW5jb2RpbmcpOworICAgIFB5TWFjX1BSRUNIRUNLKENGU3RyaW5nQ29udmVydEVuY29kaW5nVG9OU1N0cmluZ0VuY29kaW5nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZW5jb2RpbmcpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRlN0cmluZ0NvbnZlcnRFbmNvZGluZ1RvTlNTdHJpbmdFbmNvZGluZyhlbmNvZGluZyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmNvZGluZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGU3RyaW5nQ29udmVydEVuY29kaW5nVG9OU1N0cmluZ0VuY29kaW5nKGVuY29kaW5nKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRl9DRlN0cmluZ0NvbnZlcnROU1N0cmluZ0VuY29kaW5nVG9FbmNvZGluZyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZTdHJpbmdFbmNvZGluZyBfcnY7Ci0JVUludDMyIGVuY29kaW5nOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlN0cmluZ0VuY29kaW5nIF9ydjsKKyAgICBVSW50MzIgZW5jb2Rpbmc7CiAjaWZuZGVmIENGU3RyaW5nQ29udmVydE5TU3RyaW5nRW5jb2RpbmdUb0VuY29kaW5nCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdDb252ZXJ0TlNTdHJpbmdFbmNvZGluZ1RvRW5jb2RpbmcpOworICAgIFB5TWFjX1BSRUNIRUNLKENGU3RyaW5nQ29udmVydE5TU3RyaW5nRW5jb2RpbmdUb0VuY29kaW5nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZW5jb2RpbmcpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRlN0cmluZ0NvbnZlcnROU1N0cmluZ0VuY29kaW5nVG9FbmNvZGluZyhlbmNvZGluZyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmNvZGluZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGU3RyaW5nQ29udmVydE5TU3RyaW5nRW5jb2RpbmdUb0VuY29kaW5nKGVuY29kaW5nKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRl9DRlN0cmluZ0NvbnZlcnRFbmNvZGluZ1RvV2luZG93c0NvZGVwYWdlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlVSW50MzIgX3J2OwotCUNGU3RyaW5nRW5jb2RpbmcgZW5jb2Rpbmc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFVJbnQzMiBfcnY7CisgICAgQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZzsKICNpZm5kZWYgQ0ZTdHJpbmdDb252ZXJ0RW5jb2RpbmdUb1dpbmRvd3NDb2RlcGFnZQotCVB5TWFjX1BSRUNIRUNLKENGU3RyaW5nQ29udmVydEVuY29kaW5nVG9XaW5kb3dzQ29kZXBhZ2UpOworICAgIFB5TWFjX1BSRUNIRUNLKENGU3RyaW5nQ29udmVydEVuY29kaW5nVG9XaW5kb3dzQ29kZXBhZ2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZlbmNvZGluZykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGU3RyaW5nQ29udmVydEVuY29kaW5nVG9XaW5kb3dzQ29kZXBhZ2UoZW5jb2RpbmcpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5jb2RpbmcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlN0cmluZ0NvbnZlcnRFbmNvZGluZ1RvV2luZG93c0NvZGVwYWdlKGVuY29kaW5nKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRl9DRlN0cmluZ0NvbnZlcnRXaW5kb3dzQ29kZXBhZ2VUb0VuY29kaW5nKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ0VuY29kaW5nIF9ydjsKLQlVSW50MzIgY29kZXBhZ2U7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGU3RyaW5nRW5jb2RpbmcgX3J2OworICAgIFVJbnQzMiBjb2RlcGFnZTsKICNpZm5kZWYgQ0ZTdHJpbmdDb252ZXJ0V2luZG93c0NvZGVwYWdlVG9FbmNvZGluZwotCVB5TWFjX1BSRUNIRUNLKENGU3RyaW5nQ29udmVydFdpbmRvd3NDb2RlcGFnZVRvRW5jb2RpbmcpOworICAgIFB5TWFjX1BSRUNIRUNLKENGU3RyaW5nQ29udmVydFdpbmRvd3NDb2RlcGFnZVRvRW5jb2RpbmcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZjb2RlcGFnZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGU3RyaW5nQ29udmVydFdpbmRvd3NDb2RlcGFnZVRvRW5jb2RpbmcoY29kZXBhZ2UpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY29kZXBhZ2UpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlN0cmluZ0NvbnZlcnRXaW5kb3dzQ29kZXBhZ2VUb0VuY29kaW5nKGNvZGVwYWdlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRl9DRlN0cmluZ0NvbnZlcnRFbmNvZGluZ1RvSUFOQUNoYXJTZXROYW1lKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ1JlZiBfcnY7Ci0JQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZTdHJpbmdSZWYgX3J2OworICAgIENGU3RyaW5nRW5jb2RpbmcgZW5jb2Rpbmc7CiAjaWZuZGVmIENGU3RyaW5nQ29udmVydEVuY29kaW5nVG9JQU5BQ2hhclNldE5hbWUKLQlQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0NvbnZlcnRFbmNvZGluZ1RvSUFOQUNoYXJTZXROYW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0NvbnZlcnRFbmNvZGluZ1RvSUFOQUNoYXJTZXROYW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZW5jb2RpbmcpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRlN0cmluZ0NvbnZlcnRFbmNvZGluZ1RvSUFOQUNoYXJTZXROYW1lKGVuY29kaW5nKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmVuY29kaW5nKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZTdHJpbmdDb252ZXJ0RW5jb2RpbmdUb0lBTkFDaGFyU2V0TmFtZShlbmNvZGluZyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZfQ0ZTdHJpbmdHZXRNb3N0Q29tcGF0aWJsZU1hY1N0cmluZ0VuY29kaW5nKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ0VuY29kaW5nIF9ydjsKLQlDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlN0cmluZ0VuY29kaW5nIF9ydjsKKyAgICBDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nOwogI2lmbmRlZiBDRlN0cmluZ0dldE1vc3RDb21wYXRpYmxlTWFjU3RyaW5nRW5jb2RpbmcKLQlQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0dldE1vc3RDb21wYXRpYmxlTWFjU3RyaW5nRW5jb2RpbmcpOworICAgIFB5TWFjX1BSRUNIRUNLKENGU3RyaW5nR2V0TW9zdENvbXBhdGlibGVNYWNTdHJpbmdFbmNvZGluZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmVuY29kaW5nKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZTdHJpbmdHZXRNb3N0Q29tcGF0aWJsZU1hY1N0cmluZ0VuY29kaW5nKGVuY29kaW5nKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmVuY29kaW5nKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZTdHJpbmdHZXRNb3N0Q29tcGF0aWJsZU1hY1N0cmluZ0VuY29kaW5nKGVuY29kaW5nKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRl9fX0NGU3RyaW5nTWFrZUNvbnN0YW50U3RyaW5nKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ1JlZiBfcnY7Ci0JY2hhciogY1N0cjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZTdHJpbmdSZWYgX3J2OworICAgIGNoYXIqIGNTdHI7CiAjaWZuZGVmIF9fQ0ZTdHJpbmdNYWtlQ29uc3RhbnRTdHJpbmcKLQlQeU1hY19QUkVDSEVDSyhfX0NGU3RyaW5nTWFrZUNvbnN0YW50U3RyaW5nKTsKKyAgICBQeU1hY19QUkVDSEVDSyhfX0NGU3RyaW5nTWFrZUNvbnN0YW50U3RyaW5nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInMiLAotCSAgICAgICAgICAgICAgICAgICAgICAmY1N0cikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IF9fQ0ZTdHJpbmdNYWtlQ29uc3RhbnRTdHJpbmcoY1N0cik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAicyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjU3RyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gX19DRlN0cmluZ01ha2VDb25zdGFudFN0cmluZyhjU3RyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRl9DRlVSTEdldFR5cGVJRChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZUeXBlSUQgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlR5cGVJRCBfcnY7CiAjaWZuZGVmIENGVVJMR2V0VHlwZUlECi0JUHlNYWNfUFJFQ0hFQ0soQ0ZVUkxHZXRUeXBlSUQpOworICAgIFB5TWFjX1BSRUNIRUNLKENGVVJMR2V0VHlwZUlEKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRlVSTEdldFR5cGVJRCgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlVSTEdldFR5cGVJRCgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGX0NGVVJMQ3JlYXRlV2l0aEJ5dGVzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlVSTFJlZiBfcnY7Ci0JdW5zaWduZWQgY2hhciAqVVJMQnl0ZXNfX2luX187Ci0JbG9uZyBVUkxCeXRlc19fbGVuX187Ci0JaW50IFVSTEJ5dGVzX19pbl9sZW5fXzsKLQlDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nOwotCUNGVVJMUmVmIGJhc2VVUkw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGVVJMUmVmIF9ydjsKKyAgICB1bnNpZ25lZCBjaGFyICpVUkxCeXRlc19faW5fXzsKKyAgICBsb25nIFVSTEJ5dGVzX19sZW5fXzsKKyAgICBpbnQgVVJMQnl0ZXNfX2luX2xlbl9fOworICAgIENGU3RyaW5nRW5jb2RpbmcgZW5jb2Rpbmc7CisgICAgQ0ZVUkxSZWYgYmFzZVVSTDsKICNpZm5kZWYgQ0ZVUkxDcmVhdGVXaXRoQnl0ZXMKLQlQeU1hY19QUkVDSEVDSyhDRlVSTENyZWF0ZVdpdGhCeXRlcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZVUkxDcmVhdGVXaXRoQnl0ZXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAicyNsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmVVJMQnl0ZXNfX2luX18sICZVUkxCeXRlc19faW5fbGVuX18sCi0JICAgICAgICAgICAgICAgICAgICAgICZlbmNvZGluZywKLQkgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWxDRlVSTFJlZk9ial9Db252ZXJ0LCAmYmFzZVVSTCkpCi0JCXJldHVybiBOVUxMOwotCVVSTEJ5dGVzX19sZW5fXyA9IFVSTEJ5dGVzX19pbl9sZW5fXzsKLQlfcnYgPSBDRlVSTENyZWF0ZVdpdGhCeXRlcygoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxCeXRlc19faW5fXywgVVJMQnl0ZXNfX2xlbl9fLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VVUkwpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZVUkxSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInMjbE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJlVSTEJ5dGVzX19pbl9fLCAmVVJMQnl0ZXNfX2luX2xlbl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsQ0ZVUkxSZWZPYmpfQ29udmVydCwgJmJhc2VVUkwpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBVUkxCeXRlc19fbGVuX18gPSBVUkxCeXRlc19faW5fbGVuX187CisgICAgX3J2ID0gQ0ZVUkxDcmVhdGVXaXRoQnl0ZXMoKENGQWxsb2NhdG9yUmVmKU5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMQnl0ZXNfX2luX18sIFVSTEJ5dGVzX19sZW5fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlVVJMKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGVVJMUmVmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRl9DRlVSTENyZWF0ZUZyb21GaWxlU3lzdGVtUmVwcmVzZW50YXRpb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGVVJMUmVmIF9ydjsKLQl1bnNpZ25lZCBjaGFyICpidWZmZXJfX2luX187Ci0JbG9uZyBidWZmZXJfX2xlbl9fOwotCWludCBidWZmZXJfX2luX2xlbl9fOwotCUJvb2xlYW4gaXNEaXJlY3Rvcnk7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGVVJMUmVmIF9ydjsKKyAgICB1bnNpZ25lZCBjaGFyICpidWZmZXJfX2luX187CisgICAgbG9uZyBidWZmZXJfX2xlbl9fOworICAgIGludCBidWZmZXJfX2luX2xlbl9fOworICAgIEJvb2xlYW4gaXNEaXJlY3Rvcnk7CiAjaWZuZGVmIENGVVJMQ3JlYXRlRnJvbUZpbGVTeXN0ZW1SZXByZXNlbnRhdGlvbgotCVB5TWFjX1BSRUNIRUNLKENGVVJMQ3JlYXRlRnJvbUZpbGVTeXN0ZW1SZXByZXNlbnRhdGlvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZVUkxDcmVhdGVGcm9tRmlsZVN5c3RlbVJlcHJlc2VudGF0aW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInMjbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZidWZmZXJfX2luX18sICZidWZmZXJfX2luX2xlbl9fLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXNEaXJlY3RvcnkpKQotCQlyZXR1cm4gTlVMTDsKLQlidWZmZXJfX2xlbl9fID0gYnVmZmVyX19pbl9sZW5fXzsKLQlfcnYgPSBDRlVSTENyZWF0ZUZyb21GaWxlU3lzdGVtUmVwcmVzZW50YXRpb24oKENGQWxsb2NhdG9yUmVmKU5VTEwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcl9faW5fXywgYnVmZmVyX19sZW5fXywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNEaXJlY3RvcnkpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZVUkxSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInMjbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZidWZmZXJfX2luX18sICZidWZmZXJfX2luX2xlbl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXNEaXJlY3RvcnkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBidWZmZXJfX2xlbl9fID0gYnVmZmVyX19pbl9sZW5fXzsKKyAgICBfcnYgPSBDRlVSTENyZWF0ZUZyb21GaWxlU3lzdGVtUmVwcmVzZW50YXRpb24oKENGQWxsb2NhdG9yUmVmKU5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcl9faW5fXywgYnVmZmVyX19sZW5fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNEaXJlY3RvcnkpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZVUkxSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGX0NGVVJMQ3JlYXRlRnJvbUZpbGVTeXN0ZW1SZXByZXNlbnRhdGlvblJlbGF0aXZlVG9CYXNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlVSTFJlZiBfcnY7Ci0JdW5zaWduZWQgY2hhciAqYnVmZmVyX19pbl9fOwotCWxvbmcgYnVmZmVyX19sZW5fXzsKLQlpbnQgYnVmZmVyX19pbl9sZW5fXzsKLQlCb29sZWFuIGlzRGlyZWN0b3J5OwotCUNGVVJMUmVmIGJhc2VVUkw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGVVJMUmVmIF9ydjsKKyAgICB1bnNpZ25lZCBjaGFyICpidWZmZXJfX2luX187CisgICAgbG9uZyBidWZmZXJfX2xlbl9fOworICAgIGludCBidWZmZXJfX2luX2xlbl9fOworICAgIEJvb2xlYW4gaXNEaXJlY3Rvcnk7CisgICAgQ0ZVUkxSZWYgYmFzZVVSTDsKICNpZm5kZWYgQ0ZVUkxDcmVhdGVGcm9tRmlsZVN5c3RlbVJlcHJlc2VudGF0aW9uUmVsYXRpdmVUb0Jhc2UKLQlQeU1hY19QUkVDSEVDSyhDRlVSTENyZWF0ZUZyb21GaWxlU3lzdGVtUmVwcmVzZW50YXRpb25SZWxhdGl2ZVRvQmFzZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZVUkxDcmVhdGVGcm9tRmlsZVN5c3RlbVJlcHJlc2VudGF0aW9uUmVsYXRpdmVUb0Jhc2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAicyNsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmYnVmZmVyX19pbl9fLCAmYnVmZmVyX19pbl9sZW5fXywKLQkgICAgICAgICAgICAgICAgICAgICAgJmlzRGlyZWN0b3J5LAotCSAgICAgICAgICAgICAgICAgICAgICBPcHRpb25hbENGVVJMUmVmT2JqX0NvbnZlcnQsICZiYXNlVVJMKSkKLQkJcmV0dXJuIE5VTEw7Ci0JYnVmZmVyX19sZW5fXyA9IGJ1ZmZlcl9faW5fbGVuX187Ci0JX3J2ID0gQ0ZVUkxDcmVhdGVGcm9tRmlsZVN5c3RlbVJlcHJlc2VudGF0aW9uUmVsYXRpdmVUb0Jhc2UoKENGQWxsb2NhdG9yUmVmKU5VTEwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyX19pbl9fLCBidWZmZXJfX2xlbl9fLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRGlyZWN0b3J5LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VVUkwpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZVUkxSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInMjbE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ1ZmZlcl9faW5fXywgJmJ1ZmZlcl9faW5fbGVuX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpc0RpcmVjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWxDRlVSTFJlZk9ial9Db252ZXJ0LCAmYmFzZVVSTCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGJ1ZmZlcl9fbGVuX18gPSBidWZmZXJfX2luX2xlbl9fOworICAgIF9ydiA9IENGVVJMQ3JlYXRlRnJvbUZpbGVTeXN0ZW1SZXByZXNlbnRhdGlvblJlbGF0aXZlVG9CYXNlKChDRkFsbG9jYXRvclJlZilOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcl9faW5fXywgYnVmZmVyX19sZW5fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0RpcmVjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlVVJMKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGVVJMUmVmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRl9DRlVSTENyZWF0ZUZyb21GU1JlZihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZVUkxSZWYgX3J2OwotCUZTUmVmIGZzUmVmOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlVSTFJlZiBfcnY7CisgICAgRlNSZWYgZnNSZWY7CiAjaWZuZGVmIENGVVJMQ3JlYXRlRnJvbUZTUmVmCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZVUkxDcmVhdGVGcm9tRlNSZWYpOworICAgIFB5TWFjX1BSRUNIRUNLKENGVVJMQ3JlYXRlRnJvbUZTUmVmKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNSZWYsICZmc1JlZikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGVVJMQ3JlYXRlRnJvbUZTUmVmKChDRkFsbG9jYXRvclJlZilOVUxMLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZmc1JlZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlVSTFJlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1JlZiwgJmZzUmVmKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZVUkxDcmVhdGVGcm9tRlNSZWYoKENGQWxsb2NhdG9yUmVmKU5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZzUmVmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGVVJMUmVmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRl90b0NGKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAKLQlDRlR5cGVSZWYgcnY7Ci0JQ0ZUeXBlSUQgdHlwZWlkOworICAgIENGVHlwZVJlZiBydjsKKyAgICBDRlR5cGVJRCB0eXBlaWQ7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsIFB5Q0ZfUHl0aG9uMkNGLCAmcnYpKQotCSAgICAgICAgcmV0dXJuIE5VTEw7Ci0JdHlwZWlkID0gQ0ZHZXRUeXBlSUQocnYpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwgUHlDRl9QeXRob24yQ0YsICZydikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHR5cGVpZCA9IENGR2V0VHlwZUlEKHJ2KTsKIAotCWlmICh0eXBlaWQgPT0gQ0ZTdHJpbmdHZXRUeXBlSUQoKSkKLQkgICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPJiIsIENGU3RyaW5nUmVmT2JqX05ldywgcnYpOwotCWlmICh0eXBlaWQgPT0gQ0ZBcnJheUdldFR5cGVJRCgpKQotCSAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgQ0ZBcnJheVJlZk9ial9OZXcsIHJ2KTsKLQlpZiAodHlwZWlkID09IENGRGljdGlvbmFyeUdldFR5cGVJRCgpKQotCSAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgQ0ZEaWN0aW9uYXJ5UmVmT2JqX05ldywgcnYpOwotCWlmICh0eXBlaWQgPT0gQ0ZVUkxHZXRUeXBlSUQoKSkKLQkgICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPJiIsIENGVVJMUmVmT2JqX05ldywgcnYpOworICAgIGlmICh0eXBlaWQgPT0gQ0ZTdHJpbmdHZXRUeXBlSUQoKSkKKyAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBydik7CisgICAgaWYgKHR5cGVpZCA9PSBDRkFycmF5R2V0VHlwZUlEKCkpCisgICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPJiIsIENGQXJyYXlSZWZPYmpfTmV3LCBydik7CisgICAgaWYgKHR5cGVpZCA9PSBDRkRpY3Rpb25hcnlHZXRUeXBlSUQoKSkKKyAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgQ0ZEaWN0aW9uYXJ5UmVmT2JqX05ldywgcnYpOworICAgIGlmICh0eXBlaWQgPT0gQ0ZVUkxHZXRUeXBlSUQoKSkKKyAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgQ0ZVUkxSZWZPYmpfTmV3LCBydik7CiAKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLCBDRlR5cGVSZWZPYmpfTmV3LCBydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwgQ0ZUeXBlUmVmT2JqX05ldywgcnYpOworICAgIHJldHVybiBfcmVzOwogCiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBDRl9tZXRob2RzW10gPSB7Ci0JeyJfX0NGUmFuZ2VNYWtlIiwgKFB5Q0Z1bmN0aW9uKUNGX19fQ0ZSYW5nZU1ha2UsIDEsCi0JIFB5RG9jX1NUUigiKENGSW5kZXggbG9jLCBDRkluZGV4IGxlbikgLT4gKENGUmFuZ2UgX3J2KSIpfSwKLQl7IkNGQWxsb2NhdG9yR2V0VHlwZUlEIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGQWxsb2NhdG9yR2V0VHlwZUlELCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDRlR5cGVJRCBfcnYpIil9LAotCXsiQ0ZBbGxvY2F0b3JHZXRQcmVmZXJyZWRTaXplRm9yU2l6ZSIsIChQeUNGdW5jdGlvbilDRl9DRkFsbG9jYXRvckdldFByZWZlcnJlZFNpemVGb3JTaXplLCAxLAotCSBQeURvY19TVFIoIihDRkluZGV4IHNpemUsIENGT3B0aW9uRmxhZ3MgaGludCkgLT4gKENGSW5kZXggX3J2KSIpfSwKLQl7IkNGQ29weVR5cGVJRERlc2NyaXB0aW9uIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGQ29weVR5cGVJRERlc2NyaXB0aW9uLCAxLAotCSBQeURvY19TVFIoIihDRlR5cGVJRCB0eXBlX2lkKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKLQl7IkNGQXJyYXlHZXRUeXBlSUQiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZBcnJheUdldFR5cGVJRCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZUeXBlSUQgX3J2KSIpfSwKLQl7IkNGQXJyYXlDcmVhdGVNdXRhYmxlIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGQXJyYXlDcmVhdGVNdXRhYmxlLCAxLAotCSBQeURvY19TVFIoIihDRkluZGV4IGNhcGFjaXR5KSAtPiAoQ0ZNdXRhYmxlQXJyYXlSZWYgX3J2KSIpfSwKLQl7IkNGQXJyYXlDcmVhdGVNdXRhYmxlQ29weSIsIChQeUNGdW5jdGlvbilDRl9DRkFycmF5Q3JlYXRlTXV0YWJsZUNvcHksIDEsCi0JIFB5RG9jX1NUUigiKENGSW5kZXggY2FwYWNpdHksIENGQXJyYXlSZWYgdGhlQXJyYXkpIC0+IChDRk11dGFibGVBcnJheVJlZiBfcnYpIil9LAotCXsiQ0ZEYXRhR2V0VHlwZUlEIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGRGF0YUdldFR5cGVJRCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZUeXBlSUQgX3J2KSIpfSwKLQl7IkNGRGF0YUNyZWF0ZSIsIChQeUNGdW5jdGlvbilDRl9DRkRhdGFDcmVhdGUsIDEsCi0JIFB5RG9jX1NUUigiKEJ1ZmZlciBieXRlcykgLT4gKENGRGF0YVJlZiBfcnYpIil9LAotCXsiQ0ZEYXRhQ3JlYXRlV2l0aEJ5dGVzTm9Db3B5IiwgKFB5Q0Z1bmN0aW9uKUNGX0NGRGF0YUNyZWF0ZVdpdGhCeXRlc05vQ29weSwgMSwKLQkgUHlEb2NfU1RSKCIoQnVmZmVyIGJ5dGVzKSAtPiAoQ0ZEYXRhUmVmIF9ydikiKX0sCi0JeyJDRkRhdGFDcmVhdGVNdXRhYmxlIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGRGF0YUNyZWF0ZU11dGFibGUsIDEsCi0JIFB5RG9jX1NUUigiKENGSW5kZXggY2FwYWNpdHkpIC0+IChDRk11dGFibGVEYXRhUmVmIF9ydikiKX0sCi0JeyJDRkRhdGFDcmVhdGVNdXRhYmxlQ29weSIsIChQeUNGdW5jdGlvbilDRl9DRkRhdGFDcmVhdGVNdXRhYmxlQ29weSwgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZJbmRleCBjYXBhY2l0eSwgQ0ZEYXRhUmVmIHRoZURhdGEpIC0+IChDRk11dGFibGVEYXRhUmVmIF9ydikiKX0sCi0JeyJDRkRpY3Rpb25hcnlHZXRUeXBlSUQiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZEaWN0aW9uYXJ5R2V0VHlwZUlELCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDRlR5cGVJRCBfcnYpIil9LAotCXsiQ0ZEaWN0aW9uYXJ5Q3JlYXRlTXV0YWJsZSIsIChQeUNGdW5jdGlvbilDRl9DRkRpY3Rpb25hcnlDcmVhdGVNdXRhYmxlLCAxLAotCSBQeURvY19TVFIoIihDRkluZGV4IGNhcGFjaXR5KSAtPiAoQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZiBfcnYpIil9LAotCXsiQ0ZEaWN0aW9uYXJ5Q3JlYXRlTXV0YWJsZUNvcHkiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZEaWN0aW9uYXJ5Q3JlYXRlTXV0YWJsZUNvcHksIDEsCi0JIFB5RG9jX1NUUigiKENGSW5kZXggY2FwYWNpdHksIENGRGljdGlvbmFyeVJlZiB0aGVEaWN0KSAtPiAoQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZiBfcnYpIil9LAotCXsiQ0ZQcmVmZXJlbmNlc0NvcHlBcHBWYWx1ZSIsIChQeUNGdW5jdGlvbilDRl9DRlByZWZlcmVuY2VzQ29weUFwcFZhbHVlLCAxLAotCSBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBrZXksIENGU3RyaW5nUmVmIGFwcGxpY2F0aW9uSUQpIC0+IChDRlR5cGVSZWYgX3J2KSIpfSwKLQl7IkNGUHJlZmVyZW5jZXNHZXRBcHBCb29sZWFuVmFsdWUiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZQcmVmZXJlbmNlc0dldEFwcEJvb2xlYW5WYWx1ZSwgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYga2V5LCBDRlN0cmluZ1JlZiBhcHBsaWNhdGlvbklEKSAtPiAoQm9vbGVhbiBfcnYsIEJvb2xlYW4ga2V5RXhpc3RzQW5kSGFzVmFsaWRGb3JtYXQpIil9LAotCXsiQ0ZQcmVmZXJlbmNlc0dldEFwcEludGVnZXJWYWx1ZSIsIChQeUNGdW5jdGlvbilDRl9DRlByZWZlcmVuY2VzR2V0QXBwSW50ZWdlclZhbHVlLCAxLAotCSBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBrZXksIENGU3RyaW5nUmVmIGFwcGxpY2F0aW9uSUQpIC0+IChDRkluZGV4IF9ydiwgQm9vbGVhbiBrZXlFeGlzdHNBbmRIYXNWYWxpZEZvcm1hdCkiKX0sCi0JeyJDRlByZWZlcmVuY2VzU2V0QXBwVmFsdWUiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZQcmVmZXJlbmNlc1NldEFwcFZhbHVlLCAxLAotCSBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBrZXksIENGVHlwZVJlZiB2YWx1ZSwgQ0ZTdHJpbmdSZWYgYXBwbGljYXRpb25JRCkgLT4gTm9uZSIpfSwKLQl7IkNGUHJlZmVyZW5jZXNBZGRTdWl0ZVByZWZlcmVuY2VzVG9BcHAiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZQcmVmZXJlbmNlc0FkZFN1aXRlUHJlZmVyZW5jZXNUb0FwcCwgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgYXBwbGljYXRpb25JRCwgQ0ZTdHJpbmdSZWYgc3VpdGVJRCkgLT4gTm9uZSIpfSwKLQl7IkNGUHJlZmVyZW5jZXNSZW1vdmVTdWl0ZVByZWZlcmVuY2VzRnJvbUFwcCIsIChQeUNGdW5jdGlvbilDRl9DRlByZWZlcmVuY2VzUmVtb3ZlU3VpdGVQcmVmZXJlbmNlc0Zyb21BcHAsIDEsCi0JIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIGFwcGxpY2F0aW9uSUQsIENGU3RyaW5nUmVmIHN1aXRlSUQpIC0+IE5vbmUiKX0sCi0JeyJDRlByZWZlcmVuY2VzQXBwU3luY2hyb25pemUiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZQcmVmZXJlbmNlc0FwcFN5bmNocm9uaXplLCAxLAotCSBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBhcHBsaWNhdGlvbklEKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiQ0ZQcmVmZXJlbmNlc0NvcHlWYWx1ZSIsIChQeUNGdW5jdGlvbilDRl9DRlByZWZlcmVuY2VzQ29weVZhbHVlLCAxLAotCSBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBrZXksIENGU3RyaW5nUmVmIGFwcGxpY2F0aW9uSUQsIENGU3RyaW5nUmVmIHVzZXJOYW1lLCBDRlN0cmluZ1JlZiBob3N0TmFtZSkgLT4gKENGVHlwZVJlZiBfcnYpIil9LAotCXsiQ0ZQcmVmZXJlbmNlc0NvcHlNdWx0aXBsZSIsIChQeUNGdW5jdGlvbilDRl9DRlByZWZlcmVuY2VzQ29weU11bHRpcGxlLCAxLAotCSBQeURvY19TVFIoIihDRkFycmF5UmVmIGtleXNUb0ZldGNoLCBDRlN0cmluZ1JlZiBhcHBsaWNhdGlvbklELCBDRlN0cmluZ1JlZiB1c2VyTmFtZSwgQ0ZTdHJpbmdSZWYgaG9zdE5hbWUpIC0+IChDRkRpY3Rpb25hcnlSZWYgX3J2KSIpfSwKLQl7IkNGUHJlZmVyZW5jZXNTZXRWYWx1ZSIsIChQeUNGdW5jdGlvbilDRl9DRlByZWZlcmVuY2VzU2V0VmFsdWUsIDEsCi0JIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIGtleSwgQ0ZUeXBlUmVmIHZhbHVlLCBDRlN0cmluZ1JlZiBhcHBsaWNhdGlvbklELCBDRlN0cmluZ1JlZiB1c2VyTmFtZSwgQ0ZTdHJpbmdSZWYgaG9zdE5hbWUpIC0+IE5vbmUiKX0sCi0JeyJDRlByZWZlcmVuY2VzU2V0TXVsdGlwbGUiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZQcmVmZXJlbmNlc1NldE11bHRpcGxlLCAxLAotCSBQeURvY19TVFIoIihDRkRpY3Rpb25hcnlSZWYga2V5c1RvU2V0LCBDRkFycmF5UmVmIGtleXNUb1JlbW92ZSwgQ0ZTdHJpbmdSZWYgYXBwbGljYXRpb25JRCwgQ0ZTdHJpbmdSZWYgdXNlck5hbWUsIENGU3RyaW5nUmVmIGhvc3ROYW1lKSAtPiBOb25lIil9LAotCXsiQ0ZQcmVmZXJlbmNlc1N5bmNocm9uaXplIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGUHJlZmVyZW5jZXNTeW5jaHJvbml6ZSwgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgYXBwbGljYXRpb25JRCwgQ0ZTdHJpbmdSZWYgdXNlck5hbWUsIENGU3RyaW5nUmVmIGhvc3ROYW1lKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiQ0ZQcmVmZXJlbmNlc0NvcHlBcHBsaWNhdGlvbkxpc3QiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZQcmVmZXJlbmNlc0NvcHlBcHBsaWNhdGlvbkxpc3QsIDEsCi0JIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIHVzZXJOYW1lLCBDRlN0cmluZ1JlZiBob3N0TmFtZSkgLT4gKENGQXJyYXlSZWYgX3J2KSIpfSwKLQl7IkNGUHJlZmVyZW5jZXNDb3B5S2V5TGlzdCIsIChQeUNGdW5jdGlvbilDRl9DRlByZWZlcmVuY2VzQ29weUtleUxpc3QsIDEsCi0JIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIGFwcGxpY2F0aW9uSUQsIENGU3RyaW5nUmVmIHVzZXJOYW1lLCBDRlN0cmluZ1JlZiBob3N0TmFtZSkgLT4gKENGQXJyYXlSZWYgX3J2KSIpfSwKLQl7IkNGU3RyaW5nR2V0VHlwZUlEIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGU3RyaW5nR2V0VHlwZUlELCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDRlR5cGVJRCBfcnYpIil9LAotCXsiQ0ZTdHJpbmdDcmVhdGVXaXRoUGFzY2FsU3RyaW5nIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGU3RyaW5nQ3JlYXRlV2l0aFBhc2NhbFN0cmluZywgMSwKLQkgUHlEb2NfU1RSKCIoU3RyMjU1IHBTdHIsIENGU3RyaW5nRW5jb2RpbmcgZW5jb2RpbmcpIC0+IChDRlN0cmluZ1JlZiBfcnYpIil9LAotCXsiQ0ZTdHJpbmdDcmVhdGVXaXRoQ1N0cmluZyIsIChQeUNGdW5jdGlvbilDRl9DRlN0cmluZ0NyZWF0ZVdpdGhDU3RyaW5nLCAxLAotCSBQeURvY19TVFIoIihjaGFyKiBjU3RyLCBDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKLQl7IkNGU3RyaW5nQ3JlYXRlV2l0aENoYXJhY3RlcnMiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZTdHJpbmdDcmVhdGVXaXRoQ2hhcmFjdGVycywgMSwKLQkgUHlEb2NfU1RSKCIoQnVmZmVyIGNoYXJzKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKLQl7IkNGU3RyaW5nQ3JlYXRlV2l0aFBhc2NhbFN0cmluZ05vQ29weSIsIChQeUNGdW5jdGlvbilDRl9DRlN0cmluZ0NyZWF0ZVdpdGhQYXNjYWxTdHJpbmdOb0NvcHksIDEsCi0JIFB5RG9jX1NUUigiKFN0cjI1NSBwU3RyLCBDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKLQl7IkNGU3RyaW5nQ3JlYXRlV2l0aENTdHJpbmdOb0NvcHkiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZTdHJpbmdDcmVhdGVXaXRoQ1N0cmluZ05vQ29weSwgMSwKLQkgUHlEb2NfU1RSKCIoY2hhciogY1N0ciwgQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZykgLT4gKENGU3RyaW5nUmVmIF9ydikiKX0sCi0JeyJDRlN0cmluZ0NyZWF0ZVdpdGhDaGFyYWN0ZXJzTm9Db3B5IiwgKFB5Q0Z1bmN0aW9uKUNGX0NGU3RyaW5nQ3JlYXRlV2l0aENoYXJhY3RlcnNOb0NvcHksIDEsCi0JIFB5RG9jX1NUUigiKEJ1ZmZlciBjaGFycykgLT4gKENGU3RyaW5nUmVmIF9ydikiKX0sCi0JeyJDRlN0cmluZ0NyZWF0ZU11dGFibGUiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZTdHJpbmdDcmVhdGVNdXRhYmxlLCAxLAotCSBQeURvY19TVFIoIihDRkluZGV4IG1heExlbmd0aCkgLT4gKENGTXV0YWJsZVN0cmluZ1JlZiBfcnYpIil9LAotCXsiQ0ZTdHJpbmdDcmVhdGVNdXRhYmxlQ29weSIsIChQeUNGdW5jdGlvbilDRl9DRlN0cmluZ0NyZWF0ZU11dGFibGVDb3B5LCAxLAotCSBQeURvY19TVFIoIihDRkluZGV4IG1heExlbmd0aCwgQ0ZTdHJpbmdSZWYgdGhlU3RyaW5nKSAtPiAoQ0ZNdXRhYmxlU3RyaW5nUmVmIF9ydikiKX0sCi0JeyJDRlN0cmluZ0NyZWF0ZVdpdGhCeXRlcyIsIChQeUNGdW5jdGlvbilDRl9DRlN0cmluZ0NyZWF0ZVdpdGhCeXRlcywgMSwKLQkgUHlEb2NfU1RSKCIoQnVmZmVyIGJ5dGVzLCBDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nLCBCb29sZWFuIGlzRXh0ZXJuYWxSZXByZXNlbnRhdGlvbikgLT4gKENGU3RyaW5nUmVmIF9ydikiKX0sCi0JeyJDRlN0cmluZ0dldFN5c3RlbUVuY29kaW5nIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGU3RyaW5nR2V0U3lzdGVtRW5jb2RpbmcsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENGU3RyaW5nRW5jb2RpbmcgX3J2KSIpfSwKLQl7IkNGU3RyaW5nR2V0TWF4aW11bVNpemVGb3JFbmNvZGluZyIsIChQeUNGdW5jdGlvbilDRl9DRlN0cmluZ0dldE1heGltdW1TaXplRm9yRW5jb2RpbmcsIDEsCi0JIFB5RG9jX1NUUigiKENGSW5kZXggbGVuZ3RoLCBDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nKSAtPiAoQ0ZJbmRleCBfcnYpIil9LAotCXsiQ0ZTdHJpbmdJc0VuY29kaW5nQXZhaWxhYmxlIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGU3RyaW5nSXNFbmNvZGluZ0F2YWlsYWJsZSwgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZykgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IkNGU3RyaW5nR2V0TmFtZU9mRW5jb2RpbmciLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZTdHJpbmdHZXROYW1lT2ZFbmNvZGluZywgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZykgLT4gKENGU3RyaW5nUmVmIF9ydikiKX0sCi0JeyJDRlN0cmluZ0NvbnZlcnRFbmNvZGluZ1RvTlNTdHJpbmdFbmNvZGluZyIsIChQeUNGdW5jdGlvbilDRl9DRlN0cmluZ0NvbnZlcnRFbmNvZGluZ1RvTlNTdHJpbmdFbmNvZGluZywgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZykgLT4gKFVJbnQzMiBfcnYpIil9LAotCXsiQ0ZTdHJpbmdDb252ZXJ0TlNTdHJpbmdFbmNvZGluZ1RvRW5jb2RpbmciLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZTdHJpbmdDb252ZXJ0TlNTdHJpbmdFbmNvZGluZ1RvRW5jb2RpbmcsIDEsCi0JIFB5RG9jX1NUUigiKFVJbnQzMiBlbmNvZGluZykgLT4gKENGU3RyaW5nRW5jb2RpbmcgX3J2KSIpfSwKLQl7IkNGU3RyaW5nQ29udmVydEVuY29kaW5nVG9XaW5kb3dzQ29kZXBhZ2UiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZTdHJpbmdDb252ZXJ0RW5jb2RpbmdUb1dpbmRvd3NDb2RlcGFnZSwgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZykgLT4gKFVJbnQzMiBfcnYpIil9LAotCXsiQ0ZTdHJpbmdDb252ZXJ0V2luZG93c0NvZGVwYWdlVG9FbmNvZGluZyIsIChQeUNGdW5jdGlvbilDRl9DRlN0cmluZ0NvbnZlcnRXaW5kb3dzQ29kZXBhZ2VUb0VuY29kaW5nLCAxLAotCSBQeURvY19TVFIoIihVSW50MzIgY29kZXBhZ2UpIC0+IChDRlN0cmluZ0VuY29kaW5nIF9ydikiKX0sCi0JeyJDRlN0cmluZ0NvbnZlcnRFbmNvZGluZ1RvSUFOQUNoYXJTZXROYW1lIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGU3RyaW5nQ29udmVydEVuY29kaW5nVG9JQU5BQ2hhclNldE5hbWUsIDEsCi0JIFB5RG9jX1NUUigiKENGU3RyaW5nRW5jb2RpbmcgZW5jb2RpbmcpIC0+IChDRlN0cmluZ1JlZiBfcnYpIil9LAotCXsiQ0ZTdHJpbmdHZXRNb3N0Q29tcGF0aWJsZU1hY1N0cmluZ0VuY29kaW5nIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGU3RyaW5nR2V0TW9zdENvbXBhdGlibGVNYWNTdHJpbmdFbmNvZGluZywgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZykgLT4gKENGU3RyaW5nRW5jb2RpbmcgX3J2KSIpfSwKLQl7Il9fQ0ZTdHJpbmdNYWtlQ29uc3RhbnRTdHJpbmciLCAoUHlDRnVuY3Rpb24pQ0ZfX19DRlN0cmluZ01ha2VDb25zdGFudFN0cmluZywgMSwKLQkgUHlEb2NfU1RSKCIoY2hhciogY1N0cikgLT4gKENGU3RyaW5nUmVmIF9ydikiKX0sCi0JeyJDRlVSTEdldFR5cGVJRCIsIChQeUNGdW5jdGlvbilDRl9DRlVSTEdldFR5cGVJRCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZUeXBlSUQgX3J2KSIpfSwKLQl7IkNGVVJMQ3JlYXRlV2l0aEJ5dGVzIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGVVJMQ3JlYXRlV2l0aEJ5dGVzLCAxLAotCSBQeURvY19TVFIoIihCdWZmZXIgVVJMQnl0ZXMsIENGU3RyaW5nRW5jb2RpbmcgZW5jb2RpbmcsIENGVVJMUmVmIGJhc2VVUkwpIC0+IChDRlVSTFJlZiBfcnYpIil9LAotCXsiQ0ZVUkxDcmVhdGVGcm9tRmlsZVN5c3RlbVJlcHJlc2VudGF0aW9uIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGVVJMQ3JlYXRlRnJvbUZpbGVTeXN0ZW1SZXByZXNlbnRhdGlvbiwgMSwKLQkgUHlEb2NfU1RSKCIoQnVmZmVyIGJ1ZmZlciwgQm9vbGVhbiBpc0RpcmVjdG9yeSkgLT4gKENGVVJMUmVmIF9ydikiKX0sCi0JeyJDRlVSTENyZWF0ZUZyb21GaWxlU3lzdGVtUmVwcmVzZW50YXRpb25SZWxhdGl2ZVRvQmFzZSIsIChQeUNGdW5jdGlvbilDRl9DRlVSTENyZWF0ZUZyb21GaWxlU3lzdGVtUmVwcmVzZW50YXRpb25SZWxhdGl2ZVRvQmFzZSwgMSwKLQkgUHlEb2NfU1RSKCIoQnVmZmVyIGJ1ZmZlciwgQm9vbGVhbiBpc0RpcmVjdG9yeSwgQ0ZVUkxSZWYgYmFzZVVSTCkgLT4gKENGVVJMUmVmIF9ydikiKX0sCi0JeyJDRlVSTENyZWF0ZUZyb21GU1JlZiIsIChQeUNGdW5jdGlvbilDRl9DRlVSTENyZWF0ZUZyb21GU1JlZiwgMSwKLQkgUHlEb2NfU1RSKCIoRlNSZWYgZnNSZWYpIC0+IChDRlVSTFJlZiBfcnYpIil9LAotCXsidG9DRiIsIChQeUNGdW5jdGlvbilDRl90b0NGLCAxLAotCSBQeURvY19TVFIoIihweXRob25fb2JqZWN0KSAtPiAoQ0Zfb2JqZWN0KSIpfSwKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7Il9fQ0ZSYW5nZU1ha2UiLCAoUHlDRnVuY3Rpb24pQ0ZfX19DRlJhbmdlTWFrZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZJbmRleCBsb2MsIENGSW5kZXggbGVuKSAtPiAoQ0ZSYW5nZSBfcnYpIil9LAorICAgIHsiQ0ZBbGxvY2F0b3JHZXRUeXBlSUQiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZBbGxvY2F0b3JHZXRUeXBlSUQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENGVHlwZUlEIF9ydikiKX0sCisgICAgeyJDRkFsbG9jYXRvckdldFByZWZlcnJlZFNpemVGb3JTaXplIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGQWxsb2NhdG9yR2V0UHJlZmVycmVkU2l6ZUZvclNpemUsIDEsCisgICAgIFB5RG9jX1NUUigiKENGSW5kZXggc2l6ZSwgQ0ZPcHRpb25GbGFncyBoaW50KSAtPiAoQ0ZJbmRleCBfcnYpIil9LAorICAgIHsiQ0ZDb3B5VHlwZUlERGVzY3JpcHRpb24iLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZDb3B5VHlwZUlERGVzY3JpcHRpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKENGVHlwZUlEIHR5cGVfaWQpIC0+IChDRlN0cmluZ1JlZiBfcnYpIil9LAorICAgIHsiQ0ZBcnJheUdldFR5cGVJRCIsIChQeUNGdW5jdGlvbilDRl9DRkFycmF5R2V0VHlwZUlELCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDRlR5cGVJRCBfcnYpIil9LAorICAgIHsiQ0ZBcnJheUNyZWF0ZU11dGFibGUiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZBcnJheUNyZWF0ZU11dGFibGUsIDEsCisgICAgIFB5RG9jX1NUUigiKENGSW5kZXggY2FwYWNpdHkpIC0+IChDRk11dGFibGVBcnJheVJlZiBfcnYpIil9LAorICAgIHsiQ0ZBcnJheUNyZWF0ZU11dGFibGVDb3B5IiwgKFB5Q0Z1bmN0aW9uKUNGX0NGQXJyYXlDcmVhdGVNdXRhYmxlQ29weSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZJbmRleCBjYXBhY2l0eSwgQ0ZBcnJheVJlZiB0aGVBcnJheSkgLT4gKENGTXV0YWJsZUFycmF5UmVmIF9ydikiKX0sCisgICAgeyJDRkRhdGFHZXRUeXBlSUQiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZEYXRhR2V0VHlwZUlELCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDRlR5cGVJRCBfcnYpIil9LAorICAgIHsiQ0ZEYXRhQ3JlYXRlIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGRGF0YUNyZWF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQnVmZmVyIGJ5dGVzKSAtPiAoQ0ZEYXRhUmVmIF9ydikiKX0sCisgICAgeyJDRkRhdGFDcmVhdGVXaXRoQnl0ZXNOb0NvcHkiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZEYXRhQ3JlYXRlV2l0aEJ5dGVzTm9Db3B5LCAxLAorICAgICBQeURvY19TVFIoIihCdWZmZXIgYnl0ZXMpIC0+IChDRkRhdGFSZWYgX3J2KSIpfSwKKyAgICB7IkNGRGF0YUNyZWF0ZU11dGFibGUiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZEYXRhQ3JlYXRlTXV0YWJsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZJbmRleCBjYXBhY2l0eSkgLT4gKENGTXV0YWJsZURhdGFSZWYgX3J2KSIpfSwKKyAgICB7IkNGRGF0YUNyZWF0ZU11dGFibGVDb3B5IiwgKFB5Q0Z1bmN0aW9uKUNGX0NGRGF0YUNyZWF0ZU11dGFibGVDb3B5LCAxLAorICAgICBQeURvY19TVFIoIihDRkluZGV4IGNhcGFjaXR5LCBDRkRhdGFSZWYgdGhlRGF0YSkgLT4gKENGTXV0YWJsZURhdGFSZWYgX3J2KSIpfSwKKyAgICB7IkNGRGljdGlvbmFyeUdldFR5cGVJRCIsIChQeUNGdW5jdGlvbilDRl9DRkRpY3Rpb25hcnlHZXRUeXBlSUQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENGVHlwZUlEIF9ydikiKX0sCisgICAgeyJDRkRpY3Rpb25hcnlDcmVhdGVNdXRhYmxlIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGRGljdGlvbmFyeUNyZWF0ZU11dGFibGUsIDEsCisgICAgIFB5RG9jX1NUUigiKENGSW5kZXggY2FwYWNpdHkpIC0+IChDRk11dGFibGVEaWN0aW9uYXJ5UmVmIF9ydikiKX0sCisgICAgeyJDRkRpY3Rpb25hcnlDcmVhdGVNdXRhYmxlQ29weSIsIChQeUNGdW5jdGlvbilDRl9DRkRpY3Rpb25hcnlDcmVhdGVNdXRhYmxlQ29weSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZJbmRleCBjYXBhY2l0eSwgQ0ZEaWN0aW9uYXJ5UmVmIHRoZURpY3QpIC0+IChDRk11dGFibGVEaWN0aW9uYXJ5UmVmIF9ydikiKX0sCisgICAgeyJDRlByZWZlcmVuY2VzQ29weUFwcFZhbHVlIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGUHJlZmVyZW5jZXNDb3B5QXBwVmFsdWUsIDEsCisgICAgIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIGtleSwgQ0ZTdHJpbmdSZWYgYXBwbGljYXRpb25JRCkgLT4gKENGVHlwZVJlZiBfcnYpIil9LAorICAgIHsiQ0ZQcmVmZXJlbmNlc0dldEFwcEJvb2xlYW5WYWx1ZSIsIChQeUNGdW5jdGlvbilDRl9DRlByZWZlcmVuY2VzR2V0QXBwQm9vbGVhblZhbHVlLCAxLAorICAgICBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBrZXksIENGU3RyaW5nUmVmIGFwcGxpY2F0aW9uSUQpIC0+IChCb29sZWFuIF9ydiwgQm9vbGVhbiBrZXlFeGlzdHNBbmRIYXNWYWxpZEZvcm1hdCkiKX0sCisgICAgeyJDRlByZWZlcmVuY2VzR2V0QXBwSW50ZWdlclZhbHVlIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGUHJlZmVyZW5jZXNHZXRBcHBJbnRlZ2VyVmFsdWUsIDEsCisgICAgIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIGtleSwgQ0ZTdHJpbmdSZWYgYXBwbGljYXRpb25JRCkgLT4gKENGSW5kZXggX3J2LCBCb29sZWFuIGtleUV4aXN0c0FuZEhhc1ZhbGlkRm9ybWF0KSIpfSwKKyAgICB7IkNGUHJlZmVyZW5jZXNTZXRBcHBWYWx1ZSIsIChQeUNGdW5jdGlvbilDRl9DRlByZWZlcmVuY2VzU2V0QXBwVmFsdWUsIDEsCisgICAgIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIGtleSwgQ0ZUeXBlUmVmIHZhbHVlLCBDRlN0cmluZ1JlZiBhcHBsaWNhdGlvbklEKSAtPiBOb25lIil9LAorICAgIHsiQ0ZQcmVmZXJlbmNlc0FkZFN1aXRlUHJlZmVyZW5jZXNUb0FwcCIsIChQeUNGdW5jdGlvbilDRl9DRlByZWZlcmVuY2VzQWRkU3VpdGVQcmVmZXJlbmNlc1RvQXBwLCAxLAorICAgICBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBhcHBsaWNhdGlvbklELCBDRlN0cmluZ1JlZiBzdWl0ZUlEKSAtPiBOb25lIil9LAorICAgIHsiQ0ZQcmVmZXJlbmNlc1JlbW92ZVN1aXRlUHJlZmVyZW5jZXNGcm9tQXBwIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGUHJlZmVyZW5jZXNSZW1vdmVTdWl0ZVByZWZlcmVuY2VzRnJvbUFwcCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgYXBwbGljYXRpb25JRCwgQ0ZTdHJpbmdSZWYgc3VpdGVJRCkgLT4gTm9uZSIpfSwKKyAgICB7IkNGUHJlZmVyZW5jZXNBcHBTeW5jaHJvbml6ZSIsIChQeUNGdW5jdGlvbilDRl9DRlByZWZlcmVuY2VzQXBwU3luY2hyb25pemUsIDEsCisgICAgIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIGFwcGxpY2F0aW9uSUQpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJDRlByZWZlcmVuY2VzQ29weVZhbHVlIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGUHJlZmVyZW5jZXNDb3B5VmFsdWUsIDEsCisgICAgIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIGtleSwgQ0ZTdHJpbmdSZWYgYXBwbGljYXRpb25JRCwgQ0ZTdHJpbmdSZWYgdXNlck5hbWUsIENGU3RyaW5nUmVmIGhvc3ROYW1lKSAtPiAoQ0ZUeXBlUmVmIF9ydikiKX0sCisgICAgeyJDRlByZWZlcmVuY2VzQ29weU11bHRpcGxlIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGUHJlZmVyZW5jZXNDb3B5TXVsdGlwbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKENGQXJyYXlSZWYga2V5c1RvRmV0Y2gsIENGU3RyaW5nUmVmIGFwcGxpY2F0aW9uSUQsIENGU3RyaW5nUmVmIHVzZXJOYW1lLCBDRlN0cmluZ1JlZiBob3N0TmFtZSkgLT4gKENGRGljdGlvbmFyeVJlZiBfcnYpIil9LAorICAgIHsiQ0ZQcmVmZXJlbmNlc1NldFZhbHVlIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGUHJlZmVyZW5jZXNTZXRWYWx1ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYga2V5LCBDRlR5cGVSZWYgdmFsdWUsIENGU3RyaW5nUmVmIGFwcGxpY2F0aW9uSUQsIENGU3RyaW5nUmVmIHVzZXJOYW1lLCBDRlN0cmluZ1JlZiBob3N0TmFtZSkgLT4gTm9uZSIpfSwKKyAgICB7IkNGUHJlZmVyZW5jZXNTZXRNdWx0aXBsZSIsIChQeUNGdW5jdGlvbilDRl9DRlByZWZlcmVuY2VzU2V0TXVsdGlwbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKENGRGljdGlvbmFyeVJlZiBrZXlzVG9TZXQsIENGQXJyYXlSZWYga2V5c1RvUmVtb3ZlLCBDRlN0cmluZ1JlZiBhcHBsaWNhdGlvbklELCBDRlN0cmluZ1JlZiB1c2VyTmFtZSwgQ0ZTdHJpbmdSZWYgaG9zdE5hbWUpIC0+IE5vbmUiKX0sCisgICAgeyJDRlByZWZlcmVuY2VzU3luY2hyb25pemUiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZQcmVmZXJlbmNlc1N5bmNocm9uaXplLCAxLAorICAgICBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBhcHBsaWNhdGlvbklELCBDRlN0cmluZ1JlZiB1c2VyTmFtZSwgQ0ZTdHJpbmdSZWYgaG9zdE5hbWUpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJDRlByZWZlcmVuY2VzQ29weUFwcGxpY2F0aW9uTGlzdCIsIChQeUNGdW5jdGlvbilDRl9DRlByZWZlcmVuY2VzQ29weUFwcGxpY2F0aW9uTGlzdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgdXNlck5hbWUsIENGU3RyaW5nUmVmIGhvc3ROYW1lKSAtPiAoQ0ZBcnJheVJlZiBfcnYpIil9LAorICAgIHsiQ0ZQcmVmZXJlbmNlc0NvcHlLZXlMaXN0IiwgKFB5Q0Z1bmN0aW9uKUNGX0NGUHJlZmVyZW5jZXNDb3B5S2V5TGlzdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgYXBwbGljYXRpb25JRCwgQ0ZTdHJpbmdSZWYgdXNlck5hbWUsIENGU3RyaW5nUmVmIGhvc3ROYW1lKSAtPiAoQ0ZBcnJheVJlZiBfcnYpIil9LAorICAgIHsiQ0ZTdHJpbmdHZXRUeXBlSUQiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZTdHJpbmdHZXRUeXBlSUQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENGVHlwZUlEIF9ydikiKX0sCisgICAgeyJDRlN0cmluZ0NyZWF0ZVdpdGhQYXNjYWxTdHJpbmciLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZTdHJpbmdDcmVhdGVXaXRoUGFzY2FsU3RyaW5nLCAxLAorICAgICBQeURvY19TVFIoIihTdHIyNTUgcFN0ciwgQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZykgLT4gKENGU3RyaW5nUmVmIF9ydikiKX0sCisgICAgeyJDRlN0cmluZ0NyZWF0ZVdpdGhDU3RyaW5nIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGU3RyaW5nQ3JlYXRlV2l0aENTdHJpbmcsIDEsCisgICAgIFB5RG9jX1NUUigiKGNoYXIqIGNTdHIsIENGU3RyaW5nRW5jb2RpbmcgZW5jb2RpbmcpIC0+IChDRlN0cmluZ1JlZiBfcnYpIil9LAorICAgIHsiQ0ZTdHJpbmdDcmVhdGVXaXRoQ2hhcmFjdGVycyIsIChQeUNGdW5jdGlvbilDRl9DRlN0cmluZ0NyZWF0ZVdpdGhDaGFyYWN0ZXJzLCAxLAorICAgICBQeURvY19TVFIoIihCdWZmZXIgY2hhcnMpIC0+IChDRlN0cmluZ1JlZiBfcnYpIil9LAorICAgIHsiQ0ZTdHJpbmdDcmVhdGVXaXRoUGFzY2FsU3RyaW5nTm9Db3B5IiwgKFB5Q0Z1bmN0aW9uKUNGX0NGU3RyaW5nQ3JlYXRlV2l0aFBhc2NhbFN0cmluZ05vQ29weSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU3RyMjU1IHBTdHIsIENGU3RyaW5nRW5jb2RpbmcgZW5jb2RpbmcpIC0+IChDRlN0cmluZ1JlZiBfcnYpIil9LAorICAgIHsiQ0ZTdHJpbmdDcmVhdGVXaXRoQ1N0cmluZ05vQ29weSIsIChQeUNGdW5jdGlvbilDRl9DRlN0cmluZ0NyZWF0ZVdpdGhDU3RyaW5nTm9Db3B5LCAxLAorICAgICBQeURvY19TVFIoIihjaGFyKiBjU3RyLCBDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKKyAgICB7IkNGU3RyaW5nQ3JlYXRlV2l0aENoYXJhY3RlcnNOb0NvcHkiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZTdHJpbmdDcmVhdGVXaXRoQ2hhcmFjdGVyc05vQ29weSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQnVmZmVyIGNoYXJzKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKKyAgICB7IkNGU3RyaW5nQ3JlYXRlTXV0YWJsZSIsIChQeUNGdW5jdGlvbilDRl9DRlN0cmluZ0NyZWF0ZU11dGFibGUsIDEsCisgICAgIFB5RG9jX1NUUigiKENGSW5kZXggbWF4TGVuZ3RoKSAtPiAoQ0ZNdXRhYmxlU3RyaW5nUmVmIF9ydikiKX0sCisgICAgeyJDRlN0cmluZ0NyZWF0ZU11dGFibGVDb3B5IiwgKFB5Q0Z1bmN0aW9uKUNGX0NGU3RyaW5nQ3JlYXRlTXV0YWJsZUNvcHksIDEsCisgICAgIFB5RG9jX1NUUigiKENGSW5kZXggbWF4TGVuZ3RoLCBDRlN0cmluZ1JlZiB0aGVTdHJpbmcpIC0+IChDRk11dGFibGVTdHJpbmdSZWYgX3J2KSIpfSwKKyAgICB7IkNGU3RyaW5nQ3JlYXRlV2l0aEJ5dGVzIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGU3RyaW5nQ3JlYXRlV2l0aEJ5dGVzLCAxLAorICAgICBQeURvY19TVFIoIihCdWZmZXIgYnl0ZXMsIENGU3RyaW5nRW5jb2RpbmcgZW5jb2RpbmcsIEJvb2xlYW4gaXNFeHRlcm5hbFJlcHJlc2VudGF0aW9uKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKKyAgICB7IkNGU3RyaW5nR2V0U3lzdGVtRW5jb2RpbmciLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZTdHJpbmdHZXRTeXN0ZW1FbmNvZGluZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZTdHJpbmdFbmNvZGluZyBfcnYpIil9LAorICAgIHsiQ0ZTdHJpbmdHZXRNYXhpbXVtU2l6ZUZvckVuY29kaW5nIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGU3RyaW5nR2V0TWF4aW11bVNpemVGb3JFbmNvZGluZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZJbmRleCBsZW5ndGgsIENGU3RyaW5nRW5jb2RpbmcgZW5jb2RpbmcpIC0+IChDRkluZGV4IF9ydikiKX0sCisgICAgeyJDRlN0cmluZ0lzRW5jb2RpbmdBdmFpbGFibGUiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZTdHJpbmdJc0VuY29kaW5nQXZhaWxhYmxlLCAxLAorICAgICBQeURvY19TVFIoIihDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiQ0ZTdHJpbmdHZXROYW1lT2ZFbmNvZGluZyIsIChQeUNGdW5jdGlvbilDRl9DRlN0cmluZ0dldE5hbWVPZkVuY29kaW5nLCAxLAorICAgICBQeURvY19TVFIoIihDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKKyAgICB7IkNGU3RyaW5nQ29udmVydEVuY29kaW5nVG9OU1N0cmluZ0VuY29kaW5nIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGU3RyaW5nQ29udmVydEVuY29kaW5nVG9OU1N0cmluZ0VuY29kaW5nLCAxLAorICAgICBQeURvY19TVFIoIihDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nKSAtPiAoVUludDMyIF9ydikiKX0sCisgICAgeyJDRlN0cmluZ0NvbnZlcnROU1N0cmluZ0VuY29kaW5nVG9FbmNvZGluZyIsIChQeUNGdW5jdGlvbilDRl9DRlN0cmluZ0NvbnZlcnROU1N0cmluZ0VuY29kaW5nVG9FbmNvZGluZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoVUludDMyIGVuY29kaW5nKSAtPiAoQ0ZTdHJpbmdFbmNvZGluZyBfcnYpIil9LAorICAgIHsiQ0ZTdHJpbmdDb252ZXJ0RW5jb2RpbmdUb1dpbmRvd3NDb2RlcGFnZSIsIChQeUNGdW5jdGlvbilDRl9DRlN0cmluZ0NvbnZlcnRFbmNvZGluZ1RvV2luZG93c0NvZGVwYWdlLCAxLAorICAgICBQeURvY19TVFIoIihDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nKSAtPiAoVUludDMyIF9ydikiKX0sCisgICAgeyJDRlN0cmluZ0NvbnZlcnRXaW5kb3dzQ29kZXBhZ2VUb0VuY29kaW5nIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGU3RyaW5nQ29udmVydFdpbmRvd3NDb2RlcGFnZVRvRW5jb2RpbmcsIDEsCisgICAgIFB5RG9jX1NUUigiKFVJbnQzMiBjb2RlcGFnZSkgLT4gKENGU3RyaW5nRW5jb2RpbmcgX3J2KSIpfSwKKyAgICB7IkNGU3RyaW5nQ29udmVydEVuY29kaW5nVG9JQU5BQ2hhclNldE5hbWUiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZTdHJpbmdDb252ZXJ0RW5jb2RpbmdUb0lBTkFDaGFyU2V0TmFtZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZykgLT4gKENGU3RyaW5nUmVmIF9ydikiKX0sCisgICAgeyJDRlN0cmluZ0dldE1vc3RDb21wYXRpYmxlTWFjU3RyaW5nRW5jb2RpbmciLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZTdHJpbmdHZXRNb3N0Q29tcGF0aWJsZU1hY1N0cmluZ0VuY29kaW5nLCAxLAorICAgICBQeURvY19TVFIoIihDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nKSAtPiAoQ0ZTdHJpbmdFbmNvZGluZyBfcnYpIil9LAorICAgIHsiX19DRlN0cmluZ01ha2VDb25zdGFudFN0cmluZyIsIChQeUNGdW5jdGlvbilDRl9fX0NGU3RyaW5nTWFrZUNvbnN0YW50U3RyaW5nLCAxLAorICAgICBQeURvY19TVFIoIihjaGFyKiBjU3RyKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKKyAgICB7IkNGVVJMR2V0VHlwZUlEIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGVVJMR2V0VHlwZUlELCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDRlR5cGVJRCBfcnYpIil9LAorICAgIHsiQ0ZVUkxDcmVhdGVXaXRoQnl0ZXMiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZVUkxDcmVhdGVXaXRoQnl0ZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKEJ1ZmZlciBVUkxCeXRlcywgQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZywgQ0ZVUkxSZWYgYmFzZVVSTCkgLT4gKENGVVJMUmVmIF9ydikiKX0sCisgICAgeyJDRlVSTENyZWF0ZUZyb21GaWxlU3lzdGVtUmVwcmVzZW50YXRpb24iLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZVUkxDcmVhdGVGcm9tRmlsZVN5c3RlbVJlcHJlc2VudGF0aW9uLCAxLAorICAgICBQeURvY19TVFIoIihCdWZmZXIgYnVmZmVyLCBCb29sZWFuIGlzRGlyZWN0b3J5KSAtPiAoQ0ZVUkxSZWYgX3J2KSIpfSwKKyAgICB7IkNGVVJMQ3JlYXRlRnJvbUZpbGVTeXN0ZW1SZXByZXNlbnRhdGlvblJlbGF0aXZlVG9CYXNlIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGVVJMQ3JlYXRlRnJvbUZpbGVTeXN0ZW1SZXByZXNlbnRhdGlvblJlbGF0aXZlVG9CYXNlLCAxLAorICAgICBQeURvY19TVFIoIihCdWZmZXIgYnVmZmVyLCBCb29sZWFuIGlzRGlyZWN0b3J5LCBDRlVSTFJlZiBiYXNlVVJMKSAtPiAoQ0ZVUkxSZWYgX3J2KSIpfSwKKyAgICB7IkNGVVJMQ3JlYXRlRnJvbUZTUmVmIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGVVJMQ3JlYXRlRnJvbUZTUmVmLCAxLAorICAgICBQeURvY19TVFIoIihGU1JlZiBmc1JlZikgLT4gKENGVVJMUmVmIF9ydikiKX0sCisgICAgeyJ0b0NGIiwgKFB5Q0Z1bmN0aW9uKUNGX3RvQ0YsIDEsCisgICAgIFB5RG9jX1NUUigiKHB5dGhvbl9vYmplY3QpIC0+IChDRl9vYmplY3QpIil9LAorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogCkBAIC00ODI4LDE2NSArNDgyOCwxNjUgQEAKIC8qIFJvdXRpbmVzIHRvIGNvbnZlcnQgYW55IENGIHR5cGUgdG8vZnJvbSB0aGUgY29ycmVzcG9uZGluZyBDRnh4eE9iaiAqLwogUHlPYmplY3QgKkNGT2JqX05ldyhDRlR5cGVSZWYgaXRzZWxmKQogewotICAgICAgICBpZiAoaXRzZWxmID09IE5VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAiY2Fubm90IHdyYXAgTlVMTCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIGlmIChDRkdldFR5cGVJRChpdHNlbGYpID09IENGQXJyYXlHZXRUeXBlSUQoKSkgcmV0dXJuIENGQXJyYXlSZWZPYmpfTmV3KChDRkFycmF5UmVmKWl0c2VsZik7Ci0gICAgICAgIGlmIChDRkdldFR5cGVJRChpdHNlbGYpID09IENGRGljdGlvbmFyeUdldFR5cGVJRCgpKSByZXR1cm4gQ0ZEaWN0aW9uYXJ5UmVmT2JqX05ldygoQ0ZEaWN0aW9uYXJ5UmVmKWl0c2VsZik7Ci0gICAgICAgIGlmIChDRkdldFR5cGVJRChpdHNlbGYpID09IENGRGF0YUdldFR5cGVJRCgpKSByZXR1cm4gQ0ZEYXRhUmVmT2JqX05ldygoQ0ZEYXRhUmVmKWl0c2VsZik7Ci0gICAgICAgIGlmIChDRkdldFR5cGVJRChpdHNlbGYpID09IENGU3RyaW5nR2V0VHlwZUlEKCkpIHJldHVybiBDRlN0cmluZ1JlZk9ial9OZXcoKENGU3RyaW5nUmVmKWl0c2VsZik7Ci0gICAgICAgIGlmIChDRkdldFR5cGVJRChpdHNlbGYpID09IENGVVJMR2V0VHlwZUlEKCkpIHJldHVybiBDRlVSTFJlZk9ial9OZXcoKENGVVJMUmVmKWl0c2VsZik7Ci0gICAgICAgIC8qIFhYWFggT3Igc2hvdWxkIHdlIHVzZSBQeUNGX0NGMlB5dGhvbiBoZXJlPz8gKi8KLSAgICAgICAgcmV0dXJuIENGVHlwZVJlZk9ial9OZXcoaXRzZWxmKTsKKyAgICBpZiAoaXRzZWxmID09IE5VTEwpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAiY2Fubm90IHdyYXAgTlVMTCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKENGR2V0VHlwZUlEKGl0c2VsZikgPT0gQ0ZBcnJheUdldFR5cGVJRCgpKSByZXR1cm4gQ0ZBcnJheVJlZk9ial9OZXcoKENGQXJyYXlSZWYpaXRzZWxmKTsKKyAgICBpZiAoQ0ZHZXRUeXBlSUQoaXRzZWxmKSA9PSBDRkRpY3Rpb25hcnlHZXRUeXBlSUQoKSkgcmV0dXJuIENGRGljdGlvbmFyeVJlZk9ial9OZXcoKENGRGljdGlvbmFyeVJlZilpdHNlbGYpOworICAgIGlmIChDRkdldFR5cGVJRChpdHNlbGYpID09IENGRGF0YUdldFR5cGVJRCgpKSByZXR1cm4gQ0ZEYXRhUmVmT2JqX05ldygoQ0ZEYXRhUmVmKWl0c2VsZik7CisgICAgaWYgKENGR2V0VHlwZUlEKGl0c2VsZikgPT0gQ0ZTdHJpbmdHZXRUeXBlSUQoKSkgcmV0dXJuIENGU3RyaW5nUmVmT2JqX05ldygoQ0ZTdHJpbmdSZWYpaXRzZWxmKTsKKyAgICBpZiAoQ0ZHZXRUeXBlSUQoaXRzZWxmKSA9PSBDRlVSTEdldFR5cGVJRCgpKSByZXR1cm4gQ0ZVUkxSZWZPYmpfTmV3KChDRlVSTFJlZilpdHNlbGYpOworICAgIC8qIFhYWFggT3Igc2hvdWxkIHdlIHVzZSBQeUNGX0NGMlB5dGhvbiBoZXJlPz8gKi8KKyAgICByZXR1cm4gQ0ZUeXBlUmVmT2JqX05ldyhpdHNlbGYpOwogfQogaW50IENGT2JqX0NvbnZlcnQoUHlPYmplY3QgKnYsIENGVHlwZVJlZiAqcF9pdHNlbGYpCiB7CiAKLSAgICAgICAgaWYgKHYgPT0gUHlfTm9uZSkgeyAqcF9pdHNlbGYgPSBOVUxMOyByZXR1cm4gMTsgfQotICAgICAgICAvKiBDaGVjayBmb3Igb3RoZXIgQ0Ygb2JqZWN0cyBoZXJlICovCisgICAgaWYgKHYgPT0gUHlfTm9uZSkgeyAqcF9pdHNlbGYgPSBOVUxMOyByZXR1cm4gMTsgfQorICAgIC8qIENoZWNrIGZvciBvdGhlciBDRiBvYmplY3RzIGhlcmUgKi8KIAotICAgICAgICBpZiAoIUNGVHlwZVJlZk9ial9DaGVjayh2KSAmJgotICAgICAgICAgICAgICAgICFDRkFycmF5UmVmT2JqX0NoZWNrKHYpICYmCi0gICAgICAgICAgICAgICAgIUNGTXV0YWJsZUFycmF5UmVmT2JqX0NoZWNrKHYpICYmCi0gICAgICAgICAgICAgICAgIUNGRGljdGlvbmFyeVJlZk9ial9DaGVjayh2KSAmJgotICAgICAgICAgICAgICAgICFDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqX0NoZWNrKHYpICYmCi0gICAgICAgICAgICAgICAgIUNGRGF0YVJlZk9ial9DaGVjayh2KSAmJgotICAgICAgICAgICAgICAgICFDRk11dGFibGVEYXRhUmVmT2JqX0NoZWNrKHYpICYmCi0gICAgICAgICAgICAgICAgIUNGU3RyaW5nUmVmT2JqX0NoZWNrKHYpICYmCi0gICAgICAgICAgICAgICAgIUNGTXV0YWJsZVN0cmluZ1JlZk9ial9DaGVjayh2KSAmJgotICAgICAgICAgICAgICAgICFDRlVSTFJlZk9ial9DaGVjayh2KSApCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBYWFhYIE9yIHNob3VsZCB3ZSB1c2UgUHlDRl9QeXRob24yQ0YgaGVyZT8/ICovCi0gICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkNGIG9iamVjdCByZXF1aXJlZCIpOwotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgICpwX2l0c2VsZiA9ICgoQ0ZUeXBlUmVmT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKLSAgICAgICAgcmV0dXJuIDE7CisgICAgaWYgKCFDRlR5cGVSZWZPYmpfQ2hlY2sodikgJiYKKyAgICAgICAgIUNGQXJyYXlSZWZPYmpfQ2hlY2sodikgJiYKKyAgICAgICAgIUNGTXV0YWJsZUFycmF5UmVmT2JqX0NoZWNrKHYpICYmCisgICAgICAgICFDRkRpY3Rpb25hcnlSZWZPYmpfQ2hlY2sodikgJiYKKyAgICAgICAgIUNGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmpfQ2hlY2sodikgJiYKKyAgICAgICAgIUNGRGF0YVJlZk9ial9DaGVjayh2KSAmJgorICAgICAgICAhQ0ZNdXRhYmxlRGF0YVJlZk9ial9DaGVjayh2KSAmJgorICAgICAgICAhQ0ZTdHJpbmdSZWZPYmpfQ2hlY2sodikgJiYKKyAgICAgICAgIUNGTXV0YWJsZVN0cmluZ1JlZk9ial9DaGVjayh2KSAmJgorICAgICAgICAhQ0ZVUkxSZWZPYmpfQ2hlY2sodikgKQorICAgIHsKKyAgICAgICAgLyogWFhYWCBPciBzaG91bGQgd2UgdXNlIFB5Q0ZfUHl0aG9uMkNGIGhlcmU/PyAqLworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiQ0Ygb2JqZWN0IHJlcXVpcmVkIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAqcF9pdHNlbGYgPSAoKENGVHlwZVJlZk9iamVjdCAqKXYpLT5vYl9pdHNlbGY7CisgICAgcmV0dXJuIDE7CiB9CiAKIAogdm9pZCBpbml0X0NGKHZvaWQpCiB7Ci0JUHlPYmplY3QgKm07Ci0JUHlPYmplY3QgKmQ7CisgICAgUHlPYmplY3QgKm07CisgICAgUHlPYmplY3QgKmQ7CiAKIAogCi0JUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoQ0ZUeXBlUmVmLCBDRk9ial9OZXcpOwotCVB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChDRlR5cGVSZWYsIENGT2JqX0NvbnZlcnQpOwotCVB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKENGVHlwZVJlZiwgQ0ZUeXBlUmVmT2JqX05ldyk7Ci0JUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKENGVHlwZVJlZiwgQ0ZUeXBlUmVmT2JqX0NvbnZlcnQpOwotCVB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKENGU3RyaW5nUmVmLCBDRlN0cmluZ1JlZk9ial9OZXcpOwotCVB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChDRlN0cmluZ1JlZiwgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCk7Ci0JUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoQ0ZNdXRhYmxlU3RyaW5nUmVmLCBDRk11dGFibGVTdHJpbmdSZWZPYmpfTmV3KTsKLQlQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoQ0ZNdXRhYmxlU3RyaW5nUmVmLCBDRk11dGFibGVTdHJpbmdSZWZPYmpfQ29udmVydCk7Ci0JUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoQ0ZBcnJheVJlZiwgQ0ZBcnJheVJlZk9ial9OZXcpOwotCVB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChDRkFycmF5UmVmLCBDRkFycmF5UmVmT2JqX0NvbnZlcnQpOwotCVB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKENGTXV0YWJsZUFycmF5UmVmLCBDRk11dGFibGVBcnJheVJlZk9ial9OZXcpOwotCVB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChDRk11dGFibGVBcnJheVJlZiwgQ0ZNdXRhYmxlQXJyYXlSZWZPYmpfQ29udmVydCk7Ci0JUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoQ0ZEaWN0aW9uYXJ5UmVmLCBDRkRpY3Rpb25hcnlSZWZPYmpfTmV3KTsKLQlQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoQ0ZEaWN0aW9uYXJ5UmVmLCBDRkRpY3Rpb25hcnlSZWZPYmpfQ29udmVydCk7Ci0JUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZiwgQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9ial9OZXcpOwotCVB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChDRk11dGFibGVEaWN0aW9uYXJ5UmVmLCBDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqX0NvbnZlcnQpOwotCVB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKENGVVJMUmVmLCBDRlVSTFJlZk9ial9OZXcpOwotCVB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChDRlVSTFJlZiwgQ0ZVUkxSZWZPYmpfQ29udmVydCk7CisgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoQ0ZUeXBlUmVmLCBDRk9ial9OZXcpOworICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChDRlR5cGVSZWYsIENGT2JqX0NvbnZlcnQpOworICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKENGVHlwZVJlZiwgQ0ZUeXBlUmVmT2JqX05ldyk7CisgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKENGVHlwZVJlZiwgQ0ZUeXBlUmVmT2JqX0NvbnZlcnQpOworICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKENGU3RyaW5nUmVmLCBDRlN0cmluZ1JlZk9ial9OZXcpOworICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChDRlN0cmluZ1JlZiwgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCk7CisgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoQ0ZNdXRhYmxlU3RyaW5nUmVmLCBDRk11dGFibGVTdHJpbmdSZWZPYmpfTmV3KTsKKyAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoQ0ZNdXRhYmxlU3RyaW5nUmVmLCBDRk11dGFibGVTdHJpbmdSZWZPYmpfQ29udmVydCk7CisgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoQ0ZBcnJheVJlZiwgQ0ZBcnJheVJlZk9ial9OZXcpOworICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChDRkFycmF5UmVmLCBDRkFycmF5UmVmT2JqX0NvbnZlcnQpOworICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKENGTXV0YWJsZUFycmF5UmVmLCBDRk11dGFibGVBcnJheVJlZk9ial9OZXcpOworICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChDRk11dGFibGVBcnJheVJlZiwgQ0ZNdXRhYmxlQXJyYXlSZWZPYmpfQ29udmVydCk7CisgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoQ0ZEaWN0aW9uYXJ5UmVmLCBDRkRpY3Rpb25hcnlSZWZPYmpfTmV3KTsKKyAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoQ0ZEaWN0aW9uYXJ5UmVmLCBDRkRpY3Rpb25hcnlSZWZPYmpfQ29udmVydCk7CisgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZiwgQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9ial9OZXcpOworICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChDRk11dGFibGVEaWN0aW9uYXJ5UmVmLCBDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqX0NvbnZlcnQpOworICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKENGVVJMUmVmLCBDRlVSTFJlZk9ial9OZXcpOworICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChDRlVSTFJlZiwgQ0ZVUkxSZWZPYmpfQ29udmVydCk7CiAKIAotCW0gPSBQeV9Jbml0TW9kdWxlKCJfQ0YiLCBDRl9tZXRob2RzKTsKLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQlDRl9FcnJvciA9IFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCk7Ci0JaWYgKENGX0Vycm9yID09IE5VTEwgfHwKLQkgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVycm9yIiwgQ0ZfRXJyb3IpICE9IDApCi0JCXJldHVybjsKLQlDRlR5cGVSZWZfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCWlmIChQeVR5cGVfUmVhZHkoJkNGVHlwZVJlZl9UeXBlKSA8IDApIHJldHVybjsKLQlQeV9JTkNSRUYoJkNGVHlwZVJlZl9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkNGVHlwZVJlZiIsIChQeU9iamVjdCAqKSZDRlR5cGVSZWZfVHlwZSk7Ci0JLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCi0JUHlfSU5DUkVGKCZDRlR5cGVSZWZfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJDRlR5cGVSZWZUeXBlIiwgKFB5T2JqZWN0ICopJkNGVHlwZVJlZl9UeXBlKTsKLQlDRkFycmF5UmVmX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKLQlDRkFycmF5UmVmX1R5cGUudHBfYmFzZSA9ICZDRlR5cGVSZWZfVHlwZTsKLQlpZiAoUHlUeXBlX1JlYWR5KCZDRkFycmF5UmVmX1R5cGUpIDwgMCkgcmV0dXJuOwotCVB5X0lOQ1JFRigmQ0ZBcnJheVJlZl9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkNGQXJyYXlSZWYiLCAoUHlPYmplY3QgKikmQ0ZBcnJheVJlZl9UeXBlKTsKLQkvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KLQlQeV9JTkNSRUYoJkNGQXJyYXlSZWZfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJDRkFycmF5UmVmVHlwZSIsIChQeU9iamVjdCAqKSZDRkFycmF5UmVmX1R5cGUpOwotCUNGTXV0YWJsZUFycmF5UmVmX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKLQlDRk11dGFibGVBcnJheVJlZl9UeXBlLnRwX2Jhc2UgPSAmQ0ZBcnJheVJlZl9UeXBlOwotCWlmIChQeVR5cGVfUmVhZHkoJkNGTXV0YWJsZUFycmF5UmVmX1R5cGUpIDwgMCkgcmV0dXJuOwotCVB5X0lOQ1JFRigmQ0ZNdXRhYmxlQXJyYXlSZWZfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJDRk11dGFibGVBcnJheVJlZiIsIChQeU9iamVjdCAqKSZDRk11dGFibGVBcnJheVJlZl9UeXBlKTsKLQkvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KLQlQeV9JTkNSRUYoJkNGTXV0YWJsZUFycmF5UmVmX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ0ZNdXRhYmxlQXJyYXlSZWZUeXBlIiwgKFB5T2JqZWN0ICopJkNGTXV0YWJsZUFycmF5UmVmX1R5cGUpOwotCUNGRGljdGlvbmFyeVJlZl9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7Ci0JQ0ZEaWN0aW9uYXJ5UmVmX1R5cGUudHBfYmFzZSA9ICZDRlR5cGVSZWZfVHlwZTsKLQlpZiAoUHlUeXBlX1JlYWR5KCZDRkRpY3Rpb25hcnlSZWZfVHlwZSkgPCAwKSByZXR1cm47Ci0JUHlfSU5DUkVGKCZDRkRpY3Rpb25hcnlSZWZfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJDRkRpY3Rpb25hcnlSZWYiLCAoUHlPYmplY3QgKikmQ0ZEaWN0aW9uYXJ5UmVmX1R5cGUpOwotCS8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLwotCVB5X0lOQ1JFRigmQ0ZEaWN0aW9uYXJ5UmVmX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ0ZEaWN0aW9uYXJ5UmVmVHlwZSIsIChQeU9iamVjdCAqKSZDRkRpY3Rpb25hcnlSZWZfVHlwZSk7Ci0JQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZl9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7Ci0JQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZl9UeXBlLnRwX2Jhc2UgPSAmQ0ZEaWN0aW9uYXJ5UmVmX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZl9UeXBlKSA8IDApIHJldHVybjsKLQlQeV9JTkNSRUYoJkNGTXV0YWJsZURpY3Rpb25hcnlSZWZfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJDRk11dGFibGVEaWN0aW9uYXJ5UmVmIiwgKFB5T2JqZWN0ICopJkNGTXV0YWJsZURpY3Rpb25hcnlSZWZfVHlwZSk7Ci0JLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCi0JUHlfSU5DUkVGKCZDRk11dGFibGVEaWN0aW9uYXJ5UmVmX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZlR5cGUiLCAoUHlPYmplY3QgKikmQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZl9UeXBlKTsKLQlDRkRhdGFSZWZfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCUNGRGF0YVJlZl9UeXBlLnRwX2Jhc2UgPSAmQ0ZUeXBlUmVmX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmQ0ZEYXRhUmVmX1R5cGUpIDwgMCkgcmV0dXJuOwotCVB5X0lOQ1JFRigmQ0ZEYXRhUmVmX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ0ZEYXRhUmVmIiwgKFB5T2JqZWN0ICopJkNGRGF0YVJlZl9UeXBlKTsKLQkvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KLQlQeV9JTkNSRUYoJkNGRGF0YVJlZl9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkNGRGF0YVJlZlR5cGUiLCAoUHlPYmplY3QgKikmQ0ZEYXRhUmVmX1R5cGUpOwotCUNGTXV0YWJsZURhdGFSZWZfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCUNGTXV0YWJsZURhdGFSZWZfVHlwZS50cF9iYXNlID0gJkNGRGF0YVJlZl9UeXBlOwotCWlmIChQeVR5cGVfUmVhZHkoJkNGTXV0YWJsZURhdGFSZWZfVHlwZSkgPCAwKSByZXR1cm47Ci0JUHlfSU5DUkVGKCZDRk11dGFibGVEYXRhUmVmX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ0ZNdXRhYmxlRGF0YVJlZiIsIChQeU9iamVjdCAqKSZDRk11dGFibGVEYXRhUmVmX1R5cGUpOwotCS8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLwotCVB5X0lOQ1JFRigmQ0ZNdXRhYmxlRGF0YVJlZl9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkNGTXV0YWJsZURhdGFSZWZUeXBlIiwgKFB5T2JqZWN0ICopJkNGTXV0YWJsZURhdGFSZWZfVHlwZSk7Ci0JQ0ZTdHJpbmdSZWZfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCUNGU3RyaW5nUmVmX1R5cGUudHBfYmFzZSA9ICZDRlR5cGVSZWZfVHlwZTsKLQlpZiAoUHlUeXBlX1JlYWR5KCZDRlN0cmluZ1JlZl9UeXBlKSA8IDApIHJldHVybjsKLQlQeV9JTkNSRUYoJkNGU3RyaW5nUmVmX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ0ZTdHJpbmdSZWYiLCAoUHlPYmplY3QgKikmQ0ZTdHJpbmdSZWZfVHlwZSk7Ci0JLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCi0JUHlfSU5DUkVGKCZDRlN0cmluZ1JlZl9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkNGU3RyaW5nUmVmVHlwZSIsIChQeU9iamVjdCAqKSZDRlN0cmluZ1JlZl9UeXBlKTsKLQlDRk11dGFibGVTdHJpbmdSZWZfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCUNGTXV0YWJsZVN0cmluZ1JlZl9UeXBlLnRwX2Jhc2UgPSAmQ0ZTdHJpbmdSZWZfVHlwZTsKLQlpZiAoUHlUeXBlX1JlYWR5KCZDRk11dGFibGVTdHJpbmdSZWZfVHlwZSkgPCAwKSByZXR1cm47Ci0JUHlfSU5DUkVGKCZDRk11dGFibGVTdHJpbmdSZWZfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJDRk11dGFibGVTdHJpbmdSZWYiLCAoUHlPYmplY3QgKikmQ0ZNdXRhYmxlU3RyaW5nUmVmX1R5cGUpOwotCS8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLwotCVB5X0lOQ1JFRigmQ0ZNdXRhYmxlU3RyaW5nUmVmX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ0ZNdXRhYmxlU3RyaW5nUmVmVHlwZSIsIChQeU9iamVjdCAqKSZDRk11dGFibGVTdHJpbmdSZWZfVHlwZSk7Ci0JQ0ZVUkxSZWZfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCUNGVVJMUmVmX1R5cGUudHBfYmFzZSA9ICZDRlR5cGVSZWZfVHlwZTsKLQlpZiAoUHlUeXBlX1JlYWR5KCZDRlVSTFJlZl9UeXBlKSA8IDApIHJldHVybjsKLQlQeV9JTkNSRUYoJkNGVVJMUmVmX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ0ZVUkxSZWYiLCAoUHlPYmplY3QgKikmQ0ZVUkxSZWZfVHlwZSk7Ci0JLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCi0JUHlfSU5DUkVGKCZDRlVSTFJlZl9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkNGVVJMUmVmVHlwZSIsIChQeU9iamVjdCAqKSZDRlVSTFJlZl9UeXBlKTsKKyAgICBtID0gUHlfSW5pdE1vZHVsZSgiX0NGIiwgQ0ZfbWV0aG9kcyk7CisgICAgZCA9IFB5TW9kdWxlX0dldERpY3QobSk7CisgICAgQ0ZfRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOworICAgIGlmIChDRl9FcnJvciA9PSBOVUxMIHx8CisgICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFcnJvciIsIENGX0Vycm9yKSAhPSAwKQorICAgICAgICByZXR1cm47CisgICAgQ0ZUeXBlUmVmX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZDRlR5cGVSZWZfVHlwZSkgPCAwKSByZXR1cm47CisgICAgUHlfSU5DUkVGKCZDRlR5cGVSZWZfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJDRlR5cGVSZWYiLCAoUHlPYmplY3QgKikmQ0ZUeXBlUmVmX1R5cGUpOworICAgIC8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLworICAgIFB5X0lOQ1JFRigmQ0ZUeXBlUmVmX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ0ZUeXBlUmVmVHlwZSIsIChQeU9iamVjdCAqKSZDRlR5cGVSZWZfVHlwZSk7CisgICAgQ0ZBcnJheVJlZl9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7CisgICAgQ0ZBcnJheVJlZl9UeXBlLnRwX2Jhc2UgPSAmQ0ZUeXBlUmVmX1R5cGU7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmQ0ZBcnJheVJlZl9UeXBlKSA8IDApIHJldHVybjsKKyAgICBQeV9JTkNSRUYoJkNGQXJyYXlSZWZfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJDRkFycmF5UmVmIiwgKFB5T2JqZWN0ICopJkNGQXJyYXlSZWZfVHlwZSk7CisgICAgLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCisgICAgUHlfSU5DUkVGKCZDRkFycmF5UmVmX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ0ZBcnJheVJlZlR5cGUiLCAoUHlPYmplY3QgKikmQ0ZBcnJheVJlZl9UeXBlKTsKKyAgICBDRk11dGFibGVBcnJheVJlZl9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7CisgICAgQ0ZNdXRhYmxlQXJyYXlSZWZfVHlwZS50cF9iYXNlID0gJkNGQXJyYXlSZWZfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZDRk11dGFibGVBcnJheVJlZl9UeXBlKSA8IDApIHJldHVybjsKKyAgICBQeV9JTkNSRUYoJkNGTXV0YWJsZUFycmF5UmVmX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ0ZNdXRhYmxlQXJyYXlSZWYiLCAoUHlPYmplY3QgKikmQ0ZNdXRhYmxlQXJyYXlSZWZfVHlwZSk7CisgICAgLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCisgICAgUHlfSU5DUkVGKCZDRk11dGFibGVBcnJheVJlZl9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkNGTXV0YWJsZUFycmF5UmVmVHlwZSIsIChQeU9iamVjdCAqKSZDRk11dGFibGVBcnJheVJlZl9UeXBlKTsKKyAgICBDRkRpY3Rpb25hcnlSZWZfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOworICAgIENGRGljdGlvbmFyeVJlZl9UeXBlLnRwX2Jhc2UgPSAmQ0ZUeXBlUmVmX1R5cGU7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmQ0ZEaWN0aW9uYXJ5UmVmX1R5cGUpIDwgMCkgcmV0dXJuOworICAgIFB5X0lOQ1JFRigmQ0ZEaWN0aW9uYXJ5UmVmX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ0ZEaWN0aW9uYXJ5UmVmIiwgKFB5T2JqZWN0ICopJkNGRGljdGlvbmFyeVJlZl9UeXBlKTsKKyAgICAvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KKyAgICBQeV9JTkNSRUYoJkNGRGljdGlvbmFyeVJlZl9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkNGRGljdGlvbmFyeVJlZlR5cGUiLCAoUHlPYmplY3QgKikmQ0ZEaWN0aW9uYXJ5UmVmX1R5cGUpOworICAgIENGTXV0YWJsZURpY3Rpb25hcnlSZWZfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOworICAgIENGTXV0YWJsZURpY3Rpb25hcnlSZWZfVHlwZS50cF9iYXNlID0gJkNGRGljdGlvbmFyeVJlZl9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJkNGTXV0YWJsZURpY3Rpb25hcnlSZWZfVHlwZSkgPCAwKSByZXR1cm47CisgICAgUHlfSU5DUkVGKCZDRk11dGFibGVEaWN0aW9uYXJ5UmVmX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZiIsIChQeU9iamVjdCAqKSZDRk11dGFibGVEaWN0aW9uYXJ5UmVmX1R5cGUpOworICAgIC8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLworICAgIFB5X0lOQ1JFRigmQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZl9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkNGTXV0YWJsZURpY3Rpb25hcnlSZWZUeXBlIiwgKFB5T2JqZWN0ICopJkNGTXV0YWJsZURpY3Rpb25hcnlSZWZfVHlwZSk7CisgICAgQ0ZEYXRhUmVmX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBDRkRhdGFSZWZfVHlwZS50cF9iYXNlID0gJkNGVHlwZVJlZl9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJkNGRGF0YVJlZl9UeXBlKSA8IDApIHJldHVybjsKKyAgICBQeV9JTkNSRUYoJkNGRGF0YVJlZl9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkNGRGF0YVJlZiIsIChQeU9iamVjdCAqKSZDRkRhdGFSZWZfVHlwZSk7CisgICAgLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCisgICAgUHlfSU5DUkVGKCZDRkRhdGFSZWZfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJDRkRhdGFSZWZUeXBlIiwgKFB5T2JqZWN0ICopJkNGRGF0YVJlZl9UeXBlKTsKKyAgICBDRk11dGFibGVEYXRhUmVmX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBDRk11dGFibGVEYXRhUmVmX1R5cGUudHBfYmFzZSA9ICZDRkRhdGFSZWZfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZDRk11dGFibGVEYXRhUmVmX1R5cGUpIDwgMCkgcmV0dXJuOworICAgIFB5X0lOQ1JFRigmQ0ZNdXRhYmxlRGF0YVJlZl9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkNGTXV0YWJsZURhdGFSZWYiLCAoUHlPYmplY3QgKikmQ0ZNdXRhYmxlRGF0YVJlZl9UeXBlKTsKKyAgICAvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KKyAgICBQeV9JTkNSRUYoJkNGTXV0YWJsZURhdGFSZWZfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJDRk11dGFibGVEYXRhUmVmVHlwZSIsIChQeU9iamVjdCAqKSZDRk11dGFibGVEYXRhUmVmX1R5cGUpOworICAgIENGU3RyaW5nUmVmX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBDRlN0cmluZ1JlZl9UeXBlLnRwX2Jhc2UgPSAmQ0ZUeXBlUmVmX1R5cGU7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmQ0ZTdHJpbmdSZWZfVHlwZSkgPCAwKSByZXR1cm47CisgICAgUHlfSU5DUkVGKCZDRlN0cmluZ1JlZl9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkNGU3RyaW5nUmVmIiwgKFB5T2JqZWN0ICopJkNGU3RyaW5nUmVmX1R5cGUpOworICAgIC8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLworICAgIFB5X0lOQ1JFRigmQ0ZTdHJpbmdSZWZfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJDRlN0cmluZ1JlZlR5cGUiLCAoUHlPYmplY3QgKikmQ0ZTdHJpbmdSZWZfVHlwZSk7CisgICAgQ0ZNdXRhYmxlU3RyaW5nUmVmX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBDRk11dGFibGVTdHJpbmdSZWZfVHlwZS50cF9iYXNlID0gJkNGU3RyaW5nUmVmX1R5cGU7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmQ0ZNdXRhYmxlU3RyaW5nUmVmX1R5cGUpIDwgMCkgcmV0dXJuOworICAgIFB5X0lOQ1JFRigmQ0ZNdXRhYmxlU3RyaW5nUmVmX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ0ZNdXRhYmxlU3RyaW5nUmVmIiwgKFB5T2JqZWN0ICopJkNGTXV0YWJsZVN0cmluZ1JlZl9UeXBlKTsKKyAgICAvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KKyAgICBQeV9JTkNSRUYoJkNGTXV0YWJsZVN0cmluZ1JlZl9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkNGTXV0YWJsZVN0cmluZ1JlZlR5cGUiLCAoUHlPYmplY3QgKikmQ0ZNdXRhYmxlU3RyaW5nUmVmX1R5cGUpOworICAgIENGVVJMUmVmX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBDRlVSTFJlZl9UeXBlLnRwX2Jhc2UgPSAmQ0ZUeXBlUmVmX1R5cGU7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmQ0ZVUkxSZWZfVHlwZSkgPCAwKSByZXR1cm47CisgICAgUHlfSU5DUkVGKCZDRlVSTFJlZl9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkNGVVJMUmVmIiwgKFB5T2JqZWN0ICopJkNGVVJMUmVmX1R5cGUpOworICAgIC8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLworICAgIFB5X0lOQ1JFRigmQ0ZVUkxSZWZfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJDRlVSTFJlZlR5cGUiLCAoUHlPYmplY3QgKikmQ0ZVUkxSZWZfVHlwZSk7CiAKICNkZWZpbmUgX1NUUklOR0NPTlNUKG5hbWUpIFB5TW9kdWxlX0FkZE9iamVjdChtLCAjbmFtZSwgQ0ZTdHJpbmdSZWZPYmpfTmV3KG5hbWUpKQotCV9TVFJJTkdDT05TVChrQ0ZQcmVmZXJlbmNlc0FueUFwcGxpY2F0aW9uKTsKLQlfU1RSSU5HQ09OU1Qoa0NGUHJlZmVyZW5jZXNDdXJyZW50QXBwbGljYXRpb24pOwotCV9TVFJJTkdDT05TVChrQ0ZQcmVmZXJlbmNlc0FueUhvc3QpOwotCV9TVFJJTkdDT05TVChrQ0ZQcmVmZXJlbmNlc0N1cnJlbnRIb3N0KTsKLQlfU1RSSU5HQ09OU1Qoa0NGUHJlZmVyZW5jZXNBbnlVc2VyKTsKLQlfU1RSSU5HQ09OU1Qoa0NGUHJlZmVyZW5jZXNDdXJyZW50VXNlcik7CisgICAgX1NUUklOR0NPTlNUKGtDRlByZWZlcmVuY2VzQW55QXBwbGljYXRpb24pOworICAgIF9TVFJJTkdDT05TVChrQ0ZQcmVmZXJlbmNlc0N1cnJlbnRBcHBsaWNhdGlvbik7CisgICAgX1NUUklOR0NPTlNUKGtDRlByZWZlcmVuY2VzQW55SG9zdCk7CisgICAgX1NUUklOR0NPTlNUKGtDRlByZWZlcmVuY2VzQ3VycmVudEhvc3QpOworICAgIF9TVFJJTkdDT05TVChrQ0ZQcmVmZXJlbmNlc0FueVVzZXIpOworICAgIF9TVFJJTkdDT05TVChrQ0ZQcmVmZXJlbmNlc0N1cnJlbnRVc2VyKTsKIAogCiAKZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL2NmL3B5Y2ZicmlkZ2UuYyBiL01hYy9Nb2R1bGVzL2NmL3B5Y2ZicmlkZ2UuYwppbmRleCAwNjcwMGIzLi43MDhjMWU2IDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9jZi9weWNmYnJpZGdlLmMKKysrIGIvTWFjL01vZHVsZXMvY2YvcHljZmJyaWRnZS5jCkBAIC0xNSwxMjggKzE1LDEyOCBAQAogCiBQeU9iamVjdCAqCiBQeUNGX0NGMlB5dGhvbihDRlR5cGVSZWYgc3JjKSB7Ci0JQ0ZUeXBlSUQgdHlwZWlkOwotCQotCWlmKCBzcmMgPT0gTlVMTCApIHsKLQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQlyZXR1cm4gUHlfTm9uZTsKLQl9Ci0JdHlwZWlkID0gQ0ZHZXRUeXBlSUQoc3JjKTsKLQlpZiAodHlwZWlkID09IENGQXJyYXlHZXRUeXBlSUQoKSkKLQkJcmV0dXJuIFB5Q0ZfQ0YyUHl0aG9uX3NlcXVlbmNlKChDRkFycmF5UmVmKXNyYyk7Ci0JaWYgKHR5cGVpZCA9PSBDRkRpY3Rpb25hcnlHZXRUeXBlSUQoKSkKLQkJcmV0dXJuIFB5Q0ZfQ0YyUHl0aG9uX21hcHBpbmcoKENGRGljdGlvbmFyeVJlZilzcmMpOwotCXJldHVybiBQeUNGX0NGMlB5dGhvbl9zaW1wbGUoc3JjKTsKKyAgICBDRlR5cGVJRCB0eXBlaWQ7CisKKyAgICBpZiggc3JjID09IE5VTEwgKSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgfQorICAgIHR5cGVpZCA9IENGR2V0VHlwZUlEKHNyYyk7CisgICAgaWYgKHR5cGVpZCA9PSBDRkFycmF5R2V0VHlwZUlEKCkpCisgICAgICAgIHJldHVybiBQeUNGX0NGMlB5dGhvbl9zZXF1ZW5jZSgoQ0ZBcnJheVJlZilzcmMpOworICAgIGlmICh0eXBlaWQgPT0gQ0ZEaWN0aW9uYXJ5R2V0VHlwZUlEKCkpCisgICAgICAgIHJldHVybiBQeUNGX0NGMlB5dGhvbl9tYXBwaW5nKChDRkRpY3Rpb25hcnlSZWYpc3JjKTsKKyAgICByZXR1cm4gUHlDRl9DRjJQeXRob25fc2ltcGxlKHNyYyk7CiB9CiAKIFB5T2JqZWN0ICoKIFB5Q0ZfQ0YyUHl0aG9uX3NlcXVlbmNlKENGQXJyYXlSZWYgc3JjKSB7Ci0JaW50IHNpemUgPSBDRkFycmF5R2V0Q291bnQoc3JjKTsKLQlQeU9iamVjdCAqcnY7Ci0JQ0ZUeXBlUmVmIGl0ZW1fY2Y7Ci0JUHlPYmplY3QgKml0ZW1fcHkgPSBOVUxMOwotCWludCBpOwotCQotCWlmICggKHJ2PVB5TGlzdF9OZXcoc2l6ZSkpID09IE5VTEwgKQotCQlyZXR1cm4gTlVMTDsKLQlmb3IoaT0wOyBpPHNpemU7IGkrKykgewotCQlpdGVtX2NmID0gQ0ZBcnJheUdldFZhbHVlQXRJbmRleChzcmMsIGkpOwotCQlpZiAoaXRlbV9jZiA9PSBOVUxMICkgZ290byBlcnI7Ci0JCWl0ZW1fcHkgPSBQeUNGX0NGMlB5dGhvbihpdGVtX2NmKTsKLQkJaWYgKGl0ZW1fcHkgPT0gTlVMTCApIGdvdG8gZXJyOwotCQlpZiAoUHlMaXN0X1NldEl0ZW0ocnYsIGksIGl0ZW1fcHkpIDwgMCkgZ290byBlcnI7Ci0JCWl0ZW1fcHkgPSBOVUxMOwotCX0KLQlyZXR1cm4gcnY7CisgICAgaW50IHNpemUgPSBDRkFycmF5R2V0Q291bnQoc3JjKTsKKyAgICBQeU9iamVjdCAqcnY7CisgICAgQ0ZUeXBlUmVmIGl0ZW1fY2Y7CisgICAgUHlPYmplY3QgKml0ZW1fcHkgPSBOVUxMOworICAgIGludCBpOworCisgICAgaWYgKCAocnY9UHlMaXN0X05ldyhzaXplKSkgPT0gTlVMTCApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGZvcihpPTA7IGk8c2l6ZTsgaSsrKSB7CisgICAgICAgIGl0ZW1fY2YgPSBDRkFycmF5R2V0VmFsdWVBdEluZGV4KHNyYywgaSk7CisgICAgICAgIGlmIChpdGVtX2NmID09IE5VTEwgKSBnb3RvIGVycjsKKyAgICAgICAgaXRlbV9weSA9IFB5Q0ZfQ0YyUHl0aG9uKGl0ZW1fY2YpOworICAgICAgICBpZiAoaXRlbV9weSA9PSBOVUxMICkgZ290byBlcnI7CisgICAgICAgIGlmIChQeUxpc3RfU2V0SXRlbShydiwgaSwgaXRlbV9weSkgPCAwKSBnb3RvIGVycjsKKyAgICAgICAgaXRlbV9weSA9IE5VTEw7CisgICAgfQorICAgIHJldHVybiBydjsKIGVycjoKLQlQeV9YREVDUkVGKGl0ZW1fcHkpOwotCVB5X0RFQ1JFRihydik7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlfWERFQ1JFRihpdGVtX3B5KTsKKyAgICBQeV9ERUNSRUYocnYpOworICAgIHJldHVybiBOVUxMOwogfQogCiBQeU9iamVjdCAqCiBQeUNGX0NGMlB5dGhvbl9tYXBwaW5nKENGVHlwZVJlZiBzcmMpIHsKLQlpbnQgc2l6ZSA9IENGRGljdGlvbmFyeUdldENvdW50KHNyYyk7Ci0JUHlPYmplY3QgKnJ2ID0gTlVMTDsKLQlDRlR5cGVSZWYgKmFsbGtleXMgPSBOVUxMLCAqYWxsdmFsdWVzID0gTlVMTDsKLQlDRlR5cGVSZWYga2V5X2NmLCB2YWx1ZV9jZjsKLQlQeU9iamVjdCAqa2V5X3B5ID0gTlVMTCwgKnZhbHVlX3B5ID0gTlVMTDsKLQlpbnQgaTsKLQkKLQlhbGxrZXlzID0gbWFsbG9jKHNpemUqc2l6ZW9mKENGVHlwZVJlZiAqKSk7Ci0JaWYgKGFsbGtleXMgPT0gTlVMTCkgewotCQlQeUVycl9Ob01lbW9yeSgpOwotCQlnb3RvIGVycjsKLQl9Ci0JYWxsdmFsdWVzID0gbWFsbG9jKHNpemUqc2l6ZW9mKENGVHlwZVJlZiAqKSk7Ci0JaWYgKGFsbHZhbHVlcyA9PSBOVUxMKSB7Ci0JCVB5RXJyX05vTWVtb3J5KCk7Ci0JCWdvdG8gZXJyOwotCX0KLQlpZiAoIChydj1QeURpY3RfTmV3KCkpID09IE5VTEwgKSBnb3RvIGVycjsKLQlDRkRpY3Rpb25hcnlHZXRLZXlzQW5kVmFsdWVzKHNyYywgYWxsa2V5cywgYWxsdmFsdWVzKTsKLQlmb3IoaT0wOyBpPHNpemU7IGkrKykgewotCQlrZXlfY2YgPSBhbGxrZXlzW2ldOwotCQl2YWx1ZV9jZiA9IGFsbHZhbHVlc1tpXTsKLQkJa2V5X3B5ID0gUHlDRl9DRjJQeXRob24oa2V5X2NmKTsKLQkJaWYgKGtleV9weSA9PSBOVUxMICkgZ290byBlcnI7Ci0JCXZhbHVlX3B5ID0gUHlDRl9DRjJQeXRob24odmFsdWVfY2YpOwotCQlpZiAodmFsdWVfcHkgPT0gTlVMTCApIGdvdG8gZXJyOwotCQlpZiAoUHlEaWN0X1NldEl0ZW0ocnYsIGtleV9weSwgdmFsdWVfcHkpIDwgMCkgZ290byBlcnI7Ci0JCWtleV9weSA9IE5VTEw7Ci0JCXZhbHVlX3B5ID0gTlVMTDsKLQl9Ci0JcmV0dXJuIHJ2OworICAgIGludCBzaXplID0gQ0ZEaWN0aW9uYXJ5R2V0Q291bnQoc3JjKTsKKyAgICBQeU9iamVjdCAqcnYgPSBOVUxMOworICAgIENGVHlwZVJlZiAqYWxsa2V5cyA9IE5VTEwsICphbGx2YWx1ZXMgPSBOVUxMOworICAgIENGVHlwZVJlZiBrZXlfY2YsIHZhbHVlX2NmOworICAgIFB5T2JqZWN0ICprZXlfcHkgPSBOVUxMLCAqdmFsdWVfcHkgPSBOVUxMOworICAgIGludCBpOworCisgICAgYWxsa2V5cyA9IG1hbGxvYyhzaXplKnNpemVvZihDRlR5cGVSZWYgKikpOworICAgIGlmIChhbGxrZXlzID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgZ290byBlcnI7CisgICAgfQorICAgIGFsbHZhbHVlcyA9IG1hbGxvYyhzaXplKnNpemVvZihDRlR5cGVSZWYgKikpOworICAgIGlmIChhbGx2YWx1ZXMgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICBnb3RvIGVycjsKKyAgICB9CisgICAgaWYgKCAocnY9UHlEaWN0X05ldygpKSA9PSBOVUxMICkgZ290byBlcnI7CisgICAgQ0ZEaWN0aW9uYXJ5R2V0S2V5c0FuZFZhbHVlcyhzcmMsIGFsbGtleXMsIGFsbHZhbHVlcyk7CisgICAgZm9yKGk9MDsgaTxzaXplOyBpKyspIHsKKyAgICAgICAga2V5X2NmID0gYWxsa2V5c1tpXTsKKyAgICAgICAgdmFsdWVfY2YgPSBhbGx2YWx1ZXNbaV07CisgICAgICAgIGtleV9weSA9IFB5Q0ZfQ0YyUHl0aG9uKGtleV9jZik7CisgICAgICAgIGlmIChrZXlfcHkgPT0gTlVMTCApIGdvdG8gZXJyOworICAgICAgICB2YWx1ZV9weSA9IFB5Q0ZfQ0YyUHl0aG9uKHZhbHVlX2NmKTsKKyAgICAgICAgaWYgKHZhbHVlX3B5ID09IE5VTEwgKSBnb3RvIGVycjsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtKHJ2LCBrZXlfcHksIHZhbHVlX3B5KSA8IDApIGdvdG8gZXJyOworICAgICAgICBrZXlfcHkgPSBOVUxMOworICAgICAgICB2YWx1ZV9weSA9IE5VTEw7CisgICAgfQorICAgIHJldHVybiBydjsKIGVycjoKLQlQeV9YREVDUkVGKGtleV9weSk7Ci0JUHlfWERFQ1JFRih2YWx1ZV9weSk7Ci0JUHlfWERFQ1JFRihydik7Ci0JZnJlZShhbGxrZXlzKTsKLQlmcmVlKGFsbHZhbHVlcyk7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlfWERFQ1JFRihrZXlfcHkpOworICAgIFB5X1hERUNSRUYodmFsdWVfcHkpOworICAgIFB5X1hERUNSRUYocnYpOworICAgIGZyZWUoYWxsa2V5cyk7CisgICAgZnJlZShhbGx2YWx1ZXMpOworICAgIHJldHVybiBOVUxMOwogfQogCiBQeU9iamVjdCAqCiBQeUNGX0NGMlB5dGhvbl9zaW1wbGUoQ0ZUeXBlUmVmIHNyYykgewotCUNGVHlwZUlEIHR5cGVpZDsKLQkKLQl0eXBlaWQgPSBDRkdldFR5cGVJRChzcmMpOwotCWlmICh0eXBlaWQgPT0gQ0ZTdHJpbmdHZXRUeXBlSUQoKSkKLQkJcmV0dXJuIFB5Q0ZfQ0YyUHl0aG9uX3N0cmluZygoQ0ZTdHJpbmdSZWYpc3JjKTsKLQlpZiAodHlwZWlkID09IENGQm9vbGVhbkdldFR5cGVJRCgpKQotCQlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKChsb25nKUNGQm9vbGVhbkdldFZhbHVlKHNyYykpOwotCWlmICh0eXBlaWQgPT0gQ0ZOdW1iZXJHZXRUeXBlSUQoKSkgewotCQlpZiAoQ0ZOdW1iZXJJc0Zsb2F0VHlwZShzcmMpKSB7Ci0JCQlkb3VibGUgZDsKLQkJCUNGTnVtYmVyR2V0VmFsdWUoc3JjLCBrQ0ZOdW1iZXJEb3VibGVUeXBlLCAmZCk7Ci0JCQlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKGQpOwotCQl9IGVsc2UgewotCQkJbG9uZyBsOwotCQkJaWYgKCFDRk51bWJlckdldFZhbHVlKHNyYywga0NGTnVtYmVyTG9uZ1R5cGUsICZsKSkKLQkJCQkvKiBYWFhYIE91dCBvZiByYW5nZSEgKi87Ci0JCQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcobCk7Ci0JCX0KLQl9Ci0JLyogWFhYWCBTaG91bGQgcmV0dXJuIGFzIENGVHlwZVJlZiwgcmVhbGx5Li4uICovCi0JUHlNYWNfRXJyb3IocmVzTm90Rm91bmQpOwotCXJldHVybiBOVUxMOworICAgIENGVHlwZUlEIHR5cGVpZDsKKworICAgIHR5cGVpZCA9IENGR2V0VHlwZUlEKHNyYyk7CisgICAgaWYgKHR5cGVpZCA9PSBDRlN0cmluZ0dldFR5cGVJRCgpKQorICAgICAgICByZXR1cm4gUHlDRl9DRjJQeXRob25fc3RyaW5nKChDRlN0cmluZ1JlZilzcmMpOworICAgIGlmICh0eXBlaWQgPT0gQ0ZCb29sZWFuR2V0VHlwZUlEKCkpCisgICAgICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoKGxvbmcpQ0ZCb29sZWFuR2V0VmFsdWUoc3JjKSk7CisgICAgaWYgKHR5cGVpZCA9PSBDRk51bWJlckdldFR5cGVJRCgpKSB7CisgICAgICAgIGlmIChDRk51bWJlcklzRmxvYXRUeXBlKHNyYykpIHsKKyAgICAgICAgICAgIGRvdWJsZSBkOworICAgICAgICAgICAgQ0ZOdW1iZXJHZXRWYWx1ZShzcmMsIGtDRk51bWJlckRvdWJsZVR5cGUsICZkKTsKKyAgICAgICAgICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsb25nIGw7CisgICAgICAgICAgICBpZiAoIUNGTnVtYmVyR2V0VmFsdWUoc3JjLCBrQ0ZOdW1iZXJMb25nVHlwZSwgJmwpKQorICAgICAgICAgICAgICAgIC8qIFhYWFggT3V0IG9mIHJhbmdlISAqLzsKKyAgICAgICAgICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhsKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBYWFhYIFNob3VsZCByZXR1cm4gYXMgQ0ZUeXBlUmVmLCByZWFsbHkuLi4gKi8KKyAgICBQeU1hY19FcnJvcihyZXNOb3RGb3VuZCk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIC8qIFVuc3VyZSAtIFJldHVybiB1bmljb2RlIG9yIDggYml0IHN0cmluZ3M/ICovCiBQeU9iamVjdCAqCiBQeUNGX0NGMlB5dGhvbl9zdHJpbmcoQ0ZTdHJpbmdSZWYgc3JjKSB7Ci0JaW50IHNpemUgPSBDRlN0cmluZ0dldExlbmd0aChzcmMpKzE7Ci0JUHlfVU5JQ09ERSAqZGF0YSA9IG1hbGxvYyhzaXplKnNpemVvZihQeV9VTklDT0RFKSk7Ci0JQ0ZSYW5nZSByYW5nZTsKLQlQeU9iamVjdCAqcnY7CisgICAgaW50IHNpemUgPSBDRlN0cmluZ0dldExlbmd0aChzcmMpKzE7CisgICAgUHlfVU5JQ09ERSAqZGF0YSA9IG1hbGxvYyhzaXplKnNpemVvZihQeV9VTklDT0RFKSk7CisgICAgQ0ZSYW5nZSByYW5nZTsKKyAgICBQeU9iamVjdCAqcnY7CiAKLQlyYW5nZS5sb2NhdGlvbiA9IDA7Ci0JcmFuZ2UubGVuZ3RoID0gc2l6ZTsKLQlpZiggZGF0YSA9PSBOVUxMICkgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JQ0ZTdHJpbmdHZXRDaGFyYWN0ZXJzKHNyYywgcmFuZ2UsIGRhdGEpOwotCXJ2ID0gKFB5T2JqZWN0ICopUHlVbmljb2RlX0Zyb21Vbmljb2RlKGRhdGEsIHNpemUtMSk7Ci0JZnJlZShkYXRhKTsKLQlyZXR1cm4gcnY7CisgICAgcmFuZ2UubG9jYXRpb24gPSAwOworICAgIHJhbmdlLmxlbmd0aCA9IHNpemU7CisgICAgaWYoIGRhdGEgPT0gTlVMTCApIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIENGU3RyaW5nR2V0Q2hhcmFjdGVycyhzcmMsIHJhbmdlLCBkYXRhKTsKKyAgICBydiA9IChQeU9iamVjdCAqKVB5VW5pY29kZV9Gcm9tVW5pY29kZShkYXRhLCBzaXplLTEpOworICAgIGZyZWUoZGF0YSk7CisgICAgcmV0dXJuIHJ2OwogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0xNDYsMTU4ICsxNDYsMTU4IEBACiBpbnQKIFB5Q0ZfUHl0aG9uMkNGKFB5T2JqZWN0ICpzcmMsIENGVHlwZVJlZiAqZHN0KSB7CiAKLQlpZiAoUHlTdHJpbmdfQ2hlY2soc3JjKSB8fCBQeVVuaWNvZGVfQ2hlY2soc3JjKSkKLQkJcmV0dXJuIFB5Q0ZfUHl0aG9uMkNGX3NpbXBsZShzcmMsIGRzdCk7Ci0JaWYgKFB5U2VxdWVuY2VfQ2hlY2soc3JjKSkKLQkJcmV0dXJuIFB5Q0ZfUHl0aG9uMkNGX3NlcXVlbmNlKHNyYywgKENGQXJyYXlSZWYgKilkc3QpOwotCWlmIChQeU1hcHBpbmdfQ2hlY2soc3JjKSkKLQkJcmV0dXJuIFB5Q0ZfUHl0aG9uMkNGX21hcHBpbmcoc3JjLCAoQ0ZEaWN0aW9uYXJ5UmVmICopZHN0KTsKLQlyZXR1cm4gUHlDRl9QeXRob24yQ0Zfc2ltcGxlKHNyYywgZHN0KTsKKyAgICBpZiAoUHlTdHJpbmdfQ2hlY2soc3JjKSB8fCBQeVVuaWNvZGVfQ2hlY2soc3JjKSkKKyAgICAgICAgcmV0dXJuIFB5Q0ZfUHl0aG9uMkNGX3NpbXBsZShzcmMsIGRzdCk7CisgICAgaWYgKFB5U2VxdWVuY2VfQ2hlY2soc3JjKSkKKyAgICAgICAgcmV0dXJuIFB5Q0ZfUHl0aG9uMkNGX3NlcXVlbmNlKHNyYywgKENGQXJyYXlSZWYgKilkc3QpOworICAgIGlmIChQeU1hcHBpbmdfQ2hlY2soc3JjKSkKKyAgICAgICAgcmV0dXJuIFB5Q0ZfUHl0aG9uMkNGX21hcHBpbmcoc3JjLCAoQ0ZEaWN0aW9uYXJ5UmVmICopZHN0KTsKKyAgICByZXR1cm4gUHlDRl9QeXRob24yQ0Zfc2ltcGxlKHNyYywgZHN0KTsKIH0KIAogaW50CiBQeUNGX1B5dGhvbjJDRl9zZXF1ZW5jZShQeU9iamVjdCAqc3JjLCBDRkFycmF5UmVmICpkc3QpIHsKLQlDRk11dGFibGVBcnJheVJlZiBydiA9IE5VTEw7Ci0JQ0ZUeXBlUmVmIGl0ZW1fY2YgPSBOVUxMOwotCVB5T2JqZWN0ICppdGVtX3B5ID0gTlVMTDsKLQlpbnQgc2l6ZSwgaTsKLQkKLQlpZiggIVB5U2VxdWVuY2VfQ2hlY2soc3JjKSApIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSJDYW5ub3QgY29udmVydCAlLjUwMHMgb2JqZWN0cyB0byBDRkFycmF5IiwKLQkJCXNyYy0+b2JfdHlwZS0+dHBfbmFtZSk7Ci0JCXJldHVybiAwOwotCX0KLQlzaXplID0gUHlTZXF1ZW5jZV9TaXplKHNyYyk7Ci0JcnYgPSBDRkFycmF5Q3JlYXRlTXV0YWJsZSgoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwgc2l6ZSwgJmtDRlR5cGVBcnJheUNhbGxCYWNrcyk7Ci0JaWYgKHJ2ID09IE5VTEwpIHsKLQkJUHlNYWNfRXJyb3IocmVzTm90Rm91bmQpOyAKLQkJZ290byBlcnI7Ci0JfQorICAgIENGTXV0YWJsZUFycmF5UmVmIHJ2ID0gTlVMTDsKKyAgICBDRlR5cGVSZWYgaXRlbV9jZiA9IE5VTEw7CisgICAgUHlPYmplY3QgKml0ZW1fcHkgPSBOVUxMOworICAgIGludCBzaXplLCBpOwogCi0JZm9yKCBpPTA7IGk8c2l6ZTsgaSsrKSB7Ci0JCWl0ZW1fcHkgPSBQeVNlcXVlbmNlX0dldEl0ZW0oc3JjLCBpKTsKLQkJaWYgKGl0ZW1fcHkgPT0gTlVMTCkgZ290byBlcnI7Ci0JCWlmICggIVB5Q0ZfUHl0aG9uMkNGKGl0ZW1fcHksICZpdGVtX2NmKSkgZ290byBlcnI7Ci0JCVB5X0RFQ1JFRihpdGVtX3B5KTsKLQkJQ0ZBcnJheVNldFZhbHVlQXRJbmRleChydiwgaSwgaXRlbV9jZik7Ci0JCUNGUmVsZWFzZShpdGVtX2NmKTsKLQkJaXRlbV9jZiA9IE5VTEw7Ci0JfQotCSpkc3QgPSBydjsKLQlyZXR1cm4gMTsKKyAgICBpZiggIVB5U2VxdWVuY2VfQ2hlY2soc3JjKSApIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICJDYW5ub3QgY29udmVydCAlLjUwMHMgb2JqZWN0cyB0byBDRkFycmF5IiwKKyAgICAgICAgICAgIHNyYy0+b2JfdHlwZS0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBzaXplID0gUHlTZXF1ZW5jZV9TaXplKHNyYyk7CisgICAgcnYgPSBDRkFycmF5Q3JlYXRlTXV0YWJsZSgoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwgc2l6ZSwgJmtDRlR5cGVBcnJheUNhbGxCYWNrcyk7CisgICAgaWYgKHJ2ID09IE5VTEwpIHsKKyAgICAgICAgUHlNYWNfRXJyb3IocmVzTm90Rm91bmQpOworICAgICAgICBnb3RvIGVycjsKKyAgICB9CisKKyAgICBmb3IoIGk9MDsgaTxzaXplOyBpKyspIHsKKyAgICAgICAgaXRlbV9weSA9IFB5U2VxdWVuY2VfR2V0SXRlbShzcmMsIGkpOworICAgICAgICBpZiAoaXRlbV9weSA9PSBOVUxMKSBnb3RvIGVycjsKKyAgICAgICAgaWYgKCAhUHlDRl9QeXRob24yQ0YoaXRlbV9weSwgJml0ZW1fY2YpKSBnb3RvIGVycjsKKyAgICAgICAgUHlfREVDUkVGKGl0ZW1fcHkpOworICAgICAgICBDRkFycmF5U2V0VmFsdWVBdEluZGV4KHJ2LCBpLCBpdGVtX2NmKTsKKyAgICAgICAgQ0ZSZWxlYXNlKGl0ZW1fY2YpOworICAgICAgICBpdGVtX2NmID0gTlVMTDsKKyAgICB9CisgICAgKmRzdCA9IHJ2OworICAgIHJldHVybiAxOwogZXJyOgotCVB5X1hERUNSRUYoaXRlbV9weSk7Ci0JaWYgKHJ2KSBDRlJlbGVhc2UocnYpOwotCWlmIChpdGVtX2NmKSBDRlJlbGVhc2UoaXRlbV9jZik7Ci0JcmV0dXJuIDA7CQkKKyAgICBQeV9YREVDUkVGKGl0ZW1fcHkpOworICAgIGlmIChydikgQ0ZSZWxlYXNlKHJ2KTsKKyAgICBpZiAoaXRlbV9jZikgQ0ZSZWxlYXNlKGl0ZW1fY2YpOworICAgIHJldHVybiAwOwogfQogCiBpbnQKIFB5Q0ZfUHl0aG9uMkNGX21hcHBpbmcoUHlPYmplY3QgKnNyYywgQ0ZEaWN0aW9uYXJ5UmVmICpkc3QpIHsKLQlDRk11dGFibGVEaWN0aW9uYXJ5UmVmIHJ2ID0gTlVMTDsKLQlQeU9iamVjdCAqYXNsaXN0ID0gTlVMTDsKLQlDRlR5cGVSZWYga2V5X2NmID0gTlVMTCwgdmFsdWVfY2YgPSBOVUxMOwotCVB5T2JqZWN0ICppdGVtX3B5ID0gTlVMTCwgKmtleV9weSA9IE5VTEwsICp2YWx1ZV9weSA9IE5VTEw7Ci0JaW50IHNpemUsIGk7Ci0JCi0JaWYoICFQeU1hcHBpbmdfQ2hlY2soc3JjKSApIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSJDYW5ub3QgY29udmVydCAlLjUwMHMgb2JqZWN0cyB0byBDRkRpY3Rpb25hcnkiLAotCQkJc3JjLT5vYl90eXBlLT50cF9uYW1lKTsKLQkJcmV0dXJuIDA7Ci0JfQotCXNpemUgPSBQeU1hcHBpbmdfU2l6ZShzcmMpOwotCXJ2ID0gQ0ZEaWN0aW9uYXJ5Q3JlYXRlTXV0YWJsZSgoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwgc2l6ZSwKLQkJCQkJJmtDRlR5cGVEaWN0aW9uYXJ5S2V5Q2FsbEJhY2tzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtDRlR5cGVEaWN0aW9uYXJ5VmFsdWVDYWxsQmFja3MpOwotCWlmIChydiA9PSBOVUxMKSB7Ci0JCVB5TWFjX0Vycm9yKHJlc05vdEZvdW5kKTsgCi0JCWdvdG8gZXJyOwotCX0KLQlpZiAoIChhc2xpc3QgPSBQeU1hcHBpbmdfSXRlbXMoc3JjKSkgPT0gTlVMTCApIGdvdG8gZXJyOworICAgIENGTXV0YWJsZURpY3Rpb25hcnlSZWYgcnYgPSBOVUxMOworICAgIFB5T2JqZWN0ICphc2xpc3QgPSBOVUxMOworICAgIENGVHlwZVJlZiBrZXlfY2YgPSBOVUxMLCB2YWx1ZV9jZiA9IE5VTEw7CisgICAgUHlPYmplY3QgKml0ZW1fcHkgPSBOVUxMLCAqa2V5X3B5ID0gTlVMTCwgKnZhbHVlX3B5ID0gTlVMTDsKKyAgICBpbnQgc2l6ZSwgaTsKIAotCWZvciggaT0wOyBpPHNpemU7IGkrKykgewotCQlpdGVtX3B5ID0gUHlTZXF1ZW5jZV9HZXRJdGVtKGFzbGlzdCwgaSk7Ci0JCWlmIChpdGVtX3B5ID09IE5VTEwpIGdvdG8gZXJyOwotCQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoaXRlbV9weSwgIk9PIiwgJmtleV9weSwgJnZhbHVlX3B5KSkgZ290byBlcnI7Ci0JCWlmICggIVB5Q0ZfUHl0aG9uMkNGKGtleV9weSwgJmtleV9jZikgKSBnb3RvIGVycjsKLQkJaWYgKCAhUHlDRl9QeXRob24yQ0YodmFsdWVfcHksICZ2YWx1ZV9jZikgKSBnb3RvIGVycjsKLQkJQ0ZEaWN0aW9uYXJ5QWRkVmFsdWUocnYsIGtleV9jZiwgdmFsdWVfY2YpOwotCQlDRlJlbGVhc2Uoa2V5X2NmKTsKLQkJa2V5X2NmID0gTlVMTDsKLQkJQ0ZSZWxlYXNlKHZhbHVlX2NmKTsKLQkJdmFsdWVfY2YgPSBOVUxMOwotCX0KLQkqZHN0ID0gcnY7Ci0JcmV0dXJuIDE7CisgICAgaWYoICFQeU1hcHBpbmdfQ2hlY2soc3JjKSApIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICJDYW5ub3QgY29udmVydCAlLjUwMHMgb2JqZWN0cyB0byBDRkRpY3Rpb25hcnkiLAorICAgICAgICAgICAgc3JjLT5vYl90eXBlLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHNpemUgPSBQeU1hcHBpbmdfU2l6ZShzcmMpOworICAgIHJ2ID0gQ0ZEaWN0aW9uYXJ5Q3JlYXRlTXV0YWJsZSgoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrQ0ZUeXBlRGljdGlvbmFyeUtleUNhbGxCYWNrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrQ0ZUeXBlRGljdGlvbmFyeVZhbHVlQ2FsbEJhY2tzKTsKKyAgICBpZiAocnYgPT0gTlVMTCkgeworICAgICAgICBQeU1hY19FcnJvcihyZXNOb3RGb3VuZCk7CisgICAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgICBpZiAoIChhc2xpc3QgPSBQeU1hcHBpbmdfSXRlbXMoc3JjKSkgPT0gTlVMTCApIGdvdG8gZXJyOworCisgICAgZm9yKCBpPTA7IGk8c2l6ZTsgaSsrKSB7CisgICAgICAgIGl0ZW1fcHkgPSBQeVNlcXVlbmNlX0dldEl0ZW0oYXNsaXN0LCBpKTsKKyAgICAgICAgaWYgKGl0ZW1fcHkgPT0gTlVMTCkgZ290byBlcnI7CisgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShpdGVtX3B5LCAiT08iLCAma2V5X3B5LCAmdmFsdWVfcHkpKSBnb3RvIGVycjsKKyAgICAgICAgaWYgKCAhUHlDRl9QeXRob24yQ0Yoa2V5X3B5LCAma2V5X2NmKSApIGdvdG8gZXJyOworICAgICAgICBpZiAoICFQeUNGX1B5dGhvbjJDRih2YWx1ZV9weSwgJnZhbHVlX2NmKSApIGdvdG8gZXJyOworICAgICAgICBDRkRpY3Rpb25hcnlBZGRWYWx1ZShydiwga2V5X2NmLCB2YWx1ZV9jZik7CisgICAgICAgIENGUmVsZWFzZShrZXlfY2YpOworICAgICAgICBrZXlfY2YgPSBOVUxMOworICAgICAgICBDRlJlbGVhc2UodmFsdWVfY2YpOworICAgICAgICB2YWx1ZV9jZiA9IE5VTEw7CisgICAgfQorICAgICpkc3QgPSBydjsKKyAgICByZXR1cm4gMTsKIGVycjoKLQlQeV9YREVDUkVGKGl0ZW1fcHkpOwotCVB5X1hERUNSRUYoYXNsaXN0KTsKLQlpZiAocnYpIENGUmVsZWFzZShydik7Ci0JaWYgKGtleV9jZikgQ0ZSZWxlYXNlKGtleV9jZik7Ci0JaWYgKHZhbHVlX2NmKSBDRlJlbGVhc2UodmFsdWVfY2YpOwotCXJldHVybiAwOwkJCisgICAgUHlfWERFQ1JFRihpdGVtX3B5KTsKKyAgICBQeV9YREVDUkVGKGFzbGlzdCk7CisgICAgaWYgKHJ2KSBDRlJlbGVhc2UocnYpOworICAgIGlmIChrZXlfY2YpIENGUmVsZWFzZShrZXlfY2YpOworICAgIGlmICh2YWx1ZV9jZikgQ0ZSZWxlYXNlKHZhbHVlX2NmKTsKKyAgICByZXR1cm4gMDsKIH0KIAogaW50CiBQeUNGX1B5dGhvbjJDRl9zaW1wbGUoUHlPYmplY3QgKnNyYywgQ0ZUeXBlUmVmICpkc3QpIHsKLQkKKwogI2lmIDAKLQlpZiAoUHlPYmplY3RfSGFzQXR0clN0cmluZyhzcmMsICJDRlR5cGUiKSkgewotCQkqZHN0ID0gUHlPYmplY3RfQ2FsbE1ldGhvZChzcmMsICJDRlR5cGUiLCAiIik7Ci0JCXJldHVybiAoKmRzdCAhPSBOVUxMKTsKLQl9CisgICAgaWYgKFB5T2JqZWN0X0hhc0F0dHJTdHJpbmcoc3JjLCAiQ0ZUeXBlIikpIHsKKyAgICAgICAgKmRzdCA9IFB5T2JqZWN0X0NhbGxNZXRob2Qoc3JjLCAiQ0ZUeXBlIiwgIiIpOworICAgICAgICByZXR1cm4gKCpkc3QgIT0gTlVMTCk7CisgICAgfQogI2VuZGlmCi0JaWYgKFB5U3RyaW5nX0NoZWNrKHNyYykgfHwgUHlVbmljb2RlX0NoZWNrKHNyYykpIAotCQlyZXR1cm4gUHlDRl9QeXRob24yQ0Zfc3RyaW5nKHNyYywgKENGU3RyaW5nUmVmICopZHN0KTsKLQlpZiAoUHlCb29sX0NoZWNrKHNyYykpIHsKLQkJaWYgKHNyYyA9PSBQeV9UcnVlKQotCQkJKmRzdCA9IGtDRkJvb2xlYW5UcnVlOwotCQllbHNlCi0JCQkqZHN0ID0ga0NGQm9vbGVhbkZhbHNlOwotCQlyZXR1cm4gMTsKLQl9Ci0JaWYgKFB5SW50X0NoZWNrKHNyYykpIHsKLQkJbG9uZyB2ID0gUHlJbnRfQXNMb25nKHNyYyk7Ci0JCSpkc3QgPSBDRk51bWJlckNyZWF0ZShOVUxMLCBrQ0ZOdW1iZXJMb25nVHlwZSwgJnYpOwotCQlyZXR1cm4gMTsKLQl9Ci0JaWYgKFB5RmxvYXRfQ2hlY2soc3JjKSkgewotCQlkb3VibGUgZCA9IFB5RmxvYXRfQXNEb3VibGUoc3JjKTsKLQkJKmRzdCA9IENGTnVtYmVyQ3JlYXRlKE5VTEwsIGtDRk51bWJlckRvdWJsZVR5cGUsICZkKTsKLQkJcmV0dXJuIDE7Ci0JfQotCQkJCi0JUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJICAiQ2Fubm90IGNvbnZlcnQgJS41MDBzIG9iamVjdHMgdG8gQ0ZUeXBlIiwKLQkJCQkgICAgIHNyYy0+b2JfdHlwZS0+dHBfbmFtZSk7Ci0JcmV0dXJuIDA7CisgICAgaWYgKFB5U3RyaW5nX0NoZWNrKHNyYykgfHwgUHlVbmljb2RlX0NoZWNrKHNyYykpCisgICAgICAgIHJldHVybiBQeUNGX1B5dGhvbjJDRl9zdHJpbmcoc3JjLCAoQ0ZTdHJpbmdSZWYgKilkc3QpOworICAgIGlmIChQeUJvb2xfQ2hlY2soc3JjKSkgeworICAgICAgICBpZiAoc3JjID09IFB5X1RydWUpCisgICAgICAgICAgICAqZHN0ID0ga0NGQm9vbGVhblRydWU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICpkc3QgPSBrQ0ZCb29sZWFuRmFsc2U7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAoUHlJbnRfQ2hlY2soc3JjKSkgeworICAgICAgICBsb25nIHYgPSBQeUludF9Bc0xvbmcoc3JjKTsKKyAgICAgICAgKmRzdCA9IENGTnVtYmVyQ3JlYXRlKE5VTEwsIGtDRk51bWJlckxvbmdUeXBlLCAmdik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAoUHlGbG9hdF9DaGVjayhzcmMpKSB7CisgICAgICAgIGRvdWJsZSBkID0gUHlGbG9hdF9Bc0RvdWJsZShzcmMpOworICAgICAgICAqZHN0ID0gQ0ZOdW1iZXJDcmVhdGUoTlVMTCwga0NGTnVtYmVyRG91YmxlVHlwZSwgJmQpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAiQ2Fubm90IGNvbnZlcnQgJS41MDBzIG9iamVjdHMgdG8gQ0ZUeXBlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy0+b2JfdHlwZS0+dHBfbmFtZSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIGludAogUHlDRl9QeXRob24yQ0Zfc3RyaW5nKFB5T2JqZWN0ICpzcmMsIENGU3RyaW5nUmVmICpkc3QpIHsKLQljaGFyICpjaGFyczsKLQlDRkluZGV4IHNpemU7Ci0JVW5pQ2hhciAqdW5pY2hhcnM7Ci0JCi0JaWYgKFB5U3RyaW5nX0NoZWNrKHNyYykpIHsKLQkJaWYgKCFQeUFyZ19QYXJzZShzcmMsICJlcyIsICJhc2NpaSIsICZjaGFycykpCi0JCQlyZXR1cm4gMDsgLyogVGhpcyBlcnJvciBpcyBtb3JlIGRlc2NyaXB0aXZlIHRoYW4gdGhlIGdlbmVyYWwgb25lIGJlbG93ICovCi0JCSpkc3QgPSBDRlN0cmluZ0NyZWF0ZVdpdGhDU3RyaW5nKChDRkFsbG9jYXRvclJlZilOVUxMLCBjaGFycywga0NGU3RyaW5nRW5jb2RpbmdBU0NJSSk7Ci0JCVB5TWVtX0ZyZWUoY2hhcnMpOwotCQlyZXR1cm4gMTsKLQl9Ci0JaWYgKFB5VW5pY29kZV9DaGVjayhzcmMpKSB7Ci0JCS8qIFdlIHVzZSB0aGUgQ0YgdHlwZXMgaGVyZSwgaWYgUHl0aG9uIHdhcyBjb25maWd1cmVkIGRpZmZlcmVudGx5IHRoYXQgd2lsbCBnaXZlIGFuIGVycm9yICovCi0JCXNpemUgPSBQeVVuaWNvZGVfR2V0U2l6ZShzcmMpOwotCQlpZiAoKHVuaWNoYXJzID0gUHlVbmljb2RlX0FzVW5pY29kZShzcmMpKSA9PSBOVUxMICkgZ290byBlcnI7Ci0JCSpkc3QgPSBDRlN0cmluZ0NyZWF0ZVdpdGhDaGFyYWN0ZXJzKChDRkFsbG9jYXRvclJlZilOVUxMLCB1bmljaGFycywgc2l6ZSk7Ci0JCXJldHVybiAxOwotCX0KKyAgICBjaGFyICpjaGFyczsKKyAgICBDRkluZGV4IHNpemU7CisgICAgVW5pQ2hhciAqdW5pY2hhcnM7CisKKyAgICBpZiAoUHlTdHJpbmdfQ2hlY2soc3JjKSkgeworICAgICAgICBpZiAoIVB5QXJnX1BhcnNlKHNyYywgImVzIiwgImFzY2lpIiwgJmNoYXJzKSkKKyAgICAgICAgICAgIHJldHVybiAwOyAvKiBUaGlzIGVycm9yIGlzIG1vcmUgZGVzY3JpcHRpdmUgdGhhbiB0aGUgZ2VuZXJhbCBvbmUgYmVsb3cgKi8KKyAgICAgICAgKmRzdCA9IENGU3RyaW5nQ3JlYXRlV2l0aENTdHJpbmcoKENGQWxsb2NhdG9yUmVmKU5VTEwsIGNoYXJzLCBrQ0ZTdHJpbmdFbmNvZGluZ0FTQ0lJKTsKKyAgICAgICAgUHlNZW1fRnJlZShjaGFycyk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAoUHlVbmljb2RlX0NoZWNrKHNyYykpIHsKKyAgICAgICAgLyogV2UgdXNlIHRoZSBDRiB0eXBlcyBoZXJlLCBpZiBQeXRob24gd2FzIGNvbmZpZ3VyZWQgZGlmZmVyZW50bHkgdGhhdCB3aWxsIGdpdmUgYW4gZXJyb3IgKi8KKyAgICAgICAgc2l6ZSA9IFB5VW5pY29kZV9HZXRTaXplKHNyYyk7CisgICAgICAgIGlmICgodW5pY2hhcnMgPSBQeVVuaWNvZGVfQXNVbmljb2RlKHNyYykpID09IE5VTEwgKSBnb3RvIGVycjsKKyAgICAgICAgKmRzdCA9IENGU3RyaW5nQ3JlYXRlV2l0aENoYXJhY3RlcnMoKENGQWxsb2NhdG9yUmVmKU5VTEwsIHVuaWNoYXJzLCBzaXplKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQogZXJyOgotCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCSAgIkNhbm5vdCBjb252ZXJ0ICUuNTAwcyBvYmplY3RzIHRvIENGU3RyaW5nIiwKLQkJCQkgICAgIHNyYy0+b2JfdHlwZS0+dHBfbmFtZSk7Ci0JcmV0dXJuIDA7CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgIkNhbm5vdCBjb252ZXJ0ICUuNTAwcyBvYmplY3RzIHRvIENGU3RyaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy0+b2JfdHlwZS0+dHBfbmFtZSk7CisgICAgcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9jZy9DRk1MYXRlSW1wb3J0LmMgYi9NYWMvTW9kdWxlcy9jZy9DRk1MYXRlSW1wb3J0LmMKaW5kZXggYmMyOTc2ZS4uOTU1YWNmYiAxMDA3NTUKLS0tIGEvTWFjL01vZHVsZXMvY2cvQ0ZNTGF0ZUltcG9ydC5jCisrKyBiL01hYy9Nb2R1bGVzL2NnL0NGTUxhdGVJbXBvcnQuYwpAQCAtMSw0NSArMSw0NSBAQAogLyoKLQlGaWxlOgkJQ0ZNTGF0ZUltcG9ydC5jCisgICAgRmlsZTogICAgICAgICAgICAgICBDRk1MYXRlSW1wb3J0LmMKIAotCUNvbnRhaW5zOglJbXBsZW1lbnRhdGlvbiBvZiBDRk0gbGF0ZSBpbXBvcnQgbGlicmFyeS4KKyAgICBDb250YWluczogICAgICAgICAgIEltcGxlbWVudGF0aW9uIG9mIENGTSBsYXRlIGltcG9ydCBsaWJyYXJ5LgogCi0JV3JpdHRlbiBieToJUXVpbm4KKyAgICBXcml0dGVuIGJ5OiAgICAgICAgIFF1aW5uCiAKLQlDb3B5cmlnaHQ6CUNvcHlyaWdodCCpIDE5OTkgYnkgQXBwbGUgQ29tcHV0ZXIsIEluYy4sIGFsbCByaWdodHMgcmVzZXJ2ZWQuCisgICAgQ29weXJpZ2h0OiAgICAgICAgICBDb3B5cmlnaHQgqSAxOTk5IGJ5IEFwcGxlIENvbXB1dGVyLCBJbmMuLCBhbGwgcmlnaHRzIHJlc2VydmVkLgogCi0JCQkJWW91IG1heSBpbmNvcnBvcmF0ZSB0aGlzIEFwcGxlIHNhbXBsZSBzb3VyY2UgY29kZSBpbnRvIHlvdXIgcHJvZ3JhbShzKSB3aXRob3V0Ci0JCQkJcmVzdHJpY3Rpb24uIFRoaXMgQXBwbGUgc2FtcGxlIHNvdXJjZSBjb2RlIGhhcyBiZWVuIHByb3ZpZGVkICJBUyBJUyIgYW5kIHRoZQotCQkJCXJlc3BvbnNpYmlsaXR5IGZvciBpdHMgb3BlcmF0aW9uIGlzIHlvdXJzLiBZb3UgYXJlIG5vdCBwZXJtaXR0ZWQgdG8gcmVkaXN0cmlidXRlCi0JCQkJdGhpcyBBcHBsZSBzYW1wbGUgc291cmNlIGNvZGUgYXMgIkFwcGxlIHNhbXBsZSBzb3VyY2UgY29kZSIgYWZ0ZXIgaGF2aW5nIG1hZGUKLQkJCQljaGFuZ2VzLiBJZiB5b3UncmUgZ29pbmcgdG8gcmUtZGlzdHJpYnV0ZSB0aGUgc291cmNlLCB3ZSByZXF1aXJlIHRoYXQgeW91IG1ha2UKLQkJCQlpdCBjbGVhciBpbiB0aGUgc291cmNlIHRoYXQgdGhlIGNvZGUgd2FzIGRlc2NlbmRlZCBmcm9tIEFwcGxlIHNhbXBsZSBzb3VyY2UKLQkJCQljb2RlLCBidXQgdGhhdCB5b3UndmUgbWFkZSBjaGFuZ2VzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlvdSBtYXkgaW5jb3Jwb3JhdGUgdGhpcyBBcHBsZSBzYW1wbGUgc291cmNlIGNvZGUgaW50byB5b3VyIHByb2dyYW0ocykgd2l0aG91dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0aW9uLiBUaGlzIEFwcGxlIHNhbXBsZSBzb3VyY2UgY29kZSBoYXMgYmVlbiBwcm92aWRlZCAiQVMgSVMiIGFuZCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zaWJpbGl0eSBmb3IgaXRzIG9wZXJhdGlvbiBpcyB5b3Vycy4gWW91IGFyZSBub3QgcGVybWl0dGVkIHRvIHJlZGlzdHJpYnV0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgQXBwbGUgc2FtcGxlIHNvdXJjZSBjb2RlIGFzICJBcHBsZSBzYW1wbGUgc291cmNlIGNvZGUiIGFmdGVyIGhhdmluZyBtYWRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlcy4gSWYgeW91J3JlIGdvaW5nIHRvIHJlLWRpc3RyaWJ1dGUgdGhlIHNvdXJjZSwgd2UgcmVxdWlyZSB0aGF0IHlvdSBtYWtlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQgY2xlYXIgaW4gdGhlIHNvdXJjZSB0aGF0IHRoZSBjb2RlIHdhcyBkZXNjZW5kZWQgZnJvbSBBcHBsZSBzYW1wbGUgc291cmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSwgYnV0IHRoYXQgeW91J3ZlIG1hZGUgY2hhbmdlcy4KIAotCUNoYW5nZSBIaXN0b3J5IChtb3N0IHJlY2VudCBmaXJzdCk6CisgICAgQ2hhbmdlIEhpc3RvcnkgKG1vc3QgcmVjZW50IGZpcnN0KToKIAotICAgICAgICA8MTM+ICAgICAyNC85LzAxICAgIFF1aW5uICAgRml4ZXMgdG8gY29tcGlsZSB3aXRoIEMrKyBhY3RpdmF0ZWQuCi0gICAgICAgIDwxMj4gICAgIDIxLzkvMDEgICAgUXVpbm4gICBbMjcxMDQ4OV0gRml4IHR5cG8gaW4gdGhlIGNvbW1lbnRzIGZvciBGcmFnbWVudExvb2t1cC4KLSAgICAgICAgPDExPiAgICAgMjEvOS8wMSAgICBRdWlubiAgIENoYW5nZXMgZm9yIENXUHJvNyBNYWNoLU8gYnVpbGQuCi0gICAgICAgIDwxMD4gICAgIDE5LzkvMDEgICAgUXVpbm4gICBDb3JyZWN0ZWQgaW1wbGVtZW50YXRpb24gb2Yga1BFRlJlbG9jU21CeVNlY3Rpb24uIEFkZGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbnMgb2Yga1BFRlJlbG9jU2V0UG9zaXRpb24gYW5kIGtQRUZSZWxvY0xnQnlJbXBvcnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmcm9tIGNvZGUgY29udHJpYnV0ZWQgYnkgRXJpYyBHcmFudCwgTmVkIEhvbGJyb29rLCBhbmQgU3RldmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEthbGt3YXJmKSwgYWx0aG91Z2ggSSBjYW4ndCB0ZXN0IHRoZW0geWV0LgotICAgICAgICAgPDk+ICAgICAxOS85LzAxICAgIFF1aW5uICAgV2Ugbm93IGhhbmRsZSB1bnBhY2tlZCBkYXRhIHNlY3Rpb25zLCBjb3VydGVzeSBvZiBzb21lIGNvZGUgZnJvbQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmVkIEhvbGJyb29rLgotICAgICAgICAgPDg+ICAgICAxOS85LzAxICAgIFF1aW5uICAgTWlub3IgZml4ZXMgZm9yIHRoZSBwcmV2aW91cyBjaGVja2luLiBVcGRhdGVkIHNvbWUgY29tbWVudHMgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBraWxsZWQgc29tZSBkZWFkIGNvZGUuCi0gICAgICAgICA8Nz4gICAgIDE5LzkvMDEgICAgUXVpbm4gICBTaW1wbGlmaWVkIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gYWZ0ZXIgYSBzdWdnZXN0aW9uIGJ5IEVyaWMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYW50LiBZb3Ugbm8gbG9uZ2VyIGhhdmUgdG8gQ0ZNIGV4cG9ydCBhIGR1bW15IGZ1bmN0aW9uOyB5b3UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbiBqdXN0IHBhc3MgaW4gdGhlIGFkZHJlc3Mgb2YgeW91ciBmcmFnbWVudCdzIGluaXQgcm91dGluZS4KLSAgICAgICAgIDw2PiAgICAgMTUvMi8wMSAgICBRdWlubiAgIE1vZGlmeSBjb21waWxlLXRpbWUgd2FybmluZ3MgdG8gY29tcGxhaW4gaWYgeW91IHRyeSB0byBidWlsZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBtb2R1bGUgaW50byBhIE1hY2gtTyBiaW5hcnkuCi0gICAgICAgICA8NT4gICAgICA1LzIvMDEgICAgUXVpbm4gICBSZW1vdmVkIHJlZHVuZGFudCBhc3NpZ25tZW50IGluIENGTUxhdGVJbXBvcnRDb3JlLgotICAgICAgICAgPDQ+ICAgIDMwLzExLzAwICAgIFF1aW5uICAgQWRkZWQgY29tbWVudCBhYm91dCBmdXR1cmUgb2YgZGF0YSBzeW1ib2xzIGluIENGLgotICAgICAgICAgPDM+ICAgIDE2LzExLzAwICAgIFF1aW5uICAgQWxsb3cgc3ltYm9sIGZpbmRpbmcgdmlhIGEgY2FsbGJhY2sgYW5kIHVzZSB0aGF0IHRvIGltcGxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZCdW5kbGUgc3VwcG9ydC4KLSAgICAgICAgIDwyPiAgICAxOC8xMC85OSAgICBRdWlubiAgIFJlbmFtZWQgQ0ZNTGF0ZUltcG9ydCB0byBDRk1MYXRlSW1wb3J0TGlicmFyeSB0byBhbGxvdyBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3NpYmxlIGZ1dHVyZSBBUEkgZXhwYW5zaW9uLgotICAgICAgICAgPDE+ICAgICAxNS82Lzk5ICAgIFF1aW5uICAgRmlyc3QgY2hlY2tlZCBpbi4KKyAgICA8MTM+ICAgICAyNC85LzAxICAgIFF1aW5uICAgRml4ZXMgdG8gY29tcGlsZSB3aXRoIEMrKyBhY3RpdmF0ZWQuCisgICAgPDEyPiAgICAgMjEvOS8wMSAgICBRdWlubiAgIFsyNzEwNDg5XSBGaXggdHlwbyBpbiB0aGUgY29tbWVudHMgZm9yIEZyYWdtZW50TG9va3VwLgorICAgIDwxMT4gICAgIDIxLzkvMDEgICAgUXVpbm4gICBDaGFuZ2VzIGZvciBDV1BybzcgTWFjaC1PIGJ1aWxkLgorICAgIDwxMD4gICAgIDE5LzkvMDEgICAgUXVpbm4gICBDb3JyZWN0ZWQgaW1wbGVtZW50YXRpb24gb2Yga1BFRlJlbG9jU21CeVNlY3Rpb24uIEFkZGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9ucyBvZiBrUEVGUmVsb2NTZXRQb3NpdGlvbiBhbmQga1BFRlJlbG9jTGdCeUltcG9ydAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZnJvbSBjb2RlIGNvbnRyaWJ1dGVkIGJ5IEVyaWMgR3JhbnQsIE5lZCBIb2xicm9vaywgYW5kIFN0ZXZlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEthbGt3YXJmKSwgYWx0aG91Z2ggSSBjYW4ndCB0ZXN0IHRoZW0geWV0LgorICAgICA8OT4gICAgIDE5LzkvMDEgICAgUXVpbm4gICBXZSBub3cgaGFuZGxlIHVucGFja2VkIGRhdGEgc2VjdGlvbnMsIGNvdXJ0ZXN5IG9mIHNvbWUgY29kZSBmcm9tCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5lZCBIb2xicm9vay4KKyAgICAgPDg+ICAgICAxOS85LzAxICAgIFF1aW5uICAgTWlub3IgZml4ZXMgZm9yIHRoZSBwcmV2aW91cyBjaGVja2luLiBVcGRhdGVkIHNvbWUgY29tbWVudHMgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtpbGxlZCBzb21lIGRlYWQgY29kZS4KKyAgICAgPDc+ICAgICAxOS85LzAxICAgIFF1aW5uICAgU2ltcGxpZmllZCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIGFmdGVyIGEgc3VnZ2VzdGlvbiBieSBFcmljCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYW50LiBZb3Ugbm8gbG9uZ2VyIGhhdmUgdG8gQ0ZNIGV4cG9ydCBhIGR1bW15IGZ1bmN0aW9uOyB5b3UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuIGp1c3QgcGFzcyBpbiB0aGUgYWRkcmVzcyBvZiB5b3VyIGZyYWdtZW50J3MgaW5pdCByb3V0aW5lLgorICAgICA8Nj4gICAgIDE1LzIvMDEgICAgUXVpbm4gICBNb2RpZnkgY29tcGlsZS10aW1lIHdhcm5pbmdzIHRvIGNvbXBsYWluIGlmIHlvdSB0cnkgdG8gYnVpbGQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBtb2R1bGUgaW50byBhIE1hY2gtTyBiaW5hcnkuCisgICAgIDw1PiAgICAgIDUvMi8wMSAgICBRdWlubiAgIFJlbW92ZWQgcmVkdW5kYW50IGFzc2lnbm1lbnQgaW4gQ0ZNTGF0ZUltcG9ydENvcmUuCisgICAgIDw0PiAgICAzMC8xMS8wMCAgICBRdWlubiAgIEFkZGVkIGNvbW1lbnQgYWJvdXQgZnV0dXJlIG9mIGRhdGEgc3ltYm9scyBpbiBDRi4KKyAgICAgPDM+ICAgIDE2LzExLzAwICAgIFF1aW5uICAgQWxsb3cgc3ltYm9sIGZpbmRpbmcgdmlhIGEgY2FsbGJhY2sgYW5kIHVzZSB0aGF0IHRvIGltcGxlbWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRkJ1bmRsZSBzdXBwb3J0LgorICAgICA8Mj4gICAgMTgvMTAvOTkgICAgUXVpbm4gICBSZW5hbWVkIENGTUxhdGVJbXBvcnQgdG8gQ0ZNTGF0ZUltcG9ydExpYnJhcnkgdG8gYWxsb3cgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3NpYmxlIGZ1dHVyZSBBUEkgZXhwYW5zaW9uLgorICAgICA8MT4gICAgIDE1LzYvOTkgICAgUXVpbm4gICBGaXJzdCBjaGVja2VkIGluLgogKi8KIAogLy8gVG8gRG8gTGlzdDoKQEAgLTY2LDggKzY2LDggQEAKIC8vIE1hYyBPUyBJbnRlcmZhY2VzCiAKICNpZiAhIE1PUkVfRlJBTUVXT1JLX0lOQ0xVREVTCi0JI2luY2x1ZGUgPENvZGVGcmFnbWVudHMuaD4KLQkjaW5jbHVkZSA8UEVGQmluYXJ5Rm9ybWF0Lmg+CisgICAgI2luY2x1ZGUgPENvZGVGcmFnbWVudHMuaD4KKyAgICAjaW5jbHVkZSA8UEVGQmluYXJ5Rm9ybWF0Lmg+CiAjZW5kaWYKIAogLy8gU3RhbmRhcmQgQyBJbnRlcmZhY2VzCkBAIC04NiwzMiArODYsMzIgQEAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKICNpZiBUQVJHRVRfUlRfTUFDX01BQ0hPCi0JI2Vycm9yIENGTUxhdGVJbXBvcnQgaXMgbm90IHN1aXRhYmxlIGZvciB1c2UgaW4gYSBNYWNoLU8gcHJvamVjdC4KKyAgICAjZXJyb3IgQ0ZNTGF0ZUltcG9ydCBpcyBub3Qgc3VpdGFibGUgZm9yIHVzZSBpbiBhIE1hY2gtTyBwcm9qZWN0LgogI2VsaWYgIVRBUkdFVF9SVF9NQUNfQ0ZNIHx8ICFUQVJHRVRfQ1BVX1BQQwotCSNlcnJvciBDRk1MYXRlSW1wb3J0IGhhcyBub3QgYmVlbiBxdWFsaWZpZWQgZm9yIDY4SyBvciBDRk0tNjhLIHVzZS4KKyAgICAjZXJyb3IgQ0ZNTGF0ZUltcG9ydCBoYXMgbm90IGJlZW4gcXVhbGlmaWVkIGZvciA2OEsgb3IgQ0ZNLTY4SyB1c2UuCiAjZW5kaWYKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICNwcmFnbWEgbWFyayAtLS0tLSBVdGlsaXR5IFJvdXRpbmVzIC0tLS0tCiAKIHN0YXRpYyBPU1N0YXR1cyBGU1JlYWRBdE9mZnNldChTSW50MTYgcmVmTnVtLCBTSW50MzIgb2Zmc2V0LCBTSW50MzIgY291bnQsIHZvaWQgKmJ1ZmZlcikKLQkvLyBBIGNvbnZlbmllbnQgd3JhcHBlciBhcm91bmQgUEJSZWFkIHdoaWNoIGhhcyB0d28gYWR2YW50YWdlcwotCS8vIG92ZXIgRlNSZWFkLiAgRmlyc3QsIGl0IHRha2VzIGNvdW50IGFzIGEgdmFsdWUgcGFyYW1ldGVyLgotCS8vIFNlY29uZCwgaXQgcmVhZHMgZnJvbSBhbiBhcmJpdHJhcnkgb2Zmc2V0IGludG8gdGhlIGZpbGUsCi0JLy8gd2hpY2ggYXZvaWRzIGEgYnVuY2ggb2YgU2V0RlBvcyBjYWxscy4KLQkvLwotCS8vIEkgZ3Vlc3MgdGhpcyBzaG91bGQgZ28gaW50byAiTW9yZUZpbGVzLmgiLCBidXQgSSdtIG5vdCBzdXJlCi0JLy8gaG93IHdlJ3JlIGdvaW5nIHRvIGludGVncmF0ZSBzdWNoIGEgY29uY2VwdCBpbnRvIE1JQiB5ZXQuCisgICAgLy8gQSBjb252ZW5pZW50IHdyYXBwZXIgYXJvdW5kIFBCUmVhZCB3aGljaCBoYXMgdHdvIGFkdmFudGFnZXMKKyAgICAvLyBvdmVyIEZTUmVhZC4gIEZpcnN0LCBpdCB0YWtlcyBjb3VudCBhcyBhIHZhbHVlIHBhcmFtZXRlci4KKyAgICAvLyBTZWNvbmQsIGl0IHJlYWRzIGZyb20gYW4gYXJiaXRyYXJ5IG9mZnNldCBpbnRvIHRoZSBmaWxlLAorICAgIC8vIHdoaWNoIGF2b2lkcyBhIGJ1bmNoIG9mIFNldEZQb3MgY2FsbHMuCisgICAgLy8KKyAgICAvLyBJIGd1ZXNzIHRoaXMgc2hvdWxkIGdvIGludG8gIk1vcmVGaWxlcy5oIiwgYnV0IEknbSBub3Qgc3VyZQorICAgIC8vIGhvdyB3ZSdyZSBnb2luZyB0byBpbnRlZ3JhdGUgc3VjaCBhIGNvbmNlcHQgaW50byBNSUIgeWV0LgogewotCVBhcmFtQmxvY2tSZWMgcGI7Ci0JCi0JcGIuaW9QYXJhbS5pb1JlZk51bSAgICAgPSByZWZOdW07Ci0JcGIuaW9QYXJhbS5pb0J1ZmZlciAgICAgPSAoUHRyKSBidWZmZXI7Ci0JcGIuaW9QYXJhbS5pb1JlcUNvdW50ICAgPSBjb3VudDsKLQlwYi5pb1BhcmFtLmlvUG9zTW9kZSAgICA9IGZzRnJvbVN0YXJ0OwotCXBiLmlvUGFyYW0uaW9Qb3NPZmZzZXQgID0gb2Zmc2V0OwotCQotCXJldHVybiBQQlJlYWRTeW5jKCZwYik7CisgICAgUGFyYW1CbG9ja1JlYyBwYjsKKworICAgIHBiLmlvUGFyYW0uaW9SZWZOdW0gICAgID0gcmVmTnVtOworICAgIHBiLmlvUGFyYW0uaW9CdWZmZXIgICAgID0gKFB0cikgYnVmZmVyOworICAgIHBiLmlvUGFyYW0uaW9SZXFDb3VudCAgID0gY291bnQ7CisgICAgcGIuaW9QYXJhbS5pb1Bvc01vZGUgICAgPSBmc0Zyb21TdGFydDsKKyAgICBwYi5pb1BhcmFtLmlvUG9zT2Zmc2V0ICA9IG9mZnNldDsKKworICAgIHJldHVybiBQQlJlYWRTeW5jKCZwYik7CiB9CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCkBAIC0xMjQsMTYgKzEyNCwxNiBAQAogLy8gd2UgZmlsbCBvdXQgbW9yZSBmaWVsZHMuCiAKIHN0cnVjdCBGcmFnVG9GaXhJbmZvIHsKLQlDRnJhZ1N5c3RlbTdEaXNrRmxhdExvY2F0b3IJbG9jYXRvcjsJCQkJLy8gSG93IHRvIGZpbmQgdGhlIGZyYWdtZW50J3MgY29udGFpbmVyLgotCUNGcmFnQ29ubmVjdGlvbklEIAkJCWNvbm5JRDsJCQkJCS8vIENGTSBjb25uZWN0aW9uIHRvIHRoZSBmcmFnbWVudC4KLQlDRnJhZ0luaXRGdW5jdGlvbiAJCQlpbml0Um91dGluZTsJCQkvLyBUaGUgQ0ZNIGluaXQgcm91dGluZSBmb3IgdGhlIGZyYWdtZW50LgotCVBFRkNvbnRhaW5lckhlYWRlciAJCQljb250YWluZXJIZWFkZXI7CQkvLyBUaGUgQ0ZNIGhlYWRlciwgcmVhZCBpbiBmcm9tIHRoZSBjb250YWluZXIuCi0JUEVGU2VjdGlvbkhlYWRlcgkJCSpzZWN0aW9uSGVhZGVyczsJCS8vIFRoZSBDRk0gc2VjdGlvbiBoZWFkZXJzLiAgQSBwb2ludGVyIGJsb2NrIGNvbnRhaW5pbmcgYW4gYXJyYXkgb2YgY29udGFpbmVySGVhZGVyLnNlY3Rpb25Db3VudCBlbGVtZW50cy4KLQlQRUZMb2FkZXJJbmZvSGVhZGVyCQkJKmxvYWRlclNlY3Rpb247CQkJLy8gVGhlIGVudGlyZSBDRk0gbG9hZGVyIHNlY3Rpb24gaW4gYSBwb2ludGVyIGJsb2NrLgotCVNJbnQxNgkJCQkJCWZpbGVSZWY7CQkJCS8vIEEgcmVhZC1vbmx5IHBhdGggdG8gdGhlIENGTSBjb250YWluZXIuICBXZSBrZWVwIHRoaXMgaGVyZSBiZWNhdXNlIG9uZSB0aGF0IG9uZSByb3V0aW5lIG5lZWRzIHRvIHJlYWQgZnJvbSB0aGUgY29udGFpbmVyLgotCXZvaWQgCQkJCQkJKnNlY3Rpb24wQmFzZTsJCQkvLyBUaGUgYmFzZSBhZGRyZXNzIG9mIHNlY3Rpb24gMCwgd2hpY2ggd2UgZ28gdGhyb3VnaCBob29wcyB0byBjYWxjdWxhdGUuCi0Jdm9pZCAJCQkJCQkqc2VjdGlvbjFCYXNlOwkJCS8vIFRoZSBiYXNlIGFkZHJlc3Mgb2Ygc2VjdGlvbiAxLCB3aGljaCB3ZSBnbyB0aHJvdWdoIGhvb3BzIHRvIGNhbGN1bGF0ZS4KLQlCb29sZWFuCQkJCQkJZGlzcG9zZVNlY3Rpb25Qb2ludGVyczsJLy8gU2VlIGJlbG93LgorICAgIENGcmFnU3lzdGVtN0Rpc2tGbGF0TG9jYXRvciAgICAgICAgIGxvY2F0b3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBIb3cgdG8gZmluZCB0aGUgZnJhZ21lbnQncyBjb250YWluZXIuCisgICAgQ0ZyYWdDb25uZWN0aW9uSUQgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uSUQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ0ZNIGNvbm5lY3Rpb24gdG8gdGhlIGZyYWdtZW50LgorICAgIENGcmFnSW5pdEZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdFJvdXRpbmU7ICAgICAgICAgICAgICAgICAgICAvLyBUaGUgQ0ZNIGluaXQgcm91dGluZSBmb3IgdGhlIGZyYWdtZW50LgorICAgIFBFRkNvbnRhaW5lckhlYWRlciAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVySGVhZGVyOyAgICAgICAgICAgICAgICAvLyBUaGUgQ0ZNIGhlYWRlciwgcmVhZCBpbiBmcm9tIHRoZSBjb250YWluZXIuCisgICAgUEVGU2VjdGlvbkhlYWRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2VjdGlvbkhlYWRlcnM7ICAgICAgICAgICAgICAgIC8vIFRoZSBDRk0gc2VjdGlvbiBoZWFkZXJzLiAgQSBwb2ludGVyIGJsb2NrIGNvbnRhaW5pbmcgYW4gYXJyYXkgb2YgY29udGFpbmVySGVhZGVyLnNlY3Rpb25Db3VudCBlbGVtZW50cy4KKyAgICBQRUZMb2FkZXJJbmZvSGVhZGVyICAgICAgICAgICAgICAgICAgICAgICAgICpsb2FkZXJTZWN0aW9uOyAgICAgICAgICAgICAgICAgLy8gVGhlIGVudGlyZSBDRk0gbG9hZGVyIHNlY3Rpb24gaW4gYSBwb2ludGVyIGJsb2NrLgorICAgIFNJbnQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlUmVmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSByZWFkLW9ubHkgcGF0aCB0byB0aGUgQ0ZNIGNvbnRhaW5lci4gIFdlIGtlZXAgdGhpcyBoZXJlIGJlY2F1c2Ugb25lIHRoYXQgb25lIHJvdXRpbmUgbmVlZHMgdG8gcmVhZCBmcm9tIHRoZSBjb250YWluZXIuCisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzZWN0aW9uMEJhc2U7ICAgICAgICAgICAgICAgICAgLy8gVGhlIGJhc2UgYWRkcmVzcyBvZiBzZWN0aW9uIDAsIHdoaWNoIHdlIGdvIHRocm91Z2ggaG9vcHMgdG8gY2FsY3VsYXRlLgorICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2VjdGlvbjFCYXNlOyAgICAgICAgICAgICAgICAgIC8vIFRoZSBiYXNlIGFkZHJlc3Mgb2Ygc2VjdGlvbiAxLCB3aGljaCB3ZSBnbyB0aHJvdWdoIGhvb3BzIHRvIGNhbGN1bGF0ZS4KKyAgICBCb29sZWFuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcG9zZVNlY3Rpb25Qb2ludGVyczsgLy8gU2VlIGJlbG93LgogfTsKIHR5cGVkZWYgc3RydWN0IEZyYWdUb0ZpeEluZm8gRnJhZ1RvRml4SW5mbzsKIApAQCAtMTUxLDYxNCArMTUxLDYxNCBAQAogLy8gZGlzcG9zZVNlY3Rpb25Qb2ludGVycyByZW1haW5zIGFzIHZlc3RpZ2lhbCBzdXBwb3J0IGZvciB0aGUgY29uY2VwdC4KIAogc3RhdGljIE9TU3RhdHVzIFJlYWRDb250YWluZXJCYXNpY3MoRnJhZ1RvRml4SW5mbyAqZnJhZ1RvRml4KQotCS8vIFJlYWRzIHNvbWUgYmFzaWMgaW5mb3JtYXRpb24gZnJvbSB0aGUgY29udGFpbmVyIG9mIHRoZQotCS8vIGZyYWdtZW50IHRvIGZpeCBhbmQgc3RvcmVzIGl0IGluIHZhcmlvdXMgZmllbGRzIG9mCi0JLy8gZnJhZ1RvRml4LiAgVGhpcyBpbmNsdWRlczoKLQkvLwotCS8vIG8gY29udGFpbmVySGVhZGVyIC0tIFRoZSBjb250YWluIGhlYWRlciBpdHNlbGYuCi0JLy8gbyBzZWN0aW9uSGVhZGVycyAgLS0gVGhlIGFycmF5IG9mIHNlY3Rpb24gaGVhZGVycyAoaW4gYSBuZXdseSBhbGxvY2F0ZWQgcG9pbnRlciBibG9jaykuCi0JLy8gbyBsb2FkZXJTZWN0aW9uICAgLS0gVGhlIGVudGlyZSBsb2FkZXIgc2VjdGlvbiAoaW4gYSBuZXdseSBhbGxvY2F0ZWQgcG9pbnRlciBibG9jaykuCi0JLy8KLQkvLyBBbHNvIHNldHMgZGlzcG9zZVNlY3Rpb25Qb2ludGVycyB0byBpbmRpY2F0ZSB3aGV0aGVyCi0JLy8gdGhlIGxhc3QgdHdvIHBvaW50ZXJzIHNob3VsZCBiZSBkaXNwb3NlZCBvZi4KLQkvLwotCS8vIEZpbmFsbHksIGl0IGxlYXZlcyB0aGUgY29udGFpbmVyIGZpbGUgb3BlbiBmb3IgbGF0ZXIKLQkvLyBmb2xrcyB3aG8gd2FudCB0byByZWFkIGRhdGEgZnJvbSBpdC4KKyAgICAvLyBSZWFkcyBzb21lIGJhc2ljIGluZm9ybWF0aW9uIGZyb20gdGhlIGNvbnRhaW5lciBvZiB0aGUKKyAgICAvLyBmcmFnbWVudCB0byBmaXggYW5kIHN0b3JlcyBpdCBpbiB2YXJpb3VzIGZpZWxkcyBvZgorICAgIC8vIGZyYWdUb0ZpeC4gIFRoaXMgaW5jbHVkZXM6CisgICAgLy8KKyAgICAvLyBvIGNvbnRhaW5lckhlYWRlciAtLSBUaGUgY29udGFpbiBoZWFkZXIgaXRzZWxmLgorICAgIC8vIG8gc2VjdGlvbkhlYWRlcnMgIC0tIFRoZSBhcnJheSBvZiBzZWN0aW9uIGhlYWRlcnMgKGluIGEgbmV3bHkgYWxsb2NhdGVkIHBvaW50ZXIgYmxvY2spLgorICAgIC8vIG8gbG9hZGVyU2VjdGlvbiAgIC0tIFRoZSBlbnRpcmUgbG9hZGVyIHNlY3Rpb24gKGluIGEgbmV3bHkgYWxsb2NhdGVkIHBvaW50ZXIgYmxvY2spLgorICAgIC8vCisgICAgLy8gQWxzbyBzZXRzIGRpc3Bvc2VTZWN0aW9uUG9pbnRlcnMgdG8gaW5kaWNhdGUgd2hldGhlcgorICAgIC8vIHRoZSBsYXN0IHR3byBwb2ludGVycyBzaG91bGQgYmUgZGlzcG9zZWQgb2YuCisgICAgLy8KKyAgICAvLyBGaW5hbGx5LCBpdCBsZWF2ZXMgdGhlIGNvbnRhaW5lciBmaWxlIG9wZW4gZm9yIGxhdGVyCisgICAgLy8gZm9sa3Mgd2hvIHdhbnQgdG8gcmVhZCBkYXRhIGZyb20gaXQuCiB7Ci0JT1NTdGF0dXMgCWVycjsKLQlVSW50MTYgCQlzZWN0aW9uSW5kZXg7Ci0JQm9vbGVhbiAJZm91bmQ7CisgICAgT1NTdGF0dXMgICAgICAgICAgICBlcnI7CisgICAgVUludDE2ICAgICAgICAgICAgICBzZWN0aW9uSW5kZXg7CisgICAgQm9vbGVhbiAgICAgICAgICAgICBmb3VuZDsKIAotCU1vcmVBc3NlcnRRKGZyYWdUb0ZpeCAhPSBuaWwpOwotCU1vcmVBc3NlcnRRKGZyYWdUb0ZpeC0+bG9jYXRvci5maWxlU3BlYyAhPSBuaWwpOwotCU1vcmVBc3NlcnRRKGZyYWdUb0ZpeC0+Y29ubklEICE9IG5pbCk7Ci0JTW9yZUFzc2VydFEoZnJhZ1RvRml4LT5sb2FkZXJTZWN0aW9uID09IG5pbCk7Ci0JTW9yZUFzc2VydFEoZnJhZ1RvRml4LT5zZWN0aW9uSGVhZGVycyA9PSBuaWwpOwotCU1vcmVBc3NlcnRRKGZyYWdUb0ZpeC0+ZmlsZVJlZiA9PSAwKTsKLQkKLQlmcmFnVG9GaXgtPmRpc3Bvc2VTZWN0aW9uUG9pbnRlcnMgPSB0cnVlOwotCQotCS8vIE9wZW4gdXAgdGhlIGZpbGUsIHJlYWQgdGhlIGNvbnRhaW5lciBoZWFkLCB0aGVuIHJlYWQgaW4KLQkvLyBhbGwgdGhlIHNlY3Rpb24gaGVhZGVycywgdGhlbiBnbyBsb29raW5nIHRocm91Z2ggdGhlCi0JLy8gc2VjdGlvbiBoZWFkZXJzIGZvciB0aGUgbG9hZGVyIHNlY3Rpb24gKFBFRiBkZWZpbmVzCi0JLy8gdGhhdCB0aGVyZSBjYW4gYmUgb25seSBvbmUpLgotCQotCWVyciA9IEZTcE9wZW5ERihmcmFnVG9GaXgtPmxvY2F0b3IuZmlsZVNwZWMsIGZzUmRQZXJtLCAmZnJhZ1RvRml4LT5maWxlUmVmKTsKLQlpZiAoZXJyID09IG5vRXJyKSB7Ci0JCWVyciA9IEZTUmVhZEF0T2Zmc2V0KGZyYWdUb0ZpeC0+ZmlsZVJlZiwKLQkJCQkJCQkJZnJhZ1RvRml4LT5sb2NhdG9yLm9mZnNldCwKLQkJCQkJCQkJc2l6ZW9mKGZyYWdUb0ZpeC0+Y29udGFpbmVySGVhZGVyKSwKLQkJCQkJCQkJJmZyYWdUb0ZpeC0+Y29udGFpbmVySGVhZGVyKTsKLQkJaWYgKGVyciA9PSBub0VycikgewotCQkJaWYgKCAgIGZyYWdUb0ZpeC0+Y29udGFpbmVySGVhZGVyLnRhZzEgIT0ga1BFRlRhZzEKLQkJCQl8fCBmcmFnVG9GaXgtPmNvbnRhaW5lckhlYWRlci50YWcyICE9IGtQRUZUYWcyCi0JCQkJfHwgZnJhZ1RvRml4LT5jb250YWluZXJIZWFkZXIuYXJjaGl0ZWN0dXJlICE9IGtDb21waWxlZENGcmFnQXJjaAotCQkJCXx8IGZyYWdUb0ZpeC0+Y29udGFpbmVySGVhZGVyLmZvcm1hdFZlcnNpb24gIT0ga1BFRlZlcnNpb24pIHsKLQkJCQllcnIgPSBjZnJhZ0ZyYWdtZW50Rm9ybWF0RXJyOwotCQkJfQotCQl9Ci0JCWlmIChlcnIgPT0gbm9FcnIpIHsKLQkJCWZyYWdUb0ZpeC0+c2VjdGlvbkhlYWRlcnMgPSAoUEVGU2VjdGlvbkhlYWRlciAqKSBOZXdQdHIoZnJhZ1RvRml4LT5jb250YWluZXJIZWFkZXIuc2VjdGlvbkNvdW50ICogc2l6ZW9mKFBFRlNlY3Rpb25IZWFkZXIpKTsKLQkJCWVyciA9IE1lbUVycm9yKCk7Ci0JCX0KLQkJaWYgKGVyciA9PSBub0VycikgewotCQkJZXJyID0gRlNSZWFkQXRPZmZzZXQoZnJhZ1RvRml4LT5maWxlUmVmLAotCQkJCQkJCQkJZnJhZ1RvRml4LT5sb2NhdG9yLm9mZnNldCArIHNpemVvZihmcmFnVG9GaXgtPmNvbnRhaW5lckhlYWRlciksCi0JCQkJCQkJCQlmcmFnVG9GaXgtPmNvbnRhaW5lckhlYWRlci5zZWN0aW9uQ291bnQgKiBzaXplb2YoUEVGU2VjdGlvbkhlYWRlciksIAotCQkJCQkJCQkJZnJhZ1RvRml4LT5zZWN0aW9uSGVhZGVycyk7Ci0JCX0KLQkJaWYgKGVyciA9PSBub0VycikgewotCQkJc2VjdGlvbkluZGV4ID0gMDsKLQkJCWZvdW5kID0gZmFsc2U7Ci0JCQl3aGlsZSAoIHNlY3Rpb25JbmRleCA8IGZyYWdUb0ZpeC0+Y29udGFpbmVySGVhZGVyLnNlY3Rpb25Db3VudCAmJiAhIGZvdW5kICkgewotCQkJCWZvdW5kID0gKGZyYWdUb0ZpeC0+c2VjdGlvbkhlYWRlcnNbc2VjdGlvbkluZGV4XS5zZWN0aW9uS2luZCA9PSBrUEVGTG9hZGVyU2VjdGlvbik7Ci0JCQkJaWYgKCAhIGZvdW5kICkgewotCQkJCQlzZWN0aW9uSW5kZXggKz0gMTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGVyciA9PSBub0VyciAmJiAhIGZvdW5kKSB7Ci0JCQllcnIgPSBjZnJhZ05vU2VjdGlvbkVycjsKLQkJfQotCQkKLQkJLy8gTm93IHJlYWQgYWxsb2NhdGUgYSBwb2ludGVyIGJsb2NrIGFuZCByZWFkIHRoZSBsb2FkZXIgc2VjdGlvbiBpbnRvIGl0LgotCQkKLQkJaWYgKGVyciA9PSBub0VycikgewotCQkJZnJhZ1RvRml4LT5sb2FkZXJTZWN0aW9uID0gKFBFRkxvYWRlckluZm9IZWFkZXIgKikgTmV3UHRyKGZyYWdUb0ZpeC0+c2VjdGlvbkhlYWRlcnNbc2VjdGlvbkluZGV4XS5jb250YWluZXJMZW5ndGgpOwotCQkJZXJyID0gTWVtRXJyb3IoKTsKLQkJfQotCQlpZiAoZXJyID09IG5vRXJyKSB7Ci0JCQllcnIgPSBGU1JlYWRBdE9mZnNldChmcmFnVG9GaXgtPmZpbGVSZWYsIAotCQkJCQkJCQkJZnJhZ1RvRml4LT5sb2NhdG9yLm9mZnNldCArIGZyYWdUb0ZpeC0+c2VjdGlvbkhlYWRlcnNbc2VjdGlvbkluZGV4XS5jb250YWluZXJPZmZzZXQsCi0JCQkJCQkJCQlmcmFnVG9GaXgtPnNlY3Rpb25IZWFkZXJzW3NlY3Rpb25JbmRleF0uY29udGFpbmVyTGVuZ3RoLCAKLQkJCQkJCQkJCWZyYWdUb0ZpeC0+bG9hZGVyU2VjdGlvbik7Ci0JCX0JCQkJCi0JfQotCQotCS8vIE5vIGNsZWFuIHVwLiAgVGhlIGNsaWVudCBtdXN0IGluaXQgZnJhZ1RvRml4IHRvIHplcm9zIGFuZCB0aGVuCi0JLy8gY2xlYW4gdXAgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHdlIHJldHVybiBhbiBlcnJvci4KLQkJCi0JcmV0dXJuIGVycjsKKyAgICBNb3JlQXNzZXJ0UShmcmFnVG9GaXggIT0gbmlsKTsKKyAgICBNb3JlQXNzZXJ0UShmcmFnVG9GaXgtPmxvY2F0b3IuZmlsZVNwZWMgIT0gbmlsKTsKKyAgICBNb3JlQXNzZXJ0UShmcmFnVG9GaXgtPmNvbm5JRCAhPSBuaWwpOworICAgIE1vcmVBc3NlcnRRKGZyYWdUb0ZpeC0+bG9hZGVyU2VjdGlvbiA9PSBuaWwpOworICAgIE1vcmVBc3NlcnRRKGZyYWdUb0ZpeC0+c2VjdGlvbkhlYWRlcnMgPT0gbmlsKTsKKyAgICBNb3JlQXNzZXJ0UShmcmFnVG9GaXgtPmZpbGVSZWYgPT0gMCk7CisKKyAgICBmcmFnVG9GaXgtPmRpc3Bvc2VTZWN0aW9uUG9pbnRlcnMgPSB0cnVlOworCisgICAgLy8gT3BlbiB1cCB0aGUgZmlsZSwgcmVhZCB0aGUgY29udGFpbmVyIGhlYWQsIHRoZW4gcmVhZCBpbgorICAgIC8vIGFsbCB0aGUgc2VjdGlvbiBoZWFkZXJzLCB0aGVuIGdvIGxvb2tpbmcgdGhyb3VnaCB0aGUKKyAgICAvLyBzZWN0aW9uIGhlYWRlcnMgZm9yIHRoZSBsb2FkZXIgc2VjdGlvbiAoUEVGIGRlZmluZXMKKyAgICAvLyB0aGF0IHRoZXJlIGNhbiBiZSBvbmx5IG9uZSkuCisKKyAgICBlcnIgPSBGU3BPcGVuREYoZnJhZ1RvRml4LT5sb2NhdG9yLmZpbGVTcGVjLCBmc1JkUGVybSwgJmZyYWdUb0ZpeC0+ZmlsZVJlZik7CisgICAgaWYgKGVyciA9PSBub0VycikgeworICAgICAgICBlcnIgPSBGU1JlYWRBdE9mZnNldChmcmFnVG9GaXgtPmZpbGVSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYWdUb0ZpeC0+bG9jYXRvci5vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihmcmFnVG9GaXgtPmNvbnRhaW5lckhlYWRlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmcmFnVG9GaXgtPmNvbnRhaW5lckhlYWRlcik7CisgICAgICAgIGlmIChlcnIgPT0gbm9FcnIpIHsKKyAgICAgICAgICAgIGlmICggICBmcmFnVG9GaXgtPmNvbnRhaW5lckhlYWRlci50YWcxICE9IGtQRUZUYWcxCisgICAgICAgICAgICAgICAgfHwgZnJhZ1RvRml4LT5jb250YWluZXJIZWFkZXIudGFnMiAhPSBrUEVGVGFnMgorICAgICAgICAgICAgICAgIHx8IGZyYWdUb0ZpeC0+Y29udGFpbmVySGVhZGVyLmFyY2hpdGVjdHVyZSAhPSBrQ29tcGlsZWRDRnJhZ0FyY2gKKyAgICAgICAgICAgICAgICB8fCBmcmFnVG9GaXgtPmNvbnRhaW5lckhlYWRlci5mb3JtYXRWZXJzaW9uICE9IGtQRUZWZXJzaW9uKSB7CisgICAgICAgICAgICAgICAgZXJyID0gY2ZyYWdGcmFnbWVudEZvcm1hdEVycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoZXJyID09IG5vRXJyKSB7CisgICAgICAgICAgICBmcmFnVG9GaXgtPnNlY3Rpb25IZWFkZXJzID0gKFBFRlNlY3Rpb25IZWFkZXIgKikgTmV3UHRyKGZyYWdUb0ZpeC0+Y29udGFpbmVySGVhZGVyLnNlY3Rpb25Db3VudCAqIHNpemVvZihQRUZTZWN0aW9uSGVhZGVyKSk7CisgICAgICAgICAgICBlcnIgPSBNZW1FcnJvcigpOworICAgICAgICB9CisgICAgICAgIGlmIChlcnIgPT0gbm9FcnIpIHsKKyAgICAgICAgICAgIGVyciA9IEZTUmVhZEF0T2Zmc2V0KGZyYWdUb0ZpeC0+ZmlsZVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYWdUb0ZpeC0+bG9jYXRvci5vZmZzZXQgKyBzaXplb2YoZnJhZ1RvRml4LT5jb250YWluZXJIZWFkZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhZ1RvRml4LT5jb250YWluZXJIZWFkZXIuc2VjdGlvbkNvdW50ICogc2l6ZW9mKFBFRlNlY3Rpb25IZWFkZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhZ1RvRml4LT5zZWN0aW9uSGVhZGVycyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVyciA9PSBub0VycikgeworICAgICAgICAgICAgc2VjdGlvbkluZGV4ID0gMDsKKyAgICAgICAgICAgIGZvdW5kID0gZmFsc2U7CisgICAgICAgICAgICB3aGlsZSAoIHNlY3Rpb25JbmRleCA8IGZyYWdUb0ZpeC0+Y29udGFpbmVySGVhZGVyLnNlY3Rpb25Db3VudCAmJiAhIGZvdW5kICkgeworICAgICAgICAgICAgICAgIGZvdW5kID0gKGZyYWdUb0ZpeC0+c2VjdGlvbkhlYWRlcnNbc2VjdGlvbkluZGV4XS5zZWN0aW9uS2luZCA9PSBrUEVGTG9hZGVyU2VjdGlvbik7CisgICAgICAgICAgICAgICAgaWYgKCAhIGZvdW5kICkgeworICAgICAgICAgICAgICAgICAgICBzZWN0aW9uSW5kZXggKz0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVyciA9PSBub0VyciAmJiAhIGZvdW5kKSB7CisgICAgICAgICAgICBlcnIgPSBjZnJhZ05vU2VjdGlvbkVycjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIE5vdyByZWFkIGFsbG9jYXRlIGEgcG9pbnRlciBibG9jayBhbmQgcmVhZCB0aGUgbG9hZGVyIHNlY3Rpb24gaW50byBpdC4KKworICAgICAgICBpZiAoZXJyID09IG5vRXJyKSB7CisgICAgICAgICAgICBmcmFnVG9GaXgtPmxvYWRlclNlY3Rpb24gPSAoUEVGTG9hZGVySW5mb0hlYWRlciAqKSBOZXdQdHIoZnJhZ1RvRml4LT5zZWN0aW9uSGVhZGVyc1tzZWN0aW9uSW5kZXhdLmNvbnRhaW5lckxlbmd0aCk7CisgICAgICAgICAgICBlcnIgPSBNZW1FcnJvcigpOworICAgICAgICB9CisgICAgICAgIGlmIChlcnIgPT0gbm9FcnIpIHsKKyAgICAgICAgICAgIGVyciA9IEZTUmVhZEF0T2Zmc2V0KGZyYWdUb0ZpeC0+ZmlsZVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYWdUb0ZpeC0+bG9jYXRvci5vZmZzZXQgKyBmcmFnVG9GaXgtPnNlY3Rpb25IZWFkZXJzW3NlY3Rpb25JbmRleF0uY29udGFpbmVyT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhZ1RvRml4LT5zZWN0aW9uSGVhZGVyc1tzZWN0aW9uSW5kZXhdLmNvbnRhaW5lckxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYWdUb0ZpeC0+bG9hZGVyU2VjdGlvbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBObyBjbGVhbiB1cC4gIFRoZSBjbGllbnQgbXVzdCBpbml0IGZyYWdUb0ZpeCB0byB6ZXJvcyBhbmQgdGhlbgorICAgIC8vIGNsZWFuIHVwIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB3ZSByZXR1cm4gYW4gZXJyb3IuCisKKyAgICByZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgVUludDMyIERlY29kZVZDb3VudFZhbHVlKGNvbnN0IFVJbnQ4ICpzdGFydCwgVUludDMyICpvdXRDb3VudCkKLQkvLyBHaXZlbiBhIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIGEgdmFyaWFibGUgbGVuZ3RoIFBFRiB2YWx1ZSwgCi0JLy8gd29yayBvdXQgdGhlIHZhbHVlIChpbiAqb3V0Q291bnQpLiAgUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIAotCS8vIGNvbnN1bWVkIGJ5IHRoZSB2YWx1ZS4KKyAgICAvLyBHaXZlbiBhIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIGEgdmFyaWFibGUgbGVuZ3RoIFBFRiB2YWx1ZSwKKyAgICAvLyB3b3JrIG91dCB0aGUgdmFsdWUgKGluICpvdXRDb3VudCkuICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMKKyAgICAvLyBjb25zdW1lZCBieSB0aGUgdmFsdWUuCiB7Ci0JVUludDggKgkJCWJ5dGVQdHI7Ci0JVUludDgJCQlieXRlOwotCVVJbnQzMgkJCWNvdW50OwotCQotCWJ5dGVQdHIgPSAoVUludDggKilzdGFydDsKLQkKLQkvLyBDb2RlIHRha2VuIGZyb20gIlBFRkJpbmFyeUZvcm1hdC5oIi4KLQljb3VudCA9IDA7Ci0JZG8gewotCQlieXRlID0gKmJ5dGVQdHIrKzsKLQkJY291bnQgPSAoY291bnQgPDwga1BFRlBrRGF0YVZDb3VudFNoaWZ0KSB8IChieXRlICYga1BFRlBrRGF0YVZDb3VudE1hc2spOwotCX0gd2hpbGUgKChieXRlICYga1BFRlBrRGF0YVZDb3VudEVuZE1hc2spICE9IDApOwotCQotCSpvdXRDb3VudCA9IGNvdW50OwotCXJldHVybiBieXRlUHRyIC0gc3RhcnQ7CisgICAgVUludDggKiAgICAgICAgICAgICAgICAgICAgIGJ5dGVQdHI7CisgICAgVUludDggICAgICAgICAgICAgICAgICAgICAgIGJ5dGU7CisgICAgVUludDMyICAgICAgICAgICAgICAgICAgICAgIGNvdW50OworCisgICAgYnl0ZVB0ciA9IChVSW50OCAqKXN0YXJ0OworCisgICAgLy8gQ29kZSB0YWtlbiBmcm9tICJQRUZCaW5hcnlGb3JtYXQuaCIuCisgICAgY291bnQgPSAwOworICAgIGRvIHsKKyAgICAgICAgYnl0ZSA9ICpieXRlUHRyKys7CisgICAgICAgIGNvdW50ID0gKGNvdW50IDw8IGtQRUZQa0RhdGFWQ291bnRTaGlmdCkgfCAoYnl0ZSAmIGtQRUZQa0RhdGFWQ291bnRNYXNrKTsKKyAgICB9IHdoaWxlICgoYnl0ZSAmIGtQRUZQa0RhdGFWQ291bnRFbmRNYXNrKSAhPSAwKTsKKworICAgICpvdXRDb3VudCA9IGNvdW50OworICAgIHJldHVybiBieXRlUHRyIC0gc3RhcnQ7CiB9CiAKIHN0YXRpYyBVSW50MzIgRGVjb2RlSW5zdHJDb3VudFZhbHVlKGNvbnN0IFVJbnQ4ICppbk9wU3RhcnQsIFVJbnQzMiAqb3V0Q291bnQpCi0JLy8gR2l2ZW4gYSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiBhbiBvcGNvZGUgKGluT3BTdGFydCksIHdvcmsgb3V0IHRoZSAKLQkvLyBjb3VudCBhcmd1bWVudCBmb3IgdGhhdCBvcGNvZGUgKCpvdXRDb3VudCkuICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgCi0JLy8gYnl0ZXMgY29uc3VtZWQgYnkgdGhlIG9wY29kZSBhbmQgY291bnQgY29tYmluYXRpb24uCisgICAgLy8gR2l2ZW4gYSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiBhbiBvcGNvZGUgKGluT3BTdGFydCksIHdvcmsgb3V0IHRoZQorICAgIC8vIGNvdW50IGFyZ3VtZW50IGZvciB0aGF0IG9wY29kZSAoKm91dENvdW50KS4gIFJldHVybnMgdGhlIG51bWJlciBvZgorICAgIC8vIGJ5dGVzIGNvbnN1bWVkIGJ5IHRoZSBvcGNvZGUgYW5kIGNvdW50IGNvbWJpbmF0aW9uLgogewotCU1vcmVBc3NlcnRRKGluT3BTdGFydCAhPSBuaWwpOwotCU1vcmVBc3NlcnRRKG91dENvdW50ICAhPSBuaWwpOwotCQotCWlmIChQRUZQa0RhdGFDb3VudDUoKmluT3BTdGFydCkgIT0gMCkKLQl7Ci0JCS8vIFNpbXBsZSBjYXNlLCBjb3VudCBlbmNvZGVkIGluIG9wY29kZS4KLQkJKm91dENvdW50ID0gUEVGUGtEYXRhQ291bnQ1KCppbk9wU3RhcnQpOwotCQlyZXR1cm4gMTsKLQl9Ci0JZWxzZQotCXsKLQkJLy8gVmFyaWFibGUtbGVuZ3RoIGNhc2UuCi0JCXJldHVybiAxICsgRGVjb2RlVkNvdW50VmFsdWUoaW5PcFN0YXJ0ICsgMSwgb3V0Q291bnQpOwotCX0KKyAgICBNb3JlQXNzZXJ0UShpbk9wU3RhcnQgIT0gbmlsKTsKKyAgICBNb3JlQXNzZXJ0UShvdXRDb3VudCAgIT0gbmlsKTsKKworICAgIGlmIChQRUZQa0RhdGFDb3VudDUoKmluT3BTdGFydCkgIT0gMCkKKyAgICB7CisgICAgICAgIC8vIFNpbXBsZSBjYXNlLCBjb3VudCBlbmNvZGVkIGluIG9wY29kZS4KKyAgICAgICAgKm91dENvdW50ID0gUEVGUGtEYXRhQ291bnQ1KCppbk9wU3RhcnQpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLy8gVmFyaWFibGUtbGVuZ3RoIGNhc2UuCisgICAgICAgIHJldHVybiAxICsgRGVjb2RlVkNvdW50VmFsdWUoaW5PcFN0YXJ0ICsgMSwgb3V0Q291bnQpOworICAgIH0KIH0KIAogc3RhdGljIE9TU3RhdHVzIFVucGFja1BFRkRhdGFTZWN0aW9uKGNvbnN0IFVJbnQ4ICogY29uc3QgcGFja2VkRGF0YSwgICBVSW50MzIgcGFja2VkU2l6ZSwKLQkJCQkJCQkJICAgICAgICAgICBVSW50OCAqIGNvbnN0IHVucGFja2VkRGF0YSwgVUludDMyIHVucGFja2VkU2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJbnQ4ICogY29uc3QgdW5wYWNrZWREYXRhLCBVSW50MzIgdW5wYWNrZWRTaXplKQogewotCU9TRXJyCQkJZXJyOwotCVVJbnQzMgkJCW9mZnNldDsKLQlVSW50OAkJCW9wQ29kZTsKLQlVSW50OCAqCQkJdW5wYWNrQ3Vyc29yOwotCQotCU1vcmVBc3NlcnRRKHBhY2tlZERhdGEgIT0gbmlsKTsKLQlNb3JlQXNzZXJ0USh1bnBhY2tlZERhdGEgIT0gbmlsKTsKLQlNb3JlQXNzZXJ0USh1bnBhY2tlZFNpemUgPj0gcGFja2VkU2l6ZSk7CisgICAgT1NFcnIgICAgICAgICAgICAgICAgICAgICAgIGVycjsKKyAgICBVSW50MzIgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OworICAgIFVJbnQ4ICAgICAgICAgICAgICAgICAgICAgICBvcENvZGU7CisgICAgVUludDggKiAgICAgICAgICAgICAgICAgICAgIHVucGFja0N1cnNvcjsKIAotCS8vIFRoZSBmb2xsb3dpbmcgYXNzZXJ0cyBhc3N1bWUgdGhhdCB0aGUgY2xpZW50IGFsbG9jYXRlZCB0aGUgbWVtb3J5IHdpdGggTmV3UHRyLCAKLQkvLyB3aGljaCBtYXkgbm90IGFsd2F5cyBiZSB0cnVlLiAgSG93ZXZlciwgdGhlIGFzc2VydHMnIHZhbHVlIGluIHByZXZlbnRpbmcgYWNjaWRlbnRhbCAKLQkvLyBtZW1vcnkgYmxvY2sgb3ZlcnJ1bnMgb3V0d2VpZ2hzIHRoZSBwb3NzaWJsZSBtYWludGVuYW5jZSBlZmZvcnQuCi0JCi0JTW9yZUFzc2VydFEoIHBhY2tlZFNpemUgICA9PSBHZXRQdHJTaXplKCAoUHRyKSBwYWNrZWREYXRhICApICk7Ci0JTW9yZUFzc2VydFEoIHVucGFja2VkU2l6ZSA9PSBHZXRQdHJTaXplKCAoUHRyKSB1bnBhY2tlZERhdGEpICk7Ci0JCi0JZXJyICAgICAgICAgID0gbm9FcnI7Ci0Jb2Zmc2V0ICAgICAgID0gMDsKLQl1bnBhY2tDdXJzb3IgPSB1bnBhY2tlZERhdGE7Ci0Jd2hpbGUgKG9mZnNldCA8IHBhY2tlZFNpemUpIHsKLQkJTW9yZUFzc2VydFEodW5wYWNrQ3Vyc29yIDwgJnVucGFja2VkRGF0YVt1bnBhY2tlZFNpemVdKTsKLQkJCi0JCW9wQ29kZSA9IHBhY2tlZERhdGFbb2Zmc2V0XTsKLQkJCi0JCXN3aXRjaCAoUEVGUGtEYXRhT3Bjb2RlKG9wQ29kZSkpIHsKLQkJCWNhc2Uga1BFRlBrRGF0YVplcm86Ci0JCQkJewotCQkJCQlVSW50MzIJY291bnQ7Ci0JCQkJCQotCQkJCQlvZmZzZXQgKz0gRGVjb2RlSW5zdHJDb3VudFZhbHVlKCZwYWNrZWREYXRhW29mZnNldF0sICZjb3VudCk7Ci0JCQkJCQotCQkJCQlNb3JlQmxvY2taZXJvKHVucGFja0N1cnNvciwgY291bnQpOwotCQkJCQl1bnBhY2tDdXJzb3IgKz0gY291bnQ7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJCi0JCQljYXNlIGtQRUZQa0RhdGFCbG9jazoKLQkJCQl7Ci0JCQkJCVVJbnQzMglibG9ja1NpemU7Ci0JCQkJCQotCQkJCQlvZmZzZXQgKz0gRGVjb2RlSW5zdHJDb3VudFZhbHVlKCZwYWNrZWREYXRhW29mZnNldF0sICZibG9ja1NpemUpOwotCQkJCQkKLQkJCQkJQmxvY2tNb3ZlRGF0YSgmcGFja2VkRGF0YVtvZmZzZXRdLCB1bnBhY2tDdXJzb3IsIGJsb2NrU2l6ZSk7Ci0JCQkJCXVucGFja0N1cnNvciArPSBibG9ja1NpemU7Ci0JCQkJCW9mZnNldCArPSBibG9ja1NpemU7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJCi0JCQljYXNlIGtQRUZQa0RhdGFSZXBlYXQ6Ci0JCQkJewotCQkJCQlVSW50MzIJYmxvY2tTaXplOwotCQkJCQlVSW50MzIJcmVwZWF0Q291bnQ7Ci0JCQkJCVVJbnQzMiAgbG9vcENvdW50ZXI7Ci0JCQkJCQotCQkJCQlvZmZzZXQgKz0gRGVjb2RlSW5zdHJDb3VudFZhbHVlKCZwYWNrZWREYXRhW29mZnNldF0sICZibG9ja1NpemUpOwotCQkJCQlvZmZzZXQgKz0gRGVjb2RlVkNvdW50VmFsdWUoJnBhY2tlZERhdGFbb2Zmc2V0XSwgJnJlcGVhdENvdW50KTsKLQkJCQkJcmVwZWF0Q291bnQgKz0gMTsJLy8gc3RvcmVkIHZhbHVlIGlzIChyZXBlYXRDb3VudCAtIDEpCi0JCQkJCQotCQkJCQlmb3IgKGxvb3BDb3VudGVyID0gMDsgbG9vcENvdW50ZXIgPCByZXBlYXRDb3VudDsgbG9vcENvdW50ZXIrKykgewotCQkJCQkJQmxvY2tNb3ZlRGF0YSgmcGFja2VkRGF0YVtvZmZzZXRdLCB1bnBhY2tDdXJzb3IsIGJsb2NrU2l6ZSk7Ci0JCQkJCQl1bnBhY2tDdXJzb3IgKz0gYmxvY2tTaXplOwotCQkJCQl9Ci0JCQkJCW9mZnNldCArPSBibG9ja1NpemU7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJCi0JCQljYXNlIGtQRUZQa0RhdGFSZXBlYXRCbG9jazoKLQkJCQl7Ci0JCQkJCVVJbnQzMgljb21tb25TaXplOwotCQkJCQlVSW50MzIJY3VzdG9tU2l6ZTsKLQkJCQkJVUludDMyCXJlcGVhdENvdW50OwotCQkJCQljb25zdCBVSW50OCAqY29tbW9uRGF0YTsKLQkJCQkJY29uc3QgVUludDggKmN1c3RvbURhdGE7Ci0JCQkJCVVJbnQzMiBsb29wQ291bnRlcjsKLQkJCQkJCi0JCQkJCW9mZnNldCArPSBEZWNvZGVJbnN0ckNvdW50VmFsdWUoJnBhY2tlZERhdGFbb2Zmc2V0XSwgJmNvbW1vblNpemUpOwotCQkJCQlvZmZzZXQgKz0gRGVjb2RlVkNvdW50VmFsdWUoJnBhY2tlZERhdGFbb2Zmc2V0XSwgJmN1c3RvbVNpemUpOwotCQkJCQlvZmZzZXQgKz0gRGVjb2RlVkNvdW50VmFsdWUoJnBhY2tlZERhdGFbb2Zmc2V0XSwgJnJlcGVhdENvdW50KTsKLQkJCQkJCi0JCQkJCWNvbW1vbkRhdGEgPSAmcGFja2VkRGF0YVtvZmZzZXRdOwotCQkJCQljdXN0b21EYXRhID0gJnBhY2tlZERhdGFbb2Zmc2V0ICsgY29tbW9uU2l6ZV07Ci0JCQkJCQotCQkJCQlmb3IgKGxvb3BDb3VudGVyID0gMDsgbG9vcENvdW50ZXIgPCByZXBlYXRDb3VudDsgbG9vcENvdW50ZXIrKykgewotCQkJCQkJQmxvY2tNb3ZlRGF0YShjb21tb25EYXRhLCB1bnBhY2tDdXJzb3IsIGNvbW1vblNpemUpOwotCQkJCQkJdW5wYWNrQ3Vyc29yICs9IGNvbW1vblNpemU7Ci0JCQkJCQlCbG9ja01vdmVEYXRhKGN1c3RvbURhdGEsIHVucGFja0N1cnNvciwgY3VzdG9tU2l6ZSk7Ci0JCQkJCQl1bnBhY2tDdXJzb3IgKz0gY3VzdG9tU2l6ZTsKLQkJCQkJCWN1c3RvbURhdGEgKz0gY3VzdG9tU2l6ZTsKLQkJCQkJfQotCQkJCQlCbG9ja01vdmVEYXRhKGNvbW1vbkRhdGEsIHVucGFja0N1cnNvciwgY29tbW9uU2l6ZSk7Ci0JCQkJCXVucGFja0N1cnNvciArPSBjb21tb25TaXplOwotCQkJCQlvZmZzZXQgKz0gKHJlcGVhdENvdW50ICogKGNvbW1vblNpemUgKyBjdXN0b21TaXplKSkgKyBjb21tb25TaXplOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCQotCQkJY2FzZSBrUEVGUGtEYXRhUmVwZWF0WmVybzoKLQkJCQl7Ci0JCQkJCVVJbnQzMgljb21tb25TaXplOwotCQkJCQlVSW50MzIJY3VzdG9tU2l6ZTsKLQkJCQkJVUludDMyCXJlcGVhdENvdW50OwotCQkJCQljb25zdCBVSW50OCAqY3VzdG9tRGF0YTsKLQkJCQkJVUludDMyIGxvb3BDb3VudGVyOwotCQkJCQkKLQkJCQkJb2Zmc2V0ICs9IERlY29kZUluc3RyQ291bnRWYWx1ZSgmcGFja2VkRGF0YVtvZmZzZXRdLCAmY29tbW9uU2l6ZSk7Ci0JCQkJCW9mZnNldCArPSBEZWNvZGVWQ291bnRWYWx1ZSgmcGFja2VkRGF0YVtvZmZzZXRdLCAmY3VzdG9tU2l6ZSk7Ci0JCQkJCW9mZnNldCArPSBEZWNvZGVWQ291bnRWYWx1ZSgmcGFja2VkRGF0YVtvZmZzZXRdLCAmcmVwZWF0Q291bnQpOwotCQkJCQkKLQkJCQkJY3VzdG9tRGF0YSA9ICZwYWNrZWREYXRhW29mZnNldF07Ci0JCQkJCQotCQkJCQlmb3IgKGxvb3BDb3VudGVyID0gMDsgbG9vcENvdW50ZXIgPCByZXBlYXRDb3VudDsgbG9vcENvdW50ZXIrKykgewotCQkJCQkJTW9yZUJsb2NrWmVybyh1bnBhY2tDdXJzb3IsIGNvbW1vblNpemUpOwotCQkJCQkJdW5wYWNrQ3Vyc29yICs9IGNvbW1vblNpemU7Ci0JCQkJCQlCbG9ja01vdmVEYXRhKGN1c3RvbURhdGEsIHVucGFja0N1cnNvciwgY3VzdG9tU2l6ZSk7Ci0JCQkJCQl1bnBhY2tDdXJzb3IgKz0gY3VzdG9tU2l6ZTsKLQkJCQkJCWN1c3RvbURhdGEgKz0gY3VzdG9tU2l6ZTsKLQkJCQkJfQotCQkJCQlNb3JlQmxvY2taZXJvKHVucGFja0N1cnNvciwgY29tbW9uU2l6ZSk7Ci0JCQkJCXVucGFja0N1cnNvciArPSBjb21tb25TaXplOwotCQkJCQlvZmZzZXQgKz0gcmVwZWF0Q291bnQgKiBjdXN0b21TaXplOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCQotCQkJZGVmYXVsdDoKLQkJCQkjaWYgTU9SRV9ERUJVRwotCQkJCQlEZWJ1Z1N0cigiXHBVbnBhY2tQRUZEYXRhU2VjdGlvbjogVW5leHBlY3RlZCBkYXRhIG9wY29kZSIpOwotCQkJCSNlbmRpZgotCQkJCWVyciA9IGNmcmFnRnJhZ21lbnRDb3JydXB0RXJyOwotCQkJCWdvdG8gbGVhdmVOb3c7Ci0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JCisgICAgTW9yZUFzc2VydFEocGFja2VkRGF0YSAhPSBuaWwpOworICAgIE1vcmVBc3NlcnRRKHVucGFja2VkRGF0YSAhPSBuaWwpOworICAgIE1vcmVBc3NlcnRRKHVucGFja2VkU2l6ZSA+PSBwYWNrZWRTaXplKTsKKworICAgIC8vIFRoZSBmb2xsb3dpbmcgYXNzZXJ0cyBhc3N1bWUgdGhhdCB0aGUgY2xpZW50IGFsbG9jYXRlZCB0aGUgbWVtb3J5IHdpdGggTmV3UHRyLAorICAgIC8vIHdoaWNoIG1heSBub3QgYWx3YXlzIGJlIHRydWUuICBIb3dldmVyLCB0aGUgYXNzZXJ0cycgdmFsdWUgaW4gcHJldmVudGluZyBhY2NpZGVudGFsCisgICAgLy8gbWVtb3J5IGJsb2NrIG92ZXJydW5zIG91dHdlaWdocyB0aGUgcG9zc2libGUgbWFpbnRlbmFuY2UgZWZmb3J0LgorCisgICAgTW9yZUFzc2VydFEoIHBhY2tlZFNpemUgICA9PSBHZXRQdHJTaXplKCAoUHRyKSBwYWNrZWREYXRhICApICk7CisgICAgTW9yZUFzc2VydFEoIHVucGFja2VkU2l6ZSA9PSBHZXRQdHJTaXplKCAoUHRyKSB1bnBhY2tlZERhdGEpICk7CisKKyAgICBlcnIgICAgICAgICAgPSBub0VycjsKKyAgICBvZmZzZXQgICAgICAgPSAwOworICAgIHVucGFja0N1cnNvciA9IHVucGFja2VkRGF0YTsKKyAgICB3aGlsZSAob2Zmc2V0IDwgcGFja2VkU2l6ZSkgeworICAgICAgICBNb3JlQXNzZXJ0USh1bnBhY2tDdXJzb3IgPCAmdW5wYWNrZWREYXRhW3VucGFja2VkU2l6ZV0pOworCisgICAgICAgIG9wQ29kZSA9IHBhY2tlZERhdGFbb2Zmc2V0XTsKKworICAgICAgICBzd2l0Y2ggKFBFRlBrRGF0YU9wY29kZShvcENvZGUpKSB7CisgICAgICAgICAgICBjYXNlIGtQRUZQa0RhdGFaZXJvOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVUludDMyICAgICAgICAgICAgICAgICAgICAgIGNvdW50OworCisgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSBEZWNvZGVJbnN0ckNvdW50VmFsdWUoJnBhY2tlZERhdGFbb2Zmc2V0XSwgJmNvdW50KTsKKworICAgICAgICAgICAgICAgICAgICBNb3JlQmxvY2taZXJvKHVucGFja0N1cnNvciwgY291bnQpOworICAgICAgICAgICAgICAgICAgICB1bnBhY2tDdXJzb3IgKz0gY291bnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIGtQRUZQa0RhdGFCbG9jazoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFVJbnQzMiAgICAgICAgICAgICAgICAgICAgICBibG9ja1NpemU7CisKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IERlY29kZUluc3RyQ291bnRWYWx1ZSgmcGFja2VkRGF0YVtvZmZzZXRdLCAmYmxvY2tTaXplKTsKKworICAgICAgICAgICAgICAgICAgICBCbG9ja01vdmVEYXRhKCZwYWNrZWREYXRhW29mZnNldF0sIHVucGFja0N1cnNvciwgYmxvY2tTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgdW5wYWNrQ3Vyc29yICs9IGJsb2NrU2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGJsb2NrU2l6ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2Uga1BFRlBrRGF0YVJlcGVhdDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFVJbnQzMiAgICAgICAgICAgICAgICAgICAgICBibG9ja1NpemU7CisgICAgICAgICAgICAgICAgICAgIFVJbnQzMiAgICAgICAgICAgICAgICAgICAgICByZXBlYXRDb3VudDsKKyAgICAgICAgICAgICAgICAgICAgVUludDMyICBsb29wQ291bnRlcjsKKworICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gRGVjb2RlSW5zdHJDb3VudFZhbHVlKCZwYWNrZWREYXRhW29mZnNldF0sICZibG9ja1NpemUpOworICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gRGVjb2RlVkNvdW50VmFsdWUoJnBhY2tlZERhdGFbb2Zmc2V0XSwgJnJlcGVhdENvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgcmVwZWF0Q291bnQgKz0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdG9yZWQgdmFsdWUgaXMgKHJlcGVhdENvdW50IC0gMSkKKworICAgICAgICAgICAgICAgICAgICBmb3IgKGxvb3BDb3VudGVyID0gMDsgbG9vcENvdW50ZXIgPCByZXBlYXRDb3VudDsgbG9vcENvdW50ZXIrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgQmxvY2tNb3ZlRGF0YSgmcGFja2VkRGF0YVtvZmZzZXRdLCB1bnBhY2tDdXJzb3IsIGJsb2NrU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB1bnBhY2tDdXJzb3IgKz0gYmxvY2tTaXplOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSBibG9ja1NpemU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIGtQRUZQa0RhdGFSZXBlYXRCbG9jazoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFVJbnQzMiAgICAgICAgICAgICAgICAgICAgICBjb21tb25TaXplOworICAgICAgICAgICAgICAgICAgICBVSW50MzIgICAgICAgICAgICAgICAgICAgICAgY3VzdG9tU2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgVUludDMyICAgICAgICAgICAgICAgICAgICAgIHJlcGVhdENvdW50OworICAgICAgICAgICAgICAgICAgICBjb25zdCBVSW50OCAqY29tbW9uRGF0YTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgVUludDggKmN1c3RvbURhdGE7CisgICAgICAgICAgICAgICAgICAgIFVJbnQzMiBsb29wQ291bnRlcjsKKworICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gRGVjb2RlSW5zdHJDb3VudFZhbHVlKCZwYWNrZWREYXRhW29mZnNldF0sICZjb21tb25TaXplKTsKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IERlY29kZVZDb3VudFZhbHVlKCZwYWNrZWREYXRhW29mZnNldF0sICZjdXN0b21TaXplKTsKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IERlY29kZVZDb3VudFZhbHVlKCZwYWNrZWREYXRhW29mZnNldF0sICZyZXBlYXRDb3VudCk7CisKKyAgICAgICAgICAgICAgICAgICAgY29tbW9uRGF0YSA9ICZwYWNrZWREYXRhW29mZnNldF07CisgICAgICAgICAgICAgICAgICAgIGN1c3RvbURhdGEgPSAmcGFja2VkRGF0YVtvZmZzZXQgKyBjb21tb25TaXplXTsKKworICAgICAgICAgICAgICAgICAgICBmb3IgKGxvb3BDb3VudGVyID0gMDsgbG9vcENvdW50ZXIgPCByZXBlYXRDb3VudDsgbG9vcENvdW50ZXIrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgQmxvY2tNb3ZlRGF0YShjb21tb25EYXRhLCB1bnBhY2tDdXJzb3IsIGNvbW1vblNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgdW5wYWNrQ3Vyc29yICs9IGNvbW1vblNpemU7CisgICAgICAgICAgICAgICAgICAgICAgICBCbG9ja01vdmVEYXRhKGN1c3RvbURhdGEsIHVucGFja0N1cnNvciwgY3VzdG9tU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB1bnBhY2tDdXJzb3IgKz0gY3VzdG9tU2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbURhdGEgKz0gY3VzdG9tU2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBCbG9ja01vdmVEYXRhKGNvbW1vbkRhdGEsIHVucGFja0N1cnNvciwgY29tbW9uU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIHVucGFja0N1cnNvciArPSBjb21tb25TaXplOworICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gKHJlcGVhdENvdW50ICogKGNvbW1vblNpemUgKyBjdXN0b21TaXplKSkgKyBjb21tb25TaXplOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBrUEVGUGtEYXRhUmVwZWF0WmVybzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFVJbnQzMiAgICAgICAgICAgICAgICAgICAgICBjb21tb25TaXplOworICAgICAgICAgICAgICAgICAgICBVSW50MzIgICAgICAgICAgICAgICAgICAgICAgY3VzdG9tU2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgVUludDMyICAgICAgICAgICAgICAgICAgICAgIHJlcGVhdENvdW50OworICAgICAgICAgICAgICAgICAgICBjb25zdCBVSW50OCAqY3VzdG9tRGF0YTsKKyAgICAgICAgICAgICAgICAgICAgVUludDMyIGxvb3BDb3VudGVyOworCisgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSBEZWNvZGVJbnN0ckNvdW50VmFsdWUoJnBhY2tlZERhdGFbb2Zmc2V0XSwgJmNvbW1vblNpemUpOworICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gRGVjb2RlVkNvdW50VmFsdWUoJnBhY2tlZERhdGFbb2Zmc2V0XSwgJmN1c3RvbVNpemUpOworICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gRGVjb2RlVkNvdW50VmFsdWUoJnBhY2tlZERhdGFbb2Zmc2V0XSwgJnJlcGVhdENvdW50KTsKKworICAgICAgICAgICAgICAgICAgICBjdXN0b21EYXRhID0gJnBhY2tlZERhdGFbb2Zmc2V0XTsKKworICAgICAgICAgICAgICAgICAgICBmb3IgKGxvb3BDb3VudGVyID0gMDsgbG9vcENvdW50ZXIgPCByZXBlYXRDb3VudDsgbG9vcENvdW50ZXIrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgTW9yZUJsb2NrWmVybyh1bnBhY2tDdXJzb3IsIGNvbW1vblNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgdW5wYWNrQ3Vyc29yICs9IGNvbW1vblNpemU7CisgICAgICAgICAgICAgICAgICAgICAgICBCbG9ja01vdmVEYXRhKGN1c3RvbURhdGEsIHVucGFja0N1cnNvciwgY3VzdG9tU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB1bnBhY2tDdXJzb3IgKz0gY3VzdG9tU2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbURhdGEgKz0gY3VzdG9tU2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBNb3JlQmxvY2taZXJvKHVucGFja0N1cnNvciwgY29tbW9uU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIHVucGFja0N1cnNvciArPSBjb21tb25TaXplOworICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gcmVwZWF0Q291bnQgKiBjdXN0b21TaXplOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAjaWYgTU9SRV9ERUJVRworICAgICAgICAgICAgICAgICAgICBEZWJ1Z1N0cigiXHBVbnBhY2tQRUZEYXRhU2VjdGlvbjogVW5leHBlY3RlZCBkYXRhIG9wY29kZSIpOworICAgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAgIGVyciA9IGNmcmFnRnJhZ21lbnRDb3JydXB0RXJyOworICAgICAgICAgICAgICAgIGdvdG8gbGVhdmVOb3c7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKIGxlYXZlTm93OgotCXJldHVybiBlcnI7CisgICAgcmV0dXJuIGVycjsKIH0KIAotLyoJU2V0dXBTZWN0aW9uQmFzZUFkZHJlc3NlcyBSYXRpb25hbGUKLQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQotCU9LLCBoZXJlJ3Mgd2hlcmUgdGhpbmdzIGdldCB3ZWlyZC4gIEluIG9yZGVyIHRvIHJ1biB0aGUgcmVsb2NhdGlvbgotCWVuZ2luZSwgSSBuZWVkIHRvIGJlIGFibGUgdG8gZmluZCB0aGUgYmFzZSBhZGRyZXNzIG9mIGFuIGluc3RhbnRpYXRlZAotCXNlY3Rpb24gb2YgdGhlIGZyYWdtZW50IHdlJ3JlIGZpeGluZyB1cCBnaXZlbiBvbmx5IGl0cyBzZWN0aW9uIG51bWJlci4KLQlUaGlzIGlzbid0IGhhcmQgZm9yIENGTSB0byBkbyBiZWNhdXNlIGl0J3MgdGhlIG9uZSB0aGF0IGluc3RhbnRpYXRlZCB0aGUKLQlzZWN0aW9ucyBpbiB0aGUgZmlyc3QgcGxhY2UuICBJdCdzIHN1cnByaXNpbmdseSBkaWZmaWN1bHQgdG8gZG8gaWYKLQl5b3UncmUgbm90IENGTS4gIFtBbmQgeW91IGRvbid0IGhhdmUgYWNjZXNzIHRvIHRoZSBwcml2YXRlIENGTSBBUGlzIGZvciAKLQlkb2luZyBpdC5dCi0JCi0JW0FsYW4gTGlsbGljaCBpcyBnb2luZyB0byBraWxsIG1lIHdoZW4gaGUgcmVhZHMgdGhpcyEgIEkgc2hvdWxkIHBvaW50IG91dAotCSB0aGF0IFRWZWN0b3IncyBkb24ndCBoYXZlIHRvIGNvbnRhaW4gdHdvIHdvcmRzLCB0aGV5IGNhbiBiZSBsb25nZXIsCi0JIGFuZCB0aGF0IHRoZSBzZWNvbmQgd29yZCBpc24ndCBuZWNlc3NhcmlseSBhIFRPQyBwb2ludGVyLCBpdCdzCi0JIGp1c3QgdGhhdCB0aGUgY2FsbGluZyBjb252ZW50aW9ucyByZXF1aXJlIHRoYXQgaXQgYmUgcHV0IGluIHRoZQotCSBUT0MgcmVnaXN0ZXIgd2hlbiB0aGUgY29kZSBpcyBjYWxsZWQuCi0JIAotCSBGdXJ0aGVybW9yZSwgdGhlIGNvZGUgc2VjdGlvbiBpc24ndCBhbHdheXMgc2VjdGlvbiAwLCBhbmQgdGhlIGRhdGEKLQkgc2VjdGlvbiBpc24ndCBhbHdheXMgc2VjdGlvbiAxLCBhbmQgdGhlcmUgY2FuIGJlIHplcm8gdG8gbWFueSBzZWN0aW9ucwotCSBvZiBlYWNoIHR5cGUuCi0JIAotCSBCdXQgdGhlc2UgbmljZXRpZXMgYXJlIGJlc2lkZXMgdGhlIHBvaW50OiBJJ20gZG9pbmcgc29tZXRoaW5nIHRyaWNreSAKLQkgYmVjYXVzZSBJIGRvbid0IGhhdmUgYSBuaWNlIEFQSSBmb3IgZ2V0dGluZyBzZWN0aW9uIGJhc2UgYWRkcmVzc2VzLiAgCi0JIElmIEkgaGFkIGEgbmljZSBBUEkgZm9yIGRvaW5nIHRoYXQsIG5vbmUgb2YgdGhpcyBjb2RlIHdvdWxkIGV4aXN0LgotCV0KKy8qICAgICAgU2V0dXBTZWN0aW9uQmFzZUFkZHJlc3NlcyBSYXRpb25hbGUKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi0JVGhlIHRlY2huaXF1ZSBpcyB2ZXJ5IHNuZWFreSAodGhhbmtzIHRvIEVyaWMgR3JhbnQpLiAgVGhlIGZyYWdtZW50IHRvIAotCWZpeCBuZWNlc3NhcmlseSBoYXMgYSBDRk0gaW5pdCByb3V0aW5lIChiZWNhdXNlIGl0IG5lZWRzIHRoYXQgcm91dGluZSAKLQlpbiBvcmRlciB0byBjYXB0dXJlIHRoZSBmcmFnbWVudCBsb2NhdGlvbiBhbmQgY29ubmVjdGlvbiBJRCkuICBUaHVzIHRoZSAKLQlmcmFnbWVudCB0byBmaXggbXVzdCBoYXZlIGEgVFZlY3RvciBpbiBpdHMgZGF0YSBzZWN0aW9uLiAgVFZlY3RvcnMgYXJlIAotCWludGVyZXN0aW5nIGJlY2F1c2UgdGhleSdyZSBtYWRlIHVwIG9mIHR3byB3b3Jkcy4gIFRoZSBmaXJzdCBpcyBhIHBvaW50ZXIgCi0JdG8gdGhlIGNvZGUgdGhhdCBpbXBsZW1lbnRzIHRoZSByb3V0aW5lOyB0aGUgc2Vjb25kIGlzIGEgcG9pbnRlciB0byB0aGUgVE9DCi0JZm9yIHRoZSBmcmFnbWVudCB0aGF0J3MgZXhwb3J0aW5nIHRoZSBUVmVjdG9yLiAgSG93IFRWZWN0b3JzIGFyZQotCWNyZWF0ZWQgaXMgaW50ZXJlc3RpbmcgdG9vLiAgT24gZGlzaywgYSBUVmVjdG9yIGNvbnNpc3RzIG9mIHR3byB3b3JkcywKLQl0aGUgZmlyc3QgYmVpbmcgdGhlIG9mZnNldCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgY29kZSBzZWN0aW9uIHRvIHRoZQotCXJvdXRpbmUsIHRoZSBzZWNvbmQgYmVpbmcgdGhlIG9mZnNldCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZGF0YSBzZWN0aW9uCi0JdG8gdGhlIFRPQyBiYXNlLiAgV2hlbiBDRk0gcHJlcGFyZXMgYSBUVmVjdG9yLCBpdCBhcHBsaWVzIHRoZSBmb2xsb3dpbmcKLQl0cmFuc2Zvcm06Ci0JCi0JCXR2ZWN0b3IuY29kZVB0ciA9IHR2ZWN0b3IuY29kZU9mZnNldCArIGJhc2Ugb2YgY29kZSBzZWN0aW9uCi0JCXR2ZWN0b3IudG9jUHRyICA9IHR2ZWN0b3IudG9jT2Zmc2V0ICArIGJhc2Ugb2YgZGF0YSBzZWN0aW9uCi0JCQotCU5vdywgeW91IGNhbiByZXZlcnNlIHRoZXNlIHF1ZXN0aW9ucyB0byBtYWtlIHRoZW06Ci0JCi0JCWJhc2Ugb2YgY29kZSBzZWN0aW9uID0gdHZlY3Rvci5jb2RlUHRyIC0gdHZlY3Rvci5jb2RlT2Zmc2V0Ci0JCWJhc2Ugb2YgZGF0YSBzZWN0aW9uID0gdHZlY3Rvci5kYXRhUHRyIC0gdHZlY3Rvci5kYXRhT2Zmc2V0Ci0JCi0JU28gaWYgeW91IGNhbiBmaW5kIHRoZSByZWxvY2F0ZWQgY29udGVudHMgb2YgdGhlIFRWZWN0b3IgYW5kCi0JZmluZCB0aGUgb3JpZ2luYWwgb2Zmc2V0cyB0aGF0IG1hZGUgdXAgdGhlIFRWZWN0b3IsIHlvdSBjYW4gdGhlbgotCWNhbGN1bGF0ZSB0aGUgYmFzZSBhZGRyZXNzIG9mIGJvdGggdGhlIGNvZGUgYW5kIGRhdGEgc2VjdGlvbnMuCi0JCi0JRmluZGluZyB0aGUgcmVsb2NhdGVkIGNvbnRlbnRzIG9mIHRoZSBUVmVjdG9yIGlzIGVhc3k7IEkgc2ltcGx5IAotCXJlcXVpcmUgdGhlIGNsaWVudCB0byBwYXNzIGluIGEgcG9pbnRlciB0byBpdHMgaW5pdCByb3V0aW5lLiAKLQlBIHJvdXRpbmUgcG9pbnRlciBpcyBhIFRWZWN0b3IgcG9pbnRlciwgc28geW91IGNhbiBqdXN0IGNhc3QgaXQgCi0JYW5kIGV4dHJhY3QgdGhlIHBhaXIgb2Ygd29yZHMuCisgICAgT0ssIGhlcmUncyB3aGVyZSB0aGluZ3MgZ2V0IHdlaXJkLiAgSW4gb3JkZXIgdG8gcnVuIHRoZSByZWxvY2F0aW9uCisgICAgZW5naW5lLCBJIG5lZWQgdG8gYmUgYWJsZSB0byBmaW5kIHRoZSBiYXNlIGFkZHJlc3Mgb2YgYW4gaW5zdGFudGlhdGVkCisgICAgc2VjdGlvbiBvZiB0aGUgZnJhZ21lbnQgd2UncmUgZml4aW5nIHVwIGdpdmVuIG9ubHkgaXRzIHNlY3Rpb24gbnVtYmVyLgorICAgIFRoaXMgaXNuJ3QgaGFyZCBmb3IgQ0ZNIHRvIGRvIGJlY2F1c2UgaXQncyB0aGUgb25lIHRoYXQgaW5zdGFudGlhdGVkIHRoZQorICAgIHNlY3Rpb25zIGluIHRoZSBmaXJzdCBwbGFjZS4gIEl0J3Mgc3VycHJpc2luZ2x5IGRpZmZpY3VsdCB0byBkbyBpZgorICAgIHlvdSdyZSBub3QgQ0ZNLiAgW0FuZCB5b3UgZG9uJ3QgaGF2ZSBhY2Nlc3MgdG8gdGhlIHByaXZhdGUgQ0ZNIEFQaXMgZm9yCisgICAgZG9pbmcgaXQuXQogCi0JRmluZGluZyB0aGUgb3JpZ2luYWwgb2Zmc2V0cyBpcyBhIHRyaWNraWVyLiAgTXkgdGVjaG5pcXVlIGlzIHRvCi0JbG9vayB1cCB0aGUgaW5pdCByb3V0aW5lIGluIHRoZSBmcmFnbWVudCdzIGxvYWRlciBpbmZvIGhlYWRlci4gIFRoaXMKLQl5aWVsZHMgdGhlIHNlY3Rpb24gbnVtYmVyIGFuZCBvZmZzZXQgd2hlcmUgdGhlIGluaXQgcm91dGluZSdzIHVucmVsb2NhdGVkIAotCVRWZWN0b3IgZXhpc3RzLiAgT25jZSBJIGhhdmUgdGhhdCwgSSBjYW4ganVzdCByZWFkIHRoZSB1bnJlbG9jYXRlZCBUVmVjdG9yCi0Jb3V0IG9mIHRoZSBmaWxlIGFuZCBleHRyYWN0IHRoZSBvZmZzZXRzLgorICAgIFtBbGFuIExpbGxpY2ggaXMgZ29pbmcgdG8ga2lsbCBtZSB3aGVuIGhlIHJlYWRzIHRoaXMhICBJIHNob3VsZCBwb2ludCBvdXQKKyAgICAgdGhhdCBUVmVjdG9yJ3MgZG9uJ3QgaGF2ZSB0byBjb250YWluIHR3byB3b3JkcywgdGhleSBjYW4gYmUgbG9uZ2VyLAorICAgICBhbmQgdGhhdCB0aGUgc2Vjb25kIHdvcmQgaXNuJ3QgbmVjZXNzYXJpbHkgYSBUT0MgcG9pbnRlciwgaXQncworICAgICBqdXN0IHRoYXQgdGhlIGNhbGxpbmcgY29udmVudGlvbnMgcmVxdWlyZSB0aGF0IGl0IGJlIHB1dCBpbiB0aGUKKyAgICAgVE9DIHJlZ2lzdGVyIHdoZW4gdGhlIGNvZGUgaXMgY2FsbGVkLgorCisgICAgIEZ1cnRoZXJtb3JlLCB0aGUgY29kZSBzZWN0aW9uIGlzbid0IGFsd2F5cyBzZWN0aW9uIDAsIGFuZCB0aGUgZGF0YQorICAgICBzZWN0aW9uIGlzbid0IGFsd2F5cyBzZWN0aW9uIDEsIGFuZCB0aGVyZSBjYW4gYmUgemVybyB0byBtYW55IHNlY3Rpb25zCisgICAgIG9mIGVhY2ggdHlwZS4KKworICAgICBCdXQgdGhlc2UgbmljZXRpZXMgYXJlIGJlc2lkZXMgdGhlIHBvaW50OiBJJ20gZG9pbmcgc29tZXRoaW5nIHRyaWNreQorICAgICBiZWNhdXNlIEkgZG9uJ3QgaGF2ZSBhIG5pY2UgQVBJIGZvciBnZXR0aW5nIHNlY3Rpb24gYmFzZSBhZGRyZXNzZXMuCisgICAgIElmIEkgaGFkIGEgbmljZSBBUEkgZm9yIGRvaW5nIHRoYXQsIG5vbmUgb2YgdGhpcyBjb2RlIHdvdWxkIGV4aXN0LgorICAgIF0KKworICAgIFRoZSB0ZWNobmlxdWUgaXMgdmVyeSBzbmVha3kgKHRoYW5rcyB0byBFcmljIEdyYW50KS4gIFRoZSBmcmFnbWVudCB0bworICAgIGZpeCBuZWNlc3NhcmlseSBoYXMgYSBDRk0gaW5pdCByb3V0aW5lIChiZWNhdXNlIGl0IG5lZWRzIHRoYXQgcm91dGluZQorICAgIGluIG9yZGVyIHRvIGNhcHR1cmUgdGhlIGZyYWdtZW50IGxvY2F0aW9uIGFuZCBjb25uZWN0aW9uIElEKS4gIFRodXMgdGhlCisgICAgZnJhZ21lbnQgdG8gZml4IG11c3QgaGF2ZSBhIFRWZWN0b3IgaW4gaXRzIGRhdGEgc2VjdGlvbi4gIFRWZWN0b3JzIGFyZQorICAgIGludGVyZXN0aW5nIGJlY2F1c2UgdGhleSdyZSBtYWRlIHVwIG9mIHR3byB3b3Jkcy4gIFRoZSBmaXJzdCBpcyBhIHBvaW50ZXIKKyAgICB0byB0aGUgY29kZSB0aGF0IGltcGxlbWVudHMgdGhlIHJvdXRpbmU7IHRoZSBzZWNvbmQgaXMgYSBwb2ludGVyIHRvIHRoZSBUT0MKKyAgICBmb3IgdGhlIGZyYWdtZW50IHRoYXQncyBleHBvcnRpbmcgdGhlIFRWZWN0b3IuICBIb3cgVFZlY3RvcnMgYXJlCisgICAgY3JlYXRlZCBpcyBpbnRlcmVzdGluZyB0b28uICBPbiBkaXNrLCBhIFRWZWN0b3IgY29uc2lzdHMgb2YgdHdvIHdvcmRzLAorICAgIHRoZSBmaXJzdCBiZWluZyB0aGUgb2Zmc2V0IGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBjb2RlIHNlY3Rpb24gdG8gdGhlCisgICAgcm91dGluZSwgdGhlIHNlY29uZCBiZWluZyB0aGUgb2Zmc2V0IGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBkYXRhIHNlY3Rpb24KKyAgICB0byB0aGUgVE9DIGJhc2UuICBXaGVuIENGTSBwcmVwYXJlcyBhIFRWZWN0b3IsIGl0IGFwcGxpZXMgdGhlIGZvbGxvd2luZworICAgIHRyYW5zZm9ybToKKworICAgICAgICB0dmVjdG9yLmNvZGVQdHIgPSB0dmVjdG9yLmNvZGVPZmZzZXQgKyBiYXNlIG9mIGNvZGUgc2VjdGlvbgorICAgICAgICB0dmVjdG9yLnRvY1B0ciAgPSB0dmVjdG9yLnRvY09mZnNldCAgKyBiYXNlIG9mIGRhdGEgc2VjdGlvbgorCisgICAgTm93LCB5b3UgY2FuIHJldmVyc2UgdGhlc2UgcXVlc3Rpb25zIHRvIG1ha2UgdGhlbToKKworICAgICAgICBiYXNlIG9mIGNvZGUgc2VjdGlvbiA9IHR2ZWN0b3IuY29kZVB0ciAtIHR2ZWN0b3IuY29kZU9mZnNldAorICAgICAgICBiYXNlIG9mIGRhdGEgc2VjdGlvbiA9IHR2ZWN0b3IuZGF0YVB0ciAtIHR2ZWN0b3IuZGF0YU9mZnNldAorCisgICAgU28gaWYgeW91IGNhbiBmaW5kIHRoZSByZWxvY2F0ZWQgY29udGVudHMgb2YgdGhlIFRWZWN0b3IgYW5kCisgICAgZmluZCB0aGUgb3JpZ2luYWwgb2Zmc2V0cyB0aGF0IG1hZGUgdXAgdGhlIFRWZWN0b3IsIHlvdSBjYW4gdGhlbgorICAgIGNhbGN1bGF0ZSB0aGUgYmFzZSBhZGRyZXNzIG9mIGJvdGggdGhlIGNvZGUgYW5kIGRhdGEgc2VjdGlvbnMuCisKKyAgICBGaW5kaW5nIHRoZSByZWxvY2F0ZWQgY29udGVudHMgb2YgdGhlIFRWZWN0b3IgaXMgZWFzeTsgSSBzaW1wbHkKKyAgICByZXF1aXJlIHRoZSBjbGllbnQgdG8gcGFzcyBpbiBhIHBvaW50ZXIgdG8gaXRzIGluaXQgcm91dGluZS4KKyAgICBBIHJvdXRpbmUgcG9pbnRlciBpcyBhIFRWZWN0b3IgcG9pbnRlciwgc28geW91IGNhbiBqdXN0IGNhc3QgaXQKKyAgICBhbmQgZXh0cmFjdCB0aGUgcGFpciBvZiB3b3Jkcy4KKworICAgIEZpbmRpbmcgdGhlIG9yaWdpbmFsIG9mZnNldHMgaXMgYSB0cmlja2llci4gIE15IHRlY2huaXF1ZSBpcyB0bworICAgIGxvb2sgdXAgdGhlIGluaXQgcm91dGluZSBpbiB0aGUgZnJhZ21lbnQncyBsb2FkZXIgaW5mbyBoZWFkZXIuICBUaGlzCisgICAgeWllbGRzIHRoZSBzZWN0aW9uIG51bWJlciBhbmQgb2Zmc2V0IHdoZXJlIHRoZSBpbml0IHJvdXRpbmUncyB1bnJlbG9jYXRlZAorICAgIFRWZWN0b3IgZXhpc3RzLiAgT25jZSBJIGhhdmUgdGhhdCwgSSBjYW4ganVzdCByZWFkIHRoZSB1bnJlbG9jYXRlZCBUVmVjdG9yCisgICAgb3V0IG9mIHRoZSBmaWxlIGFuZCBleHRyYWN0IHRoZSBvZmZzZXRzLgogKi8KIAogc3RydWN0IFRWZWN0b3IgewotCXZvaWQgKmNvZGVQdHI7Ci0Jdm9pZCAqdG9jUHRyOworICAgIHZvaWQgKmNvZGVQdHI7CisgICAgdm9pZCAqdG9jUHRyOwogfTsKIHR5cGVkZWYgc3RydWN0IFRWZWN0b3IgVFZlY3RvcjsKIAogc3RhdGljIE9TU3RhdHVzIFNldHVwU2VjdGlvbkJhc2VBZGRyZXNzZXMoRnJhZ1RvRml4SW5mbyAqZnJhZ1RvRml4KQotCS8vIFRoaXMgcm91dGluZSBpbml0aWFsaXNlcyB0aGUgc2VjdGlvbjBCYXNlIGFuZCBzZWN0aW9uMUJhc2UKLQkvLyBiYXNlIGZpZWxkcyBvZiBmcmFnVG9GaXggdG8gdGhlIGJhc2UgYWRkcmVzc2VzIG9mIHRoZQotCS8vIGluc3RhbnRpYXRlZCBmcmFnbWVudCByZXByZXNlbnRlZCBieSB0aGUgb3RoZXIgZmllbGRzCi0JLy8gb2YgZnJhZ1RvRml4LiAgVGhlIHByb2Nlc3Mgd29ya3MgaW4gdGhyZWUgc3RhdGVzOgotCS8vCi0JLy8gMS4gCUZpbmQgdGhlIGNvbnRlbnRzIG9mIHRoZSByZWxvY2F0ZWQgVFZlY3RvciBvZiB0aGUgCi0JLy8gICAgICBmcmFnbWVudCdzIGluaXRpYWxpc2F0aW9uIHJvdXRpbmUsIHByb3ZpZGVkIHRvIHVzIGJ5IAotCS8vICAgICAgdGhlIGNhbGxlci4KLQkvLwotCS8vIDIuCUZpbmQgdGhlIGNvbnRlbnRzIG9mIHRoZSBub24tcmVsb2NhdGVkIFRWZWN0b3IgYnkgCi0JLy8gICAgICBsb29raW5nIGl0IHVwIGluIHRoZSBQRUYgbG9hZGVyIGluZm8gaGVhZGVyIGFuZCB0aGVuIAotCS8vICAgICAgdXNpbmcgdGhhdCB0byByZWFkIHRoZSBUVmVjdG9yIGNvbnRlbnRzIGZyb20gZGlzay4KLQkvLyAgICAgIFRoaXMgeWllbGRzIHRoZSBvZmZzZXRzIGZyb20gdGhlIHNlY3Rpb24gYmFzZXMgZm9yIAotCS8vICAgICAgdGhlIGluaXQgcm91dGluZS4KLQkvLwotCS8vIDMuCVN1YnRyYWN0IDIgZnJvbSAzLgorICAgIC8vIFRoaXMgcm91dGluZSBpbml0aWFsaXNlcyB0aGUgc2VjdGlvbjBCYXNlIGFuZCBzZWN0aW9uMUJhc2UKKyAgICAvLyBiYXNlIGZpZWxkcyBvZiBmcmFnVG9GaXggdG8gdGhlIGJhc2UgYWRkcmVzc2VzIG9mIHRoZQorICAgIC8vIGluc3RhbnRpYXRlZCBmcmFnbWVudCByZXByZXNlbnRlZCBieSB0aGUgb3RoZXIgZmllbGRzCisgICAgLy8gb2YgZnJhZ1RvRml4LiAgVGhlIHByb2Nlc3Mgd29ya3MgaW4gdGhyZWUgc3RhdGVzOgorICAgIC8vCisgICAgLy8gMS4gICAgICAgRmluZCB0aGUgY29udGVudHMgb2YgdGhlIHJlbG9jYXRlZCBUVmVjdG9yIG9mIHRoZQorICAgIC8vICAgICAgZnJhZ21lbnQncyBpbml0aWFsaXNhdGlvbiByb3V0aW5lLCBwcm92aWRlZCB0byB1cyBieQorICAgIC8vICAgICAgdGhlIGNhbGxlci4KKyAgICAvLworICAgIC8vIDIuICAgICAgIEZpbmQgdGhlIGNvbnRlbnRzIG9mIHRoZSBub24tcmVsb2NhdGVkIFRWZWN0b3IgYnkKKyAgICAvLyAgICAgIGxvb2tpbmcgaXQgdXAgaW4gdGhlIFBFRiBsb2FkZXIgaW5mbyBoZWFkZXIgYW5kIHRoZW4KKyAgICAvLyAgICAgIHVzaW5nIHRoYXQgdG8gcmVhZCB0aGUgVFZlY3RvciBjb250ZW50cyBmcm9tIGRpc2suCisgICAgLy8gICAgICBUaGlzIHlpZWxkcyB0aGUgb2Zmc2V0cyBmcm9tIHRoZSBzZWN0aW9uIGJhc2VzIGZvcgorICAgIC8vICAgICAgdGhlIGluaXQgcm91dGluZS4KKyAgICAvLworICAgIC8vIDMuICAgICAgIFN1YnRyYWN0IDIgZnJvbSAzLgogewotCU9TU3RhdHVzIAkJCWVycjsKLQlUVmVjdG9yICoJCQlyZWxvY2F0ZWRFeHBvcnQ7Ci0JU0ludDMyCQkJCWluaXRTZWN0aW9uOwotCVVJbnQzMgkJCQlpbml0T2Zmc2V0OwotCVBFRlNlY3Rpb25IZWFkZXIgKglpbml0U2VjdGlvbkhlYWRlcjsKLQlQdHIJCQkJCXBhY2tlZERhdGFTZWN0aW9uOwotCVB0cgkJCQkJdW5wYWNrZWREYXRhU2VjdGlvbjsKLQlUVmVjdG9yIAkJCW9yaWdpbmFsT2Zmc2V0czsKKyAgICBPU1N0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnI7CisgICAgVFZlY3RvciAqICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsb2NhdGVkRXhwb3J0OworICAgIFNJbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRTZWN0aW9uOworICAgIFVJbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRPZmZzZXQ7CisgICAgUEVGU2VjdGlvbkhlYWRlciAqICAgICAgICAgIGluaXRTZWN0aW9uSGVhZGVyOworICAgIFB0ciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2VkRGF0YVNlY3Rpb247CisgICAgUHRyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnBhY2tlZERhdGFTZWN0aW9uOworICAgIFRWZWN0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsT2Zmc2V0czsKIAotCXBhY2tlZERhdGFTZWN0aW9uICAgPSBuaWw7Ci0JdW5wYWNrZWREYXRhU2VjdGlvbiA9IG5pbDsKLQkKLQkvLyBTdGVwIDEuCisgICAgcGFja2VkRGF0YVNlY3Rpb24gICA9IG5pbDsKKyAgICB1bnBhY2tlZERhdGFTZWN0aW9uID0gbmlsOwogCi0JLy8gRmlyc3QgZmluZCB0aGUgaW5pdCByb3V0aW5lJ3MgVFZlY3Rvciwgd2hpY2ggZ2l2ZXMgdXMgdGhlIHJlbG9jYXRlZCAKLQkvLyBvZmZzZXRzIG9mIHRoZSBpbml0IHJvdXRpbmUgaW50byB0aGUgZGF0YSBhbmQgY29kZSBzZWN0aW9ucy4KKyAgICAvLyBTdGVwIDEuCiAKLQlyZWxvY2F0ZWRFeHBvcnQgPSAoVFZlY3RvciAqKSBmcmFnVG9GaXgtPmluaXRSb3V0aW5lOwotCQkKLQkvLyBTdGVwIDIuCi0JCi0JLy8gTm93IGZpbmQgdGhlIGluaXQgcm91dGluZSdzIFRWZWN0b3IncyBvZmZzZXRzIGluIHRoZSBkYXRhIHNlY3Rpb24gb24gCi0JLy8gZGlzay4gIFRoaXMgZ2l2ZXMgdXMgdGhlIHJhdyBvZmZzZXRzIGZyb20gdGhlIGRhdGEgYW5kIGNvZGUgc2VjdGlvbiAKLQkvLyBvZiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBpbml0IHJvdXRpbmUuCi0JCi0JZXJyID0gbm9FcnI7Ci0JaW5pdFNlY3Rpb24gPSBmcmFnVG9GaXgtPmxvYWRlclNlY3Rpb24tPmluaXRTZWN0aW9uOwotCWluaXRPZmZzZXQgID0gZnJhZ1RvRml4LT5sb2FkZXJTZWN0aW9uLT5pbml0T2Zmc2V0OwotCWlmIChpbml0U2VjdGlvbiA9PSAtMSkgewotCQllcnIgPSBjZnJhZ0ZyYWdtZW50VXNhZ2VFcnI7Ci0JfQotCWlmIChlcnIgPT0gbm9FcnIpIHsKLQkJTW9yZUFzc2VydFEoIGluaXRTZWN0aW9uID49IDAgKTsJCS8vIE5lZ2F0aXZlIGluZGV4ZXMgYXJlIHBzZXVkby1zZWN0aW9ucyB3aGljaCBhcmUganVzdCBub3QgYWxsb3dlZCEKLQkJTW9yZUFzc2VydFEoIGluaXRTZWN0aW9uIDwgZnJhZ1RvRml4LT5jb250YWluZXJIZWFkZXIuc2VjdGlvbkNvdW50ICk7CisgICAgLy8gRmlyc3QgZmluZCB0aGUgaW5pdCByb3V0aW5lJ3MgVFZlY3Rvciwgd2hpY2ggZ2l2ZXMgdXMgdGhlIHJlbG9jYXRlZAorICAgIC8vIG9mZnNldHMgb2YgdGhlIGluaXQgcm91dGluZSBpbnRvIHRoZSBkYXRhIGFuZCBjb2RlIHNlY3Rpb25zLgogCi0JCWluaXRTZWN0aW9uSGVhZGVyID0gJmZyYWdUb0ZpeC0+c2VjdGlvbkhlYWRlcnNbaW5pdFNlY3Rpb25dOwotCQkKLQkJLy8gSWYgdGhlIGRhdGEgc2VjdGlvbiBpcyBwYWNrZWQsIHVucGFjayBpdCB0byBhIHRlbXBvcmFyeSBidWZmZXIgYW5kIHRoZW4gZ2V0IHRoZSAKLQkJLy8gb3JpZ2luYWwgb2Zmc2V0cyBmcm9tIHRoYXQgYnVmZmVyLiAgSWYgdGhlIGRhdGEgc2VjdGlvbiBpcyB1bnBhY2tlZCwganVzdCByZWFkIAotCQkvLyB0aGUgb3JpZ2luYWwgb2Zmc2V0cyBkaXJlY3RseSBvZmYgdGhlIGRpc2suCi0JCQotCQlpZiAoIGluaXRTZWN0aW9uSGVhZGVyLT5zZWN0aW9uS2luZCA9PSBrUEVGUGFja2VkRGF0YVNlY3Rpb24gKSB7CisgICAgcmVsb2NhdGVkRXhwb3J0ID0gKFRWZWN0b3IgKikgZnJhZ1RvRml4LT5pbml0Um91dGluZTsKIAotCQkJLy8gQWxsb2NhdGUgc3BhY2UgZm9yIHBhY2tlZCBhbmQgdW5wYWNrZWQgY29waWVzIG9mIHRoZSBzZWN0aW9uLgotCQkJCi0JCQlwYWNrZWREYXRhU2VjdGlvbiA9IE5ld1B0cihpbml0U2VjdGlvbkhlYWRlci0+Y29udGFpbmVyTGVuZ3RoKTsKLQkJCWVyciA9IE1lbUVycm9yKCk7CisgICAgLy8gU3RlcCAyLgogCi0JCQlpZiAoZXJyID09IG5vRXJyKSB7Ci0JCQkJdW5wYWNrZWREYXRhU2VjdGlvbiA9IE5ld1B0cihpbml0U2VjdGlvbkhlYWRlci0+dW5wYWNrZWRMZW5ndGgpOwotCQkJCWVyciA9IE1lbUVycm9yKCk7Ci0JCQl9CisgICAgLy8gTm93IGZpbmQgdGhlIGluaXQgcm91dGluZSdzIFRWZWN0b3IncyBvZmZzZXRzIGluIHRoZSBkYXRhIHNlY3Rpb24gb24KKyAgICAvLyBkaXNrLiAgVGhpcyBnaXZlcyB1cyB0aGUgcmF3IG9mZnNldHMgZnJvbSB0aGUgZGF0YSBhbmQgY29kZSBzZWN0aW9uCisgICAgLy8gb2YgdGhlIGJlZ2lubmluZyBvZiB0aGUgaW5pdCByb3V0aW5lLgogCi0JCQkvLyBSZWFkIHRoZSBjb250ZW50cyBvZiB0aGUgcGFja2VkIHNlY3Rpb24uCi0JCQkKLQkJCWlmIChlcnIgPT0gbm9FcnIpIHsKLQkJCQllcnIgPSBGU1JlYWRBdE9mZnNldCgJZnJhZ1RvRml4LT5maWxlUmVmLAotCQkJCQkJCQkJCWZyYWdUb0ZpeC0+bG9jYXRvci5vZmZzZXQKLQkJCQkJCQkJCQkrIGluaXRTZWN0aW9uSGVhZGVyLT5jb250YWluZXJPZmZzZXQsCi0JCQkJCQkJCQkJaW5pdFNlY3Rpb25IZWFkZXItPmNvbnRhaW5lckxlbmd0aCwKLQkJCQkJCQkJCQlwYWNrZWREYXRhU2VjdGlvbik7Ci0JCQl9Ci0JCQkKLQkJCS8vIFVucGFjayB0aGUgZGF0YSBpbnRvIHRoZSB1bnBhY2tlZCBzZWN0aW9uLgotCQkJCi0JCQlpZiAoZXJyID09IG5vRXJyKSB7Ci0JCQkJZXJyID0gVW5wYWNrUEVGRGF0YVNlY3Rpb24oIChVSW50OCAqKSBwYWNrZWREYXRhU2VjdGlvbiwgICBpbml0U2VjdGlvbkhlYWRlci0+Y29udGFpbmVyTGVuZ3RoLAotCQkJCQkJCQkgICAgICAgICAgICAoVUludDggKikgdW5wYWNrZWREYXRhU2VjdGlvbiwgaW5pdFNlY3Rpb25IZWFkZXItPnVucGFja2VkTGVuZ3RoKTsKLQkJCX0KLQkJCQotCQkJLy8gRXh0cmFjdCB0aGUgaW5pdCByb3V0aW5lJ3MgVFZlY3RvciBmcm9tIHRoZSB1bnBhY2tlZCBzZWN0aW9uLgotCQkJCi0JCQlpZiAoZXJyID09IG5vRXJyKSB7Ci0JCQkJQmxvY2tNb3ZlRGF0YSh1bnBhY2tlZERhdGFTZWN0aW9uICsgaW5pdE9mZnNldCwgJm9yaWdpbmFsT2Zmc2V0cywgc2l6ZW9mKFRWZWN0b3IpKTsKLQkJCX0KLQkJCQotCQl9IGVsc2UgewotCQkJTW9yZUFzc2VydFEoZnJhZ1RvRml4LT5zZWN0aW9uSGVhZGVyc1tpbml0U2VjdGlvbl0uc2VjdGlvbktpbmQgPT0ga1BFRlVucGFja2VkRGF0YVNlY3Rpb24pOwotCQkJZXJyID0gRlNSZWFkQXRPZmZzZXQoZnJhZ1RvRml4LT5maWxlUmVmLCAKLQkJCQkJCQkJCWZyYWdUb0ZpeC0+bG9jYXRvci5vZmZzZXQKLQkJCQkJCQkJCSsgZnJhZ1RvRml4LT5zZWN0aW9uSGVhZGVyc1tpbml0U2VjdGlvbl0uY29udGFpbmVyT2Zmc2V0Ci0JCQkJCQkJCQkrIGluaXRPZmZzZXQsCi0JCQkJCQkJCQlzaXplb2YoVFZlY3RvciksIAotCQkJCQkJCQkJJm9yaWdpbmFsT2Zmc2V0cyk7Ci0JCX0KLQl9CisgICAgZXJyID0gbm9FcnI7CisgICAgaW5pdFNlY3Rpb24gPSBmcmFnVG9GaXgtPmxvYWRlclNlY3Rpb24tPmluaXRTZWN0aW9uOworICAgIGluaXRPZmZzZXQgID0gZnJhZ1RvRml4LT5sb2FkZXJTZWN0aW9uLT5pbml0T2Zmc2V0OworICAgIGlmIChpbml0U2VjdGlvbiA9PSAtMSkgeworICAgICAgICBlcnIgPSBjZnJhZ0ZyYWdtZW50VXNhZ2VFcnI7CisgICAgfQorICAgIGlmIChlcnIgPT0gbm9FcnIpIHsKKyAgICAgICAgTW9yZUFzc2VydFEoIGluaXRTZWN0aW9uID49IDAgKTsgICAgICAgICAgICAgICAgICAgICAgICAvLyBOZWdhdGl2ZSBpbmRleGVzIGFyZSBwc2V1ZG8tc2VjdGlvbnMgd2hpY2ggYXJlIGp1c3Qgbm90IGFsbG93ZWQhCisgICAgICAgIE1vcmVBc3NlcnRRKCBpbml0U2VjdGlvbiA8IGZyYWdUb0ZpeC0+Y29udGFpbmVySGVhZGVyLnNlY3Rpb25Db3VudCApOwogCi0JLy8gU3RlcCAzLgotCQkKLQkvLyBEbyB0aGUgbWF0aHMgdG8gc3VidHJhY3QgdGhlIHVucmVsb2NhdGVkIG9mZnNldHMgZnJvbSB0aGUgY3VycmVudCBhZGRyZXNzIAotCS8vIHRvIGdldCB0aGUgYmFzZSBhZGRyZXNzLgotCQotCWlmIChlcnIgPT0gbm9FcnIpIHsKLQkJZnJhZ1RvRml4LT5zZWN0aW9uMEJhc2UgPSAoKGNoYXIgKikgcmVsb2NhdGVkRXhwb3J0LT5jb2RlUHRyKSAtIChVSW50MzIpIG9yaWdpbmFsT2Zmc2V0cy5jb2RlUHRyOwotCQlmcmFnVG9GaXgtPnNlY3Rpb24xQmFzZSA9ICgoY2hhciAqKSByZWxvY2F0ZWRFeHBvcnQtPnRvY1B0cikgIC0gKFVJbnQzMikgb3JpZ2luYWxPZmZzZXRzLnRvY1B0cjsKLQl9Ci0JCi0JLy8gQ2xlYW4gdXAuCi0JCi0JaWYgKHBhY2tlZERhdGFTZWN0aW9uICE9IG5pbCkgewotCQlEaXNwb3NlUHRyKHBhY2tlZERhdGFTZWN0aW9uKTsKLQkJTW9yZUFzc2VydFEoIE1lbUVycm9yKCkgPT0gbm9FcnIgKTsKLQl9Ci0JaWYgKHVucGFja2VkRGF0YVNlY3Rpb24gIT0gbmlsKSB7Ci0JCURpc3Bvc2VQdHIodW5wYWNrZWREYXRhU2VjdGlvbik7Ci0JCU1vcmVBc3NlcnRRKCBNZW1FcnJvcigpID09IG5vRXJyICk7Ci0JfQotCXJldHVybiBlcnI7CisgICAgICAgIGluaXRTZWN0aW9uSGVhZGVyID0gJmZyYWdUb0ZpeC0+c2VjdGlvbkhlYWRlcnNbaW5pdFNlY3Rpb25dOworCisgICAgICAgIC8vIElmIHRoZSBkYXRhIHNlY3Rpb24gaXMgcGFja2VkLCB1bnBhY2sgaXQgdG8gYSB0ZW1wb3JhcnkgYnVmZmVyIGFuZCB0aGVuIGdldCB0aGUKKyAgICAgICAgLy8gb3JpZ2luYWwgb2Zmc2V0cyBmcm9tIHRoYXQgYnVmZmVyLiAgSWYgdGhlIGRhdGEgc2VjdGlvbiBpcyB1bnBhY2tlZCwganVzdCByZWFkCisgICAgICAgIC8vIHRoZSBvcmlnaW5hbCBvZmZzZXRzIGRpcmVjdGx5IG9mZiB0aGUgZGlzay4KKworICAgICAgICBpZiAoIGluaXRTZWN0aW9uSGVhZGVyLT5zZWN0aW9uS2luZCA9PSBrUEVGUGFja2VkRGF0YVNlY3Rpb24gKSB7CisKKyAgICAgICAgICAgIC8vIEFsbG9jYXRlIHNwYWNlIGZvciBwYWNrZWQgYW5kIHVucGFja2VkIGNvcGllcyBvZiB0aGUgc2VjdGlvbi4KKworICAgICAgICAgICAgcGFja2VkRGF0YVNlY3Rpb24gPSBOZXdQdHIoaW5pdFNlY3Rpb25IZWFkZXItPmNvbnRhaW5lckxlbmd0aCk7CisgICAgICAgICAgICBlcnIgPSBNZW1FcnJvcigpOworCisgICAgICAgICAgICBpZiAoZXJyID09IG5vRXJyKSB7CisgICAgICAgICAgICAgICAgdW5wYWNrZWREYXRhU2VjdGlvbiA9IE5ld1B0cihpbml0U2VjdGlvbkhlYWRlci0+dW5wYWNrZWRMZW5ndGgpOworICAgICAgICAgICAgICAgIGVyciA9IE1lbUVycm9yKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFJlYWQgdGhlIGNvbnRlbnRzIG9mIHRoZSBwYWNrZWQgc2VjdGlvbi4KKworICAgICAgICAgICAgaWYgKGVyciA9PSBub0VycikgeworICAgICAgICAgICAgICAgIGVyciA9IEZTUmVhZEF0T2Zmc2V0KCAgICAgICAgICAgICAgICAgICBmcmFnVG9GaXgtPmZpbGVSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhZ1RvRml4LT5sb2NhdG9yLm9mZnNldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgaW5pdFNlY3Rpb25IZWFkZXItPmNvbnRhaW5lck9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0U2VjdGlvbkhlYWRlci0+Y29udGFpbmVyTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2tlZERhdGFTZWN0aW9uKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVW5wYWNrIHRoZSBkYXRhIGludG8gdGhlIHVucGFja2VkIHNlY3Rpb24uCisKKyAgICAgICAgICAgIGlmIChlcnIgPT0gbm9FcnIpIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBVbnBhY2tQRUZEYXRhU2VjdGlvbiggKFVJbnQ4ICopIHBhY2tlZERhdGFTZWN0aW9uLCAgIGluaXRTZWN0aW9uSGVhZGVyLT5jb250YWluZXJMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVUludDggKikgdW5wYWNrZWREYXRhU2VjdGlvbiwgaW5pdFNlY3Rpb25IZWFkZXItPnVucGFja2VkTGVuZ3RoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gRXh0cmFjdCB0aGUgaW5pdCByb3V0aW5lJ3MgVFZlY3RvciBmcm9tIHRoZSB1bnBhY2tlZCBzZWN0aW9uLgorCisgICAgICAgICAgICBpZiAoZXJyID09IG5vRXJyKSB7CisgICAgICAgICAgICAgICAgQmxvY2tNb3ZlRGF0YSh1bnBhY2tlZERhdGFTZWN0aW9uICsgaW5pdE9mZnNldCwgJm9yaWdpbmFsT2Zmc2V0cywgc2l6ZW9mKFRWZWN0b3IpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTW9yZUFzc2VydFEoZnJhZ1RvRml4LT5zZWN0aW9uSGVhZGVyc1tpbml0U2VjdGlvbl0uc2VjdGlvbktpbmQgPT0ga1BFRlVucGFja2VkRGF0YVNlY3Rpb24pOworICAgICAgICAgICAgZXJyID0gRlNSZWFkQXRPZmZzZXQoZnJhZ1RvRml4LT5maWxlUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhZ1RvRml4LT5sb2NhdG9yLm9mZnNldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBmcmFnVG9GaXgtPnNlY3Rpb25IZWFkZXJzW2luaXRTZWN0aW9uXS5jb250YWluZXJPZmZzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgaW5pdE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihUVmVjdG9yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvcmlnaW5hbE9mZnNldHMpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gU3RlcCAzLgorCisgICAgLy8gRG8gdGhlIG1hdGhzIHRvIHN1YnRyYWN0IHRoZSB1bnJlbG9jYXRlZCBvZmZzZXRzIGZyb20gdGhlIGN1cnJlbnQgYWRkcmVzcworICAgIC8vIHRvIGdldCB0aGUgYmFzZSBhZGRyZXNzLgorCisgICAgaWYgKGVyciA9PSBub0VycikgeworICAgICAgICBmcmFnVG9GaXgtPnNlY3Rpb24wQmFzZSA9ICgoY2hhciAqKSByZWxvY2F0ZWRFeHBvcnQtPmNvZGVQdHIpIC0gKFVJbnQzMikgb3JpZ2luYWxPZmZzZXRzLmNvZGVQdHI7CisgICAgICAgIGZyYWdUb0ZpeC0+c2VjdGlvbjFCYXNlID0gKChjaGFyICopIHJlbG9jYXRlZEV4cG9ydC0+dG9jUHRyKSAgLSAoVUludDMyKSBvcmlnaW5hbE9mZnNldHMudG9jUHRyOworICAgIH0KKworICAgIC8vIENsZWFuIHVwLgorCisgICAgaWYgKHBhY2tlZERhdGFTZWN0aW9uICE9IG5pbCkgeworICAgICAgICBEaXNwb3NlUHRyKHBhY2tlZERhdGFTZWN0aW9uKTsKKyAgICAgICAgTW9yZUFzc2VydFEoIE1lbUVycm9yKCkgPT0gbm9FcnIgKTsKKyAgICB9CisgICAgaWYgKHVucGFja2VkRGF0YVNlY3Rpb24gIT0gbmlsKSB7CisgICAgICAgIERpc3Bvc2VQdHIodW5wYWNrZWREYXRhU2VjdGlvbik7CisgICAgICAgIE1vcmVBc3NlcnRRKCBNZW1FcnJvcigpID09IG5vRXJyICk7CisgICAgfQorICAgIHJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyB2b2lkICpHZXRTZWN0aW9uQmFzZUFkZHJlc3MoY29uc3QgRnJhZ1RvRml4SW5mbyAqZnJhZ1RvRml4LCBVSW50MTYgc2VjdGlvbkluZGV4KQotCS8vIFRoaXMgcm91dGluZSByZXR1cm5zIHRoZSBiYXNlIG9mIHRoZSBpbnN0YW50aWF0ZWQgc2VjdGlvbgotCS8vIHdob3NlIGluZGV4IGlzIHNlY3Rpb25JbmRleC4gIFRoaXMgcm91dGluZSBpcyB0aGUgZXZpbCB0d2luCi0JLy8gb2YgU2V0dXBTZWN0aW9uQmFzZUFkZHJlc3Nlcy4gIEl0IHNpbXBseSByZXR1cm5zIHRoZSB2YWx1ZXMKLQkvLyBmb3Igc2VjdGlvbiAwIGFuZCAxIHRoYXQgd2UgZGVyaXZlZCBpbiBTZXR1cFNlY3Rpb25CYXNlQWRkcmVzc2VzLgotCS8vIEluIGEgcmVhbCBpbXBsZW1lbnRhdGlvbiwgdGhpcyByb3V0aW5lIHdvdWxkIGNhbGwgQ0ZNIEFQSQotCS8vIHRvIGdldCB0aGlzIGluZm9ybWF0aW9uLCBhbmQgU2V0dXBTZWN0aW9uQmFzZUFkZHJlc3NlcyB3b3VsZAotCS8vIG5vdCBleGlzdCwgYnV0IENGTSBkb2VzIG5vdCBleHBvcnQgdGhlIG5lY2Vzc2FyeSBBUElzIHRvCi0JLy8gdGhpcmQgcGFydGllcy4KKyAgICAvLyBUaGlzIHJvdXRpbmUgcmV0dXJucyB0aGUgYmFzZSBvZiB0aGUgaW5zdGFudGlhdGVkIHNlY3Rpb24KKyAgICAvLyB3aG9zZSBpbmRleCBpcyBzZWN0aW9uSW5kZXguICBUaGlzIHJvdXRpbmUgaXMgdGhlIGV2aWwgdHdpbgorICAgIC8vIG9mIFNldHVwU2VjdGlvbkJhc2VBZGRyZXNzZXMuICBJdCBzaW1wbHkgcmV0dXJucyB0aGUgdmFsdWVzCisgICAgLy8gZm9yIHNlY3Rpb24gMCBhbmQgMSB0aGF0IHdlIGRlcml2ZWQgaW4gU2V0dXBTZWN0aW9uQmFzZUFkZHJlc3Nlcy4KKyAgICAvLyBJbiBhIHJlYWwgaW1wbGVtZW50YXRpb24sIHRoaXMgcm91dGluZSB3b3VsZCBjYWxsIENGTSBBUEkKKyAgICAvLyB0byBnZXQgdGhpcyBpbmZvcm1hdGlvbiwgYW5kIFNldHVwU2VjdGlvbkJhc2VBZGRyZXNzZXMgd291bGQKKyAgICAvLyBub3QgZXhpc3QsIGJ1dCBDRk0gZG9lcyBub3QgZXhwb3J0IHRoZSBuZWNlc3NhcnkgQVBJcyB0bworICAgIC8vIHRoaXJkIHBhcnRpZXMuCiB7Ci0Jdm9pZCAqcmVzdWx0OwotCQotCU1vcmVBc3NlcnRRKGZyYWdUb0ZpeCAhPSBuaWwpOwotCU1vcmVBc3NlcnRRKGZyYWdUb0ZpeC0+Y29udGFpbmVySGVhZGVyLnRhZzEgPT0ga1BFRlRhZzEpOwotCQotCXN3aXRjaCAoc2VjdGlvbkluZGV4KSB7Ci0JCWNhc2UgMDoKLQkJCXJlc3VsdCA9IGZyYWdUb0ZpeC0+c2VjdGlvbjBCYXNlOwotCQkJYnJlYWs7Ci0JCWNhc2UgMToKLQkJCXJlc3VsdCA9IGZyYWdUb0ZpeC0+c2VjdGlvbjFCYXNlOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXN1bHQgPSBuaWw7Ci0JCQlicmVhazsKLQl9Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICB2b2lkICpyZXN1bHQ7CisKKyAgICBNb3JlQXNzZXJ0UShmcmFnVG9GaXggIT0gbmlsKTsKKyAgICBNb3JlQXNzZXJ0UShmcmFnVG9GaXgtPmNvbnRhaW5lckhlYWRlci50YWcxID09IGtQRUZUYWcxKTsKKworICAgIHN3aXRjaCAoc2VjdGlvbkluZGV4KSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIHJlc3VsdCA9IGZyYWdUb0ZpeC0+c2VjdGlvbjBCYXNlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIHJlc3VsdCA9IGZyYWdUb0ZpeC0+c2VjdGlvbjFCYXNlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXN1bHQgPSBuaWw7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogCiBzdGF0aWMgT1NTdGF0dXMgRmluZEltcG9ydExpYnJhcnkoUEVGTG9hZGVySW5mb0hlYWRlciAqbG9hZGVyU2VjdGlvbiwgY29uc3QgY2hhciAqbGlicmFyeU5hbWUsIFBFRkltcG9ydGVkTGlicmFyeSAqKmltcG9ydExpYnJhcnkpCi0JLy8gVGhpcyByb3V0aW5lIGZpbmRzIHRoZSBpbXBvcnQgbGlicmFyeSBkZXNjcmlwdGlvbiAoUEVGSW1wb3J0ZWRMaWJyYXJ5KQotCS8vIGZvciB0aGUgaW1wb3J0IGxpYnJhcnkgbGlicmFyeU5hbWUgaW4gdGhlIFBFRiBsb2FkZXIgc2VjdGlvbi4KLQkvLyBJdCBzZXRzICppbXBvcnRMaWJyYXJ5IHRvIHRoZSBhZGRyZXNzIG9mIHRoZSBkZXNjcmlwdGlvbi4KKyAgICAvLyBUaGlzIHJvdXRpbmUgZmluZHMgdGhlIGltcG9ydCBsaWJyYXJ5IGRlc2NyaXB0aW9uIChQRUZJbXBvcnRlZExpYnJhcnkpCisgICAgLy8gZm9yIHRoZSBpbXBvcnQgbGlicmFyeSBsaWJyYXJ5TmFtZSBpbiB0aGUgUEVGIGxvYWRlciBzZWN0aW9uLgorICAgIC8vIEl0IHNldHMgKmltcG9ydExpYnJhcnkgdG8gdGhlIGFkZHJlc3Mgb2YgdGhlIGRlc2NyaXB0aW9uLgogewotCU9TU3RhdHVzIAkJCWVycjsKLQlVSW50MzIgCQkJCWxpYnJhcmllc1JlbWFpbmluZzsKLQlQRUZJbXBvcnRlZExpYnJhcnkgCSp0aGlzSW1wb3J0TGlicmFyeTsKLQlCb29sZWFuIAkJCWZvdW5kOwotCQotCU1vcmVBc3NlcnRRKGxvYWRlclNlY3Rpb24gIT0gbmlsKTsKLQlNb3JlQXNzZXJ0UShsaWJyYXJ5TmFtZSAhPSBuaWwpOwotCU1vcmVBc3NlcnRRKGltcG9ydExpYnJhcnkgIT0gbmlsKTsKLQkKLQkvLyBMb29wIHRocm91Z2ggZWFjaCBpbXBvcnQgbGlicmFyeSBsb29raW5nIGZvciBhIG1hdGNoaW5nIG5hbWUuCi0JCi0JLy8gSW5pdGlhbGlzZSB0aGlzSW1wb3J0TGlicmFyeSB0byBwb2ludCB0byB0aGUgYnl0ZSBhZnRlciB0aGUKLQkvLyBlbmQgb2YgdGhlIGxvYWRlciBzZWN0aW9uJ3MgaGVhZGVyLgotCQotCXRoaXNJbXBvcnRMaWJyYXJ5ID0gKFBFRkltcG9ydGVkTGlicmFyeSAqKSAobG9hZGVyU2VjdGlvbiArIDEpOwotCWxpYnJhcmllc1JlbWFpbmluZyA9IGxvYWRlclNlY3Rpb24tPmltcG9ydGVkTGlicmFyeUNvdW50OwotCWZvdW5kID0gZmFsc2U7Ci0Jd2hpbGUgKCBsaWJyYXJpZXNSZW1haW5pbmcgPiAwICYmICEgZm91bmQgKSB7Ci0JCS8vIFBFRiBkZWZpbmVzIHRoYXQgaW1wb3J0IGxpYnJhcnkgbmFtZXMgd2lsbCBoYXZlCi0JCS8vIGEgbnVsbCB0ZXJtaW5hdG9yLCBzbyB3ZSBjYW4ganVzdCB1c2Ugc3RyY21wLgotCQlmb3VuZCA9IChzdHJjbXAoIGxpYnJhcnlOYW1lLAotCQkJCQkJKChjaGFyICopbG9hZGVyU2VjdGlvbikKLQkJCQkJCSsgbG9hZGVyU2VjdGlvbi0+bG9hZGVyU3RyaW5nc09mZnNldCAKLQkJCQkJCSsgdGhpc0ltcG9ydExpYnJhcnktPm5hbWVPZmZzZXQpID09IDApOwotCQkvLyAqKiogUmVtb3ZlIEFOU0kgc3RyY21wIGV2ZW50dWFsbHkuCi0JCWlmICggISBmb3VuZCApIHsKLQkJCXRoaXNJbXBvcnRMaWJyYXJ5ICs9IDE7Ci0JCQlsaWJyYXJpZXNSZW1haW5pbmcgLT0gMTsKLQkJfQotCX0KLQkKLQlpZiAoZm91bmQpIHsKLQkJKmltcG9ydExpYnJhcnkgPSB0aGlzSW1wb3J0TGlicmFyeTsKLQkJZXJyID0gbm9FcnI7Ci0JfSBlbHNlIHsKLQkJKmltcG9ydExpYnJhcnkgPSBuaWw7Ci0JCWVyciA9IGNmcmFnTm9MaWJyYXJ5RXJyOwotCX0KLQlyZXR1cm4gZXJyOworICAgIE9TU3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycjsKKyAgICBVSW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJyYXJpZXNSZW1haW5pbmc7CisgICAgUEVGSW1wb3J0ZWRMaWJyYXJ5ICAgICAgICAgICp0aGlzSW1wb3J0TGlicmFyeTsKKyAgICBCb29sZWFuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZDsKKworICAgIE1vcmVBc3NlcnRRKGxvYWRlclNlY3Rpb24gIT0gbmlsKTsKKyAgICBNb3JlQXNzZXJ0UShsaWJyYXJ5TmFtZSAhPSBuaWwpOworICAgIE1vcmVBc3NlcnRRKGltcG9ydExpYnJhcnkgIT0gbmlsKTsKKworICAgIC8vIExvb3AgdGhyb3VnaCBlYWNoIGltcG9ydCBsaWJyYXJ5IGxvb2tpbmcgZm9yIGEgbWF0Y2hpbmcgbmFtZS4KKworICAgIC8vIEluaXRpYWxpc2UgdGhpc0ltcG9ydExpYnJhcnkgdG8gcG9pbnQgdG8gdGhlIGJ5dGUgYWZ0ZXIgdGhlCisgICAgLy8gZW5kIG9mIHRoZSBsb2FkZXIgc2VjdGlvbidzIGhlYWRlci4KKworICAgIHRoaXNJbXBvcnRMaWJyYXJ5ID0gKFBFRkltcG9ydGVkTGlicmFyeSAqKSAobG9hZGVyU2VjdGlvbiArIDEpOworICAgIGxpYnJhcmllc1JlbWFpbmluZyA9IGxvYWRlclNlY3Rpb24tPmltcG9ydGVkTGlicmFyeUNvdW50OworICAgIGZvdW5kID0gZmFsc2U7CisgICAgd2hpbGUgKCBsaWJyYXJpZXNSZW1haW5pbmcgPiAwICYmICEgZm91bmQgKSB7CisgICAgICAgIC8vIFBFRiBkZWZpbmVzIHRoYXQgaW1wb3J0IGxpYnJhcnkgbmFtZXMgd2lsbCBoYXZlCisgICAgICAgIC8vIGEgbnVsbCB0ZXJtaW5hdG9yLCBzbyB3ZSBjYW4ganVzdCB1c2Ugc3RyY21wLgorICAgICAgICBmb3VuZCA9IChzdHJjbXAoIGxpYnJhcnlOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoY2hhciAqKWxvYWRlclNlY3Rpb24pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBsb2FkZXJTZWN0aW9uLT5sb2FkZXJTdHJpbmdzT2Zmc2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB0aGlzSW1wb3J0TGlicmFyeS0+bmFtZU9mZnNldCkgPT0gMCk7CisgICAgICAgIC8vICoqKiBSZW1vdmUgQU5TSSBzdHJjbXAgZXZlbnR1YWxseS4KKyAgICAgICAgaWYgKCAhIGZvdW5kICkgeworICAgICAgICAgICAgdGhpc0ltcG9ydExpYnJhcnkgKz0gMTsKKyAgICAgICAgICAgIGxpYnJhcmllc1JlbWFpbmluZyAtPSAxOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGZvdW5kKSB7CisgICAgICAgICppbXBvcnRMaWJyYXJ5ID0gdGhpc0ltcG9ydExpYnJhcnk7CisgICAgICAgIGVyciA9IG5vRXJyOworICAgIH0gZWxzZSB7CisgICAgICAgICppbXBvcnRMaWJyYXJ5ID0gbmlsOworICAgICAgICBlcnIgPSBjZnJhZ05vTGlicmFyeUVycjsKKyAgICB9CisgICAgcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIE9TU3RhdHVzIExvb2t1cFN5bWJvbChDRk1MYXRlSW1wb3J0TG9va3VwUHJvYyBsb29rdXAsIHZvaWQgKnJlZkNvbiwKLQkJCQkJCQlQRUZMb2FkZXJJbmZvSGVhZGVyICpsb2FkZXJTZWN0aW9uLAotCQkJCQkJCVVJbnQzMiBzeW1ib2xJbmRleCwKLQkJCQkJCQlVSW50MzIgKnN5bWJvbFZhbHVlKQotCS8vIFRoaXMgcm91dGluZSBpcyB1c2VkIHRvIGxvb2sgdXAgYSBzeW1ib2wgZHVyaW5nIHJlbG9jYXRpb24uCi0JLy8gImxvb2t1cCIgaXMgYSBjbGllbnQgY2FsbGJhY2sgYW5kIHJlZkNvbiBpcyBpdHMgYXJndW1lbnQuCi0JLy8gVHlwaWNhbGx5IHJlZkNvbiBpcyB0aGUgQ0ZNIGNvbm5lY3Rpb24gdG8gdGhlIGxpYnJhcnkgdGhhdCBpcwotCS8vIHN1YnN0aXR1dGluZyBmb3IgdGhlIHdlYWsgbGlua2VkIGxpYnJhcnkuICBsb2FkZXJTZWN0aW9uCi0JLy8gaXMgYSBwb2ludGVyIHRvIHRoZSBsb2FkZXIgc2VjdGlvbiBvZiB0aGUgZnJhZ21lbnQgdG8gZml4IHVwLgotCS8vIHN5bWJvbEluZGV4IGlzIHRoZSBpbmRleCBvZiB0aGUgaW1wb3J0ZWQgc3ltYm9sIGluIHRoZSBsb2FkZXIgc2VjdGlvbi4KLQkvLyBUaGUgcm91dGluZSBzZXRzIHRoZSB3b3JkIHBvaW50ZWQgdG8gYnkgc3ltYm9sVmFsdWUgdG8gdGhlCi0JLy8gdmFsdWUgb2YgdGhlIHN5bWJvbC4KLQkvLwotCS8vIFRoZSByb3V0aW5lIHdvcmtzIGJ5IHVzaW5nIHN5bWJvbEluZGV4IHRvIGluZGV4IGludG8gdGhlIGltcG9ydGVkCi0JLy8gc3ltYm9sIHRhYmxlIHRvIGZpbmQgdGhlIG9mZnNldCBvZiB0aGUgc3ltYm9sJ3MgbmFtZSBpbiB0aGUgc3RyaW5nCi0JLy8gdGFibGUuICBJdCB0aGVuIGxvb2tzIHVwIHRoZSBzeW1ib2wgYnkgY2FsbGluZyB0aGUgY2xpZW50J3MgImxvb2t1cCIKLQkvLyBmdW5jdGlvbiBhbmQgcGFzc2VzIHRoZSByZXN1bHRpbmcgc3ltYm9sIGFkZHJlc3MgYmFjayBpbiBzeW1ib2xWYWx1ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEVGTG9hZGVySW5mb0hlYWRlciAqbG9hZGVyU2VjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUludDMyIHN5bWJvbEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSW50MzIgKnN5bWJvbFZhbHVlKQorICAgIC8vIFRoaXMgcm91dGluZSBpcyB1c2VkIHRvIGxvb2sgdXAgYSBzeW1ib2wgZHVyaW5nIHJlbG9jYXRpb24uCisgICAgLy8gImxvb2t1cCIgaXMgYSBjbGllbnQgY2FsbGJhY2sgYW5kIHJlZkNvbiBpcyBpdHMgYXJndW1lbnQuCisgICAgLy8gVHlwaWNhbGx5IHJlZkNvbiBpcyB0aGUgQ0ZNIGNvbm5lY3Rpb24gdG8gdGhlIGxpYnJhcnkgdGhhdCBpcworICAgIC8vIHN1YnN0aXR1dGluZyBmb3IgdGhlIHdlYWsgbGlua2VkIGxpYnJhcnkuICBsb2FkZXJTZWN0aW9uCisgICAgLy8gaXMgYSBwb2ludGVyIHRvIHRoZSBsb2FkZXIgc2VjdGlvbiBvZiB0aGUgZnJhZ21lbnQgdG8gZml4IHVwLgorICAgIC8vIHN5bWJvbEluZGV4IGlzIHRoZSBpbmRleCBvZiB0aGUgaW1wb3J0ZWQgc3ltYm9sIGluIHRoZSBsb2FkZXIgc2VjdGlvbi4KKyAgICAvLyBUaGUgcm91dGluZSBzZXRzIHRoZSB3b3JkIHBvaW50ZWQgdG8gYnkgc3ltYm9sVmFsdWUgdG8gdGhlCisgICAgLy8gdmFsdWUgb2YgdGhlIHN5bWJvbC4KKyAgICAvLworICAgIC8vIFRoZSByb3V0aW5lIHdvcmtzIGJ5IHVzaW5nIHN5bWJvbEluZGV4IHRvIGluZGV4IGludG8gdGhlIGltcG9ydGVkCisgICAgLy8gc3ltYm9sIHRhYmxlIHRvIGZpbmQgdGhlIG9mZnNldCBvZiB0aGUgc3ltYm9sJ3MgbmFtZSBpbiB0aGUgc3RyaW5nCisgICAgLy8gdGFibGUuICBJdCB0aGVuIGxvb2tzIHVwIHRoZSBzeW1ib2wgYnkgY2FsbGluZyB0aGUgY2xpZW50J3MgImxvb2t1cCIKKyAgICAvLyBmdW5jdGlvbiBhbmQgcGFzc2VzIHRoZSByZXN1bHRpbmcgc3ltYm9sIGFkZHJlc3MgYmFjayBpbiBzeW1ib2xWYWx1ZS4KIHsKLQlPU1N0YXR1cyAJCQllcnI7Ci0JVUludDMyIAkJCQkqaW1wb3J0U3ltYm9sVGFibGU7Ci0JVUludDMyIAkJCQlzeW1ib2xTdHJpbmdPZmZzZXQ7Ci0JQm9vbGVhbiAJCQlzeW1ib2xJc1dlYWs7Ci0JQ0ZyYWdTeW1ib2xDbGFzcyAJc3ltYm9sQ2xhc3M7Ci0JY2hhciAJCQkJKnN5bWJvbFN0cmluZ0FkZHJlc3M7Ci0JU3RyMjU1IAkJCQlzeW1ib2xTdHJpbmc7Ci0JCi0JTW9yZUFzc2VydFEobG9va3VwICE9IG5pbCk7Ci0JTW9yZUFzc2VydFEobG9hZGVyU2VjdGlvbiAhPSBuaWwpOwotCU1vcmVBc3NlcnRRKHN5bWJvbEluZGV4IDwgbG9hZGVyU2VjdGlvbi0+dG90YWxJbXBvcnRlZFN5bWJvbENvdW50KTsKLQlNb3JlQXNzZXJ0UShzeW1ib2xWYWx1ZSAhPSBuaWwpOwotCQotCS8vIEZpbmQgdGhlIGJhc2Ugb2YgdGhlIGltcG9ydGVkIHN5bWJvbCB0YWJsZS4KLQkKLQlpbXBvcnRTeW1ib2xUYWJsZSA9IChVSW50MzIgKikoKChjaGFyICopKGxvYWRlclNlY3Rpb24gKyAxKSkgKyAobG9hZGVyU2VjdGlvbi0+aW1wb3J0ZWRMaWJyYXJ5Q291bnQgKiBzaXplb2YoUEVGSW1wb3J0ZWRMaWJyYXJ5KSkpOwotCQotCS8vIEdyYWIgdGhlIGFwcHJvcHJpYXRlIGVudHJ5IG91dCBvZiB0aGUgdGFibGUgYW5kCi0JLy8gZXh0cmFjdCB0aGUgaW5mb3JtYXRpb24gZnJvbSB0aGF0IGVudHJ5LgotCQotCXN5bWJvbFN0cmluZ09mZnNldCA9IGltcG9ydFN5bWJvbFRhYmxlW3N5bWJvbEluZGV4XTsKLQlzeW1ib2xDbGFzcyA9IFBFRkltcG9ydGVkU3ltYm9sQ2xhc3Moc3ltYm9sU3RyaW5nT2Zmc2V0KTsKLQlzeW1ib2xJc1dlYWsgPSAoKHN5bWJvbENsYXNzICYga1BFRldlYWtJbXBvcnRTeW1NYXNrKSAhPSAwKTsKLQlzeW1ib2xDbGFzcyA9IHN5bWJvbENsYXNzICYgfmtQRUZXZWFrSW1wb3J0U3ltTWFzazsKLQlzeW1ib2xTdHJpbmdPZmZzZXQgPSBQRUZJbXBvcnRlZFN5bWJvbE5hbWVPZmZzZXQoc3ltYm9sU3RyaW5nT2Zmc2V0KTsKLQkKLQkvLyBGaW5kIHRoZSBzdHJpbmcgZm9yIHRoZSBzeW1ib2wgaW4gdGhlIHN0cmluZ3MgdGFibGUgYW5kCi0JLy8gZXh0cmFjdCBpdCBmcm9tIHRoZSB0YWJsZSBpbnRvIGEgUGFzY2FsIHN0cmluZyBvbiB0aGUgc3RhY2suCi0JCi0Jc3ltYm9sU3RyaW5nQWRkcmVzcyA9ICgoY2hhciAqKWxvYWRlclNlY3Rpb24pICsgbG9hZGVyU2VjdGlvbi0+bG9hZGVyU3RyaW5nc09mZnNldCArIHN5bWJvbFN0cmluZ09mZnNldDsKLQlzeW1ib2xTdHJpbmdbMF0gPSBzdHJsZW4oc3ltYm9sU3RyaW5nQWRkcmVzcyk7CQkvLyAqKiogcmVtb3ZlIEFOU0kgc3RybGVuCi0JQmxvY2tNb3ZlRGF0YShzeW1ib2xTdHJpbmdBZGRyZXNzLCAmc3ltYm9sU3RyaW5nWzFdLCBzeW1ib2xTdHJpbmdbMF0pOwotCQotCS8vIExvb2sgdXAgdGhlIHN5bWJvbCBpbiBzdWJzdGl0dXRlIGxpYnJhcnkuICBJZiBpdCBmYWlscywgcmV0dXJuCi0JLy8gYSAwIHZhbHVlIGFuZCBjaGVjayB3aGV0aGVyIHRoZSBlcnJvciBpcyBmYXRhbCAoYSBzdHJvbmcgbGlua2VkCi0JLy8gc3ltYm9sKSBvciBiZW5pZ24gKGEgd2VhayBsaW5rZWQgc3ltYm9sKS4KLQkKLQllcnIgPSBsb29rdXAoc3ltYm9sU3RyaW5nLCBzeW1ib2xDbGFzcywgKHZvaWQgKiopIHN5bWJvbFZhbHVlLCByZWZDb24pOwotCWlmIChlcnIgIT0gbm9FcnIpIHsKLQkJKnN5bWJvbFZhbHVlID0gMDsKLQkJaWYgKHN5bWJvbElzV2VhaykgewotCQkJZXJyID0gbm9FcnI7Ci0JCX0KLQl9Ci0JcmV0dXJuIGVycjsKKyAgICBPU1N0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnI7CisgICAgVUludDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmltcG9ydFN5bWJvbFRhYmxlOworICAgIFVJbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bWJvbFN0cmluZ09mZnNldDsKKyAgICBCb29sZWFuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2xJc1dlYWs7CisgICAgQ0ZyYWdTeW1ib2xDbGFzcyAgICAgICAgICAgIHN5bWJvbENsYXNzOworICAgIGNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzeW1ib2xTdHJpbmdBZGRyZXNzOworICAgIFN0cjI1NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bWJvbFN0cmluZzsKKworICAgIE1vcmVBc3NlcnRRKGxvb2t1cCAhPSBuaWwpOworICAgIE1vcmVBc3NlcnRRKGxvYWRlclNlY3Rpb24gIT0gbmlsKTsKKyAgICBNb3JlQXNzZXJ0UShzeW1ib2xJbmRleCA8IGxvYWRlclNlY3Rpb24tPnRvdGFsSW1wb3J0ZWRTeW1ib2xDb3VudCk7CisgICAgTW9yZUFzc2VydFEoc3ltYm9sVmFsdWUgIT0gbmlsKTsKKworICAgIC8vIEZpbmQgdGhlIGJhc2Ugb2YgdGhlIGltcG9ydGVkIHN5bWJvbCB0YWJsZS4KKworICAgIGltcG9ydFN5bWJvbFRhYmxlID0gKFVJbnQzMiAqKSgoKGNoYXIgKikobG9hZGVyU2VjdGlvbiArIDEpKSArIChsb2FkZXJTZWN0aW9uLT5pbXBvcnRlZExpYnJhcnlDb3VudCAqIHNpemVvZihQRUZJbXBvcnRlZExpYnJhcnkpKSk7CisKKyAgICAvLyBHcmFiIHRoZSBhcHByb3ByaWF0ZSBlbnRyeSBvdXQgb2YgdGhlIHRhYmxlIGFuZAorICAgIC8vIGV4dHJhY3QgdGhlIGluZm9ybWF0aW9uIGZyb20gdGhhdCBlbnRyeS4KKworICAgIHN5bWJvbFN0cmluZ09mZnNldCA9IGltcG9ydFN5bWJvbFRhYmxlW3N5bWJvbEluZGV4XTsKKyAgICBzeW1ib2xDbGFzcyA9IFBFRkltcG9ydGVkU3ltYm9sQ2xhc3Moc3ltYm9sU3RyaW5nT2Zmc2V0KTsKKyAgICBzeW1ib2xJc1dlYWsgPSAoKHN5bWJvbENsYXNzICYga1BFRldlYWtJbXBvcnRTeW1NYXNrKSAhPSAwKTsKKyAgICBzeW1ib2xDbGFzcyA9IHN5bWJvbENsYXNzICYgfmtQRUZXZWFrSW1wb3J0U3ltTWFzazsKKyAgICBzeW1ib2xTdHJpbmdPZmZzZXQgPSBQRUZJbXBvcnRlZFN5bWJvbE5hbWVPZmZzZXQoc3ltYm9sU3RyaW5nT2Zmc2V0KTsKKworICAgIC8vIEZpbmQgdGhlIHN0cmluZyBmb3IgdGhlIHN5bWJvbCBpbiB0aGUgc3RyaW5ncyB0YWJsZSBhbmQKKyAgICAvLyBleHRyYWN0IGl0IGZyb20gdGhlIHRhYmxlIGludG8gYSBQYXNjYWwgc3RyaW5nIG9uIHRoZSBzdGFjay4KKworICAgIHN5bWJvbFN0cmluZ0FkZHJlc3MgPSAoKGNoYXIgKilsb2FkZXJTZWN0aW9uKSArIGxvYWRlclNlY3Rpb24tPmxvYWRlclN0cmluZ3NPZmZzZXQgKyBzeW1ib2xTdHJpbmdPZmZzZXQ7CisgICAgc3ltYm9sU3RyaW5nWzBdID0gc3RybGVuKHN5bWJvbFN0cmluZ0FkZHJlc3MpOyAgICAgICAgICAgICAgLy8gKioqIHJlbW92ZSBBTlNJIHN0cmxlbgorICAgIEJsb2NrTW92ZURhdGEoc3ltYm9sU3RyaW5nQWRkcmVzcywgJnN5bWJvbFN0cmluZ1sxXSwgc3ltYm9sU3RyaW5nWzBdKTsKKworICAgIC8vIExvb2sgdXAgdGhlIHN5bWJvbCBpbiBzdWJzdGl0dXRlIGxpYnJhcnkuICBJZiBpdCBmYWlscywgcmV0dXJuCisgICAgLy8gYSAwIHZhbHVlIGFuZCBjaGVjayB3aGV0aGVyIHRoZSBlcnJvciBpcyBmYXRhbCAoYSBzdHJvbmcgbGlua2VkCisgICAgLy8gc3ltYm9sKSBvciBiZW5pZ24gKGEgd2VhayBsaW5rZWQgc3ltYm9sKS4KKworICAgIGVyciA9IGxvb2t1cChzeW1ib2xTdHJpbmcsIHN5bWJvbENsYXNzLCAodm9pZCAqKikgc3ltYm9sVmFsdWUsIHJlZkNvbik7CisgICAgaWYgKGVyciAhPSBub0VycikgeworICAgICAgICAqc3ltYm9sVmFsdWUgPSAwOworICAgICAgICBpZiAoc3ltYm9sSXNXZWFrKSB7CisgICAgICAgICAgICBlcnIgPSBub0VycjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZXJyOwogfQogCiAvLyBUaGUgRW5naW5lU3RhdGUgc3RydWN0dXJlIGVuY2Fwc3VsYXRlcyBhbGwgb2YgdGhlIHBlcnNpc3RlbnQgc3RhdGUKQEAgLTc3MSwxMyArNzcxLDEzIEBACiAvLyBpbnN0cnVjdGlvbmFsIGRlc2lnbi4KIAogc3RydWN0IEVuZ2luZVN0YXRlIHsKLQlVSW50MzIgY3VycmVudFJlbG9jOwkJLy8gSW5kZXggb2YgY3VycmVudCByZWxvY2F0aW9uIG9wY29kZXMKLQlVSW50MzIgdGVybWluYXRpbmdSZWxvYzsJLy8gSW5kZXggb2YgcmVsb2NhdGlvbiBvcGNvZGVzIHdoaWNoIHRlcm1pbmF0ZXMgcmVsb2NhdGlvbgotCVVJbnQzMiAqc2VjdGlvbkJhc2U7CQkvLyBTdGFydCBvZiB0aGUgc2VjdGlvbgotCVVJbnQzMiAqcmVsb2NBZGRyZXNzOwkJLy8gQWRkcmVzcyB3aXRoaW4gdGhlIHNlY3Rpb24gd2hlcmUgdGhlIHJlbG9jYXRpb25zIGFyZSB0byBiZSBwZXJmb3JtZWQKLQlVSW50MzIgaW1wb3J0SW5kZXg7CQkJLy8gU3ltYm9sIGluZGV4LCB3aGljaCBpcyB1c2VkIHRvIGFjY2VzcyBhbiBpbXBvcnRlZCBzeW1ib2wncyBhZGRyZXNzCi0Jdm9pZCAgKnNlY3Rpb25DOwkJCS8vIE1lbW9yeSBhZGRyZXNzIG9mIGFuIGluc3RhbnRpYXRlZCBzZWN0aW9uIHdpdGhpbiB0aGUgUEVGIGNvbnRhaW5lcjsgdGhpcyB2YXJpYWJsZSBpcyB1c2VkIGJ5IHJlbG9jYXRpb24gb3Bjb2RlcyB0aGF0IHJlbG9jYXRlIHNlY3Rpb24gYWRkcmVzc2VzCi0Jdm9pZCAgKnNlY3Rpb25EOwkJCS8vIE1lbW9yeSBhZGRyZXNzIG9mIGFuIGluc3RhbnRpYXRlZCBzZWN0aW9uIHdpdGhpbiB0aGUgUEVGIGNvbnRhaW5lcjsgdGhpcyB2YXJpYWJsZSBpcyB1c2VkIGJ5IHJlbG9jYXRpb24gb3Bjb2RlcyB0aGF0IHJlbG9jYXRlIHNlY3Rpb24gYWRkcmVzc2VzCisgICAgVUludDMyIGN1cnJlbnRSZWxvYzsgICAgICAgICAgICAgICAgLy8gSW5kZXggb2YgY3VycmVudCByZWxvY2F0aW9uIG9wY29kZXMKKyAgICBVSW50MzIgdGVybWluYXRpbmdSZWxvYzsgICAgICAgICAgICAvLyBJbmRleCBvZiByZWxvY2F0aW9uIG9wY29kZXMgd2hpY2ggdGVybWluYXRlcyByZWxvY2F0aW9uCisgICAgVUludDMyICpzZWN0aW9uQmFzZTsgICAgICAgICAgICAgICAgLy8gU3RhcnQgb2YgdGhlIHNlY3Rpb24KKyAgICBVSW50MzIgKnJlbG9jQWRkcmVzczsgICAgICAgICAgICAgICAvLyBBZGRyZXNzIHdpdGhpbiB0aGUgc2VjdGlvbiB3aGVyZSB0aGUgcmVsb2NhdGlvbnMgYXJlIHRvIGJlIHBlcmZvcm1lZAorICAgIFVJbnQzMiBpbXBvcnRJbmRleDsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3ltYm9sIGluZGV4LCB3aGljaCBpcyB1c2VkIHRvIGFjY2VzcyBhbiBpbXBvcnRlZCBzeW1ib2wncyBhZGRyZXNzCisgICAgdm9pZCAgKnNlY3Rpb25DOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNZW1vcnkgYWRkcmVzcyBvZiBhbiBpbnN0YW50aWF0ZWQgc2VjdGlvbiB3aXRoaW4gdGhlIFBFRiBjb250YWluZXI7IHRoaXMgdmFyaWFibGUgaXMgdXNlZCBieSByZWxvY2F0aW9uIG9wY29kZXMgdGhhdCByZWxvY2F0ZSBzZWN0aW9uIGFkZHJlc3NlcworICAgIHZvaWQgICpzZWN0aW9uRDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWVtb3J5IGFkZHJlc3Mgb2YgYW4gaW5zdGFudGlhdGVkIHNlY3Rpb24gd2l0aGluIHRoZSBQRUYgY29udGFpbmVyOyB0aGlzIHZhcmlhYmxlIGlzIHVzZWQgYnkgcmVsb2NhdGlvbiBvcGNvZGVzIHRoYXQgcmVsb2NhdGUgc2VjdGlvbiBhZGRyZXNzZXMKIH07CiB0eXBlZGVmIHN0cnVjdCBFbmdpbmVTdGF0ZSBFbmdpbmVTdGF0ZTsKIApAQCAtNzg2LDgzICs3ODYsODMgQEAKIC8vIGhhdmUgdG8gYWRkIGEgcmVwZWF0IGNvdW50ZXIgdG8gRW5naW5lU3RhdGUuCiAKIHN0YXRpYyBPU1N0YXR1cyBJbml0RW5naW5lU3RhdGUoY29uc3QgRnJhZ1RvRml4SW5mbyAqZnJhZ1RvRml4LAotCQkJCQkJCQlVSW50MTYgcmVsb2NIZWFkZXJJbmRleCwKLQkJCQkJCQkJRW5naW5lU3RhdGUgKnN0YXRlKQotCS8vIFRoaXMgcm91dGluZSBpbml0aWFsaXNlcyB0aGUgZW5naW5lIHN0YXRlIHN1aXRhYmx5IGZvcgotCS8vIHJ1bm5pbmcgdGhlIHJlbG9jYXRpb24gb3Bjb2RlcyBmb3IgdGhlIHNlY3Rpb24gd2hvc2UKLQkvLyBpbmRleCBpcyByZWxvY0hlYWRlckluZGV4LiAgcmVsb2NIZWFkZXJJbmRleCBpcyBub3QgYQotCS8vIGEgc2VjdGlvbiBudW1iZXIuICBTZWUgdGhlIGNvbW1lbnQgd2hlcmUgaXQncyB1c2VkIGJlbG93Ci0JLy8gZm9yIGRldGFpbHMuICBUaGUgcm91dGluZSBiYXNpY2FsbHkgZmlsbHMgb3V0IGFsbCB0aGUgZmllbGRzCi0JLy8gaW4gdGhlIEVuZ2luZVN0YXRlIHN0cnVjdHVyZSBhcyBkZXNjcmliZWQgYnkKLQkvLyAiTWFjIE9TIFJ1bnRpbWUgQXJjaGl0ZWN0dXJlcyIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUludDE2IHJlbG9jSGVhZGVySW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5naW5lU3RhdGUgKnN0YXRlKQorICAgIC8vIFRoaXMgcm91dGluZSBpbml0aWFsaXNlcyB0aGUgZW5naW5lIHN0YXRlIHN1aXRhYmx5IGZvcgorICAgIC8vIHJ1bm5pbmcgdGhlIHJlbG9jYXRpb24gb3Bjb2RlcyBmb3IgdGhlIHNlY3Rpb24gd2hvc2UKKyAgICAvLyBpbmRleCBpcyByZWxvY0hlYWRlckluZGV4LiAgcmVsb2NIZWFkZXJJbmRleCBpcyBub3QgYQorICAgIC8vIGEgc2VjdGlvbiBudW1iZXIuICBTZWUgdGhlIGNvbW1lbnQgd2hlcmUgaXQncyB1c2VkIGJlbG93CisgICAgLy8gZm9yIGRldGFpbHMuICBUaGUgcm91dGluZSBiYXNpY2FsbHkgZmlsbHMgb3V0IGFsbCB0aGUgZmllbGRzCisgICAgLy8gaW4gdGhlIEVuZ2luZVN0YXRlIHN0cnVjdHVyZSBhcyBkZXNjcmliZWQgYnkKKyAgICAvLyAiTWFjIE9TIFJ1bnRpbWUgQXJjaGl0ZWN0dXJlcyIuCiB7Ci0JT1NTdGF0dXMgZXJyOwotCVBFRkxvYWRlclJlbG9jYXRpb25IZWFkZXIgKnJlbG9jSGVhZGVyOwotCQotCU1vcmVBc3NlcnRRKGZyYWdUb0ZpeCAhPSBuaWwpOwotCU1vcmVBc3NlcnRRKHN0YXRlICE9IG5pbCk7CisgICAgT1NTdGF0dXMgZXJyOworICAgIFBFRkxvYWRlclJlbG9jYXRpb25IZWFkZXIgKnJlbG9jSGVhZGVyOwogCi0JLy8gVGhpcyBiaXQgaXMgdHJpY2t5LiAgcmVsb2NIZWFkZXJJbmRleCBpcyBhbiBpbmRleCBpbnRvIHRoZSByZWxvY2F0aW9uCi0JLy8gaGVhZGVyIHRhYmxlLCBzdGFydGluZyBhdCByZWxvY1NlY3Rpb25Db3VudCAod2hpY2ggaXMgaW4gdGhlIGxvYWRlcgotCS8vIHNlY3Rpb24gaGVhZGVyKSBmb3IgdGhlIGZpcnN0IHJlbG9jYXRlZCBzZWN0aW9uIGFuZCBkZWNyZW1lbnRpbmcKLQkvLyBkb3duIHRvIDEgZm9yIHRoZSBsYXN0IHJlbG9jYXRlZCBzZWN0aW9uLiAgSSBmaW5kIHRoZSByZWxvY2F0aW9uCi0JLy8gaGVhZGVyIGJ5IHVzaW5nIHJlbG9jSGVhZGVySW5kZXggYXMgYSBpbmRleCBiYWNrd2FyZHMgZnJvbSB0aGUKLQkvLyBzdGFydCBvZiB0aGUgcmVsb2NhdGlvbiBvcGNvZGVzIChpZSByZWxvY0luc3RyT2Zmc2V0KS4gIElmIHlvdQotCS8vIGxvb2sgYXQgdGhlIGRpYWdyYW0gb2YgdGhlIGxheW91dCBvZiB0aGUgY29udGFpbmVyIGluCi0JLy8gIlBFRkJpbmFyeUZvcm1hdC5oIiwgeW91J2xsIHNlZSB0aGF0IHRoZSByZWxvY2F0aW9uIG9wY29kZXMKLQkvLyBpbW1lZGlhdGVseSBmb2xsb3cgdGhlIHJlbG9jYXRpb24gaGVhZGVycy4KLQkvLwotCS8vIEkgZGlkIHRoaXMgYmVjYXVzZSB0aGUgYWx0ZXJuYXRpdmUgKHN0YXJ0aW5nIGF0IHRoZSBsb2FkZXIKLQkvLyBoZWFkZXIgYW5kIHN0ZXBwaW5nIHBhc3QgdGhlIGltcG9ydCBsaWJyYXJ5IHRhYmxlIGFuZCB0aGUKLQkvLyBpbXBvcnQgc3ltYm9sIHRhYmxlKSB3YXMgYSBwYWluLgorICAgIE1vcmVBc3NlcnRRKGZyYWdUb0ZpeCAhPSBuaWwpOworICAgIE1vcmVBc3NlcnRRKHN0YXRlICE9IG5pbCk7CiAKLQlyZWxvY0hlYWRlciA9IChQRUZMb2FkZXJSZWxvY2F0aW9uSGVhZGVyICopICgoKGNoYXIgKikgZnJhZ1RvRml4LT5sb2FkZXJTZWN0aW9uKSArIGZyYWdUb0ZpeC0+bG9hZGVyU2VjdGlvbi0+cmVsb2NJbnN0ck9mZnNldCAtIHJlbG9jSGVhZGVySW5kZXggKiBzaXplb2YoUEVGTG9hZGVyUmVsb2NhdGlvbkhlYWRlcikpOwotCQotCU1vcmVBc3NlcnRRKHJlbG9jSGVhZGVyLT5yZXNlcnZlZEEgPT0gMCk7CQkvLyBQRUYgc3BlYyBzYXlzIGl0IG11c3QgYmU7IHdlIGNoZWNrIHRvIHRyeSB0byBjYXRjaCBidWdzIGluIGNhbGN1bGF0aW9uIG9mIHJlbG9jSGVhZGVyCi0JCi0Jc3RhdGUtPmN1cnJlbnRSZWxvYyA9IHJlbG9jSGVhZGVyLT5maXJzdFJlbG9jT2Zmc2V0OwotCXN0YXRlLT50ZXJtaW5hdGluZ1JlbG9jID0gcmVsb2NIZWFkZXItPmZpcnN0UmVsb2NPZmZzZXQgKyByZWxvY0hlYWRlci0+cmVsb2NDb3VudDsKLQlzdGF0ZS0+c2VjdGlvbkJhc2UgPSAoVUludDMyICopIEdldFNlY3Rpb25CYXNlQWRkcmVzcyhmcmFnVG9GaXgsIHJlbG9jSGVhZGVyLT5zZWN0aW9uSW5kZXgpOwotCXN0YXRlLT5yZWxvY0FkZHJlc3MgPSBzdGF0ZS0+c2VjdGlvbkJhc2U7Ci0Jc3RhdGUtPmltcG9ydEluZGV4ID0gMDsKKyAgICAvLyBUaGlzIGJpdCBpcyB0cmlja3kuICByZWxvY0hlYWRlckluZGV4IGlzIGFuIGluZGV4IGludG8gdGhlIHJlbG9jYXRpb24KKyAgICAvLyBoZWFkZXIgdGFibGUsIHN0YXJ0aW5nIGF0IHJlbG9jU2VjdGlvbkNvdW50ICh3aGljaCBpcyBpbiB0aGUgbG9hZGVyCisgICAgLy8gc2VjdGlvbiBoZWFkZXIpIGZvciB0aGUgZmlyc3QgcmVsb2NhdGVkIHNlY3Rpb24gYW5kIGRlY3JlbWVudGluZworICAgIC8vIGRvd24gdG8gMSBmb3IgdGhlIGxhc3QgcmVsb2NhdGVkIHNlY3Rpb24uICBJIGZpbmQgdGhlIHJlbG9jYXRpb24KKyAgICAvLyBoZWFkZXIgYnkgdXNpbmcgcmVsb2NIZWFkZXJJbmRleCBhcyBhIGluZGV4IGJhY2t3YXJkcyBmcm9tIHRoZQorICAgIC8vIHN0YXJ0IG9mIHRoZSByZWxvY2F0aW9uIG9wY29kZXMgKGllIHJlbG9jSW5zdHJPZmZzZXQpLiAgSWYgeW91CisgICAgLy8gbG9vayBhdCB0aGUgZGlhZ3JhbSBvZiB0aGUgbGF5b3V0IG9mIHRoZSBjb250YWluZXIgaW4KKyAgICAvLyAiUEVGQmluYXJ5Rm9ybWF0LmgiLCB5b3UnbGwgc2VlIHRoYXQgdGhlIHJlbG9jYXRpb24gb3Bjb2RlcworICAgIC8vIGltbWVkaWF0ZWx5IGZvbGxvdyB0aGUgcmVsb2NhdGlvbiBoZWFkZXJzLgorICAgIC8vCisgICAgLy8gSSBkaWQgdGhpcyBiZWNhdXNlIHRoZSBhbHRlcm5hdGl2ZSAoc3RhcnRpbmcgYXQgdGhlIGxvYWRlcgorICAgIC8vIGhlYWRlciBhbmQgc3RlcHBpbmcgcGFzdCB0aGUgaW1wb3J0IGxpYnJhcnkgdGFibGUgYW5kIHRoZQorICAgIC8vIGltcG9ydCBzeW1ib2wgdGFibGUpIHdhcyBhIHBhaW4uCiAKLQkvLyBGcm9tICJNYWMgT1MgUnVudGltZSBBcmNoaXRlY3R1cmVzIjoKLQkvLwotCS8vIFRoZSBzZWN0aW9uQyBhbmQgc2VjdGlvbkQgdmFyaWFibGVzIGFjdHVhbGx5IGNvbnRhaW4gdGhlCi0JLy8gbWVtb3J5IGFkZHJlc3Mgb2YgYW4gaW5zdGFudGlhdGVkIHNlY3Rpb24gbWludXMgdGhlCi0JLy8gZGVmYXVsdCBhZGRyZXNzIGZvciB0aGF0IHNlY3Rpb24uIFRoZSBkZWZhdWx0IGFkZHJlc3MgZm9yIGEKLQkvLyBzZWN0aW9uIGlzIGNvbnRhaW5lZCBpbiB0aGUgZGVmYXVsdEFkZHJlc3MgZmllbGQgb2YgdGhlCi0JLy8gc2VjdGlvbiBoZWFkZXIuIEhvd2V2ZXIsIGluIGFsbW9zdCBhbGwgY2FzZXMgdGhlIGRlZmF1bHQKLQkvLyBhZGRyZXNzIHNob3VsZCBiZSAwLCBzbyB0aGUgc2ltcGxpZmllZCBkZWZpbml0aW9uIHN1ZmZpY2VzLgotCS8vIAotCS8vIEluIHRoZSBkZWJ1ZyB2ZXJzaW9uLCB3ZSBkcm9wIGludG8gTWFjc0J1ZyBpZiB0aGlzIHdlaXJkIGNhc2UKLQkvLyBldmVyIGV4ZWN1dGVzIGJlY2F1c2UgaXQncyBtb3JlIGxpa2VseSB3ZSBtYWRlIGEgbWlzdGFrZSB0aGFuCi0JLy8gd2UgZW5jb3VudGVyZWQgYSBzZWN0aW9uIHdpdGggYSBkZWZhdWx0IGFkZHJlc3MuCisgICAgcmVsb2NIZWFkZXIgPSAoUEVGTG9hZGVyUmVsb2NhdGlvbkhlYWRlciAqKSAoKChjaGFyICopIGZyYWdUb0ZpeC0+bG9hZGVyU2VjdGlvbikgKyBmcmFnVG9GaXgtPmxvYWRlclNlY3Rpb24tPnJlbG9jSW5zdHJPZmZzZXQgLSByZWxvY0hlYWRlckluZGV4ICogc2l6ZW9mKFBFRkxvYWRlclJlbG9jYXRpb25IZWFkZXIpKTsKIAotCXN0YXRlLT5zZWN0aW9uQyA9IEdldFNlY3Rpb25CYXNlQWRkcmVzcyhmcmFnVG9GaXgsIDApOwotCWlmIChzdGF0ZS0+c2VjdGlvbkMgIT0gbmlsKSB7Ci0JCSNpZiBNT1JFX0RFQlVHCi0JCQlpZiAoZnJhZ1RvRml4LT5zZWN0aW9uSGVhZGVyc1swXS5kZWZhdWx0QWRkcmVzcyAhPSAwKSB7Ci0JCQkJRGVidWdTdHIoIlxwSW5pdEVuZ2luZVN0YXRlOiBFeGVjdXRpbmcgd2VpcmQgY2FzZS4iKTsKLQkJCX0KLQkJI2VuZGlmCi0JCShjaGFyICopIHN0YXRlLT5zZWN0aW9uQyAtPSBmcmFnVG9GaXgtPnNlY3Rpb25IZWFkZXJzWzBdLmRlZmF1bHRBZGRyZXNzOwotCX0KLQlzdGF0ZS0+c2VjdGlvbkQgPSBHZXRTZWN0aW9uQmFzZUFkZHJlc3MoZnJhZ1RvRml4LCAxKTsKLQlpZiAoc3RhdGUtPnNlY3Rpb25EICE9IG5pbCkgewotCQkjaWYgTU9SRV9ERUJVRwotCQkJaWYgKGZyYWdUb0ZpeC0+c2VjdGlvbkhlYWRlcnNbMV0uZGVmYXVsdEFkZHJlc3MgIT0gMCkgewotCQkJCURlYnVnU3RyKCJccEluaXRFbmdpbmVTdGF0ZTogRXhlY3V0aW5nIHdlaXJkIGNhc2UuIik7Ci0JCQl9Ci0JCSNlbmRpZgotCQkoY2hhciAqKSBzdGF0ZS0+c2VjdGlvbkQgLT0gZnJhZ1RvRml4LT5zZWN0aW9uSGVhZGVyc1sxXS5kZWZhdWx0QWRkcmVzczsKLQl9CisgICAgTW9yZUFzc2VydFEocmVsb2NIZWFkZXItPnJlc2VydmVkQSA9PSAwKTsgICAgICAgICAgICAgICAgICAgLy8gUEVGIHNwZWMgc2F5cyBpdCBtdXN0IGJlOyB3ZSBjaGVjayB0byB0cnkgdG8gY2F0Y2ggYnVncyBpbiBjYWxjdWxhdGlvbiBvZiByZWxvY0hlYWRlcgogCi0JZXJyID0gbm9FcnI7Ci0JaWYgKHN0YXRlLT5yZWxvY0FkZHJlc3MgPT0gbmlsKSB7Ci0JCWVyciA9IGNmcmFnRnJhZ21lbnRVc2FnZUVycjsKLQl9Ci0JcmV0dXJuIGVycjsKKyAgICBzdGF0ZS0+Y3VycmVudFJlbG9jID0gcmVsb2NIZWFkZXItPmZpcnN0UmVsb2NPZmZzZXQ7CisgICAgc3RhdGUtPnRlcm1pbmF0aW5nUmVsb2MgPSByZWxvY0hlYWRlci0+Zmlyc3RSZWxvY09mZnNldCArIHJlbG9jSGVhZGVyLT5yZWxvY0NvdW50OworICAgIHN0YXRlLT5zZWN0aW9uQmFzZSA9IChVSW50MzIgKikgR2V0U2VjdGlvbkJhc2VBZGRyZXNzKGZyYWdUb0ZpeCwgcmVsb2NIZWFkZXItPnNlY3Rpb25JbmRleCk7CisgICAgc3RhdGUtPnJlbG9jQWRkcmVzcyA9IHN0YXRlLT5zZWN0aW9uQmFzZTsKKyAgICBzdGF0ZS0+aW1wb3J0SW5kZXggPSAwOworCisgICAgLy8gRnJvbSAiTWFjIE9TIFJ1bnRpbWUgQXJjaGl0ZWN0dXJlcyI6CisgICAgLy8KKyAgICAvLyBUaGUgc2VjdGlvbkMgYW5kIHNlY3Rpb25EIHZhcmlhYmxlcyBhY3R1YWxseSBjb250YWluIHRoZQorICAgIC8vIG1lbW9yeSBhZGRyZXNzIG9mIGFuIGluc3RhbnRpYXRlZCBzZWN0aW9uIG1pbnVzIHRoZQorICAgIC8vIGRlZmF1bHQgYWRkcmVzcyBmb3IgdGhhdCBzZWN0aW9uLiBUaGUgZGVmYXVsdCBhZGRyZXNzIGZvciBhCisgICAgLy8gc2VjdGlvbiBpcyBjb250YWluZWQgaW4gdGhlIGRlZmF1bHRBZGRyZXNzIGZpZWxkIG9mIHRoZQorICAgIC8vIHNlY3Rpb24gaGVhZGVyLiBIb3dldmVyLCBpbiBhbG1vc3QgYWxsIGNhc2VzIHRoZSBkZWZhdWx0CisgICAgLy8gYWRkcmVzcyBzaG91bGQgYmUgMCwgc28gdGhlIHNpbXBsaWZpZWQgZGVmaW5pdGlvbiBzdWZmaWNlcy4KKyAgICAvLworICAgIC8vIEluIHRoZSBkZWJ1ZyB2ZXJzaW9uLCB3ZSBkcm9wIGludG8gTWFjc0J1ZyBpZiB0aGlzIHdlaXJkIGNhc2UKKyAgICAvLyBldmVyIGV4ZWN1dGVzIGJlY2F1c2UgaXQncyBtb3JlIGxpa2VseSB3ZSBtYWRlIGEgbWlzdGFrZSB0aGFuCisgICAgLy8gd2UgZW5jb3VudGVyZWQgYSBzZWN0aW9uIHdpdGggYSBkZWZhdWx0IGFkZHJlc3MuCisKKyAgICBzdGF0ZS0+c2VjdGlvbkMgPSBHZXRTZWN0aW9uQmFzZUFkZHJlc3MoZnJhZ1RvRml4LCAwKTsKKyAgICBpZiAoc3RhdGUtPnNlY3Rpb25DICE9IG5pbCkgeworICAgICAgICAjaWYgTU9SRV9ERUJVRworICAgICAgICAgICAgaWYgKGZyYWdUb0ZpeC0+c2VjdGlvbkhlYWRlcnNbMF0uZGVmYXVsdEFkZHJlc3MgIT0gMCkgeworICAgICAgICAgICAgICAgIERlYnVnU3RyKCJccEluaXRFbmdpbmVTdGF0ZTogRXhlY3V0aW5nIHdlaXJkIGNhc2UuIik7CisgICAgICAgICAgICB9CisgICAgICAgICNlbmRpZgorICAgICAgICAoY2hhciAqKSBzdGF0ZS0+c2VjdGlvbkMgLT0gZnJhZ1RvRml4LT5zZWN0aW9uSGVhZGVyc1swXS5kZWZhdWx0QWRkcmVzczsKKyAgICB9CisgICAgc3RhdGUtPnNlY3Rpb25EID0gR2V0U2VjdGlvbkJhc2VBZGRyZXNzKGZyYWdUb0ZpeCwgMSk7CisgICAgaWYgKHN0YXRlLT5zZWN0aW9uRCAhPSBuaWwpIHsKKyAgICAgICAgI2lmIE1PUkVfREVCVUcKKyAgICAgICAgICAgIGlmIChmcmFnVG9GaXgtPnNlY3Rpb25IZWFkZXJzWzFdLmRlZmF1bHRBZGRyZXNzICE9IDApIHsKKyAgICAgICAgICAgICAgICBEZWJ1Z1N0cigiXHBJbml0RW5naW5lU3RhdGU6IEV4ZWN1dGluZyB3ZWlyZCBjYXNlLiIpOworICAgICAgICAgICAgfQorICAgICAgICAjZW5kaWYKKyAgICAgICAgKGNoYXIgKikgc3RhdGUtPnNlY3Rpb25EIC09IGZyYWdUb0ZpeC0+c2VjdGlvbkhlYWRlcnNbMV0uZGVmYXVsdEFkZHJlc3M7CisgICAgfQorCisgICAgZXJyID0gbm9FcnI7CisgICAgaWYgKHN0YXRlLT5yZWxvY0FkZHJlc3MgPT0gbmlsKSB7CisgICAgICAgIGVyciA9IGNmcmFnRnJhZ21lbnRVc2FnZUVycjsKKyAgICB9CisgICAgcmV0dXJuIGVycjsKIH0KIAogLy8ga1BFRlJlbG9jQmFzaWNPcGNvZGVzIGlzIGEgdGFibGUgdGhhdCBtYXBzIHRoZSB0b3AgNyBiaXRzIG9mIHRoZSBvcGNvZGUKQEAgLTg3MSw0OTAgKzg3MSw0OTAgQEAKIAogc3RhdGljIFVJbnQ4IGtQRUZSZWxvY0Jhc2ljT3Bjb2Rlc1trUEVGUmVsb2NCYXNpY09wY29kZVJhbmdlXSA9IHsgUEVGTWFza2VkQmFzaWNPcGNvZGVzIH07CiAKLXN0YXRpYyBPU1N0YXR1cyBSdW5SZWxvY2F0aW9uRW5naW5lKGNvbnN0IEZyYWdUb0ZpeEluZm8gKmZyYWdUb0ZpeCwgCi0JCQkJCQkJCQkJUEVGSW1wb3J0ZWRMaWJyYXJ5ICAqaW1wb3J0TGlicmFyeSwgCi0JCQkJCQkJCQkJQ0ZNTGF0ZUltcG9ydExvb2t1cFByb2MgbG9va3VwLCB2b2lkICpyZWZDb24pCi0JLy8gVGhpcyBpcyB3aGVyZSB0aGUgcnViYmVyIHJlYWxseSBoaXRzIHRoZS4gIEdpdmVuIGEgZnVsbHkKLQkvLyBwb3B1bGF0ZWQgZnJhZ1RvRml4IHN0cnVjdHVyZSwgdGhlIGltcG9ydCBsaWJyYXJ5IGRlc2NyaXB0aW9uCi0JLy8gb2YgdGhlIHdlYWsgaW1wb3J0ZWQgbGlicmFyeSB3ZSdyZSByZXNvbHZpbmcsIGFuZCBhIGNvbm5lY3Rpb24KLQkvLyB0byB0aGUgbGlicmFyeSB3ZSdyZSBnb2luZyB0byBzdWJzdGl0dXRlIGl0LCByZS1leGVjdXRlIHRoZQotCS8vIHJlbG9jYXRpb24gaW5zdHJ1Y3Rpb25zIChDRk0gaGFzIGFscmVhZHkgZXhlY3V0ZWQgdGhlbSBvbmNlKQotCS8vIGJ1dCBvbmx5ICpkbyogaW5zdHJ1Y3Rpb25zIChpZSBzdG9yZSB0aGUgY2hhbmdlIHRvIHRoZSBkYXRhIHNlY3Rpb24pCi0JLy8gdGhhdCBDRk0gc2tpcHBlZCBiZWNhdXNlIHRoZSB3ZWFrIHN5bWJvbHMgd2VyZSBtaXNzaW5nLgorc3RhdGljIE9TU3RhdHVzIFJ1blJlbG9jYXRpb25FbmdpbmUoY29uc3QgRnJhZ1RvRml4SW5mbyAqZnJhZ1RvRml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQRUZJbXBvcnRlZExpYnJhcnkgICppbXBvcnRMaWJyYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRk1MYXRlSW1wb3J0TG9va3VwUHJvYyBsb29rdXAsIHZvaWQgKnJlZkNvbikKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHRoZSBydWJiZXIgcmVhbGx5IGhpdHMgdGhlLiAgR2l2ZW4gYSBmdWxseQorICAgIC8vIHBvcHVsYXRlZCBmcmFnVG9GaXggc3RydWN0dXJlLCB0aGUgaW1wb3J0IGxpYnJhcnkgZGVzY3JpcHRpb24KKyAgICAvLyBvZiB0aGUgd2VhayBpbXBvcnRlZCBsaWJyYXJ5IHdlJ3JlIHJlc29sdmluZywgYW5kIGEgY29ubmVjdGlvbgorICAgIC8vIHRvIHRoZSBsaWJyYXJ5IHdlJ3JlIGdvaW5nIHRvIHN1YnN0aXR1dGUgaXQsIHJlLWV4ZWN1dGUgdGhlCisgICAgLy8gcmVsb2NhdGlvbiBpbnN0cnVjdGlvbnMgKENGTSBoYXMgYWxyZWFkeSBleGVjdXRlZCB0aGVtIG9uY2UpCisgICAgLy8gYnV0IG9ubHkgKmRvKiBpbnN0cnVjdGlvbnMgKGllIHN0b3JlIHRoZSBjaGFuZ2UgdG8gdGhlIGRhdGEgc2VjdGlvbikKKyAgICAvLyB0aGF0IENGTSBza2lwcGVkIGJlY2F1c2UgdGhlIHdlYWsgc3ltYm9scyB3ZXJlIG1pc3NpbmcuCiB7Ci0JT1NTdGF0dXMgCWVycjsKLQlFbmdpbmVTdGF0ZQlzdGF0ZTsKLQlVSW50MTYgCQlzZWN0aW9uc0xlZnRUb1JlbG9jYXRlOwotCVVJbnQzMiAJCXRvdGFsUmVsb2NzOwotCVVJbnQxNgkJKnJlbG9jSW5zdHJUYWJsZTsKLQlVSW50MTYgCQlvcENvZGU7Ci0JCi0JTW9yZUFzc2VydFEoZnJhZ1RvRml4ICE9IG5pbCk7Ci0JTW9yZUFzc2VydFEoZnJhZ1RvRml4LT5jb250YWluZXJIZWFkZXIudGFnMSA9PSBrUEVGVGFnMSk7Ci0JTW9yZUFzc2VydFEoZnJhZ1RvRml4LT5zZWN0aW9uSGVhZGVycyAhPSBuaWwpOwotCU1vcmVBc3NlcnRRKGZyYWdUb0ZpeC0+bG9hZGVyU2VjdGlvbiAhPSBuaWwpOwotCU1vcmVBc3NlcnRRKGZyYWdUb0ZpeC0+c2VjdGlvbjBCYXNlICE9IG5pbCk7CS8vIFRlY2huaWNhbGx5LCBoYXZpbmcgYSBuaWwgZm9yIHRoZXNlIHR3byBpcyBub3QgYSBwcm9ibGVtLCAuLi4KLQlNb3JlQXNzZXJ0UShmcmFnVG9GaXgtPnNlY3Rpb24xQmFzZSAhPSBuaWwpOwkvLyBidXQgaW4gcHJhY3Rpc2UgaXQgYSB3aWxkbHkgZGV2aWFudCBjYXNlIGFuZCB3ZSBzaG91bGQga25vdyBhYm91dCBpdC4KLQlNb3JlQXNzZXJ0UShpbXBvcnRMaWJyYXJ5ICE9IG5pbCk7Ci0JTW9yZUFzc2VydFEobG9va3VwICE9IG5pbCk7CisgICAgT1NTdGF0dXMgICAgICAgICAgICBlcnI7CisgICAgRW5naW5lU3RhdGUgICAgICAgICBzdGF0ZTsKKyAgICBVSW50MTYgICAgICAgICAgICAgIHNlY3Rpb25zTGVmdFRvUmVsb2NhdGU7CisgICAgVUludDMyICAgICAgICAgICAgICB0b3RhbFJlbG9jczsKKyAgICBVSW50MTYgICAgICAgICAgICAgICpyZWxvY0luc3RyVGFibGU7CisgICAgVUludDE2ICAgICAgICAgICAgICBvcENvZGU7CiAKLQkvLyBCZWZvcmUgZW50ZXJpbmcgdGhlIGxvb3AsIHdvcmsgb3V0IHNvbWUgaW5mb3JtYXRpb24gaW4gYWR2YW5jZS4KKyAgICBNb3JlQXNzZXJ0UShmcmFnVG9GaXggIT0gbmlsKTsKKyAgICBNb3JlQXNzZXJ0UShmcmFnVG9GaXgtPmNvbnRhaW5lckhlYWRlci50YWcxID09IGtQRUZUYWcxKTsKKyAgICBNb3JlQXNzZXJ0UShmcmFnVG9GaXgtPnNlY3Rpb25IZWFkZXJzICE9IG5pbCk7CisgICAgTW9yZUFzc2VydFEoZnJhZ1RvRml4LT5sb2FkZXJTZWN0aW9uICE9IG5pbCk7CisgICAgTW9yZUFzc2VydFEoZnJhZ1RvRml4LT5zZWN0aW9uMEJhc2UgIT0gbmlsKTsgICAgICAgIC8vIFRlY2huaWNhbGx5LCBoYXZpbmcgYSBuaWwgZm9yIHRoZXNlIHR3byBpcyBub3QgYSBwcm9ibGVtLCAuLi4KKyAgICBNb3JlQXNzZXJ0UShmcmFnVG9GaXgtPnNlY3Rpb24xQmFzZSAhPSBuaWwpOyAgICAgICAgLy8gYnV0IGluIHByYWN0aXNlIGl0IGEgd2lsZGx5IGRldmlhbnQgY2FzZSBhbmQgd2Ugc2hvdWxkIGtub3cgYWJvdXQgaXQuCisgICAgTW9yZUFzc2VydFEoaW1wb3J0TGlicmFyeSAhPSBuaWwpOworICAgIE1vcmVBc3NlcnRRKGxvb2t1cCAhPSBuaWwpOwogCi0JLy8gdG90YWxSZWxvY3MgaXMgb25seSB1c2VkIGZvciBkZWJ1Z2dpbmcsIHRvIG1ha2Ugc3VyZSBvdXIKLQkvLyByZWxvY2F0aW9uIFBDIChzdGF0ZS5jdXJyZW50UmVsb2MpIGRvZXNuJ3QgcnVuIHdpbGQuCi0JCi0JdG90YWxSZWxvY3MgPSAoZnJhZ1RvRml4LT5sb2FkZXJTZWN0aW9uLT5sb2FkZXJTdHJpbmdzT2Zmc2V0IC0gZnJhZ1RvRml4LT5sb2FkZXJTZWN0aW9uLT5yZWxvY0luc3RyT2Zmc2V0KSAvIHNpemVvZihVSW50MTYpOwotCQotCS8vIHJlbG9jSW5zdHJUYWJsZSBpcyB0aGUgYmFzZSBhZGRyZXNzIG9mIHRoZSB0YWJsZSBvZiByZWxvY2F0aW9uCi0JLy8gaW5zdHJ1Y3Rpb25zIGluIHRoZSBmcmFnbWVudCB0byBmaXguCi0JCi0JcmVsb2NJbnN0clRhYmxlID0gKFVJbnQxNiAqKSgoY2hhciAqKSBmcmFnVG9GaXgtPmxvYWRlclNlY3Rpb24gKyBmcmFnVG9GaXgtPmxvYWRlclNlY3Rpb24tPnJlbG9jSW5zdHJPZmZzZXQpOwotCQotCS8vIHNlY3Rpb25zTGVmdFRvUmVsb2NhdGUgaXMgdGhlIGxvb3AgY291bnRlciBmb3IgdGhlIG91dGVyIGxvb3AuCi0JCi0JTW9yZUFzc2VydFEoZnJhZ1RvRml4LT5sb2FkZXJTZWN0aW9uLT5yZWxvY1NlY3Rpb25Db3VudCA8PSAweDBGRkZGKTsKLQlzZWN0aW9uc0xlZnRUb1JlbG9jYXRlID0gZnJhZ1RvRml4LT5sb2FkZXJTZWN0aW9uLT5yZWxvY1NlY3Rpb25Db3VudDsKKyAgICAvLyBCZWZvcmUgZW50ZXJpbmcgdGhlIGxvb3AsIHdvcmsgb3V0IHNvbWUgaW5mb3JtYXRpb24gaW4gYWR2YW5jZS4KIAotCS8vIE5vdyBsZXQncyBydW4gdGhlIHJlbG9jYXRpb24gZW5naW5lLiAgV2UgcnVuIGl0IG9uY2UgcGVyCi0JLy8gc2VjdGlvbiBpbiB0aGUgdGFibGUuICBFYWNoIHRpbWUgYXJvdW5kLCB3ZSBpbml0IHRoZSBlbmdpbmUKLQkvLyBhbmQgdGhlbiBsb29wIGFnYWluLCB0aGlzIHRpbWUgZXhlY3V0aW5nIGluZGl2aWR1YWwgb3Bjb2Rlcy4KLQkvLyBUaGUgb3Bjb2RlIGxvb3AgdGVybWluYXRlcyB3aGVuIHRoZSByZWxvY2F0aW9uIFBDCi0JLy8gKHN0YXRlLmN1cnJlbnRSZWxvYykgaGl0cyB0aGUgZmluYWwgb3Bjb2RlIChzdGF0ZS50ZXJtaW5hdGluZ1JlbG9jKS4KLQkKLQkvLyBOb3RlOgotCS8vIE9uZSBkZXNpZ24gZGVjaXNpb24gSSBtYWRlIHdhcyB0byB0b3RhbGx5IHJlLWluaXQgdGhlIGVuZ2luZSBzdGF0ZQotCS8vIGZvciBlYWNoIHNlY3Rpb24uICBUaGUgQ0ZNIHNwZWMgaXMgdW5jbGVhciBhcyB0byB3aGV0aGVyIHlvdSdyZSBzdXBwb3NlZAotCS8vIHRvIHRvdGFsbHkgcmUtaW5pdCB0aGUgZW5naW5lIHN0YXRlLCBvciBqdXN0IHJlLWluaXQgdGhlIHNlY3Rpb24tc3BlY2lmaWMKLQkvLyBzdGF0ZSAoaWUgY3VycmVudFJlbG9jLCB0ZXJtaW5hdGluZ1JlbG9jLCBhbmQgcmVsb2NBZGRyZXNzKS4gIEkgaG9wZSB0aGlzCi0JLy8gaXMgY29ycmVjdCwgYnV0IGl0J3MgaGFyZCB0byB0ZXN0IHdpdGhvdXQgaGF2aW5nIGEgZnJhZ21lbnQgd2l0aCBtdWx0aXBsZQotCS8vIHJlbG9jYXRlZCBzZWN0aW9ucywgd2hpY2ggaXMgZGlmZmljdWx0IHRvIGNyZWF0ZS4KLQkKLQkvLyBIb3cgZG8gSSBkZWNpZGUgd2hpY2ggb3Bjb2RlcyBzaG91bGQgYmUgZWZmZWN0aXZlIChpZSBtYWtlIGNoYW5nZXMgdG8KLQkvLyB0aGUgc2VjdGlvbiBiZWluZyByZWxvY2F0ZWQpIGFuZCB3aGljaCBvcGNvZGVzIHNob3VsZCBqdXN0IGJlIGV4ZWN1dGVkCi0JLy8gZm9yIHRoZWlyIHNpZGUgZWZmZWN0cyAoaWUgdXBkYXRlZCBzdGF0ZS5yZWxvY0FkZHJlc3Mgb3Igc3RhdGUuaW1wb3J0SW5kZXgpPwotCS8vIFRoZSBhbnN3ZXIgaXMgYm90aCBzaW1wbGUgYW5kIHN1YnRsZS4gIE9wY29kZXMgd2hvc2UgYWN0aW9ucyBhcmUgZGVwZW5kZW50Ci0JLy8gb24gYSBzeW1ib2wgdGhhdCB3YXMgaW4gdGhlIHdlYWsgbGlua2VkIGxpYnJhcnkgYXJlIGVmZmVjdGl2ZSwgdGhvc2UgdGhhdAotCS8vIGFuIGluZGVwZW5kZW50IG9mIHRob3NlIHN5bWJvbHMgYXJlIG5vdC4gIFRoZSBvbmx5IG9wY29kZXMgdGhhdCB1c2UKLQkvLyBzeW1ib2xpYyB2YWx1ZXMgYXJlIGtQRUZSZWxvY0ltcG9ydFJ1biBhbmQga1BFRlJlbG9jU21CeUltcG9ydCwgYW5kCi0JLy8gdGhlc2UgYXJlIG9ubHkgaWYgdGhlIHN5bWJvbCBpcyBpbiB0aGUgd2VhayBsaW5rZWQgbGlicmFyeS4KLQkvLyBBbGwgb3RoZXIgY2FzZXMgYXJlIGV4ZWN1dGVkIGZvciB0aGVpciBzaWRlIGVmZmVjdHMgb25seS4KLQkvLwotCS8vIEhvdyBkbyBJIGRldGVybWluZSBpZiBhIHN5bWJvbCBpcyBpbiB0aGUgd2VhayBsaW5rZWQgbGlicmFyeT8KLQkvLyBXZWxsIEkga25vdyB0aGUgc3ltYm9sJ3MgaW5kZXggYW5kIEkga25vdyB0aGUgbG93ZXIgYm91bmQgYW5kIGNvdW50Ci0JLy8gb2YgdGhlIHN5bWJvbHMgaW4gdGhlIHdlYWsgbGlua2VkIGxpYnJhcnksIHNvIEkganVzdCBkbyBhIHNpbXBsZQotCS8vIGJvdW5kcyB0ZXN0LCBpZSAKLQkvLwotCS8vICAgZmlyc3RJbXBvcnRlZFN5bWJvbCA8PSBpbXBvcnRJbmRleCA8IGZpcnN0SW1wb3J0ZWRTeW1ib2wgKyBpbXBvcnRlZFN5bWJvbENvdW50CisgICAgLy8gdG90YWxSZWxvY3MgaXMgb25seSB1c2VkIGZvciBkZWJ1Z2dpbmcsIHRvIG1ha2Ugc3VyZSBvdXIKKyAgICAvLyByZWxvY2F0aW9uIFBDIChzdGF0ZS5jdXJyZW50UmVsb2MpIGRvZXNuJ3QgcnVuIHdpbGQuCiAKLQkvLyBGcm9tIHRoaXMgY29kZSwgaXQncyByZWxhdGl2ZWx5IGVhc3kgdG8gc2VlIHdoaWNoIHJlbG9jYXRpb24gb3Bjb2RlcwotCS8vIGFyZW4ndCBpbXBsZW1lbnRlZC4gIElmIHlvdSBldmVyIGVuY291bnRlciBvbmUsIHlvdSdsbCBmaW5kIHlvdXJzZWxmCi0JLy8gaW4gTWFjc0J1ZyB3aXRoIGEgbWVzc2FnZSB0ZWxsaW5nIHlvdSB3aGljaCBvcGNvZGUgd2FzIGZvdW5kLiAgVGhlCi0JLy8gdHdvIGJpZyBncm91cHMgb2Ygb3Bjb2RlcyBJIHNraXBwZWQgd2VyZSB0aGUgbGFyZ2UgZm9ybWF0IG9wY29kZXMKLQkvLyBhbmQgdGhlIHJlcGVhdGluZyBvcGNvZGVzLiAgSSBza2lwcGVkIHRoZW0gYmVjYXVzZToKLQkvLwotCS8vIGEpIEkgaGF2ZW4ndCBnb3QgYSB3YXkgdG8gZ2VuZXJhdGUgdGhlbSBpbiBhIFBFRiBjb250YWluZXIgdGhhdCBJIGNhbiAKLQkvLyAgICB0ZXN0IGFnYWluc3QuIFdpdGhvdXQgdGhhdCwgdGhlcmUncyBubyB3YXkgSSBjb3VsZCBiZSBhc3N1cmVkIHRoYXQKLQkvLyAgICB0aGUgY29kZSB3b3JrZWQuCi0JLy8KLQkvLyBiKSBJJ20gbGF6eS4KKyAgICB0b3RhbFJlbG9jcyA9IChmcmFnVG9GaXgtPmxvYWRlclNlY3Rpb24tPmxvYWRlclN0cmluZ3NPZmZzZXQgLSBmcmFnVG9GaXgtPmxvYWRlclNlY3Rpb24tPnJlbG9jSW5zdHJPZmZzZXQpIC8gc2l6ZW9mKFVJbnQxNik7CiAKLQllcnIgPSBub0VycjsKLQl3aGlsZSAoIHNlY3Rpb25zTGVmdFRvUmVsb2NhdGUgPiAwICkgewotCQllcnIgPSBJbml0RW5naW5lU3RhdGUoZnJhZ1RvRml4LCBzZWN0aW9uc0xlZnRUb1JlbG9jYXRlLCAmc3RhdGUpOwotCQlpZiAoZXJyICE9IG5vRXJyKSB7Ci0JCQlnb3RvIGxlYXZlTm93OwotCQl9Ci0JCQotCQl3aGlsZSAoIHN0YXRlLmN1cnJlbnRSZWxvYyAhPSBzdGF0ZS50ZXJtaW5hdGluZ1JlbG9jICkgewotCQkJCi0JCQlNb3JlQXNzZXJ0USggc3RhdGUuY3VycmVudFJlbG9jIDwgdG90YWxSZWxvY3MgKTsKKyAgICAvLyByZWxvY0luc3RyVGFibGUgaXMgdGhlIGJhc2UgYWRkcmVzcyBvZiB0aGUgdGFibGUgb2YgcmVsb2NhdGlvbgorICAgIC8vIGluc3RydWN0aW9ucyBpbiB0aGUgZnJhZ21lbnQgdG8gZml4LgogCi0JCQlvcENvZGUgPSByZWxvY0luc3RyVGFibGVbc3RhdGUuY3VycmVudFJlbG9jXTsKLQkJCXN3aXRjaCAoIFBFRlJlbG9jQmFzaWNPcGNvZGUob3BDb2RlKSApIHsKLQkJCQljYXNlIGtQRUZSZWxvY0J5U2VjdERXaXRoU2tpcDoKLQkJCQkJewotCQkJCQkJVUludDE2IHNraXBDb3VudDsKLQkJCQkJCVVJbnQxNiByZWxvY0NvdW50OwotCQkJCQkJCi0JCQkJCQlza2lwQ291bnQgPSAoKG9wQ29kZSA+PiA2KSAmIDB4MDBGRik7Ci0JCQkJCQlyZWxvY0NvdW50ID0gKG9wQ29kZSAmIDB4MDAzRik7Ci0JCQkJCQlzdGF0ZS5yZWxvY0FkZHJlc3MgKz0gc2tpcENvdW50OwotCQkJCQkJc3RhdGUucmVsb2NBZGRyZXNzICs9IHJlbG9jQ291bnQ7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBrUEVGUmVsb2NCeVNlY3RDOgotCQkJCWNhc2Uga1BFRlJlbG9jQnlTZWN0RDoKLQkJCQkJewotCQkJCQkJVUludDE2IHJ1bkxlbmd0aDsKKyAgICByZWxvY0luc3RyVGFibGUgPSAoVUludDE2ICopKChjaGFyICopIGZyYWdUb0ZpeC0+bG9hZGVyU2VjdGlvbiArIGZyYWdUb0ZpeC0+bG9hZGVyU2VjdGlvbi0+cmVsb2NJbnN0ck9mZnNldCk7CiAKLQkJCQkJCXJ1bkxlbmd0aCA9IChvcENvZGUgJiAweDAxRkYpICsgMTsKLQkJCQkJCXN0YXRlLnJlbG9jQWRkcmVzcyArPSBydW5MZW5ndGg7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBrUEVGUmVsb2NUVmVjdG9yMTI6Ci0JCQkJCXsKLQkJCQkJCVVJbnQxNiBydW5MZW5ndGg7CisgICAgLy8gc2VjdGlvbnNMZWZ0VG9SZWxvY2F0ZSBpcyB0aGUgbG9vcCBjb3VudGVyIGZvciB0aGUgb3V0ZXIgbG9vcC4KIAotCQkJCQkJcnVuTGVuZ3RoID0gKG9wQ29kZSAmIDB4MDFGRikgKyAxOwotCQkJCQkJc3RhdGUucmVsb2NBZGRyZXNzICs9IChydW5MZW5ndGggKiAzKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIGtQRUZSZWxvY1RWZWN0b3I4OgotCQkJCWNhc2Uga1BFRlJlbG9jVlRhYmxlODoKLQkJCQkJewotCQkJCQkJVUludDE2IHJ1bkxlbmd0aDsKKyAgICBNb3JlQXNzZXJ0UShmcmFnVG9GaXgtPmxvYWRlclNlY3Rpb24tPnJlbG9jU2VjdGlvbkNvdW50IDw9IDB4MEZGRkYpOworICAgIHNlY3Rpb25zTGVmdFRvUmVsb2NhdGUgPSBmcmFnVG9GaXgtPmxvYWRlclNlY3Rpb24tPnJlbG9jU2VjdGlvbkNvdW50OwogCi0JCQkJCQlydW5MZW5ndGggPSAob3BDb2RlICYgMHgwMUZGKSArIDE7Ci0JCQkJCQlzdGF0ZS5yZWxvY0FkZHJlc3MgKz0gKHJ1bkxlbmd0aCAqIDIpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2Uga1BFRlJlbG9jSW1wb3J0UnVuOgotCQkJCQl7Ci0JCQkJCQlVSW50MzIgc3ltYm9sVmFsdWU7Ci0JCQkJCQlVSW50MTYgcnVuTGVuZ3RoOwotCQkJCQkJCi0JCQkJCQlydW5MZW5ndGggPSAob3BDb2RlICYgMHgwMUZGKSArIDE7Ci0JCQkJCQl3aGlsZSAocnVuTGVuZ3RoID4gMCkgewotCQkJCQkJCWlmICggc3RhdGUuaW1wb3J0SW5kZXggPj0gaW1wb3J0TGlicmFyeS0+Zmlyc3RJbXBvcnRlZFN5bWJvbCAmJiBzdGF0ZS5pbXBvcnRJbmRleCA8IChpbXBvcnRMaWJyYXJ5LT5maXJzdEltcG9ydGVkU3ltYm9sICsgaW1wb3J0TGlicmFyeS0+aW1wb3J0ZWRTeW1ib2xDb3VudCkgKSB7Ci0JCQkJCQkJCWVyciA9IExvb2t1cFN5bWJvbChsb29rdXAsIHJlZkNvbiwgZnJhZ1RvRml4LT5sb2FkZXJTZWN0aW9uLCBzdGF0ZS5pbXBvcnRJbmRleCwgJnN5bWJvbFZhbHVlKTsKLQkJCQkJCQkJaWYgKGVyciAhPSBub0VycikgewotCQkJCQkJCQkJZ290byBsZWF2ZU5vdzsKLQkJCQkJCQkJfQotCQkJCQkJCQkqKHN0YXRlLnJlbG9jQWRkcmVzcykgKz0gc3ltYm9sVmFsdWU7Ci0JCQkJCQkJfQotCQkJCQkJCXN0YXRlLmltcG9ydEluZGV4ICs9IDE7Ci0JCQkJCQkJc3RhdGUucmVsb2NBZGRyZXNzICs9IDE7Ci0JCQkJCQkJcnVuTGVuZ3RoIC09IDE7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBrUEVGUmVsb2NTbUJ5SW1wb3J0OgotCQkJCQl7Ci0JCQkJCQlVSW50MzIgc3ltYm9sVmFsdWU7Ci0JCQkJCQlVSW50MzIgaW5kZXg7CisgICAgLy8gTm93IGxldCdzIHJ1biB0aGUgcmVsb2NhdGlvbiBlbmdpbmUuICBXZSBydW4gaXQgb25jZSBwZXIKKyAgICAvLyBzZWN0aW9uIGluIHRoZSB0YWJsZS4gIEVhY2ggdGltZSBhcm91bmQsIHdlIGluaXQgdGhlIGVuZ2luZQorICAgIC8vIGFuZCB0aGVuIGxvb3AgYWdhaW4sIHRoaXMgdGltZSBleGVjdXRpbmcgaW5kaXZpZHVhbCBvcGNvZGVzLgorICAgIC8vIFRoZSBvcGNvZGUgbG9vcCB0ZXJtaW5hdGVzIHdoZW4gdGhlIHJlbG9jYXRpb24gUEMKKyAgICAvLyAoc3RhdGUuY3VycmVudFJlbG9jKSBoaXRzIHRoZSBmaW5hbCBvcGNvZGUgKHN0YXRlLnRlcm1pbmF0aW5nUmVsb2MpLgogCi0JCQkJCQlpbmRleCA9IChvcENvZGUgJiAweDAxRkYpOwotCQkJCQkJaWYgKCBpbmRleCA+PSBpbXBvcnRMaWJyYXJ5LT5maXJzdEltcG9ydGVkU3ltYm9sICYmIGluZGV4IDwgKGltcG9ydExpYnJhcnktPmZpcnN0SW1wb3J0ZWRTeW1ib2wgKyBpbXBvcnRMaWJyYXJ5LT5pbXBvcnRlZFN5bWJvbENvdW50KSApIHsKLQkJCQkJCQllcnIgPSBMb29rdXBTeW1ib2wobG9va3VwLCByZWZDb24sIGZyYWdUb0ZpeC0+bG9hZGVyU2VjdGlvbiwgaW5kZXgsICZzeW1ib2xWYWx1ZSk7Ci0JCQkJCQkJaWYgKGVyciAhPSBub0VycikgewotCQkJCQkJCQlnb3RvIGxlYXZlTm93OwotCQkJCQkJCX0KLQkJCQkJCQkqKHN0YXRlLnJlbG9jQWRkcmVzcykgKz0gc3ltYm9sVmFsdWU7Ci0JCQkJCQl9Ci0JCQkJCQlzdGF0ZS5pbXBvcnRJbmRleCA9IGluZGV4ICsgMTsKLQkJCQkJCXN0YXRlLnJlbG9jQWRkcmVzcyArPSAxOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2Uga1BFRlJlbG9jU21TZXRTZWN0QzoKLQkJCQkJewotCQkJCQkJVUludDMyIGluZGV4OworICAgIC8vIE5vdGU6CisgICAgLy8gT25lIGRlc2lnbiBkZWNpc2lvbiBJIG1hZGUgd2FzIHRvIHRvdGFsbHkgcmUtaW5pdCB0aGUgZW5naW5lIHN0YXRlCisgICAgLy8gZm9yIGVhY2ggc2VjdGlvbi4gIFRoZSBDRk0gc3BlYyBpcyB1bmNsZWFyIGFzIHRvIHdoZXRoZXIgeW91J3JlIHN1cHBvc2VkCisgICAgLy8gdG8gdG90YWxseSByZS1pbml0IHRoZSBlbmdpbmUgc3RhdGUsIG9yIGp1c3QgcmUtaW5pdCB0aGUgc2VjdGlvbi1zcGVjaWZpYworICAgIC8vIHN0YXRlIChpZSBjdXJyZW50UmVsb2MsIHRlcm1pbmF0aW5nUmVsb2MsIGFuZCByZWxvY0FkZHJlc3MpLiAgSSBob3BlIHRoaXMKKyAgICAvLyBpcyBjb3JyZWN0LCBidXQgaXQncyBoYXJkIHRvIHRlc3Qgd2l0aG91dCBoYXZpbmcgYSBmcmFnbWVudCB3aXRoIG11bHRpcGxlCisgICAgLy8gcmVsb2NhdGVkIHNlY3Rpb25zLCB3aGljaCBpcyBkaWZmaWN1bHQgdG8gY3JlYXRlLgogCi0JCQkJCQlpbmRleCA9IChvcENvZGUgJiAweDAxRkYpOwotCQkJCQkJc3RhdGUuc2VjdGlvbkMgPSBHZXRTZWN0aW9uQmFzZUFkZHJlc3MoZnJhZ1RvRml4LCBpbmRleCk7Ci0JCQkJCQlNb3JlQXNzZXJ0UShzdGF0ZS5zZWN0aW9uQyAhPSBuaWwpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2Uga1BFRlJlbG9jU21TZXRTZWN0RDoKLQkJCQkJewotCQkJCQkJVUludDMyIGluZGV4OworICAgIC8vIEhvdyBkbyBJIGRlY2lkZSB3aGljaCBvcGNvZGVzIHNob3VsZCBiZSBlZmZlY3RpdmUgKGllIG1ha2UgY2hhbmdlcyB0bworICAgIC8vIHRoZSBzZWN0aW9uIGJlaW5nIHJlbG9jYXRlZCkgYW5kIHdoaWNoIG9wY29kZXMgc2hvdWxkIGp1c3QgYmUgZXhlY3V0ZWQKKyAgICAvLyBmb3IgdGhlaXIgc2lkZSBlZmZlY3RzIChpZSB1cGRhdGVkIHN0YXRlLnJlbG9jQWRkcmVzcyBvciBzdGF0ZS5pbXBvcnRJbmRleCk/CisgICAgLy8gVGhlIGFuc3dlciBpcyBib3RoIHNpbXBsZSBhbmQgc3VidGxlLiAgT3Bjb2RlcyB3aG9zZSBhY3Rpb25zIGFyZSBkZXBlbmRlbnQKKyAgICAvLyBvbiBhIHN5bWJvbCB0aGF0IHdhcyBpbiB0aGUgd2VhayBsaW5rZWQgbGlicmFyeSBhcmUgZWZmZWN0aXZlLCB0aG9zZSB0aGF0CisgICAgLy8gYW4gaW5kZXBlbmRlbnQgb2YgdGhvc2Ugc3ltYm9scyBhcmUgbm90LiAgVGhlIG9ubHkgb3Bjb2RlcyB0aGF0IHVzZQorICAgIC8vIHN5bWJvbGljIHZhbHVlcyBhcmUga1BFRlJlbG9jSW1wb3J0UnVuIGFuZCBrUEVGUmVsb2NTbUJ5SW1wb3J0LCBhbmQKKyAgICAvLyB0aGVzZSBhcmUgb25seSBpZiB0aGUgc3ltYm9sIGlzIGluIHRoZSB3ZWFrIGxpbmtlZCBsaWJyYXJ5LgorICAgIC8vIEFsbCBvdGhlciBjYXNlcyBhcmUgZXhlY3V0ZWQgZm9yIHRoZWlyIHNpZGUgZWZmZWN0cyBvbmx5LgorICAgIC8vCisgICAgLy8gSG93IGRvIEkgZGV0ZXJtaW5lIGlmIGEgc3ltYm9sIGlzIGluIHRoZSB3ZWFrIGxpbmtlZCBsaWJyYXJ5PworICAgIC8vIFdlbGwgSSBrbm93IHRoZSBzeW1ib2wncyBpbmRleCBhbmQgSSBrbm93IHRoZSBsb3dlciBib3VuZCBhbmQgY291bnQKKyAgICAvLyBvZiB0aGUgc3ltYm9scyBpbiB0aGUgd2VhayBsaW5rZWQgbGlicmFyeSwgc28gSSBqdXN0IGRvIGEgc2ltcGxlCisgICAgLy8gYm91bmRzIHRlc3QsIGllCisgICAgLy8KKyAgICAvLyAgIGZpcnN0SW1wb3J0ZWRTeW1ib2wgPD0gaW1wb3J0SW5kZXggPCBmaXJzdEltcG9ydGVkU3ltYm9sICsgaW1wb3J0ZWRTeW1ib2xDb3VudAogCi0JCQkJCQlpbmRleCA9IChvcENvZGUgJiAweDAxRkYpOwotCQkJCQkJc3RhdGUuc2VjdGlvbkQgPSBHZXRTZWN0aW9uQmFzZUFkZHJlc3MoZnJhZ1RvRml4LCBpbmRleCk7Ci0JCQkJCQlNb3JlQXNzZXJ0UShzdGF0ZS5zZWN0aW9uRCAhPSBuaWwpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2Uga1BFRlJlbG9jU21CeVNlY3Rpb246Ci0JCQkJCXN0YXRlLnJlbG9jQWRkcmVzcyArPSAxOwotCQkJCQlicmVhazsKLQkJCQljYXNlIGtQRUZSZWxvY0luY3JQb3NpdGlvbjoKLQkJCQkJewotCQkJCQkJVUludDE2IG9mZnNldDsKLQkJCQkJCQotCQkJCQkJb2Zmc2V0ID0gKG9wQ29kZSAmIDB4MEZGRikgKyAxOwotCQkJCQkJKChjaGFyICopIHN0YXRlLnJlbG9jQWRkcmVzcykgKz0gb2Zmc2V0OwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2Uga1BFRlJlbG9jU21SZXBlYXQ6Ci0JCQkJCSNpZiBNT1JFX0RFQlVHCi0JCQkJCQlEZWJ1Z1N0cigiXHBSdW5SZWxvY2F0aW9uRW5naW5lOiBrUEVGUmVsb2NTbVJlcGVhdCBub3QgeWV0IGltcGxlbWVudGVkIik7Ci0JCQkJCSNlbmRpZgotCQkJCQllcnIgPSB1bmltcEVycjsKLQkJCQkJZ290byBsZWF2ZU5vdzsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBrUEVGUmVsb2NTZXRQb3NpdGlvbjoKLQkJCQkJewotCQkJCQkJVUludDMyIG9mZnNldDsKKyAgICAvLyBGcm9tIHRoaXMgY29kZSwgaXQncyByZWxhdGl2ZWx5IGVhc3kgdG8gc2VlIHdoaWNoIHJlbG9jYXRpb24gb3Bjb2RlcworICAgIC8vIGFyZW4ndCBpbXBsZW1lbnRlZC4gIElmIHlvdSBldmVyIGVuY291bnRlciBvbmUsIHlvdSdsbCBmaW5kIHlvdXJzZWxmCisgICAgLy8gaW4gTWFjc0J1ZyB3aXRoIGEgbWVzc2FnZSB0ZWxsaW5nIHlvdSB3aGljaCBvcGNvZGUgd2FzIGZvdW5kLiAgVGhlCisgICAgLy8gdHdvIGJpZyBncm91cHMgb2Ygb3Bjb2RlcyBJIHNraXBwZWQgd2VyZSB0aGUgbGFyZ2UgZm9ybWF0IG9wY29kZXMKKyAgICAvLyBhbmQgdGhlIHJlcGVhdGluZyBvcGNvZGVzLiAgSSBza2lwcGVkIHRoZW0gYmVjYXVzZToKKyAgICAvLworICAgIC8vIGEpIEkgaGF2ZW4ndCBnb3QgYSB3YXkgdG8gZ2VuZXJhdGUgdGhlbSBpbiBhIFBFRiBjb250YWluZXIgdGhhdCBJIGNhbgorICAgIC8vICAgIHRlc3QgYWdhaW5zdC4gV2l0aG91dCB0aGF0LCB0aGVyZSdzIG5vIHdheSBJIGNvdWxkIGJlIGFzc3VyZWQgdGhhdAorICAgIC8vICAgIHRoZSBjb2RlIHdvcmtlZC4KKyAgICAvLworICAgIC8vIGIpIEknbSBsYXp5LgogCi0JCQkJCQkvLyBMb3QncyBvZiBmb2xrcyBoYXZlIHRyaWVkIHZhcmlvdXMgaW50ZXJwcmV0YXRpb25zIG9mIHRoZSBkZXNjcmlwdGlvbiBvZiAKLQkJCQkJCS8vIHRoaXMgb3BDb2RlIGluICJNYWMgT1MgUnVudGltZSBBcmNoaXRlY3R1cmVzIiAod2hpY2ggc3RhdGVzICJUaGlzIGluc3RydWN0aW9uIAotCQkJCQkJLy8gc2V0cyByZWxvY0FkZHJlc3MgdG8gdGhlIGFkZHJlc3Mgb2YgdGhlIHNlY3Rpb24gb2Zmc2V0IG9mZnNldC4iICAqc21pbGUqKS4KLQkJCQkJCS8vIEkgZXZlbnR1YWxseSBkdWcgaW50byB0aGUgQ0ZNIHNvdXJjZSBjb2RlIHRvIGZpbmQgbXkgaW50ZXJwcmV0YXRpb24sIHdoaWNoIAotCQkJCQkJLy8gSSBiZWxpZXZlIGlzIGNvcnJlY3QuICBUaGUga2V5IHBvaW50IGlzIHRodCB0aGUgb2Zmc2V0IGlzIHJlbGF0aXZlIHRvIAotCQkJCQkJLy8gdGhlIHN0YXJ0IG9mIHRoZSBzZWN0aW9uIGZvciB3aGljaCB0aGVzZSByZWxvY2F0aW9ucyBhcmUgYmVpbmcgcGVyZm9ybWVkLgotCQkJCQkJCi0JCQkJCQkvLyBTa2lwIHRvIG5leHQgcmVsb2Mgd29yZCwgd2hpY2ggaXMgdGhlIHNlY29uZCBjaHVuayBvZiB0aGUgb2Zmc2V0LgotCQkJCQkJCi0JCQkJCQlzdGF0ZS5jdXJyZW50UmVsb2MgKz0gMTsKLQkJCQkJCQotCQkJCQkJLy8gRXh0cmFjdCBvZmZzZXQgYmFzZWQgb24gdGhlIG1vc3Qgc2lnbmlmaWNhbnQgMTAgYml0cyBpbiBvcENvZGUgYW5kIAotCQkJCQkJLy8gdGhlIG5leHQgc2lnbmlmaWNhbnQgMTYgYml0cyBpbiB0aGUgbmV4dCByZWxvYyB3b3JkLgotCQkJCQkJCi0JCQkJCQlvZmZzZXQgPSBQRUZSZWxvY1NldFBvc0Z1bGxPZmZzZXQob3BDb2RlLCByZWxvY0luc3RyVGFibGVbc3RhdGUuY3VycmVudFJlbG9jXSk7CisgICAgZXJyID0gbm9FcnI7CisgICAgd2hpbGUgKCBzZWN0aW9uc0xlZnRUb1JlbG9jYXRlID4gMCApIHsKKyAgICAgICAgZXJyID0gSW5pdEVuZ2luZVN0YXRlKGZyYWdUb0ZpeCwgc2VjdGlvbnNMZWZ0VG9SZWxvY2F0ZSwgJnN0YXRlKTsKKyAgICAgICAgaWYgKGVyciAhPSBub0VycikgeworICAgICAgICAgICAgZ290byBsZWF2ZU5vdzsKKyAgICAgICAgfQogCi0JCQkJCQlzdGF0ZS5yZWxvY0FkZHJlc3MgPSAoVUludDMyICopICggKChjaGFyICopIHN0YXRlLnNlY3Rpb25CYXNlKSArIG9mZnNldCk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBrUEVGUmVsb2NMZ0J5SW1wb3J0OgotCQkJCQl7Ci0JCQkJCQlVSW50MzIgc3ltYm9sVmFsdWU7Ci0JCQkJCQlVSW50MzIgaW5kZXg7CisgICAgICAgIHdoaWxlICggc3RhdGUuY3VycmVudFJlbG9jICE9IHN0YXRlLnRlcm1pbmF0aW5nUmVsb2MgKSB7CiAKLQkJCQkJCS8vIEdldCB0aGUgMjYgYml0IHN5bWJvbCBpbmRleCBmcm9tIHRoZSBjdXJyZW50IGFuZCBuZXh0IHJlbG9jIHdvcmRzLgotCQkJCQkJCi0JCQkJCQlzdGF0ZS5jdXJyZW50UmVsb2MgKz0gMTsKLQkJCQkJCWluZGV4ID0gUEVGUmVsb2NMZ0J5SW1wb3J0RnVsbEluZGV4KG9wQ29kZSwgcmVsb2NJbnN0clRhYmxlW3N0YXRlLmN1cnJlbnRSZWxvY10pOwotCQkJCQkJCi0JCQkJCQlpZiAoIGluZGV4ID49IGltcG9ydExpYnJhcnktPmZpcnN0SW1wb3J0ZWRTeW1ib2wgJiYgaW5kZXggPCAoaW1wb3J0TGlicmFyeS0+Zmlyc3RJbXBvcnRlZFN5bWJvbCArIGltcG9ydExpYnJhcnktPmltcG9ydGVkU3ltYm9sQ291bnQpICkgewotCQkJCQkJCWVyciA9IExvb2t1cFN5bWJvbChsb29rdXAsIHJlZkNvbiwgZnJhZ1RvRml4LT5sb2FkZXJTZWN0aW9uLCBpbmRleCwgJnN5bWJvbFZhbHVlKTsKLQkJCQkJCQlpZiAoZXJyICE9IG5vRXJyKSB7Ci0JCQkJCQkJCWdvdG8gbGVhdmVOb3c7Ci0JCQkJCQkJfQotCQkJCQkJCSooc3RhdGUucmVsb2NBZGRyZXNzKSArPSBzeW1ib2xWYWx1ZTsKLQkJCQkJCX0KLQkJCQkJCXN0YXRlLmltcG9ydEluZGV4ID0gaW5kZXggKyAxOwotCQkJCQkJc3RhdGUucmVsb2NBZGRyZXNzICs9IDE7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBrUEVGUmVsb2NMZ1JlcGVhdDoKLQkJCQkJI2lmIE1PUkVfREVCVUcKLQkJCQkJCURlYnVnU3RyKCJccFJ1blJlbG9jYXRpb25FbmdpbmU6IGtQRUZSZWxvY0xnUmVwZWF0IG5vdCB5ZXQgaW1wbGVtZW50ZWQiKTsKLQkJCQkJI2VuZGlmCi0JCQkJCWVyciA9IHVuaW1wRXJyOwotCQkJCQlnb3RvIGxlYXZlTm93OwotCQkJCQlicmVhazsKLQkJCQljYXNlIGtQRUZSZWxvY0xnU2V0T3JCeVNlY3Rpb246Ci0JCQkJCSNpZiBNT1JFX0RFQlVHCi0JCQkJCQlEZWJ1Z1N0cigiXHBSdW5SZWxvY2F0aW9uRW5naW5lOiBrUEVGUmVsb2NMZ1NldE9yQnlTZWN0aW9uIG5vdCB5ZXQgaW1wbGVtZW50ZWQiKTsKLQkJCQkJI2VuZGlmCi0JCQkJCWVyciA9IHVuaW1wRXJyOwotCQkJCQlnb3RvIGxlYXZlTm93OwotCQkJCQlicmVhazsKLQkJCQljYXNlIGtQRUZSZWxvY1VuZGVmaW5lZE9wY29kZToKLQkJCQkJZXJyID0gY2ZyYWdGcmFnbWVudENvcnJ1cHRFcnI7Ci0JCQkJCWdvdG8gbGVhdmVOb3c7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCU1vcmVBc3NlcnRRKGZhbHNlKTsKLQkJCQkJZXJyID0gY2ZyYWdGcmFnbWVudENvcnJ1cHRFcnI7Ci0JCQkJCWdvdG8gbGVhdmVOb3c7Ci0JCQkJCWJyZWFrOwotCQkJfQotCQkJc3RhdGUuY3VycmVudFJlbG9jICs9IDE7Ci0JCX0KLQkJCi0JCXNlY3Rpb25zTGVmdFRvUmVsb2NhdGUgLT0gMTsKLQl9CisgICAgICAgICAgICBNb3JlQXNzZXJ0USggc3RhdGUuY3VycmVudFJlbG9jIDwgdG90YWxSZWxvY3MgKTsKKworICAgICAgICAgICAgb3BDb2RlID0gcmVsb2NJbnN0clRhYmxlW3N0YXRlLmN1cnJlbnRSZWxvY107CisgICAgICAgICAgICBzd2l0Y2ggKCBQRUZSZWxvY0Jhc2ljT3Bjb2RlKG9wQ29kZSkgKSB7CisgICAgICAgICAgICAgICAgY2FzZSBrUEVGUmVsb2NCeVNlY3REV2l0aFNraXA6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFVJbnQxNiBza2lwQ291bnQ7CisgICAgICAgICAgICAgICAgICAgICAgICBVSW50MTYgcmVsb2NDb3VudDsKKworICAgICAgICAgICAgICAgICAgICAgICAgc2tpcENvdW50ID0gKChvcENvZGUgPj4gNikgJiAweDAwRkYpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVsb2NDb3VudCA9IChvcENvZGUgJiAweDAwM0YpOworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUucmVsb2NBZGRyZXNzICs9IHNraXBDb3VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLnJlbG9jQWRkcmVzcyArPSByZWxvY0NvdW50OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2Uga1BFRlJlbG9jQnlTZWN0QzoKKyAgICAgICAgICAgICAgICBjYXNlIGtQRUZSZWxvY0J5U2VjdEQ6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFVJbnQxNiBydW5MZW5ndGg7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHJ1bkxlbmd0aCA9IChvcENvZGUgJiAweDAxRkYpICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLnJlbG9jQWRkcmVzcyArPSBydW5MZW5ndGg7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBrUEVGUmVsb2NUVmVjdG9yMTI6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFVJbnQxNiBydW5MZW5ndGg7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHJ1bkxlbmd0aCA9IChvcENvZGUgJiAweDAxRkYpICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLnJlbG9jQWRkcmVzcyArPSAocnVuTGVuZ3RoICogMyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBrUEVGUmVsb2NUVmVjdG9yODoKKyAgICAgICAgICAgICAgICBjYXNlIGtQRUZSZWxvY1ZUYWJsZTg6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFVJbnQxNiBydW5MZW5ndGg7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHJ1bkxlbmd0aCA9IChvcENvZGUgJiAweDAxRkYpICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLnJlbG9jQWRkcmVzcyArPSAocnVuTGVuZ3RoICogMik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBrUEVGUmVsb2NJbXBvcnRSdW46CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFVJbnQzMiBzeW1ib2xWYWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFVJbnQxNiBydW5MZW5ndGg7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHJ1bkxlbmd0aCA9IChvcENvZGUgJiAweDAxRkYpICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChydW5MZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5pbXBvcnRJbmRleCA+PSBpbXBvcnRMaWJyYXJ5LT5maXJzdEltcG9ydGVkU3ltYm9sICYmIHN0YXRlLmltcG9ydEluZGV4IDwgKGltcG9ydExpYnJhcnktPmZpcnN0SW1wb3J0ZWRTeW1ib2wgKyBpbXBvcnRMaWJyYXJ5LT5pbXBvcnRlZFN5bWJvbENvdW50KSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTG9va3VwU3ltYm9sKGxvb2t1cCwgcmVmQ29uLCBmcmFnVG9GaXgtPmxvYWRlclNlY3Rpb24sIHN0YXRlLmltcG9ydEluZGV4LCAmc3ltYm9sVmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyICE9IG5vRXJyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGxlYXZlTm93OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICooc3RhdGUucmVsb2NBZGRyZXNzKSArPSBzeW1ib2xWYWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuaW1wb3J0SW5kZXggKz0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5yZWxvY0FkZHJlc3MgKz0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5MZW5ndGggLT0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIGtQRUZSZWxvY1NtQnlJbXBvcnQ6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFVJbnQzMiBzeW1ib2xWYWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFVJbnQzMiBpbmRleDsKKworICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSAob3BDb2RlICYgMHgwMUZGKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggaW5kZXggPj0gaW1wb3J0TGlicmFyeS0+Zmlyc3RJbXBvcnRlZFN5bWJvbCAmJiBpbmRleCA8IChpbXBvcnRMaWJyYXJ5LT5maXJzdEltcG9ydGVkU3ltYm9sICsgaW1wb3J0TGlicmFyeS0+aW1wb3J0ZWRTeW1ib2xDb3VudCkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTG9va3VwU3ltYm9sKGxvb2t1cCwgcmVmQ29uLCBmcmFnVG9GaXgtPmxvYWRlclNlY3Rpb24sIGluZGV4LCAmc3ltYm9sVmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gbm9FcnIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBsZWF2ZU5vdzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihzdGF0ZS5yZWxvY0FkZHJlc3MpICs9IHN5bWJvbFZhbHVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuaW1wb3J0SW5kZXggPSBpbmRleCArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5yZWxvY0FkZHJlc3MgKz0gMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIGtQRUZSZWxvY1NtU2V0U2VjdEM6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFVJbnQzMiBpbmRleDsKKworICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSAob3BDb2RlICYgMHgwMUZGKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLnNlY3Rpb25DID0gR2V0U2VjdGlvbkJhc2VBZGRyZXNzKGZyYWdUb0ZpeCwgaW5kZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgTW9yZUFzc2VydFEoc3RhdGUuc2VjdGlvbkMgIT0gbmlsKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIGtQRUZSZWxvY1NtU2V0U2VjdEQ6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFVJbnQzMiBpbmRleDsKKworICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSAob3BDb2RlICYgMHgwMUZGKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLnNlY3Rpb25EID0gR2V0U2VjdGlvbkJhc2VBZGRyZXNzKGZyYWdUb0ZpeCwgaW5kZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgTW9yZUFzc2VydFEoc3RhdGUuc2VjdGlvbkQgIT0gbmlsKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIGtQRUZSZWxvY1NtQnlTZWN0aW9uOgorICAgICAgICAgICAgICAgICAgICBzdGF0ZS5yZWxvY0FkZHJlc3MgKz0gMTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBrUEVGUmVsb2NJbmNyUG9zaXRpb246CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFVJbnQxNiBvZmZzZXQ7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IChvcENvZGUgJiAweDBGRkYpICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICgoY2hhciAqKSBzdGF0ZS5yZWxvY0FkZHJlc3MpICs9IG9mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIGtQRUZSZWxvY1NtUmVwZWF0OgorICAgICAgICAgICAgICAgICAgICAjaWYgTU9SRV9ERUJVRworICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdTdHIoIlxwUnVuUmVsb2NhdGlvbkVuZ2luZToga1BFRlJlbG9jU21SZXBlYXQgbm90IHlldCBpbXBsZW1lbnRlZCIpOworICAgICAgICAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gdW5pbXBFcnI7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gbGVhdmVOb3c7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2Uga1BFRlJlbG9jU2V0UG9zaXRpb246CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFVJbnQzMiBvZmZzZXQ7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIExvdCdzIG9mIGZvbGtzIGhhdmUgdHJpZWQgdmFyaW91cyBpbnRlcnByZXRhdGlvbnMgb2YgdGhlIGRlc2NyaXB0aW9uIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIG9wQ29kZSBpbiAiTWFjIE9TIFJ1bnRpbWUgQXJjaGl0ZWN0dXJlcyIgKHdoaWNoIHN0YXRlcyAiVGhpcyBpbnN0cnVjdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0cyByZWxvY0FkZHJlc3MgdG8gdGhlIGFkZHJlc3Mgb2YgdGhlIHNlY3Rpb24gb2Zmc2V0IG9mZnNldC4iICAqc21pbGUqKS4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEkgZXZlbnR1YWxseSBkdWcgaW50byB0aGUgQ0ZNIHNvdXJjZSBjb2RlIHRvIGZpbmQgbXkgaW50ZXJwcmV0YXRpb24sIHdoaWNoCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBJIGJlbGlldmUgaXMgY29ycmVjdC4gIFRoZSBrZXkgcG9pbnQgaXMgdGh0IHRoZSBvZmZzZXQgaXMgcmVsYXRpdmUgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzdGFydCBvZiB0aGUgc2VjdGlvbiBmb3Igd2hpY2ggdGhlc2UgcmVsb2NhdGlvbnMgYXJlIGJlaW5nIHBlcmZvcm1lZC4KKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2tpcCB0byBuZXh0IHJlbG9jIHdvcmQsIHdoaWNoIGlzIHRoZSBzZWNvbmQgY2h1bmsgb2YgdGhlIG9mZnNldC4KKworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuY3VycmVudFJlbG9jICs9IDE7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEV4dHJhY3Qgb2Zmc2V0IGJhc2VkIG9uIHRoZSBtb3N0IHNpZ25pZmljYW50IDEwIGJpdHMgaW4gb3BDb2RlIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIG5leHQgc2lnbmlmaWNhbnQgMTYgYml0cyBpbiB0aGUgbmV4dCByZWxvYyB3b3JkLgorCisgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBQRUZSZWxvY1NldFBvc0Z1bGxPZmZzZXQob3BDb2RlLCByZWxvY0luc3RyVGFibGVbc3RhdGUuY3VycmVudFJlbG9jXSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLnJlbG9jQWRkcmVzcyA9IChVSW50MzIgKikgKCAoKGNoYXIgKikgc3RhdGUuc2VjdGlvbkJhc2UpICsgb2Zmc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIGtQRUZSZWxvY0xnQnlJbXBvcnQ6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFVJbnQzMiBzeW1ib2xWYWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFVJbnQzMiBpbmRleDsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSAyNiBiaXQgc3ltYm9sIGluZGV4IGZyb20gdGhlIGN1cnJlbnQgYW5kIG5leHQgcmVsb2Mgd29yZHMuCisKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmN1cnJlbnRSZWxvYyArPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBQRUZSZWxvY0xnQnlJbXBvcnRGdWxsSW5kZXgob3BDb2RlLCByZWxvY0luc3RyVGFibGVbc3RhdGUuY3VycmVudFJlbG9jXSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggaW5kZXggPj0gaW1wb3J0TGlicmFyeS0+Zmlyc3RJbXBvcnRlZFN5bWJvbCAmJiBpbmRleCA8IChpbXBvcnRMaWJyYXJ5LT5maXJzdEltcG9ydGVkU3ltYm9sICsgaW1wb3J0TGlicmFyeS0+aW1wb3J0ZWRTeW1ib2xDb3VudCkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTG9va3VwU3ltYm9sKGxvb2t1cCwgcmVmQ29uLCBmcmFnVG9GaXgtPmxvYWRlclNlY3Rpb24sIGluZGV4LCAmc3ltYm9sVmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gbm9FcnIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBsZWF2ZU5vdzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihzdGF0ZS5yZWxvY0FkZHJlc3MpICs9IHN5bWJvbFZhbHVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuaW1wb3J0SW5kZXggPSBpbmRleCArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5yZWxvY0FkZHJlc3MgKz0gMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIGtQRUZSZWxvY0xnUmVwZWF0OgorICAgICAgICAgICAgICAgICAgICAjaWYgTU9SRV9ERUJVRworICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdTdHIoIlxwUnVuUmVsb2NhdGlvbkVuZ2luZToga1BFRlJlbG9jTGdSZXBlYXQgbm90IHlldCBpbXBsZW1lbnRlZCIpOworICAgICAgICAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gdW5pbXBFcnI7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gbGVhdmVOb3c7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2Uga1BFRlJlbG9jTGdTZXRPckJ5U2VjdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgI2lmIE1PUkVfREVCVUcKKyAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnU3RyKCJccFJ1blJlbG9jYXRpb25FbmdpbmU6IGtQRUZSZWxvY0xnU2V0T3JCeVNlY3Rpb24gbm90IHlldCBpbXBsZW1lbnRlZCIpOworICAgICAgICAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gdW5pbXBFcnI7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gbGVhdmVOb3c7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2Uga1BFRlJlbG9jVW5kZWZpbmVkT3Bjb2RlOgorICAgICAgICAgICAgICAgICAgICBlcnIgPSBjZnJhZ0ZyYWdtZW50Q29ycnVwdEVycjsKKyAgICAgICAgICAgICAgICAgICAgZ290byBsZWF2ZU5vdzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgTW9yZUFzc2VydFEoZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBlcnIgPSBjZnJhZ0ZyYWdtZW50Q29ycnVwdEVycjsKKyAgICAgICAgICAgICAgICAgICAgZ290byBsZWF2ZU5vdzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0ZS5jdXJyZW50UmVsb2MgKz0gMTsKKyAgICAgICAgfQorCisgICAgICAgIHNlY3Rpb25zTGVmdFRvUmVsb2NhdGUgLT0gMTsKKyAgICB9CiAKIGxlYXZlTm93OgotCXJldHVybiBlcnI7CisgICAgcmV0dXJuIGVycjsKIH0KIAogZXh0ZXJuIHBhc2NhbCBPU1N0YXR1cyBDRk1MYXRlSW1wb3J0Q29yZShjb25zdCBDRnJhZ1N5c3RlbTdEaXNrRmxhdExvY2F0b3IgKmZyYWdUb0ZpeExvY2F0b3IsCi0JCQkJCQkJCQkJQ0ZyYWdDb25uZWN0aW9uSUQgZnJhZ1RvRml4Q29ubklELAotCQkJCQkJCQkJCUNGcmFnSW5pdEZ1bmN0aW9uIGZyYWdUb0ZpeEluaXRSb3V0aW5lLAotCQkJCQkJCQkJCUNvbnN0U3RyMjU1UGFyYW0gd2Vha0xpbmtlZExpYnJhcnlOYW1lLAotCQkJCQkJCQkJCUNGTUxhdGVJbXBvcnRMb29rdXBQcm9jIGxvb2t1cCwKLQkJCQkJCQkJCQl2b2lkICpyZWZDb24pCi0JLy8gU2VlIGNvbW1lbnRzIGluIGludGVyZmFjZSBwYXJ0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRnJhZ0Nvbm5lY3Rpb25JRCBmcmFnVG9GaXhDb25uSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGcmFnSW5pdEZ1bmN0aW9uIGZyYWdUb0ZpeEluaXRSb3V0aW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdFN0cjI1NVBhcmFtIHdlYWtMaW5rZWRMaWJyYXJ5TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZNTGF0ZUltcG9ydExvb2t1cFByb2MgbG9va3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpyZWZDb24pCisgICAgLy8gU2VlIGNvbW1lbnRzIGluIGludGVyZmFjZSBwYXJ0LgogewotCU9TU3RhdHVzIGVycjsKLQlPU1N0YXR1cyBqdW5rOwotCUZyYWdUb0ZpeEluZm8gZnJhZ1RvRml4OwotCVBFRkltcG9ydGVkTGlicmFyeSAqaW1wb3J0TGlicmFyeTsKLQljaGFyIHdlYWtMaW5rZWRMaWJyYXJ5TmFtZUNTdHJpbmdbMjU2XTsKKyAgICBPU1N0YXR1cyBlcnI7CisgICAgT1NTdGF0dXMganVuazsKKyAgICBGcmFnVG9GaXhJbmZvIGZyYWdUb0ZpeDsKKyAgICBQRUZJbXBvcnRlZExpYnJhcnkgKmltcG9ydExpYnJhcnk7CisgICAgY2hhciB3ZWFrTGlua2VkTGlicmFyeU5hbWVDU3RyaW5nWzI1Nl07CiAKLQlNb3JlQXNzZXJ0UShmcmFnVG9GaXhMb2NhdG9yICE9IG5pbCk7CQotCU1vcmVBc3NlcnRRKGZyYWdUb0ZpeENvbm5JRCAhPSBuaWwpOwotCU1vcmVBc3NlcnRRKGZyYWdUb0ZpeEluaXRSb3V0aW5lICE9IG5pbCk7Ci0JTW9yZUFzc2VydFEod2Vha0xpbmtlZExpYnJhcnlOYW1lICE9IG5pbCk7CQotCU1vcmVBc3NlcnRRKGxvb2t1cCAhPSBuaWwpOwkKLQkKLQkvLyBGaWxsIG91dCB0aGUgYml0cyBvZiBmcmFnVG9GaXggd2hpY2ggYXJlIHBhc3NlZCBpbgotCS8vIGJ5IHRoZSBjbGllbnQuCi0JCi0JTW9yZUJsb2NrWmVybygmZnJhZ1RvRml4LCBzaXplb2YoZnJhZ1RvRml4KSk7Ci0JZnJhZ1RvRml4LmxvY2F0b3IgPSAqZnJhZ1RvRml4TG9jYXRvcjsKLQlmcmFnVG9GaXguY29ubklEICA9IGZyYWdUb0ZpeENvbm5JRDsKLQlmcmFnVG9GaXguaW5pdFJvdXRpbmUgPSBmcmFnVG9GaXhJbml0Um91dGluZTsKLQkKLQkvLyBNYWtlIGEgQyBzdHJpbmcgZnJvbSB3ZWFrTGlua2VkTGlicmFyeU5hbWUuCi0JCi0JQmxvY2tNb3ZlRGF0YSh3ZWFrTGlua2VkTGlicmFyeU5hbWUgKyAxLCB3ZWFrTGlua2VkTGlicmFyeU5hbWVDU3RyaW5nLCB3ZWFrTGlua2VkTGlicmFyeU5hbWVbMF0pOwotCXdlYWtMaW5rZWRMaWJyYXJ5TmFtZUNTdHJpbmdbd2Vha0xpbmtlZExpYnJhcnlOYW1lWzBdXSA9IDA7CisgICAgTW9yZUFzc2VydFEoZnJhZ1RvRml4TG9jYXRvciAhPSBuaWwpOworICAgIE1vcmVBc3NlcnRRKGZyYWdUb0ZpeENvbm5JRCAhPSBuaWwpOworICAgIE1vcmVBc3NlcnRRKGZyYWdUb0ZpeEluaXRSb3V0aW5lICE9IG5pbCk7CisgICAgTW9yZUFzc2VydFEod2Vha0xpbmtlZExpYnJhcnlOYW1lICE9IG5pbCk7CisgICAgTW9yZUFzc2VydFEobG9va3VwICE9IG5pbCk7CiAKLQkvLyBHZXQgdGhlIGJhc2ljIGluZm9ybWF0aW9uIGZyb20gdGhlIGZyYWdtZW50LgotCS8vIEZpbGxzIG91dCB0aGUgY29udGFpbmVySGVhZGVyLCBzZWN0aW9uSGVhZGVycywgbG9hZGVyU2VjdGlvbiBhbmQgZmlsZVJlZiBmaWVsZHMKLQkvLyBvZiBmcmFnVG9GaXguCi0JCi0JZXJyID0gUmVhZENvbnRhaW5lckJhc2ljcygmZnJhZ1RvRml4KTsKKyAgICAvLyBGaWxsIG91dCB0aGUgYml0cyBvZiBmcmFnVG9GaXggd2hpY2ggYXJlIHBhc3NlZCBpbgorICAgIC8vIGJ5IHRoZSBjbGllbnQuCiAKLQkvLyBTZXQgdXAgdGhlIGJhc2UgYWRkcmVzcyBmaWVsZHMgaW4gZnJhZ1RvRml4IChpZSBzZWN0aW9uMEJhc2UgYW5kIHNlY3Rpb24xQmFzZSkKLQkvLyBieSBsb29raW5nIHVwIG91ciBpbml0IHJvdXRpbmUgKGZyYWdUb0ZpeC5pbml0Um91dGluZSkgYW5kIHN1YnRyYWN0aW5nCi0JLy8gYXdheSB0aGUgc2VjdGlvbiBvZmZzZXRzICh3aGljaCB3ZSBnZXQgZnJvbSB0aGUgZGlzayBjb3B5IG9mIHRoZSBzZWN0aW9uKQotCS8vIHRvIGRlcml2ZSB0aGUgYmFzZXMgb2YgdGhlIHNlY3Rpb25zIHRoZW1zZWx2ZXMuCi0JCi0JaWYgKGVyciA9PSBub0VycikgewotCQllcnIgPSBTZXR1cFNlY3Rpb25CYXNlQWRkcmVzc2VzKCZmcmFnVG9GaXgpOwotCX0KLQkKLQkvLyBMb29rIGluc2lkZSB0aGUgbG9hZGVyIHNlY3Rpb24gZm9yIHRoZSBpbXBvcnQgbGlicmFyeSBkZXNjcmlwdGlvbgotCS8vIG9mIHdlYWtMaW5rZWRMaWJyYXJ5TmFtZS4gIFdlIG5lZWQgdGhpcyB0byBrbm93IHRoZSByYW5nZSBvZiBzeW1ib2wKLQkvLyBpbmRleGVzIHdlJ3JlIGdvaW5nIHRvIGZpeCB1cC4KLQkKLQlpZiAoZXJyID09IG5vRXJyKSB7Ci0JCWVyciA9IEZpbmRJbXBvcnRMaWJyYXJ5KGZyYWdUb0ZpeC5sb2FkZXJTZWN0aW9uLCB3ZWFrTGlua2VkTGlicmFyeU5hbWVDU3RyaW5nLCAmaW1wb3J0TGlicmFyeSk7Ci0JfQotCQotCS8vIERvIGEgcXVpY2sgY2hlY2sgdG8gZW5zdXJlIHRoYXQgdGhlIGxpYnJhcnkgd2FzIGFjdHVhbGx5IGltcG9ydGVkIHdlYWsuCi0JLy8gSWYgaXQgd2Fzbid0LCBpdCBkb2Vzbid0IG1ha2UgbXVjaCBzZW5zZSB0byByZXNvbHZlIGl0cyB3ZWFrIGltcG9ydHMKLQkvLyBsYXRlciBvbi4gIFJlc29sdmluZyB0aGVtIGFnYWluIGlzIGxpa2VseSB0byBiZSBiYWQuCi0JCi0JaWYgKGVyciA9PSBub0VycikgewotCQlpZiAoKGltcG9ydExpYnJhcnktPm9wdGlvbnMgJiBrUEVGV2Vha0ltcG9ydExpYk1hc2spID09IDApIHsKLQkJCWVyciA9IGNmcmFnRnJhZ21lbnRVc2FnZUVycjsKLQkJfQotCX0KLQkKLQkvLyBOb3cgcnVuIHRoZSBtYWluIHJlbG9jYXRpb24gZW5naW5lLgotCQotCWlmIChlcnIgPT0gbm9FcnIpIHsKLQkJZXJyID0gUnVuUmVsb2NhdGlvbkVuZ2luZSgmZnJhZ1RvRml4LCBpbXBvcnRMaWJyYXJ5LCBsb29rdXAsIHJlZkNvbik7Ci0JfQotCQotCS8vIENsZWFuIHVwLgotCQotCWlmIChmcmFnVG9GaXguZGlzcG9zZVNlY3Rpb25Qb2ludGVycykgewotCQlpZiAoZnJhZ1RvRml4LmZpbGVSZWYgIT0gMCkgewotCQkJanVuayA9IEZTQ2xvc2UoZnJhZ1RvRml4LmZpbGVSZWYpOwotCQkJTW9yZUFzc2VydFEoanVuayA9PSBub0Vycik7Ci0JCX0KLQkJaWYgKGZyYWdUb0ZpeC5sb2FkZXJTZWN0aW9uICE9IG5pbCkgewotCQkJRGlzcG9zZVB0ciggKFB0cikgZnJhZ1RvRml4LmxvYWRlclNlY3Rpb24pOwotCQkJTW9yZUFzc2VydFEoTWVtRXJyb3IoKSA9PSBub0Vycik7Ci0JCX0KLQkJaWYgKGZyYWdUb0ZpeC5zZWN0aW9uSGVhZGVycyAhPSBuaWwpIHsKLQkJCURpc3Bvc2VQdHIoIChQdHIpIGZyYWdUb0ZpeC5zZWN0aW9uSGVhZGVycyk7Ci0JCQlNb3JlQXNzZXJ0UShNZW1FcnJvcigpID09IG5vRXJyKTsKLQkJfQotCX0KLQlyZXR1cm4gZXJyOworICAgIE1vcmVCbG9ja1plcm8oJmZyYWdUb0ZpeCwgc2l6ZW9mKGZyYWdUb0ZpeCkpOworICAgIGZyYWdUb0ZpeC5sb2NhdG9yID0gKmZyYWdUb0ZpeExvY2F0b3I7CisgICAgZnJhZ1RvRml4LmNvbm5JRCAgPSBmcmFnVG9GaXhDb25uSUQ7CisgICAgZnJhZ1RvRml4LmluaXRSb3V0aW5lID0gZnJhZ1RvRml4SW5pdFJvdXRpbmU7CisKKyAgICAvLyBNYWtlIGEgQyBzdHJpbmcgZnJvbSB3ZWFrTGlua2VkTGlicmFyeU5hbWUuCisKKyAgICBCbG9ja01vdmVEYXRhKHdlYWtMaW5rZWRMaWJyYXJ5TmFtZSArIDEsIHdlYWtMaW5rZWRMaWJyYXJ5TmFtZUNTdHJpbmcsIHdlYWtMaW5rZWRMaWJyYXJ5TmFtZVswXSk7CisgICAgd2Vha0xpbmtlZExpYnJhcnlOYW1lQ1N0cmluZ1t3ZWFrTGlua2VkTGlicmFyeU5hbWVbMF1dID0gMDsKKworICAgIC8vIEdldCB0aGUgYmFzaWMgaW5mb3JtYXRpb24gZnJvbSB0aGUgZnJhZ21lbnQuCisgICAgLy8gRmlsbHMgb3V0IHRoZSBjb250YWluZXJIZWFkZXIsIHNlY3Rpb25IZWFkZXJzLCBsb2FkZXJTZWN0aW9uIGFuZCBmaWxlUmVmIGZpZWxkcworICAgIC8vIG9mIGZyYWdUb0ZpeC4KKworICAgIGVyciA9IFJlYWRDb250YWluZXJCYXNpY3MoJmZyYWdUb0ZpeCk7CisKKyAgICAvLyBTZXQgdXAgdGhlIGJhc2UgYWRkcmVzcyBmaWVsZHMgaW4gZnJhZ1RvRml4IChpZSBzZWN0aW9uMEJhc2UgYW5kIHNlY3Rpb24xQmFzZSkKKyAgICAvLyBieSBsb29raW5nIHVwIG91ciBpbml0IHJvdXRpbmUgKGZyYWdUb0ZpeC5pbml0Um91dGluZSkgYW5kIHN1YnRyYWN0aW5nCisgICAgLy8gYXdheSB0aGUgc2VjdGlvbiBvZmZzZXRzICh3aGljaCB3ZSBnZXQgZnJvbSB0aGUgZGlzayBjb3B5IG9mIHRoZSBzZWN0aW9uKQorICAgIC8vIHRvIGRlcml2ZSB0aGUgYmFzZXMgb2YgdGhlIHNlY3Rpb25zIHRoZW1zZWx2ZXMuCisKKyAgICBpZiAoZXJyID09IG5vRXJyKSB7CisgICAgICAgIGVyciA9IFNldHVwU2VjdGlvbkJhc2VBZGRyZXNzZXMoJmZyYWdUb0ZpeCk7CisgICAgfQorCisgICAgLy8gTG9vayBpbnNpZGUgdGhlIGxvYWRlciBzZWN0aW9uIGZvciB0aGUgaW1wb3J0IGxpYnJhcnkgZGVzY3JpcHRpb24KKyAgICAvLyBvZiB3ZWFrTGlua2VkTGlicmFyeU5hbWUuICBXZSBuZWVkIHRoaXMgdG8ga25vdyB0aGUgcmFuZ2Ugb2Ygc3ltYm9sCisgICAgLy8gaW5kZXhlcyB3ZSdyZSBnb2luZyB0byBmaXggdXAuCisKKyAgICBpZiAoZXJyID09IG5vRXJyKSB7CisgICAgICAgIGVyciA9IEZpbmRJbXBvcnRMaWJyYXJ5KGZyYWdUb0ZpeC5sb2FkZXJTZWN0aW9uLCB3ZWFrTGlua2VkTGlicmFyeU5hbWVDU3RyaW5nLCAmaW1wb3J0TGlicmFyeSk7CisgICAgfQorCisgICAgLy8gRG8gYSBxdWljayBjaGVjayB0byBlbnN1cmUgdGhhdCB0aGUgbGlicmFyeSB3YXMgYWN0dWFsbHkgaW1wb3J0ZWQgd2Vhay4KKyAgICAvLyBJZiBpdCB3YXNuJ3QsIGl0IGRvZXNuJ3QgbWFrZSBtdWNoIHNlbnNlIHRvIHJlc29sdmUgaXRzIHdlYWsgaW1wb3J0cworICAgIC8vIGxhdGVyIG9uLiAgUmVzb2x2aW5nIHRoZW0gYWdhaW4gaXMgbGlrZWx5IHRvIGJlIGJhZC4KKworICAgIGlmIChlcnIgPT0gbm9FcnIpIHsKKyAgICAgICAgaWYgKChpbXBvcnRMaWJyYXJ5LT5vcHRpb25zICYga1BFRldlYWtJbXBvcnRMaWJNYXNrKSA9PSAwKSB7CisgICAgICAgICAgICBlcnIgPSBjZnJhZ0ZyYWdtZW50VXNhZ2VFcnI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBOb3cgcnVuIHRoZSBtYWluIHJlbG9jYXRpb24gZW5naW5lLgorCisgICAgaWYgKGVyciA9PSBub0VycikgeworICAgICAgICBlcnIgPSBSdW5SZWxvY2F0aW9uRW5naW5lKCZmcmFnVG9GaXgsIGltcG9ydExpYnJhcnksIGxvb2t1cCwgcmVmQ29uKTsKKyAgICB9CisKKyAgICAvLyBDbGVhbiB1cC4KKworICAgIGlmIChmcmFnVG9GaXguZGlzcG9zZVNlY3Rpb25Qb2ludGVycykgeworICAgICAgICBpZiAoZnJhZ1RvRml4LmZpbGVSZWYgIT0gMCkgeworICAgICAgICAgICAganVuayA9IEZTQ2xvc2UoZnJhZ1RvRml4LmZpbGVSZWYpOworICAgICAgICAgICAgTW9yZUFzc2VydFEoanVuayA9PSBub0Vycik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZyYWdUb0ZpeC5sb2FkZXJTZWN0aW9uICE9IG5pbCkgeworICAgICAgICAgICAgRGlzcG9zZVB0ciggKFB0cikgZnJhZ1RvRml4LmxvYWRlclNlY3Rpb24pOworICAgICAgICAgICAgTW9yZUFzc2VydFEoTWVtRXJyb3IoKSA9PSBub0Vycik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZyYWdUb0ZpeC5zZWN0aW9uSGVhZGVycyAhPSBuaWwpIHsKKyAgICAgICAgICAgIERpc3Bvc2VQdHIoIChQdHIpIGZyYWdUb0ZpeC5zZWN0aW9uSGVhZGVycyk7CisgICAgICAgICAgICBNb3JlQXNzZXJ0UShNZW1FcnJvcigpID09IG5vRXJyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgcGFzY2FsIE9TU3RhdHVzIEZyYWdtZW50TG9va3VwKENvbnN0U3RyMjU1UGFyYW0gc3ltTmFtZSwgQ0ZyYWdTeW1ib2xDbGFzcyBzeW1DbGFzcywKLQkJCQkJCQkJCXZvaWQgKipzeW1BZGRyLCB2b2lkICpyZWZDb24pCi0JLy8gVGhpcyBpcyB0aGUgQ0ZNTGF0ZUltcG9ydExvb2t1cFByb2MgY2FsbGJhY2sgdXNlZCB3aGVuIAotCS8vIGxhdGUgaW1wb3J0aW5nIGZyb20gYSBDRk0gc2hhcmVkIGxpYnJhcnkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqc3ltQWRkciwgdm9pZCAqcmVmQ29uKQorICAgIC8vIFRoaXMgaXMgdGhlIENGTUxhdGVJbXBvcnRMb29rdXBQcm9jIGNhbGxiYWNrIHVzZWQgd2hlbgorICAgIC8vIGxhdGUgaW1wb3J0aW5nIGZyb20gYSBDRk0gc2hhcmVkIGxpYnJhcnkuCiB7Ci0JT1NTdGF0dXMgZXJyOwotCUNGcmFnQ29ubmVjdGlvbklEIGNvbm5JRFRvSW1wb3J0OwotCUNGcmFnU3ltYm9sQ2xhc3MgIGZvdW5kU3ltQ2xhc3M7Ci0JCi0JTW9yZUFzc2VydFEoc3ltTmFtZSAhPSBuaWwpOwotCU1vcmVBc3NlcnRRKHN5bUFkZHIgIT0gbmlsKTsKLQlNb3JlQXNzZXJ0UShyZWZDb24gICE9IG5pbCk7Ci0JCi0JY29ubklEVG9JbXBvcnQgPSAoQ0ZyYWdDb25uZWN0aW9uSUQpIHJlZkNvbjsKLQkKLQkvLyBTaGFtZSB0aGVyZSdzIG5vIHdheSB0byB2YWxpZGF0ZSB0aGF0IGNvbm5JRFRvSW1wb3J0IGlzIHZhbGlkLgorICAgIE9TU3RhdHVzIGVycjsKKyAgICBDRnJhZ0Nvbm5lY3Rpb25JRCBjb25uSURUb0ltcG9ydDsKKyAgICBDRnJhZ1N5bWJvbENsYXNzICBmb3VuZFN5bUNsYXNzOwogCi0JZXJyID0gRmluZFN5bWJvbChjb25uSURUb0ltcG9ydCwgc3ltTmFtZSwgKFB0ciAqKSBzeW1BZGRyLCAmZm91bmRTeW1DbGFzcyk7Ci0JaWYgKGVyciA9PSBub0VycikgewotCQkvLyBJZiB0aGUgc3ltYm9sIGlzbid0IG9mIHRoZSByaWdodCBjbGFzcywgd2UgYWN0IGxpa2Ugd2UgZGlkbid0IAotCQkvLyBmaW5kIGl0LCBidXQgYWxzbyBhc3NlcnQgaW4gdGhlIGRlYnVnIGJ1aWxkIGJlY2F1c2Ugd2VpcmQgdGhpbmdzIAotCQkvLyBhcmUgYWZvb3QuCi0JCWlmIChmb3VuZFN5bUNsYXNzICE9IHN5bUNsYXNzKSB7Ci0JCQlNb3JlQXNzZXJ0UShmYWxzZSk7Ci0JCQkqc3ltQWRkciA9IG5pbDsKLQkJCWVyciA9IGNmcmFnTm9TeW1ib2xFcnI7Ci0JCX0KLQl9Ci0JcmV0dXJuIGVycjsKKyAgICBNb3JlQXNzZXJ0UShzeW1OYW1lICE9IG5pbCk7CisgICAgTW9yZUFzc2VydFEoc3ltQWRkciAhPSBuaWwpOworICAgIE1vcmVBc3NlcnRRKHJlZkNvbiAgIT0gbmlsKTsKKworICAgIGNvbm5JRFRvSW1wb3J0ID0gKENGcmFnQ29ubmVjdGlvbklEKSByZWZDb247CisKKyAgICAvLyBTaGFtZSB0aGVyZSdzIG5vIHdheSB0byB2YWxpZGF0ZSB0aGF0IGNvbm5JRFRvSW1wb3J0IGlzIHZhbGlkLgorCisgICAgZXJyID0gRmluZFN5bWJvbChjb25uSURUb0ltcG9ydCwgc3ltTmFtZSwgKFB0ciAqKSBzeW1BZGRyLCAmZm91bmRTeW1DbGFzcyk7CisgICAgaWYgKGVyciA9PSBub0VycikgeworICAgICAgICAvLyBJZiB0aGUgc3ltYm9sIGlzbid0IG9mIHRoZSByaWdodCBjbGFzcywgd2UgYWN0IGxpa2Ugd2UgZGlkbid0CisgICAgICAgIC8vIGZpbmQgaXQsIGJ1dCBhbHNvIGFzc2VydCBpbiB0aGUgZGVidWcgYnVpbGQgYmVjYXVzZSB3ZWlyZCB0aGluZ3MKKyAgICAgICAgLy8gYXJlIGFmb290LgorICAgICAgICBpZiAoZm91bmRTeW1DbGFzcyAhPSBzeW1DbGFzcykgeworICAgICAgICAgICAgTW9yZUFzc2VydFEoZmFsc2UpOworICAgICAgICAgICAgKnN5bUFkZHIgPSBuaWw7CisgICAgICAgICAgICBlcnIgPSBjZnJhZ05vU3ltYm9sRXJyOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBlcnI7CiB9CiAKIGV4dGVybiBwYXNjYWwgT1NTdGF0dXMgQ0ZNTGF0ZUltcG9ydExpYnJhcnkoY29uc3QgQ0ZyYWdTeXN0ZW03RGlza0ZsYXRMb2NhdG9yICpmcmFnVG9GaXhMb2NhdG9yLAotCQkJCQkJCQkJCUNGcmFnQ29ubmVjdGlvbklEIGZyYWdUb0ZpeENvbm5JRCwKLQkJCQkJCQkJCQlDRnJhZ0luaXRGdW5jdGlvbiBmcmFnVG9GaXhJbml0Um91dGluZSwKLQkJCQkJCQkJCQlDb25zdFN0cjI1NVBhcmFtIHdlYWtMaW5rZWRMaWJyYXJ5TmFtZSwKLQkJCQkJCQkJCQlDRnJhZ0Nvbm5lY3Rpb25JRCBjb25uSURUb0ltcG9ydCkKLQkvLyBTZWUgY29tbWVudHMgaW4gaW50ZXJmYWNlIHBhcnQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGcmFnQ29ubmVjdGlvbklEIGZyYWdUb0ZpeENvbm5JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZyYWdJbml0RnVuY3Rpb24gZnJhZ1RvRml4SW5pdFJvdXRpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0U3RyMjU1UGFyYW0gd2Vha0xpbmtlZExpYnJhcnlOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRnJhZ0Nvbm5lY3Rpb25JRCBjb25uSURUb0ltcG9ydCkKKyAgICAvLyBTZWUgY29tbWVudHMgaW4gaW50ZXJmYWNlIHBhcnQuCiB7Ci0JTW9yZUFzc2VydFEoY29ubklEVG9JbXBvcnQgIT0gbmlsKTsKLQlyZXR1cm4gQ0ZNTGF0ZUltcG9ydENvcmUoZnJhZ1RvRml4TG9jYXRvciwgZnJhZ1RvRml4Q29ubklELCBmcmFnVG9GaXhJbml0Um91dGluZSwKLQkJCQkJCQkJCQl3ZWFrTGlua2VkTGlicmFyeU5hbWUsIEZyYWdtZW50TG9va3VwLCBjb25uSURUb0ltcG9ydCk7CisgICAgTW9yZUFzc2VydFEoY29ubklEVG9JbXBvcnQgIT0gbmlsKTsKKyAgICByZXR1cm4gQ0ZNTGF0ZUltcG9ydENvcmUoZnJhZ1RvRml4TG9jYXRvciwgZnJhZ1RvRml4Q29ubklELCBmcmFnVG9GaXhJbml0Um91dGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWFrTGlua2VkTGlicmFyeU5hbWUsIEZyYWdtZW50TG9va3VwLCBjb25uSURUb0ltcG9ydCk7CiB9CiAKIHN0YXRpYyBwYXNjYWwgT1NTdGF0dXMgQnVuZGxlTG9va3VwKENvbnN0U3RyMjU1UGFyYW0gc3ltTmFtZSwgQ0ZyYWdTeW1ib2xDbGFzcyBzeW1DbGFzcywKLQkJCQkJCQkJCXZvaWQgKipzeW1BZGRyLCB2b2lkICpyZWZDb24pCi0JLy8gVGhpcyBpcyB0aGUgQ0ZNTGF0ZUltcG9ydExvb2t1cFByb2MgY2FsbGJhY2sgdXNlZCB3aGVuIAotCS8vIGxhdGUgaW1wb3J0aW5nIGZyb20gYSBDRkJ1bmRsZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKipzeW1BZGRyLCB2b2lkICpyZWZDb24pCisgICAgLy8gVGhpcyBpcyB0aGUgQ0ZNTGF0ZUltcG9ydExvb2t1cFByb2MgY2FsbGJhY2sgdXNlZCB3aGVuCisgICAgLy8gbGF0ZSBpbXBvcnRpbmcgZnJvbSBhIENGQnVuZGxlLgogewotCU9TU3RhdHVzIAllcnI7Ci0JQ0ZCdW5kbGVSZWYgYnVuZGxlVG9JbXBvcnQ7Ci0JQ0ZTdHJpbmdSZWYgc3ltTmFtZVN0cjsKLQkKLQlNb3JlQXNzZXJ0UShzeW1OYW1lICE9IG5pbCk7Ci0JTW9yZUFzc2VydFEoc3ltQWRkciAhPSBuaWwpOwotCU1vcmVBc3NlcnRRKHJlZkNvbiAgIT0gbmlsKTsKLQkKLQlzeW1OYW1lU3RyID0gbmlsOwotCQotCWJ1bmRsZVRvSW1wb3J0ID0gKENGQnVuZGxlUmVmKSByZWZDb247Ci0JCi0JLy8gU2hhbWUgdGhlcmUncyBubyB3YXkgdG8gdmFsaWRhdGUgdGhhdCBidW5kbGVUb0ltcG9ydCBpcyByZWFsbHkgYSBidW5kbGUuCi0JCi0JLy8gV2UgY2FuIG9ubHkgZmluZCBmdW5jdGlvbiBwb2ludGVycyBiZWNhdXNlIENGQnVuZGxlR2V0RnVuY3Rpb25Qb2ludGVyRm9yTmFtZSAKLQkvLyBvbmx5IHdvcmtzIGZvciBmdW5jdGlvbiBwb2ludGVycy4gIFNvIGlmIHRoZSBjbGllbnQgaXMgYXNraW5nIGZvciBzb21ldGhpbmcgCi0JLy8gb3RoZXIgdGhhbiBhIGZ1bmN0aW9uIHBvaW50ZXIgKGllIFRWZWN0b3Igc3ltYm9sKSB0aGVuIHdlIGRvbid0IGV2ZW4gdHJ1ZS4KLQkvLyBBbHNvIGFzc2VydCBpbiB0aGUgZGVidWcgYnVpbGQgYmVjYXVzZSB0aGlzIHNob3dzIGEgY2VydGFpbiBsYWNrIG9mIAotCS8vIHVuZGVyc3RhbmRpbmcgb24gdGhlIHBhcnQgb2YgdGhlIGNsaWVudC4KLQkvLwotCS8vIENGIGlzIGJlaW5nIHJldmlzZSB0byBzdXBwb3J0IGFjY2Vzc2luZyBkYXRhIHN5bWJvbHMgdXNpbmcgYSBuZXcgQVBJCi0JLy8gKGN1cnJlbnRseSB0aGlzIGlzIGF2YWlsYWJsZSB0byBBcHBsZSBpbnRlcm5hbCBkZXZlbG9wZXJzIGFzIAotCS8vIENGQnVuZGxlR2V0RGF0YVBvaW50ZXJGb3JOYW1lKS4gIFdoZW4gdGhlIG5ldyBBUEkgaXMgYXZhaWxhYmxlIGluIGEgCi0JLy8gcHVibGljIGhlYWRlciBmaWxlIEkgc2hvdWxkIHJldmlzZSB0aGlzIGNvZGUgdG8gbGlmdCB0aGlzIHJlc3RyaWN0aW9uLgotCQotCWVyciA9IG5vRXJyOwotCWlmIChzeW1DbGFzcyAhPSBrVFZlY3RvckNGcmFnU3ltYm9sKSB7Ci0JCU1vcmVBc3NlcnRRKGZhbHNlKTsKLQkJZXJyID0gY2ZyYWdOb1N5bWJvbEVycjsKLQl9Ci0JaWYgKGVyciA9PSBub0VycikgewotCQlzeW1OYW1lU3RyID0gQ0ZTdHJpbmdDcmVhdGVXaXRoUGFzY2FsU3RyaW5nKGtDRkFsbG9jYXRvclN5c3RlbURlZmF1bHQsIAotCQkJCQkJCQkJCQkJCXN5bU5hbWUsIGtDRlN0cmluZ0VuY29kaW5nTWFjUm9tYW4pOwotCQlpZiAoc3ltTmFtZVN0ciA9PSBuaWwpIHsKLQkJCWVyciA9IGNvcmVGb3VuZGF0aW9uVW5rbm93bkVycjsKLQkJfQotCX0KLQlpZiAoZXJyID09IG5vRXJyKSB7Ci0JCSpzeW1BZGRyID0gQ0ZCdW5kbGVHZXRGdW5jdGlvblBvaW50ZXJGb3JOYW1lKGJ1bmRsZVRvSW1wb3J0LCBzeW1OYW1lU3RyKTsKLQkJaWYgKCpzeW1BZGRyID09IG5pbCkgewotCQkJZXJyID0gY2ZyYWdOb1N5bWJvbEVycjsKLQkJfQotCX0KLQlpZiAoc3ltTmFtZVN0ciAhPSBuaWwpIHsKLQkJQ0ZSZWxlYXNlKHN5bU5hbWVTdHIpOwotCX0KLQlyZXR1cm4gZXJyOworICAgIE9TU3RhdHVzICAgICAgICAgICAgZXJyOworICAgIENGQnVuZGxlUmVmIGJ1bmRsZVRvSW1wb3J0OworICAgIENGU3RyaW5nUmVmIHN5bU5hbWVTdHI7CisKKyAgICBNb3JlQXNzZXJ0UShzeW1OYW1lICE9IG5pbCk7CisgICAgTW9yZUFzc2VydFEoc3ltQWRkciAhPSBuaWwpOworICAgIE1vcmVBc3NlcnRRKHJlZkNvbiAgIT0gbmlsKTsKKworICAgIHN5bU5hbWVTdHIgPSBuaWw7CisKKyAgICBidW5kbGVUb0ltcG9ydCA9IChDRkJ1bmRsZVJlZikgcmVmQ29uOworCisgICAgLy8gU2hhbWUgdGhlcmUncyBubyB3YXkgdG8gdmFsaWRhdGUgdGhhdCBidW5kbGVUb0ltcG9ydCBpcyByZWFsbHkgYSBidW5kbGUuCisKKyAgICAvLyBXZSBjYW4gb25seSBmaW5kIGZ1bmN0aW9uIHBvaW50ZXJzIGJlY2F1c2UgQ0ZCdW5kbGVHZXRGdW5jdGlvblBvaW50ZXJGb3JOYW1lCisgICAgLy8gb25seSB3b3JrcyBmb3IgZnVuY3Rpb24gcG9pbnRlcnMuICBTbyBpZiB0aGUgY2xpZW50IGlzIGFza2luZyBmb3Igc29tZXRoaW5nCisgICAgLy8gb3RoZXIgdGhhbiBhIGZ1bmN0aW9uIHBvaW50ZXIgKGllIFRWZWN0b3Igc3ltYm9sKSB0aGVuIHdlIGRvbid0IGV2ZW4gdHJ1ZS4KKyAgICAvLyBBbHNvIGFzc2VydCBpbiB0aGUgZGVidWcgYnVpbGQgYmVjYXVzZSB0aGlzIHNob3dzIGEgY2VydGFpbiBsYWNrIG9mCisgICAgLy8gdW5kZXJzdGFuZGluZyBvbiB0aGUgcGFydCBvZiB0aGUgY2xpZW50LgorICAgIC8vCisgICAgLy8gQ0YgaXMgYmVpbmcgcmV2aXNlIHRvIHN1cHBvcnQgYWNjZXNzaW5nIGRhdGEgc3ltYm9scyB1c2luZyBhIG5ldyBBUEkKKyAgICAvLyAoY3VycmVudGx5IHRoaXMgaXMgYXZhaWxhYmxlIHRvIEFwcGxlIGludGVybmFsIGRldmVsb3BlcnMgYXMKKyAgICAvLyBDRkJ1bmRsZUdldERhdGFQb2ludGVyRm9yTmFtZSkuICBXaGVuIHRoZSBuZXcgQVBJIGlzIGF2YWlsYWJsZSBpbiBhCisgICAgLy8gcHVibGljIGhlYWRlciBmaWxlIEkgc2hvdWxkIHJldmlzZSB0aGlzIGNvZGUgdG8gbGlmdCB0aGlzIHJlc3RyaWN0aW9uLgorCisgICAgZXJyID0gbm9FcnI7CisgICAgaWYgKHN5bUNsYXNzICE9IGtUVmVjdG9yQ0ZyYWdTeW1ib2wpIHsKKyAgICAgICAgTW9yZUFzc2VydFEoZmFsc2UpOworICAgICAgICBlcnIgPSBjZnJhZ05vU3ltYm9sRXJyOworICAgIH0KKyAgICBpZiAoZXJyID09IG5vRXJyKSB7CisgICAgICAgIHN5bU5hbWVTdHIgPSBDRlN0cmluZ0NyZWF0ZVdpdGhQYXNjYWxTdHJpbmcoa0NGQWxsb2NhdG9yU3lzdGVtRGVmYXVsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bU5hbWUsIGtDRlN0cmluZ0VuY29kaW5nTWFjUm9tYW4pOworICAgICAgICBpZiAoc3ltTmFtZVN0ciA9PSBuaWwpIHsKKyAgICAgICAgICAgIGVyciA9IGNvcmVGb3VuZGF0aW9uVW5rbm93bkVycjsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoZXJyID09IG5vRXJyKSB7CisgICAgICAgICpzeW1BZGRyID0gQ0ZCdW5kbGVHZXRGdW5jdGlvblBvaW50ZXJGb3JOYW1lKGJ1bmRsZVRvSW1wb3J0LCBzeW1OYW1lU3RyKTsKKyAgICAgICAgaWYgKCpzeW1BZGRyID09IG5pbCkgeworICAgICAgICAgICAgZXJyID0gY2ZyYWdOb1N5bWJvbEVycjsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoc3ltTmFtZVN0ciAhPSBuaWwpIHsKKyAgICAgICAgQ0ZSZWxlYXNlKHN5bU5hbWVTdHIpOworICAgIH0KKyAgICByZXR1cm4gZXJyOwogfQogCiBleHRlcm4gcGFzY2FsIE9TU3RhdHVzIENGTUxhdGVJbXBvcnRCdW5kbGUoY29uc3QgQ0ZyYWdTeXN0ZW03RGlza0ZsYXRMb2NhdG9yICpmcmFnVG9GaXhMb2NhdG9yLAotCQkJCQkJCQkJCUNGcmFnQ29ubmVjdGlvbklEIGZyYWdUb0ZpeENvbm5JRCwKLQkJCQkJCQkJCQlDRnJhZ0luaXRGdW5jdGlvbiBmcmFnVG9GaXhJbml0Um91dGluZSwKLQkJCQkJCQkJCQlDb25zdFN0cjI1NVBhcmFtIHdlYWtMaW5rZWRMaWJyYXJ5TmFtZSwKLQkJCQkJCQkJCQlDRkJ1bmRsZVJlZiBidW5kbGVUb0ltcG9ydCkKLQkvLyBTZWUgY29tbWVudHMgaW4gaW50ZXJmYWNlIHBhcnQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGcmFnQ29ubmVjdGlvbklEIGZyYWdUb0ZpeENvbm5JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZyYWdJbml0RnVuY3Rpb24gZnJhZ1RvRml4SW5pdFJvdXRpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0U3RyMjU1UGFyYW0gd2Vha0xpbmtlZExpYnJhcnlOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRkJ1bmRsZVJlZiBidW5kbGVUb0ltcG9ydCkKKyAgICAvLyBTZWUgY29tbWVudHMgaW4gaW50ZXJmYWNlIHBhcnQuCiB7Ci0JTW9yZUFzc2VydFEoYnVuZGxlVG9JbXBvcnQgIT0gbmlsKTsKLQlyZXR1cm4gQ0ZNTGF0ZUltcG9ydENvcmUoZnJhZ1RvRml4TG9jYXRvciwgZnJhZ1RvRml4Q29ubklELCBmcmFnVG9GaXhJbml0Um91dGluZSwKLQkJCQkJCQkJCQl3ZWFrTGlua2VkTGlicmFyeU5hbWUsIEJ1bmRsZUxvb2t1cCwgYnVuZGxlVG9JbXBvcnQpOworICAgIE1vcmVBc3NlcnRRKGJ1bmRsZVRvSW1wb3J0ICE9IG5pbCk7CisgICAgcmV0dXJuIENGTUxhdGVJbXBvcnRDb3JlKGZyYWdUb0ZpeExvY2F0b3IsIGZyYWdUb0ZpeENvbm5JRCwgZnJhZ1RvRml4SW5pdFJvdXRpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2Vha0xpbmtlZExpYnJhcnlOYW1lLCBCdW5kbGVMb29rdXAsIGJ1bmRsZVRvSW1wb3J0KTsKIH0KZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL2NnL0NGTUxhdGVJbXBvcnQuaCBiL01hYy9Nb2R1bGVzL2NnL0NGTUxhdGVJbXBvcnQuaAppbmRleCBmM2E4OWJjLi4wODc4OTYwIDEwMDc1NQotLS0gYS9NYWMvTW9kdWxlcy9jZy9DRk1MYXRlSW1wb3J0LmgKKysrIGIvTWFjL01vZHVsZXMvY2cvQ0ZNTGF0ZUltcG9ydC5oCkBAIC0xLDMzICsxLDMzIEBACiAvKgotCUZpbGU6CQlDRk1MYXRlSW1wb3J0LmgKKyAgICBGaWxlOiAgICAgICAgICAgICAgIENGTUxhdGVJbXBvcnQuaAogCi0JQ29udGFpbnM6CUludGVyZmFjZSB0byBDRk0gbGF0ZSBpbXBvcnQgbGlicmFyeS4KKyAgICBDb250YWluczogICAgICAgICAgIEludGVyZmFjZSB0byBDRk0gbGF0ZSBpbXBvcnQgbGlicmFyeS4KIAotCVdyaXR0ZW4gYnk6CVF1aW5uCisgICAgV3JpdHRlbiBieTogICAgICAgICBRdWlubgogCi0JQ29weXJpZ2h0OglDb3B5cmlnaHQgqSAxOTk5IGJ5IEFwcGxlIENvbXB1dGVyLCBJbmMuLCBhbGwgcmlnaHRzIHJlc2VydmVkLgorICAgIENvcHlyaWdodDogICAgICAgICAgQ29weXJpZ2h0IKkgMTk5OSBieSBBcHBsZSBDb21wdXRlciwgSW5jLiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KIAotCQkJCVlvdSBtYXkgaW5jb3Jwb3JhdGUgdGhpcyBBcHBsZSBzYW1wbGUgc291cmNlIGNvZGUgaW50byB5b3VyIHByb2dyYW0ocykgd2l0aG91dAotCQkJCXJlc3RyaWN0aW9uLiBUaGlzIEFwcGxlIHNhbXBsZSBzb3VyY2UgY29kZSBoYXMgYmVlbiBwcm92aWRlZCAiQVMgSVMiIGFuZCB0aGUKLQkJCQlyZXNwb25zaWJpbGl0eSBmb3IgaXRzIG9wZXJhdGlvbiBpcyB5b3Vycy4gWW91IGFyZSBub3QgcGVybWl0dGVkIHRvIHJlZGlzdHJpYnV0ZQotCQkJCXRoaXMgQXBwbGUgc2FtcGxlIHNvdXJjZSBjb2RlIGFzICJBcHBsZSBzYW1wbGUgc291cmNlIGNvZGUiIGFmdGVyIGhhdmluZyBtYWRlCi0JCQkJY2hhbmdlcy4gSWYgeW91J3JlIGdvaW5nIHRvIHJlLWRpc3RyaWJ1dGUgdGhlIHNvdXJjZSwgd2UgcmVxdWlyZSB0aGF0IHlvdSBtYWtlCi0JCQkJaXQgY2xlYXIgaW4gdGhlIHNvdXJjZSB0aGF0IHRoZSBjb2RlIHdhcyBkZXNjZW5kZWQgZnJvbSBBcHBsZSBzYW1wbGUgc291cmNlCi0JCQkJY29kZSwgYnV0IHRoYXQgeW91J3ZlIG1hZGUgY2hhbmdlcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBZb3UgbWF5IGluY29ycG9yYXRlIHRoaXMgQXBwbGUgc2FtcGxlIHNvdXJjZSBjb2RlIGludG8geW91ciBwcm9ncmFtKHMpIHdpdGhvdXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN0cmljdGlvbi4gVGhpcyBBcHBsZSBzYW1wbGUgc291cmNlIGNvZGUgaGFzIGJlZW4gcHJvdmlkZWQgIkFTIElTIiBhbmQgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2liaWxpdHkgZm9yIGl0cyBvcGVyYXRpb24gaXMgeW91cnMuIFlvdSBhcmUgbm90IHBlcm1pdHRlZCB0byByZWRpc3RyaWJ1dGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIEFwcGxlIHNhbXBsZSBzb3VyY2UgY29kZSBhcyAiQXBwbGUgc2FtcGxlIHNvdXJjZSBjb2RlIiBhZnRlciBoYXZpbmcgbWFkZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZXMuIElmIHlvdSdyZSBnb2luZyB0byByZS1kaXN0cmlidXRlIHRoZSBzb3VyY2UsIHdlIHJlcXVpcmUgdGhhdCB5b3UgbWFrZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0IGNsZWFyIGluIHRoZSBzb3VyY2UgdGhhdCB0aGUgY29kZSB3YXMgZGVzY2VuZGVkIGZyb20gQXBwbGUgc2FtcGxlIHNvdXJjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUsIGJ1dCB0aGF0IHlvdSd2ZSBtYWRlIGNoYW5nZXMuCiAKLQlDaGFuZ2UgSGlzdG9yeSAobW9zdCByZWNlbnQgZmlyc3QpOgorICAgIENoYW5nZSBIaXN0b3J5IChtb3N0IHJlY2VudCBmaXJzdCk6CiAKLSAgICAgICAgIDw2PiAgICAgMjEvOS8wMSAgICBRdWlubiAgIENoYW5nZXMgZm9yIENXUHJvNyBNYWNoLU8gYnVpbGQuCi0gICAgICAgICA8NT4gICAgIDE5LzkvMDEgICAgUXVpbm4gICBDaGFuZ2UgY29tbWVudHMgdG8gcmVmbGVjdCB0aGUgZmFjdCB0aGF0IGFuIHVucGFja2VkIGRhdGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb24gaXMgbm8gbG9uZ2VyIHJlcXVpcmVkLgotICAgICAgICAgPDQ+ICAgICAxOS85LzAxICAgIFF1aW5uICAgU2ltcGxpZmllZCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIGFmdGVyIGEgc3VnZ2VzdGlvbiBieSBFcmljCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFudC4gWW91IG5vIGxvbmdlciBoYXZlIHRvIENGTSBleHBvcnQgYSBkdW1teSBmdW5jdGlvbjsgeW91Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW4ganVzdCBwYXNzIGluIHRoZSBhZGRyZXNzIG9mIHlvdXIgZnJhZ21lbnQncyBpbml0IHJvdXRpbmUuCi0gICAgICAgICA8Mz4gICAgMTYvMTEvMDAgICAgUXVpbm4gICBBbGxvdyBzeW1ib2wgZmluZGluZyB2aWEgYSBjYWxsYmFjayBhbmQgdXNlIHRoYXQgdG8gaW1wbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRkJ1bmRsZSBzdXBwb3J0LgotICAgICAgICAgPDI+ICAgIDE4LzEwLzk5ICAgIFF1aW5uICAgUmVuYW1lZCBDRk1MYXRlSW1wb3J0IHRvIENGTUxhdGVJbXBvcnRMaWJyYXJ5IHRvIGFsbG93IGZvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zc2libGUgZnV0dXJlIEFQSSBleHBhbnNpb24uCi0gICAgICAgICA8MT4gICAgIDE1LzYvOTkgICAgUXVpbm4gICBGaXJzdCBjaGVja2VkIGluLgorICAgICA8Nj4gICAgIDIxLzkvMDEgICAgUXVpbm4gICBDaGFuZ2VzIGZvciBDV1BybzcgTWFjaC1PIGJ1aWxkLgorICAgICA8NT4gICAgIDE5LzkvMDEgICAgUXVpbm4gICBDaGFuZ2UgY29tbWVudHMgdG8gcmVmbGVjdCB0aGUgZmFjdCB0aGF0IGFuIHVucGFja2VkIGRhdGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbiBpcyBubyBsb25nZXIgcmVxdWlyZWQuCisgICAgIDw0PiAgICAgMTkvOS8wMSAgICBRdWlubiAgIFNpbXBsaWZpZWQgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiBhZnRlciBhIHN1Z2dlc3Rpb24gYnkgRXJpYworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFudC4gWW91IG5vIGxvbmdlciBoYXZlIHRvIENGTSBleHBvcnQgYSBkdW1teSBmdW5jdGlvbjsgeW91CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbiBqdXN0IHBhc3MgaW4gdGhlIGFkZHJlc3Mgb2YgeW91ciBmcmFnbWVudCdzIGluaXQgcm91dGluZS4KKyAgICAgPDM+ICAgIDE2LzExLzAwICAgIFF1aW5uICAgQWxsb3cgc3ltYm9sIGZpbmRpbmcgdmlhIGEgY2FsbGJhY2sgYW5kIHVzZSB0aGF0IHRvIGltcGxlbWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRkJ1bmRsZSBzdXBwb3J0LgorICAgICA8Mj4gICAgMTgvMTAvOTkgICAgUXVpbm4gICBSZW5hbWVkIENGTUxhdGVJbXBvcnQgdG8gQ0ZNTGF0ZUltcG9ydExpYnJhcnkgdG8gYWxsb3cgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3NpYmxlIGZ1dHVyZSBBUEkgZXhwYW5zaW9uLgorICAgICA8MT4gICAgIDE1LzYvOTkgICAgUXVpbm4gICBGaXJzdCBjaGVja2VkIGluLgogKi8KIAogI3ByYWdtYSBvbmNlCkBAIC00MSwxMCArNDEsMTAgQEAKIC8vIE1hYyBPUyBJbnRlcmZhY2VzCiAKICNpZiAhIE1PUkVfRlJBTUVXT1JLX0lOQ0xVREVTCi0JI2luY2x1ZGUgPE1hY1R5cGVzLmg+Ci0JI2luY2x1ZGUgPENvZGVGcmFnbWVudHMuaD4KLQkjaW5jbHVkZSA8RGV2aWNlcy5oPgotCSNpbmNsdWRlIDxDRkJ1bmRsZS5oPgorICAgICNpbmNsdWRlIDxNYWNUeXBlcy5oPgorICAgICNpbmNsdWRlIDxDb2RlRnJhZ21lbnRzLmg+CisgICAgI2luY2x1ZGUgPERldmljZXMuaD4KKyAgICAjaW5jbHVkZSA8Q0ZCdW5kbGUuaD4KICNlbmRpZgogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwpAQCAtNTMsMjE5ICs1MywyMTkgQEAKIGV4dGVybiAiQyIgewogI2VuZGlmCiAKLS8qCUZBUQotCS0tLQotCQotCVE6CVdoYXQgZG9lcyB0aGlzIGxpYnJhcnkgZG8/Ci0JQToJSXQgYWxsb3dzIHlvdSB0byByZXNvbHZlIGEgd2VhayBsaW5rZWQgbGlicmFyeSBhdCBydW50aW1lLAotCSAgIAlieSBzdXBwbHkgYSBDRk0gY29ubmVjdGlvbiB0byB0aGUgbGlicmFyeSB0aGF0IHNob3VsZCBzdWJzdGl0dXRlCi0JICAgCWZvciB0aGUgd2VhayBsaW5rZWQgb25lLgotCQotCVE6CURvZXMgdGhlIHN1YnN0aXR1dGVkIGxpYnJhcnkgaGF2ZSB0byBoYXZlIHRoZSBzYW1lIG5hbWUgYXMgdGhlCi0JCXdlYWsgbGlua2VkIGxpYnJhcnkuCi0JQToJTm8uCi0JCi0JUToJV2hhdCdzIHRoaXMgdXNlZnVsIGZvcj8KLQlBOglUaGUgbW9zdCBvYnZpb3VzIGV4YW1wbGUgb2Ygd2hlcmUgdGhpcyBpcyB1c2VmdWwgaXMgd2hlbgotCQl5b3UgcmVseSBvbiBzaGFyZWQgbGlicmFyaWVzIHRoYXQgdGhlIHVzZXIgbWlnaHQgZGVsZXRlCi0JCW9yIG1vdmUuICBUbyBjYW4gZmluZCB0aGUgc2hhcmVkIGxpYnJhcnkgKHBvc3NpYmx5IGV2ZW4KLQkJdXNpbmcgQ2F0U2VhcmNoKSwgY2FsbCBHZXREaXNrRnJhZ21lbnQgdG8gb3BlbiBhIGNvbm5lY3Rpb24KLQkJdG8gaXQsIGxhdGUgaW1wb3J0IGl0IHVzaW5nIHRoaXMgbGlicmFyeSwgYW5kIHRoZW4gdGhlCi0JCXJlc3Qgb2YgeW91ciBjb2RlIGNhbiBjb250aW51ZSB0byB1c2UgdGhlIHNoYXJlZCBsaWJyYXJ5Ci0JCWFzIGlmIG5vdGhpbmcgaGFkIGhhcHBlbmVkLiAgTm8gbW9yZSBkZWZpbmluZyB0aG91c2FuZHMKLQkJb2Ygc3R1YiByb3V0aW5lcyB3aGljaCBjYWxsIHRocm91Z2ggcm91dGluZSBwb2ludGVycy4KLQkJCi0JCVRoZXJlIGFyZSwgaG93ZXZlciwgbnVtZXJvdXMgbGVzcyBvYnZpb3VzIHVzZXMuICBZb3UgY2FuCi0JCXVzZSB0aGlzIGNvZGUgdG8gbWFrZSBhICdzZWxmIHJlcGFpcmluZycgYXBwbGljYXRpb24uICBJZgotCQl0aGUgdXNlciByZW1vdmVzIHlvdXIgc2hhcmVkIGxpYnJhcnkgZnJvbSB0aGUgRXh0ZW5zaW9ucwotCQlmb2xkZXIsIHRoZSBzdGFydHVwIGNvZGUgZm9yIHlvdXIgYXBwbGljYXRpb24gY2FuIG9mZmVyCi0JCXRvciByZS1pbnN0YWxsIGl0LiAgSWYgdGhlIHVzZXIgYWdyZWVzLCB5b3UgY2FuIHRoZW4KLQkJcmUtaW5zdGFsbCB5b3VyIHNoYXJlZCBsaWJyYXJ5LCBsYXRlIGltcG9ydCBpdCwgYW5kIHRoZW4KLQkJY29udGludWUgcnVubmluZyB5b3VyIGFwcGxpY2F0aW9uIGlmIG5vdGhpbmcgaGFwcGVuZWQuCi0JCQotCQlZb3UgY2FuIGV2ZW4gdXNlIHRoaXMgY29kZSB0byBmcmVlIHlvdXJzZWxmIGZyb20gdGhlCi0JCUV4dGVuc2lvbnMgZm9sZGVyIGVudGlyZWx5LiAgU2F5IHlvdSBoYXZlIGEgc3VpdGUgb2YKLQkJYXBwbGljYXRpb25zIHRoYXQgY3VycmVudGx5IGluc3RhbGxzIGEgZG96ZW4gc2hhcmVkIAotCQlsaWJyYXJpZXMgaW4gdGhlIEV4dGVuc2lvbnMgZm9sZGVyLiAgWW91IGNhbiBtb3ZlIHRob3NlCi0JCWxpYnJhcmllcyB0byBhbm90aGVyIGZvbGRlciBlbnRpcmVseSBhbmQgZWFjaCBhcHBsaWNhdGlvbidzCi0JCXN0YXJ0dXAgY29kZSBjYW4gdHJhY2sgZG93biB0aGUgbGlicmFyeSAodXNpbmcgYW4gYWxpYXMKLQkJaW4gdGhlIFByZWZlcmVuY2VzIGZpbGUpIGFuZCBsYXRlIGltcG9ydCBpdC4KLQkJCi0JCUFuIGV2ZW4gY29vbGVyIHVzZSBpcyB0byBwcm92aWRlIGVhc3kgYWJzdHJhY3Rpb24gbGF5ZXJzLgotCQlTYXkgeW91IGhhdmUgYSBuZXR3b3JrIGNvZGUgZm9yIGJvdGggdGhlIE1hY1RDUAotCQlBUEkgYW5kIHRoZSBPcGVuIFRyYW5zcG9ydCBBUEkuICBUeXBpY2FsbHksIHlvdSB3b3VsZCBiZQotCQlmb3JjZSB0byBkbyB0aGlzIGJ5IGhhdmluZyBhbiBhYnN0cmFjdGlvbiBsYXllciB3aGVyZSBldmVyeQotCQlyb3V0aW5lIGNvbnRhaW5zIGEgc3dpdGNoIGJldHdlZW4gTWFjVENQIGFuZCBPVC4gIFlvdXIKLQkJT3BlblNvY2tldCByb3V0aW5lIG1pZ2h0IGxvb2sgbGlrZToKKy8qICAgICAgRkFRCisgICAgLS0tCiAKLQkJCXN0YXRpYyBpbnQgT3BlblNvY2tldCh2b2lkKQotCQkJewotCQkJICAgIGlmIChnT1RBdmFpbGFibGUpIHsKLQkJCSAgICAgICAgcmV0dXJuIE9wZW5Tb2NrZXRPVCgpOwotCQkJICAgIH0gZWxzZSB7Ci0JCQkgICAgICAgIHJldHVybiBPcGVuU29ja2V0TWFjVENQKCk7Ci0JCQkgICAgfQotCQkJfQotCQkKLQkJV2l0aCB0aGlzIGNvZGUsIHlvdSBjYW4gYXZvaWQgdGhhdCBlbnRpcmVseS4gIFNpbXBseQotCQl3ZWFrIGxpbmsgdG8gYSBzaGFyZWQgbGlicmFyeSB0aGF0IHlvdSBrbm93IGlzIG5ldmVyCi0JCWdvaW5nIHRvIGJlIGltcGxlbWVudGVkICgiY3JlYTtNeVNvY2tldHNEdW1teSIpIGFuZCB0aGVuLCAKLQkJYXQgcnVudGltZSwgZGVjaWRlIHdoZXRoZXIgdGhlIHN5c3RlbSBoYXMgTWFjVENQIG9yIE9UCi0JCWFuZCBsYXRlIGltcG9ydCB0aGUgcmVsZXZhbnQgcmVhbCBpbXBsZW1lbnRhdGlvbgotCQkoImNyZWE7TXlTb2NrZXRzTWFjVENQIiBvciAiY3JlYTtNeVNvY2tldHNPVCIpLgotCQlPbmUgYmVuZWZpdCBvZiB0aGlzIGFwcHJvYWNoIGlzIHRoYXQgb25seSB0aGUgTWFjVENQIG9yCi0JCXRoZSBPVCBjb2RlIGlzIHJlc2lkZW50IGluIG1lbW9yeSBvbiBhbnkgZ2l2ZW4gc3lzdGVtLgorICAgIFE6ICAgICAgICAgIFdoYXQgZG9lcyB0aGlzIGxpYnJhcnkgZG8/CisgICAgQTogICAgICAgICAgSXQgYWxsb3dzIHlvdSB0byByZXNvbHZlIGEgd2VhayBsaW5rZWQgbGlicmFyeSBhdCBydW50aW1lLAorICAgICAgICBieSBzdXBwbHkgYSBDRk0gY29ubmVjdGlvbiB0byB0aGUgbGlicmFyeSB0aGF0IHNob3VsZCBzdWJzdGl0dXRlCisgICAgICAgIGZvciB0aGUgd2VhayBsaW5rZWQgb25lLgorCisgICAgUTogICAgICAgICAgRG9lcyB0aGUgc3Vic3RpdHV0ZWQgbGlicmFyeSBoYXZlIHRvIGhhdmUgdGhlIHNhbWUgbmFtZSBhcyB0aGUKKyAgICAgICAgd2VhayBsaW5rZWQgbGlicmFyeS4KKyAgICBBOiAgICAgICAgICBOby4KKworICAgIFE6ICAgICAgICAgIFdoYXQncyB0aGlzIHVzZWZ1bCBmb3I/CisgICAgQTogICAgICAgICAgVGhlIG1vc3Qgb2J2aW91cyBleGFtcGxlIG9mIHdoZXJlIHRoaXMgaXMgdXNlZnVsIGlzIHdoZW4KKyAgICAgICAgeW91IHJlbHkgb24gc2hhcmVkIGxpYnJhcmllcyB0aGF0IHRoZSB1c2VyIG1pZ2h0IGRlbGV0ZQorICAgICAgICBvciBtb3ZlLiAgVG8gY2FuIGZpbmQgdGhlIHNoYXJlZCBsaWJyYXJ5IChwb3NzaWJseSBldmVuCisgICAgICAgIHVzaW5nIENhdFNlYXJjaCksIGNhbGwgR2V0RGlza0ZyYWdtZW50IHRvIG9wZW4gYSBjb25uZWN0aW9uCisgICAgICAgIHRvIGl0LCBsYXRlIGltcG9ydCBpdCB1c2luZyB0aGlzIGxpYnJhcnksIGFuZCB0aGVuIHRoZQorICAgICAgICByZXN0IG9mIHlvdXIgY29kZSBjYW4gY29udGludWUgdG8gdXNlIHRoZSBzaGFyZWQgbGlicmFyeQorICAgICAgICBhcyBpZiBub3RoaW5nIGhhZCBoYXBwZW5lZC4gIE5vIG1vcmUgZGVmaW5pbmcgdGhvdXNhbmRzCisgICAgICAgIG9mIHN0dWIgcm91dGluZXMgd2hpY2ggY2FsbCB0aHJvdWdoIHJvdXRpbmUgcG9pbnRlcnMuCisKKyAgICAgICAgVGhlcmUgYXJlLCBob3dldmVyLCBudW1lcm91cyBsZXNzIG9idmlvdXMgdXNlcy4gIFlvdSBjYW4KKyAgICAgICAgdXNlIHRoaXMgY29kZSB0byBtYWtlIGEgJ3NlbGYgcmVwYWlyaW5nJyBhcHBsaWNhdGlvbi4gIElmCisgICAgICAgIHRoZSB1c2VyIHJlbW92ZXMgeW91ciBzaGFyZWQgbGlicmFyeSBmcm9tIHRoZSBFeHRlbnNpb25zCisgICAgICAgIGZvbGRlciwgdGhlIHN0YXJ0dXAgY29kZSBmb3IgeW91ciBhcHBsaWNhdGlvbiBjYW4gb2ZmZXIKKyAgICAgICAgdG9yIHJlLWluc3RhbGwgaXQuICBJZiB0aGUgdXNlciBhZ3JlZXMsIHlvdSBjYW4gdGhlbgorICAgICAgICByZS1pbnN0YWxsIHlvdXIgc2hhcmVkIGxpYnJhcnksIGxhdGUgaW1wb3J0IGl0LCBhbmQgdGhlbgorICAgICAgICBjb250aW51ZSBydW5uaW5nIHlvdXIgYXBwbGljYXRpb24gaWYgbm90aGluZyBoYXBwZW5lZC4KKworICAgICAgICBZb3UgY2FuIGV2ZW4gdXNlIHRoaXMgY29kZSB0byBmcmVlIHlvdXJzZWxmIGZyb20gdGhlCisgICAgICAgIEV4dGVuc2lvbnMgZm9sZGVyIGVudGlyZWx5LiAgU2F5IHlvdSBoYXZlIGEgc3VpdGUgb2YKKyAgICAgICAgYXBwbGljYXRpb25zIHRoYXQgY3VycmVudGx5IGluc3RhbGxzIGEgZG96ZW4gc2hhcmVkCisgICAgICAgIGxpYnJhcmllcyBpbiB0aGUgRXh0ZW5zaW9ucyBmb2xkZXIuICBZb3UgY2FuIG1vdmUgdGhvc2UKKyAgICAgICAgbGlicmFyaWVzIHRvIGFub3RoZXIgZm9sZGVyIGVudGlyZWx5IGFuZCBlYWNoIGFwcGxpY2F0aW9uJ3MKKyAgICAgICAgc3RhcnR1cCBjb2RlIGNhbiB0cmFjayBkb3duIHRoZSBsaWJyYXJ5ICh1c2luZyBhbiBhbGlhcworICAgICAgICBpbiB0aGUgUHJlZmVyZW5jZXMgZmlsZSkgYW5kIGxhdGUgaW1wb3J0IGl0LgorCisgICAgICAgIEFuIGV2ZW4gY29vbGVyIHVzZSBpcyB0byBwcm92aWRlIGVhc3kgYWJzdHJhY3Rpb24gbGF5ZXJzLgorICAgICAgICBTYXkgeW91IGhhdmUgYSBuZXR3b3JrIGNvZGUgZm9yIGJvdGggdGhlIE1hY1RDUAorICAgICAgICBBUEkgYW5kIHRoZSBPcGVuIFRyYW5zcG9ydCBBUEkuICBUeXBpY2FsbHksIHlvdSB3b3VsZCBiZQorICAgICAgICBmb3JjZSB0byBkbyB0aGlzIGJ5IGhhdmluZyBhbiBhYnN0cmFjdGlvbiBsYXllciB3aGVyZSBldmVyeQorICAgICAgICByb3V0aW5lIGNvbnRhaW5zIGEgc3dpdGNoIGJldHdlZW4gTWFjVENQIGFuZCBPVC4gIFlvdXIKKyAgICAgICAgT3BlblNvY2tldCByb3V0aW5lIG1pZ2h0IGxvb2sgbGlrZToKKworICAgICAgICAgICAgc3RhdGljIGludCBPcGVuU29ja2V0KHZvaWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGdPVEF2YWlsYWJsZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPcGVuU29ja2V0T1QoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBPcGVuU29ja2V0TWFjVENQKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgIFdpdGggdGhpcyBjb2RlLCB5b3UgY2FuIGF2b2lkIHRoYXQgZW50aXJlbHkuICBTaW1wbHkKKyAgICAgICAgd2VhayBsaW5rIHRvIGEgc2hhcmVkIGxpYnJhcnkgdGhhdCB5b3Uga25vdyBpcyBuZXZlcgorICAgICAgICBnb2luZyB0byBiZSBpbXBsZW1lbnRlZCAoImNyZWE7TXlTb2NrZXRzRHVtbXkiKSBhbmQgdGhlbiwKKyAgICAgICAgYXQgcnVudGltZSwgZGVjaWRlIHdoZXRoZXIgdGhlIHN5c3RlbSBoYXMgTWFjVENQIG9yIE9UCisgICAgICAgIGFuZCBsYXRlIGltcG9ydCB0aGUgcmVsZXZhbnQgcmVhbCBpbXBsZW1lbnRhdGlvbgorICAgICAgICAoImNyZWE7TXlTb2NrZXRzTWFjVENQIiBvciAiY3JlYTtNeVNvY2tldHNPVCIpLgorICAgICAgICBPbmUgYmVuZWZpdCBvZiB0aGlzIGFwcHJvYWNoIGlzIHRoYXQgb25seSB0aGUgTWFjVENQIG9yCisgICAgICAgIHRoZSBPVCBjb2RlIGlzIHJlc2lkZW50IGluIG1lbW9yeSBvbiBhbnkgZ2l2ZW4gc3lzdGVtLgogKi8KIAogdHlwZWRlZiBwYXNjYWwgT1NTdGF0dXMgKCpDRk1MYXRlSW1wb3J0TG9va3VwUHJvYykoQ29uc3RTdHIyNTVQYXJhbSBzeW1OYW1lLCBDRnJhZ1N5bWJvbENsYXNzIHN5bUNsYXNzLAotCQkJCQkJCQkJCQkJCXZvaWQgKipzeW1BZGRyLCB2b2lkICpyZWZDb24pOwotCS8vIENGTUxhdGVJbXBvcnRMb29rdXBQcm9jIGRlZmluZXMgYSBjYWxsYmFjayBmb3IgQ0ZNTGF0ZUltcG9ydENvcmUuCi0JLy8gVGhlIHJvdXRpbmUgaXMgZXhwZWN0ZWQgdG8gbG9vayB1cCB0aGUgYWRkcmVzcyBvZiB0aGUgc3ltYm9sIG5hbWVkIAotCS8vIHN5bU5hbWUgYW5kIHJldHVybiBpdCBpbiAqc3ltQWRkci4gIFRoZSBzeW1ib2wgc2hvdWxkIGJlIG9mIGNsYXNzIAotCS8vIHN5bUNsYXNzLCBhbHRob3VnaCB0aGUgY2FsbGJhY2sgZGVjaWRlcyB3aGV0aGVyIGEgY2xhc3MgbWlzbWF0Y2ggaXMgCi0JLy8gYW4gZXJyb3IuICByZWZDb24gaXMgYW4gYXBwbGljYXRpb24gZGVmaW5lZCB2YWx1ZSB0aGF0IHdhcyBvcmlnaW5hbGx5IAotCS8vIHBhc3NlZCBpbiB0byBDRk1MYXRlSW1wb3J0Q29yZS4KLQkvLwotCS8vIElmIHRoaXMgcm91dGluZSByZXR1cm5zIGFuIGVycm9yLCBhIHN5bWJvbCBhZGRyZXNzIG9mIDAgaXMgYXNzdW1lZC4gCi0JLy8gSWYgdGhlIHN5bWJvbCBpcyBtYXJrZWQgYXMgYSB3ZWFrIGltcG9ydCwgdGhlIENGTUxhdGVJbXBvcnRDb3JlIHdpbGwgCi0JLy8gY29udGludWUsIG90aGVyd2lzZSB0aGUgQ0ZNTGF0ZUltcG9ydENvcmUgcm91dGluZSB3aWxsIGZhaWwgd2l0aCB0aGUgCi0JLy8gZXJyb3IuCi0JCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKipzeW1BZGRyLCB2b2lkICpyZWZDb24pOworICAgIC8vIENGTUxhdGVJbXBvcnRMb29rdXBQcm9jIGRlZmluZXMgYSBjYWxsYmFjayBmb3IgQ0ZNTGF0ZUltcG9ydENvcmUuCisgICAgLy8gVGhlIHJvdXRpbmUgaXMgZXhwZWN0ZWQgdG8gbG9vayB1cCB0aGUgYWRkcmVzcyBvZiB0aGUgc3ltYm9sIG5hbWVkCisgICAgLy8gc3ltTmFtZSBhbmQgcmV0dXJuIGl0IGluICpzeW1BZGRyLiAgVGhlIHN5bWJvbCBzaG91bGQgYmUgb2YgY2xhc3MKKyAgICAvLyBzeW1DbGFzcywgYWx0aG91Z2ggdGhlIGNhbGxiYWNrIGRlY2lkZXMgd2hldGhlciBhIGNsYXNzIG1pc21hdGNoIGlzCisgICAgLy8gYW4gZXJyb3IuICByZWZDb24gaXMgYW4gYXBwbGljYXRpb24gZGVmaW5lZCB2YWx1ZSB0aGF0IHdhcyBvcmlnaW5hbGx5CisgICAgLy8gcGFzc2VkIGluIHRvIENGTUxhdGVJbXBvcnRDb3JlLgorICAgIC8vCisgICAgLy8gSWYgdGhpcyByb3V0aW5lIHJldHVybnMgYW4gZXJyb3IsIGEgc3ltYm9sIGFkZHJlc3Mgb2YgMCBpcyBhc3N1bWVkLgorICAgIC8vIElmIHRoZSBzeW1ib2wgaXMgbWFya2VkIGFzIGEgd2VhayBpbXBvcnQsIHRoZSBDRk1MYXRlSW1wb3J0Q29yZSB3aWxsCisgICAgLy8gY29udGludWUsIG90aGVyd2lzZSB0aGUgQ0ZNTGF0ZUltcG9ydENvcmUgcm91dGluZSB3aWxsIGZhaWwgd2l0aCB0aGUKKyAgICAvLyBlcnJvci4KKwogZXh0ZXJuIHBhc2NhbCBPU1N0YXR1cyBDRk1MYXRlSW1wb3J0Q29yZShjb25zdCBDRnJhZ1N5c3RlbTdEaXNrRmxhdExvY2F0b3IgKmZyYWdUb0ZpeExvY2F0b3IsCi0JCQkJCQkJCQkJQ0ZyYWdDb25uZWN0aW9uSUQgZnJhZ1RvRml4Q29ubklELAotCQkJCQkJCQkJCUNGcmFnSW5pdEZ1bmN0aW9uIGZyYWdUb0ZpeEluaXRSb3V0aW5lLAotCQkJCQkJCQkJCUNvbnN0U3RyMjU1UGFyYW0gd2Vha0xpbmtlZExpYnJhcnlOYW1lLAotCQkJCQkJCQkJCUNGTUxhdGVJbXBvcnRMb29rdXBQcm9jIGxvb2t1cCwKLQkJCQkJCQkJCQl2b2lkICpyZWZDb24pOwotCS8vIFRoaXMgcm91dGluZSB3aWxsIGxpbmsgeW91LCBhdCBydW50aW1lLCB0byBzb21lIGxpYnJhcnkgCi0JLy8gdGhhdCB5b3Ugd2VyZSB3ZWFrIGxpbmtlZCB0byBhbmQgd2Fzbid0IHByZXNlbnQgd2hlbiB5b3VyCi0JLy8gZnJhZ21lbnQgd2FzIHByZXBhcmVkLiAgQXMgd2VsbCBhcyB0aGUgb2J2aW91cyBmdW5jdGlvbmFsaXR5Ci0JLy8gb2YgYmVpbmcgYWJsZSB0byByZXNvbHZlIHdlYWsgbGlua3MgYWZ0ZXIgcHJlcGFyZSB0aW1lLAotCS8vIHRoaXMgZnVuY3Rpb25hbGl0eSBjYW4gYmUgcHV0IHRvIGEgbnVtYmVyIG9mIGxlc3Mgb2J2aW91cyB1c2VzLAotCS8vIHNvbWUgb2Ygd2hpY2ggYXJlIGRpc2N1c3NlZCBhdCB0aGUgdG9wIG9mIHRoaXMgaGVhZGVyIGZpbGUuCi0JLy8KLQkvLyBUbyBjYWxsIHRoaXMgcm91dGluZSwgeW91IG5lZWQgYSBudW1iZXIgb2YgcGllY2VzIG9mIGluZm9ybWF0aW9uOgotCS8vCi0JLy8gMS4gZnJhZ1RvRml4TG9jYXRvciwgZnJhZ1RvRml4Q29ubklEOiAgVGhlIGxvY2F0aW9uIG9mIHlvdXIgb3duCi0JLy8gICAgY29kZSBmcmFnbWVudCBvbiBkaXNrIGFuZCB0aGUgQ0ZNIGNvbm5lY3Rpb24gSUQgdG8geW91ciBvd24KLQkvLyAgICBjb2RlIGZyYWdtZW50LiAgVHlwaWNhbGx5IHlvdSBnZXQgdGhpcyBpbmZvcm1hdGlvbiBmcm9tIHlvdXIgCi0JLy8gICAgZnJhZ21lbnQncyBDRk0gaW5pdCByb3V0aW5lLiAgWW91IG11c3QgZW5zdXJlIHRoYXQKLQkvLyAgICBmcmFnVG9GaXhMb2NhdG9yLT5maWxlU3BlYyBwb2ludHMgdG8gYW4gRlNTcGVjIG9mIHRoZQotCS8vICAgIGZpbGUgd2hpY2ggaG9sZHMgeW91ciBjb2RlIGZyYWdtZW50LgotCS8vCi0JLy8gICAgSU1QT1JUQU5UOgotCS8vICAgIFRoZSBmYWN0IHRoYXQgeW91IHBhc3MgaW4gYSBDRnJhZ1N5c3RlbTdEaXNrRmxhdExvY2F0b3IgYXMgdGhlCi0JLy8gICAgZnJhZ1RvRml4TG9jYXRvciBpbXBsaWVzIHRoYXQgdGhlIGZyYWdtZW50IHRvIGJlIGZpeGVkIHVwIG11c3QKLQkvLyAgICBiZSBpbiB0aGUgZGF0YSBmb3JrIG9mIGEgZmlsZS4gIFRoZSBjb2RlIGNvdWxkIGJlIG1vZGlmaWVkCi0JLy8gICAgdG8gcmVtb3ZlIHRoaXMgcmVxdWlyZW1lbnQsIGJ1dCBvbiBkaXNrIGNvZGUgZnJhZ21lbnRzIGFyZSB0aGUgbW9zdAotCS8vICAgIGNvbW1vbiBjYXNlLgotCS8vCi0JLy8gICAgSU1QT1JUQU5UOgotCS8vICAgIFRoZSBmcmFnbWVudCB0byBmaXggbWF5IGhhdmUgYSBwYWNrZWQgZGF0YSBzZWN0aW9uLiAgUGFja2luZyB0aGUgCi0JLy8gICAgZGF0YSBzZWN0aW9uIHdpbGwgcmVkdWNlIHRoZSBzaXplIG9mIHlvdXIgZnJhZ21lbnQgb24gZGlzaywgYnV0IGl0IAotCS8vICAgIHdpbGwgc2lnbmlmaWNhbnRseSBpbmNyZWFzZSB0aGUgbWVtb3J5IG5lZWRlZCBieSB0aGlzIHJvdXRpbmUgCi0JLy8gICAgKGl0IGluY3JlYXNlcyBtZW1vcnkgdXNhZ2UgYnkgdGhlIHN1bSBvZiB0aGUgc2l6ZXMgb2YgdGhlIHBhY2tlZCAKLQkvLyAgICBhbmQgdW5wYWNrZWQgZGF0YSBzZWN0aW9uKS4gIFNlZSBiZWxvdyBmb3IgaW5zdHJ1Y3Rpb25zIG9uIGhvdyB0byAKLQkvLyAgICBjcmVhdGUgYW4gdW5wYWNrZWQgZGF0YSBzZWN0aW9uLgotCS8vCi0JLy8gMi4gZnJhZ1RvRml4SW5pdFJvdXRpbmU6ICBBIHBvaW50ZXIgdG8geW91ciBvd24gY29kZSBmcmFnbWVudCdzCi0JLy8gICAgZnJhZ21lbnQgaW5pdGlhbGlzZXIgcm91dGluZS4gIFlvdSBuZWNlc3NhcmlseSBoYXZlIG9uZSBvZiB0aGVzZSAKLQkvLyAgICBiZWNhdXNlIHlvdSBuZWVkIGl0IHRvIGdldCB2YWx1ZXMgZm9yIHRoZSBmcmFnVG9GaXhMb2NhdG9yIGFuZCAKLQkvLyAgICBmcmFnVG9GaXhDb25uSUQgcGFyYW1ldGVycy4gIEp1c3QgcGFzcyBpdHMgYWRkcmVzcyBpbiBhcyBhIHBhcmFtZXRlciAKLQkvLyAgICBhcyB3ZWxsLiAKLQkvLwotCS8vIDMuIHdlYWtMaW5rZWRMaWJyYXJ5TmFtZTogIFRoZSBuYW1lIG9mIHRoZSB3ZWFrIGxpbmtlZCBsaWJyYXJ5IHdoaWNoCi0JLy8gICAgZmFpbGVkIHRvIGxpbmsuICBZb3UgbXVzdCBoYXZlIHdlYWsgbGlua2VkIHRvIHRoaXMgbGlicmFyeS4KLQkvLyAgICBJdCBpcyBveHltb3JpYyBmb3IgeW91IHRvIHBhc3MgYSBzdHJvbmcgbGlua2VkIGxpYnJhcnkgaGVyZSwKLQkvLyAgICBiZWNhdXNlIHlvdXIgY29kZSB3b3VsZCBub3QgaGF2ZSBwcmVwYXJlZCBpZiBhIHN0cm9uZyBsaW5rZWQKLQkvLyAgICBsaWJyYXJ5IGZhaWxlZCB0byBwcmVwYXJlLCBhbmQgc28geW91IGNvdWxkbid0IHN1cHBseSBhIHZhbGlkCi0JLy8vICAgZnJhZ1RvRml4LgotCS8vCi0JLy8gNC4gbG9va3VwLCByZWZDb246ICBBIHBvaW50ZXIgdG8gYSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IHRoZSAKLQkvLwkgIHJvdXRpbmUgY2FsbHMgdG8gbG9vayB1cCB0aGUgYWRkcmVzcyBvZiBhIHN5bWJvbCwgYW5kIGEgcmVmQ29uIAotCS8vICAgIGZvciB0aGF0IGNhbGxiYWNrIHJvdXRpbmUuCi0JLy8KLQkvLyBOb3RlOgotCS8vIFRoZSBmcmFnVG9GaXhMb2NhdG9yIGFuZCBmcmFnVG9GaXhJbml0Um91dGluZSBwYXJhbWV0ZXJzCi0JLy8gYXJlIGFydGlmYWN0cyBvZiB0aGUgd2F5IGluIHdoaWNoIHRoaXMgZnVuY3Rpb25hbGl0eSBpcyBpbXBsZW1lbnRlZC4KLQkvLyBJbiBhbiBpZGVhbCB3b3JsZCwgd2hlcmUgQ0ZNIGV4cG9ydGVkIGRlY2VudCBpbnRyb3NwZWN0aW9uIEFQSXMKLQkvLyB0byB0aGlyZCBwYXJ0eSBkZXZlbG9wZXJzLCB0aGVzZSBwYXJhbWV0ZXJzIHdvdWxkIG5vdCBiZSBuZWNlc3NhcnkuCi0JLy8gSWYgeW91J3JlIHVzaW5nIHRoaXMgY29kZSBpbnNpZGUgQXBwbGUsIHlvdSBwcm9iYWJseSBzaG91bGQgaW52ZXN0aWdhdGUKLQkvLyB1c2luZyB0aGUgQ0ZNIHByaXZhdGUgQVBJcyBmb3IgZ2V0dGluZyBhdCB0aGUgaW5mb3JtYXRpb24gdGhlc2UKLQkvLyBwYXJhbWV0ZXJzIGFyZSBuZWVkZWQgZm9yLiAgU2VlIHRoZSBjb21tZW50cyBpbnNpZGUgdGhlIGltcGxlbWVudGF0aW9uCi0JLy8gZm9yIG1vcmUgZGV0YWlscy4KLQkvLwotCS8vIE5vdGU6Ci0JLy8gVGhlIGV4dHJhIG1lbW9yeSB0YWtlbiB3aGVuIHlvdSB1c2UgYSBwYWNrZWQgZGF0YSBzZWN0aW9uIGlzIGFsc28gYW4gCi0JLy8gYXJ0aWZhY3Qgb2YgbXkgd29ya2Fyb3VuZCBmb3IgdGhlIGxhY2sgb2YgQ0ZNIGludHJvc3BlY3Rpb24gQVBJcy4gIEluIAotCS8vIG15IG9waW5pb24gaXQncyBiZXR0ZXIgdG8gdXNlIGFuIHVucGFja2VkIGRhdGEgc2VjdGlvbiBhbmQgY29uc3VtZSBtb3JlIAotCS8vIHNwYWNlIG9uIGRpc2sgd2hpbGUgc2F2aW5nIG1lbW9yeS4gIEluIENvZGVXYXJyaW9yIHlvdSBjYW4gc3dpdGNoIHRvIGFuIAotCS8vIHVucGFja2VkIGRhdGEgc2VjdGlvbiBieSBjaGVja2luZyB0aGUgIkV4cGFuZCBVbmluaXRpYWxpemVkIERhdGEiIAotCS8vIGNoZWNrYm94IGluIHRoZSAiUFBDIFBFRiIgc2V0dGluZ3MgcGFuZWwuICBJbiBNUFcsIHNwZWNpZmllZCB0aGUKLQkvLyAiLXBhY2tkYXRhIG9mZiIgb3B0aW9uIHRvIFBQQ0xpbmsuCi0JLy8KLQkvLyBXaGVuIHRoZSByb3V0aW5lIHJldHVybnMsIGFueSBzeW1ib2xzIHRoYXQgeW91IGltcG9ydGVkIGZyb20gdGhlCi0JLy8gbGlicmFyeSBuYW1lZCB3ZWFrTGlua2VkTGlicmFyeU5hbWUgd2lsbCBiZSByZXNvbHZlZCB0byB0aGUgYWRkcmVzcwotCS8vIG9mIHRoZSBzeW1ib2wgcHJvdmlkZWQgYnkgdGhlICJsb29rdXAiIGNhbGxiYWNrIHJvdXRpbmUuCi0JLy8KLQkvLyBJdCBpcyBwb3NzaWJsZSBmb3IgYW4gdW5yZXNvbHZlZCBpbXBvcnQgdG8gcmVtYWluIHVucmVzb2x2ZWQgYWZ0ZXIKLQkvLyB0aGlzIHJvdXRpbmUgcmV0dXJucy4gIElmIHRoZSBzeW1ib2wgaW1wb3J0IGlzIG1hcmtlZCBhcyB3ZWFrIChhcwotCS8vIG9wcG9zZWQgdG8gdGhlIGxpYnJhcnksIHdoaWNoICptdXN0KiBiZSBtYXJrZWQgYXMgd2VhaykgYW5kIHRoZSBzeW1ib2wKLQkvLyBpcyBub3QgZm91bmQgYnkgdGhlICJsb29rdXAiIGNhbGxiYWNrLCB0aGUgcm91dGluZSB3aWxsIHNpbXBsZSBza2lwIAotCS8vIHRoYXQgc3ltYm9sLiAgSWYgdGhlIHN5bWJvbCBpc24ndCBtYXJrZWQgYXMgd2VhaywgdGhlIHJvdXRpbmUgd2lsbCBmYWlsIAotCS8vIGluIHRoYXQgY2FzZS4KLQkvLwotCS8vIE1vc3Qgb2YgdGhlIHBvc3NpYmxlIGVycm9yIHJlc3VsdHMgYXJlIGNvLW9wdGVkIENGTSBlcnJvcnMuICBUaGVzZQotCS8vIGluY2x1ZGU6Ci0JLy8KLQkvLyBjZnJhZ0ZyYWdtZW50Rm9ybWF0RXJyICAtLSBUaGUgZnJhZ21lbnQgdG8gZml4IGlzIGlzIGFuIHVua25vd24gZm9ybWF0LgotCS8vIGNmcmFnTm9TZWN0aW9uRXJyICAgICAgIC0tIENvdWxkIG5vdCBmaW5kIHRoZSBsb2FkZXIgc2VjdGlvbiBpbiB0aGUgZnJhZ21lbnQgdG8gZml4LgotCS8vIGNmcmFnTm9MaWJyYXJ5RXJyICAgICAgIC0tIFRoZSBmcmFnbWVudCB0byBmaXggaXMgbm90IHdlYWsgbGlua2VkIHRvIHdlYWtMaW5rZWRMaWJyYXJ5TmFtZS4KLQkvLyBjZnJhZ0ZyYWdtZW50VXNhZ2VFcnIgICAtLSBUaGUgZnJhZ21lbnQgdG8gZml4IGRvZXNuJ3QgaGF2ZSBhIGRhdGEgc2VjdGlvbi4KLQkvLyAgICAgICAgICAgICAgICAgICAgICAgICAtLSBUaGUgZnJhZ21lbnQgdG8gZml4IGlzIHN0cm9uZyBsaW5rZWQgdG8gd2Vha0xpbmtlZExpYnJhcnlOYW1lLgotCS8vICAgICAgICAgICAgICAgICAgICAgICAgIC0tIFRoZSBmcmFnbWVudCBkb2Vzbid0IGhhdmUgYW4gaW5pdCByb3V0aW5lLgotCS8vIGNmcmFnRnJhZ21lbnRDb3JydXB0RXJyIC0tIEVuY291bnRlcmVkIGFuIHVuZGVmaW5lZCByZWxvY2F0aW9uIG9wY29kZS4KLQkvLyB1bmltcEVyciAgICAgICAgICAgICAgICAtLSBFbmNvdW50ZXJlZCBhbiB1bmltcGxlbWVudCByZWxvY2F0aW9uIG9wY29kZS4gIFRoZQotCS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbG9jYXRpb24gZW5naW5lIG9ubHkgaW1wbGVtZW50cyBhIHN1YnNldCBvZiB0aGUgQ0ZNCi0JLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsb2NhdGlvbiBvcGNvZGVzLCB0aGUgc3Vic2V0IG1vc3QgY29tbW9ubHkgdXNlZCBieQotCS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QVyBhbmQgQ29kZVdhcnJpb3IgUEVGIGNvbnRhaW5lcnMuICBJZiB5b3UgZW5jb3VudGVyCi0JLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBlcnJvciwgeW91J2xsIHByb2JhYmx5IGhhdmUgdG8gYWRkIHRoZSB3ZWlyZAotCS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbG9jYXRpb24gb3Bjb2RlIHRvIHRoZSBlbmdpbmUsIHdoaWNoIHNob3VsZG4ndCBiZQotCS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIHRvbyBoYXJkLgotCS8vIG1lbUZ1bGxFcnIJCQkgICAtLSBJdCdzIGxpa2VseSB0aGF0IHRoaXMgZXJyb3IgaXMgdHJpZ2dlcmVkIGJ5IHRoZSBtZW1vcnkgCi0JLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZGVkIHRvIHVucGFjayB5b3VyIGRhdGEgc2VjdGlvbi4gIEVpdGhlciBtYWtlIHlvdXIgCi0JLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSBzZWN0aW9uIHNtYWxsZXIsIG9yIHVucGFjayBpdCAoc2VlIGFib3ZlKS4KLQkvLyBlcnJvcnMgcmV0dXJuZWQgYnkgRmluZFN5bWJvbAotCS8vIGVycm9ycyByZXR1cm5lZCBieSBNZW1vcnkgTWFuYWdlcgotCS8vCi0JLy8gVGhlIHJvdXRpbmUgbmVlZHMgZW5vdWdoIG1lbW9yeSB0byBob2xkIHRoZSBsb2FkZXIgc2VjdGlvbiBvZiB0aGUgZnJhZ21lbnQKLQkvLyB0byBmaXggaW4gbWVtb3J5LiAgSXQgYWxsb2NhdGVzIHRoYXQgbWVtb3J5IHVzaW5nIE5ld1B0ciBhbmQgZGlzcHNvc2VzIG9mIAotCS8vIGl0IGJlZm9yZSBpdCByZXR1cm5zLiAgWW91IG1heSB3YW50IHRvIGNoYW5nZSB0aGUgbWVtb3J5IGFsbG9jYXRvciwgd2hpY2gKLQkvLyBpcyB2ZXJ5IHNpbXBsZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZyYWdDb25uZWN0aW9uSUQgZnJhZ1RvRml4Q29ubklELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRnJhZ0luaXRGdW5jdGlvbiBmcmFnVG9GaXhJbml0Um91dGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RTdHIyNTVQYXJhbSB3ZWFrTGlua2VkTGlicmFyeU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGTUxhdGVJbXBvcnRMb29rdXBQcm9jIGxvb2t1cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcmVmQ29uKTsKKyAgICAvLyBUaGlzIHJvdXRpbmUgd2lsbCBsaW5rIHlvdSwgYXQgcnVudGltZSwgdG8gc29tZSBsaWJyYXJ5CisgICAgLy8gdGhhdCB5b3Ugd2VyZSB3ZWFrIGxpbmtlZCB0byBhbmQgd2Fzbid0IHByZXNlbnQgd2hlbiB5b3VyCisgICAgLy8gZnJhZ21lbnQgd2FzIHByZXBhcmVkLiAgQXMgd2VsbCBhcyB0aGUgb2J2aW91cyBmdW5jdGlvbmFsaXR5CisgICAgLy8gb2YgYmVpbmcgYWJsZSB0byByZXNvbHZlIHdlYWsgbGlua3MgYWZ0ZXIgcHJlcGFyZSB0aW1lLAorICAgIC8vIHRoaXMgZnVuY3Rpb25hbGl0eSBjYW4gYmUgcHV0IHRvIGEgbnVtYmVyIG9mIGxlc3Mgb2J2aW91cyB1c2VzLAorICAgIC8vIHNvbWUgb2Ygd2hpY2ggYXJlIGRpc2N1c3NlZCBhdCB0aGUgdG9wIG9mIHRoaXMgaGVhZGVyIGZpbGUuCisgICAgLy8KKyAgICAvLyBUbyBjYWxsIHRoaXMgcm91dGluZSwgeW91IG5lZWQgYSBudW1iZXIgb2YgcGllY2VzIG9mIGluZm9ybWF0aW9uOgorICAgIC8vCisgICAgLy8gMS4gZnJhZ1RvRml4TG9jYXRvciwgZnJhZ1RvRml4Q29ubklEOiAgVGhlIGxvY2F0aW9uIG9mIHlvdXIgb3duCisgICAgLy8gICAgY29kZSBmcmFnbWVudCBvbiBkaXNrIGFuZCB0aGUgQ0ZNIGNvbm5lY3Rpb24gSUQgdG8geW91ciBvd24KKyAgICAvLyAgICBjb2RlIGZyYWdtZW50LiAgVHlwaWNhbGx5IHlvdSBnZXQgdGhpcyBpbmZvcm1hdGlvbiBmcm9tIHlvdXIKKyAgICAvLyAgICBmcmFnbWVudCdzIENGTSBpbml0IHJvdXRpbmUuICBZb3UgbXVzdCBlbnN1cmUgdGhhdAorICAgIC8vICAgIGZyYWdUb0ZpeExvY2F0b3ItPmZpbGVTcGVjIHBvaW50cyB0byBhbiBGU1NwZWMgb2YgdGhlCisgICAgLy8gICAgZmlsZSB3aGljaCBob2xkcyB5b3VyIGNvZGUgZnJhZ21lbnQuCisgICAgLy8KKyAgICAvLyAgICBJTVBPUlRBTlQ6CisgICAgLy8gICAgVGhlIGZhY3QgdGhhdCB5b3UgcGFzcyBpbiBhIENGcmFnU3lzdGVtN0Rpc2tGbGF0TG9jYXRvciBhcyB0aGUKKyAgICAvLyAgICBmcmFnVG9GaXhMb2NhdG9yIGltcGxpZXMgdGhhdCB0aGUgZnJhZ21lbnQgdG8gYmUgZml4ZWQgdXAgbXVzdAorICAgIC8vICAgIGJlIGluIHRoZSBkYXRhIGZvcmsgb2YgYSBmaWxlLiAgVGhlIGNvZGUgY291bGQgYmUgbW9kaWZpZWQKKyAgICAvLyAgICB0byByZW1vdmUgdGhpcyByZXF1aXJlbWVudCwgYnV0IG9uIGRpc2sgY29kZSBmcmFnbWVudHMgYXJlIHRoZSBtb3N0CisgICAgLy8gICAgY29tbW9uIGNhc2UuCisgICAgLy8KKyAgICAvLyAgICBJTVBPUlRBTlQ6CisgICAgLy8gICAgVGhlIGZyYWdtZW50IHRvIGZpeCBtYXkgaGF2ZSBhIHBhY2tlZCBkYXRhIHNlY3Rpb24uICBQYWNraW5nIHRoZQorICAgIC8vICAgIGRhdGEgc2VjdGlvbiB3aWxsIHJlZHVjZSB0aGUgc2l6ZSBvZiB5b3VyIGZyYWdtZW50IG9uIGRpc2ssIGJ1dCBpdAorICAgIC8vICAgIHdpbGwgc2lnbmlmaWNhbnRseSBpbmNyZWFzZSB0aGUgbWVtb3J5IG5lZWRlZCBieSB0aGlzIHJvdXRpbmUKKyAgICAvLyAgICAoaXQgaW5jcmVhc2VzIG1lbW9yeSB1c2FnZSBieSB0aGUgc3VtIG9mIHRoZSBzaXplcyBvZiB0aGUgcGFja2VkCisgICAgLy8gICAgYW5kIHVucGFja2VkIGRhdGEgc2VjdGlvbikuICBTZWUgYmVsb3cgZm9yIGluc3RydWN0aW9ucyBvbiBob3cgdG8KKyAgICAvLyAgICBjcmVhdGUgYW4gdW5wYWNrZWQgZGF0YSBzZWN0aW9uLgorICAgIC8vCisgICAgLy8gMi4gZnJhZ1RvRml4SW5pdFJvdXRpbmU6ICBBIHBvaW50ZXIgdG8geW91ciBvd24gY29kZSBmcmFnbWVudCdzCisgICAgLy8gICAgZnJhZ21lbnQgaW5pdGlhbGlzZXIgcm91dGluZS4gIFlvdSBuZWNlc3NhcmlseSBoYXZlIG9uZSBvZiB0aGVzZQorICAgIC8vICAgIGJlY2F1c2UgeW91IG5lZWQgaXQgdG8gZ2V0IHZhbHVlcyBmb3IgdGhlIGZyYWdUb0ZpeExvY2F0b3IgYW5kCisgICAgLy8gICAgZnJhZ1RvRml4Q29ubklEIHBhcmFtZXRlcnMuICBKdXN0IHBhc3MgaXRzIGFkZHJlc3MgaW4gYXMgYSBwYXJhbWV0ZXIKKyAgICAvLyAgICBhcyB3ZWxsLgorICAgIC8vCisgICAgLy8gMy4gd2Vha0xpbmtlZExpYnJhcnlOYW1lOiAgVGhlIG5hbWUgb2YgdGhlIHdlYWsgbGlua2VkIGxpYnJhcnkgd2hpY2gKKyAgICAvLyAgICBmYWlsZWQgdG8gbGluay4gIFlvdSBtdXN0IGhhdmUgd2VhayBsaW5rZWQgdG8gdGhpcyBsaWJyYXJ5LgorICAgIC8vICAgIEl0IGlzIG94eW1vcmljIGZvciB5b3UgdG8gcGFzcyBhIHN0cm9uZyBsaW5rZWQgbGlicmFyeSBoZXJlLAorICAgIC8vICAgIGJlY2F1c2UgeW91ciBjb2RlIHdvdWxkIG5vdCBoYXZlIHByZXBhcmVkIGlmIGEgc3Ryb25nIGxpbmtlZAorICAgIC8vICAgIGxpYnJhcnkgZmFpbGVkIHRvIHByZXBhcmUsIGFuZCBzbyB5b3UgY291bGRuJ3Qgc3VwcGx5IGEgdmFsaWQKKyAgICAvLy8gICBmcmFnVG9GaXguCisgICAgLy8KKyAgICAvLyA0LiBsb29rdXAsIHJlZkNvbjogIEEgcG9pbnRlciB0byBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgdGhlCisgICAgLy8gICAgICAgICAgICByb3V0aW5lIGNhbGxzIHRvIGxvb2sgdXAgdGhlIGFkZHJlc3Mgb2YgYSBzeW1ib2wsIGFuZCBhIHJlZkNvbgorICAgIC8vICAgIGZvciB0aGF0IGNhbGxiYWNrIHJvdXRpbmUuCisgICAgLy8KKyAgICAvLyBOb3RlOgorICAgIC8vIFRoZSBmcmFnVG9GaXhMb2NhdG9yIGFuZCBmcmFnVG9GaXhJbml0Um91dGluZSBwYXJhbWV0ZXJzCisgICAgLy8gYXJlIGFydGlmYWN0cyBvZiB0aGUgd2F5IGluIHdoaWNoIHRoaXMgZnVuY3Rpb25hbGl0eSBpcyBpbXBsZW1lbnRlZC4KKyAgICAvLyBJbiBhbiBpZGVhbCB3b3JsZCwgd2hlcmUgQ0ZNIGV4cG9ydGVkIGRlY2VudCBpbnRyb3NwZWN0aW9uIEFQSXMKKyAgICAvLyB0byB0aGlyZCBwYXJ0eSBkZXZlbG9wZXJzLCB0aGVzZSBwYXJhbWV0ZXJzIHdvdWxkIG5vdCBiZSBuZWNlc3NhcnkuCisgICAgLy8gSWYgeW91J3JlIHVzaW5nIHRoaXMgY29kZSBpbnNpZGUgQXBwbGUsIHlvdSBwcm9iYWJseSBzaG91bGQgaW52ZXN0aWdhdGUKKyAgICAvLyB1c2luZyB0aGUgQ0ZNIHByaXZhdGUgQVBJcyBmb3IgZ2V0dGluZyBhdCB0aGUgaW5mb3JtYXRpb24gdGhlc2UKKyAgICAvLyBwYXJhbWV0ZXJzIGFyZSBuZWVkZWQgZm9yLiAgU2VlIHRoZSBjb21tZW50cyBpbnNpZGUgdGhlIGltcGxlbWVudGF0aW9uCisgICAgLy8gZm9yIG1vcmUgZGV0YWlscy4KKyAgICAvLworICAgIC8vIE5vdGU6CisgICAgLy8gVGhlIGV4dHJhIG1lbW9yeSB0YWtlbiB3aGVuIHlvdSB1c2UgYSBwYWNrZWQgZGF0YSBzZWN0aW9uIGlzIGFsc28gYW4KKyAgICAvLyBhcnRpZmFjdCBvZiBteSB3b3JrYXJvdW5kIGZvciB0aGUgbGFjayBvZiBDRk0gaW50cm9zcGVjdGlvbiBBUElzLiAgSW4KKyAgICAvLyBteSBvcGluaW9uIGl0J3MgYmV0dGVyIHRvIHVzZSBhbiB1bnBhY2tlZCBkYXRhIHNlY3Rpb24gYW5kIGNvbnN1bWUgbW9yZQorICAgIC8vIHNwYWNlIG9uIGRpc2sgd2hpbGUgc2F2aW5nIG1lbW9yeS4gIEluIENvZGVXYXJyaW9yIHlvdSBjYW4gc3dpdGNoIHRvIGFuCisgICAgLy8gdW5wYWNrZWQgZGF0YSBzZWN0aW9uIGJ5IGNoZWNraW5nIHRoZSAiRXhwYW5kIFVuaW5pdGlhbGl6ZWQgRGF0YSIKKyAgICAvLyBjaGVja2JveCBpbiB0aGUgIlBQQyBQRUYiIHNldHRpbmdzIHBhbmVsLiAgSW4gTVBXLCBzcGVjaWZpZWQgdGhlCisgICAgLy8gIi1wYWNrZGF0YSBvZmYiIG9wdGlvbiB0byBQUENMaW5rLgorICAgIC8vCisgICAgLy8gV2hlbiB0aGUgcm91dGluZSByZXR1cm5zLCBhbnkgc3ltYm9scyB0aGF0IHlvdSBpbXBvcnRlZCBmcm9tIHRoZQorICAgIC8vIGxpYnJhcnkgbmFtZWQgd2Vha0xpbmtlZExpYnJhcnlOYW1lIHdpbGwgYmUgcmVzb2x2ZWQgdG8gdGhlIGFkZHJlc3MKKyAgICAvLyBvZiB0aGUgc3ltYm9sIHByb3ZpZGVkIGJ5IHRoZSAibG9va3VwIiBjYWxsYmFjayByb3V0aW5lLgorICAgIC8vCisgICAgLy8gSXQgaXMgcG9zc2libGUgZm9yIGFuIHVucmVzb2x2ZWQgaW1wb3J0IHRvIHJlbWFpbiB1bnJlc29sdmVkIGFmdGVyCisgICAgLy8gdGhpcyByb3V0aW5lIHJldHVybnMuICBJZiB0aGUgc3ltYm9sIGltcG9ydCBpcyBtYXJrZWQgYXMgd2VhayAoYXMKKyAgICAvLyBvcHBvc2VkIHRvIHRoZSBsaWJyYXJ5LCB3aGljaCAqbXVzdCogYmUgbWFya2VkIGFzIHdlYWspIGFuZCB0aGUgc3ltYm9sCisgICAgLy8gaXMgbm90IGZvdW5kIGJ5IHRoZSAibG9va3VwIiBjYWxsYmFjaywgdGhlIHJvdXRpbmUgd2lsbCBzaW1wbGUgc2tpcAorICAgIC8vIHRoYXQgc3ltYm9sLiAgSWYgdGhlIHN5bWJvbCBpc24ndCBtYXJrZWQgYXMgd2VhaywgdGhlIHJvdXRpbmUgd2lsbCBmYWlsCisgICAgLy8gaW4gdGhhdCBjYXNlLgorICAgIC8vCisgICAgLy8gTW9zdCBvZiB0aGUgcG9zc2libGUgZXJyb3IgcmVzdWx0cyBhcmUgY28tb3B0ZWQgQ0ZNIGVycm9ycy4gIFRoZXNlCisgICAgLy8gaW5jbHVkZToKKyAgICAvLworICAgIC8vIGNmcmFnRnJhZ21lbnRGb3JtYXRFcnIgIC0tIFRoZSBmcmFnbWVudCB0byBmaXggaXMgaXMgYW4gdW5rbm93biBmb3JtYXQuCisgICAgLy8gY2ZyYWdOb1NlY3Rpb25FcnIgICAgICAgLS0gQ291bGQgbm90IGZpbmQgdGhlIGxvYWRlciBzZWN0aW9uIGluIHRoZSBmcmFnbWVudCB0byBmaXguCisgICAgLy8gY2ZyYWdOb0xpYnJhcnlFcnIgICAgICAgLS0gVGhlIGZyYWdtZW50IHRvIGZpeCBpcyBub3Qgd2VhayBsaW5rZWQgdG8gd2Vha0xpbmtlZExpYnJhcnlOYW1lLgorICAgIC8vIGNmcmFnRnJhZ21lbnRVc2FnZUVyciAgIC0tIFRoZSBmcmFnbWVudCB0byBmaXggZG9lc24ndCBoYXZlIGEgZGF0YSBzZWN0aW9uLgorICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIC0tIFRoZSBmcmFnbWVudCB0byBmaXggaXMgc3Ryb25nIGxpbmtlZCB0byB3ZWFrTGlua2VkTGlicmFyeU5hbWUuCisgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgLS0gVGhlIGZyYWdtZW50IGRvZXNuJ3QgaGF2ZSBhbiBpbml0IHJvdXRpbmUuCisgICAgLy8gY2ZyYWdGcmFnbWVudENvcnJ1cHRFcnIgLS0gRW5jb3VudGVyZWQgYW4gdW5kZWZpbmVkIHJlbG9jYXRpb24gb3Bjb2RlLgorICAgIC8vIHVuaW1wRXJyICAgICAgICAgICAgICAgIC0tIEVuY291bnRlcmVkIGFuIHVuaW1wbGVtZW50IHJlbG9jYXRpb24gb3Bjb2RlLiAgVGhlCisgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsb2NhdGlvbiBlbmdpbmUgb25seSBpbXBsZW1lbnRzIGEgc3Vic2V0IG9mIHRoZSBDRk0KKyAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxvY2F0aW9uIG9wY29kZXMsIHRoZSBzdWJzZXQgbW9zdCBjb21tb25seSB1c2VkIGJ5CisgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBXIGFuZCBDb2RlV2FycmlvciBQRUYgY29udGFpbmVycy4gIElmIHlvdSBlbmNvdW50ZXIKKyAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGVycm9yLCB5b3UnbGwgcHJvYmFibHkgaGF2ZSB0byBhZGQgdGhlIHdlaXJkCisgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsb2NhdGlvbiBvcGNvZGUgdG8gdGhlIGVuZ2luZSwgd2hpY2ggc2hvdWxkbid0IGJlCisgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgdG9vIGhhcmQuCisgICAgLy8gbWVtRnVsbEVyciAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gSXQncyBsaWtlbHkgdGhhdCB0aGlzIGVycm9yIGlzIHRyaWdnZXJlZCBieSB0aGUgbWVtb3J5CisgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZGVkIHRvIHVucGFjayB5b3VyIGRhdGEgc2VjdGlvbi4gIEVpdGhlciBtYWtlIHlvdXIKKyAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhIHNlY3Rpb24gc21hbGxlciwgb3IgdW5wYWNrIGl0IChzZWUgYWJvdmUpLgorICAgIC8vIGVycm9ycyByZXR1cm5lZCBieSBGaW5kU3ltYm9sCisgICAgLy8gZXJyb3JzIHJldHVybmVkIGJ5IE1lbW9yeSBNYW5hZ2VyCisgICAgLy8KKyAgICAvLyBUaGUgcm91dGluZSBuZWVkcyBlbm91Z2ggbWVtb3J5IHRvIGhvbGQgdGhlIGxvYWRlciBzZWN0aW9uIG9mIHRoZSBmcmFnbWVudAorICAgIC8vIHRvIGZpeCBpbiBtZW1vcnkuICBJdCBhbGxvY2F0ZXMgdGhhdCBtZW1vcnkgdXNpbmcgTmV3UHRyIGFuZCBkaXNwc29zZXMgb2YKKyAgICAvLyBpdCBiZWZvcmUgaXQgcmV0dXJucy4gIFlvdSBtYXkgd2FudCB0byBjaGFuZ2UgdGhlIG1lbW9yeSBhbGxvY2F0b3IsIHdoaWNoCisgICAgLy8gaXMgdmVyeSBzaW1wbGUuCiAKIGV4dGVybiBwYXNjYWwgT1NTdGF0dXMgQ0ZNTGF0ZUltcG9ydExpYnJhcnkoY29uc3QgQ0ZyYWdTeXN0ZW03RGlza0ZsYXRMb2NhdG9yICpmcmFnVG9GaXhMb2NhdG9yLAotCQkJCQkJCQkJCUNGcmFnQ29ubmVjdGlvbklEIGZyYWdUb0ZpeENvbm5JRCwKLQkJCQkJCQkJCQlDRnJhZ0luaXRGdW5jdGlvbiBmcmFnVG9GaXhJbml0Um91dGluZSwKLQkJCQkJCQkJCQlDb25zdFN0cjI1NVBhcmFtIHdlYWtMaW5rZWRMaWJyYXJ5TmFtZSwKLQkJCQkJCQkJCQlDRnJhZ0Nvbm5lY3Rpb25JRCBjb25uSURUb0ltcG9ydCk7Ci0JLy8gQSB3cmFwcGVyIGFyb3VuZCBDRk1MYXRlSW1wb3J0Q29yZSB0aGF0IGxvb2tzIHVwIHN5bWJvbHMgYnkgY2FsbGluZyAKLQkvLyBGaW5kU3ltYm9sIG9uIGEgY29ubmVjdGlvbiB0byBhIENGTSBsaWJyYXJ5IChjb25uSURUb0ltcG9ydCkuCi0JLy8gWW91IGNhbiBnZXQgdGhpcyBjb25uZWN0aW9uIElEIHRocm91Z2ggYW55IHN0YW5kYXJkIENGTSBBUEksIGZvciBleGFtcGxlCi0JLy8gR2V0U2hhcmVkTGlicmFyeSwgR2V0RGlza0ZyYWdtZW50LCBvciBHZXRNZW1GcmFnbWVudC4KLQkvLwotCS8vIElNUE9SVEFOVDoKLQkvLyBUaGUgZnJhZ21lbnQgbmFtZSBmb3IgY29ubklEVG9JbXBvcnQgKmRvZXMgbm90KiBoYXZlIHRvIG1hdGNoCi0JLy8gd2Vha0xpbmtlZExpYnJhcnlOYW1lLiAgVGhpcyBpcyBwYXJ0IG9mIHRoZSBwb3dlciBvZiB0aGlzIGxpYnJhcnkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGcmFnQ29ubmVjdGlvbklEIGZyYWdUb0ZpeENvbm5JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZyYWdJbml0RnVuY3Rpb24gZnJhZ1RvRml4SW5pdFJvdXRpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0U3RyMjU1UGFyYW0gd2Vha0xpbmtlZExpYnJhcnlOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRnJhZ0Nvbm5lY3Rpb25JRCBjb25uSURUb0ltcG9ydCk7CisgICAgLy8gQSB3cmFwcGVyIGFyb3VuZCBDRk1MYXRlSW1wb3J0Q29yZSB0aGF0IGxvb2tzIHVwIHN5bWJvbHMgYnkgY2FsbGluZworICAgIC8vIEZpbmRTeW1ib2wgb24gYSBjb25uZWN0aW9uIHRvIGEgQ0ZNIGxpYnJhcnkgKGNvbm5JRFRvSW1wb3J0KS4KKyAgICAvLyBZb3UgY2FuIGdldCB0aGlzIGNvbm5lY3Rpb24gSUQgdGhyb3VnaCBhbnkgc3RhbmRhcmQgQ0ZNIEFQSSwgZm9yIGV4YW1wbGUKKyAgICAvLyBHZXRTaGFyZWRMaWJyYXJ5LCBHZXREaXNrRnJhZ21lbnQsIG9yIEdldE1lbUZyYWdtZW50LgorICAgIC8vCisgICAgLy8gSU1QT1JUQU5UOgorICAgIC8vIFRoZSBmcmFnbWVudCBuYW1lIGZvciBjb25uSURUb0ltcG9ydCAqZG9lcyBub3QqIGhhdmUgdG8gbWF0Y2gKKyAgICAvLyB3ZWFrTGlua2VkTGlicmFyeU5hbWUuICBUaGlzIGlzIHBhcnQgb2YgdGhlIHBvd2VyIG9mIHRoaXMgbGlicmFyeS4KIAogZXh0ZXJuIHBhc2NhbCBPU1N0YXR1cyBDRk1MYXRlSW1wb3J0QnVuZGxlKGNvbnN0IENGcmFnU3lzdGVtN0Rpc2tGbGF0TG9jYXRvciAqZnJhZ1RvRml4TG9jYXRvciwKLQkJCQkJCQkJCQlDRnJhZ0Nvbm5lY3Rpb25JRCBmcmFnVG9GaXhDb25uSUQsCi0JCQkJCQkJCQkJQ0ZyYWdJbml0RnVuY3Rpb24gZnJhZ1RvRml4SW5pdFJvdXRpbmUsCi0JCQkJCQkJCQkJQ29uc3RTdHIyNTVQYXJhbSB3ZWFrTGlua2VkTGlicmFyeU5hbWUsCi0JCQkJCQkJCQkJQ0ZCdW5kbGVSZWYgYnVuZGxlVG9JbXBvcnQpOwotCS8vIEEgd3JhcHBlciBhcm91bmQgQ0ZNTGF0ZUltcG9ydENvcmUgdGhhdCBsb29rcyB1cCBzeW1ib2xzIGJ5IGNhbGxpbmcgCi0JLy8gQ0ZCdW5kbGVHZXRGdW5jdGlvblBvaW50ZXJGb3JOYW1lIG9uIGEgcmVmZXJlbmNlIHRvIGEgQ29yZSBGb3VuZGF0aW9uIAotCS8vIGJ1bmRsZSAoYnVuZGxlVG9JbXBvcnQpLiAgWW91IGNhbiBnZXQgdGhpcyByZWZlcmVuY2UgdGhyb3VnaCBhbnkgCi0JLy8gQ29yZSBGb3VuZGF0aW9uIGJ1bmRsZSBBUEksIGZvciBleGFtcGxlIENGQnVuZGxlQ3JlYXRlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRnJhZ0Nvbm5lY3Rpb25JRCBmcmFnVG9GaXhDb25uSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGcmFnSW5pdEZ1bmN0aW9uIGZyYWdUb0ZpeEluaXRSb3V0aW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdFN0cjI1NVBhcmFtIHdlYWtMaW5rZWRMaWJyYXJ5TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZCdW5kbGVSZWYgYnVuZGxlVG9JbXBvcnQpOworICAgIC8vIEEgd3JhcHBlciBhcm91bmQgQ0ZNTGF0ZUltcG9ydENvcmUgdGhhdCBsb29rcyB1cCBzeW1ib2xzIGJ5IGNhbGxpbmcKKyAgICAvLyBDRkJ1bmRsZUdldEZ1bmN0aW9uUG9pbnRlckZvck5hbWUgb24gYSByZWZlcmVuY2UgdG8gYSBDb3JlIEZvdW5kYXRpb24KKyAgICAvLyBidW5kbGUgKGJ1bmRsZVRvSW1wb3J0KS4gIFlvdSBjYW4gZ2V0IHRoaXMgcmVmZXJlbmNlIHRocm91Z2ggYW55CisgICAgLy8gQ29yZSBGb3VuZGF0aW9uIGJ1bmRsZSBBUEksIGZvciBleGFtcGxlIENGQnVuZGxlQ3JlYXRlLgogCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL2NnL19DR21vZHVsZS5jIGIvTWFjL01vZHVsZXMvY2cvX0NHbW9kdWxlLmMKaW5kZXggZTM2ZmNlOS4uNzE2OTEwMSAxMDA3NTUKLS0tIGEvTWFjL01vZHVsZXMvY2cvX0NHbW9kdWxlLmMKKysrIGIvTWFjL01vZHVsZXMvY2cvX0NHbW9kdWxlLmMKQEAgLTksOSArOSw5IEBACiAKIC8qIE1hY3JvIHRvIHRlc3Qgd2hldGhlciBhIHdlYWstbG9hZGVkIENGTSBmdW5jdGlvbiBleGlzdHMgKi8KICNkZWZpbmUgUHlNYWNfUFJFQ0hFQ0socnRuKSBkbyB7IGlmICggJnJ0biA9PSBOVUxMICkgIHtcCi0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yLCBcCi0gICAgICAgICJOb3QgYXZhaWxhYmxlIGluIHRoaXMgc2hhcmVkIGxpYnJhcnkvT1MgdmVyc2lvbiIpOyBcCi0gICAgICAgIHJldHVybiBOVUxMOyBcCisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsIFwKKyAgICAiTm90IGF2YWlsYWJsZSBpbiB0aGlzIHNoYXJlZCBsaWJyYXJ5L09TIHZlcnNpb24iKTsgXAorICAgIHJldHVybiBOVUxMOyBcCiAgICAgfX0gd2hpbGUoMCkKIAogCkBAIC0yNiw2NyArMjYsNjcgQEAKIFB5T2JqZWN0ICpDR1BvaW50X05ldyhDR1BvaW50ICppdHNlbGYpCiB7CiAKLSAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihmZikiLAotICAgICAgICAgICAgICAgICAgICAgICAgaXRzZWxmLT54LAotICAgICAgICAgICAgICAgICAgICAgICAgaXRzZWxmLT55KTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKGZmKSIsCisgICAgICAgICAgICAgICAgICAgIGl0c2VsZi0+eCwKKyAgICAgICAgICAgICAgICAgICAgaXRzZWxmLT55KTsKIH0KIAogaW50CiBDR1BvaW50X0NvbnZlcnQoUHlPYmplY3QgKnYsIENHUG9pbnQgKnBfaXRzZWxmKQogewotICAgICAgICBpZiggIVB5QXJnX1BhcnNlKHYsICIoZmYpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICZwX2l0c2VsZi0+eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICZwX2l0c2VsZi0+eSkgKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICByZXR1cm4gMTsKKyAgICBpZiggIVB5QXJnX1BhcnNlKHYsICIoZmYpIiwKKyAgICAgICAgICAgICAgICAgICAgJnBfaXRzZWxmLT54LAorICAgICAgICAgICAgICAgICAgICAmcF9pdHNlbGYtPnkpICkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIDE7CiB9CiAKIFB5T2JqZWN0ICpDR1JlY3RfTmV3KENHUmVjdCAqaXRzZWxmKQogewogCi0gICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIoZmZmZikiLAotICAgICAgICAgICAgICAgICAgICAgICAgaXRzZWxmLT5vcmlnaW4ueCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGl0c2VsZi0+b3JpZ2luLnksCi0gICAgICAgICAgICAgICAgICAgICAgICBpdHNlbGYtPnNpemUud2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICBpdHNlbGYtPnNpemUuaGVpZ2h0KTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKGZmZmYpIiwKKyAgICAgICAgICAgICAgICAgICAgaXRzZWxmLT5vcmlnaW4ueCwKKyAgICAgICAgICAgICAgICAgICAgaXRzZWxmLT5vcmlnaW4ueSwKKyAgICAgICAgICAgICAgICAgICAgaXRzZWxmLT5zaXplLndpZHRoLAorICAgICAgICAgICAgICAgICAgICBpdHNlbGYtPnNpemUuaGVpZ2h0KTsKIH0KIAogaW50CiBDR1JlY3RfQ29udmVydChQeU9iamVjdCAqdiwgQ0dSZWN0ICpwX2l0c2VsZikKIHsKLSAgICAgICAgaWYoICFQeUFyZ19QYXJzZSh2LCAiKGZmZmYpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICZwX2l0c2VsZi0+b3JpZ2luLngsCi0gICAgICAgICAgICAgICAgICAgICAgICAmcF9pdHNlbGYtPm9yaWdpbi55LAotICAgICAgICAgICAgICAgICAgICAgICAgJnBfaXRzZWxmLT5zaXplLndpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgJnBfaXRzZWxmLT5zaXplLmhlaWdodCkgKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICByZXR1cm4gMTsKKyAgICBpZiggIVB5QXJnX1BhcnNlKHYsICIoZmZmZikiLAorICAgICAgICAgICAgICAgICAgICAmcF9pdHNlbGYtPm9yaWdpbi54LAorICAgICAgICAgICAgICAgICAgICAmcF9pdHNlbGYtPm9yaWdpbi55LAorICAgICAgICAgICAgICAgICAgICAmcF9pdHNlbGYtPnNpemUud2lkdGgsCisgICAgICAgICAgICAgICAgICAgICZwX2l0c2VsZi0+c2l6ZS5oZWlnaHQpICkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIDE7CiB9CiAKIFB5T2JqZWN0ICpDR0FmZmluZVRyYW5zZm9ybV9OZXcoQ0dBZmZpbmVUcmFuc2Zvcm0gKml0c2VsZikKIHsKIAotICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKGZmZmZmZikiLAotICAgICAgICAgICAgICAgICAgICAgICAgaXRzZWxmLT5hLAotICAgICAgICAgICAgICAgICAgICAgICAgaXRzZWxmLT5iLAotICAgICAgICAgICAgICAgICAgICAgICAgaXRzZWxmLT5jLAotICAgICAgICAgICAgICAgICAgICAgICAgaXRzZWxmLT5kLAotICAgICAgICAgICAgICAgICAgICAgICAgaXRzZWxmLT50eCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGl0c2VsZi0+dHkpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIoZmZmZmZmKSIsCisgICAgICAgICAgICAgICAgICAgIGl0c2VsZi0+YSwKKyAgICAgICAgICAgICAgICAgICAgaXRzZWxmLT5iLAorICAgICAgICAgICAgICAgICAgICBpdHNlbGYtPmMsCisgICAgICAgICAgICAgICAgICAgIGl0c2VsZi0+ZCwKKyAgICAgICAgICAgICAgICAgICAgaXRzZWxmLT50eCwKKyAgICAgICAgICAgICAgICAgICAgaXRzZWxmLT50eSk7CiB9CiAKIGludAogQ0dBZmZpbmVUcmFuc2Zvcm1fQ29udmVydChQeU9iamVjdCAqdiwgQ0dBZmZpbmVUcmFuc2Zvcm0gKnBfaXRzZWxmKQogewotICAgICAgICBpZiggIVB5QXJnX1BhcnNlKHYsICIoZmZmZmZmKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAmcF9pdHNlbGYtPmEsCi0gICAgICAgICAgICAgICAgICAgICAgICAmcF9pdHNlbGYtPmIsCi0gICAgICAgICAgICAgICAgICAgICAgICAmcF9pdHNlbGYtPmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAmcF9pdHNlbGYtPmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAmcF9pdHNlbGYtPnR4LAotICAgICAgICAgICAgICAgICAgICAgICAgJnBfaXRzZWxmLT50eSkgKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICByZXR1cm4gMTsKKyAgICBpZiggIVB5QXJnX1BhcnNlKHYsICIoZmZmZmZmKSIsCisgICAgICAgICAgICAgICAgICAgICZwX2l0c2VsZi0+YSwKKyAgICAgICAgICAgICAgICAgICAgJnBfaXRzZWxmLT5iLAorICAgICAgICAgICAgICAgICAgICAmcF9pdHNlbGYtPmMsCisgICAgICAgICAgICAgICAgICAgICZwX2l0c2VsZi0+ZCwKKyAgICAgICAgICAgICAgICAgICAgJnBfaXRzZWxmLT50eCwKKyAgICAgICAgICAgICAgICAgICAgJnBfaXRzZWxmLT50eSkgKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDR19FcnJvcjsKQEAgLTk4LDEwOTAgKzk4LDEwOTAgQEAKICNkZWZpbmUgQ0dDb250ZXh0UmVmT2JqX0NoZWNrKHgpICgoeCktPm9iX3R5cGUgPT0gJkNHQ29udGV4dFJlZl9UeXBlIHx8IFB5T2JqZWN0X1R5cGVDaGVjaygoeCksICZDR0NvbnRleHRSZWZfVHlwZSkpCiAKIHR5cGVkZWYgc3RydWN0IENHQ29udGV4dFJlZk9iamVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCUNHQ29udGV4dFJlZiBvYl9pdHNlbGY7CisgICAgUHlPYmplY3RfSEVBRAorICAgIENHQ29udGV4dFJlZiBvYl9pdHNlbGY7CiB9IENHQ29udGV4dFJlZk9iamVjdDsKIAogUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9OZXcoQ0dDb250ZXh0UmVmIGl0c2VsZikKIHsKLQlDR0NvbnRleHRSZWZPYmplY3QgKml0OwotCWl0ID0gUHlPYmplY3RfTkVXKENHQ29udGV4dFJlZk9iamVjdCwgJkNHQ29udGV4dFJlZl9UeXBlKTsKLQlpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgQ0dDb250ZXh0UmVmT2JqZWN0ICppdDsKKyAgICBpdCA9IFB5T2JqZWN0X05FVyhDR0NvbnRleHRSZWZPYmplY3QsICZDR0NvbnRleHRSZWZfVHlwZSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIGl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogCiBpbnQgQ0dDb250ZXh0UmVmT2JqX0NvbnZlcnQoUHlPYmplY3QgKnYsIENHQ29udGV4dFJlZiAqcF9pdHNlbGYpCiB7Ci0JaWYgKCFDR0NvbnRleHRSZWZPYmpfQ2hlY2sodikpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiQ0dDb250ZXh0UmVmIHJlcXVpcmVkIik7Ci0JCXJldHVybiAwOwotCX0KLQkqcF9pdHNlbGYgPSAoKENHQ29udGV4dFJlZk9iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0JcmV0dXJuIDE7CisgICAgaWYgKCFDR0NvbnRleHRSZWZPYmpfQ2hlY2sodikpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiQ0dDb250ZXh0UmVmIHJlcXVpcmVkIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAqcF9pdHNlbGYgPSAoKENHQ29udGV4dFJlZk9iamVjdCAqKXYpLT5vYl9pdHNlbGY7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyB2b2lkIENHQ29udGV4dFJlZk9ial9kZWFsbG9jKENHQ29udGV4dFJlZk9iamVjdCAqc2VsZikKIHsKLQlDR0NvbnRleHRSZWxlYXNlKHNlbGYtPm9iX2l0c2VsZik7Ci0Jc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKKyAgICBDR0NvbnRleHRSZWxlYXNlKHNlbGYtPm9iX2l0c2VsZik7CisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2F2ZUdTdGF0ZShDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlDR0NvbnRleHRTYXZlR1N0YXRlKF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENHQ29udGV4dFNhdmVHU3RhdGUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRSZXN0b3JlR1N0YXRlKENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUNHQ29udGV4dFJlc3RvcmVHU3RhdGUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0dDb250ZXh0UmVzdG9yZUdTdGF0ZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNjYWxlQ1RNKENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JZmxvYXQgc3g7Ci0JZmxvYXQgc3k7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiZmYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmc3gsCi0JICAgICAgICAgICAgICAgICAgICAgICZzeSkpCi0JCXJldHVybiBOVUxMOwotCUNHQ29udGV4dFNjYWxlQ1RNKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgc3gsCi0JICAgICAgICAgICAgICAgICAgc3kpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgZmxvYXQgc3g7CisgICAgZmxvYXQgc3k7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiZmYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzeSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENHQ29udGV4dFNjYWxlQ1RNKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgc3gsCisgICAgICAgICAgICAgICAgICAgICAgc3kpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0VHJhbnNsYXRlQ1RNKENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JZmxvYXQgdHg7Ci0JZmxvYXQgdHk7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiZmYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdHgsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0eSkpCi0JCXJldHVybiBOVUxMOwotCUNHQ29udGV4dFRyYW5zbGF0ZUNUTShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICB0eCwKLQkgICAgICAgICAgICAgICAgICAgICAgdHkpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgZmxvYXQgdHg7CisgICAgZmxvYXQgdHk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiZmYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0eSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENHQ29udGV4dFRyYW5zbGF0ZUNUTShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdHkpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0Um90YXRlQ1RNKENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JZmxvYXQgYW5nbGU7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiZiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZhbmdsZSkpCi0JCXJldHVybiBOVUxMOwotCUNHQ29udGV4dFJvdGF0ZUNUTShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICBhbmdsZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBmbG9hdCBhbmdsZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJmIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFuZ2xlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0dDb250ZXh0Um90YXRlQ1RNKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgIGFuZ2xlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dENvbmNhdENUTShDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNHQWZmaW5lVHJhbnNmb3JtIHRyYW5zZm9ybTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENHQWZmaW5lVHJhbnNmb3JtX0NvbnZlcnQsICZ0cmFuc2Zvcm0pKQotCQlyZXR1cm4gTlVMTDsKLQlDR0NvbnRleHRDb25jYXRDVE0oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENHQWZmaW5lVHJhbnNmb3JtIHRyYW5zZm9ybTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENHQWZmaW5lVHJhbnNmb3JtX0NvbnZlcnQsICZ0cmFuc2Zvcm0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDR0NvbnRleHRDb25jYXRDVE0oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dEdldENUTShDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNHQWZmaW5lVHJhbnNmb3JtIF9ydjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0dDb250ZXh0R2V0Q1RNKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0dBZmZpbmVUcmFuc2Zvcm1fTmV3LCAmX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0dBZmZpbmVUcmFuc2Zvcm0gX3J2OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDR0NvbnRleHRHZXRDVE0oX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDR0FmZmluZVRyYW5zZm9ybV9OZXcsICZfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRMaW5lV2lkdGgoQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlmbG9hdCB3aWR0aDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJmIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJndpZHRoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0dDb250ZXh0U2V0TGluZVdpZHRoKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgIHdpZHRoKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGZsb2F0IHdpZHRoOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmd2lkdGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDR0NvbnRleHRTZXRMaW5lV2lkdGgoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2V0TGluZUNhcChDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWludCBjYXA7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaSIsCi0JICAgICAgICAgICAgICAgICAgICAgICZjYXApKQotCQlyZXR1cm4gTlVMTDsKLQlDR0NvbnRleHRTZXRMaW5lQ2FwKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICBjYXApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgaW50IGNhcDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNhcCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENHQ29udGV4dFNldExpbmVDYXAoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhcCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRMaW5lSm9pbihDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWludCBqb2luOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImkiLAotCSAgICAgICAgICAgICAgICAgICAgICAmam9pbikpCi0JCXJldHVybiBOVUxMOwotCUNHQ29udGV4dFNldExpbmVKb2luKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgam9pbik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBpbnQgam9pbjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmpvaW4pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDR0NvbnRleHRTZXRMaW5lSm9pbihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgIGpvaW4pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2V0TWl0ZXJMaW1pdChDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWZsb2F0IGxpbWl0OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmbGltaXQpKQotCQlyZXR1cm4gTlVMTDsKLQlDR0NvbnRleHRTZXRNaXRlckxpbWl0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICBsaW1pdCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBmbG9hdCBsaW1pdDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJmIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmxpbWl0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0dDb250ZXh0U2V0TWl0ZXJMaW1pdChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXQpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2V0RmxhdG5lc3MoQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlmbG9hdCBmbGF0bmVzczsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJmIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYXRuZXNzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0dDb250ZXh0U2V0RmxhdG5lc3MoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICBmbGF0bmVzcyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBmbG9hdCBmbGF0bmVzczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJmIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYXRuZXNzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0dDb250ZXh0U2V0RmxhdG5lc3MoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmbGF0bmVzcyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRBbHBoYShDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWZsb2F0IGFscGhhOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmYWxwaGEpKQotCQlyZXR1cm4gTlVMTDsKLQlDR0NvbnRleHRTZXRBbHBoYShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgIGFscGhhKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGZsb2F0IGFscGhhOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYWxwaGEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDR0NvbnRleHRTZXRBbHBoYShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgIGFscGhhKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dEJlZ2luUGF0aChDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlDR0NvbnRleHRCZWdpblBhdGgoX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0dDb250ZXh0QmVnaW5QYXRoKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0TW92ZVRvUG9pbnQoQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlmbG9hdCB4OwotCWZsb2F0IHk7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiZmYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmeCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnkpKQotCQlyZXR1cm4gTlVMTDsKLQlDR0NvbnRleHRNb3ZlVG9Qb2ludChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgIHgsCi0JICAgICAgICAgICAgICAgICAgICAgeSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBmbG9hdCB4OworICAgIGZsb2F0IHk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiZmYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDR0NvbnRleHRNb3ZlVG9Qb2ludChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgeSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRBZGRMaW5lVG9Qb2ludChDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWZsb2F0IHg7Ci0JZmxvYXQgeTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJmZiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ4LAotCSAgICAgICAgICAgICAgICAgICAgICAmeSkpCi0JCXJldHVybiBOVUxMOwotCUNHQ29udGV4dEFkZExpbmVUb1BvaW50KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgeCwKLQkgICAgICAgICAgICAgICAgICAgICAgICB5KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGZsb2F0IHg7CisgICAgZmxvYXQgeTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJmZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmeSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENHQ29udGV4dEFkZExpbmVUb1BvaW50KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB5KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dEFkZEN1cnZlVG9Qb2ludChDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWZsb2F0IGNwMXg7Ci0JZmxvYXQgY3AxeTsKLQlmbG9hdCBjcDJ4OwotCWZsb2F0IGNwMnk7Ci0JZmxvYXQgeDsKLQlmbG9hdCB5OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImZmZmZmZiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZjcDF4LAotCSAgICAgICAgICAgICAgICAgICAgICAmY3AxeSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNwMngsCi0JICAgICAgICAgICAgICAgICAgICAgICZjcDJ5LAotCSAgICAgICAgICAgICAgICAgICAgICAmeCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnkpKQotCQlyZXR1cm4gTlVMTDsKLQlDR0NvbnRleHRBZGRDdXJ2ZVRvUG9pbnQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgY3AxeCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgY3AxeSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgY3AyeCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgY3AyeSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgeCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgeSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBmbG9hdCBjcDF4OworICAgIGZsb2F0IGNwMXk7CisgICAgZmxvYXQgY3AyeDsKKyAgICBmbG9hdCBjcDJ5OworICAgIGZsb2F0IHg7CisgICAgZmxvYXQgeTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJmZmZmZmYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY3AxeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNwMXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjcDJ4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY3AyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJngsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ5KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0dDb250ZXh0QWRkQ3VydmVUb1BvaW50KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwMXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwMXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwMngsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwMnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0QWRkUXVhZEN1cnZlVG9Qb2ludChDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWZsb2F0IGNweDsKLQlmbG9hdCBjcHk7Ci0JZmxvYXQgeDsKLQlmbG9hdCB5OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImZmZmYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmY3B4LAotCSAgICAgICAgICAgICAgICAgICAgICAmY3B5LAotCSAgICAgICAgICAgICAgICAgICAgICAmeCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnkpKQotCQlyZXR1cm4gTlVMTDsKLQlDR0NvbnRleHRBZGRRdWFkQ3VydmVUb1BvaW50KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcHgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcHksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBmbG9hdCBjcHg7CisgICAgZmxvYXQgY3B5OworICAgIGZsb2F0IHg7CisgICAgZmxvYXQgeTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJmZmZmIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNweCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNweSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJngsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ5KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0dDb250ZXh0QWRkUXVhZEN1cnZlVG9Qb2ludChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3B4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3B5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0Q2xvc2VQYXRoKENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUNHQ29udGV4dENsb3NlUGF0aChfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDR0NvbnRleHRDbG9zZVBhdGgoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRBZGRSZWN0KENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0dSZWN0IHJlY3Q7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDR1JlY3RfQ29udmVydCwgJnJlY3QpKQotCQlyZXR1cm4gTlVMTDsKLQlDR0NvbnRleHRBZGRSZWN0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICByZWN0KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENHUmVjdCByZWN0OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0dSZWN0X0NvbnZlcnQsICZyZWN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0dDb250ZXh0QWRkUmVjdChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgcmVjdCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRBZGRBcmMoQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlmbG9hdCB4OwotCWZsb2F0IHk7Ci0JZmxvYXQgcmFkaXVzOwotCWZsb2F0IHN0YXJ0QW5nbGU7Ci0JZmxvYXQgZW5kQW5nbGU7Ci0JaW50IGNsb2Nrd2lzZTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJmZmZmZmkiLAotCSAgICAgICAgICAgICAgICAgICAgICAmeCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnksCi0JICAgICAgICAgICAgICAgICAgICAgICZyYWRpdXMsCi0JICAgICAgICAgICAgICAgICAgICAgICZzdGFydEFuZ2xlLAotCSAgICAgICAgICAgICAgICAgICAgICAmZW5kQW5nbGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZjbG9ja3dpc2UpKQotCQlyZXR1cm4gTlVMTDsKLQlDR0NvbnRleHRBZGRBcmMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgeCwKLQkgICAgICAgICAgICAgICAgeSwKLQkgICAgICAgICAgICAgICAgcmFkaXVzLAotCSAgICAgICAgICAgICAgICBzdGFydEFuZ2xlLAotCSAgICAgICAgICAgICAgICBlbmRBbmdsZSwKLQkgICAgICAgICAgICAgICAgY2xvY2t3aXNlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGZsb2F0IHg7CisgICAgZmxvYXQgeTsKKyAgICBmbG9hdCByYWRpdXM7CisgICAgZmxvYXQgc3RhcnRBbmdsZTsKKyAgICBmbG9hdCBlbmRBbmdsZTsKKyAgICBpbnQgY2xvY2t3aXNlOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImZmZmZmaSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJhZGl1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0QW5nbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmRBbmdsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNsb2Nrd2lzZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENHQ29udGV4dEFkZEFyYyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICB4LAorICAgICAgICAgICAgICAgICAgICB5LAorICAgICAgICAgICAgICAgICAgICByYWRpdXMsCisgICAgICAgICAgICAgICAgICAgIHN0YXJ0QW5nbGUsCisgICAgICAgICAgICAgICAgICAgIGVuZEFuZ2xlLAorICAgICAgICAgICAgICAgICAgICBjbG9ja3dpc2UpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0QWRkQXJjVG9Qb2ludChDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWZsb2F0IHgxOwotCWZsb2F0IHkxOwotCWZsb2F0IHgyOwotCWZsb2F0IHkyOwotCWZsb2F0IHJhZGl1czsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJmZmZmZiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ4MSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnkxLAotCSAgICAgICAgICAgICAgICAgICAgICAmeDIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ5MiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJhZGl1cykpCi0JCXJldHVybiBOVUxMOwotCUNHQ29udGV4dEFkZEFyY1RvUG9pbnQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgIHgxLAotCSAgICAgICAgICAgICAgICAgICAgICAgeTEsCi0JICAgICAgICAgICAgICAgICAgICAgICB4MiwKLQkgICAgICAgICAgICAgICAgICAgICAgIHkyLAotCSAgICAgICAgICAgICAgICAgICAgICAgcmFkaXVzKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGZsb2F0IHgxOworICAgIGZsb2F0IHkxOworICAgIGZsb2F0IHgyOworICAgIGZsb2F0IHkyOworICAgIGZsb2F0IHJhZGl1czsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJmZmZmZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ4MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnkxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmeDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ5MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJhZGl1cykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENHQ29udGV4dEFkZEFyY1RvUG9pbnQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHgxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgeTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB4MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHkyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFkaXVzKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dElzUGF0aEVtcHR5KENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JaW50IF9ydjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0dDb250ZXh0SXNQYXRoRW1wdHkoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImkiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGludCBfcnY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENHQ29udGV4dElzUGF0aEVtcHR5KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRHZXRQYXRoQ3VycmVudFBvaW50KENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0dQb2ludCBfcnY7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENHQ29udGV4dEdldFBhdGhDdXJyZW50UG9pbnQoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDR1BvaW50X05ldywgJl9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENHUG9pbnQgX3J2OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDR0NvbnRleHRHZXRQYXRoQ3VycmVudFBvaW50KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0dQb2ludF9OZXcsICZfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRHZXRQYXRoQm91bmRpbmdCb3goQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDR1JlY3QgX3J2OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDR0NvbnRleHRHZXRQYXRoQm91bmRpbmdCb3goX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDR1JlY3RfTmV3LCAmX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0dSZWN0IF9ydjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0dDb250ZXh0R2V0UGF0aEJvdW5kaW5nQm94KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0dSZWN0X05ldywgJl9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dERyYXdQYXRoKENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JaW50IG1vZGU7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaSIsCi0JICAgICAgICAgICAgICAgICAgICAgICZtb2RlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0dDb250ZXh0RHJhd1BhdGgoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICBtb2RlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGludCBtb2RlOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbW9kZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENHQ29udGV4dERyYXdQYXRoKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgbW9kZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRGaWxsUGF0aChDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlDR0NvbnRleHRGaWxsUGF0aChfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDR0NvbnRleHRGaWxsUGF0aChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dEVPRmlsbFBhdGgoQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0dDb250ZXh0RU9GaWxsUGF0aChfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDR0NvbnRleHRFT0ZpbGxQYXRoKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U3Ryb2tlUGF0aChDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlDR0NvbnRleHRTdHJva2VQYXRoKF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENHQ29udGV4dFN0cm9rZVBhdGgoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRGaWxsUmVjdChDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNHUmVjdCByZWN0OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0dSZWN0X0NvbnZlcnQsICZyZWN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0dDb250ZXh0RmlsbFJlY3QoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICByZWN0KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENHUmVjdCByZWN0OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0dSZWN0X0NvbnZlcnQsICZyZWN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0dDb250ZXh0RmlsbFJlY3QoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICByZWN0KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFN0cm9rZVJlY3QoQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDR1JlY3QgcmVjdDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENHUmVjdF9Db252ZXJ0LCAmcmVjdCkpCi0JCXJldHVybiBOVUxMOwotCUNHQ29udGV4dFN0cm9rZVJlY3QoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgIHJlY3QpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0dSZWN0IHJlY3Q7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDR1JlY3RfQ29udmVydCwgJnJlY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDR0NvbnRleHRTdHJva2VSZWN0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICByZWN0KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFN0cm9rZVJlY3RXaXRoV2lkdGgoQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDR1JlY3QgcmVjdDsKLQlmbG9hdCB3aWR0aDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDR1JlY3RfQ29udmVydCwgJnJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICZ3aWR0aCkpCi0JCXJldHVybiBOVUxMOwotCUNHQ29udGV4dFN0cm9rZVJlY3RXaXRoV2lkdGgoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDR1JlY3QgcmVjdDsKKyAgICBmbG9hdCB3aWR0aDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDR1JlY3RfQ29udmVydCwgJnJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ3aWR0aCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENHQ29udGV4dFN0cm9rZVJlY3RXaXRoV2lkdGgoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRDbGVhclJlY3QoQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDR1JlY3QgcmVjdDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENHUmVjdF9Db252ZXJ0LCAmcmVjdCkpCi0JCXJldHVybiBOVUxMOwotCUNHQ29udGV4dENsZWFyUmVjdChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICByZWN0KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENHUmVjdCByZWN0OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0dSZWN0X0NvbnZlcnQsICZyZWN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0dDb250ZXh0Q2xlYXJSZWN0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgIHJlY3QpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0Q2xpcChDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlDR0NvbnRleHRDbGlwKF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENHQ29udGV4dENsaXAoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRFT0NsaXAoQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0dDb250ZXh0RU9DbGlwKF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENHQ29udGV4dEVPQ2xpcChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dENsaXBUb1JlY3QoQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDR1JlY3QgcmVjdDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENHUmVjdF9Db252ZXJ0LCAmcmVjdCkpCi0JCXJldHVybiBOVUxMOwotCUNHQ29udGV4dENsaXBUb1JlY3QoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgIHJlY3QpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0dSZWN0IHJlY3Q7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDR1JlY3RfQ29udmVydCwgJnJlY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDR0NvbnRleHRDbGlwVG9SZWN0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICByZWN0KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNldEdyYXlGaWxsQ29sb3IoQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlmbG9hdCBncmF5OwotCWZsb2F0IGFscGhhOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImZmIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmdyYXksCi0JICAgICAgICAgICAgICAgICAgICAgICZhbHBoYSkpCi0JCXJldHVybiBOVUxMOwotCUNHQ29udGV4dFNldEdyYXlGaWxsQ29sb3IoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYXksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBmbG9hdCBncmF5OworICAgIGZsb2F0IGFscGhhOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImZmIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmdyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhbHBoYSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENHQ29udGV4dFNldEdyYXlGaWxsQ29sb3IoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRHcmF5U3Ryb2tlQ29sb3IoQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlmbG9hdCBncmF5OwotCWZsb2F0IGFscGhhOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImZmIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmdyYXksCi0JICAgICAgICAgICAgICAgICAgICAgICZhbHBoYSkpCi0JCXJldHVybiBOVUxMOwotCUNHQ29udGV4dFNldEdyYXlTdHJva2VDb2xvcihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmF5LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBmbG9hdCBncmF5OworICAgIGZsb2F0IGFscGhhOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImZmIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmdyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhbHBoYSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENHQ29udGV4dFNldEdyYXlTdHJva2VDb2xvcihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRSR0JGaWxsQ29sb3IoQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlmbG9hdCByZWQ7Ci0JZmxvYXQgZ3JlZW47Ci0JZmxvYXQgYmx1ZTsKLQlmbG9hdCBhbHBoYTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJmZmZmIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJlZCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmdyZWVuLAotCSAgICAgICAgICAgICAgICAgICAgICAmYmx1ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmFscGhhKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0dDb250ZXh0U2V0UkdCRmlsbENvbG9yKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIHJlZCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgZ3JlZW4sCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGJsdWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGZsb2F0IHJlZDsKKyAgICBmbG9hdCBncmVlbjsKKyAgICBmbG9hdCBibHVlOworICAgIGZsb2F0IGFscGhhOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImZmZmYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZ3JlZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZibHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYWxwaGEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDR0NvbnRleHRTZXRSR0JGaWxsQ29sb3IoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmVlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2V0UkdCU3Ryb2tlQ29sb3IoQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlmbG9hdCByZWQ7Ci0JZmxvYXQgZ3JlZW47Ci0JZmxvYXQgYmx1ZTsKLQlmbG9hdCBhbHBoYTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJmZmZmIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJlZCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmdyZWVuLAotCSAgICAgICAgICAgICAgICAgICAgICAmYmx1ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmFscGhhKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0dDb250ZXh0U2V0UkdCU3Ryb2tlQ29sb3IoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICByZWQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JlZW4sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgYmx1ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBmbG9hdCByZWQ7CisgICAgZmxvYXQgZ3JlZW47CisgICAgZmxvYXQgYmx1ZTsKKyAgICBmbG9hdCBhbHBoYTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJmZmZmIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmdyZWVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYmx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFscGhhKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0dDb250ZXh0U2V0UkdCU3Ryb2tlQ29sb3IoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JlZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRDTVlLRmlsbENvbG9yKENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JZmxvYXQgY3lhbjsKLQlmbG9hdCBtYWdlbnRhOwotCWZsb2F0IHllbGxvdzsKLQlmbG9hdCBibGFjazsKLQlmbG9hdCBhbHBoYTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJmZmZmZiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZjeWFuLAotCSAgICAgICAgICAgICAgICAgICAgICAmbWFnZW50YSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnllbGxvdywKLQkgICAgICAgICAgICAgICAgICAgICAgJmJsYWNrLAotCSAgICAgICAgICAgICAgICAgICAgICAmYWxwaGEpKQotCQlyZXR1cm4gTlVMTDsKLQlDR0NvbnRleHRTZXRDTVlLRmlsbENvbG9yKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBjeWFuLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgbWFnZW50YSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIHllbGxvdywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGJsYWNrLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgZmxvYXQgY3lhbjsKKyAgICBmbG9hdCBtYWdlbnRhOworICAgIGZsb2F0IHllbGxvdzsKKyAgICBmbG9hdCBibGFjazsKKyAgICBmbG9hdCBhbHBoYTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJmZmZmZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjeWFuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWFnZW50YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnllbGxvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmJsYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYWxwaGEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDR0NvbnRleHRTZXRDTVlLRmlsbENvbG9yKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjeWFuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFnZW50YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllbGxvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2V0Q01ZS1N0cm9rZUNvbG9yKENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JZmxvYXQgY3lhbjsKLQlmbG9hdCBtYWdlbnRhOwotCWZsb2F0IHllbGxvdzsKLQlmbG9hdCBibGFjazsKLQlmbG9hdCBhbHBoYTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJmZmZmZiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZjeWFuLAotCSAgICAgICAgICAgICAgICAgICAgICAmbWFnZW50YSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnllbGxvdywKLQkgICAgICAgICAgICAgICAgICAgICAgJmJsYWNrLAotCSAgICAgICAgICAgICAgICAgICAgICAmYWxwaGEpKQotCQlyZXR1cm4gTlVMTDsKLQlDR0NvbnRleHRTZXRDTVlLU3Ryb2tlQ29sb3IoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3lhbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFnZW50YSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVsbG93LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGFjaywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgZmxvYXQgY3lhbjsKKyAgICBmbG9hdCBtYWdlbnRhOworICAgIGZsb2F0IHllbGxvdzsKKyAgICBmbG9hdCBibGFjazsKKyAgICBmbG9hdCBhbHBoYTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJmZmZmZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjeWFuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWFnZW50YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnllbGxvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmJsYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYWxwaGEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDR0NvbnRleHRTZXRDTVlLU3Ryb2tlQ29sb3IoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3lhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFnZW50YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVsbG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0R2V0SW50ZXJwb2xhdGlvblF1YWxpdHkoQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlpbnQgX3J2OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDR0NvbnRleHRHZXRJbnRlcnBvbGF0aW9uUXVhbGl0eShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaSIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgaW50IF9ydjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0dDb250ZXh0R2V0SW50ZXJwb2xhdGlvblF1YWxpdHkoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImkiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNldEludGVycG9sYXRpb25RdWFsaXR5KENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JaW50IHF1YWxpdHk7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaSIsCi0JICAgICAgICAgICAgICAgICAgICAgICZxdWFsaXR5KSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0dDb250ZXh0U2V0SW50ZXJwb2xhdGlvblF1YWxpdHkoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFsaXR5KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGludCBxdWFsaXR5OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcXVhbGl0eSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENHQ29udGV4dFNldEludGVycG9sYXRpb25RdWFsaXR5KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGl0eSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRDaGFyYWN0ZXJTcGFjaW5nKENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JZmxvYXQgc3BhY2luZzsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJmIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNwYWNpbmcpKQotCQlyZXR1cm4gTlVMTDsKLQlDR0NvbnRleHRTZXRDaGFyYWN0ZXJTcGFjaW5nKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFjaW5nKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGZsb2F0IHNwYWNpbmc7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzcGFjaW5nKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0dDb250ZXh0U2V0Q2hhcmFjdGVyU3BhY2luZyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhY2luZyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRUZXh0UG9zaXRpb24oQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlmbG9hdCB4OwotCWZsb2F0IHk7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiZmYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmeCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnkpKQotCQlyZXR1cm4gTlVMTDsKLQlDR0NvbnRleHRTZXRUZXh0UG9zaXRpb24oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgeCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgeSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBmbG9hdCB4OworICAgIGZsb2F0IHk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiZmYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDR0NvbnRleHRTZXRUZXh0UG9zaXRpb24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRHZXRUZXh0UG9zaXRpb24oQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDR1BvaW50IF9ydjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0dDb250ZXh0R2V0VGV4dFBvc2l0aW9uKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0dQb2ludF9OZXcsICZfcnYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDR1BvaW50IF9ydjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0dDb250ZXh0R2V0VGV4dFBvc2l0aW9uKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0dQb2ludF9OZXcsICZfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRUZXh0TWF0cml4KENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0dBZmZpbmVUcmFuc2Zvcm0gdHJhbnNmb3JtOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0dBZmZpbmVUcmFuc2Zvcm1fQ29udmVydCwgJnRyYW5zZm9ybSkpCi0JCXJldHVybiBOVUxMOwotCUNHQ29udGV4dFNldFRleHRNYXRyaXgoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDR0FmZmluZVRyYW5zZm9ybSB0cmFuc2Zvcm07CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDR0FmZmluZVRyYW5zZm9ybV9Db252ZXJ0LCAmdHJhbnNmb3JtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0dDb250ZXh0U2V0VGV4dE1hdHJpeChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dEdldFRleHRNYXRyaXgoQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDR0FmZmluZVRyYW5zZm9ybSBfcnY7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENHQ29udGV4dEdldFRleHRNYXRyaXgoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDR0FmZmluZVRyYW5zZm9ybV9OZXcsICZfcnYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDR0FmZmluZVRyYW5zZm9ybSBfcnY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENHQ29udGV4dEdldFRleHRNYXRyaXgoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDR0FmZmluZVRyYW5zZm9ybV9OZXcsICZfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRUZXh0RHJhd2luZ01vZGUoQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlpbnQgbW9kZTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJpIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vZGUpKQotCQlyZXR1cm4gTlVMTDsKLQlDR0NvbnRleHRTZXRUZXh0RHJhd2luZ01vZGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBpbnQgbW9kZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDR0NvbnRleHRTZXRUZXh0RHJhd2luZ01vZGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRGb250U2l6ZShDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWZsb2F0IHNpemU7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiZiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZzaXplKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0dDb250ZXh0U2V0Rm9udFNpemUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICBzaXplKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGZsb2F0IHNpemU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0dDb250ZXh0U2V0Rm9udFNpemUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNlbGVjdEZvbnQoQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQljaGFyICogbmFtZTsKLQlmbG9hdCBzaXplOwotCWludCB0ZXh0RW5jb2Rpbmc7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAic2ZpIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZzaXplLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGV4dEVuY29kaW5nKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0dDb250ZXh0U2VsZWN0Rm9udChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgbmFtZSwKLQkgICAgICAgICAgICAgICAgICAgIHNpemUsCi0JICAgICAgICAgICAgICAgICAgICB0ZXh0RW5jb2RpbmcpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgY2hhciAqIG5hbWU7CisgICAgZmxvYXQgc2l6ZTsKKyAgICBpbnQgdGV4dEVuY29kaW5nOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInNmaSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRleHRFbmNvZGluZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENHQ29udGV4dFNlbGVjdEZvbnQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgdGV4dEVuY29kaW5nKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNob3dUZXh0KENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JY2hhciAqY3N0cmluZ19faW5fXzsKLQlsb25nIGNzdHJpbmdfX2xlbl9fOwotCWludCBjc3RyaW5nX19pbl9sZW5fXzsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzIyIsCi0JICAgICAgICAgICAgICAgICAgICAgICZjc3RyaW5nX19pbl9fLCAmY3N0cmluZ19faW5fbGVuX18pKQotCQlyZXR1cm4gTlVMTDsKLQljc3RyaW5nX19sZW5fXyA9IGNzdHJpbmdfX2luX2xlbl9fOwotCUNHQ29udGV4dFNob3dUZXh0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgY3N0cmluZ19faW5fXywgY3N0cmluZ19fbGVuX18pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgY2hhciAqY3N0cmluZ19faW5fXzsKKyAgICBsb25nIGNzdHJpbmdfX2xlbl9fOworICAgIGludCBjc3RyaW5nX19pbl9sZW5fXzsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzIyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjc3RyaW5nX19pbl9fLCAmY3N0cmluZ19faW5fbGVuX18pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBjc3RyaW5nX19sZW5fXyA9IGNzdHJpbmdfX2luX2xlbl9fOworICAgIENHQ29udGV4dFNob3dUZXh0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgY3N0cmluZ19faW5fXywgY3N0cmluZ19fbGVuX18pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2hvd1RleHRBdFBvaW50KENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JZmxvYXQgeDsKLQlmbG9hdCB5OwotCWNoYXIgKmNzdHJpbmdfX2luX187Ci0JbG9uZyBjc3RyaW5nX19sZW5fXzsKLQlpbnQgY3N0cmluZ19faW5fbGVuX187Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiZmZzIyIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ4LAotCSAgICAgICAgICAgICAgICAgICAgICAmeSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNzdHJpbmdfX2luX18sICZjc3RyaW5nX19pbl9sZW5fXykpCi0JCXJldHVybiBOVUxMOwotCWNzdHJpbmdfX2xlbl9fID0gY3N0cmluZ19faW5fbGVuX187Ci0JQ0dDb250ZXh0U2hvd1RleHRBdFBvaW50KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIHgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIHksCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGNzdHJpbmdfX2luX18sIGNzdHJpbmdfX2xlbl9fKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGZsb2F0IHg7CisgICAgZmxvYXQgeTsKKyAgICBjaGFyICpjc3RyaW5nX19pbl9fOworICAgIGxvbmcgY3N0cmluZ19fbGVuX187CisgICAgaW50IGNzdHJpbmdfX2luX2xlbl9fOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImZmcyMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjc3RyaW5nX19pbl9fLCAmY3N0cmluZ19faW5fbGVuX18pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBjc3RyaW5nX19sZW5fXyA9IGNzdHJpbmdfX2luX2xlbl9fOworICAgIENHQ29udGV4dFNob3dUZXh0QXRQb2ludChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3RyaW5nX19pbl9fLCBjc3RyaW5nX19sZW5fXyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRFbmRQYWdlKENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUNHQ29udGV4dEVuZFBhZ2UoX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0dDb250ZXh0RW5kUGFnZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dEZsdXNoKENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUNHQ29udGV4dEZsdXNoKF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENHQ29udGV4dEZsdXNoKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U3luY2hyb25pemUoQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0dDb250ZXh0U3luY2hyb25pemUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0dDb250ZXh0U3luY2hyb25pemUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRTaG91bGRBbnRpYWxpYXMoQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlpbnQgc2hvdWxkQW50aWFsaWFzOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImkiLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2hvdWxkQW50aWFsaWFzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0dDb250ZXh0U2V0U2hvdWxkQW50aWFsaWFzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZEFudGlhbGlhcyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBpbnQgc2hvdWxkQW50aWFsaWFzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2hvdWxkQW50aWFsaWFzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0dDb250ZXh0U2V0U2hvdWxkQW50aWFsaWFzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZEFudGlhbGlhcyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiAjaWZuZGVmIF9fTFA2NF9fCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9TeW5jQ0dDb250ZXh0T3JpZ2luV2l0aFBvcnQoQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDR3JhZlB0ciBwb3J0OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgR3JhZk9ial9Db252ZXJ0LCAmcG9ydCkpCi0JCXJldHVybiBOVUxMOwotCVN5bmNDR0NvbnRleHRPcmlnaW5XaXRoUG9ydChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENHcmFmUHRyIHBvcnQ7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX0NvbnZlcnQsICZwb3J0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU3luY0NHQ29udGV4dE9yaWdpbldpdGhQb3J0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfQ2xpcENHQ29udGV4dFRvUmVnaW9uKENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVjdCBwb3J0UmVjdDsKLQlSZ25IYW5kbGUgcmVnaW9uOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmcG9ydFJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmVnaW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ2xpcENHQ29udGV4dFRvUmVnaW9uKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICZwb3J0UmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlY3QgcG9ydFJlY3Q7CisgICAgUmduSGFuZGxlIHJlZ2lvbjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnBvcnRSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJlZ2lvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENsaXBDR0NvbnRleHRUb1JlZ2lvbihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcG9ydFJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogI2VuZGlmCiAKIHN0YXRpYyBQeU1ldGhvZERlZiBDR0NvbnRleHRSZWZPYmpfbWV0aG9kc1tdID0gewotCXsiQ0dDb250ZXh0U2F2ZUdTdGF0ZSIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2F2ZUdTdGF0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiQ0dDb250ZXh0UmVzdG9yZUdTdGF0ZSIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0UmVzdG9yZUdTdGF0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiQ0dDb250ZXh0U2NhbGVDVE0iLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNjYWxlQ1RNLCAxLAotCSBQeURvY19TVFIoIihmbG9hdCBzeCwgZmxvYXQgc3kpIC0+IE5vbmUiKX0sCi0JeyJDR0NvbnRleHRUcmFuc2xhdGVDVE0iLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFRyYW5zbGF0ZUNUTSwgMSwKLQkgUHlEb2NfU1RSKCIoZmxvYXQgdHgsIGZsb2F0IHR5KSAtPiBOb25lIil9LAotCXsiQ0dDb250ZXh0Um90YXRlQ1RNIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRSb3RhdGVDVE0sIDEsCi0JIFB5RG9jX1NUUigiKGZsb2F0IGFuZ2xlKSAtPiBOb25lIil9LAotCXsiQ0dDb250ZXh0Q29uY2F0Q1RNIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRDb25jYXRDVE0sIDEsCi0JIFB5RG9jX1NUUigiKENHQWZmaW5lVHJhbnNmb3JtIHRyYW5zZm9ybSkgLT4gTm9uZSIpfSwKLQl7IkNHQ29udGV4dEdldENUTSIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0R2V0Q1RNLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDR0FmZmluZVRyYW5zZm9ybSBfcnYpIil9LAotCXsiQ0dDb250ZXh0U2V0TGluZVdpZHRoIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRMaW5lV2lkdGgsIDEsCi0JIFB5RG9jX1NUUigiKGZsb2F0IHdpZHRoKSAtPiBOb25lIil9LAotCXsiQ0dDb250ZXh0U2V0TGluZUNhcCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2V0TGluZUNhcCwgMSwKLQkgUHlEb2NfU1RSKCIoaW50IGNhcCkgLT4gTm9uZSIpfSwKLQl7IkNHQ29udGV4dFNldExpbmVKb2luIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRMaW5lSm9pbiwgMSwKLQkgUHlEb2NfU1RSKCIoaW50IGpvaW4pIC0+IE5vbmUiKX0sCi0JeyJDR0NvbnRleHRTZXRNaXRlckxpbWl0IiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRNaXRlckxpbWl0LCAxLAotCSBQeURvY19TVFIoIihmbG9hdCBsaW1pdCkgLT4gTm9uZSIpfSwKLQl7IkNHQ29udGV4dFNldEZsYXRuZXNzIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRGbGF0bmVzcywgMSwKLQkgUHlEb2NfU1RSKCIoZmxvYXQgZmxhdG5lc3MpIC0+IE5vbmUiKX0sCi0JeyJDR0NvbnRleHRTZXRBbHBoYSIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2V0QWxwaGEsIDEsCi0JIFB5RG9jX1NUUigiKGZsb2F0IGFscGhhKSAtPiBOb25lIil9LAotCXsiQ0dDb250ZXh0QmVnaW5QYXRoIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRCZWdpblBhdGgsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkNHQ29udGV4dE1vdmVUb1BvaW50IiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRNb3ZlVG9Qb2ludCwgMSwKLQkgUHlEb2NfU1RSKCIoZmxvYXQgeCwgZmxvYXQgeSkgLT4gTm9uZSIpfSwKLQl7IkNHQ29udGV4dEFkZExpbmVUb1BvaW50IiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRBZGRMaW5lVG9Qb2ludCwgMSwKLQkgUHlEb2NfU1RSKCIoZmxvYXQgeCwgZmxvYXQgeSkgLT4gTm9uZSIpfSwKLQl7IkNHQ29udGV4dEFkZEN1cnZlVG9Qb2ludCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0QWRkQ3VydmVUb1BvaW50LCAxLAotCSBQeURvY19TVFIoIihmbG9hdCBjcDF4LCBmbG9hdCBjcDF5LCBmbG9hdCBjcDJ4LCBmbG9hdCBjcDJ5LCBmbG9hdCB4LCBmbG9hdCB5KSAtPiBOb25lIil9LAotCXsiQ0dDb250ZXh0QWRkUXVhZEN1cnZlVG9Qb2ludCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0QWRkUXVhZEN1cnZlVG9Qb2ludCwgMSwKLQkgUHlEb2NfU1RSKCIoZmxvYXQgY3B4LCBmbG9hdCBjcHksIGZsb2F0IHgsIGZsb2F0IHkpIC0+IE5vbmUiKX0sCi0JeyJDR0NvbnRleHRDbG9zZVBhdGgiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dENsb3NlUGF0aCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiQ0dDb250ZXh0QWRkUmVjdCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0QWRkUmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoQ0dSZWN0IHJlY3QpIC0+IE5vbmUiKX0sCi0JeyJDR0NvbnRleHRBZGRBcmMiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dEFkZEFyYywgMSwKLQkgUHlEb2NfU1RSKCIoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgcmFkaXVzLCBmbG9hdCBzdGFydEFuZ2xlLCBmbG9hdCBlbmRBbmdsZSwgaW50IGNsb2Nrd2lzZSkgLT4gTm9uZSIpfSwKLQl7IkNHQ29udGV4dEFkZEFyY1RvUG9pbnQiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dEFkZEFyY1RvUG9pbnQsIDEsCi0JIFB5RG9jX1NUUigiKGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgeDIsIGZsb2F0IHkyLCBmbG9hdCByYWRpdXMpIC0+IE5vbmUiKX0sCi0JeyJDR0NvbnRleHRJc1BhdGhFbXB0eSIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0SXNQYXRoRW1wdHksIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKGludCBfcnYpIil9LAotCXsiQ0dDb250ZXh0R2V0UGF0aEN1cnJlbnRQb2ludCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0R2V0UGF0aEN1cnJlbnRQb2ludCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ0dQb2ludCBfcnYpIil9LAotCXsiQ0dDb250ZXh0R2V0UGF0aEJvdW5kaW5nQm94IiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRHZXRQYXRoQm91bmRpbmdCb3gsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENHUmVjdCBfcnYpIil9LAotCXsiQ0dDb250ZXh0RHJhd1BhdGgiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dERyYXdQYXRoLCAxLAotCSBQeURvY19TVFIoIihpbnQgbW9kZSkgLT4gTm9uZSIpfSwKLQl7IkNHQ29udGV4dEZpbGxQYXRoIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRGaWxsUGF0aCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiQ0dDb250ZXh0RU9GaWxsUGF0aCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0RU9GaWxsUGF0aCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiQ0dDb250ZXh0U3Ryb2tlUGF0aCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U3Ryb2tlUGF0aCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiQ0dDb250ZXh0RmlsbFJlY3QiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dEZpbGxSZWN0LCAxLAotCSBQeURvY19TVFIoIihDR1JlY3QgcmVjdCkgLT4gTm9uZSIpfSwKLQl7IkNHQ29udGV4dFN0cm9rZVJlY3QiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFN0cm9rZVJlY3QsIDEsCi0JIFB5RG9jX1NUUigiKENHUmVjdCByZWN0KSAtPiBOb25lIil9LAotCXsiQ0dDb250ZXh0U3Ryb2tlUmVjdFdpdGhXaWR0aCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U3Ryb2tlUmVjdFdpdGhXaWR0aCwgMSwKLQkgUHlEb2NfU1RSKCIoQ0dSZWN0IHJlY3QsIGZsb2F0IHdpZHRoKSAtPiBOb25lIil9LAotCXsiQ0dDb250ZXh0Q2xlYXJSZWN0IiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRDbGVhclJlY3QsIDEsCi0JIFB5RG9jX1NUUigiKENHUmVjdCByZWN0KSAtPiBOb25lIil9LAotCXsiQ0dDb250ZXh0Q2xpcCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0Q2xpcCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiQ0dDb250ZXh0RU9DbGlwIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRFT0NsaXAsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkNHQ29udGV4dENsaXBUb1JlY3QiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dENsaXBUb1JlY3QsIDEsCi0JIFB5RG9jX1NUUigiKENHUmVjdCByZWN0KSAtPiBOb25lIil9LAotCXsiQ0dDb250ZXh0U2V0R3JheUZpbGxDb2xvciIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2V0R3JheUZpbGxDb2xvciwgMSwKLQkgUHlEb2NfU1RSKCIoZmxvYXQgZ3JheSwgZmxvYXQgYWxwaGEpIC0+IE5vbmUiKX0sCi0JeyJDR0NvbnRleHRTZXRHcmF5U3Ryb2tlQ29sb3IiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNldEdyYXlTdHJva2VDb2xvciwgMSwKLQkgUHlEb2NfU1RSKCIoZmxvYXQgZ3JheSwgZmxvYXQgYWxwaGEpIC0+IE5vbmUiKX0sCi0JeyJDR0NvbnRleHRTZXRSR0JGaWxsQ29sb3IiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNldFJHQkZpbGxDb2xvciwgMSwKLQkgUHlEb2NfU1RSKCIoZmxvYXQgcmVkLCBmbG9hdCBncmVlbiwgZmxvYXQgYmx1ZSwgZmxvYXQgYWxwaGEpIC0+IE5vbmUiKX0sCi0JeyJDR0NvbnRleHRTZXRSR0JTdHJva2VDb2xvciIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2V0UkdCU3Ryb2tlQ29sb3IsIDEsCi0JIFB5RG9jX1NUUigiKGZsb2F0IHJlZCwgZmxvYXQgZ3JlZW4sIGZsb2F0IGJsdWUsIGZsb2F0IGFscGhhKSAtPiBOb25lIil9LAotCXsiQ0dDb250ZXh0U2V0Q01ZS0ZpbGxDb2xvciIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2V0Q01ZS0ZpbGxDb2xvciwgMSwKLQkgUHlEb2NfU1RSKCIoZmxvYXQgY3lhbiwgZmxvYXQgbWFnZW50YSwgZmxvYXQgeWVsbG93LCBmbG9hdCBibGFjaywgZmxvYXQgYWxwaGEpIC0+IE5vbmUiKX0sCi0JeyJDR0NvbnRleHRTZXRDTVlLU3Ryb2tlQ29sb3IiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNldENNWUtTdHJva2VDb2xvciwgMSwKLQkgUHlEb2NfU1RSKCIoZmxvYXQgY3lhbiwgZmxvYXQgbWFnZW50YSwgZmxvYXQgeWVsbG93LCBmbG9hdCBibGFjaywgZmxvYXQgYWxwaGEpIC0+IE5vbmUiKX0sCi0JeyJDR0NvbnRleHRHZXRJbnRlcnBvbGF0aW9uUXVhbGl0eSIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0R2V0SW50ZXJwb2xhdGlvblF1YWxpdHksIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKGludCBfcnYpIil9LAotCXsiQ0dDb250ZXh0U2V0SW50ZXJwb2xhdGlvblF1YWxpdHkiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNldEludGVycG9sYXRpb25RdWFsaXR5LCAxLAotCSBQeURvY19TVFIoIihpbnQgcXVhbGl0eSkgLT4gTm9uZSIpfSwKLQl7IkNHQ29udGV4dFNldENoYXJhY3RlclNwYWNpbmciLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNldENoYXJhY3RlclNwYWNpbmcsIDEsCi0JIFB5RG9jX1NUUigiKGZsb2F0IHNwYWNpbmcpIC0+IE5vbmUiKX0sCi0JeyJDR0NvbnRleHRTZXRUZXh0UG9zaXRpb24iLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNldFRleHRQb3NpdGlvbiwgMSwKLQkgUHlEb2NfU1RSKCIoZmxvYXQgeCwgZmxvYXQgeSkgLT4gTm9uZSIpfSwKLQl7IkNHQ29udGV4dEdldFRleHRQb3NpdGlvbiIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0R2V0VGV4dFBvc2l0aW9uLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDR1BvaW50IF9ydikiKX0sCi0JeyJDR0NvbnRleHRTZXRUZXh0TWF0cml4IiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRUZXh0TWF0cml4LCAxLAotCSBQeURvY19TVFIoIihDR0FmZmluZVRyYW5zZm9ybSB0cmFuc2Zvcm0pIC0+IE5vbmUiKX0sCi0JeyJDR0NvbnRleHRHZXRUZXh0TWF0cml4IiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRHZXRUZXh0TWF0cml4LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDR0FmZmluZVRyYW5zZm9ybSBfcnYpIil9LAotCXsiQ0dDb250ZXh0U2V0VGV4dERyYXdpbmdNb2RlIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRUZXh0RHJhd2luZ01vZGUsIDEsCi0JIFB5RG9jX1NUUigiKGludCBtb2RlKSAtPiBOb25lIil9LAotCXsiQ0dDb250ZXh0U2V0Rm9udFNpemUiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNldEZvbnRTaXplLCAxLAotCSBQeURvY19TVFIoIihmbG9hdCBzaXplKSAtPiBOb25lIil9LAotCXsiQ0dDb250ZXh0U2VsZWN0Rm9udCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2VsZWN0Rm9udCwgMSwKLQkgUHlEb2NfU1RSKCIoY2hhciAqIG5hbWUsIGZsb2F0IHNpemUsIGludCB0ZXh0RW5jb2RpbmcpIC0+IE5vbmUiKX0sCi0JeyJDR0NvbnRleHRTaG93VGV4dCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2hvd1RleHQsIDEsCi0JIFB5RG9jX1NUUigiKEJ1ZmZlciBjc3RyaW5nKSAtPiBOb25lIil9LAotCXsiQ0dDb250ZXh0U2hvd1RleHRBdFBvaW50IiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTaG93VGV4dEF0UG9pbnQsIDEsCi0JIFB5RG9jX1NUUigiKGZsb2F0IHgsIGZsb2F0IHksIEJ1ZmZlciBjc3RyaW5nKSAtPiBOb25lIil9LAotCXsiQ0dDb250ZXh0RW5kUGFnZSIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0RW5kUGFnZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiQ0dDb250ZXh0Rmx1c2giLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dEZsdXNoLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJDR0NvbnRleHRTeW5jaHJvbml6ZSIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U3luY2hyb25pemUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkNHQ29udGV4dFNldFNob3VsZEFudGlhbGlhcyIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2V0U2hvdWxkQW50aWFsaWFzLCAxLAotCSBQeURvY19TVFIoIihpbnQgc2hvdWxkQW50aWFsaWFzKSAtPiBOb25lIil9LAorICAgIHsiQ0dDb250ZXh0U2F2ZUdTdGF0ZSIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2F2ZUdTdGF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiQ0dDb250ZXh0UmVzdG9yZUdTdGF0ZSIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0UmVzdG9yZUdTdGF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiQ0dDb250ZXh0U2NhbGVDVE0iLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNjYWxlQ1RNLCAxLAorICAgICBQeURvY19TVFIoIihmbG9hdCBzeCwgZmxvYXQgc3kpIC0+IE5vbmUiKX0sCisgICAgeyJDR0NvbnRleHRUcmFuc2xhdGVDVE0iLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFRyYW5zbGF0ZUNUTSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoZmxvYXQgdHgsIGZsb2F0IHR5KSAtPiBOb25lIil9LAorICAgIHsiQ0dDb250ZXh0Um90YXRlQ1RNIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRSb3RhdGVDVE0sIDEsCisgICAgIFB5RG9jX1NUUigiKGZsb2F0IGFuZ2xlKSAtPiBOb25lIil9LAorICAgIHsiQ0dDb250ZXh0Q29uY2F0Q1RNIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRDb25jYXRDVE0sIDEsCisgICAgIFB5RG9jX1NUUigiKENHQWZmaW5lVHJhbnNmb3JtIHRyYW5zZm9ybSkgLT4gTm9uZSIpfSwKKyAgICB7IkNHQ29udGV4dEdldENUTSIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0R2V0Q1RNLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDR0FmZmluZVRyYW5zZm9ybSBfcnYpIil9LAorICAgIHsiQ0dDb250ZXh0U2V0TGluZVdpZHRoIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRMaW5lV2lkdGgsIDEsCisgICAgIFB5RG9jX1NUUigiKGZsb2F0IHdpZHRoKSAtPiBOb25lIil9LAorICAgIHsiQ0dDb250ZXh0U2V0TGluZUNhcCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2V0TGluZUNhcCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoaW50IGNhcCkgLT4gTm9uZSIpfSwKKyAgICB7IkNHQ29udGV4dFNldExpbmVKb2luIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRMaW5lSm9pbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoaW50IGpvaW4pIC0+IE5vbmUiKX0sCisgICAgeyJDR0NvbnRleHRTZXRNaXRlckxpbWl0IiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRNaXRlckxpbWl0LCAxLAorICAgICBQeURvY19TVFIoIihmbG9hdCBsaW1pdCkgLT4gTm9uZSIpfSwKKyAgICB7IkNHQ29udGV4dFNldEZsYXRuZXNzIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRGbGF0bmVzcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoZmxvYXQgZmxhdG5lc3MpIC0+IE5vbmUiKX0sCisgICAgeyJDR0NvbnRleHRTZXRBbHBoYSIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2V0QWxwaGEsIDEsCisgICAgIFB5RG9jX1NUUigiKGZsb2F0IGFscGhhKSAtPiBOb25lIil9LAorICAgIHsiQ0dDb250ZXh0QmVnaW5QYXRoIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRCZWdpblBhdGgsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkNHQ29udGV4dE1vdmVUb1BvaW50IiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRNb3ZlVG9Qb2ludCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoZmxvYXQgeCwgZmxvYXQgeSkgLT4gTm9uZSIpfSwKKyAgICB7IkNHQ29udGV4dEFkZExpbmVUb1BvaW50IiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRBZGRMaW5lVG9Qb2ludCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoZmxvYXQgeCwgZmxvYXQgeSkgLT4gTm9uZSIpfSwKKyAgICB7IkNHQ29udGV4dEFkZEN1cnZlVG9Qb2ludCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0QWRkQ3VydmVUb1BvaW50LCAxLAorICAgICBQeURvY19TVFIoIihmbG9hdCBjcDF4LCBmbG9hdCBjcDF5LCBmbG9hdCBjcDJ4LCBmbG9hdCBjcDJ5LCBmbG9hdCB4LCBmbG9hdCB5KSAtPiBOb25lIil9LAorICAgIHsiQ0dDb250ZXh0QWRkUXVhZEN1cnZlVG9Qb2ludCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0QWRkUXVhZEN1cnZlVG9Qb2ludCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoZmxvYXQgY3B4LCBmbG9hdCBjcHksIGZsb2F0IHgsIGZsb2F0IHkpIC0+IE5vbmUiKX0sCisgICAgeyJDR0NvbnRleHRDbG9zZVBhdGgiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dENsb3NlUGF0aCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiQ0dDb250ZXh0QWRkUmVjdCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0QWRkUmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0dSZWN0IHJlY3QpIC0+IE5vbmUiKX0sCisgICAgeyJDR0NvbnRleHRBZGRBcmMiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dEFkZEFyYywgMSwKKyAgICAgUHlEb2NfU1RSKCIoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgcmFkaXVzLCBmbG9hdCBzdGFydEFuZ2xlLCBmbG9hdCBlbmRBbmdsZSwgaW50IGNsb2Nrd2lzZSkgLT4gTm9uZSIpfSwKKyAgICB7IkNHQ29udGV4dEFkZEFyY1RvUG9pbnQiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dEFkZEFyY1RvUG9pbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgeDIsIGZsb2F0IHkyLCBmbG9hdCByYWRpdXMpIC0+IE5vbmUiKX0sCisgICAgeyJDR0NvbnRleHRJc1BhdGhFbXB0eSIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0SXNQYXRoRW1wdHksIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKGludCBfcnYpIil9LAorICAgIHsiQ0dDb250ZXh0R2V0UGF0aEN1cnJlbnRQb2ludCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0R2V0UGF0aEN1cnJlbnRQb2ludCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ0dQb2ludCBfcnYpIil9LAorICAgIHsiQ0dDb250ZXh0R2V0UGF0aEJvdW5kaW5nQm94IiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRHZXRQYXRoQm91bmRpbmdCb3gsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENHUmVjdCBfcnYpIil9LAorICAgIHsiQ0dDb250ZXh0RHJhd1BhdGgiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dERyYXdQYXRoLCAxLAorICAgICBQeURvY19TVFIoIihpbnQgbW9kZSkgLT4gTm9uZSIpfSwKKyAgICB7IkNHQ29udGV4dEZpbGxQYXRoIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRGaWxsUGF0aCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiQ0dDb250ZXh0RU9GaWxsUGF0aCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0RU9GaWxsUGF0aCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiQ0dDb250ZXh0U3Ryb2tlUGF0aCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U3Ryb2tlUGF0aCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiQ0dDb250ZXh0RmlsbFJlY3QiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dEZpbGxSZWN0LCAxLAorICAgICBQeURvY19TVFIoIihDR1JlY3QgcmVjdCkgLT4gTm9uZSIpfSwKKyAgICB7IkNHQ29udGV4dFN0cm9rZVJlY3QiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFN0cm9rZVJlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKENHUmVjdCByZWN0KSAtPiBOb25lIil9LAorICAgIHsiQ0dDb250ZXh0U3Ryb2tlUmVjdFdpdGhXaWR0aCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U3Ryb2tlUmVjdFdpdGhXaWR0aCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0dSZWN0IHJlY3QsIGZsb2F0IHdpZHRoKSAtPiBOb25lIil9LAorICAgIHsiQ0dDb250ZXh0Q2xlYXJSZWN0IiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRDbGVhclJlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKENHUmVjdCByZWN0KSAtPiBOb25lIil9LAorICAgIHsiQ0dDb250ZXh0Q2xpcCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0Q2xpcCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiQ0dDb250ZXh0RU9DbGlwIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRFT0NsaXAsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkNHQ29udGV4dENsaXBUb1JlY3QiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dENsaXBUb1JlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKENHUmVjdCByZWN0KSAtPiBOb25lIil9LAorICAgIHsiQ0dDb250ZXh0U2V0R3JheUZpbGxDb2xvciIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2V0R3JheUZpbGxDb2xvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoZmxvYXQgZ3JheSwgZmxvYXQgYWxwaGEpIC0+IE5vbmUiKX0sCisgICAgeyJDR0NvbnRleHRTZXRHcmF5U3Ryb2tlQ29sb3IiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNldEdyYXlTdHJva2VDb2xvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoZmxvYXQgZ3JheSwgZmxvYXQgYWxwaGEpIC0+IE5vbmUiKX0sCisgICAgeyJDR0NvbnRleHRTZXRSR0JGaWxsQ29sb3IiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNldFJHQkZpbGxDb2xvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoZmxvYXQgcmVkLCBmbG9hdCBncmVlbiwgZmxvYXQgYmx1ZSwgZmxvYXQgYWxwaGEpIC0+IE5vbmUiKX0sCisgICAgeyJDR0NvbnRleHRTZXRSR0JTdHJva2VDb2xvciIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2V0UkdCU3Ryb2tlQ29sb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKGZsb2F0IHJlZCwgZmxvYXQgZ3JlZW4sIGZsb2F0IGJsdWUsIGZsb2F0IGFscGhhKSAtPiBOb25lIil9LAorICAgIHsiQ0dDb250ZXh0U2V0Q01ZS0ZpbGxDb2xvciIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2V0Q01ZS0ZpbGxDb2xvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoZmxvYXQgY3lhbiwgZmxvYXQgbWFnZW50YSwgZmxvYXQgeWVsbG93LCBmbG9hdCBibGFjaywgZmxvYXQgYWxwaGEpIC0+IE5vbmUiKX0sCisgICAgeyJDR0NvbnRleHRTZXRDTVlLU3Ryb2tlQ29sb3IiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNldENNWUtTdHJva2VDb2xvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoZmxvYXQgY3lhbiwgZmxvYXQgbWFnZW50YSwgZmxvYXQgeWVsbG93LCBmbG9hdCBibGFjaywgZmxvYXQgYWxwaGEpIC0+IE5vbmUiKX0sCisgICAgeyJDR0NvbnRleHRHZXRJbnRlcnBvbGF0aW9uUXVhbGl0eSIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0R2V0SW50ZXJwb2xhdGlvblF1YWxpdHksIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKGludCBfcnYpIil9LAorICAgIHsiQ0dDb250ZXh0U2V0SW50ZXJwb2xhdGlvblF1YWxpdHkiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNldEludGVycG9sYXRpb25RdWFsaXR5LCAxLAorICAgICBQeURvY19TVFIoIihpbnQgcXVhbGl0eSkgLT4gTm9uZSIpfSwKKyAgICB7IkNHQ29udGV4dFNldENoYXJhY3RlclNwYWNpbmciLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNldENoYXJhY3RlclNwYWNpbmcsIDEsCisgICAgIFB5RG9jX1NUUigiKGZsb2F0IHNwYWNpbmcpIC0+IE5vbmUiKX0sCisgICAgeyJDR0NvbnRleHRTZXRUZXh0UG9zaXRpb24iLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNldFRleHRQb3NpdGlvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoZmxvYXQgeCwgZmxvYXQgeSkgLT4gTm9uZSIpfSwKKyAgICB7IkNHQ29udGV4dEdldFRleHRQb3NpdGlvbiIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0R2V0VGV4dFBvc2l0aW9uLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDR1BvaW50IF9ydikiKX0sCisgICAgeyJDR0NvbnRleHRTZXRUZXh0TWF0cml4IiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRUZXh0TWF0cml4LCAxLAorICAgICBQeURvY19TVFIoIihDR0FmZmluZVRyYW5zZm9ybSB0cmFuc2Zvcm0pIC0+IE5vbmUiKX0sCisgICAgeyJDR0NvbnRleHRHZXRUZXh0TWF0cml4IiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRHZXRUZXh0TWF0cml4LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDR0FmZmluZVRyYW5zZm9ybSBfcnYpIil9LAorICAgIHsiQ0dDb250ZXh0U2V0VGV4dERyYXdpbmdNb2RlIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRUZXh0RHJhd2luZ01vZGUsIDEsCisgICAgIFB5RG9jX1NUUigiKGludCBtb2RlKSAtPiBOb25lIil9LAorICAgIHsiQ0dDb250ZXh0U2V0Rm9udFNpemUiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNldEZvbnRTaXplLCAxLAorICAgICBQeURvY19TVFIoIihmbG9hdCBzaXplKSAtPiBOb25lIil9LAorICAgIHsiQ0dDb250ZXh0U2VsZWN0Rm9udCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2VsZWN0Rm9udCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoY2hhciAqIG5hbWUsIGZsb2F0IHNpemUsIGludCB0ZXh0RW5jb2RpbmcpIC0+IE5vbmUiKX0sCisgICAgeyJDR0NvbnRleHRTaG93VGV4dCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2hvd1RleHQsIDEsCisgICAgIFB5RG9jX1NUUigiKEJ1ZmZlciBjc3RyaW5nKSAtPiBOb25lIil9LAorICAgIHsiQ0dDb250ZXh0U2hvd1RleHRBdFBvaW50IiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTaG93VGV4dEF0UG9pbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKGZsb2F0IHgsIGZsb2F0IHksIEJ1ZmZlciBjc3RyaW5nKSAtPiBOb25lIil9LAorICAgIHsiQ0dDb250ZXh0RW5kUGFnZSIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0RW5kUGFnZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiQ0dDb250ZXh0Rmx1c2giLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dEZsdXNoLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJDR0NvbnRleHRTeW5jaHJvbml6ZSIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U3luY2hyb25pemUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkNHQ29udGV4dFNldFNob3VsZEFudGlhbGlhcyIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2V0U2hvdWxkQW50aWFsaWFzLCAxLAorICAgICBQeURvY19TVFIoIihpbnQgc2hvdWxkQW50aWFsaWFzKSAtPiBOb25lIil9LAogI2lmbmRlZiBfX0xQNjRfXwotCXsiU3luY0NHQ29udGV4dE9yaWdpbldpdGhQb3J0IiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9TeW5jQ0dDb250ZXh0T3JpZ2luV2l0aFBvcnQsIDEsCi0JIFB5RG9jX1NUUigiKENHcmFmUHRyIHBvcnQpIC0+IE5vbmUiKX0sCi0JeyJDbGlwQ0dDb250ZXh0VG9SZWdpb24iLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NsaXBDR0NvbnRleHRUb1JlZ2lvbiwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCBwb3J0UmVjdCwgUmduSGFuZGxlIHJlZ2lvbikgLT4gTm9uZSIpfSwKKyAgICB7IlN5bmNDR0NvbnRleHRPcmlnaW5XaXRoUG9ydCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfU3luY0NHQ29udGV4dE9yaWdpbldpdGhQb3J0LCAxLAorICAgICBQeURvY19TVFIoIihDR3JhZlB0ciBwb3J0KSAtPiBOb25lIil9LAorICAgIHsiQ2xpcENHQ29udGV4dFRvUmVnaW9uIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DbGlwQ0dDb250ZXh0VG9SZWdpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgcG9ydFJlY3QsIFJnbkhhbmRsZSByZWdpb24pIC0+IE5vbmUiKX0sCiAjZW5kaWYKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKICNkZWZpbmUgQ0dDb250ZXh0UmVmT2JqX2dldHNldGxpc3QgTlVMTApAQCAtMTE5OCw2MSArMTE5OCw2MSBAQAogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial90cF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlQeU9iamVjdCAqX3NlbGY7Ci0JQ0dDb250ZXh0UmVmIGl0c2VsZjsKLQljaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKKyAgICBQeU9iamVjdCAqX3NlbGY7CisgICAgQ0dDb250ZXh0UmVmIGl0c2VsZjsKKyAgICBjaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIENHQ29udGV4dFJlZk9ial9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7Ci0JaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkoKENHQ29udGV4dFJlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiBfc2VsZjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBDR0NvbnRleHRSZWZPYmpfQ29udmVydCwgJml0c2VsZikpIHJldHVybiBOVUxMOworICAgIGlmICgoX3NlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgKChDR0NvbnRleHRSZWZPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICByZXR1cm4gX3NlbGY7CiB9CiAKICNkZWZpbmUgQ0dDb250ZXh0UmVmT2JqX3RwX2ZyZWUgUHlPYmplY3RfRGVsCiAKIAogUHlUeXBlT2JqZWN0IENHQ29udGV4dFJlZl9UeXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQotCTAsIC8qb2Jfc2l6ZSovCi0JIl9DRy5DR0NvbnRleHRSZWYiLCAvKnRwX25hbWUqLwotCXNpemVvZihDR0NvbnRleHRSZWZPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCi0JMCwgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKSBDR0NvbnRleHRSZWZPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KLQkwLCAvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykgQ0dDb250ZXh0UmVmT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCi0JKHJlcHJmdW5jKSBDR0NvbnRleHRSZWZPYmpfcmVwciwgLyp0cF9yZXByKi8KLQkoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCi0JKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpIENHQ29udGV4dFJlZk9ial9oYXNoLCAvKnRwX2hhc2gqLwotCTAsIC8qdHBfY2FsbCovCi0JMCwgLyp0cF9zdHIqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KLQlQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLwotCTAsIC8qdHBfYXNfYnVmZmVyKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQkwLCAvKnRwX2RvYyovCi0JMCwgLyp0cF90cmF2ZXJzZSovCi0JMCwgLyp0cF9jbGVhciovCi0JMCwgLyp0cF9yaWNoY29tcGFyZSovCi0JMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCi0JMCwgLyp0cF9pdGVyKi8KLQkwLCAvKnRwX2l0ZXJuZXh0Ki8KLQlDR0NvbnRleHRSZWZPYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLwotCTAsIC8qdHBfbWVtYmVycyovCi0JQ0dDb250ZXh0UmVmT2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KLQkwLCAvKnRwX2Jhc2UqLwotCTAsIC8qdHBfZGljdCovCi0JMCwgLyp0cF9kZXNjcl9nZXQqLwotCTAsIC8qdHBfZGVzY3Jfc2V0Ki8KLQkwLCAvKnRwX2RpY3RvZmZzZXQqLwotCUNHQ29udGV4dFJlZk9ial90cF9pbml0LCAvKiB0cF9pbml0ICovCi0JQ0dDb250ZXh0UmVmT2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLwotCUNHQ29udGV4dFJlZk9ial90cF9uZXcsIC8qIHRwX25ldyAqLwotCUNHQ29udGV4dFJlZk9ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgLypvYl9zaXplKi8KKyAgICAiX0NHLkNHQ29udGV4dFJlZiIsIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKENHQ29udGV4dFJlZk9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpIENHQ29udGV4dFJlZk9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgIDAsIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLworICAgIChzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLworICAgIChjbXBmdW5jKSBDR0NvbnRleHRSZWZPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpIENHQ29udGV4dFJlZk9ial9yZXByLCAvKnRwX3JlcHIqLworICAgIChQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIChQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLworICAgIChoYXNoZnVuYykgQ0dDb250ZXh0UmVmT2JqX2hhc2gsIC8qdHBfaGFzaCovCisgICAgMCwgLyp0cF9jYWxsKi8KKyAgICAwLCAvKnRwX3N0ciovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLworICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCisgICAgMCwgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLworICAgIDAsIC8qdHBfZG9jKi8KKyAgICAwLCAvKnRwX3RyYXZlcnNlKi8KKyAgICAwLCAvKnRwX2NsZWFyKi8KKyAgICAwLCAvKnRwX3JpY2hjb21wYXJlKi8KKyAgICAwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KKyAgICAwLCAvKnRwX2l0ZXIqLworICAgIDAsIC8qdHBfaXRlcm5leHQqLworICAgIENHQ29udGV4dFJlZk9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCisgICAgMCwgLyp0cF9tZW1iZXJzKi8KKyAgICBDR0NvbnRleHRSZWZPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLworICAgIDAsIC8qdHBfYmFzZSovCisgICAgMCwgLyp0cF9kaWN0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX2dldCovCisgICAgMCwgLyp0cF9kZXNjcl9zZXQqLworICAgIDAsIC8qdHBfZGljdG9mZnNldCovCisgICAgQ0dDb250ZXh0UmVmT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KKyAgICBDR0NvbnRleHRSZWZPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCisgICAgQ0dDb250ZXh0UmVmT2JqX3RwX25ldywgLyogdHBfbmV3ICovCisgICAgQ0dDb250ZXh0UmVmT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLSBFbmQgb2JqZWN0IHR5cGUgQ0dDb250ZXh0UmVmIC0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMTI2MSwyOSArMTI2MSwyOSBAQAogI2lmbmRlZiBfX0xQNjRfXwogc3RhdGljIFB5T2JqZWN0ICpDR19DcmVhdGVDR0NvbnRleHRGb3JQb3J0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlHcmFmUHRyIHBvcnQ7Ci0JQ0dDb250ZXh0UmVmIGN0eDsKLQlPU1N0YXR1cyBfZXJyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBHcmFmUHRyIHBvcnQ7CisgICAgQ0dDb250ZXh0UmVmIGN0eDsKKyAgICBPU1N0YXR1cyBfZXJyOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLCBHcmFmT2JqX0NvbnZlcnQsICZwb3J0KSkKLQkgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwgR3JhZk9ial9Db252ZXJ0LCAmcG9ydCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JX2VyciA9IENyZWF0ZUNHQ29udGV4dEZvclBvcnQocG9ydCwgJmN0eCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpCi0JICAgICAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsIENHQ29udGV4dFJlZk9ial9OZXcsIGN0eCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgX2VyciA9IENyZWF0ZUNHQ29udGV4dEZvclBvcnQocG9ydCwgJmN0eCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpCisgICAgICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwgQ0dDb250ZXh0UmVmT2JqX05ldywgY3R4KTsKKyAgICByZXR1cm4gX3JlczsKIAogfQogI2VuZGlmCiAKIHN0YXRpYyBQeU1ldGhvZERlZiBDR19tZXRob2RzW10gPSB7CiAjaWZuZGVmIF9fTFA2NF9fCi0JeyJDcmVhdGVDR0NvbnRleHRGb3JQb3J0IiwgKFB5Q0Z1bmN0aW9uKUNHX0NyZWF0ZUNHQ29udGV4dEZvclBvcnQsIDEsCi0JIFB5RG9jX1NUUigiKENHcmFmUHRyKSAtPiBDR0NvbnRleHRSZWYiKX0sCisgICAgeyJDcmVhdGVDR0NvbnRleHRGb3JQb3J0IiwgKFB5Q0Z1bmN0aW9uKUNHX0NyZWF0ZUNHQ29udGV4dEZvclBvcnQsIDEsCisgICAgIFB5RG9jX1NUUigiKENHcmFmUHRyKSAtPiBDR0NvbnRleHRSZWYiKX0sCiAjZW5kaWYKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKIApAQCAtMTI5MSwyNSArMTI5MSwyNSBAQAogCiB2b2lkIGluaXRfQ0codm9pZCkKIHsKLQlQeU9iamVjdCAqbTsKLQlQeU9iamVjdCAqZDsKKyAgICBQeU9iamVjdCAqbTsKKyAgICBQeU9iamVjdCAqZDsKIAogCiAKIAotCW0gPSBQeV9Jbml0TW9kdWxlKCJfQ0ciLCBDR19tZXRob2RzKTsKLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQlDR19FcnJvciA9IFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCk7Ci0JaWYgKENHX0Vycm9yID09IE5VTEwgfHwKLQkgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVycm9yIiwgQ0dfRXJyb3IpICE9IDApCi0JCXJldHVybjsKLQlDR0NvbnRleHRSZWZfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCWlmIChQeVR5cGVfUmVhZHkoJkNHQ29udGV4dFJlZl9UeXBlKSA8IDApIHJldHVybjsKLQlQeV9JTkNSRUYoJkNHQ29udGV4dFJlZl9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkNHQ29udGV4dFJlZiIsIChQeU9iamVjdCAqKSZDR0NvbnRleHRSZWZfVHlwZSk7Ci0JLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCi0JUHlfSU5DUkVGKCZDR0NvbnRleHRSZWZfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJDR0NvbnRleHRSZWZUeXBlIiwgKFB5T2JqZWN0ICopJkNHQ29udGV4dFJlZl9UeXBlKTsKKyAgICBtID0gUHlfSW5pdE1vZHVsZSgiX0NHIiwgQ0dfbWV0aG9kcyk7CisgICAgZCA9IFB5TW9kdWxlX0dldERpY3QobSk7CisgICAgQ0dfRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOworICAgIGlmIChDR19FcnJvciA9PSBOVUxMIHx8CisgICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFcnJvciIsIENHX0Vycm9yKSAhPSAwKQorICAgICAgICByZXR1cm47CisgICAgQ0dDb250ZXh0UmVmX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZDR0NvbnRleHRSZWZfVHlwZSkgPCAwKSByZXR1cm47CisgICAgUHlfSU5DUkVGKCZDR0NvbnRleHRSZWZfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJDR0NvbnRleHRSZWYiLCAoUHlPYmplY3QgKikmQ0dDb250ZXh0UmVmX1R5cGUpOworICAgIC8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLworICAgIFB5X0lOQ1JFRigmQ0dDb250ZXh0UmVmX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ0dDb250ZXh0UmVmVHlwZSIsIChQeU9iamVjdCAqKSZDR0NvbnRleHRSZWZfVHlwZSk7CiB9CiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT0gRW5kIG1vZHVsZSBfQ0cgPT09PT09PT09PT09PT09PT09PT09PT09PSAqLwpkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvY20vX0NtbW9kdWxlLmMgYi9NYWMvTW9kdWxlcy9jbS9fQ21tb2R1bGUuYwppbmRleCAwM2EyNWRkLi5mMDdmMTIxIDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9jbS9fQ21tb2R1bGUuYworKysgYi9NYWMvTW9kdWxlcy9jbS9fQ21tb2R1bGUuYwpAQCAtOSw5ICs5LDkgQEAKIAogLyogTWFjcm8gdG8gdGVzdCB3aGV0aGVyIGEgd2Vhay1sb2FkZWQgQ0ZNIGZ1bmN0aW9uIGV4aXN0cyAqLwogI2RlZmluZSBQeU1hY19QUkVDSEVDSyhydG4pIGRvIHsgaWYgKCAmcnRuID09IE5VTEwgKSAge1wKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsIFwKLSAgICAgICAgIk5vdCBhdmFpbGFibGUgaW4gdGhpcyBzaGFyZWQgbGlicmFyeS9PUyB2ZXJzaW9uIik7IFwKLSAgICAgICAgcmV0dXJuIE5VTEw7IFwKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgXAorICAgICJOb3QgYXZhaWxhYmxlIGluIHRoaXMgc2hhcmVkIGxpYnJhcnkvT1MgdmVyc2lvbiIpOyBcCisgICAgcmV0dXJuIE5VTEw7IFwKICAgICB9fSB3aGlsZSgwKQogCiAKQEAgLTM2LDIxICszNiwyMSBAQAogQ21wRGVzY19OZXcoQ29tcG9uZW50RGVzY3JpcHRpb24gKml0c2VsZikKIHsKIAotICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyZPJk8mbGwiLAotICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBpdHNlbGYtPmNvbXBvbmVudFR5cGUsCi0gICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIGl0c2VsZi0+Y29tcG9uZW50U3ViVHlwZSwKLSAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgaXRzZWxmLT5jb21wb25lbnRNYW51ZmFjdHVyZXIsCi0gICAgICAgICAgICAgICAgaXRzZWxmLT5jb21wb25lbnRGbGFncywgaXRzZWxmLT5jb21wb25lbnRGbGFnc01hc2spOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPJk8mTyZsbCIsCisgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBpdHNlbGYtPmNvbXBvbmVudFR5cGUsCisgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBpdHNlbGYtPmNvbXBvbmVudFN1YlR5cGUsCisgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBpdHNlbGYtPmNvbXBvbmVudE1hbnVmYWN0dXJlciwKKyAgICAgICAgaXRzZWxmLT5jb21wb25lbnRGbGFncywgaXRzZWxmLT5jb21wb25lbnRGbGFnc01hc2spOwogfQogCiBzdGF0aWMgaW50CiBDbXBEZXNjX0NvbnZlcnQoUHlPYmplY3QgKnYsIENvbXBvbmVudERlc2NyaXB0aW9uICpwX2l0c2VsZikKIHsKLSAgICAgICAgcmV0dXJuIFB5QXJnX1BhcnNlVHVwbGUodiwgIk8mTyZPJmxsIiwKLSAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZwX2l0c2VsZi0+Y29tcG9uZW50VHlwZSwKLSAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZwX2l0c2VsZi0+Y29tcG9uZW50U3ViVHlwZSwKLSAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZwX2l0c2VsZi0+Y29tcG9uZW50TWFudWZhY3R1cmVyLAotICAgICAgICAgICAgICAgICZwX2l0c2VsZi0+Y29tcG9uZW50RmxhZ3MsICZwX2l0c2VsZi0+Y29tcG9uZW50RmxhZ3NNYXNrKTsKKyAgICByZXR1cm4gUHlBcmdfUGFyc2VUdXBsZSh2LCAiTyZPJk8mbGwiLAorICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZwX2l0c2VsZi0+Y29tcG9uZW50VHlwZSwKKyAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcF9pdHNlbGYtPmNvbXBvbmVudFN1YlR5cGUsCisgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnBfaXRzZWxmLT5jb21wb25lbnRNYW51ZmFjdHVyZXIsCisgICAgICAgICZwX2l0c2VsZi0+Y29tcG9uZW50RmxhZ3MsICZwX2l0c2VsZi0+Y29tcG9uZW50RmxhZ3NNYXNrKTsKIH0KIAogCkBAIC02MywxOTQgKzYzLDE5NCBAQAogI2RlZmluZSBDbXBJbnN0T2JqX0NoZWNrKHgpICgoeCktPm9iX3R5cGUgPT0gJkNvbXBvbmVudEluc3RhbmNlX1R5cGUgfHwgUHlPYmplY3RfVHlwZUNoZWNrKCh4KSwgJkNvbXBvbmVudEluc3RhbmNlX1R5cGUpKQogCiB0eXBlZGVmIHN0cnVjdCBDb21wb25lbnRJbnN0YW5jZU9iamVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCUNvbXBvbmVudEluc3RhbmNlIG9iX2l0c2VsZjsKKyAgICBQeU9iamVjdF9IRUFECisgICAgQ29tcG9uZW50SW5zdGFuY2Ugb2JfaXRzZWxmOwogfSBDb21wb25lbnRJbnN0YW5jZU9iamVjdDsKIAogUHlPYmplY3QgKkNtcEluc3RPYmpfTmV3KENvbXBvbmVudEluc3RhbmNlIGl0c2VsZikKIHsKLQlDb21wb25lbnRJbnN0YW5jZU9iamVjdCAqaXQ7Ci0JaWYgKGl0c2VsZiA9PSBOVUxMKSB7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQ21fRXJyb3IsIk5VTEwgQ29tcG9uZW50SW5zdGFuY2UiKTsKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotCSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQlpdCA9IFB5T2JqZWN0X05FVyhDb21wb25lbnRJbnN0YW5jZU9iamVjdCwgJkNvbXBvbmVudEluc3RhbmNlX1R5cGUpOwotCWlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQlpdC0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiAoUHlPYmplY3QgKilpdDsKKyAgICBDb21wb25lbnRJbnN0YW5jZU9iamVjdCAqaXQ7CisgICAgaWYgKGl0c2VsZiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQ21fRXJyb3IsIk5VTEwgQ29tcG9uZW50SW5zdGFuY2UiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICBpdCA9IFB5T2JqZWN0X05FVyhDb21wb25lbnRJbnN0YW5jZU9iamVjdCwgJkNvbXBvbmVudEluc3RhbmNlX1R5cGUpOworICAgIGlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICBpdC0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIHJldHVybiAoUHlPYmplY3QgKilpdDsKIH0KIAogaW50IENtcEluc3RPYmpfQ29udmVydChQeU9iamVjdCAqdiwgQ29tcG9uZW50SW5zdGFuY2UgKnBfaXRzZWxmKQogewotCWlmICghQ21wSW5zdE9ial9DaGVjayh2KSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJDb21wb25lbnRJbnN0YW5jZSByZXF1aXJlZCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JKnBfaXRzZWxmID0gKChDb21wb25lbnRJbnN0YW5jZU9iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0JcmV0dXJuIDE7CisgICAgaWYgKCFDbXBJbnN0T2JqX0NoZWNrKHYpKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkNvbXBvbmVudEluc3RhbmNlIHJlcXVpcmVkIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAqcF9pdHNlbGYgPSAoKENvbXBvbmVudEluc3RhbmNlT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIHZvaWQgQ21wSW5zdE9ial9kZWFsbG9jKENvbXBvbmVudEluc3RhbmNlT2JqZWN0ICpzZWxmKQogewotCS8qIENsZWFudXAgb2Ygc2VsZi0+b2JfaXRzZWxmIGdvZXMgaGVyZSAqLwotCXNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CisgICAgLyogQ2xlYW51cCBvZiBzZWxmLT5vYl9pdHNlbGYgZ29lcyBoZXJlICovCisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDbXBJbnN0T2JqX0Nsb3NlQ29tcG9uZW50KENvbXBvbmVudEluc3RhbmNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOwogI2lmbmRlZiBDbG9zZUNvbXBvbmVudAotCVB5TWFjX1BSRUNIRUNLKENsb3NlQ29tcG9uZW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhDbG9zZUNvbXBvbmVudCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENsb3NlQ29tcG9uZW50KF9zZWxmLT5vYl9pdHNlbGYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ2xvc2VDb21wb25lbnQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ21wSW5zdE9ial9HZXRDb21wb25lbnRJbnN0YW5jZUVycm9yKENvbXBvbmVudEluc3RhbmNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOwogI2lmbmRlZiBHZXRDb21wb25lbnRJbnN0YW5jZUVycm9yCi0JUHlNYWNfUFJFQ0hFQ0soR2V0Q29tcG9uZW50SW5zdGFuY2VFcnJvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0Q29tcG9uZW50SW5zdGFuY2VFcnJvcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldENvbXBvbmVudEluc3RhbmNlRXJyb3IoX3NlbGYtPm9iX2l0c2VsZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRDb21wb25lbnRJbnN0YW5jZUVycm9yKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNtcEluc3RPYmpfU2V0Q29tcG9uZW50SW5zdGFuY2VFcnJvcihDb21wb25lbnRJbnN0YW5jZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgdGhlRXJyb3I7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIHRoZUVycm9yOwogI2lmbmRlZiBTZXRDb21wb25lbnRJbnN0YW5jZUVycm9yCi0JUHlNYWNfUFJFQ0hFQ0soU2V0Q29tcG9uZW50SW5zdGFuY2VFcnJvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0Q29tcG9uZW50SW5zdGFuY2VFcnJvcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRoZUVycm9yKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0Q29tcG9uZW50SW5zdGFuY2VFcnJvcihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlRXJyb3IpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUVycm9yKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0Q29tcG9uZW50SW5zdGFuY2VFcnJvcihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlRXJyb3IpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDbXBJbnN0T2JqX0dldENvbXBvbmVudEluc3RhbmNlU3RvcmFnZShDb21wb25lbnRJbnN0YW5jZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JSGFuZGxlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgSGFuZGxlIF9ydjsKICNpZm5kZWYgR2V0Q29tcG9uZW50SW5zdGFuY2VTdG9yYWdlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0Q29tcG9uZW50SW5zdGFuY2VTdG9yYWdlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRDb21wb25lbnRJbnN0YW5jZVN0b3JhZ2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldENvbXBvbmVudEluc3RhbmNlU3RvcmFnZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldENvbXBvbmVudEluc3RhbmNlU3RvcmFnZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ21wSW5zdE9ial9TZXRDb21wb25lbnRJbnN0YW5jZVN0b3JhZ2UoQ29tcG9uZW50SW5zdGFuY2VPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUhhbmRsZSB0aGVTdG9yYWdlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBIYW5kbGUgdGhlU3RvcmFnZTsKICNpZm5kZWYgU2V0Q29tcG9uZW50SW5zdGFuY2VTdG9yYWdlCi0JUHlNYWNfUFJFQ0hFQ0soU2V0Q29tcG9uZW50SW5zdGFuY2VTdG9yYWdlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRDb21wb25lbnRJbnN0YW5jZVN0b3JhZ2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZVN0b3JhZ2UpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRDb21wb25lbnRJbnN0YW5jZVN0b3JhZ2UoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlU3RvcmFnZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVTdG9yYWdlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0Q29tcG9uZW50SW5zdGFuY2VTdG9yYWdlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZVN0b3JhZ2UpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogI2lmbmRlZiBfX0xQNjRfXwogc3RhdGljIFB5T2JqZWN0ICpDbXBJbnN0T2JqX0NvbXBvbmVudEZ1bmN0aW9uSW1wbGVtZW50ZWQoQ29tcG9uZW50SW5zdGFuY2VPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWxvbmcgX3J2OwotCXNob3J0IGZ0bk51bWJlcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgbG9uZyBfcnY7CisgICAgc2hvcnQgZnRuTnVtYmVyOwogI2lmbmRlZiBDb21wb25lbnRGdW5jdGlvbkltcGxlbWVudGVkCi0JUHlNYWNfUFJFQ0hFQ0soQ29tcG9uZW50RnVuY3Rpb25JbXBsZW1lbnRlZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ29tcG9uZW50RnVuY3Rpb25JbXBsZW1lbnRlZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZ0bk51bWJlcikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENvbXBvbmVudEZ1bmN0aW9uSW1wbGVtZW50ZWQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ0bk51bWJlcik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmdG5OdW1iZXIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDb21wb25lbnRGdW5jdGlvbkltcGxlbWVudGVkKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdG5OdW1iZXIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNtcEluc3RPYmpfR2V0Q29tcG9uZW50VmVyc2lvbihDb21wb25lbnRJbnN0YW5jZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgX3J2OwogI2lmbmRlZiBHZXRDb21wb25lbnRWZXJzaW9uCi0JUHlNYWNfUFJFQ0hFQ0soR2V0Q29tcG9uZW50VmVyc2lvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0Q29tcG9uZW50VmVyc2lvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0Q29tcG9uZW50VmVyc2lvbihfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0Q29tcG9uZW50VmVyc2lvbihfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDbXBJbnN0T2JqX0NvbXBvbmVudFNldFRhcmdldChDb21wb25lbnRJbnN0YW5jZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBfcnY7Ci0JQ29tcG9uZW50SW5zdGFuY2UgdGFyZ2V0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBsb25nIF9ydjsKKyAgICBDb21wb25lbnRJbnN0YW5jZSB0YXJnZXQ7CiAjaWZuZGVmIENvbXBvbmVudFNldFRhcmdldAotCVB5TWFjX1BSRUNIRUNLKENvbXBvbmVudFNldFRhcmdldCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ29tcG9uZW50U2V0VGFyZ2V0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdGFyZ2V0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ29tcG9uZW50U2V0VGFyZ2V0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ0YXJnZXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDb21wb25lbnRTZXRUYXJnZXQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KICNlbmRpZiAvKiAhX19MUDY0X18qLwogCiBzdGF0aWMgUHlNZXRob2REZWYgQ21wSW5zdE9ial9tZXRob2RzW10gPSB7Ci0JeyJDbG9zZUNvbXBvbmVudCIsIChQeUNGdW5jdGlvbilDbXBJbnN0T2JqX0Nsb3NlQ29tcG9uZW50LCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJHZXRDb21wb25lbnRJbnN0YW5jZUVycm9yIiwgKFB5Q0Z1bmN0aW9uKUNtcEluc3RPYmpfR2V0Q29tcG9uZW50SW5zdGFuY2VFcnJvciwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiU2V0Q29tcG9uZW50SW5zdGFuY2VFcnJvciIsIChQeUNGdW5jdGlvbilDbXBJbnN0T2JqX1NldENvbXBvbmVudEluc3RhbmNlRXJyb3IsIDEsCi0JIFB5RG9jX1NUUigiKE9TRXJyIHRoZUVycm9yKSAtPiBOb25lIil9LAotCXsiR2V0Q29tcG9uZW50SW5zdGFuY2VTdG9yYWdlIiwgKFB5Q0Z1bmN0aW9uKUNtcEluc3RPYmpfR2V0Q29tcG9uZW50SW5zdGFuY2VTdG9yYWdlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChIYW5kbGUgX3J2KSIpfSwKLQl7IlNldENvbXBvbmVudEluc3RhbmNlU3RvcmFnZSIsIChQeUNGdW5jdGlvbilDbXBJbnN0T2JqX1NldENvbXBvbmVudEluc3RhbmNlU3RvcmFnZSwgMSwKLQkgUHlEb2NfU1RSKCIoSGFuZGxlIHRoZVN0b3JhZ2UpIC0+IE5vbmUiKX0sCisgICAgeyJDbG9zZUNvbXBvbmVudCIsIChQeUNGdW5jdGlvbilDbXBJbnN0T2JqX0Nsb3NlQ29tcG9uZW50LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRDb21wb25lbnRJbnN0YW5jZUVycm9yIiwgKFB5Q0Z1bmN0aW9uKUNtcEluc3RPYmpfR2V0Q29tcG9uZW50SW5zdGFuY2VFcnJvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiU2V0Q29tcG9uZW50SW5zdGFuY2VFcnJvciIsIChQeUNGdW5jdGlvbilDbXBJbnN0T2JqX1NldENvbXBvbmVudEluc3RhbmNlRXJyb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKE9TRXJyIHRoZUVycm9yKSAtPiBOb25lIil9LAorICAgIHsiR2V0Q29tcG9uZW50SW5zdGFuY2VTdG9yYWdlIiwgKFB5Q0Z1bmN0aW9uKUNtcEluc3RPYmpfR2V0Q29tcG9uZW50SW5zdGFuY2VTdG9yYWdlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChIYW5kbGUgX3J2KSIpfSwKKyAgICB7IlNldENvbXBvbmVudEluc3RhbmNlU3RvcmFnZSIsIChQeUNGdW5jdGlvbilDbXBJbnN0T2JqX1NldENvbXBvbmVudEluc3RhbmNlU3RvcmFnZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSGFuZGxlIHRoZVN0b3JhZ2UpIC0+IE5vbmUiKX0sCiAjaWZuZGVmIF9fTFA2NF9fCi0JeyJDb21wb25lbnRGdW5jdGlvbkltcGxlbWVudGVkIiwgKFB5Q0Z1bmN0aW9uKUNtcEluc3RPYmpfQ29tcG9uZW50RnVuY3Rpb25JbXBsZW1lbnRlZCwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgZnRuTnVtYmVyKSAtPiAobG9uZyBfcnYpIil9LAotCXsiR2V0Q29tcG9uZW50VmVyc2lvbiIsIChQeUNGdW5jdGlvbilDbXBJbnN0T2JqX0dldENvbXBvbmVudFZlcnNpb24sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKGxvbmcgX3J2KSIpfSwKLQl7IkNvbXBvbmVudFNldFRhcmdldCIsIChQeUNGdW5jdGlvbilDbXBJbnN0T2JqX0NvbXBvbmVudFNldFRhcmdldCwgMSwKLQkgUHlEb2NfU1RSKCIoQ29tcG9uZW50SW5zdGFuY2UgdGFyZ2V0KSAtPiAobG9uZyBfcnYpIil9LAorICAgIHsiQ29tcG9uZW50RnVuY3Rpb25JbXBsZW1lbnRlZCIsIChQeUNGdW5jdGlvbilDbXBJbnN0T2JqX0NvbXBvbmVudEZ1bmN0aW9uSW1wbGVtZW50ZWQsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGZ0bk51bWJlcikgLT4gKGxvbmcgX3J2KSIpfSwKKyAgICB7IkdldENvbXBvbmVudFZlcnNpb24iLCAoUHlDRnVuY3Rpb24pQ21wSW5zdE9ial9HZXRDb21wb25lbnRWZXJzaW9uLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChsb25nIF9ydikiKX0sCisgICAgeyJDb21wb25lbnRTZXRUYXJnZXQiLCAoUHlDRnVuY3Rpb24pQ21wSW5zdE9ial9Db21wb25lbnRTZXRUYXJnZXQsIDEsCisgICAgIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIHRhcmdldCkgLT4gKGxvbmcgX3J2KSIpfSwKICNlbmRpZiAvKiAhX19MUDY0X18gKi8KLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKICNkZWZpbmUgQ21wSW5zdE9ial9nZXRzZXRsaXN0IE5VTEwKQEAgLTI2Nyw2MSArMjY3LDYxIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqQ21wSW5zdE9ial90cF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlQeU9iamVjdCAqX3NlbGY7Ci0JQ29tcG9uZW50SW5zdGFuY2UgaXRzZWxmOwotCWNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OworICAgIFB5T2JqZWN0ICpfc2VsZjsKKyAgICBDb21wb25lbnRJbnN0YW5jZSBpdHNlbGY7CisgICAgY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBDbXBJbnN0T2JqX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKLQlpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOwotCSgoQ29tcG9uZW50SW5zdGFuY2VPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlyZXR1cm4gX3NlbGY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgQ21wSW5zdE9ial9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAoKENvbXBvbmVudEluc3RhbmNlT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgcmV0dXJuIF9zZWxmOwogfQogCiAjZGVmaW5lIENtcEluc3RPYmpfdHBfZnJlZSBQeU9iamVjdF9EZWwKIAogCiBQeVR5cGVPYmplY3QgQ29tcG9uZW50SW5zdGFuY2VfVHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKLQkwLCAvKm9iX3NpemUqLwotCSJfQ20uQ29tcG9uZW50SW5zdGFuY2UiLCAvKnRwX25hbWUqLwotCXNpemVvZihDb21wb25lbnRJbnN0YW5jZU9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KLQkwLCAvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpIENtcEluc3RPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KLQkwLCAvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykgQ21wSW5zdE9ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYykgQ21wSW5zdE9ial9yZXByLCAvKnRwX3JlcHIqLwotCShQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KLQkoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLwotCShQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYykgQ21wSW5zdE9ial9oYXNoLCAvKnRwX2hhc2gqLwotCTAsIC8qdHBfY2FsbCovCi0JMCwgLyp0cF9zdHIqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KLQlQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLwotCTAsIC8qdHBfYXNfYnVmZmVyKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQkwLCAvKnRwX2RvYyovCi0JMCwgLyp0cF90cmF2ZXJzZSovCi0JMCwgLyp0cF9jbGVhciovCi0JMCwgLyp0cF9yaWNoY29tcGFyZSovCi0JMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCi0JMCwgLyp0cF9pdGVyKi8KLQkwLCAvKnRwX2l0ZXJuZXh0Ki8KLQlDbXBJbnN0T2JqX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KLQkwLCAvKnRwX21lbWJlcnMqLwotCUNtcEluc3RPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLwotCTAsIC8qdHBfYmFzZSovCi0JMCwgLyp0cF9kaWN0Ki8KLQkwLCAvKnRwX2Rlc2NyX2dldCovCi0JMCwgLyp0cF9kZXNjcl9zZXQqLwotCTAsIC8qdHBfZGljdG9mZnNldCovCi0JQ21wSW5zdE9ial90cF9pbml0LCAvKiB0cF9pbml0ICovCi0JQ21wSW5zdE9ial90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KLQlDbXBJbnN0T2JqX3RwX25ldywgLyogdHBfbmV3ICovCi0JQ21wSW5zdE9ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgLypvYl9zaXplKi8KKyAgICAiX0NtLkNvbXBvbmVudEluc3RhbmNlIiwgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoQ29tcG9uZW50SW5zdGFuY2VPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKSBDbXBJbnN0T2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgMCwgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCisgICAgKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCisgICAgKGNtcGZ1bmMpIENtcEluc3RPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpIENtcEluc3RPYmpfcmVwciwgLyp0cF9yZXByKi8KKyAgICAoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCisgICAgKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAoaGFzaGZ1bmMpIENtcEluc3RPYmpfaGFzaCwgLyp0cF9oYXNoKi8KKyAgICAwLCAvKnRwX2NhbGwqLworICAgIDAsIC8qdHBfc3RyKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCisgICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgMCwgLyp0cF9kb2MqLworICAgIDAsIC8qdHBfdHJhdmVyc2UqLworICAgIDAsIC8qdHBfY2xlYXIqLworICAgIDAsIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsIC8qdHBfaXRlciovCisgICAgMCwgLyp0cF9pdGVybmV4dCovCisgICAgQ21wSW5zdE9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCisgICAgMCwgLyp0cF9tZW1iZXJzKi8KKyAgICBDbXBJbnN0T2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KKyAgICAwLCAvKnRwX2Jhc2UqLworICAgIDAsIC8qdHBfZGljdCovCisgICAgMCwgLyp0cF9kZXNjcl9nZXQqLworICAgIDAsIC8qdHBfZGVzY3Jfc2V0Ki8KKyAgICAwLCAvKnRwX2RpY3RvZmZzZXQqLworICAgIENtcEluc3RPYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLworICAgIENtcEluc3RPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCisgICAgQ21wSW5zdE9ial90cF9uZXcsIC8qIHRwX25ldyAqLworICAgIENtcEluc3RPYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tIEVuZCBvYmplY3QgdHlwZSBDb21wb25lbnRJbnN0YW5jZSAtLS0tLS0tLS0tLS0tLS0tICovCkBAIC0zMzQsMzYxICszMzQsMzYxIEBACiAjZGVmaW5lIENtcE9ial9DaGVjayh4KSAoKHgpLT5vYl90eXBlID09ICZDb21wb25lbnRfVHlwZSB8fCBQeU9iamVjdF9UeXBlQ2hlY2soKHgpLCAmQ29tcG9uZW50X1R5cGUpKQogCiB0eXBlZGVmIHN0cnVjdCBDb21wb25lbnRPYmplY3QgewotCVB5T2JqZWN0X0hFQUQKLQlDb21wb25lbnQgb2JfaXRzZWxmOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBDb21wb25lbnQgb2JfaXRzZWxmOwogfSBDb21wb25lbnRPYmplY3Q7CiAKIFB5T2JqZWN0ICpDbXBPYmpfTmV3KENvbXBvbmVudCBpdHNlbGYpCiB7Ci0JQ29tcG9uZW50T2JqZWN0ICppdDsKLQlpZiAoaXRzZWxmID09IE5VTEwpIHsKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFhYWFggT3Igc2hvdWxkIHdlIHJldHVybiBOb25lPyAqLwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKENtX0Vycm9yLCJObyBzdWNoIGNvbXBvbmVudCIpOwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgfQotCWl0ID0gUHlPYmplY3RfTkVXKENvbXBvbmVudE9iamVjdCwgJkNvbXBvbmVudF9UeXBlKTsKLQlpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgQ29tcG9uZW50T2JqZWN0ICppdDsKKyAgICBpZiAoaXRzZWxmID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFhYWFggT3Igc2hvdWxkIHdlIHJldHVybiBOb25lPyAqLworICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQ21fRXJyb3IsIk5vIHN1Y2ggY29tcG9uZW50Iik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgIH0KKyAgICBpdCA9IFB5T2JqZWN0X05FVyhDb21wb25lbnRPYmplY3QsICZDb21wb25lbnRfVHlwZSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIGl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogCiBpbnQgQ21wT2JqX0NvbnZlcnQoUHlPYmplY3QgKnYsIENvbXBvbmVudCAqcF9pdHNlbGYpCiB7Ci0JaWYgKCB2ID09IFB5X05vbmUgKSB7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcF9pdHNlbGYgPSAwOwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0JICAgICAgICB9Ci0JaWYgKCFDbXBPYmpfQ2hlY2sodikpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiQ29tcG9uZW50IHJlcXVpcmVkIik7Ci0JCXJldHVybiAwOwotCX0KLQkqcF9pdHNlbGYgPSAoKENvbXBvbmVudE9iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0JcmV0dXJuIDE7CisgICAgaWYgKCB2ID09IFB5X05vbmUgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcF9pdHNlbGYgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICBpZiAoIUNtcE9ial9DaGVjayh2KSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJDb21wb25lbnQgcmVxdWlyZWQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICpwX2l0c2VsZiA9ICgoQ29tcG9uZW50T2JqZWN0ICopdiktPm9iX2l0c2VsZjsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIHZvaWQgQ21wT2JqX2RlYWxsb2MoQ29tcG9uZW50T2JqZWN0ICpzZWxmKQogewotCS8qIENsZWFudXAgb2Ygc2VsZi0+b2JfaXRzZWxmIGdvZXMgaGVyZSAqLwotCXNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CisgICAgLyogQ2xlYW51cCBvZiBzZWxmLT5vYl9pdHNlbGYgZ29lcyBoZXJlICovCisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDbXBPYmpfVW5yZWdpc3RlckNvbXBvbmVudChDb21wb25lbnRPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CiAjaWZuZGVmIFVucmVnaXN0ZXJDb21wb25lbnQKLQlQeU1hY19QUkVDSEVDSyhVbnJlZ2lzdGVyQ29tcG9uZW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhVbnJlZ2lzdGVyQ29tcG9uZW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gVW5yZWdpc3RlckNvbXBvbmVudChfc2VsZi0+b2JfaXRzZWxmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFVucmVnaXN0ZXJDb21wb25lbnQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ21wT2JqX0dldENvbXBvbmVudEluZm8oQ29tcG9uZW50T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUNvbXBvbmVudERlc2NyaXB0aW9uIGNkOwotCUhhbmRsZSBjb21wb25lbnROYW1lOwotCUhhbmRsZSBjb21wb25lbnRJbmZvOwotCUhhbmRsZSBjb21wb25lbnRJY29uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIENvbXBvbmVudERlc2NyaXB0aW9uIGNkOworICAgIEhhbmRsZSBjb21wb25lbnROYW1lOworICAgIEhhbmRsZSBjb21wb25lbnRJbmZvOworICAgIEhhbmRsZSBjb21wb25lbnRJY29uOwogI2lmbmRlZiBHZXRDb21wb25lbnRJbmZvCi0JUHlNYWNfUFJFQ0hFQ0soR2V0Q29tcG9uZW50SW5mbyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0Q29tcG9uZW50SW5mbyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmNvbXBvbmVudE5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmY29tcG9uZW50SW5mbywKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZjb21wb25lbnRJY29uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldENvbXBvbmVudEluZm8oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAmY2QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50TmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRJbmZvLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudEljb24pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDbXBEZXNjX05ldywgJmNkKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmNvbXBvbmVudE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmY29tcG9uZW50SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZjb21wb25lbnRJY29uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldENvbXBvbmVudEluZm8oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudEljb24pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDbXBEZXNjX05ldywgJmNkKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDbXBPYmpfT3BlbkNvbXBvbmVudChDb21wb25lbnRPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudEluc3RhbmNlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50SW5zdGFuY2UgX3J2OwogI2lmbmRlZiBPcGVuQ29tcG9uZW50Ci0JUHlNYWNfUFJFQ0hFQ0soT3BlbkNvbXBvbmVudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soT3BlbkNvbXBvbmVudCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gT3BlbkNvbXBvbmVudChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBPcGVuQ29tcG9uZW50KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ21wT2JqX1Jlc29sdmVDb21wb25lbnRBbGlhcyhDb21wb25lbnRPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudCBfcnY7CiAjaWZuZGVmIFJlc29sdmVDb21wb25lbnRBbGlhcwotCVB5TWFjX1BSRUNIRUNLKFJlc29sdmVDb21wb25lbnRBbGlhcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUmVzb2x2ZUNvbXBvbmVudEFsaWFzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBSZXNvbHZlQ29tcG9uZW50QWxpYXMoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDbXBPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBSZXNvbHZlQ29tcG9uZW50QWxpYXMoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDbXBPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNtcE9ial9HZXRDb21wb25lbnRQdWJsaWNJbmRTdHJpbmcoQ29tcG9uZW50T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVN0cjI1NSB0aGVTdHJpbmc7Ci0Jc2hvcnQgc3RyTGlzdElEOwotCXNob3J0IGluZGV4OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFN0cjI1NSB0aGVTdHJpbmc7CisgICAgc2hvcnQgc3RyTGlzdElEOworICAgIHNob3J0IGluZGV4OwogI2lmbmRlZiBHZXRDb21wb25lbnRQdWJsaWNJbmRTdHJpbmcKLQlQeU1hY19QUkVDSEVDSyhHZXRDb21wb25lbnRQdWJsaWNJbmRTdHJpbmcpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldENvbXBvbmVudFB1YmxpY0luZFN0cmluZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCB0aGVTdHJpbmcsCi0JICAgICAgICAgICAgICAgICAgICAgICZzdHJMaXN0SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRDb21wb25lbnRQdWJsaWNJbmRTdHJpbmcoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZVN0cmluZywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ckxpc3RJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCB0aGVTdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHJMaXN0SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRDb21wb25lbnRQdWJsaWNJbmRTdHJpbmcoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZVN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ckxpc3RJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDbXBPYmpfR2V0Q29tcG9uZW50UmVmY29uKENvbXBvbmVudE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgX3J2OwogI2lmbmRlZiBHZXRDb21wb25lbnRSZWZjb24KLQlQeU1hY19QUkVDSEVDSyhHZXRDb21wb25lbnRSZWZjb24pOworICAgIFB5TWFjX1BSRUNIRUNLKEdldENvbXBvbmVudFJlZmNvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0Q29tcG9uZW50UmVmY29uKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRDb21wb25lbnRSZWZjb24oX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ21wT2JqX1NldENvbXBvbmVudFJlZmNvbihDb21wb25lbnRPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWxvbmcgdGhlUmVmY29uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBsb25nIHRoZVJlZmNvbjsKICNpZm5kZWYgU2V0Q29tcG9uZW50UmVmY29uCi0JUHlNYWNfUFJFQ0hFQ0soU2V0Q29tcG9uZW50UmVmY29uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRDb21wb25lbnRSZWZjb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aGVSZWZjb24pKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRDb21wb25lbnRSZWZjb24oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgdGhlUmVmY29uKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVSZWZjb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRDb21wb25lbnRSZWZjb24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgdGhlUmVmY29uKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ21wT2JqX09wZW5Db21wb25lbnRSZXNGaWxlKENvbXBvbmVudE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBfcnY7CiAjaWZuZGVmIE9wZW5Db21wb25lbnRSZXNGaWxlCi0JUHlNYWNfUFJFQ0hFQ0soT3BlbkNvbXBvbmVudFJlc0ZpbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKE9wZW5Db21wb25lbnRSZXNGaWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBPcGVuQ29tcG9uZW50UmVzRmlsZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gT3BlbkNvbXBvbmVudFJlc0ZpbGUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ21wT2JqX0dldENvbXBvbmVudFJlc291cmNlKENvbXBvbmVudE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlPU1R5cGUgcmVzVHlwZTsKLQlzaG9ydCByZXNJRDsKLQlIYW5kbGUgdGhlUmVzb3VyY2U7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgT1NUeXBlIHJlc1R5cGU7CisgICAgc2hvcnQgcmVzSUQ7CisgICAgSGFuZGxlIHRoZVJlc291cmNlOwogI2lmbmRlZiBHZXRDb21wb25lbnRSZXNvdXJjZQotCVB5TWFjX1BSRUNIRUNLKEdldENvbXBvbmVudFJlc291cmNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRDb21wb25lbnRSZXNvdXJjZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZyZXNUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVzSUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0Q29tcG9uZW50UmVzb3VyY2UoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzSUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVSZXNvdXJjZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHRoZVJlc291cmNlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZyZXNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzSUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0Q29tcG9uZW50UmVzb3VyY2UoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVSZXNvdXJjZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHRoZVJlc291cmNlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDbXBPYmpfR2V0Q29tcG9uZW50SW5kU3RyaW5nKENvbXBvbmVudE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlTdHIyNTUgdGhlU3RyaW5nOwotCXNob3J0IHN0ckxpc3RJRDsKLQlzaG9ydCBpbmRleDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTdHIyNTUgdGhlU3RyaW5nOworICAgIHNob3J0IHN0ckxpc3RJRDsKKyAgICBzaG9ydCBpbmRleDsKICNpZm5kZWYgR2V0Q29tcG9uZW50SW5kU3RyaW5nCi0JUHlNYWNfUFJFQ0hFQ0soR2V0Q29tcG9uZW50SW5kU3RyaW5nKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRDb21wb25lbnRJbmRTdHJpbmcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgdGhlU3RyaW5nLAotCSAgICAgICAgICAgICAgICAgICAgICAmc3RyTGlzdElELAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0Q29tcG9uZW50SW5kU3RyaW5nKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVTdHJpbmcsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJMaXN0SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgdGhlU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RyTGlzdElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0Q29tcG9uZW50SW5kU3RyaW5nKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVTdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJMaXN0SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ21wT2JqX0NvdW50Q29tcG9uZW50SW5zdGFuY2VzKENvbXBvbmVudE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgX3J2OwogI2lmbmRlZiBDb3VudENvbXBvbmVudEluc3RhbmNlcwotCVB5TWFjX1BSRUNIRUNLKENvdW50Q29tcG9uZW50SW5zdGFuY2VzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb3VudENvbXBvbmVudEluc3RhbmNlcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ291bnRDb21wb25lbnRJbnN0YW5jZXMoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENvdW50Q29tcG9uZW50SW5zdGFuY2VzKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNtcE9ial9TZXREZWZhdWx0Q29tcG9uZW50KENvbXBvbmVudE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlzaG9ydCBmbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBzaG9ydCBmbGFnczsKICNpZm5kZWYgU2V0RGVmYXVsdENvbXBvbmVudAotCVB5TWFjX1BSRUNIRUNLKFNldERlZmF1bHRDb21wb25lbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldERlZmF1bHRDb21wb25lbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXREZWZhdWx0Q29tcG9uZW50KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0RGVmYXVsdENvbXBvbmVudChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDbXBPYmpfQ2FwdHVyZUNvbXBvbmVudChDb21wb25lbnRPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudCBfcnY7Ci0JQ29tcG9uZW50IGNhcHR1cmluZ0NvbXBvbmVudDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50IF9ydjsKKyAgICBDb21wb25lbnQgY2FwdHVyaW5nQ29tcG9uZW50OwogI2lmbmRlZiBDYXB0dXJlQ29tcG9uZW50Ci0JUHlNYWNfUFJFQ0hFQ0soQ2FwdHVyZUNvbXBvbmVudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ2FwdHVyZUNvbXBvbmVudCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcE9ial9Db252ZXJ0LCAmY2FwdHVyaW5nQ29tcG9uZW50KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ2FwdHVyZUNvbXBvbmVudChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgY2FwdHVyaW5nQ29tcG9uZW50KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENtcE9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBPYmpfQ29udmVydCwgJmNhcHR1cmluZ0NvbXBvbmVudCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENhcHR1cmVDb21wb25lbnQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcHR1cmluZ0NvbXBvbmVudCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDbXBPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNtcE9ial9VbmNhcHR1cmVDb21wb25lbnQoQ29tcG9uZW50T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOwogI2lmbmRlZiBVbmNhcHR1cmVDb21wb25lbnQKLQlQeU1hY19QUkVDSEVDSyhVbmNhcHR1cmVDb21wb25lbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKFVuY2FwdHVyZUNvbXBvbmVudCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFVuY2FwdHVyZUNvbXBvbmVudChfc2VsZi0+b2JfaXRzZWxmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFVuY2FwdHVyZUNvbXBvbmVudChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogI2lmbmRlZiBfX0xQNjRfXwogc3RhdGljIFB5T2JqZWN0ICpDbXBPYmpfR2V0Q29tcG9uZW50SWNvblN1aXRlKENvbXBvbmVudE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlIYW5kbGUgaWNvblN1aXRlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEhhbmRsZSBpY29uU3VpdGU7CiAjaWZuZGVmIEdldENvbXBvbmVudEljb25TdWl0ZQotCVB5TWFjX1BSRUNIRUNLKEdldENvbXBvbmVudEljb25TdWl0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0Q29tcG9uZW50SWNvblN1aXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0Q29tcG9uZW50SWNvblN1aXRlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaWNvblN1aXRlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgaWNvblN1aXRlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldENvbXBvbmVudEljb25TdWl0ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmljb25TdWl0ZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGljb25TdWl0ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAjZW5kaWYgLyogIV9fTFA2NF9fICovCiAKIHN0YXRpYyBQeU1ldGhvZERlZiBDbXBPYmpfbWV0aG9kc1tdID0gewotCXsiVW5yZWdpc3RlckNvbXBvbmVudCIsIChQeUNGdW5jdGlvbilDbXBPYmpfVW5yZWdpc3RlckNvbXBvbmVudCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiR2V0Q29tcG9uZW50SW5mbyIsIChQeUNGdW5jdGlvbilDbXBPYmpfR2V0Q29tcG9uZW50SW5mbywgMSwKLQkgUHlEb2NfU1RSKCIoSGFuZGxlIGNvbXBvbmVudE5hbWUsIEhhbmRsZSBjb21wb25lbnRJbmZvLCBIYW5kbGUgY29tcG9uZW50SWNvbikgLT4gKENvbXBvbmVudERlc2NyaXB0aW9uIGNkKSIpfSwKLQl7Ik9wZW5Db21wb25lbnQiLCAoUHlDRnVuY3Rpb24pQ21wT2JqX09wZW5Db21wb25lbnQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENvbXBvbmVudEluc3RhbmNlIF9ydikiKX0sCi0JeyJSZXNvbHZlQ29tcG9uZW50QWxpYXMiLCAoUHlDRnVuY3Rpb24pQ21wT2JqX1Jlc29sdmVDb21wb25lbnRBbGlhcywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ29tcG9uZW50IF9ydikiKX0sCi0JeyJHZXRDb21wb25lbnRQdWJsaWNJbmRTdHJpbmciLCAoUHlDRnVuY3Rpb24pQ21wT2JqX0dldENvbXBvbmVudFB1YmxpY0luZFN0cmluZywgMSwKLQkgUHlEb2NfU1RSKCIoU3RyMjU1IHRoZVN0cmluZywgc2hvcnQgc3RyTGlzdElELCBzaG9ydCBpbmRleCkgLT4gTm9uZSIpfSwKLQl7IkdldENvbXBvbmVudFJlZmNvbiIsIChQeUNGdW5jdGlvbilDbXBPYmpfR2V0Q29tcG9uZW50UmVmY29uLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChsb25nIF9ydikiKX0sCi0JeyJTZXRDb21wb25lbnRSZWZjb24iLCAoUHlDRnVuY3Rpb24pQ21wT2JqX1NldENvbXBvbmVudFJlZmNvbiwgMSwKLQkgUHlEb2NfU1RSKCIobG9uZyB0aGVSZWZjb24pIC0+IE5vbmUiKX0sCi0JeyJPcGVuQ29tcG9uZW50UmVzRmlsZSIsIChQeUNGdW5jdGlvbilDbXBPYmpfT3BlbkNvbXBvbmVudFJlc0ZpbGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKHNob3J0IF9ydikiKX0sCi0JeyJHZXRDb21wb25lbnRSZXNvdXJjZSIsIChQeUNGdW5jdGlvbilDbXBPYmpfR2V0Q29tcG9uZW50UmVzb3VyY2UsIDEsCi0JIFB5RG9jX1NUUigiKE9TVHlwZSByZXNUeXBlLCBzaG9ydCByZXNJRCkgLT4gKEhhbmRsZSB0aGVSZXNvdXJjZSkiKX0sCi0JeyJHZXRDb21wb25lbnRJbmRTdHJpbmciLCAoUHlDRnVuY3Rpb24pQ21wT2JqX0dldENvbXBvbmVudEluZFN0cmluZywgMSwKLQkgUHlEb2NfU1RSKCIoU3RyMjU1IHRoZVN0cmluZywgc2hvcnQgc3RyTGlzdElELCBzaG9ydCBpbmRleCkgLT4gTm9uZSIpfSwKLQl7IkNvdW50Q29tcG9uZW50SW5zdGFuY2VzIiwgKFB5Q0Z1bmN0aW9uKUNtcE9ial9Db3VudENvbXBvbmVudEluc3RhbmNlcywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAobG9uZyBfcnYpIil9LAotCXsiU2V0RGVmYXVsdENvbXBvbmVudCIsIChQeUNGdW5jdGlvbilDbXBPYmpfU2V0RGVmYXVsdENvbXBvbmVudCwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgZmxhZ3MpIC0+IE5vbmUiKX0sCi0JeyJDYXB0dXJlQ29tcG9uZW50IiwgKFB5Q0Z1bmN0aW9uKUNtcE9ial9DYXB0dXJlQ29tcG9uZW50LCAxLAotCSBQeURvY19TVFIoIihDb21wb25lbnQgY2FwdHVyaW5nQ29tcG9uZW50KSAtPiAoQ29tcG9uZW50IF9ydikiKX0sCi0JeyJVbmNhcHR1cmVDb21wb25lbnQiLCAoUHlDRnVuY3Rpb24pQ21wT2JqX1VuY2FwdHVyZUNvbXBvbmVudCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiVW5yZWdpc3RlckNvbXBvbmVudCIsIChQeUNGdW5jdGlvbilDbXBPYmpfVW5yZWdpc3RlckNvbXBvbmVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiR2V0Q29tcG9uZW50SW5mbyIsIChQeUNGdW5jdGlvbilDbXBPYmpfR2V0Q29tcG9uZW50SW5mbywgMSwKKyAgICAgUHlEb2NfU1RSKCIoSGFuZGxlIGNvbXBvbmVudE5hbWUsIEhhbmRsZSBjb21wb25lbnRJbmZvLCBIYW5kbGUgY29tcG9uZW50SWNvbikgLT4gKENvbXBvbmVudERlc2NyaXB0aW9uIGNkKSIpfSwKKyAgICB7Ik9wZW5Db21wb25lbnQiLCAoUHlDRnVuY3Rpb24pQ21wT2JqX09wZW5Db21wb25lbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENvbXBvbmVudEluc3RhbmNlIF9ydikiKX0sCisgICAgeyJSZXNvbHZlQ29tcG9uZW50QWxpYXMiLCAoUHlDRnVuY3Rpb24pQ21wT2JqX1Jlc29sdmVDb21wb25lbnRBbGlhcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ29tcG9uZW50IF9ydikiKX0sCisgICAgeyJHZXRDb21wb25lbnRQdWJsaWNJbmRTdHJpbmciLCAoUHlDRnVuY3Rpb24pQ21wT2JqX0dldENvbXBvbmVudFB1YmxpY0luZFN0cmluZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoU3RyMjU1IHRoZVN0cmluZywgc2hvcnQgc3RyTGlzdElELCBzaG9ydCBpbmRleCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldENvbXBvbmVudFJlZmNvbiIsIChQeUNGdW5jdGlvbilDbXBPYmpfR2V0Q29tcG9uZW50UmVmY29uLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChsb25nIF9ydikiKX0sCisgICAgeyJTZXRDb21wb25lbnRSZWZjb24iLCAoUHlDRnVuY3Rpb24pQ21wT2JqX1NldENvbXBvbmVudFJlZmNvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIobG9uZyB0aGVSZWZjb24pIC0+IE5vbmUiKX0sCisgICAgeyJPcGVuQ29tcG9uZW50UmVzRmlsZSIsIChQeUNGdW5jdGlvbilDbXBPYmpfT3BlbkNvbXBvbmVudFJlc0ZpbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKHNob3J0IF9ydikiKX0sCisgICAgeyJHZXRDb21wb25lbnRSZXNvdXJjZSIsIChQeUNGdW5jdGlvbilDbXBPYmpfR2V0Q29tcG9uZW50UmVzb3VyY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKE9TVHlwZSByZXNUeXBlLCBzaG9ydCByZXNJRCkgLT4gKEhhbmRsZSB0aGVSZXNvdXJjZSkiKX0sCisgICAgeyJHZXRDb21wb25lbnRJbmRTdHJpbmciLCAoUHlDRnVuY3Rpb24pQ21wT2JqX0dldENvbXBvbmVudEluZFN0cmluZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoU3RyMjU1IHRoZVN0cmluZywgc2hvcnQgc3RyTGlzdElELCBzaG9ydCBpbmRleCkgLT4gTm9uZSIpfSwKKyAgICB7IkNvdW50Q29tcG9uZW50SW5zdGFuY2VzIiwgKFB5Q0Z1bmN0aW9uKUNtcE9ial9Db3VudENvbXBvbmVudEluc3RhbmNlcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAobG9uZyBfcnYpIil9LAorICAgIHsiU2V0RGVmYXVsdENvbXBvbmVudCIsIChQeUNGdW5jdGlvbilDbXBPYmpfU2V0RGVmYXVsdENvbXBvbmVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgZmxhZ3MpIC0+IE5vbmUiKX0sCisgICAgeyJDYXB0dXJlQ29tcG9uZW50IiwgKFB5Q0Z1bmN0aW9uKUNtcE9ial9DYXB0dXJlQ29tcG9uZW50LCAxLAorICAgICBQeURvY19TVFIoIihDb21wb25lbnQgY2FwdHVyaW5nQ29tcG9uZW50KSAtPiAoQ29tcG9uZW50IF9ydikiKX0sCisgICAgeyJVbmNhcHR1cmVDb21wb25lbnQiLCAoUHlDRnVuY3Rpb24pQ21wT2JqX1VuY2FwdHVyZUNvbXBvbmVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAogI2lmbmRlZiBfX0xQNjRfXwotCXsiR2V0Q29tcG9uZW50SWNvblN1aXRlIiwgKFB5Q0Z1bmN0aW9uKUNtcE9ial9HZXRDb21wb25lbnRJY29uU3VpdGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEhhbmRsZSBpY29uU3VpdGUpIil9LAorICAgIHsiR2V0Q29tcG9uZW50SWNvblN1aXRlIiwgKFB5Q0Z1bmN0aW9uKUNtcE9ial9HZXRDb21wb25lbnRJY29uU3VpdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEhhbmRsZSBpY29uU3VpdGUpIil9LAogI2VuZGlmIC8qICFfX0xQNjRfXyAqLwotCXtOVUxMLCBOVUxMLCAwfQorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogI2RlZmluZSBDbXBPYmpfZ2V0c2V0bGlzdCBOVUxMCkBAIC03MDUsNjEgKzcwNSw2MSBAQAogCiBzdGF0aWMgUHlPYmplY3QgKkNtcE9ial90cF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlQeU9iamVjdCAqX3NlbGY7Ci0JQ29tcG9uZW50IGl0c2VsZjsKLQljaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKKyAgICBQeU9iamVjdCAqX3NlbGY7CisgICAgQ29tcG9uZW50IGl0c2VsZjsKKyAgICBjaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIENtcE9ial9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7Ci0JaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkoKENvbXBvbmVudE9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiBfc2VsZjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBDbXBPYmpfQ29udmVydCwgJml0c2VsZikpIHJldHVybiBOVUxMOworICAgIGlmICgoX3NlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgKChDb21wb25lbnRPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICByZXR1cm4gX3NlbGY7CiB9CiAKICNkZWZpbmUgQ21wT2JqX3RwX2ZyZWUgUHlPYmplY3RfRGVsCiAKIAogUHlUeXBlT2JqZWN0IENvbXBvbmVudF9UeXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQotCTAsIC8qb2Jfc2l6ZSovCi0JIl9DbS5Db21wb25lbnQiLCAvKnRwX25hbWUqLwotCXNpemVvZihDb21wb25lbnRPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCi0JMCwgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKSBDbXBPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KLQkwLCAvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykgQ21wT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCi0JKHJlcHJmdW5jKSBDbXBPYmpfcmVwciwgLyp0cF9yZXByKi8KLQkoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCi0JKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpIENtcE9ial9oYXNoLCAvKnRwX2hhc2gqLwotCTAsIC8qdHBfY2FsbCovCi0JMCwgLyp0cF9zdHIqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KLQlQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLwotCTAsIC8qdHBfYXNfYnVmZmVyKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQkwLCAvKnRwX2RvYyovCi0JMCwgLyp0cF90cmF2ZXJzZSovCi0JMCwgLyp0cF9jbGVhciovCi0JMCwgLyp0cF9yaWNoY29tcGFyZSovCi0JMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCi0JMCwgLyp0cF9pdGVyKi8KLQkwLCAvKnRwX2l0ZXJuZXh0Ki8KLQlDbXBPYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLwotCTAsIC8qdHBfbWVtYmVycyovCi0JQ21wT2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KLQkwLCAvKnRwX2Jhc2UqLwotCTAsIC8qdHBfZGljdCovCi0JMCwgLyp0cF9kZXNjcl9nZXQqLwotCTAsIC8qdHBfZGVzY3Jfc2V0Ki8KLQkwLCAvKnRwX2RpY3RvZmZzZXQqLwotCUNtcE9ial90cF9pbml0LCAvKiB0cF9pbml0ICovCi0JQ21wT2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLwotCUNtcE9ial90cF9uZXcsIC8qIHRwX25ldyAqLwotCUNtcE9ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgLypvYl9zaXplKi8KKyAgICAiX0NtLkNvbXBvbmVudCIsIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKENvbXBvbmVudE9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpIENtcE9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgIDAsIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLworICAgIChzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLworICAgIChjbXBmdW5jKSBDbXBPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpIENtcE9ial9yZXByLCAvKnRwX3JlcHIqLworICAgIChQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIChQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLworICAgIChoYXNoZnVuYykgQ21wT2JqX2hhc2gsIC8qdHBfaGFzaCovCisgICAgMCwgLyp0cF9jYWxsKi8KKyAgICAwLCAvKnRwX3N0ciovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLworICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCisgICAgMCwgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLworICAgIDAsIC8qdHBfZG9jKi8KKyAgICAwLCAvKnRwX3RyYXZlcnNlKi8KKyAgICAwLCAvKnRwX2NsZWFyKi8KKyAgICAwLCAvKnRwX3JpY2hjb21wYXJlKi8KKyAgICAwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KKyAgICAwLCAvKnRwX2l0ZXIqLworICAgIDAsIC8qdHBfaXRlcm5leHQqLworICAgIENtcE9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCisgICAgMCwgLyp0cF9tZW1iZXJzKi8KKyAgICBDbXBPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLworICAgIDAsIC8qdHBfYmFzZSovCisgICAgMCwgLyp0cF9kaWN0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX2dldCovCisgICAgMCwgLyp0cF9kZXNjcl9zZXQqLworICAgIDAsIC8qdHBfZGljdG9mZnNldCovCisgICAgQ21wT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KKyAgICBDbXBPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCisgICAgQ21wT2JqX3RwX25ldywgLyogdHBfbmV3ICovCisgICAgQ21wT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0gRW5kIG9iamVjdCB0eXBlIENvbXBvbmVudCAtLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtNzY3LDE1MCArNzY3LDE1MCBAQAogCiBzdGF0aWMgUHlPYmplY3QgKkNtX1JlZ2lzdGVyQ29tcG9uZW50UmVzb3VyY2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudCBfcnY7Ci0JQ29tcG9uZW50UmVzb3VyY2VIYW5kbGUgY3I7Ci0Jc2hvcnQgZ2xvYmFsOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnQgX3J2OworICAgIENvbXBvbmVudFJlc291cmNlSGFuZGxlIGNyOworICAgIHNob3J0IGdsb2JhbDsKICNpZm5kZWYgUmVnaXN0ZXJDb21wb25lbnRSZXNvdXJjZQotCVB5TWFjX1BSRUNIRUNLKFJlZ2lzdGVyQ29tcG9uZW50UmVzb3VyY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKFJlZ2lzdGVyQ29tcG9uZW50UmVzb3VyY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZjciwKLQkgICAgICAgICAgICAgICAgICAgICAgJmdsb2JhbCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFJlZ2lzdGVyQ29tcG9uZW50UmVzb3VyY2UoY3IsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWwpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ21wT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmNyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xvYmFsKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gUmVnaXN0ZXJDb21wb25lbnRSZXNvdXJjZShjciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDbXBPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNtX0ZpbmROZXh0Q29tcG9uZW50KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnQgX3J2OwotCUNvbXBvbmVudCBhQ29tcG9uZW50OwotCUNvbXBvbmVudERlc2NyaXB0aW9uIGxvb2tpbmc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudCBfcnY7CisgICAgQ29tcG9uZW50IGFDb21wb25lbnQ7CisgICAgQ29tcG9uZW50RGVzY3JpcHRpb24gbG9va2luZzsKICNpZm5kZWYgRmluZE5leHRDb21wb25lbnQKLQlQeU1hY19QUkVDSEVDSyhGaW5kTmV4dENvbXBvbmVudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRmluZE5leHRDb21wb25lbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcE9ial9Db252ZXJ0LCAmYUNvbXBvbmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wRGVzY19Db252ZXJ0LCAmbG9va2luZykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEZpbmROZXh0Q29tcG9uZW50KGFDb21wb25lbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgJmxvb2tpbmcpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ21wT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wT2JqX0NvbnZlcnQsICZhQ29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBEZXNjX0NvbnZlcnQsICZsb29raW5nKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRmluZE5leHRDb21wb25lbnQoYUNvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbG9va2luZyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDbXBPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNtX0NvdW50Q29tcG9uZW50cyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBfcnY7Ci0JQ29tcG9uZW50RGVzY3JpcHRpb24gbG9va2luZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgbG9uZyBfcnY7CisgICAgQ29tcG9uZW50RGVzY3JpcHRpb24gbG9va2luZzsKICNpZm5kZWYgQ291bnRDb21wb25lbnRzCi0JUHlNYWNfUFJFQ0hFQ0soQ291bnRDb21wb25lbnRzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb3VudENvbXBvbmVudHMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBEZXNjX0NvbnZlcnQsICZsb29raW5nKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ291bnRDb21wb25lbnRzKCZsb29raW5nKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcERlc2NfQ29udmVydCwgJmxvb2tpbmcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDb3VudENvbXBvbmVudHMoJmxvb2tpbmcpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNtX0dldENvbXBvbmVudExpc3RNb2RTZWVkKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgbG9uZyBfcnY7CiAjaWZuZGVmIEdldENvbXBvbmVudExpc3RNb2RTZWVkCi0JUHlNYWNfUFJFQ0hFQ0soR2V0Q29tcG9uZW50TGlzdE1vZFNlZWQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldENvbXBvbmVudExpc3RNb2RTZWVkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRDb21wb25lbnRMaXN0TW9kU2VlZCgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRDb21wb25lbnRMaXN0TW9kU2VlZCgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNtX0Nsb3NlQ29tcG9uZW50UmVzRmlsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlzaG9ydCByZWZudW07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgc2hvcnQgcmVmbnVtOwogI2lmbmRlZiBDbG9zZUNvbXBvbmVudFJlc0ZpbGUKLQlQeU1hY19QUkVDSEVDSyhDbG9zZUNvbXBvbmVudFJlc0ZpbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKENsb3NlQ29tcG9uZW50UmVzRmlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJlZm51bSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDbG9zZUNvbXBvbmVudFJlc0ZpbGUocmVmbnVtKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZm51bSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDbG9zZUNvbXBvbmVudFJlc0ZpbGUocmVmbnVtKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDbV9PcGVuRGVmYXVsdENvbXBvbmVudChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50SW5zdGFuY2UgX3J2OwotCU9TVHlwZSBjb21wb25lbnRUeXBlOwotCU9TVHlwZSBjb21wb25lbnRTdWJUeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRJbnN0YW5jZSBfcnY7CisgICAgT1NUeXBlIGNvbXBvbmVudFR5cGU7CisgICAgT1NUeXBlIGNvbXBvbmVudFN1YlR5cGU7CiAjaWZuZGVmIE9wZW5EZWZhdWx0Q29tcG9uZW50Ci0JUHlNYWNfUFJFQ0hFQ0soT3BlbkRlZmF1bHRDb21wb25lbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKE9wZW5EZWZhdWx0Q29tcG9uZW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjb21wb25lbnRUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjb21wb25lbnRTdWJUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gT3BlbkRlZmF1bHRDb21wb25lbnQoY29tcG9uZW50VHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRTdWJUeXBlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjb21wb25lbnRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjb21wb25lbnRTdWJUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gT3BlbkRlZmF1bHRDb21wb25lbnQoY29tcG9uZW50VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRTdWJUeXBlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNtX1JlZ2lzdGVyQ29tcG9uZW50UmVzb3VyY2VGaWxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIF9ydjsKLQlzaG9ydCByZXNSZWZOdW07Ci0Jc2hvcnQgZ2xvYmFsOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBsb25nIF9ydjsKKyAgICBzaG9ydCByZXNSZWZOdW07CisgICAgc2hvcnQgZ2xvYmFsOwogI2lmbmRlZiBSZWdpc3RlckNvbXBvbmVudFJlc291cmNlRmlsZQotCVB5TWFjX1BSRUNIRUNLKFJlZ2lzdGVyQ29tcG9uZW50UmVzb3VyY2VGaWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhSZWdpc3RlckNvbXBvbmVudFJlc291cmNlRmlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZXNSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICZnbG9iYWwpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBSZWdpc3RlckNvbXBvbmVudFJlc291cmNlRmlsZShyZXNSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXNSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG9iYWwpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBSZWdpc3RlckNvbXBvbmVudFJlc291cmNlRmlsZShyZXNSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIENtX21ldGhvZHNbXSA9IHsKLQl7IlJlZ2lzdGVyQ29tcG9uZW50UmVzb3VyY2UiLCAoUHlDRnVuY3Rpb24pQ21fUmVnaXN0ZXJDb21wb25lbnRSZXNvdXJjZSwgMSwKLQkgUHlEb2NfU1RSKCIoQ29tcG9uZW50UmVzb3VyY2VIYW5kbGUgY3IsIHNob3J0IGdsb2JhbCkgLT4gKENvbXBvbmVudCBfcnYpIil9LAotCXsiRmluZE5leHRDb21wb25lbnQiLCAoUHlDRnVuY3Rpb24pQ21fRmluZE5leHRDb21wb25lbnQsIDEsCi0JIFB5RG9jX1NUUigiKENvbXBvbmVudCBhQ29tcG9uZW50LCBDb21wb25lbnREZXNjcmlwdGlvbiBsb29raW5nKSAtPiAoQ29tcG9uZW50IF9ydikiKX0sCi0JeyJDb3VudENvbXBvbmVudHMiLCAoUHlDRnVuY3Rpb24pQ21fQ291bnRDb21wb25lbnRzLCAxLAotCSBQeURvY19TVFIoIihDb21wb25lbnREZXNjcmlwdGlvbiBsb29raW5nKSAtPiAobG9uZyBfcnYpIil9LAotCXsiR2V0Q29tcG9uZW50TGlzdE1vZFNlZWQiLCAoUHlDRnVuY3Rpb24pQ21fR2V0Q29tcG9uZW50TGlzdE1vZFNlZWQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKGxvbmcgX3J2KSIpfSwKLQl7IkNsb3NlQ29tcG9uZW50UmVzRmlsZSIsIChQeUNGdW5jdGlvbilDbV9DbG9zZUNvbXBvbmVudFJlc0ZpbGUsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHJlZm51bSkgLT4gTm9uZSIpfSwKLQl7Ik9wZW5EZWZhdWx0Q29tcG9uZW50IiwgKFB5Q0Z1bmN0aW9uKUNtX09wZW5EZWZhdWx0Q29tcG9uZW50LCAxLAotCSBQeURvY19TVFIoIihPU1R5cGUgY29tcG9uZW50VHlwZSwgT1NUeXBlIGNvbXBvbmVudFN1YlR5cGUpIC0+IChDb21wb25lbnRJbnN0YW5jZSBfcnYpIil9LAotCXsiUmVnaXN0ZXJDb21wb25lbnRSZXNvdXJjZUZpbGUiLCAoUHlDRnVuY3Rpb24pQ21fUmVnaXN0ZXJDb21wb25lbnRSZXNvdXJjZUZpbGUsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHJlc1JlZk51bSwgc2hvcnQgZ2xvYmFsKSAtPiAobG9uZyBfcnYpIil9LAotCXtOVUxMLCBOVUxMLCAwfQorICAgIHsiUmVnaXN0ZXJDb21wb25lbnRSZXNvdXJjZSIsIChQeUNGdW5jdGlvbilDbV9SZWdpc3RlckNvbXBvbmVudFJlc291cmNlLCAxLAorICAgICBQeURvY19TVFIoIihDb21wb25lbnRSZXNvdXJjZUhhbmRsZSBjciwgc2hvcnQgZ2xvYmFsKSAtPiAoQ29tcG9uZW50IF9ydikiKX0sCisgICAgeyJGaW5kTmV4dENvbXBvbmVudCIsIChQeUNGdW5jdGlvbilDbV9GaW5kTmV4dENvbXBvbmVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ29tcG9uZW50IGFDb21wb25lbnQsIENvbXBvbmVudERlc2NyaXB0aW9uIGxvb2tpbmcpIC0+IChDb21wb25lbnQgX3J2KSIpfSwKKyAgICB7IkNvdW50Q29tcG9uZW50cyIsIChQeUNGdW5jdGlvbilDbV9Db3VudENvbXBvbmVudHMsIDEsCisgICAgIFB5RG9jX1NUUigiKENvbXBvbmVudERlc2NyaXB0aW9uIGxvb2tpbmcpIC0+IChsb25nIF9ydikiKX0sCisgICAgeyJHZXRDb21wb25lbnRMaXN0TW9kU2VlZCIsIChQeUNGdW5jdGlvbilDbV9HZXRDb21wb25lbnRMaXN0TW9kU2VlZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAobG9uZyBfcnYpIil9LAorICAgIHsiQ2xvc2VDb21wb25lbnRSZXNGaWxlIiwgKFB5Q0Z1bmN0aW9uKUNtX0Nsb3NlQ29tcG9uZW50UmVzRmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgcmVmbnVtKSAtPiBOb25lIil9LAorICAgIHsiT3BlbkRlZmF1bHRDb21wb25lbnQiLCAoUHlDRnVuY3Rpb24pQ21fT3BlbkRlZmF1bHRDb21wb25lbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKE9TVHlwZSBjb21wb25lbnRUeXBlLCBPU1R5cGUgY29tcG9uZW50U3ViVHlwZSkgLT4gKENvbXBvbmVudEluc3RhbmNlIF9ydikiKX0sCisgICAgeyJSZWdpc3RlckNvbXBvbmVudFJlc291cmNlRmlsZSIsIChQeUNGdW5jdGlvbilDbV9SZWdpc3RlckNvbXBvbmVudFJlc291cmNlRmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgcmVzUmVmTnVtLCBzaG9ydCBnbG9iYWwpIC0+IChsb25nIF9ydikiKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAKQEAgLTkxOCwzNyArOTE4LDM3IEBACiAKIHZvaWQgaW5pdF9DbSh2b2lkKQogewotCVB5T2JqZWN0ICptOwotCVB5T2JqZWN0ICpkOworICAgIFB5T2JqZWN0ICptOworICAgIFB5T2JqZWN0ICpkOwogCiAKIAotCSAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoQ29tcG9uZW50LCBDbXBPYmpfTmV3KTsKLQkgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChDb21wb25lbnQsIENtcE9ial9Db252ZXJ0KTsKLQkgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKENvbXBvbmVudEluc3RhbmNlLCBDbXBJbnN0T2JqX05ldyk7Ci0JICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoQ29tcG9uZW50SW5zdGFuY2UsIENtcEluc3RPYmpfQ29udmVydCk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKENvbXBvbmVudCwgQ21wT2JqX05ldyk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChDb21wb25lbnQsIENtcE9ial9Db252ZXJ0KTsKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoQ29tcG9uZW50SW5zdGFuY2UsIENtcEluc3RPYmpfTmV3KTsKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKENvbXBvbmVudEluc3RhbmNlLCBDbXBJbnN0T2JqX0NvbnZlcnQpOwogCiAKLQltID0gUHlfSW5pdE1vZHVsZSgiX0NtIiwgQ21fbWV0aG9kcyk7Ci0JZCA9IFB5TW9kdWxlX0dldERpY3QobSk7Ci0JQ21fRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOwotCWlmIChDbV9FcnJvciA9PSBOVUxMIHx8Ci0JICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFcnJvciIsIENtX0Vycm9yKSAhPSAwKQotCQlyZXR1cm47Ci0JQ29tcG9uZW50SW5zdGFuY2VfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCWlmIChQeVR5cGVfUmVhZHkoJkNvbXBvbmVudEluc3RhbmNlX1R5cGUpIDwgMCkgcmV0dXJuOwotCVB5X0lOQ1JFRigmQ29tcG9uZW50SW5zdGFuY2VfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJDb21wb25lbnRJbnN0YW5jZSIsIChQeU9iamVjdCAqKSZDb21wb25lbnRJbnN0YW5jZV9UeXBlKTsKLQkvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KLQlQeV9JTkNSRUYoJkNvbXBvbmVudEluc3RhbmNlX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ29tcG9uZW50SW5zdGFuY2VUeXBlIiwgKFB5T2JqZWN0ICopJkNvbXBvbmVudEluc3RhbmNlX1R5cGUpOwotCUNvbXBvbmVudF9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmQ29tcG9uZW50X1R5cGUpIDwgMCkgcmV0dXJuOwotCVB5X0lOQ1JFRigmQ29tcG9uZW50X1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ29tcG9uZW50IiwgKFB5T2JqZWN0ICopJkNvbXBvbmVudF9UeXBlKTsKLQkvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KLQlQeV9JTkNSRUYoJkNvbXBvbmVudF9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkNvbXBvbmVudFR5cGUiLCAoUHlPYmplY3QgKikmQ29tcG9uZW50X1R5cGUpOworICAgIG0gPSBQeV9Jbml0TW9kdWxlKCJfQ20iLCBDbV9tZXRob2RzKTsKKyAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICBDbV9FcnJvciA9IFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCk7CisgICAgaWYgKENtX0Vycm9yID09IE5VTEwgfHwKKyAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVycm9yIiwgQ21fRXJyb3IpICE9IDApCisgICAgICAgIHJldHVybjsKKyAgICBDb21wb25lbnRJbnN0YW5jZV9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmQ29tcG9uZW50SW5zdGFuY2VfVHlwZSkgPCAwKSByZXR1cm47CisgICAgUHlfSU5DUkVGKCZDb21wb25lbnRJbnN0YW5jZV9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkNvbXBvbmVudEluc3RhbmNlIiwgKFB5T2JqZWN0ICopJkNvbXBvbmVudEluc3RhbmNlX1R5cGUpOworICAgIC8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLworICAgIFB5X0lOQ1JFRigmQ29tcG9uZW50SW5zdGFuY2VfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJDb21wb25lbnRJbnN0YW5jZVR5cGUiLCAoUHlPYmplY3QgKikmQ29tcG9uZW50SW5zdGFuY2VfVHlwZSk7CisgICAgQ29tcG9uZW50X1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZDb21wb25lbnRfVHlwZSkgPCAwKSByZXR1cm47CisgICAgUHlfSU5DUkVGKCZDb21wb25lbnRfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJDb21wb25lbnQiLCAoUHlPYmplY3QgKikmQ29tcG9uZW50X1R5cGUpOworICAgIC8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLworICAgIFB5X0lOQ1JFRigmQ29tcG9uZW50X1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ29tcG9uZW50VHlwZSIsIChQeU9iamVjdCAqKSZDb21wb25lbnRfVHlwZSk7CiB9CiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT0gRW5kIG1vZHVsZSBfQ20gPT09PT09PT09PT09PT09PT09PT09PT09PSAqLwpkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvY3RsL19DdGxtb2R1bGUuYyBiL01hYy9Nb2R1bGVzL2N0bC9fQ3RsbW9kdWxlLmMKaW5kZXggZDdkNGQwYS4uMjJlMGJkNSAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvY3RsL19DdGxtb2R1bGUuYworKysgYi9NYWMvTW9kdWxlcy9jdGwvX0N0bG1vZHVsZS5jCkBAIC0xMCw5ICsxMCw5IEBACiAKIC8qIE1hY3JvIHRvIHRlc3Qgd2hldGhlciBhIHdlYWstbG9hZGVkIENGTSBmdW5jdGlvbiBleGlzdHMgKi8KICNkZWZpbmUgUHlNYWNfUFJFQ0hFQ0socnRuKSBkbyB7IGlmICggJnJ0biA9PSBOVUxMICkgIHtcCi0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yLCBcCi0gICAgICAgICJOb3QgYXZhaWxhYmxlIGluIHRoaXMgc2hhcmVkIGxpYnJhcnkvT1MgdmVyc2lvbiIpOyBcCi0gICAgICAgIHJldHVybiBOVUxMOyBcCisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsIFwKKyAgICAiTm90IGF2YWlsYWJsZSBpbiB0aGlzIHNoYXJlZCBsaWJyYXJ5L09TIHZlcnNpb24iKTsgXAorICAgIHJldHVybiBOVUxMOyBcCiAgICAgfX0gd2hpbGUoMCkKIAogCkBAIC00MSwxOSArNDEsMTkgQEAKIENvbnRyb2xGb250U3R5bGVfTmV3KENvbnRyb2xGb250U3R5bGVSZWMgKml0c2VsZikKIHsKIAotICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaGhoaGhoTyZPJiIsIGl0c2VsZi0+ZmxhZ3MsIGl0c2VsZi0+Zm9udCwKLSAgICAgICAgICAgICAgICBpdHNlbGYtPnNpemUsIGl0c2VsZi0+c3R5bGUsIGl0c2VsZi0+bW9kZSwgaXRzZWxmLT5qdXN0LAotICAgICAgICAgICAgICAgIFFkUkdCX05ldywgJml0c2VsZi0+Zm9yZUNvbG9yLCBRZFJHQl9OZXcsICZpdHNlbGYtPmJhY2tDb2xvcik7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImhoaGhoaE8mTyYiLCBpdHNlbGYtPmZsYWdzLCBpdHNlbGYtPmZvbnQsCisgICAgICAgIGl0c2VsZi0+c2l6ZSwgaXRzZWxmLT5zdHlsZSwgaXRzZWxmLT5tb2RlLCBpdHNlbGYtPmp1c3QsCisgICAgICAgIFFkUkdCX05ldywgJml0c2VsZi0+Zm9yZUNvbG9yLCBRZFJHQl9OZXcsICZpdHNlbGYtPmJhY2tDb2xvcik7CiB9CiAjZW5kaWYKIAogc3RhdGljIGludAogQ29udHJvbEZvbnRTdHlsZV9Db252ZXJ0KFB5T2JqZWN0ICp2LCBDb250cm9sRm9udFN0eWxlUmVjICppdHNlbGYpCiB7Ci0gICAgICAgIHJldHVybiBQeUFyZ19QYXJzZSh2LCAiKGhoaGhoaE8mTyYpIiwgJml0c2VsZi0+ZmxhZ3MsCi0gICAgICAgICAgICAgICAgJml0c2VsZi0+Zm9udCwgJml0c2VsZi0+c2l6ZSwgJml0c2VsZi0+c3R5bGUsICZpdHNlbGYtPm1vZGUsCi0gICAgICAgICAgICAgICAgJml0c2VsZi0+anVzdCwgUWRSR0JfQ29udmVydCwgJml0c2VsZi0+Zm9yZUNvbG9yLAotICAgICAgICAgICAgICAgIFFkUkdCX0NvbnZlcnQsICZpdHNlbGYtPmJhY2tDb2xvcik7CisgICAgcmV0dXJuIFB5QXJnX1BhcnNlKHYsICIoaGhoaGhoTyZPJikiLCAmaXRzZWxmLT5mbGFncywKKyAgICAgICAgJml0c2VsZi0+Zm9udCwgJml0c2VsZi0+c2l6ZSwgJml0c2VsZi0+c3R5bGUsICZpdHNlbGYtPm1vZGUsCisgICAgICAgICZpdHNlbGYtPmp1c3QsIFFkUkdCX0NvbnZlcnQsICZpdHNlbGYtPmZvcmVDb2xvciwKKyAgICAgICAgUWRSR0JfQ29udmVydCwgJml0c2VsZi0+YmFja0NvbG9yKTsKIH0KIAogLyoKQEAgLTYzLDEzICs2MywxMyBAQAogUHlDb250cm9sSURfTmV3KENvbnRyb2xJRCAqaXRzZWxmKQogewogCi0gICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPJmwiLCBQeU1hY19CdWlsZE9TVHlwZSwgaXRzZWxmLT5zaWduYXR1cmUsIGl0c2VsZi0+aWQpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPJmwiLCBQeU1hY19CdWlsZE9TVHlwZSwgaXRzZWxmLT5zaWduYXR1cmUsIGl0c2VsZi0+aWQpOwogfQogCiBzdGF0aWMgaW50CiBQeUNvbnRyb2xJRF9Db252ZXJ0KFB5T2JqZWN0ICp2LCBDb250cm9sSUQgKml0c2VsZikKIHsKLSAgICAgICAgcmV0dXJuIFB5QXJnX1BhcnNlKHYsICIoTyZsKSIsIFB5TWFjX0dldE9TVHlwZSwgJml0c2VsZi0+c2lnbmF0dXJlLCAmaXRzZWxmLT5pZCk7CisgICAgcmV0dXJuIFB5QXJnX1BhcnNlKHYsICIoTyZsKSIsIFB5TWFjX0dldE9TVHlwZSwgJml0c2VsZi0+c2lnbmF0dXJlLCAmaXRzZWxmLT5pZCk7CiB9CiAKIC8qCkBAIC03OCw0MCArNzgsNDAgQEAKIHN0YXRpYyBpbnQKIERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uRGVzY19Db252ZXJ0KFB5T2JqZWN0ICp2LCBEYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtbkRlc2MgKml0c2VsZikKIHsKLSAgICAgICAgcmV0dXJuIFB5QXJnX1BhcnNlKHYsICIobE8mbCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgJml0c2VsZi0+cHJvcGVydHlJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJml0c2VsZi0+cHJvcGVydHlUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgJml0c2VsZi0+cHJvcGVydHlGbGFncyk7CisgICAgcmV0dXJuIFB5QXJnX1BhcnNlKHYsICIobE8mbCkiLAorICAgICAgICAgICAgICAgICAgICAgICAmaXRzZWxmLT5wcm9wZXJ0eUlELAorICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpdHNlbGYtPnByb3BlcnR5VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgJml0c2VsZi0+cHJvcGVydHlGbGFncyk7CiB9CiAKIHN0YXRpYyBpbnQKIENvbnRyb2xCdXR0b25Db250ZW50SW5mb19Db252ZXJ0KFB5T2JqZWN0ICp2LCBDb250cm9sQnV0dG9uQ29udGVudEluZm8gKml0c2VsZikKIHsKLSAgICAgICAgcmV0dXJuIFB5QXJnX1BhcnNlKHYsICIoaE8mKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRzZWxmLT5jb250ZW50VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdFJlc09ial9Db252ZXJ0LCAmaXRzZWxmLT51Lmljb25TdWl0ZSk7CisgICAgcmV0dXJuIFB5QXJnX1BhcnNlKHYsICIoaE8mKSIsCisgICAgICAgICAgICAgICAgICAgICAgICZpdHNlbGYtPmNvbnRlbnRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfQ29udmVydCwgJml0c2VsZi0+dS5pY29uU3VpdGUpOwogfQogCiBzdGF0aWMgaW50CiBEYXRhQnJvd3Nlckxpc3RWaWV3SGVhZGVyRGVzY19Db252ZXJ0KFB5T2JqZWN0ICp2LCBEYXRhQnJvd3Nlckxpc3RWaWV3SGVhZGVyRGVzYyAqaXRzZWxmKQogewotICAgICAgICBpdHNlbGYtPnZlcnNpb24gPSBrRGF0YUJyb3dzZXJMaXN0Vmlld0xhdGVzdEhlYWRlckRlc2M7Ci0gICAgICAgIHJldHVybiBQeUFyZ19QYXJzZSh2LCAiKEhIaE8mSE8mTyYpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICZpdHNlbGYtPm1pbmltdW1XaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICZpdHNlbGYtPm1heGltdW1XaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICZpdHNlbGYtPnRpdGxlT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJml0c2VsZi0+dGl0bGVTdHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRzZWxmLT5pbml0aWFsT3JkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sRm9udFN0eWxlX0NvbnZlcnQsICZpdHNlbGYtPmJ0bkZvbnRTdHlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2xCdXR0b25Db250ZW50SW5mb19Db252ZXJ0LCAmaXRzZWxmLT5idG5Db250ZW50SW5mbyk7CisgICAgaXRzZWxmLT52ZXJzaW9uID0ga0RhdGFCcm93c2VyTGlzdFZpZXdMYXRlc3RIZWFkZXJEZXNjOworICAgIHJldHVybiBQeUFyZ19QYXJzZSh2LCAiKEhIaE8mSE8mTyYpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgJml0c2VsZi0+bWluaW11bVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAmaXRzZWxmLT5tYXhpbXVtV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICZpdHNlbGYtPnRpdGxlT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmaXRzZWxmLT50aXRsZVN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgJml0c2VsZi0+aW5pdGlhbE9yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sRm9udFN0eWxlX0NvbnZlcnQsICZpdHNlbGYtPmJ0bkZvbnRTdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvX0NvbnZlcnQsICZpdHNlbGYtPmJ0bkNvbnRlbnRJbmZvKTsKIH0KIAogc3RhdGljIGludAogRGF0YUJyb3dzZXJMaXN0Vmlld0NvbHVtbkRlc2NfQ29udmVydChQeU9iamVjdCAqdiwgRGF0YUJyb3dzZXJMaXN0Vmlld0NvbHVtbkRlc2MgKml0c2VsZikKIHsKLSAgICAgICAgcmV0dXJuIFB5QXJnX1BhcnNlKHYsICIoTyZPJikiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5EZXNjX0NvbnZlcnQsICZpdHNlbGYtPnByb3BlcnR5RGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFCcm93c2VyTGlzdFZpZXdIZWFkZXJEZXNjX0NvbnZlcnQsICZpdHNlbGYtPmhlYWRlckJ0bkRlc2MpOworICAgIHJldHVybiBQeUFyZ19QYXJzZSh2LCAiKE8mTyYpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgRGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5EZXNjX0NvbnZlcnQsICZpdHNlbGYtPnByb3BlcnR5RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgRGF0YUJyb3dzZXJMaXN0Vmlld0hlYWRlckRlc2NfQ29udmVydCwgJml0c2VsZi0+aGVhZGVyQnRuRGVzYyk7CiB9CiAKIC8qIFRyYWNrQ29udHJvbCBhbmQgSGFuZGxlQ29udHJvbENsaWNrIGNhbGxiYWNrIHN1cHBvcnQgKi8KQEAgLTEzOSwzNjgzICsxMzksMzY4MyBAQAogI2RlZmluZSBDdGxPYmpfQ2hlY2soeCkgKCh4KS0+b2JfdHlwZSA9PSAmQ29udHJvbF9UeXBlIHx8IFB5T2JqZWN0X1R5cGVDaGVjaygoeCksICZDb250cm9sX1R5cGUpKQogCiB0eXBlZGVmIHN0cnVjdCBDb250cm9sT2JqZWN0IHsKLQlQeU9iamVjdF9IRUFECi0JQ29udHJvbEhhbmRsZSBvYl9pdHNlbGY7Ci0JUHlPYmplY3QgKm9iX2NhbGxiYWNrZGljdDsKKyAgICBQeU9iamVjdF9IRUFECisgICAgQ29udHJvbEhhbmRsZSBvYl9pdHNlbGY7CisgICAgUHlPYmplY3QgKm9iX2NhbGxiYWNrZGljdDsKIH0gQ29udHJvbE9iamVjdDsKIAogUHlPYmplY3QgKkN0bE9ial9OZXcoQ29udHJvbEhhbmRsZSBpdHNlbGYpCiB7Ci0JQ29udHJvbE9iamVjdCAqaXQ7Ci0JaWYgKGl0c2VsZiA9PSBOVUxMKSByZXR1cm4gUHlNYWNfRXJyb3IocmVzTm90Rm91bmQpOwotCWl0ID0gUHlPYmplY3RfTkVXKENvbnRyb2xPYmplY3QsICZDb250cm9sX1R5cGUpOwotCWlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQlpdC0+b2JfaXRzZWxmID0gaXRzZWxmOwotCVNldENvbnRyb2xSZWZlcmVuY2UoaXRzZWxmLCAobG9uZylpdCk7Ci0JaXQtPm9iX2NhbGxiYWNrZGljdCA9IE5VTEw7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIENvbnRyb2xPYmplY3QgKml0OworICAgIGlmIChpdHNlbGYgPT0gTlVMTCkgcmV0dXJuIFB5TWFjX0Vycm9yKHJlc05vdEZvdW5kKTsKKyAgICBpdCA9IFB5T2JqZWN0X05FVyhDb250cm9sT2JqZWN0LCAmQ29udHJvbF9UeXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICBTZXRDb250cm9sUmVmZXJlbmNlKGl0c2VsZiwgKGxvbmcpaXQpOworICAgIGl0LT5vYl9jYWxsYmFja2RpY3QgPSBOVUxMOworICAgIHJldHVybiAoUHlPYmplY3QgKilpdDsKIH0KIAogaW50IEN0bE9ial9Db252ZXJ0KFB5T2JqZWN0ICp2LCBDb250cm9sSGFuZGxlICpwX2l0c2VsZikKIHsKLQlpZiAoIUN0bE9ial9DaGVjayh2KSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJDb250cm9sIHJlcXVpcmVkIik7Ci0JCXJldHVybiAwOwotCX0KLQkqcF9pdHNlbGYgPSAoKENvbnRyb2xPYmplY3QgKil2KS0+b2JfaXRzZWxmOwotCXJldHVybiAxOworICAgIGlmICghQ3RsT2JqX0NoZWNrKHYpKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkNvbnRyb2wgcmVxdWlyZWQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICpwX2l0c2VsZiA9ICgoQ29udHJvbE9iamVjdCAqKXYpLT5vYl9pdHNlbGY7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyB2b2lkIEN0bE9ial9kZWFsbG9jKENvbnRyb2xPYmplY3QgKnNlbGYpCiB7Ci0JUHlfWERFQ1JFRihzZWxmLT5vYl9jYWxsYmFja2RpY3QpOwotCWlmIChzZWxmLT5vYl9pdHNlbGYpU2V0Q29udHJvbFJlZmVyZW5jZShzZWxmLT5vYl9pdHNlbGYsIChsb25nKTApOyAvKiBNYWtlIGl0IGZvcmdldCBhYm91dCB1cyAqLwotCXNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CisgICAgUHlfWERFQ1JFRihzZWxmLT5vYl9jYWxsYmFja2RpY3QpOworICAgIGlmIChzZWxmLT5vYl9pdHNlbGYpU2V0Q29udHJvbFJlZmVyZW5jZShzZWxmLT5vYl9pdHNlbGYsIChsb25nKTApOyAvKiBNYWtlIGl0IGZvcmdldCBhYm91dCB1cyAqLworICAgIHNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0hpbGl0ZUNvbnRyb2woQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29udHJvbFBhcnRDb2RlIGhpbGl0ZVN0YXRlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb250cm9sUGFydENvZGUgaGlsaXRlU3RhdGU7CiAjaWZuZGVmIEhpbGl0ZUNvbnRyb2wKLQlQeU1hY19QUkVDSEVDSyhIaWxpdGVDb250cm9sKTsKKyAgICBQeU1hY19QUkVDSEVDSyhIaWxpdGVDb250cm9sKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaGlsaXRlU3RhdGUpKQotCQlyZXR1cm4gTlVMTDsKLQlIaWxpdGVDb250cm9sKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICBoaWxpdGVTdGF0ZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaGlsaXRlU3RhdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBIaWxpdGVDb250cm9sKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICBoaWxpdGVTdGF0ZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9TaG93Q29udHJvbChDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIFNob3dDb250cm9sCi0JUHlNYWNfUFJFQ0hFQ0soU2hvd0NvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKFNob3dDb250cm9sKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlTaG93Q29udHJvbChfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNob3dDb250cm9sKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfSGlkZUNvbnRyb2woQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBIaWRlQ29udHJvbAotCVB5TWFjX1BSRUNIRUNLKEhpZGVDb250cm9sKTsKKyAgICBQeU1hY19QUkVDSEVDSyhIaWRlQ29udHJvbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JSGlkZUNvbnRyb2woX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBIaWRlQ29udHJvbChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0lzQ29udHJvbEFjdGl2ZShDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CiAjaWZuZGVmIElzQ29udHJvbEFjdGl2ZQotCVB5TWFjX1BSRUNIRUNLKElzQ29udHJvbEFjdGl2ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSXNDb250cm9sQWN0aXZlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBJc0NvbnRyb2xBY3RpdmUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IElzQ29udHJvbEFjdGl2ZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfSXNDb250cm9sVmlzaWJsZShDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CiAjaWZuZGVmIElzQ29udHJvbFZpc2libGUKLQlQeU1hY19QUkVDSEVDSyhJc0NvbnRyb2xWaXNpYmxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhJc0NvbnRyb2xWaXNpYmxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBJc0NvbnRyb2xWaXNpYmxlKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBJc0NvbnRyb2xWaXNpYmxlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9BY3RpdmF0ZUNvbnRyb2woQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKICNpZm5kZWYgQWN0aXZhdGVDb250cm9sCi0JUHlNYWNfUFJFQ0hFQ0soQWN0aXZhdGVDb250cm9sKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBY3RpdmF0ZUNvbnRyb2wpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBY3RpdmF0ZUNvbnRyb2woX3NlbGYtPm9iX2l0c2VsZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBBY3RpdmF0ZUNvbnRyb2woX3NlbGYtPm9iX2l0c2VsZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0RlYWN0aXZhdGVDb250cm9sKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CiAjaWZuZGVmIERlYWN0aXZhdGVDb250cm9sCi0JUHlNYWNfUFJFQ0hFQ0soRGVhY3RpdmF0ZUNvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKERlYWN0aXZhdGVDb250cm9sKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRGVhY3RpdmF0ZUNvbnRyb2woX3NlbGYtPm9iX2l0c2VsZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBEZWFjdGl2YXRlQ29udHJvbChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfU2V0Q29udHJvbFZpc2liaWxpdHkoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlCb29sZWFuIGluSXNWaXNpYmxlOwotCUJvb2xlYW4gaW5Eb0RyYXc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgQm9vbGVhbiBpbklzVmlzaWJsZTsKKyAgICBCb29sZWFuIGluRG9EcmF3OwogI2lmbmRlZiBTZXRDb250cm9sVmlzaWJpbGl0eQotCVB5TWFjX1BSRUNIRUNLKFNldENvbnRyb2xWaXNpYmlsaXR5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRDb250cm9sVmlzaWJpbGl0eSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbklzVmlzaWJsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluRG9EcmF3KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldENvbnRyb2xWaXNpYmlsaXR5KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXNWaXNpYmxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkRvRHJhdyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Jc1Zpc2libGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkRvRHJhdykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRDb250cm9sVmlzaWJpbGl0eShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbklzVmlzaWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Eb0RyYXcpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9Jc0NvbnRyb2xFbmFibGVkKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKICNpZm5kZWYgSXNDb250cm9sRW5hYmxlZAotCVB5TWFjX1BSRUNIRUNLKElzQ29udHJvbEVuYWJsZWQpOworICAgIFB5TWFjX1BSRUNIRUNLKElzQ29udHJvbEVuYWJsZWQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IElzQ29udHJvbEVuYWJsZWQoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IElzQ29udHJvbEVuYWJsZWQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0VuYWJsZUNvbnRyb2woQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKICNpZm5kZWYgRW5hYmxlQ29udHJvbAotCVB5TWFjX1BSRUNIRUNLKEVuYWJsZUNvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKEVuYWJsZUNvbnRyb2wpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBFbmFibGVDb250cm9sKF9zZWxmLT5vYl9pdHNlbGYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRW5hYmxlQ29udHJvbChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfRGlzYWJsZUNvbnRyb2woQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKICNpZm5kZWYgRGlzYWJsZUNvbnRyb2wKLQlQeU1hY19QUkVDSEVDSyhEaXNhYmxlQ29udHJvbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGlzYWJsZUNvbnRyb2wpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBEaXNhYmxlQ29udHJvbChfc2VsZi0+b2JfaXRzZWxmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IERpc2FibGVDb250cm9sKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9EcmF3MUNvbnRyb2woQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBEcmF3MUNvbnRyb2wKLQlQeU1hY19QUkVDSEVDSyhEcmF3MUNvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKERyYXcxQ29udHJvbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JRHJhdzFDb250cm9sKF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgRHJhdzFDb250cm9sKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0QmVzdENvbnRyb2xSZWN0KENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JUmVjdCBvdXRSZWN0OwotCVNJbnQxNiBvdXRCYXNlTGluZU9mZnNldDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBSZWN0IG91dFJlY3Q7CisgICAgU0ludDE2IG91dEJhc2VMaW5lT2Zmc2V0OwogI2lmbmRlZiBHZXRCZXN0Q29udHJvbFJlY3QKLQlQeU1hY19QUkVDSEVDSyhHZXRCZXN0Q29udHJvbFJlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldEJlc3RDb250cm9sUmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldEJlc3RDb250cm9sUmVjdChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0QmFzZUxpbmVPZmZzZXQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmb3V0UmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRCYXNlTGluZU9mZnNldCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRCZXN0Q29udHJvbFJlY3QoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEJhc2VMaW5lT2Zmc2V0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJm91dFJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0QmFzZUxpbmVPZmZzZXQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9TZXRDb250cm9sRm9udFN0eWxlKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JQ29udHJvbEZvbnRTdHlsZVJlYyBpblN0eWxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIENvbnRyb2xGb250U3R5bGVSZWMgaW5TdHlsZTsKICNpZm5kZWYgU2V0Q29udHJvbEZvbnRTdHlsZQotCVB5TWFjX1BSRUNIRUNLKFNldENvbnRyb2xGb250U3R5bGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldENvbnRyb2xGb250U3R5bGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDb250cm9sRm9udFN0eWxlX0NvbnZlcnQsICZpblN0eWxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldENvbnRyb2xGb250U3R5bGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5TdHlsZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sRm9udFN0eWxlX0NvbnZlcnQsICZpblN0eWxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldENvbnRyb2xGb250U3R5bGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5TdHlsZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0RyYXdDb250cm9sSW5DdXJyZW50UG9ydChDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIERyYXdDb250cm9sSW5DdXJyZW50UG9ydAotCVB5TWFjX1BSRUNIRUNLKERyYXdDb250cm9sSW5DdXJyZW50UG9ydCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRHJhd0NvbnRyb2xJbkN1cnJlbnRQb3J0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlEcmF3Q29udHJvbEluQ3VycmVudFBvcnQoX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBEcmF3Q29udHJvbEluQ3VycmVudFBvcnQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9TZXRVcENvbnRyb2xCYWNrZ3JvdW5kKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU0ludDE2IGluRGVwdGg7Ci0JQm9vbGVhbiBpbklzQ29sb3JEZXZpY2U7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU0ludDE2IGluRGVwdGg7CisgICAgQm9vbGVhbiBpbklzQ29sb3JEZXZpY2U7CiAjaWZuZGVmIFNldFVwQ29udHJvbEJhY2tncm91bmQKLQlQeU1hY19QUkVDSEVDSyhTZXRVcENvbnRyb2xCYWNrZ3JvdW5kKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRVcENvbnRyb2xCYWNrZ3JvdW5kKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluRGVwdGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbklzQ29sb3JEZXZpY2UpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0VXBDb250cm9sQmFja2dyb3VuZChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRGVwdGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Jc0NvbG9yRGV2aWNlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkRlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Jc0NvbG9yRGV2aWNlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldFVwQ29udHJvbEJhY2tncm91bmQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkRlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXNDb2xvckRldmljZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX1NldFVwQ29udHJvbFRleHRDb2xvcihDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVNJbnQxNiBpbkRlcHRoOwotCUJvb2xlYW4gaW5Jc0NvbG9yRGV2aWNlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFNJbnQxNiBpbkRlcHRoOworICAgIEJvb2xlYW4gaW5Jc0NvbG9yRGV2aWNlOwogI2lmbmRlZiBTZXRVcENvbnRyb2xUZXh0Q29sb3IKLQlQeU1hY19QUkVDSEVDSyhTZXRVcENvbnRyb2xUZXh0Q29sb3IpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFVwQ29udHJvbFRleHRDb2xvcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkRlcHRoLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5Jc0NvbG9yRGV2aWNlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldFVwQ29udHJvbFRleHRDb2xvcihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5EZXB0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXNDb2xvckRldmljZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5EZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluSXNDb2xvckRldmljZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRVcENvbnRyb2xUZXh0Q29sb3IoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbklzQ29sb3JEZXZpY2UpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9EcmFnQ29udHJvbChDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQb2ludCBzdGFydFBvaW50OwotCVJlY3QgbGltaXRSZWN0OwotCVJlY3Qgc2xvcFJlY3Q7Ci0JRHJhZ0NvbnN0cmFpbnQgYXhpczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUG9pbnQgc3RhcnRQb2ludDsKKyAgICBSZWN0IGxpbWl0UmVjdDsKKyAgICBSZWN0IHNsb3BSZWN0OworICAgIERyYWdDb25zdHJhaW50IGF4aXM7CiAjaWZuZGVmIERyYWdDb250cm9sCi0JUHlNYWNfUFJFQ0hFQ0soRHJhZ0NvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKERyYWdDb250cm9sKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJkgiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnN0YXJ0UG9pbnQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZsaW1pdFJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZzbG9wUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmF4aXMpKQotCQlyZXR1cm4gTlVMTDsKLQlEcmFnQ29udHJvbChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgIHN0YXJ0UG9pbnQsCi0JICAgICAgICAgICAgJmxpbWl0UmVjdCwKLQkgICAgICAgICAgICAmc2xvcFJlY3QsCi0JICAgICAgICAgICAgYXhpcyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJkgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnN0YXJ0UG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZsaW1pdFJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZzbG9wUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmF4aXMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBEcmFnQ29udHJvbChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgIHN0YXJ0UG9pbnQsCisgICAgICAgICAgICAgICAgJmxpbWl0UmVjdCwKKyAgICAgICAgICAgICAgICAmc2xvcFJlY3QsCisgICAgICAgICAgICAgICAgYXhpcyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9UZXN0Q29udHJvbChDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb250cm9sUGFydENvZGUgX3J2OwotCVBvaW50IHRlc3RQb2ludDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29udHJvbFBhcnRDb2RlIF9ydjsKKyAgICBQb2ludCB0ZXN0UG9pbnQ7CiAjaWZuZGVmIFRlc3RDb250cm9sCi0JUHlNYWNfUFJFQ0hFQ0soVGVzdENvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKFRlc3RDb250cm9sKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZ0ZXN0UG9pbnQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBUZXN0Q29udHJvbChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgIHRlc3RQb2ludCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnRlc3RQb2ludCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFRlc3RDb250cm9sKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgdGVzdFBvaW50KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfSGFuZGxlQ29udHJvbENvbnRleHR1YWxNZW51Q2xpY2soQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlQb2ludCBpbldoZXJlOwotCUJvb2xlYW4gbWVudURpc3BsYXllZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBQb2ludCBpbldoZXJlOworICAgIEJvb2xlYW4gbWVudURpc3BsYXllZDsKICNpZm5kZWYgSGFuZGxlQ29udHJvbENvbnRleHR1YWxNZW51Q2xpY2sKLQlQeU1hY19QUkVDSEVDSyhIYW5kbGVDb250cm9sQ29udGV4dHVhbE1lbnVDbGljayk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSGFuZGxlQ29udHJvbENvbnRleHR1YWxNZW51Q2xpY2spOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJmluV2hlcmUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gSGFuZGxlQ29udHJvbENvbnRleHR1YWxNZW51Q2xpY2soX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5XaGVyZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lbnVEaXNwbGF5ZWQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIG1lbnVEaXNwbGF5ZWQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZpbldoZXJlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEhhbmRsZUNvbnRyb2xDb250ZXh0dWFsTWVudUNsaWNrKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluV2hlcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZW51RGlzcGxheWVkKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtZW51RGlzcGxheWVkKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0Q29udHJvbENsaWNrQWN0aXZhdGlvbihDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVBvaW50IGluV2hlcmU7Ci0JRXZlbnRNb2RpZmllcnMgaW5Nb2RpZmllcnM7Ci0JQ2xpY2tBY3RpdmF0aW9uUmVzdWx0IG91dFJlc3VsdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBQb2ludCBpbldoZXJlOworICAgIEV2ZW50TW9kaWZpZXJzIGluTW9kaWZpZXJzOworICAgIENsaWNrQWN0aXZhdGlvblJlc3VsdCBvdXRSZXN1bHQ7CiAjaWZuZGVmIEdldENvbnRyb2xDbGlja0FjdGl2YXRpb24KLQlQeU1hY19QUkVDSEVDSyhHZXRDb250cm9sQ2xpY2tBY3RpdmF0aW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRDb250cm9sQ2xpY2tBY3RpdmF0aW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mSCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmaW5XaGVyZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluTW9kaWZpZXJzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldENvbnRyb2xDbGlja0FjdGl2YXRpb24oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbldoZXJlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluTW9kaWZpZXJzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRSZXN1bHQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIG91dFJlc3VsdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZpbldoZXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Nb2RpZmllcnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0Q29udHJvbENsaWNrQWN0aXZhdGlvbihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluV2hlcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Nb2RpZmllcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFJlc3VsdCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0UmVzdWx0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfSGFuZGxlQ29udHJvbEtleShDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb250cm9sUGFydENvZGUgX3J2OwotCVNJbnQxNiBpbktleUNvZGU7Ci0JU0ludDE2IGluQ2hhckNvZGU7Ci0JRXZlbnRNb2RpZmllcnMgaW5Nb2RpZmllcnM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbnRyb2xQYXJ0Q29kZSBfcnY7CisgICAgU0ludDE2IGluS2V5Q29kZTsKKyAgICBTSW50MTYgaW5DaGFyQ29kZTsKKyAgICBFdmVudE1vZGlmaWVycyBpbk1vZGlmaWVyczsKICNpZm5kZWYgSGFuZGxlQ29udHJvbEtleQotCVB5TWFjX1BSRUNIRUNLKEhhbmRsZUNvbnRyb2xLZXkpOworICAgIFB5TWFjX1BSRUNIRUNLKEhhbmRsZUNvbnRyb2xLZXkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGhIIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluS2V5Q29kZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluQ2hhckNvZGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbk1vZGlmaWVycykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEhhbmRsZUNvbnRyb2xLZXkoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgIGluS2V5Q29kZSwKLQkgICAgICAgICAgICAgICAgICAgICAgIGluQ2hhckNvZGUsCi0JICAgICAgICAgICAgICAgICAgICAgICBpbk1vZGlmaWVycyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGhIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluS2V5Q29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQ2hhckNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbk1vZGlmaWVycykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEhhbmRsZUNvbnRyb2xLZXkoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGluS2V5Q29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQ2hhckNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbk1vZGlmaWVycyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0hhbmRsZUNvbnRyb2xTZXRDdXJzb3IoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlQb2ludCBsb2NhbFBvaW50OwotCUV2ZW50TW9kaWZpZXJzIG1vZGlmaWVyczsKLQlCb29sZWFuIGN1cnNvcldhc1NldDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBQb2ludCBsb2NhbFBvaW50OworICAgIEV2ZW50TW9kaWZpZXJzIG1vZGlmaWVyczsKKyAgICBCb29sZWFuIGN1cnNvcldhc1NldDsKICNpZm5kZWYgSGFuZGxlQ29udHJvbFNldEN1cnNvcgotCVB5TWFjX1BSRUNIRUNLKEhhbmRsZUNvbnRyb2xTZXRDdXJzb3IpOworICAgIFB5TWFjX1BSRUNIRUNLKEhhbmRsZUNvbnRyb2xTZXRDdXJzb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZIIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZsb2NhbFBvaW50LAotCSAgICAgICAgICAgICAgICAgICAgICAmbW9kaWZpZXJzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEhhbmRsZUNvbnRyb2xTZXRDdXJzb3IoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFBvaW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVycywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3Vyc29yV2FzU2V0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBjdXJzb3JXYXNTZXQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmbG9jYWxQb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGlmaWVycykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBIYW5kbGVDb250cm9sU2V0Q3Vyc29yKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxQb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RpZmllcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmN1cnNvcldhc1NldCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY3Vyc29yV2FzU2V0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfTW92ZUNvbnRyb2woQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JU0ludDE2IGg7Ci0JU0ludDE2IHY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFNJbnQxNiBoOworICAgIFNJbnQxNiB2OwogI2lmbmRlZiBNb3ZlQ29udHJvbAotCVB5TWFjX1BSRUNIRUNLKE1vdmVDb250cm9sKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNb3ZlQ29udHJvbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZoLAotCSAgICAgICAgICAgICAgICAgICAgICAmdikpCi0JCXJldHVybiBOVUxMOwotCU1vdmVDb250cm9sKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgaCwKLQkgICAgICAgICAgICB2KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNb3ZlQ29udHJvbChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgIGgsCisgICAgICAgICAgICAgICAgdik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9TaXplQ29udHJvbChDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTSW50MTYgdzsKLQlTSW50MTYgaDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgU0ludDE2IHc7CisgICAgU0ludDE2IGg7CiAjaWZuZGVmIFNpemVDb250cm9sCi0JUHlNYWNfUFJFQ0hFQ0soU2l6ZUNvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKFNpemVDb250cm9sKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJncsCi0JICAgICAgICAgICAgICAgICAgICAgICZoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2l6ZUNvbnRyb2woX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICB3LAotCSAgICAgICAgICAgIGgpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNpemVDb250cm9sKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgdywKKyAgICAgICAgICAgICAgICBoKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX1NldENvbnRyb2xUaXRsZShDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTdHIyNTUgdGl0bGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFN0cjI1NSB0aXRsZTsKICNpZm5kZWYgU2V0Q29udHJvbFRpdGxlCi0JUHlNYWNfUFJFQ0hFQ0soU2V0Q29udHJvbFRpdGxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRDb250cm9sVGl0bGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIHRpdGxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0Q29udHJvbFRpdGxlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgIHRpdGxlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIHRpdGxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0Q29udHJvbFRpdGxlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgIHRpdGxlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0dldENvbnRyb2xUaXRsZShDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTdHIyNTUgdGl0bGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFN0cjI1NSB0aXRsZTsKICNpZm5kZWYgR2V0Q29udHJvbFRpdGxlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0Q29udHJvbFRpdGxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRDb250cm9sVGl0bGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUdldENvbnRyb2xUaXRsZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICB0aXRsZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFN0cjI1NSwgdGl0bGUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRDb250cm9sVGl0bGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgdGl0bGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRTdHIyNTUsIHRpdGxlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfU2V0Q29udHJvbFRpdGxlV2l0aENGU3RyaW5nKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JQ0ZTdHJpbmdSZWYgaW5TdHJpbmc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgQ0ZTdHJpbmdSZWYgaW5TdHJpbmc7CiAjaWZuZGVmIFNldENvbnRyb2xUaXRsZVdpdGhDRlN0cmluZwotCVB5TWFjX1BSRUNIRUNLKFNldENvbnRyb2xUaXRsZVdpdGhDRlN0cmluZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0Q29udHJvbFRpdGxlV2l0aENGU3RyaW5nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmluU3RyaW5nKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldENvbnRyb2xUaXRsZVdpdGhDRlN0cmluZyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5TdHJpbmcpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmluU3RyaW5nKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldENvbnRyb2xUaXRsZVdpdGhDRlN0cmluZyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5TdHJpbmcpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9Db3B5Q29udHJvbFRpdGxlQXNDRlN0cmluZyhDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUNGU3RyaW5nUmVmIG91dFN0cmluZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBDRlN0cmluZ1JlZiBvdXRTdHJpbmc7CiAjaWZuZGVmIENvcHlDb250cm9sVGl0bGVBc0NGU3RyaW5nCi0JUHlNYWNfUFJFQ0hFQ0soQ29weUNvbnRyb2xUaXRsZUFzQ0ZTdHJpbmcpOworICAgIFB5TWFjX1BSRUNIRUNLKENvcHlDb250cm9sVGl0bGVBc0NGU3RyaW5nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ29weUNvbnRyb2xUaXRsZUFzQ0ZTdHJpbmcoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFN0cmluZyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgb3V0U3RyaW5nKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENvcHlDb250cm9sVGl0bGVBc0NGU3RyaW5nKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRTdHJpbmcpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIG91dFN0cmluZyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0dldENvbnRyb2xWYWx1ZShDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTSW50MTYgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTSW50MTYgX3J2OwogI2lmbmRlZiBHZXRDb250cm9sVmFsdWUKLQlQeU1hY19QUkVDSEVDSyhHZXRDb250cm9sVmFsdWUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldENvbnRyb2xWYWx1ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0Q29udHJvbFZhbHVlKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRDb250cm9sVmFsdWUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX1NldENvbnRyb2xWYWx1ZShDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTSW50MTYgbmV3VmFsdWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFNJbnQxNiBuZXdWYWx1ZTsKICNpZm5kZWYgU2V0Q29udHJvbFZhbHVlCi0JUHlNYWNfUFJFQ0hFQ0soU2V0Q29udHJvbFZhbHVlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRDb250cm9sVmFsdWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZuZXdWYWx1ZSkpCi0JCXJldHVybiBOVUxMOwotCVNldENvbnRyb2xWYWx1ZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICBuZXdWYWx1ZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbmV3VmFsdWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRDb250cm9sVmFsdWUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgbmV3VmFsdWUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0Q29udHJvbE1pbmltdW0oQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JU0ludDE2IF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgU0ludDE2IF9ydjsKICNpZm5kZWYgR2V0Q29udHJvbE1pbmltdW0KLQlQeU1hY19QUkVDSEVDSyhHZXRDb250cm9sTWluaW11bSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0Q29udHJvbE1pbmltdW0pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldENvbnRyb2xNaW5pbXVtKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRDb250cm9sTWluaW11bShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfU2V0Q29udHJvbE1pbmltdW0oQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JU0ludDE2IG5ld01pbmltdW07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFNJbnQxNiBuZXdNaW5pbXVtOwogI2lmbmRlZiBTZXRDb250cm9sTWluaW11bQotCVB5TWFjX1BSRUNIRUNLKFNldENvbnRyb2xNaW5pbXVtKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRDb250cm9sTWluaW11bSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm5ld01pbmltdW0pKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRDb250cm9sTWluaW11bShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgIG5ld01pbmltdW0pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld01pbmltdW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRDb250cm9sTWluaW11bShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgIG5ld01pbmltdW0pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0Q29udHJvbE1heGltdW0oQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JU0ludDE2IF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgU0ludDE2IF9ydjsKICNpZm5kZWYgR2V0Q29udHJvbE1heGltdW0KLQlQeU1hY19QUkVDSEVDSyhHZXRDb250cm9sTWF4aW11bSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0Q29udHJvbE1heGltdW0pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldENvbnRyb2xNYXhpbXVtKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRDb250cm9sTWF4aW11bShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfU2V0Q29udHJvbE1heGltdW0oQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JU0ludDE2IG5ld01heGltdW07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFNJbnQxNiBuZXdNYXhpbXVtOwogI2lmbmRlZiBTZXRDb250cm9sTWF4aW11bQotCVB5TWFjX1BSRUNIRUNLKFNldENvbnRyb2xNYXhpbXVtKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRDb250cm9sTWF4aW11bSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm5ld01heGltdW0pKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRDb250cm9sTWF4aW11bShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgIG5ld01heGltdW0pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld01heGltdW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRDb250cm9sTWF4aW11bShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgIG5ld01heGltdW0pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0Q29udHJvbFZpZXdTaXplKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVNJbnQzMiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFNJbnQzMiBfcnY7CiAjaWZuZGVmIEdldENvbnRyb2xWaWV3U2l6ZQotCVB5TWFjX1BSRUNIRUNLKEdldENvbnRyb2xWaWV3U2l6ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0Q29udHJvbFZpZXdTaXplKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRDb250cm9sVmlld1NpemUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldENvbnRyb2xWaWV3U2l6ZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfU2V0Q29udHJvbFZpZXdTaXplKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVNJbnQzMiBuZXdWaWV3U2l6ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgU0ludDMyIG5ld1ZpZXdTaXplOwogI2lmbmRlZiBTZXRDb250cm9sVmlld1NpemUKLQlQeU1hY19QUkVDSEVDSyhTZXRDb250cm9sVmlld1NpemUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldENvbnRyb2xWaWV3U2l6ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm5ld1ZpZXdTaXplKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0Q29udHJvbFZpZXdTaXplKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgIG5ld1ZpZXdTaXplKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXdWaWV3U2l6ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldENvbnRyb2xWaWV3U2l6ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICBuZXdWaWV3U2l6ZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9HZXRDb250cm9sMzJCaXRWYWx1ZShDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTSW50MzIgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTSW50MzIgX3J2OwogI2lmbmRlZiBHZXRDb250cm9sMzJCaXRWYWx1ZQotCVB5TWFjX1BSRUNIRUNLKEdldENvbnRyb2wzMkJpdFZhbHVlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRDb250cm9sMzJCaXRWYWx1ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0Q29udHJvbDMyQml0VmFsdWUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldENvbnRyb2wzMkJpdFZhbHVlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9TZXRDb250cm9sMzJCaXRWYWx1ZShDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTSW50MzIgbmV3VmFsdWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFNJbnQzMiBuZXdWYWx1ZTsKICNpZm5kZWYgU2V0Q29udHJvbDMyQml0VmFsdWUKLQlQeU1hY19QUkVDSEVDSyhTZXRDb250cm9sMzJCaXRWYWx1ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0Q29udHJvbDMyQml0VmFsdWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZuZXdWYWx1ZSkpCi0JCXJldHVybiBOVUxMOwotCVNldENvbnRyb2wzMkJpdFZhbHVlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgbmV3VmFsdWUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld1ZhbHVlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0Q29udHJvbDMyQml0VmFsdWUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBuZXdWYWx1ZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9HZXRDb250cm9sMzJCaXRNYXhpbXVtKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVNJbnQzMiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFNJbnQzMiBfcnY7CiAjaWZuZGVmIEdldENvbnRyb2wzMkJpdE1heGltdW0KLQlQeU1hY19QUkVDSEVDSyhHZXRDb250cm9sMzJCaXRNYXhpbXVtKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRDb250cm9sMzJCaXRNYXhpbXVtKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRDb250cm9sMzJCaXRNYXhpbXVtKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRDb250cm9sMzJCaXRNYXhpbXVtKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9TZXRDb250cm9sMzJCaXRNYXhpbXVtKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVNJbnQzMiBuZXdNYXhpbXVtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTSW50MzIgbmV3TWF4aW11bTsKICNpZm5kZWYgU2V0Q29udHJvbDMyQml0TWF4aW11bQotCVB5TWFjX1BSRUNIRUNLKFNldENvbnRyb2wzMkJpdE1heGltdW0pOworICAgIFB5TWFjX1BSRUNIRUNLKFNldENvbnRyb2wzMkJpdE1heGltdW0pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZuZXdNYXhpbXVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0Q29udHJvbDMyQml0TWF4aW11bShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgbmV3TWF4aW11bSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbmV3TWF4aW11bSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldENvbnRyb2wzMkJpdE1heGltdW0oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld01heGltdW0pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0Q29udHJvbDMyQml0TWluaW11bShDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTSW50MzIgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTSW50MzIgX3J2OwogI2lmbmRlZiBHZXRDb250cm9sMzJCaXRNaW5pbXVtCi0JUHlNYWNfUFJFQ0hFQ0soR2V0Q29udHJvbDMyQml0TWluaW11bSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0Q29udHJvbDMyQml0TWluaW11bSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0Q29udHJvbDMyQml0TWluaW11bShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0Q29udHJvbDMyQml0TWluaW11bShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfU2V0Q29udHJvbDMyQml0TWluaW11bShDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTSW50MzIgbmV3TWluaW11bTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgU0ludDMyIG5ld01pbmltdW07CiAjaWZuZGVmIFNldENvbnRyb2wzMkJpdE1pbmltdW0KLQlQeU1hY19QUkVDSEVDSyhTZXRDb250cm9sMzJCaXRNaW5pbXVtKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRDb250cm9sMzJCaXRNaW5pbXVtKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmbmV3TWluaW11bSkpCi0JCXJldHVybiBOVUxMOwotCVNldENvbnRyb2wzMkJpdE1pbmltdW0oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgIG5ld01pbmltdW0pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld01pbmltdW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRDb250cm9sMzJCaXRNaW5pbXVtKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdNaW5pbXVtKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0lzVmFsaWRDb250cm9sSGFuZGxlKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKICNpZm5kZWYgSXNWYWxpZENvbnRyb2xIYW5kbGUKLQlQeU1hY19QUkVDSEVDSyhJc1ZhbGlkQ29udHJvbEhhbmRsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSXNWYWxpZENvbnRyb2xIYW5kbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IElzVmFsaWRDb250cm9sSGFuZGxlKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBJc1ZhbGlkQ29udHJvbEhhbmRsZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfU2V0Q29udHJvbElEKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JQ29udHJvbElEIGluSUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgQ29udHJvbElEIGluSUQ7CiAjaWZuZGVmIFNldENvbnRyb2xJRAotCVB5TWFjX1BSRUNIRUNLKFNldENvbnRyb2xJRCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0Q29udHJvbElEKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlDb250cm9sSURfQ29udmVydCwgJmluSUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0Q29udHJvbElEKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAmaW5JRCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeUNvbnRyb2xJRF9Db252ZXJ0LCAmaW5JRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRDb250cm9sSUQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICZpbklEKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0Q29udHJvbElEKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JQ29udHJvbElEIG91dElEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIENvbnRyb2xJRCBvdXRJRDsKICNpZm5kZWYgR2V0Q29udHJvbElECi0JUHlNYWNfUFJFQ0hFQ0soR2V0Q29udHJvbElEKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRDb250cm9sSUQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRDb250cm9sSUQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICZvdXRJRCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5Q29udHJvbElEX05ldywgJm91dElEKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldENvbnRyb2xJRChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgJm91dElEKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlDb250cm9sSURfTmV3LCAmb3V0SUQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9TZXRDb250cm9sQ29tbWFuZElEKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVUludDMyIGluQ29tbWFuZElEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQzMiBpbkNvbW1hbmRJRDsKICNpZm5kZWYgU2V0Q29udHJvbENvbW1hbmRJRAotCVB5TWFjX1BSRUNIRUNLKFNldENvbnRyb2xDb21tYW5kSUQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldENvbnRyb2xDb21tYW5kSUQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkNvbW1hbmRJRCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRDb250cm9sQ29tbWFuZElEKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Db21tYW5kSUQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Db21tYW5kSUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0Q29udHJvbENvbW1hbmRJRChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQ29tbWFuZElEKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0Q29udHJvbENvbW1hbmRJRChDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVVJbnQzMiBvdXRDb21tYW5kSUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVUludDMyIG91dENvbW1hbmRJRDsKICNpZm5kZWYgR2V0Q29udHJvbENvbW1hbmRJRAotCVB5TWFjX1BSRUNIRUNLKEdldENvbnRyb2xDb21tYW5kSUQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldENvbnRyb2xDb21tYW5kSUQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRDb250cm9sQ29tbWFuZElEKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbW1hbmRJRCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0Q29tbWFuZElEKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldENvbnRyb2xDb21tYW5kSUQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29tbWFuZElEKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRDb21tYW5kSUQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9SZW1vdmVDb250cm9sUHJvcGVydHkoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlPU1R5cGUgcHJvcGVydHlDcmVhdG9yOwotCU9TVHlwZSBwcm9wZXJ0eVRhZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBPU1R5cGUgcHJvcGVydHlDcmVhdG9yOworICAgIE9TVHlwZSBwcm9wZXJ0eVRhZzsKICNpZm5kZWYgUmVtb3ZlQ29udHJvbFByb3BlcnR5Ci0JUHlNYWNfUFJFQ0hFQ0soUmVtb3ZlQ29udHJvbFByb3BlcnR5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhSZW1vdmVDb250cm9sUHJvcGVydHkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnByb3BlcnR5Q3JlYXRvciwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcHJvcGVydHlUYWcpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUmVtb3ZlQ29udHJvbFByb3BlcnR5KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eUNyZWF0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVRhZyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnByb3BlcnR5Q3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcHJvcGVydHlUYWcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUmVtb3ZlQ29udHJvbFByb3BlcnR5KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eUNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVRhZyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0dldENvbnRyb2xQcm9wZXJ0eUF0dHJpYnV0ZXMoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlPU1R5cGUgcHJvcGVydHlDcmVhdG9yOwotCU9TVHlwZSBwcm9wZXJ0eVRhZzsKLQlVSW50MzIgYXR0cmlidXRlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBPU1R5cGUgcHJvcGVydHlDcmVhdG9yOworICAgIE9TVHlwZSBwcm9wZXJ0eVRhZzsKKyAgICBVSW50MzIgYXR0cmlidXRlczsKICNpZm5kZWYgR2V0Q29udHJvbFByb3BlcnR5QXR0cmlidXRlcwotCVB5TWFjX1BSRUNIRUNLKEdldENvbnRyb2xQcm9wZXJ0eUF0dHJpYnV0ZXMpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldENvbnRyb2xQcm9wZXJ0eUF0dHJpYnV0ZXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnByb3BlcnR5Q3JlYXRvciwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcHJvcGVydHlUYWcpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0Q29udHJvbFByb3BlcnR5QXR0cmlidXRlcyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5Q3JlYXRvciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVRhZywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXR0cmlidXRlcyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnByb3BlcnR5Q3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcHJvcGVydHlUYWcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0Q29udHJvbFByb3BlcnR5QXR0cmlidXRlcyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5Q3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXR0cmlidXRlcyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0NoYW5nZUNvbnRyb2xQcm9wZXJ0eUF0dHJpYnV0ZXMoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlPU1R5cGUgcHJvcGVydHlDcmVhdG9yOwotCU9TVHlwZSBwcm9wZXJ0eVRhZzsKLQlVSW50MzIgYXR0cmlidXRlc1RvU2V0OwotCVVJbnQzMiBhdHRyaWJ1dGVzVG9DbGVhcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBPU1R5cGUgcHJvcGVydHlDcmVhdG9yOworICAgIE9TVHlwZSBwcm9wZXJ0eVRhZzsKKyAgICBVSW50MzIgYXR0cmlidXRlc1RvU2V0OworICAgIFVJbnQzMiBhdHRyaWJ1dGVzVG9DbGVhcjsKICNpZm5kZWYgQ2hhbmdlQ29udHJvbFByb3BlcnR5QXR0cmlidXRlcwotCVB5TWFjX1BSRUNIRUNLKENoYW5nZUNvbnRyb2xQcm9wZXJ0eUF0dHJpYnV0ZXMpOworICAgIFB5TWFjX1BSRUNIRUNLKENoYW5nZUNvbnRyb2xQcm9wZXJ0eUF0dHJpYnV0ZXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcHJvcGVydHlDcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZwcm9wZXJ0eVRhZywKLQkgICAgICAgICAgICAgICAgICAgICAgJmF0dHJpYnV0ZXNUb1NldCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmF0dHJpYnV0ZXNUb0NsZWFyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENoYW5nZUNvbnRyb2xQcm9wZXJ0eUF0dHJpYnV0ZXMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eUNyZWF0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlUYWcsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlc1RvU2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXNUb0NsZWFyKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZwcm9wZXJ0eUNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnByb3BlcnR5VGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYXR0cmlidXRlc1RvU2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYXR0cmlidXRlc1RvQ2xlYXIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ2hhbmdlQ29udHJvbFByb3BlcnR5QXR0cmlidXRlcyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5Q3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzVG9TZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlc1RvQ2xlYXIpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9HZXRDb250cm9sUmVnaW9uKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JQ29udHJvbFBhcnRDb2RlIGluUGFydDsKLQlSZ25IYW5kbGUgb3V0UmVnaW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIENvbnRyb2xQYXJ0Q29kZSBpblBhcnQ7CisgICAgUmduSGFuZGxlIG91dFJlZ2lvbjsKICNpZm5kZWYgR2V0Q29udHJvbFJlZ2lvbgotCVB5TWFjX1BSRUNIRUNLKEdldENvbnRyb2xSZWdpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKEdldENvbnRyb2xSZWdpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluUGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZvdXRSZWdpb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0Q29udHJvbFJlZ2lvbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGluUGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgICBvdXRSZWdpb24pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblBhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmb3V0UmVnaW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldENvbnRyb2xSZWdpb24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblBhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0UmVnaW9uKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0Q29udHJvbFZhcmlhbnQoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29udHJvbFZhcmlhbnQgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb250cm9sVmFyaWFudCBfcnY7CiAjaWZuZGVmIEdldENvbnRyb2xWYXJpYW50Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0Q29udHJvbFZhcmlhbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldENvbnRyb2xWYXJpYW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRDb250cm9sVmFyaWFudChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0Q29udHJvbFZhcmlhbnQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX1NldENvbnRyb2xBY3Rpb24oQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUHlPYmplY3QqIGFjdGlvblByb2M7Ci0JVW5pdmVyc2FsUHJvY1B0ciBjX2NhbGxiYWNrOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCogYWN0aW9uUHJvYzsKKyAgICBVbml2ZXJzYWxQcm9jUHRyIGNfY2FsbGJhY2s7CiAjaWZuZGVmIFNldENvbnRyb2xBY3Rpb24KLQlQeU1hY19QUkVDSEVDSyhTZXRDb250cm9sQWN0aW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRDb250cm9sQWN0aW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8iLAotCSAgICAgICAgICAgICAgICAgICAgICAmYWN0aW9uUHJvYykpCi0JCXJldHVybiBOVUxMOwotCVNldENvbnRyb2xBY3Rpb24oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgIG15YWN0aW9ucHJvY191cHApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlzZXRjYWxsYmFjaygoUHlPYmplY3QqKV9zZWxmLCBrTXlDb250cm9sQWN0aW9uUHJvY1RhZywgYWN0aW9uUHJvYywgJmNfY2FsbGJhY2spOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYWN0aW9uUHJvYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldENvbnRyb2xBY3Rpb24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgIG15YWN0aW9ucHJvY191cHApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICBzZXRjYWxsYmFjaygoUHlPYmplY3QqKV9zZWxmLCBrTXlDb250cm9sQWN0aW9uUHJvY1RhZywgYWN0aW9uUHJvYywgJmNfY2FsbGJhY2spOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9TZXRDb250cm9sUmVmZXJlbmNlKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVNJbnQzMiBkYXRhOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTSW50MzIgZGF0YTsKICNpZm5kZWYgU2V0Q29udHJvbFJlZmVyZW5jZQotCVB5TWFjX1BSRUNIRUNLKFNldENvbnRyb2xSZWZlcmVuY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldENvbnRyb2xSZWZlcmVuY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZkYXRhKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0Q29udHJvbFJlZmVyZW5jZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgZGF0YSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldENvbnRyb2xSZWZlcmVuY2UoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0Q29udHJvbFJlZmVyZW5jZShDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTSW50MzIgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTSW50MzIgX3J2OwogI2lmbmRlZiBHZXRDb250cm9sUmVmZXJlbmNlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0Q29udHJvbFJlZmVyZW5jZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0Q29udHJvbFJlZmVyZW5jZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0Q29udHJvbFJlZmVyZW5jZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0Q29udHJvbFJlZmVyZW5jZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfRW1iZWRDb250cm9sKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JQ29udHJvbEhhbmRsZSBpbkNvbnRhaW5lcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBDb250cm9sSGFuZGxlIGluQ29udGFpbmVyOwogI2lmbmRlZiBFbWJlZENvbnRyb2wKLQlQeU1hY19QUkVDSEVDSyhFbWJlZENvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKEVtYmVkQ29udHJvbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9Db252ZXJ0LCAmaW5Db250YWluZXIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRW1iZWRDb250cm9sKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICBpbkNvbnRhaW5lcik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfQ29udmVydCwgJmluQ29udGFpbmVyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEVtYmVkQ29udHJvbChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgaW5Db250YWluZXIpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9BdXRvRW1iZWRDb250cm9sKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JV2luZG93UHRyIGluV2luZG93OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFdpbmRvd1B0ciBpbldpbmRvdzsKICNpZm5kZWYgQXV0b0VtYmVkQ29udHJvbAotCVB5TWFjX1BSRUNIRUNLKEF1dG9FbWJlZENvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKEF1dG9FbWJlZENvbnRyb2wpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmluV2luZG93KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEF1dG9FbWJlZENvbnRyb2woX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICBpbldpbmRvdyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmluV2luZG93KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEF1dG9FbWJlZENvbnRyb2woX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbldpbmRvdyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0dldFN1cGVyQ29udHJvbChDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUNvbnRyb2xIYW5kbGUgb3V0UGFyZW50OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIENvbnRyb2xIYW5kbGUgb3V0UGFyZW50OwogI2lmbmRlZiBHZXRTdXBlckNvbnRyb2wKLQlQeU1hY19QUkVDSEVDSyhHZXRTdXBlckNvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFN1cGVyQ29udHJvbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldFN1cGVyQ29udHJvbChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgJm91dFBhcmVudCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9XaGljaENvbnRyb2wsIG91dFBhcmVudCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRTdXBlckNvbnRyb2woX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRQYXJlbnQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfV2hpY2hDb250cm9sLCBvdXRQYXJlbnQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9Db3VudFN1YkNvbnRyb2xzKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JVUludDE2IG91dE51bUNoaWxkcmVuOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFVJbnQxNiBvdXROdW1DaGlsZHJlbjsKICNpZm5kZWYgQ291bnRTdWJDb250cm9scwotCVB5TWFjX1BSRUNIRUNLKENvdW50U3ViQ29udHJvbHMpOworICAgIFB5TWFjX1BSRUNIRUNLKENvdW50U3ViQ29udHJvbHMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDb3VudFN1YkNvbnRyb2xzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgJm91dE51bUNoaWxkcmVuKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJIIiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXROdW1DaGlsZHJlbik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDb3VudFN1YkNvbnRyb2xzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dE51bUNoaWxkcmVuKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXROdW1DaGlsZHJlbik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0dldEluZGV4ZWRTdWJDb250cm9sKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JVUludDE2IGluSW5kZXg7Ci0JQ29udHJvbEhhbmRsZSBvdXRTdWJDb250cm9sOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFVJbnQxNiBpbkluZGV4OworICAgIENvbnRyb2xIYW5kbGUgb3V0U3ViQ29udHJvbDsKICNpZm5kZWYgR2V0SW5kZXhlZFN1YkNvbnRyb2wKLQlQeU1hY19QUkVDSEVDSyhHZXRJbmRleGVkU3ViQ29udHJvbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0SW5kZXhlZFN1YkNvbnRyb2wpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiSCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkluZGV4KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldEluZGV4ZWRTdWJDb250cm9sKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRTdWJDb250cm9sKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX1doaWNoQ29udHJvbCwgb3V0U3ViQ29udHJvbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkluZGV4KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldEluZGV4ZWRTdWJDb250cm9sKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRTdWJDb250cm9sKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX1doaWNoQ29udHJvbCwgb3V0U3ViQ29udHJvbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX1NldENvbnRyb2xTdXBlcnZpc29yKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JQ29udHJvbEhhbmRsZSBpbkJvc3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgQ29udHJvbEhhbmRsZSBpbkJvc3M7CiAjaWZuZGVmIFNldENvbnRyb2xTdXBlcnZpc29yCi0JUHlNYWNfUFJFQ0hFQ0soU2V0Q29udHJvbFN1cGVydmlzb3IpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldENvbnRyb2xTdXBlcnZpc29yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX0NvbnZlcnQsICZpbkJvc3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0Q29udHJvbFN1cGVydmlzb3IoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Cb3NzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9Db252ZXJ0LCAmaW5Cb3NzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldENvbnRyb2xTdXBlcnZpc29yKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQm9zcyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0dldENvbnRyb2xGZWF0dXJlcyhDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVVJbnQzMiBvdXRGZWF0dXJlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBVSW50MzIgb3V0RmVhdHVyZXM7CiAjaWZuZGVmIEdldENvbnRyb2xGZWF0dXJlcwotCVB5TWFjX1BSRUNIRUNLKEdldENvbnRyb2xGZWF0dXJlcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0Q29udHJvbEZlYXR1cmVzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0Q29udHJvbEZlYXR1cmVzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0RmVhdHVyZXMpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIG91dEZlYXR1cmVzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldENvbnRyb2xGZWF0dXJlcyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEZlYXR1cmVzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRGZWF0dXJlcyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0dldENvbnRyb2xEYXRhU2l6ZShDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUNvbnRyb2xQYXJ0Q29kZSBpblBhcnQ7Ci0JUmVzVHlwZSBpblRhZ05hbWU7Ci0JU2l6ZSBvdXRNYXhTaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIENvbnRyb2xQYXJ0Q29kZSBpblBhcnQ7CisgICAgUmVzVHlwZSBpblRhZ05hbWU7CisgICAgU2l6ZSBvdXRNYXhTaXplOwogI2lmbmRlZiBHZXRDb250cm9sRGF0YVNpemUKLQlQeU1hY19QUkVDSEVDSyhHZXRDb250cm9sRGF0YVNpemUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldENvbnRyb2xEYXRhU2l6ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5QYXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpblRhZ05hbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0Q29udHJvbERhdGFTaXplKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBpblBhcnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBpblRhZ05hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0TWF4U2l6ZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0TWF4U2l6ZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluUGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaW5UYWdOYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldENvbnRyb2xEYXRhU2l6ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5QYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5UYWdOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dE1heFNpemUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dE1heFNpemUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9IYW5kbGVDb250cm9sRHJhZ1RyYWNraW5nKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JRHJhZ1RyYWNraW5nTWVzc2FnZSBpbk1lc3NhZ2U7Ci0JRHJhZ1JlZmVyZW5jZSBpbkRyYWc7Ci0JQm9vbGVhbiBvdXRMaWtlc0RyYWc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgRHJhZ1RyYWNraW5nTWVzc2FnZSBpbk1lc3NhZ2U7CisgICAgRHJhZ1JlZmVyZW5jZSBpbkRyYWc7CisgICAgQm9vbGVhbiBvdXRMaWtlc0RyYWc7CiAjaWZuZGVmIEhhbmRsZUNvbnRyb2xEcmFnVHJhY2tpbmcKLQlQeU1hY19QUkVDSEVDSyhIYW5kbGVDb250cm9sRHJhZ1RyYWNraW5nKTsKKyAgICBQeU1hY19QUkVDSEVDSyhIYW5kbGVDb250cm9sRHJhZ1RyYWNraW5nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbk1lc3NhZ2UsCi0JICAgICAgICAgICAgICAgICAgICAgIERyYWdPYmpfQ29udmVydCwgJmluRHJhZykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBIYW5kbGVDb250cm9sRHJhZ1RyYWNraW5nKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5NZXNzYWdlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRHJhZywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0TGlrZXNEcmFnKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRMaWtlc0RyYWcpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbk1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERyYWdPYmpfQ29udmVydCwgJmluRHJhZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBIYW5kbGVDb250cm9sRHJhZ1RyYWNraW5nKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5NZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRHJhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0TGlrZXNEcmFnKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRMaWtlc0RyYWcpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9IYW5kbGVDb250cm9sRHJhZ1JlY2VpdmUoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlEcmFnUmVmZXJlbmNlIGluRHJhZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBEcmFnUmVmZXJlbmNlIGluRHJhZzsKICNpZm5kZWYgSGFuZGxlQ29udHJvbERyYWdSZWNlaXZlCi0JUHlNYWNfUFJFQ0hFQ0soSGFuZGxlQ29udHJvbERyYWdSZWNlaXZlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhIYW5kbGVDb250cm9sRHJhZ1JlY2VpdmUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBEcmFnT2JqX0NvbnZlcnQsICZpbkRyYWcpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gSGFuZGxlQ29udHJvbERyYWdSZWNlaXZlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkRyYWcpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRHJhZ09ial9Db252ZXJ0LCAmaW5EcmFnKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEhhbmRsZUNvbnRyb2xEcmFnUmVjZWl2ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5EcmFnKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfU2V0Q29udHJvbERyYWdUcmFja2luZ0VuYWJsZWQoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlCb29sZWFuIGluVHJhY2tzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIEJvb2xlYW4gaW5UcmFja3M7CiAjaWZuZGVmIFNldENvbnRyb2xEcmFnVHJhY2tpbmdFbmFibGVkCi0JUHlNYWNfUFJFQ0hFQ0soU2V0Q29udHJvbERyYWdUcmFja2luZ0VuYWJsZWQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldENvbnRyb2xEcmFnVHJhY2tpbmdFbmFibGVkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5UcmFja3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0Q29udHJvbERyYWdUcmFja2luZ0VuYWJsZWQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5UcmFja3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5UcmFja3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0Q29udHJvbERyYWdUcmFja2luZ0VuYWJsZWQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5UcmFja3MpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9Jc0NvbnRyb2xEcmFnVHJhY2tpbmdFbmFibGVkKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JQm9vbGVhbiBvdXRUcmFja3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgQm9vbGVhbiBvdXRUcmFja3M7CiAjaWZuZGVmIElzQ29udHJvbERyYWdUcmFja2luZ0VuYWJsZWQKLQlQeU1hY19QUkVDSEVDSyhJc0NvbnRyb2xEcmFnVHJhY2tpbmdFbmFibGVkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhJc0NvbnRyb2xEcmFnVHJhY2tpbmdFbmFibGVkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gSXNDb250cm9sRHJhZ1RyYWNraW5nRW5hYmxlZChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRUcmFja3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIG91dFRyYWNrcyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBJc0NvbnRyb2xEcmFnVHJhY2tpbmdFbmFibGVkKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFRyYWNrcyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0VHJhY2tzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0Q29udHJvbEJvdW5kcyhDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZWN0IGJvdW5kczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmVjdCBib3VuZHM7CiAjaWZuZGVmIEdldENvbnRyb2xCb3VuZHMKLQlQeU1hY19QUkVDSEVDSyhHZXRDb250cm9sQm91bmRzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRDb250cm9sQm91bmRzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlHZXRDb250cm9sQm91bmRzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAmYm91bmRzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmJvdW5kcyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldENvbnRyb2xCb3VuZHMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICZib3VuZHMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmYm91bmRzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfSXNDb250cm9sSGlsaXRlZChDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CiAjaWZuZGVmIElzQ29udHJvbEhpbGl0ZWQKLQlQeU1hY19QUkVDSEVDSyhJc0NvbnRyb2xIaWxpdGVkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhJc0NvbnRyb2xIaWxpdGVkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBJc0NvbnRyb2xIaWxpdGVkKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBJc0NvbnRyb2xIaWxpdGVkKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9HZXRDb250cm9sSGlsaXRlKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVVJbnQxNiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFVJbnQxNiBfcnY7CiAjaWZuZGVmIEdldENvbnRyb2xIaWxpdGUKLQlQeU1hY19QUkVDSEVDSyhHZXRDb250cm9sSGlsaXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRDb250cm9sSGlsaXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRDb250cm9sSGlsaXRlKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJIIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRDb250cm9sSGlsaXRlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9HZXRDb250cm9sT3duZXIoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JV2luZG93UHRyIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgV2luZG93UHRyIF9ydjsKICNpZm5kZWYgR2V0Q29udHJvbE93bmVyCi0JUHlNYWNfUFJFQ0hFQ0soR2V0Q29udHJvbE93bmVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRDb250cm9sT3duZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldENvbnRyb2xPd25lcihfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldENvbnRyb2xPd25lcihfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0dldENvbnRyb2xEYXRhSGFuZGxlKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUhhbmRsZSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEhhbmRsZSBfcnY7CiAjaWZuZGVmIEdldENvbnRyb2xEYXRhSGFuZGxlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0Q29udHJvbERhdGFIYW5kbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldENvbnRyb2xEYXRhSGFuZGxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRDb250cm9sRGF0YUhhbmRsZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldENvbnRyb2xEYXRhSGFuZGxlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0Q29udHJvbFBvcHVwTWVudUhhbmRsZShDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlNZW51SGFuZGxlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgTWVudUhhbmRsZSBfcnY7CiAjaWZuZGVmIEdldENvbnRyb2xQb3B1cE1lbnVIYW5kbGUKLQlQeU1hY19QUkVDSEVDSyhHZXRDb250cm9sUG9wdXBNZW51SGFuZGxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRDb250cm9sUG9wdXBNZW51SGFuZGxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRDb250cm9sUG9wdXBNZW51SGFuZGxlKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgTWVudU9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldENvbnRyb2xQb3B1cE1lbnVIYW5kbGUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBNZW51T2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0Q29udHJvbFBvcHVwTWVudUlEKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgX3J2OwogI2lmbmRlZiBHZXRDb250cm9sUG9wdXBNZW51SUQKLQlQeU1hY19QUkVDSEVDSyhHZXRDb250cm9sUG9wdXBNZW51SUQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldENvbnRyb2xQb3B1cE1lbnVJRCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0Q29udHJvbFBvcHVwTWVudUlEKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRDb250cm9sUG9wdXBNZW51SUQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX1NldENvbnRyb2xEYXRhSGFuZGxlKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUhhbmRsZSBkYXRhSGFuZGxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBIYW5kbGUgZGF0YUhhbmRsZTsKICNpZm5kZWYgU2V0Q29udHJvbERhdGFIYW5kbGUKLQlQeU1hY19QUkVDSEVDSyhTZXRDb250cm9sRGF0YUhhbmRsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0Q29udHJvbERhdGFIYW5kbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFIYW5kbGUpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRDb250cm9sRGF0YUhhbmRsZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgIGRhdGFIYW5kbGUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YUhhbmRsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldENvbnRyb2xEYXRhSGFuZGxlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUhhbmRsZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9TZXRDb250cm9sQm91bmRzKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3QgYm91bmRzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IGJvdW5kczsKICNpZm5kZWYgU2V0Q29udHJvbEJvdW5kcwotCVB5TWFjX1BSRUNIRUNLKFNldENvbnRyb2xCb3VuZHMpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldENvbnRyb2xCb3VuZHMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0Q29udHJvbEJvdW5kcyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgJmJvdW5kcyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldENvbnRyb2xCb3VuZHMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICZib3VuZHMpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfU2V0Q29udHJvbFBvcHVwTWVudUhhbmRsZShDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlNZW51SGFuZGxlIHBvcHVwTWVudTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgTWVudUhhbmRsZSBwb3B1cE1lbnU7CiAjaWZuZGVmIFNldENvbnRyb2xQb3B1cE1lbnVIYW5kbGUKLQlQeU1hY19QUkVDSEVDSyhTZXRDb250cm9sUG9wdXBNZW51SGFuZGxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRDb250cm9sUG9wdXBNZW51SGFuZGxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgTWVudU9ial9Db252ZXJ0LCAmcG9wdXBNZW51KSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0Q29udHJvbFBvcHVwTWVudUhhbmRsZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgcG9wdXBNZW51KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBNZW51T2JqX0NvbnZlcnQsICZwb3B1cE1lbnUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRDb250cm9sUG9wdXBNZW51SGFuZGxlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3B1cE1lbnUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfU2V0Q29udHJvbFBvcHVwTWVudUlEKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IG1lbnVJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgbWVudUlEOwogI2lmbmRlZiBTZXRDb250cm9sUG9wdXBNZW51SUQKLQlQeU1hY19QUkVDSEVDSyhTZXRDb250cm9sUG9wdXBNZW51SUQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldENvbnRyb2xQb3B1cE1lbnVJRCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1lbnVJRCkpCi0JCXJldHVybiBOVUxMOwotCVNldENvbnRyb2xQb3B1cE1lbnVJRChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICBtZW51SUQpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lbnVJRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldENvbnRyb2xQb3B1cE1lbnVJRChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtZW51SUQpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0QmV2ZWxCdXR0b25NZW51VmFsdWUoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlTSW50MTYgb3V0VmFsdWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU0ludDE2IG91dFZhbHVlOwogI2lmbmRlZiBHZXRCZXZlbEJ1dHRvbk1lbnVWYWx1ZQotCVB5TWFjX1BSRUNIRUNLKEdldEJldmVsQnV0dG9uTWVudVZhbHVlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRCZXZlbEJ1dHRvbk1lbnVWYWx1ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldEJldmVsQnV0dG9uTWVudVZhbHVlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRWYWx1ZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0VmFsdWUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0QmV2ZWxCdXR0b25NZW51VmFsdWUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFZhbHVlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRWYWx1ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX1NldEJldmVsQnV0dG9uTWVudVZhbHVlKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU0ludDE2IGluVmFsdWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU0ludDE2IGluVmFsdWU7CiAjaWZuZGVmIFNldEJldmVsQnV0dG9uTWVudVZhbHVlCi0JUHlNYWNfUFJFQ0hFQ0soU2V0QmV2ZWxCdXR0b25NZW51VmFsdWUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldEJldmVsQnV0dG9uTWVudVZhbHVlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5WYWx1ZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRCZXZlbEJ1dHRvbk1lbnVWYWx1ZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblZhbHVlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluVmFsdWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0QmV2ZWxCdXR0b25NZW51VmFsdWUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5WYWx1ZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0dldEJldmVsQnV0dG9uTWVudUhhbmRsZShDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCU1lbnVIYW5kbGUgb3V0SGFuZGxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIE1lbnVIYW5kbGUgb3V0SGFuZGxlOwogI2lmbmRlZiBHZXRCZXZlbEJ1dHRvbk1lbnVIYW5kbGUKLQlQeU1hY19QUkVDSEVDSyhHZXRCZXZlbEJ1dHRvbk1lbnVIYW5kbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldEJldmVsQnV0dG9uTWVudUhhbmRsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldEJldmVsQnV0dG9uTWVudUhhbmRsZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEhhbmRsZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIE1lbnVPYmpfTmV3LCBvdXRIYW5kbGUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0QmV2ZWxCdXR0b25NZW51SGFuZGxlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0SGFuZGxlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgTWVudU9ial9OZXcsIG91dEhhbmRsZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX1NldEJldmVsQnV0dG9uQ29udGVudEluZm8oQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlDb250cm9sQnV0dG9uQ29udGVudEluZm8gaW5Db250ZW50OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIENvbnRyb2xCdXR0b25Db250ZW50SW5mbyBpbkNvbnRlbnQ7CiAjaWZuZGVmIFNldEJldmVsQnV0dG9uQ29udGVudEluZm8KLQlQeU1hY19QUkVDSEVDSyhTZXRCZXZlbEJ1dHRvbkNvbnRlbnRJbmZvKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRCZXZlbEJ1dHRvbkNvbnRlbnRJbmZvKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvX0NvbnZlcnQsICZpbkNvbnRlbnQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0QmV2ZWxCdXR0b25Db250ZW50SW5mbyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkNvbnRlbnQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvX0NvbnZlcnQsICZpbkNvbnRlbnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0QmV2ZWxCdXR0b25Db250ZW50SW5mbyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkNvbnRlbnQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9TZXRCZXZlbEJ1dHRvblRyYW5zZm9ybShDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUljb25UcmFuc2Zvcm1UeXBlIHRyYW5zZm9ybTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBJY29uVHJhbnNmb3JtVHlwZSB0cmFuc2Zvcm07CiAjaWZuZGVmIFNldEJldmVsQnV0dG9uVHJhbnNmb3JtCi0JUHlNYWNfUFJFQ0hFQ0soU2V0QmV2ZWxCdXR0b25UcmFuc2Zvcm0pOworICAgIFB5TWFjX1BSRUNIRUNLKFNldEJldmVsQnV0dG9uVHJhbnNmb3JtKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdHJhbnNmb3JtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldEJldmVsQnV0dG9uVHJhbnNmb3JtKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFuc2Zvcm0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0QmV2ZWxCdXR0b25UcmFuc2Zvcm0oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfU2V0RGlzY2xvc3VyZVRyaWFuZ2xlTGFzdFZhbHVlKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU0ludDE2IGluVmFsdWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU0ludDE2IGluVmFsdWU7CiAjaWZuZGVmIFNldERpc2Nsb3N1cmVUcmlhbmdsZUxhc3RWYWx1ZQotCVB5TWFjX1BSRUNIRUNLKFNldERpc2Nsb3N1cmVUcmlhbmdsZUxhc3RWYWx1ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0RGlzY2xvc3VyZVRyaWFuZ2xlTGFzdFZhbHVlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5WYWx1ZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXREaXNjbG9zdXJlVHJpYW5nbGVMYXN0VmFsdWUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluVmFsdWUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5WYWx1ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXREaXNjbG9zdXJlVHJpYW5nbGVMYXN0VmFsdWUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluVmFsdWUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9HZXRUYWJDb250ZW50UmVjdChDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVJlY3Qgb3V0Q29udGVudFJlY3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgUmVjdCBvdXRDb250ZW50UmVjdDsKICNpZm5kZWYgR2V0VGFiQ29udGVudFJlY3QKLQlQeU1hY19QUkVDSEVDSyhHZXRUYWJDb250ZW50UmVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VGFiQ29udGVudFJlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRUYWJDb250ZW50UmVjdChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udGVudFJlY3QpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZvdXRDb250ZW50UmVjdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRUYWJDb250ZW50UmVjdChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udGVudFJlY3QpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZvdXRDb250ZW50UmVjdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX1NldFRhYkVuYWJsZWQoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlTSW50MTYgaW5UYWJUb0hpbGl0ZTsKLQlCb29sZWFuIGluRW5hYmxlZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTSW50MTYgaW5UYWJUb0hpbGl0ZTsKKyAgICBCb29sZWFuIGluRW5hYmxlZDsKICNpZm5kZWYgU2V0VGFiRW5hYmxlZAotCVB5TWFjX1BSRUNIRUNLKFNldFRhYkVuYWJsZWQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFRhYkVuYWJsZWQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5UYWJUb0hpbGl0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluRW5hYmxlZCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRUYWJFbmFibGVkKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgaW5UYWJUb0hpbGl0ZSwKLQkgICAgICAgICAgICAgICAgICAgICBpbkVuYWJsZWQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluVGFiVG9IaWxpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkVuYWJsZWQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0VGFiRW5hYmxlZChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgIGluVGFiVG9IaWxpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW5FbmFibGVkKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfU2V0SW1hZ2VXZWxsQ29udGVudEluZm8oQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlDb250cm9sQnV0dG9uQ29udGVudEluZm8gaW5Db250ZW50OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIENvbnRyb2xCdXR0b25Db250ZW50SW5mbyBpbkNvbnRlbnQ7CiAjaWZuZGVmIFNldEltYWdlV2VsbENvbnRlbnRJbmZvCi0JUHlNYWNfUFJFQ0hFQ0soU2V0SW1hZ2VXZWxsQ29udGVudEluZm8pOworICAgIFB5TWFjX1BSRUNIRUNLKFNldEltYWdlV2VsbENvbnRlbnRJbmZvKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvX0NvbnZlcnQsICZpbkNvbnRlbnQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0SW1hZ2VXZWxsQ29udGVudEluZm8oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQ29udGVudCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sQnV0dG9uQ29udGVudEluZm9fQ29udmVydCwgJmluQ29udGVudCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRJbWFnZVdlbGxDb250ZW50SW5mbyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Db250ZW50KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfU2V0SW1hZ2VXZWxsVHJhbnNmb3JtKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSWNvblRyYW5zZm9ybVR5cGUgaW5UcmFuc2Zvcm07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSWNvblRyYW5zZm9ybVR5cGUgaW5UcmFuc2Zvcm07CiAjaWZuZGVmIFNldEltYWdlV2VsbFRyYW5zZm9ybQotCVB5TWFjX1BSRUNIRUNLKFNldEltYWdlV2VsbFRyYW5zZm9ybSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0SW1hZ2VXZWxsVHJhbnNmb3JtKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5UcmFuc2Zvcm0pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0SW1hZ2VXZWxsVHJhbnNmb3JtKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblRyYW5zZm9ybSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblRyYW5zZm9ybSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRJbWFnZVdlbGxUcmFuc2Zvcm0oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluVHJhbnNmb3JtKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0RGF0YUJyb3dzZXJWaWV3U3R5bGUoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlPU1R5cGUgc3R5bGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgT1NUeXBlIHN0eWxlOwogI2lmbmRlZiBHZXREYXRhQnJvd3NlclZpZXdTdHlsZQotCVB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VyVmlld1N0eWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXREYXRhQnJvd3NlclZpZXdTdHlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldERhdGFCcm93c2VyVmlld1N0eWxlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHlsZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBzdHlsZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXREYXRhQnJvd3NlclZpZXdTdHlsZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3R5bGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgc3R5bGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9TZXREYXRhQnJvd3NlclZpZXdTdHlsZShDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCU9TVHlwZSBzdHlsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBPU1R5cGUgc3R5bGU7CiAjaWZuZGVmIFNldERhdGFCcm93c2VyVmlld1N0eWxlCi0JUHlNYWNfUFJFQ0hFQ0soU2V0RGF0YUJyb3dzZXJWaWV3U3R5bGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldERhdGFCcm93c2VyVmlld1N0eWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmc3R5bGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0RGF0YUJyb3dzZXJWaWV3U3R5bGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmc3R5bGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0RGF0YUJyb3dzZXJWaWV3U3R5bGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9FbmFibGVEYXRhQnJvd3NlckVkaXRDb21tYW5kKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCVVJbnQzMiBjb21tYW5kOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBVSW50MzIgY29tbWFuZDsKICNpZm5kZWYgRW5hYmxlRGF0YUJyb3dzZXJFZGl0Q29tbWFuZAotCVB5TWFjX1BSRUNIRUNLKEVuYWJsZURhdGFCcm93c2VyRWRpdENvbW1hbmQpOworICAgIFB5TWFjX1BSRUNIRUNLKEVuYWJsZURhdGFCcm93c2VyRWRpdENvbW1hbmQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZjb21tYW5kKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRW5hYmxlRGF0YUJyb3dzZXJFZGl0Q29tbWFuZChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjb21tYW5kKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRW5hYmxlRGF0YUJyb3dzZXJFZGl0Q29tbWFuZChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0V4ZWN1dGVEYXRhQnJvd3NlckVkaXRDb21tYW5kKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVUludDMyIGNvbW1hbmQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVUludDMyIGNvbW1hbmQ7CiAjaWZuZGVmIEV4ZWN1dGVEYXRhQnJvd3NlckVkaXRDb21tYW5kCi0JUHlNYWNfUFJFQ0hFQ0soRXhlY3V0ZURhdGFCcm93c2VyRWRpdENvbW1hbmQpOworICAgIFB5TWFjX1BSRUNIRUNLKEV4ZWN1dGVEYXRhQnJvd3NlckVkaXRDb21tYW5kKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmY29tbWFuZCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBFeGVjdXRlRGF0YUJyb3dzZXJFZGl0Q29tbWFuZChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbW1hbmQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRXhlY3V0ZURhdGFCcm93c2VyRWRpdENvbW1hbmQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0dldERhdGFCcm93c2VyU2VsZWN0aW9uQW5jaG9yKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVUludDMyIGZpcnN0OwotCVVJbnQzMiBsYXN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQzMiBmaXJzdDsKKyAgICBVSW50MzIgbGFzdDsKICNpZm5kZWYgR2V0RGF0YUJyb3dzZXJTZWxlY3Rpb25BbmNob3IKLQlQeU1hY19QUkVDSEVDSyhHZXREYXRhQnJvd3NlclNlbGVjdGlvbkFuY2hvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJTZWxlY3Rpb25BbmNob3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXREYXRhQnJvd3NlclNlbGVjdGlvbkFuY2hvcihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlyc3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsYXN0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgZmlyc3QsCi0JICAgICAgICAgICAgICAgICAgICAgbGFzdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXREYXRhQnJvd3NlclNlbGVjdGlvbkFuY2hvcihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsYXN0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX01vdmVEYXRhQnJvd3NlclNlbGVjdGlvbkFuY2hvcihDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVVJbnQzMiBkaXJlY3Rpb247Ci0JQm9vbGVhbiBleHRlbmRTZWxlY3Rpb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVUludDMyIGRpcmVjdGlvbjsKKyAgICBCb29sZWFuIGV4dGVuZFNlbGVjdGlvbjsKICNpZm5kZWYgTW92ZURhdGFCcm93c2VyU2VsZWN0aW9uQW5jaG9yCi0JUHlNYWNfUFJFQ0hFQ0soTW92ZURhdGFCcm93c2VyU2VsZWN0aW9uQW5jaG9yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNb3ZlRGF0YUJyb3dzZXJTZWxlY3Rpb25BbmNob3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGlyZWN0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAmZXh0ZW5kU2VsZWN0aW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IE1vdmVEYXRhQnJvd3NlclNlbGVjdGlvbkFuY2hvcihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5kU2VsZWN0aW9uKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkaXJlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZleHRlbmRTZWxlY3Rpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gTW92ZURhdGFCcm93c2VyU2VsZWN0aW9uQW5jaG9yKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbmRTZWxlY3Rpb24pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9PcGVuRGF0YUJyb3dzZXJDb250YWluZXIoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MzIgY29udGFpbmVyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQzMiBjb250YWluZXI7CiAjaWZuZGVmIE9wZW5EYXRhQnJvd3NlckNvbnRhaW5lcgotCVB5TWFjX1BSRUNIRUNLKE9wZW5EYXRhQnJvd3NlckNvbnRhaW5lcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soT3BlbkRhdGFCcm93c2VyQ29udGFpbmVyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmY29udGFpbmVyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IE9wZW5EYXRhQnJvd3NlckNvbnRhaW5lcihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbnRhaW5lcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBPcGVuRGF0YUJyb3dzZXJDb250YWluZXIoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0Nsb3NlRGF0YUJyb3dzZXJDb250YWluZXIoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MzIgY29udGFpbmVyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQzMiBjb250YWluZXI7CiAjaWZuZGVmIENsb3NlRGF0YUJyb3dzZXJDb250YWluZXIKLQlQeU1hY19QUkVDSEVDSyhDbG9zZURhdGFCcm93c2VyQ29udGFpbmVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDbG9zZURhdGFCcm93c2VyQ29udGFpbmVyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmY29udGFpbmVyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENsb3NlRGF0YUJyb3dzZXJDb250YWluZXIoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXIpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY29udGFpbmVyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENsb3NlRGF0YUJyb3dzZXJDb250YWluZXIoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXIpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9Tb3J0RGF0YUJyb3dzZXJDb250YWluZXIoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MzIgY29udGFpbmVyOwotCUJvb2xlYW4gc29ydENoaWxkcmVuOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQzMiBjb250YWluZXI7CisgICAgQm9vbGVhbiBzb3J0Q2hpbGRyZW47CiAjaWZuZGVmIFNvcnREYXRhQnJvd3NlckNvbnRhaW5lcgotCVB5TWFjX1BSRUNIRUNLKFNvcnREYXRhQnJvd3NlckNvbnRhaW5lcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU29ydERhdGFCcm93c2VyQ29udGFpbmVyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNvcnRDaGlsZHJlbikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTb3J0RGF0YUJyb3dzZXJDb250YWluZXIoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRDaGlsZHJlbik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY29udGFpbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc29ydENoaWxkcmVuKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNvcnREYXRhQnJvd3NlckNvbnRhaW5lcihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ydENoaWxkcmVuKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0RGF0YUJyb3dzZXJJdGVtcyhDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVVJbnQzMiBjb250YWluZXI7Ci0JQm9vbGVhbiByZWN1cnNlOwotCVVJbnQzMiBzdGF0ZTsKLQlIYW5kbGUgaXRlbXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVUludDMyIGNvbnRhaW5lcjsKKyAgICBCb29sZWFuIHJlY3Vyc2U7CisgICAgVUludDMyIHN0YXRlOworICAgIEhhbmRsZSBpdGVtczsKICNpZm5kZWYgR2V0RGF0YUJyb3dzZXJJdGVtcwotCVB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VySXRlbXMpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VySXRlbXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVjdXJzZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnN0YXRlLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJml0ZW1zKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldERhdGFCcm93c2VySXRlbXMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdXJzZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtcyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY29udGFpbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVjdXJzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJml0ZW1zKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldERhdGFCcm93c2VySXRlbXMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdXJzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtcyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0dldERhdGFCcm93c2VySXRlbUNvdW50KENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVUludDMyIGNvbnRhaW5lcjsKLQlCb29sZWFuIHJlY3Vyc2U7Ci0JVUludDMyIHN0YXRlOwotCVVJbnQzMiBudW1JdGVtczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBVSW50MzIgY29udGFpbmVyOworICAgIEJvb2xlYW4gcmVjdXJzZTsKKyAgICBVSW50MzIgc3RhdGU7CisgICAgVUludDMyIG51bUl0ZW1zOwogI2lmbmRlZiBHZXREYXRhQnJvd3Nlckl0ZW1Db3VudAotCVB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VySXRlbUNvdW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXREYXRhQnJvd3Nlckl0ZW1Db3VudCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsYmwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVjdXJzZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnN0YXRlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldERhdGFCcm93c2VySXRlbUNvdW50KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdXJzZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZudW1JdGVtcyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgbnVtSXRlbXMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjb250YWluZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWN1cnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0RGF0YUJyb3dzZXJJdGVtQ291bnQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN1cnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm51bUl0ZW1zKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBudW1JdGVtcyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0lzRGF0YUJyb3dzZXJJdGVtU2VsZWN0ZWQoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JVUludDMyIGl0ZW07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIFVJbnQzMiBpdGVtOwogI2lmbmRlZiBJc0RhdGFCcm93c2VySXRlbVNlbGVjdGVkCi0JUHlNYWNfUFJFQ0hFQ0soSXNEYXRhQnJvd3Nlckl0ZW1TZWxlY3RlZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSXNEYXRhQnJvd3Nlckl0ZW1TZWxlY3RlZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJml0ZW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBJc0RhdGFCcm93c2VySXRlbVNlbGVjdGVkKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBJc0RhdGFCcm93c2VySXRlbVNlbGVjdGVkKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0RGF0YUJyb3dzZXJJdGVtU3RhdGUoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MzIgaXRlbTsKLQlVSW50MzIgc3RhdGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVUludDMyIGl0ZW07CisgICAgVUludDMyIHN0YXRlOwogI2lmbmRlZiBHZXREYXRhQnJvd3Nlckl0ZW1TdGF0ZQotCVB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VySXRlbVN0YXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXREYXRhQnJvd3Nlckl0ZW1TdGF0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJml0ZW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0RGF0YUJyb3dzZXJJdGVtU3RhdGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXRlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBzdGF0ZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpdGVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldERhdGFCcm93c2VySXRlbVN0YXRlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGF0ZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9SZXZlYWxEYXRhQnJvd3Nlckl0ZW0oQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MzIgaXRlbTsKLQlVSW50MzIgcHJvcGVydHlJRDsKLQlVSW50OCBvcHRpb25zOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQzMiBpdGVtOworICAgIFVJbnQzMiBwcm9wZXJ0eUlEOworICAgIFVJbnQ4IG9wdGlvbnM7CiAjaWZuZGVmIFJldmVhbERhdGFCcm93c2VySXRlbQotCVB5TWFjX1BSRUNIRUNLKFJldmVhbERhdGFCcm93c2VySXRlbSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUmV2ZWFsRGF0YUJyb3dzZXJJdGVtKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmcHJvcGVydHlJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm9wdGlvbnMpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUmV2ZWFsRGF0YUJyb3dzZXJJdGVtKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJvcGVydHlJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm9wdGlvbnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUmV2ZWFsRGF0YUJyb3dzZXJJdGVtKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9TZXREYXRhQnJvd3NlckFjdGl2ZUl0ZW1zKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JQm9vbGVhbiBhY3RpdmU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgQm9vbGVhbiBhY3RpdmU7CiAjaWZuZGVmIFNldERhdGFCcm93c2VyQWN0aXZlSXRlbXMKLQlQeU1hY19QUkVDSEVDSyhTZXREYXRhQnJvd3NlckFjdGl2ZUl0ZW1zKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXREYXRhQnJvd3NlckFjdGl2ZUl0ZW1zKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmYWN0aXZlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldERhdGFCcm93c2VyQWN0aXZlSXRlbXMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYWN0aXZlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldERhdGFCcm93c2VyQWN0aXZlSXRlbXMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9HZXREYXRhQnJvd3NlckFjdGl2ZUl0ZW1zKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JQm9vbGVhbiBhY3RpdmU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgQm9vbGVhbiBhY3RpdmU7CiAjaWZuZGVmIEdldERhdGFCcm93c2VyQWN0aXZlSXRlbXMKLQlQeU1hY19QUkVDSEVDSyhHZXREYXRhQnJvd3NlckFjdGl2ZUl0ZW1zKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXREYXRhQnJvd3NlckFjdGl2ZUl0ZW1zKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0RGF0YUJyb3dzZXJBY3RpdmVJdGVtcyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhY3RpdmUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXREYXRhQnJvd3NlckFjdGl2ZUl0ZW1zKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFjdGl2ZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfU2V0RGF0YUJyb3dzZXJTY3JvbGxCYXJJbnNldChDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVJlY3QgaW5zZXRSZWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFJlY3QgaW5zZXRSZWN0OwogI2lmbmRlZiBTZXREYXRhQnJvd3NlclNjcm9sbEJhckluc2V0Ci0JUHlNYWNfUFJFQ0hFQ0soU2V0RGF0YUJyb3dzZXJTY3JvbGxCYXJJbnNldCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0RGF0YUJyb3dzZXJTY3JvbGxCYXJJbnNldCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldERhdGFCcm93c2VyU2Nyb2xsQmFySW5zZXQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5zZXRSZWN0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmaW5zZXRSZWN0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldERhdGFCcm93c2VyU2Nyb2xsQmFySW5zZXQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5zZXRSZWN0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmaW5zZXRSZWN0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0RGF0YUJyb3dzZXJTY3JvbGxCYXJJbnNldChDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVJlY3QgaW5zZXRSZWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFJlY3QgaW5zZXRSZWN0OwogI2lmbmRlZiBHZXREYXRhQnJvd3NlclNjcm9sbEJhckluc2V0Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJTY3JvbGxCYXJJbnNldCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJTY3JvbGxCYXJJbnNldCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldERhdGFCcm93c2VyU2Nyb2xsQmFySW5zZXQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5zZXRSZWN0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmaW5zZXRSZWN0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldERhdGFCcm93c2VyU2Nyb2xsQmFySW5zZXQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5zZXRSZWN0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmaW5zZXRSZWN0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfU2V0RGF0YUJyb3dzZXJUYXJnZXQoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MzIgdGFyZ2V0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQzMiB0YXJnZXQ7CiAjaWZuZGVmIFNldERhdGFCcm93c2VyVGFyZ2V0Ci0JUHlNYWNfUFJFQ0hFQ0soU2V0RGF0YUJyb3dzZXJUYXJnZXQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldERhdGFCcm93c2VyVGFyZ2V0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGFyZ2V0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldERhdGFCcm93c2VyVGFyZ2V0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0YXJnZXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0RGF0YUJyb3dzZXJUYXJnZXQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0RGF0YUJyb3dzZXJUYXJnZXQoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MzIgdGFyZ2V0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQzMiB0YXJnZXQ7CiAjaWZuZGVmIEdldERhdGFCcm93c2VyVGFyZ2V0Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJUYXJnZXQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VyVGFyZ2V0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0RGF0YUJyb3dzZXJUYXJnZXQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRhcmdldCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldERhdGFCcm93c2VyVGFyZ2V0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0YXJnZXQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX1NldERhdGFCcm93c2VyU29ydE9yZGVyKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVUludDE2IG9yZGVyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQxNiBvcmRlcjsKICNpZm5kZWYgU2V0RGF0YUJyb3dzZXJTb3J0T3JkZXIKLQlQeU1hY19QUkVDSEVDSyhTZXREYXRhQnJvd3NlclNvcnRPcmRlcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0RGF0YUJyb3dzZXJTb3J0T3JkZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiSCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZvcmRlcikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXREYXRhQnJvd3NlclNvcnRPcmRlcihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmRlcik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZvcmRlcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXREYXRhQnJvd3NlclNvcnRPcmRlcihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmRlcik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0dldERhdGFCcm93c2VyU29ydE9yZGVyKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVUludDE2IG9yZGVyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQxNiBvcmRlcjsKICNpZm5kZWYgR2V0RGF0YUJyb3dzZXJTb3J0T3JkZXIKLQlQeU1hY19QUkVDSEVDSyhHZXREYXRhQnJvd3NlclNvcnRPcmRlcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJTb3J0T3JkZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXREYXRhQnJvd3NlclNvcnRPcmRlcihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3JkZXIpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIkgiLAotCSAgICAgICAgICAgICAgICAgICAgIG9yZGVyKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldERhdGFCcm93c2VyU29ydE9yZGVyKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvcmRlcik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXIpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9TZXREYXRhQnJvd3NlclNjcm9sbFBvc2l0aW9uKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVUludDMyIHRvcDsKLQlVSW50MzIgbGVmdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBVSW50MzIgdG9wOworICAgIFVJbnQzMiBsZWZ0OwogI2lmbmRlZiBTZXREYXRhQnJvd3NlclNjcm9sbFBvc2l0aW9uCi0JUHlNYWNfUFJFQ0hFQ0soU2V0RGF0YUJyb3dzZXJTY3JvbGxQb3NpdGlvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0RGF0YUJyb3dzZXJTY3JvbGxQb3NpdGlvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0b3AsCi0JICAgICAgICAgICAgICAgICAgICAgICZsZWZ0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldERhdGFCcm93c2VyU2Nyb2xsUG9zaXRpb24oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3AsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbGVmdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXREYXRhQnJvd3NlclNjcm9sbFBvc2l0aW9uKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9HZXREYXRhQnJvd3NlclNjcm9sbFBvc2l0aW9uKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVUludDMyIHRvcDsKLQlVSW50MzIgbGVmdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBVSW50MzIgdG9wOworICAgIFVJbnQzMiBsZWZ0OwogI2lmbmRlZiBHZXREYXRhQnJvd3NlclNjcm9sbFBvc2l0aW9uCi0JUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJTY3JvbGxQb3NpdGlvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJTY3JvbGxQb3NpdGlvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldERhdGFCcm93c2VyU2Nyb2xsUG9zaXRpb24oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG9wLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsZWZ0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgdG9wLAotCSAgICAgICAgICAgICAgICAgICAgIGxlZnQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0RGF0YUJyb3dzZXJTY3JvbGxQb3NpdGlvbihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxlZnQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX1NldERhdGFCcm93c2VySGFzU2Nyb2xsQmFycyhDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUJvb2xlYW4gaG9yaXo7Ci0JQm9vbGVhbiB2ZXJ0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIEJvb2xlYW4gaG9yaXo7CisgICAgQm9vbGVhbiB2ZXJ0OwogI2lmbmRlZiBTZXREYXRhQnJvd3Nlckhhc1Njcm9sbEJhcnMKLQlQeU1hY19QUkVDSEVDSyhTZXREYXRhQnJvd3Nlckhhc1Njcm9sbEJhcnMpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldERhdGFCcm93c2VySGFzU2Nyb2xsQmFycyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZob3JpeiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZlcnQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0RGF0YUJyb3dzZXJIYXNTY3JvbGxCYXJzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3JpeiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmhvcml6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdmVydCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXREYXRhQnJvd3Nlckhhc1Njcm9sbEJhcnMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvcml6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0dldERhdGFCcm93c2VySGFzU2Nyb2xsQmFycyhDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUJvb2xlYW4gaG9yaXo7Ci0JQm9vbGVhbiB2ZXJ0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIEJvb2xlYW4gaG9yaXo7CisgICAgQm9vbGVhbiB2ZXJ0OwogI2lmbmRlZiBHZXREYXRhQnJvd3Nlckhhc1Njcm9sbEJhcnMKLQlQeU1hY19QUkVDSEVDSyhHZXREYXRhQnJvd3Nlckhhc1Njcm9sbEJhcnMpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VySGFzU2Nyb2xsQmFycyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldERhdGFCcm93c2VySGFzU2Nyb2xsQmFycyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhvcml6LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZlcnQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBob3JpeiwKLQkgICAgICAgICAgICAgICAgICAgICB2ZXJ0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldERhdGFCcm93c2VySGFzU2Nyb2xsQmFycyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhvcml6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZlcnQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBob3JpeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfU2V0RGF0YUJyb3dzZXJTb3J0UHJvcGVydHkoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MzIgcHJvcGVydHk7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVUludDMyIHByb3BlcnR5OwogI2lmbmRlZiBTZXREYXRhQnJvd3NlclNvcnRQcm9wZXJ0eQotCVB5TWFjX1BSRUNIRUNLKFNldERhdGFCcm93c2VyU29ydFByb3BlcnR5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXREYXRhQnJvd3NlclNvcnRQcm9wZXJ0eSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnByb3BlcnR5KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldERhdGFCcm93c2VyU29ydFByb3BlcnR5KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnByb3BlcnR5KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldERhdGFCcm93c2VyU29ydFByb3BlcnR5KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0RGF0YUJyb3dzZXJTb3J0UHJvcGVydHkoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MzIgcHJvcGVydHk7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVUludDMyIHByb3BlcnR5OwogI2lmbmRlZiBHZXREYXRhQnJvd3NlclNvcnRQcm9wZXJ0eQotCVB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VyU29ydFByb3BlcnR5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXREYXRhQnJvd3NlclNvcnRQcm9wZXJ0eSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldERhdGFCcm93c2VyU29ydFByb3BlcnR5KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcm9wZXJ0eSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0RGF0YUJyb3dzZXJTb3J0UHJvcGVydHkoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnByb3BlcnR5KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX1NldERhdGFCcm93c2VyU2VsZWN0aW9uRmxhZ3MoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MzIgc2VsZWN0aW9uRmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVUludDMyIHNlbGVjdGlvbkZsYWdzOwogI2lmbmRlZiBTZXREYXRhQnJvd3NlclNlbGVjdGlvbkZsYWdzCi0JUHlNYWNfUFJFQ0hFQ0soU2V0RGF0YUJyb3dzZXJTZWxlY3Rpb25GbGFncyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0RGF0YUJyb3dzZXJTZWxlY3Rpb25GbGFncyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNlbGVjdGlvbkZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldERhdGFCcm93c2VyU2VsZWN0aW9uRmxhZ3MoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25GbGFncyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzZWxlY3Rpb25GbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXREYXRhQnJvd3NlclNlbGVjdGlvbkZsYWdzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uRmxhZ3MpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9HZXREYXRhQnJvd3NlclNlbGVjdGlvbkZsYWdzKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVUludDMyIHNlbGVjdGlvbkZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQzMiBzZWxlY3Rpb25GbGFnczsKICNpZm5kZWYgR2V0RGF0YUJyb3dzZXJTZWxlY3Rpb25GbGFncwotCVB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VyU2VsZWN0aW9uRmxhZ3MpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VyU2VsZWN0aW9uRmxhZ3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXREYXRhQnJvd3NlclNlbGVjdGlvbkZsYWdzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlbGVjdGlvbkZsYWdzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25GbGFncyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXREYXRhQnJvd3NlclNlbGVjdGlvbkZsYWdzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlbGVjdGlvbkZsYWdzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25GbGFncyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX1NldERhdGFCcm93c2VyUHJvcGVydHlGbGFncyhDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVVJbnQzMiBwcm9wZXJ0eTsKLQlVSW50MzIgZmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVUludDMyIHByb3BlcnR5OworICAgIFVJbnQzMiBmbGFnczsKICNpZm5kZWYgU2V0RGF0YUJyb3dzZXJQcm9wZXJ0eUZsYWdzCi0JUHlNYWNfUFJFQ0hFQ0soU2V0RGF0YUJyb3dzZXJQcm9wZXJ0eUZsYWdzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXREYXRhQnJvd3NlclByb3BlcnR5RmxhZ3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcHJvcGVydHksCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXREYXRhQnJvd3NlclByb3BlcnR5RmxhZ3MoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnByb3BlcnR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0RGF0YUJyb3dzZXJQcm9wZXJ0eUZsYWdzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0RGF0YUJyb3dzZXJQcm9wZXJ0eUZsYWdzKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVUludDMyIHByb3BlcnR5OwotCVVJbnQzMiBmbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBVSW50MzIgcHJvcGVydHk7CisgICAgVUludDMyIGZsYWdzOwogI2lmbmRlZiBHZXREYXRhQnJvd3NlclByb3BlcnR5RmxhZ3MKLQlQeU1hY19QUkVDSEVDSyhHZXREYXRhQnJvd3NlclByb3BlcnR5RmxhZ3MpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VyUHJvcGVydHlGbGFncyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnByb3BlcnR5KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldERhdGFCcm93c2VyUHJvcGVydHlGbGFncyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnByb3BlcnR5KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldERhdGFCcm93c2VyUHJvcGVydHlGbGFncyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfU2V0RGF0YUJyb3dzZXJFZGl0VGV4dChDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUNGU3RyaW5nUmVmIHRleHQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgQ0ZTdHJpbmdSZWYgdGV4dDsKICNpZm5kZWYgU2V0RGF0YUJyb3dzZXJFZGl0VGV4dAotCVB5TWFjX1BSRUNIRUNLKFNldERhdGFCcm93c2VyRWRpdFRleHQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldERhdGFCcm93c2VyRWRpdFRleHQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdGV4dCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXREYXRhQnJvd3NlckVkaXRUZXh0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdGV4dCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXREYXRhQnJvd3NlckVkaXRUZXh0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0NvcHlEYXRhQnJvd3NlckVkaXRUZXh0KENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JQ0ZTdHJpbmdSZWYgdGV4dDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBDRlN0cmluZ1JlZiB0ZXh0OwogI2lmbmRlZiBDb3B5RGF0YUJyb3dzZXJFZGl0VGV4dAotCVB5TWFjX1BSRUNIRUNLKENvcHlEYXRhQnJvd3NlckVkaXRUZXh0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb3B5RGF0YUJyb3dzZXJFZGl0VGV4dCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENvcHlEYXRhQnJvd3NlckVkaXRUZXh0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZXh0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCB0ZXh0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENvcHlEYXRhQnJvd3NlckVkaXRUZXh0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZXh0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCB0ZXh0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0RGF0YUJyb3dzZXJFZGl0VGV4dChDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUNGTXV0YWJsZVN0cmluZ1JlZiB0ZXh0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIENGTXV0YWJsZVN0cmluZ1JlZiB0ZXh0OwogI2lmbmRlZiBHZXREYXRhQnJvd3NlckVkaXRUZXh0Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJFZGl0VGV4dCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJFZGl0VGV4dCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGTXV0YWJsZVN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdGV4dCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXREYXRhQnJvd3NlckVkaXRUZXh0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRk11dGFibGVTdHJpbmdSZWZPYmpfQ29udmVydCwgJnRleHQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0RGF0YUJyb3dzZXJFZGl0VGV4dChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9TZXREYXRhQnJvd3NlckVkaXRJdGVtKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVUludDMyIGl0ZW07Ci0JVUludDMyIHByb3BlcnR5OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQzMiBpdGVtOworICAgIFVJbnQzMiBwcm9wZXJ0eTsKICNpZm5kZWYgU2V0RGF0YUJyb3dzZXJFZGl0SXRlbQotCVB5TWFjX1BSRUNIRUNLKFNldERhdGFCcm93c2VyRWRpdEl0ZW0pOworICAgIFB5TWFjX1BSRUNIRUNLKFNldERhdGFCcm93c2VyRWRpdEl0ZW0pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnByb3BlcnR5KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldERhdGFCcm93c2VyRWRpdEl0ZW0oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJvcGVydHkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0RGF0YUJyb3dzZXJFZGl0SXRlbShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9HZXREYXRhQnJvd3NlckVkaXRJdGVtKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVUludDMyIGl0ZW07Ci0JVUludDMyIHByb3BlcnR5OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQzMiBpdGVtOworICAgIFVJbnQzMiBwcm9wZXJ0eTsKICNpZm5kZWYgR2V0RGF0YUJyb3dzZXJFZGl0SXRlbQotCVB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VyRWRpdEl0ZW0pOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VyRWRpdEl0ZW0pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXREYXRhQnJvd3NlckVkaXRJdGVtKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnByb3BlcnR5KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgaXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXREYXRhQnJvd3NlckVkaXRJdGVtKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnByb3BlcnR5KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0dldERhdGFCcm93c2VySXRlbVBhcnRCb3VuZHMoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MzIgaXRlbTsKLQlVSW50MzIgcHJvcGVydHk7Ci0JT1NUeXBlIHBhcnQ7Ci0JUmVjdCBib3VuZHM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVUludDMyIGl0ZW07CisgICAgVUludDMyIHByb3BlcnR5OworICAgIE9TVHlwZSBwYXJ0OworICAgIFJlY3QgYm91bmRzOwogI2lmbmRlZiBHZXREYXRhQnJvd3Nlckl0ZW1QYXJ0Qm91bmRzCi0JUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJJdGVtUGFydEJvdW5kcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJJdGVtUGFydEJvdW5kcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJml0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgICZwcm9wZXJ0eSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcGFydCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXREYXRhQnJvd3Nlckl0ZW1QYXJ0Qm91bmRzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHMpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZib3VuZHMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnByb3BlcnR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZwYXJ0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldERhdGFCcm93c2VySXRlbVBhcnRCb3VuZHMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kcyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmJvdW5kcyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX1JlbW92ZURhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVUludDMyIGNvbHVtbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBVSW50MzIgY29sdW1uOwogI2lmbmRlZiBSZW1vdmVEYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtbgotCVB5TWFjX1BSRUNIRUNLKFJlbW92ZURhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhSZW1vdmVEYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNvbHVtbikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBSZW1vdmVEYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY29sdW1uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFJlbW92ZURhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0dldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uQ291bnQoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MzIgbnVtQ29sdW1uczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBVSW50MzIgbnVtQ29sdW1uczsKICNpZm5kZWYgR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5Db3VudAotCVB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uQ291bnQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uQ291bnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXREYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtbkNvdW50KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm51bUNvbHVtbnMpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIG51bUNvbHVtbnMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5Db3VudChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZudW1Db2x1bW5zKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBudW1Db2x1bW5zKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdIaWxpdGVTdHlsZShDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVVJbnQzMiBoaWxpdGVTdHlsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBVSW50MzIgaGlsaXRlU3R5bGU7CiAjaWZuZGVmIFNldERhdGFCcm93c2VyVGFibGVWaWV3SGlsaXRlU3R5bGUKLQlQeU1hY19QUkVDSEVDSyhTZXREYXRhQnJvd3NlclRhYmxlVmlld0hpbGl0ZVN0eWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXREYXRhQnJvd3NlclRhYmxlVmlld0hpbGl0ZVN0eWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaGlsaXRlU3R5bGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdIaWxpdGVTdHlsZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpbGl0ZVN0eWxlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmhpbGl0ZVN0eWxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldERhdGFCcm93c2VyVGFibGVWaWV3SGlsaXRlU3R5bGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWxpdGVTdHlsZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0dldERhdGFCcm93c2VyVGFibGVWaWV3SGlsaXRlU3R5bGUoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MzIgaGlsaXRlU3R5bGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVUludDMyIGhpbGl0ZVN0eWxlOwogI2lmbmRlZiBHZXREYXRhQnJvd3NlclRhYmxlVmlld0hpbGl0ZVN0eWxlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdIaWxpdGVTdHlsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdIaWxpdGVTdHlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldERhdGFCcm93c2VyVGFibGVWaWV3SGlsaXRlU3R5bGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaGlsaXRlU3R5bGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIGhpbGl0ZVN0eWxlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldERhdGFCcm93c2VyVGFibGVWaWV3SGlsaXRlU3R5bGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaGlsaXRlU3R5bGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGhpbGl0ZVN0eWxlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdSb3dIZWlnaHQoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MTYgaGVpZ2h0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQxNiBoZWlnaHQ7CiAjaWZuZGVmIFNldERhdGFCcm93c2VyVGFibGVWaWV3Um93SGVpZ2h0Ci0JUHlNYWNfUFJFQ0hFQ0soU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdSb3dIZWlnaHQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldERhdGFCcm93c2VyVGFibGVWaWV3Um93SGVpZ2h0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIkgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaGVpZ2h0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldERhdGFCcm93c2VyVGFibGVWaWV3Um93SGVpZ2h0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZoZWlnaHQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdSb3dIZWlnaHQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdSb3dIZWlnaHQoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MTYgaGVpZ2h0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQxNiBoZWlnaHQ7CiAjaWZuZGVmIEdldERhdGFCcm93c2VyVGFibGVWaWV3Um93SGVpZ2h0Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdSb3dIZWlnaHQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VyVGFibGVWaWV3Um93SGVpZ2h0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdSb3dIZWlnaHQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhlaWdodCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiSCIsCi0JICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldERhdGFCcm93c2VyVGFibGVWaWV3Um93SGVpZ2h0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoZWlnaHQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIkgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX1NldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uV2lkdGgoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MTYgd2lkdGg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVUludDE2IHdpZHRoOwogI2lmbmRlZiBTZXREYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtbldpZHRoCi0JUHlNYWNfUFJFQ0hFQ0soU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5XaWR0aCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5XaWR0aCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJIIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJndpZHRoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uV2lkdGgoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ3aWR0aCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXREYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtbldpZHRoKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9HZXREYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtbldpZHRoKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVUludDE2IHdpZHRoOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQxNiB3aWR0aDsKICNpZm5kZWYgR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5XaWR0aAotCVB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uV2lkdGgpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uV2lkdGgpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXREYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtbldpZHRoKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJndpZHRoKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJIIiwKLQkgICAgICAgICAgICAgICAgICAgICB3aWR0aCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXREYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtbldpZHRoKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJndpZHRoKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX1NldERhdGFCcm93c2VyVGFibGVWaWV3SXRlbVJvd0hlaWdodChDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVVJbnQzMiBpdGVtOwotCVVJbnQxNiBoZWlnaHQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVUludDMyIGl0ZW07CisgICAgVUludDE2IGhlaWdodDsKICNpZm5kZWYgU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdJdGVtUm93SGVpZ2h0Ci0JUHlNYWNfUFJFQ0hFQ0soU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdJdGVtUm93SGVpZ2h0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXREYXRhQnJvd3NlclRhYmxlVmlld0l0ZW1Sb3dIZWlnaHQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibEgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmhlaWdodCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXREYXRhQnJvd3NlclRhYmxlVmlld0l0ZW1Sb3dIZWlnaHQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZoZWlnaHQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdJdGVtUm93SGVpZ2h0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdJdGVtUm93SGVpZ2h0KENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVUludDMyIGl0ZW07Ci0JVUludDE2IGhlaWdodDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBVSW50MzIgaXRlbTsKKyAgICBVSW50MTYgaGVpZ2h0OwogI2lmbmRlZiBHZXREYXRhQnJvd3NlclRhYmxlVmlld0l0ZW1Sb3dIZWlnaHQKLQlQeU1hY19QUkVDSEVDSyhHZXREYXRhQnJvd3NlclRhYmxlVmlld0l0ZW1Sb3dIZWlnaHQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VyVGFibGVWaWV3SXRlbVJvd0hlaWdodCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJml0ZW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdJdGVtUm93SGVpZ2h0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhlaWdodCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiSCIsCi0JICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdJdGVtUm93SGVpZ2h0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhlaWdodCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdOYW1lZENvbHVtbldpZHRoKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVUludDMyIGNvbHVtbjsKLQlVSW50MTYgd2lkdGg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVUludDMyIGNvbHVtbjsKKyAgICBVSW50MTYgd2lkdGg7CiAjaWZuZGVmIFNldERhdGFCcm93c2VyVGFibGVWaWV3TmFtZWRDb2x1bW5XaWR0aAotCVB5TWFjX1BSRUNIRUNLKFNldERhdGFCcm93c2VyVGFibGVWaWV3TmFtZWRDb2x1bW5XaWR0aCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdOYW1lZENvbHVtbldpZHRoKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxIIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNvbHVtbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJndpZHRoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldERhdGFCcm93c2VyVGFibGVWaWV3TmFtZWRDb2x1bW5XaWR0aChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbHVtbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJndpZHRoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldERhdGFCcm93c2VyVGFibGVWaWV3TmFtZWRDb2x1bW5XaWR0aChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9HZXREYXRhQnJvd3NlclRhYmxlVmlld05hbWVkQ29sdW1uV2lkdGgoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MzIgY29sdW1uOwotCVVJbnQxNiB3aWR0aDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBVSW50MzIgY29sdW1uOworICAgIFVJbnQxNiB3aWR0aDsKICNpZm5kZWYgR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdOYW1lZENvbHVtbldpZHRoCi0JUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdOYW1lZENvbHVtbldpZHRoKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXREYXRhQnJvd3NlclRhYmxlVmlld05hbWVkQ29sdW1uV2lkdGgpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZjb2x1bW4pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdOYW1lZENvbHVtbldpZHRoKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd2lkdGgpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIkgiLAotCSAgICAgICAgICAgICAgICAgICAgIHdpZHRoKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbHVtbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXREYXRhQnJvd3NlclRhYmxlVmlld05hbWVkQ29sdW1uV2lkdGgoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3aWR0aCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9TZXREYXRhQnJvd3NlclRhYmxlVmlld0dlb21ldHJ5KENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JQm9vbGVhbiB2YXJpYWJsZVdpZHRoQ29sdW1uczsKLQlCb29sZWFuIHZhcmlhYmxlSGVpZ2h0Um93czsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBCb29sZWFuIHZhcmlhYmxlV2lkdGhDb2x1bW5zOworICAgIEJvb2xlYW4gdmFyaWFibGVIZWlnaHRSb3dzOwogI2lmbmRlZiBTZXREYXRhQnJvd3NlclRhYmxlVmlld0dlb21ldHJ5Ci0JUHlNYWNfUFJFQ0hFQ0soU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdHZW9tZXRyeSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdHZW9tZXRyeSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2YXJpYWJsZVdpZHRoQ29sdW1ucywKLQkgICAgICAgICAgICAgICAgICAgICAgJnZhcmlhYmxlSGVpZ2h0Um93cykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXREYXRhQnJvd3NlclRhYmxlVmlld0dlb21ldHJ5KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVXaWR0aENvbHVtbnMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVIZWlnaHRSb3dzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YXJpYWJsZVdpZHRoQ29sdW1ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhcmlhYmxlSGVpZ2h0Um93cykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXREYXRhQnJvd3NlclRhYmxlVmlld0dlb21ldHJ5KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVXaWR0aENvbHVtbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVIZWlnaHRSb3dzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdHZW9tZXRyeShDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUJvb2xlYW4gdmFyaWFibGVXaWR0aENvbHVtbnM7Ci0JQm9vbGVhbiB2YXJpYWJsZUhlaWdodFJvd3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgQm9vbGVhbiB2YXJpYWJsZVdpZHRoQ29sdW1uczsKKyAgICBCb29sZWFuIHZhcmlhYmxlSGVpZ2h0Um93czsKICNpZm5kZWYgR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdHZW9tZXRyeQotCVB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VyVGFibGVWaWV3R2VvbWV0cnkpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VyVGFibGVWaWV3R2VvbWV0cnkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXREYXRhQnJvd3NlclRhYmxlVmlld0dlb21ldHJ5KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhcmlhYmxlV2lkdGhDb2x1bW5zLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YXJpYWJsZUhlaWdodFJvd3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImJiIiwKLQkgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZVdpZHRoQ29sdW1ucywKLQkgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZUhlaWdodFJvd3MpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdHZW9tZXRyeShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YXJpYWJsZVdpZHRoQ29sdW1ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFyaWFibGVIZWlnaHRSb3dzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVXaWR0aENvbHVtbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVIZWlnaHRSb3dzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdJdGVtSUQoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MzIgcm93OwotCVVJbnQzMiBpdGVtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQzMiByb3c7CisgICAgVUludDMyIGl0ZW07CiAjaWZuZGVmIEdldERhdGFCcm93c2VyVGFibGVWaWV3SXRlbUlECi0JUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdJdGVtSUQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VyVGFibGVWaWV3SXRlbUlEKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcm93KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldERhdGFCcm93c2VyVGFibGVWaWV3SXRlbUlEKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZW0pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIGl0ZW0pOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcm93KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldERhdGFCcm93c2VyVGFibGVWaWV3SXRlbUlEKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZW0pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9TZXREYXRhQnJvd3NlclRhYmxlVmlld0l0ZW1Sb3coQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MzIgaXRlbTsKLQlVSW50MzIgcm93OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQzMiBpdGVtOworICAgIFVJbnQzMiByb3c7CiAjaWZuZGVmIFNldERhdGFCcm93c2VyVGFibGVWaWV3SXRlbVJvdwotCVB5TWFjX1BSRUNIRUNLKFNldERhdGFCcm93c2VyVGFibGVWaWV3SXRlbVJvdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdJdGVtUm93KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJml0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgICZyb3cpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdJdGVtUm93KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcm93KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldERhdGFCcm93c2VyVGFibGVWaWV3SXRlbVJvdyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0dldERhdGFCcm93c2VyVGFibGVWaWV3SXRlbVJvdyhDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVVJbnQzMiBpdGVtOwotCVVJbnQzMiByb3c7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVUludDMyIGl0ZW07CisgICAgVUludDMyIHJvdzsKICNpZm5kZWYgR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdJdGVtUm93Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdJdGVtUm93KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXREYXRhQnJvd3NlclRhYmxlVmlld0l0ZW1Sb3cpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpdGVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldERhdGFCcm93c2VyVGFibGVWaWV3SXRlbVJvdyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyb3cpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIHJvdyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpdGVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldERhdGFCcm93c2VyVGFibGVWaWV3SXRlbVJvdyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyb3cpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX1NldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uUG9zaXRpb24oQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MzIgY29sdW1uOwotCVVJbnQzMiBwb3NpdGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBVSW50MzIgY29sdW1uOworICAgIFVJbnQzMiBwb3NpdGlvbjsKICNpZm5kZWYgU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5Qb3NpdGlvbgotCVB5TWFjX1BSRUNIRUNLKFNldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uUG9zaXRpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKFNldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uUG9zaXRpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmY29sdW1uLAotCSAgICAgICAgICAgICAgICAgICAgICAmcG9zaXRpb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5Qb3NpdGlvbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY29sdW1uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcG9zaXRpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5Qb3NpdGlvbihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0dldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uUG9zaXRpb24oQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MzIgY29sdW1uOwotCVVJbnQzMiBwb3NpdGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBVSW50MzIgY29sdW1uOworICAgIFVJbnQzMiBwb3NpdGlvbjsKICNpZm5kZWYgR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5Qb3NpdGlvbgotCVB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uUG9zaXRpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uUG9zaXRpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZjb2x1bW4pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5Qb3NpdGlvbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcG9zaXRpb24pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbHVtbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXREYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtblBvc2l0aW9uKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwb3NpdGlvbik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9HZXREYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtblByb3BlcnR5KENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVUludDMyIGNvbHVtbjsKLQlVSW50MzIgcHJvcGVydHk7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVUludDMyIGNvbHVtbjsKKyAgICBVSW50MzIgcHJvcGVydHk7CiAjaWZuZGVmIEdldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uUHJvcGVydHkKLQlQeU1hY19QUkVDSEVDSyhHZXREYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtblByb3BlcnR5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXREYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtblByb3BlcnR5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmY29sdW1uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uUHJvcGVydHkoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnByb3BlcnR5KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2x1bW4pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5Qcm9wZXJ0eShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJvcGVydHkpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfQXV0b1NpemVEYXRhQnJvd3Nlckxpc3RWaWV3Q29sdW1ucyhDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOwogI2lmbmRlZiBBdXRvU2l6ZURhdGFCcm93c2VyTGlzdFZpZXdDb2x1bW5zCi0JUHlNYWNfUFJFQ0hFQ0soQXV0b1NpemVEYXRhQnJvd3Nlckxpc3RWaWV3Q29sdW1ucyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQXV0b1NpemVEYXRhQnJvd3Nlckxpc3RWaWV3Q29sdW1ucyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEF1dG9TaXplRGF0YUJyb3dzZXJMaXN0Vmlld0NvbHVtbnMoX3NlbGYtPm9iX2l0c2VsZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBBdXRvU2l6ZURhdGFCcm93c2VyTGlzdFZpZXdDb2x1bW5zKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9BZGREYXRhQnJvd3Nlckxpc3RWaWV3Q29sdW1uKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JRGF0YUJyb3dzZXJMaXN0Vmlld0NvbHVtbkRlc2MgY29sdW1uRGVzYzsKLQlVSW50MzIgcG9zaXRpb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgRGF0YUJyb3dzZXJMaXN0Vmlld0NvbHVtbkRlc2MgY29sdW1uRGVzYzsKKyAgICBVSW50MzIgcG9zaXRpb247CiAjaWZuZGVmIEFkZERhdGFCcm93c2VyTGlzdFZpZXdDb2x1bW4KLQlQeU1hY19QUkVDSEVDSyhBZGREYXRhQnJvd3Nlckxpc3RWaWV3Q29sdW1uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBZGREYXRhQnJvd3Nlckxpc3RWaWV3Q29sdW1uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIERhdGFCcm93c2VyTGlzdFZpZXdDb2x1bW5EZXNjX0NvbnZlcnQsICZjb2x1bW5EZXNjLAotCSAgICAgICAgICAgICAgICAgICAgICAmcG9zaXRpb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQWRkRGF0YUJyb3dzZXJMaXN0Vmlld0NvbHVtbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2x1bW5EZXNjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhQnJvd3Nlckxpc3RWaWV3Q29sdW1uRGVzY19Db252ZXJ0LCAmY29sdW1uRGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBvc2l0aW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFkZERhdGFCcm93c2VyTGlzdFZpZXdDb2x1bW4oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29sdW1uRGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX1NldERhdGFCcm93c2VyTGlzdFZpZXdIZWFkZXJCdG5IZWlnaHQoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MTYgaGVpZ2h0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQxNiBoZWlnaHQ7CiAjaWZuZGVmIFNldERhdGFCcm93c2VyTGlzdFZpZXdIZWFkZXJCdG5IZWlnaHQKLQlQeU1hY19QUkVDSEVDSyhTZXREYXRhQnJvd3Nlckxpc3RWaWV3SGVhZGVyQnRuSGVpZ2h0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXREYXRhQnJvd3Nlckxpc3RWaWV3SGVhZGVyQnRuSGVpZ2h0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIkgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaGVpZ2h0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldERhdGFCcm93c2VyTGlzdFZpZXdIZWFkZXJCdG5IZWlnaHQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIkgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaGVpZ2h0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldERhdGFCcm93c2VyTGlzdFZpZXdIZWFkZXJCdG5IZWlnaHQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9HZXREYXRhQnJvd3Nlckxpc3RWaWV3SGVhZGVyQnRuSGVpZ2h0KENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVUludDE2IGhlaWdodDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBVSW50MTYgaGVpZ2h0OwogI2lmbmRlZiBHZXREYXRhQnJvd3Nlckxpc3RWaWV3SGVhZGVyQnRuSGVpZ2h0Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJMaXN0Vmlld0hlYWRlckJ0bkhlaWdodCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJMaXN0Vmlld0hlYWRlckJ0bkhlaWdodCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldERhdGFCcm93c2VyTGlzdFZpZXdIZWFkZXJCdG5IZWlnaHQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaGVpZ2h0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJIIiwKLQkgICAgICAgICAgICAgICAgICAgICBoZWlnaHQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0RGF0YUJyb3dzZXJMaXN0Vmlld0hlYWRlckJ0bkhlaWdodChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoZWlnaHQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIkgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX1NldERhdGFCcm93c2VyTGlzdFZpZXdVc2VQbGFpbkJhY2tncm91bmQoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlCb29sZWFuIHVzZVBsYWluQmFja2dyb3VuZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBCb29sZWFuIHVzZVBsYWluQmFja2dyb3VuZDsKICNpZm5kZWYgU2V0RGF0YUJyb3dzZXJMaXN0Vmlld1VzZVBsYWluQmFja2dyb3VuZAotCVB5TWFjX1BSRUNIRUNLKFNldERhdGFCcm93c2VyTGlzdFZpZXdVc2VQbGFpbkJhY2tncm91bmQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldERhdGFCcm93c2VyTGlzdFZpZXdVc2VQbGFpbkJhY2tncm91bmQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ1c2VQbGFpbkJhY2tncm91bmQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0RGF0YUJyb3dzZXJMaXN0Vmlld1VzZVBsYWluQmFja2dyb3VuZChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZVBsYWluQmFja2dyb3VuZCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ1c2VQbGFpbkJhY2tncm91bmQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0RGF0YUJyb3dzZXJMaXN0Vmlld1VzZVBsYWluQmFja2dyb3VuZChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZVBsYWluQmFja2dyb3VuZCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0dldERhdGFCcm93c2VyTGlzdFZpZXdVc2VQbGFpbkJhY2tncm91bmQoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlCb29sZWFuIHVzZVBsYWluQmFja2dyb3VuZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBCb29sZWFuIHVzZVBsYWluQmFja2dyb3VuZDsKICNpZm5kZWYgR2V0RGF0YUJyb3dzZXJMaXN0Vmlld1VzZVBsYWluQmFja2dyb3VuZAotCVB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VyTGlzdFZpZXdVc2VQbGFpbkJhY2tncm91bmQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VyTGlzdFZpZXdVc2VQbGFpbkJhY2tncm91bmQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXREYXRhQnJvd3Nlckxpc3RWaWV3VXNlUGxhaW5CYWNrZ3JvdW5kKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVzZVBsYWluQmFja2dyb3VuZCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgdXNlUGxhaW5CYWNrZ3JvdW5kKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldERhdGFCcm93c2VyTGlzdFZpZXdVc2VQbGFpbkJhY2tncm91bmQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdXNlUGxhaW5CYWNrZ3JvdW5kKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1c2VQbGFpbkJhY2tncm91bmQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9TZXREYXRhQnJvd3Nlckxpc3RWaWV3RGlzY2xvc3VyZUNvbHVtbihDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVVJbnQzMiBjb2x1bW47Ci0JQm9vbGVhbiBleHBhbmRhYmxlUm93czsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBVSW50MzIgY29sdW1uOworICAgIEJvb2xlYW4gZXhwYW5kYWJsZVJvd3M7CiAjaWZuZGVmIFNldERhdGFCcm93c2VyTGlzdFZpZXdEaXNjbG9zdXJlQ29sdW1uCi0JUHlNYWNfUFJFQ0hFQ0soU2V0RGF0YUJyb3dzZXJMaXN0Vmlld0Rpc2Nsb3N1cmVDb2x1bW4pOworICAgIFB5TWFjX1BSRUNIRUNLKFNldERhdGFCcm93c2VyTGlzdFZpZXdEaXNjbG9zdXJlQ29sdW1uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNvbHVtbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmV4cGFuZGFibGVSb3dzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldERhdGFCcm93c2VyTGlzdFZpZXdEaXNjbG9zdXJlQ29sdW1uKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwYW5kYWJsZVJvd3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbHVtbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmV4cGFuZGFibGVSb3dzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldERhdGFCcm93c2VyTGlzdFZpZXdEaXNjbG9zdXJlQ29sdW1uKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwYW5kYWJsZVJvd3MpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9HZXREYXRhQnJvd3Nlckxpc3RWaWV3RGlzY2xvc3VyZUNvbHVtbihDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVVJbnQzMiBjb2x1bW47Ci0JQm9vbGVhbiBleHBhbmRhYmxlUm93czsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBVSW50MzIgY29sdW1uOworICAgIEJvb2xlYW4gZXhwYW5kYWJsZVJvd3M7CiAjaWZuZGVmIEdldERhdGFCcm93c2VyTGlzdFZpZXdEaXNjbG9zdXJlQ29sdW1uCi0JUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJMaXN0Vmlld0Rpc2Nsb3N1cmVDb2x1bW4pOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VyTGlzdFZpZXdEaXNjbG9zdXJlQ29sdW1uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0RGF0YUJyb3dzZXJMaXN0Vmlld0Rpc2Nsb3N1cmVDb2x1bW4oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbHVtbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmV4cGFuZGFibGVSb3dzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsYiIsCi0JICAgICAgICAgICAgICAgICAgICAgY29sdW1uLAotCSAgICAgICAgICAgICAgICAgICAgIGV4cGFuZGFibGVSb3dzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldERhdGFCcm93c2VyTGlzdFZpZXdEaXNjbG9zdXJlQ29sdW1uKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2x1bW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZleHBhbmRhYmxlUm93cyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBleHBhbmRhYmxlUm93cyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0dldERhdGFCcm93c2VyQ29sdW1uVmlld1BhdGgoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlIYW5kbGUgcGF0aDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBIYW5kbGUgcGF0aDsKICNpZm5kZWYgR2V0RGF0YUJyb3dzZXJDb2x1bW5WaWV3UGF0aAotCVB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VyQ29sdW1uVmlld1BhdGgpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VyQ29sdW1uVmlld1BhdGgpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBhdGgpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0RGF0YUJyb3dzZXJDb2x1bW5WaWV3UGF0aChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwYXRoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldERhdGFCcm93c2VyQ29sdW1uVmlld1BhdGgoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0RGF0YUJyb3dzZXJDb2x1bW5WaWV3UGF0aExlbmd0aChDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVVJbnQzMiBwYXRoTGVuZ3RoOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQzMiBwYXRoTGVuZ3RoOwogI2lmbmRlZiBHZXREYXRhQnJvd3NlckNvbHVtblZpZXdQYXRoTGVuZ3RoCi0JUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJDb2x1bW5WaWV3UGF0aExlbmd0aCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJDb2x1bW5WaWV3UGF0aExlbmd0aCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldERhdGFCcm93c2VyQ29sdW1uVmlld1BhdGhMZW5ndGgoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGF0aExlbmd0aCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgcGF0aExlbmd0aCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXREYXRhQnJvd3NlckNvbHVtblZpZXdQYXRoTGVuZ3RoKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhdGhMZW5ndGgpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhMZW5ndGgpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9TZXREYXRhQnJvd3NlckNvbHVtblZpZXdEaXNwbGF5VHlwZShDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCU9TVHlwZSBwcm9wZXJ0eVR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgT1NUeXBlIHByb3BlcnR5VHlwZTsKICNpZm5kZWYgU2V0RGF0YUJyb3dzZXJDb2x1bW5WaWV3RGlzcGxheVR5cGUKLQlQeU1hY19QUkVDSEVDSyhTZXREYXRhQnJvd3NlckNvbHVtblZpZXdEaXNwbGF5VHlwZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0RGF0YUJyb3dzZXJDb2x1bW5WaWV3RGlzcGxheVR5cGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZwcm9wZXJ0eVR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0RGF0YUJyb3dzZXJDb2x1bW5WaWV3RGlzcGxheVR5cGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlUeXBlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnByb3BlcnR5VHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXREYXRhQnJvd3NlckNvbHVtblZpZXdEaXNwbGF5VHlwZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVR5cGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9HZXREYXRhQnJvd3NlckNvbHVtblZpZXdEaXNwbGF5VHlwZShDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCU9TVHlwZSBwcm9wZXJ0eVR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgT1NUeXBlIHByb3BlcnR5VHlwZTsKICNpZm5kZWYgR2V0RGF0YUJyb3dzZXJDb2x1bW5WaWV3RGlzcGxheVR5cGUKLQlQeU1hY19QUkVDSEVDSyhHZXREYXRhQnJvd3NlckNvbHVtblZpZXdEaXNwbGF5VHlwZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJDb2x1bW5WaWV3RGlzcGxheVR5cGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXREYXRhQnJvd3NlckNvbHVtblZpZXdEaXNwbGF5VHlwZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJvcGVydHlUeXBlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIHByb3BlcnR5VHlwZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXREYXRhQnJvd3NlckNvbHVtblZpZXdEaXNwbGF5VHlwZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJvcGVydHlUeXBlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIHByb3BlcnR5VHlwZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX2FzX1Jlc291cmNlKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUhhbmRsZSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEhhbmRsZSBfcnY7CiAjaWZuZGVmIGFzX1Jlc291cmNlCi0JUHlNYWNfUFJFQ0hFQ0soYXNfUmVzb3VyY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKGFzX1Jlc291cmNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBhc19SZXNvdXJjZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IGFzX1Jlc291cmNlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0Q29udHJvbFJlY3QoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVjdCByZWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IHJlY3Q7CiAjaWZuZGVmIEdldENvbnRyb2xSZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0Q29udHJvbFJlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldENvbnRyb2xSZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlHZXRDb250cm9sUmVjdChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICZyZWN0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJnJlY3QpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRDb250cm9sUmVjdChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICZyZWN0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJnJlY3QpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9EaXNwb3NlQ29udHJvbChDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAKLQkgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLQkgICAgICAgIGlmICggX3NlbGYtPm9iX2l0c2VsZiApIHsKLQkgICAgICAgICAgICAgICAgU2V0Q29udHJvbFJlZmVyZW5jZShfc2VsZi0+b2JfaXRzZWxmLCAobG9uZykwKTsgLyogTWFrZSBpdCBmb3JnZXQgYWJvdXQgdXMgKi8KLQkgICAgICAgICAgICAgICAgRGlzcG9zZUNvbnRyb2woX3NlbGYtPm9iX2l0c2VsZik7Ci0JICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYgPSBOVUxMOwotCSAgICAgICAgfQotCSAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwotCSAgICAgICAgX3JlcyA9IFB5X05vbmU7Ci0JICAgICAgICByZXR1cm4gX3JlczsKKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKCBfc2VsZi0+b2JfaXRzZWxmICkgeworICAgICAgICAgICAgU2V0Q29udHJvbFJlZmVyZW5jZShfc2VsZi0+b2JfaXRzZWxmLCAobG9uZykwKTsgLyogTWFrZSBpdCBmb3JnZXQgYWJvdXQgdXMgKi8KKyAgICAgICAgICAgIERpc3Bvc2VDb250cm9sKF9zZWxmLT5vYl9pdHNlbGYpOworICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZiA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICBfcmVzID0gUHlfTm9uZTsKKyAgICAgICAgcmV0dXJuIF9yZXM7CiAKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfVHJhY2tDb250cm9sKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKIAotCUNvbnRyb2xQYXJ0Q29kZSBfcnY7Ci0JUG9pbnQgc3RhcnRQb2ludDsKLQlDb250cm9sQWN0aW9uVVBQIHVwcCA9IDA7Ci0JUHlPYmplY3QgKmNhbGxiYWNrID0gMDsKKyAgICBDb250cm9sUGFydENvZGUgX3J2OworICAgIFBvaW50IHN0YXJ0UG9pbnQ7CisgICAgQ29udHJvbEFjdGlvblVQUCB1cHAgPSAwOworICAgIFB5T2JqZWN0ICpjYWxsYmFjayA9IDA7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnxPIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZzdGFydFBvaW50LCAmY2FsbGJhY2spKQotCSAgICAgICAgcmV0dXJuIE5VTEw7Ci0JaWYgKGNhbGxiYWNrICYmIGNhbGxiYWNrICE9IFB5X05vbmUpIHsKLQkgICAgICAgIGlmIChQeUludF9DaGVjayhjYWxsYmFjaykgJiYgUHlJbnRfQVNfTE9ORyhjYWxsYmFjaykgPT0gLTEpCi0JICAgICAgICAgICAgICAgIHVwcCA9IChDb250cm9sQWN0aW9uVVBQKS0xOwotCSAgICAgICAgZWxzZSB7Ci0JICAgICAgICAgICAgICAgIHNldHRyYWNrZnVuYyhjYWxsYmFjayk7Ci0JICAgICAgICAgICAgICAgIHVwcCA9IG15dHJhY2tlcl91cHA7Ci0JICAgICAgICB9Ci0JfQotCV9ydiA9IFRyYWNrQ29udHJvbChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICBzdGFydFBvaW50LAotCSAgICAgICAgICAgICAgICAgICB1cHApOwotCWNscnRyYWNrZnVuYygpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mfE8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnN0YXJ0UG9pbnQsICZjYWxsYmFjaykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChjYWxsYmFjayAmJiBjYWxsYmFjayAhPSBQeV9Ob25lKSB7CisgICAgICAgIGlmIChQeUludF9DaGVjayhjYWxsYmFjaykgJiYgUHlJbnRfQVNfTE9ORyhjYWxsYmFjaykgPT0gLTEpCisgICAgICAgICAgICB1cHAgPSAoQ29udHJvbEFjdGlvblVQUCktMTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBzZXR0cmFja2Z1bmMoY2FsbGJhY2spOworICAgICAgICAgICAgdXBwID0gbXl0cmFja2VyX3VwcDsKKyAgICAgICAgfQorICAgIH0KKyAgICBfcnYgPSBUcmFja0NvbnRyb2woX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRQb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgdXBwKTsKKyAgICBjbHJ0cmFja2Z1bmMoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIAogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9IYW5kbGVDb250cm9sQ2xpY2soQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogCi0JQ29udHJvbFBhcnRDb2RlIF9ydjsKLQlQb2ludCBzdGFydFBvaW50OwotCVNJbnQxNiBtb2RpZmllcnM7Ci0JQ29udHJvbEFjdGlvblVQUCB1cHAgPSAwOwotCVB5T2JqZWN0ICpjYWxsYmFjayA9IDA7CisgICAgQ29udHJvbFBhcnRDb2RlIF9ydjsKKyAgICBQb2ludCBzdGFydFBvaW50OworICAgIFNJbnQxNiBtb2RpZmllcnM7CisgICAgQ29udHJvbEFjdGlvblVQUCB1cHAgPSAwOworICAgIFB5T2JqZWN0ICpjYWxsYmFjayA9IDA7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmh8TyIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmc3RhcnRQb2ludCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vZGlmaWVycywKLQkgICAgICAgICAgICAgICAgICAgICAgJmNhbGxiYWNrKSkKLQkgICAgICAgIHJldHVybiBOVUxMOwotCWlmIChjYWxsYmFjayAmJiBjYWxsYmFjayAhPSBQeV9Ob25lKSB7Ci0JICAgICAgICBpZiAoUHlJbnRfQ2hlY2soY2FsbGJhY2spICYmIFB5SW50X0FTX0xPTkcoY2FsbGJhY2spID09IC0xKQotCSAgICAgICAgICAgICAgICB1cHAgPSAoQ29udHJvbEFjdGlvblVQUCktMTsKLQkgICAgICAgIGVsc2UgewotCSAgICAgICAgICAgICAgICBzZXR0cmFja2Z1bmMoY2FsbGJhY2spOwotCSAgICAgICAgICAgICAgICB1cHAgPSBteXRyYWNrZXJfdXBwOwotCSAgICAgICAgfQotCX0KLQlfcnYgPSBIYW5kbGVDb250cm9sQ2xpY2soX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgc3RhcnRQb2ludCwKLQkgICAgICAgICAgICAgICAgICAgbW9kaWZpZXJzLAotCSAgICAgICAgICAgICAgICAgICB1cHApOwotCWNscnRyYWNrZnVuYygpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maHxPIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZzdGFydFBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbW9kaWZpZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY2FsbGJhY2spKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoY2FsbGJhY2sgJiYgY2FsbGJhY2sgIT0gUHlfTm9uZSkgeworICAgICAgICBpZiAoUHlJbnRfQ2hlY2soY2FsbGJhY2spICYmIFB5SW50X0FTX0xPTkcoY2FsbGJhY2spID09IC0xKQorICAgICAgICAgICAgdXBwID0gKENvbnRyb2xBY3Rpb25VUFApLTE7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgc2V0dHJhY2tmdW5jKGNhbGxiYWNrKTsKKyAgICAgICAgICAgIHVwcCA9IG15dHJhY2tlcl91cHA7CisgICAgICAgIH0KKyAgICB9CisgICAgX3J2ID0gSGFuZGxlQ29udHJvbENsaWNrKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0UG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVycywKKyAgICAgICAgICAgICAgICAgICAgICAgdXBwKTsKKyAgICBjbHJ0cmFja2Z1bmMoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIAogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9TZXRDb250cm9sRGF0YShDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAKLQlPU0VyciBfZXJyOwotCUNvbnRyb2xQYXJ0Q29kZSBpblBhcnQ7Ci0JUmVzVHlwZSBpblRhZ05hbWU7Ci0JU2l6ZSBidWZmZXJTaXplOwotCVB0ciBidWZmZXI7CisgICAgT1NFcnIgX2VycjsKKyAgICBDb250cm9sUGFydENvZGUgaW5QYXJ0OworICAgIFJlc1R5cGUgaW5UYWdOYW1lOworICAgIFNpemUgYnVmZmVyU2l6ZTsKKyAgICBQdHIgYnVmZmVyOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mcyMiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5QYXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpblRhZ05hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZidWZmZXIsICZidWZmZXJTaXplKSkKLQkgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJnMjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluUGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaW5UYWdOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYnVmZmVyLCAmYnVmZmVyU2l6ZSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JX2VyciA9IFNldENvbnRyb2xEYXRhKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgIGluUGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgaW5UYWdOYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICBidWZmZXJTaXplLAotCSAgICAgICAgICAgICAgICAgICAgICBidWZmZXIpOworICAgIF9lcnIgPSBTZXRDb250cm9sRGF0YShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpblBhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGluVGFnTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyKTsKIAotCWlmIChfZXJyICE9IG5vRXJyKQotCSAgICAgICAgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmIChfZXJyICE9IG5vRXJyKQorICAgICAgICByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiAKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0Q29udHJvbERhdGEoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogCi0JT1NFcnIgX2VycjsKLQlDb250cm9sUGFydENvZGUgaW5QYXJ0OwotCVJlc1R5cGUgaW5UYWdOYW1lOwotCVNpemUgYnVmZmVyU2l6ZTsKLQlQdHIgYnVmZmVyOwotCVNpemUgb3V0U2l6ZTsKKyAgICBPU0VyciBfZXJyOworICAgIENvbnRyb2xQYXJ0Q29kZSBpblBhcnQ7CisgICAgUmVzVHlwZSBpblRhZ05hbWU7CisgICAgU2l6ZSBidWZmZXJTaXplOworICAgIFB0ciBidWZmZXI7CisgICAgU2l6ZSBvdXRTaXplOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluUGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaW5UYWdOYW1lKSkKLQkgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblBhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmluVGFnTmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JLyogYWxsb2NhdGUgYSBidWZmZXIgZm9yIHRoZSBkYXRhICovCi0JX2VyciA9IEdldENvbnRyb2xEYXRhU2l6ZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgaW5QYXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgaW5UYWdOYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ1ZmZlclNpemUpOwotCWlmIChfZXJyICE9IG5vRXJyKQotCSAgICAgICAgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCWJ1ZmZlciA9IFB5TWVtX05FVyhjaGFyLCBidWZmZXJTaXplKTsKLQlpZiAoYnVmZmVyID09IE5VTEwpCi0JICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAvKiBhbGxvY2F0ZSBhIGJ1ZmZlciBmb3IgdGhlIGRhdGEgKi8KKyAgICBfZXJyID0gR2V0Q29udHJvbERhdGFTaXplKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblBhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblRhZ05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnVmZmVyU2l6ZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpCisgICAgICAgIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBidWZmZXIgPSBQeU1lbV9ORVcoY2hhciwgYnVmZmVyU2l6ZSk7CisgICAgaWYgKGJ1ZmZlciA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKIAotCV9lcnIgPSBHZXRDb250cm9sRGF0YShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICBpblBhcnQsCi0JICAgICAgICAgICAgICAgICAgICAgIGluVGFnTmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyU2l6ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAmb3V0U2l6ZSk7CisgICAgX2VyciA9IEdldENvbnRyb2xEYXRhKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGluUGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW5UYWdOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRTaXplKTsKIAotCWlmIChfZXJyICE9IG5vRXJyKSB7Ci0JICAgICAgICBQeU1lbV9ERUwoYnVmZmVyKTsKLQkgICAgICAgIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQl9Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoInMjIiwgYnVmZmVyLCBvdXRTaXplKTsKLQlQeU1lbV9ERUwoYnVmZmVyKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoX2VyciAhPSBub0VycikgeworICAgICAgICBQeU1lbV9ERUwoYnVmZmVyKTsKKyAgICAgICAgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIH0KKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgicyMiLCBidWZmZXIsIG91dFNpemUpOworICAgIFB5TWVtX0RFTChidWZmZXIpOworICAgIHJldHVybiBfcmVzOwogCiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX1NldENvbnRyb2xEYXRhX0hhbmRsZShDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAKLQlPU0VyciBfZXJyOwotCUNvbnRyb2xQYXJ0Q29kZSBpblBhcnQ7Ci0JUmVzVHlwZSBpblRhZ05hbWU7Ci0JSGFuZGxlIGJ1ZmZlcjsKKyAgICBPU0VyciBfZXJyOworICAgIENvbnRyb2xQYXJ0Q29kZSBpblBhcnQ7CisgICAgUmVzVHlwZSBpblRhZ05hbWU7CisgICAgSGFuZGxlIGJ1ZmZlcjsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluUGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaW5UYWdOYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfQ29udmVydCwgJmJ1ZmZlcikpCi0JICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblBhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmluVGFnTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0UmVzT2JqX0NvbnZlcnQsICZidWZmZXIpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCV9lcnIgPSBTZXRDb250cm9sRGF0YShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICBpblBhcnQsCi0JICAgICAgICAgICAgICAgICAgICAgIGluVGFnTmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGJ1ZmZlciksCi0JICAgICAgICAgICAgICAgICAgICAgIChQdHIpJmJ1ZmZlcik7CisgICAgX2VyciA9IFNldENvbnRyb2xEYXRhKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGluUGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW5UYWdOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoYnVmZmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKFB0cikmYnVmZmVyKTsKIAotCWlmIChfZXJyICE9IG5vRXJyKQotCSAgICAgICAgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmIChfZXJyICE9IG5vRXJyKQorICAgICAgICByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiAKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0Q29udHJvbERhdGFfSGFuZGxlKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKIAotCU9TRXJyIF9lcnI7Ci0JQ29udHJvbFBhcnRDb2RlIGluUGFydDsKLQlSZXNUeXBlIGluVGFnTmFtZTsKLQlTaXplIGJ1ZmZlclNpemU7Ci0JSGFuZGxlIGhkbDsKKyAgICBPU0VyciBfZXJyOworICAgIENvbnRyb2xQYXJ0Q29kZSBpblBhcnQ7CisgICAgUmVzVHlwZSBpblRhZ05hbWU7CisgICAgU2l6ZSBidWZmZXJTaXplOworICAgIEhhbmRsZSBoZGw7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5QYXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpblRhZ05hbWUpKQotCSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluUGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaW5UYWdOYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkvKiBDaGVjayBpdCBpcyBoYW5kbGUtc2l6ZWQgKi8KLQlfZXJyID0gR2V0Q29udHJvbERhdGFTaXplKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBpblBhcnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBpblRhZ05hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmYnVmZmVyU2l6ZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpCi0JICAgICAgICByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JaWYgKGJ1ZmZlclNpemUgIT0gc2l6ZW9mKEhhbmRsZSkpIHsKLQkgICAgICAgIFB5RXJyX1NldFN0cmluZyhDdGxfRXJyb3IsICJHZXRDb250cm9sRGF0YVNpemUoKSAhPSBzaXplb2YoSGFuZGxlKSIpOwotCSAgICAgICAgcmV0dXJuIE5VTEw7Ci0JfQorICAgIC8qIENoZWNrIGl0IGlzIGhhbmRsZS1zaXplZCAqLworICAgIF9lcnIgPSBHZXRDb250cm9sRGF0YVNpemUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluUGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluVGFnTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZidWZmZXJTaXplKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikKKyAgICAgICAgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIGlmIChidWZmZXJTaXplICE9IHNpemVvZihIYW5kbGUpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhDdGxfRXJyb3IsICJHZXRDb250cm9sRGF0YVNpemUoKSAhPSBzaXplb2YoSGFuZGxlKSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlfZXJyID0gR2V0Q29udHJvbERhdGEoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgaW5QYXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICBpblRhZ05hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihIYW5kbGUpLAotCSAgICAgICAgICAgICAgICAgICAgICAoUHRyKSZoZGwsCi0JICAgICAgICAgICAgICAgICAgICAgICZidWZmZXJTaXplKTsKKyAgICBfZXJyID0gR2V0Q29udHJvbERhdGEoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW5QYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpblRhZ05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihIYW5kbGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoUHRyKSZoZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZidWZmZXJTaXplKTsKIAotCWlmIChfZXJyICE9IG5vRXJyKSB7Ci0JICAgICAgICByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JfQotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsIE9wdFJlc09ial9OZXcsIGhkbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHsKKyAgICAgICAgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIH0KKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLCBPcHRSZXNPYmpfTmV3LCBoZGwpOworICAgIHJldHVybiBfcmVzOwogCiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX1NldENvbnRyb2xEYXRhX0NhbGxiYWNrKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKIAotCU9TRXJyIF9lcnI7Ci0JQ29udHJvbFBhcnRDb2RlIGluUGFydDsKLQlSZXNUeXBlIGluVGFnTmFtZTsKLQlQeU9iamVjdCAqY2FsbGJhY2s7Ci0JVW5pdmVyc2FsUHJvY1B0ciBjX2NhbGxiYWNrOworICAgIE9TRXJyIF9lcnI7CisgICAgQ29udHJvbFBhcnRDb2RlIGluUGFydDsKKyAgICBSZXNUeXBlIGluVGFnTmFtZTsKKyAgICBQeU9iamVjdCAqY2FsbGJhY2s7CisgICAgVW5pdmVyc2FsUHJvY1B0ciBjX2NhbGxiYWNrOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mTyIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpblBhcnQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmluVGFnTmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNhbGxiYWNrKSkKLQkgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJk8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5QYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpblRhZ05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjYWxsYmFjaykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKCBzZXRjYWxsYmFjaygoUHlPYmplY3QgKilfc2VsZiwgaW5UYWdOYW1lLCBjYWxsYmFjaywgJmNfY2FsbGJhY2spIDwgMCApCi0JICAgICAgICByZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0Q29udHJvbERhdGEoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgaW5QYXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICBpblRhZ05hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihjX2NhbGxiYWNrKSwKLQkgICAgICAgICAgICAgICAgICAgICAgKFB0cikmY19jYWxsYmFjayk7CisgICAgaWYgKCBzZXRjYWxsYmFjaygoUHlPYmplY3QgKilfc2VsZiwgaW5UYWdOYW1lLCBjYWxsYmFjaywgJmNfY2FsbGJhY2spIDwgMCApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRDb250cm9sRGF0YShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpblBhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGluVGFnTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGNfY2FsbGJhY2spLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoUHRyKSZjX2NhbGxiYWNrKTsKIAotCWlmIChfZXJyICE9IG5vRXJyKQotCSAgICAgICAgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmIChfZXJyICE9IG5vRXJyKQorICAgICAgICByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiAKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIEN0bE9ial9tZXRob2RzW10gPSB7Ci0JeyJIaWxpdGVDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9IaWxpdGVDb250cm9sLCAxLAotCSBQeURvY19TVFIoIihDb250cm9sUGFydENvZGUgaGlsaXRlU3RhdGUpIC0+IE5vbmUiKX0sCi0JeyJTaG93Q29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2hvd0NvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkhpZGVDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9IaWRlQ29udHJvbCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiSXNDb250cm9sQWN0aXZlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9Jc0NvbnRyb2xBY3RpdmUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IklzQ29udHJvbFZpc2libGUiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0lzQ29udHJvbFZpc2libGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IkFjdGl2YXRlQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxPYmpfQWN0aXZhdGVDb250cm9sLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJEZWFjdGl2YXRlQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxPYmpfRGVhY3RpdmF0ZUNvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IlNldENvbnRyb2xWaXNpYmlsaXR5IiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXRDb250cm9sVmlzaWJpbGl0eSwgMSwKLQkgUHlEb2NfU1RSKCIoQm9vbGVhbiBpbklzVmlzaWJsZSwgQm9vbGVhbiBpbkRvRHJhdykgLT4gTm9uZSIpfSwKLQl7IklzQ29udHJvbEVuYWJsZWQiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0lzQ29udHJvbEVuYWJsZWQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IkVuYWJsZUNvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0VuYWJsZUNvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkRpc2FibGVDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9EaXNhYmxlQ29udHJvbCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiRHJhdzFDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9EcmF3MUNvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkdldEJlc3RDb250cm9sUmVjdCIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0QmVzdENvbnRyb2xSZWN0LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChSZWN0IG91dFJlY3QsIFNJbnQxNiBvdXRCYXNlTGluZU9mZnNldCkiKX0sCi0JeyJTZXRDb250cm9sRm9udFN0eWxlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXRDb250cm9sRm9udFN0eWxlLCAxLAotCSBQeURvY19TVFIoIihDb250cm9sRm9udFN0eWxlUmVjIGluU3R5bGUpIC0+IE5vbmUiKX0sCi0JeyJEcmF3Q29udHJvbEluQ3VycmVudFBvcnQiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0RyYXdDb250cm9sSW5DdXJyZW50UG9ydCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiU2V0VXBDb250cm9sQmFja2dyb3VuZCIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0VXBDb250cm9sQmFja2dyb3VuZCwgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IGluRGVwdGgsIEJvb2xlYW4gaW5Jc0NvbG9yRGV2aWNlKSAtPiBOb25lIil9LAotCXsiU2V0VXBDb250cm9sVGV4dENvbG9yIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXRVcENvbnRyb2xUZXh0Q29sb3IsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiBpbkRlcHRoLCBCb29sZWFuIGluSXNDb2xvckRldmljZSkgLT4gTm9uZSIpfSwKLQl7IkRyYWdDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9EcmFnQ29udHJvbCwgMSwKLQkgUHlEb2NfU1RSKCIoUG9pbnQgc3RhcnRQb2ludCwgUmVjdCBsaW1pdFJlY3QsIFJlY3Qgc2xvcFJlY3QsIERyYWdDb25zdHJhaW50IGF4aXMpIC0+IE5vbmUiKX0sCi0JeyJUZXN0Q29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxPYmpfVGVzdENvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKFBvaW50IHRlc3RQb2ludCkgLT4gKENvbnRyb2xQYXJ0Q29kZSBfcnYpIil9LAotCXsiSGFuZGxlQ29udHJvbENvbnRleHR1YWxNZW51Q2xpY2siLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0hhbmRsZUNvbnRyb2xDb250ZXh0dWFsTWVudUNsaWNrLCAxLAotCSBQeURvY19TVFIoIihQb2ludCBpbldoZXJlKSAtPiAoQm9vbGVhbiBtZW51RGlzcGxheWVkKSIpfSwKLQl7IkdldENvbnRyb2xDbGlja0FjdGl2YXRpb24iLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldENvbnRyb2xDbGlja0FjdGl2YXRpb24sIDEsCi0JIFB5RG9jX1NUUigiKFBvaW50IGluV2hlcmUsIEV2ZW50TW9kaWZpZXJzIGluTW9kaWZpZXJzKSAtPiAoQ2xpY2tBY3RpdmF0aW9uUmVzdWx0IG91dFJlc3VsdCkiKX0sCi0JeyJIYW5kbGVDb250cm9sS2V5IiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9IYW5kbGVDb250cm9sS2V5LCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgaW5LZXlDb2RlLCBTSW50MTYgaW5DaGFyQ29kZSwgRXZlbnRNb2RpZmllcnMgaW5Nb2RpZmllcnMpIC0+IChDb250cm9sUGFydENvZGUgX3J2KSIpfSwKLQl7IkhhbmRsZUNvbnRyb2xTZXRDdXJzb3IiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0hhbmRsZUNvbnRyb2xTZXRDdXJzb3IsIDEsCi0JIFB5RG9jX1NUUigiKFBvaW50IGxvY2FsUG9pbnQsIEV2ZW50TW9kaWZpZXJzIG1vZGlmaWVycykgLT4gKEJvb2xlYW4gY3Vyc29yV2FzU2V0KSIpfSwKLQl7Ik1vdmVDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9Nb3ZlQ29udHJvbCwgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IGgsIFNJbnQxNiB2KSAtPiBOb25lIil9LAotCXsiU2l6ZUNvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NpemVDb250cm9sLCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgdywgU0ludDE2IGgpIC0+IE5vbmUiKX0sCi0JeyJTZXRDb250cm9sVGl0bGUiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldENvbnRyb2xUaXRsZSwgMSwKLQkgUHlEb2NfU1RSKCIoU3RyMjU1IHRpdGxlKSAtPiBOb25lIil9LAotCXsiR2V0Q29udHJvbFRpdGxlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRDb250cm9sVGl0bGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFN0cjI1NSB0aXRsZSkiKX0sCi0JeyJTZXRDb250cm9sVGl0bGVXaXRoQ0ZTdHJpbmciLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldENvbnRyb2xUaXRsZVdpdGhDRlN0cmluZywgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgaW5TdHJpbmcpIC0+IE5vbmUiKX0sCi0JeyJDb3B5Q29udHJvbFRpdGxlQXNDRlN0cmluZyIsIChQeUNGdW5jdGlvbilDdGxPYmpfQ29weUNvbnRyb2xUaXRsZUFzQ0ZTdHJpbmcsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENGU3RyaW5nUmVmIG91dFN0cmluZykiKX0sCi0JeyJHZXRDb250cm9sVmFsdWUiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldENvbnRyb2xWYWx1ZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoU0ludDE2IF9ydikiKX0sCi0JeyJTZXRDb250cm9sVmFsdWUiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldENvbnRyb2xWYWx1ZSwgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IG5ld1ZhbHVlKSAtPiBOb25lIil9LAotCXsiR2V0Q29udHJvbE1pbmltdW0iLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldENvbnRyb2xNaW5pbXVtLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChTSW50MTYgX3J2KSIpfSwKLQl7IlNldENvbnRyb2xNaW5pbXVtIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXRDb250cm9sTWluaW11bSwgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IG5ld01pbmltdW0pIC0+IE5vbmUiKX0sCi0JeyJHZXRDb250cm9sTWF4aW11bSIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0Q29udHJvbE1heGltdW0sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFNJbnQxNiBfcnYpIil9LAotCXsiU2V0Q29udHJvbE1heGltdW0iLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldENvbnRyb2xNYXhpbXVtLCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgbmV3TWF4aW11bSkgLT4gTm9uZSIpfSwKLQl7IkdldENvbnRyb2xWaWV3U2l6ZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0Q29udHJvbFZpZXdTaXplLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChTSW50MzIgX3J2KSIpfSwKLQl7IlNldENvbnRyb2xWaWV3U2l6ZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0Q29udHJvbFZpZXdTaXplLCAxLAotCSBQeURvY19TVFIoIihTSW50MzIgbmV3Vmlld1NpemUpIC0+IE5vbmUiKX0sCi0JeyJHZXRDb250cm9sMzJCaXRWYWx1ZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0Q29udHJvbDMyQml0VmFsdWUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFNJbnQzMiBfcnYpIil9LAotCXsiU2V0Q29udHJvbDMyQml0VmFsdWUiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldENvbnRyb2wzMkJpdFZhbHVlLCAxLAotCSBQeURvY19TVFIoIihTSW50MzIgbmV3VmFsdWUpIC0+IE5vbmUiKX0sCi0JeyJHZXRDb250cm9sMzJCaXRNYXhpbXVtIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRDb250cm9sMzJCaXRNYXhpbXVtLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChTSW50MzIgX3J2KSIpfSwKLQl7IlNldENvbnRyb2wzMkJpdE1heGltdW0iLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldENvbnRyb2wzMkJpdE1heGltdW0sIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQzMiBuZXdNYXhpbXVtKSAtPiBOb25lIil9LAotCXsiR2V0Q29udHJvbDMyQml0TWluaW11bSIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0Q29udHJvbDMyQml0TWluaW11bSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoU0ludDMyIF9ydikiKX0sCi0JeyJTZXRDb250cm9sMzJCaXRNaW5pbXVtIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXRDb250cm9sMzJCaXRNaW5pbXVtLCAxLAotCSBQeURvY19TVFIoIihTSW50MzIgbmV3TWluaW11bSkgLT4gTm9uZSIpfSwKLQl7IklzVmFsaWRDb250cm9sSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9Jc1ZhbGlkQ29udHJvbEhhbmRsZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiU2V0Q29udHJvbElEIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXRDb250cm9sSUQsIDEsCi0JIFB5RG9jX1NUUigiKENvbnRyb2xJRCBpbklEKSAtPiBOb25lIil9LAotCXsiR2V0Q29udHJvbElEIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRDb250cm9sSUQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENvbnRyb2xJRCBvdXRJRCkiKX0sCi0JeyJTZXRDb250cm9sQ29tbWFuZElEIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXRDb250cm9sQ29tbWFuZElELCAxLAotCSBQeURvY19TVFIoIihVSW50MzIgaW5Db21tYW5kSUQpIC0+IE5vbmUiKX0sCi0JeyJHZXRDb250cm9sQ29tbWFuZElEIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRDb250cm9sQ29tbWFuZElELCAxLAotCSBQeURvY19TVFIoIigpIC0+IChVSW50MzIgb3V0Q29tbWFuZElEKSIpfSwKLQl7IlJlbW92ZUNvbnRyb2xQcm9wZXJ0eSIsIChQeUNGdW5jdGlvbilDdGxPYmpfUmVtb3ZlQ29udHJvbFByb3BlcnR5LCAxLAotCSBQeURvY19TVFIoIihPU1R5cGUgcHJvcGVydHlDcmVhdG9yLCBPU1R5cGUgcHJvcGVydHlUYWcpIC0+IE5vbmUiKX0sCi0JeyJHZXRDb250cm9sUHJvcGVydHlBdHRyaWJ1dGVzIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRDb250cm9sUHJvcGVydHlBdHRyaWJ1dGVzLCAxLAotCSBQeURvY19TVFIoIihPU1R5cGUgcHJvcGVydHlDcmVhdG9yLCBPU1R5cGUgcHJvcGVydHlUYWcpIC0+IChVSW50MzIgYXR0cmlidXRlcykiKX0sCi0JeyJDaGFuZ2VDb250cm9sUHJvcGVydHlBdHRyaWJ1dGVzIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9DaGFuZ2VDb250cm9sUHJvcGVydHlBdHRyaWJ1dGVzLCAxLAotCSBQeURvY19TVFIoIihPU1R5cGUgcHJvcGVydHlDcmVhdG9yLCBPU1R5cGUgcHJvcGVydHlUYWcsIFVJbnQzMiBhdHRyaWJ1dGVzVG9TZXQsIFVJbnQzMiBhdHRyaWJ1dGVzVG9DbGVhcikgLT4gTm9uZSIpfSwKLQl7IkdldENvbnRyb2xSZWdpb24iLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldENvbnRyb2xSZWdpb24sIDEsCi0JIFB5RG9jX1NUUigiKENvbnRyb2xQYXJ0Q29kZSBpblBhcnQsIFJnbkhhbmRsZSBvdXRSZWdpb24pIC0+IE5vbmUiKX0sCi0JeyJHZXRDb250cm9sVmFyaWFudCIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0Q29udHJvbFZhcmlhbnQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENvbnRyb2xWYXJpYW50IF9ydikiKX0sCi0JeyJTZXRDb250cm9sQWN0aW9uIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXRDb250cm9sQWN0aW9uLCAxLAotCSBQeURvY19TVFIoIihQeU9iamVjdCogYWN0aW9uUHJvYykgLT4gTm9uZSIpfSwKLQl7IlNldENvbnRyb2xSZWZlcmVuY2UiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldENvbnRyb2xSZWZlcmVuY2UsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQzMiBkYXRhKSAtPiBOb25lIil9LAotCXsiR2V0Q29udHJvbFJlZmVyZW5jZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0Q29udHJvbFJlZmVyZW5jZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoU0ludDMyIF9ydikiKX0sCi0JeyJFbWJlZENvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0VtYmVkQ29udHJvbCwgMSwKLQkgUHlEb2NfU1RSKCIoQ29udHJvbEhhbmRsZSBpbkNvbnRhaW5lcikgLT4gTm9uZSIpfSwKLQl7IkF1dG9FbWJlZENvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0F1dG9FbWJlZENvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBpbldpbmRvdykgLT4gTm9uZSIpfSwKLQl7IkdldFN1cGVyQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0U3VwZXJDb250cm9sLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDb250cm9sSGFuZGxlIG91dFBhcmVudCkiKX0sCi0JeyJDb3VudFN1YkNvbnRyb2xzIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9Db3VudFN1YkNvbnRyb2xzLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChVSW50MTYgb3V0TnVtQ2hpbGRyZW4pIil9LAotCXsiR2V0SW5kZXhlZFN1YkNvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldEluZGV4ZWRTdWJDb250cm9sLCAxLAotCSBQeURvY19TVFIoIihVSW50MTYgaW5JbmRleCkgLT4gKENvbnRyb2xIYW5kbGUgb3V0U3ViQ29udHJvbCkiKX0sCi0JeyJTZXRDb250cm9sU3VwZXJ2aXNvciIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0Q29udHJvbFN1cGVydmlzb3IsIDEsCi0JIFB5RG9jX1NUUigiKENvbnRyb2xIYW5kbGUgaW5Cb3NzKSAtPiBOb25lIil9LAotCXsiR2V0Q29udHJvbEZlYXR1cmVzIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRDb250cm9sRmVhdHVyZXMsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQzMiBvdXRGZWF0dXJlcykiKX0sCi0JeyJHZXRDb250cm9sRGF0YVNpemUiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldENvbnRyb2xEYXRhU2l6ZSwgMSwKLQkgUHlEb2NfU1RSKCIoQ29udHJvbFBhcnRDb2RlIGluUGFydCwgUmVzVHlwZSBpblRhZ05hbWUpIC0+IChTaXplIG91dE1heFNpemUpIil9LAotCXsiSGFuZGxlQ29udHJvbERyYWdUcmFja2luZyIsIChQeUNGdW5jdGlvbilDdGxPYmpfSGFuZGxlQ29udHJvbERyYWdUcmFja2luZywgMSwKLQkgUHlEb2NfU1RSKCIoRHJhZ1RyYWNraW5nTWVzc2FnZSBpbk1lc3NhZ2UsIERyYWdSZWZlcmVuY2UgaW5EcmFnKSAtPiAoQm9vbGVhbiBvdXRMaWtlc0RyYWcpIil9LAotCXsiSGFuZGxlQ29udHJvbERyYWdSZWNlaXZlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9IYW5kbGVDb250cm9sRHJhZ1JlY2VpdmUsIDEsCi0JIFB5RG9jX1NUUigiKERyYWdSZWZlcmVuY2UgaW5EcmFnKSAtPiBOb25lIil9LAotCXsiU2V0Q29udHJvbERyYWdUcmFja2luZ0VuYWJsZWQiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldENvbnRyb2xEcmFnVHJhY2tpbmdFbmFibGVkLCAxLAotCSBQeURvY19TVFIoIihCb29sZWFuIGluVHJhY2tzKSAtPiBOb25lIil9LAotCXsiSXNDb250cm9sRHJhZ1RyYWNraW5nRW5hYmxlZCIsIChQeUNGdW5jdGlvbilDdGxPYmpfSXNDb250cm9sRHJhZ1RyYWNraW5nRW5hYmxlZCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBvdXRUcmFja3MpIil9LAotCXsiR2V0Q29udHJvbEJvdW5kcyIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0Q29udHJvbEJvdW5kcywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoUmVjdCBib3VuZHMpIil9LAotCXsiSXNDb250cm9sSGlsaXRlZCIsIChQeUNGdW5jdGlvbilDdGxPYmpfSXNDb250cm9sSGlsaXRlZCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiR2V0Q29udHJvbEhpbGl0ZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0Q29udHJvbEhpbGl0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVUludDE2IF9ydikiKX0sCi0JeyJHZXRDb250cm9sT3duZXIiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldENvbnRyb2xPd25lciwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoV2luZG93UHRyIF9ydikiKX0sCi0JeyJHZXRDb250cm9sRGF0YUhhbmRsZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0Q29udHJvbERhdGFIYW5kbGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEhhbmRsZSBfcnYpIil9LAotCXsiR2V0Q29udHJvbFBvcHVwTWVudUhhbmRsZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0Q29udHJvbFBvcHVwTWVudUhhbmRsZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoTWVudUhhbmRsZSBfcnYpIil9LAotCXsiR2V0Q29udHJvbFBvcHVwTWVudUlEIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRDb250cm9sUG9wdXBNZW51SUQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKHNob3J0IF9ydikiKX0sCi0JeyJTZXRDb250cm9sRGF0YUhhbmRsZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0Q29udHJvbERhdGFIYW5kbGUsIDEsCi0JIFB5RG9jX1NUUigiKEhhbmRsZSBkYXRhSGFuZGxlKSAtPiBOb25lIil9LAotCXsiU2V0Q29udHJvbEJvdW5kcyIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0Q29udHJvbEJvdW5kcywgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCBib3VuZHMpIC0+IE5vbmUiKX0sCi0JeyJTZXRDb250cm9sUG9wdXBNZW51SGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXRDb250cm9sUG9wdXBNZW51SGFuZGxlLCAxLAotCSBQeURvY19TVFIoIihNZW51SGFuZGxlIHBvcHVwTWVudSkgLT4gTm9uZSIpfSwKLQl7IlNldENvbnRyb2xQb3B1cE1lbnVJRCIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0Q29udHJvbFBvcHVwTWVudUlELCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBtZW51SUQpIC0+IE5vbmUiKX0sCi0JeyJHZXRCZXZlbEJ1dHRvbk1lbnVWYWx1ZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0QmV2ZWxCdXR0b25NZW51VmFsdWUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFNJbnQxNiBvdXRWYWx1ZSkiKX0sCi0JeyJTZXRCZXZlbEJ1dHRvbk1lbnVWYWx1ZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0QmV2ZWxCdXR0b25NZW51VmFsdWUsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiBpblZhbHVlKSAtPiBOb25lIil9LAotCXsiR2V0QmV2ZWxCdXR0b25NZW51SGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRCZXZlbEJ1dHRvbk1lbnVIYW5kbGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKE1lbnVIYW5kbGUgb3V0SGFuZGxlKSIpfSwKLQl7IlNldEJldmVsQnV0dG9uQ29udGVudEluZm8iLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldEJldmVsQnV0dG9uQ29udGVudEluZm8sIDEsCi0JIFB5RG9jX1NUUigiKENvbnRyb2xCdXR0b25Db250ZW50SW5mbyBpbkNvbnRlbnQpIC0+IE5vbmUiKX0sCi0JeyJTZXRCZXZlbEJ1dHRvblRyYW5zZm9ybSIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0QmV2ZWxCdXR0b25UcmFuc2Zvcm0sIDEsCi0JIFB5RG9jX1NUUigiKEljb25UcmFuc2Zvcm1UeXBlIHRyYW5zZm9ybSkgLT4gTm9uZSIpfSwKLQl7IlNldERpc2Nsb3N1cmVUcmlhbmdsZUxhc3RWYWx1ZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0RGlzY2xvc3VyZVRyaWFuZ2xlTGFzdFZhbHVlLCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgaW5WYWx1ZSkgLT4gTm9uZSIpfSwKLQl7IkdldFRhYkNvbnRlbnRSZWN0IiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRUYWJDb250ZW50UmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoUmVjdCBvdXRDb250ZW50UmVjdCkiKX0sCi0JeyJTZXRUYWJFbmFibGVkIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXRUYWJFbmFibGVkLCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgaW5UYWJUb0hpbGl0ZSwgQm9vbGVhbiBpbkVuYWJsZWQpIC0+IE5vbmUiKX0sCi0JeyJTZXRJbWFnZVdlbGxDb250ZW50SW5mbyIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0SW1hZ2VXZWxsQ29udGVudEluZm8sIDEsCi0JIFB5RG9jX1NUUigiKENvbnRyb2xCdXR0b25Db250ZW50SW5mbyBpbkNvbnRlbnQpIC0+IE5vbmUiKX0sCi0JeyJTZXRJbWFnZVdlbGxUcmFuc2Zvcm0iLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldEltYWdlV2VsbFRyYW5zZm9ybSwgMSwKLQkgUHlEb2NfU1RSKCIoSWNvblRyYW5zZm9ybVR5cGUgaW5UcmFuc2Zvcm0pIC0+IE5vbmUiKX0sCi0JeyJHZXREYXRhQnJvd3NlclZpZXdTdHlsZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0RGF0YUJyb3dzZXJWaWV3U3R5bGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKE9TVHlwZSBzdHlsZSkiKX0sCi0JeyJTZXREYXRhQnJvd3NlclZpZXdTdHlsZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0RGF0YUJyb3dzZXJWaWV3U3R5bGUsIDEsCi0JIFB5RG9jX1NUUigiKE9TVHlwZSBzdHlsZSkgLT4gTm9uZSIpfSwKLQl7IkVuYWJsZURhdGFCcm93c2VyRWRpdENvbW1hbmQiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0VuYWJsZURhdGFCcm93c2VyRWRpdENvbW1hbmQsIDEsCi0JIFB5RG9jX1NUUigiKFVJbnQzMiBjb21tYW5kKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiRXhlY3V0ZURhdGFCcm93c2VyRWRpdENvbW1hbmQiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0V4ZWN1dGVEYXRhQnJvd3NlckVkaXRDb21tYW5kLCAxLAotCSBQeURvY19TVFIoIihVSW50MzIgY29tbWFuZCkgLT4gTm9uZSIpfSwKLQl7IkdldERhdGFCcm93c2VyU2VsZWN0aW9uQW5jaG9yIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3NlclNlbGVjdGlvbkFuY2hvciwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVUludDMyIGZpcnN0LCBVSW50MzIgbGFzdCkiKX0sCi0JeyJNb3ZlRGF0YUJyb3dzZXJTZWxlY3Rpb25BbmNob3IiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX01vdmVEYXRhQnJvd3NlclNlbGVjdGlvbkFuY2hvciwgMSwKLQkgUHlEb2NfU1RSKCIoVUludDMyIGRpcmVjdGlvbiwgQm9vbGVhbiBleHRlbmRTZWxlY3Rpb24pIC0+IE5vbmUiKX0sCi0JeyJPcGVuRGF0YUJyb3dzZXJDb250YWluZXIiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX09wZW5EYXRhQnJvd3NlckNvbnRhaW5lciwgMSwKLQkgUHlEb2NfU1RSKCIoVUludDMyIGNvbnRhaW5lcikgLT4gTm9uZSIpfSwKLQl7IkNsb3NlRGF0YUJyb3dzZXJDb250YWluZXIiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0Nsb3NlRGF0YUJyb3dzZXJDb250YWluZXIsIDEsCi0JIFB5RG9jX1NUUigiKFVJbnQzMiBjb250YWluZXIpIC0+IE5vbmUiKX0sCi0JeyJTb3J0RGF0YUJyb3dzZXJDb250YWluZXIiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NvcnREYXRhQnJvd3NlckNvbnRhaW5lciwgMSwKLQkgUHlEb2NfU1RSKCIoVUludDMyIGNvbnRhaW5lciwgQm9vbGVhbiBzb3J0Q2hpbGRyZW4pIC0+IE5vbmUiKX0sCi0JeyJHZXREYXRhQnJvd3Nlckl0ZW1zIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3Nlckl0ZW1zLCAxLAotCSBQeURvY19TVFIoIihVSW50MzIgY29udGFpbmVyLCBCb29sZWFuIHJlY3Vyc2UsIFVJbnQzMiBzdGF0ZSwgSGFuZGxlIGl0ZW1zKSAtPiBOb25lIil9LAotCXsiR2V0RGF0YUJyb3dzZXJJdGVtQ291bnQiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldERhdGFCcm93c2VySXRlbUNvdW50LCAxLAotCSBQeURvY19TVFIoIihVSW50MzIgY29udGFpbmVyLCBCb29sZWFuIHJlY3Vyc2UsIFVJbnQzMiBzdGF0ZSkgLT4gKFVJbnQzMiBudW1JdGVtcykiKX0sCi0JeyJJc0RhdGFCcm93c2VySXRlbVNlbGVjdGVkIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9Jc0RhdGFCcm93c2VySXRlbVNlbGVjdGVkLCAxLAotCSBQeURvY19TVFIoIihVSW50MzIgaXRlbSkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IkdldERhdGFCcm93c2VySXRlbVN0YXRlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3Nlckl0ZW1TdGF0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoVUludDMyIGl0ZW0pIC0+IChVSW50MzIgc3RhdGUpIil9LAotCXsiUmV2ZWFsRGF0YUJyb3dzZXJJdGVtIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9SZXZlYWxEYXRhQnJvd3Nlckl0ZW0sIDEsCi0JIFB5RG9jX1NUUigiKFVJbnQzMiBpdGVtLCBVSW50MzIgcHJvcGVydHlJRCwgVUludDggb3B0aW9ucykgLT4gTm9uZSIpfSwKLQl7IlNldERhdGFCcm93c2VyQWN0aXZlSXRlbXMiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldERhdGFCcm93c2VyQWN0aXZlSXRlbXMsIDEsCi0JIFB5RG9jX1NUUigiKEJvb2xlYW4gYWN0aXZlKSAtPiBOb25lIil9LAotCXsiR2V0RGF0YUJyb3dzZXJBY3RpdmVJdGVtcyIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0RGF0YUJyb3dzZXJBY3RpdmVJdGVtcywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBhY3RpdmUpIil9LAotCXsiU2V0RGF0YUJyb3dzZXJTY3JvbGxCYXJJbnNldCIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0RGF0YUJyb3dzZXJTY3JvbGxCYXJJbnNldCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoUmVjdCBpbnNldFJlY3QpIil9LAotCXsiR2V0RGF0YUJyb3dzZXJTY3JvbGxCYXJJbnNldCIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0RGF0YUJyb3dzZXJTY3JvbGxCYXJJbnNldCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoUmVjdCBpbnNldFJlY3QpIil9LAotCXsiU2V0RGF0YUJyb3dzZXJUYXJnZXQiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldERhdGFCcm93c2VyVGFyZ2V0LCAxLAotCSBQeURvY19TVFIoIihVSW50MzIgdGFyZ2V0KSAtPiBOb25lIil9LAotCXsiR2V0RGF0YUJyb3dzZXJUYXJnZXQiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldERhdGFCcm93c2VyVGFyZ2V0LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChVSW50MzIgdGFyZ2V0KSIpfSwKLQl7IlNldERhdGFCcm93c2VyU29ydE9yZGVyIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXREYXRhQnJvd3NlclNvcnRPcmRlciwgMSwKLQkgUHlEb2NfU1RSKCIoVUludDE2IG9yZGVyKSAtPiBOb25lIil9LAotCXsiR2V0RGF0YUJyb3dzZXJTb3J0T3JkZXIiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldERhdGFCcm93c2VyU29ydE9yZGVyLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChVSW50MTYgb3JkZXIpIil9LAotCXsiU2V0RGF0YUJyb3dzZXJTY3JvbGxQb3NpdGlvbiIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0RGF0YUJyb3dzZXJTY3JvbGxQb3NpdGlvbiwgMSwKLQkgUHlEb2NfU1RSKCIoVUludDMyIHRvcCwgVUludDMyIGxlZnQpIC0+IE5vbmUiKX0sCi0JeyJHZXREYXRhQnJvd3NlclNjcm9sbFBvc2l0aW9uIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3NlclNjcm9sbFBvc2l0aW9uLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChVSW50MzIgdG9wLCBVSW50MzIgbGVmdCkiKX0sCi0JeyJTZXREYXRhQnJvd3Nlckhhc1Njcm9sbEJhcnMiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldERhdGFCcm93c2VySGFzU2Nyb2xsQmFycywgMSwKLQkgUHlEb2NfU1RSKCIoQm9vbGVhbiBob3JpeiwgQm9vbGVhbiB2ZXJ0KSAtPiBOb25lIil9LAotCXsiR2V0RGF0YUJyb3dzZXJIYXNTY3JvbGxCYXJzIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3Nlckhhc1Njcm9sbEJhcnMsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gaG9yaXosIEJvb2xlYW4gdmVydCkiKX0sCi0JeyJTZXREYXRhQnJvd3NlclNvcnRQcm9wZXJ0eSIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0RGF0YUJyb3dzZXJTb3J0UHJvcGVydHksIDEsCi0JIFB5RG9jX1NUUigiKFVJbnQzMiBwcm9wZXJ0eSkgLT4gTm9uZSIpfSwKLQl7IkdldERhdGFCcm93c2VyU29ydFByb3BlcnR5IiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3NlclNvcnRQcm9wZXJ0eSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVUludDMyIHByb3BlcnR5KSIpfSwKLQl7IlNldERhdGFCcm93c2VyU2VsZWN0aW9uRmxhZ3MiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldERhdGFCcm93c2VyU2VsZWN0aW9uRmxhZ3MsIDEsCi0JIFB5RG9jX1NUUigiKFVJbnQzMiBzZWxlY3Rpb25GbGFncykgLT4gTm9uZSIpfSwKLQl7IkdldERhdGFCcm93c2VyU2VsZWN0aW9uRmxhZ3MiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldERhdGFCcm93c2VyU2VsZWN0aW9uRmxhZ3MsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQzMiBzZWxlY3Rpb25GbGFncykiKX0sCi0JeyJTZXREYXRhQnJvd3NlclByb3BlcnR5RmxhZ3MiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldERhdGFCcm93c2VyUHJvcGVydHlGbGFncywgMSwKLQkgUHlEb2NfU1RSKCIoVUludDMyIHByb3BlcnR5LCBVSW50MzIgZmxhZ3MpIC0+IE5vbmUiKX0sCi0JeyJHZXREYXRhQnJvd3NlclByb3BlcnR5RmxhZ3MiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldERhdGFCcm93c2VyUHJvcGVydHlGbGFncywgMSwKLQkgUHlEb2NfU1RSKCIoVUludDMyIHByb3BlcnR5KSAtPiAoVUludDMyIGZsYWdzKSIpfSwKLQl7IlNldERhdGFCcm93c2VyRWRpdFRleHQiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldERhdGFCcm93c2VyRWRpdFRleHQsIDEsCi0JIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIHRleHQpIC0+IE5vbmUiKX0sCi0JeyJDb3B5RGF0YUJyb3dzZXJFZGl0VGV4dCIsIChQeUNGdW5jdGlvbilDdGxPYmpfQ29weURhdGFCcm93c2VyRWRpdFRleHQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENGU3RyaW5nUmVmIHRleHQpIil9LAotCXsiR2V0RGF0YUJyb3dzZXJFZGl0VGV4dCIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0RGF0YUJyb3dzZXJFZGl0VGV4dCwgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZNdXRhYmxlU3RyaW5nUmVmIHRleHQpIC0+IE5vbmUiKX0sCi0JeyJTZXREYXRhQnJvd3NlckVkaXRJdGVtIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXREYXRhQnJvd3NlckVkaXRJdGVtLCAxLAotCSBQeURvY19TVFIoIihVSW50MzIgaXRlbSwgVUludDMyIHByb3BlcnR5KSAtPiBOb25lIil9LAotCXsiR2V0RGF0YUJyb3dzZXJFZGl0SXRlbSIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0RGF0YUJyb3dzZXJFZGl0SXRlbSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVUludDMyIGl0ZW0sIFVJbnQzMiBwcm9wZXJ0eSkiKX0sCi0JeyJHZXREYXRhQnJvd3Nlckl0ZW1QYXJ0Qm91bmRzIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3Nlckl0ZW1QYXJ0Qm91bmRzLCAxLAotCSBQeURvY19TVFIoIihVSW50MzIgaXRlbSwgVUludDMyIHByb3BlcnR5LCBPU1R5cGUgcGFydCkgLT4gKFJlY3QgYm91bmRzKSIpfSwKLQl7IlJlbW92ZURhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9SZW1vdmVEYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtbiwgMSwKLQkgUHlEb2NfU1RSKCIoVUludDMyIGNvbHVtbikgLT4gTm9uZSIpfSwKLQl7IkdldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uQ291bnQiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uQ291bnQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQzMiBudW1Db2x1bW5zKSIpfSwKLQl7IlNldERhdGFCcm93c2VyVGFibGVWaWV3SGlsaXRlU3R5bGUiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldERhdGFCcm93c2VyVGFibGVWaWV3SGlsaXRlU3R5bGUsIDEsCi0JIFB5RG9jX1NUUigiKFVJbnQzMiBoaWxpdGVTdHlsZSkgLT4gTm9uZSIpfSwKLQl7IkdldERhdGFCcm93c2VyVGFibGVWaWV3SGlsaXRlU3R5bGUiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldERhdGFCcm93c2VyVGFibGVWaWV3SGlsaXRlU3R5bGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQzMiBoaWxpdGVTdHlsZSkiKX0sCi0JeyJTZXREYXRhQnJvd3NlclRhYmxlVmlld1Jvd0hlaWdodCIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdSb3dIZWlnaHQsIDEsCi0JIFB5RG9jX1NUUigiKFVJbnQxNiBoZWlnaHQpIC0+IE5vbmUiKX0sCi0JeyJHZXREYXRhQnJvd3NlclRhYmxlVmlld1Jvd0hlaWdodCIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdSb3dIZWlnaHQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQxNiBoZWlnaHQpIil9LAotCXsiU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5XaWR0aCIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5XaWR0aCwgMSwKLQkgUHlEb2NfU1RSKCIoVUludDE2IHdpZHRoKSAtPiBOb25lIil9LAotCXsiR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5XaWR0aCIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5XaWR0aCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVUludDE2IHdpZHRoKSIpfSwKLQl7IlNldERhdGFCcm93c2VyVGFibGVWaWV3SXRlbVJvd0hlaWdodCIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdJdGVtUm93SGVpZ2h0LCAxLAotCSBQeURvY19TVFIoIihVSW50MzIgaXRlbSwgVUludDE2IGhlaWdodCkgLT4gTm9uZSIpfSwKLQl7IkdldERhdGFCcm93c2VyVGFibGVWaWV3SXRlbVJvd0hlaWdodCIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdJdGVtUm93SGVpZ2h0LCAxLAotCSBQeURvY19TVFIoIihVSW50MzIgaXRlbSkgLT4gKFVJbnQxNiBoZWlnaHQpIil9LAotCXsiU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdOYW1lZENvbHVtbldpZHRoIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXREYXRhQnJvd3NlclRhYmxlVmlld05hbWVkQ29sdW1uV2lkdGgsIDEsCi0JIFB5RG9jX1NUUigiKFVJbnQzMiBjb2x1bW4sIFVJbnQxNiB3aWR0aCkgLT4gTm9uZSIpfSwKLQl7IkdldERhdGFCcm93c2VyVGFibGVWaWV3TmFtZWRDb2x1bW5XaWR0aCIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdOYW1lZENvbHVtbldpZHRoLCAxLAotCSBQeURvY19TVFIoIihVSW50MzIgY29sdW1uKSAtPiAoVUludDE2IHdpZHRoKSIpfSwKLQl7IlNldERhdGFCcm93c2VyVGFibGVWaWV3R2VvbWV0cnkiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldERhdGFCcm93c2VyVGFibGVWaWV3R2VvbWV0cnksIDEsCi0JIFB5RG9jX1NUUigiKEJvb2xlYW4gdmFyaWFibGVXaWR0aENvbHVtbnMsIEJvb2xlYW4gdmFyaWFibGVIZWlnaHRSb3dzKSAtPiBOb25lIil9LAotCXsiR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdHZW9tZXRyeSIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdHZW9tZXRyeSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiB2YXJpYWJsZVdpZHRoQ29sdW1ucywgQm9vbGVhbiB2YXJpYWJsZUhlaWdodFJvd3MpIil9LAotCXsiR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdJdGVtSUQiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldERhdGFCcm93c2VyVGFibGVWaWV3SXRlbUlELCAxLAotCSBQeURvY19TVFIoIihVSW50MzIgcm93KSAtPiAoVUludDMyIGl0ZW0pIil9LAotCXsiU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdJdGVtUm93IiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXREYXRhQnJvd3NlclRhYmxlVmlld0l0ZW1Sb3csIDEsCi0JIFB5RG9jX1NUUigiKFVJbnQzMiBpdGVtLCBVSW50MzIgcm93KSAtPiBOb25lIil9LAotCXsiR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdJdGVtUm93IiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3NlclRhYmxlVmlld0l0ZW1Sb3csIDEsCi0JIFB5RG9jX1NUUigiKFVJbnQzMiBpdGVtKSAtPiAoVUludDMyIHJvdykiKX0sCi0JeyJTZXREYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtblBvc2l0aW9uIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXREYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtblBvc2l0aW9uLCAxLAotCSBQeURvY19TVFIoIihVSW50MzIgY29sdW1uLCBVSW50MzIgcG9zaXRpb24pIC0+IE5vbmUiKX0sCi0JeyJHZXREYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtblBvc2l0aW9uIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtblBvc2l0aW9uLCAxLAotCSBQeURvY19TVFIoIihVSW50MzIgY29sdW1uKSAtPiAoVUludDMyIHBvc2l0aW9uKSIpfSwKLQl7IkdldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uUHJvcGVydHkiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uUHJvcGVydHksIDEsCi0JIFB5RG9jX1NUUigiKFVJbnQzMiBjb2x1bW4pIC0+IChVSW50MzIgcHJvcGVydHkpIil9LAotCXsiQXV0b1NpemVEYXRhQnJvd3Nlckxpc3RWaWV3Q29sdW1ucyIsIChQeUNGdW5jdGlvbilDdGxPYmpfQXV0b1NpemVEYXRhQnJvd3Nlckxpc3RWaWV3Q29sdW1ucywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiQWRkRGF0YUJyb3dzZXJMaXN0Vmlld0NvbHVtbiIsIChQeUNGdW5jdGlvbilDdGxPYmpfQWRkRGF0YUJyb3dzZXJMaXN0Vmlld0NvbHVtbiwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUJyb3dzZXJMaXN0Vmlld0NvbHVtbkRlc2MgY29sdW1uRGVzYywgVUludDMyIHBvc2l0aW9uKSAtPiBOb25lIil9LAotCXsiU2V0RGF0YUJyb3dzZXJMaXN0Vmlld0hlYWRlckJ0bkhlaWdodCIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0RGF0YUJyb3dzZXJMaXN0Vmlld0hlYWRlckJ0bkhlaWdodCwgMSwKLQkgUHlEb2NfU1RSKCIoVUludDE2IGhlaWdodCkgLT4gTm9uZSIpfSwKLQl7IkdldERhdGFCcm93c2VyTGlzdFZpZXdIZWFkZXJCdG5IZWlnaHQiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldERhdGFCcm93c2VyTGlzdFZpZXdIZWFkZXJCdG5IZWlnaHQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQxNiBoZWlnaHQpIil9LAotCXsiU2V0RGF0YUJyb3dzZXJMaXN0Vmlld1VzZVBsYWluQmFja2dyb3VuZCIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0RGF0YUJyb3dzZXJMaXN0Vmlld1VzZVBsYWluQmFja2dyb3VuZCwgMSwKLQkgUHlEb2NfU1RSKCIoQm9vbGVhbiB1c2VQbGFpbkJhY2tncm91bmQpIC0+IE5vbmUiKX0sCi0JeyJHZXREYXRhQnJvd3Nlckxpc3RWaWV3VXNlUGxhaW5CYWNrZ3JvdW5kIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3Nlckxpc3RWaWV3VXNlUGxhaW5CYWNrZ3JvdW5kLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIHVzZVBsYWluQmFja2dyb3VuZCkiKX0sCi0JeyJTZXREYXRhQnJvd3Nlckxpc3RWaWV3RGlzY2xvc3VyZUNvbHVtbiIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0RGF0YUJyb3dzZXJMaXN0Vmlld0Rpc2Nsb3N1cmVDb2x1bW4sIDEsCi0JIFB5RG9jX1NUUigiKFVJbnQzMiBjb2x1bW4sIEJvb2xlYW4gZXhwYW5kYWJsZVJvd3MpIC0+IE5vbmUiKX0sCi0JeyJHZXREYXRhQnJvd3Nlckxpc3RWaWV3RGlzY2xvc3VyZUNvbHVtbiIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0RGF0YUJyb3dzZXJMaXN0Vmlld0Rpc2Nsb3N1cmVDb2x1bW4sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQzMiBjb2x1bW4sIEJvb2xlYW4gZXhwYW5kYWJsZVJvd3MpIil9LAotCXsiR2V0RGF0YUJyb3dzZXJDb2x1bW5WaWV3UGF0aCIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0RGF0YUJyb3dzZXJDb2x1bW5WaWV3UGF0aCwgMSwKLQkgUHlEb2NfU1RSKCIoSGFuZGxlIHBhdGgpIC0+IE5vbmUiKX0sCi0JeyJHZXREYXRhQnJvd3NlckNvbHVtblZpZXdQYXRoTGVuZ3RoIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3NlckNvbHVtblZpZXdQYXRoTGVuZ3RoLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChVSW50MzIgcGF0aExlbmd0aCkiKX0sCi0JeyJTZXREYXRhQnJvd3NlckNvbHVtblZpZXdEaXNwbGF5VHlwZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0RGF0YUJyb3dzZXJDb2x1bW5WaWV3RGlzcGxheVR5cGUsIDEsCi0JIFB5RG9jX1NUUigiKE9TVHlwZSBwcm9wZXJ0eVR5cGUpIC0+IE5vbmUiKX0sCi0JeyJHZXREYXRhQnJvd3NlckNvbHVtblZpZXdEaXNwbGF5VHlwZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0RGF0YUJyb3dzZXJDb2x1bW5WaWV3RGlzcGxheVR5cGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKE9TVHlwZSBwcm9wZXJ0eVR5cGUpIil9LAotCXsiYXNfUmVzb3VyY2UiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX2FzX1Jlc291cmNlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChIYW5kbGUgX3J2KSIpfSwKLQl7IkdldENvbnRyb2xSZWN0IiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRDb250cm9sUmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoUmVjdCByZWN0KSIpfSwKLQl7IkRpc3Bvc2VDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9EaXNwb3NlQ29udHJvbCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiVHJhY2tDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9UcmFja0NvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKFBvaW50IHN0YXJ0UG9pbnQgWyx0cmFja2VyY2FsbGJhY2tdKSAtPiAoQ29udHJvbFBhcnRDb2RlIF9ydikiKX0sCi0JeyJIYW5kbGVDb250cm9sQ2xpY2siLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0hhbmRsZUNvbnRyb2xDbGljaywgMSwKLQkgUHlEb2NfU1RSKCIoUG9pbnQgc3RhcnRQb2ludCwgSW50ZWdlciBtb2RpZmllcnMsIFssdHJhY2tlcmNhbGxiYWNrXSkgLT4gKENvbnRyb2xQYXJ0Q29kZSBfcnYpIil9LAotCXsiU2V0Q29udHJvbERhdGEiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldENvbnRyb2xEYXRhLCAxLAotCSBQeURvY19TVFIoIihzdHVmZikgLT4gTm9uZSIpfSwKLQl7IkdldENvbnRyb2xEYXRhIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRDb250cm9sRGF0YSwgMSwKLQkgUHlEb2NfU1RSKCIocGFydCwgdHlwZSkgLT4gU3RyaW5nIil9LAotCXsiU2V0Q29udHJvbERhdGFfSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXRDb250cm9sRGF0YV9IYW5kbGUsIDEsCi0JIFB5RG9jX1NUUigiKFJlc09iaikgLT4gTm9uZSIpfSwKLQl7IkdldENvbnRyb2xEYXRhX0hhbmRsZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0Q29udHJvbERhdGFfSGFuZGxlLCAxLAotCSBQeURvY19TVFIoIihwYXJ0LCB0eXBlKSAtPiBSZXNPYmoiKX0sCi0JeyJTZXRDb250cm9sRGF0YV9DYWxsYmFjayIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0Q29udHJvbERhdGFfQ2FsbGJhY2ssIDEsCi0JIFB5RG9jX1NUUigiKGNhbGxiYWNrZnVuYykgLT4gTm9uZSIpfSwKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7IkhpbGl0ZUNvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0hpbGl0ZUNvbnRyb2wsIDEsCisgICAgIFB5RG9jX1NUUigiKENvbnRyb2xQYXJ0Q29kZSBoaWxpdGVTdGF0ZSkgLT4gTm9uZSIpfSwKKyAgICB7IlNob3dDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TaG93Q29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiSGlkZUNvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0hpZGVDb250cm9sLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJJc0NvbnRyb2xBY3RpdmUiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0lzQ29udHJvbEFjdGl2ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiSXNDb250cm9sVmlzaWJsZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfSXNDb250cm9sVmlzaWJsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiQWN0aXZhdGVDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9BY3RpdmF0ZUNvbnRyb2wsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkRlYWN0aXZhdGVDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9EZWFjdGl2YXRlQ29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiU2V0Q29udHJvbFZpc2liaWxpdHkiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldENvbnRyb2xWaXNpYmlsaXR5LCAxLAorICAgICBQeURvY19TVFIoIihCb29sZWFuIGluSXNWaXNpYmxlLCBCb29sZWFuIGluRG9EcmF3KSAtPiBOb25lIil9LAorICAgIHsiSXNDb250cm9sRW5hYmxlZCIsIChQeUNGdW5jdGlvbilDdGxPYmpfSXNDb250cm9sRW5hYmxlZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiRW5hYmxlQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxPYmpfRW5hYmxlQ29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiRGlzYWJsZUNvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0Rpc2FibGVDb250cm9sLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJEcmF3MUNvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0RyYXcxQ29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiR2V0QmVzdENvbnRyb2xSZWN0IiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRCZXN0Q29udHJvbFJlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFJlY3Qgb3V0UmVjdCwgU0ludDE2IG91dEJhc2VMaW5lT2Zmc2V0KSIpfSwKKyAgICB7IlNldENvbnRyb2xGb250U3R5bGUiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldENvbnRyb2xGb250U3R5bGUsIDEsCisgICAgIFB5RG9jX1NUUigiKENvbnRyb2xGb250U3R5bGVSZWMgaW5TdHlsZSkgLT4gTm9uZSIpfSwKKyAgICB7IkRyYXdDb250cm9sSW5DdXJyZW50UG9ydCIsIChQeUNGdW5jdGlvbilDdGxPYmpfRHJhd0NvbnRyb2xJbkN1cnJlbnRQb3J0LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJTZXRVcENvbnRyb2xCYWNrZ3JvdW5kIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXRVcENvbnRyb2xCYWNrZ3JvdW5kLCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgaW5EZXB0aCwgQm9vbGVhbiBpbklzQ29sb3JEZXZpY2UpIC0+IE5vbmUiKX0sCisgICAgeyJTZXRVcENvbnRyb2xUZXh0Q29sb3IiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldFVwQ29udHJvbFRleHRDb2xvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IGluRGVwdGgsIEJvb2xlYW4gaW5Jc0NvbG9yRGV2aWNlKSAtPiBOb25lIil9LAorICAgIHsiRHJhZ0NvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0RyYWdDb250cm9sLCAxLAorICAgICBQeURvY19TVFIoIihQb2ludCBzdGFydFBvaW50LCBSZWN0IGxpbWl0UmVjdCwgUmVjdCBzbG9wUmVjdCwgRHJhZ0NvbnN0cmFpbnQgYXhpcykgLT4gTm9uZSIpfSwKKyAgICB7IlRlc3RDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9UZXN0Q29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgdGVzdFBvaW50KSAtPiAoQ29udHJvbFBhcnRDb2RlIF9ydikiKX0sCisgICAgeyJIYW5kbGVDb250cm9sQ29udGV4dHVhbE1lbnVDbGljayIsIChQeUNGdW5jdGlvbilDdGxPYmpfSGFuZGxlQ29udHJvbENvbnRleHR1YWxNZW51Q2xpY2ssIDEsCisgICAgIFB5RG9jX1NUUigiKFBvaW50IGluV2hlcmUpIC0+IChCb29sZWFuIG1lbnVEaXNwbGF5ZWQpIil9LAorICAgIHsiR2V0Q29udHJvbENsaWNrQWN0aXZhdGlvbiIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0Q29udHJvbENsaWNrQWN0aXZhdGlvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgaW5XaGVyZSwgRXZlbnRNb2RpZmllcnMgaW5Nb2RpZmllcnMpIC0+IChDbGlja0FjdGl2YXRpb25SZXN1bHQgb3V0UmVzdWx0KSIpfSwKKyAgICB7IkhhbmRsZUNvbnRyb2xLZXkiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0hhbmRsZUNvbnRyb2xLZXksIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiBpbktleUNvZGUsIFNJbnQxNiBpbkNoYXJDb2RlLCBFdmVudE1vZGlmaWVycyBpbk1vZGlmaWVycykgLT4gKENvbnRyb2xQYXJ0Q29kZSBfcnYpIil9LAorICAgIHsiSGFuZGxlQ29udHJvbFNldEN1cnNvciIsIChQeUNGdW5jdGlvbilDdGxPYmpfSGFuZGxlQ29udHJvbFNldEN1cnNvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgbG9jYWxQb2ludCwgRXZlbnRNb2RpZmllcnMgbW9kaWZpZXJzKSAtPiAoQm9vbGVhbiBjdXJzb3JXYXNTZXQpIil9LAorICAgIHsiTW92ZUNvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX01vdmVDb250cm9sLCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgaCwgU0ludDE2IHYpIC0+IE5vbmUiKX0sCisgICAgeyJTaXplQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2l6ZUNvbnRyb2wsIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiB3LCBTSW50MTYgaCkgLT4gTm9uZSIpfSwKKyAgICB7IlNldENvbnRyb2xUaXRsZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0Q29udHJvbFRpdGxlLCAxLAorICAgICBQeURvY19TVFIoIihTdHIyNTUgdGl0bGUpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRDb250cm9sVGl0bGUiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldENvbnRyb2xUaXRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoU3RyMjU1IHRpdGxlKSIpfSwKKyAgICB7IlNldENvbnRyb2xUaXRsZVdpdGhDRlN0cmluZyIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0Q29udHJvbFRpdGxlV2l0aENGU3RyaW5nLCAxLAorICAgICBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBpblN0cmluZykgLT4gTm9uZSIpfSwKKyAgICB7IkNvcHlDb250cm9sVGl0bGVBc0NGU3RyaW5nIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9Db3B5Q29udHJvbFRpdGxlQXNDRlN0cmluZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZTdHJpbmdSZWYgb3V0U3RyaW5nKSIpfSwKKyAgICB7IkdldENvbnRyb2xWYWx1ZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0Q29udHJvbFZhbHVlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChTSW50MTYgX3J2KSIpfSwKKyAgICB7IlNldENvbnRyb2xWYWx1ZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0Q29udHJvbFZhbHVlLCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgbmV3VmFsdWUpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRDb250cm9sTWluaW11bSIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0Q29udHJvbE1pbmltdW0sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFNJbnQxNiBfcnYpIil9LAorICAgIHsiU2V0Q29udHJvbE1pbmltdW0iLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldENvbnRyb2xNaW5pbXVtLCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgbmV3TWluaW11bSkgLT4gTm9uZSIpfSwKKyAgICB7IkdldENvbnRyb2xNYXhpbXVtIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRDb250cm9sTWF4aW11bSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoU0ludDE2IF9ydikiKX0sCisgICAgeyJTZXRDb250cm9sTWF4aW11bSIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0Q29udHJvbE1heGltdW0sIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiBuZXdNYXhpbXVtKSAtPiBOb25lIil9LAorICAgIHsiR2V0Q29udHJvbFZpZXdTaXplIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRDb250cm9sVmlld1NpemUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFNJbnQzMiBfcnYpIil9LAorICAgIHsiU2V0Q29udHJvbFZpZXdTaXplIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXRDb250cm9sVmlld1NpemUsIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQzMiBuZXdWaWV3U2l6ZSkgLT4gTm9uZSIpfSwKKyAgICB7IkdldENvbnRyb2wzMkJpdFZhbHVlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRDb250cm9sMzJCaXRWYWx1ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoU0ludDMyIF9ydikiKX0sCisgICAgeyJTZXRDb250cm9sMzJCaXRWYWx1ZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0Q29udHJvbDMyQml0VmFsdWUsIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQzMiBuZXdWYWx1ZSkgLT4gTm9uZSIpfSwKKyAgICB7IkdldENvbnRyb2wzMkJpdE1heGltdW0iLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldENvbnRyb2wzMkJpdE1heGltdW0sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFNJbnQzMiBfcnYpIil9LAorICAgIHsiU2V0Q29udHJvbDMyQml0TWF4aW11bSIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0Q29udHJvbDMyQml0TWF4aW11bSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDMyIG5ld01heGltdW0pIC0+IE5vbmUiKX0sCisgICAgeyJHZXRDb250cm9sMzJCaXRNaW5pbXVtIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRDb250cm9sMzJCaXRNaW5pbXVtLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChTSW50MzIgX3J2KSIpfSwKKyAgICB7IlNldENvbnRyb2wzMkJpdE1pbmltdW0iLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldENvbnRyb2wzMkJpdE1pbmltdW0sIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQzMiBuZXdNaW5pbXVtKSAtPiBOb25lIil9LAorICAgIHsiSXNWYWxpZENvbnRyb2xIYW5kbGUiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0lzVmFsaWRDb250cm9sSGFuZGxlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJTZXRDb250cm9sSUQiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldENvbnRyb2xJRCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ29udHJvbElEIGluSUQpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRDb250cm9sSUQiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldENvbnRyb2xJRCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ29udHJvbElEIG91dElEKSIpfSwKKyAgICB7IlNldENvbnRyb2xDb21tYW5kSUQiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldENvbnRyb2xDb21tYW5kSUQsIDEsCisgICAgIFB5RG9jX1NUUigiKFVJbnQzMiBpbkNvbW1hbmRJRCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldENvbnRyb2xDb21tYW5kSUQiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldENvbnRyb2xDb21tYW5kSUQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQzMiBvdXRDb21tYW5kSUQpIil9LAorICAgIHsiUmVtb3ZlQ29udHJvbFByb3BlcnR5IiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9SZW1vdmVDb250cm9sUHJvcGVydHksIDEsCisgICAgIFB5RG9jX1NUUigiKE9TVHlwZSBwcm9wZXJ0eUNyZWF0b3IsIE9TVHlwZSBwcm9wZXJ0eVRhZykgLT4gTm9uZSIpfSwKKyAgICB7IkdldENvbnRyb2xQcm9wZXJ0eUF0dHJpYnV0ZXMiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldENvbnRyb2xQcm9wZXJ0eUF0dHJpYnV0ZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKE9TVHlwZSBwcm9wZXJ0eUNyZWF0b3IsIE9TVHlwZSBwcm9wZXJ0eVRhZykgLT4gKFVJbnQzMiBhdHRyaWJ1dGVzKSIpfSwKKyAgICB7IkNoYW5nZUNvbnRyb2xQcm9wZXJ0eUF0dHJpYnV0ZXMiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0NoYW5nZUNvbnRyb2xQcm9wZXJ0eUF0dHJpYnV0ZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKE9TVHlwZSBwcm9wZXJ0eUNyZWF0b3IsIE9TVHlwZSBwcm9wZXJ0eVRhZywgVUludDMyIGF0dHJpYnV0ZXNUb1NldCwgVUludDMyIGF0dHJpYnV0ZXNUb0NsZWFyKSAtPiBOb25lIil9LAorICAgIHsiR2V0Q29udHJvbFJlZ2lvbiIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0Q29udHJvbFJlZ2lvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ29udHJvbFBhcnRDb2RlIGluUGFydCwgUmduSGFuZGxlIG91dFJlZ2lvbikgLT4gTm9uZSIpfSwKKyAgICB7IkdldENvbnRyb2xWYXJpYW50IiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRDb250cm9sVmFyaWFudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ29udHJvbFZhcmlhbnQgX3J2KSIpfSwKKyAgICB7IlNldENvbnRyb2xBY3Rpb24iLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldENvbnRyb2xBY3Rpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKFB5T2JqZWN0KiBhY3Rpb25Qcm9jKSAtPiBOb25lIil9LAorICAgIHsiU2V0Q29udHJvbFJlZmVyZW5jZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0Q29udHJvbFJlZmVyZW5jZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDMyIGRhdGEpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRDb250cm9sUmVmZXJlbmNlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRDb250cm9sUmVmZXJlbmNlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChTSW50MzIgX3J2KSIpfSwKKyAgICB7IkVtYmVkQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxPYmpfRW1iZWRDb250cm9sLCAxLAorICAgICBQeURvY19TVFIoIihDb250cm9sSGFuZGxlIGluQ29udGFpbmVyKSAtPiBOb25lIil9LAorICAgIHsiQXV0b0VtYmVkQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxPYmpfQXV0b0VtYmVkQ29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluV2luZG93KSAtPiBOb25lIil9LAorICAgIHsiR2V0U3VwZXJDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRTdXBlckNvbnRyb2wsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENvbnRyb2xIYW5kbGUgb3V0UGFyZW50KSIpfSwKKyAgICB7IkNvdW50U3ViQ29udHJvbHMiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0NvdW50U3ViQ29udHJvbHMsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQxNiBvdXROdW1DaGlsZHJlbikiKX0sCisgICAgeyJHZXRJbmRleGVkU3ViQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0SW5kZXhlZFN1YkNvbnRyb2wsIDEsCisgICAgIFB5RG9jX1NUUigiKFVJbnQxNiBpbkluZGV4KSAtPiAoQ29udHJvbEhhbmRsZSBvdXRTdWJDb250cm9sKSIpfSwKKyAgICB7IlNldENvbnRyb2xTdXBlcnZpc29yIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXRDb250cm9sU3VwZXJ2aXNvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ29udHJvbEhhbmRsZSBpbkJvc3MpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRDb250cm9sRmVhdHVyZXMiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldENvbnRyb2xGZWF0dXJlcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVUludDMyIG91dEZlYXR1cmVzKSIpfSwKKyAgICB7IkdldENvbnRyb2xEYXRhU2l6ZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0Q29udHJvbERhdGFTaXplLCAxLAorICAgICBQeURvY19TVFIoIihDb250cm9sUGFydENvZGUgaW5QYXJ0LCBSZXNUeXBlIGluVGFnTmFtZSkgLT4gKFNpemUgb3V0TWF4U2l6ZSkiKX0sCisgICAgeyJIYW5kbGVDb250cm9sRHJhZ1RyYWNraW5nIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9IYW5kbGVDb250cm9sRHJhZ1RyYWNraW5nLCAxLAorICAgICBQeURvY19TVFIoIihEcmFnVHJhY2tpbmdNZXNzYWdlIGluTWVzc2FnZSwgRHJhZ1JlZmVyZW5jZSBpbkRyYWcpIC0+IChCb29sZWFuIG91dExpa2VzRHJhZykiKX0sCisgICAgeyJIYW5kbGVDb250cm9sRHJhZ1JlY2VpdmUiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0hhbmRsZUNvbnRyb2xEcmFnUmVjZWl2ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRHJhZ1JlZmVyZW5jZSBpbkRyYWcpIC0+IE5vbmUiKX0sCisgICAgeyJTZXRDb250cm9sRHJhZ1RyYWNraW5nRW5hYmxlZCIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0Q29udHJvbERyYWdUcmFja2luZ0VuYWJsZWQsIDEsCisgICAgIFB5RG9jX1NUUigiKEJvb2xlYW4gaW5UcmFja3MpIC0+IE5vbmUiKX0sCisgICAgeyJJc0NvbnRyb2xEcmFnVHJhY2tpbmdFbmFibGVkIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9Jc0NvbnRyb2xEcmFnVHJhY2tpbmdFbmFibGVkLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIG91dFRyYWNrcykiKX0sCisgICAgeyJHZXRDb250cm9sQm91bmRzIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRDb250cm9sQm91bmRzLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChSZWN0IGJvdW5kcykiKX0sCisgICAgeyJJc0NvbnRyb2xIaWxpdGVkIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9Jc0NvbnRyb2xIaWxpdGVkLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJHZXRDb250cm9sSGlsaXRlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRDb250cm9sSGlsaXRlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChVSW50MTYgX3J2KSIpfSwKKyAgICB7IkdldENvbnRyb2xPd25lciIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0Q29udHJvbE93bmVyLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChXaW5kb3dQdHIgX3J2KSIpfSwKKyAgICB7IkdldENvbnRyb2xEYXRhSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRDb250cm9sRGF0YUhhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoSGFuZGxlIF9ydikiKX0sCisgICAgeyJHZXRDb250cm9sUG9wdXBNZW51SGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRDb250cm9sUG9wdXBNZW51SGFuZGxlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChNZW51SGFuZGxlIF9ydikiKX0sCisgICAgeyJHZXRDb250cm9sUG9wdXBNZW51SUQiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldENvbnRyb2xQb3B1cE1lbnVJRCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgX3J2KSIpfSwKKyAgICB7IlNldENvbnRyb2xEYXRhSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXRDb250cm9sRGF0YUhhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSGFuZGxlIGRhdGFIYW5kbGUpIC0+IE5vbmUiKX0sCisgICAgeyJTZXRDb250cm9sQm91bmRzIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXRDb250cm9sQm91bmRzLCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IGJvdW5kcykgLT4gTm9uZSIpfSwKKyAgICB7IlNldENvbnRyb2xQb3B1cE1lbnVIYW5kbGUiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldENvbnRyb2xQb3B1cE1lbnVIYW5kbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lbnVIYW5kbGUgcG9wdXBNZW51KSAtPiBOb25lIil9LAorICAgIHsiU2V0Q29udHJvbFBvcHVwTWVudUlEIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXRDb250cm9sUG9wdXBNZW51SUQsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IG1lbnVJRCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldEJldmVsQnV0dG9uTWVudVZhbHVlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRCZXZlbEJ1dHRvbk1lbnVWYWx1ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoU0ludDE2IG91dFZhbHVlKSIpfSwKKyAgICB7IlNldEJldmVsQnV0dG9uTWVudVZhbHVlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXRCZXZlbEJ1dHRvbk1lbnVWYWx1ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IGluVmFsdWUpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRCZXZlbEJ1dHRvbk1lbnVIYW5kbGUiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldEJldmVsQnV0dG9uTWVudUhhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoTWVudUhhbmRsZSBvdXRIYW5kbGUpIil9LAorICAgIHsiU2V0QmV2ZWxCdXR0b25Db250ZW50SW5mbyIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0QmV2ZWxCdXR0b25Db250ZW50SW5mbywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvIGluQ29udGVudCkgLT4gTm9uZSIpfSwKKyAgICB7IlNldEJldmVsQnV0dG9uVHJhbnNmb3JtIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXRCZXZlbEJ1dHRvblRyYW5zZm9ybSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSWNvblRyYW5zZm9ybVR5cGUgdHJhbnNmb3JtKSAtPiBOb25lIil9LAorICAgIHsiU2V0RGlzY2xvc3VyZVRyaWFuZ2xlTGFzdFZhbHVlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXREaXNjbG9zdXJlVHJpYW5nbGVMYXN0VmFsdWUsIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiBpblZhbHVlKSAtPiBOb25lIil9LAorICAgIHsiR2V0VGFiQ29udGVudFJlY3QiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldFRhYkNvbnRlbnRSZWN0LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChSZWN0IG91dENvbnRlbnRSZWN0KSIpfSwKKyAgICB7IlNldFRhYkVuYWJsZWQiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldFRhYkVuYWJsZWQsIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiBpblRhYlRvSGlsaXRlLCBCb29sZWFuIGluRW5hYmxlZCkgLT4gTm9uZSIpfSwKKyAgICB7IlNldEltYWdlV2VsbENvbnRlbnRJbmZvIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXRJbWFnZVdlbGxDb250ZW50SW5mbywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvIGluQ29udGVudCkgLT4gTm9uZSIpfSwKKyAgICB7IlNldEltYWdlV2VsbFRyYW5zZm9ybSIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0SW1hZ2VXZWxsVHJhbnNmb3JtLCAxLAorICAgICBQeURvY19TVFIoIihJY29uVHJhbnNmb3JtVHlwZSBpblRyYW5zZm9ybSkgLT4gTm9uZSIpfSwKKyAgICB7IkdldERhdGFCcm93c2VyVmlld1N0eWxlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3NlclZpZXdTdHlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoT1NUeXBlIHN0eWxlKSIpfSwKKyAgICB7IlNldERhdGFCcm93c2VyVmlld1N0eWxlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXREYXRhQnJvd3NlclZpZXdTdHlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoT1NUeXBlIHN0eWxlKSAtPiBOb25lIil9LAorICAgIHsiRW5hYmxlRGF0YUJyb3dzZXJFZGl0Q29tbWFuZCIsIChQeUNGdW5jdGlvbilDdGxPYmpfRW5hYmxlRGF0YUJyb3dzZXJFZGl0Q29tbWFuZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVUludDMyIGNvbW1hbmQpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJFeGVjdXRlRGF0YUJyb3dzZXJFZGl0Q29tbWFuZCIsIChQeUNGdW5jdGlvbilDdGxPYmpfRXhlY3V0ZURhdGFCcm93c2VyRWRpdENvbW1hbmQsIDEsCisgICAgIFB5RG9jX1NUUigiKFVJbnQzMiBjb21tYW5kKSAtPiBOb25lIil9LAorICAgIHsiR2V0RGF0YUJyb3dzZXJTZWxlY3Rpb25BbmNob3IiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldERhdGFCcm93c2VyU2VsZWN0aW9uQW5jaG9yLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChVSW50MzIgZmlyc3QsIFVJbnQzMiBsYXN0KSIpfSwKKyAgICB7Ik1vdmVEYXRhQnJvd3NlclNlbGVjdGlvbkFuY2hvciIsIChQeUNGdW5jdGlvbilDdGxPYmpfTW92ZURhdGFCcm93c2VyU2VsZWN0aW9uQW5jaG9yLCAxLAorICAgICBQeURvY19TVFIoIihVSW50MzIgZGlyZWN0aW9uLCBCb29sZWFuIGV4dGVuZFNlbGVjdGlvbikgLT4gTm9uZSIpfSwKKyAgICB7Ik9wZW5EYXRhQnJvd3NlckNvbnRhaW5lciIsIChQeUNGdW5jdGlvbilDdGxPYmpfT3BlbkRhdGFCcm93c2VyQ29udGFpbmVyLCAxLAorICAgICBQeURvY19TVFIoIihVSW50MzIgY29udGFpbmVyKSAtPiBOb25lIil9LAorICAgIHsiQ2xvc2VEYXRhQnJvd3NlckNvbnRhaW5lciIsIChQeUNGdW5jdGlvbilDdGxPYmpfQ2xvc2VEYXRhQnJvd3NlckNvbnRhaW5lciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVUludDMyIGNvbnRhaW5lcikgLT4gTm9uZSIpfSwKKyAgICB7IlNvcnREYXRhQnJvd3NlckNvbnRhaW5lciIsIChQeUNGdW5jdGlvbilDdGxPYmpfU29ydERhdGFCcm93c2VyQ29udGFpbmVyLCAxLAorICAgICBQeURvY19TVFIoIihVSW50MzIgY29udGFpbmVyLCBCb29sZWFuIHNvcnRDaGlsZHJlbikgLT4gTm9uZSIpfSwKKyAgICB7IkdldERhdGFCcm93c2VySXRlbXMiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldERhdGFCcm93c2VySXRlbXMsIDEsCisgICAgIFB5RG9jX1NUUigiKFVJbnQzMiBjb250YWluZXIsIEJvb2xlYW4gcmVjdXJzZSwgVUludDMyIHN0YXRlLCBIYW5kbGUgaXRlbXMpIC0+IE5vbmUiKX0sCisgICAgeyJHZXREYXRhQnJvd3Nlckl0ZW1Db3VudCIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0RGF0YUJyb3dzZXJJdGVtQ291bnQsIDEsCisgICAgIFB5RG9jX1NUUigiKFVJbnQzMiBjb250YWluZXIsIEJvb2xlYW4gcmVjdXJzZSwgVUludDMyIHN0YXRlKSAtPiAoVUludDMyIG51bUl0ZW1zKSIpfSwKKyAgICB7IklzRGF0YUJyb3dzZXJJdGVtU2VsZWN0ZWQiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0lzRGF0YUJyb3dzZXJJdGVtU2VsZWN0ZWQsIDEsCisgICAgIFB5RG9jX1NUUigiKFVJbnQzMiBpdGVtKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiR2V0RGF0YUJyb3dzZXJJdGVtU3RhdGUiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldERhdGFCcm93c2VySXRlbVN0YXRlLCAxLAorICAgICBQeURvY19TVFIoIihVSW50MzIgaXRlbSkgLT4gKFVJbnQzMiBzdGF0ZSkiKX0sCisgICAgeyJSZXZlYWxEYXRhQnJvd3Nlckl0ZW0iLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1JldmVhbERhdGFCcm93c2VySXRlbSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVUludDMyIGl0ZW0sIFVJbnQzMiBwcm9wZXJ0eUlELCBVSW50OCBvcHRpb25zKSAtPiBOb25lIil9LAorICAgIHsiU2V0RGF0YUJyb3dzZXJBY3RpdmVJdGVtcyIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0RGF0YUJyb3dzZXJBY3RpdmVJdGVtcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQm9vbGVhbiBhY3RpdmUpIC0+IE5vbmUiKX0sCisgICAgeyJHZXREYXRhQnJvd3NlckFjdGl2ZUl0ZW1zIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3NlckFjdGl2ZUl0ZW1zLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIGFjdGl2ZSkiKX0sCisgICAgeyJTZXREYXRhQnJvd3NlclNjcm9sbEJhckluc2V0IiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXREYXRhQnJvd3NlclNjcm9sbEJhckluc2V0LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChSZWN0IGluc2V0UmVjdCkiKX0sCisgICAgeyJHZXREYXRhQnJvd3NlclNjcm9sbEJhckluc2V0IiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3NlclNjcm9sbEJhckluc2V0LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChSZWN0IGluc2V0UmVjdCkiKX0sCisgICAgeyJTZXREYXRhQnJvd3NlclRhcmdldCIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0RGF0YUJyb3dzZXJUYXJnZXQsIDEsCisgICAgIFB5RG9jX1NUUigiKFVJbnQzMiB0YXJnZXQpIC0+IE5vbmUiKX0sCisgICAgeyJHZXREYXRhQnJvd3NlclRhcmdldCIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0RGF0YUJyb3dzZXJUYXJnZXQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQzMiB0YXJnZXQpIil9LAorICAgIHsiU2V0RGF0YUJyb3dzZXJTb3J0T3JkZXIiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldERhdGFCcm93c2VyU29ydE9yZGVyLCAxLAorICAgICBQeURvY19TVFIoIihVSW50MTYgb3JkZXIpIC0+IE5vbmUiKX0sCisgICAgeyJHZXREYXRhQnJvd3NlclNvcnRPcmRlciIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0RGF0YUJyb3dzZXJTb3J0T3JkZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQxNiBvcmRlcikiKX0sCisgICAgeyJTZXREYXRhQnJvd3NlclNjcm9sbFBvc2l0aW9uIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXREYXRhQnJvd3NlclNjcm9sbFBvc2l0aW9uLCAxLAorICAgICBQeURvY19TVFIoIihVSW50MzIgdG9wLCBVSW50MzIgbGVmdCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldERhdGFCcm93c2VyU2Nyb2xsUG9zaXRpb24iLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldERhdGFCcm93c2VyU2Nyb2xsUG9zaXRpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQzMiB0b3AsIFVJbnQzMiBsZWZ0KSIpfSwKKyAgICB7IlNldERhdGFCcm93c2VySGFzU2Nyb2xsQmFycyIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0RGF0YUJyb3dzZXJIYXNTY3JvbGxCYXJzLCAxLAorICAgICBQeURvY19TVFIoIihCb29sZWFuIGhvcml6LCBCb29sZWFuIHZlcnQpIC0+IE5vbmUiKX0sCisgICAgeyJHZXREYXRhQnJvd3Nlckhhc1Njcm9sbEJhcnMiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldERhdGFCcm93c2VySGFzU2Nyb2xsQmFycywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBob3JpeiwgQm9vbGVhbiB2ZXJ0KSIpfSwKKyAgICB7IlNldERhdGFCcm93c2VyU29ydFByb3BlcnR5IiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXREYXRhQnJvd3NlclNvcnRQcm9wZXJ0eSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVUludDMyIHByb3BlcnR5KSAtPiBOb25lIil9LAorICAgIHsiR2V0RGF0YUJyb3dzZXJTb3J0UHJvcGVydHkiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldERhdGFCcm93c2VyU29ydFByb3BlcnR5LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChVSW50MzIgcHJvcGVydHkpIil9LAorICAgIHsiU2V0RGF0YUJyb3dzZXJTZWxlY3Rpb25GbGFncyIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0RGF0YUJyb3dzZXJTZWxlY3Rpb25GbGFncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoVUludDMyIHNlbGVjdGlvbkZsYWdzKSAtPiBOb25lIil9LAorICAgIHsiR2V0RGF0YUJyb3dzZXJTZWxlY3Rpb25GbGFncyIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0RGF0YUJyb3dzZXJTZWxlY3Rpb25GbGFncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVUludDMyIHNlbGVjdGlvbkZsYWdzKSIpfSwKKyAgICB7IlNldERhdGFCcm93c2VyUHJvcGVydHlGbGFncyIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0RGF0YUJyb3dzZXJQcm9wZXJ0eUZsYWdzLCAxLAorICAgICBQeURvY19TVFIoIihVSW50MzIgcHJvcGVydHksIFVJbnQzMiBmbGFncykgLT4gTm9uZSIpfSwKKyAgICB7IkdldERhdGFCcm93c2VyUHJvcGVydHlGbGFncyIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0RGF0YUJyb3dzZXJQcm9wZXJ0eUZsYWdzLCAxLAorICAgICBQeURvY19TVFIoIihVSW50MzIgcHJvcGVydHkpIC0+IChVSW50MzIgZmxhZ3MpIil9LAorICAgIHsiU2V0RGF0YUJyb3dzZXJFZGl0VGV4dCIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0RGF0YUJyb3dzZXJFZGl0VGV4dCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgdGV4dCkgLT4gTm9uZSIpfSwKKyAgICB7IkNvcHlEYXRhQnJvd3NlckVkaXRUZXh0IiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9Db3B5RGF0YUJyb3dzZXJFZGl0VGV4dCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZTdHJpbmdSZWYgdGV4dCkiKX0sCisgICAgeyJHZXREYXRhQnJvd3NlckVkaXRUZXh0IiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3NlckVkaXRUZXh0LCAxLAorICAgICBQeURvY19TVFIoIihDRk11dGFibGVTdHJpbmdSZWYgdGV4dCkgLT4gTm9uZSIpfSwKKyAgICB7IlNldERhdGFCcm93c2VyRWRpdEl0ZW0iLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldERhdGFCcm93c2VyRWRpdEl0ZW0sIDEsCisgICAgIFB5RG9jX1NUUigiKFVJbnQzMiBpdGVtLCBVSW50MzIgcHJvcGVydHkpIC0+IE5vbmUiKX0sCisgICAgeyJHZXREYXRhQnJvd3NlckVkaXRJdGVtIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3NlckVkaXRJdGVtLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChVSW50MzIgaXRlbSwgVUludDMyIHByb3BlcnR5KSIpfSwKKyAgICB7IkdldERhdGFCcm93c2VySXRlbVBhcnRCb3VuZHMiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldERhdGFCcm93c2VySXRlbVBhcnRCb3VuZHMsIDEsCisgICAgIFB5RG9jX1NUUigiKFVJbnQzMiBpdGVtLCBVSW50MzIgcHJvcGVydHksIE9TVHlwZSBwYXJ0KSAtPiAoUmVjdCBib3VuZHMpIil9LAorICAgIHsiUmVtb3ZlRGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW4iLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1JlbW92ZURhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uLCAxLAorICAgICBQeURvY19TVFIoIihVSW50MzIgY29sdW1uKSAtPiBOb25lIil9LAorICAgIHsiR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5Db3VudCIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5Db3VudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVUludDMyIG51bUNvbHVtbnMpIil9LAorICAgIHsiU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdIaWxpdGVTdHlsZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdIaWxpdGVTdHlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVUludDMyIGhpbGl0ZVN0eWxlKSAtPiBOb25lIil9LAorICAgIHsiR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdIaWxpdGVTdHlsZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdIaWxpdGVTdHlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVUludDMyIGhpbGl0ZVN0eWxlKSIpfSwKKyAgICB7IlNldERhdGFCcm93c2VyVGFibGVWaWV3Um93SGVpZ2h0IiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXREYXRhQnJvd3NlclRhYmxlVmlld1Jvd0hlaWdodCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVUludDE2IGhlaWdodCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldERhdGFCcm93c2VyVGFibGVWaWV3Um93SGVpZ2h0IiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3NlclRhYmxlVmlld1Jvd0hlaWdodCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVUludDE2IGhlaWdodCkiKX0sCisgICAgeyJTZXREYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtbldpZHRoIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXREYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtbldpZHRoLCAxLAorICAgICBQeURvY19TVFIoIihVSW50MTYgd2lkdGgpIC0+IE5vbmUiKX0sCisgICAgeyJHZXREYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtbldpZHRoIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtbldpZHRoLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChVSW50MTYgd2lkdGgpIil9LAorICAgIHsiU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdJdGVtUm93SGVpZ2h0IiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXREYXRhQnJvd3NlclRhYmxlVmlld0l0ZW1Sb3dIZWlnaHQsIDEsCisgICAgIFB5RG9jX1NUUigiKFVJbnQzMiBpdGVtLCBVSW50MTYgaGVpZ2h0KSAtPiBOb25lIil9LAorICAgIHsiR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdJdGVtUm93SGVpZ2h0IiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3NlclRhYmxlVmlld0l0ZW1Sb3dIZWlnaHQsIDEsCisgICAgIFB5RG9jX1NUUigiKFVJbnQzMiBpdGVtKSAtPiAoVUludDE2IGhlaWdodCkiKX0sCisgICAgeyJTZXREYXRhQnJvd3NlclRhYmxlVmlld05hbWVkQ29sdW1uV2lkdGgiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldERhdGFCcm93c2VyVGFibGVWaWV3TmFtZWRDb2x1bW5XaWR0aCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVUludDMyIGNvbHVtbiwgVUludDE2IHdpZHRoKSAtPiBOb25lIil9LAorICAgIHsiR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdOYW1lZENvbHVtbldpZHRoIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3NlclRhYmxlVmlld05hbWVkQ29sdW1uV2lkdGgsIDEsCisgICAgIFB5RG9jX1NUUigiKFVJbnQzMiBjb2x1bW4pIC0+IChVSW50MTYgd2lkdGgpIil9LAorICAgIHsiU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdHZW9tZXRyeSIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdHZW9tZXRyeSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQm9vbGVhbiB2YXJpYWJsZVdpZHRoQ29sdW1ucywgQm9vbGVhbiB2YXJpYWJsZUhlaWdodFJvd3MpIC0+IE5vbmUiKX0sCisgICAgeyJHZXREYXRhQnJvd3NlclRhYmxlVmlld0dlb21ldHJ5IiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3NlclRhYmxlVmlld0dlb21ldHJ5LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIHZhcmlhYmxlV2lkdGhDb2x1bW5zLCBCb29sZWFuIHZhcmlhYmxlSGVpZ2h0Um93cykiKX0sCisgICAgeyJHZXREYXRhQnJvd3NlclRhYmxlVmlld0l0ZW1JRCIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdJdGVtSUQsIDEsCisgICAgIFB5RG9jX1NUUigiKFVJbnQzMiByb3cpIC0+IChVSW50MzIgaXRlbSkiKX0sCisgICAgeyJTZXREYXRhQnJvd3NlclRhYmxlVmlld0l0ZW1Sb3ciLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldERhdGFCcm93c2VyVGFibGVWaWV3SXRlbVJvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoVUludDMyIGl0ZW0sIFVJbnQzMiByb3cpIC0+IE5vbmUiKX0sCisgICAgeyJHZXREYXRhQnJvd3NlclRhYmxlVmlld0l0ZW1Sb3ciLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldERhdGFCcm93c2VyVGFibGVWaWV3SXRlbVJvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoVUludDMyIGl0ZW0pIC0+IChVSW50MzIgcm93KSIpfSwKKyAgICB7IlNldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uUG9zaXRpb24iLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uUG9zaXRpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKFVJbnQzMiBjb2x1bW4sIFVJbnQzMiBwb3NpdGlvbikgLT4gTm9uZSIpfSwKKyAgICB7IkdldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uUG9zaXRpb24iLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uUG9zaXRpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKFVJbnQzMiBjb2x1bW4pIC0+IChVSW50MzIgcG9zaXRpb24pIil9LAorICAgIHsiR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5Qcm9wZXJ0eSIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5Qcm9wZXJ0eSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVUludDMyIGNvbHVtbikgLT4gKFVJbnQzMiBwcm9wZXJ0eSkiKX0sCisgICAgeyJBdXRvU2l6ZURhdGFCcm93c2VyTGlzdFZpZXdDb2x1bW5zIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9BdXRvU2l6ZURhdGFCcm93c2VyTGlzdFZpZXdDb2x1bW5zLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJBZGREYXRhQnJvd3Nlckxpc3RWaWV3Q29sdW1uIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9BZGREYXRhQnJvd3Nlckxpc3RWaWV3Q29sdW1uLCAxLAorICAgICBQeURvY19TVFIoIihEYXRhQnJvd3Nlckxpc3RWaWV3Q29sdW1uRGVzYyBjb2x1bW5EZXNjLCBVSW50MzIgcG9zaXRpb24pIC0+IE5vbmUiKX0sCisgICAgeyJTZXREYXRhQnJvd3Nlckxpc3RWaWV3SGVhZGVyQnRuSGVpZ2h0IiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXREYXRhQnJvd3Nlckxpc3RWaWV3SGVhZGVyQnRuSGVpZ2h0LCAxLAorICAgICBQeURvY19TVFIoIihVSW50MTYgaGVpZ2h0KSAtPiBOb25lIil9LAorICAgIHsiR2V0RGF0YUJyb3dzZXJMaXN0Vmlld0hlYWRlckJ0bkhlaWdodCIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0RGF0YUJyb3dzZXJMaXN0Vmlld0hlYWRlckJ0bkhlaWdodCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVUludDE2IGhlaWdodCkiKX0sCisgICAgeyJTZXREYXRhQnJvd3Nlckxpc3RWaWV3VXNlUGxhaW5CYWNrZ3JvdW5kIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXREYXRhQnJvd3Nlckxpc3RWaWV3VXNlUGxhaW5CYWNrZ3JvdW5kLCAxLAorICAgICBQeURvY19TVFIoIihCb29sZWFuIHVzZVBsYWluQmFja2dyb3VuZCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldERhdGFCcm93c2VyTGlzdFZpZXdVc2VQbGFpbkJhY2tncm91bmQiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldERhdGFCcm93c2VyTGlzdFZpZXdVc2VQbGFpbkJhY2tncm91bmQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gdXNlUGxhaW5CYWNrZ3JvdW5kKSIpfSwKKyAgICB7IlNldERhdGFCcm93c2VyTGlzdFZpZXdEaXNjbG9zdXJlQ29sdW1uIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXREYXRhQnJvd3Nlckxpc3RWaWV3RGlzY2xvc3VyZUNvbHVtbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVUludDMyIGNvbHVtbiwgQm9vbGVhbiBleHBhbmRhYmxlUm93cykgLT4gTm9uZSIpfSwKKyAgICB7IkdldERhdGFCcm93c2VyTGlzdFZpZXdEaXNjbG9zdXJlQ29sdW1uIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3Nlckxpc3RWaWV3RGlzY2xvc3VyZUNvbHVtbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVUludDMyIGNvbHVtbiwgQm9vbGVhbiBleHBhbmRhYmxlUm93cykiKX0sCisgICAgeyJHZXREYXRhQnJvd3NlckNvbHVtblZpZXdQYXRoIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3NlckNvbHVtblZpZXdQYXRoLCAxLAorICAgICBQeURvY19TVFIoIihIYW5kbGUgcGF0aCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldERhdGFCcm93c2VyQ29sdW1uVmlld1BhdGhMZW5ndGgiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldERhdGFCcm93c2VyQ29sdW1uVmlld1BhdGhMZW5ndGgsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQzMiBwYXRoTGVuZ3RoKSIpfSwKKyAgICB7IlNldERhdGFCcm93c2VyQ29sdW1uVmlld0Rpc3BsYXlUeXBlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXREYXRhQnJvd3NlckNvbHVtblZpZXdEaXNwbGF5VHlwZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoT1NUeXBlIHByb3BlcnR5VHlwZSkgLT4gTm9uZSIpfSwKKyAgICB7IkdldERhdGFCcm93c2VyQ29sdW1uVmlld0Rpc3BsYXlUeXBlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3NlckNvbHVtblZpZXdEaXNwbGF5VHlwZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoT1NUeXBlIHByb3BlcnR5VHlwZSkiKX0sCisgICAgeyJhc19SZXNvdXJjZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfYXNfUmVzb3VyY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEhhbmRsZSBfcnYpIil9LAorICAgIHsiR2V0Q29udHJvbFJlY3QiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldENvbnRyb2xSZWN0LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChSZWN0IHJlY3QpIil9LAorICAgIHsiRGlzcG9zZUNvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0Rpc3Bvc2VDb250cm9sLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJUcmFja0NvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1RyYWNrQ29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgc3RhcnRQb2ludCBbLHRyYWNrZXJjYWxsYmFja10pIC0+IChDb250cm9sUGFydENvZGUgX3J2KSIpfSwKKyAgICB7IkhhbmRsZUNvbnRyb2xDbGljayIsIChQeUNGdW5jdGlvbilDdGxPYmpfSGFuZGxlQ29udHJvbENsaWNrLCAxLAorICAgICBQeURvY19TVFIoIihQb2ludCBzdGFydFBvaW50LCBJbnRlZ2VyIG1vZGlmaWVycywgWyx0cmFja2VyY2FsbGJhY2tdKSAtPiAoQ29udHJvbFBhcnRDb2RlIF9ydikiKX0sCisgICAgeyJTZXRDb250cm9sRGF0YSIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0Q29udHJvbERhdGEsIDEsCisgICAgIFB5RG9jX1NUUigiKHN0dWZmKSAtPiBOb25lIil9LAorICAgIHsiR2V0Q29udHJvbERhdGEiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldENvbnRyb2xEYXRhLCAxLAorICAgICBQeURvY19TVFIoIihwYXJ0LCB0eXBlKSAtPiBTdHJpbmciKX0sCisgICAgeyJTZXRDb250cm9sRGF0YV9IYW5kbGUiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldENvbnRyb2xEYXRhX0hhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVzT2JqKSAtPiBOb25lIil9LAorICAgIHsiR2V0Q29udHJvbERhdGFfSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRDb250cm9sRGF0YV9IYW5kbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKHBhcnQsIHR5cGUpIC0+IFJlc09iaiIpfSwKKyAgICB7IlNldENvbnRyb2xEYXRhX0NhbGxiYWNrIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXRDb250cm9sRGF0YV9DYWxsYmFjaywgMSwKKyAgICAgUHlEb2NfU1RSKCIoY2FsbGJhY2tmdW5jKSAtPiBOb25lIil9LAorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogI2RlZmluZSBDdGxPYmpfZ2V0c2V0bGlzdCBOVUxMCkBAIC0zODIzLDI4ICszODIzLDI4IEBACiAKIHN0YXRpYyBpbnQgQ3RsT2JqX2NvbXBhcmUoQ29udHJvbE9iamVjdCAqc2VsZiwgQ29udHJvbE9iamVjdCAqb3RoZXIpCiB7Ci0JdW5zaWduZWQgbG9uZyB2LCB3OworICAgIHVuc2lnbmVkIGxvbmcgdiwgdzsKIAotCWlmICghQ3RsT2JqX0NoZWNrKChQeU9iamVjdCAqKW90aGVyKSkKLQl7Ci0JCXY9KHVuc2lnbmVkIGxvbmcpc2VsZjsKLQkJdz0odW5zaWduZWQgbG9uZylvdGhlcjsKLQl9Ci0JZWxzZQotCXsKLQkJdj0odW5zaWduZWQgbG9uZylzZWxmLT5vYl9pdHNlbGY7Ci0JCXc9KHVuc2lnbmVkIGxvbmcpb3RoZXItPm9iX2l0c2VsZjsKLQl9Ci0JaWYoIHYgPCB3ICkgcmV0dXJuIC0xOwotCWlmKCB2ID4gdyApIHJldHVybiAxOwotCXJldHVybiAwOworICAgIGlmICghQ3RsT2JqX0NoZWNrKChQeU9iamVjdCAqKW90aGVyKSkKKyAgICB7CisgICAgICAgIHY9KHVuc2lnbmVkIGxvbmcpc2VsZjsKKyAgICAgICAgdz0odW5zaWduZWQgbG9uZylvdGhlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdj0odW5zaWduZWQgbG9uZylzZWxmLT5vYl9pdHNlbGY7CisgICAgICAgIHc9KHVuc2lnbmVkIGxvbmcpb3RoZXItPm9iX2l0c2VsZjsKKyAgICB9CisgICAgaWYoIHYgPCB3ICkgcmV0dXJuIC0xOworICAgIGlmKCB2ID4gdyApIHJldHVybiAxOworICAgIHJldHVybiAwOwogfQogCiAjZGVmaW5lIEN0bE9ial9yZXByIE5VTEwKIAogc3RhdGljIGxvbmcgQ3RsT2JqX2hhc2goQ29udHJvbE9iamVjdCAqc2VsZikKIHsKLQlyZXR1cm4gKGxvbmcpc2VsZi0+b2JfaXRzZWxmOworICAgIHJldHVybiAobG9uZylzZWxmLT5vYl9pdHNlbGY7CiB9CiAjZGVmaW5lIEN0bE9ial90cF9pbml0IDAKIApAQCAtMzg1Miw2MSArMzg1Miw2MSBAQAogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial90cF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlQeU9iamVjdCAqX3NlbGY7Ci0JQ29udHJvbEhhbmRsZSBpdHNlbGY7Ci0JY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CisgICAgUHlPYmplY3QgKl9zZWxmOworICAgIENvbnRyb2xIYW5kbGUgaXRzZWxmOworICAgIGNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgQ3RsT2JqX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKLQlpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOwotCSgoQ29udHJvbE9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiBfc2VsZjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBDdGxPYmpfQ29udmVydCwgJml0c2VsZikpIHJldHVybiBOVUxMOworICAgIGlmICgoX3NlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgKChDb250cm9sT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgcmV0dXJuIF9zZWxmOwogfQogCiAjZGVmaW5lIEN0bE9ial90cF9mcmVlIFB5T2JqZWN0X0RlbAogCiAKIFB5VHlwZU9iamVjdCBDb250cm9sX1R5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCi0JMCwgLypvYl9zaXplKi8KLQkiX0N0bC5Db250cm9sIiwgLyp0cF9uYW1lKi8KLQlzaXplb2YoQ29udHJvbE9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KLQkwLCAvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpIEN0bE9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsIC8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLwotCShjbXBmdW5jKSBDdGxPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpIEN0bE9ial9yZXByLCAvKnRwX3JlcHIqLwotCShQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KLQkoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLwotCShQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYykgQ3RsT2JqX2hhc2gsIC8qdHBfaGFzaCovCi0JMCwgLyp0cF9jYWxsKi8KLQkwLCAvKnRwX3N0ciovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLwotCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCi0JMCwgLyp0cF9hc19idWZmZXIqLwotCVB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCTAsIC8qdHBfZG9jKi8KLQkwLCAvKnRwX3RyYXZlcnNlKi8KLQkwLCAvKnRwX2NsZWFyKi8KLQkwLCAvKnRwX3JpY2hjb21wYXJlKi8KLQkwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLQkwLCAvKnRwX2l0ZXIqLwotCTAsIC8qdHBfaXRlcm5leHQqLwotCUN0bE9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCi0JMCwgLyp0cF9tZW1iZXJzKi8KLQlDdGxPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLwotCTAsIC8qdHBfYmFzZSovCi0JMCwgLyp0cF9kaWN0Ki8KLQkwLCAvKnRwX2Rlc2NyX2dldCovCi0JMCwgLyp0cF9kZXNjcl9zZXQqLwotCTAsIC8qdHBfZGljdG9mZnNldCovCi0JQ3RsT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KLQlDdGxPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCi0JQ3RsT2JqX3RwX25ldywgLyogdHBfbmV3ICovCi0JQ3RsT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAvKm9iX3NpemUqLworICAgICJfQ3RsLkNvbnRyb2wiLCAvKnRwX25hbWUqLworICAgIHNpemVvZihDb250cm9sT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLworICAgIDAsIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcikgQ3RsT2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgMCwgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCisgICAgKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCisgICAgKGNtcGZ1bmMpIEN0bE9ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLworICAgIChyZXByZnVuYykgQ3RsT2JqX3JlcHIsIC8qdHBfcmVwciovCisgICAgKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLworICAgIChQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKSBDdGxPYmpfaGFzaCwgLyp0cF9oYXNoKi8KKyAgICAwLCAvKnRwX2NhbGwqLworICAgIDAsIC8qdHBfc3RyKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCisgICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgMCwgLyp0cF9kb2MqLworICAgIDAsIC8qdHBfdHJhdmVyc2UqLworICAgIDAsIC8qdHBfY2xlYXIqLworICAgIDAsIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsIC8qdHBfaXRlciovCisgICAgMCwgLyp0cF9pdGVybmV4dCovCisgICAgQ3RsT2JqX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAvKnRwX21lbWJlcnMqLworICAgIEN0bE9ial9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCisgICAgMCwgLyp0cF9iYXNlKi8KKyAgICAwLCAvKnRwX2RpY3QqLworICAgIDAsIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICBDdGxPYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLworICAgIEN0bE9ial90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KKyAgICBDdGxPYmpfdHBfbmV3LCAvKiB0cF9uZXcgKi8KKyAgICBDdGxPYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0gRW5kIG9iamVjdCB0eXBlIENvbnRyb2wgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0zOTE0LDE2MTYgKzM5MTQsMTYxNiBAQAogCiBzdGF0aWMgUHlPYmplY3QgKkN0bF9OZXdDb250cm9sKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb250cm9sSGFuZGxlIF9ydjsKLQlXaW5kb3dQdHIgb3duaW5nV2luZG93OwotCVJlY3QgYm91bmRzUmVjdDsKLQlTdHIyNTUgY29udHJvbFRpdGxlOwotCUJvb2xlYW4gaW5pdGlhbGx5VmlzaWJsZTsKLQlTSW50MTYgaW5pdGlhbFZhbHVlOwotCVNJbnQxNiBtaW5pbXVtVmFsdWU7Ci0JU0ludDE2IG1heGltdW1WYWx1ZTsKLQlTSW50MTYgcHJvY0lEOwotCVNJbnQzMiBjb250cm9sUmVmZXJlbmNlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb250cm9sSGFuZGxlIF9ydjsKKyAgICBXaW5kb3dQdHIgb3duaW5nV2luZG93OworICAgIFJlY3QgYm91bmRzUmVjdDsKKyAgICBTdHIyNTUgY29udHJvbFRpdGxlOworICAgIEJvb2xlYW4gaW5pdGlhbGx5VmlzaWJsZTsKKyAgICBTSW50MTYgaW5pdGlhbFZhbHVlOworICAgIFNJbnQxNiBtaW5pbXVtVmFsdWU7CisgICAgU0ludDE2IG1heGltdW1WYWx1ZTsKKyAgICBTSW50MTYgcHJvY0lEOworICAgIFNJbnQzMiBjb250cm9sUmVmZXJlbmNlOwogI2lmbmRlZiBOZXdDb250cm9sCi0JUHlNYWNfUFJFQ0hFQ0soTmV3Q29udHJvbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTmV3Q29udHJvbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZiaGhoaGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJm93bmluZ1dpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgY29udHJvbFRpdGxlLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5pdGlhbGx5VmlzaWJsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluaXRpYWxWYWx1ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1pbmltdW1WYWx1ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1heGltdW1WYWx1ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnByb2NJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNvbnRyb2xSZWZlcmVuY2UpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBOZXdDb250cm9sKG93bmluZ1dpbmRvdywKLQkgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgY29udHJvbFRpdGxlLAotCSAgICAgICAgICAgICAgICAgaW5pdGlhbGx5VmlzaWJsZSwKLQkgICAgICAgICAgICAgICAgIGluaXRpYWxWYWx1ZSwKLQkgICAgICAgICAgICAgICAgIG1pbmltdW1WYWx1ZSwKLQkgICAgICAgICAgICAgICAgIG1heGltdW1WYWx1ZSwKLQkgICAgICAgICAgICAgICAgIHByb2NJRCwKLQkgICAgICAgICAgICAgICAgIGNvbnRyb2xSZWZlcmVuY2UpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZiaGhoaGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJm93bmluZ1dpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgY29udHJvbFRpdGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5pdGlhbGx5VmlzaWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluaXRpYWxWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1pbmltdW1WYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1heGltdW1WYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnByb2NJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbnRyb2xSZWZlcmVuY2UpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBOZXdDb250cm9sKG93bmluZ1dpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgY29udHJvbFRpdGxlLAorICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGx5VmlzaWJsZSwKKyAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgIG1pbmltdW1WYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgIG1heGltdW1WYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgIHByb2NJRCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xSZWZlcmVuY2UpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxfR2V0TmV3Q29udHJvbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29udHJvbEhhbmRsZSBfcnY7Ci0JU0ludDE2IHJlc291cmNlSUQ7Ci0JV2luZG93UHRyIG93bmluZ1dpbmRvdzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29udHJvbEhhbmRsZSBfcnY7CisgICAgU0ludDE2IHJlc291cmNlSUQ7CisgICAgV2luZG93UHRyIG93bmluZ1dpbmRvdzsKICNpZm5kZWYgR2V0TmV3Q29udHJvbAotCVB5TWFjX1BSRUNIRUNLKEdldE5ld0NvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE5ld0NvbnRyb2wpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJlc291cmNlSUQsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmb3duaW5nV2luZG93KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TmV3Q29udHJvbChyZXNvdXJjZUlELAotCSAgICAgICAgICAgICAgICAgICAgb3duaW5nV2luZG93KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc291cmNlSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmb3duaW5nV2luZG93KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TmV3Q29udHJvbChyZXNvdXJjZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgb3duaW5nV2luZG93KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsX0RyYXdDb250cm9scyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JV2luZG93UHRyIHRoZVdpbmRvdzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgV2luZG93UHRyIHRoZVdpbmRvdzsKICNpZm5kZWYgRHJhd0NvbnRyb2xzCi0JUHlNYWNfUFJFQ0hFQ0soRHJhd0NvbnRyb2xzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEcmF3Q29udHJvbHMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJnRoZVdpbmRvdykpCi0JCXJldHVybiBOVUxMOwotCURyYXdDb250cm9scyh0aGVXaW5kb3cpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmdGhlV2luZG93KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgRHJhd0NvbnRyb2xzKHRoZVdpbmRvdyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bF9VcGRhdGVDb250cm9scyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JV2luZG93UHRyIGluV2luZG93OwotCVJnbkhhbmRsZSBpblVwZGF0ZVJlZ2lvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgV2luZG93UHRyIGluV2luZG93OworICAgIFJnbkhhbmRsZSBpblVwZGF0ZVJlZ2lvbjsKICNpZm5kZWYgVXBkYXRlQ29udHJvbHMKLQlQeU1hY19QUkVDSEVDSyhVcGRhdGVDb250cm9scyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVXBkYXRlQ29udHJvbHMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaW5VcGRhdGVSZWdpb24pKQotCQlyZXR1cm4gTlVMTDsKLQlVcGRhdGVDb250cm9scyhpbldpbmRvdywKLQkgICAgICAgICAgICAgICBpblVwZGF0ZVJlZ2lvbik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmluV2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmluVXBkYXRlUmVnaW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVXBkYXRlQ29udHJvbHMoaW5XaW5kb3csCisgICAgICAgICAgICAgICAgICAgaW5VcGRhdGVSZWdpb24pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxfRmluZENvbnRyb2woUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbnRyb2xQYXJ0Q29kZSBfcnY7Ci0JUG9pbnQgdGVzdFBvaW50OwotCVdpbmRvd1B0ciB0aGVXaW5kb3c7Ci0JQ29udHJvbEhhbmRsZSB0aGVDb250cm9sOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb250cm9sUGFydENvZGUgX3J2OworICAgIFBvaW50IHRlc3RQb2ludDsKKyAgICBXaW5kb3dQdHIgdGhlV2luZG93OworICAgIENvbnRyb2xIYW5kbGUgdGhlQ29udHJvbDsKICNpZm5kZWYgRmluZENvbnRyb2wKLQlQeU1hY19QUkVDSEVDSyhGaW5kQ29udHJvbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRmluZENvbnRyb2wpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmdGVzdFBvaW50LAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJnRoZVdpbmRvdykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEZpbmRDb250cm9sKHRlc3RQb2ludCwKLQkgICAgICAgICAgICAgICAgICB0aGVXaW5kb3csCi0JICAgICAgICAgICAgICAgICAgJnRoZUNvbnRyb2wpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfV2hpY2hDb250cm9sLCB0aGVDb250cm9sKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZ0ZXN0UG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmdGhlV2luZG93KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRmluZENvbnRyb2wodGVzdFBvaW50LAorICAgICAgICAgICAgICAgICAgICAgIHRoZVdpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAmdGhlQ29udHJvbCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImhPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9XaGljaENvbnRyb2wsIHRoZUNvbnRyb2wpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bF9JZGxlQ29udHJvbHMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVdpbmRvd1B0ciBpbldpbmRvdzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgV2luZG93UHRyIGluV2luZG93OwogI2lmbmRlZiBJZGxlQ29udHJvbHMKLQlQeU1hY19QUkVDSEVDSyhJZGxlQ29udHJvbHMpOworICAgIFB5TWFjX1BSRUNIRUNLKElkbGVDb250cm9scyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3cpKQotCQlyZXR1cm4gTlVMTDsKLQlJZGxlQ29udHJvbHMoaW5XaW5kb3cpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3cpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBJZGxlQ29udHJvbHMoaW5XaW5kb3cpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxfR2V0Q29udHJvbEJ5SUQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93UHRyIGluV2luZG93OwotCUNvbnRyb2xJRCBpbklEOwotCUNvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBXaW5kb3dQdHIgaW5XaW5kb3c7CisgICAgQ29udHJvbElEIGluSUQ7CisgICAgQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOwogI2lmbmRlZiBHZXRDb250cm9sQnlJRAotCVB5TWFjX1BSRUNIRUNLKEdldENvbnRyb2xCeUlEKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRDb250cm9sQnlJRCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpbldpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlDb250cm9sSURfQ29udmVydCwgJmluSUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0Q29udHJvbEJ5SUQoaW5XaW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICZpbklELAotCSAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9XaGljaENvbnRyb2wsIG91dENvbnRyb2wpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmluV2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeUNvbnRyb2xJRF9Db252ZXJ0LCAmaW5JRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRDb250cm9sQnlJRChpbldpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX1doaWNoQ29udHJvbCwgb3V0Q29udHJvbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsX0R1bXBDb250cm9sSGllcmFyY2h5KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVdpbmRvd1B0ciBpbldpbmRvdzsKLQlGU1NwZWMgaW5EdW1wRmlsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBXaW5kb3dQdHIgaW5XaW5kb3c7CisgICAgRlNTcGVjIGluRHVtcEZpbGU7CiAjaWZuZGVmIER1bXBDb250cm9sSGllcmFyY2h5Ci0JUHlNYWNfUFJFQ0hFQ0soRHVtcENvbnRyb2xIaWVyYXJjaHkpOworICAgIFB5TWFjX1BSRUNIRUNLKER1bXBDb250cm9sSGllcmFyY2h5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmluV2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZpbkR1bXBGaWxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IER1bXBDb250cm9sSGllcmFyY2h5KGluV2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5EdW1wRmlsZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJmluRHVtcEZpbGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRHVtcENvbnRyb2xIaWVyYXJjaHkoaW5XaW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkR1bXBGaWxlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxfQ3JlYXRlUm9vdENvbnRyb2woUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JV2luZG93UHRyIGluV2luZG93OwotCUNvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBXaW5kb3dQdHIgaW5XaW5kb3c7CisgICAgQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOwogI2lmbmRlZiBDcmVhdGVSb290Q29udHJvbAotCVB5TWFjX1BSRUNIRUNLKENyZWF0ZVJvb3RDb250cm9sKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDcmVhdGVSb290Q29udHJvbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3cpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ3JlYXRlUm9vdENvbnRyb2woaW5XaW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmluV2luZG93KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENyZWF0ZVJvb3RDb250cm9sKGluV2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bF9HZXRSb290Q29udHJvbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlXaW5kb3dQdHIgaW5XaW5kb3c7Ci0JQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFdpbmRvd1B0ciBpbldpbmRvdzsKKyAgICBDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CiAjaWZuZGVmIEdldFJvb3RDb250cm9sCi0JUHlNYWNfUFJFQ0hFQ0soR2V0Um9vdENvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFJvb3RDb250cm9sKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpbldpbmRvdykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRSb290Q29udHJvbChpbldpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfV2hpY2hDb250cm9sLCBvdXRDb250cm9sKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3cpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0Um9vdENvbnRyb2woaW5XaW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX1doaWNoQ29udHJvbCwgb3V0Q29udHJvbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsX0dldEtleWJvYXJkRm9jdXMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JV2luZG93UHRyIGluV2luZG93OwotCUNvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBXaW5kb3dQdHIgaW5XaW5kb3c7CisgICAgQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOwogI2lmbmRlZiBHZXRLZXlib2FyZEZvY3VzCi0JUHlNYWNfUFJFQ0hFQ0soR2V0S2V5Ym9hcmRGb2N1cyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0S2V5Ym9hcmRGb2N1cyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3cpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0S2V5Ym9hcmRGb2N1cyhpbldpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9XaGljaENvbnRyb2wsIG91dENvbnRyb2wpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpbldpbmRvdykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRLZXlib2FyZEZvY3VzKGluV2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX1doaWNoQ29udHJvbCwgb3V0Q29udHJvbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsX1NldEtleWJvYXJkRm9jdXMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JV2luZG93UHRyIGluV2luZG93OwotCUNvbnRyb2xIYW5kbGUgaW5Db250cm9sOwotCUNvbnRyb2xGb2N1c1BhcnQgaW5QYXJ0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFdpbmRvd1B0ciBpbldpbmRvdzsKKyAgICBDb250cm9sSGFuZGxlIGluQ29udHJvbDsKKyAgICBDb250cm9sRm9jdXNQYXJ0IGluUGFydDsKICNpZm5kZWYgU2V0S2V5Ym9hcmRGb2N1cwotCVB5TWFjX1BSRUNIRUNLKFNldEtleWJvYXJkRm9jdXMpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldEtleWJvYXJkRm9jdXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmluV2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfQ29udmVydCwgJmluQ29udHJvbCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluUGFydCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRLZXlib2FyZEZvY3VzKGluV2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICAgIGluQ29udHJvbCwKLQkgICAgICAgICAgICAgICAgICAgICAgICBpblBhcnQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpbldpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX0NvbnZlcnQsICZpbkNvbnRyb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblBhcnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0S2V5Ym9hcmRGb2N1cyhpbldpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkNvbnRyb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5QYXJ0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxfQWR2YW5jZUtleWJvYXJkRm9jdXMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JV2luZG93UHRyIGluV2luZG93OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFdpbmRvd1B0ciBpbldpbmRvdzsKICNpZm5kZWYgQWR2YW5jZUtleWJvYXJkRm9jdXMKLQlQeU1hY19QUkVDSEVDSyhBZHZhbmNlS2V5Ym9hcmRGb2N1cyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQWR2YW5jZUtleWJvYXJkRm9jdXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmluV2luZG93KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEFkdmFuY2VLZXlib2FyZEZvY3VzKGluV2luZG93KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3cpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQWR2YW5jZUtleWJvYXJkRm9jdXMoaW5XaW5kb3cpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bF9SZXZlcnNlS2V5Ym9hcmRGb2N1cyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlXaW5kb3dQdHIgaW5XaW5kb3c7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgV2luZG93UHRyIGluV2luZG93OwogI2lmbmRlZiBSZXZlcnNlS2V5Ym9hcmRGb2N1cwotCVB5TWFjX1BSRUNIRUNLKFJldmVyc2VLZXlib2FyZEZvY3VzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhSZXZlcnNlS2V5Ym9hcmRGb2N1cyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3cpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUmV2ZXJzZUtleWJvYXJkRm9jdXMoaW5XaW5kb3cpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpbldpbmRvdykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBSZXZlcnNlS2V5Ym9hcmRGb2N1cyhpbldpbmRvdyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsX0NsZWFyS2V5Ym9hcmRGb2N1cyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlXaW5kb3dQdHIgaW5XaW5kb3c7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgV2luZG93UHRyIGluV2luZG93OwogI2lmbmRlZiBDbGVhcktleWJvYXJkRm9jdXMKLQlQeU1hY19QUkVDSEVDSyhDbGVhcktleWJvYXJkRm9jdXMpOworICAgIFB5TWFjX1BSRUNIRUNLKENsZWFyS2V5Ym9hcmRGb2N1cyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3cpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ2xlYXJLZXlib2FyZEZvY3VzKGluV2luZG93KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3cpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ2xlYXJLZXlib2FyZEZvY3VzKGluV2luZG93KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxfU2V0QXV0b21hdGljQ29udHJvbERyYWdUcmFja2luZ0VuYWJsZWRGb3JXaW5kb3coUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93UHRyIGluV2luZG93OwotCUJvb2xlYW4gaW5UcmFja3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93UHRyIGluV2luZG93OworICAgIEJvb2xlYW4gaW5UcmFja3M7CiAjaWZuZGVmIFNldEF1dG9tYXRpY0NvbnRyb2xEcmFnVHJhY2tpbmdFbmFibGVkRm9yV2luZG93Ci0JUHlNYWNfUFJFQ0hFQ0soU2V0QXV0b21hdGljQ29udHJvbERyYWdUcmFja2luZ0VuYWJsZWRGb3JXaW5kb3cpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldEF1dG9tYXRpY0NvbnRyb2xEcmFnVHJhY2tpbmdFbmFibGVkRm9yV2luZG93KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICZpblRyYWNrcykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRBdXRvbWF0aWNDb250cm9sRHJhZ1RyYWNraW5nRW5hYmxlZEZvcldpbmRvdyhpbldpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5UcmFja3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblRyYWNrcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRBdXRvbWF0aWNDb250cm9sRHJhZ1RyYWNraW5nRW5hYmxlZEZvcldpbmRvdyhpbldpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5UcmFja3MpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bF9Jc0F1dG9tYXRpY0NvbnRyb2xEcmFnVHJhY2tpbmdFbmFibGVkRm9yV2luZG93KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVdpbmRvd1B0ciBpbldpbmRvdzsKLQlCb29sZWFuIG91dFRyYWNrczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBXaW5kb3dQdHIgaW5XaW5kb3c7CisgICAgQm9vbGVhbiBvdXRUcmFja3M7CiAjaWZuZGVmIElzQXV0b21hdGljQ29udHJvbERyYWdUcmFja2luZ0VuYWJsZWRGb3JXaW5kb3cKLQlQeU1hY19QUkVDSEVDSyhJc0F1dG9tYXRpY0NvbnRyb2xEcmFnVHJhY2tpbmdFbmFibGVkRm9yV2luZG93KTsKKyAgICBQeU1hY19QUkVDSEVDSyhJc0F1dG9tYXRpY0NvbnRyb2xEcmFnVHJhY2tpbmdFbmFibGVkRm9yV2luZG93KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpbldpbmRvdykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBJc0F1dG9tYXRpY0NvbnRyb2xEcmFnVHJhY2tpbmdFbmFibGVkRm9yV2luZG93KGluV2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRUcmFja3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIG91dFRyYWNrcyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmluV2luZG93KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IElzQXV0b21hdGljQ29udHJvbERyYWdUcmFja2luZ0VuYWJsZWRGb3JXaW5kb3coaW5XaW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFRyYWNrcyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0VHJhY2tzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxfQ3JlYXRlQmV2ZWxCdXR0b25Db250cm9sKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVdpbmRvd1B0ciB3aW5kb3c7Ci0JUmVjdCBib3VuZHNSZWN0OwotCUNGU3RyaW5nUmVmIHRpdGxlOwotCVVJbnQxNiB0aGlja25lc3M7Ci0JVUludDE2IGJlaGF2aW9yOwotCUNvbnRyb2xCdXR0b25Db250ZW50SW5mbyBpbmZvOwotCVNJbnQxNiBtZW51SUQ7Ci0JVUludDE2IG1lbnVCZWhhdmlvcjsKLQlVSW50MTYgbWVudVBsYWNlbWVudDsKLQlDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93UHRyIHdpbmRvdzsKKyAgICBSZWN0IGJvdW5kc1JlY3Q7CisgICAgQ0ZTdHJpbmdSZWYgdGl0bGU7CisgICAgVUludDE2IHRoaWNrbmVzczsKKyAgICBVSW50MTYgYmVoYXZpb3I7CisgICAgQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvIGluZm87CisgICAgU0ludDE2IG1lbnVJRDsKKyAgICBVSW50MTYgbWVudUJlaGF2aW9yOworICAgIFVJbnQxNiBtZW51UGxhY2VtZW50OworICAgIENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKICNpZm5kZWYgQ3JlYXRlQmV2ZWxCdXR0b25Db250cm9sCi0JUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlQmV2ZWxCdXR0b25Db250cm9sKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDcmVhdGVCZXZlbEJ1dHRvbkNvbnRyb2wpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mSEhPJmhISCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnRpdGxlLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGhpY2tuZXNzLAotCSAgICAgICAgICAgICAgICAgICAgICAmYmVoYXZpb3IsCi0JICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2xCdXR0b25Db250ZW50SW5mb19Db252ZXJ0LCAmaW5mbywKLQkgICAgICAgICAgICAgICAgICAgICAgJm1lbnVJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1lbnVCZWhhdmlvciwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1lbnVQbGFjZW1lbnQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ3JlYXRlQmV2ZWxCdXR0b25Db250cm9sKHdpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlja25lc3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWhhdmlvciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmZvLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVudUlELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVudUJlaGF2aW9yLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVudVBsYWNlbWVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mSEhPJmhISCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnRpdGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhpY2tuZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYmVoYXZpb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2xCdXR0b25Db250ZW50SW5mb19Db252ZXJ0LCAmaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lbnVJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lbnVCZWhhdmlvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lbnVQbGFjZW1lbnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ3JlYXRlQmV2ZWxCdXR0b25Db250cm9sKHdpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlja25lc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWhhdmlvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVudUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVudUJlaGF2aW9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVudVBsYWNlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsX0NyZWF0ZVNsaWRlckNvbnRyb2woUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93UHRyIHdpbmRvdzsKLQlSZWN0IGJvdW5kc1JlY3Q7Ci0JU0ludDMyIHZhbHVlOwotCVNJbnQzMiBtaW5pbXVtOwotCVNJbnQzMiBtYXhpbXVtOwotCVVJbnQxNiBvcmllbnRhdGlvbjsKLQlVSW50MTYgbnVtVGlja01hcmtzOwotCUJvb2xlYW4gbGl2ZVRyYWNraW5nOwotCVB5T2JqZWN0KiBsaXZlVHJhY2tpbmdQcm9jOwotCVVuaXZlcnNhbFByb2NQdHIgY19jYWxsYmFjazsKLQlDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93UHRyIHdpbmRvdzsKKyAgICBSZWN0IGJvdW5kc1JlY3Q7CisgICAgU0ludDMyIHZhbHVlOworICAgIFNJbnQzMiBtaW5pbXVtOworICAgIFNJbnQzMiBtYXhpbXVtOworICAgIFVJbnQxNiBvcmllbnRhdGlvbjsKKyAgICBVSW50MTYgbnVtVGlja01hcmtzOworICAgIEJvb2xlYW4gbGl2ZVRyYWNraW5nOworICAgIFB5T2JqZWN0KiBsaXZlVHJhY2tpbmdQcm9jOworICAgIFVuaXZlcnNhbFByb2NQdHIgY19jYWxsYmFjazsKKyAgICBDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CiAjaWZuZGVmIENyZWF0ZVNsaWRlckNvbnRyb2wKLQlQeU1hY19QUkVDSEVDSyhDcmVhdGVTbGlkZXJDb250cm9sKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDcmVhdGVTbGlkZXJDb250cm9sKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZsbGxISGJPIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZtaW5pbXVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmbWF4aW11bSwKLQkgICAgICAgICAgICAgICAgICAgICAgJm9yaWVudGF0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAmbnVtVGlja01hcmtzLAotCSAgICAgICAgICAgICAgICAgICAgICAmbGl2ZVRyYWNraW5nLAotCSAgICAgICAgICAgICAgICAgICAgICAmbGl2ZVRyYWNraW5nUHJvYykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDcmVhdGVTbGlkZXJDb250cm9sKHdpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5pbXVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heGltdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZW50YXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtVGlja01hcmtzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpdmVUcmFja2luZywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBteWFjdGlvbnByb2NfdXBwLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7Ci0Jc2V0Y2FsbGJhY2soX3Jlcywga015Q29udHJvbEFjdGlvblByb2NUYWcsIGxpdmVUcmFja2luZ1Byb2MsICZjX2NhbGxiYWNrKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbGxsSEhiTyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWluaW11bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1heGltdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZvcmllbnRhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm51bVRpY2tNYXJrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmxpdmVUcmFja2luZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmxpdmVUcmFja2luZ1Byb2MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ3JlYXRlU2xpZGVyQ29udHJvbCh3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluaW11bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhpbXVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWVudGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bVRpY2tNYXJrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXZlVHJhY2tpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXlhY3Rpb25wcm9jX3VwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOworICAgIHNldGNhbGxiYWNrKF9yZXMsIGtNeUNvbnRyb2xBY3Rpb25Qcm9jVGFnLCBsaXZlVHJhY2tpbmdQcm9jLCAmY19jYWxsYmFjayk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsX0NyZWF0ZURpc2Nsb3N1cmVUcmlhbmdsZUNvbnRyb2woUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93UHRyIGluV2luZG93OwotCVJlY3QgaW5Cb3VuZHNSZWN0OwotCVVJbnQxNiBpbk9yaWVudGF0aW9uOwotCUNGU3RyaW5nUmVmIGluVGl0bGU7Ci0JU0ludDMyIGluSW5pdGlhbFZhbHVlOwotCUJvb2xlYW4gaW5EcmF3VGl0bGU7Ci0JQm9vbGVhbiBpbkF1dG9Ub2dnbGVzOwotCUNvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBXaW5kb3dQdHIgaW5XaW5kb3c7CisgICAgUmVjdCBpbkJvdW5kc1JlY3Q7CisgICAgVUludDE2IGluT3JpZW50YXRpb247CisgICAgQ0ZTdHJpbmdSZWYgaW5UaXRsZTsKKyAgICBTSW50MzIgaW5Jbml0aWFsVmFsdWU7CisgICAgQm9vbGVhbiBpbkRyYXdUaXRsZTsKKyAgICBCb29sZWFuIGluQXV0b1RvZ2dsZXM7CisgICAgQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOwogI2lmbmRlZiBDcmVhdGVEaXNjbG9zdXJlVHJpYW5nbGVDb250cm9sCi0JUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlRGlzY2xvc3VyZVRyaWFuZ2xlQ29udHJvbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlRGlzY2xvc3VyZVRyaWFuZ2xlQ29udHJvbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mSE8mbGJiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpbldpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmluQm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluT3JpZW50YXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZpblRpdGxlLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5Jbml0aWFsVmFsdWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkRyYXdUaXRsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluQXV0b1RvZ2dsZXMpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ3JlYXRlRGlzY2xvc3VyZVRyaWFuZ2xlQ29udHJvbChpbldpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Cb3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluT3JpZW50YXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5UaXRsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkluaXRpYWxWYWx1ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkRyYXdUaXRsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkF1dG9Ub2dnbGVzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJkhPJmxiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpbkJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbk9yaWVudGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmaW5UaXRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluSW5pdGlhbFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5EcmF3VGl0bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkF1dG9Ub2dnbGVzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENyZWF0ZURpc2Nsb3N1cmVUcmlhbmdsZUNvbnRyb2woaW5XaW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbk9yaWVudGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluVGl0bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Jbml0aWFsVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5EcmF3VGl0bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5BdXRvVG9nZ2xlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bF9DcmVhdGVQcm9ncmVzc0JhckNvbnRyb2woUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93UHRyIHdpbmRvdzsKLQlSZWN0IGJvdW5kc1JlY3Q7Ci0JU0ludDMyIHZhbHVlOwotCVNJbnQzMiBtaW5pbXVtOwotCVNJbnQzMiBtYXhpbXVtOwotCUJvb2xlYW4gaW5kZXRlcm1pbmF0ZTsKLQlDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93UHRyIHdpbmRvdzsKKyAgICBSZWN0IGJvdW5kc1JlY3Q7CisgICAgU0ludDMyIHZhbHVlOworICAgIFNJbnQzMiBtaW5pbXVtOworICAgIFNJbnQzMiBtYXhpbXVtOworICAgIEJvb2xlYW4gaW5kZXRlcm1pbmF0ZTsKKyAgICBDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CiAjaWZuZGVmIENyZWF0ZVByb2dyZXNzQmFyQ29udHJvbAotCVB5TWFjX1BSRUNIRUNLKENyZWF0ZVByb2dyZXNzQmFyQ29udHJvbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlUHJvZ3Jlc3NCYXJDb250cm9sKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZsbGxiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZtaW5pbXVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmbWF4aW11bSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluZGV0ZXJtaW5hdGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ3JlYXRlUHJvZ3Jlc3NCYXJDb250cm9sKHdpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5pbXVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4aW11bSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV0ZXJtaW5hdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZsbGxiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtaW5pbXVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWF4aW11bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZGV0ZXJtaW5hdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ3JlYXRlUHJvZ3Jlc3NCYXJDb250cm9sKHdpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5pbXVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4aW11bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV0ZXJtaW5hdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bF9DcmVhdGVSZWxldmFuY2VCYXJDb250cm9sKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVdpbmRvd1B0ciB3aW5kb3c7Ci0JUmVjdCBib3VuZHNSZWN0OwotCVNJbnQzMiB2YWx1ZTsKLQlTSW50MzIgbWluaW11bTsKLQlTSW50MzIgbWF4aW11bTsKLQlDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93UHRyIHdpbmRvdzsKKyAgICBSZWN0IGJvdW5kc1JlY3Q7CisgICAgU0ludDMyIHZhbHVlOworICAgIFNJbnQzMiBtaW5pbXVtOworICAgIFNJbnQzMiBtYXhpbXVtOworICAgIENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKICNpZm5kZWYgQ3JlYXRlUmVsZXZhbmNlQmFyQ29udHJvbAotCVB5TWFjX1BSRUNIRUNLKENyZWF0ZVJlbGV2YW5jZUJhckNvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKENyZWF0ZVJlbGV2YW5jZUJhckNvbnRyb2wpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmxsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlLAotCSAgICAgICAgICAgICAgICAgICAgICAmbWluaW11bSwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1heGltdW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ3JlYXRlUmVsZXZhbmNlQmFyQ29udHJvbCh3aW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluaW11bSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhpbXVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmxsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWluaW11bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1heGltdW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ3JlYXRlUmVsZXZhbmNlQmFyQ29udHJvbCh3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluaW11bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhpbXVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsX0NyZWF0ZUxpdHRsZUFycm93c0NvbnRyb2woUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93UHRyIHdpbmRvdzsKLQlSZWN0IGJvdW5kc1JlY3Q7Ci0JU0ludDMyIHZhbHVlOwotCVNJbnQzMiBtaW5pbXVtOwotCVNJbnQzMiBtYXhpbXVtOwotCVNJbnQzMiBpbmNyZW1lbnQ7Ci0JQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd1B0ciB3aW5kb3c7CisgICAgUmVjdCBib3VuZHNSZWN0OworICAgIFNJbnQzMiB2YWx1ZTsKKyAgICBTSW50MzIgbWluaW11bTsKKyAgICBTSW50MzIgbWF4aW11bTsKKyAgICBTSW50MzIgaW5jcmVtZW50OworICAgIENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKICNpZm5kZWYgQ3JlYXRlTGl0dGxlQXJyb3dzQ29udHJvbAotCVB5TWFjX1BSRUNIRUNLKENyZWF0ZUxpdHRsZUFycm93c0NvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKENyZWF0ZUxpdHRsZUFycm93c0NvbnRyb2wpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmxsbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJndpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1pbmltdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICZtYXhpbXVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5jcmVtZW50KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENyZWF0ZUxpdHRsZUFycm93c0NvbnRyb2wod2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbmltdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4aW11bSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNyZW1lbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBvdXRDb250cm9sKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbGxsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWluaW11bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1heGltdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmNyZW1lbnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ3JlYXRlTGl0dGxlQXJyb3dzQ29udHJvbCh3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluaW11bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhpbXVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY3JlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bF9DcmVhdGVDaGFzaW5nQXJyb3dzQ29udHJvbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlXaW5kb3dQdHIgd2luZG93OwotCVJlY3QgYm91bmRzUmVjdDsKLQlDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93UHRyIHdpbmRvdzsKKyAgICBSZWN0IGJvdW5kc1JlY3Q7CisgICAgQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOwogI2lmbmRlZiBDcmVhdGVDaGFzaW5nQXJyb3dzQ29udHJvbAotCVB5TWFjX1BSRUNIRUNLKENyZWF0ZUNoYXNpbmdBcnJvd3NDb250cm9sKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDcmVhdGVDaGFzaW5nQXJyb3dzQ29udHJvbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENyZWF0ZUNoYXNpbmdBcnJvd3NDb250cm9sKHdpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDcmVhdGVDaGFzaW5nQXJyb3dzQ29udHJvbCh3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bF9DcmVhdGVTZXBhcmF0b3JDb250cm9sKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVdpbmRvd1B0ciB3aW5kb3c7Ci0JUmVjdCBib3VuZHNSZWN0OwotCUNvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBXaW5kb3dQdHIgd2luZG93OworICAgIFJlY3QgYm91bmRzUmVjdDsKKyAgICBDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CiAjaWZuZGVmIENyZWF0ZVNlcGFyYXRvckNvbnRyb2wKLQlQeU1hY19QUkVDSEVDSyhDcmVhdGVTZXBhcmF0b3JDb250cm9sKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDcmVhdGVTZXBhcmF0b3JDb250cm9sKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJndpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kc1JlY3QpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ3JlYXRlU2VwYXJhdG9yQ29udHJvbCh3aW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBvdXRDb250cm9sKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENyZWF0ZVNlcGFyYXRvckNvbnRyb2wod2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsX0NyZWF0ZUdyb3VwQm94Q29udHJvbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlXaW5kb3dQdHIgd2luZG93OwotCVJlY3QgYm91bmRzUmVjdDsKLQlDRlN0cmluZ1JlZiB0aXRsZTsKLQlCb29sZWFuIHByaW1hcnk7Ci0JQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd1B0ciB3aW5kb3c7CisgICAgUmVjdCBib3VuZHNSZWN0OworICAgIENGU3RyaW5nUmVmIHRpdGxlOworICAgIEJvb2xlYW4gcHJpbWFyeTsKKyAgICBDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CiAjaWZuZGVmIENyZWF0ZUdyb3VwQm94Q29udHJvbAotCVB5TWFjX1BSRUNIRUNLKENyZWF0ZUdyb3VwQm94Q29udHJvbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlR3JvdXBCb3hDb250cm9sKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmIiLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJndpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZ0aXRsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnByaW1hcnkpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ3JlYXRlR3JvdXBCb3hDb250cm9sKHdpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltYXJ5LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBvdXRDb250cm9sKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdGl0bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwcmltYXJ5KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENyZWF0ZUdyb3VwQm94Q29udHJvbCh3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsX0NyZWF0ZUNoZWNrR3JvdXBCb3hDb250cm9sKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVdpbmRvd1B0ciB3aW5kb3c7Ci0JUmVjdCBib3VuZHNSZWN0OwotCUNGU3RyaW5nUmVmIHRpdGxlOwotCVNJbnQzMiBpbml0aWFsVmFsdWU7Ci0JQm9vbGVhbiBwcmltYXJ5OwotCUJvb2xlYW4gYXV0b1RvZ2dsZTsKLQlDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93UHRyIHdpbmRvdzsKKyAgICBSZWN0IGJvdW5kc1JlY3Q7CisgICAgQ0ZTdHJpbmdSZWYgdGl0bGU7CisgICAgU0ludDMyIGluaXRpYWxWYWx1ZTsKKyAgICBCb29sZWFuIHByaW1hcnk7CisgICAgQm9vbGVhbiBhdXRvVG9nZ2xlOworICAgIENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKICNpZm5kZWYgQ3JlYXRlQ2hlY2tHcm91cEJveENvbnRyb2wKLQlQeU1hY19QUkVDSEVDSyhDcmVhdGVDaGVja0dyb3VwQm94Q29udHJvbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlQ2hlY2tHcm91cEJveENvbnRyb2wpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mbGJiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdGl0bGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbml0aWFsVmFsdWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZwcmltYXJ5LAotCSAgICAgICAgICAgICAgICAgICAgICAmYXV0b1RvZ2dsZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDcmVhdGVDaGVja0dyb3VwQm94Q29udHJvbCh3aW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbFZhbHVlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltYXJ5LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvVG9nZ2xlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmxiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnRpdGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5pdGlhbFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJpbWFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmF1dG9Ub2dnbGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ3JlYXRlQ2hlY2tHcm91cEJveENvbnRyb2wod2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b1RvZ2dsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBvdXRDb250cm9sKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxfQ3JlYXRlUG9wdXBHcm91cEJveENvbnRyb2woUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93UHRyIHdpbmRvdzsKLQlSZWN0IGJvdW5kc1JlY3Q7Ci0JQ0ZTdHJpbmdSZWYgdGl0bGU7Ci0JQm9vbGVhbiBwcmltYXJ5OwotCVNJbnQxNiBtZW51SUQ7Ci0JQm9vbGVhbiB2YXJpYWJsZVdpZHRoOwotCVNJbnQxNiB0aXRsZVdpZHRoOwotCVNJbnQxNiB0aXRsZUp1c3RpZmljYXRpb247Ci0JU3R5bGUgdGl0bGVTdHlsZTsKLQlDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93UHRyIHdpbmRvdzsKKyAgICBSZWN0IGJvdW5kc1JlY3Q7CisgICAgQ0ZTdHJpbmdSZWYgdGl0bGU7CisgICAgQm9vbGVhbiBwcmltYXJ5OworICAgIFNJbnQxNiBtZW51SUQ7CisgICAgQm9vbGVhbiB2YXJpYWJsZVdpZHRoOworICAgIFNJbnQxNiB0aXRsZVdpZHRoOworICAgIFNJbnQxNiB0aXRsZUp1c3RpZmljYXRpb247CisgICAgU3R5bGUgdGl0bGVTdHlsZTsKKyAgICBDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CiAjaWZuZGVmIENyZWF0ZVBvcHVwR3JvdXBCb3hDb250cm9sCi0JUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlUG9wdXBHcm91cEJveENvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKENyZWF0ZVBvcHVwR3JvdXBCb3hDb250cm9sKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmJoYmhoYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnRpdGxlLAotCSAgICAgICAgICAgICAgICAgICAgICAmcHJpbWFyeSwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1lbnVJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZhcmlhYmxlV2lkdGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aXRsZVdpZHRoLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGl0bGVKdXN0aWZpY2F0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGl0bGVTdHlsZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDcmVhdGVQb3B1cEdyb3VwQm94Q29udHJvbCh3aW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyeSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVudUlELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZVdpZHRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZVdpZHRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZUp1c3RpZmljYXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlU3R5bGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mYmhiaGhiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdGl0bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwcmltYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVudUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFyaWFibGVXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRpdGxlV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aXRsZUp1c3RpZmljYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aXRsZVN0eWxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENyZWF0ZVBvcHVwR3JvdXBCb3hDb250cm9sKHdpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW51SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlSnVzdGlmaWNhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGVTdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBvdXRDb250cm9sKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxfQ3JlYXRlSW1hZ2VXZWxsQ29udHJvbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlXaW5kb3dQdHIgd2luZG93OwotCVJlY3QgYm91bmRzUmVjdDsKLQlDb250cm9sQnV0dG9uQ29udGVudEluZm8gaW5mbzsKLQlDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93UHRyIHdpbmRvdzsKKyAgICBSZWN0IGJvdW5kc1JlY3Q7CisgICAgQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvIGluZm87CisgICAgQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOwogI2lmbmRlZiBDcmVhdGVJbWFnZVdlbGxDb250cm9sCi0JUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlSW1hZ2VXZWxsQ29udHJvbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlSW1hZ2VXZWxsQ29udHJvbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJndpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2xCdXR0b25Db250ZW50SW5mb19Db252ZXJ0LCAmaW5mbykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDcmVhdGVJbWFnZVdlbGxDb250cm9sKHdpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5mbywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvX0NvbnZlcnQsICZpbmZvKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENyZWF0ZUltYWdlV2VsbENvbnRyb2wod2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsX0NyZWF0ZVBvcHVwQXJyb3dDb250cm9sKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVdpbmRvd1B0ciB3aW5kb3c7Ci0JUmVjdCBib3VuZHNSZWN0OwotCVVJbnQxNiBvcmllbnRhdGlvbjsKLQlVSW50MTYgc2l6ZTsKLQlDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93UHRyIHdpbmRvdzsKKyAgICBSZWN0IGJvdW5kc1JlY3Q7CisgICAgVUludDE2IG9yaWVudGF0aW9uOworICAgIFVJbnQxNiBzaXplOworICAgIENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKICNpZm5kZWYgQ3JlYXRlUG9wdXBBcnJvd0NvbnRyb2wKLQlQeU1hY19QUkVDSEVDSyhDcmVhdGVQb3B1cEFycm93Q29udHJvbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlUG9wdXBBcnJvd0NvbnRyb2wpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJkhIIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmb3JpZW50YXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICZzaXplKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENyZWF0ZVBvcHVwQXJyb3dDb250cm9sKHdpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWVudGF0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZISCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm9yaWVudGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDcmVhdGVQb3B1cEFycm93Q29udHJvbCh3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmllbnRhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBvdXRDb250cm9sKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxfQ3JlYXRlUGxhY2FyZENvbnRyb2woUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93UHRyIHdpbmRvdzsKLQlSZWN0IGJvdW5kc1JlY3Q7Ci0JQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd1B0ciB3aW5kb3c7CisgICAgUmVjdCBib3VuZHNSZWN0OworICAgIENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKICNpZm5kZWYgQ3JlYXRlUGxhY2FyZENvbnRyb2wKLQlQeU1hY19QUkVDSEVDSyhDcmVhdGVQbGFjYXJkQ29udHJvbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlUGxhY2FyZENvbnRyb2wpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDcmVhdGVQbGFjYXJkQ29udHJvbCh3aW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJndpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kc1JlY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ3JlYXRlUGxhY2FyZENvbnRyb2wod2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBvdXRDb250cm9sKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxfQ3JlYXRlQ2xvY2tDb250cm9sKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVdpbmRvd1B0ciB3aW5kb3c7Ci0JUmVjdCBib3VuZHNSZWN0OwotCVVJbnQxNiBjbG9ja1R5cGU7Ci0JVUludDMyIGNsb2NrRmxhZ3M7Ci0JQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd1B0ciB3aW5kb3c7CisgICAgUmVjdCBib3VuZHNSZWN0OworICAgIFVJbnQxNiBjbG9ja1R5cGU7CisgICAgVUludDMyIGNsb2NrRmxhZ3M7CisgICAgQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOwogI2lmbmRlZiBDcmVhdGVDbG9ja0NvbnRyb2wKLQlQeU1hY19QUkVDSEVDSyhDcmVhdGVDbG9ja0NvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKENyZWF0ZUNsb2NrQ29udHJvbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mSGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJndpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICZjbG9ja1R5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZjbG9ja0ZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENyZWF0ZUNsb2NrQ29udHJvbCh3aW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb2NrVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb2NrRmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZIbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNsb2NrVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNsb2NrRmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ3JlYXRlQ2xvY2tDb250cm9sKHdpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvY2tUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvY2tGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsX0NyZWF0ZVVzZXJQYW5lQ29udHJvbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlXaW5kb3dQdHIgd2luZG93OwotCVJlY3QgYm91bmRzUmVjdDsKLQlVSW50MzIgZmVhdHVyZXM7Ci0JQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd1B0ciB3aW5kb3c7CisgICAgUmVjdCBib3VuZHNSZWN0OworICAgIFVJbnQzMiBmZWF0dXJlczsKKyAgICBDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CiAjaWZuZGVmIENyZWF0ZVVzZXJQYW5lQ29udHJvbAotCVB5TWFjX1BSRUNIRUNLKENyZWF0ZVVzZXJQYW5lQ29udHJvbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlVXNlclBhbmVDb250cm9sKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmZmVhdHVyZXMpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ3JlYXRlVXNlclBhbmVDb250cm9sKHdpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZXMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmVhdHVyZXMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ3JlYXRlVXNlclBhbmVDb250cm9sKHdpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bF9DcmVhdGVFZGl0VGV4dENvbnRyb2woUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93UHRyIHdpbmRvdzsKLQlSZWN0IGJvdW5kc1JlY3Q7Ci0JQ0ZTdHJpbmdSZWYgdGV4dDsKLQlCb29sZWFuIGlzUGFzc3dvcmQ7Ci0JQm9vbGVhbiB1c2VJbmxpbmVJbnB1dDsKLQlDb250cm9sRm9udFN0eWxlUmVjIHN0eWxlOwotCUNvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBXaW5kb3dQdHIgd2luZG93OworICAgIFJlY3QgYm91bmRzUmVjdDsKKyAgICBDRlN0cmluZ1JlZiB0ZXh0OworICAgIEJvb2xlYW4gaXNQYXNzd29yZDsKKyAgICBCb29sZWFuIHVzZUlubGluZUlucHV0OworICAgIENvbnRyb2xGb250U3R5bGVSZWMgc3R5bGU7CisgICAgQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOwogI2lmbmRlZiBDcmVhdGVFZGl0VGV4dENvbnRyb2wKLQlQeU1hY19QUkVDSEVDSyhDcmVhdGVFZGl0VGV4dENvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKENyZWF0ZUVkaXRUZXh0Q29udHJvbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZiYk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlzUGFzc3dvcmQsCi0JICAgICAgICAgICAgICAgICAgICAgICZ1c2VJbmxpbmVJbnB1dCwKLQkgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbEZvbnRTdHlsZV9Db252ZXJ0LCAmc3R5bGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ3JlYXRlRWRpdFRleHRDb250cm9sKHdpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUGFzc3dvcmQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VJbmxpbmVJbnB1dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHlsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mYmJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpc1Bhc3N3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdXNlSW5saW5lSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2xGb250U3R5bGVfQ29udmVydCwgJnN0eWxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENyZWF0ZUVkaXRUZXh0Q29udHJvbCh3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1Bhc3N3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlSW5saW5lSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bF9DcmVhdGVTdGF0aWNUZXh0Q29udHJvbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlXaW5kb3dQdHIgd2luZG93OwotCVJlY3QgYm91bmRzUmVjdDsKLQlDRlN0cmluZ1JlZiB0ZXh0OwotCUNvbnRyb2xGb250U3R5bGVSZWMgc3R5bGU7Ci0JQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd1B0ciB3aW5kb3c7CisgICAgUmVjdCBib3VuZHNSZWN0OworICAgIENGU3RyaW5nUmVmIHRleHQ7CisgICAgQ29udHJvbEZvbnRTdHlsZVJlYyBzdHlsZTsKKyAgICBDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CiAjaWZuZGVmIENyZWF0ZVN0YXRpY1RleHRDb250cm9sCi0JUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlU3RhdGljVGV4dENvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKENyZWF0ZVN0YXRpY1RleHRDb250cm9sKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbEZvbnRTdHlsZV9Db252ZXJ0LCAmc3R5bGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ3JlYXRlU3RhdGljVGV4dENvbnRyb2wod2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0eWxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbEZvbnRTdHlsZV9Db252ZXJ0LCAmc3R5bGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ3JlYXRlU3RhdGljVGV4dENvbnRyb2wod2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0eWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bF9DcmVhdGVQaWN0dXJlQ29udHJvbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlXaW5kb3dQdHIgd2luZG93OwotCVJlY3QgYm91bmRzUmVjdDsKLQlDb250cm9sQnV0dG9uQ29udGVudEluZm8gY29udGVudDsKLQlCb29sZWFuIGRvbnRUcmFjazsKLQlDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93UHRyIHdpbmRvdzsKKyAgICBSZWN0IGJvdW5kc1JlY3Q7CisgICAgQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvIGNvbnRlbnQ7CisgICAgQm9vbGVhbiBkb250VHJhY2s7CisgICAgQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOwogI2lmbmRlZiBDcmVhdGVQaWN0dXJlQ29udHJvbAotCVB5TWFjX1BSRUNIRUNLKENyZWF0ZVBpY3R1cmVDb250cm9sKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDcmVhdGVQaWN0dXJlQ29udHJvbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICBDb250cm9sQnV0dG9uQ29udGVudEluZm9fQ29udmVydCwgJmNvbnRlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICZkb250VHJhY2spKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ3JlYXRlUGljdHVyZUNvbnRyb2wod2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbnRlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbnRUcmFjaywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBvdXRDb250cm9sKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sQnV0dG9uQ29udGVudEluZm9fQ29udmVydCwgJmNvbnRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkb250VHJhY2spKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ3JlYXRlUGljdHVyZUNvbnRyb2wod2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbnRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbnRUcmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBvdXRDb250cm9sKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxfQ3JlYXRlSWNvbkNvbnRyb2woUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93UHRyIGluV2luZG93OwotCVJlY3QgaW5Cb3VuZHNSZWN0OwotCUNvbnRyb2xCdXR0b25Db250ZW50SW5mbyBpbkljb25Db250ZW50OwotCUJvb2xlYW4gaW5Eb250VHJhY2s7Ci0JQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd1B0ciBpbldpbmRvdzsKKyAgICBSZWN0IGluQm91bmRzUmVjdDsKKyAgICBDb250cm9sQnV0dG9uQ29udGVudEluZm8gaW5JY29uQ29udGVudDsKKyAgICBCb29sZWFuIGluRG9udFRyYWNrOworICAgIENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKICNpZm5kZWYgQ3JlYXRlSWNvbkNvbnRyb2wKLQlQeU1hY19QUkVDSEVDSyhDcmVhdGVJY29uQ29udHJvbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlSWNvbkNvbnRyb2wpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpbkJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2xCdXR0b25Db250ZW50SW5mb19Db252ZXJ0LCAmaW5JY29uQ29udGVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluRG9udFRyYWNrKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENyZWF0ZUljb25Db250cm9sKGluV2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Cb3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmaW5JY29uQ29udGVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgaW5Eb250VHJhY2ssCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpbkJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2xCdXR0b25Db250ZW50SW5mb19Db252ZXJ0LCAmaW5JY29uQ29udGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluRG9udFRyYWNrKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENyZWF0ZUljb25Db250cm9sKGluV2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Cb3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5JY29uQ29udGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Eb250VHJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsX0NyZWF0ZVdpbmRvd0hlYWRlckNvbnRyb2woUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93UHRyIHdpbmRvdzsKLQlSZWN0IGJvdW5kc1JlY3Q7Ci0JQm9vbGVhbiBpc0xpc3RIZWFkZXI7Ci0JQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd1B0ciB3aW5kb3c7CisgICAgUmVjdCBib3VuZHNSZWN0OworICAgIEJvb2xlYW4gaXNMaXN0SGVhZGVyOworICAgIENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKICNpZm5kZWYgQ3JlYXRlV2luZG93SGVhZGVyQ29udHJvbAotCVB5TWFjX1BSRUNIRUNLKENyZWF0ZVdpbmRvd0hlYWRlckNvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKENyZWF0ZVdpbmRvd0hlYWRlckNvbnRyb2wpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmIiLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJndpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICZpc0xpc3RIZWFkZXIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ3JlYXRlV2luZG93SGVhZGVyQ29udHJvbCh3aW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNMaXN0SGVhZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJndpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpc0xpc3RIZWFkZXIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ3JlYXRlV2luZG93SGVhZGVyQ29udHJvbCh3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNMaXN0SGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsX0NyZWF0ZVB1c2hCdXR0b25Db250cm9sKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVdpbmRvd1B0ciB3aW5kb3c7Ci0JUmVjdCBib3VuZHNSZWN0OwotCUNGU3RyaW5nUmVmIHRpdGxlOwotCUNvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBXaW5kb3dQdHIgd2luZG93OworICAgIFJlY3QgYm91bmRzUmVjdDsKKyAgICBDRlN0cmluZ1JlZiB0aXRsZTsKKyAgICBDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CiAjaWZuZGVmIENyZWF0ZVB1c2hCdXR0b25Db250cm9sCi0JUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlUHVzaEJ1dHRvbkNvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKENyZWF0ZVB1c2hCdXR0b25Db250cm9sKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnRpdGxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENyZWF0ZVB1c2hCdXR0b25Db250cm9sKHdpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnRpdGxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENyZWF0ZVB1c2hCdXR0b25Db250cm9sKHdpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bF9DcmVhdGVQdXNoQnV0dG9uV2l0aEljb25Db250cm9sKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVdpbmRvd1B0ciB3aW5kb3c7Ci0JUmVjdCBib3VuZHNSZWN0OwotCUNGU3RyaW5nUmVmIHRpdGxlOwotCUNvbnRyb2xCdXR0b25Db250ZW50SW5mbyBpY29uOwotCVVJbnQxNiBpY29uQWxpZ25tZW50OwotCUNvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBXaW5kb3dQdHIgd2luZG93OworICAgIFJlY3QgYm91bmRzUmVjdDsKKyAgICBDRlN0cmluZ1JlZiB0aXRsZTsKKyAgICBDb250cm9sQnV0dG9uQ29udGVudEluZm8gaWNvbjsKKyAgICBVSW50MTYgaWNvbkFsaWdubWVudDsKKyAgICBDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CiAjaWZuZGVmIENyZWF0ZVB1c2hCdXR0b25XaXRoSWNvbkNvbnRyb2wKLQlQeU1hY19QUkVDSEVDSyhDcmVhdGVQdXNoQnV0dG9uV2l0aEljb25Db250cm9sKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDcmVhdGVQdXNoQnV0dG9uV2l0aEljb25Db250cm9sKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJk8mSCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnRpdGxlLAotCSAgICAgICAgICAgICAgICAgICAgICBDb250cm9sQnV0dG9uQ29udGVudEluZm9fQ29udmVydCwgJmljb24sCi0JICAgICAgICAgICAgICAgICAgICAgICZpY29uQWxpZ25tZW50KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENyZWF0ZVB1c2hCdXR0b25XaXRoSWNvbkNvbnRyb2wod2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpY29uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb25BbGlnbm1lbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBvdXRDb250cm9sKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJkgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJndpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZ0aXRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvX0NvbnZlcnQsICZpY29uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaWNvbkFsaWdubWVudCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDcmVhdGVQdXNoQnV0dG9uV2l0aEljb25Db250cm9sKHdpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaWNvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uQWxpZ25tZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsX0NyZWF0ZVJhZGlvQnV0dG9uQ29udHJvbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlXaW5kb3dQdHIgd2luZG93OwotCVJlY3QgYm91bmRzUmVjdDsKLQlDRlN0cmluZ1JlZiB0aXRsZTsKLQlTSW50MzIgaW5pdGlhbFZhbHVlOwotCUJvb2xlYW4gYXV0b1RvZ2dsZTsKLQlDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93UHRyIHdpbmRvdzsKKyAgICBSZWN0IGJvdW5kc1JlY3Q7CisgICAgQ0ZTdHJpbmdSZWYgdGl0bGU7CisgICAgU0ludDMyIGluaXRpYWxWYWx1ZTsKKyAgICBCb29sZWFuIGF1dG9Ub2dnbGU7CisgICAgQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOwogI2lmbmRlZiBDcmVhdGVSYWRpb0J1dHRvbkNvbnRyb2wKLQlQeU1hY19QUkVDSEVDSyhDcmVhdGVSYWRpb0J1dHRvbkNvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKENyZWF0ZVJhZGlvQnV0dG9uQ29udHJvbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZsYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnRpdGxlLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5pdGlhbFZhbHVlLAotCSAgICAgICAgICAgICAgICAgICAgICAmYXV0b1RvZ2dsZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDcmVhdGVSYWRpb0J1dHRvbkNvbnRyb2wod2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxWYWx1ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9Ub2dnbGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmxiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdGl0bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbml0aWFsVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhdXRvVG9nZ2xlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENyZWF0ZVJhZGlvQnV0dG9uQ29udHJvbCh3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b1RvZ2dsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsX0NyZWF0ZUNoZWNrQm94Q29udHJvbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlXaW5kb3dQdHIgd2luZG93OwotCVJlY3QgYm91bmRzUmVjdDsKLQlDRlN0cmluZ1JlZiB0aXRsZTsKLQlTSW50MzIgaW5pdGlhbFZhbHVlOwotCUJvb2xlYW4gYXV0b1RvZ2dsZTsKLQlDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93UHRyIHdpbmRvdzsKKyAgICBSZWN0IGJvdW5kc1JlY3Q7CisgICAgQ0ZTdHJpbmdSZWYgdGl0bGU7CisgICAgU0ludDMyIGluaXRpYWxWYWx1ZTsKKyAgICBCb29sZWFuIGF1dG9Ub2dnbGU7CisgICAgQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOwogI2lmbmRlZiBDcmVhdGVDaGVja0JveENvbnRyb2wKLQlQeU1hY19QUkVDSEVDSyhDcmVhdGVDaGVja0JveENvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKENyZWF0ZUNoZWNrQm94Q29udHJvbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZsYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnRpdGxlLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5pdGlhbFZhbHVlLAotCSAgICAgICAgICAgICAgICAgICAgICAmYXV0b1RvZ2dsZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDcmVhdGVDaGVja0JveENvbnRyb2wod2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxWYWx1ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9Ub2dnbGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmxiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdGl0bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbml0aWFsVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhdXRvVG9nZ2xlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENyZWF0ZUNoZWNrQm94Q29udHJvbCh3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b1RvZ2dsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsX0NyZWF0ZVNjcm9sbEJhckNvbnRyb2woUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93UHRyIHdpbmRvdzsKLQlSZWN0IGJvdW5kc1JlY3Q7Ci0JU0ludDMyIHZhbHVlOwotCVNJbnQzMiBtaW5pbXVtOwotCVNJbnQzMiBtYXhpbXVtOwotCVNJbnQzMiB2aWV3U2l6ZTsKLQlCb29sZWFuIGxpdmVUcmFja2luZzsKLQlQeU9iamVjdCogbGl2ZVRyYWNraW5nUHJvYzsKLQlVbml2ZXJzYWxQcm9jUHRyIGNfY2FsbGJhY2s7Ci0JQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd1B0ciB3aW5kb3c7CisgICAgUmVjdCBib3VuZHNSZWN0OworICAgIFNJbnQzMiB2YWx1ZTsKKyAgICBTSW50MzIgbWluaW11bTsKKyAgICBTSW50MzIgbWF4aW11bTsKKyAgICBTSW50MzIgdmlld1NpemU7CisgICAgQm9vbGVhbiBsaXZlVHJhY2tpbmc7CisgICAgUHlPYmplY3QqIGxpdmVUcmFja2luZ1Byb2M7CisgICAgVW5pdmVyc2FsUHJvY1B0ciBjX2NhbGxiYWNrOworICAgIENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKICNpZm5kZWYgQ3JlYXRlU2Nyb2xsQmFyQ29udHJvbAotCVB5TWFjX1BSRUNIRUNLKENyZWF0ZVNjcm9sbEJhckNvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKENyZWF0ZVNjcm9sbEJhckNvbnRyb2wpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmxsbGxiTyIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlLAotCSAgICAgICAgICAgICAgICAgICAgICAmbWluaW11bSwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1heGltdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICZ2aWV3U2l6ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmxpdmVUcmFja2luZywKLQkgICAgICAgICAgICAgICAgICAgICAgJmxpdmVUcmFja2luZ1Byb2MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ3JlYXRlU2Nyb2xsQmFyQ29udHJvbCh3aW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluaW11bSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhpbXVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdTaXplLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpdmVUcmFja2luZywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteWFjdGlvbnByb2NfdXBwLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7Ci0Jc2V0Y2FsbGJhY2soX3Jlcywga015Q29udHJvbEFjdGlvblByb2NUYWcsIGxpdmVUcmFja2luZ1Byb2MsICZjX2NhbGxiYWNrKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbGxsbGJPIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtaW5pbXVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWF4aW11bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZpZXdTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbGl2ZVRyYWNraW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbGl2ZVRyYWNraW5nUHJvYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDcmVhdGVTY3JvbGxCYXJDb250cm9sKHdpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5pbXVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heGltdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld1NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGl2ZVRyYWNraW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15YWN0aW9ucHJvY191cHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBvdXRDb250cm9sKTsKKyAgICBzZXRjYWxsYmFjayhfcmVzLCBrTXlDb250cm9sQWN0aW9uUHJvY1RhZywgbGl2ZVRyYWNraW5nUHJvYywgJmNfY2FsbGJhY2spOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bF9DcmVhdGVQb3B1cEJ1dHRvbkNvbnRyb2woUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93UHRyIHdpbmRvdzsKLQlSZWN0IGJvdW5kc1JlY3Q7Ci0JQ0ZTdHJpbmdSZWYgdGl0bGU7Ci0JU0ludDE2IG1lbnVJRDsKLQlCb29sZWFuIHZhcmlhYmxlV2lkdGg7Ci0JU0ludDE2IHRpdGxlV2lkdGg7Ci0JU0ludDE2IHRpdGxlSnVzdGlmaWNhdGlvbjsKLQlTdHlsZSB0aXRsZVN0eWxlOwotCUNvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBXaW5kb3dQdHIgd2luZG93OworICAgIFJlY3QgYm91bmRzUmVjdDsKKyAgICBDRlN0cmluZ1JlZiB0aXRsZTsKKyAgICBTSW50MTYgbWVudUlEOworICAgIEJvb2xlYW4gdmFyaWFibGVXaWR0aDsKKyAgICBTSW50MTYgdGl0bGVXaWR0aDsKKyAgICBTSW50MTYgdGl0bGVKdXN0aWZpY2F0aW9uOworICAgIFN0eWxlIHRpdGxlU3R5bGU7CisgICAgQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOwogI2lmbmRlZiBDcmVhdGVQb3B1cEJ1dHRvbkNvbnRyb2wKLQlQeU1hY19QUkVDSEVDSyhDcmVhdGVQb3B1cEJ1dHRvbkNvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKENyZWF0ZVBvcHVwQnV0dG9uQ29udHJvbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZoYmhoYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnRpdGxlLAotCSAgICAgICAgICAgICAgICAgICAgICAmbWVudUlELAotCSAgICAgICAgICAgICAgICAgICAgICAmdmFyaWFibGVXaWR0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRpdGxlV2lkdGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aXRsZUp1c3RpZmljYXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aXRsZVN0eWxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENyZWF0ZVBvcHVwQnV0dG9uQ29udHJvbCh3aW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVudUlELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVXaWR0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlV2lkdGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZUp1c3RpZmljYXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZVN0eWxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBvdXRDb250cm9sKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZoYmhoYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnRpdGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVudUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFyaWFibGVXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRpdGxlV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aXRsZUp1c3RpZmljYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aXRsZVN0eWxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENyZWF0ZVBvcHVwQnV0dG9uQ29udHJvbCh3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVudUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZUp1c3RpZmljYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZVN0eWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBvdXRDb250cm9sKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxfQ3JlYXRlUmFkaW9Hcm91cENvbnRyb2woUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93UHRyIHdpbmRvdzsKLQlSZWN0IGJvdW5kc1JlY3Q7Ci0JQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd1B0ciB3aW5kb3c7CisgICAgUmVjdCBib3VuZHNSZWN0OworICAgIENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKICNpZm5kZWYgQ3JlYXRlUmFkaW9Hcm91cENvbnRyb2wKLQlQeU1hY19QUkVDSEVDSyhDcmVhdGVSYWRpb0dyb3VwQ29udHJvbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlUmFkaW9Hcm91cENvbnRyb2wpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDcmVhdGVSYWRpb0dyb3VwQ29udHJvbCh3aW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJndpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kc1JlY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ3JlYXRlUmFkaW9Hcm91cENvbnRyb2wod2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBvdXRDb250cm9sKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxfQ3JlYXRlU2Nyb2xsaW5nVGV4dEJveENvbnRyb2woUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93UHRyIHdpbmRvdzsKLQlSZWN0IGJvdW5kc1JlY3Q7Ci0JU0ludDE2IGNvbnRlbnRSZXNJRDsKLQlCb29sZWFuIGF1dG9TY3JvbGw7Ci0JVUludDMyIGRlbGF5QmVmb3JlQXV0b1Njcm9sbDsKLQlVSW50MzIgZGVsYXlCZXR3ZWVuQXV0b1Njcm9sbDsKLQlVSW50MTYgYXV0b1Njcm9sbEFtb3VudDsKLQlDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93UHRyIHdpbmRvdzsKKyAgICBSZWN0IGJvdW5kc1JlY3Q7CisgICAgU0ludDE2IGNvbnRlbnRSZXNJRDsKKyAgICBCb29sZWFuIGF1dG9TY3JvbGw7CisgICAgVUludDMyIGRlbGF5QmVmb3JlQXV0b1Njcm9sbDsKKyAgICBVSW50MzIgZGVsYXlCZXR3ZWVuQXV0b1Njcm9sbDsKKyAgICBVSW50MTYgYXV0b1Njcm9sbEFtb3VudDsKKyAgICBDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CiAjaWZuZGVmIENyZWF0ZVNjcm9sbGluZ1RleHRCb3hDb250cm9sCi0JUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlU2Nyb2xsaW5nVGV4dEJveENvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKENyZWF0ZVNjcm9sbGluZ1RleHRCb3hDb250cm9sKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZoYmxsSCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNvbnRlbnRSZXNJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmF1dG9TY3JvbGwsCi0JICAgICAgICAgICAgICAgICAgICAgICZkZWxheUJlZm9yZUF1dG9TY3JvbGwsCi0JICAgICAgICAgICAgICAgICAgICAgICZkZWxheUJldHdlZW5BdXRvU2Nyb2xsLAotCSAgICAgICAgICAgICAgICAgICAgICAmYXV0b1Njcm9sbEFtb3VudCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDcmVhdGVTY3JvbGxpbmdUZXh0Qm94Q29udHJvbCh3aW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50UmVzSUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9TY3JvbGwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5QmVmb3JlQXV0b1Njcm9sbCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXlCZXR3ZWVuQXV0b1Njcm9sbCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b1Njcm9sbEFtb3VudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBvdXRDb250cm9sKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maGJsbEgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJndpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjb250ZW50UmVzSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhdXRvU2Nyb2xsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVsYXlCZWZvcmVBdXRvU2Nyb2xsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVsYXlCZXR3ZWVuQXV0b1Njcm9sbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmF1dG9TY3JvbGxBbW91bnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ3JlYXRlU2Nyb2xsaW5nVGV4dEJveENvbnRyb2wod2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFJlc0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvU2Nyb2xsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheUJlZm9yZUF1dG9TY3JvbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5QmV0d2VlbkF1dG9TY3JvbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9TY3JvbGxBbW91bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsX0NyZWF0ZURpc2Nsb3N1cmVCdXR0b25Db250cm9sKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVdpbmRvd1B0ciBpbldpbmRvdzsKLQlSZWN0IGluQm91bmRzUmVjdDsKLQlTSW50MzIgaW5WYWx1ZTsKLQlCb29sZWFuIGluQXV0b1RvZ2dsZXM7Ci0JQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd1B0ciBpbldpbmRvdzsKKyAgICBSZWN0IGluQm91bmRzUmVjdDsKKyAgICBTSW50MzIgaW5WYWx1ZTsKKyAgICBCb29sZWFuIGluQXV0b1RvZ2dsZXM7CisgICAgQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOwogI2lmbmRlZiBDcmVhdGVEaXNjbG9zdXJlQnV0dG9uQ29udHJvbAotCVB5TWFjX1BSRUNIRUNLKENyZWF0ZURpc2Nsb3N1cmVCdXR0b25Db250cm9sKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDcmVhdGVEaXNjbG9zdXJlQnV0dG9uQ29udHJvbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbGIiLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmluV2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5Cb3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5WYWx1ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluQXV0b1RvZ2dsZXMpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ3JlYXRlRGlzY2xvc3VyZUJ1dHRvbkNvbnRyb2woaW5XaW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluVmFsdWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQXV0b1RvZ2dsZXMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmxiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpbldpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmluQm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkF1dG9Ub2dnbGVzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENyZWF0ZURpc2Nsb3N1cmVCdXR0b25Db250cm9sKGluV2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Cb3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkF1dG9Ub2dnbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bF9DcmVhdGVSb3VuZEJ1dHRvbkNvbnRyb2woUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93UHRyIGluV2luZG93OwotCVJlY3QgaW5Cb3VuZHNSZWN0OwotCVNJbnQxNiBpblNpemU7Ci0JQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvIGluQ29udGVudDsKLQlDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93UHRyIGluV2luZG93OworICAgIFJlY3QgaW5Cb3VuZHNSZWN0OworICAgIFNJbnQxNiBpblNpemU7CisgICAgQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvIGluQ29udGVudDsKKyAgICBDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CiAjaWZuZGVmIENyZWF0ZVJvdW5kQnV0dG9uQ29udHJvbAotCVB5TWFjX1BSRUNIRUNLKENyZWF0ZVJvdW5kQnV0dG9uQ29udHJvbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlUm91bmRCdXR0b25Db250cm9sKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZoTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmluV2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5Cb3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5TaXplLAotCSAgICAgICAgICAgICAgICAgICAgICBDb250cm9sQnV0dG9uQ29udGVudEluZm9fQ29udmVydCwgJmluQ29udGVudCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDcmVhdGVSb3VuZEJ1dHRvbkNvbnRyb2woaW5XaW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Cb3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5TaXplLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQ29udGVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmhPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpbkJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2xCdXR0b25Db250ZW50SW5mb19Db252ZXJ0LCAmaW5Db250ZW50KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENyZWF0ZVJvdW5kQnV0dG9uQ29udHJvbChpbldpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Db250ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBvdXRDb250cm9sKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxfQ3JlYXRlRGF0YUJyb3dzZXJDb250cm9sKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVdpbmRvd1B0ciB3aW5kb3c7Ci0JUmVjdCBib3VuZHNSZWN0OwotCU9TVHlwZSBzdHlsZTsKLQlDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93UHRyIHdpbmRvdzsKKyAgICBSZWN0IGJvdW5kc1JlY3Q7CisgICAgT1NUeXBlIHN0eWxlOworICAgIENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKICNpZm5kZWYgQ3JlYXRlRGF0YUJyb3dzZXJDb250cm9sCi0JUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlRGF0YUJyb3dzZXJDb250cm9sKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDcmVhdGVEYXRhQnJvd3NlckNvbnRyb2wpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZzdHlsZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDcmVhdGVEYXRhQnJvd3NlckNvbnRyb2wod2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZzdHlsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDcmVhdGVEYXRhQnJvd3NlckNvbnRyb2wod2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsX0NyZWF0ZUVkaXRVbmljb2RlVGV4dENvbnRyb2woUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93UHRyIHdpbmRvdzsKLQlSZWN0IGJvdW5kc1JlY3Q7Ci0JQ0ZTdHJpbmdSZWYgdGV4dDsKLQlCb29sZWFuIGlzUGFzc3dvcmQ7Ci0JQ29udHJvbEZvbnRTdHlsZVJlYyBzdHlsZTsKLQlDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93UHRyIHdpbmRvdzsKKyAgICBSZWN0IGJvdW5kc1JlY3Q7CisgICAgQ0ZTdHJpbmdSZWYgdGV4dDsKKyAgICBCb29sZWFuIGlzUGFzc3dvcmQ7CisgICAgQ29udHJvbEZvbnRTdHlsZVJlYyBzdHlsZTsKKyAgICBDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CiAjaWZuZGVmIENyZWF0ZUVkaXRVbmljb2RlVGV4dENvbnRyb2wKLQlQeU1hY19QUkVDSEVDSyhDcmVhdGVFZGl0VW5pY29kZVRleHRDb250cm9sKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDcmVhdGVFZGl0VW5pY29kZVRleHRDb250cm9sKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICZpc1Bhc3N3b3JkLAotCSAgICAgICAgICAgICAgICAgICAgICBDb250cm9sRm9udFN0eWxlX0NvbnZlcnQsICZzdHlsZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDcmVhdGVFZGl0VW5pY29kZVRleHRDb250cm9sKHdpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUGFzc3dvcmQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0eWxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mYk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlzUGFzc3dvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2xGb250U3R5bGVfQ29udmVydCwgJnN0eWxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENyZWF0ZUVkaXRVbmljb2RlVGV4dENvbnRyb2wod2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNQYXNzd29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBvdXRDb250cm9sKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxfRmluZENvbnRyb2xVbmRlck1vdXNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb250cm9sSGFuZGxlIF9ydjsKLQlQb2ludCBpbldoZXJlOwotCVdpbmRvd1B0ciBpbldpbmRvdzsKLQlTSW50MTYgb3V0UGFydDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29udHJvbEhhbmRsZSBfcnY7CisgICAgUG9pbnQgaW5XaGVyZTsKKyAgICBXaW5kb3dQdHIgaW5XaW5kb3c7CisgICAgU0ludDE2IG91dFBhcnQ7CiAjaWZuZGVmIEZpbmRDb250cm9sVW5kZXJNb3VzZQotCVB5TWFjX1BSRUNIRUNLKEZpbmRDb250cm9sVW5kZXJNb3VzZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRmluZENvbnRyb2xVbmRlck1vdXNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJmluV2hlcmUsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3cpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBGaW5kQ29udHJvbFVuZGVyTW91c2UoaW5XaGVyZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5XaW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRQYXJ0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfV2hpY2hDb250cm9sLCBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0UGFydCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmaW5XaGVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpbldpbmRvdykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEZpbmRDb250cm9sVW5kZXJNb3VzZShpbldoZXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbldpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFBhcnQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9XaGljaENvbnRyb2wsIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRQYXJ0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxfYXNfQ29udHJvbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29udHJvbEhhbmRsZSBfcnY7Ci0JSGFuZGxlIGg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbnRyb2xIYW5kbGUgX3J2OworICAgIEhhbmRsZSBoOwogI2lmbmRlZiBhc19Db250cm9sCi0JUHlNYWNfUFJFQ0hFQ0soYXNfQ29udHJvbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soYXNfQ29udHJvbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IGFzX0NvbnRyb2woaCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gYXNfQ29udHJvbChoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsX0NyZWF0ZVRhYnNDb250cm9sKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVdpbmRvd1B0ciB3aW5kb3c7Ci0JUmVjdCBib3VuZHNSZWN0OwotCVVJbnQxNiBzaXplOwotCVVJbnQxNiBkaXJlY3Rpb247Ci0JaW50IGk7Ci0JVUludDE2IG51bVRhYnM7Ci0JQ29udHJvbFRhYkVudHJ5IHRhYkFycmF5W01BWFRBQlNdOwotCUNvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKLQlQeU9iamVjdCAqdGFiQXJyYXlPYmosICp0YWJFbnRyeTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBXaW5kb3dQdHIgd2luZG93OworICAgIFJlY3QgYm91bmRzUmVjdDsKKyAgICBVSW50MTYgc2l6ZTsKKyAgICBVSW50MTYgZGlyZWN0aW9uOworICAgIGludCBpOworICAgIFVJbnQxNiBudW1UYWJzOworICAgIENvbnRyb2xUYWJFbnRyeSB0YWJBcnJheVtNQVhUQUJTXTsKKyAgICBDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CisgICAgUHlPYmplY3QgKnRhYkFycmF5T2JqLCAqdGFiRW50cnk7CiAKICNpZm5kZWYgQ3JlYXRlVGFic0NvbnRyb2wKLQlQeU1hY19QUkVDSEVDSyhDcmVhdGVUYWJzQ29udHJvbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlVGFic0NvbnRyb2wpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJkhITyIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNpemUsCi0JICAgICAgICAgICAgICAgICAgICAgICZkaXJlY3Rpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICZ0YWJBcnJheU9iaikpCi0JICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mSEhPIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRpcmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRhYkFycmF5T2JqKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpID0gUHlTZXF1ZW5jZV9MZW5ndGgodGFiQXJyYXlPYmopOwotCWlmIChpID09IC0xKQotCSAgICAgICAgcmV0dXJuIE5VTEw7Ci0JaWYgKGkgPiBNQVhUQUJTKSB7Ci0JICAgICAgICBQeUVycl9TZXRTdHJpbmcoQ3RsX0Vycm9yLCAiVG9vIG1hbnkgdGFicyIpOwotCSAgICAgICAgcmV0dXJuIE5VTEw7Ci0JfQotCW51bVRhYnMgPSBpOwotCWZvciAoaT0wOyBpPG51bVRhYnM7IGkrKykgewotCSAgICAgICAgdGFiRW50cnkgPSBQeVNlcXVlbmNlX0dldEl0ZW0odGFiQXJyYXlPYmosIGkpOwotCSAgICAgICAgaWYgKHRhYkVudHJ5ID09IE5VTEwpCi0JICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotCSAgICAgICAgaWYgKCFQeUFyZ19QYXJzZSh0YWJFbnRyeSwgIihPJk8mQikiLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sQnV0dG9uQ29udGVudEluZm9fQ29udmVydCwgJnRhYkFycmF5W2ldLmljb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZ0YWJBcnJheVtpXS5uYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmdGFiQXJyYXlbaV0uZW5hYmxlZAotCSAgICAgICAgICAgICAgICAgICAgICAgICApKQotCSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLQl9CisgICAgaSA9IFB5U2VxdWVuY2VfTGVuZ3RoKHRhYkFycmF5T2JqKTsKKyAgICBpZiAoaSA9PSAtMSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKGkgPiBNQVhUQUJTKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhDdGxfRXJyb3IsICJUb28gbWFueSB0YWJzIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBudW1UYWJzID0gaTsKKyAgICBmb3IgKGk9MDsgaTxudW1UYWJzOyBpKyspIHsKKyAgICAgICAgdGFiRW50cnkgPSBQeVNlcXVlbmNlX0dldEl0ZW0odGFiQXJyYXlPYmosIGkpOworICAgICAgICBpZiAodGFiRW50cnkgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBpZiAoIVB5QXJnX1BhcnNlKHRhYkVudHJ5LCAiKE8mTyZCKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvX0NvbnZlcnQsICZ0YWJBcnJheVtpXS5pY29uLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZ0YWJBcnJheVtpXS5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICZ0YWJBcnJheVtpXS5lbmFibGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCV9lcnIgPSBDcmVhdGVUYWJzQ29udHJvbCh3aW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgIG51bVRhYnMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIHRhYkFycmF5LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOwotCXJldHVybiBfcmVzOworICAgIF9lcnIgPSBDcmVhdGVUYWJzQ29udHJvbCh3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bVRhYnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYkFycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgQ3RsX21ldGhvZHNbXSA9IHsKLQl7Ik5ld0NvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX05ld0NvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBvd25pbmdXaW5kb3csIFJlY3QgYm91bmRzUmVjdCwgU3RyMjU1IGNvbnRyb2xUaXRsZSwgQm9vbGVhbiBpbml0aWFsbHlWaXNpYmxlLCBTSW50MTYgaW5pdGlhbFZhbHVlLCBTSW50MTYgbWluaW11bVZhbHVlLCBTSW50MTYgbWF4aW11bVZhbHVlLCBTSW50MTYgcHJvY0lELCBTSW50MzIgY29udHJvbFJlZmVyZW5jZSkgLT4gKENvbnRyb2xIYW5kbGUgX3J2KSIpfSwKLQl7IkdldE5ld0NvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0dldE5ld0NvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiByZXNvdXJjZUlELCBXaW5kb3dQdHIgb3duaW5nV2luZG93KSAtPiAoQ29udHJvbEhhbmRsZSBfcnYpIil9LAotCXsiRHJhd0NvbnRyb2xzIiwgKFB5Q0Z1bmN0aW9uKUN0bF9EcmF3Q29udHJvbHMsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB0aGVXaW5kb3cpIC0+IE5vbmUiKX0sCi0JeyJVcGRhdGVDb250cm9scyIsIChQeUNGdW5jdGlvbilDdGxfVXBkYXRlQ29udHJvbHMsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBpbldpbmRvdywgUmduSGFuZGxlIGluVXBkYXRlUmVnaW9uKSAtPiBOb25lIil9LAotCXsiRmluZENvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0ZpbmRDb250cm9sLCAxLAotCSBQeURvY19TVFIoIihQb2ludCB0ZXN0UG9pbnQsIFdpbmRvd1B0ciB0aGVXaW5kb3cpIC0+IChDb250cm9sUGFydENvZGUgX3J2LCBDb250cm9sSGFuZGxlIHRoZUNvbnRyb2wpIil9LAotCXsiSWRsZUNvbnRyb2xzIiwgKFB5Q0Z1bmN0aW9uKUN0bF9JZGxlQ29udHJvbHMsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBpbldpbmRvdykgLT4gTm9uZSIpfSwKLQl7IkdldENvbnRyb2xCeUlEIiwgKFB5Q0Z1bmN0aW9uKUN0bF9HZXRDb250cm9sQnlJRCwgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluV2luZG93LCBDb250cm9sSUQgaW5JRCkgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCi0JeyJEdW1wQ29udHJvbEhpZXJhcmNoeSIsIChQeUNGdW5jdGlvbilDdGxfRHVtcENvbnRyb2xIaWVyYXJjaHksIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBpbldpbmRvdywgRlNTcGVjIGluRHVtcEZpbGUpIC0+IE5vbmUiKX0sCi0JeyJDcmVhdGVSb290Q29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlUm9vdENvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBpbldpbmRvdykgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCi0JeyJHZXRSb290Q29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfR2V0Um9vdENvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBpbldpbmRvdykgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCi0JeyJHZXRLZXlib2FyZEZvY3VzIiwgKFB5Q0Z1bmN0aW9uKUN0bF9HZXRLZXlib2FyZEZvY3VzLCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQdHIgaW5XaW5kb3cpIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAotCXsiU2V0S2V5Ym9hcmRGb2N1cyIsIChQeUNGdW5jdGlvbilDdGxfU2V0S2V5Ym9hcmRGb2N1cywgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluV2luZG93LCBDb250cm9sSGFuZGxlIGluQ29udHJvbCwgQ29udHJvbEZvY3VzUGFydCBpblBhcnQpIC0+IE5vbmUiKX0sCi0JeyJBZHZhbmNlS2V5Ym9hcmRGb2N1cyIsIChQeUNGdW5jdGlvbilDdGxfQWR2YW5jZUtleWJvYXJkRm9jdXMsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBpbldpbmRvdykgLT4gTm9uZSIpfSwKLQl7IlJldmVyc2VLZXlib2FyZEZvY3VzIiwgKFB5Q0Z1bmN0aW9uKUN0bF9SZXZlcnNlS2V5Ym9hcmRGb2N1cywgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluV2luZG93KSAtPiBOb25lIil9LAotCXsiQ2xlYXJLZXlib2FyZEZvY3VzIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DbGVhcktleWJvYXJkRm9jdXMsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBpbldpbmRvdykgLT4gTm9uZSIpfSwKLQl7IlNldEF1dG9tYXRpY0NvbnRyb2xEcmFnVHJhY2tpbmdFbmFibGVkRm9yV2luZG93IiwgKFB5Q0Z1bmN0aW9uKUN0bF9TZXRBdXRvbWF0aWNDb250cm9sRHJhZ1RyYWNraW5nRW5hYmxlZEZvcldpbmRvdywgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluV2luZG93LCBCb29sZWFuIGluVHJhY2tzKSAtPiBOb25lIil9LAotCXsiSXNBdXRvbWF0aWNDb250cm9sRHJhZ1RyYWNraW5nRW5hYmxlZEZvcldpbmRvdyIsIChQeUNGdW5jdGlvbilDdGxfSXNBdXRvbWF0aWNDb250cm9sRHJhZ1RyYWNraW5nRW5hYmxlZEZvcldpbmRvdywgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluV2luZG93KSAtPiAoQm9vbGVhbiBvdXRUcmFja3MpIil9LAotCXsiQ3JlYXRlQmV2ZWxCdXR0b25Db250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVCZXZlbEJ1dHRvbkNvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIFJlY3QgYm91bmRzUmVjdCwgQ0ZTdHJpbmdSZWYgdGl0bGUsIFVJbnQxNiB0aGlja25lc3MsIFVJbnQxNiBiZWhhdmlvciwgQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvIGluZm8sIFNJbnQxNiBtZW51SUQsIFVJbnQxNiBtZW51QmVoYXZpb3IsIFVJbnQxNiBtZW51UGxhY2VtZW50KSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKLQl7IkNyZWF0ZVNsaWRlckNvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0NyZWF0ZVNsaWRlckNvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIFJlY3QgYm91bmRzUmVjdCwgU0ludDMyIHZhbHVlLCBTSW50MzIgbWluaW11bSwgU0ludDMyIG1heGltdW0sIFVJbnQxNiBvcmllbnRhdGlvbiwgVUludDE2IG51bVRpY2tNYXJrcywgQm9vbGVhbiBsaXZlVHJhY2tpbmcsIFB5T2JqZWN0KiBsaXZlVHJhY2tpbmdQcm9jKSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKLQl7IkNyZWF0ZURpc2Nsb3N1cmVUcmlhbmdsZUNvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0NyZWF0ZURpc2Nsb3N1cmVUcmlhbmdsZUNvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBpbldpbmRvdywgUmVjdCBpbkJvdW5kc1JlY3QsIFVJbnQxNiBpbk9yaWVudGF0aW9uLCBDRlN0cmluZ1JlZiBpblRpdGxlLCBTSW50MzIgaW5Jbml0aWFsVmFsdWUsIEJvb2xlYW4gaW5EcmF3VGl0bGUsIEJvb2xlYW4gaW5BdXRvVG9nZ2xlcykgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCi0JeyJDcmVhdGVQcm9ncmVzc0JhckNvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0NyZWF0ZVByb2dyZXNzQmFyQ29udHJvbCwgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdywgUmVjdCBib3VuZHNSZWN0LCBTSW50MzIgdmFsdWUsIFNJbnQzMiBtaW5pbXVtLCBTSW50MzIgbWF4aW11bSwgQm9vbGVhbiBpbmRldGVybWluYXRlKSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKLQl7IkNyZWF0ZVJlbGV2YW5jZUJhckNvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0NyZWF0ZVJlbGV2YW5jZUJhckNvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIFJlY3QgYm91bmRzUmVjdCwgU0ludDMyIHZhbHVlLCBTSW50MzIgbWluaW11bSwgU0ludDMyIG1heGltdW0pIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAotCXsiQ3JlYXRlTGl0dGxlQXJyb3dzQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlTGl0dGxlQXJyb3dzQ29udHJvbCwgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdywgUmVjdCBib3VuZHNSZWN0LCBTSW50MzIgdmFsdWUsIFNJbnQzMiBtaW5pbXVtLCBTSW50MzIgbWF4aW11bSwgU0ludDMyIGluY3JlbWVudCkgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCi0JeyJDcmVhdGVDaGFzaW5nQXJyb3dzQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlQ2hhc2luZ0Fycm93c0NvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIFJlY3QgYm91bmRzUmVjdCkgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCi0JeyJDcmVhdGVTZXBhcmF0b3JDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVTZXBhcmF0b3JDb250cm9sLCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQdHIgd2luZG93LCBSZWN0IGJvdW5kc1JlY3QpIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAotCXsiQ3JlYXRlR3JvdXBCb3hDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVHcm91cEJveENvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIFJlY3QgYm91bmRzUmVjdCwgQ0ZTdHJpbmdSZWYgdGl0bGUsIEJvb2xlYW4gcHJpbWFyeSkgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCi0JeyJDcmVhdGVDaGVja0dyb3VwQm94Q29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlQ2hlY2tHcm91cEJveENvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIFJlY3QgYm91bmRzUmVjdCwgQ0ZTdHJpbmdSZWYgdGl0bGUsIFNJbnQzMiBpbml0aWFsVmFsdWUsIEJvb2xlYW4gcHJpbWFyeSwgQm9vbGVhbiBhdXRvVG9nZ2xlKSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKLQl7IkNyZWF0ZVBvcHVwR3JvdXBCb3hDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVQb3B1cEdyb3VwQm94Q29udHJvbCwgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdywgUmVjdCBib3VuZHNSZWN0LCBDRlN0cmluZ1JlZiB0aXRsZSwgQm9vbGVhbiBwcmltYXJ5LCBTSW50MTYgbWVudUlELCBCb29sZWFuIHZhcmlhYmxlV2lkdGgsIFNJbnQxNiB0aXRsZVdpZHRoLCBTSW50MTYgdGl0bGVKdXN0aWZpY2F0aW9uLCBTdHlsZSB0aXRsZVN0eWxlKSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKLQl7IkNyZWF0ZUltYWdlV2VsbENvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0NyZWF0ZUltYWdlV2VsbENvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIFJlY3QgYm91bmRzUmVjdCwgQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvIGluZm8pIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAotCXsiQ3JlYXRlUG9wdXBBcnJvd0NvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0NyZWF0ZVBvcHVwQXJyb3dDb250cm9sLCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQdHIgd2luZG93LCBSZWN0IGJvdW5kc1JlY3QsIFVJbnQxNiBvcmllbnRhdGlvbiwgVUludDE2IHNpemUpIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAotCXsiQ3JlYXRlUGxhY2FyZENvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0NyZWF0ZVBsYWNhcmRDb250cm9sLCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQdHIgd2luZG93LCBSZWN0IGJvdW5kc1JlY3QpIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAotCXsiQ3JlYXRlQ2xvY2tDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVDbG9ja0NvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIFJlY3QgYm91bmRzUmVjdCwgVUludDE2IGNsb2NrVHlwZSwgVUludDMyIGNsb2NrRmxhZ3MpIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAotCXsiQ3JlYXRlVXNlclBhbmVDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVVc2VyUGFuZUNvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIFJlY3QgYm91bmRzUmVjdCwgVUludDMyIGZlYXR1cmVzKSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKLQl7IkNyZWF0ZUVkaXRUZXh0Q29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlRWRpdFRleHRDb250cm9sLCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQdHIgd2luZG93LCBSZWN0IGJvdW5kc1JlY3QsIENGU3RyaW5nUmVmIHRleHQsIEJvb2xlYW4gaXNQYXNzd29yZCwgQm9vbGVhbiB1c2VJbmxpbmVJbnB1dCwgQ29udHJvbEZvbnRTdHlsZVJlYyBzdHlsZSkgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCi0JeyJDcmVhdGVTdGF0aWNUZXh0Q29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlU3RhdGljVGV4dENvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIFJlY3QgYm91bmRzUmVjdCwgQ0ZTdHJpbmdSZWYgdGV4dCwgQ29udHJvbEZvbnRTdHlsZVJlYyBzdHlsZSkgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCi0JeyJDcmVhdGVQaWN0dXJlQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlUGljdHVyZUNvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIFJlY3QgYm91bmRzUmVjdCwgQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvIGNvbnRlbnQsIEJvb2xlYW4gZG9udFRyYWNrKSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKLQl7IkNyZWF0ZUljb25Db250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVJY29uQ29udHJvbCwgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluV2luZG93LCBSZWN0IGluQm91bmRzUmVjdCwgQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvIGluSWNvbkNvbnRlbnQsIEJvb2xlYW4gaW5Eb250VHJhY2spIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAotCXsiQ3JlYXRlV2luZG93SGVhZGVyQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlV2luZG93SGVhZGVyQ29udHJvbCwgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdywgUmVjdCBib3VuZHNSZWN0LCBCb29sZWFuIGlzTGlzdEhlYWRlcikgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCi0JeyJDcmVhdGVQdXNoQnV0dG9uQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlUHVzaEJ1dHRvbkNvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIFJlY3QgYm91bmRzUmVjdCwgQ0ZTdHJpbmdSZWYgdGl0bGUpIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAotCXsiQ3JlYXRlUHVzaEJ1dHRvbldpdGhJY29uQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlUHVzaEJ1dHRvbldpdGhJY29uQ29udHJvbCwgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdywgUmVjdCBib3VuZHNSZWN0LCBDRlN0cmluZ1JlZiB0aXRsZSwgQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvIGljb24sIFVJbnQxNiBpY29uQWxpZ25tZW50KSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKLQl7IkNyZWF0ZVJhZGlvQnV0dG9uQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlUmFkaW9CdXR0b25Db250cm9sLCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQdHIgd2luZG93LCBSZWN0IGJvdW5kc1JlY3QsIENGU3RyaW5nUmVmIHRpdGxlLCBTSW50MzIgaW5pdGlhbFZhbHVlLCBCb29sZWFuIGF1dG9Ub2dnbGUpIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAotCXsiQ3JlYXRlQ2hlY2tCb3hDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVDaGVja0JveENvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIFJlY3QgYm91bmRzUmVjdCwgQ0ZTdHJpbmdSZWYgdGl0bGUsIFNJbnQzMiBpbml0aWFsVmFsdWUsIEJvb2xlYW4gYXV0b1RvZ2dsZSkgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCi0JeyJDcmVhdGVTY3JvbGxCYXJDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVTY3JvbGxCYXJDb250cm9sLCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQdHIgd2luZG93LCBSZWN0IGJvdW5kc1JlY3QsIFNJbnQzMiB2YWx1ZSwgU0ludDMyIG1pbmltdW0sIFNJbnQzMiBtYXhpbXVtLCBTSW50MzIgdmlld1NpemUsIEJvb2xlYW4gbGl2ZVRyYWNraW5nLCBQeU9iamVjdCogbGl2ZVRyYWNraW5nUHJvYykgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCi0JeyJDcmVhdGVQb3B1cEJ1dHRvbkNvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0NyZWF0ZVBvcHVwQnV0dG9uQ29udHJvbCwgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdywgUmVjdCBib3VuZHNSZWN0LCBDRlN0cmluZ1JlZiB0aXRsZSwgU0ludDE2IG1lbnVJRCwgQm9vbGVhbiB2YXJpYWJsZVdpZHRoLCBTSW50MTYgdGl0bGVXaWR0aCwgU0ludDE2IHRpdGxlSnVzdGlmaWNhdGlvbiwgU3R5bGUgdGl0bGVTdHlsZSkgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCi0JeyJDcmVhdGVSYWRpb0dyb3VwQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlUmFkaW9Hcm91cENvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIFJlY3QgYm91bmRzUmVjdCkgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCi0JeyJDcmVhdGVTY3JvbGxpbmdUZXh0Qm94Q29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlU2Nyb2xsaW5nVGV4dEJveENvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIFJlY3QgYm91bmRzUmVjdCwgU0ludDE2IGNvbnRlbnRSZXNJRCwgQm9vbGVhbiBhdXRvU2Nyb2xsLCBVSW50MzIgZGVsYXlCZWZvcmVBdXRvU2Nyb2xsLCBVSW50MzIgZGVsYXlCZXR3ZWVuQXV0b1Njcm9sbCwgVUludDE2IGF1dG9TY3JvbGxBbW91bnQpIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAotCXsiQ3JlYXRlRGlzY2xvc3VyZUJ1dHRvbkNvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0NyZWF0ZURpc2Nsb3N1cmVCdXR0b25Db250cm9sLCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQdHIgaW5XaW5kb3csIFJlY3QgaW5Cb3VuZHNSZWN0LCBTSW50MzIgaW5WYWx1ZSwgQm9vbGVhbiBpbkF1dG9Ub2dnbGVzKSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKLQl7IkNyZWF0ZVJvdW5kQnV0dG9uQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlUm91bmRCdXR0b25Db250cm9sLCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQdHIgaW5XaW5kb3csIFJlY3QgaW5Cb3VuZHNSZWN0LCBTSW50MTYgaW5TaXplLCBDb250cm9sQnV0dG9uQ29udGVudEluZm8gaW5Db250ZW50KSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKLQl7IkNyZWF0ZURhdGFCcm93c2VyQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlRGF0YUJyb3dzZXJDb250cm9sLCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQdHIgd2luZG93LCBSZWN0IGJvdW5kc1JlY3QsIE9TVHlwZSBzdHlsZSkgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCi0JeyJDcmVhdGVFZGl0VW5pY29kZVRleHRDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVFZGl0VW5pY29kZVRleHRDb250cm9sLCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQdHIgd2luZG93LCBSZWN0IGJvdW5kc1JlY3QsIENGU3RyaW5nUmVmIHRleHQsIEJvb2xlYW4gaXNQYXNzd29yZCwgQ29udHJvbEZvbnRTdHlsZVJlYyBzdHlsZSkgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCi0JeyJGaW5kQ29udHJvbFVuZGVyTW91c2UiLCAoUHlDRnVuY3Rpb24pQ3RsX0ZpbmRDb250cm9sVW5kZXJNb3VzZSwgMSwKLQkgUHlEb2NfU1RSKCIoUG9pbnQgaW5XaGVyZSwgV2luZG93UHRyIGluV2luZG93KSAtPiAoQ29udHJvbEhhbmRsZSBfcnYsIFNJbnQxNiBvdXRQYXJ0KSIpfSwKLQl7ImFzX0NvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX2FzX0NvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKEhhbmRsZSBoKSAtPiAoQ29udHJvbEhhbmRsZSBfcnYpIil9LAotCXsiQ3JlYXRlVGFic0NvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0NyZWF0ZVRhYnNDb250cm9sLCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQdHIgd2luZG93LCBSZWN0IGJvdW5kc1JlY3QsIFVJbnQxNiBzaXplLCBVSW50MTYgZGlyZWN0aW9uLCBDb250cm9sVGFiRW50cnkgdGFiQXJyYXkpIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAotCXtOVUxMLCBOVUxMLCAwfQorICAgIHsiTmV3Q29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfTmV3Q29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIG93bmluZ1dpbmRvdywgUmVjdCBib3VuZHNSZWN0LCBTdHIyNTUgY29udHJvbFRpdGxlLCBCb29sZWFuIGluaXRpYWxseVZpc2libGUsIFNJbnQxNiBpbml0aWFsVmFsdWUsIFNJbnQxNiBtaW5pbXVtVmFsdWUsIFNJbnQxNiBtYXhpbXVtVmFsdWUsIFNJbnQxNiBwcm9jSUQsIFNJbnQzMiBjb250cm9sUmVmZXJlbmNlKSAtPiAoQ29udHJvbEhhbmRsZSBfcnYpIil9LAorICAgIHsiR2V0TmV3Q29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfR2V0TmV3Q29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IHJlc291cmNlSUQsIFdpbmRvd1B0ciBvd25pbmdXaW5kb3cpIC0+IChDb250cm9sSGFuZGxlIF9ydikiKX0sCisgICAgeyJEcmF3Q29udHJvbHMiLCAoUHlDRnVuY3Rpb24pQ3RsX0RyYXdDb250cm9scywgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIHRoZVdpbmRvdykgLT4gTm9uZSIpfSwKKyAgICB7IlVwZGF0ZUNvbnRyb2xzIiwgKFB5Q0Z1bmN0aW9uKUN0bF9VcGRhdGVDb250cm9scywgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluV2luZG93LCBSZ25IYW5kbGUgaW5VcGRhdGVSZWdpb24pIC0+IE5vbmUiKX0sCisgICAgeyJGaW5kQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfRmluZENvbnRyb2wsIDEsCisgICAgIFB5RG9jX1NUUigiKFBvaW50IHRlc3RQb2ludCwgV2luZG93UHRyIHRoZVdpbmRvdykgLT4gKENvbnRyb2xQYXJ0Q29kZSBfcnYsIENvbnRyb2xIYW5kbGUgdGhlQ29udHJvbCkiKX0sCisgICAgeyJJZGxlQ29udHJvbHMiLCAoUHlDRnVuY3Rpb24pQ3RsX0lkbGVDb250cm9scywgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluV2luZG93KSAtPiBOb25lIil9LAorICAgIHsiR2V0Q29udHJvbEJ5SUQiLCAoUHlDRnVuY3Rpb24pQ3RsX0dldENvbnRyb2xCeUlELCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgaW5XaW5kb3csIENvbnRyb2xJRCBpbklEKSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKKyAgICB7IkR1bXBDb250cm9sSGllcmFyY2h5IiwgKFB5Q0Z1bmN0aW9uKUN0bF9EdW1wQ29udHJvbEhpZXJhcmNoeSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluV2luZG93LCBGU1NwZWMgaW5EdW1wRmlsZSkgLT4gTm9uZSIpfSwKKyAgICB7IkNyZWF0ZVJvb3RDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVSb290Q29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluV2luZG93KSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKKyAgICB7IkdldFJvb3RDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9HZXRSb290Q29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluV2luZG93KSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKKyAgICB7IkdldEtleWJvYXJkRm9jdXMiLCAoUHlDRnVuY3Rpb24pQ3RsX0dldEtleWJvYXJkRm9jdXMsIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBpbldpbmRvdykgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCisgICAgeyJTZXRLZXlib2FyZEZvY3VzIiwgKFB5Q0Z1bmN0aW9uKUN0bF9TZXRLZXlib2FyZEZvY3VzLCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgaW5XaW5kb3csIENvbnRyb2xIYW5kbGUgaW5Db250cm9sLCBDb250cm9sRm9jdXNQYXJ0IGluUGFydCkgLT4gTm9uZSIpfSwKKyAgICB7IkFkdmFuY2VLZXlib2FyZEZvY3VzIiwgKFB5Q0Z1bmN0aW9uKUN0bF9BZHZhbmNlS2V5Ym9hcmRGb2N1cywgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluV2luZG93KSAtPiBOb25lIil9LAorICAgIHsiUmV2ZXJzZUtleWJvYXJkRm9jdXMiLCAoUHlDRnVuY3Rpb24pQ3RsX1JldmVyc2VLZXlib2FyZEZvY3VzLCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgaW5XaW5kb3cpIC0+IE5vbmUiKX0sCisgICAgeyJDbGVhcktleWJvYXJkRm9jdXMiLCAoUHlDRnVuY3Rpb24pQ3RsX0NsZWFyS2V5Ym9hcmRGb2N1cywgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluV2luZG93KSAtPiBOb25lIil9LAorICAgIHsiU2V0QXV0b21hdGljQ29udHJvbERyYWdUcmFja2luZ0VuYWJsZWRGb3JXaW5kb3ciLCAoUHlDRnVuY3Rpb24pQ3RsX1NldEF1dG9tYXRpY0NvbnRyb2xEcmFnVHJhY2tpbmdFbmFibGVkRm9yV2luZG93LCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgaW5XaW5kb3csIEJvb2xlYW4gaW5UcmFja3MpIC0+IE5vbmUiKX0sCisgICAgeyJJc0F1dG9tYXRpY0NvbnRyb2xEcmFnVHJhY2tpbmdFbmFibGVkRm9yV2luZG93IiwgKFB5Q0Z1bmN0aW9uKUN0bF9Jc0F1dG9tYXRpY0NvbnRyb2xEcmFnVHJhY2tpbmdFbmFibGVkRm9yV2luZG93LCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgaW5XaW5kb3cpIC0+IChCb29sZWFuIG91dFRyYWNrcykiKX0sCisgICAgeyJDcmVhdGVCZXZlbEJ1dHRvbkNvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0NyZWF0ZUJldmVsQnV0dG9uQ29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdywgUmVjdCBib3VuZHNSZWN0LCBDRlN0cmluZ1JlZiB0aXRsZSwgVUludDE2IHRoaWNrbmVzcywgVUludDE2IGJlaGF2aW9yLCBDb250cm9sQnV0dG9uQ29udGVudEluZm8gaW5mbywgU0ludDE2IG1lbnVJRCwgVUludDE2IG1lbnVCZWhhdmlvciwgVUludDE2IG1lbnVQbGFjZW1lbnQpIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAorICAgIHsiQ3JlYXRlU2xpZGVyQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlU2xpZGVyQ29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdywgUmVjdCBib3VuZHNSZWN0LCBTSW50MzIgdmFsdWUsIFNJbnQzMiBtaW5pbXVtLCBTSW50MzIgbWF4aW11bSwgVUludDE2IG9yaWVudGF0aW9uLCBVSW50MTYgbnVtVGlja01hcmtzLCBCb29sZWFuIGxpdmVUcmFja2luZywgUHlPYmplY3QqIGxpdmVUcmFja2luZ1Byb2MpIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAorICAgIHsiQ3JlYXRlRGlzY2xvc3VyZVRyaWFuZ2xlQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlRGlzY2xvc3VyZVRyaWFuZ2xlQ29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluV2luZG93LCBSZWN0IGluQm91bmRzUmVjdCwgVUludDE2IGluT3JpZW50YXRpb24sIENGU3RyaW5nUmVmIGluVGl0bGUsIFNJbnQzMiBpbkluaXRpYWxWYWx1ZSwgQm9vbGVhbiBpbkRyYXdUaXRsZSwgQm9vbGVhbiBpbkF1dG9Ub2dnbGVzKSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKKyAgICB7IkNyZWF0ZVByb2dyZXNzQmFyQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlUHJvZ3Jlc3NCYXJDb250cm9sLCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgd2luZG93LCBSZWN0IGJvdW5kc1JlY3QsIFNJbnQzMiB2YWx1ZSwgU0ludDMyIG1pbmltdW0sIFNJbnQzMiBtYXhpbXVtLCBCb29sZWFuIGluZGV0ZXJtaW5hdGUpIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAorICAgIHsiQ3JlYXRlUmVsZXZhbmNlQmFyQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlUmVsZXZhbmNlQmFyQ29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdywgUmVjdCBib3VuZHNSZWN0LCBTSW50MzIgdmFsdWUsIFNJbnQzMiBtaW5pbXVtLCBTSW50MzIgbWF4aW11bSkgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCisgICAgeyJDcmVhdGVMaXR0bGVBcnJvd3NDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVMaXR0bGVBcnJvd3NDb250cm9sLCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgd2luZG93LCBSZWN0IGJvdW5kc1JlY3QsIFNJbnQzMiB2YWx1ZSwgU0ludDMyIG1pbmltdW0sIFNJbnQzMiBtYXhpbXVtLCBTSW50MzIgaW5jcmVtZW50KSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKKyAgICB7IkNyZWF0ZUNoYXNpbmdBcnJvd3NDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVDaGFzaW5nQXJyb3dzQ29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdywgUmVjdCBib3VuZHNSZWN0KSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKKyAgICB7IkNyZWF0ZVNlcGFyYXRvckNvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0NyZWF0ZVNlcGFyYXRvckNvbnRyb2wsIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIFJlY3QgYm91bmRzUmVjdCkgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCisgICAgeyJDcmVhdGVHcm91cEJveENvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0NyZWF0ZUdyb3VwQm94Q29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdywgUmVjdCBib3VuZHNSZWN0LCBDRlN0cmluZ1JlZiB0aXRsZSwgQm9vbGVhbiBwcmltYXJ5KSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKKyAgICB7IkNyZWF0ZUNoZWNrR3JvdXBCb3hDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVDaGVja0dyb3VwQm94Q29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdywgUmVjdCBib3VuZHNSZWN0LCBDRlN0cmluZ1JlZiB0aXRsZSwgU0ludDMyIGluaXRpYWxWYWx1ZSwgQm9vbGVhbiBwcmltYXJ5LCBCb29sZWFuIGF1dG9Ub2dnbGUpIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAorICAgIHsiQ3JlYXRlUG9wdXBHcm91cEJveENvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0NyZWF0ZVBvcHVwR3JvdXBCb3hDb250cm9sLCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgd2luZG93LCBSZWN0IGJvdW5kc1JlY3QsIENGU3RyaW5nUmVmIHRpdGxlLCBCb29sZWFuIHByaW1hcnksIFNJbnQxNiBtZW51SUQsIEJvb2xlYW4gdmFyaWFibGVXaWR0aCwgU0ludDE2IHRpdGxlV2lkdGgsIFNJbnQxNiB0aXRsZUp1c3RpZmljYXRpb24sIFN0eWxlIHRpdGxlU3R5bGUpIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAorICAgIHsiQ3JlYXRlSW1hZ2VXZWxsQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlSW1hZ2VXZWxsQ29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdywgUmVjdCBib3VuZHNSZWN0LCBDb250cm9sQnV0dG9uQ29udGVudEluZm8gaW5mbykgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCisgICAgeyJDcmVhdGVQb3B1cEFycm93Q29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlUG9wdXBBcnJvd0NvbnRyb2wsIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIFJlY3QgYm91bmRzUmVjdCwgVUludDE2IG9yaWVudGF0aW9uLCBVSW50MTYgc2l6ZSkgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCisgICAgeyJDcmVhdGVQbGFjYXJkQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlUGxhY2FyZENvbnRyb2wsIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIFJlY3QgYm91bmRzUmVjdCkgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCisgICAgeyJDcmVhdGVDbG9ja0NvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0NyZWF0ZUNsb2NrQ29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdywgUmVjdCBib3VuZHNSZWN0LCBVSW50MTYgY2xvY2tUeXBlLCBVSW50MzIgY2xvY2tGbGFncykgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCisgICAgeyJDcmVhdGVVc2VyUGFuZUNvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0NyZWF0ZVVzZXJQYW5lQ29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdywgUmVjdCBib3VuZHNSZWN0LCBVSW50MzIgZmVhdHVyZXMpIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAorICAgIHsiQ3JlYXRlRWRpdFRleHRDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVFZGl0VGV4dENvbnRyb2wsIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIFJlY3QgYm91bmRzUmVjdCwgQ0ZTdHJpbmdSZWYgdGV4dCwgQm9vbGVhbiBpc1Bhc3N3b3JkLCBCb29sZWFuIHVzZUlubGluZUlucHV0LCBDb250cm9sRm9udFN0eWxlUmVjIHN0eWxlKSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKKyAgICB7IkNyZWF0ZVN0YXRpY1RleHRDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVTdGF0aWNUZXh0Q29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdywgUmVjdCBib3VuZHNSZWN0LCBDRlN0cmluZ1JlZiB0ZXh0LCBDb250cm9sRm9udFN0eWxlUmVjIHN0eWxlKSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKKyAgICB7IkNyZWF0ZVBpY3R1cmVDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVQaWN0dXJlQ29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdywgUmVjdCBib3VuZHNSZWN0LCBDb250cm9sQnV0dG9uQ29udGVudEluZm8gY29udGVudCwgQm9vbGVhbiBkb250VHJhY2spIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAorICAgIHsiQ3JlYXRlSWNvbkNvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0NyZWF0ZUljb25Db250cm9sLCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgaW5XaW5kb3csIFJlY3QgaW5Cb3VuZHNSZWN0LCBDb250cm9sQnV0dG9uQ29udGVudEluZm8gaW5JY29uQ29udGVudCwgQm9vbGVhbiBpbkRvbnRUcmFjaykgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCisgICAgeyJDcmVhdGVXaW5kb3dIZWFkZXJDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVXaW5kb3dIZWFkZXJDb250cm9sLCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgd2luZG93LCBSZWN0IGJvdW5kc1JlY3QsIEJvb2xlYW4gaXNMaXN0SGVhZGVyKSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKKyAgICB7IkNyZWF0ZVB1c2hCdXR0b25Db250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVQdXNoQnV0dG9uQ29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdywgUmVjdCBib3VuZHNSZWN0LCBDRlN0cmluZ1JlZiB0aXRsZSkgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCisgICAgeyJDcmVhdGVQdXNoQnV0dG9uV2l0aEljb25Db250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVQdXNoQnV0dG9uV2l0aEljb25Db250cm9sLCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgd2luZG93LCBSZWN0IGJvdW5kc1JlY3QsIENGU3RyaW5nUmVmIHRpdGxlLCBDb250cm9sQnV0dG9uQ29udGVudEluZm8gaWNvbiwgVUludDE2IGljb25BbGlnbm1lbnQpIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAorICAgIHsiQ3JlYXRlUmFkaW9CdXR0b25Db250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVSYWRpb0J1dHRvbkNvbnRyb2wsIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIFJlY3QgYm91bmRzUmVjdCwgQ0ZTdHJpbmdSZWYgdGl0bGUsIFNJbnQzMiBpbml0aWFsVmFsdWUsIEJvb2xlYW4gYXV0b1RvZ2dsZSkgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCisgICAgeyJDcmVhdGVDaGVja0JveENvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0NyZWF0ZUNoZWNrQm94Q29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdywgUmVjdCBib3VuZHNSZWN0LCBDRlN0cmluZ1JlZiB0aXRsZSwgU0ludDMyIGluaXRpYWxWYWx1ZSwgQm9vbGVhbiBhdXRvVG9nZ2xlKSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKKyAgICB7IkNyZWF0ZVNjcm9sbEJhckNvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0NyZWF0ZVNjcm9sbEJhckNvbnRyb2wsIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIFJlY3QgYm91bmRzUmVjdCwgU0ludDMyIHZhbHVlLCBTSW50MzIgbWluaW11bSwgU0ludDMyIG1heGltdW0sIFNJbnQzMiB2aWV3U2l6ZSwgQm9vbGVhbiBsaXZlVHJhY2tpbmcsIFB5T2JqZWN0KiBsaXZlVHJhY2tpbmdQcm9jKSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKKyAgICB7IkNyZWF0ZVBvcHVwQnV0dG9uQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlUG9wdXBCdXR0b25Db250cm9sLCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgd2luZG93LCBSZWN0IGJvdW5kc1JlY3QsIENGU3RyaW5nUmVmIHRpdGxlLCBTSW50MTYgbWVudUlELCBCb29sZWFuIHZhcmlhYmxlV2lkdGgsIFNJbnQxNiB0aXRsZVdpZHRoLCBTSW50MTYgdGl0bGVKdXN0aWZpY2F0aW9uLCBTdHlsZSB0aXRsZVN0eWxlKSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKKyAgICB7IkNyZWF0ZVJhZGlvR3JvdXBDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVSYWRpb0dyb3VwQ29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdywgUmVjdCBib3VuZHNSZWN0KSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKKyAgICB7IkNyZWF0ZVNjcm9sbGluZ1RleHRCb3hDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVTY3JvbGxpbmdUZXh0Qm94Q29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdywgUmVjdCBib3VuZHNSZWN0LCBTSW50MTYgY29udGVudFJlc0lELCBCb29sZWFuIGF1dG9TY3JvbGwsIFVJbnQzMiBkZWxheUJlZm9yZUF1dG9TY3JvbGwsIFVJbnQzMiBkZWxheUJldHdlZW5BdXRvU2Nyb2xsLCBVSW50MTYgYXV0b1Njcm9sbEFtb3VudCkgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCisgICAgeyJDcmVhdGVEaXNjbG9zdXJlQnV0dG9uQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlRGlzY2xvc3VyZUJ1dHRvbkNvbnRyb2wsIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBpbldpbmRvdywgUmVjdCBpbkJvdW5kc1JlY3QsIFNJbnQzMiBpblZhbHVlLCBCb29sZWFuIGluQXV0b1RvZ2dsZXMpIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAorICAgIHsiQ3JlYXRlUm91bmRCdXR0b25Db250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVSb3VuZEJ1dHRvbkNvbnRyb2wsIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBpbldpbmRvdywgUmVjdCBpbkJvdW5kc1JlY3QsIFNJbnQxNiBpblNpemUsIENvbnRyb2xCdXR0b25Db250ZW50SW5mbyBpbkNvbnRlbnQpIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAorICAgIHsiQ3JlYXRlRGF0YUJyb3dzZXJDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVEYXRhQnJvd3NlckNvbnRyb2wsIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIFJlY3QgYm91bmRzUmVjdCwgT1NUeXBlIHN0eWxlKSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKKyAgICB7IkNyZWF0ZUVkaXRVbmljb2RlVGV4dENvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0NyZWF0ZUVkaXRVbmljb2RlVGV4dENvbnRyb2wsIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIFJlY3QgYm91bmRzUmVjdCwgQ0ZTdHJpbmdSZWYgdGV4dCwgQm9vbGVhbiBpc1Bhc3N3b3JkLCBDb250cm9sRm9udFN0eWxlUmVjIHN0eWxlKSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKKyAgICB7IkZpbmRDb250cm9sVW5kZXJNb3VzZSIsIChQeUNGdW5jdGlvbilDdGxfRmluZENvbnRyb2xVbmRlck1vdXNlLCAxLAorICAgICBQeURvY19TVFIoIihQb2ludCBpbldoZXJlLCBXaW5kb3dQdHIgaW5XaW5kb3cpIC0+IChDb250cm9sSGFuZGxlIF9ydiwgU0ludDE2IG91dFBhcnQpIil9LAorICAgIHsiYXNfQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfYXNfQ29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSGFuZGxlIGgpIC0+IChDb250cm9sSGFuZGxlIF9ydikiKX0sCisgICAgeyJDcmVhdGVUYWJzQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlVGFic0NvbnRyb2wsIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIFJlY3QgYm91bmRzUmVjdCwgVUludDE2IHNpemUsIFVJbnQxNiBkaXJlY3Rpb24sIENvbnRyb2xUYWJFbnRyeSB0YWJBcnJheSkgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAKQEAgLTU1MzEsMjgzICs1NTMxLDI4MyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIEN0bE9ial9OZXdVbm1hbmFnZWQoQ29udHJvbEhhbmRsZSBpdHNlbGYpCiB7Ci0gICAgICAgIENvbnRyb2xPYmplY3QgKml0OwotICAgICAgICBpZiAoaXRzZWxmID09IE5VTEwpIHJldHVybiBQeU1hY19FcnJvcihyZXNOb3RGb3VuZCk7Ci0gICAgICAgIGl0ID0gUHlPYmplY3RfTkVXKENvbnRyb2xPYmplY3QsICZDb250cm9sX1R5cGUpOwotICAgICAgICBpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0gICAgICAgIGl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0gICAgICAgIGl0LT5vYl9jYWxsYmFja2RpY3QgPSBOVUxMOwotICAgICAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgQ29udHJvbE9iamVjdCAqaXQ7CisgICAgaWYgKGl0c2VsZiA9PSBOVUxMKSByZXR1cm4gUHlNYWNfRXJyb3IocmVzTm90Rm91bmQpOworICAgIGl0ID0gUHlPYmplY3RfTkVXKENvbnRyb2xPYmplY3QsICZDb250cm9sX1R5cGUpOworICAgIGlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICBpdC0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIGl0LT5vYl9jYWxsYmFja2RpY3QgPSBOVUxMOworICAgIHJldHVybiAoUHlPYmplY3QgKilpdDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIEN0bE9ial9XaGljaENvbnRyb2woQ29udHJvbEhhbmRsZSBjKQogewotICAgICAgICBQeU9iamVjdCAqaXQ7CisgICAgUHlPYmplY3QgKml0OwogCi0gICAgICAgIGlmIChjID09IE5VTEwpCi0gICAgICAgICAgICAgICAgaXQgPSBQeV9Ob25lOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBpdCA9IChQeU9iamVjdCAqKSBHZXRDb250cm9sUmVmZXJlbmNlKGMpOwotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgKiogSWYgdGhlIHJlZmNvbiBpcyB6ZXJvIG9yIGRvZXNuJ3QgcG9pbnQgYmFjayB0byB0aGUgUHl0aG9uIG9iamVjdAotICAgICAgICAgICAgICAgICoqIHRoZSBjb250cm9sIGlzIG5vdCBvdXJzLiBSZXR1cm4gYSB0ZW1wb3Jhcnkgb2JqZWN0LgotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgaWYgKGl0ID09IE5VTEwgfHwgKChDb250cm9sT2JqZWN0ICopaXQpLT5vYl9pdHNlbGYgIT0gYykKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBDdGxPYmpfTmV3VW5tYW5hZ2VkKGMpOwotICAgICAgICB9Ci0gICAgICAgIFB5X0lOQ1JFRihpdCk7Ci0gICAgICAgIHJldHVybiBpdDsKKyAgICBpZiAoYyA9PSBOVUxMKQorICAgICAgICBpdCA9IFB5X05vbmU7CisgICAgZWxzZSB7CisgICAgICAgIGl0ID0gKFB5T2JqZWN0ICopIEdldENvbnRyb2xSZWZlcmVuY2UoYyk7CisgICAgICAgIC8qCisgICAgICAgICoqIElmIHRoZSByZWZjb24gaXMgemVybyBvciBkb2Vzbid0IHBvaW50IGJhY2sgdG8gdGhlIFB5dGhvbiBvYmplY3QKKyAgICAgICAgKiogdGhlIGNvbnRyb2wgaXMgbm90IG91cnMuIFJldHVybiBhIHRlbXBvcmFyeSBvYmplY3QuCisgICAgICAgICovCisgICAgICAgIGlmIChpdCA9PSBOVUxMIHx8ICgoQ29udHJvbE9iamVjdCAqKWl0KS0+b2JfaXRzZWxmICE9IGMpCisgICAgICAgICAgICByZXR1cm4gQ3RsT2JqX05ld1VubWFuYWdlZChjKTsKKyAgICB9CisgICAgUHlfSU5DUkVGKGl0KTsKKyAgICByZXR1cm4gaXQ7CiB9CiAKIHN0YXRpYyBpbnQKIHNldHRyYWNrZnVuYyhQeU9iamVjdCAqb2JqKQogewotICAgICAgICBpZiAodHJhY2tlcikgewotICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhDdGxfRXJyb3IsICJUcmFja2VyIGZ1bmN0aW9uIGluIHVzZSIpOwotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIHRyYWNrZXIgPSBvYmo7Ci0gICAgICAgIFB5X0lOQ1JFRih0cmFja2VyKTsKLSAgICAgICAgcmV0dXJuIDE7CisgICAgaWYgKHRyYWNrZXIpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEN0bF9FcnJvciwgIlRyYWNrZXIgZnVuY3Rpb24gaW4gdXNlIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICB0cmFja2VyID0gb2JqOworICAgIFB5X0lOQ1JFRih0cmFja2VyKTsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIHZvaWQKIGNscnRyYWNrZnVuYyh2b2lkKQogewotICAgICAgICBQeV9YREVDUkVGKHRyYWNrZXIpOwotICAgICAgICB0cmFja2VyID0gMDsKKyAgICBQeV9YREVDUkVGKHRyYWNrZXIpOworICAgIHRyYWNrZXIgPSAwOwogfQogCiBzdGF0aWMgcGFzY2FsIHZvaWQKIG15dHJhY2tlcihDb250cm9sSGFuZGxlIGN0bCwgc2hvcnQgcGFydCkKIHsKLSAgICAgICAgUHlPYmplY3QgKmFyZ3MsICpydj0wOworICAgIFB5T2JqZWN0ICphcmdzLCAqcnY9MDsKIAotICAgICAgICBhcmdzID0gUHlfQnVpbGRWYWx1ZSgiKE8maSkiLCBDdGxPYmpfV2hpY2hDb250cm9sLCBjdGwsIChpbnQpcGFydCk7Ci0gICAgICAgIGlmIChhcmdzICYmIHRyYWNrZXIpIHsKLSAgICAgICAgICAgICAgICBydiA9IFB5RXZhbF9DYWxsT2JqZWN0KHRyYWNrZXIsIGFyZ3MpOwotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihhcmdzKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocnYpCi0gICAgICAgICAgICAgICAgUHlfREVDUkVGKHJ2KTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoIlRyYWNrQ29udHJvbCBvciBIYW5kbGVDb250cm9sQ2xpY2s6IGV4Y2VwdGlvbiBpbiB0cmFja2VyIGZ1bmN0aW9uXG4iKTsKLSAgICAgICAgICAgICAgICBQeUVycl9QcmludCgpOwotICAgICAgICB9CisgICAgYXJncyA9IFB5X0J1aWxkVmFsdWUoIihPJmkpIiwgQ3RsT2JqX1doaWNoQ29udHJvbCwgY3RsLCAoaW50KXBhcnQpOworICAgIGlmIChhcmdzICYmIHRyYWNrZXIpIHsKKyAgICAgICAgcnYgPSBQeUV2YWxfQ2FsbE9iamVjdCh0cmFja2VyLCBhcmdzKTsKKyAgICAgICAgUHlfREVDUkVGKGFyZ3MpOworICAgIH0KKyAgICBpZiAocnYpCisgICAgICAgIFB5X0RFQ1JFRihydik7CisgICAgZWxzZSB7CisgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCJUcmFja0NvbnRyb2wgb3IgSGFuZGxlQ29udHJvbENsaWNrOiBleGNlcHRpb24gaW4gdHJhY2tlciBmdW5jdGlvblxuIik7CisgICAgICAgIFB5RXJyX1ByaW50KCk7CisgICAgfQogfQogCiBzdGF0aWMgaW50CiBzZXRjYWxsYmFjayhQeU9iamVjdCAqbXlzZWxmLCBPU1R5cGUgd2hpY2gsIFB5T2JqZWN0ICpjYWxsYmFjaywgVW5pdmVyc2FsUHJvY1B0ciAqdXBwcCkKIHsKLSAgICAgICAgQ29udHJvbE9iamVjdCAqc2VsZiA9IChDb250cm9sT2JqZWN0ICopbXlzZWxmOwotICAgICAgICBjaGFyIGtleWJ1Zls5XTsKKyAgICBDb250cm9sT2JqZWN0ICpzZWxmID0gKENvbnRyb2xPYmplY3QgKilteXNlbGY7CisgICAgY2hhciBrZXlidWZbOV07CiAKLSAgICAgICAgaWYgKCB3aGljaCA9PSBrTXlDb250cm9sQWN0aW9uUHJvY1RhZyApCi0gICAgICAgICAgICAgICAgKnVwcHAgPSAoVW5pdmVyc2FsUHJvY1B0cilteWFjdGlvbnByb2NfdXBwOwotICAgICAgICBlbHNlIGlmICggd2hpY2ggPT0ga0NvbnRyb2xVc2VyUGFuZUtleURvd25Qcm9jVGFnICkKLSAgICAgICAgICAgICAgICAqdXBwcCA9IChVbml2ZXJzYWxQcm9jUHRyKW15a2V5ZG93bnByb2NfdXBwOwotICAgICAgICBlbHNlIGlmICggd2hpY2ggPT0ga0NvbnRyb2xVc2VyUGFuZUZvY3VzUHJvY1RhZyApCi0gICAgICAgICAgICAgICAgKnVwcHAgPSAoVW5pdmVyc2FsUHJvY1B0cilteWZvY3VzcHJvY191cHA7Ci0gICAgICAgIGVsc2UgaWYgKCB3aGljaCA9PSBrQ29udHJvbFVzZXJQYW5lRHJhd1Byb2NUYWcgKQotICAgICAgICAgICAgICAgICp1cHBwID0gKFVuaXZlcnNhbFByb2NQdHIpbXlkcmF3cHJvY191cHA7Ci0gICAgICAgIGVsc2UgaWYgKCB3aGljaCA9PSBrQ29udHJvbFVzZXJQYW5lSWRsZVByb2NUYWcgKQotICAgICAgICAgICAgICAgICp1cHBwID0gKFVuaXZlcnNhbFByb2NQdHIpbXlpZGxlcHJvY191cHA7Ci0gICAgICAgIGVsc2UgaWYgKCB3aGljaCA9PSBrQ29udHJvbFVzZXJQYW5lSGl0VGVzdFByb2NUYWcgKQotICAgICAgICAgICAgICAgICp1cHBwID0gKFVuaXZlcnNhbFByb2NQdHIpbXloaXR0ZXN0cHJvY191cHA7Ci0gICAgICAgIGVsc2UgaWYgKCB3aGljaCA9PSBrQ29udHJvbFVzZXJQYW5lVHJhY2tpbmdQcm9jVGFnICkKLSAgICAgICAgICAgICAgICAqdXBwcCA9IChVbml2ZXJzYWxQcm9jUHRyKW15dHJhY2tpbmdwcm9jX3VwcDsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgLyogT25seSBub3cgZG8gd2UgdGVzdCBmb3IgY2xlYXJpbmcgb2YgdGhlIGNhbGxiYWNrOiAqLwotICAgICAgICBpZiAoIGNhbGxiYWNrID09IFB5X05vbmUgKQotICAgICAgICAgICAgICAgICp1cHBwID0gTlVMTDsKLSAgICAgICAgLyogQ3JlYXRlIHRoZSBkaWN0IGlmIGl0IGRvZXNuJ3QgZXhpc3QgeWV0IChzbyB3ZSBkb24ndCBnZXQgc3VjaCBhIGRpY3QgZm9yIGV2ZXJ5IGNvbnRyb2wpICovCi0gICAgICAgIGlmICggc2VsZi0+b2JfY2FsbGJhY2tkaWN0ID09IE5VTEwgKQotICAgICAgICAgICAgICAgIGlmICggKHNlbGYtPm9iX2NhbGxiYWNrZGljdCA9IFB5RGljdF9OZXcoKSkgPT0gTlVMTCApCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIC8qIEFuZCBzdG9yZSB0aGUgUHl0aG9uIGNhbGxiYWNrICovCi0gICAgICAgIHNwcmludGYoa2V5YnVmLCAiJXgiLCAodW5zaWduZWQpd2hpY2gpOwotICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoc2VsZi0+b2JfY2FsbGJhY2tkaWN0LCBrZXlidWYsIGNhbGxiYWNrKSA8IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoIHdoaWNoID09IGtNeUNvbnRyb2xBY3Rpb25Qcm9jVGFnICkKKyAgICAgICAgKnVwcHAgPSAoVW5pdmVyc2FsUHJvY1B0cilteWFjdGlvbnByb2NfdXBwOworICAgIGVsc2UgaWYgKCB3aGljaCA9PSBrQ29udHJvbFVzZXJQYW5lS2V5RG93blByb2NUYWcgKQorICAgICAgICAqdXBwcCA9IChVbml2ZXJzYWxQcm9jUHRyKW15a2V5ZG93bnByb2NfdXBwOworICAgIGVsc2UgaWYgKCB3aGljaCA9PSBrQ29udHJvbFVzZXJQYW5lRm9jdXNQcm9jVGFnICkKKyAgICAgICAgKnVwcHAgPSAoVW5pdmVyc2FsUHJvY1B0cilteWZvY3VzcHJvY191cHA7CisgICAgZWxzZSBpZiAoIHdoaWNoID09IGtDb250cm9sVXNlclBhbmVEcmF3UHJvY1RhZyApCisgICAgICAgICp1cHBwID0gKFVuaXZlcnNhbFByb2NQdHIpbXlkcmF3cHJvY191cHA7CisgICAgZWxzZSBpZiAoIHdoaWNoID09IGtDb250cm9sVXNlclBhbmVJZGxlUHJvY1RhZyApCisgICAgICAgICp1cHBwID0gKFVuaXZlcnNhbFByb2NQdHIpbXlpZGxlcHJvY191cHA7CisgICAgZWxzZSBpZiAoIHdoaWNoID09IGtDb250cm9sVXNlclBhbmVIaXRUZXN0UHJvY1RhZyApCisgICAgICAgICp1cHBwID0gKFVuaXZlcnNhbFByb2NQdHIpbXloaXR0ZXN0cHJvY191cHA7CisgICAgZWxzZSBpZiAoIHdoaWNoID09IGtDb250cm9sVXNlclBhbmVUcmFja2luZ1Byb2NUYWcgKQorICAgICAgICAqdXBwcCA9IChVbml2ZXJzYWxQcm9jUHRyKW15dHJhY2tpbmdwcm9jX3VwcDsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiAtMTsKKyAgICAvKiBPbmx5IG5vdyBkbyB3ZSB0ZXN0IGZvciBjbGVhcmluZyBvZiB0aGUgY2FsbGJhY2s6ICovCisgICAgaWYgKCBjYWxsYmFjayA9PSBQeV9Ob25lICkKKyAgICAgICAgKnVwcHAgPSBOVUxMOworICAgIC8qIENyZWF0ZSB0aGUgZGljdCBpZiBpdCBkb2Vzbid0IGV4aXN0IHlldCAoc28gd2UgZG9uJ3QgZ2V0IHN1Y2ggYSBkaWN0IGZvciBldmVyeSBjb250cm9sKSAqLworICAgIGlmICggc2VsZi0+b2JfY2FsbGJhY2tkaWN0ID09IE5VTEwgKQorICAgICAgICBpZiAoIChzZWxmLT5vYl9jYWxsYmFja2RpY3QgPSBQeURpY3RfTmV3KCkpID09IE5VTEwgKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIC8qIEFuZCBzdG9yZSB0aGUgUHl0aG9uIGNhbGxiYWNrICovCisgICAgc3ByaW50ZihrZXlidWYsICIleCIsICh1bnNpZ25lZCl3aGljaCk7CisgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKHNlbGYtPm9iX2NhbGxiYWNrZGljdCwga2V5YnVmLCBjYWxsYmFjaykgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjYWxsY2FsbGJhY2soQ29udHJvbE9iamVjdCAqc2VsZiwgT1NUeXBlIHdoaWNoLCBQeU9iamVjdCAqYXJnbGlzdCkKIHsKLSAgICAgICAgY2hhciBrZXlidWZbOV07Ci0gICAgICAgIFB5T2JqZWN0ICpmdW5jLCAqcnY7CisgICAgY2hhciBrZXlidWZbOV07CisgICAgUHlPYmplY3QgKmZ1bmMsICpydjsKIAotICAgICAgICBzcHJpbnRmKGtleWJ1ZiwgIiV4IiwgKHVuc2lnbmVkKXdoaWNoKTsKLSAgICAgICAgaWYgKCBzZWxmLT5vYl9jYWxsYmFja2RpY3QgPT0gTlVMTCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgKGZ1bmMgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhzZWxmLT5vYl9jYWxsYmFja2RpY3QsIGtleWJ1ZikpID09IE5VTEwgKSB7Ci0gICAgICAgICAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoIkNvbnRyb2wgY2FsbGJhY2sgJXggd2l0aG91dCBjYWxsYmFjayBvYmplY3RcbiIsICh1bnNpZ25lZCl3aGljaCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgcnYgPSBQeUV2YWxfQ2FsbE9iamVjdChmdW5jLCBhcmdsaXN0KTsKLSAgICAgICAgaWYgKCBydiA9PSBOVUxMICkgewotICAgICAgICAgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCJFeGNlcHRpb24gaW4gY29udHJvbCBjYWxsYmFjayAleCBoYW5kbGVyXG4iLCAodW5zaWduZWQpd2hpY2gpOwotICAgICAgICAgICAgICAgIFB5RXJyX1ByaW50KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJ2OworICAgIHNwcmludGYoa2V5YnVmLCAiJXgiLCAodW5zaWduZWQpd2hpY2gpOworICAgIGlmICggc2VsZi0+b2JfY2FsbGJhY2tkaWN0ID09IE5VTEwgfHwKKyAgICAgICAgICAgICAgICAgICAgKGZ1bmMgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhzZWxmLT5vYl9jYWxsYmFja2RpY3QsIGtleWJ1ZikpID09IE5VTEwgKSB7CisgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCJDb250cm9sIGNhbGxiYWNrICV4IHdpdGhvdXQgY2FsbGJhY2sgb2JqZWN0XG4iLCAodW5zaWduZWQpd2hpY2gpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcnYgPSBQeUV2YWxfQ2FsbE9iamVjdChmdW5jLCBhcmdsaXN0KTsKKyAgICBpZiAoIHJ2ID09IE5VTEwgKSB7CisgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCJFeGNlcHRpb24gaW4gY29udHJvbCBjYWxsYmFjayAleCBoYW5kbGVyXG4iLCAodW5zaWduZWQpd2hpY2gpOworICAgICAgICBQeUVycl9QcmludCgpOworICAgIH0KKyAgICByZXR1cm4gcnY7CiB9CiAKIHN0YXRpYyBwYXNjYWwgdm9pZAogbXlhY3Rpb25wcm9jKENvbnRyb2xIYW5kbGUgY29udHJvbCwgU0ludDE2IHBhcnQpCiB7Ci0gICAgICAgIENvbnRyb2xPYmplY3QgKmN0bF9vYmo7Ci0gICAgICAgIFB5T2JqZWN0ICphcmdsaXN0LCAqcnY7CisgICAgQ29udHJvbE9iamVjdCAqY3RsX29iajsKKyAgICBQeU9iamVjdCAqYXJnbGlzdCwgKnJ2OwogCi0gICAgICAgIGN0bF9vYmogPSAoQ29udHJvbE9iamVjdCAqKUN0bE9ial9XaGljaENvbnRyb2woY29udHJvbCk7Ci0gICAgICAgIGFyZ2xpc3QgPSBQeV9CdWlsZFZhbHVlKCJPaCIsIGN0bF9vYmosIHBhcnQpOwotICAgICAgICBydiA9IGNhbGxjYWxsYmFjayhjdGxfb2JqLCBrTXlDb250cm9sQWN0aW9uUHJvY1RhZywgYXJnbGlzdCk7Ci0gICAgICAgIFB5X1hERUNSRUYoYXJnbGlzdCk7Ci0gICAgICAgIFB5X1hERUNSRUYocnYpOworICAgIGN0bF9vYmogPSAoQ29udHJvbE9iamVjdCAqKUN0bE9ial9XaGljaENvbnRyb2woY29udHJvbCk7CisgICAgYXJnbGlzdCA9IFB5X0J1aWxkVmFsdWUoIk9oIiwgY3RsX29iaiwgcGFydCk7CisgICAgcnYgPSBjYWxsY2FsbGJhY2soY3RsX29iaiwga015Q29udHJvbEFjdGlvblByb2NUYWcsIGFyZ2xpc3QpOworICAgIFB5X1hERUNSRUYoYXJnbGlzdCk7CisgICAgUHlfWERFQ1JFRihydik7CiB9CiAKIHN0YXRpYyBwYXNjYWwgQ29udHJvbFBhcnRDb2RlCiBteWtleWRvd25wcm9jKENvbnRyb2xIYW5kbGUgY29udHJvbCwgU0ludDE2IGtleUNvZGUsIFNJbnQxNiBjaGFyQ29kZSwgU0ludDE2IG1vZGlmaWVycykKIHsKLSAgICAgICAgQ29udHJvbE9iamVjdCAqY3RsX29iajsKLSAgICAgICAgUHlPYmplY3QgKmFyZ2xpc3QsICpydjsKLSAgICAgICAgc2hvcnQgY19ydiA9IDA7CisgICAgQ29udHJvbE9iamVjdCAqY3RsX29iajsKKyAgICBQeU9iamVjdCAqYXJnbGlzdCwgKnJ2OworICAgIHNob3J0IGNfcnYgPSAwOwogCi0gICAgICAgIGN0bF9vYmogPSAoQ29udHJvbE9iamVjdCAqKUN0bE9ial9XaGljaENvbnRyb2woY29udHJvbCk7Ci0gICAgICAgIGFyZ2xpc3QgPSBQeV9CdWlsZFZhbHVlKCJPaGhoIiwgY3RsX29iaiwga2V5Q29kZSwgY2hhckNvZGUsIG1vZGlmaWVycyk7Ci0gICAgICAgIHJ2ID0gY2FsbGNhbGxiYWNrKGN0bF9vYmosIGtDb250cm9sVXNlclBhbmVLZXlEb3duUHJvY1RhZywgYXJnbGlzdCk7Ci0gICAgICAgIFB5X1hERUNSRUYoYXJnbGlzdCk7Ci0gICAgICAgIGlmICggcnYgKQotICAgICAgICAgICAgICAgIGlmICghUHlBcmdfUGFyc2UocnYsICJoIiwgJmNfcnYpKQotICAgICAgICAgICAgICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKLSAgICAgICAgUHlfWERFQ1JFRihydik7Ci0gICAgICAgIHJldHVybiAoQ29udHJvbFBhcnRDb2RlKWNfcnY7CisgICAgY3RsX29iaiA9IChDb250cm9sT2JqZWN0ICopQ3RsT2JqX1doaWNoQ29udHJvbChjb250cm9sKTsKKyAgICBhcmdsaXN0ID0gUHlfQnVpbGRWYWx1ZSgiT2hoaCIsIGN0bF9vYmosIGtleUNvZGUsIGNoYXJDb2RlLCBtb2RpZmllcnMpOworICAgIHJ2ID0gY2FsbGNhbGxiYWNrKGN0bF9vYmosIGtDb250cm9sVXNlclBhbmVLZXlEb3duUHJvY1RhZywgYXJnbGlzdCk7CisgICAgUHlfWERFQ1JFRihhcmdsaXN0KTsKKyAgICBpZiAoIHJ2ICkKKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZShydiwgImgiLCAmY19ydikpCisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgIFB5X1hERUNSRUYocnYpOworICAgIHJldHVybiAoQ29udHJvbFBhcnRDb2RlKWNfcnY7CiB9CiAKIHN0YXRpYyBwYXNjYWwgQ29udHJvbFBhcnRDb2RlCiBteWZvY3VzcHJvYyhDb250cm9sSGFuZGxlIGNvbnRyb2wsIENvbnRyb2xQYXJ0Q29kZSBwYXJ0KQogewotICAgICAgICBDb250cm9sT2JqZWN0ICpjdGxfb2JqOwotICAgICAgICBQeU9iamVjdCAqYXJnbGlzdCwgKnJ2OwotICAgICAgICBzaG9ydCBjX3J2ID0ga0NvbnRyb2xGb2N1c05vUGFydDsKKyAgICBDb250cm9sT2JqZWN0ICpjdGxfb2JqOworICAgIFB5T2JqZWN0ICphcmdsaXN0LCAqcnY7CisgICAgc2hvcnQgY19ydiA9IGtDb250cm9sRm9jdXNOb1BhcnQ7CiAKLSAgICAgICAgY3RsX29iaiA9IChDb250cm9sT2JqZWN0ICopQ3RsT2JqX1doaWNoQ29udHJvbChjb250cm9sKTsKLSAgICAgICAgYXJnbGlzdCA9IFB5X0J1aWxkVmFsdWUoIk9oIiwgY3RsX29iaiwgcGFydCk7Ci0gICAgICAgIHJ2ID0gY2FsbGNhbGxiYWNrKGN0bF9vYmosIGtDb250cm9sVXNlclBhbmVGb2N1c1Byb2NUYWcsIGFyZ2xpc3QpOwotICAgICAgICBQeV9YREVDUkVGKGFyZ2xpc3QpOwotICAgICAgICBpZiAoIHJ2ICkKLSAgICAgICAgICAgICAgICBpZiAoIVB5QXJnX1BhcnNlKHJ2LCAiaCIsICZjX3J2KSkKLSAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7Ci0gICAgICAgIFB5X1hERUNSRUYocnYpOwotICAgICAgICByZXR1cm4gKENvbnRyb2xQYXJ0Q29kZSljX3J2OworICAgIGN0bF9vYmogPSAoQ29udHJvbE9iamVjdCAqKUN0bE9ial9XaGljaENvbnRyb2woY29udHJvbCk7CisgICAgYXJnbGlzdCA9IFB5X0J1aWxkVmFsdWUoIk9oIiwgY3RsX29iaiwgcGFydCk7CisgICAgcnYgPSBjYWxsY2FsbGJhY2soY3RsX29iaiwga0NvbnRyb2xVc2VyUGFuZUZvY3VzUHJvY1RhZywgYXJnbGlzdCk7CisgICAgUHlfWERFQ1JFRihhcmdsaXN0KTsKKyAgICBpZiAoIHJ2ICkKKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZShydiwgImgiLCAmY19ydikpCisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgIFB5X1hERUNSRUYocnYpOworICAgIHJldHVybiAoQ29udHJvbFBhcnRDb2RlKWNfcnY7CiB9CiAKIHN0YXRpYyBwYXNjYWwgdm9pZAogbXlkcmF3cHJvYyhDb250cm9sSGFuZGxlIGNvbnRyb2wsIFNJbnQxNiBwYXJ0KQogewotICAgICAgICBDb250cm9sT2JqZWN0ICpjdGxfb2JqOwotICAgICAgICBQeU9iamVjdCAqYXJnbGlzdCwgKnJ2OworICAgIENvbnRyb2xPYmplY3QgKmN0bF9vYmo7CisgICAgUHlPYmplY3QgKmFyZ2xpc3QsICpydjsKIAotICAgICAgICBjdGxfb2JqID0gKENvbnRyb2xPYmplY3QgKilDdGxPYmpfV2hpY2hDb250cm9sKGNvbnRyb2wpOwotICAgICAgICBhcmdsaXN0ID0gUHlfQnVpbGRWYWx1ZSgiT2giLCBjdGxfb2JqLCBwYXJ0KTsKLSAgICAgICAgcnYgPSBjYWxsY2FsbGJhY2soY3RsX29iaiwga0NvbnRyb2xVc2VyUGFuZURyYXdQcm9jVGFnLCBhcmdsaXN0KTsKLSAgICAgICAgUHlfWERFQ1JFRihhcmdsaXN0KTsKLSAgICAgICAgUHlfWERFQ1JFRihydik7CisgICAgY3RsX29iaiA9IChDb250cm9sT2JqZWN0ICopQ3RsT2JqX1doaWNoQ29udHJvbChjb250cm9sKTsKKyAgICBhcmdsaXN0ID0gUHlfQnVpbGRWYWx1ZSgiT2giLCBjdGxfb2JqLCBwYXJ0KTsKKyAgICBydiA9IGNhbGxjYWxsYmFjayhjdGxfb2JqLCBrQ29udHJvbFVzZXJQYW5lRHJhd1Byb2NUYWcsIGFyZ2xpc3QpOworICAgIFB5X1hERUNSRUYoYXJnbGlzdCk7CisgICAgUHlfWERFQ1JFRihydik7CiB9CiAKIHN0YXRpYyBwYXNjYWwgdm9pZAogbXlpZGxlcHJvYyhDb250cm9sSGFuZGxlIGNvbnRyb2wpCiB7Ci0gICAgICAgIENvbnRyb2xPYmplY3QgKmN0bF9vYmo7Ci0gICAgICAgIFB5T2JqZWN0ICphcmdsaXN0LCAqcnY7CisgICAgQ29udHJvbE9iamVjdCAqY3RsX29iajsKKyAgICBQeU9iamVjdCAqYXJnbGlzdCwgKnJ2OwogCi0gICAgICAgIGN0bF9vYmogPSAoQ29udHJvbE9iamVjdCAqKUN0bE9ial9XaGljaENvbnRyb2woY29udHJvbCk7Ci0gICAgICAgIGFyZ2xpc3QgPSBQeV9CdWlsZFZhbHVlKCJPIiwgY3RsX29iaik7Ci0gICAgICAgIHJ2ID0gY2FsbGNhbGxiYWNrKGN0bF9vYmosIGtDb250cm9sVXNlclBhbmVJZGxlUHJvY1RhZywgYXJnbGlzdCk7Ci0gICAgICAgIFB5X1hERUNSRUYoYXJnbGlzdCk7Ci0gICAgICAgIFB5X1hERUNSRUYocnYpOworICAgIGN0bF9vYmogPSAoQ29udHJvbE9iamVjdCAqKUN0bE9ial9XaGljaENvbnRyb2woY29udHJvbCk7CisgICAgYXJnbGlzdCA9IFB5X0J1aWxkVmFsdWUoIk8iLCBjdGxfb2JqKTsKKyAgICBydiA9IGNhbGxjYWxsYmFjayhjdGxfb2JqLCBrQ29udHJvbFVzZXJQYW5lSWRsZVByb2NUYWcsIGFyZ2xpc3QpOworICAgIFB5X1hERUNSRUYoYXJnbGlzdCk7CisgICAgUHlfWERFQ1JFRihydik7CiB9CiAKIHN0YXRpYyBwYXNjYWwgQ29udHJvbFBhcnRDb2RlCiBteWhpdHRlc3Rwcm9jKENvbnRyb2xIYW5kbGUgY29udHJvbCwgUG9pbnQgd2hlcmUpCiB7Ci0gICAgICAgIENvbnRyb2xPYmplY3QgKmN0bF9vYmo7Ci0gICAgICAgIFB5T2JqZWN0ICphcmdsaXN0LCAqcnY7Ci0gICAgICAgIHNob3J0IGNfcnYgPSAtMTsKKyAgICBDb250cm9sT2JqZWN0ICpjdGxfb2JqOworICAgIFB5T2JqZWN0ICphcmdsaXN0LCAqcnY7CisgICAgc2hvcnQgY19ydiA9IC0xOwogCi0gICAgICAgIGN0bF9vYmogPSAoQ29udHJvbE9iamVjdCAqKUN0bE9ial9XaGljaENvbnRyb2woY29udHJvbCk7Ci0gICAgICAgIGFyZ2xpc3QgPSBQeV9CdWlsZFZhbHVlKCJPTyYiLCBjdGxfb2JqLCBQeU1hY19CdWlsZFBvaW50LCB3aGVyZSk7Ci0gICAgICAgIHJ2ID0gY2FsbGNhbGxiYWNrKGN0bF9vYmosIGtDb250cm9sVXNlclBhbmVIaXRUZXN0UHJvY1RhZywgYXJnbGlzdCk7Ci0gICAgICAgIFB5X1hERUNSRUYoYXJnbGlzdCk7Ci0gICAgICAgIC8qIElnbm9yZSBlcnJvcnMsIG5vdGhpbmcgd2UgY2FuIGRvIGFib3V0IHRoZW0gKi8KLSAgICAgICAgaWYgKCBydiApCi0gICAgICAgICAgICAgICAgaWYgKCFQeUFyZ19QYXJzZShydiwgImgiLCAmY19ydikpCi0gICAgICAgICAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOwotICAgICAgICBQeV9YREVDUkVGKHJ2KTsKLSAgICAgICAgcmV0dXJuIChDb250cm9sUGFydENvZGUpY19ydjsKKyAgICBjdGxfb2JqID0gKENvbnRyb2xPYmplY3QgKilDdGxPYmpfV2hpY2hDb250cm9sKGNvbnRyb2wpOworICAgIGFyZ2xpc3QgPSBQeV9CdWlsZFZhbHVlKCJPTyYiLCBjdGxfb2JqLCBQeU1hY19CdWlsZFBvaW50LCB3aGVyZSk7CisgICAgcnYgPSBjYWxsY2FsbGJhY2soY3RsX29iaiwga0NvbnRyb2xVc2VyUGFuZUhpdFRlc3RQcm9jVGFnLCBhcmdsaXN0KTsKKyAgICBQeV9YREVDUkVGKGFyZ2xpc3QpOworICAgIC8qIElnbm9yZSBlcnJvcnMsIG5vdGhpbmcgd2UgY2FuIGRvIGFib3V0IHRoZW0gKi8KKyAgICBpZiAoIHJ2ICkKKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZShydiwgImgiLCAmY19ydikpCisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgIFB5X1hERUNSRUYocnYpOworICAgIHJldHVybiAoQ29udHJvbFBhcnRDb2RlKWNfcnY7CiB9CiAKIHN0YXRpYyBwYXNjYWwgQ29udHJvbFBhcnRDb2RlCiBteXRyYWNraW5ncHJvYyhDb250cm9sSGFuZGxlIGNvbnRyb2wsIFBvaW50IHN0YXJ0UHQsIENvbnRyb2xBY3Rpb25VUFAgYWN0aW9uUHJvYykKIHsKLSAgICAgICAgQ29udHJvbE9iamVjdCAqY3RsX29iajsKLSAgICAgICAgUHlPYmplY3QgKmFyZ2xpc3QsICpydjsKLSAgICAgICAgc2hvcnQgY19ydiA9IC0xOworICAgIENvbnRyb2xPYmplY3QgKmN0bF9vYmo7CisgICAgUHlPYmplY3QgKmFyZ2xpc3QsICpydjsKKyAgICBzaG9ydCBjX3J2ID0gLTE7CiAKLSAgICAgICAgY3RsX29iaiA9IChDb250cm9sT2JqZWN0ICopQ3RsT2JqX1doaWNoQ29udHJvbChjb250cm9sKTsKLSAgICAgICAgLyogV2UgY2Fubm90IHBhc3MgdGhlIGFjdGlvblByb2Mgd2l0aG91dCBsb3RzIG9mIHdvcmsgKi8KLSAgICAgICAgYXJnbGlzdCA9IFB5X0J1aWxkVmFsdWUoIk9PJiIsIGN0bF9vYmosIFB5TWFjX0J1aWxkUG9pbnQsIHN0YXJ0UHQpOwotICAgICAgICBydiA9IGNhbGxjYWxsYmFjayhjdGxfb2JqLCBrQ29udHJvbFVzZXJQYW5lVHJhY2tpbmdQcm9jVGFnLCBhcmdsaXN0KTsKLSAgICAgICAgUHlfWERFQ1JFRihhcmdsaXN0KTsKLSAgICAgICAgaWYgKCBydiApCi0gICAgICAgICAgICAgICAgaWYgKCFQeUFyZ19QYXJzZShydiwgImgiLCAmY19ydikpCi0gICAgICAgICAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOwotICAgICAgICBQeV9YREVDUkVGKHJ2KTsKLSAgICAgICAgcmV0dXJuIChDb250cm9sUGFydENvZGUpY19ydjsKKyAgICBjdGxfb2JqID0gKENvbnRyb2xPYmplY3QgKilDdGxPYmpfV2hpY2hDb250cm9sKGNvbnRyb2wpOworICAgIC8qIFdlIGNhbm5vdCBwYXNzIHRoZSBhY3Rpb25Qcm9jIHdpdGhvdXQgbG90cyBvZiB3b3JrICovCisgICAgYXJnbGlzdCA9IFB5X0J1aWxkVmFsdWUoIk9PJiIsIGN0bF9vYmosIFB5TWFjX0J1aWxkUG9pbnQsIHN0YXJ0UHQpOworICAgIHJ2ID0gY2FsbGNhbGxiYWNrKGN0bF9vYmosIGtDb250cm9sVXNlclBhbmVUcmFja2luZ1Byb2NUYWcsIGFyZ2xpc3QpOworICAgIFB5X1hERUNSRUYoYXJnbGlzdCk7CisgICAgaWYgKCBydiApCisgICAgICAgIGlmICghUHlBcmdfUGFyc2UocnYsICJoIiwgJmNfcnYpKQorICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICBQeV9YREVDUkVGKHJ2KTsKKyAgICByZXR1cm4gKENvbnRyb2xQYXJ0Q29kZSljX3J2OwogfQogCiAjZWxzZSAvKiBfX0xQNjRfXyAqLwogCiBzdGF0aWMgUHlNZXRob2REZWYgQ3RsX21ldGhvZHNbXSA9IHsKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKICNlbmRpZiAvKiBfX0xQNjRfXyAqLwogCiB2b2lkIGluaXRfQ3RsKHZvaWQpCiB7Ci0JUHlPYmplY3QgKm07CisgICAgUHlPYmplY3QgKm07CiAKICNpZm5kZWYgX19MUDY0X18KLQlQeU9iamVjdCAqZDsKKyAgICBQeU9iamVjdCAqZDsKIAotCW15dHJhY2tlcl91cHAgPSBOZXdDb250cm9sQWN0aW9uVVBQKG15dHJhY2tlcik7Ci0JbXlhY3Rpb25wcm9jX3VwcCA9IE5ld0NvbnRyb2xBY3Rpb25VUFAobXlhY3Rpb25wcm9jKTsKLQlteWtleWRvd25wcm9jX3VwcCA9IE5ld0NvbnRyb2xVc2VyUGFuZUtleURvd25VUFAobXlrZXlkb3ducHJvYyk7Ci0JbXlmb2N1c3Byb2NfdXBwID0gTmV3Q29udHJvbFVzZXJQYW5lRm9jdXNVUFAobXlmb2N1c3Byb2MpOwotCW15ZHJhd3Byb2NfdXBwID0gTmV3Q29udHJvbFVzZXJQYW5lRHJhd1VQUChteWRyYXdwcm9jKTsKLQlteWlkbGVwcm9jX3VwcCA9IE5ld0NvbnRyb2xVc2VyUGFuZUlkbGVVUFAobXlpZGxlcHJvYyk7Ci0JbXloaXR0ZXN0cHJvY191cHAgPSBOZXdDb250cm9sVXNlclBhbmVIaXRUZXN0VVBQKG15aGl0dGVzdHByb2MpOwotCW15dHJhY2tpbmdwcm9jX3VwcCA9IE5ld0NvbnRyb2xVc2VyUGFuZVRyYWNraW5nVVBQKG15dHJhY2tpbmdwcm9jKTsKLQlQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhDb250cm9sSGFuZGxlLCBDdGxPYmpfTmV3KTsKLQlQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoQ29udHJvbEhhbmRsZSwgQ3RsT2JqX0NvbnZlcnQpOworICAgIG15dHJhY2tlcl91cHAgPSBOZXdDb250cm9sQWN0aW9uVVBQKG15dHJhY2tlcik7CisgICAgbXlhY3Rpb25wcm9jX3VwcCA9IE5ld0NvbnRyb2xBY3Rpb25VUFAobXlhY3Rpb25wcm9jKTsKKyAgICBteWtleWRvd25wcm9jX3VwcCA9IE5ld0NvbnRyb2xVc2VyUGFuZUtleURvd25VUFAobXlrZXlkb3ducHJvYyk7CisgICAgbXlmb2N1c3Byb2NfdXBwID0gTmV3Q29udHJvbFVzZXJQYW5lRm9jdXNVUFAobXlmb2N1c3Byb2MpOworICAgIG15ZHJhd3Byb2NfdXBwID0gTmV3Q29udHJvbFVzZXJQYW5lRHJhd1VQUChteWRyYXdwcm9jKTsKKyAgICBteWlkbGVwcm9jX3VwcCA9IE5ld0NvbnRyb2xVc2VyUGFuZUlkbGVVUFAobXlpZGxlcHJvYyk7CisgICAgbXloaXR0ZXN0cHJvY191cHAgPSBOZXdDb250cm9sVXNlclBhbmVIaXRUZXN0VVBQKG15aGl0dGVzdHByb2MpOworICAgIG15dHJhY2tpbmdwcm9jX3VwcCA9IE5ld0NvbnRyb2xVc2VyUGFuZVRyYWNraW5nVVBQKG15dHJhY2tpbmdwcm9jKTsKKyAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhDb250cm9sSGFuZGxlLCBDdGxPYmpfTmV3KTsKKyAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoQ29udHJvbEhhbmRsZSwgQ3RsT2JqX0NvbnZlcnQpOwogI2VuZGlmIC8qICFfX0xQNjRfXyAqLwogCi0JbSA9IFB5X0luaXRNb2R1bGUoIl9DdGwiLCBDdGxfbWV0aG9kcyk7CisgICAgbSA9IFB5X0luaXRNb2R1bGUoIl9DdGwiLCBDdGxfbWV0aG9kcyk7CiAKICNpZm5kZWYgX19MUDY0X18KLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQlDdGxfRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOwotCWlmIChDdGxfRXJyb3IgPT0gTlVMTCB8fAotCSAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRXJyb3IiLCBDdGxfRXJyb3IpICE9IDApCi0JCXJldHVybjsKLQlDb250cm9sX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKLQlpZiAoUHlUeXBlX1JlYWR5KCZDb250cm9sX1R5cGUpIDwgMCkgcmV0dXJuOwotCVB5X0lOQ1JFRigmQ29udHJvbF9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkNvbnRyb2wiLCAoUHlPYmplY3QgKikmQ29udHJvbF9UeXBlKTsKLQkvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KLQlQeV9JTkNSRUYoJkNvbnRyb2xfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJDb250cm9sVHlwZSIsIChQeU9iamVjdCAqKSZDb250cm9sX1R5cGUpOworICAgIGQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOworICAgIEN0bF9FcnJvciA9IFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCk7CisgICAgaWYgKEN0bF9FcnJvciA9PSBOVUxMIHx8CisgICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFcnJvciIsIEN0bF9FcnJvcikgIT0gMCkKKyAgICAgICAgcmV0dXJuOworICAgIENvbnRyb2xfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJkNvbnRyb2xfVHlwZSkgPCAwKSByZXR1cm47CisgICAgUHlfSU5DUkVGKCZDb250cm9sX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ29udHJvbCIsIChQeU9iamVjdCAqKSZDb250cm9sX1R5cGUpOworICAgIC8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLworICAgIFB5X0lOQ1JFRigmQ29udHJvbF9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkNvbnRyb2xUeXBlIiwgKFB5T2JqZWN0ICopJkNvbnRyb2xfVHlwZSk7CiAjZW5kaWYgLyogIV9fTFA2NF9fICovCiB9CiAKZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL2RsZy9fRGxnbW9kdWxlLmMgYi9NYWMvTW9kdWxlcy9kbGcvX0RsZ21vZHVsZS5jCmluZGV4IDlhZmE0NzcuLmM0ZDY2YTkgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL2RsZy9fRGxnbW9kdWxlLmMKKysrIGIvTWFjL01vZHVsZXMvZGxnL19EbGdtb2R1bGUuYwpAQCAtMTAsOSArMTAsOSBAQAogCiAvKiBNYWNybyB0byB0ZXN0IHdoZXRoZXIgYSB3ZWFrLWxvYWRlZCBDRk0gZnVuY3Rpb24gZXhpc3RzICovCiAjZGVmaW5lIFB5TWFjX1BSRUNIRUNLKHJ0bikgZG8geyBpZiAoICZydG4gPT0gTlVMTCApICB7XAotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgXAotICAgICAgICAiTm90IGF2YWlsYWJsZSBpbiB0aGlzIHNoYXJlZCBsaWJyYXJ5L09TIHZlcnNpb24iKTsgXAotICAgICAgICByZXR1cm4gTlVMTDsgXAorICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yLCBcCisgICAgIk5vdCBhdmFpbGFibGUgaW4gdGhpcyBzaGFyZWQgbGlicmFyeS9PUyB2ZXJzaW9uIik7IFwKKyAgICByZXR1cm4gTlVMTDsgXAogICAgIH19IHdoaWxlKDApCiAKIApAQCAtMzUsNTUgKzM1LDU1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50UmVjb3JkICpldmVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgKml0ZW1IaXQpCiB7Ci0gICAgICAgIEJvb2xlYW4gcnY7Ci0gICAgICAgIFB5T2JqZWN0ICphcmdzLCAqcmVzOwotICAgICAgICBQeU9iamVjdCAqY2FsbGJhY2sgPSBEbGdfRmlsdGVyUHJvY19jYWxsYmFjazsKLSAgICAgICAgaWYgKGNhbGxiYWNrID09IE5VTEwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7IC8qIERlZmF1bHQgYmVoYXZpb3IgKi8KLSAgICAgICAgRGxnX0ZpbHRlclByb2NfY2FsbGJhY2sgPSBOVUxMOyAvKiBXZSdsbCByZXN0b3JlIGl0IHdoZW4gY2FsbCBzdWNjZXNzZnVsICovCi0gICAgICAgIGFyZ3MgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwgRGxnT2JqX1doaWNoRGlhbG9nLCBkaWFsb2csIFB5TWFjX0J1aWxkRXZlbnRSZWNvcmQsIGV2ZW50KTsKLSAgICAgICAgaWYgKGFyZ3MgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICByZXMgPSBOVUxMOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXMgPSBQeUV2YWxfQ2FsbE9iamVjdChjYWxsYmFjaywgYXJncyk7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKGFyZ3MpOworICAgIEJvb2xlYW4gcnY7CisgICAgUHlPYmplY3QgKmFyZ3MsICpyZXM7CisgICAgUHlPYmplY3QgKmNhbGxiYWNrID0gRGxnX0ZpbHRlclByb2NfY2FsbGJhY2s7CisgICAgaWYgKGNhbGxiYWNrID09IE5VTEwpCisgICAgICAgIHJldHVybiAwOyAvKiBEZWZhdWx0IGJlaGF2aW9yICovCisgICAgRGxnX0ZpbHRlclByb2NfY2FsbGJhY2sgPSBOVUxMOyAvKiBXZSdsbCByZXN0b3JlIGl0IHdoZW4gY2FsbCBzdWNjZXNzZnVsICovCisgICAgYXJncyA9IFB5X0J1aWxkVmFsdWUoIk8mTyYiLCBEbGdPYmpfV2hpY2hEaWFsb2csIGRpYWxvZywgUHlNYWNfQnVpbGRFdmVudFJlY29yZCwgZXZlbnQpOworICAgIGlmIChhcmdzID09IE5VTEwpCisgICAgICAgIHJlcyA9IE5VTEw7CisgICAgZWxzZSB7CisgICAgICAgIHJlcyA9IFB5RXZhbF9DYWxsT2JqZWN0KGNhbGxiYWNrLCBhcmdzKTsKKyAgICAgICAgUHlfREVDUkVGKGFyZ3MpOworICAgIH0KKyAgICBpZiAocmVzID09IE5VTEwpIHsKKyAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoIkV4Y2VwdGlvbiBpbiBEaWFsb2cgRmlsdGVyXG4iKTsKKyAgICAgICAgUHlFcnJfUHJpbnQoKTsKKyAgICAgICAgKml0ZW1IaXQgPSAtMTsgLyogRmFrZSByZXR1cm4gaXRlbSAqLworICAgICAgICByZXR1cm4gMTsgLyogV2UgaGFuZGxlZCBpdCAqLworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgRGxnX0ZpbHRlclByb2NfY2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICAgICAgaWYgKFB5SW50X0NoZWNrKHJlcykpIHsKKyAgICAgICAgICAgICppdGVtSGl0ID0gUHlJbnRfQXNMb25nKHJlcyk7CisgICAgICAgICAgICBydiA9IDE7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKHJlcyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoIkV4Y2VwdGlvbiBpbiBEaWFsb2cgRmlsdGVyXG4iKTsKLSAgICAgICAgICAgICAgICBQeUVycl9QcmludCgpOwotICAgICAgICAgICAgICAgICppdGVtSGl0ID0gLTE7IC8qIEZha2UgcmV0dXJuIGl0ZW0gKi8KLSAgICAgICAgICAgICAgICByZXR1cm4gMTsgLyogV2UgaGFuZGxlZCBpdCAqLwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIERsZ19GaWx0ZXJQcm9jX2NhbGxiYWNrID0gY2FsbGJhY2s7Ci0gICAgICAgICAgICAgICAgaWYgKFB5SW50X0NoZWNrKHJlcykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICppdGVtSGl0ID0gUHlJbnRfQXNMb25nKHJlcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBydiA9IDE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHJ2ID0gUHlPYmplY3RfSXNUcnVlKHJlcyk7Ci0gICAgICAgIH0KLSAgICAgICAgUHlfREVDUkVGKHJlcyk7Ci0gICAgICAgIHJldHVybiBydjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcnYgPSBQeU9iamVjdF9Jc1RydWUocmVzKTsKKyAgICB9CisgICAgUHlfREVDUkVGKHJlcyk7CisgICAgcmV0dXJuIHJ2OwogfQogCiBzdGF0aWMgTW9kYWxGaWx0ZXJVUFAKIERsZ19QYXNzRmlsdGVyUHJvYyhQeU9iamVjdCAqY2FsbGJhY2spCiB7Ci0gICAgICAgIFB5T2JqZWN0ICp0bXAgPSBEbGdfRmlsdGVyUHJvY19jYWxsYmFjazsKLSAgICAgICAgc3RhdGljIE1vZGFsRmlsdGVyVVBQIFVuaXZGaWx0ZXJVcHAgPSBOVUxMOworICAgIFB5T2JqZWN0ICp0bXAgPSBEbGdfRmlsdGVyUHJvY19jYWxsYmFjazsKKyAgICBzdGF0aWMgTW9kYWxGaWx0ZXJVUFAgVW5pdkZpbHRlclVwcCA9IE5VTEw7CiAKLSAgICAgICAgRGxnX0ZpbHRlclByb2NfY2FsbGJhY2sgPSBOVUxMOwotICAgICAgICBpZiAoY2FsbGJhY2sgPT0gUHlfTm9uZSkgewotICAgICAgICAgICAgICAgIFB5X1hERUNSRUYodG1wKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBQeV9JTkNSRUYoY2FsbGJhY2spOwotICAgICAgICBEbGdfRmlsdGVyUHJvY19jYWxsYmFjayA9IGNhbGxiYWNrOworICAgIERsZ19GaWx0ZXJQcm9jX2NhbGxiYWNrID0gTlVMTDsKKyAgICBpZiAoY2FsbGJhY2sgPT0gUHlfTm9uZSkgewogICAgICAgICBQeV9YREVDUkVGKHRtcCk7Ci0gICAgICAgIGlmICggVW5pdkZpbHRlclVwcCA9PSBOVUxMICkKLSAgICAgICAgICAgICAgICBVbml2RmlsdGVyVXBwID0gTmV3TW9kYWxGaWx0ZXJVUFAoJkRsZ19Vbml2RmlsdGVyUHJvYyk7Ci0gICAgICAgIHJldHVybiBVbml2RmlsdGVyVXBwOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlfSU5DUkVGKGNhbGxiYWNrKTsKKyAgICBEbGdfRmlsdGVyUHJvY19jYWxsYmFjayA9IGNhbGxiYWNrOworICAgIFB5X1hERUNSRUYodG1wKTsKKyAgICBpZiAoIFVuaXZGaWx0ZXJVcHAgPT0gTlVMTCApCisgICAgICAgIFVuaXZGaWx0ZXJVcHAgPSBOZXdNb2RhbEZpbHRlclVQUCgmRGxnX1VuaXZGaWx0ZXJQcm9jKTsKKyAgICByZXR1cm4gVW5pdkZpbHRlclVwcDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdfVXNlckl0ZW1Qcm9jX2NhbGxiYWNrID0gTlVMTDsKQEAgLTkxLDI0ICs5MSwyNCBAQAogc3RhdGljIHBhc2NhbCB2b2lkIERsZ19Vbml2VXNlckl0ZW1Qcm9jKERpYWxvZ1B0ciBkaWFsb2csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0IGl0ZW0pCiB7Ci0gICAgICAgIFB5T2JqZWN0ICphcmdzLCAqcmVzOworICAgIFB5T2JqZWN0ICphcmdzLCAqcmVzOwogCi0gICAgICAgIGlmIChEbGdfVXNlckl0ZW1Qcm9jX2NhbGxiYWNrID09IE5VTEwpCi0gICAgICAgICAgICAgICAgcmV0dXJuOyAvKiBEZWZhdWx0IGJlaGF2aW9yICovCi0gICAgICAgIERsZ19GaWx0ZXJQcm9jX2NhbGxiYWNrID0gTlVMTDsgLyogV2UnbGwgcmVzdG9yZSBpdCB3aGVuIGNhbGwgc3VjY2Vzc2Z1bCAqLwotICAgICAgICBhcmdzID0gUHlfQnVpbGRWYWx1ZSgiTyZoIiwgRGxnT2JqX1doaWNoRGlhbG9nLCBkaWFsb2csIGl0ZW0pOwotICAgICAgICBpZiAoYXJncyA9PSBOVUxMKQotICAgICAgICAgICAgICAgIHJlcyA9IE5VTEw7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHJlcyA9IFB5RXZhbF9DYWxsT2JqZWN0KERsZ19Vc2VySXRlbVByb2NfY2FsbGJhY2ssIGFyZ3MpOwotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihhcmdzKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocmVzID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigiRXhjZXB0aW9uIGluIERpYWxvZyBVc2VySXRlbSBwcm9jXG4iKTsKLSAgICAgICAgICAgICAgICBQeUVycl9QcmludCgpOwotICAgICAgICB9Ci0gICAgICAgIFB5X1hERUNSRUYocmVzKTsKLSAgICAgICAgcmV0dXJuOworICAgIGlmIChEbGdfVXNlckl0ZW1Qcm9jX2NhbGxiYWNrID09IE5VTEwpCisgICAgICAgIHJldHVybjsgLyogRGVmYXVsdCBiZWhhdmlvciAqLworICAgIERsZ19GaWx0ZXJQcm9jX2NhbGxiYWNrID0gTlVMTDsgLyogV2UnbGwgcmVzdG9yZSBpdCB3aGVuIGNhbGwgc3VjY2Vzc2Z1bCAqLworICAgIGFyZ3MgPSBQeV9CdWlsZFZhbHVlKCJPJmgiLCBEbGdPYmpfV2hpY2hEaWFsb2csIGRpYWxvZywgaXRlbSk7CisgICAgaWYgKGFyZ3MgPT0gTlVMTCkKKyAgICAgICAgcmVzID0gTlVMTDsKKyAgICBlbHNlIHsKKyAgICAgICAgcmVzID0gUHlFdmFsX0NhbGxPYmplY3QoRGxnX1VzZXJJdGVtUHJvY19jYWxsYmFjaywgYXJncyk7CisgICAgICAgIFB5X0RFQ1JFRihhcmdzKTsKKyAgICB9CisgICAgaWYgKHJlcyA9PSBOVUxMKSB7CisgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCJFeGNlcHRpb24gaW4gRGlhbG9nIFVzZXJJdGVtIHByb2NcbiIpOworICAgICAgICBQeUVycl9QcmludCgpOworICAgIH0KKyAgICBQeV9YREVDUkVGKHJlcyk7CisgICAgcmV0dXJuOwogfQogCiAjaWYgMApAQCAtMTMzLDgxMSArMTMzLDgxMSBAQAogI2RlZmluZSBEbGdPYmpfQ2hlY2soeCkgKCh4KS0+b2JfdHlwZSA9PSAmRGlhbG9nX1R5cGUgfHwgUHlPYmplY3RfVHlwZUNoZWNrKCh4KSwgJkRpYWxvZ19UeXBlKSkKIAogdHlwZWRlZiBzdHJ1Y3QgRGlhbG9nT2JqZWN0IHsKLQlQeU9iamVjdF9IRUFECi0JRGlhbG9nUHRyIG9iX2l0c2VsZjsKKyAgICBQeU9iamVjdF9IRUFECisgICAgRGlhbG9nUHRyIG9iX2l0c2VsZjsKIH0gRGlhbG9nT2JqZWN0OwogCiBQeU9iamVjdCAqRGxnT2JqX05ldyhEaWFsb2dQdHIgaXRzZWxmKQogewotCURpYWxvZ09iamVjdCAqaXQ7Ci0JaWYgKGl0c2VsZiA9PSBOVUxMKSB7IFB5X0lOQ1JFRihQeV9Ob25lKTsgcmV0dXJuIFB5X05vbmU7IH0KLQlpdCA9IFB5T2JqZWN0X05FVyhEaWFsb2dPYmplY3QsICZEaWFsb2dfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOwotCWl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JU2V0V1JlZkNvbihHZXREaWFsb2dXaW5kb3coaXRzZWxmKSwgKGxvbmcpaXQpOwotCXJldHVybiAoUHlPYmplY3QgKilpdDsKKyAgICBEaWFsb2dPYmplY3QgKml0OworICAgIGlmIChpdHNlbGYgPT0gTlVMTCkgeyBQeV9JTkNSRUYoUHlfTm9uZSk7IHJldHVybiBQeV9Ob25lOyB9CisgICAgaXQgPSBQeU9iamVjdF9ORVcoRGlhbG9nT2JqZWN0LCAmRGlhbG9nX1R5cGUpOworICAgIGlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICBpdC0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIFNldFdSZWZDb24oR2V0RGlhbG9nV2luZG93KGl0c2VsZiksIChsb25nKWl0KTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiAKIGludCBEbGdPYmpfQ29udmVydChQeU9iamVjdCAqdiwgRGlhbG9nUHRyICpwX2l0c2VsZikKIHsKLQlpZiAodiA9PSBQeV9Ob25lKSB7ICpwX2l0c2VsZiA9IE5VTEw7IHJldHVybiAxOyB9Ci0JaWYgKFB5SW50X0NoZWNrKHYpKSB7ICpwX2l0c2VsZiA9IChEaWFsb2dQdHIpUHlJbnRfQXNMb25nKHYpOwotCSAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsgfQotCWlmICghRGxnT2JqX0NoZWNrKHYpKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkRpYWxvZyByZXF1aXJlZCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JKnBfaXRzZWxmID0gKChEaWFsb2dPYmplY3QgKil2KS0+b2JfaXRzZWxmOwotCXJldHVybiAxOworICAgIGlmICh2ID09IFB5X05vbmUpIHsgKnBfaXRzZWxmID0gTlVMTDsgcmV0dXJuIDE7IH0KKyAgICBpZiAoUHlJbnRfQ2hlY2sodikpIHsgKnBfaXRzZWxmID0gKERpYWxvZ1B0cilQeUludF9Bc0xvbmcodik7CisgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOyB9CisgICAgaWYgKCFEbGdPYmpfQ2hlY2sodikpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiRGlhbG9nIHJlcXVpcmVkIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAqcF9pdHNlbGYgPSAoKERpYWxvZ09iamVjdCAqKXYpLT5vYl9pdHNlbGY7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyB2b2lkIERsZ09ial9kZWFsbG9jKERpYWxvZ09iamVjdCAqc2VsZikKIHsKLQlEaXNwb3NlRGlhbG9nKHNlbGYtPm9iX2l0c2VsZik7Ci0Jc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKKyAgICBEaXNwb3NlRGlhbG9nKHNlbGYtPm9iX2l0c2VsZik7CisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdPYmpfRHJhd0RpYWxvZyhEaWFsb2dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgRHJhd0RpYWxvZwotCVB5TWFjX1BSRUNIRUNLKERyYXdEaWFsb2cpOworICAgIFB5TWFjX1BSRUNIRUNLKERyYXdEaWFsb2cpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCURyYXdEaWFsb2coX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBEcmF3RGlhbG9nKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdPYmpfVXBkYXRlRGlhbG9nKERpYWxvZ09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIHVwZGF0ZVJnbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIHVwZGF0ZVJnbjsKICNpZm5kZWYgVXBkYXRlRGlhbG9nCi0JUHlNYWNfUFJFQ0hFQ0soVXBkYXRlRGlhbG9nKTsKKyAgICBQeU1hY19QUkVDSEVDSyhVcGRhdGVEaWFsb2cpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnVwZGF0ZVJnbikpCi0JCXJldHVybiBOVUxMOwotCVVwZGF0ZURpYWxvZyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICB1cGRhdGVSZ24pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdXBkYXRlUmduKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVXBkYXRlRGlhbG9nKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgIHVwZGF0ZVJnbik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRsZ09ial9IaWRlRGlhbG9nSXRlbShEaWFsb2dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCURpYWxvZ0l0ZW1JbmRleCBpdGVtTm87CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIERpYWxvZ0l0ZW1JbmRleCBpdGVtTm87CiAjaWZuZGVmIEhpZGVEaWFsb2dJdGVtCi0JUHlNYWNfUFJFQ0hFQ0soSGlkZURpYWxvZ0l0ZW0pOworICAgIFB5TWFjX1BSRUNIRUNLKEhpZGVEaWFsb2dJdGVtKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXRlbU5vKSkKLQkJcmV0dXJuIE5VTEw7Ci0JSGlkZURpYWxvZ0l0ZW0oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICBpdGVtTm8pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZW1ObykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEhpZGVEaWFsb2dJdGVtKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgaXRlbU5vKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRGxnT2JqX1Nob3dEaWFsb2dJdGVtKERpYWxvZ09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JRGlhbG9nSXRlbUluZGV4IGl0ZW1ObzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgRGlhbG9nSXRlbUluZGV4IGl0ZW1ObzsKICNpZm5kZWYgU2hvd0RpYWxvZ0l0ZW0KLQlQeU1hY19QUkVDSEVDSyhTaG93RGlhbG9nSXRlbSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2hvd0RpYWxvZ0l0ZW0pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpdGVtTm8pKQotCQlyZXR1cm4gTlVMTDsKLQlTaG93RGlhbG9nSXRlbShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgIGl0ZW1Obyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRlbU5vKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2hvd0RpYWxvZ0l0ZW0oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICBpdGVtTm8pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdPYmpfRmluZERpYWxvZ0l0ZW0oRGlhbG9nT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlEaWFsb2dJdGVtSW5kZXhaZXJvQmFzZWQgX3J2OwotCVBvaW50IHRoZVB0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBEaWFsb2dJdGVtSW5kZXhaZXJvQmFzZWQgX3J2OworICAgIFBvaW50IHRoZVB0OwogI2lmbmRlZiBGaW5kRGlhbG9nSXRlbQotCVB5TWFjX1BSRUNIRUNLKEZpbmREaWFsb2dJdGVtKTsKKyAgICBQeU1hY19QUkVDSEVDSyhGaW5kRGlhbG9nSXRlbSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmdGhlUHQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBGaW5kRGlhbG9nSXRlbShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgIHRoZVB0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmdGhlUHQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBGaW5kRGlhbG9nSXRlbShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRoZVB0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdPYmpfRGlhbG9nQ3V0KERpYWxvZ09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBEaWFsb2dDdXQKLQlQeU1hY19QUkVDSEVDSyhEaWFsb2dDdXQpOworICAgIFB5TWFjX1BSRUNIRUNLKERpYWxvZ0N1dCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JRGlhbG9nQ3V0KF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgRGlhbG9nQ3V0KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdPYmpfRGlhbG9nUGFzdGUoRGlhbG9nT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIERpYWxvZ1Bhc3RlCi0JUHlNYWNfUFJFQ0hFQ0soRGlhbG9nUGFzdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKERpYWxvZ1Bhc3RlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlEaWFsb2dQYXN0ZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIERpYWxvZ1Bhc3RlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdPYmpfRGlhbG9nQ29weShEaWFsb2dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgRGlhbG9nQ29weQotCVB5TWFjX1BSRUNIRUNLKERpYWxvZ0NvcHkpOworICAgIFB5TWFjX1BSRUNIRUNLKERpYWxvZ0NvcHkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCURpYWxvZ0NvcHkoX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBEaWFsb2dDb3B5KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdPYmpfRGlhbG9nRGVsZXRlKERpYWxvZ09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBEaWFsb2dEZWxldGUKLQlQeU1hY19QUkVDSEVDSyhEaWFsb2dEZWxldGUpOworICAgIFB5TWFjX1BSRUNIRUNLKERpYWxvZ0RlbGV0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JRGlhbG9nRGVsZXRlKF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgRGlhbG9nRGVsZXRlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdPYmpfR2V0RGlhbG9nSXRlbShEaWFsb2dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCURpYWxvZ0l0ZW1JbmRleCBpdGVtTm87Ci0JRGlhbG9nSXRlbVR5cGUgaXRlbVR5cGU7Ci0JSGFuZGxlIGl0ZW07Ci0JUmVjdCBib3g7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIERpYWxvZ0l0ZW1JbmRleCBpdGVtTm87CisgICAgRGlhbG9nSXRlbVR5cGUgaXRlbVR5cGU7CisgICAgSGFuZGxlIGl0ZW07CisgICAgUmVjdCBib3g7CiAjaWZuZGVmIEdldERpYWxvZ0l0ZW0KLQlQeU1hY19QUkVDSEVDSyhHZXREaWFsb2dJdGVtKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXREaWFsb2dJdGVtKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXRlbU5vKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0RGlhbG9nSXRlbShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgaXRlbU5vLAotCSAgICAgICAgICAgICAgJml0ZW1UeXBlLAotCSAgICAgICAgICAgICAgJml0ZW0sCi0JICAgICAgICAgICAgICAmYm94KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaE8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIGl0ZW1UeXBlLAotCSAgICAgICAgICAgICAgICAgICAgIE9wdFJlc09ial9OZXcsIGl0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmYm94KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZW1ObykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldERpYWxvZ0l0ZW0oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgIGl0ZW1ObywKKyAgICAgICAgICAgICAgICAgICZpdGVtVHlwZSwKKyAgICAgICAgICAgICAgICAgICZpdGVtLAorICAgICAgICAgICAgICAgICAgJmJveCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImhPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfTmV3LCBpdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmJveCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRGxnT2JqX1NldERpYWxvZ0l0ZW0oRGlhbG9nT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlEaWFsb2dJdGVtSW5kZXggaXRlbU5vOwotCURpYWxvZ0l0ZW1UeXBlIGl0ZW1UeXBlOwotCUhhbmRsZSBpdGVtOwotCVJlY3QgYm94OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBEaWFsb2dJdGVtSW5kZXggaXRlbU5vOworICAgIERpYWxvZ0l0ZW1UeXBlIGl0ZW1UeXBlOworICAgIEhhbmRsZSBpdGVtOworICAgIFJlY3QgYm94OwogI2lmbmRlZiBTZXREaWFsb2dJdGVtCi0JUHlNYWNfUFJFQ0hFQ0soU2V0RGlhbG9nSXRlbSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0RGlhbG9nSXRlbSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaE8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXRlbU5vLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXRlbVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJveCkpCi0JCXJldHVybiBOVUxMOwotCVNldERpYWxvZ0l0ZW0oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgIGl0ZW1ObywKLQkgICAgICAgICAgICAgIGl0ZW1UeXBlLAotCSAgICAgICAgICAgICAgaXRlbSwKLQkgICAgICAgICAgICAgICZib3gpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaE8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRlbU5vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRlbVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJveCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldERpYWxvZ0l0ZW0oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgIGl0ZW1ObywKKyAgICAgICAgICAgICAgICAgIGl0ZW1UeXBlLAorICAgICAgICAgICAgICAgICAgaXRlbSwKKyAgICAgICAgICAgICAgICAgICZib3gpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdPYmpfU2VsZWN0RGlhbG9nSXRlbVRleHQoRGlhbG9nT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlEaWFsb2dJdGVtSW5kZXggaXRlbU5vOwotCVNJbnQxNiBzdHJ0U2VsOwotCVNJbnQxNiBlbmRTZWw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIERpYWxvZ0l0ZW1JbmRleCBpdGVtTm87CisgICAgU0ludDE2IHN0cnRTZWw7CisgICAgU0ludDE2IGVuZFNlbDsKICNpZm5kZWYgU2VsZWN0RGlhbG9nSXRlbVRleHQKLQlQeU1hY19QUkVDSEVDSyhTZWxlY3REaWFsb2dJdGVtVGV4dCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2VsZWN0RGlhbG9nSXRlbVRleHQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJml0ZW1ObywKLQkgICAgICAgICAgICAgICAgICAgICAgJnN0cnRTZWwsCi0JICAgICAgICAgICAgICAgICAgICAgICZlbmRTZWwpKQotCQlyZXR1cm4gTlVMTDsKLQlTZWxlY3REaWFsb2dJdGVtVGV4dChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgIGl0ZW1ObywKLQkgICAgICAgICAgICAgICAgICAgICBzdHJ0U2VsLAotCSAgICAgICAgICAgICAgICAgICAgIGVuZFNlbCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpdGVtTm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHJ0U2VsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5kU2VsKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2VsZWN0RGlhbG9nSXRlbVRleHQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtTm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RydFNlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBlbmRTZWwpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdPYmpfQXBwZW5kRElUTChEaWFsb2dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUhhbmRsZSB0aGVIYW5kbGU7Ci0JRElUTE1ldGhvZCBtZXRob2Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEhhbmRsZSB0aGVIYW5kbGU7CisgICAgRElUTE1ldGhvZCBtZXRob2Q7CiAjaWZuZGVmIEFwcGVuZERJVEwKLQlQeU1hY19QUkVDSEVDSyhBcHBlbmRESVRMKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBcHBlbmRESVRMKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlSGFuZGxlLAotCSAgICAgICAgICAgICAgICAgICAgICAmbWV0aG9kKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQXBwZW5kRElUTChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgdGhlSGFuZGxlLAotCSAgICAgICAgICAgbWV0aG9kKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtZXRob2QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBBcHBlbmRESVRMKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICB0aGVIYW5kbGUsCisgICAgICAgICAgICAgICBtZXRob2QpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdPYmpfQ291bnRESVRMKERpYWxvZ09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JRGlhbG9nSXRlbUluZGV4IF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgRGlhbG9nSXRlbUluZGV4IF9ydjsKICNpZm5kZWYgQ291bnRESVRMCi0JUHlNYWNfUFJFQ0hFQ0soQ291bnRESVRMKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb3VudERJVEwpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENvdW50RElUTChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ291bnRESVRMKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRsZ09ial9TaG9ydGVuRElUTChEaWFsb2dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCURpYWxvZ0l0ZW1JbmRleCBudW1iZXJJdGVtczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgRGlhbG9nSXRlbUluZGV4IG51bWJlckl0ZW1zOwogI2lmbmRlZiBTaG9ydGVuRElUTAotCVB5TWFjX1BSRUNIRUNLKFNob3J0ZW5ESVRMKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTaG9ydGVuRElUTCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm51bWJlckl0ZW1zKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2hvcnRlbkRJVEwoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICBudW1iZXJJdGVtcyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbnVtYmVySXRlbXMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTaG9ydGVuRElUTChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgIG51bWJlckl0ZW1zKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRGxnT2JqX0luc2VydERpYWxvZ0l0ZW0oRGlhbG9nT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCURpYWxvZ0l0ZW1JbmRleCBhZnRlckl0ZW07Ci0JRGlhbG9nSXRlbVR5cGUgaXRlbVR5cGU7Ci0JSGFuZGxlIGl0ZW1IYW5kbGU7Ci0JUmVjdCBib3g7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgRGlhbG9nSXRlbUluZGV4IGFmdGVySXRlbTsKKyAgICBEaWFsb2dJdGVtVHlwZSBpdGVtVHlwZTsKKyAgICBIYW5kbGUgaXRlbUhhbmRsZTsKKyAgICBSZWN0IGJveDsKICNpZm5kZWYgSW5zZXJ0RGlhbG9nSXRlbQotCVB5TWFjX1BSRUNIRUNLKEluc2VydERpYWxvZ0l0ZW0pOworICAgIFB5TWFjX1BSRUNIRUNLKEluc2VydERpYWxvZ0l0ZW0pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGhPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmFmdGVySXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgJml0ZW1UeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJml0ZW1IYW5kbGUsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3gpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gSW5zZXJ0RGlhbG9nSXRlbShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVySXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgICBpdGVtVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICBpdGVtSGFuZGxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICZib3gpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhZnRlckl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpdGVtVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZpdGVtSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm94KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEluc2VydERpYWxvZ0l0ZW0oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZnRlckl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbUhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm94KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdPYmpfUmVtb3ZlRGlhbG9nSXRlbXMoRGlhbG9nT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCURpYWxvZ0l0ZW1JbmRleCBpdGVtTm87Ci0JRGlhbG9nSXRlbUluZGV4IGFtb3VudFRvUmVtb3ZlOwotCUJvb2xlYW4gZGlzcG9zZUl0ZW1EYXRhOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIERpYWxvZ0l0ZW1JbmRleCBpdGVtTm87CisgICAgRGlhbG9nSXRlbUluZGV4IGFtb3VudFRvUmVtb3ZlOworICAgIEJvb2xlYW4gZGlzcG9zZUl0ZW1EYXRhOwogI2lmbmRlZiBSZW1vdmVEaWFsb2dJdGVtcwotCVB5TWFjX1BSRUNIRUNLKFJlbW92ZURpYWxvZ0l0ZW1zKTsKKyAgICBQeU1hY19QUkVDSEVDSyhSZW1vdmVEaWFsb2dJdGVtcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaGIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXRlbU5vLAotCSAgICAgICAgICAgICAgICAgICAgICAmYW1vdW50VG9SZW1vdmUsCi0JICAgICAgICAgICAgICAgICAgICAgICZkaXNwb3NlSXRlbURhdGEpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUmVtb3ZlRGlhbG9nSXRlbXMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbU5vLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBhbW91bnRUb1JlbW92ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcG9zZUl0ZW1EYXRhKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRlbU5vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYW1vdW50VG9SZW1vdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkaXNwb3NlSXRlbURhdGEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUmVtb3ZlRGlhbG9nSXRlbXMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbU5vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbW91bnRUb1JlbW92ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcG9zZUl0ZW1EYXRhKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdPYmpfU3RkRmlsdGVyUHJvYyhEaWFsb2dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCUV2ZW50UmVjb3JkIGV2ZW50OwotCURpYWxvZ0l0ZW1JbmRleCBpdGVtSGl0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBFdmVudFJlY29yZCBldmVudDsKKyAgICBEaWFsb2dJdGVtSW5kZXggaXRlbUhpdDsKICNpZm5kZWYgU3RkRmlsdGVyUHJvYwotCVB5TWFjX1BSRUNIRUNLKFN0ZEZpbHRlclByb2MpOworICAgIFB5TWFjX1BSRUNIRUNLKFN0ZEZpbHRlclByb2MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RXZlbnRSZWNvcmQsICZldmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgJml0ZW1IaXQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTdGRGaWx0ZXJQcm9jKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAmZXZlbnQsCi0JICAgICAgICAgICAgICAgICAgICAmaXRlbUhpdCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImJPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEV2ZW50UmVjb3JkLCAmZXZlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgaXRlbUhpdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RXZlbnRSZWNvcmQsICZldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZW1IaXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTdGRGaWx0ZXJQcm9jKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAmZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAmaXRlbUhpdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEV2ZW50UmVjb3JkLCAmZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbUhpdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRGxnT2JqX1NldERpYWxvZ0RlZmF1bHRJdGVtKERpYWxvZ09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlEaWFsb2dJdGVtSW5kZXggbmV3SXRlbTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBEaWFsb2dJdGVtSW5kZXggbmV3SXRlbTsKICNpZm5kZWYgU2V0RGlhbG9nRGVmYXVsdEl0ZW0KLQlQeU1hY19QUkVDSEVDSyhTZXREaWFsb2dEZWZhdWx0SXRlbSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0RGlhbG9nRGVmYXVsdEl0ZW0pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZuZXdJdGVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldERpYWxvZ0RlZmF1bHRJdGVtKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0l0ZW0pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbmV3SXRlbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXREaWFsb2dEZWZhdWx0SXRlbShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdJdGVtKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdPYmpfU2V0RGlhbG9nQ2FuY2VsSXRlbShEaWFsb2dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JRGlhbG9nSXRlbUluZGV4IG5ld0l0ZW07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgRGlhbG9nSXRlbUluZGV4IG5ld0l0ZW07CiAjaWZuZGVmIFNldERpYWxvZ0NhbmNlbEl0ZW0KLQlQeU1hY19QUkVDSEVDSyhTZXREaWFsb2dDYW5jZWxJdGVtKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXREaWFsb2dDYW5jZWxJdGVtKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmbmV3SXRlbSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXREaWFsb2dDYW5jZWxJdGVtKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3SXRlbSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXdJdGVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldERpYWxvZ0NhbmNlbEl0ZW0oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdJdGVtKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdPYmpfU2V0RGlhbG9nVHJhY2tzQ3Vyc29yKERpYWxvZ09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlCb29sZWFuIHRyYWNrczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBCb29sZWFuIHRyYWNrczsKICNpZm5kZWYgU2V0RGlhbG9nVHJhY2tzQ3Vyc29yCi0JUHlNYWNfUFJFQ0hFQ0soU2V0RGlhbG9nVHJhY2tzQ3Vyc29yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXREaWFsb2dUcmFja3NDdXJzb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0cmFja3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0RGlhbG9nVHJhY2tzQ3Vyc29yKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdHJhY2tzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldERpYWxvZ1RyYWNrc0N1cnNvcihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdPYmpfQXV0b1NpemVEaWFsb2coRGlhbG9nT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOwogI2lmbmRlZiBBdXRvU2l6ZURpYWxvZwotCVB5TWFjX1BSRUNIRUNLKEF1dG9TaXplRGlhbG9nKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBdXRvU2l6ZURpYWxvZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEF1dG9TaXplRGlhbG9nKF9zZWxmLT5vYl9pdHNlbGYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQXV0b1NpemVEaWFsb2coX3NlbGYtPm9iX2l0c2VsZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRGxnT2JqX0dldERpYWxvZ0l0ZW1Bc0NvbnRyb2woRGlhbG9nT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVNJbnQxNiBpbkl0ZW1ObzsKLQlDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU0ludDE2IGluSXRlbU5vOworICAgIENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKICNpZm5kZWYgR2V0RGlhbG9nSXRlbUFzQ29udHJvbAotCVB5TWFjX1BSRUNIRUNLKEdldERpYWxvZ0l0ZW1Bc0NvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERpYWxvZ0l0ZW1Bc0NvbnRyb2wpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkl0ZW1ObykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXREaWFsb2dJdGVtQXNDb250cm9sKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5JdGVtTm8sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBvdXRDb250cm9sKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbU5vKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldERpYWxvZ0l0ZW1Bc0NvbnRyb2woX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkl0ZW1ObywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRsZ09ial9Nb3ZlRGlhbG9nSXRlbShEaWFsb2dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU0ludDE2IGluSXRlbU5vOwotCVNJbnQxNiBpbkhvcml6OwotCVNJbnQxNiBpblZlcnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU0ludDE2IGluSXRlbU5vOworICAgIFNJbnQxNiBpbkhvcml6OworICAgIFNJbnQxNiBpblZlcnQ7CiAjaWZuZGVmIE1vdmVEaWFsb2dJdGVtCi0JUHlNYWNfUFJFQ0hFQ0soTW92ZURpYWxvZ0l0ZW0pOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmVEaWFsb2dJdGVtKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkl0ZW1ObywKLQkgICAgICAgICAgICAgICAgICAgICAgJmluSG9yaXosCi0JICAgICAgICAgICAgICAgICAgICAgICZpblZlcnQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gTW92ZURpYWxvZ0l0ZW0oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgaW5JdGVtTm8sCi0JICAgICAgICAgICAgICAgICAgICAgIGluSG9yaXosCi0JICAgICAgICAgICAgICAgICAgICAgIGluVmVydCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbU5vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Ib3JpeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluVmVydCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBNb3ZlRGlhbG9nSXRlbShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbkl0ZW1ObywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Ib3JpeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW5WZXJ0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdPYmpfU2l6ZURpYWxvZ0l0ZW0oRGlhbG9nT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVNJbnQxNiBpbkl0ZW1ObzsKLQlTSW50MTYgaW5XaWR0aDsKLQlTSW50MTYgaW5IZWlnaHQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU0ludDE2IGluSXRlbU5vOworICAgIFNJbnQxNiBpbldpZHRoOworICAgIFNJbnQxNiBpbkhlaWdodDsKICNpZm5kZWYgU2l6ZURpYWxvZ0l0ZW0KLQlQeU1hY19QUkVDSEVDSyhTaXplRGlhbG9nSXRlbSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2l6ZURpYWxvZ0l0ZW0pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbU5vLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5XaWR0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluSGVpZ2h0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNpemVEaWFsb2dJdGVtKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgIGluSXRlbU5vLAotCSAgICAgICAgICAgICAgICAgICAgICBpbldpZHRoLAotCSAgICAgICAgICAgICAgICAgICAgICBpbkhlaWdodCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbU5vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5XaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluSGVpZ2h0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNpemVEaWFsb2dJdGVtKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXRlbU5vLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbldpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbkhlaWdodCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRGxnT2JqX0FwcGVuZERpYWxvZ0l0ZW1MaXN0KERpYWxvZ09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlTSW50MTYgZGl0bElEOwotCURJVExNZXRob2QgbWV0aG9kOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFNJbnQxNiBkaXRsSUQ7CisgICAgRElUTE1ldGhvZCBtZXRob2Q7CiAjaWZuZGVmIEFwcGVuZERpYWxvZ0l0ZW1MaXN0Ci0JUHlNYWNfUFJFQ0hFQ0soQXBwZW5kRGlhbG9nSXRlbUxpc3QpOworICAgIFB5TWFjX1BSRUNIRUNLKEFwcGVuZERpYWxvZ0l0ZW1MaXN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRpdGxJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1ldGhvZCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBcHBlbmREaWFsb2dJdGVtTGlzdChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXRsSUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGl0bElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWV0aG9kKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFwcGVuZERpYWxvZ0l0ZW1MaXN0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpdGxJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdPYmpfU2V0RGlhbG9nVGltZW91dChEaWFsb2dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JU0ludDE2IGluQnV0dG9uVG9QcmVzczsKLQlVSW50MzIgaW5TZWNvbmRzVG9XYWl0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFNJbnQxNiBpbkJ1dHRvblRvUHJlc3M7CisgICAgVUludDMyIGluU2Vjb25kc1RvV2FpdDsKICNpZm5kZWYgU2V0RGlhbG9nVGltZW91dAotCVB5TWFjX1BSRUNIRUNLKFNldERpYWxvZ1RpbWVvdXQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldERpYWxvZ1RpbWVvdXQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5CdXR0b25Ub1ByZXNzLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5TZWNvbmRzVG9XYWl0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldERpYWxvZ1RpbWVvdXQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICBpbkJ1dHRvblRvUHJlc3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgaW5TZWNvbmRzVG9XYWl0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkJ1dHRvblRvUHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblNlY29uZHNUb1dhaXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0RGlhbG9nVGltZW91dChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQnV0dG9uVG9QcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblNlY29uZHNUb1dhaXQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRsZ09ial9HZXREaWFsb2dUaW1lb3V0KERpYWxvZ09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlTSW50MTYgb3V0QnV0dG9uVG9QcmVzczsKLQlVSW50MzIgb3V0U2Vjb25kc1RvV2FpdDsKLQlVSW50MzIgb3V0U2Vjb25kc1JlbWFpbmluZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBTSW50MTYgb3V0QnV0dG9uVG9QcmVzczsKKyAgICBVSW50MzIgb3V0U2Vjb25kc1RvV2FpdDsKKyAgICBVSW50MzIgb3V0U2Vjb25kc1JlbWFpbmluZzsKICNpZm5kZWYgR2V0RGlhbG9nVGltZW91dAotCVB5TWFjX1BSRUNIRUNLKEdldERpYWxvZ1RpbWVvdXQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERpYWxvZ1RpbWVvdXQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXREaWFsb2dUaW1lb3V0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgJm91dEJ1dHRvblRvUHJlc3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgJm91dFNlY29uZHNUb1dhaXQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgJm91dFNlY29uZHNSZW1haW5pbmcpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImhsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0QnV0dG9uVG9QcmVzcywKLQkgICAgICAgICAgICAgICAgICAgICBvdXRTZWNvbmRzVG9XYWl0LAotCSAgICAgICAgICAgICAgICAgICAgIG91dFNlY29uZHNSZW1haW5pbmcpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0RGlhbG9nVGltZW91dChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRCdXR0b25Ub1ByZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRTZWNvbmRzVG9XYWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRTZWNvbmRzUmVtYWluaW5nKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJobGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dEJ1dHRvblRvUHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0U2Vjb25kc1RvV2FpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRTZWNvbmRzUmVtYWluaW5nKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdPYmpfU2V0TW9kYWxEaWFsb2dFdmVudE1hc2soRGlhbG9nT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUV2ZW50TWFzayBpbk1hc2s7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgRXZlbnRNYXNrIGluTWFzazsKICNpZm5kZWYgU2V0TW9kYWxEaWFsb2dFdmVudE1hc2sKLQlQeU1hY19QUkVDSEVDSyhTZXRNb2RhbERpYWxvZ0V2ZW50TWFzayk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TW9kYWxEaWFsb2dFdmVudE1hc2spOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiSCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbk1hc2spKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0TW9kYWxEaWFsb2dFdmVudE1hc2soX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5NYXNrKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluTWFzaykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRNb2RhbERpYWxvZ0V2ZW50TWFzayhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbk1hc2spOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRsZ09ial9HZXRNb2RhbERpYWxvZ0V2ZW50TWFzayhEaWFsb2dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JRXZlbnRNYXNrIG91dE1hc2s7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgRXZlbnRNYXNrIG91dE1hc2s7CiAjaWZuZGVmIEdldE1vZGFsRGlhbG9nRXZlbnRNYXNrCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TW9kYWxEaWFsb2dFdmVudE1hc2spOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1vZGFsRGlhbG9nRXZlbnRNYXNrKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0TW9kYWxEaWFsb2dFdmVudE1hc2soX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dE1hc2spOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIkgiLAotCSAgICAgICAgICAgICAgICAgICAgIG91dE1hc2spOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0TW9kYWxEaWFsb2dFdmVudE1hc2soX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dE1hc2spOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIkgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dE1hc2spOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRsZ09ial9HZXREaWFsb2dXaW5kb3coRGlhbG9nT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlXaW5kb3dQdHIgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBXaW5kb3dQdHIgX3J2OwogI2lmbmRlZiBHZXREaWFsb2dXaW5kb3cKLQlQeU1hY19QUkVDSEVDSyhHZXREaWFsb2dXaW5kb3cpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERpYWxvZ1dpbmRvdyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0RGlhbG9nV2luZG93KF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgV2luT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0RGlhbG9nV2luZG93KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdPYmpfR2V0RGlhbG9nVGV4dEVkaXRIYW5kbGUoRGlhbG9nT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlURUhhbmRsZSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFRFSGFuZGxlIF9ydjsKICNpZm5kZWYgR2V0RGlhbG9nVGV4dEVkaXRIYW5kbGUKLQlQeU1hY19QUkVDSEVDSyhHZXREaWFsb2dUZXh0RWRpdEhhbmRsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0RGlhbG9nVGV4dEVkaXRIYW5kbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldERpYWxvZ1RleHRFZGl0SGFuZGxlKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0RGlhbG9nVGV4dEVkaXRIYW5kbGUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRsZ09ial9HZXREaWFsb2dEZWZhdWx0SXRlbShEaWFsb2dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVNJbnQxNiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFNJbnQxNiBfcnY7CiAjaWZuZGVmIEdldERpYWxvZ0RlZmF1bHRJdGVtCi0JUHlNYWNfUFJFQ0hFQ0soR2V0RGlhbG9nRGVmYXVsdEl0ZW0pOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERpYWxvZ0RlZmF1bHRJdGVtKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXREaWFsb2dEZWZhdWx0SXRlbShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0RGlhbG9nRGVmYXVsdEl0ZW0oX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRGxnT2JqX0dldERpYWxvZ0NhbmNlbEl0ZW0oRGlhbG9nT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTSW50MTYgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTSW50MTYgX3J2OwogI2lmbmRlZiBHZXREaWFsb2dDYW5jZWxJdGVtCi0JUHlNYWNfUFJFQ0hFQ0soR2V0RGlhbG9nQ2FuY2VsSXRlbSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0RGlhbG9nQ2FuY2VsSXRlbSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0RGlhbG9nQ2FuY2VsSXRlbShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0RGlhbG9nQ2FuY2VsSXRlbShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdPYmpfR2V0RGlhbG9nS2V5Ym9hcmRGb2N1c0l0ZW0oRGlhbG9nT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTSW50MTYgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTSW50MTYgX3J2OwogI2lmbmRlZiBHZXREaWFsb2dLZXlib2FyZEZvY3VzSXRlbQotCVB5TWFjX1BSRUNIRUNLKEdldERpYWxvZ0tleWJvYXJkRm9jdXNJdGVtKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXREaWFsb2dLZXlib2FyZEZvY3VzSXRlbSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0RGlhbG9nS2V5Ym9hcmRGb2N1c0l0ZW0oX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldERpYWxvZ0tleWJvYXJkRm9jdXNJdGVtKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRsZ09ial9TZXRQb3J0RGlhbG9nUG9ydChEaWFsb2dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgU2V0UG9ydERpYWxvZ1BvcnQKLQlQeU1hY19QUkVDSEVDSyhTZXRQb3J0RGlhbG9nUG9ydCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0UG9ydERpYWxvZ1BvcnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCVNldFBvcnREaWFsb2dQb3J0KF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0UG9ydERpYWxvZ1BvcnQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRsZ09ial9HZXREaWFsb2dQb3J0KERpYWxvZ09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0dyYWZQdHIgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDR3JhZlB0ciBfcnY7CiAjaWZuZGVmIEdldERpYWxvZ1BvcnQKLQlQeU1hY19QUkVDSEVDSyhHZXREaWFsb2dQb3J0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXREaWFsb2dQb3J0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXREaWFsb2dQb3J0KF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgR3JhZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldERpYWxvZ1BvcnQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIERsZ09ial9tZXRob2RzW10gPSB7Ci0JeyJEcmF3RGlhbG9nIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9EcmF3RGlhbG9nLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJVcGRhdGVEaWFsb2ciLCAoUHlDRnVuY3Rpb24pRGxnT2JqX1VwZGF0ZURpYWxvZywgMSwKLQkgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHVwZGF0ZVJnbikgLT4gTm9uZSIpfSwKLQl7IkhpZGVEaWFsb2dJdGVtIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9IaWRlRGlhbG9nSXRlbSwgMSwKLQkgUHlEb2NfU1RSKCIoRGlhbG9nSXRlbUluZGV4IGl0ZW1ObykgLT4gTm9uZSIpfSwKLQl7IlNob3dEaWFsb2dJdGVtIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9TaG93RGlhbG9nSXRlbSwgMSwKLQkgUHlEb2NfU1RSKCIoRGlhbG9nSXRlbUluZGV4IGl0ZW1ObykgLT4gTm9uZSIpfSwKLQl7IkZpbmREaWFsb2dJdGVtIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9GaW5kRGlhbG9nSXRlbSwgMSwKLQkgUHlEb2NfU1RSKCIoUG9pbnQgdGhlUHQpIC0+IChEaWFsb2dJdGVtSW5kZXhaZXJvQmFzZWQgX3J2KSIpfSwKLQl7IkRpYWxvZ0N1dCIsIChQeUNGdW5jdGlvbilEbGdPYmpfRGlhbG9nQ3V0LCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJEaWFsb2dQYXN0ZSIsIChQeUNGdW5jdGlvbilEbGdPYmpfRGlhbG9nUGFzdGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkRpYWxvZ0NvcHkiLCAoUHlDRnVuY3Rpb24pRGxnT2JqX0RpYWxvZ0NvcHksIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkRpYWxvZ0RlbGV0ZSIsIChQeUNGdW5jdGlvbilEbGdPYmpfRGlhbG9nRGVsZXRlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJHZXREaWFsb2dJdGVtIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9HZXREaWFsb2dJdGVtLCAxLAotCSBQeURvY19TVFIoIihEaWFsb2dJdGVtSW5kZXggaXRlbU5vKSAtPiAoRGlhbG9nSXRlbVR5cGUgaXRlbVR5cGUsIEhhbmRsZSBpdGVtLCBSZWN0IGJveCkiKX0sCi0JeyJTZXREaWFsb2dJdGVtIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9TZXREaWFsb2dJdGVtLCAxLAotCSBQeURvY19TVFIoIihEaWFsb2dJdGVtSW5kZXggaXRlbU5vLCBEaWFsb2dJdGVtVHlwZSBpdGVtVHlwZSwgSGFuZGxlIGl0ZW0sIFJlY3QgYm94KSAtPiBOb25lIil9LAotCXsiU2VsZWN0RGlhbG9nSXRlbVRleHQiLCAoUHlDRnVuY3Rpb24pRGxnT2JqX1NlbGVjdERpYWxvZ0l0ZW1UZXh0LCAxLAotCSBQeURvY19TVFIoIihEaWFsb2dJdGVtSW5kZXggaXRlbU5vLCBTSW50MTYgc3RydFNlbCwgU0ludDE2IGVuZFNlbCkgLT4gTm9uZSIpfSwKLQl7IkFwcGVuZERJVEwiLCAoUHlDRnVuY3Rpb24pRGxnT2JqX0FwcGVuZERJVEwsIDEsCi0JIFB5RG9jX1NUUigiKEhhbmRsZSB0aGVIYW5kbGUsIERJVExNZXRob2QgbWV0aG9kKSAtPiBOb25lIil9LAotCXsiQ291bnRESVRMIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9Db3VudERJVEwsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKERpYWxvZ0l0ZW1JbmRleCBfcnYpIil9LAotCXsiU2hvcnRlbkRJVEwiLCAoUHlDRnVuY3Rpb24pRGxnT2JqX1Nob3J0ZW5ESVRMLCAxLAotCSBQeURvY19TVFIoIihEaWFsb2dJdGVtSW5kZXggbnVtYmVySXRlbXMpIC0+IE5vbmUiKX0sCi0JeyJJbnNlcnREaWFsb2dJdGVtIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9JbnNlcnREaWFsb2dJdGVtLCAxLAotCSBQeURvY19TVFIoIihEaWFsb2dJdGVtSW5kZXggYWZ0ZXJJdGVtLCBEaWFsb2dJdGVtVHlwZSBpdGVtVHlwZSwgSGFuZGxlIGl0ZW1IYW5kbGUsIFJlY3QgYm94KSAtPiBOb25lIil9LAotCXsiUmVtb3ZlRGlhbG9nSXRlbXMiLCAoUHlDRnVuY3Rpb24pRGxnT2JqX1JlbW92ZURpYWxvZ0l0ZW1zLCAxLAotCSBQeURvY19TVFIoIihEaWFsb2dJdGVtSW5kZXggaXRlbU5vLCBEaWFsb2dJdGVtSW5kZXggYW1vdW50VG9SZW1vdmUsIEJvb2xlYW4gZGlzcG9zZUl0ZW1EYXRhKSAtPiBOb25lIil9LAotCXsiU3RkRmlsdGVyUHJvYyIsIChQeUNGdW5jdGlvbilEbGdPYmpfU3RkRmlsdGVyUHJvYywgMSwKLQkgUHlEb2NfU1RSKCIoRXZlbnRSZWNvcmQgZXZlbnQsIERpYWxvZ0l0ZW1JbmRleCBpdGVtSGl0KSAtPiAoQm9vbGVhbiBfcnYsIEV2ZW50UmVjb3JkIGV2ZW50LCBEaWFsb2dJdGVtSW5kZXggaXRlbUhpdCkiKX0sCi0JeyJTZXREaWFsb2dEZWZhdWx0SXRlbSIsIChQeUNGdW5jdGlvbilEbGdPYmpfU2V0RGlhbG9nRGVmYXVsdEl0ZW0sIDEsCi0JIFB5RG9jX1NUUigiKERpYWxvZ0l0ZW1JbmRleCBuZXdJdGVtKSAtPiBOb25lIil9LAotCXsiU2V0RGlhbG9nQ2FuY2VsSXRlbSIsIChQeUNGdW5jdGlvbilEbGdPYmpfU2V0RGlhbG9nQ2FuY2VsSXRlbSwgMSwKLQkgUHlEb2NfU1RSKCIoRGlhbG9nSXRlbUluZGV4IG5ld0l0ZW0pIC0+IE5vbmUiKX0sCi0JeyJTZXREaWFsb2dUcmFja3NDdXJzb3IiLCAoUHlDRnVuY3Rpb24pRGxnT2JqX1NldERpYWxvZ1RyYWNrc0N1cnNvciwgMSwKLQkgUHlEb2NfU1RSKCIoQm9vbGVhbiB0cmFja3MpIC0+IE5vbmUiKX0sCi0JeyJBdXRvU2l6ZURpYWxvZyIsIChQeUNGdW5jdGlvbilEbGdPYmpfQXV0b1NpemVEaWFsb2csIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkdldERpYWxvZ0l0ZW1Bc0NvbnRyb2wiLCAoUHlDRnVuY3Rpb24pRGxnT2JqX0dldERpYWxvZ0l0ZW1Bc0NvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiBpbkl0ZW1ObykgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCi0JeyJNb3ZlRGlhbG9nSXRlbSIsIChQeUNGdW5jdGlvbilEbGdPYmpfTW92ZURpYWxvZ0l0ZW0sIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiBpbkl0ZW1ObywgU0ludDE2IGluSG9yaXosIFNJbnQxNiBpblZlcnQpIC0+IE5vbmUiKX0sCi0JeyJTaXplRGlhbG9nSXRlbSIsIChQeUNGdW5jdGlvbilEbGdPYmpfU2l6ZURpYWxvZ0l0ZW0sIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiBpbkl0ZW1ObywgU0ludDE2IGluV2lkdGgsIFNJbnQxNiBpbkhlaWdodCkgLT4gTm9uZSIpfSwKLQl7IkFwcGVuZERpYWxvZ0l0ZW1MaXN0IiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9BcHBlbmREaWFsb2dJdGVtTGlzdCwgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IGRpdGxJRCwgRElUTE1ldGhvZCBtZXRob2QpIC0+IE5vbmUiKX0sCi0JeyJTZXREaWFsb2dUaW1lb3V0IiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9TZXREaWFsb2dUaW1lb3V0LCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgaW5CdXR0b25Ub1ByZXNzLCBVSW50MzIgaW5TZWNvbmRzVG9XYWl0KSAtPiBOb25lIil9LAotCXsiR2V0RGlhbG9nVGltZW91dCIsIChQeUNGdW5jdGlvbilEbGdPYmpfR2V0RGlhbG9nVGltZW91dCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoU0ludDE2IG91dEJ1dHRvblRvUHJlc3MsIFVJbnQzMiBvdXRTZWNvbmRzVG9XYWl0LCBVSW50MzIgb3V0U2Vjb25kc1JlbWFpbmluZykiKX0sCi0JeyJTZXRNb2RhbERpYWxvZ0V2ZW50TWFzayIsIChQeUNGdW5jdGlvbilEbGdPYmpfU2V0TW9kYWxEaWFsb2dFdmVudE1hc2ssIDEsCi0JIFB5RG9jX1NUUigiKEV2ZW50TWFzayBpbk1hc2spIC0+IE5vbmUiKX0sCi0JeyJHZXRNb2RhbERpYWxvZ0V2ZW50TWFzayIsIChQeUNGdW5jdGlvbilEbGdPYmpfR2V0TW9kYWxEaWFsb2dFdmVudE1hc2ssIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEV2ZW50TWFzayBvdXRNYXNrKSIpfSwKLQl7IkdldERpYWxvZ1dpbmRvdyIsIChQeUNGdW5jdGlvbilEbGdPYmpfR2V0RGlhbG9nV2luZG93LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChXaW5kb3dQdHIgX3J2KSIpfSwKLQl7IkdldERpYWxvZ1RleHRFZGl0SGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9HZXREaWFsb2dUZXh0RWRpdEhhbmRsZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVEVIYW5kbGUgX3J2KSIpfSwKLQl7IkdldERpYWxvZ0RlZmF1bHRJdGVtIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9HZXREaWFsb2dEZWZhdWx0SXRlbSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoU0ludDE2IF9ydikiKX0sCi0JeyJHZXREaWFsb2dDYW5jZWxJdGVtIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9HZXREaWFsb2dDYW5jZWxJdGVtLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChTSW50MTYgX3J2KSIpfSwKLQl7IkdldERpYWxvZ0tleWJvYXJkRm9jdXNJdGVtIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9HZXREaWFsb2dLZXlib2FyZEZvY3VzSXRlbSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoU0ludDE2IF9ydikiKX0sCi0JeyJTZXRQb3J0RGlhbG9nUG9ydCIsIChQeUNGdW5jdGlvbilEbGdPYmpfU2V0UG9ydERpYWxvZ1BvcnQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkdldERpYWxvZ1BvcnQiLCAoUHlDRnVuY3Rpb24pRGxnT2JqX0dldERpYWxvZ1BvcnQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENHcmFmUHRyIF9ydikiKX0sCi0Je05VTEwsIE5VTEwsIDB9CisgICAgeyJEcmF3RGlhbG9nIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9EcmF3RGlhbG9nLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJVcGRhdGVEaWFsb2ciLCAoUHlDRnVuY3Rpb24pRGxnT2JqX1VwZGF0ZURpYWxvZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHVwZGF0ZVJnbikgLT4gTm9uZSIpfSwKKyAgICB7IkhpZGVEaWFsb2dJdGVtIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9IaWRlRGlhbG9nSXRlbSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGlhbG9nSXRlbUluZGV4IGl0ZW1ObykgLT4gTm9uZSIpfSwKKyAgICB7IlNob3dEaWFsb2dJdGVtIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9TaG93RGlhbG9nSXRlbSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGlhbG9nSXRlbUluZGV4IGl0ZW1ObykgLT4gTm9uZSIpfSwKKyAgICB7IkZpbmREaWFsb2dJdGVtIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9GaW5kRGlhbG9nSXRlbSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgdGhlUHQpIC0+IChEaWFsb2dJdGVtSW5kZXhaZXJvQmFzZWQgX3J2KSIpfSwKKyAgICB7IkRpYWxvZ0N1dCIsIChQeUNGdW5jdGlvbilEbGdPYmpfRGlhbG9nQ3V0LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJEaWFsb2dQYXN0ZSIsIChQeUNGdW5jdGlvbilEbGdPYmpfRGlhbG9nUGFzdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkRpYWxvZ0NvcHkiLCAoUHlDRnVuY3Rpb24pRGxnT2JqX0RpYWxvZ0NvcHksIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkRpYWxvZ0RlbGV0ZSIsIChQeUNGdW5jdGlvbilEbGdPYmpfRGlhbG9nRGVsZXRlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJHZXREaWFsb2dJdGVtIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9HZXREaWFsb2dJdGVtLCAxLAorICAgICBQeURvY19TVFIoIihEaWFsb2dJdGVtSW5kZXggaXRlbU5vKSAtPiAoRGlhbG9nSXRlbVR5cGUgaXRlbVR5cGUsIEhhbmRsZSBpdGVtLCBSZWN0IGJveCkiKX0sCisgICAgeyJTZXREaWFsb2dJdGVtIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9TZXREaWFsb2dJdGVtLCAxLAorICAgICBQeURvY19TVFIoIihEaWFsb2dJdGVtSW5kZXggaXRlbU5vLCBEaWFsb2dJdGVtVHlwZSBpdGVtVHlwZSwgSGFuZGxlIGl0ZW0sIFJlY3QgYm94KSAtPiBOb25lIil9LAorICAgIHsiU2VsZWN0RGlhbG9nSXRlbVRleHQiLCAoUHlDRnVuY3Rpb24pRGxnT2JqX1NlbGVjdERpYWxvZ0l0ZW1UZXh0LCAxLAorICAgICBQeURvY19TVFIoIihEaWFsb2dJdGVtSW5kZXggaXRlbU5vLCBTSW50MTYgc3RydFNlbCwgU0ludDE2IGVuZFNlbCkgLT4gTm9uZSIpfSwKKyAgICB7IkFwcGVuZERJVEwiLCAoUHlDRnVuY3Rpb24pRGxnT2JqX0FwcGVuZERJVEwsIDEsCisgICAgIFB5RG9jX1NUUigiKEhhbmRsZSB0aGVIYW5kbGUsIERJVExNZXRob2QgbWV0aG9kKSAtPiBOb25lIil9LAorICAgIHsiQ291bnRESVRMIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9Db3VudERJVEwsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKERpYWxvZ0l0ZW1JbmRleCBfcnYpIil9LAorICAgIHsiU2hvcnRlbkRJVEwiLCAoUHlDRnVuY3Rpb24pRGxnT2JqX1Nob3J0ZW5ESVRMLCAxLAorICAgICBQeURvY19TVFIoIihEaWFsb2dJdGVtSW5kZXggbnVtYmVySXRlbXMpIC0+IE5vbmUiKX0sCisgICAgeyJJbnNlcnREaWFsb2dJdGVtIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9JbnNlcnREaWFsb2dJdGVtLCAxLAorICAgICBQeURvY19TVFIoIihEaWFsb2dJdGVtSW5kZXggYWZ0ZXJJdGVtLCBEaWFsb2dJdGVtVHlwZSBpdGVtVHlwZSwgSGFuZGxlIGl0ZW1IYW5kbGUsIFJlY3QgYm94KSAtPiBOb25lIil9LAorICAgIHsiUmVtb3ZlRGlhbG9nSXRlbXMiLCAoUHlDRnVuY3Rpb24pRGxnT2JqX1JlbW92ZURpYWxvZ0l0ZW1zLCAxLAorICAgICBQeURvY19TVFIoIihEaWFsb2dJdGVtSW5kZXggaXRlbU5vLCBEaWFsb2dJdGVtSW5kZXggYW1vdW50VG9SZW1vdmUsIEJvb2xlYW4gZGlzcG9zZUl0ZW1EYXRhKSAtPiBOb25lIil9LAorICAgIHsiU3RkRmlsdGVyUHJvYyIsIChQeUNGdW5jdGlvbilEbGdPYmpfU3RkRmlsdGVyUHJvYywgMSwKKyAgICAgUHlEb2NfU1RSKCIoRXZlbnRSZWNvcmQgZXZlbnQsIERpYWxvZ0l0ZW1JbmRleCBpdGVtSGl0KSAtPiAoQm9vbGVhbiBfcnYsIEV2ZW50UmVjb3JkIGV2ZW50LCBEaWFsb2dJdGVtSW5kZXggaXRlbUhpdCkiKX0sCisgICAgeyJTZXREaWFsb2dEZWZhdWx0SXRlbSIsIChQeUNGdW5jdGlvbilEbGdPYmpfU2V0RGlhbG9nRGVmYXVsdEl0ZW0sIDEsCisgICAgIFB5RG9jX1NUUigiKERpYWxvZ0l0ZW1JbmRleCBuZXdJdGVtKSAtPiBOb25lIil9LAorICAgIHsiU2V0RGlhbG9nQ2FuY2VsSXRlbSIsIChQeUNGdW5jdGlvbilEbGdPYmpfU2V0RGlhbG9nQ2FuY2VsSXRlbSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGlhbG9nSXRlbUluZGV4IG5ld0l0ZW0pIC0+IE5vbmUiKX0sCisgICAgeyJTZXREaWFsb2dUcmFja3NDdXJzb3IiLCAoUHlDRnVuY3Rpb24pRGxnT2JqX1NldERpYWxvZ1RyYWNrc0N1cnNvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQm9vbGVhbiB0cmFja3MpIC0+IE5vbmUiKX0sCisgICAgeyJBdXRvU2l6ZURpYWxvZyIsIChQeUNGdW5jdGlvbilEbGdPYmpfQXV0b1NpemVEaWFsb2csIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldERpYWxvZ0l0ZW1Bc0NvbnRyb2wiLCAoUHlDRnVuY3Rpb24pRGxnT2JqX0dldERpYWxvZ0l0ZW1Bc0NvbnRyb2wsIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiBpbkl0ZW1ObykgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCisgICAgeyJNb3ZlRGlhbG9nSXRlbSIsIChQeUNGdW5jdGlvbilEbGdPYmpfTW92ZURpYWxvZ0l0ZW0sIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiBpbkl0ZW1ObywgU0ludDE2IGluSG9yaXosIFNJbnQxNiBpblZlcnQpIC0+IE5vbmUiKX0sCisgICAgeyJTaXplRGlhbG9nSXRlbSIsIChQeUNGdW5jdGlvbilEbGdPYmpfU2l6ZURpYWxvZ0l0ZW0sIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiBpbkl0ZW1ObywgU0ludDE2IGluV2lkdGgsIFNJbnQxNiBpbkhlaWdodCkgLT4gTm9uZSIpfSwKKyAgICB7IkFwcGVuZERpYWxvZ0l0ZW1MaXN0IiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9BcHBlbmREaWFsb2dJdGVtTGlzdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IGRpdGxJRCwgRElUTE1ldGhvZCBtZXRob2QpIC0+IE5vbmUiKX0sCisgICAgeyJTZXREaWFsb2dUaW1lb3V0IiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9TZXREaWFsb2dUaW1lb3V0LCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgaW5CdXR0b25Ub1ByZXNzLCBVSW50MzIgaW5TZWNvbmRzVG9XYWl0KSAtPiBOb25lIil9LAorICAgIHsiR2V0RGlhbG9nVGltZW91dCIsIChQeUNGdW5jdGlvbilEbGdPYmpfR2V0RGlhbG9nVGltZW91dCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoU0ludDE2IG91dEJ1dHRvblRvUHJlc3MsIFVJbnQzMiBvdXRTZWNvbmRzVG9XYWl0LCBVSW50MzIgb3V0U2Vjb25kc1JlbWFpbmluZykiKX0sCisgICAgeyJTZXRNb2RhbERpYWxvZ0V2ZW50TWFzayIsIChQeUNGdW5jdGlvbilEbGdPYmpfU2V0TW9kYWxEaWFsb2dFdmVudE1hc2ssIDEsCisgICAgIFB5RG9jX1NUUigiKEV2ZW50TWFzayBpbk1hc2spIC0+IE5vbmUiKX0sCisgICAgeyJHZXRNb2RhbERpYWxvZ0V2ZW50TWFzayIsIChQeUNGdW5jdGlvbilEbGdPYmpfR2V0TW9kYWxEaWFsb2dFdmVudE1hc2ssIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEV2ZW50TWFzayBvdXRNYXNrKSIpfSwKKyAgICB7IkdldERpYWxvZ1dpbmRvdyIsIChQeUNGdW5jdGlvbilEbGdPYmpfR2V0RGlhbG9nV2luZG93LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChXaW5kb3dQdHIgX3J2KSIpfSwKKyAgICB7IkdldERpYWxvZ1RleHRFZGl0SGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9HZXREaWFsb2dUZXh0RWRpdEhhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVEVIYW5kbGUgX3J2KSIpfSwKKyAgICB7IkdldERpYWxvZ0RlZmF1bHRJdGVtIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9HZXREaWFsb2dEZWZhdWx0SXRlbSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoU0ludDE2IF9ydikiKX0sCisgICAgeyJHZXREaWFsb2dDYW5jZWxJdGVtIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9HZXREaWFsb2dDYW5jZWxJdGVtLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChTSW50MTYgX3J2KSIpfSwKKyAgICB7IkdldERpYWxvZ0tleWJvYXJkRm9jdXNJdGVtIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9HZXREaWFsb2dLZXlib2FyZEZvY3VzSXRlbSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoU0ludDE2IF9ydikiKX0sCisgICAgeyJTZXRQb3J0RGlhbG9nUG9ydCIsIChQeUNGdW5jdGlvbilEbGdPYmpfU2V0UG9ydERpYWxvZ1BvcnQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldERpYWxvZ1BvcnQiLCAoUHlDRnVuY3Rpb24pRGxnT2JqX0dldERpYWxvZ1BvcnQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENHcmFmUHRyIF9ydikiKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAjZGVmaW5lIERsZ09ial9nZXRzZXRsaXN0IE5VTEwKQEAgLTk0NSwxNiArOTQ1LDE2IEBACiAKIHN0YXRpYyBpbnQgRGxnT2JqX2NvbXBhcmUoRGlhbG9nT2JqZWN0ICpzZWxmLCBEaWFsb2dPYmplY3QgKm90aGVyKQogewotCWlmICggc2VsZi0+b2JfaXRzZWxmID4gb3RoZXItPm9iX2l0c2VsZiApIHJldHVybiAxOwotCWlmICggc2VsZi0+b2JfaXRzZWxmIDwgb3RoZXItPm9iX2l0c2VsZiApIHJldHVybiAtMTsKLQlyZXR1cm4gMDsKKyAgICBpZiAoIHNlbGYtPm9iX2l0c2VsZiA+IG90aGVyLT5vYl9pdHNlbGYgKSByZXR1cm4gMTsKKyAgICBpZiAoIHNlbGYtPm9iX2l0c2VsZiA8IG90aGVyLT5vYl9pdHNlbGYgKSByZXR1cm4gLTE7CisgICAgcmV0dXJuIDA7CiB9CiAKICNkZWZpbmUgRGxnT2JqX3JlcHIgTlVMTAogCiBzdGF0aWMgaW50IERsZ09ial9oYXNoKERpYWxvZ09iamVjdCAqc2VsZikKIHsKLQlyZXR1cm4gKGludClzZWxmLT5vYl9pdHNlbGY7CisgICAgcmV0dXJuIChpbnQpc2VsZi0+b2JfaXRzZWxmOwogfQogI2RlZmluZSBEbGdPYmpfdHBfaW5pdCAwCiAKQEAgLTk2Miw2MSArOTYyLDYxIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqRGxnT2JqX3RwX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICpfYXJncywgUHlPYmplY3QgKl9rd2RzKQogewotCVB5T2JqZWN0ICpfc2VsZjsKLQlEaWFsb2dQdHIgaXRzZWxmOwotCWNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OworICAgIFB5T2JqZWN0ICpfc2VsZjsKKyAgICBEaWFsb2dQdHIgaXRzZWxmOworICAgIGNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgRGxnT2JqX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKLQlpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOwotCSgoRGlhbG9nT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JcmV0dXJuIF9zZWxmOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIERsZ09ial9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAoKERpYWxvZ09iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIHJldHVybiBfc2VsZjsKIH0KIAogI2RlZmluZSBEbGdPYmpfdHBfZnJlZSBQeU9iamVjdF9EZWwKIAogCiBQeVR5cGVPYmplY3QgRGlhbG9nX1R5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCi0JMCwgLypvYl9zaXplKi8KLQkiX0RsZy5EaWFsb2ciLCAvKnRwX25hbWUqLwotCXNpemVvZihEaWFsb2dPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCi0JMCwgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKSBEbGdPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KLQkwLCAvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykgRGxnT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCi0JKHJlcHJmdW5jKSBEbGdPYmpfcmVwciwgLyp0cF9yZXByKi8KLQkoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCi0JKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpIERsZ09ial9oYXNoLCAvKnRwX2hhc2gqLwotCTAsIC8qdHBfY2FsbCovCi0JMCwgLyp0cF9zdHIqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KLQlQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLwotCTAsIC8qdHBfYXNfYnVmZmVyKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQkwLCAvKnRwX2RvYyovCi0JMCwgLyp0cF90cmF2ZXJzZSovCi0JMCwgLyp0cF9jbGVhciovCi0JMCwgLyp0cF9yaWNoY29tcGFyZSovCi0JMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCi0JMCwgLyp0cF9pdGVyKi8KLQkwLCAvKnRwX2l0ZXJuZXh0Ki8KLQlEbGdPYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLwotCTAsIC8qdHBfbWVtYmVycyovCi0JRGxnT2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KLQkwLCAvKnRwX2Jhc2UqLwotCTAsIC8qdHBfZGljdCovCi0JMCwgLyp0cF9kZXNjcl9nZXQqLwotCTAsIC8qdHBfZGVzY3Jfc2V0Ki8KLQkwLCAvKnRwX2RpY3RvZmZzZXQqLwotCURsZ09ial90cF9pbml0LCAvKiB0cF9pbml0ICovCi0JRGxnT2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLwotCURsZ09ial90cF9uZXcsIC8qIHRwX25ldyAqLwotCURsZ09ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgLypvYl9zaXplKi8KKyAgICAiX0RsZy5EaWFsb2ciLCAvKnRwX25hbWUqLworICAgIHNpemVvZihEaWFsb2dPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKSBEbGdPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KKyAgICAoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KKyAgICAoY21wZnVuYykgRGxnT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCisgICAgKHJlcHJmdW5jKSBEbGdPYmpfcmVwciwgLyp0cF9yZXByKi8KKyAgICAoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCisgICAgKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAoaGFzaGZ1bmMpIERsZ09ial9oYXNoLCAvKnRwX2hhc2gqLworICAgIDAsIC8qdHBfY2FsbCovCisgICAgMCwgLyp0cF9zdHIqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KKyAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLworICAgIDAsIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAvKnRwX2RvYyovCisgICAgMCwgLyp0cF90cmF2ZXJzZSovCisgICAgMCwgLyp0cF9jbGVhciovCisgICAgMCwgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgLyp0cF9pdGVyKi8KKyAgICAwLCAvKnRwX2l0ZXJuZXh0Ki8KKyAgICBEbGdPYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLworICAgIDAsIC8qdHBfbWVtYmVycyovCisgICAgRGxnT2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KKyAgICAwLCAvKnRwX2Jhc2UqLworICAgIDAsIC8qdHBfZGljdCovCisgICAgMCwgLyp0cF9kZXNjcl9nZXQqLworICAgIDAsIC8qdHBfZGVzY3Jfc2V0Ki8KKyAgICAwLCAvKnRwX2RpY3RvZmZzZXQqLworICAgIERsZ09ial90cF9pbml0LCAvKiB0cF9pbml0ICovCisgICAgRGxnT2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLworICAgIERsZ09ial90cF9uZXcsIC8qIHRwX25ldyAqLworICAgIERsZ09ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gRW5kIG9iamVjdCB0eXBlIERpYWxvZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTEwMjQsNTAzICsxMDI0LDUwMyBAQAogCiBzdGF0aWMgUHlPYmplY3QgKkRsZ19OZXdEaWFsb2coUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCURpYWxvZ1B0ciBfcnY7Ci0JUmVjdCBib3VuZHNSZWN0OwotCVN0cjI1NSB0aXRsZTsKLQlCb29sZWFuIHZpc2libGU7Ci0JU0ludDE2IHByb2NJRDsKLQlXaW5kb3dQdHIgYmVoaW5kOwotCUJvb2xlYW4gZ29Bd2F5RmxhZzsKLQlTSW50MzIgcmVmQ29uOwotCUhhbmRsZSBpdGVtczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgRGlhbG9nUHRyIF9ydjsKKyAgICBSZWN0IGJvdW5kc1JlY3Q7CisgICAgU3RyMjU1IHRpdGxlOworICAgIEJvb2xlYW4gdmlzaWJsZTsKKyAgICBTSW50MTYgcHJvY0lEOworICAgIFdpbmRvd1B0ciBiZWhpbmQ7CisgICAgQm9vbGVhbiBnb0F3YXlGbGFnOworICAgIFNJbnQzMiByZWZDb247CisgICAgSGFuZGxlIGl0ZW1zOwogI2lmbmRlZiBOZXdEaWFsb2cKLQlQeU1hY19QUkVDSEVDSyhOZXdEaWFsb2cpOworICAgIFB5TWFjX1BSRUNIRUNLKE5ld0RpYWxvZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mYmhPJmJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCB0aXRsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZpc2libGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZwcm9jSUQsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmYmVoaW5kLAotCSAgICAgICAgICAgICAgICAgICAgICAmZ29Bd2F5RmxhZywKLQkgICAgICAgICAgICAgICAgICAgICAgJnJlZkNvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZpdGVtcykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE5ld0RpYWxvZygodm9pZCAqKTAsCi0JICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICB0aXRsZSwKLQkgICAgICAgICAgICAgICAgdmlzaWJsZSwKLQkgICAgICAgICAgICAgICAgcHJvY0lELAotCSAgICAgICAgICAgICAgICBiZWhpbmQsCi0JICAgICAgICAgICAgICAgIGdvQXdheUZsYWcsCi0JICAgICAgICAgICAgICAgIHJlZkNvbiwKLQkgICAgICAgICAgICAgICAgaXRlbXMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgRGxnT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mYmhPJmJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCB0aXRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZpc2libGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwcm9jSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmYmVoaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZ29Bd2F5RmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZkNvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZpdGVtcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE5ld0RpYWxvZygodm9pZCAqKTAsCisgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICB0aXRsZSwKKyAgICAgICAgICAgICAgICAgICAgdmlzaWJsZSwKKyAgICAgICAgICAgICAgICAgICAgcHJvY0lELAorICAgICAgICAgICAgICAgICAgICBiZWhpbmQsCisgICAgICAgICAgICAgICAgICAgIGdvQXdheUZsYWcsCisgICAgICAgICAgICAgICAgICAgIHJlZkNvbiwKKyAgICAgICAgICAgICAgICAgICAgaXRlbXMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRGxnT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdfR2V0TmV3RGlhbG9nKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlEaWFsb2dQdHIgX3J2OwotCVNJbnQxNiBkaWFsb2dJRDsKLQlXaW5kb3dQdHIgYmVoaW5kOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBEaWFsb2dQdHIgX3J2OworICAgIFNJbnQxNiBkaWFsb2dJRDsKKyAgICBXaW5kb3dQdHIgYmVoaW5kOwogI2lmbmRlZiBHZXROZXdEaWFsb2cKLQlQeU1hY19QUkVDSEVDSyhHZXROZXdEaWFsb2cpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE5ld0RpYWxvZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGlhbG9nSUQsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmYmVoaW5kKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TmV3RGlhbG9nKGRpYWxvZ0lELAotCSAgICAgICAgICAgICAgICAgICAodm9pZCAqKTAsCi0JICAgICAgICAgICAgICAgICAgIGJlaGluZCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBEbGdPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkaWFsb2dJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZiZWhpbmQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXROZXdEaWFsb2coZGlhbG9nSUQsCisgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopMCwKKyAgICAgICAgICAgICAgICAgICAgICAgYmVoaW5kKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIERsZ09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRGxnX05ld0NvbG9yRGlhbG9nKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlEaWFsb2dQdHIgX3J2OwotCVJlY3QgYm91bmRzUmVjdDsKLQlTdHIyNTUgdGl0bGU7Ci0JQm9vbGVhbiB2aXNpYmxlOwotCVNJbnQxNiBwcm9jSUQ7Ci0JV2luZG93UHRyIGJlaGluZDsKLQlCb29sZWFuIGdvQXdheUZsYWc7Ci0JU0ludDMyIHJlZkNvbjsKLQlIYW5kbGUgaXRlbXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIERpYWxvZ1B0ciBfcnY7CisgICAgUmVjdCBib3VuZHNSZWN0OworICAgIFN0cjI1NSB0aXRsZTsKKyAgICBCb29sZWFuIHZpc2libGU7CisgICAgU0ludDE2IHByb2NJRDsKKyAgICBXaW5kb3dQdHIgYmVoaW5kOworICAgIEJvb2xlYW4gZ29Bd2F5RmxhZzsKKyAgICBTSW50MzIgcmVmQ29uOworICAgIEhhbmRsZSBpdGVtczsKICNpZm5kZWYgTmV3Q29sb3JEaWFsb2cKLQlQeU1hY19QUkVDSEVDSyhOZXdDb2xvckRpYWxvZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTmV3Q29sb3JEaWFsb2cpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmJoTyZibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgdGl0bGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2aXNpYmxlLAotCSAgICAgICAgICAgICAgICAgICAgICAmcHJvY0lELAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmJlaGluZCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmdvQXdheUZsYWcsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZWZDb24sCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaXRlbXMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBOZXdDb2xvckRpYWxvZygodm9pZCAqKTAsCi0JICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgdGl0bGUsCi0JICAgICAgICAgICAgICAgICAgICAgdmlzaWJsZSwKLQkgICAgICAgICAgICAgICAgICAgICBwcm9jSUQsCi0JICAgICAgICAgICAgICAgICAgICAgYmVoaW5kLAotCSAgICAgICAgICAgICAgICAgICAgIGdvQXdheUZsYWcsCi0JICAgICAgICAgICAgICAgICAgICAgcmVmQ29uLAotCSAgICAgICAgICAgICAgICAgICAgIGl0ZW1zKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIERsZ09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmJoTyZibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgdGl0bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2aXNpYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJvY0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmJlaGluZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmdvQXdheUZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWZDb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaXRlbXMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBOZXdDb2xvckRpYWxvZygodm9pZCAqKTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdmlzaWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgYmVoaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgIGdvQXdheUZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVmQ29uLAorICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIERsZ09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRGxnX01vZGFsRGlhbG9nKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQeU9iamVjdCogbW9kYWxGaWx0ZXI7Ci0JRGlhbG9nSXRlbUluZGV4IGl0ZW1IaXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0KiBtb2RhbEZpbHRlcjsKKyAgICBEaWFsb2dJdGVtSW5kZXggaXRlbUhpdDsKICNpZm5kZWYgTW9kYWxEaWFsb2cKLQlQeU1hY19QUkVDSEVDSyhNb2RhbERpYWxvZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTW9kYWxEaWFsb2cpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyIsCi0JICAgICAgICAgICAgICAgICAgICAgICZtb2RhbEZpbHRlcikpCi0JCXJldHVybiBOVUxMOwotCU1vZGFsRGlhbG9nKERsZ19QYXNzRmlsdGVyUHJvYyhtb2RhbEZpbHRlciksCi0JICAgICAgICAgICAgJml0ZW1IaXQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBpdGVtSGl0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGFsRmlsdGVyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTW9kYWxEaWFsb2coRGxnX1Bhc3NGaWx0ZXJQcm9jKG1vZGFsRmlsdGVyKSwKKyAgICAgICAgICAgICAgICAmaXRlbUhpdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1IaXQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRsZ19Jc0RpYWxvZ0V2ZW50KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlFdmVudFJlY29yZCB0aGVFdmVudDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgRXZlbnRSZWNvcmQgdGhlRXZlbnQ7CiAjaWZuZGVmIElzRGlhbG9nRXZlbnQKLQlQeU1hY19QUkVDSEVDSyhJc0RpYWxvZ0V2ZW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhJc0RpYWxvZ0V2ZW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RXZlbnRSZWNvcmQsICZ0aGVFdmVudCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IElzRGlhbG9nRXZlbnQoJnRoZUV2ZW50KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEV2ZW50UmVjb3JkLCAmdGhlRXZlbnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBJc0RpYWxvZ0V2ZW50KCZ0aGVFdmVudCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRGxnX0RpYWxvZ1NlbGVjdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JRXZlbnRSZWNvcmQgdGhlRXZlbnQ7Ci0JRGlhbG9nUHRyIHRoZURpYWxvZzsKLQlEaWFsb2dJdGVtSW5kZXggaXRlbUhpdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgRXZlbnRSZWNvcmQgdGhlRXZlbnQ7CisgICAgRGlhbG9nUHRyIHRoZURpYWxvZzsKKyAgICBEaWFsb2dJdGVtSW5kZXggaXRlbUhpdDsKICNpZm5kZWYgRGlhbG9nU2VsZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soRGlhbG9nU2VsZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhEaWFsb2dTZWxlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRFdmVudFJlY29yZCwgJnRoZUV2ZW50KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGlhbG9nU2VsZWN0KCZ0aGVFdmVudCwKLQkgICAgICAgICAgICAgICAgICAgJnRoZURpYWxvZywKLQkgICAgICAgICAgICAgICAgICAgJml0ZW1IaXQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgRGxnT2JqX1doaWNoRGlhbG9nLCB0aGVEaWFsb2csCi0JICAgICAgICAgICAgICAgICAgICAgaXRlbUhpdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRFdmVudFJlY29yZCwgJnRoZUV2ZW50KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRGlhbG9nU2VsZWN0KCZ0aGVFdmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgJnRoZURpYWxvZywKKyAgICAgICAgICAgICAgICAgICAgICAgJml0ZW1IaXQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgRGxnT2JqX1doaWNoRGlhbG9nLCB0aGVEaWFsb2csCisgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbUhpdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRGxnX0FsZXJ0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlEaWFsb2dJdGVtSW5kZXggX3J2OwotCVNJbnQxNiBhbGVydElEOwotCVB5T2JqZWN0KiBtb2RhbEZpbHRlcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgRGlhbG9nSXRlbUluZGV4IF9ydjsKKyAgICBTSW50MTYgYWxlcnRJRDsKKyAgICBQeU9iamVjdCogbW9kYWxGaWx0ZXI7CiAjaWZuZGVmIEFsZXJ0Ci0JUHlNYWNfUFJFQ0hFQ0soQWxlcnQpOworICAgIFB5TWFjX1BSRUNIRUNLKEFsZXJ0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmFsZXJ0SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICZtb2RhbEZpbHRlcikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEFsZXJ0KGFsZXJ0SUQsCi0JICAgICAgICAgICAgRGxnX1Bhc3NGaWx0ZXJQcm9jKG1vZGFsRmlsdGVyKSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYWxlcnRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGFsRmlsdGVyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQWxlcnQoYWxlcnRJRCwKKyAgICAgICAgICAgICAgICBEbGdfUGFzc0ZpbHRlclByb2MobW9kYWxGaWx0ZXIpKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdfU3RvcEFsZXJ0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlEaWFsb2dJdGVtSW5kZXggX3J2OwotCVNJbnQxNiBhbGVydElEOwotCVB5T2JqZWN0KiBtb2RhbEZpbHRlcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgRGlhbG9nSXRlbUluZGV4IF9ydjsKKyAgICBTSW50MTYgYWxlcnRJRDsKKyAgICBQeU9iamVjdCogbW9kYWxGaWx0ZXI7CiAjaWZuZGVmIFN0b3BBbGVydAotCVB5TWFjX1BSRUNIRUNLKFN0b3BBbGVydCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU3RvcEFsZXJ0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmFsZXJ0SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICZtb2RhbEZpbHRlcikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFN0b3BBbGVydChhbGVydElELAotCSAgICAgICAgICAgICAgICBEbGdfUGFzc0ZpbHRlclByb2MobW9kYWxGaWx0ZXIpKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhbGVydElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbW9kYWxGaWx0ZXIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTdG9wQWxlcnQoYWxlcnRJRCwKKyAgICAgICAgICAgICAgICAgICAgRGxnX1Bhc3NGaWx0ZXJQcm9jKG1vZGFsRmlsdGVyKSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRGxnX05vdGVBbGVydChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JRGlhbG9nSXRlbUluZGV4IF9ydjsKLQlTSW50MTYgYWxlcnRJRDsKLQlQeU9iamVjdCogbW9kYWxGaWx0ZXI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIERpYWxvZ0l0ZW1JbmRleCBfcnY7CisgICAgU0ludDE2IGFsZXJ0SUQ7CisgICAgUHlPYmplY3QqIG1vZGFsRmlsdGVyOwogI2lmbmRlZiBOb3RlQWxlcnQKLQlQeU1hY19QUkVDSEVDSyhOb3RlQWxlcnQpOworICAgIFB5TWFjX1BSRUNIRUNLKE5vdGVBbGVydCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyIsCi0JICAgICAgICAgICAgICAgICAgICAgICZhbGVydElELAotCSAgICAgICAgICAgICAgICAgICAgICAmbW9kYWxGaWx0ZXIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBOb3RlQWxlcnQoYWxlcnRJRCwKLQkgICAgICAgICAgICAgICAgRGxnX1Bhc3NGaWx0ZXJQcm9jKG1vZGFsRmlsdGVyKSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYWxlcnRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGFsRmlsdGVyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTm90ZUFsZXJ0KGFsZXJ0SUQsCisgICAgICAgICAgICAgICAgICAgIERsZ19QYXNzRmlsdGVyUHJvYyhtb2RhbEZpbHRlcikpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRsZ19DYXV0aW9uQWxlcnQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCURpYWxvZ0l0ZW1JbmRleCBfcnY7Ci0JU0ludDE2IGFsZXJ0SUQ7Ci0JUHlPYmplY3QqIG1vZGFsRmlsdGVyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBEaWFsb2dJdGVtSW5kZXggX3J2OworICAgIFNJbnQxNiBhbGVydElEOworICAgIFB5T2JqZWN0KiBtb2RhbEZpbHRlcjsKICNpZm5kZWYgQ2F1dGlvbkFsZXJ0Ci0JUHlNYWNfUFJFQ0hFQ0soQ2F1dGlvbkFsZXJ0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhDYXV0aW9uQWxlcnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8iLAotCSAgICAgICAgICAgICAgICAgICAgICAmYWxlcnRJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vZGFsRmlsdGVyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ2F1dGlvbkFsZXJ0KGFsZXJ0SUQsCi0JICAgICAgICAgICAgICAgICAgIERsZ19QYXNzRmlsdGVyUHJvYyhtb2RhbEZpbHRlcikpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFsZXJ0SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtb2RhbEZpbHRlcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENhdXRpb25BbGVydChhbGVydElELAorICAgICAgICAgICAgICAgICAgICAgICBEbGdfUGFzc0ZpbHRlclByb2MobW9kYWxGaWx0ZXIpKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdfUGFyYW1UZXh0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTdHIyNTUgcGFyYW0wOwotCVN0cjI1NSBwYXJhbTE7Ci0JU3RyMjU1IHBhcmFtMjsKLQlTdHIyNTUgcGFyYW0zOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTdHIyNTUgcGFyYW0wOworICAgIFN0cjI1NSBwYXJhbTE7CisgICAgU3RyMjU1IHBhcmFtMjsKKyAgICBTdHIyNTUgcGFyYW0zOwogI2lmbmRlZiBQYXJhbVRleHQKLQlQeU1hY19QUkVDSEVDSyhQYXJhbVRleHQpOworICAgIFB5TWFjX1BSRUNIRUNLKFBhcmFtVGV4dCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgcGFyYW0wLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIHBhcmFtMSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBwYXJhbTIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgcGFyYW0zKSkKLQkJcmV0dXJuIE5VTEw7Ci0JUGFyYW1UZXh0KHBhcmFtMCwKLQkgICAgICAgICAgcGFyYW0xLAotCSAgICAgICAgICBwYXJhbTIsCi0JICAgICAgICAgIHBhcmFtMyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBwYXJhbTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgcGFyYW0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIHBhcmFtMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBwYXJhbTMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQYXJhbVRleHQocGFyYW0wLAorICAgICAgICAgICAgICBwYXJhbTEsCisgICAgICAgICAgICAgIHBhcmFtMiwKKyAgICAgICAgICAgICAgcGFyYW0zKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRGxnX0dldERpYWxvZ0l0ZW1UZXh0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlIYW5kbGUgaXRlbTsKLQlTdHIyNTUgdGV4dDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgSGFuZGxlIGl0ZW07CisgICAgU3RyMjU1IHRleHQ7CiAjaWZuZGVmIEdldERpYWxvZ0l0ZW1UZXh0Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0RGlhbG9nSXRlbVRleHQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERpYWxvZ0l0ZW1UZXh0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZpdGVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0RGlhbG9nSXRlbVRleHQoaXRlbSwKLQkgICAgICAgICAgICAgICAgICB0ZXh0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkU3RyMjU1LCB0ZXh0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaXRlbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldERpYWxvZ0l0ZW1UZXh0KGl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgdGV4dCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFN0cjI1NSwgdGV4dCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRGxnX1NldERpYWxvZ0l0ZW1UZXh0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlIYW5kbGUgaXRlbTsKLQlTdHIyNTUgdGV4dDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgSGFuZGxlIGl0ZW07CisgICAgU3RyMjU1IHRleHQ7CiAjaWZuZGVmIFNldERpYWxvZ0l0ZW1UZXh0Ci0JUHlNYWNfUFJFQ0hFQ0soU2V0RGlhbG9nSXRlbVRleHQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldERpYWxvZ0l0ZW1UZXh0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJml0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgdGV4dCkpCi0JCXJldHVybiBOVUxMOwotCVNldERpYWxvZ0l0ZW1UZXh0KGl0ZW0sCi0JICAgICAgICAgICAgICAgICAgdGV4dCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJml0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgdGV4dCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldERpYWxvZ0l0ZW1UZXh0KGl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgdGV4dCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRsZ19HZXRBbGVydFN0YWdlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTSW50MTYgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTSW50MTYgX3J2OwogI2lmbmRlZiBHZXRBbGVydFN0YWdlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0QWxlcnRTdGFnZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0QWxlcnRTdGFnZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0QWxlcnRTdGFnZSgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRBbGVydFN0YWdlKCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRGxnX1NldERpYWxvZ0ZvbnQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVNJbnQxNiBmb250TnVtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTSW50MTYgZm9udE51bTsKICNpZm5kZWYgU2V0RGlhbG9nRm9udAotCVB5TWFjX1BSRUNIRUNLKFNldERpYWxvZ0ZvbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldERpYWxvZ0ZvbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZmb250TnVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0RGlhbG9nRm9udChmb250TnVtKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmb250TnVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0RGlhbG9nRm9udChmb250TnVtKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRGxnX1Jlc2V0QWxlcnRTdGFnZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBSZXNldEFsZXJ0U3RhZ2UKLQlQeU1hY19QUkVDSEVDSyhSZXNldEFsZXJ0U3RhZ2UpOworICAgIFB5TWFjX1BSRUNIRUNLKFJlc2V0QWxlcnRTdGFnZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JUmVzZXRBbGVydFN0YWdlKCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBSZXNldEFsZXJ0U3RhZ2UoKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRGxnX0dldFBhcmFtVGV4dChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JU3RyMjU1IHBhcmFtMDsKLQlTdHIyNTUgcGFyYW0xOwotCVN0cjI1NSBwYXJhbTI7Ci0JU3RyMjU1IHBhcmFtMzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgU3RyMjU1IHBhcmFtMDsKKyAgICBTdHIyNTUgcGFyYW0xOworICAgIFN0cjI1NSBwYXJhbTI7CisgICAgU3RyMjU1IHBhcmFtMzsKICNpZm5kZWYgR2V0UGFyYW1UZXh0Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0UGFyYW1UZXh0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRQYXJhbVRleHQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIHBhcmFtMCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBwYXJhbTEsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgcGFyYW0yLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIHBhcmFtMykpCi0JCXJldHVybiBOVUxMOwotCUdldFBhcmFtVGV4dChwYXJhbTAsCi0JICAgICAgICAgICAgIHBhcmFtMSwKLQkgICAgICAgICAgICAgcGFyYW0yLAotCSAgICAgICAgICAgICBwYXJhbTMpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgcGFyYW0wLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIHBhcmFtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBwYXJhbTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgcGFyYW0zKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0UGFyYW1UZXh0KHBhcmFtMCwKKyAgICAgICAgICAgICAgICAgcGFyYW0xLAorICAgICAgICAgICAgICAgICBwYXJhbTIsCisgICAgICAgICAgICAgICAgIHBhcmFtMyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRsZ19OZXdGZWF0dXJlc0RpYWxvZyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JRGlhbG9nUHRyIF9ydjsKLQlSZWN0IGluQm91bmRzUmVjdDsKLQlTdHIyNTUgaW5UaXRsZTsKLQlCb29sZWFuIGluSXNWaXNpYmxlOwotCVNJbnQxNiBpblByb2NJRDsKLQlXaW5kb3dQdHIgaW5CZWhpbmQ7Ci0JQm9vbGVhbiBpbkdvQXdheUZsYWc7Ci0JU0ludDMyIGluUmVmQ29uOwotCUhhbmRsZSBpbkl0ZW1MaXN0SGFuZGxlOwotCVVJbnQzMiBpbkZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBEaWFsb2dQdHIgX3J2OworICAgIFJlY3QgaW5Cb3VuZHNSZWN0OworICAgIFN0cjI1NSBpblRpdGxlOworICAgIEJvb2xlYW4gaW5Jc1Zpc2libGU7CisgICAgU0ludDE2IGluUHJvY0lEOworICAgIFdpbmRvd1B0ciBpbkJlaGluZDsKKyAgICBCb29sZWFuIGluR29Bd2F5RmxhZzsKKyAgICBTSW50MzIgaW5SZWZDb247CisgICAgSGFuZGxlIGluSXRlbUxpc3RIYW5kbGU7CisgICAgVUludDMyIGluRmxhZ3M7CiAjaWZuZGVmIE5ld0ZlYXR1cmVzRGlhbG9nCi0JUHlNYWNfUFJFQ0hFQ0soTmV3RmVhdHVyZXNEaWFsb2cpOworICAgIFB5TWFjX1BSRUNIRUNLKE5ld0ZlYXR1cmVzRGlhbG9nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZiaE8mYmxPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5Cb3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIGluVGl0bGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbklzVmlzaWJsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluUHJvY0lELAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmluQmVoaW5kLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5Hb0F3YXlGbGFnLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5SZWZDb24sCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaW5JdGVtTGlzdEhhbmRsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluRmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBOZXdGZWF0dXJlc0RpYWxvZygodm9pZCAqKTAsCi0JICAgICAgICAgICAgICAgICAgICAgICAgJmluQm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICBpblRpdGxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGluSXNWaXNpYmxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGluUHJvY0lELAotCSAgICAgICAgICAgICAgICAgICAgICAgIGluQmVoaW5kLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGluR29Bd2F5RmxhZywKLQkgICAgICAgICAgICAgICAgICAgICAgICBpblJlZkNvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICBpbkl0ZW1MaXN0SGFuZGxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGluRmxhZ3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgRGxnT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mYmhPJmJsTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmluQm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBpblRpdGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Jc1Zpc2libGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblByb2NJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpbkJlaGluZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluR29Bd2F5RmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluUmVmQ29uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmluSXRlbUxpc3RIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTmV3RmVhdHVyZXNEaWFsb2coKHZvaWQgKikwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5UaXRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbklzVmlzaWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblByb2NJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkJlaGluZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkdvQXdheUZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5SZWZDb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5JdGVtTGlzdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkZsYWdzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIERsZ09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRGxnX0dldERpYWxvZ0Zyb21XaW5kb3coUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCURpYWxvZ1B0ciBfcnY7Ci0JV2luZG93UHRyIHdpbmRvdzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgRGlhbG9nUHRyIF9ydjsKKyAgICBXaW5kb3dQdHIgd2luZG93OwogI2lmbmRlZiBHZXREaWFsb2dGcm9tV2luZG93Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0RGlhbG9nRnJvbVdpbmRvdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0RGlhbG9nRnJvbVdpbmRvdyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0RGlhbG9nRnJvbVdpbmRvdyh3aW5kb3cpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgRGxnT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0RGlhbG9nRnJvbVdpbmRvdyh3aW5kb3cpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRGxnT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdfU2V0VXNlckl0ZW1IYW5kbGVyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAKLQkgICAgICAgIFB5T2JqZWN0ICpuZXcgPSBOVUxMOworICAgICAgICBQeU9iamVjdCAqbmV3ID0gTlVMTDsKIAogCi0JICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJ8TyIsICZuZXcpKQotCSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAifE8iLCAmbmV3KSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogCi0JICAgICAgICBpZiAoRGxnX1VzZXJJdGVtUHJvY19jYWxsYmFjayAmJiBuZXcgJiYgbmV3ICE9IFB5X05vbmUpIHsKLQkgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKERsZ19FcnJvciwgIkFub3RoZXIgVXNlckl0ZW1Qcm9jIGlzIGFscmVhZHkgaW5zdGFsbGVkIik7Ci0JICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotCSAgICAgICAgfQorICAgICAgICBpZiAoRGxnX1VzZXJJdGVtUHJvY19jYWxsYmFjayAmJiBuZXcgJiYgbmV3ICE9IFB5X05vbmUpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhEbGdfRXJyb3IsICJBbm90aGVyIFVzZXJJdGVtUHJvYyBpcyBhbHJlYWR5IGluc3RhbGxlZCIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KIAotCSAgICAgICAgaWYgKG5ldyA9PSBOVUxMIHx8IG5ldyA9PSBQeV9Ob25lKSB7Ci0JICAgICAgICAgICAgICAgIG5ldyA9IE5VTEw7Ci0JICAgICAgICAgICAgICAgIF9yZXMgPSBQeV9Ob25lOwotCSAgICAgICAgICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JICAgICAgICB9IGVsc2UgewotCSAgICAgICAgICAgICAgICBQeV9JTkNSRUYobmV3KTsKLQkgICAgICAgICAgICAgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwgUmVzT2JqX05ldywgKEhhbmRsZSlOZXdVc2VySXRlbVVQUChEbGdfVW5pdlVzZXJJdGVtUHJvYykpOwotCSAgICAgICAgfQorICAgICAgICBpZiAobmV3ID09IE5VTEwgfHwgbmV3ID09IFB5X05vbmUpIHsKKyAgICAgICAgICAgIG5ldyA9IE5VTEw7CisgICAgICAgICAgICBfcmVzID0gUHlfTm9uZTsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihuZXcpOworICAgICAgICAgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwgUmVzT2JqX05ldywgKEhhbmRsZSlOZXdVc2VySXRlbVVQUChEbGdfVW5pdlVzZXJJdGVtUHJvYykpOworICAgICAgICB9CiAKLQkgICAgICAgIERsZ19Vc2VySXRlbVByb2NfY2FsbGJhY2sgPSBuZXc7Ci0JICAgICAgICByZXR1cm4gX3JlczsKKyAgICAgICAgRGxnX1VzZXJJdGVtUHJvY19jYWxsYmFjayA9IG5ldzsKKyAgICAgICAgcmV0dXJuIF9yZXM7CiAKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIERsZ19tZXRob2RzW10gPSB7Ci0JeyJOZXdEaWFsb2ciLCAoUHlDRnVuY3Rpb24pRGxnX05ld0RpYWxvZywgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCBib3VuZHNSZWN0LCBTdHIyNTUgdGl0bGUsIEJvb2xlYW4gdmlzaWJsZSwgU0ludDE2IHByb2NJRCwgV2luZG93UHRyIGJlaGluZCwgQm9vbGVhbiBnb0F3YXlGbGFnLCBTSW50MzIgcmVmQ29uLCBIYW5kbGUgaXRlbXMpIC0+IChEaWFsb2dQdHIgX3J2KSIpfSwKLQl7IkdldE5ld0RpYWxvZyIsIChQeUNGdW5jdGlvbilEbGdfR2V0TmV3RGlhbG9nLCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgZGlhbG9nSUQsIFdpbmRvd1B0ciBiZWhpbmQpIC0+IChEaWFsb2dQdHIgX3J2KSIpfSwKLQl7Ik5ld0NvbG9yRGlhbG9nIiwgKFB5Q0Z1bmN0aW9uKURsZ19OZXdDb2xvckRpYWxvZywgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCBib3VuZHNSZWN0LCBTdHIyNTUgdGl0bGUsIEJvb2xlYW4gdmlzaWJsZSwgU0ludDE2IHByb2NJRCwgV2luZG93UHRyIGJlaGluZCwgQm9vbGVhbiBnb0F3YXlGbGFnLCBTSW50MzIgcmVmQ29uLCBIYW5kbGUgaXRlbXMpIC0+IChEaWFsb2dQdHIgX3J2KSIpfSwKLQl7Ik1vZGFsRGlhbG9nIiwgKFB5Q0Z1bmN0aW9uKURsZ19Nb2RhbERpYWxvZywgMSwKLQkgUHlEb2NfU1RSKCIoUHlPYmplY3QqIG1vZGFsRmlsdGVyKSAtPiAoRGlhbG9nSXRlbUluZGV4IGl0ZW1IaXQpIil9LAotCXsiSXNEaWFsb2dFdmVudCIsIChQeUNGdW5jdGlvbilEbGdfSXNEaWFsb2dFdmVudCwgMSwKLQkgUHlEb2NfU1RSKCIoRXZlbnRSZWNvcmQgdGhlRXZlbnQpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJEaWFsb2dTZWxlY3QiLCAoUHlDRnVuY3Rpb24pRGxnX0RpYWxvZ1NlbGVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoRXZlbnRSZWNvcmQgdGhlRXZlbnQpIC0+IChCb29sZWFuIF9ydiwgRGlhbG9nUHRyIHRoZURpYWxvZywgRGlhbG9nSXRlbUluZGV4IGl0ZW1IaXQpIil9LAotCXsiQWxlcnQiLCAoUHlDRnVuY3Rpb24pRGxnX0FsZXJ0LCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgYWxlcnRJRCwgUHlPYmplY3QqIG1vZGFsRmlsdGVyKSAtPiAoRGlhbG9nSXRlbUluZGV4IF9ydikiKX0sCi0JeyJTdG9wQWxlcnQiLCAoUHlDRnVuY3Rpb24pRGxnX1N0b3BBbGVydCwgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IGFsZXJ0SUQsIFB5T2JqZWN0KiBtb2RhbEZpbHRlcikgLT4gKERpYWxvZ0l0ZW1JbmRleCBfcnYpIil9LAotCXsiTm90ZUFsZXJ0IiwgKFB5Q0Z1bmN0aW9uKURsZ19Ob3RlQWxlcnQsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiBhbGVydElELCBQeU9iamVjdCogbW9kYWxGaWx0ZXIpIC0+IChEaWFsb2dJdGVtSW5kZXggX3J2KSIpfSwKLQl7IkNhdXRpb25BbGVydCIsIChQeUNGdW5jdGlvbilEbGdfQ2F1dGlvbkFsZXJ0LCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgYWxlcnRJRCwgUHlPYmplY3QqIG1vZGFsRmlsdGVyKSAtPiAoRGlhbG9nSXRlbUluZGV4IF9ydikiKX0sCi0JeyJQYXJhbVRleHQiLCAoUHlDRnVuY3Rpb24pRGxnX1BhcmFtVGV4dCwgMSwKLQkgUHlEb2NfU1RSKCIoU3RyMjU1IHBhcmFtMCwgU3RyMjU1IHBhcmFtMSwgU3RyMjU1IHBhcmFtMiwgU3RyMjU1IHBhcmFtMykgLT4gTm9uZSIpfSwKLQl7IkdldERpYWxvZ0l0ZW1UZXh0IiwgKFB5Q0Z1bmN0aW9uKURsZ19HZXREaWFsb2dJdGVtVGV4dCwgMSwKLQkgUHlEb2NfU1RSKCIoSGFuZGxlIGl0ZW0pIC0+IChTdHIyNTUgdGV4dCkiKX0sCi0JeyJTZXREaWFsb2dJdGVtVGV4dCIsIChQeUNGdW5jdGlvbilEbGdfU2V0RGlhbG9nSXRlbVRleHQsIDEsCi0JIFB5RG9jX1NUUigiKEhhbmRsZSBpdGVtLCBTdHIyNTUgdGV4dCkgLT4gTm9uZSIpfSwKLQl7IkdldEFsZXJ0U3RhZ2UiLCAoUHlDRnVuY3Rpb24pRGxnX0dldEFsZXJ0U3RhZ2UsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFNJbnQxNiBfcnYpIil9LAotCXsiU2V0RGlhbG9nRm9udCIsIChQeUNGdW5jdGlvbilEbGdfU2V0RGlhbG9nRm9udCwgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IGZvbnROdW0pIC0+IE5vbmUiKX0sCi0JeyJSZXNldEFsZXJ0U3RhZ2UiLCAoUHlDRnVuY3Rpb24pRGxnX1Jlc2V0QWxlcnRTdGFnZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiR2V0UGFyYW1UZXh0IiwgKFB5Q0Z1bmN0aW9uKURsZ19HZXRQYXJhbVRleHQsIDEsCi0JIFB5RG9jX1NUUigiKFN0cjI1NSBwYXJhbTAsIFN0cjI1NSBwYXJhbTEsIFN0cjI1NSBwYXJhbTIsIFN0cjI1NSBwYXJhbTMpIC0+IE5vbmUiKX0sCi0JeyJOZXdGZWF0dXJlc0RpYWxvZyIsIChQeUNGdW5jdGlvbilEbGdfTmV3RmVhdHVyZXNEaWFsb2csIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgaW5Cb3VuZHNSZWN0LCBTdHIyNTUgaW5UaXRsZSwgQm9vbGVhbiBpbklzVmlzaWJsZSwgU0ludDE2IGluUHJvY0lELCBXaW5kb3dQdHIgaW5CZWhpbmQsIEJvb2xlYW4gaW5Hb0F3YXlGbGFnLCBTSW50MzIgaW5SZWZDb24sIEhhbmRsZSBpbkl0ZW1MaXN0SGFuZGxlLCBVSW50MzIgaW5GbGFncykgLT4gKERpYWxvZ1B0ciBfcnYpIil9LAotCXsiR2V0RGlhbG9nRnJvbVdpbmRvdyIsIChQeUNGdW5jdGlvbilEbGdfR2V0RGlhbG9nRnJvbVdpbmRvdywgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdykgLT4gKERpYWxvZ1B0ciBfcnYpIil9LAotCXsiU2V0VXNlckl0ZW1IYW5kbGVyIiwgKFB5Q0Z1bmN0aW9uKURsZ19TZXRVc2VySXRlbUhhbmRsZXIsIDEsCi0JIFB5RG9jX1NUUihOVUxMKX0sCi0Je05VTEwsIE5VTEwsIDB9CisgICAgeyJOZXdEaWFsb2ciLCAoUHlDRnVuY3Rpb24pRGxnX05ld0RpYWxvZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCBib3VuZHNSZWN0LCBTdHIyNTUgdGl0bGUsIEJvb2xlYW4gdmlzaWJsZSwgU0ludDE2IHByb2NJRCwgV2luZG93UHRyIGJlaGluZCwgQm9vbGVhbiBnb0F3YXlGbGFnLCBTSW50MzIgcmVmQ29uLCBIYW5kbGUgaXRlbXMpIC0+IChEaWFsb2dQdHIgX3J2KSIpfSwKKyAgICB7IkdldE5ld0RpYWxvZyIsIChQeUNGdW5jdGlvbilEbGdfR2V0TmV3RGlhbG9nLCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgZGlhbG9nSUQsIFdpbmRvd1B0ciBiZWhpbmQpIC0+IChEaWFsb2dQdHIgX3J2KSIpfSwKKyAgICB7Ik5ld0NvbG9yRGlhbG9nIiwgKFB5Q0Z1bmN0aW9uKURsZ19OZXdDb2xvckRpYWxvZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCBib3VuZHNSZWN0LCBTdHIyNTUgdGl0bGUsIEJvb2xlYW4gdmlzaWJsZSwgU0ludDE2IHByb2NJRCwgV2luZG93UHRyIGJlaGluZCwgQm9vbGVhbiBnb0F3YXlGbGFnLCBTSW50MzIgcmVmQ29uLCBIYW5kbGUgaXRlbXMpIC0+IChEaWFsb2dQdHIgX3J2KSIpfSwKKyAgICB7Ik1vZGFsRGlhbG9nIiwgKFB5Q0Z1bmN0aW9uKURsZ19Nb2RhbERpYWxvZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoUHlPYmplY3QqIG1vZGFsRmlsdGVyKSAtPiAoRGlhbG9nSXRlbUluZGV4IGl0ZW1IaXQpIil9LAorICAgIHsiSXNEaWFsb2dFdmVudCIsIChQeUNGdW5jdGlvbilEbGdfSXNEaWFsb2dFdmVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRXZlbnRSZWNvcmQgdGhlRXZlbnQpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJEaWFsb2dTZWxlY3QiLCAoUHlDRnVuY3Rpb24pRGxnX0RpYWxvZ1NlbGVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRXZlbnRSZWNvcmQgdGhlRXZlbnQpIC0+IChCb29sZWFuIF9ydiwgRGlhbG9nUHRyIHRoZURpYWxvZywgRGlhbG9nSXRlbUluZGV4IGl0ZW1IaXQpIil9LAorICAgIHsiQWxlcnQiLCAoUHlDRnVuY3Rpb24pRGxnX0FsZXJ0LCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgYWxlcnRJRCwgUHlPYmplY3QqIG1vZGFsRmlsdGVyKSAtPiAoRGlhbG9nSXRlbUluZGV4IF9ydikiKX0sCisgICAgeyJTdG9wQWxlcnQiLCAoUHlDRnVuY3Rpb24pRGxnX1N0b3BBbGVydCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IGFsZXJ0SUQsIFB5T2JqZWN0KiBtb2RhbEZpbHRlcikgLT4gKERpYWxvZ0l0ZW1JbmRleCBfcnYpIil9LAorICAgIHsiTm90ZUFsZXJ0IiwgKFB5Q0Z1bmN0aW9uKURsZ19Ob3RlQWxlcnQsIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiBhbGVydElELCBQeU9iamVjdCogbW9kYWxGaWx0ZXIpIC0+IChEaWFsb2dJdGVtSW5kZXggX3J2KSIpfSwKKyAgICB7IkNhdXRpb25BbGVydCIsIChQeUNGdW5jdGlvbilEbGdfQ2F1dGlvbkFsZXJ0LCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgYWxlcnRJRCwgUHlPYmplY3QqIG1vZGFsRmlsdGVyKSAtPiAoRGlhbG9nSXRlbUluZGV4IF9ydikiKX0sCisgICAgeyJQYXJhbVRleHQiLCAoUHlDRnVuY3Rpb24pRGxnX1BhcmFtVGV4dCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU3RyMjU1IHBhcmFtMCwgU3RyMjU1IHBhcmFtMSwgU3RyMjU1IHBhcmFtMiwgU3RyMjU1IHBhcmFtMykgLT4gTm9uZSIpfSwKKyAgICB7IkdldERpYWxvZ0l0ZW1UZXh0IiwgKFB5Q0Z1bmN0aW9uKURsZ19HZXREaWFsb2dJdGVtVGV4dCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSGFuZGxlIGl0ZW0pIC0+IChTdHIyNTUgdGV4dCkiKX0sCisgICAgeyJTZXREaWFsb2dJdGVtVGV4dCIsIChQeUNGdW5jdGlvbilEbGdfU2V0RGlhbG9nSXRlbVRleHQsIDEsCisgICAgIFB5RG9jX1NUUigiKEhhbmRsZSBpdGVtLCBTdHIyNTUgdGV4dCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldEFsZXJ0U3RhZ2UiLCAoUHlDRnVuY3Rpb24pRGxnX0dldEFsZXJ0U3RhZ2UsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFNJbnQxNiBfcnYpIil9LAorICAgIHsiU2V0RGlhbG9nRm9udCIsIChQeUNGdW5jdGlvbilEbGdfU2V0RGlhbG9nRm9udCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IGZvbnROdW0pIC0+IE5vbmUiKX0sCisgICAgeyJSZXNldEFsZXJ0U3RhZ2UiLCAoUHlDRnVuY3Rpb24pRGxnX1Jlc2V0QWxlcnRTdGFnZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiR2V0UGFyYW1UZXh0IiwgKFB5Q0Z1bmN0aW9uKURsZ19HZXRQYXJhbVRleHQsIDEsCisgICAgIFB5RG9jX1NUUigiKFN0cjI1NSBwYXJhbTAsIFN0cjI1NSBwYXJhbTEsIFN0cjI1NSBwYXJhbTIsIFN0cjI1NSBwYXJhbTMpIC0+IE5vbmUiKX0sCisgICAgeyJOZXdGZWF0dXJlc0RpYWxvZyIsIChQeUNGdW5jdGlvbilEbGdfTmV3RmVhdHVyZXNEaWFsb2csIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgaW5Cb3VuZHNSZWN0LCBTdHIyNTUgaW5UaXRsZSwgQm9vbGVhbiBpbklzVmlzaWJsZSwgU0ludDE2IGluUHJvY0lELCBXaW5kb3dQdHIgaW5CZWhpbmQsIEJvb2xlYW4gaW5Hb0F3YXlGbGFnLCBTSW50MzIgaW5SZWZDb24sIEhhbmRsZSBpbkl0ZW1MaXN0SGFuZGxlLCBVSW50MzIgaW5GbGFncykgLT4gKERpYWxvZ1B0ciBfcnYpIil9LAorICAgIHsiR2V0RGlhbG9nRnJvbVdpbmRvdyIsIChQeUNGdW5jdGlvbilEbGdfR2V0RGlhbG9nRnJvbVdpbmRvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdykgLT4gKERpYWxvZ1B0ciBfcnYpIil9LAorICAgIHsiU2V0VXNlckl0ZW1IYW5kbGVyIiwgKFB5Q0Z1bmN0aW9uKURsZ19TZXRVc2VySXRlbUhhbmRsZXIsIDEsCisgICAgIFB5RG9jX1NUUihOVUxMKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAKQEAgLTE1MzAsOSArMTUzMCw5IEBACiBXaW5kb3dQdHIKIERsZ09ial9Db252ZXJ0VG9XaW5kb3coUHlPYmplY3QgKnNlbGYpCiB7Ci0gICAgICAgIGlmICggRGxnT2JqX0NoZWNrKHNlbGYpICkKLSAgICAgICAgICAgICAgICByZXR1cm4gR2V0RGlhbG9nV2luZG93KCgoRGlhbG9nT2JqZWN0ICopc2VsZiktPm9iX2l0c2VsZik7Ci0gICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICggRGxnT2JqX0NoZWNrKHNlbGYpICkKKyAgICAgICAgcmV0dXJuIEdldERpYWxvZ1dpbmRvdygoKERpYWxvZ09iamVjdCAqKXNlbGYpLT5vYl9pdHNlbGYpOworICAgIHJldHVybiBOVUxMOwogfQogI2VuZGlmCiAvKiBSZXR1cm4gdGhlIG9iamVjdCBjb3JyZXNwb25kaW5nIHRvIHRoZSBkaWFsb2csIG9yIE5vbmUgKi8KQEAgLTE1NDAsMzUgKzE1NDAsMzUgQEAKIFB5T2JqZWN0ICoKIERsZ09ial9XaGljaERpYWxvZyhEaWFsb2dQdHIgZCkKIHsKLSAgICAgICAgUHlPYmplY3QgKml0OworICAgIFB5T2JqZWN0ICppdDsKIAotICAgICAgICBpZiAoZCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgaXQgPSBQeV9Ob25lOwotICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihpdCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgV2luZG93UHRyIHcgPSBHZXREaWFsb2dXaW5kb3coZCk7CisgICAgaWYgKGQgPT0gTlVMTCkgeworICAgICAgICBpdCA9IFB5X05vbmU7CisgICAgICAgIFB5X0lOQ1JFRihpdCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgV2luZG93UHRyIHcgPSBHZXREaWFsb2dXaW5kb3coZCk7CiAKLSAgICAgICAgICAgICAgICBpdCA9IChQeU9iamVjdCAqKSBHZXRXUmVmQ29uKHcpOwotICAgICAgICAgICAgICAgIGlmIChpdCA9PSBOVUxMIHx8ICgoRGlhbG9nT2JqZWN0ICopaXQpLT5vYl9pdHNlbGYgIT0gZCB8fCAhRGxnT2JqX0NoZWNrKGl0KSkgeworICAgICAgICBpdCA9IChQeU9iamVjdCAqKSBHZXRXUmVmQ29uKHcpOworICAgICAgICBpZiAoaXQgPT0gTlVMTCB8fCAoKERpYWxvZ09iamVjdCAqKWl0KS0+b2JfaXRzZWxmICE9IGQgfHwgIURsZ09ial9DaGVjayhpdCkpIHsKICNpZiAwCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBTaG91bGQgZG8gdGhpcywgYnV0IHdlIGRvbid0IGhhdmUgYW4gb2JfZnJlZWl0IGZvciBkaWFsb2dzIHlldC4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGl0ID0gV2luT2JqX05ldyh3KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICgoV2luZG93T2JqZWN0ICopaXQpLT5vYl9mcmVlaXQgPSBOVUxMOworICAgICAgICAgICAgLyogU2hvdWxkIGRvIHRoaXMsIGJ1dCB3ZSBkb24ndCBoYXZlIGFuIG9iX2ZyZWVpdCBmb3IgZGlhbG9ncyB5ZXQuICovCisgICAgICAgICAgICBpdCA9IFdpbk9ial9OZXcodyk7CisgICAgICAgICAgICAoKFdpbmRvd09iamVjdCAqKWl0KS0+b2JfZnJlZWl0ID0gTlVMTDsKICNlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBpdCA9IFB5X05vbmU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQeV9JTkNSRUYoaXQpOworICAgICAgICAgICAgaXQgPSBQeV9Ob25lOworICAgICAgICAgICAgUHlfSU5DUkVGKGl0KTsKICNlbmRpZgotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQeV9JTkNSRUYoaXQpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihpdCk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGl0OworICAgIH0KKyAgICByZXR1cm4gaXQ7CiB9CiAKICNlbHNlIC8qIF9fTFA2NF9fICovCiAKIHN0YXRpYyBQeU1ldGhvZERlZiBEbGdfbWV0aG9kc1tdID0gewotCXtOVUxMLCBOVUxMLCAwfQorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogI2VuZGlmIC8qIF9fTFA2NF9fICovCkBAIC0xNTc2LDMyICsxNTc2LDMyIEBACiAKIHZvaWQgaW5pdF9EbGcodm9pZCkKIHsKLQlQeU9iamVjdCAqbTsKKyAgICBQeU9iamVjdCAqbTsKICNpZm5kZWYgX19MUDY0X18KLQlQeU9iamVjdCAqZDsKKyAgICBQeU9iamVjdCAqZDsKIAogCiAKLQkgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKERpYWxvZ1B0ciwgRGxnT2JqX05ldyk7Ci0JICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhEaWFsb2dQdHIsIERsZ09ial9XaGljaERpYWxvZyk7Ci0JICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoRGlhbG9nUHRyLCBEbGdPYmpfQ29udmVydCk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKERpYWxvZ1B0ciwgRGxnT2JqX05ldyk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKERpYWxvZ1B0ciwgRGxnT2JqX1doaWNoRGlhbG9nKTsKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKERpYWxvZ1B0ciwgRGxnT2JqX0NvbnZlcnQpOwogI2VuZGlmIC8qICFfX0xQNjRfXyAqLwogCi0JbSA9IFB5X0luaXRNb2R1bGUoIl9EbGciLCBEbGdfbWV0aG9kcyk7CisgICAgbSA9IFB5X0luaXRNb2R1bGUoIl9EbGciLCBEbGdfbWV0aG9kcyk7CiAKICNpZm5kZWYgX19MUDY0X18KLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQlEbGdfRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOwotCWlmIChEbGdfRXJyb3IgPT0gTlVMTCB8fAotCSAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRXJyb3IiLCBEbGdfRXJyb3IpICE9IDApCi0JCXJldHVybjsKLQlEaWFsb2dfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCWlmIChQeVR5cGVfUmVhZHkoJkRpYWxvZ19UeXBlKSA8IDApIHJldHVybjsKLQlQeV9JTkNSRUYoJkRpYWxvZ19UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkRpYWxvZyIsIChQeU9iamVjdCAqKSZEaWFsb2dfVHlwZSk7Ci0JLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCi0JUHlfSU5DUkVGKCZEaWFsb2dfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJEaWFsb2dUeXBlIiwgKFB5T2JqZWN0ICopJkRpYWxvZ19UeXBlKTsKKyAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICBEbGdfRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOworICAgIGlmIChEbGdfRXJyb3IgPT0gTlVMTCB8fAorICAgICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRXJyb3IiLCBEbGdfRXJyb3IpICE9IDApCisgICAgICAgIHJldHVybjsKKyAgICBEaWFsb2dfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJkRpYWxvZ19UeXBlKSA8IDApIHJldHVybjsKKyAgICBQeV9JTkNSRUYoJkRpYWxvZ19UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkRpYWxvZyIsIChQeU9iamVjdCAqKSZEaWFsb2dfVHlwZSk7CisgICAgLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCisgICAgUHlfSU5DUkVGKCZEaWFsb2dfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJEaWFsb2dUeXBlIiwgKFB5T2JqZWN0ICopJkRpYWxvZ19UeXBlKTsKICNlbmRpZiAvKiAhX19MUDY0X18gKi8KIH0KIApkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvZHJhZy9fRHJhZ21vZHVsZS5jIGIvTWFjL01vZHVsZXMvZHJhZy9fRHJhZ21vZHVsZS5jCmluZGV4IDc5N2ZiMzIuLmFhODc2OTAgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL2RyYWcvX0RyYWdtb2R1bGUuYworKysgYi9NYWMvTW9kdWxlcy9kcmFnL19EcmFnbW9kdWxlLmMKQEAgLTEwLDkgKzEwLDkgQEAKIAogLyogTWFjcm8gdG8gdGVzdCB3aGV0aGVyIGEgd2Vhay1sb2FkZWQgQ0ZNIGZ1bmN0aW9uIGV4aXN0cyAqLwogI2RlZmluZSBQeU1hY19QUkVDSEVDSyhydG4pIGRvIHsgaWYgKCAmcnRuID09IE5VTEwgKSAge1wKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsIFwKLSAgICAgICAgIk5vdCBhdmFpbGFibGUgaW4gdGhpcyBzaGFyZWQgbGlicmFyeS9PUyB2ZXJzaW9uIik7IFwKLSAgICAgICAgcmV0dXJuIE5VTEw7IFwKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgXAorICAgICJOb3QgYXZhaWxhYmxlIGluIHRoaXMgc2hhcmVkIGxpYnJhcnkvT1MgdmVyc2lvbiIpOyBcCisgICAgcmV0dXJuIE5VTEw7IFwKICAgICB9fSB3aGlsZSgwKQogCiAKQEAgLTQ0LDY5MyArNDQsNjkzIEBACiAjZGVmaW5lIERyYWdPYmpfQ2hlY2soeCkgKCh4KS0+b2JfdHlwZSA9PSAmRHJhZ09ial9UeXBlIHx8IFB5T2JqZWN0X1R5cGVDaGVjaygoeCksICZEcmFnT2JqX1R5cGUpKQogCiB0eXBlZGVmIHN0cnVjdCBEcmFnT2JqT2JqZWN0IHsKLQlQeU9iamVjdF9IRUFECi0JRHJhZ1JlZiBvYl9pdHNlbGY7Ci0JUHlPYmplY3QgKnNlbmRwcm9jOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBEcmFnUmVmIG9iX2l0c2VsZjsKKyAgICBQeU9iamVjdCAqc2VuZHByb2M7CiB9IERyYWdPYmpPYmplY3Q7CiAKIFB5T2JqZWN0ICpEcmFnT2JqX05ldyhEcmFnUmVmIGl0c2VsZikKIHsKLQlEcmFnT2JqT2JqZWN0ICppdDsKLQlpZiAoaXRzZWxmID09IE5VTEwpIHsKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhEcmFnX0Vycm9yLCJDYW5ub3QgY3JlYXRlIG51bGwgRHJhZyIpOwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgfQotCWl0ID0gUHlPYmplY3RfTkVXKERyYWdPYmpPYmplY3QsICZEcmFnT2JqX1R5cGUpOwotCWlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQlpdC0+b2JfaXRzZWxmID0gaXRzZWxmOwotCWl0LT5zZW5kcHJvYyA9IE5VTEw7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIERyYWdPYmpPYmplY3QgKml0OworICAgIGlmIChpdHNlbGYgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKERyYWdfRXJyb3IsIkNhbm5vdCBjcmVhdGUgbnVsbCBEcmFnIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgaXQgPSBQeU9iamVjdF9ORVcoRHJhZ09iak9iamVjdCwgJkRyYWdPYmpfVHlwZSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIGl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgaXQtPnNlbmRwcm9jID0gTlVMTDsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiAKIGludCBEcmFnT2JqX0NvbnZlcnQoUHlPYmplY3QgKnYsIERyYWdSZWYgKnBfaXRzZWxmKQogewotCWlmICghRHJhZ09ial9DaGVjayh2KSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJEcmFnT2JqIHJlcXVpcmVkIik7Ci0JCXJldHVybiAwOwotCX0KLQkqcF9pdHNlbGYgPSAoKERyYWdPYmpPYmplY3QgKil2KS0+b2JfaXRzZWxmOwotCXJldHVybiAxOworICAgIGlmICghRHJhZ09ial9DaGVjayh2KSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJEcmFnT2JqIHJlcXVpcmVkIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAqcF9pdHNlbGYgPSAoKERyYWdPYmpPYmplY3QgKil2KS0+b2JfaXRzZWxmOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgdm9pZCBEcmFnT2JqX2RlYWxsb2MoRHJhZ09iak9iamVjdCAqc2VsZikKIHsKLQlQeV9YREVDUkVGKHNlbGYtPnNlbmRwcm9jKTsKLQlzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOworICAgIFB5X1hERUNSRUYoc2VsZi0+c2VuZHByb2MpOworICAgIHNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRHJhZ09ial9EaXNwb3NlRHJhZyhEcmFnT2JqT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOwogI2lmbmRlZiBEaXNwb3NlRHJhZwotCVB5TWFjX1BSRUNIRUNLKERpc3Bvc2VEcmFnKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEaXNwb3NlRHJhZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IERpc3Bvc2VEcmFnKF9zZWxmLT5vYl9pdHNlbGYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRGlzcG9zZURyYWcoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRHJhZ09ial9BZGREcmFnSXRlbUZsYXZvcihEcmFnT2JqT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUl0ZW1SZWZlcmVuY2UgdGhlSXRlbVJlZjsKLQlGbGF2b3JUeXBlIHRoZVR5cGU7Ci0JY2hhciAqZGF0YVB0cl9faW5fXzsKLQlsb25nIGRhdGFQdHJfX2xlbl9fOwotCWludCBkYXRhUHRyX19pbl9sZW5fXzsKLQlGbGF2b3JGbGFncyB0aGVGbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBJdGVtUmVmZXJlbmNlIHRoZUl0ZW1SZWY7CisgICAgRmxhdm9yVHlwZSB0aGVUeXBlOworICAgIGNoYXIgKmRhdGFQdHJfX2luX187CisgICAgbG9uZyBkYXRhUHRyX19sZW5fXzsKKyAgICBpbnQgZGF0YVB0cl9faW5fbGVuX187CisgICAgRmxhdm9yRmxhZ3MgdGhlRmxhZ3M7CiAjaWZuZGVmIEFkZERyYWdJdGVtRmxhdm9yCi0JUHlNYWNfUFJFQ0hFQ0soQWRkRHJhZ0l0ZW1GbGF2b3IpOworICAgIFB5TWFjX1BSRUNIRUNLKEFkZERyYWdJdGVtRmxhdm9yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJnojbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aGVJdGVtUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGF0YVB0cl9faW5fXywgJmRhdGFQdHJfX2luX2xlbl9fLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGhlRmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlkYXRhUHRyX19sZW5fXyA9IGRhdGFQdHJfX2luX2xlbl9fOwotCV9lcnIgPSBBZGREcmFnSXRlbUZsYXZvcihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICB0aGVJdGVtUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICB0aGVUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUHRyX19pbl9fLCBkYXRhUHRyX19sZW5fXywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgdGhlRmxhZ3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJnojbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVJdGVtUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVB0cl9faW5fXywgJmRhdGFQdHJfX2luX2xlbl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlRmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBkYXRhUHRyX19sZW5fXyA9IGRhdGFQdHJfX2luX2xlbl9fOworICAgIF9lcnIgPSBBZGREcmFnSXRlbUZsYXZvcihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVJdGVtUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUHRyX19pbl9fLCBkYXRhUHRyX19sZW5fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlRmxhZ3MpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRyYWdPYmpfU2V0RHJhZ0l0ZW1GbGF2b3JEYXRhKERyYWdPYmpPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSXRlbVJlZmVyZW5jZSB0aGVJdGVtUmVmOwotCUZsYXZvclR5cGUgdGhlVHlwZTsKLQljaGFyICpkYXRhUHRyX19pbl9fOwotCWxvbmcgZGF0YVB0cl9fbGVuX187Ci0JaW50IGRhdGFQdHJfX2luX2xlbl9fOwotCVVJbnQzMiBkYXRhT2Zmc2V0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEl0ZW1SZWZlcmVuY2UgdGhlSXRlbVJlZjsKKyAgICBGbGF2b3JUeXBlIHRoZVR5cGU7CisgICAgY2hhciAqZGF0YVB0cl9faW5fXzsKKyAgICBsb25nIGRhdGFQdHJfX2xlbl9fOworICAgIGludCBkYXRhUHRyX19pbl9sZW5fXzsKKyAgICBVSW50MzIgZGF0YU9mZnNldDsKICNpZm5kZWYgU2V0RHJhZ0l0ZW1GbGF2b3JEYXRhCi0JUHlNYWNfUFJFQ0hFQ0soU2V0RHJhZ0l0ZW1GbGF2b3JEYXRhKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXREcmFnSXRlbUZsYXZvckRhdGEpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8meiNsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRoZUl0ZW1SZWYsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZkYXRhUHRyX19pbl9fLCAmZGF0YVB0cl9faW5fbGVuX18sCi0JICAgICAgICAgICAgICAgICAgICAgICZkYXRhT2Zmc2V0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JZGF0YVB0cl9fbGVuX18gPSBkYXRhUHRyX19pbl9sZW5fXzsKLQlfZXJyID0gU2V0RHJhZ0l0ZW1GbGF2b3JEYXRhKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVJdGVtUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFQdHJfX2luX18sIGRhdGFQdHJfX2xlbl9fLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YU9mZnNldCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8meiNsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUl0ZW1SZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUHRyX19pbl9fLCAmZGF0YVB0cl9faW5fbGVuX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhT2Zmc2V0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZGF0YVB0cl9fbGVuX18gPSBkYXRhUHRyX19pbl9sZW5fXzsKKyAgICBfZXJyID0gU2V0RHJhZ0l0ZW1GbGF2b3JEYXRhKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVJdGVtUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFQdHJfX2luX18sIGRhdGFQdHJfX2xlbl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YU9mZnNldCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRHJhZ09ial9TZXREcmFnSW1hZ2UoRHJhZ09iak9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlQaXhNYXBIYW5kbGUgaW1hZ2VQaXhNYXA7Ci0JUmduSGFuZGxlIGltYWdlUmduOwotCVBvaW50IGltYWdlT2Zmc2V0UHQ7Ci0JRHJhZ0ltYWdlRmxhZ3MgdGhlSW1hZ2VGbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBQaXhNYXBIYW5kbGUgaW1hZ2VQaXhNYXA7CisgICAgUmduSGFuZGxlIGltYWdlUmduOworICAgIFBvaW50IGltYWdlT2Zmc2V0UHQ7CisgICAgRHJhZ0ltYWdlRmxhZ3MgdGhlSW1hZ2VGbGFnczsKICNpZm5kZWYgU2V0RHJhZ0ltYWdlCi0JUHlNYWNfUFJFQ0hFQ0soU2V0RHJhZ0ltYWdlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXREcmFnSW1hZ2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaW1hZ2VQaXhNYXAsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaW1hZ2VSZ24sCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmaW1hZ2VPZmZzZXRQdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRoZUltYWdlRmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0RHJhZ0ltYWdlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICBpbWFnZVBpeE1hcCwKLQkgICAgICAgICAgICAgICAgICAgIGltYWdlUmduLAotCSAgICAgICAgICAgICAgICAgICAgaW1hZ2VPZmZzZXRQdCwKLQkgICAgICAgICAgICAgICAgICAgIHRoZUltYWdlRmxhZ3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmltYWdlUGl4TWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmltYWdlUmduLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJmltYWdlT2Zmc2V0UHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVJbWFnZUZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldERyYWdJbWFnZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VQaXhNYXAsCisgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZVJnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlT2Zmc2V0UHQsCisgICAgICAgICAgICAgICAgICAgICAgICB0aGVJbWFnZUZsYWdzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEcmFnT2JqX0NoYW5nZURyYWdCZWhhdmlvcnMoRHJhZ09iak9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlEcmFnQmVoYXZpb3JzIGluQmVoYXZpb3JzVG9TZXQ7Ci0JRHJhZ0JlaGF2aW9ycyBpbkJlaGF2aW9yc1RvQ2xlYXI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgRHJhZ0JlaGF2aW9ycyBpbkJlaGF2aW9yc1RvU2V0OworICAgIERyYWdCZWhhdmlvcnMgaW5CZWhhdmlvcnNUb0NsZWFyOwogI2lmbmRlZiBDaGFuZ2VEcmFnQmVoYXZpb3JzCi0JUHlNYWNfUFJFQ0hFQ0soQ2hhbmdlRHJhZ0JlaGF2aW9ycyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ2hhbmdlRHJhZ0JlaGF2aW9ycyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkJlaGF2aW9yc1RvU2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5CZWhhdmlvcnNUb0NsZWFyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENoYW5nZURyYWdCZWhhdmlvcnMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkJlaGF2aW9yc1RvU2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQmVoYXZpb3JzVG9DbGVhcik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5CZWhhdmlvcnNUb1NldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQmVoYXZpb3JzVG9DbGVhcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDaGFuZ2VEcmFnQmVoYXZpb3JzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5CZWhhdmlvcnNUb1NldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkJlaGF2aW9yc1RvQ2xlYXIpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRyYWdPYmpfVHJhY2tEcmFnKERyYWdPYmpPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JRXZlbnRSZWNvcmQgdGhlRXZlbnQ7Ci0JUmduSGFuZGxlIHRoZVJlZ2lvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBFdmVudFJlY29yZCB0aGVFdmVudDsKKyAgICBSZ25IYW5kbGUgdGhlUmVnaW9uOwogI2lmbmRlZiBUcmFja0RyYWcKLQlQeU1hY19QUkVDSEVDSyhUcmFja0RyYWcpOworICAgIFB5TWFjX1BSRUNIRUNLKFRyYWNrRHJhZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RXZlbnRSZWNvcmQsICZ0aGVFdmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVSZWdpb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gVHJhY2tEcmFnKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAmdGhlRXZlbnQsCi0JICAgICAgICAgICAgICAgICB0aGVSZWdpb24pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRFdmVudFJlY29yZCwgJnRoZUV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZVJlZ2lvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBUcmFja0RyYWcoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICZ0aGVFdmVudCwKKyAgICAgICAgICAgICAgICAgICAgIHRoZVJlZ2lvbik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRHJhZ09ial9Db3VudERyYWdJdGVtcyhEcmFnT2JqT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVVJbnQxNiBudW1JdGVtczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBVSW50MTYgbnVtSXRlbXM7CiAjaWZuZGVmIENvdW50RHJhZ0l0ZW1zCi0JUHlNYWNfUFJFQ0hFQ0soQ291bnREcmFnSXRlbXMpOworICAgIFB5TWFjX1BSRUNIRUNLKENvdW50RHJhZ0l0ZW1zKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ291bnREcmFnSXRlbXMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm51bUl0ZW1zKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJIIiwKLQkgICAgICAgICAgICAgICAgICAgICBudW1JdGVtcyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDb3VudERyYWdJdGVtcyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbnVtSXRlbXMpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIkgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG51bUl0ZW1zKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEcmFnT2JqX0dldERyYWdJdGVtUmVmZXJlbmNlTnVtYmVyKERyYWdPYmpPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JVUludDE2IGluZGV4OwotCUl0ZW1SZWZlcmVuY2UgdGhlSXRlbVJlZjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBVSW50MTYgaW5kZXg7CisgICAgSXRlbVJlZmVyZW5jZSB0aGVJdGVtUmVmOwogI2lmbmRlZiBHZXREcmFnSXRlbVJlZmVyZW5jZU51bWJlcgotCVB5TWFjX1BSRUNIRUNLKEdldERyYWdJdGVtUmVmZXJlbmNlTnVtYmVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXREcmFnSXRlbVJlZmVyZW5jZU51bWJlcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJIIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluZGV4KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldERyYWdJdGVtUmVmZXJlbmNlTnVtYmVyKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlSXRlbVJlZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgdGhlSXRlbVJlZik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXREcmFnSXRlbVJlZmVyZW5jZU51bWJlcihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUl0ZW1SZWYpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRoZUl0ZW1SZWYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRyYWdPYmpfQ291bnREcmFnSXRlbUZsYXZvcnMoRHJhZ09iak9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlJdGVtUmVmZXJlbmNlIHRoZUl0ZW1SZWY7Ci0JVUludDE2IG51bUZsYXZvcnM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSXRlbVJlZmVyZW5jZSB0aGVJdGVtUmVmOworICAgIFVJbnQxNiBudW1GbGF2b3JzOwogI2lmbmRlZiBDb3VudERyYWdJdGVtRmxhdm9ycwotCVB5TWFjX1BSRUNIRUNLKENvdW50RHJhZ0l0ZW1GbGF2b3JzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb3VudERyYWdJdGVtRmxhdm9ycyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRoZUl0ZW1SZWYpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ291bnREcmFnSXRlbUZsYXZvcnMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlSXRlbVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm51bUZsYXZvcnMpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIkgiLAotCSAgICAgICAgICAgICAgICAgICAgIG51bUZsYXZvcnMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlSXRlbVJlZikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDb3VudERyYWdJdGVtRmxhdm9ycyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVJdGVtUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbnVtRmxhdm9ycyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgbnVtRmxhdm9ycyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRHJhZ09ial9HZXRGbGF2b3JUeXBlKERyYWdPYmpPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSXRlbVJlZmVyZW5jZSB0aGVJdGVtUmVmOwotCVVJbnQxNiBpbmRleDsKLQlGbGF2b3JUeXBlIHRoZVR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSXRlbVJlZmVyZW5jZSB0aGVJdGVtUmVmOworICAgIFVJbnQxNiBpbmRleDsKKyAgICBGbGF2b3JUeXBlIHRoZVR5cGU7CiAjaWZuZGVmIEdldEZsYXZvclR5cGUKLQlQeU1hY19QUkVDSEVDSyhHZXRGbGF2b3JUeXBlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRGbGF2b3JUeXBlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxIIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRoZUl0ZW1SZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRGbGF2b3JUeXBlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgdGhlSXRlbVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICBpbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICAmdGhlVHlwZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCB0aGVUeXBlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVJdGVtUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0Rmxhdm9yVHlwZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRoZUl0ZW1SZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZVR5cGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgdGhlVHlwZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRHJhZ09ial9HZXRGbGF2b3JGbGFncyhEcmFnT2JqT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUl0ZW1SZWZlcmVuY2UgdGhlSXRlbVJlZjsKLQlGbGF2b3JUeXBlIHRoZVR5cGU7Ci0JRmxhdm9yRmxhZ3MgdGhlRmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSXRlbVJlZmVyZW5jZSB0aGVJdGVtUmVmOworICAgIEZsYXZvclR5cGUgdGhlVHlwZTsKKyAgICBGbGF2b3JGbGFncyB0aGVGbGFnczsKICNpZm5kZWYgR2V0Rmxhdm9yRmxhZ3MKLQlQeU1hY19QUkVDSEVDSyhHZXRGbGF2b3JGbGFncyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0Rmxhdm9yRmxhZ3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRoZUl0ZW1SZWYsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZVR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0Rmxhdm9yRmxhZ3MoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgdGhlSXRlbVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgdGhlVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRoZUZsYWdzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICB0aGVGbGFncyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUl0ZW1SZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZVR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0Rmxhdm9yRmxhZ3MoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlSXRlbVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUZsYWdzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0aGVGbGFncyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRHJhZ09ial9HZXRGbGF2b3JEYXRhU2l6ZShEcmFnT2JqT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUl0ZW1SZWZlcmVuY2UgdGhlSXRlbVJlZjsKLQlGbGF2b3JUeXBlIHRoZVR5cGU7Ci0JU2l6ZSBkYXRhU2l6ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBJdGVtUmVmZXJlbmNlIHRoZUl0ZW1SZWY7CisgICAgRmxhdm9yVHlwZSB0aGVUeXBlOworICAgIFNpemUgZGF0YVNpemU7CiAjaWZuZGVmIEdldEZsYXZvckRhdGFTaXplCi0JUHlNYWNfUFJFQ0hFQ0soR2V0Rmxhdm9yRGF0YVNpemUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldEZsYXZvckRhdGFTaXplKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aGVJdGVtUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldEZsYXZvckRhdGFTaXplKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIHRoZUl0ZW1SZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIHRoZVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhU2l6ZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgZGF0YVNpemUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVJdGVtUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldEZsYXZvckRhdGFTaXplKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZUl0ZW1SZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhU2l6ZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVNpemUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRyYWdPYmpfR2V0Rmxhdm9yRGF0YShEcmFnT2JqT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUl0ZW1SZWZlcmVuY2UgdGhlSXRlbVJlZjsKLQlGbGF2b3JUeXBlIHRoZVR5cGU7Ci0JY2hhciAqZGF0YVB0cl9fb3V0X187Ci0JbG9uZyBkYXRhUHRyX19sZW5fXzsKLQlpbnQgZGF0YVB0cl9faW5fbGVuX187Ci0JVUludDMyIGRhdGFPZmZzZXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSXRlbVJlZmVyZW5jZSB0aGVJdGVtUmVmOworICAgIEZsYXZvclR5cGUgdGhlVHlwZTsKKyAgICBjaGFyICpkYXRhUHRyX19vdXRfXzsKKyAgICBsb25nIGRhdGFQdHJfX2xlbl9fOworICAgIGludCBkYXRhUHRyX19pbl9sZW5fXzsKKyAgICBVSW50MzIgZGF0YU9mZnNldDsKICNpZm5kZWYgR2V0Rmxhdm9yRGF0YQotCVB5TWFjX1BSRUNIRUNLKEdldEZsYXZvckRhdGEpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldEZsYXZvckRhdGEpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8maWwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGhlSXRlbVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRhdGFQdHJfX2luX2xlbl9fLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGF0YU9mZnNldCkpCi0JCXJldHVybiBOVUxMOwotCWlmICgoZGF0YVB0cl9fb3V0X18gPSBtYWxsb2MoZGF0YVB0cl9faW5fbGVuX18pKSA9PSBOVUxMKQotCXsKLQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJZ290byBkYXRhUHRyX19lcnJvcl9fOwotCX0KLQlkYXRhUHRyX19sZW5fXyA9IGRhdGFQdHJfX2luX2xlbl9fOwotCV9lcnIgPSBHZXRGbGF2b3JEYXRhKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgdGhlSXRlbVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICB0aGVUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgIGRhdGFQdHJfX291dF9fLCAmZGF0YVB0cl9fbGVuX18sCi0JICAgICAgICAgICAgICAgICAgICAgZGF0YU9mZnNldCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgicyMiLAotCSAgICAgICAgICAgICAgICAgICAgIGRhdGFQdHJfX291dF9fLCAoaW50KWRhdGFQdHJfX2xlbl9fKTsKLQlmcmVlKGRhdGFQdHJfX291dF9fKTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyZpbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVJdGVtUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVB0cl9faW5fbGVuX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhT2Zmc2V0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKChkYXRhUHRyX19vdXRfXyA9IG1hbGxvYyhkYXRhUHRyX19pbl9sZW5fXykpID09IE5VTEwpCisgICAgeworICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICBnb3RvIGRhdGFQdHJfX2Vycm9yX187CisgICAgfQorICAgIGRhdGFQdHJfX2xlbl9fID0gZGF0YVB0cl9faW5fbGVuX187CisgICAgX2VyciA9IEdldEZsYXZvckRhdGEoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0aGVJdGVtUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRoZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVB0cl9fb3V0X18sICZkYXRhUHRyX19sZW5fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhT2Zmc2V0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJzIyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVB0cl9fb3V0X18sIChpbnQpZGF0YVB0cl9fbGVuX18pOworICAgIGZyZWUoZGF0YVB0cl9fb3V0X18pOwogIGRhdGFQdHJfX2Vycm9yX186IDsKLQlyZXR1cm4gX3JlczsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEcmFnT2JqX0dldERyYWdJdGVtQm91bmRzKERyYWdPYmpPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSXRlbVJlZmVyZW5jZSB0aGVJdGVtUmVmOwotCVJlY3QgaXRlbUJvdW5kczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBJdGVtUmVmZXJlbmNlIHRoZUl0ZW1SZWY7CisgICAgUmVjdCBpdGVtQm91bmRzOwogI2lmbmRlZiBHZXREcmFnSXRlbUJvdW5kcwotCVB5TWFjX1BSRUNIRUNLKEdldERyYWdJdGVtQm91bmRzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXREcmFnSXRlbUJvdW5kcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRoZUl0ZW1SZWYpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0RHJhZ0l0ZW1Cb3VuZHMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgdGhlSXRlbVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZW1Cb3VuZHMpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZpdGVtQm91bmRzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUl0ZW1SZWYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0RHJhZ0l0ZW1Cb3VuZHMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlSXRlbVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZW1Cb3VuZHMpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZpdGVtQm91bmRzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEcmFnT2JqX1NldERyYWdJdGVtQm91bmRzKERyYWdPYmpPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSXRlbVJlZmVyZW5jZSB0aGVJdGVtUmVmOwotCVJlY3QgaXRlbUJvdW5kczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBJdGVtUmVmZXJlbmNlIHRoZUl0ZW1SZWY7CisgICAgUmVjdCBpdGVtQm91bmRzOwogI2lmbmRlZiBTZXREcmFnSXRlbUJvdW5kcwotCVB5TWFjX1BSRUNIRUNLKFNldERyYWdJdGVtQm91bmRzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXREcmFnSXRlbUJvdW5kcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGhlSXRlbVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJml0ZW1Cb3VuZHMpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0RHJhZ0l0ZW1Cb3VuZHMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgdGhlSXRlbVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZW1Cb3VuZHMpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVJdGVtUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaXRlbUJvdW5kcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXREcmFnSXRlbUJvdW5kcyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVJdGVtUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRlbUJvdW5kcyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRHJhZ09ial9HZXREcm9wTG9jYXRpb24oRHJhZ09iak9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlBRURlc2MgZHJvcExvY2F0aW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEFFRGVzYyBkcm9wTG9jYXRpb247CiAjaWZuZGVmIEdldERyb3BMb2NhdGlvbgotCVB5TWFjX1BSRUNIRUNLKEdldERyb3BMb2NhdGlvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0RHJvcExvY2F0aW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0RHJvcExvY2F0aW9uKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAmZHJvcExvY2F0aW9uKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX05ldywgJmRyb3BMb2NhdGlvbik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXREcm9wTG9jYXRpb24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZkcm9wTG9jYXRpb24pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBRURlc2NfTmV3LCAmZHJvcExvY2F0aW9uKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEcmFnT2JqX1NldERyb3BMb2NhdGlvbihEcmFnT2JqT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUFFRGVzYyBkcm9wTG9jYXRpb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgQUVEZXNjIGRyb3BMb2NhdGlvbjsKICNpZm5kZWYgU2V0RHJvcExvY2F0aW9uCi0JUHlNYWNfUFJFQ0hFQ0soU2V0RHJvcExvY2F0aW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXREcm9wTG9jYXRpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBBRURlc2NfQ29udmVydCwgJmRyb3BMb2NhdGlvbikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXREcm9wTG9jYXRpb24oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICZkcm9wTG9jYXRpb24pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX0NvbnZlcnQsICZkcm9wTG9jYXRpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0RHJvcExvY2F0aW9uKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHJvcExvY2F0aW9uKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEcmFnT2JqX0dldERyYWdBdHRyaWJ1dGVzKERyYWdPYmpPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JRHJhZ0F0dHJpYnV0ZXMgZmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgRHJhZ0F0dHJpYnV0ZXMgZmxhZ3M7CiAjaWZuZGVmIEdldERyYWdBdHRyaWJ1dGVzCi0JUHlNYWNfUFJFQ0hFQ0soR2V0RHJhZ0F0dHJpYnV0ZXMpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERyYWdBdHRyaWJ1dGVzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0RHJhZ0F0dHJpYnV0ZXMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBmbGFncyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXREcmFnQXR0cmlidXRlcyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEcmFnT2JqX0dldERyYWdNb3VzZShEcmFnT2JqT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVBvaW50IG1vdXNlOwotCVBvaW50IGdsb2JhbFBpbm5lZE1vdXNlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFBvaW50IG1vdXNlOworICAgIFBvaW50IGdsb2JhbFBpbm5lZE1vdXNlOwogI2lmbmRlZiBHZXREcmFnTW91c2UKLQlQeU1hY19QUkVDSEVDSyhHZXREcmFnTW91c2UpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERyYWdNb3VzZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldERyYWdNb3VzZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgJm1vdXNlLAotCSAgICAgICAgICAgICAgICAgICAgJmdsb2JhbFBpbm5lZE1vdXNlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFBvaW50LCBtb3VzZSwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFBvaW50LCBnbG9iYWxQaW5uZWRNb3VzZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXREcmFnTW91c2UoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICZtb3VzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZnbG9iYWxQaW5uZWRNb3VzZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRQb2ludCwgbW91c2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRQb2ludCwgZ2xvYmFsUGlubmVkTW91c2UpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRyYWdPYmpfU2V0RHJhZ01vdXNlKERyYWdPYmpPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JUG9pbnQgZ2xvYmFsUGlubmVkTW91c2U7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgUG9pbnQgZ2xvYmFsUGlubmVkTW91c2U7CiAjaWZuZGVmIFNldERyYWdNb3VzZQotCVB5TWFjX1BSRUNIRUNLKFNldERyYWdNb3VzZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0RHJhZ01vdXNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZnbG9iYWxQaW5uZWRNb3VzZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXREcmFnTW91c2UoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgIGdsb2JhbFBpbm5lZE1vdXNlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmZ2xvYmFsUGlubmVkTW91c2UpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0RHJhZ01vdXNlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxQaW5uZWRNb3VzZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRHJhZ09ial9HZXREcmFnT3JpZ2luKERyYWdPYmpPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JUG9pbnQgZ2xvYmFsSW5pdGlhbE1vdXNlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFBvaW50IGdsb2JhbEluaXRpYWxNb3VzZTsKICNpZm5kZWYgR2V0RHJhZ09yaWdpbgotCVB5TWFjX1BSRUNIRUNLKEdldERyYWdPcmlnaW4pOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERyYWdPcmlnaW4pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXREcmFnT3JpZ2luKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgJmdsb2JhbEluaXRpYWxNb3VzZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUG9pbnQsIGdsb2JhbEluaXRpYWxNb3VzZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXREcmFnT3JpZ2luKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgJmdsb2JhbEluaXRpYWxNb3VzZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUG9pbnQsIGdsb2JhbEluaXRpYWxNb3VzZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRHJhZ09ial9HZXREcmFnTW9kaWZpZXJzKERyYWdPYmpPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU0ludDE2IG1vZGlmaWVyczsKLQlTSW50MTYgbW91c2VEb3duTW9kaWZpZXJzOwotCVNJbnQxNiBtb3VzZVVwTW9kaWZpZXJzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFNJbnQxNiBtb2RpZmllcnM7CisgICAgU0ludDE2IG1vdXNlRG93bk1vZGlmaWVyczsKKyAgICBTSW50MTYgbW91c2VVcE1vZGlmaWVyczsKICNpZm5kZWYgR2V0RHJhZ01vZGlmaWVycwotCVB5TWFjX1BSRUNIRUNLKEdldERyYWdNb2RpZmllcnMpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERyYWdNb2RpZmllcnMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXREcmFnTW9kaWZpZXJzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGlmaWVycywKLQkgICAgICAgICAgICAgICAgICAgICAgICAmbW91c2VEb3duTW9kaWZpZXJzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICZtb3VzZVVwTW9kaWZpZXJzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoaGgiLAotCSAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVycywKLQkgICAgICAgICAgICAgICAgICAgICBtb3VzZURvd25Nb2RpZmllcnMsCi0JICAgICAgICAgICAgICAgICAgICAgbW91c2VVcE1vZGlmaWVycyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXREcmFnTW9kaWZpZXJzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGlmaWVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbW91c2VEb3duTW9kaWZpZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtb3VzZVVwTW9kaWZpZXJzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICBtb3VzZURvd25Nb2RpZmllcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgbW91c2VVcE1vZGlmaWVycyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRHJhZ09ial9TaG93RHJhZ0hpbGl0ZShEcmFnT2JqT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVJnbkhhbmRsZSBoaWxpdGVGcmFtZTsKLQlCb29sZWFuIGluc2lkZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBSZ25IYW5kbGUgaGlsaXRlRnJhbWU7CisgICAgQm9vbGVhbiBpbnNpZGU7CiAjaWZuZGVmIFNob3dEcmFnSGlsaXRlCi0JUHlNYWNfUFJFQ0hFQ0soU2hvd0RyYWdIaWxpdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNob3dEcmFnSGlsaXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaGlsaXRlRnJhbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbnNpZGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2hvd0RyYWdIaWxpdGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgaGlsaXRlRnJhbWUsCi0JICAgICAgICAgICAgICAgICAgICAgIGluc2lkZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZoaWxpdGVGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluc2lkZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTaG93RHJhZ0hpbGl0ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBoaWxpdGVGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zaWRlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEcmFnT2JqX0hpZGVEcmFnSGlsaXRlKERyYWdPYmpPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CiAjaWZuZGVmIEhpZGVEcmFnSGlsaXRlCi0JUHlNYWNfUFJFQ0hFQ0soSGlkZURyYWdIaWxpdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEhpZGVEcmFnSGlsaXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gSGlkZURyYWdIaWxpdGUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBIaWRlRHJhZ0hpbGl0ZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEcmFnT2JqX0RyYWdQcmVTY3JvbGwoRHJhZ09iak9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlTSW50MTYgZEg7Ci0JU0ludDE2IGRWOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFNJbnQxNiBkSDsKKyAgICBTSW50MTYgZFY7CiAjaWZuZGVmIERyYWdQcmVTY3JvbGwKLQlQeU1hY19QUkVDSEVDSyhEcmFnUHJlU2Nyb2xsKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEcmFnUHJlU2Nyb2xsKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRILAotCSAgICAgICAgICAgICAgICAgICAgICAmZFYpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRHJhZ1ByZVNjcm9sbChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgIGRILAotCSAgICAgICAgICAgICAgICAgICAgIGRWKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRWKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IERyYWdQcmVTY3JvbGwoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkVik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRHJhZ09ial9EcmFnUG9zdFNjcm9sbChEcmFnT2JqT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOwogI2lmbmRlZiBEcmFnUG9zdFNjcm9sbAotCVB5TWFjX1BSRUNIRUNLKERyYWdQb3N0U2Nyb2xsKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEcmFnUG9zdFNjcm9sbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IERyYWdQb3N0U2Nyb2xsKF9zZWxmLT5vYl9pdHNlbGYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRHJhZ1Bvc3RTY3JvbGwoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRHJhZ09ial9VcGRhdGVEcmFnSGlsaXRlKERyYWdPYmpPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JUmduSGFuZGxlIHVwZGF0ZVJnbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBSZ25IYW5kbGUgdXBkYXRlUmduOwogI2lmbmRlZiBVcGRhdGVEcmFnSGlsaXRlCi0JUHlNYWNfUFJFQ0hFQ0soVXBkYXRlRHJhZ0hpbGl0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVXBkYXRlRHJhZ0hpbGl0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdXBkYXRlUmduKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFVwZGF0ZURyYWdIaWxpdGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVSZ24pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ1cGRhdGVSZ24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVXBkYXRlRHJhZ0hpbGl0ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVJnbik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBEcmFnT2JqX21ldGhvZHNbXSA9IHsKLQl7IkRpc3Bvc2VEcmFnIiwgKFB5Q0Z1bmN0aW9uKURyYWdPYmpfRGlzcG9zZURyYWcsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkFkZERyYWdJdGVtRmxhdm9yIiwgKFB5Q0Z1bmN0aW9uKURyYWdPYmpfQWRkRHJhZ0l0ZW1GbGF2b3IsIDEsCi0JIFB5RG9jX1NUUigiKEl0ZW1SZWZlcmVuY2UgdGhlSXRlbVJlZiwgRmxhdm9yVHlwZSB0aGVUeXBlLCBCdWZmZXIgZGF0YVB0ciwgRmxhdm9yRmxhZ3MgdGhlRmxhZ3MpIC0+IE5vbmUiKX0sCi0JeyJTZXREcmFnSXRlbUZsYXZvckRhdGEiLCAoUHlDRnVuY3Rpb24pRHJhZ09ial9TZXREcmFnSXRlbUZsYXZvckRhdGEsIDEsCi0JIFB5RG9jX1NUUigiKEl0ZW1SZWZlcmVuY2UgdGhlSXRlbVJlZiwgRmxhdm9yVHlwZSB0aGVUeXBlLCBCdWZmZXIgZGF0YVB0ciwgVUludDMyIGRhdGFPZmZzZXQpIC0+IE5vbmUiKX0sCi0JeyJTZXREcmFnSW1hZ2UiLCAoUHlDRnVuY3Rpb24pRHJhZ09ial9TZXREcmFnSW1hZ2UsIDEsCi0JIFB5RG9jX1NUUigiKFBpeE1hcEhhbmRsZSBpbWFnZVBpeE1hcCwgUmduSGFuZGxlIGltYWdlUmduLCBQb2ludCBpbWFnZU9mZnNldFB0LCBEcmFnSW1hZ2VGbGFncyB0aGVJbWFnZUZsYWdzKSAtPiBOb25lIil9LAotCXsiQ2hhbmdlRHJhZ0JlaGF2aW9ycyIsIChQeUNGdW5jdGlvbilEcmFnT2JqX0NoYW5nZURyYWdCZWhhdmlvcnMsIDEsCi0JIFB5RG9jX1NUUigiKERyYWdCZWhhdmlvcnMgaW5CZWhhdmlvcnNUb1NldCwgRHJhZ0JlaGF2aW9ycyBpbkJlaGF2aW9yc1RvQ2xlYXIpIC0+IE5vbmUiKX0sCi0JeyJUcmFja0RyYWciLCAoUHlDRnVuY3Rpb24pRHJhZ09ial9UcmFja0RyYWcsIDEsCi0JIFB5RG9jX1NUUigiKEV2ZW50UmVjb3JkIHRoZUV2ZW50LCBSZ25IYW5kbGUgdGhlUmVnaW9uKSAtPiBOb25lIil9LAotCXsiQ291bnREcmFnSXRlbXMiLCAoUHlDRnVuY3Rpb24pRHJhZ09ial9Db3VudERyYWdJdGVtcywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVUludDE2IG51bUl0ZW1zKSIpfSwKLQl7IkdldERyYWdJdGVtUmVmZXJlbmNlTnVtYmVyIiwgKFB5Q0Z1bmN0aW9uKURyYWdPYmpfR2V0RHJhZ0l0ZW1SZWZlcmVuY2VOdW1iZXIsIDEsCi0JIFB5RG9jX1NUUigiKFVJbnQxNiBpbmRleCkgLT4gKEl0ZW1SZWZlcmVuY2UgdGhlSXRlbVJlZikiKX0sCi0JeyJDb3VudERyYWdJdGVtRmxhdm9ycyIsIChQeUNGdW5jdGlvbilEcmFnT2JqX0NvdW50RHJhZ0l0ZW1GbGF2b3JzLCAxLAotCSBQeURvY19TVFIoIihJdGVtUmVmZXJlbmNlIHRoZUl0ZW1SZWYpIC0+IChVSW50MTYgbnVtRmxhdm9ycykiKX0sCi0JeyJHZXRGbGF2b3JUeXBlIiwgKFB5Q0Z1bmN0aW9uKURyYWdPYmpfR2V0Rmxhdm9yVHlwZSwgMSwKLQkgUHlEb2NfU1RSKCIoSXRlbVJlZmVyZW5jZSB0aGVJdGVtUmVmLCBVSW50MTYgaW5kZXgpIC0+IChGbGF2b3JUeXBlIHRoZVR5cGUpIil9LAotCXsiR2V0Rmxhdm9yRmxhZ3MiLCAoUHlDRnVuY3Rpb24pRHJhZ09ial9HZXRGbGF2b3JGbGFncywgMSwKLQkgUHlEb2NfU1RSKCIoSXRlbVJlZmVyZW5jZSB0aGVJdGVtUmVmLCBGbGF2b3JUeXBlIHRoZVR5cGUpIC0+IChGbGF2b3JGbGFncyB0aGVGbGFncykiKX0sCi0JeyJHZXRGbGF2b3JEYXRhU2l6ZSIsIChQeUNGdW5jdGlvbilEcmFnT2JqX0dldEZsYXZvckRhdGFTaXplLCAxLAotCSBQeURvY19TVFIoIihJdGVtUmVmZXJlbmNlIHRoZUl0ZW1SZWYsIEZsYXZvclR5cGUgdGhlVHlwZSkgLT4gKFNpemUgZGF0YVNpemUpIil9LAotCXsiR2V0Rmxhdm9yRGF0YSIsIChQeUNGdW5jdGlvbilEcmFnT2JqX0dldEZsYXZvckRhdGEsIDEsCi0JIFB5RG9jX1NUUigiKEl0ZW1SZWZlcmVuY2UgdGhlSXRlbVJlZiwgRmxhdm9yVHlwZSB0aGVUeXBlLCBCdWZmZXIgZGF0YVB0ciwgVUludDMyIGRhdGFPZmZzZXQpIC0+IChCdWZmZXIgZGF0YVB0cikiKX0sCi0JeyJHZXREcmFnSXRlbUJvdW5kcyIsIChQeUNGdW5jdGlvbilEcmFnT2JqX0dldERyYWdJdGVtQm91bmRzLCAxLAotCSBQeURvY19TVFIoIihJdGVtUmVmZXJlbmNlIHRoZUl0ZW1SZWYpIC0+IChSZWN0IGl0ZW1Cb3VuZHMpIil9LAotCXsiU2V0RHJhZ0l0ZW1Cb3VuZHMiLCAoUHlDRnVuY3Rpb24pRHJhZ09ial9TZXREcmFnSXRlbUJvdW5kcywgMSwKLQkgUHlEb2NfU1RSKCIoSXRlbVJlZmVyZW5jZSB0aGVJdGVtUmVmLCBSZWN0IGl0ZW1Cb3VuZHMpIC0+IE5vbmUiKX0sCi0JeyJHZXREcm9wTG9jYXRpb24iLCAoUHlDRnVuY3Rpb24pRHJhZ09ial9HZXREcm9wTG9jYXRpb24sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEFFRGVzYyBkcm9wTG9jYXRpb24pIil9LAotCXsiU2V0RHJvcExvY2F0aW9uIiwgKFB5Q0Z1bmN0aW9uKURyYWdPYmpfU2V0RHJvcExvY2F0aW9uLCAxLAotCSBQeURvY19TVFIoIihBRURlc2MgZHJvcExvY2F0aW9uKSAtPiBOb25lIil9LAotCXsiR2V0RHJhZ0F0dHJpYnV0ZXMiLCAoUHlDRnVuY3Rpb24pRHJhZ09ial9HZXREcmFnQXR0cmlidXRlcywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoRHJhZ0F0dHJpYnV0ZXMgZmxhZ3MpIil9LAotCXsiR2V0RHJhZ01vdXNlIiwgKFB5Q0Z1bmN0aW9uKURyYWdPYmpfR2V0RHJhZ01vdXNlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChQb2ludCBtb3VzZSwgUG9pbnQgZ2xvYmFsUGlubmVkTW91c2UpIil9LAotCXsiU2V0RHJhZ01vdXNlIiwgKFB5Q0Z1bmN0aW9uKURyYWdPYmpfU2V0RHJhZ01vdXNlLCAxLAotCSBQeURvY19TVFIoIihQb2ludCBnbG9iYWxQaW5uZWRNb3VzZSkgLT4gTm9uZSIpfSwKLQl7IkdldERyYWdPcmlnaW4iLCAoUHlDRnVuY3Rpb24pRHJhZ09ial9HZXREcmFnT3JpZ2luLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChQb2ludCBnbG9iYWxJbml0aWFsTW91c2UpIil9LAotCXsiR2V0RHJhZ01vZGlmaWVycyIsIChQeUNGdW5jdGlvbilEcmFnT2JqX0dldERyYWdNb2RpZmllcnMsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFNJbnQxNiBtb2RpZmllcnMsIFNJbnQxNiBtb3VzZURvd25Nb2RpZmllcnMsIFNJbnQxNiBtb3VzZVVwTW9kaWZpZXJzKSIpfSwKLQl7IlNob3dEcmFnSGlsaXRlIiwgKFB5Q0Z1bmN0aW9uKURyYWdPYmpfU2hvd0RyYWdIaWxpdGUsIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSBoaWxpdGVGcmFtZSwgQm9vbGVhbiBpbnNpZGUpIC0+IE5vbmUiKX0sCi0JeyJIaWRlRHJhZ0hpbGl0ZSIsIChQeUNGdW5jdGlvbilEcmFnT2JqX0hpZGVEcmFnSGlsaXRlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJEcmFnUHJlU2Nyb2xsIiwgKFB5Q0Z1bmN0aW9uKURyYWdPYmpfRHJhZ1ByZVNjcm9sbCwgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IGRILCBTSW50MTYgZFYpIC0+IE5vbmUiKX0sCi0JeyJEcmFnUG9zdFNjcm9sbCIsIChQeUNGdW5jdGlvbilEcmFnT2JqX0RyYWdQb3N0U2Nyb2xsLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJVcGRhdGVEcmFnSGlsaXRlIiwgKFB5Q0Z1bmN0aW9uKURyYWdPYmpfVXBkYXRlRHJhZ0hpbGl0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHVwZGF0ZVJnbikgLT4gTm9uZSIpfSwKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7IkRpc3Bvc2VEcmFnIiwgKFB5Q0Z1bmN0aW9uKURyYWdPYmpfRGlzcG9zZURyYWcsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkFkZERyYWdJdGVtRmxhdm9yIiwgKFB5Q0Z1bmN0aW9uKURyYWdPYmpfQWRkRHJhZ0l0ZW1GbGF2b3IsIDEsCisgICAgIFB5RG9jX1NUUigiKEl0ZW1SZWZlcmVuY2UgdGhlSXRlbVJlZiwgRmxhdm9yVHlwZSB0aGVUeXBlLCBCdWZmZXIgZGF0YVB0ciwgRmxhdm9yRmxhZ3MgdGhlRmxhZ3MpIC0+IE5vbmUiKX0sCisgICAgeyJTZXREcmFnSXRlbUZsYXZvckRhdGEiLCAoUHlDRnVuY3Rpb24pRHJhZ09ial9TZXREcmFnSXRlbUZsYXZvckRhdGEsIDEsCisgICAgIFB5RG9jX1NUUigiKEl0ZW1SZWZlcmVuY2UgdGhlSXRlbVJlZiwgRmxhdm9yVHlwZSB0aGVUeXBlLCBCdWZmZXIgZGF0YVB0ciwgVUludDMyIGRhdGFPZmZzZXQpIC0+IE5vbmUiKX0sCisgICAgeyJTZXREcmFnSW1hZ2UiLCAoUHlDRnVuY3Rpb24pRHJhZ09ial9TZXREcmFnSW1hZ2UsIDEsCisgICAgIFB5RG9jX1NUUigiKFBpeE1hcEhhbmRsZSBpbWFnZVBpeE1hcCwgUmduSGFuZGxlIGltYWdlUmduLCBQb2ludCBpbWFnZU9mZnNldFB0LCBEcmFnSW1hZ2VGbGFncyB0aGVJbWFnZUZsYWdzKSAtPiBOb25lIil9LAorICAgIHsiQ2hhbmdlRHJhZ0JlaGF2aW9ycyIsIChQeUNGdW5jdGlvbilEcmFnT2JqX0NoYW5nZURyYWdCZWhhdmlvcnMsIDEsCisgICAgIFB5RG9jX1NUUigiKERyYWdCZWhhdmlvcnMgaW5CZWhhdmlvcnNUb1NldCwgRHJhZ0JlaGF2aW9ycyBpbkJlaGF2aW9yc1RvQ2xlYXIpIC0+IE5vbmUiKX0sCisgICAgeyJUcmFja0RyYWciLCAoUHlDRnVuY3Rpb24pRHJhZ09ial9UcmFja0RyYWcsIDEsCisgICAgIFB5RG9jX1NUUigiKEV2ZW50UmVjb3JkIHRoZUV2ZW50LCBSZ25IYW5kbGUgdGhlUmVnaW9uKSAtPiBOb25lIil9LAorICAgIHsiQ291bnREcmFnSXRlbXMiLCAoUHlDRnVuY3Rpb24pRHJhZ09ial9Db3VudERyYWdJdGVtcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVUludDE2IG51bUl0ZW1zKSIpfSwKKyAgICB7IkdldERyYWdJdGVtUmVmZXJlbmNlTnVtYmVyIiwgKFB5Q0Z1bmN0aW9uKURyYWdPYmpfR2V0RHJhZ0l0ZW1SZWZlcmVuY2VOdW1iZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKFVJbnQxNiBpbmRleCkgLT4gKEl0ZW1SZWZlcmVuY2UgdGhlSXRlbVJlZikiKX0sCisgICAgeyJDb3VudERyYWdJdGVtRmxhdm9ycyIsIChQeUNGdW5jdGlvbilEcmFnT2JqX0NvdW50RHJhZ0l0ZW1GbGF2b3JzLCAxLAorICAgICBQeURvY19TVFIoIihJdGVtUmVmZXJlbmNlIHRoZUl0ZW1SZWYpIC0+IChVSW50MTYgbnVtRmxhdm9ycykiKX0sCisgICAgeyJHZXRGbGF2b3JUeXBlIiwgKFB5Q0Z1bmN0aW9uKURyYWdPYmpfR2V0Rmxhdm9yVHlwZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSXRlbVJlZmVyZW5jZSB0aGVJdGVtUmVmLCBVSW50MTYgaW5kZXgpIC0+IChGbGF2b3JUeXBlIHRoZVR5cGUpIil9LAorICAgIHsiR2V0Rmxhdm9yRmxhZ3MiLCAoUHlDRnVuY3Rpb24pRHJhZ09ial9HZXRGbGF2b3JGbGFncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoSXRlbVJlZmVyZW5jZSB0aGVJdGVtUmVmLCBGbGF2b3JUeXBlIHRoZVR5cGUpIC0+IChGbGF2b3JGbGFncyB0aGVGbGFncykiKX0sCisgICAgeyJHZXRGbGF2b3JEYXRhU2l6ZSIsIChQeUNGdW5jdGlvbilEcmFnT2JqX0dldEZsYXZvckRhdGFTaXplLCAxLAorICAgICBQeURvY19TVFIoIihJdGVtUmVmZXJlbmNlIHRoZUl0ZW1SZWYsIEZsYXZvclR5cGUgdGhlVHlwZSkgLT4gKFNpemUgZGF0YVNpemUpIil9LAorICAgIHsiR2V0Rmxhdm9yRGF0YSIsIChQeUNGdW5jdGlvbilEcmFnT2JqX0dldEZsYXZvckRhdGEsIDEsCisgICAgIFB5RG9jX1NUUigiKEl0ZW1SZWZlcmVuY2UgdGhlSXRlbVJlZiwgRmxhdm9yVHlwZSB0aGVUeXBlLCBCdWZmZXIgZGF0YVB0ciwgVUludDMyIGRhdGFPZmZzZXQpIC0+IChCdWZmZXIgZGF0YVB0cikiKX0sCisgICAgeyJHZXREcmFnSXRlbUJvdW5kcyIsIChQeUNGdW5jdGlvbilEcmFnT2JqX0dldERyYWdJdGVtQm91bmRzLCAxLAorICAgICBQeURvY19TVFIoIihJdGVtUmVmZXJlbmNlIHRoZUl0ZW1SZWYpIC0+IChSZWN0IGl0ZW1Cb3VuZHMpIil9LAorICAgIHsiU2V0RHJhZ0l0ZW1Cb3VuZHMiLCAoUHlDRnVuY3Rpb24pRHJhZ09ial9TZXREcmFnSXRlbUJvdW5kcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoSXRlbVJlZmVyZW5jZSB0aGVJdGVtUmVmLCBSZWN0IGl0ZW1Cb3VuZHMpIC0+IE5vbmUiKX0sCisgICAgeyJHZXREcm9wTG9jYXRpb24iLCAoUHlDRnVuY3Rpb24pRHJhZ09ial9HZXREcm9wTG9jYXRpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEFFRGVzYyBkcm9wTG9jYXRpb24pIil9LAorICAgIHsiU2V0RHJvcExvY2F0aW9uIiwgKFB5Q0Z1bmN0aW9uKURyYWdPYmpfU2V0RHJvcExvY2F0aW9uLCAxLAorICAgICBQeURvY19TVFIoIihBRURlc2MgZHJvcExvY2F0aW9uKSAtPiBOb25lIil9LAorICAgIHsiR2V0RHJhZ0F0dHJpYnV0ZXMiLCAoUHlDRnVuY3Rpb24pRHJhZ09ial9HZXREcmFnQXR0cmlidXRlcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoRHJhZ0F0dHJpYnV0ZXMgZmxhZ3MpIil9LAorICAgIHsiR2V0RHJhZ01vdXNlIiwgKFB5Q0Z1bmN0aW9uKURyYWdPYmpfR2V0RHJhZ01vdXNlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChQb2ludCBtb3VzZSwgUG9pbnQgZ2xvYmFsUGlubmVkTW91c2UpIil9LAorICAgIHsiU2V0RHJhZ01vdXNlIiwgKFB5Q0Z1bmN0aW9uKURyYWdPYmpfU2V0RHJhZ01vdXNlLCAxLAorICAgICBQeURvY19TVFIoIihQb2ludCBnbG9iYWxQaW5uZWRNb3VzZSkgLT4gTm9uZSIpfSwKKyAgICB7IkdldERyYWdPcmlnaW4iLCAoUHlDRnVuY3Rpb24pRHJhZ09ial9HZXREcmFnT3JpZ2luLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChQb2ludCBnbG9iYWxJbml0aWFsTW91c2UpIil9LAorICAgIHsiR2V0RHJhZ01vZGlmaWVycyIsIChQeUNGdW5jdGlvbilEcmFnT2JqX0dldERyYWdNb2RpZmllcnMsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFNJbnQxNiBtb2RpZmllcnMsIFNJbnQxNiBtb3VzZURvd25Nb2RpZmllcnMsIFNJbnQxNiBtb3VzZVVwTW9kaWZpZXJzKSIpfSwKKyAgICB7IlNob3dEcmFnSGlsaXRlIiwgKFB5Q0Z1bmN0aW9uKURyYWdPYmpfU2hvd0RyYWdIaWxpdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKFJnbkhhbmRsZSBoaWxpdGVGcmFtZSwgQm9vbGVhbiBpbnNpZGUpIC0+IE5vbmUiKX0sCisgICAgeyJIaWRlRHJhZ0hpbGl0ZSIsIChQeUNGdW5jdGlvbilEcmFnT2JqX0hpZGVEcmFnSGlsaXRlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJEcmFnUHJlU2Nyb2xsIiwgKFB5Q0Z1bmN0aW9uKURyYWdPYmpfRHJhZ1ByZVNjcm9sbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IGRILCBTSW50MTYgZFYpIC0+IE5vbmUiKX0sCisgICAgeyJEcmFnUG9zdFNjcm9sbCIsIChQeUNGdW5jdGlvbilEcmFnT2JqX0RyYWdQb3N0U2Nyb2xsLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJVcGRhdGVEcmFnSGlsaXRlIiwgKFB5Q0Z1bmN0aW9uKURyYWdPYmpfVXBkYXRlRHJhZ0hpbGl0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHVwZGF0ZVJnbikgLT4gTm9uZSIpfSwKKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKICNkZWZpbmUgRHJhZ09ial9nZXRzZXRsaXN0IE5VTEwKQEAgLTc0Nyw2MSArNzQ3LDYxIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqRHJhZ09ial90cF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlQeU9iamVjdCAqX3NlbGY7Ci0JRHJhZ1JlZiBpdHNlbGY7Ci0JY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CisgICAgUHlPYmplY3QgKl9zZWxmOworICAgIERyYWdSZWYgaXRzZWxmOworICAgIGNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgRHJhZ09ial9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7Ci0JaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkoKERyYWdPYmpPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlyZXR1cm4gX3NlbGY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgRHJhZ09ial9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAoKERyYWdPYmpPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICByZXR1cm4gX3NlbGY7CiB9CiAKICNkZWZpbmUgRHJhZ09ial90cF9mcmVlIFB5T2JqZWN0X0RlbAogCiAKIFB5VHlwZU9iamVjdCBEcmFnT2JqX1R5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCi0JMCwgLypvYl9zaXplKi8KLQkiX0RyYWcuRHJhZ09iaiIsIC8qdHBfbmFtZSovCi0Jc2l6ZW9mKERyYWdPYmpPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCi0JMCwgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKSBEcmFnT2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCi0JMCwgLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCi0JKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCi0JKGNtcGZ1bmMpIERyYWdPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpIERyYWdPYmpfcmVwciwgLyp0cF9yZXByKi8KLQkoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCi0JKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpIERyYWdPYmpfaGFzaCwgLyp0cF9oYXNoKi8KLQkwLCAvKnRwX2NhbGwqLwotCTAsIC8qdHBfc3RyKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCi0JUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KLQkwLCAvKnRwX2FzX2J1ZmZlciovCi0JUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCi0JMCwgLyp0cF9kb2MqLwotCTAsIC8qdHBfdHJhdmVyc2UqLwotCTAsIC8qdHBfY2xlYXIqLwotCTAsIC8qdHBfcmljaGNvbXBhcmUqLwotCTAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLwotCTAsIC8qdHBfaXRlciovCi0JMCwgLyp0cF9pdGVybmV4dCovCi0JRHJhZ09ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCi0JMCwgLyp0cF9tZW1iZXJzKi8KLQlEcmFnT2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KLQkwLCAvKnRwX2Jhc2UqLwotCTAsIC8qdHBfZGljdCovCi0JMCwgLyp0cF9kZXNjcl9nZXQqLwotCTAsIC8qdHBfZGVzY3Jfc2V0Ki8KLQkwLCAvKnRwX2RpY3RvZmZzZXQqLwotCURyYWdPYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLwotCURyYWdPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCi0JRHJhZ09ial90cF9uZXcsIC8qIHRwX25ldyAqLwotCURyYWdPYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgIDAsIC8qb2Jfc2l6ZSovCisgICAgIl9EcmFnLkRyYWdPYmoiLCAvKnRwX25hbWUqLworICAgIHNpemVvZihEcmFnT2JqT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLworICAgIDAsIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcikgRHJhZ09ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgIDAsIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLworICAgIChzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLworICAgIChjbXBmdW5jKSBEcmFnT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCisgICAgKHJlcHJmdW5jKSBEcmFnT2JqX3JlcHIsIC8qdHBfcmVwciovCisgICAgKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLworICAgIChQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKSBEcmFnT2JqX2hhc2gsIC8qdHBfaGFzaCovCisgICAgMCwgLyp0cF9jYWxsKi8KKyAgICAwLCAvKnRwX3N0ciovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLworICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCisgICAgMCwgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLworICAgIDAsIC8qdHBfZG9jKi8KKyAgICAwLCAvKnRwX3RyYXZlcnNlKi8KKyAgICAwLCAvKnRwX2NsZWFyKi8KKyAgICAwLCAvKnRwX3JpY2hjb21wYXJlKi8KKyAgICAwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KKyAgICAwLCAvKnRwX2l0ZXIqLworICAgIDAsIC8qdHBfaXRlcm5leHQqLworICAgIERyYWdPYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLworICAgIDAsIC8qdHBfbWVtYmVycyovCisgICAgRHJhZ09ial9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCisgICAgMCwgLyp0cF9iYXNlKi8KKyAgICAwLCAvKnRwX2RpY3QqLworICAgIDAsIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICBEcmFnT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KKyAgICBEcmFnT2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLworICAgIERyYWdPYmpfdHBfbmV3LCAvKiB0cF9uZXcgKi8KKyAgICBEcmFnT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tIEVuZCBvYmplY3QgdHlwZSBEcmFnT2JqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtODA5LDIwNCArODA5LDIwNCBAQAogCiBzdGF0aWMgUHlPYmplY3QgKkRyYWdfTmV3RHJhZyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlEcmFnUmVmIHRoZURyYWc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgRHJhZ1JlZiB0aGVEcmFnOwogI2lmbmRlZiBOZXdEcmFnCi0JUHlNYWNfUFJFQ0hFQ0soTmV3RHJhZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTmV3RHJhZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IE5ld0RyYWcoJnRoZURyYWcpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBEcmFnT2JqX05ldywgdGhlRHJhZyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBOZXdEcmFnKCZ0aGVEcmFnKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRHJhZ09ial9OZXcsIHRoZURyYWcpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRyYWdfR2V0RHJhZ0hpbGl0ZUNvbG9yKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVdpbmRvd1B0ciB3aW5kb3c7Ci0JUkdCQ29sb3IgY29sb3I7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgV2luZG93UHRyIHdpbmRvdzsKKyAgICBSR0JDb2xvciBjb2xvcjsKICNpZm5kZWYgR2V0RHJhZ0hpbGl0ZUNvbG9yCi0JUHlNYWNfUFJFQ0hFQ0soR2V0RHJhZ0hpbGl0ZUNvbG9yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXREcmFnSGlsaXRlQ29sb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJndpbmRvdykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXREcmFnSGlsaXRlQ29sb3Iod2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbG9yKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUWRSR0JfTmV3LCAmY29sb3IpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3cpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0RHJhZ0hpbGl0ZUNvbG9yKHdpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2xvcik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFFkUkdCX05ldywgJmNvbG9yKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEcmFnX1dhaXRNb3VzZU1vdmVkKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlQb2ludCBpbml0aWFsTW91c2U7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIFBvaW50IGluaXRpYWxNb3VzZTsKICNpZm5kZWYgV2FpdE1vdXNlTW92ZWQKLQlQeU1hY19QUkVDSEVDSyhXYWl0TW91c2VNb3ZlZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soV2FpdE1vdXNlTW92ZWQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJmluaXRpYWxNb3VzZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFdhaXRNb3VzZU1vdmVkKGluaXRpYWxNb3VzZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJmluaXRpYWxNb3VzZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFdhaXRNb3VzZU1vdmVkKGluaXRpYWxNb3VzZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRHJhZ19ab29tUmVjdHMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JUmVjdCBmcm9tUmVjdDsKLQlSZWN0IHRvUmVjdDsKLQlTSW50MTYgem9vbVN0ZXBzOwotCVpvb21BY2NlbGVyYXRpb24gYWNjZWxlcmF0aW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFJlY3QgZnJvbVJlY3Q7CisgICAgUmVjdCB0b1JlY3Q7CisgICAgU0ludDE2IHpvb21TdGVwczsKKyAgICBab29tQWNjZWxlcmF0aW9uIGFjY2VsZXJhdGlvbjsKICNpZm5kZWYgWm9vbVJlY3RzCi0JUHlNYWNfUFJFQ0hFQ0soWm9vbVJlY3RzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhab29tUmVjdHMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmZyb21SZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmdG9SZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmem9vbVN0ZXBzLAotCSAgICAgICAgICAgICAgICAgICAgICAmYWNjZWxlcmF0aW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFpvb21SZWN0cygmZnJvbVJlY3QsCi0JICAgICAgICAgICAgICAgICAmdG9SZWN0LAotCSAgICAgICAgICAgICAgICAgem9vbVN0ZXBzLAotCSAgICAgICAgICAgICAgICAgYWNjZWxlcmF0aW9uKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmZnJvbVJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZ0b1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ6b29tU3RlcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhY2NlbGVyYXRpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gWm9vbVJlY3RzKCZmcm9tUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICZ0b1JlY3QsCisgICAgICAgICAgICAgICAgICAgICB6b29tU3RlcHMsCisgICAgICAgICAgICAgICAgICAgICBhY2NlbGVyYXRpb24pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRyYWdfWm9vbVJlZ2lvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlSZ25IYW5kbGUgcmVnaW9uOwotCVBvaW50IHpvb21EaXN0YW5jZTsKLQlTSW50MTYgem9vbVN0ZXBzOwotCVpvb21BY2NlbGVyYXRpb24gYWNjZWxlcmF0aW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFJnbkhhbmRsZSByZWdpb247CisgICAgUG9pbnQgem9vbURpc3RhbmNlOworICAgIFNJbnQxNiB6b29tU3RlcHM7CisgICAgWm9vbUFjY2VsZXJhdGlvbiBhY2NlbGVyYXRpb247CiAjaWZuZGVmIFpvb21SZWdpb24KLQlQeU1hY19QUkVDSEVDSyhab29tUmVnaW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhab29tUmVnaW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmVnaW9uLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnpvb21EaXN0YW5jZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnpvb21TdGVwcywKLQkgICAgICAgICAgICAgICAgICAgICAgJmFjY2VsZXJhdGlvbikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBab29tUmVnaW9uKHJlZ2lvbiwKLQkgICAgICAgICAgICAgICAgICB6b29tRGlzdGFuY2UsCi0JICAgICAgICAgICAgICAgICAgem9vbVN0ZXBzLAotCSAgICAgICAgICAgICAgICAgIGFjY2VsZXJhdGlvbik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZWdpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmem9vbURpc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmem9vbVN0ZXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYWNjZWxlcmF0aW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFpvb21SZWdpb24ocmVnaW9uLAorICAgICAgICAgICAgICAgICAgICAgIHpvb21EaXN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICB6b29tU3RlcHMsCisgICAgICAgICAgICAgICAgICAgICAgYWNjZWxlcmF0aW9uKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEcmFnX0luc3RhbGxUcmFja2luZ0hhbmRsZXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKIAotCSAgICBQeU9iamVjdCAqY2FsbGJhY2s7Ci0JICAgIFdpbmRvd1B0ciB0aGVXaW5kb3cgPSBOVUxMOwotCSAgICBPU0VyciBfZXJyOworICAgICAgICBQeU9iamVjdCAqY2FsbGJhY2s7CisgICAgICAgIFdpbmRvd1B0ciB0aGVXaW5kb3cgPSBOVUxMOworICAgICAgICBPU0VyciBfZXJyOwogCi0JICAgIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPfE8mIiwgJmNhbGxiYWNrLCBXaW5PYmpfQ29udmVydCwgJnRoZVdpbmRvdykgKQotCSAgICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgIFB5X0lOQ1JFRihjYWxsYmFjayk7ICAgICAgICAvKiBDYW5ub3QgZGVjcmVmIGxhdGVyLCB0b28gYmFkICovCi0JICAgIF9lcnIgPSBJbnN0YWxsVHJhY2tpbmdIYW5kbGVyKGRyYWdnbHVlX1RyYWNraW5nSGFuZGxlclVQUCwgdGhlV2luZG93LCAodm9pZCAqKWNhbGxiYWNrKTsKLQkgICAgICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JICAgICAgICBfcmVzID0gUHlfTm9uZTsKLQkgICAgICAgIHJldHVybiBfcmVzOworICAgICAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiT3xPJiIsICZjYWxsYmFjaywgV2luT2JqX0NvbnZlcnQsICZ0aGVXaW5kb3cpICkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIFB5X0lOQ1JFRihjYWxsYmFjayk7ICAgICAgICAvKiBDYW5ub3QgZGVjcmVmIGxhdGVyLCB0b28gYmFkICovCisgICAgICAgIF9lcnIgPSBJbnN0YWxsVHJhY2tpbmdIYW5kbGVyKGRyYWdnbHVlX1RyYWNraW5nSGFuZGxlclVQUCwgdGhlV2luZG93LCAodm9pZCAqKWNhbGxiYWNrKTsKKyAgICAgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICBfcmVzID0gUHlfTm9uZTsKKyAgICAgICAgcmV0dXJuIF9yZXM7CiAKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEcmFnX0luc3RhbGxSZWNlaXZlSGFuZGxlcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogCi0JICAgIFB5T2JqZWN0ICpjYWxsYmFjazsKLQkgICAgV2luZG93UHRyIHRoZVdpbmRvdyA9IE5VTEw7Ci0JICAgIE9TRXJyIF9lcnI7CisgICAgICAgIFB5T2JqZWN0ICpjYWxsYmFjazsKKyAgICAgICAgV2luZG93UHRyIHRoZVdpbmRvdyA9IE5VTEw7CisgICAgICAgIE9TRXJyIF9lcnI7CiAKLQkgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk98TyYiLCAmY2FsbGJhY2ssIFdpbk9ial9Db252ZXJ0LCAmdGhlV2luZG93KSApCi0JICAgICAgICByZXR1cm4gTlVMTDsKLQkgICAgUHlfSU5DUkVGKGNhbGxiYWNrKTsgICAgICAgIC8qIENhbm5vdCBkZWNyZWYgbGF0ZXIsIHRvbyBiYWQgKi8KLQkgICAgX2VyciA9IEluc3RhbGxSZWNlaXZlSGFuZGxlcihkcmFnZ2x1ZV9SZWNlaXZlSGFuZGxlclVQUCwgdGhlV2luZG93LCAodm9pZCAqKWNhbGxiYWNrKTsKLQkgICAgICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JICAgICAgICBfcmVzID0gUHlfTm9uZTsKLQkgICAgICAgIHJldHVybiBfcmVzOworICAgICAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiT3xPJiIsICZjYWxsYmFjaywgV2luT2JqX0NvbnZlcnQsICZ0aGVXaW5kb3cpICkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIFB5X0lOQ1JFRihjYWxsYmFjayk7ICAgICAgICAvKiBDYW5ub3QgZGVjcmVmIGxhdGVyLCB0b28gYmFkICovCisgICAgICAgIF9lcnIgPSBJbnN0YWxsUmVjZWl2ZUhhbmRsZXIoZHJhZ2dsdWVfUmVjZWl2ZUhhbmRsZXJVUFAsIHRoZVdpbmRvdywgKHZvaWQgKiljYWxsYmFjayk7CisgICAgICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgX3JlcyA9IFB5X05vbmU7CisgICAgICAgIHJldHVybiBfcmVzOwogCiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRHJhZ19SZW1vdmVUcmFja2luZ0hhbmRsZXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKIAotCSAgICBXaW5kb3dQdHIgdGhlV2luZG93ID0gTlVMTDsKLQkgICAgT1NFcnIgX2VycjsKKyAgICAgICAgV2luZG93UHRyIHRoZVdpbmRvdyA9IE5VTEw7CisgICAgICAgIE9TRXJyIF9lcnI7CiAKLQkgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInxPJiIsIFdpbk9ial9Db252ZXJ0LCAmdGhlV2luZG93KSApCi0JICAgICAgICByZXR1cm4gTlVMTDsKLQkgICAgX2VyciA9IFJlbW92ZVRyYWNraW5nSGFuZGxlcihkcmFnZ2x1ZV9UcmFja2luZ0hhbmRsZXJVUFAsIHRoZVdpbmRvdyk7Ci0JICAgICAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCSAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwotCSAgICAgICAgX3JlcyA9IFB5X05vbmU7Ci0JICAgICAgICByZXR1cm4gX3JlczsKKyAgICAgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInxPJiIsIFdpbk9ial9Db252ZXJ0LCAmdGhlV2luZG93KSApCisgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBfZXJyID0gUmVtb3ZlVHJhY2tpbmdIYW5kbGVyKGRyYWdnbHVlX1RyYWNraW5nSGFuZGxlclVQUCwgdGhlV2luZG93KTsKKyAgICAgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICBfcmVzID0gUHlfTm9uZTsKKyAgICAgICAgcmV0dXJuIF9yZXM7CiAKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEcmFnX1JlbW92ZVJlY2VpdmVIYW5kbGVyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAKLQkgICAgV2luZG93UHRyIHRoZVdpbmRvdyA9IE5VTEw7Ci0JICAgIE9TRXJyIF9lcnI7CisgICAgICAgIFdpbmRvd1B0ciB0aGVXaW5kb3cgPSBOVUxMOworICAgICAgICBPU0VyciBfZXJyOwogCi0JICAgIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJ8TyYiLCBXaW5PYmpfQ29udmVydCwgJnRoZVdpbmRvdykgKQotCSAgICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgIF9lcnIgPSBSZW1vdmVSZWNlaXZlSGFuZGxlcihkcmFnZ2x1ZV9SZWNlaXZlSGFuZGxlclVQUCwgdGhlV2luZG93KTsKLQkgICAgICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JICAgICAgICBfcmVzID0gUHlfTm9uZTsKLQkgICAgICAgIHJldHVybiBfcmVzOworICAgICAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAifE8mIiwgV2luT2JqX0NvbnZlcnQsICZ0aGVXaW5kb3cpICkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIF9lcnIgPSBSZW1vdmVSZWNlaXZlSGFuZGxlcihkcmFnZ2x1ZV9SZWNlaXZlSGFuZGxlclVQUCwgdGhlV2luZG93KTsKKyAgICAgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICBfcmVzID0gUHlfTm9uZTsKKyAgICAgICAgcmV0dXJuIF9yZXM7CiAKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIERyYWdfbWV0aG9kc1tdID0gewotCXsiTmV3RHJhZyIsIChQeUNGdW5jdGlvbilEcmFnX05ld0RyYWcsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKERyYWdSZWYgdGhlRHJhZykiKX0sCi0JeyJHZXREcmFnSGlsaXRlQ29sb3IiLCAoUHlDRnVuY3Rpb24pRHJhZ19HZXREcmFnSGlsaXRlQ29sb3IsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3cpIC0+IChSR0JDb2xvciBjb2xvcikiKX0sCi0JeyJXYWl0TW91c2VNb3ZlZCIsIChQeUNGdW5jdGlvbilEcmFnX1dhaXRNb3VzZU1vdmVkLCAxLAotCSBQeURvY19TVFIoIihQb2ludCBpbml0aWFsTW91c2UpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJab29tUmVjdHMiLCAoUHlDRnVuY3Rpb24pRHJhZ19ab29tUmVjdHMsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgZnJvbVJlY3QsIFJlY3QgdG9SZWN0LCBTSW50MTYgem9vbVN0ZXBzLCBab29tQWNjZWxlcmF0aW9uIGFjY2VsZXJhdGlvbikgLT4gTm9uZSIpfSwKLQl7Ilpvb21SZWdpb24iLCAoUHlDRnVuY3Rpb24pRHJhZ19ab29tUmVnaW9uLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgcmVnaW9uLCBQb2ludCB6b29tRGlzdGFuY2UsIFNJbnQxNiB6b29tU3RlcHMsIFpvb21BY2NlbGVyYXRpb24gYWNjZWxlcmF0aW9uKSAtPiBOb25lIil9LAotCXsiSW5zdGFsbFRyYWNraW5nSGFuZGxlciIsIChQeUNGdW5jdGlvbilEcmFnX0luc3RhbGxUcmFja2luZ0hhbmRsZXIsIDEsCi0JIFB5RG9jX1NUUihOVUxMKX0sCi0JeyJJbnN0YWxsUmVjZWl2ZUhhbmRsZXIiLCAoUHlDRnVuY3Rpb24pRHJhZ19JbnN0YWxsUmVjZWl2ZUhhbmRsZXIsIDEsCi0JIFB5RG9jX1NUUihOVUxMKX0sCi0JeyJSZW1vdmVUcmFja2luZ0hhbmRsZXIiLCAoUHlDRnVuY3Rpb24pRHJhZ19SZW1vdmVUcmFja2luZ0hhbmRsZXIsIDEsCi0JIFB5RG9jX1NUUihOVUxMKX0sCi0JeyJSZW1vdmVSZWNlaXZlSGFuZGxlciIsIChQeUNGdW5jdGlvbilEcmFnX1JlbW92ZVJlY2VpdmVIYW5kbGVyLCAxLAotCSBQeURvY19TVFIoTlVMTCl9LAotCXtOVUxMLCBOVUxMLCAwfQorICAgIHsiTmV3RHJhZyIsIChQeUNGdW5jdGlvbilEcmFnX05ld0RyYWcsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKERyYWdSZWYgdGhlRHJhZykiKX0sCisgICAgeyJHZXREcmFnSGlsaXRlQ29sb3IiLCAoUHlDRnVuY3Rpb24pRHJhZ19HZXREcmFnSGlsaXRlQ29sb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3cpIC0+IChSR0JDb2xvciBjb2xvcikiKX0sCisgICAgeyJXYWl0TW91c2VNb3ZlZCIsIChQeUNGdW5jdGlvbilEcmFnX1dhaXRNb3VzZU1vdmVkLCAxLAorICAgICBQeURvY19TVFIoIihQb2ludCBpbml0aWFsTW91c2UpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJab29tUmVjdHMiLCAoUHlDRnVuY3Rpb24pRHJhZ19ab29tUmVjdHMsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgZnJvbVJlY3QsIFJlY3QgdG9SZWN0LCBTSW50MTYgem9vbVN0ZXBzLCBab29tQWNjZWxlcmF0aW9uIGFjY2VsZXJhdGlvbikgLT4gTm9uZSIpfSwKKyAgICB7Ilpvb21SZWdpb24iLCAoUHlDRnVuY3Rpb24pRHJhZ19ab29tUmVnaW9uLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgcmVnaW9uLCBQb2ludCB6b29tRGlzdGFuY2UsIFNJbnQxNiB6b29tU3RlcHMsIFpvb21BY2NlbGVyYXRpb24gYWNjZWxlcmF0aW9uKSAtPiBOb25lIil9LAorICAgIHsiSW5zdGFsbFRyYWNraW5nSGFuZGxlciIsIChQeUNGdW5jdGlvbilEcmFnX0luc3RhbGxUcmFja2luZ0hhbmRsZXIsIDEsCisgICAgIFB5RG9jX1NUUihOVUxMKX0sCisgICAgeyJJbnN0YWxsUmVjZWl2ZUhhbmRsZXIiLCAoUHlDRnVuY3Rpb24pRHJhZ19JbnN0YWxsUmVjZWl2ZUhhbmRsZXIsIDEsCisgICAgIFB5RG9jX1NUUihOVUxMKX0sCisgICAgeyJSZW1vdmVUcmFja2luZ0hhbmRsZXIiLCAoUHlDRnVuY3Rpb24pRHJhZ19SZW1vdmVUcmFja2luZ0hhbmRsZXIsIDEsCisgICAgIFB5RG9jX1NUUihOVUxMKX0sCisgICAgeyJSZW1vdmVSZWNlaXZlSGFuZGxlciIsIChQeUNGdW5jdGlvbilEcmFnX1JlbW92ZVJlY2VpdmVIYW5kbGVyLCAxLAorICAgICBQeURvY19TVFIoTlVMTCl9LAorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogCkBAIC0xMDE1LDgxICsxMDE1LDgxIEBACiBkcmFnZ2x1ZV9UcmFja2luZ0hhbmRsZXIoRHJhZ1RyYWNraW5nTWVzc2FnZSB0aGVNZXNzYWdlLCBXaW5kb3dQdHIgdGhlV2luZG93LAogICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmhhbmRsZXJSZWZDb24sIERyYWdSZWZlcmVuY2UgdGhlRHJhZykKIHsKLSAgICAgICAgUHlPYmplY3QgKmFyZ3MsICpydjsKLSAgICAgICAgaW50IGk7CisgICAgUHlPYmplY3QgKmFyZ3MsICpydjsKKyAgICBpbnQgaTsKIAotICAgICAgICBhcmdzID0gUHlfQnVpbGRWYWx1ZSgiaE8mTyYiLCB0aGVNZXNzYWdlLCBEcmFnT2JqX05ldywgdGhlRHJhZywgV2luT2JqX1doaWNoV2luZG93LCB0aGVXaW5kb3cpOwotICAgICAgICBpZiAoIGFyZ3MgPT0gTlVMTCApCi0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICBydiA9IFB5RXZhbF9DYWxsT2JqZWN0KChQeU9iamVjdCAqKWhhbmRsZXJSZWZDb24sIGFyZ3MpOwotICAgICAgICBQeV9ERUNSRUYoYXJncyk7Ci0gICAgICAgIGlmICggcnYgPT0gTlVMTCApIHsKLSAgICAgICAgICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigiRHJhZzogRXhjZXB0aW9uIGluIFRyYWNraW5nSGFuZGxlclxuIik7Ci0gICAgICAgICAgICAgICAgUHlFcnJfUHJpbnQoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgaSA9IC0xOwotICAgICAgICBpZiAoIHJ2ID09IFB5X05vbmUgKQotICAgICAgICAgICAgICAgIGkgPSAwOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgUHlBcmdfUGFyc2UocnYsICJsIiwgJmkpOwotICAgICAgICBQeV9ERUNSRUYocnYpOwotICAgICAgICByZXR1cm4gaTsKKyAgICBhcmdzID0gUHlfQnVpbGRWYWx1ZSgiaE8mTyYiLCB0aGVNZXNzYWdlLCBEcmFnT2JqX05ldywgdGhlRHJhZywgV2luT2JqX1doaWNoV2luZG93LCB0aGVXaW5kb3cpOworICAgIGlmICggYXJncyA9PSBOVUxMICkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHJ2ID0gUHlFdmFsX0NhbGxPYmplY3QoKFB5T2JqZWN0ICopaGFuZGxlclJlZkNvbiwgYXJncyk7CisgICAgUHlfREVDUkVGKGFyZ3MpOworICAgIGlmICggcnYgPT0gTlVMTCApIHsKKyAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoIkRyYWc6IEV4Y2VwdGlvbiBpbiBUcmFja2luZ0hhbmRsZXJcbiIpOworICAgICAgICBQeUVycl9QcmludCgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGkgPSAtMTsKKyAgICBpZiAoIHJ2ID09IFB5X05vbmUgKQorICAgICAgICBpID0gMDsKKyAgICBlbHNlCisgICAgICAgIFB5QXJnX1BhcnNlKHJ2LCAibCIsICZpKTsKKyAgICBQeV9ERUNSRUYocnYpOworICAgIHJldHVybiBpOwogfQogCiBzdGF0aWMgcGFzY2FsIE9TRXJyCiBkcmFnZ2x1ZV9SZWNlaXZlSGFuZGxlcihXaW5kb3dQdHIgdGhlV2luZG93LCB2b2lkICpoYW5kbGVyUmVmQ29uLAogICAgICAgICAgICAgICAgICAgICAgICAgRHJhZ1JlZmVyZW5jZSB0aGVEcmFnKQogewotICAgICAgICBQeU9iamVjdCAqYXJncywgKnJ2OwotICAgICAgICBpbnQgaTsKKyAgICBQeU9iamVjdCAqYXJncywgKnJ2OworICAgIGludCBpOwogCi0gICAgICAgIGFyZ3MgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwgRHJhZ09ial9OZXcsIHRoZURyYWcsIFdpbk9ial9XaGljaFdpbmRvdywgdGhlV2luZG93KTsKLSAgICAgICAgaWYgKCBhcmdzID09IE5VTEwgKQotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgcnYgPSBQeUV2YWxfQ2FsbE9iamVjdCgoUHlPYmplY3QgKiloYW5kbGVyUmVmQ29uLCBhcmdzKTsKLSAgICAgICAgUHlfREVDUkVGKGFyZ3MpOwotICAgICAgICBpZiAoIHJ2ID09IE5VTEwgKSB7Ci0gICAgICAgICAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoIkRyYWc6IEV4Y2VwdGlvbiBpbiBSZWNlaXZlSGFuZGxlclxuIik7Ci0gICAgICAgICAgICAgICAgUHlFcnJfUHJpbnQoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgaSA9IC0xOwotICAgICAgICBpZiAoIHJ2ID09IFB5X05vbmUgKQotICAgICAgICAgICAgICAgIGkgPSAwOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgUHlBcmdfUGFyc2UocnYsICJsIiwgJmkpOwotICAgICAgICBQeV9ERUNSRUYocnYpOwotICAgICAgICByZXR1cm4gaTsKKyAgICBhcmdzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJiIsIERyYWdPYmpfTmV3LCB0aGVEcmFnLCBXaW5PYmpfV2hpY2hXaW5kb3csIHRoZVdpbmRvdyk7CisgICAgaWYgKCBhcmdzID09IE5VTEwgKQorICAgICAgICByZXR1cm4gLTE7CisgICAgcnYgPSBQeUV2YWxfQ2FsbE9iamVjdCgoUHlPYmplY3QgKiloYW5kbGVyUmVmQ29uLCBhcmdzKTsKKyAgICBQeV9ERUNSRUYoYXJncyk7CisgICAgaWYgKCBydiA9PSBOVUxMICkgeworICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigiRHJhZzogRXhjZXB0aW9uIGluIFJlY2VpdmVIYW5kbGVyXG4iKTsKKyAgICAgICAgUHlFcnJfUHJpbnQoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpID0gLTE7CisgICAgaWYgKCBydiA9PSBQeV9Ob25lICkKKyAgICAgICAgaSA9IDA7CisgICAgZWxzZQorICAgICAgICBQeUFyZ19QYXJzZShydiwgImwiLCAmaSk7CisgICAgUHlfREVDUkVGKHJ2KTsKKyAgICByZXR1cm4gaTsKIH0KIAogc3RhdGljIHBhc2NhbCBPU0VycgogZHJhZ2dsdWVfU2VuZERhdGEoRmxhdm9yVHlwZSB0aGVUeXBlLCB2b2lkICpkcmFnU2VuZFJlZkNvbiwKICAgICAgICAgICAgICAgICAgICAgICBJdGVtUmVmZXJlbmNlIHRoZUl0ZW0sIERyYWdSZWZlcmVuY2UgdGhlRHJhZykKIHsKLSAgICAgICAgRHJhZ09iak9iamVjdCAqc2VsZiA9IChEcmFnT2JqT2JqZWN0ICopZHJhZ1NlbmRSZWZDb247Ci0gICAgICAgIFB5T2JqZWN0ICphcmdzLCAqcnY7Ci0gICAgICAgIGludCBpOworICAgIERyYWdPYmpPYmplY3QgKnNlbGYgPSAoRHJhZ09iak9iamVjdCAqKWRyYWdTZW5kUmVmQ29uOworICAgIFB5T2JqZWN0ICphcmdzLCAqcnY7CisgICAgaW50IGk7CiAKLSAgICAgICAgaWYgKCBzZWxmLT5zZW5kcHJvYyA9PSBOVUxMICkKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIGFyZ3MgPSBQeV9CdWlsZFZhbHVlKCJPJmwiLCBQeU1hY19CdWlsZE9TVHlwZSwgdGhlVHlwZSwgdGhlSXRlbSk7Ci0gICAgICAgIGlmICggYXJncyA9PSBOVUxMICkKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIHJ2ID0gUHlFdmFsX0NhbGxPYmplY3Qoc2VsZi0+c2VuZHByb2MsIGFyZ3MpOwotICAgICAgICBQeV9ERUNSRUYoYXJncyk7Ci0gICAgICAgIGlmICggcnYgPT0gTlVMTCApIHsKLSAgICAgICAgICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigiRHJhZzogRXhjZXB0aW9uIGluIFNlbmREYXRhSGFuZGxlclxuIik7Ci0gICAgICAgICAgICAgICAgUHlFcnJfUHJpbnQoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgaSA9IC0xOwotICAgICAgICBpZiAoIHJ2ID09IFB5X05vbmUgKQotICAgICAgICAgICAgICAgIGkgPSAwOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgUHlBcmdfUGFyc2UocnYsICJsIiwgJmkpOwotICAgICAgICBQeV9ERUNSRUYocnYpOwotICAgICAgICByZXR1cm4gaTsKKyAgICBpZiAoIHNlbGYtPnNlbmRwcm9jID09IE5VTEwgKQorICAgICAgICByZXR1cm4gLTE7CisgICAgYXJncyA9IFB5X0J1aWxkVmFsdWUoIk8mbCIsIFB5TWFjX0J1aWxkT1NUeXBlLCB0aGVUeXBlLCB0aGVJdGVtKTsKKyAgICBpZiAoIGFyZ3MgPT0gTlVMTCApCisgICAgICAgIHJldHVybiAtMTsKKyAgICBydiA9IFB5RXZhbF9DYWxsT2JqZWN0KHNlbGYtPnNlbmRwcm9jLCBhcmdzKTsKKyAgICBQeV9ERUNSRUYoYXJncyk7CisgICAgaWYgKCBydiA9PSBOVUxMICkgeworICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigiRHJhZzogRXhjZXB0aW9uIGluIFNlbmREYXRhSGFuZGxlclxuIik7CisgICAgICAgIFB5RXJyX1ByaW50KCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaSA9IC0xOworICAgIGlmICggcnYgPT0gUHlfTm9uZSApCisgICAgICAgIGkgPSAwOworICAgIGVsc2UKKyAgICAgICAgUHlBcmdfUGFyc2UocnYsICJsIiwgJmkpOworICAgIFB5X0RFQ1JFRihydik7CisgICAgcmV0dXJuIGk7CiB9CiAKICNpZiAwCkBAIC0xMTA5LDQ1ICsxMTA5LDQ1IEBACiAjZW5kaWYKICNlbHNlIC8qIF9fTFA2NF9fICovCiBzdGF0aWMgUHlNZXRob2REZWYgRHJhZ19tZXRob2RzW10gPSB7Ci0Je05VTEwsIE5VTEwsIDB9CisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogI2VuZGlmIC8qIF9fTFA2NF9fICovCiAKIAogdm9pZCBpbml0X0RyYWcodm9pZCkKIHsKLQlQeU9iamVjdCAqbTsKKyAgICBQeU9iamVjdCAqbTsKICNpZm5kZWYgX19MUDY0X18KLQlQeU9iamVjdCAqZDsKKyAgICBQeU9iamVjdCAqZDsKIAogCiAKLQkgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKERyYWdSZWYsIERyYWdPYmpfTmV3KTsKLQkgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChEcmFnUmVmLCBEcmFnT2JqX0NvbnZlcnQpOworICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhEcmFnUmVmLCBEcmFnT2JqX05ldyk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChEcmFnUmVmLCBEcmFnT2JqX0NvbnZlcnQpOwogI2VuZGlmIC8qICFfX0xQNjRfXyAqLwogCiAKLQltID0gUHlfSW5pdE1vZHVsZSgiX0RyYWciLCBEcmFnX21ldGhvZHMpOworICAgIG0gPSBQeV9Jbml0TW9kdWxlKCJfRHJhZyIsIERyYWdfbWV0aG9kcyk7CiAjaWZuZGVmIF9fTFA2NF9fCi0JZCA9IFB5TW9kdWxlX0dldERpY3QobSk7Ci0JRHJhZ19FcnJvciA9IFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCk7Ci0JaWYgKERyYWdfRXJyb3IgPT0gTlVMTCB8fAotCSAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRXJyb3IiLCBEcmFnX0Vycm9yKSAhPSAwKQotCQlyZXR1cm47Ci0JRHJhZ09ial9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmRHJhZ09ial9UeXBlKSA8IDApIHJldHVybjsKLQlQeV9JTkNSRUYoJkRyYWdPYmpfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJEcmFnT2JqIiwgKFB5T2JqZWN0ICopJkRyYWdPYmpfVHlwZSk7Ci0JLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCi0JUHlfSU5DUkVGKCZEcmFnT2JqX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiRHJhZ09ialR5cGUiLCAoUHlPYmplY3QgKikmRHJhZ09ial9UeXBlKTsKKyAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICBEcmFnX0Vycm9yID0gUHlNYWNfR2V0T1NFcnJFeGNlcHRpb24oKTsKKyAgICBpZiAoRHJhZ19FcnJvciA9PSBOVUxMIHx8CisgICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFcnJvciIsIERyYWdfRXJyb3IpICE9IDApCisgICAgICAgIHJldHVybjsKKyAgICBEcmFnT2JqX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZEcmFnT2JqX1R5cGUpIDwgMCkgcmV0dXJuOworICAgIFB5X0lOQ1JFRigmRHJhZ09ial9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkRyYWdPYmoiLCAoUHlPYmplY3QgKikmRHJhZ09ial9UeXBlKTsKKyAgICAvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KKyAgICBQeV9JTkNSRUYoJkRyYWdPYmpfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJEcmFnT2JqVHlwZSIsIChQeU9iamVjdCAqKSZEcmFnT2JqX1R5cGUpOwogCi0JZHJhZ2dsdWVfVHJhY2tpbmdIYW5kbGVyVVBQID0gTmV3RHJhZ1RyYWNraW5nSGFuZGxlclVQUChkcmFnZ2x1ZV9UcmFja2luZ0hhbmRsZXIpOwotCWRyYWdnbHVlX1JlY2VpdmVIYW5kbGVyVVBQID0gTmV3RHJhZ1JlY2VpdmVIYW5kbGVyVVBQKGRyYWdnbHVlX1JlY2VpdmVIYW5kbGVyKTsKLQlkcmFnZ2x1ZV9TZW5kRGF0YVVQUCA9IE5ld0RyYWdTZW5kRGF0YVVQUChkcmFnZ2x1ZV9TZW5kRGF0YSk7CisgICAgZHJhZ2dsdWVfVHJhY2tpbmdIYW5kbGVyVVBQID0gTmV3RHJhZ1RyYWNraW5nSGFuZGxlclVQUChkcmFnZ2x1ZV9UcmFja2luZ0hhbmRsZXIpOworICAgIGRyYWdnbHVlX1JlY2VpdmVIYW5kbGVyVVBQID0gTmV3RHJhZ1JlY2VpdmVIYW5kbGVyVVBQKGRyYWdnbHVlX1JlY2VpdmVIYW5kbGVyKTsKKyAgICBkcmFnZ2x1ZV9TZW5kRGF0YVVQUCA9IE5ld0RyYWdTZW5kRGF0YVVQUChkcmFnZ2x1ZV9TZW5kRGF0YSk7CiAjaWYgMAotCWRyYWdnbHVlX0lucHV0VVBQID0gTmV3RHJhZ0lucHV0VVBQKGRyYWdnbHVlX0lucHV0KTsKLQlkcmFnZ2x1ZV9EcmF3aW5nVVBQID0gTmV3RHJhZ0RyYXdpbmdVUFAoZHJhZ2dsdWVfRHJhd2luZyk7CisgICAgZHJhZ2dsdWVfSW5wdXRVUFAgPSBOZXdEcmFnSW5wdXRVUFAoZHJhZ2dsdWVfSW5wdXQpOworICAgIGRyYWdnbHVlX0RyYXdpbmdVUFAgPSBOZXdEcmFnRHJhd2luZ1VQUChkcmFnZ2x1ZV9EcmF3aW5nKTsKICNlbmRpZgogCiAjZW5kaWYgLyogIV9fTFA2NF9fICovCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9ldnQvX0V2dG1vZHVsZS5jIGIvTWFjL01vZHVsZXMvZXZ0L19FdnRtb2R1bGUuYwppbmRleCAwNGYzYjIzLi5iZDYxZWZhIDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9ldnQvX0V2dG1vZHVsZS5jCisrKyBiL01hYy9Nb2R1bGVzL2V2dC9fRXZ0bW9kdWxlLmMKQEAgLTEwLDkgKzEwLDkgQEAKIAogLyogTWFjcm8gdG8gdGVzdCB3aGV0aGVyIGEgd2Vhay1sb2FkZWQgQ0ZNIGZ1bmN0aW9uIGV4aXN0cyAqLwogI2RlZmluZSBQeU1hY19QUkVDSEVDSyhydG4pIGRvIHsgaWYgKCAmcnRuID09IE5VTEwgKSAge1wKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsIFwKLSAgICAgICAgIk5vdCBhdmFpbGFibGUgaW4gdGhpcyBzaGFyZWQgbGlicmFyeS9PUyB2ZXJzaW9uIik7IFwKLSAgICAgICAgcmV0dXJuIE5VTEw7IFwKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgXAorICAgICJOb3QgYXZhaWxhYmxlIGluIHRoaXMgc2hhcmVkIGxpYnJhcnkvT1MgdmVyc2lvbiIpOyBcCisgICAgcmV0dXJuIE5VTEw7IFwKICAgICB9fSB3aGlsZSgwKQogCiAKQEAgLTIzLDUzNSArMjMsNTM1IEBACiAKIHN0YXRpYyBQeU9iamVjdCAqRXZ0X0dldE1vdXNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQb2ludCBtb3VzZUxvYzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUG9pbnQgbW91c2VMb2M7CiAjaWZuZGVmIEdldE1vdXNlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TW91c2UpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1vdXNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlHZXRNb3VzZSgmbW91c2VMb2MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRQb2ludCwgbW91c2VMb2MpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRNb3VzZSgmbW91c2VMb2MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRQb2ludCwgbW91c2VMb2MpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkV2dF9CdXR0b24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKICNpZm5kZWYgQnV0dG9uCi0JUHlNYWNfUFJFQ0hFQ0soQnV0dG9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhCdXR0b24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEJ1dHRvbigpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBCdXR0b24oKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpFdnRfU3RpbGxEb3duKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CiAjaWZuZGVmIFN0aWxsRG93bgotCVB5TWFjX1BSRUNIRUNLKFN0aWxsRG93bik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU3RpbGxEb3duKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTdGlsbERvd24oKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU3RpbGxEb3duKCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRXZ0X1dhaXRNb3VzZVVwKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CiAjaWZuZGVmIFdhaXRNb3VzZVVwCi0JUHlNYWNfUFJFQ0hFQ0soV2FpdE1vdXNlVXApOworICAgIFB5TWFjX1BSRUNIRUNLKFdhaXRNb3VzZVVwKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBXYWl0TW91c2VVcCgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBXYWl0TW91c2VVcCgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkV2dF9HZXRDYXJldFRpbWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVVJbnQzMiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFVJbnQzMiBfcnY7CiAjaWZuZGVmIEdldENhcmV0VGltZQotCVB5TWFjX1BSRUNIRUNLKEdldENhcmV0VGltZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0Q2FyZXRUaW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRDYXJldFRpbWUoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0Q2FyZXRUaW1lKCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRXZ0X0dldEtleXMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUtleU1hcCB0aGVLZXlzX19vdXRfXzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgS2V5TWFwIHRoZUtleXNfX291dF9fOwogI2lmbmRlZiBHZXRLZXlzCi0JUHlNYWNfUFJFQ0hFQ0soR2V0S2V5cyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0S2V5cyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0S2V5cyh0aGVLZXlzX19vdXRfXyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoInMjIiwKLQkgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSZ0aGVLZXlzX19vdXRfXywgKGludClzaXplb2YoS2V5TWFwKSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldEtleXModGhlS2V5c19fb3V0X18pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJzIyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikmdGhlS2V5c19fb3V0X18sIChpbnQpc2l6ZW9mKEtleU1hcCkpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkV2dF9HZXREYmxUaW1lKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlVSW50MzIgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBVSW50MzIgX3J2OwogI2lmbmRlZiBHZXREYmxUaW1lCi0JUHlNYWNfUFJFQ0hFQ0soR2V0RGJsVGltZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0RGJsVGltZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0RGJsVGltZSgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXREYmxUaW1lKCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRXZ0X1NldEV2ZW50TWFzayhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JRXZlbnRNYXNrIHZhbHVlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBFdmVudE1hc2sgdmFsdWU7CiAjaWZuZGVmIFNldEV2ZW50TWFzawotCVB5TWFjX1BSRUNIRUNLKFNldEV2ZW50TWFzayk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0RXZlbnRNYXNrKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIkgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRFdmVudE1hc2sodmFsdWUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0RXZlbnRNYXNrKHZhbHVlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRXZ0X0dldE5leHRFdmVudChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JRXZlbnRNYXNrIGV2ZW50TWFzazsKLQlFdmVudFJlY29yZCB0aGVFdmVudDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgRXZlbnRNYXNrIGV2ZW50TWFzazsKKyAgICBFdmVudFJlY29yZCB0aGVFdmVudDsKICNpZm5kZWYgR2V0TmV4dEV2ZW50Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0TmV4dEV2ZW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXROZXh0RXZlbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiSCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZldmVudE1hc2spKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXROZXh0RXZlbnQoZXZlbnRNYXNrLAotCSAgICAgICAgICAgICAgICAgICAmdGhlRXZlbnQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEV2ZW50UmVjb3JkLCAmdGhlRXZlbnQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIkgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZXZlbnRNYXNrKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TmV4dEV2ZW50KGV2ZW50TWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgJnRoZUV2ZW50KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRFdmVudFJlY29yZCwgJnRoZUV2ZW50KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpFdnRfRXZlbnRBdmFpbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JRXZlbnRNYXNrIGV2ZW50TWFzazsKLQlFdmVudFJlY29yZCB0aGVFdmVudDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgRXZlbnRNYXNrIGV2ZW50TWFzazsKKyAgICBFdmVudFJlY29yZCB0aGVFdmVudDsKICNpZm5kZWYgRXZlbnRBdmFpbAotCVB5TWFjX1BSRUNIRUNLKEV2ZW50QXZhaWwpOworICAgIFB5TWFjX1BSRUNIRUNLKEV2ZW50QXZhaWwpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiSCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZldmVudE1hc2spKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBFdmVudEF2YWlsKGV2ZW50TWFzaywKLQkgICAgICAgICAgICAgICAgICZ0aGVFdmVudCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRXZlbnRSZWNvcmQsICZ0aGVFdmVudCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZldmVudE1hc2spKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBFdmVudEF2YWlsKGV2ZW50TWFzaywKKyAgICAgICAgICAgICAgICAgICAgICZ0aGVFdmVudCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRXZlbnRSZWNvcmQsICZ0aGVFdmVudCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRXZ0X1Bvc3RFdmVudChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlFdmVudEtpbmQgZXZlbnROdW07Ci0JVUludDMyIGV2ZW50TXNnOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEV2ZW50S2luZCBldmVudE51bTsKKyAgICBVSW50MzIgZXZlbnRNc2c7CiAjaWZuZGVmIFBvc3RFdmVudAotCVB5TWFjX1BSRUNIRUNLKFBvc3RFdmVudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUG9zdEV2ZW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIkhsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmV2ZW50TnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmZXZlbnRNc2cpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUG9zdEV2ZW50KGV2ZW50TnVtLAotCSAgICAgICAgICAgICAgICAgZXZlbnRNc2cpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIkhsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmV2ZW50TnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZXZlbnRNc2cpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUG9zdEV2ZW50KGV2ZW50TnVtLAorICAgICAgICAgICAgICAgICAgICAgZXZlbnRNc2cpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkV2dF9GbHVzaEV2ZW50cyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JRXZlbnRNYXNrIHdoaWNoTWFzazsKLQlFdmVudE1hc2sgc3RvcE1hc2s7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEV2ZW50TWFzayB3aGljaE1hc2s7CisgICAgRXZlbnRNYXNrIHN0b3BNYXNrOwogI2lmbmRlZiBGbHVzaEV2ZW50cwotCVB5TWFjX1BSRUNIRUNLKEZsdXNoRXZlbnRzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhGbHVzaEV2ZW50cyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJISCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ3aGljaE1hc2ssCi0JICAgICAgICAgICAgICAgICAgICAgICZzdG9wTWFzaykpCi0JCXJldHVybiBOVUxMOwotCUZsdXNoRXZlbnRzKHdoaWNoTWFzaywKLQkgICAgICAgICAgICBzdG9wTWFzayk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIkhIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJndoaWNoTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0b3BNYXNrKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgRmx1c2hFdmVudHMod2hpY2hNYXNrLAorICAgICAgICAgICAgICAgIHN0b3BNYXNrKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRXZ0X0dldEdsb2JhbE1vdXNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQb2ludCBnbG9iYWxNb3VzZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUG9pbnQgZ2xvYmFsTW91c2U7CiAjaWZuZGVmIEdldEdsb2JhbE1vdXNlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0R2xvYmFsTW91c2UpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldEdsb2JhbE1vdXNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlHZXRHbG9iYWxNb3VzZSgmZ2xvYmFsTW91c2UpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRQb2ludCwgZ2xvYmFsTW91c2UpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRHbG9iYWxNb3VzZSgmZ2xvYmFsTW91c2UpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRQb2ludCwgZ2xvYmFsTW91c2UpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkV2dF9HZXRDdXJyZW50S2V5TW9kaWZpZXJzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlVSW50MzIgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBVSW50MzIgX3J2OwogI2lmbmRlZiBHZXRDdXJyZW50S2V5TW9kaWZpZXJzCi0JUHlNYWNfUFJFQ0hFQ0soR2V0Q3VycmVudEtleU1vZGlmaWVycyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0Q3VycmVudEtleU1vZGlmaWVycyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0Q3VycmVudEtleU1vZGlmaWVycygpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRDdXJyZW50S2V5TW9kaWZpZXJzKCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRXZ0X0NoZWNrRXZlbnRRdWV1ZUZvclVzZXJDYW5jZWwoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKICNpZm5kZWYgQ2hlY2tFdmVudFF1ZXVlRm9yVXNlckNhbmNlbAotCVB5TWFjX1BSRUNIRUNLKENoZWNrRXZlbnRRdWV1ZUZvclVzZXJDYW5jZWwpOworICAgIFB5TWFjX1BSRUNIRUNLKENoZWNrRXZlbnRRdWV1ZUZvclVzZXJDYW5jZWwpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENoZWNrRXZlbnRRdWV1ZUZvclVzZXJDYW5jZWwoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ2hlY2tFdmVudFF1ZXVlRm9yVXNlckNhbmNlbCgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkV2dF9LZXlTY3JpcHQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IGNvZGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IGNvZGU7CiAjaWZuZGVmIEtleVNjcmlwdAotCVB5TWFjX1BSRUNIRUNLKEtleVNjcmlwdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soS2V5U2NyaXB0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmY29kZSkpCi0JCXJldHVybiBOVUxMOwotCUtleVNjcmlwdChjb2RlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2RlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgS2V5U2NyaXB0KGNvZGUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpFdnRfSXNDbWRDaGFyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlFdmVudFJlY29yZCBldmVudDsKLQlzaG9ydCB0ZXN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBFdmVudFJlY29yZCBldmVudDsKKyAgICBzaG9ydCB0ZXN0OwogI2lmbmRlZiBJc0NtZENoYXIKLQlQeU1hY19QUkVDSEVDSyhJc0NtZENoYXIpOworICAgIFB5TWFjX1BSRUNIRUNLKElzQ21kQ2hhcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRFdmVudFJlY29yZCwgJmV2ZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAmdGVzdCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IElzQ21kQ2hhcigmZXZlbnQsCi0JICAgICAgICAgICAgICAgIHRlc3QpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEV2ZW50UmVjb3JkLCAmZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZXN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gSXNDbWRDaGFyKCZldmVudCwKKyAgICAgICAgICAgICAgICAgICAgdGVzdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRXZ0X0xNR2V0S2V5VGhyZXNoKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTSW50MTYgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTSW50MTYgX3J2OwogI2lmbmRlZiBMTUdldEtleVRocmVzaAotCVB5TWFjX1BSRUNIRUNLKExNR2V0S2V5VGhyZXNoKTsKKyAgICBQeU1hY19QUkVDSEVDSyhMTUdldEtleVRocmVzaCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTE1HZXRLZXlUaHJlc2goKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTE1HZXRLZXlUaHJlc2goKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpFdnRfTE1TZXRLZXlUaHJlc2goUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVNJbnQxNiB2YWx1ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgU0ludDE2IHZhbHVlOwogI2lmbmRlZiBMTVNldEtleVRocmVzaAotCVB5TWFjX1BSRUNIRUNLKExNU2V0S2V5VGhyZXNoKTsKKyAgICBQeU1hY19QUkVDSEVDSyhMTVNldEtleVRocmVzaCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTE1TZXRLZXlUaHJlc2godmFsdWUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTE1TZXRLZXlUaHJlc2godmFsdWUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpFdnRfTE1HZXRLZXlSZXBUaHJlc2goUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVNJbnQxNiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFNJbnQxNiBfcnY7CiAjaWZuZGVmIExNR2V0S2V5UmVwVGhyZXNoCi0JUHlNYWNfUFJFQ0hFQ0soTE1HZXRLZXlSZXBUaHJlc2gpOworICAgIFB5TWFjX1BSRUNIRUNLKExNR2V0S2V5UmVwVGhyZXNoKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBMTUdldEtleVJlcFRocmVzaCgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBMTUdldEtleVJlcFRocmVzaCgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkV2dF9MTVNldEtleVJlcFRocmVzaChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JU0ludDE2IHZhbHVlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTSW50MTYgdmFsdWU7CiAjaWZuZGVmIExNU2V0S2V5UmVwVGhyZXNoCi0JUHlNYWNfUFJFQ0hFQ0soTE1TZXRLZXlSZXBUaHJlc2gpOworICAgIFB5TWFjX1BSRUNIRUNLKExNU2V0S2V5UmVwVGhyZXNoKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpKQotCQlyZXR1cm4gTlVMTDsKLQlMTVNldEtleVJlcFRocmVzaCh2YWx1ZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBMTVNldEtleVJlcFRocmVzaCh2YWx1ZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkV2dF9MTUdldEtiZExhc3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVVJbnQ4IF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVUludDggX3J2OwogI2lmbmRlZiBMTUdldEtiZExhc3QKLQlQeU1hY19QUkVDSEVDSyhMTUdldEtiZExhc3QpOworICAgIFB5TWFjX1BSRUNIRUNLKExNR2V0S2JkTGFzdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTE1HZXRLYmRMYXN0KCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IExNR2V0S2JkTGFzdCgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkV2dF9MTVNldEtiZExhc3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVVJbnQ4IHZhbHVlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBVSW50OCB2YWx1ZTsKICNpZm5kZWYgTE1TZXRLYmRMYXN0Ci0JUHlNYWNfUFJFQ0hFQ0soTE1TZXRLYmRMYXN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhMTVNldEtiZExhc3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSkpCi0JCXJldHVybiBOVUxMOwotCUxNU2V0S2JkTGFzdCh2YWx1ZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBMTVNldEtiZExhc3QodmFsdWUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpFdnRfTE1HZXRLYmRUeXBlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlVSW50OCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFVJbnQ4IF9ydjsKICNpZm5kZWYgTE1HZXRLYmRUeXBlCi0JUHlNYWNfUFJFQ0hFQ0soTE1HZXRLYmRUeXBlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhMTUdldEtiZFR5cGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IExNR2V0S2JkVHlwZSgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBMTUdldEtiZFR5cGUoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpFdnRfTE1TZXRLYmRUeXBlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlVSW50OCB2YWx1ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVUludDggdmFsdWU7CiAjaWZuZGVmIExNU2V0S2JkVHlwZQotCVB5TWFjX1BSRUNIRUNLKExNU2V0S2JkVHlwZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTE1TZXRLYmRUeXBlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpKQotCQlyZXR1cm4gTlVMTDsKLQlMTVNldEtiZFR5cGUodmFsdWUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTE1TZXRLYmRUeXBlKHZhbHVlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRXZ0X1RpY2tDb3VudChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVUludDMyIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVUludDMyIF9ydjsKICNpZm5kZWYgVGlja0NvdW50Ci0JUHlNYWNfUFJFQ0hFQ0soVGlja0NvdW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhUaWNrQ291bnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFRpY2tDb3VudCgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBUaWNrQ291bnQoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpFdnRfV2FpdE5leHRFdmVudChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogCi0JQm9vbGVhbiBfcnY7Ci0JRXZlbnRNYXNrIGV2ZW50TWFzazsKLQlFdmVudFJlY29yZCB0aGVFdmVudDsKLQlVSW50MzIgc2xlZXA7Ci0JSGFuZGxlIG1vdXNlcmVnaW9uID0gKEhhbmRsZSkwOworICAgIEJvb2xlYW4gX3J2OworICAgIEV2ZW50TWFzayBldmVudE1hc2s7CisgICAgRXZlbnRSZWNvcmQgdGhlRXZlbnQ7CisgICAgVUludDMyIHNsZWVwOworICAgIEhhbmRsZSBtb3VzZXJlZ2lvbiA9IChIYW5kbGUpMDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIkhsfE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmV2ZW50TWFzaywKLQkgICAgICAgICAgICAgICAgICAgICAgJnNsZWVwLAotCSAgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfQ29udmVydCwgJm1vdXNlcmVnaW9uKSkKLQkgICAgICAgIHJldHVybiBOVUxMOwotCV9ydiA9IFdhaXROZXh0RXZlbnQoZXZlbnRNYXNrLAotCSAgICAgICAgICAgICAgICAgICAgJnRoZUV2ZW50LAotCSAgICAgICAgICAgICAgICAgICAgc2xlZXAsCi0JICAgICAgICAgICAgICAgICAgICAoUmduSGFuZGxlKW1vdXNlcmVnaW9uKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRFdmVudFJlY29yZCwgJnRoZUV2ZW50KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJIbHxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZldmVudE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzbGVlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0UmVzT2JqX0NvbnZlcnQsICZtb3VzZXJlZ2lvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFdhaXROZXh0RXZlbnQoZXZlbnRNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgc2xlZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAoUmduSGFuZGxlKW1vdXNlcmVnaW9uKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRFdmVudFJlY29yZCwgJnRoZUV2ZW50KTsKKyAgICByZXR1cm4gX3JlczsKIAogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgRXZ0X21ldGhvZHNbXSA9IHsKLQl7IkdldE1vdXNlIiwgKFB5Q0Z1bmN0aW9uKUV2dF9HZXRNb3VzZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoUG9pbnQgbW91c2VMb2MpIil9LAotCXsiQnV0dG9uIiwgKFB5Q0Z1bmN0aW9uKUV2dF9CdXR0b24sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IlN0aWxsRG93biIsIChQeUNGdW5jdGlvbilFdnRfU3RpbGxEb3duLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJXYWl0TW91c2VVcCIsIChQeUNGdW5jdGlvbilFdnRfV2FpdE1vdXNlVXAsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IkdldENhcmV0VGltZSIsIChQeUNGdW5jdGlvbilFdnRfR2V0Q2FyZXRUaW1lLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChVSW50MzIgX3J2KSIpfSwKLQl7IkdldEtleXMiLCAoUHlDRnVuY3Rpb24pRXZ0X0dldEtleXMsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEtleU1hcCB0aGVLZXlzKSIpfSwKLQl7IkdldERibFRpbWUiLCAoUHlDRnVuY3Rpb24pRXZ0X0dldERibFRpbWUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQzMiBfcnYpIil9LAotCXsiU2V0RXZlbnRNYXNrIiwgKFB5Q0Z1bmN0aW9uKUV2dF9TZXRFdmVudE1hc2ssIDEsCi0JIFB5RG9jX1NUUigiKEV2ZW50TWFzayB2YWx1ZSkgLT4gTm9uZSIpfSwKLQl7IkdldE5leHRFdmVudCIsIChQeUNGdW5jdGlvbilFdnRfR2V0TmV4dEV2ZW50LCAxLAotCSBQeURvY19TVFIoIihFdmVudE1hc2sgZXZlbnRNYXNrKSAtPiAoQm9vbGVhbiBfcnYsIEV2ZW50UmVjb3JkIHRoZUV2ZW50KSIpfSwKLQl7IkV2ZW50QXZhaWwiLCAoUHlDRnVuY3Rpb24pRXZ0X0V2ZW50QXZhaWwsIDEsCi0JIFB5RG9jX1NUUigiKEV2ZW50TWFzayBldmVudE1hc2spIC0+IChCb29sZWFuIF9ydiwgRXZlbnRSZWNvcmQgdGhlRXZlbnQpIil9LAotCXsiUG9zdEV2ZW50IiwgKFB5Q0Z1bmN0aW9uKUV2dF9Qb3N0RXZlbnQsIDEsCi0JIFB5RG9jX1NUUigiKEV2ZW50S2luZCBldmVudE51bSwgVUludDMyIGV2ZW50TXNnKSAtPiBOb25lIil9LAotCXsiRmx1c2hFdmVudHMiLCAoUHlDRnVuY3Rpb24pRXZ0X0ZsdXNoRXZlbnRzLCAxLAotCSBQeURvY19TVFIoIihFdmVudE1hc2sgd2hpY2hNYXNrLCBFdmVudE1hc2sgc3RvcE1hc2spIC0+IE5vbmUiKX0sCi0JeyJHZXRHbG9iYWxNb3VzZSIsIChQeUNGdW5jdGlvbilFdnRfR2V0R2xvYmFsTW91c2UsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFBvaW50IGdsb2JhbE1vdXNlKSIpfSwKLQl7IkdldEN1cnJlbnRLZXlNb2RpZmllcnMiLCAoUHlDRnVuY3Rpb24pRXZ0X0dldEN1cnJlbnRLZXlNb2RpZmllcnMsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQzMiBfcnYpIil9LAotCXsiQ2hlY2tFdmVudFF1ZXVlRm9yVXNlckNhbmNlbCIsIChQeUNGdW5jdGlvbilFdnRfQ2hlY2tFdmVudFF1ZXVlRm9yVXNlckNhbmNlbCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiS2V5U2NyaXB0IiwgKFB5Q0Z1bmN0aW9uKUV2dF9LZXlTY3JpcHQsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGNvZGUpIC0+IE5vbmUiKX0sCi0JeyJJc0NtZENoYXIiLCAoUHlDRnVuY3Rpb24pRXZ0X0lzQ21kQ2hhciwgMSwKLQkgUHlEb2NfU1RSKCIoRXZlbnRSZWNvcmQgZXZlbnQsIHNob3J0IHRlc3QpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJMTUdldEtleVRocmVzaCIsIChQeUNGdW5jdGlvbilFdnRfTE1HZXRLZXlUaHJlc2gsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFNJbnQxNiBfcnYpIil9LAotCXsiTE1TZXRLZXlUaHJlc2giLCAoUHlDRnVuY3Rpb24pRXZ0X0xNU2V0S2V5VGhyZXNoLCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgdmFsdWUpIC0+IE5vbmUiKX0sCi0JeyJMTUdldEtleVJlcFRocmVzaCIsIChQeUNGdW5jdGlvbilFdnRfTE1HZXRLZXlSZXBUaHJlc2gsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFNJbnQxNiBfcnYpIil9LAotCXsiTE1TZXRLZXlSZXBUaHJlc2giLCAoUHlDRnVuY3Rpb24pRXZ0X0xNU2V0S2V5UmVwVGhyZXNoLCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgdmFsdWUpIC0+IE5vbmUiKX0sCi0JeyJMTUdldEtiZExhc3QiLCAoUHlDRnVuY3Rpb24pRXZ0X0xNR2V0S2JkTGFzdCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVUludDggX3J2KSIpfSwKLQl7IkxNU2V0S2JkTGFzdCIsIChQeUNGdW5jdGlvbilFdnRfTE1TZXRLYmRMYXN0LCAxLAotCSBQeURvY19TVFIoIihVSW50OCB2YWx1ZSkgLT4gTm9uZSIpfSwKLQl7IkxNR2V0S2JkVHlwZSIsIChQeUNGdW5jdGlvbilFdnRfTE1HZXRLYmRUeXBlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChVSW50OCBfcnYpIil9LAotCXsiTE1TZXRLYmRUeXBlIiwgKFB5Q0Z1bmN0aW9uKUV2dF9MTVNldEtiZFR5cGUsIDEsCi0JIFB5RG9jX1NUUigiKFVJbnQ4IHZhbHVlKSAtPiBOb25lIil9LAotCXsiVGlja0NvdW50IiwgKFB5Q0Z1bmN0aW9uKUV2dF9UaWNrQ291bnQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQzMiBfcnYpIil9LAotCXsiV2FpdE5leHRFdmVudCIsIChQeUNGdW5jdGlvbilFdnRfV2FpdE5leHRFdmVudCwgMSwKLQkgUHlEb2NfU1RSKCIoRXZlbnRNYXNrIGV2ZW50TWFzaywgVUludDMyIHNsZWVwIFssUmVnaW9uSGFuZGxlXSkgLT4gKEJvb2xlYW4gX3J2LCBFdmVudFJlY29yZCB0aGVFdmVudCkiKX0sCi0Je05VTEwsIE5VTEwsIDB9CisgICAgeyJHZXRNb3VzZSIsIChQeUNGdW5jdGlvbilFdnRfR2V0TW91c2UsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFBvaW50IG1vdXNlTG9jKSIpfSwKKyAgICB7IkJ1dHRvbiIsIChQeUNGdW5jdGlvbilFdnRfQnV0dG9uLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJTdGlsbERvd24iLCAoUHlDRnVuY3Rpb24pRXZ0X1N0aWxsRG93biwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiV2FpdE1vdXNlVXAiLCAoUHlDRnVuY3Rpb24pRXZ0X1dhaXRNb3VzZVVwLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJHZXRDYXJldFRpbWUiLCAoUHlDRnVuY3Rpb24pRXZ0X0dldENhcmV0VGltZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVUludDMyIF9ydikiKX0sCisgICAgeyJHZXRLZXlzIiwgKFB5Q0Z1bmN0aW9uKUV2dF9HZXRLZXlzLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChLZXlNYXAgdGhlS2V5cykiKX0sCisgICAgeyJHZXREYmxUaW1lIiwgKFB5Q0Z1bmN0aW9uKUV2dF9HZXREYmxUaW1lLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChVSW50MzIgX3J2KSIpfSwKKyAgICB7IlNldEV2ZW50TWFzayIsIChQeUNGdW5jdGlvbilFdnRfU2V0RXZlbnRNYXNrLCAxLAorICAgICBQeURvY19TVFIoIihFdmVudE1hc2sgdmFsdWUpIC0+IE5vbmUiKX0sCisgICAgeyJHZXROZXh0RXZlbnQiLCAoUHlDRnVuY3Rpb24pRXZ0X0dldE5leHRFdmVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRXZlbnRNYXNrIGV2ZW50TWFzaykgLT4gKEJvb2xlYW4gX3J2LCBFdmVudFJlY29yZCB0aGVFdmVudCkiKX0sCisgICAgeyJFdmVudEF2YWlsIiwgKFB5Q0Z1bmN0aW9uKUV2dF9FdmVudEF2YWlsLCAxLAorICAgICBQeURvY19TVFIoIihFdmVudE1hc2sgZXZlbnRNYXNrKSAtPiAoQm9vbGVhbiBfcnYsIEV2ZW50UmVjb3JkIHRoZUV2ZW50KSIpfSwKKyAgICB7IlBvc3RFdmVudCIsIChQeUNGdW5jdGlvbilFdnRfUG9zdEV2ZW50LCAxLAorICAgICBQeURvY19TVFIoIihFdmVudEtpbmQgZXZlbnROdW0sIFVJbnQzMiBldmVudE1zZykgLT4gTm9uZSIpfSwKKyAgICB7IkZsdXNoRXZlbnRzIiwgKFB5Q0Z1bmN0aW9uKUV2dF9GbHVzaEV2ZW50cywgMSwKKyAgICAgUHlEb2NfU1RSKCIoRXZlbnRNYXNrIHdoaWNoTWFzaywgRXZlbnRNYXNrIHN0b3BNYXNrKSAtPiBOb25lIil9LAorICAgIHsiR2V0R2xvYmFsTW91c2UiLCAoUHlDRnVuY3Rpb24pRXZ0X0dldEdsb2JhbE1vdXNlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChQb2ludCBnbG9iYWxNb3VzZSkiKX0sCisgICAgeyJHZXRDdXJyZW50S2V5TW9kaWZpZXJzIiwgKFB5Q0Z1bmN0aW9uKUV2dF9HZXRDdXJyZW50S2V5TW9kaWZpZXJzLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChVSW50MzIgX3J2KSIpfSwKKyAgICB7IkNoZWNrRXZlbnRRdWV1ZUZvclVzZXJDYW5jZWwiLCAoUHlDRnVuY3Rpb24pRXZ0X0NoZWNrRXZlbnRRdWV1ZUZvclVzZXJDYW5jZWwsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IktleVNjcmlwdCIsIChQeUNGdW5jdGlvbilFdnRfS2V5U2NyaXB0LCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBjb2RlKSAtPiBOb25lIil9LAorICAgIHsiSXNDbWRDaGFyIiwgKFB5Q0Z1bmN0aW9uKUV2dF9Jc0NtZENoYXIsIDEsCisgICAgIFB5RG9jX1NUUigiKEV2ZW50UmVjb3JkIGV2ZW50LCBzaG9ydCB0ZXN0KSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiTE1HZXRLZXlUaHJlc2giLCAoUHlDRnVuY3Rpb24pRXZ0X0xNR2V0S2V5VGhyZXNoLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChTSW50MTYgX3J2KSIpfSwKKyAgICB7IkxNU2V0S2V5VGhyZXNoIiwgKFB5Q0Z1bmN0aW9uKUV2dF9MTVNldEtleVRocmVzaCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IHZhbHVlKSAtPiBOb25lIil9LAorICAgIHsiTE1HZXRLZXlSZXBUaHJlc2giLCAoUHlDRnVuY3Rpb24pRXZ0X0xNR2V0S2V5UmVwVGhyZXNoLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChTSW50MTYgX3J2KSIpfSwKKyAgICB7IkxNU2V0S2V5UmVwVGhyZXNoIiwgKFB5Q0Z1bmN0aW9uKUV2dF9MTVNldEtleVJlcFRocmVzaCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IHZhbHVlKSAtPiBOb25lIil9LAorICAgIHsiTE1HZXRLYmRMYXN0IiwgKFB5Q0Z1bmN0aW9uKUV2dF9MTUdldEtiZExhc3QsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQ4IF9ydikiKX0sCisgICAgeyJMTVNldEtiZExhc3QiLCAoUHlDRnVuY3Rpb24pRXZ0X0xNU2V0S2JkTGFzdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVUludDggdmFsdWUpIC0+IE5vbmUiKX0sCisgICAgeyJMTUdldEtiZFR5cGUiLCAoUHlDRnVuY3Rpb24pRXZ0X0xNR2V0S2JkVHlwZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVUludDggX3J2KSIpfSwKKyAgICB7IkxNU2V0S2JkVHlwZSIsIChQeUNGdW5jdGlvbilFdnRfTE1TZXRLYmRUeXBlLCAxLAorICAgICBQeURvY19TVFIoIihVSW50OCB2YWx1ZSkgLT4gTm9uZSIpfSwKKyAgICB7IlRpY2tDb3VudCIsIChQeUNGdW5jdGlvbilFdnRfVGlja0NvdW50LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChVSW50MzIgX3J2KSIpfSwKKyAgICB7IldhaXROZXh0RXZlbnQiLCAoUHlDRnVuY3Rpb24pRXZ0X1dhaXROZXh0RXZlbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKEV2ZW50TWFzayBldmVudE1hc2ssIFVJbnQzMiBzbGVlcCBbLFJlZ2lvbkhhbmRsZV0pIC0+IChCb29sZWFuIF9ydiwgRXZlbnRSZWNvcmQgdGhlRXZlbnQpIil9LAorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogCiAjZWxzZSAvKiBfX0xQNjRfXyAqLwogCiBzdGF0aWMgUHlNZXRob2REZWYgRXZ0X21ldGhvZHNbXSA9IHsKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAjZW5kaWYgLyogX19MUDY0X18gKi8KIAogCiB2b2lkIGluaXRfRXZ0KHZvaWQpCiB7Ci0JUHlPYmplY3QgKm07CisgICAgUHlPYmplY3QgKm07CiAjaWZuZGVmIF9fTFA2NF9fCi0JUHlPYmplY3QgKmQ7CisgICAgUHlPYmplY3QgKmQ7CiAjZW5kaWYgLyogX19MUDY0X18gKi8KIAogCiAKIAotCW0gPSBQeV9Jbml0TW9kdWxlKCJfRXZ0IiwgRXZ0X21ldGhvZHMpOworICAgIG0gPSBQeV9Jbml0TW9kdWxlKCJfRXZ0IiwgRXZ0X21ldGhvZHMpOwogI2lmbmRlZiBfX0xQNjRfXwotCWQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOwotCUV2dF9FcnJvciA9IFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCk7Ci0JaWYgKEV2dF9FcnJvciA9PSBOVUxMIHx8Ci0JICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFcnJvciIsIEV2dF9FcnJvcikgIT0gMCkKLQkJcmV0dXJuOworICAgIGQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOworICAgIEV2dF9FcnJvciA9IFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCk7CisgICAgaWYgKEV2dF9FcnJvciA9PSBOVUxMIHx8CisgICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFcnJvciIsIEV2dF9FcnJvcikgIT0gMCkKKyAgICAgICAgcmV0dXJuOwogI2VuZGlmIC8qIF9fTFA2NF9fICovCiB9CiAKZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL2ZpbGUvX0ZpbGVtb2R1bGUuYyBiL01hYy9Nb2R1bGVzL2ZpbGUvX0ZpbGVtb2R1bGUuYwppbmRleCAyMmUxMmVjLi5lYjViMTZkIDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9maWxlL19GaWxlbW9kdWxlLmMKKysrIGIvTWFjL01vZHVsZXMvZmlsZS9fRmlsZW1vZHVsZS5jCkBAIC04LDE0ICs4LDE0IEBACiAjaW5jbHVkZSAicHltYWN0b29sYm94LmgiCiAKICNpZm5kZWYgSEFWRV9PU1gxMDVfU0RLCi10eXBlZGVmIFNJbnQxNglGU0lPUmVmTnVtOwordHlwZWRlZiBTSW50MTYgIEZTSU9SZWZOdW07CiAjZW5kaWYKIAogLyogTWFjcm8gdG8gdGVzdCB3aGV0aGVyIGEgd2Vhay1sb2FkZWQgQ0ZNIGZ1bmN0aW9uIGV4aXN0cyAqLwogI2RlZmluZSBQeU1hY19QUkVDSEVDSyhydG4pIGRvIHsgaWYgKCAmcnRuID09IE5VTEwgKSAge1wKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsIFwKLSAgICAgICAgIk5vdCBhdmFpbGFibGUgaW4gdGhpcyBzaGFyZWQgbGlicmFyeS9PUyB2ZXJzaW9uIik7IFwKLSAgICAgICAgcmV0dXJuIE5VTEw7IFwKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgXAorICAgICJOb3QgYXZhaWxhYmxlIGluIHRoaXMgc2hhcmVkIGxpYnJhcnkvT1MgdmVyc2lvbiIpOyBcCisgICAgcmV0dXJuIE5VTEw7IFwKICAgICB9fSB3aGlsZSgwKQogCiAKQEAgLTM1LDcgKzM1LDcgQEAKICNkZWZpbmUgUHlNYWNfR2V0RlNTcGVjIF9QeU1hY19HZXRGU1NwZWMKICNkZWZpbmUgUHlNYWNfR2V0RlNSZWYgX1B5TWFjX0dldEZTUmVmCiAKLSNlbHNlCS8qICFVU0VfVE9PTEJPWF9PQkpFQ1RfR0xVRSAqLworI2Vsc2UgICAvKiAhVVNFX1RPT0xCT1hfT0JKRUNUX0dMVUUgKi8KIAogI2lmbmRlZiBfX0xQNjRfXwogZXh0ZXJuIGludCBQeU1hY19HZXRGU1NwZWMoUHlPYmplY3QgKnYsIEZTU3BlYyAqc3BlYyk7CkBAIC00NSw3ICs0NSw3IEBACiBleHRlcm4gaW50IFB5TWFjX0dldEZTUmVmKFB5T2JqZWN0ICp2LCBGU1JlZiAqZnNyKTsKIGV4dGVybiBQeU9iamVjdCAqUHlNYWNfQnVpbGRGU1JlZihGU1JlZiAqc3BlYyk7CiAKLSNlbmRpZgkvKiAhVVNFX1RPT0xCT1hfT0JKRUNUX0dMVUUgKi8KKyNlbmRpZiAgLyogIVVTRV9UT09MQk9YX09CSkVDVF9HTFVFICovCiAKIC8qIEZvcndhcmQgZGVjbGFyYXRpb25zICovCiBzdGF0aWMgUHlPYmplY3QgKkZTUmVmX05ldyhGU1JlZiAqaXRzZWxmKTsKQEAgLTY5LDEzICs2OSwxMyBAQAogc3RhdGljIGludAogVVRDRGF0ZVRpbWVfQ29udmVydChQeU9iamVjdCAqdiwgVVRDRGF0ZVRpbWUgKnB0cikKIHsKLSAgICAgICAgcmV0dXJuIFB5QXJnX1BhcnNlKHYsICIoSGxIKSIsICZwdHItPmhpZ2hTZWNvbmRzLCAmcHRyLT5sb3dTZWNvbmRzLCAmcHRyLT5mcmFjdGlvbik7CisgICAgcmV0dXJuIFB5QXJnX1BhcnNlKHYsICIoSGxIKSIsICZwdHItPmhpZ2hTZWNvbmRzLCAmcHRyLT5sb3dTZWNvbmRzLCAmcHRyLT5mcmFjdGlvbik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBVVENEYXRlVGltZV9OZXcoVVRDRGF0ZVRpbWUgKnB0cikKIHsKLSAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihIbEgpIiwgcHRyLT5oaWdoU2Vjb25kcywgcHRyLT5sb3dTZWNvbmRzLCBwdHItPmZyYWN0aW9uKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKEhsSCkiLCBwdHItPmhpZ2hTZWNvbmRzLCBwdHItPmxvd1NlY29uZHMsIHB0ci0+ZnJhY3Rpb24pOwogfQogCiAvKgpAQCAtODUsMjIgKzg1LDIyIEBACiBzdGF0aWMgaW50CiBteVB5TWFjX0dldE9wdEZTU3BlY1B0cihQeU9iamVjdCAqdiwgRlNTcGVjICoqc3BlYykKIHsKLSAgICAgICAgaWYgKHYgPT0gUHlfTm9uZSkgewotICAgICAgICAgICAgICAgICpzcGVjID0gTlVMTDsKLSAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gUHlNYWNfR2V0RlNTcGVjKHYsICpzcGVjKTsKKyAgICBpZiAodiA9PSBQeV9Ob25lKSB7CisgICAgICAgICpzcGVjID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHJldHVybiBQeU1hY19HZXRGU1NwZWModiwgKnNwZWMpOwogfQogI2VuZGlmIC8qICFfX0xQNjRfXyAqLwogCiBzdGF0aWMgaW50CiBteVB5TWFjX0dldE9wdEZTUmVmUHRyKFB5T2JqZWN0ICp2LCBGU1JlZiAqKnJlZikKIHsKLSAgICAgICAgaWYgKHYgPT0gUHlfTm9uZSkgewotICAgICAgICAgICAgICAgICpyZWYgPSBOVUxMOwotICAgICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBQeU1hY19HZXRGU1JlZih2LCAqcmVmKTsKKyAgICBpZiAodiA9PSBQeV9Ob25lKSB7CisgICAgICAgICpyZWYgPSBOVUxMOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgcmV0dXJuIFB5TWFjX0dldEZTUmVmKHYsICpyZWYpOwogfQogCiAvKgpAQCAtMTEwLDUyICsxMTAsNTIgQEAKIFB5TWFjX0J1aWxkSEZTVW5pU3RyMjU1KEhGU1VuaVN0cjI1NSAqaXRzZWxmKQogewogCi0gICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJ1IyIsIGl0c2VsZi0+dW5pY29kZSwgaXRzZWxmLT5sZW5ndGgpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJ1IyIsIGl0c2VsZi0+dW5pY29kZSwgaXRzZWxmLT5sZW5ndGgpOwogfQogCiAjaWZuZGVmIF9fTFA2NF9fCiBzdGF0aWMgT1NFcnIKIF9QeU1hY19HZXRGdWxsUGF0aG5hbWUoRlNTcGVjICpmc3MsIGNoYXIgKnBhdGgsIGludCBsZW4pCiB7Ci0JRlNSZWYgZnNyOwotCU9TRXJyIGVycjsKKyAgICBGU1JlZiBmc3I7CisgICAgT1NFcnIgZXJyOwogCi0JKnBhdGggPSAnXDAnOwotCWVyciA9IEZTcE1ha2VGU1JlZihmc3MsICZmc3IpOwotCWlmIChlcnIgPT0gZm5mRXJyKSB7Ci0JCS8qIEZTU3BlY3MgY2FuIHBvaW50IHRvIG5vbi1leGlzdGluZyBmaWxlcywgZnNyZWZzIGNhbid0LiAqLwotCQlGU1NwZWMgZnNzMjsKLQkJaW50IHRvY29weTsKKyAgICAqcGF0aCA9ICdcMCc7CisgICAgZXJyID0gRlNwTWFrZUZTUmVmKGZzcywgJmZzcik7CisgICAgaWYgKGVyciA9PSBmbmZFcnIpIHsKKyAgICAgICAgLyogRlNTcGVjcyBjYW4gcG9pbnQgdG8gbm9uLWV4aXN0aW5nIGZpbGVzLCBmc3JlZnMgY2FuJ3QuICovCisgICAgICAgIEZTU3BlYyBmc3MyOworICAgICAgICBpbnQgdG9jb3B5OwogCi0JCWVyciA9IEZTTWFrZUZTU3BlYyhmc3MtPnZSZWZOdW0sIGZzcy0+cGFySUQsCi0JCQkJICAgKHVuc2lnbmVkIGNoYXIqKSIiLCAmZnNzMik7Ci0JCWlmIChlcnIpCi0JCQlyZXR1cm4gZXJyOwotCQllcnIgPSBGU3BNYWtlRlNSZWYoJmZzczIsICZmc3IpOwotCQlpZiAoZXJyKQotCQkJcmV0dXJuIGVycjsKLQkJZXJyID0gKE9TRXJyKUZTUmVmTWFrZVBhdGgoJmZzciwgKHVuc2lnbmVkIGNoYXIqKXBhdGgsIGxlbi0xKTsKLQkJaWYgKGVycikKLQkJCXJldHVybiBlcnI7Ci0JCS8qIFRoaXMgcGFydCBpcyBub3QgMTAwJSBzYWZlOiB3ZSBhcHBlbmQgdGhlIGZpbGVuYW1lIHBhcnQsIGJ1dAotCQkqKiBJJ20gbm90IHN1cmUgdGhhdCB3ZSBkb24ndCBydW4gYWZvdWwgb2YgdGhlIHZhcmlvdXMgOGJpdAotCQkqKiBlbmNvZGluZ3MgaGVyZS4gV2lsbCBoYXZlIHRvIGxvb2sgdGhpcyB1cCBhdCBzb21lIHBvaW50Li4uCi0JCSovCi0JCXN0cmNhdChwYXRoLCAiLyIpOwotCQl0b2NvcHkgPSBmc3MtPm5hbWVbMF07Ci0JCWlmICgoc3RybGVuKHBhdGgpICsgdG9jb3B5KSA+PSBsZW4pCi0JCQl0b2NvcHkgPSBsZW4gLSBzdHJsZW4ocGF0aCkgLSAxOwotCQlpZiAodG9jb3B5ID4gMCkKLQkJCXN0cm5jYXQocGF0aCwgKGNoYXIqKWZzcy0+bmFtZSsxLCB0b2NvcHkpOwotCX0KLQllbHNlIHsKLQkJaWYgKGVycikKLQkJCXJldHVybiBlcnI7Ci0JCWVyciA9IChPU0VycilGU1JlZk1ha2VQYXRoKCZmc3IsICh1bnNpZ25lZCBjaGFyKilwYXRoLCBsZW4pOwotCQlpZiAoZXJyKQotCQkJcmV0dXJuIGVycjsKLQl9Ci0JcmV0dXJuIDA7CisgICAgICAgIGVyciA9IEZTTWFrZUZTU3BlYyhmc3MtPnZSZWZOdW0sIGZzcy0+cGFySUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhciopIiIsICZmc3MyKTsKKyAgICAgICAgaWYgKGVycikKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIGVyciA9IEZTcE1ha2VGU1JlZigmZnNzMiwgJmZzcik7CisgICAgICAgIGlmIChlcnIpCisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICBlcnIgPSAoT1NFcnIpRlNSZWZNYWtlUGF0aCgmZnNyLCAodW5zaWduZWQgY2hhciopcGF0aCwgbGVuLTEpOworICAgICAgICBpZiAoZXJyKQorICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgLyogVGhpcyBwYXJ0IGlzIG5vdCAxMDAlIHNhZmU6IHdlIGFwcGVuZCB0aGUgZmlsZW5hbWUgcGFydCwgYnV0CisgICAgICAgICoqIEknbSBub3Qgc3VyZSB0aGF0IHdlIGRvbid0IHJ1biBhZm91bCBvZiB0aGUgdmFyaW91cyA4Yml0CisgICAgICAgICoqIGVuY29kaW5ncyBoZXJlLiBXaWxsIGhhdmUgdG8gbG9vayB0aGlzIHVwIGF0IHNvbWUgcG9pbnQuLi4KKyAgICAgICAgKi8KKyAgICAgICAgc3RyY2F0KHBhdGgsICIvIik7CisgICAgICAgIHRvY29weSA9IGZzcy0+bmFtZVswXTsKKyAgICAgICAgaWYgKChzdHJsZW4ocGF0aCkgKyB0b2NvcHkpID49IGxlbikKKyAgICAgICAgICAgIHRvY29weSA9IGxlbiAtIHN0cmxlbihwYXRoKSAtIDE7CisgICAgICAgIGlmICh0b2NvcHkgPiAwKQorICAgICAgICAgICAgc3RybmNhdChwYXRoLCAoY2hhciopZnNzLT5uYW1lKzEsIHRvY29weSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZiAoZXJyKQorICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgZXJyID0gKE9TRXJyKUZTUmVmTWFrZVBhdGgoJmZzciwgKHVuc2lnbmVkIGNoYXIqKXBhdGgsIGxlbik7CisgICAgICAgIGlmIChlcnIpCisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKyAgICByZXR1cm4gMDsKIH0KICNlbmRpZiAvKiAhX19MUDY0X18gKi8KIApAQCAtMTY5LDI2MyArMTY5LDI2MyBAQAogI2RlZmluZSBGU0NhdGFsb2dJbmZvX0NoZWNrKHgpICgoeCktPm9iX3R5cGUgPT0gJkZTQ2F0YWxvZ0luZm9fVHlwZSB8fCBQeU9iamVjdF9UeXBlQ2hlY2soKHgpLCAmRlNDYXRhbG9nSW5mb19UeXBlKSkKIAogdHlwZWRlZiBzdHJ1Y3QgRlNDYXRhbG9nSW5mb09iamVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCUZTQ2F0YWxvZ0luZm8gb2JfaXRzZWxmOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBGU0NhdGFsb2dJbmZvIG9iX2l0c2VsZjsKIH0gRlNDYXRhbG9nSW5mb09iamVjdDsKIAogc3RhdGljIFB5T2JqZWN0ICpGU0NhdGFsb2dJbmZvX05ldyhGU0NhdGFsb2dJbmZvICppdHNlbGYpCiB7Ci0JRlNDYXRhbG9nSW5mb09iamVjdCAqaXQ7Ci0JaWYgKGl0c2VsZiA9PSBOVUxMKSB7IFB5X0lOQ1JFRihQeV9Ob25lKTsgcmV0dXJuIFB5X05vbmU7IH0KLQlpdCA9IFB5T2JqZWN0X05FVyhGU0NhdGFsb2dJbmZvT2JqZWN0LCAmRlNDYXRhbG9nSW5mb19UeXBlKTsKLQlpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JaXQtPm9iX2l0c2VsZiA9ICppdHNlbGY7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIEZTQ2F0YWxvZ0luZm9PYmplY3QgKml0OworICAgIGlmIChpdHNlbGYgPT0gTlVMTCkgeyBQeV9JTkNSRUYoUHlfTm9uZSk7IHJldHVybiBQeV9Ob25lOyB9CisgICAgaXQgPSBQeU9iamVjdF9ORVcoRlNDYXRhbG9nSW5mb09iamVjdCwgJkZTQ2F0YWxvZ0luZm9fVHlwZSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIGl0LT5vYl9pdHNlbGYgPSAqaXRzZWxmOworICAgIHJldHVybiAoUHlPYmplY3QgKilpdDsKIH0KIAogc3RhdGljIGludCBGU0NhdGFsb2dJbmZvX0NvbnZlcnQoUHlPYmplY3QgKnYsIEZTQ2F0YWxvZ0luZm8gKnBfaXRzZWxmKQogewotCWlmICghRlNDYXRhbG9nSW5mb19DaGVjayh2KSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJGU0NhdGFsb2dJbmZvIHJlcXVpcmVkIik7Ci0JCXJldHVybiAwOwotCX0KLQkqcF9pdHNlbGYgPSAoKEZTQ2F0YWxvZ0luZm9PYmplY3QgKil2KS0+b2JfaXRzZWxmOwotCXJldHVybiAxOworICAgIGlmICghRlNDYXRhbG9nSW5mb19DaGVjayh2KSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJGU0NhdGFsb2dJbmZvIHJlcXVpcmVkIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAqcF9pdHNlbGYgPSAoKEZTQ2F0YWxvZ0luZm9PYmplY3QgKil2KS0+b2JfaXRzZWxmOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgdm9pZCBGU0NhdGFsb2dJbmZvX2RlYWxsb2MoRlNDYXRhbG9nSW5mb09iamVjdCAqc2VsZikKIHsKLQkvKiBDbGVhbnVwIG9mIHNlbGYtPm9iX2l0c2VsZiBnb2VzIGhlcmUgKi8KLQlzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOworICAgIC8qIENsZWFudXAgb2Ygc2VsZi0+b2JfaXRzZWxmIGdvZXMgaGVyZSAqLworICAgIHNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBGU0NhdGFsb2dJbmZvX21ldGhvZHNbXSA9IHsKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqRlNDYXRhbG9nSW5mb19nZXRfbm9kZUZsYWdzKEZTQ2F0YWxvZ0luZm9PYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIkgiLCBzZWxmLT5vYl9pdHNlbGYubm9kZUZsYWdzKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiSCIsIHNlbGYtPm9iX2l0c2VsZi5ub2RlRmxhZ3MpOwogfQogCiBzdGF0aWMgaW50IEZTQ2F0YWxvZ0luZm9fc2V0X25vZGVGbGFncyhGU0NhdGFsb2dJbmZvT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlBcmdfUGFyc2UodiwgIkgiLCAmc2VsZi0+b2JfaXRzZWxmLm5vZGVGbGFncyktMTsKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gUHlBcmdfUGFyc2UodiwgIkgiLCAmc2VsZi0+b2JfaXRzZWxmLm5vZGVGbGFncyktMTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGU0NhdGFsb2dJbmZvX2dldF92b2x1bWUoRlNDYXRhbG9nSW5mb09iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaCIsIHNlbGYtPm9iX2l0c2VsZi52b2x1bWUpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJoIiwgc2VsZi0+b2JfaXRzZWxmLnZvbHVtZSk7CiB9CiAKIHN0YXRpYyBpbnQgRlNDYXRhbG9nSW5mb19zZXRfdm9sdW1lKEZTQ2F0YWxvZ0luZm9PYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp2LCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeUFyZ19QYXJzZSh2LCAiaCIsICZzZWxmLT5vYl9pdHNlbGYudm9sdW1lKS0xOwotCXJldHVybiAwOworICAgIHJldHVybiBQeUFyZ19QYXJzZSh2LCAiaCIsICZzZWxmLT5vYl9pdHNlbGYudm9sdW1lKS0xOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZTQ2F0YWxvZ0luZm9fZ2V0X3BhcmVudERpcklEKEZTQ2F0YWxvZ0luZm9PYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImwiLCBzZWxmLT5vYl9pdHNlbGYucGFyZW50RGlySUQpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJsIiwgc2VsZi0+b2JfaXRzZWxmLnBhcmVudERpcklEKTsKIH0KIAogc3RhdGljIGludCBGU0NhdGFsb2dJbmZvX3NldF9wYXJlbnREaXJJRChGU0NhdGFsb2dJbmZvT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlBcmdfUGFyc2UodiwgImwiLCAmc2VsZi0+b2JfaXRzZWxmLnBhcmVudERpcklEKS0xOwotCXJldHVybiAwOworICAgIHJldHVybiBQeUFyZ19QYXJzZSh2LCAibCIsICZzZWxmLT5vYl9pdHNlbGYucGFyZW50RGlySUQpLTE7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRlNDYXRhbG9nSW5mb19nZXRfbm9kZUlEKEZTQ2F0YWxvZ0luZm9PYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImwiLCBzZWxmLT5vYl9pdHNlbGYubm9kZUlEKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgibCIsIHNlbGYtPm9iX2l0c2VsZi5ub2RlSUQpOwogfQogCiBzdGF0aWMgaW50IEZTQ2F0YWxvZ0luZm9fc2V0X25vZGVJRChGU0NhdGFsb2dJbmZvT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlBcmdfUGFyc2UodiwgImwiLCAmc2VsZi0+b2JfaXRzZWxmLm5vZGVJRCktMTsKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gUHlBcmdfUGFyc2UodiwgImwiLCAmc2VsZi0+b2JfaXRzZWxmLm5vZGVJRCktMTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGU0NhdGFsb2dJbmZvX2dldF9jcmVhdGVEYXRlKEZTQ2F0YWxvZ0luZm9PYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgVVRDRGF0ZVRpbWVfTmV3LCAmc2VsZi0+b2JfaXRzZWxmLmNyZWF0ZURhdGUpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPJiIsIFVUQ0RhdGVUaW1lX05ldywgJnNlbGYtPm9iX2l0c2VsZi5jcmVhdGVEYXRlKTsKIH0KIAogc3RhdGljIGludCBGU0NhdGFsb2dJbmZvX3NldF9jcmVhdGVEYXRlKEZTQ2F0YWxvZ0luZm9PYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp2LCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeUFyZ19QYXJzZSh2LCAiTyYiLCBVVENEYXRlVGltZV9Db252ZXJ0LCAmc2VsZi0+b2JfaXRzZWxmLmNyZWF0ZURhdGUpLTE7Ci0JcmV0dXJuIDA7CisgICAgcmV0dXJuIFB5QXJnX1BhcnNlKHYsICJPJiIsIFVUQ0RhdGVUaW1lX0NvbnZlcnQsICZzZWxmLT5vYl9pdHNlbGYuY3JlYXRlRGF0ZSktMTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGU0NhdGFsb2dJbmZvX2dldF9jb250ZW50TW9kRGF0ZShGU0NhdGFsb2dJbmZvT2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJPJiIsIFVUQ0RhdGVUaW1lX05ldywgJnNlbGYtPm9iX2l0c2VsZi5jb250ZW50TW9kRGF0ZSk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgVVRDRGF0ZVRpbWVfTmV3LCAmc2VsZi0+b2JfaXRzZWxmLmNvbnRlbnRNb2REYXRlKTsKIH0KIAogc3RhdGljIGludCBGU0NhdGFsb2dJbmZvX3NldF9jb250ZW50TW9kRGF0ZShGU0NhdGFsb2dJbmZvT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlBcmdfUGFyc2UodiwgIk8mIiwgVVRDRGF0ZVRpbWVfQ29udmVydCwgJnNlbGYtPm9iX2l0c2VsZi5jb250ZW50TW9kRGF0ZSktMTsKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gUHlBcmdfUGFyc2UodiwgIk8mIiwgVVRDRGF0ZVRpbWVfQ29udmVydCwgJnNlbGYtPm9iX2l0c2VsZi5jb250ZW50TW9kRGF0ZSktMTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGU0NhdGFsb2dJbmZvX2dldF9hdHRyaWJ1dGVNb2REYXRlKEZTQ2F0YWxvZ0luZm9PYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgVVRDRGF0ZVRpbWVfTmV3LCAmc2VsZi0+b2JfaXRzZWxmLmF0dHJpYnV0ZU1vZERhdGUpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPJiIsIFVUQ0RhdGVUaW1lX05ldywgJnNlbGYtPm9iX2l0c2VsZi5hdHRyaWJ1dGVNb2REYXRlKTsKIH0KIAogc3RhdGljIGludCBGU0NhdGFsb2dJbmZvX3NldF9hdHRyaWJ1dGVNb2REYXRlKEZTQ2F0YWxvZ0luZm9PYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp2LCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeUFyZ19QYXJzZSh2LCAiTyYiLCBVVENEYXRlVGltZV9Db252ZXJ0LCAmc2VsZi0+b2JfaXRzZWxmLmF0dHJpYnV0ZU1vZERhdGUpLTE7Ci0JcmV0dXJuIDA7CisgICAgcmV0dXJuIFB5QXJnX1BhcnNlKHYsICJPJiIsIFVUQ0RhdGVUaW1lX0NvbnZlcnQsICZzZWxmLT5vYl9pdHNlbGYuYXR0cmlidXRlTW9kRGF0ZSktMTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGU0NhdGFsb2dJbmZvX2dldF9hY2Nlc3NEYXRlKEZTQ2F0YWxvZ0luZm9PYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgVVRDRGF0ZVRpbWVfTmV3LCAmc2VsZi0+b2JfaXRzZWxmLmFjY2Vzc0RhdGUpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPJiIsIFVUQ0RhdGVUaW1lX05ldywgJnNlbGYtPm9iX2l0c2VsZi5hY2Nlc3NEYXRlKTsKIH0KIAogc3RhdGljIGludCBGU0NhdGFsb2dJbmZvX3NldF9hY2Nlc3NEYXRlKEZTQ2F0YWxvZ0luZm9PYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp2LCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeUFyZ19QYXJzZSh2LCAiTyYiLCBVVENEYXRlVGltZV9Db252ZXJ0LCAmc2VsZi0+b2JfaXRzZWxmLmFjY2Vzc0RhdGUpLTE7Ci0JcmV0dXJuIDA7CisgICAgcmV0dXJuIFB5QXJnX1BhcnNlKHYsICJPJiIsIFVUQ0RhdGVUaW1lX0NvbnZlcnQsICZzZWxmLT5vYl9pdHNlbGYuYWNjZXNzRGF0ZSktMTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGU0NhdGFsb2dJbmZvX2dldF9iYWNrdXBEYXRlKEZTQ2F0YWxvZ0luZm9PYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgVVRDRGF0ZVRpbWVfTmV3LCAmc2VsZi0+b2JfaXRzZWxmLmJhY2t1cERhdGUpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPJiIsIFVUQ0RhdGVUaW1lX05ldywgJnNlbGYtPm9iX2l0c2VsZi5iYWNrdXBEYXRlKTsKIH0KIAogc3RhdGljIGludCBGU0NhdGFsb2dJbmZvX3NldF9iYWNrdXBEYXRlKEZTQ2F0YWxvZ0luZm9PYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp2LCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeUFyZ19QYXJzZSh2LCAiTyYiLCBVVENEYXRlVGltZV9Db252ZXJ0LCAmc2VsZi0+b2JfaXRzZWxmLmJhY2t1cERhdGUpLTE7Ci0JcmV0dXJuIDA7CisgICAgcmV0dXJuIFB5QXJnX1BhcnNlKHYsICJPJiIsIFVUQ0RhdGVUaW1lX0NvbnZlcnQsICZzZWxmLT5vYl9pdHNlbGYuYmFja3VwRGF0ZSktMTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGU0NhdGFsb2dJbmZvX2dldF9wZXJtaXNzaW9ucyhGU0NhdGFsb2dJbmZvT2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQogewotCUZTUGVybWlzc2lvbkluZm8qIGluZm8gPSAoRlNQZXJtaXNzaW9uSW5mbyopJihzZWxmLT5vYl9pdHNlbGYucGVybWlzc2lvbnMpOwotCXJldHVybiBQeV9CdWlsZFZhbHVlKCIobGxsbCkiLCBpbmZvLT51c2VySUQsIGluZm8tPmdyb3VwSUQsIGluZm8tPnVzZXJBY2Nlc3MsIGluZm8tPm1vZGUpOworICAgIEZTUGVybWlzc2lvbkluZm8qIGluZm8gPSAoRlNQZXJtaXNzaW9uSW5mbyopJihzZWxmLT5vYl9pdHNlbGYucGVybWlzc2lvbnMpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIobGxsbCkiLCBpbmZvLT51c2VySUQsIGluZm8tPmdyb3VwSUQsIGluZm8tPnVzZXJBY2Nlc3MsIGluZm8tPm1vZGUpOwogfQogCiBzdGF0aWMgaW50IEZTQ2F0YWxvZ0luZm9fc2V0X3Blcm1pc3Npb25zKEZTQ2F0YWxvZ0luZm9PYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp2LCB2b2lkICpjbG9zdXJlKQogewotCWxvbmcgdXNlcklEOwotCWxvbmcgZ3JvdXBJRDsKLQlsb25nIHVzZXJBY2Nlc3M7Ci0JbG9uZyBtb2RlOwotCWludCByOworICAgIGxvbmcgdXNlcklEOworICAgIGxvbmcgZ3JvdXBJRDsKKyAgICBsb25nIHVzZXJBY2Nlc3M7CisgICAgbG9uZyBtb2RlOworICAgIGludCByOwogCi0JRlNQZXJtaXNzaW9uSW5mbyogaW5mbyA9IChGU1Blcm1pc3Npb25JbmZvKikmKHNlbGYtPm9iX2l0c2VsZi5wZXJtaXNzaW9ucyk7CisgICAgRlNQZXJtaXNzaW9uSW5mbyogaW5mbyA9IChGU1Blcm1pc3Npb25JbmZvKikmKHNlbGYtPm9iX2l0c2VsZi5wZXJtaXNzaW9ucyk7CiAKLQlyID0gUHlBcmdfUGFyc2UodiwgIihsbGxsKSIsICZ1c2VySUQsICZncm91cElELCAmdXNlckFjY2VzcywgJm1vZGUpOwotCWlmICghcikgewotCQlyZXR1cm4gLTE7Ci0JfQotCWluZm8tPnVzZXJJRCA9IHVzZXJJRDsKLQlpbmZvLT5ncm91cElEID0gZ3JvdXBJRDsKLQlpbmZvLT51c2VyQWNjZXNzID0gdXNlckFjY2VzczsKLQlpbmZvLT5tb2RlID0gbW9kZTsKLQlyZXR1cm4gMDsKKyAgICByID0gUHlBcmdfUGFyc2UodiwgIihsbGxsKSIsICZ1c2VySUQsICZncm91cElELCAmdXNlckFjY2VzcywgJm1vZGUpOworICAgIGlmICghcikgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGluZm8tPnVzZXJJRCA9IHVzZXJJRDsKKyAgICBpbmZvLT5ncm91cElEID0gZ3JvdXBJRDsKKyAgICBpbmZvLT51c2VyQWNjZXNzID0gdXNlckFjY2VzczsKKyAgICBpbmZvLT5tb2RlID0gbW9kZTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGU0NhdGFsb2dJbmZvX2dldF92YWxlbmNlKEZTQ2F0YWxvZ0luZm9PYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImwiLCBzZWxmLT5vYl9pdHNlbGYudmFsZW5jZSk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImwiLCBzZWxmLT5vYl9pdHNlbGYudmFsZW5jZSk7CiB9CiAKIHN0YXRpYyBpbnQgRlNDYXRhbG9nSW5mb19zZXRfdmFsZW5jZShGU0NhdGFsb2dJbmZvT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlBcmdfUGFyc2UodiwgImwiLCAmc2VsZi0+b2JfaXRzZWxmLnZhbGVuY2UpLTE7Ci0JcmV0dXJuIDA7CisgICAgcmV0dXJuIFB5QXJnX1BhcnNlKHYsICJsIiwgJnNlbGYtPm9iX2l0c2VsZi52YWxlbmNlKS0xOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZTQ2F0YWxvZ0luZm9fZ2V0X2RhdGFMb2dpY2FsU2l6ZShGU0NhdGFsb2dJbmZvT2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJsIiwgc2VsZi0+b2JfaXRzZWxmLmRhdGFMb2dpY2FsU2l6ZSk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImwiLCBzZWxmLT5vYl9pdHNlbGYuZGF0YUxvZ2ljYWxTaXplKTsKIH0KIAogc3RhdGljIGludCBGU0NhdGFsb2dJbmZvX3NldF9kYXRhTG9naWNhbFNpemUoRlNDYXRhbG9nSW5mb09iamVjdCAqc2VsZiwgUHlPYmplY3QgKnYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5QXJnX1BhcnNlKHYsICJsIiwgJnNlbGYtPm9iX2l0c2VsZi5kYXRhTG9naWNhbFNpemUpLTE7Ci0JcmV0dXJuIDA7CisgICAgcmV0dXJuIFB5QXJnX1BhcnNlKHYsICJsIiwgJnNlbGYtPm9iX2l0c2VsZi5kYXRhTG9naWNhbFNpemUpLTE7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRlNDYXRhbG9nSW5mb19nZXRfZGF0YVBoeXNpY2FsU2l6ZShGU0NhdGFsb2dJbmZvT2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJsIiwgc2VsZi0+b2JfaXRzZWxmLmRhdGFQaHlzaWNhbFNpemUpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJsIiwgc2VsZi0+b2JfaXRzZWxmLmRhdGFQaHlzaWNhbFNpemUpOwogfQogCiBzdGF0aWMgaW50IEZTQ2F0YWxvZ0luZm9fc2V0X2RhdGFQaHlzaWNhbFNpemUoRlNDYXRhbG9nSW5mb09iamVjdCAqc2VsZiwgUHlPYmplY3QgKnYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5QXJnX1BhcnNlKHYsICJsIiwgJnNlbGYtPm9iX2l0c2VsZi5kYXRhUGh5c2ljYWxTaXplKS0xOwotCXJldHVybiAwOworICAgIHJldHVybiBQeUFyZ19QYXJzZSh2LCAibCIsICZzZWxmLT5vYl9pdHNlbGYuZGF0YVBoeXNpY2FsU2l6ZSktMTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGU0NhdGFsb2dJbmZvX2dldF9yc3JjTG9naWNhbFNpemUoRlNDYXRhbG9nSW5mb09iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgibCIsIHNlbGYtPm9iX2l0c2VsZi5yc3JjTG9naWNhbFNpemUpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJsIiwgc2VsZi0+b2JfaXRzZWxmLnJzcmNMb2dpY2FsU2l6ZSk7CiB9CiAKIHN0YXRpYyBpbnQgRlNDYXRhbG9nSW5mb19zZXRfcnNyY0xvZ2ljYWxTaXplKEZTQ2F0YWxvZ0luZm9PYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp2LCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeUFyZ19QYXJzZSh2LCAibCIsICZzZWxmLT5vYl9pdHNlbGYucnNyY0xvZ2ljYWxTaXplKS0xOwotCXJldHVybiAwOworICAgIHJldHVybiBQeUFyZ19QYXJzZSh2LCAibCIsICZzZWxmLT5vYl9pdHNlbGYucnNyY0xvZ2ljYWxTaXplKS0xOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZTQ2F0YWxvZ0luZm9fZ2V0X3JzcmNQaHlzaWNhbFNpemUoRlNDYXRhbG9nSW5mb09iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgibCIsIHNlbGYtPm9iX2l0c2VsZi5yc3JjUGh5c2ljYWxTaXplKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgibCIsIHNlbGYtPm9iX2l0c2VsZi5yc3JjUGh5c2ljYWxTaXplKTsKIH0KIAogc3RhdGljIGludCBGU0NhdGFsb2dJbmZvX3NldF9yc3JjUGh5c2ljYWxTaXplKEZTQ2F0YWxvZ0luZm9PYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp2LCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeUFyZ19QYXJzZSh2LCAibCIsICZzZWxmLT5vYl9pdHNlbGYucnNyY1BoeXNpY2FsU2l6ZSktMTsKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gUHlBcmdfUGFyc2UodiwgImwiLCAmc2VsZi0+b2JfaXRzZWxmLnJzcmNQaHlzaWNhbFNpemUpLTE7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRlNDYXRhbG9nSW5mb19nZXRfc2hhcmluZ0ZsYWdzKEZTQ2F0YWxvZ0luZm9PYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImwiLCBzZWxmLT5vYl9pdHNlbGYuc2hhcmluZ0ZsYWdzKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgibCIsIHNlbGYtPm9iX2l0c2VsZi5zaGFyaW5nRmxhZ3MpOwogfQogCiBzdGF0aWMgaW50IEZTQ2F0YWxvZ0luZm9fc2V0X3NoYXJpbmdGbGFncyhGU0NhdGFsb2dJbmZvT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlBcmdfUGFyc2UodiwgImwiLCAmc2VsZi0+b2JfaXRzZWxmLnNoYXJpbmdGbGFncyktMTsKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gUHlBcmdfUGFyc2UodiwgImwiLCAmc2VsZi0+b2JfaXRzZWxmLnNoYXJpbmdGbGFncyktMTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGU0NhdGFsb2dJbmZvX2dldF91c2VyUHJpdmlsZWdlcyhGU0NhdGFsb2dJbmZvT2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJiIiwgc2VsZi0+b2JfaXRzZWxmLnVzZXJQcml2aWxlZ2VzKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiYiIsIHNlbGYtPm9iX2l0c2VsZi51c2VyUHJpdmlsZWdlcyk7CiB9CiAKIHN0YXRpYyBpbnQgRlNDYXRhbG9nSW5mb19zZXRfdXNlclByaXZpbGVnZXMoRlNDYXRhbG9nSW5mb09iamVjdCAqc2VsZiwgUHlPYmplY3QgKnYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5QXJnX1BhcnNlKHYsICJiIiwgJnNlbGYtPm9iX2l0c2VsZi51c2VyUHJpdmlsZWdlcyktMTsKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gUHlBcmdfUGFyc2UodiwgImIiLCAmc2VsZi0+b2JfaXRzZWxmLnVzZXJQcml2aWxlZ2VzKS0xOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlHZXRTZXREZWYgRlNDYXRhbG9nSW5mb19nZXRzZXRsaXN0W10gPSB7Ci0JeyJub2RlRmxhZ3MiLCAoZ2V0dGVyKUZTQ2F0YWxvZ0luZm9fZ2V0X25vZGVGbGFncywgKHNldHRlcilGU0NhdGFsb2dJbmZvX3NldF9ub2RlRmxhZ3MsIE5VTEx9LAotCXsidm9sdW1lIiwgKGdldHRlcilGU0NhdGFsb2dJbmZvX2dldF92b2x1bWUsIChzZXR0ZXIpRlNDYXRhbG9nSW5mb19zZXRfdm9sdW1lLCBOVUxMfSwKLQl7InBhcmVudERpcklEIiwgKGdldHRlcilGU0NhdGFsb2dJbmZvX2dldF9wYXJlbnREaXJJRCwgKHNldHRlcilGU0NhdGFsb2dJbmZvX3NldF9wYXJlbnREaXJJRCwgTlVMTH0sCi0JeyJub2RlSUQiLCAoZ2V0dGVyKUZTQ2F0YWxvZ0luZm9fZ2V0X25vZGVJRCwgKHNldHRlcilGU0NhdGFsb2dJbmZvX3NldF9ub2RlSUQsIE5VTEx9LAotCXsiY3JlYXRlRGF0ZSIsIChnZXR0ZXIpRlNDYXRhbG9nSW5mb19nZXRfY3JlYXRlRGF0ZSwgKHNldHRlcilGU0NhdGFsb2dJbmZvX3NldF9jcmVhdGVEYXRlLCBOVUxMfSwKLQl7ImNvbnRlbnRNb2REYXRlIiwgKGdldHRlcilGU0NhdGFsb2dJbmZvX2dldF9jb250ZW50TW9kRGF0ZSwgKHNldHRlcilGU0NhdGFsb2dJbmZvX3NldF9jb250ZW50TW9kRGF0ZSwgTlVMTH0sCi0JeyJhdHRyaWJ1dGVNb2REYXRlIiwgKGdldHRlcilGU0NhdGFsb2dJbmZvX2dldF9hdHRyaWJ1dGVNb2REYXRlLCAoc2V0dGVyKUZTQ2F0YWxvZ0luZm9fc2V0X2F0dHJpYnV0ZU1vZERhdGUsIE5VTEx9LAotCXsiYWNjZXNzRGF0ZSIsIChnZXR0ZXIpRlNDYXRhbG9nSW5mb19nZXRfYWNjZXNzRGF0ZSwgKHNldHRlcilGU0NhdGFsb2dJbmZvX3NldF9hY2Nlc3NEYXRlLCBOVUxMfSwKLQl7ImJhY2t1cERhdGUiLCAoZ2V0dGVyKUZTQ2F0YWxvZ0luZm9fZ2V0X2JhY2t1cERhdGUsIChzZXR0ZXIpRlNDYXRhbG9nSW5mb19zZXRfYmFja3VwRGF0ZSwgTlVMTH0sCi0JeyJwZXJtaXNzaW9ucyIsIChnZXR0ZXIpRlNDYXRhbG9nSW5mb19nZXRfcGVybWlzc2lvbnMsIChzZXR0ZXIpRlNDYXRhbG9nSW5mb19zZXRfcGVybWlzc2lvbnMsIE5VTEx9LAotCXsidmFsZW5jZSIsIChnZXR0ZXIpRlNDYXRhbG9nSW5mb19nZXRfdmFsZW5jZSwgKHNldHRlcilGU0NhdGFsb2dJbmZvX3NldF92YWxlbmNlLCBOVUxMfSwKLQl7ImRhdGFMb2dpY2FsU2l6ZSIsIChnZXR0ZXIpRlNDYXRhbG9nSW5mb19nZXRfZGF0YUxvZ2ljYWxTaXplLCAoc2V0dGVyKUZTQ2F0YWxvZ0luZm9fc2V0X2RhdGFMb2dpY2FsU2l6ZSwgTlVMTH0sCi0JeyJkYXRhUGh5c2ljYWxTaXplIiwgKGdldHRlcilGU0NhdGFsb2dJbmZvX2dldF9kYXRhUGh5c2ljYWxTaXplLCAoc2V0dGVyKUZTQ2F0YWxvZ0luZm9fc2V0X2RhdGFQaHlzaWNhbFNpemUsIE5VTEx9LAotCXsicnNyY0xvZ2ljYWxTaXplIiwgKGdldHRlcilGU0NhdGFsb2dJbmZvX2dldF9yc3JjTG9naWNhbFNpemUsIChzZXR0ZXIpRlNDYXRhbG9nSW5mb19zZXRfcnNyY0xvZ2ljYWxTaXplLCBOVUxMfSwKLQl7InJzcmNQaHlzaWNhbFNpemUiLCAoZ2V0dGVyKUZTQ2F0YWxvZ0luZm9fZ2V0X3JzcmNQaHlzaWNhbFNpemUsIChzZXR0ZXIpRlNDYXRhbG9nSW5mb19zZXRfcnNyY1BoeXNpY2FsU2l6ZSwgTlVMTH0sCi0JeyJzaGFyaW5nRmxhZ3MiLCAoZ2V0dGVyKUZTQ2F0YWxvZ0luZm9fZ2V0X3NoYXJpbmdGbGFncywgKHNldHRlcilGU0NhdGFsb2dJbmZvX3NldF9zaGFyaW5nRmxhZ3MsIE5VTEx9LAotCXsidXNlclByaXZpbGVnZXMiLCAoZ2V0dGVyKUZTQ2F0YWxvZ0luZm9fZ2V0X3VzZXJQcml2aWxlZ2VzLCAoc2V0dGVyKUZTQ2F0YWxvZ0luZm9fc2V0X3VzZXJQcml2aWxlZ2VzLCBOVUxMfSwKLQl7TlVMTCwgTlVMTCwgTlVMTCwgTlVMTH0sCisgICAgeyJub2RlRmxhZ3MiLCAoZ2V0dGVyKUZTQ2F0YWxvZ0luZm9fZ2V0X25vZGVGbGFncywgKHNldHRlcilGU0NhdGFsb2dJbmZvX3NldF9ub2RlRmxhZ3MsIE5VTEx9LAorICAgIHsidm9sdW1lIiwgKGdldHRlcilGU0NhdGFsb2dJbmZvX2dldF92b2x1bWUsIChzZXR0ZXIpRlNDYXRhbG9nSW5mb19zZXRfdm9sdW1lLCBOVUxMfSwKKyAgICB7InBhcmVudERpcklEIiwgKGdldHRlcilGU0NhdGFsb2dJbmZvX2dldF9wYXJlbnREaXJJRCwgKHNldHRlcilGU0NhdGFsb2dJbmZvX3NldF9wYXJlbnREaXJJRCwgTlVMTH0sCisgICAgeyJub2RlSUQiLCAoZ2V0dGVyKUZTQ2F0YWxvZ0luZm9fZ2V0X25vZGVJRCwgKHNldHRlcilGU0NhdGFsb2dJbmZvX3NldF9ub2RlSUQsIE5VTEx9LAorICAgIHsiY3JlYXRlRGF0ZSIsIChnZXR0ZXIpRlNDYXRhbG9nSW5mb19nZXRfY3JlYXRlRGF0ZSwgKHNldHRlcilGU0NhdGFsb2dJbmZvX3NldF9jcmVhdGVEYXRlLCBOVUxMfSwKKyAgICB7ImNvbnRlbnRNb2REYXRlIiwgKGdldHRlcilGU0NhdGFsb2dJbmZvX2dldF9jb250ZW50TW9kRGF0ZSwgKHNldHRlcilGU0NhdGFsb2dJbmZvX3NldF9jb250ZW50TW9kRGF0ZSwgTlVMTH0sCisgICAgeyJhdHRyaWJ1dGVNb2REYXRlIiwgKGdldHRlcilGU0NhdGFsb2dJbmZvX2dldF9hdHRyaWJ1dGVNb2REYXRlLCAoc2V0dGVyKUZTQ2F0YWxvZ0luZm9fc2V0X2F0dHJpYnV0ZU1vZERhdGUsIE5VTEx9LAorICAgIHsiYWNjZXNzRGF0ZSIsIChnZXR0ZXIpRlNDYXRhbG9nSW5mb19nZXRfYWNjZXNzRGF0ZSwgKHNldHRlcilGU0NhdGFsb2dJbmZvX3NldF9hY2Nlc3NEYXRlLCBOVUxMfSwKKyAgICB7ImJhY2t1cERhdGUiLCAoZ2V0dGVyKUZTQ2F0YWxvZ0luZm9fZ2V0X2JhY2t1cERhdGUsIChzZXR0ZXIpRlNDYXRhbG9nSW5mb19zZXRfYmFja3VwRGF0ZSwgTlVMTH0sCisgICAgeyJwZXJtaXNzaW9ucyIsIChnZXR0ZXIpRlNDYXRhbG9nSW5mb19nZXRfcGVybWlzc2lvbnMsIChzZXR0ZXIpRlNDYXRhbG9nSW5mb19zZXRfcGVybWlzc2lvbnMsIE5VTEx9LAorICAgIHsidmFsZW5jZSIsIChnZXR0ZXIpRlNDYXRhbG9nSW5mb19nZXRfdmFsZW5jZSwgKHNldHRlcilGU0NhdGFsb2dJbmZvX3NldF92YWxlbmNlLCBOVUxMfSwKKyAgICB7ImRhdGFMb2dpY2FsU2l6ZSIsIChnZXR0ZXIpRlNDYXRhbG9nSW5mb19nZXRfZGF0YUxvZ2ljYWxTaXplLCAoc2V0dGVyKUZTQ2F0YWxvZ0luZm9fc2V0X2RhdGFMb2dpY2FsU2l6ZSwgTlVMTH0sCisgICAgeyJkYXRhUGh5c2ljYWxTaXplIiwgKGdldHRlcilGU0NhdGFsb2dJbmZvX2dldF9kYXRhUGh5c2ljYWxTaXplLCAoc2V0dGVyKUZTQ2F0YWxvZ0luZm9fc2V0X2RhdGFQaHlzaWNhbFNpemUsIE5VTEx9LAorICAgIHsicnNyY0xvZ2ljYWxTaXplIiwgKGdldHRlcilGU0NhdGFsb2dJbmZvX2dldF9yc3JjTG9naWNhbFNpemUsIChzZXR0ZXIpRlNDYXRhbG9nSW5mb19zZXRfcnNyY0xvZ2ljYWxTaXplLCBOVUxMfSwKKyAgICB7InJzcmNQaHlzaWNhbFNpemUiLCAoZ2V0dGVyKUZTQ2F0YWxvZ0luZm9fZ2V0X3JzcmNQaHlzaWNhbFNpemUsIChzZXR0ZXIpRlNDYXRhbG9nSW5mb19zZXRfcnNyY1BoeXNpY2FsU2l6ZSwgTlVMTH0sCisgICAgeyJzaGFyaW5nRmxhZ3MiLCAoZ2V0dGVyKUZTQ2F0YWxvZ0luZm9fZ2V0X3NoYXJpbmdGbGFncywgKHNldHRlcilGU0NhdGFsb2dJbmZvX3NldF9zaGFyaW5nRmxhZ3MsIE5VTEx9LAorICAgIHsidXNlclByaXZpbGVnZXMiLCAoZ2V0dGVyKUZTQ2F0YWxvZ0luZm9fZ2V0X3VzZXJQcml2aWxlZ2VzLCAoc2V0dGVyKUZTQ2F0YWxvZ0luZm9fc2V0X3VzZXJQcml2aWxlZ2VzLCBOVUxMfSwKKyAgICB7TlVMTCwgTlVMTCwgTlVMTCwgTlVMTH0sCiB9OwogCiAKQEAgLTQzNiwxMDMgKzQzNiwxMDMgQEAKICNkZWZpbmUgRlNDYXRhbG9nSW5mb19oYXNoIE5VTEwKIHN0YXRpYyBpbnQgRlNDYXRhbG9nSW5mb190cF9pbml0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzLCBQeU9iamVjdCAqX2t3ZHMpCiB7Ci0Jc3RhdGljIGNoYXIgKmt3W10gPSB7Ci0JICAgICAgICAgICAgIm5vZGVGbGFncyIsCi0JICAgICAgICAgICAgInZvbHVtZSIsCi0JICAgICAgICAgICAgInBhcmVudERpcklEIiwKLQkgICAgICAgICAgICAibm9kZUlEIiwKLQkgICAgICAgICAgICAiY3JlYXRlRGF0ZSIsCi0JICAgICAgICAgICAgImNvbnRlbnRNb2REYXRlIiwKLQkgICAgICAgICAgICAiYXRyaWJ1dGVNb2REYXRlIiwKLQkgICAgICAgICAgICAiYWNjZXNzRGF0ZSIsCi0JICAgICAgICAgICAgImJhY2t1cERhdGUiLAotCSAgICAgICAgICAgICJ2YWxlbmNlIiwKLQkgICAgICAgICAgICAiZGF0YUxvZ2ljYWxTaXplIiwKLQkgICAgICAgICAgICAiZGF0YVBoeXNpY2FsU2l6ZSIsCi0JICAgICAgICAgICAgInJzcmNMb2dpY2FsU2l6ZSIsCi0JICAgICAgICAgICAgInJzcmNQaHlzaWNhbFNpemUiLAotCSAgICAgICAgICAgICJzaGFyaW5nRmxhZ3MiLAotCSAgICAgICAgICAgICJ1c2VyUHJpdmlsZWdlcyIKLQkgICAgICAgICAgICAsIDB9OworICAgIHN0YXRpYyBjaGFyICprd1tdID0geworICAgICAgICAgICAgICAgICJub2RlRmxhZ3MiLAorICAgICAgICAgICAgICAgICJ2b2x1bWUiLAorICAgICAgICAgICAgICAgICJwYXJlbnREaXJJRCIsCisgICAgICAgICAgICAgICAgIm5vZGVJRCIsCisgICAgICAgICAgICAgICAgImNyZWF0ZURhdGUiLAorICAgICAgICAgICAgICAgICJjb250ZW50TW9kRGF0ZSIsCisgICAgICAgICAgICAgICAgImF0cmlidXRlTW9kRGF0ZSIsCisgICAgICAgICAgICAgICAgImFjY2Vzc0RhdGUiLAorICAgICAgICAgICAgICAgICJiYWNrdXBEYXRlIiwKKyAgICAgICAgICAgICAgICAidmFsZW5jZSIsCisgICAgICAgICAgICAgICAgImRhdGFMb2dpY2FsU2l6ZSIsCisgICAgICAgICAgICAgICAgImRhdGFQaHlzaWNhbFNpemUiLAorICAgICAgICAgICAgICAgICJyc3JjTG9naWNhbFNpemUiLAorICAgICAgICAgICAgICAgICJyc3JjUGh5c2ljYWxTaXplIiwKKyAgICAgICAgICAgICAgICAic2hhcmluZ0ZsYWdzIiwKKyAgICAgICAgICAgICAgICAidXNlclByaXZpbGVnZXMiCisgICAgICAgICAgICAgICAgLCAwfTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgInxIaGxsTyZPJk8mTyZPJmxsbGxsbGIiLCBrdywgJigoRlNDYXRhbG9nSW5mb09iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmLm5vZGVGbGFncywKLQkgICAgICAgICAgICAmKChGU0NhdGFsb2dJbmZvT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYudm9sdW1lLAotCSAgICAgICAgICAgICYoKEZTQ2F0YWxvZ0luZm9PYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZi5wYXJlbnREaXJJRCwKLQkgICAgICAgICAgICAmKChGU0NhdGFsb2dJbmZvT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYubm9kZUlELAotCSAgICAgICAgICAgIFVUQ0RhdGVUaW1lX0NvbnZlcnQsICYoKEZTQ2F0YWxvZ0luZm9PYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZi5jcmVhdGVEYXRlLAotCSAgICAgICAgICAgIFVUQ0RhdGVUaW1lX0NvbnZlcnQsICYoKEZTQ2F0YWxvZ0luZm9PYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZi5jb250ZW50TW9kRGF0ZSwKLQkgICAgICAgICAgICBVVENEYXRlVGltZV9Db252ZXJ0LCAmKChGU0NhdGFsb2dJbmZvT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYuYXR0cmlidXRlTW9kRGF0ZSwKLQkgICAgICAgICAgICBVVENEYXRlVGltZV9Db252ZXJ0LCAmKChGU0NhdGFsb2dJbmZvT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYuYWNjZXNzRGF0ZSwKLQkgICAgICAgICAgICBVVENEYXRlVGltZV9Db252ZXJ0LCAmKChGU0NhdGFsb2dJbmZvT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYuYmFja3VwRGF0ZSwKLQkgICAgICAgICAgICAmKChGU0NhdGFsb2dJbmZvT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYudmFsZW5jZSwKLQkgICAgICAgICAgICAmKChGU0NhdGFsb2dJbmZvT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYuZGF0YUxvZ2ljYWxTaXplLAotCSAgICAgICAgICAgICYoKEZTQ2F0YWxvZ0luZm9PYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZi5kYXRhUGh5c2ljYWxTaXplLAotCSAgICAgICAgICAgICYoKEZTQ2F0YWxvZ0luZm9PYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZi5yc3JjTG9naWNhbFNpemUsCi0JICAgICAgICAgICAgJigoRlNDYXRhbG9nSW5mb09iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmLnJzcmNQaHlzaWNhbFNpemUsCi0JICAgICAgICAgICAgJigoRlNDYXRhbG9nSW5mb09iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmLnNoYXJpbmdGbGFncywKLQkgICAgICAgICAgICAmKChGU0NhdGFsb2dJbmZvT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYudXNlclByaXZpbGVnZXMpKQotCXsKLQkJcmV0dXJuIC0xOwotCX0KLQlyZXR1cm4gMDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJ8SGhsbE8mTyZPJk8mTyZsbGxsbGxiIiwga3csICYoKEZTQ2F0YWxvZ0luZm9PYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZi5ub2RlRmxhZ3MsCisgICAgICAgICAgICAgICAgJigoRlNDYXRhbG9nSW5mb09iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmLnZvbHVtZSwKKyAgICAgICAgICAgICAgICAmKChGU0NhdGFsb2dJbmZvT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYucGFyZW50RGlySUQsCisgICAgICAgICAgICAgICAgJigoRlNDYXRhbG9nSW5mb09iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmLm5vZGVJRCwKKyAgICAgICAgICAgICAgICBVVENEYXRlVGltZV9Db252ZXJ0LCAmKChGU0NhdGFsb2dJbmZvT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYuY3JlYXRlRGF0ZSwKKyAgICAgICAgICAgICAgICBVVENEYXRlVGltZV9Db252ZXJ0LCAmKChGU0NhdGFsb2dJbmZvT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYuY29udGVudE1vZERhdGUsCisgICAgICAgICAgICAgICAgVVRDRGF0ZVRpbWVfQ29udmVydCwgJigoRlNDYXRhbG9nSW5mb09iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmLmF0dHJpYnV0ZU1vZERhdGUsCisgICAgICAgICAgICAgICAgVVRDRGF0ZVRpbWVfQ29udmVydCwgJigoRlNDYXRhbG9nSW5mb09iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmLmFjY2Vzc0RhdGUsCisgICAgICAgICAgICAgICAgVVRDRGF0ZVRpbWVfQ29udmVydCwgJigoRlNDYXRhbG9nSW5mb09iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmLmJhY2t1cERhdGUsCisgICAgICAgICAgICAgICAgJigoRlNDYXRhbG9nSW5mb09iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmLnZhbGVuY2UsCisgICAgICAgICAgICAgICAgJigoRlNDYXRhbG9nSW5mb09iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmLmRhdGFMb2dpY2FsU2l6ZSwKKyAgICAgICAgICAgICAgICAmKChGU0NhdGFsb2dJbmZvT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYuZGF0YVBoeXNpY2FsU2l6ZSwKKyAgICAgICAgICAgICAgICAmKChGU0NhdGFsb2dJbmZvT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYucnNyY0xvZ2ljYWxTaXplLAorICAgICAgICAgICAgICAgICYoKEZTQ2F0YWxvZ0luZm9PYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZi5yc3JjUGh5c2ljYWxTaXplLAorICAgICAgICAgICAgICAgICYoKEZTQ2F0YWxvZ0luZm9PYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZi5zaGFyaW5nRmxhZ3MsCisgICAgICAgICAgICAgICAgJigoRlNDYXRhbG9nSW5mb09iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmLnVzZXJQcml2aWxlZ2VzKSkKKyAgICB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKICNkZWZpbmUgRlNDYXRhbG9nSW5mb190cF9hbGxvYyBQeVR5cGVfR2VuZXJpY0FsbG9jCiAKIHN0YXRpYyBQeU9iamVjdCAqRlNDYXRhbG9nSW5mb190cF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlQeU9iamVjdCAqc2VsZjsKKyAgICBQeU9iamVjdCAqc2VsZjsKIAotCWlmICgoc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQltZW1zZXQoJigoRlNDYXRhbG9nSW5mb09iamVjdCAqKXNlbGYpLT5vYl9pdHNlbGYsIDAsIHNpemVvZihGU0NhdGFsb2dJbmZvKSk7Ci0JcmV0dXJuIHNlbGY7CisgICAgaWYgKChzZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIG1lbXNldCgmKChGU0NhdGFsb2dJbmZvT2JqZWN0ICopc2VsZiktPm9iX2l0c2VsZiwgMCwgc2l6ZW9mKEZTQ2F0YWxvZ0luZm8pKTsKKyAgICByZXR1cm4gc2VsZjsKIH0KIAogI2RlZmluZSBGU0NhdGFsb2dJbmZvX3RwX2ZyZWUgUHlPYmplY3RfRGVsCiAKIAogc3RhdGljIFB5VHlwZU9iamVjdCBGU0NhdGFsb2dJbmZvX1R5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCi0JMCwgLypvYl9zaXplKi8KLQkiQ2FyYm9uLkZpbGUuRlNDYXRhbG9nSW5mbyIsIC8qdHBfbmFtZSovCi0Jc2l6ZW9mKEZTQ2F0YWxvZ0luZm9PYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCi0JMCwgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKSBGU0NhdGFsb2dJbmZvX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCi0JMCwgLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCi0JKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCi0JKGNtcGZ1bmMpIEZTQ2F0YWxvZ0luZm9fY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpIEZTQ2F0YWxvZ0luZm9fcmVwciwgLyp0cF9yZXByKi8KLQkoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCi0JKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpIEZTQ2F0YWxvZ0luZm9faGFzaCwgLyp0cF9oYXNoKi8KLQkwLCAvKnRwX2NhbGwqLwotCTAsIC8qdHBfc3RyKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCi0JUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KLQkwLCAvKnRwX2FzX2J1ZmZlciovCi0JUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCi0JMCwgLyp0cF9kb2MqLwotCTAsIC8qdHBfdHJhdmVyc2UqLwotCTAsIC8qdHBfY2xlYXIqLwotCTAsIC8qdHBfcmljaGNvbXBhcmUqLwotCTAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLwotCTAsIC8qdHBfaXRlciovCi0JMCwgLyp0cF9pdGVybmV4dCovCi0JRlNDYXRhbG9nSW5mb19tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCi0JMCwgLyp0cF9tZW1iZXJzKi8KLQlGU0NhdGFsb2dJbmZvX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KLQkwLCAvKnRwX2Jhc2UqLwotCTAsIC8qdHBfZGljdCovCi0JMCwgLyp0cF9kZXNjcl9nZXQqLwotCTAsIC8qdHBfZGVzY3Jfc2V0Ki8KLQkwLCAvKnRwX2RpY3RvZmZzZXQqLwotCUZTQ2F0YWxvZ0luZm9fdHBfaW5pdCwgLyogdHBfaW5pdCAqLwotCUZTQ2F0YWxvZ0luZm9fdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCi0JRlNDYXRhbG9nSW5mb190cF9uZXcsIC8qIHRwX25ldyAqLwotCUZTQ2F0YWxvZ0luZm9fdHBfZnJlZSwgLyogdHBfZnJlZSAqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgIDAsIC8qb2Jfc2l6ZSovCisgICAgIkNhcmJvbi5GaWxlLkZTQ2F0YWxvZ0luZm8iLCAvKnRwX25hbWUqLworICAgIHNpemVvZihGU0NhdGFsb2dJbmZvT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLworICAgIDAsIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcikgRlNDYXRhbG9nSW5mb19kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgIDAsIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLworICAgIChzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLworICAgIChjbXBmdW5jKSBGU0NhdGFsb2dJbmZvX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCisgICAgKHJlcHJmdW5jKSBGU0NhdGFsb2dJbmZvX3JlcHIsIC8qdHBfcmVwciovCisgICAgKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLworICAgIChQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKSBGU0NhdGFsb2dJbmZvX2hhc2gsIC8qdHBfaGFzaCovCisgICAgMCwgLyp0cF9jYWxsKi8KKyAgICAwLCAvKnRwX3N0ciovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLworICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCisgICAgMCwgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLworICAgIDAsIC8qdHBfZG9jKi8KKyAgICAwLCAvKnRwX3RyYXZlcnNlKi8KKyAgICAwLCAvKnRwX2NsZWFyKi8KKyAgICAwLCAvKnRwX3JpY2hjb21wYXJlKi8KKyAgICAwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KKyAgICAwLCAvKnRwX2l0ZXIqLworICAgIDAsIC8qdHBfaXRlcm5leHQqLworICAgIEZTQ2F0YWxvZ0luZm9fbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLworICAgIDAsIC8qdHBfbWVtYmVycyovCisgICAgRlNDYXRhbG9nSW5mb19nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCisgICAgMCwgLyp0cF9iYXNlKi8KKyAgICAwLCAvKnRwX2RpY3QqLworICAgIDAsIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICBGU0NhdGFsb2dJbmZvX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KKyAgICBGU0NhdGFsb2dJbmZvX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLworICAgIEZTQ2F0YWxvZ0luZm9fdHBfbmV3LCAvKiB0cF9uZXcgKi8KKyAgICBGU0NhdGFsb2dJbmZvX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tIEVuZCBvYmplY3QgdHlwZSBGU0NhdGFsb2dJbmZvIC0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtNTQ3LDEwMyArNTQ3LDEwMyBAQAogI2RlZmluZSBGSW5mb19DaGVjayh4KSAoKHgpLT5vYl90eXBlID09ICZGSW5mb19UeXBlIHx8IFB5T2JqZWN0X1R5cGVDaGVjaygoeCksICZGSW5mb19UeXBlKSkKIAogdHlwZWRlZiBzdHJ1Y3QgRkluZm9PYmplY3QgewotCVB5T2JqZWN0X0hFQUQKLQlGSW5mbyBvYl9pdHNlbGY7CisgICAgUHlPYmplY3RfSEVBRAorICAgIEZJbmZvIG9iX2l0c2VsZjsKIH0gRkluZm9PYmplY3Q7CiAKIHN0YXRpYyBQeU9iamVjdCAqRkluZm9fTmV3KEZJbmZvICppdHNlbGYpCiB7Ci0JRkluZm9PYmplY3QgKml0OwotCWlmIChpdHNlbGYgPT0gTlVMTCkgcmV0dXJuIFB5TWFjX0Vycm9yKHJlc05vdEZvdW5kKTsKLQlpdCA9IFB5T2JqZWN0X05FVyhGSW5mb09iamVjdCwgJkZJbmZvX1R5cGUpOwotCWlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQlpdC0+b2JfaXRzZWxmID0gKml0c2VsZjsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgRkluZm9PYmplY3QgKml0OworICAgIGlmIChpdHNlbGYgPT0gTlVMTCkgcmV0dXJuIFB5TWFjX0Vycm9yKHJlc05vdEZvdW5kKTsKKyAgICBpdCA9IFB5T2JqZWN0X05FVyhGSW5mb09iamVjdCwgJkZJbmZvX1R5cGUpOworICAgIGlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICBpdC0+b2JfaXRzZWxmID0gKml0c2VsZjsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiAKIHN0YXRpYyBpbnQgRkluZm9fQ29udmVydChQeU9iamVjdCAqdiwgRkluZm8gKnBfaXRzZWxmKQogewotCWlmICghRkluZm9fQ2hlY2sodikpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiRkluZm8gcmVxdWlyZWQiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCSpwX2l0c2VsZiA9ICgoRkluZm9PYmplY3QgKil2KS0+b2JfaXRzZWxmOwotCXJldHVybiAxOworICAgIGlmICghRkluZm9fQ2hlY2sodikpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiRkluZm8gcmVxdWlyZWQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICpwX2l0c2VsZiA9ICgoRkluZm9PYmplY3QgKil2KS0+b2JfaXRzZWxmOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgdm9pZCBGSW5mb19kZWFsbG9jKEZJbmZvT2JqZWN0ICpzZWxmKQogewotCS8qIENsZWFudXAgb2Ygc2VsZi0+b2JfaXRzZWxmIGdvZXMgaGVyZSAqLwotCXNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CisgICAgLyogQ2xlYW51cCBvZiBzZWxmLT5vYl9pdHNlbGYgZ29lcyBoZXJlICovCisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIEZJbmZvX21ldGhvZHNbXSA9IHsKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqRkluZm9fZ2V0X1R5cGUoRkluZm9PYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgUHlNYWNfQnVpbGRPU1R5cGUsIHNlbGYtPm9iX2l0c2VsZi5mZFR5cGUpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPJiIsIFB5TWFjX0J1aWxkT1NUeXBlLCBzZWxmLT5vYl9pdHNlbGYuZmRUeXBlKTsKIH0KIAogc3RhdGljIGludCBGSW5mb19zZXRfVHlwZShGSW5mb09iamVjdCAqc2VsZiwgUHlPYmplY3QgKnYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5QXJnX1BhcnNlKHYsICJPJiIsIFB5TWFjX0dldE9TVHlwZSwgJnNlbGYtPm9iX2l0c2VsZi5mZFR5cGUpLTE7Ci0JcmV0dXJuIDA7CisgICAgcmV0dXJuIFB5QXJnX1BhcnNlKHYsICJPJiIsIFB5TWFjX0dldE9TVHlwZSwgJnNlbGYtPm9iX2l0c2VsZi5mZFR5cGUpLTE7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRkluZm9fZ2V0X0NyZWF0b3IoRkluZm9PYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgUHlNYWNfQnVpbGRPU1R5cGUsIHNlbGYtPm9iX2l0c2VsZi5mZENyZWF0b3IpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPJiIsIFB5TWFjX0J1aWxkT1NUeXBlLCBzZWxmLT5vYl9pdHNlbGYuZmRDcmVhdG9yKTsKIH0KIAogc3RhdGljIGludCBGSW5mb19zZXRfQ3JlYXRvcihGSW5mb09iamVjdCAqc2VsZiwgUHlPYmplY3QgKnYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5QXJnX1BhcnNlKHYsICJPJiIsIFB5TWFjX0dldE9TVHlwZSwgJnNlbGYtPm9iX2l0c2VsZi5mZENyZWF0b3IpLTE7Ci0JcmV0dXJuIDA7CisgICAgcmV0dXJuIFB5QXJnX1BhcnNlKHYsICJPJiIsIFB5TWFjX0dldE9TVHlwZSwgJnNlbGYtPm9iX2l0c2VsZi5mZENyZWF0b3IpLTE7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRkluZm9fZ2V0X0ZsYWdzKEZJbmZvT2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJIIiwgc2VsZi0+b2JfaXRzZWxmLmZkRmxhZ3MpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJIIiwgc2VsZi0+b2JfaXRzZWxmLmZkRmxhZ3MpOwogfQogCiBzdGF0aWMgaW50IEZJbmZvX3NldF9GbGFncyhGSW5mb09iamVjdCAqc2VsZiwgUHlPYmplY3QgKnYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5QXJnX1BhcnNlKHYsICJIIiwgJnNlbGYtPm9iX2l0c2VsZi5mZEZsYWdzKS0xOwotCXJldHVybiAwOworICAgIHJldHVybiBQeUFyZ19QYXJzZSh2LCAiSCIsICZzZWxmLT5vYl9pdHNlbGYuZmRGbGFncyktMTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGSW5mb19nZXRfTG9jYXRpb24oRkluZm9PYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgUHlNYWNfQnVpbGRQb2ludCwgc2VsZi0+b2JfaXRzZWxmLmZkTG9jYXRpb24pOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPJiIsIFB5TWFjX0J1aWxkUG9pbnQsIHNlbGYtPm9iX2l0c2VsZi5mZExvY2F0aW9uKTsKIH0KIAogc3RhdGljIGludCBGSW5mb19zZXRfTG9jYXRpb24oRkluZm9PYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp2LCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeUFyZ19QYXJzZSh2LCAiTyYiLCBQeU1hY19HZXRQb2ludCwgJnNlbGYtPm9iX2l0c2VsZi5mZExvY2F0aW9uKS0xOwotCXJldHVybiAwOworICAgIHJldHVybiBQeUFyZ19QYXJzZSh2LCAiTyYiLCBQeU1hY19HZXRQb2ludCwgJnNlbGYtPm9iX2l0c2VsZi5mZExvY2F0aW9uKS0xOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZJbmZvX2dldF9GbGRyKEZJbmZvT2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJoIiwgc2VsZi0+b2JfaXRzZWxmLmZkRmxkcik7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImgiLCBzZWxmLT5vYl9pdHNlbGYuZmRGbGRyKTsKIH0KIAogc3RhdGljIGludCBGSW5mb19zZXRfRmxkcihGSW5mb09iamVjdCAqc2VsZiwgUHlPYmplY3QgKnYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5QXJnX1BhcnNlKHYsICJoIiwgJnNlbGYtPm9iX2l0c2VsZi5mZEZsZHIpLTE7Ci0JcmV0dXJuIDA7CisgICAgcmV0dXJuIFB5QXJnX1BhcnNlKHYsICJoIiwgJnNlbGYtPm9iX2l0c2VsZi5mZEZsZHIpLTE7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeUdldFNldERlZiBGSW5mb19nZXRzZXRsaXN0W10gPSB7Ci0JeyJUeXBlIiwgKGdldHRlcilGSW5mb19nZXRfVHlwZSwgKHNldHRlcilGSW5mb19zZXRfVHlwZSwgIjQtY2hhciBmaWxlIHR5cGUifSwKLQl7IkNyZWF0b3IiLCAoZ2V0dGVyKUZJbmZvX2dldF9DcmVhdG9yLCAoc2V0dGVyKUZJbmZvX3NldF9DcmVhdG9yLCAiNC1jaGFyIGZpbGUgY3JlYXRvciJ9LAotCXsiRmxhZ3MiLCAoZ2V0dGVyKUZJbmZvX2dldF9GbGFncywgKHNldHRlcilGSW5mb19zZXRfRmxhZ3MsICJGaW5kZXIgZmxhZyBiaXRzIn0sCi0JeyJMb2NhdGlvbiIsIChnZXR0ZXIpRkluZm9fZ2V0X0xvY2F0aW9uLCAoc2V0dGVyKUZJbmZvX3NldF9Mb2NhdGlvbiwgIih4LCB5KSBsb2NhdGlvbiBvZiB0aGUgZmlsZSdzIGljb24gaW4gaXRzIHBhcmVudCBmaW5kZXIgd2luZG93In0sCi0JeyJGbGRyIiwgKGdldHRlcilGSW5mb19nZXRfRmxkciwgKHNldHRlcilGSW5mb19zZXRfRmxkciwgIk9yaWdpbmFsIGZvbGRlciwgZm9yICdwdXQgYXdheScifSwKLQl7TlVMTCwgTlVMTCwgTlVMTCwgTlVMTH0sCisgICAgeyJUeXBlIiwgKGdldHRlcilGSW5mb19nZXRfVHlwZSwgKHNldHRlcilGSW5mb19zZXRfVHlwZSwgIjQtY2hhciBmaWxlIHR5cGUifSwKKyAgICB7IkNyZWF0b3IiLCAoZ2V0dGVyKUZJbmZvX2dldF9DcmVhdG9yLCAoc2V0dGVyKUZJbmZvX3NldF9DcmVhdG9yLCAiNC1jaGFyIGZpbGUgY3JlYXRvciJ9LAorICAgIHsiRmxhZ3MiLCAoZ2V0dGVyKUZJbmZvX2dldF9GbGFncywgKHNldHRlcilGSW5mb19zZXRfRmxhZ3MsICJGaW5kZXIgZmxhZyBiaXRzIn0sCisgICAgeyJMb2NhdGlvbiIsIChnZXR0ZXIpRkluZm9fZ2V0X0xvY2F0aW9uLCAoc2V0dGVyKUZJbmZvX3NldF9Mb2NhdGlvbiwgIih4LCB5KSBsb2NhdGlvbiBvZiB0aGUgZmlsZSdzIGljb24gaW4gaXRzIHBhcmVudCBmaW5kZXIgd2luZG93In0sCisgICAgeyJGbGRyIiwgKGdldHRlcilGSW5mb19nZXRfRmxkciwgKHNldHRlcilGSW5mb19zZXRfRmxkciwgIk9yaWdpbmFsIGZvbGRlciwgZm9yICdwdXQgYXdheScifSwKKyAgICB7TlVMTCwgTlVMTCwgTlVMTCwgTlVMTH0sCiB9OwogCiAKQEAgLTY1NCw3MyArNjU0LDczIEBACiAjZGVmaW5lIEZJbmZvX2hhc2ggTlVMTAogc3RhdGljIGludCBGSW5mb190cF9pbml0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzLCBQeU9iamVjdCAqX2t3ZHMpCiB7Ci0JRkluZm8gKml0c2VsZiA9IE5VTEw7Ci0Jc3RhdGljIGNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OworICAgIEZJbmZvICppdHNlbGYgPSBOVUxMOworICAgIHN0YXRpYyBjaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKIAotCWlmIChQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAifE8mIiwga3csIEZJbmZvX0NvbnZlcnQsICZpdHNlbGYpKQotCXsKLQkJaWYgKGl0c2VsZikgbWVtY3B5KCYoKEZJbmZvT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYsIGl0c2VsZiwgc2l6ZW9mKEZJbmZvKSk7Ci0JCXJldHVybiAwOwotCX0KLQlyZXR1cm4gLTE7CisgICAgaWYgKFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJ8TyYiLCBrdywgRkluZm9fQ29udmVydCwgJml0c2VsZikpCisgICAgeworICAgICAgICBpZiAoaXRzZWxmKSBtZW1jcHkoJigoRkluZm9PYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiwgaXRzZWxmLCBzaXplb2YoRkluZm8pKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAtMTsKIH0KIAogI2RlZmluZSBGSW5mb190cF9hbGxvYyBQeVR5cGVfR2VuZXJpY0FsbG9jCiAKIHN0YXRpYyBQeU9iamVjdCAqRkluZm9fdHBfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKl9hcmdzLCBQeU9iamVjdCAqX2t3ZHMpCiB7Ci0JUHlPYmplY3QgKnNlbGY7CisgICAgUHlPYmplY3QgKnNlbGY7CiAKLQlpZiAoKHNlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JbWVtc2V0KCYoKEZJbmZvT2JqZWN0ICopc2VsZiktPm9iX2l0c2VsZiwgMCwgc2l6ZW9mKEZJbmZvKSk7Ci0JcmV0dXJuIHNlbGY7CisgICAgaWYgKChzZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIG1lbXNldCgmKChGSW5mb09iamVjdCAqKXNlbGYpLT5vYl9pdHNlbGYsIDAsIHNpemVvZihGSW5mbykpOworICAgIHJldHVybiBzZWxmOwogfQogCiAjZGVmaW5lIEZJbmZvX3RwX2ZyZWUgUHlPYmplY3RfRGVsCiAKIAogc3RhdGljIFB5VHlwZU9iamVjdCBGSW5mb19UeXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQotCTAsIC8qb2Jfc2l6ZSovCi0JIkNhcmJvbi5GaWxlLkZJbmZvIiwgLyp0cF9uYW1lKi8KLQlzaXplb2YoRkluZm9PYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCi0JMCwgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKSBGSW5mb19kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsIC8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLwotCShjbXBmdW5jKSBGSW5mb19jb21wYXJlLCAvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYykgRkluZm9fcmVwciwgLyp0cF9yZXByKi8KLQkoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCi0JKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpIEZJbmZvX2hhc2gsIC8qdHBfaGFzaCovCi0JMCwgLyp0cF9jYWxsKi8KLQkwLCAvKnRwX3N0ciovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLwotCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCi0JMCwgLyp0cF9hc19idWZmZXIqLwotCVB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCTAsIC8qdHBfZG9jKi8KLQkwLCAvKnRwX3RyYXZlcnNlKi8KLQkwLCAvKnRwX2NsZWFyKi8KLQkwLCAvKnRwX3JpY2hjb21wYXJlKi8KLQkwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLQkwLCAvKnRwX2l0ZXIqLwotCTAsIC8qdHBfaXRlcm5leHQqLwotCUZJbmZvX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KLQkwLCAvKnRwX21lbWJlcnMqLwotCUZJbmZvX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KLQkwLCAvKnRwX2Jhc2UqLwotCTAsIC8qdHBfZGljdCovCi0JMCwgLyp0cF9kZXNjcl9nZXQqLwotCTAsIC8qdHBfZGVzY3Jfc2V0Ki8KLQkwLCAvKnRwX2RpY3RvZmZzZXQqLwotCUZJbmZvX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KLQlGSW5mb190cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KLQlGSW5mb190cF9uZXcsIC8qIHRwX25ldyAqLwotCUZJbmZvX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAvKm9iX3NpemUqLworICAgICJDYXJib24uRmlsZS5GSW5mbyIsIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKEZJbmZvT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLworICAgIDAsIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcikgRkluZm9fZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KKyAgICAoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KKyAgICAoY21wZnVuYykgRkluZm9fY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpIEZJbmZvX3JlcHIsIC8qdHBfcmVwciovCisgICAgKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLworICAgIChQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKSBGSW5mb19oYXNoLCAvKnRwX2hhc2gqLworICAgIDAsIC8qdHBfY2FsbCovCisgICAgMCwgLyp0cF9zdHIqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KKyAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLworICAgIDAsIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAvKnRwX2RvYyovCisgICAgMCwgLyp0cF90cmF2ZXJzZSovCisgICAgMCwgLyp0cF9jbGVhciovCisgICAgMCwgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgLyp0cF9pdGVyKi8KKyAgICAwLCAvKnRwX2l0ZXJuZXh0Ki8KKyAgICBGSW5mb19tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCisgICAgMCwgLyp0cF9tZW1iZXJzKi8KKyAgICBGSW5mb19nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCisgICAgMCwgLyp0cF9iYXNlKi8KKyAgICAwLCAvKnRwX2RpY3QqLworICAgIDAsIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICBGSW5mb190cF9pbml0LCAvKiB0cF9pbml0ICovCisgICAgRkluZm9fdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCisgICAgRkluZm9fdHBfbmV3LCAvKiB0cF9uZXcgKi8KKyAgICBGSW5mb190cF9mcmVlLCAvKiB0cF9mcmVlICovCiB9OwogCiAjZW5kaWYgLyogIV9fTFA2NF9fICovCkBAIC03MzQsMjQ0ICs3MzQsMjQ0IEBACiAjZGVmaW5lIEFsaWFzX0NoZWNrKHgpICgoeCktPm9iX3R5cGUgPT0gJkFsaWFzX1R5cGUgfHwgUHlPYmplY3RfVHlwZUNoZWNrKCh4KSwgJkFsaWFzX1R5cGUpKQogCiB0eXBlZGVmIHN0cnVjdCBBbGlhc09iamVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCUFsaWFzSGFuZGxlIG9iX2l0c2VsZjsKLQl2b2lkICgqb2JfZnJlZWl0KShBbGlhc0hhbmRsZSBwdHIpOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBBbGlhc0hhbmRsZSBvYl9pdHNlbGY7CisgICAgdm9pZCAoKm9iX2ZyZWVpdCkoQWxpYXNIYW5kbGUgcHRyKTsKIH0gQWxpYXNPYmplY3Q7CiAKIHN0YXRpYyBQeU9iamVjdCAqQWxpYXNfTmV3KEFsaWFzSGFuZGxlIGl0c2VsZikKIHsKLQlBbGlhc09iamVjdCAqaXQ7Ci0JaWYgKGl0c2VsZiA9PSBOVUxMKSByZXR1cm4gUHlNYWNfRXJyb3IocmVzTm90Rm91bmQpOwotCWl0ID0gUHlPYmplY3RfTkVXKEFsaWFzT2JqZWN0LCAmQWxpYXNfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOwotCWl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JaXQtPm9iX2ZyZWVpdCA9IE5VTEw7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIEFsaWFzT2JqZWN0ICppdDsKKyAgICBpZiAoaXRzZWxmID09IE5VTEwpIHJldHVybiBQeU1hY19FcnJvcihyZXNOb3RGb3VuZCk7CisgICAgaXQgPSBQeU9iamVjdF9ORVcoQWxpYXNPYmplY3QsICZBbGlhc19UeXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICBpdC0+b2JfZnJlZWl0ID0gTlVMTDsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiAKIHN0YXRpYyBpbnQgQWxpYXNfQ29udmVydChQeU9iamVjdCAqdiwgQWxpYXNIYW5kbGUgKnBfaXRzZWxmKQogewotCWlmICghQWxpYXNfQ2hlY2sodikpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiQWxpYXMgcmVxdWlyZWQiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCSpwX2l0c2VsZiA9ICgoQWxpYXNPYmplY3QgKil2KS0+b2JfaXRzZWxmOwotCXJldHVybiAxOworICAgIGlmICghQWxpYXNfQ2hlY2sodikpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiQWxpYXMgcmVxdWlyZWQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICpwX2l0c2VsZiA9ICgoQWxpYXNPYmplY3QgKil2KS0+b2JfaXRzZWxmOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgdm9pZCBBbGlhc19kZWFsbG9jKEFsaWFzT2JqZWN0ICpzZWxmKQogewotCWlmIChzZWxmLT5vYl9mcmVlaXQgJiYgc2VsZi0+b2JfaXRzZWxmKQotCXsKLQkJc2VsZi0+b2JfZnJlZWl0KHNlbGYtPm9iX2l0c2VsZik7Ci0JfQotCXNlbGYtPm9iX2l0c2VsZiA9IE5VTEw7Ci0Jc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKKyAgICBpZiAoc2VsZi0+b2JfZnJlZWl0ICYmIHNlbGYtPm9iX2l0c2VsZikKKyAgICB7CisgICAgICAgIHNlbGYtPm9iX2ZyZWVpdChzZWxmLT5vYl9pdHNlbGYpOworICAgIH0KKyAgICBzZWxmLT5vYl9pdHNlbGYgPSBOVUxMOworICAgIHNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKICNpZm5kZWYgX19MUDY0X18KIHN0YXRpYyBQeU9iamVjdCAqQWxpYXNfUmVzb2x2ZUFsaWFzKEFsaWFzT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUZTU3BlYyBmcm9tRmlsZV9fYnVmX187Ci0JRlNTcGVjICpmcm9tRmlsZSA9ICZmcm9tRmlsZV9fYnVmX187Ci0JRlNTcGVjIHRhcmdldDsKLQlCb29sZWFuIHdhc0NoYW5nZWQ7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBteVB5TWFjX0dldE9wdEZTU3BlY1B0ciwgJmZyb21GaWxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFJlc29sdmVBbGlhcyhmcm9tRmlsZSwKLQkgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAmdGFyZ2V0LAotCSAgICAgICAgICAgICAgICAgICAgJndhc0NoYW5nZWQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgRlNTcGVjX05ldywgJnRhcmdldCwKLQkgICAgICAgICAgICAgICAgICAgICB3YXNDaGFuZ2VkKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBGU1NwZWMgZnJvbUZpbGVfX2J1Zl9fOworICAgIEZTU3BlYyAqZnJvbUZpbGUgPSAmZnJvbUZpbGVfX2J1Zl9fOworICAgIEZTU3BlYyB0YXJnZXQ7CisgICAgQm9vbGVhbiB3YXNDaGFuZ2VkOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbXlQeU1hY19HZXRPcHRGU1NwZWNQdHIsICZmcm9tRmlsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBSZXNvbHZlQWxpYXMoZnJvbUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgJnRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICZ3YXNDaGFuZ2VkKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZTU3BlY19OZXcsICZ0YXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgd2FzQ2hhbmdlZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQWxpYXNfR2V0QWxpYXNJbmZvKEFsaWFzT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUFsaWFzSW5mb1R5cGUgaW5kZXg7Ci0JU3RyNjMgdGhlU3RyaW5nOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0QWxpYXNJbmZvKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICBpbmRleCwKLQkgICAgICAgICAgICAgICAgICAgIHRoZVN0cmluZyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkU3RyMjU1LCB0aGVTdHJpbmcpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEFsaWFzSW5mb1R5cGUgaW5kZXg7CisgICAgU3RyNjMgdGhlU3RyaW5nOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0QWxpYXNJbmZvKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoZVN0cmluZyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkU3RyMjU1LCB0aGVTdHJpbmcpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFsaWFzX1Jlc29sdmVBbGlhc1dpdGhNb3VudEZsYWdzKEFsaWFzT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUZTU3BlYyBmcm9tRmlsZV9fYnVmX187Ci0JRlNTcGVjICpmcm9tRmlsZSA9ICZmcm9tRmlsZV9fYnVmX187Ci0JRlNTcGVjIHRhcmdldDsKLQlCb29sZWFuIHdhc0NoYW5nZWQ7Ci0JdW5zaWduZWQgbG9uZyBtb3VudEZsYWdzOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIG15UHlNYWNfR2V0T3B0RlNTcGVjUHRyLCAmZnJvbUZpbGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZtb3VudEZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFJlc29sdmVBbGlhc1dpdGhNb3VudEZsYWdzKGZyb21GaWxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGFyZ2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd2FzQ2hhbmdlZCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW91bnRGbGFncyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZiIiwKLQkgICAgICAgICAgICAgICAgICAgICBGU1NwZWNfTmV3LCAmdGFyZ2V0LAotCSAgICAgICAgICAgICAgICAgICAgIHdhc0NoYW5nZWQpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEZTU3BlYyBmcm9tRmlsZV9fYnVmX187CisgICAgRlNTcGVjICpmcm9tRmlsZSA9ICZmcm9tRmlsZV9fYnVmX187CisgICAgRlNTcGVjIHRhcmdldDsKKyAgICBCb29sZWFuIHdhc0NoYW5nZWQ7CisgICAgdW5zaWduZWQgbG9uZyBtb3VudEZsYWdzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG15UHlNYWNfR2V0T3B0RlNTcGVjUHRyLCAmZnJvbUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtb3VudEZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFJlc29sdmVBbGlhc1dpdGhNb3VudEZsYWdzKGZyb21GaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd2FzQ2hhbmdlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW91bnRGbGFncyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGU1NwZWNfTmV3LCAmdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHdhc0NoYW5nZWQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFsaWFzX0ZvbGxvd0ZpbmRlckFsaWFzKEFsaWFzT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUZTU3BlYyBmcm9tRmlsZV9fYnVmX187Ci0JRlNTcGVjICpmcm9tRmlsZSA9ICZmcm9tRmlsZV9fYnVmX187Ci0JQm9vbGVhbiBsb2dvbjsKLQlGU1NwZWMgdGFyZ2V0OwotCUJvb2xlYW4gd2FzQ2hhbmdlZDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmIiLAotCSAgICAgICAgICAgICAgICAgICAgICBteVB5TWFjX0dldE9wdEZTU3BlY1B0ciwgJmZyb21GaWxlLAotCSAgICAgICAgICAgICAgICAgICAgICAmbG9nb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRm9sbG93RmluZGVyQWxpYXMoZnJvbUZpbGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ29uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmdGFyZ2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmd2FzQ2hhbmdlZCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZiIiwKLQkgICAgICAgICAgICAgICAgICAgICBGU1NwZWNfTmV3LCAmdGFyZ2V0LAotCSAgICAgICAgICAgICAgICAgICAgIHdhc0NoYW5nZWQpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEZTU3BlYyBmcm9tRmlsZV9fYnVmX187CisgICAgRlNTcGVjICpmcm9tRmlsZSA9ICZmcm9tRmlsZV9fYnVmX187CisgICAgQm9vbGVhbiBsb2dvbjsKKyAgICBGU1NwZWMgdGFyZ2V0OworICAgIEJvb2xlYW4gd2FzQ2hhbmdlZDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBteVB5TWFjX0dldE9wdEZTU3BlY1B0ciwgJmZyb21GaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbG9nb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRm9sbG93RmluZGVyQWxpYXMoZnJvbUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ29uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd2FzQ2hhbmdlZCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGU1NwZWNfTmV3LCAmdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHdhc0NoYW5nZWQpOworICAgIHJldHVybiBfcmVzOwogfQogI2VuZGlmIC8qICFfX0xQNjRfXyAqLwogCiBzdGF0aWMgUHlPYmplY3QgKkFsaWFzX0ZTUmVzb2x2ZUFsaWFzV2l0aE1vdW50RmxhZ3MoQWxpYXNPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JRlNSZWYgZnJvbUZpbGVfX2J1Zl9fOwotCUZTUmVmICpmcm9tRmlsZSA9ICZmcm9tRmlsZV9fYnVmX187Ci0JRlNSZWYgdGFyZ2V0OwotCUJvb2xlYW4gd2FzQ2hhbmdlZDsKLQl1bnNpZ25lZCBsb25nIG1vdW50RmxhZ3M7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgbXlQeU1hY19HZXRPcHRGU1JlZlB0ciwgJmZyb21GaWxlLAotCSAgICAgICAgICAgICAgICAgICAgICAmbW91bnRGbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBGU1Jlc29sdmVBbGlhc1dpdGhNb3VudEZsYWdzKGZyb21GaWxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRhcmdldCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd2FzQ2hhbmdlZCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3VudEZsYWdzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmIiLAotCSAgICAgICAgICAgICAgICAgICAgIEZTUmVmX05ldywgJnRhcmdldCwKLQkgICAgICAgICAgICAgICAgICAgICB3YXNDaGFuZ2VkKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBGU1JlZiBmcm9tRmlsZV9fYnVmX187CisgICAgRlNSZWYgKmZyb21GaWxlID0gJmZyb21GaWxlX19idWZfXzsKKyAgICBGU1JlZiB0YXJnZXQ7CisgICAgQm9vbGVhbiB3YXNDaGFuZ2VkOworICAgIHVuc2lnbmVkIGxvbmcgbW91bnRGbGFnczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBteVB5TWFjX0dldE9wdEZTUmVmUHRyLCAmZnJvbUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtb3VudEZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEZTUmVzb2x2ZUFsaWFzV2l0aE1vdW50RmxhZ3MoZnJvbUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3YXNDaGFuZ2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdW50RmxhZ3MpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlNSZWZfTmV3LCAmdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHdhc0NoYW5nZWQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFsaWFzX0ZTUmVzb2x2ZUFsaWFzKEFsaWFzT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUZTUmVmIGZyb21GaWxlX19idWZfXzsKLQlGU1JlZiAqZnJvbUZpbGUgPSAmZnJvbUZpbGVfX2J1Zl9fOwotCUZTUmVmIHRhcmdldDsKLQlCb29sZWFuIHdhc0NoYW5nZWQ7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBteVB5TWFjX0dldE9wdEZTUmVmUHRyLCAmZnJvbUZpbGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRlNSZXNvbHZlQWxpYXMoZnJvbUZpbGUsCi0JICAgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0YXJnZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICZ3YXNDaGFuZ2VkKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmIiLAotCSAgICAgICAgICAgICAgICAgICAgIEZTUmVmX05ldywgJnRhcmdldCwKLQkgICAgICAgICAgICAgICAgICAgICB3YXNDaGFuZ2VkKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBGU1JlZiBmcm9tRmlsZV9fYnVmX187CisgICAgRlNSZWYgKmZyb21GaWxlID0gJmZyb21GaWxlX19idWZfXzsKKyAgICBGU1JlZiB0YXJnZXQ7CisgICAgQm9vbGVhbiB3YXNDaGFuZ2VkOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbXlQeU1hY19HZXRPcHRGU1JlZlB0ciwgJmZyb21GaWxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEZTUmVzb2x2ZUFsaWFzKGZyb21GaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmd2FzQ2hhbmdlZCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGU1JlZl9OZXcsICZ0YXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgd2FzQ2hhbmdlZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQWxpYXNfRlNGb2xsb3dGaW5kZXJBbGlhcyhBbGlhc09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlGU1JlZiBmcm9tRmlsZTsKLQlCb29sZWFuIGxvZ29uOwotCUZTUmVmIHRhcmdldDsKLQlCb29sZWFuIHdhc0NoYW5nZWQ7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZsb2dvbikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBGU0ZvbGxvd0ZpbmRlckFsaWFzKCZmcm9tRmlsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ29uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0YXJnZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJndhc0NoYW5nZWQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mTyZiIiwKLQkgICAgICAgICAgICAgICAgICAgICBGU1JlZl9OZXcsICZmcm9tRmlsZSwKLQkgICAgICAgICAgICAgICAgICAgICBGU1JlZl9OZXcsICZ0YXJnZXQsCi0JICAgICAgICAgICAgICAgICAgICAgd2FzQ2hhbmdlZCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgRlNSZWYgZnJvbUZpbGU7CisgICAgQm9vbGVhbiBsb2dvbjsKKyAgICBGU1JlZiB0YXJnZXQ7CisgICAgQm9vbGVhbiB3YXNDaGFuZ2VkOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbG9nb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRlNGb2xsb3dGaW5kZXJBbGlhcygmZnJvbUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3YXNDaGFuZ2VkKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlNSZWZfTmV3LCAmZnJvbUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlNSZWZfTmV3LCAmdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHdhc0NoYW5nZWQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgQWxpYXNfbWV0aG9kc1tdID0gewogI2lmbmRlZiBfX0xQNjRfXwotCXsiUmVzb2x2ZUFsaWFzIiwgKFB5Q0Z1bmN0aW9uKUFsaWFzX1Jlc29sdmVBbGlhcywgMSwKLQkgUHlEb2NfU1RSKCIoRlNTcGVjIGZyb21GaWxlKSAtPiAoRlNTcGVjIHRhcmdldCwgQm9vbGVhbiB3YXNDaGFuZ2VkKSIpfSwKLQl7IkdldEFsaWFzSW5mbyIsIChQeUNGdW5jdGlvbilBbGlhc19HZXRBbGlhc0luZm8sIDEsCi0JIFB5RG9jX1NUUigiKEFsaWFzSW5mb1R5cGUgaW5kZXgpIC0+IChTdHI2MyB0aGVTdHJpbmcpIil9LAotCXsiUmVzb2x2ZUFsaWFzV2l0aE1vdW50RmxhZ3MiLCAoUHlDRnVuY3Rpb24pQWxpYXNfUmVzb2x2ZUFsaWFzV2l0aE1vdW50RmxhZ3MsIDEsCi0JIFB5RG9jX1NUUigiKEZTU3BlYyBmcm9tRmlsZSwgdW5zaWduZWQgbG9uZyBtb3VudEZsYWdzKSAtPiAoRlNTcGVjIHRhcmdldCwgQm9vbGVhbiB3YXNDaGFuZ2VkKSIpfSwKLQl7IkZvbGxvd0ZpbmRlckFsaWFzIiwgKFB5Q0Z1bmN0aW9uKUFsaWFzX0ZvbGxvd0ZpbmRlckFsaWFzLCAxLAotCSBQeURvY19TVFIoIihGU1NwZWMgZnJvbUZpbGUsIEJvb2xlYW4gbG9nb24pIC0+IChGU1NwZWMgdGFyZ2V0LCBCb29sZWFuIHdhc0NoYW5nZWQpIil9LAorICAgIHsiUmVzb2x2ZUFsaWFzIiwgKFB5Q0Z1bmN0aW9uKUFsaWFzX1Jlc29sdmVBbGlhcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoRlNTcGVjIGZyb21GaWxlKSAtPiAoRlNTcGVjIHRhcmdldCwgQm9vbGVhbiB3YXNDaGFuZ2VkKSIpfSwKKyAgICB7IkdldEFsaWFzSW5mbyIsIChQeUNGdW5jdGlvbilBbGlhc19HZXRBbGlhc0luZm8sIDEsCisgICAgIFB5RG9jX1NUUigiKEFsaWFzSW5mb1R5cGUgaW5kZXgpIC0+IChTdHI2MyB0aGVTdHJpbmcpIil9LAorICAgIHsiUmVzb2x2ZUFsaWFzV2l0aE1vdW50RmxhZ3MiLCAoUHlDRnVuY3Rpb24pQWxpYXNfUmVzb2x2ZUFsaWFzV2l0aE1vdW50RmxhZ3MsIDEsCisgICAgIFB5RG9jX1NUUigiKEZTU3BlYyBmcm9tRmlsZSwgdW5zaWduZWQgbG9uZyBtb3VudEZsYWdzKSAtPiAoRlNTcGVjIHRhcmdldCwgQm9vbGVhbiB3YXNDaGFuZ2VkKSIpfSwKKyAgICB7IkZvbGxvd0ZpbmRlckFsaWFzIiwgKFB5Q0Z1bmN0aW9uKUFsaWFzX0ZvbGxvd0ZpbmRlckFsaWFzLCAxLAorICAgICBQeURvY19TVFIoIihGU1NwZWMgZnJvbUZpbGUsIEJvb2xlYW4gbG9nb24pIC0+IChGU1NwZWMgdGFyZ2V0LCBCb29sZWFuIHdhc0NoYW5nZWQpIil9LAogI2VuZGlmIC8qICFfX0xQNjRfXyAqLwotCXsiRlNSZXNvbHZlQWxpYXNXaXRoTW91bnRGbGFncyIsIChQeUNGdW5jdGlvbilBbGlhc19GU1Jlc29sdmVBbGlhc1dpdGhNb3VudEZsYWdzLCAxLAotCSBQeURvY19TVFIoIihGU1JlZiBmcm9tRmlsZSwgdW5zaWduZWQgbG9uZyBtb3VudEZsYWdzKSAtPiAoRlNSZWYgdGFyZ2V0LCBCb29sZWFuIHdhc0NoYW5nZWQpIil9LAotCXsiRlNSZXNvbHZlQWxpYXMiLCAoUHlDRnVuY3Rpb24pQWxpYXNfRlNSZXNvbHZlQWxpYXMsIDEsCi0JIFB5RG9jX1NUUigiKEZTUmVmIGZyb21GaWxlKSAtPiAoRlNSZWYgdGFyZ2V0LCBCb29sZWFuIHdhc0NoYW5nZWQpIil9LAotCXsiRlNGb2xsb3dGaW5kZXJBbGlhcyIsIChQeUNGdW5jdGlvbilBbGlhc19GU0ZvbGxvd0ZpbmRlckFsaWFzLCAxLAotCSBQeURvY19TVFIoIihCb29sZWFuIGxvZ29uKSAtPiAoRlNSZWYgZnJvbUZpbGUsIEZTUmVmIHRhcmdldCwgQm9vbGVhbiB3YXNDaGFuZ2VkKSIpfSwKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7IkZTUmVzb2x2ZUFsaWFzV2l0aE1vdW50RmxhZ3MiLCAoUHlDRnVuY3Rpb24pQWxpYXNfRlNSZXNvbHZlQWxpYXNXaXRoTW91bnRGbGFncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoRlNSZWYgZnJvbUZpbGUsIHVuc2lnbmVkIGxvbmcgbW91bnRGbGFncykgLT4gKEZTUmVmIHRhcmdldCwgQm9vbGVhbiB3YXNDaGFuZ2VkKSIpfSwKKyAgICB7IkZTUmVzb2x2ZUFsaWFzIiwgKFB5Q0Z1bmN0aW9uKUFsaWFzX0ZTUmVzb2x2ZUFsaWFzLCAxLAorICAgICBQeURvY19TVFIoIihGU1JlZiBmcm9tRmlsZSkgLT4gKEZTUmVmIHRhcmdldCwgQm9vbGVhbiB3YXNDaGFuZ2VkKSIpfSwKKyAgICB7IkZTRm9sbG93RmluZGVyQWxpYXMiLCAoUHlDRnVuY3Rpb24pQWxpYXNfRlNGb2xsb3dGaW5kZXJBbGlhcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQm9vbGVhbiBsb2dvbikgLT4gKEZTUmVmIGZyb21GaWxlLCBGU1JlZiB0YXJnZXQsIEJvb2xlYW4gd2FzQ2hhbmdlZCkiKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKkFsaWFzX2dldF9kYXRhKEFsaWFzT2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQogewotCWludCBzaXplOwotCSAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKnJ2OworICAgIGludCBzaXplOworICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKnJ2OwogCi0JICAgICAgICAgICAgICAgICAgICBzaXplID0gR2V0SGFuZGxlU2l6ZSgoSGFuZGxlKXNlbGYtPm9iX2l0c2VsZik7Ci0JICAgICAgICAgICAgICAgICAgICBITG9jaygoSGFuZGxlKXNlbGYtPm9iX2l0c2VsZik7Ci0JICAgICAgICAgICAgICAgICAgICBydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKCooSGFuZGxlKXNlbGYtPm9iX2l0c2VsZiwgc2l6ZSk7Ci0JICAgICAgICAgICAgICAgICAgICBIVW5sb2NrKChIYW5kbGUpc2VsZi0+b2JfaXRzZWxmKTsKLQkgICAgICAgICAgICAgICAgICAgIHJldHVybiBydjsKLQkgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSBHZXRIYW5kbGVTaXplKChIYW5kbGUpc2VsZi0+b2JfaXRzZWxmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEhMb2NrKChIYW5kbGUpc2VsZi0+b2JfaXRzZWxmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJ2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKihIYW5kbGUpc2VsZi0+b2JfaXRzZWxmLCBzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEhVbmxvY2soKEhhbmRsZSlzZWxmLT5vYl9pdHNlbGYpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJ2OworCiB9CiAKICNkZWZpbmUgQWxpYXNfc2V0X2RhdGEgTlVMTAogCiBzdGF0aWMgUHlHZXRTZXREZWYgQWxpYXNfZ2V0c2V0bGlzdFtdID0gewotCXsiZGF0YSIsIChnZXR0ZXIpQWxpYXNfZ2V0X2RhdGEsIChzZXR0ZXIpQWxpYXNfc2V0X2RhdGEsICJSYXcgZGF0YSBvZiB0aGUgYWxpYXMgb2JqZWN0In0sCi0Je05VTEwsIE5VTEwsIE5VTEwsIE5VTEx9LAorICAgIHsiZGF0YSIsIChnZXR0ZXIpQWxpYXNfZ2V0X2RhdGEsIChzZXR0ZXIpQWxpYXNfc2V0X2RhdGEsICJSYXcgZGF0YSBvZiB0aGUgYWxpYXMgb2JqZWN0In0sCisgICAge05VTEwsIE5VTEwsIE5VTEwsIE5VTEx9LAogfTsKIAogCkBAIC05ODIsOTcgKzk4Miw5NyBAQAogI2RlZmluZSBBbGlhc19oYXNoIE5VTEwKIHN0YXRpYyBpbnQgQWxpYXNfdHBfaW5pdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncywgUHlPYmplY3QgKl9rd2RzKQogewotCUFsaWFzSGFuZGxlIGl0c2VsZiA9IE5VTEw7Ci0JY2hhciAqcmF3ZGF0YSA9IE5VTEw7Ci0JaW50IHJhd2RhdGFsZW4gPSAwOwotCUhhbmRsZSBoOwotCXN0YXRpYyBjaGFyICprd1tdID0geyJpdHNlbGYiLCAicmF3ZGF0YSIsIDB9OworICAgIEFsaWFzSGFuZGxlIGl0c2VsZiA9IE5VTEw7CisgICAgY2hhciAqcmF3ZGF0YSA9IE5VTEw7CisgICAgaW50IHJhd2RhdGFsZW4gPSAwOworICAgIEhhbmRsZSBoOworICAgIHN0YXRpYyBjaGFyICprd1tdID0geyJpdHNlbGYiLCAicmF3ZGF0YSIsIDB9OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAifE8mcyMiLCBrdywgQWxpYXNfQ29udmVydCwgJml0c2VsZiwgJnJhd2RhdGEsICZyYXdkYXRhbGVuKSkKLQlyZXR1cm4gLTE7Ci0JaWYgKGl0c2VsZiAmJiByYXdkYXRhKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIk9ubHkgb25lIG9mIGl0c2VsZiBvciByYXdkYXRhIG1heSBiZSBzcGVjaWZpZWQiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoIWl0c2VsZiAmJiAhcmF3ZGF0YSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJPbmUgb2YgaXRzZWxmIG9yIHJhd2RhdGEgbXVzdCBiZSBzcGVjaWZpZWQiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAocmF3ZGF0YSkKLQl7Ci0JCWlmICgoaCA9IE5ld0hhbmRsZShyYXdkYXRhbGVuKSkgPT0gTlVMTCkKLQkJewotCQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlITG9jayhoKTsKLQkJbWVtY3B5KChjaGFyICopKmgsIHJhd2RhdGEsIHJhd2RhdGFsZW4pOwotCQlIVW5sb2NrKGgpOwotCQkoKEFsaWFzT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSAoQWxpYXNIYW5kbGUpaDsKLQkJcmV0dXJuIDA7Ci0JfQotCSgoQWxpYXNPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlyZXR1cm4gMDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJ8TyZzIyIsIGt3LCBBbGlhc19Db252ZXJ0LCAmaXRzZWxmLCAmcmF3ZGF0YSwgJnJhd2RhdGFsZW4pKQorICAgIHJldHVybiAtMTsKKyAgICBpZiAoaXRzZWxmICYmIHJhd2RhdGEpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiT25seSBvbmUgb2YgaXRzZWxmIG9yIHJhd2RhdGEgbWF5IGJlIHNwZWNpZmllZCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICghaXRzZWxmICYmICFyYXdkYXRhKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIk9uZSBvZiBpdHNlbGYgb3IgcmF3ZGF0YSBtdXN0IGJlIHNwZWNpZmllZCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChyYXdkYXRhKQorICAgIHsKKyAgICAgICAgaWYgKChoID0gTmV3SGFuZGxlKHJhd2RhdGFsZW4pKSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIEhMb2NrKGgpOworICAgICAgICBtZW1jcHkoKGNoYXIgKikqaCwgcmF3ZGF0YSwgcmF3ZGF0YWxlbik7CisgICAgICAgIEhVbmxvY2soaCk7CisgICAgICAgICgoQWxpYXNPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IChBbGlhc0hhbmRsZSloOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgKChBbGlhc09iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIHJldHVybiAwOwogfQogCiAjZGVmaW5lIEFsaWFzX3RwX2FsbG9jIFB5VHlwZV9HZW5lcmljQWxsb2MKIAogc3RhdGljIFB5T2JqZWN0ICpBbGlhc190cF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlQeU9iamVjdCAqc2VsZjsKKyAgICBQeU9iamVjdCAqc2VsZjsKIAotCWlmICgoc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkoKEFsaWFzT2JqZWN0ICopc2VsZiktPm9iX2l0c2VsZiA9IE5VTEw7Ci0JcmV0dXJuIHNlbGY7CisgICAgaWYgKChzZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOworICAgICgoQWxpYXNPYmplY3QgKilzZWxmKS0+b2JfaXRzZWxmID0gTlVMTDsKKyAgICByZXR1cm4gc2VsZjsKIH0KIAogI2RlZmluZSBBbGlhc190cF9mcmVlIFB5T2JqZWN0X0RlbAogCiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgQWxpYXNfVHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKLQkwLCAvKm9iX3NpemUqLwotCSJDYXJib24uRmlsZS5BbGlhcyIsIC8qdHBfbmFtZSovCi0Jc2l6ZW9mKEFsaWFzT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLwotCTAsIC8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcikgQWxpYXNfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KLQkwLCAvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykgQWxpYXNfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpIEFsaWFzX3JlcHIsIC8qdHBfcmVwciovCi0JKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLwotCShQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCi0JKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCi0JKGhhc2hmdW5jKSBBbGlhc19oYXNoLCAvKnRwX2hhc2gqLwotCTAsIC8qdHBfY2FsbCovCi0JMCwgLyp0cF9zdHIqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KLQlQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLwotCTAsIC8qdHBfYXNfYnVmZmVyKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQkwLCAvKnRwX2RvYyovCi0JMCwgLyp0cF90cmF2ZXJzZSovCi0JMCwgLyp0cF9jbGVhciovCi0JMCwgLyp0cF9yaWNoY29tcGFyZSovCi0JMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCi0JMCwgLyp0cF9pdGVyKi8KLQkwLCAvKnRwX2l0ZXJuZXh0Ki8KLQlBbGlhc19tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCi0JMCwgLyp0cF9tZW1iZXJzKi8KLQlBbGlhc19nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCi0JMCwgLyp0cF9iYXNlKi8KLQkwLCAvKnRwX2RpY3QqLwotCTAsIC8qdHBfZGVzY3JfZ2V0Ki8KLQkwLCAvKnRwX2Rlc2NyX3NldCovCi0JMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KLQlBbGlhc190cF9pbml0LCAvKiB0cF9pbml0ICovCi0JQWxpYXNfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCi0JQWxpYXNfdHBfbmV3LCAvKiB0cF9uZXcgKi8KLQlBbGlhc190cF9mcmVlLCAvKiB0cF9mcmVlICovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgLypvYl9zaXplKi8KKyAgICAiQ2FyYm9uLkZpbGUuQWxpYXMiLCAvKnRwX25hbWUqLworICAgIHNpemVvZihBbGlhc09iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpIEFsaWFzX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgMCwgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCisgICAgKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCisgICAgKGNtcGZ1bmMpIEFsaWFzX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCisgICAgKHJlcHJmdW5jKSBBbGlhc19yZXByLCAvKnRwX3JlcHIqLworICAgIChQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIChQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLworICAgIChoYXNoZnVuYykgQWxpYXNfaGFzaCwgLyp0cF9oYXNoKi8KKyAgICAwLCAvKnRwX2NhbGwqLworICAgIDAsIC8qdHBfc3RyKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCisgICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgMCwgLyp0cF9kb2MqLworICAgIDAsIC8qdHBfdHJhdmVyc2UqLworICAgIDAsIC8qdHBfY2xlYXIqLworICAgIDAsIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsIC8qdHBfaXRlciovCisgICAgMCwgLyp0cF9pdGVybmV4dCovCisgICAgQWxpYXNfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLworICAgIDAsIC8qdHBfbWVtYmVycyovCisgICAgQWxpYXNfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLworICAgIDAsIC8qdHBfYmFzZSovCisgICAgMCwgLyp0cF9kaWN0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX2dldCovCisgICAgMCwgLyp0cF9kZXNjcl9zZXQqLworICAgIDAsIC8qdHBfZGljdG9mZnNldCovCisgICAgQWxpYXNfdHBfaW5pdCwgLyogdHBfaW5pdCAqLworICAgIEFsaWFzX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLworICAgIEFsaWFzX3RwX25ldywgLyogdHBfbmV3ICovCisgICAgQWxpYXNfdHBfZnJlZSwgLyogdHBfZnJlZSAqLwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEVuZCBvYmplY3QgdHlwZSBBbGlhcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0xMDg2LDM0NyArMTA4NiwzNDcgQEAKICNkZWZpbmUgRlNTcGVjX0NoZWNrKHgpICgoeCktPm9iX3R5cGUgPT0gJkZTU3BlY19UeXBlIHx8IFB5T2JqZWN0X1R5cGVDaGVjaygoeCksICZGU1NwZWNfVHlwZSkpCiAKIHR5cGVkZWYgc3RydWN0IEZTU3BlY09iamVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCUZTU3BlYyBvYl9pdHNlbGY7CisgICAgUHlPYmplY3RfSEVBRAorICAgIEZTU3BlYyBvYl9pdHNlbGY7CiB9IEZTU3BlY09iamVjdDsKIAogc3RhdGljIFB5T2JqZWN0ICpGU1NwZWNfTmV3KEZTU3BlYyAqaXRzZWxmKQogewotCUZTU3BlY09iamVjdCAqaXQ7Ci0JaWYgKGl0c2VsZiA9PSBOVUxMKSByZXR1cm4gUHlNYWNfRXJyb3IocmVzTm90Rm91bmQpOwotCWl0ID0gUHlPYmplY3RfTkVXKEZTU3BlY09iamVjdCwgJkZTU3BlY19UeXBlKTsKLQlpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JaXQtPm9iX2l0c2VsZiA9ICppdHNlbGY7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIEZTU3BlY09iamVjdCAqaXQ7CisgICAgaWYgKGl0c2VsZiA9PSBOVUxMKSByZXR1cm4gUHlNYWNfRXJyb3IocmVzTm90Rm91bmQpOworICAgIGl0ID0gUHlPYmplY3RfTkVXKEZTU3BlY09iamVjdCwgJkZTU3BlY19UeXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgaXQtPm9iX2l0c2VsZiA9ICppdHNlbGY7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogCiBzdGF0aWMgdm9pZCBGU1NwZWNfZGVhbGxvYyhGU1NwZWNPYmplY3QgKnNlbGYpCiB7Ci0JLyogQ2xlYW51cCBvZiBzZWxmLT5vYl9pdHNlbGYgZ29lcyBoZXJlICovCi0Jc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKKyAgICAvKiBDbGVhbnVwIG9mIHNlbGYtPm9iX2l0c2VsZiBnb2VzIGhlcmUgKi8KKyAgICBzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZTU3BlY19GU3BPcGVuREYoRlNTcGVjT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVNJbnQ4IHBlcm1pc3Npb247Ci0Jc2hvcnQgcmVmTnVtOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcGVybWlzc2lvbikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBGU3BPcGVuREYoJl9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICBwZXJtaXNzaW9uLAotCSAgICAgICAgICAgICAgICAgJnJlZk51bSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgcmVmTnVtKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTSW50OCBwZXJtaXNzaW9uOworICAgIHNob3J0IHJlZk51bTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBlcm1pc3Npb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRlNwT3BlbkRGKCZfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICZyZWZOdW0pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlZk51bSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRlNTcGVjX0ZTcE9wZW5SRihGU1NwZWNPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU0ludDggcGVybWlzc2lvbjsKLQlzaG9ydCByZWZOdW07Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZwZXJtaXNzaW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEZTcE9wZW5SRigmX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgIHBlcm1pc3Npb24sCi0JICAgICAgICAgICAgICAgICAmcmVmTnVtKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICByZWZOdW0pOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFNJbnQ4IHBlcm1pc3Npb247CisgICAgc2hvcnQgcmVmTnVtOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGVybWlzc2lvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBGU3BPcGVuUkYoJl9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICBwZXJtaXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgJnJlZk51bSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVmTnVtKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGU1NwZWNfRlNwQ3JlYXRlKEZTU3BlY09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlPU1R5cGUgY3JlYXRvcjsKLQlPU1R5cGUgZmlsZVR5cGU7Ci0JU2NyaXB0Q29kZSBzY3JpcHRUYWc7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZmaWxlVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNjcmlwdFRhZykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBGU3BDcmVhdGUoJl9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICBjcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgZmlsZVR5cGUsCi0JICAgICAgICAgICAgICAgICBzY3JpcHRUYWcpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIE9TVHlwZSBjcmVhdG9yOworICAgIE9TVHlwZSBmaWxlVHlwZTsKKyAgICBTY3JpcHRDb2RlIHNjcmlwdFRhZzsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmZpbGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2NyaXB0VGFnKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEZTcENyZWF0ZSgmX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgIGNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgICBmaWxlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgIHNjcmlwdFRhZyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRlNTcGVjX0ZTcERpckNyZWF0ZShGU1NwZWNPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU2NyaXB0Q29kZSBzY3JpcHRUYWc7Ci0JbG9uZyBjcmVhdGVkRGlySUQ7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZzY3JpcHRUYWcpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRlNwRGlyQ3JlYXRlKCZfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgc2NyaXB0VGFnLAotCSAgICAgICAgICAgICAgICAgICAgJmNyZWF0ZWREaXJJRCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgY3JlYXRlZERpcklEKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTY3JpcHRDb2RlIHNjcmlwdFRhZzsKKyAgICBsb25nIGNyZWF0ZWREaXJJRDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNjcmlwdFRhZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBGU3BEaXJDcmVhdGUoJl9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRUYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAmY3JlYXRlZERpcklEKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVkRGlySUQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZTU3BlY19GU3BEZWxldGUoRlNTcGVjT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRlNwRGVsZXRlKCZfc2VsZi0+b2JfaXRzZWxmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEZTcERlbGV0ZSgmX3NlbGYtPm9iX2l0c2VsZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRlNTcGVjX0ZTcEdldEZJbmZvKEZTU3BlY09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlGSW5mbyBmbmRySW5mbzsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEZTcEdldEZJbmZvKCZfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAmZm5kckluZm8pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBGSW5mb19OZXcsICZmbmRySW5mbyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgRkluZm8gZm5kckluZm87CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBGU3BHZXRGSW5mbygmX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgJmZuZHJJbmZvKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRkluZm9fTmV3LCAmZm5kckluZm8pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZTU3BlY19GU3BTZXRGSW5mbyhGU1NwZWNPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JRkluZm8gZm5kckluZm87Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBGSW5mb19Db252ZXJ0LCAmZm5kckluZm8pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRlNwU2V0RkluZm8oJl9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICZmbmRySW5mbyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgRkluZm8gZm5kckluZm87CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGSW5mb19Db252ZXJ0LCAmZm5kckluZm8pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRlNwU2V0RkluZm8oJl9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICZmbmRySW5mbyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRlNTcGVjX0ZTcFNldEZMb2NrKEZTU3BlY09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEZTcFNldEZMb2NrKCZfc2VsZi0+b2JfaXRzZWxmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEZTcFNldEZMb2NrKCZfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGU1NwZWNfRlNwUnN0RkxvY2soRlNTcGVjT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRlNwUnN0RkxvY2soJl9zZWxmLT5vYl9pdHNlbGYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRlNwUnN0RkxvY2soJl9zZWxmLT5vYl9pdHNlbGYpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZTU3BlY19GU3BSZW5hbWUoRlNTcGVjT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVN0cjI1NSBuZXdOYW1lOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBuZXdOYW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEZTcFJlbmFtZSgmX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgIG5ld05hbWUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFN0cjI1NSBuZXdOYW1lOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBuZXdOYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEZTcFJlbmFtZSgmX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgIG5ld05hbWUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZTU3BlY19GU3BDYXRNb3ZlKEZTU3BlY09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlGU1NwZWMgZGVzdDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIEZTU3BlY19Db252ZXJ0LCAmZGVzdCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBGU3BDYXRNb3ZlKCZfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICZkZXN0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBGU1NwZWMgZGVzdDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZTU3BlY19Db252ZXJ0LCAmZGVzdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBGU3BDYXRNb3ZlKCZfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICZkZXN0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGU1NwZWNfRlNwRXhjaGFuZ2VGaWxlcyhGU1NwZWNPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JRlNTcGVjIGRlc3Q7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBGU1NwZWNfQ29udmVydCwgJmRlc3QpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRlNwRXhjaGFuZ2VGaWxlcygmX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAmZGVzdCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgRlNTcGVjIGRlc3Q7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGU1NwZWNfQ29udmVydCwgJmRlc3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRlNwRXhjaGFuZ2VGaWxlcygmX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVzdCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRlNTcGVjX0ZTcE1ha2VGU1JlZihGU1NwZWNPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JRlNSZWYgbmV3UmVmOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRlNwTWFrZUZTUmVmKCZfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgJm5ld1JlZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEZTUmVmX05ldywgJm5ld1JlZik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgRlNSZWYgbmV3UmVmOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRlNwTWFrZUZTUmVmKCZfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgJm5ld1JlZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZTUmVmX05ldywgJm5ld1JlZik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRlNTcGVjX05ld0FsaWFzTWluaW1hbChGU1NwZWNPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JQWxpYXNIYW5kbGUgYWxpYXM7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBOZXdBbGlhc01pbmltYWwoJl9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAmYWxpYXMpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBBbGlhc19OZXcsIGFsaWFzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBBbGlhc0hhbmRsZSBhbGlhczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IE5ld0FsaWFzTWluaW1hbCgmX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZhbGlhcyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFsaWFzX05ldywgYWxpYXMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZTU3BlY19Jc0FsaWFzRmlsZShGU1NwZWNPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JQm9vbGVhbiBhbGlhc0ZpbGVGbGFnOwotCUJvb2xlYW4gZm9sZGVyRmxhZzsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IElzQWxpYXNGaWxlKCZfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAmYWxpYXNGaWxlRmxhZywKLQkgICAgICAgICAgICAgICAgICAgJmZvbGRlckZsYWcpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBhbGlhc0ZpbGVGbGFnLAotCSAgICAgICAgICAgICAgICAgICAgIGZvbGRlckZsYWcpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEJvb2xlYW4gYWxpYXNGaWxlRmxhZzsKKyAgICBCb29sZWFuIGZvbGRlckZsYWc7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBJc0FsaWFzRmlsZSgmX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgJmFsaWFzRmlsZUZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICZmb2xkZXJGbGFnKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXNGaWxlRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICBmb2xkZXJGbGFnKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGU1NwZWNfYXNfcGF0aG5hbWUoRlNTcGVjT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAKLQljaGFyIHN0cmJ1ZlsxMDI0XTsKLQlPU0VyciBlcnI7CisgICAgY2hhciBzdHJidWZbMTAyNF07CisgICAgT1NFcnIgZXJyOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JICAgICAgICByZXR1cm4gTlVMTDsKLQllcnIgPSBfUHlNYWNfR2V0RnVsbFBhdGhuYW1lKCZfc2VsZi0+b2JfaXRzZWxmLCBzdHJidWYsIHNpemVvZihzdHJidWYpKTsKLQlpZiAoIGVyciApIHsKLQkgICAgICAgIFB5TWFjX0Vycm9yKGVycik7Ci0JICAgICAgICByZXR1cm4gTlVMTDsKLQl9Ci0JX3JlcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoc3RyYnVmKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZXJyID0gX1B5TWFjX0dldEZ1bGxQYXRobmFtZSgmX3NlbGYtPm9iX2l0c2VsZiwgc3RyYnVmLCBzaXplb2Yoc3RyYnVmKSk7CisgICAgaWYgKCBlcnIgKSB7CisgICAgICAgIFB5TWFjX0Vycm9yKGVycik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBfcmVzID0gUHlTdHJpbmdfRnJvbVN0cmluZyhzdHJidWYpOworICAgIHJldHVybiBfcmVzOwogCiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRlNTcGVjX2FzX3R1cGxlKEZTU3BlY09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JICAgICAgICByZXR1cm4gTlVMTDsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiKGlpcyMpIiwgX3NlbGYtPm9iX2l0c2VsZi52UmVmTnVtLCBfc2VsZi0+b2JfaXRzZWxmLnBhcklELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmX3NlbGYtPm9iX2l0c2VsZi5uYW1lWzFdLCBfc2VsZi0+b2JfaXRzZWxmLm5hbWVbMF0pOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiKGlpcyMpIiwgX3NlbGYtPm9iX2l0c2VsZi52UmVmTnVtLCBfc2VsZi0+b2JfaXRzZWxmLnBhcklELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmX3NlbGYtPm9iX2l0c2VsZi5uYW1lWzFdLCBfc2VsZi0+b2JfaXRzZWxmLm5hbWVbMF0pOworICAgIHJldHVybiBfcmVzOwogCiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBGU1NwZWNfbWV0aG9kc1tdID0gewotCXsiRlNwT3BlbkRGIiwgKFB5Q0Z1bmN0aW9uKUZTU3BlY19GU3BPcGVuREYsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQ4IHBlcm1pc3Npb24pIC0+IChzaG9ydCByZWZOdW0pIil9LAotCXsiRlNwT3BlblJGIiwgKFB5Q0Z1bmN0aW9uKUZTU3BlY19GU3BPcGVuUkYsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQ4IHBlcm1pc3Npb24pIC0+IChzaG9ydCByZWZOdW0pIil9LAotCXsiRlNwQ3JlYXRlIiwgKFB5Q0Z1bmN0aW9uKUZTU3BlY19GU3BDcmVhdGUsIDEsCi0JIFB5RG9jX1NUUigiKE9TVHlwZSBjcmVhdG9yLCBPU1R5cGUgZmlsZVR5cGUsIFNjcmlwdENvZGUgc2NyaXB0VGFnKSAtPiBOb25lIil9LAotCXsiRlNwRGlyQ3JlYXRlIiwgKFB5Q0Z1bmN0aW9uKUZTU3BlY19GU3BEaXJDcmVhdGUsIDEsCi0JIFB5RG9jX1NUUigiKFNjcmlwdENvZGUgc2NyaXB0VGFnKSAtPiAobG9uZyBjcmVhdGVkRGlySUQpIil9LAotCXsiRlNwRGVsZXRlIiwgKFB5Q0Z1bmN0aW9uKUZTU3BlY19GU3BEZWxldGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkZTcEdldEZJbmZvIiwgKFB5Q0Z1bmN0aW9uKUZTU3BlY19GU3BHZXRGSW5mbywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoRkluZm8gZm5kckluZm8pIil9LAotCXsiRlNwU2V0RkluZm8iLCAoUHlDRnVuY3Rpb24pRlNTcGVjX0ZTcFNldEZJbmZvLCAxLAotCSBQeURvY19TVFIoIihGSW5mbyBmbmRySW5mbykgLT4gTm9uZSIpfSwKLQl7IkZTcFNldEZMb2NrIiwgKFB5Q0Z1bmN0aW9uKUZTU3BlY19GU3BTZXRGTG9jaywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiRlNwUnN0RkxvY2siLCAoUHlDRnVuY3Rpb24pRlNTcGVjX0ZTcFJzdEZMb2NrLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJGU3BSZW5hbWUiLCAoUHlDRnVuY3Rpb24pRlNTcGVjX0ZTcFJlbmFtZSwgMSwKLQkgUHlEb2NfU1RSKCIoU3RyMjU1IG5ld05hbWUpIC0+IE5vbmUiKX0sCi0JeyJGU3BDYXRNb3ZlIiwgKFB5Q0Z1bmN0aW9uKUZTU3BlY19GU3BDYXRNb3ZlLCAxLAotCSBQeURvY19TVFIoIihGU1NwZWMgZGVzdCkgLT4gTm9uZSIpfSwKLQl7IkZTcEV4Y2hhbmdlRmlsZXMiLCAoUHlDRnVuY3Rpb24pRlNTcGVjX0ZTcEV4Y2hhbmdlRmlsZXMsIDEsCi0JIFB5RG9jX1NUUigiKEZTU3BlYyBkZXN0KSAtPiBOb25lIil9LAotCXsiRlNwTWFrZUZTUmVmIiwgKFB5Q0Z1bmN0aW9uKUZTU3BlY19GU3BNYWtlRlNSZWYsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEZTUmVmIG5ld1JlZikiKX0sCi0JeyJOZXdBbGlhc01pbmltYWwiLCAoUHlDRnVuY3Rpb24pRlNTcGVjX05ld0FsaWFzTWluaW1hbCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQWxpYXNIYW5kbGUgYWxpYXMpIil9LAotCXsiSXNBbGlhc0ZpbGUiLCAoUHlDRnVuY3Rpb24pRlNTcGVjX0lzQWxpYXNGaWxlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIGFsaWFzRmlsZUZsYWcsIEJvb2xlYW4gZm9sZGVyRmxhZykiKX0sCi0JeyJhc19wYXRobmFtZSIsIChQeUNGdW5jdGlvbilGU1NwZWNfYXNfcGF0aG5hbWUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gc3RyaW5nIil9LAotCXsiYXNfdHVwbGUiLCAoUHlDRnVuY3Rpb24pRlNTcGVjX2FzX3R1cGxlLCAxLAotCSBQeURvY19TVFIoIigpIC0+ICh2UmVmTnVtLCBkaXJJRCwgbmFtZSkiKX0sCi0Je05VTEwsIE5VTEwsIDB9CisgICAgeyJGU3BPcGVuREYiLCAoUHlDRnVuY3Rpb24pRlNTcGVjX0ZTcE9wZW5ERiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDggcGVybWlzc2lvbikgLT4gKHNob3J0IHJlZk51bSkiKX0sCisgICAgeyJGU3BPcGVuUkYiLCAoUHlDRnVuY3Rpb24pRlNTcGVjX0ZTcE9wZW5SRiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDggcGVybWlzc2lvbikgLT4gKHNob3J0IHJlZk51bSkiKX0sCisgICAgeyJGU3BDcmVhdGUiLCAoUHlDRnVuY3Rpb24pRlNTcGVjX0ZTcENyZWF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoT1NUeXBlIGNyZWF0b3IsIE9TVHlwZSBmaWxlVHlwZSwgU2NyaXB0Q29kZSBzY3JpcHRUYWcpIC0+IE5vbmUiKX0sCisgICAgeyJGU3BEaXJDcmVhdGUiLCAoUHlDRnVuY3Rpb24pRlNTcGVjX0ZTcERpckNyZWF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2NyaXB0Q29kZSBzY3JpcHRUYWcpIC0+IChsb25nIGNyZWF0ZWREaXJJRCkiKX0sCisgICAgeyJGU3BEZWxldGUiLCAoUHlDRnVuY3Rpb24pRlNTcGVjX0ZTcERlbGV0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiRlNwR2V0RkluZm8iLCAoUHlDRnVuY3Rpb24pRlNTcGVjX0ZTcEdldEZJbmZvLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChGSW5mbyBmbmRySW5mbykiKX0sCisgICAgeyJGU3BTZXRGSW5mbyIsIChQeUNGdW5jdGlvbilGU1NwZWNfRlNwU2V0RkluZm8sIDEsCisgICAgIFB5RG9jX1NUUigiKEZJbmZvIGZuZHJJbmZvKSAtPiBOb25lIil9LAorICAgIHsiRlNwU2V0RkxvY2siLCAoUHlDRnVuY3Rpb24pRlNTcGVjX0ZTcFNldEZMb2NrLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJGU3BSc3RGTG9jayIsIChQeUNGdW5jdGlvbilGU1NwZWNfRlNwUnN0RkxvY2ssIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkZTcFJlbmFtZSIsIChQeUNGdW5jdGlvbilGU1NwZWNfRlNwUmVuYW1lLCAxLAorICAgICBQeURvY19TVFIoIihTdHIyNTUgbmV3TmFtZSkgLT4gTm9uZSIpfSwKKyAgICB7IkZTcENhdE1vdmUiLCAoUHlDRnVuY3Rpb24pRlNTcGVjX0ZTcENhdE1vdmUsIDEsCisgICAgIFB5RG9jX1NUUigiKEZTU3BlYyBkZXN0KSAtPiBOb25lIil9LAorICAgIHsiRlNwRXhjaGFuZ2VGaWxlcyIsIChQeUNGdW5jdGlvbilGU1NwZWNfRlNwRXhjaGFuZ2VGaWxlcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoRlNTcGVjIGRlc3QpIC0+IE5vbmUiKX0sCisgICAgeyJGU3BNYWtlRlNSZWYiLCAoUHlDRnVuY3Rpb24pRlNTcGVjX0ZTcE1ha2VGU1JlZiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoRlNSZWYgbmV3UmVmKSIpfSwKKyAgICB7Ik5ld0FsaWFzTWluaW1hbCIsIChQeUNGdW5jdGlvbilGU1NwZWNfTmV3QWxpYXNNaW5pbWFsLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChBbGlhc0hhbmRsZSBhbGlhcykiKX0sCisgICAgeyJJc0FsaWFzRmlsZSIsIChQeUNGdW5jdGlvbilGU1NwZWNfSXNBbGlhc0ZpbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gYWxpYXNGaWxlRmxhZywgQm9vbGVhbiBmb2xkZXJGbGFnKSIpfSwKKyAgICB7ImFzX3BhdGhuYW1lIiwgKFB5Q0Z1bmN0aW9uKUZTU3BlY19hc19wYXRobmFtZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBzdHJpbmciKX0sCisgICAgeyJhc190dXBsZSIsIChQeUNGdW5jdGlvbilGU1NwZWNfYXNfdHVwbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKHZSZWZOdW0sIGRpcklELCBuYW1lKSIpfSwKKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqRlNTcGVjX2dldF9kYXRhKEZTU3BlY09iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKikmc2VsZi0+b2JfaXRzZWxmLCBzaXplb2Yoc2VsZi0+b2JfaXRzZWxmKSk7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopJnNlbGYtPm9iX2l0c2VsZiwgc2l6ZW9mKHNlbGYtPm9iX2l0c2VsZikpOwogfQogCiAjZGVmaW5lIEZTU3BlY19zZXRfZGF0YSBOVUxMCiAKIHN0YXRpYyBQeUdldFNldERlZiBGU1NwZWNfZ2V0c2V0bGlzdFtdID0gewotCXsiZGF0YSIsIChnZXR0ZXIpRlNTcGVjX2dldF9kYXRhLCAoc2V0dGVyKUZTU3BlY19zZXRfZGF0YSwgIlJhdyBkYXRhIG9mIHRoZSBGU1NwZWMgb2JqZWN0In0sCi0Je05VTEwsIE5VTEwsIE5VTEwsIE5VTEx9LAorICAgIHsiZGF0YSIsIChnZXR0ZXIpRlNTcGVjX2dldF9kYXRhLCAoc2V0dGVyKUZTU3BlY19zZXRfZGF0YSwgIlJhdyBkYXRhIG9mIHRoZSBGU1NwZWMgb2JqZWN0In0sCisgICAge05VTEwsIE5VTEwsIE5VTEwsIE5VTEx9LAogfTsKIAogCkBAIC0xNDM0LDEwNSArMTQzNCwxMDUgQEAKIAogc3RhdGljIFB5T2JqZWN0ICogRlNTcGVjX3JlcHIoRlNTcGVjT2JqZWN0ICpzZWxmKQogewotCWNoYXIgYnVmWzUxMl07Ci0JUHlPU19zbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJXMoKCVkLCAlbGQsICclLipzJykpIiwKLQkgICAgICAgIHNlbGYtPm9iX3R5cGUtPnRwX25hbWUsCi0JICAgICAgICBzZWxmLT5vYl9pdHNlbGYudlJlZk51bSwKLQkgICAgICAgIHNlbGYtPm9iX2l0c2VsZi5wYXJJRCwKLQkgICAgICAgIHNlbGYtPm9iX2l0c2VsZi5uYW1lWzBdLCBzZWxmLT5vYl9pdHNlbGYubmFtZSsxKTsKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOworICAgIGNoYXIgYnVmWzUxMl07CisgICAgUHlPU19zbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJXMoKCVkLCAlbGQsICclLipzJykpIiwKKyAgICAgICAgc2VsZi0+b2JfdHlwZS0+dHBfbmFtZSwKKyAgICAgICAgc2VsZi0+b2JfaXRzZWxmLnZSZWZOdW0sCisgICAgICAgIHNlbGYtPm9iX2l0c2VsZi5wYXJJRCwKKyAgICAgICAgc2VsZi0+b2JfaXRzZWxmLm5hbWVbMF0sIHNlbGYtPm9iX2l0c2VsZi5uYW1lKzEpOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CiB9CiAKICNkZWZpbmUgRlNTcGVjX2hhc2ggTlVMTAogc3RhdGljIGludCBGU1NwZWNfdHBfaW5pdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncywgUHlPYmplY3QgKl9rd2RzKQogewotCVB5T2JqZWN0ICp2ID0gTlVMTDsKLQljaGFyICpyYXdkYXRhID0gTlVMTDsKLQlpbnQgcmF3ZGF0YWxlbiA9IDA7Ci0Jc3RhdGljIGNoYXIgKmt3W10gPSB7Iml0c2VsZiIsICJyYXdkYXRhIiwgMH07CisgICAgUHlPYmplY3QgKnYgPSBOVUxMOworICAgIGNoYXIgKnJhd2RhdGEgPSBOVUxMOworICAgIGludCByYXdkYXRhbGVuID0gMDsKKyAgICBzdGF0aWMgY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgInJhd2RhdGEiLCAwfTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgInxPcyMiLCBrdywgJnYsICZyYXdkYXRhLCAmcmF3ZGF0YWxlbikpCi0JcmV0dXJuIC0xOwotCWlmICh2ICYmIHJhd2RhdGEpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiT25seSBvbmUgb2YgaXRzZWxmIG9yIHJhd2RhdGEgbWF5IGJlIHNwZWNpZmllZCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmICghdiAmJiAhcmF3ZGF0YSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJPbmUgb2YgaXRzZWxmIG9yIHJhd2RhdGEgbXVzdCBiZSBzcGVjaWZpZWQiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAocmF3ZGF0YSkKLQl7Ci0JCWlmIChyYXdkYXRhbGVuICE9IHNpemVvZihGU1NwZWMpKQotCQl7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiRlNTcGVjIHJhd2RhdGEgaW5jb3JyZWN0IHNpemUiKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQltZW1jcHkoJigoRlNTcGVjT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYsIHJhd2RhdGEsIHJhd2RhdGFsZW4pOwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKFB5TWFjX0dldEZTU3BlYyh2LCAmKChGU1NwZWNPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZikpIHJldHVybiAwOwotCXJldHVybiAtMTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJ8T3MjIiwga3csICZ2LCAmcmF3ZGF0YSwgJnJhd2RhdGFsZW4pKQorICAgIHJldHVybiAtMTsKKyAgICBpZiAodiAmJiByYXdkYXRhKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIk9ubHkgb25lIG9mIGl0c2VsZiBvciByYXdkYXRhIG1heSBiZSBzcGVjaWZpZWQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoIXYgJiYgIXJhd2RhdGEpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiT25lIG9mIGl0c2VsZiBvciByYXdkYXRhIG11c3QgYmUgc3BlY2lmaWVkIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKHJhd2RhdGEpCisgICAgeworICAgICAgICBpZiAocmF3ZGF0YWxlbiAhPSBzaXplb2YoRlNTcGVjKSkKKyAgICAgICAgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkZTU3BlYyByYXdkYXRhIGluY29ycmVjdCBzaXplIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgbWVtY3B5KCYoKEZTU3BlY09iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmLCByYXdkYXRhLCByYXdkYXRhbGVuKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChQeU1hY19HZXRGU1NwZWModiwgJigoRlNTcGVjT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYpKSByZXR1cm4gMDsKKyAgICByZXR1cm4gLTE7CiB9CiAKICNkZWZpbmUgRlNTcGVjX3RwX2FsbG9jIFB5VHlwZV9HZW5lcmljQWxsb2MKIAogc3RhdGljIFB5T2JqZWN0ICpGU1NwZWNfdHBfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKl9hcmdzLCBQeU9iamVjdCAqX2t3ZHMpCiB7Ci0JUHlPYmplY3QgKnNlbGY7CisgICAgUHlPYmplY3QgKnNlbGY7CiAKLQlpZiAoKHNlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JbWVtc2V0KCYoKEZTU3BlY09iamVjdCAqKXNlbGYpLT5vYl9pdHNlbGYsIDAsIHNpemVvZihGU1NwZWMpKTsKLQlyZXR1cm4gc2VsZjsKKyAgICBpZiAoKHNlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgbWVtc2V0KCYoKEZTU3BlY09iamVjdCAqKXNlbGYpLT5vYl9pdHNlbGYsIDAsIHNpemVvZihGU1NwZWMpKTsKKyAgICByZXR1cm4gc2VsZjsKIH0KIAogI2RlZmluZSBGU1NwZWNfdHBfZnJlZSBQeU9iamVjdF9EZWwKIAogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IEZTU3BlY19UeXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQotCTAsIC8qb2Jfc2l6ZSovCi0JIkNhcmJvbi5GaWxlLkZTU3BlYyIsIC8qdHBfbmFtZSovCi0Jc2l6ZW9mKEZTU3BlY09iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KLQkwLCAvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpIEZTU3BlY19kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsIC8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLwotCShjbXBmdW5jKSBGU1NwZWNfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpIEZTU3BlY19yZXByLCAvKnRwX3JlcHIqLwotCShQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KLQkoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLwotCShQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYykgRlNTcGVjX2hhc2gsIC8qdHBfaGFzaCovCi0JMCwgLyp0cF9jYWxsKi8KLQkwLCAvKnRwX3N0ciovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLwotCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCi0JMCwgLyp0cF9hc19idWZmZXIqLwotCVB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCTAsIC8qdHBfZG9jKi8KLQkwLCAvKnRwX3RyYXZlcnNlKi8KLQkwLCAvKnRwX2NsZWFyKi8KLQkwLCAvKnRwX3JpY2hjb21wYXJlKi8KLQkwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLQkwLCAvKnRwX2l0ZXIqLwotCTAsIC8qdHBfaXRlcm5leHQqLwotCUZTU3BlY19tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCi0JMCwgLyp0cF9tZW1iZXJzKi8KLQlGU1NwZWNfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLwotCTAsIC8qdHBfYmFzZSovCi0JMCwgLyp0cF9kaWN0Ki8KLQkwLCAvKnRwX2Rlc2NyX2dldCovCi0JMCwgLyp0cF9kZXNjcl9zZXQqLwotCTAsIC8qdHBfZGljdG9mZnNldCovCi0JRlNTcGVjX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KLQlGU1NwZWNfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCi0JRlNTcGVjX3RwX25ldywgLyogdHBfbmV3ICovCi0JRlNTcGVjX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAvKm9iX3NpemUqLworICAgICJDYXJib24uRmlsZS5GU1NwZWMiLCAvKnRwX25hbWUqLworICAgIHNpemVvZihGU1NwZWNPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKSBGU1NwZWNfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KKyAgICAoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KKyAgICAoY21wZnVuYykgRlNTcGVjX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCisgICAgKHJlcHJmdW5jKSBGU1NwZWNfcmVwciwgLyp0cF9yZXByKi8KKyAgICAoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCisgICAgKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAoaGFzaGZ1bmMpIEZTU3BlY19oYXNoLCAvKnRwX2hhc2gqLworICAgIDAsIC8qdHBfY2FsbCovCisgICAgMCwgLyp0cF9zdHIqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KKyAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLworICAgIDAsIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAvKnRwX2RvYyovCisgICAgMCwgLyp0cF90cmF2ZXJzZSovCisgICAgMCwgLyp0cF9jbGVhciovCisgICAgMCwgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgLyp0cF9pdGVyKi8KKyAgICAwLCAvKnRwX2l0ZXJuZXh0Ki8KKyAgICBGU1NwZWNfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLworICAgIDAsIC8qdHBfbWVtYmVycyovCisgICAgRlNTcGVjX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KKyAgICAwLCAvKnRwX2Jhc2UqLworICAgIDAsIC8qdHBfZGljdCovCisgICAgMCwgLyp0cF9kZXNjcl9nZXQqLworICAgIDAsIC8qdHBfZGVzY3Jfc2V0Ki8KKyAgICAwLCAvKnRwX2RpY3RvZmZzZXQqLworICAgIEZTU3BlY190cF9pbml0LCAvKiB0cF9pbml0ICovCisgICAgRlNTcGVjX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLworICAgIEZTU3BlY190cF9uZXcsIC8qIHRwX25ldyAqLworICAgIEZTU3BlY190cF9mcmVlLCAvKiB0cF9mcmVlICovCiB9OwogCiAjZW5kaWYgLyogIV9fTFA2NF9fICovCkBAIC0xNTQ2LDQ4MyArMTU0Niw0ODMgQEAKICNkZWZpbmUgRlNSZWZfQ2hlY2soeCkgKCh4KS0+b2JfdHlwZSA9PSAmRlNSZWZfVHlwZSB8fCBQeU9iamVjdF9UeXBlQ2hlY2soKHgpLCAmRlNSZWZfVHlwZSkpCiAKIHR5cGVkZWYgc3RydWN0IEZTUmVmT2JqZWN0IHsKLQlQeU9iamVjdF9IRUFECi0JRlNSZWYgb2JfaXRzZWxmOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBGU1JlZiBvYl9pdHNlbGY7CiB9IEZTUmVmT2JqZWN0OwogCiBzdGF0aWMgUHlPYmplY3QgKkZTUmVmX05ldyhGU1JlZiAqaXRzZWxmKQogewotCUZTUmVmT2JqZWN0ICppdDsKLQlpZiAoaXRzZWxmID09IE5VTEwpIHJldHVybiBQeU1hY19FcnJvcihyZXNOb3RGb3VuZCk7Ci0JaXQgPSBQeU9iamVjdF9ORVcoRlNSZWZPYmplY3QsICZGU1JlZl9UeXBlKTsKLQlpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JaXQtPm9iX2l0c2VsZiA9ICppdHNlbGY7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIEZTUmVmT2JqZWN0ICppdDsKKyAgICBpZiAoaXRzZWxmID09IE5VTEwpIHJldHVybiBQeU1hY19FcnJvcihyZXNOb3RGb3VuZCk7CisgICAgaXQgPSBQeU9iamVjdF9ORVcoRlNSZWZPYmplY3QsICZGU1JlZl9UeXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgaXQtPm9iX2l0c2VsZiA9ICppdHNlbGY7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogCiBzdGF0aWMgdm9pZCBGU1JlZl9kZWFsbG9jKEZTUmVmT2JqZWN0ICpzZWxmKQogewotCS8qIENsZWFudXAgb2Ygc2VsZi0+b2JfaXRzZWxmIGdvZXMgaGVyZSAqLwotCXNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CisgICAgLyogQ2xlYW51cCBvZiBzZWxmLT5vYl9pdHNlbGYgZ29lcyBoZXJlICovCisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGU1JlZl9GU01ha2VGU1JlZlVuaWNvZGUoRlNSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JVW5pQ2hhciAqbmFtZUxlbmd0aF9faW5fXzsKLQlVbmlDaGFyQ291bnQgbmFtZUxlbmd0aF9fbGVuX187Ci0JaW50IG5hbWVMZW5ndGhfX2luX2xlbl9fOwotCVRleHRFbmNvZGluZyB0ZXh0RW5jb2RpbmdIaW50OwotCUZTUmVmIG5ld1JlZjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJ1I2wiLAotCSAgICAgICAgICAgICAgICAgICAgICAmbmFtZUxlbmd0aF9faW5fXywgJm5hbWVMZW5ndGhfX2luX2xlbl9fLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGV4dEVuY29kaW5nSGludCkpCi0JCXJldHVybiBOVUxMOwotCW5hbWVMZW5ndGhfX2xlbl9fID0gbmFtZUxlbmd0aF9faW5fbGVuX187Ci0JX2VyciA9IEZTTWFrZUZTUmVmVW5pY29kZSgmX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVMZW5ndGhfX2xlbl9fLCBuYW1lTGVuZ3RoX19pbl9fLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dEVuY29kaW5nSGludCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXdSZWYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBGU1JlZl9OZXcsICZuZXdSZWYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFVuaUNoYXIgKm5hbWVMZW5ndGhfX2luX187CisgICAgVW5pQ2hhckNvdW50IG5hbWVMZW5ndGhfX2xlbl9fOworICAgIGludCBuYW1lTGVuZ3RoX19pbl9sZW5fXzsKKyAgICBUZXh0RW5jb2RpbmcgdGV4dEVuY29kaW5nSGludDsKKyAgICBGU1JlZiBuZXdSZWY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAidSNsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWVMZW5ndGhfX2luX18sICZuYW1lTGVuZ3RoX19pbl9sZW5fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRleHRFbmNvZGluZ0hpbnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBuYW1lTGVuZ3RoX19sZW5fXyA9IG5hbWVMZW5ndGhfX2luX2xlbl9fOworICAgIF9lcnIgPSBGU01ha2VGU1JlZlVuaWNvZGUoJl9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lTGVuZ3RoX19sZW5fXywgbmFtZUxlbmd0aF9faW5fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRFbmNvZGluZ0hpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmV3UmVmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlNSZWZfTmV3LCAmbmV3UmVmKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGU1JlZl9GU0NvbXBhcmVGU1JlZnMoRlNSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JRlNSZWYgcmVmMjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIEZTUmVmX0NvbnZlcnQsICZyZWYyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEZTQ29tcGFyZUZTUmVmcygmX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICZyZWYyKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBGU1JlZiByZWYyOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlNSZWZfQ29udmVydCwgJnJlZjIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRlNDb21wYXJlRlNSZWZzKCZfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZjIpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZTUmVmX0ZTQ3JlYXRlRmlsZVVuaWNvZGUoRlNSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JVW5pQ2hhciAqbmFtZUxlbmd0aF9faW5fXzsKLQlVbmlDaGFyQ291bnQgbmFtZUxlbmd0aF9fbGVuX187Ci0JaW50IG5hbWVMZW5ndGhfX2luX2xlbl9fOwotCUZTQ2F0YWxvZ0luZm9CaXRtYXAgd2hpY2hJbmZvOwotCUZTQ2F0YWxvZ0luZm8gY2F0YWxvZ0luZm87Ci0JRlNSZWYgbmV3UmVmOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFVuaUNoYXIgKm5hbWVMZW5ndGhfX2luX187CisgICAgVW5pQ2hhckNvdW50IG5hbWVMZW5ndGhfX2xlbl9fOworICAgIGludCBuYW1lTGVuZ3RoX19pbl9sZW5fXzsKKyAgICBGU0NhdGFsb2dJbmZvQml0bWFwIHdoaWNoSW5mbzsKKyAgICBGU0NhdGFsb2dJbmZvIGNhdGFsb2dJbmZvOworICAgIEZTUmVmIG5ld1JlZjsKICNpZm5kZWYgX19MUDY0X18KLQlGU1NwZWMgbmV3U3BlYzsKKyAgICBGU1NwZWMgbmV3U3BlYzsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInUjbE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm5hbWVMZW5ndGhfX2luX18sICZuYW1lTGVuZ3RoX19pbl9sZW5fXywKLQkgICAgICAgICAgICAgICAgICAgICAgJndoaWNoSW5mbywKLQkgICAgICAgICAgICAgICAgICAgICAgRlNDYXRhbG9nSW5mb19Db252ZXJ0LCAmY2F0YWxvZ0luZm8pKQotCQlyZXR1cm4gTlVMTDsKLQluYW1lTGVuZ3RoX19sZW5fXyA9IG5hbWVMZW5ndGhfX2luX2xlbl9fOwotCV9lcnIgPSBGU0NyZWF0ZUZpbGVVbmljb2RlKCZfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVMZW5ndGhfX2xlbl9fLCBuYW1lTGVuZ3RoX19pbl9fLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoSW5mbywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2F0YWxvZ0luZm8sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld1JlZiwKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJ1I2xPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lTGVuZ3RoX19pbl9fLCAmbmFtZUxlbmd0aF9faW5fbGVuX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ3aGljaEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZTQ2F0YWxvZ0luZm9fQ29udmVydCwgJmNhdGFsb2dJbmZvKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbmFtZUxlbmd0aF9fbGVuX18gPSBuYW1lTGVuZ3RoX19pbl9sZW5fXzsKKyAgICBfZXJyID0gRlNDcmVhdGVGaWxlVW5pY29kZSgmX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lTGVuZ3RoX19sZW5fXywgbmFtZUxlbmd0aF9faW5fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNhdGFsb2dJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXdSZWYsCiAjaWZuZGVmIF9fTFA2NF9fCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld1NwZWMKLSNlbHNlCS8qIF9fTFA2NF9fICovCi0JCQkJICAgTlVMTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXdTcGVjCisjZWxzZSAgIC8qIF9fTFA2NF9fICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTAogI2VuZGlmIC8qIF9fTFA2NF9fKi8KLQkJCQkgICk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKIAogI2lmbmRlZiBfX0xQNjRfXwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBGU1JlZl9OZXcsICZuZXdSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgRlNTcGVjX05ldywgJm5ld1NwZWMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGU1JlZl9OZXcsICZuZXdSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlNTcGVjX05ldywgJm5ld1NwZWMpOwogI2Vsc2UgLyogX19MUDY0X18gKi8KLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPIiwgRlNSZWZfTmV3LCAmbmV3UmVmLCBQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPIiwgRlNSZWZfTmV3LCAmbmV3UmVmLCBQeV9Ob25lKTsKICNlbmRpZiAvKiBfX0xQNjRfXyAqLwogCi0JcmV0dXJuIF9yZXM7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRlNSZWZfRlNDcmVhdGVEaXJlY3RvcnlVbmljb2RlKEZTUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVVuaUNoYXIgKm5hbWVMZW5ndGhfX2luX187Ci0JVW5pQ2hhckNvdW50IG5hbWVMZW5ndGhfX2xlbl9fOwotCWludCBuYW1lTGVuZ3RoX19pbl9sZW5fXzsKLQlGU0NhdGFsb2dJbmZvQml0bWFwIHdoaWNoSW5mbzsKLQlGU0NhdGFsb2dJbmZvIGNhdGFsb2dJbmZvOwotCUZTUmVmIG5ld1JlZjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBVbmlDaGFyICpuYW1lTGVuZ3RoX19pbl9fOworICAgIFVuaUNoYXJDb3VudCBuYW1lTGVuZ3RoX19sZW5fXzsKKyAgICBpbnQgbmFtZUxlbmd0aF9faW5fbGVuX187CisgICAgRlNDYXRhbG9nSW5mb0JpdG1hcCB3aGljaEluZm87CisgICAgRlNDYXRhbG9nSW5mbyBjYXRhbG9nSW5mbzsKKyAgICBGU1JlZiBuZXdSZWY7CiAjaWZuZGVmIF9fTFA2NF9fCi0JRlNTcGVjIG5ld1NwZWM7CisgICAgRlNTcGVjIG5ld1NwZWM7CiAjZW5kaWYgLyogIV9fTFA2NF9fICovCi0JVUludDMyIG5ld0RpcklEOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInUjbE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm5hbWVMZW5ndGhfX2luX18sICZuYW1lTGVuZ3RoX19pbl9sZW5fXywKLQkgICAgICAgICAgICAgICAgICAgICAgJndoaWNoSW5mbywKLQkgICAgICAgICAgICAgICAgICAgICAgRlNDYXRhbG9nSW5mb19Db252ZXJ0LCAmY2F0YWxvZ0luZm8pKQotCQlyZXR1cm4gTlVMTDsKLQluYW1lTGVuZ3RoX19sZW5fXyA9IG5hbWVMZW5ndGhfX2luX2xlbl9fOwotCV9lcnIgPSBGU0NyZWF0ZURpcmVjdG9yeVVuaWNvZGUoJl9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lTGVuZ3RoX19sZW5fXywgbmFtZUxlbmd0aF9faW5fXywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoSW5mbywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjYXRhbG9nSW5mbywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXdSZWYsCisgICAgVUludDMyIG5ld0RpcklEOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInUjbE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWVMZW5ndGhfX2luX18sICZuYW1lTGVuZ3RoX19pbl9sZW5fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJndoaWNoSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlNDYXRhbG9nSW5mb19Db252ZXJ0LCAmY2F0YWxvZ0luZm8pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBuYW1lTGVuZ3RoX19sZW5fXyA9IG5hbWVMZW5ndGhfX2luX2xlbl9fOworICAgIF9lcnIgPSBGU0NyZWF0ZURpcmVjdG9yeVVuaWNvZGUoJl9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lTGVuZ3RoX19sZW5fXywgbmFtZUxlbmd0aF9faW5fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjYXRhbG9nSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXdSZWYsCiAjaWZuZGVmIF9fTFA2NF9fCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmV3U3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXdTcGVjLAogI2Vsc2UgLyogIV9fTFA2NF9fICovCi0JCQkJCU5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAogI2VuZGlmIC8qICFfX0xQNjRfXyAqLwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld0RpcklEKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld0RpcklEKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwogCiAjaWZuZGVmIF9fTFA2NF9fCi0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICBGU1JlZl9OZXcsICZuZXdSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgRlNTcGVjX05ldywgJm5ld1NwZWMsCi0JICAgICAgICAgICAgICAgICAgICAgbmV3RGlySUQpOwotI2Vsc2UJLyogX19MUDY0X18gKi8KLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPbCIsCi0JICAgICAgICAgICAgICAgICAgICAgRlNSZWZfTmV3LCAmbmV3UmVmLAotCSAgICAgICAgICAgICAgICAgICAgIFB5X05vbmUsCi0JICAgICAgICAgICAgICAgICAgICAgbmV3RGlySUQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlNSZWZfTmV3LCAmbmV3UmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZTU3BlY19OZXcsICZuZXdTcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0RpcklEKTsKKyNlbHNlICAgLyogX19MUDY0X18gKi8KKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlNSZWZfTmV3LCAmbmV3UmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5X05vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RGlySUQpOwogI2VuZGlmIC8qIF9fTFA2NF9fICovCi0JcmV0dXJuIF9yZXM7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRlNSZWZfRlNEZWxldGVPYmplY3QoRlNSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBGU0RlbGV0ZU9iamVjdCgmX3NlbGYtPm9iX2l0c2VsZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBGU0RlbGV0ZU9iamVjdCgmX3NlbGYtPm9iX2l0c2VsZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRlNSZWZfRlNNb3ZlT2JqZWN0KEZTUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUZTUmVmIGRlc3REaXJlY3Rvcnk7Ci0JRlNSZWYgbmV3UmVmOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgRlNSZWZfQ29udmVydCwgJmRlc3REaXJlY3RvcnkpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRlNNb3ZlT2JqZWN0KCZfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgJmRlc3REaXJlY3RvcnksCi0JICAgICAgICAgICAgICAgICAgICAmbmV3UmVmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgRlNSZWZfTmV3LCAmbmV3UmVmKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBGU1JlZiBkZXN0RGlyZWN0b3J5OworICAgIEZTUmVmIG5ld1JlZjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZTUmVmX0NvbnZlcnQsICZkZXN0RGlyZWN0b3J5KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEZTTW92ZU9iamVjdCgmX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICZkZXN0RGlyZWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgJm5ld1JlZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZTUmVmX05ldywgJm5ld1JlZik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRlNSZWZfRlNFeGNoYW5nZU9iamVjdHMoRlNSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JRlNSZWYgZGVzdFJlZjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIEZTUmVmX0NvbnZlcnQsICZkZXN0UmVmKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEZTRXhjaGFuZ2VPYmplY3RzKCZfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmZGVzdFJlZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgRlNSZWYgZGVzdFJlZjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZTUmVmX0NvbnZlcnQsICZkZXN0UmVmKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEZTRXhjaGFuZ2VPYmplY3RzKCZfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVzdFJlZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRlNSZWZfRlNSZW5hbWVVbmljb2RlKEZTUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVVuaUNoYXIgKm5hbWVMZW5ndGhfX2luX187Ci0JVW5pQ2hhckNvdW50IG5hbWVMZW5ndGhfX2xlbl9fOwotCWludCBuYW1lTGVuZ3RoX19pbl9sZW5fXzsKLQlUZXh0RW5jb2RpbmcgdGV4dEVuY29kaW5nSGludDsKLQlGU1JlZiBuZXdSZWY7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAidSNsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm5hbWVMZW5ndGhfX2luX18sICZuYW1lTGVuZ3RoX19pbl9sZW5fXywKLQkgICAgICAgICAgICAgICAgICAgICAgJnRleHRFbmNvZGluZ0hpbnQpKQotCQlyZXR1cm4gTlVMTDsKLQluYW1lTGVuZ3RoX19sZW5fXyA9IG5hbWVMZW5ndGhfX2luX2xlbl9fOwotCV9lcnIgPSBGU1JlbmFtZVVuaWNvZGUoJl9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICBuYW1lTGVuZ3RoX19sZW5fXywgbmFtZUxlbmd0aF9faW5fXywKLQkgICAgICAgICAgICAgICAgICAgICAgIHRleHRFbmNvZGluZ0hpbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAmbmV3UmVmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgRlNSZWZfTmV3LCAmbmV3UmVmKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBVbmlDaGFyICpuYW1lTGVuZ3RoX19pbl9fOworICAgIFVuaUNoYXJDb3VudCBuYW1lTGVuZ3RoX19sZW5fXzsKKyAgICBpbnQgbmFtZUxlbmd0aF9faW5fbGVuX187CisgICAgVGV4dEVuY29kaW5nIHRleHRFbmNvZGluZ0hpbnQ7CisgICAgRlNSZWYgbmV3UmVmOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInUjbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lTGVuZ3RoX19pbl9fLCAmbmFtZUxlbmd0aF9faW5fbGVuX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZXh0RW5jb2RpbmdIaW50KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbmFtZUxlbmd0aF9fbGVuX18gPSBuYW1lTGVuZ3RoX19pbl9sZW5fXzsKKyAgICBfZXJyID0gRlNSZW5hbWVVbmljb2RlKCZfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZUxlbmd0aF9fbGVuX18sIG5hbWVMZW5ndGhfX2luX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0RW5jb2RpbmdIaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld1JlZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZTUmVmX05ldywgJm5ld1JlZik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRlNSZWZfRlNHZXRDYXRhbG9nSW5mbyhGU1JlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlGU0NhdGFsb2dJbmZvQml0bWFwIHdoaWNoSW5mbzsKLQlGU0NhdGFsb2dJbmZvIGNhdGFsb2dJbmZvOwotCUhGU1VuaVN0cjI1NSBvdXROYW1lOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEZTQ2F0YWxvZ0luZm9CaXRtYXAgd2hpY2hJbmZvOworICAgIEZTQ2F0YWxvZ0luZm8gY2F0YWxvZ0luZm87CisgICAgSEZTVW5pU3RyMjU1IG91dE5hbWU7CiAjaWZuZGVmIF9fTFA2NF9fCi0JRlNTcGVjIGZzU3BlYzsKKyAgICBGU1NwZWMgZnNTcGVjOwogI2VuZGlmIC8qICFfX0xQNjRfXyAqLwotCUZTUmVmIHBhcmVudFJlZjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJndoaWNoSW5mbykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBGU0dldENhdGFsb2dJbmZvKCZfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoSW5mbywKLQkgICAgICAgICAgICAgICAgICAgICAgICAmY2F0YWxvZ0luZm8sCi0JICAgICAgICAgICAgICAgICAgICAgICAgJm91dE5hbWUsCisgICAgRlNSZWYgcGFyZW50UmVmOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmd2hpY2hJbmZvKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEZTR2V0Q2F0YWxvZ0luZm8oJl9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2hJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjYXRhbG9nSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0TmFtZSwKICNpZm5kZWYgX19MUDY0X18KLQkgICAgICAgICAgICAgICAgICAgICAgICAmZnNTcGVjLAotI2Vsc2UJLyogX19MUDY0X18gKi8KLQkJCQlOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmc1NwZWMsCisjZWxzZSAgIC8qIF9fTFA2NF9fICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKICNlbmRpZiAvKiBfX0xQNjRfXyAqLwotCSAgICAgICAgICAgICAgICAgICAgICAgICZwYXJlbnRSZWYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcmVudFJlZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKIAogI2lmbmRlZiBfX0xQNjRfXwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgRlNDYXRhbG9nSW5mb19OZXcsICZjYXRhbG9nSW5mbywKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEhGU1VuaVN0cjI1NSwgJm91dE5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgRlNTcGVjX05ldywgJmZzU3BlYywKLQkgICAgICAgICAgICAgICAgICAgICBGU1JlZl9OZXcsICZwYXJlbnRSZWYpOwotI2Vsc2UJLyogX19MUDY0X18gKi8KLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJk9PJiIsCi0JICAgICAgICAgICAgICAgICAgICAgRlNDYXRhbG9nSW5mb19OZXcsICZjYXRhbG9nSW5mbywKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEhGU1VuaVN0cjI1NSwgJm91dE5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgUHlfTm9uZSwKLQkgICAgICAgICAgICAgICAgICAgICBGU1JlZl9OZXcsICZwYXJlbnRSZWYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlNDYXRhbG9nSW5mb19OZXcsICZjYXRhbG9nSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEhGU1VuaVN0cjI1NSwgJm91dE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlNTcGVjX05ldywgJmZzU3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBGU1JlZl9OZXcsICZwYXJlbnRSZWYpOworI2Vsc2UgICAvKiBfX0xQNjRfXyAqLworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mT08mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGU0NhdGFsb2dJbmZvX05ldywgJmNhdGFsb2dJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkSEZTVW5pU3RyMjU1LCAmb3V0TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeV9Ob25lLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZTUmVmX05ldywgJnBhcmVudFJlZik7CiAjZW5kaWYgLyogX19MUDY0X18gKi8KLQlyZXR1cm4gX3JlczsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGU1JlZl9GU1NldENhdGFsb2dJbmZvKEZTUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUZTQ2F0YWxvZ0luZm9CaXRtYXAgd2hpY2hJbmZvOwotCUZTQ2F0YWxvZ0luZm8gY2F0YWxvZ0luZm87Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJndoaWNoSW5mbywKLQkgICAgICAgICAgICAgICAgICAgICAgRlNDYXRhbG9nSW5mb19Db252ZXJ0LCAmY2F0YWxvZ0luZm8pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRlNTZXRDYXRhbG9nSW5mbygmX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICB3aGljaEluZm8sCi0JICAgICAgICAgICAgICAgICAgICAgICAgJmNhdGFsb2dJbmZvKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBGU0NhdGFsb2dJbmZvQml0bWFwIHdoaWNoSW5mbzsKKyAgICBGU0NhdGFsb2dJbmZvIGNhdGFsb2dJbmZvOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ3aGljaEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZTQ2F0YWxvZ0luZm9fQ29udmVydCwgJmNhdGFsb2dJbmZvKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEZTU2V0Q2F0YWxvZ0luZm8oJl9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2hJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjYXRhbG9nSW5mbyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRlNSZWZfRlNDcmVhdGVGb3JrKEZTUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVVuaUNoYXIgKmZvcmtOYW1lTGVuZ3RoX19pbl9fOwotCVVuaUNoYXJDb3VudCBmb3JrTmFtZUxlbmd0aF9fbGVuX187Ci0JaW50IGZvcmtOYW1lTGVuZ3RoX19pbl9sZW5fXzsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJ1IyIsCi0JICAgICAgICAgICAgICAgICAgICAgICZmb3JrTmFtZUxlbmd0aF9faW5fXywgJmZvcmtOYW1lTGVuZ3RoX19pbl9sZW5fXykpCi0JCXJldHVybiBOVUxMOwotCWZvcmtOYW1lTGVuZ3RoX19sZW5fXyA9IGZvcmtOYW1lTGVuZ3RoX19pbl9sZW5fXzsKLQlfZXJyID0gRlNDcmVhdGVGb3JrKCZfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgZm9ya05hbWVMZW5ndGhfX2xlbl9fLCBmb3JrTmFtZUxlbmd0aF9faW5fXyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgVW5pQ2hhciAqZm9ya05hbWVMZW5ndGhfX2luX187CisgICAgVW5pQ2hhckNvdW50IGZvcmtOYW1lTGVuZ3RoX19sZW5fXzsKKyAgICBpbnQgZm9ya05hbWVMZW5ndGhfX2luX2xlbl9fOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInUjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZvcmtOYW1lTGVuZ3RoX19pbl9fLCAmZm9ya05hbWVMZW5ndGhfX2luX2xlbl9fKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZm9ya05hbWVMZW5ndGhfX2xlbl9fID0gZm9ya05hbWVMZW5ndGhfX2luX2xlbl9fOworICAgIF9lcnIgPSBGU0NyZWF0ZUZvcmsoJl9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICBmb3JrTmFtZUxlbmd0aF9fbGVuX18sIGZvcmtOYW1lTGVuZ3RoX19pbl9fKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGU1JlZl9GU0RlbGV0ZUZvcmsoRlNSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JVW5pQ2hhciAqZm9ya05hbWVMZW5ndGhfX2luX187Ci0JVW5pQ2hhckNvdW50IGZvcmtOYW1lTGVuZ3RoX19sZW5fXzsKLQlpbnQgZm9ya05hbWVMZW5ndGhfX2luX2xlbl9fOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInUjIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZvcmtOYW1lTGVuZ3RoX19pbl9fLCAmZm9ya05hbWVMZW5ndGhfX2luX2xlbl9fKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZm9ya05hbWVMZW5ndGhfX2xlbl9fID0gZm9ya05hbWVMZW5ndGhfX2luX2xlbl9fOwotCV9lcnIgPSBGU0RlbGV0ZUZvcmsoJl9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICBmb3JrTmFtZUxlbmd0aF9fbGVuX18sIGZvcmtOYW1lTGVuZ3RoX19pbl9fKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBVbmlDaGFyICpmb3JrTmFtZUxlbmd0aF9faW5fXzsKKyAgICBVbmlDaGFyQ291bnQgZm9ya05hbWVMZW5ndGhfX2xlbl9fOworICAgIGludCBmb3JrTmFtZUxlbmd0aF9faW5fbGVuX187CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAidSMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZm9ya05hbWVMZW5ndGhfX2luX18sICZmb3JrTmFtZUxlbmd0aF9faW5fbGVuX18pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBmb3JrTmFtZUxlbmd0aF9fbGVuX18gPSBmb3JrTmFtZUxlbmd0aF9faW5fbGVuX187CisgICAgX2VyciA9IEZTRGVsZXRlRm9yaygmX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcmtOYW1lTGVuZ3RoX19sZW5fXywgZm9ya05hbWVMZW5ndGhfX2luX18pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZTUmVmX0ZTT3BlbkZvcmsoRlNSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JVW5pQ2hhciAqZm9ya05hbWVMZW5ndGhfX2luX187Ci0JVW5pQ2hhckNvdW50IGZvcmtOYW1lTGVuZ3RoX19sZW5fXzsKLQlpbnQgZm9ya05hbWVMZW5ndGhfX2luX2xlbl9fOwotCVNJbnQ4IHBlcm1pc3Npb25zOwotCUZTSU9SZWZOdW0gZm9ya1JlZk51bTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJ1I2IiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZm9ya05hbWVMZW5ndGhfX2luX18sICZmb3JrTmFtZUxlbmd0aF9faW5fbGVuX18sCi0JICAgICAgICAgICAgICAgICAgICAgICZwZXJtaXNzaW9ucykpCi0JCXJldHVybiBOVUxMOwotCWZvcmtOYW1lTGVuZ3RoX19sZW5fXyA9IGZvcmtOYW1lTGVuZ3RoX19pbl9sZW5fXzsKLQlfZXJyID0gRlNPcGVuRm9yaygmX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICBmb3JrTmFtZUxlbmd0aF9fbGVuX18sIGZvcmtOYW1lTGVuZ3RoX19pbl9fLAotCSAgICAgICAgICAgICAgICAgIHBlcm1pc3Npb25zLAotCSAgICAgICAgICAgICAgICAgICZmb3JrUmVmTnVtKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBmb3JrUmVmTnVtKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBVbmlDaGFyICpmb3JrTmFtZUxlbmd0aF9faW5fXzsKKyAgICBVbmlDaGFyQ291bnQgZm9ya05hbWVMZW5ndGhfX2xlbl9fOworICAgIGludCBmb3JrTmFtZUxlbmd0aF9faW5fbGVuX187CisgICAgU0ludDggcGVybWlzc2lvbnM7CisgICAgRlNJT1JlZk51bSBmb3JrUmVmTnVtOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInUjYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmb3JrTmFtZUxlbmd0aF9faW5fXywgJmZvcmtOYW1lTGVuZ3RoX19pbl9sZW5fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBlcm1pc3Npb25zKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZm9ya05hbWVMZW5ndGhfX2xlbl9fID0gZm9ya05hbWVMZW5ndGhfX2luX2xlbl9fOworICAgIF9lcnIgPSBGU09wZW5Gb3JrKCZfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgIGZvcmtOYW1lTGVuZ3RoX19sZW5fXywgZm9ya05hbWVMZW5ndGhfX2luX18sCisgICAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbnMsCisgICAgICAgICAgICAgICAgICAgICAgJmZvcmtSZWZOdW0pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmtSZWZOdW0pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZTUmVmX0ZOTm90aWZ5KEZTUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUZOTWVzc2FnZSBtZXNzYWdlOwotCU9wdGlvbkJpdHMgZmxhZ3M7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmbWVzc2FnZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEZOTm90aWZ5KCZfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICBtZXNzYWdlLAotCSAgICAgICAgICAgICAgICBmbGFncyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgRk5NZXNzYWdlIG1lc3NhZ2U7CisgICAgT3B0aW9uQml0cyBmbGFnczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRk5Ob3RpZnkoJl9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGU1JlZl9GU05ld0FsaWFzTWluaW1hbChGU1JlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlBbGlhc0hhbmRsZSBpbkFsaWFzOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRlNOZXdBbGlhc01pbmltYWwoJl9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZpbkFsaWFzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQWxpYXNfTmV3LCBpbkFsaWFzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBBbGlhc0hhbmRsZSBpbkFsaWFzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRlNOZXdBbGlhc01pbmltYWwoJl9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkFsaWFzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQWxpYXNfTmV3LCBpbkFsaWFzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGU1JlZl9GU0lzQWxpYXNGaWxlKEZTUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUJvb2xlYW4gYWxpYXNGaWxlRmxhZzsKLQlCb29sZWFuIGZvbGRlckZsYWc7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBGU0lzQWxpYXNGaWxlKCZfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICZhbGlhc0ZpbGVGbGFnLAotCSAgICAgICAgICAgICAgICAgICAgICZmb2xkZXJGbGFnKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgYWxpYXNGaWxlRmxhZywKLQkgICAgICAgICAgICAgICAgICAgICBmb2xkZXJGbGFnKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBCb29sZWFuIGFsaWFzRmlsZUZsYWc7CisgICAgQm9vbGVhbiBmb2xkZXJGbGFnOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRlNJc0FsaWFzRmlsZSgmX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmYWxpYXNGaWxlRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAmZm9sZGVyRmxhZyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzRmlsZUZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgZm9sZGVyRmxhZyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRlNSZWZfRlNSZWZNYWtlUGF0aChGU1JlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogCi0JT1NTdGF0dXMgX2VycjsKKyAgICBPU1N0YXR1cyBfZXJyOwogI2RlZmluZSBNQVhQQVRITkFNRSAxMDI0Ci0JVUludDggcGF0aFtNQVhQQVRITkFNRV07Ci0JVUludDMyIG1heFBhdGhTaXplID0gTUFYUEFUSE5BTUU7CisgICAgVUludDggcGF0aFtNQVhQQVRITkFNRV07CisgICAgVUludDMyIG1heFBhdGhTaXplID0gTUFYUEFUSE5BTUU7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkgICAgICAgIHJldHVybiBOVUxMOwotCV9lcnIgPSBGU1JlZk1ha2VQYXRoKCZfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFBhdGhTaXplKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJzIiwgcGF0aCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBGU1JlZk1ha2VQYXRoKCZfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFBhdGhTaXplKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJzIiwgcGF0aCk7CisgICAgcmV0dXJuIF9yZXM7CiAKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGU1JlZl9hc19wYXRobmFtZShGU1JlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JICAgICAgICByZXR1cm4gTlVMTDsKLQlfcmVzID0gRlNSZWZfRlNSZWZNYWtlUGF0aChfc2VsZiwgX2FyZ3MpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcmVzID0gRlNSZWZfRlNSZWZNYWtlUGF0aChfc2VsZiwgX2FyZ3MpOworICAgIHJldHVybiBfcmVzOwogCiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBGU1JlZl9tZXRob2RzW10gPSB7Ci0JeyJGU01ha2VGU1JlZlVuaWNvZGUiLCAoUHlDRnVuY3Rpb24pRlNSZWZfRlNNYWtlRlNSZWZVbmljb2RlLCAxLAotCSBQeURvY19TVFIoIihCdWZmZXIgbmFtZUxlbmd0aCwgVGV4dEVuY29kaW5nIHRleHRFbmNvZGluZ0hpbnQpIC0+IChGU1JlZiBuZXdSZWYpIil9LAotCXsiRlNDb21wYXJlRlNSZWZzIiwgKFB5Q0Z1bmN0aW9uKUZTUmVmX0ZTQ29tcGFyZUZTUmVmcywgMSwKLQkgUHlEb2NfU1RSKCIoRlNSZWYgcmVmMikgLT4gTm9uZSIpfSwKLQl7IkZTQ3JlYXRlRmlsZVVuaWNvZGUiLCAoUHlDRnVuY3Rpb24pRlNSZWZfRlNDcmVhdGVGaWxlVW5pY29kZSwgMSwKLQkgUHlEb2NfU1RSKCIoQnVmZmVyIG5hbWVMZW5ndGgsIEZTQ2F0YWxvZ0luZm9CaXRtYXAgd2hpY2hJbmZvLCBGU0NhdGFsb2dJbmZvIGNhdGFsb2dJbmZvKSAtPiAoRlNSZWYgbmV3UmVmLCBGU1NwZWMgbmV3U3BlYykiKX0sCi0JeyJGU0NyZWF0ZURpcmVjdG9yeVVuaWNvZGUiLCAoUHlDRnVuY3Rpb24pRlNSZWZfRlNDcmVhdGVEaXJlY3RvcnlVbmljb2RlLCAxLAotCSBQeURvY19TVFIoIihCdWZmZXIgbmFtZUxlbmd0aCwgRlNDYXRhbG9nSW5mb0JpdG1hcCB3aGljaEluZm8sIEZTQ2F0YWxvZ0luZm8gY2F0YWxvZ0luZm8pIC0+IChGU1JlZiBuZXdSZWYsIEZTU3BlYyBuZXdTcGVjLCBVSW50MzIgbmV3RGlySUQpIil9LAotCXsiRlNEZWxldGVPYmplY3QiLCAoUHlDRnVuY3Rpb24pRlNSZWZfRlNEZWxldGVPYmplY3QsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkZTTW92ZU9iamVjdCIsIChQeUNGdW5jdGlvbilGU1JlZl9GU01vdmVPYmplY3QsIDEsCi0JIFB5RG9jX1NUUigiKEZTUmVmIGRlc3REaXJlY3RvcnkpIC0+IChGU1JlZiBuZXdSZWYpIil9LAotCXsiRlNFeGNoYW5nZU9iamVjdHMiLCAoUHlDRnVuY3Rpb24pRlNSZWZfRlNFeGNoYW5nZU9iamVjdHMsIDEsCi0JIFB5RG9jX1NUUigiKEZTUmVmIGRlc3RSZWYpIC0+IE5vbmUiKX0sCi0JeyJGU1JlbmFtZVVuaWNvZGUiLCAoUHlDRnVuY3Rpb24pRlNSZWZfRlNSZW5hbWVVbmljb2RlLCAxLAotCSBQeURvY19TVFIoIihCdWZmZXIgbmFtZUxlbmd0aCwgVGV4dEVuY29kaW5nIHRleHRFbmNvZGluZ0hpbnQpIC0+IChGU1JlZiBuZXdSZWYpIil9LAotCXsiRlNHZXRDYXRhbG9nSW5mbyIsIChQeUNGdW5jdGlvbilGU1JlZl9GU0dldENhdGFsb2dJbmZvLCAxLAotCSBQeURvY19TVFIoIihGU0NhdGFsb2dJbmZvQml0bWFwIHdoaWNoSW5mbykgLT4gKEZTQ2F0YWxvZ0luZm8gY2F0YWxvZ0luZm8sIEhGU1VuaVN0cjI1NSBvdXROYW1lLCBGU1NwZWMgZnNTcGVjLCBGU1JlZiBwYXJlbnRSZWYpIil9LAotCXsiRlNTZXRDYXRhbG9nSW5mbyIsIChQeUNGdW5jdGlvbilGU1JlZl9GU1NldENhdGFsb2dJbmZvLCAxLAotCSBQeURvY19TVFIoIihGU0NhdGFsb2dJbmZvQml0bWFwIHdoaWNoSW5mbywgRlNDYXRhbG9nSW5mbyBjYXRhbG9nSW5mbykgLT4gTm9uZSIpfSwKLQl7IkZTQ3JlYXRlRm9yayIsIChQeUNGdW5jdGlvbilGU1JlZl9GU0NyZWF0ZUZvcmssIDEsCi0JIFB5RG9jX1NUUigiKEJ1ZmZlciBmb3JrTmFtZUxlbmd0aCkgLT4gTm9uZSIpfSwKLQl7IkZTRGVsZXRlRm9yayIsIChQeUNGdW5jdGlvbilGU1JlZl9GU0RlbGV0ZUZvcmssIDEsCi0JIFB5RG9jX1NUUigiKEJ1ZmZlciBmb3JrTmFtZUxlbmd0aCkgLT4gTm9uZSIpfSwKLQl7IkZTT3BlbkZvcmsiLCAoUHlDRnVuY3Rpb24pRlNSZWZfRlNPcGVuRm9yaywgMSwKLQkgUHlEb2NfU1RSKCIoQnVmZmVyIGZvcmtOYW1lTGVuZ3RoLCBTSW50OCBwZXJtaXNzaW9ucykgLT4gKFNJbnQxNiBmb3JrUmVmTnVtKSIpfSwKLQl7IkZOTm90aWZ5IiwgKFB5Q0Z1bmN0aW9uKUZTUmVmX0ZOTm90aWZ5LCAxLAotCSBQeURvY19TVFIoIihGTk1lc3NhZ2UgbWVzc2FnZSwgT3B0aW9uQml0cyBmbGFncykgLT4gTm9uZSIpfSwKLQl7IkZTTmV3QWxpYXNNaW5pbWFsIiwgKFB5Q0Z1bmN0aW9uKUZTUmVmX0ZTTmV3QWxpYXNNaW5pbWFsLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChBbGlhc0hhbmRsZSBpbkFsaWFzKSIpfSwKLQl7IkZTSXNBbGlhc0ZpbGUiLCAoUHlDRnVuY3Rpb24pRlNSZWZfRlNJc0FsaWFzRmlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBhbGlhc0ZpbGVGbGFnLCBCb29sZWFuIGZvbGRlckZsYWcpIil9LAotCXsiRlNSZWZNYWtlUGF0aCIsIChQeUNGdW5jdGlvbilGU1JlZl9GU1JlZk1ha2VQYXRoLCAxLAotCSBQeURvY19TVFIoIigpIC0+IHN0cmluZyIpfSwKLQl7ImFzX3BhdGhuYW1lIiwgKFB5Q0Z1bmN0aW9uKUZTUmVmX2FzX3BhdGhuYW1lLCAxLAotCSBQeURvY19TVFIoIigpIC0+IHN0cmluZyIpfSwKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7IkZTTWFrZUZTUmVmVW5pY29kZSIsIChQeUNGdW5jdGlvbilGU1JlZl9GU01ha2VGU1JlZlVuaWNvZGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEJ1ZmZlciBuYW1lTGVuZ3RoLCBUZXh0RW5jb2RpbmcgdGV4dEVuY29kaW5nSGludCkgLT4gKEZTUmVmIG5ld1JlZikiKX0sCisgICAgeyJGU0NvbXBhcmVGU1JlZnMiLCAoUHlDRnVuY3Rpb24pRlNSZWZfRlNDb21wYXJlRlNSZWZzLCAxLAorICAgICBQeURvY19TVFIoIihGU1JlZiByZWYyKSAtPiBOb25lIil9LAorICAgIHsiRlNDcmVhdGVGaWxlVW5pY29kZSIsIChQeUNGdW5jdGlvbilGU1JlZl9GU0NyZWF0ZUZpbGVVbmljb2RlLCAxLAorICAgICBQeURvY19TVFIoIihCdWZmZXIgbmFtZUxlbmd0aCwgRlNDYXRhbG9nSW5mb0JpdG1hcCB3aGljaEluZm8sIEZTQ2F0YWxvZ0luZm8gY2F0YWxvZ0luZm8pIC0+IChGU1JlZiBuZXdSZWYsIEZTU3BlYyBuZXdTcGVjKSIpfSwKKyAgICB7IkZTQ3JlYXRlRGlyZWN0b3J5VW5pY29kZSIsIChQeUNGdW5jdGlvbilGU1JlZl9GU0NyZWF0ZURpcmVjdG9yeVVuaWNvZGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEJ1ZmZlciBuYW1lTGVuZ3RoLCBGU0NhdGFsb2dJbmZvQml0bWFwIHdoaWNoSW5mbywgRlNDYXRhbG9nSW5mbyBjYXRhbG9nSW5mbykgLT4gKEZTUmVmIG5ld1JlZiwgRlNTcGVjIG5ld1NwZWMsIFVJbnQzMiBuZXdEaXJJRCkiKX0sCisgICAgeyJGU0RlbGV0ZU9iamVjdCIsIChQeUNGdW5jdGlvbilGU1JlZl9GU0RlbGV0ZU9iamVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiRlNNb3ZlT2JqZWN0IiwgKFB5Q0Z1bmN0aW9uKUZTUmVmX0ZTTW92ZU9iamVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRlNSZWYgZGVzdERpcmVjdG9yeSkgLT4gKEZTUmVmIG5ld1JlZikiKX0sCisgICAgeyJGU0V4Y2hhbmdlT2JqZWN0cyIsIChQeUNGdW5jdGlvbilGU1JlZl9GU0V4Y2hhbmdlT2JqZWN0cywgMSwKKyAgICAgUHlEb2NfU1RSKCIoRlNSZWYgZGVzdFJlZikgLT4gTm9uZSIpfSwKKyAgICB7IkZTUmVuYW1lVW5pY29kZSIsIChQeUNGdW5jdGlvbilGU1JlZl9GU1JlbmFtZVVuaWNvZGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEJ1ZmZlciBuYW1lTGVuZ3RoLCBUZXh0RW5jb2RpbmcgdGV4dEVuY29kaW5nSGludCkgLT4gKEZTUmVmIG5ld1JlZikiKX0sCisgICAgeyJGU0dldENhdGFsb2dJbmZvIiwgKFB5Q0Z1bmN0aW9uKUZTUmVmX0ZTR2V0Q2F0YWxvZ0luZm8sIDEsCisgICAgIFB5RG9jX1NUUigiKEZTQ2F0YWxvZ0luZm9CaXRtYXAgd2hpY2hJbmZvKSAtPiAoRlNDYXRhbG9nSW5mbyBjYXRhbG9nSW5mbywgSEZTVW5pU3RyMjU1IG91dE5hbWUsIEZTU3BlYyBmc1NwZWMsIEZTUmVmIHBhcmVudFJlZikiKX0sCisgICAgeyJGU1NldENhdGFsb2dJbmZvIiwgKFB5Q0Z1bmN0aW9uKUZTUmVmX0ZTU2V0Q2F0YWxvZ0luZm8sIDEsCisgICAgIFB5RG9jX1NUUigiKEZTQ2F0YWxvZ0luZm9CaXRtYXAgd2hpY2hJbmZvLCBGU0NhdGFsb2dJbmZvIGNhdGFsb2dJbmZvKSAtPiBOb25lIil9LAorICAgIHsiRlNDcmVhdGVGb3JrIiwgKFB5Q0Z1bmN0aW9uKUZTUmVmX0ZTQ3JlYXRlRm9yaywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQnVmZmVyIGZvcmtOYW1lTGVuZ3RoKSAtPiBOb25lIil9LAorICAgIHsiRlNEZWxldGVGb3JrIiwgKFB5Q0Z1bmN0aW9uKUZTUmVmX0ZTRGVsZXRlRm9yaywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQnVmZmVyIGZvcmtOYW1lTGVuZ3RoKSAtPiBOb25lIil9LAorICAgIHsiRlNPcGVuRm9yayIsIChQeUNGdW5jdGlvbilGU1JlZl9GU09wZW5Gb3JrLCAxLAorICAgICBQeURvY19TVFIoIihCdWZmZXIgZm9ya05hbWVMZW5ndGgsIFNJbnQ4IHBlcm1pc3Npb25zKSAtPiAoU0ludDE2IGZvcmtSZWZOdW0pIil9LAorICAgIHsiRk5Ob3RpZnkiLCAoUHlDRnVuY3Rpb24pRlNSZWZfRk5Ob3RpZnksIDEsCisgICAgIFB5RG9jX1NUUigiKEZOTWVzc2FnZSBtZXNzYWdlLCBPcHRpb25CaXRzIGZsYWdzKSAtPiBOb25lIil9LAorICAgIHsiRlNOZXdBbGlhc01pbmltYWwiLCAoUHlDRnVuY3Rpb24pRlNSZWZfRlNOZXdBbGlhc01pbmltYWwsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEFsaWFzSGFuZGxlIGluQWxpYXMpIil9LAorICAgIHsiRlNJc0FsaWFzRmlsZSIsIChQeUNGdW5jdGlvbilGU1JlZl9GU0lzQWxpYXNGaWxlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIGFsaWFzRmlsZUZsYWcsIEJvb2xlYW4gZm9sZGVyRmxhZykiKX0sCisgICAgeyJGU1JlZk1ha2VQYXRoIiwgKFB5Q0Z1bmN0aW9uKUZTUmVmX0ZTUmVmTWFrZVBhdGgsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gc3RyaW5nIil9LAorICAgIHsiYXNfcGF0aG5hbWUiLCAoUHlDRnVuY3Rpb24pRlNSZWZfYXNfcGF0aG5hbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gc3RyaW5nIil9LAorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogc3RhdGljIFB5T2JqZWN0ICpGU1JlZl9nZXRfZGF0YShGU1JlZk9iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKikmc2VsZi0+b2JfaXRzZWxmLCBzaXplb2Yoc2VsZi0+b2JfaXRzZWxmKSk7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopJnNlbGYtPm9iX2l0c2VsZiwgc2l6ZW9mKHNlbGYtPm9iX2l0c2VsZikpOwogfQogCiAjZGVmaW5lIEZTUmVmX3NldF9kYXRhIE5VTEwKIAogc3RhdGljIFB5R2V0U2V0RGVmIEZTUmVmX2dldHNldGxpc3RbXSA9IHsKLQl7ImRhdGEiLCAoZ2V0dGVyKUZTUmVmX2dldF9kYXRhLCAoc2V0dGVyKUZTUmVmX3NldF9kYXRhLCAiUmF3IGRhdGEgb2YgdGhlIEZTUmVmIG9iamVjdCJ9LAotCXtOVUxMLCBOVUxMLCBOVUxMLCBOVUxMfSwKKyAgICB7ImRhdGEiLCAoZ2V0dGVyKUZTUmVmX2dldF9kYXRhLCAoc2V0dGVyKUZTUmVmX3NldF9kYXRhLCAiUmF3IGRhdGEgb2YgdGhlIEZTUmVmIG9iamVjdCJ9LAorICAgIHtOVUxMLCBOVUxMLCBOVUxMLCBOVUxMfSwKIH07CiAKIApAQCAtMjAzMyw5MyArMjAzMyw5MyBAQAogI2RlZmluZSBGU1JlZl9oYXNoIE5VTEwKIHN0YXRpYyBpbnQgRlNSZWZfdHBfaW5pdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncywgUHlPYmplY3QgKl9rd2RzKQogewotCVB5T2JqZWN0ICp2ID0gTlVMTDsKLQljaGFyICpyYXdkYXRhID0gTlVMTDsKLQlpbnQgcmF3ZGF0YWxlbiA9IDA7Ci0Jc3RhdGljIGNoYXIgKmt3W10gPSB7Iml0c2VsZiIsICJyYXdkYXRhIiwgMH07CisgICAgUHlPYmplY3QgKnYgPSBOVUxMOworICAgIGNoYXIgKnJhd2RhdGEgPSBOVUxMOworICAgIGludCByYXdkYXRhbGVuID0gMDsKKyAgICBzdGF0aWMgY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgInJhd2RhdGEiLCAwfTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgInxPcyMiLCBrdywgJnYsICZyYXdkYXRhLCAmcmF3ZGF0YWxlbikpCi0JcmV0dXJuIC0xOwotCWlmICh2ICYmIHJhd2RhdGEpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiT25seSBvbmUgb2YgaXRzZWxmIG9yIHJhd2RhdGEgbWF5IGJlIHNwZWNpZmllZCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmICghdiAmJiAhcmF3ZGF0YSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJPbmUgb2YgaXRzZWxmIG9yIHJhd2RhdGEgbXVzdCBiZSBzcGVjaWZpZWQiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAocmF3ZGF0YSkKLQl7Ci0JCWlmIChyYXdkYXRhbGVuICE9IHNpemVvZihGU1JlZikpCi0JCXsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJGU1JlZiByYXdkYXRhIGluY29ycmVjdCBzaXplIik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJbWVtY3B5KCYoKEZTUmVmT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYsIHJhd2RhdGEsIHJhd2RhdGFsZW4pOwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKFB5TWFjX0dldEZTUmVmKHYsICYoKEZTUmVmT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYpKSByZXR1cm4gMDsKLQlyZXR1cm4gLTE7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAifE9zIyIsIGt3LCAmdiwgJnJhd2RhdGEsICZyYXdkYXRhbGVuKSkKKyAgICByZXR1cm4gLTE7CisgICAgaWYgKHYgJiYgcmF3ZGF0YSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJPbmx5IG9uZSBvZiBpdHNlbGYgb3IgcmF3ZGF0YSBtYXkgYmUgc3BlY2lmaWVkIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKCF2ICYmICFyYXdkYXRhKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIk9uZSBvZiBpdHNlbGYgb3IgcmF3ZGF0YSBtdXN0IGJlIHNwZWNpZmllZCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChyYXdkYXRhKQorICAgIHsKKyAgICAgICAgaWYgKHJhd2RhdGFsZW4gIT0gc2l6ZW9mKEZTUmVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkZTUmVmIHJhd2RhdGEgaW5jb3JyZWN0IHNpemUiKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBtZW1jcHkoJigoRlNSZWZPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiwgcmF3ZGF0YSwgcmF3ZGF0YWxlbik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoUHlNYWNfR2V0RlNSZWYodiwgJigoRlNSZWZPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZikpIHJldHVybiAwOworICAgIHJldHVybiAtMTsKIH0KIAogI2RlZmluZSBGU1JlZl90cF9hbGxvYyBQeVR5cGVfR2VuZXJpY0FsbG9jCiAKIHN0YXRpYyBQeU9iamVjdCAqRlNSZWZfdHBfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKl9hcmdzLCBQeU9iamVjdCAqX2t3ZHMpCiB7Ci0JUHlPYmplY3QgKnNlbGY7CisgICAgUHlPYmplY3QgKnNlbGY7CiAKLQlpZiAoKHNlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JbWVtc2V0KCYoKEZTUmVmT2JqZWN0ICopc2VsZiktPm9iX2l0c2VsZiwgMCwgc2l6ZW9mKEZTUmVmKSk7Ci0JcmV0dXJuIHNlbGY7CisgICAgaWYgKChzZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIG1lbXNldCgmKChGU1JlZk9iamVjdCAqKXNlbGYpLT5vYl9pdHNlbGYsIDAsIHNpemVvZihGU1JlZikpOworICAgIHJldHVybiBzZWxmOwogfQogCiAjZGVmaW5lIEZTUmVmX3RwX2ZyZWUgUHlPYmplY3RfRGVsCiAKIAogc3RhdGljIFB5VHlwZU9iamVjdCBGU1JlZl9UeXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQotCTAsIC8qb2Jfc2l6ZSovCi0JIkNhcmJvbi5GaWxlLkZTUmVmIiwgLyp0cF9uYW1lKi8KLQlzaXplb2YoRlNSZWZPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCi0JMCwgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKSBGU1JlZl9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsIC8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLwotCShjbXBmdW5jKSBGU1JlZl9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYykgRlNSZWZfcmVwciwgLyp0cF9yZXByKi8KLQkoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCi0JKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpIEZTUmVmX2hhc2gsIC8qdHBfaGFzaCovCi0JMCwgLyp0cF9jYWxsKi8KLQkwLCAvKnRwX3N0ciovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLwotCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCi0JMCwgLyp0cF9hc19idWZmZXIqLwotCVB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCTAsIC8qdHBfZG9jKi8KLQkwLCAvKnRwX3RyYXZlcnNlKi8KLQkwLCAvKnRwX2NsZWFyKi8KLQkwLCAvKnRwX3JpY2hjb21wYXJlKi8KLQkwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLQkwLCAvKnRwX2l0ZXIqLwotCTAsIC8qdHBfaXRlcm5leHQqLwotCUZTUmVmX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KLQkwLCAvKnRwX21lbWJlcnMqLwotCUZTUmVmX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KLQkwLCAvKnRwX2Jhc2UqLwotCTAsIC8qdHBfZGljdCovCi0JMCwgLyp0cF9kZXNjcl9nZXQqLwotCTAsIC8qdHBfZGVzY3Jfc2V0Ki8KLQkwLCAvKnRwX2RpY3RvZmZzZXQqLwotCUZTUmVmX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KLQlGU1JlZl90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KLQlGU1JlZl90cF9uZXcsIC8qIHRwX25ldyAqLwotCUZTUmVmX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAvKm9iX3NpemUqLworICAgICJDYXJib24uRmlsZS5GU1JlZiIsIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKEZTUmVmT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLworICAgIDAsIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcikgRlNSZWZfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KKyAgICAoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KKyAgICAoY21wZnVuYykgRlNSZWZfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpIEZTUmVmX3JlcHIsIC8qdHBfcmVwciovCisgICAgKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLworICAgIChQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKSBGU1JlZl9oYXNoLCAvKnRwX2hhc2gqLworICAgIDAsIC8qdHBfY2FsbCovCisgICAgMCwgLyp0cF9zdHIqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KKyAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLworICAgIDAsIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAvKnRwX2RvYyovCisgICAgMCwgLyp0cF90cmF2ZXJzZSovCisgICAgMCwgLyp0cF9jbGVhciovCisgICAgMCwgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgLyp0cF9pdGVyKi8KKyAgICAwLCAvKnRwX2l0ZXJuZXh0Ki8KKyAgICBGU1JlZl9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCisgICAgMCwgLyp0cF9tZW1iZXJzKi8KKyAgICBGU1JlZl9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCisgICAgMCwgLyp0cF9iYXNlKi8KKyAgICAwLCAvKnRwX2RpY3QqLworICAgIDAsIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICBGU1JlZl90cF9pbml0LCAvKiB0cF9pbml0ICovCisgICAgRlNSZWZfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCisgICAgRlNSZWZfdHBfbmV3LCAvKiB0cF9uZXcgKi8KKyAgICBGU1JlZl90cF9mcmVlLCAvKiB0cF9mcmVlICovCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gRW5kIG9iamVjdCB0eXBlIEZTUmVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTIxMjcsMTEyMyArMjEyNywxMTIzIEBACiAjaWZuZGVmIF9fTFA2NF9fCiBzdGF0aWMgUHlPYmplY3QgKkZpbGVfVW5tb3VudFZvbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlTdHI2MyB2b2xOYW1lOwotCXNob3J0IHZSZWZOdW07Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCB2b2xOYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAmdlJlZk51bSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBVbm1vdW50Vm9sKHZvbE5hbWUsCi0JICAgICAgICAgICAgICAgICAgdlJlZk51bSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU3RyNjMgdm9sTmFtZTsKKyAgICBzaG9ydCB2UmVmTnVtOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgdm9sTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZSZWZOdW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVW5tb3VudFZvbCh2b2xOYW1lLAorICAgICAgICAgICAgICAgICAgICAgIHZSZWZOdW0pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZpbGVfRmx1c2hWb2woUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU3RyNjMgdm9sTmFtZTsKLQlzaG9ydCB2UmVmTnVtOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgdm9sTmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZSZWZOdW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRmx1c2hWb2wodm9sTmFtZSwKLQkgICAgICAgICAgICAgICAgdlJlZk51bSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU3RyNjMgdm9sTmFtZTsKKyAgICBzaG9ydCB2UmVmTnVtOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgdm9sTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZSZWZOdW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRmx1c2hWb2wodm9sTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgdlJlZk51bSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRmlsZV9IU2V0Vm9sKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVN0cjYzIHZvbE5hbWU7Ci0Jc2hvcnQgdlJlZk51bTsKLQlsb25nIGRpcklEOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIHZvbE5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGlySUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gSFNldFZvbCh2b2xOYW1lLAotCSAgICAgICAgICAgICAgIHZSZWZOdW0sCi0JICAgICAgICAgICAgICAgZGlySUQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFN0cjYzIHZvbE5hbWU7CisgICAgc2hvcnQgdlJlZk51bTsKKyAgICBsb25nIGRpcklEOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIHZvbE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGlySUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gSFNldFZvbCh2b2xOYW1lLAorICAgICAgICAgICAgICAgICAgIHZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgZGlySUQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZpbGVfRlNDbG9zZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlzaG9ydCByZWZOdW07Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZWZOdW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRlNDbG9zZShyZWZOdW0pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIHNob3J0IHJlZk51bTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZk51bSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBGU0Nsb3NlKHJlZk51bSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRmlsZV9BbGxvY2F0ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlzaG9ydCByZWZOdW07Ci0JbG9uZyBjb3VudDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJlZk51bSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBbGxvY2F0ZShyZWZOdW0sCi0JICAgICAgICAgICAgICAgICZjb3VudCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgY291bnQpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIHNob3J0IHJlZk51bTsKKyAgICBsb25nIGNvdW50OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVmTnVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFsbG9jYXRlKHJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgJmNvdW50KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRmlsZV9HZXRFT0YoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0Jc2hvcnQgcmVmTnVtOwotCWxvbmcgbG9nRU9GOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVmTnVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldEVPRihyZWZOdW0sCi0JICAgICAgICAgICAgICAmbG9nRU9GKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBsb2dFT0YpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIHNob3J0IHJlZk51bTsKKyAgICBsb25nIGxvZ0VPRjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZk51bSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRFT0YocmVmTnVtLAorICAgICAgICAgICAgICAgICAgJmxvZ0VPRik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgbG9nRU9GKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGaWxlX1NldEVPRihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlzaG9ydCByZWZOdW07Ci0JbG9uZyBsb2dFT0Y7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmbG9nRU9GKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldEVPRihyZWZOdW0sCi0JICAgICAgICAgICAgICBsb2dFT0YpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIHNob3J0IHJlZk51bTsKKyAgICBsb25nIGxvZ0VPRjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZsb2dFT0YpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0RU9GKHJlZk51bSwKKyAgICAgICAgICAgICAgICAgIGxvZ0VPRik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRmlsZV9HZXRGUG9zKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCXNob3J0IHJlZk51bTsKLQlsb25nIGZpbGVQb3M7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZWZOdW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0RlBvcyhyZWZOdW0sCi0JICAgICAgICAgICAgICAgJmZpbGVQb3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIGZpbGVQb3MpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIHNob3J0IHJlZk51bTsKKyAgICBsb25nIGZpbGVQb3M7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWZOdW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0RlBvcyhyZWZOdW0sCisgICAgICAgICAgICAgICAgICAgJmZpbGVQb3MpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVQb3MpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZpbGVfU2V0RlBvcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlzaG9ydCByZWZOdW07Ci0Jc2hvcnQgcG9zTW9kZTsKLQlsb25nIHBvc09mZjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmcG9zTW9kZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnBvc09mZikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRGUG9zKHJlZk51bSwKLQkgICAgICAgICAgICAgICBwb3NNb2RlLAotCSAgICAgICAgICAgICAgIHBvc09mZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgc2hvcnQgcmVmTnVtOworICAgIHNob3J0IHBvc01vZGU7CisgICAgbG9uZyBwb3NPZmY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGhsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBvc01vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwb3NPZmYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0RlBvcyhyZWZOdW0sCisgICAgICAgICAgICAgICAgICAgcG9zTW9kZSwKKyAgICAgICAgICAgICAgICAgICBwb3NPZmYpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZpbGVfR2V0VlJlZk51bShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlzaG9ydCBmaWxlUmVmTnVtOwotCXNob3J0IHZSZWZOdW07Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZmaWxlUmVmTnVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldFZSZWZOdW0oZmlsZVJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAmdlJlZk51bSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgdlJlZk51bSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgc2hvcnQgZmlsZVJlZk51bTsKKyAgICBzaG9ydCB2UmVmTnVtOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlsZVJlZk51bSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRWUmVmTnVtKGZpbGVSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgJnZSZWZOdW0pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHZSZWZOdW0pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZpbGVfSEdldFZvbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlTdHJpbmdQdHIgdm9sTmFtZTsKLQlzaG9ydCB2UmVmTnVtOwotCWxvbmcgZGlySUQ7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsICZ2b2xOYW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEhHZXRWb2wodm9sTmFtZSwKLQkgICAgICAgICAgICAgICAmdlJlZk51bSwKLQkgICAgICAgICAgICAgICAmZGlySUQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImhsIiwKLQkgICAgICAgICAgICAgICAgICAgICB2UmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgIGRpcklEKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTdHJpbmdQdHIgdm9sTmFtZTsKKyAgICBzaG9ydCB2UmVmTnVtOworICAgIGxvbmcgZGlySUQ7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsICZ2b2xOYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEhHZXRWb2wodm9sTmFtZSwKKyAgICAgICAgICAgICAgICAgICAmdlJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAmZGlySUQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImhsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2UmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRpcklEKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGaWxlX0hPcGVuKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCXNob3J0IHZSZWZOdW07Ci0JbG9uZyBkaXJJRDsKLQlTdHIyNTUgZmlsZU5hbWU7Ci0JU0ludDggcGVybWlzc2lvbjsKLQlzaG9ydCByZWZOdW07Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGxPJmIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdlJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRpcklELAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIGZpbGVOYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAmcGVybWlzc2lvbikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBIT3Blbih2UmVmTnVtLAotCSAgICAgICAgICAgICBkaXJJRCwKLQkgICAgICAgICAgICAgZmlsZU5hbWUsCi0JICAgICAgICAgICAgIHBlcm1pc3Npb24sCi0JICAgICAgICAgICAgICZyZWZOdW0pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIHJlZk51bSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgc2hvcnQgdlJlZk51bTsKKyAgICBsb25nIGRpcklEOworICAgIFN0cjI1NSBmaWxlTmFtZTsKKyAgICBTSW50OCBwZXJtaXNzaW9uOworICAgIHNob3J0IHJlZk51bTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobE8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGlySUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgZmlsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwZXJtaXNzaW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEhPcGVuKHZSZWZOdW0sCisgICAgICAgICAgICAgICAgIGRpcklELAorICAgICAgICAgICAgICAgICBmaWxlTmFtZSwKKyAgICAgICAgICAgICAgICAgcGVybWlzc2lvbiwKKyAgICAgICAgICAgICAgICAgJnJlZk51bSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVmTnVtKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGaWxlX0hPcGVuREYoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0Jc2hvcnQgdlJlZk51bTsKLQlsb25nIGRpcklEOwotCVN0cjI1NSBmaWxlTmFtZTsKLQlTSW50OCBwZXJtaXNzaW9uOwotCXNob3J0IHJlZk51bTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobE8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGlySUQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgZmlsZU5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZwZXJtaXNzaW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEhPcGVuREYodlJlZk51bSwKLQkgICAgICAgICAgICAgICBkaXJJRCwKLQkgICAgICAgICAgICAgICBmaWxlTmFtZSwKLQkgICAgICAgICAgICAgICBwZXJtaXNzaW9uLAotCSAgICAgICAgICAgICAgICZyZWZOdW0pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIHJlZk51bSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgc2hvcnQgdlJlZk51bTsKKyAgICBsb25nIGRpcklEOworICAgIFN0cjI1NSBmaWxlTmFtZTsKKyAgICBTSW50OCBwZXJtaXNzaW9uOworICAgIHNob3J0IHJlZk51bTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobE8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGlySUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgZmlsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwZXJtaXNzaW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEhPcGVuREYodlJlZk51bSwKKyAgICAgICAgICAgICAgICAgICBkaXJJRCwKKyAgICAgICAgICAgICAgICAgICBmaWxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICBwZXJtaXNzaW9uLAorICAgICAgICAgICAgICAgICAgICZyZWZOdW0pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlZk51bSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRmlsZV9IT3BlblJGKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCXNob3J0IHZSZWZOdW07Ci0JbG9uZyBkaXJJRDsKLQlTdHIyNTUgZmlsZU5hbWU7Ci0JU0ludDggcGVybWlzc2lvbjsKLQlzaG9ydCByZWZOdW07Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGxPJmIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdlJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRpcklELAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIGZpbGVOYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAmcGVybWlzc2lvbikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBIT3BlblJGKHZSZWZOdW0sCi0JICAgICAgICAgICAgICAgZGlySUQsCi0JICAgICAgICAgICAgICAgZmlsZU5hbWUsCi0JICAgICAgICAgICAgICAgcGVybWlzc2lvbiwKLQkgICAgICAgICAgICAgICAmcmVmTnVtKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICByZWZOdW0pOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIHNob3J0IHZSZWZOdW07CisgICAgbG9uZyBkaXJJRDsKKyAgICBTdHIyNTUgZmlsZU5hbWU7CisgICAgU0ludDggcGVybWlzc2lvbjsKKyAgICBzaG9ydCByZWZOdW07CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGxPJmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdlJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRpcklELAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIGZpbGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGVybWlzc2lvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBIT3BlblJGKHZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgZGlySUQsCisgICAgICAgICAgICAgICAgICAgZmlsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAmcmVmTnVtKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZWZOdW0pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZpbGVfQWxsb2NDb250aWcoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0Jc2hvcnQgcmVmTnVtOwotCWxvbmcgY291bnQ7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZWZOdW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQWxsb2NDb250aWcocmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAmY291bnQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIGNvdW50KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBzaG9ydCByZWZOdW07CisgICAgbG9uZyBjb3VudDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZk51bSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBBbGxvY0NvbnRpZyhyZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICZjb3VudCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZpbGVfSENyZWF0ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlzaG9ydCB2UmVmTnVtOwotCWxvbmcgZGlySUQ7Ci0JU3RyMjU1IGZpbGVOYW1lOwotCU9TVHlwZSBjcmVhdG9yOwotCU9TVHlwZSBmaWxlVHlwZTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobE8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGlySUQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgZmlsZU5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNyZWF0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmZpbGVUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEhDcmVhdGUodlJlZk51bSwKLQkgICAgICAgICAgICAgICBkaXJJRCwKLQkgICAgICAgICAgICAgICBmaWxlTmFtZSwKLQkgICAgICAgICAgICAgICBjcmVhdG9yLAotCSAgICAgICAgICAgICAgIGZpbGVUeXBlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBzaG9ydCB2UmVmTnVtOworICAgIGxvbmcgZGlySUQ7CisgICAgU3RyMjU1IGZpbGVOYW1lOworICAgIE9TVHlwZSBjcmVhdG9yOworICAgIE9TVHlwZSBmaWxlVHlwZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobE8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGlySUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgZmlsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmZpbGVUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEhDcmVhdGUodlJlZk51bSwKKyAgICAgICAgICAgICAgICAgICBkaXJJRCwKKyAgICAgICAgICAgICAgICAgICBmaWxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICBjcmVhdG9yLAorICAgICAgICAgICAgICAgICAgIGZpbGVUeXBlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGaWxlX0RpckNyZWF0ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlzaG9ydCB2UmVmTnVtOwotCWxvbmcgcGFyZW50RGlySUQ7Ci0JU3RyMjU1IGRpcmVjdG9yeU5hbWU7Ci0JbG9uZyBjcmVhdGVkRGlySUQ7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmcGFyZW50RGlySUQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgZGlyZWN0b3J5TmFtZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBEaXJDcmVhdGUodlJlZk51bSwKLQkgICAgICAgICAgICAgICAgIHBhcmVudERpcklELAotCSAgICAgICAgICAgICAgICAgZGlyZWN0b3J5TmFtZSwKLQkgICAgICAgICAgICAgICAgICZjcmVhdGVkRGlySUQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZWREaXJJRCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgc2hvcnQgdlJlZk51bTsKKyAgICBsb25nIHBhcmVudERpcklEOworICAgIFN0cjI1NSBkaXJlY3RvcnlOYW1lOworICAgIGxvbmcgY3JlYXRlZERpcklEOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdlJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcmVudERpcklELAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIGRpcmVjdG9yeU5hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRGlyQ3JlYXRlKHZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICBwYXJlbnREaXJJRCwKKyAgICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yeU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAmY3JlYXRlZERpcklEKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVkRGlySUQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZpbGVfSERlbGV0ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlzaG9ydCB2UmVmTnVtOwotCWxvbmcgZGlySUQ7Ci0JU3RyMjU1IGZpbGVOYW1lOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdlJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRpcklELAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIGZpbGVOYW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEhEZWxldGUodlJlZk51bSwKLQkgICAgICAgICAgICAgICBkaXJJRCwKLQkgICAgICAgICAgICAgICBmaWxlTmFtZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgc2hvcnQgdlJlZk51bTsKKyAgICBsb25nIGRpcklEOworICAgIFN0cjI1NSBmaWxlTmFtZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkaXJJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBmaWxlTmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBIRGVsZXRlKHZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgZGlySUQsCisgICAgICAgICAgICAgICAgICAgZmlsZU5hbWUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZpbGVfSEdldEZJbmZvKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCXNob3J0IHZSZWZOdW07Ci0JbG9uZyBkaXJJRDsKLQlTdHIyNTUgZmlsZU5hbWU7Ci0JRkluZm8gZm5kckluZm87Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGlySUQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgZmlsZU5hbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gSEdldEZJbmZvKHZSZWZOdW0sCi0JICAgICAgICAgICAgICAgICBkaXJJRCwKLQkgICAgICAgICAgICAgICAgIGZpbGVOYW1lLAotCSAgICAgICAgICAgICAgICAgJmZuZHJJbmZvKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgRkluZm9fTmV3LCAmZm5kckluZm8pOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIHNob3J0IHZSZWZOdW07CisgICAgbG9uZyBkaXJJRDsKKyAgICBTdHIyNTUgZmlsZU5hbWU7CisgICAgRkluZm8gZm5kckluZm87CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGlySUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgZmlsZU5hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gSEdldEZJbmZvKHZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICBkaXJJRCwKKyAgICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgJmZuZHJJbmZvKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRkluZm9fTmV3LCAmZm5kckluZm8pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZpbGVfSFNldEZJbmZvKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCXNob3J0IHZSZWZOdW07Ci0JbG9uZyBkaXJJRDsKLQlTdHIyNTUgZmlsZU5hbWU7Ci0JRkluZm8gZm5kckluZm87Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGxPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICZkaXJJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBmaWxlTmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgRkluZm9fQ29udmVydCwgJmZuZHJJbmZvKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEhTZXRGSW5mbyh2UmVmTnVtLAotCSAgICAgICAgICAgICAgICAgZGlySUQsCi0JICAgICAgICAgICAgICAgICBmaWxlTmFtZSwKLQkgICAgICAgICAgICAgICAgICZmbmRySW5mbyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgc2hvcnQgdlJlZk51bTsKKyAgICBsb25nIGRpcklEOworICAgIFN0cjI1NSBmaWxlTmFtZTsKKyAgICBGSW5mbyBmbmRySW5mbzsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobE8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdlJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRpcklELAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIGZpbGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGSW5mb19Db252ZXJ0LCAmZm5kckluZm8pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gSFNldEZJbmZvKHZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICBkaXJJRCwKKyAgICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgJmZuZHJJbmZvKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGaWxlX0hTZXRGTG9jayhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlzaG9ydCB2UmVmTnVtOwotCWxvbmcgZGlySUQ7Ci0JU3RyMjU1IGZpbGVOYW1lOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdlJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRpcklELAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIGZpbGVOYW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEhTZXRGTG9jayh2UmVmTnVtLAotCSAgICAgICAgICAgICAgICAgZGlySUQsCi0JICAgICAgICAgICAgICAgICBmaWxlTmFtZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgc2hvcnQgdlJlZk51bTsKKyAgICBsb25nIGRpcklEOworICAgIFN0cjI1NSBmaWxlTmFtZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkaXJJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBmaWxlTmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBIU2V0RkxvY2sodlJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgIGRpcklELAorICAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZpbGVfSFJzdEZMb2NrKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCXNob3J0IHZSZWZOdW07Ci0JbG9uZyBkaXJJRDsKLQlTdHIyNTUgZmlsZU5hbWU7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGlySUQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgZmlsZU5hbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gSFJzdEZMb2NrKHZSZWZOdW0sCi0JICAgICAgICAgICAgICAgICBkaXJJRCwKLQkgICAgICAgICAgICAgICAgIGZpbGVOYW1lKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBzaG9ydCB2UmVmTnVtOworICAgIGxvbmcgZGlySUQ7CisgICAgU3RyMjU1IGZpbGVOYW1lOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdlJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRpcklELAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIGZpbGVOYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEhSc3RGTG9jayh2UmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgZGlySUQsCisgICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRmlsZV9IUmVuYW1lKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCXNob3J0IHZSZWZOdW07Ci0JbG9uZyBkaXJJRDsKLQlTdHIyNTUgb2xkTmFtZTsKLQlTdHIyNTUgbmV3TmFtZTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobE8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdlJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRpcklELAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIG9sZE5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgbmV3TmFtZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBIUmVuYW1lKHZSZWZOdW0sCi0JICAgICAgICAgICAgICAgZGlySUQsCi0JICAgICAgICAgICAgICAgb2xkTmFtZSwKLQkgICAgICAgICAgICAgICBuZXdOYW1lKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBzaG9ydCB2UmVmTnVtOworICAgIGxvbmcgZGlySUQ7CisgICAgU3RyMjU1IG9sZE5hbWU7CisgICAgU3RyMjU1IG5ld05hbWU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGxPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkaXJJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBvbGROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIG5ld05hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gSFJlbmFtZSh2UmVmTnVtLAorICAgICAgICAgICAgICAgICAgIGRpcklELAorICAgICAgICAgICAgICAgICAgIG9sZE5hbWUsCisgICAgICAgICAgICAgICAgICAgbmV3TmFtZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRmlsZV9DYXRNb3ZlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCXNob3J0IHZSZWZOdW07Ci0JbG9uZyBkaXJJRDsKLQlTdHIyNTUgb2xkTmFtZTsKLQlsb25nIG5ld0RpcklEOwotCVN0cjI1NSBuZXdOYW1lOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsTyZsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdlJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRpcklELAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIG9sZE5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZuZXdEaXJJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBuZXdOYW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENhdE1vdmUodlJlZk51bSwKLQkgICAgICAgICAgICAgICBkaXJJRCwKLQkgICAgICAgICAgICAgICBvbGROYW1lLAotCSAgICAgICAgICAgICAgIG5ld0RpcklELAotCSAgICAgICAgICAgICAgIG5ld05hbWUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIHNob3J0IHZSZWZOdW07CisgICAgbG9uZyBkaXJJRDsKKyAgICBTdHIyNTUgb2xkTmFtZTsKKyAgICBsb25nIG5ld0RpcklEOworICAgIFN0cjI1NSBuZXdOYW1lOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsTyZsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdlJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRpcklELAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIG9sZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXdEaXJJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBuZXdOYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENhdE1vdmUodlJlZk51bSwKKyAgICAgICAgICAgICAgICAgICBkaXJJRCwKKyAgICAgICAgICAgICAgICAgICBvbGROYW1lLAorICAgICAgICAgICAgICAgICAgIG5ld0RpcklELAorICAgICAgICAgICAgICAgICAgIG5ld05hbWUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZpbGVfRlNNYWtlRlNTcGVjKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCXNob3J0IHZSZWZOdW07Ci0JbG9uZyBkaXJJRDsKLQlTdHIyNTUgZmlsZU5hbWU7Ci0JRlNTcGVjIHNwZWM7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGlySUQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgZmlsZU5hbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRlNNYWtlRlNTcGVjKHZSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICBkaXJJRCwKLQkgICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lLAotCSAgICAgICAgICAgICAgICAgICAgJnNwZWMpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBGU1NwZWNfTmV3LCAmc3BlYyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgc2hvcnQgdlJlZk51bTsKKyAgICBsb25nIGRpcklEOworICAgIFN0cjI1NSBmaWxlTmFtZTsKKyAgICBGU1NwZWMgc3BlYzsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkaXJJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBmaWxlTmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBGU01ha2VGU1NwZWModlJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpcklELAorICAgICAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAmc3BlYyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZTU3BlY19OZXcsICZzcGVjKTsKKyAgICByZXR1cm4gX3JlczsKIH0KICNlbmRpZiAvKiAhX19MUDY0X18gKi8KIAogc3RhdGljIFB5T2JqZWN0ICpGaWxlX0ZTR2V0Rm9ya1Bvc2l0aW9uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVNJbnQxNiBmb3JrUmVmTnVtOwotCVNJbnQ2NCBwb3NpdGlvbjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZvcmtSZWZOdW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRlNHZXRGb3JrUG9zaXRpb24oZm9ya1JlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJnBvc2l0aW9uKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJMIiwKLQkgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU0ludDE2IGZvcmtSZWZOdW07CisgICAgU0ludDY0IHBvc2l0aW9uOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZm9ya1JlZk51bSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBGU0dldEZvcmtQb3NpdGlvbihmb3JrUmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcG9zaXRpb24pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIkwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGaWxlX0ZTU2V0Rm9ya1Bvc2l0aW9uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVNJbnQxNiBmb3JrUmVmTnVtOwotCVVJbnQxNiBwb3NpdGlvbk1vZGU7Ci0JU0ludDY0IHBvc2l0aW9uT2Zmc2V0OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhITCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZmb3JrUmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmcG9zaXRpb25Nb2RlLAotCSAgICAgICAgICAgICAgICAgICAgICAmcG9zaXRpb25PZmZzZXQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRlNTZXRGb3JrUG9zaXRpb24oZm9ya1JlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25Nb2RlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbk9mZnNldCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU0ludDE2IGZvcmtSZWZOdW07CisgICAgVUludDE2IHBvc2l0aW9uTW9kZTsKKyAgICBTSW50NjQgcG9zaXRpb25PZmZzZXQ7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaEhMIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZvcmtSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwb3NpdGlvbk1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwb3NpdGlvbk9mZnNldCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBGU1NldEZvcmtQb3NpdGlvbihmb3JrUmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbk1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uT2Zmc2V0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGaWxlX0ZTR2V0Rm9ya1NpemUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU0ludDE2IGZvcmtSZWZOdW07Ci0JU0ludDY0IGZvcmtTaXplOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZm9ya1JlZk51bSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBGU0dldEZvcmtTaXplKGZvcmtSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgJmZvcmtTaXplKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJMIiwKLQkgICAgICAgICAgICAgICAgICAgICBmb3JrU2l6ZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU0ludDE2IGZvcmtSZWZOdW07CisgICAgU0ludDY0IGZvcmtTaXplOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZm9ya1JlZk51bSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBGU0dldEZvcmtTaXplKGZvcmtSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgJmZvcmtTaXplKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJMIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmb3JrU2l6ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRmlsZV9GU1NldEZvcmtTaXplKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVNJbnQxNiBmb3JrUmVmTnVtOwotCVVJbnQxNiBwb3NpdGlvbk1vZGU7Ci0JU0ludDY0IHBvc2l0aW9uT2Zmc2V0OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhITCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZmb3JrUmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmcG9zaXRpb25Nb2RlLAotCSAgICAgICAgICAgICAgICAgICAgICAmcG9zaXRpb25PZmZzZXQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRlNTZXRGb3JrU2l6ZShmb3JrUmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uTW9kZSwKLQkgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbk9mZnNldCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU0ludDE2IGZvcmtSZWZOdW07CisgICAgVUludDE2IHBvc2l0aW9uTW9kZTsKKyAgICBTSW50NjQgcG9zaXRpb25PZmZzZXQ7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaEhMIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZvcmtSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwb3NpdGlvbk1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwb3NpdGlvbk9mZnNldCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBGU1NldEZvcmtTaXplKGZvcmtSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25Nb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uT2Zmc2V0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGaWxlX0ZTQWxsb2NhdGVGb3JrKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVNJbnQxNiBmb3JrUmVmTnVtOwotCUZTQWxsb2NhdGlvbkZsYWdzIGZsYWdzOwotCVVJbnQxNiBwb3NpdGlvbk1vZGU7Ci0JU0ludDY0IHBvc2l0aW9uT2Zmc2V0OwotCVVJbnQ2NCByZXF1ZXN0Q291bnQ7Ci0JVUludDY0IGFjdHVhbENvdW50OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhISExMIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZvcmtSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgJnBvc2l0aW9uTW9kZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnBvc2l0aW9uT2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVxdWVzdENvdW50KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEZTQWxsb2NhdGVGb3JrKGZvcmtSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbk1vZGUsCi0JICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uT2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0Q291bnQsCi0JICAgICAgICAgICAgICAgICAgICAgICZhY3R1YWxDb3VudCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTCIsCi0JICAgICAgICAgICAgICAgICAgICAgYWN0dWFsQ291bnQpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFNJbnQxNiBmb3JrUmVmTnVtOworICAgIEZTQWxsb2NhdGlvbkZsYWdzIGZsYWdzOworICAgIFVJbnQxNiBwb3NpdGlvbk1vZGU7CisgICAgU0ludDY0IHBvc2l0aW9uT2Zmc2V0OworICAgIFVJbnQ2NCByZXF1ZXN0Q291bnQ7CisgICAgVUludDY0IGFjdHVhbENvdW50OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhISExMIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZvcmtSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBvc2l0aW9uTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBvc2l0aW9uT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVxdWVzdENvdW50KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEZTQWxsb2NhdGVGb3JrKGZvcmtSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbk1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhY3R1YWxDb3VudCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsQ291bnQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZpbGVfRlNGbHVzaEZvcmsoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU0ludDE2IGZvcmtSZWZOdW07Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZmb3JrUmVmTnVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEZTRmx1c2hGb3JrKGZvcmtSZWZOdW0pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFNJbnQxNiBmb3JrUmVmTnVtOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZm9ya1JlZk51bSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBGU0ZsdXNoRm9yayhmb3JrUmVmTnVtKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGaWxlX0ZTQ2xvc2VGb3JrKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVNJbnQxNiBmb3JrUmVmTnVtOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZm9ya1JlZk51bSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBGU0Nsb3NlRm9yayhmb3JrUmVmTnVtKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTSW50MTYgZm9ya1JlZk51bTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZvcmtSZWZOdW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRlNDbG9zZUZvcmsoZm9ya1JlZk51bSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRmlsZV9GU0dldERhdGFGb3JrTmFtZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlIRlNVbmlTdHIyNTUgZGF0YUZvcmtOYW1lOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRlNHZXREYXRhRm9ya05hbWUoJmRhdGFGb3JrTmFtZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkSEZTVW5pU3RyMjU1LCAmZGF0YUZvcmtOYW1lKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBIRlNVbmlTdHIyNTUgZGF0YUZvcmtOYW1lOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRlNHZXREYXRhRm9ya05hbWUoJmRhdGFGb3JrTmFtZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkSEZTVW5pU3RyMjU1LCAmZGF0YUZvcmtOYW1lKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGaWxlX0ZTR2V0UmVzb3VyY2VGb3JrTmFtZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlIRlNVbmlTdHIyNTUgcmVzb3VyY2VGb3JrTmFtZTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEZTR2V0UmVzb3VyY2VGb3JrTmFtZSgmcmVzb3VyY2VGb3JrTmFtZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkSEZTVW5pU3RyMjU1LCAmcmVzb3VyY2VGb3JrTmFtZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSEZTVW5pU3RyMjU1IHJlc291cmNlRm9ya05hbWU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBGU0dldFJlc291cmNlRm9ya05hbWUoJnJlc291cmNlRm9ya05hbWUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEhGU1VuaVN0cjI1NSwgJnJlc291cmNlRm9ya05hbWUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZpbGVfRlNQYXRoTWFrZVJlZihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50OCAqIHBhdGg7Ci0JRlNSZWYgcmVmOwotCUJvb2xlYW4gaXNEaXJlY3Rvcnk7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAicyIsCi0JICAgICAgICAgICAgICAgICAgICAgICZwYXRoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEZTUGF0aE1ha2VSZWYocGF0aCwKLQkgICAgICAgICAgICAgICAgICAgICAmcmVmLAotCSAgICAgICAgICAgICAgICAgICAgICZpc0RpcmVjdG9yeSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZiIiwKLQkgICAgICAgICAgICAgICAgICAgICBGU1JlZl9OZXcsICZyZWYsCi0JICAgICAgICAgICAgICAgICAgICAgaXNEaXJlY3RvcnkpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQ4ICogcGF0aDsKKyAgICBGU1JlZiByZWY7CisgICAgQm9vbGVhbiBpc0RpcmVjdG9yeTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhdGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRlNQYXRoTWFrZVJlZihwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICZyZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgJmlzRGlyZWN0b3J5KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZTUmVmX05ldywgJnJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpc0RpcmVjdG9yeSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRmlsZV9GTk5vdGlmeUJ5UGF0aChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50OCAqIHBhdGg7Ci0JRk5NZXNzYWdlIG1lc3NhZ2U7Ci0JT3B0aW9uQml0cyBmbGFnczsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcGF0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1lc3NhZ2UsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBGTk5vdGlmeUJ5UGF0aChwYXRoLAotCSAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLAotCSAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVUludDggKiBwYXRoOworICAgIEZOTWVzc2FnZSBtZXNzYWdlOworICAgIE9wdGlvbkJpdHMgZmxhZ3M7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAic2xsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRk5Ob3RpZnlCeVBhdGgocGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZpbGVfRk5Ob3RpZnlBbGwoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JRk5NZXNzYWdlIG1lc3NhZ2U7Ci0JT3B0aW9uQml0cyBmbGFnczsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZtZXNzYWdlLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRk5Ob3RpZnlBbGwobWVzc2FnZSwKLQkgICAgICAgICAgICAgICAgICAgZmxhZ3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIEZOTWVzc2FnZSBtZXNzYWdlOworICAgIE9wdGlvbkJpdHMgZmxhZ3M7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEZOTm90aWZ5QWxsKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogI2lmbmRlZiBfX0xQNjRfXwogc3RhdGljIFB5T2JqZWN0ICpGaWxlX05ld0FsaWFzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUZTU3BlYyBmcm9tRmlsZV9fYnVmX187Ci0JRlNTcGVjICpmcm9tRmlsZSA9ICZmcm9tRmlsZV9fYnVmX187Ci0JRlNTcGVjIHRhcmdldDsKLQlBbGlhc0hhbmRsZSBhbGlhczsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgbXlQeU1hY19HZXRPcHRGU1NwZWNQdHIsICZmcm9tRmlsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgRlNTcGVjX0NvbnZlcnQsICZ0YXJnZXQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gTmV3QWxpYXMoZnJvbUZpbGUsCi0JICAgICAgICAgICAgICAgICZ0YXJnZXQsCi0JICAgICAgICAgICAgICAgICZhbGlhcyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEFsaWFzX05ldywgYWxpYXMpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEZTU3BlYyBmcm9tRmlsZV9fYnVmX187CisgICAgRlNTcGVjICpmcm9tRmlsZSA9ICZmcm9tRmlsZV9fYnVmX187CisgICAgRlNTcGVjIHRhcmdldDsKKyAgICBBbGlhc0hhbmRsZSBhbGlhczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbXlQeU1hY19HZXRPcHRGU1NwZWNQdHIsICZmcm9tRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlNTcGVjX0NvbnZlcnQsICZ0YXJnZXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gTmV3QWxpYXMoZnJvbUZpbGUsCisgICAgICAgICAgICAgICAgICAgICZ0YXJnZXQsCisgICAgICAgICAgICAgICAgICAgICZhbGlhcyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFsaWFzX05ldywgYWxpYXMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZpbGVfTmV3QWxpYXNNaW5pbWFsRnJvbUZ1bGxQYXRoKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCWNoYXIgKmZ1bGxQYXRoX19pbl9fOwotCWludCBmdWxsUGF0aF9fbGVuX187Ci0JaW50IGZ1bGxQYXRoX19pbl9sZW5fXzsKLQlTdHIzMiB6b25lTmFtZTsKLQlTdHIzMSBzZXJ2ZXJOYW1lOwotCUFsaWFzSGFuZGxlIGFsaWFzOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInMjTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZmdWxsUGF0aF9faW5fXywgJmZ1bGxQYXRoX19pbl9sZW5fXywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCB6b25lTmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBzZXJ2ZXJOYW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZnVsbFBhdGhfX2xlbl9fID0gZnVsbFBhdGhfX2luX2xlbl9fOwotCV9lcnIgPSBOZXdBbGlhc01pbmltYWxGcm9tRnVsbFBhdGgoZnVsbFBhdGhfX2xlbl9fLCBmdWxsUGF0aF9faW5fXywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpvbmVOYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyTmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhbGlhcyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEFsaWFzX05ldywgYWxpYXMpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIGNoYXIgKmZ1bGxQYXRoX19pbl9fOworICAgIGludCBmdWxsUGF0aF9fbGVuX187CisgICAgaW50IGZ1bGxQYXRoX19pbl9sZW5fXzsKKyAgICBTdHIzMiB6b25lTmFtZTsKKyAgICBTdHIzMSBzZXJ2ZXJOYW1lOworICAgIEFsaWFzSGFuZGxlIGFsaWFzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInMjTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmdWxsUGF0aF9faW5fXywgJmZ1bGxQYXRoX19pbl9sZW5fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCB6b25lTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBzZXJ2ZXJOYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZnVsbFBhdGhfX2xlbl9fID0gZnVsbFBhdGhfX2luX2xlbl9fOworICAgIF9lcnIgPSBOZXdBbGlhc01pbmltYWxGcm9tRnVsbFBhdGgoZnVsbFBhdGhfX2xlbl9fLCBmdWxsUGF0aF9faW5fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpvbmVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhbGlhcyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFsaWFzX05ldywgYWxpYXMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZpbGVfUmVzb2x2ZUFsaWFzRmlsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlGU1NwZWMgdGhlU3BlYzsKLQlCb29sZWFuIHJlc29sdmVBbGlhc0NoYWluczsKLQlCb29sZWFuIHRhcmdldElzRm9sZGVyOwotCUJvb2xlYW4gd2FzQWxpYXNlZDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmIiLAotCSAgICAgICAgICAgICAgICAgICAgICBGU1NwZWNfQ29udmVydCwgJnRoZVNwZWMsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZXNvbHZlQWxpYXNDaGFpbnMpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUmVzb2x2ZUFsaWFzRmlsZSgmdGhlU3BlYywKLQkgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlQWxpYXNDaGFpbnMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgJnRhcmdldElzRm9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICZ3YXNBbGlhc2VkKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBGU1NwZWNfTmV3LCAmdGhlU3BlYywKLQkgICAgICAgICAgICAgICAgICAgICB0YXJnZXRJc0ZvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICB3YXNBbGlhc2VkKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBGU1NwZWMgdGhlU3BlYzsKKyAgICBCb29sZWFuIHJlc29sdmVBbGlhc0NoYWluczsKKyAgICBCb29sZWFuIHRhcmdldElzRm9sZGVyOworICAgIEJvb2xlYW4gd2FzQWxpYXNlZDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGU1NwZWNfQ29udmVydCwgJnRoZVNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXNvbHZlQWxpYXNDaGFpbnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUmVzb2x2ZUFsaWFzRmlsZSgmdGhlU3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlQWxpYXNDaGFpbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRhcmdldElzRm9sZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3YXNBbGlhc2VkKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGU1NwZWNfTmV3LCAmdGhlU3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRJc0ZvbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICB3YXNBbGlhc2VkKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGaWxlX1Jlc29sdmVBbGlhc0ZpbGVXaXRoTW91bnRGbGFncyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlGU1NwZWMgdGhlU3BlYzsKLQlCb29sZWFuIHJlc29sdmVBbGlhc0NoYWluczsKLQlCb29sZWFuIHRhcmdldElzRm9sZGVyOwotCUJvb2xlYW4gd2FzQWxpYXNlZDsKLQl1bnNpZ25lZCBsb25nIG1vdW50RmxhZ3M7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZibCIsCi0JICAgICAgICAgICAgICAgICAgICAgIEZTU3BlY19Db252ZXJ0LCAmdGhlU3BlYywKLQkgICAgICAgICAgICAgICAgICAgICAgJnJlc29sdmVBbGlhc0NoYWlucywKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vdW50RmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUmVzb2x2ZUFsaWFzRmlsZVdpdGhNb3VudEZsYWdzKCZ0aGVTcGVjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZUFsaWFzQ2hhaW5zLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRhcmdldElzRm9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJndhc0FsaWFzZWQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3VudEZsYWdzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBGU1NwZWNfTmV3LCAmdGhlU3BlYywKLQkgICAgICAgICAgICAgICAgICAgICB0YXJnZXRJc0ZvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICB3YXNBbGlhc2VkKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBGU1NwZWMgdGhlU3BlYzsKKyAgICBCb29sZWFuIHJlc29sdmVBbGlhc0NoYWluczsKKyAgICBCb29sZWFuIHRhcmdldElzRm9sZGVyOworICAgIEJvb2xlYW4gd2FzQWxpYXNlZDsKKyAgICB1bnNpZ25lZCBsb25nIG1vdW50RmxhZ3M7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZTU3BlY19Db252ZXJ0LCAmdGhlU3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc29sdmVBbGlhc0NoYWlucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vdW50RmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUmVzb2x2ZUFsaWFzRmlsZVdpdGhNb3VudEZsYWdzKCZ0aGVTcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZUFsaWFzQ2hhaW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRhcmdldElzRm9sZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJndhc0FsaWFzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3VudEZsYWdzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGU1NwZWNfTmV3LCAmdGhlU3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRJc0ZvbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICB3YXNBbGlhc2VkKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGaWxlX1VwZGF0ZUFsaWFzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUZTU3BlYyBmcm9tRmlsZV9fYnVmX187Ci0JRlNTcGVjICpmcm9tRmlsZSA9ICZmcm9tRmlsZV9fYnVmX187Ci0JRlNTcGVjIHRhcmdldDsKLQlBbGlhc0hhbmRsZSBhbGlhczsKLQlCb29sZWFuIHdhc0NoYW5nZWQ7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgbXlQeU1hY19HZXRPcHRGU1NwZWNQdHIsICZmcm9tRmlsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgRlNTcGVjX0NvbnZlcnQsICZ0YXJnZXQsCi0JICAgICAgICAgICAgICAgICAgICAgIEFsaWFzX0NvbnZlcnQsICZhbGlhcykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBVcGRhdGVBbGlhcyhmcm9tRmlsZSwKLQkgICAgICAgICAgICAgICAgICAgJnRhcmdldCwKLQkgICAgICAgICAgICAgICAgICAgYWxpYXMsCi0JICAgICAgICAgICAgICAgICAgICZ3YXNDaGFuZ2VkKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICB3YXNDaGFuZ2VkKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBGU1NwZWMgZnJvbUZpbGVfX2J1Zl9fOworICAgIEZTU3BlYyAqZnJvbUZpbGUgPSAmZnJvbUZpbGVfX2J1Zl9fOworICAgIEZTU3BlYyB0YXJnZXQ7CisgICAgQWxpYXNIYW5kbGUgYWxpYXM7CisgICAgQm9vbGVhbiB3YXNDaGFuZ2VkOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG15UHlNYWNfR2V0T3B0RlNTcGVjUHRyLCAmZnJvbUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZTU3BlY19Db252ZXJ0LCAmdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBBbGlhc19Db252ZXJ0LCAmYWxpYXMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVXBkYXRlQWxpYXMoZnJvbUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICZ0YXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzLAorICAgICAgICAgICAgICAgICAgICAgICAmd2FzQ2hhbmdlZCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgd2FzQ2hhbmdlZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRmlsZV9SZXNvbHZlQWxpYXNGaWxlV2l0aE1vdW50RmxhZ3NOb1VJKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUZTU3BlYyB0aGVTcGVjOwotCUJvb2xlYW4gcmVzb2x2ZUFsaWFzQ2hhaW5zOwotCUJvb2xlYW4gdGFyZ2V0SXNGb2xkZXI7Ci0JQm9vbGVhbiB3YXNBbGlhc2VkOwotCXVuc2lnbmVkIGxvbmcgbW91bnRGbGFnczsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgRlNTcGVjX0NvbnZlcnQsICZ0aGVTcGVjLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVzb2x2ZUFsaWFzQ2hhaW5zLAotCSAgICAgICAgICAgICAgICAgICAgICAmbW91bnRGbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBSZXNvbHZlQWxpYXNGaWxlV2l0aE1vdW50RmxhZ3NOb1VJKCZ0aGVTcGVjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVBbGlhc0NoYWlucywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGFyZ2V0SXNGb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJndhc0FsaWFzZWQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW91bnRGbGFncyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgRlNTcGVjX05ldywgJnRoZVNwZWMsCi0JICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0SXNGb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgd2FzQWxpYXNlZCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgRlNTcGVjIHRoZVNwZWM7CisgICAgQm9vbGVhbiByZXNvbHZlQWxpYXNDaGFpbnM7CisgICAgQm9vbGVhbiB0YXJnZXRJc0ZvbGRlcjsKKyAgICBCb29sZWFuIHdhc0FsaWFzZWQ7CisgICAgdW5zaWduZWQgbG9uZyBtb3VudEZsYWdzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGU1NwZWNfQ29udmVydCwgJnRoZVNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXNvbHZlQWxpYXNDaGFpbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtb3VudEZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFJlc29sdmVBbGlhc0ZpbGVXaXRoTW91bnRGbGFnc05vVUkoJnRoZVNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZUFsaWFzQ2hhaW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0YXJnZXRJc0ZvbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd2FzQWxpYXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3VudEZsYWdzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGU1NwZWNfTmV3LCAmdGhlU3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRJc0ZvbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICB3YXNBbGlhc2VkKTsKKyAgICByZXR1cm4gX3JlczsKIH0KICNlbmRpZiAvKiAhX19MUDY0X18gKi8KIAogc3RhdGljIFB5T2JqZWN0ICpGaWxlX0ZTTmV3QWxpYXMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JRlNSZWYgZnJvbUZpbGVfX2J1Zl9fOwotCUZTUmVmICpmcm9tRmlsZSA9ICZmcm9tRmlsZV9fYnVmX187Ci0JRlNSZWYgdGFyZ2V0OwotCUFsaWFzSGFuZGxlIGluQWxpYXM7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIG15UHlNYWNfR2V0T3B0RlNSZWZQdHIsICZmcm9tRmlsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgRlNSZWZfQ29udmVydCwgJnRhcmdldCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBGU05ld0FsaWFzKGZyb21GaWxlLAotCSAgICAgICAgICAgICAgICAgICZ0YXJnZXQsCi0JICAgICAgICAgICAgICAgICAgJmluQWxpYXMpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBBbGlhc19OZXcsIGluQWxpYXMpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEZTUmVmIGZyb21GaWxlX19idWZfXzsKKyAgICBGU1JlZiAqZnJvbUZpbGUgPSAmZnJvbUZpbGVfX2J1Zl9fOworICAgIEZTUmVmIHRhcmdldDsKKyAgICBBbGlhc0hhbmRsZSBpbkFsaWFzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBteVB5TWFjX0dldE9wdEZTUmVmUHRyLCAmZnJvbUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZTUmVmX0NvbnZlcnQsICZ0YXJnZXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRlNOZXdBbGlhcyhmcm9tRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAmdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICZpbkFsaWFzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQWxpYXNfTmV3LCBpbkFsaWFzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGaWxlX0ZTUmVzb2x2ZUFsaWFzRmlsZVdpdGhNb3VudEZsYWdzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUZTUmVmIHRoZVJlZjsKLQlCb29sZWFuIHJlc29sdmVBbGlhc0NoYWluczsKLQlCb29sZWFuIHRhcmdldElzRm9sZGVyOwotCUJvb2xlYW4gd2FzQWxpYXNlZDsKLQl1bnNpZ25lZCBsb25nIG1vdW50RmxhZ3M7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZibCIsCi0JICAgICAgICAgICAgICAgICAgICAgIEZTUmVmX0NvbnZlcnQsICZ0aGVSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZXNvbHZlQWxpYXNDaGFpbnMsCi0JICAgICAgICAgICAgICAgICAgICAgICZtb3VudEZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEZTUmVzb2x2ZUFsaWFzRmlsZVdpdGhNb3VudEZsYWdzKCZ0aGVSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVBbGlhc0NoYWlucywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRhcmdldElzRm9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd2FzQWxpYXNlZCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW91bnRGbGFncyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgRlNSZWZfTmV3LCAmdGhlUmVmLAotCSAgICAgICAgICAgICAgICAgICAgIHRhcmdldElzRm9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgIHdhc0FsaWFzZWQpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEZTUmVmIHRoZVJlZjsKKyAgICBCb29sZWFuIHJlc29sdmVBbGlhc0NoYWluczsKKyAgICBCb29sZWFuIHRhcmdldElzRm9sZGVyOworICAgIEJvb2xlYW4gd2FzQWxpYXNlZDsKKyAgICB1bnNpZ25lZCBsb25nIG1vdW50RmxhZ3M7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZTUmVmX0NvbnZlcnQsICZ0aGVSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXNvbHZlQWxpYXNDaGFpbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtb3VudEZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEZTUmVzb2x2ZUFsaWFzRmlsZVdpdGhNb3VudEZsYWdzKCZ0aGVSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVBbGlhc0NoYWlucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRhcmdldElzRm9sZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd2FzQWxpYXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW91bnRGbGFncyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlNSZWZfTmV3LCAmdGhlUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldElzRm9sZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIHdhc0FsaWFzZWQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZpbGVfRlNSZXNvbHZlQWxpYXNGaWxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUZTUmVmIHRoZVJlZjsKLQlCb29sZWFuIHJlc29sdmVBbGlhc0NoYWluczsKLQlCb29sZWFuIHRhcmdldElzRm9sZGVyOwotCUJvb2xlYW4gd2FzQWxpYXNlZDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmIiLAotCSAgICAgICAgICAgICAgICAgICAgICBGU1JlZl9Db252ZXJ0LCAmdGhlUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVzb2x2ZUFsaWFzQ2hhaW5zKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEZTUmVzb2x2ZUFsaWFzRmlsZSgmdGhlUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZUFsaWFzQ2hhaW5zLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJnRhcmdldElzRm9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJndhc0FsaWFzZWQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mYmIiLAotCSAgICAgICAgICAgICAgICAgICAgIEZTUmVmX05ldywgJnRoZVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICB0YXJnZXRJc0ZvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICB3YXNBbGlhc2VkKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBGU1JlZiB0aGVSZWY7CisgICAgQm9vbGVhbiByZXNvbHZlQWxpYXNDaGFpbnM7CisgICAgQm9vbGVhbiB0YXJnZXRJc0ZvbGRlcjsKKyAgICBCb29sZWFuIHdhc0FsaWFzZWQ7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlNSZWZfQ29udmVydCwgJnRoZVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc29sdmVBbGlhc0NoYWlucykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBGU1Jlc29sdmVBbGlhc0ZpbGUoJnRoZVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVBbGlhc0NoYWlucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0YXJnZXRJc0ZvbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3YXNBbGlhc2VkKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGU1JlZl9OZXcsICZ0aGVSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0SXNGb2xkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgd2FzQWxpYXNlZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRmlsZV9GU1VwZGF0ZUFsaWFzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUZTUmVmIGZyb21GaWxlX19idWZfXzsKLQlGU1JlZiAqZnJvbUZpbGUgPSAmZnJvbUZpbGVfX2J1Zl9fOwotCUZTUmVmIHRhcmdldDsKLQlBbGlhc0hhbmRsZSBhbGlhczsKLQlCb29sZWFuIHdhc0NoYW5nZWQ7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgbXlQeU1hY19HZXRPcHRGU1JlZlB0ciwgJmZyb21GaWxlLAotCSAgICAgICAgICAgICAgICAgICAgICBGU1JlZl9Db252ZXJ0LCAmdGFyZ2V0LAotCSAgICAgICAgICAgICAgICAgICAgICBBbGlhc19Db252ZXJ0LCAmYWxpYXMpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRlNVcGRhdGVBbGlhcyhmcm9tRmlsZSwKLQkgICAgICAgICAgICAgICAgICAgICAmdGFyZ2V0LAotCSAgICAgICAgICAgICAgICAgICAgIGFsaWFzLAotCSAgICAgICAgICAgICAgICAgICAgICZ3YXNDaGFuZ2VkKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICB3YXNDaGFuZ2VkKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBGU1JlZiBmcm9tRmlsZV9fYnVmX187CisgICAgRlNSZWYgKmZyb21GaWxlID0gJmZyb21GaWxlX19idWZfXzsKKyAgICBGU1JlZiB0YXJnZXQ7CisgICAgQWxpYXNIYW5kbGUgYWxpYXM7CisgICAgQm9vbGVhbiB3YXNDaGFuZ2VkOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG15UHlNYWNfR2V0T3B0RlNSZWZQdHIsICZmcm9tRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlNSZWZfQ29udmVydCwgJnRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQWxpYXNfQ29udmVydCwgJmFsaWFzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEZTVXBkYXRlQWxpYXMoZnJvbUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgJnRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhbGlhcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAmd2FzQ2hhbmdlZCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgd2FzQ2hhbmdlZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRmlsZV9wYXRobmFtZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogCi0JUHlPYmplY3QgKm9iajsKKyAgICBQeU9iamVjdCAqb2JqOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyIsICZvYmopKQotCSAgICAgICAgcmV0dXJuIE5VTEw7Ci0JaWYgKFB5U3RyaW5nX0NoZWNrKG9iaikpIHsKLQkgICAgICAgIFB5X0lOQ1JFRihvYmopOwotCSAgICAgICAgcmV0dXJuIG9iajsKLQl9Ci0JaWYgKFB5VW5pY29kZV9DaGVjayhvYmopKQotCSAgICAgICAgcmV0dXJuIFB5VW5pY29kZV9Bc0VuY29kZWRTdHJpbmcob2JqLCAidXRmOCIsICJzdHJpY3QiKTsKLQlfcmVzID0gUHlPYmplY3RfQ2FsbE1ldGhvZChvYmosICJhc19wYXRobmFtZSIsIE5VTEwpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8iLCAmb2JqKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKFB5U3RyaW5nX0NoZWNrKG9iaikpIHsKKyAgICAgICAgUHlfSU5DUkVGKG9iaik7CisgICAgICAgIHJldHVybiBvYmo7CisgICAgfQorICAgIGlmIChQeVVuaWNvZGVfQ2hlY2sob2JqKSkKKyAgICAgICAgcmV0dXJuIFB5VW5pY29kZV9Bc0VuY29kZWRTdHJpbmcob2JqLCAidXRmOCIsICJzdHJpY3QiKTsKKyAgICBfcmVzID0gUHlPYmplY3RfQ2FsbE1ldGhvZChvYmosICJhc19wYXRobmFtZSIsIE5VTEwpOworICAgIHJldHVybiBfcmVzOwogCiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBGaWxlX21ldGhvZHNbXSA9IHsKICNpZm5kZWYgX19MUDY0X18KLQl7IlVubW91bnRWb2wiLCAoUHlDRnVuY3Rpb24pRmlsZV9Vbm1vdW50Vm9sLCAxLAotCSBQeURvY19TVFIoIihTdHI2MyB2b2xOYW1lLCBzaG9ydCB2UmVmTnVtKSAtPiBOb25lIil9LAotCXsiRmx1c2hWb2wiLCAoUHlDRnVuY3Rpb24pRmlsZV9GbHVzaFZvbCwgMSwKLQkgUHlEb2NfU1RSKCIoU3RyNjMgdm9sTmFtZSwgc2hvcnQgdlJlZk51bSkgLT4gTm9uZSIpfSwKLQl7IkhTZXRWb2wiLCAoUHlDRnVuY3Rpb24pRmlsZV9IU2V0Vm9sLCAxLAotCSBQeURvY19TVFIoIihTdHI2MyB2b2xOYW1lLCBzaG9ydCB2UmVmTnVtLCBsb25nIGRpcklEKSAtPiBOb25lIil9LAotCXsiRlNDbG9zZSIsIChQeUNGdW5jdGlvbilGaWxlX0ZTQ2xvc2UsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHJlZk51bSkgLT4gTm9uZSIpfSwKLQl7IkFsbG9jYXRlIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfQWxsb2NhdGUsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHJlZk51bSkgLT4gKGxvbmcgY291bnQpIil9LAotCXsiR2V0RU9GIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfR2V0RU9GLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCByZWZOdW0pIC0+IChsb25nIGxvZ0VPRikiKX0sCi0JeyJTZXRFT0YiLCAoUHlDRnVuY3Rpb24pRmlsZV9TZXRFT0YsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHJlZk51bSwgbG9uZyBsb2dFT0YpIC0+IE5vbmUiKX0sCi0JeyJHZXRGUG9zIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfR2V0RlBvcywgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgcmVmTnVtKSAtPiAobG9uZyBmaWxlUG9zKSIpfSwKLQl7IlNldEZQb3MiLCAoUHlDRnVuY3Rpb24pRmlsZV9TZXRGUG9zLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCByZWZOdW0sIHNob3J0IHBvc01vZGUsIGxvbmcgcG9zT2ZmKSAtPiBOb25lIil9LAotCXsiR2V0VlJlZk51bSIsIChQeUNGdW5jdGlvbilGaWxlX0dldFZSZWZOdW0sIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGZpbGVSZWZOdW0pIC0+IChzaG9ydCB2UmVmTnVtKSIpfSwKLQl7IkhHZXRWb2wiLCAoUHlDRnVuY3Rpb24pRmlsZV9IR2V0Vm9sLCAxLAotCSBQeURvY19TVFIoIihTdHJpbmdQdHIgdm9sTmFtZSkgLT4gKHNob3J0IHZSZWZOdW0sIGxvbmcgZGlySUQpIil9LAotCXsiSE9wZW4iLCAoUHlDRnVuY3Rpb24pRmlsZV9IT3BlbiwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgdlJlZk51bSwgbG9uZyBkaXJJRCwgU3RyMjU1IGZpbGVOYW1lLCBTSW50OCBwZXJtaXNzaW9uKSAtPiAoc2hvcnQgcmVmTnVtKSIpfSwKLQl7IkhPcGVuREYiLCAoUHlDRnVuY3Rpb24pRmlsZV9IT3BlbkRGLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCB2UmVmTnVtLCBsb25nIGRpcklELCBTdHIyNTUgZmlsZU5hbWUsIFNJbnQ4IHBlcm1pc3Npb24pIC0+IChzaG9ydCByZWZOdW0pIil9LAotCXsiSE9wZW5SRiIsIChQeUNGdW5jdGlvbilGaWxlX0hPcGVuUkYsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHZSZWZOdW0sIGxvbmcgZGlySUQsIFN0cjI1NSBmaWxlTmFtZSwgU0ludDggcGVybWlzc2lvbikgLT4gKHNob3J0IHJlZk51bSkiKX0sCi0JeyJBbGxvY0NvbnRpZyIsIChQeUNGdW5jdGlvbilGaWxlX0FsbG9jQ29udGlnLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCByZWZOdW0pIC0+IChsb25nIGNvdW50KSIpfSwKLQl7IkhDcmVhdGUiLCAoUHlDRnVuY3Rpb24pRmlsZV9IQ3JlYXRlLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCB2UmVmTnVtLCBsb25nIGRpcklELCBTdHIyNTUgZmlsZU5hbWUsIE9TVHlwZSBjcmVhdG9yLCBPU1R5cGUgZmlsZVR5cGUpIC0+IE5vbmUiKX0sCi0JeyJEaXJDcmVhdGUiLCAoUHlDRnVuY3Rpb24pRmlsZV9EaXJDcmVhdGUsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHZSZWZOdW0sIGxvbmcgcGFyZW50RGlySUQsIFN0cjI1NSBkaXJlY3RvcnlOYW1lKSAtPiAobG9uZyBjcmVhdGVkRGlySUQpIil9LAotCXsiSERlbGV0ZSIsIChQeUNGdW5jdGlvbilGaWxlX0hEZWxldGUsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHZSZWZOdW0sIGxvbmcgZGlySUQsIFN0cjI1NSBmaWxlTmFtZSkgLT4gTm9uZSIpfSwKLQl7IkhHZXRGSW5mbyIsIChQeUNGdW5jdGlvbilGaWxlX0hHZXRGSW5mbywgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgdlJlZk51bSwgbG9uZyBkaXJJRCwgU3RyMjU1IGZpbGVOYW1lKSAtPiAoRkluZm8gZm5kckluZm8pIil9LAotCXsiSFNldEZJbmZvIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfSFNldEZJbmZvLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCB2UmVmTnVtLCBsb25nIGRpcklELCBTdHIyNTUgZmlsZU5hbWUsIEZJbmZvIGZuZHJJbmZvKSAtPiBOb25lIil9LAotCXsiSFNldEZMb2NrIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfSFNldEZMb2NrLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCB2UmVmTnVtLCBsb25nIGRpcklELCBTdHIyNTUgZmlsZU5hbWUpIC0+IE5vbmUiKX0sCi0JeyJIUnN0RkxvY2siLCAoUHlDRnVuY3Rpb24pRmlsZV9IUnN0RkxvY2ssIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHZSZWZOdW0sIGxvbmcgZGlySUQsIFN0cjI1NSBmaWxlTmFtZSkgLT4gTm9uZSIpfSwKLQl7IkhSZW5hbWUiLCAoUHlDRnVuY3Rpb24pRmlsZV9IUmVuYW1lLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCB2UmVmTnVtLCBsb25nIGRpcklELCBTdHIyNTUgb2xkTmFtZSwgU3RyMjU1IG5ld05hbWUpIC0+IE5vbmUiKX0sCi0JeyJDYXRNb3ZlIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfQ2F0TW92ZSwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgdlJlZk51bSwgbG9uZyBkaXJJRCwgU3RyMjU1IG9sZE5hbWUsIGxvbmcgbmV3RGlySUQsIFN0cjI1NSBuZXdOYW1lKSAtPiBOb25lIil9LAotCXsiRlNNYWtlRlNTcGVjIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfRlNNYWtlRlNTcGVjLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCB2UmVmTnVtLCBsb25nIGRpcklELCBTdHIyNTUgZmlsZU5hbWUpIC0+IChGU1NwZWMgc3BlYykiKX0sCisgICAgeyJVbm1vdW50Vm9sIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfVW5tb3VudFZvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU3RyNjMgdm9sTmFtZSwgc2hvcnQgdlJlZk51bSkgLT4gTm9uZSIpfSwKKyAgICB7IkZsdXNoVm9sIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfRmx1c2hWb2wsIDEsCisgICAgIFB5RG9jX1NUUigiKFN0cjYzIHZvbE5hbWUsIHNob3J0IHZSZWZOdW0pIC0+IE5vbmUiKX0sCisgICAgeyJIU2V0Vm9sIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfSFNldFZvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU3RyNjMgdm9sTmFtZSwgc2hvcnQgdlJlZk51bSwgbG9uZyBkaXJJRCkgLT4gTm9uZSIpfSwKKyAgICB7IkZTQ2xvc2UiLCAoUHlDRnVuY3Rpb24pRmlsZV9GU0Nsb3NlLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCByZWZOdW0pIC0+IE5vbmUiKX0sCisgICAgeyJBbGxvY2F0ZSIsIChQeUNGdW5jdGlvbilGaWxlX0FsbG9jYXRlLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCByZWZOdW0pIC0+IChsb25nIGNvdW50KSIpfSwKKyAgICB7IkdldEVPRiIsIChQeUNGdW5jdGlvbilGaWxlX0dldEVPRiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgcmVmTnVtKSAtPiAobG9uZyBsb2dFT0YpIil9LAorICAgIHsiU2V0RU9GIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfU2V0RU9GLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCByZWZOdW0sIGxvbmcgbG9nRU9GKSAtPiBOb25lIil9LAorICAgIHsiR2V0RlBvcyIsIChQeUNGdW5jdGlvbilGaWxlX0dldEZQb3MsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IHJlZk51bSkgLT4gKGxvbmcgZmlsZVBvcykiKX0sCisgICAgeyJTZXRGUG9zIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfU2V0RlBvcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgcmVmTnVtLCBzaG9ydCBwb3NNb2RlLCBsb25nIHBvc09mZikgLT4gTm9uZSIpfSwKKyAgICB7IkdldFZSZWZOdW0iLCAoUHlDRnVuY3Rpb24pRmlsZV9HZXRWUmVmTnVtLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBmaWxlUmVmTnVtKSAtPiAoc2hvcnQgdlJlZk51bSkiKX0sCisgICAgeyJIR2V0Vm9sIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfSEdldFZvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU3RyaW5nUHRyIHZvbE5hbWUpIC0+IChzaG9ydCB2UmVmTnVtLCBsb25nIGRpcklEKSIpfSwKKyAgICB7IkhPcGVuIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfSE9wZW4sIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IHZSZWZOdW0sIGxvbmcgZGlySUQsIFN0cjI1NSBmaWxlTmFtZSwgU0ludDggcGVybWlzc2lvbikgLT4gKHNob3J0IHJlZk51bSkiKX0sCisgICAgeyJIT3BlbkRGIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfSE9wZW5ERiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgdlJlZk51bSwgbG9uZyBkaXJJRCwgU3RyMjU1IGZpbGVOYW1lLCBTSW50OCBwZXJtaXNzaW9uKSAtPiAoc2hvcnQgcmVmTnVtKSIpfSwKKyAgICB7IkhPcGVuUkYiLCAoUHlDRnVuY3Rpb24pRmlsZV9IT3BlblJGLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCB2UmVmTnVtLCBsb25nIGRpcklELCBTdHIyNTUgZmlsZU5hbWUsIFNJbnQ4IHBlcm1pc3Npb24pIC0+IChzaG9ydCByZWZOdW0pIil9LAorICAgIHsiQWxsb2NDb250aWciLCAoUHlDRnVuY3Rpb24pRmlsZV9BbGxvY0NvbnRpZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgcmVmTnVtKSAtPiAobG9uZyBjb3VudCkiKX0sCisgICAgeyJIQ3JlYXRlIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfSENyZWF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgdlJlZk51bSwgbG9uZyBkaXJJRCwgU3RyMjU1IGZpbGVOYW1lLCBPU1R5cGUgY3JlYXRvciwgT1NUeXBlIGZpbGVUeXBlKSAtPiBOb25lIil9LAorICAgIHsiRGlyQ3JlYXRlIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfRGlyQ3JlYXRlLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCB2UmVmTnVtLCBsb25nIHBhcmVudERpcklELCBTdHIyNTUgZGlyZWN0b3J5TmFtZSkgLT4gKGxvbmcgY3JlYXRlZERpcklEKSIpfSwKKyAgICB7IkhEZWxldGUiLCAoUHlDRnVuY3Rpb24pRmlsZV9IRGVsZXRlLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCB2UmVmTnVtLCBsb25nIGRpcklELCBTdHIyNTUgZmlsZU5hbWUpIC0+IE5vbmUiKX0sCisgICAgeyJIR2V0RkluZm8iLCAoUHlDRnVuY3Rpb24pRmlsZV9IR2V0RkluZm8sIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IHZSZWZOdW0sIGxvbmcgZGlySUQsIFN0cjI1NSBmaWxlTmFtZSkgLT4gKEZJbmZvIGZuZHJJbmZvKSIpfSwKKyAgICB7IkhTZXRGSW5mbyIsIChQeUNGdW5jdGlvbilGaWxlX0hTZXRGSW5mbywgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgdlJlZk51bSwgbG9uZyBkaXJJRCwgU3RyMjU1IGZpbGVOYW1lLCBGSW5mbyBmbmRySW5mbykgLT4gTm9uZSIpfSwKKyAgICB7IkhTZXRGTG9jayIsIChQeUNGdW5jdGlvbilGaWxlX0hTZXRGTG9jaywgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgdlJlZk51bSwgbG9uZyBkaXJJRCwgU3RyMjU1IGZpbGVOYW1lKSAtPiBOb25lIil9LAorICAgIHsiSFJzdEZMb2NrIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfSFJzdEZMb2NrLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCB2UmVmTnVtLCBsb25nIGRpcklELCBTdHIyNTUgZmlsZU5hbWUpIC0+IE5vbmUiKX0sCisgICAgeyJIUmVuYW1lIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfSFJlbmFtZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgdlJlZk51bSwgbG9uZyBkaXJJRCwgU3RyMjU1IG9sZE5hbWUsIFN0cjI1NSBuZXdOYW1lKSAtPiBOb25lIil9LAorICAgIHsiQ2F0TW92ZSIsIChQeUNGdW5jdGlvbilGaWxlX0NhdE1vdmUsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IHZSZWZOdW0sIGxvbmcgZGlySUQsIFN0cjI1NSBvbGROYW1lLCBsb25nIG5ld0RpcklELCBTdHIyNTUgbmV3TmFtZSkgLT4gTm9uZSIpfSwKKyAgICB7IkZTTWFrZUZTU3BlYyIsIChQeUNGdW5jdGlvbilGaWxlX0ZTTWFrZUZTU3BlYywgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgdlJlZk51bSwgbG9uZyBkaXJJRCwgU3RyMjU1IGZpbGVOYW1lKSAtPiAoRlNTcGVjIHNwZWMpIil9LAogI2VuZGlmIC8qICFfX0xQNjRfXyovCi0JeyJGU0dldEZvcmtQb3NpdGlvbiIsIChQeUNGdW5jdGlvbilGaWxlX0ZTR2V0Rm9ya1Bvc2l0aW9uLCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgZm9ya1JlZk51bSkgLT4gKFNJbnQ2NCBwb3NpdGlvbikiKX0sCi0JeyJGU1NldEZvcmtQb3NpdGlvbiIsIChQeUNGdW5jdGlvbilGaWxlX0ZTU2V0Rm9ya1Bvc2l0aW9uLCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgZm9ya1JlZk51bSwgVUludDE2IHBvc2l0aW9uTW9kZSwgU0ludDY0IHBvc2l0aW9uT2Zmc2V0KSAtPiBOb25lIil9LAotCXsiRlNHZXRGb3JrU2l6ZSIsIChQeUNGdW5jdGlvbilGaWxlX0ZTR2V0Rm9ya1NpemUsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiBmb3JrUmVmTnVtKSAtPiAoU0ludDY0IGZvcmtTaXplKSIpfSwKLQl7IkZTU2V0Rm9ya1NpemUiLCAoUHlDRnVuY3Rpb24pRmlsZV9GU1NldEZvcmtTaXplLCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgZm9ya1JlZk51bSwgVUludDE2IHBvc2l0aW9uTW9kZSwgU0ludDY0IHBvc2l0aW9uT2Zmc2V0KSAtPiBOb25lIil9LAotCXsiRlNBbGxvY2F0ZUZvcmsiLCAoUHlDRnVuY3Rpb24pRmlsZV9GU0FsbG9jYXRlRm9yaywgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IGZvcmtSZWZOdW0sIEZTQWxsb2NhdGlvbkZsYWdzIGZsYWdzLCBVSW50MTYgcG9zaXRpb25Nb2RlLCBTSW50NjQgcG9zaXRpb25PZmZzZXQsIFVJbnQ2NCByZXF1ZXN0Q291bnQpIC0+IChVSW50NjQgYWN0dWFsQ291bnQpIil9LAotCXsiRlNGbHVzaEZvcmsiLCAoUHlDRnVuY3Rpb24pRmlsZV9GU0ZsdXNoRm9yaywgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IGZvcmtSZWZOdW0pIC0+IE5vbmUiKX0sCi0JeyJGU0Nsb3NlRm9yayIsIChQeUNGdW5jdGlvbilGaWxlX0ZTQ2xvc2VGb3JrLCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgZm9ya1JlZk51bSkgLT4gTm9uZSIpfSwKLQl7IkZTR2V0RGF0YUZvcmtOYW1lIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfRlNHZXREYXRhRm9ya05hbWUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEhGU1VuaVN0cjI1NSBkYXRhRm9ya05hbWUpIil9LAotCXsiRlNHZXRSZXNvdXJjZUZvcmtOYW1lIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfRlNHZXRSZXNvdXJjZUZvcmtOYW1lLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChIRlNVbmlTdHIyNTUgcmVzb3VyY2VGb3JrTmFtZSkiKX0sCi0JeyJGU1BhdGhNYWtlUmVmIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfRlNQYXRoTWFrZVJlZiwgMSwKLQkgUHlEb2NfU1RSKCIoVUludDggKiBwYXRoKSAtPiAoRlNSZWYgcmVmLCBCb29sZWFuIGlzRGlyZWN0b3J5KSIpfSwKLQl7IkZOTm90aWZ5QnlQYXRoIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfRk5Ob3RpZnlCeVBhdGgsIDEsCi0JIFB5RG9jX1NUUigiKFVJbnQ4ICogcGF0aCwgRk5NZXNzYWdlIG1lc3NhZ2UsIE9wdGlvbkJpdHMgZmxhZ3MpIC0+IE5vbmUiKX0sCi0JeyJGTk5vdGlmeUFsbCIsIChQeUNGdW5jdGlvbilGaWxlX0ZOTm90aWZ5QWxsLCAxLAotCSBQeURvY19TVFIoIihGTk1lc3NhZ2UgbWVzc2FnZSwgT3B0aW9uQml0cyBmbGFncykgLT4gTm9uZSIpfSwKKyAgICB7IkZTR2V0Rm9ya1Bvc2l0aW9uIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfRlNHZXRGb3JrUG9zaXRpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiBmb3JrUmVmTnVtKSAtPiAoU0ludDY0IHBvc2l0aW9uKSIpfSwKKyAgICB7IkZTU2V0Rm9ya1Bvc2l0aW9uIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfRlNTZXRGb3JrUG9zaXRpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiBmb3JrUmVmTnVtLCBVSW50MTYgcG9zaXRpb25Nb2RlLCBTSW50NjQgcG9zaXRpb25PZmZzZXQpIC0+IE5vbmUiKX0sCisgICAgeyJGU0dldEZvcmtTaXplIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfRlNHZXRGb3JrU2l6ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IGZvcmtSZWZOdW0pIC0+IChTSW50NjQgZm9ya1NpemUpIil9LAorICAgIHsiRlNTZXRGb3JrU2l6ZSIsIChQeUNGdW5jdGlvbilGaWxlX0ZTU2V0Rm9ya1NpemUsIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiBmb3JrUmVmTnVtLCBVSW50MTYgcG9zaXRpb25Nb2RlLCBTSW50NjQgcG9zaXRpb25PZmZzZXQpIC0+IE5vbmUiKX0sCisgICAgeyJGU0FsbG9jYXRlRm9yayIsIChQeUNGdW5jdGlvbilGaWxlX0ZTQWxsb2NhdGVGb3JrLCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgZm9ya1JlZk51bSwgRlNBbGxvY2F0aW9uRmxhZ3MgZmxhZ3MsIFVJbnQxNiBwb3NpdGlvbk1vZGUsIFNJbnQ2NCBwb3NpdGlvbk9mZnNldCwgVUludDY0IHJlcXVlc3RDb3VudCkgLT4gKFVJbnQ2NCBhY3R1YWxDb3VudCkiKX0sCisgICAgeyJGU0ZsdXNoRm9yayIsIChQeUNGdW5jdGlvbilGaWxlX0ZTRmx1c2hGb3JrLCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgZm9ya1JlZk51bSkgLT4gTm9uZSIpfSwKKyAgICB7IkZTQ2xvc2VGb3JrIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfRlNDbG9zZUZvcmssIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiBmb3JrUmVmTnVtKSAtPiBOb25lIil9LAorICAgIHsiRlNHZXREYXRhRm9ya05hbWUiLCAoUHlDRnVuY3Rpb24pRmlsZV9GU0dldERhdGFGb3JrTmFtZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoSEZTVW5pU3RyMjU1IGRhdGFGb3JrTmFtZSkiKX0sCisgICAgeyJGU0dldFJlc291cmNlRm9ya05hbWUiLCAoUHlDRnVuY3Rpb24pRmlsZV9GU0dldFJlc291cmNlRm9ya05hbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEhGU1VuaVN0cjI1NSByZXNvdXJjZUZvcmtOYW1lKSIpfSwKKyAgICB7IkZTUGF0aE1ha2VSZWYiLCAoUHlDRnVuY3Rpb24pRmlsZV9GU1BhdGhNYWtlUmVmLCAxLAorICAgICBQeURvY19TVFIoIihVSW50OCAqIHBhdGgpIC0+IChGU1JlZiByZWYsIEJvb2xlYW4gaXNEaXJlY3RvcnkpIil9LAorICAgIHsiRk5Ob3RpZnlCeVBhdGgiLCAoUHlDRnVuY3Rpb24pRmlsZV9GTk5vdGlmeUJ5UGF0aCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVUludDggKiBwYXRoLCBGTk1lc3NhZ2UgbWVzc2FnZSwgT3B0aW9uQml0cyBmbGFncykgLT4gTm9uZSIpfSwKKyAgICB7IkZOTm90aWZ5QWxsIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfRk5Ob3RpZnlBbGwsIDEsCisgICAgIFB5RG9jX1NUUigiKEZOTWVzc2FnZSBtZXNzYWdlLCBPcHRpb25CaXRzIGZsYWdzKSAtPiBOb25lIil9LAogI2lmbmRlZiAgX19MUDY0X18KLQl7Ik5ld0FsaWFzIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfTmV3QWxpYXMsIDEsCi0JIFB5RG9jX1NUUigiKEZTU3BlYyBmcm9tRmlsZSwgRlNTcGVjIHRhcmdldCkgLT4gKEFsaWFzSGFuZGxlIGFsaWFzKSIpfSwKLQl7Ik5ld0FsaWFzTWluaW1hbEZyb21GdWxsUGF0aCIsIChQeUNGdW5jdGlvbilGaWxlX05ld0FsaWFzTWluaW1hbEZyb21GdWxsUGF0aCwgMSwKLQkgUHlEb2NfU1RSKCIoQnVmZmVyIGZ1bGxQYXRoLCBTdHIzMiB6b25lTmFtZSwgU3RyMzEgc2VydmVyTmFtZSkgLT4gKEFsaWFzSGFuZGxlIGFsaWFzKSIpfSwKLQl7IlJlc29sdmVBbGlhc0ZpbGUiLCAoUHlDRnVuY3Rpb24pRmlsZV9SZXNvbHZlQWxpYXNGaWxlLCAxLAotCSBQeURvY19TVFIoIihGU1NwZWMgdGhlU3BlYywgQm9vbGVhbiByZXNvbHZlQWxpYXNDaGFpbnMpIC0+IChGU1NwZWMgdGhlU3BlYywgQm9vbGVhbiB0YXJnZXRJc0ZvbGRlciwgQm9vbGVhbiB3YXNBbGlhc2VkKSIpfSwKLQl7IlJlc29sdmVBbGlhc0ZpbGVXaXRoTW91bnRGbGFncyIsIChQeUNGdW5jdGlvbilGaWxlX1Jlc29sdmVBbGlhc0ZpbGVXaXRoTW91bnRGbGFncywgMSwKLQkgUHlEb2NfU1RSKCIoRlNTcGVjIHRoZVNwZWMsIEJvb2xlYW4gcmVzb2x2ZUFsaWFzQ2hhaW5zLCB1bnNpZ25lZCBsb25nIG1vdW50RmxhZ3MpIC0+IChGU1NwZWMgdGhlU3BlYywgQm9vbGVhbiB0YXJnZXRJc0ZvbGRlciwgQm9vbGVhbiB3YXNBbGlhc2VkKSIpfSwKLQl7IlVwZGF0ZUFsaWFzIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfVXBkYXRlQWxpYXMsIDEsCi0JIFB5RG9jX1NUUigiKEZTU3BlYyBmcm9tRmlsZSwgRlNTcGVjIHRhcmdldCwgQWxpYXNIYW5kbGUgYWxpYXMpIC0+IChCb29sZWFuIHdhc0NoYW5nZWQpIil9LAotCXsiUmVzb2x2ZUFsaWFzRmlsZVdpdGhNb3VudEZsYWdzTm9VSSIsIChQeUNGdW5jdGlvbilGaWxlX1Jlc29sdmVBbGlhc0ZpbGVXaXRoTW91bnRGbGFnc05vVUksIDEsCi0JIFB5RG9jX1NUUigiKEZTU3BlYyB0aGVTcGVjLCBCb29sZWFuIHJlc29sdmVBbGlhc0NoYWlucywgdW5zaWduZWQgbG9uZyBtb3VudEZsYWdzKSAtPiAoRlNTcGVjIHRoZVNwZWMsIEJvb2xlYW4gdGFyZ2V0SXNGb2xkZXIsIEJvb2xlYW4gd2FzQWxpYXNlZCkiKX0sCisgICAgeyJOZXdBbGlhcyIsIChQeUNGdW5jdGlvbilGaWxlX05ld0FsaWFzLCAxLAorICAgICBQeURvY19TVFIoIihGU1NwZWMgZnJvbUZpbGUsIEZTU3BlYyB0YXJnZXQpIC0+IChBbGlhc0hhbmRsZSBhbGlhcykiKX0sCisgICAgeyJOZXdBbGlhc01pbmltYWxGcm9tRnVsbFBhdGgiLCAoUHlDRnVuY3Rpb24pRmlsZV9OZXdBbGlhc01pbmltYWxGcm9tRnVsbFBhdGgsIDEsCisgICAgIFB5RG9jX1NUUigiKEJ1ZmZlciBmdWxsUGF0aCwgU3RyMzIgem9uZU5hbWUsIFN0cjMxIHNlcnZlck5hbWUpIC0+IChBbGlhc0hhbmRsZSBhbGlhcykiKX0sCisgICAgeyJSZXNvbHZlQWxpYXNGaWxlIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfUmVzb2x2ZUFsaWFzRmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRlNTcGVjIHRoZVNwZWMsIEJvb2xlYW4gcmVzb2x2ZUFsaWFzQ2hhaW5zKSAtPiAoRlNTcGVjIHRoZVNwZWMsIEJvb2xlYW4gdGFyZ2V0SXNGb2xkZXIsIEJvb2xlYW4gd2FzQWxpYXNlZCkiKX0sCisgICAgeyJSZXNvbHZlQWxpYXNGaWxlV2l0aE1vdW50RmxhZ3MiLCAoUHlDRnVuY3Rpb24pRmlsZV9SZXNvbHZlQWxpYXNGaWxlV2l0aE1vdW50RmxhZ3MsIDEsCisgICAgIFB5RG9jX1NUUigiKEZTU3BlYyB0aGVTcGVjLCBCb29sZWFuIHJlc29sdmVBbGlhc0NoYWlucywgdW5zaWduZWQgbG9uZyBtb3VudEZsYWdzKSAtPiAoRlNTcGVjIHRoZVNwZWMsIEJvb2xlYW4gdGFyZ2V0SXNGb2xkZXIsIEJvb2xlYW4gd2FzQWxpYXNlZCkiKX0sCisgICAgeyJVcGRhdGVBbGlhcyIsIChQeUNGdW5jdGlvbilGaWxlX1VwZGF0ZUFsaWFzLCAxLAorICAgICBQeURvY19TVFIoIihGU1NwZWMgZnJvbUZpbGUsIEZTU3BlYyB0YXJnZXQsIEFsaWFzSGFuZGxlIGFsaWFzKSAtPiAoQm9vbGVhbiB3YXNDaGFuZ2VkKSIpfSwKKyAgICB7IlJlc29sdmVBbGlhc0ZpbGVXaXRoTW91bnRGbGFnc05vVUkiLCAoUHlDRnVuY3Rpb24pRmlsZV9SZXNvbHZlQWxpYXNGaWxlV2l0aE1vdW50RmxhZ3NOb1VJLCAxLAorICAgICBQeURvY19TVFIoIihGU1NwZWMgdGhlU3BlYywgQm9vbGVhbiByZXNvbHZlQWxpYXNDaGFpbnMsIHVuc2lnbmVkIGxvbmcgbW91bnRGbGFncykgLT4gKEZTU3BlYyB0aGVTcGVjLCBCb29sZWFuIHRhcmdldElzRm9sZGVyLCBCb29sZWFuIHdhc0FsaWFzZWQpIil9LAogI2VuZGlmIC8qICFfX0xQNjRfXyAqLwotCXsiRlNOZXdBbGlhcyIsIChQeUNGdW5jdGlvbilGaWxlX0ZTTmV3QWxpYXMsIDEsCi0JIFB5RG9jX1NUUigiKEZTUmVmIGZyb21GaWxlLCBGU1JlZiB0YXJnZXQpIC0+IChBbGlhc0hhbmRsZSBpbkFsaWFzKSIpfSwKLQl7IkZTUmVzb2x2ZUFsaWFzRmlsZVdpdGhNb3VudEZsYWdzIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfRlNSZXNvbHZlQWxpYXNGaWxlV2l0aE1vdW50RmxhZ3MsIDEsCi0JIFB5RG9jX1NUUigiKEZTUmVmIHRoZVJlZiwgQm9vbGVhbiByZXNvbHZlQWxpYXNDaGFpbnMsIHVuc2lnbmVkIGxvbmcgbW91bnRGbGFncykgLT4gKEZTUmVmIHRoZVJlZiwgQm9vbGVhbiB0YXJnZXRJc0ZvbGRlciwgQm9vbGVhbiB3YXNBbGlhc2VkKSIpfSwKLQl7IkZTUmVzb2x2ZUFsaWFzRmlsZSIsIChQeUNGdW5jdGlvbilGaWxlX0ZTUmVzb2x2ZUFsaWFzRmlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoRlNSZWYgdGhlUmVmLCBCb29sZWFuIHJlc29sdmVBbGlhc0NoYWlucykgLT4gKEZTUmVmIHRoZVJlZiwgQm9vbGVhbiB0YXJnZXRJc0ZvbGRlciwgQm9vbGVhbiB3YXNBbGlhc2VkKSIpfSwKLQl7IkZTVXBkYXRlQWxpYXMiLCAoUHlDRnVuY3Rpb24pRmlsZV9GU1VwZGF0ZUFsaWFzLCAxLAotCSBQeURvY19TVFIoIihGU1JlZiBmcm9tRmlsZSwgRlNSZWYgdGFyZ2V0LCBBbGlhc0hhbmRsZSBhbGlhcykgLT4gKEJvb2xlYW4gd2FzQ2hhbmdlZCkiKX0sCi0JeyJwYXRobmFtZSIsIChQeUNGdW5jdGlvbilGaWxlX3BhdGhuYW1lLCAxLAotCSBQeURvY19TVFIoIihzdHJ8dW5pY29kZXxGU1NwZWN8RlNyZWYpIC0+IHBhdGhuYW1lIil9LAotCXtOVUxMLCBOVUxMLCAwfQorICAgIHsiRlNOZXdBbGlhcyIsIChQeUNGdW5jdGlvbilGaWxlX0ZTTmV3QWxpYXMsIDEsCisgICAgIFB5RG9jX1NUUigiKEZTUmVmIGZyb21GaWxlLCBGU1JlZiB0YXJnZXQpIC0+IChBbGlhc0hhbmRsZSBpbkFsaWFzKSIpfSwKKyAgICB7IkZTUmVzb2x2ZUFsaWFzRmlsZVdpdGhNb3VudEZsYWdzIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfRlNSZXNvbHZlQWxpYXNGaWxlV2l0aE1vdW50RmxhZ3MsIDEsCisgICAgIFB5RG9jX1NUUigiKEZTUmVmIHRoZVJlZiwgQm9vbGVhbiByZXNvbHZlQWxpYXNDaGFpbnMsIHVuc2lnbmVkIGxvbmcgbW91bnRGbGFncykgLT4gKEZTUmVmIHRoZVJlZiwgQm9vbGVhbiB0YXJnZXRJc0ZvbGRlciwgQm9vbGVhbiB3YXNBbGlhc2VkKSIpfSwKKyAgICB7IkZTUmVzb2x2ZUFsaWFzRmlsZSIsIChQeUNGdW5jdGlvbilGaWxlX0ZTUmVzb2x2ZUFsaWFzRmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRlNSZWYgdGhlUmVmLCBCb29sZWFuIHJlc29sdmVBbGlhc0NoYWlucykgLT4gKEZTUmVmIHRoZVJlZiwgQm9vbGVhbiB0YXJnZXRJc0ZvbGRlciwgQm9vbGVhbiB3YXNBbGlhc2VkKSIpfSwKKyAgICB7IkZTVXBkYXRlQWxpYXMiLCAoUHlDRnVuY3Rpb24pRmlsZV9GU1VwZGF0ZUFsaWFzLCAxLAorICAgICBQeURvY19TVFIoIihGU1JlZiBmcm9tRmlsZSwgRlNSZWYgdGFyZ2V0LCBBbGlhc0hhbmRsZSBhbGlhcykgLT4gKEJvb2xlYW4gd2FzQ2hhbmdlZCkiKX0sCisgICAgeyJwYXRobmFtZSIsIChQeUNGdW5jdGlvbilGaWxlX3BhdGhuYW1lLCAxLAorICAgICBQeURvY19TVFIoIihzdHJ8dW5pY29kZXxGU1NwZWN8RlNyZWYpIC0+IHBhdGhuYW1lIil9LAorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogCkBAIC0zMjUxLDE1OSArMzI1MSwxNTkgQEAKIGludAogUHlNYWNfR2V0RlNTcGVjKFB5T2JqZWN0ICp2LCBGU1NwZWMgKnNwZWMpCiB7Ci0gICAgICAgIFN0cjI1NSBwYXRoOwotICAgICAgICBzaG9ydCByZWZudW07Ci0gICAgICAgIGxvbmcgcGFyaWQ7Ci0gICAgICAgIE9TRXJyIGVycjsKLSAgICAgICAgRlNSZWYgZnNyOworICAgIFN0cjI1NSBwYXRoOworICAgIHNob3J0IHJlZm51bTsKKyAgICBsb25nIHBhcmlkOworICAgIE9TRXJyIGVycjsKKyAgICBGU1JlZiBmc3I7CiAKLSAgICAgICAgaWYgKEZTU3BlY19DaGVjayh2KSkgewotICAgICAgICAgICAgICAgICpzcGVjID0gKChGU1NwZWNPYmplY3QgKil2KS0+b2JfaXRzZWxmOwotICAgICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9CisgICAgaWYgKEZTU3BlY19DaGVjayh2KSkgeworICAgICAgICAqc3BlYyA9ICgoRlNTcGVjT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQogCi0gICAgICAgIGlmIChQeUFyZ19QYXJzZSh2LCAiKGhsTyYpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWZudW0sICZwYXJpZCwgUHlNYWNfR2V0U3RyMjU1LCAmcGF0aCkpIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBGU01ha2VGU1NwZWMocmVmbnVtLCBwYXJpZCwgcGF0aCwgc3BlYyk7Ci0gICAgICAgICAgICAgICAgaWYgKCBlcnIgJiYgZXJyICE9IGZuZkVyciApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0Vycm9yKGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgaWYgKFB5QXJnX1BhcnNlKHYsICIoaGxPJikiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVmbnVtLCAmcGFyaWQsIFB5TWFjX0dldFN0cjI1NSwgJnBhdGgpKSB7CisgICAgICAgIGVyciA9IEZTTWFrZUZTU3BlYyhyZWZudW0sIHBhcmlkLCBwYXRoLCBzcGVjKTsKKyAgICAgICAgaWYgKCBlcnIgJiYgZXJyICE9IGZuZkVyciApIHsKKyAgICAgICAgICAgIFB5TWFjX0Vycm9yKGVycik7CisgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgfQotICAgICAgICBQeUVycl9DbGVhcigpOwotICAgICAgICAvKiBPdGhlcndpc2Ugd2UgdHJ5IHRvIGdvIHZpYSBhbiBGU1JlZi4gT24gT1NYIHdlIGdvIGFsbCB0aGUgd2F5LAotICAgICAgICAqKiBvbiBPUzkgd2UgYWNjZXB0IG9ubHkgYSByZWFsIEZTUmVmIG9iamVjdAotICAgICAgICAqLwotICAgICAgICBpZiAoIFB5TWFjX0dldEZTUmVmKHYsICZmc3IpICkgewotICAgICAgICAgICAgICAgIGVyciA9IEZTR2V0Q2F0YWxvZ0luZm8oJmZzciwga0ZTQ2F0SW5mb05vbmUsIE5VTEwsIE5VTEwsIHNwZWMsIE5VTEwpOwotICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gbm9FcnIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0Vycm9yKGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBQeUVycl9DbGVhcigpOworICAgIC8qIE90aGVyd2lzZSB3ZSB0cnkgdG8gZ28gdmlhIGFuIEZTUmVmLiBPbiBPU1ggd2UgZ28gYWxsIHRoZSB3YXksCisgICAgKiogb24gT1M5IHdlIGFjY2VwdCBvbmx5IGEgcmVhbCBGU1JlZiBvYmplY3QKKyAgICAqLworICAgIGlmICggUHlNYWNfR2V0RlNSZWYodiwgJmZzcikgKSB7CisgICAgICAgIGVyciA9IEZTR2V0Q2F0YWxvZ0luZm8oJmZzciwga0ZTQ2F0SW5mb05vbmUsIE5VTEwsIE5VTEwsIHNwZWMsIE5VTEwpOworICAgICAgICBpZiAoZXJyICE9IG5vRXJyKSB7CisgICAgICAgICAgICBQeU1hY19FcnJvcihlcnIpOworICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICByZXR1cm4gMDsKIH0KICNlbmRpZiAvKiAhX19MUDY0X18gKi8KIAogaW50CiBQeU1hY19HZXRGU1JlZihQeU9iamVjdCAqdiwgRlNSZWYgKmZzcikKIHsKLSAgICAgICAgT1NTdGF0dXMgZXJyOworICAgIE9TU3RhdHVzIGVycjsKICNpZm5kZWYgX19MUDY0X18KLSAgICAgICAgRlNTcGVjIGZzczsKKyAgICBGU1NwZWMgZnNzOwogI2VuZGlmIC8qICFfX0xQNjRfXyAqLwogCi0gICAgICAgIGlmIChGU1JlZl9DaGVjayh2KSkgewotICAgICAgICAgICAgICAgICpmc3IgPSAoKEZTUmVmT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKLSAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQorICAgIGlmIChGU1JlZl9DaGVjayh2KSkgeworICAgICAgICAqZnNyID0gKChGU1JlZk9iamVjdCAqKXYpLT5vYl9pdHNlbGY7CisgICAgICAgIHJldHVybiAxOworICAgIH0KIAotICAgICAgICAvKiBPbiBPU1ggd2Ugbm93IHRyeSBhIHBhdGhuYW1lICovCi0gICAgICAgIGlmICggUHlTdHJpbmdfQ2hlY2sodikgfHwgUHlVbmljb2RlX0NoZWNrKHYpKSB7Ci0gICAgICAgICAgICAgICAgY2hhciAqcGF0aCA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgaWYgKCFQeUFyZ19QYXJzZSh2LCAiZXQiLCBQeV9GaWxlU3lzdGVtRGVmYXVsdEVuY29kaW5nLCAmcGF0aCkpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgICAgICBpZiAoIChlcnI9RlNQYXRoTWFrZVJlZigodW5zaWduZWQgY2hhciopcGF0aCwgZnNyLCBOVUxMKSkgKQotICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfRXJyb3IoZXJyKTsKLSAgICAgICAgICAgICAgICBQeU1lbV9GcmVlKHBhdGgpOwotICAgICAgICAgICAgICAgIHJldHVybiAhZXJyOwotICAgICAgICB9Ci0gICAgICAgIC8qIFhYWFggU2hvdWxkIHRyeSB1bmljb2RlIGhlcmUgdG9vICovCisgICAgLyogT24gT1NYIHdlIG5vdyB0cnkgYSBwYXRobmFtZSAqLworICAgIGlmICggUHlTdHJpbmdfQ2hlY2sodikgfHwgUHlVbmljb2RlX0NoZWNrKHYpKSB7CisgICAgICAgIGNoYXIgKnBhdGggPSBOVUxMOworICAgICAgICBpZiAoIVB5QXJnX1BhcnNlKHYsICJldCIsIFB5X0ZpbGVTeXN0ZW1EZWZhdWx0RW5jb2RpbmcsICZwYXRoKSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBpZiAoIChlcnI9RlNQYXRoTWFrZVJlZigodW5zaWduZWQgY2hhciopcGF0aCwgZnNyLCBOVUxMKSkgKQorICAgICAgICAgICAgUHlNYWNfRXJyb3IoZXJyKTsKKyAgICAgICAgUHlNZW1fRnJlZShwYXRoKTsKKyAgICAgICAgcmV0dXJuICFlcnI7CisgICAgfQorICAgIC8qIFhYWFggU2hvdWxkIHRyeSB1bmljb2RlIGhlcmUgdG9vICovCiAKICNpZm5kZWYgX19MUDY0X18KLSAgICAgICAgLyogT3RoZXJ3aXNlIHdlIHRyeSB0byBnbyB2aWEgYW4gRlNTcGVjICovCi0gICAgICAgIGlmIChGU1NwZWNfQ2hlY2sodikpIHsKLSAgICAgICAgICAgICAgICBmc3MgPSAoKEZTU3BlY09iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0gICAgICAgICAgICAgICAgaWYgKChlcnI9RlNwTWFrZUZTUmVmKCZmc3MsIGZzcikpID09IDApCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgICAgICAgICBQeU1hY19FcnJvcihlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0jZW5kaWYgLyogIV9fTFA2NF9fICovCi0KLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkZTUmVmLCBGU1NwZWMgb3IgcGF0aG5hbWUgcmVxdWlyZWQiKTsKKyAgICAvKiBPdGhlcndpc2Ugd2UgdHJ5IHRvIGdvIHZpYSBhbiBGU1NwZWMgKi8KKyAgICBpZiAoRlNTcGVjX0NoZWNrKHYpKSB7CisgICAgICAgIGZzcyA9ICgoRlNTcGVjT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKKyAgICAgICAgaWYgKChlcnI9RlNwTWFrZUZTUmVmKCZmc3MsIGZzcikpID09IDApCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgUHlNYWNfRXJyb3IoZXJyKTsKICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorI2VuZGlmIC8qICFfX0xQNjRfXyAqLworCisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkZTUmVmLCBGU1NwZWMgb3IgcGF0aG5hbWUgcmVxdWlyZWQiKTsKKyAgICByZXR1cm4gMDsKIH0KIAogI2lmbmRlZiBfX0xQNjRfXwogZXh0ZXJuIFB5T2JqZWN0ICoKIFB5TWFjX0J1aWxkRlNTcGVjKEZTU3BlYyAqc3BlYykKIHsKLSAgICAgICAgcmV0dXJuIEZTU3BlY19OZXcoc3BlYyk7CisgICAgcmV0dXJuIEZTU3BlY19OZXcoc3BlYyk7CiB9CiAjZW5kaWYgLyogIV9fTFA2NF9fICovCiAKIGV4dGVybiBQeU9iamVjdCAqCiBQeU1hY19CdWlsZEZTUmVmKEZTUmVmICpzcGVjKQogewotICAgICAgICByZXR1cm4gRlNSZWZfTmV3KHNwZWMpOworICAgIHJldHVybiBGU1JlZl9OZXcoc3BlYyk7CiB9CiAKIAogdm9pZCBpbml0X0ZpbGUodm9pZCkKIHsKLQlQeU9iamVjdCAqbTsKLQlQeU9iamVjdCAqZDsKKyAgICBQeU9iamVjdCAqbTsKKyAgICBQeU9iamVjdCAqZDsKIAogCiAjaWZuZGVmIF9fTFA2NF9fCi0JUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoRlNTcGVjICosIFB5TWFjX0J1aWxkRlNTcGVjKTsKLQlQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoRlNTcGVjLCBQeU1hY19HZXRGU1NwZWMpOworICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKEZTU3BlYyAqLCBQeU1hY19CdWlsZEZTU3BlYyk7CisgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKEZTU3BlYywgUHlNYWNfR2V0RlNTcGVjKTsKICNlbmRpZiAvKiAhX19MUDY0X18gKi8KIAotCVB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKEZTUmVmICosIFB5TWFjX0J1aWxkRlNSZWYpOwotCVB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChGU1JlZiwgUHlNYWNfR2V0RlNSZWYpOworICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKEZTUmVmICosIFB5TWFjX0J1aWxkRlNSZWYpOworICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChGU1JlZiwgUHlNYWNfR2V0RlNSZWYpOwogCiAKLQltID0gUHlfSW5pdE1vZHVsZSgiX0ZpbGUiLCBGaWxlX21ldGhvZHMpOwotCWQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOwotCUZpbGVfRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOwotCWlmIChGaWxlX0Vycm9yID09IE5VTEwgfHwKLQkgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVycm9yIiwgRmlsZV9FcnJvcikgIT0gMCkKLQkJcmV0dXJuOwotCUZTQ2F0YWxvZ0luZm9fVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCWlmIChQeVR5cGVfUmVhZHkoJkZTQ2F0YWxvZ0luZm9fVHlwZSkgPCAwKSByZXR1cm47Ci0JUHlfSU5DUkVGKCZGU0NhdGFsb2dJbmZvX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiRlNDYXRhbG9nSW5mbyIsIChQeU9iamVjdCAqKSZGU0NhdGFsb2dJbmZvX1R5cGUpOwotCS8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLwotCVB5X0lOQ1JFRigmRlNDYXRhbG9nSW5mb19UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkZTQ2F0YWxvZ0luZm9UeXBlIiwgKFB5T2JqZWN0ICopJkZTQ2F0YWxvZ0luZm9fVHlwZSk7CisgICAgbSA9IFB5X0luaXRNb2R1bGUoIl9GaWxlIiwgRmlsZV9tZXRob2RzKTsKKyAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICBGaWxlX0Vycm9yID0gUHlNYWNfR2V0T1NFcnJFeGNlcHRpb24oKTsKKyAgICBpZiAoRmlsZV9FcnJvciA9PSBOVUxMIHx8CisgICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFcnJvciIsIEZpbGVfRXJyb3IpICE9IDApCisgICAgICAgIHJldHVybjsKKyAgICBGU0NhdGFsb2dJbmZvX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZGU0NhdGFsb2dJbmZvX1R5cGUpIDwgMCkgcmV0dXJuOworICAgIFB5X0lOQ1JFRigmRlNDYXRhbG9nSW5mb19UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkZTQ2F0YWxvZ0luZm8iLCAoUHlPYmplY3QgKikmRlNDYXRhbG9nSW5mb19UeXBlKTsKKyAgICAvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KKyAgICBQeV9JTkNSRUYoJkZTQ2F0YWxvZ0luZm9fVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJGU0NhdGFsb2dJbmZvVHlwZSIsIChQeU9iamVjdCAqKSZGU0NhdGFsb2dJbmZvX1R5cGUpOwogCiAjaWZuZGVmIF9fTFA2NF9fCi0JRkluZm9fVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCWlmIChQeVR5cGVfUmVhZHkoJkZJbmZvX1R5cGUpIDwgMCkgcmV0dXJuOwotCVB5X0lOQ1JFRigmRkluZm9fVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJGSW5mbyIsIChQeU9iamVjdCAqKSZGSW5mb19UeXBlKTsKLQkvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KLQlQeV9JTkNSRUYoJkZJbmZvX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiRkluZm9UeXBlIiwgKFB5T2JqZWN0ICopJkZJbmZvX1R5cGUpOworICAgIEZJbmZvX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZGSW5mb19UeXBlKSA8IDApIHJldHVybjsKKyAgICBQeV9JTkNSRUYoJkZJbmZvX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiRkluZm8iLCAoUHlPYmplY3QgKikmRkluZm9fVHlwZSk7CisgICAgLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCisgICAgUHlfSU5DUkVGKCZGSW5mb19UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkZJbmZvVHlwZSIsIChQeU9iamVjdCAqKSZGSW5mb19UeXBlKTsKICNlbmRpZiAvKiAhX19MUDY0X18gKi8KLQlBbGlhc19UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmQWxpYXNfVHlwZSkgPCAwKSByZXR1cm47Ci0JUHlfSU5DUkVGKCZBbGlhc19UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkFsaWFzIiwgKFB5T2JqZWN0ICopJkFsaWFzX1R5cGUpOwotCS8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLwotCVB5X0lOQ1JFRigmQWxpYXNfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJBbGlhc1R5cGUiLCAoUHlPYmplY3QgKikmQWxpYXNfVHlwZSk7CisgICAgQWxpYXNfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJkFsaWFzX1R5cGUpIDwgMCkgcmV0dXJuOworICAgIFB5X0lOQ1JFRigmQWxpYXNfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJBbGlhcyIsIChQeU9iamVjdCAqKSZBbGlhc19UeXBlKTsKKyAgICAvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KKyAgICBQeV9JTkNSRUYoJkFsaWFzX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiQWxpYXNUeXBlIiwgKFB5T2JqZWN0ICopJkFsaWFzX1R5cGUpOwogCiAjaWZuZGVmIF9fTFA2NF9fCi0JRlNTcGVjX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKLQlpZiAoUHlUeXBlX1JlYWR5KCZGU1NwZWNfVHlwZSkgPCAwKSByZXR1cm47Ci0JUHlfSU5DUkVGKCZGU1NwZWNfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJGU1NwZWMiLCAoUHlPYmplY3QgKikmRlNTcGVjX1R5cGUpOwotCS8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLwotCVB5X0lOQ1JFRigmRlNTcGVjX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiRlNTcGVjVHlwZSIsIChQeU9iamVjdCAqKSZGU1NwZWNfVHlwZSk7CisgICAgRlNTcGVjX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZGU1NwZWNfVHlwZSkgPCAwKSByZXR1cm47CisgICAgUHlfSU5DUkVGKCZGU1NwZWNfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJGU1NwZWMiLCAoUHlPYmplY3QgKikmRlNTcGVjX1R5cGUpOworICAgIC8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLworICAgIFB5X0lOQ1JFRigmRlNTcGVjX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiRlNTcGVjVHlwZSIsIChQeU9iamVjdCAqKSZGU1NwZWNfVHlwZSk7CiAjZW5kaWYgLyogIV9fTFA2NF9fICovCi0JRlNSZWZfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCWlmIChQeVR5cGVfUmVhZHkoJkZTUmVmX1R5cGUpIDwgMCkgcmV0dXJuOwotCVB5X0lOQ1JFRigmRlNSZWZfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJGU1JlZiIsIChQeU9iamVjdCAqKSZGU1JlZl9UeXBlKTsKLQkvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KLQlQeV9JTkNSRUYoJkZTUmVmX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiRlNSZWZUeXBlIiwgKFB5T2JqZWN0ICopJkZTUmVmX1R5cGUpOworICAgIEZTUmVmX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZGU1JlZl9UeXBlKSA8IDApIHJldHVybjsKKyAgICBQeV9JTkNSRUYoJkZTUmVmX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiRlNSZWYiLCAoUHlPYmplY3QgKikmRlNSZWZfVHlwZSk7CisgICAgLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCisgICAgUHlfSU5DUkVGKCZGU1JlZl9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkZTUmVmVHlwZSIsIChQeU9iamVjdCAqKSZGU1JlZl9UeXBlKTsKIH0KIAogLyogPT09PT09PT09PT09PT09PT09PT09PT09IEVuZCBtb2R1bGUgX0ZpbGUgPT09PT09PT09PT09PT09PT09PT09PT09ICovCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9mbS9fRm1tb2R1bGUuYyBiL01hYy9Nb2R1bGVzL2ZtL19GbW1vZHVsZS5jCmluZGV4IGI5ODJjYzMuLmFkYzQ3YWEgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL2ZtL19GbW1vZHVsZS5jCisrKyBiL01hYy9Nb2R1bGVzL2ZtL19GbW1vZHVsZS5jCkBAIC0xMCw5ICsxMCw5IEBACiAKIC8qIE1hY3JvIHRvIHRlc3Qgd2hldGhlciBhIHdlYWstbG9hZGVkIENGTSBmdW5jdGlvbiBleGlzdHMgKi8KICNkZWZpbmUgUHlNYWNfUFJFQ0hFQ0socnRuKSBkbyB7IGlmICggJnJ0biA9PSBOVUxMICkgIHtcCi0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yLCBcCi0gICAgICAgICJOb3QgYXZhaWxhYmxlIGluIHRoaXMgc2hhcmVkIGxpYnJhcnkvT1MgdmVyc2lvbiIpOyBcCi0gICAgICAgIHJldHVybiBOVUxMOyBcCisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsIFwKKyAgICAiTm90IGF2YWlsYWJsZSBpbiB0aGlzIHNoYXJlZCBsaWJyYXJ5L09TIHZlcnNpb24iKTsgXAorICAgIHJldHVybiBOVUxMOyBcCiAgICAgfX0gd2hpbGUoMCkKIAogCkBAIC0yNiwxMiArMjYsMTIgQEAKIEZNUmVjX05ldyhGTWV0cmljUmVjICppdHNlbGYpCiB7CiAKLSAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mTyZPJk8mTyYiLAotICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRml4ZWQsIGl0c2VsZi0+YXNjZW50LAotICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRml4ZWQsIGl0c2VsZi0+ZGVzY2VudCwKLSAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBpdHNlbGYtPmxlYWRpbmcsCi0gICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGaXhlZCwgaXRzZWxmLT53aWRNYXgsCi0gICAgICAgICAgICAgICAgUmVzT2JqX05ldywgaXRzZWxmLT53VGFiSGFuZGxlKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyZPJk8mTyZPJiIsCisgICAgICAgIFB5TWFjX0J1aWxkRml4ZWQsIGl0c2VsZi0+YXNjZW50LAorICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBpdHNlbGYtPmRlc2NlbnQsCisgICAgICAgIFB5TWFjX0J1aWxkRml4ZWQsIGl0c2VsZi0+bGVhZGluZywKKyAgICAgICAgUHlNYWNfQnVpbGRGaXhlZCwgaXRzZWxmLT53aWRNYXgsCisgICAgICAgIFJlc09ial9OZXcsIGl0c2VsZi0+d1RhYkhhbmRsZSk7CiB9CiAKICNpZiAwCkBAIC0zOSwxMiArMzksMTIgQEAKIHN0YXRpYyBpbnQKIEZNUmVjX0NvbnZlcnQoUHlPYmplY3QgKnYsIEZNZXRyaWNSZWMgKnBfaXRzZWxmKQogewotICAgICAgICByZXR1cm4gUHlBcmdfUGFyc2VUdXBsZSh2LCAiTyZPJk8mTyZPJiIsCi0gICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZpdHNlbGYtPmFzY2VudCwKLSAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJml0c2VsZi0+ZGVzY2VudCwKLSAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJml0c2VsZi0+bGVhZGluZywKLSAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJml0c2VsZi0+d2lkTWF4LAotICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaXRzZWxmLT53VGFiSGFuZGxlKTsKKyAgICByZXR1cm4gUHlBcmdfUGFyc2VUdXBsZSh2LCAiTyZPJk8mTyZPJiIsCisgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmaXRzZWxmLT5hc2NlbnQsCisgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmaXRzZWxmLT5kZXNjZW50LAorICAgICAgICBQeU1hY19HZXRGaXhlZCwgJml0c2VsZi0+bGVhZGluZywKKyAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZpdHNlbGYtPndpZE1heCwKKyAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZpdHNlbGYtPndUYWJIYW5kbGUpOwogfQogI2VuZGlmCiAKQEAgLTUzLDMxNCArNTMsMzE0IEBACiAKIHN0YXRpYyBQeU9iamVjdCAqRm1fR2V0Rm9udE5hbWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IGZhbWlseUlEOwotCVN0cjI1NSBuYW1lOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBmYW1pbHlJRDsKKyAgICBTdHIyNTUgbmFtZTsKICNpZm5kZWYgR2V0Rm9udE5hbWUKLQlQeU1hY19QUkVDSEVDSyhHZXRGb250TmFtZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0Rm9udE5hbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZmYW1pbHlJRCkpCi0JCXJldHVybiBOVUxMOwotCUdldEZvbnROYW1lKGZhbWlseUlELAotCSAgICAgICAgICAgIG5hbWUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRTdHIyNTUsIG5hbWUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmFtaWx5SUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRGb250TmFtZShmYW1pbHlJRCwKKyAgICAgICAgICAgICAgICBuYW1lKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkU3RyMjU1LCBuYW1lKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGbV9HZXRGTnVtKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTdHIyNTUgbmFtZTsKLQlzaG9ydCBmYW1pbHlJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgU3RyMjU1IG5hbWU7CisgICAgc2hvcnQgZmFtaWx5SUQ7CiAjaWZuZGVmIEdldEZOdW0KLQlQeU1hY19QUkVDSEVDSyhHZXRGTnVtKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRGTnVtKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBuYW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0Rk51bShuYW1lLAotCSAgICAgICAgJmZhbWlseUlEKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgZmFtaWx5SUQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBuYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0Rk51bShuYW1lLAorICAgICAgICAmZmFtaWx5SUQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmYW1pbHlJRCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRm1fUmVhbEZvbnQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCXNob3J0IGZvbnROdW07Ci0Jc2hvcnQgc2l6ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgc2hvcnQgZm9udE51bTsKKyAgICBzaG9ydCBzaXplOwogI2lmbmRlZiBSZWFsRm9udAotCVB5TWFjX1BSRUNIRUNLKFJlYWxGb250KTsKKyAgICBQeU1hY19QUkVDSEVDSyhSZWFsRm9udCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZmb250TnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFJlYWxGb250KGZvbnROdW0sCi0JICAgICAgICAgICAgICAgc2l6ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZm9udE51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBSZWFsRm9udChmb250TnVtLAorICAgICAgICAgICAgICAgICAgIHNpemUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZtX1NldEZTY2FsZURpc2FibGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gZnNjYWxlRGlzYWJsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBmc2NhbGVEaXNhYmxlOwogI2lmbmRlZiBTZXRGU2NhbGVEaXNhYmxlCi0JUHlNYWNfUFJFQ0hFQ0soU2V0RlNjYWxlRGlzYWJsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0RlNjYWxlRGlzYWJsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZzY2FsZURpc2FibGUpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRGU2NhbGVEaXNhYmxlKGZzY2FsZURpc2FibGUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZzY2FsZURpc2FibGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRGU2NhbGVEaXNhYmxlKGZzY2FsZURpc2FibGUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGbV9Gb250TWV0cmljcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JRk1ldHJpY1JlYyB0aGVNZXRyaWNzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBGTWV0cmljUmVjIHRoZU1ldHJpY3M7CiAjaWZuZGVmIEZvbnRNZXRyaWNzCi0JUHlNYWNfUFJFQ0hFQ0soRm9udE1ldHJpY3MpOworICAgIFB5TWFjX1BSRUNIRUNLKEZvbnRNZXRyaWNzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlGb250TWV0cmljcygmdGhlTWV0cmljcyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBGTVJlY19OZXcsICZ0aGVNZXRyaWNzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgRm9udE1ldHJpY3MoJnRoZU1ldHJpY3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRk1SZWNfTmV3LCAmdGhlTWV0cmljcyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRm1fU2V0RnJhY3RFbmFibGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gZnJhY3RFbmFibGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gZnJhY3RFbmFibGU7CiAjaWZuZGVmIFNldEZyYWN0RW5hYmxlCi0JUHlNYWNfUFJFQ0hFQ0soU2V0RnJhY3RFbmFibGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldEZyYWN0RW5hYmxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZnJhY3RFbmFibGUpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRGcmFjdEVuYWJsZShmcmFjdEVuYWJsZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZnJhY3RFbmFibGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRGcmFjdEVuYWJsZShmcmFjdEVuYWJsZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZtX0dldERlZkZvbnRTaXplKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IF9ydjsKICNpZm5kZWYgR2V0RGVmRm9udFNpemUKLQlQeU1hY19QUkVDSEVDSyhHZXREZWZGb250U2l6ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0RGVmRm9udFNpemUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldERlZkZvbnRTaXplKCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldERlZkZvbnRTaXplKCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRm1fSXNPdXRsaW5lKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlQb2ludCBudW1lcjsKLQlQb2ludCBkZW5vbTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgUG9pbnQgbnVtZXI7CisgICAgUG9pbnQgZGVub207CiAjaWZuZGVmIElzT3V0bGluZQotCVB5TWFjX1BSRUNIRUNLKElzT3V0bGluZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSXNPdXRsaW5lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJm51bWVyLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJmRlbm9tKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gSXNPdXRsaW5lKG51bWVyLAotCSAgICAgICAgICAgICAgICBkZW5vbSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmbnVtZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmZGVub20pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBJc091dGxpbmUobnVtZXIsCisgICAgICAgICAgICAgICAgICAgIGRlbm9tKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGbV9TZXRPdXRsaW5lUHJlZmVycmVkKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIG91dGxpbmVQcmVmZXJyZWQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gb3V0bGluZVByZWZlcnJlZDsKICNpZm5kZWYgU2V0T3V0bGluZVByZWZlcnJlZAotCVB5TWFjX1BSRUNIRUNLKFNldE91dGxpbmVQcmVmZXJyZWQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldE91dGxpbmVQcmVmZXJyZWQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZvdXRsaW5lUHJlZmVycmVkKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0T3V0bGluZVByZWZlcnJlZChvdXRsaW5lUHJlZmVycmVkKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRsaW5lUHJlZmVycmVkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0T3V0bGluZVByZWZlcnJlZChvdXRsaW5lUHJlZmVycmVkKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRm1fR2V0T3V0bGluZVByZWZlcnJlZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OwogI2lmbmRlZiBHZXRPdXRsaW5lUHJlZmVycmVkCi0JUHlNYWNfUFJFQ0hFQ0soR2V0T3V0bGluZVByZWZlcnJlZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0T3V0bGluZVByZWZlcnJlZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0T3V0bGluZVByZWZlcnJlZCgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRPdXRsaW5lUHJlZmVycmVkKCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRm1fU2V0UHJlc2VydmVHbHlwaChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBwcmVzZXJ2ZUdseXBoOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIHByZXNlcnZlR2x5cGg7CiAjaWZuZGVmIFNldFByZXNlcnZlR2x5cGgKLQlQeU1hY19QUkVDSEVDSyhTZXRQcmVzZXJ2ZUdseXBoKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRQcmVzZXJ2ZUdseXBoKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcHJlc2VydmVHbHlwaCkpCi0JCXJldHVybiBOVUxMOwotCVNldFByZXNlcnZlR2x5cGgocHJlc2VydmVHbHlwaCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJlc2VydmVHbHlwaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldFByZXNlcnZlR2x5cGgocHJlc2VydmVHbHlwaCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZtX0dldFByZXNlcnZlR2x5cGgoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKICNpZm5kZWYgR2V0UHJlc2VydmVHbHlwaAotCVB5TWFjX1BSRUNIRUNLKEdldFByZXNlcnZlR2x5cGgpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFByZXNlcnZlR2x5cGgpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFByZXNlcnZlR2x5cGgoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0UHJlc2VydmVHbHlwaCgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZtX0dldFN5c0ZvbnQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgX3J2OwogI2lmbmRlZiBHZXRTeXNGb250Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0U3lzRm9udCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0U3lzRm9udCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0U3lzRm9udCgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRTeXNGb250KCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRm1fR2V0QXBwRm9udChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBfcnY7CiAjaWZuZGVmIEdldEFwcEZvbnQKLQlQeU1hY19QUkVDSEVDSyhHZXRBcHBGb250KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRBcHBGb250KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRBcHBGb250KCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldEFwcEZvbnQoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGbV9RRFRleHRCb3VuZHMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWNoYXIgKmluVGV4dF9faW5fXzsKLQlpbnQgaW5UZXh0X19sZW5fXzsKLQlpbnQgaW5UZXh0X19pbl9sZW5fXzsKLQlSZWN0IGJvdW5kczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgY2hhciAqaW5UZXh0X19pbl9fOworICAgIGludCBpblRleHRfX2xlbl9fOworICAgIGludCBpblRleHRfX2luX2xlbl9fOworICAgIFJlY3QgYm91bmRzOwogI2lmbmRlZiBRRFRleHRCb3VuZHMKLQlQeU1hY19QUkVDSEVDSyhRRFRleHRCb3VuZHMpOworICAgIFB5TWFjX1BSRUNIRUNLKFFEVGV4dEJvdW5kcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzIyIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpblRleHRfX2luX18sICZpblRleHRfX2luX2xlbl9fKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaW5UZXh0X19sZW5fXyA9IGluVGV4dF9faW5fbGVuX187Ci0JUURUZXh0Qm91bmRzKGluVGV4dF9fbGVuX18sIGluVGV4dF9faW5fXywKLQkgICAgICAgICAgICAgJmJvdW5kcyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZib3VuZHMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInMjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluVGV4dF9faW5fXywgJmluVGV4dF9faW5fbGVuX18pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpblRleHRfX2xlbl9fID0gaW5UZXh0X19pbl9sZW5fXzsKKyAgICBRRFRleHRCb3VuZHMoaW5UZXh0X19sZW5fXywgaW5UZXh0X19pbl9fLAorICAgICAgICAgICAgICAgICAmYm91bmRzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmJvdW5kcyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBGbV9tZXRob2RzW10gPSB7Ci0JeyJHZXRGb250TmFtZSIsIChQeUNGdW5jdGlvbilGbV9HZXRGb250TmFtZSwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgZmFtaWx5SUQpIC0+IChTdHIyNTUgbmFtZSkiKX0sCi0JeyJHZXRGTnVtIiwgKFB5Q0Z1bmN0aW9uKUZtX0dldEZOdW0sIDEsCi0JIFB5RG9jX1NUUigiKFN0cjI1NSBuYW1lKSAtPiAoc2hvcnQgZmFtaWx5SUQpIil9LAotCXsiUmVhbEZvbnQiLCAoUHlDRnVuY3Rpb24pRm1fUmVhbEZvbnQsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGZvbnROdW0sIHNob3J0IHNpemUpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJTZXRGU2NhbGVEaXNhYmxlIiwgKFB5Q0Z1bmN0aW9uKUZtX1NldEZTY2FsZURpc2FibGUsIDEsCi0JIFB5RG9jX1NUUigiKEJvb2xlYW4gZnNjYWxlRGlzYWJsZSkgLT4gTm9uZSIpfSwKLQl7IkZvbnRNZXRyaWNzIiwgKFB5Q0Z1bmN0aW9uKUZtX0ZvbnRNZXRyaWNzLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChGTWV0cmljUmVjIHRoZU1ldHJpY3MpIil9LAotCXsiU2V0RnJhY3RFbmFibGUiLCAoUHlDRnVuY3Rpb24pRm1fU2V0RnJhY3RFbmFibGUsIDEsCi0JIFB5RG9jX1NUUigiKEJvb2xlYW4gZnJhY3RFbmFibGUpIC0+IE5vbmUiKX0sCi0JeyJHZXREZWZGb250U2l6ZSIsIChQeUNGdW5jdGlvbilGbV9HZXREZWZGb250U2l6ZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgX3J2KSIpfSwKLQl7IklzT3V0bGluZSIsIChQeUNGdW5jdGlvbilGbV9Jc091dGxpbmUsIDEsCi0JIFB5RG9jX1NUUigiKFBvaW50IG51bWVyLCBQb2ludCBkZW5vbSkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IlNldE91dGxpbmVQcmVmZXJyZWQiLCAoUHlDRnVuY3Rpb24pRm1fU2V0T3V0bGluZVByZWZlcnJlZCwgMSwKLQkgUHlEb2NfU1RSKCIoQm9vbGVhbiBvdXRsaW5lUHJlZmVycmVkKSAtPiBOb25lIil9LAotCXsiR2V0T3V0bGluZVByZWZlcnJlZCIsIChQeUNGdW5jdGlvbilGbV9HZXRPdXRsaW5lUHJlZmVycmVkLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJTZXRQcmVzZXJ2ZUdseXBoIiwgKFB5Q0Z1bmN0aW9uKUZtX1NldFByZXNlcnZlR2x5cGgsIDEsCi0JIFB5RG9jX1NUUigiKEJvb2xlYW4gcHJlc2VydmVHbHlwaCkgLT4gTm9uZSIpfSwKLQl7IkdldFByZXNlcnZlR2x5cGgiLCAoUHlDRnVuY3Rpb24pRm1fR2V0UHJlc2VydmVHbHlwaCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiR2V0U3lzRm9udCIsIChQeUNGdW5jdGlvbilGbV9HZXRTeXNGb250LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChzaG9ydCBfcnYpIil9LAotCXsiR2V0QXBwRm9udCIsIChQeUNGdW5jdGlvbilGbV9HZXRBcHBGb250LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChzaG9ydCBfcnYpIil9LAotCXsiUURUZXh0Qm91bmRzIiwgKFB5Q0Z1bmN0aW9uKUZtX1FEVGV4dEJvdW5kcywgMSwKLQkgUHlEb2NfU1RSKCIoQnVmZmVyIGluVGV4dCkgLT4gKFJlY3QgYm91bmRzKSIpfSwKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7IkdldEZvbnROYW1lIiwgKFB5Q0Z1bmN0aW9uKUZtX0dldEZvbnROYW1lLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBmYW1pbHlJRCkgLT4gKFN0cjI1NSBuYW1lKSIpfSwKKyAgICB7IkdldEZOdW0iLCAoUHlDRnVuY3Rpb24pRm1fR2V0Rk51bSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU3RyMjU1IG5hbWUpIC0+IChzaG9ydCBmYW1pbHlJRCkiKX0sCisgICAgeyJSZWFsRm9udCIsIChQeUNGdW5jdGlvbilGbV9SZWFsRm9udCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgZm9udE51bSwgc2hvcnQgc2l6ZSkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IlNldEZTY2FsZURpc2FibGUiLCAoUHlDRnVuY3Rpb24pRm1fU2V0RlNjYWxlRGlzYWJsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQm9vbGVhbiBmc2NhbGVEaXNhYmxlKSAtPiBOb25lIil9LAorICAgIHsiRm9udE1ldHJpY3MiLCAoUHlDRnVuY3Rpb24pRm1fRm9udE1ldHJpY3MsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEZNZXRyaWNSZWMgdGhlTWV0cmljcykiKX0sCisgICAgeyJTZXRGcmFjdEVuYWJsZSIsIChQeUNGdW5jdGlvbilGbV9TZXRGcmFjdEVuYWJsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQm9vbGVhbiBmcmFjdEVuYWJsZSkgLT4gTm9uZSIpfSwKKyAgICB7IkdldERlZkZvbnRTaXplIiwgKFB5Q0Z1bmN0aW9uKUZtX0dldERlZkZvbnRTaXplLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChzaG9ydCBfcnYpIil9LAorICAgIHsiSXNPdXRsaW5lIiwgKFB5Q0Z1bmN0aW9uKUZtX0lzT3V0bGluZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgbnVtZXIsIFBvaW50IGRlbm9tKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiU2V0T3V0bGluZVByZWZlcnJlZCIsIChQeUNGdW5jdGlvbilGbV9TZXRPdXRsaW5lUHJlZmVycmVkLCAxLAorICAgICBQeURvY19TVFIoIihCb29sZWFuIG91dGxpbmVQcmVmZXJyZWQpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRPdXRsaW5lUHJlZmVycmVkIiwgKFB5Q0Z1bmN0aW9uKUZtX0dldE91dGxpbmVQcmVmZXJyZWQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IlNldFByZXNlcnZlR2x5cGgiLCAoUHlDRnVuY3Rpb24pRm1fU2V0UHJlc2VydmVHbHlwaCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQm9vbGVhbiBwcmVzZXJ2ZUdseXBoKSAtPiBOb25lIil9LAorICAgIHsiR2V0UHJlc2VydmVHbHlwaCIsIChQeUNGdW5jdGlvbilGbV9HZXRQcmVzZXJ2ZUdseXBoLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJHZXRTeXNGb250IiwgKFB5Q0Z1bmN0aW9uKUZtX0dldFN5c0ZvbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKHNob3J0IF9ydikiKX0sCisgICAgeyJHZXRBcHBGb250IiwgKFB5Q0Z1bmN0aW9uKUZtX0dldEFwcEZvbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKHNob3J0IF9ydikiKX0sCisgICAgeyJRRFRleHRCb3VuZHMiLCAoUHlDRnVuY3Rpb24pRm1fUURUZXh0Qm91bmRzLCAxLAorICAgICBQeURvY19TVFIoIihCdWZmZXIgaW5UZXh0KSAtPiAoUmVjdCBib3VuZHMpIil9LAorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogI2Vsc2UgIC8qIF9fTFA2NF9fICovCiAKIHN0YXRpYyBQeU1ldGhvZERlZiBGbV9tZXRob2RzW10gPSB7Ci0Je05VTEwsIE5VTEwsIDB9CisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAjZW5kaWYgIC8qIF9fTFA2NF9fICovCiAKIHZvaWQgaW5pdF9GbSh2b2lkKQogewotCVB5T2JqZWN0ICptOworICAgIFB5T2JqZWN0ICptOwogI2lmbmRlZiBfX0xQNjRfXwotCVB5T2JqZWN0ICpkOworICAgIFB5T2JqZWN0ICpkOwogI2VuZGlmICAvKiBfX0xQNjRfXyAqLwogCiAKIAogCi0JbSA9IFB5X0luaXRNb2R1bGUoIl9GbSIsIEZtX21ldGhvZHMpOworICAgIG0gPSBQeV9Jbml0TW9kdWxlKCJfRm0iLCBGbV9tZXRob2RzKTsKICNpZm5kZWYgX19MUDY0X18KLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQlGbV9FcnJvciA9IFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCk7Ci0JaWYgKEZtX0Vycm9yID09IE5VTEwgfHwKLQkgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVycm9yIiwgRm1fRXJyb3IpICE9IDApCi0JCXJldHVybjsKKyAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICBGbV9FcnJvciA9IFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCk7CisgICAgaWYgKEZtX0Vycm9yID09IE5VTEwgfHwKKyAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVycm9yIiwgRm1fRXJyb3IpICE9IDApCisgICAgICAgIHJldHVybjsKICNlbmRpZiAgLyogX19MUDY0X18gKi8KIH0KIApkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvZm9sZGVyL19Gb2xkZXJtb2R1bGUuYyBiL01hYy9Nb2R1bGVzL2ZvbGRlci9fRm9sZGVybW9kdWxlLmMKaW5kZXggMDM1ZGFiOC4uMTA1OTdmNSAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvZm9sZGVyL19Gb2xkZXJtb2R1bGUuYworKysgYi9NYWMvTW9kdWxlcy9mb2xkZXIvX0ZvbGRlcm1vZHVsZS5jCkBAIC05LDkgKzksOSBAQAogCiAvKiBNYWNybyB0byB0ZXN0IHdoZXRoZXIgYSB3ZWFrLWxvYWRlZCBDRk0gZnVuY3Rpb24gZXhpc3RzICovCiAjZGVmaW5lIFB5TWFjX1BSRUNIRUNLKHJ0bikgZG8geyBpZiAoICZydG4gPT0gTlVMTCApICB7XAotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgXAotICAgICAgICAiTm90IGF2YWlsYWJsZSBpbiB0aGlzIHNoYXJlZCBsaWJyYXJ5L09TIHZlcnNpb24iKTsgXAotICAgICAgICByZXR1cm4gTlVMTDsgXAorICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yLCBcCisgICAgIk5vdCBhdmFpbGFibGUgaW4gdGhpcyBzaGFyZWQgbGlicmFyeS9PUyB2ZXJzaW9uIik7IFwKKyAgICByZXR1cm4gTlVMTDsgXAogICAgIH19IHdoaWxlKDApCiAKIApAQCAtMjIsMzAxICsyMiwzMDEgQEAKIAogc3RhdGljIFB5T2JqZWN0ICpGb2xkZXJfRmluZEZvbGRlcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlzaG9ydCB2UmVmTnVtOwotCU9TVHlwZSBmb2xkZXJUeXBlOwotCUJvb2xlYW4gY3JlYXRlRm9sZGVyOwotCUZTVm9sdW1lUmVmTnVtICBmb3VuZFZSZWZOdW07Ci0JU0ludDMyIGZvdW5kRGlySUQ7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZmb2xkZXJUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAmY3JlYXRlRm9sZGVyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEZpbmRGb2xkZXIodlJlZk51bSwKLQkgICAgICAgICAgICAgICAgICBmb2xkZXJUeXBlLAotCSAgICAgICAgICAgICAgICAgIGNyZWF0ZUZvbGRlciwKLQkgICAgICAgICAgICAgICAgICAmZm91bmRWUmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICZmb3VuZERpcklEKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJobCIsCi0JICAgICAgICAgICAgICAgICAgICAgZm91bmRWUmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgIGZvdW5kRGlySUQpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIHNob3J0IHZSZWZOdW07CisgICAgT1NUeXBlIGZvbGRlclR5cGU7CisgICAgQm9vbGVhbiBjcmVhdGVGb2xkZXI7CisgICAgRlNWb2x1bWVSZWZOdW0gIGZvdW5kVlJlZk51bTsKKyAgICBTSW50MzIgZm91bmREaXJJRDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyZiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmZvbGRlclR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjcmVhdGVGb2xkZXIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRmluZEZvbGRlcih2UmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgIGZvbGRlclR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlRm9sZGVyLAorICAgICAgICAgICAgICAgICAgICAgICZmb3VuZFZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgJmZvdW5kRGlySUQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImhsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZFZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmREaXJJRCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRm9sZGVyX1JlbGVhc2VGb2xkZXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0Jc2hvcnQgdlJlZk51bTsKLQlPU1R5cGUgZm9sZGVyVHlwZTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdlJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZm9sZGVyVHlwZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBSZWxlYXNlRm9sZGVyKHZSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgZm9sZGVyVHlwZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgc2hvcnQgdlJlZk51bTsKKyAgICBPU1R5cGUgZm9sZGVyVHlwZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdlJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZm9sZGVyVHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBSZWxlYXNlRm9sZGVyKHZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgZm9sZGVyVHlwZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRm9sZGVyX0ZTRmluZEZvbGRlcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlzaG9ydCB2UmVmTnVtOwotCU9TVHlwZSBmb2xkZXJUeXBlOwotCUJvb2xlYW4gY3JlYXRlRm9sZGVyOwotCUZTUmVmIGZvdW5kUmVmOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJmIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdlJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZm9sZGVyVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNyZWF0ZUZvbGRlcikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBGU0ZpbmRGb2xkZXIodlJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgIGZvbGRlclR5cGUsCi0JICAgICAgICAgICAgICAgICAgICBjcmVhdGVGb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAmZm91bmRSZWYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZTUmVmLCAmZm91bmRSZWYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIHNob3J0IHZSZWZOdW07CisgICAgT1NUeXBlIGZvbGRlclR5cGU7CisgICAgQm9vbGVhbiBjcmVhdGVGb2xkZXI7CisgICAgRlNSZWYgZm91bmRSZWY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZmb2xkZXJUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY3JlYXRlRm9sZGVyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEZTRmluZEZvbGRlcih2UmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgZm9sZGVyVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUZvbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICZmb3VuZFJlZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRlNSZWYsICZmb3VuZFJlZik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRm9sZGVyX0FkZEZvbGRlckRlc2NyaXB0b3IoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JRm9sZGVyVHlwZSBmb2xkVHlwZTsKLQlGb2xkZXJEZXNjRmxhZ3MgZmxhZ3M7Ci0JRm9sZGVyQ2xhc3MgZm9sZENsYXNzOwotCUZvbGRlckxvY2F0aW9uIGZvbGRMb2NhdGlvbjsKLQlPU1R5cGUgYmFkZ2VTaWduYXR1cmU7Ci0JT1NUeXBlIGJhZGdlVHlwZTsKLQlTdHIyNTUgbmFtZTsKLQlCb29sZWFuIHJlcGxhY2VGbGFnOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbE8mTyZPJk8mTyZiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZm9sZFR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZm9sZENsYXNzLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZmb2xkTG9jYXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmJhZGdlU2lnbmF0dXJlLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZiYWRnZVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgbmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJlcGxhY2VGbGFnKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEFkZEZvbGRlckRlc2NyaXB0b3IoZm9sZFR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9sZENsYXNzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbGRMb2NhdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWRnZVNpZ25hdHVyZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWRnZVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlRmxhZyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgRm9sZGVyVHlwZSBmb2xkVHlwZTsKKyAgICBGb2xkZXJEZXNjRmxhZ3MgZmxhZ3M7CisgICAgRm9sZGVyQ2xhc3MgZm9sZENsYXNzOworICAgIEZvbGRlckxvY2F0aW9uIGZvbGRMb2NhdGlvbjsKKyAgICBPU1R5cGUgYmFkZ2VTaWduYXR1cmU7CisgICAgT1NUeXBlIGJhZGdlVHlwZTsKKyAgICBTdHIyNTUgbmFtZTsKKyAgICBCb29sZWFuIHJlcGxhY2VGbGFnOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbE8mTyZPJk8mTyZiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZm9sZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZm9sZENsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZmb2xkTG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmJhZGdlU2lnbmF0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZiYWRnZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlcGxhY2VGbGFnKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFkZEZvbGRlckRlc2NyaXB0b3IoZm9sZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9sZENsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbGRMb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWRnZVNpZ25hdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWRnZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlRmxhZyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRm9sZGVyX0dldEZvbGRlclR5cGVzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVVJbnQzMiByZXF1ZXN0ZWRUeXBlQ291bnQ7Ci0JVUludDMyIHRvdGFsVHlwZUNvdW50OwotCUZvbGRlclR5cGUgdGhlVHlwZXM7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZXF1ZXN0ZWRUeXBlQ291bnQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0Rm9sZGVyVHlwZXMocmVxdWVzdGVkVHlwZUNvdW50LAotCSAgICAgICAgICAgICAgICAgICAgICAmdG90YWxUeXBlQ291bnQsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aGVUeXBlcyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICB0b3RhbFR5cGVDb3VudCwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgdGhlVHlwZXMpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFVJbnQzMiByZXF1ZXN0ZWRUeXBlQ291bnQ7CisgICAgVUludDMyIHRvdGFsVHlwZUNvdW50OworICAgIEZvbGRlclR5cGUgdGhlVHlwZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXF1ZXN0ZWRUeXBlQ291bnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0Rm9sZGVyVHlwZXMocmVxdWVzdGVkVHlwZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdG90YWxUeXBlQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVUeXBlcyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFR5cGVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgdGhlVHlwZXMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZvbGRlcl9SZW1vdmVGb2xkZXJEZXNjcmlwdG9yKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUZvbGRlclR5cGUgZm9sZFR5cGU7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZmb2xkVHlwZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBSZW1vdmVGb2xkZXJEZXNjcmlwdG9yKGZvbGRUeXBlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBGb2xkZXJUeXBlIGZvbGRUeXBlOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZm9sZFR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUmVtb3ZlRm9sZGVyRGVzY3JpcHRvcihmb2xkVHlwZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKICNpZm5kZWYgX19MUDY0X18KIHN0YXRpYyBQeU9iamVjdCAqRm9sZGVyX0dldEZvbGRlck5hbWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0Jc2hvcnQgdlJlZk51bTsKLQlPU1R5cGUgZm9sZFR5cGU7Ci0Jc2hvcnQgZm91bmRWUmVmTnVtOwotCVN0cjI1NSBuYW1lOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmZvbGRUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIG5hbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0Rm9sZGVyTmFtZSh2UmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgIGZvbGRUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICZmb3VuZFZSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgbmFtZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgZm91bmRWUmVmTnVtKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBzaG9ydCB2UmVmTnVtOworICAgIE9TVHlwZSBmb2xkVHlwZTsKKyAgICBzaG9ydCBmb3VuZFZSZWZOdW07CisgICAgU3RyMjU1IG5hbWU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdlJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZm9sZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgbmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRGb2xkZXJOYW1lKHZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgZm9sZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgJmZvdW5kVlJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZFZSZWZOdW0pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZvbGRlcl9BZGRGb2xkZXJSb3V0aW5nKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCU9TVHlwZSBmaWxlVHlwZTsKLQlGb2xkZXJUeXBlIHJvdXRlRnJvbUZvbGRlcjsKLQlGb2xkZXJUeXBlIHJvdXRlVG9Gb2xkZXI7Ci0JUm91dGluZ0ZsYWdzIGZsYWdzOwotCUJvb2xlYW4gcmVwbGFjZUZsYWc7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mbGIiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZmaWxlVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcm91dGVGcm9tRm9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZyb3V0ZVRvRm9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZXBsYWNlRmxhZykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBZGRGb2xkZXJSb3V0aW5nKGZpbGVUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlRnJvbUZvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZVRvRm9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VGbGFnKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBPU1R5cGUgZmlsZVR5cGU7CisgICAgRm9sZGVyVHlwZSByb3V0ZUZyb21Gb2xkZXI7CisgICAgRm9sZGVyVHlwZSByb3V0ZVRvRm9sZGVyOworICAgIFJvdXRpbmdGbGFncyBmbGFnczsKKyAgICBCb29sZWFuIHJlcGxhY2VGbGFnOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmxiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZmlsZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnJvdXRlRnJvbUZvbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcm91dGVUb0ZvbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVwbGFjZUZsYWcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQWRkRm9sZGVyUm91dGluZyhmaWxlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZUZyb21Gb2xkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGVUb0ZvbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlRmxhZyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRm9sZGVyX1JlbW92ZUZvbGRlclJvdXRpbmcoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JT1NUeXBlIGZpbGVUeXBlOwotCUZvbGRlclR5cGUgcm91dGVGcm9tRm9sZGVyOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZmaWxlVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcm91dGVGcm9tRm9sZGVyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFJlbW92ZUZvbGRlclJvdXRpbmcoZmlsZVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGVGcm9tRm9sZGVyKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBPU1R5cGUgZmlsZVR5cGU7CisgICAgRm9sZGVyVHlwZSByb3V0ZUZyb21Gb2xkZXI7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmZpbGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZyb3V0ZUZyb21Gb2xkZXIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUmVtb3ZlRm9sZGVyUm91dGluZyhmaWxlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZUZyb21Gb2xkZXIpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZvbGRlcl9GaW5kRm9sZGVyUm91dGluZyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlPU1R5cGUgZmlsZVR5cGU7Ci0JRm9sZGVyVHlwZSByb3V0ZUZyb21Gb2xkZXI7Ci0JRm9sZGVyVHlwZSByb3V0ZVRvRm9sZGVyOwotCVJvdXRpbmdGbGFncyBmbGFnczsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZmlsZVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnJvdXRlRnJvbUZvbGRlcikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBGaW5kRm9sZGVyUm91dGluZyhmaWxlVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGVGcm9tRm9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmcm91dGVUb0ZvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCByb3V0ZVRvRm9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBPU1R5cGUgZmlsZVR5cGU7CisgICAgRm9sZGVyVHlwZSByb3V0ZUZyb21Gb2xkZXI7CisgICAgRm9sZGVyVHlwZSByb3V0ZVRvRm9sZGVyOworICAgIFJvdXRpbmdGbGFncyBmbGFnczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZmlsZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnJvdXRlRnJvbUZvbGRlcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBGaW5kRm9sZGVyUm91dGluZyhmaWxlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGVGcm9tRm9sZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcm91dGVUb0ZvbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCByb3V0ZVRvRm9sZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KICNlbmRpZiAvKiAhX19MUDY0X18gKi8KIAogc3RhdGljIFB5T2JqZWN0ICpGb2xkZXJfSW52YWxpZGF0ZUZvbGRlckRlc2NyaXB0b3JDYWNoZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlzaG9ydCB2UmVmTnVtOwotCWxvbmcgZGlySUQ7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdlJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRpcklEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEludmFsaWRhdGVGb2xkZXJEZXNjcmlwdG9yQ2FjaGUodlJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJJRCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgc2hvcnQgdlJlZk51bTsKKyAgICBsb25nIGRpcklEOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkaXJJRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBJbnZhbGlkYXRlRm9sZGVyRGVzY3JpcHRvckNhY2hlKHZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlySUQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZvbGRlcl9JZGVudGlmeUZvbGRlcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlzaG9ydCB2UmVmTnVtOwotCWxvbmcgZGlySUQ7Ci0JRm9sZGVyVHlwZSBmb2xkVHlwZTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGlySUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gSWRlbnRpZnlGb2xkZXIodlJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgZGlySUQsCi0JICAgICAgICAgICAgICAgICAgICAgICZmb2xkVHlwZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBmb2xkVHlwZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgc2hvcnQgdlJlZk51bTsKKyAgICBsb25nIGRpcklEOworICAgIEZvbGRlclR5cGUgZm9sZFR5cGU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdlJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRpcklEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IElkZW50aWZ5Rm9sZGVyKHZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcklELAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZm9sZFR5cGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgZm9sZFR5cGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgRm9sZGVyX21ldGhvZHNbXSA9IHsKLQl7IkZpbmRGb2xkZXIiLCAoUHlDRnVuY3Rpb24pRm9sZGVyX0ZpbmRGb2xkZXIsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHZSZWZOdW0sIE9TVHlwZSBmb2xkZXJUeXBlLCBCb29sZWFuIGNyZWF0ZUZvbGRlcikgLT4gKHNob3J0IGZvdW5kVlJlZk51bSwgbG9uZyBmb3VuZERpcklEKSIpfSwKLQl7IlJlbGVhc2VGb2xkZXIiLCAoUHlDRnVuY3Rpb24pRm9sZGVyX1JlbGVhc2VGb2xkZXIsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHZSZWZOdW0sIE9TVHlwZSBmb2xkZXJUeXBlKSAtPiBOb25lIil9LAotCXsiRlNGaW5kRm9sZGVyIiwgKFB5Q0Z1bmN0aW9uKUZvbGRlcl9GU0ZpbmRGb2xkZXIsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHZSZWZOdW0sIE9TVHlwZSBmb2xkZXJUeXBlLCBCb29sZWFuIGNyZWF0ZUZvbGRlcikgLT4gKEZTUmVmIGZvdW5kUmVmKSIpfSwKLQl7IkFkZEZvbGRlckRlc2NyaXB0b3IiLCAoUHlDRnVuY3Rpb24pRm9sZGVyX0FkZEZvbGRlckRlc2NyaXB0b3IsIDEsCi0JIFB5RG9jX1NUUigiKEZvbGRlclR5cGUgZm9sZFR5cGUsIEZvbGRlckRlc2NGbGFncyBmbGFncywgRm9sZGVyQ2xhc3MgZm9sZENsYXNzLCBGb2xkZXJMb2NhdGlvbiBmb2xkTG9jYXRpb24sIE9TVHlwZSBiYWRnZVNpZ25hdHVyZSwgT1NUeXBlIGJhZGdlVHlwZSwgU3RyMjU1IG5hbWUsIEJvb2xlYW4gcmVwbGFjZUZsYWcpIC0+IE5vbmUiKX0sCi0JeyJHZXRGb2xkZXJUeXBlcyIsIChQeUNGdW5jdGlvbilGb2xkZXJfR2V0Rm9sZGVyVHlwZXMsIDEsCi0JIFB5RG9jX1NUUigiKFVJbnQzMiByZXF1ZXN0ZWRUeXBlQ291bnQpIC0+IChVSW50MzIgdG90YWxUeXBlQ291bnQsIEZvbGRlclR5cGUgdGhlVHlwZXMpIil9LAotCXsiUmVtb3ZlRm9sZGVyRGVzY3JpcHRvciIsIChQeUNGdW5jdGlvbilGb2xkZXJfUmVtb3ZlRm9sZGVyRGVzY3JpcHRvciwgMSwKLQkgUHlEb2NfU1RSKCIoRm9sZGVyVHlwZSBmb2xkVHlwZSkgLT4gTm9uZSIpfSwKKyAgICB7IkZpbmRGb2xkZXIiLCAoUHlDRnVuY3Rpb24pRm9sZGVyX0ZpbmRGb2xkZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IHZSZWZOdW0sIE9TVHlwZSBmb2xkZXJUeXBlLCBCb29sZWFuIGNyZWF0ZUZvbGRlcikgLT4gKHNob3J0IGZvdW5kVlJlZk51bSwgbG9uZyBmb3VuZERpcklEKSIpfSwKKyAgICB7IlJlbGVhc2VGb2xkZXIiLCAoUHlDRnVuY3Rpb24pRm9sZGVyX1JlbGVhc2VGb2xkZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IHZSZWZOdW0sIE9TVHlwZSBmb2xkZXJUeXBlKSAtPiBOb25lIil9LAorICAgIHsiRlNGaW5kRm9sZGVyIiwgKFB5Q0Z1bmN0aW9uKUZvbGRlcl9GU0ZpbmRGb2xkZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IHZSZWZOdW0sIE9TVHlwZSBmb2xkZXJUeXBlLCBCb29sZWFuIGNyZWF0ZUZvbGRlcikgLT4gKEZTUmVmIGZvdW5kUmVmKSIpfSwKKyAgICB7IkFkZEZvbGRlckRlc2NyaXB0b3IiLCAoUHlDRnVuY3Rpb24pRm9sZGVyX0FkZEZvbGRlckRlc2NyaXB0b3IsIDEsCisgICAgIFB5RG9jX1NUUigiKEZvbGRlclR5cGUgZm9sZFR5cGUsIEZvbGRlckRlc2NGbGFncyBmbGFncywgRm9sZGVyQ2xhc3MgZm9sZENsYXNzLCBGb2xkZXJMb2NhdGlvbiBmb2xkTG9jYXRpb24sIE9TVHlwZSBiYWRnZVNpZ25hdHVyZSwgT1NUeXBlIGJhZGdlVHlwZSwgU3RyMjU1IG5hbWUsIEJvb2xlYW4gcmVwbGFjZUZsYWcpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRGb2xkZXJUeXBlcyIsIChQeUNGdW5jdGlvbilGb2xkZXJfR2V0Rm9sZGVyVHlwZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKFVJbnQzMiByZXF1ZXN0ZWRUeXBlQ291bnQpIC0+IChVSW50MzIgdG90YWxUeXBlQ291bnQsIEZvbGRlclR5cGUgdGhlVHlwZXMpIil9LAorICAgIHsiUmVtb3ZlRm9sZGVyRGVzY3JpcHRvciIsIChQeUNGdW5jdGlvbilGb2xkZXJfUmVtb3ZlRm9sZGVyRGVzY3JpcHRvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRm9sZGVyVHlwZSBmb2xkVHlwZSkgLT4gTm9uZSIpfSwKICNpZm5kZWYgX19MUDY0X18KLQl7IkdldEZvbGRlck5hbWUiLCAoUHlDRnVuY3Rpb24pRm9sZGVyX0dldEZvbGRlck5hbWUsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHZSZWZOdW0sIE9TVHlwZSBmb2xkVHlwZSwgU3RyMjU1IG5hbWUpIC0+IChzaG9ydCBmb3VuZFZSZWZOdW0pIil9LAotCXsiQWRkRm9sZGVyUm91dGluZyIsIChQeUNGdW5jdGlvbilGb2xkZXJfQWRkRm9sZGVyUm91dGluZywgMSwKLQkgUHlEb2NfU1RSKCIoT1NUeXBlIGZpbGVUeXBlLCBGb2xkZXJUeXBlIHJvdXRlRnJvbUZvbGRlciwgRm9sZGVyVHlwZSByb3V0ZVRvRm9sZGVyLCBSb3V0aW5nRmxhZ3MgZmxhZ3MsIEJvb2xlYW4gcmVwbGFjZUZsYWcpIC0+IE5vbmUiKX0sCi0JeyJSZW1vdmVGb2xkZXJSb3V0aW5nIiwgKFB5Q0Z1bmN0aW9uKUZvbGRlcl9SZW1vdmVGb2xkZXJSb3V0aW5nLCAxLAotCSBQeURvY19TVFIoIihPU1R5cGUgZmlsZVR5cGUsIEZvbGRlclR5cGUgcm91dGVGcm9tRm9sZGVyKSAtPiBOb25lIil9LAotCXsiRmluZEZvbGRlclJvdXRpbmciLCAoUHlDRnVuY3Rpb24pRm9sZGVyX0ZpbmRGb2xkZXJSb3V0aW5nLCAxLAotCSBQeURvY19TVFIoIihPU1R5cGUgZmlsZVR5cGUsIEZvbGRlclR5cGUgcm91dGVGcm9tRm9sZGVyKSAtPiAoRm9sZGVyVHlwZSByb3V0ZVRvRm9sZGVyLCBSb3V0aW5nRmxhZ3MgZmxhZ3MpIil9LAorICAgIHsiR2V0Rm9sZGVyTmFtZSIsIChQeUNGdW5jdGlvbilGb2xkZXJfR2V0Rm9sZGVyTmFtZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgdlJlZk51bSwgT1NUeXBlIGZvbGRUeXBlLCBTdHIyNTUgbmFtZSkgLT4gKHNob3J0IGZvdW5kVlJlZk51bSkiKX0sCisgICAgeyJBZGRGb2xkZXJSb3V0aW5nIiwgKFB5Q0Z1bmN0aW9uKUZvbGRlcl9BZGRGb2xkZXJSb3V0aW5nLCAxLAorICAgICBQeURvY19TVFIoIihPU1R5cGUgZmlsZVR5cGUsIEZvbGRlclR5cGUgcm91dGVGcm9tRm9sZGVyLCBGb2xkZXJUeXBlIHJvdXRlVG9Gb2xkZXIsIFJvdXRpbmdGbGFncyBmbGFncywgQm9vbGVhbiByZXBsYWNlRmxhZykgLT4gTm9uZSIpfSwKKyAgICB7IlJlbW92ZUZvbGRlclJvdXRpbmciLCAoUHlDRnVuY3Rpb24pRm9sZGVyX1JlbW92ZUZvbGRlclJvdXRpbmcsIDEsCisgICAgIFB5RG9jX1NUUigiKE9TVHlwZSBmaWxlVHlwZSwgRm9sZGVyVHlwZSByb3V0ZUZyb21Gb2xkZXIpIC0+IE5vbmUiKX0sCisgICAgeyJGaW5kRm9sZGVyUm91dGluZyIsIChQeUNGdW5jdGlvbilGb2xkZXJfRmluZEZvbGRlclJvdXRpbmcsIDEsCisgICAgIFB5RG9jX1NUUigiKE9TVHlwZSBmaWxlVHlwZSwgRm9sZGVyVHlwZSByb3V0ZUZyb21Gb2xkZXIpIC0+IChGb2xkZXJUeXBlIHJvdXRlVG9Gb2xkZXIsIFJvdXRpbmdGbGFncyBmbGFncykiKX0sCiAjZW5kaWYgLyogIV9fTFA2NF9fICovCi0JeyJJbnZhbGlkYXRlRm9sZGVyRGVzY3JpcHRvckNhY2hlIiwgKFB5Q0Z1bmN0aW9uKUZvbGRlcl9JbnZhbGlkYXRlRm9sZGVyRGVzY3JpcHRvckNhY2hlLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCB2UmVmTnVtLCBsb25nIGRpcklEKSAtPiBOb25lIil9LAotCXsiSWRlbnRpZnlGb2xkZXIiLCAoUHlDRnVuY3Rpb24pRm9sZGVyX0lkZW50aWZ5Rm9sZGVyLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCB2UmVmTnVtLCBsb25nIGRpcklEKSAtPiAoRm9sZGVyVHlwZSBmb2xkVHlwZSkiKX0sCi0Je05VTEwsIE5VTEwsIDB9CisgICAgeyJJbnZhbGlkYXRlRm9sZGVyRGVzY3JpcHRvckNhY2hlIiwgKFB5Q0Z1bmN0aW9uKUZvbGRlcl9JbnZhbGlkYXRlRm9sZGVyRGVzY3JpcHRvckNhY2hlLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCB2UmVmTnVtLCBsb25nIGRpcklEKSAtPiBOb25lIil9LAorICAgIHsiSWRlbnRpZnlGb2xkZXIiLCAoUHlDRnVuY3Rpb24pRm9sZGVyX0lkZW50aWZ5Rm9sZGVyLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCB2UmVmTnVtLCBsb25nIGRpcklEKSAtPiAoRm9sZGVyVHlwZSBmb2xkVHlwZSkiKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAKQEAgLTMyNCwxOCArMzI0LDE4IEBACiAKIHZvaWQgaW5pdF9Gb2xkZXIodm9pZCkKIHsKLQlQeU9iamVjdCAqbTsKLQlQeU9iamVjdCAqZDsKKyAgICBQeU9iamVjdCAqbTsKKyAgICBQeU9iamVjdCAqZDsKIAogCiAKIAotCW0gPSBQeV9Jbml0TW9kdWxlKCJfRm9sZGVyIiwgRm9sZGVyX21ldGhvZHMpOwotCWQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOwotCUZvbGRlcl9FcnJvciA9IFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCk7Ci0JaWYgKEZvbGRlcl9FcnJvciA9PSBOVUxMIHx8Ci0JICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFcnJvciIsIEZvbGRlcl9FcnJvcikgIT0gMCkKLQkJcmV0dXJuOworICAgIG0gPSBQeV9Jbml0TW9kdWxlKCJfRm9sZGVyIiwgRm9sZGVyX21ldGhvZHMpOworICAgIGQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOworICAgIEZvbGRlcl9FcnJvciA9IFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCk7CisgICAgaWYgKEZvbGRlcl9FcnJvciA9PSBOVUxMIHx8CisgICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFcnJvciIsIEZvbGRlcl9FcnJvcikgIT0gMCkKKyAgICAgICAgcmV0dXJuOwogfQogCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PSBFbmQgbW9kdWxlIF9Gb2xkZXIgPT09PT09PT09PT09PT09PT09PT09PT0gKi8KZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL2dlc3RhbHRtb2R1bGUuYyBiL01hYy9Nb2R1bGVzL2dlc3RhbHRtb2R1bGUuYwppbmRleCBmYTFjOTNjLi41Njc1N2FiIDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9nZXN0YWx0bW9kdWxlLmMKKysrIGIvTWFjL01vZHVsZXMvZ2VzdGFsdG1vZHVsZS5jCkBAIC00LDEwICs0LDEwIEBACiAKICAgICAgICAgICAgICAgICAgICAgICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKIAotUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzIAotZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCAKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIGl0cworZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLAogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAotYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIAorYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lcyBvZiBTdGljaHRpbmcgTWF0aGVtYXRpc2NoCiBDZW50cnVtIG9yIENXSSBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0bwogZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uCkBAIC0zMiwyNCArMzIsMjQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZXN0YWx0X2dlc3RhbHQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCU9TRXJyIGlFcnI7Ci0JT1NUeXBlIHNlbGVjdG9yOwotCVNJbnQzMiByZXNwb25zZTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mIiwgUHlNYWNfR2V0T1NUeXBlLCAmc2VsZWN0b3IpKQotCQlyZXR1cm4gTlVMTDsKLQlpRXJyID0gR2VzdGFsdCAoIHNlbGVjdG9yLCAmcmVzcG9uc2UgKTsKLQlpZiAoaUVyciAhPSAwKSAKLQkJcmV0dXJuIFB5TWFjX0Vycm9yKGlFcnIpOwotCXJldHVybiBQeUludF9Gcm9tTG9uZyhyZXNwb25zZSk7CisgICAgT1NFcnIgaUVycjsKKyAgICBPU1R5cGUgc2VsZWN0b3I7CisgICAgU0ludDMyIHJlc3BvbnNlOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyYiLCBQeU1hY19HZXRPU1R5cGUsICZzZWxlY3RvcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlFcnIgPSBHZXN0YWx0ICggc2VsZWN0b3IsICZyZXNwb25zZSApOworICAgIGlmIChpRXJyICE9IDApCisgICAgICAgIHJldHVybiBQeU1hY19FcnJvcihpRXJyKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcocmVzcG9uc2UpOwogfQogCiBzdGF0aWMgc3RydWN0IFB5TWV0aG9kRGVmIGdlc3RhbHRfbWV0aG9kc1tdID0gewotCXsiZ2VzdGFsdCIsIGdlc3RhbHRfZ2VzdGFsdCwgTUVUSF9WQVJBUkdTfSwKLQl7TlVMTCwgTlVMTH0gLyogU2VudGluZWwgKi8KKyAgICB7Imdlc3RhbHQiLCBnZXN0YWx0X2dlc3RhbHQsIE1FVEhfVkFSQVJHU30sCisgICAge05VTEwsIE5VTEx9IC8qIFNlbnRpbmVsICovCiB9OwogCiB2b2lkCiBpbml0Z2VzdGFsdCh2b2lkKQogewotCVB5X0luaXRNb2R1bGUoImdlc3RhbHQiLCBnZXN0YWx0X21ldGhvZHMpOworICAgIFB5X0luaXRNb2R1bGUoImdlc3RhbHQiLCBnZXN0YWx0X21ldGhvZHMpOwogfQpkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvaGVscC9fSGVscG1vZHVsZS5jIGIvTWFjL01vZHVsZXMvaGVscC9fSGVscG1vZHVsZS5jCmluZGV4IGE2ZWNjZjMuLmVhYTJlOGEgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL2hlbHAvX0hlbHBtb2R1bGUuYworKysgYi9NYWMvTW9kdWxlcy9oZWxwL19IZWxwbW9kdWxlLmMKQEAgLTEwLDkgKzEwLDkgQEAKIAogLyogTWFjcm8gdG8gdGVzdCB3aGV0aGVyIGEgd2Vhay1sb2FkZWQgQ0ZNIGZ1bmN0aW9uIGV4aXN0cyAqLwogI2RlZmluZSBQeU1hY19QUkVDSEVDSyhydG4pIGRvIHsgaWYgKCAmcnRuID09IE5VTEwgKSAge1wKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsIFwKLSAgICAgICAgIk5vdCBhdmFpbGFibGUgaW4gdGhpcyBzaGFyZWQgbGlicmFyeS9PUyB2ZXJzaW9uIik7IFwKLSAgICAgICAgcmV0dXJuIE5VTEw7IFwKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgXAorICAgICJOb3QgYXZhaWxhYmxlIGluIHRoaXMgc2hhcmVkIGxpYnJhcnkvT1MgdmVyc2lvbiIpOyBcCisgICAgcmV0dXJuIE5VTEw7IFwKICAgICB9fSB3aGlsZSgwKQogCiAKQEAgLTIyLDE1MSArMjIsMTUxIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqSGVscF9ITUdldEhlbHBNZW51KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCU1lbnVSZWYgb3V0SGVscE1lbnU7Ci0JTWVudUl0ZW1JbmRleCBvdXRGaXJzdEN1c3RvbUl0ZW1JbmRleDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEhNR2V0SGVscE1lbnUoJm91dEhlbHBNZW51LAotCSAgICAgICAgICAgICAgICAgICAgICZvdXRGaXJzdEN1c3RvbUl0ZW1JbmRleCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZIIiwKLQkgICAgICAgICAgICAgICAgICAgICBNZW51T2JqX05ldywgb3V0SGVscE1lbnUsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0Rmlyc3RDdXN0b21JdGVtSW5kZXgpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIE1lbnVSZWYgb3V0SGVscE1lbnU7CisgICAgTWVudUl0ZW1JbmRleCBvdXRGaXJzdEN1c3RvbUl0ZW1JbmRleDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEhNR2V0SGVscE1lbnUoJm91dEhlbHBNZW51LAorICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRGaXJzdEN1c3RvbUl0ZW1JbmRleCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBNZW51T2JqX05ldywgb3V0SGVscE1lbnUsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0Rmlyc3RDdXN0b21JdGVtSW5kZXgpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkhlbHBfSE1BcmVIZWxwVGFnc0Rpc3BsYXllZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEhNQXJlSGVscFRhZ3NEaXNwbGF5ZWQoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEhNQXJlSGVscFRhZ3NEaXNwbGF5ZWQoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpIZWxwX0hNU2V0SGVscFRhZ3NEaXNwbGF5ZWQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JQm9vbGVhbiBpbkRpc3BsYXlUYWdzOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5EaXNwbGF5VGFncykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBITVNldEhlbHBUYWdzRGlzcGxheWVkKGluRGlzcGxheVRhZ3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIEJvb2xlYW4gaW5EaXNwbGF5VGFnczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluRGlzcGxheVRhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gSE1TZXRIZWxwVGFnc0Rpc3BsYXllZChpbkRpc3BsYXlUYWdzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpIZWxwX0hNU2V0VGFnRGVsYXkoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JRHVyYXRpb24gaW5EZWxheTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluRGVsYXkpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gSE1TZXRUYWdEZWxheShpbkRlbGF5KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBEdXJhdGlvbiBpbkRlbGF5OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5EZWxheSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBITVNldFRhZ0RlbGF5KGluRGVsYXkpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkhlbHBfSE1HZXRUYWdEZWxheShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlEdXJhdGlvbiBvdXREZWxheTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEhNR2V0VGFnRGVsYXkoJm91dERlbGF5KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXREZWxheSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgRHVyYXRpb24gb3V0RGVsYXk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBITUdldFRhZ0RlbGF5KCZvdXREZWxheSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0RGVsYXkpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkhlbHBfSE1TZXRNZW51SGVscEZyb21CYWxsb29uUnNyYyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlNZW51UmVmIGluTWVudTsKLQlTSW50MTYgaW5IbW51UnNyY0lEOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIE1lbnVPYmpfQ29udmVydCwgJmluTWVudSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluSG1udVJzcmNJRCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBITVNldE1lbnVIZWxwRnJvbUJhbGxvb25Sc3JjKGluTWVudSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkhtbnVSc3JjSUQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIE1lbnVSZWYgaW5NZW51OworICAgIFNJbnQxNiBpbkhtbnVSc3JjSUQ7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTWVudU9ial9Db252ZXJ0LCAmaW5NZW51LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5IbW51UnNyY0lEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEhNU2V0TWVudUhlbHBGcm9tQmFsbG9vblJzcmMoaW5NZW51LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSG1udVJzcmNJRCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqSGVscF9ITVNldERpYWxvZ0hlbHBGcm9tQmFsbG9vblJzcmMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JRGlhbG9nUHRyIGluRGlhbG9nOwotCVNJbnQxNiBpbkhkbGdSc3JjSUQ7Ci0JU0ludDE2IGluSXRlbVN0YXJ0OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGgiLAotCSAgICAgICAgICAgICAgICAgICAgICBEbGdPYmpfQ29udmVydCwgJmluRGlhbG9nLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5IZGxnUnNyY0lELAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtU3RhcnQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gSE1TZXREaWFsb2dIZWxwRnJvbUJhbGxvb25Sc3JjKGluRGlhbG9nLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5IZGxnUnNyY0lELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5JdGVtU3RhcnQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIERpYWxvZ1B0ciBpbkRpYWxvZzsKKyAgICBTSW50MTYgaW5IZGxnUnNyY0lEOworICAgIFNJbnQxNiBpbkl0ZW1TdGFydDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRGxnT2JqX0NvbnZlcnQsICZpbkRpYWxvZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluSGRsZ1JzcmNJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbVN0YXJ0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEhNU2V0RGlhbG9nSGVscEZyb21CYWxsb29uUnNyYyhpbkRpYWxvZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSGRsZ1JzcmNJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXRlbVN0YXJ0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpIZWxwX0hNSGlkZVRhZyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEhNSGlkZVRhZygpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gSE1IaWRlVGFnKCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKICNlbmRpZiAvKiBfX0xQNjRfXyAqLwogCiBzdGF0aWMgUHlNZXRob2REZWYgSGVscF9tZXRob2RzW10gPSB7CiAjaWZuZGVmIF9fTFA2NF9fCi0JeyJITUdldEhlbHBNZW51IiwgKFB5Q0Z1bmN0aW9uKUhlbHBfSE1HZXRIZWxwTWVudSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoTWVudVJlZiBvdXRIZWxwTWVudSwgTWVudUl0ZW1JbmRleCBvdXRGaXJzdEN1c3RvbUl0ZW1JbmRleCkiKX0sCi0JeyJITUFyZUhlbHBUYWdzRGlzcGxheWVkIiwgKFB5Q0Z1bmN0aW9uKUhlbHBfSE1BcmVIZWxwVGFnc0Rpc3BsYXllZCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiSE1TZXRIZWxwVGFnc0Rpc3BsYXllZCIsIChQeUNGdW5jdGlvbilIZWxwX0hNU2V0SGVscFRhZ3NEaXNwbGF5ZWQsIDEsCi0JIFB5RG9jX1NUUigiKEJvb2xlYW4gaW5EaXNwbGF5VGFncykgLT4gTm9uZSIpfSwKLQl7IkhNU2V0VGFnRGVsYXkiLCAoUHlDRnVuY3Rpb24pSGVscF9ITVNldFRhZ0RlbGF5LCAxLAotCSBQeURvY19TVFIoIihEdXJhdGlvbiBpbkRlbGF5KSAtPiBOb25lIil9LAotCXsiSE1HZXRUYWdEZWxheSIsIChQeUNGdW5jdGlvbilIZWxwX0hNR2V0VGFnRGVsYXksIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKER1cmF0aW9uIG91dERlbGF5KSIpfSwKLQl7IkhNU2V0TWVudUhlbHBGcm9tQmFsbG9vblJzcmMiLCAoUHlDRnVuY3Rpb24pSGVscF9ITVNldE1lbnVIZWxwRnJvbUJhbGxvb25Sc3JjLCAxLAotCSBQeURvY19TVFIoIihNZW51UmVmIGluTWVudSwgU0ludDE2IGluSG1udVJzcmNJRCkgLT4gTm9uZSIpfSwKLQl7IkhNU2V0RGlhbG9nSGVscEZyb21CYWxsb29uUnNyYyIsIChQeUNGdW5jdGlvbilIZWxwX0hNU2V0RGlhbG9nSGVscEZyb21CYWxsb29uUnNyYywgMSwKLQkgUHlEb2NfU1RSKCIoRGlhbG9nUHRyIGluRGlhbG9nLCBTSW50MTYgaW5IZGxnUnNyY0lELCBTSW50MTYgaW5JdGVtU3RhcnQpIC0+IE5vbmUiKX0sCi0JeyJITUhpZGVUYWciLCAoUHlDRnVuY3Rpb24pSGVscF9ITUhpZGVUYWcsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkhNR2V0SGVscE1lbnUiLCAoUHlDRnVuY3Rpb24pSGVscF9ITUdldEhlbHBNZW51LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChNZW51UmVmIG91dEhlbHBNZW51LCBNZW51SXRlbUluZGV4IG91dEZpcnN0Q3VzdG9tSXRlbUluZGV4KSIpfSwKKyAgICB7IkhNQXJlSGVscFRhZ3NEaXNwbGF5ZWQiLCAoUHlDRnVuY3Rpb24pSGVscF9ITUFyZUhlbHBUYWdzRGlzcGxheWVkLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJITVNldEhlbHBUYWdzRGlzcGxheWVkIiwgKFB5Q0Z1bmN0aW9uKUhlbHBfSE1TZXRIZWxwVGFnc0Rpc3BsYXllZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQm9vbGVhbiBpbkRpc3BsYXlUYWdzKSAtPiBOb25lIil9LAorICAgIHsiSE1TZXRUYWdEZWxheSIsIChQeUNGdW5jdGlvbilIZWxwX0hNU2V0VGFnRGVsYXksIDEsCisgICAgIFB5RG9jX1NUUigiKER1cmF0aW9uIGluRGVsYXkpIC0+IE5vbmUiKX0sCisgICAgeyJITUdldFRhZ0RlbGF5IiwgKFB5Q0Z1bmN0aW9uKUhlbHBfSE1HZXRUYWdEZWxheSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoRHVyYXRpb24gb3V0RGVsYXkpIil9LAorICAgIHsiSE1TZXRNZW51SGVscEZyb21CYWxsb29uUnNyYyIsIChQeUNGdW5jdGlvbilIZWxwX0hNU2V0TWVudUhlbHBGcm9tQmFsbG9vblJzcmMsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lbnVSZWYgaW5NZW51LCBTSW50MTYgaW5IbW51UnNyY0lEKSAtPiBOb25lIil9LAorICAgIHsiSE1TZXREaWFsb2dIZWxwRnJvbUJhbGxvb25Sc3JjIiwgKFB5Q0Z1bmN0aW9uKUhlbHBfSE1TZXREaWFsb2dIZWxwRnJvbUJhbGxvb25Sc3JjLCAxLAorICAgICBQeURvY19TVFIoIihEaWFsb2dQdHIgaW5EaWFsb2csIFNJbnQxNiBpbkhkbGdSc3JjSUQsIFNJbnQxNiBpbkl0ZW1TdGFydCkgLT4gTm9uZSIpfSwKKyAgICB7IkhNSGlkZVRhZyIsIChQeUNGdW5jdGlvbilIZWxwX0hNSGlkZVRhZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAogI2VuZGlmIC8qIF9fTFA2NF9fICovCi0Je05VTEwsIE5VTEwsIDB9CisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAKQEAgLTE3NCwyMSArMTc0LDIxIEBACiAKIHZvaWQgaW5pdF9IZWxwKHZvaWQpCiB7Ci0JUHlPYmplY3QgKm07CisgICAgUHlPYmplY3QgKm07CiAjaWZuZGVmIF9fTFA2NF9fCi0JUHlPYmplY3QgKmQ7CisgICAgUHlPYmplY3QgKmQ7CiAjZW5kaWYgLyogX19MUDY0X18gKi8KIAogCiAKIAotCW0gPSBQeV9Jbml0TW9kdWxlKCJfSGVscCIsIEhlbHBfbWV0aG9kcyk7CisgICAgbSA9IFB5X0luaXRNb2R1bGUoIl9IZWxwIiwgSGVscF9tZXRob2RzKTsKICNpZm5kZWYgX19MUDY0X18KLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQlIZWxwX0Vycm9yID0gUHlNYWNfR2V0T1NFcnJFeGNlcHRpb24oKTsKLQlpZiAoSGVscF9FcnJvciA9PSBOVUxMIHx8Ci0JICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFcnJvciIsIEhlbHBfRXJyb3IpICE9IDApCi0JCXJldHVybjsKKyAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICBIZWxwX0Vycm9yID0gUHlNYWNfR2V0T1NFcnJFeGNlcHRpb24oKTsKKyAgICBpZiAoSGVscF9FcnJvciA9PSBOVUxMIHx8CisgICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFcnJvciIsIEhlbHBfRXJyb3IpICE9IDApCisgICAgICAgIHJldHVybjsKICNlbmRpZiAvKiBfX0xQNjRfXyAqLwogfQogCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9pYmNhcmJvbi9fSUJDYXJib24uYyBiL01hYy9Nb2R1bGVzL2liY2FyYm9uL19JQkNhcmJvbi5jCmluZGV4IGM3YzgxOWMuLjJhNjVmNDIgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL2liY2FyYm9uL19JQkNhcmJvbi5jCisrKyBiL01hYy9Nb2R1bGVzL2liY2FyYm9uL19JQkNhcmJvbi5jCkBAIC0yMywxMTYgKzIzLDExNiBAQAogI2RlZmluZSBJQk5pYlJlZk9ial9DaGVjayh4KSAoKHgpLT5vYl90eXBlID09ICZJQk5pYlJlZl9UeXBlIHx8IFB5T2JqZWN0X1R5cGVDaGVjaygoeCksICZJQk5pYlJlZl9UeXBlKSkKIAogdHlwZWRlZiBzdHJ1Y3QgSUJOaWJSZWZPYmplY3QgewotCVB5T2JqZWN0X0hFQUQKLQlJQk5pYlJlZiBvYl9pdHNlbGY7CisgICAgUHlPYmplY3RfSEVBRAorICAgIElCTmliUmVmIG9iX2l0c2VsZjsKIH0gSUJOaWJSZWZPYmplY3Q7CiAKIFB5T2JqZWN0ICpJQk5pYlJlZk9ial9OZXcoSUJOaWJSZWYgaXRzZWxmKQogewotCUlCTmliUmVmT2JqZWN0ICppdDsKLQlpdCA9IFB5T2JqZWN0X05FVyhJQk5pYlJlZk9iamVjdCwgJklCTmliUmVmX1R5cGUpOwotCWlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQlpdC0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiAoUHlPYmplY3QgKilpdDsKKyAgICBJQk5pYlJlZk9iamVjdCAqaXQ7CisgICAgaXQgPSBQeU9iamVjdF9ORVcoSUJOaWJSZWZPYmplY3QsICZJQk5pYlJlZl9UeXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiAKIGludCBJQk5pYlJlZk9ial9Db252ZXJ0KFB5T2JqZWN0ICp2LCBJQk5pYlJlZiAqcF9pdHNlbGYpCiB7Ci0JaWYgKCFJQk5pYlJlZk9ial9DaGVjayh2KSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJJQk5pYlJlZiByZXF1aXJlZCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JKnBfaXRzZWxmID0gKChJQk5pYlJlZk9iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0JcmV0dXJuIDE7CisgICAgaWYgKCFJQk5pYlJlZk9ial9DaGVjayh2KSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJJQk5pYlJlZiByZXF1aXJlZCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgKnBfaXRzZWxmID0gKChJQk5pYlJlZk9iamVjdCAqKXYpLT5vYl9pdHNlbGY7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyB2b2lkIElCTmliUmVmT2JqX2RlYWxsb2MoSUJOaWJSZWZPYmplY3QgKnNlbGYpCiB7Ci0JRGlzcG9zZU5pYlJlZmVyZW5jZShzZWxmLT5vYl9pdHNlbGYpOwotCXNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CisgICAgRGlzcG9zZU5pYlJlZmVyZW5jZShzZWxmLT5vYl9pdHNlbGYpOworICAgIHNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqSUJOaWJSZWZPYmpfQ3JlYXRlV2luZG93RnJvbU5pYihJQk5pYlJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlDRlN0cmluZ1JlZiBpbk5hbWU7Ci0JV2luZG93UHRyIG91dFdpbmRvdzsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZpbk5hbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ3JlYXRlV2luZG93RnJvbU5pYihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGluTmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0V2luZG93KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgV2luT2JqX05ldywgb3V0V2luZG93KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBDRlN0cmluZ1JlZiBpbk5hbWU7CisgICAgV2luZG93UHRyIG91dFdpbmRvdzsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZpbk5hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ3JlYXRlV2luZG93RnJvbU5pYihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0V2luZG93KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX05ldywgb3V0V2luZG93KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpJQk5pYlJlZk9ial9DcmVhdGVNZW51RnJvbU5pYihJQk5pYlJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlDRlN0cmluZ1JlZiBpbk5hbWU7Ci0JTWVudUhhbmRsZSBvdXRNZW51UmVmOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmluTmFtZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDcmVhdGVNZW51RnJvbU5pYihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBpbk5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRNZW51UmVmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgTWVudU9ial9OZXcsIG91dE1lbnVSZWYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIENGU3RyaW5nUmVmIGluTmFtZTsKKyAgICBNZW51SGFuZGxlIG91dE1lbnVSZWY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmaW5OYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENyZWF0ZU1lbnVGcm9tTmliKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dE1lbnVSZWYpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBNZW51T2JqX05ldywgb3V0TWVudVJlZik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqSUJOaWJSZWZPYmpfQ3JlYXRlTWVudUJhckZyb21OaWIoSUJOaWJSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JQ0ZTdHJpbmdSZWYgaW5OYW1lOwotCUhhbmRsZSBvdXRNZW51QmFyOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmluTmFtZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDcmVhdGVNZW51QmFyRnJvbU5pYihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbk5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRNZW51QmFyKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgb3V0TWVudUJhcik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgQ0ZTdHJpbmdSZWYgaW5OYW1lOworICAgIEhhbmRsZSBvdXRNZW51QmFyOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmluTmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDcmVhdGVNZW51QmFyRnJvbU5pYihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRNZW51QmFyKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgb3V0TWVudUJhcik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqSUJOaWJSZWZPYmpfU2V0TWVudUJhckZyb21OaWIoSUJOaWJSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JQ0ZTdHJpbmdSZWYgaW5OYW1lOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmluTmFtZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRNZW51QmFyRnJvbU5pYihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBpbk5hbWUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIENGU3RyaW5nUmVmIGluTmFtZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZpbk5hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0TWVudUJhckZyb21OaWIoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5OYW1lKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIElCTmliUmVmT2JqX21ldGhvZHNbXSA9IHsKLQl7IkNyZWF0ZVdpbmRvd0Zyb21OaWIiLCAoUHlDRnVuY3Rpb24pSUJOaWJSZWZPYmpfQ3JlYXRlV2luZG93RnJvbU5pYiwgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgaW5OYW1lKSAtPiAoV2luZG93UHRyIG91dFdpbmRvdykiKX0sCi0JeyJDcmVhdGVNZW51RnJvbU5pYiIsIChQeUNGdW5jdGlvbilJQk5pYlJlZk9ial9DcmVhdGVNZW51RnJvbU5pYiwgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgaW5OYW1lKSAtPiAoTWVudUhhbmRsZSBvdXRNZW51UmVmKSIpfSwKLQl7IkNyZWF0ZU1lbnVCYXJGcm9tTmliIiwgKFB5Q0Z1bmN0aW9uKUlCTmliUmVmT2JqX0NyZWF0ZU1lbnVCYXJGcm9tTmliLCAxLAotCSBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBpbk5hbWUpIC0+IChIYW5kbGUgb3V0TWVudUJhcikiKX0sCi0JeyJTZXRNZW51QmFyRnJvbU5pYiIsIChQeUNGdW5jdGlvbilJQk5pYlJlZk9ial9TZXRNZW51QmFyRnJvbU5pYiwgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgaW5OYW1lKSAtPiBOb25lIil9LAotCXtOVUxMLCBOVUxMLCAwfQorICAgIHsiQ3JlYXRlV2luZG93RnJvbU5pYiIsIChQeUNGdW5jdGlvbilJQk5pYlJlZk9ial9DcmVhdGVXaW5kb3dGcm9tTmliLCAxLAorICAgICBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBpbk5hbWUpIC0+IChXaW5kb3dQdHIgb3V0V2luZG93KSIpfSwKKyAgICB7IkNyZWF0ZU1lbnVGcm9tTmliIiwgKFB5Q0Z1bmN0aW9uKUlCTmliUmVmT2JqX0NyZWF0ZU1lbnVGcm9tTmliLCAxLAorICAgICBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBpbk5hbWUpIC0+IChNZW51SGFuZGxlIG91dE1lbnVSZWYpIil9LAorICAgIHsiQ3JlYXRlTWVudUJhckZyb21OaWIiLCAoUHlDRnVuY3Rpb24pSUJOaWJSZWZPYmpfQ3JlYXRlTWVudUJhckZyb21OaWIsIDEsCisgICAgIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIGluTmFtZSkgLT4gKEhhbmRsZSBvdXRNZW51QmFyKSIpfSwKKyAgICB7IlNldE1lbnVCYXJGcm9tTmliIiwgKFB5Q0Z1bmN0aW9uKUlCTmliUmVmT2JqX1NldE1lbnVCYXJGcm9tTmliLCAxLAorICAgICBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBpbk5hbWUpIC0+IE5vbmUiKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAjZGVmaW5lIElCTmliUmVmT2JqX2dldHNldGxpc3QgTlVMTApAQCAtMTQ5LDYxICsxNDksNjEgQEAKIAogc3RhdGljIFB5T2JqZWN0ICpJQk5pYlJlZk9ial90cF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlQeU9iamVjdCAqX3NlbGY7Ci0JSUJOaWJSZWYgaXRzZWxmOwotCWNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OworICAgIFB5T2JqZWN0ICpfc2VsZjsKKyAgICBJQk5pYlJlZiBpdHNlbGY7CisgICAgY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBJQk5pYlJlZk9ial9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7Ci0JaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkoKElCTmliUmVmT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JcmV0dXJuIF9zZWxmOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIElCTmliUmVmT2JqX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOworICAgICgoSUJOaWJSZWZPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICByZXR1cm4gX3NlbGY7CiB9CiAKICNkZWZpbmUgSUJOaWJSZWZPYmpfdHBfZnJlZSBQeU9iamVjdF9EZWwKIAogCiBQeVR5cGVPYmplY3QgSUJOaWJSZWZfVHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKLQkwLCAvKm9iX3NpemUqLwotCSJfSUJDYXJib24uSUJOaWJSZWYiLCAvKnRwX25hbWUqLwotCXNpemVvZihJQk5pYlJlZk9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KLQkwLCAvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpIElCTmliUmVmT2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCi0JMCwgLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCi0JKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCi0JKGNtcGZ1bmMpIElCTmliUmVmT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCi0JKHJlcHJmdW5jKSBJQk5pYlJlZk9ial9yZXByLCAvKnRwX3JlcHIqLwotCShQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KLQkoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLwotCShQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYykgSUJOaWJSZWZPYmpfaGFzaCwgLyp0cF9oYXNoKi8KLQkwLCAvKnRwX2NhbGwqLwotCTAsIC8qdHBfc3RyKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCi0JUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KLQkwLCAvKnRwX2FzX2J1ZmZlciovCi0JUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCi0JMCwgLyp0cF9kb2MqLwotCTAsIC8qdHBfdHJhdmVyc2UqLwotCTAsIC8qdHBfY2xlYXIqLwotCTAsIC8qdHBfcmljaGNvbXBhcmUqLwotCTAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLwotCTAsIC8qdHBfaXRlciovCi0JMCwgLyp0cF9pdGVybmV4dCovCi0JSUJOaWJSZWZPYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLwotCTAsIC8qdHBfbWVtYmVycyovCi0JSUJOaWJSZWZPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLwotCTAsIC8qdHBfYmFzZSovCi0JMCwgLyp0cF9kaWN0Ki8KLQkwLCAvKnRwX2Rlc2NyX2dldCovCi0JMCwgLyp0cF9kZXNjcl9zZXQqLwotCTAsIC8qdHBfZGljdG9mZnNldCovCi0JSUJOaWJSZWZPYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLwotCUlCTmliUmVmT2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLwotCUlCTmliUmVmT2JqX3RwX25ldywgLyogdHBfbmV3ICovCi0JSUJOaWJSZWZPYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgIDAsIC8qb2Jfc2l6ZSovCisgICAgIl9JQkNhcmJvbi5JQk5pYlJlZiIsIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKElCTmliUmVmT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLworICAgIDAsIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcikgSUJOaWJSZWZPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KKyAgICAoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KKyAgICAoY21wZnVuYykgSUJOaWJSZWZPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpIElCTmliUmVmT2JqX3JlcHIsIC8qdHBfcmVwciovCisgICAgKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLworICAgIChQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKSBJQk5pYlJlZk9ial9oYXNoLCAvKnRwX2hhc2gqLworICAgIDAsIC8qdHBfY2FsbCovCisgICAgMCwgLyp0cF9zdHIqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KKyAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLworICAgIDAsIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAvKnRwX2RvYyovCisgICAgMCwgLyp0cF90cmF2ZXJzZSovCisgICAgMCwgLyp0cF9jbGVhciovCisgICAgMCwgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgLyp0cF9pdGVyKi8KKyAgICAwLCAvKnRwX2l0ZXJuZXh0Ki8KKyAgICBJQk5pYlJlZk9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCisgICAgMCwgLyp0cF9tZW1iZXJzKi8KKyAgICBJQk5pYlJlZk9ial9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCisgICAgMCwgLyp0cF9iYXNlKi8KKyAgICAwLCAvKnRwX2RpY3QqLworICAgIDAsIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICBJQk5pYlJlZk9ial90cF9pbml0LCAvKiB0cF9pbml0ICovCisgICAgSUJOaWJSZWZPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCisgICAgSUJOaWJSZWZPYmpfdHBfbmV3LCAvKiB0cF9uZXcgKi8KKyAgICBJQk5pYlJlZk9ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLSBFbmQgb2JqZWN0IHR5cGUgSUJOaWJSZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTIxMSwyOCArMjExLDI4IEBACiAKIHN0YXRpYyBQeU9iamVjdCAqSUJDYXJib25fQ3JlYXRlTmliUmVmZXJlbmNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUNGU3RyaW5nUmVmIGluTmliTmFtZTsKLQlJQk5pYlJlZiBvdXROaWJSZWY7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmaW5OaWJOYW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENyZWF0ZU5pYlJlZmVyZW5jZShpbk5pYk5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0TmliUmVmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgSUJOaWJSZWZPYmpfTmV3LCBvdXROaWJSZWYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIENGU3RyaW5nUmVmIGluTmliTmFtZTsKKyAgICBJQk5pYlJlZiBvdXROaWJSZWY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmaW5OaWJOYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENyZWF0ZU5pYlJlZmVyZW5jZShpbk5pYk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0TmliUmVmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgSUJOaWJSZWZPYmpfTmV3LCBvdXROaWJSZWYpOworICAgIHJldHVybiBfcmVzOwogfQogI2VuZGlmIC8qIF9fTFA2NF9fICovCiAKIHN0YXRpYyBQeU1ldGhvZERlZiBJQkNhcmJvbl9tZXRob2RzW10gPSB7CiAjaWZuZGVmIF9fTFA2NF9fCi0JeyJDcmVhdGVOaWJSZWZlcmVuY2UiLCAoUHlDRnVuY3Rpb24pSUJDYXJib25fQ3JlYXRlTmliUmVmZXJlbmNlLCAxLAotCSBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBpbk5pYk5hbWUpIC0+IChJQk5pYlJlZiBvdXROaWJSZWYpIil9LAorICAgIHsiQ3JlYXRlTmliUmVmZXJlbmNlIiwgKFB5Q0Z1bmN0aW9uKUlCQ2FyYm9uX0NyZWF0ZU5pYlJlZmVyZW5jZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgaW5OaWJOYW1lKSAtPiAoSUJOaWJSZWYgb3V0TmliUmVmKSIpfSwKICNlbmRpZiAvKiBfX0xQNjRfXyAqLwotCXtOVUxMLCBOVUxMLCAwfQorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogCkBAIC0yNDAsMjkgKzI0MCwyOSBAQAogCiB2b2lkIGluaXRfSUJDYXJib24odm9pZCkKIHsKLQlQeU9iamVjdCAqbTsKKyAgICBQeU9iamVjdCAqbTsKICNpZm5kZWYgX19MUDY0X18KLQlQeU9iamVjdCAqZDsKKyAgICBQeU9iamVjdCAqZDsKICNlbmRpZiAvKiBfX0xQNjRfXyAqLwogCiAKIAogCiAKLQltID0gUHlfSW5pdE1vZHVsZSgiX0lCQ2FyYm9uIiwgSUJDYXJib25fbWV0aG9kcyk7CisgICAgbSA9IFB5X0luaXRNb2R1bGUoIl9JQkNhcmJvbiIsIElCQ2FyYm9uX21ldGhvZHMpOwogI2lmbmRlZiBfX0xQNjRfXwotCWQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOwotCUlCQ2FyYm9uX0Vycm9yID0gUHlNYWNfR2V0T1NFcnJFeGNlcHRpb24oKTsKLQlpZiAoSUJDYXJib25fRXJyb3IgPT0gTlVMTCB8fAotCSAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRXJyb3IiLCBJQkNhcmJvbl9FcnJvcikgIT0gMCkKLQkJcmV0dXJuOwotCUlCTmliUmVmX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKLQlpZiAoUHlUeXBlX1JlYWR5KCZJQk5pYlJlZl9UeXBlKSA8IDApIHJldHVybjsKLQlQeV9JTkNSRUYoJklCTmliUmVmX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiSUJOaWJSZWYiLCAoUHlPYmplY3QgKikmSUJOaWJSZWZfVHlwZSk7Ci0JLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCi0JUHlfSU5DUkVGKCZJQk5pYlJlZl9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIklCTmliUmVmVHlwZSIsIChQeU9iamVjdCAqKSZJQk5pYlJlZl9UeXBlKTsKKyAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICBJQkNhcmJvbl9FcnJvciA9IFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCk7CisgICAgaWYgKElCQ2FyYm9uX0Vycm9yID09IE5VTEwgfHwKKyAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVycm9yIiwgSUJDYXJib25fRXJyb3IpICE9IDApCisgICAgICAgIHJldHVybjsKKyAgICBJQk5pYlJlZl9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmSUJOaWJSZWZfVHlwZSkgPCAwKSByZXR1cm47CisgICAgUHlfSU5DUkVGKCZJQk5pYlJlZl9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIklCTmliUmVmIiwgKFB5T2JqZWN0ICopJklCTmliUmVmX1R5cGUpOworICAgIC8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLworICAgIFB5X0lOQ1JFRigmSUJOaWJSZWZfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJJQk5pYlJlZlR5cGUiLCAoUHlPYmplY3QgKikmSUJOaWJSZWZfVHlwZSk7CiAjZW5kaWYgLyogX19MUDY0X18gKi8KIH0KIApkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvaWNnbHVlbW9kdWxlLmMgYi9NYWMvTW9kdWxlcy9pY2dsdWVtb2R1bGUuYwppbmRleCBkOTk1ZjE2Li5jNGQ1MDQ1IDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9pY2dsdWVtb2R1bGUuYworKysgYi9NYWMvTW9kdWxlcy9pY2dsdWVtb2R1bGUuYwpAQCAtNDMsOCArNDMsOCBAQAogLyogRGVjbGFyYXRpb25zIGZvciBvYmplY3RzIG9mIHR5cGUgaWNfaW5zdGFuY2UgKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewotCVB5T2JqZWN0X0hFQUQKLQlJQ0luc3RhbmNlIGluc3Q7CisgICAgUHlPYmplY3RfSEVBRAorICAgIElDSW5zdGFuY2UgaW5zdDsKIH0gaWNpb2JqZWN0OwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IEljaXR5cGU7CkBAIC01NCwzMDMgKzU0LDMwMyBAQAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiAKLXN0YXRpYyBjaGFyIGljaV9JQ0dldFNlZWRfX2RvY19fW10gPSAKK3N0YXRpYyBjaGFyIGljaV9JQ0dldFNlZWRfX2RvY19fW10gPQogIigpLT5pbnQ7IFJldHVybnMgaW50IHRoYXQgY2hhbmdlcyB3aGVuIGNvbmZpZ3VyYXRpb24gZG9lcyIKIDsKIAogc3RhdGljIFB5T2JqZWN0ICoKIGljaV9JQ0dldFNlZWQoaWNpb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlPU1N0YXR1cyBlcnI7Ci0JbG9uZyBzZWVkOwotCQotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCWlmICgoZXJyPUlDR2V0U2VlZChzZWxmLT5pbnN0LCAmc2VlZCkpICE9IDAgKQotCQlyZXR1cm4gUHlNYWNfRXJyb3IoZXJyKTsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIChpbnQpc2VlZCk7CisgICAgT1NTdGF0dXMgZXJyOworICAgIGxvbmcgc2VlZDsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICgoZXJyPUlDR2V0U2VlZChzZWxmLT5pbnN0LCAmc2VlZCkpICE9IDAgKQorICAgICAgICByZXR1cm4gUHlNYWNfRXJyb3IoZXJyKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIChpbnQpc2VlZCk7CiB9CiAKIAotc3RhdGljIGNoYXIgaWNpX0lDQmVnaW5fX2RvY19fW10gPSAKK3N0YXRpYyBjaGFyIGljaV9JQ0JlZ2luX19kb2NfX1tdID0KICIocGVybSktPk5vbmU7IExvY2sgY29uZmlnIGZpbGUgZm9yIHJlYWQvd3JpdGUiCiA7CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpY2lfSUNCZWdpbihpY2lvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCU9TU3RhdHVzIGVycjsKLQlpbnQgcGVybTsKLQkKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImkiLCAmcGVybSkpCi0JCXJldHVybiBOVUxMOwotCWlmICgoZXJyPUlDQmVnaW4oc2VsZi0+aW5zdCwgKElDUGVybSlwZXJtKSkgIT0gMCApCi0JCXJldHVybiBQeU1hY19FcnJvcihlcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBPU1N0YXR1cyBlcnI7CisgICAgaW50IHBlcm07CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImkiLCAmcGVybSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICgoZXJyPUlDQmVnaW4oc2VsZi0+aW5zdCwgKElDUGVybSlwZXJtKSkgIT0gMCApCisgICAgICAgIHJldHVybiBQeU1hY19FcnJvcihlcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogCi1zdGF0aWMgY2hhciBpY2lfSUNGaW5kUHJlZkhhbmRsZV9fZG9jX19bXSA9IAorc3RhdGljIGNoYXIgaWNpX0lDRmluZFByZWZIYW5kbGVfX2RvY19fW10gPQogIihrZXksIGhhbmRsZSktPmF0dHJzOyBMb29rdXAga2V5LCBzdG9yZSByZXN1bHQgaW4gaGFuZGxlLCByZXR1cm4gYXR0cmlidXRlcyIKIDsKIAogc3RhdGljIFB5T2JqZWN0ICoKIGljaV9JQ0ZpbmRQcmVmSGFuZGxlKGljaW9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JT1NTdGF0dXMgZXJyOwotCVN0cjI1NSBrZXk7Ci0JSUNBdHRyIGF0dHI7Ci0JSGFuZGxlIGg7Ci0JCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJk8mIiwgUHlNYWNfR2V0U3RyMjU1LCAma2V5LCBSZXNPYmpfQ29udmVydCwgJmgpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoKGVycj1JQ0ZpbmRQcmVmSGFuZGxlKHNlbGYtPmluc3QsIGtleSwgJmF0dHIsIGgpKSAhPSAwICkKLQkJcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLCAoaW50KWF0dHIpOworICAgIE9TU3RhdHVzIGVycjsKKyAgICBTdHIyNTUga2V5OworICAgIElDQXR0ciBhdHRyOworICAgIEhhbmRsZSBoOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJk8mIiwgUHlNYWNfR2V0U3RyMjU1LCAma2V5LCBSZXNPYmpfQ29udmVydCwgJmgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoKGVycj1JQ0ZpbmRQcmVmSGFuZGxlKHNlbGYtPmluc3QsIGtleSwgJmF0dHIsIGgpKSAhPSAwICkKKyAgICAgICAgcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLCAoaW50KWF0dHIpOwogfQogCiAKLXN0YXRpYyBjaGFyIGljaV9JQ1NldFByZWZfX2RvY19fW10gPSAKK3N0YXRpYyBjaGFyIGljaV9JQ1NldFByZWZfX2RvY19fW10gPQogIihrZXksIGF0dHIsIGRhdGEpLT5Ob25lOyBTZXQgcHJlZmVyZW5jZSBrZXkgdG8gZGF0YSB3aXRoIGF0dHJpYnV0ZXMiCiA7CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpY2lfSUNTZXRQcmVmKGljaW9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JT1NTdGF0dXMgZXJyOwotCVN0cjI1NSBrZXk7Ci0JaW50IGF0dHI7Ci0JY2hhciAqZGF0YTsKLQlpbnQgZGF0YWxlbjsKLQkKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8maXMjIiwgUHlNYWNfR2V0U3RyMjU1LCAma2V5LCAmYXR0ciwgCi0JCQkJCSZkYXRhLCAmZGF0YWxlbikpCi0JCXJldHVybiBOVUxMOwotCWlmICgoZXJyPUlDU2V0UHJlZihzZWxmLT5pbnN0LCBrZXksIChJQ0F0dHIpYXR0ciwgKFB0cilkYXRhLCAKLQkJCShsb25nKWRhdGFsZW4pKSAhPSAwKQotCQlyZXR1cm4gUHlNYWNfRXJyb3IoZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgT1NTdGF0dXMgZXJyOworICAgIFN0cjI1NSBrZXk7CisgICAgaW50IGF0dHI7CisgICAgY2hhciAqZGF0YTsKKyAgICBpbnQgZGF0YWxlbjsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyZpcyMiLCBQeU1hY19HZXRTdHIyNTUsICZrZXksICZhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGEsICZkYXRhbGVuKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKChlcnI9SUNTZXRQcmVmKHNlbGYtPmluc3QsIGtleSwgKElDQXR0cilhdHRyLCAoUHRyKWRhdGEsCisgICAgICAgICAgICAgICAgICAgIChsb25nKWRhdGFsZW4pKSAhPSAwKQorICAgICAgICByZXR1cm4gUHlNYWNfRXJyb3IoZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIAotc3RhdGljIGNoYXIgaWNpX0lDQ291bnRQcmVmX19kb2NfX1tdID0gCitzdGF0aWMgY2hhciBpY2lfSUNDb3VudFByZWZfX2RvY19fW10gPQogIigpLT5pbnQ7IFJldHVybiBudW1iZXIgb2YgcHJlZmVyZW5jZXMiCiA7CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpY2lfSUNDb3VudFByZWYoaWNpb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlPU1N0YXR1cyBlcnI7Ci0JbG9uZyBjb3VudDsKLQkKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoKGVycj1JQ0NvdW50UHJlZihzZWxmLT5pbnN0LCAmY291bnQpKSAhPSAwICkKLQkJcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLCAoaW50KWNvdW50KTsKKyAgICBPU1N0YXR1cyBlcnI7CisgICAgbG9uZyBjb3VudDsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICgoZXJyPUlDQ291bnRQcmVmKHNlbGYtPmluc3QsICZjb3VudCkpICE9IDAgKQorICAgICAgICByZXR1cm4gUHlNYWNfRXJyb3IoZXJyKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIChpbnQpY291bnQpOwogfQogCiAKLXN0YXRpYyBjaGFyIGljaV9JQ0dldEluZFByZWZfX2RvY19fW10gPSAKK3N0YXRpYyBjaGFyIGljaV9JQ0dldEluZFByZWZfX2RvY19fW10gPQogIihudW0pLT5rZXk7IFJldHVybiBrZXkgb2YgcHJlZmVyZW5jZSB3aXRoIGdpdmVuIGluZGV4IgogOwogCiBzdGF0aWMgUHlPYmplY3QgKgogaWNpX0lDR2V0SW5kUHJlZihpY2lvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCU9TU3RhdHVzIGVycjsKLQlsb25nIG51bTsKLQlTdHIyNTUga2V5OwotCQotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibCIsICZudW0pKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoKGVycj1JQ0dldEluZFByZWYoc2VsZi0+aW5zdCwgbnVtLCBrZXkpKSAhPSAwICkKLQkJcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgUHlNYWNfQnVpbGRTdHIyNTUsIGtleSk7CisgICAgT1NTdGF0dXMgZXJyOworICAgIGxvbmcgbnVtOworICAgIFN0cjI1NSBrZXk7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImwiLCAmbnVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKChlcnI9SUNHZXRJbmRQcmVmKHNlbGYtPmluc3QsIG51bSwga2V5KSkgIT0gMCApCisgICAgICAgIHJldHVybiBQeU1hY19FcnJvcihlcnIpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPJiIsIFB5TWFjX0J1aWxkU3RyMjU1LCBrZXkpOwogfQogCiAKLXN0YXRpYyBjaGFyIGljaV9JQ0RlbGV0ZVByZWZfX2RvY19fW10gPSAKK3N0YXRpYyBjaGFyIGljaV9JQ0RlbGV0ZVByZWZfX2RvY19fW10gPQogIihrZXkpLT5Ob25lOyBEZWxldGUgcHJlZmVyZW5jZSIKIDsKIAogc3RhdGljIFB5T2JqZWN0ICoKIGljaV9JQ0RlbGV0ZVByZWYoaWNpb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlPU1N0YXR1cyBlcnI7Ci0JU3RyMjU1IGtleTsKKyAgICBPU1N0YXR1cyBlcnI7CisgICAgU3RyMjU1IGtleTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyYiLCBQeU1hY19HZXRTdHIyNTUsIGtleSkpCi0JCXJldHVybiBOVUxMOwotCWlmICgoZXJyPUlDRGVsZXRlUHJlZihzZWxmLT5pbnN0LCBrZXkpKSAhPSAwICkKLQkJcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyYiLCBQeU1hY19HZXRTdHIyNTUsIGtleSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICgoZXJyPUlDRGVsZXRlUHJlZihzZWxmLT5pbnN0LCBrZXkpKSAhPSAwICkKKyAgICAgICAgcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAKLXN0YXRpYyBjaGFyIGljaV9JQ0VuZF9fZG9jX19bXSA9IAorc3RhdGljIGNoYXIgaWNpX0lDRW5kX19kb2NfX1tdID0KICIoKS0+Tm9uZTsgVW5sb2NrIGZpbGUgYWZ0ZXIgSUNCZWdpbiBjYWxsIgogOwogCiBzdGF0aWMgUHlPYmplY3QgKgogaWNpX0lDRW5kKGljaW9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JT1NTdGF0dXMgZXJyOwotCQotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCWlmICgoZXJyPUlDRW5kKHNlbGYtPmluc3QpKSAhPSAwICkKLQkJcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIE9TU3RhdHVzIGVycjsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICgoZXJyPUlDRW5kKHNlbGYtPmluc3QpKSAhPSAwICkKKyAgICAgICAgcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAKLXN0YXRpYyBjaGFyIGljaV9JQ0VkaXRQcmVmZXJlbmNlc19fZG9jX19bXSA9IAorc3RhdGljIGNoYXIgaWNpX0lDRWRpdFByZWZlcmVuY2VzX19kb2NfX1tdID0KICIoa2V5KS0+Tm9uZTsgQXNrIHVzZXIgdG8gZWRpdCBwcmVmZXJlbmNlcywgc3RhcmluZyB3aXRoIGtleSIKIDsKIAogc3RhdGljIFB5T2JqZWN0ICoKIGljaV9JQ0VkaXRQcmVmZXJlbmNlcyhpY2lvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCU9TU3RhdHVzIGVycjsKLQlTdHIyNTUga2V5OwotCQotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyYiLCBQeU1hY19HZXRTdHIyNTUsIGtleSkpCi0JCXJldHVybiBOVUxMOwotCWlmICgoZXJyPUlDRWRpdFByZWZlcmVuY2VzKHNlbGYtPmluc3QsIGtleSkpICE9IDAgKQotCQlyZXR1cm4gUHlNYWNfRXJyb3IoZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgT1NTdGF0dXMgZXJyOworICAgIFN0cjI1NSBrZXk7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mIiwgUHlNYWNfR2V0U3RyMjU1LCBrZXkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoKGVycj1JQ0VkaXRQcmVmZXJlbmNlcyhzZWxmLT5pbnN0LCBrZXkpKSAhPSAwICkKKyAgICAgICAgcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAKLXN0YXRpYyBjaGFyIGljaV9JQ1BhcnNlVVJMX19kb2NfX1tdID0gCitzdGF0aWMgY2hhciBpY2lfSUNQYXJzZVVSTF9fZG9jX19bXSA9CiAiKGhpbnQsIGRhdGEsIHNlbFN0YXJ0LCBzZWxFbmQsIGhhbmRsZSktPnNlbFN0YXJ0LCBzZWxFbmQ7IEZpbmQgYW4gVVJMLCByZXR1cm4gaW4gaGFuZGxlIgogOwogCiBzdGF0aWMgUHlPYmplY3QgKgogaWNpX0lDUGFyc2VVUkwoaWNpb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlPU1N0YXR1cyBlcnI7Ci0JU3RyMjU1IGhpbnQ7Ci0JY2hhciAqZGF0YTsKLQlpbnQgZGF0YWxlbjsKLQlsb25nIHNlbFN0YXJ0LCBzZWxFbmQ7Ci0JSGFuZGxlIGg7Ci0JCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJnMjbGxPJiIsIFB5TWFjX0dldFN0cjI1NSwgaGludCwgJmRhdGEsICZkYXRhbGVuLAotCQkJCSZzZWxTdGFydCwgJnNlbEVuZCwgUmVzT2JqX0NvbnZlcnQsICZoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKChlcnI9SUNQYXJzZVVSTChzZWxmLT5pbnN0LCBoaW50LCAoUHRyKWRhdGEsIChsb25nKWRhdGFsZW4sCi0JCQkJJnNlbFN0YXJ0LCAmc2VsRW5kLCBoKSkgIT0gMCApCi0JCXJldHVybiBQeU1hY19FcnJvcihlcnIpOwotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJpaSIsIChpbnQpc2VsU3RhcnQsIChpbnQpc2VsRW5kKTsKKyAgICBPU1N0YXR1cyBlcnI7CisgICAgU3RyMjU1IGhpbnQ7CisgICAgY2hhciAqZGF0YTsKKyAgICBpbnQgZGF0YWxlbjsKKyAgICBsb25nIHNlbFN0YXJ0LCBzZWxFbmQ7CisgICAgSGFuZGxlIGg7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mcyNsbE8mIiwgUHlNYWNfR2V0U3RyMjU1LCBoaW50LCAmZGF0YSwgJmRhdGFsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlbFN0YXJ0LCAmc2VsRW5kLCBSZXNPYmpfQ29udmVydCwgJmgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoKGVycj1JQ1BhcnNlVVJMKHNlbGYtPmluc3QsIGhpbnQsIChQdHIpZGF0YSwgKGxvbmcpZGF0YWxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VsU3RhcnQsICZzZWxFbmQsIGgpKSAhPSAwICkKKyAgICAgICAgcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImlpIiwgKGludClzZWxTdGFydCwgKGludClzZWxFbmQpOwogfQogCiAKLXN0YXRpYyBjaGFyIGljaV9JQ0xhdW5jaFVSTF9fZG9jX19bXSA9IAorc3RhdGljIGNoYXIgaWNpX0lDTGF1bmNoVVJMX19kb2NfX1tdID0KICIoaGludCwgZGF0YSwgc2VsU3RhcnQsIHNlbEVuZCktPk5vbmU7IEZpbmQgYW4gVVJMIGFuZCBsYXVuY2ggdGhlIGNvcnJlY3QgYXBwIgogOwogCiBzdGF0aWMgUHlPYmplY3QgKgogaWNpX0lDTGF1bmNoVVJMKGljaW9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JT1NTdGF0dXMgZXJyOwotCVN0cjI1NSBoaW50OwotCWNoYXIgKmRhdGE7Ci0JaW50IGRhdGFsZW47Ci0JbG9uZyBzZWxTdGFydCwgc2VsRW5kOwotCQotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyZzI2xsIiwgUHlNYWNfR2V0U3RyMjU1LCBoaW50LCAmZGF0YSwgJmRhdGFsZW4sCi0JCQkJJnNlbFN0YXJ0LCAmc2VsRW5kKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKChlcnI9SUNMYXVuY2hVUkwoc2VsZi0+aW5zdCwgaGludCwgKFB0cilkYXRhLCAobG9uZylkYXRhbGVuLAotCQkJCSZzZWxTdGFydCwgJnNlbEVuZCkpICE9IDAgKQotCQlyZXR1cm4gUHlNYWNfRXJyb3IoZXJyKTsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaWkiLCAoaW50KXNlbFN0YXJ0LCAoaW50KXNlbEVuZCk7CisgICAgT1NTdGF0dXMgZXJyOworICAgIFN0cjI1NSBoaW50OworICAgIGNoYXIgKmRhdGE7CisgICAgaW50IGRhdGFsZW47CisgICAgbG9uZyBzZWxTdGFydCwgc2VsRW5kOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJnMjbGwiLCBQeU1hY19HZXRTdHIyNTUsIGhpbnQsICZkYXRhLCAmZGF0YWxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VsU3RhcnQsICZzZWxFbmQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoKGVycj1JQ0xhdW5jaFVSTChzZWxmLT5pbnN0LCBoaW50LCAoUHRyKWRhdGEsIChsb25nKWRhdGFsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlbFN0YXJ0LCAmc2VsRW5kKSkgIT0gMCApCisgICAgICAgIHJldHVybiBQeU1hY19FcnJvcihlcnIpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJpaSIsIChpbnQpc2VsU3RhcnQsIChpbnQpc2VsRW5kKTsKIH0KIAogCi1zdGF0aWMgY2hhciBpY2lfSUNNYXBGaWxlbmFtZV9fZG9jX19bXSA9IAorc3RhdGljIGNoYXIgaWNpX0lDTWFwRmlsZW5hbWVfX2RvY19fW10gPQogIihmaWxlbmFtZSktPm1hcGluZm87IEdldCBmaWxlbWFwIGluZm8gZm9yIGdpdmVuIGZpbGVuYW1lIgogOwogCiBzdGF0aWMgUHlPYmplY3QgKgogaWNpX0lDTWFwRmlsZW5hbWUoaWNpb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlPU1N0YXR1cyBlcnI7Ci0JU3RyMjU1IGZpbGVuYW1lOwotCUlDTWFwRW50cnkgZW50cnk7Ci0JCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJiIsIFB5TWFjX0dldFN0cjI1NSwgZmlsZW5hbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoKGVycj1JQ01hcEZpbGVuYW1lKHNlbGYtPmluc3QsIGZpbGVuYW1lLCAmZW50cnkpKSAhPSAwICkKLQkJcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImhPJk8mTyZsTyZPJk8mTyZPJiIsIGVudHJ5LnZlcnNpb24sIAotCQlQeU1hY19CdWlsZE9TVHlwZSwgZW50cnkuZmlsZVR5cGUsCi0JCVB5TWFjX0J1aWxkT1NUeXBlLCBlbnRyeS5maWxlQ3JlYXRvciwgCi0JCVB5TWFjX0J1aWxkT1NUeXBlLCBlbnRyeS5wb3N0Q3JlYXRvciwgCi0JCWVudHJ5LmZsYWdzLAotCQlQeU1hY19CdWlsZFN0cjI1NSwgZW50cnkuZXh0ZW5zaW9uLAotCQlQeU1hY19CdWlsZFN0cjI1NSwgZW50cnkuY3JlYXRvckFwcE5hbWUsCi0JCVB5TWFjX0J1aWxkU3RyMjU1LCBlbnRyeS5wb3N0QXBwTmFtZSwKLQkJUHlNYWNfQnVpbGRTdHIyNTUsIGVudHJ5Lk1JTUVUeXBlLAotCQlQeU1hY19CdWlsZFN0cjI1NSwgZW50cnkuZW50cnlOYW1lKTsKKyAgICBPU1N0YXR1cyBlcnI7CisgICAgU3RyMjU1IGZpbGVuYW1lOworICAgIElDTWFwRW50cnkgZW50cnk7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mIiwgUHlNYWNfR2V0U3RyMjU1LCBmaWxlbmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICgoZXJyPUlDTWFwRmlsZW5hbWUoc2VsZi0+aW5zdCwgZmlsZW5hbWUsICZlbnRyeSkpICE9IDAgKQorICAgICAgICByZXR1cm4gUHlNYWNfRXJyb3IoZXJyKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaE8mTyZPJmxPJk8mTyZPJk8mIiwgZW50cnkudmVyc2lvbiwKKyAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIGVudHJ5LmZpbGVUeXBlLAorICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgZW50cnkuZmlsZUNyZWF0b3IsCisgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBlbnRyeS5wb3N0Q3JlYXRvciwKKyAgICAgICAgZW50cnkuZmxhZ3MsCisgICAgICAgIFB5TWFjX0J1aWxkU3RyMjU1LCBlbnRyeS5leHRlbnNpb24sCisgICAgICAgIFB5TWFjX0J1aWxkU3RyMjU1LCBlbnRyeS5jcmVhdG9yQXBwTmFtZSwKKyAgICAgICAgUHlNYWNfQnVpbGRTdHIyNTUsIGVudHJ5LnBvc3RBcHBOYW1lLAorICAgICAgICBQeU1hY19CdWlsZFN0cjI1NSwgZW50cnkuTUlNRVR5cGUsCisgICAgICAgIFB5TWFjX0J1aWxkU3RyMjU1LCBlbnRyeS5lbnRyeU5hbWUpOwogfQogCiAKLXN0YXRpYyBjaGFyIGljaV9JQ01hcFR5cGVDcmVhdG9yX19kb2NfX1tdID0gCitzdGF0aWMgY2hhciBpY2lfSUNNYXBUeXBlQ3JlYXRvcl9fZG9jX19bXSA9CiAiKHR5cGUsIGNyZWF0b3IsIGZpbGVuYW1lKS0+bWFwaW5mbzsgR2V0IGZpbGVtYXAgaW5mbyBmb3IgZ2l2ZW4gdHAvY3IvZmlsZW5hbWUiCiA7CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpY2lfSUNNYXBUeXBlQ3JlYXRvcihpY2lvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCU9TU3RhdHVzIGVycjsKLQlPU1R5cGUgdHlwZSwgY3JlYXRvcjsKLQlTdHIyNTUgZmlsZW5hbWU7Ci0JSUNNYXBFbnRyeSBlbnRyeTsKLQkKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mTyZPJiIsCi0JCQlQeU1hY19HZXRPU1R5cGUsICZ0eXBlLAotCQkJUHlNYWNfR2V0T1NUeXBlLCAmY3JlYXRvciwKLQkJCVB5TWFjX0dldFN0cjI1NSwgZmlsZW5hbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoKGVycj1JQ01hcFR5cGVDcmVhdG9yKHNlbGYtPmluc3QsIHR5cGUsIGNyZWF0b3IsIGZpbGVuYW1lLCAmZW50cnkpKSAhPSAwICkKLQkJcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImhPJk8mTyZsTyZPJk8mTyZPJiIsIGVudHJ5LnZlcnNpb24sIAotCQlQeU1hY19CdWlsZE9TVHlwZSwgZW50cnkuZmlsZVR5cGUsCi0JCVB5TWFjX0J1aWxkT1NUeXBlLCBlbnRyeS5maWxlQ3JlYXRvciwgCi0JCVB5TWFjX0J1aWxkT1NUeXBlLCBlbnRyeS5wb3N0Q3JlYXRvciwgCi0JCWVudHJ5LmZsYWdzLAotCQlQeU1hY19CdWlsZFN0cjI1NSwgZW50cnkuZXh0ZW5zaW9uLAotCQlQeU1hY19CdWlsZFN0cjI1NSwgZW50cnkuY3JlYXRvckFwcE5hbWUsCi0JCVB5TWFjX0J1aWxkU3RyMjU1LCBlbnRyeS5wb3N0QXBwTmFtZSwKLQkJUHlNYWNfQnVpbGRTdHIyNTUsIGVudHJ5Lk1JTUVUeXBlLAotCQlQeU1hY19CdWlsZFN0cjI1NSwgZW50cnkuZW50cnlOYW1lKTsKKyAgICBPU1N0YXR1cyBlcnI7CisgICAgT1NUeXBlIHR5cGUsIGNyZWF0b3I7CisgICAgU3RyMjU1IGZpbGVuYW1lOworICAgIElDTWFwRW50cnkgZW50cnk7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnR5cGUsCisgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgZmlsZW5hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoKGVycj1JQ01hcFR5cGVDcmVhdG9yKHNlbGYtPmluc3QsIHR5cGUsIGNyZWF0b3IsIGZpbGVuYW1lLCAmZW50cnkpKSAhPSAwICkKKyAgICAgICAgcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImhPJk8mTyZsTyZPJk8mTyZPJiIsIGVudHJ5LnZlcnNpb24sCisgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBlbnRyeS5maWxlVHlwZSwKKyAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIGVudHJ5LmZpbGVDcmVhdG9yLAorICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgZW50cnkucG9zdENyZWF0b3IsCisgICAgICAgIGVudHJ5LmZsYWdzLAorICAgICAgICBQeU1hY19CdWlsZFN0cjI1NSwgZW50cnkuZXh0ZW5zaW9uLAorICAgICAgICBQeU1hY19CdWlsZFN0cjI1NSwgZW50cnkuY3JlYXRvckFwcE5hbWUsCisgICAgICAgIFB5TWFjX0J1aWxkU3RyMjU1LCBlbnRyeS5wb3N0QXBwTmFtZSwKKyAgICAgICAgUHlNYWNfQnVpbGRTdHIyNTUsIGVudHJ5Lk1JTUVUeXBlLAorICAgICAgICBQeU1hY19CdWlsZFN0cjI1NSwgZW50cnkuZW50cnlOYW1lKTsKIH0KIAogCiBzdGF0aWMgc3RydWN0IFB5TWV0aG9kRGVmIGljaV9tZXRob2RzW10gPSB7Ci0geyJJQ0dldFNlZWQiLAkoUHlDRnVuY3Rpb24paWNpX0lDR2V0U2VlZCwJTUVUSF9WQVJBUkdTLAlpY2lfSUNHZXRTZWVkX19kb2NfX30sCi0geyJJQ0JlZ2luIiwJKFB5Q0Z1bmN0aW9uKWljaV9JQ0JlZ2luLAlNRVRIX1ZBUkFSR1MsCWljaV9JQ0JlZ2luX19kb2NfX30sCi0geyJJQ0ZpbmRQcmVmSGFuZGxlIiwJKFB5Q0Z1bmN0aW9uKWljaV9JQ0ZpbmRQcmVmSGFuZGxlLAlNRVRIX1ZBUkFSR1MsCWljaV9JQ0ZpbmRQcmVmSGFuZGxlX19kb2NfX30sCi0geyJJQ1NldFByZWYiLAkoUHlDRnVuY3Rpb24paWNpX0lDU2V0UHJlZiwJTUVUSF9WQVJBUkdTLAlpY2lfSUNTZXRQcmVmX19kb2NfX30sCi0geyJJQ0NvdW50UHJlZiIsCShQeUNGdW5jdGlvbilpY2lfSUNDb3VudFByZWYsCU1FVEhfVkFSQVJHUywJaWNpX0lDQ291bnRQcmVmX19kb2NfX30sCi0geyJJQ0dldEluZFByZWYiLAkoUHlDRnVuY3Rpb24paWNpX0lDR2V0SW5kUHJlZiwJTUVUSF9WQVJBUkdTLAlpY2lfSUNHZXRJbmRQcmVmX19kb2NfX30sCi0geyJJQ0RlbGV0ZVByZWYiLAkoUHlDRnVuY3Rpb24paWNpX0lDRGVsZXRlUHJlZiwJTUVUSF9WQVJBUkdTLAlpY2lfSUNEZWxldGVQcmVmX19kb2NfX30sCi0geyJJQ0VuZCIsCShQeUNGdW5jdGlvbilpY2lfSUNFbmQsCU1FVEhfVkFSQVJHUywJaWNpX0lDRW5kX19kb2NfX30sCi0geyJJQ0VkaXRQcmVmZXJlbmNlcyIsCShQeUNGdW5jdGlvbilpY2lfSUNFZGl0UHJlZmVyZW5jZXMsCU1FVEhfVkFSQVJHUywJaWNpX0lDRWRpdFByZWZlcmVuY2VzX19kb2NfX30sCi0geyJJQ1BhcnNlVVJMIiwJKFB5Q0Z1bmN0aW9uKWljaV9JQ1BhcnNlVVJMLAlNRVRIX1ZBUkFSR1MsCWljaV9JQ1BhcnNlVVJMX19kb2NfX30sCi0geyJJQ0xhdW5jaFVSTCIsCShQeUNGdW5jdGlvbilpY2lfSUNMYXVuY2hVUkwsCU1FVEhfVkFSQVJHUywJaWNpX0lDTGF1bmNoVVJMX19kb2NfX30sCi0geyJJQ01hcEZpbGVuYW1lIiwJKFB5Q0Z1bmN0aW9uKWljaV9JQ01hcEZpbGVuYW1lLAlNRVRIX1ZBUkFSR1MsCWljaV9JQ01hcEZpbGVuYW1lX19kb2NfX30sCi0geyJJQ01hcFR5cGVDcmVhdG9yIiwJKFB5Q0Z1bmN0aW9uKWljaV9JQ01hcFR5cGVDcmVhdG9yLAlNRVRIX1ZBUkFSR1MsCWljaV9JQ01hcFR5cGVDcmVhdG9yX19kb2NfX30sCi0gCi0Je05VTEwsCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyB7IklDR2V0U2VlZCIsICAoUHlDRnVuY3Rpb24paWNpX0lDR2V0U2VlZCwgICAgIE1FVEhfVkFSQVJHUywgICBpY2lfSUNHZXRTZWVkX19kb2NfX30sCisgeyJJQ0JlZ2luIiwgICAgKFB5Q0Z1bmN0aW9uKWljaV9JQ0JlZ2luLCAgICAgICBNRVRIX1ZBUkFSR1MsICAgaWNpX0lDQmVnaW5fX2RvY19ffSwKKyB7IklDRmluZFByZWZIYW5kbGUiLCAgIChQeUNGdW5jdGlvbilpY2lfSUNGaW5kUHJlZkhhbmRsZSwgICAgICBNRVRIX1ZBUkFSR1MsICAgaWNpX0lDRmluZFByZWZIYW5kbGVfX2RvY19ffSwKKyB7IklDU2V0UHJlZiIsICAoUHlDRnVuY3Rpb24paWNpX0lDU2V0UHJlZiwgICAgIE1FVEhfVkFSQVJHUywgICBpY2lfSUNTZXRQcmVmX19kb2NfX30sCisgeyJJQ0NvdW50UHJlZiIsICAgICAgICAoUHlDRnVuY3Rpb24paWNpX0lDQ291bnRQcmVmLCAgIE1FVEhfVkFSQVJHUywgICBpY2lfSUNDb3VudFByZWZfX2RvY19ffSwKKyB7IklDR2V0SW5kUHJlZiIsICAgICAgIChQeUNGdW5jdGlvbilpY2lfSUNHZXRJbmRQcmVmLCAgTUVUSF9WQVJBUkdTLCAgIGljaV9JQ0dldEluZFByZWZfX2RvY19ffSwKKyB7IklDRGVsZXRlUHJlZiIsICAgICAgIChQeUNGdW5jdGlvbilpY2lfSUNEZWxldGVQcmVmLCAgTUVUSF9WQVJBUkdTLCAgIGljaV9JQ0RlbGV0ZVByZWZfX2RvY19ffSwKKyB7IklDRW5kIiwgICAgICAoUHlDRnVuY3Rpb24paWNpX0lDRW5kLCBNRVRIX1ZBUkFSR1MsICAgaWNpX0lDRW5kX19kb2NfX30sCisgeyJJQ0VkaXRQcmVmZXJlbmNlcyIsICAoUHlDRnVuY3Rpb24paWNpX0lDRWRpdFByZWZlcmVuY2VzLCAgICAgTUVUSF9WQVJBUkdTLCAgIGljaV9JQ0VkaXRQcmVmZXJlbmNlc19fZG9jX199LAorIHsiSUNQYXJzZVVSTCIsIChQeUNGdW5jdGlvbilpY2lfSUNQYXJzZVVSTCwgICAgTUVUSF9WQVJBUkdTLCAgIGljaV9JQ1BhcnNlVVJMX19kb2NfX30sCisgeyJJQ0xhdW5jaFVSTCIsICAgICAgICAoUHlDRnVuY3Rpb24paWNpX0lDTGF1bmNoVVJMLCAgIE1FVEhfVkFSQVJHUywgICBpY2lfSUNMYXVuY2hVUkxfX2RvY19ffSwKKyB7IklDTWFwRmlsZW5hbWUiLCAgICAgIChQeUNGdW5jdGlvbilpY2lfSUNNYXBGaWxlbmFtZSwgTUVUSF9WQVJBUkdTLCAgIGljaV9JQ01hcEZpbGVuYW1lX19kb2NfX30sCisgeyJJQ01hcFR5cGVDcmVhdG9yIiwgICAoUHlDRnVuY3Rpb24paWNpX0lDTWFwVHlwZUNyZWF0b3IsICAgICAgTUVUSF9WQVJBUkdTLCAgIGljaV9JQ01hcFR5cGVDcmVhdG9yX19kb2NfX30sCisKKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogLyogLS0tLS0tLS0tLSAqLwpAQCAtMzU5LDYxICszNTksNjEgQEAKIHN0YXRpYyBpY2lvYmplY3QgKgogbmV3aWNpb2JqZWN0KE9TVHlwZSBjcmVhdG9yKQogewotCWljaW9iamVjdCAqc2VsZjsKLQlPU1N0YXR1cyBlcnI7Ci0JCi0Jc2VsZiA9IFB5T2JqZWN0X05FVyhpY2lvYmplY3QsICZJY2l0eXBlKTsKLQlpZiAoc2VsZiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoKGVycj1JQ1N0YXJ0KCZzZWxmLT5pbnN0LCBjcmVhdG9yKSkgIT0gMCApIHsKLQkJKHZvaWQpUHlNYWNfRXJyb3IoZXJyKTsKLQkJUHlPYmplY3RfREVMKHNlbGYpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIHNlbGY7CisgICAgaWNpb2JqZWN0ICpzZWxmOworICAgIE9TU3RhdHVzIGVycjsKKworICAgIHNlbGYgPSBQeU9iamVjdF9ORVcoaWNpb2JqZWN0LCAmSWNpdHlwZSk7CisgICAgaWYgKHNlbGYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKChlcnI9SUNTdGFydCgmc2VsZi0+aW5zdCwgY3JlYXRvcikpICE9IDAgKSB7CisgICAgICAgICh2b2lkKVB5TWFjX0Vycm9yKGVycik7CisgICAgICAgIFB5T2JqZWN0X0RFTChzZWxmKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBzZWxmOwogfQogCiAKIHN0YXRpYyB2b2lkCiBpY2lfZGVhbGxvYyhpY2lvYmplY3QgKnNlbGYpCiB7Ci0JKHZvaWQpSUNTdG9wKHNlbGYtPmluc3QpOwotCVB5T2JqZWN0X0RFTChzZWxmKTsKKyAgICAodm9pZClJQ1N0b3Aoc2VsZi0+aW5zdCk7CisgICAgUHlPYmplY3RfREVMKHNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaWNpX2dldGF0dHIoaWNpb2JqZWN0ICpzZWxmLCBjaGFyICpuYW1lKQogewotCXJldHVybiBQeV9GaW5kTWV0aG9kKGljaV9tZXRob2RzLCAoUHlPYmplY3QgKilzZWxmLCBuYW1lKTsKKyAgICByZXR1cm4gUHlfRmluZE1ldGhvZChpY2lfbWV0aG9kcywgKFB5T2JqZWN0ICopc2VsZiwgbmFtZSk7CiB9CiAKLXN0YXRpYyBjaGFyIEljaXR5cGVfX2RvY19fW10gPSAKK3N0YXRpYyBjaGFyIEljaXR5cGVfX2RvY19fW10gPQogIkludGVybmV0IENvbmZpZyBpbnN0YW5jZSIKIDsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBJY2l0eXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUpCi0JMCwJCQkJLypvYl9zaXplKi8KLQkiaWNnbHVlLmljX2luc3RhbmNlIiwJCS8qdHBfbmFtZSovCi0Jc2l6ZW9mKGljaW9iamVjdCksCQkvKnRwX2Jhc2ljc2l6ZSovCi0JMCwJCQkJLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKWljaV9kZWFsbG9jLAkvKnRwX2RlYWxsb2MqLwotCShwcmludGZ1bmMpMCwJCS8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYylpY2lfZ2V0YXR0ciwJLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpMCwJLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykwLAkJLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpMCwJCS8qdHBfcmVwciovCi0JMCwJCQkvKnRwX2FzX251bWJlciovCi0JMCwJCS8qdHBfYXNfc2VxdWVuY2UqLwotCTAsCQkvKnRwX2FzX21hcHBpbmcqLwotCShoYXNoZnVuYykwLAkJLyp0cF9oYXNoKi8KLQkodGVybmFyeWZ1bmMpMCwJCS8qdHBfY2FsbCovCi0JKHJlcHJmdW5jKTAsCQkvKnRwX3N0ciovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSkKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm9iX3NpemUqLworICAgICJpY2dsdWUuaWNfaW5zdGFuY2UiLCAgICAgICAgICAgICAgIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKGljaW9iamVjdCksICAgICAgICAgICAgICAgICAgLyp0cF9iYXNpY3NpemUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcilpY2lfZGVhbGxvYywgICAgICAgICAgICAvKnRwX2RlYWxsb2MqLworICAgIChwcmludGZ1bmMpMCwgICAgICAgICAgICAgICAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpaWNpX2dldGF0dHIsICAgICAgICAgICAvKnRwX2dldGF0dHIqLworICAgIChzZXRhdHRyZnVuYykwLCAgICAgLyp0cF9zZXRhdHRyKi8KKyAgICAoY21wZnVuYykwLCAgICAgICAgICAgICAgICAgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpMCwgICAgICAgICAgICAgICAgLyp0cF9yZXByKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19udW1iZXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9hc19zZXF1ZW5jZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX2FzX21hcHBpbmcqLworICAgIChoYXNoZnVuYykwLCAgICAgICAgICAgICAgICAvKnRwX2hhc2gqLworICAgICh0ZXJuYXJ5ZnVuYykwLCAgICAgICAgICAgICAvKnRwX2NhbGwqLworICAgIChyZXByZnVuYykwLCAgICAgICAgICAgICAgICAvKnRwX3N0ciovCiAKLQkvKiBTcGFjZSBmb3IgZnV0dXJlIGV4cGFuc2lvbiAqLwotCTBMLDBMLDBMLDBMLAotCUljaXR5cGVfX2RvY19fIC8qIERvY3VtZW50YXRpb24gc3RyaW5nICovCisgICAgLyogU3BhY2UgZm9yIGZ1dHVyZSBleHBhbnNpb24gKi8KKyAgICAwTCwwTCwwTCwwTCwKKyAgICBJY2l0eXBlX19kb2NfXyAvKiBEb2N1bWVudGF0aW9uIHN0cmluZyAqLwogfTsKIAogLyogRW5kIG9mIGNvZGUgZm9yIGljX2luc3RhbmNlIG9iamVjdHMgKi8KQEAgLTQyNyw1MiArNDI3LDUyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogaWNfSUNTdGFydChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JT1NUeXBlIGNyZWF0b3I7CisgICAgT1NUeXBlIGNyZWF0b3I7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mIiwgUHlNYWNfR2V0T1NUeXBlLCAmY3JlYXRvcikpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiAoUHlPYmplY3QgKiluZXdpY2lvYmplY3QoY3JlYXRvcik7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJiIsIFB5TWFjX0dldE9TVHlwZSwgJmNyZWF0b3IpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopbmV3aWNpb2JqZWN0KGNyZWF0b3IpOwogfQogCiAvKiBMaXN0IG9mIG1ldGhvZHMgZGVmaW5lZCBpbiB0aGUgbW9kdWxlICovCiAKIHN0YXRpYyBzdHJ1Y3QgUHlNZXRob2REZWYgaWNfbWV0aG9kc1tdID0gewotCXsiSUNTdGFydCIsCShQeUNGdW5jdGlvbilpY19JQ1N0YXJ0LAlNRVRIX1ZBUkFSR1MsCWljX0lDU3RhcnRfX2RvY19ffSwKLSAKLQl7TlVMTCwJIChQeUNGdW5jdGlvbilOVUxMLCAwLCBOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7IklDU3RhcnQiLCAgICAgICAgIChQeUNGdW5jdGlvbilpY19JQ1N0YXJ0LCAgICAgICAgTUVUSF9WQVJBUkdTLCAgIGljX0lDU3RhcnRfX2RvY19ffSwKKworICAgIHtOVUxMLCAgICAgICAoUHlDRnVuY3Rpb24pTlVMTCwgMCwgTlVMTH0gICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogCiAvKiBJbml0aWFsaXphdGlvbiBmdW5jdGlvbiBmb3IgdGhlIG1vZHVsZSAoKm11c3QqIGJlIGNhbGxlZCBpbml0aWNnbHVlKSAqLwogCi1zdGF0aWMgY2hhciBpY2dsdWVfbW9kdWxlX2RvY3VtZW50YXRpb25bXSA9IAorc3RhdGljIGNoYXIgaWNnbHVlX21vZHVsZV9kb2N1bWVudGF0aW9uW10gPQogIkltcGxlbWVudHMgbG93LWxldmVsIEludGVybmV0IENvbmZpZyBpbnRlcmZhY2UiCiA7CiAKIHZvaWQKIGluaXRpY2dsdWUodm9pZCkKIHsKLQlQeU9iamVjdCAqbSwgKmQ7Ci0JCi0JaWYgKFB5RXJyX1dhcm5QeTNrKCJJbiAzLngsIGljZ2x1ZSBpcyByZW1vdmVkLiIsIDEpKQotCQlyZXR1cm47CisgICAgUHlPYmplY3QgKm0sICpkOwogCi0JLyogQ3JlYXRlIHRoZSBtb2R1bGUgYW5kIGFkZCB0aGUgZnVuY3Rpb25zICovCi0JbSA9IFB5X0luaXRNb2R1bGU0KCJpY2dsdWUiLCBpY19tZXRob2RzLAotCQlpY2dsdWVfbW9kdWxlX2RvY3VtZW50YXRpb24sCi0JCShQeU9iamVjdCopTlVMTCxQWVRIT05fQVBJX1ZFUlNJT04pOworICAgIGlmIChQeUVycl9XYXJuUHkzaygiSW4gMy54LCBpY2dsdWUgaXMgcmVtb3ZlZC4iLCAxKSkKKyAgICAgICAgcmV0dXJuOwogCi0JLyogQWRkIHNvbWUgc3ltYm9saWMgY29uc3RhbnRzIHRvIHRoZSBtb2R1bGUgKi8KLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQlFcnJvck9iamVjdCA9IFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCk7Ci0JaWYgKEVycm9yT2JqZWN0ID09IE5VTEwgfHwKLQkgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgImVycm9yIiwgRXJyb3JPYmplY3QpICE9IDApCi0JCXJldHVybjsKKyAgICAvKiBDcmVhdGUgdGhlIG1vZHVsZSBhbmQgYWRkIHRoZSBmdW5jdGlvbnMgKi8KKyAgICBtID0gUHlfSW5pdE1vZHVsZTQoImljZ2x1ZSIsIGljX21ldGhvZHMsCisgICAgICAgIGljZ2x1ZV9tb2R1bGVfZG9jdW1lbnRhdGlvbiwKKyAgICAgICAgKFB5T2JqZWN0KilOVUxMLFBZVEhPTl9BUElfVkVSU0lPTik7CiAKLQkvKiBYWFhYIEFkZCBjb25zdGFudHMgaGVyZSAqLwotCQotCS8qIENoZWNrIGZvciBlcnJvcnMgKi8KLQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkKLQkJUHlfRmF0YWxFcnJvcigiY2FuJ3QgaW5pdGlhbGl6ZSBtb2R1bGUgaWNnbHVlIik7CisgICAgLyogQWRkIHNvbWUgc3ltYm9saWMgY29uc3RhbnRzIHRvIHRoZSBtb2R1bGUgKi8KKyAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICBFcnJvck9iamVjdCA9IFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCk7CisgICAgaWYgKEVycm9yT2JqZWN0ID09IE5VTEwgfHwKKyAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgImVycm9yIiwgRXJyb3JPYmplY3QpICE9IDApCisgICAgICAgIHJldHVybjsKKworICAgIC8qIFhYWFggQWRkIGNvbnN0YW50cyBoZXJlICovCisKKyAgICAvKiBDaGVjayBmb3IgZXJyb3JzICovCisgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoImNhbid0IGluaXRpYWxpemUgbW9kdWxlIGljZ2x1ZSIpOwogfQogCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9pY24vX0ljbm1vZHVsZS5jIGIvTWFjL01vZHVsZXMvaWNuL19JY25tb2R1bGUuYwppbmRleCA4MDIwMWEyLi42OTY3YWU0IDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9pY24vX0ljbm1vZHVsZS5jCisrKyBiL01hYy9Nb2R1bGVzL2ljbi9fSWNubW9kdWxlLmMKQEAgLTEwLDkgKzEwLDkgQEAKIAogLyogTWFjcm8gdG8gdGVzdCB3aGV0aGVyIGEgd2Vhay1sb2FkZWQgQ0ZNIGZ1bmN0aW9uIGV4aXN0cyAqLwogI2RlZmluZSBQeU1hY19QUkVDSEVDSyhydG4pIGRvIHsgaWYgKCAmcnRuID09IE5VTEwgKSAge1wKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsIFwKLSAgICAgICAgIk5vdCBhdmFpbGFibGUgaW4gdGhpcyBzaGFyZWQgbGlicmFyeS9PUyB2ZXJzaW9uIik7IFwKLSAgICAgICAgcmV0dXJuIE5VTEw7IFwKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgXAorICAgICJOb3QgYXZhaWxhYmxlIGluIHRoaXMgc2hhcmVkIGxpYnJhcnkvT1MgdmVyc2lvbiIpOyBcCisgICAgcmV0dXJuIE5VTEw7IFwKICAgICB9fSB3aGlsZSgwKQogCiAKQEAgLTIzLDE1NjEgKzIzLDE1NjEgQEAKIAogc3RhdGljIFB5T2JqZWN0ICpJY25fR2V0Q0ljb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNJY29uSGFuZGxlIF9ydjsKLQlTSW50MTYgaWNvbklEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDSWNvbkhhbmRsZSBfcnY7CisgICAgU0ludDE2IGljb25JRDsKICNpZm5kZWYgR2V0Q0ljb24KLQlQeU1hY19QUkVDSEVDSyhHZXRDSWNvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0Q0ljb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpY29uSUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRDSWNvbihpY29uSUQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmljb25JRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldENJY29uKGljb25JRCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9QbG90Q0ljb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3QgdGhlUmVjdDsKLQlDSWNvbkhhbmRsZSB0aGVJY29uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IHRoZVJlY3Q7CisgICAgQ0ljb25IYW5kbGUgdGhlSWNvbjsKICNpZm5kZWYgUGxvdENJY29uCi0JUHlNYWNfUFJFQ0hFQ0soUGxvdENJY29uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhQbG90Q0ljb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZ0aGVSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUljb24pKQotCQlyZXR1cm4gTlVMTDsKLQlQbG90Q0ljb24oJnRoZVJlY3QsCi0JICAgICAgICAgIHRoZUljb24pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnRoZVJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlSWNvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFBsb3RDSWNvbigmdGhlUmVjdCwKKyAgICAgICAgICAgICAgdGhlSWNvbik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9EaXNwb3NlQ0ljb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNJY29uSGFuZGxlIHRoZUljb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENJY29uSGFuZGxlIHRoZUljb247CiAjaWZuZGVmIERpc3Bvc2VDSWNvbgotCVB5TWFjX1BSRUNIRUNLKERpc3Bvc2VDSWNvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGlzcG9zZUNJY29uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVJY29uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JRGlzcG9zZUNJY29uKHRoZUljb24pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlSWNvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIERpc3Bvc2VDSWNvbih0aGVJY29uKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqSWNuX0dldEljb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUhhbmRsZSBfcnY7Ci0JU0ludDE2IGljb25JRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgSGFuZGxlIF9ydjsKKyAgICBTSW50MTYgaWNvbklEOwogI2lmbmRlZiBHZXRJY29uCi0JUHlNYWNfUFJFQ0hFQ0soR2V0SWNvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0SWNvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmljb25JRCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldEljb24oaWNvbklEKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpY29uSUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRJY29uKGljb25JRCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9QbG90SWNvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVjdCB0aGVSZWN0OwotCUhhbmRsZSB0aGVJY29uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IHRoZVJlY3Q7CisgICAgSGFuZGxlIHRoZUljb247CiAjaWZuZGVmIFBsb3RJY29uCi0JUHlNYWNfUFJFQ0hFQ0soUGxvdEljb24pOworICAgIFB5TWFjX1BSRUNIRUNLKFBsb3RJY29uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmdGhlUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVJY29uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JUGxvdEljb24oJnRoZVJlY3QsCi0JICAgICAgICAgdGhlSWNvbik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmdGhlUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVJY29uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUGxvdEljb24oJnRoZVJlY3QsCisgICAgICAgICAgICAgdGhlSWNvbik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9QbG90SWNvbklEKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVJlY3QgdGhlUmVjdDsKLQlJY29uQWxpZ25tZW50VHlwZSBhbGlnbjsKLQlJY29uVHJhbnNmb3JtVHlwZSB0cmFuc2Zvcm07Ci0JU0ludDE2IHRoZVJlc0lEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFJlY3QgdGhlUmVjdDsKKyAgICBJY29uQWxpZ25tZW50VHlwZSBhbGlnbjsKKyAgICBJY29uVHJhbnNmb3JtVHlwZSB0cmFuc2Zvcm07CisgICAgU0ludDE2IHRoZVJlc0lEOwogI2lmbmRlZiBQbG90SWNvbklECi0JUHlNYWNfUFJFQ0hFQ0soUGxvdEljb25JRCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUGxvdEljb25JRCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZ0aGVSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmYWxpZ24sCi0JICAgICAgICAgICAgICAgICAgICAgICZ0cmFuc2Zvcm0sCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aGVSZXNJRCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBQbG90SWNvbklEKCZ0aGVSZWN0LAotCSAgICAgICAgICAgICAgICAgIGFsaWduLAotCSAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybSwKLQkgICAgICAgICAgICAgICAgICB0aGVSZXNJRCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmdGhlUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFsaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlUmVzSUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUGxvdEljb25JRCgmdGhlUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICBhbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgdGhlUmVzSUQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9OZXdJY29uU3VpdGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSWNvblN1aXRlUmVmIHRoZUljb25TdWl0ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBJY29uU3VpdGVSZWYgdGhlSWNvblN1aXRlOwogI2lmbmRlZiBOZXdJY29uU3VpdGUKLQlQeU1hY19QUkVDSEVDSyhOZXdJY29uU3VpdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKE5ld0ljb25TdWl0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IE5ld0ljb25TdWl0ZSgmdGhlSWNvblN1aXRlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgdGhlSWNvblN1aXRlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IE5ld0ljb25TdWl0ZSgmdGhlSWNvblN1aXRlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgdGhlSWNvblN1aXRlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpJY25fQWRkSWNvblRvU3VpdGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSGFuZGxlIHRoZUljb25EYXRhOwotCUljb25TdWl0ZVJlZiB0aGVTdWl0ZTsKLQlSZXNUeXBlIHRoZVR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSGFuZGxlIHRoZUljb25EYXRhOworICAgIEljb25TdWl0ZVJlZiB0aGVTdWl0ZTsKKyAgICBSZXNUeXBlIHRoZVR5cGU7CiAjaWZuZGVmIEFkZEljb25Ub1N1aXRlCi0JUHlNYWNfUFJFQ0hFQ0soQWRkSWNvblRvU3VpdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEFkZEljb25Ub1N1aXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlSWNvbkRhdGEsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlU3VpdGUsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZVR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQWRkSWNvblRvU3VpdGUodGhlSWNvbkRhdGEsCi0JICAgICAgICAgICAgICAgICAgICAgIHRoZVN1aXRlLAotCSAgICAgICAgICAgICAgICAgICAgICB0aGVUeXBlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUljb25EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZVN1aXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFkZEljb25Ub1N1aXRlKHRoZUljb25EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVTdWl0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlVHlwZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqSWNuX0dldEljb25Gcm9tU3VpdGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSGFuZGxlIHRoZUljb25EYXRhOwotCUljb25TdWl0ZVJlZiB0aGVTdWl0ZTsKLQlSZXNUeXBlIHRoZVR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSGFuZGxlIHRoZUljb25EYXRhOworICAgIEljb25TdWl0ZVJlZiB0aGVTdWl0ZTsKKyAgICBSZXNUeXBlIHRoZVR5cGU7CiAjaWZuZGVmIEdldEljb25Gcm9tU3VpdGUKLQlQeU1hY19QUkVDSEVDSyhHZXRJY29uRnJvbVN1aXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRJY29uRnJvbVN1aXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZVN1aXRlLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldEljb25Gcm9tU3VpdGUoJnRoZUljb25EYXRhLAotCSAgICAgICAgICAgICAgICAgICAgICAgIHRoZVN1aXRlLAotCSAgICAgICAgICAgICAgICAgICAgICAgIHRoZVR5cGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCB0aGVJY29uRGF0YSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlU3VpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZVR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0SWNvbkZyb21TdWl0ZSgmdGhlSWNvbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlU3VpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlVHlwZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHRoZUljb25EYXRhKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpJY25fR2V0SWNvblN1aXRlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUljb25TdWl0ZVJlZiB0aGVJY29uU3VpdGU7Ci0JU0ludDE2IHRoZVJlc0lEOwotCUljb25TZWxlY3RvclZhbHVlIHNlbGVjdG9yOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEljb25TdWl0ZVJlZiB0aGVJY29uU3VpdGU7CisgICAgU0ludDE2IHRoZVJlc0lEOworICAgIEljb25TZWxlY3RvclZhbHVlIHNlbGVjdG9yOwogI2lmbmRlZiBHZXRJY29uU3VpdGUKLQlQeU1hY19QUkVDSEVDSyhHZXRJY29uU3VpdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldEljb25TdWl0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aGVSZXNJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNlbGVjdG9yKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldEljb25TdWl0ZSgmdGhlSWNvblN1aXRlLAotCSAgICAgICAgICAgICAgICAgICAgdGhlUmVzSUQsCi0JICAgICAgICAgICAgICAgICAgICBzZWxlY3Rvcik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHRoZUljb25TdWl0ZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlUmVzSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzZWxlY3RvcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRJY29uU3VpdGUoJnRoZUljb25TdWl0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoZVJlc0lELAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCB0aGVJY29uU3VpdGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9EaXNwb3NlSWNvblN1aXRlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUljb25TdWl0ZVJlZiB0aGVJY29uU3VpdGU7Ci0JQm9vbGVhbiBkaXNwb3NlRGF0YTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBJY29uU3VpdGVSZWYgdGhlSWNvblN1aXRlOworICAgIEJvb2xlYW4gZGlzcG9zZURhdGE7CiAjaWZuZGVmIERpc3Bvc2VJY29uU3VpdGUKLQlQeU1hY19QUkVDSEVDSyhEaXNwb3NlSWNvblN1aXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEaXNwb3NlSWNvblN1aXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlSWNvblN1aXRlLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGlzcG9zZURhdGEpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRGlzcG9zZUljb25TdWl0ZSh0aGVJY29uU3VpdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgZGlzcG9zZURhdGEpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlSWNvblN1aXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGlzcG9zZURhdGEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRGlzcG9zZUljb25TdWl0ZSh0aGVJY29uU3VpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcG9zZURhdGEpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9QbG90SWNvblN1aXRlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVJlY3QgdGhlUmVjdDsKLQlJY29uQWxpZ25tZW50VHlwZSBhbGlnbjsKLQlJY29uVHJhbnNmb3JtVHlwZSB0cmFuc2Zvcm07Ci0JSWNvblN1aXRlUmVmIHRoZUljb25TdWl0ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBSZWN0IHRoZVJlY3Q7CisgICAgSWNvbkFsaWdubWVudFR5cGUgYWxpZ247CisgICAgSWNvblRyYW5zZm9ybVR5cGUgdHJhbnNmb3JtOworICAgIEljb25TdWl0ZVJlZiB0aGVJY29uU3VpdGU7CiAjaWZuZGVmIFBsb3RJY29uU3VpdGUKLQlQeU1hY19QUkVDSEVDSyhQbG90SWNvblN1aXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhQbG90SWNvblN1aXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGhPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZ0aGVSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmYWxpZ24sCi0JICAgICAgICAgICAgICAgICAgICAgICZ0cmFuc2Zvcm0sCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlSWNvblN1aXRlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFBsb3RJY29uU3VpdGUoJnRoZVJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgYWxpZ24sCi0JICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtLAotCSAgICAgICAgICAgICAgICAgICAgIHRoZUljb25TdWl0ZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnRoZVJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVJY29uU3VpdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUGxvdEljb25TdWl0ZSgmdGhlUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgdGhlSWNvblN1aXRlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpJY25fTG9hZEljb25DYWNoZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlSZWN0IHRoZVJlY3Q7Ci0JSWNvbkFsaWdubWVudFR5cGUgYWxpZ247Ci0JSWNvblRyYW5zZm9ybVR5cGUgdHJhbnNmb3JtOwotCUljb25DYWNoZVJlZiB0aGVJY29uQ2FjaGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgUmVjdCB0aGVSZWN0OworICAgIEljb25BbGlnbm1lbnRUeXBlIGFsaWduOworICAgIEljb25UcmFuc2Zvcm1UeXBlIHRyYW5zZm9ybTsKKyAgICBJY29uQ2FjaGVSZWYgdGhlSWNvbkNhY2hlOwogI2lmbmRlZiBMb2FkSWNvbkNhY2hlCi0JUHlNYWNfUFJFQ0hFQ0soTG9hZEljb25DYWNoZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTG9hZEljb25DYWNoZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmdGhlUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmFsaWduLAotCSAgICAgICAgICAgICAgICAgICAgICAmdHJhbnNmb3JtLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUljb25DYWNoZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBMb2FkSWNvbkNhY2hlKCZ0aGVSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgIGFsaWduLAotCSAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybSwKLQkgICAgICAgICAgICAgICAgICAgICB0aGVJY29uQ2FjaGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGhPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZ0aGVSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYWxpZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlSWNvbkNhY2hlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IExvYWRJY29uQ2FjaGUoJnRoZVJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRoZUljb25DYWNoZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqSWNuX0dldExhYmVsKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVNJbnQxNiBsYWJlbE51bWJlcjsKLQlSR0JDb2xvciBsYWJlbENvbG9yOwotCVN0cjI1NSBsYWJlbFN0cmluZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTSW50MTYgbGFiZWxOdW1iZXI7CisgICAgUkdCQ29sb3IgbGFiZWxDb2xvcjsKKyAgICBTdHIyNTUgbGFiZWxTdHJpbmc7CiAjaWZuZGVmIEdldExhYmVsCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TGFiZWwpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldExhYmVsKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZsYWJlbE51bWJlciwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBsYWJlbFN0cmluZykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRMYWJlbChsYWJlbE51bWJlciwKLQkgICAgICAgICAgICAgICAgJmxhYmVsQ29sb3IsCi0JICAgICAgICAgICAgICAgIGxhYmVsU3RyaW5nKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUWRSR0JfTmV3LCAmbGFiZWxDb2xvcik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmxhYmVsTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIGxhYmVsU3RyaW5nKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldExhYmVsKGxhYmVsTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAmbGFiZWxDb2xvciwKKyAgICAgICAgICAgICAgICAgICAgbGFiZWxTdHJpbmcpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZsYWJlbENvbG9yKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpJY25fUHRJbkljb25JRChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JUG9pbnQgdGVzdFB0OwotCVJlY3QgaWNvblJlY3Q7Ci0JSWNvbkFsaWdubWVudFR5cGUgYWxpZ247Ci0JU0ludDE2IGljb25JRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgUG9pbnQgdGVzdFB0OworICAgIFJlY3QgaWNvblJlY3Q7CisgICAgSWNvbkFsaWdubWVudFR5cGUgYWxpZ247CisgICAgU0ludDE2IGljb25JRDsKICNpZm5kZWYgUHRJbkljb25JRAotCVB5TWFjX1BSRUNIRUNLKFB0SW5JY29uSUQpOworICAgIFB5TWFjX1BSRUNIRUNLKFB0SW5JY29uSUQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZ0ZXN0UHQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpY29uUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmFsaWduLAotCSAgICAgICAgICAgICAgICAgICAgICAmaWNvbklEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gUHRJbkljb25JRCh0ZXN0UHQsCi0JICAgICAgICAgICAgICAgICAmaWNvblJlY3QsCi0JICAgICAgICAgICAgICAgICBhbGlnbiwKLQkgICAgICAgICAgICAgICAgIGljb25JRCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZ0ZXN0UHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpY29uUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFsaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaWNvbklEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gUHRJbkljb25JRCh0ZXN0UHQsCisgICAgICAgICAgICAgICAgICAgICAmaWNvblJlY3QsCisgICAgICAgICAgICAgICAgICAgICBhbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgIGljb25JRCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqSWNuX1B0SW5JY29uU3VpdGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCVBvaW50IHRlc3RQdDsKLQlSZWN0IGljb25SZWN0OwotCUljb25BbGlnbm1lbnRUeXBlIGFsaWduOwotCUljb25TdWl0ZVJlZiB0aGVJY29uU3VpdGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIFBvaW50IHRlc3RQdDsKKyAgICBSZWN0IGljb25SZWN0OworICAgIEljb25BbGlnbm1lbnRUeXBlIGFsaWduOworICAgIEljb25TdWl0ZVJlZiB0aGVJY29uU3VpdGU7CiAjaWZuZGVmIFB0SW5JY29uU3VpdGUKLQlQeU1hY19QUkVDSEVDSyhQdEluSWNvblN1aXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhQdEluSWNvblN1aXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZoTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnRlc3RQdCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmljb25SZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmYWxpZ24sCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlSWNvblN1aXRlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gUHRJbkljb25TdWl0ZSh0ZXN0UHQsCi0JICAgICAgICAgICAgICAgICAgICAmaWNvblJlY3QsCi0JICAgICAgICAgICAgICAgICAgICBhbGlnbiwKLQkgICAgICAgICAgICAgICAgICAgIHRoZUljb25TdWl0ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmhPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmdGVzdFB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaWNvblJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVJY29uU3VpdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBQdEluSWNvblN1aXRlKHRlc3RQdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICZpY29uUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgdGhlSWNvblN1aXRlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpJY25fUmVjdEluSWNvbklEKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlSZWN0IHRlc3RSZWN0OwotCVJlY3QgaWNvblJlY3Q7Ci0JSWNvbkFsaWdubWVudFR5cGUgYWxpZ247Ci0JU0ludDE2IGljb25JRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgUmVjdCB0ZXN0UmVjdDsKKyAgICBSZWN0IGljb25SZWN0OworICAgIEljb25BbGlnbm1lbnRUeXBlIGFsaWduOworICAgIFNJbnQxNiBpY29uSUQ7CiAjaWZuZGVmIFJlY3RJbkljb25JRAotCVB5TWFjX1BSRUNIRUNLKFJlY3RJbkljb25JRCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUmVjdEluSWNvbklEKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZ0ZXN0UmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmljb25SZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmYWxpZ24sCi0JICAgICAgICAgICAgICAgICAgICAgICZpY29uSUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBSZWN0SW5JY29uSUQoJnRlc3RSZWN0LAotCSAgICAgICAgICAgICAgICAgICAmaWNvblJlY3QsCi0JICAgICAgICAgICAgICAgICAgIGFsaWduLAotCSAgICAgICAgICAgICAgICAgICBpY29uSUQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZ0ZXN0UmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmljb25SZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYWxpZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpY29uSUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBSZWN0SW5JY29uSUQoJnRlc3RSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAmaWNvblJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgIGFsaWduLAorICAgICAgICAgICAgICAgICAgICAgICBpY29uSUQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9SZWN0SW5JY29uU3VpdGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCVJlY3QgdGVzdFJlY3Q7Ci0JUmVjdCBpY29uUmVjdDsKLQlJY29uQWxpZ25tZW50VHlwZSBhbGlnbjsKLQlJY29uU3VpdGVSZWYgdGhlSWNvblN1aXRlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBSZWN0IHRlc3RSZWN0OworICAgIFJlY3QgaWNvblJlY3Q7CisgICAgSWNvbkFsaWdubWVudFR5cGUgYWxpZ247CisgICAgSWNvblN1aXRlUmVmIHRoZUljb25TdWl0ZTsKICNpZm5kZWYgUmVjdEluSWNvblN1aXRlCi0JUHlNYWNfUFJFQ0hFQ0soUmVjdEluSWNvblN1aXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhSZWN0SW5JY29uU3VpdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmhPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZ0ZXN0UmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmljb25SZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmYWxpZ24sCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlSWNvblN1aXRlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gUmVjdEluSWNvblN1aXRlKCZ0ZXN0UmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmljb25SZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICBhbGlnbiwKLQkgICAgICAgICAgICAgICAgICAgICAgdGhlSWNvblN1aXRlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnRlc3RSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaWNvblJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVJY29uU3VpdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBSZWN0SW5JY29uU3VpdGUoJnRlc3RSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaWNvblJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVJY29uU3VpdGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9JY29uSURUb1JnbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlSZ25IYW5kbGUgdGhlUmduOwotCVJlY3QgaWNvblJlY3Q7Ci0JSWNvbkFsaWdubWVudFR5cGUgYWxpZ247Ci0JU0ludDE2IGljb25JRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBSZ25IYW5kbGUgdGhlUmduOworICAgIFJlY3QgaWNvblJlY3Q7CisgICAgSWNvbkFsaWdubWVudFR5cGUgYWxpZ247CisgICAgU0ludDE2IGljb25JRDsKICNpZm5kZWYgSWNvbklEVG9SZ24KLQlQeU1hY19QUkVDSEVDSyhJY29uSURUb1Jnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soSWNvbklEVG9SZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVSZ24sCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpY29uUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmFsaWduLAotCSAgICAgICAgICAgICAgICAgICAgICAmaWNvbklEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEljb25JRFRvUmduKHRoZVJnbiwKLQkgICAgICAgICAgICAgICAgICAgJmljb25SZWN0LAotCSAgICAgICAgICAgICAgICAgICBhbGlnbiwKLQkgICAgICAgICAgICAgICAgICAgaWNvbklEKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZVJnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmljb25SZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYWxpZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpY29uSUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gSWNvbklEVG9SZ24odGhlUmduLAorICAgICAgICAgICAgICAgICAgICAgICAmaWNvblJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgIGFsaWduLAorICAgICAgICAgICAgICAgICAgICAgICBpY29uSUQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9JY29uU3VpdGVUb1JnbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlSZ25IYW5kbGUgdGhlUmduOwotCVJlY3QgaWNvblJlY3Q7Ci0JSWNvbkFsaWdubWVudFR5cGUgYWxpZ247Ci0JSWNvblN1aXRlUmVmIHRoZUljb25TdWl0ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBSZ25IYW5kbGUgdGhlUmduOworICAgIFJlY3QgaWNvblJlY3Q7CisgICAgSWNvbkFsaWdubWVudFR5cGUgYWxpZ247CisgICAgSWNvblN1aXRlUmVmIHRoZUljb25TdWl0ZTsKICNpZm5kZWYgSWNvblN1aXRlVG9SZ24KLQlQeU1hY19QUkVDSEVDSyhJY29uU3VpdGVUb1Jnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soSWNvblN1aXRlVG9SZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmhPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlUmduLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaWNvblJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICZhbGlnbiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVJY29uU3VpdGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gSWNvblN1aXRlVG9SZ24odGhlUmduLAotCSAgICAgICAgICAgICAgICAgICAgICAmaWNvblJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgIGFsaWduLAotCSAgICAgICAgICAgICAgICAgICAgICB0aGVJY29uU3VpdGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZoTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZVJnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmljb25SZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYWxpZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlSWNvblN1aXRlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEljb25TdWl0ZVRvUmduKHRoZVJnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmljb25SZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlSWNvblN1aXRlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpJY25fU2V0U3VpdGVMYWJlbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlJY29uU3VpdGVSZWYgdGhlU3VpdGU7Ci0JU0ludDE2IHRoZUxhYmVsOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEljb25TdWl0ZVJlZiB0aGVTdWl0ZTsKKyAgICBTSW50MTYgdGhlTGFiZWw7CiAjaWZuZGVmIFNldFN1aXRlTGFiZWwKLQlQeU1hY19QUkVDSEVDSyhTZXRTdWl0ZUxhYmVsKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRTdWl0ZUxhYmVsKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlU3VpdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aGVMYWJlbCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRTdWl0ZUxhYmVsKHRoZVN1aXRlLAotCSAgICAgICAgICAgICAgICAgICAgIHRoZUxhYmVsKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZVN1aXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlTGFiZWwpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0U3VpdGVMYWJlbCh0aGVTdWl0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0aGVMYWJlbCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqSWNuX0dldFN1aXRlTGFiZWwoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVNJbnQxNiBfcnY7Ci0JSWNvblN1aXRlUmVmIHRoZVN1aXRlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTSW50MTYgX3J2OworICAgIEljb25TdWl0ZVJlZiB0aGVTdWl0ZTsKICNpZm5kZWYgR2V0U3VpdGVMYWJlbAotCVB5TWFjX1BSRUNIRUNLKEdldFN1aXRlTGFiZWwpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFN1aXRlTGFiZWwpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZVN1aXRlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0U3VpdGVMYWJlbCh0aGVTdWl0ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZVN1aXRlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0U3VpdGVMYWJlbCh0aGVTdWl0ZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqSWNuX1Bsb3RJY29uSGFuZGxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVJlY3QgdGhlUmVjdDsKLQlJY29uQWxpZ25tZW50VHlwZSBhbGlnbjsKLQlJY29uVHJhbnNmb3JtVHlwZSB0cmFuc2Zvcm07Ci0JSGFuZGxlIHRoZUljb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgUmVjdCB0aGVSZWN0OworICAgIEljb25BbGlnbm1lbnRUeXBlIGFsaWduOworICAgIEljb25UcmFuc2Zvcm1UeXBlIHRyYW5zZm9ybTsKKyAgICBIYW5kbGUgdGhlSWNvbjsKICNpZm5kZWYgUGxvdEljb25IYW5kbGUKLQlQeU1hY19QUkVDSEVDSyhQbG90SWNvbkhhbmRsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUGxvdEljb25IYW5kbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnRoZVJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICZhbGlnbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRyYW5zZm9ybSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVJY29uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFBsb3RJY29uSGFuZGxlKCZ0aGVSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICBhbGlnbiwKLQkgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtLAotCSAgICAgICAgICAgICAgICAgICAgICB0aGVJY29uKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmdGhlUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFsaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUljb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUGxvdEljb25IYW5kbGUoJnRoZVJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZUljb24pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9QbG90U0lDTkhhbmRsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlSZWN0IHRoZVJlY3Q7Ci0JSWNvbkFsaWdubWVudFR5cGUgYWxpZ247Ci0JSWNvblRyYW5zZm9ybVR5cGUgdHJhbnNmb3JtOwotCUhhbmRsZSB0aGVTSUNOOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFJlY3QgdGhlUmVjdDsKKyAgICBJY29uQWxpZ25tZW50VHlwZSBhbGlnbjsKKyAgICBJY29uVHJhbnNmb3JtVHlwZSB0cmFuc2Zvcm07CisgICAgSGFuZGxlIHRoZVNJQ047CiAjaWZuZGVmIFBsb3RTSUNOSGFuZGxlCi0JUHlNYWNfUFJFQ0hFQ0soUGxvdFNJQ05IYW5kbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFBsb3RTSUNOSGFuZGxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGhPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZ0aGVSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmYWxpZ24sCi0JICAgICAgICAgICAgICAgICAgICAgICZ0cmFuc2Zvcm0sCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlU0lDTikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBQbG90U0lDTkhhbmRsZSgmdGhlUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgYWxpZ24sCi0JICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybSwKLQkgICAgICAgICAgICAgICAgICAgICAgdGhlU0lDTik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnRoZVJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVTSUNOKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFBsb3RTSUNOSGFuZGxlKCZ0aGVSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVTSUNOKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpJY25fUGxvdENJY29uSGFuZGxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVJlY3QgdGhlUmVjdDsKLQlJY29uQWxpZ25tZW50VHlwZSBhbGlnbjsKLQlJY29uVHJhbnNmb3JtVHlwZSB0cmFuc2Zvcm07Ci0JQ0ljb25IYW5kbGUgdGhlQ0ljb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgUmVjdCB0aGVSZWN0OworICAgIEljb25BbGlnbm1lbnRUeXBlIGFsaWduOworICAgIEljb25UcmFuc2Zvcm1UeXBlIHRyYW5zZm9ybTsKKyAgICBDSWNvbkhhbmRsZSB0aGVDSWNvbjsKICNpZm5kZWYgUGxvdENJY29uSGFuZGxlCi0JUHlNYWNfUFJFQ0hFQ0soUGxvdENJY29uSGFuZGxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhQbG90Q0ljb25IYW5kbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnRoZVJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICZhbGlnbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRyYW5zZm9ybSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVDSWNvbikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBQbG90Q0ljb25IYW5kbGUoJnRoZVJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICBhbGlnbiwKLQkgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybSwKLQkgICAgICAgICAgICAgICAgICAgICAgIHRoZUNJY29uKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmdGhlUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFsaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUNJY29uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFBsb3RDSWNvbkhhbmRsZSgmdGhlUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlQ0ljb24pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9JY29uUmVmVG9JY29uRmFtaWx5KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUljb25SZWYgdGhlSWNvblJlZjsKLQlJY29uU2VsZWN0b3JWYWx1ZSB3aGljaEljb25zOwotCUljb25GYW1pbHlIYW5kbGUgaWNvbkZhbWlseTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBJY29uUmVmIHRoZUljb25SZWY7CisgICAgSWNvblNlbGVjdG9yVmFsdWUgd2hpY2hJY29uczsKKyAgICBJY29uRmFtaWx5SGFuZGxlIGljb25GYW1pbHk7CiAjaWZuZGVmIEljb25SZWZUb0ljb25GYW1pbHkKLQlQeU1hY19QUkVDSEVDSyhJY29uUmVmVG9JY29uRmFtaWx5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhJY29uUmVmVG9JY29uRmFtaWx5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlSWNvblJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgJndoaWNoSWNvbnMpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gSWNvblJlZlRvSWNvbkZhbWlseSh0aGVJY29uUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoSWNvbnMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJmljb25GYW1pbHkpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBpY29uRmFtaWx5KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUljb25SZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ3aGljaEljb25zKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEljb25SZWZUb0ljb25GYW1pbHkodGhlSWNvblJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaEljb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpY29uRmFtaWx5KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgaWNvbkZhbWlseSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqSWNuX0ljb25GYW1pbHlUb0ljb25TdWl0ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlJY29uRmFtaWx5SGFuZGxlIGljb25GYW1pbHk7Ci0JSWNvblNlbGVjdG9yVmFsdWUgd2hpY2hJY29uczsKLQlJY29uU3VpdGVSZWYgaWNvblN1aXRlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEljb25GYW1pbHlIYW5kbGUgaWNvbkZhbWlseTsKKyAgICBJY29uU2VsZWN0b3JWYWx1ZSB3aGljaEljb25zOworICAgIEljb25TdWl0ZVJlZiBpY29uU3VpdGU7CiAjaWZuZGVmIEljb25GYW1pbHlUb0ljb25TdWl0ZQotCVB5TWFjX1BSRUNIRUNLKEljb25GYW1pbHlUb0ljb25TdWl0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSWNvbkZhbWlseVRvSWNvblN1aXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaWNvbkZhbWlseSwKLQkgICAgICAgICAgICAgICAgICAgICAgJndoaWNoSWNvbnMpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gSWNvbkZhbWlseVRvSWNvblN1aXRlKGljb25GYW1pbHksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaEljb25zLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmljb25TdWl0ZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGljb25TdWl0ZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZpY29uRmFtaWx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmd2hpY2hJY29ucykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBJY29uRmFtaWx5VG9JY29uU3VpdGUoaWNvbkZhbWlseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoSWNvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaWNvblN1aXRlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgaWNvblN1aXRlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpJY25fSWNvblN1aXRlVG9JY29uRmFtaWx5KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUljb25TdWl0ZVJlZiBpY29uU3VpdGU7Ci0JSWNvblNlbGVjdG9yVmFsdWUgd2hpY2hJY29uczsKLQlJY29uRmFtaWx5SGFuZGxlIGljb25GYW1pbHk7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSWNvblN1aXRlUmVmIGljb25TdWl0ZTsKKyAgICBJY29uU2VsZWN0b3JWYWx1ZSB3aGljaEljb25zOworICAgIEljb25GYW1pbHlIYW5kbGUgaWNvbkZhbWlseTsKICNpZm5kZWYgSWNvblN1aXRlVG9JY29uRmFtaWx5Ci0JUHlNYWNfUFJFQ0hFQ0soSWNvblN1aXRlVG9JY29uRmFtaWx5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhJY29uU3VpdGVUb0ljb25GYW1pbHkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZpY29uU3VpdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZ3aGljaEljb25zKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEljb25TdWl0ZVRvSWNvbkZhbWlseShpY29uU3VpdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaEljb25zLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmljb25GYW1pbHkpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBpY29uRmFtaWx5KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmljb25TdWl0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJndoaWNoSWNvbnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gSWNvblN1aXRlVG9JY29uRmFtaWx5KGljb25TdWl0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoSWNvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaWNvbkZhbWlseSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGljb25GYW1pbHkpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9TZXRJY29uRmFtaWx5RGF0YShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlJY29uRmFtaWx5SGFuZGxlIGljb25GYW1pbHk7Ci0JT1NUeXBlIGljb25UeXBlOwotCUhhbmRsZSBoOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEljb25GYW1pbHlIYW5kbGUgaWNvbkZhbWlseTsKKyAgICBPU1R5cGUgaWNvblR5cGU7CisgICAgSGFuZGxlIGg7CiAjaWZuZGVmIFNldEljb25GYW1pbHlEYXRhCi0JUHlNYWNfUFJFQ0hFQ0soU2V0SWNvbkZhbWlseURhdGEpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldEljb25GYW1pbHlEYXRhKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaWNvbkZhbWlseSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaWNvblR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRJY29uRmFtaWx5RGF0YShpY29uRmFtaWx5LAotCSAgICAgICAgICAgICAgICAgICAgICAgICBpY29uVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgaCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZpY29uRmFtaWx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpY29uVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldEljb25GYW1pbHlEYXRhKGljb25GYW1pbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb25UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpJY25fR2V0SWNvbkZhbWlseURhdGEoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSWNvbkZhbWlseUhhbmRsZSBpY29uRmFtaWx5OwotCU9TVHlwZSBpY29uVHlwZTsKLQlIYW5kbGUgaDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBJY29uRmFtaWx5SGFuZGxlIGljb25GYW1pbHk7CisgICAgT1NUeXBlIGljb25UeXBlOworICAgIEhhbmRsZSBoOwogI2lmbmRlZiBHZXRJY29uRmFtaWx5RGF0YQotCVB5TWFjX1BSRUNIRUNLKEdldEljb25GYW1pbHlEYXRhKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRJY29uRmFtaWx5RGF0YSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmljb25GYW1pbHksCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmljb25UeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmgpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0SWNvbkZhbWlseURhdGEoaWNvbkZhbWlseSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgaWNvblR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGgpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaWNvbkZhbWlseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaWNvblR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRJY29uRmFtaWx5RGF0YShpY29uRmFtaWx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqSWNuX0dldEljb25SZWZPd25lcnMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSWNvblJlZiB0aGVJY29uUmVmOwotCVVJbnQxNiBvd25lcnM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSWNvblJlZiB0aGVJY29uUmVmOworICAgIFVJbnQxNiBvd25lcnM7CiAjaWZuZGVmIEdldEljb25SZWZPd25lcnMKLQlQeU1hY19QUkVDSEVDSyhHZXRJY29uUmVmT3duZXJzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRJY29uUmVmT3duZXJzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVJY29uUmVmKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldEljb25SZWZPd25lcnModGhlSWNvblJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAmb3duZXJzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJIIiwKLQkgICAgICAgICAgICAgICAgICAgICBvd25lcnMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVJY29uUmVmKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldEljb25SZWZPd25lcnModGhlSWNvblJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3duZXJzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvd25lcnMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9BY3F1aXJlSWNvblJlZihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlJY29uUmVmIHRoZUljb25SZWY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSWNvblJlZiB0aGVJY29uUmVmOwogI2lmbmRlZiBBY3F1aXJlSWNvblJlZgotCVB5TWFjX1BSRUNIRUNLKEFjcXVpcmVJY29uUmVmKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBY3F1aXJlSWNvblJlZik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlSWNvblJlZikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBY3F1aXJlSWNvblJlZih0aGVJY29uUmVmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlSWNvblJlZikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBBY3F1aXJlSWNvblJlZih0aGVJY29uUmVmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpJY25fUmVsZWFzZUljb25SZWYoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSWNvblJlZiB0aGVJY29uUmVmOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEljb25SZWYgdGhlSWNvblJlZjsKICNpZm5kZWYgUmVsZWFzZUljb25SZWYKLQlQeU1hY19QUkVDSEVDSyhSZWxlYXNlSWNvblJlZik7CisgICAgUHlNYWNfUFJFQ0hFQ0soUmVsZWFzZUljb25SZWYpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUljb25SZWYpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUmVsZWFzZUljb25SZWYodGhlSWNvblJlZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUljb25SZWYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUmVsZWFzZUljb25SZWYodGhlSWNvblJlZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqSWNuX0dldEljb25SZWZGcm9tRmlsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlGU1NwZWMgdGhlRmlsZTsKLQlJY29uUmVmIHRoZUljb25SZWY7Ci0JU0ludDE2IHRoZUxhYmVsOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEZTU3BlYyB0aGVGaWxlOworICAgIEljb25SZWYgdGhlSWNvblJlZjsKKyAgICBTSW50MTYgdGhlTGFiZWw7CiAjaWZuZGVmIEdldEljb25SZWZGcm9tRmlsZQotCVB5TWFjX1BSRUNIRUNLKEdldEljb25SZWZGcm9tRmlsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0SWNvblJlZkZyb21GaWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmdGhlRmlsZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRJY29uUmVmRnJvbUZpbGUoJnRoZUZpbGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlSWNvblJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVMYWJlbCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCB0aGVJY29uUmVmLAotCSAgICAgICAgICAgICAgICAgICAgIHRoZUxhYmVsKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJnRoZUZpbGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0SWNvblJlZkZyb21GaWxlKCZ0aGVGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUljb25SZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlTGFiZWwpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgdGhlSWNvblJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0aGVMYWJlbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqSWNuX0dldEljb25SZWYoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU0ludDE2IHZSZWZOdW07Ci0JT1NUeXBlIGNyZWF0b3I7Ci0JT1NUeXBlIGljb25UeXBlOwotCUljb25SZWYgdGhlSWNvblJlZjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTSW50MTYgdlJlZk51bTsKKyAgICBPU1R5cGUgY3JlYXRvcjsKKyAgICBPU1R5cGUgaWNvblR5cGU7CisgICAgSWNvblJlZiB0aGVJY29uUmVmOwogI2lmbmRlZiBHZXRJY29uUmVmCi0JUHlNYWNfUFJFQ0hFQ0soR2V0SWNvblJlZik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0SWNvblJlZik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpY29uVHlwZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRJY29uUmVmKHZSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgY3JlYXRvciwKLQkgICAgICAgICAgICAgICAgICBpY29uVHlwZSwKLQkgICAgICAgICAgICAgICAgICAmdGhlSWNvblJlZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHRoZUljb25SZWYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmljb25UeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldEljb25SZWYodlJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICBjcmVhdG9yLAorICAgICAgICAgICAgICAgICAgICAgIGljb25UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICZ0aGVJY29uUmVmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgdGhlSWNvblJlZik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqSWNuX0dldEljb25SZWZGcm9tRm9sZGVyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVNJbnQxNiB2UmVmTnVtOwotCVNJbnQzMiBwYXJlbnRGb2xkZXJJRDsKLQlTSW50MzIgZm9sZGVySUQ7Ci0JU0ludDggYXR0cmlidXRlczsKLQlTSW50OCBhY2Nlc3NQcml2aWxlZ2VzOwotCUljb25SZWYgdGhlSWNvblJlZjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTSW50MTYgdlJlZk51bTsKKyAgICBTSW50MzIgcGFyZW50Rm9sZGVySUQ7CisgICAgU0ludDMyIGZvbGRlcklEOworICAgIFNJbnQ4IGF0dHJpYnV0ZXM7CisgICAgU0ludDggYWNjZXNzUHJpdmlsZWdlczsKKyAgICBJY29uUmVmIHRoZUljb25SZWY7CiAjaWZuZGVmIEdldEljb25SZWZGcm9tRm9sZGVyCi0JUHlNYWNfUFJFQ0hFQ0soR2V0SWNvblJlZkZyb21Gb2xkZXIpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldEljb25SZWZGcm9tRm9sZGVyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsbGJiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICZwYXJlbnRGb2xkZXJJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZvbGRlcklELAotCSAgICAgICAgICAgICAgICAgICAgICAmYXR0cmlidXRlcywKLQkgICAgICAgICAgICAgICAgICAgICAgJmFjY2Vzc1ByaXZpbGVnZXMpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0SWNvblJlZkZyb21Gb2xkZXIodlJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50Rm9sZGVySUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbGRlcklELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2Nlc3NQcml2aWxlZ2VzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlSWNvblJlZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHRoZUljb25SZWYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsbGJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJlbnRGb2xkZXJJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZvbGRlcklELAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFjY2Vzc1ByaXZpbGVnZXMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0SWNvblJlZkZyb21Gb2xkZXIodlJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50Rm9sZGVySUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbGRlcklELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2Nlc3NQcml2aWxlZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlSWNvblJlZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHRoZUljb25SZWYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9SZWdpc3Rlckljb25SZWZGcm9tSWNvbkZhbWlseShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlPU1R5cGUgY3JlYXRvcjsKLQlPU1R5cGUgaWNvblR5cGU7Ci0JSWNvbkZhbWlseUhhbmRsZSBpY29uRmFtaWx5OwotCUljb25SZWYgdGhlSWNvblJlZjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBPU1R5cGUgY3JlYXRvcjsKKyAgICBPU1R5cGUgaWNvblR5cGU7CisgICAgSWNvbkZhbWlseUhhbmRsZSBpY29uRmFtaWx5OworICAgIEljb25SZWYgdGhlSWNvblJlZjsKICNpZm5kZWYgUmVnaXN0ZXJJY29uUmVmRnJvbUljb25GYW1pbHkKLQlQeU1hY19QUkVDSEVDSyhSZWdpc3Rlckljb25SZWZGcm9tSWNvbkZhbWlseSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUmVnaXN0ZXJJY29uUmVmRnJvbUljb25GYW1pbHkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY3JlYXRvciwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaWNvblR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaWNvbkZhbWlseSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBSZWdpc3Rlckljb25SZWZGcm9tSWNvbkZhbWlseShjcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbkZhbWlseSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUljb25SZWYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCB0aGVJY29uUmVmKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjcmVhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpY29uVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZpY29uRmFtaWx5KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFJlZ2lzdGVySWNvblJlZkZyb21JY29uRmFtaWx5KGNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb25UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uRmFtaWx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlSWNvblJlZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHRoZUljb25SZWYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9SZWdpc3Rlckljb25SZWZGcm9tUmVzb3VyY2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JT1NUeXBlIGNyZWF0b3I7Ci0JT1NUeXBlIGljb25UeXBlOwotCUZTU3BlYyByZXNvdXJjZUZpbGU7Ci0JU0ludDE2IHJlc291cmNlSUQ7Ci0JSWNvblJlZiB0aGVJY29uUmVmOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIE9TVHlwZSBjcmVhdG9yOworICAgIE9TVHlwZSBpY29uVHlwZTsKKyAgICBGU1NwZWMgcmVzb3VyY2VGaWxlOworICAgIFNJbnQxNiByZXNvdXJjZUlEOworICAgIEljb25SZWYgdGhlSWNvblJlZjsKICNpZm5kZWYgUmVnaXN0ZXJJY29uUmVmRnJvbVJlc291cmNlCi0JUHlNYWNfUFJFQ0hFQ0soUmVnaXN0ZXJJY29uUmVmRnJvbVJlc291cmNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhSZWdpc3Rlckljb25SZWZGcm9tUmVzb3VyY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNyZWF0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmljb25UeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZyZXNvdXJjZUZpbGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZXNvdXJjZUlEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFJlZ2lzdGVySWNvblJlZkZyb21SZXNvdXJjZShjcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvblR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzb3VyY2VGaWxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVJY29uUmVmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgdGhlSWNvblJlZik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmljb25UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZyZXNvdXJjZUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXNvdXJjZUlEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFJlZ2lzdGVySWNvblJlZkZyb21SZXNvdXJjZShjcmVhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvblR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzb3VyY2VGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVJY29uUmVmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgdGhlSWNvblJlZik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqSWNuX1JlZ2lzdGVySWNvblJlZkZyb21GU1JlZihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlPU1R5cGUgY3JlYXRvcjsKLQlPU1R5cGUgaWNvblR5cGU7Ci0JRlNSZWYgaWNvbkZpbGU7Ci0JSWNvblJlZiB0aGVJY29uUmVmOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIE9TVHlwZSBjcmVhdG9yOworICAgIE9TVHlwZSBpY29uVHlwZTsKKyAgICBGU1JlZiBpY29uRmlsZTsKKyAgICBJY29uUmVmIHRoZUljb25SZWY7CiAjaWZuZGVmIFJlZ2lzdGVySWNvblJlZkZyb21GU1JlZgotCVB5TWFjX1BSRUNIRUNLKFJlZ2lzdGVySWNvblJlZkZyb21GU1JlZik7CisgICAgUHlNYWNfUFJFQ0hFQ0soUmVnaXN0ZXJJY29uUmVmRnJvbUZTUmVmKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNyZWF0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmljb25UeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1JlZiwgJmljb25GaWxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFJlZ2lzdGVySWNvblJlZkZyb21GU1JlZihjcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvblR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaWNvbkZpbGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlSWNvblJlZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHRoZUljb25SZWYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmljb25UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1JlZiwgJmljb25GaWxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFJlZ2lzdGVySWNvblJlZkZyb21GU1JlZihjcmVhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvblR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaWNvbkZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlSWNvblJlZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHRoZUljb25SZWYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9VbnJlZ2lzdGVySWNvblJlZihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlPU1R5cGUgY3JlYXRvcjsKLQlPU1R5cGUgaWNvblR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgT1NUeXBlIGNyZWF0b3I7CisgICAgT1NUeXBlIGljb25UeXBlOwogI2lmbmRlZiBVbnJlZ2lzdGVySWNvblJlZgotCVB5TWFjX1BSRUNIRUNLKFVucmVnaXN0ZXJJY29uUmVmKTsKKyAgICBQeU1hY19QUkVDSEVDSyhVbnJlZ2lzdGVySWNvblJlZik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY3JlYXRvciwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaWNvblR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gVW5yZWdpc3Rlckljb25SZWYoY3JlYXRvciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgaWNvblR5cGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjcmVhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpY29uVHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBVbnJlZ2lzdGVySWNvblJlZihjcmVhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uVHlwZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqSWNuX1VwZGF0ZUljb25SZWYoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSWNvblJlZiB0aGVJY29uUmVmOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEljb25SZWYgdGhlSWNvblJlZjsKICNpZm5kZWYgVXBkYXRlSWNvblJlZgotCVB5TWFjX1BSRUNIRUNLKFVwZGF0ZUljb25SZWYpOworICAgIFB5TWFjX1BSRUNIRUNLKFVwZGF0ZUljb25SZWYpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUljb25SZWYpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gVXBkYXRlSWNvblJlZih0aGVJY29uUmVmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlSWNvblJlZikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBVcGRhdGVJY29uUmVmKHRoZUljb25SZWYpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9PdmVycmlkZUljb25SZWZGcm9tUmVzb3VyY2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSWNvblJlZiB0aGVJY29uUmVmOwotCUZTU3BlYyByZXNvdXJjZUZpbGU7Ci0JU0ludDE2IHJlc291cmNlSUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSWNvblJlZiB0aGVJY29uUmVmOworICAgIEZTU3BlYyByZXNvdXJjZUZpbGU7CisgICAgU0ludDE2IHJlc291cmNlSUQ7CiAjaWZuZGVmIE92ZXJyaWRlSWNvblJlZkZyb21SZXNvdXJjZQotCVB5TWFjX1BSRUNIRUNLKE92ZXJyaWRlSWNvblJlZkZyb21SZXNvdXJjZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soT3ZlcnJpZGVJY29uUmVmRnJvbVJlc291cmNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVJY29uUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZyZXNvdXJjZUZpbGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZXNvdXJjZUlEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IE92ZXJyaWRlSWNvblJlZkZyb21SZXNvdXJjZSh0aGVJY29uUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc291cmNlRmlsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlSUQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVJY29uUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZyZXNvdXJjZUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXNvdXJjZUlEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IE92ZXJyaWRlSWNvblJlZkZyb21SZXNvdXJjZSh0aGVJY29uUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc291cmNlRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlSUQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9PdmVycmlkZUljb25SZWYoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSWNvblJlZiBvbGRJY29uUmVmOwotCUljb25SZWYgbmV3SWNvblJlZjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBJY29uUmVmIG9sZEljb25SZWY7CisgICAgSWNvblJlZiBuZXdJY29uUmVmOwogI2lmbmRlZiBPdmVycmlkZUljb25SZWYKLQlQeU1hY19QUkVDSEVDSyhPdmVycmlkZUljb25SZWYpOworICAgIFB5TWFjX1BSRUNIRUNLKE92ZXJyaWRlSWNvblJlZik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZvbGRJY29uUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJm5ld0ljb25SZWYpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gT3ZlcnJpZGVJY29uUmVmKG9sZEljb25SZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICBuZXdJY29uUmVmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZvbGRJY29uUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJm5ld0ljb25SZWYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gT3ZlcnJpZGVJY29uUmVmKG9sZEljb25SZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdJY29uUmVmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpJY25fUmVtb3ZlSWNvblJlZk92ZXJyaWRlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUljb25SZWYgdGhlSWNvblJlZjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBJY29uUmVmIHRoZUljb25SZWY7CiAjaWZuZGVmIFJlbW92ZUljb25SZWZPdmVycmlkZQotCVB5TWFjX1BSRUNIRUNLKFJlbW92ZUljb25SZWZPdmVycmlkZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUmVtb3ZlSWNvblJlZk92ZXJyaWRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVJY29uUmVmKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFJlbW92ZUljb25SZWZPdmVycmlkZSh0aGVJY29uUmVmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlSWNvblJlZikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBSZW1vdmVJY29uUmVmT3ZlcnJpZGUodGhlSWNvblJlZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqSWNuX0NvbXBvc2l0ZUljb25SZWYoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSWNvblJlZiBiYWNrZ3JvdW5kSWNvblJlZjsKLQlJY29uUmVmIGZvcmVncm91bmRJY29uUmVmOwotCUljb25SZWYgY29tcG9zaXRlSWNvblJlZjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBJY29uUmVmIGJhY2tncm91bmRJY29uUmVmOworICAgIEljb25SZWYgZm9yZWdyb3VuZEljb25SZWY7CisgICAgSWNvblJlZiBjb21wb3NpdGVJY29uUmVmOwogI2lmbmRlZiBDb21wb3NpdGVJY29uUmVmCi0JUHlNYWNfUFJFQ0hFQ0soQ29tcG9zaXRlSWNvblJlZik7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ29tcG9zaXRlSWNvblJlZik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZiYWNrZ3JvdW5kSWNvblJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZmb3JlZ3JvdW5kSWNvblJlZikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDb21wb3NpdGVJY29uUmVmKGJhY2tncm91bmRJY29uUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVncm91bmRJY29uUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICZjb21wb3NpdGVJY29uUmVmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgY29tcG9zaXRlSWNvblJlZik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmYmFja2dyb3VuZEljb25SZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZm9yZWdyb3VuZEljb25SZWYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ29tcG9zaXRlSWNvblJlZihiYWNrZ3JvdW5kSWNvblJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlZ3JvdW5kSWNvblJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29tcG9zaXRlSWNvblJlZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGNvbXBvc2l0ZUljb25SZWYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9Jc0ljb25SZWZDb21wb3NpdGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSWNvblJlZiBjb21wb3NpdGVJY29uUmVmOwotCUljb25SZWYgYmFja2dyb3VuZEljb25SZWY7Ci0JSWNvblJlZiBmb3JlZ3JvdW5kSWNvblJlZjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBJY29uUmVmIGNvbXBvc2l0ZUljb25SZWY7CisgICAgSWNvblJlZiBiYWNrZ3JvdW5kSWNvblJlZjsKKyAgICBJY29uUmVmIGZvcmVncm91bmRJY29uUmVmOwogI2lmbmRlZiBJc0ljb25SZWZDb21wb3NpdGUKLQlQeU1hY19QUkVDSEVDSyhJc0ljb25SZWZDb21wb3NpdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKElzSWNvblJlZkNvbXBvc2l0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmY29tcG9zaXRlSWNvblJlZikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBJc0ljb25SZWZDb21wb3NpdGUoY29tcG9zaXRlSWNvblJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZiYWNrZ3JvdW5kSWNvblJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZmb3JlZ3JvdW5kSWNvblJlZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgYmFja2dyb3VuZEljb25SZWYsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgZm9yZWdyb3VuZEljb25SZWYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZjb21wb3NpdGVJY29uUmVmKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IElzSWNvblJlZkNvbXBvc2l0ZShjb21wb3NpdGVJY29uUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJhY2tncm91bmRJY29uUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZvcmVncm91bmRJY29uUmVmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBiYWNrZ3JvdW5kSWNvblJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBmb3JlZ3JvdW5kSWNvblJlZik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqSWNuX0lzVmFsaWRJY29uUmVmKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlJY29uUmVmIHRoZUljb25SZWY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIEljb25SZWYgdGhlSWNvblJlZjsKICNpZm5kZWYgSXNWYWxpZEljb25SZWYKLQlQeU1hY19QUkVDSEVDSyhJc1ZhbGlkSWNvblJlZik7CisgICAgUHlNYWNfUFJFQ0hFQ0soSXNWYWxpZEljb25SZWYpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUljb25SZWYpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBJc1ZhbGlkSWNvblJlZih0aGVJY29uUmVmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlSWNvblJlZikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IElzVmFsaWRJY29uUmVmKHRoZUljb25SZWYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9QbG90SWNvblJlZihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlSZWN0IHRoZVJlY3Q7Ci0JSWNvbkFsaWdubWVudFR5cGUgYWxpZ247Ci0JSWNvblRyYW5zZm9ybVR5cGUgdHJhbnNmb3JtOwotCUljb25TZXJ2aWNlc1VzYWdlRmxhZ3MgdGhlSWNvblNlcnZpY2VzVXNhZ2VGbGFnczsKLQlJY29uUmVmIHRoZUljb25SZWY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgUmVjdCB0aGVSZWN0OworICAgIEljb25BbGlnbm1lbnRUeXBlIGFsaWduOworICAgIEljb25UcmFuc2Zvcm1UeXBlIHRyYW5zZm9ybTsKKyAgICBJY29uU2VydmljZXNVc2FnZUZsYWdzIHRoZUljb25TZXJ2aWNlc1VzYWdlRmxhZ3M7CisgICAgSWNvblJlZiB0aGVJY29uUmVmOwogI2lmbmRlZiBQbG90SWNvblJlZgotCVB5TWFjX1BSRUNIRUNLKFBsb3RJY29uUmVmKTsKKyAgICBQeU1hY19QUkVDSEVDSyhQbG90SWNvblJlZik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhobE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnRoZVJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICZhbGlnbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRyYW5zZm9ybSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRoZUljb25TZXJ2aWNlc1VzYWdlRmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlSWNvblJlZikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBQbG90SWNvblJlZigmdGhlUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgYWxpZ24sCi0JICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybSwKLQkgICAgICAgICAgICAgICAgICAgdGhlSWNvblNlcnZpY2VzVXNhZ2VGbGFncywKLQkgICAgICAgICAgICAgICAgICAgdGhlSWNvblJlZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaGxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZ0aGVSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYWxpZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVJY29uU2VydmljZXNVc2FnZUZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUljb25SZWYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUGxvdEljb25SZWYoJnRoZVJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgIGFsaWduLAorICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgIHRoZUljb25TZXJ2aWNlc1VzYWdlRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgIHRoZUljb25SZWYpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9QdEluSWNvblJlZihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JUG9pbnQgdGVzdFB0OwotCVJlY3QgaWNvblJlY3Q7Ci0JSWNvbkFsaWdubWVudFR5cGUgYWxpZ247Ci0JSWNvblNlcnZpY2VzVXNhZ2VGbGFncyB0aGVJY29uU2VydmljZXNVc2FnZUZsYWdzOwotCUljb25SZWYgdGhlSWNvblJlZjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgUG9pbnQgdGVzdFB0OworICAgIFJlY3QgaWNvblJlY3Q7CisgICAgSWNvbkFsaWdubWVudFR5cGUgYWxpZ247CisgICAgSWNvblNlcnZpY2VzVXNhZ2VGbGFncyB0aGVJY29uU2VydmljZXNVc2FnZUZsYWdzOworICAgIEljb25SZWYgdGhlSWNvblJlZjsKICNpZm5kZWYgUHRJbkljb25SZWYKLQlQeU1hY19QUkVDSEVDSyhQdEluSWNvblJlZik7CisgICAgUHlNYWNfUFJFQ0hFQ0soUHRJbkljb25SZWYpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmhsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnRlc3RQdCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmljb25SZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmYWxpZ24sCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aGVJY29uU2VydmljZXNVc2FnZUZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUljb25SZWYpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBQdEluSWNvblJlZigmdGVzdFB0LAotCSAgICAgICAgICAgICAgICAgICZpY29uUmVjdCwKLQkgICAgICAgICAgICAgICAgICBhbGlnbiwKLQkgICAgICAgICAgICAgICAgICB0aGVJY29uU2VydmljZXNVc2FnZUZsYWdzLAotCSAgICAgICAgICAgICAgICAgIHRoZUljb25SZWYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZobE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZ0ZXN0UHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpY29uUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFsaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlSWNvblNlcnZpY2VzVXNhZ2VGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVJY29uUmVmKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gUHRJbkljb25SZWYoJnRlc3RQdCwKKyAgICAgICAgICAgICAgICAgICAgICAmaWNvblJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgYWxpZ24sCisgICAgICAgICAgICAgICAgICAgICAgdGhlSWNvblNlcnZpY2VzVXNhZ2VGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICB0aGVJY29uUmVmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpJY25fUmVjdEluSWNvblJlZihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JUmVjdCB0ZXN0UmVjdDsKLQlSZWN0IGljb25SZWN0OwotCUljb25BbGlnbm1lbnRUeXBlIGFsaWduOwotCUljb25TZXJ2aWNlc1VzYWdlRmxhZ3MgaWNvblNlcnZpY2VzVXNhZ2VGbGFnczsKLQlJY29uUmVmIHRoZUljb25SZWY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIFJlY3QgdGVzdFJlY3Q7CisgICAgUmVjdCBpY29uUmVjdDsKKyAgICBJY29uQWxpZ25tZW50VHlwZSBhbGlnbjsKKyAgICBJY29uU2VydmljZXNVc2FnZUZsYWdzIGljb25TZXJ2aWNlc1VzYWdlRmxhZ3M7CisgICAgSWNvblJlZiB0aGVJY29uUmVmOwogI2lmbmRlZiBSZWN0SW5JY29uUmVmCi0JUHlNYWNfUFJFQ0hFQ0soUmVjdEluSWNvblJlZik7CisgICAgUHlNYWNfUFJFQ0hFQ0soUmVjdEluSWNvblJlZik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maGxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZ0ZXN0UmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmljb25SZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmYWxpZ24sCi0JICAgICAgICAgICAgICAgICAgICAgICZpY29uU2VydmljZXNVc2FnZUZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUljb25SZWYpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBSZWN0SW5JY29uUmVmKCZ0ZXN0UmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICZpY29uUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgIGFsaWduLAotCSAgICAgICAgICAgICAgICAgICAgaWNvblNlcnZpY2VzVXNhZ2VGbGFncywKLQkgICAgICAgICAgICAgICAgICAgIHRoZUljb25SZWYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZobE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnRlc3RSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaWNvblJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmljb25TZXJ2aWNlc1VzYWdlRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlSWNvblJlZikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFJlY3RJbkljb25SZWYoJnRlc3RSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgJmljb25SZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ24sCisgICAgICAgICAgICAgICAgICAgICAgICBpY29uU2VydmljZXNVc2FnZUZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgdGhlSWNvblJlZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqSWNuX0ljb25SZWZUb1JnbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlSZ25IYW5kbGUgdGhlUmduOwotCVJlY3QgaWNvblJlY3Q7Ci0JSWNvbkFsaWdubWVudFR5cGUgYWxpZ247Ci0JSWNvblNlcnZpY2VzVXNhZ2VGbGFncyBpY29uU2VydmljZXNVc2FnZUZsYWdzOwotCUljb25SZWYgdGhlSWNvblJlZjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBSZ25IYW5kbGUgdGhlUmduOworICAgIFJlY3QgaWNvblJlY3Q7CisgICAgSWNvbkFsaWdubWVudFR5cGUgYWxpZ247CisgICAgSWNvblNlcnZpY2VzVXNhZ2VGbGFncyBpY29uU2VydmljZXNVc2FnZUZsYWdzOworICAgIEljb25SZWYgdGhlSWNvblJlZjsKICNpZm5kZWYgSWNvblJlZlRvUmduCi0JUHlNYWNfUFJFQ0hFQ0soSWNvblJlZlRvUmduKTsKKyAgICBQeU1hY19QUkVDSEVDSyhJY29uUmVmVG9SZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmhsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZVJnbiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmljb25SZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmYWxpZ24sCi0JICAgICAgICAgICAgICAgICAgICAgICZpY29uU2VydmljZXNVc2FnZUZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUljb25SZWYpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gSWNvblJlZlRvUmduKHRoZVJnbiwKLQkgICAgICAgICAgICAgICAgICAgICZpY29uUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgIGFsaWduLAotCSAgICAgICAgICAgICAgICAgICAgaWNvblNlcnZpY2VzVXNhZ2VGbGFncywKLQkgICAgICAgICAgICAgICAgICAgIHRoZUljb25SZWYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZobE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVSZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpY29uUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFsaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaWNvblNlcnZpY2VzVXNhZ2VGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVJY29uUmVmKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEljb25SZWZUb1Jnbih0aGVSZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAmaWNvblJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGljb25TZXJ2aWNlc1VzYWdlRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICB0aGVJY29uUmVmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpJY25fR2V0SWNvblNpemVzRnJvbUljb25SZWYoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSWNvblNlbGVjdG9yVmFsdWUgaWNvblNlbGVjdG9ySW5wdXQ7Ci0JSWNvblNlbGVjdG9yVmFsdWUgaWNvblNlbGVjdG9yT3V0cHV0UHRyOwotCUljb25TZXJ2aWNlc1VzYWdlRmxhZ3MgaWNvblNlcnZpY2VzVXNhZ2VGbGFnczsKLQlJY29uUmVmIHRoZUljb25SZWY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSWNvblNlbGVjdG9yVmFsdWUgaWNvblNlbGVjdG9ySW5wdXQ7CisgICAgSWNvblNlbGVjdG9yVmFsdWUgaWNvblNlbGVjdG9yT3V0cHV0UHRyOworICAgIEljb25TZXJ2aWNlc1VzYWdlRmxhZ3MgaWNvblNlcnZpY2VzVXNhZ2VGbGFnczsKKyAgICBJY29uUmVmIHRoZUljb25SZWY7CiAjaWZuZGVmIEdldEljb25TaXplc0Zyb21JY29uUmVmCi0JUHlNYWNfUFJFQ0hFQ0soR2V0SWNvblNpemVzRnJvbUljb25SZWYpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldEljb25TaXplc0Zyb21JY29uUmVmKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaWNvblNlbGVjdG9ySW5wdXQsCi0JICAgICAgICAgICAgICAgICAgICAgICZpY29uU2VydmljZXNVc2FnZUZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUljb25SZWYpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0SWNvblNpemVzRnJvbUljb25SZWYoaWNvblNlbGVjdG9ySW5wdXQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpY29uU2VsZWN0b3JPdXRwdXRQdHIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb25TZXJ2aWNlc1VzYWdlRmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZUljb25SZWYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIGljb25TZWxlY3Rvck91dHB1dFB0cik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpY29uU2VsZWN0b3JJbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmljb25TZXJ2aWNlc1VzYWdlRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlSWNvblJlZikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRJY29uU2l6ZXNGcm9tSWNvblJlZihpY29uU2VsZWN0b3JJbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmljb25TZWxlY3Rvck91dHB1dFB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvblNlcnZpY2VzVXNhZ2VGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlSWNvblJlZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaWNvblNlbGVjdG9yT3V0cHV0UHRyKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpJY25fRmx1c2hJY29uUmVmcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlPU1R5cGUgY3JlYXRvcjsKLQlPU1R5cGUgaWNvblR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgT1NUeXBlIGNyZWF0b3I7CisgICAgT1NUeXBlIGljb25UeXBlOwogI2lmbmRlZiBGbHVzaEljb25SZWZzCi0JUHlNYWNfUFJFQ0hFQ0soRmx1c2hJY29uUmVmcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRmx1c2hJY29uUmVmcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY3JlYXRvciwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaWNvblR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRmx1c2hJY29uUmVmcyhjcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgIGljb25UeXBlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaWNvblR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRmx1c2hJY29uUmVmcyhjcmVhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIGljb25UeXBlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpJY25fRmx1c2hJY29uUmVmc0J5Vm9sdW1lKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVNJbnQxNiB2UmVmTnVtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFNJbnQxNiB2UmVmTnVtOwogI2lmbmRlZiBGbHVzaEljb25SZWZzQnlWb2x1bWUKLQlQeU1hY19QUkVDSEVDSyhGbHVzaEljb25SZWZzQnlWb2x1bWUpOworICAgIFB5TWFjX1BSRUNIRUNLKEZsdXNoSWNvblJlZnNCeVZvbHVtZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZSZWZOdW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRmx1c2hJY29uUmVmc0J5Vm9sdW1lKHZSZWZOdW0pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdlJlZk51bSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBGbHVzaEljb25SZWZzQnlWb2x1bWUodlJlZk51bSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqSWNuX1NldEN1c3RvbUljb25zRW5hYmxlZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlTSW50MTYgdlJlZk51bTsKLQlCb29sZWFuIGVuYWJsZUN1c3RvbUljb25zOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFNJbnQxNiB2UmVmTnVtOworICAgIEJvb2xlYW4gZW5hYmxlQ3VzdG9tSWNvbnM7CiAjaWZuZGVmIFNldEN1c3RvbUljb25zRW5hYmxlZAotCVB5TWFjX1BSRUNIRUNLKFNldEN1c3RvbUljb25zRW5hYmxlZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0Q3VzdG9tSWNvbnNFbmFibGVkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICZlbmFibGVDdXN0b21JY29ucykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRDdXN0b21JY29uc0VuYWJsZWQodlJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZUN1c3RvbUljb25zKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5hYmxlQ3VzdG9tSWNvbnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0Q3VzdG9tSWNvbnNFbmFibGVkKHZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVDdXN0b21JY29ucyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqSWNuX0dldEN1c3RvbUljb25zRW5hYmxlZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlTSW50MTYgdlJlZk51bTsKLQlCb29sZWFuIGN1c3RvbUljb25zRW5hYmxlZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTSW50MTYgdlJlZk51bTsKKyAgICBCb29sZWFuIGN1c3RvbUljb25zRW5hYmxlZDsKICNpZm5kZWYgR2V0Q3VzdG9tSWNvbnNFbmFibGVkCi0JUHlNYWNfUFJFQ0hFQ0soR2V0Q3VzdG9tSWNvbnNFbmFibGVkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRDdXN0b21JY29uc0VuYWJsZWQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldEN1c3RvbUljb25zRW5hYmxlZCh2UmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmN1c3RvbUljb25zRW5hYmxlZCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgY3VzdG9tSWNvbnNFbmFibGVkKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZSZWZOdW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0Q3VzdG9tSWNvbnNFbmFibGVkKHZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3VzdG9tSWNvbnNFbmFibGVkKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjdXN0b21JY29uc0VuYWJsZWQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9Jc0ljb25SZWZNYXNrRW1wdHkoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCUljb25SZWYgaWNvblJlZjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgSWNvblJlZiBpY29uUmVmOwogI2lmbmRlZiBJc0ljb25SZWZNYXNrRW1wdHkKLQlQeU1hY19QUkVDSEVDSyhJc0ljb25SZWZNYXNrRW1wdHkpOworICAgIFB5TWFjX1BSRUNIRUNLKElzSWNvblJlZk1hc2tFbXB0eSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaWNvblJlZikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IElzSWNvblJlZk1hc2tFbXB0eShpY29uUmVmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaWNvblJlZikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IElzSWNvblJlZk1hc2tFbXB0eShpY29uUmVmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpJY25fR2V0SWNvblJlZlZhcmlhbnQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUljb25SZWYgX3J2OwotCUljb25SZWYgaW5JY29uUmVmOwotCU9TVHlwZSBpblZhcmlhbnQ7Ci0JSWNvblRyYW5zZm9ybVR5cGUgb3V0VHJhbnNmb3JtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBJY29uUmVmIF9ydjsKKyAgICBJY29uUmVmIGluSWNvblJlZjsKKyAgICBPU1R5cGUgaW5WYXJpYW50OworICAgIEljb25UcmFuc2Zvcm1UeXBlIG91dFRyYW5zZm9ybTsKICNpZm5kZWYgR2V0SWNvblJlZlZhcmlhbnQKLQlQeU1hY19QUkVDSEVDSyhHZXRJY29uUmVmVmFyaWFudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0SWNvblJlZlZhcmlhbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaW5JY29uUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpblZhcmlhbnQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRJY29uUmVmVmFyaWFudChpbkljb25SZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgaW5WYXJpYW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICZvdXRUcmFuc2Zvcm0pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRUcmFuc2Zvcm0pOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmluSWNvblJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaW5WYXJpYW50KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0SWNvblJlZlZhcmlhbnQoaW5JY29uUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluVmFyaWFudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0VHJhbnNmb3JtKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0VHJhbnNmb3JtKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpJY25fUmVnaXN0ZXJJY29uUmVmRnJvbUljb25GaWxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCU9TVHlwZSBjcmVhdG9yOwotCU9TVHlwZSBpY29uVHlwZTsKLQlGU1NwZWMgaWNvbkZpbGU7Ci0JSWNvblJlZiB0aGVJY29uUmVmOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIE9TVHlwZSBjcmVhdG9yOworICAgIE9TVHlwZSBpY29uVHlwZTsKKyAgICBGU1NwZWMgaWNvbkZpbGU7CisgICAgSWNvblJlZiB0aGVJY29uUmVmOwogI2lmbmRlZiBSZWdpc3Rlckljb25SZWZGcm9tSWNvbkZpbGUKLQlQeU1hY19QUkVDSEVDSyhSZWdpc3Rlckljb25SZWZGcm9tSWNvbkZpbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFJlZ2lzdGVySWNvblJlZkZyb21JY29uRmlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpY29uVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmaWNvbkZpbGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUmVnaXN0ZXJJY29uUmVmRnJvbUljb25GaWxlKGNyZWF0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpY29uRmlsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVJY29uUmVmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgdGhlSWNvblJlZik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaWNvblR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJmljb25GaWxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFJlZ2lzdGVySWNvblJlZkZyb21JY29uRmlsZShjcmVhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvblR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaWNvbkZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlSWNvblJlZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHRoZUljb25SZWYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9SZWFkSWNvbkZpbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JRlNTcGVjIGljb25GaWxlOwotCUljb25GYW1pbHlIYW5kbGUgaWNvbkZhbWlseTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBGU1NwZWMgaWNvbkZpbGU7CisgICAgSWNvbkZhbWlseUhhbmRsZSBpY29uRmFtaWx5OwogI2lmbmRlZiBSZWFkSWNvbkZpbGUKLQlQeU1hY19QUkVDSEVDSyhSZWFkSWNvbkZpbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFJlYWRJY29uRmlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJmljb25GaWxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFJlYWRJY29uRmlsZSgmaWNvbkZpbGUsCi0JICAgICAgICAgICAgICAgICAgICAmaWNvbkZhbWlseSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGljb25GYW1pbHkpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmaWNvbkZpbGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUmVhZEljb25GaWxlKCZpY29uRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZpY29uRmFtaWx5KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgaWNvbkZhbWlseSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqSWNuX1JlYWRJY29uRnJvbUZTUmVmKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUZTUmVmIHJlZjsKLQlJY29uRmFtaWx5SGFuZGxlIGljb25GYW1pbHk7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgRlNSZWYgcmVmOworICAgIEljb25GYW1pbHlIYW5kbGUgaWNvbkZhbWlseTsKICNpZm5kZWYgUmVhZEljb25Gcm9tRlNSZWYKLQlQeU1hY19QUkVDSEVDSyhSZWFkSWNvbkZyb21GU1JlZik7CisgICAgUHlNYWNfUFJFQ0hFQ0soUmVhZEljb25Gcm9tRlNSZWYpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1JlZiwgJnJlZikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBSZWFkSWNvbkZyb21GU1JlZigmcmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmaWNvbkZhbWlseSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGljb25GYW1pbHkpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNSZWYsICZyZWYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUmVhZEljb25Gcm9tRlNSZWYoJnJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmljb25GYW1pbHkpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBpY29uRmFtaWx5KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpJY25fV3JpdGVJY29uRmlsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlJY29uRmFtaWx5SGFuZGxlIGljb25GYW1pbHk7Ci0JRlNTcGVjIGljb25GaWxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEljb25GYW1pbHlIYW5kbGUgaWNvbkZhbWlseTsKKyAgICBGU1NwZWMgaWNvbkZpbGU7CiAjaWZuZGVmIFdyaXRlSWNvbkZpbGUKLQlQeU1hY19QUkVDSEVDSyhXcml0ZUljb25GaWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhXcml0ZUljb25GaWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmljb25GYW1pbHksCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJmljb25GaWxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFdyaXRlSWNvbkZpbGUoaWNvbkZhbWlseSwKLQkgICAgICAgICAgICAgICAgICAgICAmaWNvbkZpbGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmljb25GYW1pbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJmljb25GaWxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFdyaXRlSWNvbkZpbGUoaWNvbkZhbWlseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmaWNvbkZpbGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogI2VuZGlmIC8qIF9fTFA2NF9fICovCiAKIHN0YXRpYyBQeU1ldGhvZERlZiBJY25fbWV0aG9kc1tdID0gewogI2lmbmRlZiBfX0xQNjRfXwotCXsiR2V0Q0ljb24iLCAoUHlDRnVuY3Rpb24pSWNuX0dldENJY29uLCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgaWNvbklEKSAtPiAoQ0ljb25IYW5kbGUgX3J2KSIpfSwKLQl7IlBsb3RDSWNvbiIsIChQeUNGdW5jdGlvbilJY25fUGxvdENJY29uLCAxLAotCSBQeURvY19TVFIoIihSZWN0IHRoZVJlY3QsIENJY29uSGFuZGxlIHRoZUljb24pIC0+IE5vbmUiKX0sCi0JeyJEaXNwb3NlQ0ljb24iLCAoUHlDRnVuY3Rpb24pSWNuX0Rpc3Bvc2VDSWNvbiwgMSwKLQkgUHlEb2NfU1RSKCIoQ0ljb25IYW5kbGUgdGhlSWNvbikgLT4gTm9uZSIpfSwKLQl7IkdldEljb24iLCAoUHlDRnVuY3Rpb24pSWNuX0dldEljb24sIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiBpY29uSUQpIC0+IChIYW5kbGUgX3J2KSIpfSwKLQl7IlBsb3RJY29uIiwgKFB5Q0Z1bmN0aW9uKUljbl9QbG90SWNvbiwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCB0aGVSZWN0LCBIYW5kbGUgdGhlSWNvbikgLT4gTm9uZSIpfSwKLQl7IlBsb3RJY29uSUQiLCAoUHlDRnVuY3Rpb24pSWNuX1Bsb3RJY29uSUQsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgdGhlUmVjdCwgSWNvbkFsaWdubWVudFR5cGUgYWxpZ24sIEljb25UcmFuc2Zvcm1UeXBlIHRyYW5zZm9ybSwgU0ludDE2IHRoZVJlc0lEKSAtPiBOb25lIil9LAotCXsiTmV3SWNvblN1aXRlIiwgKFB5Q0Z1bmN0aW9uKUljbl9OZXdJY29uU3VpdGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEljb25TdWl0ZVJlZiB0aGVJY29uU3VpdGUpIil9LAotCXsiQWRkSWNvblRvU3VpdGUiLCAoUHlDRnVuY3Rpb24pSWNuX0FkZEljb25Ub1N1aXRlLCAxLAotCSBQeURvY19TVFIoIihIYW5kbGUgdGhlSWNvbkRhdGEsIEljb25TdWl0ZVJlZiB0aGVTdWl0ZSwgUmVzVHlwZSB0aGVUeXBlKSAtPiBOb25lIil9LAotCXsiR2V0SWNvbkZyb21TdWl0ZSIsIChQeUNGdW5jdGlvbilJY25fR2V0SWNvbkZyb21TdWl0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoSWNvblN1aXRlUmVmIHRoZVN1aXRlLCBSZXNUeXBlIHRoZVR5cGUpIC0+IChIYW5kbGUgdGhlSWNvbkRhdGEpIil9LAotCXsiR2V0SWNvblN1aXRlIiwgKFB5Q0Z1bmN0aW9uKUljbl9HZXRJY29uU3VpdGUsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiB0aGVSZXNJRCwgSWNvblNlbGVjdG9yVmFsdWUgc2VsZWN0b3IpIC0+IChJY29uU3VpdGVSZWYgdGhlSWNvblN1aXRlKSIpfSwKLQl7IkRpc3Bvc2VJY29uU3VpdGUiLCAoUHlDRnVuY3Rpb24pSWNuX0Rpc3Bvc2VJY29uU3VpdGUsIDEsCi0JIFB5RG9jX1NUUigiKEljb25TdWl0ZVJlZiB0aGVJY29uU3VpdGUsIEJvb2xlYW4gZGlzcG9zZURhdGEpIC0+IE5vbmUiKX0sCi0JeyJQbG90SWNvblN1aXRlIiwgKFB5Q0Z1bmN0aW9uKUljbl9QbG90SWNvblN1aXRlLCAxLAotCSBQeURvY19TVFIoIihSZWN0IHRoZVJlY3QsIEljb25BbGlnbm1lbnRUeXBlIGFsaWduLCBJY29uVHJhbnNmb3JtVHlwZSB0cmFuc2Zvcm0sIEljb25TdWl0ZVJlZiB0aGVJY29uU3VpdGUpIC0+IE5vbmUiKX0sCi0JeyJMb2FkSWNvbkNhY2hlIiwgKFB5Q0Z1bmN0aW9uKUljbl9Mb2FkSWNvbkNhY2hlLCAxLAotCSBQeURvY19TVFIoIihSZWN0IHRoZVJlY3QsIEljb25BbGlnbm1lbnRUeXBlIGFsaWduLCBJY29uVHJhbnNmb3JtVHlwZSB0cmFuc2Zvcm0sIEljb25DYWNoZVJlZiB0aGVJY29uQ2FjaGUpIC0+IE5vbmUiKX0sCi0JeyJHZXRMYWJlbCIsIChQeUNGdW5jdGlvbilJY25fR2V0TGFiZWwsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiBsYWJlbE51bWJlciwgU3RyMjU1IGxhYmVsU3RyaW5nKSAtPiAoUkdCQ29sb3IgbGFiZWxDb2xvcikiKX0sCi0JeyJQdEluSWNvbklEIiwgKFB5Q0Z1bmN0aW9uKUljbl9QdEluSWNvbklELCAxLAotCSBQeURvY19TVFIoIihQb2ludCB0ZXN0UHQsIFJlY3QgaWNvblJlY3QsIEljb25BbGlnbm1lbnRUeXBlIGFsaWduLCBTSW50MTYgaWNvbklEKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiUHRJbkljb25TdWl0ZSIsIChQeUNGdW5jdGlvbilJY25fUHRJbkljb25TdWl0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoUG9pbnQgdGVzdFB0LCBSZWN0IGljb25SZWN0LCBJY29uQWxpZ25tZW50VHlwZSBhbGlnbiwgSWNvblN1aXRlUmVmIHRoZUljb25TdWl0ZSkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IlJlY3RJbkljb25JRCIsIChQeUNGdW5jdGlvbilJY25fUmVjdEluSWNvbklELCAxLAotCSBQeURvY19TVFIoIihSZWN0IHRlc3RSZWN0LCBSZWN0IGljb25SZWN0LCBJY29uQWxpZ25tZW50VHlwZSBhbGlnbiwgU0ludDE2IGljb25JRCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IlJlY3RJbkljb25TdWl0ZSIsIChQeUNGdW5jdGlvbilJY25fUmVjdEluSWNvblN1aXRlLCAxLAotCSBQeURvY19TVFIoIihSZWN0IHRlc3RSZWN0LCBSZWN0IGljb25SZWN0LCBJY29uQWxpZ25tZW50VHlwZSBhbGlnbiwgSWNvblN1aXRlUmVmIHRoZUljb25TdWl0ZSkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7Ikljb25JRFRvUmduIiwgKFB5Q0Z1bmN0aW9uKUljbl9JY29uSURUb1JnbiwgMSwKLQkgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHRoZVJnbiwgUmVjdCBpY29uUmVjdCwgSWNvbkFsaWdubWVudFR5cGUgYWxpZ24sIFNJbnQxNiBpY29uSUQpIC0+IE5vbmUiKX0sCi0JeyJJY29uU3VpdGVUb1JnbiIsIChQeUNGdW5jdGlvbilJY25fSWNvblN1aXRlVG9SZ24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSB0aGVSZ24sIFJlY3QgaWNvblJlY3QsIEljb25BbGlnbm1lbnRUeXBlIGFsaWduLCBJY29uU3VpdGVSZWYgdGhlSWNvblN1aXRlKSAtPiBOb25lIil9LAotCXsiU2V0U3VpdGVMYWJlbCIsIChQeUNGdW5jdGlvbilJY25fU2V0U3VpdGVMYWJlbCwgMSwKLQkgUHlEb2NfU1RSKCIoSWNvblN1aXRlUmVmIHRoZVN1aXRlLCBTSW50MTYgdGhlTGFiZWwpIC0+IE5vbmUiKX0sCi0JeyJHZXRTdWl0ZUxhYmVsIiwgKFB5Q0Z1bmN0aW9uKUljbl9HZXRTdWl0ZUxhYmVsLCAxLAotCSBQeURvY19TVFIoIihJY29uU3VpdGVSZWYgdGhlU3VpdGUpIC0+IChTSW50MTYgX3J2KSIpfSwKLQl7IlBsb3RJY29uSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKUljbl9QbG90SWNvbkhhbmRsZSwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCB0aGVSZWN0LCBJY29uQWxpZ25tZW50VHlwZSBhbGlnbiwgSWNvblRyYW5zZm9ybVR5cGUgdHJhbnNmb3JtLCBIYW5kbGUgdGhlSWNvbikgLT4gTm9uZSIpfSwKLQl7IlBsb3RTSUNOSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKUljbl9QbG90U0lDTkhhbmRsZSwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCB0aGVSZWN0LCBJY29uQWxpZ25tZW50VHlwZSBhbGlnbiwgSWNvblRyYW5zZm9ybVR5cGUgdHJhbnNmb3JtLCBIYW5kbGUgdGhlU0lDTikgLT4gTm9uZSIpfSwKLQl7IlBsb3RDSWNvbkhhbmRsZSIsIChQeUNGdW5jdGlvbilJY25fUGxvdENJY29uSGFuZGxlLCAxLAotCSBQeURvY19TVFIoIihSZWN0IHRoZVJlY3QsIEljb25BbGlnbm1lbnRUeXBlIGFsaWduLCBJY29uVHJhbnNmb3JtVHlwZSB0cmFuc2Zvcm0sIENJY29uSGFuZGxlIHRoZUNJY29uKSAtPiBOb25lIil9LAotCXsiSWNvblJlZlRvSWNvbkZhbWlseSIsIChQeUNGdW5jdGlvbilJY25fSWNvblJlZlRvSWNvbkZhbWlseSwgMSwKLQkgUHlEb2NfU1RSKCIoSWNvblJlZiB0aGVJY29uUmVmLCBJY29uU2VsZWN0b3JWYWx1ZSB3aGljaEljb25zKSAtPiAoSWNvbkZhbWlseUhhbmRsZSBpY29uRmFtaWx5KSIpfSwKLQl7Ikljb25GYW1pbHlUb0ljb25TdWl0ZSIsIChQeUNGdW5jdGlvbilJY25fSWNvbkZhbWlseVRvSWNvblN1aXRlLCAxLAotCSBQeURvY19TVFIoIihJY29uRmFtaWx5SGFuZGxlIGljb25GYW1pbHksIEljb25TZWxlY3RvclZhbHVlIHdoaWNoSWNvbnMpIC0+IChJY29uU3VpdGVSZWYgaWNvblN1aXRlKSIpfSwKLQl7Ikljb25TdWl0ZVRvSWNvbkZhbWlseSIsIChQeUNGdW5jdGlvbilJY25fSWNvblN1aXRlVG9JY29uRmFtaWx5LCAxLAotCSBQeURvY19TVFIoIihJY29uU3VpdGVSZWYgaWNvblN1aXRlLCBJY29uU2VsZWN0b3JWYWx1ZSB3aGljaEljb25zKSAtPiAoSWNvbkZhbWlseUhhbmRsZSBpY29uRmFtaWx5KSIpfSwKLQl7IlNldEljb25GYW1pbHlEYXRhIiwgKFB5Q0Z1bmN0aW9uKUljbl9TZXRJY29uRmFtaWx5RGF0YSwgMSwKLQkgUHlEb2NfU1RSKCIoSWNvbkZhbWlseUhhbmRsZSBpY29uRmFtaWx5LCBPU1R5cGUgaWNvblR5cGUsIEhhbmRsZSBoKSAtPiBOb25lIil9LAotCXsiR2V0SWNvbkZhbWlseURhdGEiLCAoUHlDRnVuY3Rpb24pSWNuX0dldEljb25GYW1pbHlEYXRhLCAxLAotCSBQeURvY19TVFIoIihJY29uRmFtaWx5SGFuZGxlIGljb25GYW1pbHksIE9TVHlwZSBpY29uVHlwZSwgSGFuZGxlIGgpIC0+IE5vbmUiKX0sCi0JeyJHZXRJY29uUmVmT3duZXJzIiwgKFB5Q0Z1bmN0aW9uKUljbl9HZXRJY29uUmVmT3duZXJzLCAxLAotCSBQeURvY19TVFIoIihJY29uUmVmIHRoZUljb25SZWYpIC0+IChVSW50MTYgb3duZXJzKSIpfSwKLQl7IkFjcXVpcmVJY29uUmVmIiwgKFB5Q0Z1bmN0aW9uKUljbl9BY3F1aXJlSWNvblJlZiwgMSwKLQkgUHlEb2NfU1RSKCIoSWNvblJlZiB0aGVJY29uUmVmKSAtPiBOb25lIil9LAotCXsiUmVsZWFzZUljb25SZWYiLCAoUHlDRnVuY3Rpb24pSWNuX1JlbGVhc2VJY29uUmVmLCAxLAotCSBQeURvY19TVFIoIihJY29uUmVmIHRoZUljb25SZWYpIC0+IE5vbmUiKX0sCi0JeyJHZXRJY29uUmVmRnJvbUZpbGUiLCAoUHlDRnVuY3Rpb24pSWNuX0dldEljb25SZWZGcm9tRmlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoRlNTcGVjIHRoZUZpbGUpIC0+IChJY29uUmVmIHRoZUljb25SZWYsIFNJbnQxNiB0aGVMYWJlbCkiKX0sCi0JeyJHZXRJY29uUmVmIiwgKFB5Q0Z1bmN0aW9uKUljbl9HZXRJY29uUmVmLCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgdlJlZk51bSwgT1NUeXBlIGNyZWF0b3IsIE9TVHlwZSBpY29uVHlwZSkgLT4gKEljb25SZWYgdGhlSWNvblJlZikiKX0sCi0JeyJHZXRJY29uUmVmRnJvbUZvbGRlciIsIChQeUNGdW5jdGlvbilJY25fR2V0SWNvblJlZkZyb21Gb2xkZXIsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiB2UmVmTnVtLCBTSW50MzIgcGFyZW50Rm9sZGVySUQsIFNJbnQzMiBmb2xkZXJJRCwgU0ludDggYXR0cmlidXRlcywgU0ludDggYWNjZXNzUHJpdmlsZWdlcykgLT4gKEljb25SZWYgdGhlSWNvblJlZikiKX0sCi0JeyJSZWdpc3Rlckljb25SZWZGcm9tSWNvbkZhbWlseSIsIChQeUNGdW5jdGlvbilJY25fUmVnaXN0ZXJJY29uUmVmRnJvbUljb25GYW1pbHksIDEsCi0JIFB5RG9jX1NUUigiKE9TVHlwZSBjcmVhdG9yLCBPU1R5cGUgaWNvblR5cGUsIEljb25GYW1pbHlIYW5kbGUgaWNvbkZhbWlseSkgLT4gKEljb25SZWYgdGhlSWNvblJlZikiKX0sCi0JeyJSZWdpc3Rlckljb25SZWZGcm9tUmVzb3VyY2UiLCAoUHlDRnVuY3Rpb24pSWNuX1JlZ2lzdGVySWNvblJlZkZyb21SZXNvdXJjZSwgMSwKLQkgUHlEb2NfU1RSKCIoT1NUeXBlIGNyZWF0b3IsIE9TVHlwZSBpY29uVHlwZSwgRlNTcGVjIHJlc291cmNlRmlsZSwgU0ludDE2IHJlc291cmNlSUQpIC0+IChJY29uUmVmIHRoZUljb25SZWYpIil9LAotCXsiUmVnaXN0ZXJJY29uUmVmRnJvbUZTUmVmIiwgKFB5Q0Z1bmN0aW9uKUljbl9SZWdpc3Rlckljb25SZWZGcm9tRlNSZWYsIDEsCi0JIFB5RG9jX1NUUigiKE9TVHlwZSBjcmVhdG9yLCBPU1R5cGUgaWNvblR5cGUsIEZTUmVmIGljb25GaWxlKSAtPiAoSWNvblJlZiB0aGVJY29uUmVmKSIpfSwKLQl7IlVucmVnaXN0ZXJJY29uUmVmIiwgKFB5Q0Z1bmN0aW9uKUljbl9VbnJlZ2lzdGVySWNvblJlZiwgMSwKLQkgUHlEb2NfU1RSKCIoT1NUeXBlIGNyZWF0b3IsIE9TVHlwZSBpY29uVHlwZSkgLT4gTm9uZSIpfSwKLQl7IlVwZGF0ZUljb25SZWYiLCAoUHlDRnVuY3Rpb24pSWNuX1VwZGF0ZUljb25SZWYsIDEsCi0JIFB5RG9jX1NUUigiKEljb25SZWYgdGhlSWNvblJlZikgLT4gTm9uZSIpfSwKLQl7Ik92ZXJyaWRlSWNvblJlZkZyb21SZXNvdXJjZSIsIChQeUNGdW5jdGlvbilJY25fT3ZlcnJpZGVJY29uUmVmRnJvbVJlc291cmNlLCAxLAotCSBQeURvY19TVFIoIihJY29uUmVmIHRoZUljb25SZWYsIEZTU3BlYyByZXNvdXJjZUZpbGUsIFNJbnQxNiByZXNvdXJjZUlEKSAtPiBOb25lIil9LAotCXsiT3ZlcnJpZGVJY29uUmVmIiwgKFB5Q0Z1bmN0aW9uKUljbl9PdmVycmlkZUljb25SZWYsIDEsCi0JIFB5RG9jX1NUUigiKEljb25SZWYgb2xkSWNvblJlZiwgSWNvblJlZiBuZXdJY29uUmVmKSAtPiBOb25lIil9LAotCXsiUmVtb3ZlSWNvblJlZk92ZXJyaWRlIiwgKFB5Q0Z1bmN0aW9uKUljbl9SZW1vdmVJY29uUmVmT3ZlcnJpZGUsIDEsCi0JIFB5RG9jX1NUUigiKEljb25SZWYgdGhlSWNvblJlZikgLT4gTm9uZSIpfSwKLQl7IkNvbXBvc2l0ZUljb25SZWYiLCAoUHlDRnVuY3Rpb24pSWNuX0NvbXBvc2l0ZUljb25SZWYsIDEsCi0JIFB5RG9jX1NUUigiKEljb25SZWYgYmFja2dyb3VuZEljb25SZWYsIEljb25SZWYgZm9yZWdyb3VuZEljb25SZWYpIC0+IChJY29uUmVmIGNvbXBvc2l0ZUljb25SZWYpIil9LAotCXsiSXNJY29uUmVmQ29tcG9zaXRlIiwgKFB5Q0Z1bmN0aW9uKUljbl9Jc0ljb25SZWZDb21wb3NpdGUsIDEsCi0JIFB5RG9jX1NUUigiKEljb25SZWYgY29tcG9zaXRlSWNvblJlZikgLT4gKEljb25SZWYgYmFja2dyb3VuZEljb25SZWYsIEljb25SZWYgZm9yZWdyb3VuZEljb25SZWYpIil9LAotCXsiSXNWYWxpZEljb25SZWYiLCAoUHlDRnVuY3Rpb24pSWNuX0lzVmFsaWRJY29uUmVmLCAxLAotCSBQeURvY19TVFIoIihJY29uUmVmIHRoZUljb25SZWYpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJQbG90SWNvblJlZiIsIChQeUNGdW5jdGlvbilJY25fUGxvdEljb25SZWYsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgdGhlUmVjdCwgSWNvbkFsaWdubWVudFR5cGUgYWxpZ24sIEljb25UcmFuc2Zvcm1UeXBlIHRyYW5zZm9ybSwgSWNvblNlcnZpY2VzVXNhZ2VGbGFncyB0aGVJY29uU2VydmljZXNVc2FnZUZsYWdzLCBJY29uUmVmIHRoZUljb25SZWYpIC0+IE5vbmUiKX0sCi0JeyJQdEluSWNvblJlZiIsIChQeUNGdW5jdGlvbilJY25fUHRJbkljb25SZWYsIDEsCi0JIFB5RG9jX1NUUigiKFBvaW50IHRlc3RQdCwgUmVjdCBpY29uUmVjdCwgSWNvbkFsaWdubWVudFR5cGUgYWxpZ24sIEljb25TZXJ2aWNlc1VzYWdlRmxhZ3MgdGhlSWNvblNlcnZpY2VzVXNhZ2VGbGFncywgSWNvblJlZiB0aGVJY29uUmVmKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiUmVjdEluSWNvblJlZiIsIChQeUNGdW5jdGlvbilJY25fUmVjdEluSWNvblJlZiwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCB0ZXN0UmVjdCwgUmVjdCBpY29uUmVjdCwgSWNvbkFsaWdubWVudFR5cGUgYWxpZ24sIEljb25TZXJ2aWNlc1VzYWdlRmxhZ3MgaWNvblNlcnZpY2VzVXNhZ2VGbGFncywgSWNvblJlZiB0aGVJY29uUmVmKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiSWNvblJlZlRvUmduIiwgKFB5Q0Z1bmN0aW9uKUljbl9JY29uUmVmVG9SZ24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSB0aGVSZ24sIFJlY3QgaWNvblJlY3QsIEljb25BbGlnbm1lbnRUeXBlIGFsaWduLCBJY29uU2VydmljZXNVc2FnZUZsYWdzIGljb25TZXJ2aWNlc1VzYWdlRmxhZ3MsIEljb25SZWYgdGhlSWNvblJlZikgLT4gTm9uZSIpfSwKLQl7IkdldEljb25TaXplc0Zyb21JY29uUmVmIiwgKFB5Q0Z1bmN0aW9uKUljbl9HZXRJY29uU2l6ZXNGcm9tSWNvblJlZiwgMSwKLQkgUHlEb2NfU1RSKCIoSWNvblNlbGVjdG9yVmFsdWUgaWNvblNlbGVjdG9ySW5wdXQsIEljb25TZXJ2aWNlc1VzYWdlRmxhZ3MgaWNvblNlcnZpY2VzVXNhZ2VGbGFncywgSWNvblJlZiB0aGVJY29uUmVmKSAtPiAoSWNvblNlbGVjdG9yVmFsdWUgaWNvblNlbGVjdG9yT3V0cHV0UHRyKSIpfSwKLQl7IkZsdXNoSWNvblJlZnMiLCAoUHlDRnVuY3Rpb24pSWNuX0ZsdXNoSWNvblJlZnMsIDEsCi0JIFB5RG9jX1NUUigiKE9TVHlwZSBjcmVhdG9yLCBPU1R5cGUgaWNvblR5cGUpIC0+IE5vbmUiKX0sCi0JeyJGbHVzaEljb25SZWZzQnlWb2x1bWUiLCAoUHlDRnVuY3Rpb24pSWNuX0ZsdXNoSWNvblJlZnNCeVZvbHVtZSwgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IHZSZWZOdW0pIC0+IE5vbmUiKX0sCi0JeyJTZXRDdXN0b21JY29uc0VuYWJsZWQiLCAoUHlDRnVuY3Rpb24pSWNuX1NldEN1c3RvbUljb25zRW5hYmxlZCwgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IHZSZWZOdW0sIEJvb2xlYW4gZW5hYmxlQ3VzdG9tSWNvbnMpIC0+IE5vbmUiKX0sCi0JeyJHZXRDdXN0b21JY29uc0VuYWJsZWQiLCAoUHlDRnVuY3Rpb24pSWNuX0dldEN1c3RvbUljb25zRW5hYmxlZCwgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IHZSZWZOdW0pIC0+IChCb29sZWFuIGN1c3RvbUljb25zRW5hYmxlZCkiKX0sCi0JeyJJc0ljb25SZWZNYXNrRW1wdHkiLCAoUHlDRnVuY3Rpb24pSWNuX0lzSWNvblJlZk1hc2tFbXB0eSwgMSwKLQkgUHlEb2NfU1RSKCIoSWNvblJlZiBpY29uUmVmKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiR2V0SWNvblJlZlZhcmlhbnQiLCAoUHlDRnVuY3Rpb24pSWNuX0dldEljb25SZWZWYXJpYW50LCAxLAotCSBQeURvY19TVFIoIihJY29uUmVmIGluSWNvblJlZiwgT1NUeXBlIGluVmFyaWFudCkgLT4gKEljb25SZWYgX3J2LCBJY29uVHJhbnNmb3JtVHlwZSBvdXRUcmFuc2Zvcm0pIil9LAotCXsiUmVnaXN0ZXJJY29uUmVmRnJvbUljb25GaWxlIiwgKFB5Q0Z1bmN0aW9uKUljbl9SZWdpc3Rlckljb25SZWZGcm9tSWNvbkZpbGUsIDEsCi0JIFB5RG9jX1NUUigiKE9TVHlwZSBjcmVhdG9yLCBPU1R5cGUgaWNvblR5cGUsIEZTU3BlYyBpY29uRmlsZSkgLT4gKEljb25SZWYgdGhlSWNvblJlZikiKX0sCi0JeyJSZWFkSWNvbkZpbGUiLCAoUHlDRnVuY3Rpb24pSWNuX1JlYWRJY29uRmlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoRlNTcGVjIGljb25GaWxlKSAtPiAoSWNvbkZhbWlseUhhbmRsZSBpY29uRmFtaWx5KSIpfSwKLQl7IlJlYWRJY29uRnJvbUZTUmVmIiwgKFB5Q0Z1bmN0aW9uKUljbl9SZWFkSWNvbkZyb21GU1JlZiwgMSwKLQkgUHlEb2NfU1RSKCIoRlNSZWYgcmVmKSAtPiAoSWNvbkZhbWlseUhhbmRsZSBpY29uRmFtaWx5KSIpfSwKLQl7IldyaXRlSWNvbkZpbGUiLCAoUHlDRnVuY3Rpb24pSWNuX1dyaXRlSWNvbkZpbGUsIDEsCi0JIFB5RG9jX1NUUigiKEljb25GYW1pbHlIYW5kbGUgaWNvbkZhbWlseSwgRlNTcGVjIGljb25GaWxlKSAtPiBOb25lIil9LAorICAgIHsiR2V0Q0ljb24iLCAoUHlDRnVuY3Rpb24pSWNuX0dldENJY29uLCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgaWNvbklEKSAtPiAoQ0ljb25IYW5kbGUgX3J2KSIpfSwKKyAgICB7IlBsb3RDSWNvbiIsIChQeUNGdW5jdGlvbilJY25fUGxvdENJY29uLCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IHRoZVJlY3QsIENJY29uSGFuZGxlIHRoZUljb24pIC0+IE5vbmUiKX0sCisgICAgeyJEaXNwb3NlQ0ljb24iLCAoUHlDRnVuY3Rpb24pSWNuX0Rpc3Bvc2VDSWNvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ljb25IYW5kbGUgdGhlSWNvbikgLT4gTm9uZSIpfSwKKyAgICB7IkdldEljb24iLCAoUHlDRnVuY3Rpb24pSWNuX0dldEljb24sIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiBpY29uSUQpIC0+IChIYW5kbGUgX3J2KSIpfSwKKyAgICB7IlBsb3RJY29uIiwgKFB5Q0Z1bmN0aW9uKUljbl9QbG90SWNvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCB0aGVSZWN0LCBIYW5kbGUgdGhlSWNvbikgLT4gTm9uZSIpfSwKKyAgICB7IlBsb3RJY29uSUQiLCAoUHlDRnVuY3Rpb24pSWNuX1Bsb3RJY29uSUQsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgdGhlUmVjdCwgSWNvbkFsaWdubWVudFR5cGUgYWxpZ24sIEljb25UcmFuc2Zvcm1UeXBlIHRyYW5zZm9ybSwgU0ludDE2IHRoZVJlc0lEKSAtPiBOb25lIil9LAorICAgIHsiTmV3SWNvblN1aXRlIiwgKFB5Q0Z1bmN0aW9uKUljbl9OZXdJY29uU3VpdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEljb25TdWl0ZVJlZiB0aGVJY29uU3VpdGUpIil9LAorICAgIHsiQWRkSWNvblRvU3VpdGUiLCAoUHlDRnVuY3Rpb24pSWNuX0FkZEljb25Ub1N1aXRlLCAxLAorICAgICBQeURvY19TVFIoIihIYW5kbGUgdGhlSWNvbkRhdGEsIEljb25TdWl0ZVJlZiB0aGVTdWl0ZSwgUmVzVHlwZSB0aGVUeXBlKSAtPiBOb25lIil9LAorICAgIHsiR2V0SWNvbkZyb21TdWl0ZSIsIChQeUNGdW5jdGlvbilJY25fR2V0SWNvbkZyb21TdWl0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSWNvblN1aXRlUmVmIHRoZVN1aXRlLCBSZXNUeXBlIHRoZVR5cGUpIC0+IChIYW5kbGUgdGhlSWNvbkRhdGEpIil9LAorICAgIHsiR2V0SWNvblN1aXRlIiwgKFB5Q0Z1bmN0aW9uKUljbl9HZXRJY29uU3VpdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiB0aGVSZXNJRCwgSWNvblNlbGVjdG9yVmFsdWUgc2VsZWN0b3IpIC0+IChJY29uU3VpdGVSZWYgdGhlSWNvblN1aXRlKSIpfSwKKyAgICB7IkRpc3Bvc2VJY29uU3VpdGUiLCAoUHlDRnVuY3Rpb24pSWNuX0Rpc3Bvc2VJY29uU3VpdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEljb25TdWl0ZVJlZiB0aGVJY29uU3VpdGUsIEJvb2xlYW4gZGlzcG9zZURhdGEpIC0+IE5vbmUiKX0sCisgICAgeyJQbG90SWNvblN1aXRlIiwgKFB5Q0Z1bmN0aW9uKUljbl9QbG90SWNvblN1aXRlLCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IHRoZVJlY3QsIEljb25BbGlnbm1lbnRUeXBlIGFsaWduLCBJY29uVHJhbnNmb3JtVHlwZSB0cmFuc2Zvcm0sIEljb25TdWl0ZVJlZiB0aGVJY29uU3VpdGUpIC0+IE5vbmUiKX0sCisgICAgeyJMb2FkSWNvbkNhY2hlIiwgKFB5Q0Z1bmN0aW9uKUljbl9Mb2FkSWNvbkNhY2hlLCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IHRoZVJlY3QsIEljb25BbGlnbm1lbnRUeXBlIGFsaWduLCBJY29uVHJhbnNmb3JtVHlwZSB0cmFuc2Zvcm0sIEljb25DYWNoZVJlZiB0aGVJY29uQ2FjaGUpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRMYWJlbCIsIChQeUNGdW5jdGlvbilJY25fR2V0TGFiZWwsIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiBsYWJlbE51bWJlciwgU3RyMjU1IGxhYmVsU3RyaW5nKSAtPiAoUkdCQ29sb3IgbGFiZWxDb2xvcikiKX0sCisgICAgeyJQdEluSWNvbklEIiwgKFB5Q0Z1bmN0aW9uKUljbl9QdEluSWNvbklELCAxLAorICAgICBQeURvY19TVFIoIihQb2ludCB0ZXN0UHQsIFJlY3QgaWNvblJlY3QsIEljb25BbGlnbm1lbnRUeXBlIGFsaWduLCBTSW50MTYgaWNvbklEKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiUHRJbkljb25TdWl0ZSIsIChQeUNGdW5jdGlvbilJY25fUHRJbkljb25TdWl0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgdGVzdFB0LCBSZWN0IGljb25SZWN0LCBJY29uQWxpZ25tZW50VHlwZSBhbGlnbiwgSWNvblN1aXRlUmVmIHRoZUljb25TdWl0ZSkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IlJlY3RJbkljb25JRCIsIChQeUNGdW5jdGlvbilJY25fUmVjdEluSWNvbklELCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IHRlc3RSZWN0LCBSZWN0IGljb25SZWN0LCBJY29uQWxpZ25tZW50VHlwZSBhbGlnbiwgU0ludDE2IGljb25JRCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IlJlY3RJbkljb25TdWl0ZSIsIChQeUNGdW5jdGlvbilJY25fUmVjdEluSWNvblN1aXRlLCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IHRlc3RSZWN0LCBSZWN0IGljb25SZWN0LCBJY29uQWxpZ25tZW50VHlwZSBhbGlnbiwgSWNvblN1aXRlUmVmIHRoZUljb25TdWl0ZSkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7Ikljb25JRFRvUmduIiwgKFB5Q0Z1bmN0aW9uKUljbl9JY29uSURUb1JnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHRoZVJnbiwgUmVjdCBpY29uUmVjdCwgSWNvbkFsaWdubWVudFR5cGUgYWxpZ24sIFNJbnQxNiBpY29uSUQpIC0+IE5vbmUiKX0sCisgICAgeyJJY29uU3VpdGVUb1JnbiIsIChQeUNGdW5jdGlvbilJY25fSWNvblN1aXRlVG9SZ24sIDEsCisgICAgIFB5RG9jX1NUUigiKFJnbkhhbmRsZSB0aGVSZ24sIFJlY3QgaWNvblJlY3QsIEljb25BbGlnbm1lbnRUeXBlIGFsaWduLCBJY29uU3VpdGVSZWYgdGhlSWNvblN1aXRlKSAtPiBOb25lIil9LAorICAgIHsiU2V0U3VpdGVMYWJlbCIsIChQeUNGdW5jdGlvbilJY25fU2V0U3VpdGVMYWJlbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSWNvblN1aXRlUmVmIHRoZVN1aXRlLCBTSW50MTYgdGhlTGFiZWwpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRTdWl0ZUxhYmVsIiwgKFB5Q0Z1bmN0aW9uKUljbl9HZXRTdWl0ZUxhYmVsLCAxLAorICAgICBQeURvY19TVFIoIihJY29uU3VpdGVSZWYgdGhlU3VpdGUpIC0+IChTSW50MTYgX3J2KSIpfSwKKyAgICB7IlBsb3RJY29uSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKUljbl9QbG90SWNvbkhhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCB0aGVSZWN0LCBJY29uQWxpZ25tZW50VHlwZSBhbGlnbiwgSWNvblRyYW5zZm9ybVR5cGUgdHJhbnNmb3JtLCBIYW5kbGUgdGhlSWNvbikgLT4gTm9uZSIpfSwKKyAgICB7IlBsb3RTSUNOSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKUljbl9QbG90U0lDTkhhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCB0aGVSZWN0LCBJY29uQWxpZ25tZW50VHlwZSBhbGlnbiwgSWNvblRyYW5zZm9ybVR5cGUgdHJhbnNmb3JtLCBIYW5kbGUgdGhlU0lDTikgLT4gTm9uZSIpfSwKKyAgICB7IlBsb3RDSWNvbkhhbmRsZSIsIChQeUNGdW5jdGlvbilJY25fUGxvdENJY29uSGFuZGxlLCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IHRoZVJlY3QsIEljb25BbGlnbm1lbnRUeXBlIGFsaWduLCBJY29uVHJhbnNmb3JtVHlwZSB0cmFuc2Zvcm0sIENJY29uSGFuZGxlIHRoZUNJY29uKSAtPiBOb25lIil9LAorICAgIHsiSWNvblJlZlRvSWNvbkZhbWlseSIsIChQeUNGdW5jdGlvbilJY25fSWNvblJlZlRvSWNvbkZhbWlseSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSWNvblJlZiB0aGVJY29uUmVmLCBJY29uU2VsZWN0b3JWYWx1ZSB3aGljaEljb25zKSAtPiAoSWNvbkZhbWlseUhhbmRsZSBpY29uRmFtaWx5KSIpfSwKKyAgICB7Ikljb25GYW1pbHlUb0ljb25TdWl0ZSIsIChQeUNGdW5jdGlvbilJY25fSWNvbkZhbWlseVRvSWNvblN1aXRlLCAxLAorICAgICBQeURvY19TVFIoIihJY29uRmFtaWx5SGFuZGxlIGljb25GYW1pbHksIEljb25TZWxlY3RvclZhbHVlIHdoaWNoSWNvbnMpIC0+IChJY29uU3VpdGVSZWYgaWNvblN1aXRlKSIpfSwKKyAgICB7Ikljb25TdWl0ZVRvSWNvbkZhbWlseSIsIChQeUNGdW5jdGlvbilJY25fSWNvblN1aXRlVG9JY29uRmFtaWx5LCAxLAorICAgICBQeURvY19TVFIoIihJY29uU3VpdGVSZWYgaWNvblN1aXRlLCBJY29uU2VsZWN0b3JWYWx1ZSB3aGljaEljb25zKSAtPiAoSWNvbkZhbWlseUhhbmRsZSBpY29uRmFtaWx5KSIpfSwKKyAgICB7IlNldEljb25GYW1pbHlEYXRhIiwgKFB5Q0Z1bmN0aW9uKUljbl9TZXRJY29uRmFtaWx5RGF0YSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSWNvbkZhbWlseUhhbmRsZSBpY29uRmFtaWx5LCBPU1R5cGUgaWNvblR5cGUsIEhhbmRsZSBoKSAtPiBOb25lIil9LAorICAgIHsiR2V0SWNvbkZhbWlseURhdGEiLCAoUHlDRnVuY3Rpb24pSWNuX0dldEljb25GYW1pbHlEYXRhLCAxLAorICAgICBQeURvY19TVFIoIihJY29uRmFtaWx5SGFuZGxlIGljb25GYW1pbHksIE9TVHlwZSBpY29uVHlwZSwgSGFuZGxlIGgpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRJY29uUmVmT3duZXJzIiwgKFB5Q0Z1bmN0aW9uKUljbl9HZXRJY29uUmVmT3duZXJzLCAxLAorICAgICBQeURvY19TVFIoIihJY29uUmVmIHRoZUljb25SZWYpIC0+IChVSW50MTYgb3duZXJzKSIpfSwKKyAgICB7IkFjcXVpcmVJY29uUmVmIiwgKFB5Q0Z1bmN0aW9uKUljbl9BY3F1aXJlSWNvblJlZiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSWNvblJlZiB0aGVJY29uUmVmKSAtPiBOb25lIil9LAorICAgIHsiUmVsZWFzZUljb25SZWYiLCAoUHlDRnVuY3Rpb24pSWNuX1JlbGVhc2VJY29uUmVmLCAxLAorICAgICBQeURvY19TVFIoIihJY29uUmVmIHRoZUljb25SZWYpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRJY29uUmVmRnJvbUZpbGUiLCAoUHlDRnVuY3Rpb24pSWNuX0dldEljb25SZWZGcm9tRmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRlNTcGVjIHRoZUZpbGUpIC0+IChJY29uUmVmIHRoZUljb25SZWYsIFNJbnQxNiB0aGVMYWJlbCkiKX0sCisgICAgeyJHZXRJY29uUmVmIiwgKFB5Q0Z1bmN0aW9uKUljbl9HZXRJY29uUmVmLCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgdlJlZk51bSwgT1NUeXBlIGNyZWF0b3IsIE9TVHlwZSBpY29uVHlwZSkgLT4gKEljb25SZWYgdGhlSWNvblJlZikiKX0sCisgICAgeyJHZXRJY29uUmVmRnJvbUZvbGRlciIsIChQeUNGdW5jdGlvbilJY25fR2V0SWNvblJlZkZyb21Gb2xkZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiB2UmVmTnVtLCBTSW50MzIgcGFyZW50Rm9sZGVySUQsIFNJbnQzMiBmb2xkZXJJRCwgU0ludDggYXR0cmlidXRlcywgU0ludDggYWNjZXNzUHJpdmlsZWdlcykgLT4gKEljb25SZWYgdGhlSWNvblJlZikiKX0sCisgICAgeyJSZWdpc3Rlckljb25SZWZGcm9tSWNvbkZhbWlseSIsIChQeUNGdW5jdGlvbilJY25fUmVnaXN0ZXJJY29uUmVmRnJvbUljb25GYW1pbHksIDEsCisgICAgIFB5RG9jX1NUUigiKE9TVHlwZSBjcmVhdG9yLCBPU1R5cGUgaWNvblR5cGUsIEljb25GYW1pbHlIYW5kbGUgaWNvbkZhbWlseSkgLT4gKEljb25SZWYgdGhlSWNvblJlZikiKX0sCisgICAgeyJSZWdpc3Rlckljb25SZWZGcm9tUmVzb3VyY2UiLCAoUHlDRnVuY3Rpb24pSWNuX1JlZ2lzdGVySWNvblJlZkZyb21SZXNvdXJjZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoT1NUeXBlIGNyZWF0b3IsIE9TVHlwZSBpY29uVHlwZSwgRlNTcGVjIHJlc291cmNlRmlsZSwgU0ludDE2IHJlc291cmNlSUQpIC0+IChJY29uUmVmIHRoZUljb25SZWYpIil9LAorICAgIHsiUmVnaXN0ZXJJY29uUmVmRnJvbUZTUmVmIiwgKFB5Q0Z1bmN0aW9uKUljbl9SZWdpc3Rlckljb25SZWZGcm9tRlNSZWYsIDEsCisgICAgIFB5RG9jX1NUUigiKE9TVHlwZSBjcmVhdG9yLCBPU1R5cGUgaWNvblR5cGUsIEZTUmVmIGljb25GaWxlKSAtPiAoSWNvblJlZiB0aGVJY29uUmVmKSIpfSwKKyAgICB7IlVucmVnaXN0ZXJJY29uUmVmIiwgKFB5Q0Z1bmN0aW9uKUljbl9VbnJlZ2lzdGVySWNvblJlZiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoT1NUeXBlIGNyZWF0b3IsIE9TVHlwZSBpY29uVHlwZSkgLT4gTm9uZSIpfSwKKyAgICB7IlVwZGF0ZUljb25SZWYiLCAoUHlDRnVuY3Rpb24pSWNuX1VwZGF0ZUljb25SZWYsIDEsCisgICAgIFB5RG9jX1NUUigiKEljb25SZWYgdGhlSWNvblJlZikgLT4gTm9uZSIpfSwKKyAgICB7Ik92ZXJyaWRlSWNvblJlZkZyb21SZXNvdXJjZSIsIChQeUNGdW5jdGlvbilJY25fT3ZlcnJpZGVJY29uUmVmRnJvbVJlc291cmNlLCAxLAorICAgICBQeURvY19TVFIoIihJY29uUmVmIHRoZUljb25SZWYsIEZTU3BlYyByZXNvdXJjZUZpbGUsIFNJbnQxNiByZXNvdXJjZUlEKSAtPiBOb25lIil9LAorICAgIHsiT3ZlcnJpZGVJY29uUmVmIiwgKFB5Q0Z1bmN0aW9uKUljbl9PdmVycmlkZUljb25SZWYsIDEsCisgICAgIFB5RG9jX1NUUigiKEljb25SZWYgb2xkSWNvblJlZiwgSWNvblJlZiBuZXdJY29uUmVmKSAtPiBOb25lIil9LAorICAgIHsiUmVtb3ZlSWNvblJlZk92ZXJyaWRlIiwgKFB5Q0Z1bmN0aW9uKUljbl9SZW1vdmVJY29uUmVmT3ZlcnJpZGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEljb25SZWYgdGhlSWNvblJlZikgLT4gTm9uZSIpfSwKKyAgICB7IkNvbXBvc2l0ZUljb25SZWYiLCAoUHlDRnVuY3Rpb24pSWNuX0NvbXBvc2l0ZUljb25SZWYsIDEsCisgICAgIFB5RG9jX1NUUigiKEljb25SZWYgYmFja2dyb3VuZEljb25SZWYsIEljb25SZWYgZm9yZWdyb3VuZEljb25SZWYpIC0+IChJY29uUmVmIGNvbXBvc2l0ZUljb25SZWYpIil9LAorICAgIHsiSXNJY29uUmVmQ29tcG9zaXRlIiwgKFB5Q0Z1bmN0aW9uKUljbl9Jc0ljb25SZWZDb21wb3NpdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEljb25SZWYgY29tcG9zaXRlSWNvblJlZikgLT4gKEljb25SZWYgYmFja2dyb3VuZEljb25SZWYsIEljb25SZWYgZm9yZWdyb3VuZEljb25SZWYpIil9LAorICAgIHsiSXNWYWxpZEljb25SZWYiLCAoUHlDRnVuY3Rpb24pSWNuX0lzVmFsaWRJY29uUmVmLCAxLAorICAgICBQeURvY19TVFIoIihJY29uUmVmIHRoZUljb25SZWYpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJQbG90SWNvblJlZiIsIChQeUNGdW5jdGlvbilJY25fUGxvdEljb25SZWYsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgdGhlUmVjdCwgSWNvbkFsaWdubWVudFR5cGUgYWxpZ24sIEljb25UcmFuc2Zvcm1UeXBlIHRyYW5zZm9ybSwgSWNvblNlcnZpY2VzVXNhZ2VGbGFncyB0aGVJY29uU2VydmljZXNVc2FnZUZsYWdzLCBJY29uUmVmIHRoZUljb25SZWYpIC0+IE5vbmUiKX0sCisgICAgeyJQdEluSWNvblJlZiIsIChQeUNGdW5jdGlvbilJY25fUHRJbkljb25SZWYsIDEsCisgICAgIFB5RG9jX1NUUigiKFBvaW50IHRlc3RQdCwgUmVjdCBpY29uUmVjdCwgSWNvbkFsaWdubWVudFR5cGUgYWxpZ24sIEljb25TZXJ2aWNlc1VzYWdlRmxhZ3MgdGhlSWNvblNlcnZpY2VzVXNhZ2VGbGFncywgSWNvblJlZiB0aGVJY29uUmVmKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiUmVjdEluSWNvblJlZiIsIChQeUNGdW5jdGlvbilJY25fUmVjdEluSWNvblJlZiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCB0ZXN0UmVjdCwgUmVjdCBpY29uUmVjdCwgSWNvbkFsaWdubWVudFR5cGUgYWxpZ24sIEljb25TZXJ2aWNlc1VzYWdlRmxhZ3MgaWNvblNlcnZpY2VzVXNhZ2VGbGFncywgSWNvblJlZiB0aGVJY29uUmVmKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiSWNvblJlZlRvUmduIiwgKFB5Q0Z1bmN0aW9uKUljbl9JY29uUmVmVG9SZ24sIDEsCisgICAgIFB5RG9jX1NUUigiKFJnbkhhbmRsZSB0aGVSZ24sIFJlY3QgaWNvblJlY3QsIEljb25BbGlnbm1lbnRUeXBlIGFsaWduLCBJY29uU2VydmljZXNVc2FnZUZsYWdzIGljb25TZXJ2aWNlc1VzYWdlRmxhZ3MsIEljb25SZWYgdGhlSWNvblJlZikgLT4gTm9uZSIpfSwKKyAgICB7IkdldEljb25TaXplc0Zyb21JY29uUmVmIiwgKFB5Q0Z1bmN0aW9uKUljbl9HZXRJY29uU2l6ZXNGcm9tSWNvblJlZiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSWNvblNlbGVjdG9yVmFsdWUgaWNvblNlbGVjdG9ySW5wdXQsIEljb25TZXJ2aWNlc1VzYWdlRmxhZ3MgaWNvblNlcnZpY2VzVXNhZ2VGbGFncywgSWNvblJlZiB0aGVJY29uUmVmKSAtPiAoSWNvblNlbGVjdG9yVmFsdWUgaWNvblNlbGVjdG9yT3V0cHV0UHRyKSIpfSwKKyAgICB7IkZsdXNoSWNvblJlZnMiLCAoUHlDRnVuY3Rpb24pSWNuX0ZsdXNoSWNvblJlZnMsIDEsCisgICAgIFB5RG9jX1NUUigiKE9TVHlwZSBjcmVhdG9yLCBPU1R5cGUgaWNvblR5cGUpIC0+IE5vbmUiKX0sCisgICAgeyJGbHVzaEljb25SZWZzQnlWb2x1bWUiLCAoUHlDRnVuY3Rpb24pSWNuX0ZsdXNoSWNvblJlZnNCeVZvbHVtZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IHZSZWZOdW0pIC0+IE5vbmUiKX0sCisgICAgeyJTZXRDdXN0b21JY29uc0VuYWJsZWQiLCAoUHlDRnVuY3Rpb24pSWNuX1NldEN1c3RvbUljb25zRW5hYmxlZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IHZSZWZOdW0sIEJvb2xlYW4gZW5hYmxlQ3VzdG9tSWNvbnMpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRDdXN0b21JY29uc0VuYWJsZWQiLCAoUHlDRnVuY3Rpb24pSWNuX0dldEN1c3RvbUljb25zRW5hYmxlZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IHZSZWZOdW0pIC0+IChCb29sZWFuIGN1c3RvbUljb25zRW5hYmxlZCkiKX0sCisgICAgeyJJc0ljb25SZWZNYXNrRW1wdHkiLCAoUHlDRnVuY3Rpb24pSWNuX0lzSWNvblJlZk1hc2tFbXB0eSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSWNvblJlZiBpY29uUmVmKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiR2V0SWNvblJlZlZhcmlhbnQiLCAoUHlDRnVuY3Rpb24pSWNuX0dldEljb25SZWZWYXJpYW50LCAxLAorICAgICBQeURvY19TVFIoIihJY29uUmVmIGluSWNvblJlZiwgT1NUeXBlIGluVmFyaWFudCkgLT4gKEljb25SZWYgX3J2LCBJY29uVHJhbnNmb3JtVHlwZSBvdXRUcmFuc2Zvcm0pIil9LAorICAgIHsiUmVnaXN0ZXJJY29uUmVmRnJvbUljb25GaWxlIiwgKFB5Q0Z1bmN0aW9uKUljbl9SZWdpc3Rlckljb25SZWZGcm9tSWNvbkZpbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKE9TVHlwZSBjcmVhdG9yLCBPU1R5cGUgaWNvblR5cGUsIEZTU3BlYyBpY29uRmlsZSkgLT4gKEljb25SZWYgdGhlSWNvblJlZikiKX0sCisgICAgeyJSZWFkSWNvbkZpbGUiLCAoUHlDRnVuY3Rpb24pSWNuX1JlYWRJY29uRmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRlNTcGVjIGljb25GaWxlKSAtPiAoSWNvbkZhbWlseUhhbmRsZSBpY29uRmFtaWx5KSIpfSwKKyAgICB7IlJlYWRJY29uRnJvbUZTUmVmIiwgKFB5Q0Z1bmN0aW9uKUljbl9SZWFkSWNvbkZyb21GU1JlZiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRlNSZWYgcmVmKSAtPiAoSWNvbkZhbWlseUhhbmRsZSBpY29uRmFtaWx5KSIpfSwKKyAgICB7IldyaXRlSWNvbkZpbGUiLCAoUHlDRnVuY3Rpb24pSWNuX1dyaXRlSWNvbkZpbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEljb25GYW1pbHlIYW5kbGUgaWNvbkZhbWlseSwgRlNTcGVjIGljb25GaWxlKSAtPiBOb25lIil9LAogI2VuZGlmIC8qIF9fTFA2NF9fICovCi0Je05VTEwsIE5VTEwsIDB9CisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAKQEAgLTE1ODUsMjEgKzE1ODUsMjEgQEAKIAogdm9pZCBpbml0X0ljbih2b2lkKQogewotCVB5T2JqZWN0ICptOworICAgIFB5T2JqZWN0ICptOwogI2lmbmRlZiBfX0xQNjRfXwotCVB5T2JqZWN0ICpkOworICAgIFB5T2JqZWN0ICpkOwogI2VuZGlmIC8qIF9fTFA2NF9fICovCiAKIAogCiAKLQltID0gUHlfSW5pdE1vZHVsZSgiX0ljbiIsIEljbl9tZXRob2RzKTsKKyAgICBtID0gUHlfSW5pdE1vZHVsZSgiX0ljbiIsIEljbl9tZXRob2RzKTsKICNpZm5kZWYgX19MUDY0X18KLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQlJY25fRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOwotCWlmIChJY25fRXJyb3IgPT0gTlVMTCB8fAotCSAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRXJyb3IiLCBJY25fRXJyb3IpICE9IDApCi0JCXJldHVybjsKKyAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICBJY25fRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOworICAgIGlmIChJY25fRXJyb3IgPT0gTlVMTCB8fAorICAgICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRXJyb3IiLCBJY25fRXJyb3IpICE9IDApCisgICAgICAgIHJldHVybjsKICNlbmRpZiAvKiBfX0xQNjRfXyAqLwogfQogCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9sYXVuY2gvX0xhdW5jaG1vZHVsZS5jIGIvTWFjL01vZHVsZXMvbGF1bmNoL19MYXVuY2htb2R1bGUuYwppbmRleCBmYTIxZWNlLi44ODkxMmIyIDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9sYXVuY2gvX0xhdW5jaG1vZHVsZS5jCisrKyBiL01hYy9Nb2R1bGVzL2xhdW5jaC9fTGF1bmNobW9kdWxlLmMKQEAgLTksOSArOSw5IEBACiAKIC8qIE1hY3JvIHRvIHRlc3Qgd2hldGhlciBhIHdlYWstbG9hZGVkIENGTSBmdW5jdGlvbiBleGlzdHMgKi8KICNkZWZpbmUgUHlNYWNfUFJFQ0hFQ0socnRuKSBkbyB7IGlmICggJnJ0biA9PSBOVUxMICkgIHtcCi0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yLCBcCi0gICAgICAgICJOb3QgYXZhaWxhYmxlIGluIHRoaXMgc2hhcmVkIGxpYnJhcnkvT1MgdmVyc2lvbiIpOyBcCi0gICAgICAgIHJldHVybiBOVUxMOyBcCisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsIFwKKyAgICAiTm90IGF2YWlsYWJsZSBpbiB0aGlzIHNoYXJlZCBsaWJyYXJ5L09TIHZlcnNpb24iKTsgXAorICAgIHJldHVybiBOVUxMOyBcCiAgICAgfX0gd2hpbGUoMCkKIAogCkBAIC0yNywyMSArMjcsMjEgQEAKIHN0YXRpYyBpbnQKIE9wdENGU3RyaW5nUmVmT2JqX0NvbnZlcnQoUHlPYmplY3QgKnYsIENGU3RyaW5nUmVmICpzcGVjKQogewotICAgICAgICBpZiAodiA9PSBQeV9Ob25lKSB7Ci0gICAgICAgICAgICAgICAgKnNwZWMgPSBOVUxMOwotICAgICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBDRlN0cmluZ1JlZk9ial9Db252ZXJ0KHYsIHNwZWMpOworICAgIGlmICh2ID09IFB5X05vbmUpIHsKKyAgICAgICAgKnNwZWMgPSBOVUxMOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgcmV0dXJuIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQodiwgc3BlYyk7CiB9CiAKIFB5T2JqZWN0ICoKIE9wdENGU3RyaW5nUmVmT2JqX05ldyhDRlN0cmluZ1JlZiBpdCkKIHsKLSAgICAgICAgaWYgKGl0ID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFB5X05vbmU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIENGU3RyaW5nUmVmT2JqX05ldyhpdCk7CisgICAgaWYgKGl0ID09IE5VTEwpIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICB9CisgICAgcmV0dXJuIENGU3RyaW5nUmVmT2JqX05ldyhpdCk7CiB9CiAKIC8qCkBAIC01MSwxOSArNTEsMTkgQEAKIExTSXRlbUluZm9SZWNvcmRfTmV3KExTSXRlbUluZm9SZWNvcmQgKml0KQogewogI2lmbmRlZiBfX0xQNjRfXwotICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgie3M6aXM6TyZzOk8mczpPJnM6TyZzOml9IiwKLSAgICAgICAgICAgICAgICAiZmxhZ3MiLCBpdC0+ZmxhZ3MsCi0gICAgICAgICAgICAgICAgImZpbGV0eXBlIiwgUHlNYWNfQnVpbGRPU1R5cGUsIGl0LT5maWxldHlwZSwKLSAgICAgICAgICAgICAgICAiY3JlYXRvciIsIFB5TWFjX0J1aWxkT1NUeXBlLCBpdC0+Y3JlYXRvciwKLSAgICAgICAgICAgICAgICAiZXh0ZW5zaW9uIiwgT3B0Q0ZTdHJpbmdSZWZPYmpfTmV3LCBpdC0+ZXh0ZW5zaW9uLAotICAgICAgICAgICAgICAgICJpY29uRmlsZU5hbWUiLCBPcHRDRlN0cmluZ1JlZk9ial9OZXcsIGl0LT5pY29uRmlsZU5hbWUsCi0gICAgICAgICAgICAgICAgImtpbmRJRCIsIGl0LT5raW5kSUQpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJ7czppczpPJnM6TyZzOk8mczpPJnM6aX0iLAorICAgICAgICAiZmxhZ3MiLCBpdC0+ZmxhZ3MsCisgICAgICAgICJmaWxldHlwZSIsIFB5TWFjX0J1aWxkT1NUeXBlLCBpdC0+ZmlsZXR5cGUsCisgICAgICAgICJjcmVhdG9yIiwgUHlNYWNfQnVpbGRPU1R5cGUsIGl0LT5jcmVhdG9yLAorICAgICAgICAiZXh0ZW5zaW9uIiwgT3B0Q0ZTdHJpbmdSZWZPYmpfTmV3LCBpdC0+ZXh0ZW5zaW9uLAorICAgICAgICAiaWNvbkZpbGVOYW1lIiwgT3B0Q0ZTdHJpbmdSZWZPYmpfTmV3LCBpdC0+aWNvbkZpbGVOYW1lLAorICAgICAgICAia2luZElEIiwgaXQtPmtpbmRJRCk7CiAjZWxzZQotICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgie3M6aXM6TyZzOk8mczpPJn0iLAotICAgICAgICAgICAgICAgICJmbGFncyIsIGl0LT5mbGFncywKLSAgICAgICAgICAgICAgICAiZmlsZXR5cGUiLCBQeU1hY19CdWlsZE9TVHlwZSwgaXQtPmZpbGV0eXBlLAotICAgICAgICAgICAgICAgICJjcmVhdG9yIiwgUHlNYWNfQnVpbGRPU1R5cGUsIGl0LT5jcmVhdG9yLAotICAgICAgICAgICAgICAgICJleHRlbnNpb24iLCBPcHRDRlN0cmluZ1JlZk9ial9OZXcsIGl0LT5leHRlbnNpb24pOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJ7czppczpPJnM6TyZzOk8mfSIsCisgICAgICAgICJmbGFncyIsIGl0LT5mbGFncywKKyAgICAgICAgImZpbGV0eXBlIiwgUHlNYWNfQnVpbGRPU1R5cGUsIGl0LT5maWxldHlwZSwKKyAgICAgICAgImNyZWF0b3IiLCBQeU1hY19CdWlsZE9TVHlwZSwgaXQtPmNyZWF0b3IsCisgICAgICAgICJleHRlbnNpb24iLCBPcHRDRlN0cmluZ1JlZk9ial9OZXcsIGl0LT5leHRlbnNpb24pOwogI2VuZGlmCiB9CiAKQEAgLTcxLDM5MSArNzEsMzkxIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqTGF1bmNoX0xTQ29weUl0ZW1JbmZvRm9yUmVmKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUZTUmVmIGluSXRlbVJlZjsKLQlMU1JlcXVlc3RlZEluZm8gaW5XaGljaEluZm87Ci0JTFNJdGVtSW5mb1JlY29yZCBvdXRJdGVtSW5mbzsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1JlZiwgJmluSXRlbVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluV2hpY2hJbmZvKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IExTQ29weUl0ZW1JbmZvRm9yUmVmKCZpbkl0ZW1SZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluV2hpY2hJbmZvLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0SXRlbUluZm8pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBMU0l0ZW1JbmZvUmVjb3JkX05ldywgJm91dEl0ZW1JbmZvKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBGU1JlZiBpbkl0ZW1SZWY7CisgICAgTFNSZXF1ZXN0ZWRJbmZvIGluV2hpY2hJbmZvOworICAgIExTSXRlbUluZm9SZWNvcmQgb3V0SXRlbUluZm87CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNSZWYsICZpbkl0ZW1SZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbldoaWNoSW5mbykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBMU0NvcHlJdGVtSW5mb0ZvclJlZigmaW5JdGVtUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbldoaWNoSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEl0ZW1JbmZvKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgTFNJdGVtSW5mb1JlY29yZF9OZXcsICZvdXRJdGVtSW5mbyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTGF1bmNoX0xTQ29weUl0ZW1JbmZvRm9yVVJMKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUNGVVJMUmVmIGluVVJMOwotCUxTUmVxdWVzdGVkSW5mbyBpbldoaWNoSW5mbzsKLQlMU0l0ZW1JbmZvUmVjb3JkIG91dEl0ZW1JbmZvOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGVVJMUmVmT2JqX0NvbnZlcnQsICZpblVSTCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluV2hpY2hJbmZvKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IExTQ29weUl0ZW1JbmZvRm9yVVJMKGluVVJMLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbldoaWNoSW5mbywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEl0ZW1JbmZvKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgTFNJdGVtSW5mb1JlY29yZF9OZXcsICZvdXRJdGVtSW5mbyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgQ0ZVUkxSZWYgaW5VUkw7CisgICAgTFNSZXF1ZXN0ZWRJbmZvIGluV2hpY2hJbmZvOworICAgIExTSXRlbUluZm9SZWNvcmQgb3V0SXRlbUluZm87CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZVUkxSZWZPYmpfQ29udmVydCwgJmluVVJMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5XaGljaEluZm8pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gTFNDb3B5SXRlbUluZm9Gb3JVUkwoaW5VUkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluV2hpY2hJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0SXRlbUluZm8pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBMU0l0ZW1JbmZvUmVjb3JkX05ldywgJm91dEl0ZW1JbmZvKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpMYXVuY2hfTFNHZXRFeHRlbnNpb25JbmZvKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVVuaUNoYXIgKmluTmFtZUxlbl9faW5fXzsKLQlVbmlDaGFyQ291bnQgaW5OYW1lTGVuX19sZW5fXzsKLQlpbnQgaW5OYW1lTGVuX19pbl9sZW5fXzsKLQlVbmlDaGFyQ291bnQgb3V0RXh0U3RhcnRJbmRleDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJ1IyIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbk5hbWVMZW5fX2luX18sICZpbk5hbWVMZW5fX2luX2xlbl9fKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaW5OYW1lTGVuX19sZW5fXyA9IGluTmFtZUxlbl9faW5fbGVuX187Ci0JX2VyciA9IExTR2V0RXh0ZW5zaW9uSW5mbyhpbk5hbWVMZW5fX2xlbl9fLCBpbk5hbWVMZW5fX2luX18sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0RXh0U3RhcnRJbmRleCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0RXh0U3RhcnRJbmRleCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVW5pQ2hhciAqaW5OYW1lTGVuX19pbl9fOworICAgIFVuaUNoYXJDb3VudCBpbk5hbWVMZW5fX2xlbl9fOworICAgIGludCBpbk5hbWVMZW5fX2luX2xlbl9fOworICAgIFVuaUNoYXJDb3VudCBvdXRFeHRTdGFydEluZGV4OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInUjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluTmFtZUxlbl9faW5fXywgJmluTmFtZUxlbl9faW5fbGVuX18pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpbk5hbWVMZW5fX2xlbl9fID0gaW5OYW1lTGVuX19pbl9sZW5fXzsKKyAgICBfZXJyID0gTFNHZXRFeHRlbnNpb25JbmZvKGluTmFtZUxlbl9fbGVuX18sIGluTmFtZUxlbl9faW5fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRFeHRTdGFydEluZGV4KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRFeHRTdGFydEluZGV4KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpMYXVuY2hfTFNDb3B5RGlzcGxheU5hbWVGb3JSZWYoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JRlNSZWYgaW5SZWY7Ci0JQ0ZTdHJpbmdSZWYgb3V0RGlzcGxheU5hbWU7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1JlZiwgJmluUmVmKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IExTQ29weURpc3BsYXlOYW1lRm9yUmVmKCZpblJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dERpc3BsYXlOYW1lKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBvdXREaXNwbGF5TmFtZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgRlNSZWYgaW5SZWY7CisgICAgQ0ZTdHJpbmdSZWYgb3V0RGlzcGxheU5hbWU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1JlZiwgJmluUmVmKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IExTQ29weURpc3BsYXlOYW1lRm9yUmVmKCZpblJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dERpc3BsYXlOYW1lKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBvdXREaXNwbGF5TmFtZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTGF1bmNoX0xTQ29weURpc3BsYXlOYW1lRm9yVVJMKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUNGVVJMUmVmIGluVVJMOwotCUNGU3RyaW5nUmVmIG91dERpc3BsYXlOYW1lOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZVUkxSZWZPYmpfQ29udmVydCwgJmluVVJMKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IExTQ29weURpc3BsYXlOYW1lRm9yVVJMKGluVVJMLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0RGlzcGxheU5hbWUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIG91dERpc3BsYXlOYW1lKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBDRlVSTFJlZiBpblVSTDsKKyAgICBDRlN0cmluZ1JlZiBvdXREaXNwbGF5TmFtZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGVVJMUmVmT2JqX0NvbnZlcnQsICZpblVSTCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBMU0NvcHlEaXNwbGF5TmFtZUZvclVSTChpblVSTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dERpc3BsYXlOYW1lKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBvdXREaXNwbGF5TmFtZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTGF1bmNoX0xTU2V0RXh0ZW5zaW9uSGlkZGVuRm9yUmVmKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUZTUmVmIGluUmVmOwotCUJvb2xlYW4gaW5IaWRlOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTUmVmLCAmaW5SZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkhpZGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gTFNTZXRFeHRlbnNpb25IaWRkZW5Gb3JSZWYoJmluUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkhpZGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIEZTUmVmIGluUmVmOworICAgIEJvb2xlYW4gaW5IaWRlOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTUmVmLCAmaW5SZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkhpZGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gTFNTZXRFeHRlbnNpb25IaWRkZW5Gb3JSZWYoJmluUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkhpZGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkxhdW5jaF9MU1NldEV4dGVuc2lvbkhpZGRlbkZvclVSTChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlDRlVSTFJlZiBpblVSTDsKLQlCb29sZWFuIGluSGlkZTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmIiLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlVSTFJlZk9ial9Db252ZXJ0LCAmaW5VUkwsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkhpZGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gTFNTZXRFeHRlbnNpb25IaWRkZW5Gb3JVUkwoaW5VUkwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSGlkZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgQ0ZVUkxSZWYgaW5VUkw7CisgICAgQm9vbGVhbiBpbkhpZGU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZVUkxSZWZPYmpfQ29udmVydCwgJmluVVJMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5IaWRlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IExTU2V0RXh0ZW5zaW9uSGlkZGVuRm9yVVJMKGluVVJMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkhpZGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkxhdW5jaF9MU0NvcHlLaW5kU3RyaW5nRm9yUmVmKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUZTUmVmIGluRlNSZWY7Ci0JQ0ZTdHJpbmdSZWYgb3V0S2luZFN0cmluZzsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTUmVmLCAmaW5GU1JlZikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBMU0NvcHlLaW5kU3RyaW5nRm9yUmVmKCZpbkZTUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRLaW5kU3RyaW5nKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBvdXRLaW5kU3RyaW5nKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBGU1JlZiBpbkZTUmVmOworICAgIENGU3RyaW5nUmVmIG91dEtpbmRTdHJpbmc7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1JlZiwgJmluRlNSZWYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gTFNDb3B5S2luZFN0cmluZ0ZvclJlZigmaW5GU1JlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0S2luZFN0cmluZyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgb3V0S2luZFN0cmluZyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTGF1bmNoX0xTQ29weUtpbmRTdHJpbmdGb3JVUkwoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JQ0ZVUkxSZWYgaW5VUkw7Ci0JQ0ZTdHJpbmdSZWYgb3V0S2luZFN0cmluZzsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGVVJMUmVmT2JqX0NvbnZlcnQsICZpblVSTCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBMU0NvcHlLaW5kU3RyaW5nRm9yVVJMKGluVVJMLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRLaW5kU3RyaW5nKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBvdXRLaW5kU3RyaW5nKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBDRlVSTFJlZiBpblVSTDsKKyAgICBDRlN0cmluZ1JlZiBvdXRLaW5kU3RyaW5nOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZVUkxSZWZPYmpfQ29udmVydCwgJmluVVJMKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IExTQ29weUtpbmRTdHJpbmdGb3JVUkwoaW5VUkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEtpbmRTdHJpbmcpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIG91dEtpbmRTdHJpbmcpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkxhdW5jaF9MU0dldEFwcGxpY2F0aW9uRm9ySXRlbShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlGU1JlZiBpbkl0ZW1SZWY7Ci0JTFNSb2xlc01hc2sgaW5Sb2xlTWFzazsKLQlGU1JlZiBvdXRBcHBSZWY7Ci0JQ0ZVUkxSZWYgb3V0QXBwVVJMOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTUmVmLCAmaW5JdGVtUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5Sb2xlTWFzaykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBMU0dldEFwcGxpY2F0aW9uRm9ySXRlbSgmaW5JdGVtUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblJvbGVNYXNrLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0QXBwUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0QXBwVVJMKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZTUmVmLCAmb3V0QXBwUmVmLAotCSAgICAgICAgICAgICAgICAgICAgIENGVVJMUmVmT2JqX05ldywgb3V0QXBwVVJMKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBGU1JlZiBpbkl0ZW1SZWY7CisgICAgTFNSb2xlc01hc2sgaW5Sb2xlTWFzazsKKyAgICBGU1JlZiBvdXRBcHBSZWY7CisgICAgQ0ZVUkxSZWYgb3V0QXBwVVJMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTUmVmLCAmaW5JdGVtUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Sb2xlTWFzaykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBMU0dldEFwcGxpY2F0aW9uRm9ySXRlbSgmaW5JdGVtUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblJvbGVNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0QXBwUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0QXBwVVJMKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZTUmVmLCAmb3V0QXBwUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGVVJMUmVmT2JqX05ldywgb3V0QXBwVVJMKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpMYXVuY2hfTFNHZXRBcHBsaWNhdGlvbkZvckluZm8oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JT1NUeXBlIGluVHlwZTsKLQlPU1R5cGUgaW5DcmVhdG9yOwotCUNGU3RyaW5nUmVmIGluRXh0ZW5zaW9uOwotCUxTUm9sZXNNYXNrIGluUm9sZU1hc2s7Ci0JRlNSZWYgb3V0QXBwUmVmOwotCUNGVVJMUmVmIG91dEFwcFVSTDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaW5UeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpbkNyZWF0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgIE9wdENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZpbkV4dGVuc2lvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluUm9sZU1hc2spKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gTFNHZXRBcHBsaWNhdGlvbkZvckluZm8oaW5UeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkNyZWF0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRXh0ZW5zaW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblJvbGVNYXNrLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0QXBwUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0QXBwVVJMKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZTUmVmLCAmb3V0QXBwUmVmLAotCSAgICAgICAgICAgICAgICAgICAgIENGVVJMUmVmT2JqX05ldywgb3V0QXBwVVJMKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBPU1R5cGUgaW5UeXBlOworICAgIE9TVHlwZSBpbkNyZWF0b3I7CisgICAgQ0ZTdHJpbmdSZWYgaW5FeHRlbnNpb247CisgICAgTFNSb2xlc01hc2sgaW5Sb2xlTWFzazsKKyAgICBGU1JlZiBvdXRBcHBSZWY7CisgICAgQ0ZVUkxSZWYgb3V0QXBwVVJMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpblR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmluQ3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0Q0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmluRXh0ZW5zaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Sb2xlTWFzaykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBMU0dldEFwcGxpY2F0aW9uRm9ySW5mbyhpblR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQ3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5FeHRlbnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluUm9sZU1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRBcHBSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRBcHBVUkwpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRlNSZWYsICZvdXRBcHBSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZVUkxSZWZPYmpfTmV3LCBvdXRBcHBVUkwpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkxhdW5jaF9MU0dldEFwcGxpY2F0aW9uRm9yVVJMKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUNGVVJMUmVmIGluVVJMOwotCUxTUm9sZXNNYXNrIGluUm9sZU1hc2s7Ci0JRlNSZWYgb3V0QXBwUmVmOwotCUNGVVJMUmVmIG91dEFwcFVSTDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlVSTFJlZk9ial9Db252ZXJ0LCAmaW5VUkwsCi0JICAgICAgICAgICAgICAgICAgICAgICZpblJvbGVNYXNrKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IExTR2V0QXBwbGljYXRpb25Gb3JVUkwoaW5VUkwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Sb2xlTWFzaywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0QXBwUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRBcHBVUkwpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRlNSZWYsICZvdXRBcHBSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZVUkxSZWZPYmpfTmV3LCBvdXRBcHBVUkwpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIENGVVJMUmVmIGluVVJMOworICAgIExTUm9sZXNNYXNrIGluUm9sZU1hc2s7CisgICAgRlNSZWYgb3V0QXBwUmVmOworICAgIENGVVJMUmVmIG91dEFwcFVSTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlVSTFJlZk9ial9Db252ZXJ0LCAmaW5VUkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblJvbGVNYXNrKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IExTR2V0QXBwbGljYXRpb25Gb3JVUkwoaW5VUkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Sb2xlTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0QXBwUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRBcHBVUkwpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRlNSZWYsICZvdXRBcHBSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZVUkxSZWZPYmpfTmV3LCBvdXRBcHBVUkwpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkxhdW5jaF9MU0ZpbmRBcHBsaWNhdGlvbkZvckluZm8oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JT1NUeXBlIGluQ3JlYXRvcjsKLQlDRlN0cmluZ1JlZiBpbkJ1bmRsZUlEOwotCUNGU3RyaW5nUmVmIGluTmFtZTsKLQlGU1JlZiBvdXRBcHBSZWY7Ci0JQ0ZVUkxSZWYgb3V0QXBwVVJMOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmluQ3JlYXRvciwKLQkgICAgICAgICAgICAgICAgICAgICAgT3B0Q0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmluQnVuZGxlSUQsCi0JICAgICAgICAgICAgICAgICAgICAgIE9wdENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZpbk5hbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gTFNGaW5kQXBwbGljYXRpb25Gb3JJbmZvKGluQ3JlYXRvciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQnVuZGxlSUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbk5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0QXBwUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEFwcFVSTCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGU1JlZiwgJm91dEFwcFJlZiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlVSTFJlZk9ial9OZXcsIG91dEFwcFVSTCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgT1NUeXBlIGluQ3JlYXRvcjsKKyAgICBDRlN0cmluZ1JlZiBpbkJ1bmRsZUlEOworICAgIENGU3RyaW5nUmVmIGluTmFtZTsKKyAgICBGU1JlZiBvdXRBcHBSZWY7CisgICAgQ0ZVUkxSZWYgb3V0QXBwVVJMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmluQ3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0Q0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmluQnVuZGxlSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZpbk5hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gTFNGaW5kQXBwbGljYXRpb25Gb3JJbmZvKGluQ3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQnVuZGxlSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0QXBwUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEFwcFVSTCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGU1JlZiwgJm91dEFwcFJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlVSTFJlZk9ial9OZXcsIG91dEFwcFVSTCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTGF1bmNoX0xTQ2FuUmVmQWNjZXB0SXRlbShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlGU1JlZiBpbkl0ZW1GU1JlZjsKLQlGU1JlZiBpblRhcmdldFJlZjsKLQlMU1JvbGVzTWFzayBpblJvbGVNYXNrOwotCUxTQWNjZXB0YW5jZUZsYWdzIGluRmxhZ3M7Ci0JQm9vbGVhbiBvdXRBY2NlcHRzSXRlbTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1JlZiwgJmluSXRlbUZTUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1JlZiwgJmluVGFyZ2V0UmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5Sb2xlTWFzaywKLQkgICAgICAgICAgICAgICAgICAgICAgJmluRmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gTFNDYW5SZWZBY2NlcHRJdGVtKCZpbkl0ZW1GU1JlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZpblRhcmdldFJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGluUm9sZU1hc2ssCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBpbkZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEFjY2VwdHNJdGVtKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRBY2NlcHRzSXRlbSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgRlNSZWYgaW5JdGVtRlNSZWY7CisgICAgRlNSZWYgaW5UYXJnZXRSZWY7CisgICAgTFNSb2xlc01hc2sgaW5Sb2xlTWFzazsKKyAgICBMU0FjY2VwdGFuY2VGbGFncyBpbkZsYWdzOworICAgIEJvb2xlYW4gb3V0QWNjZXB0c0l0ZW07CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNSZWYsICZpbkl0ZW1GU1JlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNSZWYsICZpblRhcmdldFJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluUm9sZU1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IExTQ2FuUmVmQWNjZXB0SXRlbSgmaW5JdGVtRlNSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5UYXJnZXRSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblJvbGVNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5GbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRBY2NlcHRzSXRlbSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0QWNjZXB0c0l0ZW0pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkxhdW5jaF9MU0NhblVSTEFjY2VwdFVSTChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlDRlVSTFJlZiBpbkl0ZW1VUkw7Ci0JQ0ZVUkxSZWYgaW5UYXJnZXRVUkw7Ci0JTFNSb2xlc01hc2sgaW5Sb2xlTWFzazsKLQlMU0FjY2VwdGFuY2VGbGFncyBpbkZsYWdzOwotCUJvb2xlYW4gb3V0QWNjZXB0c0l0ZW07Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZVUkxSZWZPYmpfQ29udmVydCwgJmluSXRlbVVSTCwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZVUkxSZWZPYmpfQ29udmVydCwgJmluVGFyZ2V0VVJMLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5Sb2xlTWFzaywKLQkgICAgICAgICAgICAgICAgICAgICAgJmluRmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gTFNDYW5VUkxBY2NlcHRVUkwoaW5JdGVtVVJMLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBpblRhcmdldFVSTCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgaW5Sb2xlTWFzaywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgaW5GbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEFjY2VwdHNJdGVtKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRBY2NlcHRzSXRlbSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgQ0ZVUkxSZWYgaW5JdGVtVVJMOworICAgIENGVVJMUmVmIGluVGFyZ2V0VVJMOworICAgIExTUm9sZXNNYXNrIGluUm9sZU1hc2s7CisgICAgTFNBY2NlcHRhbmNlRmxhZ3MgaW5GbGFnczsKKyAgICBCb29sZWFuIG91dEFjY2VwdHNJdGVtOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGVVJMUmVmT2JqX0NvbnZlcnQsICZpbkl0ZW1VUkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGVVJMUmVmT2JqX0NvbnZlcnQsICZpblRhcmdldFVSTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluUm9sZU1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IExTQ2FuVVJMQWNjZXB0VVJMKGluSXRlbVVSTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5UYXJnZXRVUkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluUm9sZU1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRBY2NlcHRzSXRlbSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0QWNjZXB0c0l0ZW0pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkxhdW5jaF9MU09wZW5GU1JlZihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlGU1JlZiBpblJlZjsKLQlGU1JlZiBvdXRMYXVuY2hlZFJlZjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTUmVmLCAmaW5SZWYpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gTFNPcGVuRlNSZWYoJmluUmVmLAotCSAgICAgICAgICAgICAgICAgICAmb3V0TGF1bmNoZWRSZWYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZTUmVmLCAmb3V0TGF1bmNoZWRSZWYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIEZTUmVmIGluUmVmOworICAgIEZTUmVmIG91dExhdW5jaGVkUmVmOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNSZWYsICZpblJlZikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBMU09wZW5GU1JlZigmaW5SZWYsCisgICAgICAgICAgICAgICAgICAgICAgICZvdXRMYXVuY2hlZFJlZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRlNSZWYsICZvdXRMYXVuY2hlZFJlZik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTGF1bmNoX0xTT3BlbkNGVVJMUmVmKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUNGVVJMUmVmIGluVVJMOwotCUNGVVJMUmVmIG91dExhdW5jaGVkVVJMOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZVUkxSZWZPYmpfQ29udmVydCwgJmluVVJMKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IExTT3BlbkNGVVJMUmVmKGluVVJMLAotCSAgICAgICAgICAgICAgICAgICAgICAmb3V0TGF1bmNoZWRVUkwpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlVSTFJlZk9ial9OZXcsIG91dExhdW5jaGVkVVJMKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBDRlVSTFJlZiBpblVSTDsKKyAgICBDRlVSTFJlZiBvdXRMYXVuY2hlZFVSTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGVVJMUmVmT2JqX0NvbnZlcnQsICZpblVSTCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBMU09wZW5DRlVSTFJlZihpblVSTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dExhdW5jaGVkVVJMKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZVUkxSZWZPYmpfTmV3LCBvdXRMYXVuY2hlZFVSTCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBMYXVuY2hfbWV0aG9kc1tdID0gewotCXsiTFNDb3B5SXRlbUluZm9Gb3JSZWYiLCAoUHlDRnVuY3Rpb24pTGF1bmNoX0xTQ29weUl0ZW1JbmZvRm9yUmVmLCAxLAotCSBQeURvY19TVFIoIihGU1JlZiBpbkl0ZW1SZWYsIExTUmVxdWVzdGVkSW5mbyBpbldoaWNoSW5mbykgLT4gKExTSXRlbUluZm9SZWNvcmQgb3V0SXRlbUluZm8pIil9LAotCXsiTFNDb3B5SXRlbUluZm9Gb3JVUkwiLCAoUHlDRnVuY3Rpb24pTGF1bmNoX0xTQ29weUl0ZW1JbmZvRm9yVVJMLCAxLAotCSBQeURvY19TVFIoIihDRlVSTFJlZiBpblVSTCwgTFNSZXF1ZXN0ZWRJbmZvIGluV2hpY2hJbmZvKSAtPiAoTFNJdGVtSW5mb1JlY29yZCBvdXRJdGVtSW5mbykiKX0sCi0JeyJMU0dldEV4dGVuc2lvbkluZm8iLCAoUHlDRnVuY3Rpb24pTGF1bmNoX0xTR2V0RXh0ZW5zaW9uSW5mbywgMSwKLQkgUHlEb2NfU1RSKCIoQnVmZmVyIGluTmFtZUxlbikgLT4gKFVuaUNoYXJDb3VudCBvdXRFeHRTdGFydEluZGV4KSIpfSwKLQl7IkxTQ29weURpc3BsYXlOYW1lRm9yUmVmIiwgKFB5Q0Z1bmN0aW9uKUxhdW5jaF9MU0NvcHlEaXNwbGF5TmFtZUZvclJlZiwgMSwKLQkgUHlEb2NfU1RSKCIoRlNSZWYgaW5SZWYpIC0+IChDRlN0cmluZ1JlZiBvdXREaXNwbGF5TmFtZSkiKX0sCi0JeyJMU0NvcHlEaXNwbGF5TmFtZUZvclVSTCIsIChQeUNGdW5jdGlvbilMYXVuY2hfTFNDb3B5RGlzcGxheU5hbWVGb3JVUkwsIDEsCi0JIFB5RG9jX1NUUigiKENGVVJMUmVmIGluVVJMKSAtPiAoQ0ZTdHJpbmdSZWYgb3V0RGlzcGxheU5hbWUpIil9LAotCXsiTFNTZXRFeHRlbnNpb25IaWRkZW5Gb3JSZWYiLCAoUHlDRnVuY3Rpb24pTGF1bmNoX0xTU2V0RXh0ZW5zaW9uSGlkZGVuRm9yUmVmLCAxLAotCSBQeURvY19TVFIoIihGU1JlZiBpblJlZiwgQm9vbGVhbiBpbkhpZGUpIC0+IE5vbmUiKX0sCi0JeyJMU1NldEV4dGVuc2lvbkhpZGRlbkZvclVSTCIsIChQeUNGdW5jdGlvbilMYXVuY2hfTFNTZXRFeHRlbnNpb25IaWRkZW5Gb3JVUkwsIDEsCi0JIFB5RG9jX1NUUigiKENGVVJMUmVmIGluVVJMLCBCb29sZWFuIGluSGlkZSkgLT4gTm9uZSIpfSwKLQl7IkxTQ29weUtpbmRTdHJpbmdGb3JSZWYiLCAoUHlDRnVuY3Rpb24pTGF1bmNoX0xTQ29weUtpbmRTdHJpbmdGb3JSZWYsIDEsCi0JIFB5RG9jX1NUUigiKEZTUmVmIGluRlNSZWYpIC0+IChDRlN0cmluZ1JlZiBvdXRLaW5kU3RyaW5nKSIpfSwKLQl7IkxTQ29weUtpbmRTdHJpbmdGb3JVUkwiLCAoUHlDRnVuY3Rpb24pTGF1bmNoX0xTQ29weUtpbmRTdHJpbmdGb3JVUkwsIDEsCi0JIFB5RG9jX1NUUigiKENGVVJMUmVmIGluVVJMKSAtPiAoQ0ZTdHJpbmdSZWYgb3V0S2luZFN0cmluZykiKX0sCi0JeyJMU0dldEFwcGxpY2F0aW9uRm9ySXRlbSIsIChQeUNGdW5jdGlvbilMYXVuY2hfTFNHZXRBcHBsaWNhdGlvbkZvckl0ZW0sIDEsCi0JIFB5RG9jX1NUUigiKEZTUmVmIGluSXRlbVJlZiwgTFNSb2xlc01hc2sgaW5Sb2xlTWFzaykgLT4gKEZTUmVmIG91dEFwcFJlZiwgQ0ZVUkxSZWYgb3V0QXBwVVJMKSIpfSwKLQl7IkxTR2V0QXBwbGljYXRpb25Gb3JJbmZvIiwgKFB5Q0Z1bmN0aW9uKUxhdW5jaF9MU0dldEFwcGxpY2F0aW9uRm9ySW5mbywgMSwKLQkgUHlEb2NfU1RSKCIoT1NUeXBlIGluVHlwZSwgT1NUeXBlIGluQ3JlYXRvciwgQ0ZTdHJpbmdSZWYgaW5FeHRlbnNpb24sIExTUm9sZXNNYXNrIGluUm9sZU1hc2spIC0+IChGU1JlZiBvdXRBcHBSZWYsIENGVVJMUmVmIG91dEFwcFVSTCkiKX0sCi0JeyJMU0dldEFwcGxpY2F0aW9uRm9yVVJMIiwgKFB5Q0Z1bmN0aW9uKUxhdW5jaF9MU0dldEFwcGxpY2F0aW9uRm9yVVJMLCAxLAotCSBQeURvY19TVFIoIihDRlVSTFJlZiBpblVSTCwgTFNSb2xlc01hc2sgaW5Sb2xlTWFzaykgLT4gKEZTUmVmIG91dEFwcFJlZiwgQ0ZVUkxSZWYgb3V0QXBwVVJMKSIpfSwKLQl7IkxTRmluZEFwcGxpY2F0aW9uRm9ySW5mbyIsIChQeUNGdW5jdGlvbilMYXVuY2hfTFNGaW5kQXBwbGljYXRpb25Gb3JJbmZvLCAxLAotCSBQeURvY19TVFIoIihPU1R5cGUgaW5DcmVhdG9yLCBDRlN0cmluZ1JlZiBpbkJ1bmRsZUlELCBDRlN0cmluZ1JlZiBpbk5hbWUpIC0+IChGU1JlZiBvdXRBcHBSZWYsIENGVVJMUmVmIG91dEFwcFVSTCkiKX0sCi0JeyJMU0NhblJlZkFjY2VwdEl0ZW0iLCAoUHlDRnVuY3Rpb24pTGF1bmNoX0xTQ2FuUmVmQWNjZXB0SXRlbSwgMSwKLQkgUHlEb2NfU1RSKCIoRlNSZWYgaW5JdGVtRlNSZWYsIEZTUmVmIGluVGFyZ2V0UmVmLCBMU1JvbGVzTWFzayBpblJvbGVNYXNrLCBMU0FjY2VwdGFuY2VGbGFncyBpbkZsYWdzKSAtPiAoQm9vbGVhbiBvdXRBY2NlcHRzSXRlbSkiKX0sCi0JeyJMU0NhblVSTEFjY2VwdFVSTCIsIChQeUNGdW5jdGlvbilMYXVuY2hfTFNDYW5VUkxBY2NlcHRVUkwsIDEsCi0JIFB5RG9jX1NUUigiKENGVVJMUmVmIGluSXRlbVVSTCwgQ0ZVUkxSZWYgaW5UYXJnZXRVUkwsIExTUm9sZXNNYXNrIGluUm9sZU1hc2ssIExTQWNjZXB0YW5jZUZsYWdzIGluRmxhZ3MpIC0+IChCb29sZWFuIG91dEFjY2VwdHNJdGVtKSIpfSwKLQl7IkxTT3BlbkZTUmVmIiwgKFB5Q0Z1bmN0aW9uKUxhdW5jaF9MU09wZW5GU1JlZiwgMSwKLQkgUHlEb2NfU1RSKCIoRlNSZWYgaW5SZWYpIC0+IChGU1JlZiBvdXRMYXVuY2hlZFJlZikiKX0sCi0JeyJMU09wZW5DRlVSTFJlZiIsIChQeUNGdW5jdGlvbilMYXVuY2hfTFNPcGVuQ0ZVUkxSZWYsIDEsCi0JIFB5RG9jX1NUUigiKENGVVJMUmVmIGluVVJMKSAtPiAoQ0ZVUkxSZWYgb3V0TGF1bmNoZWRVUkwpIil9LAotCXtOVUxMLCBOVUxMLCAwfQorICAgIHsiTFNDb3B5SXRlbUluZm9Gb3JSZWYiLCAoUHlDRnVuY3Rpb24pTGF1bmNoX0xTQ29weUl0ZW1JbmZvRm9yUmVmLCAxLAorICAgICBQeURvY19TVFIoIihGU1JlZiBpbkl0ZW1SZWYsIExTUmVxdWVzdGVkSW5mbyBpbldoaWNoSW5mbykgLT4gKExTSXRlbUluZm9SZWNvcmQgb3V0SXRlbUluZm8pIil9LAorICAgIHsiTFNDb3B5SXRlbUluZm9Gb3JVUkwiLCAoUHlDRnVuY3Rpb24pTGF1bmNoX0xTQ29weUl0ZW1JbmZvRm9yVVJMLCAxLAorICAgICBQeURvY19TVFIoIihDRlVSTFJlZiBpblVSTCwgTFNSZXF1ZXN0ZWRJbmZvIGluV2hpY2hJbmZvKSAtPiAoTFNJdGVtSW5mb1JlY29yZCBvdXRJdGVtSW5mbykiKX0sCisgICAgeyJMU0dldEV4dGVuc2lvbkluZm8iLCAoUHlDRnVuY3Rpb24pTGF1bmNoX0xTR2V0RXh0ZW5zaW9uSW5mbywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQnVmZmVyIGluTmFtZUxlbikgLT4gKFVuaUNoYXJDb3VudCBvdXRFeHRTdGFydEluZGV4KSIpfSwKKyAgICB7IkxTQ29weURpc3BsYXlOYW1lRm9yUmVmIiwgKFB5Q0Z1bmN0aW9uKUxhdW5jaF9MU0NvcHlEaXNwbGF5TmFtZUZvclJlZiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRlNSZWYgaW5SZWYpIC0+IChDRlN0cmluZ1JlZiBvdXREaXNwbGF5TmFtZSkiKX0sCisgICAgeyJMU0NvcHlEaXNwbGF5TmFtZUZvclVSTCIsIChQeUNGdW5jdGlvbilMYXVuY2hfTFNDb3B5RGlzcGxheU5hbWVGb3JVUkwsIDEsCisgICAgIFB5RG9jX1NUUigiKENGVVJMUmVmIGluVVJMKSAtPiAoQ0ZTdHJpbmdSZWYgb3V0RGlzcGxheU5hbWUpIil9LAorICAgIHsiTFNTZXRFeHRlbnNpb25IaWRkZW5Gb3JSZWYiLCAoUHlDRnVuY3Rpb24pTGF1bmNoX0xTU2V0RXh0ZW5zaW9uSGlkZGVuRm9yUmVmLCAxLAorICAgICBQeURvY19TVFIoIihGU1JlZiBpblJlZiwgQm9vbGVhbiBpbkhpZGUpIC0+IE5vbmUiKX0sCisgICAgeyJMU1NldEV4dGVuc2lvbkhpZGRlbkZvclVSTCIsIChQeUNGdW5jdGlvbilMYXVuY2hfTFNTZXRFeHRlbnNpb25IaWRkZW5Gb3JVUkwsIDEsCisgICAgIFB5RG9jX1NUUigiKENGVVJMUmVmIGluVVJMLCBCb29sZWFuIGluSGlkZSkgLT4gTm9uZSIpfSwKKyAgICB7IkxTQ29weUtpbmRTdHJpbmdGb3JSZWYiLCAoUHlDRnVuY3Rpb24pTGF1bmNoX0xTQ29weUtpbmRTdHJpbmdGb3JSZWYsIDEsCisgICAgIFB5RG9jX1NUUigiKEZTUmVmIGluRlNSZWYpIC0+IChDRlN0cmluZ1JlZiBvdXRLaW5kU3RyaW5nKSIpfSwKKyAgICB7IkxTQ29weUtpbmRTdHJpbmdGb3JVUkwiLCAoUHlDRnVuY3Rpb24pTGF1bmNoX0xTQ29weUtpbmRTdHJpbmdGb3JVUkwsIDEsCisgICAgIFB5RG9jX1NUUigiKENGVVJMUmVmIGluVVJMKSAtPiAoQ0ZTdHJpbmdSZWYgb3V0S2luZFN0cmluZykiKX0sCisgICAgeyJMU0dldEFwcGxpY2F0aW9uRm9ySXRlbSIsIChQeUNGdW5jdGlvbilMYXVuY2hfTFNHZXRBcHBsaWNhdGlvbkZvckl0ZW0sIDEsCisgICAgIFB5RG9jX1NUUigiKEZTUmVmIGluSXRlbVJlZiwgTFNSb2xlc01hc2sgaW5Sb2xlTWFzaykgLT4gKEZTUmVmIG91dEFwcFJlZiwgQ0ZVUkxSZWYgb3V0QXBwVVJMKSIpfSwKKyAgICB7IkxTR2V0QXBwbGljYXRpb25Gb3JJbmZvIiwgKFB5Q0Z1bmN0aW9uKUxhdW5jaF9MU0dldEFwcGxpY2F0aW9uRm9ySW5mbywgMSwKKyAgICAgUHlEb2NfU1RSKCIoT1NUeXBlIGluVHlwZSwgT1NUeXBlIGluQ3JlYXRvciwgQ0ZTdHJpbmdSZWYgaW5FeHRlbnNpb24sIExTUm9sZXNNYXNrIGluUm9sZU1hc2spIC0+IChGU1JlZiBvdXRBcHBSZWYsIENGVVJMUmVmIG91dEFwcFVSTCkiKX0sCisgICAgeyJMU0dldEFwcGxpY2F0aW9uRm9yVVJMIiwgKFB5Q0Z1bmN0aW9uKUxhdW5jaF9MU0dldEFwcGxpY2F0aW9uRm9yVVJMLCAxLAorICAgICBQeURvY19TVFIoIihDRlVSTFJlZiBpblVSTCwgTFNSb2xlc01hc2sgaW5Sb2xlTWFzaykgLT4gKEZTUmVmIG91dEFwcFJlZiwgQ0ZVUkxSZWYgb3V0QXBwVVJMKSIpfSwKKyAgICB7IkxTRmluZEFwcGxpY2F0aW9uRm9ySW5mbyIsIChQeUNGdW5jdGlvbilMYXVuY2hfTFNGaW5kQXBwbGljYXRpb25Gb3JJbmZvLCAxLAorICAgICBQeURvY19TVFIoIihPU1R5cGUgaW5DcmVhdG9yLCBDRlN0cmluZ1JlZiBpbkJ1bmRsZUlELCBDRlN0cmluZ1JlZiBpbk5hbWUpIC0+IChGU1JlZiBvdXRBcHBSZWYsIENGVVJMUmVmIG91dEFwcFVSTCkiKX0sCisgICAgeyJMU0NhblJlZkFjY2VwdEl0ZW0iLCAoUHlDRnVuY3Rpb24pTGF1bmNoX0xTQ2FuUmVmQWNjZXB0SXRlbSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRlNSZWYgaW5JdGVtRlNSZWYsIEZTUmVmIGluVGFyZ2V0UmVmLCBMU1JvbGVzTWFzayBpblJvbGVNYXNrLCBMU0FjY2VwdGFuY2VGbGFncyBpbkZsYWdzKSAtPiAoQm9vbGVhbiBvdXRBY2NlcHRzSXRlbSkiKX0sCisgICAgeyJMU0NhblVSTEFjY2VwdFVSTCIsIChQeUNGdW5jdGlvbilMYXVuY2hfTFNDYW5VUkxBY2NlcHRVUkwsIDEsCisgICAgIFB5RG9jX1NUUigiKENGVVJMUmVmIGluSXRlbVVSTCwgQ0ZVUkxSZWYgaW5UYXJnZXRVUkwsIExTUm9sZXNNYXNrIGluUm9sZU1hc2ssIExTQWNjZXB0YW5jZUZsYWdzIGluRmxhZ3MpIC0+IChCb29sZWFuIG91dEFjY2VwdHNJdGVtKSIpfSwKKyAgICB7IkxTT3BlbkZTUmVmIiwgKFB5Q0Z1bmN0aW9uKUxhdW5jaF9MU09wZW5GU1JlZiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRlNSZWYgaW5SZWYpIC0+IChGU1JlZiBvdXRMYXVuY2hlZFJlZikiKX0sCisgICAgeyJMU09wZW5DRlVSTFJlZiIsIChQeUNGdW5jdGlvbilMYXVuY2hfTFNPcGVuQ0ZVUkxSZWYsIDEsCisgICAgIFB5RG9jX1NUUigiKENGVVJMUmVmIGluVVJMKSAtPiAoQ0ZVUkxSZWYgb3V0TGF1bmNoZWRVUkwpIil9LAorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogCkBAIC00NjMsMTggKzQ2MywxOCBAQAogCiB2b2lkIGluaXRfTGF1bmNoKHZvaWQpCiB7Ci0JUHlPYmplY3QgKm07Ci0JUHlPYmplY3QgKmQ7CisgICAgUHlPYmplY3QgKm07CisgICAgUHlPYmplY3QgKmQ7CiAKIAogCiAKLQltID0gUHlfSW5pdE1vZHVsZSgiX0xhdW5jaCIsIExhdW5jaF9tZXRob2RzKTsKLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQlMYXVuY2hfRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOwotCWlmIChMYXVuY2hfRXJyb3IgPT0gTlVMTCB8fAotCSAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRXJyb3IiLCBMYXVuY2hfRXJyb3IpICE9IDApCi0JCXJldHVybjsKKyAgICBtID0gUHlfSW5pdE1vZHVsZSgiX0xhdW5jaCIsIExhdW5jaF9tZXRob2RzKTsKKyAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICBMYXVuY2hfRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOworICAgIGlmIChMYXVuY2hfRXJyb3IgPT0gTlVMTCB8fAorICAgICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRXJyb3IiLCBMYXVuY2hfRXJyb3IpICE9IDApCisgICAgICAgIHJldHVybjsKIH0KIAogLyogPT09PT09PT09PT09PT09PT09PT09PT0gRW5kIG1vZHVsZSBfTGF1bmNoID09PT09PT09PT09PT09PT09PT09PT09ICovCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9saXN0L19MaXN0bW9kdWxlLmMgYi9NYWMvTW9kdWxlcy9saXN0L19MaXN0bW9kdWxlLmMKaW5kZXggMDc5NzQwNC4uM2Y0M2IwNiAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvbGlzdC9fTGlzdG1vZHVsZS5jCisrKyBiL01hYy9Nb2R1bGVzL2xpc3QvX0xpc3Rtb2R1bGUuYwpAQCAtMTAsOSArMTAsOSBAQAogCiAvKiBNYWNybyB0byB0ZXN0IHdoZXRoZXIgYSB3ZWFrLWxvYWRlZCBDRk0gZnVuY3Rpb24gZXhpc3RzICovCiAjZGVmaW5lIFB5TWFjX1BSRUNIRUNLKHJ0bikgZG8geyBpZiAoICZydG4gPT0gTlVMTCApICB7XAotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgXAotICAgICAgICAiTm90IGF2YWlsYWJsZSBpbiB0aGlzIHNoYXJlZCBsaWJyYXJ5L09TIHZlcnNpb24iKTsgXAotICAgICAgICByZXR1cm4gTlVMTDsgXAorICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yLCBcCisgICAgIk5vdCBhdmFpbGFibGUgaW4gdGhpcyBzaGFyZWQgbGlicmFyeS9PUyB2ZXJzaW9uIik7IFwKKyAgICByZXR1cm4gTlVMTDsgXAogICAgIH19IHdoaWxlKDApCiAKIApAQCAtNDEsNjkzICs0MSw2OTMgQEAKICNkZWZpbmUgTGlzdE9ial9DaGVjayh4KSAoKHgpLT5vYl90eXBlID09ICZMaXN0X1R5cGUgfHwgUHlPYmplY3RfVHlwZUNoZWNrKCh4KSwgJkxpc3RfVHlwZSkpCiAKIHR5cGVkZWYgc3RydWN0IExpc3RPYmplY3QgewotCVB5T2JqZWN0X0hFQUQKLQlMaXN0SGFuZGxlIG9iX2l0c2VsZjsKLQlQeU9iamVjdCAqb2JfbGRlZl9mdW5jOwotCWludCBvYl9tdXN0X2JlX2Rpc3Bvc2VkOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBMaXN0SGFuZGxlIG9iX2l0c2VsZjsKKyAgICBQeU9iamVjdCAqb2JfbGRlZl9mdW5jOworICAgIGludCBvYl9tdXN0X2JlX2Rpc3Bvc2VkOwogfSBMaXN0T2JqZWN0OwogCiBQeU9iamVjdCAqTGlzdE9ial9OZXcoTGlzdEhhbmRsZSBpdHNlbGYpCiB7Ci0JTGlzdE9iamVjdCAqaXQ7Ci0JaWYgKGl0c2VsZiA9PSBOVUxMKSB7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoTGlzdF9FcnJvciwiQ2Fubm90IGNyZWF0ZSBudWxsIExpc3QiKTsKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotCSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQlpdCA9IFB5T2JqZWN0X05FVyhMaXN0T2JqZWN0LCAmTGlzdF9UeXBlKTsKLQlpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlpdC0+b2JfbGRlZl9mdW5jID0gTlVMTDsKLQlpdC0+b2JfbXVzdF9iZV9kaXNwb3NlZCA9IDE7Ci0JU2V0TGlzdFJlZkNvbihpdHNlbGYsIChsb25nKWl0KTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgTGlzdE9iamVjdCAqaXQ7CisgICAgaWYgKGl0c2VsZiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoTGlzdF9FcnJvciwiQ2Fubm90IGNyZWF0ZSBudWxsIExpc3QiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICBpdCA9IFB5T2JqZWN0X05FVyhMaXN0T2JqZWN0LCAmTGlzdF9UeXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICBpdC0+b2JfbGRlZl9mdW5jID0gTlVMTDsKKyAgICBpdC0+b2JfbXVzdF9iZV9kaXNwb3NlZCA9IDE7CisgICAgU2V0TGlzdFJlZkNvbihpdHNlbGYsIChsb25nKWl0KTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiAKIGludCBMaXN0T2JqX0NvbnZlcnQoUHlPYmplY3QgKnYsIExpc3RIYW5kbGUgKnBfaXRzZWxmKQogewotCWlmICghTGlzdE9ial9DaGVjayh2KSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJMaXN0IHJlcXVpcmVkIik7Ci0JCXJldHVybiAwOwotCX0KLQkqcF9pdHNlbGYgPSAoKExpc3RPYmplY3QgKil2KS0+b2JfaXRzZWxmOwotCXJldHVybiAxOworICAgIGlmICghTGlzdE9ial9DaGVjayh2KSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJMaXN0IHJlcXVpcmVkIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAqcF9pdHNlbGYgPSAoKExpc3RPYmplY3QgKil2KS0+b2JfaXRzZWxmOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgdm9pZCBMaXN0T2JqX2RlYWxsb2MoTGlzdE9iamVjdCAqc2VsZikKIHsKLQlQeV9YREVDUkVGKHNlbGYtPm9iX2xkZWZfZnVuYyk7Ci0Jc2VsZi0+b2JfbGRlZl9mdW5jID0gTlVMTDsKLQlTZXRMaXN0UmVmQ29uKHNlbGYtPm9iX2l0c2VsZiwgKGxvbmcpMCk7Ci0JaWYgKHNlbGYtPm9iX211c3RfYmVfZGlzcG9zZWQgJiYgc2VsZi0+b2JfaXRzZWxmKSBMRGlzcG9zZShzZWxmLT5vYl9pdHNlbGYpOwotCXNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CisgICAgUHlfWERFQ1JFRihzZWxmLT5vYl9sZGVmX2Z1bmMpOworICAgIHNlbGYtPm9iX2xkZWZfZnVuYyA9IE5VTEw7CisgICAgU2V0TGlzdFJlZkNvbihzZWxmLT5vYl9pdHNlbGYsIChsb25nKTApOworICAgIGlmIChzZWxmLT5vYl9tdXN0X2JlX2Rpc3Bvc2VkICYmIHNlbGYtPm9iX2l0c2VsZikgTERpc3Bvc2Uoc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkxpc3RPYmpfTEFkZENvbHVtbihMaXN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBfcnY7Ci0Jc2hvcnQgY291bnQ7Ci0Jc2hvcnQgY29sTnVtOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNvdW50LAotCSAgICAgICAgICAgICAgICAgICAgICAmY29sTnVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTEFkZENvbHVtbihjb3VudCwKLQkgICAgICAgICAgICAgICAgIGNvbE51bSwKLQkgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBfcnY7CisgICAgc2hvcnQgY291bnQ7CisgICAgc2hvcnQgY29sTnVtOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY29sTnVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTEFkZENvbHVtbihjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbE51bSwKKyAgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkxpc3RPYmpfTEFkZFJvdyhMaXN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBfcnY7Ci0Jc2hvcnQgY291bnQ7Ci0Jc2hvcnQgcm93TnVtOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNvdW50LAotCSAgICAgICAgICAgICAgICAgICAgICAmcm93TnVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTEFkZFJvdyhjb3VudCwKLQkgICAgICAgICAgICAgIHJvd051bSwKLQkgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBfcnY7CisgICAgc2hvcnQgY291bnQ7CisgICAgc2hvcnQgcm93TnVtOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcm93TnVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTEFkZFJvdyhjb3VudCwKKyAgICAgICAgICAgICAgICAgIHJvd051bSwKKyAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkxpc3RPYmpfTERlbENvbHVtbihMaXN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBjb3VudDsKLQlzaG9ydCBjb2xOdW07Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmY291bnQsCi0JICAgICAgICAgICAgICAgICAgICAgICZjb2xOdW0pKQotCQlyZXR1cm4gTlVMTDsKLQlMRGVsQ29sdW1uKGNvdW50LAotCSAgICAgICAgICAgY29sTnVtLAotCSAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBjb3VudDsKKyAgICBzaG9ydCBjb2xOdW07CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2xOdW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBMRGVsQ29sdW1uKGNvdW50LAorICAgICAgICAgICAgICAgY29sTnVtLAorICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkxpc3RPYmpfTERlbFJvdyhMaXN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBjb3VudDsKLQlzaG9ydCByb3dOdW07Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmY291bnQsCi0JICAgICAgICAgICAgICAgICAgICAgICZyb3dOdW0pKQotCQlyZXR1cm4gTlVMTDsKLQlMRGVsUm93KGNvdW50LAotCSAgICAgICAgcm93TnVtLAotCSAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBjb3VudDsKKyAgICBzaG9ydCByb3dOdW07CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyb3dOdW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBMRGVsUm93KGNvdW50LAorICAgICAgICByb3dOdW0sCisgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpMaXN0T2JqX0xHZXRTZWxlY3QoTGlzdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JQm9vbGVhbiBuZXh0OwotCVBvaW50IHRoZUNlbGw7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm5leHQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmdGhlQ2VsbCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IExHZXRTZWxlY3QobmV4dCwKLQkgICAgICAgICAgICAgICAgICZ0aGVDZWxsLAotCSAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUG9pbnQsIHRoZUNlbGwpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBCb29sZWFuIG5leHQ7CisgICAgUG9pbnQgdGhlQ2VsbDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbmV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZ0aGVDZWxsKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTEdldFNlbGVjdChuZXh0LAorICAgICAgICAgICAgICAgICAgICAgJnRoZUNlbGwsCisgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRQb2ludCwgdGhlQ2VsbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTGlzdE9ial9MTGFzdENsaWNrKExpc3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBvaW50IF9ydjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTExhc3RDbGljayhfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUG9pbnQsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBvaW50IF9ydjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTExhc3RDbGljayhfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUG9pbnQsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTGlzdE9ial9MTmV4dENlbGwoTGlzdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JQm9vbGVhbiBoTmV4dDsKLQlCb29sZWFuIHZOZXh0OwotCVBvaW50IHRoZUNlbGw7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYmJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZoTmV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZOZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnRoZUNlbGwpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBMTmV4dENlbGwoaE5leHQsCi0JICAgICAgICAgICAgICAgIHZOZXh0LAotCSAgICAgICAgICAgICAgICAmdGhlQ2VsbCwKLQkgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUG9pbnQsIHRoZUNlbGwpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBCb29sZWFuIGhOZXh0OworICAgIEJvb2xlYW4gdk5leHQ7CisgICAgUG9pbnQgdGhlQ2VsbDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiYk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmhOZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdk5leHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmdGhlQ2VsbCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IExOZXh0Q2VsbChoTmV4dCwKKyAgICAgICAgICAgICAgICAgICAgdk5leHQsCisgICAgICAgICAgICAgICAgICAgICZ0aGVDZWxsLAorICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRQb2ludCwgdGhlQ2VsbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTGlzdE9ial9MU2l6ZShMaXN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBsaXN0V2lkdGg7Ci0Jc2hvcnQgbGlzdEhlaWdodDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZsaXN0V2lkdGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZsaXN0SGVpZ2h0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JTFNpemUobGlzdFdpZHRoLAotCSAgICAgIGxpc3RIZWlnaHQsCi0JICAgICAgX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBsaXN0V2lkdGg7CisgICAgc2hvcnQgbGlzdEhlaWdodDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZsaXN0V2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZsaXN0SGVpZ2h0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTFNpemUobGlzdFdpZHRoLAorICAgICAgICAgIGxpc3RIZWlnaHQsCisgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkxpc3RPYmpfTFNldERyYXdpbmdNb2RlKExpc3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gZHJhd0l0OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZHJhd0l0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JTFNldERyYXdpbmdNb2RlKGRyYXdJdCwKLQkgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIGRyYXdJdDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRyYXdJdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIExTZXREcmF3aW5nTW9kZShkcmF3SXQsCisgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpMaXN0T2JqX0xTY3JvbGwoTGlzdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgZENvbHM7Ci0Jc2hvcnQgZFJvd3M7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZENvbHMsCi0JICAgICAgICAgICAgICAgICAgICAgICZkUm93cykpCi0JCXJldHVybiBOVUxMOwotCUxTY3JvbGwoZENvbHMsCi0JICAgICAgICBkUm93cywKLQkgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgZENvbHM7CisgICAgc2hvcnQgZFJvd3M7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZENvbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkUm93cykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIExTY3JvbGwoZENvbHMsCisgICAgICAgIGRSb3dzLAorICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTGlzdE9ial9MQXV0b1Njcm9sbChMaXN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTEF1dG9TY3JvbGwoX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTEF1dG9TY3JvbGwoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkxpc3RPYmpfTFVwZGF0ZShMaXN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZ25IYW5kbGUgdGhlUmduOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVSZ24pKQotCQlyZXR1cm4gTlVMTDsKLQlMVXBkYXRlKHRoZVJnbiwKLQkgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIHRoZVJnbjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlUmduKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTFVwZGF0ZSh0aGVSZ24sCisgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpMaXN0T2JqX0xBY3RpdmF0ZShMaXN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIGFjdDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmFjdCkpCi0JCXJldHVybiBOVUxMOwotCUxBY3RpdmF0ZShhY3QsCi0JICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBhY3Q7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBMQWN0aXZhdGUoYWN0LAorICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTGlzdE9ial9MQ2VsbFNpemUoTGlzdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUG9pbnQgY1NpemU7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJmNTaXplKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTENlbGxTaXplKGNTaXplLAotCSAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBvaW50IGNTaXplOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZjU2l6ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIExDZWxsU2l6ZShjU2l6ZSwKKyAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkxpc3RPYmpfTENsaWNrKExpc3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCVBvaW50IHB0OwotCUV2ZW50TW9kaWZpZXJzIG1vZGlmaWVyczsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJkgiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnB0LAotCSAgICAgICAgICAgICAgICAgICAgICAmbW9kaWZpZXJzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTENsaWNrKHB0LAotCSAgICAgICAgICAgICBtb2RpZmllcnMsCi0JICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBQb2ludCBwdDsKKyAgICBFdmVudE1vZGlmaWVycyBtb2RpZmllcnM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZwdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGlmaWVycykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IExDbGljayhwdCwKKyAgICAgICAgICAgICAgICAgbW9kaWZpZXJzLAorICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpMaXN0T2JqX0xBZGRUb0NlbGwoTGlzdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JY2hhciAqZGF0YVB0cl9faW5fXzsKLQlzaG9ydCBkYXRhUHRyX19sZW5fXzsKLQlpbnQgZGF0YVB0cl9faW5fbGVuX187Ci0JUG9pbnQgdGhlQ2VsbDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzI08mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRhdGFQdHJfX2luX18sICZkYXRhUHRyX19pbl9sZW5fXywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZ0aGVDZWxsKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZGF0YVB0cl9fbGVuX18gPSBkYXRhUHRyX19pbl9sZW5fXzsKLQlMQWRkVG9DZWxsKGRhdGFQdHJfX2luX18sIGRhdGFQdHJfX2xlbl9fLAotCSAgICAgICAgICAgdGhlQ2VsbCwKLQkgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgY2hhciAqZGF0YVB0cl9faW5fXzsKKyAgICBzaG9ydCBkYXRhUHRyX19sZW5fXzsKKyAgICBpbnQgZGF0YVB0cl9faW5fbGVuX187CisgICAgUG9pbnQgdGhlQ2VsbDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzI08mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFQdHJfX2luX18sICZkYXRhUHRyX19pbl9sZW5fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZ0aGVDZWxsKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZGF0YVB0cl9fbGVuX18gPSBkYXRhUHRyX19pbl9sZW5fXzsKKyAgICBMQWRkVG9DZWxsKGRhdGFQdHJfX2luX18sIGRhdGFQdHJfX2xlbl9fLAorICAgICAgICAgICAgICAgdGhlQ2VsbCwKKyAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpMaXN0T2JqX0xDbHJDZWxsKExpc3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBvaW50IHRoZUNlbGw7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnRoZUNlbGwpKQotCQlyZXR1cm4gTlVMTDsKLQlMQ2xyQ2VsbCh0aGVDZWxsLAotCSAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUG9pbnQgdGhlQ2VsbDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmdGhlQ2VsbCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIExDbHJDZWxsKHRoZUNlbGwsCisgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkxpc3RPYmpfTEdldENlbGwoTGlzdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JY2hhciAqZGF0YVB0cl9fb3V0X187Ci0Jc2hvcnQgZGF0YVB0cl9fbGVuX187Ci0JaW50IGRhdGFQdHJfX2luX2xlbl9fOwotCVBvaW50IHRoZUNlbGw7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaU8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRhdGFQdHJfX2luX2xlbl9fLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnRoZUNlbGwpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoKGRhdGFQdHJfX291dF9fID0gbWFsbG9jKGRhdGFQdHJfX2luX2xlbl9fKSkgPT0gTlVMTCkKLQl7Ci0JCVB5RXJyX05vTWVtb3J5KCk7Ci0JCWdvdG8gZGF0YVB0cl9fZXJyb3JfXzsKLQl9Ci0JZGF0YVB0cl9fbGVuX18gPSBkYXRhUHRyX19pbl9sZW5fXzsKLQlMR2V0Q2VsbChkYXRhUHRyX19vdXRfXywgJmRhdGFQdHJfX2xlbl9fLAotCSAgICAgICAgIHRoZUNlbGwsCi0JICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoInMjIiwKLQkgICAgICAgICAgICAgICAgICAgICBkYXRhUHRyX19vdXRfXywgKGludClkYXRhUHRyX19sZW5fXyk7Ci0JZnJlZShkYXRhUHRyX19vdXRfXyk7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGNoYXIgKmRhdGFQdHJfX291dF9fOworICAgIHNob3J0IGRhdGFQdHJfX2xlbl9fOworICAgIGludCBkYXRhUHRyX19pbl9sZW5fXzsKKyAgICBQb2ludCB0aGVDZWxsOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImlPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUHRyX19pbl9sZW5fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZ0aGVDZWxsKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKChkYXRhUHRyX19vdXRfXyA9IG1hbGxvYyhkYXRhUHRyX19pbl9sZW5fXykpID09IE5VTEwpCisgICAgeworICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICBnb3RvIGRhdGFQdHJfX2Vycm9yX187CisgICAgfQorICAgIGRhdGFQdHJfX2xlbl9fID0gZGF0YVB0cl9faW5fbGVuX187CisgICAgTEdldENlbGwoZGF0YVB0cl9fb3V0X18sICZkYXRhUHRyX19sZW5fXywKKyAgICAgICAgICAgICB0aGVDZWxsLAorICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJzIyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVB0cl9fb3V0X18sIChpbnQpZGF0YVB0cl9fbGVuX18pOworICAgIGZyZWUoZGF0YVB0cl9fb3V0X18pOwogIGRhdGFQdHJfX2Vycm9yX186IDsKLQlyZXR1cm4gX3JlczsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpMaXN0T2JqX0xSZWN0KExpc3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3QgY2VsbFJlY3Q7Ci0JUG9pbnQgdGhlQ2VsbDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmdGhlQ2VsbCkpCi0JCXJldHVybiBOVUxMOwotCUxSZWN0KCZjZWxsUmVjdCwKLQkgICAgICB0aGVDZWxsLAotCSAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmY2VsbFJlY3QpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IGNlbGxSZWN0OworICAgIFBvaW50IHRoZUNlbGw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnRoZUNlbGwpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBMUmVjdCgmY2VsbFJlY3QsCisgICAgICAgICAgdGhlQ2VsbCwKKyAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmNlbGxSZWN0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpMaXN0T2JqX0xTZXRDZWxsKExpc3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWNoYXIgKmRhdGFQdHJfX2luX187Ci0Jc2hvcnQgZGF0YVB0cl9fbGVuX187Ci0JaW50IGRhdGFQdHJfX2luX2xlbl9fOwotCVBvaW50IHRoZUNlbGw7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAicyNPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZkYXRhUHRyX19pbl9fLCAmZGF0YVB0cl9faW5fbGVuX18sCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmdGhlQ2VsbCkpCi0JCXJldHVybiBOVUxMOwotCWRhdGFQdHJfX2xlbl9fID0gZGF0YVB0cl9faW5fbGVuX187Ci0JTFNldENlbGwoZGF0YVB0cl9faW5fXywgZGF0YVB0cl9fbGVuX18sCi0JICAgICAgICAgdGhlQ2VsbCwKLQkgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGNoYXIgKmRhdGFQdHJfX2luX187CisgICAgc2hvcnQgZGF0YVB0cl9fbGVuX187CisgICAgaW50IGRhdGFQdHJfX2luX2xlbl9fOworICAgIFBvaW50IHRoZUNlbGw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAicyNPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUHRyX19pbl9fLCAmZGF0YVB0cl9faW5fbGVuX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmdGhlQ2VsbCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGRhdGFQdHJfX2xlbl9fID0gZGF0YVB0cl9faW5fbGVuX187CisgICAgTFNldENlbGwoZGF0YVB0cl9faW5fXywgZGF0YVB0cl9fbGVuX18sCisgICAgICAgICAgICAgdGhlQ2VsbCwKKyAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTGlzdE9ial9MU2V0U2VsZWN0KExpc3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gc2V0SXQ7Ci0JUG9pbnQgdGhlQ2VsbDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2V0SXQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmdGhlQ2VsbCkpCi0JCXJldHVybiBOVUxMOwotCUxTZXRTZWxlY3Qoc2V0SXQsCi0JICAgICAgICAgICB0aGVDZWxsLAotCSAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIHNldEl0OworICAgIFBvaW50IHRoZUNlbGw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNldEl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnRoZUNlbGwpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBMU2V0U2VsZWN0KHNldEl0LAorICAgICAgICAgICAgICAgdGhlQ2VsbCwKKyAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpMaXN0T2JqX0xEcmF3KExpc3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBvaW50IHRoZUNlbGw7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnRoZUNlbGwpKQotCQlyZXR1cm4gTlVMTDsKLQlMRHJhdyh0aGVDZWxsLAotCSAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUG9pbnQgdGhlQ2VsbDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmdGhlQ2VsbCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIExEcmF3KHRoZUNlbGwsCisgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkxpc3RPYmpfTEdldENlbGxEYXRhTG9jYXRpb24oTGlzdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgb2Zmc2V0OwotCXNob3J0IGxlbjsKLQlQb2ludCB0aGVDZWxsOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZ0aGVDZWxsKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTEdldENlbGxEYXRhTG9jYXRpb24oJm9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAmbGVuLAotCSAgICAgICAgICAgICAgICAgICAgIHRoZUNlbGwsCi0JICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImhoIiwKLQkgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgbGVuKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgb2Zmc2V0OworICAgIHNob3J0IGxlbjsKKyAgICBQb2ludCB0aGVDZWxsOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZ0aGVDZWxsKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTEdldENlbGxEYXRhTG9jYXRpb24oJm9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRoZUNlbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgbGVuKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpMaXN0T2JqX0dldExpc3RQb3J0KExpc3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNHcmFmUHRyIF9ydjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TGlzdFBvcnQoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0dyYWZQdHIgX3J2OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRMaXN0UG9ydChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkxpc3RPYmpfR2V0TGlzdFZlcnRpY2FsU2Nyb2xsQmFyKExpc3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbnRyb2xIYW5kbGUgX3J2OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRMaXN0VmVydGljYWxTY3JvbGxCYXIoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb250cm9sSGFuZGxlIF9ydjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TGlzdFZlcnRpY2FsU2Nyb2xsQmFyKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpMaXN0T2JqX0dldExpc3RIb3Jpem9udGFsU2Nyb2xsQmFyKExpc3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbnRyb2xIYW5kbGUgX3J2OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRMaXN0SG9yaXpvbnRhbFNjcm9sbEJhcihfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbnRyb2xIYW5kbGUgX3J2OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRMaXN0SG9yaXpvbnRhbFNjcm9sbEJhcihfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTGlzdE9ial9HZXRMaXN0QWN0aXZlKExpc3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRMaXN0QWN0aXZlKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TGlzdEFjdGl2ZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpMaXN0T2JqX0dldExpc3RDbGlja1RpbWUoTGlzdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JU0ludDMyIF9ydjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TGlzdENsaWNrVGltZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgU0ludDMyIF9ydjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TGlzdENsaWNrVGltZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpMaXN0T2JqX0dldExpc3RSZWZDb24oTGlzdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JU0ludDMyIF9ydjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TGlzdFJlZkNvbihfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgU0ludDMyIF9ydjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TGlzdFJlZkNvbihfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpMaXN0T2JqX0dldExpc3REZWZpbml0aW9uKExpc3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUhhbmRsZSBfcnY7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldExpc3REZWZpbml0aW9uKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgSGFuZGxlIF9ydjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TGlzdERlZmluaXRpb24oX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkxpc3RPYmpfR2V0TGlzdFVzZXJIYW5kbGUoTGlzdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JSGFuZGxlIF9ydjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TGlzdFVzZXJIYW5kbGUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBIYW5kbGUgX3J2OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRMaXN0VXNlckhhbmRsZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTGlzdE9ial9HZXRMaXN0RGF0YUhhbmRsZShMaXN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlEYXRhSGFuZGxlIF9ydjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TGlzdERhdGFIYW5kbGUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBEYXRhSGFuZGxlIF9ydjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TGlzdERhdGFIYW5kbGUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkxpc3RPYmpfR2V0TGlzdEZsYWdzKExpc3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9wdGlvbkJpdHMgX3J2OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRMaXN0RmxhZ3MoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9wdGlvbkJpdHMgX3J2OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRMaXN0RmxhZ3MoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTGlzdE9ial9HZXRMaXN0U2VsZWN0aW9uRmxhZ3MoTGlzdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT3B0aW9uQml0cyBfcnY7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldExpc3RTZWxlY3Rpb25GbGFncyhfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT3B0aW9uQml0cyBfcnY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldExpc3RTZWxlY3Rpb25GbGFncyhfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpMaXN0T2JqX2FzX1Jlc291cmNlKExpc3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUhhbmRsZSBfcnY7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IGFzX1Jlc291cmNlKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgSGFuZGxlIF9ydjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gYXNfUmVzb3VyY2UoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgTGlzdE9ial9tZXRob2RzW10gPSB7Ci0JeyJMQWRkQ29sdW1uIiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfTEFkZENvbHVtbiwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgY291bnQsIHNob3J0IGNvbE51bSkgLT4gKHNob3J0IF9ydikiKX0sCi0JeyJMQWRkUm93IiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfTEFkZFJvdywgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgY291bnQsIHNob3J0IHJvd051bSkgLT4gKHNob3J0IF9ydikiKX0sCi0JeyJMRGVsQ29sdW1uIiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfTERlbENvbHVtbiwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgY291bnQsIHNob3J0IGNvbE51bSkgLT4gTm9uZSIpfSwKLQl7IkxEZWxSb3ciLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9MRGVsUm93LCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBjb3VudCwgc2hvcnQgcm93TnVtKSAtPiBOb25lIil9LAotCXsiTEdldFNlbGVjdCIsIChQeUNGdW5jdGlvbilMaXN0T2JqX0xHZXRTZWxlY3QsIDEsCi0JIFB5RG9jX1NUUigiKEJvb2xlYW4gbmV4dCwgUG9pbnQgdGhlQ2VsbCkgLT4gKEJvb2xlYW4gX3J2LCBQb2ludCB0aGVDZWxsKSIpfSwKLQl7IkxMYXN0Q2xpY2siLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9MTGFzdENsaWNrLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChQb2ludCBfcnYpIil9LAotCXsiTE5leHRDZWxsIiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfTE5leHRDZWxsLCAxLAotCSBQeURvY19TVFIoIihCb29sZWFuIGhOZXh0LCBCb29sZWFuIHZOZXh0LCBQb2ludCB0aGVDZWxsKSAtPiAoQm9vbGVhbiBfcnYsIFBvaW50IHRoZUNlbGwpIil9LAotCXsiTFNpemUiLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9MU2l6ZSwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgbGlzdFdpZHRoLCBzaG9ydCBsaXN0SGVpZ2h0KSAtPiBOb25lIil9LAotCXsiTFNldERyYXdpbmdNb2RlIiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfTFNldERyYXdpbmdNb2RlLCAxLAotCSBQeURvY19TVFIoIihCb29sZWFuIGRyYXdJdCkgLT4gTm9uZSIpfSwKLQl7IkxTY3JvbGwiLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9MU2Nyb2xsLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBkQ29scywgc2hvcnQgZFJvd3MpIC0+IE5vbmUiKX0sCi0JeyJMQXV0b1Njcm9sbCIsIChQeUNGdW5jdGlvbilMaXN0T2JqX0xBdXRvU2Nyb2xsLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJMVXBkYXRlIiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfTFVwZGF0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHRoZVJnbikgLT4gTm9uZSIpfSwKLQl7IkxBY3RpdmF0ZSIsIChQeUNGdW5jdGlvbilMaXN0T2JqX0xBY3RpdmF0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoQm9vbGVhbiBhY3QpIC0+IE5vbmUiKX0sCi0JeyJMQ2VsbFNpemUiLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9MQ2VsbFNpemUsIDEsCi0JIFB5RG9jX1NUUigiKFBvaW50IGNTaXplKSAtPiBOb25lIil9LAotCXsiTENsaWNrIiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfTENsaWNrLCAxLAotCSBQeURvY19TVFIoIihQb2ludCBwdCwgRXZlbnRNb2RpZmllcnMgbW9kaWZpZXJzKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiTEFkZFRvQ2VsbCIsIChQeUNGdW5jdGlvbilMaXN0T2JqX0xBZGRUb0NlbGwsIDEsCi0JIFB5RG9jX1NUUigiKEJ1ZmZlciBkYXRhUHRyLCBQb2ludCB0aGVDZWxsKSAtPiBOb25lIil9LAotCXsiTENsckNlbGwiLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9MQ2xyQ2VsbCwgMSwKLQkgUHlEb2NfU1RSKCIoUG9pbnQgdGhlQ2VsbCkgLT4gTm9uZSIpfSwKLQl7IkxHZXRDZWxsIiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfTEdldENlbGwsIDEsCi0JIFB5RG9jX1NUUigiKEJ1ZmZlciBkYXRhUHRyLCBQb2ludCB0aGVDZWxsKSAtPiAoQnVmZmVyIGRhdGFQdHIpIil9LAotCXsiTFJlY3QiLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9MUmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoUG9pbnQgdGhlQ2VsbCkgLT4gKFJlY3QgY2VsbFJlY3QpIil9LAotCXsiTFNldENlbGwiLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9MU2V0Q2VsbCwgMSwKLQkgUHlEb2NfU1RSKCIoQnVmZmVyIGRhdGFQdHIsIFBvaW50IHRoZUNlbGwpIC0+IE5vbmUiKX0sCi0JeyJMU2V0U2VsZWN0IiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfTFNldFNlbGVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoQm9vbGVhbiBzZXRJdCwgUG9pbnQgdGhlQ2VsbCkgLT4gTm9uZSIpfSwKLQl7IkxEcmF3IiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfTERyYXcsIDEsCi0JIFB5RG9jX1NUUigiKFBvaW50IHRoZUNlbGwpIC0+IE5vbmUiKX0sCi0JeyJMR2V0Q2VsbERhdGFMb2NhdGlvbiIsIChQeUNGdW5jdGlvbilMaXN0T2JqX0xHZXRDZWxsRGF0YUxvY2F0aW9uLCAxLAotCSBQeURvY19TVFIoIihQb2ludCB0aGVDZWxsKSAtPiAoc2hvcnQgb2Zmc2V0LCBzaG9ydCBsZW4pIil9LAotCXsiR2V0TGlzdFBvcnQiLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9HZXRMaXN0UG9ydCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ0dyYWZQdHIgX3J2KSIpfSwKLQl7IkdldExpc3RWZXJ0aWNhbFNjcm9sbEJhciIsIChQeUNGdW5jdGlvbilMaXN0T2JqX0dldExpc3RWZXJ0aWNhbFNjcm9sbEJhciwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ29udHJvbEhhbmRsZSBfcnYpIil9LAotCXsiR2V0TGlzdEhvcml6b250YWxTY3JvbGxCYXIiLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9HZXRMaXN0SG9yaXpvbnRhbFNjcm9sbEJhciwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ29udHJvbEhhbmRsZSBfcnYpIil9LAotCXsiR2V0TGlzdEFjdGl2ZSIsIChQeUNGdW5jdGlvbilMaXN0T2JqX0dldExpc3RBY3RpdmUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IkdldExpc3RDbGlja1RpbWUiLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9HZXRMaXN0Q2xpY2tUaW1lLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChTSW50MzIgX3J2KSIpfSwKLQl7IkdldExpc3RSZWZDb24iLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9HZXRMaXN0UmVmQ29uLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChTSW50MzIgX3J2KSIpfSwKLQl7IkdldExpc3REZWZpbml0aW9uIiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfR2V0TGlzdERlZmluaXRpb24sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEhhbmRsZSBfcnYpIil9LAotCXsiR2V0TGlzdFVzZXJIYW5kbGUiLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9HZXRMaXN0VXNlckhhbmRsZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoSGFuZGxlIF9ydikiKX0sCi0JeyJHZXRMaXN0RGF0YUhhbmRsZSIsIChQeUNGdW5jdGlvbilMaXN0T2JqX0dldExpc3REYXRhSGFuZGxlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChEYXRhSGFuZGxlIF9ydikiKX0sCi0JeyJHZXRMaXN0RmxhZ3MiLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9HZXRMaXN0RmxhZ3MsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKE9wdGlvbkJpdHMgX3J2KSIpfSwKLQl7IkdldExpc3RTZWxlY3Rpb25GbGFncyIsIChQeUNGdW5jdGlvbilMaXN0T2JqX0dldExpc3RTZWxlY3Rpb25GbGFncywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoT3B0aW9uQml0cyBfcnYpIil9LAotCXsiYXNfUmVzb3VyY2UiLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9hc19SZXNvdXJjZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoSGFuZGxlIF9ydikiKX0sCi0Je05VTEwsIE5VTEwsIDB9CisgICAgeyJMQWRkQ29sdW1uIiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfTEFkZENvbHVtbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgY291bnQsIHNob3J0IGNvbE51bSkgLT4gKHNob3J0IF9ydikiKX0sCisgICAgeyJMQWRkUm93IiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfTEFkZFJvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgY291bnQsIHNob3J0IHJvd051bSkgLT4gKHNob3J0IF9ydikiKX0sCisgICAgeyJMRGVsQ29sdW1uIiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfTERlbENvbHVtbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgY291bnQsIHNob3J0IGNvbE51bSkgLT4gTm9uZSIpfSwKKyAgICB7IkxEZWxSb3ciLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9MRGVsUm93LCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBjb3VudCwgc2hvcnQgcm93TnVtKSAtPiBOb25lIil9LAorICAgIHsiTEdldFNlbGVjdCIsIChQeUNGdW5jdGlvbilMaXN0T2JqX0xHZXRTZWxlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKEJvb2xlYW4gbmV4dCwgUG9pbnQgdGhlQ2VsbCkgLT4gKEJvb2xlYW4gX3J2LCBQb2ludCB0aGVDZWxsKSIpfSwKKyAgICB7IkxMYXN0Q2xpY2siLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9MTGFzdENsaWNrLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChQb2ludCBfcnYpIil9LAorICAgIHsiTE5leHRDZWxsIiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfTE5leHRDZWxsLCAxLAorICAgICBQeURvY19TVFIoIihCb29sZWFuIGhOZXh0LCBCb29sZWFuIHZOZXh0LCBQb2ludCB0aGVDZWxsKSAtPiAoQm9vbGVhbiBfcnYsIFBvaW50IHRoZUNlbGwpIil9LAorICAgIHsiTFNpemUiLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9MU2l6ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgbGlzdFdpZHRoLCBzaG9ydCBsaXN0SGVpZ2h0KSAtPiBOb25lIil9LAorICAgIHsiTFNldERyYXdpbmdNb2RlIiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfTFNldERyYXdpbmdNb2RlLCAxLAorICAgICBQeURvY19TVFIoIihCb29sZWFuIGRyYXdJdCkgLT4gTm9uZSIpfSwKKyAgICB7IkxTY3JvbGwiLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9MU2Nyb2xsLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBkQ29scywgc2hvcnQgZFJvd3MpIC0+IE5vbmUiKX0sCisgICAgeyJMQXV0b1Njcm9sbCIsIChQeUNGdW5jdGlvbilMaXN0T2JqX0xBdXRvU2Nyb2xsLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJMVXBkYXRlIiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfTFVwZGF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHRoZVJnbikgLT4gTm9uZSIpfSwKKyAgICB7IkxBY3RpdmF0ZSIsIChQeUNGdW5jdGlvbilMaXN0T2JqX0xBY3RpdmF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQm9vbGVhbiBhY3QpIC0+IE5vbmUiKX0sCisgICAgeyJMQ2VsbFNpemUiLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9MQ2VsbFNpemUsIDEsCisgICAgIFB5RG9jX1NUUigiKFBvaW50IGNTaXplKSAtPiBOb25lIil9LAorICAgIHsiTENsaWNrIiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfTENsaWNrLCAxLAorICAgICBQeURvY19TVFIoIihQb2ludCBwdCwgRXZlbnRNb2RpZmllcnMgbW9kaWZpZXJzKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiTEFkZFRvQ2VsbCIsIChQeUNGdW5jdGlvbilMaXN0T2JqX0xBZGRUb0NlbGwsIDEsCisgICAgIFB5RG9jX1NUUigiKEJ1ZmZlciBkYXRhUHRyLCBQb2ludCB0aGVDZWxsKSAtPiBOb25lIil9LAorICAgIHsiTENsckNlbGwiLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9MQ2xyQ2VsbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgdGhlQ2VsbCkgLT4gTm9uZSIpfSwKKyAgICB7IkxHZXRDZWxsIiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfTEdldENlbGwsIDEsCisgICAgIFB5RG9jX1NUUigiKEJ1ZmZlciBkYXRhUHRyLCBQb2ludCB0aGVDZWxsKSAtPiAoQnVmZmVyIGRhdGFQdHIpIil9LAorICAgIHsiTFJlY3QiLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9MUmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgdGhlQ2VsbCkgLT4gKFJlY3QgY2VsbFJlY3QpIil9LAorICAgIHsiTFNldENlbGwiLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9MU2V0Q2VsbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQnVmZmVyIGRhdGFQdHIsIFBvaW50IHRoZUNlbGwpIC0+IE5vbmUiKX0sCisgICAgeyJMU2V0U2VsZWN0IiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfTFNldFNlbGVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQm9vbGVhbiBzZXRJdCwgUG9pbnQgdGhlQ2VsbCkgLT4gTm9uZSIpfSwKKyAgICB7IkxEcmF3IiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfTERyYXcsIDEsCisgICAgIFB5RG9jX1NUUigiKFBvaW50IHRoZUNlbGwpIC0+IE5vbmUiKX0sCisgICAgeyJMR2V0Q2VsbERhdGFMb2NhdGlvbiIsIChQeUNGdW5jdGlvbilMaXN0T2JqX0xHZXRDZWxsRGF0YUxvY2F0aW9uLCAxLAorICAgICBQeURvY19TVFIoIihQb2ludCB0aGVDZWxsKSAtPiAoc2hvcnQgb2Zmc2V0LCBzaG9ydCBsZW4pIil9LAorICAgIHsiR2V0TGlzdFBvcnQiLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9HZXRMaXN0UG9ydCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ0dyYWZQdHIgX3J2KSIpfSwKKyAgICB7IkdldExpc3RWZXJ0aWNhbFNjcm9sbEJhciIsIChQeUNGdW5jdGlvbilMaXN0T2JqX0dldExpc3RWZXJ0aWNhbFNjcm9sbEJhciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ29udHJvbEhhbmRsZSBfcnYpIil9LAorICAgIHsiR2V0TGlzdEhvcml6b250YWxTY3JvbGxCYXIiLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9HZXRMaXN0SG9yaXpvbnRhbFNjcm9sbEJhciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ29udHJvbEhhbmRsZSBfcnYpIil9LAorICAgIHsiR2V0TGlzdEFjdGl2ZSIsIChQeUNGdW5jdGlvbilMaXN0T2JqX0dldExpc3RBY3RpdmUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IkdldExpc3RDbGlja1RpbWUiLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9HZXRMaXN0Q2xpY2tUaW1lLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChTSW50MzIgX3J2KSIpfSwKKyAgICB7IkdldExpc3RSZWZDb24iLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9HZXRMaXN0UmVmQ29uLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChTSW50MzIgX3J2KSIpfSwKKyAgICB7IkdldExpc3REZWZpbml0aW9uIiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfR2V0TGlzdERlZmluaXRpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEhhbmRsZSBfcnYpIil9LAorICAgIHsiR2V0TGlzdFVzZXJIYW5kbGUiLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9HZXRMaXN0VXNlckhhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoSGFuZGxlIF9ydikiKX0sCisgICAgeyJHZXRMaXN0RGF0YUhhbmRsZSIsIChQeUNGdW5jdGlvbilMaXN0T2JqX0dldExpc3REYXRhSGFuZGxlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChEYXRhSGFuZGxlIF9ydikiKX0sCisgICAgeyJHZXRMaXN0RmxhZ3MiLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9HZXRMaXN0RmxhZ3MsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKE9wdGlvbkJpdHMgX3J2KSIpfSwKKyAgICB7IkdldExpc3RTZWxlY3Rpb25GbGFncyIsIChQeUNGdW5jdGlvbilMaXN0T2JqX0dldExpc3RTZWxlY3Rpb25GbGFncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoT3B0aW9uQml0cyBfcnYpIil9LAorICAgIHsiYXNfUmVzb3VyY2UiLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9hc19SZXNvdXJjZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoSGFuZGxlIF9ydikiKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKkxpc3RPYmpfZ2V0X2xpc3RGbGFncyhMaXN0T2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJsIiwgKGxvbmcpR2V0TGlzdEZsYWdzKHNlbGYtPm9iX2l0c2VsZikgJiAweGZmKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgibCIsIChsb25nKUdldExpc3RGbGFncyhzZWxmLT5vYl9pdHNlbGYpICYgMHhmZik7CiB9CiAKIHN0YXRpYyBpbnQgTGlzdE9ial9zZXRfbGlzdEZsYWdzKExpc3RPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp2LCB2b2lkICpjbG9zdXJlKQogewotCWlmICghUHlBcmdfUGFyc2UodiwgIkIiLCAmKCpzZWxmLT5vYl9pdHNlbGYpLT5saXN0RmxhZ3MpKSByZXR1cm4gLTE7Ci0JcmV0dXJuIDA7CisgICAgaWYgKCFQeUFyZ19QYXJzZSh2LCAiQiIsICYoKnNlbGYtPm9iX2l0c2VsZiktPmxpc3RGbGFncykpIHJldHVybiAtMTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpMaXN0T2JqX2dldF9zZWxGbGFncyhMaXN0T2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJsIiwgKGxvbmcpR2V0TGlzdFNlbGVjdGlvbkZsYWdzKHNlbGYtPm9iX2l0c2VsZikgJiAweGZmKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgibCIsIChsb25nKUdldExpc3RTZWxlY3Rpb25GbGFncyhzZWxmLT5vYl9pdHNlbGYpICYgMHhmZik7CiB9CiAKIHN0YXRpYyBpbnQgTGlzdE9ial9zZXRfc2VsRmxhZ3MoTGlzdE9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JaWYgKCFQeUFyZ19QYXJzZSh2LCAiQiIsICYoKnNlbGYtPm9iX2l0c2VsZiktPnNlbEZsYWdzKSkgcmV0dXJuIC0xOwotCXJldHVybiAwOworICAgIGlmICghUHlBcmdfUGFyc2UodiwgIkIiLCAmKCpzZWxmLT5vYl9pdHNlbGYpLT5zZWxGbGFncykpIHJldHVybiAtMTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpMaXN0T2JqX2dldF9jZWxsU2l6ZShMaXN0T2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJPJiIsIFB5TWFjX0J1aWxkUG9pbnQsICgqc2VsZi0+b2JfaXRzZWxmKS0+Y2VsbFNpemUpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPJiIsIFB5TWFjX0J1aWxkUG9pbnQsICgqc2VsZi0+b2JfaXRzZWxmKS0+Y2VsbFNpemUpOwogfQogCiBzdGF0aWMgaW50IExpc3RPYmpfc2V0X2NlbGxTaXplKExpc3RPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp2LCB2b2lkICpjbG9zdXJlKQogewotCWlmICghUHlBcmdfUGFyc2UodiwgIk8mIiwgUHlNYWNfR2V0UG9pbnQsICYoKnNlbGYtPm9iX2l0c2VsZiktPmNlbGxTaXplKSkgcmV0dXJuIC0xOwotCXJldHVybiAwOworICAgIGlmICghUHlBcmdfUGFyc2UodiwgIk8mIiwgUHlNYWNfR2V0UG9pbnQsICYoKnNlbGYtPm9iX2l0c2VsZiktPmNlbGxTaXplKSkgcmV0dXJuIC0xOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlHZXRTZXREZWYgTGlzdE9ial9nZXRzZXRsaXN0W10gPSB7Ci0JeyJsaXN0RmxhZ3MiLCAoZ2V0dGVyKUxpc3RPYmpfZ2V0X2xpc3RGbGFncywgKHNldHRlcilMaXN0T2JqX3NldF9saXN0RmxhZ3MsIE5VTEx9LAotCXsic2VsRmxhZ3MiLCAoZ2V0dGVyKUxpc3RPYmpfZ2V0X3NlbEZsYWdzLCAoc2V0dGVyKUxpc3RPYmpfc2V0X3NlbEZsYWdzLCBOVUxMfSwKLQl7ImNlbGxTaXplIiwgKGdldHRlcilMaXN0T2JqX2dldF9jZWxsU2l6ZSwgKHNldHRlcilMaXN0T2JqX3NldF9jZWxsU2l6ZSwgTlVMTH0sCi0Je05VTEwsIE5VTEwsIE5VTEwsIE5VTEx9LAorICAgIHsibGlzdEZsYWdzIiwgKGdldHRlcilMaXN0T2JqX2dldF9saXN0RmxhZ3MsIChzZXR0ZXIpTGlzdE9ial9zZXRfbGlzdEZsYWdzLCBOVUxMfSwKKyAgICB7InNlbEZsYWdzIiwgKGdldHRlcilMaXN0T2JqX2dldF9zZWxGbGFncywgKHNldHRlcilMaXN0T2JqX3NldF9zZWxGbGFncywgTlVMTH0sCisgICAgeyJjZWxsU2l6ZSIsIChnZXR0ZXIpTGlzdE9ial9nZXRfY2VsbFNpemUsIChzZXR0ZXIpTGlzdE9ial9zZXRfY2VsbFNpemUsIE5VTEx9LAorICAgIHtOVUxMLCBOVUxMLCBOVUxMLCBOVUxMfSwKIH07CiAKIApAQCAtNzQyLDYxICs3NDIsNjEgQEAKIAogc3RhdGljIFB5T2JqZWN0ICpMaXN0T2JqX3RwX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICpfYXJncywgUHlPYmplY3QgKl9rd2RzKQogewotCVB5T2JqZWN0ICpfc2VsZjsKLQlMaXN0SGFuZGxlIGl0c2VsZjsKLQljaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKKyAgICBQeU9iamVjdCAqX3NlbGY7CisgICAgTGlzdEhhbmRsZSBpdHNlbGY7CisgICAgY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBMaXN0T2JqX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKLQlpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOwotCSgoTGlzdE9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiBfc2VsZjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBMaXN0T2JqX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOworICAgICgoTGlzdE9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIHJldHVybiBfc2VsZjsKIH0KIAogI2RlZmluZSBMaXN0T2JqX3RwX2ZyZWUgUHlPYmplY3RfRGVsCiAKIAogUHlUeXBlT2JqZWN0IExpc3RfVHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKLQkwLCAvKm9iX3NpemUqLwotCSJfTGlzdC5MaXN0IiwgLyp0cF9uYW1lKi8KLQlzaXplb2YoTGlzdE9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KLQkwLCAvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpIExpc3RPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KLQkwLCAvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykgTGlzdE9ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYykgTGlzdE9ial9yZXByLCAvKnRwX3JlcHIqLwotCShQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KLQkoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLwotCShQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYykgTGlzdE9ial9oYXNoLCAvKnRwX2hhc2gqLwotCTAsIC8qdHBfY2FsbCovCi0JMCwgLyp0cF9zdHIqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KLQlQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLwotCTAsIC8qdHBfYXNfYnVmZmVyKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQkwLCAvKnRwX2RvYyovCi0JMCwgLyp0cF90cmF2ZXJzZSovCi0JMCwgLyp0cF9jbGVhciovCi0JMCwgLyp0cF9yaWNoY29tcGFyZSovCi0JMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCi0JMCwgLyp0cF9pdGVyKi8KLQkwLCAvKnRwX2l0ZXJuZXh0Ki8KLQlMaXN0T2JqX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KLQkwLCAvKnRwX21lbWJlcnMqLwotCUxpc3RPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLwotCTAsIC8qdHBfYmFzZSovCi0JMCwgLyp0cF9kaWN0Ki8KLQkwLCAvKnRwX2Rlc2NyX2dldCovCi0JMCwgLyp0cF9kZXNjcl9zZXQqLwotCTAsIC8qdHBfZGljdG9mZnNldCovCi0JTGlzdE9ial90cF9pbml0LCAvKiB0cF9pbml0ICovCi0JTGlzdE9ial90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KLQlMaXN0T2JqX3RwX25ldywgLyogdHBfbmV3ICovCi0JTGlzdE9ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgLypvYl9zaXplKi8KKyAgICAiX0xpc3QuTGlzdCIsIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKExpc3RPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKSBMaXN0T2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgMCwgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCisgICAgKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCisgICAgKGNtcGZ1bmMpIExpc3RPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpIExpc3RPYmpfcmVwciwgLyp0cF9yZXByKi8KKyAgICAoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCisgICAgKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAoaGFzaGZ1bmMpIExpc3RPYmpfaGFzaCwgLyp0cF9oYXNoKi8KKyAgICAwLCAvKnRwX2NhbGwqLworICAgIDAsIC8qdHBfc3RyKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCisgICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgMCwgLyp0cF9kb2MqLworICAgIDAsIC8qdHBfdHJhdmVyc2UqLworICAgIDAsIC8qdHBfY2xlYXIqLworICAgIDAsIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsIC8qdHBfaXRlciovCisgICAgMCwgLyp0cF9pdGVybmV4dCovCisgICAgTGlzdE9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCisgICAgMCwgLyp0cF9tZW1iZXJzKi8KKyAgICBMaXN0T2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KKyAgICAwLCAvKnRwX2Jhc2UqLworICAgIDAsIC8qdHBfZGljdCovCisgICAgMCwgLyp0cF9kZXNjcl9nZXQqLworICAgIDAsIC8qdHBfZGVzY3Jfc2V0Ki8KKyAgICAwLCAvKnRwX2RpY3RvZmZzZXQqLworICAgIExpc3RPYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLworICAgIExpc3RPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCisgICAgTGlzdE9ial90cF9uZXcsIC8qIHRwX25ldyAqLworICAgIExpc3RPYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBFbmQgb2JqZWN0IHR5cGUgTGlzdCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC04MDQsMjYzICs4MDQsMjYzIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqTGlzdF9DcmVhdGVDdXN0b21MaXN0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZWN0IHJWaWV3OwotCVJlY3QgZGF0YUJvdW5kczsKLQlQb2ludCBjZWxsU2l6ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmVjdCByVmlldzsKKyAgICBSZWN0IGRhdGFCb3VuZHM7CisgICAgUG9pbnQgY2VsbFNpemU7CiAKLQlQeU9iamVjdCAqbGlzdERlZkZ1bmM7Ci0JTGlzdERlZlNwZWMgdGhlU3BlYzsKLQlXaW5kb3dQdHIgdGhlV2luZG93OwotCUJvb2xlYW4gZHJhd0l0OwotCUJvb2xlYW4gaGFzR3JvdzsKLQlCb29sZWFuIHNjcm9sbEhvcml6OwotCUJvb2xlYW4gc2Nyb2xsVmVydDsKLQlMaXN0SGFuZGxlIG91dExpc3Q7CisgICAgUHlPYmplY3QgKmxpc3REZWZGdW5jOworICAgIExpc3REZWZTcGVjIHRoZVNwZWM7CisgICAgV2luZG93UHRyIHRoZVdpbmRvdzsKKyAgICBCb29sZWFuIGRyYXdJdDsKKyAgICBCb29sZWFuIGhhc0dyb3c7CisgICAgQm9vbGVhbiBzY3JvbGxIb3JpejsKKyAgICBCb29sZWFuIHNjcm9sbFZlcnQ7CisgICAgTGlzdEhhbmRsZSBvdXRMaXN0OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mKGlPKU8mYmJiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyVmlldywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmRhdGFCb3VuZHMsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmY2VsbFNpemUsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aGVTcGVjLmRlZlR5cGUsICZsaXN0RGVmRnVuYywKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ0aGVXaW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICZkcmF3SXQsCi0JICAgICAgICAgICAgICAgICAgICAgICZoYXNHcm93LAotCSAgICAgICAgICAgICAgICAgICAgICAmc2Nyb2xsSG9yaXosCi0JICAgICAgICAgICAgICAgICAgICAgICZzY3JvbGxWZXJ0KSkKLQkgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJihpTylPJmJiYmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmclZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZkYXRhQm91bmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJmNlbGxTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlU3BlYy5kZWZUeXBlLCAmbGlzdERlZkZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmdGhlV2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZHJhd0l0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaGFzR3JvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNjcm9sbEhvcml6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2Nyb2xsVmVydCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCiAKLQkvKiBDYXJib24gYXBwbGljYXRpb25zIHVzZSB0aGUgQ3JlYXRlQ3VzdG9tTGlzdCBBUEkgKi8KLQl0aGVTcGVjLnUudXNlclByb2MgPSBteUxpc3REZWZGdW5jdGlvblVQUDsKLQlDcmVhdGVDdXN0b21MaXN0KCZyVmlldywKLQkgICAgICAgICAgICAgICAgICZkYXRhQm91bmRzLAotCSAgICAgICAgICAgICAgICAgY2VsbFNpemUsCi0JICAgICAgICAgICAgICAgICAmdGhlU3BlYywKLQkgICAgICAgICAgICAgICAgIHRoZVdpbmRvdywKLQkgICAgICAgICAgICAgICAgIGRyYXdJdCwKLQkgICAgICAgICAgICAgICAgIGhhc0dyb3csCi0JICAgICAgICAgICAgICAgICBzY3JvbGxIb3JpeiwKLQkgICAgICAgICAgICAgICAgIHNjcm9sbFZlcnQsCi0JICAgICAgICAgICAgICAgICAmb3V0TGlzdCk7CisgICAgLyogQ2FyYm9uIGFwcGxpY2F0aW9ucyB1c2UgdGhlIENyZWF0ZUN1c3RvbUxpc3QgQVBJICovCisgICAgdGhlU3BlYy51LnVzZXJQcm9jID0gbXlMaXN0RGVmRnVuY3Rpb25VUFA7CisgICAgQ3JlYXRlQ3VzdG9tTGlzdCgmclZpZXcsCisgICAgICAgICAgICAgICAgICAgICAmZGF0YUJvdW5kcywKKyAgICAgICAgICAgICAgICAgICAgIGNlbGxTaXplLAorICAgICAgICAgICAgICAgICAgICAgJnRoZVNwZWMsCisgICAgICAgICAgICAgICAgICAgICB0aGVXaW5kb3csCisgICAgICAgICAgICAgICAgICAgICBkcmF3SXQsCisgICAgICAgICAgICAgICAgICAgICBoYXNHcm93LAorICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsSG9yaXosCisgICAgICAgICAgICAgICAgICAgICBzY3JvbGxWZXJ0LAorICAgICAgICAgICAgICAgICAgICAgJm91dExpc3QpOwogCiAKLQlfcmVzID0gTGlzdE9ial9OZXcob3V0TGlzdCk7Ci0JaWYgKF9yZXMgPT0gTlVMTCkKLQkgICAgICAgIHJldHVybiBOVUxMOwotCVB5X0lOQ1JFRihsaXN0RGVmRnVuYyk7Ci0JKChMaXN0T2JqZWN0KilfcmVzKS0+b2JfbGRlZl9mdW5jID0gbGlzdERlZkZ1bmM7Ci0JcmV0dXJuIF9yZXM7CisgICAgX3JlcyA9IExpc3RPYmpfTmV3KG91dExpc3QpOworICAgIGlmIChfcmVzID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5X0lOQ1JFRihsaXN0RGVmRnVuYyk7CisgICAgKChMaXN0T2JqZWN0KilfcmVzKS0+b2JfbGRlZl9mdW5jID0gbGlzdERlZkZ1bmM7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTGlzdF9MTmV3KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlMaXN0SGFuZGxlIF9ydjsKLQlSZWN0IHJWaWV3OwotCVJlY3QgZGF0YUJvdW5kczsKLQlQb2ludCBjU2l6ZTsKLQlzaG9ydCB0aGVQcm9jOwotCVdpbmRvd1B0ciB0aGVXaW5kb3c7Ci0JQm9vbGVhbiBkcmF3SXQ7Ci0JQm9vbGVhbiBoYXNHcm93OwotCUJvb2xlYW4gc2Nyb2xsSG9yaXo7Ci0JQm9vbGVhbiBzY3JvbGxWZXJ0OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmhPJmJiYmIiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmclZpZXcsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZkYXRhQm91bmRzLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJmNTaXplLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGhlUHJvYywKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ0aGVXaW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICZkcmF3SXQsCi0JICAgICAgICAgICAgICAgICAgICAgICZoYXNHcm93LAotCSAgICAgICAgICAgICAgICAgICAgICAmc2Nyb2xsSG9yaXosCi0JICAgICAgICAgICAgICAgICAgICAgICZzY3JvbGxWZXJ0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTE5ldygmclZpZXcsCi0JICAgICAgICAgICAmZGF0YUJvdW5kcywKLQkgICAgICAgICAgIGNTaXplLAotCSAgICAgICAgICAgdGhlUHJvYywKLQkgICAgICAgICAgIHRoZVdpbmRvdywKLQkgICAgICAgICAgIGRyYXdJdCwKLQkgICAgICAgICAgIGhhc0dyb3csCi0JICAgICAgICAgICBzY3JvbGxIb3JpeiwKLQkgICAgICAgICAgIHNjcm9sbFZlcnQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgTGlzdE9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIExpc3RIYW5kbGUgX3J2OworICAgIFJlY3QgclZpZXc7CisgICAgUmVjdCBkYXRhQm91bmRzOworICAgIFBvaW50IGNTaXplOworICAgIHNob3J0IHRoZVByb2M7CisgICAgV2luZG93UHRyIHRoZVdpbmRvdzsKKyAgICBCb29sZWFuIGRyYXdJdDsKKyAgICBCb29sZWFuIGhhc0dyb3c7CisgICAgQm9vbGVhbiBzY3JvbGxIb3JpejsKKyAgICBCb29sZWFuIHNjcm9sbFZlcnQ7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8maE8mYmJiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmRhdGFCb3VuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmY1NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVQcm9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJnRoZVdpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRyYXdJdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmhhc0dyb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzY3JvbGxIb3JpeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNjcm9sbFZlcnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBMTmV3KCZyVmlldywKKyAgICAgICAgICAgICAgICZkYXRhQm91bmRzLAorICAgICAgICAgICAgICAgY1NpemUsCisgICAgICAgICAgICAgICB0aGVQcm9jLAorICAgICAgICAgICAgICAgdGhlV2luZG93LAorICAgICAgICAgICAgICAgZHJhd0l0LAorICAgICAgICAgICAgICAgaGFzR3JvdywKKyAgICAgICAgICAgICAgIHNjcm9sbEhvcml6LAorICAgICAgICAgICAgICAgc2Nyb2xsVmVydCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0T2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpMaXN0X1NldExpc3RWaWV3Qm91bmRzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlMaXN0SGFuZGxlIGxpc3Q7Ci0JUmVjdCB2aWV3OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBMaXN0T2JqX0NvbnZlcnQsICZsaXN0LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmdmlldykpCi0JCXJldHVybiBOVUxMOwotCVNldExpc3RWaWV3Qm91bmRzKGxpc3QsCi0JICAgICAgICAgICAgICAgICAgJnZpZXcpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgTGlzdEhhbmRsZSBsaXN0OworICAgIFJlY3QgdmlldzsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdE9ial9Db252ZXJ0LCAmbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnZpZXcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRMaXN0Vmlld0JvdW5kcyhsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICZ2aWV3KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTGlzdF9TZXRMaXN0UG9ydChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JTGlzdEhhbmRsZSBsaXN0OwotCUNHcmFmUHRyIHBvcnQ7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIExpc3RPYmpfQ29udmVydCwgJmxpc3QsCi0JICAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfQ29udmVydCwgJnBvcnQpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRMaXN0UG9ydChsaXN0LAotCSAgICAgICAgICAgIHBvcnQpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgTGlzdEhhbmRsZSBsaXN0OworICAgIENHcmFmUHRyIHBvcnQ7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3RPYmpfQ29udmVydCwgJmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfQ29udmVydCwgJnBvcnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRMaXN0UG9ydChsaXN0LAorICAgICAgICAgICAgICAgIHBvcnQpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpMaXN0X1NldExpc3RDZWxsSW5kZW50KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlMaXN0SGFuZGxlIGxpc3Q7Ci0JUG9pbnQgaW5kZW50OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBMaXN0T2JqX0NvbnZlcnQsICZsaXN0LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJmluZGVudCkpCi0JCXJldHVybiBOVUxMOwotCVNldExpc3RDZWxsSW5kZW50KGxpc3QsCi0JICAgICAgICAgICAgICAgICAgJmluZGVudCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBMaXN0SGFuZGxlIGxpc3Q7CisgICAgUG9pbnQgaW5kZW50OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0T2JqX0NvbnZlcnQsICZsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJmluZGVudCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldExpc3RDZWxsSW5kZW50KGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgJmluZGVudCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkxpc3RfU2V0TGlzdENsaWNrVGltZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JTGlzdEhhbmRsZSBsaXN0OwotCVNJbnQzMiB0aW1lOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIExpc3RPYmpfQ29udmVydCwgJmxpc3QsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0TGlzdENsaWNrVGltZShsaXN0LAotCSAgICAgICAgICAgICAgICAgdGltZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBMaXN0SGFuZGxlIGxpc3Q7CisgICAgU0ludDMyIHRpbWU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdE9ial9Db252ZXJ0LCAmbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRpbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRMaXN0Q2xpY2tUaW1lKGxpc3QsCisgICAgICAgICAgICAgICAgICAgICB0aW1lKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTGlzdF9TZXRMaXN0UmVmQ29uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlMaXN0SGFuZGxlIGxpc3Q7Ci0JU0ludDMyIHJlZkNvbjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBMaXN0T2JqX0NvbnZlcnQsICZsaXN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVmQ29uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0TGlzdFJlZkNvbihsaXN0LAotCSAgICAgICAgICAgICAgcmVmQ29uKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIExpc3RIYW5kbGUgbGlzdDsKKyAgICBTSW50MzIgcmVmQ29uOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3RPYmpfQ29udmVydCwgJmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWZDb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRMaXN0UmVmQ29uKGxpc3QsCisgICAgICAgICAgICAgICAgICByZWZDb24pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpMaXN0X1NldExpc3RVc2VySGFuZGxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlMaXN0SGFuZGxlIGxpc3Q7Ci0JSGFuZGxlIHVzZXJIYW5kbGU7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIExpc3RPYmpfQ29udmVydCwgJmxpc3QsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdXNlckhhbmRsZSkpCi0JCXJldHVybiBOVUxMOwotCVNldExpc3RVc2VySGFuZGxlKGxpc3QsCi0JICAgICAgICAgICAgICAgICAgdXNlckhhbmRsZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBMaXN0SGFuZGxlIGxpc3Q7CisgICAgSGFuZGxlIHVzZXJIYW5kbGU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3RPYmpfQ29udmVydCwgJmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdXNlckhhbmRsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldExpc3RVc2VySGFuZGxlKGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgdXNlckhhbmRsZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkxpc3RfU2V0TGlzdEZsYWdzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlMaXN0SGFuZGxlIGxpc3Q7Ci0JT3B0aW9uQml0cyBsaXN0RmxhZ3M7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgTGlzdE9ial9Db252ZXJ0LCAmbGlzdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmxpc3RGbGFncykpCi0JCXJldHVybiBOVUxMOwotCVNldExpc3RGbGFncyhsaXN0LAotCSAgICAgICAgICAgICBsaXN0RmxhZ3MpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgTGlzdEhhbmRsZSBsaXN0OworICAgIE9wdGlvbkJpdHMgbGlzdEZsYWdzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3RPYmpfQ29udmVydCwgJmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZsaXN0RmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRMaXN0RmxhZ3MobGlzdCwKKyAgICAgICAgICAgICAgICAgbGlzdEZsYWdzKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTGlzdF9TZXRMaXN0U2VsZWN0aW9uRmxhZ3MoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUxpc3RIYW5kbGUgbGlzdDsKLQlPcHRpb25CaXRzIHNlbGVjdGlvbkZsYWdzOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIExpc3RPYmpfQ29udmVydCwgJmxpc3QsCi0JICAgICAgICAgICAgICAgICAgICAgICZzZWxlY3Rpb25GbGFncykpCi0JCXJldHVybiBOVUxMOwotCVNldExpc3RTZWxlY3Rpb25GbGFncyhsaXN0LAotCSAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25GbGFncyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBMaXN0SGFuZGxlIGxpc3Q7CisgICAgT3B0aW9uQml0cyBzZWxlY3Rpb25GbGFnczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0T2JqX0NvbnZlcnQsICZsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VsZWN0aW9uRmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRMaXN0U2VsZWN0aW9uRmxhZ3MobGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uRmxhZ3MpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpMaXN0X2FzX0xpc3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKIAotCUhhbmRsZSBoOwotCUxpc3RPYmplY3QgKmw7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLCBSZXNPYmpfQ29udmVydCwgJmgpKQotCSAgICAgICAgcmV0dXJuIE5VTEw7Ci0JbCA9IChMaXN0T2JqZWN0ICopTGlzdE9ial9OZXcoYXNfTGlzdChoKSk7Ci0JbC0+b2JfbXVzdF9iZV9kaXNwb3NlZCA9IDA7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8iLCBsKTsKLQlyZXR1cm4gX3JlczsKKyAgICBIYW5kbGUgaDsKKyAgICBMaXN0T2JqZWN0ICpsOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwgUmVzT2JqX0NvbnZlcnQsICZoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbCA9IChMaXN0T2JqZWN0ICopTGlzdE9ial9OZXcoYXNfTGlzdChoKSk7CisgICAgbC0+b2JfbXVzdF9iZV9kaXNwb3NlZCA9IDA7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8iLCBsKTsKKyAgICByZXR1cm4gX3JlczsKIAogfQogI2VuZGlmIC8qIF9fTFA2NF9fICovCiAKIHN0YXRpYyBQeU1ldGhvZERlZiBMaXN0X21ldGhvZHNbXSA9IHsKICNpZm5kZWYgX19MUDY0X18KLQl7IkNyZWF0ZUN1c3RvbUxpc3QiLCAoUHlDRnVuY3Rpb24pTGlzdF9DcmVhdGVDdXN0b21MaXN0LCAxLAotCSBQeURvY19TVFIoIihSZWN0IHJWaWV3LCBSZWN0IGRhdGFCb3VuZHMsIFBvaW50IGNlbGxTaXplLCBMaXN0RGVmU3BlYyB0aGVTcGVjLCBXaW5kb3dQdHIgdGhlV2luZG93LCBCb29sZWFuIGRyYXdJdCwgQm9vbGVhbiBoYXNHcm93LCBCb29sZWFuIHNjcm9sbEhvcml6LCBCb29sZWFuIHNjcm9sbFZlcnQpIC0+IChMaXN0SGFuZGxlIG91dExpc3QpIil9LAotCXsiTE5ldyIsIChQeUNGdW5jdGlvbilMaXN0X0xOZXcsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgclZpZXcsIFJlY3QgZGF0YUJvdW5kcywgUG9pbnQgY1NpemUsIHNob3J0IHRoZVByb2MsIFdpbmRvd1B0ciB0aGVXaW5kb3csIEJvb2xlYW4gZHJhd0l0LCBCb29sZWFuIGhhc0dyb3csIEJvb2xlYW4gc2Nyb2xsSG9yaXosIEJvb2xlYW4gc2Nyb2xsVmVydCkgLT4gKExpc3RIYW5kbGUgX3J2KSIpfSwKLQl7IlNldExpc3RWaWV3Qm91bmRzIiwgKFB5Q0Z1bmN0aW9uKUxpc3RfU2V0TGlzdFZpZXdCb3VuZHMsIDEsCi0JIFB5RG9jX1NUUigiKExpc3RIYW5kbGUgbGlzdCwgUmVjdCB2aWV3KSAtPiBOb25lIil9LAotCXsiU2V0TGlzdFBvcnQiLCAoUHlDRnVuY3Rpb24pTGlzdF9TZXRMaXN0UG9ydCwgMSwKLQkgUHlEb2NfU1RSKCIoTGlzdEhhbmRsZSBsaXN0LCBDR3JhZlB0ciBwb3J0KSAtPiBOb25lIil9LAotCXsiU2V0TGlzdENlbGxJbmRlbnQiLCAoUHlDRnVuY3Rpb24pTGlzdF9TZXRMaXN0Q2VsbEluZGVudCwgMSwKLQkgUHlEb2NfU1RSKCIoTGlzdEhhbmRsZSBsaXN0LCBQb2ludCBpbmRlbnQpIC0+IE5vbmUiKX0sCi0JeyJTZXRMaXN0Q2xpY2tUaW1lIiwgKFB5Q0Z1bmN0aW9uKUxpc3RfU2V0TGlzdENsaWNrVGltZSwgMSwKLQkgUHlEb2NfU1RSKCIoTGlzdEhhbmRsZSBsaXN0LCBTSW50MzIgdGltZSkgLT4gTm9uZSIpfSwKLQl7IlNldExpc3RSZWZDb24iLCAoUHlDRnVuY3Rpb24pTGlzdF9TZXRMaXN0UmVmQ29uLCAxLAotCSBQeURvY19TVFIoIihMaXN0SGFuZGxlIGxpc3QsIFNJbnQzMiByZWZDb24pIC0+IE5vbmUiKX0sCi0JeyJTZXRMaXN0VXNlckhhbmRsZSIsIChQeUNGdW5jdGlvbilMaXN0X1NldExpc3RVc2VySGFuZGxlLCAxLAotCSBQeURvY19TVFIoIihMaXN0SGFuZGxlIGxpc3QsIEhhbmRsZSB1c2VySGFuZGxlKSAtPiBOb25lIil9LAotCXsiU2V0TGlzdEZsYWdzIiwgKFB5Q0Z1bmN0aW9uKUxpc3RfU2V0TGlzdEZsYWdzLCAxLAotCSBQeURvY19TVFIoIihMaXN0SGFuZGxlIGxpc3QsIE9wdGlvbkJpdHMgbGlzdEZsYWdzKSAtPiBOb25lIil9LAotCXsiU2V0TGlzdFNlbGVjdGlvbkZsYWdzIiwgKFB5Q0Z1bmN0aW9uKUxpc3RfU2V0TGlzdFNlbGVjdGlvbkZsYWdzLCAxLAotCSBQeURvY19TVFIoIihMaXN0SGFuZGxlIGxpc3QsIE9wdGlvbkJpdHMgc2VsZWN0aW9uRmxhZ3MpIC0+IE5vbmUiKX0sCi0JeyJhc19MaXN0IiwgKFB5Q0Z1bmN0aW9uKUxpc3RfYXNfTGlzdCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVzb3VyY2UpLT5MaXN0LlxuUmV0dXJucyBMaXN0IG9iamVjdCAod2hpY2ggaXMgbm90IGF1dG8tZnJlZWQhKSIpfSwKKyAgICB7IkNyZWF0ZUN1c3RvbUxpc3QiLCAoUHlDRnVuY3Rpb24pTGlzdF9DcmVhdGVDdXN0b21MaXN0LCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IHJWaWV3LCBSZWN0IGRhdGFCb3VuZHMsIFBvaW50IGNlbGxTaXplLCBMaXN0RGVmU3BlYyB0aGVTcGVjLCBXaW5kb3dQdHIgdGhlV2luZG93LCBCb29sZWFuIGRyYXdJdCwgQm9vbGVhbiBoYXNHcm93LCBCb29sZWFuIHNjcm9sbEhvcml6LCBCb29sZWFuIHNjcm9sbFZlcnQpIC0+IChMaXN0SGFuZGxlIG91dExpc3QpIil9LAorICAgIHsiTE5ldyIsIChQeUNGdW5jdGlvbilMaXN0X0xOZXcsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgclZpZXcsIFJlY3QgZGF0YUJvdW5kcywgUG9pbnQgY1NpemUsIHNob3J0IHRoZVByb2MsIFdpbmRvd1B0ciB0aGVXaW5kb3csIEJvb2xlYW4gZHJhd0l0LCBCb29sZWFuIGhhc0dyb3csIEJvb2xlYW4gc2Nyb2xsSG9yaXosIEJvb2xlYW4gc2Nyb2xsVmVydCkgLT4gKExpc3RIYW5kbGUgX3J2KSIpfSwKKyAgICB7IlNldExpc3RWaWV3Qm91bmRzIiwgKFB5Q0Z1bmN0aW9uKUxpc3RfU2V0TGlzdFZpZXdCb3VuZHMsIDEsCisgICAgIFB5RG9jX1NUUigiKExpc3RIYW5kbGUgbGlzdCwgUmVjdCB2aWV3KSAtPiBOb25lIil9LAorICAgIHsiU2V0TGlzdFBvcnQiLCAoUHlDRnVuY3Rpb24pTGlzdF9TZXRMaXN0UG9ydCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTGlzdEhhbmRsZSBsaXN0LCBDR3JhZlB0ciBwb3J0KSAtPiBOb25lIil9LAorICAgIHsiU2V0TGlzdENlbGxJbmRlbnQiLCAoUHlDRnVuY3Rpb24pTGlzdF9TZXRMaXN0Q2VsbEluZGVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTGlzdEhhbmRsZSBsaXN0LCBQb2ludCBpbmRlbnQpIC0+IE5vbmUiKX0sCisgICAgeyJTZXRMaXN0Q2xpY2tUaW1lIiwgKFB5Q0Z1bmN0aW9uKUxpc3RfU2V0TGlzdENsaWNrVGltZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTGlzdEhhbmRsZSBsaXN0LCBTSW50MzIgdGltZSkgLT4gTm9uZSIpfSwKKyAgICB7IlNldExpc3RSZWZDb24iLCAoUHlDRnVuY3Rpb24pTGlzdF9TZXRMaXN0UmVmQ29uLCAxLAorICAgICBQeURvY19TVFIoIihMaXN0SGFuZGxlIGxpc3QsIFNJbnQzMiByZWZDb24pIC0+IE5vbmUiKX0sCisgICAgeyJTZXRMaXN0VXNlckhhbmRsZSIsIChQeUNGdW5jdGlvbilMaXN0X1NldExpc3RVc2VySGFuZGxlLCAxLAorICAgICBQeURvY19TVFIoIihMaXN0SGFuZGxlIGxpc3QsIEhhbmRsZSB1c2VySGFuZGxlKSAtPiBOb25lIil9LAorICAgIHsiU2V0TGlzdEZsYWdzIiwgKFB5Q0Z1bmN0aW9uKUxpc3RfU2V0TGlzdEZsYWdzLCAxLAorICAgICBQeURvY19TVFIoIihMaXN0SGFuZGxlIGxpc3QsIE9wdGlvbkJpdHMgbGlzdEZsYWdzKSAtPiBOb25lIil9LAorICAgIHsiU2V0TGlzdFNlbGVjdGlvbkZsYWdzIiwgKFB5Q0Z1bmN0aW9uKUxpc3RfU2V0TGlzdFNlbGVjdGlvbkZsYWdzLCAxLAorICAgICBQeURvY19TVFIoIihMaXN0SGFuZGxlIGxpc3QsIE9wdGlvbkJpdHMgc2VsZWN0aW9uRmxhZ3MpIC0+IE5vbmUiKX0sCisgICAgeyJhc19MaXN0IiwgKFB5Q0Z1bmN0aW9uKUxpc3RfYXNfTGlzdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVzb3VyY2UpLT5MaXN0LlxuUmV0dXJucyBMaXN0IG9iamVjdCAod2hpY2ggaXMgbm90IGF1dG8tZnJlZWQhKSIpfSwKICNlbmRpZiAvKiBfX0xQNjRfXyAqLwotCXtOVUxMLCBOVUxMLCAwfQorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogI2lmbmRlZiBfX0xQNjRfXwpAQCAtMTA3NCw2NSArMTA3NCw2NSBAQAogICAgICAgICAgICAgICAgICAgICAgICBTSW50MTYgZGF0YUxlbiwKICAgICAgICAgICAgICAgICAgICAgICAgTGlzdEhhbmRsZSB0aGVMaXN0KQogewotICAgICAgICBQeU9iamVjdCAqbGlzdERlZkZ1bmMsICphcmdzLCAqcnY9TlVMTDsKLSAgICAgICAgTGlzdE9iamVjdCAqc2VsZjsKKyAgICBQeU9iamVjdCAqbGlzdERlZkZ1bmMsICphcmdzLCAqcnY9TlVMTDsKKyAgICBMaXN0T2JqZWN0ICpzZWxmOwogCi0gICAgICAgIHNlbGYgPSAoTGlzdE9iamVjdCopR2V0TGlzdFJlZkNvbih0aGVMaXN0KTsKLSAgICAgICAgaWYgKHNlbGYgPT0gTlVMTCB8fCBzZWxmLT5vYl9pdHNlbGYgIT0gdGhlTGlzdCkKLSAgICAgICAgICAgICAgICByZXR1cm47ICAvKiBub3RoaW5nIHdlIGNhbiBkbyAqLwotICAgICAgICBsaXN0RGVmRnVuYyA9IHNlbGYtPm9iX2xkZWZfZnVuYzsKLSAgICAgICAgaWYgKGxpc3REZWZGdW5jID09IE5VTEwpCi0gICAgICAgICAgICAgICAgcmV0dXJuOyAgLyogbm90aGluZyB3ZSBjYW4gZG8gKi8KLSAgICAgICAgYXJncyA9IFB5X0J1aWxkVmFsdWUoImhiTyZPJmhoTyIsIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgY2VsbFJlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFBvaW50LCB0aGVDZWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YU9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFMZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmKTsKLSAgICAgICAgaWYgKGFyZ3MgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHJ2ID0gUHlFdmFsX0NhbGxPYmplY3QobGlzdERlZkZ1bmMsIGFyZ3MpOwotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihhcmdzKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocnYgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCJlcnJvciBpbiBsaXN0IGRlZmluaXRpb24gY2FsbGJhY2s6XG4iKTsKLSAgICAgICAgICAgICAgICBQeUVycl9QcmludCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihydik7Ci0gICAgICAgIH0KKyAgICBzZWxmID0gKExpc3RPYmplY3QqKUdldExpc3RSZWZDb24odGhlTGlzdCk7CisgICAgaWYgKHNlbGYgPT0gTlVMTCB8fCBzZWxmLT5vYl9pdHNlbGYgIT0gdGhlTGlzdCkKKyAgICAgICAgcmV0dXJuOyAgLyogbm90aGluZyB3ZSBjYW4gZG8gKi8KKyAgICBsaXN0RGVmRnVuYyA9IHNlbGYtPm9iX2xkZWZfZnVuYzsKKyAgICBpZiAobGlzdERlZkZ1bmMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOyAgLyogbm90aGluZyB3ZSBjYW4gZG8gKi8KKyAgICBhcmdzID0gUHlfQnVpbGRWYWx1ZSgiaGJPJk8maGhPIiwgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgY2VsbFJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUG9pbnQsIHRoZUNlbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYpOworICAgIGlmIChhcmdzICE9IE5VTEwpIHsKKyAgICAgICAgcnYgPSBQeUV2YWxfQ2FsbE9iamVjdChsaXN0RGVmRnVuYywgYXJncyk7CisgICAgICAgIFB5X0RFQ1JFRihhcmdzKTsKKyAgICB9CisgICAgaWYgKHJ2ID09IE5VTEwpIHsKKyAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoImVycm9yIGluIGxpc3QgZGVmaW5pdGlvbiBjYWxsYmFjazpcbiIpOworICAgICAgICBQeUVycl9QcmludCgpOworICAgIH0gZWxzZSB7CisgICAgICAgIFB5X0RFQ1JFRihydik7CisgICAgfQogfQogI2VuZGlmIC8qIF9fTFA2NF9fICovCiAKIAogdm9pZCBpbml0X0xpc3Qodm9pZCkKIHsKLQlQeU9iamVjdCAqbTsKKyAgICBQeU9iamVjdCAqbTsKICNpZm5kZWYgX19MUDY0X18KLQlQeU9iamVjdCAqZDsKKyAgICBQeU9iamVjdCAqZDsKIAogCiAKLQlteUxpc3REZWZGdW5jdGlvblVQUCA9IE5ld0xpc3REZWZVUFAoKExpc3REZWZQcm9jUHRyKW15TGlzdERlZkZ1bmN0aW9uKTsKKyAgICBteUxpc3REZWZGdW5jdGlvblVQUCA9IE5ld0xpc3REZWZVUFAoKExpc3REZWZQcm9jUHRyKW15TGlzdERlZkZ1bmN0aW9uKTsKIAotCVB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKExpc3RIYW5kbGUsIExpc3RPYmpfTmV3KTsKLQlQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoTGlzdEhhbmRsZSwgTGlzdE9ial9Db252ZXJ0KTsKKyAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhMaXN0SGFuZGxlLCBMaXN0T2JqX05ldyk7CisgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKExpc3RIYW5kbGUsIExpc3RPYmpfQ29udmVydCk7CiAjZW5kaWYgLyogX19MUDY0X18gKi8KIAogCi0JbSA9IFB5X0luaXRNb2R1bGUoIl9MaXN0IiwgTGlzdF9tZXRob2RzKTsKKyAgICBtID0gUHlfSW5pdE1vZHVsZSgiX0xpc3QiLCBMaXN0X21ldGhvZHMpOwogI2lmbmRlZiBfX0xQNjRfXwotCWQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOwotCUxpc3RfRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOwotCWlmIChMaXN0X0Vycm9yID09IE5VTEwgfHwKLQkgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVycm9yIiwgTGlzdF9FcnJvcikgIT0gMCkKLQkJcmV0dXJuOwotCUxpc3RfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCWlmIChQeVR5cGVfUmVhZHkoJkxpc3RfVHlwZSkgPCAwKSByZXR1cm47Ci0JUHlfSU5DUkVGKCZMaXN0X1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiTGlzdCIsIChQeU9iamVjdCAqKSZMaXN0X1R5cGUpOwotCS8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLwotCVB5X0lOQ1JFRigmTGlzdF9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkxpc3RUeXBlIiwgKFB5T2JqZWN0ICopJkxpc3RfVHlwZSk7CisgICAgZCA9IFB5TW9kdWxlX0dldERpY3QobSk7CisgICAgTGlzdF9FcnJvciA9IFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCk7CisgICAgaWYgKExpc3RfRXJyb3IgPT0gTlVMTCB8fAorICAgICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRXJyb3IiLCBMaXN0X0Vycm9yKSAhPSAwKQorICAgICAgICByZXR1cm47CisgICAgTGlzdF9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmTGlzdF9UeXBlKSA8IDApIHJldHVybjsKKyAgICBQeV9JTkNSRUYoJkxpc3RfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJMaXN0IiwgKFB5T2JqZWN0ICopJkxpc3RfVHlwZSk7CisgICAgLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCisgICAgUHlfSU5DUkVGKCZMaXN0X1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiTGlzdFR5cGUiLCAoUHlPYmplY3QgKikmTGlzdF9UeXBlKTsKICNlbmRpZiAvKiBfX0xQNjRfXyAqLwogfQogCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9tZW51L19NZW51bW9kdWxlLmMgYi9NYWMvTW9kdWxlcy9tZW51L19NZW51bW9kdWxlLmMKaW5kZXggNjZlYmY3OS4uZGJiMDc1YyAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvbWVudS9fTWVudW1vZHVsZS5jCisrKyBiL01hYy9Nb2R1bGVzL21lbnUvX01lbnVtb2R1bGUuYwpAQCAtMTAsOSArMTAsOSBAQAogCiAvKiBNYWNybyB0byB0ZXN0IHdoZXRoZXIgYSB3ZWFrLWxvYWRlZCBDRk0gZnVuY3Rpb24gZXhpc3RzICovCiAjZGVmaW5lIFB5TWFjX1BSRUNIRUNLKHJ0bikgZG8geyBpZiAoICZydG4gPT0gTlVMTCApICB7XAotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgXAotICAgICAgICAiTm90IGF2YWlsYWJsZSBpbiB0aGlzIHNoYXJlZCBsaWJyYXJ5L09TIHZlcnNpb24iKTsgXAotICAgICAgICByZXR1cm4gTlVMTDsgXAorICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yLCBcCisgICAgIk5vdCBhdmFpbGFibGUgaW4gdGhpcyBzaGFyZWQgbGlicmFyeS9PUyB2ZXJzaW9uIik7IFwKKyAgICByZXR1cm4gTlVMTDsgXAogICAgIH19IHdoaWxlKDApCiAKIApAQCAtMzUsMjEgKzM1LDIxIEBACiAvKiBBbHRlcm5hdGl2ZSB2ZXJzaW9uIG9mIE1lbnVPYmpfTmV3LCB3aGljaCByZXR1cm5zIE5vbmUgZm9yIE5VTEwgYXJndW1lbnQgKi8KIFB5T2JqZWN0ICpPcHRNZW51T2JqX05ldyhNZW51UmVmIGl0c2VsZikKIHsKLSAgICAgICAgaWYgKGl0c2VsZiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwotICAgICAgICAgICAgICAgIHJldHVybiBQeV9Ob25lOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBNZW51T2JqX05ldyhpdHNlbGYpOworICAgIGlmIChpdHNlbGYgPT0gTlVMTCkgeworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIHJldHVybiBQeV9Ob25lOworICAgIH0KKyAgICByZXR1cm4gTWVudU9ial9OZXcoaXRzZWxmKTsKIH0KIAogLyogQWx0ZXJuYXRpdmUgdmVyc2lvbiBvZiBNZW51T2JqX0NvbnZlcnQsIHdoaWNoIHJldHVybnMgTlVMTCBmb3IgYSBOb25lIGFyZ3VtZW50ICovCiBpbnQgT3B0TWVudU9ial9Db252ZXJ0KFB5T2JqZWN0ICp2LCBNZW51UmVmICpwX2l0c2VsZikKIHsKLSAgICAgICAgaWYgKCB2ID09IFB5X05vbmUgKSB7Ci0gICAgICAgICAgICAgICAgKnBfaXRzZWxmID0gTlVMTDsKLSAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gTWVudU9ial9Db252ZXJ0KHYsIHBfaXRzZWxmKTsKKyAgICBpZiAoIHYgPT0gUHlfTm9uZSApIHsKKyAgICAgICAgKnBfaXRzZWxmID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHJldHVybiBNZW51T2JqX0NvbnZlcnQodiwgcF9pdHNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVfRXJyb3I7CkBAIC02MSwyNDY5ICs2MSwyNDY5IEBACiAjZGVmaW5lIE1lbnVPYmpfQ2hlY2soeCkgKCh4KS0+b2JfdHlwZSA9PSAmTWVudV9UeXBlIHx8IFB5T2JqZWN0X1R5cGVDaGVjaygoeCksICZNZW51X1R5cGUpKQogCiB0eXBlZGVmIHN0cnVjdCBNZW51T2JqZWN0IHsKLQlQeU9iamVjdF9IRUFECi0JTWVudUhhbmRsZSBvYl9pdHNlbGY7CisgICAgUHlPYmplY3RfSEVBRAorICAgIE1lbnVIYW5kbGUgb2JfaXRzZWxmOwogfSBNZW51T2JqZWN0OwogCiBQeU9iamVjdCAqTWVudU9ial9OZXcoTWVudUhhbmRsZSBpdHNlbGYpCiB7Ci0JTWVudU9iamVjdCAqaXQ7Ci0JaXQgPSBQeU9iamVjdF9ORVcoTWVudU9iamVjdCwgJk1lbnVfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOwotCWl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIE1lbnVPYmplY3QgKml0OworICAgIGl0ID0gUHlPYmplY3RfTkVXKE1lbnVPYmplY3QsICZNZW51X1R5cGUpOworICAgIGlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICBpdC0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIHJldHVybiAoUHlPYmplY3QgKilpdDsKIH0KIAogaW50IE1lbnVPYmpfQ29udmVydChQeU9iamVjdCAqdiwgTWVudUhhbmRsZSAqcF9pdHNlbGYpCiB7Ci0JaWYgKCFNZW51T2JqX0NoZWNrKHYpKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIk1lbnUgcmVxdWlyZWQiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCSpwX2l0c2VsZiA9ICgoTWVudU9iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0JcmV0dXJuIDE7CisgICAgaWYgKCFNZW51T2JqX0NoZWNrKHYpKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIk1lbnUgcmVxdWlyZWQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICpwX2l0c2VsZiA9ICgoTWVudU9iamVjdCAqKXYpLT5vYl9pdHNlbGY7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyB2b2lkIE1lbnVPYmpfZGVhbGxvYyhNZW51T2JqZWN0ICpzZWxmKQogewotCS8qIENsZWFudXAgb2Ygc2VsZi0+b2JfaXRzZWxmIGdvZXMgaGVyZSAqLwotCXNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CisgICAgLyogQ2xlYW51cCBvZiBzZWxmLT5vYl9pdHNlbGYgZ29lcyBoZXJlICovCisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX0Rpc3Bvc2VNZW51KE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgRGlzcG9zZU1lbnUKLQlQeU1hY19QUkVDSEVDSyhEaXNwb3NlTWVudSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGlzcG9zZU1lbnUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCURpc3Bvc2VNZW51KF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgRGlzcG9zZU1lbnUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfQ2FsY01lbnVTaXplKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgQ2FsY01lbnVTaXplCi0JUHlNYWNfUFJFQ0hFQ0soQ2FsY01lbnVTaXplKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDYWxjTWVudVNpemUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUNhbGNNZW51U2l6ZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENhbGNNZW51U2l6ZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9Db3VudE1lbnVJdGVtcyhNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlVSW50MTYgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBVSW50MTYgX3J2OwogI2lmbmRlZiBDb3VudE1lbnVJdGVtcwotCVB5TWFjX1BSRUNIRUNLKENvdW50TWVudUl0ZW1zKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb3VudE1lbnVJdGVtcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ291bnRNZW51SXRlbXMoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIkgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENvdW50TWVudUl0ZW1zKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfR2V0TWVudUZvbnQoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlTSW50MTYgb3V0Rm9udElEOwotCVVJbnQxNiBvdXRGb250U2l6ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBTSW50MTYgb3V0Rm9udElEOworICAgIFVJbnQxNiBvdXRGb250U2l6ZTsKICNpZm5kZWYgR2V0TWVudUZvbnQKLQlQeU1hY19QUkVDSEVDSyhHZXRNZW51Rm9udCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TWVudUZvbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRNZW51Rm9udChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAmb3V0Rm9udElELAotCSAgICAgICAgICAgICAgICAgICAmb3V0Rm9udFNpemUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImhIIiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRGb250SUQsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0Rm9udFNpemUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0TWVudUZvbnQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgJm91dEZvbnRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgJm91dEZvbnRTaXplKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0Rm9udElELAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dEZvbnRTaXplKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX1NldE1lbnVGb250KE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JU0ludDE2IGluRm9udElEOwotCVVJbnQxNiBpbkZvbnRTaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFNJbnQxNiBpbkZvbnRJRDsKKyAgICBVSW50MTYgaW5Gb250U2l6ZTsKICNpZm5kZWYgU2V0TWVudUZvbnQKLQlQeU1hY19QUkVDSEVDSyhTZXRNZW51Rm9udCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TWVudUZvbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaEgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5Gb250SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkZvbnRTaXplKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldE1lbnVGb250KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgIGluRm9udElELAotCSAgICAgICAgICAgICAgICAgICBpbkZvbnRTaXplKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkZvbnRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluRm9udFNpemUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0TWVudUZvbnQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgaW5Gb250SUQsCisgICAgICAgICAgICAgICAgICAgICAgIGluRm9udFNpemUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfR2V0TWVudUV4Y2x1ZGVzTWFya0NvbHVtbihNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CiAjaWZuZGVmIEdldE1lbnVFeGNsdWRlc01hcmtDb2x1bW4KLQlQeU1hY19QUkVDSEVDSyhHZXRNZW51RXhjbHVkZXNNYXJrQ29sdW1uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNZW51RXhjbHVkZXNNYXJrQ29sdW1uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRNZW51RXhjbHVkZXNNYXJrQ29sdW1uKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRNZW51RXhjbHVkZXNNYXJrQ29sdW1uKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfU2V0TWVudUV4Y2x1ZGVzTWFya0NvbHVtbihNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUJvb2xlYW4gZXhjbHVkZXNNYXJrOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIEJvb2xlYW4gZXhjbHVkZXNNYXJrOwogI2lmbmRlZiBTZXRNZW51RXhjbHVkZXNNYXJrQ29sdW1uCi0JUHlNYWNfUFJFQ0hFQ0soU2V0TWVudUV4Y2x1ZGVzTWFya0NvbHVtbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TWVudUV4Y2x1ZGVzTWFya0NvbHVtbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmV4Y2x1ZGVzTWFyaykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRNZW51RXhjbHVkZXNNYXJrQ29sdW1uKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjbHVkZXNNYXJrKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmV4Y2x1ZGVzTWFyaykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRNZW51RXhjbHVkZXNNYXJrQ29sdW1uKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjbHVkZXNNYXJrKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX0lzVmFsaWRNZW51KE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKICNpZm5kZWYgSXNWYWxpZE1lbnUKLQlQeU1hY19QUkVDSEVDSyhJc1ZhbGlkTWVudSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSXNWYWxpZE1lbnUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IElzVmFsaWRNZW51KF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBJc1ZhbGlkTWVudShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX0dldE1lbnVSZXRhaW5Db3VudChNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlJdGVtQ291bnQgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBJdGVtQ291bnQgX3J2OwogI2lmbmRlZiBHZXRNZW51UmV0YWluQ291bnQKLQlQeU1hY19QUkVDSEVDSyhHZXRNZW51UmV0YWluQ291bnQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1lbnVSZXRhaW5Db3VudCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TWVudVJldGFpbkNvdW50KF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRNZW51UmV0YWluQ291bnQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9SZXRhaW5NZW51KE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CiAjaWZuZGVmIFJldGFpbk1lbnUKLQlQeU1hY19QUkVDSEVDSyhSZXRhaW5NZW51KTsKKyAgICBQeU1hY19QUkVDSEVDSyhSZXRhaW5NZW51KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUmV0YWluTWVudShfc2VsZi0+b2JfaXRzZWxmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFJldGFpbk1lbnUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9SZWxlYXNlTWVudShNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOwogI2lmbmRlZiBSZWxlYXNlTWVudQotCVB5TWFjX1BSRUNIRUNLKFJlbGVhc2VNZW51KTsKKyAgICBQeU1hY19QUkVDSEVDSyhSZWxlYXNlTWVudSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFJlbGVhc2VNZW51KF9zZWxmLT5vYl9pdHNlbGYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUmVsZWFzZU1lbnUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9EdXBsaWNhdGVNZW51KE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JTWVudUhhbmRsZSBvdXRNZW51OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIE1lbnVIYW5kbGUgb3V0TWVudTsKICNpZm5kZWYgRHVwbGljYXRlTWVudQotCVB5TWFjX1BSRUNIRUNLKER1cGxpY2F0ZU1lbnUpOworICAgIFB5TWFjX1BSRUNIRUNLKER1cGxpY2F0ZU1lbnUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBEdXBsaWNhdGVNZW51KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgJm91dE1lbnUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBNZW51T2JqX05ldywgb3V0TWVudSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBEdXBsaWNhdGVNZW51KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgJm91dE1lbnUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBNZW51T2JqX05ldywgb3V0TWVudSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9Db3B5TWVudVRpdGxlQXNDRlN0cmluZyhNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUNGU3RyaW5nUmVmIG91dFN0cmluZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBDRlN0cmluZ1JlZiBvdXRTdHJpbmc7CiAjaWZuZGVmIENvcHlNZW51VGl0bGVBc0NGU3RyaW5nCi0JUHlNYWNfUFJFQ0hFQ0soQ29weU1lbnVUaXRsZUFzQ0ZTdHJpbmcpOworICAgIFB5TWFjX1BSRUNIRUNLKENvcHlNZW51VGl0bGVBc0NGU3RyaW5nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ29weU1lbnVUaXRsZUFzQ0ZTdHJpbmcoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFN0cmluZyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgb3V0U3RyaW5nKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENvcHlNZW51VGl0bGVBc0NGU3RyaW5nKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRTdHJpbmcpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIG91dFN0cmluZyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9TZXRNZW51VGl0bGVXaXRoQ0ZTdHJpbmcoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlDRlN0cmluZ1JlZiBpblN0cmluZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBDRlN0cmluZ1JlZiBpblN0cmluZzsKICNpZm5kZWYgU2V0TWVudVRpdGxlV2l0aENGU3RyaW5nCi0JUHlNYWNfUFJFQ0hFQ0soU2V0TWVudVRpdGxlV2l0aENGU3RyaW5nKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRNZW51VGl0bGVXaXRoQ0ZTdHJpbmcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmaW5TdHJpbmcpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0TWVudVRpdGxlV2l0aENGU3RyaW5nKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblN0cmluZyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmaW5TdHJpbmcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0TWVudVRpdGxlV2l0aENGU3RyaW5nKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblN0cmluZyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9JbnZhbGlkYXRlTWVudVNpemUoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKICNpZm5kZWYgSW52YWxpZGF0ZU1lbnVTaXplCi0JUHlNYWNfUFJFQ0hFQ0soSW52YWxpZGF0ZU1lbnVTaXplKTsKKyAgICBQeU1hY19QUkVDSEVDSyhJbnZhbGlkYXRlTWVudVNpemUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBJbnZhbGlkYXRlTWVudVNpemUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBJbnZhbGlkYXRlTWVudVNpemUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9Jc01lbnVTaXplSW52YWxpZChNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CiAjaWZuZGVmIElzTWVudVNpemVJbnZhbGlkCi0JUHlNYWNfUFJFQ0hFQ0soSXNNZW51U2l6ZUludmFsaWQpOworICAgIFB5TWFjX1BSRUNIRUNLKElzTWVudVNpemVJbnZhbGlkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBJc01lbnVTaXplSW52YWxpZChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gSXNNZW51U2l6ZUludmFsaWQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9NYWNBcHBlbmRNZW51KE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVN0cjI1NSBkYXRhOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTdHIyNTUgZGF0YTsKICNpZm5kZWYgTWFjQXBwZW5kTWVudQotCVB5TWFjX1BSRUNIRUNLKE1hY0FwcGVuZE1lbnUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1hY0FwcGVuZE1lbnUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIGRhdGEpKQotCQlyZXR1cm4gTlVMTDsKLQlNYWNBcHBlbmRNZW51KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICBkYXRhKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIGRhdGEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNYWNBcHBlbmRNZW51KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICBkYXRhKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9JbnNlcnRSZXNNZW51KE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlc1R5cGUgdGhlVHlwZTsKLQlzaG9ydCBhZnRlckl0ZW07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlc1R5cGUgdGhlVHlwZTsKKyAgICBzaG9ydCBhZnRlckl0ZW07CiAjaWZuZGVmIEluc2VydFJlc01lbnUKLQlQeU1hY19QUkVDSEVDSyhJbnNlcnRSZXNNZW51KTsKKyAgICBQeU1hY19QUkVDSEVDSyhJbnNlcnRSZXNNZW51KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZhZnRlckl0ZW0pKQotCQlyZXR1cm4gTlVMTDsKLQlJbnNlcnRSZXNNZW51KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICB0aGVUeXBlLAotCSAgICAgICAgICAgICAgYWZ0ZXJJdGVtKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFmdGVySXRlbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEluc2VydFJlc01lbnUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgIHRoZVR5cGUsCisgICAgICAgICAgICAgICAgICBhZnRlckl0ZW0pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX0FwcGVuZFJlc01lbnUoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVzVHlwZSB0aGVUeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZXNUeXBlIHRoZVR5cGU7CiAjaWZuZGVmIEFwcGVuZFJlc01lbnUKLQlQeU1hY19QUkVDSEVDSyhBcHBlbmRSZXNNZW51KTsKKyAgICBQeU1hY19QUkVDSEVDSyhBcHBlbmRSZXNNZW51KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlVHlwZSkpCi0JCXJldHVybiBOVUxMOwotCUFwcGVuZFJlc01lbnUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgIHRoZVR5cGUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZVR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBBcHBlbmRSZXNNZW51KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICB0aGVUeXBlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9NYWNJbnNlcnRNZW51SXRlbShNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTdHIyNTUgaXRlbVN0cmluZzsKLQlzaG9ydCBhZnRlckl0ZW07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFN0cjI1NSBpdGVtU3RyaW5nOworICAgIHNob3J0IGFmdGVySXRlbTsKICNpZm5kZWYgTWFjSW5zZXJ0TWVudUl0ZW0KLQlQeU1hY19QUkVDSEVDSyhNYWNJbnNlcnRNZW51SXRlbSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWFjSW5zZXJ0TWVudUl0ZW0pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBpdGVtU3RyaW5nLAotCSAgICAgICAgICAgICAgICAgICAgICAmYWZ0ZXJJdGVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTWFjSW5zZXJ0TWVudUl0ZW0oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICBpdGVtU3RyaW5nLAotCSAgICAgICAgICAgICAgICAgIGFmdGVySXRlbSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgaXRlbVN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFmdGVySXRlbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE1hY0luc2VydE1lbnVJdGVtKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgaXRlbVN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICBhZnRlckl0ZW0pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX0RlbGV0ZU1lbnVJdGVtKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IGl0ZW07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IGl0ZW07CiAjaWZuZGVmIERlbGV0ZU1lbnVJdGVtCi0JUHlNYWNfUFJFQ0hFQ0soRGVsZXRlTWVudUl0ZW0pOworICAgIFB5TWFjX1BSRUNIRUNLKERlbGV0ZU1lbnVJdGVtKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXRlbSkpCi0JCXJldHVybiBOVUxMOwotCURlbGV0ZU1lbnVJdGVtKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgaXRlbSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRlbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIERlbGV0ZU1lbnVJdGVtKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgaXRlbSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfSW5zZXJ0Rm9udFJlc01lbnUoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgYWZ0ZXJJdGVtOwotCXNob3J0IHNjcmlwdEZpbHRlcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgYWZ0ZXJJdGVtOworICAgIHNob3J0IHNjcmlwdEZpbHRlcjsKICNpZm5kZWYgSW5zZXJ0Rm9udFJlc01lbnUKLQlQeU1hY19QUkVDSEVDSyhJbnNlcnRGb250UmVzTWVudSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSW5zZXJ0Rm9udFJlc01lbnUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmYWZ0ZXJJdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2NyaXB0RmlsdGVyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JSW5zZXJ0Rm9udFJlc01lbnUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICBhZnRlckl0ZW0sCi0JICAgICAgICAgICAgICAgICAgc2NyaXB0RmlsdGVyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYWZ0ZXJJdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2NyaXB0RmlsdGVyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgSW5zZXJ0Rm9udFJlc01lbnUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICBhZnRlckl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0RmlsdGVyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9JbnNlcnRJbnRsUmVzTWVudShNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZXNUeXBlIHRoZVR5cGU7Ci0Jc2hvcnQgYWZ0ZXJJdGVtOwotCXNob3J0IHNjcmlwdEZpbHRlcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmVzVHlwZSB0aGVUeXBlOworICAgIHNob3J0IGFmdGVySXRlbTsKKyAgICBzaG9ydCBzY3JpcHRGaWx0ZXI7CiAjaWZuZGVmIEluc2VydEludGxSZXNNZW51Ci0JUHlNYWNfUFJFQ0hFQ0soSW5zZXJ0SW50bFJlc01lbnUpOworICAgIFB5TWFjX1BSRUNIRUNLKEluc2VydEludGxSZXNNZW51KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGgiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAmYWZ0ZXJJdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2NyaXB0RmlsdGVyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JSW5zZXJ0SW50bFJlc01lbnUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICB0aGVUeXBlLAotCSAgICAgICAgICAgICAgICAgIGFmdGVySXRlbSwKLQkgICAgICAgICAgICAgICAgICBzY3JpcHRGaWx0ZXIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFmdGVySXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNjcmlwdEZpbHRlcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEluc2VydEludGxSZXNNZW51KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgdGhlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICBhZnRlckl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0RmlsdGVyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9BcHBlbmRNZW51SXRlbVRleHQoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlTdHIyNTUgaW5TdHJpbmc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgU3RyMjU1IGluU3RyaW5nOwogI2lmbmRlZiBBcHBlbmRNZW51SXRlbVRleHQKLQlQeU1hY19QUkVDSEVDSyhBcHBlbmRNZW51SXRlbVRleHQpOworICAgIFB5TWFjX1BSRUNIRUNLKEFwcGVuZE1lbnVJdGVtVGV4dCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgaW5TdHJpbmcpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQXBwZW5kTWVudUl0ZW1UZXh0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBpblN0cmluZyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIGluU3RyaW5nKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFwcGVuZE1lbnVJdGVtVGV4dChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5TdHJpbmcpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfSW5zZXJ0TWVudUl0ZW1UZXh0KE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JU3RyMjU1IGluU3RyaW5nOwotCU1lbnVJdGVtSW5kZXggYWZ0ZXJJdGVtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFN0cjI1NSBpblN0cmluZzsKKyAgICBNZW51SXRlbUluZGV4IGFmdGVySXRlbTsKICNpZm5kZWYgSW5zZXJ0TWVudUl0ZW1UZXh0Ci0JUHlNYWNfUFJFQ0hFQ0soSW5zZXJ0TWVudUl0ZW1UZXh0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhJbnNlcnRNZW51SXRlbVRleHQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBpblN0cmluZywKLQkgICAgICAgICAgICAgICAgICAgICAgJmFmdGVySXRlbSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBJbnNlcnRNZW51SXRlbVRleHQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGluU3RyaW5nLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJJdGVtKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIGluU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYWZ0ZXJJdGVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEluc2VydE1lbnVJdGVtVGV4dChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5TdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZnRlckl0ZW0pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfQ29weU1lbnVJdGVtcyhNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCU1lbnVJdGVtSW5kZXggaW5GaXJzdEl0ZW07Ci0JSXRlbUNvdW50IGluTnVtSXRlbXM7Ci0JTWVudUhhbmRsZSBpbkRlc3RNZW51OwotCU1lbnVJdGVtSW5kZXggaW5JbnNlcnRBZnRlcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBNZW51SXRlbUluZGV4IGluRmlyc3RJdGVtOworICAgIEl0ZW1Db3VudCBpbk51bUl0ZW1zOworICAgIE1lbnVIYW5kbGUgaW5EZXN0TWVudTsKKyAgICBNZW51SXRlbUluZGV4IGluSW5zZXJ0QWZ0ZXI7CiAjaWZuZGVmIENvcHlNZW51SXRlbXMKLQlQeU1hY19QUkVDSEVDSyhDb3B5TWVudUl0ZW1zKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb3B5TWVudUl0ZW1zKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluRmlyc3RJdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5OdW1JdGVtcywKLQkgICAgICAgICAgICAgICAgICAgICAgTWVudU9ial9Db252ZXJ0LCAmaW5EZXN0TWVudSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluSW5zZXJ0QWZ0ZXIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ29weU1lbnVJdGVtcyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgIGluRmlyc3RJdGVtLAotCSAgICAgICAgICAgICAgICAgICAgIGluTnVtSXRlbXMsCi0JICAgICAgICAgICAgICAgICAgICAgaW5EZXN0TWVudSwKLQkgICAgICAgICAgICAgICAgICAgICBpbkluc2VydEFmdGVyKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobE8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkZpcnN0SXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluTnVtSXRlbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1lbnVPYmpfQ29udmVydCwgJmluRGVzdE1lbnUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkluc2VydEFmdGVyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENvcHlNZW51SXRlbXMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbkZpcnN0SXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbk51bUl0ZW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgIGluRGVzdE1lbnUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW5JbnNlcnRBZnRlcik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9EZWxldGVNZW51SXRlbXMoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlNZW51SXRlbUluZGV4IGluRmlyc3RJdGVtOwotCUl0ZW1Db3VudCBpbk51bUl0ZW1zOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIE1lbnVJdGVtSW5kZXggaW5GaXJzdEl0ZW07CisgICAgSXRlbUNvdW50IGluTnVtSXRlbXM7CiAjaWZuZGVmIERlbGV0ZU1lbnVJdGVtcwotCVB5TWFjX1BSRUNIRUNLKERlbGV0ZU1lbnVJdGVtcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGVsZXRlTWVudUl0ZW1zKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluRmlyc3RJdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5OdW1JdGVtcykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBEZWxldGVNZW51SXRlbXMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgIGluRmlyc3RJdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgaW5OdW1JdGVtcyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5GaXJzdEl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbk51bUl0ZW1zKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IERlbGV0ZU1lbnVJdGVtcyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5GaXJzdEl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbk51bUl0ZW1zKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX0FwcGVuZE1lbnVJdGVtVGV4dFdpdGhDRlN0cmluZyhNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUNGU3RyaW5nUmVmIGluU3RyaW5nOwotCU1lbnVJdGVtQXR0cmlidXRlcyBpbkF0dHJpYnV0ZXM7Ci0JTWVudUNvbW1hbmQgaW5Db21tYW5kSUQ7Ci0JTWVudUl0ZW1JbmRleCBvdXROZXdJdGVtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIENGU3RyaW5nUmVmIGluU3RyaW5nOworICAgIE1lbnVJdGVtQXR0cmlidXRlcyBpbkF0dHJpYnV0ZXM7CisgICAgTWVudUNvbW1hbmQgaW5Db21tYW5kSUQ7CisgICAgTWVudUl0ZW1JbmRleCBvdXROZXdJdGVtOwogI2lmbmRlZiBBcHBlbmRNZW51SXRlbVRleHRXaXRoQ0ZTdHJpbmcKLQlQeU1hY19QUkVDSEVDSyhBcHBlbmRNZW51SXRlbVRleHRXaXRoQ0ZTdHJpbmcpOworICAgIFB5TWFjX1BSRUNIRUNLKEFwcGVuZE1lbnVJdGVtVGV4dFdpdGhDRlN0cmluZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmluU3RyaW5nLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5BdHRyaWJ1dGVzLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5Db21tYW5kSUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQXBwZW5kTWVudUl0ZW1UZXh0V2l0aENGU3RyaW5nKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblN0cmluZywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQXR0cmlidXRlcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQ29tbWFuZElELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dE5ld0l0ZW0pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIG91dE5ld0l0ZW0pOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmaW5TdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkNvbW1hbmRJRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBBcHBlbmRNZW51SXRlbVRleHRXaXRoQ0ZTdHJpbmcoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5BdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Db21tYW5kSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0TmV3SXRlbSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0TmV3SXRlbSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9JbnNlcnRNZW51SXRlbVRleHRXaXRoQ0ZTdHJpbmcoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlDRlN0cmluZ1JlZiBpblN0cmluZzsKLQlNZW51SXRlbUluZGV4IGluQWZ0ZXJJdGVtOwotCU1lbnVJdGVtQXR0cmlidXRlcyBpbkF0dHJpYnV0ZXM7Ci0JTWVudUNvbW1hbmQgaW5Db21tYW5kSUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgQ0ZTdHJpbmdSZWYgaW5TdHJpbmc7CisgICAgTWVudUl0ZW1JbmRleCBpbkFmdGVySXRlbTsKKyAgICBNZW51SXRlbUF0dHJpYnV0ZXMgaW5BdHRyaWJ1dGVzOworICAgIE1lbnVDb21tYW5kIGluQ29tbWFuZElEOwogI2lmbmRlZiBJbnNlcnRNZW51SXRlbVRleHRXaXRoQ0ZTdHJpbmcKLQlQeU1hY19QUkVDSEVDSyhJbnNlcnRNZW51SXRlbVRleHRXaXRoQ0ZTdHJpbmcpOworICAgIFB5TWFjX1BSRUNIRUNLKEluc2VydE1lbnVJdGVtVGV4dFdpdGhDRlN0cmluZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZpblN0cmluZywKLQkgICAgICAgICAgICAgICAgICAgICAgJmluQWZ0ZXJJdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5BdHRyaWJ1dGVzLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5Db21tYW5kSUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gSW5zZXJ0TWVudUl0ZW1UZXh0V2l0aENGU3RyaW5nKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblN0cmluZywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQWZ0ZXJJdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5BdHRyaWJ1dGVzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Db21tYW5kSUQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmluU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5BZnRlckl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkNvbW1hbmRJRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBJbnNlcnRNZW51SXRlbVRleHRXaXRoQ0ZTdHJpbmcoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5BZnRlckl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkNvbW1hbmRJRCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9Qb3BVcE1lbnVTZWxlY3QoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBfcnY7Ci0Jc2hvcnQgdG9wOwotCXNob3J0IGxlZnQ7Ci0Jc2hvcnQgcG9wVXBJdGVtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBsb25nIF9ydjsKKyAgICBzaG9ydCB0b3A7CisgICAgc2hvcnQgbGVmdDsKKyAgICBzaG9ydCBwb3BVcEl0ZW07CiAjaWZuZGVmIFBvcFVwTWVudVNlbGVjdAotCVB5TWFjX1BSRUNIRUNLKFBvcFVwTWVudVNlbGVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUG9wVXBNZW51U2VsZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0b3AsCi0JICAgICAgICAgICAgICAgICAgICAgICZsZWZ0LAotCSAgICAgICAgICAgICAgICAgICAgICAmcG9wVXBJdGVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gUG9wVXBNZW51U2VsZWN0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgIHRvcCwKLQkgICAgICAgICAgICAgICAgICAgICAgbGVmdCwKLQkgICAgICAgICAgICAgICAgICAgICAgcG9wVXBJdGVtKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBvcFVwSXRlbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFBvcFVwTWVudVNlbGVjdChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcFVwSXRlbSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9JbnZhbGlkYXRlTWVudUVuYWJsaW5nKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CiAjaWZuZGVmIEludmFsaWRhdGVNZW51RW5hYmxpbmcKLQlQeU1hY19QUkVDSEVDSyhJbnZhbGlkYXRlTWVudUVuYWJsaW5nKTsKKyAgICBQeU1hY19QUkVDSEVDSyhJbnZhbGlkYXRlTWVudUVuYWJsaW5nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gSW52YWxpZGF0ZU1lbnVFbmFibGluZyhfc2VsZi0+b2JfaXRzZWxmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEludmFsaWRhdGVNZW51RW5hYmxpbmcoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9Jc01lbnVCYXJJbnZhbGlkKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKICNpZm5kZWYgSXNNZW51QmFySW52YWxpZAotCVB5TWFjX1BSRUNIRUNLKElzTWVudUJhckludmFsaWQpOworICAgIFB5TWFjX1BSRUNIRUNLKElzTWVudUJhckludmFsaWQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IElzTWVudUJhckludmFsaWQoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IElzTWVudUJhckludmFsaWQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9NYWNJbnNlcnRNZW51KE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU1lbnVJRCBiZWZvcmVJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgTWVudUlEIGJlZm9yZUlEOwogI2lmbmRlZiBNYWNJbnNlcnRNZW51Ci0JUHlNYWNfUFJFQ0hFQ0soTWFjSW5zZXJ0TWVudSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWFjSW5zZXJ0TWVudSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmJlZm9yZUlEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTWFjSW5zZXJ0TWVudShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgYmVmb3JlSUQpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmJlZm9yZUlEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTWFjSW5zZXJ0TWVudShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgYmVmb3JlSUQpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX1NldFJvb3RNZW51KE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CiAjaWZuZGVmIFNldFJvb3RNZW51Ci0JUHlNYWNfUFJFQ0hFQ0soU2V0Um9vdE1lbnUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFJvb3RNZW51KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0Um9vdE1lbnUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRSb290TWVudShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX01hY0NoZWNrTWVudUl0ZW0oTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgaXRlbTsKLQlCb29sZWFuIGNoZWNrZWQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IGl0ZW07CisgICAgQm9vbGVhbiBjaGVja2VkOwogI2lmbmRlZiBNYWNDaGVja01lbnVJdGVtCi0JUHlNYWNfUFJFQ0hFQ0soTWFjQ2hlY2tNZW51SXRlbSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWFjQ2hlY2tNZW51SXRlbSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmY2hlY2tlZCkpCi0JCXJldHVybiBOVUxMOwotCU1hY0NoZWNrTWVudUl0ZW0oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgIGl0ZW0sCi0JICAgICAgICAgICAgICAgICBjaGVja2VkKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNoZWNrZWQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNYWNDaGVja01lbnVJdGVtKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICBpdGVtLAorICAgICAgICAgICAgICAgICAgICAgY2hlY2tlZCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfU2V0TWVudUl0ZW1UZXh0KE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IGl0ZW07Ci0JU3RyMjU1IGl0ZW1TdHJpbmc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IGl0ZW07CisgICAgU3RyMjU1IGl0ZW1TdHJpbmc7CiAjaWZuZGVmIFNldE1lbnVJdGVtVGV4dAotCVB5TWFjX1BSRUNIRUNLKFNldE1lbnVJdGVtVGV4dCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TWVudUl0ZW1UZXh0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIGl0ZW1TdHJpbmcpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRNZW51SXRlbVRleHQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgaXRlbSwKLQkgICAgICAgICAgICAgICAgaXRlbVN0cmluZyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIGl0ZW1TdHJpbmcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRNZW51SXRlbVRleHQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgaXRlbSwKKyAgICAgICAgICAgICAgICAgICAgaXRlbVN0cmluZyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfR2V0TWVudUl0ZW1UZXh0KE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IGl0ZW07Ci0JU3RyMjU1IGl0ZW1TdHJpbmc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IGl0ZW07CisgICAgU3RyMjU1IGl0ZW1TdHJpbmc7CiAjaWZuZGVmIEdldE1lbnVJdGVtVGV4dAotCVB5TWFjX1BSRUNIRUNLKEdldE1lbnVJdGVtVGV4dCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TWVudUl0ZW1UZXh0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXRlbSkpCi0JCXJldHVybiBOVUxMOwotCUdldE1lbnVJdGVtVGV4dChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICBpdGVtLAotCSAgICAgICAgICAgICAgICBpdGVtU3RyaW5nKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkU3RyMjU1LCBpdGVtU3RyaW5nKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRNZW51SXRlbVRleHQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgaXRlbSwKKyAgICAgICAgICAgICAgICAgICAgaXRlbVN0cmluZyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFN0cjI1NSwgaXRlbVN0cmluZyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9TZXRJdGVtTWFyayhNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBpdGVtOwotCUNoYXJQYXJhbWV0ZXIgbWFya0NoYXI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IGl0ZW07CisgICAgQ2hhclBhcmFtZXRlciBtYXJrQ2hhcjsKICNpZm5kZWYgU2V0SXRlbU1hcmsKLQlQeU1hY19QUkVDSEVDSyhTZXRJdGVtTWFyayk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0SXRlbU1hcmspOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1hcmtDaGFyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0SXRlbU1hcmsoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICBpdGVtLAotCSAgICAgICAgICAgIG1hcmtDaGFyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1hcmtDaGFyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0SXRlbU1hcmsoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICBpdGVtLAorICAgICAgICAgICAgICAgIG1hcmtDaGFyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9HZXRJdGVtTWFyayhNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBpdGVtOwotCUNoYXJQYXJhbWV0ZXIgbWFya0NoYXI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IGl0ZW07CisgICAgQ2hhclBhcmFtZXRlciBtYXJrQ2hhcjsKICNpZm5kZWYgR2V0SXRlbU1hcmsKLQlQeU1hY19QUkVDSEVDSyhHZXRJdGVtTWFyayk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0SXRlbU1hcmspOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpdGVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0SXRlbU1hcmsoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICBpdGVtLAotCSAgICAgICAgICAgICZtYXJrQ2hhcik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIG1hcmtDaGFyKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRJdGVtTWFyayhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgIGl0ZW0sCisgICAgICAgICAgICAgICAgJm1hcmtDaGFyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgbWFya0NoYXIpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfU2V0SXRlbUNtZChNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBpdGVtOwotCUNoYXJQYXJhbWV0ZXIgY21kQ2hhcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgaXRlbTsKKyAgICBDaGFyUGFyYW1ldGVyIGNtZENoYXI7CiAjaWZuZGVmIFNldEl0ZW1DbWQKLQlQeU1hY19QUkVDSEVDSyhTZXRJdGVtQ21kKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRJdGVtQ21kKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJml0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgICZjbWRDaGFyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0SXRlbUNtZChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgaXRlbSwKLQkgICAgICAgICAgIGNtZENoYXIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY21kQ2hhcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldEl0ZW1DbWQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgIGl0ZW0sCisgICAgICAgICAgICAgICBjbWRDaGFyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9HZXRJdGVtQ21kKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IGl0ZW07Ci0JQ2hhclBhcmFtZXRlciBjbWRDaGFyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBpdGVtOworICAgIENoYXJQYXJhbWV0ZXIgY21kQ2hhcjsKICNpZm5kZWYgR2V0SXRlbUNtZAotCVB5TWFjX1BSRUNIRUNLKEdldEl0ZW1DbWQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldEl0ZW1DbWQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpdGVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0SXRlbUNtZChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgaXRlbSwKLQkgICAgICAgICAgICZjbWRDaGFyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgY21kQ2hhcik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpdGVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0SXRlbUNtZChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgaXRlbSwKKyAgICAgICAgICAgICAgICZjbWRDaGFyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY21kQ2hhcik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9TZXRJdGVtSWNvbihNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBpdGVtOwotCXNob3J0IGljb25JbmRleDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgaXRlbTsKKyAgICBzaG9ydCBpY29uSW5kZXg7CiAjaWZuZGVmIFNldEl0ZW1JY29uCi0JUHlNYWNfUFJFQ0hFQ0soU2V0SXRlbUljb24pOworICAgIFB5TWFjX1BSRUNIRUNLKFNldEl0ZW1JY29uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJml0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgICZpY29uSW5kZXgpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRJdGVtSWNvbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgIGl0ZW0sCi0JICAgICAgICAgICAgaWNvbkluZGV4KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmljb25JbmRleCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldEl0ZW1JY29uKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgaXRlbSwKKyAgICAgICAgICAgICAgICBpY29uSW5kZXgpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX0dldEl0ZW1JY29uKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IGl0ZW07Ci0Jc2hvcnQgaWNvbkluZGV4OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBpdGVtOworICAgIHNob3J0IGljb25JbmRleDsKICNpZm5kZWYgR2V0SXRlbUljb24KLQlQeU1hY19QUkVDSEVDSyhHZXRJdGVtSWNvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0SXRlbUljb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpdGVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0SXRlbUljb24oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICBpdGVtLAotCSAgICAgICAgICAgICZpY29uSW5kZXgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBpY29uSW5kZXgpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRlbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldEl0ZW1JY29uKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgaXRlbSwKKyAgICAgICAgICAgICAgICAmaWNvbkluZGV4KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbkluZGV4KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX1NldEl0ZW1TdHlsZShNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBpdGVtOwotCVN0eWxlUGFyYW1ldGVyIGNoU3R5bGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IGl0ZW07CisgICAgU3R5bGVQYXJhbWV0ZXIgY2hTdHlsZTsKICNpZm5kZWYgU2V0SXRlbVN0eWxlCi0JUHlNYWNfUFJFQ0hFQ0soU2V0SXRlbVN0eWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRJdGVtU3R5bGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNoU3R5bGUpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRJdGVtU3R5bGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgaXRlbSwKLQkgICAgICAgICAgICAgY2hTdHlsZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjaFN0eWxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0SXRlbVN0eWxlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgIGl0ZW0sCisgICAgICAgICAgICAgICAgIGNoU3R5bGUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX0dldEl0ZW1TdHlsZShNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBpdGVtOwotCVN0eWxlIGNoU3R5bGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IGl0ZW07CisgICAgU3R5bGUgY2hTdHlsZTsKICNpZm5kZWYgR2V0SXRlbVN0eWxlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0SXRlbVN0eWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRJdGVtU3R5bGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpdGVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0SXRlbVN0eWxlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgIGl0ZW0sCi0JICAgICAgICAgICAgICZjaFN0eWxlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgY2hTdHlsZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpdGVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0SXRlbVN0eWxlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgIGl0ZW0sCisgICAgICAgICAgICAgICAgICZjaFN0eWxlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY2hTdHlsZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9TZXRNZW51SXRlbUNvbW1hbmRJRChNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVNJbnQxNiBpbkl0ZW07Ci0JTWVudUNvbW1hbmQgaW5Db21tYW5kSUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU0ludDE2IGluSXRlbTsKKyAgICBNZW51Q29tbWFuZCBpbkNvbW1hbmRJRDsKICNpZm5kZWYgU2V0TWVudUl0ZW1Db21tYW5kSUQKLQlQeU1hY19QUkVDSEVDSyhTZXRNZW51SXRlbUNvbW1hbmRJRCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TWVudUl0ZW1Db21tYW5kSUQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5Db21tYW5kSUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0TWVudUl0ZW1Db21tYW5kSUQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5JdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkNvbW1hbmRJRCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Db21tYW5kSUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0TWVudUl0ZW1Db21tYW5kSUQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5JdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkNvbW1hbmRJRCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9HZXRNZW51SXRlbUNvbW1hbmRJRChNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVNJbnQxNiBpbkl0ZW07Ci0JTWVudUNvbW1hbmQgb3V0Q29tbWFuZElEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFNJbnQxNiBpbkl0ZW07CisgICAgTWVudUNvbW1hbmQgb3V0Q29tbWFuZElEOwogI2lmbmRlZiBHZXRNZW51SXRlbUNvbW1hbmRJRAotCVB5TWFjX1BSRUNIRUNLKEdldE1lbnVJdGVtQ29tbWFuZElEKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNZW51SXRlbUNvbW1hbmRJRCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRNZW51SXRlbUNvbW1hbmRJRChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkl0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb21tYW5kSUQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIG91dENvbW1hbmRJRCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkl0ZW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0TWVudUl0ZW1Db21tYW5kSUQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5JdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29tbWFuZElEKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRDb21tYW5kSUQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfU2V0TWVudUl0ZW1Nb2RpZmllcnMoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlTSW50MTYgaW5JdGVtOwotCVVJbnQ4IGluTW9kaWZpZXJzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFNJbnQxNiBpbkl0ZW07CisgICAgVUludDggaW5Nb2RpZmllcnM7CiAjaWZuZGVmIFNldE1lbnVJdGVtTW9kaWZpZXJzCi0JUHlNYWNfUFJFQ0hFQ0soU2V0TWVudUl0ZW1Nb2RpZmllcnMpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldE1lbnVJdGVtTW9kaWZpZXJzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluTW9kaWZpZXJzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldE1lbnVJdGVtTW9kaWZpZXJzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Nb2RpZmllcnMpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluTW9kaWZpZXJzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldE1lbnVJdGVtTW9kaWZpZXJzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Nb2RpZmllcnMpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfR2V0TWVudUl0ZW1Nb2RpZmllcnMoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlTSW50MTYgaW5JdGVtOwotCVVJbnQ4IG91dE1vZGlmaWVyczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTSW50MTYgaW5JdGVtOworICAgIFVJbnQ4IG91dE1vZGlmaWVyczsKICNpZm5kZWYgR2V0TWVudUl0ZW1Nb2RpZmllcnMKLQlQeU1hY19QUkVDSEVDSyhHZXRNZW51SXRlbU1vZGlmaWVycyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TWVudUl0ZW1Nb2RpZmllcnMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkl0ZW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0TWVudUl0ZW1Nb2RpZmllcnMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5JdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0TW9kaWZpZXJzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRNb2RpZmllcnMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldE1lbnVJdGVtTW9kaWZpZXJzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dE1vZGlmaWVycyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0TW9kaWZpZXJzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX1NldE1lbnVJdGVtSWNvbkhhbmRsZShNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVNJbnQxNiBpbkl0ZW07Ci0JVUludDggaW5JY29uVHlwZTsKLQlIYW5kbGUgaW5JY29uSGFuZGxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFNJbnQxNiBpbkl0ZW07CisgICAgVUludDggaW5JY29uVHlwZTsKKyAgICBIYW5kbGUgaW5JY29uSGFuZGxlOwogI2lmbmRlZiBTZXRNZW51SXRlbUljb25IYW5kbGUKLQlQeU1hY19QUkVDSEVDSyhTZXRNZW51SXRlbUljb25IYW5kbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldE1lbnVJdGVtSWNvbkhhbmRsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoYk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluSWNvblR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaW5JY29uSGFuZGxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldE1lbnVJdGVtSWNvbkhhbmRsZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5JdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5JY29uVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSWNvbkhhbmRsZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkljb25UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmluSWNvbkhhbmRsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRNZW51SXRlbUljb25IYW5kbGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSWNvblR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkljb25IYW5kbGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfR2V0TWVudUl0ZW1JY29uSGFuZGxlKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU0ludDE2IGluSXRlbTsKLQlVSW50OCBvdXRJY29uVHlwZTsKLQlIYW5kbGUgb3V0SWNvbkhhbmRsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTSW50MTYgaW5JdGVtOworICAgIFVJbnQ4IG91dEljb25UeXBlOworICAgIEhhbmRsZSBvdXRJY29uSGFuZGxlOwogI2lmbmRlZiBHZXRNZW51SXRlbUljb25IYW5kbGUKLQlQeU1hY19QUkVDSEVDSyhHZXRNZW51SXRlbUljb25IYW5kbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1lbnVJdGVtSWNvbkhhbmRsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRNZW51SXRlbUljb25IYW5kbGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRJY29uVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRJY29uSGFuZGxlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIG91dEljb25UeXBlLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIG91dEljb25IYW5kbGUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldE1lbnVJdGVtSWNvbkhhbmRsZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5JdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEljb25UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEljb25IYW5kbGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0SWNvblR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgb3V0SWNvbkhhbmRsZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9TZXRNZW51SXRlbVRleHRFbmNvZGluZyhNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVNJbnQxNiBpbkl0ZW07Ci0JVGV4dEVuY29kaW5nIGluU2NyaXB0SUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU0ludDE2IGluSXRlbTsKKyAgICBUZXh0RW5jb2RpbmcgaW5TY3JpcHRJRDsKICNpZm5kZWYgU2V0TWVudUl0ZW1UZXh0RW5jb2RpbmcKLQlQeU1hY19QUkVDSEVDSyhTZXRNZW51SXRlbVRleHRFbmNvZGluZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TWVudUl0ZW1UZXh0RW5jb2RpbmcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5TY3JpcHRJRCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRNZW51SXRlbVRleHRFbmNvZGluZyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkl0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluU2NyaXB0SUQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluU2NyaXB0SUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0TWVudUl0ZW1UZXh0RW5jb2RpbmcoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5JdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblNjcmlwdElEKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX0dldE1lbnVJdGVtVGV4dEVuY29kaW5nKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU0ludDE2IGluSXRlbTsKLQlUZXh0RW5jb2Rpbmcgb3V0U2NyaXB0SUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU0ludDE2IGluSXRlbTsKKyAgICBUZXh0RW5jb2Rpbmcgb3V0U2NyaXB0SUQ7CiAjaWZuZGVmIEdldE1lbnVJdGVtVGV4dEVuY29kaW5nCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TWVudUl0ZW1UZXh0RW5jb2RpbmcpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1lbnVJdGVtVGV4dEVuY29kaW5nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldE1lbnVJdGVtVGV4dEVuY29kaW5nKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFNjcmlwdElEKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRTY3JpcHRJRCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkl0ZW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0TWVudUl0ZW1UZXh0RW5jb2RpbmcoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5JdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0U2NyaXB0SUQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dFNjcmlwdElEKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX1NldE1lbnVJdGVtSGllcmFyY2hpY2FsSUQoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlTSW50MTYgaW5JdGVtOwotCU1lbnVJRCBpbkhpZXJJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTSW50MTYgaW5JdGVtOworICAgIE1lbnVJRCBpbkhpZXJJRDsKICNpZm5kZWYgU2V0TWVudUl0ZW1IaWVyYXJjaGljYWxJRAotCVB5TWFjX1BSRUNIRUNLKFNldE1lbnVJdGVtSGllcmFyY2hpY2FsSUQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldE1lbnVJdGVtSGllcmFyY2hpY2FsSUQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5IaWVySUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0TWVudUl0ZW1IaWVyYXJjaGljYWxJRChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkhpZXJJRCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5IaWVySUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0TWVudUl0ZW1IaWVyYXJjaGljYWxJRChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkhpZXJJRCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9HZXRNZW51SXRlbUhpZXJhcmNoaWNhbElEKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU0ludDE2IGluSXRlbTsKLQlNZW51SUQgb3V0SGllcklEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFNJbnQxNiBpbkl0ZW07CisgICAgTWVudUlEIG91dEhpZXJJRDsKICNpZm5kZWYgR2V0TWVudUl0ZW1IaWVyYXJjaGljYWxJRAotCVB5TWFjX1BSRUNIRUNLKEdldE1lbnVJdGVtSGllcmFyY2hpY2FsSUQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1lbnVJdGVtSGllcmFyY2hpY2FsSUQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkl0ZW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0TWVudUl0ZW1IaWVyYXJjaGljYWxJRChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0SGllcklEKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRIaWVySUQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldE1lbnVJdGVtSGllcmFyY2hpY2FsSUQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEhpZXJJRCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0SGllcklEKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX1NldE1lbnVJdGVtRm9udElEKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU0ludDE2IGluSXRlbTsKLQlTSW50MTYgaW5Gb250SUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU0ludDE2IGluSXRlbTsKKyAgICBTSW50MTYgaW5Gb250SUQ7CiAjaWZuZGVmIFNldE1lbnVJdGVtRm9udElECi0JUHlNYWNfUFJFQ0hFQ0soU2V0TWVudUl0ZW1Gb250SUQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldE1lbnVJdGVtRm9udElEKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluRm9udElEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldE1lbnVJdGVtRm9udElEKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGluSXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgaW5Gb250SUQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluRm9udElEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldE1lbnVJdGVtRm9udElEKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Gb250SUQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfR2V0TWVudUl0ZW1Gb250SUQoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlTSW50MTYgaW5JdGVtOwotCVNJbnQxNiBvdXRGb250SUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU0ludDE2IGluSXRlbTsKKyAgICBTSW50MTYgb3V0Rm9udElEOwogI2lmbmRlZiBHZXRNZW51SXRlbUZvbnRJRAotCVB5TWFjX1BSRUNIRUNLKEdldE1lbnVJdGVtRm9udElEKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNZW51SXRlbUZvbnRJRCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRNZW51SXRlbUZvbnRJRChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBpbkl0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRGb250SUQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIG91dEZvbnRJRCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkl0ZW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0TWVudUl0ZW1Gb250SUQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5JdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Rm9udElEKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRGb250SUQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfU2V0TWVudUl0ZW1SZWZDb24oTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlTSW50MTYgaW5JdGVtOwotCVVJbnQzMiBpblJlZkNvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTSW50MTYgaW5JdGVtOworICAgIFVJbnQzMiBpblJlZkNvbjsKICNpZm5kZWYgU2V0TWVudUl0ZW1SZWZDb24KLQlQeU1hY19QUkVDSEVDSyhTZXRNZW51SXRlbVJlZkNvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TWVudUl0ZW1SZWZDb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5SZWZDb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0TWVudUl0ZW1SZWZDb24oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgaW5JdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBpblJlZkNvbik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5SZWZDb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0TWVudUl0ZW1SZWZDb24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5JdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblJlZkNvbik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9HZXRNZW51SXRlbVJlZkNvbihNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVNJbnQxNiBpbkl0ZW07Ci0JVUludDMyIG91dFJlZkNvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTSW50MTYgaW5JdGVtOworICAgIFVJbnQzMiBvdXRSZWZDb247CiAjaWZuZGVmIEdldE1lbnVJdGVtUmVmQ29uCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TWVudUl0ZW1SZWZDb24pOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1lbnVJdGVtUmVmQ29uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldE1lbnVJdGVtUmVmQ29uKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGluSXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFJlZkNvbik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0UmVmQ29uKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRNZW51SXRlbVJlZkNvbihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRSZWZDb24pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dFJlZkNvbik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9TZXRNZW51SXRlbUtleUdseXBoKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU0ludDE2IGluSXRlbTsKLQlTSW50MTYgaW5HbHlwaDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTSW50MTYgaW5JdGVtOworICAgIFNJbnQxNiBpbkdseXBoOwogI2lmbmRlZiBTZXRNZW51SXRlbUtleUdseXBoCi0JUHlNYWNfUFJFQ0hFQ0soU2V0TWVudUl0ZW1LZXlHbHlwaCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TWVudUl0ZW1LZXlHbHlwaCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkl0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkdseXBoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldE1lbnVJdGVtS2V5R2x5cGgoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkl0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5HbHlwaCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5HbHlwaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRNZW51SXRlbUtleUdseXBoKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5JdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluR2x5cGgpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfR2V0TWVudUl0ZW1LZXlHbHlwaChNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVNJbnQxNiBpbkl0ZW07Ci0JU0ludDE2IG91dEdseXBoOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFNJbnQxNiBpbkl0ZW07CisgICAgU0ludDE2IG91dEdseXBoOwogI2lmbmRlZiBHZXRNZW51SXRlbUtleUdseXBoCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TWVudUl0ZW1LZXlHbHlwaCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TWVudUl0ZW1LZXlHbHlwaCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRNZW51SXRlbUtleUdseXBoKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5JdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRHbHlwaCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0R2x5cGgpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldE1lbnVJdGVtS2V5R2x5cGgoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEdseXBoKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRHbHlwaCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9NYWNFbmFibGVNZW51SXRlbShNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlNZW51SXRlbUluZGV4IGl0ZW07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE1lbnVJdGVtSW5kZXggaXRlbTsKICNpZm5kZWYgTWFjRW5hYmxlTWVudUl0ZW0KLQlQeU1hY19QUkVDSEVDSyhNYWNFbmFibGVNZW51SXRlbSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWFjRW5hYmxlTWVudUl0ZW0pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpdGVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTWFjRW5hYmxlTWVudUl0ZW0oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICBpdGVtKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpdGVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTWFjRW5hYmxlTWVudUl0ZW0oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICBpdGVtKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9EaXNhYmxlTWVudUl0ZW0oTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JTWVudUl0ZW1JbmRleCBpdGVtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBNZW51SXRlbUluZGV4IGl0ZW07CiAjaWZuZGVmIERpc2FibGVNZW51SXRlbQotCVB5TWFjX1BSRUNIRUNLKERpc2FibGVNZW51SXRlbSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGlzYWJsZU1lbnVJdGVtKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXRlbSkpCi0JCXJldHVybiBOVUxMOwotCURpc2FibGVNZW51SXRlbShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICBpdGVtKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpdGVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgRGlzYWJsZU1lbnVJdGVtKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgIGl0ZW0pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX0lzTWVudUl0ZW1FbmFibGVkKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCU1lbnVJdGVtSW5kZXggaXRlbTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgTWVudUl0ZW1JbmRleCBpdGVtOwogI2lmbmRlZiBJc01lbnVJdGVtRW5hYmxlZAotCVB5TWFjX1BSRUNIRUNLKElzTWVudUl0ZW1FbmFibGVkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhJc01lbnVJdGVtRW5hYmxlZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJml0ZW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBJc01lbnVJdGVtRW5hYmxlZChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRlbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IElzTWVudUl0ZW1FbmFibGVkKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9FbmFibGVNZW51SXRlbUljb24oTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JTWVudUl0ZW1JbmRleCBpdGVtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBNZW51SXRlbUluZGV4IGl0ZW07CiAjaWZuZGVmIEVuYWJsZU1lbnVJdGVtSWNvbgotCVB5TWFjX1BSRUNIRUNLKEVuYWJsZU1lbnVJdGVtSWNvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soRW5hYmxlTWVudUl0ZW1JY29uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXRlbSkpCi0JCXJldHVybiBOVUxMOwotCUVuYWJsZU1lbnVJdGVtSWNvbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICBpdGVtKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpdGVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgRW5hYmxlTWVudUl0ZW1JY29uKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX0Rpc2FibGVNZW51SXRlbUljb24oTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JTWVudUl0ZW1JbmRleCBpdGVtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBNZW51SXRlbUluZGV4IGl0ZW07CiAjaWZuZGVmIERpc2FibGVNZW51SXRlbUljb24KLQlQeU1hY19QUkVDSEVDSyhEaXNhYmxlTWVudUl0ZW1JY29uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEaXNhYmxlTWVudUl0ZW1JY29uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXRlbSkpCi0JCXJldHVybiBOVUxMOwotCURpc2FibGVNZW51SXRlbUljb24oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgIGl0ZW0pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBEaXNhYmxlTWVudUl0ZW1JY29uKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICBpdGVtKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9Jc01lbnVJdGVtSWNvbkVuYWJsZWQoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JTWVudUl0ZW1JbmRleCBpdGVtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBNZW51SXRlbUluZGV4IGl0ZW07CiAjaWZuZGVmIElzTWVudUl0ZW1JY29uRW5hYmxlZAotCVB5TWFjX1BSRUNIRUNLKElzTWVudUl0ZW1JY29uRW5hYmxlZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSXNNZW51SXRlbUljb25FbmFibGVkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXRlbSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IElzTWVudUl0ZW1JY29uRW5hYmxlZChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBJc01lbnVJdGVtSWNvbkVuYWJsZWQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9TZXRNZW51SXRlbUhpZXJhcmNoaWNhbE1lbnUoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlNZW51SXRlbUluZGV4IGluSXRlbTsKLQlNZW51SGFuZGxlIGluSGllck1lbnU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgTWVudUl0ZW1JbmRleCBpbkl0ZW07CisgICAgTWVudUhhbmRsZSBpbkhpZXJNZW51OwogI2lmbmRlZiBTZXRNZW51SXRlbUhpZXJhcmNoaWNhbE1lbnUKLQlQeU1hY19QUkVDSEVDSyhTZXRNZW51SXRlbUhpZXJhcmNoaWNhbE1lbnUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldE1lbnVJdGVtSGllcmFyY2hpY2FsTWVudSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICBNZW51T2JqX0NvbnZlcnQsICZpbkhpZXJNZW51KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldE1lbnVJdGVtSGllcmFyY2hpY2FsTWVudShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5JdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5IaWVyTWVudSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTWVudU9ial9Db252ZXJ0LCAmaW5IaWVyTWVudSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRNZW51SXRlbUhpZXJhcmNoaWNhbE1lbnUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSGllck1lbnUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfR2V0TWVudUl0ZW1IaWVyYXJjaGljYWxNZW51KE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JTWVudUl0ZW1JbmRleCBpbkl0ZW07Ci0JTWVudUhhbmRsZSBvdXRIaWVyTWVudTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBNZW51SXRlbUluZGV4IGluSXRlbTsKKyAgICBNZW51SGFuZGxlIG91dEhpZXJNZW51OwogI2lmbmRlZiBHZXRNZW51SXRlbUhpZXJhcmNoaWNhbE1lbnUKLQlQeU1hY19QUkVDSEVDSyhHZXRNZW51SXRlbUhpZXJhcmNoaWNhbE1lbnUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1lbnVJdGVtSGllcmFyY2hpY2FsTWVudSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRNZW51SXRlbUhpZXJhcmNoaWNhbE1lbnUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRIaWVyTWVudSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIE9wdE1lbnVPYmpfTmV3LCBvdXRIaWVyTWVudSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkl0ZW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0TWVudUl0ZW1IaWVyYXJjaGljYWxNZW51KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0SGllck1lbnUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBPcHRNZW51T2JqX05ldywgb3V0SGllck1lbnUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfQ29weU1lbnVJdGVtVGV4dEFzQ0ZTdHJpbmcoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlNZW51SXRlbUluZGV4IGluSXRlbTsKLQlDRlN0cmluZ1JlZiBvdXRTdHJpbmc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgTWVudUl0ZW1JbmRleCBpbkl0ZW07CisgICAgQ0ZTdHJpbmdSZWYgb3V0U3RyaW5nOwogI2lmbmRlZiBDb3B5TWVudUl0ZW1UZXh0QXNDRlN0cmluZwotCVB5TWFjX1BSRUNIRUNLKENvcHlNZW51SXRlbVRleHRBc0NGU3RyaW5nKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb3B5TWVudUl0ZW1UZXh0QXNDRlN0cmluZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDb3B5TWVudUl0ZW1UZXh0QXNDRlN0cmluZyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkl0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRTdHJpbmcpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIG91dFN0cmluZyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkl0ZW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ29weU1lbnVJdGVtVGV4dEFzQ0ZTdHJpbmcoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5JdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0U3RyaW5nKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBvdXRTdHJpbmcpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfU2V0TWVudUl0ZW1UZXh0V2l0aENGU3RyaW5nKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JTWVudUl0ZW1JbmRleCBpbkl0ZW07Ci0JQ0ZTdHJpbmdSZWYgaW5TdHJpbmc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgTWVudUl0ZW1JbmRleCBpbkl0ZW07CisgICAgQ0ZTdHJpbmdSZWYgaW5TdHJpbmc7CiAjaWZuZGVmIFNldE1lbnVJdGVtVGV4dFdpdGhDRlN0cmluZwotCVB5TWFjX1BSRUNIRUNLKFNldE1lbnVJdGVtVGV4dFdpdGhDRlN0cmluZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TWVudUl0ZW1UZXh0V2l0aENGU3RyaW5nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkl0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZpblN0cmluZykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRNZW51SXRlbVRleHRXaXRoQ0ZTdHJpbmcoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluU3RyaW5nKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmaW5TdHJpbmcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0TWVudUl0ZW1UZXh0V2l0aENGU3RyaW5nKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblN0cmluZyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9HZXRNZW51SXRlbUluZGVudChNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCU1lbnVJdGVtSW5kZXggaW5JdGVtOwotCVVJbnQzMiBvdXRJbmRlbnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgTWVudUl0ZW1JbmRleCBpbkl0ZW07CisgICAgVUludDMyIG91dEluZGVudDsKICNpZm5kZWYgR2V0TWVudUl0ZW1JbmRlbnQKLQlQeU1hY19QUkVDSEVDSyhHZXRNZW51SXRlbUluZGVudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TWVudUl0ZW1JbmRlbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkl0ZW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0TWVudUl0ZW1JbmRlbnQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgaW5JdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0SW5kZW50KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRJbmRlbnQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldE1lbnVJdGVtSW5kZW50KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEluZGVudCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0SW5kZW50KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX1NldE1lbnVJdGVtSW5kZW50KE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JTWVudUl0ZW1JbmRleCBpbkl0ZW07Ci0JVUludDMyIGluSW5kZW50OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIE1lbnVJdGVtSW5kZXggaW5JdGVtOworICAgIFVJbnQzMiBpbkluZGVudDsKICNpZm5kZWYgU2V0TWVudUl0ZW1JbmRlbnQKLQlQeU1hY19QUkVDSEVDSyhTZXRNZW51SXRlbUluZGVudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TWVudUl0ZW1JbmRlbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5JbmRlbnQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0TWVudUl0ZW1JbmRlbnQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgaW5JdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBpbkluZGVudCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5JbmRlbnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0TWVudUl0ZW1JbmRlbnQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5JdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkluZGVudCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9HZXRNZW51SXRlbUNvbW1hbmRLZXkoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlNZW51SXRlbUluZGV4IGluSXRlbTsKLQlCb29sZWFuIGluR2V0VmlydHVhbEtleTsKLQlVSW50MTYgb3V0S2V5OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIE1lbnVJdGVtSW5kZXggaW5JdGVtOworICAgIEJvb2xlYW4gaW5HZXRWaXJ0dWFsS2V5OworICAgIFVJbnQxNiBvdXRLZXk7CiAjaWZuZGVmIEdldE1lbnVJdGVtQ29tbWFuZEtleQotCVB5TWFjX1BSRUNIRUNLKEdldE1lbnVJdGVtQ29tbWFuZEtleSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TWVudUl0ZW1Db21tYW5kS2V5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluR2V0VmlydHVhbEtleSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRNZW51SXRlbUNvbW1hbmRLZXkoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluR2V0VmlydHVhbEtleSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRLZXkpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIkgiLAotCSAgICAgICAgICAgICAgICAgICAgIG91dEtleSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5HZXRWaXJ0dWFsS2V5KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldE1lbnVJdGVtQ29tbWFuZEtleShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5JdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5HZXRWaXJ0dWFsS2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEtleSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0S2V5KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX1NldE1lbnVJdGVtQ29tbWFuZEtleShNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCU1lbnVJdGVtSW5kZXggaW5JdGVtOwotCUJvb2xlYW4gaW5TZXRWaXJ0dWFsS2V5OwotCVVJbnQxNiBpbktleTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBNZW51SXRlbUluZGV4IGluSXRlbTsKKyAgICBCb29sZWFuIGluU2V0VmlydHVhbEtleTsKKyAgICBVSW50MTYgaW5LZXk7CiAjaWZuZGVmIFNldE1lbnVJdGVtQ29tbWFuZEtleQotCVB5TWFjX1BSRUNIRUNLKFNldE1lbnVJdGVtQ29tbWFuZEtleSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TWVudUl0ZW1Db21tYW5kS2V5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhiSCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkl0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgICZpblNldFZpcnR1YWxLZXksCi0JICAgICAgICAgICAgICAgICAgICAgICZpbktleSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRNZW51SXRlbUNvbW1hbmRLZXkoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluU2V0VmlydHVhbEtleSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluS2V5KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoYkgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5TZXRWaXJ0dWFsS2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5LZXkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0TWVudUl0ZW1Db21tYW5kS2V5KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblNldFZpcnR1YWxLZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbktleSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9HZXRNZW51SXRlbVByb3BlcnR5QXR0cmlidXRlcyhNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCU1lbnVJdGVtSW5kZXggaXRlbTsKLQlPU1R5cGUgcHJvcGVydHlDcmVhdG9yOwotCU9TVHlwZSBwcm9wZXJ0eVRhZzsKLQlVSW50MzIgYXR0cmlidXRlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBNZW51SXRlbUluZGV4IGl0ZW07CisgICAgT1NUeXBlIHByb3BlcnR5Q3JlYXRvcjsKKyAgICBPU1R5cGUgcHJvcGVydHlUYWc7CisgICAgVUludDMyIGF0dHJpYnV0ZXM7CiAjaWZuZGVmIEdldE1lbnVJdGVtUHJvcGVydHlBdHRyaWJ1dGVzCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TWVudUl0ZW1Qcm9wZXJ0eUF0dHJpYnV0ZXMpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1lbnVJdGVtUHJvcGVydHlBdHRyaWJ1dGVzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJml0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnByb3BlcnR5Q3JlYXRvciwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcHJvcGVydHlUYWcpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0TWVudUl0ZW1Qcm9wZXJ0eUF0dHJpYnV0ZXMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlDcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVRhZywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmF0dHJpYnV0ZXMpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnByb3BlcnR5Q3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcHJvcGVydHlUYWcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0TWVudUl0ZW1Qcm9wZXJ0eUF0dHJpYnV0ZXMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlDcmVhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmF0dHJpYnV0ZXMpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfQ2hhbmdlTWVudUl0ZW1Qcm9wZXJ0eUF0dHJpYnV0ZXMoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlNZW51SXRlbUluZGV4IGl0ZW07Ci0JT1NUeXBlIHByb3BlcnR5Q3JlYXRvcjsKLQlPU1R5cGUgcHJvcGVydHlUYWc7Ci0JVUludDMyIGF0dHJpYnV0ZXNUb1NldDsKLQlVSW50MzIgYXR0cmlidXRlc1RvQ2xlYXI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgTWVudUl0ZW1JbmRleCBpdGVtOworICAgIE9TVHlwZSBwcm9wZXJ0eUNyZWF0b3I7CisgICAgT1NUeXBlIHByb3BlcnR5VGFnOworICAgIFVJbnQzMiBhdHRyaWJ1dGVzVG9TZXQ7CisgICAgVUludDMyIGF0dHJpYnV0ZXNUb0NsZWFyOwogI2lmbmRlZiBDaGFuZ2VNZW51SXRlbVByb3BlcnR5QXR0cmlidXRlcwotCVB5TWFjX1BSRUNIRUNLKENoYW5nZU1lbnVJdGVtUHJvcGVydHlBdHRyaWJ1dGVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDaGFuZ2VNZW51SXRlbVByb3BlcnR5QXR0cmlidXRlcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyZPJmxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJml0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnByb3BlcnR5Q3JlYXRvciwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcHJvcGVydHlUYWcsCi0JICAgICAgICAgICAgICAgICAgICAgICZhdHRyaWJ1dGVzVG9TZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICZhdHRyaWJ1dGVzVG9DbGVhcikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDaGFuZ2VNZW51SXRlbVByb3BlcnR5QXR0cmlidXRlcyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eUNyZWF0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5VGFnLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzVG9TZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXNUb0NsZWFyKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyZPJmxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnByb3BlcnR5Q3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcHJvcGVydHlUYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhdHRyaWJ1dGVzVG9TZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhdHRyaWJ1dGVzVG9DbGVhcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDaGFuZ2VNZW51SXRlbVByb3BlcnR5QXR0cmlidXRlcyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eUNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5VGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzVG9TZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXNUb0NsZWFyKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX0dldE1lbnVBdHRyaWJ1dGVzKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JTWVudUF0dHJpYnV0ZXMgb3V0QXR0cmlidXRlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBNZW51QXR0cmlidXRlcyBvdXRBdHRyaWJ1dGVzOwogI2lmbmRlZiBHZXRNZW51QXR0cmlidXRlcwotCVB5TWFjX1BSRUNIRUNLKEdldE1lbnVBdHRyaWJ1dGVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNZW51QXR0cmlidXRlcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldE1lbnVBdHRyaWJ1dGVzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRBdHRyaWJ1dGVzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRBdHRyaWJ1dGVzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldE1lbnVBdHRyaWJ1dGVzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRBdHRyaWJ1dGVzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRBdHRyaWJ1dGVzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX0NoYW5nZU1lbnVBdHRyaWJ1dGVzKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JTWVudUF0dHJpYnV0ZXMgc2V0VGhlc2VBdHRyaWJ1dGVzOwotCU1lbnVBdHRyaWJ1dGVzIGNsZWFyVGhlc2VBdHRyaWJ1dGVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIE1lbnVBdHRyaWJ1dGVzIHNldFRoZXNlQXR0cmlidXRlczsKKyAgICBNZW51QXR0cmlidXRlcyBjbGVhclRoZXNlQXR0cmlidXRlczsKICNpZm5kZWYgQ2hhbmdlTWVudUF0dHJpYnV0ZXMKLQlQeU1hY19QUkVDSEVDSyhDaGFuZ2VNZW51QXR0cmlidXRlcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ2hhbmdlTWVudUF0dHJpYnV0ZXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2V0VGhlc2VBdHRyaWJ1dGVzLAotCSAgICAgICAgICAgICAgICAgICAgICAmY2xlYXJUaGVzZUF0dHJpYnV0ZXMpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ2hhbmdlTWVudUF0dHJpYnV0ZXMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGhlc2VBdHRyaWJ1dGVzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRoZXNlQXR0cmlidXRlcyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2V0VGhlc2VBdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY2xlYXJUaGVzZUF0dHJpYnV0ZXMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ2hhbmdlTWVudUF0dHJpYnV0ZXMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGhlc2VBdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRoZXNlQXR0cmlidXRlcyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9HZXRNZW51SXRlbUF0dHJpYnV0ZXMoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlNZW51SXRlbUluZGV4IGl0ZW07Ci0JTWVudUl0ZW1BdHRyaWJ1dGVzIG91dEF0dHJpYnV0ZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgTWVudUl0ZW1JbmRleCBpdGVtOworICAgIE1lbnVJdGVtQXR0cmlidXRlcyBvdXRBdHRyaWJ1dGVzOwogI2lmbmRlZiBHZXRNZW51SXRlbUF0dHJpYnV0ZXMKLQlQeU1hY19QUkVDSEVDSyhHZXRNZW51SXRlbUF0dHJpYnV0ZXMpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1lbnVJdGVtQXR0cmlidXRlcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJml0ZW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0TWVudUl0ZW1BdHRyaWJ1dGVzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEF0dHJpYnV0ZXMpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIG91dEF0dHJpYnV0ZXMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRlbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRNZW51SXRlbUF0dHJpYnV0ZXMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0QXR0cmlidXRlcyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0QXR0cmlidXRlcyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9DaGFuZ2VNZW51SXRlbUF0dHJpYnV0ZXMoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlNZW51SXRlbUluZGV4IGl0ZW07Ci0JTWVudUl0ZW1BdHRyaWJ1dGVzIHNldFRoZXNlQXR0cmlidXRlczsKLQlNZW51SXRlbUF0dHJpYnV0ZXMgY2xlYXJUaGVzZUF0dHJpYnV0ZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgTWVudUl0ZW1JbmRleCBpdGVtOworICAgIE1lbnVJdGVtQXR0cmlidXRlcyBzZXRUaGVzZUF0dHJpYnV0ZXM7CisgICAgTWVudUl0ZW1BdHRyaWJ1dGVzIGNsZWFyVGhlc2VBdHRyaWJ1dGVzOwogI2lmbmRlZiBDaGFuZ2VNZW51SXRlbUF0dHJpYnV0ZXMKLQlQeU1hY19QUkVDSEVDSyhDaGFuZ2VNZW51SXRlbUF0dHJpYnV0ZXMpOworICAgIFB5TWFjX1BSRUNIRUNLKENoYW5nZU1lbnVJdGVtQXR0cmlidXRlcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNldFRoZXNlQXR0cmlidXRlcywKLQkgICAgICAgICAgICAgICAgICAgICAgJmNsZWFyVGhlc2VBdHRyaWJ1dGVzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENoYW5nZU1lbnVJdGVtQXR0cmlidXRlcyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRoZXNlQXR0cmlidXRlcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGhlc2VBdHRyaWJ1dGVzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNldFRoZXNlQXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNsZWFyVGhlc2VBdHRyaWJ1dGVzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENoYW5nZU1lbnVJdGVtQXR0cmlidXRlcyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRoZXNlQXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGhlc2VBdHRyaWJ1dGVzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX0Rpc2FibGVBbGxNZW51SXRlbXMoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBEaXNhYmxlQWxsTWVudUl0ZW1zCi0JUHlNYWNfUFJFQ0hFQ0soRGlzYWJsZUFsbE1lbnVJdGVtcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGlzYWJsZUFsbE1lbnVJdGVtcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JRGlzYWJsZUFsbE1lbnVJdGVtcyhfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIERpc2FibGVBbGxNZW51SXRlbXMoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfRW5hYmxlQWxsTWVudUl0ZW1zKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgRW5hYmxlQWxsTWVudUl0ZW1zCi0JUHlNYWNfUFJFQ0hFQ0soRW5hYmxlQWxsTWVudUl0ZW1zKTsKKyAgICBQeU1hY19QUkVDSEVDSyhFbmFibGVBbGxNZW51SXRlbXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUVuYWJsZUFsbE1lbnVJdGVtcyhfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEVuYWJsZUFsbE1lbnVJdGVtcyhfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9NZW51SGFzRW5hYmxlZEl0ZW1zKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKICNpZm5kZWYgTWVudUhhc0VuYWJsZWRJdGVtcwotCVB5TWFjX1BSRUNIRUNLKE1lbnVIYXNFbmFibGVkSXRlbXMpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lbnVIYXNFbmFibGVkSXRlbXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lbnVIYXNFbmFibGVkSXRlbXMoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lbnVIYXNFbmFibGVkSXRlbXMoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9HZXRNZW51VHlwZShNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVVJbnQxNiBvdXRUeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQxNiBvdXRUeXBlOwogI2lmbmRlZiBHZXRNZW51VHlwZQotCVB5TWFjX1BSRUNIRUNLKEdldE1lbnVUeXBlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNZW51VHlwZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldE1lbnVUeXBlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICZvdXRUeXBlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJIIiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRUeXBlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldE1lbnVUeXBlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICZvdXRUeXBlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRUeXBlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX0NvdW50TWVudUl0ZW1zV2l0aENvbW1hbmRJRChNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlJdGVtQ291bnQgX3J2OwotCU1lbnVDb21tYW5kIGluQ29tbWFuZElEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBJdGVtQ291bnQgX3J2OworICAgIE1lbnVDb21tYW5kIGluQ29tbWFuZElEOwogI2lmbmRlZiBDb3VudE1lbnVJdGVtc1dpdGhDb21tYW5kSUQKLQlQeU1hY19QUkVDSEVDSyhDb3VudE1lbnVJdGVtc1dpdGhDb21tYW5kSUQpOworICAgIFB5TWFjX1BSRUNIRUNLKENvdW50TWVudUl0ZW1zV2l0aENvbW1hbmRJRCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluQ29tbWFuZElEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ291bnRNZW51SXRlbXNXaXRoQ29tbWFuZElEKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQ29tbWFuZElEKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQ29tbWFuZElEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ291bnRNZW51SXRlbXNXaXRoQ29tbWFuZElEKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQ29tbWFuZElEKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX0dldEluZE1lbnVJdGVtV2l0aENvbW1hbmRJRChNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCU1lbnVDb21tYW5kIGluQ29tbWFuZElEOwotCVVJbnQzMiBpbkl0ZW1JbmRleDsKLQlNZW51SGFuZGxlIG91dE1lbnU7Ci0JTWVudUl0ZW1JbmRleCBvdXRJbmRleDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBNZW51Q29tbWFuZCBpbkNvbW1hbmRJRDsKKyAgICBVSW50MzIgaW5JdGVtSW5kZXg7CisgICAgTWVudUhhbmRsZSBvdXRNZW51OworICAgIE1lbnVJdGVtSW5kZXggb3V0SW5kZXg7CiAjaWZuZGVmIEdldEluZE1lbnVJdGVtV2l0aENvbW1hbmRJRAotCVB5TWFjX1BSRUNIRUNLKEdldEluZE1lbnVJdGVtV2l0aENvbW1hbmRJRCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0SW5kTWVudUl0ZW1XaXRoQ29tbWFuZElEKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluQ29tbWFuZElELAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtSW5kZXgpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0SW5kTWVudUl0ZW1XaXRoQ29tbWFuZElEKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkNvbW1hbmRJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXRlbUluZGV4LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dE1lbnUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0SW5kZXgpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgTWVudU9ial9OZXcsIG91dE1lbnUsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0SW5kZXgpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQ29tbWFuZElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtSW5kZXgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0SW5kTWVudUl0ZW1XaXRoQ29tbWFuZElEKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkNvbW1hbmRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXRlbUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dE1lbnUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0SW5kZXgpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgTWVudU9ial9OZXcsIG91dE1lbnUsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0SW5kZXgpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfRW5hYmxlTWVudUNvbW1hbmQoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JTWVudUNvbW1hbmQgaW5Db21tYW5kSUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE1lbnVDb21tYW5kIGluQ29tbWFuZElEOwogI2lmbmRlZiBFbmFibGVNZW51Q29tbWFuZAotCVB5TWFjX1BSRUNIRUNLKEVuYWJsZU1lbnVDb21tYW5kKTsKKyAgICBQeU1hY19QUkVDSEVDSyhFbmFibGVNZW51Q29tbWFuZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluQ29tbWFuZElEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JRW5hYmxlTWVudUNvbW1hbmQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICBpbkNvbW1hbmRJRCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Db21tYW5kSUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBFbmFibGVNZW51Q29tbWFuZChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgIGluQ29tbWFuZElEKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9EaXNhYmxlTWVudUNvbW1hbmQoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JTWVudUNvbW1hbmQgaW5Db21tYW5kSUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE1lbnVDb21tYW5kIGluQ29tbWFuZElEOwogI2lmbmRlZiBEaXNhYmxlTWVudUNvbW1hbmQKLQlQeU1hY19QUkVDSEVDSyhEaXNhYmxlTWVudUNvbW1hbmQpOworICAgIFB5TWFjX1BSRUNIRUNLKERpc2FibGVNZW51Q29tbWFuZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluQ29tbWFuZElEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JRGlzYWJsZU1lbnVDb21tYW5kKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgIGluQ29tbWFuZElEKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkNvbW1hbmRJRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIERpc2FibGVNZW51Q29tbWFuZChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICBpbkNvbW1hbmRJRCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfSXNNZW51Q29tbWFuZEVuYWJsZWQoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JTWVudUNvbW1hbmQgaW5Db21tYW5kSUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIE1lbnVDb21tYW5kIGluQ29tbWFuZElEOwogI2lmbmRlZiBJc01lbnVDb21tYW5kRW5hYmxlZAotCVB5TWFjX1BSRUNIRUNLKElzTWVudUNvbW1hbmRFbmFibGVkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhJc01lbnVDb21tYW5kRW5hYmxlZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluQ29tbWFuZElEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gSXNNZW51Q29tbWFuZEVuYWJsZWQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkNvbW1hbmRJRCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkNvbW1hbmRJRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IElzTWVudUNvbW1hbmRFbmFibGVkKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Db21tYW5kSUQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfU2V0TWVudUNvbW1hbmRNYXJrKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JTWVudUNvbW1hbmQgaW5Db21tYW5kSUQ7Ci0JVW5pQ2hhciBpbk1hcms7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgTWVudUNvbW1hbmQgaW5Db21tYW5kSUQ7CisgICAgVW5pQ2hhciBpbk1hcms7CiAjaWZuZGVmIFNldE1lbnVDb21tYW5kTWFyawotCVB5TWFjX1BSRUNIRUNLKFNldE1lbnVDb21tYW5kTWFyayk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TWVudUNvbW1hbmRNYXJrKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluQ29tbWFuZElELAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5NYXJrKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldE1lbnVDb21tYW5kTWFyayhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Db21tYW5kSUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBpbk1hcmspOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQ29tbWFuZElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5NYXJrKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldE1lbnVDb21tYW5kTWFyayhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Db21tYW5kSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbk1hcmspOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfR2V0TWVudUNvbW1hbmRNYXJrKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JTWVudUNvbW1hbmQgaW5Db21tYW5kSUQ7Ci0JVW5pQ2hhciBvdXRNYXJrOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIE1lbnVDb21tYW5kIGluQ29tbWFuZElEOworICAgIFVuaUNoYXIgb3V0TWFyazsKICNpZm5kZWYgR2V0TWVudUNvbW1hbmRNYXJrCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TWVudUNvbW1hbmRNYXJrKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNZW51Q29tbWFuZE1hcmspOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkNvbW1hbmRJRCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRNZW51Q29tbWFuZE1hcmsoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGluQ29tbWFuZElELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dE1hcmspOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIG91dE1hcmspOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Db21tYW5kSUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0TWVudUNvbW1hbmRNYXJrKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkNvbW1hbmRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRNYXJrKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRNYXJrKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX0dldE1lbnVDb21tYW5kUHJvcGVydHlTaXplKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JTWVudUNvbW1hbmQgaW5Db21tYW5kSUQ7Ci0JT1NUeXBlIGluUHJvcGVydHlDcmVhdG9yOwotCU9TVHlwZSBpblByb3BlcnR5VGFnOwotCUJ5dGVDb3VudCBvdXRTaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIE1lbnVDb21tYW5kIGluQ29tbWFuZElEOworICAgIE9TVHlwZSBpblByb3BlcnR5Q3JlYXRvcjsKKyAgICBPU1R5cGUgaW5Qcm9wZXJ0eVRhZzsKKyAgICBCeXRlQ291bnQgb3V0U2l6ZTsKICNpZm5kZWYgR2V0TWVudUNvbW1hbmRQcm9wZXJ0eVNpemUKLQlQeU1hY19QUkVDSEVDSyhHZXRNZW51Q29tbWFuZFByb3BlcnR5U2l6ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TWVudUNvbW1hbmRQcm9wZXJ0eVNpemUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5Db21tYW5kSUQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmluUHJvcGVydHlDcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpblByb3BlcnR5VGFnKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldE1lbnVDb21tYW5kUHJvcGVydHlTaXplKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQ29tbWFuZElELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblByb3BlcnR5Q3JlYXRvciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Qcm9wZXJ0eVRhZywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFNpemUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIG91dFNpemUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQ29tbWFuZElELAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpblByb3BlcnR5Q3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaW5Qcm9wZXJ0eVRhZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRNZW51Q29tbWFuZFByb3BlcnR5U2l6ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkNvbW1hbmRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Qcm9wZXJ0eUNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluUHJvcGVydHlUYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRTaXplKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRTaXplKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX1JlbW92ZU1lbnVDb21tYW5kUHJvcGVydHkoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlNZW51Q29tbWFuZCBpbkNvbW1hbmRJRDsKLQlPU1R5cGUgaW5Qcm9wZXJ0eUNyZWF0b3I7Ci0JT1NUeXBlIGluUHJvcGVydHlUYWc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgTWVudUNvbW1hbmQgaW5Db21tYW5kSUQ7CisgICAgT1NUeXBlIGluUHJvcGVydHlDcmVhdG9yOworICAgIE9TVHlwZSBpblByb3BlcnR5VGFnOwogI2lmbmRlZiBSZW1vdmVNZW51Q29tbWFuZFByb3BlcnR5Ci0JUHlNYWNfUFJFQ0hFQ0soUmVtb3ZlTWVudUNvbW1hbmRQcm9wZXJ0eSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUmVtb3ZlTWVudUNvbW1hbmRQcm9wZXJ0eSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkNvbW1hbmRJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaW5Qcm9wZXJ0eUNyZWF0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmluUHJvcGVydHlUYWcpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUmVtb3ZlTWVudUNvbW1hbmRQcm9wZXJ0eShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQ29tbWFuZElELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluUHJvcGVydHlDcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluUHJvcGVydHlUYWcpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQ29tbWFuZElELAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpblByb3BlcnR5Q3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaW5Qcm9wZXJ0eVRhZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBSZW1vdmVNZW51Q29tbWFuZFByb3BlcnR5KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Db21tYW5kSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Qcm9wZXJ0eUNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Qcm9wZXJ0eVRhZyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9Jc01lbnVJdGVtSW52YWxpZChNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlNZW51SXRlbUluZGV4IGluSXRlbTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgTWVudUl0ZW1JbmRleCBpbkl0ZW07CiAjaWZuZGVmIElzTWVudUl0ZW1JbnZhbGlkCi0JUHlNYWNfUFJFQ0hFQ0soSXNNZW51SXRlbUludmFsaWQpOworICAgIFB5TWFjX1BSRUNIRUNLKElzTWVudUl0ZW1JbnZhbGlkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gSXNNZW51SXRlbUludmFsaWQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICBpbkl0ZW0pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gSXNNZW51SXRlbUludmFsaWQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkl0ZW0pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfSW52YWxpZGF0ZU1lbnVJdGVtcyhNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCU1lbnVJdGVtSW5kZXggaW5GaXJzdEl0ZW07Ci0JSXRlbUNvdW50IGluTnVtSXRlbXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgTWVudUl0ZW1JbmRleCBpbkZpcnN0SXRlbTsKKyAgICBJdGVtQ291bnQgaW5OdW1JdGVtczsKICNpZm5kZWYgSW52YWxpZGF0ZU1lbnVJdGVtcwotCVB5TWFjX1BSRUNIRUNLKEludmFsaWRhdGVNZW51SXRlbXMpOworICAgIFB5TWFjX1BSRUNIRUNLKEludmFsaWRhdGVNZW51SXRlbXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5GaXJzdEl0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgICZpbk51bUl0ZW1zKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEludmFsaWRhdGVNZW51SXRlbXMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkZpcnN0SXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBpbk51bUl0ZW1zKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkZpcnN0SXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluTnVtSXRlbXMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gSW52YWxpZGF0ZU1lbnVJdGVtcyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRmlyc3RJdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluTnVtSXRlbXMpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfVXBkYXRlSW52YWxpZE1lbnVJdGVtcyhNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOwogI2lmbmRlZiBVcGRhdGVJbnZhbGlkTWVudUl0ZW1zCi0JUHlNYWNfUFJFQ0hFQ0soVXBkYXRlSW52YWxpZE1lbnVJdGVtcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVXBkYXRlSW52YWxpZE1lbnVJdGVtcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFVwZGF0ZUludmFsaWRNZW51SXRlbXMoX3NlbGYtPm9iX2l0c2VsZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBVcGRhdGVJbnZhbGlkTWVudUl0ZW1zKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfQ3JlYXRlU3RhbmRhcmRGb250TWVudShNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCU1lbnVJdGVtSW5kZXggYWZ0ZXJJdGVtOwotCU1lbnVJRCBmaXJzdEhpZXJNZW51SUQ7Ci0JT3B0aW9uQml0cyBvcHRpb25zOwotCUl0ZW1Db3VudCBvdXRIaWVyTWVudUNvdW50OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIE1lbnVJdGVtSW5kZXggYWZ0ZXJJdGVtOworICAgIE1lbnVJRCBmaXJzdEhpZXJNZW51SUQ7CisgICAgT3B0aW9uQml0cyBvcHRpb25zOworICAgIEl0ZW1Db3VudCBvdXRIaWVyTWVudUNvdW50OwogI2lmbmRlZiBDcmVhdGVTdGFuZGFyZEZvbnRNZW51Ci0JUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlU3RhbmRhcmRGb250TWVudSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlU3RhbmRhcmRGb250TWVudSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmYWZ0ZXJJdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmlyc3RIaWVyTWVudUlELAotCSAgICAgICAgICAgICAgICAgICAgICAmb3B0aW9ucykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDcmVhdGVTdGFuZGFyZEZvbnRNZW51KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJJdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0SGllck1lbnVJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRIaWVyTWVudUNvdW50KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRIaWVyTWVudUNvdW50KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYWZ0ZXJJdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlyc3RIaWVyTWVudUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAmb3B0aW9ucykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDcmVhdGVTdGFuZGFyZEZvbnRNZW51KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJJdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0SGllck1lbnVJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRIaWVyTWVudUNvdW50KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRIaWVyTWVudUNvdW50KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX1VwZGF0ZVN0YW5kYXJkRm9udE1lbnUoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlJdGVtQ291bnQgb3V0SGllck1lbnVDb3VudDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBJdGVtQ291bnQgb3V0SGllck1lbnVDb3VudDsKICNpZm5kZWYgVXBkYXRlU3RhbmRhcmRGb250TWVudQotCVB5TWFjX1BSRUNIRUNLKFVwZGF0ZVN0YW5kYXJkRm9udE1lbnUpOworICAgIFB5TWFjX1BSRUNIRUNLKFVwZGF0ZVN0YW5kYXJkRm9udE1lbnUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBVcGRhdGVTdGFuZGFyZEZvbnRNZW51KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEhpZXJNZW51Q291bnQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIG91dEhpZXJNZW51Q291bnQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVXBkYXRlU3RhbmRhcmRGb250TWVudShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRIaWVyTWVudUNvdW50KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRIaWVyTWVudUNvdW50KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX0dldEZvbnRGYW1pbHlGcm9tTWVudVNlbGVjdGlvbihNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCU1lbnVJdGVtSW5kZXggaXRlbTsKLQlGTUZvbnRGYW1pbHkgb3V0Rm9udEZhbWlseTsKLQlGTUZvbnRTdHlsZSBvdXRTdHlsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBNZW51SXRlbUluZGV4IGl0ZW07CisgICAgRk1Gb250RmFtaWx5IG91dEZvbnRGYW1pbHk7CisgICAgRk1Gb250U3R5bGUgb3V0U3R5bGU7CiAjaWZuZGVmIEdldEZvbnRGYW1pbHlGcm9tTWVudVNlbGVjdGlvbgotCVB5TWFjX1BSRUNIRUNLKEdldEZvbnRGYW1pbHlGcm9tTWVudVNlbGVjdGlvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0Rm9udEZhbWlseUZyb21NZW51U2VsZWN0aW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXRlbSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRGb250RmFtaWx5RnJvbU1lbnVTZWxlY3Rpb24oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Rm9udEZhbWlseSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRTdHlsZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaGgiLAotCSAgICAgICAgICAgICAgICAgICAgIG91dEZvbnRGYW1pbHksCi0JICAgICAgICAgICAgICAgICAgICAgb3V0U3R5bGUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRlbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRGb250RmFtaWx5RnJvbU1lbnVTZWxlY3Rpb24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Rm9udEZhbWlseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRTdHlsZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dEZvbnRGYW1pbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0U3R5bGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfR2V0TWVudUlEKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU1lbnVJRCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE1lbnVJRCBfcnY7CiAjaWZuZGVmIEdldE1lbnVJRAotCVB5TWFjX1BSRUNIRUNLKEdldE1lbnVJRCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TWVudUlEKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRNZW51SUQoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE1lbnVJRChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX0dldE1lbnVXaWR0aChNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTSW50MTYgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTSW50MTYgX3J2OwogI2lmbmRlZiBHZXRNZW51V2lkdGgKLQlQeU1hY19QUkVDSEVDSyhHZXRNZW51V2lkdGgpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1lbnVXaWR0aCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TWVudVdpZHRoKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRNZW51V2lkdGgoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9HZXRNZW51SGVpZ2h0KE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVNJbnQxNiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFNJbnQxNiBfcnY7CiAjaWZuZGVmIEdldE1lbnVIZWlnaHQKLQlQeU1hY19QUkVDSEVDSyhHZXRNZW51SGVpZ2h0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNZW51SGVpZ2h0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRNZW51SGVpZ2h0KF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRNZW51SGVpZ2h0KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfU2V0TWVudUlEKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU1lbnVJRCBtZW51SUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE1lbnVJRCBtZW51SUQ7CiAjaWZuZGVmIFNldE1lbnVJRAotCVB5TWFjX1BSRUNIRUNLKFNldE1lbnVJRCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TWVudUlEKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmbWVudUlEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0TWVudUlEKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgIG1lbnVJRCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVudUlEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0TWVudUlEKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgIG1lbnVJRCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfU2V0TWVudVdpZHRoKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVNJbnQxNiB3aWR0aDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgU0ludDE2IHdpZHRoOwogI2lmbmRlZiBTZXRNZW51V2lkdGgKLQlQeU1hY19QUkVDSEVDSyhTZXRNZW51V2lkdGgpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldE1lbnVXaWR0aCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJndpZHRoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0TWVudVdpZHRoKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgIHdpZHRoKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ3aWR0aCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldE1lbnVXaWR0aChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICB3aWR0aCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfU2V0TWVudUhlaWdodChNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTSW50MTYgaGVpZ2h0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTSW50MTYgaGVpZ2h0OwogI2lmbmRlZiBTZXRNZW51SGVpZ2h0Ci0JUHlNYWNfUFJFQ0hFQ0soU2V0TWVudUhlaWdodCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TWVudUhlaWdodCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmhlaWdodCkpCi0JCXJldHVybiBOVUxMOwotCVNldE1lbnVIZWlnaHQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgIGhlaWdodCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaGVpZ2h0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0TWVudUhlaWdodChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgaGVpZ2h0KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9hc19SZXNvdXJjZShNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlIYW5kbGUgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBIYW5kbGUgX3J2OwogI2lmbmRlZiBhc19SZXNvdXJjZQotCVB5TWFjX1BSRUNIRUNLKGFzX1Jlc291cmNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhhc19SZXNvdXJjZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gYXNfUmVzb3VyY2UoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBhc19SZXNvdXJjZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9BcHBlbmRNZW51KE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVN0cjI1NSBkYXRhOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTdHIyNTUgZGF0YTsKICNpZm5kZWYgQXBwZW5kTWVudQotCVB5TWFjX1BSRUNIRUNLKEFwcGVuZE1lbnUpOworICAgIFB5TWFjX1BSRUNIRUNLKEFwcGVuZE1lbnUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIGRhdGEpKQotCQlyZXR1cm4gTlVMTDsKLQlBcHBlbmRNZW51KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICBkYXRhKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIGRhdGEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBBcHBlbmRNZW51KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICBkYXRhKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9JbnNlcnRNZW51KE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IGJlZm9yZUlEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBiZWZvcmVJRDsKICNpZm5kZWYgSW5zZXJ0TWVudQotCVB5TWFjX1BSRUNIRUNLKEluc2VydE1lbnUpOworICAgIFB5TWFjX1BSRUNIRUNLKEluc2VydE1lbnUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZiZWZvcmVJRCkpCi0JCXJldHVybiBOVUxMOwotCUluc2VydE1lbnUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgIGJlZm9yZUlEKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZiZWZvcmVJRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEluc2VydE1lbnUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgIGJlZm9yZUlEKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9JbnNlcnRNZW51SXRlbShNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTdHIyNTUgaXRlbVN0cmluZzsKLQlzaG9ydCBhZnRlckl0ZW07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFN0cjI1NSBpdGVtU3RyaW5nOworICAgIHNob3J0IGFmdGVySXRlbTsKICNpZm5kZWYgSW5zZXJ0TWVudUl0ZW0KLQlQeU1hY19QUkVDSEVDSyhJbnNlcnRNZW51SXRlbSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSW5zZXJ0TWVudUl0ZW0pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBpdGVtU3RyaW5nLAotCSAgICAgICAgICAgICAgICAgICAgICAmYWZ0ZXJJdGVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JSW5zZXJ0TWVudUl0ZW0oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICBpdGVtU3RyaW5nLAotCSAgICAgICAgICAgICAgIGFmdGVySXRlbSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgaXRlbVN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFmdGVySXRlbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEluc2VydE1lbnVJdGVtKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgaXRlbVN0cmluZywKKyAgICAgICAgICAgICAgICAgICBhZnRlckl0ZW0pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX0VuYWJsZU1lbnVJdGVtKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVVJbnQxNiBpdGVtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBVSW50MTYgaXRlbTsKICNpZm5kZWYgRW5hYmxlTWVudUl0ZW0KLQlQeU1hY19QUkVDSEVDSyhFbmFibGVNZW51SXRlbSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRW5hYmxlTWVudUl0ZW0pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiSCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpdGVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JRW5hYmxlTWVudUl0ZW0oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICBpdGVtKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpdGVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgRW5hYmxlTWVudUl0ZW0oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICBpdGVtKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9DaGVja01lbnVJdGVtKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IGl0ZW07Ci0JQm9vbGVhbiBjaGVja2VkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBpdGVtOworICAgIEJvb2xlYW4gY2hlY2tlZDsKICNpZm5kZWYgQ2hlY2tNZW51SXRlbQotCVB5TWFjX1BSRUNIRUNLKENoZWNrTWVudUl0ZW0pOworICAgIFB5TWFjX1BSRUNIRUNLKENoZWNrTWVudUl0ZW0pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNoZWNrZWQpKQotCQlyZXR1cm4gTlVMTDsKLQlDaGVja01lbnVJdGVtKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICBpdGVtLAotCSAgICAgICAgICAgICAgY2hlY2tlZCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjaGVja2VkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ2hlY2tNZW51SXRlbShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgaXRlbSwKKyAgICAgICAgICAgICAgICAgIGNoZWNrZWQpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIE1lbnVPYmpfbWV0aG9kc1tdID0gewotCXsiRGlzcG9zZU1lbnUiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9EaXNwb3NlTWVudSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiQ2FsY01lbnVTaXplIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfQ2FsY01lbnVTaXplLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJDb3VudE1lbnVJdGVtcyIsIChQeUNGdW5jdGlvbilNZW51T2JqX0NvdW50TWVudUl0ZW1zLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChVSW50MTYgX3J2KSIpfSwKLQl7IkdldE1lbnVGb250IiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfR2V0TWVudUZvbnQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFNJbnQxNiBvdXRGb250SUQsIFVJbnQxNiBvdXRGb250U2l6ZSkiKX0sCi0JeyJTZXRNZW51Rm9udCIsIChQeUNGdW5jdGlvbilNZW51T2JqX1NldE1lbnVGb250LCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgaW5Gb250SUQsIFVJbnQxNiBpbkZvbnRTaXplKSAtPiBOb25lIil9LAotCXsiR2V0TWVudUV4Y2x1ZGVzTWFya0NvbHVtbiIsIChQeUNGdW5jdGlvbilNZW51T2JqX0dldE1lbnVFeGNsdWRlc01hcmtDb2x1bW4sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IlNldE1lbnVFeGNsdWRlc01hcmtDb2x1bW4iLCAoUHlDRnVuY3Rpb24pTWVudU9ial9TZXRNZW51RXhjbHVkZXNNYXJrQ29sdW1uLCAxLAotCSBQeURvY19TVFIoIihCb29sZWFuIGV4Y2x1ZGVzTWFyaykgLT4gTm9uZSIpfSwKLQl7IklzVmFsaWRNZW51IiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfSXNWYWxpZE1lbnUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IkdldE1lbnVSZXRhaW5Db3VudCIsIChQeUNGdW5jdGlvbilNZW51T2JqX0dldE1lbnVSZXRhaW5Db3VudCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoSXRlbUNvdW50IF9ydikiKX0sCi0JeyJSZXRhaW5NZW51IiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfUmV0YWluTWVudSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiUmVsZWFzZU1lbnUiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9SZWxlYXNlTWVudSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiRHVwbGljYXRlTWVudSIsIChQeUNGdW5jdGlvbilNZW51T2JqX0R1cGxpY2F0ZU1lbnUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKE1lbnVIYW5kbGUgb3V0TWVudSkiKX0sCi0JeyJDb3B5TWVudVRpdGxlQXNDRlN0cmluZyIsIChQeUNGdW5jdGlvbilNZW51T2JqX0NvcHlNZW51VGl0bGVBc0NGU3RyaW5nLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDRlN0cmluZ1JlZiBvdXRTdHJpbmcpIil9LAotCXsiU2V0TWVudVRpdGxlV2l0aENGU3RyaW5nIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfU2V0TWVudVRpdGxlV2l0aENGU3RyaW5nLCAxLAotCSBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBpblN0cmluZykgLT4gTm9uZSIpfSwKLQl7IkludmFsaWRhdGVNZW51U2l6ZSIsIChQeUNGdW5jdGlvbilNZW51T2JqX0ludmFsaWRhdGVNZW51U2l6ZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiSXNNZW51U2l6ZUludmFsaWQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9Jc01lbnVTaXplSW52YWxpZCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiTWFjQXBwZW5kTWVudSIsIChQeUNGdW5jdGlvbilNZW51T2JqX01hY0FwcGVuZE1lbnUsIDEsCi0JIFB5RG9jX1NUUigiKFN0cjI1NSBkYXRhKSAtPiBOb25lIil9LAotCXsiSW5zZXJ0UmVzTWVudSIsIChQeUNGdW5jdGlvbilNZW51T2JqX0luc2VydFJlc01lbnUsIDEsCi0JIFB5RG9jX1NUUigiKFJlc1R5cGUgdGhlVHlwZSwgc2hvcnQgYWZ0ZXJJdGVtKSAtPiBOb25lIil9LAotCXsiQXBwZW5kUmVzTWVudSIsIChQeUNGdW5jdGlvbilNZW51T2JqX0FwcGVuZFJlc01lbnUsIDEsCi0JIFB5RG9jX1NUUigiKFJlc1R5cGUgdGhlVHlwZSkgLT4gTm9uZSIpfSwKLQl7Ik1hY0luc2VydE1lbnVJdGVtIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfTWFjSW5zZXJ0TWVudUl0ZW0sIDEsCi0JIFB5RG9jX1NUUigiKFN0cjI1NSBpdGVtU3RyaW5nLCBzaG9ydCBhZnRlckl0ZW0pIC0+IE5vbmUiKX0sCi0JeyJEZWxldGVNZW51SXRlbSIsIChQeUNGdW5jdGlvbilNZW51T2JqX0RlbGV0ZU1lbnVJdGVtLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBpdGVtKSAtPiBOb25lIil9LAotCXsiSW5zZXJ0Rm9udFJlc01lbnUiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9JbnNlcnRGb250UmVzTWVudSwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgYWZ0ZXJJdGVtLCBzaG9ydCBzY3JpcHRGaWx0ZXIpIC0+IE5vbmUiKX0sCi0JeyJJbnNlcnRJbnRsUmVzTWVudSIsIChQeUNGdW5jdGlvbilNZW51T2JqX0luc2VydEludGxSZXNNZW51LCAxLAotCSBQeURvY19TVFIoIihSZXNUeXBlIHRoZVR5cGUsIHNob3J0IGFmdGVySXRlbSwgc2hvcnQgc2NyaXB0RmlsdGVyKSAtPiBOb25lIil9LAotCXsiQXBwZW5kTWVudUl0ZW1UZXh0IiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfQXBwZW5kTWVudUl0ZW1UZXh0LCAxLAotCSBQeURvY19TVFIoIihTdHIyNTUgaW5TdHJpbmcpIC0+IE5vbmUiKX0sCi0JeyJJbnNlcnRNZW51SXRlbVRleHQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9JbnNlcnRNZW51SXRlbVRleHQsIDEsCi0JIFB5RG9jX1NUUigiKFN0cjI1NSBpblN0cmluZywgTWVudUl0ZW1JbmRleCBhZnRlckl0ZW0pIC0+IE5vbmUiKX0sCi0JeyJDb3B5TWVudUl0ZW1zIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfQ29weU1lbnVJdGVtcywgMSwKLQkgUHlEb2NfU1RSKCIoTWVudUl0ZW1JbmRleCBpbkZpcnN0SXRlbSwgSXRlbUNvdW50IGluTnVtSXRlbXMsIE1lbnVIYW5kbGUgaW5EZXN0TWVudSwgTWVudUl0ZW1JbmRleCBpbkluc2VydEFmdGVyKSAtPiBOb25lIil9LAotCXsiRGVsZXRlTWVudUl0ZW1zIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfRGVsZXRlTWVudUl0ZW1zLCAxLAotCSBQeURvY19TVFIoIihNZW51SXRlbUluZGV4IGluRmlyc3RJdGVtLCBJdGVtQ291bnQgaW5OdW1JdGVtcykgLT4gTm9uZSIpfSwKLQl7IkFwcGVuZE1lbnVJdGVtVGV4dFdpdGhDRlN0cmluZyIsIChQeUNGdW5jdGlvbilNZW51T2JqX0FwcGVuZE1lbnVJdGVtVGV4dFdpdGhDRlN0cmluZywgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgaW5TdHJpbmcsIE1lbnVJdGVtQXR0cmlidXRlcyBpbkF0dHJpYnV0ZXMsIE1lbnVDb21tYW5kIGluQ29tbWFuZElEKSAtPiAoTWVudUl0ZW1JbmRleCBvdXROZXdJdGVtKSIpfSwKLQl7Ikluc2VydE1lbnVJdGVtVGV4dFdpdGhDRlN0cmluZyIsIChQeUNGdW5jdGlvbilNZW51T2JqX0luc2VydE1lbnVJdGVtVGV4dFdpdGhDRlN0cmluZywgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgaW5TdHJpbmcsIE1lbnVJdGVtSW5kZXggaW5BZnRlckl0ZW0sIE1lbnVJdGVtQXR0cmlidXRlcyBpbkF0dHJpYnV0ZXMsIE1lbnVDb21tYW5kIGluQ29tbWFuZElEKSAtPiBOb25lIil9LAotCXsiUG9wVXBNZW51U2VsZWN0IiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfUG9wVXBNZW51U2VsZWN0LCAxLAotCSBQeURvY19TVFIoIihzaG9ydCB0b3AsIHNob3J0IGxlZnQsIHNob3J0IHBvcFVwSXRlbSkgLT4gKGxvbmcgX3J2KSIpfSwKLQl7IkludmFsaWRhdGVNZW51RW5hYmxpbmciLCAoUHlDRnVuY3Rpb24pTWVudU9ial9JbnZhbGlkYXRlTWVudUVuYWJsaW5nLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJJc01lbnVCYXJJbnZhbGlkIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfSXNNZW51QmFySW52YWxpZCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiTWFjSW5zZXJ0TWVudSIsIChQeUNGdW5jdGlvbilNZW51T2JqX01hY0luc2VydE1lbnUsIDEsCi0JIFB5RG9jX1NUUigiKE1lbnVJRCBiZWZvcmVJRCkgLT4gTm9uZSIpfSwKLQl7IlNldFJvb3RNZW51IiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfU2V0Um9vdE1lbnUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7Ik1hY0NoZWNrTWVudUl0ZW0iLCAoUHlDRnVuY3Rpb24pTWVudU9ial9NYWNDaGVja01lbnVJdGVtLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBpdGVtLCBCb29sZWFuIGNoZWNrZWQpIC0+IE5vbmUiKX0sCi0JeyJTZXRNZW51SXRlbVRleHQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9TZXRNZW51SXRlbVRleHQsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGl0ZW0sIFN0cjI1NSBpdGVtU3RyaW5nKSAtPiBOb25lIil9LAotCXsiR2V0TWVudUl0ZW1UZXh0IiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfR2V0TWVudUl0ZW1UZXh0LCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBpdGVtKSAtPiAoU3RyMjU1IGl0ZW1TdHJpbmcpIil9LAotCXsiU2V0SXRlbU1hcmsiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9TZXRJdGVtTWFyaywgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgaXRlbSwgQ2hhclBhcmFtZXRlciBtYXJrQ2hhcikgLT4gTm9uZSIpfSwKLQl7IkdldEl0ZW1NYXJrIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfR2V0SXRlbU1hcmssIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGl0ZW0pIC0+IChDaGFyUGFyYW1ldGVyIG1hcmtDaGFyKSIpfSwKLQl7IlNldEl0ZW1DbWQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9TZXRJdGVtQ21kLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBpdGVtLCBDaGFyUGFyYW1ldGVyIGNtZENoYXIpIC0+IE5vbmUiKX0sCi0JeyJHZXRJdGVtQ21kIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfR2V0SXRlbUNtZCwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgaXRlbSkgLT4gKENoYXJQYXJhbWV0ZXIgY21kQ2hhcikiKX0sCi0JeyJTZXRJdGVtSWNvbiIsIChQeUNGdW5jdGlvbilNZW51T2JqX1NldEl0ZW1JY29uLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBpdGVtLCBzaG9ydCBpY29uSW5kZXgpIC0+IE5vbmUiKX0sCi0JeyJHZXRJdGVtSWNvbiIsIChQeUNGdW5jdGlvbilNZW51T2JqX0dldEl0ZW1JY29uLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBpdGVtKSAtPiAoc2hvcnQgaWNvbkluZGV4KSIpfSwKLQl7IlNldEl0ZW1TdHlsZSIsIChQeUNGdW5jdGlvbilNZW51T2JqX1NldEl0ZW1TdHlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgaXRlbSwgU3R5bGVQYXJhbWV0ZXIgY2hTdHlsZSkgLT4gTm9uZSIpfSwKLQl7IkdldEl0ZW1TdHlsZSIsIChQeUNGdW5jdGlvbilNZW51T2JqX0dldEl0ZW1TdHlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgaXRlbSkgLT4gKFN0eWxlIGNoU3R5bGUpIil9LAotCXsiU2V0TWVudUl0ZW1Db21tYW5kSUQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9TZXRNZW51SXRlbUNvbW1hbmRJRCwgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IGluSXRlbSwgTWVudUNvbW1hbmQgaW5Db21tYW5kSUQpIC0+IE5vbmUiKX0sCi0JeyJHZXRNZW51SXRlbUNvbW1hbmRJRCIsIChQeUNGdW5jdGlvbilNZW51T2JqX0dldE1lbnVJdGVtQ29tbWFuZElELCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgaW5JdGVtKSAtPiAoTWVudUNvbW1hbmQgb3V0Q29tbWFuZElEKSIpfSwKLQl7IlNldE1lbnVJdGVtTW9kaWZpZXJzIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfU2V0TWVudUl0ZW1Nb2RpZmllcnMsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiBpbkl0ZW0sIFVJbnQ4IGluTW9kaWZpZXJzKSAtPiBOb25lIil9LAotCXsiR2V0TWVudUl0ZW1Nb2RpZmllcnMiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9HZXRNZW51SXRlbU1vZGlmaWVycywgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IGluSXRlbSkgLT4gKFVJbnQ4IG91dE1vZGlmaWVycykiKX0sCi0JeyJTZXRNZW51SXRlbUljb25IYW5kbGUiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9TZXRNZW51SXRlbUljb25IYW5kbGUsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiBpbkl0ZW0sIFVJbnQ4IGluSWNvblR5cGUsIEhhbmRsZSBpbkljb25IYW5kbGUpIC0+IE5vbmUiKX0sCi0JeyJHZXRNZW51SXRlbUljb25IYW5kbGUiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9HZXRNZW51SXRlbUljb25IYW5kbGUsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiBpbkl0ZW0pIC0+IChVSW50OCBvdXRJY29uVHlwZSwgSGFuZGxlIG91dEljb25IYW5kbGUpIil9LAotCXsiU2V0TWVudUl0ZW1UZXh0RW5jb2RpbmciLCAoUHlDRnVuY3Rpb24pTWVudU9ial9TZXRNZW51SXRlbVRleHRFbmNvZGluZywgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IGluSXRlbSwgVGV4dEVuY29kaW5nIGluU2NyaXB0SUQpIC0+IE5vbmUiKX0sCi0JeyJHZXRNZW51SXRlbVRleHRFbmNvZGluZyIsIChQeUNGdW5jdGlvbilNZW51T2JqX0dldE1lbnVJdGVtVGV4dEVuY29kaW5nLCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgaW5JdGVtKSAtPiAoVGV4dEVuY29kaW5nIG91dFNjcmlwdElEKSIpfSwKLQl7IlNldE1lbnVJdGVtSGllcmFyY2hpY2FsSUQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9TZXRNZW51SXRlbUhpZXJhcmNoaWNhbElELCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgaW5JdGVtLCBNZW51SUQgaW5IaWVySUQpIC0+IE5vbmUiKX0sCi0JeyJHZXRNZW51SXRlbUhpZXJhcmNoaWNhbElEIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfR2V0TWVudUl0ZW1IaWVyYXJjaGljYWxJRCwgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IGluSXRlbSkgLT4gKE1lbnVJRCBvdXRIaWVySUQpIil9LAotCXsiU2V0TWVudUl0ZW1Gb250SUQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9TZXRNZW51SXRlbUZvbnRJRCwgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IGluSXRlbSwgU0ludDE2IGluRm9udElEKSAtPiBOb25lIil9LAotCXsiR2V0TWVudUl0ZW1Gb250SUQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9HZXRNZW51SXRlbUZvbnRJRCwgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IGluSXRlbSkgLT4gKFNJbnQxNiBvdXRGb250SUQpIil9LAotCXsiU2V0TWVudUl0ZW1SZWZDb24iLCAoUHlDRnVuY3Rpb24pTWVudU9ial9TZXRNZW51SXRlbVJlZkNvbiwgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IGluSXRlbSwgVUludDMyIGluUmVmQ29uKSAtPiBOb25lIil9LAotCXsiR2V0TWVudUl0ZW1SZWZDb24iLCAoUHlDRnVuY3Rpb24pTWVudU9ial9HZXRNZW51SXRlbVJlZkNvbiwgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IGluSXRlbSkgLT4gKFVJbnQzMiBvdXRSZWZDb24pIil9LAotCXsiU2V0TWVudUl0ZW1LZXlHbHlwaCIsIChQeUNGdW5jdGlvbilNZW51T2JqX1NldE1lbnVJdGVtS2V5R2x5cGgsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiBpbkl0ZW0sIFNJbnQxNiBpbkdseXBoKSAtPiBOb25lIil9LAotCXsiR2V0TWVudUl0ZW1LZXlHbHlwaCIsIChQeUNGdW5jdGlvbilNZW51T2JqX0dldE1lbnVJdGVtS2V5R2x5cGgsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiBpbkl0ZW0pIC0+IChTSW50MTYgb3V0R2x5cGgpIil9LAotCXsiTWFjRW5hYmxlTWVudUl0ZW0iLCAoUHlDRnVuY3Rpb24pTWVudU9ial9NYWNFbmFibGVNZW51SXRlbSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVudUl0ZW1JbmRleCBpdGVtKSAtPiBOb25lIil9LAotCXsiRGlzYWJsZU1lbnVJdGVtIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfRGlzYWJsZU1lbnVJdGVtLCAxLAotCSBQeURvY19TVFIoIihNZW51SXRlbUluZGV4IGl0ZW0pIC0+IE5vbmUiKX0sCi0JeyJJc01lbnVJdGVtRW5hYmxlZCIsIChQeUNGdW5jdGlvbilNZW51T2JqX0lzTWVudUl0ZW1FbmFibGVkLCAxLAotCSBQeURvY19TVFIoIihNZW51SXRlbUluZGV4IGl0ZW0pIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJFbmFibGVNZW51SXRlbUljb24iLCAoUHlDRnVuY3Rpb24pTWVudU9ial9FbmFibGVNZW51SXRlbUljb24sIDEsCi0JIFB5RG9jX1NUUigiKE1lbnVJdGVtSW5kZXggaXRlbSkgLT4gTm9uZSIpfSwKLQl7IkRpc2FibGVNZW51SXRlbUljb24iLCAoUHlDRnVuY3Rpb24pTWVudU9ial9EaXNhYmxlTWVudUl0ZW1JY29uLCAxLAotCSBQeURvY19TVFIoIihNZW51SXRlbUluZGV4IGl0ZW0pIC0+IE5vbmUiKX0sCi0JeyJJc01lbnVJdGVtSWNvbkVuYWJsZWQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9Jc01lbnVJdGVtSWNvbkVuYWJsZWQsIDEsCi0JIFB5RG9jX1NUUigiKE1lbnVJdGVtSW5kZXggaXRlbSkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IlNldE1lbnVJdGVtSGllcmFyY2hpY2FsTWVudSIsIChQeUNGdW5jdGlvbilNZW51T2JqX1NldE1lbnVJdGVtSGllcmFyY2hpY2FsTWVudSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVudUl0ZW1JbmRleCBpbkl0ZW0sIE1lbnVIYW5kbGUgaW5IaWVyTWVudSkgLT4gTm9uZSIpfSwKLQl7IkdldE1lbnVJdGVtSGllcmFyY2hpY2FsTWVudSIsIChQeUNGdW5jdGlvbilNZW51T2JqX0dldE1lbnVJdGVtSGllcmFyY2hpY2FsTWVudSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVudUl0ZW1JbmRleCBpbkl0ZW0pIC0+IChNZW51SGFuZGxlIG91dEhpZXJNZW51KSIpfSwKLQl7IkNvcHlNZW51SXRlbVRleHRBc0NGU3RyaW5nIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfQ29weU1lbnVJdGVtVGV4dEFzQ0ZTdHJpbmcsIDEsCi0JIFB5RG9jX1NUUigiKE1lbnVJdGVtSW5kZXggaW5JdGVtKSAtPiAoQ0ZTdHJpbmdSZWYgb3V0U3RyaW5nKSIpfSwKLQl7IlNldE1lbnVJdGVtVGV4dFdpdGhDRlN0cmluZyIsIChQeUNGdW5jdGlvbilNZW51T2JqX1NldE1lbnVJdGVtVGV4dFdpdGhDRlN0cmluZywgMSwKLQkgUHlEb2NfU1RSKCIoTWVudUl0ZW1JbmRleCBpbkl0ZW0sIENGU3RyaW5nUmVmIGluU3RyaW5nKSAtPiBOb25lIil9LAotCXsiR2V0TWVudUl0ZW1JbmRlbnQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9HZXRNZW51SXRlbUluZGVudCwgMSwKLQkgUHlEb2NfU1RSKCIoTWVudUl0ZW1JbmRleCBpbkl0ZW0pIC0+IChVSW50MzIgb3V0SW5kZW50KSIpfSwKLQl7IlNldE1lbnVJdGVtSW5kZW50IiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfU2V0TWVudUl0ZW1JbmRlbnQsIDEsCi0JIFB5RG9jX1NUUigiKE1lbnVJdGVtSW5kZXggaW5JdGVtLCBVSW50MzIgaW5JbmRlbnQpIC0+IE5vbmUiKX0sCi0JeyJHZXRNZW51SXRlbUNvbW1hbmRLZXkiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9HZXRNZW51SXRlbUNvbW1hbmRLZXksIDEsCi0JIFB5RG9jX1NUUigiKE1lbnVJdGVtSW5kZXggaW5JdGVtLCBCb29sZWFuIGluR2V0VmlydHVhbEtleSkgLT4gKFVJbnQxNiBvdXRLZXkpIil9LAotCXsiU2V0TWVudUl0ZW1Db21tYW5kS2V5IiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfU2V0TWVudUl0ZW1Db21tYW5kS2V5LCAxLAotCSBQeURvY19TVFIoIihNZW51SXRlbUluZGV4IGluSXRlbSwgQm9vbGVhbiBpblNldFZpcnR1YWxLZXksIFVJbnQxNiBpbktleSkgLT4gTm9uZSIpfSwKLQl7IkdldE1lbnVJdGVtUHJvcGVydHlBdHRyaWJ1dGVzIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfR2V0TWVudUl0ZW1Qcm9wZXJ0eUF0dHJpYnV0ZXMsIDEsCi0JIFB5RG9jX1NUUigiKE1lbnVJdGVtSW5kZXggaXRlbSwgT1NUeXBlIHByb3BlcnR5Q3JlYXRvciwgT1NUeXBlIHByb3BlcnR5VGFnKSAtPiAoVUludDMyIGF0dHJpYnV0ZXMpIil9LAotCXsiQ2hhbmdlTWVudUl0ZW1Qcm9wZXJ0eUF0dHJpYnV0ZXMiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9DaGFuZ2VNZW51SXRlbVByb3BlcnR5QXR0cmlidXRlcywgMSwKLQkgUHlEb2NfU1RSKCIoTWVudUl0ZW1JbmRleCBpdGVtLCBPU1R5cGUgcHJvcGVydHlDcmVhdG9yLCBPU1R5cGUgcHJvcGVydHlUYWcsIFVJbnQzMiBhdHRyaWJ1dGVzVG9TZXQsIFVJbnQzMiBhdHRyaWJ1dGVzVG9DbGVhcikgLT4gTm9uZSIpfSwKLQl7IkdldE1lbnVBdHRyaWJ1dGVzIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfR2V0TWVudUF0dHJpYnV0ZXMsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKE1lbnVBdHRyaWJ1dGVzIG91dEF0dHJpYnV0ZXMpIil9LAotCXsiQ2hhbmdlTWVudUF0dHJpYnV0ZXMiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9DaGFuZ2VNZW51QXR0cmlidXRlcywgMSwKLQkgUHlEb2NfU1RSKCIoTWVudUF0dHJpYnV0ZXMgc2V0VGhlc2VBdHRyaWJ1dGVzLCBNZW51QXR0cmlidXRlcyBjbGVhclRoZXNlQXR0cmlidXRlcykgLT4gTm9uZSIpfSwKLQl7IkdldE1lbnVJdGVtQXR0cmlidXRlcyIsIChQeUNGdW5jdGlvbilNZW51T2JqX0dldE1lbnVJdGVtQXR0cmlidXRlcywgMSwKLQkgUHlEb2NfU1RSKCIoTWVudUl0ZW1JbmRleCBpdGVtKSAtPiAoTWVudUl0ZW1BdHRyaWJ1dGVzIG91dEF0dHJpYnV0ZXMpIil9LAotCXsiQ2hhbmdlTWVudUl0ZW1BdHRyaWJ1dGVzIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfQ2hhbmdlTWVudUl0ZW1BdHRyaWJ1dGVzLCAxLAotCSBQeURvY19TVFIoIihNZW51SXRlbUluZGV4IGl0ZW0sIE1lbnVJdGVtQXR0cmlidXRlcyBzZXRUaGVzZUF0dHJpYnV0ZXMsIE1lbnVJdGVtQXR0cmlidXRlcyBjbGVhclRoZXNlQXR0cmlidXRlcykgLT4gTm9uZSIpfSwKLQl7IkRpc2FibGVBbGxNZW51SXRlbXMiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9EaXNhYmxlQWxsTWVudUl0ZW1zLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJFbmFibGVBbGxNZW51SXRlbXMiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9FbmFibGVBbGxNZW51SXRlbXMsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7Ik1lbnVIYXNFbmFibGVkSXRlbXMiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9NZW51SGFzRW5hYmxlZEl0ZW1zLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJHZXRNZW51VHlwZSIsIChQeUNGdW5jdGlvbilNZW51T2JqX0dldE1lbnVUeXBlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChVSW50MTYgb3V0VHlwZSkiKX0sCi0JeyJDb3VudE1lbnVJdGVtc1dpdGhDb21tYW5kSUQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9Db3VudE1lbnVJdGVtc1dpdGhDb21tYW5kSUQsIDEsCi0JIFB5RG9jX1NUUigiKE1lbnVDb21tYW5kIGluQ29tbWFuZElEKSAtPiAoSXRlbUNvdW50IF9ydikiKX0sCi0JeyJHZXRJbmRNZW51SXRlbVdpdGhDb21tYW5kSUQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9HZXRJbmRNZW51SXRlbVdpdGhDb21tYW5kSUQsIDEsCi0JIFB5RG9jX1NUUigiKE1lbnVDb21tYW5kIGluQ29tbWFuZElELCBVSW50MzIgaW5JdGVtSW5kZXgpIC0+IChNZW51SGFuZGxlIG91dE1lbnUsIE1lbnVJdGVtSW5kZXggb3V0SW5kZXgpIil9LAotCXsiRW5hYmxlTWVudUNvbW1hbmQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9FbmFibGVNZW51Q29tbWFuZCwgMSwKLQkgUHlEb2NfU1RSKCIoTWVudUNvbW1hbmQgaW5Db21tYW5kSUQpIC0+IE5vbmUiKX0sCi0JeyJEaXNhYmxlTWVudUNvbW1hbmQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9EaXNhYmxlTWVudUNvbW1hbmQsIDEsCi0JIFB5RG9jX1NUUigiKE1lbnVDb21tYW5kIGluQ29tbWFuZElEKSAtPiBOb25lIil9LAotCXsiSXNNZW51Q29tbWFuZEVuYWJsZWQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9Jc01lbnVDb21tYW5kRW5hYmxlZCwgMSwKLQkgUHlEb2NfU1RSKCIoTWVudUNvbW1hbmQgaW5Db21tYW5kSUQpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJTZXRNZW51Q29tbWFuZE1hcmsiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9TZXRNZW51Q29tbWFuZE1hcmssIDEsCi0JIFB5RG9jX1NUUigiKE1lbnVDb21tYW5kIGluQ29tbWFuZElELCBVbmlDaGFyIGluTWFyaykgLT4gTm9uZSIpfSwKLQl7IkdldE1lbnVDb21tYW5kTWFyayIsIChQeUNGdW5jdGlvbilNZW51T2JqX0dldE1lbnVDb21tYW5kTWFyaywgMSwKLQkgUHlEb2NfU1RSKCIoTWVudUNvbW1hbmQgaW5Db21tYW5kSUQpIC0+IChVbmlDaGFyIG91dE1hcmspIil9LAotCXsiR2V0TWVudUNvbW1hbmRQcm9wZXJ0eVNpemUiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9HZXRNZW51Q29tbWFuZFByb3BlcnR5U2l6ZSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVudUNvbW1hbmQgaW5Db21tYW5kSUQsIE9TVHlwZSBpblByb3BlcnR5Q3JlYXRvciwgT1NUeXBlIGluUHJvcGVydHlUYWcpIC0+IChCeXRlQ291bnQgb3V0U2l6ZSkiKX0sCi0JeyJSZW1vdmVNZW51Q29tbWFuZFByb3BlcnR5IiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfUmVtb3ZlTWVudUNvbW1hbmRQcm9wZXJ0eSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVudUNvbW1hbmQgaW5Db21tYW5kSUQsIE9TVHlwZSBpblByb3BlcnR5Q3JlYXRvciwgT1NUeXBlIGluUHJvcGVydHlUYWcpIC0+IE5vbmUiKX0sCi0JeyJJc01lbnVJdGVtSW52YWxpZCIsIChQeUNGdW5jdGlvbilNZW51T2JqX0lzTWVudUl0ZW1JbnZhbGlkLCAxLAotCSBQeURvY19TVFIoIihNZW51SXRlbUluZGV4IGluSXRlbSkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IkludmFsaWRhdGVNZW51SXRlbXMiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9JbnZhbGlkYXRlTWVudUl0ZW1zLCAxLAotCSBQeURvY19TVFIoIihNZW51SXRlbUluZGV4IGluRmlyc3RJdGVtLCBJdGVtQ291bnQgaW5OdW1JdGVtcykgLT4gTm9uZSIpfSwKLQl7IlVwZGF0ZUludmFsaWRNZW51SXRlbXMiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9VcGRhdGVJbnZhbGlkTWVudUl0ZW1zLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJDcmVhdGVTdGFuZGFyZEZvbnRNZW51IiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfQ3JlYXRlU3RhbmRhcmRGb250TWVudSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVudUl0ZW1JbmRleCBhZnRlckl0ZW0sIE1lbnVJRCBmaXJzdEhpZXJNZW51SUQsIE9wdGlvbkJpdHMgb3B0aW9ucykgLT4gKEl0ZW1Db3VudCBvdXRIaWVyTWVudUNvdW50KSIpfSwKLQl7IlVwZGF0ZVN0YW5kYXJkRm9udE1lbnUiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9VcGRhdGVTdGFuZGFyZEZvbnRNZW51LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChJdGVtQ291bnQgb3V0SGllck1lbnVDb3VudCkiKX0sCi0JeyJHZXRGb250RmFtaWx5RnJvbU1lbnVTZWxlY3Rpb24iLCAoUHlDRnVuY3Rpb24pTWVudU9ial9HZXRGb250RmFtaWx5RnJvbU1lbnVTZWxlY3Rpb24sIDEsCi0JIFB5RG9jX1NUUigiKE1lbnVJdGVtSW5kZXggaXRlbSkgLT4gKEZNRm9udEZhbWlseSBvdXRGb250RmFtaWx5LCBGTUZvbnRTdHlsZSBvdXRTdHlsZSkiKX0sCi0JeyJHZXRNZW51SUQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9HZXRNZW51SUQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKE1lbnVJRCBfcnYpIil9LAotCXsiR2V0TWVudVdpZHRoIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfR2V0TWVudVdpZHRoLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChTSW50MTYgX3J2KSIpfSwKLQl7IkdldE1lbnVIZWlnaHQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9HZXRNZW51SGVpZ2h0LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChTSW50MTYgX3J2KSIpfSwKLQl7IlNldE1lbnVJRCIsIChQeUNGdW5jdGlvbilNZW51T2JqX1NldE1lbnVJRCwgMSwKLQkgUHlEb2NfU1RSKCIoTWVudUlEIG1lbnVJRCkgLT4gTm9uZSIpfSwKLQl7IlNldE1lbnVXaWR0aCIsIChQeUNGdW5jdGlvbilNZW51T2JqX1NldE1lbnVXaWR0aCwgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IHdpZHRoKSAtPiBOb25lIil9LAotCXsiU2V0TWVudUhlaWdodCIsIChQeUNGdW5jdGlvbilNZW51T2JqX1NldE1lbnVIZWlnaHQsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiBoZWlnaHQpIC0+IE5vbmUiKX0sCi0JeyJhc19SZXNvdXJjZSIsIChQeUNGdW5jdGlvbilNZW51T2JqX2FzX1Jlc291cmNlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChIYW5kbGUgX3J2KSIpfSwKLQl7IkFwcGVuZE1lbnUiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9BcHBlbmRNZW51LCAxLAotCSBQeURvY19TVFIoIihTdHIyNTUgZGF0YSkgLT4gTm9uZSIpfSwKLQl7Ikluc2VydE1lbnUiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9JbnNlcnRNZW51LCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBiZWZvcmVJRCkgLT4gTm9uZSIpfSwKLQl7Ikluc2VydE1lbnVJdGVtIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfSW5zZXJ0TWVudUl0ZW0sIDEsCi0JIFB5RG9jX1NUUigiKFN0cjI1NSBpdGVtU3RyaW5nLCBzaG9ydCBhZnRlckl0ZW0pIC0+IE5vbmUiKX0sCi0JeyJFbmFibGVNZW51SXRlbSIsIChQeUNGdW5jdGlvbilNZW51T2JqX0VuYWJsZU1lbnVJdGVtLCAxLAotCSBQeURvY19TVFIoIihVSW50MTYgaXRlbSkgLT4gTm9uZSIpfSwKLQl7IkNoZWNrTWVudUl0ZW0iLCAoUHlDRnVuY3Rpb24pTWVudU9ial9DaGVja01lbnVJdGVtLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBpdGVtLCBCb29sZWFuIGNoZWNrZWQpIC0+IE5vbmUiKX0sCi0Je05VTEwsIE5VTEwsIDB9CisgICAgeyJEaXNwb3NlTWVudSIsIChQeUNGdW5jdGlvbilNZW51T2JqX0Rpc3Bvc2VNZW51LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJDYWxjTWVudVNpemUiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9DYWxjTWVudVNpemUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkNvdW50TWVudUl0ZW1zIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfQ291bnRNZW51SXRlbXMsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQxNiBfcnYpIil9LAorICAgIHsiR2V0TWVudUZvbnQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9HZXRNZW51Rm9udCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoU0ludDE2IG91dEZvbnRJRCwgVUludDE2IG91dEZvbnRTaXplKSIpfSwKKyAgICB7IlNldE1lbnVGb250IiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfU2V0TWVudUZvbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiBpbkZvbnRJRCwgVUludDE2IGluRm9udFNpemUpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRNZW51RXhjbHVkZXNNYXJrQ29sdW1uIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfR2V0TWVudUV4Y2x1ZGVzTWFya0NvbHVtbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiU2V0TWVudUV4Y2x1ZGVzTWFya0NvbHVtbiIsIChQeUNGdW5jdGlvbilNZW51T2JqX1NldE1lbnVFeGNsdWRlc01hcmtDb2x1bW4sIDEsCisgICAgIFB5RG9jX1NUUigiKEJvb2xlYW4gZXhjbHVkZXNNYXJrKSAtPiBOb25lIil9LAorICAgIHsiSXNWYWxpZE1lbnUiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9Jc1ZhbGlkTWVudSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiR2V0TWVudVJldGFpbkNvdW50IiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfR2V0TWVudVJldGFpbkNvdW50LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChJdGVtQ291bnQgX3J2KSIpfSwKKyAgICB7IlJldGFpbk1lbnUiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9SZXRhaW5NZW51LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJSZWxlYXNlTWVudSIsIChQeUNGdW5jdGlvbilNZW51T2JqX1JlbGVhc2VNZW51LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJEdXBsaWNhdGVNZW51IiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfRHVwbGljYXRlTWVudSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoTWVudUhhbmRsZSBvdXRNZW51KSIpfSwKKyAgICB7IkNvcHlNZW51VGl0bGVBc0NGU3RyaW5nIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfQ29weU1lbnVUaXRsZUFzQ0ZTdHJpbmcsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENGU3RyaW5nUmVmIG91dFN0cmluZykiKX0sCisgICAgeyJTZXRNZW51VGl0bGVXaXRoQ0ZTdHJpbmciLCAoUHlDRnVuY3Rpb24pTWVudU9ial9TZXRNZW51VGl0bGVXaXRoQ0ZTdHJpbmcsIDEsCisgICAgIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIGluU3RyaW5nKSAtPiBOb25lIil9LAorICAgIHsiSW52YWxpZGF0ZU1lbnVTaXplIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfSW52YWxpZGF0ZU1lbnVTaXplLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJJc01lbnVTaXplSW52YWxpZCIsIChQeUNGdW5jdGlvbilNZW51T2JqX0lzTWVudVNpemVJbnZhbGlkLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJNYWNBcHBlbmRNZW51IiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfTWFjQXBwZW5kTWVudSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU3RyMjU1IGRhdGEpIC0+IE5vbmUiKX0sCisgICAgeyJJbnNlcnRSZXNNZW51IiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfSW5zZXJ0UmVzTWVudSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVzVHlwZSB0aGVUeXBlLCBzaG9ydCBhZnRlckl0ZW0pIC0+IE5vbmUiKX0sCisgICAgeyJBcHBlbmRSZXNNZW51IiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfQXBwZW5kUmVzTWVudSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVzVHlwZSB0aGVUeXBlKSAtPiBOb25lIil9LAorICAgIHsiTWFjSW5zZXJ0TWVudUl0ZW0iLCAoUHlDRnVuY3Rpb24pTWVudU9ial9NYWNJbnNlcnRNZW51SXRlbSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU3RyMjU1IGl0ZW1TdHJpbmcsIHNob3J0IGFmdGVySXRlbSkgLT4gTm9uZSIpfSwKKyAgICB7IkRlbGV0ZU1lbnVJdGVtIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfRGVsZXRlTWVudUl0ZW0sIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGl0ZW0pIC0+IE5vbmUiKX0sCisgICAgeyJJbnNlcnRGb250UmVzTWVudSIsIChQeUNGdW5jdGlvbilNZW51T2JqX0luc2VydEZvbnRSZXNNZW51LCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBhZnRlckl0ZW0sIHNob3J0IHNjcmlwdEZpbHRlcikgLT4gTm9uZSIpfSwKKyAgICB7Ikluc2VydEludGxSZXNNZW51IiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfSW5zZXJ0SW50bFJlc01lbnUsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlc1R5cGUgdGhlVHlwZSwgc2hvcnQgYWZ0ZXJJdGVtLCBzaG9ydCBzY3JpcHRGaWx0ZXIpIC0+IE5vbmUiKX0sCisgICAgeyJBcHBlbmRNZW51SXRlbVRleHQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9BcHBlbmRNZW51SXRlbVRleHQsIDEsCisgICAgIFB5RG9jX1NUUigiKFN0cjI1NSBpblN0cmluZykgLT4gTm9uZSIpfSwKKyAgICB7Ikluc2VydE1lbnVJdGVtVGV4dCIsIChQeUNGdW5jdGlvbilNZW51T2JqX0luc2VydE1lbnVJdGVtVGV4dCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU3RyMjU1IGluU3RyaW5nLCBNZW51SXRlbUluZGV4IGFmdGVySXRlbSkgLT4gTm9uZSIpfSwKKyAgICB7IkNvcHlNZW51SXRlbXMiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9Db3B5TWVudUl0ZW1zLCAxLAorICAgICBQeURvY19TVFIoIihNZW51SXRlbUluZGV4IGluRmlyc3RJdGVtLCBJdGVtQ291bnQgaW5OdW1JdGVtcywgTWVudUhhbmRsZSBpbkRlc3RNZW51LCBNZW51SXRlbUluZGV4IGluSW5zZXJ0QWZ0ZXIpIC0+IE5vbmUiKX0sCisgICAgeyJEZWxldGVNZW51SXRlbXMiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9EZWxldGVNZW51SXRlbXMsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lbnVJdGVtSW5kZXggaW5GaXJzdEl0ZW0sIEl0ZW1Db3VudCBpbk51bUl0ZW1zKSAtPiBOb25lIil9LAorICAgIHsiQXBwZW5kTWVudUl0ZW1UZXh0V2l0aENGU3RyaW5nIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfQXBwZW5kTWVudUl0ZW1UZXh0V2l0aENGU3RyaW5nLCAxLAorICAgICBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBpblN0cmluZywgTWVudUl0ZW1BdHRyaWJ1dGVzIGluQXR0cmlidXRlcywgTWVudUNvbW1hbmQgaW5Db21tYW5kSUQpIC0+IChNZW51SXRlbUluZGV4IG91dE5ld0l0ZW0pIil9LAorICAgIHsiSW5zZXJ0TWVudUl0ZW1UZXh0V2l0aENGU3RyaW5nIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfSW5zZXJ0TWVudUl0ZW1UZXh0V2l0aENGU3RyaW5nLCAxLAorICAgICBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBpblN0cmluZywgTWVudUl0ZW1JbmRleCBpbkFmdGVySXRlbSwgTWVudUl0ZW1BdHRyaWJ1dGVzIGluQXR0cmlidXRlcywgTWVudUNvbW1hbmQgaW5Db21tYW5kSUQpIC0+IE5vbmUiKX0sCisgICAgeyJQb3BVcE1lbnVTZWxlY3QiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9Qb3BVcE1lbnVTZWxlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IHRvcCwgc2hvcnQgbGVmdCwgc2hvcnQgcG9wVXBJdGVtKSAtPiAobG9uZyBfcnYpIil9LAorICAgIHsiSW52YWxpZGF0ZU1lbnVFbmFibGluZyIsIChQeUNGdW5jdGlvbilNZW51T2JqX0ludmFsaWRhdGVNZW51RW5hYmxpbmcsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IklzTWVudUJhckludmFsaWQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9Jc01lbnVCYXJJbnZhbGlkLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJNYWNJbnNlcnRNZW51IiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfTWFjSW5zZXJ0TWVudSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUlEIGJlZm9yZUlEKSAtPiBOb25lIil9LAorICAgIHsiU2V0Um9vdE1lbnUiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9TZXRSb290TWVudSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiTWFjQ2hlY2tNZW51SXRlbSIsIChQeUNGdW5jdGlvbilNZW51T2JqX01hY0NoZWNrTWVudUl0ZW0sIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGl0ZW0sIEJvb2xlYW4gY2hlY2tlZCkgLT4gTm9uZSIpfSwKKyAgICB7IlNldE1lbnVJdGVtVGV4dCIsIChQeUNGdW5jdGlvbilNZW51T2JqX1NldE1lbnVJdGVtVGV4dCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgaXRlbSwgU3RyMjU1IGl0ZW1TdHJpbmcpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRNZW51SXRlbVRleHQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9HZXRNZW51SXRlbVRleHQsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGl0ZW0pIC0+IChTdHIyNTUgaXRlbVN0cmluZykiKX0sCisgICAgeyJTZXRJdGVtTWFyayIsIChQeUNGdW5jdGlvbilNZW51T2JqX1NldEl0ZW1NYXJrLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBpdGVtLCBDaGFyUGFyYW1ldGVyIG1hcmtDaGFyKSAtPiBOb25lIil9LAorICAgIHsiR2V0SXRlbU1hcmsiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9HZXRJdGVtTWFyaywgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgaXRlbSkgLT4gKENoYXJQYXJhbWV0ZXIgbWFya0NoYXIpIil9LAorICAgIHsiU2V0SXRlbUNtZCIsIChQeUNGdW5jdGlvbilNZW51T2JqX1NldEl0ZW1DbWQsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGl0ZW0sIENoYXJQYXJhbWV0ZXIgY21kQ2hhcikgLT4gTm9uZSIpfSwKKyAgICB7IkdldEl0ZW1DbWQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9HZXRJdGVtQ21kLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBpdGVtKSAtPiAoQ2hhclBhcmFtZXRlciBjbWRDaGFyKSIpfSwKKyAgICB7IlNldEl0ZW1JY29uIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfU2V0SXRlbUljb24sIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGl0ZW0sIHNob3J0IGljb25JbmRleCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldEl0ZW1JY29uIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfR2V0SXRlbUljb24sIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGl0ZW0pIC0+IChzaG9ydCBpY29uSW5kZXgpIil9LAorICAgIHsiU2V0SXRlbVN0eWxlIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfU2V0SXRlbVN0eWxlLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBpdGVtLCBTdHlsZVBhcmFtZXRlciBjaFN0eWxlKSAtPiBOb25lIil9LAorICAgIHsiR2V0SXRlbVN0eWxlIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfR2V0SXRlbVN0eWxlLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBpdGVtKSAtPiAoU3R5bGUgY2hTdHlsZSkiKX0sCisgICAgeyJTZXRNZW51SXRlbUNvbW1hbmRJRCIsIChQeUNGdW5jdGlvbilNZW51T2JqX1NldE1lbnVJdGVtQ29tbWFuZElELCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgaW5JdGVtLCBNZW51Q29tbWFuZCBpbkNvbW1hbmRJRCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldE1lbnVJdGVtQ29tbWFuZElEIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfR2V0TWVudUl0ZW1Db21tYW5kSUQsIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiBpbkl0ZW0pIC0+IChNZW51Q29tbWFuZCBvdXRDb21tYW5kSUQpIil9LAorICAgIHsiU2V0TWVudUl0ZW1Nb2RpZmllcnMiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9TZXRNZW51SXRlbU1vZGlmaWVycywgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IGluSXRlbSwgVUludDggaW5Nb2RpZmllcnMpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRNZW51SXRlbU1vZGlmaWVycyIsIChQeUNGdW5jdGlvbilNZW51T2JqX0dldE1lbnVJdGVtTW9kaWZpZXJzLCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgaW5JdGVtKSAtPiAoVUludDggb3V0TW9kaWZpZXJzKSIpfSwKKyAgICB7IlNldE1lbnVJdGVtSWNvbkhhbmRsZSIsIChQeUNGdW5jdGlvbilNZW51T2JqX1NldE1lbnVJdGVtSWNvbkhhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IGluSXRlbSwgVUludDggaW5JY29uVHlwZSwgSGFuZGxlIGluSWNvbkhhbmRsZSkgLT4gTm9uZSIpfSwKKyAgICB7IkdldE1lbnVJdGVtSWNvbkhhbmRsZSIsIChQeUNGdW5jdGlvbilNZW51T2JqX0dldE1lbnVJdGVtSWNvbkhhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IGluSXRlbSkgLT4gKFVJbnQ4IG91dEljb25UeXBlLCBIYW5kbGUgb3V0SWNvbkhhbmRsZSkiKX0sCisgICAgeyJTZXRNZW51SXRlbVRleHRFbmNvZGluZyIsIChQeUNGdW5jdGlvbilNZW51T2JqX1NldE1lbnVJdGVtVGV4dEVuY29kaW5nLCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgaW5JdGVtLCBUZXh0RW5jb2RpbmcgaW5TY3JpcHRJRCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldE1lbnVJdGVtVGV4dEVuY29kaW5nIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfR2V0TWVudUl0ZW1UZXh0RW5jb2RpbmcsIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiBpbkl0ZW0pIC0+IChUZXh0RW5jb2Rpbmcgb3V0U2NyaXB0SUQpIil9LAorICAgIHsiU2V0TWVudUl0ZW1IaWVyYXJjaGljYWxJRCIsIChQeUNGdW5jdGlvbilNZW51T2JqX1NldE1lbnVJdGVtSGllcmFyY2hpY2FsSUQsIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiBpbkl0ZW0sIE1lbnVJRCBpbkhpZXJJRCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldE1lbnVJdGVtSGllcmFyY2hpY2FsSUQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9HZXRNZW51SXRlbUhpZXJhcmNoaWNhbElELCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgaW5JdGVtKSAtPiAoTWVudUlEIG91dEhpZXJJRCkiKX0sCisgICAgeyJTZXRNZW51SXRlbUZvbnRJRCIsIChQeUNGdW5jdGlvbilNZW51T2JqX1NldE1lbnVJdGVtRm9udElELCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgaW5JdGVtLCBTSW50MTYgaW5Gb250SUQpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRNZW51SXRlbUZvbnRJRCIsIChQeUNGdW5jdGlvbilNZW51T2JqX0dldE1lbnVJdGVtRm9udElELCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgaW5JdGVtKSAtPiAoU0ludDE2IG91dEZvbnRJRCkiKX0sCisgICAgeyJTZXRNZW51SXRlbVJlZkNvbiIsIChQeUNGdW5jdGlvbilNZW51T2JqX1NldE1lbnVJdGVtUmVmQ29uLCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgaW5JdGVtLCBVSW50MzIgaW5SZWZDb24pIC0+IE5vbmUiKX0sCisgICAgeyJHZXRNZW51SXRlbVJlZkNvbiIsIChQeUNGdW5jdGlvbilNZW51T2JqX0dldE1lbnVJdGVtUmVmQ29uLCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgaW5JdGVtKSAtPiAoVUludDMyIG91dFJlZkNvbikiKX0sCisgICAgeyJTZXRNZW51SXRlbUtleUdseXBoIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfU2V0TWVudUl0ZW1LZXlHbHlwaCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IGluSXRlbSwgU0ludDE2IGluR2x5cGgpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRNZW51SXRlbUtleUdseXBoIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfR2V0TWVudUl0ZW1LZXlHbHlwaCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IGluSXRlbSkgLT4gKFNJbnQxNiBvdXRHbHlwaCkiKX0sCisgICAgeyJNYWNFbmFibGVNZW51SXRlbSIsIChQeUNGdW5jdGlvbilNZW51T2JqX01hY0VuYWJsZU1lbnVJdGVtLCAxLAorICAgICBQeURvY19TVFIoIihNZW51SXRlbUluZGV4IGl0ZW0pIC0+IE5vbmUiKX0sCisgICAgeyJEaXNhYmxlTWVudUl0ZW0iLCAoUHlDRnVuY3Rpb24pTWVudU9ial9EaXNhYmxlTWVudUl0ZW0sIDEsCisgICAgIFB5RG9jX1NUUigiKE1lbnVJdGVtSW5kZXggaXRlbSkgLT4gTm9uZSIpfSwKKyAgICB7IklzTWVudUl0ZW1FbmFibGVkIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfSXNNZW51SXRlbUVuYWJsZWQsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lbnVJdGVtSW5kZXggaXRlbSkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IkVuYWJsZU1lbnVJdGVtSWNvbiIsIChQeUNGdW5jdGlvbilNZW51T2JqX0VuYWJsZU1lbnVJdGVtSWNvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUl0ZW1JbmRleCBpdGVtKSAtPiBOb25lIil9LAorICAgIHsiRGlzYWJsZU1lbnVJdGVtSWNvbiIsIChQeUNGdW5jdGlvbilNZW51T2JqX0Rpc2FibGVNZW51SXRlbUljb24sIDEsCisgICAgIFB5RG9jX1NUUigiKE1lbnVJdGVtSW5kZXggaXRlbSkgLT4gTm9uZSIpfSwKKyAgICB7IklzTWVudUl0ZW1JY29uRW5hYmxlZCIsIChQeUNGdW5jdGlvbilNZW51T2JqX0lzTWVudUl0ZW1JY29uRW5hYmxlZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUl0ZW1JbmRleCBpdGVtKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiU2V0TWVudUl0ZW1IaWVyYXJjaGljYWxNZW51IiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfU2V0TWVudUl0ZW1IaWVyYXJjaGljYWxNZW51LCAxLAorICAgICBQeURvY19TVFIoIihNZW51SXRlbUluZGV4IGluSXRlbSwgTWVudUhhbmRsZSBpbkhpZXJNZW51KSAtPiBOb25lIil9LAorICAgIHsiR2V0TWVudUl0ZW1IaWVyYXJjaGljYWxNZW51IiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfR2V0TWVudUl0ZW1IaWVyYXJjaGljYWxNZW51LCAxLAorICAgICBQeURvY19TVFIoIihNZW51SXRlbUluZGV4IGluSXRlbSkgLT4gKE1lbnVIYW5kbGUgb3V0SGllck1lbnUpIil9LAorICAgIHsiQ29weU1lbnVJdGVtVGV4dEFzQ0ZTdHJpbmciLCAoUHlDRnVuY3Rpb24pTWVudU9ial9Db3B5TWVudUl0ZW1UZXh0QXNDRlN0cmluZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUl0ZW1JbmRleCBpbkl0ZW0pIC0+IChDRlN0cmluZ1JlZiBvdXRTdHJpbmcpIil9LAorICAgIHsiU2V0TWVudUl0ZW1UZXh0V2l0aENGU3RyaW5nIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfU2V0TWVudUl0ZW1UZXh0V2l0aENGU3RyaW5nLCAxLAorICAgICBQeURvY19TVFIoIihNZW51SXRlbUluZGV4IGluSXRlbSwgQ0ZTdHJpbmdSZWYgaW5TdHJpbmcpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRNZW51SXRlbUluZGVudCIsIChQeUNGdW5jdGlvbilNZW51T2JqX0dldE1lbnVJdGVtSW5kZW50LCAxLAorICAgICBQeURvY19TVFIoIihNZW51SXRlbUluZGV4IGluSXRlbSkgLT4gKFVJbnQzMiBvdXRJbmRlbnQpIil9LAorICAgIHsiU2V0TWVudUl0ZW1JbmRlbnQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9TZXRNZW51SXRlbUluZGVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUl0ZW1JbmRleCBpbkl0ZW0sIFVJbnQzMiBpbkluZGVudCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldE1lbnVJdGVtQ29tbWFuZEtleSIsIChQeUNGdW5jdGlvbilNZW51T2JqX0dldE1lbnVJdGVtQ29tbWFuZEtleSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUl0ZW1JbmRleCBpbkl0ZW0sIEJvb2xlYW4gaW5HZXRWaXJ0dWFsS2V5KSAtPiAoVUludDE2IG91dEtleSkiKX0sCisgICAgeyJTZXRNZW51SXRlbUNvbW1hbmRLZXkiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9TZXRNZW51SXRlbUNvbW1hbmRLZXksIDEsCisgICAgIFB5RG9jX1NUUigiKE1lbnVJdGVtSW5kZXggaW5JdGVtLCBCb29sZWFuIGluU2V0VmlydHVhbEtleSwgVUludDE2IGluS2V5KSAtPiBOb25lIil9LAorICAgIHsiR2V0TWVudUl0ZW1Qcm9wZXJ0eUF0dHJpYnV0ZXMiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9HZXRNZW51SXRlbVByb3BlcnR5QXR0cmlidXRlcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUl0ZW1JbmRleCBpdGVtLCBPU1R5cGUgcHJvcGVydHlDcmVhdG9yLCBPU1R5cGUgcHJvcGVydHlUYWcpIC0+IChVSW50MzIgYXR0cmlidXRlcykiKX0sCisgICAgeyJDaGFuZ2VNZW51SXRlbVByb3BlcnR5QXR0cmlidXRlcyIsIChQeUNGdW5jdGlvbilNZW51T2JqX0NoYW5nZU1lbnVJdGVtUHJvcGVydHlBdHRyaWJ1dGVzLCAxLAorICAgICBQeURvY19TVFIoIihNZW51SXRlbUluZGV4IGl0ZW0sIE9TVHlwZSBwcm9wZXJ0eUNyZWF0b3IsIE9TVHlwZSBwcm9wZXJ0eVRhZywgVUludDMyIGF0dHJpYnV0ZXNUb1NldCwgVUludDMyIGF0dHJpYnV0ZXNUb0NsZWFyKSAtPiBOb25lIil9LAorICAgIHsiR2V0TWVudUF0dHJpYnV0ZXMiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9HZXRNZW51QXR0cmlidXRlcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoTWVudUF0dHJpYnV0ZXMgb3V0QXR0cmlidXRlcykiKX0sCisgICAgeyJDaGFuZ2VNZW51QXR0cmlidXRlcyIsIChQeUNGdW5jdGlvbilNZW51T2JqX0NoYW5nZU1lbnVBdHRyaWJ1dGVzLCAxLAorICAgICBQeURvY19TVFIoIihNZW51QXR0cmlidXRlcyBzZXRUaGVzZUF0dHJpYnV0ZXMsIE1lbnVBdHRyaWJ1dGVzIGNsZWFyVGhlc2VBdHRyaWJ1dGVzKSAtPiBOb25lIil9LAorICAgIHsiR2V0TWVudUl0ZW1BdHRyaWJ1dGVzIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfR2V0TWVudUl0ZW1BdHRyaWJ1dGVzLCAxLAorICAgICBQeURvY19TVFIoIihNZW51SXRlbUluZGV4IGl0ZW0pIC0+IChNZW51SXRlbUF0dHJpYnV0ZXMgb3V0QXR0cmlidXRlcykiKX0sCisgICAgeyJDaGFuZ2VNZW51SXRlbUF0dHJpYnV0ZXMiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9DaGFuZ2VNZW51SXRlbUF0dHJpYnV0ZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lbnVJdGVtSW5kZXggaXRlbSwgTWVudUl0ZW1BdHRyaWJ1dGVzIHNldFRoZXNlQXR0cmlidXRlcywgTWVudUl0ZW1BdHRyaWJ1dGVzIGNsZWFyVGhlc2VBdHRyaWJ1dGVzKSAtPiBOb25lIil9LAorICAgIHsiRGlzYWJsZUFsbE1lbnVJdGVtcyIsIChQeUNGdW5jdGlvbilNZW51T2JqX0Rpc2FibGVBbGxNZW51SXRlbXMsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkVuYWJsZUFsbE1lbnVJdGVtcyIsIChQeUNGdW5jdGlvbilNZW51T2JqX0VuYWJsZUFsbE1lbnVJdGVtcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiTWVudUhhc0VuYWJsZWRJdGVtcyIsIChQeUNGdW5jdGlvbilNZW51T2JqX01lbnVIYXNFbmFibGVkSXRlbXMsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IkdldE1lbnVUeXBlIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfR2V0TWVudVR5cGUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQxNiBvdXRUeXBlKSIpfSwKKyAgICB7IkNvdW50TWVudUl0ZW1zV2l0aENvbW1hbmRJRCIsIChQeUNGdW5jdGlvbilNZW51T2JqX0NvdW50TWVudUl0ZW1zV2l0aENvbW1hbmRJRCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUNvbW1hbmQgaW5Db21tYW5kSUQpIC0+IChJdGVtQ291bnQgX3J2KSIpfSwKKyAgICB7IkdldEluZE1lbnVJdGVtV2l0aENvbW1hbmRJRCIsIChQeUNGdW5jdGlvbilNZW51T2JqX0dldEluZE1lbnVJdGVtV2l0aENvbW1hbmRJRCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUNvbW1hbmQgaW5Db21tYW5kSUQsIFVJbnQzMiBpbkl0ZW1JbmRleCkgLT4gKE1lbnVIYW5kbGUgb3V0TWVudSwgTWVudUl0ZW1JbmRleCBvdXRJbmRleCkiKX0sCisgICAgeyJFbmFibGVNZW51Q29tbWFuZCIsIChQeUNGdW5jdGlvbilNZW51T2JqX0VuYWJsZU1lbnVDb21tYW5kLCAxLAorICAgICBQeURvY19TVFIoIihNZW51Q29tbWFuZCBpbkNvbW1hbmRJRCkgLT4gTm9uZSIpfSwKKyAgICB7IkRpc2FibGVNZW51Q29tbWFuZCIsIChQeUNGdW5jdGlvbilNZW51T2JqX0Rpc2FibGVNZW51Q29tbWFuZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUNvbW1hbmQgaW5Db21tYW5kSUQpIC0+IE5vbmUiKX0sCisgICAgeyJJc01lbnVDb21tYW5kRW5hYmxlZCIsIChQeUNGdW5jdGlvbilNZW51T2JqX0lzTWVudUNvbW1hbmRFbmFibGVkLCAxLAorICAgICBQeURvY19TVFIoIihNZW51Q29tbWFuZCBpbkNvbW1hbmRJRCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IlNldE1lbnVDb21tYW5kTWFyayIsIChQeUNGdW5jdGlvbilNZW51T2JqX1NldE1lbnVDb21tYW5kTWFyaywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUNvbW1hbmQgaW5Db21tYW5kSUQsIFVuaUNoYXIgaW5NYXJrKSAtPiBOb25lIil9LAorICAgIHsiR2V0TWVudUNvbW1hbmRNYXJrIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfR2V0TWVudUNvbW1hbmRNYXJrLCAxLAorICAgICBQeURvY19TVFIoIihNZW51Q29tbWFuZCBpbkNvbW1hbmRJRCkgLT4gKFVuaUNoYXIgb3V0TWFyaykiKX0sCisgICAgeyJHZXRNZW51Q29tbWFuZFByb3BlcnR5U2l6ZSIsIChQeUNGdW5jdGlvbilNZW51T2JqX0dldE1lbnVDb21tYW5kUHJvcGVydHlTaXplLCAxLAorICAgICBQeURvY19TVFIoIihNZW51Q29tbWFuZCBpbkNvbW1hbmRJRCwgT1NUeXBlIGluUHJvcGVydHlDcmVhdG9yLCBPU1R5cGUgaW5Qcm9wZXJ0eVRhZykgLT4gKEJ5dGVDb3VudCBvdXRTaXplKSIpfSwKKyAgICB7IlJlbW92ZU1lbnVDb21tYW5kUHJvcGVydHkiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9SZW1vdmVNZW51Q29tbWFuZFByb3BlcnR5LCAxLAorICAgICBQeURvY19TVFIoIihNZW51Q29tbWFuZCBpbkNvbW1hbmRJRCwgT1NUeXBlIGluUHJvcGVydHlDcmVhdG9yLCBPU1R5cGUgaW5Qcm9wZXJ0eVRhZykgLT4gTm9uZSIpfSwKKyAgICB7IklzTWVudUl0ZW1JbnZhbGlkIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfSXNNZW51SXRlbUludmFsaWQsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lbnVJdGVtSW5kZXggaW5JdGVtKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiSW52YWxpZGF0ZU1lbnVJdGVtcyIsIChQeUNGdW5jdGlvbilNZW51T2JqX0ludmFsaWRhdGVNZW51SXRlbXMsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lbnVJdGVtSW5kZXggaW5GaXJzdEl0ZW0sIEl0ZW1Db3VudCBpbk51bUl0ZW1zKSAtPiBOb25lIil9LAorICAgIHsiVXBkYXRlSW52YWxpZE1lbnVJdGVtcyIsIChQeUNGdW5jdGlvbilNZW51T2JqX1VwZGF0ZUludmFsaWRNZW51SXRlbXMsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkNyZWF0ZVN0YW5kYXJkRm9udE1lbnUiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9DcmVhdGVTdGFuZGFyZEZvbnRNZW51LCAxLAorICAgICBQeURvY19TVFIoIihNZW51SXRlbUluZGV4IGFmdGVySXRlbSwgTWVudUlEIGZpcnN0SGllck1lbnVJRCwgT3B0aW9uQml0cyBvcHRpb25zKSAtPiAoSXRlbUNvdW50IG91dEhpZXJNZW51Q291bnQpIil9LAorICAgIHsiVXBkYXRlU3RhbmRhcmRGb250TWVudSIsIChQeUNGdW5jdGlvbilNZW51T2JqX1VwZGF0ZVN0YW5kYXJkRm9udE1lbnUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEl0ZW1Db3VudCBvdXRIaWVyTWVudUNvdW50KSIpfSwKKyAgICB7IkdldEZvbnRGYW1pbHlGcm9tTWVudVNlbGVjdGlvbiIsIChQeUNGdW5jdGlvbilNZW51T2JqX0dldEZvbnRGYW1pbHlGcm9tTWVudVNlbGVjdGlvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUl0ZW1JbmRleCBpdGVtKSAtPiAoRk1Gb250RmFtaWx5IG91dEZvbnRGYW1pbHksIEZNRm9udFN0eWxlIG91dFN0eWxlKSIpfSwKKyAgICB7IkdldE1lbnVJRCIsIChQeUNGdW5jdGlvbilNZW51T2JqX0dldE1lbnVJRCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoTWVudUlEIF9ydikiKX0sCisgICAgeyJHZXRNZW51V2lkdGgiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9HZXRNZW51V2lkdGgsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFNJbnQxNiBfcnYpIil9LAorICAgIHsiR2V0TWVudUhlaWdodCIsIChQeUNGdW5jdGlvbilNZW51T2JqX0dldE1lbnVIZWlnaHQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFNJbnQxNiBfcnYpIil9LAorICAgIHsiU2V0TWVudUlEIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfU2V0TWVudUlELCAxLAorICAgICBQeURvY19TVFIoIihNZW51SUQgbWVudUlEKSAtPiBOb25lIil9LAorICAgIHsiU2V0TWVudVdpZHRoIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfU2V0TWVudVdpZHRoLCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgd2lkdGgpIC0+IE5vbmUiKX0sCisgICAgeyJTZXRNZW51SGVpZ2h0IiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfU2V0TWVudUhlaWdodCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IGhlaWdodCkgLT4gTm9uZSIpfSwKKyAgICB7ImFzX1Jlc291cmNlIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfYXNfUmVzb3VyY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEhhbmRsZSBfcnYpIil9LAorICAgIHsiQXBwZW5kTWVudSIsIChQeUNGdW5jdGlvbilNZW51T2JqX0FwcGVuZE1lbnUsIDEsCisgICAgIFB5RG9jX1NUUigiKFN0cjI1NSBkYXRhKSAtPiBOb25lIil9LAorICAgIHsiSW5zZXJ0TWVudSIsIChQeUNGdW5jdGlvbilNZW51T2JqX0luc2VydE1lbnUsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGJlZm9yZUlEKSAtPiBOb25lIil9LAorICAgIHsiSW5zZXJ0TWVudUl0ZW0iLCAoUHlDRnVuY3Rpb24pTWVudU9ial9JbnNlcnRNZW51SXRlbSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU3RyMjU1IGl0ZW1TdHJpbmcsIHNob3J0IGFmdGVySXRlbSkgLT4gTm9uZSIpfSwKKyAgICB7IkVuYWJsZU1lbnVJdGVtIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfRW5hYmxlTWVudUl0ZW0sIDEsCisgICAgIFB5RG9jX1NUUigiKFVJbnQxNiBpdGVtKSAtPiBOb25lIil9LAorICAgIHsiQ2hlY2tNZW51SXRlbSIsIChQeUNGdW5jdGlvbilNZW51T2JqX0NoZWNrTWVudUl0ZW0sIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGl0ZW0sIEJvb2xlYW4gY2hlY2tlZCkgLT4gTm9uZSIpfSwKKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKICNkZWZpbmUgTWVudU9ial9nZXRzZXRsaXN0IE5VTEwKQEAgLTI1NDAsNjEgKzI1NDAsNjEgQEAKIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX3RwX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICpfYXJncywgUHlPYmplY3QgKl9rd2RzKQogewotCVB5T2JqZWN0ICpfc2VsZjsKLQlNZW51SGFuZGxlIGl0c2VsZjsKLQljaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKKyAgICBQeU9iamVjdCAqX3NlbGY7CisgICAgTWVudUhhbmRsZSBpdHNlbGY7CisgICAgY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBNZW51T2JqX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKLQlpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOwotCSgoTWVudU9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiBfc2VsZjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBNZW51T2JqX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOworICAgICgoTWVudU9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIHJldHVybiBfc2VsZjsKIH0KIAogI2RlZmluZSBNZW51T2JqX3RwX2ZyZWUgUHlPYmplY3RfRGVsCiAKIAogUHlUeXBlT2JqZWN0IE1lbnVfVHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKLQkwLCAvKm9iX3NpemUqLwotCSJfTWVudS5NZW51IiwgLyp0cF9uYW1lKi8KLQlzaXplb2YoTWVudU9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KLQkwLCAvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpIE1lbnVPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KLQkwLCAvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykgTWVudU9ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYykgTWVudU9ial9yZXByLCAvKnRwX3JlcHIqLwotCShQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KLQkoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLwotCShQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYykgTWVudU9ial9oYXNoLCAvKnRwX2hhc2gqLwotCTAsIC8qdHBfY2FsbCovCi0JMCwgLyp0cF9zdHIqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KLQlQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLwotCTAsIC8qdHBfYXNfYnVmZmVyKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQkwLCAvKnRwX2RvYyovCi0JMCwgLyp0cF90cmF2ZXJzZSovCi0JMCwgLyp0cF9jbGVhciovCi0JMCwgLyp0cF9yaWNoY29tcGFyZSovCi0JMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCi0JMCwgLyp0cF9pdGVyKi8KLQkwLCAvKnRwX2l0ZXJuZXh0Ki8KLQlNZW51T2JqX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KLQkwLCAvKnRwX21lbWJlcnMqLwotCU1lbnVPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLwotCTAsIC8qdHBfYmFzZSovCi0JMCwgLyp0cF9kaWN0Ki8KLQkwLCAvKnRwX2Rlc2NyX2dldCovCi0JMCwgLyp0cF9kZXNjcl9zZXQqLwotCTAsIC8qdHBfZGljdG9mZnNldCovCi0JTWVudU9ial90cF9pbml0LCAvKiB0cF9pbml0ICovCi0JTWVudU9ial90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KLQlNZW51T2JqX3RwX25ldywgLyogdHBfbmV3ICovCi0JTWVudU9ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgLypvYl9zaXplKi8KKyAgICAiX01lbnUuTWVudSIsIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKE1lbnVPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKSBNZW51T2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgMCwgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCisgICAgKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCisgICAgKGNtcGZ1bmMpIE1lbnVPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpIE1lbnVPYmpfcmVwciwgLyp0cF9yZXByKi8KKyAgICAoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCisgICAgKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAoaGFzaGZ1bmMpIE1lbnVPYmpfaGFzaCwgLyp0cF9oYXNoKi8KKyAgICAwLCAvKnRwX2NhbGwqLworICAgIDAsIC8qdHBfc3RyKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCisgICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgMCwgLyp0cF9kb2MqLworICAgIDAsIC8qdHBfdHJhdmVyc2UqLworICAgIDAsIC8qdHBfY2xlYXIqLworICAgIDAsIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsIC8qdHBfaXRlciovCisgICAgMCwgLyp0cF9pdGVybmV4dCovCisgICAgTWVudU9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCisgICAgMCwgLyp0cF9tZW1iZXJzKi8KKyAgICBNZW51T2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KKyAgICAwLCAvKnRwX2Jhc2UqLworICAgIDAsIC8qdHBfZGljdCovCisgICAgMCwgLyp0cF9kZXNjcl9nZXQqLworICAgIDAsIC8qdHBfZGVzY3Jfc2V0Ki8KKyAgICAwLCAvKnRwX2RpY3RvZmZzZXQqLworICAgIE1lbnVPYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLworICAgIE1lbnVPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCisgICAgTWVudU9ial90cF9uZXcsIC8qIHRwX25ldyAqLworICAgIE1lbnVPYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBFbmQgb2JqZWN0IHR5cGUgTWVudSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0yNjAyLDg0MiArMjYwMiw4NDIgQEAKIAogc3RhdGljIFB5T2JqZWN0ICpNZW51X05ld01lbnUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU1lbnVIYW5kbGUgX3J2OwotCU1lbnVJRCBtZW51SUQ7Ci0JU3RyMjU1IG1lbnVUaXRsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgTWVudUhhbmRsZSBfcnY7CisgICAgTWVudUlEIG1lbnVJRDsKKyAgICBTdHIyNTUgbWVudVRpdGxlOwogI2lmbmRlZiBOZXdNZW51Ci0JUHlNYWNfUFJFQ0hFQ0soTmV3TWVudSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTmV3TWVudSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmbWVudUlELAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIG1lbnVUaXRsZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE5ld01lbnUobWVudUlELAotCSAgICAgICAgICAgICAgbWVudVRpdGxlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIE1lbnVPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtZW51SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgbWVudVRpdGxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTmV3TWVudShtZW51SUQsCisgICAgICAgICAgICAgICAgICBtZW51VGl0bGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgTWVudU9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudV9NYWNHZXRNZW51KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlNZW51SGFuZGxlIF9ydjsKLQlzaG9ydCByZXNvdXJjZUlEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBNZW51SGFuZGxlIF9ydjsKKyAgICBzaG9ydCByZXNvdXJjZUlEOwogI2lmbmRlZiBNYWNHZXRNZW51Ci0JUHlNYWNfUFJFQ0hFQ0soTWFjR2V0TWVudSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWFjR2V0TWVudSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJlc291cmNlSUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNYWNHZXRNZW51KHJlc291cmNlSUQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgTWVudU9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXNvdXJjZUlEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWFjR2V0TWVudShyZXNvdXJjZUlEKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIE1lbnVPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVfQ3JlYXRlTmV3TWVudShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlNZW51SUQgaW5NZW51SUQ7Ci0JTWVudUF0dHJpYnV0ZXMgaW5NZW51QXR0cmlidXRlczsKLQlNZW51SGFuZGxlIG91dE1lbnVSZWY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgTWVudUlEIGluTWVudUlEOworICAgIE1lbnVBdHRyaWJ1dGVzIGluTWVudUF0dHJpYnV0ZXM7CisgICAgTWVudUhhbmRsZSBvdXRNZW51UmVmOwogI2lmbmRlZiBDcmVhdGVOZXdNZW51Ci0JUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlTmV3TWVudSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlTmV3TWVudSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbk1lbnVJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluTWVudUF0dHJpYnV0ZXMpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ3JlYXRlTmV3TWVudShpbk1lbnVJRCwKLQkgICAgICAgICAgICAgICAgICAgICBpbk1lbnVBdHRyaWJ1dGVzLAotCSAgICAgICAgICAgICAgICAgICAgICZvdXRNZW51UmVmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgTWVudU9ial9OZXcsIG91dE1lbnVSZWYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluTWVudUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5NZW51QXR0cmlidXRlcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDcmVhdGVOZXdNZW51KGluTWVudUlELAorICAgICAgICAgICAgICAgICAgICAgICAgIGluTWVudUF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgJm91dE1lbnVSZWYpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBNZW51T2JqX05ldywgb3V0TWVudVJlZik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudV9NZW51S2V5KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIF9ydjsKLQlDaGFyUGFyYW1ldGVyIGNoOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBsb25nIF9ydjsKKyAgICBDaGFyUGFyYW1ldGVyIGNoOwogI2lmbmRlZiBNZW51S2V5Ci0JUHlNYWNfUFJFQ0hFQ0soTWVudUtleSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVudUtleSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVudUtleShjaCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lbnVLZXkoY2gpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVfTWVudVNlbGVjdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBfcnY7Ci0JUG9pbnQgc3RhcnRQdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgbG9uZyBfcnY7CisgICAgUG9pbnQgc3RhcnRQdDsKICNpZm5kZWYgTWVudVNlbGVjdAotCVB5TWFjX1BSRUNIRUNLKE1lbnVTZWxlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lbnVTZWxlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnN0YXJ0UHQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZW51U2VsZWN0KHN0YXJ0UHQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZzdGFydFB0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVudVNlbGVjdChzdGFydFB0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51X01lbnVDaG9pY2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWxvbmcgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBsb25nIF9ydjsKICNpZm5kZWYgTWVudUNob2ljZQotCVB5TWFjX1BSRUNIRUNLKE1lbnVDaG9pY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lbnVDaG9pY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lbnVDaG9pY2UoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVudUNob2ljZSgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVfTWVudUV2ZW50KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlVSW50MzIgX3J2OwotCUV2ZW50UmVjb3JkIGluRXZlbnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFVJbnQzMiBfcnY7CisgICAgRXZlbnRSZWNvcmQgaW5FdmVudDsKICNpZm5kZWYgTWVudUV2ZW50Ci0JUHlNYWNfUFJFQ0hFQ0soTWVudUV2ZW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZW51RXZlbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRFdmVudFJlY29yZCwgJmluRXZlbnQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZW51RXZlbnQoJmluRXZlbnQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RXZlbnRSZWNvcmQsICZpbkV2ZW50KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVudUV2ZW50KCZpbkV2ZW50KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51X0dldE1CYXJIZWlnaHQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgX3J2OwogI2lmbmRlZiBHZXRNQmFySGVpZ2h0Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0TUJhckhlaWdodCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TUJhckhlaWdodCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TUJhckhlaWdodCgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRNQmFySGVpZ2h0KCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudV9NYWNEcmF3TWVudUJhcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBNYWNEcmF3TWVudUJhcgotCVB5TWFjX1BSRUNIRUNLKE1hY0RyYXdNZW51QmFyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNYWNEcmF3TWVudUJhcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTWFjRHJhd01lbnVCYXIoKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE1hY0RyYXdNZW51QmFyKCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVfSW52YWxNZW51QmFyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIEludmFsTWVudUJhcgotCVB5TWFjX1BSRUNIRUNLKEludmFsTWVudUJhcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soSW52YWxNZW51QmFyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlJbnZhbE1lbnVCYXIoKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEludmFsTWVudUJhcigpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51X0hpbGl0ZU1lbnUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU1lbnVJRCBtZW51SUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE1lbnVJRCBtZW51SUQ7CiAjaWZuZGVmIEhpbGl0ZU1lbnUKLQlQeU1hY19QUkVDSEVDSyhIaWxpdGVNZW51KTsKKyAgICBQeU1hY19QUkVDSEVDSyhIaWxpdGVNZW51KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmbWVudUlEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JSGlsaXRlTWVudShtZW51SUQpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lbnVJRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEhpbGl0ZU1lbnUobWVudUlEKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudV9HZXROZXdNQmFyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlNZW51QmFySGFuZGxlIF9ydjsKLQlzaG9ydCBtZW51QmFySUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE1lbnVCYXJIYW5kbGUgX3J2OworICAgIHNob3J0IG1lbnVCYXJJRDsKICNpZm5kZWYgR2V0TmV3TUJhcgotCVB5TWFjX1BSRUNIRUNLKEdldE5ld01CYXIpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE5ld01CYXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZtZW51QmFySUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXROZXdNQmFyKG1lbnVCYXJJRCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVudUJhcklEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TmV3TUJhcihtZW51QmFySUQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51X0dldE1lbnVCYXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU1lbnVCYXJIYW5kbGUgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBNZW51QmFySGFuZGxlIF9ydjsKICNpZm5kZWYgR2V0TWVudUJhcgotCVB5TWFjX1BSRUNIRUNLKEdldE1lbnVCYXIpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1lbnVCYXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldE1lbnVCYXIoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE1lbnVCYXIoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudV9TZXRNZW51QmFyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlNZW51QmFySGFuZGxlIG1iYXI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE1lbnVCYXJIYW5kbGUgbWJhcjsKICNpZm5kZWYgU2V0TWVudUJhcgotCVB5TWFjX1BSRUNIRUNLKFNldE1lbnVCYXIpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldE1lbnVCYXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJm1iYXIpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRNZW51QmFyKG1iYXIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmbWJhcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldE1lbnVCYXIobWJhcik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVfRHVwbGljYXRlTWVudUJhcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlNZW51QmFySGFuZGxlIGluTWJhcjsKLQlNZW51QmFySGFuZGxlIG91dE1iYXI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgTWVudUJhckhhbmRsZSBpbk1iYXI7CisgICAgTWVudUJhckhhbmRsZSBvdXRNYmFyOwogI2lmbmRlZiBEdXBsaWNhdGVNZW51QmFyCi0JUHlNYWNfUFJFQ0hFQ0soRHVwbGljYXRlTWVudUJhcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soRHVwbGljYXRlTWVudUJhcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaW5NYmFyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IER1cGxpY2F0ZU1lbnVCYXIoaW5NYmFyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICZvdXRNYmFyKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgb3V0TWJhcik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmluTWJhcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBEdXBsaWNhdGVNZW51QmFyKGluTWJhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0TWJhcik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIG91dE1iYXIpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVfRGlzcG9zZU1lbnVCYXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JTWVudUJhckhhbmRsZSBpbk1iYXI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgTWVudUJhckhhbmRsZSBpbk1iYXI7CiAjaWZuZGVmIERpc3Bvc2VNZW51QmFyCi0JUHlNYWNfUFJFQ0hFQ0soRGlzcG9zZU1lbnVCYXIpOworICAgIFB5TWFjX1BSRUNIRUNLKERpc3Bvc2VNZW51QmFyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZpbk1iYXIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRGlzcG9zZU1lbnVCYXIoaW5NYmFyKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaW5NYmFyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IERpc3Bvc2VNZW51QmFyKGluTWJhcik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudV9HZXRNZW51SGFuZGxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlNZW51SGFuZGxlIF9ydjsKLQlNZW51SUQgbWVudUlEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBNZW51SGFuZGxlIF9ydjsKKyAgICBNZW51SUQgbWVudUlEOwogI2lmbmRlZiBHZXRNZW51SGFuZGxlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TWVudUhhbmRsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TWVudUhhbmRsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1lbnVJRCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldE1lbnVIYW5kbGUobWVudUlEKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIE1lbnVPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVudUlEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TWVudUhhbmRsZShtZW51SUQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgTWVudU9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudV9NYWNEZWxldGVNZW51KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlNZW51SUQgbWVudUlEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBNZW51SUQgbWVudUlEOwogI2lmbmRlZiBNYWNEZWxldGVNZW51Ci0JUHlNYWNfUFJFQ0hFQ0soTWFjRGVsZXRlTWVudSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWFjRGVsZXRlTWVudSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1lbnVJRCkpCi0JCXJldHVybiBOVUxMOwotCU1hY0RlbGV0ZU1lbnUobWVudUlEKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtZW51SUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNYWNEZWxldGVNZW51KG1lbnVJRCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVfQ2xlYXJNZW51QmFyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIENsZWFyTWVudUJhcgotCVB5TWFjX1BSRUNIRUNLKENsZWFyTWVudUJhcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ2xlYXJNZW51QmFyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlDbGVhck1lbnVCYXIoKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENsZWFyTWVudUJhcigpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51X1NldE1lbnVGbGFzaENvdW50KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBjb3VudDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgY291bnQ7CiAjaWZuZGVmIFNldE1lbnVGbGFzaENvdW50Ci0JUHlNYWNfUFJFQ0hFQ0soU2V0TWVudUZsYXNoQ291bnQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldE1lbnVGbGFzaENvdW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmY291bnQpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRNZW51Rmxhc2hDb3VudChjb3VudCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY291bnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRNZW51Rmxhc2hDb3VudChjb3VudCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVfRmxhc2hNZW51QmFyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlNZW51SUQgbWVudUlEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBNZW51SUQgbWVudUlEOwogI2lmbmRlZiBGbGFzaE1lbnVCYXIKLQlQeU1hY19QUkVDSEVDSyhGbGFzaE1lbnVCYXIpOworICAgIFB5TWFjX1BSRUNIRUNLKEZsYXNoTWVudUJhcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1lbnVJRCkpCi0JCXJldHVybiBOVUxMOwotCUZsYXNoTWVudUJhcihtZW51SUQpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lbnVJRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEZsYXNoTWVudUJhcihtZW51SUQpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51X0lzTWVudUJhclZpc2libGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKICNpZm5kZWYgSXNNZW51QmFyVmlzaWJsZQotCVB5TWFjX1BSRUNIRUNLKElzTWVudUJhclZpc2libGUpOworICAgIFB5TWFjX1BSRUNIRUNLKElzTWVudUJhclZpc2libGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IElzTWVudUJhclZpc2libGUoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gSXNNZW51QmFyVmlzaWJsZSgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVfU2hvd01lbnVCYXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgU2hvd01lbnVCYXIKLQlQeU1hY19QUkVDSEVDSyhTaG93TWVudUJhcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2hvd01lbnVCYXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCVNob3dNZW51QmFyKCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTaG93TWVudUJhcigpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51X0hpZGVNZW51QmFyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIEhpZGVNZW51QmFyCi0JUHlNYWNfUFJFQ0hFQ0soSGlkZU1lbnVCYXIpOworICAgIFB5TWFjX1BSRUNIRUNLKEhpZGVNZW51QmFyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlIaWRlTWVudUJhcigpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgSGlkZU1lbnVCYXIoKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudV9BY3F1aXJlUm9vdE1lbnUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU1lbnVIYW5kbGUgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBNZW51SGFuZGxlIF9ydjsKICNpZm5kZWYgQWNxdWlyZVJvb3RNZW51Ci0JUHlNYWNfUFJFQ0hFQ0soQWNxdWlyZVJvb3RNZW51KTsKKyAgICBQeU1hY19QUkVDSEVDSyhBY3F1aXJlUm9vdE1lbnUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEFjcXVpcmVSb290TWVudSgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgTWVudU9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEFjcXVpcmVSb290TWVudSgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgTWVudU9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudV9EZWxldGVNQ0VudHJpZXMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU1lbnVJRCBtZW51SUQ7Ci0Jc2hvcnQgbWVudUl0ZW07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE1lbnVJRCBtZW51SUQ7CisgICAgc2hvcnQgbWVudUl0ZW07CiAjaWZuZGVmIERlbGV0ZU1DRW50cmllcwotCVB5TWFjX1BSRUNIRUNLKERlbGV0ZU1DRW50cmllcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGVsZXRlTUNFbnRyaWVzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1lbnVJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1lbnVJdGVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JRGVsZXRlTUNFbnRyaWVzKG1lbnVJRCwKLQkgICAgICAgICAgICAgICAgbWVudUl0ZW0pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtZW51SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtZW51SXRlbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIERlbGV0ZU1DRW50cmllcyhtZW51SUQsCisgICAgICAgICAgICAgICAgICAgIG1lbnVJdGVtKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudV9Jbml0Q29udGV4dHVhbE1lbnVzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOwogI2lmbmRlZiBJbml0Q29udGV4dHVhbE1lbnVzCi0JUHlNYWNfUFJFQ0hFQ0soSW5pdENvbnRleHR1YWxNZW51cyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSW5pdENvbnRleHR1YWxNZW51cyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEluaXRDb250ZXh0dWFsTWVudXMoKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEluaXRDb250ZXh0dWFsTWVudXMoKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51X0lzU2hvd0NvbnRleHR1YWxNZW51Q2xpY2soUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCUV2ZW50UmVjb3JkIGluRXZlbnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIEV2ZW50UmVjb3JkIGluRXZlbnQ7CiAjaWZuZGVmIElzU2hvd0NvbnRleHR1YWxNZW51Q2xpY2sKLQlQeU1hY19QUkVDSEVDSyhJc1Nob3dDb250ZXh0dWFsTWVudUNsaWNrKTsKKyAgICBQeU1hY19QUkVDSEVDSyhJc1Nob3dDb250ZXh0dWFsTWVudUNsaWNrKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RXZlbnRSZWNvcmQsICZpbkV2ZW50KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gSXNTaG93Q29udGV4dHVhbE1lbnVDbGljaygmaW5FdmVudCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRFdmVudFJlY29yZCwgJmluRXZlbnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBJc1Nob3dDb250ZXh0dWFsTWVudUNsaWNrKCZpbkV2ZW50KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51X0xNR2V0VGhlTWVudShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JU0ludDE2IF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgU0ludDE2IF9ydjsKICNpZm5kZWYgTE1HZXRUaGVNZW51Ci0JUHlNYWNfUFJFQ0hFQ0soTE1HZXRUaGVNZW51KTsKKyAgICBQeU1hY19QUkVDSEVDSyhMTUdldFRoZU1lbnUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IExNR2V0VGhlTWVudSgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBMTUdldFRoZU1lbnUoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51X2FzX01lbnUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU1lbnVIYW5kbGUgX3J2OwotCUhhbmRsZSBoOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBNZW51SGFuZGxlIF9ydjsKKyAgICBIYW5kbGUgaDsKICNpZm5kZWYgYXNfTWVudQotCVB5TWFjX1BSRUNIRUNLKGFzX01lbnUpOworICAgIFB5TWFjX1BSRUNIRUNLKGFzX01lbnUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBhc19NZW51KGgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgTWVudU9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBhc19NZW51KGgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgTWVudU9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudV9HZXRNZW51KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlNZW51SGFuZGxlIF9ydjsKLQlzaG9ydCByZXNvdXJjZUlEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBNZW51SGFuZGxlIF9ydjsKKyAgICBzaG9ydCByZXNvdXJjZUlEOwogI2lmbmRlZiBHZXRNZW51Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0TWVudSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TWVudSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJlc291cmNlSUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRNZW51KHJlc291cmNlSUQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgTWVudU9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXNvdXJjZUlEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TWVudShyZXNvdXJjZUlEKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIE1lbnVPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVfRGVsZXRlTWVudShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgbWVudUlEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBtZW51SUQ7CiAjaWZuZGVmIERlbGV0ZU1lbnUKLQlQeU1hY19QUkVDSEVDSyhEZWxldGVNZW51KTsKKyAgICBQeU1hY19QUkVDSEVDSyhEZWxldGVNZW51KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmbWVudUlEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JRGVsZXRlTWVudShtZW51SUQpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lbnVJRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIERlbGV0ZU1lbnUobWVudUlEKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudV9EcmF3TWVudUJhcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBEcmF3TWVudUJhcgotCVB5TWFjX1BSRUNIRUNLKERyYXdNZW51QmFyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEcmF3TWVudUJhcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JRHJhd01lbnVCYXIoKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIERyYXdNZW51QmFyKCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVfQ291bnRNZW51SXRlbXNXaXRoQ29tbWFuZElEKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlJdGVtQ291bnQgX3J2OwotCU1lbnVIYW5kbGUgaW5NZW51OwotCU1lbnVDb21tYW5kIGluQ29tbWFuZElEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBJdGVtQ291bnQgX3J2OworICAgIE1lbnVIYW5kbGUgaW5NZW51OworICAgIE1lbnVDb21tYW5kIGluQ29tbWFuZElEOwogI2lmbmRlZiBDb3VudE1lbnVJdGVtc1dpdGhDb21tYW5kSUQKLQlQeU1hY19QUkVDSEVDSyhDb3VudE1lbnVJdGVtc1dpdGhDb21tYW5kSUQpOworICAgIFB5TWFjX1BSRUNIRUNLKENvdW50TWVudUl0ZW1zV2l0aENvbW1hbmRJRCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBPcHRNZW51T2JqX0NvbnZlcnQsICZpbk1lbnUsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkNvbW1hbmRJRCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENvdW50TWVudUl0ZW1zV2l0aENvbW1hbmRJRChpbk1lbnUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQ29tbWFuZElEKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRNZW51T2JqX0NvbnZlcnQsICZpbk1lbnUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkNvbW1hbmRJRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENvdW50TWVudUl0ZW1zV2l0aENvbW1hbmRJRChpbk1lbnUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQ29tbWFuZElEKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51X0dldEluZE1lbnVJdGVtV2l0aENvbW1hbmRJRChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlNZW51SGFuZGxlIGluTWVudTsKLQlNZW51Q29tbWFuZCBpbkNvbW1hbmRJRDsKLQlVSW50MzIgaW5JdGVtSW5kZXg7Ci0JTWVudUhhbmRsZSBvdXRNZW51OwotCU1lbnVJdGVtSW5kZXggb3V0SW5kZXg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgTWVudUhhbmRsZSBpbk1lbnU7CisgICAgTWVudUNvbW1hbmQgaW5Db21tYW5kSUQ7CisgICAgVUludDMyIGluSXRlbUluZGV4OworICAgIE1lbnVIYW5kbGUgb3V0TWVudTsKKyAgICBNZW51SXRlbUluZGV4IG91dEluZGV4OwogI2lmbmRlZiBHZXRJbmRNZW51SXRlbVdpdGhDb21tYW5kSUQKLQlQeU1hY19QUkVDSEVDSyhHZXRJbmRNZW51SXRlbVdpdGhDb21tYW5kSUQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldEluZE1lbnVJdGVtV2l0aENvbW1hbmRJRCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgT3B0TWVudU9ial9Db252ZXJ0LCAmaW5NZW51LAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5Db21tYW5kSUQsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkl0ZW1JbmRleCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRJbmRNZW51SXRlbVdpdGhDb21tYW5kSUQoaW5NZW51LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Db21tYW5kSUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkl0ZW1JbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRNZW51LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEluZGV4KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgIE1lbnVPYmpfTmV3LCBvdXRNZW51LAotCSAgICAgICAgICAgICAgICAgICAgIG91dEluZGV4KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0TWVudU9ial9Db252ZXJ0LCAmaW5NZW51LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Db21tYW5kSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkl0ZW1JbmRleCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRJbmRNZW51SXRlbVdpdGhDb21tYW5kSUQoaW5NZW51LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Db21tYW5kSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkl0ZW1JbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRNZW51LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEluZGV4KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIE1lbnVPYmpfTmV3LCBvdXRNZW51LAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dEluZGV4KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51X0VuYWJsZU1lbnVDb21tYW5kKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlNZW51SGFuZGxlIGluTWVudTsKLQlNZW51Q29tbWFuZCBpbkNvbW1hbmRJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgTWVudUhhbmRsZSBpbk1lbnU7CisgICAgTWVudUNvbW1hbmQgaW5Db21tYW5kSUQ7CiAjaWZuZGVmIEVuYWJsZU1lbnVDb21tYW5kCi0JUHlNYWNfUFJFQ0hFQ0soRW5hYmxlTWVudUNvbW1hbmQpOworICAgIFB5TWFjX1BSRUNIRUNLKEVuYWJsZU1lbnVDb21tYW5kKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIE9wdE1lbnVPYmpfQ29udmVydCwgJmluTWVudSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluQ29tbWFuZElEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JRW5hYmxlTWVudUNvbW1hbmQoaW5NZW51LAotCSAgICAgICAgICAgICAgICAgIGluQ29tbWFuZElEKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0TWVudU9ial9Db252ZXJ0LCAmaW5NZW51LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Db21tYW5kSUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBFbmFibGVNZW51Q29tbWFuZChpbk1lbnUsCisgICAgICAgICAgICAgICAgICAgICAgaW5Db21tYW5kSUQpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51X0Rpc2FibGVNZW51Q29tbWFuZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JTWVudUhhbmRsZSBpbk1lbnU7Ci0JTWVudUNvbW1hbmQgaW5Db21tYW5kSUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE1lbnVIYW5kbGUgaW5NZW51OworICAgIE1lbnVDb21tYW5kIGluQ29tbWFuZElEOwogI2lmbmRlZiBEaXNhYmxlTWVudUNvbW1hbmQKLQlQeU1hY19QUkVDSEVDSyhEaXNhYmxlTWVudUNvbW1hbmQpOworICAgIFB5TWFjX1BSRUNIRUNLKERpc2FibGVNZW51Q29tbWFuZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBPcHRNZW51T2JqX0NvbnZlcnQsICZpbk1lbnUsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkNvbW1hbmRJRCkpCi0JCXJldHVybiBOVUxMOwotCURpc2FibGVNZW51Q29tbWFuZChpbk1lbnUsCi0JICAgICAgICAgICAgICAgICAgIGluQ29tbWFuZElEKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0TWVudU9ial9Db252ZXJ0LCAmaW5NZW51LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Db21tYW5kSUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBEaXNhYmxlTWVudUNvbW1hbmQoaW5NZW51LAorICAgICAgICAgICAgICAgICAgICAgICBpbkNvbW1hbmRJRCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVfSXNNZW51Q29tbWFuZEVuYWJsZWQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCU1lbnVIYW5kbGUgaW5NZW51OwotCU1lbnVDb21tYW5kIGluQ29tbWFuZElEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBNZW51SGFuZGxlIGluTWVudTsKKyAgICBNZW51Q29tbWFuZCBpbkNvbW1hbmRJRDsKICNpZm5kZWYgSXNNZW51Q29tbWFuZEVuYWJsZWQKLQlQeU1hY19QUkVDSEVDSyhJc01lbnVDb21tYW5kRW5hYmxlZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSXNNZW51Q29tbWFuZEVuYWJsZWQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgT3B0TWVudU9ial9Db252ZXJ0LCAmaW5NZW51LAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5Db21tYW5kSUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBJc01lbnVDb21tYW5kRW5hYmxlZChpbk1lbnUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Db21tYW5kSUQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdE1lbnVPYmpfQ29udmVydCwgJmluTWVudSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQ29tbWFuZElEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gSXNNZW51Q29tbWFuZEVuYWJsZWQoaW5NZW51LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQ29tbWFuZElEKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51X1NldE1lbnVDb21tYW5kTWFyayhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlNZW51SGFuZGxlIGluTWVudTsKLQlNZW51Q29tbWFuZCBpbkNvbW1hbmRJRDsKLQlVbmlDaGFyIGluTWFyazsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBNZW51SGFuZGxlIGluTWVudTsKKyAgICBNZW51Q29tbWFuZCBpbkNvbW1hbmRJRDsKKyAgICBVbmlDaGFyIGluTWFyazsKICNpZm5kZWYgU2V0TWVudUNvbW1hbmRNYXJrCi0JUHlNYWNfUFJFQ0hFQ0soU2V0TWVudUNvbW1hbmRNYXJrKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRNZW51Q29tbWFuZE1hcmspOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsaCIsCi0JICAgICAgICAgICAgICAgICAgICAgIE9wdE1lbnVPYmpfQ29udmVydCwgJmluTWVudSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluQ29tbWFuZElELAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5NYXJrKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldE1lbnVDb21tYW5kTWFyayhpbk1lbnUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBpbkNvbW1hbmRJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGluTWFyayk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdE1lbnVPYmpfQ29udmVydCwgJmluTWVudSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQ29tbWFuZElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5NYXJrKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldE1lbnVDb21tYW5kTWFyayhpbk1lbnUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkNvbW1hbmRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluTWFyayk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudV9HZXRNZW51Q29tbWFuZE1hcmsoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JTWVudUhhbmRsZSBpbk1lbnU7Ci0JTWVudUNvbW1hbmQgaW5Db21tYW5kSUQ7Ci0JVW5pQ2hhciBvdXRNYXJrOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIE1lbnVIYW5kbGUgaW5NZW51OworICAgIE1lbnVDb21tYW5kIGluQ29tbWFuZElEOworICAgIFVuaUNoYXIgb3V0TWFyazsKICNpZm5kZWYgR2V0TWVudUNvbW1hbmRNYXJrCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TWVudUNvbW1hbmRNYXJrKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNZW51Q29tbWFuZE1hcmspOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgT3B0TWVudU9ial9Db252ZXJ0LCAmaW5NZW51LAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5Db21tYW5kSUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0TWVudUNvbW1hbmRNYXJrKGluTWVudSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGluQ29tbWFuZElELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dE1hcmspOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIG91dE1hcmspOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdE1lbnVPYmpfQ29udmVydCwgJmluTWVudSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQ29tbWFuZElEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldE1lbnVDb21tYW5kTWFyayhpbk1lbnUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkNvbW1hbmRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRNYXJrKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRNYXJrKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51X0dldE1lbnVDb21tYW5kUHJvcGVydHlTaXplKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCU1lbnVIYW5kbGUgaW5NZW51OwotCU1lbnVDb21tYW5kIGluQ29tbWFuZElEOwotCU9TVHlwZSBpblByb3BlcnR5Q3JlYXRvcjsKLQlPU1R5cGUgaW5Qcm9wZXJ0eVRhZzsKLQlCeXRlQ291bnQgb3V0U2l6ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBNZW51SGFuZGxlIGluTWVudTsKKyAgICBNZW51Q29tbWFuZCBpbkNvbW1hbmRJRDsKKyAgICBPU1R5cGUgaW5Qcm9wZXJ0eUNyZWF0b3I7CisgICAgT1NUeXBlIGluUHJvcGVydHlUYWc7CisgICAgQnl0ZUNvdW50IG91dFNpemU7CiAjaWZuZGVmIEdldE1lbnVDb21tYW5kUHJvcGVydHlTaXplCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TWVudUNvbW1hbmRQcm9wZXJ0eVNpemUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1lbnVDb21tYW5kUHJvcGVydHlTaXplKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbE8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBPcHRNZW51T2JqX0NvbnZlcnQsICZpbk1lbnUsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkNvbW1hbmRJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaW5Qcm9wZXJ0eUNyZWF0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmluUHJvcGVydHlUYWcpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0TWVudUNvbW1hbmRQcm9wZXJ0eVNpemUoaW5NZW51LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkNvbW1hbmRJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Qcm9wZXJ0eUNyZWF0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluUHJvcGVydHlUYWcsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRTaXplKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRTaXplKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0TWVudU9ial9Db252ZXJ0LCAmaW5NZW51LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Db21tYW5kSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmluUHJvcGVydHlDcmVhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpblByb3BlcnR5VGFnKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldE1lbnVDb21tYW5kUHJvcGVydHlTaXplKGluTWVudSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Db21tYW5kSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluUHJvcGVydHlDcmVhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblByb3BlcnR5VGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0U2l6ZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0U2l6ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudV9SZW1vdmVNZW51Q29tbWFuZFByb3BlcnR5KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCU1lbnVIYW5kbGUgaW5NZW51OwotCU1lbnVDb21tYW5kIGluQ29tbWFuZElEOwotCU9TVHlwZSBpblByb3BlcnR5Q3JlYXRvcjsKLQlPU1R5cGUgaW5Qcm9wZXJ0eVRhZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBNZW51SGFuZGxlIGluTWVudTsKKyAgICBNZW51Q29tbWFuZCBpbkNvbW1hbmRJRDsKKyAgICBPU1R5cGUgaW5Qcm9wZXJ0eUNyZWF0b3I7CisgICAgT1NUeXBlIGluUHJvcGVydHlUYWc7CiAjaWZuZGVmIFJlbW92ZU1lbnVDb21tYW5kUHJvcGVydHkKLQlQeU1hY19QUkVDSEVDSyhSZW1vdmVNZW51Q29tbWFuZFByb3BlcnR5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhSZW1vdmVNZW51Q29tbWFuZFByb3BlcnR5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbE8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBPcHRNZW51T2JqX0NvbnZlcnQsICZpbk1lbnUsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkNvbW1hbmRJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaW5Qcm9wZXJ0eUNyZWF0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmluUHJvcGVydHlUYWcpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUmVtb3ZlTWVudUNvbW1hbmRQcm9wZXJ0eShpbk1lbnUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Db21tYW5kSUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Qcm9wZXJ0eUNyZWF0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Qcm9wZXJ0eVRhZyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdE1lbnVPYmpfQ29udmVydCwgJmluTWVudSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQ29tbWFuZElELAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpblByb3BlcnR5Q3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaW5Qcm9wZXJ0eVRhZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBSZW1vdmVNZW51Q29tbWFuZFByb3BlcnR5KGluTWVudSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkNvbW1hbmRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblByb3BlcnR5Q3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblByb3BlcnR5VGFnKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KICNlbmRpZiAvKiBfX0xQNjRfXyAqLwogCiBzdGF0aWMgUHlNZXRob2REZWYgTWVudV9tZXRob2RzW10gPSB7CiAjaWZuZGVmIF9fTFA2NF9fCi0JeyJOZXdNZW51IiwgKFB5Q0Z1bmN0aW9uKU1lbnVfTmV3TWVudSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVudUlEIG1lbnVJRCwgU3RyMjU1IG1lbnVUaXRsZSkgLT4gKE1lbnVIYW5kbGUgX3J2KSIpfSwKLQl7Ik1hY0dldE1lbnUiLCAoUHlDRnVuY3Rpb24pTWVudV9NYWNHZXRNZW51LCAxLAotCSBQeURvY19TVFIoIihzaG9ydCByZXNvdXJjZUlEKSAtPiAoTWVudUhhbmRsZSBfcnYpIil9LAotCXsiQ3JlYXRlTmV3TWVudSIsIChQeUNGdW5jdGlvbilNZW51X0NyZWF0ZU5ld01lbnUsIDEsCi0JIFB5RG9jX1NUUigiKE1lbnVJRCBpbk1lbnVJRCwgTWVudUF0dHJpYnV0ZXMgaW5NZW51QXR0cmlidXRlcykgLT4gKE1lbnVIYW5kbGUgb3V0TWVudVJlZikiKX0sCi0JeyJNZW51S2V5IiwgKFB5Q0Z1bmN0aW9uKU1lbnVfTWVudUtleSwgMSwKLQkgUHlEb2NfU1RSKCIoQ2hhclBhcmFtZXRlciBjaCkgLT4gKGxvbmcgX3J2KSIpfSwKLQl7Ik1lbnVTZWxlY3QiLCAoUHlDRnVuY3Rpb24pTWVudV9NZW51U2VsZWN0LCAxLAotCSBQeURvY19TVFIoIihQb2ludCBzdGFydFB0KSAtPiAobG9uZyBfcnYpIil9LAotCXsiTWVudUNob2ljZSIsIChQeUNGdW5jdGlvbilNZW51X01lbnVDaG9pY2UsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKGxvbmcgX3J2KSIpfSwKLQl7Ik1lbnVFdmVudCIsIChQeUNGdW5jdGlvbilNZW51X01lbnVFdmVudCwgMSwKLQkgUHlEb2NfU1RSKCIoRXZlbnRSZWNvcmQgaW5FdmVudCkgLT4gKFVJbnQzMiBfcnYpIil9LAotCXsiR2V0TUJhckhlaWdodCIsIChQeUNGdW5jdGlvbilNZW51X0dldE1CYXJIZWlnaHQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKHNob3J0IF9ydikiKX0sCi0JeyJNYWNEcmF3TWVudUJhciIsIChQeUNGdW5jdGlvbilNZW51X01hY0RyYXdNZW51QmFyLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJJbnZhbE1lbnVCYXIiLCAoUHlDRnVuY3Rpb24pTWVudV9JbnZhbE1lbnVCYXIsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkhpbGl0ZU1lbnUiLCAoUHlDRnVuY3Rpb24pTWVudV9IaWxpdGVNZW51LCAxLAotCSBQeURvY19TVFIoIihNZW51SUQgbWVudUlEKSAtPiBOb25lIil9LAotCXsiR2V0TmV3TUJhciIsIChQeUNGdW5jdGlvbilNZW51X0dldE5ld01CYXIsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IG1lbnVCYXJJRCkgLT4gKE1lbnVCYXJIYW5kbGUgX3J2KSIpfSwKLQl7IkdldE1lbnVCYXIiLCAoUHlDRnVuY3Rpb24pTWVudV9HZXRNZW51QmFyLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChNZW51QmFySGFuZGxlIF9ydikiKX0sCi0JeyJTZXRNZW51QmFyIiwgKFB5Q0Z1bmN0aW9uKU1lbnVfU2V0TWVudUJhciwgMSwKLQkgUHlEb2NfU1RSKCIoTWVudUJhckhhbmRsZSBtYmFyKSAtPiBOb25lIil9LAotCXsiRHVwbGljYXRlTWVudUJhciIsIChQeUNGdW5jdGlvbilNZW51X0R1cGxpY2F0ZU1lbnVCYXIsIDEsCi0JIFB5RG9jX1NUUigiKE1lbnVCYXJIYW5kbGUgaW5NYmFyKSAtPiAoTWVudUJhckhhbmRsZSBvdXRNYmFyKSIpfSwKLQl7IkRpc3Bvc2VNZW51QmFyIiwgKFB5Q0Z1bmN0aW9uKU1lbnVfRGlzcG9zZU1lbnVCYXIsIDEsCi0JIFB5RG9jX1NUUigiKE1lbnVCYXJIYW5kbGUgaW5NYmFyKSAtPiBOb25lIil9LAotCXsiR2V0TWVudUhhbmRsZSIsIChQeUNGdW5jdGlvbilNZW51X0dldE1lbnVIYW5kbGUsIDEsCi0JIFB5RG9jX1NUUigiKE1lbnVJRCBtZW51SUQpIC0+IChNZW51SGFuZGxlIF9ydikiKX0sCi0JeyJNYWNEZWxldGVNZW51IiwgKFB5Q0Z1bmN0aW9uKU1lbnVfTWFjRGVsZXRlTWVudSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVudUlEIG1lbnVJRCkgLT4gTm9uZSIpfSwKLQl7IkNsZWFyTWVudUJhciIsIChQeUNGdW5jdGlvbilNZW51X0NsZWFyTWVudUJhciwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiU2V0TWVudUZsYXNoQ291bnQiLCAoUHlDRnVuY3Rpb24pTWVudV9TZXRNZW51Rmxhc2hDb3VudCwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgY291bnQpIC0+IE5vbmUiKX0sCi0JeyJGbGFzaE1lbnVCYXIiLCAoUHlDRnVuY3Rpb24pTWVudV9GbGFzaE1lbnVCYXIsIDEsCi0JIFB5RG9jX1NUUigiKE1lbnVJRCBtZW51SUQpIC0+IE5vbmUiKX0sCi0JeyJJc01lbnVCYXJWaXNpYmxlIiwgKFB5Q0Z1bmN0aW9uKU1lbnVfSXNNZW51QmFyVmlzaWJsZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiU2hvd01lbnVCYXIiLCAoUHlDRnVuY3Rpb24pTWVudV9TaG93TWVudUJhciwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiSGlkZU1lbnVCYXIiLCAoUHlDRnVuY3Rpb24pTWVudV9IaWRlTWVudUJhciwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiQWNxdWlyZVJvb3RNZW51IiwgKFB5Q0Z1bmN0aW9uKU1lbnVfQWNxdWlyZVJvb3RNZW51LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChNZW51SGFuZGxlIF9ydikiKX0sCi0JeyJEZWxldGVNQ0VudHJpZXMiLCAoUHlDRnVuY3Rpb24pTWVudV9EZWxldGVNQ0VudHJpZXMsIDEsCi0JIFB5RG9jX1NUUigiKE1lbnVJRCBtZW51SUQsIHNob3J0IG1lbnVJdGVtKSAtPiBOb25lIil9LAotCXsiSW5pdENvbnRleHR1YWxNZW51cyIsIChQeUNGdW5jdGlvbilNZW51X0luaXRDb250ZXh0dWFsTWVudXMsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IklzU2hvd0NvbnRleHR1YWxNZW51Q2xpY2siLCAoUHlDRnVuY3Rpb24pTWVudV9Jc1Nob3dDb250ZXh0dWFsTWVudUNsaWNrLCAxLAotCSBQeURvY19TVFIoIihFdmVudFJlY29yZCBpbkV2ZW50KSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiTE1HZXRUaGVNZW51IiwgKFB5Q0Z1bmN0aW9uKU1lbnVfTE1HZXRUaGVNZW51LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChTSW50MTYgX3J2KSIpfSwKLQl7ImFzX01lbnUiLCAoUHlDRnVuY3Rpb24pTWVudV9hc19NZW51LCAxLAotCSBQeURvY19TVFIoIihIYW5kbGUgaCkgLT4gKE1lbnVIYW5kbGUgX3J2KSIpfSwKLQl7IkdldE1lbnUiLCAoUHlDRnVuY3Rpb24pTWVudV9HZXRNZW51LCAxLAotCSBQeURvY19TVFIoIihzaG9ydCByZXNvdXJjZUlEKSAtPiAoTWVudUhhbmRsZSBfcnYpIil9LAotCXsiRGVsZXRlTWVudSIsIChQeUNGdW5jdGlvbilNZW51X0RlbGV0ZU1lbnUsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IG1lbnVJRCkgLT4gTm9uZSIpfSwKLQl7IkRyYXdNZW51QmFyIiwgKFB5Q0Z1bmN0aW9uKU1lbnVfRHJhd01lbnVCYXIsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkNvdW50TWVudUl0ZW1zV2l0aENvbW1hbmRJRCIsIChQeUNGdW5jdGlvbilNZW51X0NvdW50TWVudUl0ZW1zV2l0aENvbW1hbmRJRCwgMSwKLQkgUHlEb2NfU1RSKCIoTWVudUhhbmRsZSBpbk1lbnUsIE1lbnVDb21tYW5kIGluQ29tbWFuZElEKSAtPiAoSXRlbUNvdW50IF9ydikiKX0sCi0JeyJHZXRJbmRNZW51SXRlbVdpdGhDb21tYW5kSUQiLCAoUHlDRnVuY3Rpb24pTWVudV9HZXRJbmRNZW51SXRlbVdpdGhDb21tYW5kSUQsIDEsCi0JIFB5RG9jX1NUUigiKE1lbnVIYW5kbGUgaW5NZW51LCBNZW51Q29tbWFuZCBpbkNvbW1hbmRJRCwgVUludDMyIGluSXRlbUluZGV4KSAtPiAoTWVudUhhbmRsZSBvdXRNZW51LCBNZW51SXRlbUluZGV4IG91dEluZGV4KSIpfSwKLQl7IkVuYWJsZU1lbnVDb21tYW5kIiwgKFB5Q0Z1bmN0aW9uKU1lbnVfRW5hYmxlTWVudUNvbW1hbmQsIDEsCi0JIFB5RG9jX1NUUigiKE1lbnVIYW5kbGUgaW5NZW51LCBNZW51Q29tbWFuZCBpbkNvbW1hbmRJRCkgLT4gTm9uZSIpfSwKLQl7IkRpc2FibGVNZW51Q29tbWFuZCIsIChQeUNGdW5jdGlvbilNZW51X0Rpc2FibGVNZW51Q29tbWFuZCwgMSwKLQkgUHlEb2NfU1RSKCIoTWVudUhhbmRsZSBpbk1lbnUsIE1lbnVDb21tYW5kIGluQ29tbWFuZElEKSAtPiBOb25lIil9LAotCXsiSXNNZW51Q29tbWFuZEVuYWJsZWQiLCAoUHlDRnVuY3Rpb24pTWVudV9Jc01lbnVDb21tYW5kRW5hYmxlZCwgMSwKLQkgUHlEb2NfU1RSKCIoTWVudUhhbmRsZSBpbk1lbnUsIE1lbnVDb21tYW5kIGluQ29tbWFuZElEKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiU2V0TWVudUNvbW1hbmRNYXJrIiwgKFB5Q0Z1bmN0aW9uKU1lbnVfU2V0TWVudUNvbW1hbmRNYXJrLCAxLAotCSBQeURvY19TVFIoIihNZW51SGFuZGxlIGluTWVudSwgTWVudUNvbW1hbmQgaW5Db21tYW5kSUQsIFVuaUNoYXIgaW5NYXJrKSAtPiBOb25lIil9LAotCXsiR2V0TWVudUNvbW1hbmRNYXJrIiwgKFB5Q0Z1bmN0aW9uKU1lbnVfR2V0TWVudUNvbW1hbmRNYXJrLCAxLAotCSBQeURvY19TVFIoIihNZW51SGFuZGxlIGluTWVudSwgTWVudUNvbW1hbmQgaW5Db21tYW5kSUQpIC0+IChVbmlDaGFyIG91dE1hcmspIil9LAotCXsiR2V0TWVudUNvbW1hbmRQcm9wZXJ0eVNpemUiLCAoUHlDRnVuY3Rpb24pTWVudV9HZXRNZW51Q29tbWFuZFByb3BlcnR5U2l6ZSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVudUhhbmRsZSBpbk1lbnUsIE1lbnVDb21tYW5kIGluQ29tbWFuZElELCBPU1R5cGUgaW5Qcm9wZXJ0eUNyZWF0b3IsIE9TVHlwZSBpblByb3BlcnR5VGFnKSAtPiAoQnl0ZUNvdW50IG91dFNpemUpIil9LAotCXsiUmVtb3ZlTWVudUNvbW1hbmRQcm9wZXJ0eSIsIChQeUNGdW5jdGlvbilNZW51X1JlbW92ZU1lbnVDb21tYW5kUHJvcGVydHksIDEsCi0JIFB5RG9jX1NUUigiKE1lbnVIYW5kbGUgaW5NZW51LCBNZW51Q29tbWFuZCBpbkNvbW1hbmRJRCwgT1NUeXBlIGluUHJvcGVydHlDcmVhdG9yLCBPU1R5cGUgaW5Qcm9wZXJ0eVRhZykgLT4gTm9uZSIpfSwKKyAgICB7Ik5ld01lbnUiLCAoUHlDRnVuY3Rpb24pTWVudV9OZXdNZW51LCAxLAorICAgICBQeURvY19TVFIoIihNZW51SUQgbWVudUlELCBTdHIyNTUgbWVudVRpdGxlKSAtPiAoTWVudUhhbmRsZSBfcnYpIil9LAorICAgIHsiTWFjR2V0TWVudSIsIChQeUNGdW5jdGlvbilNZW51X01hY0dldE1lbnUsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IHJlc291cmNlSUQpIC0+IChNZW51SGFuZGxlIF9ydikiKX0sCisgICAgeyJDcmVhdGVOZXdNZW51IiwgKFB5Q0Z1bmN0aW9uKU1lbnVfQ3JlYXRlTmV3TWVudSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUlEIGluTWVudUlELCBNZW51QXR0cmlidXRlcyBpbk1lbnVBdHRyaWJ1dGVzKSAtPiAoTWVudUhhbmRsZSBvdXRNZW51UmVmKSIpfSwKKyAgICB7Ik1lbnVLZXkiLCAoUHlDRnVuY3Rpb24pTWVudV9NZW51S2V5LCAxLAorICAgICBQeURvY19TVFIoIihDaGFyUGFyYW1ldGVyIGNoKSAtPiAobG9uZyBfcnYpIil9LAorICAgIHsiTWVudVNlbGVjdCIsIChQeUNGdW5jdGlvbilNZW51X01lbnVTZWxlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKFBvaW50IHN0YXJ0UHQpIC0+IChsb25nIF9ydikiKX0sCisgICAgeyJNZW51Q2hvaWNlIiwgKFB5Q0Z1bmN0aW9uKU1lbnVfTWVudUNob2ljZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAobG9uZyBfcnYpIil9LAorICAgIHsiTWVudUV2ZW50IiwgKFB5Q0Z1bmN0aW9uKU1lbnVfTWVudUV2ZW50LCAxLAorICAgICBQeURvY19TVFIoIihFdmVudFJlY29yZCBpbkV2ZW50KSAtPiAoVUludDMyIF9ydikiKX0sCisgICAgeyJHZXRNQmFySGVpZ2h0IiwgKFB5Q0Z1bmN0aW9uKU1lbnVfR2V0TUJhckhlaWdodCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgX3J2KSIpfSwKKyAgICB7Ik1hY0RyYXdNZW51QmFyIiwgKFB5Q0Z1bmN0aW9uKU1lbnVfTWFjRHJhd01lbnVCYXIsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkludmFsTWVudUJhciIsIChQeUNGdW5jdGlvbilNZW51X0ludmFsTWVudUJhciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiSGlsaXRlTWVudSIsIChQeUNGdW5jdGlvbilNZW51X0hpbGl0ZU1lbnUsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lbnVJRCBtZW51SUQpIC0+IE5vbmUiKX0sCisgICAgeyJHZXROZXdNQmFyIiwgKFB5Q0Z1bmN0aW9uKU1lbnVfR2V0TmV3TUJhciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgbWVudUJhcklEKSAtPiAoTWVudUJhckhhbmRsZSBfcnYpIil9LAorICAgIHsiR2V0TWVudUJhciIsIChQeUNGdW5jdGlvbilNZW51X0dldE1lbnVCYXIsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKE1lbnVCYXJIYW5kbGUgX3J2KSIpfSwKKyAgICB7IlNldE1lbnVCYXIiLCAoUHlDRnVuY3Rpb24pTWVudV9TZXRNZW51QmFyLCAxLAorICAgICBQeURvY19TVFIoIihNZW51QmFySGFuZGxlIG1iYXIpIC0+IE5vbmUiKX0sCisgICAgeyJEdXBsaWNhdGVNZW51QmFyIiwgKFB5Q0Z1bmN0aW9uKU1lbnVfRHVwbGljYXRlTWVudUJhciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUJhckhhbmRsZSBpbk1iYXIpIC0+IChNZW51QmFySGFuZGxlIG91dE1iYXIpIil9LAorICAgIHsiRGlzcG9zZU1lbnVCYXIiLCAoUHlDRnVuY3Rpb24pTWVudV9EaXNwb3NlTWVudUJhciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUJhckhhbmRsZSBpbk1iYXIpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRNZW51SGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKU1lbnVfR2V0TWVudUhhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUlEIG1lbnVJRCkgLT4gKE1lbnVIYW5kbGUgX3J2KSIpfSwKKyAgICB7Ik1hY0RlbGV0ZU1lbnUiLCAoUHlDRnVuY3Rpb24pTWVudV9NYWNEZWxldGVNZW51LCAxLAorICAgICBQeURvY19TVFIoIihNZW51SUQgbWVudUlEKSAtPiBOb25lIil9LAorICAgIHsiQ2xlYXJNZW51QmFyIiwgKFB5Q0Z1bmN0aW9uKU1lbnVfQ2xlYXJNZW51QmFyLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJTZXRNZW51Rmxhc2hDb3VudCIsIChQeUNGdW5jdGlvbilNZW51X1NldE1lbnVGbGFzaENvdW50LCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBjb3VudCkgLT4gTm9uZSIpfSwKKyAgICB7IkZsYXNoTWVudUJhciIsIChQeUNGdW5jdGlvbilNZW51X0ZsYXNoTWVudUJhciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUlEIG1lbnVJRCkgLT4gTm9uZSIpfSwKKyAgICB7IklzTWVudUJhclZpc2libGUiLCAoUHlDRnVuY3Rpb24pTWVudV9Jc01lbnVCYXJWaXNpYmxlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJTaG93TWVudUJhciIsIChQeUNGdW5jdGlvbilNZW51X1Nob3dNZW51QmFyLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJIaWRlTWVudUJhciIsIChQeUNGdW5jdGlvbilNZW51X0hpZGVNZW51QmFyLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJBY3F1aXJlUm9vdE1lbnUiLCAoUHlDRnVuY3Rpb24pTWVudV9BY3F1aXJlUm9vdE1lbnUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKE1lbnVIYW5kbGUgX3J2KSIpfSwKKyAgICB7IkRlbGV0ZU1DRW50cmllcyIsIChQeUNGdW5jdGlvbilNZW51X0RlbGV0ZU1DRW50cmllcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUlEIG1lbnVJRCwgc2hvcnQgbWVudUl0ZW0pIC0+IE5vbmUiKX0sCisgICAgeyJJbml0Q29udGV4dHVhbE1lbnVzIiwgKFB5Q0Z1bmN0aW9uKU1lbnVfSW5pdENvbnRleHR1YWxNZW51cywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiSXNTaG93Q29udGV4dHVhbE1lbnVDbGljayIsIChQeUNGdW5jdGlvbilNZW51X0lzU2hvd0NvbnRleHR1YWxNZW51Q2xpY2ssIDEsCisgICAgIFB5RG9jX1NUUigiKEV2ZW50UmVjb3JkIGluRXZlbnQpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJMTUdldFRoZU1lbnUiLCAoUHlDRnVuY3Rpb24pTWVudV9MTUdldFRoZU1lbnUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFNJbnQxNiBfcnYpIil9LAorICAgIHsiYXNfTWVudSIsIChQeUNGdW5jdGlvbilNZW51X2FzX01lbnUsIDEsCisgICAgIFB5RG9jX1NUUigiKEhhbmRsZSBoKSAtPiAoTWVudUhhbmRsZSBfcnYpIil9LAorICAgIHsiR2V0TWVudSIsIChQeUNGdW5jdGlvbilNZW51X0dldE1lbnUsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IHJlc291cmNlSUQpIC0+IChNZW51SGFuZGxlIF9ydikiKX0sCisgICAgeyJEZWxldGVNZW51IiwgKFB5Q0Z1bmN0aW9uKU1lbnVfRGVsZXRlTWVudSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgbWVudUlEKSAtPiBOb25lIil9LAorICAgIHsiRHJhd01lbnVCYXIiLCAoUHlDRnVuY3Rpb24pTWVudV9EcmF3TWVudUJhciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiQ291bnRNZW51SXRlbXNXaXRoQ29tbWFuZElEIiwgKFB5Q0Z1bmN0aW9uKU1lbnVfQ291bnRNZW51SXRlbXNXaXRoQ29tbWFuZElELCAxLAorICAgICBQeURvY19TVFIoIihNZW51SGFuZGxlIGluTWVudSwgTWVudUNvbW1hbmQgaW5Db21tYW5kSUQpIC0+IChJdGVtQ291bnQgX3J2KSIpfSwKKyAgICB7IkdldEluZE1lbnVJdGVtV2l0aENvbW1hbmRJRCIsIChQeUNGdW5jdGlvbilNZW51X0dldEluZE1lbnVJdGVtV2l0aENvbW1hbmRJRCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUhhbmRsZSBpbk1lbnUsIE1lbnVDb21tYW5kIGluQ29tbWFuZElELCBVSW50MzIgaW5JdGVtSW5kZXgpIC0+IChNZW51SGFuZGxlIG91dE1lbnUsIE1lbnVJdGVtSW5kZXggb3V0SW5kZXgpIil9LAorICAgIHsiRW5hYmxlTWVudUNvbW1hbmQiLCAoUHlDRnVuY3Rpb24pTWVudV9FbmFibGVNZW51Q29tbWFuZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUhhbmRsZSBpbk1lbnUsIE1lbnVDb21tYW5kIGluQ29tbWFuZElEKSAtPiBOb25lIil9LAorICAgIHsiRGlzYWJsZU1lbnVDb21tYW5kIiwgKFB5Q0Z1bmN0aW9uKU1lbnVfRGlzYWJsZU1lbnVDb21tYW5kLCAxLAorICAgICBQeURvY19TVFIoIihNZW51SGFuZGxlIGluTWVudSwgTWVudUNvbW1hbmQgaW5Db21tYW5kSUQpIC0+IE5vbmUiKX0sCisgICAgeyJJc01lbnVDb21tYW5kRW5hYmxlZCIsIChQeUNGdW5jdGlvbilNZW51X0lzTWVudUNvbW1hbmRFbmFibGVkLCAxLAorICAgICBQeURvY19TVFIoIihNZW51SGFuZGxlIGluTWVudSwgTWVudUNvbW1hbmQgaW5Db21tYW5kSUQpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJTZXRNZW51Q29tbWFuZE1hcmsiLCAoUHlDRnVuY3Rpb24pTWVudV9TZXRNZW51Q29tbWFuZE1hcmssIDEsCisgICAgIFB5RG9jX1NUUigiKE1lbnVIYW5kbGUgaW5NZW51LCBNZW51Q29tbWFuZCBpbkNvbW1hbmRJRCwgVW5pQ2hhciBpbk1hcmspIC0+IE5vbmUiKX0sCisgICAgeyJHZXRNZW51Q29tbWFuZE1hcmsiLCAoUHlDRnVuY3Rpb24pTWVudV9HZXRNZW51Q29tbWFuZE1hcmssIDEsCisgICAgIFB5RG9jX1NUUigiKE1lbnVIYW5kbGUgaW5NZW51LCBNZW51Q29tbWFuZCBpbkNvbW1hbmRJRCkgLT4gKFVuaUNoYXIgb3V0TWFyaykiKX0sCisgICAgeyJHZXRNZW51Q29tbWFuZFByb3BlcnR5U2l6ZSIsIChQeUNGdW5jdGlvbilNZW51X0dldE1lbnVDb21tYW5kUHJvcGVydHlTaXplLCAxLAorICAgICBQeURvY19TVFIoIihNZW51SGFuZGxlIGluTWVudSwgTWVudUNvbW1hbmQgaW5Db21tYW5kSUQsIE9TVHlwZSBpblByb3BlcnR5Q3JlYXRvciwgT1NUeXBlIGluUHJvcGVydHlUYWcpIC0+IChCeXRlQ291bnQgb3V0U2l6ZSkiKX0sCisgICAgeyJSZW1vdmVNZW51Q29tbWFuZFByb3BlcnR5IiwgKFB5Q0Z1bmN0aW9uKU1lbnVfUmVtb3ZlTWVudUNvbW1hbmRQcm9wZXJ0eSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUhhbmRsZSBpbk1lbnUsIE1lbnVDb21tYW5kIGluQ29tbWFuZElELCBPU1R5cGUgaW5Qcm9wZXJ0eUNyZWF0b3IsIE9TVHlwZSBpblByb3BlcnR5VGFnKSAtPiBOb25lIil9LAogI2VuZGlmIC8qIF9fTFA2NF9fICovCi0Je05VTEwsIE5VTEwsIDB9CisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAKQEAgLTM0NDUsMzEgKzM0NDUsMzEgQEAKIAogdm9pZCBpbml0X01lbnUodm9pZCkKIHsKLQlQeU9iamVjdCAqbTsKKyAgICBQeU9iamVjdCAqbTsKICNpZm5kZWYgX19MUDY0X18KLQlQeU9iamVjdCAqZDsKKyAgICBQeU9iamVjdCAqZDsKIAogCiAKLQkgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKE1lbnVIYW5kbGUsIE1lbnVPYmpfTmV3KTsKLQkgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChNZW51SGFuZGxlLCBNZW51T2JqX0NvbnZlcnQpOworICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhNZW51SGFuZGxlLCBNZW51T2JqX05ldyk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChNZW51SGFuZGxlLCBNZW51T2JqX0NvbnZlcnQpOwogI2VuZGlmIC8qIF9fTFA2NF9fICovCiAKIAotCW0gPSBQeV9Jbml0TW9kdWxlKCJfTWVudSIsIE1lbnVfbWV0aG9kcyk7CisgICAgbSA9IFB5X0luaXRNb2R1bGUoIl9NZW51IiwgTWVudV9tZXRob2RzKTsKICNpZm5kZWYgX19MUDY0X18KLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQlNZW51X0Vycm9yID0gUHlNYWNfR2V0T1NFcnJFeGNlcHRpb24oKTsKLQlpZiAoTWVudV9FcnJvciA9PSBOVUxMIHx8Ci0JICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFcnJvciIsIE1lbnVfRXJyb3IpICE9IDApCi0JCXJldHVybjsKLQlNZW51X1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKLQlpZiAoUHlUeXBlX1JlYWR5KCZNZW51X1R5cGUpIDwgMCkgcmV0dXJuOwotCVB5X0lOQ1JFRigmTWVudV9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIk1lbnUiLCAoUHlPYmplY3QgKikmTWVudV9UeXBlKTsKLQkvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KLQlQeV9JTkNSRUYoJk1lbnVfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJNZW51VHlwZSIsIChQeU9iamVjdCAqKSZNZW51X1R5cGUpOworICAgIGQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOworICAgIE1lbnVfRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOworICAgIGlmIChNZW51X0Vycm9yID09IE5VTEwgfHwKKyAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVycm9yIiwgTWVudV9FcnJvcikgIT0gMCkKKyAgICAgICAgcmV0dXJuOworICAgIE1lbnVfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJk1lbnVfVHlwZSkgPCAwKSByZXR1cm47CisgICAgUHlfSU5DUkVGKCZNZW51X1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiTWVudSIsIChQeU9iamVjdCAqKSZNZW51X1R5cGUpOworICAgIC8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLworICAgIFB5X0lOQ1JFRigmTWVudV9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIk1lbnVUeXBlIiwgKFB5T2JqZWN0ICopJk1lbnVfVHlwZSk7CiAjZW5kaWYgLyogX19MUDY0X18gKi8KIH0KIApkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvbWx0ZS9fTWx0ZW1vZHVsZS5jIGIvTWFjL01vZHVsZXMvbWx0ZS9fTWx0ZW1vZHVsZS5jCmluZGV4IDFhNmI2YTQuLmNkNjk4ZjQgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL21sdGUvX01sdGVtb2R1bGUuYworKysgYi9NYWMvTW9kdWxlcy9tbHRlL19NbHRlbW9kdWxlLmMKQEAgLTEwLDkgKzEwLDkgQEAKIAogLyogTWFjcm8gdG8gdGVzdCB3aGV0aGVyIGEgd2Vhay1sb2FkZWQgQ0ZNIGZ1bmN0aW9uIGV4aXN0cyAqLwogI2RlZmluZSBQeU1hY19QUkVDSEVDSyhydG4pIGRvIHsgaWYgKCAmcnRuID09IE5VTEwgKSAge1wKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsIFwKLSAgICAgICAgIk5vdCBhdmFpbGFibGUgaW4gdGhpcyBzaGFyZWQgbGlicmFyeS9PUyB2ZXJzaW9uIik7IFwKLSAgICAgICAgcmV0dXJuIE5VTEw7IFwKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgXAorICAgICJOb3QgYXZhaWxhYmxlIGluIHRoaXMgc2hhcmVkIGxpYnJhcnkvT1MgdmVyc2lvbiIpOyBcCisgICAgcmV0dXJuIE5VTEw7IFwKICAgICB9fSB3aGlsZSgwKQogCiAKQEAgLTM5LDE0ICszOSwxNCBAQAogc3RhdGljIGludAogT3B0RlNTcGVjUHRyX0NvbnZlcnQoUHlPYmplY3QgKnYsIEZTU3BlYyAqKnBfaXRzZWxmKQogewotICAgICAgICBzdGF0aWMgRlNTcGVjIGZzczsKLSAgICAgICAgaWYgKHYgPT0gUHlfTm9uZSkKLSAgICAgICAgewotICAgICAgICAgICAgICAgICpwX2l0c2VsZiA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIH0KLSAgICAgICAgKnBfaXRzZWxmID0gJmZzczsKLSAgICAgICAgcmV0dXJuIFB5TWFjX0dldEZTU3BlYyh2LCAqcF9pdHNlbGYpOworICAgIHN0YXRpYyBGU1NwZWMgZnNzOworICAgIGlmICh2ID09IFB5X05vbmUpCisgICAgeworICAgICAgICAqcF9pdHNlbGYgPSBOVUxMOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgKnBfaXRzZWxmID0gJmZzczsKKyAgICByZXR1cm4gUHlNYWNfR2V0RlNTcGVjKHYsICpwX2l0c2VsZik7CiB9CiAKIC8qCkBAIC01NSwxMiArNTUsMTIgQEAKIHN0YXRpYyBpbnQKIE9wdEdXb3JsZE9ial9Db252ZXJ0KFB5T2JqZWN0ICp2LCBHV29ybGRQdHIgKnBfaXRzZWxmKQogewotICAgICAgICBpZiAodiA9PSBQeV9Ob25lKQotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKnBfaXRzZWxmID0gTlVMTDsKLSAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gR1dvcmxkT2JqX0NvbnZlcnQodiwgcF9pdHNlbGYpOworICAgIGlmICh2ID09IFB5X05vbmUpCisgICAgeworICAgICAgICAqcF9pdHNlbGYgPSBOVUxMOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgcmV0dXJuIEdXb3JsZE9ial9Db252ZXJ0KHYsIHBfaXRzZWxmKTsKIH0KIAogCkBAIC03MywxMTU5ICs3MywxMTU5IEBACiAjZGVmaW5lIFRYTk9ial9DaGVjayh4KSAoKHgpLT5vYl90eXBlID09ICZUWE5PYmplY3RfVHlwZSB8fCBQeU9iamVjdF9UeXBlQ2hlY2soKHgpLCAmVFhOT2JqZWN0X1R5cGUpKQogCiB0eXBlZGVmIHN0cnVjdCBUWE5PYmplY3RPYmplY3QgewotCVB5T2JqZWN0X0hFQUQKLQlUWE5PYmplY3Qgb2JfaXRzZWxmOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBUWE5PYmplY3Qgb2JfaXRzZWxmOwogfSBUWE5PYmplY3RPYmplY3Q7CiAKIFB5T2JqZWN0ICpUWE5PYmpfTmV3KFRYTk9iamVjdCBpdHNlbGYpCiB7Ci0JVFhOT2JqZWN0T2JqZWN0ICppdDsKLQlpZiAoaXRzZWxmID09IE5VTEwpIHJldHVybiBQeU1hY19FcnJvcihyZXNOb3RGb3VuZCk7Ci0JaXQgPSBQeU9iamVjdF9ORVcoVFhOT2JqZWN0T2JqZWN0LCAmVFhOT2JqZWN0X1R5cGUpOwotCWlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQlpdC0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiAoUHlPYmplY3QgKilpdDsKKyAgICBUWE5PYmplY3RPYmplY3QgKml0OworICAgIGlmIChpdHNlbGYgPT0gTlVMTCkgcmV0dXJuIFB5TWFjX0Vycm9yKHJlc05vdEZvdW5kKTsKKyAgICBpdCA9IFB5T2JqZWN0X05FVyhUWE5PYmplY3RPYmplY3QsICZUWE5PYmplY3RfVHlwZSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIGl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogCiBpbnQgVFhOT2JqX0NvbnZlcnQoUHlPYmplY3QgKnYsIFRYTk9iamVjdCAqcF9pdHNlbGYpCiB7Ci0JaWYgKCFUWE5PYmpfQ2hlY2sodikpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiVFhOT2JqZWN0IHJlcXVpcmVkIik7Ci0JCXJldHVybiAwOwotCX0KLQkqcF9pdHNlbGYgPSAoKFRYTk9iamVjdE9iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0JcmV0dXJuIDE7CisgICAgaWYgKCFUWE5PYmpfQ2hlY2sodikpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiVFhOT2JqZWN0IHJlcXVpcmVkIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAqcF9pdHNlbGYgPSAoKFRYTk9iamVjdE9iamVjdCAqKXYpLT5vYl9pdHNlbGY7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyB2b2lkIFRYTk9ial9kZWFsbG9jKFRYTk9iamVjdE9iamVjdCAqc2VsZikKIHsKLQkvKiBDbGVhbnVwIG9mIHNlbGYtPm9iX2l0c2VsZiBnb2VzIGhlcmUgKi8KLQlzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOworICAgIC8qIENsZWFudXAgb2Ygc2VsZi0+b2JfaXRzZWxmIGdvZXMgaGVyZSAqLworICAgIHNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTkRlbGV0ZU9iamVjdChUWE5PYmplY3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgVFhORGVsZXRlT2JqZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soVFhORGVsZXRlT2JqZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhUWE5EZWxldGVPYmplY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCVRYTkRlbGV0ZU9iamVjdChfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFRYTkRlbGV0ZU9iamVjdChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTlJlc2l6ZUZyYW1lKFRYTk9iamVjdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVUludDMyIGlXaWR0aDsKLQlVSW50MzIgaUhlaWdodDsKLQlUWE5GcmFtZUlEIGlUWE5GcmFtZUlEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBVSW50MzIgaVdpZHRoOworICAgIFVJbnQzMiBpSGVpZ2h0OworICAgIFRYTkZyYW1lSUQgaVRYTkZyYW1lSUQ7CiAjaWZuZGVmIFRYTlJlc2l6ZUZyYW1lCi0JUHlNYWNfUFJFQ0hFQ0soVFhOUmVzaXplRnJhbWUpOworICAgIFB5TWFjX1BSRUNIRUNLKFRYTlJlc2l6ZUZyYW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpV2lkdGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZpSGVpZ2h0LAotCSAgICAgICAgICAgICAgICAgICAgICAmaVRYTkZyYW1lSUQpKQotCQlyZXR1cm4gTlVMTDsKLQlUWE5SZXNpemVGcmFtZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgIGlXaWR0aCwKLQkgICAgICAgICAgICAgICBpSGVpZ2h0LAotCSAgICAgICAgICAgICAgIGlUWE5GcmFtZUlEKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpVFhORnJhbWVJRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFRYTlJlc2l6ZUZyYW1lKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgaVdpZHRoLAorICAgICAgICAgICAgICAgICAgIGlIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgaVRYTkZyYW1lSUQpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUWE5PYmpfVFhOU2V0RnJhbWVCb3VuZHMoVFhOT2JqZWN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTSW50MzIgaVRvcDsKLQlTSW50MzIgaUxlZnQ7Ci0JU0ludDMyIGlCb3R0b207Ci0JU0ludDMyIGlSaWdodDsKLQlUWE5GcmFtZUlEIGlUWE5GcmFtZUlEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTSW50MzIgaVRvcDsKKyAgICBTSW50MzIgaUxlZnQ7CisgICAgU0ludDMyIGlCb3R0b207CisgICAgU0ludDMyIGlSaWdodDsKKyAgICBUWE5GcmFtZUlEIGlUWE5GcmFtZUlEOwogI2lmbmRlZiBUWE5TZXRGcmFtZUJvdW5kcwotCVB5TWFjX1BSRUNIRUNLKFRYTlNldEZyYW1lQm91bmRzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUWE5TZXRGcmFtZUJvdW5kcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbGxsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpVG9wLAotCSAgICAgICAgICAgICAgICAgICAgICAmaUxlZnQsCi0JICAgICAgICAgICAgICAgICAgICAgICZpQm90dG9tLAotCSAgICAgICAgICAgICAgICAgICAgICAmaVJpZ2h0LAotCSAgICAgICAgICAgICAgICAgICAgICAmaVRYTkZyYW1lSUQpKQotCQlyZXR1cm4gTlVMTDsKLQlUWE5TZXRGcmFtZUJvdW5kcyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgIGlUb3AsCi0JICAgICAgICAgICAgICAgICAgaUxlZnQsCi0JICAgICAgICAgICAgICAgICAgaUJvdHRvbSwKLQkgICAgICAgICAgICAgICAgICBpUmlnaHQsCi0JICAgICAgICAgICAgICAgICAgaVRYTkZyYW1lSUQpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbGxsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpVG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaUxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpQm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaVJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaVRYTkZyYW1lSUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBUWE5TZXRGcmFtZUJvdW5kcyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgIGlUb3AsCisgICAgICAgICAgICAgICAgICAgICAgaUxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgaUJvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgICBpUmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgaVRYTkZyYW1lSUQpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUWE5PYmpfVFhOS2V5RG93bihUWE5PYmplY3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUV2ZW50UmVjb3JkIGlFdmVudDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgRXZlbnRSZWNvcmQgaUV2ZW50OwogI2lmbmRlZiBUWE5LZXlEb3duCi0JUHlNYWNfUFJFQ0hFQ0soVFhOS2V5RG93bik7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhOS2V5RG93bik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEV2ZW50UmVjb3JkLCAmaUV2ZW50KSkKLQkJcmV0dXJuIE5VTEw7Ci0JVFhOS2V5RG93bihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgJmlFdmVudCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RXZlbnRSZWNvcmQsICZpRXZlbnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBUWE5LZXlEb3duKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAmaUV2ZW50KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTkFkanVzdEN1cnNvcihUWE5PYmplY3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJnbkhhbmRsZSBpb0N1cnNvclJnbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIGlvQ3Vyc29yUmduOwogI2lmbmRlZiBUWE5BZGp1c3RDdXJzb3IKLQlQeU1hY19QUkVDSEVDSyhUWE5BZGp1c3RDdXJzb3IpOworICAgIFB5TWFjX1BSRUNIRUNLKFRYTkFkanVzdEN1cnNvcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIE9wdFJlc09ial9Db252ZXJ0LCAmaW9DdXJzb3JSZ24pKQotCQlyZXR1cm4gTlVMTDsKLQlUWE5BZGp1c3RDdXJzb3IoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgaW9DdXJzb3JSZ24pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdFJlc09ial9Db252ZXJ0LCAmaW9DdXJzb3JSZ24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBUWE5BZGp1c3RDdXJzb3IoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgaW9DdXJzb3JSZ24pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUWE5PYmpfVFhOQ2xpY2soVFhOT2JqZWN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlFdmVudFJlY29yZCBpRXZlbnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEV2ZW50UmVjb3JkIGlFdmVudDsKICNpZm5kZWYgVFhOQ2xpY2sKLQlQeU1hY19QUkVDSEVDSyhUWE5DbGljayk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhOQ2xpY2spOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRFdmVudFJlY29yZCwgJmlFdmVudCkpCi0JCXJldHVybiBOVUxMOwotCVRYTkNsaWNrKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgJmlFdmVudCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RXZlbnRSZWNvcmQsICZpRXZlbnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBUWE5DbGljayhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICZpRXZlbnQpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUWE5PYmpfVFhOU2VsZWN0QWxsKFRYTk9iamVjdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBUWE5TZWxlY3RBbGwKLQlQeU1hY19QUkVDSEVDSyhUWE5TZWxlY3RBbGwpOworICAgIFB5TWFjX1BSRUNIRUNLKFRYTlNlbGVjdEFsbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JVFhOU2VsZWN0QWxsKF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVFhOU2VsZWN0QWxsKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUWE5PYmpfVFhORm9jdXMoVFhOT2JqZWN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIGlCZWNvbWluZ0ZvY3VzZWQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gaUJlY29taW5nRm9jdXNlZDsKICNpZm5kZWYgVFhORm9jdXMKLQlQeU1hY19QUkVDSEVDSyhUWE5Gb2N1cyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhORm9jdXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpQmVjb21pbmdGb2N1c2VkKSkKLQkJcmV0dXJuIE5VTEw7Ci0JVFhORm9jdXMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICBpQmVjb21pbmdGb2N1c2VkKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpQmVjb21pbmdGb2N1c2VkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVFhORm9jdXMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICBpQmVjb21pbmdGb2N1c2VkKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTlVwZGF0ZShUWE5PYmplY3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgVFhOVXBkYXRlCi0JUHlNYWNfUFJFQ0hFQ0soVFhOVXBkYXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUWE5VcGRhdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCVRYTlVwZGF0ZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFRYTlVwZGF0ZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTkRyYXcoVFhOT2JqZWN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlHV29ybGRQdHIgaURyYXdQb3J0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBHV29ybGRQdHIgaURyYXdQb3J0OwogI2lmbmRlZiBUWE5EcmF3Ci0JUHlNYWNfUFJFQ0hFQ0soVFhORHJhdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhORHJhdyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIE9wdEdXb3JsZE9ial9Db252ZXJ0LCAmaURyYXdQb3J0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JVFhORHJhdyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgaURyYXdQb3J0KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRHV29ybGRPYmpfQ29udmVydCwgJmlEcmF3UG9ydCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFRYTkRyYXcoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgaURyYXdQb3J0KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTkZvcmNlVXBkYXRlKFRYTk9iamVjdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBUWE5Gb3JjZVVwZGF0ZQotCVB5TWFjX1BSRUNIRUNLKFRYTkZvcmNlVXBkYXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUWE5Gb3JjZVVwZGF0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JVFhORm9yY2VVcGRhdGUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBUWE5Gb3JjZVVwZGF0ZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTkdldFNsZWVwVGlja3MoVFhOT2JqZWN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlVSW50MzIgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBVSW50MzIgX3J2OwogI2lmbmRlZiBUWE5HZXRTbGVlcFRpY2tzCi0JUHlNYWNfUFJFQ0hFQ0soVFhOR2V0U2xlZXBUaWNrcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhOR2V0U2xlZXBUaWNrcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVFhOR2V0U2xlZXBUaWNrcyhfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVFhOR2V0U2xlZXBUaWNrcyhfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUWE5PYmpfVFhOSWRsZShUWE5PYmplY3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgVFhOSWRsZQotCVB5TWFjX1BSRUNIRUNLKFRYTklkbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFRYTklkbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCVRYTklkbGUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBUWE5JZGxlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUWE5PYmpfVFhOR3Jvd1dpbmRvdyhUWE5PYmplY3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUV2ZW50UmVjb3JkIGlFdmVudDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgRXZlbnRSZWNvcmQgaUV2ZW50OwogI2lmbmRlZiBUWE5Hcm93V2luZG93Ci0JUHlNYWNfUFJFQ0hFQ0soVFhOR3Jvd1dpbmRvdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhOR3Jvd1dpbmRvdyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEV2ZW50UmVjb3JkLCAmaUV2ZW50KSkKLQkJcmV0dXJuIE5VTEw7Ci0JVFhOR3Jvd1dpbmRvdyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgJmlFdmVudCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RXZlbnRSZWNvcmQsICZpRXZlbnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBUWE5Hcm93V2luZG93KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAmaUV2ZW50KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTlpvb21XaW5kb3coVFhOT2JqZWN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTSW50MTYgaVBhcnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFNJbnQxNiBpUGFydDsKICNpZm5kZWYgVFhOWm9vbVdpbmRvdwotCVB5TWFjX1BSRUNIRUNLKFRYTlpvb21XaW5kb3cpOworICAgIFB5TWFjX1BSRUNIRUNLKFRYTlpvb21XaW5kb3cpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpUGFydCkpCi0JCXJldHVybiBOVUxMOwotCVRYTlpvb21XaW5kb3coX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgIGlQYXJ0KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpUGFydCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFRYTlpvb21XaW5kb3coX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgIGlQYXJ0KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTkNhblVuZG8oVFhOT2JqZWN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlUWE5BY3Rpb25LZXkgb1RYTkFjdGlvbktleTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgVFhOQWN0aW9uS2V5IG9UWE5BY3Rpb25LZXk7CiAjaWZuZGVmIFRYTkNhblVuZG8KLQlQeU1hY19QUkVDSEVDSyhUWE5DYW5VbmRvKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUWE5DYW5VbmRvKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBUWE5DYW5VbmRvKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAmb1RYTkFjdGlvbktleSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgb1RYTkFjdGlvbktleSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFRYTkNhblVuZG8oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICZvVFhOQWN0aW9uS2V5KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvVFhOQWN0aW9uS2V5KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUWE5PYmpfVFhOVW5kbyhUWE5PYmplY3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgVFhOVW5kbwotCVB5TWFjX1BSRUNIRUNLKFRYTlVuZG8pOworICAgIFB5TWFjX1BSRUNIRUNLKFRYTlVuZG8pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCVRYTlVuZG8oX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBUWE5VbmRvKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUWE5PYmpfVFhOQ2FuUmVkbyhUWE5PYmplY3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCVRYTkFjdGlvbktleSBvVFhOQWN0aW9uS2V5OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBUWE5BY3Rpb25LZXkgb1RYTkFjdGlvbktleTsKICNpZm5kZWYgVFhOQ2FuUmVkbwotCVB5TWFjX1BSRUNIRUNLKFRYTkNhblJlZG8pOworICAgIFB5TWFjX1BSRUNIRUNLKFRYTkNhblJlZG8pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFRYTkNhblJlZG8oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICZvVFhOQWN0aW9uS2V5KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYmwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBvVFhOQWN0aW9uS2V5KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVFhOQ2FuUmVkbyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgJm9UWE5BY3Rpb25LZXkpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIG9UWE5BY3Rpb25LZXkpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRYTk9ial9UWE5SZWRvKFRYTk9iamVjdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBUWE5SZWRvCi0JUHlNYWNfUFJFQ0hFQ0soVFhOUmVkbyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhOUmVkbyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JVFhOUmVkbyhfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFRYTlJlZG8oX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRYTk9ial9UWE5DdXQoVFhOT2JqZWN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOwogI2lmbmRlZiBUWE5DdXQKLQlQeU1hY19QUkVDSEVDSyhUWE5DdXQpOworICAgIFB5TWFjX1BSRUNIRUNLKFRYTkN1dCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFRYTkN1dChfc2VsZi0+b2JfaXRzZWxmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFRYTkN1dChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUWE5PYmpfVFhOQ29weShUWE5PYmplY3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CiAjaWZuZGVmIFRYTkNvcHkKLQlQeU1hY19QUkVDSEVDSyhUWE5Db3B5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhUWE5Db3B5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gVFhOQ29weShfc2VsZi0+b2JfaXRzZWxmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFRYTkNvcHkoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTlBhc3RlKFRYTk9iamVjdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKICNpZm5kZWYgVFhOUGFzdGUKLQlQeU1hY19QUkVDSEVDSyhUWE5QYXN0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhOUGFzdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBUWE5QYXN0ZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFRYTlBhc3RlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRYTk9ial9UWE5DbGVhcihUWE5PYmplY3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CiAjaWZuZGVmIFRYTkNsZWFyCi0JUHlNYWNfUFJFQ0hFQ0soVFhOQ2xlYXIpOworICAgIFB5TWFjX1BSRUNIRUNLKFRYTkNsZWFyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gVFhOQ2xlYXIoX3NlbGYtPm9iX2l0c2VsZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBUWE5DbGVhcihfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUWE5PYmpfVFhOR2V0U2VsZWN0aW9uKFRYTk9iamVjdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVFhOT2Zmc2V0IG9TdGFydE9mZnNldDsKLQlUWE5PZmZzZXQgb0VuZE9mZnNldDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVFhOT2Zmc2V0IG9TdGFydE9mZnNldDsKKyAgICBUWE5PZmZzZXQgb0VuZE9mZnNldDsKICNpZm5kZWYgVFhOR2V0U2VsZWN0aW9uCi0JUHlNYWNfUFJFQ0hFQ0soVFhOR2V0U2VsZWN0aW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUWE5HZXRTZWxlY3Rpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCVRYTkdldFNlbGVjdGlvbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAmb1N0YXJ0T2Zmc2V0LAotCSAgICAgICAgICAgICAgICAmb0VuZE9mZnNldCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBvU3RhcnRPZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgb0VuZE9mZnNldCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFRYTkdldFNlbGVjdGlvbihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAmb1N0YXJ0T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAmb0VuZE9mZnNldCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvU3RhcnRPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgb0VuZE9mZnNldCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTlNob3dTZWxlY3Rpb24oVFhOT2JqZWN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIGlTaG93RW5kOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIGlTaG93RW5kOwogI2lmbmRlZiBUWE5TaG93U2VsZWN0aW9uCi0JUHlNYWNfUFJFQ0hFQ0soVFhOU2hvd1NlbGVjdGlvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhOU2hvd1NlbGVjdGlvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlTaG93RW5kKSkKLQkJcmV0dXJuIE5VTEw7Ci0JVFhOU2hvd1NlbGVjdGlvbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgaVNob3dFbmQpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlTaG93RW5kKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVFhOU2hvd1NlbGVjdGlvbihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgaVNob3dFbmQpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUWE5PYmpfVFhOSXNTZWxlY3Rpb25FbXB0eShUWE5PYmplY3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKICNpZm5kZWYgVFhOSXNTZWxlY3Rpb25FbXB0eQotCVB5TWFjX1BSRUNIRUNLKFRYTklzU2VsZWN0aW9uRW1wdHkpOworICAgIFB5TWFjX1BSRUNIRUNLKFRYTklzU2VsZWN0aW9uRW1wdHkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFRYTklzU2VsZWN0aW9uRW1wdHkoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFRYTklzU2VsZWN0aW9uRW1wdHkoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTlNldFNlbGVjdGlvbihUWE5PYmplY3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVFhOT2Zmc2V0IGlTdGFydE9mZnNldDsKLQlUWE5PZmZzZXQgaUVuZE9mZnNldDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBUWE5PZmZzZXQgaVN0YXJ0T2Zmc2V0OworICAgIFRYTk9mZnNldCBpRW5kT2Zmc2V0OwogI2lmbmRlZiBUWE5TZXRTZWxlY3Rpb24KLQlQeU1hY19QUkVDSEVDSyhUWE5TZXRTZWxlY3Rpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKFRYTlNldFNlbGVjdGlvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpU3RhcnRPZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICZpRW5kT2Zmc2V0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFRYTlNldFNlbGVjdGlvbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgaVN0YXJ0T2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgaUVuZE9mZnNldCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaVN0YXJ0T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaUVuZE9mZnNldCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBUWE5TZXRTZWxlY3Rpb24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlTdGFydE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlFbmRPZmZzZXQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRYTk9ial9UWE5Db3VudFJ1bnNJblJhbmdlKFRYTk9iamVjdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlUWE5PZmZzZXQgaVN0YXJ0T2Zmc2V0OwotCVRYTk9mZnNldCBpRW5kT2Zmc2V0OwotCUl0ZW1Db3VudCBvUnVuQ291bnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVFhOT2Zmc2V0IGlTdGFydE9mZnNldDsKKyAgICBUWE5PZmZzZXQgaUVuZE9mZnNldDsKKyAgICBJdGVtQ291bnQgb1J1bkNvdW50OwogI2lmbmRlZiBUWE5Db3VudFJ1bnNJblJhbmdlCi0JUHlNYWNfUFJFQ0hFQ0soVFhOQ291bnRSdW5zSW5SYW5nZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhOQ291bnRSdW5zSW5SYW5nZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpU3RhcnRPZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICZpRW5kT2Zmc2V0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFRYTkNvdW50UnVuc0luUmFuZ2UoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBpU3RhcnRPZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgaUVuZE9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmb1J1bkNvdW50KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBvUnVuQ291bnQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlTdGFydE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlFbmRPZmZzZXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVFhOQ291bnRSdW5zSW5SYW5nZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlTdGFydE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpRW5kT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvUnVuQ291bnQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG9SdW5Db3VudCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTkRhdGFTaXplKFRYTk9iamVjdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQnl0ZUNvdW50IF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQnl0ZUNvdW50IF9ydjsKICNpZm5kZWYgVFhORGF0YVNpemUKLQlQeU1hY19QUkVDSEVDSyhUWE5EYXRhU2l6ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhORGF0YVNpemUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFRYTkRhdGFTaXplKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBUWE5EYXRhU2l6ZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUWE5PYmpfVFhOR2V0RGF0YShUWE5PYmplY3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVFhOT2Zmc2V0IGlTdGFydE9mZnNldDsKLQlUWE5PZmZzZXQgaUVuZE9mZnNldDsKLQlIYW5kbGUgb0RhdGFIYW5kbGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVFhOT2Zmc2V0IGlTdGFydE9mZnNldDsKKyAgICBUWE5PZmZzZXQgaUVuZE9mZnNldDsKKyAgICBIYW5kbGUgb0RhdGFIYW5kbGU7CiAjaWZuZGVmIFRYTkdldERhdGEKLQlQeU1hY19QUkVDSEVDSyhUWE5HZXREYXRhKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUWE5HZXREYXRhKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlTdGFydE9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlFbmRPZmZzZXQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gVFhOR2V0RGF0YShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgIGlTdGFydE9mZnNldCwKLQkgICAgICAgICAgICAgICAgICBpRW5kT2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICZvRGF0YUhhbmRsZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIG9EYXRhSGFuZGxlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpU3RhcnRPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpRW5kT2Zmc2V0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFRYTkdldERhdGEoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICBpU3RhcnRPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgaUVuZE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAmb0RhdGFIYW5kbGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBvRGF0YUhhbmRsZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTkdldERhdGFFbmNvZGVkKFRYTk9iamVjdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlUWE5PZmZzZXQgaVN0YXJ0T2Zmc2V0OwotCVRYTk9mZnNldCBpRW5kT2Zmc2V0OwotCUhhbmRsZSBvRGF0YUhhbmRsZTsKLQlUWE5EYXRhVHlwZSBpRW5jb2Rpbmc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVFhOT2Zmc2V0IGlTdGFydE9mZnNldDsKKyAgICBUWE5PZmZzZXQgaUVuZE9mZnNldDsKKyAgICBIYW5kbGUgb0RhdGFIYW5kbGU7CisgICAgVFhORGF0YVR5cGUgaUVuY29kaW5nOwogI2lmbmRlZiBUWE5HZXREYXRhRW5jb2RlZAotCVB5TWFjX1BSRUNIRUNLKFRYTkdldERhdGFFbmNvZGVkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUWE5HZXREYXRhRW5jb2RlZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlTdGFydE9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlFbmRPZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmlFbmNvZGluZykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBUWE5HZXREYXRhRW5jb2RlZChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBpU3RhcnRPZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGlFbmRPZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZvRGF0YUhhbmRsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgaUVuY29kaW5nKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgb0RhdGFIYW5kbGUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaVN0YXJ0T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaUVuZE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaUVuY29kaW5nKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFRYTkdldERhdGFFbmNvZGVkKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlTdGFydE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaUVuZE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9EYXRhSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpRW5jb2RpbmcpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBvRGF0YUhhbmRsZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTlNldERhdGFGcm9tRmlsZShUWE5PYmplY3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JU0ludDE2IGlGaWxlUmVmTnVtOwotCU9TVHlwZSBpRmlsZVR5cGU7Ci0JQnl0ZUNvdW50IGlGaWxlTGVuZ3RoOwotCVRYTk9mZnNldCBpU3RhcnRPZmZzZXQ7Ci0JVFhOT2Zmc2V0IGlFbmRPZmZzZXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgU0ludDE2IGlGaWxlUmVmTnVtOworICAgIE9TVHlwZSBpRmlsZVR5cGU7CisgICAgQnl0ZUNvdW50IGlGaWxlTGVuZ3RoOworICAgIFRYTk9mZnNldCBpU3RhcnRPZmZzZXQ7CisgICAgVFhOT2Zmc2V0IGlFbmRPZmZzZXQ7CiAjaWZuZGVmIFRYTlNldERhdGFGcm9tRmlsZQotCVB5TWFjX1BSRUNIRUNLKFRYTlNldERhdGFGcm9tRmlsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhOU2V0RGF0YUZyb21GaWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJmxsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpRmlsZVJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaUZpbGVUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAmaUZpbGVMZW5ndGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZpU3RhcnRPZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICZpRW5kT2Zmc2V0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFRYTlNldERhdGFGcm9tRmlsZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgaUZpbGVSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBpRmlsZVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBpRmlsZUxlbmd0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGlTdGFydE9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGlFbmRPZmZzZXQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJmxsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpRmlsZVJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaUZpbGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaUZpbGVMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpU3RhcnRPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpRW5kT2Zmc2V0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFRYTlNldERhdGFGcm9tRmlsZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaUZpbGVSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpRmlsZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpRmlsZUxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlTdGFydE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlFbmRPZmZzZXQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRYTk9ial9UWE5HZXRDaGFuZ2VDb3VudChUWE5PYmplY3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUl0ZW1Db3VudCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEl0ZW1Db3VudCBfcnY7CiAjaWZuZGVmIFRYTkdldENoYW5nZUNvdW50Ci0JUHlNYWNfUFJFQ0hFQ0soVFhOR2V0Q2hhbmdlQ291bnQpOworICAgIFB5TWFjX1BSRUNIRUNLKFRYTkdldENoYW5nZUNvdW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBUWE5HZXRDaGFuZ2VDb3VudChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVFhOR2V0Q2hhbmdlQ291bnQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTlNhdmUoVFhOT2JqZWN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVRYTkZpbGVUeXBlIGlUeXBlOwotCU9TVHlwZSBpUmVzVHlwZTsKLQlUWE5QZXJtYW5lbnRUZXh0RW5jb2RpbmdUeXBlIGlQZXJtYW5lbnRFbmNvZGluZzsKLQlGU1NwZWMgaUZpbGVTcGVjaWZpY2F0aW9uOwotCVNJbnQxNiBpRGF0YVJlZmVyZW5jZTsKLQlTSW50MTYgaVJlc291cmNlUmVmZXJlbmNlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFRYTkZpbGVUeXBlIGlUeXBlOworICAgIE9TVHlwZSBpUmVzVHlwZTsKKyAgICBUWE5QZXJtYW5lbnRUZXh0RW5jb2RpbmdUeXBlIGlQZXJtYW5lbnRFbmNvZGluZzsKKyAgICBGU1NwZWMgaUZpbGVTcGVjaWZpY2F0aW9uOworICAgIFNJbnQxNiBpRGF0YVJlZmVyZW5jZTsKKyAgICBTSW50MTYgaVJlc291cmNlUmVmZXJlbmNlOwogI2lmbmRlZiBUWE5TYXZlCi0JUHlNYWNfUFJFQ0hFQ0soVFhOU2F2ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhOU2F2ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbE8maGgiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaVJlc1R5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZpUGVybWFuZW50RW5jb2RpbmcsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJmlGaWxlU3BlY2lmaWNhdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlEYXRhUmVmZXJlbmNlLAotCSAgICAgICAgICAgICAgICAgICAgICAmaVJlc291cmNlUmVmZXJlbmNlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFRYTlNhdmUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICBpVHlwZSwKLQkgICAgICAgICAgICAgICBpUmVzVHlwZSwKLQkgICAgICAgICAgICAgICBpUGVybWFuZW50RW5jb2RpbmcsCi0JICAgICAgICAgICAgICAgJmlGaWxlU3BlY2lmaWNhdGlvbiwKLQkgICAgICAgICAgICAgICBpRGF0YVJlZmVyZW5jZSwKLQkgICAgICAgICAgICAgICBpUmVzb3VyY2VSZWZlcmVuY2UpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZsTyZoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmlUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpUmVzVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlQZXJtYW5lbnRFbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmaUZpbGVTcGVjaWZpY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaURhdGFSZWZlcmVuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpUmVzb3VyY2VSZWZlcmVuY2UpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVFhOU2F2ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgIGlUeXBlLAorICAgICAgICAgICAgICAgICAgIGlSZXNUeXBlLAorICAgICAgICAgICAgICAgICAgIGlQZXJtYW5lbnRFbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAmaUZpbGVTcGVjaWZpY2F0aW9uLAorICAgICAgICAgICAgICAgICAgIGlEYXRhUmVmZXJlbmNlLAorICAgICAgICAgICAgICAgICAgIGlSZXNvdXJjZVJlZmVyZW5jZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTlJldmVydChUWE5PYmplY3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CiAjaWZuZGVmIFRYTlJldmVydAotCVB5TWFjX1BSRUNIRUNLKFRYTlJldmVydCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhOUmV2ZXJ0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gVFhOUmV2ZXJ0KF9zZWxmLT5vYl9pdHNlbGYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVFhOUmV2ZXJ0KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRYTk9ial9UWE5QYWdlU2V0dXAoVFhOT2JqZWN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOwogI2lmbmRlZiBUWE5QYWdlU2V0dXAKLQlQeU1hY19QUkVDSEVDSyhUWE5QYWdlU2V0dXApOworICAgIFB5TWFjX1BSRUNIRUNLKFRYTlBhZ2VTZXR1cCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFRYTlBhZ2VTZXR1cChfc2VsZi0+b2JfaXRzZWxmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFRYTlBhZ2VTZXR1cChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUWE5PYmpfVFhOUHJpbnQoVFhOT2JqZWN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOwogI2lmbmRlZiBUWE5QcmludAotCVB5TWFjX1BSRUNIRUNLKFRYTlByaW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhUWE5QcmludCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFRYTlByaW50KF9zZWxmLT5vYl9pdHNlbGYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVFhOUHJpbnQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTkdldFZpZXdSZWN0KFRYTk9iamVjdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVjdCBvVmlld1JlY3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlY3Qgb1ZpZXdSZWN0OwogI2lmbmRlZiBUWE5HZXRWaWV3UmVjdAotCVB5TWFjX1BSRUNIRUNLKFRYTkdldFZpZXdSZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhUWE5HZXRWaWV3UmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JVFhOR2V0Vmlld1JlY3QoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAmb1ZpZXdSZWN0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJm9WaWV3UmVjdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFRYTkdldFZpZXdSZWN0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgJm9WaWV3UmVjdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZvVmlld1JlY3QpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRYTk9ial9UWE5TZXRWaWV3UmVjdChUWE5PYmplY3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3QgaVZpZXdSZWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IGlWaWV3UmVjdDsKICNpZm5kZWYgVFhOU2V0Vmlld1JlY3QKLQlQeU1hY19QUkVDSEVDSyhUWE5TZXRWaWV3UmVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhOU2V0Vmlld1JlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaVZpZXdSZWN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JVFhOU2V0Vmlld1JlY3QoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAmaVZpZXdSZWN0KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaVZpZXdSZWN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVFhOU2V0Vmlld1JlY3QoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAmaVZpZXdSZWN0KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTkF0dGFjaE9iamVjdFRvV2luZG93KFRYTk9iamVjdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlHV29ybGRQdHIgaVdpbmRvdzsKLQlCb29sZWFuIGlJc0FjdHVhbFdpbmRvdzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBHV29ybGRQdHIgaVdpbmRvdzsKKyAgICBCb29sZWFuIGlJc0FjdHVhbFdpbmRvdzsKICNpZm5kZWYgVFhOQXR0YWNoT2JqZWN0VG9XaW5kb3cKLQlQeU1hY19QUkVDSEVDSyhUWE5BdHRhY2hPYmplY3RUb1dpbmRvdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhOQXR0YWNoT2JqZWN0VG9XaW5kb3cpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgR1dvcmxkT2JqX0NvbnZlcnQsICZpV2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICAmaUlzQWN0dWFsV2luZG93KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFRYTkF0dGFjaE9iamVjdFRvV2luZG93KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlXaW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlJc0FjdHVhbFdpbmRvdyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgR1dvcmxkT2JqX0NvbnZlcnQsICZpV2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaUlzQWN0dWFsV2luZG93KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFRYTkF0dGFjaE9iamVjdFRvV2luZG93KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlXaW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlJc0FjdHVhbFdpbmRvdyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTklzT2JqZWN0QXR0YWNoZWRUb1dpbmRvdyhUWE5PYmplY3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKICNpZm5kZWYgVFhOSXNPYmplY3RBdHRhY2hlZFRvV2luZG93Ci0JUHlNYWNfUFJFQ0hFQ0soVFhOSXNPYmplY3RBdHRhY2hlZFRvV2luZG93KTsKKyAgICBQeU1hY19QUkVDSEVDSyhUWE5Jc09iamVjdEF0dGFjaGVkVG9XaW5kb3cpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFRYTklzT2JqZWN0QXR0YWNoZWRUb1dpbmRvdyhfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVFhOSXNPYmplY3RBdHRhY2hlZFRvV2luZG93KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRYTk9ial9UWE5EcmFnVHJhY2tlcihUWE5PYmplY3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JVFhORnJhbWVJRCBpVFhORnJhbWVJRDsKLQlEcmFnVHJhY2tpbmdNZXNzYWdlIGlNZXNzYWdlOwotCVdpbmRvd1B0ciBpV2luZG93OwotCURyYWdSZWZlcmVuY2UgaURyYWdSZWZlcmVuY2U7Ci0JQm9vbGVhbiBpRGlmZmVyZW50T2JqZWN0U2FtZVdpbmRvdzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBUWE5GcmFtZUlEIGlUWE5GcmFtZUlEOworICAgIERyYWdUcmFja2luZ01lc3NhZ2UgaU1lc3NhZ2U7CisgICAgV2luZG93UHRyIGlXaW5kb3c7CisgICAgRHJhZ1JlZmVyZW5jZSBpRHJhZ1JlZmVyZW5jZTsKKyAgICBCb29sZWFuIGlEaWZmZXJlbnRPYmplY3RTYW1lV2luZG93OwogI2lmbmRlZiBUWE5EcmFnVHJhY2tlcgotCVB5TWFjX1BSRUNIRUNLKFRYTkRyYWdUcmFja2VyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUWE5EcmFnVHJhY2tlcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsaE8mTyZiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlUWE5GcmFtZUlELAotCSAgICAgICAgICAgICAgICAgICAgICAmaU1lc3NhZ2UsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaVdpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgRHJhZ09ial9Db252ZXJ0LCAmaURyYWdSZWZlcmVuY2UsCi0JICAgICAgICAgICAgICAgICAgICAgICZpRGlmZmVyZW50T2JqZWN0U2FtZVdpbmRvdykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBUWE5EcmFnVHJhY2tlcihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICBpVFhORnJhbWVJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgaU1lc3NhZ2UsCi0JICAgICAgICAgICAgICAgICAgICAgIGlXaW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgIGlEcmFnUmVmZXJlbmNlLAotCSAgICAgICAgICAgICAgICAgICAgICBpRGlmZmVyZW50T2JqZWN0U2FtZVdpbmRvdyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGhPJk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpVFhORnJhbWVJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlNZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmlXaW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIERyYWdPYmpfQ29udmVydCwgJmlEcmFnUmVmZXJlbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaURpZmZlcmVudE9iamVjdFNhbWVXaW5kb3cpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVFhORHJhZ1RyYWNrZXIoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaVRYTkZyYW1lSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGlNZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpV2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpRHJhZ1JlZmVyZW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaURpZmZlcmVudE9iamVjdFNhbWVXaW5kb3cpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRYTk9ial9UWE5EcmFnUmVjZWl2ZXIoVFhOT2JqZWN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVRYTkZyYW1lSUQgaVRYTkZyYW1lSUQ7Ci0JV2luZG93UHRyIGlXaW5kb3c7Ci0JRHJhZ1JlZmVyZW5jZSBpRHJhZ1JlZmVyZW5jZTsKLQlCb29sZWFuIGlEaWZmZXJlbnRPYmplY3RTYW1lV2luZG93OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFRYTkZyYW1lSUQgaVRYTkZyYW1lSUQ7CisgICAgV2luZG93UHRyIGlXaW5kb3c7CisgICAgRHJhZ1JlZmVyZW5jZSBpRHJhZ1JlZmVyZW5jZTsKKyAgICBCb29sZWFuIGlEaWZmZXJlbnRPYmplY3RTYW1lV2luZG93OwogI2lmbmRlZiBUWE5EcmFnUmVjZWl2ZXIKLQlQeU1hY19QUkVDSEVDSyhUWE5EcmFnUmVjZWl2ZXIpOworICAgIFB5TWFjX1BSRUNIRUNLKFRYTkRyYWdSZWNlaXZlcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyZPJmIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaVRYTkZyYW1lSUQsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaVdpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgRHJhZ09ial9Db252ZXJ0LCAmaURyYWdSZWZlcmVuY2UsCi0JICAgICAgICAgICAgICAgICAgICAgICZpRGlmZmVyZW50T2JqZWN0U2FtZVdpbmRvdykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBUWE5EcmFnUmVjZWl2ZXIoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgIGlUWE5GcmFtZUlELAotCSAgICAgICAgICAgICAgICAgICAgICAgaVdpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgIGlEcmFnUmVmZXJlbmNlLAotCSAgICAgICAgICAgICAgICAgICAgICAgaURpZmZlcmVudE9iamVjdFNhbWVXaW5kb3cpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpVFhORnJhbWVJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpV2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICBEcmFnT2JqX0NvbnZlcnQsICZpRHJhZ1JlZmVyZW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlEaWZmZXJlbnRPYmplY3RTYW1lV2luZG93KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFRYTkRyYWdSZWNlaXZlcihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaVRYTkZyYW1lSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpV2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaURyYWdSZWZlcmVuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpRGlmZmVyZW50T2JqZWN0U2FtZVdpbmRvdyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTkFjdGl2YXRlKFRYTk9iamVjdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlUWE5GcmFtZUlEIGlUWE5GcmFtZUlEOwotCVRYTlNjcm9sbEJhclN0YXRlIGlBY3RpdmVTdGF0ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBUWE5GcmFtZUlEIGlUWE5GcmFtZUlEOworICAgIFRYTlNjcm9sbEJhclN0YXRlIGlBY3RpdmVTdGF0ZTsKICNpZm5kZWYgVFhOQWN0aXZhdGUKLQlQeU1hY19QUkVDSEVDSyhUWE5BY3RpdmF0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhOQWN0aXZhdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaVRYTkZyYW1lSUQsCi0JICAgICAgICAgICAgICAgICAgICAgICZpQWN0aXZlU3RhdGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gVFhOQWN0aXZhdGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgaVRYTkZyYW1lSUQsCi0JICAgICAgICAgICAgICAgICAgIGlBY3RpdmVTdGF0ZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaVRYTkZyYW1lSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpQWN0aXZlU3RhdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVFhOQWN0aXZhdGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgaVRYTkZyYW1lSUQsCisgICAgICAgICAgICAgICAgICAgICAgIGlBY3RpdmVTdGF0ZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTkVjaG9Nb2RlKFRYTk9iamVjdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVbmlDaGFyIGlFY2hvQ2hhcmFjdGVyOwotCVRleHRFbmNvZGluZyBpRW5jb2Rpbmc7Ci0JQm9vbGVhbiBpT247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVW5pQ2hhciBpRWNob0NoYXJhY3RlcjsKKyAgICBUZXh0RW5jb2RpbmcgaUVuY29kaW5nOworICAgIEJvb2xlYW4gaU9uOwogI2lmbmRlZiBUWE5FY2hvTW9kZQotCVB5TWFjX1BSRUNIRUNLKFRYTkVjaG9Nb2RlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUWE5FY2hvTW9kZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobGIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaUVjaG9DaGFyYWN0ZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpRW5jb2RpbmcsCi0JICAgICAgICAgICAgICAgICAgICAgICZpT24pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gVFhORWNob01vZGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgaUVjaG9DaGFyYWN0ZXIsCi0JICAgICAgICAgICAgICAgICAgIGlFbmNvZGluZywKLQkgICAgICAgICAgICAgICAgICAgaU9uKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaUVjaG9DaGFyYWN0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpRW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpT24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVFhORWNob01vZGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgaUVjaG9DaGFyYWN0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgIGlFbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgaU9uKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUWE5PYmpfVFhORG9Gb250TWVudVNlbGVjdGlvbihUWE5PYmplY3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVFhORm9udE1lbnVPYmplY3QgaVRYTkZvbnRNZW51T2JqZWN0OwotCVNJbnQxNiBpTWVudUlEOwotCVNJbnQxNiBpTWVudUl0ZW07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVFhORm9udE1lbnVPYmplY3QgaVRYTkZvbnRNZW51T2JqZWN0OworICAgIFNJbnQxNiBpTWVudUlEOworICAgIFNJbnQxNiBpTWVudUl0ZW07CiAjaWZuZGVmIFRYTkRvRm9udE1lbnVTZWxlY3Rpb24KLQlQeU1hY19QUkVDSEVDSyhUWE5Eb0ZvbnRNZW51U2VsZWN0aW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUWE5Eb0ZvbnRNZW51U2VsZWN0aW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGgiLAotCSAgICAgICAgICAgICAgICAgICAgICBUWE5Gb250TWVudU9ial9Db252ZXJ0LCAmaVRYTkZvbnRNZW51T2JqZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmaU1lbnVJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlNZW51SXRlbSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBUWE5Eb0ZvbnRNZW51U2VsZWN0aW9uKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaVRYTkZvbnRNZW51T2JqZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlNZW51SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaU1lbnVJdGVtKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVFhORm9udE1lbnVPYmpfQ29udmVydCwgJmlUWE5Gb250TWVudU9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlNZW51SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpTWVudUl0ZW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVFhORG9Gb250TWVudVNlbGVjdGlvbihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlUWE5Gb250TWVudU9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpTWVudUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlNZW51SXRlbSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTlByZXBhcmVGb250TWVudShUWE5PYmplY3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVFhORm9udE1lbnVPYmplY3QgaVRYTkZvbnRNZW51T2JqZWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFRYTkZvbnRNZW51T2JqZWN0IGlUWE5Gb250TWVudU9iamVjdDsKICNpZm5kZWYgVFhOUHJlcGFyZUZvbnRNZW51Ci0JUHlNYWNfUFJFQ0hFQ0soVFhOUHJlcGFyZUZvbnRNZW51KTsKKyAgICBQeU1hY19QUkVDSEVDSyhUWE5QcmVwYXJlRm9udE1lbnUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBUWE5Gb250TWVudU9ial9Db252ZXJ0LCAmaVRYTkZvbnRNZW51T2JqZWN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFRYTlByZXBhcmVGb250TWVudShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgaVRYTkZvbnRNZW51T2JqZWN0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRYTkZvbnRNZW51T2JqX0NvbnZlcnQsICZpVFhORm9udE1lbnVPYmplY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVFhOUHJlcGFyZUZvbnRNZW51KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpVFhORm9udE1lbnVPYmplY3QpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRYTk9ial9UWE5Qb2ludFRvT2Zmc2V0KFRYTk9iamVjdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlQb2ludCBpUG9pbnQ7Ci0JVFhOT2Zmc2V0IG9PZmZzZXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgUG9pbnQgaVBvaW50OworICAgIFRYTk9mZnNldCBvT2Zmc2V0OwogI2lmbmRlZiBUWE5Qb2ludFRvT2Zmc2V0Ci0JUHlNYWNfUFJFQ0hFQ0soVFhOUG9pbnRUb09mZnNldCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhOUG9pbnRUb09mZnNldCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmaVBvaW50KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFRYTlBvaW50VG9PZmZzZXQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICBpUG9pbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgJm9PZmZzZXQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIG9PZmZzZXQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZpUG9pbnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVFhOUG9pbnRUb09mZnNldChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlQb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb09mZnNldCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb09mZnNldCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTk9mZnNldFRvUG9pbnQoVFhOT2JqZWN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVRYTk9mZnNldCBpT2Zmc2V0OwotCVBvaW50IG9Qb2ludDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBUWE5PZmZzZXQgaU9mZnNldDsKKyAgICBQb2ludCBvUG9pbnQ7CiAjaWZuZGVmIFRYTk9mZnNldFRvUG9pbnQKLQlQeU1hY19QUkVDSEVDSyhUWE5PZmZzZXRUb1BvaW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhUWE5PZmZzZXRUb1BvaW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaU9mZnNldCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBUWE5PZmZzZXRUb1BvaW50KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgaU9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAmb1BvaW50KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRQb2ludCwgb1BvaW50KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlPZmZzZXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVFhOT2Zmc2V0VG9Qb2ludChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9Qb2ludCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUG9pbnQsIG9Qb2ludCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTkdldExpbmVDb3VudChUWE5PYmplY3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JSXRlbUNvdW50IG9MaW5lVG90YWw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgSXRlbUNvdW50IG9MaW5lVG90YWw7CiAjaWZuZGVmIFRYTkdldExpbmVDb3VudAotCVB5TWFjX1BSRUNIRUNLKFRYTkdldExpbmVDb3VudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhOR2V0TGluZUNvdW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gVFhOR2V0TGluZUNvdW50KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAmb0xpbmVUb3RhbCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgb0xpbmVUb3RhbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBUWE5HZXRMaW5lQ291bnQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZvTGluZVRvdGFsKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvTGluZVRvdGFsKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUWE5PYmpfVFhOR2V0TGluZU1ldHJpY3MoVFhOT2JqZWN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVVJbnQzMiBpTGluZU51bWJlcjsKLQlGaXhlZCBvTGluZVdpZHRoOwotCUZpeGVkIG9MaW5lSGVpZ2h0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQzMiBpTGluZU51bWJlcjsKKyAgICBGaXhlZCBvTGluZVdpZHRoOworICAgIEZpeGVkIG9MaW5lSGVpZ2h0OwogI2lmbmRlZiBUWE5HZXRMaW5lTWV0cmljcwotCVB5TWFjX1BSRUNIRUNLKFRYTkdldExpbmVNZXRyaWNzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUWE5HZXRMaW5lTWV0cmljcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlMaW5lTnVtYmVyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFRYTkdldExpbmVNZXRyaWNzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGlMaW5lTnVtYmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmb0xpbmVXaWR0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJm9MaW5lSGVpZ2h0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBvTGluZVdpZHRoLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRml4ZWQsIG9MaW5lSGVpZ2h0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlMaW5lTnVtYmVyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFRYTkdldExpbmVNZXRyaWNzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlMaW5lTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb0xpbmVXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9MaW5lSGVpZ2h0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBvTGluZVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRml4ZWQsIG9MaW5lSGVpZ2h0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUWE5PYmpfVFhOSXNPYmplY3RBdHRhY2hlZFRvU3BlY2lmaWNXaW5kb3coVFhOT2JqZWN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVdpbmRvd1B0ciBpV2luZG93OwotCUJvb2xlYW4gb0F0dGFjaGVkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd1B0ciBpV2luZG93OworICAgIEJvb2xlYW4gb0F0dGFjaGVkOwogI2lmbmRlZiBUWE5Jc09iamVjdEF0dGFjaGVkVG9TcGVjaWZpY1dpbmRvdwotCVB5TWFjX1BSRUNIRUNLKFRYTklzT2JqZWN0QXR0YWNoZWRUb1NwZWNpZmljV2luZG93KTsKKyAgICBQeU1hY19QUkVDSEVDSyhUWE5Jc09iamVjdEF0dGFjaGVkVG9TcGVjaWZpY1dpbmRvdyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaVdpbmRvdykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBUWE5Jc09iamVjdEF0dGFjaGVkVG9TcGVjaWZpY1dpbmRvdyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpV2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb0F0dGFjaGVkKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBvQXR0YWNoZWQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpV2luZG93KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFRYTklzT2JqZWN0QXR0YWNoZWRUb1NwZWNpZmljV2luZG93KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlXaW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvQXR0YWNoZWQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG9BdHRhY2hlZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTlJlY2FsY1RleHRMYXlvdXQoVFhOT2JqZWN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIFRYTlJlY2FsY1RleHRMYXlvdXQKLQlQeU1hY19QUkVDSEVDSyhUWE5SZWNhbGNUZXh0TGF5b3V0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhUWE5SZWNhbGNUZXh0TGF5b3V0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlUWE5SZWNhbGNUZXh0TGF5b3V0KF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVFhOUmVjYWxjVGV4dExheW91dChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBUWE5PYmpfbWV0aG9kc1tdID0gewotCXsiVFhORGVsZXRlT2JqZWN0IiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5EZWxldGVPYmplY3QsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IlRYTlJlc2l6ZUZyYW1lIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5SZXNpemVGcmFtZSwgMSwKLQkgUHlEb2NfU1RSKCIoVUludDMyIGlXaWR0aCwgVUludDMyIGlIZWlnaHQsIFRYTkZyYW1lSUQgaVRYTkZyYW1lSUQpIC0+IE5vbmUiKX0sCi0JeyJUWE5TZXRGcmFtZUJvdW5kcyIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOU2V0RnJhbWVCb3VuZHMsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQzMiBpVG9wLCBTSW50MzIgaUxlZnQsIFNJbnQzMiBpQm90dG9tLCBTSW50MzIgaVJpZ2h0LCBUWE5GcmFtZUlEIGlUWE5GcmFtZUlEKSAtPiBOb25lIil9LAotCXsiVFhOS2V5RG93biIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOS2V5RG93biwgMSwKLQkgUHlEb2NfU1RSKCIoRXZlbnRSZWNvcmQgaUV2ZW50KSAtPiBOb25lIil9LAotCXsiVFhOQWRqdXN0Q3Vyc29yIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5BZGp1c3RDdXJzb3IsIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSBpb0N1cnNvclJnbikgLT4gTm9uZSIpfSwKLQl7IlRYTkNsaWNrIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5DbGljaywgMSwKLQkgUHlEb2NfU1RSKCIoRXZlbnRSZWNvcmQgaUV2ZW50KSAtPiBOb25lIil9LAotCXsiVFhOU2VsZWN0QWxsIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5TZWxlY3RBbGwsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IlRYTkZvY3VzIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5Gb2N1cywgMSwKLQkgUHlEb2NfU1RSKCIoQm9vbGVhbiBpQmVjb21pbmdGb2N1c2VkKSAtPiBOb25lIil9LAotCXsiVFhOVXBkYXRlIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5VcGRhdGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IlRYTkRyYXciLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTkRyYXcsIDEsCi0JIFB5RG9jX1NUUigiKEdXb3JsZFB0ciBpRHJhd1BvcnQpIC0+IE5vbmUiKX0sCi0JeyJUWE5Gb3JjZVVwZGF0ZSIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhORm9yY2VVcGRhdGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IlRYTkdldFNsZWVwVGlja3MiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTkdldFNsZWVwVGlja3MsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQzMiBfcnYpIil9LAotCXsiVFhOSWRsZSIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOSWRsZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiVFhOR3Jvd1dpbmRvdyIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOR3Jvd1dpbmRvdywgMSwKLQkgUHlEb2NfU1RSKCIoRXZlbnRSZWNvcmQgaUV2ZW50KSAtPiBOb25lIil9LAotCXsiVFhOWm9vbVdpbmRvdyIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOWm9vbVdpbmRvdywgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IGlQYXJ0KSAtPiBOb25lIil9LAotCXsiVFhOQ2FuVW5kbyIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOQ2FuVW5kbywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYsIFRYTkFjdGlvbktleSBvVFhOQWN0aW9uS2V5KSIpfSwKLQl7IlRYTlVuZG8iLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTlVuZG8sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IlRYTkNhblJlZG8iLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTkNhblJlZG8sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2LCBUWE5BY3Rpb25LZXkgb1RYTkFjdGlvbktleSkiKX0sCi0JeyJUWE5SZWRvIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5SZWRvLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJUWE5DdXQiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTkN1dCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiVFhOQ29weSIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOQ29weSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiVFhOUGFzdGUiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTlBhc3RlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJUWE5DbGVhciIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOQ2xlYXIsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IlRYTkdldFNlbGVjdGlvbiIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOR2V0U2VsZWN0aW9uLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChUWE5PZmZzZXQgb1N0YXJ0T2Zmc2V0LCBUWE5PZmZzZXQgb0VuZE9mZnNldCkiKX0sCi0JeyJUWE5TaG93U2VsZWN0aW9uIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5TaG93U2VsZWN0aW9uLCAxLAotCSBQeURvY19TVFIoIihCb29sZWFuIGlTaG93RW5kKSAtPiBOb25lIil9LAotCXsiVFhOSXNTZWxlY3Rpb25FbXB0eSIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOSXNTZWxlY3Rpb25FbXB0eSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiVFhOU2V0U2VsZWN0aW9uIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5TZXRTZWxlY3Rpb24sIDEsCi0JIFB5RG9jX1NUUigiKFRYTk9mZnNldCBpU3RhcnRPZmZzZXQsIFRYTk9mZnNldCBpRW5kT2Zmc2V0KSAtPiBOb25lIil9LAotCXsiVFhOQ291bnRSdW5zSW5SYW5nZSIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOQ291bnRSdW5zSW5SYW5nZSwgMSwKLQkgUHlEb2NfU1RSKCIoVFhOT2Zmc2V0IGlTdGFydE9mZnNldCwgVFhOT2Zmc2V0IGlFbmRPZmZzZXQpIC0+IChJdGVtQ291bnQgb1J1bkNvdW50KSIpfSwKLQl7IlRYTkRhdGFTaXplIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5EYXRhU2l6ZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQnl0ZUNvdW50IF9ydikiKX0sCi0JeyJUWE5HZXREYXRhIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5HZXREYXRhLCAxLAotCSBQeURvY19TVFIoIihUWE5PZmZzZXQgaVN0YXJ0T2Zmc2V0LCBUWE5PZmZzZXQgaUVuZE9mZnNldCkgLT4gKEhhbmRsZSBvRGF0YUhhbmRsZSkiKX0sCi0JeyJUWE5HZXREYXRhRW5jb2RlZCIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOR2V0RGF0YUVuY29kZWQsIDEsCi0JIFB5RG9jX1NUUigiKFRYTk9mZnNldCBpU3RhcnRPZmZzZXQsIFRYTk9mZnNldCBpRW5kT2Zmc2V0LCBUWE5EYXRhVHlwZSBpRW5jb2RpbmcpIC0+IChIYW5kbGUgb0RhdGFIYW5kbGUpIil9LAotCXsiVFhOU2V0RGF0YUZyb21GaWxlIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5TZXREYXRhRnJvbUZpbGUsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiBpRmlsZVJlZk51bSwgT1NUeXBlIGlGaWxlVHlwZSwgQnl0ZUNvdW50IGlGaWxlTGVuZ3RoLCBUWE5PZmZzZXQgaVN0YXJ0T2Zmc2V0LCBUWE5PZmZzZXQgaUVuZE9mZnNldCkgLT4gTm9uZSIpfSwKLQl7IlRYTkdldENoYW5nZUNvdW50IiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5HZXRDaGFuZ2VDb3VudCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoSXRlbUNvdW50IF9ydikiKX0sCi0JeyJUWE5TYXZlIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5TYXZlLCAxLAotCSBQeURvY19TVFIoIihUWE5GaWxlVHlwZSBpVHlwZSwgT1NUeXBlIGlSZXNUeXBlLCBUWE5QZXJtYW5lbnRUZXh0RW5jb2RpbmdUeXBlIGlQZXJtYW5lbnRFbmNvZGluZywgRlNTcGVjIGlGaWxlU3BlY2lmaWNhdGlvbiwgU0ludDE2IGlEYXRhUmVmZXJlbmNlLCBTSW50MTYgaVJlc291cmNlUmVmZXJlbmNlKSAtPiBOb25lIil9LAotCXsiVFhOUmV2ZXJ0IiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5SZXZlcnQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IlRYTlBhZ2VTZXR1cCIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOUGFnZVNldHVwLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJUWE5QcmludCIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOUHJpbnQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IlRYTkdldFZpZXdSZWN0IiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5HZXRWaWV3UmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoUmVjdCBvVmlld1JlY3QpIil9LAotCXsiVFhOU2V0Vmlld1JlY3QiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTlNldFZpZXdSZWN0LCAxLAotCSBQeURvY19TVFIoIihSZWN0IGlWaWV3UmVjdCkgLT4gTm9uZSIpfSwKLQl7IlRYTkF0dGFjaE9iamVjdFRvV2luZG93IiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5BdHRhY2hPYmplY3RUb1dpbmRvdywgMSwKLQkgUHlEb2NfU1RSKCIoR1dvcmxkUHRyIGlXaW5kb3csIEJvb2xlYW4gaUlzQWN0dWFsV2luZG93KSAtPiBOb25lIil9LAotCXsiVFhOSXNPYmplY3RBdHRhY2hlZFRvV2luZG93IiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5Jc09iamVjdEF0dGFjaGVkVG9XaW5kb3csIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IlRYTkRyYWdUcmFja2VyIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5EcmFnVHJhY2tlciwgMSwKLQkgUHlEb2NfU1RSKCIoVFhORnJhbWVJRCBpVFhORnJhbWVJRCwgRHJhZ1RyYWNraW5nTWVzc2FnZSBpTWVzc2FnZSwgV2luZG93UHRyIGlXaW5kb3csIERyYWdSZWZlcmVuY2UgaURyYWdSZWZlcmVuY2UsIEJvb2xlYW4gaURpZmZlcmVudE9iamVjdFNhbWVXaW5kb3cpIC0+IE5vbmUiKX0sCi0JeyJUWE5EcmFnUmVjZWl2ZXIiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTkRyYWdSZWNlaXZlciwgMSwKLQkgUHlEb2NfU1RSKCIoVFhORnJhbWVJRCBpVFhORnJhbWVJRCwgV2luZG93UHRyIGlXaW5kb3csIERyYWdSZWZlcmVuY2UgaURyYWdSZWZlcmVuY2UsIEJvb2xlYW4gaURpZmZlcmVudE9iamVjdFNhbWVXaW5kb3cpIC0+IE5vbmUiKX0sCi0JeyJUWE5BY3RpdmF0ZSIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOQWN0aXZhdGUsIDEsCi0JIFB5RG9jX1NUUigiKFRYTkZyYW1lSUQgaVRYTkZyYW1lSUQsIFRYTlNjcm9sbEJhclN0YXRlIGlBY3RpdmVTdGF0ZSkgLT4gTm9uZSIpfSwKLQl7IlRYTkVjaG9Nb2RlIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5FY2hvTW9kZSwgMSwKLQkgUHlEb2NfU1RSKCIoVW5pQ2hhciBpRWNob0NoYXJhY3RlciwgVGV4dEVuY29kaW5nIGlFbmNvZGluZywgQm9vbGVhbiBpT24pIC0+IE5vbmUiKX0sCi0JeyJUWE5Eb0ZvbnRNZW51U2VsZWN0aW9uIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5Eb0ZvbnRNZW51U2VsZWN0aW9uLCAxLAotCSBQeURvY19TVFIoIihUWE5Gb250TWVudU9iamVjdCBpVFhORm9udE1lbnVPYmplY3QsIFNJbnQxNiBpTWVudUlELCBTSW50MTYgaU1lbnVJdGVtKSAtPiBOb25lIil9LAotCXsiVFhOUHJlcGFyZUZvbnRNZW51IiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5QcmVwYXJlRm9udE1lbnUsIDEsCi0JIFB5RG9jX1NUUigiKFRYTkZvbnRNZW51T2JqZWN0IGlUWE5Gb250TWVudU9iamVjdCkgLT4gTm9uZSIpfSwKLQl7IlRYTlBvaW50VG9PZmZzZXQiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTlBvaW50VG9PZmZzZXQsIDEsCi0JIFB5RG9jX1NUUigiKFBvaW50IGlQb2ludCkgLT4gKFRYTk9mZnNldCBvT2Zmc2V0KSIpfSwKLQl7IlRYTk9mZnNldFRvUG9pbnQiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTk9mZnNldFRvUG9pbnQsIDEsCi0JIFB5RG9jX1NUUigiKFRYTk9mZnNldCBpT2Zmc2V0KSAtPiAoUG9pbnQgb1BvaW50KSIpfSwKLQl7IlRYTkdldExpbmVDb3VudCIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOR2V0TGluZUNvdW50LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChJdGVtQ291bnQgb0xpbmVUb3RhbCkiKX0sCi0JeyJUWE5HZXRMaW5lTWV0cmljcyIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOR2V0TGluZU1ldHJpY3MsIDEsCi0JIFB5RG9jX1NUUigiKFVJbnQzMiBpTGluZU51bWJlcikgLT4gKEZpeGVkIG9MaW5lV2lkdGgsIEZpeGVkIG9MaW5lSGVpZ2h0KSIpfSwKLQl7IlRYTklzT2JqZWN0QXR0YWNoZWRUb1NwZWNpZmljV2luZG93IiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5Jc09iamVjdEF0dGFjaGVkVG9TcGVjaWZpY1dpbmRvdywgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIGlXaW5kb3cpIC0+IChCb29sZWFuIG9BdHRhY2hlZCkiKX0sCi0JeyJUWE5SZWNhbGNUZXh0TGF5b3V0IiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5SZWNhbGNUZXh0TGF5b3V0LCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0Je05VTEwsIE5VTEwsIDB9CisgICAgeyJUWE5EZWxldGVPYmplY3QiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTkRlbGV0ZU9iamVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiVFhOUmVzaXplRnJhbWUiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTlJlc2l6ZUZyYW1lLCAxLAorICAgICBQeURvY19TVFIoIihVSW50MzIgaVdpZHRoLCBVSW50MzIgaUhlaWdodCwgVFhORnJhbWVJRCBpVFhORnJhbWVJRCkgLT4gTm9uZSIpfSwKKyAgICB7IlRYTlNldEZyYW1lQm91bmRzIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5TZXRGcmFtZUJvdW5kcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDMyIGlUb3AsIFNJbnQzMiBpTGVmdCwgU0ludDMyIGlCb3R0b20sIFNJbnQzMiBpUmlnaHQsIFRYTkZyYW1lSUQgaVRYTkZyYW1lSUQpIC0+IE5vbmUiKX0sCisgICAgeyJUWE5LZXlEb3duIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5LZXlEb3duLCAxLAorICAgICBQeURvY19TVFIoIihFdmVudFJlY29yZCBpRXZlbnQpIC0+IE5vbmUiKX0sCisgICAgeyJUWE5BZGp1c3RDdXJzb3IiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTkFkanVzdEN1cnNvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIGlvQ3Vyc29yUmduKSAtPiBOb25lIil9LAorICAgIHsiVFhOQ2xpY2siLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTkNsaWNrLCAxLAorICAgICBQeURvY19TVFIoIihFdmVudFJlY29yZCBpRXZlbnQpIC0+IE5vbmUiKX0sCisgICAgeyJUWE5TZWxlY3RBbGwiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTlNlbGVjdEFsbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiVFhORm9jdXMiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTkZvY3VzLCAxLAorICAgICBQeURvY19TVFIoIihCb29sZWFuIGlCZWNvbWluZ0ZvY3VzZWQpIC0+IE5vbmUiKX0sCisgICAgeyJUWE5VcGRhdGUiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTlVwZGF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiVFhORHJhdyIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhORHJhdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoR1dvcmxkUHRyIGlEcmF3UG9ydCkgLT4gTm9uZSIpfSwKKyAgICB7IlRYTkZvcmNlVXBkYXRlIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5Gb3JjZVVwZGF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiVFhOR2V0U2xlZXBUaWNrcyIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOR2V0U2xlZXBUaWNrcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVUludDMyIF9ydikiKX0sCisgICAgeyJUWE5JZGxlIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5JZGxlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJUWE5Hcm93V2luZG93IiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5Hcm93V2luZG93LCAxLAorICAgICBQeURvY19TVFIoIihFdmVudFJlY29yZCBpRXZlbnQpIC0+IE5vbmUiKX0sCisgICAgeyJUWE5ab29tV2luZG93IiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5ab29tV2luZG93LCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgaVBhcnQpIC0+IE5vbmUiKX0sCisgICAgeyJUWE5DYW5VbmRvIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5DYW5VbmRvLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydiwgVFhOQWN0aW9uS2V5IG9UWE5BY3Rpb25LZXkpIil9LAorICAgIHsiVFhOVW5kbyIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOVW5kbywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiVFhOQ2FuUmVkbyIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOQ2FuUmVkbywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYsIFRYTkFjdGlvbktleSBvVFhOQWN0aW9uS2V5KSIpfSwKKyAgICB7IlRYTlJlZG8iLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTlJlZG8sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IlRYTkN1dCIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOQ3V0LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJUWE5Db3B5IiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5Db3B5LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJUWE5QYXN0ZSIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOUGFzdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IlRYTkNsZWFyIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5DbGVhciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiVFhOR2V0U2VsZWN0aW9uIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5HZXRTZWxlY3Rpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFRYTk9mZnNldCBvU3RhcnRPZmZzZXQsIFRYTk9mZnNldCBvRW5kT2Zmc2V0KSIpfSwKKyAgICB7IlRYTlNob3dTZWxlY3Rpb24iLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTlNob3dTZWxlY3Rpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKEJvb2xlYW4gaVNob3dFbmQpIC0+IE5vbmUiKX0sCisgICAgeyJUWE5Jc1NlbGVjdGlvbkVtcHR5IiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5Jc1NlbGVjdGlvbkVtcHR5LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJUWE5TZXRTZWxlY3Rpb24iLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTlNldFNlbGVjdGlvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVFhOT2Zmc2V0IGlTdGFydE9mZnNldCwgVFhOT2Zmc2V0IGlFbmRPZmZzZXQpIC0+IE5vbmUiKX0sCisgICAgeyJUWE5Db3VudFJ1bnNJblJhbmdlIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5Db3VudFJ1bnNJblJhbmdlLCAxLAorICAgICBQeURvY19TVFIoIihUWE5PZmZzZXQgaVN0YXJ0T2Zmc2V0LCBUWE5PZmZzZXQgaUVuZE9mZnNldCkgLT4gKEl0ZW1Db3VudCBvUnVuQ291bnQpIil9LAorICAgIHsiVFhORGF0YVNpemUiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTkRhdGFTaXplLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCeXRlQ291bnQgX3J2KSIpfSwKKyAgICB7IlRYTkdldERhdGEiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTkdldERhdGEsIDEsCisgICAgIFB5RG9jX1NUUigiKFRYTk9mZnNldCBpU3RhcnRPZmZzZXQsIFRYTk9mZnNldCBpRW5kT2Zmc2V0KSAtPiAoSGFuZGxlIG9EYXRhSGFuZGxlKSIpfSwKKyAgICB7IlRYTkdldERhdGFFbmNvZGVkIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5HZXREYXRhRW5jb2RlZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVFhOT2Zmc2V0IGlTdGFydE9mZnNldCwgVFhOT2Zmc2V0IGlFbmRPZmZzZXQsIFRYTkRhdGFUeXBlIGlFbmNvZGluZykgLT4gKEhhbmRsZSBvRGF0YUhhbmRsZSkiKX0sCisgICAgeyJUWE5TZXREYXRhRnJvbUZpbGUiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTlNldERhdGFGcm9tRmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IGlGaWxlUmVmTnVtLCBPU1R5cGUgaUZpbGVUeXBlLCBCeXRlQ291bnQgaUZpbGVMZW5ndGgsIFRYTk9mZnNldCBpU3RhcnRPZmZzZXQsIFRYTk9mZnNldCBpRW5kT2Zmc2V0KSAtPiBOb25lIil9LAorICAgIHsiVFhOR2V0Q2hhbmdlQ291bnQiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTkdldENoYW5nZUNvdW50LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChJdGVtQ291bnQgX3J2KSIpfSwKKyAgICB7IlRYTlNhdmUiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTlNhdmUsIDEsCisgICAgIFB5RG9jX1NUUigiKFRYTkZpbGVUeXBlIGlUeXBlLCBPU1R5cGUgaVJlc1R5cGUsIFRYTlBlcm1hbmVudFRleHRFbmNvZGluZ1R5cGUgaVBlcm1hbmVudEVuY29kaW5nLCBGU1NwZWMgaUZpbGVTcGVjaWZpY2F0aW9uLCBTSW50MTYgaURhdGFSZWZlcmVuY2UsIFNJbnQxNiBpUmVzb3VyY2VSZWZlcmVuY2UpIC0+IE5vbmUiKX0sCisgICAgeyJUWE5SZXZlcnQiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTlJldmVydCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiVFhOUGFnZVNldHVwIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5QYWdlU2V0dXAsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IlRYTlByaW50IiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5QcmludCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiVFhOR2V0Vmlld1JlY3QiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTkdldFZpZXdSZWN0LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChSZWN0IG9WaWV3UmVjdCkiKX0sCisgICAgeyJUWE5TZXRWaWV3UmVjdCIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOU2V0Vmlld1JlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgaVZpZXdSZWN0KSAtPiBOb25lIil9LAorICAgIHsiVFhOQXR0YWNoT2JqZWN0VG9XaW5kb3ciLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTkF0dGFjaE9iamVjdFRvV2luZG93LCAxLAorICAgICBQeURvY19TVFIoIihHV29ybGRQdHIgaVdpbmRvdywgQm9vbGVhbiBpSXNBY3R1YWxXaW5kb3cpIC0+IE5vbmUiKX0sCisgICAgeyJUWE5Jc09iamVjdEF0dGFjaGVkVG9XaW5kb3ciLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTklzT2JqZWN0QXR0YWNoZWRUb1dpbmRvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiVFhORHJhZ1RyYWNrZXIiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTkRyYWdUcmFja2VyLCAxLAorICAgICBQeURvY19TVFIoIihUWE5GcmFtZUlEIGlUWE5GcmFtZUlELCBEcmFnVHJhY2tpbmdNZXNzYWdlIGlNZXNzYWdlLCBXaW5kb3dQdHIgaVdpbmRvdywgRHJhZ1JlZmVyZW5jZSBpRHJhZ1JlZmVyZW5jZSwgQm9vbGVhbiBpRGlmZmVyZW50T2JqZWN0U2FtZVdpbmRvdykgLT4gTm9uZSIpfSwKKyAgICB7IlRYTkRyYWdSZWNlaXZlciIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhORHJhZ1JlY2VpdmVyLCAxLAorICAgICBQeURvY19TVFIoIihUWE5GcmFtZUlEIGlUWE5GcmFtZUlELCBXaW5kb3dQdHIgaVdpbmRvdywgRHJhZ1JlZmVyZW5jZSBpRHJhZ1JlZmVyZW5jZSwgQm9vbGVhbiBpRGlmZmVyZW50T2JqZWN0U2FtZVdpbmRvdykgLT4gTm9uZSIpfSwKKyAgICB7IlRYTkFjdGl2YXRlIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5BY3RpdmF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVFhORnJhbWVJRCBpVFhORnJhbWVJRCwgVFhOU2Nyb2xsQmFyU3RhdGUgaUFjdGl2ZVN0YXRlKSAtPiBOb25lIil9LAorICAgIHsiVFhORWNob01vZGUiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTkVjaG9Nb2RlLCAxLAorICAgICBQeURvY19TVFIoIihVbmlDaGFyIGlFY2hvQ2hhcmFjdGVyLCBUZXh0RW5jb2RpbmcgaUVuY29kaW5nLCBCb29sZWFuIGlPbikgLT4gTm9uZSIpfSwKKyAgICB7IlRYTkRvRm9udE1lbnVTZWxlY3Rpb24iLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTkRvRm9udE1lbnVTZWxlY3Rpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKFRYTkZvbnRNZW51T2JqZWN0IGlUWE5Gb250TWVudU9iamVjdCwgU0ludDE2IGlNZW51SUQsIFNJbnQxNiBpTWVudUl0ZW0pIC0+IE5vbmUiKX0sCisgICAgeyJUWE5QcmVwYXJlRm9udE1lbnUiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTlByZXBhcmVGb250TWVudSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVFhORm9udE1lbnVPYmplY3QgaVRYTkZvbnRNZW51T2JqZWN0KSAtPiBOb25lIil9LAorICAgIHsiVFhOUG9pbnRUb09mZnNldCIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOUG9pbnRUb09mZnNldCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgaVBvaW50KSAtPiAoVFhOT2Zmc2V0IG9PZmZzZXQpIil9LAorICAgIHsiVFhOT2Zmc2V0VG9Qb2ludCIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOT2Zmc2V0VG9Qb2ludCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVFhOT2Zmc2V0IGlPZmZzZXQpIC0+IChQb2ludCBvUG9pbnQpIil9LAorICAgIHsiVFhOR2V0TGluZUNvdW50IiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5HZXRMaW5lQ291bnQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEl0ZW1Db3VudCBvTGluZVRvdGFsKSIpfSwKKyAgICB7IlRYTkdldExpbmVNZXRyaWNzIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5HZXRMaW5lTWV0cmljcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoVUludDMyIGlMaW5lTnVtYmVyKSAtPiAoRml4ZWQgb0xpbmVXaWR0aCwgRml4ZWQgb0xpbmVIZWlnaHQpIil9LAorICAgIHsiVFhOSXNPYmplY3RBdHRhY2hlZFRvU3BlY2lmaWNXaW5kb3ciLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTklzT2JqZWN0QXR0YWNoZWRUb1NwZWNpZmljV2luZG93LCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgaVdpbmRvdykgLT4gKEJvb2xlYW4gb0F0dGFjaGVkKSIpfSwKKyAgICB7IlRYTlJlY2FsY1RleHRMYXlvdXQiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTlJlY2FsY1RleHRMYXlvdXQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKICNkZWZpbmUgVFhOT2JqX2dldHNldGxpc3QgTlVMTApAQCAtMTI0Miw2MSArMTI0Miw2MSBAQAogCiBzdGF0aWMgUHlPYmplY3QgKlRYTk9ial90cF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlQeU9iamVjdCAqX3NlbGY7Ci0JVFhOT2JqZWN0IGl0c2VsZjsKLQljaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKKyAgICBQeU9iamVjdCAqX3NlbGY7CisgICAgVFhOT2JqZWN0IGl0c2VsZjsKKyAgICBjaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIFRYTk9ial9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7Ci0JaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkoKFRYTk9iamVjdE9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiBfc2VsZjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBUWE5PYmpfQ29udmVydCwgJml0c2VsZikpIHJldHVybiBOVUxMOworICAgIGlmICgoX3NlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgKChUWE5PYmplY3RPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICByZXR1cm4gX3NlbGY7CiB9CiAKICNkZWZpbmUgVFhOT2JqX3RwX2ZyZWUgUHlPYmplY3RfRGVsCiAKIAogUHlUeXBlT2JqZWN0IFRYTk9iamVjdF9UeXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQotCTAsIC8qb2Jfc2l6ZSovCi0JIl9NbHRlLlRYTk9iamVjdCIsIC8qdHBfbmFtZSovCi0Jc2l6ZW9mKFRYTk9iamVjdE9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KLQkwLCAvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpIFRYTk9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsIC8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLwotCShjbXBmdW5jKSBUWE5PYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpIFRYTk9ial9yZXByLCAvKnRwX3JlcHIqLwotCShQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KLQkoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLwotCShQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYykgVFhOT2JqX2hhc2gsIC8qdHBfaGFzaCovCi0JMCwgLyp0cF9jYWxsKi8KLQkwLCAvKnRwX3N0ciovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLwotCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCi0JMCwgLyp0cF9hc19idWZmZXIqLwotCVB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCTAsIC8qdHBfZG9jKi8KLQkwLCAvKnRwX3RyYXZlcnNlKi8KLQkwLCAvKnRwX2NsZWFyKi8KLQkwLCAvKnRwX3JpY2hjb21wYXJlKi8KLQkwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLQkwLCAvKnRwX2l0ZXIqLwotCTAsIC8qdHBfaXRlcm5leHQqLwotCVRYTk9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCi0JMCwgLyp0cF9tZW1iZXJzKi8KLQlUWE5PYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLwotCTAsIC8qdHBfYmFzZSovCi0JMCwgLyp0cF9kaWN0Ki8KLQkwLCAvKnRwX2Rlc2NyX2dldCovCi0JMCwgLyp0cF9kZXNjcl9zZXQqLwotCTAsIC8qdHBfZGljdG9mZnNldCovCi0JVFhOT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KLQlUWE5PYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCi0JVFhOT2JqX3RwX25ldywgLyogdHBfbmV3ICovCi0JVFhOT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAvKm9iX3NpemUqLworICAgICJfTWx0ZS5UWE5PYmplY3QiLCAvKnRwX25hbWUqLworICAgIHNpemVvZihUWE5PYmplY3RPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKSBUWE5PYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KKyAgICAoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KKyAgICAoY21wZnVuYykgVFhOT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCisgICAgKHJlcHJmdW5jKSBUWE5PYmpfcmVwciwgLyp0cF9yZXByKi8KKyAgICAoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCisgICAgKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAoaGFzaGZ1bmMpIFRYTk9ial9oYXNoLCAvKnRwX2hhc2gqLworICAgIDAsIC8qdHBfY2FsbCovCisgICAgMCwgLyp0cF9zdHIqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KKyAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLworICAgIDAsIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAvKnRwX2RvYyovCisgICAgMCwgLyp0cF90cmF2ZXJzZSovCisgICAgMCwgLyp0cF9jbGVhciovCisgICAgMCwgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgLyp0cF9pdGVyKi8KKyAgICAwLCAvKnRwX2l0ZXJuZXh0Ki8KKyAgICBUWE5PYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLworICAgIDAsIC8qdHBfbWVtYmVycyovCisgICAgVFhOT2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KKyAgICAwLCAvKnRwX2Jhc2UqLworICAgIDAsIC8qdHBfZGljdCovCisgICAgMCwgLyp0cF9kZXNjcl9nZXQqLworICAgIDAsIC8qdHBfZGVzY3Jfc2V0Ki8KKyAgICAwLCAvKnRwX2RpY3RvZmZzZXQqLworICAgIFRYTk9ial90cF9pbml0LCAvKiB0cF9pbml0ICovCisgICAgVFhOT2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLworICAgIFRYTk9ial90cF9uZXcsIC8qIHRwX25ldyAqLworICAgIFRYTk9ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tIEVuZCBvYmplY3QgdHlwZSBUWE5PYmplY3QgLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTEzMDksNzcgKzEzMDksNzcgQEAKICNkZWZpbmUgVFhORm9udE1lbnVPYmpfQ2hlY2soeCkgKCh4KS0+b2JfdHlwZSA9PSAmVFhORm9udE1lbnVPYmplY3RfVHlwZSB8fCBQeU9iamVjdF9UeXBlQ2hlY2soKHgpLCAmVFhORm9udE1lbnVPYmplY3RfVHlwZSkpCiAKIHR5cGVkZWYgc3RydWN0IFRYTkZvbnRNZW51T2JqZWN0T2JqZWN0IHsKLQlQeU9iamVjdF9IRUFECi0JVFhORm9udE1lbnVPYmplY3Qgb2JfaXRzZWxmOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBUWE5Gb250TWVudU9iamVjdCBvYl9pdHNlbGY7CiB9IFRYTkZvbnRNZW51T2JqZWN0T2JqZWN0OwogCiBQeU9iamVjdCAqVFhORm9udE1lbnVPYmpfTmV3KFRYTkZvbnRNZW51T2JqZWN0IGl0c2VsZikKIHsKLQlUWE5Gb250TWVudU9iamVjdE9iamVjdCAqaXQ7Ci0JaWYgKGl0c2VsZiA9PSBOVUxMKSByZXR1cm4gUHlNYWNfRXJyb3IocmVzTm90Rm91bmQpOwotCWl0ID0gUHlPYmplY3RfTkVXKFRYTkZvbnRNZW51T2JqZWN0T2JqZWN0LCAmVFhORm9udE1lbnVPYmplY3RfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOwotCWl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIFRYTkZvbnRNZW51T2JqZWN0T2JqZWN0ICppdDsKKyAgICBpZiAoaXRzZWxmID09IE5VTEwpIHJldHVybiBQeU1hY19FcnJvcihyZXNOb3RGb3VuZCk7CisgICAgaXQgPSBQeU9iamVjdF9ORVcoVFhORm9udE1lbnVPYmplY3RPYmplY3QsICZUWE5Gb250TWVudU9iamVjdF9UeXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiAKIGludCBUWE5Gb250TWVudU9ial9Db252ZXJ0KFB5T2JqZWN0ICp2LCBUWE5Gb250TWVudU9iamVjdCAqcF9pdHNlbGYpCiB7Ci0JaWYgKCFUWE5Gb250TWVudU9ial9DaGVjayh2KSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJUWE5Gb250TWVudU9iamVjdCByZXF1aXJlZCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JKnBfaXRzZWxmID0gKChUWE5Gb250TWVudU9iamVjdE9iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0JcmV0dXJuIDE7CisgICAgaWYgKCFUWE5Gb250TWVudU9ial9DaGVjayh2KSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJUWE5Gb250TWVudU9iamVjdCByZXF1aXJlZCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgKnBfaXRzZWxmID0gKChUWE5Gb250TWVudU9iamVjdE9iamVjdCAqKXYpLT5vYl9pdHNlbGY7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyB2b2lkIFRYTkZvbnRNZW51T2JqX2RlYWxsb2MoVFhORm9udE1lbnVPYmplY3RPYmplY3QgKnNlbGYpCiB7Ci0JLyogQ2xlYW51cCBvZiBzZWxmLT5vYl9pdHNlbGYgZ29lcyBoZXJlICovCi0Jc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKKyAgICAvKiBDbGVhbnVwIG9mIHNlbGYtPm9iX2l0c2VsZiBnb2VzIGhlcmUgKi8KKyAgICBzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRYTkZvbnRNZW51T2JqX1RYTkdldEZvbnRNZW51SGFuZGxlKFRYTkZvbnRNZW51T2JqZWN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCU1lbnVIYW5kbGUgb0ZvbnRNZW51SGFuZGxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIE1lbnVIYW5kbGUgb0ZvbnRNZW51SGFuZGxlOwogI2lmbmRlZiBUWE5HZXRGb250TWVudUhhbmRsZQotCVB5TWFjX1BSRUNIRUNLKFRYTkdldEZvbnRNZW51SGFuZGxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUWE5HZXRGb250TWVudUhhbmRsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFRYTkdldEZvbnRNZW51SGFuZGxlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvRm9udE1lbnVIYW5kbGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBNZW51T2JqX05ldywgb0ZvbnRNZW51SGFuZGxlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFRYTkdldEZvbnRNZW51SGFuZGxlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvRm9udE1lbnVIYW5kbGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBNZW51T2JqX05ldywgb0ZvbnRNZW51SGFuZGxlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUWE5Gb250TWVudU9ial9UWE5EaXNwb3NlRm9udE1lbnVPYmplY3QoVFhORm9udE1lbnVPYmplY3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CiAjaWZuZGVmIFRYTkRpc3Bvc2VGb250TWVudU9iamVjdAotCVB5TWFjX1BSRUNIRUNLKFRYTkRpc3Bvc2VGb250TWVudU9iamVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhORGlzcG9zZUZvbnRNZW51T2JqZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gVFhORGlzcG9zZUZvbnRNZW51T2JqZWN0KF9zZWxmLT5vYl9pdHNlbGYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVFhORGlzcG9zZUZvbnRNZW51T2JqZWN0KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgVFhORm9udE1lbnVPYmpfbWV0aG9kc1tdID0gewotCXsiVFhOR2V0Rm9udE1lbnVIYW5kbGUiLCAoUHlDRnVuY3Rpb24pVFhORm9udE1lbnVPYmpfVFhOR2V0Rm9udE1lbnVIYW5kbGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKE1lbnVIYW5kbGUgb0ZvbnRNZW51SGFuZGxlKSIpfSwKLQl7IlRYTkRpc3Bvc2VGb250TWVudU9iamVjdCIsIChQeUNGdW5jdGlvbilUWE5Gb250TWVudU9ial9UWE5EaXNwb3NlRm9udE1lbnVPYmplY3QsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7IlRYTkdldEZvbnRNZW51SGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKVRYTkZvbnRNZW51T2JqX1RYTkdldEZvbnRNZW51SGFuZGxlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChNZW51SGFuZGxlIG9Gb250TWVudUhhbmRsZSkiKX0sCisgICAgeyJUWE5EaXNwb3NlRm9udE1lbnVPYmplY3QiLCAoUHlDRnVuY3Rpb24pVFhORm9udE1lbnVPYmpfVFhORGlzcG9zZUZvbnRNZW51T2JqZWN0LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAjZGVmaW5lIFRYTkZvbnRNZW51T2JqX2dldHNldGxpc3QgTlVMTApAQCAtMTM5Niw2MSArMTM5Niw2MSBAQAogCiBzdGF0aWMgUHlPYmplY3QgKlRYTkZvbnRNZW51T2JqX3RwX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICpfYXJncywgUHlPYmplY3QgKl9rd2RzKQogewotCVB5T2JqZWN0ICpfc2VsZjsKLQlUWE5Gb250TWVudU9iamVjdCBpdHNlbGY7Ci0JY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CisgICAgUHlPYmplY3QgKl9zZWxmOworICAgIFRYTkZvbnRNZW51T2JqZWN0IGl0c2VsZjsKKyAgICBjaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIFRYTkZvbnRNZW51T2JqX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKLQlpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOwotCSgoVFhORm9udE1lbnVPYmplY3RPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlyZXR1cm4gX3NlbGY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgVFhORm9udE1lbnVPYmpfQ29udmVydCwgJml0c2VsZikpIHJldHVybiBOVUxMOworICAgIGlmICgoX3NlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgKChUWE5Gb250TWVudU9iamVjdE9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIHJldHVybiBfc2VsZjsKIH0KIAogI2RlZmluZSBUWE5Gb250TWVudU9ial90cF9mcmVlIFB5T2JqZWN0X0RlbAogCiAKIFB5VHlwZU9iamVjdCBUWE5Gb250TWVudU9iamVjdF9UeXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQotCTAsIC8qb2Jfc2l6ZSovCi0JIl9NbHRlLlRYTkZvbnRNZW51T2JqZWN0IiwgLyp0cF9uYW1lKi8KLQlzaXplb2YoVFhORm9udE1lbnVPYmplY3RPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCi0JMCwgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKSBUWE5Gb250TWVudU9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsIC8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLwotCShjbXBmdW5jKSBUWE5Gb250TWVudU9ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYykgVFhORm9udE1lbnVPYmpfcmVwciwgLyp0cF9yZXByKi8KLQkoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCi0JKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpIFRYTkZvbnRNZW51T2JqX2hhc2gsIC8qdHBfaGFzaCovCi0JMCwgLyp0cF9jYWxsKi8KLQkwLCAvKnRwX3N0ciovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLwotCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCi0JMCwgLyp0cF9hc19idWZmZXIqLwotCVB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCTAsIC8qdHBfZG9jKi8KLQkwLCAvKnRwX3RyYXZlcnNlKi8KLQkwLCAvKnRwX2NsZWFyKi8KLQkwLCAvKnRwX3JpY2hjb21wYXJlKi8KLQkwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLQkwLCAvKnRwX2l0ZXIqLwotCTAsIC8qdHBfaXRlcm5leHQqLwotCVRYTkZvbnRNZW51T2JqX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KLQkwLCAvKnRwX21lbWJlcnMqLwotCVRYTkZvbnRNZW51T2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KLQkwLCAvKnRwX2Jhc2UqLwotCTAsIC8qdHBfZGljdCovCi0JMCwgLyp0cF9kZXNjcl9nZXQqLwotCTAsIC8qdHBfZGVzY3Jfc2V0Ki8KLQkwLCAvKnRwX2RpY3RvZmZzZXQqLwotCVRYTkZvbnRNZW51T2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KLQlUWE5Gb250TWVudU9ial90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KLQlUWE5Gb250TWVudU9ial90cF9uZXcsIC8qIHRwX25ldyAqLwotCVRYTkZvbnRNZW51T2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAvKm9iX3NpemUqLworICAgICJfTWx0ZS5UWE5Gb250TWVudU9iamVjdCIsIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKFRYTkZvbnRNZW51T2JqZWN0T2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLworICAgIDAsIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcikgVFhORm9udE1lbnVPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KKyAgICAoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KKyAgICAoY21wZnVuYykgVFhORm9udE1lbnVPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpIFRYTkZvbnRNZW51T2JqX3JlcHIsIC8qdHBfcmVwciovCisgICAgKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLworICAgIChQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKSBUWE5Gb250TWVudU9ial9oYXNoLCAvKnRwX2hhc2gqLworICAgIDAsIC8qdHBfY2FsbCovCisgICAgMCwgLyp0cF9zdHIqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KKyAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLworICAgIDAsIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAvKnRwX2RvYyovCisgICAgMCwgLyp0cF90cmF2ZXJzZSovCisgICAgMCwgLyp0cF9jbGVhciovCisgICAgMCwgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgLyp0cF9pdGVyKi8KKyAgICAwLCAvKnRwX2l0ZXJuZXh0Ki8KKyAgICBUWE5Gb250TWVudU9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCisgICAgMCwgLyp0cF9tZW1iZXJzKi8KKyAgICBUWE5Gb250TWVudU9ial9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCisgICAgMCwgLyp0cF9iYXNlKi8KKyAgICAwLCAvKnRwX2RpY3QqLworICAgIDAsIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICBUWE5Gb250TWVudU9ial90cF9pbml0LCAvKiB0cF9pbml0ICovCisgICAgVFhORm9udE1lbnVPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCisgICAgVFhORm9udE1lbnVPYmpfdHBfbmV3LCAvKiB0cF9uZXcgKi8KKyAgICBUWE5Gb250TWVudU9ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0gRW5kIG9iamVjdCB0eXBlIFRYTkZvbnRNZW51T2JqZWN0IC0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTE0NTgsMTY4ICsxNDU4LDE2OCBAQAogCiBzdGF0aWMgUHlPYmplY3QgKk1sdGVfVFhOTmV3T2JqZWN0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUZTU3BlYyAqIGlGaWxlU3BlYzsKLQlXaW5kb3dQdHIgaVdpbmRvdzsKLQlSZWN0IGlGcmFtZTsKLQlUWE5GcmFtZU9wdGlvbnMgaUZyYW1lT3B0aW9uczsKLQlUWE5GcmFtZVR5cGUgaUZyYW1lVHlwZTsKLQlUWE5GaWxlVHlwZSBpRmlsZVR5cGU7Ci0JVFhOUGVybWFuZW50VGV4dEVuY29kaW5nVHlwZSBpUGVybWFuZW50RW5jb2Rpbmc7Ci0JVFhOT2JqZWN0IG9UWE5PYmplY3Q7Ci0JVFhORnJhbWVJRCBvVFhORnJhbWVJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBGU1NwZWMgKiBpRmlsZVNwZWM7CisgICAgV2luZG93UHRyIGlXaW5kb3c7CisgICAgUmVjdCBpRnJhbWU7CisgICAgVFhORnJhbWVPcHRpb25zIGlGcmFtZU9wdGlvbnM7CisgICAgVFhORnJhbWVUeXBlIGlGcmFtZVR5cGU7CisgICAgVFhORmlsZVR5cGUgaUZpbGVUeXBlOworICAgIFRYTlBlcm1hbmVudFRleHRFbmNvZGluZ1R5cGUgaVBlcm1hbmVudEVuY29kaW5nOworICAgIFRYTk9iamVjdCBvVFhOT2JqZWN0OworICAgIFRYTkZyYW1lSUQgb1RYTkZyYW1lSUQ7CiAjaWZuZGVmIFRYTk5ld09iamVjdAotCVB5TWFjX1BSRUNIRUNLKFRYTk5ld09iamVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhOTmV3T2JqZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmxsTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgT3B0RlNTcGVjUHRyX0NvbnZlcnQsICZpRmlsZVNwZWMsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaVdpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmlGcmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlGcmFtZU9wdGlvbnMsCi0JICAgICAgICAgICAgICAgICAgICAgICZpRnJhbWVUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpRmlsZVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZpUGVybWFuZW50RW5jb2RpbmcpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gVFhOTmV3T2JqZWN0KGlGaWxlU3BlYywKLQkgICAgICAgICAgICAgICAgICAgIGlXaW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAmaUZyYW1lLAotCSAgICAgICAgICAgICAgICAgICAgaUZyYW1lT3B0aW9ucywKLQkgICAgICAgICAgICAgICAgICAgIGlGcmFtZVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICBpRmlsZVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICBpUGVybWFuZW50RW5jb2RpbmcsCi0JICAgICAgICAgICAgICAgICAgICAmb1RYTk9iamVjdCwKLQkgICAgICAgICAgICAgICAgICAgICZvVFhORnJhbWVJRCwKLQkgICAgICAgICAgICAgICAgICAgIChUWE5PYmplY3RSZWZjb24pMCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICBUWE5PYmpfTmV3LCBvVFhOT2JqZWN0LAotCSAgICAgICAgICAgICAgICAgICAgIG9UWE5GcmFtZUlEKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZsbE8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdEZTU3BlY1B0cl9Db252ZXJ0LCAmaUZpbGVTcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmlXaW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpRnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpRnJhbWVPcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaUZyYW1lVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaUZpbGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaVBlcm1hbmVudEVuY29kaW5nKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFRYTk5ld09iamVjdChpRmlsZVNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICBpV2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgJmlGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlGcmFtZU9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICBpRnJhbWVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgaUZpbGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgaVBlcm1hbmVudEVuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgJm9UWE5PYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAmb1RYTkZyYW1lSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAoVFhOT2JqZWN0UmVmY29uKTApOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgVFhOT2JqX05ldywgb1RYTk9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvVFhORnJhbWVJRCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWx0ZV9UWE5UZXJtaW5hdGVUZXh0ZW5zaW9uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIFRYTlRlcm1pbmF0ZVRleHRlbnNpb24KLQlQeU1hY19QUkVDSEVDSyhUWE5UZXJtaW5hdGVUZXh0ZW5zaW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUWE5UZXJtaW5hdGVUZXh0ZW5zaW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlUWE5UZXJtaW5hdGVUZXh0ZW5zaW9uKCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBUWE5UZXJtaW5hdGVUZXh0ZW5zaW9uKCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1sdGVfVFhOSXNTY3JhcFBhc3RhYmxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CiAjaWZuZGVmIFRYTklzU2NyYXBQYXN0YWJsZQotCVB5TWFjX1BSRUNIRUNLKFRYTklzU2NyYXBQYXN0YWJsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhOSXNTY3JhcFBhc3RhYmxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBUWE5Jc1NjcmFwUGFzdGFibGUoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVFhOSXNTY3JhcFBhc3RhYmxlKCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWx0ZV9UWE5Db252ZXJ0VG9QdWJsaWNTY3JhcChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKICNpZm5kZWYgVFhOQ29udmVydFRvUHVibGljU2NyYXAKLQlQeU1hY19QUkVDSEVDSyhUWE5Db252ZXJ0VG9QdWJsaWNTY3JhcCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhOQ29udmVydFRvUHVibGljU2NyYXApOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBUWE5Db252ZXJ0VG9QdWJsaWNTY3JhcCgpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVFhOQ29udmVydFRvUHVibGljU2NyYXAoKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNbHRlX1RYTkNvbnZlcnRGcm9tUHVibGljU2NyYXAoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CiAjaWZuZGVmIFRYTkNvbnZlcnRGcm9tUHVibGljU2NyYXAKLQlQeU1hY19QUkVDSEVDSyhUWE5Db252ZXJ0RnJvbVB1YmxpY1NjcmFwKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUWE5Db252ZXJ0RnJvbVB1YmxpY1NjcmFwKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gVFhOQ29udmVydEZyb21QdWJsaWNTY3JhcCgpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVFhOQ29udmVydEZyb21QdWJsaWNTY3JhcCgpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1sdGVfVFhOTmV3Rm9udE1lbnVPYmplY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JTWVudUhhbmRsZSBpRm9udE1lbnVIYW5kbGU7Ci0JU0ludDE2IGlNZW51SUQ7Ci0JU0ludDE2IGlTdGFydEhpZXJNZW51SUQ7Ci0JVFhORm9udE1lbnVPYmplY3Qgb1RYTkZvbnRNZW51T2JqZWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIE1lbnVIYW5kbGUgaUZvbnRNZW51SGFuZGxlOworICAgIFNJbnQxNiBpTWVudUlEOworICAgIFNJbnQxNiBpU3RhcnRIaWVyTWVudUlEOworICAgIFRYTkZvbnRNZW51T2JqZWN0IG9UWE5Gb250TWVudU9iamVjdDsKICNpZm5kZWYgVFhOTmV3Rm9udE1lbnVPYmplY3QKLQlQeU1hY19QUkVDSEVDSyhUWE5OZXdGb250TWVudU9iamVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhOTmV3Rm9udE1lbnVPYmplY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgIE1lbnVPYmpfQ29udmVydCwgJmlGb250TWVudUhhbmRsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlNZW51SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICZpU3RhcnRIaWVyTWVudUlEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFRYTk5ld0ZvbnRNZW51T2JqZWN0KGlGb250TWVudUhhbmRsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgaU1lbnVJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgaVN0YXJ0SGllck1lbnVJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9UWE5Gb250TWVudU9iamVjdCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFRYTkZvbnRNZW51T2JqX05ldywgb1RYTkZvbnRNZW51T2JqZWN0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTWVudU9ial9Db252ZXJ0LCAmaUZvbnRNZW51SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaU1lbnVJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlTdGFydEhpZXJNZW51SUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVFhOTmV3Rm9udE1lbnVPYmplY3QoaUZvbnRNZW51SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpTWVudUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpU3RhcnRIaWVyTWVudUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb1RYTkZvbnRNZW51T2JqZWN0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgVFhORm9udE1lbnVPYmpfTmV3LCBvVFhORm9udE1lbnVPYmplY3QpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1sdGVfVFhOVmVyc2lvbkluZm9ybWF0aW9uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlUWE5WZXJzaW9uVmFsdWUgX3J2OwotCVRYTkZlYXR1cmVCaXRzIG9GZWF0dXJlRmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFRYTlZlcnNpb25WYWx1ZSBfcnY7CisgICAgVFhORmVhdHVyZUJpdHMgb0ZlYXR1cmVGbGFnczsKICNpZm5kZWYgVFhOVmVyc2lvbkluZm9ybWF0aW9uCi0JUHlNYWNfUFJFQ0hFQ0soVFhOVmVyc2lvbkluZm9ybWF0aW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUWE5WZXJzaW9uSW5mb3JtYXRpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFRYTlZlcnNpb25JbmZvcm1hdGlvbigmb0ZlYXR1cmVGbGFncyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgb0ZlYXR1cmVGbGFncyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFRYTlZlcnNpb25JbmZvcm1hdGlvbigmb0ZlYXR1cmVGbGFncyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgb0ZlYXR1cmVGbGFncyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWx0ZV9UWE5Jbml0VGV4dGVuc2lvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogCi0JT1NTdGF0dXMgX2VycjsKLQlUWE5NYWNPU1ByZWZlcnJlZEZvbnREZXNjcmlwdGlvbiAqIGlEZWZhdWx0Rm9udHMgPSBOVUxMOwotCUl0ZW1Db3VudCBpQ291bnREZWZhdWx0Rm9udHMgPSAwOwotCVRYTkluaXRPcHRpb25zIGlVc2FnZUZsYWdzOwotCVB5TWFjX1BSRUNIRUNLKFRYTkluaXRUZXh0ZW5zaW9uKTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwgJmlVc2FnZUZsYWdzKSkKLQkgICAgICAgIHJldHVybiBOVUxMOwotCV9lcnIgPSBUWE5Jbml0VGV4dGVuc2lvbihpRGVmYXVsdEZvbnRzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBpQ291bnREZWZhdWx0Rm9udHMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGlVc2FnZUZsYWdzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFRYTk1hY09TUHJlZmVycmVkRm9udERlc2NyaXB0aW9uICogaURlZmF1bHRGb250cyA9IE5VTEw7CisgICAgSXRlbUNvdW50IGlDb3VudERlZmF1bHRGb250cyA9IDA7CisgICAgVFhOSW5pdE9wdGlvbnMgaVVzYWdlRmxhZ3M7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhOSW5pdFRleHRlbnNpb24pOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLCAmaVVzYWdlRmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVFhOSW5pdFRleHRlbnNpb24oaURlZmF1bHRGb250cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaUNvdW50RGVmYXVsdEZvbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpVXNhZ2VGbGFncyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiAKIH0KIApAQCAtMTYyNywyNCArMTYyNywyNCBAQAogCiBzdGF0aWMgUHlNZXRob2REZWYgTWx0ZV9tZXRob2RzW10gPSB7CiAjaWZuZGVmIF9fTFA2NF9fCi0JeyJUWE5OZXdPYmplY3QiLCAoUHlDRnVuY3Rpb24pTWx0ZV9UWE5OZXdPYmplY3QsIDEsCi0JIFB5RG9jX1NUUigiKEZTU3BlYyAqIGlGaWxlU3BlYywgV2luZG93UHRyIGlXaW5kb3csIFJlY3QgaUZyYW1lLCBUWE5GcmFtZU9wdGlvbnMgaUZyYW1lT3B0aW9ucywgVFhORnJhbWVUeXBlIGlGcmFtZVR5cGUsIFRYTkZpbGVUeXBlIGlGaWxlVHlwZSwgVFhOUGVybWFuZW50VGV4dEVuY29kaW5nVHlwZSBpUGVybWFuZW50RW5jb2RpbmcpIC0+IChUWE5PYmplY3Qgb1RYTk9iamVjdCwgVFhORnJhbWVJRCBvVFhORnJhbWVJRCkiKX0sCi0JeyJUWE5UZXJtaW5hdGVUZXh0ZW5zaW9uIiwgKFB5Q0Z1bmN0aW9uKU1sdGVfVFhOVGVybWluYXRlVGV4dGVuc2lvbiwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiVFhOSXNTY3JhcFBhc3RhYmxlIiwgKFB5Q0Z1bmN0aW9uKU1sdGVfVFhOSXNTY3JhcFBhc3RhYmxlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJUWE5Db252ZXJ0VG9QdWJsaWNTY3JhcCIsIChQeUNGdW5jdGlvbilNbHRlX1RYTkNvbnZlcnRUb1B1YmxpY1NjcmFwLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJUWE5Db252ZXJ0RnJvbVB1YmxpY1NjcmFwIiwgKFB5Q0Z1bmN0aW9uKU1sdGVfVFhOQ29udmVydEZyb21QdWJsaWNTY3JhcCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiVFhOTmV3Rm9udE1lbnVPYmplY3QiLCAoUHlDRnVuY3Rpb24pTWx0ZV9UWE5OZXdGb250TWVudU9iamVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoTWVudUhhbmRsZSBpRm9udE1lbnVIYW5kbGUsIFNJbnQxNiBpTWVudUlELCBTSW50MTYgaVN0YXJ0SGllck1lbnVJRCkgLT4gKFRYTkZvbnRNZW51T2JqZWN0IG9UWE5Gb250TWVudU9iamVjdCkiKX0sCi0JeyJUWE5WZXJzaW9uSW5mb3JtYXRpb24iLCAoUHlDRnVuY3Rpb24pTWx0ZV9UWE5WZXJzaW9uSW5mb3JtYXRpb24sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFRYTlZlcnNpb25WYWx1ZSBfcnYsIFRYTkZlYXR1cmVCaXRzIG9GZWF0dXJlRmxhZ3MpIil9LAotCXsiVFhOSW5pdFRleHRlbnNpb24iLCAoUHlDRnVuY3Rpb24pTWx0ZV9UWE5Jbml0VGV4dGVuc2lvbiwgMSwKLQkgUHlEb2NfU1RSKCIoVFhOSW5pdE9wdGlvbnMpIC0+IE5vbmUiKX0sCisgICAgeyJUWE5OZXdPYmplY3QiLCAoUHlDRnVuY3Rpb24pTWx0ZV9UWE5OZXdPYmplY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKEZTU3BlYyAqIGlGaWxlU3BlYywgV2luZG93UHRyIGlXaW5kb3csIFJlY3QgaUZyYW1lLCBUWE5GcmFtZU9wdGlvbnMgaUZyYW1lT3B0aW9ucywgVFhORnJhbWVUeXBlIGlGcmFtZVR5cGUsIFRYTkZpbGVUeXBlIGlGaWxlVHlwZSwgVFhOUGVybWFuZW50VGV4dEVuY29kaW5nVHlwZSBpUGVybWFuZW50RW5jb2RpbmcpIC0+IChUWE5PYmplY3Qgb1RYTk9iamVjdCwgVFhORnJhbWVJRCBvVFhORnJhbWVJRCkiKX0sCisgICAgeyJUWE5UZXJtaW5hdGVUZXh0ZW5zaW9uIiwgKFB5Q0Z1bmN0aW9uKU1sdGVfVFhOVGVybWluYXRlVGV4dGVuc2lvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiVFhOSXNTY3JhcFBhc3RhYmxlIiwgKFB5Q0Z1bmN0aW9uKU1sdGVfVFhOSXNTY3JhcFBhc3RhYmxlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJUWE5Db252ZXJ0VG9QdWJsaWNTY3JhcCIsIChQeUNGdW5jdGlvbilNbHRlX1RYTkNvbnZlcnRUb1B1YmxpY1NjcmFwLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJUWE5Db252ZXJ0RnJvbVB1YmxpY1NjcmFwIiwgKFB5Q0Z1bmN0aW9uKU1sdGVfVFhOQ29udmVydEZyb21QdWJsaWNTY3JhcCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiVFhOTmV3Rm9udE1lbnVPYmplY3QiLCAoUHlDRnVuY3Rpb24pTWx0ZV9UWE5OZXdGb250TWVudU9iamVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUhhbmRsZSBpRm9udE1lbnVIYW5kbGUsIFNJbnQxNiBpTWVudUlELCBTSW50MTYgaVN0YXJ0SGllck1lbnVJRCkgLT4gKFRYTkZvbnRNZW51T2JqZWN0IG9UWE5Gb250TWVudU9iamVjdCkiKX0sCisgICAgeyJUWE5WZXJzaW9uSW5mb3JtYXRpb24iLCAoUHlDRnVuY3Rpb24pTWx0ZV9UWE5WZXJzaW9uSW5mb3JtYXRpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFRYTlZlcnNpb25WYWx1ZSBfcnYsIFRYTkZlYXR1cmVCaXRzIG9GZWF0dXJlRmxhZ3MpIil9LAorICAgIHsiVFhOSW5pdFRleHRlbnNpb24iLCAoUHlDRnVuY3Rpb24pTWx0ZV9UWE5Jbml0VGV4dGVuc2lvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVFhOSW5pdE9wdGlvbnMpIC0+IE5vbmUiKX0sCiAjZW5kaWYgLyogX19MUDY0X18gKi8KLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKIApAQCAtMTY1MiwzNyArMTY1MiwzNyBAQAogCiB2b2lkIGluaXRfTWx0ZSh2b2lkKQogewotCVB5T2JqZWN0ICptOworICAgIFB5T2JqZWN0ICptOwogI2lmbmRlZiBfX0xQNjRfXwotCVB5T2JqZWN0ICpkOworICAgIFB5T2JqZWN0ICpkOwogCiAKIAotCS8vICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoeHh4eCk7CisgICAgLy8gICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyh4eHh4KTsKIAogI2VuZGlmIC8qIF9fTFA2NF9fICovCiAKLQltID0gUHlfSW5pdE1vZHVsZSgiX01sdGUiLCBNbHRlX21ldGhvZHMpOworICAgIG0gPSBQeV9Jbml0TW9kdWxlKCJfTWx0ZSIsIE1sdGVfbWV0aG9kcyk7CiAjaWZuZGVmIF9fTFA2NF9fCi0JZCA9IFB5TW9kdWxlX0dldERpY3QobSk7Ci0JTWx0ZV9FcnJvciA9IFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCk7Ci0JaWYgKE1sdGVfRXJyb3IgPT0gTlVMTCB8fAotCSAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRXJyb3IiLCBNbHRlX0Vycm9yKSAhPSAwKQotCQlyZXR1cm47Ci0JVFhOT2JqZWN0X1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKLQlpZiAoUHlUeXBlX1JlYWR5KCZUWE5PYmplY3RfVHlwZSkgPCAwKSByZXR1cm47Ci0JUHlfSU5DUkVGKCZUWE5PYmplY3RfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJUWE5PYmplY3QiLCAoUHlPYmplY3QgKikmVFhOT2JqZWN0X1R5cGUpOwotCS8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLwotCVB5X0lOQ1JFRigmVFhOT2JqZWN0X1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiVFhOT2JqZWN0VHlwZSIsIChQeU9iamVjdCAqKSZUWE5PYmplY3RfVHlwZSk7Ci0JVFhORm9udE1lbnVPYmplY3RfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCWlmIChQeVR5cGVfUmVhZHkoJlRYTkZvbnRNZW51T2JqZWN0X1R5cGUpIDwgMCkgcmV0dXJuOwotCVB5X0lOQ1JFRigmVFhORm9udE1lbnVPYmplY3RfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJUWE5Gb250TWVudU9iamVjdCIsIChQeU9iamVjdCAqKSZUWE5Gb250TWVudU9iamVjdF9UeXBlKTsKLQkvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KLQlQeV9JTkNSRUYoJlRYTkZvbnRNZW51T2JqZWN0X1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiVFhORm9udE1lbnVPYmplY3RUeXBlIiwgKFB5T2JqZWN0ICopJlRYTkZvbnRNZW51T2JqZWN0X1R5cGUpOworICAgIGQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOworICAgIE1sdGVfRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOworICAgIGlmIChNbHRlX0Vycm9yID09IE5VTEwgfHwKKyAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVycm9yIiwgTWx0ZV9FcnJvcikgIT0gMCkKKyAgICAgICAgcmV0dXJuOworICAgIFRYTk9iamVjdF9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmVFhOT2JqZWN0X1R5cGUpIDwgMCkgcmV0dXJuOworICAgIFB5X0lOQ1JFRigmVFhOT2JqZWN0X1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiVFhOT2JqZWN0IiwgKFB5T2JqZWN0ICopJlRYTk9iamVjdF9UeXBlKTsKKyAgICAvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KKyAgICBQeV9JTkNSRUYoJlRYTk9iamVjdF9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIlRYTk9iamVjdFR5cGUiLCAoUHlPYmplY3QgKikmVFhOT2JqZWN0X1R5cGUpOworICAgIFRYTkZvbnRNZW51T2JqZWN0X1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZUWE5Gb250TWVudU9iamVjdF9UeXBlKSA8IDApIHJldHVybjsKKyAgICBQeV9JTkNSRUYoJlRYTkZvbnRNZW51T2JqZWN0X1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiVFhORm9udE1lbnVPYmplY3QiLCAoUHlPYmplY3QgKikmVFhORm9udE1lbnVPYmplY3RfVHlwZSk7CisgICAgLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCisgICAgUHlfSU5DUkVGKCZUWE5Gb250TWVudU9iamVjdF9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIlRYTkZvbnRNZW51T2JqZWN0VHlwZSIsIChQeU9iamVjdCAqKSZUWE5Gb250TWVudU9iamVjdF9UeXBlKTsKICNlbmRpZiAvKiBfX0xQNjRfXyAqLwogfQogCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9vc2EvX09TQW1vZHVsZS5jIGIvTWFjL01vZHVsZXMvb3NhL19PU0Ftb2R1bGUuYwppbmRleCBhYjMwMzIwLi4xMGRkMGZmIDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9vc2EvX09TQW1vZHVsZS5jCisrKyBiL01hYy9Nb2R1bGVzL29zYS9fT1NBbW9kdWxlLmMKQEAgLTksOSArOSw5IEBACiAKIC8qIE1hY3JvIHRvIHRlc3Qgd2hldGhlciBhIHdlYWstbG9hZGVkIENGTSBmdW5jdGlvbiBleGlzdHMgKi8KICNkZWZpbmUgUHlNYWNfUFJFQ0hFQ0socnRuKSBkbyB7IGlmICggJnJ0biA9PSBOVUxMICkgIHtcCi0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yLCBcCi0gICAgICAgICJOb3QgYXZhaWxhYmxlIGluIHRoaXMgc2hhcmVkIGxpYnJhcnkvT1MgdmVyc2lvbiIpOyBcCi0gICAgICAgIHJldHVybiBOVUxMOyBcCisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsIFwKKyAgICAiTm90IGF2YWlsYWJsZSBpbiB0aGlzIHNoYXJlZCBsaWJyYXJ5L09TIHZlcnNpb24iKTsgXAorICAgIHJldHVybiBOVUxMOyBcCiAgICAgfX0gd2hpbGUoMCkKIAogCkBAIC0zNyw3NTMgKzM3LDc1MyBAQAogI2RlZmluZSBPU0FPYmpfQ2hlY2soeCkgKCh4KS0+b2JfdHlwZSA9PSAmT1NBQ29tcG9uZW50SW5zdGFuY2VfVHlwZSB8fCBQeU9iamVjdF9UeXBlQ2hlY2soKHgpLCAmT1NBQ29tcG9uZW50SW5zdGFuY2VfVHlwZSkpCiAKIHR5cGVkZWYgc3RydWN0IE9TQUNvbXBvbmVudEluc3RhbmNlT2JqZWN0IHsKLQlQeU9iamVjdF9IRUFECi0JQ29tcG9uZW50SW5zdGFuY2Ugb2JfaXRzZWxmOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBDb21wb25lbnRJbnN0YW5jZSBvYl9pdHNlbGY7CiB9IE9TQUNvbXBvbmVudEluc3RhbmNlT2JqZWN0OwogCiBQeU9iamVjdCAqT1NBT2JqX05ldyhDb21wb25lbnRJbnN0YW5jZSBpdHNlbGYpCiB7Ci0JT1NBQ29tcG9uZW50SW5zdGFuY2VPYmplY3QgKml0OwotCWlmIChpdHNlbGYgPT0gTlVMTCkgewotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKE9TQV9FcnJvciwiTlVMTCBDb21wb25lbnRJbnN0YW5jZSIpOwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgfQotCWl0ID0gUHlPYmplY3RfTkVXKE9TQUNvbXBvbmVudEluc3RhbmNlT2JqZWN0LCAmT1NBQ29tcG9uZW50SW5zdGFuY2VfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOwotCWl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIE9TQUNvbXBvbmVudEluc3RhbmNlT2JqZWN0ICppdDsKKyAgICBpZiAoaXRzZWxmID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhPU0FfRXJyb3IsIk5VTEwgQ29tcG9uZW50SW5zdGFuY2UiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICBpdCA9IFB5T2JqZWN0X05FVyhPU0FDb21wb25lbnRJbnN0YW5jZU9iamVjdCwgJk9TQUNvbXBvbmVudEluc3RhbmNlX1R5cGUpOworICAgIGlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICBpdC0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIHJldHVybiAoUHlPYmplY3QgKilpdDsKIH0KIAogaW50IE9TQU9ial9Db252ZXJ0KFB5T2JqZWN0ICp2LCBDb21wb25lbnRJbnN0YW5jZSAqcF9pdHNlbGYpCiB7CiAKLQkgICAgICAgICAgICAgICAgaWYgKENtcEluc3RPYmpfQ29udmVydCh2LCBwX2l0c2VsZikpCi0JICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0JICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7Ci0JICAgICAgICAgICAgICAgIAotCWlmICghT1NBT2JqX0NoZWNrKHYpKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIk9TQUNvbXBvbmVudEluc3RhbmNlIHJlcXVpcmVkIik7Ci0JCXJldHVybiAwOwotCX0KLQkqcF9pdHNlbGYgPSAoKE9TQUNvbXBvbmVudEluc3RhbmNlT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKLQlyZXR1cm4gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChDbXBJbnN0T2JqX0NvbnZlcnQodiwgcF9pdHNlbGYpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisKKyAgICBpZiAoIU9TQU9ial9DaGVjayh2KSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJPU0FDb21wb25lbnRJbnN0YW5jZSByZXF1aXJlZCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgKnBfaXRzZWxmID0gKChPU0FDb21wb25lbnRJbnN0YW5jZU9iamVjdCAqKXYpLT5vYl9pdHNlbGY7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyB2b2lkIE9TQU9ial9kZWFsbG9jKE9TQUNvbXBvbmVudEluc3RhbmNlT2JqZWN0ICpzZWxmKQogewotCS8qIENsZWFudXAgb2Ygc2VsZi0+b2JfaXRzZWxmIGdvZXMgaGVyZSAqLwotCXNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CisgICAgLyogQ2xlYW51cCBvZiBzZWxmLT5vYl9pdHNlbGYgZ29lcyBoZXJlICovCisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpPU0FPYmpfT1NBTG9hZChPU0FDb21wb25lbnRJbnN0YW5jZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NBRXJyb3IgX2VycjsKLQlBRURlc2Mgc2NyaXB0RGF0YTsKLQlsb25nIG1vZGVGbGFnczsKLQlPU0FJRCByZXN1bHRpbmdTY3JpcHRJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NBRXJyb3IgX2VycjsKKyAgICBBRURlc2Mgc2NyaXB0RGF0YTsKKyAgICBsb25nIG1vZGVGbGFnczsKKyAgICBPU0FJRCByZXN1bHRpbmdTY3JpcHRJRDsKICNpZm5kZWYgT1NBTG9hZAotCVB5TWFjX1BSRUNIRUNLKE9TQUxvYWQpOworICAgIFB5TWFjX1BSRUNIRUNLKE9TQUxvYWQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX0NvbnZlcnQsICZzY3JpcHREYXRhLAotCSAgICAgICAgICAgICAgICAgICAgICAmbW9kZUZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IE9TQUxvYWQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAmc2NyaXB0RGF0YSwKLQkgICAgICAgICAgICAgICBtb2RlRmxhZ3MsCi0JICAgICAgICAgICAgICAgJnJlc3VsdGluZ1NjcmlwdElEKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICByZXN1bHRpbmdTY3JpcHRJRCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX0NvbnZlcnQsICZzY3JpcHREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbW9kZUZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IE9TQUxvYWQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAmc2NyaXB0RGF0YSwKKyAgICAgICAgICAgICAgICAgICBtb2RlRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgJnJlc3VsdGluZ1NjcmlwdElEKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRpbmdTY3JpcHRJRCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqT1NBT2JqX09TQVN0b3JlKE9TQUNvbXBvbmVudEluc3RhbmNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0FFcnJvciBfZXJyOwotCU9TQUlEIHNjcmlwdElEOwotCURlc2NUeXBlIGRlc2lyZWRUeXBlOwotCWxvbmcgbW9kZUZsYWdzOwotCUFFRGVzYyByZXN1bHRpbmdTY3JpcHREYXRhOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0FFcnJvciBfZXJyOworICAgIE9TQUlEIHNjcmlwdElEOworICAgIERlc2NUeXBlIGRlc2lyZWRUeXBlOworICAgIGxvbmcgbW9kZUZsYWdzOworICAgIEFFRGVzYyByZXN1bHRpbmdTY3JpcHREYXRhOwogI2lmbmRlZiBPU0FTdG9yZQotCVB5TWFjX1BSRUNIRUNLKE9TQVN0b3JlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhPU0FTdG9yZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNjcmlwdElELAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkZXNpcmVkVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vZGVGbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBPU0FTdG9yZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICBzY3JpcHRJRCwKLQkgICAgICAgICAgICAgICAgZGVzaXJlZFR5cGUsCi0JICAgICAgICAgICAgICAgIG1vZGVGbGFncywKLQkgICAgICAgICAgICAgICAgJnJlc3VsdGluZ1NjcmlwdERhdGEpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBBRURlc2NfTmV3LCAmcmVzdWx0aW5nU2NyaXB0RGF0YSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzY3JpcHRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGVzaXJlZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtb2RlRmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gT1NBU3RvcmUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgc2NyaXB0SUQsCisgICAgICAgICAgICAgICAgICAgIGRlc2lyZWRUeXBlLAorICAgICAgICAgICAgICAgICAgICBtb2RlRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICZyZXN1bHRpbmdTY3JpcHREYXRhKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX05ldywgJnJlc3VsdGluZ1NjcmlwdERhdGEpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk9TQU9ial9PU0FFeGVjdXRlKE9TQUNvbXBvbmVudEluc3RhbmNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0FFcnJvciBfZXJyOwotCU9TQUlEIGNvbXBpbGVkU2NyaXB0SUQ7Ci0JT1NBSUQgY29udGV4dElEOwotCWxvbmcgbW9kZUZsYWdzOwotCU9TQUlEIHJlc3VsdGluZ1NjcmlwdFZhbHVlSUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TQUVycm9yIF9lcnI7CisgICAgT1NBSUQgY29tcGlsZWRTY3JpcHRJRDsKKyAgICBPU0FJRCBjb250ZXh0SUQ7CisgICAgbG9uZyBtb2RlRmxhZ3M7CisgICAgT1NBSUQgcmVzdWx0aW5nU2NyaXB0VmFsdWVJRDsKICNpZm5kZWYgT1NBRXhlY3V0ZQotCVB5TWFjX1BSRUNIRUNLKE9TQUV4ZWN1dGUpOworICAgIFB5TWFjX1BSRUNIRUNLKE9TQUV4ZWN1dGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNvbXBpbGVkU2NyaXB0SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICZjb250ZXh0SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICZtb2RlRmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gT1NBRXhlY3V0ZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgIGNvbXBpbGVkU2NyaXB0SUQsCi0JICAgICAgICAgICAgICAgICAgY29udGV4dElELAotCSAgICAgICAgICAgICAgICAgIG1vZGVGbGFncywKLQkgICAgICAgICAgICAgICAgICAmcmVzdWx0aW5nU2NyaXB0VmFsdWVJRCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgcmVzdWx0aW5nU2NyaXB0VmFsdWVJRCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbXBpbGVkU2NyaXB0SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjb250ZXh0SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtb2RlRmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gT1NBRXhlY3V0ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGVkU2NyaXB0SUQsCisgICAgICAgICAgICAgICAgICAgICAgY29udGV4dElELAorICAgICAgICAgICAgICAgICAgICAgIG1vZGVGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0aW5nU2NyaXB0VmFsdWVJRCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0aW5nU2NyaXB0VmFsdWVJRCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqT1NBT2JqX09TQURpc3BsYXkoT1NBQ29tcG9uZW50SW5zdGFuY2VPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TQUVycm9yIF9lcnI7Ci0JT1NBSUQgc2NyaXB0VmFsdWVJRDsKLQlEZXNjVHlwZSBkZXNpcmVkVHlwZTsKLQlsb25nIG1vZGVGbGFnczsKLQlBRURlc2MgcmVzdWx0aW5nVGV4dDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NBRXJyb3IgX2VycjsKKyAgICBPU0FJRCBzY3JpcHRWYWx1ZUlEOworICAgIERlc2NUeXBlIGRlc2lyZWRUeXBlOworICAgIGxvbmcgbW9kZUZsYWdzOworICAgIEFFRGVzYyByZXN1bHRpbmdUZXh0OwogI2lmbmRlZiBPU0FEaXNwbGF5Ci0JUHlNYWNfUFJFQ0hFQ0soT1NBRGlzcGxheSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soT1NBRGlzcGxheSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNjcmlwdFZhbHVlSUQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRlc2lyZWRUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAmbW9kZUZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IE9TQURpc3BsYXkoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICBzY3JpcHRWYWx1ZUlELAotCSAgICAgICAgICAgICAgICAgIGRlc2lyZWRUeXBlLAotCSAgICAgICAgICAgICAgICAgIG1vZGVGbGFncywKLQkgICAgICAgICAgICAgICAgICAmcmVzdWx0aW5nVGV4dCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19OZXcsICZyZXN1bHRpbmdUZXh0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNjcmlwdFZhbHVlSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRlc2lyZWRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbW9kZUZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IE9TQURpc3BsYXkoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRWYWx1ZUlELAorICAgICAgICAgICAgICAgICAgICAgIGRlc2lyZWRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgIG1vZGVGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0aW5nVGV4dCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19OZXcsICZyZXN1bHRpbmdUZXh0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpPU0FPYmpfT1NBU2NyaXB0RXJyb3IoT1NBQ29tcG9uZW50SW5zdGFuY2VPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TQUVycm9yIF9lcnI7Ci0JT1NUeXBlIHNlbGVjdG9yOwotCURlc2NUeXBlIGRlc2lyZWRUeXBlOwotCUFFRGVzYyByZXN1bHRpbmdFcnJvckRlc2NyaXB0aW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0FFcnJvciBfZXJyOworICAgIE9TVHlwZSBzZWxlY3RvcjsKKyAgICBEZXNjVHlwZSBkZXNpcmVkVHlwZTsKKyAgICBBRURlc2MgcmVzdWx0aW5nRXJyb3JEZXNjcmlwdGlvbjsKICNpZm5kZWYgT1NBU2NyaXB0RXJyb3IKLQlQeU1hY19QUkVDSEVDSyhPU0FTY3JpcHRFcnJvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soT1NBU2NyaXB0RXJyb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnNlbGVjdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkZXNpcmVkVHlwZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBPU0FTY3JpcHRFcnJvcihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RvciwKLQkgICAgICAgICAgICAgICAgICAgICAgZGVzaXJlZFR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHRpbmdFcnJvckRlc2NyaXB0aW9uKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX05ldywgJnJlc3VsdGluZ0Vycm9yRGVzY3JpcHRpb24pOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZzZWxlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGVzaXJlZFR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gT1NBU2NyaXB0RXJyb3IoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2lyZWRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0aW5nRXJyb3JEZXNjcmlwdGlvbik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19OZXcsICZyZXN1bHRpbmdFcnJvckRlc2NyaXB0aW9uKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpPU0FPYmpfT1NBRGlzcG9zZShPU0FDb21wb25lbnRJbnN0YW5jZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NBRXJyb3IgX2VycjsKLQlPU0FJRCBzY3JpcHRJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NBRXJyb3IgX2VycjsKKyAgICBPU0FJRCBzY3JpcHRJRDsKICNpZm5kZWYgT1NBRGlzcG9zZQotCVB5TWFjX1BSRUNIRUNLKE9TQURpc3Bvc2UpOworICAgIFB5TWFjX1BSRUNIRUNLKE9TQURpc3Bvc2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZzY3JpcHRJRCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBPU0FEaXNwb3NlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgc2NyaXB0SUQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2NyaXB0SUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gT1NBRGlzcG9zZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdElEKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpPU0FPYmpfT1NBU2V0U2NyaXB0SW5mbyhPU0FDb21wb25lbnRJbnN0YW5jZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NBRXJyb3IgX2VycjsKLQlPU0FJRCBzY3JpcHRJRDsKLQlPU1R5cGUgc2VsZWN0b3I7Ci0JbG9uZyB2YWx1ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NBRXJyb3IgX2VycjsKKyAgICBPU0FJRCBzY3JpcHRJRDsKKyAgICBPU1R5cGUgc2VsZWN0b3I7CisgICAgbG9uZyB2YWx1ZTsKICNpZm5kZWYgT1NBU2V0U2NyaXB0SW5mbwotCVB5TWFjX1BSRUNIRUNLKE9TQVNldFNjcmlwdEluZm8pOworICAgIFB5TWFjX1BSRUNIRUNLKE9TQVNldFNjcmlwdEluZm8pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZzY3JpcHRJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmc2VsZWN0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBPU0FTZXRTY3JpcHRJbmZvKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2NyaXB0SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnNlbGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gT1NBU2V0U2NyaXB0SW5mbyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpPU0FPYmpfT1NBR2V0U2NyaXB0SW5mbyhPU0FDb21wb25lbnRJbnN0YW5jZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NBRXJyb3IgX2VycjsKLQlPU0FJRCBzY3JpcHRJRDsKLQlPU1R5cGUgc2VsZWN0b3I7Ci0JbG9uZyByZXN1bHQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TQUVycm9yIF9lcnI7CisgICAgT1NBSUQgc2NyaXB0SUQ7CisgICAgT1NUeXBlIHNlbGVjdG9yOworICAgIGxvbmcgcmVzdWx0OwogI2lmbmRlZiBPU0FHZXRTY3JpcHRJbmZvCi0JUHlNYWNfUFJFQ0hFQ0soT1NBR2V0U2NyaXB0SW5mbyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soT1NBR2V0U2NyaXB0SW5mbyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2NyaXB0SUQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnNlbGVjdG9yKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IE9TQUdldFNjcmlwdEluZm8oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RvciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICByZXN1bHQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzY3JpcHRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmc2VsZWN0b3IpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gT1NBR2V0U2NyaXB0SW5mbyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqT1NBT2JqX09TQVNjcmlwdGluZ0NvbXBvbmVudE5hbWUoT1NBQ29tcG9uZW50SW5zdGFuY2VPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TQUVycm9yIF9lcnI7Ci0JQUVEZXNjIHJlc3VsdGluZ1NjcmlwdGluZ0NvbXBvbmVudE5hbWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TQUVycm9yIF9lcnI7CisgICAgQUVEZXNjIHJlc3VsdGluZ1NjcmlwdGluZ0NvbXBvbmVudE5hbWU7CiAjaWZuZGVmIE9TQVNjcmlwdGluZ0NvbXBvbmVudE5hbWUKLQlQeU1hY19QUkVDSEVDSyhPU0FTY3JpcHRpbmdDb21wb25lbnROYW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhPU0FTY3JpcHRpbmdDb21wb25lbnROYW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gT1NBU2NyaXB0aW5nQ29tcG9uZW50TmFtZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHRpbmdTY3JpcHRpbmdDb21wb25lbnROYW1lKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX05ldywgJnJlc3VsdGluZ1NjcmlwdGluZ0NvbXBvbmVudE5hbWUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gT1NBU2NyaXB0aW5nQ29tcG9uZW50TmFtZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHRpbmdTY3JpcHRpbmdDb21wb25lbnROYW1lKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX05ldywgJnJlc3VsdGluZ1NjcmlwdGluZ0NvbXBvbmVudE5hbWUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk9TQU9ial9PU0FDb21waWxlKE9TQUNvbXBvbmVudEluc3RhbmNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0FFcnJvciBfZXJyOwotCUFFRGVzYyBzb3VyY2VEYXRhOwotCWxvbmcgbW9kZUZsYWdzOwotCU9TQUlEIHByZXZpb3VzQW5kUmVzdWx0aW5nU2NyaXB0SUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TQUVycm9yIF9lcnI7CisgICAgQUVEZXNjIHNvdXJjZURhdGE7CisgICAgbG9uZyBtb2RlRmxhZ3M7CisgICAgT1NBSUQgcHJldmlvdXNBbmRSZXN1bHRpbmdTY3JpcHRJRDsKICNpZm5kZWYgT1NBQ29tcGlsZQotCVB5TWFjX1BSRUNIRUNLKE9TQUNvbXBpbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKE9TQUNvbXBpbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX0NvbnZlcnQsICZzb3VyY2VEYXRhLAotCSAgICAgICAgICAgICAgICAgICAgICAmbW9kZUZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IE9TQUNvbXBpbGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAmc291cmNlRGF0YSwKLQkgICAgICAgICAgICAgICAgICBtb2RlRmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgJnByZXZpb3VzQW5kUmVzdWx0aW5nU2NyaXB0SUQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzQW5kUmVzdWx0aW5nU2NyaXB0SUQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19Db252ZXJ0LCAmc291cmNlRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGVGbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBPU0FDb21waWxlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgJnNvdXJjZURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgbW9kZUZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICZwcmV2aW91c0FuZFJlc3VsdGluZ1NjcmlwdElEKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c0FuZFJlc3VsdGluZ1NjcmlwdElEKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpPU0FPYmpfT1NBQ29weUlEKE9TQUNvbXBvbmVudEluc3RhbmNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0FFcnJvciBfZXJyOwotCU9TQUlEIGZyb21JRDsKLQlPU0FJRCB0b0lEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0FFcnJvciBfZXJyOworICAgIE9TQUlEIGZyb21JRDsKKyAgICBPU0FJRCB0b0lEOwogI2lmbmRlZiBPU0FDb3B5SUQKLQlQeU1hY19QUkVDSEVDSyhPU0FDb3B5SUQpOworICAgIFB5TWFjX1BSRUNIRUNLKE9TQUNvcHlJRCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZyb21JRCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBPU0FDb3B5SUQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgIGZyb21JRCwKLQkgICAgICAgICAgICAgICAgICZ0b0lEKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICB0b0lEKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZyb21JRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBPU0FDb3B5SUQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgIGZyb21JRCwKKyAgICAgICAgICAgICAgICAgICAgICZ0b0lEKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0b0lEKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpPU0FPYmpfT1NBR2V0U291cmNlKE9TQUNvbXBvbmVudEluc3RhbmNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0FFcnJvciBfZXJyOwotCU9TQUlEIHNjcmlwdElEOwotCURlc2NUeXBlIGRlc2lyZWRUeXBlOwotCUFFRGVzYyByZXN1bHRpbmdTb3VyY2VEYXRhOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0FFcnJvciBfZXJyOworICAgIE9TQUlEIHNjcmlwdElEOworICAgIERlc2NUeXBlIGRlc2lyZWRUeXBlOworICAgIEFFRGVzYyByZXN1bHRpbmdTb3VyY2VEYXRhOwogI2lmbmRlZiBPU0FHZXRTb3VyY2UKLQlQeU1hY19QUkVDSEVDSyhPU0FHZXRTb3VyY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKE9TQUdldFNvdXJjZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2NyaXB0SUQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRlc2lyZWRUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IE9TQUdldFNvdXJjZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgc2NyaXB0SUQsCi0JICAgICAgICAgICAgICAgICAgICBkZXNpcmVkVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICZyZXN1bHRpbmdTb3VyY2VEYXRhKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX05ldywgJnJlc3VsdGluZ1NvdXJjZURhdGEpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzY3JpcHRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGVzaXJlZFR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gT1NBR2V0U291cmNlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc2lyZWRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdGluZ1NvdXJjZURhdGEpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBRURlc2NfTmV3LCAmcmVzdWx0aW5nU291cmNlRGF0YSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqT1NBT2JqX09TQUNvZXJjZUZyb21EZXNjKE9TQUNvbXBvbmVudEluc3RhbmNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0FFcnJvciBfZXJyOwotCUFFRGVzYyBzY3JpcHREYXRhOwotCWxvbmcgbW9kZUZsYWdzOwotCU9TQUlEIHJlc3VsdGluZ1NjcmlwdElEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0FFcnJvciBfZXJyOworICAgIEFFRGVzYyBzY3JpcHREYXRhOworICAgIGxvbmcgbW9kZUZsYWdzOworICAgIE9TQUlEIHJlc3VsdGluZ1NjcmlwdElEOwogI2lmbmRlZiBPU0FDb2VyY2VGcm9tRGVzYwotCVB5TWFjX1BSRUNIRUNLKE9TQUNvZXJjZUZyb21EZXNjKTsKKyAgICBQeU1hY19QUkVDSEVDSyhPU0FDb2VyY2VGcm9tRGVzYyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBBRURlc2NfQ29udmVydCwgJnNjcmlwdERhdGEsCi0JICAgICAgICAgICAgICAgICAgICAgICZtb2RlRmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gT1NBQ29lcmNlRnJvbURlc2MoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJnNjcmlwdERhdGEsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVGbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdGluZ1NjcmlwdElEKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICByZXN1bHRpbmdTY3JpcHRJRCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX0NvbnZlcnQsICZzY3JpcHREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbW9kZUZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IE9TQUNvZXJjZUZyb21EZXNjKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzY3JpcHREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHRpbmdTY3JpcHRJRCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0aW5nU2NyaXB0SUQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk9TQU9ial9PU0FDb2VyY2VUb0Rlc2MoT1NBQ29tcG9uZW50SW5zdGFuY2VPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TQUVycm9yIF9lcnI7Ci0JT1NBSUQgc2NyaXB0SUQ7Ci0JRGVzY1R5cGUgZGVzaXJlZFR5cGU7Ci0JbG9uZyBtb2RlRmxhZ3M7Ci0JQUVEZXNjIHJlc3VsdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NBRXJyb3IgX2VycjsKKyAgICBPU0FJRCBzY3JpcHRJRDsKKyAgICBEZXNjVHlwZSBkZXNpcmVkVHlwZTsKKyAgICBsb25nIG1vZGVGbGFnczsKKyAgICBBRURlc2MgcmVzdWx0OwogI2lmbmRlZiBPU0FDb2VyY2VUb0Rlc2MKLQlQeU1hY19QUkVDSEVDSyhPU0FDb2VyY2VUb0Rlc2MpOworICAgIFB5TWFjX1BSRUNIRUNLKE9TQUNvZXJjZVRvRGVzYyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNjcmlwdElELAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkZXNpcmVkVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vZGVGbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBPU0FDb2VyY2VUb0Rlc2MoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdElELAotCSAgICAgICAgICAgICAgICAgICAgICAgZGVzaXJlZFR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICBtb2RlRmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX05ldywgJnJlc3VsdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzY3JpcHRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGVzaXJlZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtb2RlRmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gT1NBQ29lcmNlVG9EZXNjKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2lyZWRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZUZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19OZXcsICZyZXN1bHQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk9TQU9ial9PU0FTZXREZWZhdWx0VGFyZ2V0KE9TQUNvbXBvbmVudEluc3RhbmNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0FFcnJvciBfZXJyOwotCUFFQWRkcmVzc0Rlc2MgdGFyZ2V0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0FFcnJvciBfZXJyOworICAgIEFFQWRkcmVzc0Rlc2MgdGFyZ2V0OwogI2lmbmRlZiBPU0FTZXREZWZhdWx0VGFyZ2V0Ci0JUHlNYWNfUFJFQ0hFQ0soT1NBU2V0RGVmYXVsdFRhcmdldCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soT1NBU2V0RGVmYXVsdFRhcmdldCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19Db252ZXJ0LCAmdGFyZ2V0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IE9TQVNldERlZmF1bHRUYXJnZXQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGFyZ2V0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19Db252ZXJ0LCAmdGFyZ2V0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IE9TQVNldERlZmF1bHRUYXJnZXQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGFyZ2V0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpPU0FPYmpfT1NBU3RhcnRSZWNvcmRpbmcoT1NBQ29tcG9uZW50SW5zdGFuY2VPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TQUVycm9yIF9lcnI7Ci0JT1NBSUQgY29tcGlsZWRTY3JpcHRUb01vZGlmeUlEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0FFcnJvciBfZXJyOworICAgIE9TQUlEIGNvbXBpbGVkU2NyaXB0VG9Nb2RpZnlJRDsKICNpZm5kZWYgT1NBU3RhcnRSZWNvcmRpbmcKLQlQeU1hY19QUkVDSEVDSyhPU0FTdGFydFJlY29yZGluZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soT1NBU3RhcnRSZWNvcmRpbmcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBPU0FTdGFydFJlY29yZGluZyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmY29tcGlsZWRTY3JpcHRUb01vZGlmeUlEKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBjb21waWxlZFNjcmlwdFRvTW9kaWZ5SUQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gT1NBU3RhcnRSZWNvcmRpbmcoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbXBpbGVkU2NyaXB0VG9Nb2RpZnlJRCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGlsZWRTY3JpcHRUb01vZGlmeUlEKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpPU0FPYmpfT1NBU3RvcFJlY29yZGluZyhPU0FDb21wb25lbnRJbnN0YW5jZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NBRXJyb3IgX2VycjsKLQlPU0FJRCBjb21waWxlZFNjcmlwdElEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0FFcnJvciBfZXJyOworICAgIE9TQUlEIGNvbXBpbGVkU2NyaXB0SUQ7CiAjaWZuZGVmIE9TQVN0b3BSZWNvcmRpbmcKLQlQeU1hY19QUkVDSEVDSyhPU0FTdG9wUmVjb3JkaW5nKTsKKyAgICBQeU1hY19QUkVDSEVDSyhPU0FTdG9wUmVjb3JkaW5nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmY29tcGlsZWRTY3JpcHRJRCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBPU0FTdG9wUmVjb3JkaW5nKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgY29tcGlsZWRTY3JpcHRJRCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjb21waWxlZFNjcmlwdElEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IE9TQVN0b3BSZWNvcmRpbmcoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21waWxlZFNjcmlwdElEKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpPU0FPYmpfT1NBTG9hZEV4ZWN1dGUoT1NBQ29tcG9uZW50SW5zdGFuY2VPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TQUVycm9yIF9lcnI7Ci0JQUVEZXNjIHNjcmlwdERhdGE7Ci0JT1NBSUQgY29udGV4dElEOwotCWxvbmcgbW9kZUZsYWdzOwotCU9TQUlEIHJlc3VsdGluZ1NjcmlwdFZhbHVlSUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TQUVycm9yIF9lcnI7CisgICAgQUVEZXNjIHNjcmlwdERhdGE7CisgICAgT1NBSUQgY29udGV4dElEOworICAgIGxvbmcgbW9kZUZsYWdzOworICAgIE9TQUlEIHJlc3VsdGluZ1NjcmlwdFZhbHVlSUQ7CiAjaWZuZGVmIE9TQUxvYWRFeGVjdXRlCi0JUHlNYWNfUFJFQ0hFQ0soT1NBTG9hZEV4ZWN1dGUpOworICAgIFB5TWFjX1BSRUNIRUNLKE9TQUxvYWRFeGVjdXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBBRURlc2NfQ29udmVydCwgJnNjcmlwdERhdGEsCi0JICAgICAgICAgICAgICAgICAgICAgICZjb250ZXh0SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICZtb2RlRmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gT1NBTG9hZEV4ZWN1dGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNjcmlwdERhdGEsCi0JICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHRJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgbW9kZUZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0aW5nU2NyaXB0VmFsdWVJRCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgcmVzdWx0aW5nU2NyaXB0VmFsdWVJRCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19Db252ZXJ0LCAmc2NyaXB0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbnRleHRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGVGbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBPU0FMb2FkRXhlY3V0ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2NyaXB0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dElELAorICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHRpbmdTY3JpcHRWYWx1ZUlEKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRpbmdTY3JpcHRWYWx1ZUlEKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpPU0FPYmpfT1NBQ29tcGlsZUV4ZWN1dGUoT1NBQ29tcG9uZW50SW5zdGFuY2VPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TQUVycm9yIF9lcnI7Ci0JQUVEZXNjIHNvdXJjZURhdGE7Ci0JT1NBSUQgY29udGV4dElEOwotCWxvbmcgbW9kZUZsYWdzOwotCU9TQUlEIHJlc3VsdGluZ1NjcmlwdFZhbHVlSUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TQUVycm9yIF9lcnI7CisgICAgQUVEZXNjIHNvdXJjZURhdGE7CisgICAgT1NBSUQgY29udGV4dElEOworICAgIGxvbmcgbW9kZUZsYWdzOworICAgIE9TQUlEIHJlc3VsdGluZ1NjcmlwdFZhbHVlSUQ7CiAjaWZuZGVmIE9TQUNvbXBpbGVFeGVjdXRlCi0JUHlNYWNfUFJFQ0hFQ0soT1NBQ29tcGlsZUV4ZWN1dGUpOworICAgIFB5TWFjX1BSRUNIRUNLKE9TQUNvbXBpbGVFeGVjdXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBBRURlc2NfQ29udmVydCwgJnNvdXJjZURhdGEsCi0JICAgICAgICAgICAgICAgICAgICAgICZjb250ZXh0SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICZtb2RlRmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gT1NBQ29tcGlsZUV4ZWN1dGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJnNvdXJjZURhdGEsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHRJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZUZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0aW5nU2NyaXB0VmFsdWVJRCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgcmVzdWx0aW5nU2NyaXB0VmFsdWVJRCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19Db252ZXJ0LCAmc291cmNlRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbnRleHRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGVGbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBPU0FDb21waWxlRXhlY3V0ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc291cmNlRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHRpbmdTY3JpcHRWYWx1ZUlEKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRpbmdTY3JpcHRWYWx1ZUlEKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpPU0FPYmpfT1NBRG9TY3JpcHQoT1NBQ29tcG9uZW50SW5zdGFuY2VPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TQUVycm9yIF9lcnI7Ci0JQUVEZXNjIHNvdXJjZURhdGE7Ci0JT1NBSUQgY29udGV4dElEOwotCURlc2NUeXBlIGRlc2lyZWRUeXBlOwotCWxvbmcgbW9kZUZsYWdzOwotCUFFRGVzYyByZXN1bHRpbmdUZXh0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0FFcnJvciBfZXJyOworICAgIEFFRGVzYyBzb3VyY2VEYXRhOworICAgIE9TQUlEIGNvbnRleHRJRDsKKyAgICBEZXNjVHlwZSBkZXNpcmVkVHlwZTsKKyAgICBsb25nIG1vZGVGbGFnczsKKyAgICBBRURlc2MgcmVzdWx0aW5nVGV4dDsKICNpZm5kZWYgT1NBRG9TY3JpcHQKLQlQeU1hY19QUkVDSEVDSyhPU0FEb1NjcmlwdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soT1NBRG9TY3JpcHQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX0NvbnZlcnQsICZzb3VyY2VEYXRhLAotCSAgICAgICAgICAgICAgICAgICAgICAmY29udGV4dElELAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkZXNpcmVkVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vZGVGbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBPU0FEb1NjcmlwdChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAmc291cmNlRGF0YSwKLQkgICAgICAgICAgICAgICAgICAgY29udGV4dElELAotCSAgICAgICAgICAgICAgICAgICBkZXNpcmVkVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgbW9kZUZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAmcmVzdWx0aW5nVGV4dCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19OZXcsICZyZXN1bHRpbmdUZXh0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBRURlc2NfQ29udmVydCwgJnNvdXJjZURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjb250ZXh0SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRlc2lyZWRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbW9kZUZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IE9TQURvU2NyaXB0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICZzb3VyY2VEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0SUQsCisgICAgICAgICAgICAgICAgICAgICAgIGRlc2lyZWRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICBtb2RlRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHRpbmdUZXh0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX05ldywgJnJlc3VsdGluZ1RleHQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk9TQU9ial9PU0FTZXRDdXJyZW50RGlhbGVjdChPU0FDb21wb25lbnRJbnN0YW5jZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NBRXJyb3IgX2VycjsKLQlzaG9ydCBkaWFsZWN0Q29kZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NBRXJyb3IgX2VycjsKKyAgICBzaG9ydCBkaWFsZWN0Q29kZTsKICNpZm5kZWYgT1NBU2V0Q3VycmVudERpYWxlY3QKLQlQeU1hY19QUkVDSEVDSyhPU0FTZXRDdXJyZW50RGlhbGVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soT1NBU2V0Q3VycmVudERpYWxlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZkaWFsZWN0Q29kZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBPU0FTZXRDdXJyZW50RGlhbGVjdChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWFsZWN0Q29kZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkaWFsZWN0Q29kZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBPU0FTZXRDdXJyZW50RGlhbGVjdChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWFsZWN0Q29kZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqT1NBT2JqX09TQUdldEN1cnJlbnREaWFsZWN0KE9TQUNvbXBvbmVudEluc3RhbmNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0FFcnJvciBfZXJyOwotCXNob3J0IHJlc3VsdGluZ0RpYWxlY3RDb2RlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0FFcnJvciBfZXJyOworICAgIHNob3J0IHJlc3VsdGluZ0RpYWxlY3RDb2RlOwogI2lmbmRlZiBPU0FHZXRDdXJyZW50RGlhbGVjdAotCVB5TWFjX1BSRUNIRUNLKE9TQUdldEN1cnJlbnREaWFsZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhPU0FHZXRDdXJyZW50RGlhbGVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IE9TQUdldEN1cnJlbnREaWFsZWN0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHRpbmdEaWFsZWN0Q29kZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgcmVzdWx0aW5nRGlhbGVjdENvZGUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gT1NBR2V0Q3VycmVudERpYWxlY3QoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdGluZ0RpYWxlY3RDb2RlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRpbmdEaWFsZWN0Q29kZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqT1NBT2JqX09TQUF2YWlsYWJsZURpYWxlY3RzKE9TQUNvbXBvbmVudEluc3RhbmNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0FFcnJvciBfZXJyOwotCUFFRGVzYyByZXN1bHRpbmdEaWFsZWN0SW5mb0xpc3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TQUVycm9yIF9lcnI7CisgICAgQUVEZXNjIHJlc3VsdGluZ0RpYWxlY3RJbmZvTGlzdDsKICNpZm5kZWYgT1NBQXZhaWxhYmxlRGlhbGVjdHMKLQlQeU1hY19QUkVDSEVDSyhPU0FBdmFpbGFibGVEaWFsZWN0cyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soT1NBQXZhaWxhYmxlRGlhbGVjdHMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBPU0FBdmFpbGFibGVEaWFsZWN0cyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0aW5nRGlhbGVjdEluZm9MaXN0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX05ldywgJnJlc3VsdGluZ0RpYWxlY3RJbmZvTGlzdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBPU0FBdmFpbGFibGVEaWFsZWN0cyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0aW5nRGlhbGVjdEluZm9MaXN0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX05ldywgJnJlc3VsdGluZ0RpYWxlY3RJbmZvTGlzdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqT1NBT2JqX09TQUdldERpYWxlY3RJbmZvKE9TQUNvbXBvbmVudEluc3RhbmNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0FFcnJvciBfZXJyOwotCXNob3J0IGRpYWxlY3RDb2RlOwotCU9TVHlwZSBzZWxlY3RvcjsKLQlBRURlc2MgcmVzdWx0aW5nRGlhbGVjdEluZm87CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TQUVycm9yIF9lcnI7CisgICAgc2hvcnQgZGlhbGVjdENvZGU7CisgICAgT1NUeXBlIHNlbGVjdG9yOworICAgIEFFRGVzYyByZXN1bHRpbmdEaWFsZWN0SW5mbzsKICNpZm5kZWYgT1NBR2V0RGlhbGVjdEluZm8KLQlQeU1hY19QUkVDSEVDSyhPU0FHZXREaWFsZWN0SW5mbyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soT1NBR2V0RGlhbGVjdEluZm8pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRpYWxlY3RDb2RlLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZzZWxlY3RvcikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBPU0FHZXREaWFsZWN0SW5mbyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBkaWFsZWN0Q29kZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHRpbmdEaWFsZWN0SW5mbyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19OZXcsICZyZXN1bHRpbmdEaWFsZWN0SW5mbyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRpYWxlY3RDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZzZWxlY3RvcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBPU0FHZXREaWFsZWN0SW5mbyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWFsZWN0Q29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHRpbmdEaWFsZWN0SW5mbyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19OZXcsICZyZXN1bHRpbmdEaWFsZWN0SW5mbyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqT1NBT2JqX09TQUF2YWlsYWJsZURpYWxlY3RDb2RlTGlzdChPU0FDb21wb25lbnRJbnN0YW5jZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NBRXJyb3IgX2VycjsKLQlBRURlc2MgcmVzdWx0aW5nRGlhbGVjdENvZGVMaXN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0FFcnJvciBfZXJyOworICAgIEFFRGVzYyByZXN1bHRpbmdEaWFsZWN0Q29kZUxpc3Q7CiAjaWZuZGVmIE9TQUF2YWlsYWJsZURpYWxlY3RDb2RlTGlzdAotCVB5TWFjX1BSRUNIRUNLKE9TQUF2YWlsYWJsZURpYWxlY3RDb2RlTGlzdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soT1NBQXZhaWxhYmxlRGlhbGVjdENvZGVMaXN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gT1NBQXZhaWxhYmxlRGlhbGVjdENvZGVMaXN0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0aW5nRGlhbGVjdENvZGVMaXN0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX05ldywgJnJlc3VsdGluZ0RpYWxlY3RDb2RlTGlzdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBPU0FBdmFpbGFibGVEaWFsZWN0Q29kZUxpc3QoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHRpbmdEaWFsZWN0Q29kZUxpc3QpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBRURlc2NfTmV3LCAmcmVzdWx0aW5nRGlhbGVjdENvZGVMaXN0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpPU0FPYmpfT1NBRXhlY3V0ZUV2ZW50KE9TQUNvbXBvbmVudEluc3RhbmNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0FFcnJvciBfZXJyOwotCUFwcGxlRXZlbnQgdGhlQXBwbGVFdmVudDsKLQlPU0FJRCBjb250ZXh0SUQ7Ci0JbG9uZyBtb2RlRmxhZ3M7Ci0JT1NBSUQgcmVzdWx0aW5nU2NyaXB0VmFsdWVJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NBRXJyb3IgX2VycjsKKyAgICBBcHBsZUV2ZW50IHRoZUFwcGxlRXZlbnQ7CisgICAgT1NBSUQgY29udGV4dElEOworICAgIGxvbmcgbW9kZUZsYWdzOworICAgIE9TQUlEIHJlc3VsdGluZ1NjcmlwdFZhbHVlSUQ7CiAjaWZuZGVmIE9TQUV4ZWN1dGVFdmVudAotCVB5TWFjX1BSRUNIRUNLKE9TQUV4ZWN1dGVFdmVudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soT1NBRXhlY3V0ZUV2ZW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBBRURlc2NfQ29udmVydCwgJnRoZUFwcGxlRXZlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICZjb250ZXh0SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICZtb2RlRmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gT1NBRXhlY3V0ZUV2ZW50KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAmdGhlQXBwbGVFdmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHRJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgIG1vZGVGbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHRpbmdTY3JpcHRWYWx1ZUlEKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICByZXN1bHRpbmdTY3JpcHRWYWx1ZUlEKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX0NvbnZlcnQsICZ0aGVBcHBsZUV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY29udGV4dElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbW9kZUZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IE9TQUV4ZWN1dGVFdmVudChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUFwcGxlRXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0aW5nU2NyaXB0VmFsdWVJRCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0aW5nU2NyaXB0VmFsdWVJRCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqT1NBT2JqX09TQURvRXZlbnQoT1NBQ29tcG9uZW50SW5zdGFuY2VPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TQUVycm9yIF9lcnI7Ci0JQXBwbGVFdmVudCB0aGVBcHBsZUV2ZW50OwotCU9TQUlEIGNvbnRleHRJRDsKLQlsb25nIG1vZGVGbGFnczsKLQlBcHBsZUV2ZW50IHJlcGx5OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0FFcnJvciBfZXJyOworICAgIEFwcGxlRXZlbnQgdGhlQXBwbGVFdmVudDsKKyAgICBPU0FJRCBjb250ZXh0SUQ7CisgICAgbG9uZyBtb2RlRmxhZ3M7CisgICAgQXBwbGVFdmVudCByZXBseTsKICNpZm5kZWYgT1NBRG9FdmVudAotCVB5TWFjX1BSRUNIRUNLKE9TQURvRXZlbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKE9TQURvRXZlbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19Db252ZXJ0LCAmdGhlQXBwbGVFdmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNvbnRleHRJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vZGVGbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBPU0FEb0V2ZW50KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgJnRoZUFwcGxlRXZlbnQsCi0JICAgICAgICAgICAgICAgICAgY29udGV4dElELAotCSAgICAgICAgICAgICAgICAgIG1vZGVGbGFncywKLQkgICAgICAgICAgICAgICAgICAmcmVwbHkpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBBRURlc2NfTmV3LCAmcmVwbHkpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBRURlc2NfQ29udmVydCwgJnRoZUFwcGxlRXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjb250ZXh0SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtb2RlRmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gT1NBRG9FdmVudChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICZ0aGVBcHBsZUV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHRJRCwKKyAgICAgICAgICAgICAgICAgICAgICBtb2RlRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgJnJlcGx5KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX05ldywgJnJlcGx5KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpPU0FPYmpfT1NBTWFrZUNvbnRleHQoT1NBQ29tcG9uZW50SW5zdGFuY2VPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TQUVycm9yIF9lcnI7Ci0JQUVEZXNjIGNvbnRleHROYW1lOwotCU9TQUlEIHBhcmVudENvbnRleHQ7Ci0JT1NBSUQgcmVzdWx0aW5nQ29udGV4dElEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0FFcnJvciBfZXJyOworICAgIEFFRGVzYyBjb250ZXh0TmFtZTsKKyAgICBPU0FJRCBwYXJlbnRDb250ZXh0OworICAgIE9TQUlEIHJlc3VsdGluZ0NvbnRleHRJRDsKICNpZm5kZWYgT1NBTWFrZUNvbnRleHQKLQlQeU1hY19QUkVDSEVDSyhPU0FNYWtlQ29udGV4dCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soT1NBTWFrZUNvbnRleHQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX0NvbnZlcnQsICZjb250ZXh0TmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnBhcmVudENvbnRleHQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gT1NBTWFrZUNvbnRleHQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNvbnRleHROYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRDb250ZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0aW5nQ29udGV4dElEKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICByZXN1bHRpbmdDb250ZXh0SUQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19Db252ZXJ0LCAmY29udGV4dE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJlbnRDb250ZXh0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IE9TQU1ha2VDb250ZXh0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjb250ZXh0TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50Q29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdGluZ0NvbnRleHRJRCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0aW5nQ29udGV4dElEKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIE9TQU9ial9tZXRob2RzW10gPSB7Ci0JeyJPU0FMb2FkIiwgKFB5Q0Z1bmN0aW9uKU9TQU9ial9PU0FMb2FkLCAxLAotCSBQeURvY19TVFIoIihBRURlc2Mgc2NyaXB0RGF0YSwgbG9uZyBtb2RlRmxhZ3MpIC0+IChPU0FJRCByZXN1bHRpbmdTY3JpcHRJRCkiKX0sCi0JeyJPU0FTdG9yZSIsIChQeUNGdW5jdGlvbilPU0FPYmpfT1NBU3RvcmUsIDEsCi0JIFB5RG9jX1NUUigiKE9TQUlEIHNjcmlwdElELCBEZXNjVHlwZSBkZXNpcmVkVHlwZSwgbG9uZyBtb2RlRmxhZ3MpIC0+IChBRURlc2MgcmVzdWx0aW5nU2NyaXB0RGF0YSkiKX0sCi0JeyJPU0FFeGVjdXRlIiwgKFB5Q0Z1bmN0aW9uKU9TQU9ial9PU0FFeGVjdXRlLCAxLAotCSBQeURvY19TVFIoIihPU0FJRCBjb21waWxlZFNjcmlwdElELCBPU0FJRCBjb250ZXh0SUQsIGxvbmcgbW9kZUZsYWdzKSAtPiAoT1NBSUQgcmVzdWx0aW5nU2NyaXB0VmFsdWVJRCkiKX0sCi0JeyJPU0FEaXNwbGF5IiwgKFB5Q0Z1bmN0aW9uKU9TQU9ial9PU0FEaXNwbGF5LCAxLAotCSBQeURvY19TVFIoIihPU0FJRCBzY3JpcHRWYWx1ZUlELCBEZXNjVHlwZSBkZXNpcmVkVHlwZSwgbG9uZyBtb2RlRmxhZ3MpIC0+IChBRURlc2MgcmVzdWx0aW5nVGV4dCkiKX0sCi0JeyJPU0FTY3JpcHRFcnJvciIsIChQeUNGdW5jdGlvbilPU0FPYmpfT1NBU2NyaXB0RXJyb3IsIDEsCi0JIFB5RG9jX1NUUigiKE9TVHlwZSBzZWxlY3RvciwgRGVzY1R5cGUgZGVzaXJlZFR5cGUpIC0+IChBRURlc2MgcmVzdWx0aW5nRXJyb3JEZXNjcmlwdGlvbikiKX0sCi0JeyJPU0FEaXNwb3NlIiwgKFB5Q0Z1bmN0aW9uKU9TQU9ial9PU0FEaXNwb3NlLCAxLAotCSBQeURvY19TVFIoIihPU0FJRCBzY3JpcHRJRCkgLT4gTm9uZSIpfSwKLQl7Ik9TQVNldFNjcmlwdEluZm8iLCAoUHlDRnVuY3Rpb24pT1NBT2JqX09TQVNldFNjcmlwdEluZm8sIDEsCi0JIFB5RG9jX1NUUigiKE9TQUlEIHNjcmlwdElELCBPU1R5cGUgc2VsZWN0b3IsIGxvbmcgdmFsdWUpIC0+IE5vbmUiKX0sCi0JeyJPU0FHZXRTY3JpcHRJbmZvIiwgKFB5Q0Z1bmN0aW9uKU9TQU9ial9PU0FHZXRTY3JpcHRJbmZvLCAxLAotCSBQeURvY19TVFIoIihPU0FJRCBzY3JpcHRJRCwgT1NUeXBlIHNlbGVjdG9yKSAtPiAobG9uZyByZXN1bHQpIil9LAotCXsiT1NBU2NyaXB0aW5nQ29tcG9uZW50TmFtZSIsIChQeUNGdW5jdGlvbilPU0FPYmpfT1NBU2NyaXB0aW5nQ29tcG9uZW50TmFtZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQUVEZXNjIHJlc3VsdGluZ1NjcmlwdGluZ0NvbXBvbmVudE5hbWUpIil9LAotCXsiT1NBQ29tcGlsZSIsIChQeUNGdW5jdGlvbilPU0FPYmpfT1NBQ29tcGlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoQUVEZXNjIHNvdXJjZURhdGEsIGxvbmcgbW9kZUZsYWdzKSAtPiAoT1NBSUQgcHJldmlvdXNBbmRSZXN1bHRpbmdTY3JpcHRJRCkiKX0sCi0JeyJPU0FDb3B5SUQiLCAoUHlDRnVuY3Rpb24pT1NBT2JqX09TQUNvcHlJRCwgMSwKLQkgUHlEb2NfU1RSKCIoT1NBSUQgZnJvbUlEKSAtPiAoT1NBSUQgdG9JRCkiKX0sCi0JeyJPU0FHZXRTb3VyY2UiLCAoUHlDRnVuY3Rpb24pT1NBT2JqX09TQUdldFNvdXJjZSwgMSwKLQkgUHlEb2NfU1RSKCIoT1NBSUQgc2NyaXB0SUQsIERlc2NUeXBlIGRlc2lyZWRUeXBlKSAtPiAoQUVEZXNjIHJlc3VsdGluZ1NvdXJjZURhdGEpIil9LAotCXsiT1NBQ29lcmNlRnJvbURlc2MiLCAoUHlDRnVuY3Rpb24pT1NBT2JqX09TQUNvZXJjZUZyb21EZXNjLCAxLAotCSBQeURvY19TVFIoIihBRURlc2Mgc2NyaXB0RGF0YSwgbG9uZyBtb2RlRmxhZ3MpIC0+IChPU0FJRCByZXN1bHRpbmdTY3JpcHRJRCkiKX0sCi0JeyJPU0FDb2VyY2VUb0Rlc2MiLCAoUHlDRnVuY3Rpb24pT1NBT2JqX09TQUNvZXJjZVRvRGVzYywgMSwKLQkgUHlEb2NfU1RSKCIoT1NBSUQgc2NyaXB0SUQsIERlc2NUeXBlIGRlc2lyZWRUeXBlLCBsb25nIG1vZGVGbGFncykgLT4gKEFFRGVzYyByZXN1bHQpIil9LAotCXsiT1NBU2V0RGVmYXVsdFRhcmdldCIsIChQeUNGdW5jdGlvbilPU0FPYmpfT1NBU2V0RGVmYXVsdFRhcmdldCwgMSwKLQkgUHlEb2NfU1RSKCIoQUVBZGRyZXNzRGVzYyB0YXJnZXQpIC0+IE5vbmUiKX0sCi0JeyJPU0FTdGFydFJlY29yZGluZyIsIChQeUNGdW5jdGlvbilPU0FPYmpfT1NBU3RhcnRSZWNvcmRpbmcsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKE9TQUlEIGNvbXBpbGVkU2NyaXB0VG9Nb2RpZnlJRCkiKX0sCi0JeyJPU0FTdG9wUmVjb3JkaW5nIiwgKFB5Q0Z1bmN0aW9uKU9TQU9ial9PU0FTdG9wUmVjb3JkaW5nLCAxLAotCSBQeURvY19TVFIoIihPU0FJRCBjb21waWxlZFNjcmlwdElEKSAtPiBOb25lIil9LAotCXsiT1NBTG9hZEV4ZWN1dGUiLCAoUHlDRnVuY3Rpb24pT1NBT2JqX09TQUxvYWRFeGVjdXRlLCAxLAotCSBQeURvY19TVFIoIihBRURlc2Mgc2NyaXB0RGF0YSwgT1NBSUQgY29udGV4dElELCBsb25nIG1vZGVGbGFncykgLT4gKE9TQUlEIHJlc3VsdGluZ1NjcmlwdFZhbHVlSUQpIil9LAotCXsiT1NBQ29tcGlsZUV4ZWN1dGUiLCAoUHlDRnVuY3Rpb24pT1NBT2JqX09TQUNvbXBpbGVFeGVjdXRlLCAxLAotCSBQeURvY19TVFIoIihBRURlc2Mgc291cmNlRGF0YSwgT1NBSUQgY29udGV4dElELCBsb25nIG1vZGVGbGFncykgLT4gKE9TQUlEIHJlc3VsdGluZ1NjcmlwdFZhbHVlSUQpIil9LAotCXsiT1NBRG9TY3JpcHQiLCAoUHlDRnVuY3Rpb24pT1NBT2JqX09TQURvU2NyaXB0LCAxLAotCSBQeURvY19TVFIoIihBRURlc2Mgc291cmNlRGF0YSwgT1NBSUQgY29udGV4dElELCBEZXNjVHlwZSBkZXNpcmVkVHlwZSwgbG9uZyBtb2RlRmxhZ3MpIC0+IChBRURlc2MgcmVzdWx0aW5nVGV4dCkiKX0sCi0JeyJPU0FTZXRDdXJyZW50RGlhbGVjdCIsIChQeUNGdW5jdGlvbilPU0FPYmpfT1NBU2V0Q3VycmVudERpYWxlY3QsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGRpYWxlY3RDb2RlKSAtPiBOb25lIil9LAotCXsiT1NBR2V0Q3VycmVudERpYWxlY3QiLCAoUHlDRnVuY3Rpb24pT1NBT2JqX09TQUdldEN1cnJlbnREaWFsZWN0LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChzaG9ydCByZXN1bHRpbmdEaWFsZWN0Q29kZSkiKX0sCi0JeyJPU0FBdmFpbGFibGVEaWFsZWN0cyIsIChQeUNGdW5jdGlvbilPU0FPYmpfT1NBQXZhaWxhYmxlRGlhbGVjdHMsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEFFRGVzYyByZXN1bHRpbmdEaWFsZWN0SW5mb0xpc3QpIil9LAotCXsiT1NBR2V0RGlhbGVjdEluZm8iLCAoUHlDRnVuY3Rpb24pT1NBT2JqX09TQUdldERpYWxlY3RJbmZvLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBkaWFsZWN0Q29kZSwgT1NUeXBlIHNlbGVjdG9yKSAtPiAoQUVEZXNjIHJlc3VsdGluZ0RpYWxlY3RJbmZvKSIpfSwKLQl7Ik9TQUF2YWlsYWJsZURpYWxlY3RDb2RlTGlzdCIsIChQeUNGdW5jdGlvbilPU0FPYmpfT1NBQXZhaWxhYmxlRGlhbGVjdENvZGVMaXN0LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChBRURlc2MgcmVzdWx0aW5nRGlhbGVjdENvZGVMaXN0KSIpfSwKLQl7Ik9TQUV4ZWN1dGVFdmVudCIsIChQeUNGdW5jdGlvbilPU0FPYmpfT1NBRXhlY3V0ZUV2ZW50LCAxLAotCSBQeURvY19TVFIoIihBcHBsZUV2ZW50IHRoZUFwcGxlRXZlbnQsIE9TQUlEIGNvbnRleHRJRCwgbG9uZyBtb2RlRmxhZ3MpIC0+IChPU0FJRCByZXN1bHRpbmdTY3JpcHRWYWx1ZUlEKSIpfSwKLQl7Ik9TQURvRXZlbnQiLCAoUHlDRnVuY3Rpb24pT1NBT2JqX09TQURvRXZlbnQsIDEsCi0JIFB5RG9jX1NUUigiKEFwcGxlRXZlbnQgdGhlQXBwbGVFdmVudCwgT1NBSUQgY29udGV4dElELCBsb25nIG1vZGVGbGFncykgLT4gKEFwcGxlRXZlbnQgcmVwbHkpIil9LAotCXsiT1NBTWFrZUNvbnRleHQiLCAoUHlDRnVuY3Rpb24pT1NBT2JqX09TQU1ha2VDb250ZXh0LCAxLAotCSBQeURvY19TVFIoIihBRURlc2MgY29udGV4dE5hbWUsIE9TQUlEIHBhcmVudENvbnRleHQpIC0+IChPU0FJRCByZXN1bHRpbmdDb250ZXh0SUQpIil9LAotCXtOVUxMLCBOVUxMLCAwfQorICAgIHsiT1NBTG9hZCIsIChQeUNGdW5jdGlvbilPU0FPYmpfT1NBTG9hZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQUVEZXNjIHNjcmlwdERhdGEsIGxvbmcgbW9kZUZsYWdzKSAtPiAoT1NBSUQgcmVzdWx0aW5nU2NyaXB0SUQpIil9LAorICAgIHsiT1NBU3RvcmUiLCAoUHlDRnVuY3Rpb24pT1NBT2JqX09TQVN0b3JlLCAxLAorICAgICBQeURvY19TVFIoIihPU0FJRCBzY3JpcHRJRCwgRGVzY1R5cGUgZGVzaXJlZFR5cGUsIGxvbmcgbW9kZUZsYWdzKSAtPiAoQUVEZXNjIHJlc3VsdGluZ1NjcmlwdERhdGEpIil9LAorICAgIHsiT1NBRXhlY3V0ZSIsIChQeUNGdW5jdGlvbilPU0FPYmpfT1NBRXhlY3V0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoT1NBSUQgY29tcGlsZWRTY3JpcHRJRCwgT1NBSUQgY29udGV4dElELCBsb25nIG1vZGVGbGFncykgLT4gKE9TQUlEIHJlc3VsdGluZ1NjcmlwdFZhbHVlSUQpIil9LAorICAgIHsiT1NBRGlzcGxheSIsIChQeUNGdW5jdGlvbilPU0FPYmpfT1NBRGlzcGxheSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoT1NBSUQgc2NyaXB0VmFsdWVJRCwgRGVzY1R5cGUgZGVzaXJlZFR5cGUsIGxvbmcgbW9kZUZsYWdzKSAtPiAoQUVEZXNjIHJlc3VsdGluZ1RleHQpIil9LAorICAgIHsiT1NBU2NyaXB0RXJyb3IiLCAoUHlDRnVuY3Rpb24pT1NBT2JqX09TQVNjcmlwdEVycm9yLCAxLAorICAgICBQeURvY19TVFIoIihPU1R5cGUgc2VsZWN0b3IsIERlc2NUeXBlIGRlc2lyZWRUeXBlKSAtPiAoQUVEZXNjIHJlc3VsdGluZ0Vycm9yRGVzY3JpcHRpb24pIil9LAorICAgIHsiT1NBRGlzcG9zZSIsIChQeUNGdW5jdGlvbilPU0FPYmpfT1NBRGlzcG9zZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoT1NBSUQgc2NyaXB0SUQpIC0+IE5vbmUiKX0sCisgICAgeyJPU0FTZXRTY3JpcHRJbmZvIiwgKFB5Q0Z1bmN0aW9uKU9TQU9ial9PU0FTZXRTY3JpcHRJbmZvLCAxLAorICAgICBQeURvY19TVFIoIihPU0FJRCBzY3JpcHRJRCwgT1NUeXBlIHNlbGVjdG9yLCBsb25nIHZhbHVlKSAtPiBOb25lIil9LAorICAgIHsiT1NBR2V0U2NyaXB0SW5mbyIsIChQeUNGdW5jdGlvbilPU0FPYmpfT1NBR2V0U2NyaXB0SW5mbywgMSwKKyAgICAgUHlEb2NfU1RSKCIoT1NBSUQgc2NyaXB0SUQsIE9TVHlwZSBzZWxlY3RvcikgLT4gKGxvbmcgcmVzdWx0KSIpfSwKKyAgICB7Ik9TQVNjcmlwdGluZ0NvbXBvbmVudE5hbWUiLCAoUHlDRnVuY3Rpb24pT1NBT2JqX09TQVNjcmlwdGluZ0NvbXBvbmVudE5hbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEFFRGVzYyByZXN1bHRpbmdTY3JpcHRpbmdDb21wb25lbnROYW1lKSIpfSwKKyAgICB7Ik9TQUNvbXBpbGUiLCAoUHlDRnVuY3Rpb24pT1NBT2JqX09TQUNvbXBpbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEFFRGVzYyBzb3VyY2VEYXRhLCBsb25nIG1vZGVGbGFncykgLT4gKE9TQUlEIHByZXZpb3VzQW5kUmVzdWx0aW5nU2NyaXB0SUQpIil9LAorICAgIHsiT1NBQ29weUlEIiwgKFB5Q0Z1bmN0aW9uKU9TQU9ial9PU0FDb3B5SUQsIDEsCisgICAgIFB5RG9jX1NUUigiKE9TQUlEIGZyb21JRCkgLT4gKE9TQUlEIHRvSUQpIil9LAorICAgIHsiT1NBR2V0U291cmNlIiwgKFB5Q0Z1bmN0aW9uKU9TQU9ial9PU0FHZXRTb3VyY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKE9TQUlEIHNjcmlwdElELCBEZXNjVHlwZSBkZXNpcmVkVHlwZSkgLT4gKEFFRGVzYyByZXN1bHRpbmdTb3VyY2VEYXRhKSIpfSwKKyAgICB7Ik9TQUNvZXJjZUZyb21EZXNjIiwgKFB5Q0Z1bmN0aW9uKU9TQU9ial9PU0FDb2VyY2VGcm9tRGVzYywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQUVEZXNjIHNjcmlwdERhdGEsIGxvbmcgbW9kZUZsYWdzKSAtPiAoT1NBSUQgcmVzdWx0aW5nU2NyaXB0SUQpIil9LAorICAgIHsiT1NBQ29lcmNlVG9EZXNjIiwgKFB5Q0Z1bmN0aW9uKU9TQU9ial9PU0FDb2VyY2VUb0Rlc2MsIDEsCisgICAgIFB5RG9jX1NUUigiKE9TQUlEIHNjcmlwdElELCBEZXNjVHlwZSBkZXNpcmVkVHlwZSwgbG9uZyBtb2RlRmxhZ3MpIC0+IChBRURlc2MgcmVzdWx0KSIpfSwKKyAgICB7Ik9TQVNldERlZmF1bHRUYXJnZXQiLCAoUHlDRnVuY3Rpb24pT1NBT2JqX09TQVNldERlZmF1bHRUYXJnZXQsIDEsCisgICAgIFB5RG9jX1NUUigiKEFFQWRkcmVzc0Rlc2MgdGFyZ2V0KSAtPiBOb25lIil9LAorICAgIHsiT1NBU3RhcnRSZWNvcmRpbmciLCAoUHlDRnVuY3Rpb24pT1NBT2JqX09TQVN0YXJ0UmVjb3JkaW5nLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChPU0FJRCBjb21waWxlZFNjcmlwdFRvTW9kaWZ5SUQpIil9LAorICAgIHsiT1NBU3RvcFJlY29yZGluZyIsIChQeUNGdW5jdGlvbilPU0FPYmpfT1NBU3RvcFJlY29yZGluZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoT1NBSUQgY29tcGlsZWRTY3JpcHRJRCkgLT4gTm9uZSIpfSwKKyAgICB7Ik9TQUxvYWRFeGVjdXRlIiwgKFB5Q0Z1bmN0aW9uKU9TQU9ial9PU0FMb2FkRXhlY3V0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQUVEZXNjIHNjcmlwdERhdGEsIE9TQUlEIGNvbnRleHRJRCwgbG9uZyBtb2RlRmxhZ3MpIC0+IChPU0FJRCByZXN1bHRpbmdTY3JpcHRWYWx1ZUlEKSIpfSwKKyAgICB7Ik9TQUNvbXBpbGVFeGVjdXRlIiwgKFB5Q0Z1bmN0aW9uKU9TQU9ial9PU0FDb21waWxlRXhlY3V0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQUVEZXNjIHNvdXJjZURhdGEsIE9TQUlEIGNvbnRleHRJRCwgbG9uZyBtb2RlRmxhZ3MpIC0+IChPU0FJRCByZXN1bHRpbmdTY3JpcHRWYWx1ZUlEKSIpfSwKKyAgICB7Ik9TQURvU2NyaXB0IiwgKFB5Q0Z1bmN0aW9uKU9TQU9ial9PU0FEb1NjcmlwdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQUVEZXNjIHNvdXJjZURhdGEsIE9TQUlEIGNvbnRleHRJRCwgRGVzY1R5cGUgZGVzaXJlZFR5cGUsIGxvbmcgbW9kZUZsYWdzKSAtPiAoQUVEZXNjIHJlc3VsdGluZ1RleHQpIil9LAorICAgIHsiT1NBU2V0Q3VycmVudERpYWxlY3QiLCAoUHlDRnVuY3Rpb24pT1NBT2JqX09TQVNldEN1cnJlbnREaWFsZWN0LCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBkaWFsZWN0Q29kZSkgLT4gTm9uZSIpfSwKKyAgICB7Ik9TQUdldEN1cnJlbnREaWFsZWN0IiwgKFB5Q0Z1bmN0aW9uKU9TQU9ial9PU0FHZXRDdXJyZW50RGlhbGVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgcmVzdWx0aW5nRGlhbGVjdENvZGUpIil9LAorICAgIHsiT1NBQXZhaWxhYmxlRGlhbGVjdHMiLCAoUHlDRnVuY3Rpb24pT1NBT2JqX09TQUF2YWlsYWJsZURpYWxlY3RzLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChBRURlc2MgcmVzdWx0aW5nRGlhbGVjdEluZm9MaXN0KSIpfSwKKyAgICB7Ik9TQUdldERpYWxlY3RJbmZvIiwgKFB5Q0Z1bmN0aW9uKU9TQU9ial9PU0FHZXREaWFsZWN0SW5mbywgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgZGlhbGVjdENvZGUsIE9TVHlwZSBzZWxlY3RvcikgLT4gKEFFRGVzYyByZXN1bHRpbmdEaWFsZWN0SW5mbykiKX0sCisgICAgeyJPU0FBdmFpbGFibGVEaWFsZWN0Q29kZUxpc3QiLCAoUHlDRnVuY3Rpb24pT1NBT2JqX09TQUF2YWlsYWJsZURpYWxlY3RDb2RlTGlzdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQUVEZXNjIHJlc3VsdGluZ0RpYWxlY3RDb2RlTGlzdCkiKX0sCisgICAgeyJPU0FFeGVjdXRlRXZlbnQiLCAoUHlDRnVuY3Rpb24pT1NBT2JqX09TQUV4ZWN1dGVFdmVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQXBwbGVFdmVudCB0aGVBcHBsZUV2ZW50LCBPU0FJRCBjb250ZXh0SUQsIGxvbmcgbW9kZUZsYWdzKSAtPiAoT1NBSUQgcmVzdWx0aW5nU2NyaXB0VmFsdWVJRCkiKX0sCisgICAgeyJPU0FEb0V2ZW50IiwgKFB5Q0Z1bmN0aW9uKU9TQU9ial9PU0FEb0V2ZW50LCAxLAorICAgICBQeURvY19TVFIoIihBcHBsZUV2ZW50IHRoZUFwcGxlRXZlbnQsIE9TQUlEIGNvbnRleHRJRCwgbG9uZyBtb2RlRmxhZ3MpIC0+IChBcHBsZUV2ZW50IHJlcGx5KSIpfSwKKyAgICB7Ik9TQU1ha2VDb250ZXh0IiwgKFB5Q0Z1bmN0aW9uKU9TQU9ial9PU0FNYWtlQ29udGV4dCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQUVEZXNjIGNvbnRleHROYW1lLCBPU0FJRCBwYXJlbnRDb250ZXh0KSAtPiAoT1NBSUQgcmVzdWx0aW5nQ29udGV4dElEKSIpfSwKKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKICNkZWZpbmUgT1NBT2JqX2dldHNldGxpc3QgTlVMTApAQCAtODAwLDY4ICs4MDAsNjggQEAKIAogc3RhdGljIFB5T2JqZWN0ICpPU0FPYmpfdHBfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKl9hcmdzLCBQeU9iamVjdCAqX2t3ZHMpCiB7Ci0JUHlPYmplY3QgKl9zZWxmOwotCUNvbXBvbmVudEluc3RhbmNlIGl0c2VsZjsKLQljaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKKyAgICBQeU9iamVjdCAqX3NlbGY7CisgICAgQ29tcG9uZW50SW5zdGFuY2UgaXRzZWxmOworICAgIGNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgT1NBT2JqX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKLQlpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOwotCSgoT1NBQ29tcG9uZW50SW5zdGFuY2VPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlyZXR1cm4gX3NlbGY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgT1NBT2JqX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOworICAgICgoT1NBQ29tcG9uZW50SW5zdGFuY2VPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICByZXR1cm4gX3NlbGY7CiB9CiAKICNkZWZpbmUgT1NBT2JqX3RwX2ZyZWUgUHlPYmplY3RfRGVsCiAKIAogUHlUeXBlT2JqZWN0IE9TQUNvbXBvbmVudEluc3RhbmNlX1R5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCi0JMCwgLypvYl9zaXplKi8KLQkiX09TQS5PU0FDb21wb25lbnRJbnN0YW5jZSIsIC8qdHBfbmFtZSovCi0Jc2l6ZW9mKE9TQUNvbXBvbmVudEluc3RhbmNlT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLwotCTAsIC8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcikgT1NBT2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCi0JMCwgLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCi0JKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCi0JKGNtcGZ1bmMpIE9TQU9ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYykgT1NBT2JqX3JlcHIsIC8qdHBfcmVwciovCi0JKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLwotCShQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCi0JKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCi0JKGhhc2hmdW5jKSBPU0FPYmpfaGFzaCwgLyp0cF9oYXNoKi8KLQkwLCAvKnRwX2NhbGwqLwotCTAsIC8qdHBfc3RyKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCi0JUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KLQkwLCAvKnRwX2FzX2J1ZmZlciovCi0JUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCi0JMCwgLyp0cF9kb2MqLwotCTAsIC8qdHBfdHJhdmVyc2UqLwotCTAsIC8qdHBfY2xlYXIqLwotCTAsIC8qdHBfcmljaGNvbXBhcmUqLwotCTAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLwotCTAsIC8qdHBfaXRlciovCi0JMCwgLyp0cF9pdGVybmV4dCovCi0JT1NBT2JqX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KLQkwLCAvKnRwX21lbWJlcnMqLwotCU9TQU9ial9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCi0JMCwgLyp0cF9iYXNlKi8KLQkwLCAvKnRwX2RpY3QqLwotCTAsIC8qdHBfZGVzY3JfZ2V0Ki8KLQkwLCAvKnRwX2Rlc2NyX3NldCovCi0JMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KLQlPU0FPYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLwotCU9TQU9ial90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KLQlPU0FPYmpfdHBfbmV3LCAvKiB0cF9uZXcgKi8KLQlPU0FPYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgIDAsIC8qb2Jfc2l6ZSovCisgICAgIl9PU0EuT1NBQ29tcG9uZW50SW5zdGFuY2UiLCAvKnRwX25hbWUqLworICAgIHNpemVvZihPU0FDb21wb25lbnRJbnN0YW5jZU9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpIE9TQU9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgIDAsIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLworICAgIChzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLworICAgIChjbXBmdW5jKSBPU0FPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpIE9TQU9ial9yZXByLCAvKnRwX3JlcHIqLworICAgIChQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIChQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLworICAgIChoYXNoZnVuYykgT1NBT2JqX2hhc2gsIC8qdHBfaGFzaCovCisgICAgMCwgLyp0cF9jYWxsKi8KKyAgICAwLCAvKnRwX3N0ciovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLworICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCisgICAgMCwgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLworICAgIDAsIC8qdHBfZG9jKi8KKyAgICAwLCAvKnRwX3RyYXZlcnNlKi8KKyAgICAwLCAvKnRwX2NsZWFyKi8KKyAgICAwLCAvKnRwX3JpY2hjb21wYXJlKi8KKyAgICAwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KKyAgICAwLCAvKnRwX2l0ZXIqLworICAgIDAsIC8qdHBfaXRlcm5leHQqLworICAgIE9TQU9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCisgICAgMCwgLyp0cF9tZW1iZXJzKi8KKyAgICBPU0FPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLworICAgIDAsIC8qdHBfYmFzZSovCisgICAgMCwgLyp0cF9kaWN0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX2dldCovCisgICAgMCwgLyp0cF9kZXNjcl9zZXQqLworICAgIDAsIC8qdHBfZGljdG9mZnNldCovCisgICAgT1NBT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KKyAgICBPU0FPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCisgICAgT1NBT2JqX3RwX25ldywgLyogdHBfbmV3ICovCisgICAgT1NBT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tIEVuZCBvYmplY3QgdHlwZSBPU0FDb21wb25lbnRJbnN0YW5jZSAtLS0tLS0tLS0tLS0tLSAqLwogCiAKIHN0YXRpYyBQeU1ldGhvZERlZiBPU0FfbWV0aG9kc1tdID0gewotCXtOVUxMLCBOVUxMLCAwfQorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogCkBAIC04NjksMzAgKzg2OSwzMCBAQAogCiB2b2lkIGluaXRfT1NBKHZvaWQpCiB7Ci0JUHlPYmplY3QgKm07Ci0JUHlPYmplY3QgKmQ7CisgICAgUHlPYmplY3QgKm07CisgICAgUHlPYmplY3QgKmQ7CiAKIAogCi0JLyoKLQkgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKENvbXBvbmVudEluc3RhbmNlLCBPU0FPYmpfTmV3KTsKLQkgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChDb21wb25lbnRJbnN0YW5jZSwgT1NBT2JqX0NvbnZlcnQpOwotCSovCisgICAgLyoKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoQ29tcG9uZW50SW5zdGFuY2UsIE9TQU9ial9OZXcpOworICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoQ29tcG9uZW50SW5zdGFuY2UsIE9TQU9ial9Db252ZXJ0KTsKKyAgICAqLwogCiAKLQltID0gUHlfSW5pdE1vZHVsZSgiX09TQSIsIE9TQV9tZXRob2RzKTsKLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQlPU0FfRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOwotCWlmIChPU0FfRXJyb3IgPT0gTlVMTCB8fAotCSAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRXJyb3IiLCBPU0FfRXJyb3IpICE9IDApCi0JCXJldHVybjsKLQlPU0FDb21wb25lbnRJbnN0YW5jZV9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmT1NBQ29tcG9uZW50SW5zdGFuY2VfVHlwZSkgPCAwKSByZXR1cm47Ci0JUHlfSU5DUkVGKCZPU0FDb21wb25lbnRJbnN0YW5jZV9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIk9TQUNvbXBvbmVudEluc3RhbmNlIiwgKFB5T2JqZWN0ICopJk9TQUNvbXBvbmVudEluc3RhbmNlX1R5cGUpOwotCS8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLwotCVB5X0lOQ1JFRigmT1NBQ29tcG9uZW50SW5zdGFuY2VfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJPU0FDb21wb25lbnRJbnN0YW5jZVR5cGUiLCAoUHlPYmplY3QgKikmT1NBQ29tcG9uZW50SW5zdGFuY2VfVHlwZSk7CisgICAgbSA9IFB5X0luaXRNb2R1bGUoIl9PU0EiLCBPU0FfbWV0aG9kcyk7CisgICAgZCA9IFB5TW9kdWxlX0dldERpY3QobSk7CisgICAgT1NBX0Vycm9yID0gUHlNYWNfR2V0T1NFcnJFeGNlcHRpb24oKTsKKyAgICBpZiAoT1NBX0Vycm9yID09IE5VTEwgfHwKKyAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVycm9yIiwgT1NBX0Vycm9yKSAhPSAwKQorICAgICAgICByZXR1cm47CisgICAgT1NBQ29tcG9uZW50SW5zdGFuY2VfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJk9TQUNvbXBvbmVudEluc3RhbmNlX1R5cGUpIDwgMCkgcmV0dXJuOworICAgIFB5X0lOQ1JFRigmT1NBQ29tcG9uZW50SW5zdGFuY2VfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJPU0FDb21wb25lbnRJbnN0YW5jZSIsIChQeU9iamVjdCAqKSZPU0FDb21wb25lbnRJbnN0YW5jZV9UeXBlKTsKKyAgICAvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KKyAgICBQeV9JTkNSRUYoJk9TQUNvbXBvbmVudEluc3RhbmNlX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiT1NBQ29tcG9uZW50SW5zdGFuY2VUeXBlIiwgKFB5T2JqZWN0ICopJk9TQUNvbXBvbmVudEluc3RhbmNlX1R5cGUpOwogfQogCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT0gRW5kIG1vZHVsZSBfT1NBID09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL3FkL19RZG1vZHVsZS5jIGIvTWFjL01vZHVsZXMvcWQvX1FkbW9kdWxlLmMKaW5kZXggOGM5OGZhMS4uYzc1OTRiOSAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvcWQvX1FkbW9kdWxlLmMKKysrIGIvTWFjL01vZHVsZXMvcWQvX1FkbW9kdWxlLmMKQEAgLTEwLDkgKzEwLDkgQEAKIAogLyogTWFjcm8gdG8gdGVzdCB3aGV0aGVyIGEgd2Vhay1sb2FkZWQgQ0ZNIGZ1bmN0aW9uIGV4aXN0cyAqLwogI2RlZmluZSBQeU1hY19QUkVDSEVDSyhydG4pIGRvIHsgaWYgKCAmcnRuID09IE5VTEwgKSAge1wKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsIFwKLSAgICAgICAgIk5vdCBhdmFpbGFibGUgaW4gdGhpcyBzaGFyZWQgbGlicmFyeS9PUyB2ZXJzaW9uIik7IFwKLSAgICAgICAgcmV0dXJuIE5VTEw7IFwKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgXAorICAgICJOb3QgYXZhaWxhYmxlIGluIHRoaXMgc2hhcmVkIGxpYnJhcnkvT1MgdmVyc2lvbiIpOyBcCisgICAgcmV0dXJuIE5VTEw7IFwKICAgICB9fSB3aGlsZSgwKQogCiAKQEAgLTQyLDE5ICs0MiwxOSBAQAogUHlPYmplY3QgKlFkUkdCX05ldyhSR0JDb2xvclB0ciBpdHNlbGYpCiB7CiAKLSAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImxsbCIsIChsb25nKWl0c2VsZi0+cmVkLCAobG9uZylpdHNlbGYtPmdyZWVuLCAobG9uZylpdHNlbGYtPmJsdWUpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJsbGwiLCAobG9uZylpdHNlbGYtPnJlZCwgKGxvbmcpaXRzZWxmLT5ncmVlbiwgKGxvbmcpaXRzZWxmLT5ibHVlKTsKIH0KIAogaW50IFFkUkdCX0NvbnZlcnQoUHlPYmplY3QgKnYsIFJHQkNvbG9yUHRyIHBfaXRzZWxmKQogewotICAgICAgICBsb25nIHJlZCwgZ3JlZW4sIGJsdWU7CisgICAgbG9uZyByZWQsIGdyZWVuLCBibHVlOwogCi0gICAgICAgIGlmKCAhUHlBcmdfUGFyc2VUdXBsZSh2LCAibGxsIiwgJnJlZCwgJmdyZWVuLCAmYmx1ZSkgKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICBwX2l0c2VsZi0+cmVkID0gKHVuc2lnbmVkIHNob3J0KXJlZDsKLSAgICAgICAgcF9pdHNlbGYtPmdyZWVuID0gKHVuc2lnbmVkIHNob3J0KWdyZWVuOwotICAgICAgICBwX2l0c2VsZi0+Ymx1ZSA9ICh1bnNpZ25lZCBzaG9ydClibHVlOwotICAgICAgICByZXR1cm4gMTsKKyAgICBpZiggIVB5QXJnX1BhcnNlVHVwbGUodiwgImxsbCIsICZyZWQsICZncmVlbiwgJmJsdWUpICkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcF9pdHNlbGYtPnJlZCA9ICh1bnNpZ25lZCBzaG9ydClyZWQ7CisgICAgcF9pdHNlbGYtPmdyZWVuID0gKHVuc2lnbmVkIHNob3J0KWdyZWVuOworICAgIHBfaXRzZWxmLT5ibHVlID0gKHVuc2lnbmVkIHNob3J0KWJsdWU7CisgICAgcmV0dXJuIDE7CiB9CiAKIC8qCkBAIC02NCw4ICs2NCw4IEBACiBQeU9iamVjdCAqUWRGSV9OZXcoRm9udEluZm8gKml0c2VsZikKIHsKIAotICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaGhoaCIsIGl0c2VsZi0+YXNjZW50LCBpdHNlbGYtPmRlc2NlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBpdHNlbGYtPndpZE1heCwgaXRzZWxmLT5sZWFkaW5nKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaGhoaCIsIGl0c2VsZi0+YXNjZW50LCBpdHNlbGYtPmRlc2NlbnQsCisgICAgICAgICAgICAgICAgICAgIGl0c2VsZi0+d2lkTWF4LCBpdHNlbGYtPmxlYWRpbmcpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0Vycm9yOwpAQCAtNzcsMTI2MCArNzcsMTI2MCBAQAogI2RlZmluZSBHcmFmT2JqX0NoZWNrKHgpICgoeCktPm9iX3R5cGUgPT0gJkdyYWZQb3J0X1R5cGUgfHwgUHlPYmplY3RfVHlwZUNoZWNrKCh4KSwgJkdyYWZQb3J0X1R5cGUpKQogCiB0eXBlZGVmIHN0cnVjdCBHcmFmUG9ydE9iamVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCUdyYWZQdHIgb2JfaXRzZWxmOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBHcmFmUHRyIG9iX2l0c2VsZjsKIH0gR3JhZlBvcnRPYmplY3Q7CiAKIFB5T2JqZWN0ICpHcmFmT2JqX05ldyhHcmFmUHRyIGl0c2VsZikKIHsKLQlHcmFmUG9ydE9iamVjdCAqaXQ7Ci0JaWYgKGl0c2VsZiA9PSBOVUxMKSByZXR1cm4gUHlNYWNfRXJyb3IocmVzTm90Rm91bmQpOwotCWl0ID0gUHlPYmplY3RfTkVXKEdyYWZQb3J0T2JqZWN0LCAmR3JhZlBvcnRfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOwotCWl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIEdyYWZQb3J0T2JqZWN0ICppdDsKKyAgICBpZiAoaXRzZWxmID09IE5VTEwpIHJldHVybiBQeU1hY19FcnJvcihyZXNOb3RGb3VuZCk7CisgICAgaXQgPSBQeU9iamVjdF9ORVcoR3JhZlBvcnRPYmplY3QsICZHcmFmUG9ydF9UeXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiAKIGludCBHcmFmT2JqX0NvbnZlcnQoUHlPYmplY3QgKnYsIEdyYWZQdHIgKnBfaXRzZWxmKQogewogI2lmIDEKLQl7Ci0JCVdpbmRvd1JlZiB3aW47Ci0JCWlmIChXaW5PYmpfQ29udmVydCh2LCAmd2luKSAmJiB2KSB7Ci0JCQkqcF9pdHNlbGYgPSAoR3JhZlB0cilHZXRXaW5kb3dQb3J0KHdpbik7Ci0JCQlyZXR1cm4gMTsKLQkJfQotCQlQeUVycl9DbGVhcigpOwotCX0KKyAgICB7CisgICAgICAgIFdpbmRvd1JlZiB3aW47CisgICAgICAgIGlmIChXaW5PYmpfQ29udmVydCh2LCAmd2luKSAmJiB2KSB7CisgICAgICAgICAgICAqcF9pdHNlbGYgPSAoR3JhZlB0cilHZXRXaW5kb3dQb3J0KHdpbik7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICBQeUVycl9DbGVhcigpOworICAgIH0KICNlbHNlCi0JaWYgKERsZ09ial9DaGVjayh2KSkgewotCQlEaWFsb2dSZWYgZGxnID0gKERpYWxvZ1JlZikoKEdyYWZQb3J0T2JqZWN0ICopdiktPm9iX2l0c2VsZjsKLQkJKnBfaXRzZWxmID0gKEdyYWZQdHIpR2V0V2luZG93UG9ydChHZXREaWFsb2dXaW5kb3coZGxnKSk7Ci0JCXJldHVybiAxOwotCX0KLQlpZiAoV2luT2JqX0NoZWNrKHYpKSB7Ci0JCVdpbmRvd1JlZiB3aW4gPSAoV2luZG93UmVmKSgoR3JhZlBvcnRPYmplY3QgKil2KS0+b2JfaXRzZWxmOwotCQkqcF9pdHNlbGYgPSAoR3JhZlB0cilHZXRXaW5kb3dQb3J0KHdpbik7Ci0JCXJldHVybiAxOwotCX0KKyAgICBpZiAoRGxnT2JqX0NoZWNrKHYpKSB7CisgICAgICAgIERpYWxvZ1JlZiBkbGcgPSAoRGlhbG9nUmVmKSgoR3JhZlBvcnRPYmplY3QgKil2KS0+b2JfaXRzZWxmOworICAgICAgICAqcF9pdHNlbGYgPSAoR3JhZlB0cilHZXRXaW5kb3dQb3J0KEdldERpYWxvZ1dpbmRvdyhkbGcpKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmIChXaW5PYmpfQ2hlY2sodikpIHsKKyAgICAgICAgV2luZG93UmVmIHdpbiA9IChXaW5kb3dSZWYpKChHcmFmUG9ydE9iamVjdCAqKXYpLT5vYl9pdHNlbGY7CisgICAgICAgICpwX2l0c2VsZiA9IChHcmFmUHRyKUdldFdpbmRvd1BvcnQod2luKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQogI2VuZGlmCi0JaWYgKCFHcmFmT2JqX0NoZWNrKHYpKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkdyYWZQb3J0IHJlcXVpcmVkIik7Ci0JCXJldHVybiAwOwotCX0KLQkqcF9pdHNlbGYgPSAoKEdyYWZQb3J0T2JqZWN0ICopdiktPm9iX2l0c2VsZjsKLQlyZXR1cm4gMTsKKyAgICBpZiAoIUdyYWZPYmpfQ2hlY2sodikpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiR3JhZlBvcnQgcmVxdWlyZWQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICpwX2l0c2VsZiA9ICgoR3JhZlBvcnRPYmplY3QgKil2KS0+b2JfaXRzZWxmOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgdm9pZCBHcmFmT2JqX2RlYWxsb2MoR3JhZlBvcnRPYmplY3QgKnNlbGYpCiB7Ci0JLyogQ2xlYW51cCBvZiBzZWxmLT5vYl9pdHNlbGYgZ29lcyBoZXJlICovCi0Jc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKKyAgICAvKiBDbGVhbnVwIG9mIHNlbGYtPm9iX2l0c2VsZiBnb2VzIGhlcmUgKi8KKyAgICBzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfTWFjU2V0UG9ydChHcmFmUG9ydE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBNYWNTZXRQb3J0Ci0JUHlNYWNfUFJFQ0hFQ0soTWFjU2V0UG9ydCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWFjU2V0UG9ydCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTWFjU2V0UG9ydChfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE1hY1NldFBvcnQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfUURTd2FwUG9ydChHcmFmUG9ydE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JQ0dyYWZQdHIgb3V0T2xkUG9ydDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgQ0dyYWZQdHIgb3V0T2xkUG9ydDsKICNpZm5kZWYgUURTd2FwUG9ydAotCVB5TWFjX1BSRUNIRUNLKFFEU3dhcFBvcnQpOworICAgIFB5TWFjX1BSRUNIRUNLKFFEU3dhcFBvcnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFFEU3dhcFBvcnQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICZvdXRPbGRQb3J0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgR3JhZk9ial9OZXcsIG91dE9sZFBvcnQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBRRFN3YXBQb3J0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAmb3V0T2xkUG9ydCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfTmV3LCBvdXRPbGRQb3J0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpHcmFmT2JqX0lzVmFsaWRQb3J0KEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CiAjaWZuZGVmIElzVmFsaWRQb3J0Ci0JUHlNYWNfUFJFQ0hFQ0soSXNWYWxpZFBvcnQpOworICAgIFB5TWFjX1BSRUNIRUNLKElzVmFsaWRQb3J0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBJc1ZhbGlkUG9ydChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gSXNWYWxpZFBvcnQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqR3JhZk9ial9HZXRQb3J0UGl4TWFwKEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQaXhNYXBIYW5kbGUgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQaXhNYXBIYW5kbGUgX3J2OwogI2lmbmRlZiBHZXRQb3J0UGl4TWFwCi0JUHlNYWNfUFJFQ0hFQ0soR2V0UG9ydFBpeE1hcCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0UG9ydFBpeE1hcCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0UG9ydFBpeE1hcChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFBvcnRQaXhNYXAoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfR2V0UG9ydEJpdE1hcEZvckNvcHlCaXRzKEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQljb25zdCBCaXRNYXAgKiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGNvbnN0IEJpdE1hcCAqIF9ydjsKICNpZm5kZWYgR2V0UG9ydEJpdE1hcEZvckNvcHlCaXRzCi0JUHlNYWNfUFJFQ0hFQ0soR2V0UG9ydEJpdE1hcEZvckNvcHlCaXRzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRQb3J0Qml0TWFwRm9yQ29weUJpdHMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFBvcnRCaXRNYXBGb3JDb3B5Qml0cyhfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEJNT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0UG9ydEJpdE1hcEZvckNvcHlCaXRzKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQk1PYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfR2V0UG9ydEJvdW5kcyhHcmFmUG9ydE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVjdCByZWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IHJlY3Q7CiAjaWZuZGVmIEdldFBvcnRCb3VuZHMKLQlQeU1hY19QUkVDSEVDSyhHZXRQb3J0Qm91bmRzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRQb3J0Qm91bmRzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlHZXRQb3J0Qm91bmRzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAmcmVjdCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZyZWN0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0UG9ydEJvdW5kcyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgJnJlY3QpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmcmVjdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqR3JhZk9ial9HZXRQb3J0Rm9yZUNvbG9yKEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSR0JDb2xvciBmb3JlQ29sb3I7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJHQkNvbG9yIGZvcmVDb2xvcjsKICNpZm5kZWYgR2V0UG9ydEZvcmVDb2xvcgotCVB5TWFjX1BSRUNIRUNLKEdldFBvcnRGb3JlQ29sb3IpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFBvcnRGb3JlQ29sb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUdldFBvcnRGb3JlQ29sb3IoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICZmb3JlQ29sb3IpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUWRSR0JfTmV3LCAmZm9yZUNvbG9yKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0UG9ydEZvcmVDb2xvcihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgJmZvcmVDb2xvcik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZmb3JlQ29sb3IpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfR2V0UG9ydEJhY2tDb2xvcihHcmFmUG9ydE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUkdCQ29sb3IgYmFja0NvbG9yOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSR0JDb2xvciBiYWNrQ29sb3I7CiAjaWZuZGVmIEdldFBvcnRCYWNrQ29sb3IKLQlQeU1hY19QUkVDSEVDSyhHZXRQb3J0QmFja0NvbG9yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRQb3J0QmFja0NvbG9yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlHZXRQb3J0QmFja0NvbG9yKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAmYmFja0NvbG9yKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFFkUkdCX05ldywgJmJhY2tDb2xvcik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldFBvcnRCYWNrQ29sb3IoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICZiYWNrQ29sb3IpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUWRSR0JfTmV3LCAmYmFja0NvbG9yKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpHcmFmT2JqX0dldFBvcnRPcENvbG9yKEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSR0JDb2xvciBvcENvbG9yOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSR0JDb2xvciBvcENvbG9yOwogI2lmbmRlZiBHZXRQb3J0T3BDb2xvcgotCVB5TWFjX1BSRUNIRUNLKEdldFBvcnRPcENvbG9yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRQb3J0T3BDb2xvcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0UG9ydE9wQ29sb3IoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAmb3BDb2xvcik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZvcENvbG9yKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0UG9ydE9wQ29sb3IoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAmb3BDb2xvcik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZvcENvbG9yKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpHcmFmT2JqX0dldFBvcnRIaWxpdGVDb2xvcihHcmFmUG9ydE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUkdCQ29sb3IgaGlsaXRlQ29sb3I7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJHQkNvbG9yIGhpbGl0ZUNvbG9yOwogI2lmbmRlZiBHZXRQb3J0SGlsaXRlQ29sb3IKLQlQeU1hY19QUkVDSEVDSyhHZXRQb3J0SGlsaXRlQ29sb3IpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFBvcnRIaWxpdGVDb2xvcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0UG9ydEhpbGl0ZUNvbG9yKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICZoaWxpdGVDb2xvcik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZoaWxpdGVDb2xvcik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldFBvcnRIaWxpdGVDb2xvcihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAmaGlsaXRlQ29sb3IpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUWRSR0JfTmV3LCAmaGlsaXRlQ29sb3IpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfR2V0UG9ydFRleHRGb250KEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IF9ydjsKICNpZm5kZWYgR2V0UG9ydFRleHRGb250Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0UG9ydFRleHRGb250KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRQb3J0VGV4dEZvbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFBvcnRUZXh0Rm9udChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0UG9ydFRleHRGb250KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfR2V0UG9ydFRleHRGYWNlKEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTdHlsZSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFN0eWxlIF9ydjsKICNpZm5kZWYgR2V0UG9ydFRleHRGYWNlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0UG9ydFRleHRGYWNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRQb3J0VGV4dEZhY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFBvcnRUZXh0RmFjZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0UG9ydFRleHRGYWNlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfR2V0UG9ydFRleHRNb2RlKEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IF9ydjsKICNpZm5kZWYgR2V0UG9ydFRleHRNb2RlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0UG9ydFRleHRNb2RlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRQb3J0VGV4dE1vZGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFBvcnRUZXh0TW9kZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0UG9ydFRleHRNb2RlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfR2V0UG9ydFRleHRTaXplKEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IF9ydjsKICNpZm5kZWYgR2V0UG9ydFRleHRTaXplCi0JUHlNYWNfUFJFQ0hFQ0soR2V0UG9ydFRleHRTaXplKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRQb3J0VGV4dFNpemUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFBvcnRUZXh0U2l6ZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0UG9ydFRleHRTaXplKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfR2V0UG9ydENoRXh0cmEoR3JhZlBvcnRPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgX3J2OwogI2lmbmRlZiBHZXRQb3J0Q2hFeHRyYQotCVB5TWFjX1BSRUNIRUNLKEdldFBvcnRDaEV4dHJhKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRQb3J0Q2hFeHRyYSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0UG9ydENoRXh0cmEoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFBvcnRDaEV4dHJhKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfR2V0UG9ydEZyYWNIUGVuTG9jYXRpb24oR3JhZlBvcnRPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgX3J2OwogI2lmbmRlZiBHZXRQb3J0RnJhY0hQZW5Mb2NhdGlvbgotCVB5TWFjX1BSRUNIRUNLKEdldFBvcnRGcmFjSFBlbkxvY2F0aW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRQb3J0RnJhY0hQZW5Mb2NhdGlvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0UG9ydEZyYWNIUGVuTG9jYXRpb24oX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFBvcnRGcmFjSFBlbkxvY2F0aW9uKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfR2V0UG9ydFNwRXh0cmEoR3JhZlBvcnRPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUZpeGVkIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgRml4ZWQgX3J2OwogI2lmbmRlZiBHZXRQb3J0U3BFeHRyYQotCVB5TWFjX1BSRUNIRUNLKEdldFBvcnRTcEV4dHJhKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRQb3J0U3BFeHRyYSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0UG9ydFNwRXh0cmEoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRQb3J0U3BFeHRyYShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRml4ZWQsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqR3JhZk9ial9HZXRQb3J0UGVuVmlzaWJpbGl0eShHcmFmUG9ydE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBfcnY7CiAjaWZuZGVmIEdldFBvcnRQZW5WaXNpYmlsaXR5Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0UG9ydFBlblZpc2liaWxpdHkpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFBvcnRQZW5WaXNpYmlsaXR5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRQb3J0UGVuVmlzaWJpbGl0eShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0UG9ydFBlblZpc2liaWxpdHkoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqR3JhZk9ial9HZXRQb3J0VmlzaWJsZVJlZ2lvbihHcmFmUG9ydE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIF9ydjsKLQlSZ25IYW5kbGUgdmlzUmduOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZ25IYW5kbGUgX3J2OworICAgIFJnbkhhbmRsZSB2aXNSZ247CiAjaWZuZGVmIEdldFBvcnRWaXNpYmxlUmVnaW9uCi0JUHlNYWNfUFJFQ0hFQ0soR2V0UG9ydFZpc2libGVSZWdpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFBvcnRWaXNpYmxlUmVnaW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ2aXNSZ24pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRQb3J0VmlzaWJsZVJlZ2lvbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpc1Jnbik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ2aXNSZ24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRQb3J0VmlzaWJsZVJlZ2lvbihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpc1Jnbik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfR2V0UG9ydENsaXBSZWdpb24oR3JhZlBvcnRPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJnbkhhbmRsZSBfcnY7Ci0JUmduSGFuZGxlIGNsaXBSZ247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSBfcnY7CisgICAgUmduSGFuZGxlIGNsaXBSZ247CiAjaWZuZGVmIEdldFBvcnRDbGlwUmVnaW9uCi0JUHlNYWNfUFJFQ0hFQ0soR2V0UG9ydENsaXBSZWdpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFBvcnRDbGlwUmVnaW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZjbGlwUmduKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0UG9ydENsaXBSZWdpb24oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICBjbGlwUmduKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmNsaXBSZ24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRQb3J0Q2xpcFJlZ2lvbihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBSZ24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpHcmFmT2JqX0dldFBvcnRCYWNrUGl4UGF0KEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQaXhQYXRIYW5kbGUgX3J2OwotCVBpeFBhdEhhbmRsZSBiYWNrUGF0dGVybjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUGl4UGF0SGFuZGxlIF9ydjsKKyAgICBQaXhQYXRIYW5kbGUgYmFja1BhdHRlcm47CiAjaWZuZGVmIEdldFBvcnRCYWNrUGl4UGF0Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0UG9ydEJhY2tQaXhQYXQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFBvcnRCYWNrUGl4UGF0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZiYWNrUGF0dGVybikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFBvcnRCYWNrUGl4UGF0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgYmFja1BhdHRlcm4pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmYmFja1BhdHRlcm4pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRQb3J0QmFja1BpeFBhdChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tQYXR0ZXJuKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqR3JhZk9ial9HZXRQb3J0UGVuUGl4UGF0KEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQaXhQYXRIYW5kbGUgX3J2OwotCVBpeFBhdEhhbmRsZSBwZW5QYXR0ZXJuOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQaXhQYXRIYW5kbGUgX3J2OworICAgIFBpeFBhdEhhbmRsZSBwZW5QYXR0ZXJuOwogI2lmbmRlZiBHZXRQb3J0UGVuUGl4UGF0Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0UG9ydFBlblBpeFBhdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0UG9ydFBlblBpeFBhdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcGVuUGF0dGVybikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFBvcnRQZW5QaXhQYXQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgIHBlblBhdHRlcm4pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcGVuUGF0dGVybikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFBvcnRQZW5QaXhQYXQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlblBhdHRlcm4pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpHcmFmT2JqX0dldFBvcnRGaWxsUGl4UGF0KEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQaXhQYXRIYW5kbGUgX3J2OwotCVBpeFBhdEhhbmRsZSBmaWxsUGF0dGVybjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUGl4UGF0SGFuZGxlIF9ydjsKKyAgICBQaXhQYXRIYW5kbGUgZmlsbFBhdHRlcm47CiAjaWZuZGVmIEdldFBvcnRGaWxsUGl4UGF0Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0UG9ydEZpbGxQaXhQYXQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFBvcnRGaWxsUGl4UGF0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZmaWxsUGF0dGVybikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFBvcnRGaWxsUGl4UGF0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgZmlsbFBhdHRlcm4pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZmlsbFBhdHRlcm4pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRQb3J0RmlsbFBpeFBhdChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxQYXR0ZXJuKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqR3JhZk9ial9HZXRQb3J0UGVuU2l6ZShHcmFmUG9ydE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUG9pbnQgcGVuU2l6ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUG9pbnQgcGVuU2l6ZTsKICNpZm5kZWYgR2V0UG9ydFBlblNpemUKLQlQeU1hY19QUkVDSEVDSyhHZXRQb3J0UGVuU2l6ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0UG9ydFBlblNpemUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnBlblNpemUpKQotCQlyZXR1cm4gTlVMTDsKLQlHZXRQb3J0UGVuU2l6ZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICZwZW5TaXplKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUG9pbnQsIHBlblNpemUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZwZW5TaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0UG9ydFBlblNpemUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAmcGVuU2l6ZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFBvaW50LCBwZW5TaXplKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpHcmFmT2JqX0dldFBvcnRQZW5Nb2RlKEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTSW50MzIgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTSW50MzIgX3J2OwogI2lmbmRlZiBHZXRQb3J0UGVuTW9kZQotCVB5TWFjX1BSRUNIRUNLKEdldFBvcnRQZW5Nb2RlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRQb3J0UGVuTW9kZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0UG9ydFBlbk1vZGUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFBvcnRQZW5Nb2RlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfR2V0UG9ydFBlbkxvY2F0aW9uKEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQb2ludCBwZW5Mb2NhdGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUG9pbnQgcGVuTG9jYXRpb247CiAjaWZuZGVmIEdldFBvcnRQZW5Mb2NhdGlvbgotCVB5TWFjX1BSRUNIRUNLKEdldFBvcnRQZW5Mb2NhdGlvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0UG9ydFBlbkxvY2F0aW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZwZW5Mb2NhdGlvbikpCi0JCXJldHVybiBOVUxMOwotCUdldFBvcnRQZW5Mb2NhdGlvbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAmcGVuTG9jYXRpb24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRQb2ludCwgcGVuTG9jYXRpb24pOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZwZW5Mb2NhdGlvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldFBvcnRQZW5Mb2NhdGlvbihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAmcGVuTG9jYXRpb24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRQb2ludCwgcGVuTG9jYXRpb24pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfSXNQb3J0UmVnaW9uQmVpbmdEZWZpbmVkKEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CiAjaWZuZGVmIElzUG9ydFJlZ2lvbkJlaW5nRGVmaW5lZAotCVB5TWFjX1BSRUNIRUNLKElzUG9ydFJlZ2lvbkJlaW5nRGVmaW5lZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSXNQb3J0UmVnaW9uQmVpbmdEZWZpbmVkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBJc1BvcnRSZWdpb25CZWluZ0RlZmluZWQoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IElzUG9ydFJlZ2lvbkJlaW5nRGVmaW5lZChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpHcmFmT2JqX0lzUG9ydFBpY3R1cmVCZWluZ0RlZmluZWQoR3JhZlBvcnRPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKICNpZm5kZWYgSXNQb3J0UGljdHVyZUJlaW5nRGVmaW5lZAotCVB5TWFjX1BSRUNIRUNLKElzUG9ydFBpY3R1cmVCZWluZ0RlZmluZWQpOworICAgIFB5TWFjX1BSRUNIRUNLKElzUG9ydFBpY3R1cmVCZWluZ0RlZmluZWQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IElzUG9ydFBpY3R1cmVCZWluZ0RlZmluZWQoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IElzUG9ydFBpY3R1cmVCZWluZ0RlZmluZWQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqR3JhZk9ial9Jc1BvcnRQb2x5QmVpbmdEZWZpbmVkKEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CiAjaWZuZGVmIElzUG9ydFBvbHlCZWluZ0RlZmluZWQKLQlQeU1hY19QUkVDSEVDSyhJc1BvcnRQb2x5QmVpbmdEZWZpbmVkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhJc1BvcnRQb2x5QmVpbmdEZWZpbmVkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBJc1BvcnRQb2x5QmVpbmdEZWZpbmVkKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBJc1BvcnRQb2x5QmVpbmdEZWZpbmVkKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfSXNQb3J0T2Zmc2NyZWVuKEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CiAjaWZuZGVmIElzUG9ydE9mZnNjcmVlbgotCVB5TWFjX1BSRUNIRUNLKElzUG9ydE9mZnNjcmVlbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soSXNQb3J0T2Zmc2NyZWVuKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBJc1BvcnRPZmZzY3JlZW4oX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IElzUG9ydE9mZnNjcmVlbihfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpHcmFmT2JqX0lzUG9ydENvbG9yKEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CiAjaWZuZGVmIElzUG9ydENvbG9yCi0JUHlNYWNfUFJFQ0hFQ0soSXNQb3J0Q29sb3IpOworICAgIFB5TWFjX1BSRUNIRUNLKElzUG9ydENvbG9yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBJc1BvcnRDb2xvcihfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gSXNQb3J0Q29sb3IoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqR3JhZk9ial9Jc1BvcnRWaXNpYmxlUmVnaW9uRW1wdHkoR3JhZlBvcnRPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKICNpZm5kZWYgSXNQb3J0VmlzaWJsZVJlZ2lvbkVtcHR5Ci0JUHlNYWNfUFJFQ0hFQ0soSXNQb3J0VmlzaWJsZVJlZ2lvbkVtcHR5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhJc1BvcnRWaXNpYmxlUmVnaW9uRW1wdHkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IElzUG9ydFZpc2libGVSZWdpb25FbXB0eShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gSXNQb3J0VmlzaWJsZVJlZ2lvbkVtcHR5KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfSXNQb3J0Q2xpcFJlZ2lvbkVtcHR5KEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CiAjaWZuZGVmIElzUG9ydENsaXBSZWdpb25FbXB0eQotCVB5TWFjX1BSRUNIRUNLKElzUG9ydENsaXBSZWdpb25FbXB0eSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSXNQb3J0Q2xpcFJlZ2lvbkVtcHR5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBJc1BvcnRDbGlwUmVnaW9uRW1wdHkoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IElzUG9ydENsaXBSZWdpb25FbXB0eShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpHcmFmT2JqX1NlY3RSZWdpb25XaXRoUG9ydENsaXBSZWdpb24oR3JhZlBvcnRPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJnbkhhbmRsZSBpb1JlZ2lvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIGlvUmVnaW9uOwogI2lmbmRlZiBTZWN0UmVnaW9uV2l0aFBvcnRDbGlwUmVnaW9uCi0JUHlNYWNfUFJFQ0hFQ0soU2VjdFJlZ2lvbldpdGhQb3J0Q2xpcFJlZ2lvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2VjdFJlZ2lvbldpdGhQb3J0Q2xpcFJlZ2lvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaW9SZWdpb24pKQotCQlyZXR1cm4gTlVMTDsKLQlTZWN0UmVnaW9uV2l0aFBvcnRDbGlwUmVnaW9uKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb1JlZ2lvbik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZpb1JlZ2lvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNlY3RSZWdpb25XaXRoUG9ydENsaXBSZWdpb24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvUmVnaW9uKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqR3JhZk9ial9TZWN0UmVnaW9uV2l0aFBvcnRWaXNpYmxlUmVnaW9uKEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZ25IYW5kbGUgaW9SZWdpb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSBpb1JlZ2lvbjsKICNpZm5kZWYgU2VjdFJlZ2lvbldpdGhQb3J0VmlzaWJsZVJlZ2lvbgotCVB5TWFjX1BSRUNIRUNLKFNlY3RSZWdpb25XaXRoUG9ydFZpc2libGVSZWdpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKFNlY3RSZWdpb25XaXRoUG9ydFZpc2libGVSZWdpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmlvUmVnaW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2VjdFJlZ2lvbldpdGhQb3J0VmlzaWJsZVJlZ2lvbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9SZWdpb24pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaW9SZWdpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZWN0UmVnaW9uV2l0aFBvcnRWaXNpYmxlUmVnaW9uKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb1JlZ2lvbik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfU3dhcFBvcnRQaWNTYXZlSGFuZGxlKEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlIYW5kbGUgX3J2OwotCUhhbmRsZSBpblBpY1NhdmVIZGw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEhhbmRsZSBfcnY7CisgICAgSGFuZGxlIGluUGljU2F2ZUhkbDsKICNpZm5kZWYgU3dhcFBvcnRQaWNTYXZlSGFuZGxlCi0JUHlNYWNfUFJFQ0hFQ0soU3dhcFBvcnRQaWNTYXZlSGFuZGxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTd2FwUG9ydFBpY1NhdmVIYW5kbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmluUGljU2F2ZUhkbCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFN3YXBQb3J0UGljU2F2ZUhhbmRsZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblBpY1NhdmVIZGwpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaW5QaWNTYXZlSGRsKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU3dhcFBvcnRQaWNTYXZlSGFuZGxlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluUGljU2F2ZUhkbCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfU3dhcFBvcnRQb2x5U2F2ZUhhbmRsZShHcmFmUG9ydE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JSGFuZGxlIF9ydjsKLQlIYW5kbGUgaW5Qb2x5U2F2ZUhkbDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgSGFuZGxlIF9ydjsKKyAgICBIYW5kbGUgaW5Qb2x5U2F2ZUhkbDsKICNpZm5kZWYgU3dhcFBvcnRQb2x5U2F2ZUhhbmRsZQotCVB5TWFjX1BSRUNIRUNLKFN3YXBQb3J0UG9seVNhdmVIYW5kbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFN3YXBQb3J0UG9seVNhdmVIYW5kbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmluUG9seVNhdmVIZGwpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTd2FwUG9ydFBvbHlTYXZlSGFuZGxlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblBvbHlTYXZlSGRsKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmluUG9seVNhdmVIZGwpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTd2FwUG9ydFBvbHlTYXZlSGFuZGxlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblBvbHlTYXZlSGRsKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqR3JhZk9ial9Td2FwUG9ydFJlZ2lvblNhdmVIYW5kbGUoR3JhZlBvcnRPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUhhbmRsZSBfcnY7Ci0JSGFuZGxlIGluUmVnaW9uU2F2ZUhkbDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgSGFuZGxlIF9ydjsKKyAgICBIYW5kbGUgaW5SZWdpb25TYXZlSGRsOwogI2lmbmRlZiBTd2FwUG9ydFJlZ2lvblNhdmVIYW5kbGUKLQlQeU1hY19QUkVDSEVDSyhTd2FwUG9ydFJlZ2lvblNhdmVIYW5kbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFN3YXBQb3J0UmVnaW9uU2F2ZUhhbmRsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaW5SZWdpb25TYXZlSGRsKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU3dhcFBvcnRSZWdpb25TYXZlSGFuZGxlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluUmVnaW9uU2F2ZUhkbCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZpblJlZ2lvblNhdmVIZGwpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTd2FwUG9ydFJlZ2lvblNhdmVIYW5kbGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5SZWdpb25TYXZlSGRsKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqR3JhZk9ial9TZXRQb3J0Qm91bmRzKEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZWN0IHJlY3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlY3QgcmVjdDsKICNpZm5kZWYgU2V0UG9ydEJvdW5kcwotCVB5TWFjX1BSRUNIRUNLKFNldFBvcnRCb3VuZHMpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFBvcnRCb3VuZHMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmcmVjdCkpCi0JCXJldHVybiBOVUxMOwotCVNldFBvcnRCb3VuZHMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICZyZWN0KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmcmVjdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldFBvcnRCb3VuZHMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICZyZWN0KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqR3JhZk9ial9TZXRQb3J0T3BDb2xvcihHcmFmUG9ydE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUkdCQ29sb3Igb3BDb2xvcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUkdCQ29sb3Igb3BDb2xvcjsKICNpZm5kZWYgU2V0UG9ydE9wQ29sb3IKLQlQeU1hY19QUkVDSEVDSyhTZXRQb3J0T3BDb2xvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0UG9ydE9wQ29sb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBRZFJHQl9Db252ZXJ0LCAmb3BDb2xvcikpCi0JCXJldHVybiBOVUxMOwotCVNldFBvcnRPcENvbG9yKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgJm9wQ29sb3IpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFFkUkdCX0NvbnZlcnQsICZvcENvbG9yKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0UG9ydE9wQ29sb3IoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAmb3BDb2xvcik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfU2V0UG9ydFRleHRGb250KEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCB0eEZvbnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IHR4Rm9udDsKICNpZm5kZWYgU2V0UG9ydFRleHRGb250Ci0JUHlNYWNfUFJFQ0hFQ0soU2V0UG9ydFRleHRGb250KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRQb3J0VGV4dEZvbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0eEZvbnQpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRQb3J0VGV4dEZvbnQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgdHhGb250KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0eEZvbnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRQb3J0VGV4dEZvbnQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgdHhGb250KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqR3JhZk9ial9TZXRQb3J0VGV4dFNpemUoR3JhZlBvcnRPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IHR4U2l6ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgdHhTaXplOwogI2lmbmRlZiBTZXRQb3J0VGV4dFNpemUKLQlQeU1hY19QUkVDSEVDSyhTZXRQb3J0VGV4dFNpemUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFBvcnRUZXh0U2l6ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnR4U2l6ZSkpCi0JCXJldHVybiBOVUxMOwotCVNldFBvcnRUZXh0U2l6ZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICB0eFNpemUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnR4U2l6ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldFBvcnRUZXh0U2l6ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICB0eFNpemUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpHcmFmT2JqX1NldFBvcnRUZXh0RmFjZShHcmFmUG9ydE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JU3R5bGVQYXJhbWV0ZXIgZmFjZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgU3R5bGVQYXJhbWV0ZXIgZmFjZTsKICNpZm5kZWYgU2V0UG9ydFRleHRGYWNlCi0JUHlNYWNfUFJFQ0hFQ0soU2V0UG9ydFRleHRGYWNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRQb3J0VGV4dEZhY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZmYWNlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0UG9ydFRleHRGYWNlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgIGZhY2UpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZhY2UpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRQb3J0VGV4dEZhY2UoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgZmFjZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfU2V0UG9ydFRleHRNb2RlKEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBtb2RlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBtb2RlOwogI2lmbmRlZiBTZXRQb3J0VGV4dE1vZGUKLQlQeU1hY19QUkVDSEVDSyhTZXRQb3J0VGV4dE1vZGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFBvcnRUZXh0TW9kZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vZGUpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRQb3J0VGV4dE1vZGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgbW9kZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbW9kZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldFBvcnRUZXh0TW9kZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICBtb2RlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqR3JhZk9ial9TZXRQb3J0VmlzaWJsZVJlZ2lvbihHcmFmUG9ydE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIHZpc1JnbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIHZpc1JnbjsKICNpZm5kZWYgU2V0UG9ydFZpc2libGVSZWdpb24KLQlQeU1hY19QUkVDSEVDSyhTZXRQb3J0VmlzaWJsZVJlZ2lvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0UG9ydFZpc2libGVSZWdpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnZpc1JnbikpCi0JCXJldHVybiBOVUxMOwotCVNldFBvcnRWaXNpYmxlUmVnaW9uKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgdmlzUmduKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnZpc1JnbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldFBvcnRWaXNpYmxlUmVnaW9uKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgdmlzUmduKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqR3JhZk9ial9TZXRQb3J0Q2xpcFJlZ2lvbihHcmFmUG9ydE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIGNsaXBSZ247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSBjbGlwUmduOwogI2lmbmRlZiBTZXRQb3J0Q2xpcFJlZ2lvbgotCVB5TWFjX1BSRUNIRUNLKFNldFBvcnRDbGlwUmVnaW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRQb3J0Q2xpcFJlZ2lvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmY2xpcFJnbikpCi0JCXJldHVybiBOVUxMOwotCVNldFBvcnRDbGlwUmVnaW9uKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgY2xpcFJnbik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZjbGlwUmduKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0UG9ydENsaXBSZWdpb24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICBjbGlwUmduKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqR3JhZk9ial9TZXRQb3J0UGVuUGl4UGF0KEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQaXhQYXRIYW5kbGUgcGVuUGF0dGVybjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUGl4UGF0SGFuZGxlIHBlblBhdHRlcm47CiAjaWZuZGVmIFNldFBvcnRQZW5QaXhQYXQKLQlQeU1hY19QUkVDSEVDSyhTZXRQb3J0UGVuUGl4UGF0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRQb3J0UGVuUGl4UGF0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwZW5QYXR0ZXJuKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0UG9ydFBlblBpeFBhdChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgcGVuUGF0dGVybik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwZW5QYXR0ZXJuKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0UG9ydFBlblBpeFBhdChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgcGVuUGF0dGVybik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfU2V0UG9ydEZpbGxQaXhQYXQoR3JhZlBvcnRPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBpeFBhdEhhbmRsZSBwZW5QYXR0ZXJuOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQaXhQYXRIYW5kbGUgcGVuUGF0dGVybjsKICNpZm5kZWYgU2V0UG9ydEZpbGxQaXhQYXQKLQlQeU1hY19QUkVDSEVDSyhTZXRQb3J0RmlsbFBpeFBhdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0UG9ydEZpbGxQaXhQYXQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBlblBhdHRlcm4pKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRQb3J0RmlsbFBpeFBhdChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgIHBlblBhdHRlcm4pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcGVuUGF0dGVybikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldFBvcnRGaWxsUGl4UGF0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgcGVuUGF0dGVybik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfU2V0UG9ydEJhY2tQaXhQYXQoR3JhZlBvcnRPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBpeFBhdEhhbmRsZSBiYWNrUGF0dGVybjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUGl4UGF0SGFuZGxlIGJhY2tQYXR0ZXJuOwogI2lmbmRlZiBTZXRQb3J0QmFja1BpeFBhdAotCVB5TWFjX1BSRUNIRUNLKFNldFBvcnRCYWNrUGl4UGF0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRQb3J0QmFja1BpeFBhdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmYmFja1BhdHRlcm4pKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRQb3J0QmFja1BpeFBhdChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgIGJhY2tQYXR0ZXJuKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmJhY2tQYXR0ZXJuKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0UG9ydEJhY2tQaXhQYXQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICBiYWNrUGF0dGVybik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfU2V0UG9ydFBlblNpemUoR3JhZlBvcnRPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBvaW50IHBlblNpemU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBvaW50IHBlblNpemU7CiAjaWZuZGVmIFNldFBvcnRQZW5TaXplCi0JUHlNYWNfUFJFQ0hFQ0soU2V0UG9ydFBlblNpemUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFBvcnRQZW5TaXplKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZwZW5TaXplKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0UG9ydFBlblNpemUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICBwZW5TaXplKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnBlblNpemUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRQb3J0UGVuU2l6ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgIHBlblNpemUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpHcmFmT2JqX1NldFBvcnRQZW5Nb2RlKEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTSW50MzIgcGVuTW9kZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgU0ludDMyIHBlbk1vZGU7CiAjaWZuZGVmIFNldFBvcnRQZW5Nb2RlCi0JUHlNYWNfUFJFQ0hFQ0soU2V0UG9ydFBlbk1vZGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFBvcnRQZW5Nb2RlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcGVuTW9kZSkpCi0JCXJldHVybiBOVUxMOwotCVNldFBvcnRQZW5Nb2RlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgcGVuTW9kZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGVuTW9kZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldFBvcnRQZW5Nb2RlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgcGVuTW9kZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfU2V0UG9ydEZyYWNIUGVuTG9jYXRpb24oR3JhZlBvcnRPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IHBuTG9jSEZyYWM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IHBuTG9jSEZyYWM7CiAjaWZuZGVmIFNldFBvcnRGcmFjSFBlbkxvY2F0aW9uCi0JUHlNYWNfUFJFQ0hFQ0soU2V0UG9ydEZyYWNIUGVuTG9jYXRpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFBvcnRGcmFjSFBlbkxvY2F0aW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcG5Mb2NIRnJhYykpCi0JCXJldHVybiBOVUxMOwotCVNldFBvcnRGcmFjSFBlbkxvY2F0aW9uKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgcG5Mb2NIRnJhYyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcG5Mb2NIRnJhYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldFBvcnRGcmFjSFBlbkxvY2F0aW9uKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG5Mb2NIRnJhYyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfRGlzcG9zZVBvcnQoR3JhZlBvcnRPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgRGlzcG9zZVBvcnQKLQlQeU1hY19QUkVDSEVDSyhEaXNwb3NlUG9ydCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGlzcG9zZVBvcnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCURpc3Bvc2VQb3J0KF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgRGlzcG9zZVBvcnQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfUURMb2NhbFRvR2xvYmFsUG9pbnQoR3JhZlBvcnRPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBvaW50IHBvaW50OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQb2ludCBwb2ludDsKICNpZm5kZWYgUURMb2NhbFRvR2xvYmFsUG9pbnQKLQlQeU1hY19QUkVDSEVDSyhRRExvY2FsVG9HbG9iYWxQb2ludCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUURMb2NhbFRvR2xvYmFsUG9pbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnBvaW50KSkKLQkJcmV0dXJuIE5VTEw7Ci0JUURMb2NhbFRvR2xvYmFsUG9pbnQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAmcG9pbnQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRQb2ludCwgcG9pbnQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZwb2ludCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFFETG9jYWxUb0dsb2JhbFBvaW50KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgJnBvaW50KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUG9pbnQsIHBvaW50KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpHcmFmT2JqX1FER2xvYmFsVG9Mb2NhbFBvaW50KEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQb2ludCBwb2ludDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUG9pbnQgcG9pbnQ7CiAjaWZuZGVmIFFER2xvYmFsVG9Mb2NhbFBvaW50Ci0JUHlNYWNfUFJFQ0hFQ0soUURHbG9iYWxUb0xvY2FsUG9pbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKFFER2xvYmFsVG9Mb2NhbFBvaW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZwb2ludCkpCi0JCXJldHVybiBOVUxMOwotCVFER2xvYmFsVG9Mb2NhbFBvaW50KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgJnBvaW50KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUG9pbnQsIHBvaW50KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmcG9pbnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBRREdsb2JhbFRvTG9jYWxQb2ludChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICZwb2ludCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFBvaW50LCBwb2ludCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqR3JhZk9ial9RRExvY2FsVG9HbG9iYWxSZWN0KEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZWN0IGJvdW5kczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmVjdCBib3VuZHM7CiAjaWZuZGVmIFFETG9jYWxUb0dsb2JhbFJlY3QKLQlQeU1hY19QUkVDSEVDSyhRRExvY2FsVG9HbG9iYWxSZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhRRExvY2FsVG9HbG9iYWxSZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlRRExvY2FsVG9HbG9iYWxSZWN0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAmYm91bmRzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmJvdW5kcyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFFETG9jYWxUb0dsb2JhbFJlY3QoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmYm91bmRzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpHcmFmT2JqX1FER2xvYmFsVG9Mb2NhbFJlY3QoR3JhZlBvcnRPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3QgYm91bmRzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IGJvdW5kczsKICNpZm5kZWYgUURHbG9iYWxUb0xvY2FsUmVjdAotCVB5TWFjX1BSRUNIRUNLKFFER2xvYmFsVG9Mb2NhbFJlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKFFER2xvYmFsVG9Mb2NhbFJlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCVFER2xvYmFsVG9Mb2NhbFJlY3QoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICZib3VuZHMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmYm91bmRzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUURHbG9iYWxUb0xvY2FsUmVjdChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kcyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZib3VuZHMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfUURMb2NhbFRvR2xvYmFsUmVnaW9uKEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZ25IYW5kbGUgX3J2OwotCVJnbkhhbmRsZSByZWdpb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSBfcnY7CisgICAgUmduSGFuZGxlIHJlZ2lvbjsKICNpZm5kZWYgUURMb2NhbFRvR2xvYmFsUmVnaW9uCi0JUHlNYWNfUFJFQ0hFQ0soUURMb2NhbFRvR2xvYmFsUmVnaW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhRRExvY2FsVG9HbG9iYWxSZWdpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJlZ2lvbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFFETG9jYWxUb0dsb2JhbFJlZ2lvbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpb24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmVnaW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gUURMb2NhbFRvR2xvYmFsUmVnaW9uKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfUURHbG9iYWxUb0xvY2FsUmVnaW9uKEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZ25IYW5kbGUgX3J2OwotCVJnbkhhbmRsZSByZWdpb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSBfcnY7CisgICAgUmduSGFuZGxlIHJlZ2lvbjsKICNpZm5kZWYgUURHbG9iYWxUb0xvY2FsUmVnaW9uCi0JUHlNYWNfUFJFQ0hFQ0soUURHbG9iYWxUb0xvY2FsUmVnaW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhRREdsb2JhbFRvTG9jYWxSZWdpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJlZ2lvbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFFER2xvYmFsVG9Mb2NhbFJlZ2lvbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpb24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmVnaW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gUURHbG9iYWxUb0xvY2FsUmVnaW9uKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfUURJc1BvcnRCdWZmZXJlZChHcmFmUG9ydE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OwogI2lmbmRlZiBRRElzUG9ydEJ1ZmZlcmVkCi0JUHlNYWNfUFJFQ0hFQ0soUURJc1BvcnRCdWZmZXJlZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUURJc1BvcnRCdWZmZXJlZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gUURJc1BvcnRCdWZmZXJlZChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gUURJc1BvcnRCdWZmZXJlZChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpHcmFmT2JqX1FESXNQb3J0QnVmZmVyRGlydHkoR3JhZlBvcnRPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKICNpZm5kZWYgUURJc1BvcnRCdWZmZXJEaXJ0eQotCVB5TWFjX1BSRUNIRUNLKFFESXNQb3J0QnVmZmVyRGlydHkpOworICAgIFB5TWFjX1BSRUNIRUNLKFFESXNQb3J0QnVmZmVyRGlydHkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFFESXNQb3J0QnVmZmVyRGlydHkoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFFESXNQb3J0QnVmZmVyRGlydHkoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqR3JhZk9ial9RREZsdXNoUG9ydEJ1ZmZlcihHcmFmUG9ydE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIHJlZ2lvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIHJlZ2lvbjsKICNpZm5kZWYgUURGbHVzaFBvcnRCdWZmZXIKLQlQeU1hY19QUkVDSEVDSyhRREZsdXNoUG9ydEJ1ZmZlcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soUURGbHVzaFBvcnRCdWZmZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfQ29udmVydCwgJnJlZ2lvbikpCi0JCXJldHVybiBOVUxMOwotCVFERmx1c2hQb3J0QnVmZmVyKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgcmVnaW9uKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfQ29udmVydCwgJnJlZ2lvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFFERmx1c2hQb3J0QnVmZmVyKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqR3JhZk9ial9RREdldERpcnR5UmVnaW9uKEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVJnbkhhbmRsZSByZ247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgUmduSGFuZGxlIHJnbjsKICNpZm5kZWYgUURHZXREaXJ0eVJlZ2lvbgotCVB5TWFjX1BSRUNIRUNLKFFER2V0RGlydHlSZWdpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKFFER2V0RGlydHlSZWdpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBRREdldERpcnR5UmVnaW9uKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgcmduKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmduKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFFER2V0RGlydHlSZWdpb24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZ24pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfUURTZXREaXJ0eVJlZ2lvbihHcmFmUG9ydE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlSZ25IYW5kbGUgcmduOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFJnbkhhbmRsZSByZ247CiAjaWZuZGVmIFFEU2V0RGlydHlSZWdpb24KLQlQeU1hY19QUkVDSEVDSyhRRFNldERpcnR5UmVnaW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhRRFNldERpcnR5UmVnaW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZ24pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUURTZXREaXJ0eVJlZ2lvbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgIHJnbik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBRRFNldERpcnR5UmVnaW9uKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmduKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIEdyYWZPYmpfbWV0aG9kc1tdID0gewotCXsiTWFjU2V0UG9ydCIsIChQeUNGdW5jdGlvbilHcmFmT2JqX01hY1NldFBvcnQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IlFEU3dhcFBvcnQiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9RRFN3YXBQb3J0LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydiwgQ0dyYWZQdHIgb3V0T2xkUG9ydCkiKX0sCi0JeyJJc1ZhbGlkUG9ydCIsIChQeUNGdW5jdGlvbilHcmFmT2JqX0lzVmFsaWRQb3J0LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJHZXRQb3J0UGl4TWFwIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfR2V0UG9ydFBpeE1hcCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoUGl4TWFwSGFuZGxlIF9ydikiKX0sCi0JeyJHZXRQb3J0Qml0TWFwRm9yQ29weUJpdHMiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9HZXRQb3J0Qml0TWFwRm9yQ29weUJpdHMsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKGNvbnN0IEJpdE1hcCAqIF9ydikiKX0sCi0JeyJHZXRQb3J0Qm91bmRzIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfR2V0UG9ydEJvdW5kcywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoUmVjdCByZWN0KSIpfSwKLQl7IkdldFBvcnRGb3JlQ29sb3IiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9HZXRQb3J0Rm9yZUNvbG9yLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChSR0JDb2xvciBmb3JlQ29sb3IpIil9LAotCXsiR2V0UG9ydEJhY2tDb2xvciIsIChQeUNGdW5jdGlvbilHcmFmT2JqX0dldFBvcnRCYWNrQ29sb3IsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFJHQkNvbG9yIGJhY2tDb2xvcikiKX0sCi0JeyJHZXRQb3J0T3BDb2xvciIsIChQeUNGdW5jdGlvbilHcmFmT2JqX0dldFBvcnRPcENvbG9yLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChSR0JDb2xvciBvcENvbG9yKSIpfSwKLQl7IkdldFBvcnRIaWxpdGVDb2xvciIsIChQeUNGdW5jdGlvbilHcmFmT2JqX0dldFBvcnRIaWxpdGVDb2xvciwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoUkdCQ29sb3IgaGlsaXRlQ29sb3IpIil9LAotCXsiR2V0UG9ydFRleHRGb250IiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfR2V0UG9ydFRleHRGb250LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChzaG9ydCBfcnYpIil9LAotCXsiR2V0UG9ydFRleHRGYWNlIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfR2V0UG9ydFRleHRGYWNlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChTdHlsZSBfcnYpIil9LAotCXsiR2V0UG9ydFRleHRNb2RlIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfR2V0UG9ydFRleHRNb2RlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChzaG9ydCBfcnYpIil9LAotCXsiR2V0UG9ydFRleHRTaXplIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfR2V0UG9ydFRleHRTaXplLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChzaG9ydCBfcnYpIil9LAotCXsiR2V0UG9ydENoRXh0cmEiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9HZXRQb3J0Q2hFeHRyYSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgX3J2KSIpfSwKLQl7IkdldFBvcnRGcmFjSFBlbkxvY2F0aW9uIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfR2V0UG9ydEZyYWNIUGVuTG9jYXRpb24sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKHNob3J0IF9ydikiKX0sCi0JeyJHZXRQb3J0U3BFeHRyYSIsIChQeUNGdW5jdGlvbilHcmFmT2JqX0dldFBvcnRTcEV4dHJhLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChGaXhlZCBfcnYpIil9LAotCXsiR2V0UG9ydFBlblZpc2liaWxpdHkiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9HZXRQb3J0UGVuVmlzaWJpbGl0eSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgX3J2KSIpfSwKLQl7IkdldFBvcnRWaXNpYmxlUmVnaW9uIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfR2V0UG9ydFZpc2libGVSZWdpb24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSB2aXNSZ24pIC0+IChSZ25IYW5kbGUgX3J2KSIpfSwKLQl7IkdldFBvcnRDbGlwUmVnaW9uIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfR2V0UG9ydENsaXBSZWdpb24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSBjbGlwUmduKSAtPiAoUmduSGFuZGxlIF9ydikiKX0sCi0JeyJHZXRQb3J0QmFja1BpeFBhdCIsIChQeUNGdW5jdGlvbilHcmFmT2JqX0dldFBvcnRCYWNrUGl4UGF0LCAxLAotCSBQeURvY19TVFIoIihQaXhQYXRIYW5kbGUgYmFja1BhdHRlcm4pIC0+IChQaXhQYXRIYW5kbGUgX3J2KSIpfSwKLQl7IkdldFBvcnRQZW5QaXhQYXQiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9HZXRQb3J0UGVuUGl4UGF0LCAxLAotCSBQeURvY19TVFIoIihQaXhQYXRIYW5kbGUgcGVuUGF0dGVybikgLT4gKFBpeFBhdEhhbmRsZSBfcnYpIil9LAotCXsiR2V0UG9ydEZpbGxQaXhQYXQiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9HZXRQb3J0RmlsbFBpeFBhdCwgMSwKLQkgUHlEb2NfU1RSKCIoUGl4UGF0SGFuZGxlIGZpbGxQYXR0ZXJuKSAtPiAoUGl4UGF0SGFuZGxlIF9ydikiKX0sCi0JeyJHZXRQb3J0UGVuU2l6ZSIsIChQeUNGdW5jdGlvbilHcmFmT2JqX0dldFBvcnRQZW5TaXplLCAxLAotCSBQeURvY19TVFIoIihQb2ludCBwZW5TaXplKSAtPiAoUG9pbnQgcGVuU2l6ZSkiKX0sCi0JeyJHZXRQb3J0UGVuTW9kZSIsIChQeUNGdW5jdGlvbilHcmFmT2JqX0dldFBvcnRQZW5Nb2RlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChTSW50MzIgX3J2KSIpfSwKLQl7IkdldFBvcnRQZW5Mb2NhdGlvbiIsIChQeUNGdW5jdGlvbilHcmFmT2JqX0dldFBvcnRQZW5Mb2NhdGlvbiwgMSwKLQkgUHlEb2NfU1RSKCIoUG9pbnQgcGVuTG9jYXRpb24pIC0+IChQb2ludCBwZW5Mb2NhdGlvbikiKX0sCi0JeyJJc1BvcnRSZWdpb25CZWluZ0RlZmluZWQiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9Jc1BvcnRSZWdpb25CZWluZ0RlZmluZWQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IklzUG9ydFBpY3R1cmVCZWluZ0RlZmluZWQiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9Jc1BvcnRQaWN0dXJlQmVpbmdEZWZpbmVkLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJJc1BvcnRQb2x5QmVpbmdEZWZpbmVkIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfSXNQb3J0UG9seUJlaW5nRGVmaW5lZCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiSXNQb3J0T2Zmc2NyZWVuIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfSXNQb3J0T2Zmc2NyZWVuLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJJc1BvcnRDb2xvciIsIChQeUNGdW5jdGlvbilHcmFmT2JqX0lzUG9ydENvbG9yLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJJc1BvcnRWaXNpYmxlUmVnaW9uRW1wdHkiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9Jc1BvcnRWaXNpYmxlUmVnaW9uRW1wdHksIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IklzUG9ydENsaXBSZWdpb25FbXB0eSIsIChQeUNGdW5jdGlvbilHcmFmT2JqX0lzUG9ydENsaXBSZWdpb25FbXB0eSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiU2VjdFJlZ2lvbldpdGhQb3J0Q2xpcFJlZ2lvbiIsIChQeUNGdW5jdGlvbilHcmFmT2JqX1NlY3RSZWdpb25XaXRoUG9ydENsaXBSZWdpb24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSBpb1JlZ2lvbikgLT4gTm9uZSIpfSwKLQl7IlNlY3RSZWdpb25XaXRoUG9ydFZpc2libGVSZWdpb24iLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9TZWN0UmVnaW9uV2l0aFBvcnRWaXNpYmxlUmVnaW9uLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgaW9SZWdpb24pIC0+IE5vbmUiKX0sCi0JeyJTd2FwUG9ydFBpY1NhdmVIYW5kbGUiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9Td2FwUG9ydFBpY1NhdmVIYW5kbGUsIDEsCi0JIFB5RG9jX1NUUigiKEhhbmRsZSBpblBpY1NhdmVIZGwpIC0+IChIYW5kbGUgX3J2KSIpfSwKLQl7IlN3YXBQb3J0UG9seVNhdmVIYW5kbGUiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9Td2FwUG9ydFBvbHlTYXZlSGFuZGxlLCAxLAotCSBQeURvY19TVFIoIihIYW5kbGUgaW5Qb2x5U2F2ZUhkbCkgLT4gKEhhbmRsZSBfcnYpIil9LAotCXsiU3dhcFBvcnRSZWdpb25TYXZlSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfU3dhcFBvcnRSZWdpb25TYXZlSGFuZGxlLCAxLAotCSBQeURvY19TVFIoIihIYW5kbGUgaW5SZWdpb25TYXZlSGRsKSAtPiAoSGFuZGxlIF9ydikiKX0sCi0JeyJTZXRQb3J0Qm91bmRzIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfU2V0UG9ydEJvdW5kcywgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCByZWN0KSAtPiBOb25lIil9LAotCXsiU2V0UG9ydE9wQ29sb3IiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9TZXRQb3J0T3BDb2xvciwgMSwKLQkgUHlEb2NfU1RSKCIoUkdCQ29sb3Igb3BDb2xvcikgLT4gTm9uZSIpfSwKLQl7IlNldFBvcnRUZXh0Rm9udCIsIChQeUNGdW5jdGlvbilHcmFmT2JqX1NldFBvcnRUZXh0Rm9udCwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgdHhGb250KSAtPiBOb25lIil9LAotCXsiU2V0UG9ydFRleHRTaXplIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfU2V0UG9ydFRleHRTaXplLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCB0eFNpemUpIC0+IE5vbmUiKX0sCi0JeyJTZXRQb3J0VGV4dEZhY2UiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9TZXRQb3J0VGV4dEZhY2UsIDEsCi0JIFB5RG9jX1NUUigiKFN0eWxlUGFyYW1ldGVyIGZhY2UpIC0+IE5vbmUiKX0sCi0JeyJTZXRQb3J0VGV4dE1vZGUiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9TZXRQb3J0VGV4dE1vZGUsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IG1vZGUpIC0+IE5vbmUiKX0sCi0JeyJTZXRQb3J0VmlzaWJsZVJlZ2lvbiIsIChQeUNGdW5jdGlvbilHcmFmT2JqX1NldFBvcnRWaXNpYmxlUmVnaW9uLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgdmlzUmduKSAtPiBOb25lIil9LAotCXsiU2V0UG9ydENsaXBSZWdpb24iLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9TZXRQb3J0Q2xpcFJlZ2lvbiwgMSwKLQkgUHlEb2NfU1RSKCIoUmduSGFuZGxlIGNsaXBSZ24pIC0+IE5vbmUiKX0sCi0JeyJTZXRQb3J0UGVuUGl4UGF0IiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfU2V0UG9ydFBlblBpeFBhdCwgMSwKLQkgUHlEb2NfU1RSKCIoUGl4UGF0SGFuZGxlIHBlblBhdHRlcm4pIC0+IE5vbmUiKX0sCi0JeyJTZXRQb3J0RmlsbFBpeFBhdCIsIChQeUNGdW5jdGlvbilHcmFmT2JqX1NldFBvcnRGaWxsUGl4UGF0LCAxLAotCSBQeURvY19TVFIoIihQaXhQYXRIYW5kbGUgcGVuUGF0dGVybikgLT4gTm9uZSIpfSwKLQl7IlNldFBvcnRCYWNrUGl4UGF0IiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfU2V0UG9ydEJhY2tQaXhQYXQsIDEsCi0JIFB5RG9jX1NUUigiKFBpeFBhdEhhbmRsZSBiYWNrUGF0dGVybikgLT4gTm9uZSIpfSwKLQl7IlNldFBvcnRQZW5TaXplIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfU2V0UG9ydFBlblNpemUsIDEsCi0JIFB5RG9jX1NUUigiKFBvaW50IHBlblNpemUpIC0+IE5vbmUiKX0sCi0JeyJTZXRQb3J0UGVuTW9kZSIsIChQeUNGdW5jdGlvbilHcmFmT2JqX1NldFBvcnRQZW5Nb2RlLCAxLAotCSBQeURvY19TVFIoIihTSW50MzIgcGVuTW9kZSkgLT4gTm9uZSIpfSwKLQl7IlNldFBvcnRGcmFjSFBlbkxvY2F0aW9uIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfU2V0UG9ydEZyYWNIUGVuTG9jYXRpb24sIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHBuTG9jSEZyYWMpIC0+IE5vbmUiKX0sCi0JeyJEaXNwb3NlUG9ydCIsIChQeUNGdW5jdGlvbilHcmFmT2JqX0Rpc3Bvc2VQb3J0LCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJRRExvY2FsVG9HbG9iYWxQb2ludCIsIChQeUNGdW5jdGlvbilHcmFmT2JqX1FETG9jYWxUb0dsb2JhbFBvaW50LCAxLAotCSBQeURvY19TVFIoIihQb2ludCBwb2ludCkgLT4gKFBvaW50IHBvaW50KSIpfSwKLQl7IlFER2xvYmFsVG9Mb2NhbFBvaW50IiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfUURHbG9iYWxUb0xvY2FsUG9pbnQsIDEsCi0JIFB5RG9jX1NUUigiKFBvaW50IHBvaW50KSAtPiAoUG9pbnQgcG9pbnQpIil9LAotCXsiUURMb2NhbFRvR2xvYmFsUmVjdCIsIChQeUNGdW5jdGlvbilHcmFmT2JqX1FETG9jYWxUb0dsb2JhbFJlY3QsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFJlY3QgYm91bmRzKSIpfSwKLQl7IlFER2xvYmFsVG9Mb2NhbFJlY3QiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9RREdsb2JhbFRvTG9jYWxSZWN0LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChSZWN0IGJvdW5kcykiKX0sCi0JeyJRRExvY2FsVG9HbG9iYWxSZWdpb24iLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9RRExvY2FsVG9HbG9iYWxSZWdpb24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZWdpb24pIC0+IChSZ25IYW5kbGUgX3J2KSIpfSwKLQl7IlFER2xvYmFsVG9Mb2NhbFJlZ2lvbiIsIChQeUNGdW5jdGlvbilHcmFmT2JqX1FER2xvYmFsVG9Mb2NhbFJlZ2lvbiwgMSwKLQkgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHJlZ2lvbikgLT4gKFJnbkhhbmRsZSBfcnYpIil9LAotCXsiUURJc1BvcnRCdWZmZXJlZCIsIChQeUNGdW5jdGlvbilHcmFmT2JqX1FESXNQb3J0QnVmZmVyZWQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IlFESXNQb3J0QnVmZmVyRGlydHkiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9RRElzUG9ydEJ1ZmZlckRpcnR5LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJRREZsdXNoUG9ydEJ1ZmZlciIsIChQeUNGdW5jdGlvbilHcmFmT2JqX1FERmx1c2hQb3J0QnVmZmVyLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgcmVnaW9uKSAtPiBOb25lIil9LAotCXsiUURHZXREaXJ0eVJlZ2lvbiIsIChQeUNGdW5jdGlvbilHcmFmT2JqX1FER2V0RGlydHlSZWdpb24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZ24pIC0+IE5vbmUiKX0sCi0JeyJRRFNldERpcnR5UmVnaW9uIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfUURTZXREaXJ0eVJlZ2lvbiwgMSwKLQkgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHJnbikgLT4gTm9uZSIpfSwKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7Ik1hY1NldFBvcnQiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9NYWNTZXRQb3J0LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJRRFN3YXBQb3J0IiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfUURTd2FwUG9ydCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYsIENHcmFmUHRyIG91dE9sZFBvcnQpIil9LAorICAgIHsiSXNWYWxpZFBvcnQiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9Jc1ZhbGlkUG9ydCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiR2V0UG9ydFBpeE1hcCIsIChQeUNGdW5jdGlvbilHcmFmT2JqX0dldFBvcnRQaXhNYXAsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFBpeE1hcEhhbmRsZSBfcnYpIil9LAorICAgIHsiR2V0UG9ydEJpdE1hcEZvckNvcHlCaXRzIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfR2V0UG9ydEJpdE1hcEZvckNvcHlCaXRzLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChjb25zdCBCaXRNYXAgKiBfcnYpIil9LAorICAgIHsiR2V0UG9ydEJvdW5kcyIsIChQeUNGdW5jdGlvbilHcmFmT2JqX0dldFBvcnRCb3VuZHMsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFJlY3QgcmVjdCkiKX0sCisgICAgeyJHZXRQb3J0Rm9yZUNvbG9yIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfR2V0UG9ydEZvcmVDb2xvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoUkdCQ29sb3IgZm9yZUNvbG9yKSIpfSwKKyAgICB7IkdldFBvcnRCYWNrQ29sb3IiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9HZXRQb3J0QmFja0NvbG9yLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChSR0JDb2xvciBiYWNrQ29sb3IpIil9LAorICAgIHsiR2V0UG9ydE9wQ29sb3IiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9HZXRQb3J0T3BDb2xvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoUkdCQ29sb3Igb3BDb2xvcikiKX0sCisgICAgeyJHZXRQb3J0SGlsaXRlQ29sb3IiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9HZXRQb3J0SGlsaXRlQ29sb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFJHQkNvbG9yIGhpbGl0ZUNvbG9yKSIpfSwKKyAgICB7IkdldFBvcnRUZXh0Rm9udCIsIChQeUNGdW5jdGlvbilHcmFmT2JqX0dldFBvcnRUZXh0Rm9udCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgX3J2KSIpfSwKKyAgICB7IkdldFBvcnRUZXh0RmFjZSIsIChQeUNGdW5jdGlvbilHcmFmT2JqX0dldFBvcnRUZXh0RmFjZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoU3R5bGUgX3J2KSIpfSwKKyAgICB7IkdldFBvcnRUZXh0TW9kZSIsIChQeUNGdW5jdGlvbilHcmFmT2JqX0dldFBvcnRUZXh0TW9kZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgX3J2KSIpfSwKKyAgICB7IkdldFBvcnRUZXh0U2l6ZSIsIChQeUNGdW5jdGlvbilHcmFmT2JqX0dldFBvcnRUZXh0U2l6ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgX3J2KSIpfSwKKyAgICB7IkdldFBvcnRDaEV4dHJhIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfR2V0UG9ydENoRXh0cmEsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKHNob3J0IF9ydikiKX0sCisgICAgeyJHZXRQb3J0RnJhY0hQZW5Mb2NhdGlvbiIsIChQeUNGdW5jdGlvbilHcmFmT2JqX0dldFBvcnRGcmFjSFBlbkxvY2F0aW9uLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChzaG9ydCBfcnYpIil9LAorICAgIHsiR2V0UG9ydFNwRXh0cmEiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9HZXRQb3J0U3BFeHRyYSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoRml4ZWQgX3J2KSIpfSwKKyAgICB7IkdldFBvcnRQZW5WaXNpYmlsaXR5IiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfR2V0UG9ydFBlblZpc2liaWxpdHksIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKHNob3J0IF9ydikiKX0sCisgICAgeyJHZXRQb3J0VmlzaWJsZVJlZ2lvbiIsIChQeUNGdW5jdGlvbilHcmFmT2JqX0dldFBvcnRWaXNpYmxlUmVnaW9uLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgdmlzUmduKSAtPiAoUmduSGFuZGxlIF9ydikiKX0sCisgICAgeyJHZXRQb3J0Q2xpcFJlZ2lvbiIsIChQeUNGdW5jdGlvbilHcmFmT2JqX0dldFBvcnRDbGlwUmVnaW9uLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgY2xpcFJnbikgLT4gKFJnbkhhbmRsZSBfcnYpIil9LAorICAgIHsiR2V0UG9ydEJhY2tQaXhQYXQiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9HZXRQb3J0QmFja1BpeFBhdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUGl4UGF0SGFuZGxlIGJhY2tQYXR0ZXJuKSAtPiAoUGl4UGF0SGFuZGxlIF9ydikiKX0sCisgICAgeyJHZXRQb3J0UGVuUGl4UGF0IiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfR2V0UG9ydFBlblBpeFBhdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUGl4UGF0SGFuZGxlIHBlblBhdHRlcm4pIC0+IChQaXhQYXRIYW5kbGUgX3J2KSIpfSwKKyAgICB7IkdldFBvcnRGaWxsUGl4UGF0IiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfR2V0UG9ydEZpbGxQaXhQYXQsIDEsCisgICAgIFB5RG9jX1NUUigiKFBpeFBhdEhhbmRsZSBmaWxsUGF0dGVybikgLT4gKFBpeFBhdEhhbmRsZSBfcnYpIil9LAorICAgIHsiR2V0UG9ydFBlblNpemUiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9HZXRQb3J0UGVuU2l6ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgcGVuU2l6ZSkgLT4gKFBvaW50IHBlblNpemUpIil9LAorICAgIHsiR2V0UG9ydFBlbk1vZGUiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9HZXRQb3J0UGVuTW9kZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoU0ludDMyIF9ydikiKX0sCisgICAgeyJHZXRQb3J0UGVuTG9jYXRpb24iLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9HZXRQb3J0UGVuTG9jYXRpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKFBvaW50IHBlbkxvY2F0aW9uKSAtPiAoUG9pbnQgcGVuTG9jYXRpb24pIil9LAorICAgIHsiSXNQb3J0UmVnaW9uQmVpbmdEZWZpbmVkIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfSXNQb3J0UmVnaW9uQmVpbmdEZWZpbmVkLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJJc1BvcnRQaWN0dXJlQmVpbmdEZWZpbmVkIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfSXNQb3J0UGljdHVyZUJlaW5nRGVmaW5lZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiSXNQb3J0UG9seUJlaW5nRGVmaW5lZCIsIChQeUNGdW5jdGlvbilHcmFmT2JqX0lzUG9ydFBvbHlCZWluZ0RlZmluZWQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IklzUG9ydE9mZnNjcmVlbiIsIChQeUNGdW5jdGlvbilHcmFmT2JqX0lzUG9ydE9mZnNjcmVlbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiSXNQb3J0Q29sb3IiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9Jc1BvcnRDb2xvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiSXNQb3J0VmlzaWJsZVJlZ2lvbkVtcHR5IiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfSXNQb3J0VmlzaWJsZVJlZ2lvbkVtcHR5LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJJc1BvcnRDbGlwUmVnaW9uRW1wdHkiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9Jc1BvcnRDbGlwUmVnaW9uRW1wdHksIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IlNlY3RSZWdpb25XaXRoUG9ydENsaXBSZWdpb24iLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9TZWN0UmVnaW9uV2l0aFBvcnRDbGlwUmVnaW9uLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgaW9SZWdpb24pIC0+IE5vbmUiKX0sCisgICAgeyJTZWN0UmVnaW9uV2l0aFBvcnRWaXNpYmxlUmVnaW9uIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfU2VjdFJlZ2lvbldpdGhQb3J0VmlzaWJsZVJlZ2lvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIGlvUmVnaW9uKSAtPiBOb25lIil9LAorICAgIHsiU3dhcFBvcnRQaWNTYXZlSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfU3dhcFBvcnRQaWNTYXZlSGFuZGxlLCAxLAorICAgICBQeURvY19TVFIoIihIYW5kbGUgaW5QaWNTYXZlSGRsKSAtPiAoSGFuZGxlIF9ydikiKX0sCisgICAgeyJTd2FwUG9ydFBvbHlTYXZlSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfU3dhcFBvcnRQb2x5U2F2ZUhhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSGFuZGxlIGluUG9seVNhdmVIZGwpIC0+IChIYW5kbGUgX3J2KSIpfSwKKyAgICB7IlN3YXBQb3J0UmVnaW9uU2F2ZUhhbmRsZSIsIChQeUNGdW5jdGlvbilHcmFmT2JqX1N3YXBQb3J0UmVnaW9uU2F2ZUhhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSGFuZGxlIGluUmVnaW9uU2F2ZUhkbCkgLT4gKEhhbmRsZSBfcnYpIil9LAorICAgIHsiU2V0UG9ydEJvdW5kcyIsIChQeUNGdW5jdGlvbilHcmFmT2JqX1NldFBvcnRCb3VuZHMsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgcmVjdCkgLT4gTm9uZSIpfSwKKyAgICB7IlNldFBvcnRPcENvbG9yIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfU2V0UG9ydE9wQ29sb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKFJHQkNvbG9yIG9wQ29sb3IpIC0+IE5vbmUiKX0sCisgICAgeyJTZXRQb3J0VGV4dEZvbnQiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9TZXRQb3J0VGV4dEZvbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IHR4Rm9udCkgLT4gTm9uZSIpfSwKKyAgICB7IlNldFBvcnRUZXh0U2l6ZSIsIChQeUNGdW5jdGlvbilHcmFmT2JqX1NldFBvcnRUZXh0U2l6ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgdHhTaXplKSAtPiBOb25lIil9LAorICAgIHsiU2V0UG9ydFRleHRGYWNlIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfU2V0UG9ydFRleHRGYWNlLCAxLAorICAgICBQeURvY19TVFIoIihTdHlsZVBhcmFtZXRlciBmYWNlKSAtPiBOb25lIil9LAorICAgIHsiU2V0UG9ydFRleHRNb2RlIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfU2V0UG9ydFRleHRNb2RlLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBtb2RlKSAtPiBOb25lIil9LAorICAgIHsiU2V0UG9ydFZpc2libGVSZWdpb24iLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9TZXRQb3J0VmlzaWJsZVJlZ2lvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHZpc1JnbikgLT4gTm9uZSIpfSwKKyAgICB7IlNldFBvcnRDbGlwUmVnaW9uIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfU2V0UG9ydENsaXBSZWdpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKFJnbkhhbmRsZSBjbGlwUmduKSAtPiBOb25lIil9LAorICAgIHsiU2V0UG9ydFBlblBpeFBhdCIsIChQeUNGdW5jdGlvbilHcmFmT2JqX1NldFBvcnRQZW5QaXhQYXQsIDEsCisgICAgIFB5RG9jX1NUUigiKFBpeFBhdEhhbmRsZSBwZW5QYXR0ZXJuKSAtPiBOb25lIil9LAorICAgIHsiU2V0UG9ydEZpbGxQaXhQYXQiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9TZXRQb3J0RmlsbFBpeFBhdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUGl4UGF0SGFuZGxlIHBlblBhdHRlcm4pIC0+IE5vbmUiKX0sCisgICAgeyJTZXRQb3J0QmFja1BpeFBhdCIsIChQeUNGdW5jdGlvbilHcmFmT2JqX1NldFBvcnRCYWNrUGl4UGF0LCAxLAorICAgICBQeURvY19TVFIoIihQaXhQYXRIYW5kbGUgYmFja1BhdHRlcm4pIC0+IE5vbmUiKX0sCisgICAgeyJTZXRQb3J0UGVuU2l6ZSIsIChQeUNGdW5jdGlvbilHcmFmT2JqX1NldFBvcnRQZW5TaXplLCAxLAorICAgICBQeURvY19TVFIoIihQb2ludCBwZW5TaXplKSAtPiBOb25lIil9LAorICAgIHsiU2V0UG9ydFBlbk1vZGUiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9TZXRQb3J0UGVuTW9kZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDMyIHBlbk1vZGUpIC0+IE5vbmUiKX0sCisgICAgeyJTZXRQb3J0RnJhY0hQZW5Mb2NhdGlvbiIsIChQeUNGdW5jdGlvbilHcmFmT2JqX1NldFBvcnRGcmFjSFBlbkxvY2F0aW9uLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBwbkxvY0hGcmFjKSAtPiBOb25lIil9LAorICAgIHsiRGlzcG9zZVBvcnQiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9EaXNwb3NlUG9ydCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiUURMb2NhbFRvR2xvYmFsUG9pbnQiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9RRExvY2FsVG9HbG9iYWxQb2ludCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgcG9pbnQpIC0+IChQb2ludCBwb2ludCkiKX0sCisgICAgeyJRREdsb2JhbFRvTG9jYWxQb2ludCIsIChQeUNGdW5jdGlvbilHcmFmT2JqX1FER2xvYmFsVG9Mb2NhbFBvaW50LCAxLAorICAgICBQeURvY19TVFIoIihQb2ludCBwb2ludCkgLT4gKFBvaW50IHBvaW50KSIpfSwKKyAgICB7IlFETG9jYWxUb0dsb2JhbFJlY3QiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9RRExvY2FsVG9HbG9iYWxSZWN0LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChSZWN0IGJvdW5kcykiKX0sCisgICAgeyJRREdsb2JhbFRvTG9jYWxSZWN0IiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfUURHbG9iYWxUb0xvY2FsUmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoUmVjdCBib3VuZHMpIil9LAorICAgIHsiUURMb2NhbFRvR2xvYmFsUmVnaW9uIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfUURMb2NhbFRvR2xvYmFsUmVnaW9uLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgcmVnaW9uKSAtPiAoUmduSGFuZGxlIF9ydikiKX0sCisgICAgeyJRREdsb2JhbFRvTG9jYWxSZWdpb24iLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9RREdsb2JhbFRvTG9jYWxSZWdpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZWdpb24pIC0+IChSZ25IYW5kbGUgX3J2KSIpfSwKKyAgICB7IlFESXNQb3J0QnVmZmVyZWQiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9RRElzUG9ydEJ1ZmZlcmVkLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJRRElzUG9ydEJ1ZmZlckRpcnR5IiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfUURJc1BvcnRCdWZmZXJEaXJ0eSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiUURGbHVzaFBvcnRCdWZmZXIiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9RREZsdXNoUG9ydEJ1ZmZlciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHJlZ2lvbikgLT4gTm9uZSIpfSwKKyAgICB7IlFER2V0RGlydHlSZWdpb24iLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9RREdldERpcnR5UmVnaW9uLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgcmduKSAtPiBOb25lIil9LAorICAgIHsiUURTZXREaXJ0eVJlZ2lvbiIsIChQeUNGdW5jdGlvbilHcmFmT2JqX1FEU2V0RGlydHlSZWdpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZ24pIC0+IE5vbmUiKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfZ2V0X3Zpc1JnbihHcmFmUG9ydE9iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlSZ25IYW5kbGUgaD1OZXdSZ24oKTsgLyogWFhYWCB3cm9uZyBkaXNwb3NlIHJvdXRpbmUgKi8KLQkgICAgICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyYiLCBSZXNPYmpfTmV3LCAoSGFuZGxlKUdldFBvcnRWaXNpYmxlUmVnaW9uKHNlbGYtPm9iX2l0c2VsZiwgaCkpOwotCSAgICAgICAgICAgIAorICAgIFJnbkhhbmRsZSBoPU5ld1JnbigpOyAvKiBYWFhYIHdyb25nIGRpc3Bvc2Ugcm91dGluZSAqLworICAgICAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgUmVzT2JqX05ldywgKEhhbmRsZSlHZXRQb3J0VmlzaWJsZVJlZ2lvbihzZWxmLT5vYl9pdHNlbGYsIGgpKTsKKwogfQogCiAjZGVmaW5lIEdyYWZPYmpfc2V0X3Zpc1JnbiBOVUxMCiAKIHN0YXRpYyBQeU9iamVjdCAqR3JhZk9ial9nZXRfY2xpcFJnbihHcmFmUG9ydE9iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlSZ25IYW5kbGUgaD1OZXdSZ24oKTsgLyogWFhYWCB3cm9uZyBkaXNwb3NlIHJvdXRpbmUgKi8KLQkgICAgICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyYiLCBSZXNPYmpfTmV3LCAoSGFuZGxlKUdldFBvcnRDbGlwUmVnaW9uKHNlbGYtPm9iX2l0c2VsZiwgaCkpOwotCSAgICAgICAgICAgIAorICAgIFJnbkhhbmRsZSBoPU5ld1JnbigpOyAvKiBYWFhYIHdyb25nIGRpc3Bvc2Ugcm91dGluZSAqLworICAgICAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgUmVzT2JqX05ldywgKEhhbmRsZSlHZXRQb3J0Q2xpcFJlZ2lvbihzZWxmLT5vYl9pdHNlbGYsIGgpKTsKKwogfQogCiAjZGVmaW5lIEdyYWZPYmpfc2V0X2NsaXBSZ24gTlVMTAogCiBzdGF0aWMgUHlHZXRTZXREZWYgR3JhZk9ial9nZXRzZXRsaXN0W10gPSB7Ci0JeyJ2aXNSZ24iLCAoZ2V0dGVyKUdyYWZPYmpfZ2V0X3Zpc1JnbiwgKHNldHRlcilHcmFmT2JqX3NldF92aXNSZ24sICJDb252ZW5pZW5jZSBhdHRyaWJ1dGU6IHJldHVybiBhIGNvcHkgb2YgdGhlIHZpc2libGUgcmVnaW9uIn0sCi0JeyJjbGlwUmduIiwgKGdldHRlcilHcmFmT2JqX2dldF9jbGlwUmduLCAoc2V0dGVyKUdyYWZPYmpfc2V0X2NsaXBSZ24sICJDb252ZW5pZW5jZSBhdHRyaWJ1dGU6IHJldHVybiBhIGNvcHkgb2YgdGhlIGNsaXBwaW5nIHJlZ2lvbiJ9LAotCXtOVUxMLCBOVUxMLCBOVUxMLCBOVUxMfSwKKyAgICB7InZpc1JnbiIsIChnZXR0ZXIpR3JhZk9ial9nZXRfdmlzUmduLCAoc2V0dGVyKUdyYWZPYmpfc2V0X3Zpc1JnbiwgIkNvbnZlbmllbmNlIGF0dHJpYnV0ZTogcmV0dXJuIGEgY29weSBvZiB0aGUgdmlzaWJsZSByZWdpb24ifSwKKyAgICB7ImNsaXBSZ24iLCAoZ2V0dGVyKUdyYWZPYmpfZ2V0X2NsaXBSZ24sIChzZXR0ZXIpR3JhZk9ial9zZXRfY2xpcFJnbiwgIkNvbnZlbmllbmNlIGF0dHJpYnV0ZTogcmV0dXJuIGEgY29weSBvZiB0aGUgY2xpcHBpbmcgcmVnaW9uIn0sCisgICAge05VTEwsIE5VTEwsIE5VTEwsIE5VTEx9LAogfTsKIAogCkBAIC0xMzQ1LDYxICsxMzQ1LDYxIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqR3JhZk9ial90cF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlQeU9iamVjdCAqX3NlbGY7Ci0JR3JhZlB0ciBpdHNlbGY7Ci0JY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CisgICAgUHlPYmplY3QgKl9zZWxmOworICAgIEdyYWZQdHIgaXRzZWxmOworICAgIGNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgR3JhZk9ial9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7Ci0JaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkoKEdyYWZQb3J0T2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JcmV0dXJuIF9zZWxmOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIEdyYWZPYmpfQ29udmVydCwgJml0c2VsZikpIHJldHVybiBOVUxMOworICAgIGlmICgoX3NlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgKChHcmFmUG9ydE9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIHJldHVybiBfc2VsZjsKIH0KIAogI2RlZmluZSBHcmFmT2JqX3RwX2ZyZWUgUHlPYmplY3RfRGVsCiAKIAogUHlUeXBlT2JqZWN0IEdyYWZQb3J0X1R5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCi0JMCwgLypvYl9zaXplKi8KLQkiX1FkLkdyYWZQb3J0IiwgLyp0cF9uYW1lKi8KLQlzaXplb2YoR3JhZlBvcnRPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCi0JMCwgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKSBHcmFmT2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCi0JMCwgLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCi0JKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCi0JKGNtcGZ1bmMpIEdyYWZPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpIEdyYWZPYmpfcmVwciwgLyp0cF9yZXByKi8KLQkoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCi0JKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpIEdyYWZPYmpfaGFzaCwgLyp0cF9oYXNoKi8KLQkwLCAvKnRwX2NhbGwqLwotCTAsIC8qdHBfc3RyKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCi0JUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KLQkwLCAvKnRwX2FzX2J1ZmZlciovCi0JUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCi0JMCwgLyp0cF9kb2MqLwotCTAsIC8qdHBfdHJhdmVyc2UqLwotCTAsIC8qdHBfY2xlYXIqLwotCTAsIC8qdHBfcmljaGNvbXBhcmUqLwotCTAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLwotCTAsIC8qdHBfaXRlciovCi0JMCwgLyp0cF9pdGVybmV4dCovCi0JR3JhZk9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCi0JMCwgLyp0cF9tZW1iZXJzKi8KLQlHcmFmT2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KLQkwLCAvKnRwX2Jhc2UqLwotCTAsIC8qdHBfZGljdCovCi0JMCwgLyp0cF9kZXNjcl9nZXQqLwotCTAsIC8qdHBfZGVzY3Jfc2V0Ki8KLQkwLCAvKnRwX2RpY3RvZmZzZXQqLwotCUdyYWZPYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLwotCUdyYWZPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCi0JR3JhZk9ial90cF9uZXcsIC8qIHRwX25ldyAqLwotCUdyYWZPYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgIDAsIC8qb2Jfc2l6ZSovCisgICAgIl9RZC5HcmFmUG9ydCIsIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKEdyYWZQb3J0T2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLworICAgIDAsIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcikgR3JhZk9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgIDAsIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLworICAgIChzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLworICAgIChjbXBmdW5jKSBHcmFmT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCisgICAgKHJlcHJmdW5jKSBHcmFmT2JqX3JlcHIsIC8qdHBfcmVwciovCisgICAgKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLworICAgIChQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKSBHcmFmT2JqX2hhc2gsIC8qdHBfaGFzaCovCisgICAgMCwgLyp0cF9jYWxsKi8KKyAgICAwLCAvKnRwX3N0ciovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLworICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCisgICAgMCwgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLworICAgIDAsIC8qdHBfZG9jKi8KKyAgICAwLCAvKnRwX3RyYXZlcnNlKi8KKyAgICAwLCAvKnRwX2NsZWFyKi8KKyAgICAwLCAvKnRwX3JpY2hjb21wYXJlKi8KKyAgICAwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KKyAgICAwLCAvKnRwX2l0ZXIqLworICAgIDAsIC8qdHBfaXRlcm5leHQqLworICAgIEdyYWZPYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLworICAgIDAsIC8qdHBfbWVtYmVycyovCisgICAgR3JhZk9ial9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCisgICAgMCwgLyp0cF9iYXNlKi8KKyAgICAwLCAvKnRwX2RpY3QqLworICAgIDAsIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICBHcmFmT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KKyAgICBHcmFmT2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLworICAgIEdyYWZPYmpfdHBfbmV3LCAvKiB0cF9uZXcgKi8KKyAgICBHcmFmT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tIEVuZCBvYmplY3QgdHlwZSBHcmFmUG9ydCAtLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMTQxMiwxMjQgKzE0MTIsMTI0IEBACiAjZGVmaW5lIEJNT2JqX0NoZWNrKHgpICgoeCktPm9iX3R5cGUgPT0gJkJpdE1hcF9UeXBlIHx8IFB5T2JqZWN0X1R5cGVDaGVjaygoeCksICZCaXRNYXBfVHlwZSkpCiAKIHR5cGVkZWYgc3RydWN0IEJpdE1hcE9iamVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCUJpdE1hcFB0ciBvYl9pdHNlbGY7Ci0JUHlPYmplY3QgKnJlZmVycmVkX29iamVjdDsKLQlCaXRNYXAgKnJlZmVycmVkX2JpdG1hcDsKKyAgICBQeU9iamVjdF9IRUFECisgICAgQml0TWFwUHRyIG9iX2l0c2VsZjsKKyAgICBQeU9iamVjdCAqcmVmZXJyZWRfb2JqZWN0OworICAgIEJpdE1hcCAqcmVmZXJyZWRfYml0bWFwOwogfSBCaXRNYXBPYmplY3Q7CiAKIFB5T2JqZWN0ICpCTU9ial9OZXcoQml0TWFwUHRyIGl0c2VsZikKIHsKLQlCaXRNYXBPYmplY3QgKml0OwotCWlmIChpdHNlbGYgPT0gTlVMTCkgcmV0dXJuIFB5TWFjX0Vycm9yKHJlc05vdEZvdW5kKTsKLQlpdCA9IFB5T2JqZWN0X05FVyhCaXRNYXBPYmplY3QsICZCaXRNYXBfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOwotCWl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JaXQtPnJlZmVycmVkX29iamVjdCA9IE5VTEw7Ci0JaXQtPnJlZmVycmVkX2JpdG1hcCA9IE5VTEw7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIEJpdE1hcE9iamVjdCAqaXQ7CisgICAgaWYgKGl0c2VsZiA9PSBOVUxMKSByZXR1cm4gUHlNYWNfRXJyb3IocmVzTm90Rm91bmQpOworICAgIGl0ID0gUHlPYmplY3RfTkVXKEJpdE1hcE9iamVjdCwgJkJpdE1hcF9UeXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICBpdC0+cmVmZXJyZWRfb2JqZWN0ID0gTlVMTDsKKyAgICBpdC0+cmVmZXJyZWRfYml0bWFwID0gTlVMTDsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiAKIGludCBCTU9ial9Db252ZXJ0KFB5T2JqZWN0ICp2LCBCaXRNYXBQdHIgKnBfaXRzZWxmKQogewotCWlmICghQk1PYmpfQ2hlY2sodikpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiQml0TWFwIHJlcXVpcmVkIik7Ci0JCXJldHVybiAwOwotCX0KLQkqcF9pdHNlbGYgPSAoKEJpdE1hcE9iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0JcmV0dXJuIDE7CisgICAgaWYgKCFCTU9ial9DaGVjayh2KSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJCaXRNYXAgcmVxdWlyZWQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICpwX2l0c2VsZiA9ICgoQml0TWFwT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIHZvaWQgQk1PYmpfZGVhbGxvYyhCaXRNYXBPYmplY3QgKnNlbGYpCiB7Ci0JUHlfWERFQ1JFRihzZWxmLT5yZWZlcnJlZF9vYmplY3QpOwotCWlmIChzZWxmLT5yZWZlcnJlZF9iaXRtYXApIGZyZWUoc2VsZi0+cmVmZXJyZWRfYml0bWFwKTsKLQlzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOworICAgIFB5X1hERUNSRUYoc2VsZi0+cmVmZXJyZWRfb2JqZWN0KTsKKyAgICBpZiAoc2VsZi0+cmVmZXJyZWRfYml0bWFwKSBmcmVlKHNlbGYtPnJlZmVycmVkX2JpdG1hcCk7CisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpCTU9ial9nZXRkYXRhKEJpdE1hcE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogCi0JaW50IGZyb20sIGxlbmd0aDsKLQljaGFyICpjcDsKKyAgICBpbnQgZnJvbSwgbGVuZ3RoOworICAgIGNoYXIgKmNwOwogCi0JaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImlpIiwgJmZyb20sICZsZW5ndGgpICkKLQkgICAgICAgIHJldHVybiBOVUxMOwotCWNwID0gX3NlbGYtPm9iX2l0c2VsZi0+YmFzZUFkZHIrZnJvbTsKLQlfcmVzID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoY3AsIGxlbmd0aCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImlpIiwgJmZyb20sICZsZW5ndGgpICkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgY3AgPSBfc2VsZi0+b2JfaXRzZWxmLT5iYXNlQWRkcitmcm9tOworICAgIF9yZXMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShjcCwgbGVuZ3RoKTsKKyAgICByZXR1cm4gX3JlczsKIAogfQogCiBzdGF0aWMgUHlPYmplY3QgKkJNT2JqX3B1dGRhdGEoQml0TWFwT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAKLQlpbnQgZnJvbSwgbGVuZ3RoOwotCWNoYXIgKmNwLCAqaWNwOworICAgIGludCBmcm9tLCBsZW5ndGg7CisgICAgY2hhciAqY3AsICppY3A7CiAKLQlpZiAoICFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaXMjIiwgJmZyb20sICZpY3AsICZsZW5ndGgpICkKLQkgICAgICAgIHJldHVybiBOVUxMOwotCWNwID0gX3NlbGYtPm9iX2l0c2VsZi0+YmFzZUFkZHIrZnJvbTsKLQltZW1jcHkoY3AsIGljcCwgbGVuZ3RoKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImlzIyIsICZmcm9tLCAmaWNwLCAmbGVuZ3RoKSApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGNwID0gX3NlbGYtPm9iX2l0c2VsZi0+YmFzZUFkZHIrZnJvbTsKKyAgICBtZW1jcHkoY3AsIGljcCwgbGVuZ3RoKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiAKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIEJNT2JqX21ldGhvZHNbXSA9IHsKLQl7ImdldGRhdGEiLCAoUHlDRnVuY3Rpb24pQk1PYmpfZ2V0ZGF0YSwgMSwKLQkgUHlEb2NfU1RSKCIoaW50IHN0YXJ0LCBpbnQgc2l6ZSkgLT4gc3RyaW5nLiBSZXR1cm4gYnl0ZXMgZnJvbSB0aGUgYml0bWFwIil9LAotCXsicHV0ZGF0YSIsIChQeUNGdW5jdGlvbilCTU9ial9wdXRkYXRhLCAxLAotCSBQeURvY19TVFIoIihpbnQgc3RhcnQsIHN0cmluZyBkYXRhKS4gU3RvcmUgYnl0ZXMgaW50byB0aGUgYml0bWFwIil9LAotCXtOVUxMLCBOVUxMLCAwfQorICAgIHsiZ2V0ZGF0YSIsIChQeUNGdW5jdGlvbilCTU9ial9nZXRkYXRhLCAxLAorICAgICBQeURvY19TVFIoIihpbnQgc3RhcnQsIGludCBzaXplKSAtPiBzdHJpbmcuIFJldHVybiBieXRlcyBmcm9tIHRoZSBiaXRtYXAiKX0sCisgICAgeyJwdXRkYXRhIiwgKFB5Q0Z1bmN0aW9uKUJNT2JqX3B1dGRhdGEsIDEsCisgICAgIFB5RG9jX1NUUigiKGludCBzdGFydCwgc3RyaW5nIGRhdGEpLiBTdG9yZSBieXRlcyBpbnRvIHRoZSBiaXRtYXAiKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKkJNT2JqX2dldF9iYXNlQWRkcihCaXRNYXBPYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKXNlbGYtPm9iX2l0c2VsZi0+YmFzZUFkZHIpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZylzZWxmLT5vYl9pdHNlbGYtPmJhc2VBZGRyKTsKIH0KIAogI2RlZmluZSBCTU9ial9zZXRfYmFzZUFkZHIgTlVMTAogCiBzdGF0aWMgUHlPYmplY3QgKkJNT2JqX2dldF9yb3dCeXRlcyhCaXRNYXBPYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKXNlbGYtPm9iX2l0c2VsZi0+cm93Qnl0ZXMpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZylzZWxmLT5vYl9pdHNlbGYtPnJvd0J5dGVzKTsKIH0KIAogI2RlZmluZSBCTU9ial9zZXRfcm93Qnl0ZXMgTlVMTAogCiBzdGF0aWMgUHlPYmplY3QgKkJNT2JqX2dldF9ib3VuZHMoQml0TWFwT2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJPJiIsIFB5TWFjX0J1aWxkUmVjdCwgJnNlbGYtPm9iX2l0c2VsZi0+Ym91bmRzKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyYiLCBQeU1hY19CdWlsZFJlY3QsICZzZWxmLT5vYl9pdHNlbGYtPmJvdW5kcyk7CiB9CiAKICNkZWZpbmUgQk1PYmpfc2V0X2JvdW5kcyBOVUxMCiAKIHN0YXRpYyBQeU9iamVjdCAqQk1PYmpfZ2V0X2JpdG1hcF9kYXRhKEJpdE1hcE9iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilzZWxmLT5vYl9pdHNlbGYsIHNpemVvZihCaXRNYXApKTsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilzZWxmLT5vYl9pdHNlbGYsIHNpemVvZihCaXRNYXApKTsKIH0KIAogI2RlZmluZSBCTU9ial9zZXRfYml0bWFwX2RhdGEgTlVMTAogCiBzdGF0aWMgUHlPYmplY3QgKkJNT2JqX2dldF9waXhtYXBfZGF0YShCaXRNYXBPYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopc2VsZi0+b2JfaXRzZWxmLCBzaXplb2YoUGl4TWFwKSk7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopc2VsZi0+b2JfaXRzZWxmLCBzaXplb2YoUGl4TWFwKSk7CiB9CiAKICNkZWZpbmUgQk1PYmpfc2V0X3BpeG1hcF9kYXRhIE5VTEwKIAogc3RhdGljIFB5R2V0U2V0RGVmIEJNT2JqX2dldHNldGxpc3RbXSA9IHsKLQl7ImJhc2VBZGRyIiwgKGdldHRlcilCTU9ial9nZXRfYmFzZUFkZHIsIChzZXR0ZXIpQk1PYmpfc2V0X2Jhc2VBZGRyLCBOVUxMfSwKLQl7InJvd0J5dGVzIiwgKGdldHRlcilCTU9ial9nZXRfcm93Qnl0ZXMsIChzZXR0ZXIpQk1PYmpfc2V0X3Jvd0J5dGVzLCBOVUxMfSwKLQl7ImJvdW5kcyIsIChnZXR0ZXIpQk1PYmpfZ2V0X2JvdW5kcywgKHNldHRlcilCTU9ial9zZXRfYm91bmRzLCBOVUxMfSwKLQl7ImJpdG1hcF9kYXRhIiwgKGdldHRlcilCTU9ial9nZXRfYml0bWFwX2RhdGEsIChzZXR0ZXIpQk1PYmpfc2V0X2JpdG1hcF9kYXRhLCBOVUxMfSwKLQl7InBpeG1hcF9kYXRhIiwgKGdldHRlcilCTU9ial9nZXRfcGl4bWFwX2RhdGEsIChzZXR0ZXIpQk1PYmpfc2V0X3BpeG1hcF9kYXRhLCBOVUxMfSwKLQl7TlVMTCwgTlVMTCwgTlVMTCwgTlVMTH0sCisgICAgeyJiYXNlQWRkciIsIChnZXR0ZXIpQk1PYmpfZ2V0X2Jhc2VBZGRyLCAoc2V0dGVyKUJNT2JqX3NldF9iYXNlQWRkciwgTlVMTH0sCisgICAgeyJyb3dCeXRlcyIsIChnZXR0ZXIpQk1PYmpfZ2V0X3Jvd0J5dGVzLCAoc2V0dGVyKUJNT2JqX3NldF9yb3dCeXRlcywgTlVMTH0sCisgICAgeyJib3VuZHMiLCAoZ2V0dGVyKUJNT2JqX2dldF9ib3VuZHMsIChzZXR0ZXIpQk1PYmpfc2V0X2JvdW5kcywgTlVMTH0sCisgICAgeyJiaXRtYXBfZGF0YSIsIChnZXR0ZXIpQk1PYmpfZ2V0X2JpdG1hcF9kYXRhLCAoc2V0dGVyKUJNT2JqX3NldF9iaXRtYXBfZGF0YSwgTlVMTH0sCisgICAgeyJwaXhtYXBfZGF0YSIsIChnZXR0ZXIpQk1PYmpfZ2V0X3BpeG1hcF9kYXRhLCAoc2V0dGVyKUJNT2JqX3NldF9waXhtYXBfZGF0YSwgTlVMTH0sCisgICAge05VTEwsIE5VTEwsIE5VTEwsIE5VTEx9LAogfTsKIAogCkBAIC0xNTQ0LDYxICsxNTQ0LDYxIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqQk1PYmpfdHBfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKl9hcmdzLCBQeU9iamVjdCAqX2t3ZHMpCiB7Ci0JUHlPYmplY3QgKl9zZWxmOwotCUJpdE1hcFB0ciBpdHNlbGY7Ci0JY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CisgICAgUHlPYmplY3QgKl9zZWxmOworICAgIEJpdE1hcFB0ciBpdHNlbGY7CisgICAgY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBCTU9ial9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7Ci0JaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkoKEJpdE1hcE9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiBfc2VsZjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBCTU9ial9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAoKEJpdE1hcE9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIHJldHVybiBfc2VsZjsKIH0KIAogI2RlZmluZSBCTU9ial90cF9mcmVlIFB5T2JqZWN0X0RlbAogCiAKIFB5VHlwZU9iamVjdCBCaXRNYXBfVHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKLQkwLCAvKm9iX3NpemUqLwotCSJfUWQuQml0TWFwIiwgLyp0cF9uYW1lKi8KLQlzaXplb2YoQml0TWFwT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLwotCTAsIC8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcikgQk1PYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KLQkwLCAvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykgQk1PYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpIEJNT2JqX3JlcHIsIC8qdHBfcmVwciovCi0JKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLwotCShQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCi0JKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCi0JKGhhc2hmdW5jKSBCTU9ial9oYXNoLCAvKnRwX2hhc2gqLwotCTAsIC8qdHBfY2FsbCovCi0JMCwgLyp0cF9zdHIqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KLQlQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLwotCTAsIC8qdHBfYXNfYnVmZmVyKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQkwLCAvKnRwX2RvYyovCi0JMCwgLyp0cF90cmF2ZXJzZSovCi0JMCwgLyp0cF9jbGVhciovCi0JMCwgLyp0cF9yaWNoY29tcGFyZSovCi0JMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCi0JMCwgLyp0cF9pdGVyKi8KLQkwLCAvKnRwX2l0ZXJuZXh0Ki8KLQlCTU9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCi0JMCwgLyp0cF9tZW1iZXJzKi8KLQlCTU9ial9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCi0JMCwgLyp0cF9iYXNlKi8KLQkwLCAvKnRwX2RpY3QqLwotCTAsIC8qdHBfZGVzY3JfZ2V0Ki8KLQkwLCAvKnRwX2Rlc2NyX3NldCovCi0JMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KLQlCTU9ial90cF9pbml0LCAvKiB0cF9pbml0ICovCi0JQk1PYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCi0JQk1PYmpfdHBfbmV3LCAvKiB0cF9uZXcgKi8KLQlCTU9ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgLypvYl9zaXplKi8KKyAgICAiX1FkLkJpdE1hcCIsIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKEJpdE1hcE9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpIEJNT2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgMCwgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCisgICAgKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCisgICAgKGNtcGZ1bmMpIEJNT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCisgICAgKHJlcHJmdW5jKSBCTU9ial9yZXByLCAvKnRwX3JlcHIqLworICAgIChQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIChQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLworICAgIChoYXNoZnVuYykgQk1PYmpfaGFzaCwgLyp0cF9oYXNoKi8KKyAgICAwLCAvKnRwX2NhbGwqLworICAgIDAsIC8qdHBfc3RyKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCisgICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgMCwgLyp0cF9kb2MqLworICAgIDAsIC8qdHBfdHJhdmVyc2UqLworICAgIDAsIC8qdHBfY2xlYXIqLworICAgIDAsIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsIC8qdHBfaXRlciovCisgICAgMCwgLyp0cF9pdGVybmV4dCovCisgICAgQk1PYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLworICAgIDAsIC8qdHBfbWVtYmVycyovCisgICAgQk1PYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLworICAgIDAsIC8qdHBfYmFzZSovCisgICAgMCwgLyp0cF9kaWN0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX2dldCovCisgICAgMCwgLyp0cF9kZXNjcl9zZXQqLworICAgIDAsIC8qdHBfZGljdG9mZnNldCovCisgICAgQk1PYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLworICAgIEJNT2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLworICAgIEJNT2JqX3RwX25ldywgLyogdHBfbmV3ICovCisgICAgQk1PYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEVuZCBvYmplY3QgdHlwZSBCaXRNYXAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0xNjA2LDU0ODUgKzE2MDYsNTQ4NSBAQAogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0dldFBvcnQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUdyYWZQdHIgcG9ydDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgR3JhZlB0ciBwb3J0OwogI2lmbmRlZiBHZXRQb3J0Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0UG9ydCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0UG9ydCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0UG9ydCgmcG9ydCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX05ldywgcG9ydCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldFBvcnQoJnBvcnQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgR3JhZk9ial9OZXcsIHBvcnQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0dyYWZEZXZpY2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IGRldmljZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgZGV2aWNlOwogI2lmbmRlZiBHcmFmRGV2aWNlCi0JUHlNYWNfUFJFQ0hFQ0soR3JhZkRldmljZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhZkRldmljZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRldmljZSkpCi0JCXJldHVybiBOVUxMOwotCUdyYWZEZXZpY2UoZGV2aWNlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXZpY2UpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHcmFmRGV2aWNlKGRldmljZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1NldFBvcnRCaXRzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCaXRNYXBQdHIgYm07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJpdE1hcFB0ciBibTsKICNpZm5kZWYgU2V0UG9ydEJpdHMKLQlQeU1hY19QUkVDSEVDSyhTZXRQb3J0Qml0cyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0UG9ydEJpdHMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBCTU9ial9Db252ZXJ0LCAmYm0pKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRQb3J0Qml0cyhibSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQk1PYmpfQ29udmVydCwgJmJtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0UG9ydEJpdHMoYm0pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9Qb3J0U2l6ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgd2lkdGg7Ci0Jc2hvcnQgaGVpZ2h0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCB3aWR0aDsKKyAgICBzaG9ydCBoZWlnaHQ7CiAjaWZuZGVmIFBvcnRTaXplCi0JUHlNYWNfUFJFQ0hFQ0soUG9ydFNpemUpOworICAgIFB5TWFjX1BSRUNIRUNLKFBvcnRTaXplKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJndpZHRoLAotCSAgICAgICAgICAgICAgICAgICAgICAmaGVpZ2h0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JUG9ydFNpemUod2lkdGgsCi0JICAgICAgICAgaGVpZ2h0KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZoZWlnaHQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQb3J0U2l6ZSh3aWR0aCwKKyAgICAgICAgICAgICBoZWlnaHQpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9Nb3ZlUG9ydFRvKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBsZWZ0R2xvYmFsOwotCXNob3J0IHRvcEdsb2JhbDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgbGVmdEdsb2JhbDsKKyAgICBzaG9ydCB0b3BHbG9iYWw7CiAjaWZuZGVmIE1vdmVQb3J0VG8KLQlQeU1hY19QUkVDSEVDSyhNb3ZlUG9ydFRvKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNb3ZlUG9ydFRvKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmxlZnRHbG9iYWwsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0b3BHbG9iYWwpKQotCQlyZXR1cm4gTlVMTDsKLQlNb3ZlUG9ydFRvKGxlZnRHbG9iYWwsCi0JICAgICAgICAgICB0b3BHbG9iYWwpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZsZWZ0R2xvYmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdG9wR2xvYmFsKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTW92ZVBvcnRUbyhsZWZ0R2xvYmFsLAorICAgICAgICAgICAgICAgdG9wR2xvYmFsKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfU2V0T3JpZ2luKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBoOwotCXNob3J0IHY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IGg7CisgICAgc2hvcnQgdjsKICNpZm5kZWYgU2V0T3JpZ2luCi0JUHlNYWNfUFJFQ0hFQ0soU2V0T3JpZ2luKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRPcmlnaW4pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnYpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRPcmlnaW4oaCwKLQkgICAgICAgICAgdik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0T3JpZ2luKGgsCisgICAgICAgICAgICAgIHYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9TZXRDbGlwKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZ25IYW5kbGUgcmduOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZ25IYW5kbGUgcmduOwogI2lmbmRlZiBTZXRDbGlwCi0JUHlNYWNfUFJFQ0hFQ0soU2V0Q2xpcCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0Q2xpcCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmduKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0Q2xpcChyZ24pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmduKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0Q2xpcChyZ24pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9HZXRDbGlwKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZ25IYW5kbGUgcmduOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZ25IYW5kbGUgcmduOwogI2lmbmRlZiBHZXRDbGlwCi0JUHlNYWNfUFJFQ0hFQ0soR2V0Q2xpcCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0Q2xpcCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmduKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0Q2xpcChyZ24pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmduKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0Q2xpcChyZ24pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9DbGlwUmVjdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVjdCByOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IHI7CiAjaWZuZGVmIENsaXBSZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soQ2xpcFJlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKENsaXBSZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIpKQotCQlyZXR1cm4gTlVMTDsKLQlDbGlwUmVjdCgmcik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDbGlwUmVjdCgmcik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0JhY2tQYXQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBhdHRlcm4gKnBhdF9faW5fXzsKLQlpbnQgcGF0X19pbl9sZW5fXzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUGF0dGVybiAqcGF0X19pbl9fOworICAgIGludCBwYXRfX2luX2xlbl9fOwogI2lmbmRlZiBCYWNrUGF0Ci0JUHlNYWNfUFJFQ0hFQ0soQmFja1BhdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQmFja1BhdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzIyIsCi0JICAgICAgICAgICAgICAgICAgICAgIChjaGFyICoqKSZwYXRfX2luX18sICZwYXRfX2luX2xlbl9fKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKHBhdF9faW5fbGVuX18gIT0gc2l6ZW9mKFBhdHRlcm4pKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImJ1ZmZlciBsZW5ndGggc2hvdWxkIGJlIHNpemVvZihQYXR0ZXJuKSIpOwotCQlnb3RvIHBhdF9fZXJyb3JfXzsKLQl9Ci0JQmFja1BhdChwYXRfX2luX18pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzIyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICoqKSZwYXRfX2luX18sICZwYXRfX2luX2xlbl9fKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKHBhdF9faW5fbGVuX18gIT0gc2l6ZW9mKFBhdHRlcm4pKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImJ1ZmZlciBsZW5ndGggc2hvdWxkIGJlIHNpemVvZihQYXR0ZXJuKSIpOworICAgICAgICBnb3RvIHBhdF9fZXJyb3JfXzsKKyAgICB9CisgICAgQmFja1BhdChwYXRfX2luX18pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKICBwYXRfX2Vycm9yX186IDsKLQlyZXR1cm4gX3JlczsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9Jbml0Q3Vyc29yKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIEluaXRDdXJzb3IKLQlQeU1hY19QUkVDSEVDSyhJbml0Q3Vyc29yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhJbml0Q3Vyc29yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlJbml0Q3Vyc29yKCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBJbml0Q3Vyc29yKCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX01hY1NldEN1cnNvcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ3Vyc29yICpjcnNyX19pbl9fOwotCWludCBjcnNyX19pbl9sZW5fXzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ3Vyc29yICpjcnNyX19pbl9fOworICAgIGludCBjcnNyX19pbl9sZW5fXzsKICNpZm5kZWYgTWFjU2V0Q3Vyc29yCi0JUHlNYWNfUFJFQ0hFQ0soTWFjU2V0Q3Vyc29yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNYWNTZXRDdXJzb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAicyMiLAotCSAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKikmY3Jzcl9faW5fXywgJmNyc3JfX2luX2xlbl9fKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKGNyc3JfX2luX2xlbl9fICE9IHNpemVvZihDdXJzb3IpKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImJ1ZmZlciBsZW5ndGggc2hvdWxkIGJlIHNpemVvZihDdXJzb3IpIik7Ci0JCWdvdG8gY3Jzcl9fZXJyb3JfXzsKLQl9Ci0JTWFjU2V0Q3Vyc29yKGNyc3JfX2luX18pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzIyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICoqKSZjcnNyX19pbl9fLCAmY3Jzcl9faW5fbGVuX18pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoY3Jzcl9faW5fbGVuX18gIT0gc2l6ZW9mKEN1cnNvcikpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYnVmZmVyIGxlbmd0aCBzaG91bGQgYmUgc2l6ZW9mKEN1cnNvcikiKTsKKyAgICAgICAgZ290byBjcnNyX19lcnJvcl9fOworICAgIH0KKyAgICBNYWNTZXRDdXJzb3IoY3Jzcl9faW5fXyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOwogIGNyc3JfX2Vycm9yX186IDsKLQlyZXR1cm4gX3JlczsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9IaWRlQ3Vyc29yKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIEhpZGVDdXJzb3IKLQlQeU1hY19QUkVDSEVDSyhIaWRlQ3Vyc29yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhIaWRlQ3Vyc29yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlIaWRlQ3Vyc29yKCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBIaWRlQ3Vyc29yKCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX01hY1Nob3dDdXJzb3IoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgTWFjU2hvd0N1cnNvcgotCVB5TWFjX1BSRUNIRUNLKE1hY1Nob3dDdXJzb3IpOworICAgIFB5TWFjX1BSRUNIRUNLKE1hY1Nob3dDdXJzb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCU1hY1Nob3dDdXJzb3IoKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE1hY1Nob3dDdXJzb3IoKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfT2JzY3VyZUN1cnNvcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBPYnNjdXJlQ3Vyc29yCi0JUHlNYWNfUFJFQ0hFQ0soT2JzY3VyZUN1cnNvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soT2JzY3VyZUN1cnNvcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JT2JzY3VyZUN1cnNvcigpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgT2JzY3VyZUN1cnNvcigpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9IaWRlUGVuKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIEhpZGVQZW4KLQlQeU1hY19QUkVDSEVDSyhIaWRlUGVuKTsKKyAgICBQeU1hY19QUkVDSEVDSyhIaWRlUGVuKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlIaWRlUGVuKCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBIaWRlUGVuKCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1Nob3dQZW4oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgU2hvd1BlbgotCVB5TWFjX1BSRUNIRUNLKFNob3dQZW4pOworICAgIFB5TWFjX1BSRUNIRUNLKFNob3dQZW4pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCVNob3dQZW4oKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNob3dQZW4oKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfR2V0UGVuKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQb2ludCBwdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUG9pbnQgcHQ7CiAjaWZuZGVmIEdldFBlbgotCVB5TWFjX1BSRUNIRUNLKEdldFBlbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0UGVuKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlHZXRQZW4oJnB0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUG9pbnQsIHB0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0UGVuKCZwdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFBvaW50LCBwdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfR2V0UGVuU3RhdGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBlblN0YXRlIHBuU3RhdGVfX291dF9fOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQZW5TdGF0ZSBwblN0YXRlX19vdXRfXzsKICNpZm5kZWYgR2V0UGVuU3RhdGUKLQlQeU1hY19QUkVDSEVDSyhHZXRQZW5TdGF0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0UGVuU3RhdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUdldFBlblN0YXRlKCZwblN0YXRlX19vdXRfXyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoInMjIiwKLQkgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSZwblN0YXRlX19vdXRfXywgKGludClzaXplb2YoUGVuU3RhdGUpKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0UGVuU3RhdGUoJnBuU3RhdGVfX291dF9fKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgicyMiLAorICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopJnBuU3RhdGVfX291dF9fLCAoaW50KXNpemVvZihQZW5TdGF0ZSkpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1NldFBlblN0YXRlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQZW5TdGF0ZSAqcG5TdGF0ZV9faW5fXzsKLQlpbnQgcG5TdGF0ZV9faW5fbGVuX187CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBlblN0YXRlICpwblN0YXRlX19pbl9fOworICAgIGludCBwblN0YXRlX19pbl9sZW5fXzsKICNpZm5kZWYgU2V0UGVuU3RhdGUKLQlQeU1hY19QUkVDSEVDSyhTZXRQZW5TdGF0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0UGVuU3RhdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAicyMiLAotCSAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKikmcG5TdGF0ZV9faW5fXywgJnBuU3RhdGVfX2luX2xlbl9fKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKHBuU3RhdGVfX2luX2xlbl9fICE9IHNpemVvZihQZW5TdGF0ZSkpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYnVmZmVyIGxlbmd0aCBzaG91bGQgYmUgc2l6ZW9mKFBlblN0YXRlKSIpOwotCQlnb3RvIHBuU3RhdGVfX2Vycm9yX187Ci0JfQotCVNldFBlblN0YXRlKHBuU3RhdGVfX2luX18pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzIyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICoqKSZwblN0YXRlX19pbl9fLCAmcG5TdGF0ZV9faW5fbGVuX18pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAocG5TdGF0ZV9faW5fbGVuX18gIT0gc2l6ZW9mKFBlblN0YXRlKSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJidWZmZXIgbGVuZ3RoIHNob3VsZCBiZSBzaXplb2YoUGVuU3RhdGUpIik7CisgICAgICAgIGdvdG8gcG5TdGF0ZV9fZXJyb3JfXzsKKyAgICB9CisgICAgU2V0UGVuU3RhdGUocG5TdGF0ZV9faW5fXyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOwogIHBuU3RhdGVfX2Vycm9yX186IDsKLQlyZXR1cm4gX3JlczsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9QZW5TaXplKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCB3aWR0aDsKLQlzaG9ydCBoZWlnaHQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IHdpZHRoOworICAgIHNob3J0IGhlaWdodDsKICNpZm5kZWYgUGVuU2l6ZQotCVB5TWFjX1BSRUNIRUNLKFBlblNpemUpOworICAgIFB5TWFjX1BSRUNIRUNLKFBlblNpemUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmd2lkdGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZoZWlnaHQpKQotCQlyZXR1cm4gTlVMTDsKLQlQZW5TaXplKHdpZHRoLAotCSAgICAgICAgaGVpZ2h0KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZoZWlnaHQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQZW5TaXplKHdpZHRoLAorICAgICAgICBoZWlnaHQpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9QZW5Nb2RlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBtb2RlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBtb2RlOwogI2lmbmRlZiBQZW5Nb2RlCi0JUHlNYWNfUFJFQ0hFQ0soUGVuTW9kZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUGVuTW9kZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vZGUpKQotCQlyZXR1cm4gTlVMTDsKLQlQZW5Nb2RlKG1vZGUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQZW5Nb2RlKG1vZGUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9QZW5QYXQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBhdHRlcm4gKnBhdF9faW5fXzsKLQlpbnQgcGF0X19pbl9sZW5fXzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUGF0dGVybiAqcGF0X19pbl9fOworICAgIGludCBwYXRfX2luX2xlbl9fOwogI2lmbmRlZiBQZW5QYXQKLQlQeU1hY19QUkVDSEVDSyhQZW5QYXQpOworICAgIFB5TWFjX1BSRUNIRUNLKFBlblBhdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzIyIsCi0JICAgICAgICAgICAgICAgICAgICAgIChjaGFyICoqKSZwYXRfX2luX18sICZwYXRfX2luX2xlbl9fKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKHBhdF9faW5fbGVuX18gIT0gc2l6ZW9mKFBhdHRlcm4pKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImJ1ZmZlciBsZW5ndGggc2hvdWxkIGJlIHNpemVvZihQYXR0ZXJuKSIpOwotCQlnb3RvIHBhdF9fZXJyb3JfXzsKLQl9Ci0JUGVuUGF0KHBhdF9faW5fXyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInMjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKiopJnBhdF9faW5fXywgJnBhdF9faW5fbGVuX18pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAocGF0X19pbl9sZW5fXyAhPSBzaXplb2YoUGF0dGVybikpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYnVmZmVyIGxlbmd0aCBzaG91bGQgYmUgc2l6ZW9mKFBhdHRlcm4pIik7CisgICAgICAgIGdvdG8gcGF0X19lcnJvcl9fOworICAgIH0KKyAgICBQZW5QYXQocGF0X19pbl9fKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CiAgcGF0X19lcnJvcl9fOiA7Ci0JcmV0dXJuIF9yZXM7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfUGVuTm9ybWFsKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIFBlbk5vcm1hbAotCVB5TWFjX1BSRUNIRUNLKFBlbk5vcm1hbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUGVuTm9ybWFsKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlQZW5Ob3JtYWwoKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFBlbk5vcm1hbCgpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9Nb3ZlVG8oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IGg7Ci0Jc2hvcnQgdjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgaDsKKyAgICBzaG9ydCB2OwogI2lmbmRlZiBNb3ZlVG8KLQlQeU1hY19QUkVDSEVDSyhNb3ZlVG8pOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmVUbyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZoLAotCSAgICAgICAgICAgICAgICAgICAgICAmdikpCi0JCXJldHVybiBOVUxMOwotCU1vdmVUbyhoLAotCSAgICAgICB2KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNb3ZlVG8oaCwKKyAgICAgICAgICAgdik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX01vdmUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IGRoOwotCXNob3J0IGR2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBkaDsKKyAgICBzaG9ydCBkdjsKICNpZm5kZWYgTW92ZQotCVB5TWFjX1BSRUNIRUNLKE1vdmUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZkdikpCi0JCXJldHVybiBOVUxMOwotCU1vdmUoZGgsCi0JICAgICBkdik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZHYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNb3ZlKGRoLAorICAgICAgICAgZHYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9NYWNMaW5lVG8oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IGg7Ci0Jc2hvcnQgdjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgaDsKKyAgICBzaG9ydCB2OwogI2lmbmRlZiBNYWNMaW5lVG8KLQlQeU1hY19QUkVDSEVDSyhNYWNMaW5lVG8pOworICAgIFB5TWFjX1BSRUNIRUNLKE1hY0xpbmVUbyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZoLAotCSAgICAgICAgICAgICAgICAgICAgICAmdikpCi0JCXJldHVybiBOVUxMOwotCU1hY0xpbmVUbyhoLAotCSAgICAgICAgICB2KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNYWNMaW5lVG8oaCwKKyAgICAgICAgICAgICAgdik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0xpbmUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IGRoOwotCXNob3J0IGR2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBkaDsKKyAgICBzaG9ydCBkdjsKICNpZm5kZWYgTGluZQotCVB5TWFjX1BSRUNIRUNLKExpbmUpOworICAgIFB5TWFjX1BSRUNIRUNLKExpbmUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZkdikpCi0JCXJldHVybiBOVUxMOwotCUxpbmUoZGgsCi0JICAgICBkdik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZHYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBMaW5lKGRoLAorICAgICAgICAgZHYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9Gb3JlQ29sb3IoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWxvbmcgY29sb3I7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgY29sb3I7CiAjaWZuZGVmIEZvcmVDb2xvcgotCVB5TWFjX1BSRUNIRUNLKEZvcmVDb2xvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soRm9yZUNvbG9yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmY29sb3IpKQotCQlyZXR1cm4gTlVMTDsKLQlGb3JlQ29sb3IoY29sb3IpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbG9yKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgRm9yZUNvbG9yKGNvbG9yKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfQmFja0NvbG9yKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIGNvbG9yOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBsb25nIGNvbG9yOwogI2lmbmRlZiBCYWNrQ29sb3IKLQlQeU1hY19QUkVDSEVDSyhCYWNrQ29sb3IpOworICAgIFB5TWFjX1BSRUNIRUNLKEJhY2tDb2xvcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNvbG9yKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQmFja0NvbG9yKGNvbG9yKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2xvcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEJhY2tDb2xvcihjb2xvcik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0NvbG9yQml0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCB3aGljaEJpdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgd2hpY2hCaXQ7CiAjaWZuZGVmIENvbG9yQml0Ci0JUHlNYWNfUFJFQ0hFQ0soQ29sb3JCaXQpOworICAgIFB5TWFjX1BSRUNIRUNLKENvbG9yQml0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmd2hpY2hCaXQpKQotCQlyZXR1cm4gTlVMTDsKLQlDb2xvckJpdCh3aGljaEJpdCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmd2hpY2hCaXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDb2xvckJpdCh3aGljaEJpdCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX01hY1NldFJlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3QgcjsKLQlzaG9ydCBsZWZ0OwotCXNob3J0IHRvcDsKLQlzaG9ydCByaWdodDsKLQlzaG9ydCBib3R0b207CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlY3QgcjsKKyAgICBzaG9ydCBsZWZ0OworICAgIHNob3J0IHRvcDsKKyAgICBzaG9ydCByaWdodDsKKyAgICBzaG9ydCBib3R0b207CiAjaWZuZGVmIE1hY1NldFJlY3QKLQlQeU1hY19QUkVDSEVDSyhNYWNTZXRSZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhNYWNTZXRSZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoaGgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmbGVmdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRvcCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJpZ2h0LAotCSAgICAgICAgICAgICAgICAgICAgICAmYm90dG9tKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTWFjU2V0UmVjdCgmciwKLQkgICAgICAgICAgIGxlZnQsCi0JICAgICAgICAgICB0b3AsCi0JICAgICAgICAgICByaWdodCwKLQkgICAgICAgICAgIGJvdHRvbSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZyKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaGhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdHRvbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE1hY1NldFJlY3QoJnIsCisgICAgICAgICAgICAgICBsZWZ0LAorICAgICAgICAgICAgICAgdG9wLAorICAgICAgICAgICAgICAgcmlnaHQsCisgICAgICAgICAgICAgICBib3R0b20pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmcik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfTWFjT2Zmc2V0UmVjdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVjdCByOwotCXNob3J0IGRoOwotCXNob3J0IGR2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IHI7CisgICAgc2hvcnQgZGg7CisgICAgc2hvcnQgZHY7CiAjaWZuZGVmIE1hY09mZnNldFJlY3QKLQlQeU1hY19QUkVDSEVDSyhNYWNPZmZzZXRSZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhNYWNPZmZzZXRSZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGgiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmciwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRoLAotCSAgICAgICAgICAgICAgICAgICAgICAmZHYpKQotCQlyZXR1cm4gTlVMTDsKLQlNYWNPZmZzZXRSZWN0KCZyLAotCSAgICAgICAgICAgICAgZGgsCi0JICAgICAgICAgICAgICBkdik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZyKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmR2KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTWFjT2Zmc2V0UmVjdCgmciwKKyAgICAgICAgICAgICAgICAgIGRoLAorICAgICAgICAgICAgICAgICAgZHYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmcik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfTWFjSW5zZXRSZWN0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZWN0IHI7Ci0Jc2hvcnQgZGg7Ci0Jc2hvcnQgZHY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlY3QgcjsKKyAgICBzaG9ydCBkaDsKKyAgICBzaG9ydCBkdjsKICNpZm5kZWYgTWFjSW5zZXRSZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soTWFjSW5zZXRSZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhNYWNJbnNldFJlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZkdikpCi0JCXJldHVybiBOVUxMOwotCU1hY0luc2V0UmVjdCgmciwKLQkgICAgICAgICAgICAgZGgsCi0JICAgICAgICAgICAgIGR2KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJnIpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZHYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNYWNJbnNldFJlY3QoJnIsCisgICAgICAgICAgICAgICAgIGRoLAorICAgICAgICAgICAgICAgICBkdik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZyKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9TZWN0UmVjdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JUmVjdCBzcmMxOwotCVJlY3Qgc3JjMjsKLQlSZWN0IGRzdFJlY3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIFJlY3Qgc3JjMTsKKyAgICBSZWN0IHNyYzI7CisgICAgUmVjdCBkc3RSZWN0OwogI2lmbmRlZiBTZWN0UmVjdAotCVB5TWFjX1BSRUNIRUNLKFNlY3RSZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZWN0UmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnNyYzEsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZzcmMyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU2VjdFJlY3QoJnNyYzEsCi0JICAgICAgICAgICAgICAgJnNyYzIsCi0JICAgICAgICAgICAgICAgJmRzdFJlY3QpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZkc3RSZWN0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZzcmMyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU2VjdFJlY3QoJnNyYzEsCisgICAgICAgICAgICAgICAgICAgJnNyYzIsCisgICAgICAgICAgICAgICAgICAgJmRzdFJlY3QpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZkc3RSZWN0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9NYWNVbmlvblJlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3Qgc3JjMTsKLQlSZWN0IHNyYzI7Ci0JUmVjdCBkc3RSZWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IHNyYzE7CisgICAgUmVjdCBzcmMyOworICAgIFJlY3QgZHN0UmVjdDsKICNpZm5kZWYgTWFjVW5pb25SZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soTWFjVW5pb25SZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhNYWNVbmlvblJlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZzcmMxLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmc3JjMikpCi0JCXJldHVybiBOVUxMOwotCU1hY1VuaW9uUmVjdCgmc3JjMSwKLQkgICAgICAgICAgICAgJnNyYzIsCi0JICAgICAgICAgICAgICZkc3RSZWN0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmRzdFJlY3QpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmc3JjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnNyYzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNYWNVbmlvblJlY3QoJnNyYzEsCisgICAgICAgICAgICAgICAgICZzcmMyLAorICAgICAgICAgICAgICAgICAmZHN0UmVjdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZkc3RSZWN0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9NYWNFcXVhbFJlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCVJlY3QgcmVjdDE7Ci0JUmVjdCByZWN0MjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgUmVjdCByZWN0MTsKKyAgICBSZWN0IHJlY3QyOwogI2lmbmRlZiBNYWNFcXVhbFJlY3QKLQlQeU1hY19QUkVDSEVDSyhNYWNFcXVhbFJlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKE1hY0VxdWFsUmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnJlY3QxLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmcmVjdDIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNYWNFcXVhbFJlY3QoJnJlY3QxLAotCSAgICAgICAgICAgICAgICAgICAmcmVjdDIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmcmVjdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyZWN0MikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1hY0VxdWFsUmVjdCgmcmVjdDEsCisgICAgICAgICAgICAgICAgICAgICAgICZyZWN0Mik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfRW1wdHlSZWN0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlSZWN0IHI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIFJlY3QgcjsKICNpZm5kZWYgRW1wdHlSZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soRW1wdHlSZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhFbXB0eVJlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmcikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEVtcHR5UmVjdCgmcik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEVtcHR5UmVjdCgmcik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfTWFjRnJhbWVSZWN0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZWN0IHI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlY3QgcjsKICNpZm5kZWYgTWFjRnJhbWVSZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soTWFjRnJhbWVSZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhNYWNGcmFtZVJlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmcikpCi0JCXJldHVybiBOVUxMOwotCU1hY0ZyYW1lUmVjdCgmcik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNYWNGcmFtZVJlY3QoJnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9QYWludFJlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3QgcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmVjdCByOwogI2lmbmRlZiBQYWludFJlY3QKLQlQeU1hY19QUkVDSEVDSyhQYWludFJlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKFBhaW50UmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JUGFpbnRSZWN0KCZyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFBhaW50UmVjdCgmcik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0VyYXNlUmVjdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVjdCByOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IHI7CiAjaWZuZGVmIEVyYXNlUmVjdAotCVB5TWFjX1BSRUNIRUNLKEVyYXNlUmVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRXJhc2VSZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIpKQotCQlyZXR1cm4gTlVMTDsKLQlFcmFzZVJlY3QoJnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgRXJhc2VSZWN0KCZyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfTWFjSW52ZXJ0UmVjdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVjdCByOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IHI7CiAjaWZuZGVmIE1hY0ludmVydFJlY3QKLQlQeU1hY19QUkVDSEVDSyhNYWNJbnZlcnRSZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhNYWNJbnZlcnRSZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIpKQotCQlyZXR1cm4gTlVMTDsKLQlNYWNJbnZlcnRSZWN0KCZyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE1hY0ludmVydFJlY3QoJnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9NYWNGaWxsUmVjdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVjdCByOwotCVBhdHRlcm4gKnBhdF9faW5fXzsKLQlpbnQgcGF0X19pbl9sZW5fXzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmVjdCByOworICAgIFBhdHRlcm4gKnBhdF9faW5fXzsKKyAgICBpbnQgcGF0X19pbl9sZW5fXzsKICNpZm5kZWYgTWFjRmlsbFJlY3QKLQlQeU1hY19QUkVDSEVDSyhNYWNGaWxsUmVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWFjRmlsbFJlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIyIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyLAotCSAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKikmcGF0X19pbl9fLCAmcGF0X19pbl9sZW5fXykpCi0JCXJldHVybiBOVUxMOwotCWlmIChwYXRfX2luX2xlbl9fICE9IHNpemVvZihQYXR0ZXJuKSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJidWZmZXIgbGVuZ3RoIHNob3VsZCBiZSBzaXplb2YoUGF0dGVybikiKTsKLQkJZ290byBwYXRfX2Vycm9yX187Ci0JfQotCU1hY0ZpbGxSZWN0KCZyLAotCSAgICAgICAgICAgIHBhdF9faW5fXyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKiopJnBhdF9faW5fXywgJnBhdF9faW5fbGVuX18pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAocGF0X19pbl9sZW5fXyAhPSBzaXplb2YoUGF0dGVybikpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYnVmZmVyIGxlbmd0aCBzaG91bGQgYmUgc2l6ZW9mKFBhdHRlcm4pIik7CisgICAgICAgIGdvdG8gcGF0X19lcnJvcl9fOworICAgIH0KKyAgICBNYWNGaWxsUmVjdCgmciwKKyAgICAgICAgICAgICAgICBwYXRfX2luX18pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKICBwYXRfX2Vycm9yX186IDsKLQlyZXR1cm4gX3JlczsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9GcmFtZU92YWwoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3QgcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmVjdCByOwogI2lmbmRlZiBGcmFtZU92YWwKLQlQeU1hY19QUkVDSEVDSyhGcmFtZU92YWwpOworICAgIFB5TWFjX1BSRUNIRUNLKEZyYW1lT3ZhbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JRnJhbWVPdmFsKCZyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEZyYW1lT3ZhbCgmcik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1BhaW50T3ZhbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVjdCByOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IHI7CiAjaWZuZGVmIFBhaW50T3ZhbAotCVB5TWFjX1BSRUNIRUNLKFBhaW50T3ZhbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUGFpbnRPdmFsKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIpKQotCQlyZXR1cm4gTlVMTDsKLQlQYWludE92YWwoJnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUGFpbnRPdmFsKCZyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfRXJhc2VPdmFsKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZWN0IHI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlY3QgcjsKICNpZm5kZWYgRXJhc2VPdmFsCi0JUHlNYWNfUFJFQ0hFQ0soRXJhc2VPdmFsKTsKKyAgICBQeU1hY19QUkVDSEVDSyhFcmFzZU92YWwpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmcikpCi0JCXJldHVybiBOVUxMOwotCUVyYXNlT3ZhbCgmcik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBFcmFzZU92YWwoJnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9JbnZlcnRPdmFsKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZWN0IHI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlY3QgcjsKICNpZm5kZWYgSW52ZXJ0T3ZhbAotCVB5TWFjX1BSRUNIRUNLKEludmVydE92YWwpOworICAgIFB5TWFjX1BSRUNIRUNLKEludmVydE92YWwpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmcikpCi0JCXJldHVybiBOVUxMOwotCUludmVydE92YWwoJnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgSW52ZXJ0T3ZhbCgmcik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0ZpbGxPdmFsKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZWN0IHI7Ci0JUGF0dGVybiAqcGF0X19pbl9fOwotCWludCBwYXRfX2luX2xlbl9fOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IHI7CisgICAgUGF0dGVybiAqcGF0X19pbl9fOworICAgIGludCBwYXRfX2luX2xlbl9fOwogI2lmbmRlZiBGaWxsT3ZhbAotCVB5TWFjX1BSRUNIRUNLKEZpbGxPdmFsKTsKKyAgICBQeU1hY19QUkVDSEVDSyhGaWxsT3ZhbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnMjIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIsCi0JICAgICAgICAgICAgICAgICAgICAgIChjaGFyICoqKSZwYXRfX2luX18sICZwYXRfX2luX2xlbl9fKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKHBhdF9faW5fbGVuX18gIT0gc2l6ZW9mKFBhdHRlcm4pKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImJ1ZmZlciBsZW5ndGggc2hvdWxkIGJlIHNpemVvZihQYXR0ZXJuKSIpOwotCQlnb3RvIHBhdF9fZXJyb3JfXzsKLQl9Ci0JRmlsbE92YWwoJnIsCi0JICAgICAgICAgcGF0X19pbl9fKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKikmcGF0X19pbl9fLCAmcGF0X19pbl9sZW5fXykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChwYXRfX2luX2xlbl9fICE9IHNpemVvZihQYXR0ZXJuKSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJidWZmZXIgbGVuZ3RoIHNob3VsZCBiZSBzaXplb2YoUGF0dGVybikiKTsKKyAgICAgICAgZ290byBwYXRfX2Vycm9yX187CisgICAgfQorICAgIEZpbGxPdmFsKCZyLAorICAgICAgICAgICAgIHBhdF9faW5fXyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOwogIHBhdF9fZXJyb3JfXzogOwotCXJldHVybiBfcmVzOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0ZyYW1lUm91bmRSZWN0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZWN0IHI7Ci0Jc2hvcnQgb3ZhbFdpZHRoOwotCXNob3J0IG92YWxIZWlnaHQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlY3QgcjsKKyAgICBzaG9ydCBvdmFsV2lkdGg7CisgICAgc2hvcnQgb3ZhbEhlaWdodDsKICNpZm5kZWYgRnJhbWVSb3VuZFJlY3QKLQlQeU1hY19QUkVDSEVDSyhGcmFtZVJvdW5kUmVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRnJhbWVSb3VuZFJlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyLAotCSAgICAgICAgICAgICAgICAgICAgICAmb3ZhbFdpZHRoLAotCSAgICAgICAgICAgICAgICAgICAgICAmb3ZhbEhlaWdodCkpCi0JCXJldHVybiBOVUxMOwotCUZyYW1lUm91bmRSZWN0KCZyLAotCSAgICAgICAgICAgICAgIG92YWxXaWR0aCwKLQkgICAgICAgICAgICAgICBvdmFsSGVpZ2h0KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmb3ZhbFdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmb3ZhbEhlaWdodCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEZyYW1lUm91bmRSZWN0KCZyLAorICAgICAgICAgICAgICAgICAgIG92YWxXaWR0aCwKKyAgICAgICAgICAgICAgICAgICBvdmFsSGVpZ2h0KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfUGFpbnRSb3VuZFJlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3QgcjsKLQlzaG9ydCBvdmFsV2lkdGg7Ci0Jc2hvcnQgb3ZhbEhlaWdodDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmVjdCByOworICAgIHNob3J0IG92YWxXaWR0aDsKKyAgICBzaG9ydCBvdmFsSGVpZ2h0OwogI2lmbmRlZiBQYWludFJvdW5kUmVjdAotCVB5TWFjX1BSRUNIRUNLKFBhaW50Um91bmRSZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhQYWludFJvdW5kUmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIsCi0JICAgICAgICAgICAgICAgICAgICAgICZvdmFsV2lkdGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZvdmFsSGVpZ2h0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JUGFpbnRSb3VuZFJlY3QoJnIsCi0JICAgICAgICAgICAgICAgb3ZhbFdpZHRoLAotCSAgICAgICAgICAgICAgIG92YWxIZWlnaHQpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZvdmFsV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZvdmFsSGVpZ2h0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUGFpbnRSb3VuZFJlY3QoJnIsCisgICAgICAgICAgICAgICAgICAgb3ZhbFdpZHRoLAorICAgICAgICAgICAgICAgICAgIG92YWxIZWlnaHQpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9FcmFzZVJvdW5kUmVjdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVjdCByOwotCXNob3J0IG92YWxXaWR0aDsKLQlzaG9ydCBvdmFsSGVpZ2h0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IHI7CisgICAgc2hvcnQgb3ZhbFdpZHRoOworICAgIHNob3J0IG92YWxIZWlnaHQ7CiAjaWZuZGVmIEVyYXNlUm91bmRSZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soRXJhc2VSb3VuZFJlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKEVyYXNlUm91bmRSZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGgiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmciwKLQkgICAgICAgICAgICAgICAgICAgICAgJm92YWxXaWR0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm92YWxIZWlnaHQpKQotCQlyZXR1cm4gTlVMTDsKLQlFcmFzZVJvdW5kUmVjdCgmciwKLQkgICAgICAgICAgICAgICBvdmFsV2lkdGgsCi0JICAgICAgICAgICAgICAgb3ZhbEhlaWdodCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm92YWxXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm92YWxIZWlnaHQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBFcmFzZVJvdW5kUmVjdCgmciwKKyAgICAgICAgICAgICAgICAgICBvdmFsV2lkdGgsCisgICAgICAgICAgICAgICAgICAgb3ZhbEhlaWdodCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0ludmVydFJvdW5kUmVjdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVjdCByOwotCXNob3J0IG92YWxXaWR0aDsKLQlzaG9ydCBvdmFsSGVpZ2h0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IHI7CisgICAgc2hvcnQgb3ZhbFdpZHRoOworICAgIHNob3J0IG92YWxIZWlnaHQ7CiAjaWZuZGVmIEludmVydFJvdW5kUmVjdAotCVB5TWFjX1BSRUNIRUNLKEludmVydFJvdW5kUmVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSW52ZXJ0Um91bmRSZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGgiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmciwKLQkgICAgICAgICAgICAgICAgICAgICAgJm92YWxXaWR0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm92YWxIZWlnaHQpKQotCQlyZXR1cm4gTlVMTDsKLQlJbnZlcnRSb3VuZFJlY3QoJnIsCi0JICAgICAgICAgICAgICAgIG92YWxXaWR0aCwKLQkgICAgICAgICAgICAgICAgb3ZhbEhlaWdodCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm92YWxXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm92YWxIZWlnaHQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBJbnZlcnRSb3VuZFJlY3QoJnIsCisgICAgICAgICAgICAgICAgICAgIG92YWxXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgb3ZhbEhlaWdodCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0ZpbGxSb3VuZFJlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3QgcjsKLQlzaG9ydCBvdmFsV2lkdGg7Ci0Jc2hvcnQgb3ZhbEhlaWdodDsKLQlQYXR0ZXJuICpwYXRfX2luX187Ci0JaW50IHBhdF9faW5fbGVuX187CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlY3QgcjsKKyAgICBzaG9ydCBvdmFsV2lkdGg7CisgICAgc2hvcnQgb3ZhbEhlaWdodDsKKyAgICBQYXR0ZXJuICpwYXRfX2luX187CisgICAgaW50IHBhdF9faW5fbGVuX187CiAjaWZuZGVmIEZpbGxSb3VuZFJlY3QKLQlQeU1hY19QUkVDSEVDSyhGaWxsUm91bmRSZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhGaWxsUm91bmRSZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGhzIyIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyLAotCSAgICAgICAgICAgICAgICAgICAgICAmb3ZhbFdpZHRoLAotCSAgICAgICAgICAgICAgICAgICAgICAmb3ZhbEhlaWdodCwKLQkgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKiopJnBhdF9faW5fXywgJnBhdF9faW5fbGVuX18pKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAocGF0X19pbl9sZW5fXyAhPSBzaXplb2YoUGF0dGVybikpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYnVmZmVyIGxlbmd0aCBzaG91bGQgYmUgc2l6ZW9mKFBhdHRlcm4pIik7Ci0JCWdvdG8gcGF0X19lcnJvcl9fOwotCX0KLQlGaWxsUm91bmRSZWN0KCZyLAotCSAgICAgICAgICAgICAgb3ZhbFdpZHRoLAotCSAgICAgICAgICAgICAgb3ZhbEhlaWdodCwKLQkgICAgICAgICAgICAgIHBhdF9faW5fXyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGhzIyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmb3ZhbFdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmb3ZhbEhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKiopJnBhdF9faW5fXywgJnBhdF9faW5fbGVuX18pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAocGF0X19pbl9sZW5fXyAhPSBzaXplb2YoUGF0dGVybikpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYnVmZmVyIGxlbmd0aCBzaG91bGQgYmUgc2l6ZW9mKFBhdHRlcm4pIik7CisgICAgICAgIGdvdG8gcGF0X19lcnJvcl9fOworICAgIH0KKyAgICBGaWxsUm91bmRSZWN0KCZyLAorICAgICAgICAgICAgICAgICAgb3ZhbFdpZHRoLAorICAgICAgICAgICAgICAgICAgb3ZhbEhlaWdodCwKKyAgICAgICAgICAgICAgICAgIHBhdF9faW5fXyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOwogIHBhdF9fZXJyb3JfXzogOwotCXJldHVybiBfcmVzOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0ZyYW1lQXJjKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZWN0IHI7Ci0Jc2hvcnQgc3RhcnRBbmdsZTsKLQlzaG9ydCBhcmNBbmdsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmVjdCByOworICAgIHNob3J0IHN0YXJ0QW5nbGU7CisgICAgc2hvcnQgYXJjQW5nbGU7CiAjaWZuZGVmIEZyYW1lQXJjCi0JUHlNYWNfUFJFQ0hFQ0soRnJhbWVBcmMpOworICAgIFB5TWFjX1BSRUNIRUNLKEZyYW1lQXJjKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGgiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmciwKLQkgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0QW5nbGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZhcmNBbmdsZSkpCi0JCXJldHVybiBOVUxMOwotCUZyYW1lQXJjKCZyLAotCSAgICAgICAgIHN0YXJ0QW5nbGUsCi0JICAgICAgICAgYXJjQW5nbGUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGFydEFuZ2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYXJjQW5nbGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBGcmFtZUFyYygmciwKKyAgICAgICAgICAgICBzdGFydEFuZ2xlLAorICAgICAgICAgICAgIGFyY0FuZ2xlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfUGFpbnRBcmMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3QgcjsKLQlzaG9ydCBzdGFydEFuZ2xlOwotCXNob3J0IGFyY0FuZ2xlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IHI7CisgICAgc2hvcnQgc3RhcnRBbmdsZTsKKyAgICBzaG9ydCBhcmNBbmdsZTsKICNpZm5kZWYgUGFpbnRBcmMKLQlQeU1hY19QUkVDSEVDSyhQYWludEFyYyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUGFpbnRBcmMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyLAotCSAgICAgICAgICAgICAgICAgICAgICAmc3RhcnRBbmdsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmFyY0FuZ2xlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JUGFpbnRBcmMoJnIsCi0JICAgICAgICAgc3RhcnRBbmdsZSwKLQkgICAgICAgICBhcmNBbmdsZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0QW5nbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhcmNBbmdsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFBhaW50QXJjKCZyLAorICAgICAgICAgICAgIHN0YXJ0QW5nbGUsCisgICAgICAgICAgICAgYXJjQW5nbGUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9FcmFzZUFyYyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVjdCByOwotCXNob3J0IHN0YXJ0QW5nbGU7Ci0Jc2hvcnQgYXJjQW5nbGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlY3QgcjsKKyAgICBzaG9ydCBzdGFydEFuZ2xlOworICAgIHNob3J0IGFyY0FuZ2xlOwogI2lmbmRlZiBFcmFzZUFyYwotCVB5TWFjX1BSRUNIRUNLKEVyYXNlQXJjKTsKKyAgICBQeU1hY19QUkVDSEVDSyhFcmFzZUFyYyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIsCi0JICAgICAgICAgICAgICAgICAgICAgICZzdGFydEFuZ2xlLAotCSAgICAgICAgICAgICAgICAgICAgICAmYXJjQW5nbGUpKQotCQlyZXR1cm4gTlVMTDsKLQlFcmFzZUFyYygmciwKLQkgICAgICAgICBzdGFydEFuZ2xlLAotCSAgICAgICAgIGFyY0FuZ2xlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhcnRBbmdsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFyY0FuZ2xlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgRXJhc2VBcmMoJnIsCisgICAgICAgICAgICAgc3RhcnRBbmdsZSwKKyAgICAgICAgICAgICBhcmNBbmdsZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0ludmVydEFyYyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVjdCByOwotCXNob3J0IHN0YXJ0QW5nbGU7Ci0Jc2hvcnQgYXJjQW5nbGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlY3QgcjsKKyAgICBzaG9ydCBzdGFydEFuZ2xlOworICAgIHNob3J0IGFyY0FuZ2xlOwogI2lmbmRlZiBJbnZlcnRBcmMKLQlQeU1hY19QUkVDSEVDSyhJbnZlcnRBcmMpOworICAgIFB5TWFjX1BSRUNIRUNLKEludmVydEFyYyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIsCi0JICAgICAgICAgICAgICAgICAgICAgICZzdGFydEFuZ2xlLAotCSAgICAgICAgICAgICAgICAgICAgICAmYXJjQW5nbGUpKQotCQlyZXR1cm4gTlVMTDsKLQlJbnZlcnRBcmMoJnIsCi0JICAgICAgICAgIHN0YXJ0QW5nbGUsCi0JICAgICAgICAgIGFyY0FuZ2xlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhcnRBbmdsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFyY0FuZ2xlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgSW52ZXJ0QXJjKCZyLAorICAgICAgICAgICAgICBzdGFydEFuZ2xlLAorICAgICAgICAgICAgICBhcmNBbmdsZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0ZpbGxBcmMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3QgcjsKLQlzaG9ydCBzdGFydEFuZ2xlOwotCXNob3J0IGFyY0FuZ2xlOwotCVBhdHRlcm4gKnBhdF9faW5fXzsKLQlpbnQgcGF0X19pbl9sZW5fXzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmVjdCByOworICAgIHNob3J0IHN0YXJ0QW5nbGU7CisgICAgc2hvcnQgYXJjQW5nbGU7CisgICAgUGF0dGVybiAqcGF0X19pbl9fOworICAgIGludCBwYXRfX2luX2xlbl9fOwogI2lmbmRlZiBGaWxsQXJjCi0JUHlNYWNfUFJFQ0hFQ0soRmlsbEFyYyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRmlsbEFyYyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhocyMiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmciwKLQkgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0QW5nbGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZhcmNBbmdsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKiopJnBhdF9faW5fXywgJnBhdF9faW5fbGVuX18pKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAocGF0X19pbl9sZW5fXyAhPSBzaXplb2YoUGF0dGVybikpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYnVmZmVyIGxlbmd0aCBzaG91bGQgYmUgc2l6ZW9mKFBhdHRlcm4pIik7Ci0JCWdvdG8gcGF0X19lcnJvcl9fOwotCX0KLQlGaWxsQXJjKCZyLAotCSAgICAgICAgc3RhcnRBbmdsZSwKLQkgICAgICAgIGFyY0FuZ2xlLAotCSAgICAgICAgcGF0X19pbl9fKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaHMjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGFydEFuZ2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYXJjQW5nbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICoqKSZwYXRfX2luX18sICZwYXRfX2luX2xlbl9fKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKHBhdF9faW5fbGVuX18gIT0gc2l6ZW9mKFBhdHRlcm4pKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImJ1ZmZlciBsZW5ndGggc2hvdWxkIGJlIHNpemVvZihQYXR0ZXJuKSIpOworICAgICAgICBnb3RvIHBhdF9fZXJyb3JfXzsKKyAgICB9CisgICAgRmlsbEFyYygmciwKKyAgICAgICAgc3RhcnRBbmdsZSwKKyAgICAgICAgYXJjQW5nbGUsCisgICAgICAgIHBhdF9faW5fXyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOwogIHBhdF9fZXJyb3JfXzogOwotCXJldHVybiBfcmVzOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX05ld1JnbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIF9ydjsKICNpZm5kZWYgTmV3UmduCi0JUHlNYWNfUFJFQ0hFQ0soTmV3UmduKTsKKyAgICBQeU1hY19QUkVDSEVDSyhOZXdSZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE5ld1JnbigpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTmV3UmduKCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX09wZW5SZ24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgT3BlblJnbgotCVB5TWFjX1BSRUNIRUNLKE9wZW5SZ24pOworICAgIFB5TWFjX1BSRUNIRUNLKE9wZW5SZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCU9wZW5SZ24oKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE9wZW5SZ24oKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfQ2xvc2VSZ24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJnbkhhbmRsZSBkc3RSZ247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSBkc3RSZ247CiAjaWZuZGVmIENsb3NlUmduCi0JUHlNYWNfUFJFQ0hFQ0soQ2xvc2VSZ24pOworICAgIFB5TWFjX1BSRUNIRUNLKENsb3NlUmduKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkc3RSZ24pKQotCQlyZXR1cm4gTlVMTDsKLQlDbG9zZVJnbihkc3RSZ24pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZHN0UmduKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ2xvc2VSZ24oZHN0UmduKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfQml0TWFwVG9SZWdpb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JUmduSGFuZGxlIHJlZ2lvbjsKLQlCaXRNYXBQdHIgYk1hcDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBSZ25IYW5kbGUgcmVnaW9uOworICAgIEJpdE1hcFB0ciBiTWFwOwogI2lmbmRlZiBCaXRNYXBUb1JlZ2lvbgotCVB5TWFjX1BSRUNIRUNLKEJpdE1hcFRvUmVnaW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhCaXRNYXBUb1JlZ2lvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZWdpb24sCi0JICAgICAgICAgICAgICAgICAgICAgIEJNT2JqX0NvbnZlcnQsICZiTWFwKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEJpdE1hcFRvUmVnaW9uKHJlZ2lvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgYk1hcCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmVnaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBCTU9ial9Db252ZXJ0LCAmYk1hcCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBCaXRNYXBUb1JlZ2lvbihyZWdpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJNYXApOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1JnblRvSGFuZGxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZ25IYW5kbGUgcmVnaW9uOwotCUhhbmRsZSBmbGF0dGVuZWRSZ25EYXRhSGRsOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZ25IYW5kbGUgcmVnaW9uOworICAgIEhhbmRsZSBmbGF0dGVuZWRSZ25EYXRhSGRsOwogI2lmbmRlZiBSZ25Ub0hhbmRsZQotCVB5TWFjX1BSRUNIRUNLKFJnblRvSGFuZGxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhSZ25Ub0hhbmRsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZWdpb24sCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZmxhdHRlbmVkUmduRGF0YUhkbCkpCi0JCXJldHVybiBOVUxMOwotCVJnblRvSGFuZGxlKHJlZ2lvbiwKLQkgICAgICAgICAgICBmbGF0dGVuZWRSZ25EYXRhSGRsKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmVnaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmZsYXR0ZW5lZFJnbkRhdGFIZGwpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBSZ25Ub0hhbmRsZShyZWdpb24sCisgICAgICAgICAgICAgICAgZmxhdHRlbmVkUmduRGF0YUhkbCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0Rpc3Bvc2VSZ24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJnbkhhbmRsZSByZ247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSByZ247CiAjaWZuZGVmIERpc3Bvc2VSZ24KLQlQeU1hY19QUkVDSEVDSyhEaXNwb3NlUmduKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEaXNwb3NlUmduKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZ24pKQotCQlyZXR1cm4gTlVMTDsKLQlEaXNwb3NlUmduKHJnbik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZ24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBEaXNwb3NlUmduKHJnbik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX01hY0NvcHlSZ24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJnbkhhbmRsZSBzcmNSZ247Ci0JUmduSGFuZGxlIGRzdFJnbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIHNyY1JnbjsKKyAgICBSZ25IYW5kbGUgZHN0UmduOwogI2lmbmRlZiBNYWNDb3B5UmduCi0JUHlNYWNfUFJFQ0hFQ0soTWFjQ29weVJnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWFjQ29weVJnbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzcmNSZ24sCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZHN0UmduKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTWFjQ29weVJnbihzcmNSZ24sCi0JICAgICAgICAgICBkc3RSZ24pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzcmNSZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZHN0UmduKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTWFjQ29weVJnbihzcmNSZ24sCisgICAgICAgICAgICAgICBkc3RSZ24pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9TZXRFbXB0eVJnbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIHJnbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIHJnbjsKICNpZm5kZWYgU2V0RW1wdHlSZ24KLQlQeU1hY19QUkVDSEVDSyhTZXRFbXB0eVJnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0RW1wdHlSZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbikpCi0JCXJldHVybiBOVUxMOwotCVNldEVtcHR5UmduKHJnbik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZ24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRFbXB0eVJnbihyZ24pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9NYWNTZXRSZWN0UmduKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZ25IYW5kbGUgcmduOwotCXNob3J0IGxlZnQ7Ci0Jc2hvcnQgdG9wOwotCXNob3J0IHJpZ2h0OwotCXNob3J0IGJvdHRvbTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIHJnbjsKKyAgICBzaG9ydCBsZWZ0OworICAgIHNob3J0IHRvcDsKKyAgICBzaG9ydCByaWdodDsKKyAgICBzaG9ydCBib3R0b207CiAjaWZuZGVmIE1hY1NldFJlY3RSZ24KLQlQeU1hY19QUkVDSEVDSyhNYWNTZXRSZWN0UmduKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNYWNTZXRSZWN0UmduKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGhoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmduLAotCSAgICAgICAgICAgICAgICAgICAgICAmbGVmdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRvcCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJpZ2h0LAotCSAgICAgICAgICAgICAgICAgICAgICAmYm90dG9tKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTWFjU2V0UmVjdFJnbihyZ24sCi0JICAgICAgICAgICAgICBsZWZ0LAotCSAgICAgICAgICAgICAgdG9wLAotCSAgICAgICAgICAgICAgcmlnaHQsCi0JICAgICAgICAgICAgICBib3R0b20pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdHRvbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE1hY1NldFJlY3RSZ24ocmduLAorICAgICAgICAgICAgICAgICAgbGVmdCwKKyAgICAgICAgICAgICAgICAgIHRvcCwKKyAgICAgICAgICAgICAgICAgIHJpZ2h0LAorICAgICAgICAgICAgICAgICAgYm90dG9tKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfUmVjdFJnbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIHJnbjsKLQlSZWN0IHI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSByZ247CisgICAgUmVjdCByOwogI2lmbmRlZiBSZWN0UmduCi0JUHlNYWNfUFJFQ0hFQ0soUmVjdFJnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soUmVjdFJnbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZ24sCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JUmVjdFJnbihyZ24sCi0JICAgICAgICAmcik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBSZWN0UmduKHJnbiwKKyAgICAgICAgJnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9NYWNPZmZzZXRSZ24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJnbkhhbmRsZSByZ247Ci0Jc2hvcnQgZGg7Ci0Jc2hvcnQgZHY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSByZ247CisgICAgc2hvcnQgZGg7CisgICAgc2hvcnQgZHY7CiAjaWZuZGVmIE1hY09mZnNldFJnbgotCVB5TWFjX1BSRUNIRUNLKE1hY09mZnNldFJnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWFjT2Zmc2V0UmduKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGgiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRoLAotCSAgICAgICAgICAgICAgICAgICAgICAmZHYpKQotCQlyZXR1cm4gTlVMTDsKLQlNYWNPZmZzZXRSZ24ocmduLAotCSAgICAgICAgICAgICBkaCwKLQkgICAgICAgICAgICAgZHYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmR2KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTWFjT2Zmc2V0UmduKHJnbiwKKyAgICAgICAgICAgICAgICAgZGgsCisgICAgICAgICAgICAgICAgIGR2KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfSW5zZXRSZ24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJnbkhhbmRsZSByZ247Ci0Jc2hvcnQgZGg7Ci0Jc2hvcnQgZHY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSByZ247CisgICAgc2hvcnQgZGg7CisgICAgc2hvcnQgZHY7CiAjaWZuZGVmIEluc2V0UmduCi0JUHlNYWNfUFJFQ0hFQ0soSW5zZXRSZ24pOworICAgIFB5TWFjX1BSRUNIRUNLKEluc2V0UmduKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGgiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRoLAotCSAgICAgICAgICAgICAgICAgICAgICAmZHYpKQotCQlyZXR1cm4gTlVMTDsKLQlJbnNldFJnbihyZ24sCi0JICAgICAgICAgZGgsCi0JICAgICAgICAgZHYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmR2KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgSW5zZXRSZ24ocmduLAorICAgICAgICAgICAgIGRoLAorICAgICAgICAgICAgIGR2KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfU2VjdFJnbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIHNyY1JnbkE7Ci0JUmduSGFuZGxlIHNyY1JnbkI7Ci0JUmduSGFuZGxlIGRzdFJnbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIHNyY1JnbkE7CisgICAgUmduSGFuZGxlIHNyY1JnbkI7CisgICAgUmduSGFuZGxlIGRzdFJnbjsKICNpZm5kZWYgU2VjdFJnbgotCVB5TWFjX1BSRUNIRUNLKFNlY3RSZ24pOworICAgIFB5TWFjX1BSRUNIRUNLKFNlY3RSZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzcmNSZ25BLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNyY1JnbkIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZHN0UmduKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2VjdFJnbihzcmNSZ25BLAotCSAgICAgICAgc3JjUmduQiwKLQkgICAgICAgIGRzdFJnbik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc3JjUmduQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzcmNSZ25CLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRzdFJnbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNlY3RSZ24oc3JjUmduQSwKKyAgICAgICAgc3JjUmduQiwKKyAgICAgICAgZHN0UmduKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfTWFjVW5pb25SZ24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJnbkhhbmRsZSBzcmNSZ25BOwotCVJnbkhhbmRsZSBzcmNSZ25COwotCVJnbkhhbmRsZSBkc3RSZ247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSBzcmNSZ25BOworICAgIFJnbkhhbmRsZSBzcmNSZ25COworICAgIFJnbkhhbmRsZSBkc3RSZ247CiAjaWZuZGVmIE1hY1VuaW9uUmduCi0JUHlNYWNfUFJFQ0hFQ0soTWFjVW5pb25SZ24pOworICAgIFB5TWFjX1BSRUNIRUNLKE1hY1VuaW9uUmduKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc3JjUmduQSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzcmNSZ25CLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRzdFJnbikpCi0JCXJldHVybiBOVUxMOwotCU1hY1VuaW9uUmduKHNyY1JnbkEsCi0JICAgICAgICAgICAgc3JjUmduQiwKLQkgICAgICAgICAgICBkc3RSZ24pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNyY1JnbkEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc3JjUmduQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkc3RSZ24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNYWNVbmlvblJnbihzcmNSZ25BLAorICAgICAgICAgICAgICAgIHNyY1JnbkIsCisgICAgICAgICAgICAgICAgZHN0UmduKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfRGlmZlJnbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIHNyY1JnbkE7Ci0JUmduSGFuZGxlIHNyY1JnbkI7Ci0JUmduSGFuZGxlIGRzdFJnbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIHNyY1JnbkE7CisgICAgUmduSGFuZGxlIHNyY1JnbkI7CisgICAgUmduSGFuZGxlIGRzdFJnbjsKICNpZm5kZWYgRGlmZlJnbgotCVB5TWFjX1BSRUNIRUNLKERpZmZSZ24pOworICAgIFB5TWFjX1BSRUNIRUNLKERpZmZSZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzcmNSZ25BLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNyY1JnbkIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZHN0UmduKSkKLQkJcmV0dXJuIE5VTEw7Ci0JRGlmZlJnbihzcmNSZ25BLAotCSAgICAgICAgc3JjUmduQiwKLQkgICAgICAgIGRzdFJnbik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc3JjUmduQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzcmNSZ25CLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRzdFJnbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIERpZmZSZ24oc3JjUmduQSwKKyAgICAgICAgc3JjUmduQiwKKyAgICAgICAgZHN0UmduKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfTWFjWG9yUmduKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZ25IYW5kbGUgc3JjUmduQTsKLQlSZ25IYW5kbGUgc3JjUmduQjsKLQlSZ25IYW5kbGUgZHN0UmduOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZ25IYW5kbGUgc3JjUmduQTsKKyAgICBSZ25IYW5kbGUgc3JjUmduQjsKKyAgICBSZ25IYW5kbGUgZHN0UmduOwogI2lmbmRlZiBNYWNYb3JSZ24KLQlQeU1hY19QUkVDSEVDSyhNYWNYb3JSZ24pOworICAgIFB5TWFjX1BSRUNIRUNLKE1hY1hvclJnbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNyY1JnbkEsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc3JjUmduQiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkc3RSZ24pKQotCQlyZXR1cm4gTlVMTDsKLQlNYWNYb3JSZ24oc3JjUmduQSwKLQkgICAgICAgICAgc3JjUmduQiwKLQkgICAgICAgICAgZHN0UmduKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzcmNSZ25BLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNyY1JnbkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZHN0UmduKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTWFjWG9yUmduKHNyY1JnbkEsCisgICAgICAgICAgICAgIHNyY1JnbkIsCisgICAgICAgICAgICAgIGRzdFJnbik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1JlY3RJblJnbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JUmVjdCByOwotCVJnbkhhbmRsZSByZ247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIFJlY3QgcjsKKyAgICBSZ25IYW5kbGUgcmduOwogI2lmbmRlZiBSZWN0SW5SZ24KLQlQeU1hY19QUkVDSEVDSyhSZWN0SW5SZ24pOworICAgIFB5TWFjX1BSRUNIRUNLKFJlY3RJblJnbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmduKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gUmVjdEluUmduKCZyLAotCSAgICAgICAgICAgICAgICByZ24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZ24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBSZWN0SW5SZ24oJnIsCisgICAgICAgICAgICAgICAgICAgIHJnbik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfTWFjRXF1YWxSZ24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCVJnbkhhbmRsZSByZ25BOwotCVJnbkhhbmRsZSByZ25COworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBSZ25IYW5kbGUgcmduQTsKKyAgICBSZ25IYW5kbGUgcmduQjsKICNpZm5kZWYgTWFjRXF1YWxSZ24KLQlQeU1hY19QUkVDSEVDSyhNYWNFcXVhbFJnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWFjRXF1YWxSZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmduQSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZ25CKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWFjRXF1YWxSZ24ocmduQSwKLQkgICAgICAgICAgICAgICAgICByZ25CKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZ25BLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbkIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNYWNFcXVhbFJnbihyZ25BLAorICAgICAgICAgICAgICAgICAgICAgIHJnbkIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0VtcHR5UmduKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlSZ25IYW5kbGUgcmduOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBSZ25IYW5kbGUgcmduOwogI2lmbmRlZiBFbXB0eVJnbgotCVB5TWFjX1BSRUNIRUNLKEVtcHR5UmduKTsKKyAgICBQeU1hY19QUkVDSEVDSyhFbXB0eVJnbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmduKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRW1wdHlSZ24ocmduKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmduKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRW1wdHlSZ24ocmduKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9NYWNGcmFtZVJnbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIHJnbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIHJnbjsKICNpZm5kZWYgTWFjRnJhbWVSZ24KLQlQeU1hY19QUkVDSEVDSyhNYWNGcmFtZVJnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWFjRnJhbWVSZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbikpCi0JCXJldHVybiBOVUxMOwotCU1hY0ZyYW1lUmduKHJnbik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZ24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNYWNGcmFtZVJnbihyZ24pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9NYWNQYWludFJnbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIHJnbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIHJnbjsKICNpZm5kZWYgTWFjUGFpbnRSZ24KLQlQeU1hY19QUkVDSEVDSyhNYWNQYWludFJnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWFjUGFpbnRSZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbikpCi0JCXJldHVybiBOVUxMOwotCU1hY1BhaW50UmduKHJnbik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZ24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNYWNQYWludFJnbihyZ24pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9FcmFzZVJnbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIHJnbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIHJnbjsKICNpZm5kZWYgRXJhc2VSZ24KLQlQeU1hY19QUkVDSEVDSyhFcmFzZVJnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soRXJhc2VSZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbikpCi0JCXJldHVybiBOVUxMOwotCUVyYXNlUmduKHJnbik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZ24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBFcmFzZVJnbihyZ24pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9NYWNJbnZlcnRSZ24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJnbkhhbmRsZSByZ247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSByZ247CiAjaWZuZGVmIE1hY0ludmVydFJnbgotCVB5TWFjX1BSRUNIRUNLKE1hY0ludmVydFJnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWFjSW52ZXJ0UmduKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZ24pKQotCQlyZXR1cm4gTlVMTDsKLQlNYWNJbnZlcnRSZ24ocmduKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE1hY0ludmVydFJnbihyZ24pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9NYWNGaWxsUmduKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZ25IYW5kbGUgcmduOwotCVBhdHRlcm4gKnBhdF9faW5fXzsKLQlpbnQgcGF0X19pbl9sZW5fXzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIHJnbjsKKyAgICBQYXR0ZXJuICpwYXRfX2luX187CisgICAgaW50IHBhdF9faW5fbGVuX187CiAjaWZuZGVmIE1hY0ZpbGxSZ24KLQlQeU1hY19QUkVDSEVDSyhNYWNGaWxsUmduKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNYWNGaWxsUmduKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyMiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbiwKLQkgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKiopJnBhdF9faW5fXywgJnBhdF9faW5fbGVuX18pKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAocGF0X19pbl9sZW5fXyAhPSBzaXplb2YoUGF0dGVybikpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYnVmZmVyIGxlbmd0aCBzaG91bGQgYmUgc2l6ZW9mKFBhdHRlcm4pIik7Ci0JCWdvdG8gcGF0X19lcnJvcl9fOwotCX0KLQlNYWNGaWxsUmduKHJnbiwKLQkgICAgICAgICAgIHBhdF9faW5fXyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKiopJnBhdF9faW5fXywgJnBhdF9faW5fbGVuX18pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAocGF0X19pbl9sZW5fXyAhPSBzaXplb2YoUGF0dGVybikpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYnVmZmVyIGxlbmd0aCBzaG91bGQgYmUgc2l6ZW9mKFBhdHRlcm4pIik7CisgICAgICAgIGdvdG8gcGF0X19lcnJvcl9fOworICAgIH0KKyAgICBNYWNGaWxsUmduKHJnbiwKKyAgICAgICAgICAgICAgIHBhdF9faW5fXyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOwogIHBhdF9fZXJyb3JfXzogOwotCXJldHVybiBfcmVzOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1Njcm9sbFJlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3QgcjsKLQlzaG9ydCBkaDsKLQlzaG9ydCBkdjsKLQlSZ25IYW5kbGUgdXBkYXRlUmduOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IHI7CisgICAgc2hvcnQgZGg7CisgICAgc2hvcnQgZHY7CisgICAgUmduSGFuZGxlIHVwZGF0ZVJnbjsKICNpZm5kZWYgU2Nyb2xsUmVjdAotCVB5TWFjX1BSRUNIRUNLKFNjcm9sbFJlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKFNjcm9sbFJlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIsCi0JICAgICAgICAgICAgICAgICAgICAgICZkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmR2LAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnVwZGF0ZVJnbikpCi0JCXJldHVybiBOVUxMOwotCVNjcm9sbFJlY3QoJnIsCi0JICAgICAgICAgICBkaCwKLQkgICAgICAgICAgIGR2LAotCSAgICAgICAgICAgdXBkYXRlUmduKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmR2LAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnVwZGF0ZVJnbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNjcm9sbFJlY3QoJnIsCisgICAgICAgICAgICAgICBkaCwKKyAgICAgICAgICAgICAgIGR2LAorICAgICAgICAgICAgICAgdXBkYXRlUmduKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfQ29weUJpdHMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJpdE1hcFB0ciBzcmNCaXRzOwotCUJpdE1hcFB0ciBkc3RCaXRzOwotCVJlY3Qgc3JjUmVjdDsKLQlSZWN0IGRzdFJlY3Q7Ci0Jc2hvcnQgbW9kZTsKLQlSZ25IYW5kbGUgbWFza1JnbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQml0TWFwUHRyIHNyY0JpdHM7CisgICAgQml0TWFwUHRyIGRzdEJpdHM7CisgICAgUmVjdCBzcmNSZWN0OworICAgIFJlY3QgZHN0UmVjdDsKKyAgICBzaG9ydCBtb2RlOworICAgIFJnbkhhbmRsZSBtYXNrUmduOwogI2lmbmRlZiBDb3B5Qml0cwotCVB5TWFjX1BSRUNIRUNLKENvcHlCaXRzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb3B5Qml0cyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJmhPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIEJNT2JqX0NvbnZlcnQsICZzcmNCaXRzLAotCSAgICAgICAgICAgICAgICAgICAgICBCTU9ial9Db252ZXJ0LCAmZHN0Qml0cywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnNyY1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZkc3RSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmbW9kZSwKLQkgICAgICAgICAgICAgICAgICAgICAgT3B0UmVzT2JqX0NvbnZlcnQsICZtYXNrUmduKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ29weUJpdHMoc3JjQml0cywKLQkgICAgICAgICBkc3RCaXRzLAotCSAgICAgICAgICZzcmNSZWN0LAotCSAgICAgICAgICZkc3RSZWN0LAotCSAgICAgICAgIG1vZGUsCi0JICAgICAgICAgbWFza1Jnbik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJk8maE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQk1PYmpfQ29udmVydCwgJnNyY0JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEJNT2JqX0NvbnZlcnQsICZkc3RCaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmc3JjUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmRzdFJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfQ29udmVydCwgJm1hc2tSZ24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDb3B5Qml0cyhzcmNCaXRzLAorICAgICAgICAgICAgIGRzdEJpdHMsCisgICAgICAgICAgICAgJnNyY1JlY3QsCisgICAgICAgICAgICAgJmRzdFJlY3QsCisgICAgICAgICAgICAgbW9kZSwKKyAgICAgICAgICAgICBtYXNrUmduKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfQ29weU1hc2soUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJpdE1hcFB0ciBzcmNCaXRzOwotCUJpdE1hcFB0ciBtYXNrQml0czsKLQlCaXRNYXBQdHIgZHN0Qml0czsKLQlSZWN0IHNyY1JlY3Q7Ci0JUmVjdCBtYXNrUmVjdDsKLQlSZWN0IGRzdFJlY3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJpdE1hcFB0ciBzcmNCaXRzOworICAgIEJpdE1hcFB0ciBtYXNrQml0czsKKyAgICBCaXRNYXBQdHIgZHN0Qml0czsKKyAgICBSZWN0IHNyY1JlY3Q7CisgICAgUmVjdCBtYXNrUmVjdDsKKyAgICBSZWN0IGRzdFJlY3Q7CiAjaWZuZGVmIENvcHlNYXNrCi0JUHlNYWNfUFJFQ0hFQ0soQ29weU1hc2spOworICAgIFB5TWFjX1BSRUNIRUNLKENvcHlNYXNrKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIEJNT2JqX0NvbnZlcnQsICZzcmNCaXRzLAotCSAgICAgICAgICAgICAgICAgICAgICBCTU9ial9Db252ZXJ0LCAmbWFza0JpdHMsCi0JICAgICAgICAgICAgICAgICAgICAgIEJNT2JqX0NvbnZlcnQsICZkc3RCaXRzLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmc3JjUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJm1hc2tSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmZHN0UmVjdCkpCi0JCXJldHVybiBOVUxMOwotCUNvcHlNYXNrKHNyY0JpdHMsCi0JICAgICAgICAgbWFza0JpdHMsCi0JICAgICAgICAgZHN0Qml0cywKLQkgICAgICAgICAmc3JjUmVjdCwKLQkgICAgICAgICAmbWFza1JlY3QsCi0JICAgICAgICAgJmRzdFJlY3QpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBCTU9ial9Db252ZXJ0LCAmc3JjQml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQk1PYmpfQ29udmVydCwgJm1hc2tCaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBCTU9ial9Db252ZXJ0LCAmZHN0Qml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnNyY1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZtYXNrUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmRzdFJlY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDb3B5TWFzayhzcmNCaXRzLAorICAgICAgICAgICAgIG1hc2tCaXRzLAorICAgICAgICAgICAgIGRzdEJpdHMsCisgICAgICAgICAgICAgJnNyY1JlY3QsCisgICAgICAgICAgICAgJm1hc2tSZWN0LAorICAgICAgICAgICAgICZkc3RSZWN0KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfT3BlblBpY3R1cmUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBpY0hhbmRsZSBfcnY7Ci0JUmVjdCBwaWNGcmFtZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUGljSGFuZGxlIF9ydjsKKyAgICBSZWN0IHBpY0ZyYW1lOwogI2lmbmRlZiBPcGVuUGljdHVyZQotCVB5TWFjX1BSRUNIRUNLKE9wZW5QaWN0dXJlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhPcGVuUGljdHVyZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZwaWNGcmFtZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE9wZW5QaWN0dXJlKCZwaWNGcmFtZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnBpY0ZyYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gT3BlblBpY3R1cmUoJnBpY0ZyYW1lKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfUGljQ29tbWVudChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQga2luZDsKLQlzaG9ydCBkYXRhU2l6ZTsKLQlIYW5kbGUgZGF0YUhhbmRsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQga2luZDsKKyAgICBzaG9ydCBkYXRhU2l6ZTsKKyAgICBIYW5kbGUgZGF0YUhhbmRsZTsKICNpZm5kZWYgUGljQ29tbWVudAotCVB5TWFjX1BSRUNIRUNLKFBpY0NvbW1lbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKFBpY0NvbW1lbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGhPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZraW5kLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGF0YVNpemUsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YUhhbmRsZSkpCi0JCXJldHVybiBOVUxMOwotCVBpY0NvbW1lbnQoa2luZCwKLQkgICAgICAgICAgIGRhdGFTaXplLAotCSAgICAgICAgICAgZGF0YUhhbmRsZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAma2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFIYW5kbGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQaWNDb21tZW50KGtpbmQsCisgICAgICAgICAgICAgICBkYXRhU2l6ZSwKKyAgICAgICAgICAgICAgIGRhdGFIYW5kbGUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9DbG9zZVBpY3R1cmUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgQ2xvc2VQaWN0dXJlCi0JUHlNYWNfUFJFQ0hFQ0soQ2xvc2VQaWN0dXJlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDbG9zZVBpY3R1cmUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUNsb3NlUGljdHVyZSgpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ2xvc2VQaWN0dXJlKCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0RyYXdQaWN0dXJlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQaWNIYW5kbGUgbXlQaWN0dXJlOwotCVJlY3QgZHN0UmVjdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUGljSGFuZGxlIG15UGljdHVyZTsKKyAgICBSZWN0IGRzdFJlY3Q7CiAjaWZuZGVmIERyYXdQaWN0dXJlCi0JUHlNYWNfUFJFQ0hFQ0soRHJhd1BpY3R1cmUpOworICAgIFB5TWFjX1BSRUNIRUNLKERyYXdQaWN0dXJlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJm15UGljdHVyZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmRzdFJlY3QpKQotCQlyZXR1cm4gTlVMTDsKLQlEcmF3UGljdHVyZShteVBpY3R1cmUsCi0JICAgICAgICAgICAgJmRzdFJlY3QpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZteVBpY3R1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZkc3RSZWN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgRHJhd1BpY3R1cmUobXlQaWN0dXJlLAorICAgICAgICAgICAgICAgICZkc3RSZWN0KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfS2lsbFBpY3R1cmUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBpY0hhbmRsZSBteVBpY3R1cmU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBpY0hhbmRsZSBteVBpY3R1cmU7CiAjaWZuZGVmIEtpbGxQaWN0dXJlCi0JUHlNYWNfUFJFQ0hFQ0soS2lsbFBpY3R1cmUpOworICAgIFB5TWFjX1BSRUNIRUNLKEtpbGxQaWN0dXJlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZteVBpY3R1cmUpKQotCQlyZXR1cm4gTlVMTDsKLQlLaWxsUGljdHVyZShteVBpY3R1cmUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmbXlQaWN0dXJlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgS2lsbFBpY3R1cmUobXlQaWN0dXJlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfT3BlblBvbHkoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBvbHlIYW5kbGUgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQb2x5SGFuZGxlIF9ydjsKICNpZm5kZWYgT3BlblBvbHkKLQlQeU1hY19QUkVDSEVDSyhPcGVuUG9seSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soT3BlblBvbHkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE9wZW5Qb2x5KCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBPcGVuUG9seSgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9DbG9zZVBvbHkoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgQ2xvc2VQb2x5Ci0JUHlNYWNfUFJFQ0hFQ0soQ2xvc2VQb2x5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhDbG9zZVBvbHkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUNsb3NlUG9seSgpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ2xvc2VQb2x5KCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0tpbGxQb2x5KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQb2x5SGFuZGxlIHBvbHk7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBvbHlIYW5kbGUgcG9seTsKICNpZm5kZWYgS2lsbFBvbHkKLQlQeU1hY19QUkVDSEVDSyhLaWxsUG9seSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soS2lsbFBvbHkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBvbHkpKQotCQlyZXR1cm4gTlVMTDsKLQlLaWxsUG9seShwb2x5KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBvbHkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBLaWxsUG9seShwb2x5KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfT2Zmc2V0UG9seShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUG9seUhhbmRsZSBwb2x5OwotCXNob3J0IGRoOwotCXNob3J0IGR2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQb2x5SGFuZGxlIHBvbHk7CisgICAgc2hvcnQgZGg7CisgICAgc2hvcnQgZHY7CiAjaWZuZGVmIE9mZnNldFBvbHkKLQlQeU1hY19QUkVDSEVDSyhPZmZzZXRQb2x5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhPZmZzZXRQb2x5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGgiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBvbHksCi0JICAgICAgICAgICAgICAgICAgICAgICZkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmR2KSkKLQkJcmV0dXJuIE5VTEw7Ci0JT2Zmc2V0UG9seShwb2x5LAotCSAgICAgICAgICAgZGgsCi0JICAgICAgICAgICBkdik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBvbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmR2KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgT2Zmc2V0UG9seShwb2x5LAorICAgICAgICAgICAgICAgZGgsCisgICAgICAgICAgICAgICBkdik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0ZyYW1lUG9seShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUG9seUhhbmRsZSBwb2x5OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQb2x5SGFuZGxlIHBvbHk7CiAjaWZuZGVmIEZyYW1lUG9seQotCVB5TWFjX1BSRUNIRUNLKEZyYW1lUG9seSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRnJhbWVQb2x5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwb2x5KSkKLQkJcmV0dXJuIE5VTEw7Ci0JRnJhbWVQb2x5KHBvbHkpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcG9seSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEZyYW1lUG9seShwb2x5KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfUGFpbnRQb2x5KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQb2x5SGFuZGxlIHBvbHk7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBvbHlIYW5kbGUgcG9seTsKICNpZm5kZWYgUGFpbnRQb2x5Ci0JUHlNYWNfUFJFQ0hFQ0soUGFpbnRQb2x5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhQYWludFBvbHkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBvbHkpKQotCQlyZXR1cm4gTlVMTDsKLQlQYWludFBvbHkocG9seSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwb2x5KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUGFpbnRQb2x5KHBvbHkpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9FcmFzZVBvbHkoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBvbHlIYW5kbGUgcG9seTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUG9seUhhbmRsZSBwb2x5OwogI2lmbmRlZiBFcmFzZVBvbHkKLQlQeU1hY19QUkVDSEVDSyhFcmFzZVBvbHkpOworICAgIFB5TWFjX1BSRUNIRUNLKEVyYXNlUG9seSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcG9seSkpCi0JCXJldHVybiBOVUxMOwotCUVyYXNlUG9seShwb2x5KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBvbHkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBFcmFzZVBvbHkocG9seSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0ludmVydFBvbHkoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBvbHlIYW5kbGUgcG9seTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUG9seUhhbmRsZSBwb2x5OwogI2lmbmRlZiBJbnZlcnRQb2x5Ci0JUHlNYWNfUFJFQ0hFQ0soSW52ZXJ0UG9seSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSW52ZXJ0UG9seSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcG9seSkpCi0JCXJldHVybiBOVUxMOwotCUludmVydFBvbHkocG9seSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwb2x5KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgSW52ZXJ0UG9seShwb2x5KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfRmlsbFBvbHkoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBvbHlIYW5kbGUgcG9seTsKLQlQYXR0ZXJuICpwYXRfX2luX187Ci0JaW50IHBhdF9faW5fbGVuX187CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBvbHlIYW5kbGUgcG9seTsKKyAgICBQYXR0ZXJuICpwYXRfX2luX187CisgICAgaW50IHBhdF9faW5fbGVuX187CiAjaWZuZGVmIEZpbGxQb2x5Ci0JUHlNYWNfUFJFQ0hFQ0soRmlsbFBvbHkpOworICAgIFB5TWFjX1BSRUNIRUNLKEZpbGxQb2x5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyMiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBvbHksCi0JICAgICAgICAgICAgICAgICAgICAgIChjaGFyICoqKSZwYXRfX2luX18sICZwYXRfX2luX2xlbl9fKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKHBhdF9faW5fbGVuX18gIT0gc2l6ZW9mKFBhdHRlcm4pKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImJ1ZmZlciBsZW5ndGggc2hvdWxkIGJlIHNpemVvZihQYXR0ZXJuKSIpOwotCQlnb3RvIHBhdF9fZXJyb3JfXzsKLQl9Ci0JRmlsbFBvbHkocG9seSwKLQkgICAgICAgICBwYXRfX2luX18pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnMjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwb2x5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKikmcGF0X19pbl9fLCAmcGF0X19pbl9sZW5fXykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChwYXRfX2luX2xlbl9fICE9IHNpemVvZihQYXR0ZXJuKSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJidWZmZXIgbGVuZ3RoIHNob3VsZCBiZSBzaXplb2YoUGF0dGVybikiKTsKKyAgICAgICAgZ290byBwYXRfX2Vycm9yX187CisgICAgfQorICAgIEZpbGxQb2x5KHBvbHksCisgICAgICAgICAgICAgcGF0X19pbl9fKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CiAgcGF0X19lcnJvcl9fOiA7Ci0JcmV0dXJuIF9yZXM7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfU2V0UHQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBvaW50IHB0OwotCXNob3J0IGg7Ci0Jc2hvcnQgdjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUG9pbnQgcHQ7CisgICAgc2hvcnQgaDsKKyAgICBzaG9ydCB2OwogI2lmbmRlZiBTZXRQdAotCVB5TWFjX1BSRUNIRUNLKFNldFB0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRQdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZoLAotCSAgICAgICAgICAgICAgICAgICAgICAmdikpCi0JCXJldHVybiBOVUxMOwotCVNldFB0KCZwdCwKLQkgICAgICBoLAotCSAgICAgIHYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRQb2ludCwgcHQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0UHQoJnB0LAorICAgICAgICAgIGgsCisgICAgICAgICAgdik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFBvaW50LCBwdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfTG9jYWxUb0dsb2JhbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUG9pbnQgcHQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBvaW50IHB0OwogI2lmbmRlZiBMb2NhbFRvR2xvYmFsCi0JUHlNYWNfUFJFQ0hFQ0soTG9jYWxUb0dsb2JhbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTG9jYWxUb0dsb2JhbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmcHQpKQotCQlyZXR1cm4gTlVMTDsKLQlMb2NhbFRvR2xvYmFsKCZwdCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFBvaW50LCBwdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnB0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTG9jYWxUb0dsb2JhbCgmcHQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRQb2ludCwgcHQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0dsb2JhbFRvTG9jYWwoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBvaW50IHB0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQb2ludCBwdDsKICNpZm5kZWYgR2xvYmFsVG9Mb2NhbAotCVB5TWFjX1BSRUNIRUNLKEdsb2JhbFRvTG9jYWwpOworICAgIFB5TWFjX1BSRUNIRUNLKEdsb2JhbFRvTG9jYWwpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnB0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2xvYmFsVG9Mb2NhbCgmcHQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRQb2ludCwgcHQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZwdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdsb2JhbFRvTG9jYWwoJnB0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUG9pbnQsIHB0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9SYW5kb20oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgX3J2OwogI2lmbmRlZiBSYW5kb20KLQlQeU1hY19QUkVDSEVDSyhSYW5kb20pOworICAgIFB5TWFjX1BSRUNIRUNLKFJhbmRvbSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gUmFuZG9tKCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFJhbmRvbSgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX01hY0dldFBpeGVsKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlzaG9ydCBoOwotCXNob3J0IHY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIHNob3J0IGg7CisgICAgc2hvcnQgdjsKICNpZm5kZWYgTWFjR2V0UGl4ZWwKLQlQeU1hY19QUkVDSEVDSyhNYWNHZXRQaXhlbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWFjR2V0UGl4ZWwpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnYpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNYWNHZXRQaXhlbChoLAotCSAgICAgICAgICAgICAgICAgIHYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWFjR2V0UGl4ZWwoaCwKKyAgICAgICAgICAgICAgICAgICAgICB2KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9TY2FsZVB0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQb2ludCBwdDsKLQlSZWN0IHNyY1JlY3Q7Ci0JUmVjdCBkc3RSZWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQb2ludCBwdDsKKyAgICBSZWN0IHNyY1JlY3Q7CisgICAgUmVjdCBkc3RSZWN0OwogI2lmbmRlZiBTY2FsZVB0Ci0JUHlNYWNfUFJFQ0hFQ0soU2NhbGVQdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2NhbGVQdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnB0LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmc3JjUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmRzdFJlY3QpKQotCQlyZXR1cm4gTlVMTDsKLQlTY2FsZVB0KCZwdCwKLQkgICAgICAgICZzcmNSZWN0LAotCSAgICAgICAgJmRzdFJlY3QpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRQb2ludCwgcHQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmcHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZzcmNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmZHN0UmVjdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNjYWxlUHQoJnB0LAorICAgICAgICAmc3JjUmVjdCwKKyAgICAgICAgJmRzdFJlY3QpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRQb2ludCwgcHQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX01hcFB0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQb2ludCBwdDsKLQlSZWN0IHNyY1JlY3Q7Ci0JUmVjdCBkc3RSZWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQb2ludCBwdDsKKyAgICBSZWN0IHNyY1JlY3Q7CisgICAgUmVjdCBkc3RSZWN0OwogI2lmbmRlZiBNYXBQdAotCVB5TWFjX1BSRUNIRUNLKE1hcFB0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhNYXBQdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnB0LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmc3JjUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmRzdFJlY3QpKQotCQlyZXR1cm4gTlVMTDsKLQlNYXBQdCgmcHQsCi0JICAgICAgJnNyY1JlY3QsCi0JICAgICAgJmRzdFJlY3QpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRQb2ludCwgcHQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmcHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZzcmNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmZHN0UmVjdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE1hcFB0KCZwdCwKKyAgICAgICAgICAmc3JjUmVjdCwKKyAgICAgICAgICAmZHN0UmVjdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFBvaW50LCBwdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfTWFwUmVjdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVjdCByOwotCVJlY3Qgc3JjUmVjdDsKLQlSZWN0IGRzdFJlY3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlY3QgcjsKKyAgICBSZWN0IHNyY1JlY3Q7CisgICAgUmVjdCBkc3RSZWN0OwogI2lmbmRlZiBNYXBSZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soTWFwUmVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWFwUmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmciwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnNyY1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZkc3RSZWN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JTWFwUmVjdCgmciwKLQkgICAgICAgICZzcmNSZWN0LAotCSAgICAgICAgJmRzdFJlY3QpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmcik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZzcmNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmZHN0UmVjdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE1hcFJlY3QoJnIsCisgICAgICAgICZzcmNSZWN0LAorICAgICAgICAmZHN0UmVjdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZyKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9NYXBSZ24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJnbkhhbmRsZSByZ247Ci0JUmVjdCBzcmNSZWN0OwotCVJlY3QgZHN0UmVjdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIHJnbjsKKyAgICBSZWN0IHNyY1JlY3Q7CisgICAgUmVjdCBkc3RSZWN0OwogI2lmbmRlZiBNYXBSZ24KLQlQeU1hY19QUkVDSEVDSyhNYXBSZ24pOworICAgIFB5TWFjX1BSRUNIRUNLKE1hcFJnbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnNyY1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZkc3RSZWN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JTWFwUmduKHJnbiwKLQkgICAgICAgJnNyY1JlY3QsCi0JICAgICAgICZkc3RSZWN0KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZzcmNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmZHN0UmVjdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE1hcFJnbihyZ24sCisgICAgICAgICAgICZzcmNSZWN0LAorICAgICAgICAgICAmZHN0UmVjdCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX01hcFBvbHkoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBvbHlIYW5kbGUgcG9seTsKLQlSZWN0IHNyY1JlY3Q7Ci0JUmVjdCBkc3RSZWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQb2x5SGFuZGxlIHBvbHk7CisgICAgUmVjdCBzcmNSZWN0OworICAgIFJlY3QgZHN0UmVjdDsKICNpZm5kZWYgTWFwUG9seQotCVB5TWFjX1BSRUNIRUNLKE1hcFBvbHkpOworICAgIFB5TWFjX1BSRUNIRUNLKE1hcFBvbHkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwb2x5LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmc3JjUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmRzdFJlY3QpKQotCQlyZXR1cm4gTlVMTDsKLQlNYXBQb2x5KHBvbHksCi0JICAgICAgICAmc3JjUmVjdCwKLQkgICAgICAgICZkc3RSZWN0KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwb2x5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmc3JjUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmRzdFJlY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNYXBQb2x5KHBvbHksCisgICAgICAgICZzcmNSZWN0LAorICAgICAgICAmZHN0UmVjdCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1N0ZEJpdHMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJpdE1hcFB0ciBzcmNCaXRzOwotCVJlY3Qgc3JjUmVjdDsKLQlSZWN0IGRzdFJlY3Q7Ci0Jc2hvcnQgbW9kZTsKLQlSZ25IYW5kbGUgbWFza1JnbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQml0TWFwUHRyIHNyY0JpdHM7CisgICAgUmVjdCBzcmNSZWN0OworICAgIFJlY3QgZHN0UmVjdDsKKyAgICBzaG9ydCBtb2RlOworICAgIFJnbkhhbmRsZSBtYXNrUmduOwogI2lmbmRlZiBTdGRCaXRzCi0JUHlNYWNfUFJFQ0hFQ0soU3RkQml0cyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU3RkQml0cyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZoTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBCTU9ial9Db252ZXJ0LCAmc3JjQml0cywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnNyY1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZkc3RSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmbW9kZSwKLQkgICAgICAgICAgICAgICAgICAgICAgT3B0UmVzT2JqX0NvbnZlcnQsICZtYXNrUmduKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU3RkQml0cyhzcmNCaXRzLAotCSAgICAgICAgJnNyY1JlY3QsCi0JICAgICAgICAmZHN0UmVjdCwKLQkgICAgICAgIG1vZGUsCi0JICAgICAgICBtYXNrUmduKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8maE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQk1PYmpfQ29udmVydCwgJnNyY0JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZzcmNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmZHN0UmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdFJlc09ial9Db252ZXJ0LCAmbWFza1JnbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFN0ZEJpdHMoc3JjQml0cywKKyAgICAgICAgJnNyY1JlY3QsCisgICAgICAgICZkc3RSZWN0LAorICAgICAgICBtb2RlLAorICAgICAgICBtYXNrUmduKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfQWRkUHQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBvaW50IHNyYzsKLQlQb2ludCBkc3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBvaW50IHNyYzsKKyAgICBQb2ludCBkc3Q7CiAjaWZuZGVmIEFkZFB0Ci0JUHlNYWNfUFJFQ0hFQ0soQWRkUHQpOworICAgIFB5TWFjX1BSRUNIRUNLKEFkZFB0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnNyYywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZkc3QpKQotCQlyZXR1cm4gTlVMTDsKLQlBZGRQdChzcmMsCi0JICAgICAgJmRzdCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFBvaW50LCBkc3QpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZkc3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBBZGRQdChzcmMsCisgICAgICAgICAgJmRzdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFBvaW50LCBkc3QpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0VxdWFsUHQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCVBvaW50IHB0MTsKLQlQb2ludCBwdDI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIFBvaW50IHB0MTsKKyAgICBQb2ludCBwdDI7CiAjaWZuZGVmIEVxdWFsUHQKLQlQeU1hY19QUkVDSEVDSyhFcXVhbFB0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhFcXVhbFB0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnB0MSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZwdDIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBFcXVhbFB0KHB0MSwKLQkgICAgICAgICAgICAgIHB0Mik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmcHQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnB0MikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEVxdWFsUHQocHQxLAorICAgICAgICAgICAgICAgICAgcHQyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9NYWNQdEluUmVjdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JUG9pbnQgcHQ7Ci0JUmVjdCByOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBQb2ludCBwdDsKKyAgICBSZWN0IHI7CiAjaWZuZGVmIE1hY1B0SW5SZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soTWFjUHRJblJlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKE1hY1B0SW5SZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnB0LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmcikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1hY1B0SW5SZWN0KHB0LAotCSAgICAgICAgICAgICAgICAgICZyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZwdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNYWNQdEluUmVjdChwdCwKKyAgICAgICAgICAgICAgICAgICAgICAmcik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfUHQyUmVjdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUG9pbnQgcHQxOwotCVBvaW50IHB0MjsKLQlSZWN0IGRzdFJlY3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBvaW50IHB0MTsKKyAgICBQb2ludCBwdDI7CisgICAgUmVjdCBkc3RSZWN0OwogI2lmbmRlZiBQdDJSZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soUHQyUmVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUHQyUmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZwdDEsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmcHQyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JUHQyUmVjdChwdDEsCi0JICAgICAgICBwdDIsCi0JICAgICAgICAmZHN0UmVjdCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZkc3RSZWN0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZwdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmcHQyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHQyUmVjdChwdDEsCisgICAgICAgIHB0MiwKKyAgICAgICAgJmRzdFJlY3QpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmZHN0UmVjdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfUHRUb0FuZ2xlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZWN0IHI7Ci0JUG9pbnQgcHQ7Ci0Jc2hvcnQgYW5nbGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlY3QgcjsKKyAgICBQb2ludCBwdDsKKyAgICBzaG9ydCBhbmdsZTsKICNpZm5kZWYgUHRUb0FuZ2xlCi0JUHlNYWNfUFJFQ0hFQ0soUHRUb0FuZ2xlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhQdFRvQW5nbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnB0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JUHRUb0FuZ2xlKCZyLAotCSAgICAgICAgICBwdCwKLQkgICAgICAgICAgJmFuZ2xlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgYW5nbGUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZwdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB0VG9BbmdsZSgmciwKKyAgICAgICAgICAgICAgcHQsCisgICAgICAgICAgICAgICZhbmdsZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGFuZ2xlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9TdWJQdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUG9pbnQgc3JjOwotCVBvaW50IGRzdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUG9pbnQgc3JjOworICAgIFBvaW50IGRzdDsKICNpZm5kZWYgU3ViUHQKLQlQeU1hY19QUkVDSEVDSyhTdWJQdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU3ViUHQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmc3JjLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJmRzdCkpCi0JCXJldHVybiBOVUxMOwotCVN1YlB0KHNyYywKLQkgICAgICAmZHN0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUG9pbnQsIGRzdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJmRzdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFN1YlB0KHNyYywKKyAgICAgICAgICAmZHN0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUG9pbnQsIGRzdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfUHRJblJnbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JUG9pbnQgcHQ7Ci0JUmduSGFuZGxlIHJnbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgUG9pbnQgcHQ7CisgICAgUmduSGFuZGxlIHJnbjsKICNpZm5kZWYgUHRJblJnbgotCVB5TWFjX1BSRUNIRUNLKFB0SW5SZ24pOworICAgIFB5TWFjX1BSRUNIRUNLKFB0SW5SZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmcHQsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmduKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gUHRJblJnbihwdCwKLQkgICAgICAgICAgICAgIHJnbik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmcHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmduKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gUHRJblJnbihwdCwKKyAgICAgICAgICAgICAgICAgIHJnbik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfTmV3UGl4TWFwKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQaXhNYXBIYW5kbGUgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQaXhNYXBIYW5kbGUgX3J2OwogI2lmbmRlZiBOZXdQaXhNYXAKLQlQeU1hY19QUkVDSEVDSyhOZXdQaXhNYXApOworICAgIFB5TWFjX1BSRUNIRUNLKE5ld1BpeE1hcCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTmV3UGl4TWFwKCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBOZXdQaXhNYXAoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfRGlzcG9zZVBpeE1hcChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUGl4TWFwSGFuZGxlIHBtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQaXhNYXBIYW5kbGUgcG07CiAjaWZuZGVmIERpc3Bvc2VQaXhNYXAKLQlQeU1hY19QUkVDSEVDSyhEaXNwb3NlUGl4TWFwKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEaXNwb3NlUGl4TWFwKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwbSkpCi0JCXJldHVybiBOVUxMOwotCURpc3Bvc2VQaXhNYXAocG0pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcG0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBEaXNwb3NlUGl4TWFwKHBtKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfQ29weVBpeE1hcChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUGl4TWFwSGFuZGxlIHNyY1BNOwotCVBpeE1hcEhhbmRsZSBkc3RQTTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUGl4TWFwSGFuZGxlIHNyY1BNOworICAgIFBpeE1hcEhhbmRsZSBkc3RQTTsKICNpZm5kZWYgQ29weVBpeE1hcAotCVB5TWFjX1BSRUNIRUNLKENvcHlQaXhNYXApOworICAgIFB5TWFjX1BSRUNIRUNLKENvcHlQaXhNYXApOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc3JjUE0sCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZHN0UE0pKQotCQlyZXR1cm4gTlVMTDsKLQlDb3B5UGl4TWFwKHNyY1BNLAotCSAgICAgICAgICAgZHN0UE0pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzcmNQTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkc3RQTSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENvcHlQaXhNYXAoc3JjUE0sCisgICAgICAgICAgICAgICBkc3RQTSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX05ld1BpeFBhdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUGl4UGF0SGFuZGxlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUGl4UGF0SGFuZGxlIF9ydjsKICNpZm5kZWYgTmV3UGl4UGF0Ci0JUHlNYWNfUFJFQ0hFQ0soTmV3UGl4UGF0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhOZXdQaXhQYXQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE5ld1BpeFBhdCgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTmV3UGl4UGF0KCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0Rpc3Bvc2VQaXhQYXQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBpeFBhdEhhbmRsZSBwcDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUGl4UGF0SGFuZGxlIHBwOwogI2lmbmRlZiBEaXNwb3NlUGl4UGF0Ci0JUHlNYWNfUFJFQ0hFQ0soRGlzcG9zZVBpeFBhdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGlzcG9zZVBpeFBhdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcHApKQotCQlyZXR1cm4gTlVMTDsKLQlEaXNwb3NlUGl4UGF0KHBwKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBwKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgRGlzcG9zZVBpeFBhdChwcCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0NvcHlQaXhQYXQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBpeFBhdEhhbmRsZSBzcmNQUDsKLQlQaXhQYXRIYW5kbGUgZHN0UFA7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBpeFBhdEhhbmRsZSBzcmNQUDsKKyAgICBQaXhQYXRIYW5kbGUgZHN0UFA7CiAjaWZuZGVmIENvcHlQaXhQYXQKLQlQeU1hY19QUkVDSEVDSyhDb3B5UGl4UGF0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb3B5UGl4UGF0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNyY1BQLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRzdFBQKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ29weVBpeFBhdChzcmNQUCwKLQkgICAgICAgICAgIGRzdFBQKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc3JjUFAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZHN0UFApKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDb3B5UGl4UGF0KHNyY1BQLAorICAgICAgICAgICAgICAgZHN0UFApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9QZW5QaXhQYXQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBpeFBhdEhhbmRsZSBwcDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUGl4UGF0SGFuZGxlIHBwOwogI2lmbmRlZiBQZW5QaXhQYXQKLQlQeU1hY19QUkVDSEVDSyhQZW5QaXhQYXQpOworICAgIFB5TWFjX1BSRUNIRUNLKFBlblBpeFBhdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcHApKQotCQlyZXR1cm4gTlVMTDsKLQlQZW5QaXhQYXQocHApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcHApKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQZW5QaXhQYXQocHApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9CYWNrUGl4UGF0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQaXhQYXRIYW5kbGUgcHA7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBpeFBhdEhhbmRsZSBwcDsKICNpZm5kZWYgQmFja1BpeFBhdAotCVB5TWFjX1BSRUNIRUNLKEJhY2tQaXhQYXQpOworICAgIFB5TWFjX1BSRUNIRUNLKEJhY2tQaXhQYXQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBwKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQmFja1BpeFBhdChwcCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwcCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEJhY2tQaXhQYXQocHApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9HZXRQaXhQYXQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBpeFBhdEhhbmRsZSBfcnY7Ci0Jc2hvcnQgcGF0SUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBpeFBhdEhhbmRsZSBfcnY7CisgICAgc2hvcnQgcGF0SUQ7CiAjaWZuZGVmIEdldFBpeFBhdAotCVB5TWFjX1BSRUNIRUNLKEdldFBpeFBhdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0UGl4UGF0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcGF0SUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRQaXhQYXQocGF0SUQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhdElEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0UGl4UGF0KHBhdElEKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfTWFrZVJHQlBhdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUGl4UGF0SGFuZGxlIHBwOwotCVJHQkNvbG9yIG15Q29sb3I7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBpeFBhdEhhbmRsZSBwcDsKKyAgICBSR0JDb2xvciBteUNvbG9yOwogI2lmbmRlZiBNYWtlUkdCUGF0Ci0JUHlNYWNfUFJFQ0hFQ0soTWFrZVJHQlBhdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWFrZVJHQlBhdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwcCwKLQkgICAgICAgICAgICAgICAgICAgICAgUWRSR0JfQ29udmVydCwgJm15Q29sb3IpKQotCQlyZXR1cm4gTlVMTDsKLQlNYWtlUkdCUGF0KHBwLAotCSAgICAgICAgICAgJm15Q29sb3IpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUWRSR0JfQ29udmVydCwgJm15Q29sb3IpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNYWtlUkdCUGF0KHBwLAorICAgICAgICAgICAgICAgJm15Q29sb3IpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9GaWxsQ1JlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3QgcjsKLQlQaXhQYXRIYW5kbGUgcHA7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlY3QgcjsKKyAgICBQaXhQYXRIYW5kbGUgcHA7CiAjaWZuZGVmIEZpbGxDUmVjdAotCVB5TWFjX1BSRUNIRUNLKEZpbGxDUmVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRmlsbENSZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmciwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwcCkpCi0JCXJldHVybiBOVUxMOwotCUZpbGxDUmVjdCgmciwKLQkgICAgICAgICAgcHApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcHApKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBGaWxsQ1JlY3QoJnIsCisgICAgICAgICAgICAgIHBwKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfRmlsbENPdmFsKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZWN0IHI7Ci0JUGl4UGF0SGFuZGxlIHBwOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IHI7CisgICAgUGl4UGF0SGFuZGxlIHBwOwogI2lmbmRlZiBGaWxsQ092YWwKLQlQeU1hY19QUkVDSEVDSyhGaWxsQ092YWwpOworICAgIFB5TWFjX1BSRUNIRUNLKEZpbGxDT3ZhbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcHApKQotCQlyZXR1cm4gTlVMTDsKLQlGaWxsQ092YWwoJnIsCi0JICAgICAgICAgIHBwKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBwKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgRmlsbENPdmFsKCZyLAorICAgICAgICAgICAgICBwcCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0ZpbGxDUm91bmRSZWN0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZWN0IHI7Ci0Jc2hvcnQgb3ZhbFdpZHRoOwotCXNob3J0IG92YWxIZWlnaHQ7Ci0JUGl4UGF0SGFuZGxlIHBwOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IHI7CisgICAgc2hvcnQgb3ZhbFdpZHRoOworICAgIHNob3J0IG92YWxIZWlnaHQ7CisgICAgUGl4UGF0SGFuZGxlIHBwOwogI2lmbmRlZiBGaWxsQ1JvdW5kUmVjdAotCVB5TWFjX1BSRUNIRUNLKEZpbGxDUm91bmRSZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhGaWxsQ1JvdW5kUmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmciwKLQkgICAgICAgICAgICAgICAgICAgICAgJm92YWxXaWR0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm92YWxIZWlnaHQsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcHApKQotCQlyZXR1cm4gTlVMTDsKLQlGaWxsQ1JvdW5kUmVjdCgmciwKLQkgICAgICAgICAgICAgICBvdmFsV2lkdGgsCi0JICAgICAgICAgICAgICAgb3ZhbEhlaWdodCwKLQkgICAgICAgICAgICAgICBwcCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGhPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmb3ZhbFdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmb3ZhbEhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwcCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEZpbGxDUm91bmRSZWN0KCZyLAorICAgICAgICAgICAgICAgICAgIG92YWxXaWR0aCwKKyAgICAgICAgICAgICAgICAgICBvdmFsSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgIHBwKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfRmlsbENBcmMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3QgcjsKLQlzaG9ydCBzdGFydEFuZ2xlOwotCXNob3J0IGFyY0FuZ2xlOwotCVBpeFBhdEhhbmRsZSBwcDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmVjdCByOworICAgIHNob3J0IHN0YXJ0QW5nbGU7CisgICAgc2hvcnQgYXJjQW5nbGU7CisgICAgUGl4UGF0SGFuZGxlIHBwOwogI2lmbmRlZiBGaWxsQ0FyYwotCVB5TWFjX1BSRUNIRUNLKEZpbGxDQXJjKTsKKyAgICBQeU1hY19QUkVDSEVDSyhGaWxsQ0FyYyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmciwKLQkgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0QW5nbGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZhcmNBbmdsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwcCkpCi0JCXJldHVybiBOVUxMOwotCUZpbGxDQXJjKCZyLAotCSAgICAgICAgIHN0YXJ0QW5nbGUsCi0JICAgICAgICAgYXJjQW5nbGUsCi0JICAgICAgICAgcHApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0QW5nbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhcmNBbmdsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwcCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEZpbGxDQXJjKCZyLAorICAgICAgICAgICAgIHN0YXJ0QW5nbGUsCisgICAgICAgICAgICAgYXJjQW5nbGUsCisgICAgICAgICAgICAgcHApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9GaWxsQ1JnbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIHJnbjsKLQlQaXhQYXRIYW5kbGUgcHA7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSByZ247CisgICAgUGl4UGF0SGFuZGxlIHBwOwogI2lmbmRlZiBGaWxsQ1JnbgotCVB5TWFjX1BSRUNIRUNLKEZpbGxDUmduKTsKKyAgICBQeU1hY19QUkVDSEVDSyhGaWxsQ1Jnbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZ24sCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcHApKQotCQlyZXR1cm4gTlVMTDsKLQlGaWxsQ1JnbihyZ24sCi0JICAgICAgICAgcHApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcHApKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBGaWxsQ1JnbihyZ24sCisgICAgICAgICAgICAgcHApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9GaWxsQ1BvbHkoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBvbHlIYW5kbGUgcG9seTsKLQlQaXhQYXRIYW5kbGUgcHA7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBvbHlIYW5kbGUgcG9seTsKKyAgICBQaXhQYXRIYW5kbGUgcHA7CiAjaWZuZGVmIEZpbGxDUG9seQotCVB5TWFjX1BSRUNIRUNLKEZpbGxDUG9seSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRmlsbENQb2x5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBvbHksCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcHApKQotCQlyZXR1cm4gTlVMTDsKLQlGaWxsQ1BvbHkocG9seSwKLQkgICAgICAgICAgcHApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwb2x5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBwKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgRmlsbENQb2x5KHBvbHksCisgICAgICAgICAgICAgIHBwKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfUkdCRm9yZUNvbG9yKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSR0JDb2xvciBjb2xvcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUkdCQ29sb3IgY29sb3I7CiAjaWZuZGVmIFJHQkZvcmVDb2xvcgotCVB5TWFjX1BSRUNIRUNLKFJHQkZvcmVDb2xvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soUkdCRm9yZUNvbG9yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUWRSR0JfQ29udmVydCwgJmNvbG9yKSkKLQkJcmV0dXJuIE5VTEw7Ci0JUkdCRm9yZUNvbG9yKCZjb2xvcik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUWRSR0JfQ29udmVydCwgJmNvbG9yKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUkdCRm9yZUNvbG9yKCZjb2xvcik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1JHQkJhY2tDb2xvcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUkdCQ29sb3IgY29sb3I7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJHQkNvbG9yIGNvbG9yOwogI2lmbmRlZiBSR0JCYWNrQ29sb3IKLQlQeU1hY19QUkVDSEVDSyhSR0JCYWNrQ29sb3IpOworICAgIFB5TWFjX1BSRUNIRUNLKFJHQkJhY2tDb2xvcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFFkUkdCX0NvbnZlcnQsICZjb2xvcikpCi0JCXJldHVybiBOVUxMOwotCVJHQkJhY2tDb2xvcigmY29sb3IpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFFkUkdCX0NvbnZlcnQsICZjb2xvcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFJHQkJhY2tDb2xvcigmY29sb3IpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9TZXRDUGl4ZWwoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IGg7Ci0Jc2hvcnQgdjsKLQlSR0JDb2xvciBjUGl4OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBoOworICAgIHNob3J0IHY7CisgICAgUkdCQ29sb3IgY1BpeDsKICNpZm5kZWYgU2V0Q1BpeGVsCi0JUHlNYWNfUFJFQ0hFQ0soU2V0Q1BpeGVsKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRDUGl4ZWwpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGhPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZoLAotCSAgICAgICAgICAgICAgICAgICAgICAmdiwKLQkgICAgICAgICAgICAgICAgICAgICAgUWRSR0JfQ29udmVydCwgJmNQaXgpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRDUGl4ZWwoaCwKLQkgICAgICAgICAgdiwKLQkgICAgICAgICAgJmNQaXgpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2LAorICAgICAgICAgICAgICAgICAgICAgICAgICBRZFJHQl9Db252ZXJ0LCAmY1BpeCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldENQaXhlbChoLAorICAgICAgICAgICAgICB2LAorICAgICAgICAgICAgICAmY1BpeCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1NldFBvcnRQaXgoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBpeE1hcEhhbmRsZSBwbTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUGl4TWFwSGFuZGxlIHBtOwogI2lmbmRlZiBTZXRQb3J0UGl4Ci0JUHlNYWNfUFJFQ0hFQ0soU2V0UG9ydFBpeCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0UG9ydFBpeCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcG0pKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRQb3J0UGl4KHBtKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0UG9ydFBpeChwbSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0dldENQaXhlbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgaDsKLQlzaG9ydCB2OwotCVJHQkNvbG9yIGNQaXg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IGg7CisgICAgc2hvcnQgdjsKKyAgICBSR0JDb2xvciBjUGl4OwogI2lmbmRlZiBHZXRDUGl4ZWwKLQlQeU1hY19QUkVDSEVDSyhHZXRDUGl4ZWwpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldENQaXhlbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZoLAotCSAgICAgICAgICAgICAgICAgICAgICAmdikpCi0JCXJldHVybiBOVUxMOwotCUdldENQaXhlbChoLAotCSAgICAgICAgICB2LAotCSAgICAgICAgICAmY1BpeCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZjUGl4KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldENQaXhlbChoLAorICAgICAgICAgICAgICB2LAorICAgICAgICAgICAgICAmY1BpeCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZjUGl4KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9HZXRGb3JlQ29sb3IoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJHQkNvbG9yIGNvbG9yOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSR0JDb2xvciBjb2xvcjsKICNpZm5kZWYgR2V0Rm9yZUNvbG9yCi0JUHlNYWNfUFJFQ0hFQ0soR2V0Rm9yZUNvbG9yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRGb3JlQ29sb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUdldEZvcmVDb2xvcigmY29sb3IpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUWRSR0JfTmV3LCAmY29sb3IpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRGb3JlQ29sb3IoJmNvbG9yKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFFkUkdCX05ldywgJmNvbG9yKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9HZXRCYWNrQ29sb3IoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJHQkNvbG9yIGNvbG9yOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSR0JDb2xvciBjb2xvcjsKICNpZm5kZWYgR2V0QmFja0NvbG9yCi0JUHlNYWNfUFJFQ0hFQ0soR2V0QmFja0NvbG9yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRCYWNrQ29sb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUdldEJhY2tDb2xvcigmY29sb3IpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUWRSR0JfTmV3LCAmY29sb3IpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRCYWNrQ29sb3IoJmNvbG9yKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFFkUkdCX05ldywgJmNvbG9yKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9PcENvbG9yKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSR0JDb2xvciBjb2xvcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUkdCQ29sb3IgY29sb3I7CiAjaWZuZGVmIE9wQ29sb3IKLQlQeU1hY19QUkVDSEVDSyhPcENvbG9yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhPcENvbG9yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUWRSR0JfQ29udmVydCwgJmNvbG9yKSkKLQkJcmV0dXJuIE5VTEw7Ci0JT3BDb2xvcigmY29sb3IpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFFkUkdCX0NvbnZlcnQsICZjb2xvcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE9wQ29sb3IoJmNvbG9yKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfSGlsaXRlQ29sb3IoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJHQkNvbG9yIGNvbG9yOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSR0JDb2xvciBjb2xvcjsKICNpZm5kZWYgSGlsaXRlQ29sb3IKLQlQeU1hY19QUkVDSEVDSyhIaWxpdGVDb2xvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soSGlsaXRlQ29sb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBRZFJHQl9Db252ZXJ0LCAmY29sb3IpKQotCQlyZXR1cm4gTlVMTDsKLQlIaWxpdGVDb2xvcigmY29sb3IpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFFkUkdCX0NvbnZlcnQsICZjb2xvcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEhpbGl0ZUNvbG9yKCZjb2xvcik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0Rpc3Bvc2VDVGFibGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNUYWJIYW5kbGUgY1RhYmxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDVGFiSGFuZGxlIGNUYWJsZTsKICNpZm5kZWYgRGlzcG9zZUNUYWJsZQotCVB5TWFjX1BSRUNIRUNLKERpc3Bvc2VDVGFibGUpOworICAgIFB5TWFjX1BSRUNIRUNLKERpc3Bvc2VDVGFibGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmNUYWJsZSkpCi0JCXJldHVybiBOVUxMOwotCURpc3Bvc2VDVGFibGUoY1RhYmxlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmNUYWJsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIERpc3Bvc2VDVGFibGUoY1RhYmxlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfR2V0Q1RhYmxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDVGFiSGFuZGxlIF9ydjsKLQlzaG9ydCBjdElEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDVGFiSGFuZGxlIF9ydjsKKyAgICBzaG9ydCBjdElEOwogI2lmbmRlZiBHZXRDVGFibGUKLQlQeU1hY19QUkVDSEVDSyhHZXRDVGFibGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldENUYWJsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmN0SUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRDVGFibGUoY3RJRCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY3RJRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldENUYWJsZShjdElEKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfR2V0Q0N1cnNvcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0Nyc3JIYW5kbGUgX3J2OwotCXNob3J0IGNyc3JJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0Nyc3JIYW5kbGUgX3J2OworICAgIHNob3J0IGNyc3JJRDsKICNpZm5kZWYgR2V0Q0N1cnNvcgotCVB5TWFjX1BSRUNIRUNLKEdldENDdXJzb3IpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldENDdXJzb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZjcnNySUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRDQ3Vyc29yKGNyc3JJRCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY3JzcklEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0Q0N1cnNvcihjcnNySUQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9TZXRDQ3Vyc29yKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDQ3JzckhhbmRsZSBjQ3JzcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0Nyc3JIYW5kbGUgY0Nyc3I7CiAjaWZuZGVmIFNldENDdXJzb3IKLQlQeU1hY19QUkVDSEVDSyhTZXRDQ3Vyc29yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRDQ3Vyc29yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZjQ3JzcikpCi0JCXJldHVybiBOVUxMOwotCVNldENDdXJzb3IoY0Nyc3IpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmY0Nyc3IpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRDQ3Vyc29yKGNDcnNyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfQWxsb2NDdXJzb3IoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgQWxsb2NDdXJzb3IKLQlQeU1hY19QUkVDSEVDSyhBbGxvY0N1cnNvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soQWxsb2NDdXJzb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUFsbG9jQ3Vyc29yKCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBBbGxvY0N1cnNvcigpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9EaXNwb3NlQ0N1cnNvcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0Nyc3JIYW5kbGUgY0Nyc3I7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENDcnNySGFuZGxlIGNDcnNyOwogI2lmbmRlZiBEaXNwb3NlQ0N1cnNvcgotCVB5TWFjX1BSRUNIRUNLKERpc3Bvc2VDQ3Vyc29yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEaXNwb3NlQ0N1cnNvcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmY0Nyc3IpKQotCQlyZXR1cm4gTlVMTDsKLQlEaXNwb3NlQ0N1cnNvcihjQ3Jzcik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZjQ3JzcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIERpc3Bvc2VDQ3Vyc29yKGNDcnNyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfR2V0TWF4RGV2aWNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlHREhhbmRsZSBfcnY7Ci0JUmVjdCBnbG9iYWxSZWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBHREhhbmRsZSBfcnY7CisgICAgUmVjdCBnbG9iYWxSZWN0OwogI2lmbmRlZiBHZXRNYXhEZXZpY2UKLQlQeU1hY19QUkVDSEVDSyhHZXRNYXhEZXZpY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1heERldmljZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZnbG9iYWxSZWN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TWF4RGV2aWNlKCZnbG9iYWxSZWN0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmZ2xvYmFsUmVjdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE1heERldmljZSgmZ2xvYmFsUmVjdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0dldENUU2VlZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgX3J2OwogI2lmbmRlZiBHZXRDVFNlZWQKLQlQeU1hY19QUkVDSEVDSyhHZXRDVFNlZWQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldENUU2VlZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0Q1RTZWVkKCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldENUU2VlZCgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0dldERldmljZUxpc3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUdESGFuZGxlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgR0RIYW5kbGUgX3J2OwogI2lmbmRlZiBHZXREZXZpY2VMaXN0Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0RGV2aWNlTGlzdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0RGV2aWNlTGlzdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0RGV2aWNlTGlzdCgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0RGV2aWNlTGlzdCgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9HZXRNYWluRGV2aWNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlHREhhbmRsZSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEdESGFuZGxlIF9ydjsKICNpZm5kZWYgR2V0TWFpbkRldmljZQotCVB5TWFjX1BSRUNIRUNLKEdldE1haW5EZXZpY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1haW5EZXZpY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldE1haW5EZXZpY2UoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE1haW5EZXZpY2UoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfR2V0TmV4dERldmljZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JR0RIYW5kbGUgX3J2OwotCUdESGFuZGxlIGN1ckRldmljZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgR0RIYW5kbGUgX3J2OworICAgIEdESGFuZGxlIGN1ckRldmljZTsKICNpZm5kZWYgR2V0TmV4dERldmljZQotCVB5TWFjX1BSRUNIRUNLKEdldE5leHREZXZpY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE5leHREZXZpY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmN1ckRldmljZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldE5leHREZXZpY2UoY3VyRGV2aWNlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmN1ckRldmljZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE5leHREZXZpY2UoY3VyRGV2aWNlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfVGVzdERldmljZUF0dHJpYnV0ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JR0RIYW5kbGUgZ2RoOwotCXNob3J0IGF0dHJpYnV0ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgR0RIYW5kbGUgZ2RoOworICAgIHNob3J0IGF0dHJpYnV0ZTsKICNpZm5kZWYgVGVzdERldmljZUF0dHJpYnV0ZQotCVB5TWFjX1BSRUNIRUNLKFRlc3REZXZpY2VBdHRyaWJ1dGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFRlc3REZXZpY2VBdHRyaWJ1dGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZnZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZhdHRyaWJ1dGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBUZXN0RGV2aWNlQXR0cmlidXRlKGdkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZnZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhdHRyaWJ1dGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBUZXN0RGV2aWNlQXR0cmlidXRlKGdkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfU2V0RGV2aWNlQXR0cmlidXRlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlHREhhbmRsZSBnZGg7Ci0Jc2hvcnQgYXR0cmlidXRlOwotCUJvb2xlYW4gdmFsdWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEdESGFuZGxlIGdkaDsKKyAgICBzaG9ydCBhdHRyaWJ1dGU7CisgICAgQm9vbGVhbiB2YWx1ZTsKICNpZm5kZWYgU2V0RGV2aWNlQXR0cmlidXRlCi0JUHlNYWNfUFJFQ0hFQ0soU2V0RGV2aWNlQXR0cmlidXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXREZXZpY2VBdHRyaWJ1dGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZ2RoLAotCSAgICAgICAgICAgICAgICAgICAgICAmYXR0cmlidXRlLAotCSAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXREZXZpY2VBdHRyaWJ1dGUoZ2RoLAotCSAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUsCi0JICAgICAgICAgICAgICAgICAgIHZhbHVlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZ2RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYXR0cmlidXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXREZXZpY2VBdHRyaWJ1dGUoZ2RoLAorICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUsCisgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfSW5pdEdEZXZpY2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IHFkUmVmTnVtOwotCWxvbmcgbW9kZTsKLQlHREhhbmRsZSBnZGg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IHFkUmVmTnVtOworICAgIGxvbmcgbW9kZTsKKyAgICBHREhhbmRsZSBnZGg7CiAjaWZuZGVmIEluaXRHRGV2aWNlCi0JUHlNYWNfUFJFQ0hFQ0soSW5pdEdEZXZpY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKEluaXRHRGV2aWNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcWRSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICZtb2RlLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmdkaCkpCi0JCXJldHVybiBOVUxMOwotCUluaXRHRGV2aWNlKHFkUmVmTnVtLAotCSAgICAgICAgICAgIG1vZGUsCi0JICAgICAgICAgICAgZ2RoKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZxZFJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZ2RoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgSW5pdEdEZXZpY2UocWRSZWZOdW0sCisgICAgICAgICAgICAgICAgbW9kZSwKKyAgICAgICAgICAgICAgICBnZGgpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9OZXdHRGV2aWNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlHREhhbmRsZSBfcnY7Ci0Jc2hvcnQgcmVmTnVtOwotCWxvbmcgbW9kZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgR0RIYW5kbGUgX3J2OworICAgIHNob3J0IHJlZk51bTsKKyAgICBsb25nIG1vZGU7CiAjaWZuZGVmIE5ld0dEZXZpY2UKLQlQeU1hY19QUkVDSEVDSyhOZXdHRGV2aWNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhOZXdHRGV2aWNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vZGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBOZXdHRGV2aWNlKHJlZk51bSwKLQkgICAgICAgICAgICAgICAgIG1vZGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtb2RlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTmV3R0RldmljZShyZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICBtb2RlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfRGlzcG9zZUdEZXZpY2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUdESGFuZGxlIGdkaDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgR0RIYW5kbGUgZ2RoOwogI2lmbmRlZiBEaXNwb3NlR0RldmljZQotCVB5TWFjX1BSRUNIRUNLKERpc3Bvc2VHRGV2aWNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEaXNwb3NlR0RldmljZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZ2RoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JRGlzcG9zZUdEZXZpY2UoZ2RoKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmdkaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIERpc3Bvc2VHRGV2aWNlKGdkaCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1NldEdEZXZpY2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUdESGFuZGxlIGdkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBHREhhbmRsZSBnZDsKICNpZm5kZWYgU2V0R0RldmljZQotCVB5TWFjX1BSRUNIRUNLKFNldEdEZXZpY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldEdEZXZpY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmdkKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0R0RldmljZShnZCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZnZCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldEdEZXZpY2UoZ2QpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9HZXRHRGV2aWNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlHREhhbmRsZSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEdESGFuZGxlIF9ydjsKICNpZm5kZWYgR2V0R0RldmljZQotCVB5TWFjX1BSRUNIRUNLKEdldEdEZXZpY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldEdEZXZpY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldEdEZXZpY2UoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldEdEZXZpY2UoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfQ29sb3IySW5kZXgoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWxvbmcgX3J2OwotCVJHQkNvbG9yIG15Q29sb3I7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgX3J2OworICAgIFJHQkNvbG9yIG15Q29sb3I7CiAjaWZuZGVmIENvbG9yMkluZGV4Ci0JUHlNYWNfUFJFQ0hFQ0soQ29sb3IySW5kZXgpOworICAgIFB5TWFjX1BSRUNIRUNLKENvbG9yMkluZGV4KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUWRSR0JfQ29udmVydCwgJm15Q29sb3IpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDb2xvcjJJbmRleCgmbXlDb2xvcik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBRZFJHQl9Db252ZXJ0LCAmbXlDb2xvcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENvbG9yMkluZGV4KCZteUNvbG9yKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9JbmRleDJDb2xvcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBpbmRleDsKLQlSR0JDb2xvciBhQ29sb3I7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgaW5kZXg7CisgICAgUkdCQ29sb3IgYUNvbG9yOwogI2lmbmRlZiBJbmRleDJDb2xvcgotCVB5TWFjX1BSRUNIRUNLKEluZGV4MkNvbG9yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhJbmRleDJDb2xvcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluZGV4KSkKLQkJcmV0dXJuIE5VTEw7Ci0JSW5kZXgyQ29sb3IoaW5kZXgsCi0JICAgICAgICAgICAgJmFDb2xvcik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZhQ29sb3IpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBJbmRleDJDb2xvcihpbmRleCwKKyAgICAgICAgICAgICAgICAmYUNvbG9yKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFFkUkdCX05ldywgJmFDb2xvcik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfSW52ZXJ0Q29sb3IoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJHQkNvbG9yIG15Q29sb3I7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJHQkNvbG9yIG15Q29sb3I7CiAjaWZuZGVmIEludmVydENvbG9yCi0JUHlNYWNfUFJFQ0hFQ0soSW52ZXJ0Q29sb3IpOworICAgIFB5TWFjX1BSRUNIRUNLKEludmVydENvbG9yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlJbnZlcnRDb2xvcigmbXlDb2xvcik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZteUNvbG9yKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgSW52ZXJ0Q29sb3IoJm15Q29sb3IpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUWRSR0JfTmV3LCAmbXlDb2xvcik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfUmVhbENvbG9yKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlSR0JDb2xvciBjb2xvcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgUkdCQ29sb3IgY29sb3I7CiAjaWZuZGVmIFJlYWxDb2xvcgotCVB5TWFjX1BSRUNIRUNLKFJlYWxDb2xvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soUmVhbENvbG9yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUWRSR0JfQ29udmVydCwgJmNvbG9yKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gUmVhbENvbG9yKCZjb2xvcik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBRZFJHQl9Db252ZXJ0LCAmY29sb3IpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBSZWFsQ29sb3IoJmNvbG9yKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9HZXRTdWJUYWJsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ1RhYkhhbmRsZSBteUNvbG9yczsKLQlzaG9ydCBpVGFiUmVzOwotCUNUYWJIYW5kbGUgdGFyZ2V0VGJsOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDVGFiSGFuZGxlIG15Q29sb3JzOworICAgIHNob3J0IGlUYWJSZXM7CisgICAgQ1RhYkhhbmRsZSB0YXJnZXRUYmw7CiAjaWZuZGVmIEdldFN1YlRhYmxlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0U3ViVGFibGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFN1YlRhYmxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZteUNvbG9ycywKLQkgICAgICAgICAgICAgICAgICAgICAgJmlUYWJSZXMsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGFyZ2V0VGJsKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0U3ViVGFibGUobXlDb2xvcnMsCi0JICAgICAgICAgICAgaVRhYlJlcywKLQkgICAgICAgICAgICB0YXJnZXRUYmwpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmbXlDb2xvcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpVGFiUmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRhcmdldFRibCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldFN1YlRhYmxlKG15Q29sb3JzLAorICAgICAgICAgICAgICAgIGlUYWJSZXMsCisgICAgICAgICAgICAgICAgdGFyZ2V0VGJsKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfTWFrZUlUYWJsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ1RhYkhhbmRsZSBjVGFiSDsKLQlJVGFiSGFuZGxlIGlUYWJIOwotCXNob3J0IHJlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ1RhYkhhbmRsZSBjVGFiSDsKKyAgICBJVGFiSGFuZGxlIGlUYWJIOworICAgIHNob3J0IHJlczsKICNpZm5kZWYgTWFrZUlUYWJsZQotCVB5TWFjX1BSRUNIRUNLKE1ha2VJVGFibGUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1ha2VJVGFibGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmNUYWJILAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmlUYWJILAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTWFrZUlUYWJsZShjVGFiSCwKLQkgICAgICAgICAgIGlUYWJILAotCSAgICAgICAgICAgcmVzKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmNUYWJILAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmlUYWJILAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTWFrZUlUYWJsZShjVGFiSCwKKyAgICAgICAgICAgICAgIGlUYWJILAorICAgICAgICAgICAgICAgcmVzKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfU2V0Q2xpZW50SUQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IGlkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBpZDsKICNpZm5kZWYgU2V0Q2xpZW50SUQKLQlQeU1hY19QUkVDSEVDSyhTZXRDbGllbnRJRCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0Q2xpZW50SUQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpZCkpCi0JCXJldHVybiBOVUxMOwotCVNldENsaWVudElEKGlkKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpZCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldENsaWVudElEKGlkKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfUHJvdGVjdEVudHJ5KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBpbmRleDsKLQlCb29sZWFuIHByb3RlY3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IGluZGV4OworICAgIEJvb2xlYW4gcHJvdGVjdDsKICNpZm5kZWYgUHJvdGVjdEVudHJ5Ci0JUHlNYWNfUFJFQ0hFQ0soUHJvdGVjdEVudHJ5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhQcm90ZWN0RW50cnkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgICZwcm90ZWN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JUHJvdGVjdEVudHJ5KGluZGV4LAotCSAgICAgICAgICAgICBwcm90ZWN0KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwcm90ZWN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHJvdGVjdEVudHJ5KGluZGV4LAorICAgICAgICAgICAgICAgICBwcm90ZWN0KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfUmVzZXJ2ZUVudHJ5KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBpbmRleDsKLQlCb29sZWFuIHJlc2VydmU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IGluZGV4OworICAgIEJvb2xlYW4gcmVzZXJ2ZTsKICNpZm5kZWYgUmVzZXJ2ZUVudHJ5Ci0JUHlNYWNfUFJFQ0hFQ0soUmVzZXJ2ZUVudHJ5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhSZXNlcnZlRW50cnkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZXNlcnZlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JUmVzZXJ2ZUVudHJ5KGluZGV4LAotCSAgICAgICAgICAgICByZXNlcnZlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXNlcnZlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUmVzZXJ2ZUVudHJ5KGluZGV4LAorICAgICAgICAgICAgICAgICByZXNlcnZlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfUURFcnJvcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBfcnY7CiAjaWZuZGVmIFFERXJyb3IKLQlQeU1hY19QUkVDSEVDSyhRREVycm9yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhRREVycm9yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBRREVycm9yKCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFFERXJyb3IoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9Db3B5RGVlcE1hc2soUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJpdE1hcFB0ciBzcmNCaXRzOwotCUJpdE1hcFB0ciBtYXNrQml0czsKLQlCaXRNYXBQdHIgZHN0Qml0czsKLQlSZWN0IHNyY1JlY3Q7Ci0JUmVjdCBtYXNrUmVjdDsKLQlSZWN0IGRzdFJlY3Q7Ci0Jc2hvcnQgbW9kZTsKLQlSZ25IYW5kbGUgbWFza1JnbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQml0TWFwUHRyIHNyY0JpdHM7CisgICAgQml0TWFwUHRyIG1hc2tCaXRzOworICAgIEJpdE1hcFB0ciBkc3RCaXRzOworICAgIFJlY3Qgc3JjUmVjdDsKKyAgICBSZWN0IG1hc2tSZWN0OworICAgIFJlY3QgZHN0UmVjdDsKKyAgICBzaG9ydCBtb2RlOworICAgIFJnbkhhbmRsZSBtYXNrUmduOwogI2lmbmRlZiBDb3B5RGVlcE1hc2sKLQlQeU1hY19QUkVDSEVDSyhDb3B5RGVlcE1hc2spOworICAgIFB5TWFjX1BSRUNIRUNLKENvcHlEZWVwTWFzayk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJk8mTyZoTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBCTU9ial9Db252ZXJ0LCAmc3JjQml0cywKLQkgICAgICAgICAgICAgICAgICAgICAgQk1PYmpfQ29udmVydCwgJm1hc2tCaXRzLAotCSAgICAgICAgICAgICAgICAgICAgICBCTU9ial9Db252ZXJ0LCAmZHN0Qml0cywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnNyY1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZtYXNrUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmRzdFJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICZtb2RlLAotCSAgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfQ29udmVydCwgJm1hc2tSZ24pKQotCQlyZXR1cm4gTlVMTDsKLQlDb3B5RGVlcE1hc2soc3JjQml0cywKLQkgICAgICAgICAgICAgbWFza0JpdHMsCi0JICAgICAgICAgICAgIGRzdEJpdHMsCi0JICAgICAgICAgICAgICZzcmNSZWN0LAotCSAgICAgICAgICAgICAmbWFza1JlY3QsCi0JICAgICAgICAgICAgICZkc3RSZWN0LAotCSAgICAgICAgICAgICBtb2RlLAotCSAgICAgICAgICAgICBtYXNrUmduKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mTyZPJk8maE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQk1PYmpfQ29udmVydCwgJnNyY0JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEJNT2JqX0NvbnZlcnQsICZtYXNrQml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQk1PYmpfQ29udmVydCwgJmRzdEJpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZzcmNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmbWFza1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZkc3RSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0UmVzT2JqX0NvbnZlcnQsICZtYXNrUmduKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ29weURlZXBNYXNrKHNyY0JpdHMsCisgICAgICAgICAgICAgICAgIG1hc2tCaXRzLAorICAgICAgICAgICAgICAgICBkc3RCaXRzLAorICAgICAgICAgICAgICAgICAmc3JjUmVjdCwKKyAgICAgICAgICAgICAgICAgJm1hc2tSZWN0LAorICAgICAgICAgICAgICAgICAmZHN0UmVjdCwKKyAgICAgICAgICAgICAgICAgbW9kZSwKKyAgICAgICAgICAgICAgICAgbWFza1Jnbik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0dldFBhdHRlcm4oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBhdEhhbmRsZSBfcnY7Ci0Jc2hvcnQgcGF0dGVybklEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQYXRIYW5kbGUgX3J2OworICAgIHNob3J0IHBhdHRlcm5JRDsKICNpZm5kZWYgR2V0UGF0dGVybgotCVB5TWFjX1BSRUNIRUNLKEdldFBhdHRlcm4pOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFBhdHRlcm4pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZwYXR0ZXJuSUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRQYXR0ZXJuKHBhdHRlcm5JRCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGF0dGVybklEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0UGF0dGVybihwYXR0ZXJuSUQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9NYWNHZXRDdXJzb3IoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUN1cnNIYW5kbGUgX3J2OwotCXNob3J0IGN1cnNvcklEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDdXJzSGFuZGxlIF9ydjsKKyAgICBzaG9ydCBjdXJzb3JJRDsKICNpZm5kZWYgTWFjR2V0Q3Vyc29yCi0JUHlNYWNfUFJFQ0hFQ0soTWFjR2V0Q3Vyc29yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNYWNHZXRDdXJzb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZjdXJzb3JJRCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1hY0dldEN1cnNvcihjdXJzb3JJRCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY3Vyc29ySUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNYWNHZXRDdXJzb3IoY3Vyc29ySUQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9HZXRQaWN0dXJlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQaWNIYW5kbGUgX3J2OwotCXNob3J0IHBpY3R1cmVJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUGljSGFuZGxlIF9ydjsKKyAgICBzaG9ydCBwaWN0dXJlSUQ7CiAjaWZuZGVmIEdldFBpY3R1cmUKLQlQeU1hY19QUkVDSEVDSyhHZXRQaWN0dXJlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRQaWN0dXJlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcGljdHVyZUlEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0UGljdHVyZShwaWN0dXJlSUQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBpY3R1cmVJRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFBpY3R1cmUocGljdHVyZUlEKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfRGVsdGFQb2ludChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBfcnY7Ci0JUG9pbnQgcHRBOwotCVBvaW50IHB0QjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgbG9uZyBfcnY7CisgICAgUG9pbnQgcHRBOworICAgIFBvaW50IHB0QjsKICNpZm5kZWYgRGVsdGFQb2ludAotCVB5TWFjX1BSRUNIRUNLKERlbHRhUG9pbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKERlbHRhUG9pbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmcHRBLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnB0QikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IERlbHRhUG9pbnQocHRBLAotCSAgICAgICAgICAgICAgICAgcHRCKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZwdEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmcHRCKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRGVsdGFQb2ludChwdEEsCisgICAgICAgICAgICAgICAgICAgICBwdEIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1NoaWVsZEN1cnNvcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVjdCBzaGllbGRSZWN0OwotCVBvaW50IG9mZnNldFB0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IHNoaWVsZFJlY3Q7CisgICAgUG9pbnQgb2Zmc2V0UHQ7CiAjaWZuZGVmIFNoaWVsZEN1cnNvcgotCVB5TWFjX1BSRUNIRUNLKFNoaWVsZEN1cnNvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2hpZWxkQ3Vyc29yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmc2hpZWxkUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZvZmZzZXRQdCkpCi0JCXJldHVybiBOVUxMOwotCVNoaWVsZEN1cnNvcigmc2hpZWxkUmVjdCwKLQkgICAgICAgICAgICAgb2Zmc2V0UHQpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnNoaWVsZFJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmb2Zmc2V0UHQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTaGllbGRDdXJzb3IoJnNoaWVsZFJlY3QsCisgICAgICAgICAgICAgICAgIG9mZnNldFB0KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfU2NyZWVuUmVzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBzY3JuSFJlczsKLQlzaG9ydCBzY3JuVlJlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgc2NybkhSZXM7CisgICAgc2hvcnQgc2NyblZSZXM7CiAjaWZuZGVmIFNjcmVlblJlcwotCVB5TWFjX1BSRUNIRUNLKFNjcmVlblJlcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2NyZWVuUmVzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlTY3JlZW5SZXMoJnNjcm5IUmVzLAotCSAgICAgICAgICAmc2NyblZSZXMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgc2NybkhSZXMsCi0JICAgICAgICAgICAgICAgICAgICAgc2NyblZSZXMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTY3JlZW5SZXMoJnNjcm5IUmVzLAorICAgICAgICAgICAgICAmc2NyblZSZXMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2NybkhSZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2NyblZSZXMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0dldEluZFBhdHRlcm4oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBhdHRlcm4gdGhlUGF0X19vdXRfXzsKLQlzaG9ydCBwYXR0ZXJuTGlzdElEOwotCXNob3J0IGluZGV4OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQYXR0ZXJuIHRoZVBhdF9fb3V0X187CisgICAgc2hvcnQgcGF0dGVybkxpc3RJRDsKKyAgICBzaG9ydCBpbmRleDsKICNpZm5kZWYgR2V0SW5kUGF0dGVybgotCVB5TWFjX1BSRUNIRUNLKEdldEluZFBhdHRlcm4pOworICAgIFB5TWFjX1BSRUNIRUNLKEdldEluZFBhdHRlcm4pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcGF0dGVybkxpc3RJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluZGV4KSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0SW5kUGF0dGVybigmdGhlUGF0X19vdXRfXywKLQkgICAgICAgICAgICAgIHBhdHRlcm5MaXN0SUQsCi0JICAgICAgICAgICAgICBpbmRleCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoInMjIiwKLQkgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSZ0aGVQYXRfX291dF9fLCAoaW50KXNpemVvZihQYXR0ZXJuKSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGF0dGVybkxpc3RJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZGV4KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0SW5kUGF0dGVybigmdGhlUGF0X19vdXRfXywKKyAgICAgICAgICAgICAgICAgIHBhdHRlcm5MaXN0SUQsCisgICAgICAgICAgICAgICAgICBpbmRleCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoInMjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSZ0aGVQYXRfX291dF9fLCAoaW50KXNpemVvZihQYXR0ZXJuKSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfU2xvcGVGcm9tQW5nbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUZpeGVkIF9ydjsKLQlzaG9ydCBhbmdsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgRml4ZWQgX3J2OworICAgIHNob3J0IGFuZ2xlOwogI2lmbmRlZiBTbG9wZUZyb21BbmdsZQotCVB5TWFjX1BSRUNIRUNLKFNsb3BlRnJvbUFuZ2xlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTbG9wZUZyb21BbmdsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmFuZ2xlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU2xvcGVGcm9tQW5nbGUoYW5nbGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGaXhlZCwgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFuZ2xlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU2xvcGVGcm9tQW5nbGUoYW5nbGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGaXhlZCwgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9BbmdsZUZyb21TbG9wZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgX3J2OwotCUZpeGVkIHNsb3BlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBfcnY7CisgICAgRml4ZWQgc2xvcGU7CiAjaWZuZGVmIEFuZ2xlRnJvbVNsb3BlCi0JUHlNYWNfUFJFQ0hFQ0soQW5nbGVGcm9tU2xvcGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEFuZ2xlRnJvbVNsb3BlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZzbG9wZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEFuZ2xlRnJvbVNsb3BlKHNsb3BlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmc2xvcGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBBbmdsZUZyb21TbG9wZShzbG9wZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfR2V0UGl4Qm91bmRzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQaXhNYXBIYW5kbGUgcGl4TWFwOwotCVJlY3QgYm91bmRzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQaXhNYXBIYW5kbGUgcGl4TWFwOworICAgIFJlY3QgYm91bmRzOwogI2lmbmRlZiBHZXRQaXhCb3VuZHMKLQlQeU1hY19QUkVDSEVDSyhHZXRQaXhCb3VuZHMpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFBpeEJvdW5kcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcGl4TWFwKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0UGl4Qm91bmRzKHBpeE1hcCwKLQkgICAgICAgICAgICAgJmJvdW5kcyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZib3VuZHMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwaXhNYXApKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRQaXhCb3VuZHMocGl4TWFwLAorICAgICAgICAgICAgICAgICAmYm91bmRzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmJvdW5kcyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfR2V0UGl4RGVwdGgoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IF9ydjsKLQlQaXhNYXBIYW5kbGUgcGl4TWFwOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBfcnY7CisgICAgUGl4TWFwSGFuZGxlIHBpeE1hcDsKICNpZm5kZWYgR2V0UGl4RGVwdGgKLQlQeU1hY19QUkVDSEVDSyhHZXRQaXhEZXB0aCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0UGl4RGVwdGgpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBpeE1hcCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFBpeERlcHRoKHBpeE1hcCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBpeE1hcCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFBpeERlcHRoKHBpeE1hcCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfR2V0UURHbG9iYWxzUmFuZG9tU2VlZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgX3J2OwogI2lmbmRlZiBHZXRRREdsb2JhbHNSYW5kb21TZWVkCi0JUHlNYWNfUFJFQ0hFQ0soR2V0UURHbG9iYWxzUmFuZG9tU2VlZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0UURHbG9iYWxzUmFuZG9tU2VlZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0UURHbG9iYWxzUmFuZG9tU2VlZCgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRRREdsb2JhbHNSYW5kb21TZWVkKCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfR2V0UURHbG9iYWxzU2NyZWVuQml0cyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQml0TWFwIHNjcmVlbkJpdHM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJpdE1hcCBzY3JlZW5CaXRzOwogI2lmbmRlZiBHZXRRREdsb2JhbHNTY3JlZW5CaXRzCi0JUHlNYWNfUFJFQ0hFQ0soR2V0UURHbG9iYWxzU2NyZWVuQml0cyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0UURHbG9iYWxzU2NyZWVuQml0cyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0UURHbG9iYWxzU2NyZWVuQml0cygmc2NyZWVuQml0cyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBCTU9ial9OZXdDb3BpZWQsICZzY3JlZW5CaXRzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0UURHbG9iYWxzU2NyZWVuQml0cygmc2NyZWVuQml0cyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBCTU9ial9OZXdDb3BpZWQsICZzY3JlZW5CaXRzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9HZXRRREdsb2JhbHNBcnJvdyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ3Vyc29yIGFycm93X19vdXRfXzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ3Vyc29yIGFycm93X19vdXRfXzsKICNpZm5kZWYgR2V0UURHbG9iYWxzQXJyb3cKLQlQeU1hY19QUkVDSEVDSyhHZXRRREdsb2JhbHNBcnJvdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0UURHbG9iYWxzQXJyb3cpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUdldFFER2xvYmFsc0Fycm93KCZhcnJvd19fb3V0X18pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJzIyIsCi0JICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikmYXJyb3dfX291dF9fLCAoaW50KXNpemVvZihDdXJzb3IpKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0UURHbG9iYWxzQXJyb3coJmFycm93X19vdXRfXyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoInMjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSZhcnJvd19fb3V0X18sIChpbnQpc2l6ZW9mKEN1cnNvcikpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0dldFFER2xvYmFsc0RhcmtHcmF5KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQYXR0ZXJuIGRrR3JheV9fb3V0X187CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBhdHRlcm4gZGtHcmF5X19vdXRfXzsKICNpZm5kZWYgR2V0UURHbG9iYWxzRGFya0dyYXkKLQlQeU1hY19QUkVDSEVDSyhHZXRRREdsb2JhbHNEYXJrR3JheSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0UURHbG9iYWxzRGFya0dyYXkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUdldFFER2xvYmFsc0RhcmtHcmF5KCZka0dyYXlfX291dF9fKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgicyMiLAotCSAgICAgICAgICAgICAgICAgICAgIChjaGFyICopJmRrR3JheV9fb3V0X18sIChpbnQpc2l6ZW9mKFBhdHRlcm4pKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0UURHbG9iYWxzRGFya0dyYXkoJmRrR3JheV9fb3V0X18pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJzIyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikmZGtHcmF5X19vdXRfXywgKGludClzaXplb2YoUGF0dGVybikpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0dldFFER2xvYmFsc0xpZ2h0R3JheShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUGF0dGVybiBsdEdyYXlfX291dF9fOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQYXR0ZXJuIGx0R3JheV9fb3V0X187CiAjaWZuZGVmIEdldFFER2xvYmFsc0xpZ2h0R3JheQotCVB5TWFjX1BSRUNIRUNLKEdldFFER2xvYmFsc0xpZ2h0R3JheSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0UURHbG9iYWxzTGlnaHRHcmF5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlHZXRRREdsb2JhbHNMaWdodEdyYXkoJmx0R3JheV9fb3V0X18pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJzIyIsCi0JICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikmbHRHcmF5X19vdXRfXywgKGludClzaXplb2YoUGF0dGVybikpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRRREdsb2JhbHNMaWdodEdyYXkoJmx0R3JheV9fb3V0X18pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJzIyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikmbHRHcmF5X19vdXRfXywgKGludClzaXplb2YoUGF0dGVybikpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0dldFFER2xvYmFsc0dyYXkoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBhdHRlcm4gZ3JheV9fb3V0X187CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBhdHRlcm4gZ3JheV9fb3V0X187CiAjaWZuZGVmIEdldFFER2xvYmFsc0dyYXkKLQlQeU1hY19QUkVDSEVDSyhHZXRRREdsb2JhbHNHcmF5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRRREdsb2JhbHNHcmF5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlHZXRRREdsb2JhbHNHcmF5KCZncmF5X19vdXRfXyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoInMjIiwKLQkgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSZncmF5X19vdXRfXywgKGludClzaXplb2YoUGF0dGVybikpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRRREdsb2JhbHNHcmF5KCZncmF5X19vdXRfXyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoInMjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSZncmF5X19vdXRfXywgKGludClzaXplb2YoUGF0dGVybikpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0dldFFER2xvYmFsc0JsYWNrKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQYXR0ZXJuIGJsYWNrX19vdXRfXzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUGF0dGVybiBibGFja19fb3V0X187CiAjaWZuZGVmIEdldFFER2xvYmFsc0JsYWNrCi0JUHlNYWNfUFJFQ0hFQ0soR2V0UURHbG9iYWxzQmxhY2spOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFFER2xvYmFsc0JsYWNrKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlHZXRRREdsb2JhbHNCbGFjaygmYmxhY2tfX291dF9fKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgicyMiLAotCSAgICAgICAgICAgICAgICAgICAgIChjaGFyICopJmJsYWNrX19vdXRfXywgKGludClzaXplb2YoUGF0dGVybikpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRRREdsb2JhbHNCbGFjaygmYmxhY2tfX291dF9fKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgicyMiLAorICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopJmJsYWNrX19vdXRfXywgKGludClzaXplb2YoUGF0dGVybikpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0dldFFER2xvYmFsc1doaXRlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQYXR0ZXJuIHdoaXRlX19vdXRfXzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUGF0dGVybiB3aGl0ZV9fb3V0X187CiAjaWZuZGVmIEdldFFER2xvYmFsc1doaXRlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0UURHbG9iYWxzV2hpdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFFER2xvYmFsc1doaXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlHZXRRREdsb2JhbHNXaGl0ZSgmd2hpdGVfX291dF9fKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgicyMiLAotCSAgICAgICAgICAgICAgICAgICAgIChjaGFyICopJndoaXRlX19vdXRfXywgKGludClzaXplb2YoUGF0dGVybikpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRRREdsb2JhbHNXaGl0ZSgmd2hpdGVfX291dF9fKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgicyMiLAorICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopJndoaXRlX19vdXRfXywgKGludClzaXplb2YoUGF0dGVybikpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0dldFFER2xvYmFsc1RoZVBvcnQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNHcmFmUHRyIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0dyYWZQdHIgX3J2OwogI2lmbmRlZiBHZXRRREdsb2JhbHNUaGVQb3J0Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0UURHbG9iYWxzVGhlUG9ydCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0UURHbG9iYWxzVGhlUG9ydCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0UURHbG9iYWxzVGhlUG9ydCgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgR3JhZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFFER2xvYmFsc1RoZVBvcnQoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1NldFFER2xvYmFsc1JhbmRvbVNlZWQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWxvbmcgcmFuZG9tU2VlZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgbG9uZyByYW5kb21TZWVkOwogI2lmbmRlZiBTZXRRREdsb2JhbHNSYW5kb21TZWVkCi0JUHlNYWNfUFJFQ0hFQ0soU2V0UURHbG9iYWxzUmFuZG9tU2VlZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0UURHbG9iYWxzUmFuZG9tU2VlZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJhbmRvbVNlZWQpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRRREdsb2JhbHNSYW5kb21TZWVkKHJhbmRvbVNlZWQpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJhbmRvbVNlZWQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRRREdsb2JhbHNSYW5kb21TZWVkKHJhbmRvbVNlZWQpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9TZXRRREdsb2JhbHNBcnJvdyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ3Vyc29yICphcnJvd19faW5fXzsKLQlpbnQgYXJyb3dfX2luX2xlbl9fOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDdXJzb3IgKmFycm93X19pbl9fOworICAgIGludCBhcnJvd19faW5fbGVuX187CiAjaWZuZGVmIFNldFFER2xvYmFsc0Fycm93Ci0JUHlNYWNfUFJFQ0hFQ0soU2V0UURHbG9iYWxzQXJyb3cpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFFER2xvYmFsc0Fycm93KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInMjIiwKLQkgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKiopJmFycm93X19pbl9fLCAmYXJyb3dfX2luX2xlbl9fKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKGFycm93X19pbl9sZW5fXyAhPSBzaXplb2YoQ3Vyc29yKSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJidWZmZXIgbGVuZ3RoIHNob3VsZCBiZSBzaXplb2YoQ3Vyc29yKSIpOwotCQlnb3RvIGFycm93X19lcnJvcl9fOwotCX0KLQlTZXRRREdsb2JhbHNBcnJvdyhhcnJvd19faW5fXyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInMjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKiopJmFycm93X19pbl9fLCAmYXJyb3dfX2luX2xlbl9fKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKGFycm93X19pbl9sZW5fXyAhPSBzaXplb2YoQ3Vyc29yKSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJidWZmZXIgbGVuZ3RoIHNob3VsZCBiZSBzaXplb2YoQ3Vyc29yKSIpOworICAgICAgICBnb3RvIGFycm93X19lcnJvcl9fOworICAgIH0KKyAgICBTZXRRREdsb2JhbHNBcnJvdyhhcnJvd19faW5fXyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOwogIGFycm93X19lcnJvcl9fOiA7Ci0JcmV0dXJuIF9yZXM7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfR2V0UmVnaW9uQm91bmRzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZ25IYW5kbGUgcmVnaW9uOwotCVJlY3QgYm91bmRzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZ25IYW5kbGUgcmVnaW9uOworICAgIFJlY3QgYm91bmRzOwogI2lmbmRlZiBHZXRSZWdpb25Cb3VuZHMKLQlQeU1hY19QUkVDSEVDSyhHZXRSZWdpb25Cb3VuZHMpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFJlZ2lvbkJvdW5kcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmVnaW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0UmVnaW9uQm91bmRzKHJlZ2lvbiwKLQkgICAgICAgICAgICAgICAgJmJvdW5kcyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZib3VuZHMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZWdpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRSZWdpb25Cb3VuZHMocmVnaW9uLAorICAgICAgICAgICAgICAgICAgICAmYm91bmRzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmJvdW5kcyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfSXNSZWdpb25SZWN0YW5ndWxhcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JUmduSGFuZGxlIHJlZ2lvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgUmduSGFuZGxlIHJlZ2lvbjsKICNpZm5kZWYgSXNSZWdpb25SZWN0YW5ndWxhcgotCVB5TWFjX1BSRUNIRUNLKElzUmVnaW9uUmVjdGFuZ3VsYXIpOworICAgIFB5TWFjX1BSRUNIRUNLKElzUmVnaW9uUmVjdGFuZ3VsYXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJlZ2lvbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IElzUmVnaW9uUmVjdGFuZ3VsYXIocmVnaW9uKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmVnaW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gSXNSZWdpb25SZWN0YW5ndWxhcihyZWdpb24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0NyZWF0ZU5ld1BvcnQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNHcmFmUHRyIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0dyYWZQdHIgX3J2OwogI2lmbmRlZiBDcmVhdGVOZXdQb3J0Ci0JUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlTmV3UG9ydCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlTmV3UG9ydCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ3JlYXRlTmV3UG9ydCgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgR3JhZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENyZWF0ZU5ld1BvcnQoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1NldFFERXJyb3IoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIGVycjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgZXJyOwogI2lmbmRlZiBTZXRRREVycm9yCi0JUHlNYWNfUFJFQ0hFQ0soU2V0UURFcnJvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0UURFcnJvcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmVycikpCi0JCXJldHVybiBOVUxMOwotCVNldFFERXJyb3IoZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRRREVycm9yKGVycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0xNR2V0U2NyVlJlcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JU0ludDE2IF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgU0ludDE2IF9ydjsKICNpZm5kZWYgTE1HZXRTY3JWUmVzCi0JUHlNYWNfUFJFQ0hFQ0soTE1HZXRTY3JWUmVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhMTUdldFNjclZSZXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IExNR2V0U2NyVlJlcygpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBMTUdldFNjclZSZXMoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9MTVNldFNjclZSZXMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVNJbnQxNiB2YWx1ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgU0ludDE2IHZhbHVlOwogI2lmbmRlZiBMTVNldFNjclZSZXMKLQlQeU1hY19QUkVDSEVDSyhMTVNldFNjclZSZXMpOworICAgIFB5TWFjX1BSRUNIRUNLKExNU2V0U2NyVlJlcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTE1TZXRTY3JWUmVzKHZhbHVlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIExNU2V0U2NyVlJlcyh2YWx1ZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0xNR2V0U2NySFJlcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JU0ludDE2IF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgU0ludDE2IF9ydjsKICNpZm5kZWYgTE1HZXRTY3JIUmVzCi0JUHlNYWNfUFJFQ0hFQ0soTE1HZXRTY3JIUmVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhMTUdldFNjckhSZXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IExNR2V0U2NySFJlcygpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBMTUdldFNjckhSZXMoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9MTVNldFNjckhSZXMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVNJbnQxNiB2YWx1ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgU0ludDE2IHZhbHVlOwogI2lmbmRlZiBMTVNldFNjckhSZXMKLQlQeU1hY19QUkVDSEVDSyhMTVNldFNjckhSZXMpOworICAgIFB5TWFjX1BSRUNIRUNLKExNU2V0U2NySFJlcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTE1TZXRTY3JIUmVzKHZhbHVlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIExNU2V0U2NySFJlcyh2YWx1ZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0xNR2V0TWFpbkRldmljZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JR0RIYW5kbGUgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBHREhhbmRsZSBfcnY7CiAjaWZuZGVmIExNR2V0TWFpbkRldmljZQotCVB5TWFjX1BSRUNIRUNLKExNR2V0TWFpbkRldmljZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTE1HZXRNYWluRGV2aWNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBMTUdldE1haW5EZXZpY2UoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IExNR2V0TWFpbkRldmljZSgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9MTVNldE1haW5EZXZpY2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUdESGFuZGxlIHZhbHVlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBHREhhbmRsZSB2YWx1ZTsKICNpZm5kZWYgTE1TZXRNYWluRGV2aWNlCi0JUHlNYWNfUFJFQ0hFQ0soTE1TZXRNYWluRGV2aWNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhMTVNldE1haW5EZXZpY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnZhbHVlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTE1TZXRNYWluRGV2aWNlKHZhbHVlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnZhbHVlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTE1TZXRNYWluRGV2aWNlKHZhbHVlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfTE1HZXREZXZpY2VMaXN0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlHREhhbmRsZSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEdESGFuZGxlIF9ydjsKICNpZm5kZWYgTE1HZXREZXZpY2VMaXN0Ci0JUHlNYWNfUFJFQ0hFQ0soTE1HZXREZXZpY2VMaXN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhMTUdldERldmljZUxpc3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IExNR2V0RGV2aWNlTGlzdCgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTE1HZXREZXZpY2VMaXN0KCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0xNU2V0RGV2aWNlTGlzdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JR0RIYW5kbGUgdmFsdWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEdESGFuZGxlIHZhbHVlOwogI2lmbmRlZiBMTVNldERldmljZUxpc3QKLQlQeU1hY19QUkVDSEVDSyhMTVNldERldmljZUxpc3QpOworICAgIFB5TWFjX1BSRUNIRUNLKExNU2V0RGV2aWNlTGlzdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdmFsdWUpKQotCQlyZXR1cm4gTlVMTDsKLQlMTVNldERldmljZUxpc3QodmFsdWUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdmFsdWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBMTVNldERldmljZUxpc3QodmFsdWUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9MTUdldFFEQ29sb3JzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlIYW5kbGUgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBIYW5kbGUgX3J2OwogI2lmbmRlZiBMTUdldFFEQ29sb3JzCi0JUHlNYWNfUFJFQ0hFQ0soTE1HZXRRRENvbG9ycyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTE1HZXRRRENvbG9ycyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTE1HZXRRRENvbG9ycygpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTE1HZXRRRENvbG9ycygpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9MTVNldFFEQ29sb3JzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlIYW5kbGUgdmFsdWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEhhbmRsZSB2YWx1ZTsKICNpZm5kZWYgTE1TZXRRRENvbG9ycwotCVB5TWFjX1BSRUNIRUNLKExNU2V0UURDb2xvcnMpOworICAgIFB5TWFjX1BSRUNIRUNLKExNU2V0UURDb2xvcnMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnZhbHVlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTE1TZXRRRENvbG9ycyh2YWx1ZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ2YWx1ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIExNU2V0UURDb2xvcnModmFsdWUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9MTUdldFdpZHRoTGlzdEhhbmQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUhhbmRsZSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEhhbmRsZSBfcnY7CiAjaWZuZGVmIExNR2V0V2lkdGhMaXN0SGFuZAotCVB5TWFjX1BSRUNIRUNLKExNR2V0V2lkdGhMaXN0SGFuZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTE1HZXRXaWR0aExpc3RIYW5kKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBMTUdldFdpZHRoTGlzdEhhbmQoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IExNR2V0V2lkdGhMaXN0SGFuZCgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9MTVNldFdpZHRoTGlzdEhhbmQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUhhbmRsZSB2YWx1ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgSGFuZGxlIHZhbHVlOwogI2lmbmRlZiBMTVNldFdpZHRoTGlzdEhhbmQKLQlQeU1hY19QUkVDSEVDSyhMTVNldFdpZHRoTGlzdEhhbmQpOworICAgIFB5TWFjX1BSRUNIRUNLKExNU2V0V2lkdGhMaXN0SGFuZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdmFsdWUpKQotCQlyZXR1cm4gTlVMTDsKLQlMTVNldFdpZHRoTGlzdEhhbmQodmFsdWUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdmFsdWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBMTVNldFdpZHRoTGlzdEhhbmQodmFsdWUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9MTUdldEhpbGl0ZU1vZGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVVJbnQ4IF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVUludDggX3J2OwogI2lmbmRlZiBMTUdldEhpbGl0ZU1vZGUKLQlQeU1hY19QUkVDSEVDSyhMTUdldEhpbGl0ZU1vZGUpOworICAgIFB5TWFjX1BSRUNIRUNLKExNR2V0SGlsaXRlTW9kZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTE1HZXRIaWxpdGVNb2RlKCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IExNR2V0SGlsaXRlTW9kZSgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0xNU2V0SGlsaXRlTW9kZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVUludDggdmFsdWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFVJbnQ4IHZhbHVlOwogI2lmbmRlZiBMTVNldEhpbGl0ZU1vZGUKLQlQeU1hY19QUkVDSEVDSyhMTVNldEhpbGl0ZU1vZGUpOworICAgIFB5TWFjX1BSRUNIRUNLKExNU2V0SGlsaXRlTW9kZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTE1TZXRIaWxpdGVNb2RlKHZhbHVlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIExNU2V0SGlsaXRlTW9kZSh2YWx1ZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0xNR2V0V2lkdGhUYWJIYW5kbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUhhbmRsZSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEhhbmRsZSBfcnY7CiAjaWZuZGVmIExNR2V0V2lkdGhUYWJIYW5kbGUKLQlQeU1hY19QUkVDSEVDSyhMTUdldFdpZHRoVGFiSGFuZGxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhMTUdldFdpZHRoVGFiSGFuZGxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBMTUdldFdpZHRoVGFiSGFuZGxlKCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBMTUdldFdpZHRoVGFiSGFuZGxlKCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0xNU2V0V2lkdGhUYWJIYW5kbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUhhbmRsZSB2YWx1ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgSGFuZGxlIHZhbHVlOwogI2lmbmRlZiBMTVNldFdpZHRoVGFiSGFuZGxlCi0JUHlNYWNfUFJFQ0hFQ0soTE1TZXRXaWR0aFRhYkhhbmRsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTE1TZXRXaWR0aFRhYkhhbmRsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdmFsdWUpKQotCQlyZXR1cm4gTlVMTDsKLQlMTVNldFdpZHRoVGFiSGFuZGxlKHZhbHVlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnZhbHVlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTE1TZXRXaWR0aFRhYkhhbmRsZSh2YWx1ZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0xNR2V0TGFzdFNQRXh0cmEoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVNJbnQzMiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFNJbnQzMiBfcnY7CiAjaWZuZGVmIExNR2V0TGFzdFNQRXh0cmEKLQlQeU1hY19QUkVDSEVDSyhMTUdldExhc3RTUEV4dHJhKTsKKyAgICBQeU1hY19QUkVDSEVDSyhMTUdldExhc3RTUEV4dHJhKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBMTUdldExhc3RTUEV4dHJhKCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IExNR2V0TGFzdFNQRXh0cmEoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9MTVNldExhc3RTUEV4dHJhKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTSW50MzIgdmFsdWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFNJbnQzMiB2YWx1ZTsKICNpZm5kZWYgTE1TZXRMYXN0U1BFeHRyYQotCVB5TWFjX1BSRUNIRUNLKExNU2V0TGFzdFNQRXh0cmEpOworICAgIFB5TWFjX1BSRUNIRUNLKExNU2V0TGFzdFNQRXh0cmEpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSkpCi0JCXJldHVybiBOVUxMOwotCUxNU2V0TGFzdFNQRXh0cmEodmFsdWUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTE1TZXRMYXN0U1BFeHRyYSh2YWx1ZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0xNR2V0TGFzdEZPTkQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUhhbmRsZSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEhhbmRsZSBfcnY7CiAjaWZuZGVmIExNR2V0TGFzdEZPTkQKLQlQeU1hY19QUkVDSEVDSyhMTUdldExhc3RGT05EKTsKKyAgICBQeU1hY19QUkVDSEVDSyhMTUdldExhc3RGT05EKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBMTUdldExhc3RGT05EKCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBMTUdldExhc3RGT05EKCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0xNU2V0TGFzdEZPTkQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUhhbmRsZSB2YWx1ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgSGFuZGxlIHZhbHVlOwogI2lmbmRlZiBMTVNldExhc3RGT05ECi0JUHlNYWNfUFJFQ0hFQ0soTE1TZXRMYXN0Rk9ORCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTE1TZXRMYXN0Rk9ORCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdmFsdWUpKQotCQlyZXR1cm4gTlVMTDsKLQlMTVNldExhc3RGT05EKHZhbHVlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnZhbHVlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTE1TZXRMYXN0Rk9ORCh2YWx1ZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0xNR2V0RnJhY3RFbmFibGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVVJbnQ4IF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVUludDggX3J2OwogI2lmbmRlZiBMTUdldEZyYWN0RW5hYmxlCi0JUHlNYWNfUFJFQ0hFQ0soTE1HZXRGcmFjdEVuYWJsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTE1HZXRGcmFjdEVuYWJsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTE1HZXRGcmFjdEVuYWJsZSgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBMTUdldEZyYWN0RW5hYmxlKCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfTE1TZXRGcmFjdEVuYWJsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVUludDggdmFsdWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFVJbnQ4IHZhbHVlOwogI2lmbmRlZiBMTVNldEZyYWN0RW5hYmxlCi0JUHlNYWNfUFJFQ0hFQ0soTE1TZXRGcmFjdEVuYWJsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTE1TZXRGcmFjdEVuYWJsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTE1TZXRGcmFjdEVuYWJsZSh2YWx1ZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBMTVNldEZyYWN0RW5hYmxlKHZhbHVlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfTE1HZXRUaGVHRGV2aWNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlHREhhbmRsZSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEdESGFuZGxlIF9ydjsKICNpZm5kZWYgTE1HZXRUaGVHRGV2aWNlCi0JUHlNYWNfUFJFQ0hFQ0soTE1HZXRUaGVHRGV2aWNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhMTUdldFRoZUdEZXZpY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IExNR2V0VGhlR0RldmljZSgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTE1HZXRUaGVHRGV2aWNlKCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0xNU2V0VGhlR0RldmljZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JR0RIYW5kbGUgdmFsdWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEdESGFuZGxlIHZhbHVlOwogI2lmbmRlZiBMTVNldFRoZUdEZXZpY2UKLQlQeU1hY19QUkVDSEVDSyhMTVNldFRoZUdEZXZpY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKExNU2V0VGhlR0RldmljZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdmFsdWUpKQotCQlyZXR1cm4gTlVMTDsKLQlMTVNldFRoZUdEZXZpY2UodmFsdWUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdmFsdWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBMTVNldFRoZUdEZXZpY2UodmFsdWUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9MTUdldEhpbGl0ZVJHQihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUkdCQ29sb3IgaGlsaXRlUkdCVmFsdWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJHQkNvbG9yIGhpbGl0ZVJHQlZhbHVlOwogI2lmbmRlZiBMTUdldEhpbGl0ZVJHQgotCVB5TWFjX1BSRUNIRUNLKExNR2V0SGlsaXRlUkdCKTsKKyAgICBQeU1hY19QUkVDSEVDSyhMTUdldEhpbGl0ZVJHQik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTE1HZXRIaWxpdGVSR0IoJmhpbGl0ZVJHQlZhbHVlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFFkUkdCX05ldywgJmhpbGl0ZVJHQlZhbHVlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTE1HZXRIaWxpdGVSR0IoJmhpbGl0ZVJHQlZhbHVlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFFkUkdCX05ldywgJmhpbGl0ZVJHQlZhbHVlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9MTVNldEhpbGl0ZVJHQihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUkdCQ29sb3IgaGlsaXRlUkdCVmFsdWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJHQkNvbG9yIGhpbGl0ZVJHQlZhbHVlOwogI2lmbmRlZiBMTVNldEhpbGl0ZVJHQgotCVB5TWFjX1BSRUNIRUNLKExNU2V0SGlsaXRlUkdCKTsKKyAgICBQeU1hY19QUkVDSEVDSyhMTVNldEhpbGl0ZVJHQik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFFkUkdCX0NvbnZlcnQsICZoaWxpdGVSR0JWYWx1ZSkpCi0JCXJldHVybiBOVUxMOwotCUxNU2V0SGlsaXRlUkdCKCZoaWxpdGVSR0JWYWx1ZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUWRSR0JfQ29udmVydCwgJmhpbGl0ZVJHQlZhbHVlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTE1TZXRIaWxpdGVSR0IoJmhpbGl0ZVJHQlZhbHVlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfTE1HZXRDdXJzb3JOZXcoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKICNpZm5kZWYgTE1HZXRDdXJzb3JOZXcKLQlQeU1hY19QUkVDSEVDSyhMTUdldEN1cnNvck5ldyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTE1HZXRDdXJzb3JOZXcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IExNR2V0Q3Vyc29yTmV3KCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IExNR2V0Q3Vyc29yTmV3KCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfTE1TZXRDdXJzb3JOZXcoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gdmFsdWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gdmFsdWU7CiAjaWZuZGVmIExNU2V0Q3Vyc29yTmV3Ci0JUHlNYWNfUFJFQ0hFQ0soTE1TZXRDdXJzb3JOZXcpOworICAgIFB5TWFjX1BSRUNIRUNLKExNU2V0Q3Vyc29yTmV3KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpKQotCQlyZXR1cm4gTlVMTDsKLQlMTVNldEN1cnNvck5ldyh2YWx1ZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBMTVNldEN1cnNvck5ldyh2YWx1ZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1RleHRGb250KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBmb250OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBmb250OwogI2lmbmRlZiBUZXh0Rm9udAotCVB5TWFjX1BSRUNIRUNLKFRleHRGb250KTsKKyAgICBQeU1hY19QUkVDSEVDSyhUZXh0Rm9udCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZvbnQpKQotCQlyZXR1cm4gTlVMTDsKLQlUZXh0Rm9udChmb250KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmb250KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVGV4dEZvbnQoZm9udCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1RleHRGYWNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTdHlsZVBhcmFtZXRlciBmYWNlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTdHlsZVBhcmFtZXRlciBmYWNlOwogI2lmbmRlZiBUZXh0RmFjZQotCVB5TWFjX1BSRUNIRUNLKFRleHRGYWNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUZXh0RmFjZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZhY2UpKQotCQlyZXR1cm4gTlVMTDsKLQlUZXh0RmFjZShmYWNlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmYWNlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVGV4dEZhY2UoZmFjZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1RleHRNb2RlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBtb2RlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBtb2RlOwogI2lmbmRlZiBUZXh0TW9kZQotCVB5TWFjX1BSRUNIRUNLKFRleHRNb2RlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUZXh0TW9kZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vZGUpKQotCQlyZXR1cm4gTlVMTDsKLQlUZXh0TW9kZShtb2RlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtb2RlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVGV4dE1vZGUobW9kZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1RleHRTaXplKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBzaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBzaXplOwogI2lmbmRlZiBUZXh0U2l6ZQotCVB5TWFjX1BSRUNIRUNLKFRleHRTaXplKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUZXh0U2l6ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNpemUpKQotCQlyZXR1cm4gTlVMTDsKLQlUZXh0U2l6ZShzaXplKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVGV4dFNpemUoc2l6ZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1NwYWNlRXh0cmEoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUZpeGVkIGV4dHJhOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBGaXhlZCBleHRyYTsKICNpZm5kZWYgU3BhY2VFeHRyYQotCVB5TWFjX1BSRUNIRUNLKFNwYWNlRXh0cmEpOworICAgIFB5TWFjX1BSRUNIRUNLKFNwYWNlRXh0cmEpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJmV4dHJhKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU3BhY2VFeHRyYShleHRyYSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZleHRyYSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNwYWNlRXh0cmEoZXh0cmEpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9EcmF3Q2hhcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ2hhclBhcmFtZXRlciBjaDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ2hhclBhcmFtZXRlciBjaDsKICNpZm5kZWYgRHJhd0NoYXIKLQlQeU1hY19QUkVDSEVDSyhEcmF3Q2hhcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soRHJhd0NoYXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZjaCkpCi0JCXJldHVybiBOVUxMOwotCURyYXdDaGFyKGNoKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIERyYXdDaGFyKGNoKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfRHJhd1N0cmluZyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JU3RyMjU1IHM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFN0cjI1NSBzOwogI2lmbmRlZiBEcmF3U3RyaW5nCi0JUHlNYWNfUFJFQ0hFQ0soRHJhd1N0cmluZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRHJhd1N0cmluZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgcykpCi0JCXJldHVybiBOVUxMOwotCURyYXdTdHJpbmcocyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgRHJhd1N0cmluZyhzKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfTWFjRHJhd1RleHQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWNoYXIgKnRleHRCdWZfX2luX187Ci0JaW50IHRleHRCdWZfX2luX2xlbl9fOwotCXNob3J0IGZpcnN0Qnl0ZTsKLQlzaG9ydCBieXRlQ291bnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGNoYXIgKnRleHRCdWZfX2luX187CisgICAgaW50IHRleHRCdWZfX2luX2xlbl9fOworICAgIHNob3J0IGZpcnN0Qnl0ZTsKKyAgICBzaG9ydCBieXRlQ291bnQ7CiAjaWZuZGVmIE1hY0RyYXdUZXh0Ci0JUHlNYWNfUFJFQ0hFQ0soTWFjRHJhd1RleHQpOworICAgIFB5TWFjX1BSRUNIRUNLKE1hY0RyYXdUZXh0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInMjaGgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGV4dEJ1Zl9faW5fXywgJnRleHRCdWZfX2luX2xlbl9fLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmlyc3RCeXRlLAotCSAgICAgICAgICAgICAgICAgICAgICAmYnl0ZUNvdW50KSkKLQkJcmV0dXJuIE5VTEw7Ci0JLyogRm9vbCBjb21waWxlciB3YXJuaW5ncyAqLwotCXRleHRCdWZfX2luX2xlbl9fID0gdGV4dEJ1Zl9faW5fbGVuX187Ci0JTWFjRHJhd1RleHQodGV4dEJ1Zl9faW5fXywKLQkgICAgICAgICAgICBmaXJzdEJ5dGUsCi0JICAgICAgICAgICAgYnl0ZUNvdW50KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAicyNoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZXh0QnVmX19pbl9fLCAmdGV4dEJ1Zl9faW5fbGVuX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmaXJzdEJ5dGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZieXRlQ291bnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAvKiBGb29sIGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgdGV4dEJ1Zl9faW5fbGVuX18gPSB0ZXh0QnVmX19pbl9sZW5fXzsKKyAgICBNYWNEcmF3VGV4dCh0ZXh0QnVmX19pbl9fLAorICAgICAgICAgICAgICAgIGZpcnN0Qnl0ZSwKKyAgICAgICAgICAgICAgICBieXRlQ291bnQpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9DaGFyV2lkdGgoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IF9ydjsKLQlDaGFyUGFyYW1ldGVyIGNoOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBfcnY7CisgICAgQ2hhclBhcmFtZXRlciBjaDsKICNpZm5kZWYgQ2hhcldpZHRoCi0JUHlNYWNfUFJFQ0hFQ0soQ2hhcldpZHRoKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDaGFyV2lkdGgpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZjaCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENoYXJXaWR0aChjaCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENoYXJXaWR0aChjaCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfU3RyaW5nV2lkdGgoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IF9ydjsKLQlTdHIyNTUgczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgX3J2OworICAgIFN0cjI1NSBzOwogI2lmbmRlZiBTdHJpbmdXaWR0aAotCVB5TWFjX1BSRUNIRUNLKFN0cmluZ1dpZHRoKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTdHJpbmdXaWR0aCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgcykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFN0cmluZ1dpZHRoKHMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU3RyaW5nV2lkdGgocyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfVGV4dFdpZHRoKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBfcnY7Ci0JY2hhciAqdGV4dEJ1Zl9faW5fXzsKLQlpbnQgdGV4dEJ1Zl9faW5fbGVuX187Ci0Jc2hvcnQgZmlyc3RCeXRlOwotCXNob3J0IGJ5dGVDb3VudDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgX3J2OworICAgIGNoYXIgKnRleHRCdWZfX2luX187CisgICAgaW50IHRleHRCdWZfX2luX2xlbl9fOworICAgIHNob3J0IGZpcnN0Qnl0ZTsKKyAgICBzaG9ydCBieXRlQ291bnQ7CiAjaWZuZGVmIFRleHRXaWR0aAotCVB5TWFjX1BSRUNIRUNLKFRleHRXaWR0aCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVGV4dFdpZHRoKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInMjaGgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGV4dEJ1Zl9faW5fXywgJnRleHRCdWZfX2luX2xlbl9fLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmlyc3RCeXRlLAotCSAgICAgICAgICAgICAgICAgICAgICAmYnl0ZUNvdW50KSkKLQkJcmV0dXJuIE5VTEw7Ci0JLyogRm9vbCBjb21waWxlciB3YXJuaW5ncyAqLwotCXRleHRCdWZfX2luX2xlbl9fID0gdGV4dEJ1Zl9faW5fbGVuX187Ci0JX3J2ID0gVGV4dFdpZHRoKHRleHRCdWZfX2luX18sCi0JICAgICAgICAgICAgICAgIGZpcnN0Qnl0ZSwKLQkgICAgICAgICAgICAgICAgYnl0ZUNvdW50KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzI2hoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRleHRCdWZfX2luX18sICZ0ZXh0QnVmX19pbl9sZW5fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpcnN0Qnl0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ5dGVDb3VudCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIC8qIEZvb2wgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICB0ZXh0QnVmX19pbl9sZW5fXyA9IHRleHRCdWZfX2luX2xlbl9fOworICAgIF9ydiA9IFRleHRXaWR0aCh0ZXh0QnVmX19pbl9fLAorICAgICAgICAgICAgICAgICAgICBmaXJzdEJ5dGUsCisgICAgICAgICAgICAgICAgICAgIGJ5dGVDb3VudCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfR2V0Rm9udEluZm8oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUZvbnRJbmZvIGluZm87CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEZvbnRJbmZvIGluZm87CiAjaWZuZGVmIEdldEZvbnRJbmZvCi0JUHlNYWNfUFJFQ0hFQ0soR2V0Rm9udEluZm8pOworICAgIFB5TWFjX1BSRUNIRUNLKEdldEZvbnRJbmZvKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlHZXRGb250SW5mbygmaW5mbyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBRZEZJX05ldywgJmluZm8pOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRGb250SW5mbygmaW5mbyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBRZEZJX05ldywgJmluZm8pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0NoYXJFeHRyYShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JRml4ZWQgZXh0cmE7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEZpeGVkIGV4dHJhOwogI2lmbmRlZiBDaGFyRXh0cmEKLQlQeU1hY19QUkVDSEVDSyhDaGFyRXh0cmEpOworICAgIFB5TWFjX1BSRUNIRUNLKENoYXJFeHRyYSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmZXh0cmEpKQotCQlyZXR1cm4gTlVMTDsKLQlDaGFyRXh0cmEoZXh0cmEpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmZXh0cmEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDaGFyRXh0cmEoZXh0cmEpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9UcnVuY1N0cmluZyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgX3J2OwotCXNob3J0IHdpZHRoOwotCVN0cjI1NSB0aGVTdHJpbmc7Ci0JVHJ1bmNDb2RlIHRydW5jV2hlcmU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IF9ydjsKKyAgICBzaG9ydCB3aWR0aDsKKyAgICBTdHIyNTUgdGhlU3RyaW5nOworICAgIFRydW5jQ29kZSB0cnVuY1doZXJlOwogI2lmbmRlZiBUcnVuY1N0cmluZwotCVB5TWFjX1BSRUNIRUNLKFRydW5jU3RyaW5nKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUcnVuY1N0cmluZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJndpZHRoLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIHRoZVN0cmluZywKLQkgICAgICAgICAgICAgICAgICAgICAgJnRydW5jV2hlcmUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBUcnVuY1N0cmluZyh3aWR0aCwKLQkgICAgICAgICAgICAgICAgICB0aGVTdHJpbmcsCi0JICAgICAgICAgICAgICAgICAgdHJ1bmNXaGVyZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCB0aGVTdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cnVuY1doZXJlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVHJ1bmNTdHJpbmcod2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgdGhlU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgIHRydW5jV2hlcmUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1NldFBvcnQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUdyYWZQdHIgdGhlUG9ydDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgR3JhZlB0ciB0aGVQb3J0OwogI2lmbmRlZiBTZXRQb3J0Ci0JUHlNYWNfUFJFQ0hFQ0soU2V0UG9ydCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0UG9ydCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfQ29udmVydCwgJnRoZVBvcnQpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRQb3J0KHRoZVBvcnQpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfQ29udmVydCwgJnRoZVBvcnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRQb3J0KHRoZVBvcnQpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9HZXRDdXJzb3IoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUN1cnNIYW5kbGUgX3J2OwotCXNob3J0IGN1cnNvcklEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDdXJzSGFuZGxlIF9ydjsKKyAgICBzaG9ydCBjdXJzb3JJRDsKICNpZm5kZWYgR2V0Q3Vyc29yCi0JUHlNYWNfUFJFQ0hFQ0soR2V0Q3Vyc29yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRDdXJzb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZjdXJzb3JJRCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldEN1cnNvcihjdXJzb3JJRCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY3Vyc29ySUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRDdXJzb3IoY3Vyc29ySUQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9TZXRDdXJzb3IoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUN1cnNvciAqY3Jzcl9faW5fXzsKLQlpbnQgY3Jzcl9faW5fbGVuX187CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEN1cnNvciAqY3Jzcl9faW5fXzsKKyAgICBpbnQgY3Jzcl9faW5fbGVuX187CiAjaWZuZGVmIFNldEN1cnNvcgotCVB5TWFjX1BSRUNIRUNLKFNldEN1cnNvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0Q3Vyc29yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInMjIiwKLQkgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKiopJmNyc3JfX2luX18sICZjcnNyX19pbl9sZW5fXykpCi0JCXJldHVybiBOVUxMOwotCWlmIChjcnNyX19pbl9sZW5fXyAhPSBzaXplb2YoQ3Vyc29yKSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJidWZmZXIgbGVuZ3RoIHNob3VsZCBiZSBzaXplb2YoQ3Vyc29yKSIpOwotCQlnb3RvIGNyc3JfX2Vycm9yX187Ci0JfQotCVNldEN1cnNvcihjcnNyX19pbl9fKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAicyMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKikmY3Jzcl9faW5fXywgJmNyc3JfX2luX2xlbl9fKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKGNyc3JfX2luX2xlbl9fICE9IHNpemVvZihDdXJzb3IpKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImJ1ZmZlciBsZW5ndGggc2hvdWxkIGJlIHNpemVvZihDdXJzb3IpIik7CisgICAgICAgIGdvdG8gY3Jzcl9fZXJyb3JfXzsKKyAgICB9CisgICAgU2V0Q3Vyc29yKGNyc3JfX2luX18pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKICBjcnNyX19lcnJvcl9fOiA7Ci0JcmV0dXJuIF9yZXM7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfU2hvd0N1cnNvcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBTaG93Q3Vyc29yCi0JUHlNYWNfUFJFQ0hFQ0soU2hvd0N1cnNvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2hvd0N1cnNvcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2hvd0N1cnNvcigpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2hvd0N1cnNvcigpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9MaW5lVG8oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IGg7Ci0Jc2hvcnQgdjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgaDsKKyAgICBzaG9ydCB2OwogI2lmbmRlZiBMaW5lVG8KLQlQeU1hY19QUkVDSEVDSyhMaW5lVG8pOworICAgIFB5TWFjX1BSRUNIRUNLKExpbmVUbyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZoLAotCSAgICAgICAgICAgICAgICAgICAgICAmdikpCi0JCXJldHVybiBOVUxMOwotCUxpbmVUbyhoLAotCSAgICAgICB2KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBMaW5lVG8oaCwKKyAgICAgICAgICAgdik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1NldFJlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3QgcjsKLQlzaG9ydCBsZWZ0OwotCXNob3J0IHRvcDsKLQlzaG9ydCByaWdodDsKLQlzaG9ydCBib3R0b207CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlY3QgcjsKKyAgICBzaG9ydCBsZWZ0OworICAgIHNob3J0IHRvcDsKKyAgICBzaG9ydCByaWdodDsKKyAgICBzaG9ydCBib3R0b207CiAjaWZuZGVmIFNldFJlY3QKLQlQeU1hY19QUkVDSEVDSyhTZXRSZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRSZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoaGgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmbGVmdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRvcCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJpZ2h0LAotCSAgICAgICAgICAgICAgICAgICAgICAmYm90dG9tKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0UmVjdCgmciwKLQkgICAgICAgIGxlZnQsCi0JICAgICAgICB0b3AsCi0JICAgICAgICByaWdodCwKLQkgICAgICAgIGJvdHRvbSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZyKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaGhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdHRvbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldFJlY3QoJnIsCisgICAgICAgIGxlZnQsCisgICAgICAgIHRvcCwKKyAgICAgICAgcmlnaHQsCisgICAgICAgIGJvdHRvbSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZyKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9PZmZzZXRSZWN0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZWN0IHI7Ci0Jc2hvcnQgZGg7Ci0Jc2hvcnQgZHY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlY3QgcjsKKyAgICBzaG9ydCBkaDsKKyAgICBzaG9ydCBkdjsKICNpZm5kZWYgT2Zmc2V0UmVjdAotCVB5TWFjX1BSRUNIRUNLKE9mZnNldFJlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKE9mZnNldFJlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZkdikpCi0JCXJldHVybiBOVUxMOwotCU9mZnNldFJlY3QoJnIsCi0JICAgICAgICAgICBkaCwKLQkgICAgICAgICAgIGR2KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJnIpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZHYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBPZmZzZXRSZWN0KCZyLAorICAgICAgICAgICAgICAgZGgsCisgICAgICAgICAgICAgICBkdik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZyKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9JbnNldFJlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3QgcjsKLQlzaG9ydCBkaDsKLQlzaG9ydCBkdjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmVjdCByOworICAgIHNob3J0IGRoOworICAgIHNob3J0IGR2OwogI2lmbmRlZiBJbnNldFJlY3QKLQlQeU1hY19QUkVDSEVDSyhJbnNldFJlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKEluc2V0UmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIsCi0JICAgICAgICAgICAgICAgICAgICAgICZkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmR2KSkKLQkJcmV0dXJuIE5VTEw7Ci0JSW5zZXRSZWN0KCZyLAotCSAgICAgICAgICBkaCwKLQkgICAgICAgICAgZHYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmcik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkdikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEluc2V0UmVjdCgmciwKKyAgICAgICAgICAgICAgZGgsCisgICAgICAgICAgICAgIGR2KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJnIpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1VuaW9uUmVjdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVjdCBzcmMxOwotCVJlY3Qgc3JjMjsKLQlSZWN0IGRzdFJlY3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlY3Qgc3JjMTsKKyAgICBSZWN0IHNyYzI7CisgICAgUmVjdCBkc3RSZWN0OwogI2lmbmRlZiBVbmlvblJlY3QKLQlQeU1hY19QUkVDSEVDSyhVbmlvblJlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKFVuaW9uUmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnNyYzEsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZzcmMyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JVW5pb25SZWN0KCZzcmMxLAotCSAgICAgICAgICAmc3JjMiwKLQkgICAgICAgICAgJmRzdFJlY3QpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmZHN0UmVjdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmc3JjMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFVuaW9uUmVjdCgmc3JjMSwKKyAgICAgICAgICAgICAgJnNyYzIsCisgICAgICAgICAgICAgICZkc3RSZWN0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmRzdFJlY3QpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0VxdWFsUmVjdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JUmVjdCByZWN0MTsKLQlSZWN0IHJlY3QyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBSZWN0IHJlY3QxOworICAgIFJlY3QgcmVjdDI7CiAjaWZuZGVmIEVxdWFsUmVjdAotCVB5TWFjX1BSRUNIRUNLKEVxdWFsUmVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRXF1YWxSZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmcmVjdDEsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyZWN0MikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEVxdWFsUmVjdCgmcmVjdDEsCi0JICAgICAgICAgICAgICAgICZyZWN0Mik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyZWN0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnJlY3QyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRXF1YWxSZWN0KCZyZWN0MSwKKyAgICAgICAgICAgICAgICAgICAgJnJlY3QyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9GcmFtZVJlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3QgcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmVjdCByOwogI2lmbmRlZiBGcmFtZVJlY3QKLQlQeU1hY19QUkVDSEVDSyhGcmFtZVJlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKEZyYW1lUmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JRnJhbWVSZWN0KCZyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEZyYW1lUmVjdCgmcik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0ludmVydFJlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3QgcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmVjdCByOwogI2lmbmRlZiBJbnZlcnRSZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soSW52ZXJ0UmVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSW52ZXJ0UmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JSW52ZXJ0UmVjdCgmcik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBJbnZlcnRSZWN0KCZyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfRmlsbFJlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3QgcjsKLQlQYXR0ZXJuICpwYXRfX2luX187Ci0JaW50IHBhdF9faW5fbGVuX187CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlY3QgcjsKKyAgICBQYXR0ZXJuICpwYXRfX2luX187CisgICAgaW50IHBhdF9faW5fbGVuX187CiAjaWZuZGVmIEZpbGxSZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soRmlsbFJlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKEZpbGxSZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyMiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmciwKLQkgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKiopJnBhdF9faW5fXywgJnBhdF9faW5fbGVuX18pKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAocGF0X19pbl9sZW5fXyAhPSBzaXplb2YoUGF0dGVybikpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYnVmZmVyIGxlbmd0aCBzaG91bGQgYmUgc2l6ZW9mKFBhdHRlcm4pIik7Ci0JCWdvdG8gcGF0X19lcnJvcl9fOwotCX0KLQlGaWxsUmVjdCgmciwKLQkgICAgICAgICBwYXRfX2luX18pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnMjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICoqKSZwYXRfX2luX18sICZwYXRfX2luX2xlbl9fKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKHBhdF9faW5fbGVuX18gIT0gc2l6ZW9mKFBhdHRlcm4pKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImJ1ZmZlciBsZW5ndGggc2hvdWxkIGJlIHNpemVvZihQYXR0ZXJuKSIpOworICAgICAgICBnb3RvIHBhdF9fZXJyb3JfXzsKKyAgICB9CisgICAgRmlsbFJlY3QoJnIsCisgICAgICAgICAgICAgcGF0X19pbl9fKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CiAgcGF0X19lcnJvcl9fOiA7Ci0JcmV0dXJuIF9yZXM7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfQ29weVJnbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIHNyY1JnbjsKLQlSZ25IYW5kbGUgZHN0UmduOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZ25IYW5kbGUgc3JjUmduOworICAgIFJnbkhhbmRsZSBkc3RSZ247CiAjaWZuZGVmIENvcHlSZ24KLQlQeU1hY19QUkVDSEVDSyhDb3B5UmduKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb3B5UmduKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNyY1JnbiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkc3RSZ24pKQotCQlyZXR1cm4gTlVMTDsKLQlDb3B5UmduKHNyY1JnbiwKLQkgICAgICAgIGRzdFJnbik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNyY1JnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkc3RSZ24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDb3B5UmduKHNyY1JnbiwKKyAgICAgICAgZHN0UmduKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfU2V0UmVjdFJnbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIHJnbjsKLQlzaG9ydCBsZWZ0OwotCXNob3J0IHRvcDsKLQlzaG9ydCByaWdodDsKLQlzaG9ydCBib3R0b207CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSByZ247CisgICAgc2hvcnQgbGVmdDsKKyAgICBzaG9ydCB0b3A7CisgICAgc2hvcnQgcmlnaHQ7CisgICAgc2hvcnQgYm90dG9tOwogI2lmbmRlZiBTZXRSZWN0UmduCi0JUHlNYWNfUFJFQ0hFQ0soU2V0UmVjdFJnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0UmVjdFJnbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoaGgiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmxlZnQsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0b3AsCi0JICAgICAgICAgICAgICAgICAgICAgICZyaWdodCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmJvdHRvbSkpCi0JCXJldHVybiBOVUxMOwotCVNldFJlY3RSZ24ocmduLAotCSAgICAgICAgICAgbGVmdCwKLQkgICAgICAgICAgIHRvcCwKLQkgICAgICAgICAgIHJpZ2h0LAotCSAgICAgICAgICAgYm90dG9tKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaGhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZib3R0b20pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRSZWN0UmduKHJnbiwKKyAgICAgICAgICAgICAgIGxlZnQsCisgICAgICAgICAgICAgICB0b3AsCisgICAgICAgICAgICAgICByaWdodCwKKyAgICAgICAgICAgICAgIGJvdHRvbSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX09mZnNldFJnbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIHJnbjsKLQlzaG9ydCBkaDsKLQlzaG9ydCBkdjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIHJnbjsKKyAgICBzaG9ydCBkaDsKKyAgICBzaG9ydCBkdjsKICNpZm5kZWYgT2Zmc2V0UmduCi0JUHlNYWNfUFJFQ0hFQ0soT2Zmc2V0UmduKTsKKyAgICBQeU1hY19QUkVDSEVDSyhPZmZzZXRSZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmduLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZkdikpCi0JCXJldHVybiBOVUxMOwotCU9mZnNldFJnbihyZ24sCi0JICAgICAgICAgIGRoLAotCSAgICAgICAgICBkdik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZHYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBPZmZzZXRSZ24ocmduLAorICAgICAgICAgICAgICBkaCwKKyAgICAgICAgICAgICAgZHYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9VbmlvblJnbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIHNyY1JnbkE7Ci0JUmduSGFuZGxlIHNyY1JnbkI7Ci0JUmduSGFuZGxlIGRzdFJnbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIHNyY1JnbkE7CisgICAgUmduSGFuZGxlIHNyY1JnbkI7CisgICAgUmduSGFuZGxlIGRzdFJnbjsKICNpZm5kZWYgVW5pb25SZ24KLQlQeU1hY19QUkVDSEVDSyhVbmlvblJnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soVW5pb25SZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzcmNSZ25BLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNyY1JnbkIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZHN0UmduKSkKLQkJcmV0dXJuIE5VTEw7Ci0JVW5pb25SZ24oc3JjUmduQSwKLQkgICAgICAgICBzcmNSZ25CLAotCSAgICAgICAgIGRzdFJnbik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc3JjUmduQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzcmNSZ25CLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRzdFJnbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFVuaW9uUmduKHNyY1JnbkEsCisgICAgICAgICAgICAgc3JjUmduQiwKKyAgICAgICAgICAgICBkc3RSZ24pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9Yb3JSZ24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJnbkhhbmRsZSBzcmNSZ25BOwotCVJnbkhhbmRsZSBzcmNSZ25COwotCVJnbkhhbmRsZSBkc3RSZ247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSBzcmNSZ25BOworICAgIFJnbkhhbmRsZSBzcmNSZ25COworICAgIFJnbkhhbmRsZSBkc3RSZ247CiAjaWZuZGVmIFhvclJnbgotCVB5TWFjX1BSRUNIRUNLKFhvclJnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soWG9yUmduKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc3JjUmduQSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzcmNSZ25CLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRzdFJnbikpCi0JCXJldHVybiBOVUxMOwotCVhvclJnbihzcmNSZ25BLAotCSAgICAgICBzcmNSZ25CLAotCSAgICAgICBkc3RSZ24pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNyY1JnbkEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc3JjUmduQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkc3RSZ24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBYb3JSZ24oc3JjUmduQSwKKyAgICAgICAgICAgc3JjUmduQiwKKyAgICAgICAgICAgZHN0UmduKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfRXF1YWxSZ24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCVJnbkhhbmRsZSByZ25BOwotCVJnbkhhbmRsZSByZ25COworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBSZ25IYW5kbGUgcmduQTsKKyAgICBSZ25IYW5kbGUgcmduQjsKICNpZm5kZWYgRXF1YWxSZ24KLQlQeU1hY19QUkVDSEVDSyhFcXVhbFJnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soRXF1YWxSZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmduQSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZ25CKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRXF1YWxSZ24ocmduQSwKLQkgICAgICAgICAgICAgICByZ25CKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZ25BLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbkIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBFcXVhbFJnbihyZ25BLAorICAgICAgICAgICAgICAgICAgIHJnbkIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0ZyYW1lUmduKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZ25IYW5kbGUgcmduOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZ25IYW5kbGUgcmduOwogI2lmbmRlZiBGcmFtZVJnbgotCVB5TWFjX1BSRUNIRUNLKEZyYW1lUmduKTsKKyAgICBQeU1hY19QUkVDSEVDSyhGcmFtZVJnbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmduKSkKLQkJcmV0dXJuIE5VTEw7Ci0JRnJhbWVSZ24ocmduKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEZyYW1lUmduKHJnbik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1BhaW50UmduKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZ25IYW5kbGUgcmduOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZ25IYW5kbGUgcmduOwogI2lmbmRlZiBQYWludFJnbgotCVB5TWFjX1BSRUNIRUNLKFBhaW50UmduKTsKKyAgICBQeU1hY19QUkVDSEVDSyhQYWludFJnbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmduKSkKLQkJcmV0dXJuIE5VTEw7Ci0JUGFpbnRSZ24ocmduKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFBhaW50UmduKHJnbik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0ludmVydFJnbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIHJnbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIHJnbjsKICNpZm5kZWYgSW52ZXJ0UmduCi0JUHlNYWNfUFJFQ0hFQ0soSW52ZXJ0UmduKTsKKyAgICBQeU1hY19QUkVDSEVDSyhJbnZlcnRSZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbikpCi0JCXJldHVybiBOVUxMOwotCUludmVydFJnbihyZ24pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmduKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgSW52ZXJ0UmduKHJnbik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0ZpbGxSZ24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJnbkhhbmRsZSByZ247Ci0JUGF0dGVybiAqcGF0X19pbl9fOwotCWludCBwYXRfX2luX2xlbl9fOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZ25IYW5kbGUgcmduOworICAgIFBhdHRlcm4gKnBhdF9faW5fXzsKKyAgICBpbnQgcGF0X19pbl9sZW5fXzsKICNpZm5kZWYgRmlsbFJnbgotCVB5TWFjX1BSRUNIRUNLKEZpbGxSZ24pOworICAgIFB5TWFjX1BSRUNIRUNLKEZpbGxSZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIyIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmduLAotCSAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKikmcGF0X19pbl9fLCAmcGF0X19pbl9sZW5fXykpCi0JCXJldHVybiBOVUxMOwotCWlmIChwYXRfX2luX2xlbl9fICE9IHNpemVvZihQYXR0ZXJuKSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJidWZmZXIgbGVuZ3RoIHNob3VsZCBiZSBzaXplb2YoUGF0dGVybikiKTsKLQkJZ290byBwYXRfX2Vycm9yX187Ci0JfQotCUZpbGxSZ24ocmduLAotCSAgICAgICAgcGF0X19pbl9fKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKikmcGF0X19pbl9fLCAmcGF0X19pbl9sZW5fXykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChwYXRfX2luX2xlbl9fICE9IHNpemVvZihQYXR0ZXJuKSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJidWZmZXIgbGVuZ3RoIHNob3VsZCBiZSBzaXplb2YoUGF0dGVybikiKTsKKyAgICAgICAgZ290byBwYXRfX2Vycm9yX187CisgICAgfQorICAgIEZpbGxSZ24ocmduLAorICAgICAgICBwYXRfX2luX18pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKICBwYXRfX2Vycm9yX186IDsKLQlyZXR1cm4gX3JlczsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9HZXRQaXhlbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0Jc2hvcnQgaDsKLQlzaG9ydCB2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBzaG9ydCBoOworICAgIHNob3J0IHY7CiAjaWZuZGVmIEdldFBpeGVsCi0JUHlNYWNfUFJFQ0hFQ0soR2V0UGl4ZWwpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFBpeGVsKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmgsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0UGl4ZWwoaCwKLQkgICAgICAgICAgICAgICB2KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFBpeGVsKGgsCisgICAgICAgICAgICAgICAgICAgdik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfUHRJblJlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCVBvaW50IHB0OwotCVJlY3QgcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgUG9pbnQgcHQ7CisgICAgUmVjdCByOwogI2lmbmRlZiBQdEluUmVjdAotCVB5TWFjX1BSRUNIRUNLKFB0SW5SZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhQdEluUmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZwdCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBQdEluUmVjdChwdCwKLQkgICAgICAgICAgICAgICAmcik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmcHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gUHRJblJlY3QocHQsCisgICAgICAgICAgICAgICAgICAgJnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0RyYXdUZXh0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQljaGFyICp0ZXh0QnVmX19pbl9fOwotCWludCB0ZXh0QnVmX19pbl9sZW5fXzsKLQlzaG9ydCBmaXJzdEJ5dGU7Ci0Jc2hvcnQgYnl0ZUNvdW50OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBjaGFyICp0ZXh0QnVmX19pbl9fOworICAgIGludCB0ZXh0QnVmX19pbl9sZW5fXzsKKyAgICBzaG9ydCBmaXJzdEJ5dGU7CisgICAgc2hvcnQgYnl0ZUNvdW50OwogI2lmbmRlZiBEcmF3VGV4dAotCVB5TWFjX1BSRUNIRUNLKERyYXdUZXh0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhEcmF3VGV4dCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzI2hoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRleHRCdWZfX2luX18sICZ0ZXh0QnVmX19pbl9sZW5fXywKLQkgICAgICAgICAgICAgICAgICAgICAgJmZpcnN0Qnl0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmJ5dGVDb3VudCkpCi0JCXJldHVybiBOVUxMOwotCS8qIEZvb2wgY29tcGlsZXIgd2FybmluZ3MgKi8KLQl0ZXh0QnVmX19pbl9sZW5fXyA9IHRleHRCdWZfX2luX2xlbl9fOwotCURyYXdUZXh0KHRleHRCdWZfX2luX18sCi0JICAgICAgICAgZmlyc3RCeXRlLAotCSAgICAgICAgIGJ5dGVDb3VudCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInMjaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGV4dEJ1Zl9faW5fXywgJnRleHRCdWZfX2luX2xlbl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlyc3RCeXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYnl0ZUNvdW50KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgLyogRm9vbCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHRleHRCdWZfX2luX2xlbl9fID0gdGV4dEJ1Zl9faW5fbGVuX187CisgICAgRHJhd1RleHQodGV4dEJ1Zl9faW5fXywKKyAgICAgICAgICAgICBmaXJzdEJ5dGUsCisgICAgICAgICAgICAgYnl0ZUNvdW50KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfQml0TWFwKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAKLQlCaXRNYXAgKnB0cjsKLQlQeU9iamVjdCAqc291cmNlOwotCVJlY3QgYm91bmRzOwotCWludCByb3dieXRlczsKLQljaGFyICpkYXRhOworICAgIEJpdE1hcCAqcHRyOworICAgIFB5T2JqZWN0ICpzb3VyY2U7CisgICAgUmVjdCBib3VuZHM7CisgICAgaW50IHJvd2J5dGVzOworICAgIGNoYXIgKmRhdGE7CiAKLQlpZiAoICFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyFpTyYiLCAmUHlTdHJpbmdfVHlwZSwgJnNvdXJjZSwgJnJvd2J5dGVzLCBQeU1hY19HZXRSZWN0LAotCSAgICAgICAgICAgICAgICAmYm91bmRzKSApCi0JICAgICAgICByZXR1cm4gTlVMTDsKLQlkYXRhID0gUHlTdHJpbmdfQXNTdHJpbmcoc291cmNlKTsKLQlpZiAoKHB0cj0oQml0TWFwICopbWFsbG9jKHNpemVvZihCaXRNYXApKSkgPT0gTlVMTCApCi0JICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQlwdHItPmJhc2VBZGRyID0gKFB0cilkYXRhOwotCXB0ci0+cm93Qnl0ZXMgPSByb3dieXRlczsKLQlwdHItPmJvdW5kcyA9IGJvdW5kczsKLQlpZiAoIChfcmVzID0gQk1PYmpfTmV3KHB0cikpID09IE5VTEwgKSB7Ci0JICAgICAgICBmcmVlKHB0cik7Ci0JICAgICAgICByZXR1cm4gTlVMTDsKLQl9Ci0JKChCaXRNYXBPYmplY3QgKilfcmVzKS0+cmVmZXJyZWRfb2JqZWN0ID0gc291cmNlOwotCVB5X0lOQ1JFRihzb3VyY2UpOwotCSgoQml0TWFwT2JqZWN0ICopX3JlcyktPnJlZmVycmVkX2JpdG1hcCA9IHB0cjsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyFpTyYiLCAmUHlTdHJpbmdfVHlwZSwgJnNvdXJjZSwgJnJvd2J5dGVzLCBQeU1hY19HZXRSZWN0LAorICAgICAgICAgICAgICAgICAgICAmYm91bmRzKSApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGRhdGEgPSBQeVN0cmluZ19Bc1N0cmluZyhzb3VyY2UpOworICAgIGlmICgocHRyPShCaXRNYXAgKiltYWxsb2Moc2l6ZW9mKEJpdE1hcCkpKSA9PSBOVUxMICkKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgcHRyLT5iYXNlQWRkciA9IChQdHIpZGF0YTsKKyAgICBwdHItPnJvd0J5dGVzID0gcm93Ynl0ZXM7CisgICAgcHRyLT5ib3VuZHMgPSBib3VuZHM7CisgICAgaWYgKCAoX3JlcyA9IEJNT2JqX05ldyhwdHIpKSA9PSBOVUxMICkgeworICAgICAgICBmcmVlKHB0cik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICAoKEJpdE1hcE9iamVjdCAqKV9yZXMpLT5yZWZlcnJlZF9vYmplY3QgPSBzb3VyY2U7CisgICAgUHlfSU5DUkVGKHNvdXJjZSk7CisgICAgKChCaXRNYXBPYmplY3QgKilfcmVzKS0+cmVmZXJyZWRfYml0bWFwID0gcHRyOworICAgIHJldHVybiBfcmVzOwogCiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfUmF3Qml0TWFwKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAKLQlCaXRNYXAgKnB0cjsKLQlQeU9iamVjdCAqc291cmNlOworICAgIEJpdE1hcCAqcHRyOworICAgIFB5T2JqZWN0ICpzb3VyY2U7CiAKLQlpZiAoICFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyEiLCAmUHlTdHJpbmdfVHlwZSwgJnNvdXJjZSkgKQotCSAgICAgICAgcmV0dXJuIE5VTEw7Ci0JaWYgKCBQeVN0cmluZ19TaXplKHNvdXJjZSkgIT0gc2l6ZW9mKEJpdE1hcCkgJiYgUHlTdHJpbmdfU2l6ZShzb3VyY2UpICE9IHNpemVvZihQaXhNYXApICkgewotCSAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkgICAgICAgICAgICAgICAgIkFyZ3VtZW50IHNpemUgd2FzICVsZCwgc2hvdWxkIGJlICVsdSAoc2l6ZW9mIEJpdE1hcCkgb3IgJWx1IChzaXplb2YgUGl4TWFwKSIsCi0JICAgICAgICAgICAgICAgIFB5U3RyaW5nX1NpemUoc291cmNlKSwgc2l6ZW9mKEJpdE1hcCksIHNpemVvZihQaXhNYXApKTsKLQkgICAgICAgIHJldHVybiBOVUxMOwotCX0KLQlwdHIgPSAoQml0TWFwUHRyKVB5U3RyaW5nX0FzU3RyaW5nKHNvdXJjZSk7Ci0JaWYgKCAoX3JlcyA9IEJNT2JqX05ldyhwdHIpKSA9PSBOVUxMICkgewotCSAgICAgICAgcmV0dXJuIE5VTEw7Ci0JfQotCSgoQml0TWFwT2JqZWN0ICopX3JlcyktPnJlZmVycmVkX29iamVjdCA9IHNvdXJjZTsKLQlQeV9JTkNSRUYoc291cmNlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyEiLCAmUHlTdHJpbmdfVHlwZSwgJnNvdXJjZSkgKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIFB5U3RyaW5nX1NpemUoc291cmNlKSAhPSBzaXplb2YoQml0TWFwKSAmJiBQeVN0cmluZ19TaXplKHNvdXJjZSkgIT0gc2l6ZW9mKFBpeE1hcCkgKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAiQXJndW1lbnQgc2l6ZSB3YXMgJWxkLCBzaG91bGQgYmUgJWx1IChzaXplb2YgQml0TWFwKSBvciAlbHUgKHNpemVvZiBQaXhNYXApIiwKKyAgICAgICAgICAgIFB5U3RyaW5nX1NpemUoc291cmNlKSwgc2l6ZW9mKEJpdE1hcCksIHNpemVvZihQaXhNYXApKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHB0ciA9IChCaXRNYXBQdHIpUHlTdHJpbmdfQXNTdHJpbmcoc291cmNlKTsKKyAgICBpZiAoIChfcmVzID0gQk1PYmpfTmV3KHB0cikpID09IE5VTEwgKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICAoKEJpdE1hcE9iamVjdCAqKV9yZXMpLT5yZWZlcnJlZF9vYmplY3QgPSBzb3VyY2U7CisgICAgUHlfSU5DUkVGKHNvdXJjZSk7CisgICAgcmV0dXJuIF9yZXM7CiAKIH0KICNlbmRpZiAvKiBfX0xQNjRfXyAqLwogCiBzdGF0aWMgUHlNZXRob2REZWYgUWRfbWV0aG9kc1tdID0gewogI2lmbmRlZiBfX0xQNjRfXwotCXsiR2V0UG9ydCIsIChQeUNGdW5jdGlvbilRZF9HZXRQb3J0LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChHcmFmUHRyIHBvcnQpIil9LAotCXsiR3JhZkRldmljZSIsIChQeUNGdW5jdGlvbilRZF9HcmFmRGV2aWNlLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBkZXZpY2UpIC0+IE5vbmUiKX0sCi0JeyJTZXRQb3J0Qml0cyIsIChQeUNGdW5jdGlvbilRZF9TZXRQb3J0Qml0cywgMSwKLQkgUHlEb2NfU1RSKCIoQml0TWFwUHRyIGJtKSAtPiBOb25lIil9LAotCXsiUG9ydFNpemUiLCAoUHlDRnVuY3Rpb24pUWRfUG9ydFNpemUsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHdpZHRoLCBzaG9ydCBoZWlnaHQpIC0+IE5vbmUiKX0sCi0JeyJNb3ZlUG9ydFRvIiwgKFB5Q0Z1bmN0aW9uKVFkX01vdmVQb3J0VG8sIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGxlZnRHbG9iYWwsIHNob3J0IHRvcEdsb2JhbCkgLT4gTm9uZSIpfSwKLQl7IlNldE9yaWdpbiIsIChQeUNGdW5jdGlvbilRZF9TZXRPcmlnaW4sIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGgsIHNob3J0IHYpIC0+IE5vbmUiKX0sCi0JeyJTZXRDbGlwIiwgKFB5Q0Z1bmN0aW9uKVFkX1NldENsaXAsIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZ24pIC0+IE5vbmUiKX0sCi0JeyJHZXRDbGlwIiwgKFB5Q0Z1bmN0aW9uKVFkX0dldENsaXAsIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZ24pIC0+IE5vbmUiKX0sCi0JeyJDbGlwUmVjdCIsIChQeUNGdW5jdGlvbilRZF9DbGlwUmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCByKSAtPiBOb25lIil9LAotCXsiQmFja1BhdCIsIChQeUNGdW5jdGlvbilRZF9CYWNrUGF0LCAxLAotCSBQeURvY19TVFIoIihQYXR0ZXJuIHBhdCkgLT4gTm9uZSIpfSwKLQl7IkluaXRDdXJzb3IiLCAoUHlDRnVuY3Rpb24pUWRfSW5pdEN1cnNvciwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiTWFjU2V0Q3Vyc29yIiwgKFB5Q0Z1bmN0aW9uKVFkX01hY1NldEN1cnNvciwgMSwKLQkgUHlEb2NfU1RSKCIoQ3Vyc29yIGNyc3IpIC0+IE5vbmUiKX0sCi0JeyJIaWRlQ3Vyc29yIiwgKFB5Q0Z1bmN0aW9uKVFkX0hpZGVDdXJzb3IsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7Ik1hY1Nob3dDdXJzb3IiLCAoUHlDRnVuY3Rpb24pUWRfTWFjU2hvd0N1cnNvciwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiT2JzY3VyZUN1cnNvciIsIChQeUNGdW5jdGlvbilRZF9PYnNjdXJlQ3Vyc29yLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJIaWRlUGVuIiwgKFB5Q0Z1bmN0aW9uKVFkX0hpZGVQZW4sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IlNob3dQZW4iLCAoUHlDRnVuY3Rpb24pUWRfU2hvd1BlbiwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiR2V0UGVuIiwgKFB5Q0Z1bmN0aW9uKVFkX0dldFBlbiwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoUG9pbnQgcHQpIil9LAotCXsiR2V0UGVuU3RhdGUiLCAoUHlDRnVuY3Rpb24pUWRfR2V0UGVuU3RhdGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFBlblN0YXRlIHBuU3RhdGUpIil9LAotCXsiU2V0UGVuU3RhdGUiLCAoUHlDRnVuY3Rpb24pUWRfU2V0UGVuU3RhdGUsIDEsCi0JIFB5RG9jX1NUUigiKFBlblN0YXRlIHBuU3RhdGUpIC0+IE5vbmUiKX0sCi0JeyJQZW5TaXplIiwgKFB5Q0Z1bmN0aW9uKVFkX1BlblNpemUsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHdpZHRoLCBzaG9ydCBoZWlnaHQpIC0+IE5vbmUiKX0sCi0JeyJQZW5Nb2RlIiwgKFB5Q0Z1bmN0aW9uKVFkX1Blbk1vZGUsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IG1vZGUpIC0+IE5vbmUiKX0sCi0JeyJQZW5QYXQiLCAoUHlDRnVuY3Rpb24pUWRfUGVuUGF0LCAxLAotCSBQeURvY19TVFIoIihQYXR0ZXJuIHBhdCkgLT4gTm9uZSIpfSwKLQl7IlBlbk5vcm1hbCIsIChQeUNGdW5jdGlvbilRZF9QZW5Ob3JtYWwsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7Ik1vdmVUbyIsIChQeUNGdW5jdGlvbilRZF9Nb3ZlVG8sIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGgsIHNob3J0IHYpIC0+IE5vbmUiKX0sCi0JeyJNb3ZlIiwgKFB5Q0Z1bmN0aW9uKVFkX01vdmUsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGRoLCBzaG9ydCBkdikgLT4gTm9uZSIpfSwKLQl7Ik1hY0xpbmVUbyIsIChQeUNGdW5jdGlvbilRZF9NYWNMaW5lVG8sIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGgsIHNob3J0IHYpIC0+IE5vbmUiKX0sCi0JeyJMaW5lIiwgKFB5Q0Z1bmN0aW9uKVFkX0xpbmUsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGRoLCBzaG9ydCBkdikgLT4gTm9uZSIpfSwKLQl7IkZvcmVDb2xvciIsIChQeUNGdW5jdGlvbilRZF9Gb3JlQ29sb3IsIDEsCi0JIFB5RG9jX1NUUigiKGxvbmcgY29sb3IpIC0+IE5vbmUiKX0sCi0JeyJCYWNrQ29sb3IiLCAoUHlDRnVuY3Rpb24pUWRfQmFja0NvbG9yLCAxLAotCSBQeURvY19TVFIoIihsb25nIGNvbG9yKSAtPiBOb25lIil9LAotCXsiQ29sb3JCaXQiLCAoUHlDRnVuY3Rpb24pUWRfQ29sb3JCaXQsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHdoaWNoQml0KSAtPiBOb25lIil9LAotCXsiTWFjU2V0UmVjdCIsIChQeUNGdW5jdGlvbilRZF9NYWNTZXRSZWN0LCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBsZWZ0LCBzaG9ydCB0b3AsIHNob3J0IHJpZ2h0LCBzaG9ydCBib3R0b20pIC0+IChSZWN0IHIpIil9LAotCXsiTWFjT2Zmc2V0UmVjdCIsIChQeUNGdW5jdGlvbilRZF9NYWNPZmZzZXRSZWN0LCAxLAotCSBQeURvY19TVFIoIihSZWN0IHIsIHNob3J0IGRoLCBzaG9ydCBkdikgLT4gKFJlY3QgcikiKX0sCi0JeyJNYWNJbnNldFJlY3QiLCAoUHlDRnVuY3Rpb24pUWRfTWFjSW5zZXRSZWN0LCAxLAotCSBQeURvY19TVFIoIihSZWN0IHIsIHNob3J0IGRoLCBzaG9ydCBkdikgLT4gKFJlY3QgcikiKX0sCi0JeyJTZWN0UmVjdCIsIChQeUNGdW5jdGlvbilRZF9TZWN0UmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCBzcmMxLCBSZWN0IHNyYzIpIC0+IChCb29sZWFuIF9ydiwgUmVjdCBkc3RSZWN0KSIpfSwKLQl7Ik1hY1VuaW9uUmVjdCIsIChQeUNGdW5jdGlvbilRZF9NYWNVbmlvblJlY3QsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3Qgc3JjMSwgUmVjdCBzcmMyKSAtPiAoUmVjdCBkc3RSZWN0KSIpfSwKLQl7Ik1hY0VxdWFsUmVjdCIsIChQeUNGdW5jdGlvbilRZF9NYWNFcXVhbFJlY3QsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgcmVjdDEsIFJlY3QgcmVjdDIpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJFbXB0eVJlY3QiLCAoUHlDRnVuY3Rpb24pUWRfRW1wdHlSZWN0LCAxLAotCSBQeURvY19TVFIoIihSZWN0IHIpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJNYWNGcmFtZVJlY3QiLCAoUHlDRnVuY3Rpb24pUWRfTWFjRnJhbWVSZWN0LCAxLAotCSBQeURvY19TVFIoIihSZWN0IHIpIC0+IE5vbmUiKX0sCi0JeyJQYWludFJlY3QiLCAoUHlDRnVuY3Rpb24pUWRfUGFpbnRSZWN0LCAxLAotCSBQeURvY19TVFIoIihSZWN0IHIpIC0+IE5vbmUiKX0sCi0JeyJFcmFzZVJlY3QiLCAoUHlDRnVuY3Rpb24pUWRfRXJhc2VSZWN0LCAxLAotCSBQeURvY19TVFIoIihSZWN0IHIpIC0+IE5vbmUiKX0sCi0JeyJNYWNJbnZlcnRSZWN0IiwgKFB5Q0Z1bmN0aW9uKVFkX01hY0ludmVydFJlY3QsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgcikgLT4gTm9uZSIpfSwKLQl7Ik1hY0ZpbGxSZWN0IiwgKFB5Q0Z1bmN0aW9uKVFkX01hY0ZpbGxSZWN0LCAxLAotCSBQeURvY19TVFIoIihSZWN0IHIsIFBhdHRlcm4gcGF0KSAtPiBOb25lIil9LAotCXsiRnJhbWVPdmFsIiwgKFB5Q0Z1bmN0aW9uKVFkX0ZyYW1lT3ZhbCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCByKSAtPiBOb25lIil9LAotCXsiUGFpbnRPdmFsIiwgKFB5Q0Z1bmN0aW9uKVFkX1BhaW50T3ZhbCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCByKSAtPiBOb25lIil9LAotCXsiRXJhc2VPdmFsIiwgKFB5Q0Z1bmN0aW9uKVFkX0VyYXNlT3ZhbCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCByKSAtPiBOb25lIil9LAotCXsiSW52ZXJ0T3ZhbCIsIChQeUNGdW5jdGlvbilRZF9JbnZlcnRPdmFsLCAxLAotCSBQeURvY19TVFIoIihSZWN0IHIpIC0+IE5vbmUiKX0sCi0JeyJGaWxsT3ZhbCIsIChQeUNGdW5jdGlvbilRZF9GaWxsT3ZhbCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCByLCBQYXR0ZXJuIHBhdCkgLT4gTm9uZSIpfSwKLQl7IkZyYW1lUm91bmRSZWN0IiwgKFB5Q0Z1bmN0aW9uKVFkX0ZyYW1lUm91bmRSZWN0LCAxLAotCSBQeURvY19TVFIoIihSZWN0IHIsIHNob3J0IG92YWxXaWR0aCwgc2hvcnQgb3ZhbEhlaWdodCkgLT4gTm9uZSIpfSwKLQl7IlBhaW50Um91bmRSZWN0IiwgKFB5Q0Z1bmN0aW9uKVFkX1BhaW50Um91bmRSZWN0LCAxLAotCSBQeURvY19TVFIoIihSZWN0IHIsIHNob3J0IG92YWxXaWR0aCwgc2hvcnQgb3ZhbEhlaWdodCkgLT4gTm9uZSIpfSwKLQl7IkVyYXNlUm91bmRSZWN0IiwgKFB5Q0Z1bmN0aW9uKVFkX0VyYXNlUm91bmRSZWN0LCAxLAotCSBQeURvY19TVFIoIihSZWN0IHIsIHNob3J0IG92YWxXaWR0aCwgc2hvcnQgb3ZhbEhlaWdodCkgLT4gTm9uZSIpfSwKLQl7IkludmVydFJvdW5kUmVjdCIsIChQeUNGdW5jdGlvbilRZF9JbnZlcnRSb3VuZFJlY3QsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3Qgciwgc2hvcnQgb3ZhbFdpZHRoLCBzaG9ydCBvdmFsSGVpZ2h0KSAtPiBOb25lIil9LAotCXsiRmlsbFJvdW5kUmVjdCIsIChQeUNGdW5jdGlvbilRZF9GaWxsUm91bmRSZWN0LCAxLAotCSBQeURvY19TVFIoIihSZWN0IHIsIHNob3J0IG92YWxXaWR0aCwgc2hvcnQgb3ZhbEhlaWdodCwgUGF0dGVybiBwYXQpIC0+IE5vbmUiKX0sCi0JeyJGcmFtZUFyYyIsIChQeUNGdW5jdGlvbilRZF9GcmFtZUFyYywgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCByLCBzaG9ydCBzdGFydEFuZ2xlLCBzaG9ydCBhcmNBbmdsZSkgLT4gTm9uZSIpfSwKLQl7IlBhaW50QXJjIiwgKFB5Q0Z1bmN0aW9uKVFkX1BhaW50QXJjLCAxLAotCSBQeURvY19TVFIoIihSZWN0IHIsIHNob3J0IHN0YXJ0QW5nbGUsIHNob3J0IGFyY0FuZ2xlKSAtPiBOb25lIil9LAotCXsiRXJhc2VBcmMiLCAoUHlDRnVuY3Rpb24pUWRfRXJhc2VBcmMsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3Qgciwgc2hvcnQgc3RhcnRBbmdsZSwgc2hvcnQgYXJjQW5nbGUpIC0+IE5vbmUiKX0sCi0JeyJJbnZlcnRBcmMiLCAoUHlDRnVuY3Rpb24pUWRfSW52ZXJ0QXJjLCAxLAotCSBQeURvY19TVFIoIihSZWN0IHIsIHNob3J0IHN0YXJ0QW5nbGUsIHNob3J0IGFyY0FuZ2xlKSAtPiBOb25lIil9LAotCXsiRmlsbEFyYyIsIChQeUNGdW5jdGlvbilRZF9GaWxsQXJjLCAxLAotCSBQeURvY19TVFIoIihSZWN0IHIsIHNob3J0IHN0YXJ0QW5nbGUsIHNob3J0IGFyY0FuZ2xlLCBQYXR0ZXJuIHBhdCkgLT4gTm9uZSIpfSwKLQl7Ik5ld1JnbiIsIChQeUNGdW5jdGlvbilRZF9OZXdSZ24sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFJnbkhhbmRsZSBfcnYpIil9LAotCXsiT3BlblJnbiIsIChQeUNGdW5jdGlvbilRZF9PcGVuUmduLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJDbG9zZVJnbiIsIChQeUNGdW5jdGlvbilRZF9DbG9zZVJnbiwgMSwKLQkgUHlEb2NfU1RSKCIoUmduSGFuZGxlIGRzdFJnbikgLT4gTm9uZSIpfSwKLQl7IkJpdE1hcFRvUmVnaW9uIiwgKFB5Q0Z1bmN0aW9uKVFkX0JpdE1hcFRvUmVnaW9uLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgcmVnaW9uLCBCaXRNYXBQdHIgYk1hcCkgLT4gTm9uZSIpfSwKLQl7IlJnblRvSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKVFkX1JnblRvSGFuZGxlLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgcmVnaW9uLCBIYW5kbGUgZmxhdHRlbmVkUmduRGF0YUhkbCkgLT4gTm9uZSIpfSwKLQl7IkRpc3Bvc2VSZ24iLCAoUHlDRnVuY3Rpb24pUWRfRGlzcG9zZVJnbiwgMSwKLQkgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHJnbikgLT4gTm9uZSIpfSwKLQl7Ik1hY0NvcHlSZ24iLCAoUHlDRnVuY3Rpb24pUWRfTWFjQ29weVJnbiwgMSwKLQkgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHNyY1JnbiwgUmduSGFuZGxlIGRzdFJnbikgLT4gTm9uZSIpfSwKLQl7IlNldEVtcHR5UmduIiwgKFB5Q0Z1bmN0aW9uKVFkX1NldEVtcHR5UmduLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgcmduKSAtPiBOb25lIil9LAotCXsiTWFjU2V0UmVjdFJnbiIsIChQeUNGdW5jdGlvbilRZF9NYWNTZXRSZWN0UmduLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgcmduLCBzaG9ydCBsZWZ0LCBzaG9ydCB0b3AsIHNob3J0IHJpZ2h0LCBzaG9ydCBib3R0b20pIC0+IE5vbmUiKX0sCi0JeyJSZWN0UmduIiwgKFB5Q0Z1bmN0aW9uKVFkX1JlY3RSZ24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZ24sIFJlY3QgcikgLT4gTm9uZSIpfSwKLQl7Ik1hY09mZnNldFJnbiIsIChQeUNGdW5jdGlvbilRZF9NYWNPZmZzZXRSZ24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZ24sIHNob3J0IGRoLCBzaG9ydCBkdikgLT4gTm9uZSIpfSwKLQl7Ikluc2V0UmduIiwgKFB5Q0Z1bmN0aW9uKVFkX0luc2V0UmduLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgcmduLCBzaG9ydCBkaCwgc2hvcnQgZHYpIC0+IE5vbmUiKX0sCi0JeyJTZWN0UmduIiwgKFB5Q0Z1bmN0aW9uKVFkX1NlY3RSZ24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSBzcmNSZ25BLCBSZ25IYW5kbGUgc3JjUmduQiwgUmduSGFuZGxlIGRzdFJnbikgLT4gTm9uZSIpfSwKLQl7Ik1hY1VuaW9uUmduIiwgKFB5Q0Z1bmN0aW9uKVFkX01hY1VuaW9uUmduLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgc3JjUmduQSwgUmduSGFuZGxlIHNyY1JnbkIsIFJnbkhhbmRsZSBkc3RSZ24pIC0+IE5vbmUiKX0sCi0JeyJEaWZmUmduIiwgKFB5Q0Z1bmN0aW9uKVFkX0RpZmZSZ24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSBzcmNSZ25BLCBSZ25IYW5kbGUgc3JjUmduQiwgUmduSGFuZGxlIGRzdFJnbikgLT4gTm9uZSIpfSwKLQl7Ik1hY1hvclJnbiIsIChQeUNGdW5jdGlvbilRZF9NYWNYb3JSZ24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSBzcmNSZ25BLCBSZ25IYW5kbGUgc3JjUmduQiwgUmduSGFuZGxlIGRzdFJnbikgLT4gTm9uZSIpfSwKLQl7IlJlY3RJblJnbiIsIChQeUNGdW5jdGlvbilRZF9SZWN0SW5SZ24sIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgciwgUmduSGFuZGxlIHJnbikgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7Ik1hY0VxdWFsUmduIiwgKFB5Q0Z1bmN0aW9uKVFkX01hY0VxdWFsUmduLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgcmduQSwgUmduSGFuZGxlIHJnbkIpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJFbXB0eVJnbiIsIChQeUNGdW5jdGlvbilRZF9FbXB0eVJnbiwgMSwKLQkgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHJnbikgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7Ik1hY0ZyYW1lUmduIiwgKFB5Q0Z1bmN0aW9uKVFkX01hY0ZyYW1lUmduLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgcmduKSAtPiBOb25lIil9LAotCXsiTWFjUGFpbnRSZ24iLCAoUHlDRnVuY3Rpb24pUWRfTWFjUGFpbnRSZ24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZ24pIC0+IE5vbmUiKX0sCi0JeyJFcmFzZVJnbiIsIChQeUNGdW5jdGlvbilRZF9FcmFzZVJnbiwgMSwKLQkgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHJnbikgLT4gTm9uZSIpfSwKLQl7Ik1hY0ludmVydFJnbiIsIChQeUNGdW5jdGlvbilRZF9NYWNJbnZlcnRSZ24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZ24pIC0+IE5vbmUiKX0sCi0JeyJNYWNGaWxsUmduIiwgKFB5Q0Z1bmN0aW9uKVFkX01hY0ZpbGxSZ24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZ24sIFBhdHRlcm4gcGF0KSAtPiBOb25lIil9LAotCXsiU2Nyb2xsUmVjdCIsIChQeUNGdW5jdGlvbilRZF9TY3JvbGxSZWN0LCAxLAotCSBQeURvY19TVFIoIihSZWN0IHIsIHNob3J0IGRoLCBzaG9ydCBkdiwgUmduSGFuZGxlIHVwZGF0ZVJnbikgLT4gTm9uZSIpfSwKLQl7IkNvcHlCaXRzIiwgKFB5Q0Z1bmN0aW9uKVFkX0NvcHlCaXRzLCAxLAotCSBQeURvY19TVFIoIihCaXRNYXBQdHIgc3JjQml0cywgQml0TWFwUHRyIGRzdEJpdHMsIFJlY3Qgc3JjUmVjdCwgUmVjdCBkc3RSZWN0LCBzaG9ydCBtb2RlLCBSZ25IYW5kbGUgbWFza1JnbikgLT4gTm9uZSIpfSwKLQl7IkNvcHlNYXNrIiwgKFB5Q0Z1bmN0aW9uKVFkX0NvcHlNYXNrLCAxLAotCSBQeURvY19TVFIoIihCaXRNYXBQdHIgc3JjQml0cywgQml0TWFwUHRyIG1hc2tCaXRzLCBCaXRNYXBQdHIgZHN0Qml0cywgUmVjdCBzcmNSZWN0LCBSZWN0IG1hc2tSZWN0LCBSZWN0IGRzdFJlY3QpIC0+IE5vbmUiKX0sCi0JeyJPcGVuUGljdHVyZSIsIChQeUNGdW5jdGlvbilRZF9PcGVuUGljdHVyZSwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCBwaWNGcmFtZSkgLT4gKFBpY0hhbmRsZSBfcnYpIil9LAotCXsiUGljQ29tbWVudCIsIChQeUNGdW5jdGlvbilRZF9QaWNDb21tZW50LCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBraW5kLCBzaG9ydCBkYXRhU2l6ZSwgSGFuZGxlIGRhdGFIYW5kbGUpIC0+IE5vbmUiKX0sCi0JeyJDbG9zZVBpY3R1cmUiLCAoUHlDRnVuY3Rpb24pUWRfQ2xvc2VQaWN0dXJlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJEcmF3UGljdHVyZSIsIChQeUNGdW5jdGlvbilRZF9EcmF3UGljdHVyZSwgMSwKLQkgUHlEb2NfU1RSKCIoUGljSGFuZGxlIG15UGljdHVyZSwgUmVjdCBkc3RSZWN0KSAtPiBOb25lIil9LAotCXsiS2lsbFBpY3R1cmUiLCAoUHlDRnVuY3Rpb24pUWRfS2lsbFBpY3R1cmUsIDEsCi0JIFB5RG9jX1NUUigiKFBpY0hhbmRsZSBteVBpY3R1cmUpIC0+IE5vbmUiKX0sCi0JeyJPcGVuUG9seSIsIChQeUNGdW5jdGlvbilRZF9PcGVuUG9seSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoUG9seUhhbmRsZSBfcnYpIil9LAotCXsiQ2xvc2VQb2x5IiwgKFB5Q0Z1bmN0aW9uKVFkX0Nsb3NlUG9seSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiS2lsbFBvbHkiLCAoUHlDRnVuY3Rpb24pUWRfS2lsbFBvbHksIDEsCi0JIFB5RG9jX1NUUigiKFBvbHlIYW5kbGUgcG9seSkgLT4gTm9uZSIpfSwKLQl7Ik9mZnNldFBvbHkiLCAoUHlDRnVuY3Rpb24pUWRfT2Zmc2V0UG9seSwgMSwKLQkgUHlEb2NfU1RSKCIoUG9seUhhbmRsZSBwb2x5LCBzaG9ydCBkaCwgc2hvcnQgZHYpIC0+IE5vbmUiKX0sCi0JeyJGcmFtZVBvbHkiLCAoUHlDRnVuY3Rpb24pUWRfRnJhbWVQb2x5LCAxLAotCSBQeURvY19TVFIoIihQb2x5SGFuZGxlIHBvbHkpIC0+IE5vbmUiKX0sCi0JeyJQYWludFBvbHkiLCAoUHlDRnVuY3Rpb24pUWRfUGFpbnRQb2x5LCAxLAotCSBQeURvY19TVFIoIihQb2x5SGFuZGxlIHBvbHkpIC0+IE5vbmUiKX0sCi0JeyJFcmFzZVBvbHkiLCAoUHlDRnVuY3Rpb24pUWRfRXJhc2VQb2x5LCAxLAotCSBQeURvY19TVFIoIihQb2x5SGFuZGxlIHBvbHkpIC0+IE5vbmUiKX0sCi0JeyJJbnZlcnRQb2x5IiwgKFB5Q0Z1bmN0aW9uKVFkX0ludmVydFBvbHksIDEsCi0JIFB5RG9jX1NUUigiKFBvbHlIYW5kbGUgcG9seSkgLT4gTm9uZSIpfSwKLQl7IkZpbGxQb2x5IiwgKFB5Q0Z1bmN0aW9uKVFkX0ZpbGxQb2x5LCAxLAotCSBQeURvY19TVFIoIihQb2x5SGFuZGxlIHBvbHksIFBhdHRlcm4gcGF0KSAtPiBOb25lIil9LAotCXsiU2V0UHQiLCAoUHlDRnVuY3Rpb24pUWRfU2V0UHQsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGgsIHNob3J0IHYpIC0+IChQb2ludCBwdCkiKX0sCi0JeyJMb2NhbFRvR2xvYmFsIiwgKFB5Q0Z1bmN0aW9uKVFkX0xvY2FsVG9HbG9iYWwsIDEsCi0JIFB5RG9jX1NUUigiKFBvaW50IHB0KSAtPiAoUG9pbnQgcHQpIil9LAotCXsiR2xvYmFsVG9Mb2NhbCIsIChQeUNGdW5jdGlvbilRZF9HbG9iYWxUb0xvY2FsLCAxLAotCSBQeURvY19TVFIoIihQb2ludCBwdCkgLT4gKFBvaW50IHB0KSIpfSwKLQl7IlJhbmRvbSIsIChQeUNGdW5jdGlvbilRZF9SYW5kb20sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKHNob3J0IF9ydikiKX0sCi0JeyJNYWNHZXRQaXhlbCIsIChQeUNGdW5jdGlvbilRZF9NYWNHZXRQaXhlbCwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgaCwgc2hvcnQgdikgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IlNjYWxlUHQiLCAoUHlDRnVuY3Rpb24pUWRfU2NhbGVQdCwgMSwKLQkgUHlEb2NfU1RSKCIoUG9pbnQgcHQsIFJlY3Qgc3JjUmVjdCwgUmVjdCBkc3RSZWN0KSAtPiAoUG9pbnQgcHQpIil9LAotCXsiTWFwUHQiLCAoUHlDRnVuY3Rpb24pUWRfTWFwUHQsIDEsCi0JIFB5RG9jX1NUUigiKFBvaW50IHB0LCBSZWN0IHNyY1JlY3QsIFJlY3QgZHN0UmVjdCkgLT4gKFBvaW50IHB0KSIpfSwKLQl7Ik1hcFJlY3QiLCAoUHlDRnVuY3Rpb24pUWRfTWFwUmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCByLCBSZWN0IHNyY1JlY3QsIFJlY3QgZHN0UmVjdCkgLT4gKFJlY3QgcikiKX0sCi0JeyJNYXBSZ24iLCAoUHlDRnVuY3Rpb24pUWRfTWFwUmduLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgcmduLCBSZWN0IHNyY1JlY3QsIFJlY3QgZHN0UmVjdCkgLT4gTm9uZSIpfSwKLQl7Ik1hcFBvbHkiLCAoUHlDRnVuY3Rpb24pUWRfTWFwUG9seSwgMSwKLQkgUHlEb2NfU1RSKCIoUG9seUhhbmRsZSBwb2x5LCBSZWN0IHNyY1JlY3QsIFJlY3QgZHN0UmVjdCkgLT4gTm9uZSIpfSwKLQl7IlN0ZEJpdHMiLCAoUHlDRnVuY3Rpb24pUWRfU3RkQml0cywgMSwKLQkgUHlEb2NfU1RSKCIoQml0TWFwUHRyIHNyY0JpdHMsIFJlY3Qgc3JjUmVjdCwgUmVjdCBkc3RSZWN0LCBzaG9ydCBtb2RlLCBSZ25IYW5kbGUgbWFza1JnbikgLT4gTm9uZSIpfSwKLQl7IkFkZFB0IiwgKFB5Q0Z1bmN0aW9uKVFkX0FkZFB0LCAxLAotCSBQeURvY19TVFIoIihQb2ludCBzcmMsIFBvaW50IGRzdCkgLT4gKFBvaW50IGRzdCkiKX0sCi0JeyJFcXVhbFB0IiwgKFB5Q0Z1bmN0aW9uKVFkX0VxdWFsUHQsIDEsCi0JIFB5RG9jX1NUUigiKFBvaW50IHB0MSwgUG9pbnQgcHQyKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiTWFjUHRJblJlY3QiLCAoUHlDRnVuY3Rpb24pUWRfTWFjUHRJblJlY3QsIDEsCi0JIFB5RG9jX1NUUigiKFBvaW50IHB0LCBSZWN0IHIpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJQdDJSZWN0IiwgKFB5Q0Z1bmN0aW9uKVFkX1B0MlJlY3QsIDEsCi0JIFB5RG9jX1NUUigiKFBvaW50IHB0MSwgUG9pbnQgcHQyKSAtPiAoUmVjdCBkc3RSZWN0KSIpfSwKLQl7IlB0VG9BbmdsZSIsIChQeUNGdW5jdGlvbilRZF9QdFRvQW5nbGUsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgciwgUG9pbnQgcHQpIC0+IChzaG9ydCBhbmdsZSkiKX0sCi0JeyJTdWJQdCIsIChQeUNGdW5jdGlvbilRZF9TdWJQdCwgMSwKLQkgUHlEb2NfU1RSKCIoUG9pbnQgc3JjLCBQb2ludCBkc3QpIC0+IChQb2ludCBkc3QpIil9LAotCXsiUHRJblJnbiIsIChQeUNGdW5jdGlvbilRZF9QdEluUmduLCAxLAotCSBQeURvY19TVFIoIihQb2ludCBwdCwgUmduSGFuZGxlIHJnbikgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7Ik5ld1BpeE1hcCIsIChQeUNGdW5jdGlvbilRZF9OZXdQaXhNYXAsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFBpeE1hcEhhbmRsZSBfcnYpIil9LAotCXsiRGlzcG9zZVBpeE1hcCIsIChQeUNGdW5jdGlvbilRZF9EaXNwb3NlUGl4TWFwLCAxLAotCSBQeURvY19TVFIoIihQaXhNYXBIYW5kbGUgcG0pIC0+IE5vbmUiKX0sCi0JeyJDb3B5UGl4TWFwIiwgKFB5Q0Z1bmN0aW9uKVFkX0NvcHlQaXhNYXAsIDEsCi0JIFB5RG9jX1NUUigiKFBpeE1hcEhhbmRsZSBzcmNQTSwgUGl4TWFwSGFuZGxlIGRzdFBNKSAtPiBOb25lIil9LAotCXsiTmV3UGl4UGF0IiwgKFB5Q0Z1bmN0aW9uKVFkX05ld1BpeFBhdCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoUGl4UGF0SGFuZGxlIF9ydikiKX0sCi0JeyJEaXNwb3NlUGl4UGF0IiwgKFB5Q0Z1bmN0aW9uKVFkX0Rpc3Bvc2VQaXhQYXQsIDEsCi0JIFB5RG9jX1NUUigiKFBpeFBhdEhhbmRsZSBwcCkgLT4gTm9uZSIpfSwKLQl7IkNvcHlQaXhQYXQiLCAoUHlDRnVuY3Rpb24pUWRfQ29weVBpeFBhdCwgMSwKLQkgUHlEb2NfU1RSKCIoUGl4UGF0SGFuZGxlIHNyY1BQLCBQaXhQYXRIYW5kbGUgZHN0UFApIC0+IE5vbmUiKX0sCi0JeyJQZW5QaXhQYXQiLCAoUHlDRnVuY3Rpb24pUWRfUGVuUGl4UGF0LCAxLAotCSBQeURvY19TVFIoIihQaXhQYXRIYW5kbGUgcHApIC0+IE5vbmUiKX0sCi0JeyJCYWNrUGl4UGF0IiwgKFB5Q0Z1bmN0aW9uKVFkX0JhY2tQaXhQYXQsIDEsCi0JIFB5RG9jX1NUUigiKFBpeFBhdEhhbmRsZSBwcCkgLT4gTm9uZSIpfSwKLQl7IkdldFBpeFBhdCIsIChQeUNGdW5jdGlvbilRZF9HZXRQaXhQYXQsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHBhdElEKSAtPiAoUGl4UGF0SGFuZGxlIF9ydikiKX0sCi0JeyJNYWtlUkdCUGF0IiwgKFB5Q0Z1bmN0aW9uKVFkX01ha2VSR0JQYXQsIDEsCi0JIFB5RG9jX1NUUigiKFBpeFBhdEhhbmRsZSBwcCwgUkdCQ29sb3IgbXlDb2xvcikgLT4gTm9uZSIpfSwKLQl7IkZpbGxDUmVjdCIsIChQeUNGdW5jdGlvbilRZF9GaWxsQ1JlY3QsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgciwgUGl4UGF0SGFuZGxlIHBwKSAtPiBOb25lIil9LAotCXsiRmlsbENPdmFsIiwgKFB5Q0Z1bmN0aW9uKVFkX0ZpbGxDT3ZhbCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCByLCBQaXhQYXRIYW5kbGUgcHApIC0+IE5vbmUiKX0sCi0JeyJGaWxsQ1JvdW5kUmVjdCIsIChQeUNGdW5jdGlvbilRZF9GaWxsQ1JvdW5kUmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCByLCBzaG9ydCBvdmFsV2lkdGgsIHNob3J0IG92YWxIZWlnaHQsIFBpeFBhdEhhbmRsZSBwcCkgLT4gTm9uZSIpfSwKLQl7IkZpbGxDQXJjIiwgKFB5Q0Z1bmN0aW9uKVFkX0ZpbGxDQXJjLCAxLAotCSBQeURvY19TVFIoIihSZWN0IHIsIHNob3J0IHN0YXJ0QW5nbGUsIHNob3J0IGFyY0FuZ2xlLCBQaXhQYXRIYW5kbGUgcHApIC0+IE5vbmUiKX0sCi0JeyJGaWxsQ1JnbiIsIChQeUNGdW5jdGlvbilRZF9GaWxsQ1JnbiwgMSwKLQkgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHJnbiwgUGl4UGF0SGFuZGxlIHBwKSAtPiBOb25lIil9LAotCXsiRmlsbENQb2x5IiwgKFB5Q0Z1bmN0aW9uKVFkX0ZpbGxDUG9seSwgMSwKLQkgUHlEb2NfU1RSKCIoUG9seUhhbmRsZSBwb2x5LCBQaXhQYXRIYW5kbGUgcHApIC0+IE5vbmUiKX0sCi0JeyJSR0JGb3JlQ29sb3IiLCAoUHlDRnVuY3Rpb24pUWRfUkdCRm9yZUNvbG9yLCAxLAotCSBQeURvY19TVFIoIihSR0JDb2xvciBjb2xvcikgLT4gTm9uZSIpfSwKLQl7IlJHQkJhY2tDb2xvciIsIChQeUNGdW5jdGlvbilRZF9SR0JCYWNrQ29sb3IsIDEsCi0JIFB5RG9jX1NUUigiKFJHQkNvbG9yIGNvbG9yKSAtPiBOb25lIil9LAotCXsiU2V0Q1BpeGVsIiwgKFB5Q0Z1bmN0aW9uKVFkX1NldENQaXhlbCwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgaCwgc2hvcnQgdiwgUkdCQ29sb3IgY1BpeCkgLT4gTm9uZSIpfSwKLQl7IlNldFBvcnRQaXgiLCAoUHlDRnVuY3Rpb24pUWRfU2V0UG9ydFBpeCwgMSwKLQkgUHlEb2NfU1RSKCIoUGl4TWFwSGFuZGxlIHBtKSAtPiBOb25lIil9LAotCXsiR2V0Q1BpeGVsIiwgKFB5Q0Z1bmN0aW9uKVFkX0dldENQaXhlbCwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgaCwgc2hvcnQgdikgLT4gKFJHQkNvbG9yIGNQaXgpIil9LAotCXsiR2V0Rm9yZUNvbG9yIiwgKFB5Q0Z1bmN0aW9uKVFkX0dldEZvcmVDb2xvciwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoUkdCQ29sb3IgY29sb3IpIil9LAotCXsiR2V0QmFja0NvbG9yIiwgKFB5Q0Z1bmN0aW9uKVFkX0dldEJhY2tDb2xvciwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoUkdCQ29sb3IgY29sb3IpIil9LAotCXsiT3BDb2xvciIsIChQeUNGdW5jdGlvbilRZF9PcENvbG9yLCAxLAotCSBQeURvY19TVFIoIihSR0JDb2xvciBjb2xvcikgLT4gTm9uZSIpfSwKLQl7IkhpbGl0ZUNvbG9yIiwgKFB5Q0Z1bmN0aW9uKVFkX0hpbGl0ZUNvbG9yLCAxLAotCSBQeURvY19TVFIoIihSR0JDb2xvciBjb2xvcikgLT4gTm9uZSIpfSwKLQl7IkRpc3Bvc2VDVGFibGUiLCAoUHlDRnVuY3Rpb24pUWRfRGlzcG9zZUNUYWJsZSwgMSwKLQkgUHlEb2NfU1RSKCIoQ1RhYkhhbmRsZSBjVGFibGUpIC0+IE5vbmUiKX0sCi0JeyJHZXRDVGFibGUiLCAoUHlDRnVuY3Rpb24pUWRfR2V0Q1RhYmxlLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBjdElEKSAtPiAoQ1RhYkhhbmRsZSBfcnYpIil9LAotCXsiR2V0Q0N1cnNvciIsIChQeUNGdW5jdGlvbilRZF9HZXRDQ3Vyc29yLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBjcnNySUQpIC0+IChDQ3JzckhhbmRsZSBfcnYpIil9LAotCXsiU2V0Q0N1cnNvciIsIChQeUNGdW5jdGlvbilRZF9TZXRDQ3Vyc29yLCAxLAotCSBQeURvY19TVFIoIihDQ3JzckhhbmRsZSBjQ3JzcikgLT4gTm9uZSIpfSwKLQl7IkFsbG9jQ3Vyc29yIiwgKFB5Q0Z1bmN0aW9uKVFkX0FsbG9jQ3Vyc29yLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJEaXNwb3NlQ0N1cnNvciIsIChQeUNGdW5jdGlvbilRZF9EaXNwb3NlQ0N1cnNvciwgMSwKLQkgUHlEb2NfU1RSKCIoQ0Nyc3JIYW5kbGUgY0Nyc3IpIC0+IE5vbmUiKX0sCi0JeyJHZXRNYXhEZXZpY2UiLCAoUHlDRnVuY3Rpb24pUWRfR2V0TWF4RGV2aWNlLCAxLAotCSBQeURvY19TVFIoIihSZWN0IGdsb2JhbFJlY3QpIC0+IChHREhhbmRsZSBfcnYpIil9LAotCXsiR2V0Q1RTZWVkIiwgKFB5Q0Z1bmN0aW9uKVFkX0dldENUU2VlZCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAobG9uZyBfcnYpIil9LAotCXsiR2V0RGV2aWNlTGlzdCIsIChQeUNGdW5jdGlvbilRZF9HZXREZXZpY2VMaXN0LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChHREhhbmRsZSBfcnYpIil9LAotCXsiR2V0TWFpbkRldmljZSIsIChQeUNGdW5jdGlvbilRZF9HZXRNYWluRGV2aWNlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChHREhhbmRsZSBfcnYpIil9LAotCXsiR2V0TmV4dERldmljZSIsIChQeUNGdW5jdGlvbilRZF9HZXROZXh0RGV2aWNlLCAxLAotCSBQeURvY19TVFIoIihHREhhbmRsZSBjdXJEZXZpY2UpIC0+IChHREhhbmRsZSBfcnYpIil9LAotCXsiVGVzdERldmljZUF0dHJpYnV0ZSIsIChQeUNGdW5jdGlvbilRZF9UZXN0RGV2aWNlQXR0cmlidXRlLCAxLAotCSBQeURvY19TVFIoIihHREhhbmRsZSBnZGgsIHNob3J0IGF0dHJpYnV0ZSkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IlNldERldmljZUF0dHJpYnV0ZSIsIChQeUNGdW5jdGlvbilRZF9TZXREZXZpY2VBdHRyaWJ1dGUsIDEsCi0JIFB5RG9jX1NUUigiKEdESGFuZGxlIGdkaCwgc2hvcnQgYXR0cmlidXRlLCBCb29sZWFuIHZhbHVlKSAtPiBOb25lIil9LAotCXsiSW5pdEdEZXZpY2UiLCAoUHlDRnVuY3Rpb24pUWRfSW5pdEdEZXZpY2UsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHFkUmVmTnVtLCBsb25nIG1vZGUsIEdESGFuZGxlIGdkaCkgLT4gTm9uZSIpfSwKLQl7Ik5ld0dEZXZpY2UiLCAoUHlDRnVuY3Rpb24pUWRfTmV3R0RldmljZSwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgcmVmTnVtLCBsb25nIG1vZGUpIC0+IChHREhhbmRsZSBfcnYpIil9LAotCXsiRGlzcG9zZUdEZXZpY2UiLCAoUHlDRnVuY3Rpb24pUWRfRGlzcG9zZUdEZXZpY2UsIDEsCi0JIFB5RG9jX1NUUigiKEdESGFuZGxlIGdkaCkgLT4gTm9uZSIpfSwKLQl7IlNldEdEZXZpY2UiLCAoUHlDRnVuY3Rpb24pUWRfU2V0R0RldmljZSwgMSwKLQkgUHlEb2NfU1RSKCIoR0RIYW5kbGUgZ2QpIC0+IE5vbmUiKX0sCi0JeyJHZXRHRGV2aWNlIiwgKFB5Q0Z1bmN0aW9uKVFkX0dldEdEZXZpY2UsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEdESGFuZGxlIF9ydikiKX0sCi0JeyJDb2xvcjJJbmRleCIsIChQeUNGdW5jdGlvbilRZF9Db2xvcjJJbmRleCwgMSwKLQkgUHlEb2NfU1RSKCIoUkdCQ29sb3IgbXlDb2xvcikgLT4gKGxvbmcgX3J2KSIpfSwKLQl7IkluZGV4MkNvbG9yIiwgKFB5Q0Z1bmN0aW9uKVFkX0luZGV4MkNvbG9yLCAxLAotCSBQeURvY19TVFIoIihsb25nIGluZGV4KSAtPiAoUkdCQ29sb3IgYUNvbG9yKSIpfSwKLQl7IkludmVydENvbG9yIiwgKFB5Q0Z1bmN0aW9uKVFkX0ludmVydENvbG9yLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChSR0JDb2xvciBteUNvbG9yKSIpfSwKLQl7IlJlYWxDb2xvciIsIChQeUNGdW5jdGlvbilRZF9SZWFsQ29sb3IsIDEsCi0JIFB5RG9jX1NUUigiKFJHQkNvbG9yIGNvbG9yKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiR2V0U3ViVGFibGUiLCAoUHlDRnVuY3Rpb24pUWRfR2V0U3ViVGFibGUsIDEsCi0JIFB5RG9jX1NUUigiKENUYWJIYW5kbGUgbXlDb2xvcnMsIHNob3J0IGlUYWJSZXMsIENUYWJIYW5kbGUgdGFyZ2V0VGJsKSAtPiBOb25lIil9LAotCXsiTWFrZUlUYWJsZSIsIChQeUNGdW5jdGlvbilRZF9NYWtlSVRhYmxlLCAxLAotCSBQeURvY19TVFIoIihDVGFiSGFuZGxlIGNUYWJILCBJVGFiSGFuZGxlIGlUYWJILCBzaG9ydCByZXMpIC0+IE5vbmUiKX0sCi0JeyJTZXRDbGllbnRJRCIsIChQeUNGdW5jdGlvbilRZF9TZXRDbGllbnRJRCwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgaWQpIC0+IE5vbmUiKX0sCi0JeyJQcm90ZWN0RW50cnkiLCAoUHlDRnVuY3Rpb24pUWRfUHJvdGVjdEVudHJ5LCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBpbmRleCwgQm9vbGVhbiBwcm90ZWN0KSAtPiBOb25lIil9LAotCXsiUmVzZXJ2ZUVudHJ5IiwgKFB5Q0Z1bmN0aW9uKVFkX1Jlc2VydmVFbnRyeSwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgaW5kZXgsIEJvb2xlYW4gcmVzZXJ2ZSkgLT4gTm9uZSIpfSwKLQl7IlFERXJyb3IiLCAoUHlDRnVuY3Rpb24pUWRfUURFcnJvciwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgX3J2KSIpfSwKLQl7IkNvcHlEZWVwTWFzayIsIChQeUNGdW5jdGlvbilRZF9Db3B5RGVlcE1hc2ssIDEsCi0JIFB5RG9jX1NUUigiKEJpdE1hcFB0ciBzcmNCaXRzLCBCaXRNYXBQdHIgbWFza0JpdHMsIEJpdE1hcFB0ciBkc3RCaXRzLCBSZWN0IHNyY1JlY3QsIFJlY3QgbWFza1JlY3QsIFJlY3QgZHN0UmVjdCwgc2hvcnQgbW9kZSwgUmduSGFuZGxlIG1hc2tSZ24pIC0+IE5vbmUiKX0sCi0JeyJHZXRQYXR0ZXJuIiwgKFB5Q0Z1bmN0aW9uKVFkX0dldFBhdHRlcm4sIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHBhdHRlcm5JRCkgLT4gKFBhdEhhbmRsZSBfcnYpIil9LAotCXsiTWFjR2V0Q3Vyc29yIiwgKFB5Q0Z1bmN0aW9uKVFkX01hY0dldEN1cnNvciwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgY3Vyc29ySUQpIC0+IChDdXJzSGFuZGxlIF9ydikiKX0sCi0JeyJHZXRQaWN0dXJlIiwgKFB5Q0Z1bmN0aW9uKVFkX0dldFBpY3R1cmUsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHBpY3R1cmVJRCkgLT4gKFBpY0hhbmRsZSBfcnYpIil9LAotCXsiRGVsdGFQb2ludCIsIChQeUNGdW5jdGlvbilRZF9EZWx0YVBvaW50LCAxLAotCSBQeURvY19TVFIoIihQb2ludCBwdEEsIFBvaW50IHB0QikgLT4gKGxvbmcgX3J2KSIpfSwKLQl7IlNoaWVsZEN1cnNvciIsIChQeUNGdW5jdGlvbilRZF9TaGllbGRDdXJzb3IsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3Qgc2hpZWxkUmVjdCwgUG9pbnQgb2Zmc2V0UHQpIC0+IE5vbmUiKX0sCi0JeyJTY3JlZW5SZXMiLCAoUHlDRnVuY3Rpb24pUWRfU2NyZWVuUmVzLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChzaG9ydCBzY3JuSFJlcywgc2hvcnQgc2NyblZSZXMpIil9LAotCXsiR2V0SW5kUGF0dGVybiIsIChQeUNGdW5jdGlvbilRZF9HZXRJbmRQYXR0ZXJuLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBwYXR0ZXJuTGlzdElELCBzaG9ydCBpbmRleCkgLT4gKFBhdHRlcm4gdGhlUGF0KSIpfSwKLQl7IlNsb3BlRnJvbUFuZ2xlIiwgKFB5Q0Z1bmN0aW9uKVFkX1Nsb3BlRnJvbUFuZ2xlLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBhbmdsZSkgLT4gKEZpeGVkIF9ydikiKX0sCi0JeyJBbmdsZUZyb21TbG9wZSIsIChQeUNGdW5jdGlvbilRZF9BbmdsZUZyb21TbG9wZSwgMSwKLQkgUHlEb2NfU1RSKCIoRml4ZWQgc2xvcGUpIC0+IChzaG9ydCBfcnYpIil9LAotCXsiR2V0UGl4Qm91bmRzIiwgKFB5Q0Z1bmN0aW9uKVFkX0dldFBpeEJvdW5kcywgMSwKLQkgUHlEb2NfU1RSKCIoUGl4TWFwSGFuZGxlIHBpeE1hcCkgLT4gKFJlY3QgYm91bmRzKSIpfSwKLQl7IkdldFBpeERlcHRoIiwgKFB5Q0Z1bmN0aW9uKVFkX0dldFBpeERlcHRoLCAxLAotCSBQeURvY19TVFIoIihQaXhNYXBIYW5kbGUgcGl4TWFwKSAtPiAoc2hvcnQgX3J2KSIpfSwKLQl7IkdldFFER2xvYmFsc1JhbmRvbVNlZWQiLCAoUHlDRnVuY3Rpb24pUWRfR2V0UURHbG9iYWxzUmFuZG9tU2VlZCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAobG9uZyBfcnYpIil9LAotCXsiR2V0UURHbG9iYWxzU2NyZWVuQml0cyIsIChQeUNGdW5jdGlvbilRZF9HZXRRREdsb2JhbHNTY3JlZW5CaXRzLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCaXRNYXAgc2NyZWVuQml0cykiKX0sCi0JeyJHZXRRREdsb2JhbHNBcnJvdyIsIChQeUNGdW5jdGlvbilRZF9HZXRRREdsb2JhbHNBcnJvdywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ3Vyc29yIGFycm93KSIpfSwKLQl7IkdldFFER2xvYmFsc0RhcmtHcmF5IiwgKFB5Q0Z1bmN0aW9uKVFkX0dldFFER2xvYmFsc0RhcmtHcmF5LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChQYXR0ZXJuIGRrR3JheSkiKX0sCi0JeyJHZXRRREdsb2JhbHNMaWdodEdyYXkiLCAoUHlDRnVuY3Rpb24pUWRfR2V0UURHbG9iYWxzTGlnaHRHcmF5LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChQYXR0ZXJuIGx0R3JheSkiKX0sCi0JeyJHZXRRREdsb2JhbHNHcmF5IiwgKFB5Q0Z1bmN0aW9uKVFkX0dldFFER2xvYmFsc0dyYXksIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFBhdHRlcm4gZ3JheSkiKX0sCi0JeyJHZXRRREdsb2JhbHNCbGFjayIsIChQeUNGdW5jdGlvbilRZF9HZXRRREdsb2JhbHNCbGFjaywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoUGF0dGVybiBibGFjaykiKX0sCi0JeyJHZXRRREdsb2JhbHNXaGl0ZSIsIChQeUNGdW5jdGlvbilRZF9HZXRRREdsb2JhbHNXaGl0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoUGF0dGVybiB3aGl0ZSkiKX0sCi0JeyJHZXRRREdsb2JhbHNUaGVQb3J0IiwgKFB5Q0Z1bmN0aW9uKVFkX0dldFFER2xvYmFsc1RoZVBvcnQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENHcmFmUHRyIF9ydikiKX0sCi0JeyJTZXRRREdsb2JhbHNSYW5kb21TZWVkIiwgKFB5Q0Z1bmN0aW9uKVFkX1NldFFER2xvYmFsc1JhbmRvbVNlZWQsIDEsCi0JIFB5RG9jX1NUUigiKGxvbmcgcmFuZG9tU2VlZCkgLT4gTm9uZSIpfSwKLQl7IlNldFFER2xvYmFsc0Fycm93IiwgKFB5Q0Z1bmN0aW9uKVFkX1NldFFER2xvYmFsc0Fycm93LCAxLAotCSBQeURvY19TVFIoIihDdXJzb3IgYXJyb3cpIC0+IE5vbmUiKX0sCi0JeyJHZXRSZWdpb25Cb3VuZHMiLCAoUHlDRnVuY3Rpb24pUWRfR2V0UmVnaW9uQm91bmRzLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgcmVnaW9uKSAtPiAoUmVjdCBib3VuZHMpIil9LAotCXsiSXNSZWdpb25SZWN0YW5ndWxhciIsIChQeUNGdW5jdGlvbilRZF9Jc1JlZ2lvblJlY3Rhbmd1bGFyLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgcmVnaW9uKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiQ3JlYXRlTmV3UG9ydCIsIChQeUNGdW5jdGlvbilRZF9DcmVhdGVOZXdQb3J0LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDR3JhZlB0ciBfcnYpIil9LAotCXsiU2V0UURFcnJvciIsIChQeUNGdW5jdGlvbilRZF9TZXRRREVycm9yLCAxLAotCSBQeURvY19TVFIoIihPU0VyciBlcnIpIC0+IE5vbmUiKX0sCi0JeyJMTUdldFNjclZSZXMiLCAoUHlDRnVuY3Rpb24pUWRfTE1HZXRTY3JWUmVzLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChTSW50MTYgX3J2KSIpfSwKLQl7IkxNU2V0U2NyVlJlcyIsIChQeUNGdW5jdGlvbilRZF9MTVNldFNjclZSZXMsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiB2YWx1ZSkgLT4gTm9uZSIpfSwKLQl7IkxNR2V0U2NySFJlcyIsIChQeUNGdW5jdGlvbilRZF9MTUdldFNjckhSZXMsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFNJbnQxNiBfcnYpIil9LAotCXsiTE1TZXRTY3JIUmVzIiwgKFB5Q0Z1bmN0aW9uKVFkX0xNU2V0U2NySFJlcywgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IHZhbHVlKSAtPiBOb25lIil9LAotCXsiTE1HZXRNYWluRGV2aWNlIiwgKFB5Q0Z1bmN0aW9uKVFkX0xNR2V0TWFpbkRldmljZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoR0RIYW5kbGUgX3J2KSIpfSwKLQl7IkxNU2V0TWFpbkRldmljZSIsIChQeUNGdW5jdGlvbilRZF9MTVNldE1haW5EZXZpY2UsIDEsCi0JIFB5RG9jX1NUUigiKEdESGFuZGxlIHZhbHVlKSAtPiBOb25lIil9LAotCXsiTE1HZXREZXZpY2VMaXN0IiwgKFB5Q0Z1bmN0aW9uKVFkX0xNR2V0RGV2aWNlTGlzdCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoR0RIYW5kbGUgX3J2KSIpfSwKLQl7IkxNU2V0RGV2aWNlTGlzdCIsIChQeUNGdW5jdGlvbilRZF9MTVNldERldmljZUxpc3QsIDEsCi0JIFB5RG9jX1NUUigiKEdESGFuZGxlIHZhbHVlKSAtPiBOb25lIil9LAotCXsiTE1HZXRRRENvbG9ycyIsIChQeUNGdW5jdGlvbilRZF9MTUdldFFEQ29sb3JzLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChIYW5kbGUgX3J2KSIpfSwKLQl7IkxNU2V0UURDb2xvcnMiLCAoUHlDRnVuY3Rpb24pUWRfTE1TZXRRRENvbG9ycywgMSwKLQkgUHlEb2NfU1RSKCIoSGFuZGxlIHZhbHVlKSAtPiBOb25lIil9LAotCXsiTE1HZXRXaWR0aExpc3RIYW5kIiwgKFB5Q0Z1bmN0aW9uKVFkX0xNR2V0V2lkdGhMaXN0SGFuZCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoSGFuZGxlIF9ydikiKX0sCi0JeyJMTVNldFdpZHRoTGlzdEhhbmQiLCAoUHlDRnVuY3Rpb24pUWRfTE1TZXRXaWR0aExpc3RIYW5kLCAxLAotCSBQeURvY19TVFIoIihIYW5kbGUgdmFsdWUpIC0+IE5vbmUiKX0sCi0JeyJMTUdldEhpbGl0ZU1vZGUiLCAoUHlDRnVuY3Rpb24pUWRfTE1HZXRIaWxpdGVNb2RlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChVSW50OCBfcnYpIil9LAotCXsiTE1TZXRIaWxpdGVNb2RlIiwgKFB5Q0Z1bmN0aW9uKVFkX0xNU2V0SGlsaXRlTW9kZSwgMSwKLQkgUHlEb2NfU1RSKCIoVUludDggdmFsdWUpIC0+IE5vbmUiKX0sCi0JeyJMTUdldFdpZHRoVGFiSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKVFkX0xNR2V0V2lkdGhUYWJIYW5kbGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEhhbmRsZSBfcnYpIil9LAotCXsiTE1TZXRXaWR0aFRhYkhhbmRsZSIsIChQeUNGdW5jdGlvbilRZF9MTVNldFdpZHRoVGFiSGFuZGxlLCAxLAotCSBQeURvY19TVFIoIihIYW5kbGUgdmFsdWUpIC0+IE5vbmUiKX0sCi0JeyJMTUdldExhc3RTUEV4dHJhIiwgKFB5Q0Z1bmN0aW9uKVFkX0xNR2V0TGFzdFNQRXh0cmEsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFNJbnQzMiBfcnYpIil9LAotCXsiTE1TZXRMYXN0U1BFeHRyYSIsIChQeUNGdW5jdGlvbilRZF9MTVNldExhc3RTUEV4dHJhLCAxLAotCSBQeURvY19TVFIoIihTSW50MzIgdmFsdWUpIC0+IE5vbmUiKX0sCi0JeyJMTUdldExhc3RGT05EIiwgKFB5Q0Z1bmN0aW9uKVFkX0xNR2V0TGFzdEZPTkQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEhhbmRsZSBfcnYpIil9LAotCXsiTE1TZXRMYXN0Rk9ORCIsIChQeUNGdW5jdGlvbilRZF9MTVNldExhc3RGT05ELCAxLAotCSBQeURvY19TVFIoIihIYW5kbGUgdmFsdWUpIC0+IE5vbmUiKX0sCi0JeyJMTUdldEZyYWN0RW5hYmxlIiwgKFB5Q0Z1bmN0aW9uKVFkX0xNR2V0RnJhY3RFbmFibGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQ4IF9ydikiKX0sCi0JeyJMTVNldEZyYWN0RW5hYmxlIiwgKFB5Q0Z1bmN0aW9uKVFkX0xNU2V0RnJhY3RFbmFibGUsIDEsCi0JIFB5RG9jX1NUUigiKFVJbnQ4IHZhbHVlKSAtPiBOb25lIil9LAotCXsiTE1HZXRUaGVHRGV2aWNlIiwgKFB5Q0Z1bmN0aW9uKVFkX0xNR2V0VGhlR0RldmljZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoR0RIYW5kbGUgX3J2KSIpfSwKLQl7IkxNU2V0VGhlR0RldmljZSIsIChQeUNGdW5jdGlvbilRZF9MTVNldFRoZUdEZXZpY2UsIDEsCi0JIFB5RG9jX1NUUigiKEdESGFuZGxlIHZhbHVlKSAtPiBOb25lIil9LAotCXsiTE1HZXRIaWxpdGVSR0IiLCAoUHlDRnVuY3Rpb24pUWRfTE1HZXRIaWxpdGVSR0IsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFJHQkNvbG9yIGhpbGl0ZVJHQlZhbHVlKSIpfSwKLQl7IkxNU2V0SGlsaXRlUkdCIiwgKFB5Q0Z1bmN0aW9uKVFkX0xNU2V0SGlsaXRlUkdCLCAxLAotCSBQeURvY19TVFIoIihSR0JDb2xvciBoaWxpdGVSR0JWYWx1ZSkgLT4gTm9uZSIpfSwKLQl7IkxNR2V0Q3Vyc29yTmV3IiwgKFB5Q0Z1bmN0aW9uKVFkX0xNR2V0Q3Vyc29yTmV3LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJMTVNldEN1cnNvck5ldyIsIChQeUNGdW5jdGlvbilRZF9MTVNldEN1cnNvck5ldywgMSwKLQkgUHlEb2NfU1RSKCIoQm9vbGVhbiB2YWx1ZSkgLT4gTm9uZSIpfSwKLQl7IlRleHRGb250IiwgKFB5Q0Z1bmN0aW9uKVFkX1RleHRGb250LCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBmb250KSAtPiBOb25lIil9LAotCXsiVGV4dEZhY2UiLCAoUHlDRnVuY3Rpb24pUWRfVGV4dEZhY2UsIDEsCi0JIFB5RG9jX1NUUigiKFN0eWxlUGFyYW1ldGVyIGZhY2UpIC0+IE5vbmUiKX0sCi0JeyJUZXh0TW9kZSIsIChQeUNGdW5jdGlvbilRZF9UZXh0TW9kZSwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgbW9kZSkgLT4gTm9uZSIpfSwKLQl7IlRleHRTaXplIiwgKFB5Q0Z1bmN0aW9uKVFkX1RleHRTaXplLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBzaXplKSAtPiBOb25lIil9LAotCXsiU3BhY2VFeHRyYSIsIChQeUNGdW5jdGlvbilRZF9TcGFjZUV4dHJhLCAxLAotCSBQeURvY19TVFIoIihGaXhlZCBleHRyYSkgLT4gTm9uZSIpfSwKLQl7IkRyYXdDaGFyIiwgKFB5Q0Z1bmN0aW9uKVFkX0RyYXdDaGFyLCAxLAotCSBQeURvY19TVFIoIihDaGFyUGFyYW1ldGVyIGNoKSAtPiBOb25lIil9LAotCXsiRHJhd1N0cmluZyIsIChQeUNGdW5jdGlvbilRZF9EcmF3U3RyaW5nLCAxLAotCSBQeURvY19TVFIoIihTdHIyNTUgcykgLT4gTm9uZSIpfSwKLQl7Ik1hY0RyYXdUZXh0IiwgKFB5Q0Z1bmN0aW9uKVFkX01hY0RyYXdUZXh0LCAxLAotCSBQeURvY19TVFIoIihCdWZmZXIgdGV4dEJ1Ziwgc2hvcnQgZmlyc3RCeXRlLCBzaG9ydCBieXRlQ291bnQpIC0+IE5vbmUiKX0sCi0JeyJDaGFyV2lkdGgiLCAoUHlDRnVuY3Rpb24pUWRfQ2hhcldpZHRoLCAxLAotCSBQeURvY19TVFIoIihDaGFyUGFyYW1ldGVyIGNoKSAtPiAoc2hvcnQgX3J2KSIpfSwKLQl7IlN0cmluZ1dpZHRoIiwgKFB5Q0Z1bmN0aW9uKVFkX1N0cmluZ1dpZHRoLCAxLAotCSBQeURvY19TVFIoIihTdHIyNTUgcykgLT4gKHNob3J0IF9ydikiKX0sCi0JeyJUZXh0V2lkdGgiLCAoUHlDRnVuY3Rpb24pUWRfVGV4dFdpZHRoLCAxLAotCSBQeURvY19TVFIoIihCdWZmZXIgdGV4dEJ1Ziwgc2hvcnQgZmlyc3RCeXRlLCBzaG9ydCBieXRlQ291bnQpIC0+IChzaG9ydCBfcnYpIil9LAotCXsiR2V0Rm9udEluZm8iLCAoUHlDRnVuY3Rpb24pUWRfR2V0Rm9udEluZm8sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEZvbnRJbmZvIGluZm8pIil9LAotCXsiQ2hhckV4dHJhIiwgKFB5Q0Z1bmN0aW9uKVFkX0NoYXJFeHRyYSwgMSwKLQkgUHlEb2NfU1RSKCIoRml4ZWQgZXh0cmEpIC0+IE5vbmUiKX0sCi0JeyJUcnVuY1N0cmluZyIsIChQeUNGdW5jdGlvbilRZF9UcnVuY1N0cmluZywgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgd2lkdGgsIFN0cjI1NSB0aGVTdHJpbmcsIFRydW5jQ29kZSB0cnVuY1doZXJlKSAtPiAoc2hvcnQgX3J2KSIpfSwKLQl7IlNldFBvcnQiLCAoUHlDRnVuY3Rpb24pUWRfU2V0UG9ydCwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhZlB0ciB0aGVQb3J0KSAtPiBOb25lIil9LAotCXsiR2V0Q3Vyc29yIiwgKFB5Q0Z1bmN0aW9uKVFkX0dldEN1cnNvciwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgY3Vyc29ySUQpIC0+IChDdXJzSGFuZGxlIF9ydikiKX0sCi0JeyJTZXRDdXJzb3IiLCAoUHlDRnVuY3Rpb24pUWRfU2V0Q3Vyc29yLCAxLAotCSBQeURvY19TVFIoIihDdXJzb3IgY3JzcikgLT4gTm9uZSIpfSwKLQl7IlNob3dDdXJzb3IiLCAoUHlDRnVuY3Rpb24pUWRfU2hvd0N1cnNvciwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiTGluZVRvIiwgKFB5Q0Z1bmN0aW9uKVFkX0xpbmVUbywgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgaCwgc2hvcnQgdikgLT4gTm9uZSIpfSwKLQl7IlNldFJlY3QiLCAoUHlDRnVuY3Rpb24pUWRfU2V0UmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgbGVmdCwgc2hvcnQgdG9wLCBzaG9ydCByaWdodCwgc2hvcnQgYm90dG9tKSAtPiAoUmVjdCByKSIpfSwKLQl7Ik9mZnNldFJlY3QiLCAoUHlDRnVuY3Rpb24pUWRfT2Zmc2V0UmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCByLCBzaG9ydCBkaCwgc2hvcnQgZHYpIC0+IChSZWN0IHIpIil9LAotCXsiSW5zZXRSZWN0IiwgKFB5Q0Z1bmN0aW9uKVFkX0luc2V0UmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCByLCBzaG9ydCBkaCwgc2hvcnQgZHYpIC0+IChSZWN0IHIpIil9LAotCXsiVW5pb25SZWN0IiwgKFB5Q0Z1bmN0aW9uKVFkX1VuaW9uUmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCBzcmMxLCBSZWN0IHNyYzIpIC0+IChSZWN0IGRzdFJlY3QpIil9LAotCXsiRXF1YWxSZWN0IiwgKFB5Q0Z1bmN0aW9uKVFkX0VxdWFsUmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCByZWN0MSwgUmVjdCByZWN0MikgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IkZyYW1lUmVjdCIsIChQeUNGdW5jdGlvbilRZF9GcmFtZVJlY3QsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgcikgLT4gTm9uZSIpfSwKLQl7IkludmVydFJlY3QiLCAoUHlDRnVuY3Rpb24pUWRfSW52ZXJ0UmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCByKSAtPiBOb25lIil9LAotCXsiRmlsbFJlY3QiLCAoUHlDRnVuY3Rpb24pUWRfRmlsbFJlY3QsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgciwgUGF0dGVybiBwYXQpIC0+IE5vbmUiKX0sCi0JeyJDb3B5UmduIiwgKFB5Q0Z1bmN0aW9uKVFkX0NvcHlSZ24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSBzcmNSZ24sIFJnbkhhbmRsZSBkc3RSZ24pIC0+IE5vbmUiKX0sCi0JeyJTZXRSZWN0UmduIiwgKFB5Q0Z1bmN0aW9uKVFkX1NldFJlY3RSZ24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZ24sIHNob3J0IGxlZnQsIHNob3J0IHRvcCwgc2hvcnQgcmlnaHQsIHNob3J0IGJvdHRvbSkgLT4gTm9uZSIpfSwKLQl7Ik9mZnNldFJnbiIsIChQeUNGdW5jdGlvbilRZF9PZmZzZXRSZ24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZ24sIHNob3J0IGRoLCBzaG9ydCBkdikgLT4gTm9uZSIpfSwKLQl7IlVuaW9uUmduIiwgKFB5Q0Z1bmN0aW9uKVFkX1VuaW9uUmduLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgc3JjUmduQSwgUmduSGFuZGxlIHNyY1JnbkIsIFJnbkhhbmRsZSBkc3RSZ24pIC0+IE5vbmUiKX0sCi0JeyJYb3JSZ24iLCAoUHlDRnVuY3Rpb24pUWRfWG9yUmduLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgc3JjUmduQSwgUmduSGFuZGxlIHNyY1JnbkIsIFJnbkhhbmRsZSBkc3RSZ24pIC0+IE5vbmUiKX0sCi0JeyJFcXVhbFJnbiIsIChQeUNGdW5jdGlvbilRZF9FcXVhbFJnbiwgMSwKLQkgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHJnbkEsIFJnbkhhbmRsZSByZ25CKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiRnJhbWVSZ24iLCAoUHlDRnVuY3Rpb24pUWRfRnJhbWVSZ24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZ24pIC0+IE5vbmUiKX0sCi0JeyJQYWludFJnbiIsIChQeUNGdW5jdGlvbilRZF9QYWludFJnbiwgMSwKLQkgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHJnbikgLT4gTm9uZSIpfSwKLQl7IkludmVydFJnbiIsIChQeUNGdW5jdGlvbilRZF9JbnZlcnRSZ24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZ24pIC0+IE5vbmUiKX0sCi0JeyJGaWxsUmduIiwgKFB5Q0Z1bmN0aW9uKVFkX0ZpbGxSZ24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZ24sIFBhdHRlcm4gcGF0KSAtPiBOb25lIil9LAotCXsiR2V0UGl4ZWwiLCAoUHlDRnVuY3Rpb24pUWRfR2V0UGl4ZWwsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGgsIHNob3J0IHYpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJQdEluUmVjdCIsIChQeUNGdW5jdGlvbilRZF9QdEluUmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoUG9pbnQgcHQsIFJlY3QgcikgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IkRyYXdUZXh0IiwgKFB5Q0Z1bmN0aW9uKVFkX0RyYXdUZXh0LCAxLAotCSBQeURvY19TVFIoIihCdWZmZXIgdGV4dEJ1Ziwgc2hvcnQgZmlyc3RCeXRlLCBzaG9ydCBieXRlQ291bnQpIC0+IE5vbmUiKX0sCi0JeyJCaXRNYXAiLCAoUHlDRnVuY3Rpb24pUWRfQml0TWFwLCAxLAotCSBQeURvY19TVFIoIlRha2UgKHN0cmluZywgaW50LCBSZWN0KSBhcmd1bWVudCBhbmQgY3JlYXRlIEJpdE1hcCIpfSwKLQl7IlJhd0JpdE1hcCIsIChQeUNGdW5jdGlvbilRZF9SYXdCaXRNYXAsIDEsCi0JIFB5RG9jX1NUUigiVGFrZSBzdHJpbmcgQml0TWFwIGFuZCB0dXJuIGludG8gQml0TWFwIG9iamVjdCIpfSwKKyAgICB7IkdldFBvcnQiLCAoUHlDRnVuY3Rpb24pUWRfR2V0UG9ydCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoR3JhZlB0ciBwb3J0KSIpfSwKKyAgICB7IkdyYWZEZXZpY2UiLCAoUHlDRnVuY3Rpb24pUWRfR3JhZkRldmljZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgZGV2aWNlKSAtPiBOb25lIil9LAorICAgIHsiU2V0UG9ydEJpdHMiLCAoUHlDRnVuY3Rpb24pUWRfU2V0UG9ydEJpdHMsIDEsCisgICAgIFB5RG9jX1NUUigiKEJpdE1hcFB0ciBibSkgLT4gTm9uZSIpfSwKKyAgICB7IlBvcnRTaXplIiwgKFB5Q0Z1bmN0aW9uKVFkX1BvcnRTaXplLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCB3aWR0aCwgc2hvcnQgaGVpZ2h0KSAtPiBOb25lIil9LAorICAgIHsiTW92ZVBvcnRUbyIsIChQeUNGdW5jdGlvbilRZF9Nb3ZlUG9ydFRvLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBsZWZ0R2xvYmFsLCBzaG9ydCB0b3BHbG9iYWwpIC0+IE5vbmUiKX0sCisgICAgeyJTZXRPcmlnaW4iLCAoUHlDRnVuY3Rpb24pUWRfU2V0T3JpZ2luLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBoLCBzaG9ydCB2KSAtPiBOb25lIil9LAorICAgIHsiU2V0Q2xpcCIsIChQeUNGdW5jdGlvbilRZF9TZXRDbGlwLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgcmduKSAtPiBOb25lIil9LAorICAgIHsiR2V0Q2xpcCIsIChQeUNGdW5jdGlvbilRZF9HZXRDbGlwLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgcmduKSAtPiBOb25lIil9LAorICAgIHsiQ2xpcFJlY3QiLCAoUHlDRnVuY3Rpb24pUWRfQ2xpcFJlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgcikgLT4gTm9uZSIpfSwKKyAgICB7IkJhY2tQYXQiLCAoUHlDRnVuY3Rpb24pUWRfQmFja1BhdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUGF0dGVybiBwYXQpIC0+IE5vbmUiKX0sCisgICAgeyJJbml0Q3Vyc29yIiwgKFB5Q0Z1bmN0aW9uKVFkX0luaXRDdXJzb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7Ik1hY1NldEN1cnNvciIsIChQeUNGdW5jdGlvbilRZF9NYWNTZXRDdXJzb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKEN1cnNvciBjcnNyKSAtPiBOb25lIil9LAorICAgIHsiSGlkZUN1cnNvciIsIChQeUNGdW5jdGlvbilRZF9IaWRlQ3Vyc29yLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJNYWNTaG93Q3Vyc29yIiwgKFB5Q0Z1bmN0aW9uKVFkX01hY1Nob3dDdXJzb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7Ik9ic2N1cmVDdXJzb3IiLCAoUHlDRnVuY3Rpb24pUWRfT2JzY3VyZUN1cnNvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiSGlkZVBlbiIsIChQeUNGdW5jdGlvbilRZF9IaWRlUGVuLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJTaG93UGVuIiwgKFB5Q0Z1bmN0aW9uKVFkX1Nob3dQZW4sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldFBlbiIsIChQeUNGdW5jdGlvbilRZF9HZXRQZW4sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFBvaW50IHB0KSIpfSwKKyAgICB7IkdldFBlblN0YXRlIiwgKFB5Q0Z1bmN0aW9uKVFkX0dldFBlblN0YXRlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChQZW5TdGF0ZSBwblN0YXRlKSIpfSwKKyAgICB7IlNldFBlblN0YXRlIiwgKFB5Q0Z1bmN0aW9uKVFkX1NldFBlblN0YXRlLCAxLAorICAgICBQeURvY19TVFIoIihQZW5TdGF0ZSBwblN0YXRlKSAtPiBOb25lIil9LAorICAgIHsiUGVuU2l6ZSIsIChQeUNGdW5jdGlvbilRZF9QZW5TaXplLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCB3aWR0aCwgc2hvcnQgaGVpZ2h0KSAtPiBOb25lIil9LAorICAgIHsiUGVuTW9kZSIsIChQeUNGdW5jdGlvbilRZF9QZW5Nb2RlLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBtb2RlKSAtPiBOb25lIil9LAorICAgIHsiUGVuUGF0IiwgKFB5Q0Z1bmN0aW9uKVFkX1BlblBhdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUGF0dGVybiBwYXQpIC0+IE5vbmUiKX0sCisgICAgeyJQZW5Ob3JtYWwiLCAoUHlDRnVuY3Rpb24pUWRfUGVuTm9ybWFsLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJNb3ZlVG8iLCAoUHlDRnVuY3Rpb24pUWRfTW92ZVRvLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBoLCBzaG9ydCB2KSAtPiBOb25lIil9LAorICAgIHsiTW92ZSIsIChQeUNGdW5jdGlvbilRZF9Nb3ZlLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBkaCwgc2hvcnQgZHYpIC0+IE5vbmUiKX0sCisgICAgeyJNYWNMaW5lVG8iLCAoUHlDRnVuY3Rpb24pUWRfTWFjTGluZVRvLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBoLCBzaG9ydCB2KSAtPiBOb25lIil9LAorICAgIHsiTGluZSIsIChQeUNGdW5jdGlvbilRZF9MaW5lLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBkaCwgc2hvcnQgZHYpIC0+IE5vbmUiKX0sCisgICAgeyJGb3JlQ29sb3IiLCAoUHlDRnVuY3Rpb24pUWRfRm9yZUNvbG9yLCAxLAorICAgICBQeURvY19TVFIoIihsb25nIGNvbG9yKSAtPiBOb25lIil9LAorICAgIHsiQmFja0NvbG9yIiwgKFB5Q0Z1bmN0aW9uKVFkX0JhY2tDb2xvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIobG9uZyBjb2xvcikgLT4gTm9uZSIpfSwKKyAgICB7IkNvbG9yQml0IiwgKFB5Q0Z1bmN0aW9uKVFkX0NvbG9yQml0LCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCB3aGljaEJpdCkgLT4gTm9uZSIpfSwKKyAgICB7Ik1hY1NldFJlY3QiLCAoUHlDRnVuY3Rpb24pUWRfTWFjU2V0UmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgbGVmdCwgc2hvcnQgdG9wLCBzaG9ydCByaWdodCwgc2hvcnQgYm90dG9tKSAtPiAoUmVjdCByKSIpfSwKKyAgICB7Ik1hY09mZnNldFJlY3QiLCAoUHlDRnVuY3Rpb24pUWRfTWFjT2Zmc2V0UmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCByLCBzaG9ydCBkaCwgc2hvcnQgZHYpIC0+IChSZWN0IHIpIil9LAorICAgIHsiTWFjSW5zZXRSZWN0IiwgKFB5Q0Z1bmN0aW9uKVFkX01hY0luc2V0UmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCByLCBzaG9ydCBkaCwgc2hvcnQgZHYpIC0+IChSZWN0IHIpIil9LAorICAgIHsiU2VjdFJlY3QiLCAoUHlDRnVuY3Rpb24pUWRfU2VjdFJlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3Qgc3JjMSwgUmVjdCBzcmMyKSAtPiAoQm9vbGVhbiBfcnYsIFJlY3QgZHN0UmVjdCkiKX0sCisgICAgeyJNYWNVbmlvblJlY3QiLCAoUHlDRnVuY3Rpb24pUWRfTWFjVW5pb25SZWN0LCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IHNyYzEsIFJlY3Qgc3JjMikgLT4gKFJlY3QgZHN0UmVjdCkiKX0sCisgICAgeyJNYWNFcXVhbFJlY3QiLCAoUHlDRnVuY3Rpb24pUWRfTWFjRXF1YWxSZWN0LCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IHJlY3QxLCBSZWN0IHJlY3QyKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiRW1wdHlSZWN0IiwgKFB5Q0Z1bmN0aW9uKVFkX0VtcHR5UmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCByKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiTWFjRnJhbWVSZWN0IiwgKFB5Q0Z1bmN0aW9uKVFkX01hY0ZyYW1lUmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCByKSAtPiBOb25lIil9LAorICAgIHsiUGFpbnRSZWN0IiwgKFB5Q0Z1bmN0aW9uKVFkX1BhaW50UmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCByKSAtPiBOb25lIil9LAorICAgIHsiRXJhc2VSZWN0IiwgKFB5Q0Z1bmN0aW9uKVFkX0VyYXNlUmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCByKSAtPiBOb25lIil9LAorICAgIHsiTWFjSW52ZXJ0UmVjdCIsIChQeUNGdW5jdGlvbilRZF9NYWNJbnZlcnRSZWN0LCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IHIpIC0+IE5vbmUiKX0sCisgICAgeyJNYWNGaWxsUmVjdCIsIChQeUNGdW5jdGlvbilRZF9NYWNGaWxsUmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCByLCBQYXR0ZXJuIHBhdCkgLT4gTm9uZSIpfSwKKyAgICB7IkZyYW1lT3ZhbCIsIChQeUNGdW5jdGlvbilRZF9GcmFtZU92YWwsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgcikgLT4gTm9uZSIpfSwKKyAgICB7IlBhaW50T3ZhbCIsIChQeUNGdW5jdGlvbilRZF9QYWludE92YWwsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgcikgLT4gTm9uZSIpfSwKKyAgICB7IkVyYXNlT3ZhbCIsIChQeUNGdW5jdGlvbilRZF9FcmFzZU92YWwsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgcikgLT4gTm9uZSIpfSwKKyAgICB7IkludmVydE92YWwiLCAoUHlDRnVuY3Rpb24pUWRfSW52ZXJ0T3ZhbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCByKSAtPiBOb25lIil9LAorICAgIHsiRmlsbE92YWwiLCAoUHlDRnVuY3Rpb24pUWRfRmlsbE92YWwsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgciwgUGF0dGVybiBwYXQpIC0+IE5vbmUiKX0sCisgICAgeyJGcmFtZVJvdW5kUmVjdCIsIChQeUNGdW5jdGlvbilRZF9GcmFtZVJvdW5kUmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCByLCBzaG9ydCBvdmFsV2lkdGgsIHNob3J0IG92YWxIZWlnaHQpIC0+IE5vbmUiKX0sCisgICAgeyJQYWludFJvdW5kUmVjdCIsIChQeUNGdW5jdGlvbilRZF9QYWludFJvdW5kUmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCByLCBzaG9ydCBvdmFsV2lkdGgsIHNob3J0IG92YWxIZWlnaHQpIC0+IE5vbmUiKX0sCisgICAgeyJFcmFzZVJvdW5kUmVjdCIsIChQeUNGdW5jdGlvbilRZF9FcmFzZVJvdW5kUmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCByLCBzaG9ydCBvdmFsV2lkdGgsIHNob3J0IG92YWxIZWlnaHQpIC0+IE5vbmUiKX0sCisgICAgeyJJbnZlcnRSb3VuZFJlY3QiLCAoUHlDRnVuY3Rpb24pUWRfSW52ZXJ0Um91bmRSZWN0LCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IHIsIHNob3J0IG92YWxXaWR0aCwgc2hvcnQgb3ZhbEhlaWdodCkgLT4gTm9uZSIpfSwKKyAgICB7IkZpbGxSb3VuZFJlY3QiLCAoUHlDRnVuY3Rpb24pUWRfRmlsbFJvdW5kUmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCByLCBzaG9ydCBvdmFsV2lkdGgsIHNob3J0IG92YWxIZWlnaHQsIFBhdHRlcm4gcGF0KSAtPiBOb25lIil9LAorICAgIHsiRnJhbWVBcmMiLCAoUHlDRnVuY3Rpb24pUWRfRnJhbWVBcmMsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3Qgciwgc2hvcnQgc3RhcnRBbmdsZSwgc2hvcnQgYXJjQW5nbGUpIC0+IE5vbmUiKX0sCisgICAgeyJQYWludEFyYyIsIChQeUNGdW5jdGlvbilRZF9QYWludEFyYywgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCByLCBzaG9ydCBzdGFydEFuZ2xlLCBzaG9ydCBhcmNBbmdsZSkgLT4gTm9uZSIpfSwKKyAgICB7IkVyYXNlQXJjIiwgKFB5Q0Z1bmN0aW9uKVFkX0VyYXNlQXJjLCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IHIsIHNob3J0IHN0YXJ0QW5nbGUsIHNob3J0IGFyY0FuZ2xlKSAtPiBOb25lIil9LAorICAgIHsiSW52ZXJ0QXJjIiwgKFB5Q0Z1bmN0aW9uKVFkX0ludmVydEFyYywgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCByLCBzaG9ydCBzdGFydEFuZ2xlLCBzaG9ydCBhcmNBbmdsZSkgLT4gTm9uZSIpfSwKKyAgICB7IkZpbGxBcmMiLCAoUHlDRnVuY3Rpb24pUWRfRmlsbEFyYywgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCByLCBzaG9ydCBzdGFydEFuZ2xlLCBzaG9ydCBhcmNBbmdsZSwgUGF0dGVybiBwYXQpIC0+IE5vbmUiKX0sCisgICAgeyJOZXdSZ24iLCAoUHlDRnVuY3Rpb24pUWRfTmV3UmduLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChSZ25IYW5kbGUgX3J2KSIpfSwKKyAgICB7Ik9wZW5SZ24iLCAoUHlDRnVuY3Rpb24pUWRfT3BlblJnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiQ2xvc2VSZ24iLCAoUHlDRnVuY3Rpb24pUWRfQ2xvc2VSZ24sIDEsCisgICAgIFB5RG9jX1NUUigiKFJnbkhhbmRsZSBkc3RSZ24pIC0+IE5vbmUiKX0sCisgICAgeyJCaXRNYXBUb1JlZ2lvbiIsIChQeUNGdW5jdGlvbilRZF9CaXRNYXBUb1JlZ2lvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHJlZ2lvbiwgQml0TWFwUHRyIGJNYXApIC0+IE5vbmUiKX0sCisgICAgeyJSZ25Ub0hhbmRsZSIsIChQeUNGdW5jdGlvbilRZF9SZ25Ub0hhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHJlZ2lvbiwgSGFuZGxlIGZsYXR0ZW5lZFJnbkRhdGFIZGwpIC0+IE5vbmUiKX0sCisgICAgeyJEaXNwb3NlUmduIiwgKFB5Q0Z1bmN0aW9uKVFkX0Rpc3Bvc2VSZ24sIDEsCisgICAgIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZ24pIC0+IE5vbmUiKX0sCisgICAgeyJNYWNDb3B5UmduIiwgKFB5Q0Z1bmN0aW9uKVFkX01hY0NvcHlSZ24sIDEsCisgICAgIFB5RG9jX1NUUigiKFJnbkhhbmRsZSBzcmNSZ24sIFJnbkhhbmRsZSBkc3RSZ24pIC0+IE5vbmUiKX0sCisgICAgeyJTZXRFbXB0eVJnbiIsIChQeUNGdW5jdGlvbilRZF9TZXRFbXB0eVJnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHJnbikgLT4gTm9uZSIpfSwKKyAgICB7Ik1hY1NldFJlY3RSZ24iLCAoUHlDRnVuY3Rpb24pUWRfTWFjU2V0UmVjdFJnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHJnbiwgc2hvcnQgbGVmdCwgc2hvcnQgdG9wLCBzaG9ydCByaWdodCwgc2hvcnQgYm90dG9tKSAtPiBOb25lIil9LAorICAgIHsiUmVjdFJnbiIsIChQeUNGdW5jdGlvbilRZF9SZWN0UmduLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgcmduLCBSZWN0IHIpIC0+IE5vbmUiKX0sCisgICAgeyJNYWNPZmZzZXRSZ24iLCAoUHlDRnVuY3Rpb24pUWRfTWFjT2Zmc2V0UmduLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgcmduLCBzaG9ydCBkaCwgc2hvcnQgZHYpIC0+IE5vbmUiKX0sCisgICAgeyJJbnNldFJnbiIsIChQeUNGdW5jdGlvbilRZF9JbnNldFJnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHJnbiwgc2hvcnQgZGgsIHNob3J0IGR2KSAtPiBOb25lIil9LAorICAgIHsiU2VjdFJnbiIsIChQeUNGdW5jdGlvbilRZF9TZWN0UmduLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgc3JjUmduQSwgUmduSGFuZGxlIHNyY1JnbkIsIFJnbkhhbmRsZSBkc3RSZ24pIC0+IE5vbmUiKX0sCisgICAgeyJNYWNVbmlvblJnbiIsIChQeUNGdW5jdGlvbilRZF9NYWNVbmlvblJnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHNyY1JnbkEsIFJnbkhhbmRsZSBzcmNSZ25CLCBSZ25IYW5kbGUgZHN0UmduKSAtPiBOb25lIil9LAorICAgIHsiRGlmZlJnbiIsIChQeUNGdW5jdGlvbilRZF9EaWZmUmduLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgc3JjUmduQSwgUmduSGFuZGxlIHNyY1JnbkIsIFJnbkhhbmRsZSBkc3RSZ24pIC0+IE5vbmUiKX0sCisgICAgeyJNYWNYb3JSZ24iLCAoUHlDRnVuY3Rpb24pUWRfTWFjWG9yUmduLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgc3JjUmduQSwgUmduSGFuZGxlIHNyY1JnbkIsIFJnbkhhbmRsZSBkc3RSZ24pIC0+IE5vbmUiKX0sCisgICAgeyJSZWN0SW5SZ24iLCAoUHlDRnVuY3Rpb24pUWRfUmVjdEluUmduLCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IHIsIFJnbkhhbmRsZSByZ24pIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJNYWNFcXVhbFJnbiIsIChQeUNGdW5jdGlvbilRZF9NYWNFcXVhbFJnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHJnbkEsIFJnbkhhbmRsZSByZ25CKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiRW1wdHlSZ24iLCAoUHlDRnVuY3Rpb24pUWRfRW1wdHlSZ24sIDEsCisgICAgIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZ24pIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJNYWNGcmFtZVJnbiIsIChQeUNGdW5jdGlvbilRZF9NYWNGcmFtZVJnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHJnbikgLT4gTm9uZSIpfSwKKyAgICB7Ik1hY1BhaW50UmduIiwgKFB5Q0Z1bmN0aW9uKVFkX01hY1BhaW50UmduLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgcmduKSAtPiBOb25lIil9LAorICAgIHsiRXJhc2VSZ24iLCAoUHlDRnVuY3Rpb24pUWRfRXJhc2VSZ24sIDEsCisgICAgIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZ24pIC0+IE5vbmUiKX0sCisgICAgeyJNYWNJbnZlcnRSZ24iLCAoUHlDRnVuY3Rpb24pUWRfTWFjSW52ZXJ0UmduLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgcmduKSAtPiBOb25lIil9LAorICAgIHsiTWFjRmlsbFJnbiIsIChQeUNGdW5jdGlvbilRZF9NYWNGaWxsUmduLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgcmduLCBQYXR0ZXJuIHBhdCkgLT4gTm9uZSIpfSwKKyAgICB7IlNjcm9sbFJlY3QiLCAoUHlDRnVuY3Rpb24pUWRfU2Nyb2xsUmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCByLCBzaG9ydCBkaCwgc2hvcnQgZHYsIFJnbkhhbmRsZSB1cGRhdGVSZ24pIC0+IE5vbmUiKX0sCisgICAgeyJDb3B5Qml0cyIsIChQeUNGdW5jdGlvbilRZF9Db3B5Qml0cywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQml0TWFwUHRyIHNyY0JpdHMsIEJpdE1hcFB0ciBkc3RCaXRzLCBSZWN0IHNyY1JlY3QsIFJlY3QgZHN0UmVjdCwgc2hvcnQgbW9kZSwgUmduSGFuZGxlIG1hc2tSZ24pIC0+IE5vbmUiKX0sCisgICAgeyJDb3B5TWFzayIsIChQeUNGdW5jdGlvbilRZF9Db3B5TWFzaywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQml0TWFwUHRyIHNyY0JpdHMsIEJpdE1hcFB0ciBtYXNrQml0cywgQml0TWFwUHRyIGRzdEJpdHMsIFJlY3Qgc3JjUmVjdCwgUmVjdCBtYXNrUmVjdCwgUmVjdCBkc3RSZWN0KSAtPiBOb25lIil9LAorICAgIHsiT3BlblBpY3R1cmUiLCAoUHlDRnVuY3Rpb24pUWRfT3BlblBpY3R1cmUsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgcGljRnJhbWUpIC0+IChQaWNIYW5kbGUgX3J2KSIpfSwKKyAgICB7IlBpY0NvbW1lbnQiLCAoUHlDRnVuY3Rpb24pUWRfUGljQ29tbWVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQga2luZCwgc2hvcnQgZGF0YVNpemUsIEhhbmRsZSBkYXRhSGFuZGxlKSAtPiBOb25lIil9LAorICAgIHsiQ2xvc2VQaWN0dXJlIiwgKFB5Q0Z1bmN0aW9uKVFkX0Nsb3NlUGljdHVyZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiRHJhd1BpY3R1cmUiLCAoUHlDRnVuY3Rpb24pUWRfRHJhd1BpY3R1cmUsIDEsCisgICAgIFB5RG9jX1NUUigiKFBpY0hhbmRsZSBteVBpY3R1cmUsIFJlY3QgZHN0UmVjdCkgLT4gTm9uZSIpfSwKKyAgICB7IktpbGxQaWN0dXJlIiwgKFB5Q0Z1bmN0aW9uKVFkX0tpbGxQaWN0dXJlLCAxLAorICAgICBQeURvY19TVFIoIihQaWNIYW5kbGUgbXlQaWN0dXJlKSAtPiBOb25lIil9LAorICAgIHsiT3BlblBvbHkiLCAoUHlDRnVuY3Rpb24pUWRfT3BlblBvbHksIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFBvbHlIYW5kbGUgX3J2KSIpfSwKKyAgICB7IkNsb3NlUG9seSIsIChQeUNGdW5jdGlvbilRZF9DbG9zZVBvbHksIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IktpbGxQb2x5IiwgKFB5Q0Z1bmN0aW9uKVFkX0tpbGxQb2x5LCAxLAorICAgICBQeURvY19TVFIoIihQb2x5SGFuZGxlIHBvbHkpIC0+IE5vbmUiKX0sCisgICAgeyJPZmZzZXRQb2x5IiwgKFB5Q0Z1bmN0aW9uKVFkX09mZnNldFBvbHksIDEsCisgICAgIFB5RG9jX1NUUigiKFBvbHlIYW5kbGUgcG9seSwgc2hvcnQgZGgsIHNob3J0IGR2KSAtPiBOb25lIil9LAorICAgIHsiRnJhbWVQb2x5IiwgKFB5Q0Z1bmN0aW9uKVFkX0ZyYW1lUG9seSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9seUhhbmRsZSBwb2x5KSAtPiBOb25lIil9LAorICAgIHsiUGFpbnRQb2x5IiwgKFB5Q0Z1bmN0aW9uKVFkX1BhaW50UG9seSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9seUhhbmRsZSBwb2x5KSAtPiBOb25lIil9LAorICAgIHsiRXJhc2VQb2x5IiwgKFB5Q0Z1bmN0aW9uKVFkX0VyYXNlUG9seSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9seUhhbmRsZSBwb2x5KSAtPiBOb25lIil9LAorICAgIHsiSW52ZXJ0UG9seSIsIChQeUNGdW5jdGlvbilRZF9JbnZlcnRQb2x5LCAxLAorICAgICBQeURvY19TVFIoIihQb2x5SGFuZGxlIHBvbHkpIC0+IE5vbmUiKX0sCisgICAgeyJGaWxsUG9seSIsIChQeUNGdW5jdGlvbilRZF9GaWxsUG9seSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9seUhhbmRsZSBwb2x5LCBQYXR0ZXJuIHBhdCkgLT4gTm9uZSIpfSwKKyAgICB7IlNldFB0IiwgKFB5Q0Z1bmN0aW9uKVFkX1NldFB0LCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBoLCBzaG9ydCB2KSAtPiAoUG9pbnQgcHQpIil9LAorICAgIHsiTG9jYWxUb0dsb2JhbCIsIChQeUNGdW5jdGlvbilRZF9Mb2NhbFRvR2xvYmFsLCAxLAorICAgICBQeURvY19TVFIoIihQb2ludCBwdCkgLT4gKFBvaW50IHB0KSIpfSwKKyAgICB7Ikdsb2JhbFRvTG9jYWwiLCAoUHlDRnVuY3Rpb24pUWRfR2xvYmFsVG9Mb2NhbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgcHQpIC0+IChQb2ludCBwdCkiKX0sCisgICAgeyJSYW5kb20iLCAoUHlDRnVuY3Rpb24pUWRfUmFuZG9tLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChzaG9ydCBfcnYpIil9LAorICAgIHsiTWFjR2V0UGl4ZWwiLCAoUHlDRnVuY3Rpb24pUWRfTWFjR2V0UGl4ZWwsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGgsIHNob3J0IHYpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJTY2FsZVB0IiwgKFB5Q0Z1bmN0aW9uKVFkX1NjYWxlUHQsIDEsCisgICAgIFB5RG9jX1NUUigiKFBvaW50IHB0LCBSZWN0IHNyY1JlY3QsIFJlY3QgZHN0UmVjdCkgLT4gKFBvaW50IHB0KSIpfSwKKyAgICB7Ik1hcFB0IiwgKFB5Q0Z1bmN0aW9uKVFkX01hcFB0LCAxLAorICAgICBQeURvY19TVFIoIihQb2ludCBwdCwgUmVjdCBzcmNSZWN0LCBSZWN0IGRzdFJlY3QpIC0+IChQb2ludCBwdCkiKX0sCisgICAgeyJNYXBSZWN0IiwgKFB5Q0Z1bmN0aW9uKVFkX01hcFJlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgciwgUmVjdCBzcmNSZWN0LCBSZWN0IGRzdFJlY3QpIC0+IChSZWN0IHIpIil9LAorICAgIHsiTWFwUmduIiwgKFB5Q0Z1bmN0aW9uKVFkX01hcFJnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHJnbiwgUmVjdCBzcmNSZWN0LCBSZWN0IGRzdFJlY3QpIC0+IE5vbmUiKX0sCisgICAgeyJNYXBQb2x5IiwgKFB5Q0Z1bmN0aW9uKVFkX01hcFBvbHksIDEsCisgICAgIFB5RG9jX1NUUigiKFBvbHlIYW5kbGUgcG9seSwgUmVjdCBzcmNSZWN0LCBSZWN0IGRzdFJlY3QpIC0+IE5vbmUiKX0sCisgICAgeyJTdGRCaXRzIiwgKFB5Q0Z1bmN0aW9uKVFkX1N0ZEJpdHMsIDEsCisgICAgIFB5RG9jX1NUUigiKEJpdE1hcFB0ciBzcmNCaXRzLCBSZWN0IHNyY1JlY3QsIFJlY3QgZHN0UmVjdCwgc2hvcnQgbW9kZSwgUmduSGFuZGxlIG1hc2tSZ24pIC0+IE5vbmUiKX0sCisgICAgeyJBZGRQdCIsIChQeUNGdW5jdGlvbilRZF9BZGRQdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgc3JjLCBQb2ludCBkc3QpIC0+IChQb2ludCBkc3QpIil9LAorICAgIHsiRXF1YWxQdCIsIChQeUNGdW5jdGlvbilRZF9FcXVhbFB0LCAxLAorICAgICBQeURvY19TVFIoIihQb2ludCBwdDEsIFBvaW50IHB0MikgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7Ik1hY1B0SW5SZWN0IiwgKFB5Q0Z1bmN0aW9uKVFkX01hY1B0SW5SZWN0LCAxLAorICAgICBQeURvY19TVFIoIihQb2ludCBwdCwgUmVjdCByKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiUHQyUmVjdCIsIChQeUNGdW5jdGlvbilRZF9QdDJSZWN0LCAxLAorICAgICBQeURvY19TVFIoIihQb2ludCBwdDEsIFBvaW50IHB0MikgLT4gKFJlY3QgZHN0UmVjdCkiKX0sCisgICAgeyJQdFRvQW5nbGUiLCAoUHlDRnVuY3Rpb24pUWRfUHRUb0FuZ2xlLCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IHIsIFBvaW50IHB0KSAtPiAoc2hvcnQgYW5nbGUpIil9LAorICAgIHsiU3ViUHQiLCAoUHlDRnVuY3Rpb24pUWRfU3ViUHQsIDEsCisgICAgIFB5RG9jX1NUUigiKFBvaW50IHNyYywgUG9pbnQgZHN0KSAtPiAoUG9pbnQgZHN0KSIpfSwKKyAgICB7IlB0SW5SZ24iLCAoUHlDRnVuY3Rpb24pUWRfUHRJblJnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgcHQsIFJnbkhhbmRsZSByZ24pIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJOZXdQaXhNYXAiLCAoUHlDRnVuY3Rpb24pUWRfTmV3UGl4TWFwLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChQaXhNYXBIYW5kbGUgX3J2KSIpfSwKKyAgICB7IkRpc3Bvc2VQaXhNYXAiLCAoUHlDRnVuY3Rpb24pUWRfRGlzcG9zZVBpeE1hcCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUGl4TWFwSGFuZGxlIHBtKSAtPiBOb25lIil9LAorICAgIHsiQ29weVBpeE1hcCIsIChQeUNGdW5jdGlvbilRZF9Db3B5UGl4TWFwLCAxLAorICAgICBQeURvY19TVFIoIihQaXhNYXBIYW5kbGUgc3JjUE0sIFBpeE1hcEhhbmRsZSBkc3RQTSkgLT4gTm9uZSIpfSwKKyAgICB7Ik5ld1BpeFBhdCIsIChQeUNGdW5jdGlvbilRZF9OZXdQaXhQYXQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFBpeFBhdEhhbmRsZSBfcnYpIil9LAorICAgIHsiRGlzcG9zZVBpeFBhdCIsIChQeUNGdW5jdGlvbilRZF9EaXNwb3NlUGl4UGF0LCAxLAorICAgICBQeURvY19TVFIoIihQaXhQYXRIYW5kbGUgcHApIC0+IE5vbmUiKX0sCisgICAgeyJDb3B5UGl4UGF0IiwgKFB5Q0Z1bmN0aW9uKVFkX0NvcHlQaXhQYXQsIDEsCisgICAgIFB5RG9jX1NUUigiKFBpeFBhdEhhbmRsZSBzcmNQUCwgUGl4UGF0SGFuZGxlIGRzdFBQKSAtPiBOb25lIil9LAorICAgIHsiUGVuUGl4UGF0IiwgKFB5Q0Z1bmN0aW9uKVFkX1BlblBpeFBhdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUGl4UGF0SGFuZGxlIHBwKSAtPiBOb25lIil9LAorICAgIHsiQmFja1BpeFBhdCIsIChQeUNGdW5jdGlvbilRZF9CYWNrUGl4UGF0LCAxLAorICAgICBQeURvY19TVFIoIihQaXhQYXRIYW5kbGUgcHApIC0+IE5vbmUiKX0sCisgICAgeyJHZXRQaXhQYXQiLCAoUHlDRnVuY3Rpb24pUWRfR2V0UGl4UGF0LCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBwYXRJRCkgLT4gKFBpeFBhdEhhbmRsZSBfcnYpIil9LAorICAgIHsiTWFrZVJHQlBhdCIsIChQeUNGdW5jdGlvbilRZF9NYWtlUkdCUGF0LCAxLAorICAgICBQeURvY19TVFIoIihQaXhQYXRIYW5kbGUgcHAsIFJHQkNvbG9yIG15Q29sb3IpIC0+IE5vbmUiKX0sCisgICAgeyJGaWxsQ1JlY3QiLCAoUHlDRnVuY3Rpb24pUWRfRmlsbENSZWN0LCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IHIsIFBpeFBhdEhhbmRsZSBwcCkgLT4gTm9uZSIpfSwKKyAgICB7IkZpbGxDT3ZhbCIsIChQeUNGdW5jdGlvbilRZF9GaWxsQ092YWwsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgciwgUGl4UGF0SGFuZGxlIHBwKSAtPiBOb25lIil9LAorICAgIHsiRmlsbENSb3VuZFJlY3QiLCAoUHlDRnVuY3Rpb24pUWRfRmlsbENSb3VuZFJlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3Qgciwgc2hvcnQgb3ZhbFdpZHRoLCBzaG9ydCBvdmFsSGVpZ2h0LCBQaXhQYXRIYW5kbGUgcHApIC0+IE5vbmUiKX0sCisgICAgeyJGaWxsQ0FyYyIsIChQeUNGdW5jdGlvbilRZF9GaWxsQ0FyYywgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCByLCBzaG9ydCBzdGFydEFuZ2xlLCBzaG9ydCBhcmNBbmdsZSwgUGl4UGF0SGFuZGxlIHBwKSAtPiBOb25lIil9LAorICAgIHsiRmlsbENSZ24iLCAoUHlDRnVuY3Rpb24pUWRfRmlsbENSZ24sIDEsCisgICAgIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZ24sIFBpeFBhdEhhbmRsZSBwcCkgLT4gTm9uZSIpfSwKKyAgICB7IkZpbGxDUG9seSIsIChQeUNGdW5jdGlvbilRZF9GaWxsQ1BvbHksIDEsCisgICAgIFB5RG9jX1NUUigiKFBvbHlIYW5kbGUgcG9seSwgUGl4UGF0SGFuZGxlIHBwKSAtPiBOb25lIil9LAorICAgIHsiUkdCRm9yZUNvbG9yIiwgKFB5Q0Z1bmN0aW9uKVFkX1JHQkZvcmVDb2xvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUkdCQ29sb3IgY29sb3IpIC0+IE5vbmUiKX0sCisgICAgeyJSR0JCYWNrQ29sb3IiLCAoUHlDRnVuY3Rpb24pUWRfUkdCQmFja0NvbG9yLCAxLAorICAgICBQeURvY19TVFIoIihSR0JDb2xvciBjb2xvcikgLT4gTm9uZSIpfSwKKyAgICB7IlNldENQaXhlbCIsIChQeUNGdW5jdGlvbilRZF9TZXRDUGl4ZWwsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGgsIHNob3J0IHYsIFJHQkNvbG9yIGNQaXgpIC0+IE5vbmUiKX0sCisgICAgeyJTZXRQb3J0UGl4IiwgKFB5Q0Z1bmN0aW9uKVFkX1NldFBvcnRQaXgsIDEsCisgICAgIFB5RG9jX1NUUigiKFBpeE1hcEhhbmRsZSBwbSkgLT4gTm9uZSIpfSwKKyAgICB7IkdldENQaXhlbCIsIChQeUNGdW5jdGlvbilRZF9HZXRDUGl4ZWwsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGgsIHNob3J0IHYpIC0+IChSR0JDb2xvciBjUGl4KSIpfSwKKyAgICB7IkdldEZvcmVDb2xvciIsIChQeUNGdW5jdGlvbilRZF9HZXRGb3JlQ29sb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFJHQkNvbG9yIGNvbG9yKSIpfSwKKyAgICB7IkdldEJhY2tDb2xvciIsIChQeUNGdW5jdGlvbilRZF9HZXRCYWNrQ29sb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFJHQkNvbG9yIGNvbG9yKSIpfSwKKyAgICB7Ik9wQ29sb3IiLCAoUHlDRnVuY3Rpb24pUWRfT3BDb2xvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUkdCQ29sb3IgY29sb3IpIC0+IE5vbmUiKX0sCisgICAgeyJIaWxpdGVDb2xvciIsIChQeUNGdW5jdGlvbilRZF9IaWxpdGVDb2xvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUkdCQ29sb3IgY29sb3IpIC0+IE5vbmUiKX0sCisgICAgeyJEaXNwb3NlQ1RhYmxlIiwgKFB5Q0Z1bmN0aW9uKVFkX0Rpc3Bvc2VDVGFibGUsIDEsCisgICAgIFB5RG9jX1NUUigiKENUYWJIYW5kbGUgY1RhYmxlKSAtPiBOb25lIil9LAorICAgIHsiR2V0Q1RhYmxlIiwgKFB5Q0Z1bmN0aW9uKVFkX0dldENUYWJsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgY3RJRCkgLT4gKENUYWJIYW5kbGUgX3J2KSIpfSwKKyAgICB7IkdldENDdXJzb3IiLCAoUHlDRnVuY3Rpb24pUWRfR2V0Q0N1cnNvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgY3JzcklEKSAtPiAoQ0Nyc3JIYW5kbGUgX3J2KSIpfSwKKyAgICB7IlNldENDdXJzb3IiLCAoUHlDRnVuY3Rpb24pUWRfU2V0Q0N1cnNvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0Nyc3JIYW5kbGUgY0Nyc3IpIC0+IE5vbmUiKX0sCisgICAgeyJBbGxvY0N1cnNvciIsIChQeUNGdW5jdGlvbilRZF9BbGxvY0N1cnNvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiRGlzcG9zZUNDdXJzb3IiLCAoUHlDRnVuY3Rpb24pUWRfRGlzcG9zZUNDdXJzb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKENDcnNySGFuZGxlIGNDcnNyKSAtPiBOb25lIil9LAorICAgIHsiR2V0TWF4RGV2aWNlIiwgKFB5Q0Z1bmN0aW9uKVFkX0dldE1heERldmljZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCBnbG9iYWxSZWN0KSAtPiAoR0RIYW5kbGUgX3J2KSIpfSwKKyAgICB7IkdldENUU2VlZCIsIChQeUNGdW5jdGlvbilRZF9HZXRDVFNlZWQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKGxvbmcgX3J2KSIpfSwKKyAgICB7IkdldERldmljZUxpc3QiLCAoUHlDRnVuY3Rpb24pUWRfR2V0RGV2aWNlTGlzdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoR0RIYW5kbGUgX3J2KSIpfSwKKyAgICB7IkdldE1haW5EZXZpY2UiLCAoUHlDRnVuY3Rpb24pUWRfR2V0TWFpbkRldmljZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoR0RIYW5kbGUgX3J2KSIpfSwKKyAgICB7IkdldE5leHREZXZpY2UiLCAoUHlDRnVuY3Rpb24pUWRfR2V0TmV4dERldmljZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR0RIYW5kbGUgY3VyRGV2aWNlKSAtPiAoR0RIYW5kbGUgX3J2KSIpfSwKKyAgICB7IlRlc3REZXZpY2VBdHRyaWJ1dGUiLCAoUHlDRnVuY3Rpb24pUWRfVGVzdERldmljZUF0dHJpYnV0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR0RIYW5kbGUgZ2RoLCBzaG9ydCBhdHRyaWJ1dGUpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJTZXREZXZpY2VBdHRyaWJ1dGUiLCAoUHlDRnVuY3Rpb24pUWRfU2V0RGV2aWNlQXR0cmlidXRlLCAxLAorICAgICBQeURvY19TVFIoIihHREhhbmRsZSBnZGgsIHNob3J0IGF0dHJpYnV0ZSwgQm9vbGVhbiB2YWx1ZSkgLT4gTm9uZSIpfSwKKyAgICB7IkluaXRHRGV2aWNlIiwgKFB5Q0Z1bmN0aW9uKVFkX0luaXRHRGV2aWNlLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBxZFJlZk51bSwgbG9uZyBtb2RlLCBHREhhbmRsZSBnZGgpIC0+IE5vbmUiKX0sCisgICAgeyJOZXdHRGV2aWNlIiwgKFB5Q0Z1bmN0aW9uKVFkX05ld0dEZXZpY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IHJlZk51bSwgbG9uZyBtb2RlKSAtPiAoR0RIYW5kbGUgX3J2KSIpfSwKKyAgICB7IkRpc3Bvc2VHRGV2aWNlIiwgKFB5Q0Z1bmN0aW9uKVFkX0Rpc3Bvc2VHRGV2aWNlLCAxLAorICAgICBQeURvY19TVFIoIihHREhhbmRsZSBnZGgpIC0+IE5vbmUiKX0sCisgICAgeyJTZXRHRGV2aWNlIiwgKFB5Q0Z1bmN0aW9uKVFkX1NldEdEZXZpY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKEdESGFuZGxlIGdkKSAtPiBOb25lIil9LAorICAgIHsiR2V0R0RldmljZSIsIChQeUNGdW5jdGlvbilRZF9HZXRHRGV2aWNlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChHREhhbmRsZSBfcnYpIil9LAorICAgIHsiQ29sb3IySW5kZXgiLCAoUHlDRnVuY3Rpb24pUWRfQ29sb3IySW5kZXgsIDEsCisgICAgIFB5RG9jX1NUUigiKFJHQkNvbG9yIG15Q29sb3IpIC0+IChsb25nIF9ydikiKX0sCisgICAgeyJJbmRleDJDb2xvciIsIChQeUNGdW5jdGlvbilRZF9JbmRleDJDb2xvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIobG9uZyBpbmRleCkgLT4gKFJHQkNvbG9yIGFDb2xvcikiKX0sCisgICAgeyJJbnZlcnRDb2xvciIsIChQeUNGdW5jdGlvbilRZF9JbnZlcnRDb2xvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoUkdCQ29sb3IgbXlDb2xvcikiKX0sCisgICAgeyJSZWFsQ29sb3IiLCAoUHlDRnVuY3Rpb24pUWRfUmVhbENvbG9yLCAxLAorICAgICBQeURvY19TVFIoIihSR0JDb2xvciBjb2xvcikgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IkdldFN1YlRhYmxlIiwgKFB5Q0Z1bmN0aW9uKVFkX0dldFN1YlRhYmxlLCAxLAorICAgICBQeURvY19TVFIoIihDVGFiSGFuZGxlIG15Q29sb3JzLCBzaG9ydCBpVGFiUmVzLCBDVGFiSGFuZGxlIHRhcmdldFRibCkgLT4gTm9uZSIpfSwKKyAgICB7Ik1ha2VJVGFibGUiLCAoUHlDRnVuY3Rpb24pUWRfTWFrZUlUYWJsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ1RhYkhhbmRsZSBjVGFiSCwgSVRhYkhhbmRsZSBpVGFiSCwgc2hvcnQgcmVzKSAtPiBOb25lIil9LAorICAgIHsiU2V0Q2xpZW50SUQiLCAoUHlDRnVuY3Rpb24pUWRfU2V0Q2xpZW50SUQsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGlkKSAtPiBOb25lIil9LAorICAgIHsiUHJvdGVjdEVudHJ5IiwgKFB5Q0Z1bmN0aW9uKVFkX1Byb3RlY3RFbnRyeSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgaW5kZXgsIEJvb2xlYW4gcHJvdGVjdCkgLT4gTm9uZSIpfSwKKyAgICB7IlJlc2VydmVFbnRyeSIsIChQeUNGdW5jdGlvbilRZF9SZXNlcnZlRW50cnksIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGluZGV4LCBCb29sZWFuIHJlc2VydmUpIC0+IE5vbmUiKX0sCisgICAgeyJRREVycm9yIiwgKFB5Q0Z1bmN0aW9uKVFkX1FERXJyb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKHNob3J0IF9ydikiKX0sCisgICAgeyJDb3B5RGVlcE1hc2siLCAoUHlDRnVuY3Rpb24pUWRfQ29weURlZXBNYXNrLCAxLAorICAgICBQeURvY19TVFIoIihCaXRNYXBQdHIgc3JjQml0cywgQml0TWFwUHRyIG1hc2tCaXRzLCBCaXRNYXBQdHIgZHN0Qml0cywgUmVjdCBzcmNSZWN0LCBSZWN0IG1hc2tSZWN0LCBSZWN0IGRzdFJlY3QsIHNob3J0IG1vZGUsIFJnbkhhbmRsZSBtYXNrUmduKSAtPiBOb25lIil9LAorICAgIHsiR2V0UGF0dGVybiIsIChQeUNGdW5jdGlvbilRZF9HZXRQYXR0ZXJuLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBwYXR0ZXJuSUQpIC0+IChQYXRIYW5kbGUgX3J2KSIpfSwKKyAgICB7Ik1hY0dldEN1cnNvciIsIChQeUNGdW5jdGlvbilRZF9NYWNHZXRDdXJzb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGN1cnNvcklEKSAtPiAoQ3Vyc0hhbmRsZSBfcnYpIil9LAorICAgIHsiR2V0UGljdHVyZSIsIChQeUNGdW5jdGlvbilRZF9HZXRQaWN0dXJlLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBwaWN0dXJlSUQpIC0+IChQaWNIYW5kbGUgX3J2KSIpfSwKKyAgICB7IkRlbHRhUG9pbnQiLCAoUHlDRnVuY3Rpb24pUWRfRGVsdGFQb2ludCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgcHRBLCBQb2ludCBwdEIpIC0+IChsb25nIF9ydikiKX0sCisgICAgeyJTaGllbGRDdXJzb3IiLCAoUHlDRnVuY3Rpb24pUWRfU2hpZWxkQ3Vyc29yLCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IHNoaWVsZFJlY3QsIFBvaW50IG9mZnNldFB0KSAtPiBOb25lIil9LAorICAgIHsiU2NyZWVuUmVzIiwgKFB5Q0Z1bmN0aW9uKVFkX1NjcmVlblJlcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgc2NybkhSZXMsIHNob3J0IHNjcm5WUmVzKSIpfSwKKyAgICB7IkdldEluZFBhdHRlcm4iLCAoUHlDRnVuY3Rpb24pUWRfR2V0SW5kUGF0dGVybiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgcGF0dGVybkxpc3RJRCwgc2hvcnQgaW5kZXgpIC0+IChQYXR0ZXJuIHRoZVBhdCkiKX0sCisgICAgeyJTbG9wZUZyb21BbmdsZSIsIChQeUNGdW5jdGlvbilRZF9TbG9wZUZyb21BbmdsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgYW5nbGUpIC0+IChGaXhlZCBfcnYpIil9LAorICAgIHsiQW5nbGVGcm9tU2xvcGUiLCAoUHlDRnVuY3Rpb24pUWRfQW5nbGVGcm9tU2xvcGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEZpeGVkIHNsb3BlKSAtPiAoc2hvcnQgX3J2KSIpfSwKKyAgICB7IkdldFBpeEJvdW5kcyIsIChQeUNGdW5jdGlvbilRZF9HZXRQaXhCb3VuZHMsIDEsCisgICAgIFB5RG9jX1NUUigiKFBpeE1hcEhhbmRsZSBwaXhNYXApIC0+IChSZWN0IGJvdW5kcykiKX0sCisgICAgeyJHZXRQaXhEZXB0aCIsIChQeUNGdW5jdGlvbilRZF9HZXRQaXhEZXB0aCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUGl4TWFwSGFuZGxlIHBpeE1hcCkgLT4gKHNob3J0IF9ydikiKX0sCisgICAgeyJHZXRRREdsb2JhbHNSYW5kb21TZWVkIiwgKFB5Q0Z1bmN0aW9uKVFkX0dldFFER2xvYmFsc1JhbmRvbVNlZWQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKGxvbmcgX3J2KSIpfSwKKyAgICB7IkdldFFER2xvYmFsc1NjcmVlbkJpdHMiLCAoUHlDRnVuY3Rpb24pUWRfR2V0UURHbG9iYWxzU2NyZWVuQml0cywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQml0TWFwIHNjcmVlbkJpdHMpIil9LAorICAgIHsiR2V0UURHbG9iYWxzQXJyb3ciLCAoUHlDRnVuY3Rpb24pUWRfR2V0UURHbG9iYWxzQXJyb3csIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEN1cnNvciBhcnJvdykiKX0sCisgICAgeyJHZXRRREdsb2JhbHNEYXJrR3JheSIsIChQeUNGdW5jdGlvbilRZF9HZXRRREdsb2JhbHNEYXJrR3JheSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoUGF0dGVybiBka0dyYXkpIil9LAorICAgIHsiR2V0UURHbG9iYWxzTGlnaHRHcmF5IiwgKFB5Q0Z1bmN0aW9uKVFkX0dldFFER2xvYmFsc0xpZ2h0R3JheSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoUGF0dGVybiBsdEdyYXkpIil9LAorICAgIHsiR2V0UURHbG9iYWxzR3JheSIsIChQeUNGdW5jdGlvbilRZF9HZXRRREdsb2JhbHNHcmF5LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChQYXR0ZXJuIGdyYXkpIil9LAorICAgIHsiR2V0UURHbG9iYWxzQmxhY2siLCAoUHlDRnVuY3Rpb24pUWRfR2V0UURHbG9iYWxzQmxhY2ssIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFBhdHRlcm4gYmxhY2spIil9LAorICAgIHsiR2V0UURHbG9iYWxzV2hpdGUiLCAoUHlDRnVuY3Rpb24pUWRfR2V0UURHbG9iYWxzV2hpdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFBhdHRlcm4gd2hpdGUpIil9LAorICAgIHsiR2V0UURHbG9iYWxzVGhlUG9ydCIsIChQeUNGdW5jdGlvbilRZF9HZXRRREdsb2JhbHNUaGVQb3J0LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDR3JhZlB0ciBfcnYpIil9LAorICAgIHsiU2V0UURHbG9iYWxzUmFuZG9tU2VlZCIsIChQeUNGdW5jdGlvbilRZF9TZXRRREdsb2JhbHNSYW5kb21TZWVkLCAxLAorICAgICBQeURvY19TVFIoIihsb25nIHJhbmRvbVNlZWQpIC0+IE5vbmUiKX0sCisgICAgeyJTZXRRREdsb2JhbHNBcnJvdyIsIChQeUNGdW5jdGlvbilRZF9TZXRRREdsb2JhbHNBcnJvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ3Vyc29yIGFycm93KSAtPiBOb25lIil9LAorICAgIHsiR2V0UmVnaW9uQm91bmRzIiwgKFB5Q0Z1bmN0aW9uKVFkX0dldFJlZ2lvbkJvdW5kcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHJlZ2lvbikgLT4gKFJlY3QgYm91bmRzKSIpfSwKKyAgICB7IklzUmVnaW9uUmVjdGFuZ3VsYXIiLCAoUHlDRnVuY3Rpb24pUWRfSXNSZWdpb25SZWN0YW5ndWxhciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHJlZ2lvbikgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IkNyZWF0ZU5ld1BvcnQiLCAoUHlDRnVuY3Rpb24pUWRfQ3JlYXRlTmV3UG9ydCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ0dyYWZQdHIgX3J2KSIpfSwKKyAgICB7IlNldFFERXJyb3IiLCAoUHlDRnVuY3Rpb24pUWRfU2V0UURFcnJvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoT1NFcnIgZXJyKSAtPiBOb25lIil9LAorICAgIHsiTE1HZXRTY3JWUmVzIiwgKFB5Q0Z1bmN0aW9uKVFkX0xNR2V0U2NyVlJlcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoU0ludDE2IF9ydikiKX0sCisgICAgeyJMTVNldFNjclZSZXMiLCAoUHlDRnVuY3Rpb24pUWRfTE1TZXRTY3JWUmVzLCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgdmFsdWUpIC0+IE5vbmUiKX0sCisgICAgeyJMTUdldFNjckhSZXMiLCAoUHlDRnVuY3Rpb24pUWRfTE1HZXRTY3JIUmVzLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChTSW50MTYgX3J2KSIpfSwKKyAgICB7IkxNU2V0U2NySFJlcyIsIChQeUNGdW5jdGlvbilRZF9MTVNldFNjckhSZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiB2YWx1ZSkgLT4gTm9uZSIpfSwKKyAgICB7IkxNR2V0TWFpbkRldmljZSIsIChQeUNGdW5jdGlvbilRZF9MTUdldE1haW5EZXZpY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEdESGFuZGxlIF9ydikiKX0sCisgICAgeyJMTVNldE1haW5EZXZpY2UiLCAoUHlDRnVuY3Rpb24pUWRfTE1TZXRNYWluRGV2aWNlLCAxLAorICAgICBQeURvY19TVFIoIihHREhhbmRsZSB2YWx1ZSkgLT4gTm9uZSIpfSwKKyAgICB7IkxNR2V0RGV2aWNlTGlzdCIsIChQeUNGdW5jdGlvbilRZF9MTUdldERldmljZUxpc3QsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEdESGFuZGxlIF9ydikiKX0sCisgICAgeyJMTVNldERldmljZUxpc3QiLCAoUHlDRnVuY3Rpb24pUWRfTE1TZXREZXZpY2VMaXN0LCAxLAorICAgICBQeURvY19TVFIoIihHREhhbmRsZSB2YWx1ZSkgLT4gTm9uZSIpfSwKKyAgICB7IkxNR2V0UURDb2xvcnMiLCAoUHlDRnVuY3Rpb24pUWRfTE1HZXRRRENvbG9ycywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoSGFuZGxlIF9ydikiKX0sCisgICAgeyJMTVNldFFEQ29sb3JzIiwgKFB5Q0Z1bmN0aW9uKVFkX0xNU2V0UURDb2xvcnMsIDEsCisgICAgIFB5RG9jX1NUUigiKEhhbmRsZSB2YWx1ZSkgLT4gTm9uZSIpfSwKKyAgICB7IkxNR2V0V2lkdGhMaXN0SGFuZCIsIChQeUNGdW5jdGlvbilRZF9MTUdldFdpZHRoTGlzdEhhbmQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEhhbmRsZSBfcnYpIil9LAorICAgIHsiTE1TZXRXaWR0aExpc3RIYW5kIiwgKFB5Q0Z1bmN0aW9uKVFkX0xNU2V0V2lkdGhMaXN0SGFuZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSGFuZGxlIHZhbHVlKSAtPiBOb25lIil9LAorICAgIHsiTE1HZXRIaWxpdGVNb2RlIiwgKFB5Q0Z1bmN0aW9uKVFkX0xNR2V0SGlsaXRlTW9kZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVUludDggX3J2KSIpfSwKKyAgICB7IkxNU2V0SGlsaXRlTW9kZSIsIChQeUNGdW5jdGlvbilRZF9MTVNldEhpbGl0ZU1vZGUsIDEsCisgICAgIFB5RG9jX1NUUigiKFVJbnQ4IHZhbHVlKSAtPiBOb25lIil9LAorICAgIHsiTE1HZXRXaWR0aFRhYkhhbmRsZSIsIChQeUNGdW5jdGlvbilRZF9MTUdldFdpZHRoVGFiSGFuZGxlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChIYW5kbGUgX3J2KSIpfSwKKyAgICB7IkxNU2V0V2lkdGhUYWJIYW5kbGUiLCAoUHlDRnVuY3Rpb24pUWRfTE1TZXRXaWR0aFRhYkhhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSGFuZGxlIHZhbHVlKSAtPiBOb25lIil9LAorICAgIHsiTE1HZXRMYXN0U1BFeHRyYSIsIChQeUNGdW5jdGlvbilRZF9MTUdldExhc3RTUEV4dHJhLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChTSW50MzIgX3J2KSIpfSwKKyAgICB7IkxNU2V0TGFzdFNQRXh0cmEiLCAoUHlDRnVuY3Rpb24pUWRfTE1TZXRMYXN0U1BFeHRyYSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDMyIHZhbHVlKSAtPiBOb25lIil9LAorICAgIHsiTE1HZXRMYXN0Rk9ORCIsIChQeUNGdW5jdGlvbilRZF9MTUdldExhc3RGT05ELCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChIYW5kbGUgX3J2KSIpfSwKKyAgICB7IkxNU2V0TGFzdEZPTkQiLCAoUHlDRnVuY3Rpb24pUWRfTE1TZXRMYXN0Rk9ORCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSGFuZGxlIHZhbHVlKSAtPiBOb25lIil9LAorICAgIHsiTE1HZXRGcmFjdEVuYWJsZSIsIChQeUNGdW5jdGlvbilRZF9MTUdldEZyYWN0RW5hYmxlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChVSW50OCBfcnYpIil9LAorICAgIHsiTE1TZXRGcmFjdEVuYWJsZSIsIChQeUNGdW5jdGlvbilRZF9MTVNldEZyYWN0RW5hYmxlLCAxLAorICAgICBQeURvY19TVFIoIihVSW50OCB2YWx1ZSkgLT4gTm9uZSIpfSwKKyAgICB7IkxNR2V0VGhlR0RldmljZSIsIChQeUNGdW5jdGlvbilRZF9MTUdldFRoZUdEZXZpY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEdESGFuZGxlIF9ydikiKX0sCisgICAgeyJMTVNldFRoZUdEZXZpY2UiLCAoUHlDRnVuY3Rpb24pUWRfTE1TZXRUaGVHRGV2aWNlLCAxLAorICAgICBQeURvY19TVFIoIihHREhhbmRsZSB2YWx1ZSkgLT4gTm9uZSIpfSwKKyAgICB7IkxNR2V0SGlsaXRlUkdCIiwgKFB5Q0Z1bmN0aW9uKVFkX0xNR2V0SGlsaXRlUkdCLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChSR0JDb2xvciBoaWxpdGVSR0JWYWx1ZSkiKX0sCisgICAgeyJMTVNldEhpbGl0ZVJHQiIsIChQeUNGdW5jdGlvbilRZF9MTVNldEhpbGl0ZVJHQiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUkdCQ29sb3IgaGlsaXRlUkdCVmFsdWUpIC0+IE5vbmUiKX0sCisgICAgeyJMTUdldEN1cnNvck5ldyIsIChQeUNGdW5jdGlvbilRZF9MTUdldEN1cnNvck5ldywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiTE1TZXRDdXJzb3JOZXciLCAoUHlDRnVuY3Rpb24pUWRfTE1TZXRDdXJzb3JOZXcsIDEsCisgICAgIFB5RG9jX1NUUigiKEJvb2xlYW4gdmFsdWUpIC0+IE5vbmUiKX0sCisgICAgeyJUZXh0Rm9udCIsIChQeUNGdW5jdGlvbilRZF9UZXh0Rm9udCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgZm9udCkgLT4gTm9uZSIpfSwKKyAgICB7IlRleHRGYWNlIiwgKFB5Q0Z1bmN0aW9uKVFkX1RleHRGYWNlLCAxLAorICAgICBQeURvY19TVFIoIihTdHlsZVBhcmFtZXRlciBmYWNlKSAtPiBOb25lIil9LAorICAgIHsiVGV4dE1vZGUiLCAoUHlDRnVuY3Rpb24pUWRfVGV4dE1vZGUsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IG1vZGUpIC0+IE5vbmUiKX0sCisgICAgeyJUZXh0U2l6ZSIsIChQeUNGdW5jdGlvbilRZF9UZXh0U2l6ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgc2l6ZSkgLT4gTm9uZSIpfSwKKyAgICB7IlNwYWNlRXh0cmEiLCAoUHlDRnVuY3Rpb24pUWRfU3BhY2VFeHRyYSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRml4ZWQgZXh0cmEpIC0+IE5vbmUiKX0sCisgICAgeyJEcmF3Q2hhciIsIChQeUNGdW5jdGlvbilRZF9EcmF3Q2hhciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ2hhclBhcmFtZXRlciBjaCkgLT4gTm9uZSIpfSwKKyAgICB7IkRyYXdTdHJpbmciLCAoUHlDRnVuY3Rpb24pUWRfRHJhd1N0cmluZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoU3RyMjU1IHMpIC0+IE5vbmUiKX0sCisgICAgeyJNYWNEcmF3VGV4dCIsIChQeUNGdW5jdGlvbilRZF9NYWNEcmF3VGV4dCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQnVmZmVyIHRleHRCdWYsIHNob3J0IGZpcnN0Qnl0ZSwgc2hvcnQgYnl0ZUNvdW50KSAtPiBOb25lIil9LAorICAgIHsiQ2hhcldpZHRoIiwgKFB5Q0Z1bmN0aW9uKVFkX0NoYXJXaWR0aCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ2hhclBhcmFtZXRlciBjaCkgLT4gKHNob3J0IF9ydikiKX0sCisgICAgeyJTdHJpbmdXaWR0aCIsIChQeUNGdW5jdGlvbilRZF9TdHJpbmdXaWR0aCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU3RyMjU1IHMpIC0+IChzaG9ydCBfcnYpIil9LAorICAgIHsiVGV4dFdpZHRoIiwgKFB5Q0Z1bmN0aW9uKVFkX1RleHRXaWR0aCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQnVmZmVyIHRleHRCdWYsIHNob3J0IGZpcnN0Qnl0ZSwgc2hvcnQgYnl0ZUNvdW50KSAtPiAoc2hvcnQgX3J2KSIpfSwKKyAgICB7IkdldEZvbnRJbmZvIiwgKFB5Q0Z1bmN0aW9uKVFkX0dldEZvbnRJbmZvLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChGb250SW5mbyBpbmZvKSIpfSwKKyAgICB7IkNoYXJFeHRyYSIsIChQeUNGdW5jdGlvbilRZF9DaGFyRXh0cmEsIDEsCisgICAgIFB5RG9jX1NUUigiKEZpeGVkIGV4dHJhKSAtPiBOb25lIil9LAorICAgIHsiVHJ1bmNTdHJpbmciLCAoUHlDRnVuY3Rpb24pUWRfVHJ1bmNTdHJpbmcsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IHdpZHRoLCBTdHIyNTUgdGhlU3RyaW5nLCBUcnVuY0NvZGUgdHJ1bmNXaGVyZSkgLT4gKHNob3J0IF9ydikiKX0sCisgICAgeyJTZXRQb3J0IiwgKFB5Q0Z1bmN0aW9uKVFkX1NldFBvcnQsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYWZQdHIgdGhlUG9ydCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldEN1cnNvciIsIChQeUNGdW5jdGlvbilRZF9HZXRDdXJzb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGN1cnNvcklEKSAtPiAoQ3Vyc0hhbmRsZSBfcnYpIil9LAorICAgIHsiU2V0Q3Vyc29yIiwgKFB5Q0Z1bmN0aW9uKVFkX1NldEN1cnNvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ3Vyc29yIGNyc3IpIC0+IE5vbmUiKX0sCisgICAgeyJTaG93Q3Vyc29yIiwgKFB5Q0Z1bmN0aW9uKVFkX1Nob3dDdXJzb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkxpbmVUbyIsIChQeUNGdW5jdGlvbilRZF9MaW5lVG8sIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGgsIHNob3J0IHYpIC0+IE5vbmUiKX0sCisgICAgeyJTZXRSZWN0IiwgKFB5Q0Z1bmN0aW9uKVFkX1NldFJlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGxlZnQsIHNob3J0IHRvcCwgc2hvcnQgcmlnaHQsIHNob3J0IGJvdHRvbSkgLT4gKFJlY3QgcikiKX0sCisgICAgeyJPZmZzZXRSZWN0IiwgKFB5Q0Z1bmN0aW9uKVFkX09mZnNldFJlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3Qgciwgc2hvcnQgZGgsIHNob3J0IGR2KSAtPiAoUmVjdCByKSIpfSwKKyAgICB7Ikluc2V0UmVjdCIsIChQeUNGdW5jdGlvbilRZF9JbnNldFJlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3Qgciwgc2hvcnQgZGgsIHNob3J0IGR2KSAtPiAoUmVjdCByKSIpfSwKKyAgICB7IlVuaW9uUmVjdCIsIChQeUNGdW5jdGlvbilRZF9VbmlvblJlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3Qgc3JjMSwgUmVjdCBzcmMyKSAtPiAoUmVjdCBkc3RSZWN0KSIpfSwKKyAgICB7IkVxdWFsUmVjdCIsIChQeUNGdW5jdGlvbilRZF9FcXVhbFJlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgcmVjdDEsIFJlY3QgcmVjdDIpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJGcmFtZVJlY3QiLCAoUHlDRnVuY3Rpb24pUWRfRnJhbWVSZWN0LCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IHIpIC0+IE5vbmUiKX0sCisgICAgeyJJbnZlcnRSZWN0IiwgKFB5Q0Z1bmN0aW9uKVFkX0ludmVydFJlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgcikgLT4gTm9uZSIpfSwKKyAgICB7IkZpbGxSZWN0IiwgKFB5Q0Z1bmN0aW9uKVFkX0ZpbGxSZWN0LCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IHIsIFBhdHRlcm4gcGF0KSAtPiBOb25lIil9LAorICAgIHsiQ29weVJnbiIsIChQeUNGdW5jdGlvbilRZF9Db3B5UmduLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgc3JjUmduLCBSZ25IYW5kbGUgZHN0UmduKSAtPiBOb25lIil9LAorICAgIHsiU2V0UmVjdFJnbiIsIChQeUNGdW5jdGlvbilRZF9TZXRSZWN0UmduLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgcmduLCBzaG9ydCBsZWZ0LCBzaG9ydCB0b3AsIHNob3J0IHJpZ2h0LCBzaG9ydCBib3R0b20pIC0+IE5vbmUiKX0sCisgICAgeyJPZmZzZXRSZ24iLCAoUHlDRnVuY3Rpb24pUWRfT2Zmc2V0UmduLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgcmduLCBzaG9ydCBkaCwgc2hvcnQgZHYpIC0+IE5vbmUiKX0sCisgICAgeyJVbmlvblJnbiIsIChQeUNGdW5jdGlvbilRZF9VbmlvblJnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHNyY1JnbkEsIFJnbkhhbmRsZSBzcmNSZ25CLCBSZ25IYW5kbGUgZHN0UmduKSAtPiBOb25lIil9LAorICAgIHsiWG9yUmduIiwgKFB5Q0Z1bmN0aW9uKVFkX1hvclJnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHNyY1JnbkEsIFJnbkhhbmRsZSBzcmNSZ25CLCBSZ25IYW5kbGUgZHN0UmduKSAtPiBOb25lIil9LAorICAgIHsiRXF1YWxSZ24iLCAoUHlDRnVuY3Rpb24pUWRfRXF1YWxSZ24sIDEsCisgICAgIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZ25BLCBSZ25IYW5kbGUgcmduQikgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IkZyYW1lUmduIiwgKFB5Q0Z1bmN0aW9uKVFkX0ZyYW1lUmduLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgcmduKSAtPiBOb25lIil9LAorICAgIHsiUGFpbnRSZ24iLCAoUHlDRnVuY3Rpb24pUWRfUGFpbnRSZ24sIDEsCisgICAgIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZ24pIC0+IE5vbmUiKX0sCisgICAgeyJJbnZlcnRSZ24iLCAoUHlDRnVuY3Rpb24pUWRfSW52ZXJ0UmduLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgcmduKSAtPiBOb25lIil9LAorICAgIHsiRmlsbFJnbiIsIChQeUNGdW5jdGlvbilRZF9GaWxsUmduLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgcmduLCBQYXR0ZXJuIHBhdCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldFBpeGVsIiwgKFB5Q0Z1bmN0aW9uKVFkX0dldFBpeGVsLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBoLCBzaG9ydCB2KSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiUHRJblJlY3QiLCAoUHlDRnVuY3Rpb24pUWRfUHRJblJlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKFBvaW50IHB0LCBSZWN0IHIpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJEcmF3VGV4dCIsIChQeUNGdW5jdGlvbilRZF9EcmF3VGV4dCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQnVmZmVyIHRleHRCdWYsIHNob3J0IGZpcnN0Qnl0ZSwgc2hvcnQgYnl0ZUNvdW50KSAtPiBOb25lIil9LAorICAgIHsiQml0TWFwIiwgKFB5Q0Z1bmN0aW9uKVFkX0JpdE1hcCwgMSwKKyAgICAgUHlEb2NfU1RSKCJUYWtlIChzdHJpbmcsIGludCwgUmVjdCkgYXJndW1lbnQgYW5kIGNyZWF0ZSBCaXRNYXAiKX0sCisgICAgeyJSYXdCaXRNYXAiLCAoUHlDRnVuY3Rpb24pUWRfUmF3Qml0TWFwLCAxLAorICAgICBQeURvY19TVFIoIlRha2Ugc3RyaW5nIEJpdE1hcCBhbmQgdHVybiBpbnRvIEJpdE1hcCBvYmplY3QiKX0sCiAjZW5kaWYgLyogX19MUDY0X18gKi8KLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKIApAQCAtNzA5NSwxNSArNzA5NSwxNSBAQAogKi8KIFB5T2JqZWN0ICpCTU9ial9OZXdDb3BpZWQoQml0TWFwUHRyIGl0c2VsZikKIHsKLSAgICAgICAgQml0TWFwT2JqZWN0ICppdDsKLSAgICAgICAgQml0TWFwUHRyIGl0c2VsZl9jb3B5OworICAgIEJpdE1hcE9iamVjdCAqaXQ7CisgICAgQml0TWFwUHRyIGl0c2VsZl9jb3B5OwogCi0gICAgICAgIGlmICgoaXRzZWxmX2NvcHk9KEJpdE1hcFB0ciltYWxsb2Moc2l6ZW9mKEJpdE1hcCkpKSA9PSBOVUxMKQotICAgICAgICAgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotICAgICAgICAqaXRzZWxmX2NvcHkgPSAqaXRzZWxmOwotICAgICAgICBpdCA9IChCaXRNYXBPYmplY3QgKilCTU9ial9OZXcoaXRzZWxmX2NvcHkpOwotICAgICAgICBpdC0+cmVmZXJyZWRfYml0bWFwID0gaXRzZWxmX2NvcHk7Ci0gICAgICAgIHJldHVybiAoUHlPYmplY3QgKilpdDsKKyAgICBpZiAoKGl0c2VsZl9jb3B5PShCaXRNYXBQdHIpbWFsbG9jKHNpemVvZihCaXRNYXApKSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgKml0c2VsZl9jb3B5ID0gKml0c2VsZjsKKyAgICBpdCA9IChCaXRNYXBPYmplY3QgKilCTU9ial9OZXcoaXRzZWxmX2NvcHkpOworICAgIGl0LT5yZWZlcnJlZF9iaXRtYXAgPSBpdHNlbGZfY29weTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiAKICNlbmRpZiAvKiBfX0xQNjRfXyAqLwpAQCAtNzExMSw0MiArNzExMSw0MiBAQAogCiB2b2lkIGluaXRfUWQodm9pZCkKIHsKLQlQeU9iamVjdCAqbTsKKyAgICBQeU9iamVjdCAqbTsKICNpZm5kZWYgX19MUDY0X18KLQlQeU9iamVjdCAqZDsKKyAgICBQeU9iamVjdCAqZDsKIAogCiAKLQkgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKEJpdE1hcFB0ciwgQk1PYmpfTmV3KTsKLQkgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChCaXRNYXBQdHIsIEJNT2JqX0NvbnZlcnQpOwotCSAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoR3JhZlB0ciwgR3JhZk9ial9OZXcpOwotCSAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKEdyYWZQdHIsIEdyYWZPYmpfQ29udmVydCk7Ci0JICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhSR0JDb2xvclB0ciwgUWRSR0JfTmV3KTsKLQkgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChSR0JDb2xvciwgUWRSR0JfQ29udmVydCk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKEJpdE1hcFB0ciwgQk1PYmpfTmV3KTsKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKEJpdE1hcFB0ciwgQk1PYmpfQ29udmVydCk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKEdyYWZQdHIsIEdyYWZPYmpfTmV3KTsKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKEdyYWZQdHIsIEdyYWZPYmpfQ29udmVydCk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKFJHQkNvbG9yUHRyLCBRZFJHQl9OZXcpOworICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoUkdCQ29sb3IsIFFkUkdCX0NvbnZlcnQpOwogCiAjZW5kaWYgLyogX19MUDY0X18gKi8KIAotCW0gPSBQeV9Jbml0TW9kdWxlKCJfUWQiLCBRZF9tZXRob2RzKTsKKyAgICBtID0gUHlfSW5pdE1vZHVsZSgiX1FkIiwgUWRfbWV0aG9kcyk7CiAjaWZuZGVmIF9fTFA2NF9fCi0JZCA9IFB5TW9kdWxlX0dldERpY3QobSk7Ci0JUWRfRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOwotCWlmIChRZF9FcnJvciA9PSBOVUxMIHx8Ci0JICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFcnJvciIsIFFkX0Vycm9yKSAhPSAwKQotCQlyZXR1cm47Ci0JR3JhZlBvcnRfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCWlmIChQeVR5cGVfUmVhZHkoJkdyYWZQb3J0X1R5cGUpIDwgMCkgcmV0dXJuOwotCVB5X0lOQ1JFRigmR3JhZlBvcnRfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJHcmFmUG9ydCIsIChQeU9iamVjdCAqKSZHcmFmUG9ydF9UeXBlKTsKLQkvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KLQlQeV9JTkNSRUYoJkdyYWZQb3J0X1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiR3JhZlBvcnRUeXBlIiwgKFB5T2JqZWN0ICopJkdyYWZQb3J0X1R5cGUpOwotCUJpdE1hcF9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmQml0TWFwX1R5cGUpIDwgMCkgcmV0dXJuOwotCVB5X0lOQ1JFRigmQml0TWFwX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiQml0TWFwIiwgKFB5T2JqZWN0ICopJkJpdE1hcF9UeXBlKTsKLQkvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KLQlQeV9JTkNSRUYoJkJpdE1hcF9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkJpdE1hcFR5cGUiLCAoUHlPYmplY3QgKikmQml0TWFwX1R5cGUpOworICAgIGQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOworICAgIFFkX0Vycm9yID0gUHlNYWNfR2V0T1NFcnJFeGNlcHRpb24oKTsKKyAgICBpZiAoUWRfRXJyb3IgPT0gTlVMTCB8fAorICAgICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRXJyb3IiLCBRZF9FcnJvcikgIT0gMCkKKyAgICAgICAgcmV0dXJuOworICAgIEdyYWZQb3J0X1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZHcmFmUG9ydF9UeXBlKSA8IDApIHJldHVybjsKKyAgICBQeV9JTkNSRUYoJkdyYWZQb3J0X1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiR3JhZlBvcnQiLCAoUHlPYmplY3QgKikmR3JhZlBvcnRfVHlwZSk7CisgICAgLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCisgICAgUHlfSU5DUkVGKCZHcmFmUG9ydF9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkdyYWZQb3J0VHlwZSIsIChQeU9iamVjdCAqKSZHcmFmUG9ydF9UeXBlKTsKKyAgICBCaXRNYXBfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJkJpdE1hcF9UeXBlKSA8IDApIHJldHVybjsKKyAgICBQeV9JTkNSRUYoJkJpdE1hcF9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkJpdE1hcCIsIChQeU9iamVjdCAqKSZCaXRNYXBfVHlwZSk7CisgICAgLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCisgICAgUHlfSU5DUkVGKCZCaXRNYXBfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJCaXRNYXBUeXBlIiwgKFB5T2JqZWN0ICopJkJpdE1hcF9UeXBlKTsKICNlbmRpZiAvKiBfX0xQNjRfXyAqLwogfQogCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9xZG9mZnMvX1Fkb2Zmc21vZHVsZS5jIGIvTWFjL01vZHVsZXMvcWRvZmZzL19RZG9mZnNtb2R1bGUuYwppbmRleCBiNDUxNDcyLi42ODZlY2E0IDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9xZG9mZnMvX1Fkb2Zmc21vZHVsZS5jCisrKyBiL01hYy9Nb2R1bGVzL3Fkb2Zmcy9fUWRvZmZzbW9kdWxlLmMKQEAgLTEwLDkgKzEwLDkgQEAKIAogLyogTWFjcm8gdG8gdGVzdCB3aGV0aGVyIGEgd2Vhay1sb2FkZWQgQ0ZNIGZ1bmN0aW9uIGV4aXN0cyAqLwogI2RlZmluZSBQeU1hY19QUkVDSEVDSyhydG4pIGRvIHsgaWYgKCAmcnRuID09IE5VTEwgKSAge1wKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsIFwKLSAgICAgICAgIk5vdCBhdmFpbGFibGUgaW4gdGhpcyBzaGFyZWQgbGlicmFyeS9PUyB2ZXJzaW9uIik7IFwKLSAgICAgICAgcmV0dXJuIE5VTEw7IFwKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgXAorICAgICJOb3QgYXZhaWxhYmxlIGluIHRoaXMgc2hhcmVkIGxpYnJhcnkvT1MgdmVyc2lvbiIpOyBcCisgICAgcmV0dXJuIE5VTEw7IFwKICAgICB9fSB3aGlsZSgwKQogCiAKQEAgLTM4LDkwICszOCw5MCBAQAogI2RlZmluZSBHV29ybGRPYmpfQ2hlY2soeCkgKCh4KS0+b2JfdHlwZSA9PSAmR1dvcmxkX1R5cGUgfHwgUHlPYmplY3RfVHlwZUNoZWNrKCh4KSwgJkdXb3JsZF9UeXBlKSkKIAogdHlwZWRlZiBzdHJ1Y3QgR1dvcmxkT2JqZWN0IHsKLQlQeU9iamVjdF9IRUFECi0JR1dvcmxkUHRyIG9iX2l0c2VsZjsKKyAgICBQeU9iamVjdF9IRUFECisgICAgR1dvcmxkUHRyIG9iX2l0c2VsZjsKIH0gR1dvcmxkT2JqZWN0OwogCiBQeU9iamVjdCAqR1dvcmxkT2JqX05ldyhHV29ybGRQdHIgaXRzZWxmKQogewotCUdXb3JsZE9iamVjdCAqaXQ7Ci0JaWYgKGl0c2VsZiA9PSBOVUxMKSByZXR1cm4gUHlNYWNfRXJyb3IocmVzTm90Rm91bmQpOwotCWl0ID0gUHlPYmplY3RfTkVXKEdXb3JsZE9iamVjdCwgJkdXb3JsZF9UeXBlKTsKLQlpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgR1dvcmxkT2JqZWN0ICppdDsKKyAgICBpZiAoaXRzZWxmID09IE5VTEwpIHJldHVybiBQeU1hY19FcnJvcihyZXNOb3RGb3VuZCk7CisgICAgaXQgPSBQeU9iamVjdF9ORVcoR1dvcmxkT2JqZWN0LCAmR1dvcmxkX1R5cGUpOworICAgIGlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICBpdC0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIHJldHVybiAoUHlPYmplY3QgKilpdDsKIH0KIAogaW50IEdXb3JsZE9ial9Db252ZXJ0KFB5T2JqZWN0ICp2LCBHV29ybGRQdHIgKnBfaXRzZWxmKQogewotCWlmICghR1dvcmxkT2JqX0NoZWNrKHYpKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkdXb3JsZCByZXF1aXJlZCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JKnBfaXRzZWxmID0gKChHV29ybGRPYmplY3QgKil2KS0+b2JfaXRzZWxmOwotCXJldHVybiAxOworICAgIGlmICghR1dvcmxkT2JqX0NoZWNrKHYpKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkdXb3JsZCByZXF1aXJlZCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgKnBfaXRzZWxmID0gKChHV29ybGRPYmplY3QgKil2KS0+b2JfaXRzZWxmOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgdm9pZCBHV29ybGRPYmpfZGVhbGxvYyhHV29ybGRPYmplY3QgKnNlbGYpCiB7Ci0JRGlzcG9zZUdXb3JsZChzZWxmLT5vYl9pdHNlbGYpOwotCXNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CisgICAgRGlzcG9zZUdXb3JsZChzZWxmLT5vYl9pdHNlbGYpOworICAgIHNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqR1dvcmxkT2JqX0dldEdXb3JsZERldmljZShHV29ybGRPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUdESGFuZGxlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgR0RIYW5kbGUgX3J2OwogI2lmbmRlZiBHZXRHV29ybGREZXZpY2UKLQlQeU1hY19QUkVDSEVDSyhHZXRHV29ybGREZXZpY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldEdXb3JsZERldmljZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0R1dvcmxkRGV2aWNlKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0R1dvcmxkRGV2aWNlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpHV29ybGRPYmpfR2V0R1dvcmxkUGl4TWFwKEdXb3JsZE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUGl4TWFwSGFuZGxlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUGl4TWFwSGFuZGxlIF9ydjsKICNpZm5kZWYgR2V0R1dvcmxkUGl4TWFwCi0JUHlNYWNfUFJFQ0hFQ0soR2V0R1dvcmxkUGl4TWFwKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRHV29ybGRQaXhNYXApOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldEdXb3JsZFBpeE1hcChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldEdXb3JsZFBpeE1hcChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqR1dvcmxkT2JqX2FzX0dyYWZQdHIoR1dvcmxkT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlHcmFmUHRyIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgR3JhZlB0ciBfcnY7CiAjaWZuZGVmIGFzX0dyYWZQdHIKLQlQeU1hY19QUkVDSEVDSyhhc19HcmFmUHRyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhhc19HcmFmUHRyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBhc19HcmFmUHRyKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgR3JhZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IGFzX0dyYWZQdHIoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIEdXb3JsZE9ial9tZXRob2RzW10gPSB7Ci0JeyJHZXRHV29ybGREZXZpY2UiLCAoUHlDRnVuY3Rpb24pR1dvcmxkT2JqX0dldEdXb3JsZERldmljZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoR0RIYW5kbGUgX3J2KSIpfSwKLQl7IkdldEdXb3JsZFBpeE1hcCIsIChQeUNGdW5jdGlvbilHV29ybGRPYmpfR2V0R1dvcmxkUGl4TWFwLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChQaXhNYXBIYW5kbGUgX3J2KSIpfSwKLQl7ImFzX0dyYWZQdHIiLCAoUHlDRnVuY3Rpb24pR1dvcmxkT2JqX2FzX0dyYWZQdHIsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEdyYWZQdHIgX3J2KSIpfSwKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7IkdldEdXb3JsZERldmljZSIsIChQeUNGdW5jdGlvbilHV29ybGRPYmpfR2V0R1dvcmxkRGV2aWNlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChHREhhbmRsZSBfcnYpIil9LAorICAgIHsiR2V0R1dvcmxkUGl4TWFwIiwgKFB5Q0Z1bmN0aW9uKUdXb3JsZE9ial9HZXRHV29ybGRQaXhNYXAsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFBpeE1hcEhhbmRsZSBfcnYpIil9LAorICAgIHsiYXNfR3JhZlB0ciIsIChQeUNGdW5jdGlvbilHV29ybGRPYmpfYXNfR3JhZlB0ciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoR3JhZlB0ciBfcnYpIil9LAorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogI2RlZmluZSBHV29ybGRPYmpfZ2V0c2V0bGlzdCBOVUxMCkBAIC0xMzgsNjEgKzEzOCw2MSBAQAogCiBzdGF0aWMgUHlPYmplY3QgKkdXb3JsZE9ial90cF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlQeU9iamVjdCAqX3NlbGY7Ci0JR1dvcmxkUHRyIGl0c2VsZjsKLQljaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKKyAgICBQeU9iamVjdCAqX3NlbGY7CisgICAgR1dvcmxkUHRyIGl0c2VsZjsKKyAgICBjaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIEdXb3JsZE9ial9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7Ci0JaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkoKEdXb3JsZE9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiBfc2VsZjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBHV29ybGRPYmpfQ29udmVydCwgJml0c2VsZikpIHJldHVybiBOVUxMOworICAgIGlmICgoX3NlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgKChHV29ybGRPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICByZXR1cm4gX3NlbGY7CiB9CiAKICNkZWZpbmUgR1dvcmxkT2JqX3RwX2ZyZWUgUHlPYmplY3RfRGVsCiAKIAogUHlUeXBlT2JqZWN0IEdXb3JsZF9UeXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQotCTAsIC8qb2Jfc2l6ZSovCi0JIl9RZG9mZnMuR1dvcmxkIiwgLyp0cF9uYW1lKi8KLQlzaXplb2YoR1dvcmxkT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLwotCTAsIC8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcikgR1dvcmxkT2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCi0JMCwgLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCi0JKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCi0JKGNtcGZ1bmMpIEdXb3JsZE9ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYykgR1dvcmxkT2JqX3JlcHIsIC8qdHBfcmVwciovCi0JKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLwotCShQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCi0JKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCi0JKGhhc2hmdW5jKSBHV29ybGRPYmpfaGFzaCwgLyp0cF9oYXNoKi8KLQkwLCAvKnRwX2NhbGwqLwotCTAsIC8qdHBfc3RyKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCi0JUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KLQkwLCAvKnRwX2FzX2J1ZmZlciovCi0JUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCi0JMCwgLyp0cF9kb2MqLwotCTAsIC8qdHBfdHJhdmVyc2UqLwotCTAsIC8qdHBfY2xlYXIqLwotCTAsIC8qdHBfcmljaGNvbXBhcmUqLwotCTAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLwotCTAsIC8qdHBfaXRlciovCi0JMCwgLyp0cF9pdGVybmV4dCovCi0JR1dvcmxkT2JqX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KLQkwLCAvKnRwX21lbWJlcnMqLwotCUdXb3JsZE9ial9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCi0JMCwgLyp0cF9iYXNlKi8KLQkwLCAvKnRwX2RpY3QqLwotCTAsIC8qdHBfZGVzY3JfZ2V0Ki8KLQkwLCAvKnRwX2Rlc2NyX3NldCovCi0JMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KLQlHV29ybGRPYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLwotCUdXb3JsZE9ial90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KLQlHV29ybGRPYmpfdHBfbmV3LCAvKiB0cF9uZXcgKi8KLQlHV29ybGRPYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgIDAsIC8qb2Jfc2l6ZSovCisgICAgIl9RZG9mZnMuR1dvcmxkIiwgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoR1dvcmxkT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLworICAgIDAsIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcikgR1dvcmxkT2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgMCwgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCisgICAgKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCisgICAgKGNtcGZ1bmMpIEdXb3JsZE9ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLworICAgIChyZXByZnVuYykgR1dvcmxkT2JqX3JlcHIsIC8qdHBfcmVwciovCisgICAgKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLworICAgIChQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKSBHV29ybGRPYmpfaGFzaCwgLyp0cF9oYXNoKi8KKyAgICAwLCAvKnRwX2NhbGwqLworICAgIDAsIC8qdHBfc3RyKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCisgICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgMCwgLyp0cF9kb2MqLworICAgIDAsIC8qdHBfdHJhdmVyc2UqLworICAgIDAsIC8qdHBfY2xlYXIqLworICAgIDAsIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsIC8qdHBfaXRlciovCisgICAgMCwgLyp0cF9pdGVybmV4dCovCisgICAgR1dvcmxkT2JqX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAvKnRwX21lbWJlcnMqLworICAgIEdXb3JsZE9ial9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCisgICAgMCwgLyp0cF9iYXNlKi8KKyAgICAwLCAvKnRwX2RpY3QqLworICAgIDAsIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICBHV29ybGRPYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLworICAgIEdXb3JsZE9ial90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KKyAgICBHV29ybGRPYmpfdHBfbmV3LCAvKiB0cF9uZXcgKi8KKyAgICBHV29ybGRPYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEVuZCBvYmplY3QgdHlwZSBHV29ybGQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0yMDAsNDg5ICsyMDAsNDg5IEBACiAKIHN0YXRpYyBQeU9iamVjdCAqUWRvZmZzX05ld0dXb3JsZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUURFcnIgX2VycjsKLQlHV29ybGRQdHIgb2Zmc2NyZWVuR1dvcmxkOwotCXNob3J0IFBpeGVsRGVwdGg7Ci0JUmVjdCBib3VuZHNSZWN0OwotCUNUYWJIYW5kbGUgY1RhYmxlOwotCUdESGFuZGxlIGFHRGV2aWNlOwotCUdXb3JsZEZsYWdzIGZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBRREVyciBfZXJyOworICAgIEdXb3JsZFB0ciBvZmZzY3JlZW5HV29ybGQ7CisgICAgc2hvcnQgUGl4ZWxEZXB0aDsKKyAgICBSZWN0IGJvdW5kc1JlY3Q7CisgICAgQ1RhYkhhbmRsZSBjVGFibGU7CisgICAgR0RIYW5kbGUgYUdEZXZpY2U7CisgICAgR1dvcmxkRmxhZ3MgZmxhZ3M7CiAjaWZuZGVmIE5ld0dXb3JsZAotCVB5TWFjX1BSRUNIRUNLKE5ld0dXb3JsZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTmV3R1dvcmxkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJk8mTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJlBpeGVsRGVwdGgsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfQ29udmVydCwgJmNUYWJsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgT3B0UmVzT2JqX0NvbnZlcnQsICZhR0RldmljZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IE5ld0dXb3JsZCgmb2Zmc2NyZWVuR1dvcmxkLAotCSAgICAgICAgICAgICAgICAgUGl4ZWxEZXB0aCwKLQkgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgY1RhYmxlLAotCSAgICAgICAgICAgICAgICAgYUdEZXZpY2UsCi0JICAgICAgICAgICAgICAgICBmbGFncyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEdXb3JsZE9ial9OZXcsIG9mZnNjcmVlbkdXb3JsZCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mTyZPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmUGl4ZWxEZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdFJlc09ial9Db252ZXJ0LCAmY1RhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfQ29udmVydCwgJmFHRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gTmV3R1dvcmxkKCZvZmZzY3JlZW5HV29ybGQsCisgICAgICAgICAgICAgICAgICAgICBQaXhlbERlcHRoLAorICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICBjVGFibGUsCisgICAgICAgICAgICAgICAgICAgICBhR0RldmljZSwKKyAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgR1dvcmxkT2JqX05ldywgb2Zmc2NyZWVuR1dvcmxkKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZG9mZnNfTG9ja1BpeGVscyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JUGl4TWFwSGFuZGxlIHBtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBQaXhNYXBIYW5kbGUgcG07CiAjaWZuZGVmIExvY2tQaXhlbHMKLQlQeU1hY19QUkVDSEVDSyhMb2NrUGl4ZWxzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhMb2NrUGl4ZWxzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwbSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IExvY2tQaXhlbHMocG0pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IExvY2tQaXhlbHMocG0pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkb2Zmc19VbmxvY2tQaXhlbHMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBpeE1hcEhhbmRsZSBwbTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUGl4TWFwSGFuZGxlIHBtOwogI2lmbmRlZiBVbmxvY2tQaXhlbHMKLQlQeU1hY19QUkVDSEVDSyhVbmxvY2tQaXhlbHMpOworICAgIFB5TWFjX1BSRUNIRUNLKFVubG9ja1BpeGVscyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcG0pKQotCQlyZXR1cm4gTlVMTDsKLQlVbmxvY2tQaXhlbHMocG0pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcG0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBVbmxvY2tQaXhlbHMocG0pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZG9mZnNfVXBkYXRlR1dvcmxkKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlHV29ybGRGbGFncyBfcnY7Ci0JR1dvcmxkUHRyIG9mZnNjcmVlbkdXb3JsZDsKLQlzaG9ydCBwaXhlbERlcHRoOwotCVJlY3QgYm91bmRzUmVjdDsKLQlDVGFiSGFuZGxlIGNUYWJsZTsKLQlHREhhbmRsZSBhR0RldmljZTsKLQlHV29ybGRGbGFncyBmbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgR1dvcmxkRmxhZ3MgX3J2OworICAgIEdXb3JsZFB0ciBvZmZzY3JlZW5HV29ybGQ7CisgICAgc2hvcnQgcGl4ZWxEZXB0aDsKKyAgICBSZWN0IGJvdW5kc1JlY3Q7CisgICAgQ1RhYkhhbmRsZSBjVGFibGU7CisgICAgR0RIYW5kbGUgYUdEZXZpY2U7CisgICAgR1dvcmxkRmxhZ3MgZmxhZ3M7CiAjaWZuZGVmIFVwZGF0ZUdXb3JsZAotCVB5TWFjX1BSRUNIRUNLKFVwZGF0ZUdXb3JsZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVXBkYXRlR1dvcmxkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJk8mTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnBpeGVsRGVwdGgsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfQ29udmVydCwgJmNUYWJsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgT3B0UmVzT2JqX0NvbnZlcnQsICZhR0RldmljZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVXBkYXRlR1dvcmxkKCZvZmZzY3JlZW5HV29ybGQsCi0JICAgICAgICAgICAgICAgICAgIHBpeGVsRGVwdGgsCi0JICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICBjVGFibGUsCi0JICAgICAgICAgICAgICAgICAgIGFHRGV2aWNlLAotCSAgICAgICAgICAgICAgICAgICBmbGFncyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIEdXb3JsZE9ial9OZXcsIG9mZnNjcmVlbkdXb3JsZCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mTyZPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGl4ZWxEZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdFJlc09ial9Db252ZXJ0LCAmY1RhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfQ29udmVydCwgJmFHRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBVcGRhdGVHV29ybGQoJm9mZnNjcmVlbkdXb3JsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxEZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgIGNUYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgYUdEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgR1dvcmxkT2JqX05ldywgb2Zmc2NyZWVuR1dvcmxkKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZG9mZnNfR2V0R1dvcmxkKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDR3JhZlB0ciBwb3J0OwotCUdESGFuZGxlIGdkaDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0dyYWZQdHIgcG9ydDsKKyAgICBHREhhbmRsZSBnZGg7CiAjaWZuZGVmIEdldEdXb3JsZAotCVB5TWFjX1BSRUNIRUNLKEdldEdXb3JsZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0R1dvcmxkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlHZXRHV29ybGQoJnBvcnQsCi0JICAgICAgICAgICZnZGgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX05ldywgcG9ydCwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBnZGgpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRHV29ybGQoJnBvcnQsCisgICAgICAgICAgICAgICZnZGgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX05ldywgcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBnZGgpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkb2Zmc19TZXRHV29ybGQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNHcmFmUHRyIHBvcnQ7Ci0JR0RIYW5kbGUgZ2RoOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDR3JhZlB0ciBwb3J0OworICAgIEdESGFuZGxlIGdkaDsKICNpZm5kZWYgU2V0R1dvcmxkCi0JUHlNYWNfUFJFQ0hFQ0soU2V0R1dvcmxkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRHV29ybGQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfQ29udmVydCwgJnBvcnQsCi0JICAgICAgICAgICAgICAgICAgICAgIE9wdFJlc09ial9Db252ZXJ0LCAmZ2RoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0R1dvcmxkKHBvcnQsCi0JICAgICAgICAgIGdkaCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX0NvbnZlcnQsICZwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfQ29udmVydCwgJmdkaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldEdXb3JsZChwb3J0LAorICAgICAgICAgICAgICBnZGgpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZG9mZnNfQ1RhYkNoYW5nZWQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNUYWJIYW5kbGUgY3RhYjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ1RhYkhhbmRsZSBjdGFiOwogI2lmbmRlZiBDVGFiQ2hhbmdlZAotCVB5TWFjX1BSRUNIRUNLKENUYWJDaGFuZ2VkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDVGFiQ2hhbmdlZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIE9wdFJlc09ial9Db252ZXJ0LCAmY3RhYikpCi0JCXJldHVybiBOVUxMOwotCUNUYWJDaGFuZ2VkKGN0YWIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdFJlc09ial9Db252ZXJ0LCAmY3RhYikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENUYWJDaGFuZ2VkKGN0YWIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZG9mZnNfUGl4UGF0Q2hhbmdlZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUGl4UGF0SGFuZGxlIHBwYXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBpeFBhdEhhbmRsZSBwcGF0OwogI2lmbmRlZiBQaXhQYXRDaGFuZ2VkCi0JUHlNYWNfUFJFQ0hFQ0soUGl4UGF0Q2hhbmdlZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUGl4UGF0Q2hhbmdlZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcHBhdCkpCi0JCXJldHVybiBOVUxMOwotCVBpeFBhdENoYW5nZWQocHBhdCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwcGF0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUGl4UGF0Q2hhbmdlZChwcGF0KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRvZmZzX1BvcnRDaGFuZ2VkKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlHcmFmUHRyIHBvcnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEdyYWZQdHIgcG9ydDsKICNpZm5kZWYgUG9ydENoYW5nZWQKLQlQeU1hY19QUkVDSEVDSyhQb3J0Q2hhbmdlZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUG9ydENoYW5nZWQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX0NvbnZlcnQsICZwb3J0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JUG9ydENoYW5nZWQocG9ydCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhZk9ial9Db252ZXJ0LCAmcG9ydCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFBvcnRDaGFuZ2VkKHBvcnQpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZG9mZnNfR0RldmljZUNoYW5nZWQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUdESGFuZGxlIGdkaDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgR0RIYW5kbGUgZ2RoOwogI2lmbmRlZiBHRGV2aWNlQ2hhbmdlZAotCVB5TWFjX1BSRUNIRUNLKEdEZXZpY2VDaGFuZ2VkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHRGV2aWNlQ2hhbmdlZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIE9wdFJlc09ial9Db252ZXJ0LCAmZ2RoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR0RldmljZUNoYW5nZWQoZ2RoKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfQ29udmVydCwgJmdkaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdEZXZpY2VDaGFuZ2VkKGdkaCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkb2Zmc19BbGxvd1B1cmdlUGl4ZWxzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQaXhNYXBIYW5kbGUgcG07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBpeE1hcEhhbmRsZSBwbTsKICNpZm5kZWYgQWxsb3dQdXJnZVBpeGVscwotCVB5TWFjX1BSRUNIRUNLKEFsbG93UHVyZ2VQaXhlbHMpOworICAgIFB5TWFjX1BSRUNIRUNLKEFsbG93UHVyZ2VQaXhlbHMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQWxsb3dQdXJnZVBpeGVscyhwbSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEFsbG93UHVyZ2VQaXhlbHMocG0pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZG9mZnNfTm9QdXJnZVBpeGVscyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUGl4TWFwSGFuZGxlIHBtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQaXhNYXBIYW5kbGUgcG07CiAjaWZuZGVmIE5vUHVyZ2VQaXhlbHMKLQlQeU1hY19QUkVDSEVDSyhOb1B1cmdlUGl4ZWxzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhOb1B1cmdlUGl4ZWxzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwbSkpCi0JCXJldHVybiBOVUxMOwotCU5vUHVyZ2VQaXhlbHMocG0pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcG0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBOb1B1cmdlUGl4ZWxzKHBtKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRvZmZzX0dldFBpeGVsc1N0YXRlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlHV29ybGRGbGFncyBfcnY7Ci0JUGl4TWFwSGFuZGxlIHBtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBHV29ybGRGbGFncyBfcnY7CisgICAgUGl4TWFwSGFuZGxlIHBtOwogI2lmbmRlZiBHZXRQaXhlbHNTdGF0ZQotCVB5TWFjX1BSRUNIRUNLKEdldFBpeGVsc1N0YXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRQaXhlbHNTdGF0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcG0pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRQaXhlbHNTdGF0ZShwbSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0UGl4ZWxzU3RhdGUocG0pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkb2Zmc19TZXRQaXhlbHNTdGF0ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUGl4TWFwSGFuZGxlIHBtOwotCUdXb3JsZEZsYWdzIHN0YXRlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQaXhNYXBIYW5kbGUgcG07CisgICAgR1dvcmxkRmxhZ3Mgc3RhdGU7CiAjaWZuZGVmIFNldFBpeGVsc1N0YXRlCi0JUHlNYWNfUFJFQ0hFQ0soU2V0UGl4ZWxzU3RhdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFBpeGVsc1N0YXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcG0sCi0JICAgICAgICAgICAgICAgICAgICAgICZzdGF0ZSkpCi0JCXJldHVybiBOVUxMOwotCVNldFBpeGVsc1N0YXRlKHBtLAotCSAgICAgICAgICAgICAgIHN0YXRlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXRlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0UGl4ZWxzU3RhdGUocG0sCisgICAgICAgICAgICAgICAgICAgc3RhdGUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZG9mZnNfR2V0UGl4Um93Qnl0ZXMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWxvbmcgX3J2OwotCVBpeE1hcEhhbmRsZSBwbTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgbG9uZyBfcnY7CisgICAgUGl4TWFwSGFuZGxlIHBtOwogI2lmbmRlZiBHZXRQaXhSb3dCeXRlcwotCVB5TWFjX1BSRUNIRUNLKEdldFBpeFJvd0J5dGVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRQaXhSb3dCeXRlcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcG0pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRQaXhSb3dCeXRlcyhwbSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0UGl4Um93Qnl0ZXMocG0pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkb2Zmc19OZXdTY3JlZW5CdWZmZXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVFERXJyIF9lcnI7Ci0JUmVjdCBnbG9iYWxSZWN0OwotCUJvb2xlYW4gcHVyZ2VhYmxlOwotCUdESGFuZGxlIGdkaDsKLQlQaXhNYXBIYW5kbGUgb2Zmc2NyZWVuUGl4TWFwOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBRREVyciBfZXJyOworICAgIFJlY3QgZ2xvYmFsUmVjdDsKKyAgICBCb29sZWFuIHB1cmdlYWJsZTsKKyAgICBHREhhbmRsZSBnZGg7CisgICAgUGl4TWFwSGFuZGxlIG9mZnNjcmVlblBpeE1hcDsKICNpZm5kZWYgTmV3U2NyZWVuQnVmZmVyCi0JUHlNYWNfUFJFQ0hFQ0soTmV3U2NyZWVuQnVmZmVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhOZXdTY3JlZW5CdWZmZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmdsb2JhbFJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICZwdXJnZWFibGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gTmV3U2NyZWVuQnVmZmVyKCZnbG9iYWxSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgcHVyZ2VhYmxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgJmdkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICZvZmZzY3JlZW5QaXhNYXApOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGdkaCwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBvZmZzY3JlZW5QaXhNYXApOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZnbG9iYWxSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcHVyZ2VhYmxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IE5ld1NjcmVlbkJ1ZmZlcigmZ2xvYmFsUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1cmdlYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZnZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2NyZWVuUGl4TWFwKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBnZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgb2Zmc2NyZWVuUGl4TWFwKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZG9mZnNfRGlzcG9zZVNjcmVlbkJ1ZmZlcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUGl4TWFwSGFuZGxlIG9mZnNjcmVlblBpeE1hcDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUGl4TWFwSGFuZGxlIG9mZnNjcmVlblBpeE1hcDsKICNpZm5kZWYgRGlzcG9zZVNjcmVlbkJ1ZmZlcgotCVB5TWFjX1BSRUNIRUNLKERpc3Bvc2VTY3JlZW5CdWZmZXIpOworICAgIFB5TWFjX1BSRUNIRUNLKERpc3Bvc2VTY3JlZW5CdWZmZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJm9mZnNjcmVlblBpeE1hcCkpCi0JCXJldHVybiBOVUxMOwotCURpc3Bvc2VTY3JlZW5CdWZmZXIob2Zmc2NyZWVuUGl4TWFwKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJm9mZnNjcmVlblBpeE1hcCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIERpc3Bvc2VTY3JlZW5CdWZmZXIob2Zmc2NyZWVuUGl4TWFwKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRvZmZzX1FERG9uZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JR3JhZlB0ciBwb3J0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBHcmFmUHRyIHBvcnQ7CiAjaWZuZGVmIFFERG9uZQotCVB5TWFjX1BSRUNIRUNLKFFERG9uZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUUREb25lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgR3JhZk9ial9Db252ZXJ0LCAmcG9ydCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFFERG9uZShwb3J0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfQ29udmVydCwgJnBvcnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBRRERvbmUocG9ydCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRvZmZzX09mZnNjcmVlblZlcnNpb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWxvbmcgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBsb25nIF9ydjsKICNpZm5kZWYgT2Zmc2NyZWVuVmVyc2lvbgotCVB5TWFjX1BSRUNIRUNLKE9mZnNjcmVlblZlcnNpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKE9mZnNjcmVlblZlcnNpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE9mZnNjcmVlblZlcnNpb24oKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gT2Zmc2NyZWVuVmVyc2lvbigpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkb2Zmc19OZXdUZW1wU2NyZWVuQnVmZmVyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlRREVyciBfZXJyOwotCVJlY3QgZ2xvYmFsUmVjdDsKLQlCb29sZWFuIHB1cmdlYWJsZTsKLQlHREhhbmRsZSBnZGg7Ci0JUGl4TWFwSGFuZGxlIG9mZnNjcmVlblBpeE1hcDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUURFcnIgX2VycjsKKyAgICBSZWN0IGdsb2JhbFJlY3Q7CisgICAgQm9vbGVhbiBwdXJnZWFibGU7CisgICAgR0RIYW5kbGUgZ2RoOworICAgIFBpeE1hcEhhbmRsZSBvZmZzY3JlZW5QaXhNYXA7CiAjaWZuZGVmIE5ld1RlbXBTY3JlZW5CdWZmZXIKLQlQeU1hY19QUkVDSEVDSyhOZXdUZW1wU2NyZWVuQnVmZmVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhOZXdUZW1wU2NyZWVuQnVmZmVyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZnbG9iYWxSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmcHVyZ2VhYmxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IE5ld1RlbXBTY3JlZW5CdWZmZXIoJmdsb2JhbFJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVyZ2VhYmxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZnZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNjcmVlblBpeE1hcCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgZ2RoLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIG9mZnNjcmVlblBpeE1hcCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmdsb2JhbFJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwdXJnZWFibGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gTmV3VGVtcFNjcmVlbkJ1ZmZlcigmZ2xvYmFsUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXJnZWFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2NyZWVuUGl4TWFwKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBnZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgb2Zmc2NyZWVuUGl4TWFwKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZG9mZnNfUGl4TWFwMzJCaXQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCVBpeE1hcEhhbmRsZSBwbUhhbmRsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgUGl4TWFwSGFuZGxlIHBtSGFuZGxlOwogI2lmbmRlZiBQaXhNYXAzMkJpdAotCVB5TWFjX1BSRUNIRUNLKFBpeE1hcDMyQml0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhQaXhNYXAzMkJpdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcG1IYW5kbGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBQaXhNYXAzMkJpdChwbUhhbmRsZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBtSGFuZGxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gUGl4TWFwMzJCaXQocG1IYW5kbGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkb2Zmc19HZXRQaXhNYXBCeXRlcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogCi0JUGl4TWFwSGFuZGxlIHBtOwotCWludCBmcm9tLCBsZW5ndGg7Ci0JY2hhciAqY3A7CisgICAgUGl4TWFwSGFuZGxlIHBtOworICAgIGludCBmcm9tLCBsZW5ndGg7CisgICAgY2hhciAqY3A7CiAKLQlpZiAoICFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZpaSIsIFJlc09ial9Db252ZXJ0LCAmcG0sICZmcm9tLCAmbGVuZ3RoKSApCi0JICAgICAgICByZXR1cm4gTlVMTDsKLQljcCA9IEdldFBpeEJhc2VBZGRyKHBtKStmcm9tOwotCV9yZXMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShjcCwgbGVuZ3RoKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZpaSIsIFJlc09ial9Db252ZXJ0LCAmcG0sICZmcm9tLCAmbGVuZ3RoKSApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGNwID0gR2V0UGl4QmFzZUFkZHIocG0pK2Zyb207CisgICAgX3JlcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGNwLCBsZW5ndGgpOworICAgIHJldHVybiBfcmVzOwogCiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRvZmZzX1B1dFBpeE1hcEJ5dGVzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAKLQlQaXhNYXBIYW5kbGUgcG07Ci0JaW50IGZyb20sIGxlbmd0aDsKLQljaGFyICpjcCwgKmljcDsKKyAgICBQaXhNYXBIYW5kbGUgcG07CisgICAgaW50IGZyb20sIGxlbmd0aDsKKyAgICBjaGFyICpjcCwgKmljcDsKIAotCWlmICggIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmlzIyIsIFJlc09ial9Db252ZXJ0LCAmcG0sICZmcm9tLCAmaWNwLCAmbGVuZ3RoKSApCi0JICAgICAgICByZXR1cm4gTlVMTDsKLQljcCA9IEdldFBpeEJhc2VBZGRyKHBtKStmcm9tOwotCW1lbWNweShjcCwgaWNwLCBsZW5ndGgpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZpcyMiLCBSZXNPYmpfQ29udmVydCwgJnBtLCAmZnJvbSwgJmljcCwgJmxlbmd0aCkgKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBjcCA9IEdldFBpeEJhc2VBZGRyKHBtKStmcm9tOworICAgIG1lbWNweShjcCwgaWNwLCBsZW5ndGgpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIAogfQogI2VuZGlmIC8qIF9fTFA2NF9fICovCiAKIHN0YXRpYyBQeU1ldGhvZERlZiBRZG9mZnNfbWV0aG9kc1tdID0gewogI2lmbmRlZiBfX0xQNjRfXwotCXsiTmV3R1dvcmxkIiwgKFB5Q0Z1bmN0aW9uKVFkb2Zmc19OZXdHV29ybGQsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IFBpeGVsRGVwdGgsIFJlY3QgYm91bmRzUmVjdCwgQ1RhYkhhbmRsZSBjVGFibGUsIEdESGFuZGxlIGFHRGV2aWNlLCBHV29ybGRGbGFncyBmbGFncykgLT4gKEdXb3JsZFB0ciBvZmZzY3JlZW5HV29ybGQpIil9LAotCXsiTG9ja1BpeGVscyIsIChQeUNGdW5jdGlvbilRZG9mZnNfTG9ja1BpeGVscywgMSwKLQkgUHlEb2NfU1RSKCIoUGl4TWFwSGFuZGxlIHBtKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiVW5sb2NrUGl4ZWxzIiwgKFB5Q0Z1bmN0aW9uKVFkb2Zmc19VbmxvY2tQaXhlbHMsIDEsCi0JIFB5RG9jX1NUUigiKFBpeE1hcEhhbmRsZSBwbSkgLT4gTm9uZSIpfSwKLQl7IlVwZGF0ZUdXb3JsZCIsIChQeUNGdW5jdGlvbilRZG9mZnNfVXBkYXRlR1dvcmxkLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBwaXhlbERlcHRoLCBSZWN0IGJvdW5kc1JlY3QsIENUYWJIYW5kbGUgY1RhYmxlLCBHREhhbmRsZSBhR0RldmljZSwgR1dvcmxkRmxhZ3MgZmxhZ3MpIC0+IChHV29ybGRGbGFncyBfcnYsIEdXb3JsZFB0ciBvZmZzY3JlZW5HV29ybGQpIil9LAotCXsiR2V0R1dvcmxkIiwgKFB5Q0Z1bmN0aW9uKVFkb2Zmc19HZXRHV29ybGQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENHcmFmUHRyIHBvcnQsIEdESGFuZGxlIGdkaCkiKX0sCi0JeyJTZXRHV29ybGQiLCAoUHlDRnVuY3Rpb24pUWRvZmZzX1NldEdXb3JsZCwgMSwKLQkgUHlEb2NfU1RSKCIoQ0dyYWZQdHIgcG9ydCwgR0RIYW5kbGUgZ2RoKSAtPiBOb25lIil9LAotCXsiQ1RhYkNoYW5nZWQiLCAoUHlDRnVuY3Rpb24pUWRvZmZzX0NUYWJDaGFuZ2VkLCAxLAotCSBQeURvY19TVFIoIihDVGFiSGFuZGxlIGN0YWIpIC0+IE5vbmUiKX0sCi0JeyJQaXhQYXRDaGFuZ2VkIiwgKFB5Q0Z1bmN0aW9uKVFkb2Zmc19QaXhQYXRDaGFuZ2VkLCAxLAotCSBQeURvY19TVFIoIihQaXhQYXRIYW5kbGUgcHBhdCkgLT4gTm9uZSIpfSwKLQl7IlBvcnRDaGFuZ2VkIiwgKFB5Q0Z1bmN0aW9uKVFkb2Zmc19Qb3J0Q2hhbmdlZCwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhZlB0ciBwb3J0KSAtPiBOb25lIil9LAotCXsiR0RldmljZUNoYW5nZWQiLCAoUHlDRnVuY3Rpb24pUWRvZmZzX0dEZXZpY2VDaGFuZ2VkLCAxLAotCSBQeURvY19TVFIoIihHREhhbmRsZSBnZGgpIC0+IE5vbmUiKX0sCi0JeyJBbGxvd1B1cmdlUGl4ZWxzIiwgKFB5Q0Z1bmN0aW9uKVFkb2Zmc19BbGxvd1B1cmdlUGl4ZWxzLCAxLAotCSBQeURvY19TVFIoIihQaXhNYXBIYW5kbGUgcG0pIC0+IE5vbmUiKX0sCi0JeyJOb1B1cmdlUGl4ZWxzIiwgKFB5Q0Z1bmN0aW9uKVFkb2Zmc19Ob1B1cmdlUGl4ZWxzLCAxLAotCSBQeURvY19TVFIoIihQaXhNYXBIYW5kbGUgcG0pIC0+IE5vbmUiKX0sCi0JeyJHZXRQaXhlbHNTdGF0ZSIsIChQeUNGdW5jdGlvbilRZG9mZnNfR2V0UGl4ZWxzU3RhdGUsIDEsCi0JIFB5RG9jX1NUUigiKFBpeE1hcEhhbmRsZSBwbSkgLT4gKEdXb3JsZEZsYWdzIF9ydikiKX0sCi0JeyJTZXRQaXhlbHNTdGF0ZSIsIChQeUNGdW5jdGlvbilRZG9mZnNfU2V0UGl4ZWxzU3RhdGUsIDEsCi0JIFB5RG9jX1NUUigiKFBpeE1hcEhhbmRsZSBwbSwgR1dvcmxkRmxhZ3Mgc3RhdGUpIC0+IE5vbmUiKX0sCi0JeyJHZXRQaXhSb3dCeXRlcyIsIChQeUNGdW5jdGlvbilRZG9mZnNfR2V0UGl4Um93Qnl0ZXMsIDEsCi0JIFB5RG9jX1NUUigiKFBpeE1hcEhhbmRsZSBwbSkgLT4gKGxvbmcgX3J2KSIpfSwKLQl7Ik5ld1NjcmVlbkJ1ZmZlciIsIChQeUNGdW5jdGlvbilRZG9mZnNfTmV3U2NyZWVuQnVmZmVyLCAxLAotCSBQeURvY19TVFIoIihSZWN0IGdsb2JhbFJlY3QsIEJvb2xlYW4gcHVyZ2VhYmxlKSAtPiAoR0RIYW5kbGUgZ2RoLCBQaXhNYXBIYW5kbGUgb2Zmc2NyZWVuUGl4TWFwKSIpfSwKLQl7IkRpc3Bvc2VTY3JlZW5CdWZmZXIiLCAoUHlDRnVuY3Rpb24pUWRvZmZzX0Rpc3Bvc2VTY3JlZW5CdWZmZXIsIDEsCi0JIFB5RG9jX1NUUigiKFBpeE1hcEhhbmRsZSBvZmZzY3JlZW5QaXhNYXApIC0+IE5vbmUiKX0sCi0JeyJRRERvbmUiLCAoUHlDRnVuY3Rpb24pUWRvZmZzX1FERG9uZSwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhZlB0ciBwb3J0KSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiT2Zmc2NyZWVuVmVyc2lvbiIsIChQeUNGdW5jdGlvbilRZG9mZnNfT2Zmc2NyZWVuVmVyc2lvbiwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAobG9uZyBfcnYpIil9LAotCXsiTmV3VGVtcFNjcmVlbkJ1ZmZlciIsIChQeUNGdW5jdGlvbilRZG9mZnNfTmV3VGVtcFNjcmVlbkJ1ZmZlciwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCBnbG9iYWxSZWN0LCBCb29sZWFuIHB1cmdlYWJsZSkgLT4gKEdESGFuZGxlIGdkaCwgUGl4TWFwSGFuZGxlIG9mZnNjcmVlblBpeE1hcCkiKX0sCi0JeyJQaXhNYXAzMkJpdCIsIChQeUNGdW5jdGlvbilRZG9mZnNfUGl4TWFwMzJCaXQsIDEsCi0JIFB5RG9jX1NUUigiKFBpeE1hcEhhbmRsZSBwbUhhbmRsZSkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IkdldFBpeE1hcEJ5dGVzIiwgKFB5Q0Z1bmN0aW9uKVFkb2Zmc19HZXRQaXhNYXBCeXRlcywgMSwKLQkgUHlEb2NfU1RSKCIocGl4bWFwLCBpbnQgc3RhcnQsIGludCBzaXplKSAtPiBzdHJpbmcuIFJldHVybiBieXRlcyBmcm9tIHRoZSBwaXhtYXAiKX0sCi0JeyJQdXRQaXhNYXBCeXRlcyIsIChQeUNGdW5jdGlvbilRZG9mZnNfUHV0UGl4TWFwQnl0ZXMsIDEsCi0JIFB5RG9jX1NUUigiKHBpeG1hcCwgaW50IHN0YXJ0LCBzdHJpbmcgZGF0YSkuIFN0b3JlIGJ5dGVzIGludG8gdGhlIHBpeG1hcCIpfSwKKyAgICB7Ik5ld0dXb3JsZCIsIChQeUNGdW5jdGlvbilRZG9mZnNfTmV3R1dvcmxkLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBQaXhlbERlcHRoLCBSZWN0IGJvdW5kc1JlY3QsIENUYWJIYW5kbGUgY1RhYmxlLCBHREhhbmRsZSBhR0RldmljZSwgR1dvcmxkRmxhZ3MgZmxhZ3MpIC0+IChHV29ybGRQdHIgb2Zmc2NyZWVuR1dvcmxkKSIpfSwKKyAgICB7IkxvY2tQaXhlbHMiLCAoUHlDRnVuY3Rpb24pUWRvZmZzX0xvY2tQaXhlbHMsIDEsCisgICAgIFB5RG9jX1NUUigiKFBpeE1hcEhhbmRsZSBwbSkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IlVubG9ja1BpeGVscyIsIChQeUNGdW5jdGlvbilRZG9mZnNfVW5sb2NrUGl4ZWxzLCAxLAorICAgICBQeURvY19TVFIoIihQaXhNYXBIYW5kbGUgcG0pIC0+IE5vbmUiKX0sCisgICAgeyJVcGRhdGVHV29ybGQiLCAoUHlDRnVuY3Rpb24pUWRvZmZzX1VwZGF0ZUdXb3JsZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgcGl4ZWxEZXB0aCwgUmVjdCBib3VuZHNSZWN0LCBDVGFiSGFuZGxlIGNUYWJsZSwgR0RIYW5kbGUgYUdEZXZpY2UsIEdXb3JsZEZsYWdzIGZsYWdzKSAtPiAoR1dvcmxkRmxhZ3MgX3J2LCBHV29ybGRQdHIgb2Zmc2NyZWVuR1dvcmxkKSIpfSwKKyAgICB7IkdldEdXb3JsZCIsIChQeUNGdW5jdGlvbilRZG9mZnNfR2V0R1dvcmxkLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDR3JhZlB0ciBwb3J0LCBHREhhbmRsZSBnZGgpIil9LAorICAgIHsiU2V0R1dvcmxkIiwgKFB5Q0Z1bmN0aW9uKVFkb2Zmc19TZXRHV29ybGQsIDEsCisgICAgIFB5RG9jX1NUUigiKENHcmFmUHRyIHBvcnQsIEdESGFuZGxlIGdkaCkgLT4gTm9uZSIpfSwKKyAgICB7IkNUYWJDaGFuZ2VkIiwgKFB5Q0Z1bmN0aW9uKVFkb2Zmc19DVGFiQ2hhbmdlZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ1RhYkhhbmRsZSBjdGFiKSAtPiBOb25lIil9LAorICAgIHsiUGl4UGF0Q2hhbmdlZCIsIChQeUNGdW5jdGlvbilRZG9mZnNfUGl4UGF0Q2hhbmdlZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUGl4UGF0SGFuZGxlIHBwYXQpIC0+IE5vbmUiKX0sCisgICAgeyJQb3J0Q2hhbmdlZCIsIChQeUNGdW5jdGlvbilRZG9mZnNfUG9ydENoYW5nZWQsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYWZQdHIgcG9ydCkgLT4gTm9uZSIpfSwKKyAgICB7IkdEZXZpY2VDaGFuZ2VkIiwgKFB5Q0Z1bmN0aW9uKVFkb2Zmc19HRGV2aWNlQ2hhbmdlZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR0RIYW5kbGUgZ2RoKSAtPiBOb25lIil9LAorICAgIHsiQWxsb3dQdXJnZVBpeGVscyIsIChQeUNGdW5jdGlvbilRZG9mZnNfQWxsb3dQdXJnZVBpeGVscywgMSwKKyAgICAgUHlEb2NfU1RSKCIoUGl4TWFwSGFuZGxlIHBtKSAtPiBOb25lIil9LAorICAgIHsiTm9QdXJnZVBpeGVscyIsIChQeUNGdW5jdGlvbilRZG9mZnNfTm9QdXJnZVBpeGVscywgMSwKKyAgICAgUHlEb2NfU1RSKCIoUGl4TWFwSGFuZGxlIHBtKSAtPiBOb25lIil9LAorICAgIHsiR2V0UGl4ZWxzU3RhdGUiLCAoUHlDRnVuY3Rpb24pUWRvZmZzX0dldFBpeGVsc1N0YXRlLCAxLAorICAgICBQeURvY19TVFIoIihQaXhNYXBIYW5kbGUgcG0pIC0+IChHV29ybGRGbGFncyBfcnYpIil9LAorICAgIHsiU2V0UGl4ZWxzU3RhdGUiLCAoUHlDRnVuY3Rpb24pUWRvZmZzX1NldFBpeGVsc1N0YXRlLCAxLAorICAgICBQeURvY19TVFIoIihQaXhNYXBIYW5kbGUgcG0sIEdXb3JsZEZsYWdzIHN0YXRlKSAtPiBOb25lIil9LAorICAgIHsiR2V0UGl4Um93Qnl0ZXMiLCAoUHlDRnVuY3Rpb24pUWRvZmZzX0dldFBpeFJvd0J5dGVzLCAxLAorICAgICBQeURvY19TVFIoIihQaXhNYXBIYW5kbGUgcG0pIC0+IChsb25nIF9ydikiKX0sCisgICAgeyJOZXdTY3JlZW5CdWZmZXIiLCAoUHlDRnVuY3Rpb24pUWRvZmZzX05ld1NjcmVlbkJ1ZmZlciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCBnbG9iYWxSZWN0LCBCb29sZWFuIHB1cmdlYWJsZSkgLT4gKEdESGFuZGxlIGdkaCwgUGl4TWFwSGFuZGxlIG9mZnNjcmVlblBpeE1hcCkiKX0sCisgICAgeyJEaXNwb3NlU2NyZWVuQnVmZmVyIiwgKFB5Q0Z1bmN0aW9uKVFkb2Zmc19EaXNwb3NlU2NyZWVuQnVmZmVyLCAxLAorICAgICBQeURvY19TVFIoIihQaXhNYXBIYW5kbGUgb2Zmc2NyZWVuUGl4TWFwKSAtPiBOb25lIil9LAorICAgIHsiUUREb25lIiwgKFB5Q0Z1bmN0aW9uKVFkb2Zmc19RRERvbmUsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYWZQdHIgcG9ydCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7Ik9mZnNjcmVlblZlcnNpb24iLCAoUHlDRnVuY3Rpb24pUWRvZmZzX09mZnNjcmVlblZlcnNpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKGxvbmcgX3J2KSIpfSwKKyAgICB7Ik5ld1RlbXBTY3JlZW5CdWZmZXIiLCAoUHlDRnVuY3Rpb24pUWRvZmZzX05ld1RlbXBTY3JlZW5CdWZmZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgZ2xvYmFsUmVjdCwgQm9vbGVhbiBwdXJnZWFibGUpIC0+IChHREhhbmRsZSBnZGgsIFBpeE1hcEhhbmRsZSBvZmZzY3JlZW5QaXhNYXApIil9LAorICAgIHsiUGl4TWFwMzJCaXQiLCAoUHlDRnVuY3Rpb24pUWRvZmZzX1BpeE1hcDMyQml0LCAxLAorICAgICBQeURvY19TVFIoIihQaXhNYXBIYW5kbGUgcG1IYW5kbGUpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJHZXRQaXhNYXBCeXRlcyIsIChQeUNGdW5jdGlvbilRZG9mZnNfR2V0UGl4TWFwQnl0ZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKHBpeG1hcCwgaW50IHN0YXJ0LCBpbnQgc2l6ZSkgLT4gc3RyaW5nLiBSZXR1cm4gYnl0ZXMgZnJvbSB0aGUgcGl4bWFwIil9LAorICAgIHsiUHV0UGl4TWFwQnl0ZXMiLCAoUHlDRnVuY3Rpb24pUWRvZmZzX1B1dFBpeE1hcEJ5dGVzLCAxLAorICAgICBQeURvY19TVFIoIihwaXhtYXAsIGludCBzdGFydCwgc3RyaW5nIGRhdGEpLiBTdG9yZSBieXRlcyBpbnRvIHRoZSBwaXhtYXAiKX0sCiAjZW5kaWYgLyogX19MUDY0X18gKi8KLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKIApAQCAtNjkwLDMxICs2OTAsMzEgQEAKIAogdm9pZCBpbml0X1Fkb2Zmcyh2b2lkKQogewotCVB5T2JqZWN0ICptOworICAgIFB5T2JqZWN0ICptOwogI2lmbmRlZiBfX0xQNjRfXwotCVB5T2JqZWN0ICpkOworICAgIFB5T2JqZWN0ICpkOwogCiAKIAotCSAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoR1dvcmxkUHRyLCBHV29ybGRPYmpfTmV3KTsKLQkgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChHV29ybGRQdHIsIEdXb3JsZE9ial9Db252ZXJ0KTsKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoR1dvcmxkUHRyLCBHV29ybGRPYmpfTmV3KTsKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKEdXb3JsZFB0ciwgR1dvcmxkT2JqX0NvbnZlcnQpOwogCiAjZW5kaWYgLyogX19MUDY0X18gKi8KIAotCW0gPSBQeV9Jbml0TW9kdWxlKCJfUWRvZmZzIiwgUWRvZmZzX21ldGhvZHMpOworICAgIG0gPSBQeV9Jbml0TW9kdWxlKCJfUWRvZmZzIiwgUWRvZmZzX21ldGhvZHMpOwogI2lmbmRlZiBfX0xQNjRfXwotCWQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOwotCVFkb2Zmc19FcnJvciA9IFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCk7Ci0JaWYgKFFkb2Zmc19FcnJvciA9PSBOVUxMIHx8Ci0JICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFcnJvciIsIFFkb2Zmc19FcnJvcikgIT0gMCkKLQkJcmV0dXJuOwotCUdXb3JsZF9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmR1dvcmxkX1R5cGUpIDwgMCkgcmV0dXJuOwotCVB5X0lOQ1JFRigmR1dvcmxkX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiR1dvcmxkIiwgKFB5T2JqZWN0ICopJkdXb3JsZF9UeXBlKTsKLQkvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KLQlQeV9JTkNSRUYoJkdXb3JsZF9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkdXb3JsZFR5cGUiLCAoUHlPYmplY3QgKikmR1dvcmxkX1R5cGUpOworICAgIGQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOworICAgIFFkb2Zmc19FcnJvciA9IFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCk7CisgICAgaWYgKFFkb2Zmc19FcnJvciA9PSBOVUxMIHx8CisgICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFcnJvciIsIFFkb2Zmc19FcnJvcikgIT0gMCkKKyAgICAgICAgcmV0dXJuOworICAgIEdXb3JsZF9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmR1dvcmxkX1R5cGUpIDwgMCkgcmV0dXJuOworICAgIFB5X0lOQ1JFRigmR1dvcmxkX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiR1dvcmxkIiwgKFB5T2JqZWN0ICopJkdXb3JsZF9UeXBlKTsKKyAgICAvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KKyAgICBQeV9JTkNSRUYoJkdXb3JsZF9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkdXb3JsZFR5cGUiLCAoUHlPYmplY3QgKikmR1dvcmxkX1R5cGUpOwogI2VuZGlmIC8qIF9fTFA2NF9fICovCiB9CiAKZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL3F0L19RdG1vZHVsZS5jIGIvTWFjL01vZHVsZXMvcXQvX1F0bW9kdWxlLmMKaW5kZXggNDg0NWU0YS4uYmY2N2NkYSAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvcXQvX1F0bW9kdWxlLmMKKysrIGIvTWFjL01vZHVsZXMvcXQvX1F0bW9kdWxlLmMKQEAgLTEwLDkgKzEwLDkgQEAKIAogLyogTWFjcm8gdG8gdGVzdCB3aGV0aGVyIGEgd2Vhay1sb2FkZWQgQ0ZNIGZ1bmN0aW9uIGV4aXN0cyAqLwogI2RlZmluZSBQeU1hY19QUkVDSEVDSyhydG4pIGRvIHsgaWYgKCAmcnRuID09IE5VTEwgKSAge1wKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsIFwKLSAgICAgICAgIk5vdCBhdmFpbGFibGUgaW4gdGhpcyBzaGFyZWQgbGlicmFyeS9PUyB2ZXJzaW9uIik7IFwKLSAgICAgICAgcmV0dXJuIE5VTEw7IFwKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgXAorICAgICJOb3QgYXZhaWxhYmxlIGluIHRoaXMgc2hhcmVkIGxpYnJhcnkvT1MgdmVyc2lvbiIpOyBcCisgICAgcmV0dXJuIE5VTEw7IFwKICAgICB9fSB3aGlsZSgwKQogCiAKQEAgLTU2LDM3ICs1NiwzNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIFF0VGltZVJlY29yZF9OZXcoVGltZVJlY29yZCAqaXRzZWxmKQogewotICAgICAgICBpZiAoaXRzZWxmLT5iYXNlKQotICAgICAgICAgICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPJmxPJiIsIFB5TWFjX0J1aWxkd2lkZSwgJml0c2VsZi0+dmFsdWUsIGl0c2VsZi0+c2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBUaW1lQmFzZU9ial9OZXcsIGl0c2VsZi0+YmFzZSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXR1cm4gIFB5X0J1aWxkVmFsdWUoIk8mbE8iLCBQeU1hY19CdWlsZHdpZGUsICZpdHNlbGYtPnZhbHVlLCBpdHNlbGYtPnNjYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgUHlfTm9uZSk7CisgICAgaWYgKGl0c2VsZi0+YmFzZSkKKyAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mbE8mIiwgUHlNYWNfQnVpbGR3aWRlLCAmaXRzZWxmLT52YWx1ZSwgaXRzZWxmLT5zY2FsZSwKKyAgICAgICAgICAgIFRpbWVCYXNlT2JqX05ldywgaXRzZWxmLT5iYXNlKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiAgUHlfQnVpbGRWYWx1ZSgiTyZsTyIsIFB5TWFjX0J1aWxkd2lkZSwgJml0c2VsZi0+dmFsdWUsIGl0c2VsZi0+c2NhbGUsCisgICAgICAgICAgICBQeV9Ob25lKTsKIH0KIAogc3RhdGljIGludAogUXRUaW1lUmVjb3JkX0NvbnZlcnQoUHlPYmplY3QgKnYsIFRpbWVSZWNvcmQgKnBfaXRzZWxmKQogewotICAgICAgICBQeU9iamVjdCAqYmFzZSA9IE5VTEw7Ci0gICAgICAgIGlmKCAhUHlBcmdfUGFyc2VUdXBsZSh2LCAiTyZsfE8iLCBQeU1hY19HZXR3aWRlLCAmcF9pdHNlbGYtPnZhbHVlLCAmcF9pdHNlbGYtPnNjYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgJmJhc2UpICkKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgaWYgKCBiYXNlID09IE5VTEwgfHwgYmFzZSA9PSBQeV9Ob25lICkKLSAgICAgICAgICAgICAgICBwX2l0c2VsZi0+YmFzZSA9IE5VTEw7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBpZiAoICFUaW1lQmFzZU9ial9Db252ZXJ0KGJhc2UsICZwX2l0c2VsZi0+YmFzZSkgKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIHJldHVybiAxOworICAgIFB5T2JqZWN0ICpiYXNlID0gTlVMTDsKKyAgICBpZiggIVB5QXJnX1BhcnNlVHVwbGUodiwgIk8mbHxPIiwgUHlNYWNfR2V0d2lkZSwgJnBfaXRzZWxmLT52YWx1ZSwgJnBfaXRzZWxmLT5zY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgJmJhc2UpICkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKCBiYXNlID09IE5VTEwgfHwgYmFzZSA9PSBQeV9Ob25lICkKKyAgICAgICAgcF9pdHNlbGYtPmJhc2UgPSBOVUxMOworICAgIGVsc2UKKyAgICAgICAgaWYgKCAhVGltZUJhc2VPYmpfQ29udmVydChiYXNlLCAmcF9pdHNlbGYtPmJhc2UpICkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgaW50CiBRdE11c2ljTUlESVBhY2tldF9Db252ZXJ0KFB5T2JqZWN0ICp2LCBNdXNpY01JRElQYWNrZXQgKnBfaXRzZWxmKQogewotICAgICAgICBpbnQgZHVtbXk7CisgICAgaW50IGR1bW15OwogCi0gICAgICAgIGlmKCAhUHlBcmdfUGFyc2VUdXBsZSh2LCAiaGxzIyIsICZwX2l0c2VsZi0+bGVuZ3RoLCAmcF9pdHNlbGYtPnJlc2VydmVkLCBwX2l0c2VsZi0+ZGF0YSwgZHVtbXkpICkKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgcmV0dXJuIDE7CisgICAgaWYoICFQeUFyZ19QYXJzZVR1cGxlKHYsICJobHMjIiwgJnBfaXRzZWxmLT5sZW5ndGgsICZwX2l0c2VsZi0+cmVzZXJ2ZWQsIHBfaXRzZWxmLT5kYXRhLCBkdW1teSkgKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gMTsKIH0KIAogCkBAIC0xMDEsNDcgKzEwMSw0NyBAQAogI2RlZmluZSBJZGxlTWFuYWdlck9ial9DaGVjayh4KSAoKHgpLT5vYl90eXBlID09ICZJZGxlTWFuYWdlcl9UeXBlIHx8IFB5T2JqZWN0X1R5cGVDaGVjaygoeCksICZJZGxlTWFuYWdlcl9UeXBlKSkKIAogdHlwZWRlZiBzdHJ1Y3QgSWRsZU1hbmFnZXJPYmplY3QgewotCVB5T2JqZWN0X0hFQUQKLQlJZGxlTWFuYWdlciBvYl9pdHNlbGY7CisgICAgUHlPYmplY3RfSEVBRAorICAgIElkbGVNYW5hZ2VyIG9iX2l0c2VsZjsKIH0gSWRsZU1hbmFnZXJPYmplY3Q7CiAKIFB5T2JqZWN0ICpJZGxlTWFuYWdlck9ial9OZXcoSWRsZU1hbmFnZXIgaXRzZWxmKQogewotCUlkbGVNYW5hZ2VyT2JqZWN0ICppdDsKLQlpZiAoaXRzZWxmID09IE5VTEwpIHsKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhRdF9FcnJvciwiQ2Fubm90IGNyZWF0ZSBJZGxlTWFuYWdlciBmcm9tIE5VTEwgcG9pbnRlciIpOwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgfQotCWl0ID0gUHlPYmplY3RfTkVXKElkbGVNYW5hZ2VyT2JqZWN0LCAmSWRsZU1hbmFnZXJfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOwotCWl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIElkbGVNYW5hZ2VyT2JqZWN0ICppdDsKKyAgICBpZiAoaXRzZWxmID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhRdF9FcnJvciwiQ2Fubm90IGNyZWF0ZSBJZGxlTWFuYWdlciBmcm9tIE5VTEwgcG9pbnRlciIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgIGl0ID0gUHlPYmplY3RfTkVXKElkbGVNYW5hZ2VyT2JqZWN0LCAmSWRsZU1hbmFnZXJfVHlwZSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIGl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogCiBpbnQgSWRsZU1hbmFnZXJPYmpfQ29udmVydChQeU9iamVjdCAqdiwgSWRsZU1hbmFnZXIgKnBfaXRzZWxmKQogewotCWlmICh2ID09IFB5X05vbmUpCi0JewotCQkqcF9pdHNlbGYgPSBOVUxMOwotCQlyZXR1cm4gMTsKLQl9Ci0JaWYgKCFJZGxlTWFuYWdlck9ial9DaGVjayh2KSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJJZGxlTWFuYWdlciByZXF1aXJlZCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JKnBfaXRzZWxmID0gKChJZGxlTWFuYWdlck9iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0JcmV0dXJuIDE7CisgICAgaWYgKHYgPT0gUHlfTm9uZSkKKyAgICB7CisgICAgICAgICpwX2l0c2VsZiA9IE5VTEw7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAoIUlkbGVNYW5hZ2VyT2JqX0NoZWNrKHYpKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIklkbGVNYW5hZ2VyIHJlcXVpcmVkIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAqcF9pdHNlbGYgPSAoKElkbGVNYW5hZ2VyT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIHZvaWQgSWRsZU1hbmFnZXJPYmpfZGVhbGxvYyhJZGxlTWFuYWdlck9iamVjdCAqc2VsZikKIHsKLQkvKiBDbGVhbnVwIG9mIHNlbGYtPm9iX2l0c2VsZiBnb2VzIGhlcmUgKi8KLQlzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOworICAgIC8qIENsZWFudXAgb2Ygc2VsZi0+b2JfaXRzZWxmIGdvZXMgaGVyZSAqLworICAgIHNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBJZGxlTWFuYWdlck9ial9tZXRob2RzW10gPSB7Ci0Je05VTEwsIE5VTEwsIDB9CisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAjZGVmaW5lIElkbGVNYW5hZ2VyT2JqX2dldHNldGxpc3QgTlVMTApAQCAtMTU4LDYxICsxNTgsNjEgQEAKIAogc3RhdGljIFB5T2JqZWN0ICpJZGxlTWFuYWdlck9ial90cF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlQeU9iamVjdCAqX3NlbGY7Ci0JSWRsZU1hbmFnZXIgaXRzZWxmOwotCWNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OworICAgIFB5T2JqZWN0ICpfc2VsZjsKKyAgICBJZGxlTWFuYWdlciBpdHNlbGY7CisgICAgY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBJZGxlTWFuYWdlck9ial9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7Ci0JaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkoKElkbGVNYW5hZ2VyT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JcmV0dXJuIF9zZWxmOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIElkbGVNYW5hZ2VyT2JqX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOworICAgICgoSWRsZU1hbmFnZXJPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICByZXR1cm4gX3NlbGY7CiB9CiAKICNkZWZpbmUgSWRsZU1hbmFnZXJPYmpfdHBfZnJlZSBQeU9iamVjdF9EZWwKIAogCiBQeVR5cGVPYmplY3QgSWRsZU1hbmFnZXJfVHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKLQkwLCAvKm9iX3NpemUqLwotCSJfUXQuSWRsZU1hbmFnZXIiLCAvKnRwX25hbWUqLwotCXNpemVvZihJZGxlTWFuYWdlck9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KLQkwLCAvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpIElkbGVNYW5hZ2VyT2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCi0JMCwgLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCi0JKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCi0JKGNtcGZ1bmMpIElkbGVNYW5hZ2VyT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCi0JKHJlcHJmdW5jKSBJZGxlTWFuYWdlck9ial9yZXByLCAvKnRwX3JlcHIqLwotCShQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KLQkoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLwotCShQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYykgSWRsZU1hbmFnZXJPYmpfaGFzaCwgLyp0cF9oYXNoKi8KLQkwLCAvKnRwX2NhbGwqLwotCTAsIC8qdHBfc3RyKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCi0JUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KLQkwLCAvKnRwX2FzX2J1ZmZlciovCi0JUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCi0JMCwgLyp0cF9kb2MqLwotCTAsIC8qdHBfdHJhdmVyc2UqLwotCTAsIC8qdHBfY2xlYXIqLwotCTAsIC8qdHBfcmljaGNvbXBhcmUqLwotCTAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLwotCTAsIC8qdHBfaXRlciovCi0JMCwgLyp0cF9pdGVybmV4dCovCi0JSWRsZU1hbmFnZXJPYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLwotCTAsIC8qdHBfbWVtYmVycyovCi0JSWRsZU1hbmFnZXJPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLwotCTAsIC8qdHBfYmFzZSovCi0JMCwgLyp0cF9kaWN0Ki8KLQkwLCAvKnRwX2Rlc2NyX2dldCovCi0JMCwgLyp0cF9kZXNjcl9zZXQqLwotCTAsIC8qdHBfZGljdG9mZnNldCovCi0JSWRsZU1hbmFnZXJPYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLwotCUlkbGVNYW5hZ2VyT2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLwotCUlkbGVNYW5hZ2VyT2JqX3RwX25ldywgLyogdHBfbmV3ICovCi0JSWRsZU1hbmFnZXJPYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgIDAsIC8qb2Jfc2l6ZSovCisgICAgIl9RdC5JZGxlTWFuYWdlciIsIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKElkbGVNYW5hZ2VyT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLworICAgIDAsIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcikgSWRsZU1hbmFnZXJPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KKyAgICAoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KKyAgICAoY21wZnVuYykgSWRsZU1hbmFnZXJPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpIElkbGVNYW5hZ2VyT2JqX3JlcHIsIC8qdHBfcmVwciovCisgICAgKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLworICAgIChQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKSBJZGxlTWFuYWdlck9ial9oYXNoLCAvKnRwX2hhc2gqLworICAgIDAsIC8qdHBfY2FsbCovCisgICAgMCwgLyp0cF9zdHIqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KKyAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLworICAgIDAsIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAvKnRwX2RvYyovCisgICAgMCwgLyp0cF90cmF2ZXJzZSovCisgICAgMCwgLyp0cF9jbGVhciovCisgICAgMCwgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgLyp0cF9pdGVyKi8KKyAgICAwLCAvKnRwX2l0ZXJuZXh0Ki8KKyAgICBJZGxlTWFuYWdlck9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCisgICAgMCwgLyp0cF9tZW1iZXJzKi8KKyAgICBJZGxlTWFuYWdlck9ial9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCisgICAgMCwgLyp0cF9iYXNlKi8KKyAgICAwLCAvKnRwX2RpY3QqLworICAgIDAsIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICBJZGxlTWFuYWdlck9ial90cF9pbml0LCAvKiB0cF9pbml0ICovCisgICAgSWRsZU1hbmFnZXJPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCisgICAgSWRsZU1hbmFnZXJPYmpfdHBfbmV3LCAvKiB0cF9uZXcgKi8KKyAgICBJZGxlTWFuYWdlck9ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0gRW5kIG9iamVjdCB0eXBlIElkbGVNYW5hZ2VyIC0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTIyNSwxMDQzICsyMjUsMTA0MyBAQAogI2RlZmluZSBNb3ZpZUN0bE9ial9DaGVjayh4KSAoKHgpLT5vYl90eXBlID09ICZNb3ZpZUNvbnRyb2xsZXJfVHlwZSB8fCBQeU9iamVjdF9UeXBlQ2hlY2soKHgpLCAmTW92aWVDb250cm9sbGVyX1R5cGUpKQogCiB0eXBlZGVmIHN0cnVjdCBNb3ZpZUNvbnRyb2xsZXJPYmplY3QgewotCVB5T2JqZWN0X0hFQUQKLQlNb3ZpZUNvbnRyb2xsZXIgb2JfaXRzZWxmOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBNb3ZpZUNvbnRyb2xsZXIgb2JfaXRzZWxmOwogfSBNb3ZpZUNvbnRyb2xsZXJPYmplY3Q7CiAKIFB5T2JqZWN0ICpNb3ZpZUN0bE9ial9OZXcoTW92aWVDb250cm9sbGVyIGl0c2VsZikKIHsKLQlNb3ZpZUNvbnRyb2xsZXJPYmplY3QgKml0OwotCWlmIChpdHNlbGYgPT0gTlVMTCkgewotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFF0X0Vycm9yLCJDYW5ub3QgY3JlYXRlIE1vdmllQ29udHJvbGxlciBmcm9tIE5VTEwgcG9pbnRlciIpOwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgfQotCWl0ID0gUHlPYmplY3RfTkVXKE1vdmllQ29udHJvbGxlck9iamVjdCwgJk1vdmllQ29udHJvbGxlcl9UeXBlKTsKLQlpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgTW92aWVDb250cm9sbGVyT2JqZWN0ICppdDsKKyAgICBpZiAoaXRzZWxmID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhRdF9FcnJvciwiQ2Fubm90IGNyZWF0ZSBNb3ZpZUNvbnRyb2xsZXIgZnJvbSBOVUxMIHBvaW50ZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICBpdCA9IFB5T2JqZWN0X05FVyhNb3ZpZUNvbnRyb2xsZXJPYmplY3QsICZNb3ZpZUNvbnRyb2xsZXJfVHlwZSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIGl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogCiBpbnQgTW92aWVDdGxPYmpfQ29udmVydChQeU9iamVjdCAqdiwgTW92aWVDb250cm9sbGVyICpwX2l0c2VsZikKIHsKLQlpZiAodiA9PSBQeV9Ob25lKQotCXsKLQkJKnBfaXRzZWxmID0gTlVMTDsKLQkJcmV0dXJuIDE7Ci0JfQotCWlmICghTW92aWVDdGxPYmpfQ2hlY2sodikpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiTW92aWVDb250cm9sbGVyIHJlcXVpcmVkIik7Ci0JCXJldHVybiAwOwotCX0KLQkqcF9pdHNlbGYgPSAoKE1vdmllQ29udHJvbGxlck9iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0JcmV0dXJuIDE7CisgICAgaWYgKHYgPT0gUHlfTm9uZSkKKyAgICB7CisgICAgICAgICpwX2l0c2VsZiA9IE5VTEw7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAoIU1vdmllQ3RsT2JqX0NoZWNrKHYpKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIk1vdmllQ29udHJvbGxlciByZXF1aXJlZCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgKnBfaXRzZWxmID0gKChNb3ZpZUNvbnRyb2xsZXJPYmplY3QgKil2KS0+b2JfaXRzZWxmOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgdm9pZCBNb3ZpZUN0bE9ial9kZWFsbG9jKE1vdmllQ29udHJvbGxlck9iamVjdCAqc2VsZikKIHsKLQlpZiAoc2VsZi0+b2JfaXRzZWxmKSBEaXNwb3NlTW92aWVDb250cm9sbGVyKHNlbGYtPm9iX2l0c2VsZik7Ci0Jc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKKyAgICBpZiAoc2VsZi0+b2JfaXRzZWxmKSBEaXNwb3NlTW92aWVDb250cm9sbGVyKHNlbGYtPm9iX2l0c2VsZik7CisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZUN0bE9ial9NQ1NldE1vdmllKE1vdmllQ29udHJvbGxlck9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNb3ZpZSB0aGVNb3ZpZTsKLQlXaW5kb3dQdHIgbW92aWVXaW5kb3c7Ci0JUG9pbnQgd2hlcmU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTW92aWUgdGhlTW92aWU7CisgICAgV2luZG93UHRyIG1vdmllV2luZG93OworICAgIFBvaW50IHdoZXJlOwogI2lmbmRlZiBNQ1NldE1vdmllCi0JUHlNYWNfUFJFQ0hFQ0soTUNTZXRNb3ZpZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTUNTZXRNb3ZpZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9Db252ZXJ0LCAmdGhlTW92aWUsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmbW92aWVXaW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmd2hlcmUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNQ1NldE1vdmllKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICB0aGVNb3ZpZSwKLQkgICAgICAgICAgICAgICAgIG1vdmllV2luZG93LAotCSAgICAgICAgICAgICAgICAgd2hlcmUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX0NvbnZlcnQsICZ0aGVNb3ZpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZtb3ZpZVdpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZ3aGVyZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1DU2V0TW92aWUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgIHRoZU1vdmllLAorICAgICAgICAgICAgICAgICAgICAgbW92aWVXaW5kb3csCisgICAgICAgICAgICAgICAgICAgICB3aGVyZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVDdGxPYmpfTUNHZXRJbmRNb3ZpZShNb3ZpZUNvbnRyb2xsZXJPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU1vdmllIF9ydjsKLQlzaG9ydCBpbmRleDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgTW92aWUgX3J2OworICAgIHNob3J0IGluZGV4OwogI2lmbmRlZiBNQ0dldEluZE1vdmllCi0JUHlNYWNfUFJFQ0hFQ0soTUNHZXRJbmRNb3ZpZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTUNHZXRJbmRNb3ZpZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluZGV4KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTUNHZXRJbmRNb3ZpZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgaW5kZXgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNQ0dldEluZE1vdmllKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVDdGxPYmpfTUNSZW1vdmVBbGxNb3ZpZXMoTW92aWVDb250cm9sbGVyT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OwogI2lmbmRlZiBNQ1JlbW92ZUFsbE1vdmllcwotCVB5TWFjX1BSRUNIRUNLKE1DUmVtb3ZlQWxsTW92aWVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNQ1JlbW92ZUFsbE1vdmllcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTUNSZW1vdmVBbGxNb3ZpZXMoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1DUmVtb3ZlQWxsTW92aWVzKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllQ3RsT2JqX01DUmVtb3ZlQU1vdmllKE1vdmllQ29udHJvbGxlck9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNb3ZpZSBtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1vdmllIG07CiAjaWZuZGVmIE1DUmVtb3ZlQU1vdmllCi0JUHlNYWNfUFJFQ0hFQ0soTUNSZW1vdmVBTW92aWUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1DUmVtb3ZlQU1vdmllKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfQ29udmVydCwgJm0pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNQ1JlbW92ZUFNb3ZpZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgIG0pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfQ29udmVydCwgJm0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNQ1JlbW92ZUFNb3ZpZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgIG0pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllQ3RsT2JqX01DUmVtb3ZlTW92aWUoTW92aWVDb250cm9sbGVyT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OwogI2lmbmRlZiBNQ1JlbW92ZU1vdmllCi0JUHlNYWNfUFJFQ0hFQ0soTUNSZW1vdmVNb3ZpZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTUNSZW1vdmVNb3ZpZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTUNSZW1vdmVNb3ZpZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTUNSZW1vdmVNb3ZpZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZUN0bE9ial9NQ0lzUGxheWVyRXZlbnQoTW92aWVDb250cm9sbGVyT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUV2ZW50UmVjb3JkIGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRXZlbnRSZWNvcmQgZTsKICNpZm5kZWYgTUNJc1BsYXllckV2ZW50Ci0JUHlNYWNfUFJFQ0hFQ0soTUNJc1BsYXllckV2ZW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhNQ0lzUGxheWVyRXZlbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRFdmVudFJlY29yZCwgJmUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNQ0lzUGxheWVyRXZlbnQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RXZlbnRSZWNvcmQsICZlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTUNJc1BsYXllckV2ZW50KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZUN0bE9ial9NQ0RvQWN0aW9uKE1vdmllQ29udHJvbGxlck9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlzaG9ydCBhY3Rpb247Ci0Jdm9pZCAqIHBhcmFtczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBzaG9ydCBhY3Rpb247CisgICAgdm9pZCAqIHBhcmFtczsKICNpZm5kZWYgTUNEb0FjdGlvbgotCVB5TWFjX1BSRUNIRUNLKE1DRG9BY3Rpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKE1DRG9BY3Rpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaHMiLAotCSAgICAgICAgICAgICAgICAgICAgICAmYWN0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAmcGFyYW1zKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTUNEb0FjdGlvbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgYWN0aW9uLAotCSAgICAgICAgICAgICAgICAgcGFyYW1zKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJocyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJhbXMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNQ0RvQWN0aW9uKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICBhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICBwYXJhbXMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllQ3RsT2JqX01DU2V0Q29udHJvbGxlckF0dGFjaGVkKE1vdmllQ29udHJvbGxlck9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlCb29sZWFuIGF0dGFjaDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBCb29sZWFuIGF0dGFjaDsKICNpZm5kZWYgTUNTZXRDb250cm9sbGVyQXR0YWNoZWQKLQlQeU1hY19QUkVDSEVDSyhNQ1NldENvbnRyb2xsZXJBdHRhY2hlZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTUNTZXRDb250cm9sbGVyQXR0YWNoZWQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZhdHRhY2gpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNQ1NldENvbnRyb2xsZXJBdHRhY2hlZChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhdHRhY2gpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNQ1NldENvbnRyb2xsZXJBdHRhY2hlZChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVDdGxPYmpfTUNJc0NvbnRyb2xsZXJBdHRhY2hlZChNb3ZpZUNvbnRyb2xsZXJPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CiAjaWZuZGVmIE1DSXNDb250cm9sbGVyQXR0YWNoZWQKLQlQeU1hY19QUkVDSEVDSyhNQ0lzQ29udHJvbGxlckF0dGFjaGVkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNQ0lzQ29udHJvbGxlckF0dGFjaGVkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNQ0lzQ29udHJvbGxlckF0dGFjaGVkKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNQ0lzQ29udHJvbGxlckF0dGFjaGVkKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllQ3RsT2JqX01DU2V0Q29udHJvbGxlclBvcnQoTW92aWVDb250cm9sbGVyT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUNHcmFmUHRyIGdwOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIENHcmFmUHRyIGdwOwogI2lmbmRlZiBNQ1NldENvbnRyb2xsZXJQb3J0Ci0JUHlNYWNfUFJFQ0hFQ0soTUNTZXRDb250cm9sbGVyUG9ydCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTUNTZXRDb250cm9sbGVyUG9ydCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfQ29udmVydCwgJmdwKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTUNTZXRDb250cm9sbGVyUG9ydChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgZ3ApOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhZk9ial9Db252ZXJ0LCAmZ3ApKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNQ1NldENvbnRyb2xsZXJQb3J0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVDdGxPYmpfTUNHZXRDb250cm9sbGVyUG9ydChNb3ZpZUNvbnRyb2xsZXJPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNHcmFmUHRyIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0dyYWZQdHIgX3J2OwogI2lmbmRlZiBNQ0dldENvbnRyb2xsZXJQb3J0Ci0JUHlNYWNfUFJFQ0hFQ0soTUNHZXRDb250cm9sbGVyUG9ydCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTUNHZXRDb250cm9sbGVyUG9ydCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTUNHZXRDb250cm9sbGVyUG9ydChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNQ0dldENvbnRyb2xsZXJQb3J0KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgR3JhZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVDdGxPYmpfTUNTZXRWaXNpYmxlKE1vdmllQ29udHJvbGxlck9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlCb29sZWFuIHZpc2libGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgQm9vbGVhbiB2aXNpYmxlOwogI2lmbmRlZiBNQ1NldFZpc2libGUKLQlQeU1hY19QUkVDSEVDSyhNQ1NldFZpc2libGUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1DU2V0VmlzaWJsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZpc2libGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNQ1NldFZpc2libGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgdmlzaWJsZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2aXNpYmxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTUNTZXRWaXNpYmxlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgIHZpc2libGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllQ3RsT2JqX01DR2V0VmlzaWJsZShNb3ZpZUNvbnRyb2xsZXJPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CiAjaWZuZGVmIE1DR2V0VmlzaWJsZQotCVB5TWFjX1BSRUNIRUNLKE1DR2V0VmlzaWJsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTUNHZXRWaXNpYmxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNQ0dldFZpc2libGUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1DR2V0VmlzaWJsZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZUN0bE9ial9NQ0dldENvbnRyb2xsZXJCb3VuZHNSZWN0KE1vdmllQ29udHJvbGxlck9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlSZWN0IGJvdW5kczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBSZWN0IGJvdW5kczsKICNpZm5kZWYgTUNHZXRDb250cm9sbGVyQm91bmRzUmVjdAotCVB5TWFjX1BSRUNIRUNLKE1DR2V0Q29udHJvbGxlckJvdW5kc1JlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKE1DR2V0Q29udHJvbGxlckJvdW5kc1JlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1DR2V0Q29udHJvbGxlckJvdW5kc1JlY3QoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZib3VuZHMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNQ0dldENvbnRyb2xsZXJCb3VuZHNSZWN0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmYm91bmRzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZUN0bE9ial9NQ1NldENvbnRyb2xsZXJCb3VuZHNSZWN0KE1vdmllQ29udHJvbGxlck9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlSZWN0IGJvdW5kczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBSZWN0IGJvdW5kczsKICNpZm5kZWYgTUNTZXRDb250cm9sbGVyQm91bmRzUmVjdAotCVB5TWFjX1BSRUNIRUNLKE1DU2V0Q29udHJvbGxlckJvdW5kc1JlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKE1DU2V0Q29udHJvbGxlckJvdW5kc1JlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTUNTZXRDb250cm9sbGVyQm91bmRzUmVjdChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kcyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTUNTZXRDb250cm9sbGVyQm91bmRzUmVjdChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kcyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVDdGxPYmpfTUNHZXRDb250cm9sbGVyQm91bmRzUmduKE1vdmllQ29udHJvbGxlck9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIF9ydjsKICNpZm5kZWYgTUNHZXRDb250cm9sbGVyQm91bmRzUmduCi0JUHlNYWNfUFJFQ0hFQ0soTUNHZXRDb250cm9sbGVyQm91bmRzUmduKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNQ0dldENvbnRyb2xsZXJCb3VuZHNSZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1DR2V0Q29udHJvbGxlckJvdW5kc1Jnbihfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1DR2V0Q29udHJvbGxlckJvdW5kc1Jnbihfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVDdGxPYmpfTUNHZXRXaW5kb3dSZ24oTW92aWVDb250cm9sbGVyT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZ25IYW5kbGUgX3J2OwotCVdpbmRvd1B0ciB3OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZ25IYW5kbGUgX3J2OworICAgIFdpbmRvd1B0ciB3OwogI2lmbmRlZiBNQ0dldFdpbmRvd1JnbgotCVB5TWFjX1BSRUNIRUNLKE1DR2V0V2luZG93UmduKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNQ0dldFdpbmRvd1Jnbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmdykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1DR2V0V2luZG93UmduKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgdyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTUNHZXRXaW5kb3dSZ24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB3KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVDdGxPYmpfTUNNb3ZpZUNoYW5nZWQoTW92aWVDb250cm9sbGVyT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1vdmllIG07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTW92aWUgbTsKICNpZm5kZWYgTUNNb3ZpZUNoYW5nZWQKLQlQeU1hY19QUkVDSEVDSyhNQ01vdmllQ2hhbmdlZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTUNNb3ZpZUNoYW5nZWQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9Db252ZXJ0LCAmbSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1DTW92aWVDaGFuZ2VkKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgbSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9Db252ZXJ0LCAmbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1DTW92aWVDaGFuZ2VkKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgbSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVDdGxPYmpfTUNTZXREdXJhdGlvbihNb3ZpZUNvbnRyb2xsZXJPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVGltZVZhbHVlIGR1cmF0aW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFRpbWVWYWx1ZSBkdXJhdGlvbjsKICNpZm5kZWYgTUNTZXREdXJhdGlvbgotCVB5TWFjX1BSRUNIRUNLKE1DU2V0RHVyYXRpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKE1DU2V0RHVyYXRpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1DU2V0RHVyYXRpb24oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmR1cmF0aW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTUNTZXREdXJhdGlvbihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllQ3RsT2JqX01DR2V0Q3VycmVudFRpbWUoTW92aWVDb250cm9sbGVyT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlUaW1lVmFsdWUgX3J2OwotCVRpbWVTY2FsZSBzY2FsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVGltZVZhbHVlIF9ydjsKKyAgICBUaW1lU2NhbGUgc2NhbGU7CiAjaWZuZGVmIE1DR2V0Q3VycmVudFRpbWUKLQlQeU1hY19QUkVDSEVDSyhNQ0dldEN1cnJlbnRUaW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNQ0dldEN1cnJlbnRUaW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNQ0dldEN1cnJlbnRUaW1lKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAmc2NhbGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHNjYWxlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTUNHZXRDdXJyZW50VGltZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNjYWxlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVDdGxPYmpfTUNOZXdBdHRhY2hlZENvbnRyb2xsZXIoTW92aWVDb250cm9sbGVyT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1vdmllIHRoZU1vdmllOwotCVdpbmRvd1B0ciB3OwotCVBvaW50IHdoZXJlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1vdmllIHRoZU1vdmllOworICAgIFdpbmRvd1B0ciB3OworICAgIFBvaW50IHdoZXJlOwogI2lmbmRlZiBNQ05ld0F0dGFjaGVkQ29udHJvbGxlcgotCVB5TWFjX1BSRUNIRUNLKE1DTmV3QXR0YWNoZWRDb250cm9sbGVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNQ05ld0F0dGFjaGVkQ29udHJvbGxlcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9Db252ZXJ0LCAmdGhlTW92aWUsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmdywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZ3aGVyZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1DTmV3QXR0YWNoZWRDb250cm9sbGVyKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlTW92aWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfQ29udmVydCwgJnRoZU1vdmllLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJncsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmd2hlcmUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNQ05ld0F0dGFjaGVkQ29udHJvbGxlcihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZU1vdmllLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllQ3RsT2JqX01DRHJhdyhNb3ZpZUNvbnRyb2xsZXJPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JV2luZG93UHRyIHc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgV2luZG93UHRyIHc7CiAjaWZuZGVmIE1DRHJhdwotCVB5TWFjX1BSRUNIRUNLKE1DRHJhdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTUNEcmF3KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTUNEcmF3KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgIHcpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTUNEcmF3KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgIHcpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllQ3RsT2JqX01DQWN0aXZhdGUoTW92aWVDb250cm9sbGVyT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVdpbmRvd1B0ciB3OwotCUJvb2xlYW4gYWN0aXZhdGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgV2luZG93UHRyIHc7CisgICAgQm9vbGVhbiBhY3RpdmF0ZTsKICNpZm5kZWYgTUNBY3RpdmF0ZQotCVB5TWFjX1BSRUNIRUNLKE1DQWN0aXZhdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1DQWN0aXZhdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3LAotCSAgICAgICAgICAgICAgICAgICAgICAmYWN0aXZhdGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNQ0FjdGl2YXRlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICB3LAotCSAgICAgICAgICAgICAgICAgYWN0aXZhdGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFjdGl2YXRlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTUNBY3RpdmF0ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgdywKKyAgICAgICAgICAgICAgICAgICAgIGFjdGl2YXRlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZUN0bE9ial9NQ0lkbGUoTW92aWVDb250cm9sbGVyT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OwogI2lmbmRlZiBNQ0lkbGUKLQlQeU1hY19QUkVDSEVDSyhNQ0lkbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1DSWRsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTUNJZGxlKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNQ0lkbGUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVDdGxPYmpfTUNLZXkoTW92aWVDb250cm9sbGVyT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNJbnQ4IGtleTsKLQlsb25nIG1vZGlmaWVyczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTSW50OCBrZXk7CisgICAgbG9uZyBtb2RpZmllcnM7CiAjaWZuZGVmIE1DS2V5Ci0JUHlNYWNfUFJFQ0hFQ0soTUNLZXkpOworICAgIFB5TWFjX1BSRUNIRUNLKE1DS2V5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmtleSwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vZGlmaWVycykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1DS2V5KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAga2V5LAotCSAgICAgICAgICAgIG1vZGlmaWVycyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAma2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbW9kaWZpZXJzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTUNLZXkoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICBrZXksCisgICAgICAgICAgICAgICAgbW9kaWZpZXJzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZUN0bE9ial9NQ0NsaWNrKE1vdmllQ29udHJvbGxlck9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlXaW5kb3dQdHIgdzsKLQlQb2ludCB3aGVyZTsKLQlsb25nIHdoZW47Ci0JbG9uZyBtb2RpZmllcnM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgV2luZG93UHRyIHc7CisgICAgUG9pbnQgd2hlcmU7CisgICAgbG9uZyB3aGVuOworICAgIGxvbmcgbW9kaWZpZXJzOwogI2lmbmRlZiBNQ0NsaWNrCi0JUHlNYWNfUFJFQ0hFQ0soTUNDbGljayk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTUNDbGljayk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJncsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmd2hlcmUsCi0JICAgICAgICAgICAgICAgICAgICAgICZ3aGVuLAotCSAgICAgICAgICAgICAgICAgICAgICAmbW9kaWZpZXJzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTUNDbGljayhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgdywKLQkgICAgICAgICAgICAgIHdoZXJlLAotCSAgICAgICAgICAgICAgd2hlbiwKLQkgICAgICAgICAgICAgIG1vZGlmaWVycyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJndoZXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmd2hlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGlmaWVycykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1DQ2xpY2soX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgIHcsCisgICAgICAgICAgICAgICAgICB3aGVyZSwKKyAgICAgICAgICAgICAgICAgIHdoZW4sCisgICAgICAgICAgICAgICAgICBtb2RpZmllcnMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllQ3RsT2JqX01DRW5hYmxlRWRpdGluZyhNb3ZpZUNvbnRyb2xsZXJPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JQm9vbGVhbiBlbmFibGVkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEJvb2xlYW4gZW5hYmxlZDsKICNpZm5kZWYgTUNFbmFibGVFZGl0aW5nCi0JUHlNYWNfUFJFQ0hFQ0soTUNFbmFibGVFZGl0aW5nKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNQ0VuYWJsZUVkaXRpbmcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZlbmFibGVkKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTUNFbmFibGVFZGl0aW5nKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZWQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5hYmxlZCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1DRW5hYmxlRWRpdGluZyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVkKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZUN0bE9ial9NQ0lzRWRpdGluZ0VuYWJsZWQoTW92aWVDb250cm9sbGVyT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgbG9uZyBfcnY7CiAjaWZuZGVmIE1DSXNFZGl0aW5nRW5hYmxlZAotCVB5TWFjX1BSRUNIRUNLKE1DSXNFZGl0aW5nRW5hYmxlZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTUNJc0VkaXRpbmdFbmFibGVkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNQ0lzRWRpdGluZ0VuYWJsZWQoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1DSXNFZGl0aW5nRW5hYmxlZChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZUN0bE9ial9NQ0NvcHkoTW92aWVDb250cm9sbGVyT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlNb3ZpZSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE1vdmllIF9ydjsKICNpZm5kZWYgTUNDb3B5Ci0JUHlNYWNfUFJFQ0hFQ0soTUNDb3B5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhNQ0NvcHkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1DQ29weShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTUNDb3B5KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllQ3RsT2JqX01DQ3V0KE1vdmllQ29udHJvbGxlck9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JTW92aWUgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBNb3ZpZSBfcnY7CiAjaWZuZGVmIE1DQ3V0Ci0JUHlNYWNfUFJFQ0hFQ0soTUNDdXQpOworICAgIFB5TWFjX1BSRUNIRUNLKE1DQ3V0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNQ0N1dChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTUNDdXQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVDdGxPYmpfTUNQYXN0ZShNb3ZpZUNvbnRyb2xsZXJPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTW92aWUgc3JjTW92aWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTW92aWUgc3JjTW92aWU7CiAjaWZuZGVmIE1DUGFzdGUKLQlQeU1hY19QUkVDSEVDSyhNQ1Bhc3RlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNQ1Bhc3RlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfQ29udmVydCwgJnNyY01vdmllKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTUNQYXN0ZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgc3JjTW92aWUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfQ29udmVydCwgJnNyY01vdmllKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTUNQYXN0ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgc3JjTW92aWUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllQ3RsT2JqX01DQ2xlYXIoTW92aWVDb250cm9sbGVyT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OwogI2lmbmRlZiBNQ0NsZWFyCi0JUHlNYWNfUFJFQ0hFQ0soTUNDbGVhcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTUNDbGVhcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTUNDbGVhcihfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTUNDbGVhcihfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZUN0bE9ial9NQ1VuZG8oTW92aWVDb250cm9sbGVyT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OwogI2lmbmRlZiBNQ1VuZG8KLQlQeU1hY19QUkVDSEVDSyhNQ1VuZG8pOworICAgIFB5TWFjX1BSRUNIRUNLKE1DVW5kbyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTUNVbmRvKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNQ1VuZG8oX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVDdGxPYmpfTUNQb3NpdGlvbkNvbnRyb2xsZXIoTW92aWVDb250cm9sbGVyT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVJlY3QgbW92aWVSZWN0OwotCVJlY3QgY29udHJvbGxlclJlY3Q7Ci0JbG9uZyBzb21lRmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgUmVjdCBtb3ZpZVJlY3Q7CisgICAgUmVjdCBjb250cm9sbGVyUmVjdDsKKyAgICBsb25nIHNvbWVGbGFnczsKICNpZm5kZWYgTUNQb3NpdGlvbkNvbnRyb2xsZXIKLQlQeU1hY19QUkVDSEVDSyhNQ1Bvc2l0aW9uQ29udHJvbGxlcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTUNQb3NpdGlvbkNvbnRyb2xsZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmbW92aWVSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmY29udHJvbGxlclJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICZzb21lRmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNQ1Bvc2l0aW9uQ29udHJvbGxlcihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZtb3ZpZVJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbnRyb2xsZXJSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvbWVGbGFncyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmbW92aWVSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmY29udHJvbGxlclJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzb21lRmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNQ1Bvc2l0aW9uQ29udHJvbGxlcihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtb3ZpZVJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbnRyb2xsZXJSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvbWVGbGFncyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVDdGxPYmpfTUNHZXRDb250cm9sbGVySW5mbyhNb3ZpZUNvbnRyb2xsZXJPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JbG9uZyBzb21lRmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgbG9uZyBzb21lRmxhZ3M7CiAjaWZuZGVmIE1DR2V0Q29udHJvbGxlckluZm8KLQlQeU1hY19QUkVDSEVDSyhNQ0dldENvbnRyb2xsZXJJbmZvKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNQ0dldENvbnRyb2xsZXJJbmZvKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNQ0dldENvbnRyb2xsZXJJbmZvKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmc29tZUZsYWdzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBzb21lRmxhZ3MpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNQ0dldENvbnRyb2xsZXJJbmZvKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc29tZUZsYWdzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzb21lRmxhZ3MpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllQ3RsT2JqX01DU2V0Q2xpcChNb3ZpZUNvbnRyb2xsZXJPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JUmduSGFuZGxlIHRoZUNsaXA7Ci0JUmduSGFuZGxlIG1vdmllQ2xpcDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBSZ25IYW5kbGUgdGhlQ2xpcDsKKyAgICBSZ25IYW5kbGUgbW92aWVDbGlwOwogI2lmbmRlZiBNQ1NldENsaXAKLQlQeU1hY19QUkVDSEVDSyhNQ1NldENsaXApOworICAgIFB5TWFjX1BSRUNIRUNLKE1DU2V0Q2xpcCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVDbGlwLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJm1vdmllQ2xpcCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1DU2V0Q2xpcChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICB0aGVDbGlwLAotCSAgICAgICAgICAgICAgICBtb3ZpZUNsaXApOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUNsaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmbW92aWVDbGlwKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTUNTZXRDbGlwKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgIHRoZUNsaXAsCisgICAgICAgICAgICAgICAgICAgIG1vdmllQ2xpcCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVDdGxPYmpfTUNHZXRDbGlwKE1vdmllQ29udHJvbGxlck9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlSZ25IYW5kbGUgdGhlQ2xpcDsKLQlSZ25IYW5kbGUgbW92aWVDbGlwOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFJnbkhhbmRsZSB0aGVDbGlwOworICAgIFJnbkhhbmRsZSBtb3ZpZUNsaXA7CiAjaWZuZGVmIE1DR2V0Q2xpcAotCVB5TWFjX1BSRUNIRUNLKE1DR2V0Q2xpcCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTUNHZXRDbGlwKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNQ0dldENsaXAoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgJnRoZUNsaXAsCi0JICAgICAgICAgICAgICAgICZtb3ZpZUNsaXApOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHRoZUNsaXAsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgbW92aWVDbGlwKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTUNHZXRDbGlwKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICZ0aGVDbGlwLAorICAgICAgICAgICAgICAgICAgICAmbW92aWVDbGlwKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCB0aGVDbGlwLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIG1vdmllQ2xpcCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVDdGxPYmpfTUNEcmF3QmFkZ2UoTW92aWVDb250cm9sbGVyT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVJnbkhhbmRsZSBtb3ZpZVJnbjsKLQlSZ25IYW5kbGUgYmFkZ2VSZ247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgUmduSGFuZGxlIG1vdmllUmduOworICAgIFJnbkhhbmRsZSBiYWRnZVJnbjsKICNpZm5kZWYgTUNEcmF3QmFkZ2UKLQlQeU1hY19QUkVDSEVDSyhNQ0RyYXdCYWRnZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTUNEcmF3QmFkZ2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJm1vdmllUmduKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTUNEcmF3QmFkZ2UoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICBtb3ZpZVJnbiwKLQkgICAgICAgICAgICAgICAgICAmYmFkZ2VSZ24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBiYWRnZVJnbik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJm1vdmllUmduKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTUNEcmF3QmFkZ2UoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICBtb3ZpZVJnbiwKKyAgICAgICAgICAgICAgICAgICAgICAmYmFkZ2VSZ24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBiYWRnZVJnbik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVDdGxPYmpfTUNTZXRVcEVkaXRNZW51KE1vdmllQ29udHJvbGxlck9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlsb25nIG1vZGlmaWVyczsKLQlNZW51SGFuZGxlIG1oOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIGxvbmcgbW9kaWZpZXJzOworICAgIE1lbnVIYW5kbGUgbWg7CiAjaWZuZGVmIE1DU2V0VXBFZGl0TWVudQotCVB5TWFjX1BSRUNIRUNLKE1DU2V0VXBFZGl0TWVudSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTUNTZXRVcEVkaXRNZW51KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZtb2RpZmllcnMsCi0JICAgICAgICAgICAgICAgICAgICAgIE1lbnVPYmpfQ29udmVydCwgJm1oKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTUNTZXRVcEVkaXRNZW51KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVycywKLQkgICAgICAgICAgICAgICAgICAgICAgbWgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtb2RpZmllcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1lbnVPYmpfQ29udmVydCwgJm1oKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTUNTZXRVcEVkaXRNZW51KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllQ3RsT2JqX01DR2V0TWVudVN0cmluZyhNb3ZpZUNvbnRyb2xsZXJPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JbG9uZyBtb2RpZmllcnM7Ci0Jc2hvcnQgaXRlbTsKLQlTdHIyNTUgYVN0cmluZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBsb25nIG1vZGlmaWVyczsKKyAgICBzaG9ydCBpdGVtOworICAgIFN0cjI1NSBhU3RyaW5nOwogI2lmbmRlZiBNQ0dldE1lbnVTdHJpbmcKLQlQeU1hY19QUkVDSEVDSyhNQ0dldE1lbnVTdHJpbmcpOworICAgIFB5TWFjX1BSRUNIRUNLKE1DR2V0TWVudVN0cmluZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsaE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vZGlmaWVycywKLQkgICAgICAgICAgICAgICAgICAgICAgJml0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgYVN0cmluZykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1DR2V0TWVudVN0cmluZyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICBtb2RpZmllcnMsCi0JICAgICAgICAgICAgICAgICAgICAgIGl0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgIGFTdHJpbmcpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxoTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbW9kaWZpZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBhU3RyaW5nKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTUNHZXRNZW51U3RyaW5nKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYVN0cmluZyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVDdGxPYmpfTUNQdEluQ29udHJvbGxlcihNb3ZpZUNvbnRyb2xsZXJPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JUG9pbnQgdGhlUHQ7Ci0JQm9vbGVhbiBpbkNvbnRyb2xsZXI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgUG9pbnQgdGhlUHQ7CisgICAgQm9vbGVhbiBpbkNvbnRyb2xsZXI7CiAjaWZuZGVmIE1DUHRJbkNvbnRyb2xsZXIKLQlQeU1hY19QUkVDSEVDSyhNQ1B0SW5Db250cm9sbGVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNQ1B0SW5Db250cm9sbGVyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZ0aGVQdCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1DUHRJbkNvbnRyb2xsZXIoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgIHRoZVB0LAotCSAgICAgICAgICAgICAgICAgICAgICAgJmluQ29udHJvbGxlcik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgaW5Db250cm9sbGVyKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmdGhlUHQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNQ1B0SW5Db250cm9sbGVyKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVQdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkNvbnRyb2xsZXIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGluQ29udHJvbGxlcik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVDdGxPYmpfTUNJbnZhbGlkYXRlKE1vdmllQ29udHJvbGxlck9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlXaW5kb3dQdHIgdzsKLQlSZ25IYW5kbGUgaW52YWxpZFJnbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBXaW5kb3dQdHIgdzsKKyAgICBSZ25IYW5kbGUgaW52YWxpZFJnbjsKICNpZm5kZWYgTUNJbnZhbGlkYXRlCi0JUHlNYWNfUFJFQ0hFQ0soTUNJbnZhbGlkYXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNQ0ludmFsaWRhdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmdywKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZpbnZhbGlkUmduKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTUNJbnZhbGlkYXRlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgIHcsCi0JICAgICAgICAgICAgICAgICAgIGludmFsaWRSZ24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJncsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaW52YWxpZFJnbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1DSW52YWxpZGF0ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICB3LAorICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkUmduKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZUN0bE9ial9NQ0FkanVzdEN1cnNvcihNb3ZpZUNvbnRyb2xsZXJPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JV2luZG93UHRyIHc7Ci0JUG9pbnQgd2hlcmU7Ci0JbG9uZyBtb2RpZmllcnM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgV2luZG93UHRyIHc7CisgICAgUG9pbnQgd2hlcmU7CisgICAgbG9uZyBtb2RpZmllcnM7CiAjaWZuZGVmIE1DQWRqdXN0Q3Vyc29yCi0JUHlNYWNfUFJFQ0hFQ0soTUNBZGp1c3RDdXJzb3IpOworICAgIFB5TWFjX1BSRUNIRUNLKE1DQWRqdXN0Q3Vyc29yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJndoZXJlLAotCSAgICAgICAgICAgICAgICAgICAgICAmbW9kaWZpZXJzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTUNBZGp1c3RDdXJzb3IoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICB3LAotCSAgICAgICAgICAgICAgICAgICAgIHdoZXJlLAotCSAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVycyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJncsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmd2hlcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtb2RpZmllcnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNQ0FkanVzdEN1cnNvcihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgIHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZXJzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZUN0bE9ial9NQ0dldEludGVyZmFjZUVsZW1lbnQoTW92aWVDb250cm9sbGVyT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1DSW50ZXJmYWNlRWxlbWVudCB3aGljaEVsZW1lbnQ7Ci0Jdm9pZCAqIGVsZW1lbnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTUNJbnRlcmZhY2VFbGVtZW50IHdoaWNoRWxlbWVudDsKKyAgICB2b2lkICogZWxlbWVudDsKICNpZm5kZWYgTUNHZXRJbnRlcmZhY2VFbGVtZW50Ci0JUHlNYWNfUFJFQ0hFQ0soTUNHZXRJbnRlcmZhY2VFbGVtZW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhNQ0dldEludGVyZmFjZUVsZW1lbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibHMiLAotCSAgICAgICAgICAgICAgICAgICAgICAmd2hpY2hFbGVtZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAmZWxlbWVudCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1DR2V0SW50ZXJmYWNlRWxlbWVudChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaEVsZW1lbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJndoaWNoRWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmVsZW1lbnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNQ0dldEludGVyZmFjZUVsZW1lbnQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2hFbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZUN0bE9ial9NQ0FkZE1vdmllU2VnbWVudChNb3ZpZUNvbnRyb2xsZXJPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTW92aWUgc3JjTW92aWU7Ci0JQm9vbGVhbiBzY2FsZWQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTW92aWUgc3JjTW92aWU7CisgICAgQm9vbGVhbiBzY2FsZWQ7CiAjaWZuZGVmIE1DQWRkTW92aWVTZWdtZW50Ci0JUHlNYWNfUFJFQ0hFQ0soTUNBZGRNb3ZpZVNlZ21lbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKE1DQWRkTW92aWVTZWdtZW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX0NvbnZlcnQsICZzcmNNb3ZpZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNjYWxlZCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1DQWRkTW92aWVTZWdtZW50KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgc3JjTW92aWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVkKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9Db252ZXJ0LCAmc3JjTW92aWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzY2FsZWQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNQ0FkZE1vdmllU2VnbWVudChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY01vdmllLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlZCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVDdGxPYmpfTUNUcmltTW92aWVTZWdtZW50KE1vdmllQ29udHJvbGxlck9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKICNpZm5kZWYgTUNUcmltTW92aWVTZWdtZW50Ci0JUHlNYWNfUFJFQ0hFQ0soTUNUcmltTW92aWVTZWdtZW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhNQ1RyaW1Nb3ZpZVNlZ21lbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1DVHJpbU1vdmllU2VnbWVudChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTUNUcmltTW92aWVTZWdtZW50KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllQ3RsT2JqX01DU2V0SWRsZU1hbmFnZXIoTW92aWVDb250cm9sbGVyT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUlkbGVNYW5hZ2VyIGltOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIElkbGVNYW5hZ2VyIGltOwogI2lmbmRlZiBNQ1NldElkbGVNYW5hZ2VyCi0JUHlNYWNfUFJFQ0hFQ0soTUNTZXRJZGxlTWFuYWdlcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTUNTZXRJZGxlTWFuYWdlcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIElkbGVNYW5hZ2VyT2JqX0NvbnZlcnQsICZpbSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1DU2V0SWRsZU1hbmFnZXIoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgIGltKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIElkbGVNYW5hZ2VyT2JqX0NvbnZlcnQsICZpbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1DU2V0SWRsZU1hbmFnZXIoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGltKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZUN0bE9ial9NQ1NldENvbnRyb2xsZXJDYXBhYmlsaXRpZXMoTW92aWVDb250cm9sbGVyT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCWxvbmcgZmxhZ3M7Ci0JbG9uZyBmbGFnc01hc2s7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgbG9uZyBmbGFnczsKKyAgICBsb25nIGZsYWdzTWFzazsKICNpZm5kZWYgTUNTZXRDb250cm9sbGVyQ2FwYWJpbGl0aWVzCi0JUHlNYWNfUFJFQ0hFQ0soTUNTZXRDb250cm9sbGVyQ2FwYWJpbGl0aWVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNQ1NldENvbnRyb2xsZXJDYXBhYmlsaXRpZXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFnc01hc2spKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNQ1NldENvbnRyb2xsZXJDYXBhYmlsaXRpZXMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzTWFzayk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFnc01hc2spKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNQ1NldENvbnRyb2xsZXJDYXBhYmlsaXRpZXMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzTWFzayk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBNb3ZpZUN0bE9ial9tZXRob2RzW10gPSB7Ci0JeyJNQ1NldE1vdmllIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DU2V0TW92aWUsIDEsCi0JIFB5RG9jX1NUUigiKE1vdmllIHRoZU1vdmllLCBXaW5kb3dQdHIgbW92aWVXaW5kb3csIFBvaW50IHdoZXJlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNQ0dldEluZE1vdmllIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DR2V0SW5kTW92aWUsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGluZGV4KSAtPiAoTW92aWUgX3J2KSIpfSwKLQl7Ik1DUmVtb3ZlQWxsTW92aWVzIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DUmVtb3ZlQWxsTW92aWVzLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1DUmVtb3ZlQU1vdmllIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DUmVtb3ZlQU1vdmllLCAxLAotCSBQeURvY19TVFIoIihNb3ZpZSBtKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNQ1JlbW92ZU1vdmllIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DUmVtb3ZlTW92aWUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTUNJc1BsYXllckV2ZW50IiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DSXNQbGF5ZXJFdmVudCwgMSwKLQkgUHlEb2NfU1RSKCIoRXZlbnRSZWNvcmQgZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTUNEb0FjdGlvbiIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ0RvQWN0aW9uLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBhY3Rpb24sIHZvaWQgKiBwYXJhbXMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1DU2V0Q29udHJvbGxlckF0dGFjaGVkIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DU2V0Q29udHJvbGxlckF0dGFjaGVkLCAxLAotCSBQeURvY19TVFIoIihCb29sZWFuIGF0dGFjaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTUNJc0NvbnRyb2xsZXJBdHRhY2hlZCIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ0lzQ29udHJvbGxlckF0dGFjaGVkLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1DU2V0Q29udHJvbGxlclBvcnQiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNTZXRDb250cm9sbGVyUG9ydCwgMSwKLQkgUHlEb2NfU1RSKCIoQ0dyYWZQdHIgZ3ApIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1DR2V0Q29udHJvbGxlclBvcnQiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNHZXRDb250cm9sbGVyUG9ydCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ0dyYWZQdHIgX3J2KSIpfSwKLQl7Ik1DU2V0VmlzaWJsZSIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ1NldFZpc2libGUsIDEsCi0JIFB5RG9jX1NUUigiKEJvb2xlYW4gdmlzaWJsZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTUNHZXRWaXNpYmxlIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DR2V0VmlzaWJsZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNQ0dldENvbnRyb2xsZXJCb3VuZHNSZWN0IiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DR2V0Q29udHJvbGxlckJvdW5kc1JlY3QsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJlY3QgYm91bmRzKSIpfSwKLQl7Ik1DU2V0Q29udHJvbGxlckJvdW5kc1JlY3QiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNTZXRDb250cm9sbGVyQm91bmRzUmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCBib3VuZHMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1DR2V0Q29udHJvbGxlckJvdW5kc1JnbiIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ0dldENvbnRyb2xsZXJCb3VuZHNSZ24sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFJnbkhhbmRsZSBfcnYpIil9LAotCXsiTUNHZXRXaW5kb3dSZ24iLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNHZXRXaW5kb3dSZ24sIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3KSAtPiAoUmduSGFuZGxlIF9ydikiKX0sCi0JeyJNQ01vdmllQ2hhbmdlZCIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ01vdmllQ2hhbmdlZCwgMSwKLQkgUHlEb2NfU1RSKCIoTW92aWUgbSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTUNTZXREdXJhdGlvbiIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ1NldER1cmF0aW9uLCAxLAotCSBQeURvY19TVFIoIihUaW1lVmFsdWUgZHVyYXRpb24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1DR2V0Q3VycmVudFRpbWUiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNHZXRDdXJyZW50VGltZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVGltZVZhbHVlIF9ydiwgVGltZVNjYWxlIHNjYWxlKSIpfSwKLQl7Ik1DTmV3QXR0YWNoZWRDb250cm9sbGVyIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DTmV3QXR0YWNoZWRDb250cm9sbGVyLCAxLAotCSBQeURvY19TVFIoIihNb3ZpZSB0aGVNb3ZpZSwgV2luZG93UHRyIHcsIFBvaW50IHdoZXJlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNQ0RyYXciLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNEcmF3LCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQdHIgdykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTUNBY3RpdmF0ZSIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ0FjdGl2YXRlLCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQdHIgdywgQm9vbGVhbiBhY3RpdmF0ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTUNJZGxlIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DSWRsZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNQ0tleSIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ0tleSwgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDgga2V5LCBsb25nIG1vZGlmaWVycykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTUNDbGljayIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ0NsaWNrLCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQdHIgdywgUG9pbnQgd2hlcmUsIGxvbmcgd2hlbiwgbG9uZyBtb2RpZmllcnMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1DRW5hYmxlRWRpdGluZyIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ0VuYWJsZUVkaXRpbmcsIDEsCi0JIFB5RG9jX1NUUigiKEJvb2xlYW4gZW5hYmxlZCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTUNJc0VkaXRpbmdFbmFibGVkIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DSXNFZGl0aW5nRW5hYmxlZCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAobG9uZyBfcnYpIil9LAotCXsiTUNDb3B5IiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DQ29weSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoTW92aWUgX3J2KSIpfSwKLQl7Ik1DQ3V0IiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DQ3V0LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChNb3ZpZSBfcnYpIil9LAotCXsiTUNQYXN0ZSIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ1Bhc3RlLCAxLAotCSBQeURvY19TVFIoIihNb3ZpZSBzcmNNb3ZpZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTUNDbGVhciIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ0NsZWFyLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1DVW5kbyIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ1VuZG8sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTUNQb3NpdGlvbkNvbnRyb2xsZXIiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNQb3NpdGlvbkNvbnRyb2xsZXIsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgbW92aWVSZWN0LCBSZWN0IGNvbnRyb2xsZXJSZWN0LCBsb25nIHNvbWVGbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTUNHZXRDb250cm9sbGVySW5mbyIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ0dldENvbnRyb2xsZXJJbmZvLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIHNvbWVGbGFncykiKX0sCi0JeyJNQ1NldENsaXAiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNTZXRDbGlwLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgdGhlQ2xpcCwgUmduSGFuZGxlIG1vdmllQ2xpcCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTUNHZXRDbGlwIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DR2V0Q2xpcCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmduSGFuZGxlIHRoZUNsaXAsIFJnbkhhbmRsZSBtb3ZpZUNsaXApIil9LAotCXsiTUNEcmF3QmFkZ2UiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNEcmF3QmFkZ2UsIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSBtb3ZpZVJnbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJnbkhhbmRsZSBiYWRnZVJnbikiKX0sCi0JeyJNQ1NldFVwRWRpdE1lbnUiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNTZXRVcEVkaXRNZW51LCAxLAotCSBQeURvY19TVFIoIihsb25nIG1vZGlmaWVycywgTWVudUhhbmRsZSBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTUNHZXRNZW51U3RyaW5nIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DR2V0TWVudVN0cmluZywgMSwKLQkgUHlEb2NfU1RSKCIobG9uZyBtb2RpZmllcnMsIHNob3J0IGl0ZW0sIFN0cjI1NSBhU3RyaW5nKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNQ1B0SW5Db250cm9sbGVyIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DUHRJbkNvbnRyb2xsZXIsIDEsCi0JIFB5RG9jX1NUUigiKFBvaW50IHRoZVB0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQm9vbGVhbiBpbkNvbnRyb2xsZXIpIil9LAotCXsiTUNJbnZhbGlkYXRlIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DSW52YWxpZGF0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIHcsIFJnbkhhbmRsZSBpbnZhbGlkUmduKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNQ0FkanVzdEN1cnNvciIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ0FkanVzdEN1cnNvciwgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIHcsIFBvaW50IHdoZXJlLCBsb25nIG1vZGlmaWVycykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTUNHZXRJbnRlcmZhY2VFbGVtZW50IiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DR2V0SW50ZXJmYWNlRWxlbWVudCwgMSwKLQkgUHlEb2NfU1RSKCIoTUNJbnRlcmZhY2VFbGVtZW50IHdoaWNoRWxlbWVudCwgdm9pZCAqIGVsZW1lbnQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1DQWRkTW92aWVTZWdtZW50IiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DQWRkTW92aWVTZWdtZW50LCAxLAotCSBQeURvY19TVFIoIihNb3ZpZSBzcmNNb3ZpZSwgQm9vbGVhbiBzY2FsZWQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1DVHJpbU1vdmllU2VnbWVudCIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ1RyaW1Nb3ZpZVNlZ21lbnQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTUNTZXRJZGxlTWFuYWdlciIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ1NldElkbGVNYW5hZ2VyLCAxLAotCSBQeURvY19TVFIoIihJZGxlTWFuYWdlciBpbSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTUNTZXRDb250cm9sbGVyQ2FwYWJpbGl0aWVzIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DU2V0Q29udHJvbGxlckNhcGFiaWxpdGllcywgMSwKLQkgUHlEb2NfU1RSKCIobG9uZyBmbGFncywgbG9uZyBmbGFnc01hc2spIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7Ik1DU2V0TW92aWUiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNTZXRNb3ZpZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTW92aWUgdGhlTW92aWUsIFdpbmRvd1B0ciBtb3ZpZVdpbmRvdywgUG9pbnQgd2hlcmUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1DR2V0SW5kTW92aWUiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNHZXRJbmRNb3ZpZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgaW5kZXgpIC0+IChNb3ZpZSBfcnYpIil9LAorICAgIHsiTUNSZW1vdmVBbGxNb3ZpZXMiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNSZW1vdmVBbGxNb3ZpZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTUNSZW1vdmVBTW92aWUiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNSZW1vdmVBTW92aWUsIDEsCisgICAgIFB5RG9jX1NUUigiKE1vdmllIG0pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1DUmVtb3ZlTW92aWUiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNSZW1vdmVNb3ZpZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNQ0lzUGxheWVyRXZlbnQiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNJc1BsYXllckV2ZW50LCAxLAorICAgICBQeURvY19TVFIoIihFdmVudFJlY29yZCBlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNQ0RvQWN0aW9uIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DRG9BY3Rpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGFjdGlvbiwgdm9pZCAqIHBhcmFtcykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTUNTZXRDb250cm9sbGVyQXR0YWNoZWQiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNTZXRDb250cm9sbGVyQXR0YWNoZWQsIDEsCisgICAgIFB5RG9jX1NUUigiKEJvb2xlYW4gYXR0YWNoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNQ0lzQ29udHJvbGxlckF0dGFjaGVkIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DSXNDb250cm9sbGVyQXR0YWNoZWQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTUNTZXRDb250cm9sbGVyUG9ydCIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ1NldENvbnRyb2xsZXJQb3J0LCAxLAorICAgICBQeURvY19TVFIoIihDR3JhZlB0ciBncCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTUNHZXRDb250cm9sbGVyUG9ydCIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ0dldENvbnRyb2xsZXJQb3J0LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDR3JhZlB0ciBfcnYpIil9LAorICAgIHsiTUNTZXRWaXNpYmxlIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DU2V0VmlzaWJsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQm9vbGVhbiB2aXNpYmxlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNQ0dldFZpc2libGUiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNHZXRWaXNpYmxlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1DR2V0Q29udHJvbGxlckJvdW5kc1JlY3QiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNHZXRDb250cm9sbGVyQm91bmRzUmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmVjdCBib3VuZHMpIil9LAorICAgIHsiTUNTZXRDb250cm9sbGVyQm91bmRzUmVjdCIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ1NldENvbnRyb2xsZXJCb3VuZHNSZWN0LCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IGJvdW5kcykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTUNHZXRDb250cm9sbGVyQm91bmRzUmduIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DR2V0Q29udHJvbGxlckJvdW5kc1JnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoUmduSGFuZGxlIF9ydikiKX0sCisgICAgeyJNQ0dldFdpbmRvd1JnbiIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ0dldFdpbmRvd1JnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIHcpIC0+IChSZ25IYW5kbGUgX3J2KSIpfSwKKyAgICB7Ik1DTW92aWVDaGFuZ2VkIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DTW92aWVDaGFuZ2VkLCAxLAorICAgICBQeURvY19TVFIoIihNb3ZpZSBtKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNQ1NldER1cmF0aW9uIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DU2V0RHVyYXRpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSBkdXJhdGlvbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTUNHZXRDdXJyZW50VGltZSIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ0dldEN1cnJlbnRUaW1lLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChUaW1lVmFsdWUgX3J2LCBUaW1lU2NhbGUgc2NhbGUpIil9LAorICAgIHsiTUNOZXdBdHRhY2hlZENvbnRyb2xsZXIiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNOZXdBdHRhY2hlZENvbnRyb2xsZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKE1vdmllIHRoZU1vdmllLCBXaW5kb3dQdHIgdywgUG9pbnQgd2hlcmUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1DRHJhdyIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ0RyYXcsIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNQ0FjdGl2YXRlIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DQWN0aXZhdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3LCBCb29sZWFuIGFjdGl2YXRlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNQ0lkbGUiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNJZGxlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1DS2V5IiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DS2V5LCAxLAorICAgICBQeURvY19TVFIoIihTSW50OCBrZXksIGxvbmcgbW9kaWZpZXJzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNQ0NsaWNrIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DQ2xpY2ssIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3LCBQb2ludCB3aGVyZSwgbG9uZyB3aGVuLCBsb25nIG1vZGlmaWVycykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTUNFbmFibGVFZGl0aW5nIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DRW5hYmxlRWRpdGluZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQm9vbGVhbiBlbmFibGVkKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNQ0lzRWRpdGluZ0VuYWJsZWQiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNJc0VkaXRpbmdFbmFibGVkLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChsb25nIF9ydikiKX0sCisgICAgeyJNQ0NvcHkiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNDb3B5LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChNb3ZpZSBfcnYpIil9LAorICAgIHsiTUNDdXQiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNDdXQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKE1vdmllIF9ydikiKX0sCisgICAgeyJNQ1Bhc3RlIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DUGFzdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKE1vdmllIHNyY01vdmllKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNQ0NsZWFyIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DQ2xlYXIsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTUNVbmRvIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DVW5kbywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNQ1Bvc2l0aW9uQ29udHJvbGxlciIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ1Bvc2l0aW9uQ29udHJvbGxlciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCBtb3ZpZVJlY3QsIFJlY3QgY29udHJvbGxlclJlY3QsIGxvbmcgc29tZUZsYWdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNQ0dldENvbnRyb2xsZXJJbmZvIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DR2V0Q29udHJvbGxlckluZm8sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgc29tZUZsYWdzKSIpfSwKKyAgICB7Ik1DU2V0Q2xpcCIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ1NldENsaXAsIDEsCisgICAgIFB5RG9jX1NUUigiKFJnbkhhbmRsZSB0aGVDbGlwLCBSZ25IYW5kbGUgbW92aWVDbGlwKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNQ0dldENsaXAiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNHZXRDbGlwLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSZ25IYW5kbGUgdGhlQ2xpcCwgUmduSGFuZGxlIG1vdmllQ2xpcCkiKX0sCisgICAgeyJNQ0RyYXdCYWRnZSIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ0RyYXdCYWRnZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIG1vdmllUmduKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmduSGFuZGxlIGJhZGdlUmduKSIpfSwKKyAgICB7Ik1DU2V0VXBFZGl0TWVudSIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ1NldFVwRWRpdE1lbnUsIDEsCisgICAgIFB5RG9jX1NUUigiKGxvbmcgbW9kaWZpZXJzLCBNZW51SGFuZGxlIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNQ0dldE1lbnVTdHJpbmciLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNHZXRNZW51U3RyaW5nLCAxLAorICAgICBQeURvY19TVFIoIihsb25nIG1vZGlmaWVycywgc2hvcnQgaXRlbSwgU3RyMjU1IGFTdHJpbmcpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1DUHRJbkNvbnRyb2xsZXIiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNQdEluQ29udHJvbGxlciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgdGhlUHQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBCb29sZWFuIGluQ29udHJvbGxlcikiKX0sCisgICAgeyJNQ0ludmFsaWRhdGUiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNJbnZhbGlkYXRlLCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgdywgUmduSGFuZGxlIGludmFsaWRSZ24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1DQWRqdXN0Q3Vyc29yIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DQWRqdXN0Q3Vyc29yLCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgdywgUG9pbnQgd2hlcmUsIGxvbmcgbW9kaWZpZXJzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNQ0dldEludGVyZmFjZUVsZW1lbnQiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNHZXRJbnRlcmZhY2VFbGVtZW50LCAxLAorICAgICBQeURvY19TVFIoIihNQ0ludGVyZmFjZUVsZW1lbnQgd2hpY2hFbGVtZW50LCB2b2lkICogZWxlbWVudCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTUNBZGRNb3ZpZVNlZ21lbnQiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNBZGRNb3ZpZVNlZ21lbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKE1vdmllIHNyY01vdmllLCBCb29sZWFuIHNjYWxlZCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTUNUcmltTW92aWVTZWdtZW50IiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DVHJpbU1vdmllU2VnbWVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNQ1NldElkbGVNYW5hZ2VyIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DU2V0SWRsZU1hbmFnZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKElkbGVNYW5hZ2VyIGltKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNQ1NldENvbnRyb2xsZXJDYXBhYmlsaXRpZXMiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNTZXRDb250cm9sbGVyQ2FwYWJpbGl0aWVzLCAxLAorICAgICBQeURvY19TVFIoIihsb25nIGZsYWdzLCBsb25nIGZsYWdzTWFzaykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogI2RlZmluZSBNb3ZpZUN0bE9ial9nZXRzZXRsaXN0IE5VTEwKQEAgLTEyNzgsNjEgKzEyNzgsNjEgQEAKIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZUN0bE9ial90cF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlQeU9iamVjdCAqX3NlbGY7Ci0JTW92aWVDb250cm9sbGVyIGl0c2VsZjsKLQljaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKKyAgICBQeU9iamVjdCAqX3NlbGY7CisgICAgTW92aWVDb250cm9sbGVyIGl0c2VsZjsKKyAgICBjaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIE1vdmllQ3RsT2JqX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKLQlpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOwotCSgoTW92aWVDb250cm9sbGVyT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JcmV0dXJuIF9zZWxmOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIE1vdmllQ3RsT2JqX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOworICAgICgoTW92aWVDb250cm9sbGVyT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgcmV0dXJuIF9zZWxmOwogfQogCiAjZGVmaW5lIE1vdmllQ3RsT2JqX3RwX2ZyZWUgUHlPYmplY3RfRGVsCiAKIAogUHlUeXBlT2JqZWN0IE1vdmllQ29udHJvbGxlcl9UeXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQotCTAsIC8qb2Jfc2l6ZSovCi0JIl9RdC5Nb3ZpZUNvbnRyb2xsZXIiLCAvKnRwX25hbWUqLwotCXNpemVvZihNb3ZpZUNvbnRyb2xsZXJPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCi0JMCwgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKSBNb3ZpZUN0bE9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsIC8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLwotCShjbXBmdW5jKSBNb3ZpZUN0bE9ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYykgTW92aWVDdGxPYmpfcmVwciwgLyp0cF9yZXByKi8KLQkoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCi0JKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpIE1vdmllQ3RsT2JqX2hhc2gsIC8qdHBfaGFzaCovCi0JMCwgLyp0cF9jYWxsKi8KLQkwLCAvKnRwX3N0ciovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLwotCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCi0JMCwgLyp0cF9hc19idWZmZXIqLwotCVB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCTAsIC8qdHBfZG9jKi8KLQkwLCAvKnRwX3RyYXZlcnNlKi8KLQkwLCAvKnRwX2NsZWFyKi8KLQkwLCAvKnRwX3JpY2hjb21wYXJlKi8KLQkwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLQkwLCAvKnRwX2l0ZXIqLwotCTAsIC8qdHBfaXRlcm5leHQqLwotCU1vdmllQ3RsT2JqX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KLQkwLCAvKnRwX21lbWJlcnMqLwotCU1vdmllQ3RsT2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KLQkwLCAvKnRwX2Jhc2UqLwotCTAsIC8qdHBfZGljdCovCi0JMCwgLyp0cF9kZXNjcl9nZXQqLwotCTAsIC8qdHBfZGVzY3Jfc2V0Ki8KLQkwLCAvKnRwX2RpY3RvZmZzZXQqLwotCU1vdmllQ3RsT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KLQlNb3ZpZUN0bE9ial90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KLQlNb3ZpZUN0bE9ial90cF9uZXcsIC8qIHRwX25ldyAqLwotCU1vdmllQ3RsT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAvKm9iX3NpemUqLworICAgICJfUXQuTW92aWVDb250cm9sbGVyIiwgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoTW92aWVDb250cm9sbGVyT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLworICAgIDAsIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcikgTW92aWVDdGxPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KKyAgICAoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KKyAgICAoY21wZnVuYykgTW92aWVDdGxPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpIE1vdmllQ3RsT2JqX3JlcHIsIC8qdHBfcmVwciovCisgICAgKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLworICAgIChQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKSBNb3ZpZUN0bE9ial9oYXNoLCAvKnRwX2hhc2gqLworICAgIDAsIC8qdHBfY2FsbCovCisgICAgMCwgLyp0cF9zdHIqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KKyAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLworICAgIDAsIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAvKnRwX2RvYyovCisgICAgMCwgLyp0cF90cmF2ZXJzZSovCisgICAgMCwgLyp0cF9jbGVhciovCisgICAgMCwgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgLyp0cF9pdGVyKi8KKyAgICAwLCAvKnRwX2l0ZXJuZXh0Ki8KKyAgICBNb3ZpZUN0bE9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCisgICAgMCwgLyp0cF9tZW1iZXJzKi8KKyAgICBNb3ZpZUN0bE9ial9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCisgICAgMCwgLyp0cF9iYXNlKi8KKyAgICAwLCAvKnRwX2RpY3QqLworICAgIDAsIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICBNb3ZpZUN0bE9ial90cF9pbml0LCAvKiB0cF9pbml0ICovCisgICAgTW92aWVDdGxPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCisgICAgTW92aWVDdGxPYmpfdHBfbmV3LCAvKiB0cF9uZXcgKi8KKyAgICBNb3ZpZUN0bE9ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tIEVuZCBvYmplY3QgdHlwZSBNb3ZpZUNvbnRyb2xsZXIgLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTEzNDUsNDE3ICsxMzQ1LDQxNyBAQAogI2RlZmluZSBUaW1lQmFzZU9ial9DaGVjayh4KSAoKHgpLT5vYl90eXBlID09ICZUaW1lQmFzZV9UeXBlIHx8IFB5T2JqZWN0X1R5cGVDaGVjaygoeCksICZUaW1lQmFzZV9UeXBlKSkKIAogdHlwZWRlZiBzdHJ1Y3QgVGltZUJhc2VPYmplY3QgewotCVB5T2JqZWN0X0hFQUQKLQlUaW1lQmFzZSBvYl9pdHNlbGY7CisgICAgUHlPYmplY3RfSEVBRAorICAgIFRpbWVCYXNlIG9iX2l0c2VsZjsKIH0gVGltZUJhc2VPYmplY3Q7CiAKIFB5T2JqZWN0ICpUaW1lQmFzZU9ial9OZXcoVGltZUJhc2UgaXRzZWxmKQogewotCVRpbWVCYXNlT2JqZWN0ICppdDsKLQlpZiAoaXRzZWxmID09IE5VTEwpIHsKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhRdF9FcnJvciwiQ2Fubm90IGNyZWF0ZSBUaW1lQmFzZSBmcm9tIE5VTEwgcG9pbnRlciIpOwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgfQotCWl0ID0gUHlPYmplY3RfTkVXKFRpbWVCYXNlT2JqZWN0LCAmVGltZUJhc2VfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOwotCWl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIFRpbWVCYXNlT2JqZWN0ICppdDsKKyAgICBpZiAoaXRzZWxmID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhRdF9FcnJvciwiQ2Fubm90IGNyZWF0ZSBUaW1lQmFzZSBmcm9tIE5VTEwgcG9pbnRlciIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgIGl0ID0gUHlPYmplY3RfTkVXKFRpbWVCYXNlT2JqZWN0LCAmVGltZUJhc2VfVHlwZSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIGl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogCiBpbnQgVGltZUJhc2VPYmpfQ29udmVydChQeU9iamVjdCAqdiwgVGltZUJhc2UgKnBfaXRzZWxmKQogewotCWlmICh2ID09IFB5X05vbmUpCi0JewotCQkqcF9pdHNlbGYgPSBOVUxMOwotCQlyZXR1cm4gMTsKLQl9Ci0JaWYgKCFUaW1lQmFzZU9ial9DaGVjayh2KSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJUaW1lQmFzZSByZXF1aXJlZCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JKnBfaXRzZWxmID0gKChUaW1lQmFzZU9iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0JcmV0dXJuIDE7CisgICAgaWYgKHYgPT0gUHlfTm9uZSkKKyAgICB7CisgICAgICAgICpwX2l0c2VsZiA9IE5VTEw7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAoIVRpbWVCYXNlT2JqX0NoZWNrKHYpKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIlRpbWVCYXNlIHJlcXVpcmVkIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAqcF9pdHNlbGYgPSAoKFRpbWVCYXNlT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIHZvaWQgVGltZUJhc2VPYmpfZGVhbGxvYyhUaW1lQmFzZU9iamVjdCAqc2VsZikKIHsKLQkvKiBDbGVhbnVwIG9mIHNlbGYtPm9iX2l0c2VsZiBnb2VzIGhlcmUgKi8KLQlzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOworICAgIC8qIENsZWFudXAgb2Ygc2VsZi0+b2JfaXRzZWxmIGdvZXMgaGVyZSAqLworICAgIHNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVGltZUJhc2VPYmpfRGlzcG9zZVRpbWVCYXNlKFRpbWVCYXNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIERpc3Bvc2VUaW1lQmFzZQotCVB5TWFjX1BSRUNIRUNLKERpc3Bvc2VUaW1lQmFzZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGlzcG9zZVRpbWVCYXNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlEaXNwb3NlVGltZUJhc2UoX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBEaXNwb3NlVGltZUJhc2UoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRpbWVCYXNlT2JqX0dldFRpbWVCYXNlVGltZShUaW1lQmFzZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVGltZVZhbHVlIF9ydjsKLQlUaW1lU2NhbGUgczsKLQlUaW1lUmVjb3JkIHRyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBUaW1lVmFsdWUgX3J2OworICAgIFRpbWVTY2FsZSBzOworICAgIFRpbWVSZWNvcmQgdHI7CiAjaWZuZGVmIEdldFRpbWVCYXNlVGltZQotCVB5TWFjX1BSRUNIRUNLKEdldFRpbWVCYXNlVGltZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VGltZUJhc2VUaW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFRpbWVCYXNlVGltZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICBzLAotCSAgICAgICAgICAgICAgICAgICAgICAmdHIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBRdFRpbWVSZWNvcmRfTmV3LCAmdHIpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFRpbWVCYXNlVGltZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdHIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBRdFRpbWVSZWNvcmRfTmV3LCAmdHIpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRpbWVCYXNlT2JqX1NldFRpbWVCYXNlVGltZShUaW1lQmFzZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVGltZVJlY29yZCB0cjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVGltZVJlY29yZCB0cjsKICNpZm5kZWYgU2V0VGltZUJhc2VUaW1lCi0JUHlNYWNfUFJFQ0hFQ0soU2V0VGltZUJhc2VUaW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRUaW1lQmFzZVRpbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBRdFRpbWVSZWNvcmRfQ29udmVydCwgJnRyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0VGltZUJhc2VUaW1lKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICZ0cik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUXRUaW1lUmVjb3JkX0NvbnZlcnQsICZ0cikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldFRpbWVCYXNlVGltZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAmdHIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUaW1lQmFzZU9ial9TZXRUaW1lQmFzZVZhbHVlKFRpbWVCYXNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlUaW1lVmFsdWUgdDsKLQlUaW1lU2NhbGUgczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVGltZVZhbHVlIHQ7CisgICAgVGltZVNjYWxlIHM7CiAjaWZuZGVmIFNldFRpbWVCYXNlVmFsdWUKLQlQeU1hY19QUkVDSEVDSyhTZXRUaW1lQmFzZVZhbHVlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRUaW1lQmFzZVZhbHVlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnQsCi0JICAgICAgICAgICAgICAgICAgICAgICZzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0VGltZUJhc2VWYWx1ZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgdCwKLQkgICAgICAgICAgICAgICAgIHMpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldFRpbWVCYXNlVmFsdWUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgIHQsCisgICAgICAgICAgICAgICAgICAgICBzKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVGltZUJhc2VPYmpfR2V0VGltZUJhc2VSYXRlKFRpbWVCYXNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlGaXhlZCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEZpeGVkIF9ydjsKICNpZm5kZWYgR2V0VGltZUJhc2VSYXRlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0VGltZUJhc2VSYXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRUaW1lQmFzZVJhdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFRpbWVCYXNlUmF0ZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRml4ZWQsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFRpbWVCYXNlUmF0ZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRml4ZWQsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVGltZUJhc2VPYmpfU2V0VGltZUJhc2VSYXRlKFRpbWVCYXNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlGaXhlZCByOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBGaXhlZCByOwogI2lmbmRlZiBTZXRUaW1lQmFzZVJhdGUKLQlQeU1hY19QUkVDSEVDSyhTZXRUaW1lQmFzZVJhdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFRpbWVCYXNlUmF0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmcikpCi0JCXJldHVybiBOVUxMOwotCVNldFRpbWVCYXNlUmF0ZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICByKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJnIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRUaW1lQmFzZVJhdGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgcik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRpbWVCYXNlT2JqX0dldFRpbWVCYXNlU3RhcnRUaW1lKFRpbWVCYXNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlUaW1lVmFsdWUgX3J2OwotCVRpbWVTY2FsZSBzOwotCVRpbWVSZWNvcmQgdHI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFRpbWVWYWx1ZSBfcnY7CisgICAgVGltZVNjYWxlIHM7CisgICAgVGltZVJlY29yZCB0cjsKICNpZm5kZWYgR2V0VGltZUJhc2VTdGFydFRpbWUKLQlQeU1hY19QUkVDSEVDSyhHZXRUaW1lQmFzZVN0YXJ0VGltZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VGltZUJhc2VTdGFydFRpbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0VGltZUJhc2VTdGFydFRpbWUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFF0VGltZVJlY29yZF9OZXcsICZ0cik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0VGltZUJhc2VTdGFydFRpbWUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFF0VGltZVJlY29yZF9OZXcsICZ0cik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVGltZUJhc2VPYmpfU2V0VGltZUJhc2VTdGFydFRpbWUoVGltZUJhc2VPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVRpbWVSZWNvcmQgdHI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFRpbWVSZWNvcmQgdHI7CiAjaWZuZGVmIFNldFRpbWVCYXNlU3RhcnRUaW1lCi0JUHlNYWNfUFJFQ0hFQ0soU2V0VGltZUJhc2VTdGFydFRpbWUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFRpbWVCYXNlU3RhcnRUaW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUXRUaW1lUmVjb3JkX0NvbnZlcnQsICZ0cikpCi0JCXJldHVybiBOVUxMOwotCVNldFRpbWVCYXNlU3RhcnRUaW1lKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgJnRyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBRdFRpbWVSZWNvcmRfQ29udmVydCwgJnRyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0VGltZUJhc2VTdGFydFRpbWUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmdHIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUaW1lQmFzZU9ial9HZXRUaW1lQmFzZVN0b3BUaW1lKFRpbWVCYXNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlUaW1lVmFsdWUgX3J2OwotCVRpbWVTY2FsZSBzOwotCVRpbWVSZWNvcmQgdHI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFRpbWVWYWx1ZSBfcnY7CisgICAgVGltZVNjYWxlIHM7CisgICAgVGltZVJlY29yZCB0cjsKICNpZm5kZWYgR2V0VGltZUJhc2VTdG9wVGltZQotCVB5TWFjX1BSRUNIRUNLKEdldFRpbWVCYXNlU3RvcFRpbWUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFRpbWVCYXNlU3RvcFRpbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0VGltZUJhc2VTdG9wVGltZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFF0VGltZVJlY29yZF9OZXcsICZ0cik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0VGltZUJhc2VTdG9wVGltZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFF0VGltZVJlY29yZF9OZXcsICZ0cik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVGltZUJhc2VPYmpfU2V0VGltZUJhc2VTdG9wVGltZShUaW1lQmFzZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVGltZVJlY29yZCB0cjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVGltZVJlY29yZCB0cjsKICNpZm5kZWYgU2V0VGltZUJhc2VTdG9wVGltZQotCVB5TWFjX1BSRUNIRUNLKFNldFRpbWVCYXNlU3RvcFRpbWUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFRpbWVCYXNlU3RvcFRpbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBRdFRpbWVSZWNvcmRfQ29udmVydCwgJnRyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0VGltZUJhc2VTdG9wVGltZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgJnRyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBRdFRpbWVSZWNvcmRfQ29udmVydCwgJnRyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0VGltZUJhc2VTdG9wVGltZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgJnRyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVGltZUJhc2VPYmpfR2V0VGltZUJhc2VGbGFncyhUaW1lQmFzZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgX3J2OwogI2lmbmRlZiBHZXRUaW1lQmFzZUZsYWdzCi0JUHlNYWNfUFJFQ0hFQ0soR2V0VGltZUJhc2VGbGFncyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VGltZUJhc2VGbGFncyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0VGltZUJhc2VGbGFncyhfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0VGltZUJhc2VGbGFncyhfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUaW1lQmFzZU9ial9TZXRUaW1lQmFzZUZsYWdzKFRpbWVCYXNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIHRpbWVCYXNlRmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgdGltZUJhc2VGbGFnczsKICNpZm5kZWYgU2V0VGltZUJhc2VGbGFncwotCVB5TWFjX1BSRUNIRUNLKFNldFRpbWVCYXNlRmxhZ3MpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFRpbWVCYXNlRmxhZ3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aW1lQmFzZUZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0VGltZUJhc2VGbGFncyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgdGltZUJhc2VGbGFncyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGltZUJhc2VGbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldFRpbWVCYXNlRmxhZ3MoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgIHRpbWVCYXNlRmxhZ3MpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUaW1lQmFzZU9ial9TZXRUaW1lQmFzZU1hc3RlclRpbWVCYXNlKFRpbWVCYXNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlUaW1lQmFzZSBtYXN0ZXI7Ci0JVGltZVJlY29yZCBzbGF2ZVplcm87CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFRpbWVCYXNlIG1hc3RlcjsKKyAgICBUaW1lUmVjb3JkIHNsYXZlWmVybzsKICNpZm5kZWYgU2V0VGltZUJhc2VNYXN0ZXJUaW1lQmFzZQotCVB5TWFjX1BSRUNIRUNLKFNldFRpbWVCYXNlTWFzdGVyVGltZUJhc2UpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFRpbWVCYXNlTWFzdGVyVGltZUJhc2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFRpbWVCYXNlT2JqX0NvbnZlcnQsICZtYXN0ZXIsCi0JICAgICAgICAgICAgICAgICAgICAgIFF0VGltZVJlY29yZF9Db252ZXJ0LCAmc2xhdmVaZXJvKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0VGltZUJhc2VNYXN0ZXJUaW1lQmFzZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgbWFzdGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJnNsYXZlWmVybyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lQmFzZU9ial9Db252ZXJ0LCAmbWFzdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBRdFRpbWVSZWNvcmRfQ29udmVydCwgJnNsYXZlWmVybykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldFRpbWVCYXNlTWFzdGVyVGltZUJhc2UoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc3RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzbGF2ZVplcm8pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUaW1lQmFzZU9ial9HZXRUaW1lQmFzZU1hc3RlclRpbWVCYXNlKFRpbWVCYXNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlUaW1lQmFzZSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFRpbWVCYXNlIF9ydjsKICNpZm5kZWYgR2V0VGltZUJhc2VNYXN0ZXJUaW1lQmFzZQotCVB5TWFjX1BSRUNIRUNLKEdldFRpbWVCYXNlTWFzdGVyVGltZUJhc2UpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFRpbWVCYXNlTWFzdGVyVGltZUJhc2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFRpbWVCYXNlTWFzdGVyVGltZUJhc2UoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBUaW1lQmFzZU9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFRpbWVCYXNlTWFzdGVyVGltZUJhc2UoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lQmFzZU9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVGltZUJhc2VPYmpfU2V0VGltZUJhc2VNYXN0ZXJDbG9jayhUaW1lQmFzZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50IGNsb2NrTWVpc3RlcjsKLQlUaW1lUmVjb3JkIHNsYXZlWmVybzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50IGNsb2NrTWVpc3RlcjsKKyAgICBUaW1lUmVjb3JkIHNsYXZlWmVybzsKICNpZm5kZWYgU2V0VGltZUJhc2VNYXN0ZXJDbG9jawotCVB5TWFjX1BSRUNIRUNLKFNldFRpbWVCYXNlTWFzdGVyQ2xvY2spOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFRpbWVCYXNlTWFzdGVyQ2xvY2spOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcE9ial9Db252ZXJ0LCAmY2xvY2tNZWlzdGVyLAotCSAgICAgICAgICAgICAgICAgICAgICBRdFRpbWVSZWNvcmRfQ29udmVydCwgJnNsYXZlWmVybykpCi0JCXJldHVybiBOVUxMOwotCVNldFRpbWVCYXNlTWFzdGVyQ2xvY2soX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgIGNsb2NrTWVpc3RlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICZzbGF2ZVplcm8pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wT2JqX0NvbnZlcnQsICZjbG9ja01laXN0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFF0VGltZVJlY29yZF9Db252ZXJ0LCAmc2xhdmVaZXJvKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0VGltZUJhc2VNYXN0ZXJDbG9jayhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvY2tNZWlzdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNsYXZlWmVybyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRpbWVCYXNlT2JqX0dldFRpbWVCYXNlTWFzdGVyQ2xvY2soVGltZUJhc2VPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudEluc3RhbmNlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50SW5zdGFuY2UgX3J2OwogI2lmbmRlZiBHZXRUaW1lQmFzZU1hc3RlckNsb2NrCi0JUHlNYWNfUFJFQ0hFQ0soR2V0VGltZUJhc2VNYXN0ZXJDbG9jayk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VGltZUJhc2VNYXN0ZXJDbG9jayk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0VGltZUJhc2VNYXN0ZXJDbG9jayhfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRUaW1lQmFzZU1hc3RlckNsb2NrKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVGltZUJhc2VPYmpfR2V0VGltZUJhc2VTdGF0dXMoVGltZUJhc2VPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWxvbmcgX3J2OwotCVRpbWVSZWNvcmQgdW5waW5uZWRUaW1lOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBsb25nIF9ydjsKKyAgICBUaW1lUmVjb3JkIHVucGlubmVkVGltZTsKICNpZm5kZWYgR2V0VGltZUJhc2VTdGF0dXMKLQlQeU1hY19QUkVDSEVDSyhHZXRUaW1lQmFzZVN0YXR1cyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VGltZUJhc2VTdGF0dXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFRpbWVCYXNlU3RhdHVzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgJnVucGlubmVkVGltZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFF0VGltZVJlY29yZF9OZXcsICZ1bnBpbm5lZFRpbWUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRUaW1lQmFzZVN0YXR1cyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1bnBpbm5lZFRpbWUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBRdFRpbWVSZWNvcmRfTmV3LCAmdW5waW5uZWRUaW1lKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUaW1lQmFzZU9ial9TZXRUaW1lQmFzZVplcm8oVGltZUJhc2VPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVRpbWVSZWNvcmQgemVybzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVGltZVJlY29yZCB6ZXJvOwogI2lmbmRlZiBTZXRUaW1lQmFzZVplcm8KLQlQeU1hY19QUkVDSEVDSyhTZXRUaW1lQmFzZVplcm8pOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFRpbWVCYXNlWmVybyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFF0VGltZVJlY29yZF9Db252ZXJ0LCAmemVybykpCi0JCXJldHVybiBOVUxMOwotCVNldFRpbWVCYXNlWmVybyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAmemVybyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUXRUaW1lUmVjb3JkX0NvbnZlcnQsICZ6ZXJvKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0VGltZUJhc2VaZXJvKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICZ6ZXJvKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVGltZUJhc2VPYmpfR2V0VGltZUJhc2VFZmZlY3RpdmVSYXRlKFRpbWVCYXNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlGaXhlZCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEZpeGVkIF9ydjsKICNpZm5kZWYgR2V0VGltZUJhc2VFZmZlY3RpdmVSYXRlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0VGltZUJhc2VFZmZlY3RpdmVSYXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRUaW1lQmFzZUVmZmVjdGl2ZVJhdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFRpbWVCYXNlRWZmZWN0aXZlUmF0ZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRml4ZWQsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFRpbWVCYXNlRWZmZWN0aXZlUmF0ZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRml4ZWQsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBUaW1lQmFzZU9ial9tZXRob2RzW10gPSB7Ci0JeyJEaXNwb3NlVGltZUJhc2UiLCAoUHlDRnVuY3Rpb24pVGltZUJhc2VPYmpfRGlzcG9zZVRpbWVCYXNlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJHZXRUaW1lQmFzZVRpbWUiLCAoUHlDRnVuY3Rpb24pVGltZUJhc2VPYmpfR2V0VGltZUJhc2VUaW1lLCAxLAotCSBQeURvY19TVFIoIihUaW1lU2NhbGUgcykgLT4gKFRpbWVWYWx1ZSBfcnYsIFRpbWVSZWNvcmQgdHIpIil9LAotCXsiU2V0VGltZUJhc2VUaW1lIiwgKFB5Q0Z1bmN0aW9uKVRpbWVCYXNlT2JqX1NldFRpbWVCYXNlVGltZSwgMSwKLQkgUHlEb2NfU1RSKCIoVGltZVJlY29yZCB0cikgLT4gTm9uZSIpfSwKLQl7IlNldFRpbWVCYXNlVmFsdWUiLCAoUHlDRnVuY3Rpb24pVGltZUJhc2VPYmpfU2V0VGltZUJhc2VWYWx1ZSwgMSwKLQkgUHlEb2NfU1RSKCIoVGltZVZhbHVlIHQsIFRpbWVTY2FsZSBzKSAtPiBOb25lIil9LAotCXsiR2V0VGltZUJhc2VSYXRlIiwgKFB5Q0Z1bmN0aW9uKVRpbWVCYXNlT2JqX0dldFRpbWVCYXNlUmF0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoRml4ZWQgX3J2KSIpfSwKLQl7IlNldFRpbWVCYXNlUmF0ZSIsIChQeUNGdW5jdGlvbilUaW1lQmFzZU9ial9TZXRUaW1lQmFzZVJhdGUsIDEsCi0JIFB5RG9jX1NUUigiKEZpeGVkIHIpIC0+IE5vbmUiKX0sCi0JeyJHZXRUaW1lQmFzZVN0YXJ0VGltZSIsIChQeUNGdW5jdGlvbilUaW1lQmFzZU9ial9HZXRUaW1lQmFzZVN0YXJ0VGltZSwgMSwKLQkgUHlEb2NfU1RSKCIoVGltZVNjYWxlIHMpIC0+IChUaW1lVmFsdWUgX3J2LCBUaW1lUmVjb3JkIHRyKSIpfSwKLQl7IlNldFRpbWVCYXNlU3RhcnRUaW1lIiwgKFB5Q0Z1bmN0aW9uKVRpbWVCYXNlT2JqX1NldFRpbWVCYXNlU3RhcnRUaW1lLCAxLAotCSBQeURvY19TVFIoIihUaW1lUmVjb3JkIHRyKSAtPiBOb25lIil9LAotCXsiR2V0VGltZUJhc2VTdG9wVGltZSIsIChQeUNGdW5jdGlvbilUaW1lQmFzZU9ial9HZXRUaW1lQmFzZVN0b3BUaW1lLCAxLAotCSBQeURvY19TVFIoIihUaW1lU2NhbGUgcykgLT4gKFRpbWVWYWx1ZSBfcnYsIFRpbWVSZWNvcmQgdHIpIil9LAotCXsiU2V0VGltZUJhc2VTdG9wVGltZSIsIChQeUNGdW5jdGlvbilUaW1lQmFzZU9ial9TZXRUaW1lQmFzZVN0b3BUaW1lLCAxLAotCSBQeURvY19TVFIoIihUaW1lUmVjb3JkIHRyKSAtPiBOb25lIil9LAotCXsiR2V0VGltZUJhc2VGbGFncyIsIChQeUNGdW5jdGlvbilUaW1lQmFzZU9ial9HZXRUaW1lQmFzZUZsYWdzLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChsb25nIF9ydikiKX0sCi0JeyJTZXRUaW1lQmFzZUZsYWdzIiwgKFB5Q0Z1bmN0aW9uKVRpbWVCYXNlT2JqX1NldFRpbWVCYXNlRmxhZ3MsIDEsCi0JIFB5RG9jX1NUUigiKGxvbmcgdGltZUJhc2VGbGFncykgLT4gTm9uZSIpfSwKLQl7IlNldFRpbWVCYXNlTWFzdGVyVGltZUJhc2UiLCAoUHlDRnVuY3Rpb24pVGltZUJhc2VPYmpfU2V0VGltZUJhc2VNYXN0ZXJUaW1lQmFzZSwgMSwKLQkgUHlEb2NfU1RSKCIoVGltZUJhc2UgbWFzdGVyLCBUaW1lUmVjb3JkIHNsYXZlWmVybykgLT4gTm9uZSIpfSwKLQl7IkdldFRpbWVCYXNlTWFzdGVyVGltZUJhc2UiLCAoUHlDRnVuY3Rpb24pVGltZUJhc2VPYmpfR2V0VGltZUJhc2VNYXN0ZXJUaW1lQmFzZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVGltZUJhc2UgX3J2KSIpfSwKLQl7IlNldFRpbWVCYXNlTWFzdGVyQ2xvY2siLCAoUHlDRnVuY3Rpb24pVGltZUJhc2VPYmpfU2V0VGltZUJhc2VNYXN0ZXJDbG9jaywgMSwKLQkgUHlEb2NfU1RSKCIoQ29tcG9uZW50IGNsb2NrTWVpc3RlciwgVGltZVJlY29yZCBzbGF2ZVplcm8pIC0+IE5vbmUiKX0sCi0JeyJHZXRUaW1lQmFzZU1hc3RlckNsb2NrIiwgKFB5Q0Z1bmN0aW9uKVRpbWVCYXNlT2JqX0dldFRpbWVCYXNlTWFzdGVyQ2xvY2ssIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENvbXBvbmVudEluc3RhbmNlIF9ydikiKX0sCi0JeyJHZXRUaW1lQmFzZVN0YXR1cyIsIChQeUNGdW5jdGlvbilUaW1lQmFzZU9ial9HZXRUaW1lQmFzZVN0YXR1cywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAobG9uZyBfcnYsIFRpbWVSZWNvcmQgdW5waW5uZWRUaW1lKSIpfSwKLQl7IlNldFRpbWVCYXNlWmVybyIsIChQeUNGdW5jdGlvbilUaW1lQmFzZU9ial9TZXRUaW1lQmFzZVplcm8sIDEsCi0JIFB5RG9jX1NUUigiKFRpbWVSZWNvcmQgemVybykgLT4gTm9uZSIpfSwKLQl7IkdldFRpbWVCYXNlRWZmZWN0aXZlUmF0ZSIsIChQeUNGdW5jdGlvbilUaW1lQmFzZU9ial9HZXRUaW1lQmFzZUVmZmVjdGl2ZVJhdGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEZpeGVkIF9ydikiKX0sCi0Je05VTEwsIE5VTEwsIDB9CisgICAgeyJEaXNwb3NlVGltZUJhc2UiLCAoUHlDRnVuY3Rpb24pVGltZUJhc2VPYmpfRGlzcG9zZVRpbWVCYXNlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRUaW1lQmFzZVRpbWUiLCAoUHlDRnVuY3Rpb24pVGltZUJhc2VPYmpfR2V0VGltZUJhc2VUaW1lLCAxLAorICAgICBQeURvY19TVFIoIihUaW1lU2NhbGUgcykgLT4gKFRpbWVWYWx1ZSBfcnYsIFRpbWVSZWNvcmQgdHIpIil9LAorICAgIHsiU2V0VGltZUJhc2VUaW1lIiwgKFB5Q0Z1bmN0aW9uKVRpbWVCYXNlT2JqX1NldFRpbWVCYXNlVGltZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGltZVJlY29yZCB0cikgLT4gTm9uZSIpfSwKKyAgICB7IlNldFRpbWVCYXNlVmFsdWUiLCAoUHlDRnVuY3Rpb24pVGltZUJhc2VPYmpfU2V0VGltZUJhc2VWYWx1ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGltZVZhbHVlIHQsIFRpbWVTY2FsZSBzKSAtPiBOb25lIil9LAorICAgIHsiR2V0VGltZUJhc2VSYXRlIiwgKFB5Q0Z1bmN0aW9uKVRpbWVCYXNlT2JqX0dldFRpbWVCYXNlUmF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoRml4ZWQgX3J2KSIpfSwKKyAgICB7IlNldFRpbWVCYXNlUmF0ZSIsIChQeUNGdW5jdGlvbilUaW1lQmFzZU9ial9TZXRUaW1lQmFzZVJhdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEZpeGVkIHIpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRUaW1lQmFzZVN0YXJ0VGltZSIsIChQeUNGdW5jdGlvbilUaW1lQmFzZU9ial9HZXRUaW1lQmFzZVN0YXJ0VGltZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGltZVNjYWxlIHMpIC0+IChUaW1lVmFsdWUgX3J2LCBUaW1lUmVjb3JkIHRyKSIpfSwKKyAgICB7IlNldFRpbWVCYXNlU3RhcnRUaW1lIiwgKFB5Q0Z1bmN0aW9uKVRpbWVCYXNlT2JqX1NldFRpbWVCYXNlU3RhcnRUaW1lLCAxLAorICAgICBQeURvY19TVFIoIihUaW1lUmVjb3JkIHRyKSAtPiBOb25lIil9LAorICAgIHsiR2V0VGltZUJhc2VTdG9wVGltZSIsIChQeUNGdW5jdGlvbilUaW1lQmFzZU9ial9HZXRUaW1lQmFzZVN0b3BUaW1lLCAxLAorICAgICBQeURvY19TVFIoIihUaW1lU2NhbGUgcykgLT4gKFRpbWVWYWx1ZSBfcnYsIFRpbWVSZWNvcmQgdHIpIil9LAorICAgIHsiU2V0VGltZUJhc2VTdG9wVGltZSIsIChQeUNGdW5jdGlvbilUaW1lQmFzZU9ial9TZXRUaW1lQmFzZVN0b3BUaW1lLCAxLAorICAgICBQeURvY19TVFIoIihUaW1lUmVjb3JkIHRyKSAtPiBOb25lIil9LAorICAgIHsiR2V0VGltZUJhc2VGbGFncyIsIChQeUNGdW5jdGlvbilUaW1lQmFzZU9ial9HZXRUaW1lQmFzZUZsYWdzLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChsb25nIF9ydikiKX0sCisgICAgeyJTZXRUaW1lQmFzZUZsYWdzIiwgKFB5Q0Z1bmN0aW9uKVRpbWVCYXNlT2JqX1NldFRpbWVCYXNlRmxhZ3MsIDEsCisgICAgIFB5RG9jX1NUUigiKGxvbmcgdGltZUJhc2VGbGFncykgLT4gTm9uZSIpfSwKKyAgICB7IlNldFRpbWVCYXNlTWFzdGVyVGltZUJhc2UiLCAoUHlDRnVuY3Rpb24pVGltZUJhc2VPYmpfU2V0VGltZUJhc2VNYXN0ZXJUaW1lQmFzZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGltZUJhc2UgbWFzdGVyLCBUaW1lUmVjb3JkIHNsYXZlWmVybykgLT4gTm9uZSIpfSwKKyAgICB7IkdldFRpbWVCYXNlTWFzdGVyVGltZUJhc2UiLCAoUHlDRnVuY3Rpb24pVGltZUJhc2VPYmpfR2V0VGltZUJhc2VNYXN0ZXJUaW1lQmFzZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVGltZUJhc2UgX3J2KSIpfSwKKyAgICB7IlNldFRpbWVCYXNlTWFzdGVyQ2xvY2siLCAoUHlDRnVuY3Rpb24pVGltZUJhc2VPYmpfU2V0VGltZUJhc2VNYXN0ZXJDbG9jaywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ29tcG9uZW50IGNsb2NrTWVpc3RlciwgVGltZVJlY29yZCBzbGF2ZVplcm8pIC0+IE5vbmUiKX0sCisgICAgeyJHZXRUaW1lQmFzZU1hc3RlckNsb2NrIiwgKFB5Q0Z1bmN0aW9uKVRpbWVCYXNlT2JqX0dldFRpbWVCYXNlTWFzdGVyQ2xvY2ssIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENvbXBvbmVudEluc3RhbmNlIF9ydikiKX0sCisgICAgeyJHZXRUaW1lQmFzZVN0YXR1cyIsIChQeUNGdW5jdGlvbilUaW1lQmFzZU9ial9HZXRUaW1lQmFzZVN0YXR1cywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAobG9uZyBfcnYsIFRpbWVSZWNvcmQgdW5waW5uZWRUaW1lKSIpfSwKKyAgICB7IlNldFRpbWVCYXNlWmVybyIsIChQeUNGdW5jdGlvbilUaW1lQmFzZU9ial9TZXRUaW1lQmFzZVplcm8sIDEsCisgICAgIFB5RG9jX1NUUigiKFRpbWVSZWNvcmQgemVybykgLT4gTm9uZSIpfSwKKyAgICB7IkdldFRpbWVCYXNlRWZmZWN0aXZlUmF0ZSIsIChQeUNGdW5jdGlvbilUaW1lQmFzZU9ial9HZXRUaW1lQmFzZUVmZmVjdGl2ZVJhdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEZpeGVkIF9ydikiKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAjZGVmaW5lIFRpbWVCYXNlT2JqX2dldHNldGxpc3QgTlVMTApAQCAtMTc3Miw2MSArMTc3Miw2MSBAQAogCiBzdGF0aWMgUHlPYmplY3QgKlRpbWVCYXNlT2JqX3RwX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICpfYXJncywgUHlPYmplY3QgKl9rd2RzKQogewotCVB5T2JqZWN0ICpfc2VsZjsKLQlUaW1lQmFzZSBpdHNlbGY7Ci0JY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CisgICAgUHlPYmplY3QgKl9zZWxmOworICAgIFRpbWVCYXNlIGl0c2VsZjsKKyAgICBjaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIFRpbWVCYXNlT2JqX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKLQlpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOwotCSgoVGltZUJhc2VPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlyZXR1cm4gX3NlbGY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgVGltZUJhc2VPYmpfQ29udmVydCwgJml0c2VsZikpIHJldHVybiBOVUxMOworICAgIGlmICgoX3NlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgKChUaW1lQmFzZU9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIHJldHVybiBfc2VsZjsKIH0KIAogI2RlZmluZSBUaW1lQmFzZU9ial90cF9mcmVlIFB5T2JqZWN0X0RlbAogCiAKIFB5VHlwZU9iamVjdCBUaW1lQmFzZV9UeXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQotCTAsIC8qb2Jfc2l6ZSovCi0JIl9RdC5UaW1lQmFzZSIsIC8qdHBfbmFtZSovCi0Jc2l6ZW9mKFRpbWVCYXNlT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLwotCTAsIC8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcikgVGltZUJhc2VPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KLQkwLCAvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykgVGltZUJhc2VPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpIFRpbWVCYXNlT2JqX3JlcHIsIC8qdHBfcmVwciovCi0JKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLwotCShQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCi0JKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCi0JKGhhc2hmdW5jKSBUaW1lQmFzZU9ial9oYXNoLCAvKnRwX2hhc2gqLwotCTAsIC8qdHBfY2FsbCovCi0JMCwgLyp0cF9zdHIqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KLQlQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLwotCTAsIC8qdHBfYXNfYnVmZmVyKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQkwLCAvKnRwX2RvYyovCi0JMCwgLyp0cF90cmF2ZXJzZSovCi0JMCwgLyp0cF9jbGVhciovCi0JMCwgLyp0cF9yaWNoY29tcGFyZSovCi0JMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCi0JMCwgLyp0cF9pdGVyKi8KLQkwLCAvKnRwX2l0ZXJuZXh0Ki8KLQlUaW1lQmFzZU9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCi0JMCwgLyp0cF9tZW1iZXJzKi8KLQlUaW1lQmFzZU9ial9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCi0JMCwgLyp0cF9iYXNlKi8KLQkwLCAvKnRwX2RpY3QqLwotCTAsIC8qdHBfZGVzY3JfZ2V0Ki8KLQkwLCAvKnRwX2Rlc2NyX3NldCovCi0JMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KLQlUaW1lQmFzZU9ial90cF9pbml0LCAvKiB0cF9pbml0ICovCi0JVGltZUJhc2VPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCi0JVGltZUJhc2VPYmpfdHBfbmV3LCAvKiB0cF9uZXcgKi8KLQlUaW1lQmFzZU9ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgLypvYl9zaXplKi8KKyAgICAiX1F0LlRpbWVCYXNlIiwgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoVGltZUJhc2VPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKSBUaW1lQmFzZU9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgIDAsIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLworICAgIChzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLworICAgIChjbXBmdW5jKSBUaW1lQmFzZU9ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLworICAgIChyZXByZnVuYykgVGltZUJhc2VPYmpfcmVwciwgLyp0cF9yZXByKi8KKyAgICAoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCisgICAgKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAoaGFzaGZ1bmMpIFRpbWVCYXNlT2JqX2hhc2gsIC8qdHBfaGFzaCovCisgICAgMCwgLyp0cF9jYWxsKi8KKyAgICAwLCAvKnRwX3N0ciovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLworICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCisgICAgMCwgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLworICAgIDAsIC8qdHBfZG9jKi8KKyAgICAwLCAvKnRwX3RyYXZlcnNlKi8KKyAgICAwLCAvKnRwX2NsZWFyKi8KKyAgICAwLCAvKnRwX3JpY2hjb21wYXJlKi8KKyAgICAwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KKyAgICAwLCAvKnRwX2l0ZXIqLworICAgIDAsIC8qdHBfaXRlcm5leHQqLworICAgIFRpbWVCYXNlT2JqX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAvKnRwX21lbWJlcnMqLworICAgIFRpbWVCYXNlT2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KKyAgICAwLCAvKnRwX2Jhc2UqLworICAgIDAsIC8qdHBfZGljdCovCisgICAgMCwgLyp0cF9kZXNjcl9nZXQqLworICAgIDAsIC8qdHBfZGVzY3Jfc2V0Ki8KKyAgICAwLCAvKnRwX2RpY3RvZmZzZXQqLworICAgIFRpbWVCYXNlT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KKyAgICBUaW1lQmFzZU9ial90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KKyAgICBUaW1lQmFzZU9ial90cF9uZXcsIC8qIHRwX25ldyAqLworICAgIFRpbWVCYXNlT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tIEVuZCBvYmplY3QgdHlwZSBUaW1lQmFzZSAtLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMTgzOSwyOTQgKzE4MzksMjk0IEBACiAjZGVmaW5lIFVzZXJEYXRhT2JqX0NoZWNrKHgpICgoeCktPm9iX3R5cGUgPT0gJlVzZXJEYXRhX1R5cGUgfHwgUHlPYmplY3RfVHlwZUNoZWNrKCh4KSwgJlVzZXJEYXRhX1R5cGUpKQogCiB0eXBlZGVmIHN0cnVjdCBVc2VyRGF0YU9iamVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCVVzZXJEYXRhIG9iX2l0c2VsZjsKKyAgICBQeU9iamVjdF9IRUFECisgICAgVXNlckRhdGEgb2JfaXRzZWxmOwogfSBVc2VyRGF0YU9iamVjdDsKIAogUHlPYmplY3QgKlVzZXJEYXRhT2JqX05ldyhVc2VyRGF0YSBpdHNlbGYpCiB7Ci0JVXNlckRhdGFPYmplY3QgKml0OwotCWlmIChpdHNlbGYgPT0gTlVMTCkgewotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFF0X0Vycm9yLCJDYW5ub3QgY3JlYXRlIFVzZXJEYXRhIGZyb20gTlVMTCBwb2ludGVyIik7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLQkgICAgICAgICAgICAgICAgICAgICAgICB9Ci0JaXQgPSBQeU9iamVjdF9ORVcoVXNlckRhdGFPYmplY3QsICZVc2VyRGF0YV9UeXBlKTsKLQlpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgVXNlckRhdGFPYmplY3QgKml0OworICAgIGlmIChpdHNlbGYgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFF0X0Vycm9yLCJDYW5ub3QgY3JlYXRlIFVzZXJEYXRhIGZyb20gTlVMTCBwb2ludGVyIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgaXQgPSBQeU9iamVjdF9ORVcoVXNlckRhdGFPYmplY3QsICZVc2VyRGF0YV9UeXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiAKIGludCBVc2VyRGF0YU9ial9Db252ZXJ0KFB5T2JqZWN0ICp2LCBVc2VyRGF0YSAqcF9pdHNlbGYpCiB7Ci0JaWYgKHYgPT0gUHlfTm9uZSkKLQl7Ci0JCSpwX2l0c2VsZiA9IE5VTEw7Ci0JCXJldHVybiAxOwotCX0KLQlpZiAoIVVzZXJEYXRhT2JqX0NoZWNrKHYpKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIlVzZXJEYXRhIHJlcXVpcmVkIik7Ci0JCXJldHVybiAwOwotCX0KLQkqcF9pdHNlbGYgPSAoKFVzZXJEYXRhT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKLQlyZXR1cm4gMTsKKyAgICBpZiAodiA9PSBQeV9Ob25lKQorICAgIHsKKyAgICAgICAgKnBfaXRzZWxmID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmICghVXNlckRhdGFPYmpfQ2hlY2sodikpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiVXNlckRhdGEgcmVxdWlyZWQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICpwX2l0c2VsZiA9ICgoVXNlckRhdGFPYmplY3QgKil2KS0+b2JfaXRzZWxmOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgdm9pZCBVc2VyRGF0YU9ial9kZWFsbG9jKFVzZXJEYXRhT2JqZWN0ICpzZWxmKQogewotCWlmIChzZWxmLT5vYl9pdHNlbGYpIERpc3Bvc2VVc2VyRGF0YShzZWxmLT5vYl9pdHNlbGYpOwotCXNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CisgICAgaWYgKHNlbGYtPm9iX2l0c2VsZikgRGlzcG9zZVVzZXJEYXRhKHNlbGYtPm9iX2l0c2VsZik7CisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpVc2VyRGF0YU9ial9HZXRVc2VyRGF0YShVc2VyRGF0YU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlIYW5kbGUgZGF0YTsKLQlPU1R5cGUgdWRUeXBlOwotCWxvbmcgaW5kZXg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSGFuZGxlIGRhdGE7CisgICAgT1NUeXBlIHVkVHlwZTsKKyAgICBsb25nIGluZGV4OwogI2lmbmRlZiBHZXRVc2VyRGF0YQotCVB5TWFjX1BSRUNIRUNLKEdldFVzZXJEYXRhKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRVc2VyRGF0YSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdWRUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0VXNlckRhdGEoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgZGF0YSwKLQkgICAgICAgICAgICAgICAgICAgdWRUeXBlLAotCSAgICAgICAgICAgICAgICAgICBpbmRleCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnVkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZGV4KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldFVzZXJEYXRhKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgIHVkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlVzZXJEYXRhT2JqX0FkZFVzZXJEYXRhKFVzZXJEYXRhT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUhhbmRsZSBkYXRhOwotCU9TVHlwZSB1ZFR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSGFuZGxlIGRhdGE7CisgICAgT1NUeXBlIHVkVHlwZTsKICNpZm5kZWYgQWRkVXNlckRhdGEKLQlQeU1hY19QUkVDSEVDSyhBZGRVc2VyRGF0YSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQWRkVXNlckRhdGEpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdWRUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEFkZFVzZXJEYXRhKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgIGRhdGEsCi0JICAgICAgICAgICAgICAgICAgIHVkVHlwZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdWRUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFkZFVzZXJEYXRhKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgIHVkVHlwZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVXNlckRhdGFPYmpfUmVtb3ZlVXNlckRhdGEoVXNlckRhdGFPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JT1NUeXBlIHVkVHlwZTsKLQlsb25nIGluZGV4OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIE9TVHlwZSB1ZFR5cGU7CisgICAgbG9uZyBpbmRleDsKICNpZm5kZWYgUmVtb3ZlVXNlckRhdGEKLQlQeU1hY19QUkVDSEVDSyhSZW1vdmVVc2VyRGF0YSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUmVtb3ZlVXNlckRhdGEpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdWRUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUmVtb3ZlVXNlckRhdGEoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgdWRUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICBpbmRleCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdWRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUmVtb3ZlVXNlckRhdGEoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVXNlckRhdGFPYmpfQ291bnRVc2VyRGF0YVR5cGUoVXNlckRhdGFPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IF9ydjsKLQlPU1R5cGUgdWRUeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBfcnY7CisgICAgT1NUeXBlIHVkVHlwZTsKICNpZm5kZWYgQ291bnRVc2VyRGF0YVR5cGUKLQlQeU1hY19QUkVDSEVDSyhDb3VudFVzZXJEYXRhVHlwZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ291bnRVc2VyRGF0YVR5cGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ1ZFR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDb3VudFVzZXJEYXRhVHlwZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgIHVkVHlwZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ1ZFR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDb3VudFVzZXJEYXRhVHlwZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVkVHlwZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVXNlckRhdGFPYmpfR2V0TmV4dFVzZXJEYXRhVHlwZShVc2VyRGF0YU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBfcnY7Ci0JT1NUeXBlIHVkVHlwZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgbG9uZyBfcnY7CisgICAgT1NUeXBlIHVkVHlwZTsKICNpZm5kZWYgR2V0TmV4dFVzZXJEYXRhVHlwZQotCVB5TWFjX1BSRUNIRUNLKEdldE5leHRVc2VyRGF0YVR5cGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE5leHRVc2VyRGF0YVR5cGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ1ZFR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXROZXh0VXNlckRhdGFUeXBlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICB1ZFR5cGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdWRUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TmV4dFVzZXJEYXRhVHlwZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWRUeXBlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpVc2VyRGF0YU9ial9BZGRVc2VyRGF0YVRleHQoVXNlckRhdGFPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSGFuZGxlIGRhdGE7Ci0JT1NUeXBlIHVkVHlwZTsKLQlsb25nIGluZGV4OwotCXNob3J0IGl0bFJlZ2lvblRhZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBIYW5kbGUgZGF0YTsKKyAgICBPU1R5cGUgdWRUeXBlOworICAgIGxvbmcgaW5kZXg7CisgICAgc2hvcnQgaXRsUmVnaW9uVGFnOwogI2lmbmRlZiBBZGRVc2VyRGF0YVRleHQKLQlQeU1hY19QUkVDSEVDSyhBZGRVc2VyRGF0YVRleHQpOworICAgIFB5TWFjX1BSRUNIRUNLKEFkZFVzZXJEYXRhVGV4dCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbGgiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGEsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnVkVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluZGV4LAotCSAgICAgICAgICAgICAgICAgICAgICAmaXRsUmVnaW9uVGFnKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEFkZFVzZXJEYXRhVGV4dChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKLQkgICAgICAgICAgICAgICAgICAgICAgIHVkVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAotCSAgICAgICAgICAgICAgICAgICAgICAgaXRsUmVnaW9uVGFnKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnVkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRsUmVnaW9uVGFnKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFkZFVzZXJEYXRhVGV4dChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRsUmVnaW9uVGFnKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpVc2VyRGF0YU9ial9HZXRVc2VyRGF0YVRleHQoVXNlckRhdGFPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSGFuZGxlIGRhdGE7Ci0JT1NUeXBlIHVkVHlwZTsKLQlsb25nIGluZGV4OwotCXNob3J0IGl0bFJlZ2lvblRhZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBIYW5kbGUgZGF0YTsKKyAgICBPU1R5cGUgdWRUeXBlOworICAgIGxvbmcgaW5kZXg7CisgICAgc2hvcnQgaXRsUmVnaW9uVGFnOwogI2lmbmRlZiBHZXRVc2VyRGF0YVRleHQKLQlQeU1hY19QUkVDSEVDSyhHZXRVc2VyRGF0YVRleHQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFVzZXJEYXRhVGV4dCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbGgiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGEsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnVkVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluZGV4LAotCSAgICAgICAgICAgICAgICAgICAgICAmaXRsUmVnaW9uVGFnKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldFVzZXJEYXRhVGV4dChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKLQkgICAgICAgICAgICAgICAgICAgICAgIHVkVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAotCSAgICAgICAgICAgICAgICAgICAgICAgaXRsUmVnaW9uVGFnKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnVkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRsUmVnaW9uVGFnKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldFVzZXJEYXRhVGV4dChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRsUmVnaW9uVGFnKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpVc2VyRGF0YU9ial9SZW1vdmVVc2VyRGF0YVRleHQoVXNlckRhdGFPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JT1NUeXBlIHVkVHlwZTsKLQlsb25nIGluZGV4OwotCXNob3J0IGl0bFJlZ2lvblRhZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBPU1R5cGUgdWRUeXBlOworICAgIGxvbmcgaW5kZXg7CisgICAgc2hvcnQgaXRsUmVnaW9uVGFnOwogI2lmbmRlZiBSZW1vdmVVc2VyRGF0YVRleHQKLQlQeU1hY19QUkVDSEVDSyhSZW1vdmVVc2VyRGF0YVRleHQpOworICAgIFB5TWFjX1BSRUNIRUNLKFJlbW92ZVVzZXJEYXRhVGV4dCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdWRUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgICZpdGxSZWdpb25UYWcpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUmVtb3ZlVXNlckRhdGFUZXh0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICB1ZFR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGl0bFJlZ2lvblRhZyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnVkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRsUmVnaW9uVGFnKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFJlbW92ZVVzZXJEYXRhVGV4dChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGxSZWdpb25UYWcpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlVzZXJEYXRhT2JqX1B1dFVzZXJEYXRhSW50b0hhbmRsZShVc2VyRGF0YU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlIYW5kbGUgaDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBIYW5kbGUgaDsKICNpZm5kZWYgUHV0VXNlckRhdGFJbnRvSGFuZGxlCi0JUHlNYWNfUFJFQ0hFQ0soUHV0VXNlckRhdGFJbnRvSGFuZGxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhQdXRVc2VyRGF0YUludG9IYW5kbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmgpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUHV0VXNlckRhdGFJbnRvSGFuZGxlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBQdXRVc2VyRGF0YUludG9IYW5kbGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlVzZXJEYXRhT2JqX0NvcHlVc2VyRGF0YShVc2VyRGF0YU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlVc2VyRGF0YSBkc3RVc2VyRGF0YTsKLQlPU1R5cGUgY29weVJ1bGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgVXNlckRhdGEgZHN0VXNlckRhdGE7CisgICAgT1NUeXBlIGNvcHlSdWxlOwogI2lmbmRlZiBDb3B5VXNlckRhdGEKLQlQeU1hY19QUkVDSEVDSyhDb3B5VXNlckRhdGEpOworICAgIFB5TWFjX1BSRUNIRUNLKENvcHlVc2VyRGF0YSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgVXNlckRhdGFPYmpfQ29udmVydCwgJmRzdFVzZXJEYXRhLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjb3B5UnVsZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDb3B5VXNlckRhdGEoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgIGRzdFVzZXJEYXRhLAotCSAgICAgICAgICAgICAgICAgICAgY29weVJ1bGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VyRGF0YU9ial9Db252ZXJ0LCAmZHN0VXNlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNvcHlSdWxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENvcHlVc2VyRGF0YShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgZHN0VXNlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICBjb3B5UnVsZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBVc2VyRGF0YU9ial9tZXRob2RzW10gPSB7Ci0JeyJHZXRVc2VyRGF0YSIsIChQeUNGdW5jdGlvbilVc2VyRGF0YU9ial9HZXRVc2VyRGF0YSwgMSwKLQkgUHlEb2NfU1RSKCIoSGFuZGxlIGRhdGEsIE9TVHlwZSB1ZFR5cGUsIGxvbmcgaW5kZXgpIC0+IE5vbmUiKX0sCi0JeyJBZGRVc2VyRGF0YSIsIChQeUNGdW5jdGlvbilVc2VyRGF0YU9ial9BZGRVc2VyRGF0YSwgMSwKLQkgUHlEb2NfU1RSKCIoSGFuZGxlIGRhdGEsIE9TVHlwZSB1ZFR5cGUpIC0+IE5vbmUiKX0sCi0JeyJSZW1vdmVVc2VyRGF0YSIsIChQeUNGdW5jdGlvbilVc2VyRGF0YU9ial9SZW1vdmVVc2VyRGF0YSwgMSwKLQkgUHlEb2NfU1RSKCIoT1NUeXBlIHVkVHlwZSwgbG9uZyBpbmRleCkgLT4gTm9uZSIpfSwKLQl7IkNvdW50VXNlckRhdGFUeXBlIiwgKFB5Q0Z1bmN0aW9uKVVzZXJEYXRhT2JqX0NvdW50VXNlckRhdGFUeXBlLCAxLAotCSBQeURvY19TVFIoIihPU1R5cGUgdWRUeXBlKSAtPiAoc2hvcnQgX3J2KSIpfSwKLQl7IkdldE5leHRVc2VyRGF0YVR5cGUiLCAoUHlDRnVuY3Rpb24pVXNlckRhdGFPYmpfR2V0TmV4dFVzZXJEYXRhVHlwZSwgMSwKLQkgUHlEb2NfU1RSKCIoT1NUeXBlIHVkVHlwZSkgLT4gKGxvbmcgX3J2KSIpfSwKLQl7IkFkZFVzZXJEYXRhVGV4dCIsIChQeUNGdW5jdGlvbilVc2VyRGF0YU9ial9BZGRVc2VyRGF0YVRleHQsIDEsCi0JIFB5RG9jX1NUUigiKEhhbmRsZSBkYXRhLCBPU1R5cGUgdWRUeXBlLCBsb25nIGluZGV4LCBzaG9ydCBpdGxSZWdpb25UYWcpIC0+IE5vbmUiKX0sCi0JeyJHZXRVc2VyRGF0YVRleHQiLCAoUHlDRnVuY3Rpb24pVXNlckRhdGFPYmpfR2V0VXNlckRhdGFUZXh0LCAxLAotCSBQeURvY19TVFIoIihIYW5kbGUgZGF0YSwgT1NUeXBlIHVkVHlwZSwgbG9uZyBpbmRleCwgc2hvcnQgaXRsUmVnaW9uVGFnKSAtPiBOb25lIil9LAotCXsiUmVtb3ZlVXNlckRhdGFUZXh0IiwgKFB5Q0Z1bmN0aW9uKVVzZXJEYXRhT2JqX1JlbW92ZVVzZXJEYXRhVGV4dCwgMSwKLQkgUHlEb2NfU1RSKCIoT1NUeXBlIHVkVHlwZSwgbG9uZyBpbmRleCwgc2hvcnQgaXRsUmVnaW9uVGFnKSAtPiBOb25lIil9LAotCXsiUHV0VXNlckRhdGFJbnRvSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKVVzZXJEYXRhT2JqX1B1dFVzZXJEYXRhSW50b0hhbmRsZSwgMSwKLQkgUHlEb2NfU1RSKCIoSGFuZGxlIGgpIC0+IE5vbmUiKX0sCi0JeyJDb3B5VXNlckRhdGEiLCAoUHlDRnVuY3Rpb24pVXNlckRhdGFPYmpfQ29weVVzZXJEYXRhLCAxLAotCSBQeURvY19TVFIoIihVc2VyRGF0YSBkc3RVc2VyRGF0YSwgT1NUeXBlIGNvcHlSdWxlKSAtPiBOb25lIil9LAotCXtOVUxMLCBOVUxMLCAwfQorICAgIHsiR2V0VXNlckRhdGEiLCAoUHlDRnVuY3Rpb24pVXNlckRhdGFPYmpfR2V0VXNlckRhdGEsIDEsCisgICAgIFB5RG9jX1NUUigiKEhhbmRsZSBkYXRhLCBPU1R5cGUgdWRUeXBlLCBsb25nIGluZGV4KSAtPiBOb25lIil9LAorICAgIHsiQWRkVXNlckRhdGEiLCAoUHlDRnVuY3Rpb24pVXNlckRhdGFPYmpfQWRkVXNlckRhdGEsIDEsCisgICAgIFB5RG9jX1NUUigiKEhhbmRsZSBkYXRhLCBPU1R5cGUgdWRUeXBlKSAtPiBOb25lIil9LAorICAgIHsiUmVtb3ZlVXNlckRhdGEiLCAoUHlDRnVuY3Rpb24pVXNlckRhdGFPYmpfUmVtb3ZlVXNlckRhdGEsIDEsCisgICAgIFB5RG9jX1NUUigiKE9TVHlwZSB1ZFR5cGUsIGxvbmcgaW5kZXgpIC0+IE5vbmUiKX0sCisgICAgeyJDb3VudFVzZXJEYXRhVHlwZSIsIChQeUNGdW5jdGlvbilVc2VyRGF0YU9ial9Db3VudFVzZXJEYXRhVHlwZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoT1NUeXBlIHVkVHlwZSkgLT4gKHNob3J0IF9ydikiKX0sCisgICAgeyJHZXROZXh0VXNlckRhdGFUeXBlIiwgKFB5Q0Z1bmN0aW9uKVVzZXJEYXRhT2JqX0dldE5leHRVc2VyRGF0YVR5cGUsIDEsCisgICAgIFB5RG9jX1NUUigiKE9TVHlwZSB1ZFR5cGUpIC0+IChsb25nIF9ydikiKX0sCisgICAgeyJBZGRVc2VyRGF0YVRleHQiLCAoUHlDRnVuY3Rpb24pVXNlckRhdGFPYmpfQWRkVXNlckRhdGFUZXh0LCAxLAorICAgICBQeURvY19TVFIoIihIYW5kbGUgZGF0YSwgT1NUeXBlIHVkVHlwZSwgbG9uZyBpbmRleCwgc2hvcnQgaXRsUmVnaW9uVGFnKSAtPiBOb25lIil9LAorICAgIHsiR2V0VXNlckRhdGFUZXh0IiwgKFB5Q0Z1bmN0aW9uKVVzZXJEYXRhT2JqX0dldFVzZXJEYXRhVGV4dCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSGFuZGxlIGRhdGEsIE9TVHlwZSB1ZFR5cGUsIGxvbmcgaW5kZXgsIHNob3J0IGl0bFJlZ2lvblRhZykgLT4gTm9uZSIpfSwKKyAgICB7IlJlbW92ZVVzZXJEYXRhVGV4dCIsIChQeUNGdW5jdGlvbilVc2VyRGF0YU9ial9SZW1vdmVVc2VyRGF0YVRleHQsIDEsCisgICAgIFB5RG9jX1NUUigiKE9TVHlwZSB1ZFR5cGUsIGxvbmcgaW5kZXgsIHNob3J0IGl0bFJlZ2lvblRhZykgLT4gTm9uZSIpfSwKKyAgICB7IlB1dFVzZXJEYXRhSW50b0hhbmRsZSIsIChQeUNGdW5jdGlvbilVc2VyRGF0YU9ial9QdXRVc2VyRGF0YUludG9IYW5kbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEhhbmRsZSBoKSAtPiBOb25lIil9LAorICAgIHsiQ29weVVzZXJEYXRhIiwgKFB5Q0Z1bmN0aW9uKVVzZXJEYXRhT2JqX0NvcHlVc2VyRGF0YSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVXNlckRhdGEgZHN0VXNlckRhdGEsIE9TVHlwZSBjb3B5UnVsZSkgLT4gTm9uZSIpfSwKKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKICNkZWZpbmUgVXNlckRhdGFPYmpfZ2V0c2V0bGlzdCBOVUxMCkBAIC0yMTQzLDYxICsyMTQzLDYxIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqVXNlckRhdGFPYmpfdHBfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKl9hcmdzLCBQeU9iamVjdCAqX2t3ZHMpCiB7Ci0JUHlPYmplY3QgKl9zZWxmOwotCVVzZXJEYXRhIGl0c2VsZjsKLQljaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKKyAgICBQeU9iamVjdCAqX3NlbGY7CisgICAgVXNlckRhdGEgaXRzZWxmOworICAgIGNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgVXNlckRhdGFPYmpfQ29udmVydCwgJml0c2VsZikpIHJldHVybiBOVUxMOwotCWlmICgoX3NlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JKChVc2VyRGF0YU9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiBfc2VsZjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBVc2VyRGF0YU9ial9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAoKFVzZXJEYXRhT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgcmV0dXJuIF9zZWxmOwogfQogCiAjZGVmaW5lIFVzZXJEYXRhT2JqX3RwX2ZyZWUgUHlPYmplY3RfRGVsCiAKIAogUHlUeXBlT2JqZWN0IFVzZXJEYXRhX1R5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCi0JMCwgLypvYl9zaXplKi8KLQkiX1F0LlVzZXJEYXRhIiwgLyp0cF9uYW1lKi8KLQlzaXplb2YoVXNlckRhdGFPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCi0JMCwgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKSBVc2VyRGF0YU9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsIC8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLwotCShjbXBmdW5jKSBVc2VyRGF0YU9ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYykgVXNlckRhdGFPYmpfcmVwciwgLyp0cF9yZXByKi8KLQkoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCi0JKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpIFVzZXJEYXRhT2JqX2hhc2gsIC8qdHBfaGFzaCovCi0JMCwgLyp0cF9jYWxsKi8KLQkwLCAvKnRwX3N0ciovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLwotCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCi0JMCwgLyp0cF9hc19idWZmZXIqLwotCVB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCTAsIC8qdHBfZG9jKi8KLQkwLCAvKnRwX3RyYXZlcnNlKi8KLQkwLCAvKnRwX2NsZWFyKi8KLQkwLCAvKnRwX3JpY2hjb21wYXJlKi8KLQkwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLQkwLCAvKnRwX2l0ZXIqLwotCTAsIC8qdHBfaXRlcm5leHQqLwotCVVzZXJEYXRhT2JqX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KLQkwLCAvKnRwX21lbWJlcnMqLwotCVVzZXJEYXRhT2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KLQkwLCAvKnRwX2Jhc2UqLwotCTAsIC8qdHBfZGljdCovCi0JMCwgLyp0cF9kZXNjcl9nZXQqLwotCTAsIC8qdHBfZGVzY3Jfc2V0Ki8KLQkwLCAvKnRwX2RpY3RvZmZzZXQqLwotCVVzZXJEYXRhT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KLQlVc2VyRGF0YU9ial90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KLQlVc2VyRGF0YU9ial90cF9uZXcsIC8qIHRwX25ldyAqLwotCVVzZXJEYXRhT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAvKm9iX3NpemUqLworICAgICJfUXQuVXNlckRhdGEiLCAvKnRwX25hbWUqLworICAgIHNpemVvZihVc2VyRGF0YU9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpIFVzZXJEYXRhT2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgMCwgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCisgICAgKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCisgICAgKGNtcGZ1bmMpIFVzZXJEYXRhT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCisgICAgKHJlcHJmdW5jKSBVc2VyRGF0YU9ial9yZXByLCAvKnRwX3JlcHIqLworICAgIChQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIChQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLworICAgIChoYXNoZnVuYykgVXNlckRhdGFPYmpfaGFzaCwgLyp0cF9oYXNoKi8KKyAgICAwLCAvKnRwX2NhbGwqLworICAgIDAsIC8qdHBfc3RyKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCisgICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgMCwgLyp0cF9kb2MqLworICAgIDAsIC8qdHBfdHJhdmVyc2UqLworICAgIDAsIC8qdHBfY2xlYXIqLworICAgIDAsIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsIC8qdHBfaXRlciovCisgICAgMCwgLyp0cF9pdGVybmV4dCovCisgICAgVXNlckRhdGFPYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLworICAgIDAsIC8qdHBfbWVtYmVycyovCisgICAgVXNlckRhdGFPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLworICAgIDAsIC8qdHBfYmFzZSovCisgICAgMCwgLyp0cF9kaWN0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX2dldCovCisgICAgMCwgLyp0cF9kZXNjcl9zZXQqLworICAgIDAsIC8qdHBfZGljdG9mZnNldCovCisgICAgVXNlckRhdGFPYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLworICAgIFVzZXJEYXRhT2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLworICAgIFVzZXJEYXRhT2JqX3RwX25ldywgLyogdHBfbmV3ICovCisgICAgVXNlckRhdGFPYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0gRW5kIG9iamVjdCB0eXBlIFVzZXJEYXRhIC0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0yMjEwLDExNjUgKzIyMTAsMTE2NSBAQAogI2RlZmluZSBNZWRpYU9ial9DaGVjayh4KSAoKHgpLT5vYl90eXBlID09ICZNZWRpYV9UeXBlIHx8IFB5T2JqZWN0X1R5cGVDaGVjaygoeCksICZNZWRpYV9UeXBlKSkKIAogdHlwZWRlZiBzdHJ1Y3QgTWVkaWFPYmplY3QgewotCVB5T2JqZWN0X0hFQUQKLQlNZWRpYSBvYl9pdHNlbGY7CisgICAgUHlPYmplY3RfSEVBRAorICAgIE1lZGlhIG9iX2l0c2VsZjsKIH0gTWVkaWFPYmplY3Q7CiAKIFB5T2JqZWN0ICpNZWRpYU9ial9OZXcoTWVkaWEgaXRzZWxmKQogewotCU1lZGlhT2JqZWN0ICppdDsKLQlpZiAoaXRzZWxmID09IE5VTEwpIHsKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhRdF9FcnJvciwiQ2Fubm90IGNyZWF0ZSBNZWRpYSBmcm9tIE5VTEwgcG9pbnRlciIpOwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgfQotCWl0ID0gUHlPYmplY3RfTkVXKE1lZGlhT2JqZWN0LCAmTWVkaWFfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOwotCWl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIE1lZGlhT2JqZWN0ICppdDsKKyAgICBpZiAoaXRzZWxmID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhRdF9FcnJvciwiQ2Fubm90IGNyZWF0ZSBNZWRpYSBmcm9tIE5VTEwgcG9pbnRlciIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgIGl0ID0gUHlPYmplY3RfTkVXKE1lZGlhT2JqZWN0LCAmTWVkaWFfVHlwZSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIGl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogCiBpbnQgTWVkaWFPYmpfQ29udmVydChQeU9iamVjdCAqdiwgTWVkaWEgKnBfaXRzZWxmKQogewotCWlmICh2ID09IFB5X05vbmUpCi0JewotCQkqcF9pdHNlbGYgPSBOVUxMOwotCQlyZXR1cm4gMTsKLQl9Ci0JaWYgKCFNZWRpYU9ial9DaGVjayh2KSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJNZWRpYSByZXF1aXJlZCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JKnBfaXRzZWxmID0gKChNZWRpYU9iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0JcmV0dXJuIDE7CisgICAgaWYgKHYgPT0gUHlfTm9uZSkKKyAgICB7CisgICAgICAgICpwX2l0c2VsZiA9IE5VTEw7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAoIU1lZGlhT2JqX0NoZWNrKHYpKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIk1lZGlhIHJlcXVpcmVkIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAqcF9pdHNlbGYgPSAoKE1lZGlhT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIHZvaWQgTWVkaWFPYmpfZGVhbGxvYyhNZWRpYU9iamVjdCAqc2VsZikKIHsKLQlpZiAoc2VsZi0+b2JfaXRzZWxmKSBEaXNwb3NlVHJhY2tNZWRpYShzZWxmLT5vYl9pdHNlbGYpOwotCXNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CisgICAgaWYgKHNlbGYtPm9iX2l0c2VsZikgRGlzcG9zZVRyYWNrTWVkaWEoc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lZGlhT2JqX0xvYWRNZWRpYUludG9SYW0oTWVkaWFPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JVGltZVZhbHVlIHRpbWU7Ci0JVGltZVZhbHVlIGR1cmF0aW9uOwotCWxvbmcgZmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgVGltZVZhbHVlIHRpbWU7CisgICAgVGltZVZhbHVlIGR1cmF0aW9uOworICAgIGxvbmcgZmxhZ3M7CiAjaWZuZGVmIExvYWRNZWRpYUludG9SYW0KLQlQeU1hY19QUkVDSEVDSyhMb2FkTWVkaWFJbnRvUmFtKTsKKyAgICBQeU1hY19QUkVDSEVDSyhMb2FkTWVkaWFJbnRvUmFtKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAmZHVyYXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBMb2FkTWVkaWFJbnRvUmFtKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgdGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IExvYWRNZWRpYUludG9SYW0oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZWRpYU9ial9HZXRNZWRpYVRyYWNrKE1lZGlhT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlUcmFjayBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFRyYWNrIF9ydjsKICNpZm5kZWYgR2V0TWVkaWFUcmFjawotCVB5TWFjX1BSRUNIRUNLKEdldE1lZGlhVHJhY2spOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1lZGlhVHJhY2spOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldE1lZGlhVHJhY2soX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE1lZGlhVHJhY2soX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVkaWFPYmpfR2V0TWVkaWFDcmVhdGlvblRpbWUoTWVkaWFPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXVuc2lnbmVkIGxvbmcgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICB1bnNpZ25lZCBsb25nIF9ydjsKICNpZm5kZWYgR2V0TWVkaWFDcmVhdGlvblRpbWUKLQlQeU1hY19QUkVDSEVDSyhHZXRNZWRpYUNyZWF0aW9uVGltZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TWVkaWFDcmVhdGlvblRpbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldE1lZGlhQ3JlYXRpb25UaW1lKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRNZWRpYUNyZWF0aW9uVGltZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZWRpYU9ial9HZXRNZWRpYU1vZGlmaWNhdGlvblRpbWUoTWVkaWFPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXVuc2lnbmVkIGxvbmcgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICB1bnNpZ25lZCBsb25nIF9ydjsKICNpZm5kZWYgR2V0TWVkaWFNb2RpZmljYXRpb25UaW1lCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TWVkaWFNb2RpZmljYXRpb25UaW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNZWRpYU1vZGlmaWNhdGlvblRpbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldE1lZGlhTW9kaWZpY2F0aW9uVGltZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TWVkaWFNb2RpZmljYXRpb25UaW1lKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lZGlhT2JqX0dldE1lZGlhVGltZVNjYWxlKE1lZGlhT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlUaW1lU2NhbGUgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBUaW1lU2NhbGUgX3J2OwogI2lmbmRlZiBHZXRNZWRpYVRpbWVTY2FsZQotCVB5TWFjX1BSRUNIRUNLKEdldE1lZGlhVGltZVNjYWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNZWRpYVRpbWVTY2FsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TWVkaWFUaW1lU2NhbGUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE1lZGlhVGltZVNjYWxlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lZGlhT2JqX1NldE1lZGlhVGltZVNjYWxlKE1lZGlhT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlUaW1lU2NhbGUgdGltZVNjYWxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBUaW1lU2NhbGUgdGltZVNjYWxlOwogI2lmbmRlZiBTZXRNZWRpYVRpbWVTY2FsZQotCVB5TWFjX1BSRUNIRUNLKFNldE1lZGlhVGltZVNjYWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRNZWRpYVRpbWVTY2FsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRpbWVTY2FsZSkpCi0JCXJldHVybiBOVUxMOwotCVNldE1lZGlhVGltZVNjYWxlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgdGltZVNjYWxlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aW1lU2NhbGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRNZWRpYVRpbWVTY2FsZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgIHRpbWVTY2FsZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lZGlhT2JqX0dldE1lZGlhRHVyYXRpb24oTWVkaWFPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVRpbWVWYWx1ZSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFRpbWVWYWx1ZSBfcnY7CiAjaWZuZGVmIEdldE1lZGlhRHVyYXRpb24KLQlQeU1hY19QUkVDSEVDSyhHZXRNZWRpYUR1cmF0aW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNZWRpYUR1cmF0aW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRNZWRpYUR1cmF0aW9uKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRNZWRpYUR1cmF0aW9uKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lZGlhT2JqX0dldE1lZGlhTGFuZ3VhZ2UoTWVkaWFPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgX3J2OwogI2lmbmRlZiBHZXRNZWRpYUxhbmd1YWdlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TWVkaWFMYW5ndWFnZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TWVkaWFMYW5ndWFnZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TWVkaWFMYW5ndWFnZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TWVkaWFMYW5ndWFnZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZWRpYU9ial9TZXRNZWRpYUxhbmd1YWdlKE1lZGlhT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBsYW5ndWFnZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgbGFuZ3VhZ2U7CiAjaWZuZGVmIFNldE1lZGlhTGFuZ3VhZ2UKLQlQeU1hY19QUkVDSEVDSyhTZXRNZWRpYUxhbmd1YWdlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRNZWRpYUxhbmd1YWdlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmbGFuZ3VhZ2UpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRNZWRpYUxhbmd1YWdlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICBsYW5ndWFnZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbGFuZ3VhZ2UpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRNZWRpYUxhbmd1YWdlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lZGlhT2JqX0dldE1lZGlhUXVhbGl0eShNZWRpYU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBfcnY7CiAjaWZuZGVmIEdldE1lZGlhUXVhbGl0eQotCVB5TWFjX1BSRUNIRUNLKEdldE1lZGlhUXVhbGl0eSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TWVkaWFRdWFsaXR5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRNZWRpYVF1YWxpdHkoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE1lZGlhUXVhbGl0eShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZWRpYU9ial9TZXRNZWRpYVF1YWxpdHkoTWVkaWFPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IHF1YWxpdHk7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IHF1YWxpdHk7CiAjaWZuZGVmIFNldE1lZGlhUXVhbGl0eQotCVB5TWFjX1BSRUNIRUNLKFNldE1lZGlhUXVhbGl0eSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TWVkaWFRdWFsaXR5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcXVhbGl0eSkpCi0JCXJldHVybiBOVUxMOwotCVNldE1lZGlhUXVhbGl0eShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICBxdWFsaXR5KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZxdWFsaXR5KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0TWVkaWFRdWFsaXR5KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgIHF1YWxpdHkpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZWRpYU9ial9HZXRNZWRpYUhhbmRsZXJEZXNjcmlwdGlvbihNZWRpYU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NUeXBlIG1lZGlhVHlwZTsKLQlTdHIyNTUgY3JlYXRvck5hbWU7Ci0JT1NUeXBlIGNyZWF0b3JNYW51ZmFjdHVyZXI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TVHlwZSBtZWRpYVR5cGU7CisgICAgU3RyMjU1IGNyZWF0b3JOYW1lOworICAgIE9TVHlwZSBjcmVhdG9yTWFudWZhY3R1cmVyOwogI2lmbmRlZiBHZXRNZWRpYUhhbmRsZXJEZXNjcmlwdGlvbgotCVB5TWFjX1BSRUNIRUNLKEdldE1lZGlhSGFuZGxlckRlc2NyaXB0aW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNZWRpYUhhbmRsZXJEZXNjcmlwdGlvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgY3JlYXRvck5hbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlHZXRNZWRpYUhhbmRsZXJEZXNjcmlwdGlvbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZWRpYVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRvck5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNyZWF0b3JNYW51ZmFjdHVyZXIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgbWVkaWFUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBjcmVhdG9yTWFudWZhY3R1cmVyKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgY3JlYXRvck5hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRNZWRpYUhhbmRsZXJEZXNjcmlwdGlvbihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZWRpYVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRvck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNyZWF0b3JNYW51ZmFjdHVyZXIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgbWVkaWFUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBjcmVhdG9yTWFudWZhY3R1cmVyKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZWRpYU9ial9HZXRNZWRpYVVzZXJEYXRhKE1lZGlhT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlVc2VyRGF0YSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFVzZXJEYXRhIF9ydjsKICNpZm5kZWYgR2V0TWVkaWFVc2VyRGF0YQotCVB5TWFjX1BSRUNIRUNLKEdldE1lZGlhVXNlckRhdGEpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1lZGlhVXNlckRhdGEpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldE1lZGlhVXNlckRhdGEoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBVc2VyRGF0YU9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE1lZGlhVXNlckRhdGEoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBVc2VyRGF0YU9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVkaWFPYmpfR2V0TWVkaWFIYW5kbGVyKE1lZGlhT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlNZWRpYUhhbmRsZXIgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBNZWRpYUhhbmRsZXIgX3J2OwogI2lmbmRlZiBHZXRNZWRpYUhhbmRsZXIKLQlQeU1hY19QUkVDSEVDSyhHZXRNZWRpYUhhbmRsZXIpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1lZGlhSGFuZGxlcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TWVkaWFIYW5kbGVyKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE1lZGlhSGFuZGxlcihfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lZGlhT2JqX1NldE1lZGlhSGFuZGxlcihNZWRpYU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlNZWRpYUhhbmRsZXJDb21wb25lbnQgbUg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgTWVkaWFIYW5kbGVyQ29tcG9uZW50IG1IOwogI2lmbmRlZiBTZXRNZWRpYUhhbmRsZXIKLQlQeU1hY19QUkVDSEVDSyhTZXRNZWRpYUhhbmRsZXIpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldE1lZGlhSGFuZGxlcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcE9ial9Db252ZXJ0LCAmbUgpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0TWVkaWFIYW5kbGVyKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICBtSCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBPYmpfQ29udmVydCwgJm1IKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldE1lZGlhSGFuZGxlcihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbUgpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lZGlhT2JqX0JlZ2luTWVkaWFFZGl0cyhNZWRpYU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKICNpZm5kZWYgQmVnaW5NZWRpYUVkaXRzCi0JUHlNYWNfUFJFQ0hFQ0soQmVnaW5NZWRpYUVkaXRzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhCZWdpbk1lZGlhRWRpdHMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBCZWdpbk1lZGlhRWRpdHMoX3NlbGYtPm9iX2l0c2VsZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBCZWdpbk1lZGlhRWRpdHMoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVkaWFPYmpfRW5kTWVkaWFFZGl0cyhNZWRpYU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKICNpZm5kZWYgRW5kTWVkaWFFZGl0cwotCVB5TWFjX1BSRUNIRUNLKEVuZE1lZGlhRWRpdHMpOworICAgIFB5TWFjX1BSRUNIRUNLKEVuZE1lZGlhRWRpdHMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBFbmRNZWRpYUVkaXRzKF9zZWxmLT5vYl9pdHNlbGYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRW5kTWVkaWFFZGl0cyhfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZWRpYU9ial9TZXRNZWRpYURlZmF1bHREYXRhUmVmSW5kZXgoTWVkaWFPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0Jc2hvcnQgaW5kZXg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgc2hvcnQgaW5kZXg7CiAjaWZuZGVmIFNldE1lZGlhRGVmYXVsdERhdGFSZWZJbmRleAotCVB5TWFjX1BSRUNIRUNLKFNldE1lZGlhRGVmYXVsdERhdGFSZWZJbmRleCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TWVkaWFEZWZhdWx0RGF0YVJlZkluZGV4KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0TWVkaWFEZWZhdWx0RGF0YVJlZkluZGV4KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRNZWRpYURlZmF1bHREYXRhUmVmSW5kZXgoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZWRpYU9ial9HZXRNZWRpYURhdGFIYW5kbGVyRGVzY3JpcHRpb24oTWVkaWFPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IGluZGV4OwotCU9TVHlwZSBkaFR5cGU7Ci0JU3RyMjU1IGNyZWF0b3JOYW1lOwotCU9TVHlwZSBjcmVhdG9yTWFudWZhY3R1cmVyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBpbmRleDsKKyAgICBPU1R5cGUgZGhUeXBlOworICAgIFN0cjI1NSBjcmVhdG9yTmFtZTsKKyAgICBPU1R5cGUgY3JlYXRvck1hbnVmYWN0dXJlcjsKICNpZm5kZWYgR2V0TWVkaWFEYXRhSGFuZGxlckRlc2NyaXB0aW9uCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TWVkaWFEYXRhSGFuZGxlckRlc2NyaXB0aW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNZWRpYURhdGFIYW5kbGVyRGVzY3JpcHRpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluZGV4LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIGNyZWF0b3JOYW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0TWVkaWFEYXRhSGFuZGxlckRlc2NyaXB0aW9uKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGhUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdG9yTmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNyZWF0b3JNYW51ZmFjdHVyZXIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgZGhUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBjcmVhdG9yTWFudWZhY3R1cmVyKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgY3JlYXRvck5hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRNZWRpYURhdGFIYW5kbGVyRGVzY3JpcHRpb24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkaFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0b3JOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3JlYXRvck1hbnVmYWN0dXJlcik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBkaFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIGNyZWF0b3JNYW51ZmFjdHVyZXIpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lZGlhT2JqX0dldE1lZGlhRGF0YUhhbmRsZXIoTWVkaWFPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCURhdGFIYW5kbGVyIF9ydjsKLQlzaG9ydCBpbmRleDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgRGF0YUhhbmRsZXIgX3J2OworICAgIHNob3J0IGluZGV4OwogI2lmbmRlZiBHZXRNZWRpYURhdGFIYW5kbGVyCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TWVkaWFEYXRhSGFuZGxlcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TWVkaWFEYXRhSGFuZGxlcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluZGV4KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TWVkaWFEYXRhSGFuZGxlcihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE1lZGlhRGF0YUhhbmRsZXIoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lZGlhT2JqX1NldE1lZGlhRGF0YUhhbmRsZXIoTWVkaWFPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0Jc2hvcnQgaW5kZXg7Ci0JRGF0YUhhbmRsZXJDb21wb25lbnQgZGF0YUhhbmRsZXI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgc2hvcnQgaW5kZXg7CisgICAgRGF0YUhhbmRsZXJDb21wb25lbnQgZGF0YUhhbmRsZXI7CiAjaWZuZGVmIFNldE1lZGlhRGF0YUhhbmRsZXIKLQlQeU1hY19QUkVDSEVDSyhTZXRNZWRpYURhdGFIYW5kbGVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRNZWRpYURhdGFIYW5kbGVyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wT2JqX0NvbnZlcnQsICZkYXRhSGFuZGxlcikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRNZWRpYURhdGFIYW5kbGVyKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUhhbmRsZXIpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wT2JqX0NvbnZlcnQsICZkYXRhSGFuZGxlcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRNZWRpYURhdGFIYW5kbGVyKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUhhbmRsZXIpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lZGlhT2JqX0dldE1lZGlhU2FtcGxlRGVzY3JpcHRpb25Db3VudChNZWRpYU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgX3J2OwogI2lmbmRlZiBHZXRNZWRpYVNhbXBsZURlc2NyaXB0aW9uQ291bnQKLQlQeU1hY19QUkVDSEVDSyhHZXRNZWRpYVNhbXBsZURlc2NyaXB0aW9uQ291bnQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1lZGlhU2FtcGxlRGVzY3JpcHRpb25Db3VudCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TWVkaWFTYW1wbGVEZXNjcmlwdGlvbkNvdW50KF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRNZWRpYVNhbXBsZURlc2NyaXB0aW9uQ291bnQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVkaWFPYmpfR2V0TWVkaWFTYW1wbGVEZXNjcmlwdGlvbihNZWRpYU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBpbmRleDsKLQlTYW1wbGVEZXNjcmlwdGlvbkhhbmRsZSBkZXNjSDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgbG9uZyBpbmRleDsKKyAgICBTYW1wbGVEZXNjcmlwdGlvbkhhbmRsZSBkZXNjSDsKICNpZm5kZWYgR2V0TWVkaWFTYW1wbGVEZXNjcmlwdGlvbgotCVB5TWFjX1BSRUNIRUNLKEdldE1lZGlhU2FtcGxlRGVzY3JpcHRpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1lZGlhU2FtcGxlRGVzY3JpcHRpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluZGV4LAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRlc2NIKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0TWVkaWFTYW1wbGVEZXNjcmlwdGlvbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjSCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkZXNjSCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldE1lZGlhU2FtcGxlRGVzY3JpcHRpb24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY0gpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZWRpYU9ial9TZXRNZWRpYVNhbXBsZURlc2NyaXB0aW9uKE1lZGlhT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCWxvbmcgaW5kZXg7Ci0JU2FtcGxlRGVzY3JpcHRpb25IYW5kbGUgZGVzY0g7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgbG9uZyBpbmRleDsKKyAgICBTYW1wbGVEZXNjcmlwdGlvbkhhbmRsZSBkZXNjSDsKICNpZm5kZWYgU2V0TWVkaWFTYW1wbGVEZXNjcmlwdGlvbgotCVB5TWFjX1BSRUNIRUNLKFNldE1lZGlhU2FtcGxlRGVzY3JpcHRpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKFNldE1lZGlhU2FtcGxlRGVzY3JpcHRpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluZGV4LAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRlc2NIKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldE1lZGlhU2FtcGxlRGVzY3JpcHRpb24oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjSCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRlc2NIKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldE1lZGlhU2FtcGxlRGVzY3JpcHRpb24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjSCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVkaWFPYmpfR2V0TWVkaWFTYW1wbGVDb3VudChNZWRpYU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgX3J2OwogI2lmbmRlZiBHZXRNZWRpYVNhbXBsZUNvdW50Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0TWVkaWFTYW1wbGVDb3VudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TWVkaWFTYW1wbGVDb3VudCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TWVkaWFTYW1wbGVDb3VudChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TWVkaWFTYW1wbGVDb3VudChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZWRpYU9ial9HZXRNZWRpYVN5bmNTYW1wbGVDb3VudChNZWRpYU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgX3J2OwogI2lmbmRlZiBHZXRNZWRpYVN5bmNTYW1wbGVDb3VudAotCVB5TWFjX1BSRUNIRUNLKEdldE1lZGlhU3luY1NhbXBsZUNvdW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNZWRpYVN5bmNTYW1wbGVDb3VudCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TWVkaWFTeW5jU2FtcGxlQ291bnQoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE1lZGlhU3luY1NhbXBsZUNvdW50KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lZGlhT2JqX1NhbXBsZU51bVRvTWVkaWFUaW1lKE1lZGlhT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIGxvZ2ljYWxTYW1wbGVOdW07Ci0JVGltZVZhbHVlIHNhbXBsZVRpbWU7Ci0JVGltZVZhbHVlIHNhbXBsZUR1cmF0aW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBsb25nIGxvZ2ljYWxTYW1wbGVOdW07CisgICAgVGltZVZhbHVlIHNhbXBsZVRpbWU7CisgICAgVGltZVZhbHVlIHNhbXBsZUR1cmF0aW9uOwogI2lmbmRlZiBTYW1wbGVOdW1Ub01lZGlhVGltZQotCVB5TWFjX1BSRUNIRUNLKFNhbXBsZU51bVRvTWVkaWFUaW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTYW1wbGVOdW1Ub01lZGlhVGltZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmxvZ2ljYWxTYW1wbGVOdW0pKQotCQlyZXR1cm4gTlVMTDsKLQlTYW1wbGVOdW1Ub01lZGlhVGltZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgIGxvZ2ljYWxTYW1wbGVOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZVRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZUR1cmF0aW9uKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgc2FtcGxlRHVyYXRpb24pOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbG9naWNhbFNhbXBsZU51bSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNhbXBsZU51bVRvTWVkaWFUaW1lKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgbG9naWNhbFNhbXBsZU51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlRHVyYXRpb24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVEdXJhdGlvbik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVkaWFPYmpfTWVkaWFUaW1lVG9TYW1wbGVOdW0oTWVkaWFPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVRpbWVWYWx1ZSB0aW1lOwotCWxvbmcgc2FtcGxlTnVtOwotCVRpbWVWYWx1ZSBzYW1wbGVUaW1lOwotCVRpbWVWYWx1ZSBzYW1wbGVEdXJhdGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVGltZVZhbHVlIHRpbWU7CisgICAgbG9uZyBzYW1wbGVOdW07CisgICAgVGltZVZhbHVlIHNhbXBsZVRpbWU7CisgICAgVGltZVZhbHVlIHNhbXBsZUR1cmF0aW9uOwogI2lmbmRlZiBNZWRpYVRpbWVUb1NhbXBsZU51bQotCVB5TWFjX1BSRUNIRUNLKE1lZGlhVGltZVRvU2FtcGxlTnVtKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYVRpbWVUb1NhbXBsZU51bSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRpbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlNZWRpYVRpbWVUb1NhbXBsZU51bShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgIHRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZU51bSwKLQkgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlVGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlRHVyYXRpb24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbGwiLAotCSAgICAgICAgICAgICAgICAgICAgIHNhbXBsZU51bSwKLQkgICAgICAgICAgICAgICAgICAgICBzYW1wbGVUaW1lLAotCSAgICAgICAgICAgICAgICAgICAgIHNhbXBsZUR1cmF0aW9uKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRpbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNZWRpYVRpbWVUb1NhbXBsZU51bShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZU51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlRHVyYXRpb24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZU51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZUR1cmF0aW9uKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZWRpYU9ial9BZGRNZWRpYVNhbXBsZShNZWRpYU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlIYW5kbGUgZGF0YUluOwotCWxvbmcgaW5PZmZzZXQ7Ci0JdW5zaWduZWQgbG9uZyBzaXplOwotCVRpbWVWYWx1ZSBkdXJhdGlvblBlclNhbXBsZTsKLQlTYW1wbGVEZXNjcmlwdGlvbkhhbmRsZSBzYW1wbGVEZXNjcmlwdGlvbkg7Ci0JbG9uZyBudW1iZXJPZlNhbXBsZXM7Ci0Jc2hvcnQgc2FtcGxlRmxhZ3M7Ci0JVGltZVZhbHVlIHNhbXBsZVRpbWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSGFuZGxlIGRhdGFJbjsKKyAgICBsb25nIGluT2Zmc2V0OworICAgIHVuc2lnbmVkIGxvbmcgc2l6ZTsKKyAgICBUaW1lVmFsdWUgZHVyYXRpb25QZXJTYW1wbGU7CisgICAgU2FtcGxlRGVzY3JpcHRpb25IYW5kbGUgc2FtcGxlRGVzY3JpcHRpb25IOworICAgIGxvbmcgbnVtYmVyT2ZTYW1wbGVzOworICAgIHNob3J0IHNhbXBsZUZsYWdzOworICAgIFRpbWVWYWx1ZSBzYW1wbGVUaW1lOwogI2lmbmRlZiBBZGRNZWRpYVNhbXBsZQotCVB5TWFjX1BSRUNIRUNLKEFkZE1lZGlhU2FtcGxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBZGRNZWRpYVNhbXBsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsbE8mbGgiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFJbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluT2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmR1cmF0aW9uUGVyU2FtcGxlLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNhbXBsZURlc2NyaXB0aW9uSCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm51bWJlck9mU2FtcGxlcywKLQkgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZUZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEFkZE1lZGlhU2FtcGxlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgIGRhdGFJbiwKLQkgICAgICAgICAgICAgICAgICAgICAgaW5PZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgIHNpemUsCi0JICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uUGVyU2FtcGxlLAotCSAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVEZXNjcmlwdGlvbkgsCi0JICAgICAgICAgICAgICAgICAgICAgIG51bWJlck9mU2FtcGxlcywKLQkgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlRmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGVUaW1lKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBzYW1wbGVUaW1lKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsbE8mbGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmR1cmF0aW9uUGVyU2FtcGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNhbXBsZURlc2NyaXB0aW9uSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm51bWJlck9mU2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZUZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFkZE1lZGlhU2FtcGxlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW5PZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uUGVyU2FtcGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVEZXNjcmlwdGlvbkgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlck9mU2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGVUaW1lKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVUaW1lKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZWRpYU9ial9BZGRNZWRpYVNhbXBsZVJlZmVyZW5jZShNZWRpYU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlsb25nIGRhdGFPZmZzZXQ7Ci0JdW5zaWduZWQgbG9uZyBzaXplOwotCVRpbWVWYWx1ZSBkdXJhdGlvblBlclNhbXBsZTsKLQlTYW1wbGVEZXNjcmlwdGlvbkhhbmRsZSBzYW1wbGVEZXNjcmlwdGlvbkg7Ci0JbG9uZyBudW1iZXJPZlNhbXBsZXM7Ci0Jc2hvcnQgc2FtcGxlRmxhZ3M7Ci0JVGltZVZhbHVlIHNhbXBsZVRpbWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgbG9uZyBkYXRhT2Zmc2V0OworICAgIHVuc2lnbmVkIGxvbmcgc2l6ZTsKKyAgICBUaW1lVmFsdWUgZHVyYXRpb25QZXJTYW1wbGU7CisgICAgU2FtcGxlRGVzY3JpcHRpb25IYW5kbGUgc2FtcGxlRGVzY3JpcHRpb25IOworICAgIGxvbmcgbnVtYmVyT2ZTYW1wbGVzOworICAgIHNob3J0IHNhbXBsZUZsYWdzOworICAgIFRpbWVWYWx1ZSBzYW1wbGVUaW1lOwogI2lmbmRlZiBBZGRNZWRpYVNhbXBsZVJlZmVyZW5jZQotCVB5TWFjX1BSRUNIRUNLKEFkZE1lZGlhU2FtcGxlUmVmZXJlbmNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBZGRNZWRpYVNhbXBsZVJlZmVyZW5jZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbGxPJmxoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRhdGFPZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICZzaXplLAotCSAgICAgICAgICAgICAgICAgICAgICAmZHVyYXRpb25QZXJTYW1wbGUsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc2FtcGxlRGVzY3JpcHRpb25ILAotCSAgICAgICAgICAgICAgICAgICAgICAmbnVtYmVyT2ZTYW1wbGVzLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlRmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQWRkTWVkaWFTYW1wbGVSZWZlcmVuY2UoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YU9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb25QZXJTYW1wbGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZURlc2NyaXB0aW9uSCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyT2ZTYW1wbGVzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVGbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZVRpbWUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVRpbWUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsbE8mbGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvblBlclNhbXBsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzYW1wbGVEZXNjcmlwdGlvbkgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZudW1iZXJPZlNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGVGbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBBZGRNZWRpYVNhbXBsZVJlZmVyZW5jZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvblBlclNhbXBsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlRGVzY3JpcHRpb25ILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXJPZlNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZUZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlVGltZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlVGltZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVkaWFPYmpfR2V0TWVkaWFTYW1wbGUoTWVkaWFPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSGFuZGxlIGRhdGFPdXQ7Ci0JbG9uZyBtYXhTaXplVG9Hcm93OwotCWxvbmcgc2l6ZTsKLQlUaW1lVmFsdWUgdGltZTsKLQlUaW1lVmFsdWUgc2FtcGxlVGltZTsKLQlUaW1lVmFsdWUgZHVyYXRpb25QZXJTYW1wbGU7Ci0JU2FtcGxlRGVzY3JpcHRpb25IYW5kbGUgc2FtcGxlRGVzY3JpcHRpb25IOwotCWxvbmcgc2FtcGxlRGVzY3JpcHRpb25JbmRleDsKLQlsb25nIG1heE51bWJlck9mU2FtcGxlczsKLQlsb25nIG51bWJlck9mU2FtcGxlczsKLQlzaG9ydCBzYW1wbGVGbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBIYW5kbGUgZGF0YU91dDsKKyAgICBsb25nIG1heFNpemVUb0dyb3c7CisgICAgbG9uZyBzaXplOworICAgIFRpbWVWYWx1ZSB0aW1lOworICAgIFRpbWVWYWx1ZSBzYW1wbGVUaW1lOworICAgIFRpbWVWYWx1ZSBkdXJhdGlvblBlclNhbXBsZTsKKyAgICBTYW1wbGVEZXNjcmlwdGlvbkhhbmRsZSBzYW1wbGVEZXNjcmlwdGlvbkg7CisgICAgbG9uZyBzYW1wbGVEZXNjcmlwdGlvbkluZGV4OworICAgIGxvbmcgbWF4TnVtYmVyT2ZTYW1wbGVzOworICAgIGxvbmcgbnVtYmVyT2ZTYW1wbGVzOworICAgIHNob3J0IHNhbXBsZUZsYWdzOwogI2lmbmRlZiBHZXRNZWRpYVNhbXBsZQotCVB5TWFjX1BSRUNIRUNLKEdldE1lZGlhU2FtcGxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNZWRpYVNhbXBsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhT3V0LAotCSAgICAgICAgICAgICAgICAgICAgICAmbWF4U2l6ZVRvR3JvdywKLQkgICAgICAgICAgICAgICAgICAgICAgJnRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc2FtcGxlRGVzY3JpcHRpb25ILAotCSAgICAgICAgICAgICAgICAgICAgICAmbWF4TnVtYmVyT2ZTYW1wbGVzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldE1lZGlhU2FtcGxlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgIGRhdGFPdXQsCi0JICAgICAgICAgICAgICAgICAgICAgIG1heFNpemVUb0dyb3csCi0JICAgICAgICAgICAgICAgICAgICAgICZzaXplLAotCSAgICAgICAgICAgICAgICAgICAgICB0aW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlVGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmR1cmF0aW9uUGVyU2FtcGxlLAotCSAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVEZXNjcmlwdGlvbkgsCi0JICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGVEZXNjcmlwdGlvbkluZGV4LAotCSAgICAgICAgICAgICAgICAgICAgICBtYXhOdW1iZXJPZlNhbXBsZXMsCi0JICAgICAgICAgICAgICAgICAgICAgICZudW1iZXJPZlNhbXBsZXMsCi0JICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGVGbGFncyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGxsbGxoIiwKLQkgICAgICAgICAgICAgICAgICAgICBzaXplLAotCSAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb25QZXJTYW1wbGUsCi0JICAgICAgICAgICAgICAgICAgICAgc2FtcGxlRGVzY3JpcHRpb25JbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICBudW1iZXJPZlNhbXBsZXMsCi0JICAgICAgICAgICAgICAgICAgICAgc2FtcGxlRmxhZ3MpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGxPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXhTaXplVG9Hcm93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzYW1wbGVEZXNjcmlwdGlvbkgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXhOdW1iZXJPZlNhbXBsZXMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0TWVkaWFTYW1wbGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4U2l6ZVRvR3JvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGVUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZHVyYXRpb25QZXJTYW1wbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZURlc2NyaXB0aW9uSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZURlc2NyaXB0aW9uSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1heE51bWJlck9mU2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm51bWJlck9mU2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZUZsYWdzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbGxsbGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvblBlclNhbXBsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVEZXNjcmlwdGlvbkluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlck9mU2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVGbGFncyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVkaWFPYmpfR2V0TWVkaWFTYW1wbGVSZWZlcmVuY2UoTWVkaWFPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JbG9uZyBkYXRhT2Zmc2V0OwotCWxvbmcgc2l6ZTsKLQlUaW1lVmFsdWUgdGltZTsKLQlUaW1lVmFsdWUgc2FtcGxlVGltZTsKLQlUaW1lVmFsdWUgZHVyYXRpb25QZXJTYW1wbGU7Ci0JU2FtcGxlRGVzY3JpcHRpb25IYW5kbGUgc2FtcGxlRGVzY3JpcHRpb25IOwotCWxvbmcgc2FtcGxlRGVzY3JpcHRpb25JbmRleDsKLQlsb25nIG1heE51bWJlck9mU2FtcGxlczsKLQlsb25nIG51bWJlck9mU2FtcGxlczsKLQlzaG9ydCBzYW1wbGVGbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBsb25nIGRhdGFPZmZzZXQ7CisgICAgbG9uZyBzaXplOworICAgIFRpbWVWYWx1ZSB0aW1lOworICAgIFRpbWVWYWx1ZSBzYW1wbGVUaW1lOworICAgIFRpbWVWYWx1ZSBkdXJhdGlvblBlclNhbXBsZTsKKyAgICBTYW1wbGVEZXNjcmlwdGlvbkhhbmRsZSBzYW1wbGVEZXNjcmlwdGlvbkg7CisgICAgbG9uZyBzYW1wbGVEZXNjcmlwdGlvbkluZGV4OworICAgIGxvbmcgbWF4TnVtYmVyT2ZTYW1wbGVzOworICAgIGxvbmcgbnVtYmVyT2ZTYW1wbGVzOworICAgIHNob3J0IHNhbXBsZUZsYWdzOwogI2lmbmRlZiBHZXRNZWRpYVNhbXBsZVJlZmVyZW5jZQotCVB5TWFjX1BSRUNIRUNLKEdldE1lZGlhU2FtcGxlUmVmZXJlbmNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNZWRpYVNhbXBsZVJlZmVyZW5jZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc2FtcGxlRGVzY3JpcHRpb25ILAotCSAgICAgICAgICAgICAgICAgICAgICAmbWF4TnVtYmVyT2ZTYW1wbGVzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldE1lZGlhU2FtcGxlUmVmZXJlbmNlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhT2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZVRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvblBlclNhbXBsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlRGVzY3JpcHRpb25ILAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlRGVzY3JpcHRpb25JbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4TnVtYmVyT2ZTYW1wbGVzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbnVtYmVyT2ZTYW1wbGVzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlRmxhZ3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsbGxsbGgiLAotCSAgICAgICAgICAgICAgICAgICAgIGRhdGFPZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgc2l6ZSwKLQkgICAgICAgICAgICAgICAgICAgICBzYW1wbGVUaW1lLAotCSAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uUGVyU2FtcGxlLAotCSAgICAgICAgICAgICAgICAgICAgIHNhbXBsZURlc2NyaXB0aW9uSW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgbnVtYmVyT2ZTYW1wbGVzLAotCSAgICAgICAgICAgICAgICAgICAgIHNhbXBsZUZsYWdzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc2FtcGxlRGVzY3JpcHRpb25ILAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWF4TnVtYmVyT2ZTYW1wbGVzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldE1lZGlhU2FtcGxlUmVmZXJlbmNlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZVRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvblBlclNhbXBsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlRGVzY3JpcHRpb25ILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlRGVzY3JpcHRpb25JbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4TnVtYmVyT2ZTYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbnVtYmVyT2ZTYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlRmxhZ3MpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsbGxsbGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uUGVyU2FtcGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZURlc2NyaXB0aW9uSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyT2ZTYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZUZsYWdzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZWRpYU9ial9TZXRNZWRpYVByZWZlcnJlZENodW5rU2l6ZShNZWRpYU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlsb25nIG1heENodW5rU2l6ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBsb25nIG1heENodW5rU2l6ZTsKICNpZm5kZWYgU2V0TWVkaWFQcmVmZXJyZWRDaHVua1NpemUKLQlQeU1hY19QUkVDSEVDSyhTZXRNZWRpYVByZWZlcnJlZENodW5rU2l6ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TWVkaWFQcmVmZXJyZWRDaHVua1NpemUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZtYXhDaHVua1NpemUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0TWVkaWFQcmVmZXJyZWRDaHVua1NpemUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4Q2h1bmtTaXplKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1heENodW5rU2l6ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRNZWRpYVByZWZlcnJlZENodW5rU2l6ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhDaHVua1NpemUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lZGlhT2JqX0dldE1lZGlhUHJlZmVycmVkQ2h1bmtTaXplKE1lZGlhT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCWxvbmcgbWF4Q2h1bmtTaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIGxvbmcgbWF4Q2h1bmtTaXplOwogI2lmbmRlZiBHZXRNZWRpYVByZWZlcnJlZENodW5rU2l6ZQotCVB5TWFjX1BSRUNIRUNLKEdldE1lZGlhUHJlZmVycmVkQ2h1bmtTaXplKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNZWRpYVByZWZlcnJlZENodW5rU2l6ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldE1lZGlhUHJlZmVycmVkQ2h1bmtTaXplKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXhDaHVua1NpemUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIG1heENodW5rU2l6ZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRNZWRpYVByZWZlcnJlZENodW5rU2l6ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWF4Q2h1bmtTaXplKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtYXhDaHVua1NpemUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lZGlhT2JqX1NldE1lZGlhU2hhZG93U3luYyhNZWRpYU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlsb25nIGZyYW1lRGlmZlNhbXBsZU51bTsKLQlsb25nIHN5bmNTYW1wbGVOdW07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgbG9uZyBmcmFtZURpZmZTYW1wbGVOdW07CisgICAgbG9uZyBzeW5jU2FtcGxlTnVtOwogI2lmbmRlZiBTZXRNZWRpYVNoYWRvd1N5bmMKLQlQeU1hY19QUkVDSEVDSyhTZXRNZWRpYVNoYWRvd1N5bmMpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldE1lZGlhU2hhZG93U3luYyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZmcmFtZURpZmZTYW1wbGVOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICZzeW5jU2FtcGxlTnVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldE1lZGlhU2hhZG93U3luYyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVEaWZmU2FtcGxlTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgc3luY1NhbXBsZU51bSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZnJhbWVEaWZmU2FtcGxlTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3luY1NhbXBsZU51bSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRNZWRpYVNoYWRvd1N5bmMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lRGlmZlNhbXBsZU51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNTYW1wbGVOdW0pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lZGlhT2JqX0dldE1lZGlhU2hhZG93U3luYyhNZWRpYU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlsb25nIGZyYW1lRGlmZlNhbXBsZU51bTsKLQlsb25nIHN5bmNTYW1wbGVOdW07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgbG9uZyBmcmFtZURpZmZTYW1wbGVOdW07CisgICAgbG9uZyBzeW5jU2FtcGxlTnVtOwogI2lmbmRlZiBHZXRNZWRpYVNoYWRvd1N5bmMKLQlQeU1hY19QUkVDSEVDSyhHZXRNZWRpYVNoYWRvd1N5bmMpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1lZGlhU2hhZG93U3luYyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZyYW1lRGlmZlNhbXBsZU51bSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRNZWRpYVNoYWRvd1N5bmMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lRGlmZlNhbXBsZU51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZzeW5jU2FtcGxlTnVtKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBzeW5jU2FtcGxlTnVtKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZyYW1lRGlmZlNhbXBsZU51bSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRNZWRpYVNoYWRvd1N5bmMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lRGlmZlNhbXBsZU51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzeW5jU2FtcGxlTnVtKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzeW5jU2FtcGxlTnVtKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZWRpYU9ial9HZXRNZWRpYURhdGFTaXplKE1lZGlhT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIF9ydjsKLQlUaW1lVmFsdWUgc3RhcnRUaW1lOwotCVRpbWVWYWx1ZSBkdXJhdGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgbG9uZyBfcnY7CisgICAgVGltZVZhbHVlIHN0YXJ0VGltZTsKKyAgICBUaW1lVmFsdWUgZHVyYXRpb247CiAjaWZuZGVmIEdldE1lZGlhRGF0YVNpemUKLQlQeU1hY19QUkVDSEVDSyhHZXRNZWRpYURhdGFTaXplKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNZWRpYURhdGFTaXplKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0VGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmR1cmF0aW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TWVkaWFEYXRhU2l6ZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0VGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmR1cmF0aW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TWVkaWFEYXRhU2l6ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lZGlhT2JqX0dldE1lZGlhRGF0YVNpemU2NChNZWRpYU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlUaW1lVmFsdWUgc3RhcnRUaW1lOwotCVRpbWVWYWx1ZSBkdXJhdGlvbjsKLQl3aWRlIGRhdGFTaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFRpbWVWYWx1ZSBzdGFydFRpbWU7CisgICAgVGltZVZhbHVlIGR1cmF0aW9uOworICAgIHdpZGUgZGF0YVNpemU7CiAjaWZuZGVmIEdldE1lZGlhRGF0YVNpemU2NAotCVB5TWFjX1BSRUNIRUNLKEdldE1lZGlhRGF0YVNpemU2NCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TWVkaWFEYXRhU2l6ZTY0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0VGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmR1cmF0aW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldE1lZGlhRGF0YVNpemU2NChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVNpemUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZHdpZGUsIGRhdGFTaXplKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGFydFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRNZWRpYURhdGFTaXplNjQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFTaXplKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGR3aWRlLCBkYXRhU2l6ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVkaWFPYmpfQ29weU1lZGlhVXNlckRhdGEoTWVkaWFPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JTWVkaWEgZHN0TWVkaWE7Ci0JT1NUeXBlIGNvcHlSdWxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIE1lZGlhIGRzdE1lZGlhOworICAgIE9TVHlwZSBjb3B5UnVsZTsKICNpZm5kZWYgQ29weU1lZGlhVXNlckRhdGEKLQlQeU1hY19QUkVDSEVDSyhDb3B5TWVkaWFVc2VyRGF0YSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ29weU1lZGlhVXNlckRhdGEpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIE1lZGlhT2JqX0NvbnZlcnQsICZkc3RNZWRpYSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY29weVJ1bGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ29weU1lZGlhVXNlckRhdGEoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgZHN0TWVkaWEsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGNvcHlSdWxlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFPYmpfQ29udmVydCwgJmRzdE1lZGlhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjb3B5UnVsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDb3B5TWVkaWFVc2VyRGF0YShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RNZWRpYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29weVJ1bGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lZGlhT2JqX0dldE1lZGlhTmV4dEludGVyZXN0aW5nVGltZShNZWRpYU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgaW50ZXJlc3RpbmdUaW1lRmxhZ3M7Ci0JVGltZVZhbHVlIHRpbWU7Ci0JRml4ZWQgcmF0ZTsKLQlUaW1lVmFsdWUgaW50ZXJlc3RpbmdUaW1lOwotCVRpbWVWYWx1ZSBpbnRlcmVzdGluZ0R1cmF0aW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBpbnRlcmVzdGluZ1RpbWVGbGFnczsKKyAgICBUaW1lVmFsdWUgdGltZTsKKyAgICBGaXhlZCByYXRlOworICAgIFRpbWVWYWx1ZSBpbnRlcmVzdGluZ1RpbWU7CisgICAgVGltZVZhbHVlIGludGVyZXN0aW5nRHVyYXRpb247CiAjaWZuZGVmIEdldE1lZGlhTmV4dEludGVyZXN0aW5nVGltZQotCVB5TWFjX1BSRUNIRUNLKEdldE1lZGlhTmV4dEludGVyZXN0aW5nVGltZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TWVkaWFOZXh0SW50ZXJlc3RpbmdUaW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW50ZXJlc3RpbmdUaW1lRmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aW1lLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJnJhdGUpKQotCQlyZXR1cm4gTlVMTDsKLQlHZXRNZWRpYU5leHRJbnRlcmVzdGluZ1RpbWUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJlc3RpbmdUaW1lRmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnRlcmVzdGluZ1RpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnRlcmVzdGluZ0R1cmF0aW9uKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIGludGVyZXN0aW5nVGltZSwKLQkgICAgICAgICAgICAgICAgICAgICBpbnRlcmVzdGluZ0R1cmF0aW9uKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmludGVyZXN0aW5nVGltZUZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZyYXRlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0TWVkaWFOZXh0SW50ZXJlc3RpbmdUaW1lKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZXN0aW5nVGltZUZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW50ZXJlc3RpbmdUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW50ZXJlc3RpbmdEdXJhdGlvbik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmVzdGluZ1RpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJlc3RpbmdEdXJhdGlvbik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVkaWFPYmpfR2V0TWVkaWFEYXRhUmVmKE1lZGlhT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCXNob3J0IGluZGV4OwotCUhhbmRsZSBkYXRhUmVmOwotCU9TVHlwZSBkYXRhUmVmVHlwZTsKLQlsb25nIGRhdGFSZWZBdHRyaWJ1dGVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIHNob3J0IGluZGV4OworICAgIEhhbmRsZSBkYXRhUmVmOworICAgIE9TVHlwZSBkYXRhUmVmVHlwZTsKKyAgICBsb25nIGRhdGFSZWZBdHRyaWJ1dGVzOwogI2lmbmRlZiBHZXRNZWRpYURhdGFSZWYKLQlQeU1hY19QUkVDSEVDSyhHZXRNZWRpYURhdGFSZWYpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1lZGlhRGF0YVJlZik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluZGV4KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldE1lZGlhRGF0YVJlZihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUmVmVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUmVmQXR0cmlidXRlcyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIGRhdGFSZWZUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWZBdHRyaWJ1dGVzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZGV4KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldE1lZGlhRGF0YVJlZihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUmVmVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUmVmQXR0cmlidXRlcyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIGRhdGFSZWZUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWZBdHRyaWJ1dGVzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZWRpYU9ial9TZXRNZWRpYURhdGFSZWYoTWVkaWFPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0Jc2hvcnQgaW5kZXg7Ci0JSGFuZGxlIGRhdGFSZWY7Ci0JT1NUeXBlIGRhdGFSZWZUeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIHNob3J0IGluZGV4OworICAgIEhhbmRsZSBkYXRhUmVmOworICAgIE9TVHlwZSBkYXRhUmVmVHlwZTsKICNpZm5kZWYgU2V0TWVkaWFEYXRhUmVmCi0JUHlNYWNfUFJFQ0hFQ0soU2V0TWVkaWFEYXRhUmVmKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRNZWRpYURhdGFSZWYpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGF0YVJlZlR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0TWVkaWFEYXRhUmVmKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmVHlwZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGF0YVJlZlR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0TWVkaWFEYXRhUmVmKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmVHlwZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVkaWFPYmpfU2V0TWVkaWFEYXRhUmVmQXR0cmlidXRlcyhNZWRpYU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlzaG9ydCBpbmRleDsKLQlsb25nIGRhdGFSZWZBdHRyaWJ1dGVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIHNob3J0IGluZGV4OworICAgIGxvbmcgZGF0YVJlZkF0dHJpYnV0ZXM7CiAjaWZuZGVmIFNldE1lZGlhRGF0YVJlZkF0dHJpYnV0ZXMKLQlQeU1hY19QUkVDSEVDSyhTZXRNZWRpYURhdGFSZWZBdHRyaWJ1dGVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRNZWRpYURhdGFSZWZBdHRyaWJ1dGVzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluZGV4LAotCSAgICAgICAgICAgICAgICAgICAgICAmZGF0YVJlZkF0dHJpYnV0ZXMpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0TWVkaWFEYXRhUmVmQXR0cmlidXRlcyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWZBdHRyaWJ1dGVzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFSZWZBdHRyaWJ1dGVzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldE1lZGlhRGF0YVJlZkF0dHJpYnV0ZXMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmQXR0cmlidXRlcyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVkaWFPYmpfQWRkTWVkaWFEYXRhUmVmKE1lZGlhT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCXNob3J0IGluZGV4OwotCUhhbmRsZSBkYXRhUmVmOwotCU9TVHlwZSBkYXRhUmVmVHlwZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBzaG9ydCBpbmRleDsKKyAgICBIYW5kbGUgZGF0YVJlZjsKKyAgICBPU1R5cGUgZGF0YVJlZlR5cGU7CiAjaWZuZGVmIEFkZE1lZGlhRGF0YVJlZgotCVB5TWFjX1BSRUNIRUNLKEFkZE1lZGlhRGF0YVJlZik7CisgICAgUHlNYWNfUFJFQ0hFQ0soQWRkTWVkaWFEYXRhUmVmKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRhdGFSZWZUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEFkZE1lZGlhRGF0YVJlZihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgJmluZGV4LAotCSAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWZUeXBlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBpbmRleCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGF0YVJlZlR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQWRkTWVkaWFEYXRhUmVmKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZlR5cGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZWRpYU9ial9HZXRNZWRpYURhdGFSZWZDb3VudChNZWRpYU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlzaG9ydCBjb3VudDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBzaG9ydCBjb3VudDsKICNpZm5kZWYgR2V0TWVkaWFEYXRhUmVmQ291bnQKLQlQeU1hY19QUkVDSEVDSyhHZXRNZWRpYURhdGFSZWZDb3VudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TWVkaWFEYXRhUmVmQ291bnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRNZWRpYURhdGFSZWZDb3VudChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY291bnQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIGNvdW50KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldE1lZGlhRGF0YVJlZkNvdW50KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb3VudCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lZGlhT2JqX1NldE1lZGlhUGxheUhpbnRzKE1lZGlhT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIGZsYWdzOwotCWxvbmcgZmxhZ3NNYXNrOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBsb25nIGZsYWdzOworICAgIGxvbmcgZmxhZ3NNYXNrOwogI2lmbmRlZiBTZXRNZWRpYVBsYXlIaW50cwotCVB5TWFjX1BSRUNIRUNLKFNldE1lZGlhUGxheUhpbnRzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRNZWRpYVBsYXlIaW50cyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzTWFzaykpCi0JCXJldHVybiBOVUxMOwotCVNldE1lZGlhUGxheUhpbnRzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgZmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgZmxhZ3NNYXNrKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFnc01hc2spKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRNZWRpYVBsYXlIaW50cyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgIGZsYWdzTWFzayk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lZGlhT2JqX0dldE1lZGlhUGxheUhpbnRzKE1lZGlhT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIGZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBsb25nIGZsYWdzOwogI2lmbmRlZiBHZXRNZWRpYVBsYXlIaW50cwotCVB5TWFjX1BSRUNIRUNLKEdldE1lZGlhUGxheUhpbnRzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNZWRpYVBsYXlIaW50cyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0TWVkaWFQbGF5SGludHMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAmZmxhZ3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBmbGFncyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldE1lZGlhUGxheUhpbnRzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lZGlhT2JqX0dldE1lZGlhTmV4dEludGVyZXN0aW5nVGltZU9ubHkoTWVkaWFPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IGludGVyZXN0aW5nVGltZUZsYWdzOwotCVRpbWVWYWx1ZSB0aW1lOwotCUZpeGVkIHJhdGU7Ci0JVGltZVZhbHVlIGludGVyZXN0aW5nVGltZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgaW50ZXJlc3RpbmdUaW1lRmxhZ3M7CisgICAgVGltZVZhbHVlIHRpbWU7CisgICAgRml4ZWQgcmF0ZTsKKyAgICBUaW1lVmFsdWUgaW50ZXJlc3RpbmdUaW1lOwogI2lmbmRlZiBHZXRNZWRpYU5leHRJbnRlcmVzdGluZ1RpbWVPbmx5Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0TWVkaWFOZXh0SW50ZXJlc3RpbmdUaW1lT25seSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TWVkaWFOZXh0SW50ZXJlc3RpbmdUaW1lT25seSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmludGVyZXN0aW5nVGltZUZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZyYXRlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0TWVkaWFOZXh0SW50ZXJlc3RpbmdUaW1lT25seShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJlc3RpbmdUaW1lRmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnRlcmVzdGluZ1RpbWUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBpbnRlcmVzdGluZ1RpbWUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW50ZXJlc3RpbmdUaW1lRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJnJhdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRNZWRpYU5leHRJbnRlcmVzdGluZ1RpbWVPbmx5KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmVzdGluZ1RpbWVGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmludGVyZXN0aW5nVGltZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZXN0aW5nVGltZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBNZWRpYU9ial9tZXRob2RzW10gPSB7Ci0JeyJMb2FkTWVkaWFJbnRvUmFtIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX0xvYWRNZWRpYUludG9SYW0sIDEsCi0JIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSB0aW1lLCBUaW1lVmFsdWUgZHVyYXRpb24sIGxvbmcgZmxhZ3MpIC0+IE5vbmUiKX0sCi0JeyJHZXRNZWRpYVRyYWNrIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX0dldE1lZGlhVHJhY2ssIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFRyYWNrIF9ydikiKX0sCi0JeyJHZXRNZWRpYUNyZWF0aW9uVGltZSIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9HZXRNZWRpYUNyZWF0aW9uVGltZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAodW5zaWduZWQgbG9uZyBfcnYpIil9LAotCXsiR2V0TWVkaWFNb2RpZmljYXRpb25UaW1lIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX0dldE1lZGlhTW9kaWZpY2F0aW9uVGltZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAodW5zaWduZWQgbG9uZyBfcnYpIil9LAotCXsiR2V0TWVkaWFUaW1lU2NhbGUiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfR2V0TWVkaWFUaW1lU2NhbGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFRpbWVTY2FsZSBfcnYpIil9LAotCXsiU2V0TWVkaWFUaW1lU2NhbGUiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfU2V0TWVkaWFUaW1lU2NhbGUsIDEsCi0JIFB5RG9jX1NUUigiKFRpbWVTY2FsZSB0aW1lU2NhbGUpIC0+IE5vbmUiKX0sCi0JeyJHZXRNZWRpYUR1cmF0aW9uIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX0dldE1lZGlhRHVyYXRpb24sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFRpbWVWYWx1ZSBfcnYpIil9LAotCXsiR2V0TWVkaWFMYW5ndWFnZSIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9HZXRNZWRpYUxhbmd1YWdlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChzaG9ydCBfcnYpIil9LAotCXsiU2V0TWVkaWFMYW5ndWFnZSIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9TZXRNZWRpYUxhbmd1YWdlLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBsYW5ndWFnZSkgLT4gTm9uZSIpfSwKLQl7IkdldE1lZGlhUXVhbGl0eSIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9HZXRNZWRpYVF1YWxpdHksIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKHNob3J0IF9ydikiKX0sCi0JeyJTZXRNZWRpYVF1YWxpdHkiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfU2V0TWVkaWFRdWFsaXR5LCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBxdWFsaXR5KSAtPiBOb25lIil9LAotCXsiR2V0TWVkaWFIYW5kbGVyRGVzY3JpcHRpb24iLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfR2V0TWVkaWFIYW5kbGVyRGVzY3JpcHRpb24sIDEsCi0JIFB5RG9jX1NUUigiKFN0cjI1NSBjcmVhdG9yTmFtZSkgLT4gKE9TVHlwZSBtZWRpYVR5cGUsIE9TVHlwZSBjcmVhdG9yTWFudWZhY3R1cmVyKSIpfSwKLQl7IkdldE1lZGlhVXNlckRhdGEiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfR2V0TWVkaWFVc2VyRGF0YSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVXNlckRhdGEgX3J2KSIpfSwKLQl7IkdldE1lZGlhSGFuZGxlciIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9HZXRNZWRpYUhhbmRsZXIsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKE1lZGlhSGFuZGxlciBfcnYpIil9LAotCXsiU2V0TWVkaWFIYW5kbGVyIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX1NldE1lZGlhSGFuZGxlciwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyQ29tcG9uZW50IG1IKSAtPiBOb25lIil9LAotCXsiQmVnaW5NZWRpYUVkaXRzIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX0JlZ2luTWVkaWFFZGl0cywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiRW5kTWVkaWFFZGl0cyIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9FbmRNZWRpYUVkaXRzLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJTZXRNZWRpYURlZmF1bHREYXRhUmVmSW5kZXgiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfU2V0TWVkaWFEZWZhdWx0RGF0YVJlZkluZGV4LCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBpbmRleCkgLT4gTm9uZSIpfSwKLQl7IkdldE1lZGlhRGF0YUhhbmRsZXJEZXNjcmlwdGlvbiIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9HZXRNZWRpYURhdGFIYW5kbGVyRGVzY3JpcHRpb24sIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGluZGV4LCBTdHIyNTUgY3JlYXRvck5hbWUpIC0+IChPU1R5cGUgZGhUeXBlLCBPU1R5cGUgY3JlYXRvck1hbnVmYWN0dXJlcikiKX0sCi0JeyJHZXRNZWRpYURhdGFIYW5kbGVyIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX0dldE1lZGlhRGF0YUhhbmRsZXIsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGluZGV4KSAtPiAoRGF0YUhhbmRsZXIgX3J2KSIpfSwKLQl7IlNldE1lZGlhRGF0YUhhbmRsZXIiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfU2V0TWVkaWFEYXRhSGFuZGxlciwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgaW5kZXgsIERhdGFIYW5kbGVyQ29tcG9uZW50IGRhdGFIYW5kbGVyKSAtPiBOb25lIil9LAotCXsiR2V0TWVkaWFTYW1wbGVEZXNjcmlwdGlvbkNvdW50IiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX0dldE1lZGlhU2FtcGxlRGVzY3JpcHRpb25Db3VudCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAobG9uZyBfcnYpIil9LAotCXsiR2V0TWVkaWFTYW1wbGVEZXNjcmlwdGlvbiIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9HZXRNZWRpYVNhbXBsZURlc2NyaXB0aW9uLCAxLAotCSBQeURvY19TVFIoIihsb25nIGluZGV4LCBTYW1wbGVEZXNjcmlwdGlvbkhhbmRsZSBkZXNjSCkgLT4gTm9uZSIpfSwKLQl7IlNldE1lZGlhU2FtcGxlRGVzY3JpcHRpb24iLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfU2V0TWVkaWFTYW1wbGVEZXNjcmlwdGlvbiwgMSwKLQkgUHlEb2NfU1RSKCIobG9uZyBpbmRleCwgU2FtcGxlRGVzY3JpcHRpb25IYW5kbGUgZGVzY0gpIC0+IE5vbmUiKX0sCi0JeyJHZXRNZWRpYVNhbXBsZUNvdW50IiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX0dldE1lZGlhU2FtcGxlQ291bnQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKGxvbmcgX3J2KSIpfSwKLQl7IkdldE1lZGlhU3luY1NhbXBsZUNvdW50IiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX0dldE1lZGlhU3luY1NhbXBsZUNvdW50LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChsb25nIF9ydikiKX0sCi0JeyJTYW1wbGVOdW1Ub01lZGlhVGltZSIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9TYW1wbGVOdW1Ub01lZGlhVGltZSwgMSwKLQkgUHlEb2NfU1RSKCIobG9uZyBsb2dpY2FsU2FtcGxlTnVtKSAtPiAoVGltZVZhbHVlIHNhbXBsZVRpbWUsIFRpbWVWYWx1ZSBzYW1wbGVEdXJhdGlvbikiKX0sCi0JeyJNZWRpYVRpbWVUb1NhbXBsZU51bSIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9NZWRpYVRpbWVUb1NhbXBsZU51bSwgMSwKLQkgUHlEb2NfU1RSKCIoVGltZVZhbHVlIHRpbWUpIC0+IChsb25nIHNhbXBsZU51bSwgVGltZVZhbHVlIHNhbXBsZVRpbWUsIFRpbWVWYWx1ZSBzYW1wbGVEdXJhdGlvbikiKX0sCi0JeyJBZGRNZWRpYVNhbXBsZSIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9BZGRNZWRpYVNhbXBsZSwgMSwKLQkgUHlEb2NfU1RSKCIoSGFuZGxlIGRhdGFJbiwgbG9uZyBpbk9mZnNldCwgdW5zaWduZWQgbG9uZyBzaXplLCBUaW1lVmFsdWUgZHVyYXRpb25QZXJTYW1wbGUsIFNhbXBsZURlc2NyaXB0aW9uSGFuZGxlIHNhbXBsZURlc2NyaXB0aW9uSCwgbG9uZyBudW1iZXJPZlNhbXBsZXMsIHNob3J0IHNhbXBsZUZsYWdzKSAtPiAoVGltZVZhbHVlIHNhbXBsZVRpbWUpIil9LAotCXsiQWRkTWVkaWFTYW1wbGVSZWZlcmVuY2UiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfQWRkTWVkaWFTYW1wbGVSZWZlcmVuY2UsIDEsCi0JIFB5RG9jX1NUUigiKGxvbmcgZGF0YU9mZnNldCwgdW5zaWduZWQgbG9uZyBzaXplLCBUaW1lVmFsdWUgZHVyYXRpb25QZXJTYW1wbGUsIFNhbXBsZURlc2NyaXB0aW9uSGFuZGxlIHNhbXBsZURlc2NyaXB0aW9uSCwgbG9uZyBudW1iZXJPZlNhbXBsZXMsIHNob3J0IHNhbXBsZUZsYWdzKSAtPiAoVGltZVZhbHVlIHNhbXBsZVRpbWUpIil9LAotCXsiR2V0TWVkaWFTYW1wbGUiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfR2V0TWVkaWFTYW1wbGUsIDEsCi0JIFB5RG9jX1NUUigiKEhhbmRsZSBkYXRhT3V0LCBsb25nIG1heFNpemVUb0dyb3csIFRpbWVWYWx1ZSB0aW1lLCBTYW1wbGVEZXNjcmlwdGlvbkhhbmRsZSBzYW1wbGVEZXNjcmlwdGlvbkgsIGxvbmcgbWF4TnVtYmVyT2ZTYW1wbGVzKSAtPiAobG9uZyBzaXplLCBUaW1lVmFsdWUgc2FtcGxlVGltZSwgVGltZVZhbHVlIGR1cmF0aW9uUGVyU2FtcGxlLCBsb25nIHNhbXBsZURlc2NyaXB0aW9uSW5kZXgsIGxvbmcgbnVtYmVyT2ZTYW1wbGVzLCBzaG9ydCBzYW1wbGVGbGFncykiKX0sCi0JeyJHZXRNZWRpYVNhbXBsZVJlZmVyZW5jZSIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9HZXRNZWRpYVNhbXBsZVJlZmVyZW5jZSwgMSwKLQkgUHlEb2NfU1RSKCIoVGltZVZhbHVlIHRpbWUsIFNhbXBsZURlc2NyaXB0aW9uSGFuZGxlIHNhbXBsZURlc2NyaXB0aW9uSCwgbG9uZyBtYXhOdW1iZXJPZlNhbXBsZXMpIC0+IChsb25nIGRhdGFPZmZzZXQsIGxvbmcgc2l6ZSwgVGltZVZhbHVlIHNhbXBsZVRpbWUsIFRpbWVWYWx1ZSBkdXJhdGlvblBlclNhbXBsZSwgbG9uZyBzYW1wbGVEZXNjcmlwdGlvbkluZGV4LCBsb25nIG51bWJlck9mU2FtcGxlcywgc2hvcnQgc2FtcGxlRmxhZ3MpIil9LAotCXsiU2V0TWVkaWFQcmVmZXJyZWRDaHVua1NpemUiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfU2V0TWVkaWFQcmVmZXJyZWRDaHVua1NpemUsIDEsCi0JIFB5RG9jX1NUUigiKGxvbmcgbWF4Q2h1bmtTaXplKSAtPiBOb25lIil9LAotCXsiR2V0TWVkaWFQcmVmZXJyZWRDaHVua1NpemUiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfR2V0TWVkaWFQcmVmZXJyZWRDaHVua1NpemUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKGxvbmcgbWF4Q2h1bmtTaXplKSIpfSwKLQl7IlNldE1lZGlhU2hhZG93U3luYyIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9TZXRNZWRpYVNoYWRvd1N5bmMsIDEsCi0JIFB5RG9jX1NUUigiKGxvbmcgZnJhbWVEaWZmU2FtcGxlTnVtLCBsb25nIHN5bmNTYW1wbGVOdW0pIC0+IE5vbmUiKX0sCi0JeyJHZXRNZWRpYVNoYWRvd1N5bmMiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfR2V0TWVkaWFTaGFkb3dTeW5jLCAxLAotCSBQeURvY19TVFIoIihsb25nIGZyYW1lRGlmZlNhbXBsZU51bSkgLT4gKGxvbmcgc3luY1NhbXBsZU51bSkiKX0sCi0JeyJHZXRNZWRpYURhdGFTaXplIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX0dldE1lZGlhRGF0YVNpemUsIDEsCi0JIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSBzdGFydFRpbWUsIFRpbWVWYWx1ZSBkdXJhdGlvbikgLT4gKGxvbmcgX3J2KSIpfSwKLQl7IkdldE1lZGlhRGF0YVNpemU2NCIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9HZXRNZWRpYURhdGFTaXplNjQsIDEsCi0JIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSBzdGFydFRpbWUsIFRpbWVWYWx1ZSBkdXJhdGlvbikgLT4gKHdpZGUgZGF0YVNpemUpIil9LAotCXsiQ29weU1lZGlhVXNlckRhdGEiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfQ29weU1lZGlhVXNlckRhdGEsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhIGRzdE1lZGlhLCBPU1R5cGUgY29weVJ1bGUpIC0+IE5vbmUiKX0sCi0JeyJHZXRNZWRpYU5leHRJbnRlcmVzdGluZ1RpbWUiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfR2V0TWVkaWFOZXh0SW50ZXJlc3RpbmdUaW1lLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBpbnRlcmVzdGluZ1RpbWVGbGFncywgVGltZVZhbHVlIHRpbWUsIEZpeGVkIHJhdGUpIC0+IChUaW1lVmFsdWUgaW50ZXJlc3RpbmdUaW1lLCBUaW1lVmFsdWUgaW50ZXJlc3RpbmdEdXJhdGlvbikiKX0sCi0JeyJHZXRNZWRpYURhdGFSZWYiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfR2V0TWVkaWFEYXRhUmVmLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBpbmRleCkgLT4gKEhhbmRsZSBkYXRhUmVmLCBPU1R5cGUgZGF0YVJlZlR5cGUsIGxvbmcgZGF0YVJlZkF0dHJpYnV0ZXMpIil9LAotCXsiU2V0TWVkaWFEYXRhUmVmIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX1NldE1lZGlhRGF0YVJlZiwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgaW5kZXgsIEhhbmRsZSBkYXRhUmVmLCBPU1R5cGUgZGF0YVJlZlR5cGUpIC0+IE5vbmUiKX0sCi0JeyJTZXRNZWRpYURhdGFSZWZBdHRyaWJ1dGVzIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX1NldE1lZGlhRGF0YVJlZkF0dHJpYnV0ZXMsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGluZGV4LCBsb25nIGRhdGFSZWZBdHRyaWJ1dGVzKSAtPiBOb25lIil9LAotCXsiQWRkTWVkaWFEYXRhUmVmIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX0FkZE1lZGlhRGF0YVJlZiwgMSwKLQkgUHlEb2NfU1RSKCIoSGFuZGxlIGRhdGFSZWYsIE9TVHlwZSBkYXRhUmVmVHlwZSkgLT4gKHNob3J0IGluZGV4KSIpfSwKLQl7IkdldE1lZGlhRGF0YVJlZkNvdW50IiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX0dldE1lZGlhRGF0YVJlZkNvdW50LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChzaG9ydCBjb3VudCkiKX0sCi0JeyJTZXRNZWRpYVBsYXlIaW50cyIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9TZXRNZWRpYVBsYXlIaW50cywgMSwKLQkgUHlEb2NfU1RSKCIobG9uZyBmbGFncywgbG9uZyBmbGFnc01hc2spIC0+IE5vbmUiKX0sCi0JeyJHZXRNZWRpYVBsYXlIaW50cyIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9HZXRNZWRpYVBsYXlIaW50cywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAobG9uZyBmbGFncykiKX0sCi0JeyJHZXRNZWRpYU5leHRJbnRlcmVzdGluZ1RpbWVPbmx5IiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX0dldE1lZGlhTmV4dEludGVyZXN0aW5nVGltZU9ubHksIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGludGVyZXN0aW5nVGltZUZsYWdzLCBUaW1lVmFsdWUgdGltZSwgRml4ZWQgcmF0ZSkgLT4gKFRpbWVWYWx1ZSBpbnRlcmVzdGluZ1RpbWUpIil9LAotCXtOVUxMLCBOVUxMLCAwfQorICAgIHsiTG9hZE1lZGlhSW50b1JhbSIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9Mb2FkTWVkaWFJbnRvUmFtLCAxLAorICAgICBQeURvY19TVFIoIihUaW1lVmFsdWUgdGltZSwgVGltZVZhbHVlIGR1cmF0aW9uLCBsb25nIGZsYWdzKSAtPiBOb25lIil9LAorICAgIHsiR2V0TWVkaWFUcmFjayIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9HZXRNZWRpYVRyYWNrLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChUcmFjayBfcnYpIil9LAorICAgIHsiR2V0TWVkaWFDcmVhdGlvblRpbWUiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfR2V0TWVkaWFDcmVhdGlvblRpbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKHVuc2lnbmVkIGxvbmcgX3J2KSIpfSwKKyAgICB7IkdldE1lZGlhTW9kaWZpY2F0aW9uVGltZSIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9HZXRNZWRpYU1vZGlmaWNhdGlvblRpbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKHVuc2lnbmVkIGxvbmcgX3J2KSIpfSwKKyAgICB7IkdldE1lZGlhVGltZVNjYWxlIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX0dldE1lZGlhVGltZVNjYWxlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChUaW1lU2NhbGUgX3J2KSIpfSwKKyAgICB7IlNldE1lZGlhVGltZVNjYWxlIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX1NldE1lZGlhVGltZVNjYWxlLCAxLAorICAgICBQeURvY19TVFIoIihUaW1lU2NhbGUgdGltZVNjYWxlKSAtPiBOb25lIil9LAorICAgIHsiR2V0TWVkaWFEdXJhdGlvbiIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9HZXRNZWRpYUR1cmF0aW9uLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChUaW1lVmFsdWUgX3J2KSIpfSwKKyAgICB7IkdldE1lZGlhTGFuZ3VhZ2UiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfR2V0TWVkaWFMYW5ndWFnZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgX3J2KSIpfSwKKyAgICB7IlNldE1lZGlhTGFuZ3VhZ2UiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfU2V0TWVkaWFMYW5ndWFnZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgbGFuZ3VhZ2UpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRNZWRpYVF1YWxpdHkiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfR2V0TWVkaWFRdWFsaXR5LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChzaG9ydCBfcnYpIil9LAorICAgIHsiU2V0TWVkaWFRdWFsaXR5IiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX1NldE1lZGlhUXVhbGl0eSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgcXVhbGl0eSkgLT4gTm9uZSIpfSwKKyAgICB7IkdldE1lZGlhSGFuZGxlckRlc2NyaXB0aW9uIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX0dldE1lZGlhSGFuZGxlckRlc2NyaXB0aW9uLCAxLAorICAgICBQeURvY19TVFIoIihTdHIyNTUgY3JlYXRvck5hbWUpIC0+IChPU1R5cGUgbWVkaWFUeXBlLCBPU1R5cGUgY3JlYXRvck1hbnVmYWN0dXJlcikiKX0sCisgICAgeyJHZXRNZWRpYVVzZXJEYXRhIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX0dldE1lZGlhVXNlckRhdGEsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFVzZXJEYXRhIF9ydikiKX0sCisgICAgeyJHZXRNZWRpYUhhbmRsZXIiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfR2V0TWVkaWFIYW5kbGVyLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChNZWRpYUhhbmRsZXIgX3J2KSIpfSwKKyAgICB7IlNldE1lZGlhSGFuZGxlciIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9TZXRNZWRpYUhhbmRsZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlckNvbXBvbmVudCBtSCkgLT4gTm9uZSIpfSwKKyAgICB7IkJlZ2luTWVkaWFFZGl0cyIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9CZWdpbk1lZGlhRWRpdHMsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkVuZE1lZGlhRWRpdHMiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfRW5kTWVkaWFFZGl0cywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiU2V0TWVkaWFEZWZhdWx0RGF0YVJlZkluZGV4IiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX1NldE1lZGlhRGVmYXVsdERhdGFSZWZJbmRleCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgaW5kZXgpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRNZWRpYURhdGFIYW5kbGVyRGVzY3JpcHRpb24iLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfR2V0TWVkaWFEYXRhSGFuZGxlckRlc2NyaXB0aW9uLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBpbmRleCwgU3RyMjU1IGNyZWF0b3JOYW1lKSAtPiAoT1NUeXBlIGRoVHlwZSwgT1NUeXBlIGNyZWF0b3JNYW51ZmFjdHVyZXIpIil9LAorICAgIHsiR2V0TWVkaWFEYXRhSGFuZGxlciIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9HZXRNZWRpYURhdGFIYW5kbGVyLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBpbmRleCkgLT4gKERhdGFIYW5kbGVyIF9ydikiKX0sCisgICAgeyJTZXRNZWRpYURhdGFIYW5kbGVyIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX1NldE1lZGlhRGF0YUhhbmRsZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGluZGV4LCBEYXRhSGFuZGxlckNvbXBvbmVudCBkYXRhSGFuZGxlcikgLT4gTm9uZSIpfSwKKyAgICB7IkdldE1lZGlhU2FtcGxlRGVzY3JpcHRpb25Db3VudCIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9HZXRNZWRpYVNhbXBsZURlc2NyaXB0aW9uQ291bnQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKGxvbmcgX3J2KSIpfSwKKyAgICB7IkdldE1lZGlhU2FtcGxlRGVzY3JpcHRpb24iLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfR2V0TWVkaWFTYW1wbGVEZXNjcmlwdGlvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIobG9uZyBpbmRleCwgU2FtcGxlRGVzY3JpcHRpb25IYW5kbGUgZGVzY0gpIC0+IE5vbmUiKX0sCisgICAgeyJTZXRNZWRpYVNhbXBsZURlc2NyaXB0aW9uIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX1NldE1lZGlhU2FtcGxlRGVzY3JpcHRpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKGxvbmcgaW5kZXgsIFNhbXBsZURlc2NyaXB0aW9uSGFuZGxlIGRlc2NIKSAtPiBOb25lIil9LAorICAgIHsiR2V0TWVkaWFTYW1wbGVDb3VudCIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9HZXRNZWRpYVNhbXBsZUNvdW50LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChsb25nIF9ydikiKX0sCisgICAgeyJHZXRNZWRpYVN5bmNTYW1wbGVDb3VudCIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9HZXRNZWRpYVN5bmNTYW1wbGVDb3VudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAobG9uZyBfcnYpIil9LAorICAgIHsiU2FtcGxlTnVtVG9NZWRpYVRpbWUiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfU2FtcGxlTnVtVG9NZWRpYVRpbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKGxvbmcgbG9naWNhbFNhbXBsZU51bSkgLT4gKFRpbWVWYWx1ZSBzYW1wbGVUaW1lLCBUaW1lVmFsdWUgc2FtcGxlRHVyYXRpb24pIil9LAorICAgIHsiTWVkaWFUaW1lVG9TYW1wbGVOdW0iLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfTWVkaWFUaW1lVG9TYW1wbGVOdW0sIDEsCisgICAgIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSB0aW1lKSAtPiAobG9uZyBzYW1wbGVOdW0sIFRpbWVWYWx1ZSBzYW1wbGVUaW1lLCBUaW1lVmFsdWUgc2FtcGxlRHVyYXRpb24pIil9LAorICAgIHsiQWRkTWVkaWFTYW1wbGUiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfQWRkTWVkaWFTYW1wbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEhhbmRsZSBkYXRhSW4sIGxvbmcgaW5PZmZzZXQsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgVGltZVZhbHVlIGR1cmF0aW9uUGVyU2FtcGxlLCBTYW1wbGVEZXNjcmlwdGlvbkhhbmRsZSBzYW1wbGVEZXNjcmlwdGlvbkgsIGxvbmcgbnVtYmVyT2ZTYW1wbGVzLCBzaG9ydCBzYW1wbGVGbGFncykgLT4gKFRpbWVWYWx1ZSBzYW1wbGVUaW1lKSIpfSwKKyAgICB7IkFkZE1lZGlhU2FtcGxlUmVmZXJlbmNlIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX0FkZE1lZGlhU2FtcGxlUmVmZXJlbmNlLCAxLAorICAgICBQeURvY19TVFIoIihsb25nIGRhdGFPZmZzZXQsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgVGltZVZhbHVlIGR1cmF0aW9uUGVyU2FtcGxlLCBTYW1wbGVEZXNjcmlwdGlvbkhhbmRsZSBzYW1wbGVEZXNjcmlwdGlvbkgsIGxvbmcgbnVtYmVyT2ZTYW1wbGVzLCBzaG9ydCBzYW1wbGVGbGFncykgLT4gKFRpbWVWYWx1ZSBzYW1wbGVUaW1lKSIpfSwKKyAgICB7IkdldE1lZGlhU2FtcGxlIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX0dldE1lZGlhU2FtcGxlLCAxLAorICAgICBQeURvY19TVFIoIihIYW5kbGUgZGF0YU91dCwgbG9uZyBtYXhTaXplVG9Hcm93LCBUaW1lVmFsdWUgdGltZSwgU2FtcGxlRGVzY3JpcHRpb25IYW5kbGUgc2FtcGxlRGVzY3JpcHRpb25ILCBsb25nIG1heE51bWJlck9mU2FtcGxlcykgLT4gKGxvbmcgc2l6ZSwgVGltZVZhbHVlIHNhbXBsZVRpbWUsIFRpbWVWYWx1ZSBkdXJhdGlvblBlclNhbXBsZSwgbG9uZyBzYW1wbGVEZXNjcmlwdGlvbkluZGV4LCBsb25nIG51bWJlck9mU2FtcGxlcywgc2hvcnQgc2FtcGxlRmxhZ3MpIil9LAorICAgIHsiR2V0TWVkaWFTYW1wbGVSZWZlcmVuY2UiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfR2V0TWVkaWFTYW1wbGVSZWZlcmVuY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSB0aW1lLCBTYW1wbGVEZXNjcmlwdGlvbkhhbmRsZSBzYW1wbGVEZXNjcmlwdGlvbkgsIGxvbmcgbWF4TnVtYmVyT2ZTYW1wbGVzKSAtPiAobG9uZyBkYXRhT2Zmc2V0LCBsb25nIHNpemUsIFRpbWVWYWx1ZSBzYW1wbGVUaW1lLCBUaW1lVmFsdWUgZHVyYXRpb25QZXJTYW1wbGUsIGxvbmcgc2FtcGxlRGVzY3JpcHRpb25JbmRleCwgbG9uZyBudW1iZXJPZlNhbXBsZXMsIHNob3J0IHNhbXBsZUZsYWdzKSIpfSwKKyAgICB7IlNldE1lZGlhUHJlZmVycmVkQ2h1bmtTaXplIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX1NldE1lZGlhUHJlZmVycmVkQ2h1bmtTaXplLCAxLAorICAgICBQeURvY19TVFIoIihsb25nIG1heENodW5rU2l6ZSkgLT4gTm9uZSIpfSwKKyAgICB7IkdldE1lZGlhUHJlZmVycmVkQ2h1bmtTaXplIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX0dldE1lZGlhUHJlZmVycmVkQ2h1bmtTaXplLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChsb25nIG1heENodW5rU2l6ZSkiKX0sCisgICAgeyJTZXRNZWRpYVNoYWRvd1N5bmMiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfU2V0TWVkaWFTaGFkb3dTeW5jLCAxLAorICAgICBQeURvY19TVFIoIihsb25nIGZyYW1lRGlmZlNhbXBsZU51bSwgbG9uZyBzeW5jU2FtcGxlTnVtKSAtPiBOb25lIil9LAorICAgIHsiR2V0TWVkaWFTaGFkb3dTeW5jIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX0dldE1lZGlhU2hhZG93U3luYywgMSwKKyAgICAgUHlEb2NfU1RSKCIobG9uZyBmcmFtZURpZmZTYW1wbGVOdW0pIC0+IChsb25nIHN5bmNTYW1wbGVOdW0pIil9LAorICAgIHsiR2V0TWVkaWFEYXRhU2l6ZSIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9HZXRNZWRpYURhdGFTaXplLCAxLAorICAgICBQeURvY19TVFIoIihUaW1lVmFsdWUgc3RhcnRUaW1lLCBUaW1lVmFsdWUgZHVyYXRpb24pIC0+IChsb25nIF9ydikiKX0sCisgICAgeyJHZXRNZWRpYURhdGFTaXplNjQiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfR2V0TWVkaWFEYXRhU2l6ZTY0LCAxLAorICAgICBQeURvY19TVFIoIihUaW1lVmFsdWUgc3RhcnRUaW1lLCBUaW1lVmFsdWUgZHVyYXRpb24pIC0+ICh3aWRlIGRhdGFTaXplKSIpfSwKKyAgICB7IkNvcHlNZWRpYVVzZXJEYXRhIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX0NvcHlNZWRpYVVzZXJEYXRhLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYSBkc3RNZWRpYSwgT1NUeXBlIGNvcHlSdWxlKSAtPiBOb25lIil9LAorICAgIHsiR2V0TWVkaWFOZXh0SW50ZXJlc3RpbmdUaW1lIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX0dldE1lZGlhTmV4dEludGVyZXN0aW5nVGltZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgaW50ZXJlc3RpbmdUaW1lRmxhZ3MsIFRpbWVWYWx1ZSB0aW1lLCBGaXhlZCByYXRlKSAtPiAoVGltZVZhbHVlIGludGVyZXN0aW5nVGltZSwgVGltZVZhbHVlIGludGVyZXN0aW5nRHVyYXRpb24pIil9LAorICAgIHsiR2V0TWVkaWFEYXRhUmVmIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX0dldE1lZGlhRGF0YVJlZiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgaW5kZXgpIC0+IChIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlLCBsb25nIGRhdGFSZWZBdHRyaWJ1dGVzKSIpfSwKKyAgICB7IlNldE1lZGlhRGF0YVJlZiIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9TZXRNZWRpYURhdGFSZWYsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGluZGV4LCBIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlKSAtPiBOb25lIil9LAorICAgIHsiU2V0TWVkaWFEYXRhUmVmQXR0cmlidXRlcyIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9TZXRNZWRpYURhdGFSZWZBdHRyaWJ1dGVzLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBpbmRleCwgbG9uZyBkYXRhUmVmQXR0cmlidXRlcykgLT4gTm9uZSIpfSwKKyAgICB7IkFkZE1lZGlhRGF0YVJlZiIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9BZGRNZWRpYURhdGFSZWYsIDEsCisgICAgIFB5RG9jX1NUUigiKEhhbmRsZSBkYXRhUmVmLCBPU1R5cGUgZGF0YVJlZlR5cGUpIC0+IChzaG9ydCBpbmRleCkiKX0sCisgICAgeyJHZXRNZWRpYURhdGFSZWZDb3VudCIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9HZXRNZWRpYURhdGFSZWZDb3VudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgY291bnQpIil9LAorICAgIHsiU2V0TWVkaWFQbGF5SGludHMiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfU2V0TWVkaWFQbGF5SGludHMsIDEsCisgICAgIFB5RG9jX1NUUigiKGxvbmcgZmxhZ3MsIGxvbmcgZmxhZ3NNYXNrKSAtPiBOb25lIil9LAorICAgIHsiR2V0TWVkaWFQbGF5SGludHMiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfR2V0TWVkaWFQbGF5SGludHMsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKGxvbmcgZmxhZ3MpIil9LAorICAgIHsiR2V0TWVkaWFOZXh0SW50ZXJlc3RpbmdUaW1lT25seSIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9HZXRNZWRpYU5leHRJbnRlcmVzdGluZ1RpbWVPbmx5LCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBpbnRlcmVzdGluZ1RpbWVGbGFncywgVGltZVZhbHVlIHRpbWUsIEZpeGVkIHJhdGUpIC0+IChUaW1lVmFsdWUgaW50ZXJlc3RpbmdUaW1lKSIpfSwKKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKICNkZWZpbmUgTWVkaWFPYmpfZ2V0c2V0bGlzdCBOVUxMCkBAIC0zMzg1LDYxICszMzg1LDYxIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqTWVkaWFPYmpfdHBfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKl9hcmdzLCBQeU9iamVjdCAqX2t3ZHMpCiB7Ci0JUHlPYmplY3QgKl9zZWxmOwotCU1lZGlhIGl0c2VsZjsKLQljaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKKyAgICBQeU9iamVjdCAqX3NlbGY7CisgICAgTWVkaWEgaXRzZWxmOworICAgIGNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgTWVkaWFPYmpfQ29udmVydCwgJml0c2VsZikpIHJldHVybiBOVUxMOwotCWlmICgoX3NlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JKChNZWRpYU9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiBfc2VsZjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBNZWRpYU9ial9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAoKE1lZGlhT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgcmV0dXJuIF9zZWxmOwogfQogCiAjZGVmaW5lIE1lZGlhT2JqX3RwX2ZyZWUgUHlPYmplY3RfRGVsCiAKIAogUHlUeXBlT2JqZWN0IE1lZGlhX1R5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCi0JMCwgLypvYl9zaXplKi8KLQkiX1F0Lk1lZGlhIiwgLyp0cF9uYW1lKi8KLQlzaXplb2YoTWVkaWFPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCi0JMCwgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKSBNZWRpYU9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsIC8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLwotCShjbXBmdW5jKSBNZWRpYU9ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYykgTWVkaWFPYmpfcmVwciwgLyp0cF9yZXByKi8KLQkoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCi0JKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpIE1lZGlhT2JqX2hhc2gsIC8qdHBfaGFzaCovCi0JMCwgLyp0cF9jYWxsKi8KLQkwLCAvKnRwX3N0ciovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLwotCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCi0JMCwgLyp0cF9hc19idWZmZXIqLwotCVB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCTAsIC8qdHBfZG9jKi8KLQkwLCAvKnRwX3RyYXZlcnNlKi8KLQkwLCAvKnRwX2NsZWFyKi8KLQkwLCAvKnRwX3JpY2hjb21wYXJlKi8KLQkwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLQkwLCAvKnRwX2l0ZXIqLwotCTAsIC8qdHBfaXRlcm5leHQqLwotCU1lZGlhT2JqX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KLQkwLCAvKnRwX21lbWJlcnMqLwotCU1lZGlhT2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KLQkwLCAvKnRwX2Jhc2UqLwotCTAsIC8qdHBfZGljdCovCi0JMCwgLyp0cF9kZXNjcl9nZXQqLwotCTAsIC8qdHBfZGVzY3Jfc2V0Ki8KLQkwLCAvKnRwX2RpY3RvZmZzZXQqLwotCU1lZGlhT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KLQlNZWRpYU9ial90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KLQlNZWRpYU9ial90cF9uZXcsIC8qIHRwX25ldyAqLwotCU1lZGlhT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAvKm9iX3NpemUqLworICAgICJfUXQuTWVkaWEiLCAvKnRwX25hbWUqLworICAgIHNpemVvZihNZWRpYU9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpIE1lZGlhT2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgMCwgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCisgICAgKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCisgICAgKGNtcGZ1bmMpIE1lZGlhT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCisgICAgKHJlcHJmdW5jKSBNZWRpYU9ial9yZXByLCAvKnRwX3JlcHIqLworICAgIChQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIChQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLworICAgIChoYXNoZnVuYykgTWVkaWFPYmpfaGFzaCwgLyp0cF9oYXNoKi8KKyAgICAwLCAvKnRwX2NhbGwqLworICAgIDAsIC8qdHBfc3RyKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCisgICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgMCwgLyp0cF9kb2MqLworICAgIDAsIC8qdHBfdHJhdmVyc2UqLworICAgIDAsIC8qdHBfY2xlYXIqLworICAgIDAsIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsIC8qdHBfaXRlciovCisgICAgMCwgLyp0cF9pdGVybmV4dCovCisgICAgTWVkaWFPYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLworICAgIDAsIC8qdHBfbWVtYmVycyovCisgICAgTWVkaWFPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLworICAgIDAsIC8qdHBfYmFzZSovCisgICAgMCwgLyp0cF9kaWN0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX2dldCovCisgICAgMCwgLyp0cF9kZXNjcl9zZXQqLworICAgIDAsIC8qdHBfZGljdG9mZnNldCovCisgICAgTWVkaWFPYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLworICAgIE1lZGlhT2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLworICAgIE1lZGlhT2JqX3RwX25ldywgLyogdHBfbmV3ICovCisgICAgTWVkaWFPYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEVuZCBvYmplY3QgdHlwZSBNZWRpYSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0zNDUyLDEyNzEgKzM0NTIsMTI3MSBAQAogI2RlZmluZSBUcmFja09ial9DaGVjayh4KSAoKHgpLT5vYl90eXBlID09ICZUcmFja19UeXBlIHx8IFB5T2JqZWN0X1R5cGVDaGVjaygoeCksICZUcmFja19UeXBlKSkKIAogdHlwZWRlZiBzdHJ1Y3QgVHJhY2tPYmplY3QgewotCVB5T2JqZWN0X0hFQUQKLQlUcmFjayBvYl9pdHNlbGY7CisgICAgUHlPYmplY3RfSEVBRAorICAgIFRyYWNrIG9iX2l0c2VsZjsKIH0gVHJhY2tPYmplY3Q7CiAKIFB5T2JqZWN0ICpUcmFja09ial9OZXcoVHJhY2sgaXRzZWxmKQogewotCVRyYWNrT2JqZWN0ICppdDsKLQlpZiAoaXRzZWxmID09IE5VTEwpIHsKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhRdF9FcnJvciwiQ2Fubm90IGNyZWF0ZSBUcmFjayBmcm9tIE5VTEwgcG9pbnRlciIpOwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgfQotCWl0ID0gUHlPYmplY3RfTkVXKFRyYWNrT2JqZWN0LCAmVHJhY2tfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOwotCWl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIFRyYWNrT2JqZWN0ICppdDsKKyAgICBpZiAoaXRzZWxmID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhRdF9FcnJvciwiQ2Fubm90IGNyZWF0ZSBUcmFjayBmcm9tIE5VTEwgcG9pbnRlciIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgIGl0ID0gUHlPYmplY3RfTkVXKFRyYWNrT2JqZWN0LCAmVHJhY2tfVHlwZSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIGl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogCiBpbnQgVHJhY2tPYmpfQ29udmVydChQeU9iamVjdCAqdiwgVHJhY2sgKnBfaXRzZWxmKQogewotCWlmICh2ID09IFB5X05vbmUpCi0JewotCQkqcF9pdHNlbGYgPSBOVUxMOwotCQlyZXR1cm4gMTsKLQl9Ci0JaWYgKCFUcmFja09ial9DaGVjayh2KSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJUcmFjayByZXF1aXJlZCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JKnBfaXRzZWxmID0gKChUcmFja09iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0JcmV0dXJuIDE7CisgICAgaWYgKHYgPT0gUHlfTm9uZSkKKyAgICB7CisgICAgICAgICpwX2l0c2VsZiA9IE5VTEw7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAoIVRyYWNrT2JqX0NoZWNrKHYpKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIlRyYWNrIHJlcXVpcmVkIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAqcF9pdHNlbGYgPSAoKFRyYWNrT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIHZvaWQgVHJhY2tPYmpfZGVhbGxvYyhUcmFja09iamVjdCAqc2VsZikKIHsKLQlpZiAoc2VsZi0+b2JfaXRzZWxmKSBEaXNwb3NlTW92aWVUcmFjayhzZWxmLT5vYl9pdHNlbGYpOwotCXNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CisgICAgaWYgKHNlbGYtPm9iX2l0c2VsZikgRGlzcG9zZU1vdmllVHJhY2soc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRyYWNrT2JqX0xvYWRUcmFja0ludG9SYW0oVHJhY2tPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JVGltZVZhbHVlIHRpbWU7Ci0JVGltZVZhbHVlIGR1cmF0aW9uOwotCWxvbmcgZmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgVGltZVZhbHVlIHRpbWU7CisgICAgVGltZVZhbHVlIGR1cmF0aW9uOworICAgIGxvbmcgZmxhZ3M7CiAjaWZuZGVmIExvYWRUcmFja0ludG9SYW0KLQlQeU1hY19QUkVDSEVDSyhMb2FkVHJhY2tJbnRvUmFtKTsKKyAgICBQeU1hY19QUkVDSEVDSyhMb2FkVHJhY2tJbnRvUmFtKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAmZHVyYXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBMb2FkVHJhY2tJbnRvUmFtKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgdGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IExvYWRUcmFja0ludG9SYW0oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9HZXRUcmFja1BpY3QoVHJhY2tPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBpY0hhbmRsZSBfcnY7Ci0JVGltZVZhbHVlIHRpbWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBpY0hhbmRsZSBfcnY7CisgICAgVGltZVZhbHVlIHRpbWU7CiAjaWZuZGVmIEdldFRyYWNrUGljdAotCVB5TWFjX1BSRUNIRUNLKEdldFRyYWNrUGljdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VHJhY2tQaWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGltZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFRyYWNrUGljdChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICB0aW1lKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0VHJhY2tQaWN0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgIHRpbWUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9HZXRUcmFja0NsaXBSZ24oVHJhY2tPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJnbkhhbmRsZSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSBfcnY7CiAjaWZuZGVmIEdldFRyYWNrQ2xpcFJnbgotCVB5TWFjX1BSRUNIRUNLKEdldFRyYWNrQ2xpcFJnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VHJhY2tDbGlwUmduKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRUcmFja0NsaXBSZ24oX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRUcmFja0NsaXBSZ24oX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRyYWNrT2JqX1NldFRyYWNrQ2xpcFJnbihUcmFja09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIHRoZUNsaXA7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSB0aGVDbGlwOwogI2lmbmRlZiBTZXRUcmFja0NsaXBSZ24KLQlQeU1hY19QUkVDSEVDSyhTZXRUcmFja0NsaXBSZ24pOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFRyYWNrQ2xpcFJnbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlQ2xpcCkpCi0JCXJldHVybiBOVUxMOwotCVNldFRyYWNrQ2xpcFJnbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICB0aGVDbGlwKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUNsaXApKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRUcmFja0NsaXBSZ24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgdGhlQ2xpcCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRyYWNrT2JqX0dldFRyYWNrRGlzcGxheUJvdW5kc1JnbihUcmFja09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIF9ydjsKICNpZm5kZWYgR2V0VHJhY2tEaXNwbGF5Qm91bmRzUmduCi0JUHlNYWNfUFJFQ0hFQ0soR2V0VHJhY2tEaXNwbGF5Qm91bmRzUmduKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRUcmFja0Rpc3BsYXlCb3VuZHNSZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFRyYWNrRGlzcGxheUJvdW5kc1Jnbihfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFRyYWNrRGlzcGxheUJvdW5kc1Jnbihfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVHJhY2tPYmpfR2V0VHJhY2tNb3ZpZUJvdW5kc1JnbihUcmFja09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIF9ydjsKICNpZm5kZWYgR2V0VHJhY2tNb3ZpZUJvdW5kc1JnbgotCVB5TWFjX1BSRUNIRUNLKEdldFRyYWNrTW92aWVCb3VuZHNSZ24pOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFRyYWNrTW92aWVCb3VuZHNSZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFRyYWNrTW92aWVCb3VuZHNSZ24oX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRUcmFja01vdmllQm91bmRzUmduKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9HZXRUcmFja0JvdW5kc1JnbihUcmFja09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIF9ydjsKICNpZm5kZWYgR2V0VHJhY2tCb3VuZHNSZ24KLQlQeU1hY19QUkVDSEVDSyhHZXRUcmFja0JvdW5kc1Jnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VHJhY2tCb3VuZHNSZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFRyYWNrQm91bmRzUmduKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0VHJhY2tCb3VuZHNSZ24oX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRyYWNrT2JqX0dldFRyYWNrTWF0dGUoVHJhY2tPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBpeE1hcEhhbmRsZSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBpeE1hcEhhbmRsZSBfcnY7CiAjaWZuZGVmIEdldFRyYWNrTWF0dGUKLQlQeU1hY19QUkVDSEVDSyhHZXRUcmFja01hdHRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRUcmFja01hdHRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRUcmFja01hdHRlKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0VHJhY2tNYXR0ZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVHJhY2tPYmpfU2V0VHJhY2tNYXR0ZShUcmFja09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUGl4TWFwSGFuZGxlIHRoZU1hdHRlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQaXhNYXBIYW5kbGUgdGhlTWF0dGU7CiAjaWZuZGVmIFNldFRyYWNrTWF0dGUKLQlQeU1hY19QUkVDSEVDSyhTZXRUcmFja01hdHRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRUcmFja01hdHRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVNYXR0ZSkpCi0JCXJldHVybiBOVUxMOwotCVNldFRyYWNrTWF0dGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgIHRoZU1hdHRlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZU1hdHRlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0VHJhY2tNYXR0ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgdGhlTWF0dGUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9HZXRUcmFja0lEKFRyYWNrT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgbG9uZyBfcnY7CiAjaWZuZGVmIEdldFRyYWNrSUQKLQlQeU1hY19QUkVDSEVDSyhHZXRUcmFja0lEKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRUcmFja0lEKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRUcmFja0lEKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRUcmFja0lEKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRyYWNrT2JqX0dldFRyYWNrTW92aWUoVHJhY2tPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU1vdmllIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgTW92aWUgX3J2OwogI2lmbmRlZiBHZXRUcmFja01vdmllCi0JUHlNYWNfUFJFQ0hFQ0soR2V0VHJhY2tNb3ZpZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VHJhY2tNb3ZpZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0VHJhY2tNb3ZpZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0VHJhY2tNb3ZpZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9HZXRUcmFja0NyZWF0aW9uVGltZShUcmFja09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JdW5zaWduZWQgbG9uZyBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHVuc2lnbmVkIGxvbmcgX3J2OwogI2lmbmRlZiBHZXRUcmFja0NyZWF0aW9uVGltZQotCVB5TWFjX1BSRUNIRUNLKEdldFRyYWNrQ3JlYXRpb25UaW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRUcmFja0NyZWF0aW9uVGltZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0VHJhY2tDcmVhdGlvblRpbWUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFRyYWNrQ3JlYXRpb25UaW1lKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRyYWNrT2JqX0dldFRyYWNrTW9kaWZpY2F0aW9uVGltZShUcmFja09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JdW5zaWduZWQgbG9uZyBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHVuc2lnbmVkIGxvbmcgX3J2OwogI2lmbmRlZiBHZXRUcmFja01vZGlmaWNhdGlvblRpbWUKLQlQeU1hY19QUkVDSEVDSyhHZXRUcmFja01vZGlmaWNhdGlvblRpbWUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFRyYWNrTW9kaWZpY2F0aW9uVGltZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0VHJhY2tNb2RpZmljYXRpb25UaW1lKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRUcmFja01vZGlmaWNhdGlvblRpbWUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVHJhY2tPYmpfR2V0VHJhY2tFbmFibGVkKFRyYWNrT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CiAjaWZuZGVmIEdldFRyYWNrRW5hYmxlZAotCVB5TWFjX1BSRUNIRUNLKEdldFRyYWNrRW5hYmxlZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VHJhY2tFbmFibGVkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRUcmFja0VuYWJsZWQoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFRyYWNrRW5hYmxlZChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9TZXRUcmFja0VuYWJsZWQoVHJhY2tPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gaXNFbmFibGVkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIGlzRW5hYmxlZDsKICNpZm5kZWYgU2V0VHJhY2tFbmFibGVkCi0JUHlNYWNfUFJFQ0hFQ0soU2V0VHJhY2tFbmFibGVkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRUcmFja0VuYWJsZWQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpc0VuYWJsZWQpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRUcmFja0VuYWJsZWQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgaXNFbmFibGVkKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpc0VuYWJsZWQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRUcmFja0VuYWJsZWQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgaXNFbmFibGVkKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVHJhY2tPYmpfR2V0VHJhY2tVc2FnZShUcmFja09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgX3J2OwogI2lmbmRlZiBHZXRUcmFja1VzYWdlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0VHJhY2tVc2FnZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VHJhY2tVc2FnZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0VHJhY2tVc2FnZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0VHJhY2tVc2FnZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9TZXRUcmFja1VzYWdlKFRyYWNrT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIHVzYWdlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBsb25nIHVzYWdlOwogI2lmbmRlZiBTZXRUcmFja1VzYWdlCi0JUHlNYWNfUFJFQ0hFQ0soU2V0VHJhY2tVc2FnZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0VHJhY2tVc2FnZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnVzYWdlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0VHJhY2tVc2FnZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgdXNhZ2UpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnVzYWdlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0VHJhY2tVc2FnZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgdXNhZ2UpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9HZXRUcmFja0R1cmF0aW9uKFRyYWNrT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlUaW1lVmFsdWUgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBUaW1lVmFsdWUgX3J2OwogI2lmbmRlZiBHZXRUcmFja0R1cmF0aW9uCi0JUHlNYWNfUFJFQ0hFQ0soR2V0VHJhY2tEdXJhdGlvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VHJhY2tEdXJhdGlvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0VHJhY2tEdXJhdGlvbihfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0VHJhY2tEdXJhdGlvbihfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9HZXRUcmFja09mZnNldChUcmFja09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVGltZVZhbHVlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVGltZVZhbHVlIF9ydjsKICNpZm5kZWYgR2V0VHJhY2tPZmZzZXQKLQlQeU1hY19QUkVDSEVDSyhHZXRUcmFja09mZnNldCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VHJhY2tPZmZzZXQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFRyYWNrT2Zmc2V0KF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRUcmFja09mZnNldChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9TZXRUcmFja09mZnNldChUcmFja09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVGltZVZhbHVlIG1vdmllT2Zmc2V0VGltZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVGltZVZhbHVlIG1vdmllT2Zmc2V0VGltZTsKICNpZm5kZWYgU2V0VHJhY2tPZmZzZXQKLQlQeU1hY19QUkVDSEVDSyhTZXRUcmFja09mZnNldCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0VHJhY2tPZmZzZXQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZtb3ZpZU9mZnNldFRpbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRUcmFja09mZnNldChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgIG1vdmllT2Zmc2V0VGltZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbW92aWVPZmZzZXRUaW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0VHJhY2tPZmZzZXQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICBtb3ZpZU9mZnNldFRpbWUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9HZXRUcmFja0xheWVyKFRyYWNrT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IF9ydjsKICNpZm5kZWYgR2V0VHJhY2tMYXllcgotCVB5TWFjX1BSRUNIRUNLKEdldFRyYWNrTGF5ZXIpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFRyYWNrTGF5ZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFRyYWNrTGF5ZXIoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFRyYWNrTGF5ZXIoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVHJhY2tPYmpfU2V0VHJhY2tMYXllcihUcmFja09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgbGF5ZXI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IGxheWVyOwogI2lmbmRlZiBTZXRUcmFja0xheWVyCi0JUHlNYWNfUFJFQ0hFQ0soU2V0VHJhY2tMYXllcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0VHJhY2tMYXllcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmxheWVyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0VHJhY2tMYXllcihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgbGF5ZXIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmxheWVyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0VHJhY2tMYXllcihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgbGF5ZXIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9HZXRUcmFja0FsdGVybmF0ZShUcmFja09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVHJhY2sgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBUcmFjayBfcnY7CiAjaWZuZGVmIEdldFRyYWNrQWx0ZXJuYXRlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0VHJhY2tBbHRlcm5hdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFRyYWNrQWx0ZXJuYXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRUcmFja0FsdGVybmF0ZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFRyYWNrT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0VHJhY2tBbHRlcm5hdGUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVHJhY2tPYmpfU2V0VHJhY2tBbHRlcm5hdGUoVHJhY2tPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVRyYWNrIGFsdGVybmF0ZVQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFRyYWNrIGFsdGVybmF0ZVQ7CiAjaWZuZGVmIFNldFRyYWNrQWx0ZXJuYXRlCi0JUHlNYWNfUFJFQ0hFQ0soU2V0VHJhY2tBbHRlcm5hdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFRyYWNrQWx0ZXJuYXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfQ29udmVydCwgJmFsdGVybmF0ZVQpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRUcmFja0FsdGVybmF0ZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgIGFsdGVybmF0ZVQpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYWNrT2JqX0NvbnZlcnQsICZhbHRlcm5hdGVUKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0VHJhY2tBbHRlcm5hdGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICBhbHRlcm5hdGVUKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVHJhY2tPYmpfR2V0VHJhY2tWb2x1bWUoVHJhY2tPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgX3J2OwogI2lmbmRlZiBHZXRUcmFja1ZvbHVtZQotCVB5TWFjX1BSRUNIRUNLKEdldFRyYWNrVm9sdW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRUcmFja1ZvbHVtZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0VHJhY2tWb2x1bWUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFRyYWNrVm9sdW1lKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRyYWNrT2JqX1NldFRyYWNrVm9sdW1lKFRyYWNrT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCB2b2x1bWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IHZvbHVtZTsKICNpZm5kZWYgU2V0VHJhY2tWb2x1bWUKLQlQeU1hY19QUkVDSEVDSyhTZXRUcmFja1ZvbHVtZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0VHJhY2tWb2x1bWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2b2x1bWUpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRUcmFja1ZvbHVtZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgIHZvbHVtZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdm9sdW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0VHJhY2tWb2x1bWUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICB2b2x1bWUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9HZXRUcmFja0RpbWVuc2lvbnMoVHJhY2tPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUZpeGVkIHdpZHRoOwotCUZpeGVkIGhlaWdodDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgRml4ZWQgd2lkdGg7CisgICAgRml4ZWQgaGVpZ2h0OwogI2lmbmRlZiBHZXRUcmFja0RpbWVuc2lvbnMKLQlQeU1hY19QUkVDSEVDSyhHZXRUcmFja0RpbWVuc2lvbnMpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFRyYWNrRGltZW5zaW9ucyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0VHJhY2tEaW1lbnNpb25zKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICZ3aWR0aCwKLQkgICAgICAgICAgICAgICAgICAgJmhlaWdodCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRml4ZWQsIHdpZHRoLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRml4ZWQsIGhlaWdodCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldFRyYWNrRGltZW5zaW9ucyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAmd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICZoZWlnaHQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBoZWlnaHQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRyYWNrT2JqX1NldFRyYWNrRGltZW5zaW9ucyhUcmFja09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JRml4ZWQgd2lkdGg7Ci0JRml4ZWQgaGVpZ2h0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBGaXhlZCB3aWR0aDsKKyAgICBGaXhlZCBoZWlnaHQ7CiAjaWZuZGVmIFNldFRyYWNrRGltZW5zaW9ucwotCVB5TWFjX1BSRUNIRUNLKFNldFRyYWNrRGltZW5zaW9ucyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0VHJhY2tEaW1lbnNpb25zKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJndpZHRoLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJmhlaWdodCkpCi0JCXJldHVybiBOVUxMOwotCVNldFRyYWNrRGltZW5zaW9ucyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICB3aWR0aCwKLQkgICAgICAgICAgICAgICAgICAgaGVpZ2h0KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmaGVpZ2h0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0VHJhY2tEaW1lbnNpb25zKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9HZXRUcmFja1VzZXJEYXRhKFRyYWNrT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlVc2VyRGF0YSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFVzZXJEYXRhIF9ydjsKICNpZm5kZWYgR2V0VHJhY2tVc2VyRGF0YQotCVB5TWFjX1BSRUNIRUNLKEdldFRyYWNrVXNlckRhdGEpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFRyYWNrVXNlckRhdGEpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFRyYWNrVXNlckRhdGEoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBVc2VyRGF0YU9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFRyYWNrVXNlckRhdGEoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBVc2VyRGF0YU9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVHJhY2tPYmpfR2V0VHJhY2tTb3VuZExvY2FsaXphdGlvblNldHRpbmdzKFRyYWNrT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUhhbmRsZSBzZXR0aW5nczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBIYW5kbGUgc2V0dGluZ3M7CiAjaWZuZGVmIEdldFRyYWNrU291bmRMb2NhbGl6YXRpb25TZXR0aW5ncwotCVB5TWFjX1BSRUNIRUNLKEdldFRyYWNrU291bmRMb2NhbGl6YXRpb25TZXR0aW5ncyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VHJhY2tTb3VuZExvY2FsaXphdGlvblNldHRpbmdzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0VHJhY2tTb3VuZExvY2FsaXphdGlvblNldHRpbmdzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2V0dGluZ3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBzZXR0aW5ncyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRUcmFja1NvdW5kTG9jYWxpemF0aW9uU2V0dGluZ3MoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXR0aW5ncyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHNldHRpbmdzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9TZXRUcmFja1NvdW5kTG9jYWxpemF0aW9uU2V0dGluZ3MoVHJhY2tPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSGFuZGxlIHNldHRpbmdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEhhbmRsZSBzZXR0aW5nczsKICNpZm5kZWYgU2V0VHJhY2tTb3VuZExvY2FsaXphdGlvblNldHRpbmdzCi0JUHlNYWNfUFJFQ0hFQ0soU2V0VHJhY2tTb3VuZExvY2FsaXphdGlvblNldHRpbmdzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRUcmFja1NvdW5kTG9jYWxpemF0aW9uU2V0dGluZ3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNldHRpbmdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldFRyYWNrU291bmRMb2NhbGl6YXRpb25TZXR0aW5ncyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzZXR0aW5ncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRUcmFja1NvdW5kTG9jYWxpemF0aW9uU2V0dGluZ3MoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9OZXdUcmFja01lZGlhKFRyYWNrT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlNZWRpYSBfcnY7Ci0JT1NUeXBlIG1lZGlhVHlwZTsKLQlUaW1lU2NhbGUgdGltZVNjYWxlOwotCUhhbmRsZSBkYXRhUmVmOwotCU9TVHlwZSBkYXRhUmVmVHlwZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgTWVkaWEgX3J2OworICAgIE9TVHlwZSBtZWRpYVR5cGU7CisgICAgVGltZVNjYWxlIHRpbWVTY2FsZTsKKyAgICBIYW5kbGUgZGF0YVJlZjsKKyAgICBPU1R5cGUgZGF0YVJlZlR5cGU7CiAjaWZuZGVmIE5ld1RyYWNrTWVkaWEKLQlQeU1hY19QUkVDSEVDSyhOZXdUcmFja01lZGlhKTsKKyAgICBQeU1hY19QUkVDSEVDSyhOZXdUcmFja01lZGlhKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbE8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZtZWRpYVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aW1lU2NhbGUsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGF0YVJlZlR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBOZXdUcmFja01lZGlhKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICBtZWRpYVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICB0aW1lU2NhbGUsCi0JICAgICAgICAgICAgICAgICAgICBkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgZGF0YVJlZlR5cGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgTWVkaWFPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbE8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZtZWRpYVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aW1lU2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGF0YVJlZlR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBOZXdUcmFja01lZGlhKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICB0aW1lU2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZlR5cGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRyYWNrT2JqX0dldFRyYWNrTWVkaWEoVHJhY2tPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU1lZGlhIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgTWVkaWEgX3J2OwogI2lmbmRlZiBHZXRUcmFja01lZGlhCi0JUHlNYWNfUFJFQ0hFQ0soR2V0VHJhY2tNZWRpYSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VHJhY2tNZWRpYSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0VHJhY2tNZWRpYShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIE1lZGlhT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0VHJhY2tNZWRpYShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9JbnNlcnRNZWRpYUludG9UcmFjayhUcmFja09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlUaW1lVmFsdWUgdHJhY2tTdGFydDsKLQlUaW1lVmFsdWUgbWVkaWFUaW1lOwotCVRpbWVWYWx1ZSBtZWRpYUR1cmF0aW9uOwotCUZpeGVkIG1lZGlhUmF0ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBUaW1lVmFsdWUgdHJhY2tTdGFydDsKKyAgICBUaW1lVmFsdWUgbWVkaWFUaW1lOworICAgIFRpbWVWYWx1ZSBtZWRpYUR1cmF0aW9uOworICAgIEZpeGVkIG1lZGlhUmF0ZTsKICNpZm5kZWYgSW5zZXJ0TWVkaWFJbnRvVHJhY2sKLQlQeU1hY19QUkVDSEVDSyhJbnNlcnRNZWRpYUludG9UcmFjayk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSW5zZXJ0TWVkaWFJbnRvVHJhY2spOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGxsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdHJhY2tTdGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1lZGlhVGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1lZGlhRHVyYXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmbWVkaWFSYXRlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEluc2VydE1lZGlhSW50b1RyYWNrKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrU3RhcnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhVGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFEdXJhdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFSYXRlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbGxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFja1N0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVkaWFUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVkaWFEdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZtZWRpYVJhdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gSW5zZXJ0TWVkaWFJbnRvVHJhY2soX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUR1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYVJhdGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRyYWNrT2JqX0luc2VydFRyYWNrU2VnbWVudChUcmFja09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlUcmFjayBkc3RUcmFjazsKLQlUaW1lVmFsdWUgc3JjSW47Ci0JVGltZVZhbHVlIHNyY0R1cmF0aW9uOwotCVRpbWVWYWx1ZSBkc3RJbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBUcmFjayBkc3RUcmFjazsKKyAgICBUaW1lVmFsdWUgc3JjSW47CisgICAgVGltZVZhbHVlIHNyY0R1cmF0aW9uOworICAgIFRpbWVWYWx1ZSBkc3RJbjsKICNpZm5kZWYgSW5zZXJ0VHJhY2tTZWdtZW50Ci0JUHlNYWNfUFJFQ0hFQ0soSW5zZXJ0VHJhY2tTZWdtZW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhJbnNlcnRUcmFja1NlZ21lbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9Db252ZXJ0LCAmZHN0VHJhY2ssCi0JICAgICAgICAgICAgICAgICAgICAgICZzcmNJbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNyY0R1cmF0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAmZHN0SW4pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gSW5zZXJ0VHJhY2tTZWdtZW50KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RUcmFjaywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0luLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjRHVyYXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RJbik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9Db252ZXJ0LCAmZHN0VHJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzcmNJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNyY0R1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZHN0SW4pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gSW5zZXJ0VHJhY2tTZWdtZW50KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RUcmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjRHVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RJbik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVHJhY2tPYmpfSW5zZXJ0RW1wdHlUcmFja1NlZ21lbnQoVHJhY2tPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JVGltZVZhbHVlIGRzdEluOwotCVRpbWVWYWx1ZSBkc3REdXJhdGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBUaW1lVmFsdWUgZHN0SW47CisgICAgVGltZVZhbHVlIGRzdER1cmF0aW9uOwogI2lmbmRlZiBJbnNlcnRFbXB0eVRyYWNrU2VnbWVudAotCVB5TWFjX1BSRUNIRUNLKEluc2VydEVtcHR5VHJhY2tTZWdtZW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhJbnNlcnRFbXB0eVRyYWNrU2VnbWVudCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZkc3RJbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRzdER1cmF0aW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEluc2VydEVtcHR5VHJhY2tTZWdtZW50KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEluLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3REdXJhdGlvbik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZHN0SW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkc3REdXJhdGlvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBJbnNlcnRFbXB0eVRyYWNrU2VnbWVudChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0RHVyYXRpb24pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRyYWNrT2JqX0RlbGV0ZVRyYWNrU2VnbWVudChUcmFja09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlUaW1lVmFsdWUgc3RhcnRUaW1lOwotCVRpbWVWYWx1ZSBkdXJhdGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBUaW1lVmFsdWUgc3RhcnRUaW1lOworICAgIFRpbWVWYWx1ZSBkdXJhdGlvbjsKICNpZm5kZWYgRGVsZXRlVHJhY2tTZWdtZW50Ci0JUHlNYWNfUFJFQ0hFQ0soRGVsZXRlVHJhY2tTZWdtZW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhEZWxldGVUcmFja1NlZ21lbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmc3RhcnRUaW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAmZHVyYXRpb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRGVsZXRlVHJhY2tTZWdtZW50KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhcnRUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZHVyYXRpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRGVsZXRlVHJhY2tTZWdtZW50KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVHJhY2tPYmpfU2NhbGVUcmFja1NlZ21lbnQoVHJhY2tPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JVGltZVZhbHVlIHN0YXJ0VGltZTsKLQlUaW1lVmFsdWUgb2xkRHVyYXRpb247Ci0JVGltZVZhbHVlIG5ld0R1cmF0aW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFRpbWVWYWx1ZSBzdGFydFRpbWU7CisgICAgVGltZVZhbHVlIG9sZER1cmF0aW9uOworICAgIFRpbWVWYWx1ZSBuZXdEdXJhdGlvbjsKICNpZm5kZWYgU2NhbGVUcmFja1NlZ21lbnQKLQlQeU1hY19QUkVDSEVDSyhTY2FsZVRyYWNrU2VnbWVudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2NhbGVUcmFja1NlZ21lbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0VGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJm9sZER1cmF0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAmbmV3RHVyYXRpb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2NhbGVUcmFja1NlZ21lbnQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBvbGREdXJhdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RHVyYXRpb24pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGFydFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZvbGREdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld0R1cmF0aW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNjYWxlVHJhY2tTZWdtZW50KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkRHVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0R1cmF0aW9uKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9Jc1NjcmFwTW92aWUoVHJhY2tPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudCBfcnY7CiAjaWZuZGVmIElzU2NyYXBNb3ZpZQotCVB5TWFjX1BSRUNIRUNLKElzU2NyYXBNb3ZpZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSXNTY3JhcE1vdmllKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBJc1NjcmFwTW92aWUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDbXBPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBJc1NjcmFwTW92aWUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDbXBPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRyYWNrT2JqX0NvcHlUcmFja1NldHRpbmdzKFRyYWNrT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVRyYWNrIGRzdFRyYWNrOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFRyYWNrIGRzdFRyYWNrOwogI2lmbmRlZiBDb3B5VHJhY2tTZXR0aW5ncwotCVB5TWFjX1BSRUNIRUNLKENvcHlUcmFja1NldHRpbmdzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb3B5VHJhY2tTZXR0aW5ncyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFRyYWNrT2JqX0NvbnZlcnQsICZkc3RUcmFjaykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDb3B5VHJhY2tTZXR0aW5ncyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBkc3RUcmFjayk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9Db252ZXJ0LCAmZHN0VHJhY2spKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ29weVRyYWNrU2V0dGluZ3MoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0VHJhY2spOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRyYWNrT2JqX0FkZEVtcHR5VHJhY2tUb01vdmllKFRyYWNrT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCU1vdmllIGRzdE1vdmllOwotCUhhbmRsZSBkYXRhUmVmOwotCU9TVHlwZSBkYXRhUmVmVHlwZTsKLQlUcmFjayBkc3RUcmFjazsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBNb3ZpZSBkc3RNb3ZpZTsKKyAgICBIYW5kbGUgZGF0YVJlZjsKKyAgICBPU1R5cGUgZGF0YVJlZlR5cGU7CisgICAgVHJhY2sgZHN0VHJhY2s7CiAjaWZuZGVmIEFkZEVtcHR5VHJhY2tUb01vdmllCi0JUHlNYWNfUFJFQ0hFQ0soQWRkRW1wdHlUcmFja1RvTW92aWUpOworICAgIFB5TWFjX1BSRUNIRUNLKEFkZEVtcHR5VHJhY2tUb01vdmllKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX0NvbnZlcnQsICZkc3RNb3ZpZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkYXRhUmVmVHlwZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBZGRFbXB0eVRyYWNrVG9Nb3ZpZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RNb3ZpZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZlR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkc3RUcmFjayk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFRyYWNrT2JqX05ldywgZHN0VHJhY2spOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX0NvbnZlcnQsICZkc3RNb3ZpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkYXRhUmVmVHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBBZGRFbXB0eVRyYWNrVG9Nb3ZpZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RNb3ZpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZlR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkc3RUcmFjayk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFRyYWNrT2JqX05ldywgZHN0VHJhY2spOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRyYWNrT2JqX0FkZENsb25lZFRyYWNrVG9Nb3ZpZShUcmFja09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlNb3ZpZSBkc3RNb3ZpZTsKLQlsb25nIGZsYWdzOwotCVRyYWNrIGRzdFRyYWNrOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIE1vdmllIGRzdE1vdmllOworICAgIGxvbmcgZmxhZ3M7CisgICAgVHJhY2sgZHN0VHJhY2s7CiAjaWZuZGVmIEFkZENsb25lZFRyYWNrVG9Nb3ZpZQotCVB5TWFjX1BSRUNIRUNLKEFkZENsb25lZFRyYWNrVG9Nb3ZpZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQWRkQ2xvbmVkVHJhY2tUb01vdmllKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX0NvbnZlcnQsICZkc3RNb3ZpZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEFkZENsb25lZFRyYWNrVG9Nb3ZpZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0TW92aWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkc3RUcmFjayk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFRyYWNrT2JqX05ldywgZHN0VHJhY2spOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX0NvbnZlcnQsICZkc3RNb3ZpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFkZENsb25lZFRyYWNrVG9Nb3ZpZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0TW92aWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkc3RUcmFjayk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFRyYWNrT2JqX05ldywgZHN0VHJhY2spOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRyYWNrT2JqX0FkZFRyYWNrUmVmZXJlbmNlKFRyYWNrT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVRyYWNrIHJlZlRyYWNrOwotCU9TVHlwZSByZWZUeXBlOwotCWxvbmcgYWRkZWRJbmRleDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBUcmFjayByZWZUcmFjazsKKyAgICBPU1R5cGUgcmVmVHlwZTsKKyAgICBsb25nIGFkZGVkSW5kZXg7CiAjaWZuZGVmIEFkZFRyYWNrUmVmZXJlbmNlCi0JUHlNYWNfUFJFQ0hFQ0soQWRkVHJhY2tSZWZlcmVuY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKEFkZFRyYWNrUmVmZXJlbmNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9Db252ZXJ0LCAmcmVmVHJhY2ssCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnJlZlR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQWRkVHJhY2tSZWZlcmVuY2UoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgcmVmVHJhY2ssCi0JICAgICAgICAgICAgICAgICAgICAgICAgIHJlZlR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZhZGRlZEluZGV4KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBhZGRlZEluZGV4KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfQ29udmVydCwgJnJlZlRyYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZyZWZUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFkZFRyYWNrUmVmZXJlbmNlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZlRyYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYWRkZWRJbmRleCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgYWRkZWRJbmRleCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVHJhY2tPYmpfRGVsZXRlVHJhY2tSZWZlcmVuY2UoVHJhY2tPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JT1NUeXBlIHJlZlR5cGU7Ci0JbG9uZyBpbmRleDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBPU1R5cGUgcmVmVHlwZTsKKyAgICBsb25nIGluZGV4OwogI2lmbmRlZiBEZWxldGVUcmFja1JlZmVyZW5jZQotCVB5TWFjX1BSRUNIRUNLKERlbGV0ZVRyYWNrUmVmZXJlbmNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEZWxldGVUcmFja1JlZmVyZW5jZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZyZWZUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRGVsZXRlVHJhY2tSZWZlcmVuY2UoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnJlZlR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBEZWxldGVUcmFja1JlZmVyZW5jZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVHJhY2tPYmpfU2V0VHJhY2tSZWZlcmVuY2UoVHJhY2tPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JVHJhY2sgcmVmVHJhY2s7Ci0JT1NUeXBlIHJlZlR5cGU7Ci0JbG9uZyBpbmRleDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBUcmFjayByZWZUcmFjazsKKyAgICBPU1R5cGUgcmVmVHlwZTsKKyAgICBsb25nIGluZGV4OwogI2lmbmRlZiBTZXRUcmFja1JlZmVyZW5jZQotCVB5TWFjX1BSRUNIRUNLKFNldFRyYWNrUmVmZXJlbmNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRUcmFja1JlZmVyZW5jZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFRyYWNrT2JqX0NvbnZlcnQsICZyZWZUcmFjaywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcmVmVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluZGV4KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldFRyYWNrUmVmZXJlbmNlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIHJlZlRyYWNrLAotCSAgICAgICAgICAgICAgICAgICAgICAgICByZWZUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9Db252ZXJ0LCAmcmVmVHJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnJlZlR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRUcmFja1JlZmVyZW5jZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZUcmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRyYWNrT2JqX0dldFRyYWNrUmVmZXJlbmNlKFRyYWNrT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlUcmFjayBfcnY7Ci0JT1NUeXBlIHJlZlR5cGU7Ci0JbG9uZyBpbmRleDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVHJhY2sgX3J2OworICAgIE9TVHlwZSByZWZUeXBlOworICAgIGxvbmcgaW5kZXg7CiAjaWZuZGVmIEdldFRyYWNrUmVmZXJlbmNlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0VHJhY2tSZWZlcmVuY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFRyYWNrUmVmZXJlbmNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnJlZlR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFRyYWNrUmVmZXJlbmNlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgcmVmVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcmVmVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZGV4KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0VHJhY2tSZWZlcmVuY2UoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFRyYWNrT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9HZXROZXh0VHJhY2tSZWZlcmVuY2VUeXBlKFRyYWNrT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1R5cGUgX3J2OwotCU9TVHlwZSByZWZUeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1R5cGUgX3J2OworICAgIE9TVHlwZSByZWZUeXBlOwogI2lmbmRlZiBHZXROZXh0VHJhY2tSZWZlcmVuY2VUeXBlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TmV4dFRyYWNrUmVmZXJlbmNlVHlwZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TmV4dFRyYWNrUmVmZXJlbmNlVHlwZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnJlZlR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXROZXh0VHJhY2tSZWZlcmVuY2VUeXBlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZUeXBlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcmVmVHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE5leHRUcmFja1JlZmVyZW5jZVR5cGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZlR5cGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVHJhY2tPYmpfR2V0VHJhY2tSZWZlcmVuY2VDb3VudChUcmFja09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBfcnY7Ci0JT1NUeXBlIHJlZlR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgX3J2OworICAgIE9TVHlwZSByZWZUeXBlOwogI2lmbmRlZiBHZXRUcmFja1JlZmVyZW5jZUNvdW50Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0VHJhY2tSZWZlcmVuY2VDb3VudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VHJhY2tSZWZlcmVuY2VDb3VudCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnJlZlR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRUcmFja1JlZmVyZW5jZUNvdW50KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZUeXBlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnJlZlR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRUcmFja1JlZmVyZW5jZUNvdW50KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZUeXBlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9HZXRUcmFja0VkaXRSYXRlKFRyYWNrT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlGaXhlZCBfcnY7Ci0JVGltZVZhbHVlIGF0VGltZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgRml4ZWQgX3J2OworICAgIFRpbWVWYWx1ZSBhdFRpbWU7CiAjaWZuZGVmIEdldFRyYWNrRWRpdFJhdGUKLQlQeU1hY19QUkVDSEVDSyhHZXRUcmFja0VkaXRSYXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRUcmFja0VkaXRSYXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmYXRUaW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0VHJhY2tFZGl0UmF0ZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgYXRUaW1lKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRml4ZWQsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhdFRpbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRUcmFja0VkaXRSYXRlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhdFRpbWUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGaXhlZCwgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9HZXRUcmFja0RhdGFTaXplKFRyYWNrT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIF9ydjsKLQlUaW1lVmFsdWUgc3RhcnRUaW1lOwotCVRpbWVWYWx1ZSBkdXJhdGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgbG9uZyBfcnY7CisgICAgVGltZVZhbHVlIHN0YXJ0VGltZTsKKyAgICBUaW1lVmFsdWUgZHVyYXRpb247CiAjaWZuZGVmIEdldFRyYWNrRGF0YVNpemUKLQlQeU1hY19QUkVDSEVDSyhHZXRUcmFja0RhdGFTaXplKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRUcmFja0RhdGFTaXplKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0VGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmR1cmF0aW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0VHJhY2tEYXRhU2l6ZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0VGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmR1cmF0aW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0VHJhY2tEYXRhU2l6ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRyYWNrT2JqX0dldFRyYWNrRGF0YVNpemU2NChUcmFja09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlUaW1lVmFsdWUgc3RhcnRUaW1lOwotCVRpbWVWYWx1ZSBkdXJhdGlvbjsKLQl3aWRlIGRhdGFTaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFRpbWVWYWx1ZSBzdGFydFRpbWU7CisgICAgVGltZVZhbHVlIGR1cmF0aW9uOworICAgIHdpZGUgZGF0YVNpemU7CiAjaWZuZGVmIEdldFRyYWNrRGF0YVNpemU2NAotCVB5TWFjX1BSRUNIRUNLKEdldFRyYWNrRGF0YVNpemU2NCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VHJhY2tEYXRhU2l6ZTY0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0VGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmR1cmF0aW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldFRyYWNrRGF0YVNpemU2NChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVNpemUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZHdpZGUsIGRhdGFTaXplKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGFydFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRUcmFja0RhdGFTaXplNjQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFTaXplKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGR3aWRlLCBkYXRhU2l6ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVHJhY2tPYmpfUHRJblRyYWNrKFRyYWNrT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlQb2ludCBwdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgUG9pbnQgcHQ7CiAjaWZuZGVmIFB0SW5UcmFjawotCVB5TWFjX1BSRUNIRUNLKFB0SW5UcmFjayk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUHRJblRyYWNrKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZwdCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFB0SW5UcmFjayhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICBwdCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnB0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gUHRJblRyYWNrKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgIHB0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9Db3B5VHJhY2tVc2VyRGF0YShUcmFja09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlUcmFjayBkc3RUcmFjazsKLQlPU1R5cGUgY29weVJ1bGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgVHJhY2sgZHN0VHJhY2s7CisgICAgT1NUeXBlIGNvcHlSdWxlOwogI2lmbmRlZiBDb3B5VHJhY2tVc2VyRGF0YQotCVB5TWFjX1BSRUNIRUNLKENvcHlUcmFja1VzZXJEYXRhKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb3B5VHJhY2tVc2VyRGF0YSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfQ29udmVydCwgJmRzdFRyYWNrLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjb3B5UnVsZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDb3B5VHJhY2tVc2VyRGF0YShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBkc3RUcmFjaywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgY29weVJ1bGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9Db252ZXJ0LCAmZHN0VHJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNvcHlSdWxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENvcHlUcmFja1VzZXJEYXRhKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFRyYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3B5UnVsZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVHJhY2tPYmpfR2V0VHJhY2tOZXh0SW50ZXJlc3RpbmdUaW1lKFRyYWNrT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBpbnRlcmVzdGluZ1RpbWVGbGFnczsKLQlUaW1lVmFsdWUgdGltZTsKLQlGaXhlZCByYXRlOwotCVRpbWVWYWx1ZSBpbnRlcmVzdGluZ1RpbWU7Ci0JVGltZVZhbHVlIGludGVyZXN0aW5nRHVyYXRpb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IGludGVyZXN0aW5nVGltZUZsYWdzOworICAgIFRpbWVWYWx1ZSB0aW1lOworICAgIEZpeGVkIHJhdGU7CisgICAgVGltZVZhbHVlIGludGVyZXN0aW5nVGltZTsKKyAgICBUaW1lVmFsdWUgaW50ZXJlc3RpbmdEdXJhdGlvbjsKICNpZm5kZWYgR2V0VHJhY2tOZXh0SW50ZXJlc3RpbmdUaW1lCi0JUHlNYWNfUFJFQ0hFQ0soR2V0VHJhY2tOZXh0SW50ZXJlc3RpbmdUaW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRUcmFja05leHRJbnRlcmVzdGluZ1RpbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbnRlcmVzdGluZ1RpbWVGbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgJnRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmcmF0ZSkpCi0JCXJldHVybiBOVUxMOwotCUdldFRyYWNrTmV4dEludGVyZXN0aW5nVGltZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmVzdGluZ1RpbWVGbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmludGVyZXN0aW5nVGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmludGVyZXN0aW5nRHVyYXRpb24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgaW50ZXJlc3RpbmdUaW1lLAotCSAgICAgICAgICAgICAgICAgICAgIGludGVyZXN0aW5nRHVyYXRpb24pOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW50ZXJlc3RpbmdUaW1lRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJnJhdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRUcmFja05leHRJbnRlcmVzdGluZ1RpbWUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJlc3RpbmdUaW1lRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnRlcmVzdGluZ1RpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnRlcmVzdGluZ0R1cmF0aW9uKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZXN0aW5nVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmVzdGluZ0R1cmF0aW9uKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9HZXRUcmFja1NlZ21lbnREaXNwbGF5Qm91bmRzUmduKFRyYWNrT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZ25IYW5kbGUgX3J2OwotCVRpbWVWYWx1ZSB0aW1lOwotCVRpbWVWYWx1ZSBkdXJhdGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIF9ydjsKKyAgICBUaW1lVmFsdWUgdGltZTsKKyAgICBUaW1lVmFsdWUgZHVyYXRpb247CiAjaWZuZGVmIEdldFRyYWNrU2VnbWVudERpc3BsYXlCb3VuZHNSZ24KLQlQeU1hY19QUkVDSEVDSyhHZXRUcmFja1NlZ21lbnREaXNwbGF5Qm91bmRzUmduKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRUcmFja1NlZ21lbnREaXNwbGF5Qm91bmRzUmduKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFRyYWNrU2VnbWVudERpc3BsYXlCb3VuZHNSZ24oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFRyYWNrU2VnbWVudERpc3BsYXlCb3VuZHNSZ24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRyYWNrT2JqX0dldFRyYWNrU3RhdHVzKFRyYWNrT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OwogI2lmbmRlZiBHZXRUcmFja1N0YXR1cwotCVB5TWFjX1BSRUNIRUNLKEdldFRyYWNrU3RhdHVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRUcmFja1N0YXR1cyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0VHJhY2tTdGF0dXMoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFRyYWNrU3RhdHVzKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRyYWNrT2JqX1NldFRyYWNrTG9hZFNldHRpbmdzKFRyYWNrT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlUaW1lVmFsdWUgcHJlbG9hZFRpbWU7Ci0JVGltZVZhbHVlIHByZWxvYWREdXJhdGlvbjsKLQlsb25nIHByZWxvYWRGbGFnczsKLQlsb25nIGRlZmF1bHRIaW50czsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVGltZVZhbHVlIHByZWxvYWRUaW1lOworICAgIFRpbWVWYWx1ZSBwcmVsb2FkRHVyYXRpb247CisgICAgbG9uZyBwcmVsb2FkRmxhZ3M7CisgICAgbG9uZyBkZWZhdWx0SGludHM7CiAjaWZuZGVmIFNldFRyYWNrTG9hZFNldHRpbmdzCi0JUHlNYWNfUFJFQ0hFQ0soU2V0VHJhY2tMb2FkU2V0dGluZ3MpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFRyYWNrTG9hZFNldHRpbmdzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcHJlbG9hZFRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZwcmVsb2FkRHVyYXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICZwcmVsb2FkRmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICZkZWZhdWx0SGludHMpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRUcmFja0xvYWRTZXR0aW5ncyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgIHByZWxvYWRUaW1lLAotCSAgICAgICAgICAgICAgICAgICAgIHByZWxvYWREdXJhdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICBwcmVsb2FkRmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdEhpbnRzKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGxsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwcmVsb2FkVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnByZWxvYWREdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnByZWxvYWRGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlZmF1bHRIaW50cykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldFRyYWNrTG9hZFNldHRpbmdzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgcHJlbG9hZFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgcHJlbG9hZER1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgIHByZWxvYWRGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0SGludHMpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9HZXRUcmFja0xvYWRTZXR0aW5ncyhUcmFja09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVGltZVZhbHVlIHByZWxvYWRUaW1lOwotCVRpbWVWYWx1ZSBwcmVsb2FkRHVyYXRpb247Ci0JbG9uZyBwcmVsb2FkRmxhZ3M7Ci0JbG9uZyBkZWZhdWx0SGludHM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFRpbWVWYWx1ZSBwcmVsb2FkVGltZTsKKyAgICBUaW1lVmFsdWUgcHJlbG9hZER1cmF0aW9uOworICAgIGxvbmcgcHJlbG9hZEZsYWdzOworICAgIGxvbmcgZGVmYXVsdEhpbnRzOwogI2lmbmRlZiBHZXRUcmFja0xvYWRTZXR0aW5ncwotCVB5TWFjX1BSRUNIRUNLKEdldFRyYWNrTG9hZFNldHRpbmdzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRUcmFja0xvYWRTZXR0aW5ncyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0VHJhY2tMb2FkU2V0dGluZ3MoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAmcHJlbG9hZFRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgJnByZWxvYWREdXJhdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICAmcHJlbG9hZEZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICZkZWZhdWx0SGludHMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbGxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBwcmVsb2FkVGltZSwKLQkgICAgICAgICAgICAgICAgICAgICBwcmVsb2FkRHVyYXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgcHJlbG9hZEZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRIaW50cyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldFRyYWNrTG9hZFNldHRpbmdzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgJnByZWxvYWRUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICZwcmVsb2FkRHVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgJnByZWxvYWRGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAmZGVmYXVsdEhpbnRzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGxsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgcHJlbG9hZFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgcHJlbG9hZER1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgIHByZWxvYWRGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0SGludHMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgVHJhY2tPYmpfbWV0aG9kc1tdID0gewotCXsiTG9hZFRyYWNrSW50b1JhbSIsIChQeUNGdW5jdGlvbilUcmFja09ial9Mb2FkVHJhY2tJbnRvUmFtLCAxLAotCSBQeURvY19TVFIoIihUaW1lVmFsdWUgdGltZSwgVGltZVZhbHVlIGR1cmF0aW9uLCBsb25nIGZsYWdzKSAtPiBOb25lIil9LAotCXsiR2V0VHJhY2tQaWN0IiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldFRyYWNrUGljdCwgMSwKLQkgUHlEb2NfU1RSKCIoVGltZVZhbHVlIHRpbWUpIC0+IChQaWNIYW5kbGUgX3J2KSIpfSwKLQl7IkdldFRyYWNrQ2xpcFJnbiIsIChQeUNGdW5jdGlvbilUcmFja09ial9HZXRUcmFja0NsaXBSZ24sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFJnbkhhbmRsZSBfcnYpIil9LAotCXsiU2V0VHJhY2tDbGlwUmduIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX1NldFRyYWNrQ2xpcFJnbiwgMSwKLQkgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHRoZUNsaXApIC0+IE5vbmUiKX0sCi0JeyJHZXRUcmFja0Rpc3BsYXlCb3VuZHNSZ24iLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfR2V0VHJhY2tEaXNwbGF5Qm91bmRzUmduLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChSZ25IYW5kbGUgX3J2KSIpfSwKLQl7IkdldFRyYWNrTW92aWVCb3VuZHNSZ24iLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfR2V0VHJhY2tNb3ZpZUJvdW5kc1JnbiwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoUmduSGFuZGxlIF9ydikiKX0sCi0JeyJHZXRUcmFja0JvdW5kc1JnbiIsIChQeUNGdW5jdGlvbilUcmFja09ial9HZXRUcmFja0JvdW5kc1JnbiwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoUmduSGFuZGxlIF9ydikiKX0sCi0JeyJHZXRUcmFja01hdHRlIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldFRyYWNrTWF0dGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFBpeE1hcEhhbmRsZSBfcnYpIil9LAotCXsiU2V0VHJhY2tNYXR0ZSIsIChQeUNGdW5jdGlvbilUcmFja09ial9TZXRUcmFja01hdHRlLCAxLAotCSBQeURvY19TVFIoIihQaXhNYXBIYW5kbGUgdGhlTWF0dGUpIC0+IE5vbmUiKX0sCi0JeyJHZXRUcmFja0lEIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldFRyYWNrSUQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKGxvbmcgX3J2KSIpfSwKLQl7IkdldFRyYWNrTW92aWUiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfR2V0VHJhY2tNb3ZpZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoTW92aWUgX3J2KSIpfSwKLQl7IkdldFRyYWNrQ3JlYXRpb25UaW1lIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldFRyYWNrQ3JlYXRpb25UaW1lLCAxLAotCSBQeURvY19TVFIoIigpIC0+ICh1bnNpZ25lZCBsb25nIF9ydikiKX0sCi0JeyJHZXRUcmFja01vZGlmaWNhdGlvblRpbWUiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfR2V0VHJhY2tNb2RpZmljYXRpb25UaW1lLCAxLAotCSBQeURvY19TVFIoIigpIC0+ICh1bnNpZ25lZCBsb25nIF9ydikiKX0sCi0JeyJHZXRUcmFja0VuYWJsZWQiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfR2V0VHJhY2tFbmFibGVkLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJTZXRUcmFja0VuYWJsZWQiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfU2V0VHJhY2tFbmFibGVkLCAxLAotCSBQeURvY19TVFIoIihCb29sZWFuIGlzRW5hYmxlZCkgLT4gTm9uZSIpfSwKLQl7IkdldFRyYWNrVXNhZ2UiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfR2V0VHJhY2tVc2FnZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAobG9uZyBfcnYpIil9LAotCXsiU2V0VHJhY2tVc2FnZSIsIChQeUNGdW5jdGlvbilUcmFja09ial9TZXRUcmFja1VzYWdlLCAxLAotCSBQeURvY19TVFIoIihsb25nIHVzYWdlKSAtPiBOb25lIil9LAotCXsiR2V0VHJhY2tEdXJhdGlvbiIsIChQeUNGdW5jdGlvbilUcmFja09ial9HZXRUcmFja0R1cmF0aW9uLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChUaW1lVmFsdWUgX3J2KSIpfSwKLQl7IkdldFRyYWNrT2Zmc2V0IiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldFRyYWNrT2Zmc2V0LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChUaW1lVmFsdWUgX3J2KSIpfSwKLQl7IlNldFRyYWNrT2Zmc2V0IiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX1NldFRyYWNrT2Zmc2V0LCAxLAotCSBQeURvY19TVFIoIihUaW1lVmFsdWUgbW92aWVPZmZzZXRUaW1lKSAtPiBOb25lIil9LAotCXsiR2V0VHJhY2tMYXllciIsIChQeUNGdW5jdGlvbilUcmFja09ial9HZXRUcmFja0xheWVyLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChzaG9ydCBfcnYpIil9LAotCXsiU2V0VHJhY2tMYXllciIsIChQeUNGdW5jdGlvbilUcmFja09ial9TZXRUcmFja0xheWVyLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBsYXllcikgLT4gTm9uZSIpfSwKLQl7IkdldFRyYWNrQWx0ZXJuYXRlIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldFRyYWNrQWx0ZXJuYXRlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChUcmFjayBfcnYpIil9LAotCXsiU2V0VHJhY2tBbHRlcm5hdGUiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfU2V0VHJhY2tBbHRlcm5hdGUsIDEsCi0JIFB5RG9jX1NUUigiKFRyYWNrIGFsdGVybmF0ZVQpIC0+IE5vbmUiKX0sCi0JeyJHZXRUcmFja1ZvbHVtZSIsIChQeUNGdW5jdGlvbilUcmFja09ial9HZXRUcmFja1ZvbHVtZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgX3J2KSIpfSwKLQl7IlNldFRyYWNrVm9sdW1lIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX1NldFRyYWNrVm9sdW1lLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCB2b2x1bWUpIC0+IE5vbmUiKX0sCi0JeyJHZXRUcmFja0RpbWVuc2lvbnMiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfR2V0VHJhY2tEaW1lbnNpb25zLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChGaXhlZCB3aWR0aCwgRml4ZWQgaGVpZ2h0KSIpfSwKLQl7IlNldFRyYWNrRGltZW5zaW9ucyIsIChQeUNGdW5jdGlvbilUcmFja09ial9TZXRUcmFja0RpbWVuc2lvbnMsIDEsCi0JIFB5RG9jX1NUUigiKEZpeGVkIHdpZHRoLCBGaXhlZCBoZWlnaHQpIC0+IE5vbmUiKX0sCi0JeyJHZXRUcmFja1VzZXJEYXRhIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldFRyYWNrVXNlckRhdGEsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFVzZXJEYXRhIF9ydikiKX0sCi0JeyJHZXRUcmFja1NvdW5kTG9jYWxpemF0aW9uU2V0dGluZ3MiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfR2V0VHJhY2tTb3VuZExvY2FsaXphdGlvblNldHRpbmdzLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChIYW5kbGUgc2V0dGluZ3MpIil9LAotCXsiU2V0VHJhY2tTb3VuZExvY2FsaXphdGlvblNldHRpbmdzIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX1NldFRyYWNrU291bmRMb2NhbGl6YXRpb25TZXR0aW5ncywgMSwKLQkgUHlEb2NfU1RSKCIoSGFuZGxlIHNldHRpbmdzKSAtPiBOb25lIil9LAotCXsiTmV3VHJhY2tNZWRpYSIsIChQeUNGdW5jdGlvbilUcmFja09ial9OZXdUcmFja01lZGlhLCAxLAotCSBQeURvY19TVFIoIihPU1R5cGUgbWVkaWFUeXBlLCBUaW1lU2NhbGUgdGltZVNjYWxlLCBIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlKSAtPiAoTWVkaWEgX3J2KSIpfSwKLQl7IkdldFRyYWNrTWVkaWEiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfR2V0VHJhY2tNZWRpYSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoTWVkaWEgX3J2KSIpfSwKLQl7Ikluc2VydE1lZGlhSW50b1RyYWNrIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0luc2VydE1lZGlhSW50b1RyYWNrLCAxLAotCSBQeURvY19TVFIoIihUaW1lVmFsdWUgdHJhY2tTdGFydCwgVGltZVZhbHVlIG1lZGlhVGltZSwgVGltZVZhbHVlIG1lZGlhRHVyYXRpb24sIEZpeGVkIG1lZGlhUmF0ZSkgLT4gTm9uZSIpfSwKLQl7Ikluc2VydFRyYWNrU2VnbWVudCIsIChQeUNGdW5jdGlvbilUcmFja09ial9JbnNlcnRUcmFja1NlZ21lbnQsIDEsCi0JIFB5RG9jX1NUUigiKFRyYWNrIGRzdFRyYWNrLCBUaW1lVmFsdWUgc3JjSW4sIFRpbWVWYWx1ZSBzcmNEdXJhdGlvbiwgVGltZVZhbHVlIGRzdEluKSAtPiBOb25lIil9LAotCXsiSW5zZXJ0RW1wdHlUcmFja1NlZ21lbnQiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfSW5zZXJ0RW1wdHlUcmFja1NlZ21lbnQsIDEsCi0JIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSBkc3RJbiwgVGltZVZhbHVlIGRzdER1cmF0aW9uKSAtPiBOb25lIil9LAotCXsiRGVsZXRlVHJhY2tTZWdtZW50IiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0RlbGV0ZVRyYWNrU2VnbWVudCwgMSwKLQkgUHlEb2NfU1RSKCIoVGltZVZhbHVlIHN0YXJ0VGltZSwgVGltZVZhbHVlIGR1cmF0aW9uKSAtPiBOb25lIil9LAotCXsiU2NhbGVUcmFja1NlZ21lbnQiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfU2NhbGVUcmFja1NlZ21lbnQsIDEsCi0JIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSBzdGFydFRpbWUsIFRpbWVWYWx1ZSBvbGREdXJhdGlvbiwgVGltZVZhbHVlIG5ld0R1cmF0aW9uKSAtPiBOb25lIil9LAotCXsiSXNTY3JhcE1vdmllIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0lzU2NyYXBNb3ZpZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ29tcG9uZW50IF9ydikiKX0sCi0JeyJDb3B5VHJhY2tTZXR0aW5ncyIsIChQeUNGdW5jdGlvbilUcmFja09ial9Db3B5VHJhY2tTZXR0aW5ncywgMSwKLQkgUHlEb2NfU1RSKCIoVHJhY2sgZHN0VHJhY2spIC0+IE5vbmUiKX0sCi0JeyJBZGRFbXB0eVRyYWNrVG9Nb3ZpZSIsIChQeUNGdW5jdGlvbilUcmFja09ial9BZGRFbXB0eVRyYWNrVG9Nb3ZpZSwgMSwKLQkgUHlEb2NfU1RSKCIoTW92aWUgZHN0TW92aWUsIEhhbmRsZSBkYXRhUmVmLCBPU1R5cGUgZGF0YVJlZlR5cGUpIC0+IChUcmFjayBkc3RUcmFjaykiKX0sCi0JeyJBZGRDbG9uZWRUcmFja1RvTW92aWUiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfQWRkQ2xvbmVkVHJhY2tUb01vdmllLCAxLAotCSBQeURvY19TVFIoIihNb3ZpZSBkc3RNb3ZpZSwgbG9uZyBmbGFncykgLT4gKFRyYWNrIGRzdFRyYWNrKSIpfSwKLQl7IkFkZFRyYWNrUmVmZXJlbmNlIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0FkZFRyYWNrUmVmZXJlbmNlLCAxLAotCSBQeURvY19TVFIoIihUcmFjayByZWZUcmFjaywgT1NUeXBlIHJlZlR5cGUpIC0+IChsb25nIGFkZGVkSW5kZXgpIil9LAotCXsiRGVsZXRlVHJhY2tSZWZlcmVuY2UiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfRGVsZXRlVHJhY2tSZWZlcmVuY2UsIDEsCi0JIFB5RG9jX1NUUigiKE9TVHlwZSByZWZUeXBlLCBsb25nIGluZGV4KSAtPiBOb25lIil9LAotCXsiU2V0VHJhY2tSZWZlcmVuY2UiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfU2V0VHJhY2tSZWZlcmVuY2UsIDEsCi0JIFB5RG9jX1NUUigiKFRyYWNrIHJlZlRyYWNrLCBPU1R5cGUgcmVmVHlwZSwgbG9uZyBpbmRleCkgLT4gTm9uZSIpfSwKLQl7IkdldFRyYWNrUmVmZXJlbmNlIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldFRyYWNrUmVmZXJlbmNlLCAxLAotCSBQeURvY19TVFIoIihPU1R5cGUgcmVmVHlwZSwgbG9uZyBpbmRleCkgLT4gKFRyYWNrIF9ydikiKX0sCi0JeyJHZXROZXh0VHJhY2tSZWZlcmVuY2VUeXBlIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldE5leHRUcmFja1JlZmVyZW5jZVR5cGUsIDEsCi0JIFB5RG9jX1NUUigiKE9TVHlwZSByZWZUeXBlKSAtPiAoT1NUeXBlIF9ydikiKX0sCi0JeyJHZXRUcmFja1JlZmVyZW5jZUNvdW50IiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldFRyYWNrUmVmZXJlbmNlQ291bnQsIDEsCi0JIFB5RG9jX1NUUigiKE9TVHlwZSByZWZUeXBlKSAtPiAobG9uZyBfcnYpIil9LAotCXsiR2V0VHJhY2tFZGl0UmF0ZSIsIChQeUNGdW5jdGlvbilUcmFja09ial9HZXRUcmFja0VkaXRSYXRlLCAxLAotCSBQeURvY19TVFIoIihUaW1lVmFsdWUgYXRUaW1lKSAtPiAoRml4ZWQgX3J2KSIpfSwKLQl7IkdldFRyYWNrRGF0YVNpemUiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfR2V0VHJhY2tEYXRhU2l6ZSwgMSwKLQkgUHlEb2NfU1RSKCIoVGltZVZhbHVlIHN0YXJ0VGltZSwgVGltZVZhbHVlIGR1cmF0aW9uKSAtPiAobG9uZyBfcnYpIil9LAotCXsiR2V0VHJhY2tEYXRhU2l6ZTY0IiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldFRyYWNrRGF0YVNpemU2NCwgMSwKLQkgUHlEb2NfU1RSKCIoVGltZVZhbHVlIHN0YXJ0VGltZSwgVGltZVZhbHVlIGR1cmF0aW9uKSAtPiAod2lkZSBkYXRhU2l6ZSkiKX0sCi0JeyJQdEluVHJhY2siLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfUHRJblRyYWNrLCAxLAotCSBQeURvY19TVFIoIihQb2ludCBwdCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IkNvcHlUcmFja1VzZXJEYXRhIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0NvcHlUcmFja1VzZXJEYXRhLCAxLAotCSBQeURvY19TVFIoIihUcmFjayBkc3RUcmFjaywgT1NUeXBlIGNvcHlSdWxlKSAtPiBOb25lIil9LAotCXsiR2V0VHJhY2tOZXh0SW50ZXJlc3RpbmdUaW1lIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldFRyYWNrTmV4dEludGVyZXN0aW5nVGltZSwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgaW50ZXJlc3RpbmdUaW1lRmxhZ3MsIFRpbWVWYWx1ZSB0aW1lLCBGaXhlZCByYXRlKSAtPiAoVGltZVZhbHVlIGludGVyZXN0aW5nVGltZSwgVGltZVZhbHVlIGludGVyZXN0aW5nRHVyYXRpb24pIil9LAotCXsiR2V0VHJhY2tTZWdtZW50RGlzcGxheUJvdW5kc1JnbiIsIChQeUNGdW5jdGlvbilUcmFja09ial9HZXRUcmFja1NlZ21lbnREaXNwbGF5Qm91bmRzUmduLCAxLAotCSBQeURvY19TVFIoIihUaW1lVmFsdWUgdGltZSwgVGltZVZhbHVlIGR1cmF0aW9uKSAtPiAoUmduSGFuZGxlIF9ydikiKX0sCi0JeyJHZXRUcmFja1N0YXR1cyIsIChQeUNGdW5jdGlvbilUcmFja09ial9HZXRUcmFja1N0YXR1cywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTZXRUcmFja0xvYWRTZXR0aW5ncyIsIChQeUNGdW5jdGlvbilUcmFja09ial9TZXRUcmFja0xvYWRTZXR0aW5ncywgMSwKLQkgUHlEb2NfU1RSKCIoVGltZVZhbHVlIHByZWxvYWRUaW1lLCBUaW1lVmFsdWUgcHJlbG9hZER1cmF0aW9uLCBsb25nIHByZWxvYWRGbGFncywgbG9uZyBkZWZhdWx0SGludHMpIC0+IE5vbmUiKX0sCi0JeyJHZXRUcmFja0xvYWRTZXR0aW5ncyIsIChQeUNGdW5jdGlvbilUcmFja09ial9HZXRUcmFja0xvYWRTZXR0aW5ncywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVGltZVZhbHVlIHByZWxvYWRUaW1lLCBUaW1lVmFsdWUgcHJlbG9hZER1cmF0aW9uLCBsb25nIHByZWxvYWRGbGFncywgbG9uZyBkZWZhdWx0SGludHMpIil9LAotCXtOVUxMLCBOVUxMLCAwfQorICAgIHsiTG9hZFRyYWNrSW50b1JhbSIsIChQeUNGdW5jdGlvbilUcmFja09ial9Mb2FkVHJhY2tJbnRvUmFtLCAxLAorICAgICBQeURvY19TVFIoIihUaW1lVmFsdWUgdGltZSwgVGltZVZhbHVlIGR1cmF0aW9uLCBsb25nIGZsYWdzKSAtPiBOb25lIil9LAorICAgIHsiR2V0VHJhY2tQaWN0IiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldFRyYWNrUGljdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGltZVZhbHVlIHRpbWUpIC0+IChQaWNIYW5kbGUgX3J2KSIpfSwKKyAgICB7IkdldFRyYWNrQ2xpcFJnbiIsIChQeUNGdW5jdGlvbilUcmFja09ial9HZXRUcmFja0NsaXBSZ24sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFJnbkhhbmRsZSBfcnYpIil9LAorICAgIHsiU2V0VHJhY2tDbGlwUmduIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX1NldFRyYWNrQ2xpcFJnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHRoZUNsaXApIC0+IE5vbmUiKX0sCisgICAgeyJHZXRUcmFja0Rpc3BsYXlCb3VuZHNSZ24iLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfR2V0VHJhY2tEaXNwbGF5Qm91bmRzUmduLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChSZ25IYW5kbGUgX3J2KSIpfSwKKyAgICB7IkdldFRyYWNrTW92aWVCb3VuZHNSZ24iLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfR2V0VHJhY2tNb3ZpZUJvdW5kc1JnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoUmduSGFuZGxlIF9ydikiKX0sCisgICAgeyJHZXRUcmFja0JvdW5kc1JnbiIsIChQeUNGdW5jdGlvbilUcmFja09ial9HZXRUcmFja0JvdW5kc1JnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoUmduSGFuZGxlIF9ydikiKX0sCisgICAgeyJHZXRUcmFja01hdHRlIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldFRyYWNrTWF0dGUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFBpeE1hcEhhbmRsZSBfcnYpIil9LAorICAgIHsiU2V0VHJhY2tNYXR0ZSIsIChQeUNGdW5jdGlvbilUcmFja09ial9TZXRUcmFja01hdHRlLCAxLAorICAgICBQeURvY19TVFIoIihQaXhNYXBIYW5kbGUgdGhlTWF0dGUpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRUcmFja0lEIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldFRyYWNrSUQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKGxvbmcgX3J2KSIpfSwKKyAgICB7IkdldFRyYWNrTW92aWUiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfR2V0VHJhY2tNb3ZpZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoTW92aWUgX3J2KSIpfSwKKyAgICB7IkdldFRyYWNrQ3JlYXRpb25UaW1lIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldFRyYWNrQ3JlYXRpb25UaW1lLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+ICh1bnNpZ25lZCBsb25nIF9ydikiKX0sCisgICAgeyJHZXRUcmFja01vZGlmaWNhdGlvblRpbWUiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfR2V0VHJhY2tNb2RpZmljYXRpb25UaW1lLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+ICh1bnNpZ25lZCBsb25nIF9ydikiKX0sCisgICAgeyJHZXRUcmFja0VuYWJsZWQiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfR2V0VHJhY2tFbmFibGVkLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJTZXRUcmFja0VuYWJsZWQiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfU2V0VHJhY2tFbmFibGVkLCAxLAorICAgICBQeURvY19TVFIoIihCb29sZWFuIGlzRW5hYmxlZCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldFRyYWNrVXNhZ2UiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfR2V0VHJhY2tVc2FnZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAobG9uZyBfcnYpIil9LAorICAgIHsiU2V0VHJhY2tVc2FnZSIsIChQeUNGdW5jdGlvbilUcmFja09ial9TZXRUcmFja1VzYWdlLCAxLAorICAgICBQeURvY19TVFIoIihsb25nIHVzYWdlKSAtPiBOb25lIil9LAorICAgIHsiR2V0VHJhY2tEdXJhdGlvbiIsIChQeUNGdW5jdGlvbilUcmFja09ial9HZXRUcmFja0R1cmF0aW9uLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChUaW1lVmFsdWUgX3J2KSIpfSwKKyAgICB7IkdldFRyYWNrT2Zmc2V0IiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldFRyYWNrT2Zmc2V0LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChUaW1lVmFsdWUgX3J2KSIpfSwKKyAgICB7IlNldFRyYWNrT2Zmc2V0IiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX1NldFRyYWNrT2Zmc2V0LCAxLAorICAgICBQeURvY19TVFIoIihUaW1lVmFsdWUgbW92aWVPZmZzZXRUaW1lKSAtPiBOb25lIil9LAorICAgIHsiR2V0VHJhY2tMYXllciIsIChQeUNGdW5jdGlvbilUcmFja09ial9HZXRUcmFja0xheWVyLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChzaG9ydCBfcnYpIil9LAorICAgIHsiU2V0VHJhY2tMYXllciIsIChQeUNGdW5jdGlvbilUcmFja09ial9TZXRUcmFja0xheWVyLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBsYXllcikgLT4gTm9uZSIpfSwKKyAgICB7IkdldFRyYWNrQWx0ZXJuYXRlIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldFRyYWNrQWx0ZXJuYXRlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChUcmFjayBfcnYpIil9LAorICAgIHsiU2V0VHJhY2tBbHRlcm5hdGUiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfU2V0VHJhY2tBbHRlcm5hdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKFRyYWNrIGFsdGVybmF0ZVQpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRUcmFja1ZvbHVtZSIsIChQeUNGdW5jdGlvbilUcmFja09ial9HZXRUcmFja1ZvbHVtZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgX3J2KSIpfSwKKyAgICB7IlNldFRyYWNrVm9sdW1lIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX1NldFRyYWNrVm9sdW1lLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCB2b2x1bWUpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRUcmFja0RpbWVuc2lvbnMiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfR2V0VHJhY2tEaW1lbnNpb25zLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChGaXhlZCB3aWR0aCwgRml4ZWQgaGVpZ2h0KSIpfSwKKyAgICB7IlNldFRyYWNrRGltZW5zaW9ucyIsIChQeUNGdW5jdGlvbilUcmFja09ial9TZXRUcmFja0RpbWVuc2lvbnMsIDEsCisgICAgIFB5RG9jX1NUUigiKEZpeGVkIHdpZHRoLCBGaXhlZCBoZWlnaHQpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRUcmFja1VzZXJEYXRhIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldFRyYWNrVXNlckRhdGEsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFVzZXJEYXRhIF9ydikiKX0sCisgICAgeyJHZXRUcmFja1NvdW5kTG9jYWxpemF0aW9uU2V0dGluZ3MiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfR2V0VHJhY2tTb3VuZExvY2FsaXphdGlvblNldHRpbmdzLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChIYW5kbGUgc2V0dGluZ3MpIil9LAorICAgIHsiU2V0VHJhY2tTb3VuZExvY2FsaXphdGlvblNldHRpbmdzIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX1NldFRyYWNrU291bmRMb2NhbGl6YXRpb25TZXR0aW5ncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoSGFuZGxlIHNldHRpbmdzKSAtPiBOb25lIil9LAorICAgIHsiTmV3VHJhY2tNZWRpYSIsIChQeUNGdW5jdGlvbilUcmFja09ial9OZXdUcmFja01lZGlhLCAxLAorICAgICBQeURvY19TVFIoIihPU1R5cGUgbWVkaWFUeXBlLCBUaW1lU2NhbGUgdGltZVNjYWxlLCBIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlKSAtPiAoTWVkaWEgX3J2KSIpfSwKKyAgICB7IkdldFRyYWNrTWVkaWEiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfR2V0VHJhY2tNZWRpYSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoTWVkaWEgX3J2KSIpfSwKKyAgICB7Ikluc2VydE1lZGlhSW50b1RyYWNrIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0luc2VydE1lZGlhSW50b1RyYWNrLCAxLAorICAgICBQeURvY19TVFIoIihUaW1lVmFsdWUgdHJhY2tTdGFydCwgVGltZVZhbHVlIG1lZGlhVGltZSwgVGltZVZhbHVlIG1lZGlhRHVyYXRpb24sIEZpeGVkIG1lZGlhUmF0ZSkgLT4gTm9uZSIpfSwKKyAgICB7Ikluc2VydFRyYWNrU2VnbWVudCIsIChQeUNGdW5jdGlvbilUcmFja09ial9JbnNlcnRUcmFja1NlZ21lbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKFRyYWNrIGRzdFRyYWNrLCBUaW1lVmFsdWUgc3JjSW4sIFRpbWVWYWx1ZSBzcmNEdXJhdGlvbiwgVGltZVZhbHVlIGRzdEluKSAtPiBOb25lIil9LAorICAgIHsiSW5zZXJ0RW1wdHlUcmFja1NlZ21lbnQiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfSW5zZXJ0RW1wdHlUcmFja1NlZ21lbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSBkc3RJbiwgVGltZVZhbHVlIGRzdER1cmF0aW9uKSAtPiBOb25lIil9LAorICAgIHsiRGVsZXRlVHJhY2tTZWdtZW50IiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0RlbGV0ZVRyYWNrU2VnbWVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGltZVZhbHVlIHN0YXJ0VGltZSwgVGltZVZhbHVlIGR1cmF0aW9uKSAtPiBOb25lIil9LAorICAgIHsiU2NhbGVUcmFja1NlZ21lbnQiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfU2NhbGVUcmFja1NlZ21lbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSBzdGFydFRpbWUsIFRpbWVWYWx1ZSBvbGREdXJhdGlvbiwgVGltZVZhbHVlIG5ld0R1cmF0aW9uKSAtPiBOb25lIil9LAorICAgIHsiSXNTY3JhcE1vdmllIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0lzU2NyYXBNb3ZpZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ29tcG9uZW50IF9ydikiKX0sCisgICAgeyJDb3B5VHJhY2tTZXR0aW5ncyIsIChQeUNGdW5jdGlvbilUcmFja09ial9Db3B5VHJhY2tTZXR0aW5ncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoVHJhY2sgZHN0VHJhY2spIC0+IE5vbmUiKX0sCisgICAgeyJBZGRFbXB0eVRyYWNrVG9Nb3ZpZSIsIChQeUNGdW5jdGlvbilUcmFja09ial9BZGRFbXB0eVRyYWNrVG9Nb3ZpZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTW92aWUgZHN0TW92aWUsIEhhbmRsZSBkYXRhUmVmLCBPU1R5cGUgZGF0YVJlZlR5cGUpIC0+IChUcmFjayBkc3RUcmFjaykiKX0sCisgICAgeyJBZGRDbG9uZWRUcmFja1RvTW92aWUiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfQWRkQ2xvbmVkVHJhY2tUb01vdmllLCAxLAorICAgICBQeURvY19TVFIoIihNb3ZpZSBkc3RNb3ZpZSwgbG9uZyBmbGFncykgLT4gKFRyYWNrIGRzdFRyYWNrKSIpfSwKKyAgICB7IkFkZFRyYWNrUmVmZXJlbmNlIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0FkZFRyYWNrUmVmZXJlbmNlLCAxLAorICAgICBQeURvY19TVFIoIihUcmFjayByZWZUcmFjaywgT1NUeXBlIHJlZlR5cGUpIC0+IChsb25nIGFkZGVkSW5kZXgpIil9LAorICAgIHsiRGVsZXRlVHJhY2tSZWZlcmVuY2UiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfRGVsZXRlVHJhY2tSZWZlcmVuY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKE9TVHlwZSByZWZUeXBlLCBsb25nIGluZGV4KSAtPiBOb25lIil9LAorICAgIHsiU2V0VHJhY2tSZWZlcmVuY2UiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfU2V0VHJhY2tSZWZlcmVuY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKFRyYWNrIHJlZlRyYWNrLCBPU1R5cGUgcmVmVHlwZSwgbG9uZyBpbmRleCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldFRyYWNrUmVmZXJlbmNlIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldFRyYWNrUmVmZXJlbmNlLCAxLAorICAgICBQeURvY19TVFIoIihPU1R5cGUgcmVmVHlwZSwgbG9uZyBpbmRleCkgLT4gKFRyYWNrIF9ydikiKX0sCisgICAgeyJHZXROZXh0VHJhY2tSZWZlcmVuY2VUeXBlIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldE5leHRUcmFja1JlZmVyZW5jZVR5cGUsIDEsCisgICAgIFB5RG9jX1NUUigiKE9TVHlwZSByZWZUeXBlKSAtPiAoT1NUeXBlIF9ydikiKX0sCisgICAgeyJHZXRUcmFja1JlZmVyZW5jZUNvdW50IiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldFRyYWNrUmVmZXJlbmNlQ291bnQsIDEsCisgICAgIFB5RG9jX1NUUigiKE9TVHlwZSByZWZUeXBlKSAtPiAobG9uZyBfcnYpIil9LAorICAgIHsiR2V0VHJhY2tFZGl0UmF0ZSIsIChQeUNGdW5jdGlvbilUcmFja09ial9HZXRUcmFja0VkaXRSYXRlLCAxLAorICAgICBQeURvY19TVFIoIihUaW1lVmFsdWUgYXRUaW1lKSAtPiAoRml4ZWQgX3J2KSIpfSwKKyAgICB7IkdldFRyYWNrRGF0YVNpemUiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfR2V0VHJhY2tEYXRhU2l6ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGltZVZhbHVlIHN0YXJ0VGltZSwgVGltZVZhbHVlIGR1cmF0aW9uKSAtPiAobG9uZyBfcnYpIil9LAorICAgIHsiR2V0VHJhY2tEYXRhU2l6ZTY0IiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldFRyYWNrRGF0YVNpemU2NCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGltZVZhbHVlIHN0YXJ0VGltZSwgVGltZVZhbHVlIGR1cmF0aW9uKSAtPiAod2lkZSBkYXRhU2l6ZSkiKX0sCisgICAgeyJQdEluVHJhY2siLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfUHRJblRyYWNrLCAxLAorICAgICBQeURvY19TVFIoIihQb2ludCBwdCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IkNvcHlUcmFja1VzZXJEYXRhIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0NvcHlUcmFja1VzZXJEYXRhLCAxLAorICAgICBQeURvY19TVFIoIihUcmFjayBkc3RUcmFjaywgT1NUeXBlIGNvcHlSdWxlKSAtPiBOb25lIil9LAorICAgIHsiR2V0VHJhY2tOZXh0SW50ZXJlc3RpbmdUaW1lIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldFRyYWNrTmV4dEludGVyZXN0aW5nVGltZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgaW50ZXJlc3RpbmdUaW1lRmxhZ3MsIFRpbWVWYWx1ZSB0aW1lLCBGaXhlZCByYXRlKSAtPiAoVGltZVZhbHVlIGludGVyZXN0aW5nVGltZSwgVGltZVZhbHVlIGludGVyZXN0aW5nRHVyYXRpb24pIil9LAorICAgIHsiR2V0VHJhY2tTZWdtZW50RGlzcGxheUJvdW5kc1JnbiIsIChQeUNGdW5jdGlvbilUcmFja09ial9HZXRUcmFja1NlZ21lbnREaXNwbGF5Qm91bmRzUmduLCAxLAorICAgICBQeURvY19TVFIoIihUaW1lVmFsdWUgdGltZSwgVGltZVZhbHVlIGR1cmF0aW9uKSAtPiAoUmduSGFuZGxlIF9ydikiKX0sCisgICAgeyJHZXRUcmFja1N0YXR1cyIsIChQeUNGdW5jdGlvbilUcmFja09ial9HZXRUcmFja1N0YXR1cywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTZXRUcmFja0xvYWRTZXR0aW5ncyIsIChQeUNGdW5jdGlvbilUcmFja09ial9TZXRUcmFja0xvYWRTZXR0aW5ncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGltZVZhbHVlIHByZWxvYWRUaW1lLCBUaW1lVmFsdWUgcHJlbG9hZER1cmF0aW9uLCBsb25nIHByZWxvYWRGbGFncywgbG9uZyBkZWZhdWx0SGludHMpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRUcmFja0xvYWRTZXR0aW5ncyIsIChQeUNGdW5jdGlvbilUcmFja09ial9HZXRUcmFja0xvYWRTZXR0aW5ncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVGltZVZhbHVlIHByZWxvYWRUaW1lLCBUaW1lVmFsdWUgcHJlbG9hZER1cmF0aW9uLCBsb25nIHByZWxvYWRGbGFncywgbG9uZyBkZWZhdWx0SGludHMpIil9LAorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogI2RlZmluZSBUcmFja09ial9nZXRzZXRsaXN0IE5VTEwKQEAgLTQ3MzMsNjEgKzQ3MzMsNjEgQEAKIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial90cF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlQeU9iamVjdCAqX3NlbGY7Ci0JVHJhY2sgaXRzZWxmOwotCWNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OworICAgIFB5T2JqZWN0ICpfc2VsZjsKKyAgICBUcmFjayBpdHNlbGY7CisgICAgY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBUcmFja09ial9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7Ci0JaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkoKFRyYWNrT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JcmV0dXJuIF9zZWxmOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIFRyYWNrT2JqX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOworICAgICgoVHJhY2tPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICByZXR1cm4gX3NlbGY7CiB9CiAKICNkZWZpbmUgVHJhY2tPYmpfdHBfZnJlZSBQeU9iamVjdF9EZWwKIAogCiBQeVR5cGVPYmplY3QgVHJhY2tfVHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKLQkwLCAvKm9iX3NpemUqLwotCSJfUXQuVHJhY2siLCAvKnRwX25hbWUqLwotCXNpemVvZihUcmFja09iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KLQkwLCAvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpIFRyYWNrT2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCi0JMCwgLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCi0JKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCi0JKGNtcGZ1bmMpIFRyYWNrT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCi0JKHJlcHJmdW5jKSBUcmFja09ial9yZXByLCAvKnRwX3JlcHIqLwotCShQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KLQkoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLwotCShQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYykgVHJhY2tPYmpfaGFzaCwgLyp0cF9oYXNoKi8KLQkwLCAvKnRwX2NhbGwqLwotCTAsIC8qdHBfc3RyKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCi0JUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KLQkwLCAvKnRwX2FzX2J1ZmZlciovCi0JUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCi0JMCwgLyp0cF9kb2MqLwotCTAsIC8qdHBfdHJhdmVyc2UqLwotCTAsIC8qdHBfY2xlYXIqLwotCTAsIC8qdHBfcmljaGNvbXBhcmUqLwotCTAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLwotCTAsIC8qdHBfaXRlciovCi0JMCwgLyp0cF9pdGVybmV4dCovCi0JVHJhY2tPYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLwotCTAsIC8qdHBfbWVtYmVycyovCi0JVHJhY2tPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLwotCTAsIC8qdHBfYmFzZSovCi0JMCwgLyp0cF9kaWN0Ki8KLQkwLCAvKnRwX2Rlc2NyX2dldCovCi0JMCwgLyp0cF9kZXNjcl9zZXQqLwotCTAsIC8qdHBfZGljdG9mZnNldCovCi0JVHJhY2tPYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLwotCVRyYWNrT2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLwotCVRyYWNrT2JqX3RwX25ldywgLyogdHBfbmV3ICovCi0JVHJhY2tPYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgIDAsIC8qb2Jfc2l6ZSovCisgICAgIl9RdC5UcmFjayIsIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKFRyYWNrT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLworICAgIDAsIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcikgVHJhY2tPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KKyAgICAoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KKyAgICAoY21wZnVuYykgVHJhY2tPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpIFRyYWNrT2JqX3JlcHIsIC8qdHBfcmVwciovCisgICAgKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLworICAgIChQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKSBUcmFja09ial9oYXNoLCAvKnRwX2hhc2gqLworICAgIDAsIC8qdHBfY2FsbCovCisgICAgMCwgLyp0cF9zdHIqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KKyAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLworICAgIDAsIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAvKnRwX2RvYyovCisgICAgMCwgLyp0cF90cmF2ZXJzZSovCisgICAgMCwgLyp0cF9jbGVhciovCisgICAgMCwgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgLyp0cF9pdGVyKi8KKyAgICAwLCAvKnRwX2l0ZXJuZXh0Ki8KKyAgICBUcmFja09ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCisgICAgMCwgLyp0cF9tZW1iZXJzKi8KKyAgICBUcmFja09ial9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCisgICAgMCwgLyp0cF9iYXNlKi8KKyAgICAwLCAvKnRwX2RpY3QqLworICAgIDAsIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICBUcmFja09ial90cF9pbml0LCAvKiB0cF9pbml0ICovCisgICAgVHJhY2tPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCisgICAgVHJhY2tPYmpfdHBfbmV3LCAvKiB0cF9uZXcgKi8KKyAgICBUcmFja09ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gRW5kIG9iamVjdCB0eXBlIFRyYWNrIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTQ4MDAsMjQ3NiArNDgwMCwyNDc2IEBACiAjZGVmaW5lIE1vdmllT2JqX0NoZWNrKHgpICgoeCktPm9iX3R5cGUgPT0gJk1vdmllX1R5cGUgfHwgUHlPYmplY3RfVHlwZUNoZWNrKCh4KSwgJk1vdmllX1R5cGUpKQogCiB0eXBlZGVmIHN0cnVjdCBNb3ZpZU9iamVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCU1vdmllIG9iX2l0c2VsZjsKKyAgICBQeU9iamVjdF9IRUFECisgICAgTW92aWUgb2JfaXRzZWxmOwogfSBNb3ZpZU9iamVjdDsKIAogUHlPYmplY3QgKk1vdmllT2JqX05ldyhNb3ZpZSBpdHNlbGYpCiB7Ci0JTW92aWVPYmplY3QgKml0OwotCWlmIChpdHNlbGYgPT0gTlVMTCkgewotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFF0X0Vycm9yLCJDYW5ub3QgY3JlYXRlIE1vdmllIGZyb20gTlVMTCBwb2ludGVyIik7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLQkgICAgICAgICAgICAgICAgICAgICAgICB9Ci0JaXQgPSBQeU9iamVjdF9ORVcoTW92aWVPYmplY3QsICZNb3ZpZV9UeXBlKTsKLQlpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgTW92aWVPYmplY3QgKml0OworICAgIGlmIChpdHNlbGYgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFF0X0Vycm9yLCJDYW5ub3QgY3JlYXRlIE1vdmllIGZyb20gTlVMTCBwb2ludGVyIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgaXQgPSBQeU9iamVjdF9ORVcoTW92aWVPYmplY3QsICZNb3ZpZV9UeXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiAKIGludCBNb3ZpZU9ial9Db252ZXJ0KFB5T2JqZWN0ICp2LCBNb3ZpZSAqcF9pdHNlbGYpCiB7Ci0JaWYgKHYgPT0gUHlfTm9uZSkKLQl7Ci0JCSpwX2l0c2VsZiA9IE5VTEw7Ci0JCXJldHVybiAxOwotCX0KLQlpZiAoIU1vdmllT2JqX0NoZWNrKHYpKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIk1vdmllIHJlcXVpcmVkIik7Ci0JCXJldHVybiAwOwotCX0KLQkqcF9pdHNlbGYgPSAoKE1vdmllT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKLQlyZXR1cm4gMTsKKyAgICBpZiAodiA9PSBQeV9Ob25lKQorICAgIHsKKyAgICAgICAgKnBfaXRzZWxmID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmICghTW92aWVPYmpfQ2hlY2sodikpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiTW92aWUgcmVxdWlyZWQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICpwX2l0c2VsZiA9ICgoTW92aWVPYmplY3QgKil2KS0+b2JfaXRzZWxmOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgdm9pZCBNb3ZpZU9ial9kZWFsbG9jKE1vdmllT2JqZWN0ICpzZWxmKQogewotCWlmIChzZWxmLT5vYl9pdHNlbGYpIERpc3Bvc2VNb3ZpZShzZWxmLT5vYl9pdHNlbGYpOwotCXNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CisgICAgaWYgKHNlbGYtPm9iX2l0c2VsZikgRGlzcG9zZU1vdmllKHNlbGYtPm9iX2l0c2VsZik7CisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9Nb3ZpZXNUYXNrKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIG1heE1pbGxpU2VjVG9Vc2U7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgbWF4TWlsbGlTZWNUb1VzZTsKICNpZm5kZWYgTW92aWVzVGFzawotCVB5TWFjX1BSRUNIRUNLKE1vdmllc1Rhc2spOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmllc1Rhc2spOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZtYXhNaWxsaVNlY1RvVXNlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTW92aWVzVGFzayhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgbWF4TWlsbGlTZWNUb1VzZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWF4TWlsbGlTZWNUb1VzZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE1vdmllc1Rhc2soX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgIG1heE1pbGxpU2VjVG9Vc2UpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9QcmVyb2xsTW92aWUoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JVGltZVZhbHVlIHRpbWU7Ci0JRml4ZWQgUmF0ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBUaW1lVmFsdWUgdGltZTsKKyAgICBGaXhlZCBSYXRlOwogI2lmbmRlZiBQcmVyb2xsTW92aWUKLQlQeU1hY19QUkVDSEVDSyhQcmVyb2xsTW92aWUpOworICAgIFB5TWFjX1BSRUNIRUNLKFByZXJvbGxNb3ZpZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZSYXRlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFByZXJvbGxNb3ZpZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgdGltZSwKLQkgICAgICAgICAgICAgICAgICAgIFJhdGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJlJhdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUHJlcm9sbE1vdmllKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICB0aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgUmF0ZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfQWJvcnRQcmVQcmVyb2xsTW92aWUoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIGVycjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgZXJyOwogI2lmbmRlZiBBYm9ydFByZVByZXJvbGxNb3ZpZQotCVB5TWFjX1BSRUNIRUNLKEFib3J0UHJlUHJlcm9sbE1vdmllKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBYm9ydFByZVByZXJvbGxNb3ZpZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmVycikpCi0JCXJldHVybiBOVUxMOwotCUFib3J0UHJlUHJlcm9sbE1vdmllKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBBYm9ydFByZVByZXJvbGxNb3ZpZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX0xvYWRNb3ZpZUludG9SYW0oTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JVGltZVZhbHVlIHRpbWU7Ci0JVGltZVZhbHVlIGR1cmF0aW9uOwotCWxvbmcgZmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgVGltZVZhbHVlIHRpbWU7CisgICAgVGltZVZhbHVlIGR1cmF0aW9uOworICAgIGxvbmcgZmxhZ3M7CiAjaWZuZGVmIExvYWRNb3ZpZUludG9SYW0KLQlQeU1hY19QUkVDSEVDSyhMb2FkTW92aWVJbnRvUmFtKTsKKyAgICBQeU1hY19QUkVDSEVDSyhMb2FkTW92aWVJbnRvUmFtKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAmZHVyYXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBMb2FkTW92aWVJbnRvUmFtKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgdGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IExvYWRNb3ZpZUludG9SYW0oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9TZXRNb3ZpZUFjdGl2ZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBhY3RpdmU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gYWN0aXZlOwogI2lmbmRlZiBTZXRNb3ZpZUFjdGl2ZQotCVB5TWFjX1BSRUNIRUNLKFNldE1vdmllQWN0aXZlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRNb3ZpZUFjdGl2ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmFjdGl2ZSkpCi0JCXJldHVybiBOVUxMOwotCVNldE1vdmllQWN0aXZlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgYWN0aXZlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhY3RpdmUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRNb3ZpZUFjdGl2ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgIGFjdGl2ZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX0dldE1vdmllQWN0aXZlKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CiAjaWZuZGVmIEdldE1vdmllQWN0aXZlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVBY3RpdmUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1vdmllQWN0aXZlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRNb3ZpZUFjdGl2ZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TW92aWVBY3RpdmUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfU3RhcnRNb3ZpZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBTdGFydE1vdmllCi0JUHlNYWNfUFJFQ0hFQ0soU3RhcnRNb3ZpZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU3RhcnRNb3ZpZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU3RhcnRNb3ZpZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFN0YXJ0TW92aWUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX1N0b3BNb3ZpZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBTdG9wTW92aWUKLQlQeU1hY19QUkVDSEVDSyhTdG9wTW92aWUpOworICAgIFB5TWFjX1BSRUNIRUNLKFN0b3BNb3ZpZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU3RvcE1vdmllKF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU3RvcE1vdmllKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9Hb1RvQmVnaW5uaW5nT2ZNb3ZpZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBHb1RvQmVnaW5uaW5nT2ZNb3ZpZQotCVB5TWFjX1BSRUNIRUNLKEdvVG9CZWdpbm5pbmdPZk1vdmllKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHb1RvQmVnaW5uaW5nT2ZNb3ZpZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR29Ub0JlZ2lubmluZ09mTW92aWUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHb1RvQmVnaW5uaW5nT2ZNb3ZpZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfR29Ub0VuZE9mTW92aWUoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgR29Ub0VuZE9mTW92aWUKLQlQeU1hY19QUkVDSEVDSyhHb1RvRW5kT2ZNb3ZpZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR29Ub0VuZE9mTW92aWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUdvVG9FbmRPZk1vdmllKF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR29Ub0VuZE9mTW92aWUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX0lzTW92aWVEb25lKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CiAjaWZuZGVmIElzTW92aWVEb25lCi0JUHlNYWNfUFJFQ0hFQ0soSXNNb3ZpZURvbmUpOworICAgIFB5TWFjX1BSRUNIRUNLKElzTW92aWVEb25lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBJc01vdmllRG9uZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gSXNNb3ZpZURvbmUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfR2V0TW92aWVQcmV2aWV3TW9kZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OwogI2lmbmRlZiBHZXRNb3ZpZVByZXZpZXdNb2RlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVQcmV2aWV3TW9kZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVQcmV2aWV3TW9kZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TW92aWVQcmV2aWV3TW9kZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TW92aWVQcmV2aWV3TW9kZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9TZXRNb3ZpZVByZXZpZXdNb2RlKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIHVzZVByZXZpZXc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gdXNlUHJldmlldzsKICNpZm5kZWYgU2V0TW92aWVQcmV2aWV3TW9kZQotCVB5TWFjX1BSRUNIRUNLKFNldE1vdmllUHJldmlld01vZGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldE1vdmllUHJldmlld01vZGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ1c2VQcmV2aWV3KSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0TW92aWVQcmV2aWV3TW9kZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgdXNlUHJldmlldyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdXNlUHJldmlldykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldE1vdmllUHJldmlld01vZGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVzZVByZXZpZXcpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9TaG93TW92aWVQb3N0ZXIoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgU2hvd01vdmllUG9zdGVyCi0JUHlNYWNfUFJFQ0hFQ0soU2hvd01vdmllUG9zdGVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTaG93TW92aWVQb3N0ZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCVNob3dNb3ZpZVBvc3Rlcihfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNob3dNb3ZpZVBvc3Rlcihfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfR2V0TW92aWVUaW1lQmFzZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVGltZUJhc2UgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBUaW1lQmFzZSBfcnY7CiAjaWZuZGVmIEdldE1vdmllVGltZUJhc2UKLQlQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZVRpbWVCYXNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZVRpbWVCYXNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRNb3ZpZVRpbWVCYXNlKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgVGltZUJhc2VPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRNb3ZpZVRpbWVCYXNlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgVGltZUJhc2VPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX1NldE1vdmllTWFzdGVyVGltZUJhc2UoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVRpbWVCYXNlIHRiOwotCVRpbWVSZWNvcmQgc2xhdmVaZXJvOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBUaW1lQmFzZSB0YjsKKyAgICBUaW1lUmVjb3JkIHNsYXZlWmVybzsKICNpZm5kZWYgU2V0TW92aWVNYXN0ZXJUaW1lQmFzZQotCVB5TWFjX1BSRUNIRUNLKFNldE1vdmllTWFzdGVyVGltZUJhc2UpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldE1vdmllTWFzdGVyVGltZUJhc2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFRpbWVCYXNlT2JqX0NvbnZlcnQsICZ0YiwKLQkgICAgICAgICAgICAgICAgICAgICAgUXRUaW1lUmVjb3JkX0NvbnZlcnQsICZzbGF2ZVplcm8pKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRNb3ZpZU1hc3RlclRpbWVCYXNlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICB0YiwKLQkgICAgICAgICAgICAgICAgICAgICAgICZzbGF2ZVplcm8pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZUJhc2VPYmpfQ29udmVydCwgJnRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBRdFRpbWVSZWNvcmRfQ29udmVydCwgJnNsYXZlWmVybykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldE1vdmllTWFzdGVyVGltZUJhc2UoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNsYXZlWmVybyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX1NldE1vdmllTWFzdGVyQ2xvY2soTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudCBjbG9ja01laXN0ZXI7Ci0JVGltZVJlY29yZCBzbGF2ZVplcm87CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudCBjbG9ja01laXN0ZXI7CisgICAgVGltZVJlY29yZCBzbGF2ZVplcm87CiAjaWZuZGVmIFNldE1vdmllTWFzdGVyQ2xvY2sKLQlQeU1hY19QUkVDSEVDSyhTZXRNb3ZpZU1hc3RlckNsb2NrKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRNb3ZpZU1hc3RlckNsb2NrKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBPYmpfQ29udmVydCwgJmNsb2NrTWVpc3RlciwKLQkgICAgICAgICAgICAgICAgICAgICAgUXRUaW1lUmVjb3JkX0NvbnZlcnQsICZzbGF2ZVplcm8pKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRNb3ZpZU1hc3RlckNsb2NrKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICBjbG9ja01laXN0ZXIsCi0JICAgICAgICAgICAgICAgICAgICAmc2xhdmVaZXJvKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcE9ial9Db252ZXJ0LCAmY2xvY2tNZWlzdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBRdFRpbWVSZWNvcmRfQ29udmVydCwgJnNsYXZlWmVybykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldE1vdmllTWFzdGVyQ2xvY2soX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsb2NrTWVpc3RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICZzbGF2ZVplcm8pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9DaG9vc2VNb3ZpZUNsb2NrKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIGZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBsb25nIGZsYWdzOwogI2lmbmRlZiBDaG9vc2VNb3ZpZUNsb2NrCi0JUHlNYWNfUFJFQ0hFQ0soQ2hvb3NlTW92aWVDbG9jayk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ2hvb3NlTW92aWVDbG9jayk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ2hvb3NlTW92aWVDbG9jayhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgZmxhZ3MpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ2hvb3NlTW92aWVDbG9jayhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9HZXRNb3ZpZUdXb3JsZChNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0dyYWZQdHIgcG9ydDsKLQlHREhhbmRsZSBnZGg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENHcmFmUHRyIHBvcnQ7CisgICAgR0RIYW5kbGUgZ2RoOwogI2lmbmRlZiBHZXRNb3ZpZUdXb3JsZAotCVB5TWFjX1BSRUNIRUNLKEdldE1vdmllR1dvcmxkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZUdXb3JsZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0TW92aWVHV29ybGQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAmcG9ydCwKLQkgICAgICAgICAgICAgICAmZ2RoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgR3JhZk9ial9OZXcsIHBvcnQsCi0JICAgICAgICAgICAgICAgICAgICAgT3B0UmVzT2JqX05ldywgZ2RoKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0TW92aWVHV29ybGQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAmcG9ydCwKKyAgICAgICAgICAgICAgICAgICAmZ2RoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgR3JhZk9ial9OZXcsIHBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgT3B0UmVzT2JqX05ldywgZ2RoKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9TZXRNb3ZpZUdXb3JsZChNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0dyYWZQdHIgcG9ydDsKLQlHREhhbmRsZSBnZGg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENHcmFmUHRyIHBvcnQ7CisgICAgR0RIYW5kbGUgZ2RoOwogI2lmbmRlZiBTZXRNb3ZpZUdXb3JsZAotCVB5TWFjX1BSRUNIRUNLKFNldE1vdmllR1dvcmxkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRNb3ZpZUdXb3JsZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgR3JhZk9ial9Db252ZXJ0LCAmcG9ydCwKLQkgICAgICAgICAgICAgICAgICAgICAgT3B0UmVzT2JqX0NvbnZlcnQsICZnZGgpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRNb3ZpZUdXb3JsZChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgIHBvcnQsCi0JICAgICAgICAgICAgICAgZ2RoKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfQ29udmVydCwgJnBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdFJlc09ial9Db252ZXJ0LCAmZ2RoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0TW92aWVHV29ybGQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICBwb3J0LAorICAgICAgICAgICAgICAgICAgIGdkaCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX0dldE1vdmllTmF0dXJhbEJvdW5kc1JlY3QoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3QgbmF0dXJhbEJvdW5kczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmVjdCBuYXR1cmFsQm91bmRzOwogI2lmbmRlZiBHZXRNb3ZpZU5hdHVyYWxCb3VuZHNSZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVOYXR1cmFsQm91bmRzUmVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVOYXR1cmFsQm91bmRzUmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0TW92aWVOYXR1cmFsQm91bmRzUmVjdChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJm5hdHVyYWxCb3VuZHMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmbmF0dXJhbEJvdW5kcyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldE1vdmllTmF0dXJhbEJvdW5kc1JlY3QoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuYXR1cmFsQm91bmRzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJm5hdHVyYWxCb3VuZHMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX0dldE5leHRUcmFja0ZvckNvbXBvc2l0aW5nKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlUcmFjayBfcnY7Ci0JVHJhY2sgdGhlVHJhY2s7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFRyYWNrIF9ydjsKKyAgICBUcmFjayB0aGVUcmFjazsKICNpZm5kZWYgR2V0TmV4dFRyYWNrRm9yQ29tcG9zaXRpbmcKLQlQeU1hY19QUkVDSEVDSyhHZXROZXh0VHJhY2tGb3JDb21wb3NpdGluZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TmV4dFRyYWNrRm9yQ29tcG9zaXRpbmcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9Db252ZXJ0LCAmdGhlVHJhY2spKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXROZXh0VHJhY2tGb3JDb21wb3NpdGluZyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZVRyYWNrKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFRyYWNrT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYWNrT2JqX0NvbnZlcnQsICZ0aGVUcmFjaykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE5leHRUcmFja0ZvckNvbXBvc2l0aW5nKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlVHJhY2spOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX0dldFByZXZUcmFja0ZvckNvbXBvc2l0aW5nKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlUcmFjayBfcnY7Ci0JVHJhY2sgdGhlVHJhY2s7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFRyYWNrIF9ydjsKKyAgICBUcmFjayB0aGVUcmFjazsKICNpZm5kZWYgR2V0UHJldlRyYWNrRm9yQ29tcG9zaXRpbmcKLQlQeU1hY19QUkVDSEVDSyhHZXRQcmV2VHJhY2tGb3JDb21wb3NpdGluZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0UHJldlRyYWNrRm9yQ29tcG9zaXRpbmcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9Db252ZXJ0LCAmdGhlVHJhY2spKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRQcmV2VHJhY2tGb3JDb21wb3NpdGluZyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZVRyYWNrKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFRyYWNrT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYWNrT2JqX0NvbnZlcnQsICZ0aGVUcmFjaykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFByZXZUcmFja0ZvckNvbXBvc2l0aW5nKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlVHJhY2spOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX0dldE1vdmllUGljdChNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUGljSGFuZGxlIF9ydjsKLQlUaW1lVmFsdWUgdGltZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUGljSGFuZGxlIF9ydjsKKyAgICBUaW1lVmFsdWUgdGltZTsKICNpZm5kZWYgR2V0TW92aWVQaWN0Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVQaWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZVBpY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TW92aWVQaWN0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgIHRpbWUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRpbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRNb3ZpZVBpY3QoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgdGltZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX0dldE1vdmllUG9zdGVyUGljdChNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUGljSGFuZGxlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUGljSGFuZGxlIF9ydjsKICNpZm5kZWYgR2V0TW92aWVQb3N0ZXJQaWN0Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVQb3N0ZXJQaWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZVBvc3RlclBpY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldE1vdmllUG9zdGVyUGljdChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE1vdmllUG9zdGVyUGljdChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfVXBkYXRlTW92aWUoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CiAjaWZuZGVmIFVwZGF0ZU1vdmllCi0JUHlNYWNfUFJFQ0hFQ0soVXBkYXRlTW92aWUpOworICAgIFB5TWFjX1BSRUNIRUNLKFVwZGF0ZU1vdmllKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gVXBkYXRlTW92aWUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBVcGRhdGVNb3ZpZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9JbnZhbGlkYXRlTW92aWVSZWdpb24oTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JUmduSGFuZGxlIGludmFsaWRSZ247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgUmduSGFuZGxlIGludmFsaWRSZ247CiAjaWZuZGVmIEludmFsaWRhdGVNb3ZpZVJlZ2lvbgotCVB5TWFjX1BSRUNIRUNLKEludmFsaWRhdGVNb3ZpZVJlZ2lvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soSW52YWxpZGF0ZU1vdmllUmVnaW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZpbnZhbGlkUmduKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEludmFsaWRhdGVNb3ZpZVJlZ2lvbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZFJnbik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmludmFsaWRSZ24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gSW52YWxpZGF0ZU1vdmllUmVnaW9uKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkUmduKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9HZXRNb3ZpZUJveChNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVjdCBib3hSZWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IGJveFJlY3Q7CiAjaWZuZGVmIEdldE1vdmllQm94Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVCb3gpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1vdmllQm94KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlHZXRNb3ZpZUJveChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICZib3hSZWN0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmJveFJlY3QpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRNb3ZpZUJveChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICZib3hSZWN0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmJveFJlY3QpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX1NldE1vdmllQm94KE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZWN0IGJveFJlY3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlY3QgYm94UmVjdDsKICNpZm5kZWYgU2V0TW92aWVCb3gKLQlQeU1hY19QUkVDSEVDSyhTZXRNb3ZpZUJveCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TW92aWVCb3gpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm94UmVjdCkpCi0JCXJldHVybiBOVUxMOwotCVNldE1vdmllQm94KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgJmJveFJlY3QpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3hSZWN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0TW92aWVCb3goX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAmYm94UmVjdCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX0dldE1vdmllRGlzcGxheUNsaXBSZ24oTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJnbkhhbmRsZSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSBfcnY7CiAjaWZuZGVmIEdldE1vdmllRGlzcGxheUNsaXBSZ24KLQlQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZURpc3BsYXlDbGlwUmduKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZURpc3BsYXlDbGlwUmduKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRNb3ZpZURpc3BsYXlDbGlwUmduKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TW92aWVEaXNwbGF5Q2xpcFJnbihfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfU2V0TW92aWVEaXNwbGF5Q2xpcFJnbihNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIHRoZUNsaXA7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSB0aGVDbGlwOwogI2lmbmRlZiBTZXRNb3ZpZURpc3BsYXlDbGlwUmduCi0JUHlNYWNfUFJFQ0hFQ0soU2V0TW92aWVEaXNwbGF5Q2xpcFJnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TW92aWVEaXNwbGF5Q2xpcFJnbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlQ2xpcCkpCi0JCXJldHVybiBOVUxMOwotCVNldE1vdmllRGlzcGxheUNsaXBSZ24oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgIHRoZUNsaXApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlQ2xpcCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldE1vdmllRGlzcGxheUNsaXBSZ24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZUNsaXApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9HZXRNb3ZpZUNsaXBSZ24oTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJnbkhhbmRsZSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSBfcnY7CiAjaWZuZGVmIEdldE1vdmllQ2xpcFJnbgotCVB5TWFjX1BSRUNIRUNLKEdldE1vdmllQ2xpcFJnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVDbGlwUmduKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRNb3ZpZUNsaXBSZ24oX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRNb3ZpZUNsaXBSZ24oX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX1NldE1vdmllQ2xpcFJnbihNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIHRoZUNsaXA7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSB0aGVDbGlwOwogI2lmbmRlZiBTZXRNb3ZpZUNsaXBSZ24KLQlQeU1hY19QUkVDSEVDSyhTZXRNb3ZpZUNsaXBSZ24pOworICAgIFB5TWFjX1BSRUNIRUNLKFNldE1vdmllQ2xpcFJnbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlQ2xpcCkpCi0JCXJldHVybiBOVUxMOwotCVNldE1vdmllQ2xpcFJnbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICB0aGVDbGlwKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUNsaXApKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRNb3ZpZUNsaXBSZ24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgdGhlQ2xpcCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX0dldE1vdmllRGlzcGxheUJvdW5kc1JnbihNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIF9ydjsKICNpZm5kZWYgR2V0TW92aWVEaXNwbGF5Qm91bmRzUmduCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVEaXNwbGF5Qm91bmRzUmduKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZURpc3BsYXlCb3VuZHNSZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldE1vdmllRGlzcGxheUJvdW5kc1Jnbihfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE1vdmllRGlzcGxheUJvdW5kc1Jnbihfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfR2V0TW92aWVCb3VuZHNSZ24oTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJnbkhhbmRsZSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSBfcnY7CiAjaWZuZGVmIEdldE1vdmllQm91bmRzUmduCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVCb3VuZHNSZ24pOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1vdmllQm91bmRzUmduKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRNb3ZpZUJvdW5kc1Jnbihfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE1vdmllQm91bmRzUmduKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9TZXRNb3ZpZVZpZGVvT3V0cHV0KE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRJbnN0YW5jZSB2b3V0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRJbnN0YW5jZSB2b3V0OwogI2lmbmRlZiBTZXRNb3ZpZVZpZGVvT3V0cHV0Ci0JUHlNYWNfUFJFQ0hFQ0soU2V0TW92aWVWaWRlb091dHB1dCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TW92aWVWaWRlb091dHB1dCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnZvdXQpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRNb3ZpZVZpZGVvT3V0cHV0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICB2b3V0KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ2b3V0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0TW92aWVWaWRlb091dHB1dChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgdm91dCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX1B1dE1vdmllSW50b0hhbmRsZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlIYW5kbGUgcHVibGljTW92aWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSGFuZGxlIHB1YmxpY01vdmllOwogI2lmbmRlZiBQdXRNb3ZpZUludG9IYW5kbGUKLQlQeU1hY19QUkVDSEVDSyhQdXRNb3ZpZUludG9IYW5kbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFB1dE1vdmllSW50b0hhbmRsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcHVibGljTW92aWUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUHV0TW92aWVJbnRvSGFuZGxlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWNNb3ZpZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnB1YmxpY01vdmllKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFB1dE1vdmllSW50b0hhbmRsZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljTW92aWUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX1B1dE1vdmllSW50b0RhdGFGb3JrKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCXNob3J0IGZSZWZOdW07Ci0JbG9uZyBvZmZzZXQ7Ci0JbG9uZyBtYXhTaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIHNob3J0IGZSZWZOdW07CisgICAgbG9uZyBvZmZzZXQ7CisgICAgbG9uZyBtYXhTaXplOwogI2lmbmRlZiBQdXRNb3ZpZUludG9EYXRhRm9yawotCVB5TWFjX1BSRUNIRUNLKFB1dE1vdmllSW50b0RhdGFGb3JrKTsKKyAgICBQeU1hY19QUkVDSEVDSyhQdXRNb3ZpZUludG9EYXRhRm9yayk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZlJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1heFNpemUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUHV0TW92aWVJbnRvRGF0YUZvcmsoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgZlJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhTaXplKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZlJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1heFNpemUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUHV0TW92aWVJbnRvRGF0YUZvcmsoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZlJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhTaXplKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9QdXRNb3ZpZUludG9EYXRhRm9yazY0KE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCWxvbmcgZlJlZk51bTsKLQl3aWRlIG9mZnNldDsKLQl1bnNpZ25lZCBsb25nIG1heFNpemU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgbG9uZyBmUmVmTnVtOworICAgIHdpZGUgb2Zmc2V0OworICAgIHVuc2lnbmVkIGxvbmcgbWF4U2l6ZTsKICNpZm5kZWYgUHV0TW92aWVJbnRvRGF0YUZvcms2NAotCVB5TWFjX1BSRUNIRUNLKFB1dE1vdmllSW50b0RhdGFGb3JrNjQpOworICAgIFB5TWFjX1BSRUNIRUNLKFB1dE1vdmllSW50b0RhdGFGb3JrNjQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZmUmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXR3aWRlLCAmb2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAmbWF4U2l6ZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBQdXRNb3ZpZUludG9EYXRhRm9yazY0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZlJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFNpemUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZlJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0d2lkZSwgJm9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1heFNpemUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUHV0TW92aWVJbnRvRGF0YUZvcms2NChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhTaXplKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9QdXRNb3ZpZUludG9TdG9yYWdlKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCURhdGFIYW5kbGVyIGRoOwotCXdpZGUgb2Zmc2V0OwotCXVuc2lnbmVkIGxvbmcgbWF4U2l6ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBEYXRhSGFuZGxlciBkaDsKKyAgICB3aWRlIG9mZnNldDsKKyAgICB1bnNpZ25lZCBsb25nIG1heFNpemU7CiAjaWZuZGVmIFB1dE1vdmllSW50b1N0b3JhZ2UKLQlQeU1hY19QUkVDSEVDSyhQdXRNb3ZpZUludG9TdG9yYWdlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhQdXRNb3ZpZUludG9TdG9yYWdlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldHdpZGUsICZvZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICZtYXhTaXplKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFB1dE1vdmllSW50b1N0b3JhZ2UoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFNpemUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldHdpZGUsICZvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXhTaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFB1dE1vdmllSW50b1N0b3JhZ2UoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFNpemUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX1B1dE1vdmllRm9yRGF0YVJlZkludG9IYW5kbGUoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSGFuZGxlIGRhdGFSZWY7Ci0JT1NUeXBlIGRhdGFSZWZUeXBlOwotCUhhbmRsZSBwdWJsaWNNb3ZpZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBIYW5kbGUgZGF0YVJlZjsKKyAgICBPU1R5cGUgZGF0YVJlZlR5cGU7CisgICAgSGFuZGxlIHB1YmxpY01vdmllOwogI2lmbmRlZiBQdXRNb3ZpZUZvckRhdGFSZWZJbnRvSGFuZGxlCi0JUHlNYWNfUFJFQ0hFQ0soUHV0TW92aWVGb3JEYXRhUmVmSW50b0hhbmRsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUHV0TW92aWVGb3JEYXRhUmVmSW50b0hhbmRsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRhdGFSZWZUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnB1YmxpY01vdmllKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFB1dE1vdmllRm9yRGF0YVJlZkludG9IYW5kbGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWZUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpY01vdmllKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRhdGFSZWZUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnB1YmxpY01vdmllKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFB1dE1vdmllRm9yRGF0YVJlZkludG9IYW5kbGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWZUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpY01vdmllKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9HZXRNb3ZpZUNyZWF0aW9uVGltZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JdW5zaWduZWQgbG9uZyBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHVuc2lnbmVkIGxvbmcgX3J2OwogI2lmbmRlZiBHZXRNb3ZpZUNyZWF0aW9uVGltZQotCVB5TWFjX1BSRUNIRUNLKEdldE1vdmllQ3JlYXRpb25UaW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZUNyZWF0aW9uVGltZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TW92aWVDcmVhdGlvblRpbWUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE1vdmllQ3JlYXRpb25UaW1lKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX0dldE1vdmllTW9kaWZpY2F0aW9uVGltZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JdW5zaWduZWQgbG9uZyBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHVuc2lnbmVkIGxvbmcgX3J2OwogI2lmbmRlZiBHZXRNb3ZpZU1vZGlmaWNhdGlvblRpbWUKLQlQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZU1vZGlmaWNhdGlvblRpbWUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1vdmllTW9kaWZpY2F0aW9uVGltZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TW92aWVNb2RpZmljYXRpb25UaW1lKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRNb3ZpZU1vZGlmaWNhdGlvblRpbWUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfR2V0TW92aWVUaW1lU2NhbGUoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVRpbWVTY2FsZSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFRpbWVTY2FsZSBfcnY7CiAjaWZuZGVmIEdldE1vdmllVGltZVNjYWxlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVUaW1lU2NhbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1vdmllVGltZVNjYWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRNb3ZpZVRpbWVTY2FsZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TW92aWVUaW1lU2NhbGUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfU2V0TW92aWVUaW1lU2NhbGUoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVRpbWVTY2FsZSB0aW1lU2NhbGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFRpbWVTY2FsZSB0aW1lU2NhbGU7CiAjaWZuZGVmIFNldE1vdmllVGltZVNjYWxlCi0JUHlNYWNfUFJFQ0hFQ0soU2V0TW92aWVUaW1lU2NhbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldE1vdmllVGltZVNjYWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGltZVNjYWxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0TW92aWVUaW1lU2NhbGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICB0aW1lU2NhbGUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRpbWVTY2FsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldE1vdmllVGltZVNjYWxlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgdGltZVNjYWxlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfR2V0TW92aWVEdXJhdGlvbihNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVGltZVZhbHVlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVGltZVZhbHVlIF9ydjsKICNpZm5kZWYgR2V0TW92aWVEdXJhdGlvbgotCVB5TWFjX1BSRUNIRUNLKEdldE1vdmllRHVyYXRpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1vdmllRHVyYXRpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldE1vdmllRHVyYXRpb24oX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE1vdmllRHVyYXRpb24oX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfR2V0TW92aWVSYXRlKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlGaXhlZCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEZpeGVkIF9ydjsKICNpZm5kZWYgR2V0TW92aWVSYXRlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVSYXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZVJhdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldE1vdmllUmF0ZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRml4ZWQsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE1vdmllUmF0ZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRml4ZWQsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfU2V0TW92aWVSYXRlKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlGaXhlZCByYXRlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBGaXhlZCByYXRlOwogI2lmbmRlZiBTZXRNb3ZpZVJhdGUKLQlQeU1hY19QUkVDSEVDSyhTZXRNb3ZpZVJhdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldE1vdmllUmF0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmcmF0ZSkpCi0JCXJldHVybiBOVUxMOwotCVNldE1vdmllUmF0ZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICByYXRlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJnJhdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRNb3ZpZVJhdGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgcmF0ZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX0dldE1vdmllUHJlZmVycmVkUmF0ZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JRml4ZWQgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBGaXhlZCBfcnY7CiAjaWZuZGVmIEdldE1vdmllUHJlZmVycmVkUmF0ZQotCVB5TWFjX1BSRUNIRUNLKEdldE1vdmllUHJlZmVycmVkUmF0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVQcmVmZXJyZWRSYXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRNb3ZpZVByZWZlcnJlZFJhdGUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRNb3ZpZVByZWZlcnJlZFJhdGUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX1NldE1vdmllUHJlZmVycmVkUmF0ZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JRml4ZWQgcmF0ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgRml4ZWQgcmF0ZTsKICNpZm5kZWYgU2V0TW92aWVQcmVmZXJyZWRSYXRlCi0JUHlNYWNfUFJFQ0hFQ0soU2V0TW92aWVQcmVmZXJyZWRSYXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRNb3ZpZVByZWZlcnJlZFJhdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJnJhdGUpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRNb3ZpZVByZWZlcnJlZFJhdGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgcmF0ZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZyYXRlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0TW92aWVQcmVmZXJyZWRSYXRlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdGUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9HZXRNb3ZpZVByZWZlcnJlZFZvbHVtZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBfcnY7CiAjaWZuZGVmIEdldE1vdmllUHJlZmVycmVkVm9sdW1lCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVQcmVmZXJyZWRWb2x1bWUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1vdmllUHJlZmVycmVkVm9sdW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRNb3ZpZVByZWZlcnJlZFZvbHVtZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TW92aWVQcmVmZXJyZWRWb2x1bWUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfU2V0TW92aWVQcmVmZXJyZWRWb2x1bWUoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IHZvbHVtZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgdm9sdW1lOwogI2lmbmRlZiBTZXRNb3ZpZVByZWZlcnJlZFZvbHVtZQotCVB5TWFjX1BSRUNIRUNLKFNldE1vdmllUHJlZmVycmVkVm9sdW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRNb3ZpZVByZWZlcnJlZFZvbHVtZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZvbHVtZSkpCi0JCXJldHVybiBOVUxMOwotCVNldE1vdmllUHJlZmVycmVkVm9sdW1lKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2b2x1bWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRNb3ZpZVByZWZlcnJlZFZvbHVtZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX0dldE1vdmllVm9sdW1lKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IF9ydjsKICNpZm5kZWYgR2V0TW92aWVWb2x1bWUKLQlQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZVZvbHVtZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVWb2x1bWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldE1vdmllVm9sdW1lKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRNb3ZpZVZvbHVtZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9TZXRNb3ZpZVZvbHVtZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgdm9sdW1lOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCB2b2x1bWU7CiAjaWZuZGVmIFNldE1vdmllVm9sdW1lCi0JUHlNYWNfUFJFQ0hFQ0soU2V0TW92aWVWb2x1bWUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldE1vdmllVm9sdW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdm9sdW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0TW92aWVWb2x1bWUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICB2b2x1bWUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZvbHVtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldE1vdmllVm9sdW1lKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgdm9sdW1lKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfR2V0TW92aWVQcmV2aWV3VGltZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVGltZVZhbHVlIHByZXZpZXdUaW1lOwotCVRpbWVWYWx1ZSBwcmV2aWV3RHVyYXRpb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFRpbWVWYWx1ZSBwcmV2aWV3VGltZTsKKyAgICBUaW1lVmFsdWUgcHJldmlld0R1cmF0aW9uOwogI2lmbmRlZiBHZXRNb3ZpZVByZXZpZXdUaW1lCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVQcmV2aWV3VGltZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVQcmV2aWV3VGltZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0TW92aWVQcmV2aWV3VGltZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgJnByZXZpZXdUaW1lLAotCSAgICAgICAgICAgICAgICAgICAgJnByZXZpZXdEdXJhdGlvbik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBwcmV2aWV3VGltZSwKLQkgICAgICAgICAgICAgICAgICAgICBwcmV2aWV3RHVyYXRpb24pOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRNb3ZpZVByZXZpZXdUaW1lKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAmcHJldmlld1RpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAmcHJldmlld0R1cmF0aW9uKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpZXdUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpZXdEdXJhdGlvbik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfU2V0TW92aWVQcmV2aWV3VGltZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVGltZVZhbHVlIHByZXZpZXdUaW1lOwotCVRpbWVWYWx1ZSBwcmV2aWV3RHVyYXRpb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFRpbWVWYWx1ZSBwcmV2aWV3VGltZTsKKyAgICBUaW1lVmFsdWUgcHJldmlld0R1cmF0aW9uOwogI2lmbmRlZiBTZXRNb3ZpZVByZXZpZXdUaW1lCi0JUHlNYWNfUFJFQ0hFQ0soU2V0TW92aWVQcmV2aWV3VGltZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TW92aWVQcmV2aWV3VGltZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZwcmV2aWV3VGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnByZXZpZXdEdXJhdGlvbikpCi0JCXJldHVybiBOVUxMOwotCVNldE1vdmllUHJldmlld1RpbWUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgIHByZXZpZXdUaW1lLAotCSAgICAgICAgICAgICAgICAgICAgcHJldmlld0R1cmF0aW9uKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJldmlld1RpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwcmV2aWV3RHVyYXRpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRNb3ZpZVByZXZpZXdUaW1lKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aWV3VGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpZXdEdXJhdGlvbik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX0dldE1vdmllUG9zdGVyVGltZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVGltZVZhbHVlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVGltZVZhbHVlIF9ydjsKICNpZm5kZWYgR2V0TW92aWVQb3N0ZXJUaW1lCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVQb3N0ZXJUaW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZVBvc3RlclRpbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldE1vdmllUG9zdGVyVGltZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TW92aWVQb3N0ZXJUaW1lKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX1NldE1vdmllUG9zdGVyVGltZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVGltZVZhbHVlIHBvc3RlclRpbWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFRpbWVWYWx1ZSBwb3N0ZXJUaW1lOwogI2lmbmRlZiBTZXRNb3ZpZVBvc3RlclRpbWUKLQlQeU1hY19QUkVDSEVDSyhTZXRNb3ZpZVBvc3RlclRpbWUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldE1vdmllUG9zdGVyVGltZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnBvc3RlclRpbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRNb3ZpZVBvc3RlclRpbWUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgcG9zdGVyVGltZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcG9zdGVyVGltZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldE1vdmllUG9zdGVyVGltZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICBwb3N0ZXJUaW1lKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfR2V0TW92aWVTZWxlY3Rpb24oTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVRpbWVWYWx1ZSBzZWxlY3Rpb25UaW1lOwotCVRpbWVWYWx1ZSBzZWxlY3Rpb25EdXJhdGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVGltZVZhbHVlIHNlbGVjdGlvblRpbWU7CisgICAgVGltZVZhbHVlIHNlbGVjdGlvbkR1cmF0aW9uOwogI2lmbmRlZiBHZXRNb3ZpZVNlbGVjdGlvbgotCVB5TWFjX1BSRUNIRUNLKEdldE1vdmllU2VsZWN0aW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZVNlbGVjdGlvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0TW92aWVTZWxlY3Rpb24oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAmc2VsZWN0aW9uVGltZSwKLQkgICAgICAgICAgICAgICAgICAmc2VsZWN0aW9uRHVyYXRpb24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uVGltZSwKLQkgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25EdXJhdGlvbik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldE1vdmllU2VsZWN0aW9uKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgJnNlbGVjdGlvblRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgJnNlbGVjdGlvbkR1cmF0aW9uKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvblRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uRHVyYXRpb24pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX1NldE1vdmllU2VsZWN0aW9uKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlUaW1lVmFsdWUgc2VsZWN0aW9uVGltZTsKLQlUaW1lVmFsdWUgc2VsZWN0aW9uRHVyYXRpb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFRpbWVWYWx1ZSBzZWxlY3Rpb25UaW1lOworICAgIFRpbWVWYWx1ZSBzZWxlY3Rpb25EdXJhdGlvbjsKICNpZm5kZWYgU2V0TW92aWVTZWxlY3Rpb24KLQlQeU1hY19QUkVDSEVDSyhTZXRNb3ZpZVNlbGVjdGlvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TW92aWVTZWxlY3Rpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2VsZWN0aW9uVGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNlbGVjdGlvbkR1cmF0aW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0TW92aWVTZWxlY3Rpb24oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25UaW1lLAotCSAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkR1cmF0aW9uKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VsZWN0aW9uVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlbGVjdGlvbkR1cmF0aW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0TW92aWVTZWxlY3Rpb24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25UaW1lLAorICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkR1cmF0aW9uKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfU2V0TW92aWVBY3RpdmVTZWdtZW50KE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlUaW1lVmFsdWUgc3RhcnRUaW1lOwotCVRpbWVWYWx1ZSBkdXJhdGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVGltZVZhbHVlIHN0YXJ0VGltZTsKKyAgICBUaW1lVmFsdWUgZHVyYXRpb247CiAjaWZuZGVmIFNldE1vdmllQWN0aXZlU2VnbWVudAotCVB5TWFjX1BSRUNIRUNLKFNldE1vdmllQWN0aXZlU2VnbWVudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TW92aWVBY3RpdmVTZWdtZW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0VGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmR1cmF0aW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0TW92aWVBY3RpdmVTZWdtZW50KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGFydFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldE1vdmllQWN0aXZlU2VnbWVudChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfR2V0TW92aWVBY3RpdmVTZWdtZW50KE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlUaW1lVmFsdWUgc3RhcnRUaW1lOwotCVRpbWVWYWx1ZSBkdXJhdGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVGltZVZhbHVlIHN0YXJ0VGltZTsKKyAgICBUaW1lVmFsdWUgZHVyYXRpb247CiAjaWZuZGVmIEdldE1vdmllQWN0aXZlU2VnbWVudAotCVB5TWFjX1BSRUNIRUNLKEdldE1vdmllQWN0aXZlU2VnbWVudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVBY3RpdmVTZWdtZW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlHZXRNb3ZpZUFjdGl2ZVNlZ21lbnQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0VGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmR1cmF0aW9uKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZSwKLQkgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldE1vdmllQWN0aXZlU2VnbWVudChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhcnRUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZHVyYXRpb24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9HZXRNb3ZpZVRpbWUoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVRpbWVWYWx1ZSBfcnY7Ci0JVGltZVJlY29yZCBjdXJyZW50VGltZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVGltZVZhbHVlIF9ydjsKKyAgICBUaW1lUmVjb3JkIGN1cnJlbnRUaW1lOwogI2lmbmRlZiBHZXRNb3ZpZVRpbWUKLQlQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZVRpbWUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1vdmllVGltZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TW92aWVUaW1lKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICZjdXJyZW50VGltZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFF0VGltZVJlY29yZF9OZXcsICZjdXJyZW50VGltZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE1vdmllVGltZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAmY3VycmVudFRpbWUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBRdFRpbWVSZWNvcmRfTmV3LCAmY3VycmVudFRpbWUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX1NldE1vdmllVGltZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVGltZVJlY29yZCBuZXd0aW1lOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBUaW1lUmVjb3JkIG5ld3RpbWU7CiAjaWZuZGVmIFNldE1vdmllVGltZQotCVB5TWFjX1BSRUNIRUNLKFNldE1vdmllVGltZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TW92aWVUaW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUXRUaW1lUmVjb3JkX0NvbnZlcnQsICZuZXd0aW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0TW92aWVUaW1lKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICZuZXd0aW1lKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBRdFRpbWVSZWNvcmRfQ29udmVydCwgJm5ld3RpbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRNb3ZpZVRpbWUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgJm5ld3RpbWUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9TZXRNb3ZpZVRpbWVWYWx1ZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVGltZVZhbHVlIG5ld3RpbWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFRpbWVWYWx1ZSBuZXd0aW1lOwogI2lmbmRlZiBTZXRNb3ZpZVRpbWVWYWx1ZQotCVB5TWFjX1BSRUNIRUNLKFNldE1vdmllVGltZVZhbHVlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRNb3ZpZVRpbWVWYWx1ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm5ld3RpbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRNb3ZpZVRpbWVWYWx1ZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgIG5ld3RpbWUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld3RpbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRNb3ZpZVRpbWVWYWx1ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgIG5ld3RpbWUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9HZXRNb3ZpZVVzZXJEYXRhKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlVc2VyRGF0YSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFVzZXJEYXRhIF9ydjsKICNpZm5kZWYgR2V0TW92aWVVc2VyRGF0YQotCVB5TWFjX1BSRUNIRUNLKEdldE1vdmllVXNlckRhdGEpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1vdmllVXNlckRhdGEpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldE1vdmllVXNlckRhdGEoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBVc2VyRGF0YU9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE1vdmllVXNlckRhdGEoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBVc2VyRGF0YU9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfR2V0TW92aWVUcmFja0NvdW50KE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgbG9uZyBfcnY7CiAjaWZuZGVmIEdldE1vdmllVHJhY2tDb3VudAotCVB5TWFjX1BSRUNIRUNLKEdldE1vdmllVHJhY2tDb3VudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVUcmFja0NvdW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRNb3ZpZVRyYWNrQ291bnQoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE1vdmllVHJhY2tDb3VudChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9HZXRNb3ZpZVRyYWNrKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlUcmFjayBfcnY7Ci0JbG9uZyB0cmFja0lEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBUcmFjayBfcnY7CisgICAgbG9uZyB0cmFja0lEOwogI2lmbmRlZiBHZXRNb3ZpZVRyYWNrCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVUcmFjayk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVUcmFjayk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRyYWNrSUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRNb3ZpZVRyYWNrKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICB0cmFja0lEKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFRyYWNrT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRyYWNrSUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRNb3ZpZVRyYWNrKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICB0cmFja0lEKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFRyYWNrT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9HZXRNb3ZpZUluZFRyYWNrKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlUcmFjayBfcnY7Ci0JbG9uZyBpbmRleDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVHJhY2sgX3J2OworICAgIGxvbmcgaW5kZXg7CiAjaWZuZGVmIEdldE1vdmllSW5kVHJhY2sKLQlQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZUluZFRyYWNrKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZUluZFRyYWNrKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRNb3ZpZUluZFRyYWNrKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICBpbmRleCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE1vdmllSW5kVHJhY2soX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFRyYWNrT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9HZXRNb3ZpZUluZFRyYWNrVHlwZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVHJhY2sgX3J2OwotCWxvbmcgaW5kZXg7Ci0JT1NUeXBlIHRyYWNrVHlwZTsKLQlsb25nIGZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBUcmFjayBfcnY7CisgICAgbG9uZyBpbmRleDsKKyAgICBPU1R5cGUgdHJhY2tUeXBlOworICAgIGxvbmcgZmxhZ3M7CiAjaWZuZGVmIEdldE1vdmllSW5kVHJhY2tUeXBlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVJbmRUcmFja1R5cGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1vdmllSW5kVHJhY2tUeXBlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRyYWNrVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TW92aWVJbmRUcmFja1R5cGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja1R5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRyYWNrVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TW92aWVJbmRUcmFja1R5cGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX05ld01vdmllVHJhY2soTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVRyYWNrIF9ydjsKLQlGaXhlZCB3aWR0aDsKLQlGaXhlZCBoZWlnaHQ7Ci0Jc2hvcnQgdHJhY2tWb2x1bWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFRyYWNrIF9ydjsKKyAgICBGaXhlZCB3aWR0aDsKKyAgICBGaXhlZCBoZWlnaHQ7CisgICAgc2hvcnQgdHJhY2tWb2x1bWU7CiAjaWZuZGVmIE5ld01vdmllVHJhY2sKLQlQeU1hY19QUkVDSEVDSyhOZXdNb3ZpZVRyYWNrKTsKKyAgICBQeU1hY19QUkVDSEVDSyhOZXdNb3ZpZVRyYWNrKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZ3aWR0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZoZWlnaHQsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0cmFja1ZvbHVtZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE5ld01vdmllVHJhY2soX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgIHdpZHRoLAotCSAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LAotCSAgICAgICAgICAgICAgICAgICAgdHJhY2tWb2x1bWUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZ3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFja1ZvbHVtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE5ld01vdmllVHJhY2soX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tWb2x1bWUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX1NldEF1dG9UcmFja0FsdGVybmF0ZXNFbmFibGVkKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIGVuYWJsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBlbmFibGU7CiAjaWZuZGVmIFNldEF1dG9UcmFja0FsdGVybmF0ZXNFbmFibGVkCi0JUHlNYWNfUFJFQ0hFQ0soU2V0QXV0b1RyYWNrQWx0ZXJuYXRlc0VuYWJsZWQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldEF1dG9UcmFja0FsdGVybmF0ZXNFbmFibGVkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZW5hYmxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0QXV0b1RyYWNrQWx0ZXJuYXRlc0VuYWJsZWQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmVuYWJsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldEF1dG9UcmFja0FsdGVybmF0ZXNFbmFibGVkKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfU2VsZWN0TW92aWVBbHRlcm5hdGVzKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIFNlbGVjdE1vdmllQWx0ZXJuYXRlcwotCVB5TWFjX1BSRUNIRUNLKFNlbGVjdE1vdmllQWx0ZXJuYXRlcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2VsZWN0TW92aWVBbHRlcm5hdGVzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlTZWxlY3RNb3ZpZUFsdGVybmF0ZXMoX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZWxlY3RNb3ZpZUFsdGVybmF0ZXMoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX0luc2VydE1vdmllU2VnbWVudChNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlNb3ZpZSBkc3RNb3ZpZTsKLQlUaW1lVmFsdWUgc3JjSW47Ci0JVGltZVZhbHVlIHNyY0R1cmF0aW9uOwotCVRpbWVWYWx1ZSBkc3RJbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBNb3ZpZSBkc3RNb3ZpZTsKKyAgICBUaW1lVmFsdWUgc3JjSW47CisgICAgVGltZVZhbHVlIHNyY0R1cmF0aW9uOworICAgIFRpbWVWYWx1ZSBkc3RJbjsKICNpZm5kZWYgSW5zZXJ0TW92aWVTZWdtZW50Ci0JUHlNYWNfUFJFQ0hFQ0soSW5zZXJ0TW92aWVTZWdtZW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhJbnNlcnRNb3ZpZVNlZ21lbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9Db252ZXJ0LCAmZHN0TW92aWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZzcmNJbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNyY0R1cmF0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAmZHN0SW4pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gSW5zZXJ0TW92aWVTZWdtZW50KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RNb3ZpZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0luLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjRHVyYXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RJbik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9Db252ZXJ0LCAmZHN0TW92aWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzcmNJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNyY0R1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZHN0SW4pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gSW5zZXJ0TW92aWVTZWdtZW50KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RNb3ZpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjRHVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RJbik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfSW5zZXJ0RW1wdHlNb3ZpZVNlZ21lbnQoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JVGltZVZhbHVlIGRzdEluOwotCVRpbWVWYWx1ZSBkc3REdXJhdGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBUaW1lVmFsdWUgZHN0SW47CisgICAgVGltZVZhbHVlIGRzdER1cmF0aW9uOwogI2lmbmRlZiBJbnNlcnRFbXB0eU1vdmllU2VnbWVudAotCVB5TWFjX1BSRUNIRUNLKEluc2VydEVtcHR5TW92aWVTZWdtZW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhJbnNlcnRFbXB0eU1vdmllU2VnbWVudCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZkc3RJbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRzdER1cmF0aW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEluc2VydEVtcHR5TW92aWVTZWdtZW50KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEluLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3REdXJhdGlvbik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZHN0SW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkc3REdXJhdGlvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBJbnNlcnRFbXB0eU1vdmllU2VnbWVudChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0RHVyYXRpb24pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX0RlbGV0ZU1vdmllU2VnbWVudChNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlUaW1lVmFsdWUgc3RhcnRUaW1lOwotCVRpbWVWYWx1ZSBkdXJhdGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBUaW1lVmFsdWUgc3RhcnRUaW1lOworICAgIFRpbWVWYWx1ZSBkdXJhdGlvbjsKICNpZm5kZWYgRGVsZXRlTW92aWVTZWdtZW50Ci0JUHlNYWNfUFJFQ0hFQ0soRGVsZXRlTW92aWVTZWdtZW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhEZWxldGVNb3ZpZVNlZ21lbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmc3RhcnRUaW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAmZHVyYXRpb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRGVsZXRlTW92aWVTZWdtZW50KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhcnRUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZHVyYXRpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRGVsZXRlTW92aWVTZWdtZW50KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfU2NhbGVNb3ZpZVNlZ21lbnQoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JVGltZVZhbHVlIHN0YXJ0VGltZTsKLQlUaW1lVmFsdWUgb2xkRHVyYXRpb247Ci0JVGltZVZhbHVlIG5ld0R1cmF0aW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFRpbWVWYWx1ZSBzdGFydFRpbWU7CisgICAgVGltZVZhbHVlIG9sZER1cmF0aW9uOworICAgIFRpbWVWYWx1ZSBuZXdEdXJhdGlvbjsKICNpZm5kZWYgU2NhbGVNb3ZpZVNlZ21lbnQKLQlQeU1hY19QUkVDSEVDSyhTY2FsZU1vdmllU2VnbWVudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2NhbGVNb3ZpZVNlZ21lbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0VGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJm9sZER1cmF0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAmbmV3RHVyYXRpb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2NhbGVNb3ZpZVNlZ21lbnQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBvbGREdXJhdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RHVyYXRpb24pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGFydFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZvbGREdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld0R1cmF0aW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNjYWxlTW92aWVTZWdtZW50KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkRHVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0R1cmF0aW9uKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9DdXRNb3ZpZVNlbGVjdGlvbihNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JTW92aWUgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBNb3ZpZSBfcnY7CiAjaWZuZGVmIEN1dE1vdmllU2VsZWN0aW9uCi0JUHlNYWNfUFJFQ0hFQ0soQ3V0TW92aWVTZWxlY3Rpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKEN1dE1vdmllU2VsZWN0aW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDdXRNb3ZpZVNlbGVjdGlvbihfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ3V0TW92aWVTZWxlY3Rpb24oX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfQ29weU1vdmllU2VsZWN0aW9uKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlNb3ZpZSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE1vdmllIF9ydjsKICNpZm5kZWYgQ29weU1vdmllU2VsZWN0aW9uCi0JUHlNYWNfUFJFQ0hFQ0soQ29weU1vdmllU2VsZWN0aW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb3B5TW92aWVTZWxlY3Rpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENvcHlNb3ZpZVNlbGVjdGlvbihfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ29weU1vdmllU2VsZWN0aW9uKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX1Bhc3RlTW92aWVTZWxlY3Rpb24oTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU1vdmllIHNyYzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgTW92aWUgc3JjOwogI2lmbmRlZiBQYXN0ZU1vdmllU2VsZWN0aW9uCi0JUHlNYWNfUFJFQ0hFQ0soUGFzdGVNb3ZpZVNlbGVjdGlvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soUGFzdGVNb3ZpZVNlbGVjdGlvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX0NvbnZlcnQsICZzcmMpKQotCQlyZXR1cm4gTlVMTDsKLQlQYXN0ZU1vdmllU2VsZWN0aW9uKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICBzcmMpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX0NvbnZlcnQsICZzcmMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQYXN0ZU1vdmllU2VsZWN0aW9uKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICBzcmMpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9BZGRNb3ZpZVNlbGVjdGlvbihNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JTW92aWUgc3JjOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBNb3ZpZSBzcmM7CiAjaWZuZGVmIEFkZE1vdmllU2VsZWN0aW9uCi0JUHlNYWNfUFJFQ0hFQ0soQWRkTW92aWVTZWxlY3Rpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKEFkZE1vdmllU2VsZWN0aW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfQ29udmVydCwgJnNyYykpCi0JCXJldHVybiBOVUxMOwotCUFkZE1vdmllU2VsZWN0aW9uKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgc3JjKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9Db252ZXJ0LCAmc3JjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQWRkTW92aWVTZWxlY3Rpb24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICBzcmMpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9DbGVhck1vdmllU2VsZWN0aW9uKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIENsZWFyTW92aWVTZWxlY3Rpb24KLQlQeU1hY19QUkVDSEVDSyhDbGVhck1vdmllU2VsZWN0aW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDbGVhck1vdmllU2VsZWN0aW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlDbGVhck1vdmllU2VsZWN0aW9uKF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ2xlYXJNb3ZpZVNlbGVjdGlvbihfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfUHV0TW92aWVJbnRvVHlwZWRIYW5kbGUoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JVHJhY2sgdGFyZ2V0VHJhY2s7Ci0JT1NUeXBlIGhhbmRsZVR5cGU7Ci0JSGFuZGxlIHB1YmxpY01vdmllOwotCVRpbWVWYWx1ZSBzdGFydDsKLQlUaW1lVmFsdWUgZHVyOwotCWxvbmcgZmxhZ3M7Ci0JQ29tcG9uZW50SW5zdGFuY2UgdXNlckNvbXA7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgVHJhY2sgdGFyZ2V0VHJhY2s7CisgICAgT1NUeXBlIGhhbmRsZVR5cGU7CisgICAgSGFuZGxlIHB1YmxpY01vdmllOworICAgIFRpbWVWYWx1ZSBzdGFydDsKKyAgICBUaW1lVmFsdWUgZHVyOworICAgIGxvbmcgZmxhZ3M7CisgICAgQ29tcG9uZW50SW5zdGFuY2UgdXNlckNvbXA7CiAjaWZuZGVmIFB1dE1vdmllSW50b1R5cGVkSGFuZGxlCi0JUHlNYWNfUFJFQ0hFQ0soUHV0TW92aWVJbnRvVHlwZWRIYW5kbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFB1dE1vdmllSW50b1R5cGVkSGFuZGxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmxsbE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfQ29udmVydCwgJnRhcmdldFRyYWNrLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZoYW5kbGVUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnB1YmxpY01vdmllLAotCSAgICAgICAgICAgICAgICAgICAgICAmc3RhcnQsCi0JICAgICAgICAgICAgICAgICAgICAgICZkdXIsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdXNlckNvbXApKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUHV0TW92aWVJbnRvVHlwZWRIYW5kbGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0VHJhY2ssCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpY01vdmllLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckNvbXApOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmxsbE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfQ29udmVydCwgJnRhcmdldFRyYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZoYW5kbGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnB1YmxpY01vdmllLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkdXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdXNlckNvbXApKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUHV0TW92aWVJbnRvVHlwZWRIYW5kbGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0VHJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpY01vdmllLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckNvbXApOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX0NvcHlNb3ZpZVNldHRpbmdzKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCU1vdmllIGRzdE1vdmllOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIE1vdmllIGRzdE1vdmllOwogI2lmbmRlZiBDb3B5TW92aWVTZXR0aW5ncwotCVB5TWFjX1BSRUNIRUNLKENvcHlNb3ZpZVNldHRpbmdzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb3B5TW92aWVTZXR0aW5ncyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX0NvbnZlcnQsICZkc3RNb3ZpZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDb3B5TW92aWVTZXR0aW5ncyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBkc3RNb3ZpZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9Db252ZXJ0LCAmZHN0TW92aWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ29weU1vdmllU2V0dGluZ3MoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0TW92aWUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX0NvbnZlcnRNb3ZpZVRvRmlsZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlUcmFjayBvbmx5VHJhY2s7Ci0JRlNTcGVjIG91dHB1dEZpbGU7Ci0JT1NUeXBlIGZpbGVUeXBlOwotCU9TVHlwZSBjcmVhdG9yOwotCVNjcmlwdENvZGUgc2NyaXB0VGFnOwotCXNob3J0IHJlc0lEOwotCWxvbmcgZmxhZ3M7Ci0JQ29tcG9uZW50SW5zdGFuY2UgdXNlckNvbXA7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgVHJhY2sgb25seVRyYWNrOworICAgIEZTU3BlYyBvdXRwdXRGaWxlOworICAgIE9TVHlwZSBmaWxlVHlwZTsKKyAgICBPU1R5cGUgY3JlYXRvcjsKKyAgICBTY3JpcHRDb2RlIHNjcmlwdFRhZzsKKyAgICBzaG9ydCByZXNJRDsKKyAgICBsb25nIGZsYWdzOworICAgIENvbXBvbmVudEluc3RhbmNlIHVzZXJDb21wOwogI2lmbmRlZiBDb252ZXJ0TW92aWVUb0ZpbGUKLQlQeU1hY19QUkVDSEVDSyhDb252ZXJ0TW92aWVUb0ZpbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKENvbnZlcnRNb3ZpZVRvRmlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJmhsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9Db252ZXJ0LCAmb25seVRyYWNrLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZvdXRwdXRGaWxlLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZmaWxlVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY3JlYXRvciwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNjcmlwdFRhZywKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ1c2VyQ29tcCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDb252ZXJ0TW92aWVUb0ZpbGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHlUcmFjaywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXRGaWxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0VGFnLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc0lELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyQ29tcCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgcmVzSUQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJk8maGxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYWNrT2JqX0NvbnZlcnQsICZvbmx5VHJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJm91dHB1dEZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmZpbGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjcmVhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2NyaXB0VGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnVzZXJDb21wKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENvbnZlcnRNb3ZpZVRvRmlsZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25seVRyYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dEZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRUYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJDb21wKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZXNJRCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfR2V0TW92aWVEYXRhU2l6ZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBfcnY7Ci0JVGltZVZhbHVlIHN0YXJ0VGltZTsKLQlUaW1lVmFsdWUgZHVyYXRpb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgX3J2OworICAgIFRpbWVWYWx1ZSBzdGFydFRpbWU7CisgICAgVGltZVZhbHVlIGR1cmF0aW9uOwogI2lmbmRlZiBHZXRNb3ZpZURhdGFTaXplCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVEYXRhU2l6ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVEYXRhU2l6ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZzdGFydFRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldE1vdmllRGF0YVNpemUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGFydFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE1vdmllRGF0YVNpemUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9HZXRNb3ZpZURhdGFTaXplNjQoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JVGltZVZhbHVlIHN0YXJ0VGltZTsKLQlUaW1lVmFsdWUgZHVyYXRpb247Ci0Jd2lkZSBkYXRhU2l6ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBUaW1lVmFsdWUgc3RhcnRUaW1lOworICAgIFRpbWVWYWx1ZSBkdXJhdGlvbjsKKyAgICB3aWRlIGRhdGFTaXplOwogI2lmbmRlZiBHZXRNb3ZpZURhdGFTaXplNjQKLQlQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZURhdGFTaXplNjQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1vdmllRGF0YVNpemU2NCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZzdGFydFRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvbikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRNb3ZpZURhdGFTaXplNjQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFTaXplKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGR3aWRlLCBkYXRhU2l6ZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhcnRUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZHVyYXRpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0TW92aWVEYXRhU2l6ZTY0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhU2l6ZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgZGF0YVNpemUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX1B0SW5Nb3ZpZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JUG9pbnQgcHQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIFBvaW50IHB0OwogI2lmbmRlZiBQdEluTW92aWUKLQlQeU1hY19QUkVDSEVDSyhQdEluTW92aWUpOworICAgIFB5TWFjX1BSRUNIRUNLKFB0SW5Nb3ZpZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmcHQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBQdEluTW92aWUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgcHQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZwdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFB0SW5Nb3ZpZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICBwdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfU2V0TW92aWVMYW5ndWFnZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBsYW5ndWFnZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgbG9uZyBsYW5ndWFnZTsKICNpZm5kZWYgU2V0TW92aWVMYW5ndWFnZQotCVB5TWFjX1BSRUNIRUNLKFNldE1vdmllTGFuZ3VhZ2UpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldE1vdmllTGFuZ3VhZ2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZsYW5ndWFnZSkpCi0JCXJldHVybiBOVUxMOwotCVNldE1vdmllTGFuZ3VhZ2UoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgIGxhbmd1YWdlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZsYW5ndWFnZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldE1vdmllTGFuZ3VhZ2UoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfQ29weU1vdmllVXNlckRhdGEoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JTW92aWUgZHN0TW92aWU7Ci0JT1NUeXBlIGNvcHlSdWxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIE1vdmllIGRzdE1vdmllOworICAgIE9TVHlwZSBjb3B5UnVsZTsKICNpZm5kZWYgQ29weU1vdmllVXNlckRhdGEKLQlQeU1hY19QUkVDSEVDSyhDb3B5TW92aWVVc2VyRGF0YSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ29weU1vdmllVXNlckRhdGEpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX0NvbnZlcnQsICZkc3RNb3ZpZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY29weVJ1bGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ29weU1vdmllVXNlckRhdGEoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgZHN0TW92aWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGNvcHlSdWxlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfQ29udmVydCwgJmRzdE1vdmllLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjb3B5UnVsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDb3B5TW92aWVVc2VyRGF0YShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RNb3ZpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29weVJ1bGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX0dldE1vdmllTmV4dEludGVyZXN0aW5nVGltZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgaW50ZXJlc3RpbmdUaW1lRmxhZ3M7Ci0Jc2hvcnQgbnVtTWVkaWFUeXBlczsKLQlPU1R5cGUgd2hpY2hNZWRpYVR5cGVzOwotCVRpbWVWYWx1ZSB0aW1lOwotCUZpeGVkIHJhdGU7Ci0JVGltZVZhbHVlIGludGVyZXN0aW5nVGltZTsKLQlUaW1lVmFsdWUgaW50ZXJlc3RpbmdEdXJhdGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgaW50ZXJlc3RpbmdUaW1lRmxhZ3M7CisgICAgc2hvcnQgbnVtTWVkaWFUeXBlczsKKyAgICBPU1R5cGUgd2hpY2hNZWRpYVR5cGVzOworICAgIFRpbWVWYWx1ZSB0aW1lOworICAgIEZpeGVkIHJhdGU7CisgICAgVGltZVZhbHVlIGludGVyZXN0aW5nVGltZTsKKyAgICBUaW1lVmFsdWUgaW50ZXJlc3RpbmdEdXJhdGlvbjsKICNpZm5kZWYgR2V0TW92aWVOZXh0SW50ZXJlc3RpbmdUaW1lCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVOZXh0SW50ZXJlc3RpbmdUaW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZU5leHRJbnRlcmVzdGluZ1RpbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGhPJmxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbnRlcmVzdGluZ1RpbWVGbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgJm51bU1lZGlhVHlwZXMsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJndoaWNoTWVkaWFUeXBlcywKLQkgICAgICAgICAgICAgICAgICAgICAgJnRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmcmF0ZSkpCi0JCXJldHVybiBOVUxMOwotCUdldE1vdmllTmV4dEludGVyZXN0aW5nVGltZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmVzdGluZ1RpbWVGbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtTWVkaWFUeXBlcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJndoaWNoTWVkaWFUeXBlcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmludGVyZXN0aW5nVGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmludGVyZXN0aW5nRHVyYXRpb24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgaW50ZXJlc3RpbmdUaW1lLAotCSAgICAgICAgICAgICAgICAgICAgIGludGVyZXN0aW5nRHVyYXRpb24pOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoTyZsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW50ZXJlc3RpbmdUaW1lRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZudW1NZWRpYVR5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ3aGljaE1lZGlhVHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJnJhdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRNb3ZpZU5leHRJbnRlcmVzdGluZ1RpbWUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJlc3RpbmdUaW1lRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bU1lZGlhVHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3aGljaE1lZGlhVHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnRlcmVzdGluZ1RpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnRlcmVzdGluZ0R1cmF0aW9uKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZXN0aW5nVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmVzdGluZ0R1cmF0aW9uKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9BZGRNb3ZpZVJlc291cmNlKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCXNob3J0IHJlc1JlZk51bTsKLQlzaG9ydCByZXNJZDsKLQlTdHIyNTUgcmVzTmFtZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBzaG9ydCByZXNSZWZOdW07CisgICAgc2hvcnQgcmVzSWQ7CisgICAgU3RyMjU1IHJlc05hbWU7CiAjaWZuZGVmIEFkZE1vdmllUmVzb3VyY2UKLQlQeU1hY19QUkVDSEVDSyhBZGRNb3ZpZVJlc291cmNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBZGRNb3ZpZVJlc291cmNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZXNSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgcmVzTmFtZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBZGRNb3ZpZVJlc291cmNlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgcmVzUmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICZyZXNJZCwKLQkgICAgICAgICAgICAgICAgICAgICAgICByZXNOYW1lKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICByZXNJZCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc1JlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCByZXNOYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFkZE1vdmllUmVzb3VyY2UoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc0lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc05hbWUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlc0lkKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9VcGRhdGVNb3ZpZVJlc291cmNlKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCXNob3J0IHJlc1JlZk51bTsKLQlzaG9ydCByZXNJZDsKLQlTdHIyNTUgcmVzTmFtZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBzaG9ydCByZXNSZWZOdW07CisgICAgc2hvcnQgcmVzSWQ7CisgICAgU3RyMjU1IHJlc05hbWU7CiAjaWZuZGVmIFVwZGF0ZU1vdmllUmVzb3VyY2UKLQlQeU1hY19QUkVDSEVDSyhVcGRhdGVNb3ZpZVJlc291cmNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhVcGRhdGVNb3ZpZVJlc291cmNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVzUmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVzSWQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgcmVzTmFtZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBVcGRhdGVNb3ZpZVJlc291cmNlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzUmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc0lkLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc05hbWUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzUmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgcmVzTmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBVcGRhdGVNb3ZpZVJlc291cmNlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzUmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc0lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc05hbWUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX0FkZE1vdmllVG9TdG9yYWdlKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCURhdGFIYW5kbGVyIGRoOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIERhdGFIYW5kbGVyIGRoOwogI2lmbmRlZiBBZGRNb3ZpZVRvU3RvcmFnZQotCVB5TWFjX1BSRUNIRUNLKEFkZE1vdmllVG9TdG9yYWdlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBZGRNb3ZpZVRvU3RvcmFnZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEFkZE1vdmllVG9TdG9yYWdlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGRoKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFkZE1vdmllVG9TdG9yYWdlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRoKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9VcGRhdGVNb3ZpZUluU3RvcmFnZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlEYXRhSGFuZGxlciBkaDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBEYXRhSGFuZGxlciBkaDsKICNpZm5kZWYgVXBkYXRlTW92aWVJblN0b3JhZ2UKLQlQeU1hY19QUkVDSEVDSyhVcGRhdGVNb3ZpZUluU3RvcmFnZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVXBkYXRlTW92aWVJblN0b3JhZ2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBVcGRhdGVNb3ZpZUluU3RvcmFnZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBVcGRhdGVNb3ZpZUluU3RvcmFnZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfSGFzTW92aWVDaGFuZ2VkKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CiAjaWZuZGVmIEhhc01vdmllQ2hhbmdlZAotCVB5TWFjX1BSRUNIRUNLKEhhc01vdmllQ2hhbmdlZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSGFzTW92aWVDaGFuZ2VkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBIYXNNb3ZpZUNoYW5nZWQoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEhhc01vdmllQ2hhbmdlZChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9DbGVhck1vdmllQ2hhbmdlZChNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBDbGVhck1vdmllQ2hhbmdlZAotCVB5TWFjX1BSRUNIRUNLKENsZWFyTW92aWVDaGFuZ2VkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDbGVhck1vdmllQ2hhbmdlZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ2xlYXJNb3ZpZUNoYW5nZWQoX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDbGVhck1vdmllQ2hhbmdlZChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfU2V0TW92aWVEZWZhdWx0RGF0YVJlZihNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlIYW5kbGUgZGF0YVJlZjsKLQlPU1R5cGUgZGF0YVJlZlR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSGFuZGxlIGRhdGFSZWY7CisgICAgT1NUeXBlIGRhdGFSZWZUeXBlOwogI2lmbmRlZiBTZXRNb3ZpZURlZmF1bHREYXRhUmVmCi0JUHlNYWNfUFJFQ0hFQ0soU2V0TW92aWVEZWZhdWx0RGF0YVJlZik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TW92aWVEZWZhdWx0RGF0YVJlZik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkYXRhUmVmVHlwZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRNb3ZpZURlZmF1bHREYXRhUmVmKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmVHlwZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGF0YVJlZlR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0TW92aWVEZWZhdWx0RGF0YVJlZihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZlR5cGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX0dldE1vdmllRGVmYXVsdERhdGFSZWYoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSGFuZGxlIGRhdGFSZWY7Ci0JT1NUeXBlIGRhdGFSZWZUeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEhhbmRsZSBkYXRhUmVmOworICAgIE9TVHlwZSBkYXRhUmVmVHlwZTsKICNpZm5kZWYgR2V0TW92aWVEZWZhdWx0RGF0YVJlZgotCVB5TWFjX1BSRUNIRUNLKEdldE1vdmllRGVmYXVsdERhdGFSZWYpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1vdmllRGVmYXVsdERhdGFSZWYpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRNb3ZpZURlZmF1bHREYXRhUmVmKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFSZWZUeXBlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBkYXRhUmVmVHlwZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRNb3ZpZURlZmF1bHREYXRhUmVmKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFSZWZUeXBlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBkYXRhUmVmVHlwZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfU2V0TW92aWVDb2xvclRhYmxlKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUNUYWJIYW5kbGUgY3RhYjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBDVGFiSGFuZGxlIGN0YWI7CiAjaWZuZGVmIFNldE1vdmllQ29sb3JUYWJsZQotCVB5TWFjX1BSRUNIRUNLKFNldE1vdmllQ29sb3JUYWJsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TW92aWVDb2xvclRhYmxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZjdGFiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldE1vdmllQ29sb3JUYWJsZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgY3RhYik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmN0YWIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0TW92aWVDb2xvclRhYmxlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdGFiKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9HZXRNb3ZpZUNvbG9yVGFibGUoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JQ1RhYkhhbmRsZSBjdGFiOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIENUYWJIYW5kbGUgY3RhYjsKICNpZm5kZWYgR2V0TW92aWVDb2xvclRhYmxlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVDb2xvclRhYmxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZUNvbG9yVGFibGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRNb3ZpZUNvbG9yVGFibGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZjdGFiKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgY3RhYik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRNb3ZpZUNvbG9yVGFibGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjdGFiKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgY3RhYik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfRmxhdHRlbk1vdmllKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIG1vdmllRmxhdHRlbkZsYWdzOwotCUZTU3BlYyB0aGVGaWxlOwotCU9TVHlwZSBjcmVhdG9yOwotCVNjcmlwdENvZGUgc2NyaXB0VGFnOwotCWxvbmcgY3JlYXRlTW92aWVGaWxlRmxhZ3M7Ci0Jc2hvcnQgcmVzSWQ7Ci0JU3RyMjU1IHJlc05hbWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgbW92aWVGbGF0dGVuRmxhZ3M7CisgICAgRlNTcGVjIHRoZUZpbGU7CisgICAgT1NUeXBlIGNyZWF0b3I7CisgICAgU2NyaXB0Q29kZSBzY3JpcHRUYWc7CisgICAgbG9uZyBjcmVhdGVNb3ZpZUZpbGVGbGFnczsKKyAgICBzaG9ydCByZXNJZDsKKyAgICBTdHIyNTUgcmVzTmFtZTsKICNpZm5kZWYgRmxhdHRlbk1vdmllCi0JUHlNYWNfUFJFQ0hFQ0soRmxhdHRlbk1vdmllKTsKKyAgICBQeU1hY19QUkVDSEVDSyhGbGF0dGVuTW92aWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mTyZobE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vdmllRmxhdHRlbkZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZ0aGVGaWxlLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2NyaXB0VGFnLAotCSAgICAgICAgICAgICAgICAgICAgICAmY3JlYXRlTW92aWVGaWxlRmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgcmVzTmFtZSkpCi0JCXJldHVybiBOVUxMOwotCUZsYXR0ZW5Nb3ZpZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICBtb3ZpZUZsYXR0ZW5GbGFncywKLQkgICAgICAgICAgICAgJnRoZUZpbGUsCi0JICAgICAgICAgICAgIGNyZWF0b3IsCi0JICAgICAgICAgICAgIHNjcmlwdFRhZywKLQkgICAgICAgICAgICAgY3JlYXRlTW92aWVGaWxlRmxhZ3MsCi0JICAgICAgICAgICAgICZyZXNJZCwKLQkgICAgICAgICAgICAgcmVzTmFtZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIHJlc0lkKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyZPJmhsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbW92aWVGbGF0dGVuRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJnRoZUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzY3JpcHRUYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjcmVhdGVNb3ZpZUZpbGVGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCByZXNOYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgRmxhdHRlbk1vdmllKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgIG1vdmllRmxhdHRlbkZsYWdzLAorICAgICAgICAgICAgICAgICAmdGhlRmlsZSwKKyAgICAgICAgICAgICAgICAgY3JlYXRvciwKKyAgICAgICAgICAgICAgICAgc2NyaXB0VGFnLAorICAgICAgICAgICAgICAgICBjcmVhdGVNb3ZpZUZpbGVGbGFncywKKyAgICAgICAgICAgICAgICAgJnJlc0lkLAorICAgICAgICAgICAgICAgICByZXNOYW1lKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVzSWQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX0ZsYXR0ZW5Nb3ZpZURhdGEoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU1vdmllIF9ydjsKLQlsb25nIG1vdmllRmxhdHRlbkZsYWdzOwotCUZTU3BlYyB0aGVGaWxlOwotCU9TVHlwZSBjcmVhdG9yOwotCVNjcmlwdENvZGUgc2NyaXB0VGFnOwotCWxvbmcgY3JlYXRlTW92aWVGaWxlRmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE1vdmllIF9ydjsKKyAgICBsb25nIG1vdmllRmxhdHRlbkZsYWdzOworICAgIEZTU3BlYyB0aGVGaWxlOworICAgIE9TVHlwZSBjcmVhdG9yOworICAgIFNjcmlwdENvZGUgc2NyaXB0VGFnOworICAgIGxvbmcgY3JlYXRlTW92aWVGaWxlRmxhZ3M7CiAjaWZuZGVmIEZsYXR0ZW5Nb3ZpZURhdGEKLQlQeU1hY19QUkVDSEVDSyhGbGF0dGVuTW92aWVEYXRhKTsKKyAgICBQeU1hY19QUkVDSEVDSyhGbGF0dGVuTW92aWVEYXRhKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJk8maGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmbW92aWVGbGF0dGVuRmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJnRoZUZpbGUsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNyZWF0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgICZzY3JpcHRUYWcsCi0JICAgICAgICAgICAgICAgICAgICAgICZjcmVhdGVNb3ZpZUZpbGVGbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEZsYXR0ZW5Nb3ZpZURhdGEoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgIG1vdmllRmxhdHRlbkZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAgJnRoZUZpbGUsCi0JICAgICAgICAgICAgICAgICAgICAgICBjcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0VGFnLAotCSAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlTW92aWVGaWxlRmxhZ3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJk8maGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbW92aWVGbGF0dGVuRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJnRoZUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzY3JpcHRUYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjcmVhdGVNb3ZpZUZpbGVGbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEZsYXR0ZW5Nb3ZpZURhdGEoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdmllRmxhdHRlbkZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0VGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlTW92aWVGaWxlRmxhZ3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX0ZsYXR0ZW5Nb3ZpZURhdGFUb0RhdGFSZWYoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU1vdmllIF9ydjsKLQlsb25nIG1vdmllRmxhdHRlbkZsYWdzOwotCUhhbmRsZSBkYXRhUmVmOwotCU9TVHlwZSBkYXRhUmVmVHlwZTsKLQlPU1R5cGUgY3JlYXRvcjsKLQlTY3JpcHRDb2RlIHNjcmlwdFRhZzsKLQlsb25nIGNyZWF0ZU1vdmllRmlsZUZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBNb3ZpZSBfcnY7CisgICAgbG9uZyBtb3ZpZUZsYXR0ZW5GbGFnczsKKyAgICBIYW5kbGUgZGF0YVJlZjsKKyAgICBPU1R5cGUgZGF0YVJlZlR5cGU7CisgICAgT1NUeXBlIGNyZWF0b3I7CisgICAgU2NyaXB0Q29kZSBzY3JpcHRUYWc7CisgICAgbG9uZyBjcmVhdGVNb3ZpZUZpbGVGbGFnczsKICNpZm5kZWYgRmxhdHRlbk1vdmllRGF0YVRvRGF0YVJlZgotCVB5TWFjX1BSRUNIRUNLKEZsYXR0ZW5Nb3ZpZURhdGFUb0RhdGFSZWYpOworICAgIFB5TWFjX1BSRUNIRUNLKEZsYXR0ZW5Nb3ZpZURhdGFUb0RhdGFSZWYpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mTyZPJmhsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vdmllRmxhdHRlbkZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRhdGFSZWZUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2NyaXB0VGFnLAotCSAgICAgICAgICAgICAgICAgICAgICAmY3JlYXRlTW92aWVGaWxlRmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBGbGF0dGVuTW92aWVEYXRhVG9EYXRhUmVmKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3ZpZUZsYXR0ZW5GbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRUYWcsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVNb3ZpZUZpbGVGbGFncyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mTyZPJmhsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vdmllRmxhdHRlbkZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRhdGFSZWZUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjcmVhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2NyaXB0VGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY3JlYXRlTW92aWVGaWxlRmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBGbGF0dGVuTW92aWVEYXRhVG9EYXRhUmVmKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3ZpZUZsYXR0ZW5GbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRUYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVNb3ZpZUZpbGVGbGFncyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfTW92aWVTZWFyY2hUZXh0KE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVB0ciB0ZXh0OwotCWxvbmcgc2l6ZTsKLQlsb25nIHNlYXJjaEZsYWdzOwotCVRyYWNrIHNlYXJjaFRyYWNrOwotCVRpbWVWYWx1ZSBzZWFyY2hUaW1lOwotCWxvbmcgc2VhcmNoT2Zmc2V0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFB0ciB0ZXh0OworICAgIGxvbmcgc2l6ZTsKKyAgICBsb25nIHNlYXJjaEZsYWdzOworICAgIFRyYWNrIHNlYXJjaFRyYWNrOworICAgIFRpbWVWYWx1ZSBzZWFyY2hUaW1lOworICAgIGxvbmcgc2VhcmNoT2Zmc2V0OwogI2lmbmRlZiBNb3ZpZVNlYXJjaFRleHQKLQlQeU1hY19QUkVDSEVDSyhNb3ZpZVNlYXJjaFRleHQpOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmllU2VhcmNoVGV4dCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNpemUsCi0JICAgICAgICAgICAgICAgICAgICAgICZzZWFyY2hGbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBNb3ZpZVNlYXJjaFRleHQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgIHRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICBzaXplLAotCSAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoRmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAmc2VhcmNoVHJhY2ssCi0JICAgICAgICAgICAgICAgICAgICAgICAmc2VhcmNoVGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICZzZWFyY2hPZmZzZXQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mbGwiLAotCSAgICAgICAgICAgICAgICAgICAgIFRyYWNrT2JqX05ldywgc2VhcmNoVHJhY2ssCi0JICAgICAgICAgICAgICAgICAgICAgc2VhcmNoVGltZSwKLQkgICAgICAgICAgICAgICAgICAgICBzZWFyY2hPZmZzZXQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInNsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlYXJjaEZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IE1vdmllU2VhcmNoVGV4dChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZWFyY2hUcmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZWFyY2hUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlYXJjaE9mZnNldCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfTmV3LCBzZWFyY2hUcmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaE9mZnNldCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfR2V0UG9zdGVyQm94KE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZWN0IGJveFJlY3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlY3QgYm94UmVjdDsKICNpZm5kZWYgR2V0UG9zdGVyQm94Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0UG9zdGVyQm94KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRQb3N0ZXJCb3gpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUdldFBvc3RlckJveChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAmYm94UmVjdCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZib3hSZWN0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0UG9zdGVyQm94KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICZib3hSZWN0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmJveFJlY3QpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX1NldFBvc3RlckJveChNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVjdCBib3hSZWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IGJveFJlY3Q7CiAjaWZuZGVmIFNldFBvc3RlckJveAotCVB5TWFjX1BSRUNIRUNLKFNldFBvc3RlckJveCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0UG9zdGVyQm94KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJveFJlY3QpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRQb3N0ZXJCb3goX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgJmJveFJlY3QpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3hSZWN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0UG9zdGVyQm94KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICZib3hSZWN0KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfR2V0TW92aWVTZWdtZW50RGlzcGxheUJvdW5kc1JnbihNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIF9ydjsKLQlUaW1lVmFsdWUgdGltZTsKLQlUaW1lVmFsdWUgZHVyYXRpb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSBfcnY7CisgICAgVGltZVZhbHVlIHRpbWU7CisgICAgVGltZVZhbHVlIGR1cmF0aW9uOwogI2lmbmRlZiBHZXRNb3ZpZVNlZ21lbnREaXNwbGF5Qm91bmRzUmduCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVTZWdtZW50RGlzcGxheUJvdW5kc1Jnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVTZWdtZW50RGlzcGxheUJvdW5kc1Jnbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAmZHVyYXRpb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRNb3ZpZVNlZ21lbnREaXNwbGF5Qm91bmRzUmduKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZHVyYXRpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRNb3ZpZVNlZ21lbnREaXNwbGF5Qm91bmRzUmduKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9HZXRNb3ZpZVN0YXR1cyhNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlUcmFjayBmaXJzdFByb2JsZW1UcmFjazsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBUcmFjayBmaXJzdFByb2JsZW1UcmFjazsKICNpZm5kZWYgR2V0TW92aWVTdGF0dXMKLQlQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZVN0YXR1cyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVTdGF0dXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldE1vdmllU3RhdHVzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgJmZpcnN0UHJvYmxlbVRyYWNrKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfTmV3LCBmaXJzdFByb2JsZW1UcmFjayk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE1vdmllU3RhdHVzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgJmZpcnN0UHJvYmxlbVRyYWNrKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfTmV3LCBmaXJzdFByb2JsZW1UcmFjayk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfTmV3TW92aWVDb250cm9sbGVyKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlNb3ZpZUNvbnRyb2xsZXIgX3J2OwotCVJlY3QgbW92aWVSZWN0OwotCWxvbmcgc29tZUZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBNb3ZpZUNvbnRyb2xsZXIgX3J2OworICAgIFJlY3QgbW92aWVSZWN0OworICAgIGxvbmcgc29tZUZsYWdzOwogI2lmbmRlZiBOZXdNb3ZpZUNvbnRyb2xsZXIKLQlQeU1hY19QUkVDSEVDSyhOZXdNb3ZpZUNvbnRyb2xsZXIpOworICAgIFB5TWFjX1BSRUNIRUNLKE5ld01vdmllQ29udHJvbGxlcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmbW92aWVSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmc29tZUZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTmV3TW92aWVDb250cm9sbGVyKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZtb3ZpZVJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIHNvbWVGbGFncyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBNb3ZpZUN0bE9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJm1vdmllUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNvbWVGbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE5ld01vdmllQ29udHJvbGxlcihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbW92aWVSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb21lRmxhZ3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgTW92aWVDdGxPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX1B1dE1vdmllT25TY3JhcChNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlsb25nIG1vdmllU2NyYXBGbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBsb25nIG1vdmllU2NyYXBGbGFnczsKICNpZm5kZWYgUHV0TW92aWVPblNjcmFwCi0JUHlNYWNfUFJFQ0hFQ0soUHV0TW92aWVPblNjcmFwKTsKKyAgICBQeU1hY19QUkVDSEVDSyhQdXRNb3ZpZU9uU2NyYXApOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZtb3ZpZVNjcmFwRmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUHV0TW92aWVPblNjcmFwKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICBtb3ZpZVNjcmFwRmxhZ3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbW92aWVTY3JhcEZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFB1dE1vdmllT25TY3JhcChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbW92aWVTY3JhcEZsYWdzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9TZXRNb3ZpZVBsYXlIaW50cyhNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBmbGFnczsKLQlsb25nIGZsYWdzTWFzazsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgbG9uZyBmbGFnczsKKyAgICBsb25nIGZsYWdzTWFzazsKICNpZm5kZWYgU2V0TW92aWVQbGF5SGludHMKLQlQeU1hY19QUkVDSEVDSyhTZXRNb3ZpZVBsYXlIaW50cyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TW92aWVQbGF5SGludHMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFnc01hc2spKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRNb3ZpZVBsYXlIaW50cyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgIGZsYWdzLAotCSAgICAgICAgICAgICAgICAgIGZsYWdzTWFzayk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3NNYXNrKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0TW92aWVQbGF5SGludHMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICBmbGFnc01hc2spOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9HZXRNYXhMb2FkZWRUaW1lSW5Nb3ZpZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlUaW1lVmFsdWUgdGltZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBUaW1lVmFsdWUgdGltZTsKICNpZm5kZWYgR2V0TWF4TG9hZGVkVGltZUluTW92aWUKLQlQeU1hY19QUkVDSEVDSyhHZXRNYXhMb2FkZWRUaW1lSW5Nb3ZpZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TWF4TG9hZGVkVGltZUluTW92aWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRNYXhMb2FkZWRUaW1lSW5Nb3ZpZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGltZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgdGltZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRNYXhMb2FkZWRUaW1lSW5Nb3ZpZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGltZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgdGltZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfUVRNb3ZpZU5lZWRzVGltZVRhYmxlKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUJvb2xlYW4gbmVlZHNUaW1lVGFibGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgQm9vbGVhbiBuZWVkc1RpbWVUYWJsZTsKICNpZm5kZWYgUVRNb3ZpZU5lZWRzVGltZVRhYmxlCi0JUHlNYWNfUFJFQ0hFQ0soUVRNb3ZpZU5lZWRzVGltZVRhYmxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhRVE1vdmllTmVlZHNUaW1lVGFibGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBRVE1vdmllTmVlZHNUaW1lVGFibGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuZWVkc1RpbWVUYWJsZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgbmVlZHNUaW1lVGFibGUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUVRNb3ZpZU5lZWRzVGltZVRhYmxlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmVlZHNUaW1lVGFibGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRzVGltZVRhYmxlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9RVEdldERhdGFSZWZNYXhGaWxlT2Zmc2V0KE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCU9TVHlwZSBkYXRhUmVmVHlwZTsKLQlIYW5kbGUgZGF0YVJlZjsKLQlsb25nIG9mZnNldDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBPU1R5cGUgZGF0YVJlZlR5cGU7CisgICAgSGFuZGxlIGRhdGFSZWY7CisgICAgbG9uZyBvZmZzZXQ7CiAjaWZuZGVmIFFUR2V0RGF0YVJlZk1heEZpbGVPZmZzZXQKLQlQeU1hY19QUkVDSEVDSyhRVEdldERhdGFSZWZNYXhGaWxlT2Zmc2V0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhRVEdldERhdGFSZWZNYXhGaWxlT2Zmc2V0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkYXRhUmVmVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhUmVmKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFFUR2V0RGF0YVJlZk1heEZpbGVPZmZzZXQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvZmZzZXQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIG9mZnNldCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRhdGFSZWZUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFSZWYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUVRHZXREYXRhUmVmTWF4RmlsZU9mZnNldChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWZUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIE1vdmllT2JqX21ldGhvZHNbXSA9IHsKLQl7Ik1vdmllc1Rhc2siLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfTW92aWVzVGFzaywgMSwKLQkgUHlEb2NfU1RSKCIobG9uZyBtYXhNaWxsaVNlY1RvVXNlKSAtPiBOb25lIil9LAotCXsiUHJlcm9sbE1vdmllIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1ByZXJvbGxNb3ZpZSwgMSwKLQkgUHlEb2NfU1RSKCIoVGltZVZhbHVlIHRpbWUsIEZpeGVkIFJhdGUpIC0+IE5vbmUiKX0sCi0JeyJBYm9ydFByZVByZXJvbGxNb3ZpZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9BYm9ydFByZVByZXJvbGxNb3ZpZSwgMSwKLQkgUHlEb2NfU1RSKCIoT1NFcnIgZXJyKSAtPiBOb25lIil9LAotCXsiTG9hZE1vdmllSW50b1JhbSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9Mb2FkTW92aWVJbnRvUmFtLCAxLAotCSBQeURvY19TVFIoIihUaW1lVmFsdWUgdGltZSwgVGltZVZhbHVlIGR1cmF0aW9uLCBsb25nIGZsYWdzKSAtPiBOb25lIil9LAotCXsiU2V0TW92aWVBY3RpdmUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfU2V0TW92aWVBY3RpdmUsIDEsCi0JIFB5RG9jX1NUUigiKEJvb2xlYW4gYWN0aXZlKSAtPiBOb25lIil9LAotCXsiR2V0TW92aWVBY3RpdmUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVBY3RpdmUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IlN0YXJ0TW92aWUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfU3RhcnRNb3ZpZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiU3RvcE1vdmllIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1N0b3BNb3ZpZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiR29Ub0JlZ2lubmluZ09mTW92aWUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR29Ub0JlZ2lubmluZ09mTW92aWUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkdvVG9FbmRPZk1vdmllIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0dvVG9FbmRPZk1vdmllLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJJc01vdmllRG9uZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9Jc01vdmllRG9uZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiR2V0TW92aWVQcmV2aWV3TW9kZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZVByZXZpZXdNb2RlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJTZXRNb3ZpZVByZXZpZXdNb2RlIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1NldE1vdmllUHJldmlld01vZGUsIDEsCi0JIFB5RG9jX1NUUigiKEJvb2xlYW4gdXNlUHJldmlldykgLT4gTm9uZSIpfSwKLQl7IlNob3dNb3ZpZVBvc3RlciIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TaG93TW92aWVQb3N0ZXIsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkdldE1vdmllVGltZUJhc2UiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVUaW1lQmFzZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVGltZUJhc2UgX3J2KSIpfSwKLQl7IlNldE1vdmllTWFzdGVyVGltZUJhc2UiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfU2V0TW92aWVNYXN0ZXJUaW1lQmFzZSwgMSwKLQkgUHlEb2NfU1RSKCIoVGltZUJhc2UgdGIsIFRpbWVSZWNvcmQgc2xhdmVaZXJvKSAtPiBOb25lIil9LAotCXsiU2V0TW92aWVNYXN0ZXJDbG9jayIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TZXRNb3ZpZU1hc3RlckNsb2NrLCAxLAotCSBQeURvY19TVFIoIihDb21wb25lbnQgY2xvY2tNZWlzdGVyLCBUaW1lUmVjb3JkIHNsYXZlWmVybykgLT4gTm9uZSIpfSwKLQl7IkNob29zZU1vdmllQ2xvY2siLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfQ2hvb3NlTW92aWVDbG9jaywgMSwKLQkgUHlEb2NfU1RSKCIobG9uZyBmbGFncykgLT4gTm9uZSIpfSwKLQl7IkdldE1vdmllR1dvcmxkIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0dldE1vdmllR1dvcmxkLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDR3JhZlB0ciBwb3J0LCBHREhhbmRsZSBnZGgpIil9LAotCXsiU2V0TW92aWVHV29ybGQiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfU2V0TW92aWVHV29ybGQsIDEsCi0JIFB5RG9jX1NUUigiKENHcmFmUHRyIHBvcnQsIEdESGFuZGxlIGdkaCkgLT4gTm9uZSIpfSwKLQl7IkdldE1vdmllTmF0dXJhbEJvdW5kc1JlY3QiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVOYXR1cmFsQm91bmRzUmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoUmVjdCBuYXR1cmFsQm91bmRzKSIpfSwKLQl7IkdldE5leHRUcmFja0ZvckNvbXBvc2l0aW5nIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0dldE5leHRUcmFja0ZvckNvbXBvc2l0aW5nLCAxLAotCSBQeURvY19TVFIoIihUcmFjayB0aGVUcmFjaykgLT4gKFRyYWNrIF9ydikiKX0sCi0JeyJHZXRQcmV2VHJhY2tGb3JDb21wb3NpdGluZyIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRQcmV2VHJhY2tGb3JDb21wb3NpdGluZywgMSwKLQkgUHlEb2NfU1RSKCIoVHJhY2sgdGhlVHJhY2spIC0+IChUcmFjayBfcnYpIil9LAotCXsiR2V0TW92aWVQaWN0IiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0dldE1vdmllUGljdCwgMSwKLQkgUHlEb2NfU1RSKCIoVGltZVZhbHVlIHRpbWUpIC0+IChQaWNIYW5kbGUgX3J2KSIpfSwKLQl7IkdldE1vdmllUG9zdGVyUGljdCIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZVBvc3RlclBpY3QsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFBpY0hhbmRsZSBfcnYpIil9LAotCXsiVXBkYXRlTW92aWUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfVXBkYXRlTW92aWUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkludmFsaWRhdGVNb3ZpZVJlZ2lvbiIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9JbnZhbGlkYXRlTW92aWVSZWdpb24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSBpbnZhbGlkUmduKSAtPiBOb25lIil9LAotCXsiR2V0TW92aWVCb3giLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVCb3gsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFJlY3QgYm94UmVjdCkiKX0sCi0JeyJTZXRNb3ZpZUJveCIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TZXRNb3ZpZUJveCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCBib3hSZWN0KSAtPiBOb25lIil9LAotCXsiR2V0TW92aWVEaXNwbGF5Q2xpcFJnbiIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZURpc3BsYXlDbGlwUmduLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChSZ25IYW5kbGUgX3J2KSIpfSwKLQl7IlNldE1vdmllRGlzcGxheUNsaXBSZ24iLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfU2V0TW92aWVEaXNwbGF5Q2xpcFJnbiwgMSwKLQkgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHRoZUNsaXApIC0+IE5vbmUiKX0sCi0JeyJHZXRNb3ZpZUNsaXBSZ24iLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVDbGlwUmduLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChSZ25IYW5kbGUgX3J2KSIpfSwKLQl7IlNldE1vdmllQ2xpcFJnbiIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TZXRNb3ZpZUNsaXBSZ24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSB0aGVDbGlwKSAtPiBOb25lIil9LAotCXsiR2V0TW92aWVEaXNwbGF5Qm91bmRzUmduIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0dldE1vdmllRGlzcGxheUJvdW5kc1JnbiwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoUmduSGFuZGxlIF9ydikiKX0sCi0JeyJHZXRNb3ZpZUJvdW5kc1JnbiIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZUJvdW5kc1JnbiwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoUmduSGFuZGxlIF9ydikiKX0sCi0JeyJTZXRNb3ZpZVZpZGVvT3V0cHV0IiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1NldE1vdmllVmlkZW9PdXRwdXQsIDEsCi0JIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIHZvdXQpIC0+IE5vbmUiKX0sCi0JeyJQdXRNb3ZpZUludG9IYW5kbGUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfUHV0TW92aWVJbnRvSGFuZGxlLCAxLAotCSBQeURvY19TVFIoIihIYW5kbGUgcHVibGljTW92aWUpIC0+IE5vbmUiKX0sCi0JeyJQdXRNb3ZpZUludG9EYXRhRm9yayIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9QdXRNb3ZpZUludG9EYXRhRm9yaywgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgZlJlZk51bSwgbG9uZyBvZmZzZXQsIGxvbmcgbWF4U2l6ZSkgLT4gTm9uZSIpfSwKLQl7IlB1dE1vdmllSW50b0RhdGFGb3JrNjQiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfUHV0TW92aWVJbnRvRGF0YUZvcms2NCwgMSwKLQkgUHlEb2NfU1RSKCIobG9uZyBmUmVmTnVtLCB3aWRlIG9mZnNldCwgdW5zaWduZWQgbG9uZyBtYXhTaXplKSAtPiBOb25lIil9LAotCXsiUHV0TW92aWVJbnRvU3RvcmFnZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9QdXRNb3ZpZUludG9TdG9yYWdlLCAxLAotCSBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgd2lkZSBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgbWF4U2l6ZSkgLT4gTm9uZSIpfSwKLQl7IlB1dE1vdmllRm9yRGF0YVJlZkludG9IYW5kbGUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfUHV0TW92aWVGb3JEYXRhUmVmSW50b0hhbmRsZSwgMSwKLQkgUHlEb2NfU1RSKCIoSGFuZGxlIGRhdGFSZWYsIE9TVHlwZSBkYXRhUmVmVHlwZSwgSGFuZGxlIHB1YmxpY01vdmllKSAtPiBOb25lIil9LAotCXsiR2V0TW92aWVDcmVhdGlvblRpbWUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVDcmVhdGlvblRpbWUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKHVuc2lnbmVkIGxvbmcgX3J2KSIpfSwKLQl7IkdldE1vdmllTW9kaWZpY2F0aW9uVGltZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZU1vZGlmaWNhdGlvblRpbWUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKHVuc2lnbmVkIGxvbmcgX3J2KSIpfSwKLQl7IkdldE1vdmllVGltZVNjYWxlIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0dldE1vdmllVGltZVNjYWxlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChUaW1lU2NhbGUgX3J2KSIpfSwKLQl7IlNldE1vdmllVGltZVNjYWxlIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1NldE1vdmllVGltZVNjYWxlLCAxLAotCSBQeURvY19TVFIoIihUaW1lU2NhbGUgdGltZVNjYWxlKSAtPiBOb25lIil9LAotCXsiR2V0TW92aWVEdXJhdGlvbiIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZUR1cmF0aW9uLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChUaW1lVmFsdWUgX3J2KSIpfSwKLQl7IkdldE1vdmllUmF0ZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZVJhdGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEZpeGVkIF9ydikiKX0sCi0JeyJTZXRNb3ZpZVJhdGUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfU2V0TW92aWVSYXRlLCAxLAotCSBQeURvY19TVFIoIihGaXhlZCByYXRlKSAtPiBOb25lIil9LAotCXsiR2V0TW92aWVQcmVmZXJyZWRSYXRlIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0dldE1vdmllUHJlZmVycmVkUmF0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoRml4ZWQgX3J2KSIpfSwKLQl7IlNldE1vdmllUHJlZmVycmVkUmF0ZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TZXRNb3ZpZVByZWZlcnJlZFJhdGUsIDEsCi0JIFB5RG9jX1NUUigiKEZpeGVkIHJhdGUpIC0+IE5vbmUiKX0sCi0JeyJHZXRNb3ZpZVByZWZlcnJlZFZvbHVtZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZVByZWZlcnJlZFZvbHVtZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgX3J2KSIpfSwKLQl7IlNldE1vdmllUHJlZmVycmVkVm9sdW1lIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1NldE1vdmllUHJlZmVycmVkVm9sdW1lLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCB2b2x1bWUpIC0+IE5vbmUiKX0sCi0JeyJHZXRNb3ZpZVZvbHVtZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZVZvbHVtZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgX3J2KSIpfSwKLQl7IlNldE1vdmllVm9sdW1lIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1NldE1vdmllVm9sdW1lLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCB2b2x1bWUpIC0+IE5vbmUiKX0sCi0JeyJHZXRNb3ZpZVByZXZpZXdUaW1lIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0dldE1vdmllUHJldmlld1RpbWUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFRpbWVWYWx1ZSBwcmV2aWV3VGltZSwgVGltZVZhbHVlIHByZXZpZXdEdXJhdGlvbikiKX0sCi0JeyJTZXRNb3ZpZVByZXZpZXdUaW1lIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1NldE1vdmllUHJldmlld1RpbWUsIDEsCi0JIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSBwcmV2aWV3VGltZSwgVGltZVZhbHVlIHByZXZpZXdEdXJhdGlvbikgLT4gTm9uZSIpfSwKLQl7IkdldE1vdmllUG9zdGVyVGltZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZVBvc3RlclRpbWUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFRpbWVWYWx1ZSBfcnYpIil9LAotCXsiU2V0TW92aWVQb3N0ZXJUaW1lIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1NldE1vdmllUG9zdGVyVGltZSwgMSwKLQkgUHlEb2NfU1RSKCIoVGltZVZhbHVlIHBvc3RlclRpbWUpIC0+IE5vbmUiKX0sCi0JeyJHZXRNb3ZpZVNlbGVjdGlvbiIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZVNlbGVjdGlvbiwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVGltZVZhbHVlIHNlbGVjdGlvblRpbWUsIFRpbWVWYWx1ZSBzZWxlY3Rpb25EdXJhdGlvbikiKX0sCi0JeyJTZXRNb3ZpZVNlbGVjdGlvbiIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TZXRNb3ZpZVNlbGVjdGlvbiwgMSwKLQkgUHlEb2NfU1RSKCIoVGltZVZhbHVlIHNlbGVjdGlvblRpbWUsIFRpbWVWYWx1ZSBzZWxlY3Rpb25EdXJhdGlvbikgLT4gTm9uZSIpfSwKLQl7IlNldE1vdmllQWN0aXZlU2VnbWVudCIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TZXRNb3ZpZUFjdGl2ZVNlZ21lbnQsIDEsCi0JIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSBzdGFydFRpbWUsIFRpbWVWYWx1ZSBkdXJhdGlvbikgLT4gTm9uZSIpfSwKLQl7IkdldE1vdmllQWN0aXZlU2VnbWVudCIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZUFjdGl2ZVNlZ21lbnQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFRpbWVWYWx1ZSBzdGFydFRpbWUsIFRpbWVWYWx1ZSBkdXJhdGlvbikiKX0sCi0JeyJHZXRNb3ZpZVRpbWUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVUaW1lLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChUaW1lVmFsdWUgX3J2LCBUaW1lUmVjb3JkIGN1cnJlbnRUaW1lKSIpfSwKLQl7IlNldE1vdmllVGltZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TZXRNb3ZpZVRpbWUsIDEsCi0JIFB5RG9jX1NUUigiKFRpbWVSZWNvcmQgbmV3dGltZSkgLT4gTm9uZSIpfSwKLQl7IlNldE1vdmllVGltZVZhbHVlIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1NldE1vdmllVGltZVZhbHVlLCAxLAotCSBQeURvY19TVFIoIihUaW1lVmFsdWUgbmV3dGltZSkgLT4gTm9uZSIpfSwKLQl7IkdldE1vdmllVXNlckRhdGEiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVVc2VyRGF0YSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVXNlckRhdGEgX3J2KSIpfSwKLQl7IkdldE1vdmllVHJhY2tDb3VudCIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZVRyYWNrQ291bnQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKGxvbmcgX3J2KSIpfSwKLQl7IkdldE1vdmllVHJhY2siLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVUcmFjaywgMSwKLQkgUHlEb2NfU1RSKCIobG9uZyB0cmFja0lEKSAtPiAoVHJhY2sgX3J2KSIpfSwKLQl7IkdldE1vdmllSW5kVHJhY2siLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVJbmRUcmFjaywgMSwKLQkgUHlEb2NfU1RSKCIobG9uZyBpbmRleCkgLT4gKFRyYWNrIF9ydikiKX0sCi0JeyJHZXRNb3ZpZUluZFRyYWNrVHlwZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZUluZFRyYWNrVHlwZSwgMSwKLQkgUHlEb2NfU1RSKCIobG9uZyBpbmRleCwgT1NUeXBlIHRyYWNrVHlwZSwgbG9uZyBmbGFncykgLT4gKFRyYWNrIF9ydikiKX0sCi0JeyJOZXdNb3ZpZVRyYWNrIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX05ld01vdmllVHJhY2ssIDEsCi0JIFB5RG9jX1NUUigiKEZpeGVkIHdpZHRoLCBGaXhlZCBoZWlnaHQsIHNob3J0IHRyYWNrVm9sdW1lKSAtPiAoVHJhY2sgX3J2KSIpfSwKLQl7IlNldEF1dG9UcmFja0FsdGVybmF0ZXNFbmFibGVkIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1NldEF1dG9UcmFja0FsdGVybmF0ZXNFbmFibGVkLCAxLAotCSBQeURvY19TVFIoIihCb29sZWFuIGVuYWJsZSkgLT4gTm9uZSIpfSwKLQl7IlNlbGVjdE1vdmllQWx0ZXJuYXRlcyIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TZWxlY3RNb3ZpZUFsdGVybmF0ZXMsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7Ikluc2VydE1vdmllU2VnbWVudCIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9JbnNlcnRNb3ZpZVNlZ21lbnQsIDEsCi0JIFB5RG9jX1NUUigiKE1vdmllIGRzdE1vdmllLCBUaW1lVmFsdWUgc3JjSW4sIFRpbWVWYWx1ZSBzcmNEdXJhdGlvbiwgVGltZVZhbHVlIGRzdEluKSAtPiBOb25lIil9LAotCXsiSW5zZXJ0RW1wdHlNb3ZpZVNlZ21lbnQiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfSW5zZXJ0RW1wdHlNb3ZpZVNlZ21lbnQsIDEsCi0JIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSBkc3RJbiwgVGltZVZhbHVlIGRzdER1cmF0aW9uKSAtPiBOb25lIil9LAotCXsiRGVsZXRlTW92aWVTZWdtZW50IiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0RlbGV0ZU1vdmllU2VnbWVudCwgMSwKLQkgUHlEb2NfU1RSKCIoVGltZVZhbHVlIHN0YXJ0VGltZSwgVGltZVZhbHVlIGR1cmF0aW9uKSAtPiBOb25lIil9LAotCXsiU2NhbGVNb3ZpZVNlZ21lbnQiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfU2NhbGVNb3ZpZVNlZ21lbnQsIDEsCi0JIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSBzdGFydFRpbWUsIFRpbWVWYWx1ZSBvbGREdXJhdGlvbiwgVGltZVZhbHVlIG5ld0R1cmF0aW9uKSAtPiBOb25lIil9LAotCXsiQ3V0TW92aWVTZWxlY3Rpb24iLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfQ3V0TW92aWVTZWxlY3Rpb24sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKE1vdmllIF9ydikiKX0sCi0JeyJDb3B5TW92aWVTZWxlY3Rpb24iLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfQ29weU1vdmllU2VsZWN0aW9uLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChNb3ZpZSBfcnYpIil9LAotCXsiUGFzdGVNb3ZpZVNlbGVjdGlvbiIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9QYXN0ZU1vdmllU2VsZWN0aW9uLCAxLAotCSBQeURvY19TVFIoIihNb3ZpZSBzcmMpIC0+IE5vbmUiKX0sCi0JeyJBZGRNb3ZpZVNlbGVjdGlvbiIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9BZGRNb3ZpZVNlbGVjdGlvbiwgMSwKLQkgUHlEb2NfU1RSKCIoTW92aWUgc3JjKSAtPiBOb25lIil9LAotCXsiQ2xlYXJNb3ZpZVNlbGVjdGlvbiIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9DbGVhck1vdmllU2VsZWN0aW9uLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJQdXRNb3ZpZUludG9UeXBlZEhhbmRsZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9QdXRNb3ZpZUludG9UeXBlZEhhbmRsZSwgMSwKLQkgUHlEb2NfU1RSKCIoVHJhY2sgdGFyZ2V0VHJhY2ssIE9TVHlwZSBoYW5kbGVUeXBlLCBIYW5kbGUgcHVibGljTW92aWUsIFRpbWVWYWx1ZSBzdGFydCwgVGltZVZhbHVlIGR1ciwgbG9uZyBmbGFncywgQ29tcG9uZW50SW5zdGFuY2UgdXNlckNvbXApIC0+IE5vbmUiKX0sCi0JeyJDb3B5TW92aWVTZXR0aW5ncyIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9Db3B5TW92aWVTZXR0aW5ncywgMSwKLQkgUHlEb2NfU1RSKCIoTW92aWUgZHN0TW92aWUpIC0+IE5vbmUiKX0sCi0JeyJDb252ZXJ0TW92aWVUb0ZpbGUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfQ29udmVydE1vdmllVG9GaWxlLCAxLAotCSBQeURvY19TVFIoIihUcmFjayBvbmx5VHJhY2ssIEZTU3BlYyBvdXRwdXRGaWxlLCBPU1R5cGUgZmlsZVR5cGUsIE9TVHlwZSBjcmVhdG9yLCBTY3JpcHRDb2RlIHNjcmlwdFRhZywgbG9uZyBmbGFncywgQ29tcG9uZW50SW5zdGFuY2UgdXNlckNvbXApIC0+IChzaG9ydCByZXNJRCkiKX0sCi0JeyJHZXRNb3ZpZURhdGFTaXplIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0dldE1vdmllRGF0YVNpemUsIDEsCi0JIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSBzdGFydFRpbWUsIFRpbWVWYWx1ZSBkdXJhdGlvbikgLT4gKGxvbmcgX3J2KSIpfSwKLQl7IkdldE1vdmllRGF0YVNpemU2NCIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZURhdGFTaXplNjQsIDEsCi0JIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSBzdGFydFRpbWUsIFRpbWVWYWx1ZSBkdXJhdGlvbikgLT4gKHdpZGUgZGF0YVNpemUpIil9LAotCXsiUHRJbk1vdmllIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1B0SW5Nb3ZpZSwgMSwKLQkgUHlEb2NfU1RSKCIoUG9pbnQgcHQpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJTZXRNb3ZpZUxhbmd1YWdlIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1NldE1vdmllTGFuZ3VhZ2UsIDEsCi0JIFB5RG9jX1NUUigiKGxvbmcgbGFuZ3VhZ2UpIC0+IE5vbmUiKX0sCi0JeyJDb3B5TW92aWVVc2VyRGF0YSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9Db3B5TW92aWVVc2VyRGF0YSwgMSwKLQkgUHlEb2NfU1RSKCIoTW92aWUgZHN0TW92aWUsIE9TVHlwZSBjb3B5UnVsZSkgLT4gTm9uZSIpfSwKLQl7IkdldE1vdmllTmV4dEludGVyZXN0aW5nVGltZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZU5leHRJbnRlcmVzdGluZ1RpbWUsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGludGVyZXN0aW5nVGltZUZsYWdzLCBzaG9ydCBudW1NZWRpYVR5cGVzLCBPU1R5cGUgd2hpY2hNZWRpYVR5cGVzLCBUaW1lVmFsdWUgdGltZSwgRml4ZWQgcmF0ZSkgLT4gKFRpbWVWYWx1ZSBpbnRlcmVzdGluZ1RpbWUsIFRpbWVWYWx1ZSBpbnRlcmVzdGluZ0R1cmF0aW9uKSIpfSwKLQl7IkFkZE1vdmllUmVzb3VyY2UiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfQWRkTW92aWVSZXNvdXJjZSwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgcmVzUmVmTnVtLCBTdHIyNTUgcmVzTmFtZSkgLT4gKHNob3J0IHJlc0lkKSIpfSwKLQl7IlVwZGF0ZU1vdmllUmVzb3VyY2UiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfVXBkYXRlTW92aWVSZXNvdXJjZSwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgcmVzUmVmTnVtLCBzaG9ydCByZXNJZCwgU3RyMjU1IHJlc05hbWUpIC0+IE5vbmUiKX0sCi0JeyJBZGRNb3ZpZVRvU3RvcmFnZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9BZGRNb3ZpZVRvU3RvcmFnZSwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgpIC0+IE5vbmUiKX0sCi0JeyJVcGRhdGVNb3ZpZUluU3RvcmFnZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9VcGRhdGVNb3ZpZUluU3RvcmFnZSwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgpIC0+IE5vbmUiKX0sCi0JeyJIYXNNb3ZpZUNoYW5nZWQiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfSGFzTW92aWVDaGFuZ2VkLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJDbGVhck1vdmllQ2hhbmdlZCIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9DbGVhck1vdmllQ2hhbmdlZCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiU2V0TW92aWVEZWZhdWx0RGF0YVJlZiIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TZXRNb3ZpZURlZmF1bHREYXRhUmVmLCAxLAotCSBQeURvY19TVFIoIihIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlKSAtPiBOb25lIil9LAotCXsiR2V0TW92aWVEZWZhdWx0RGF0YVJlZiIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZURlZmF1bHREYXRhUmVmLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlKSIpfSwKLQl7IlNldE1vdmllQ29sb3JUYWJsZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TZXRNb3ZpZUNvbG9yVGFibGUsIDEsCi0JIFB5RG9jX1NUUigiKENUYWJIYW5kbGUgY3RhYikgLT4gTm9uZSIpfSwKLQl7IkdldE1vdmllQ29sb3JUYWJsZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZUNvbG9yVGFibGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENUYWJIYW5kbGUgY3RhYikiKX0sCi0JeyJGbGF0dGVuTW92aWUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfRmxhdHRlbk1vdmllLCAxLAotCSBQeURvY19TVFIoIihsb25nIG1vdmllRmxhdHRlbkZsYWdzLCBGU1NwZWMgdGhlRmlsZSwgT1NUeXBlIGNyZWF0b3IsIFNjcmlwdENvZGUgc2NyaXB0VGFnLCBsb25nIGNyZWF0ZU1vdmllRmlsZUZsYWdzLCBTdHIyNTUgcmVzTmFtZSkgLT4gKHNob3J0IHJlc0lkKSIpfSwKLQl7IkZsYXR0ZW5Nb3ZpZURhdGEiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfRmxhdHRlbk1vdmllRGF0YSwgMSwKLQkgUHlEb2NfU1RSKCIobG9uZyBtb3ZpZUZsYXR0ZW5GbGFncywgRlNTcGVjIHRoZUZpbGUsIE9TVHlwZSBjcmVhdG9yLCBTY3JpcHRDb2RlIHNjcmlwdFRhZywgbG9uZyBjcmVhdGVNb3ZpZUZpbGVGbGFncykgLT4gKE1vdmllIF9ydikiKX0sCi0JeyJGbGF0dGVuTW92aWVEYXRhVG9EYXRhUmVmIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0ZsYXR0ZW5Nb3ZpZURhdGFUb0RhdGFSZWYsIDEsCi0JIFB5RG9jX1NUUigiKGxvbmcgbW92aWVGbGF0dGVuRmxhZ3MsIEhhbmRsZSBkYXRhUmVmLCBPU1R5cGUgZGF0YVJlZlR5cGUsIE9TVHlwZSBjcmVhdG9yLCBTY3JpcHRDb2RlIHNjcmlwdFRhZywgbG9uZyBjcmVhdGVNb3ZpZUZpbGVGbGFncykgLT4gKE1vdmllIF9ydikiKX0sCi0JeyJNb3ZpZVNlYXJjaFRleHQiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfTW92aWVTZWFyY2hUZXh0LCAxLAotCSBQeURvY19TVFIoIihQdHIgdGV4dCwgbG9uZyBzaXplLCBsb25nIHNlYXJjaEZsYWdzKSAtPiAoVHJhY2sgc2VhcmNoVHJhY2ssIFRpbWVWYWx1ZSBzZWFyY2hUaW1lLCBsb25nIHNlYXJjaE9mZnNldCkiKX0sCi0JeyJHZXRQb3N0ZXJCb3giLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0UG9zdGVyQm94LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChSZWN0IGJveFJlY3QpIil9LAotCXsiU2V0UG9zdGVyQm94IiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1NldFBvc3RlckJveCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCBib3hSZWN0KSAtPiBOb25lIil9LAotCXsiR2V0TW92aWVTZWdtZW50RGlzcGxheUJvdW5kc1JnbiIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZVNlZ21lbnREaXNwbGF5Qm91bmRzUmduLCAxLAotCSBQeURvY19TVFIoIihUaW1lVmFsdWUgdGltZSwgVGltZVZhbHVlIGR1cmF0aW9uKSAtPiAoUmduSGFuZGxlIF9ydikiKX0sCi0JeyJHZXRNb3ZpZVN0YXR1cyIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZVN0YXR1cywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgVHJhY2sgZmlyc3RQcm9ibGVtVHJhY2spIil9LAotCXsiTmV3TW92aWVDb250cm9sbGVyIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX05ld01vdmllQ29udHJvbGxlciwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCBtb3ZpZVJlY3QsIGxvbmcgc29tZUZsYWdzKSAtPiAoTW92aWVDb250cm9sbGVyIF9ydikiKX0sCi0JeyJQdXRNb3ZpZU9uU2NyYXAiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfUHV0TW92aWVPblNjcmFwLCAxLAotCSBQeURvY19TVFIoIihsb25nIG1vdmllU2NyYXBGbGFncykgLT4gTm9uZSIpfSwKLQl7IlNldE1vdmllUGxheUhpbnRzIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1NldE1vdmllUGxheUhpbnRzLCAxLAotCSBQeURvY19TVFIoIihsb25nIGZsYWdzLCBsb25nIGZsYWdzTWFzaykgLT4gTm9uZSIpfSwKLQl7IkdldE1heExvYWRlZFRpbWVJbk1vdmllIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0dldE1heExvYWRlZFRpbWVJbk1vdmllLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChUaW1lVmFsdWUgdGltZSkiKX0sCi0JeyJRVE1vdmllTmVlZHNUaW1lVGFibGUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfUVRNb3ZpZU5lZWRzVGltZVRhYmxlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIG5lZWRzVGltZVRhYmxlKSIpfSwKLQl7IlFUR2V0RGF0YVJlZk1heEZpbGVPZmZzZXQiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfUVRHZXREYXRhUmVmTWF4RmlsZU9mZnNldCwgMSwKLQkgUHlEb2NfU1RSKCIoT1NUeXBlIGRhdGFSZWZUeXBlLCBIYW5kbGUgZGF0YVJlZikgLT4gKGxvbmcgb2Zmc2V0KSIpfSwKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7Ik1vdmllc1Rhc2siLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfTW92aWVzVGFzaywgMSwKKyAgICAgUHlEb2NfU1RSKCIobG9uZyBtYXhNaWxsaVNlY1RvVXNlKSAtPiBOb25lIil9LAorICAgIHsiUHJlcm9sbE1vdmllIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1ByZXJvbGxNb3ZpZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGltZVZhbHVlIHRpbWUsIEZpeGVkIFJhdGUpIC0+IE5vbmUiKX0sCisgICAgeyJBYm9ydFByZVByZXJvbGxNb3ZpZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9BYm9ydFByZVByZXJvbGxNb3ZpZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoT1NFcnIgZXJyKSAtPiBOb25lIil9LAorICAgIHsiTG9hZE1vdmllSW50b1JhbSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9Mb2FkTW92aWVJbnRvUmFtLCAxLAorICAgICBQeURvY19TVFIoIihUaW1lVmFsdWUgdGltZSwgVGltZVZhbHVlIGR1cmF0aW9uLCBsb25nIGZsYWdzKSAtPiBOb25lIil9LAorICAgIHsiU2V0TW92aWVBY3RpdmUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfU2V0TW92aWVBY3RpdmUsIDEsCisgICAgIFB5RG9jX1NUUigiKEJvb2xlYW4gYWN0aXZlKSAtPiBOb25lIil9LAorICAgIHsiR2V0TW92aWVBY3RpdmUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVBY3RpdmUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IlN0YXJ0TW92aWUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfU3RhcnRNb3ZpZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiU3RvcE1vdmllIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1N0b3BNb3ZpZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiR29Ub0JlZ2lubmluZ09mTW92aWUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR29Ub0JlZ2lubmluZ09mTW92aWUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkdvVG9FbmRPZk1vdmllIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0dvVG9FbmRPZk1vdmllLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJJc01vdmllRG9uZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9Jc01vdmllRG9uZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiR2V0TW92aWVQcmV2aWV3TW9kZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZVByZXZpZXdNb2RlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJTZXRNb3ZpZVByZXZpZXdNb2RlIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1NldE1vdmllUHJldmlld01vZGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEJvb2xlYW4gdXNlUHJldmlldykgLT4gTm9uZSIpfSwKKyAgICB7IlNob3dNb3ZpZVBvc3RlciIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TaG93TW92aWVQb3N0ZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldE1vdmllVGltZUJhc2UiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVUaW1lQmFzZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVGltZUJhc2UgX3J2KSIpfSwKKyAgICB7IlNldE1vdmllTWFzdGVyVGltZUJhc2UiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfU2V0TW92aWVNYXN0ZXJUaW1lQmFzZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGltZUJhc2UgdGIsIFRpbWVSZWNvcmQgc2xhdmVaZXJvKSAtPiBOb25lIil9LAorICAgIHsiU2V0TW92aWVNYXN0ZXJDbG9jayIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TZXRNb3ZpZU1hc3RlckNsb2NrLCAxLAorICAgICBQeURvY19TVFIoIihDb21wb25lbnQgY2xvY2tNZWlzdGVyLCBUaW1lUmVjb3JkIHNsYXZlWmVybykgLT4gTm9uZSIpfSwKKyAgICB7IkNob29zZU1vdmllQ2xvY2siLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfQ2hvb3NlTW92aWVDbG9jaywgMSwKKyAgICAgUHlEb2NfU1RSKCIobG9uZyBmbGFncykgLT4gTm9uZSIpfSwKKyAgICB7IkdldE1vdmllR1dvcmxkIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0dldE1vdmllR1dvcmxkLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDR3JhZlB0ciBwb3J0LCBHREhhbmRsZSBnZGgpIil9LAorICAgIHsiU2V0TW92aWVHV29ybGQiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfU2V0TW92aWVHV29ybGQsIDEsCisgICAgIFB5RG9jX1NUUigiKENHcmFmUHRyIHBvcnQsIEdESGFuZGxlIGdkaCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldE1vdmllTmF0dXJhbEJvdW5kc1JlY3QiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVOYXR1cmFsQm91bmRzUmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoUmVjdCBuYXR1cmFsQm91bmRzKSIpfSwKKyAgICB7IkdldE5leHRUcmFja0ZvckNvbXBvc2l0aW5nIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0dldE5leHRUcmFja0ZvckNvbXBvc2l0aW5nLCAxLAorICAgICBQeURvY19TVFIoIihUcmFjayB0aGVUcmFjaykgLT4gKFRyYWNrIF9ydikiKX0sCisgICAgeyJHZXRQcmV2VHJhY2tGb3JDb21wb3NpdGluZyIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRQcmV2VHJhY2tGb3JDb21wb3NpdGluZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoVHJhY2sgdGhlVHJhY2spIC0+IChUcmFjayBfcnYpIil9LAorICAgIHsiR2V0TW92aWVQaWN0IiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0dldE1vdmllUGljdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGltZVZhbHVlIHRpbWUpIC0+IChQaWNIYW5kbGUgX3J2KSIpfSwKKyAgICB7IkdldE1vdmllUG9zdGVyUGljdCIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZVBvc3RlclBpY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFBpY0hhbmRsZSBfcnYpIil9LAorICAgIHsiVXBkYXRlTW92aWUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfVXBkYXRlTW92aWUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkludmFsaWRhdGVNb3ZpZVJlZ2lvbiIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9JbnZhbGlkYXRlTW92aWVSZWdpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKFJnbkhhbmRsZSBpbnZhbGlkUmduKSAtPiBOb25lIil9LAorICAgIHsiR2V0TW92aWVCb3giLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVCb3gsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFJlY3QgYm94UmVjdCkiKX0sCisgICAgeyJTZXRNb3ZpZUJveCIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TZXRNb3ZpZUJveCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCBib3hSZWN0KSAtPiBOb25lIil9LAorICAgIHsiR2V0TW92aWVEaXNwbGF5Q2xpcFJnbiIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZURpc3BsYXlDbGlwUmduLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChSZ25IYW5kbGUgX3J2KSIpfSwKKyAgICB7IlNldE1vdmllRGlzcGxheUNsaXBSZ24iLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfU2V0TW92aWVEaXNwbGF5Q2xpcFJnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHRoZUNsaXApIC0+IE5vbmUiKX0sCisgICAgeyJHZXRNb3ZpZUNsaXBSZ24iLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVDbGlwUmduLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChSZ25IYW5kbGUgX3J2KSIpfSwKKyAgICB7IlNldE1vdmllQ2xpcFJnbiIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TZXRNb3ZpZUNsaXBSZ24sIDEsCisgICAgIFB5RG9jX1NUUigiKFJnbkhhbmRsZSB0aGVDbGlwKSAtPiBOb25lIil9LAorICAgIHsiR2V0TW92aWVEaXNwbGF5Qm91bmRzUmduIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0dldE1vdmllRGlzcGxheUJvdW5kc1JnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoUmduSGFuZGxlIF9ydikiKX0sCisgICAgeyJHZXRNb3ZpZUJvdW5kc1JnbiIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZUJvdW5kc1JnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoUmduSGFuZGxlIF9ydikiKX0sCisgICAgeyJTZXRNb3ZpZVZpZGVvT3V0cHV0IiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1NldE1vdmllVmlkZW9PdXRwdXQsIDEsCisgICAgIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIHZvdXQpIC0+IE5vbmUiKX0sCisgICAgeyJQdXRNb3ZpZUludG9IYW5kbGUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfUHV0TW92aWVJbnRvSGFuZGxlLCAxLAorICAgICBQeURvY19TVFIoIihIYW5kbGUgcHVibGljTW92aWUpIC0+IE5vbmUiKX0sCisgICAgeyJQdXRNb3ZpZUludG9EYXRhRm9yayIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9QdXRNb3ZpZUludG9EYXRhRm9yaywgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgZlJlZk51bSwgbG9uZyBvZmZzZXQsIGxvbmcgbWF4U2l6ZSkgLT4gTm9uZSIpfSwKKyAgICB7IlB1dE1vdmllSW50b0RhdGFGb3JrNjQiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfUHV0TW92aWVJbnRvRGF0YUZvcms2NCwgMSwKKyAgICAgUHlEb2NfU1RSKCIobG9uZyBmUmVmTnVtLCB3aWRlIG9mZnNldCwgdW5zaWduZWQgbG9uZyBtYXhTaXplKSAtPiBOb25lIil9LAorICAgIHsiUHV0TW92aWVJbnRvU3RvcmFnZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9QdXRNb3ZpZUludG9TdG9yYWdlLCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgd2lkZSBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgbWF4U2l6ZSkgLT4gTm9uZSIpfSwKKyAgICB7IlB1dE1vdmllRm9yRGF0YVJlZkludG9IYW5kbGUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfUHV0TW92aWVGb3JEYXRhUmVmSW50b0hhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSGFuZGxlIGRhdGFSZWYsIE9TVHlwZSBkYXRhUmVmVHlwZSwgSGFuZGxlIHB1YmxpY01vdmllKSAtPiBOb25lIil9LAorICAgIHsiR2V0TW92aWVDcmVhdGlvblRpbWUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVDcmVhdGlvblRpbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKHVuc2lnbmVkIGxvbmcgX3J2KSIpfSwKKyAgICB7IkdldE1vdmllTW9kaWZpY2F0aW9uVGltZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZU1vZGlmaWNhdGlvblRpbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKHVuc2lnbmVkIGxvbmcgX3J2KSIpfSwKKyAgICB7IkdldE1vdmllVGltZVNjYWxlIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0dldE1vdmllVGltZVNjYWxlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChUaW1lU2NhbGUgX3J2KSIpfSwKKyAgICB7IlNldE1vdmllVGltZVNjYWxlIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1NldE1vdmllVGltZVNjYWxlLCAxLAorICAgICBQeURvY19TVFIoIihUaW1lU2NhbGUgdGltZVNjYWxlKSAtPiBOb25lIil9LAorICAgIHsiR2V0TW92aWVEdXJhdGlvbiIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZUR1cmF0aW9uLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChUaW1lVmFsdWUgX3J2KSIpfSwKKyAgICB7IkdldE1vdmllUmF0ZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZVJhdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEZpeGVkIF9ydikiKX0sCisgICAgeyJTZXRNb3ZpZVJhdGUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfU2V0TW92aWVSYXRlLCAxLAorICAgICBQeURvY19TVFIoIihGaXhlZCByYXRlKSAtPiBOb25lIil9LAorICAgIHsiR2V0TW92aWVQcmVmZXJyZWRSYXRlIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0dldE1vdmllUHJlZmVycmVkUmF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoRml4ZWQgX3J2KSIpfSwKKyAgICB7IlNldE1vdmllUHJlZmVycmVkUmF0ZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TZXRNb3ZpZVByZWZlcnJlZFJhdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEZpeGVkIHJhdGUpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRNb3ZpZVByZWZlcnJlZFZvbHVtZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZVByZWZlcnJlZFZvbHVtZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgX3J2KSIpfSwKKyAgICB7IlNldE1vdmllUHJlZmVycmVkVm9sdW1lIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1NldE1vdmllUHJlZmVycmVkVm9sdW1lLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCB2b2x1bWUpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRNb3ZpZVZvbHVtZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZVZvbHVtZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgX3J2KSIpfSwKKyAgICB7IlNldE1vdmllVm9sdW1lIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1NldE1vdmllVm9sdW1lLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCB2b2x1bWUpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRNb3ZpZVByZXZpZXdUaW1lIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0dldE1vdmllUHJldmlld1RpbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFRpbWVWYWx1ZSBwcmV2aWV3VGltZSwgVGltZVZhbHVlIHByZXZpZXdEdXJhdGlvbikiKX0sCisgICAgeyJTZXRNb3ZpZVByZXZpZXdUaW1lIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1NldE1vdmllUHJldmlld1RpbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSBwcmV2aWV3VGltZSwgVGltZVZhbHVlIHByZXZpZXdEdXJhdGlvbikgLT4gTm9uZSIpfSwKKyAgICB7IkdldE1vdmllUG9zdGVyVGltZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZVBvc3RlclRpbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFRpbWVWYWx1ZSBfcnYpIil9LAorICAgIHsiU2V0TW92aWVQb3N0ZXJUaW1lIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1NldE1vdmllUG9zdGVyVGltZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGltZVZhbHVlIHBvc3RlclRpbWUpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRNb3ZpZVNlbGVjdGlvbiIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZVNlbGVjdGlvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVGltZVZhbHVlIHNlbGVjdGlvblRpbWUsIFRpbWVWYWx1ZSBzZWxlY3Rpb25EdXJhdGlvbikiKX0sCisgICAgeyJTZXRNb3ZpZVNlbGVjdGlvbiIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TZXRNb3ZpZVNlbGVjdGlvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGltZVZhbHVlIHNlbGVjdGlvblRpbWUsIFRpbWVWYWx1ZSBzZWxlY3Rpb25EdXJhdGlvbikgLT4gTm9uZSIpfSwKKyAgICB7IlNldE1vdmllQWN0aXZlU2VnbWVudCIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TZXRNb3ZpZUFjdGl2ZVNlZ21lbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSBzdGFydFRpbWUsIFRpbWVWYWx1ZSBkdXJhdGlvbikgLT4gTm9uZSIpfSwKKyAgICB7IkdldE1vdmllQWN0aXZlU2VnbWVudCIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZUFjdGl2ZVNlZ21lbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFRpbWVWYWx1ZSBzdGFydFRpbWUsIFRpbWVWYWx1ZSBkdXJhdGlvbikiKX0sCisgICAgeyJHZXRNb3ZpZVRpbWUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVUaW1lLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChUaW1lVmFsdWUgX3J2LCBUaW1lUmVjb3JkIGN1cnJlbnRUaW1lKSIpfSwKKyAgICB7IlNldE1vdmllVGltZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TZXRNb3ZpZVRpbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKFRpbWVSZWNvcmQgbmV3dGltZSkgLT4gTm9uZSIpfSwKKyAgICB7IlNldE1vdmllVGltZVZhbHVlIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1NldE1vdmllVGltZVZhbHVlLCAxLAorICAgICBQeURvY19TVFIoIihUaW1lVmFsdWUgbmV3dGltZSkgLT4gTm9uZSIpfSwKKyAgICB7IkdldE1vdmllVXNlckRhdGEiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVVc2VyRGF0YSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVXNlckRhdGEgX3J2KSIpfSwKKyAgICB7IkdldE1vdmllVHJhY2tDb3VudCIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZVRyYWNrQ291bnQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKGxvbmcgX3J2KSIpfSwKKyAgICB7IkdldE1vdmllVHJhY2siLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVUcmFjaywgMSwKKyAgICAgUHlEb2NfU1RSKCIobG9uZyB0cmFja0lEKSAtPiAoVHJhY2sgX3J2KSIpfSwKKyAgICB7IkdldE1vdmllSW5kVHJhY2siLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVJbmRUcmFjaywgMSwKKyAgICAgUHlEb2NfU1RSKCIobG9uZyBpbmRleCkgLT4gKFRyYWNrIF9ydikiKX0sCisgICAgeyJHZXRNb3ZpZUluZFRyYWNrVHlwZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZUluZFRyYWNrVHlwZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIobG9uZyBpbmRleCwgT1NUeXBlIHRyYWNrVHlwZSwgbG9uZyBmbGFncykgLT4gKFRyYWNrIF9ydikiKX0sCisgICAgeyJOZXdNb3ZpZVRyYWNrIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX05ld01vdmllVHJhY2ssIDEsCisgICAgIFB5RG9jX1NUUigiKEZpeGVkIHdpZHRoLCBGaXhlZCBoZWlnaHQsIHNob3J0IHRyYWNrVm9sdW1lKSAtPiAoVHJhY2sgX3J2KSIpfSwKKyAgICB7IlNldEF1dG9UcmFja0FsdGVybmF0ZXNFbmFibGVkIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1NldEF1dG9UcmFja0FsdGVybmF0ZXNFbmFibGVkLCAxLAorICAgICBQeURvY19TVFIoIihCb29sZWFuIGVuYWJsZSkgLT4gTm9uZSIpfSwKKyAgICB7IlNlbGVjdE1vdmllQWx0ZXJuYXRlcyIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TZWxlY3RNb3ZpZUFsdGVybmF0ZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7Ikluc2VydE1vdmllU2VnbWVudCIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9JbnNlcnRNb3ZpZVNlZ21lbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKE1vdmllIGRzdE1vdmllLCBUaW1lVmFsdWUgc3JjSW4sIFRpbWVWYWx1ZSBzcmNEdXJhdGlvbiwgVGltZVZhbHVlIGRzdEluKSAtPiBOb25lIil9LAorICAgIHsiSW5zZXJ0RW1wdHlNb3ZpZVNlZ21lbnQiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfSW5zZXJ0RW1wdHlNb3ZpZVNlZ21lbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSBkc3RJbiwgVGltZVZhbHVlIGRzdER1cmF0aW9uKSAtPiBOb25lIil9LAorICAgIHsiRGVsZXRlTW92aWVTZWdtZW50IiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0RlbGV0ZU1vdmllU2VnbWVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGltZVZhbHVlIHN0YXJ0VGltZSwgVGltZVZhbHVlIGR1cmF0aW9uKSAtPiBOb25lIil9LAorICAgIHsiU2NhbGVNb3ZpZVNlZ21lbnQiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfU2NhbGVNb3ZpZVNlZ21lbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSBzdGFydFRpbWUsIFRpbWVWYWx1ZSBvbGREdXJhdGlvbiwgVGltZVZhbHVlIG5ld0R1cmF0aW9uKSAtPiBOb25lIil9LAorICAgIHsiQ3V0TW92aWVTZWxlY3Rpb24iLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfQ3V0TW92aWVTZWxlY3Rpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKE1vdmllIF9ydikiKX0sCisgICAgeyJDb3B5TW92aWVTZWxlY3Rpb24iLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfQ29weU1vdmllU2VsZWN0aW9uLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChNb3ZpZSBfcnYpIil9LAorICAgIHsiUGFzdGVNb3ZpZVNlbGVjdGlvbiIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9QYXN0ZU1vdmllU2VsZWN0aW9uLCAxLAorICAgICBQeURvY19TVFIoIihNb3ZpZSBzcmMpIC0+IE5vbmUiKX0sCisgICAgeyJBZGRNb3ZpZVNlbGVjdGlvbiIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9BZGRNb3ZpZVNlbGVjdGlvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTW92aWUgc3JjKSAtPiBOb25lIil9LAorICAgIHsiQ2xlYXJNb3ZpZVNlbGVjdGlvbiIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9DbGVhck1vdmllU2VsZWN0aW9uLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJQdXRNb3ZpZUludG9UeXBlZEhhbmRsZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9QdXRNb3ZpZUludG9UeXBlZEhhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVHJhY2sgdGFyZ2V0VHJhY2ssIE9TVHlwZSBoYW5kbGVUeXBlLCBIYW5kbGUgcHVibGljTW92aWUsIFRpbWVWYWx1ZSBzdGFydCwgVGltZVZhbHVlIGR1ciwgbG9uZyBmbGFncywgQ29tcG9uZW50SW5zdGFuY2UgdXNlckNvbXApIC0+IE5vbmUiKX0sCisgICAgeyJDb3B5TW92aWVTZXR0aW5ncyIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9Db3B5TW92aWVTZXR0aW5ncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTW92aWUgZHN0TW92aWUpIC0+IE5vbmUiKX0sCisgICAgeyJDb252ZXJ0TW92aWVUb0ZpbGUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfQ29udmVydE1vdmllVG9GaWxlLCAxLAorICAgICBQeURvY19TVFIoIihUcmFjayBvbmx5VHJhY2ssIEZTU3BlYyBvdXRwdXRGaWxlLCBPU1R5cGUgZmlsZVR5cGUsIE9TVHlwZSBjcmVhdG9yLCBTY3JpcHRDb2RlIHNjcmlwdFRhZywgbG9uZyBmbGFncywgQ29tcG9uZW50SW5zdGFuY2UgdXNlckNvbXApIC0+IChzaG9ydCByZXNJRCkiKX0sCisgICAgeyJHZXRNb3ZpZURhdGFTaXplIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0dldE1vdmllRGF0YVNpemUsIDEsCisgICAgIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSBzdGFydFRpbWUsIFRpbWVWYWx1ZSBkdXJhdGlvbikgLT4gKGxvbmcgX3J2KSIpfSwKKyAgICB7IkdldE1vdmllRGF0YVNpemU2NCIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZURhdGFTaXplNjQsIDEsCisgICAgIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSBzdGFydFRpbWUsIFRpbWVWYWx1ZSBkdXJhdGlvbikgLT4gKHdpZGUgZGF0YVNpemUpIil9LAorICAgIHsiUHRJbk1vdmllIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1B0SW5Nb3ZpZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgcHQpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJTZXRNb3ZpZUxhbmd1YWdlIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1NldE1vdmllTGFuZ3VhZ2UsIDEsCisgICAgIFB5RG9jX1NUUigiKGxvbmcgbGFuZ3VhZ2UpIC0+IE5vbmUiKX0sCisgICAgeyJDb3B5TW92aWVVc2VyRGF0YSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9Db3B5TW92aWVVc2VyRGF0YSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTW92aWUgZHN0TW92aWUsIE9TVHlwZSBjb3B5UnVsZSkgLT4gTm9uZSIpfSwKKyAgICB7IkdldE1vdmllTmV4dEludGVyZXN0aW5nVGltZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZU5leHRJbnRlcmVzdGluZ1RpbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGludGVyZXN0aW5nVGltZUZsYWdzLCBzaG9ydCBudW1NZWRpYVR5cGVzLCBPU1R5cGUgd2hpY2hNZWRpYVR5cGVzLCBUaW1lVmFsdWUgdGltZSwgRml4ZWQgcmF0ZSkgLT4gKFRpbWVWYWx1ZSBpbnRlcmVzdGluZ1RpbWUsIFRpbWVWYWx1ZSBpbnRlcmVzdGluZ0R1cmF0aW9uKSIpfSwKKyAgICB7IkFkZE1vdmllUmVzb3VyY2UiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfQWRkTW92aWVSZXNvdXJjZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgcmVzUmVmTnVtLCBTdHIyNTUgcmVzTmFtZSkgLT4gKHNob3J0IHJlc0lkKSIpfSwKKyAgICB7IlVwZGF0ZU1vdmllUmVzb3VyY2UiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfVXBkYXRlTW92aWVSZXNvdXJjZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgcmVzUmVmTnVtLCBzaG9ydCByZXNJZCwgU3RyMjU1IHJlc05hbWUpIC0+IE5vbmUiKX0sCisgICAgeyJBZGRNb3ZpZVRvU3RvcmFnZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9BZGRNb3ZpZVRvU3RvcmFnZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgpIC0+IE5vbmUiKX0sCisgICAgeyJVcGRhdGVNb3ZpZUluU3RvcmFnZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9VcGRhdGVNb3ZpZUluU3RvcmFnZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgpIC0+IE5vbmUiKX0sCisgICAgeyJIYXNNb3ZpZUNoYW5nZWQiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfSGFzTW92aWVDaGFuZ2VkLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJDbGVhck1vdmllQ2hhbmdlZCIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9DbGVhck1vdmllQ2hhbmdlZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiU2V0TW92aWVEZWZhdWx0RGF0YVJlZiIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TZXRNb3ZpZURlZmF1bHREYXRhUmVmLCAxLAorICAgICBQeURvY19TVFIoIihIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlKSAtPiBOb25lIil9LAorICAgIHsiR2V0TW92aWVEZWZhdWx0RGF0YVJlZiIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZURlZmF1bHREYXRhUmVmLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlKSIpfSwKKyAgICB7IlNldE1vdmllQ29sb3JUYWJsZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TZXRNb3ZpZUNvbG9yVGFibGUsIDEsCisgICAgIFB5RG9jX1NUUigiKENUYWJIYW5kbGUgY3RhYikgLT4gTm9uZSIpfSwKKyAgICB7IkdldE1vdmllQ29sb3JUYWJsZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZUNvbG9yVGFibGUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENUYWJIYW5kbGUgY3RhYikiKX0sCisgICAgeyJGbGF0dGVuTW92aWUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfRmxhdHRlbk1vdmllLCAxLAorICAgICBQeURvY19TVFIoIihsb25nIG1vdmllRmxhdHRlbkZsYWdzLCBGU1NwZWMgdGhlRmlsZSwgT1NUeXBlIGNyZWF0b3IsIFNjcmlwdENvZGUgc2NyaXB0VGFnLCBsb25nIGNyZWF0ZU1vdmllRmlsZUZsYWdzLCBTdHIyNTUgcmVzTmFtZSkgLT4gKHNob3J0IHJlc0lkKSIpfSwKKyAgICB7IkZsYXR0ZW5Nb3ZpZURhdGEiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfRmxhdHRlbk1vdmllRGF0YSwgMSwKKyAgICAgUHlEb2NfU1RSKCIobG9uZyBtb3ZpZUZsYXR0ZW5GbGFncywgRlNTcGVjIHRoZUZpbGUsIE9TVHlwZSBjcmVhdG9yLCBTY3JpcHRDb2RlIHNjcmlwdFRhZywgbG9uZyBjcmVhdGVNb3ZpZUZpbGVGbGFncykgLT4gKE1vdmllIF9ydikiKX0sCisgICAgeyJGbGF0dGVuTW92aWVEYXRhVG9EYXRhUmVmIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0ZsYXR0ZW5Nb3ZpZURhdGFUb0RhdGFSZWYsIDEsCisgICAgIFB5RG9jX1NUUigiKGxvbmcgbW92aWVGbGF0dGVuRmxhZ3MsIEhhbmRsZSBkYXRhUmVmLCBPU1R5cGUgZGF0YVJlZlR5cGUsIE9TVHlwZSBjcmVhdG9yLCBTY3JpcHRDb2RlIHNjcmlwdFRhZywgbG9uZyBjcmVhdGVNb3ZpZUZpbGVGbGFncykgLT4gKE1vdmllIF9ydikiKX0sCisgICAgeyJNb3ZpZVNlYXJjaFRleHQiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfTW92aWVTZWFyY2hUZXh0LCAxLAorICAgICBQeURvY19TVFIoIihQdHIgdGV4dCwgbG9uZyBzaXplLCBsb25nIHNlYXJjaEZsYWdzKSAtPiAoVHJhY2sgc2VhcmNoVHJhY2ssIFRpbWVWYWx1ZSBzZWFyY2hUaW1lLCBsb25nIHNlYXJjaE9mZnNldCkiKX0sCisgICAgeyJHZXRQb3N0ZXJCb3giLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0UG9zdGVyQm94LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChSZWN0IGJveFJlY3QpIil9LAorICAgIHsiU2V0UG9zdGVyQm94IiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1NldFBvc3RlckJveCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCBib3hSZWN0KSAtPiBOb25lIil9LAorICAgIHsiR2V0TW92aWVTZWdtZW50RGlzcGxheUJvdW5kc1JnbiIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZVNlZ21lbnREaXNwbGF5Qm91bmRzUmduLCAxLAorICAgICBQeURvY19TVFIoIihUaW1lVmFsdWUgdGltZSwgVGltZVZhbHVlIGR1cmF0aW9uKSAtPiAoUmduSGFuZGxlIF9ydikiKX0sCisgICAgeyJHZXRNb3ZpZVN0YXR1cyIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZVN0YXR1cywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgVHJhY2sgZmlyc3RQcm9ibGVtVHJhY2spIil9LAorICAgIHsiTmV3TW92aWVDb250cm9sbGVyIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX05ld01vdmllQ29udHJvbGxlciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCBtb3ZpZVJlY3QsIGxvbmcgc29tZUZsYWdzKSAtPiAoTW92aWVDb250cm9sbGVyIF9ydikiKX0sCisgICAgeyJQdXRNb3ZpZU9uU2NyYXAiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfUHV0TW92aWVPblNjcmFwLCAxLAorICAgICBQeURvY19TVFIoIihsb25nIG1vdmllU2NyYXBGbGFncykgLT4gTm9uZSIpfSwKKyAgICB7IlNldE1vdmllUGxheUhpbnRzIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1NldE1vdmllUGxheUhpbnRzLCAxLAorICAgICBQeURvY19TVFIoIihsb25nIGZsYWdzLCBsb25nIGZsYWdzTWFzaykgLT4gTm9uZSIpfSwKKyAgICB7IkdldE1heExvYWRlZFRpbWVJbk1vdmllIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0dldE1heExvYWRlZFRpbWVJbk1vdmllLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChUaW1lVmFsdWUgdGltZSkiKX0sCisgICAgeyJRVE1vdmllTmVlZHNUaW1lVGFibGUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfUVRNb3ZpZU5lZWRzVGltZVRhYmxlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIG5lZWRzVGltZVRhYmxlKSIpfSwKKyAgICB7IlFUR2V0RGF0YVJlZk1heEZpbGVPZmZzZXQiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfUVRHZXREYXRhUmVmTWF4RmlsZU9mZnNldCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoT1NUeXBlIGRhdGFSZWZUeXBlLCBIYW5kbGUgZGF0YVJlZikgLT4gKGxvbmcgb2Zmc2V0KSIpfSwKKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKICNkZWZpbmUgTW92aWVPYmpfZ2V0c2V0bGlzdCBOVUxMCkBAIC03Mjg2LDYxICs3Mjg2LDYxIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfdHBfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKl9hcmdzLCBQeU9iamVjdCAqX2t3ZHMpCiB7Ci0JUHlPYmplY3QgKl9zZWxmOwotCU1vdmllIGl0c2VsZjsKLQljaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKKyAgICBQeU9iamVjdCAqX3NlbGY7CisgICAgTW92aWUgaXRzZWxmOworICAgIGNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgTW92aWVPYmpfQ29udmVydCwgJml0c2VsZikpIHJldHVybiBOVUxMOwotCWlmICgoX3NlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JKChNb3ZpZU9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiBfc2VsZjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBNb3ZpZU9ial9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAoKE1vdmllT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgcmV0dXJuIF9zZWxmOwogfQogCiAjZGVmaW5lIE1vdmllT2JqX3RwX2ZyZWUgUHlPYmplY3RfRGVsCiAKIAogUHlUeXBlT2JqZWN0IE1vdmllX1R5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCi0JMCwgLypvYl9zaXplKi8KLQkiX1F0Lk1vdmllIiwgLyp0cF9uYW1lKi8KLQlzaXplb2YoTW92aWVPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCi0JMCwgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKSBNb3ZpZU9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsIC8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLwotCShjbXBmdW5jKSBNb3ZpZU9ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYykgTW92aWVPYmpfcmVwciwgLyp0cF9yZXByKi8KLQkoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCi0JKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpIE1vdmllT2JqX2hhc2gsIC8qdHBfaGFzaCovCi0JMCwgLyp0cF9jYWxsKi8KLQkwLCAvKnRwX3N0ciovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLwotCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCi0JMCwgLyp0cF9hc19idWZmZXIqLwotCVB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCTAsIC8qdHBfZG9jKi8KLQkwLCAvKnRwX3RyYXZlcnNlKi8KLQkwLCAvKnRwX2NsZWFyKi8KLQkwLCAvKnRwX3JpY2hjb21wYXJlKi8KLQkwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLQkwLCAvKnRwX2l0ZXIqLwotCTAsIC8qdHBfaXRlcm5leHQqLwotCU1vdmllT2JqX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KLQkwLCAvKnRwX21lbWJlcnMqLwotCU1vdmllT2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KLQkwLCAvKnRwX2Jhc2UqLwotCTAsIC8qdHBfZGljdCovCi0JMCwgLyp0cF9kZXNjcl9nZXQqLwotCTAsIC8qdHBfZGVzY3Jfc2V0Ki8KLQkwLCAvKnRwX2RpY3RvZmZzZXQqLwotCU1vdmllT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KLQlNb3ZpZU9ial90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KLQlNb3ZpZU9ial90cF9uZXcsIC8qIHRwX25ldyAqLwotCU1vdmllT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAvKm9iX3NpemUqLworICAgICJfUXQuTW92aWUiLCAvKnRwX25hbWUqLworICAgIHNpemVvZihNb3ZpZU9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpIE1vdmllT2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgMCwgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCisgICAgKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCisgICAgKGNtcGZ1bmMpIE1vdmllT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCisgICAgKHJlcHJmdW5jKSBNb3ZpZU9ial9yZXByLCAvKnRwX3JlcHIqLworICAgIChQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIChQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLworICAgIChoYXNoZnVuYykgTW92aWVPYmpfaGFzaCwgLyp0cF9oYXNoKi8KKyAgICAwLCAvKnRwX2NhbGwqLworICAgIDAsIC8qdHBfc3RyKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCisgICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgMCwgLyp0cF9kb2MqLworICAgIDAsIC8qdHBfdHJhdmVyc2UqLworICAgIDAsIC8qdHBfY2xlYXIqLworICAgIDAsIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsIC8qdHBfaXRlciovCisgICAgMCwgLyp0cF9pdGVybmV4dCovCisgICAgTW92aWVPYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLworICAgIDAsIC8qdHBfbWVtYmVycyovCisgICAgTW92aWVPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLworICAgIDAsIC8qdHBfYmFzZSovCisgICAgMCwgLyp0cF9kaWN0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX2dldCovCisgICAgMCwgLyp0cF9kZXNjcl9zZXQqLworICAgIDAsIC8qdHBfZGljdG9mZnNldCovCisgICAgTW92aWVPYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLworICAgIE1vdmllT2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLworICAgIE1vdmllT2JqX3RwX25ldywgLyogdHBfbmV3ICovCisgICAgTW92aWVPYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEVuZCBvYmplY3QgdHlwZSBNb3ZpZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC03MzUzLDQ3ICs3MzUzLDQ3IEBACiAjZGVmaW5lIFNHT3V0cHV0T2JqX0NoZWNrKHgpICgoeCktPm9iX3R5cGUgPT0gJlNHT3V0cHV0X1R5cGUgfHwgUHlPYmplY3RfVHlwZUNoZWNrKCh4KSwgJlNHT3V0cHV0X1R5cGUpKQogCiB0eXBlZGVmIHN0cnVjdCBTR091dHB1dE9iamVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCVNHT3V0cHV0IG9iX2l0c2VsZjsKKyAgICBQeU9iamVjdF9IRUFECisgICAgU0dPdXRwdXQgb2JfaXRzZWxmOwogfSBTR091dHB1dE9iamVjdDsKIAogUHlPYmplY3QgKlNHT3V0cHV0T2JqX05ldyhTR091dHB1dCBpdHNlbGYpCiB7Ci0JU0dPdXRwdXRPYmplY3QgKml0OwotCWlmIChpdHNlbGYgPT0gTlVMTCkgewotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFF0X0Vycm9yLCJDYW5ub3QgY3JlYXRlIFNHT3V0cHV0IGZyb20gTlVMTCBwb2ludGVyIik7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLQkgICAgICAgICAgICAgICAgICAgICAgICB9Ci0JaXQgPSBQeU9iamVjdF9ORVcoU0dPdXRwdXRPYmplY3QsICZTR091dHB1dF9UeXBlKTsKLQlpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgU0dPdXRwdXRPYmplY3QgKml0OworICAgIGlmIChpdHNlbGYgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFF0X0Vycm9yLCJDYW5ub3QgY3JlYXRlIFNHT3V0cHV0IGZyb20gTlVMTCBwb2ludGVyIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgaXQgPSBQeU9iamVjdF9ORVcoU0dPdXRwdXRPYmplY3QsICZTR091dHB1dF9UeXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiAKIGludCBTR091dHB1dE9ial9Db252ZXJ0KFB5T2JqZWN0ICp2LCBTR091dHB1dCAqcF9pdHNlbGYpCiB7Ci0JaWYgKHYgPT0gUHlfTm9uZSkKLQl7Ci0JCSpwX2l0c2VsZiA9IE5VTEw7Ci0JCXJldHVybiAxOwotCX0KLQlpZiAoIVNHT3V0cHV0T2JqX0NoZWNrKHYpKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIlNHT3V0cHV0IHJlcXVpcmVkIik7Ci0JCXJldHVybiAwOwotCX0KLQkqcF9pdHNlbGYgPSAoKFNHT3V0cHV0T2JqZWN0ICopdiktPm9iX2l0c2VsZjsKLQlyZXR1cm4gMTsKKyAgICBpZiAodiA9PSBQeV9Ob25lKQorICAgIHsKKyAgICAgICAgKnBfaXRzZWxmID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmICghU0dPdXRwdXRPYmpfQ2hlY2sodikpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiU0dPdXRwdXQgcmVxdWlyZWQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICpwX2l0c2VsZiA9ICgoU0dPdXRwdXRPYmplY3QgKil2KS0+b2JfaXRzZWxmOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgdm9pZCBTR091dHB1dE9ial9kZWFsbG9jKFNHT3V0cHV0T2JqZWN0ICpzZWxmKQogewotCS8qIENsZWFudXAgb2Ygc2VsZi0+b2JfaXRzZWxmIGdvZXMgaGVyZSAqLwotCXNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CisgICAgLyogQ2xlYW51cCBvZiBzZWxmLT5vYl9pdHNlbGYgZ29lcyBoZXJlICovCisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIFNHT3V0cHV0T2JqX21ldGhvZHNbXSA9IHsKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKICNkZWZpbmUgU0dPdXRwdXRPYmpfZ2V0c2V0bGlzdCBOVUxMCkBAIC03NDEwLDYxICs3NDEwLDYxIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqU0dPdXRwdXRPYmpfdHBfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKl9hcmdzLCBQeU9iamVjdCAqX2t3ZHMpCiB7Ci0JUHlPYmplY3QgKl9zZWxmOwotCVNHT3V0cHV0IGl0c2VsZjsKLQljaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKKyAgICBQeU9iamVjdCAqX3NlbGY7CisgICAgU0dPdXRwdXQgaXRzZWxmOworICAgIGNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgU0dPdXRwdXRPYmpfQ29udmVydCwgJml0c2VsZikpIHJldHVybiBOVUxMOwotCWlmICgoX3NlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JKChTR091dHB1dE9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiBfc2VsZjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBTR091dHB1dE9ial9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAoKFNHT3V0cHV0T2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgcmV0dXJuIF9zZWxmOwogfQogCiAjZGVmaW5lIFNHT3V0cHV0T2JqX3RwX2ZyZWUgUHlPYmplY3RfRGVsCiAKIAogUHlUeXBlT2JqZWN0IFNHT3V0cHV0X1R5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCi0JMCwgLypvYl9zaXplKi8KLQkiX1F0LlNHT3V0cHV0IiwgLyp0cF9uYW1lKi8KLQlzaXplb2YoU0dPdXRwdXRPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCi0JMCwgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKSBTR091dHB1dE9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsIC8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLwotCShjbXBmdW5jKSBTR091dHB1dE9ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYykgU0dPdXRwdXRPYmpfcmVwciwgLyp0cF9yZXByKi8KLQkoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCi0JKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpIFNHT3V0cHV0T2JqX2hhc2gsIC8qdHBfaGFzaCovCi0JMCwgLyp0cF9jYWxsKi8KLQkwLCAvKnRwX3N0ciovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLwotCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCi0JMCwgLyp0cF9hc19idWZmZXIqLwotCVB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCTAsIC8qdHBfZG9jKi8KLQkwLCAvKnRwX3RyYXZlcnNlKi8KLQkwLCAvKnRwX2NsZWFyKi8KLQkwLCAvKnRwX3JpY2hjb21wYXJlKi8KLQkwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLQkwLCAvKnRwX2l0ZXIqLwotCTAsIC8qdHBfaXRlcm5leHQqLwotCVNHT3V0cHV0T2JqX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KLQkwLCAvKnRwX21lbWJlcnMqLwotCVNHT3V0cHV0T2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KLQkwLCAvKnRwX2Jhc2UqLwotCTAsIC8qdHBfZGljdCovCi0JMCwgLyp0cF9kZXNjcl9nZXQqLwotCTAsIC8qdHBfZGVzY3Jfc2V0Ki8KLQkwLCAvKnRwX2RpY3RvZmZzZXQqLwotCVNHT3V0cHV0T2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KLQlTR091dHB1dE9ial90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KLQlTR091dHB1dE9ial90cF9uZXcsIC8qIHRwX25ldyAqLwotCVNHT3V0cHV0T2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAvKm9iX3NpemUqLworICAgICJfUXQuU0dPdXRwdXQiLCAvKnRwX25hbWUqLworICAgIHNpemVvZihTR091dHB1dE9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpIFNHT3V0cHV0T2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgMCwgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCisgICAgKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCisgICAgKGNtcGZ1bmMpIFNHT3V0cHV0T2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCisgICAgKHJlcHJmdW5jKSBTR091dHB1dE9ial9yZXByLCAvKnRwX3JlcHIqLworICAgIChQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIChQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLworICAgIChoYXNoZnVuYykgU0dPdXRwdXRPYmpfaGFzaCwgLyp0cF9oYXNoKi8KKyAgICAwLCAvKnRwX2NhbGwqLworICAgIDAsIC8qdHBfc3RyKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCisgICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgMCwgLyp0cF9kb2MqLworICAgIDAsIC8qdHBfdHJhdmVyc2UqLworICAgIDAsIC8qdHBfY2xlYXIqLworICAgIDAsIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsIC8qdHBfaXRlciovCisgICAgMCwgLyp0cF9pdGVybmV4dCovCisgICAgU0dPdXRwdXRPYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLworICAgIDAsIC8qdHBfbWVtYmVycyovCisgICAgU0dPdXRwdXRPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLworICAgIDAsIC8qdHBfYmFzZSovCisgICAgMCwgLyp0cF9kaWN0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX2dldCovCisgICAgMCwgLyp0cF9kZXNjcl9zZXQqLworICAgIDAsIC8qdHBfZGljdG9mZnNldCovCisgICAgU0dPdXRwdXRPYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLworICAgIFNHT3V0cHV0T2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLworICAgIFNHT3V0cHV0T2JqX3RwX25ldywgLyogdHBfbmV3ICovCisgICAgU0dPdXRwdXRPYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0gRW5kIG9iamVjdCB0eXBlIFNHT3V0cHV0IC0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC03NDcyLDIwNTI3ICs3NDcyLDIwNTI3IEBACiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRW50ZXJNb3ZpZXMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CiAjaWZuZGVmIEVudGVyTW92aWVzCi0JUHlNYWNfUFJFQ0hFQ0soRW50ZXJNb3ZpZXMpOworICAgIFB5TWFjX1BSRUNIRUNLKEVudGVyTW92aWVzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRW50ZXJNb3ZpZXMoKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEVudGVyTW92aWVzKCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRXhpdE1vdmllcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBFeGl0TW92aWVzCi0JUHlNYWNfUFJFQ0hFQ0soRXhpdE1vdmllcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRXhpdE1vdmllcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JRXhpdE1vdmllcygpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgRXhpdE1vdmllcygpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HZXRNb3ZpZXNFcnJvcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKICNpZm5kZWYgR2V0TW92aWVzRXJyb3IKLQlQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZXNFcnJvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVzRXJyb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRNb3ZpZXNFcnJvcigpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0TW92aWVzRXJyb3IoKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9DbGVhck1vdmllc1N0aWNreUVycm9yKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIENsZWFyTW92aWVzU3RpY2t5RXJyb3IKLQlQeU1hY19QUkVDSEVDSyhDbGVhck1vdmllc1N0aWNreUVycm9yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDbGVhck1vdmllc1N0aWNreUVycm9yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlDbGVhck1vdmllc1N0aWNreUVycm9yKCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDbGVhck1vdmllc1N0aWNreUVycm9yKCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dldE1vdmllc1N0aWNreUVycm9yKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOwogI2lmbmRlZiBHZXRNb3ZpZXNTdGlja3lFcnJvcgotCVB5TWFjX1BSRUNIRUNLKEdldE1vdmllc1N0aWNreUVycm9yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZXNTdGlja3lFcnJvcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldE1vdmllc1N0aWNreUVycm9yKCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRNb3ZpZXNTdGlja3lFcnJvcigpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1FUR2V0V2FsbENsb2NrVGltZUJhc2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JVGltZUJhc2Ugd2FsbENsb2NrVGltZUJhc2U7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgVGltZUJhc2Ugd2FsbENsb2NrVGltZUJhc2U7CiAjaWZuZGVmIFFUR2V0V2FsbENsb2NrVGltZUJhc2UKLQlQeU1hY19QUkVDSEVDSyhRVEdldFdhbGxDbG9ja1RpbWVCYXNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhRVEdldFdhbGxDbG9ja1RpbWVCYXNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUVRHZXRXYWxsQ2xvY2tUaW1lQmFzZSgmd2FsbENsb2NrVGltZUJhc2UpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBUaW1lQmFzZU9ial9OZXcsIHdhbGxDbG9ja1RpbWVCYXNlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFFUR2V0V2FsbENsb2NrVGltZUJhc2UoJndhbGxDbG9ja1RpbWVCYXNlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgVGltZUJhc2VPYmpfTmV3LCB3YWxsQ2xvY2tUaW1lQmFzZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfUVRJZGxlTWFuYWdlck9wZW4oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUlkbGVNYW5hZ2VyIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgSWRsZU1hbmFnZXIgX3J2OwogI2lmbmRlZiBRVElkbGVNYW5hZ2VyT3BlbgotCVB5TWFjX1BSRUNIRUNLKFFUSWRsZU1hbmFnZXJPcGVuKTsKKyAgICBQeU1hY19QUkVDSEVDSyhRVElkbGVNYW5hZ2VyT3Blbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gUVRJZGxlTWFuYWdlck9wZW4oKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIElkbGVNYW5hZ2VyT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gUVRJZGxlTWFuYWdlck9wZW4oKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIElkbGVNYW5hZ2VyT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9DcmVhdGVNb3ZpZUNvbnRyb2woUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JV2luZG93UHRyIHRoZVdpbmRvdzsKLQlSZWN0IGxvY2FsUmVjdDsKLQlNb3ZpZSB0aGVNb3ZpZTsKLQlVSW50MzIgb3B0aW9uczsKLQlDb250cm9sSGFuZGxlIHJldHVybmVkQ29udHJvbDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBXaW5kb3dQdHIgdGhlV2luZG93OworICAgIFJlY3QgbG9jYWxSZWN0OworICAgIE1vdmllIHRoZU1vdmllOworICAgIFVJbnQzMiBvcHRpb25zOworICAgIENvbnRyb2xIYW5kbGUgcmV0dXJuZWRDb250cm9sOwogI2lmbmRlZiBDcmVhdGVNb3ZpZUNvbnRyb2wKLQlQeU1hY19QUkVDSEVDSyhDcmVhdGVNb3ZpZUNvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKENyZWF0ZU1vdmllQ29udHJvbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmdGhlV2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9Db252ZXJ0LCAmdGhlTW92aWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZvcHRpb25zKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENyZWF0ZU1vdmllQ29udHJvbCh0aGVXaW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmbG9jYWxSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlTW92aWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJnJldHVybmVkQ29udHJvbCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmbG9jYWxSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIHJldHVybmVkQ29udHJvbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJnRoZVdpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfQ29udmVydCwgJnRoZU1vdmllLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmb3B0aW9ucykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDcmVhdGVNb3ZpZUNvbnRyb2wodGhlV2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxvY2FsUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZU1vdmllLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXR1cm5lZENvbnRyb2wpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmxvY2FsUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCByZXR1cm5lZENvbnRyb2wpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0Rpc3Bvc2VNYXR0ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUGl4TWFwSGFuZGxlIHRoZU1hdHRlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQaXhNYXBIYW5kbGUgdGhlTWF0dGU7CiAjaWZuZGVmIERpc3Bvc2VNYXR0ZQotCVB5TWFjX1BSRUNIRUNLKERpc3Bvc2VNYXR0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGlzcG9zZU1hdHRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVNYXR0ZSkpCi0JCXJldHVybiBOVUxMOwotCURpc3Bvc2VNYXR0ZSh0aGVNYXR0ZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVNYXR0ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIERpc3Bvc2VNYXR0ZSh0aGVNYXR0ZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X05ld01vdmllKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlNb3ZpZSBfcnY7Ci0JbG9uZyBmbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgTW92aWUgX3J2OworICAgIGxvbmcgZmxhZ3M7CiAjaWZuZGVmIE5ld01vdmllCi0JUHlNYWNfUFJFQ0hFQ0soTmV3TW92aWUpOworICAgIFB5TWFjX1BSRUNIRUNLKE5ld01vdmllKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBOZXdNb3ZpZShmbGFncyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE5ld01vdmllKGZsYWdzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9RVEdldFRpbWVVbnRpbE5leHRUYXNrKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCWxvbmcgZHVyYXRpb247Ci0JbG9uZyBzY2FsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBsb25nIGR1cmF0aW9uOworICAgIGxvbmcgc2NhbGU7CiAjaWZuZGVmIFFUR2V0VGltZVVudGlsTmV4dFRhc2sKLQlQeU1hY19QUkVDSEVDSyhRVEdldFRpbWVVbnRpbE5leHRUYXNrKTsKKyAgICBQeU1hY19QUkVDSEVDSyhRVEdldFRpbWVVbnRpbE5leHRUYXNrKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2NhbGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUVRHZXRUaW1lVW50aWxOZXh0VGFzaygmZHVyYXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNjYWxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFFUR2V0VGltZVVudGlsTmV4dFRhc2soJmR1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR2V0RGF0YUhhbmRsZXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudCBfcnY7Ci0JSGFuZGxlIGRhdGFSZWY7Ci0JT1NUeXBlIGRhdGFIYW5kbGVyU3ViVHlwZTsKLQlsb25nIGZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnQgX3J2OworICAgIEhhbmRsZSBkYXRhUmVmOworICAgIE9TVHlwZSBkYXRhSGFuZGxlclN1YlR5cGU7CisgICAgbG9uZyBmbGFnczsKICNpZm5kZWYgR2V0RGF0YUhhbmRsZXIKLQlQeU1hY19QUkVDSEVDSyhHZXREYXRhSGFuZGxlcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUhhbmRsZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRhdGFIYW5kbGVyU3ViVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0RGF0YUhhbmRsZXIoZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICBkYXRhSGFuZGxlclN1YlR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ21wT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGF0YUhhbmRsZXJTdWJUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXREYXRhSGFuZGxlcihkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFIYW5kbGVyU3ViVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDbXBPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1Bhc3RlSGFuZGxlSW50b01vdmllKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUhhbmRsZSBoOwotCU9TVHlwZSBoYW5kbGVUeXBlOwotCU1vdmllIHRoZU1vdmllOwotCWxvbmcgZmxhZ3M7Ci0JQ29tcG9uZW50SW5zdGFuY2UgdXNlckNvbXA7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSGFuZGxlIGg7CisgICAgT1NUeXBlIGhhbmRsZVR5cGU7CisgICAgTW92aWUgdGhlTW92aWU7CisgICAgbG9uZyBmbGFnczsKKyAgICBDb21wb25lbnRJbnN0YW5jZSB1c2VyQ29tcDsKICNpZm5kZWYgUGFzdGVIYW5kbGVJbnRvTW92aWUKLQlQeU1hY19QUkVDSEVDSyhQYXN0ZUhhbmRsZUludG9Nb3ZpZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUGFzdGVIYW5kbGVJbnRvTW92aWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mbE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZoLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZoYW5kbGVUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9Db252ZXJ0LCAmdGhlTW92aWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdXNlckNvbXApKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUGFzdGVIYW5kbGVJbnRvTW92aWUoaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlTW92aWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyQ29tcCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mbE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZoYW5kbGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9Db252ZXJ0LCAmdGhlTW92aWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdXNlckNvbXApKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUGFzdGVIYW5kbGVJbnRvTW92aWUoaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlTW92aWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyQ29tcCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR2V0TW92aWVJbXBvcnRlckZvckRhdGFSZWYoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JT1NUeXBlIGRhdGFSZWZUeXBlOwotCUhhbmRsZSBkYXRhUmVmOwotCWxvbmcgZmxhZ3M7Ci0JQ29tcG9uZW50IGltcG9ydGVyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIE9TVHlwZSBkYXRhUmVmVHlwZTsKKyAgICBIYW5kbGUgZGF0YVJlZjsKKyAgICBsb25nIGZsYWdzOworICAgIENvbXBvbmVudCBpbXBvcnRlcjsKICNpZm5kZWYgR2V0TW92aWVJbXBvcnRlckZvckRhdGFSZWYKLQlQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZUltcG9ydGVyRm9yRGF0YVJlZik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVJbXBvcnRlckZvckRhdGFSZWYpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkYXRhUmVmVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0TW92aWVJbXBvcnRlckZvckRhdGFSZWYoZGF0YVJlZlR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW1wb3J0ZXIpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDbXBPYmpfTmV3LCBpbXBvcnRlcik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkYXRhUmVmVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0TW92aWVJbXBvcnRlckZvckRhdGFSZWYoZGF0YVJlZlR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW1wb3J0ZXIpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDbXBPYmpfTmV3LCBpbXBvcnRlcik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfUVRHZXRNSU1FVHlwZUluZm8oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JY2hhciogbWltZVN0cmluZ1N0YXJ0OwotCXNob3J0IG1pbWVTdHJpbmdMZW5ndGg7Ci0JT1NUeXBlIGluZm9TZWxlY3RvcjsKLQl2b2lkICogaW5mb0RhdGFQdHI7Ci0JbG9uZyBpbmZvRGF0YVNpemU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgY2hhciogbWltZVN0cmluZ1N0YXJ0OworICAgIHNob3J0IG1pbWVTdHJpbmdMZW5ndGg7CisgICAgT1NUeXBlIGluZm9TZWxlY3RvcjsKKyAgICB2b2lkICogaW5mb0RhdGFQdHI7CisgICAgbG9uZyBpbmZvRGF0YVNpemU7CiAjaWZuZGVmIFFUR2V0TUlNRVR5cGVJbmZvCi0JUHlNYWNfUFJFQ0hFQ0soUVRHZXRNSU1FVHlwZUluZm8pOworICAgIFB5TWFjX1BSRUNIRUNLKFFUR2V0TUlNRVR5cGVJbmZvKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInNoTyZzIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1pbWVTdHJpbmdTdGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1pbWVTdHJpbmdMZW5ndGgsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmluZm9TZWxlY3RvciwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluZm9EYXRhUHRyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFFUR2V0TUlNRVR5cGVJbmZvKG1pbWVTdHJpbmdTdGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgbWltZVN0cmluZ0xlbmd0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb1NlbGVjdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvRGF0YVB0ciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJmluZm9EYXRhU2l6ZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgaW5mb0RhdGFTaXplKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzaE8mcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtaW1lU3RyaW5nU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtaW1lU3RyaW5nTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpbmZvU2VsZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmZvRGF0YVB0cikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBRVEdldE1JTUVUeXBlSW5mbyhtaW1lU3RyaW5nU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbWVTdHJpbmdMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9TZWxlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb0RhdGFQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmZvRGF0YVNpemUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9EYXRhU2l6ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVHJhY2tUaW1lVG9NZWRpYVRpbWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVRpbWVWYWx1ZSBfcnY7Ci0JVGltZVZhbHVlIHZhbHVlOwotCVRyYWNrIHRoZVRyYWNrOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBUaW1lVmFsdWUgX3J2OworICAgIFRpbWVWYWx1ZSB2YWx1ZTsKKyAgICBUcmFjayB0aGVUcmFjazsKICNpZm5kZWYgVHJhY2tUaW1lVG9NZWRpYVRpbWUKLQlQeU1hY19QUkVDSEVDSyhUcmFja1RpbWVUb01lZGlhVGltZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVHJhY2tUaW1lVG9NZWRpYVRpbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlLAotCSAgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9Db252ZXJ0LCAmdGhlVHJhY2spKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBUcmFja1RpbWVUb01lZGlhVGltZSh2YWx1ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVUcmFjayk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9Db252ZXJ0LCAmdGhlVHJhY2spKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBUcmFja1RpbWVUb01lZGlhVGltZSh2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVUcmFjayk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTmV3VXNlckRhdGEoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JVXNlckRhdGEgdGhlVXNlckRhdGE7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgVXNlckRhdGEgdGhlVXNlckRhdGE7CiAjaWZuZGVmIE5ld1VzZXJEYXRhCi0JUHlNYWNfUFJFQ0hFQ0soTmV3VXNlckRhdGEpOworICAgIFB5TWFjX1BSRUNIRUNLKE5ld1VzZXJEYXRhKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gTmV3VXNlckRhdGEoJnRoZVVzZXJEYXRhKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgVXNlckRhdGFPYmpfTmV3LCB0aGVVc2VyRGF0YSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBOZXdVc2VyRGF0YSgmdGhlVXNlckRhdGEpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBVc2VyRGF0YU9ial9OZXcsIHRoZVVzZXJEYXRhKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9OZXdVc2VyRGF0YUZyb21IYW5kbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSGFuZGxlIGg7Ci0JVXNlckRhdGEgdGhlVXNlckRhdGE7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSGFuZGxlIGg7CisgICAgVXNlckRhdGEgdGhlVXNlckRhdGE7CiAjaWZuZGVmIE5ld1VzZXJEYXRhRnJvbUhhbmRsZQotCVB5TWFjX1BSRUNIRUNLKE5ld1VzZXJEYXRhRnJvbUhhbmRsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTmV3VXNlckRhdGFGcm9tSGFuZGxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IE5ld1VzZXJEYXRhRnJvbUhhbmRsZShoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZVVzZXJEYXRhKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgVXNlckRhdGFPYmpfTmV3LCB0aGVVc2VyRGF0YSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gTmV3VXNlckRhdGFGcm9tSGFuZGxlKGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlVXNlckRhdGEpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBVc2VyRGF0YU9ial9OZXcsIHRoZVVzZXJEYXRhKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9DcmVhdGVNb3ZpZUZpbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JRlNTcGVjIGZpbGVTcGVjOwotCU9TVHlwZSBjcmVhdG9yOwotCVNjcmlwdENvZGUgc2NyaXB0VGFnOwotCWxvbmcgY3JlYXRlTW92aWVGaWxlRmxhZ3M7Ci0Jc2hvcnQgcmVzUmVmTnVtOwotCU1vdmllIG5ld21vdmllOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEZTU3BlYyBmaWxlU3BlYzsKKyAgICBPU1R5cGUgY3JlYXRvcjsKKyAgICBTY3JpcHRDb2RlIHNjcmlwdFRhZzsKKyAgICBsb25nIGNyZWF0ZU1vdmllRmlsZUZsYWdzOworICAgIHNob3J0IHJlc1JlZk51bTsKKyAgICBNb3ZpZSBuZXdtb3ZpZTsKICNpZm5kZWYgQ3JlYXRlTW92aWVGaWxlCi0JUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlTW92aWVGaWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDcmVhdGVNb3ZpZUZpbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmhsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmZmlsZVNwZWMsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNyZWF0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgICZzY3JpcHRUYWcsCi0JICAgICAgICAgICAgICAgICAgICAgICZjcmVhdGVNb3ZpZUZpbGVGbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDcmVhdGVNb3ZpZUZpbGUoJmZpbGVTcGVjLAotCSAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRvciwKLQkgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdFRhZywKLQkgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZU1vdmllRmlsZUZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAgJnJlc1JlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgICZuZXdtb3ZpZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICByZXNSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfTmV3LCBuZXdtb3ZpZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmhsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmZmlsZVNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzY3JpcHRUYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjcmVhdGVNb3ZpZUZpbGVGbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDcmVhdGVNb3ZpZUZpbGUoJmZpbGVTcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdFRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZU1vdmllRmlsZUZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc1JlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXdtb3ZpZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZXNSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfTmV3LCBuZXdtb3ZpZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfT3Blbk1vdmllRmlsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlGU1NwZWMgZmlsZVNwZWM7Ci0Jc2hvcnQgcmVzUmVmTnVtOwotCVNJbnQ4IHBlcm1pc3Npb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgRlNTcGVjIGZpbGVTcGVjOworICAgIHNob3J0IHJlc1JlZk51bTsKKyAgICBTSW50OCBwZXJtaXNzaW9uOwogI2lmbmRlZiBPcGVuTW92aWVGaWxlCi0JUHlNYWNfUFJFQ0hFQ0soT3Blbk1vdmllRmlsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soT3Blbk1vdmllRmlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmIiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZmaWxlU3BlYywKLQkgICAgICAgICAgICAgICAgICAgICAgJnBlcm1pc3Npb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gT3Blbk1vdmllRmlsZSgmZmlsZVNwZWMsCi0JICAgICAgICAgICAgICAgICAgICAgJnJlc1JlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICBwZXJtaXNzaW9uKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICByZXNSZWZOdW0pOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJmZpbGVTcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGVybWlzc2lvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBPcGVuTW92aWVGaWxlKCZmaWxlU3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzUmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBlcm1pc3Npb24pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlc1JlZk51bSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfQ2xvc2VNb3ZpZUZpbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0Jc2hvcnQgcmVzUmVmTnVtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIHNob3J0IHJlc1JlZk51bTsKICNpZm5kZWYgQ2xvc2VNb3ZpZUZpbGUKLQlQeU1hY19QUkVDSEVDSyhDbG9zZU1vdmllRmlsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ2xvc2VNb3ZpZUZpbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZXNSZWZOdW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ2xvc2VNb3ZpZUZpbGUocmVzUmVmTnVtKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc1JlZk51bSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDbG9zZU1vdmllRmlsZShyZXNSZWZOdW0pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RlbGV0ZU1vdmllRmlsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlGU1NwZWMgZmlsZVNwZWM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgRlNTcGVjIGZpbGVTcGVjOwogI2lmbmRlZiBEZWxldGVNb3ZpZUZpbGUKLQlQeU1hY19QUkVDSEVDSyhEZWxldGVNb3ZpZUZpbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKERlbGV0ZU1vdmllRmlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJmZpbGVTcGVjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IERlbGV0ZU1vdmllRmlsZSgmZmlsZVNwZWMpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmZmlsZVNwZWMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRGVsZXRlTW92aWVGaWxlKCZmaWxlU3BlYyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTmV3TW92aWVGcm9tRmlsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlNb3ZpZSB0aGVNb3ZpZTsKLQlzaG9ydCByZXNSZWZOdW07Ci0Jc2hvcnQgcmVzSWQ7Ci0Jc2hvcnQgbmV3TW92aWVGbGFnczsKLQlCb29sZWFuIGRhdGFSZWZXYXNDaGFuZ2VkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIE1vdmllIHRoZU1vdmllOworICAgIHNob3J0IHJlc1JlZk51bTsKKyAgICBzaG9ydCByZXNJZDsKKyAgICBzaG9ydCBuZXdNb3ZpZUZsYWdzOworICAgIEJvb2xlYW4gZGF0YVJlZldhc0NoYW5nZWQ7CiAjaWZuZGVmIE5ld01vdmllRnJvbUZpbGUKLQlQeU1hY19QUkVDSEVDSyhOZXdNb3ZpZUZyb21GaWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhOZXdNb3ZpZUZyb21GaWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZXNSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICZyZXNJZCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm5ld01vdmllRmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gTmV3TW92aWVGcm9tRmlsZSgmdGhlTW92aWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgcmVzUmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICZyZXNJZCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAoU3RyaW5nUHRyKTAsCi0JICAgICAgICAgICAgICAgICAgICAgICAgbmV3TW92aWVGbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVJlZldhc0NoYW5nZWQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8maGIiLAotCSAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX05ldywgdGhlTW92aWUsCi0JICAgICAgICAgICAgICAgICAgICAgcmVzSWQsCi0JICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZldhc0NoYW5nZWQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXNSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXNJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld01vdmllRmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gTmV3TW92aWVGcm9tRmlsZSgmdGhlTW92aWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzUmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXNJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU3RyaW5nUHRyKTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TW92aWVGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVJlZldhc0NoYW5nZWQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8maGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX05ldywgdGhlTW92aWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVzSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZldhc0NoYW5nZWQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X05ld01vdmllRnJvbUhhbmRsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlNb3ZpZSB0aGVNb3ZpZTsKLQlIYW5kbGUgaDsKLQlzaG9ydCBuZXdNb3ZpZUZsYWdzOwotCUJvb2xlYW4gZGF0YVJlZldhc0NoYW5nZWQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgTW92aWUgdGhlTW92aWU7CisgICAgSGFuZGxlIGg7CisgICAgc2hvcnQgbmV3TW92aWVGbGFnczsKKyAgICBCb29sZWFuIGRhdGFSZWZXYXNDaGFuZ2VkOwogI2lmbmRlZiBOZXdNb3ZpZUZyb21IYW5kbGUKLQlQeU1hY19QUkVDSEVDSyhOZXdNb3ZpZUZyb21IYW5kbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKE5ld01vdmllRnJvbUhhbmRsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmgsCi0JICAgICAgICAgICAgICAgICAgICAgICZuZXdNb3ZpZUZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IE5ld01vdmllRnJvbUhhbmRsZSgmdGhlTW92aWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TW92aWVGbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUmVmV2FzQ2hhbmdlZCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZiIiwKLQkgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9OZXcsIHRoZU1vdmllLAotCSAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWZXYXNDaGFuZ2VkKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXdNb3ZpZUZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IE5ld01vdmllRnJvbUhhbmRsZSgmdGhlTW92aWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TW92aWVGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUmVmV2FzQ2hhbmdlZCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9OZXcsIHRoZU1vdmllLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWZXYXNDaGFuZ2VkKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9OZXdNb3ZpZUZyb21EYXRhRm9yayhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlNb3ZpZSB0aGVNb3ZpZTsKLQlzaG9ydCBmUmVmTnVtOwotCWxvbmcgZmlsZU9mZnNldDsKLQlzaG9ydCBuZXdNb3ZpZUZsYWdzOwotCUJvb2xlYW4gZGF0YVJlZldhc0NoYW5nZWQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgTW92aWUgdGhlTW92aWU7CisgICAgc2hvcnQgZlJlZk51bTsKKyAgICBsb25nIGZpbGVPZmZzZXQ7CisgICAgc2hvcnQgbmV3TW92aWVGbGFnczsKKyAgICBCb29sZWFuIGRhdGFSZWZXYXNDaGFuZ2VkOwogI2lmbmRlZiBOZXdNb3ZpZUZyb21EYXRhRm9yawotCVB5TWFjX1BSRUNIRUNLKE5ld01vdmllRnJvbURhdGFGb3JrKTsKKyAgICBQeU1hY19QUkVDSEVDSyhOZXdNb3ZpZUZyb21EYXRhRm9yayk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobGgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZlJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZpbGVPZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICZuZXdNb3ZpZUZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IE5ld01vdmllRnJvbURhdGFGb3JrKCZ0aGVNb3ZpZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgZlJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZU9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TW92aWVGbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFSZWZXYXNDaGFuZ2VkKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmIiLAotCSAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX05ldywgdGhlTW92aWUsCi0JICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZldhc0NoYW5nZWQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmUmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlsZU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld01vdmllRmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gTmV3TW92aWVGcm9tRGF0YUZvcmsoJnRoZU1vdmllLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmUmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdNb3ZpZUZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVJlZldhc0NoYW5nZWQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfTmV3LCB0aGVNb3ZpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmV2FzQ2hhbmdlZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTmV3TW92aWVGcm9tRGF0YUZvcms2NChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlNb3ZpZSB0aGVNb3ZpZTsKLQlsb25nIGZSZWZOdW07Ci0Jd2lkZSBmaWxlT2Zmc2V0OwotCXNob3J0IG5ld01vdmllRmxhZ3M7Ci0JQm9vbGVhbiBkYXRhUmVmV2FzQ2hhbmdlZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBNb3ZpZSB0aGVNb3ZpZTsKKyAgICBsb25nIGZSZWZOdW07CisgICAgd2lkZSBmaWxlT2Zmc2V0OworICAgIHNob3J0IG5ld01vdmllRmxhZ3M7CisgICAgQm9vbGVhbiBkYXRhUmVmV2FzQ2hhbmdlZDsKICNpZm5kZWYgTmV3TW92aWVGcm9tRGF0YUZvcms2NAotCVB5TWFjX1BSRUNIRUNLKE5ld01vdmllRnJvbURhdGFGb3JrNjQpOworICAgIFB5TWFjX1BSRUNIRUNLKE5ld01vdmllRnJvbURhdGFGb3JrNjQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZmUmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXR3aWRlLCAmZmlsZU9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm5ld01vdmllRmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gTmV3TW92aWVGcm9tRGF0YUZvcms2NCgmdGhlTW92aWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZlJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlsZU9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdNb3ZpZUZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUmVmV2FzQ2hhbmdlZCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZiIiwKLQkgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9OZXcsIHRoZU1vdmllLAotCSAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWZXYXNDaGFuZ2VkKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldHdpZGUsICZmaWxlT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbmV3TW92aWVGbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBOZXdNb3ZpZUZyb21EYXRhRm9yazY0KCZ0aGVNb3ZpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmUmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWxlT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld01vdmllRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFSZWZXYXNDaGFuZ2VkKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX05ldywgdGhlTW92aWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZldhc0NoYW5nZWQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X05ld01vdmllRnJvbURhdGFSZWYoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JTW92aWUgbTsKLQlzaG9ydCBmbGFnczsKLQlzaG9ydCBpZDsKLQlIYW5kbGUgZGF0YVJlZjsKLQlPU1R5cGUgZHRhUmVmVHlwZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBNb3ZpZSBtOworICAgIHNob3J0IGZsYWdzOworICAgIHNob3J0IGlkOworICAgIEhhbmRsZSBkYXRhUmVmOworICAgIE9TVHlwZSBkdGFSZWZUeXBlOwogI2lmbmRlZiBOZXdNb3ZpZUZyb21EYXRhUmVmCi0JUHlNYWNfUFJFQ0hFQ0soTmV3TW92aWVGcm9tRGF0YVJlZik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTmV3TW92aWVGcm9tRGF0YVJlZik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkdGFSZWZUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IE5ld01vdmllRnJvbURhdGFSZWYoJm0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlkLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgZHRhUmVmVHlwZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9OZXcsIG0sCi0JICAgICAgICAgICAgICAgICAgICAgaWQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmR0YVJlZlR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gTmV3TW92aWVGcm9tRGF0YVJlZigmbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdGFSZWZUeXBlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX05ldywgbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTmV3TW92aWVGcm9tU3RvcmFnZU9mZnNldChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlNb3ZpZSB0aGVNb3ZpZTsKLQlEYXRhSGFuZGxlciBkaDsKLQl3aWRlIGZpbGVPZmZzZXQ7Ci0Jc2hvcnQgbmV3TW92aWVGbGFnczsKLQlCb29sZWFuIGRhdGFSZWZXYXNDYXRhUmVmVHlwZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBNb3ZpZSB0aGVNb3ZpZTsKKyAgICBEYXRhSGFuZGxlciBkaDsKKyAgICB3aWRlIGZpbGVPZmZzZXQ7CisgICAgc2hvcnQgbmV3TW92aWVGbGFnczsKKyAgICBCb29sZWFuIGRhdGFSZWZXYXNDYXRhUmVmVHlwZTsKICNpZm5kZWYgTmV3TW92aWVGcm9tU3RvcmFnZU9mZnNldAotCVB5TWFjX1BSRUNIRUNLKE5ld01vdmllRnJvbVN0b3JhZ2VPZmZzZXQpOworICAgIFB5TWFjX1BSRUNIRUNLKE5ld01vdmllRnJvbVN0b3JhZ2VPZmZzZXQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0d2lkZSwgJmZpbGVPZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICZuZXdNb3ZpZUZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IE5ld01vdmllRnJvbVN0b3JhZ2VPZmZzZXQoJnRoZU1vdmllLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWxlT2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld01vdmllRmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFSZWZXYXNDYXRhUmVmVHlwZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZiIiwKLQkgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9OZXcsIHRoZU1vdmllLAotCSAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWZXYXNDYXRhUmVmVHlwZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0d2lkZSwgJmZpbGVPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXdNb3ZpZUZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IE5ld01vdmllRnJvbVN0b3JhZ2VPZmZzZXQoJnRoZU1vdmllLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWxlT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld01vdmllRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFSZWZXYXNDYXRhUmVmVHlwZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9OZXcsIHRoZU1vdmllLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWZXYXNDYXRhUmVmVHlwZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTmV3TW92aWVGb3JEYXRhUmVmRnJvbUhhbmRsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlNb3ZpZSB0aGVNb3ZpZTsKLQlIYW5kbGUgaDsKLQlzaG9ydCBuZXdNb3ZpZUZsYWdzOwotCUJvb2xlYW4gZGF0YVJlZldhc0NoYW5nZWQ7Ci0JSGFuZGxlIGRhdGFSZWY7Ci0JT1NUeXBlIGRhdGFSZWZUeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIE1vdmllIHRoZU1vdmllOworICAgIEhhbmRsZSBoOworICAgIHNob3J0IG5ld01vdmllRmxhZ3M7CisgICAgQm9vbGVhbiBkYXRhUmVmV2FzQ2hhbmdlZDsKKyAgICBIYW5kbGUgZGF0YVJlZjsKKyAgICBPU1R5cGUgZGF0YVJlZlR5cGU7CiAjaWZuZGVmIE5ld01vdmllRm9yRGF0YVJlZkZyb21IYW5kbGUKLQlQeU1hY19QUkVDSEVDSyhOZXdNb3ZpZUZvckRhdGFSZWZGcm9tSGFuZGxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhOZXdNb3ZpZUZvckRhdGFSZWZGcm9tSGFuZGxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maE8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmgsCi0JICAgICAgICAgICAgICAgICAgICAgICZuZXdNb3ZpZUZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRhdGFSZWZUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IE5ld01vdmllRm9yRGF0YVJlZkZyb21IYW5kbGUoJnRoZU1vdmllLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TW92aWVGbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVJlZldhc0NoYW5nZWQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmVHlwZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZiIiwKLQkgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9OZXcsIHRoZU1vdmllLAotCSAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWZXYXNDaGFuZ2VkKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbmV3TW92aWVGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkYXRhUmVmVHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBOZXdNb3ZpZUZvckRhdGFSZWZGcm9tSGFuZGxlKCZ0aGVNb3ZpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld01vdmllRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFSZWZXYXNDaGFuZ2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZlR5cGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfTmV3LCB0aGVNb3ZpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmV2FzQ2hhbmdlZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfUmVtb3ZlTW92aWVSZXNvdXJjZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlzaG9ydCByZXNSZWZOdW07Ci0Jc2hvcnQgcmVzSWQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgc2hvcnQgcmVzUmVmTnVtOworICAgIHNob3J0IHJlc0lkOwogI2lmbmRlZiBSZW1vdmVNb3ZpZVJlc291cmNlCi0JUHlNYWNfUFJFQ0hFQ0soUmVtb3ZlTW92aWVSZXNvdXJjZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUmVtb3ZlTW92aWVSZXNvdXJjZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZXNSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICZyZXNJZCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBSZW1vdmVNb3ZpZVJlc291cmNlKHJlc1JlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNJZCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzUmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzSWQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUmVtb3ZlTW92aWVSZXNvdXJjZShyZXNSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzSWQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0NyZWF0ZU1vdmllU3RvcmFnZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlIYW5kbGUgZGF0YVJlZjsKLQlPU1R5cGUgZGF0YVJlZlR5cGU7Ci0JT1NUeXBlIGNyZWF0b3I7Ci0JU2NyaXB0Q29kZSBzY3JpcHRUYWc7Ci0JbG9uZyBjcmVhdGVNb3ZpZUZpbGVGbGFnczsKLQlEYXRhSGFuZGxlciBvdXREYXRhSGFuZGxlcjsKLQlNb3ZpZSBuZXdtb3ZpZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBIYW5kbGUgZGF0YVJlZjsKKyAgICBPU1R5cGUgZGF0YVJlZlR5cGU7CisgICAgT1NUeXBlIGNyZWF0b3I7CisgICAgU2NyaXB0Q29kZSBzY3JpcHRUYWc7CisgICAgbG9uZyBjcmVhdGVNb3ZpZUZpbGVGbGFnczsKKyAgICBEYXRhSGFuZGxlciBvdXREYXRhSGFuZGxlcjsKKyAgICBNb3ZpZSBuZXdtb3ZpZTsKICNpZm5kZWYgQ3JlYXRlTW92aWVTdG9yYWdlCi0JUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlTW92aWVTdG9yYWdlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDcmVhdGVNb3ZpZVN0b3JhZ2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8maGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRhdGFSZWZUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2NyaXB0VGFnLAotCSAgICAgICAgICAgICAgICAgICAgICAmY3JlYXRlTW92aWVGaWxlRmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ3JlYXRlTW92aWVTdG9yYWdlKGRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRUYWcsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVNb3ZpZUZpbGVGbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXREYXRhSGFuZGxlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXdtb3ZpZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9OZXcsIG91dERhdGFIYW5kbGVyLAotCSAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX05ldywgbmV3bW92aWUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmhsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkYXRhUmVmVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNjcmlwdFRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNyZWF0ZU1vdmllRmlsZUZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENyZWF0ZU1vdmllU3RvcmFnZShkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZlR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0VGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlTW92aWVGaWxlRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0RGF0YUhhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmV3bW92aWUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfTmV3LCBvdXREYXRhSGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9OZXcsIG5ld21vdmllKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9PcGVuTW92aWVTdG9yYWdlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUhhbmRsZSBkYXRhUmVmOwotCU9TVHlwZSBkYXRhUmVmVHlwZTsKLQlsb25nIGZsYWdzOwotCURhdGFIYW5kbGVyIG91dERhdGFIYW5kbGVyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEhhbmRsZSBkYXRhUmVmOworICAgIE9TVHlwZSBkYXRhUmVmVHlwZTsKKyAgICBsb25nIGZsYWdzOworICAgIERhdGFIYW5kbGVyIG91dERhdGFIYW5kbGVyOwogI2lmbmRlZiBPcGVuTW92aWVTdG9yYWdlCi0JUHlNYWNfUFJFQ0hFQ0soT3Blbk1vdmllU3RvcmFnZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soT3Blbk1vdmllU3RvcmFnZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGF0YVJlZlR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBPcGVuTW92aWVTdG9yYWdlKGRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZlR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgJm91dERhdGFIYW5kbGVyKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9OZXcsIG91dERhdGFIYW5kbGVyKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGF0YVJlZlR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBPcGVuTW92aWVTdG9yYWdlKGRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZlR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dERhdGFIYW5kbGVyKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9OZXcsIG91dERhdGFIYW5kbGVyKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9DbG9zZU1vdmllU3RvcmFnZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlEYXRhSGFuZGxlciBkaDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBEYXRhSGFuZGxlciBkaDsKICNpZm5kZWYgQ2xvc2VNb3ZpZVN0b3JhZ2UKLQlQeU1hY19QUkVDSEVDSyhDbG9zZU1vdmllU3RvcmFnZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ2xvc2VNb3ZpZVN0b3JhZ2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDbG9zZU1vdmllU3RvcmFnZShkaCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDbG9zZU1vdmllU3RvcmFnZShkaCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGVsZXRlTW92aWVTdG9yYWdlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUhhbmRsZSBkYXRhUmVmOwotCU9TVHlwZSBkYXRhUmVmVHlwZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBIYW5kbGUgZGF0YVJlZjsKKyAgICBPU1R5cGUgZGF0YVJlZlR5cGU7CiAjaWZuZGVmIERlbGV0ZU1vdmllU3RvcmFnZQotCVB5TWFjX1BSRUNIRUNLKERlbGV0ZU1vdmllU3RvcmFnZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGVsZXRlTW92aWVTdG9yYWdlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRhdGFSZWZUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IERlbGV0ZU1vdmllU3RvcmFnZShkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZlR5cGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRhdGFSZWZUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IERlbGV0ZU1vdmllU3RvcmFnZShkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZlR5cGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0NyZWF0ZVNob3J0Y3V0TW92aWVGaWxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUZTU3BlYyBmaWxlU3BlYzsKLQlPU1R5cGUgY3JlYXRvcjsKLQlTY3JpcHRDb2RlIHNjcmlwdFRhZzsKLQlsb25nIGNyZWF0ZU1vdmllRmlsZUZsYWdzOwotCUhhbmRsZSB0YXJnZXREYXRhUmVmOwotCU9TVHlwZSB0YXJnZXREYXRhUmVmVHlwZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBGU1NwZWMgZmlsZVNwZWM7CisgICAgT1NUeXBlIGNyZWF0b3I7CisgICAgU2NyaXB0Q29kZSBzY3JpcHRUYWc7CisgICAgbG9uZyBjcmVhdGVNb3ZpZUZpbGVGbGFnczsKKyAgICBIYW5kbGUgdGFyZ2V0RGF0YVJlZjsKKyAgICBPU1R5cGUgdGFyZ2V0RGF0YVJlZlR5cGU7CiAjaWZuZGVmIENyZWF0ZVNob3J0Y3V0TW92aWVGaWxlCi0JUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlU2hvcnRjdXRNb3ZpZUZpbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKENyZWF0ZVNob3J0Y3V0TW92aWVGaWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZobE8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZmaWxlU3BlYywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY3JlYXRvciwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNjcmlwdFRhZywKLQkgICAgICAgICAgICAgICAgICAgICAgJmNyZWF0ZU1vdmllRmlsZUZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRhcmdldERhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRhcmdldERhdGFSZWZUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENyZWF0ZVNob3J0Y3V0TW92aWVGaWxlKCZmaWxlU3BlYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRvciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0VGFnLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVNb3ZpZUZpbGVGbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0RGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0RGF0YVJlZlR5cGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZobE8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZmaWxlU3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNjcmlwdFRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNyZWF0ZU1vdmllRmlsZUZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRhcmdldERhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRhcmdldERhdGFSZWZUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENyZWF0ZVNob3J0Y3V0TW92aWVGaWxlKCZmaWxlU3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0VGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVNb3ZpZUZpbGVGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0RGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0RGF0YVJlZlR5cGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0NhblF1aWNrVGltZU9wZW5GaWxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUZTU3BlYyBmaWxlU3BlYzsKLQlPU1R5cGUgZmlsZVR5cGU7Ci0JT1NUeXBlIGZpbGVOYW1lRXh0ZW5zaW9uOwotCUJvb2xlYW4gb3V0Q2FuT3BlbldpdGhHcmFwaGljc0ltcG9ydGVyOwotCUJvb2xlYW4gb3V0Q2FuT3BlbkFzTW92aWU7Ci0JQm9vbGVhbiBvdXRQcmVmZXJHcmFwaGljc0ltcG9ydGVyOwotCVVJbnQzMiBpbkZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEZTU3BlYyBmaWxlU3BlYzsKKyAgICBPU1R5cGUgZmlsZVR5cGU7CisgICAgT1NUeXBlIGZpbGVOYW1lRXh0ZW5zaW9uOworICAgIEJvb2xlYW4gb3V0Q2FuT3BlbldpdGhHcmFwaGljc0ltcG9ydGVyOworICAgIEJvb2xlYW4gb3V0Q2FuT3BlbkFzTW92aWU7CisgICAgQm9vbGVhbiBvdXRQcmVmZXJHcmFwaGljc0ltcG9ydGVyOworICAgIFVJbnQzMiBpbkZsYWdzOwogI2lmbmRlZiBDYW5RdWlja1RpbWVPcGVuRmlsZQotCVB5TWFjX1BSRUNIRUNLKENhblF1aWNrVGltZU9wZW5GaWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDYW5RdWlja1RpbWVPcGVuRmlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmZmlsZVNwZWMsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmZpbGVUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZmaWxlTmFtZUV4dGVuc2lvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluRmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ2FuUXVpY2tUaW1lT3BlbkZpbGUoJmZpbGVTcGVjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWVFeHRlbnNpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDYW5PcGVuV2l0aEdyYXBoaWNzSW1wb3J0ZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDYW5PcGVuQXNNb3ZpZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFByZWZlckdyYXBoaWNzSW1wb3J0ZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRmxhZ3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImJiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0Q2FuT3BlbldpdGhHcmFwaGljc0ltcG9ydGVyLAotCSAgICAgICAgICAgICAgICAgICAgIG91dENhbk9wZW5Bc01vdmllLAotCSAgICAgICAgICAgICAgICAgICAgIG91dFByZWZlckdyYXBoaWNzSW1wb3J0ZXIpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZmaWxlU3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZmlsZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmZpbGVOYW1lRXh0ZW5zaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5GbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDYW5RdWlja1RpbWVPcGVuRmlsZSgmZmlsZVNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZUV4dGVuc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENhbk9wZW5XaXRoR3JhcGhpY3NJbXBvcnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENhbk9wZW5Bc01vdmllLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0UHJlZmVyR3JhcGhpY3NJbXBvcnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5GbGFncyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYmJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRDYW5PcGVuV2l0aEdyYXBoaWNzSW1wb3J0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0Q2FuT3BlbkFzTW92aWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0UHJlZmVyR3JhcGhpY3NJbXBvcnRlcik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfQ2FuUXVpY2tUaW1lT3BlbkRhdGFSZWYoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSGFuZGxlIGRhdGFSZWY7Ci0JT1NUeXBlIGRhdGFSZWZUeXBlOwotCUJvb2xlYW4gb3V0Q2FuT3BlbldpdGhHcmFwaGljc0ltcG9ydGVyOwotCUJvb2xlYW4gb3V0Q2FuT3BlbkFzTW92aWU7Ci0JQm9vbGVhbiBvdXRQcmVmZXJHcmFwaGljc0ltcG9ydGVyOwotCVVJbnQzMiBpbkZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEhhbmRsZSBkYXRhUmVmOworICAgIE9TVHlwZSBkYXRhUmVmVHlwZTsKKyAgICBCb29sZWFuIG91dENhbk9wZW5XaXRoR3JhcGhpY3NJbXBvcnRlcjsKKyAgICBCb29sZWFuIG91dENhbk9wZW5Bc01vdmllOworICAgIEJvb2xlYW4gb3V0UHJlZmVyR3JhcGhpY3NJbXBvcnRlcjsKKyAgICBVSW50MzIgaW5GbGFnczsKICNpZm5kZWYgQ2FuUXVpY2tUaW1lT3BlbkRhdGFSZWYKLQlQeU1hY19QUkVDSEVDSyhDYW5RdWlja1RpbWVPcGVuRGF0YVJlZik7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ2FuUXVpY2tUaW1lT3BlbkRhdGFSZWYpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRhdGFSZWZUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5GbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDYW5RdWlja1RpbWVPcGVuRGF0YVJlZihkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENhbk9wZW5XaXRoR3JhcGhpY3NJbXBvcnRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENhbk9wZW5Bc01vdmllLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0UHJlZmVyR3JhcGhpY3NJbXBvcnRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5GbGFncyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYmJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRDYW5PcGVuV2l0aEdyYXBoaWNzSW1wb3J0ZXIsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0Q2FuT3BlbkFzTW92aWUsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0UHJlZmVyR3JhcGhpY3NJbXBvcnRlcik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRhdGFSZWZUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5GbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDYW5RdWlja1RpbWVPcGVuRGF0YVJlZihkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENhbk9wZW5XaXRoR3JhcGhpY3NJbXBvcnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENhbk9wZW5Bc01vdmllLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0UHJlZmVyR3JhcGhpY3NJbXBvcnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5GbGFncyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYmJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRDYW5PcGVuV2l0aEdyYXBoaWNzSW1wb3J0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0Q2FuT3BlbkFzTW92aWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0UHJlZmVyR3JhcGhpY3NJbXBvcnRlcik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTmV3TW92aWVGcm9tU2NyYXAoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU1vdmllIF9ydjsKLQlsb25nIG5ld01vdmllRmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE1vdmllIF9ydjsKKyAgICBsb25nIG5ld01vdmllRmxhZ3M7CiAjaWZuZGVmIE5ld01vdmllRnJvbVNjcmFwCi0JUHlNYWNfUFJFQ0hFQ0soTmV3TW92aWVGcm9tU2NyYXApOworICAgIFB5TWFjX1BSRUNIRUNLKE5ld01vdmllRnJvbVNjcmFwKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmbmV3TW92aWVGbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE5ld01vdmllRnJvbVNjcmFwKG5ld01vdmllRmxhZ3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbmV3TW92aWVGbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE5ld01vdmllRnJvbVNjcmFwKG5ld01vdmllRmxhZ3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1FUTmV3QWxpYXMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JRlNTcGVjIGZzczsKLQlBbGlhc0hhbmRsZSBhbGlhczsKLQlCb29sZWFuIG1pbmltYWw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgRlNTcGVjIGZzczsKKyAgICBBbGlhc0hhbmRsZSBhbGlhczsKKyAgICBCb29sZWFuIG1pbmltYWw7CiAjaWZuZGVmIFFUTmV3QWxpYXMKLQlQeU1hY19QUkVDSEVDSyhRVE5ld0FsaWFzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhRVE5ld0FsaWFzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJmZzcywKLQkgICAgICAgICAgICAgICAgICAgICAgJm1pbmltYWwpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUVROZXdBbGlhcygmZnNzLAotCSAgICAgICAgICAgICAgICAgICZhbGlhcywKLQkgICAgICAgICAgICAgICAgICBtaW5pbWFsKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgYWxpYXMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJmZzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1pbmltYWwpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUVROZXdBbGlhcygmZnNzLAorICAgICAgICAgICAgICAgICAgICAgICZhbGlhcywKKyAgICAgICAgICAgICAgICAgICAgICBtaW5pbWFsKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgYWxpYXMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0VuZEZ1bGxTY3JlZW4oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JUHRyIGZ1bGxTdGF0ZTsKLQlsb25nIGZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFB0ciBmdWxsU3RhdGU7CisgICAgbG9uZyBmbGFnczsKICNpZm5kZWYgRW5kRnVsbFNjcmVlbgotCVB5TWFjX1BSRUNIRUNLKEVuZEZ1bGxTY3JlZW4pOworICAgIFB5TWFjX1BSRUNIRUNLKEVuZEZ1bGxTY3JlZW4pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAic2wiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZnVsbFN0YXRlLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRW5kRnVsbFNjcmVlbihmdWxsU3RhdGUsCi0JICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInNsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZ1bGxTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEVuZEZ1bGxTY3JlZW4oZnVsbFN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9BZGRTb3VuZERlc2NyaXB0aW9uRXh0ZW5zaW9uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVNvdW5kRGVzY3JpcHRpb25IYW5kbGUgZGVzYzsKLQlIYW5kbGUgZXh0ZW5zaW9uOwotCU9TVHlwZSBpZFR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU291bmREZXNjcmlwdGlvbkhhbmRsZSBkZXNjOworICAgIEhhbmRsZSBleHRlbnNpb247CisgICAgT1NUeXBlIGlkVHlwZTsKICNpZm5kZWYgQWRkU291bmREZXNjcmlwdGlvbkV4dGVuc2lvbgotCVB5TWFjX1BSRUNIRUNLKEFkZFNvdW5kRGVzY3JpcHRpb25FeHRlbnNpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKEFkZFNvdW5kRGVzY3JpcHRpb25FeHRlbnNpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkZXNjLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmV4dGVuc2lvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaWRUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEFkZFNvdW5kRGVzY3JpcHRpb25FeHRlbnNpb24oZGVzYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRUeXBlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZXh0ZW5zaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpZFR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQWRkU291bmREZXNjcmlwdGlvbkV4dGVuc2lvbihkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZFR5cGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dldFNvdW5kRGVzY3JpcHRpb25FeHRlbnNpb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU291bmREZXNjcmlwdGlvbkhhbmRsZSBkZXNjOwotCUhhbmRsZSBleHRlbnNpb247Ci0JT1NUeXBlIGlkVHlwZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTb3VuZERlc2NyaXB0aW9uSGFuZGxlIGRlc2M7CisgICAgSGFuZGxlIGV4dGVuc2lvbjsKKyAgICBPU1R5cGUgaWRUeXBlOwogI2lmbmRlZiBHZXRTb3VuZERlc2NyaXB0aW9uRXh0ZW5zaW9uCi0JUHlNYWNfUFJFQ0hFQ0soR2V0U291bmREZXNjcmlwdGlvbkV4dGVuc2lvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0U291bmREZXNjcmlwdGlvbkV4dGVuc2lvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkZXNjLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpZFR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0U291bmREZXNjcmlwdGlvbkV4dGVuc2lvbihkZXNjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZleHRlbnNpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRUeXBlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgZXh0ZW5zaW9uKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpZFR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0U291bmREZXNjcmlwdGlvbkV4dGVuc2lvbihkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZleHRlbnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRUeXBlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgZXh0ZW5zaW9uKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9SZW1vdmVTb3VuZERlc2NyaXB0aW9uRXh0ZW5zaW9uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVNvdW5kRGVzY3JpcHRpb25IYW5kbGUgZGVzYzsKLQlPU1R5cGUgaWRUeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFNvdW5kRGVzY3JpcHRpb25IYW5kbGUgZGVzYzsKKyAgICBPU1R5cGUgaWRUeXBlOwogI2lmbmRlZiBSZW1vdmVTb3VuZERlc2NyaXB0aW9uRXh0ZW5zaW9uCi0JUHlNYWNfUFJFQ0hFQ0soUmVtb3ZlU291bmREZXNjcmlwdGlvbkV4dGVuc2lvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soUmVtb3ZlU291bmREZXNjcmlwdGlvbkV4dGVuc2lvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkZXNjLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpZFR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUmVtb3ZlU291bmREZXNjcmlwdGlvbkV4dGVuc2lvbihkZXNjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkVHlwZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaWRUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFJlbW92ZVNvdW5kRGVzY3JpcHRpb25FeHRlbnNpb24oZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZFR5cGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1FUSXNTdGFuZGFyZFBhcmFtZXRlckRpYWxvZ0V2ZW50KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUV2ZW50UmVjb3JkIHBFdmVudDsKLQlRVFBhcmFtZXRlckRpYWxvZyBjcmVhdGVkRGlhbG9nOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEV2ZW50UmVjb3JkIHBFdmVudDsKKyAgICBRVFBhcmFtZXRlckRpYWxvZyBjcmVhdGVkRGlhbG9nOwogI2lmbmRlZiBRVElzU3RhbmRhcmRQYXJhbWV0ZXJEaWFsb2dFdmVudAotCVB5TWFjX1BSRUNIRUNLKFFUSXNTdGFuZGFyZFBhcmFtZXRlckRpYWxvZ0V2ZW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhRVElzU3RhbmRhcmRQYXJhbWV0ZXJEaWFsb2dFdmVudCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNyZWF0ZWREaWFsb2cpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUVRJc1N0YW5kYXJkUGFyYW1ldGVyRGlhbG9nRXZlbnQoJnBFdmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlZERpYWxvZyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRXZlbnRSZWNvcmQsICZwRXZlbnQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY3JlYXRlZERpYWxvZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBRVElzU3RhbmRhcmRQYXJhbWV0ZXJEaWFsb2dFdmVudCgmcEV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVkRGlhbG9nKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRFdmVudFJlY29yZCwgJnBFdmVudCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfUVREaXNtaXNzU3RhbmRhcmRQYXJhbWV0ZXJEaWFsb2coUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JUVRQYXJhbWV0ZXJEaWFsb2cgY3JlYXRlZERpYWxvZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBRVFBhcmFtZXRlckRpYWxvZyBjcmVhdGVkRGlhbG9nOwogI2lmbmRlZiBRVERpc21pc3NTdGFuZGFyZFBhcmFtZXRlckRpYWxvZwotCVB5TWFjX1BSRUNIRUNLKFFURGlzbWlzc1N0YW5kYXJkUGFyYW1ldGVyRGlhbG9nKTsKKyAgICBQeU1hY19QUkVDSEVDSyhRVERpc21pc3NTdGFuZGFyZFBhcmFtZXRlckRpYWxvZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNyZWF0ZWREaWFsb2cpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUVREaXNtaXNzU3RhbmRhcmRQYXJhbWV0ZXJEaWFsb2coY3JlYXRlZERpYWxvZyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjcmVhdGVkRGlhbG9nKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFFURGlzbWlzc1N0YW5kYXJkUGFyYW1ldGVyRGlhbG9nKGNyZWF0ZWREaWFsb2cpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1FUU3RhbmRhcmRQYXJhbWV0ZXJEaWFsb2dEb0FjdGlvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlRVFBhcmFtZXRlckRpYWxvZyBjcmVhdGVkRGlhbG9nOwotCWxvbmcgYWN0aW9uOwotCXZvaWQgKiBwYXJhbXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgUVRQYXJhbWV0ZXJEaWFsb2cgY3JlYXRlZERpYWxvZzsKKyAgICBsb25nIGFjdGlvbjsKKyAgICB2b2lkICogcGFyYW1zOwogI2lmbmRlZiBRVFN0YW5kYXJkUGFyYW1ldGVyRGlhbG9nRG9BY3Rpb24KLQlQeU1hY19QUkVDSEVDSyhRVFN0YW5kYXJkUGFyYW1ldGVyRGlhbG9nRG9BY3Rpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKFFUU3RhbmRhcmRQYXJhbWV0ZXJEaWFsb2dEb0FjdGlvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbHMiLAotCSAgICAgICAgICAgICAgICAgICAgICAmY3JlYXRlZERpYWxvZywKLQkgICAgICAgICAgICAgICAgICAgICAgJmFjdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnBhcmFtcykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBRVFN0YW5kYXJkUGFyYW1ldGVyRGlhbG9nRG9BY3Rpb24oY3JlYXRlZERpYWxvZywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGxzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNyZWF0ZWREaWFsb2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJhbXMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUVRTdGFuZGFyZFBhcmFtZXRlckRpYWxvZ0RvQWN0aW9uKGNyZWF0ZWREaWFsb2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1FUUmVnaXN0ZXJBY2Nlc3NLZXkoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU3RyMjU1IGFjY2Vzc0tleVR5cGU7Ci0JbG9uZyBmbGFnczsKLQlIYW5kbGUgYWNjZXNzS2V5OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFN0cjI1NSBhY2Nlc3NLZXlUeXBlOworICAgIGxvbmcgZmxhZ3M7CisgICAgSGFuZGxlIGFjY2Vzc0tleTsKICNpZm5kZWYgUVRSZWdpc3RlckFjY2Vzc0tleQotCVB5TWFjX1BSRUNIRUNLKFFUUmVnaXN0ZXJBY2Nlc3NLZXkpOworICAgIFB5TWFjX1BSRUNIRUNLKFFUUmVnaXN0ZXJBY2Nlc3NLZXkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIGFjY2Vzc0tleVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZhY2Nlc3NLZXkpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUVRSZWdpc3RlckFjY2Vzc0tleShhY2Nlc3NLZXlUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2Vzc0tleSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIGFjY2Vzc0tleVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZhY2Nlc3NLZXkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUVRSZWdpc3RlckFjY2Vzc0tleShhY2Nlc3NLZXlUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2Vzc0tleSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfUVRVbnJlZ2lzdGVyQWNjZXNzS2V5KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVN0cjI1NSBhY2Nlc3NLZXlUeXBlOwotCWxvbmcgZmxhZ3M7Ci0JSGFuZGxlIGFjY2Vzc0tleTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTdHIyNTUgYWNjZXNzS2V5VHlwZTsKKyAgICBsb25nIGZsYWdzOworICAgIEhhbmRsZSBhY2Nlc3NLZXk7CiAjaWZuZGVmIFFUVW5yZWdpc3RlckFjY2Vzc0tleQotCVB5TWFjX1BSRUNIRUNLKFFUVW5yZWdpc3RlckFjY2Vzc0tleSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUVRVbnJlZ2lzdGVyQWNjZXNzS2V5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBhY2Nlc3NLZXlUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmYWNjZXNzS2V5KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFFUVW5yZWdpc3RlckFjY2Vzc0tleShhY2Nlc3NLZXlUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2Nlc3NLZXkpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBhY2Nlc3NLZXlUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmYWNjZXNzS2V5KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFFUVW5yZWdpc3RlckFjY2Vzc0tleShhY2Nlc3NLZXlUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2Nlc3NLZXkpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1FUR2V0U3VwcG9ydGVkUmVzdHJpY3Rpb25zKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCU9TVHlwZSBpblJlc3RyaWN0aW9uQ2xhc3M7Ci0JVUludDMyIG91dFJlc3RyaWN0aW9uSURzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIE9TVHlwZSBpblJlc3RyaWN0aW9uQ2xhc3M7CisgICAgVUludDMyIG91dFJlc3RyaWN0aW9uSURzOwogI2lmbmRlZiBRVEdldFN1cHBvcnRlZFJlc3RyaWN0aW9ucwotCVB5TWFjX1BSRUNIRUNLKFFUR2V0U3VwcG9ydGVkUmVzdHJpY3Rpb25zKTsKKyAgICBQeU1hY19QUkVDSEVDSyhRVEdldFN1cHBvcnRlZFJlc3RyaWN0aW9ucyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmluUmVzdHJpY3Rpb25DbGFzcykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBRVEdldFN1cHBvcnRlZFJlc3RyaWN0aW9ucyhpblJlc3RyaWN0aW9uQ2xhc3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRSZXN0cmljdGlvbklEcyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0UmVzdHJpY3Rpb25JRHMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaW5SZXN0cmljdGlvbkNsYXNzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFFUR2V0U3VwcG9ydGVkUmVzdHJpY3Rpb25zKGluUmVzdHJpY3Rpb25DbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFJlc3RyaWN0aW9uSURzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRSZXN0cmljdGlvbklEcyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfUVRUZXh0VG9OYXRpdmVUZXh0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUhhbmRsZSB0aGVUZXh0OwotCWxvbmcgZW5jb2Rpbmc7Ci0JbG9uZyBmbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBIYW5kbGUgdGhlVGV4dDsKKyAgICBsb25nIGVuY29kaW5nOworICAgIGxvbmcgZmxhZ3M7CiAjaWZuZGVmIFFUVGV4dFRvTmF0aXZlVGV4dAotCVB5TWFjX1BSRUNIRUNLKFFUVGV4dFRvTmF0aXZlVGV4dCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUVRUZXh0VG9OYXRpdmVUZXh0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZVRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICZlbmNvZGluZywKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFFUVGV4dFRvTmF0aXZlVGV4dCh0aGVUZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlVGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmVuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUVRUZXh0VG9OYXRpdmVUZXh0KHRoZVRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WaWRlb01lZGlhUmVzZXRTdGF0aXN0aWNzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CiAjaWZuZGVmIFZpZGVvTWVkaWFSZXNldFN0YXRpc3RpY3MKLQlQeU1hY19QUkVDSEVDSyhWaWRlb01lZGlhUmVzZXRTdGF0aXN0aWNzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWaWRlb01lZGlhUmVzZXRTdGF0aXN0aWNzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWaWRlb01lZGlhUmVzZXRTdGF0aXN0aWNzKG1oKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVmlkZW9NZWRpYVJlc2V0U3RhdGlzdGljcyhtaCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVmlkZW9NZWRpYUdldFN0YXRpc3RpY3MoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKICNpZm5kZWYgVmlkZW9NZWRpYUdldFN0YXRpc3RpY3MKLQlQeU1hY19QUkVDSEVDSyhWaWRlb01lZGlhR2V0U3RhdGlzdGljcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVmlkZW9NZWRpYUdldFN0YXRpc3RpY3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZpZGVvTWVkaWFHZXRTdGF0aXN0aWNzKG1oKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVmlkZW9NZWRpYUdldFN0YXRpc3RpY3MobWgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZpZGVvTWVkaWFHZXRTdGFsbENvdW50KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQl1bnNpZ25lZCBsb25nIHN0YWxsczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgdW5zaWduZWQgbG9uZyBzdGFsbHM7CiAjaWZuZGVmIFZpZGVvTWVkaWFHZXRTdGFsbENvdW50Ci0JUHlNYWNfUFJFQ0hFQ0soVmlkZW9NZWRpYUdldFN0YWxsQ291bnQpOworICAgIFB5TWFjX1BSRUNIRUNLKFZpZGVvTWVkaWFHZXRTdGFsbENvdW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWaWRlb01lZGlhR2V0U3RhbGxDb3VudChtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhbGxzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBzdGFsbHMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWaWRlb01lZGlhR2V0U3RhbGxDb3VudChtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhbGxzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGFsbHMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZpZGVvTWVkaWFTZXRDb2RlY1BhcmFtZXRlcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JQ29kZWNUeXBlIGNUeXBlOwotCU9TVHlwZSBwYXJhbWV0ZXJJRDsKLQlsb25nIHBhcmFtZXRlckNoYW5nZVNlZWQ7Ci0Jdm9pZCAqIGRhdGFQdHI7Ci0JbG9uZyBkYXRhU2l6ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgQ29kZWNUeXBlIGNUeXBlOworICAgIE9TVHlwZSBwYXJhbWV0ZXJJRDsKKyAgICBsb25nIHBhcmFtZXRlckNoYW5nZVNlZWQ7CisgICAgdm9pZCAqIGRhdGFQdHI7CisgICAgbG9uZyBkYXRhU2l6ZTsKICNpZm5kZWYgVmlkZW9NZWRpYVNldENvZGVjUGFyYW1ldGVyCi0JUHlNYWNfUFJFQ0hFQ0soVmlkZW9NZWRpYVNldENvZGVjUGFyYW1ldGVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWaWRlb01lZGlhU2V0Q29kZWNQYXJhbWV0ZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mbHNsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZwYXJhbWV0ZXJJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnBhcmFtZXRlckNoYW5nZVNlZWQsCi0JICAgICAgICAgICAgICAgICAgICAgICZkYXRhUHRyLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGF0YVNpemUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWaWRlb01lZGlhU2V0Q29kZWNQYXJhbWV0ZXIobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyQ2hhbmdlU2VlZCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVB0ciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVNpemUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmxzbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcGFyYW1ldGVySUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJhbWV0ZXJDaGFuZ2VTZWVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFTaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVmlkZW9NZWRpYVNldENvZGVjUGFyYW1ldGVyKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVySUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlckNoYW5nZVNlZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTaXplKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WaWRlb01lZGlhR2V0Q29kZWNQYXJhbWV0ZXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCUNvZGVjVHlwZSBjVHlwZTsKLQlPU1R5cGUgcGFyYW1ldGVySUQ7Ci0JSGFuZGxlIG91dFBhcmFtZXRlckRhdGE7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIENvZGVjVHlwZSBjVHlwZTsKKyAgICBPU1R5cGUgcGFyYW1ldGVySUQ7CisgICAgSGFuZGxlIG91dFBhcmFtZXRlckRhdGE7CiAjaWZuZGVmIFZpZGVvTWVkaWFHZXRDb2RlY1BhcmFtZXRlcgotCVB5TWFjX1BSRUNIRUNLKFZpZGVvTWVkaWFHZXRDb2RlY1BhcmFtZXRlcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soVmlkZW9NZWRpYUdldENvZGVjUGFyYW1ldGVyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZwYXJhbWV0ZXJJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZvdXRQYXJhbWV0ZXJEYXRhKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVmlkZW9NZWRpYUdldENvZGVjUGFyYW1ldGVyKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVySUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dFBhcmFtZXRlckRhdGEpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZwYXJhbWV0ZXJJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZvdXRQYXJhbWV0ZXJEYXRhKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVmlkZW9NZWRpYUdldENvZGVjUGFyYW1ldGVyKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVySUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dFBhcmFtZXRlckRhdGEpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1RleHRNZWRpYUFkZFRleHRTYW1wbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCVB0ciB0ZXh0OwotCXVuc2lnbmVkIGxvbmcgc2l6ZTsKLQlzaG9ydCBmb250TnVtYmVyOwotCXNob3J0IGZvbnRTaXplOwotCVN0eWxlIHRleHRGYWNlOwotCVJHQkNvbG9yIHRleHRDb2xvcjsKLQlSR0JDb2xvciBiYWNrQ29sb3I7Ci0Jc2hvcnQgdGV4dEp1c3RpZmljYXRpb247Ci0JUmVjdCB0ZXh0Qm94OwotCWxvbmcgZGlzcGxheUZsYWdzOwotCVRpbWVWYWx1ZSBzY3JvbGxEZWxheTsKLQlzaG9ydCBoaWxpdGVTdGFydDsKLQlzaG9ydCBoaWxpdGVFbmQ7Ci0JUkdCQ29sb3IgcmdiSGlsaXRlQ29sb3I7Ci0JVGltZVZhbHVlIGR1cmF0aW9uOwotCVRpbWVWYWx1ZSBzYW1wbGVUaW1lOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBQdHIgdGV4dDsKKyAgICB1bnNpZ25lZCBsb25nIHNpemU7CisgICAgc2hvcnQgZm9udE51bWJlcjsKKyAgICBzaG9ydCBmb250U2l6ZTsKKyAgICBTdHlsZSB0ZXh0RmFjZTsKKyAgICBSR0JDb2xvciB0ZXh0Q29sb3I7CisgICAgUkdCQ29sb3IgYmFja0NvbG9yOworICAgIHNob3J0IHRleHRKdXN0aWZpY2F0aW9uOworICAgIFJlY3QgdGV4dEJveDsKKyAgICBsb25nIGRpc3BsYXlGbGFnczsKKyAgICBUaW1lVmFsdWUgc2Nyb2xsRGVsYXk7CisgICAgc2hvcnQgaGlsaXRlU3RhcnQ7CisgICAgc2hvcnQgaGlsaXRlRW5kOworICAgIFJHQkNvbG9yIHJnYkhpbGl0ZUNvbG9yOworICAgIFRpbWVWYWx1ZSBkdXJhdGlvbjsKKyAgICBUaW1lVmFsdWUgc2FtcGxlVGltZTsKICNpZm5kZWYgVGV4dE1lZGlhQWRkVGV4dFNhbXBsZQotCVB5TWFjX1BSRUNIRUNLKFRleHRNZWRpYUFkZFRleHRTYW1wbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFRleHRNZWRpYUFkZFRleHRTYW1wbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzbGhoYmhsbGhobCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNpemUsCi0JICAgICAgICAgICAgICAgICAgICAgICZmb250TnVtYmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAmZm9udFNpemUsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0ZXh0RmFjZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRleHRKdXN0aWZpY2F0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGlzcGxheUZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2Nyb2xsRGVsYXksCi0JICAgICAgICAgICAgICAgICAgICAgICZoaWxpdGVTdGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmhpbGl0ZUVuZCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmR1cmF0aW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVGV4dE1lZGlhQWRkVGV4dFNhbXBsZShtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udE51bWJlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRTaXplLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dEZhY2UsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGV4dENvbG9yLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJhY2tDb2xvciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRKdXN0aWZpY2F0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRleHRCb3gsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5RmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxEZWxheSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpbGl0ZVN0YXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlsaXRlRW5kLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJnYkhpbGl0ZUNvbG9yLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlVGltZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJk8mTyZPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZ0ZXh0Q29sb3IsCi0JICAgICAgICAgICAgICAgICAgICAgUWRSR0JfTmV3LCAmYmFja0NvbG9yLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJnRleHRCb3gsCi0JICAgICAgICAgICAgICAgICAgICAgUWRSR0JfTmV3LCAmcmdiSGlsaXRlQ29sb3IsCi0JICAgICAgICAgICAgICAgICAgICAgc2FtcGxlVGltZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzbGhoYmhsbGhobCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmb250TnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZm9udFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZXh0RmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRleHRKdXN0aWZpY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGlzcGxheUZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2Nyb2xsRGVsYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZoaWxpdGVTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmhpbGl0ZUVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmR1cmF0aW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVGV4dE1lZGlhQWRkVGV4dFNhbXBsZShtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udE51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dEZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGV4dENvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJhY2tDb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRKdXN0aWZpY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRleHRCb3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5RmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxEZWxheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpbGl0ZVN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlsaXRlRW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJnYkhpbGl0ZUNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlVGltZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJk8mTyZPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZ0ZXh0Q29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgUWRSR0JfTmV3LCAmYmFja0NvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJnRleHRCb3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgUWRSR0JfTmV3LCAmcmdiSGlsaXRlQ29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlVGltZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVGV4dE1lZGlhQWRkVEVTYW1wbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCVRFSGFuZGxlIGhURTsKLQlSR0JDb2xvciBiYWNrQ29sb3I7Ci0Jc2hvcnQgdGV4dEp1c3RpZmljYXRpb247Ci0JUmVjdCB0ZXh0Qm94OwotCWxvbmcgZGlzcGxheUZsYWdzOwotCVRpbWVWYWx1ZSBzY3JvbGxEZWxheTsKLQlzaG9ydCBoaWxpdGVTdGFydDsKLQlzaG9ydCBoaWxpdGVFbmQ7Ci0JUkdCQ29sb3IgcmdiSGlsaXRlQ29sb3I7Ci0JVGltZVZhbHVlIGR1cmF0aW9uOwotCVRpbWVWYWx1ZSBzYW1wbGVUaW1lOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBURUhhbmRsZSBoVEU7CisgICAgUkdCQ29sb3IgYmFja0NvbG9yOworICAgIHNob3J0IHRleHRKdXN0aWZpY2F0aW9uOworICAgIFJlY3QgdGV4dEJveDsKKyAgICBsb25nIGRpc3BsYXlGbGFnczsKKyAgICBUaW1lVmFsdWUgc2Nyb2xsRGVsYXk7CisgICAgc2hvcnQgaGlsaXRlU3RhcnQ7CisgICAgc2hvcnQgaGlsaXRlRW5kOworICAgIFJHQkNvbG9yIHJnYkhpbGl0ZUNvbG9yOworICAgIFRpbWVWYWx1ZSBkdXJhdGlvbjsKKyAgICBUaW1lVmFsdWUgc2FtcGxlVGltZTsKICNpZm5kZWYgVGV4dE1lZGlhQWRkVEVTYW1wbGUKLQlQeU1hY19QUkVDSEVDSyhUZXh0TWVkaWFBZGRURVNhbXBsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVGV4dE1lZGlhQWRkVEVTYW1wbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmhsbGhobCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmhURSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRleHRKdXN0aWZpY2F0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGlzcGxheUZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2Nyb2xsRGVsYXksCi0JICAgICAgICAgICAgICAgICAgICAgICZoaWxpdGVTdGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmhpbGl0ZUVuZCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmR1cmF0aW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVGV4dE1lZGlhQWRkVEVTYW1wbGUobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgaFRFLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZiYWNrQ29sb3IsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dEp1c3RpZmljYXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRleHRCb3gsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheUZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbERlbGF5LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpbGl0ZVN0YXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpbGl0ZUVuZCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmdiSGlsaXRlQ29sb3IsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZVRpbWUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFFkUkdCX05ldywgJmJhY2tDb2xvciwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZ0ZXh0Qm94LAotCSAgICAgICAgICAgICAgICAgICAgIFFkUkdCX05ldywgJnJnYkhpbGl0ZUNvbG9yLAotCSAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVRpbWUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZobGxoaGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZoVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZXh0SnVzdGlmaWNhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRpc3BsYXlGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNjcm9sbERlbGF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaGlsaXRlU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZoaWxpdGVFbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFRleHRNZWRpYUFkZFRFU2FtcGxlKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYmFja0NvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRKdXN0aWZpY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZXh0Qm94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxEZWxheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWxpdGVTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWxpdGVFbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJnYkhpbGl0ZUNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGVUaW1lKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyZPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZiYWNrQ29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmdGV4dEJveCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZyZ2JIaWxpdGVDb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVUaW1lKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9UZXh0TWVkaWFBZGRIaWxpdGVTYW1wbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCXNob3J0IGhpbGl0ZVN0YXJ0OwotCXNob3J0IGhpbGl0ZUVuZDsKLQlSR0JDb2xvciByZ2JIaWxpdGVDb2xvcjsKLQlUaW1lVmFsdWUgZHVyYXRpb247Ci0JVGltZVZhbHVlIHNhbXBsZVRpbWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIHNob3J0IGhpbGl0ZVN0YXJ0OworICAgIHNob3J0IGhpbGl0ZUVuZDsKKyAgICBSR0JDb2xvciByZ2JIaWxpdGVDb2xvcjsKKyAgICBUaW1lVmFsdWUgZHVyYXRpb247CisgICAgVGltZVZhbHVlIHNhbXBsZVRpbWU7CiAjaWZuZGVmIFRleHRNZWRpYUFkZEhpbGl0ZVNhbXBsZQotCVB5TWFjX1BSRUNIRUNLKFRleHRNZWRpYUFkZEhpbGl0ZVNhbXBsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVGV4dE1lZGlhQWRkSGlsaXRlU2FtcGxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGhsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZoaWxpdGVTdGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmhpbGl0ZUVuZCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmR1cmF0aW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVGV4dE1lZGlhQWRkSGlsaXRlU2FtcGxlKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWxpdGVTdGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlsaXRlRW5kLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmdiSGlsaXRlQ29sb3IsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlVGltZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZyZ2JIaWxpdGVDb2xvciwKLQkgICAgICAgICAgICAgICAgICAgICBzYW1wbGVUaW1lKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhobCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaGlsaXRlU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZoaWxpdGVFbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFRleHRNZWRpYUFkZEhpbGl0ZVNhbXBsZShtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlsaXRlU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpbGl0ZUVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJnYkhpbGl0ZUNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZVRpbWUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUWRSR0JfTmV3LCAmcmdiSGlsaXRlQ29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlVGltZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVGV4dE1lZGlhRHJhd1JhdyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JR1dvcmxkUHRyIGd3OwotCUdESGFuZGxlIGdkOwotCXZvaWQgKiBkYXRhOwotCWxvbmcgZGF0YVNpemU7Ci0JVGV4dERlc2NyaXB0aW9uSGFuZGxlIHRkaDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgR1dvcmxkUHRyIGd3OworICAgIEdESGFuZGxlIGdkOworICAgIHZvaWQgKiBkYXRhOworICAgIGxvbmcgZGF0YVNpemU7CisgICAgVGV4dERlc2NyaXB0aW9uSGFuZGxlIHRkaDsKICNpZm5kZWYgVGV4dE1lZGlhRHJhd1JhdwotCVB5TWFjX1BSRUNIRUNLKFRleHRNZWRpYURyYXdSYXcpOworICAgIFB5TWFjX1BSRUNIRUNLKFRleHRNZWRpYURyYXdSYXcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mc2xPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICBHV29ybGRPYmpfQ29udmVydCwgJmd3LAotCSAgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfQ29udmVydCwgJmdkLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGF0YSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRhdGFTaXplLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRkaCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFRleHRNZWRpYURyYXdSYXcobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICBndywKLQkgICAgICAgICAgICAgICAgICAgICAgIGdkLAotCSAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKLQkgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTaXplLAotCSAgICAgICAgICAgICAgICAgICAgICAgdGRoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZzbE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdXb3JsZE9ial9Db252ZXJ0LCAmZ3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdFJlc09ial9Db252ZXJ0LCAmZ2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGRoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVGV4dE1lZGlhRHJhd1JhdyhtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGd3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZGgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1RleHRNZWRpYVNldFRleHRQcm9wZXJ0eShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JVGltZVZhbHVlIGF0TWVkaWFUaW1lOwotCWxvbmcgcHJvcGVydHlUeXBlOwotCXZvaWQgKiBkYXRhOwotCWxvbmcgZGF0YVNpemU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIFRpbWVWYWx1ZSBhdE1lZGlhVGltZTsKKyAgICBsb25nIHByb3BlcnR5VHlwZTsKKyAgICB2b2lkICogZGF0YTsKKyAgICBsb25nIGRhdGFTaXplOwogI2lmbmRlZiBUZXh0TWVkaWFTZXRUZXh0UHJvcGVydHkKLQlQeU1hY19QUkVDSEVDSyhUZXh0TWVkaWFTZXRUZXh0UHJvcGVydHkpOworICAgIFB5TWFjX1BSRUNIRUNLKFRleHRNZWRpYVNldFRleHRQcm9wZXJ0eSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsc2wiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmF0TWVkaWFUaW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAmcHJvcGVydHlUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGF0YSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRhdGFTaXplKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVGV4dE1lZGlhU2V0VGV4dFByb3BlcnR5KG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdE1lZGlhVGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhU2l6ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbHNsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhdE1lZGlhVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnByb3BlcnR5VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhU2l6ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFRleHRNZWRpYVNldFRleHRQcm9wZXJ0eShtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXRNZWRpYVRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVNpemUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1RleHRNZWRpYVJhd1NldHVwKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlHV29ybGRQdHIgZ3c7Ci0JR0RIYW5kbGUgZ2Q7Ci0Jdm9pZCAqIGRhdGE7Ci0JbG9uZyBkYXRhU2l6ZTsKLQlUZXh0RGVzY3JpcHRpb25IYW5kbGUgdGRoOwotCVRpbWVWYWx1ZSBzYW1wbGVEdXJhdGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgR1dvcmxkUHRyIGd3OworICAgIEdESGFuZGxlIGdkOworICAgIHZvaWQgKiBkYXRhOworICAgIGxvbmcgZGF0YVNpemU7CisgICAgVGV4dERlc2NyaXB0aW9uSGFuZGxlIHRkaDsKKyAgICBUaW1lVmFsdWUgc2FtcGxlRHVyYXRpb247CiAjaWZuZGVmIFRleHRNZWRpYVJhd1NldHVwCi0JUHlNYWNfUFJFQ0hFQ0soVGV4dE1lZGlhUmF3U2V0dXApOworICAgIFB5TWFjX1BSRUNIRUNLKFRleHRNZWRpYVJhd1NldHVwKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJnNsTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgIEdXb3JsZE9ial9Db252ZXJ0LCAmZ3csCi0JICAgICAgICAgICAgICAgICAgICAgIE9wdFJlc09ial9Db252ZXJ0LCAmZ2QsCi0JICAgICAgICAgICAgICAgICAgICAgICZkYXRhLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGF0YVNpemUsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlRHVyYXRpb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBUZXh0TWVkaWFSYXdTZXR1cChtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICBndywKLQkgICAgICAgICAgICAgICAgICAgICAgICBnZCwKLQkgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTaXplLAotCSAgICAgICAgICAgICAgICAgICAgICAgIHRkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVEdXJhdGlvbik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mc2xPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgR1dvcmxkT2JqX0NvbnZlcnQsICZndywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0UmVzT2JqX0NvbnZlcnQsICZnZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0ZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGVEdXJhdGlvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFRleHRNZWRpYVJhd1NldHVwKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZUR1cmF0aW9uKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9UZXh0TWVkaWFSYXdJZGxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlHV29ybGRQdHIgZ3c7Ci0JR0RIYW5kbGUgZ2Q7Ci0JVGltZVZhbHVlIHNhbXBsZVRpbWU7Ci0JbG9uZyBmbGFnc0luOwotCWxvbmcgZmxhZ3NPdXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIEdXb3JsZFB0ciBndzsKKyAgICBHREhhbmRsZSBnZDsKKyAgICBUaW1lVmFsdWUgc2FtcGxlVGltZTsKKyAgICBsb25nIGZsYWdzSW47CisgICAgbG9uZyBmbGFnc091dDsKICNpZm5kZWYgVGV4dE1lZGlhUmF3SWRsZQotCVB5TWFjX1BSRUNIRUNLKFRleHRNZWRpYVJhd0lkbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFRleHRNZWRpYVJhd0lkbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgR1dvcmxkT2JqX0NvbnZlcnQsICZndywKLQkgICAgICAgICAgICAgICAgICAgICAgT3B0UmVzT2JqX0NvbnZlcnQsICZnZCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZVRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFnc0luKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVGV4dE1lZGlhUmF3SWRsZShtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgIGd3LAotCSAgICAgICAgICAgICAgICAgICAgICAgZ2QsCi0JICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVUaW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3NJbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICZmbGFnc091dCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgZmxhZ3NPdXQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdXb3JsZE9ial9Db252ZXJ0LCAmZ3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdFJlc09ial9Db252ZXJ0LCAmZ2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGVUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3NJbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFRleHRNZWRpYVJhd0lkbGUobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBndywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGdkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3NPdXQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzT3V0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9UZXh0TWVkaWFHZXRUZXh0UHJvcGVydHkoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCVRpbWVWYWx1ZSBhdE1lZGlhVGltZTsKLQlsb25nIHByb3BlcnR5VHlwZTsKLQl2b2lkICogZGF0YTsKLQlsb25nIGRhdGFTaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBUaW1lVmFsdWUgYXRNZWRpYVRpbWU7CisgICAgbG9uZyBwcm9wZXJ0eVR5cGU7CisgICAgdm9pZCAqIGRhdGE7CisgICAgbG9uZyBkYXRhU2l6ZTsKICNpZm5kZWYgVGV4dE1lZGlhR2V0VGV4dFByb3BlcnR5Ci0JUHlNYWNfUFJFQ0hFQ0soVGV4dE1lZGlhR2V0VGV4dFByb3BlcnR5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhUZXh0TWVkaWFHZXRUZXh0UHJvcGVydHkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbHNsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZhdE1lZGlhVGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnByb3BlcnR5VHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRhdGEsCi0JICAgICAgICAgICAgICAgICAgICAgICZkYXRhU2l6ZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFRleHRNZWRpYUdldFRleHRQcm9wZXJ0eShtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXRNZWRpYVRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5VHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVNpemUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGxzbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYXRNZWRpYVRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwcm9wZXJ0eVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVNpemUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBUZXh0TWVkaWFHZXRUZXh0UHJvcGVydHkobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0TWVkaWFUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTaXplKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9UZXh0TWVkaWFGaW5kTmV4dFRleHQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCVB0ciB0ZXh0OwotCWxvbmcgc2l6ZTsKLQlzaG9ydCBmaW5kRmxhZ3M7Ci0JVGltZVZhbHVlIHN0YXJ0VGltZTsKLQlUaW1lVmFsdWUgZm91bmRUaW1lOwotCVRpbWVWYWx1ZSBmb3VuZER1cmF0aW9uOwotCWxvbmcgb2Zmc2V0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBQdHIgdGV4dDsKKyAgICBsb25nIHNpemU7CisgICAgc2hvcnQgZmluZEZsYWdzOworICAgIFRpbWVWYWx1ZSBzdGFydFRpbWU7CisgICAgVGltZVZhbHVlIGZvdW5kVGltZTsKKyAgICBUaW1lVmFsdWUgZm91bmREdXJhdGlvbjsKKyAgICBsb25nIG9mZnNldDsKICNpZm5kZWYgVGV4dE1lZGlhRmluZE5leHRUZXh0Ci0JUHlNYWNfUFJFQ0hFQ0soVGV4dE1lZGlhRmluZE5leHRUZXh0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhUZXh0TWVkaWFGaW5kTmV4dFRleHQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzbGhsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0ZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZpbmRGbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0VGltZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFRleHRNZWRpYUZpbmROZXh0VGV4dChtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluZEZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmb3VuZFRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmb3VuZER1cmF0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGxsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGZvdW5kVGltZSwKLQkgICAgICAgICAgICAgICAgICAgICBmb3VuZER1cmF0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgIG9mZnNldCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzbGhsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpbmRGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0VGltZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFRleHRNZWRpYUZpbmROZXh0VGV4dChtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluZEZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmb3VuZFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmb3VuZER1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGxsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZER1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVGV4dE1lZGlhSGlsaXRlVGV4dFNhbXBsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JVGltZVZhbHVlIHNhbXBsZVRpbWU7Ci0Jc2hvcnQgaGlsaXRlU3RhcnQ7Ci0Jc2hvcnQgaGlsaXRlRW5kOwotCVJHQkNvbG9yIHJnYkhpbGl0ZUNvbG9yOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBUaW1lVmFsdWUgc2FtcGxlVGltZTsKKyAgICBzaG9ydCBoaWxpdGVTdGFydDsKKyAgICBzaG9ydCBoaWxpdGVFbmQ7CisgICAgUkdCQ29sb3IgcmdiSGlsaXRlQ29sb3I7CiAjaWZuZGVmIFRleHRNZWRpYUhpbGl0ZVRleHRTYW1wbGUKLQlQeU1hY19QUkVDSEVDSyhUZXh0TWVkaWFIaWxpdGVUZXh0U2FtcGxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUZXh0TWVkaWFIaWxpdGVUZXh0U2FtcGxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGVUaW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAmaGlsaXRlU3RhcnQsCi0JICAgICAgICAgICAgICAgICAgICAgICZoaWxpdGVFbmQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBUZXh0TWVkaWFIaWxpdGVUZXh0U2FtcGxlKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlVGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpbGl0ZVN0YXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlsaXRlRW5kLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJnYkhpbGl0ZUNvbG9yKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUWRSR0JfTmV3LCAmcmdiSGlsaXRlQ29sb3IpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGVUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaGlsaXRlU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZoaWxpdGVFbmQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBUZXh0TWVkaWFIaWxpdGVUZXh0U2FtcGxlKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpbGl0ZVN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlsaXRlRW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJnYkhpbGl0ZUNvbG9yKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUWRSR0JfTmV3LCAmcmdiSGlsaXRlQ29sb3IpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1RleHRNZWRpYVNldFRleHRTYW1wbGVEYXRhKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQl2b2lkICogZGF0YTsKLQlPU1R5cGUgZGF0YVR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIHZvaWQgKiBkYXRhOworICAgIE9TVHlwZSBkYXRhVHlwZTsKICNpZm5kZWYgVGV4dE1lZGlhU2V0VGV4dFNhbXBsZURhdGEKLQlQeU1hY19QUkVDSEVDSyhUZXh0TWVkaWFTZXRUZXh0U2FtcGxlRGF0YSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVGV4dE1lZGlhU2V0VGV4dFNhbXBsZURhdGEpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRhdGEsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRhdGFUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVGV4dE1lZGlhU2V0VGV4dFNhbXBsZURhdGEobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRhdGFUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVGV4dE1lZGlhU2V0VGV4dFNhbXBsZURhdGEobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU3ByaXRlTWVkaWFTZXRQcm9wZXJ0eShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0Jc2hvcnQgc3ByaXRlSW5kZXg7Ci0JbG9uZyBwcm9wZXJ0eVR5cGU7Ci0Jdm9pZCAqIHByb3BlcnR5VmFsdWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIHNob3J0IHNwcml0ZUluZGV4OworICAgIGxvbmcgcHJvcGVydHlUeXBlOworICAgIHZvaWQgKiBwcm9wZXJ0eVZhbHVlOwogI2lmbmRlZiBTcHJpdGVNZWRpYVNldFByb3BlcnR5Ci0JUHlNYWNfUFJFQ0hFQ0soU3ByaXRlTWVkaWFTZXRQcm9wZXJ0eSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU3ByaXRlTWVkaWFTZXRQcm9wZXJ0eSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhscyIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmc3ByaXRlSW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgICZwcm9wZXJ0eVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZwcm9wZXJ0eVZhbHVlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU3ByaXRlTWVkaWFTZXRQcm9wZXJ0eShtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcml0ZUluZGV4LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlWYWx1ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZobHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNwcml0ZUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJvcGVydHlUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJvcGVydHlWYWx1ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNwcml0ZU1lZGlhU2V0UHJvcGVydHkobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpdGVJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5VmFsdWUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1Nwcml0ZU1lZGlhR2V0UHJvcGVydHkoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCXNob3J0IHNwcml0ZUluZGV4OwotCWxvbmcgcHJvcGVydHlUeXBlOwotCXZvaWQgKiBwcm9wZXJ0eVZhbHVlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBzaG9ydCBzcHJpdGVJbmRleDsKKyAgICBsb25nIHByb3BlcnR5VHlwZTsKKyAgICB2b2lkICogcHJvcGVydHlWYWx1ZTsKICNpZm5kZWYgU3ByaXRlTWVkaWFHZXRQcm9wZXJ0eQotCVB5TWFjX1BSRUNIRUNLKFNwcml0ZU1lZGlhR2V0UHJvcGVydHkpOworICAgIFB5TWFjX1BSRUNIRUNLKFNwcml0ZU1lZGlhR2V0UHJvcGVydHkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZobHMiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNwcml0ZUluZGV4LAotCSAgICAgICAgICAgICAgICAgICAgICAmcHJvcGVydHlUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAmcHJvcGVydHlWYWx1ZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNwcml0ZU1lZGlhR2V0UHJvcGVydHkobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpdGVJbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5VHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5VmFsdWUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGxzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzcHJpdGVJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnByb3BlcnR5VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnByb3BlcnR5VmFsdWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTcHJpdGVNZWRpYUdldFByb3BlcnR5KG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaXRlSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVZhbHVlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TcHJpdGVNZWRpYUhpdFRlc3RTcHJpdGVzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlsb25nIGZsYWdzOwotCVBvaW50IGxvYzsKLQlzaG9ydCBzcHJpdGVIaXRJbmRleDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgbG9uZyBmbGFnczsKKyAgICBQb2ludCBsb2M7CisgICAgc2hvcnQgc3ByaXRlSGl0SW5kZXg7CiAjaWZuZGVmIFNwcml0ZU1lZGlhSGl0VGVzdFNwcml0ZXMKLQlQeU1hY19QUkVDSEVDSyhTcHJpdGVNZWRpYUhpdFRlc3RTcHJpdGVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTcHJpdGVNZWRpYUhpdFRlc3RTcHJpdGVzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZsb2MpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTcHJpdGVNZWRpYUhpdFRlc3RTcHJpdGVzKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3ByaXRlSGl0SW5kZXgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHNwcml0ZUhpdEluZGV4KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmbG9jKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU3ByaXRlTWVkaWFIaXRUZXN0U3ByaXRlcyhtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNwcml0ZUhpdEluZGV4KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpdGVIaXRJbmRleCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU3ByaXRlTWVkaWFDb3VudFNwcml0ZXMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCXNob3J0IG51bVNwcml0ZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIHNob3J0IG51bVNwcml0ZXM7CiAjaWZuZGVmIFNwcml0ZU1lZGlhQ291bnRTcHJpdGVzCi0JUHlNYWNfUFJFQ0hFQ0soU3ByaXRlTWVkaWFDb3VudFNwcml0ZXMpOworICAgIFB5TWFjX1BSRUNIRUNLKFNwcml0ZU1lZGlhQ291bnRTcHJpdGVzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTcHJpdGVNZWRpYUNvdW50U3ByaXRlcyhtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbnVtU3ByaXRlcyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgbnVtU3ByaXRlcyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNwcml0ZU1lZGlhQ291bnRTcHJpdGVzKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZudW1TcHJpdGVzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBudW1TcHJpdGVzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TcHJpdGVNZWRpYUNvdW50SW1hZ2VzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlzaG9ydCBudW1JbWFnZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIHNob3J0IG51bUltYWdlczsKICNpZm5kZWYgU3ByaXRlTWVkaWFDb3VudEltYWdlcwotCVB5TWFjX1BSRUNIRUNLKFNwcml0ZU1lZGlhQ291bnRJbWFnZXMpOworICAgIFB5TWFjX1BSRUNIRUNLKFNwcml0ZU1lZGlhQ291bnRJbWFnZXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNwcml0ZU1lZGlhQ291bnRJbWFnZXMobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbnVtSW1hZ2VzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBudW1JbWFnZXMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTcHJpdGVNZWRpYUNvdW50SW1hZ2VzKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm51bUltYWdlcyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgbnVtSW1hZ2VzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TcHJpdGVNZWRpYUdldEluZEltYWdlRGVzY3JpcHRpb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCXNob3J0IGltYWdlSW5kZXg7Ci0JSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBpbWFnZURlc2NyaXB0aW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBzaG9ydCBpbWFnZUluZGV4OworICAgIEltYWdlRGVzY3JpcHRpb25IYW5kbGUgaW1hZ2VEZXNjcmlwdGlvbjsKICNpZm5kZWYgU3ByaXRlTWVkaWFHZXRJbmRJbWFnZURlc2NyaXB0aW9uCi0JUHlNYWNfUFJFQ0hFQ0soU3ByaXRlTWVkaWFHZXRJbmRJbWFnZURlc2NyaXB0aW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTcHJpdGVNZWRpYUdldEluZEltYWdlRGVzY3JpcHRpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmltYWdlSW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaW1hZ2VEZXNjcmlwdGlvbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNwcml0ZU1lZGlhR2V0SW5kSW1hZ2VEZXNjcmlwdGlvbihtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VJbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VEZXNjcmlwdGlvbik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmltYWdlSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaW1hZ2VEZXNjcmlwdGlvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNwcml0ZU1lZGlhR2V0SW5kSW1hZ2VEZXNjcmlwdGlvbihtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VEZXNjcmlwdGlvbik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU3ByaXRlTWVkaWFHZXREaXNwbGF5ZWRTYW1wbGVOdW1iZXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCWxvbmcgc2FtcGxlTnVtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBsb25nIHNhbXBsZU51bTsKICNpZm5kZWYgU3ByaXRlTWVkaWFHZXREaXNwbGF5ZWRTYW1wbGVOdW1iZXIKLQlQeU1hY19QUkVDSEVDSyhTcHJpdGVNZWRpYUdldERpc3BsYXllZFNhbXBsZU51bWJlcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU3ByaXRlTWVkaWFHZXREaXNwbGF5ZWRTYW1wbGVOdW1iZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNwcml0ZU1lZGlhR2V0RGlzcGxheWVkU2FtcGxlTnVtYmVyKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGVOdW0pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHNhbXBsZU51bSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNwcml0ZU1lZGlhR2V0RGlzcGxheWVkU2FtcGxlTnVtYmVyKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGVOdW0pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZU51bSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU3ByaXRlTWVkaWFHZXRTcHJpdGVOYW1lKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlRVEF0b21JRCBzcHJpdGVJRDsKLQlTdHIyNTUgc3ByaXRlTmFtZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgUVRBdG9tSUQgc3ByaXRlSUQ7CisgICAgU3RyMjU1IHNwcml0ZU5hbWU7CiAjaWZuZGVmIFNwcml0ZU1lZGlhR2V0U3ByaXRlTmFtZQotCVB5TWFjX1BSRUNIRUNLKFNwcml0ZU1lZGlhR2V0U3ByaXRlTmFtZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU3ByaXRlTWVkaWFHZXRTcHJpdGVOYW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZzcHJpdGVJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBzcHJpdGVOYW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU3ByaXRlTWVkaWFHZXRTcHJpdGVOYW1lKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpdGVJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaXRlTmFtZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNwcml0ZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIHNwcml0ZU5hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTcHJpdGVNZWRpYUdldFNwcml0ZU5hbWUobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcml0ZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpdGVOYW1lKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TcHJpdGVNZWRpYUdldEltYWdlTmFtZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0Jc2hvcnQgaW1hZ2VJbmRleDsKLQlTdHIyNTUgaW1hZ2VOYW1lOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBzaG9ydCBpbWFnZUluZGV4OworICAgIFN0cjI1NSBpbWFnZU5hbWU7CiAjaWZuZGVmIFNwcml0ZU1lZGlhR2V0SW1hZ2VOYW1lCi0JUHlNYWNfUFJFQ0hFQ0soU3ByaXRlTWVkaWFHZXRJbWFnZU5hbWUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNwcml0ZU1lZGlhR2V0SW1hZ2VOYW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbWFnZUluZGV4LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIGltYWdlTmFtZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNwcml0ZU1lZGlhR2V0SW1hZ2VOYW1lKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlSW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VOYW1lKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW1hZ2VJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBpbWFnZU5hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTcHJpdGVNZWRpYUdldEltYWdlTmFtZShtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlTmFtZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU3ByaXRlTWVkaWFTZXRTcHJpdGVQcm9wZXJ0eShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JUVRBdG9tSUQgc3ByaXRlSUQ7Ci0JbG9uZyBwcm9wZXJ0eVR5cGU7Ci0Jdm9pZCAqIHByb3BlcnR5VmFsdWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIFFUQXRvbUlEIHNwcml0ZUlEOworICAgIGxvbmcgcHJvcGVydHlUeXBlOworICAgIHZvaWQgKiBwcm9wZXJ0eVZhbHVlOwogI2lmbmRlZiBTcHJpdGVNZWRpYVNldFNwcml0ZVByb3BlcnR5Ci0JUHlNYWNfUFJFQ0hFQ0soU3ByaXRlTWVkaWFTZXRTcHJpdGVQcm9wZXJ0eSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU3ByaXRlTWVkaWFTZXRTcHJpdGVQcm9wZXJ0eSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxscyIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmc3ByaXRlSUQsCi0JICAgICAgICAgICAgICAgICAgICAgICZwcm9wZXJ0eVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZwcm9wZXJ0eVZhbHVlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU3ByaXRlTWVkaWFTZXRTcHJpdGVQcm9wZXJ0eShtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcml0ZUlELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlWYWx1ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNwcml0ZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJvcGVydHlUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJvcGVydHlWYWx1ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNwcml0ZU1lZGlhU2V0U3ByaXRlUHJvcGVydHkobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpdGVJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5VmFsdWUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1Nwcml0ZU1lZGlhR2V0U3ByaXRlUHJvcGVydHkoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCVFUQXRvbUlEIHNwcml0ZUlEOwotCWxvbmcgcHJvcGVydHlUeXBlOwotCXZvaWQgKiBwcm9wZXJ0eVZhbHVlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBRVEF0b21JRCBzcHJpdGVJRDsKKyAgICBsb25nIHByb3BlcnR5VHlwZTsKKyAgICB2b2lkICogcHJvcGVydHlWYWx1ZTsKICNpZm5kZWYgU3ByaXRlTWVkaWFHZXRTcHJpdGVQcm9wZXJ0eQotCVB5TWFjX1BSRUNIRUNLKFNwcml0ZU1lZGlhR2V0U3ByaXRlUHJvcGVydHkpOworICAgIFB5TWFjX1BSRUNIRUNLKFNwcml0ZU1lZGlhR2V0U3ByaXRlUHJvcGVydHkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbHMiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNwcml0ZUlELAotCSAgICAgICAgICAgICAgICAgICAgICAmcHJvcGVydHlUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAmcHJvcGVydHlWYWx1ZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNwcml0ZU1lZGlhR2V0U3ByaXRlUHJvcGVydHkobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpdGVJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5VHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5VmFsdWUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGxzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzcHJpdGVJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnByb3BlcnR5VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnByb3BlcnR5VmFsdWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTcHJpdGVNZWRpYUdldFNwcml0ZVByb3BlcnR5KG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaXRlSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVZhbHVlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TcHJpdGVNZWRpYUhpdFRlc3RBbGxTcHJpdGVzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlsb25nIGZsYWdzOwotCVBvaW50IGxvYzsKLQlRVEF0b21JRCBzcHJpdGVIaXRJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgbG9uZyBmbGFnczsKKyAgICBQb2ludCBsb2M7CisgICAgUVRBdG9tSUQgc3ByaXRlSGl0SUQ7CiAjaWZuZGVmIFNwcml0ZU1lZGlhSGl0VGVzdEFsbFNwcml0ZXMKLQlQeU1hY19QUkVDSEVDSyhTcHJpdGVNZWRpYUhpdFRlc3RBbGxTcHJpdGVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTcHJpdGVNZWRpYUhpdFRlc3RBbGxTcHJpdGVzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZsb2MpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTcHJpdGVNZWRpYUhpdFRlc3RBbGxTcHJpdGVzKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3ByaXRlSGl0SUQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHNwcml0ZUhpdElEKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmbG9jKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU3ByaXRlTWVkaWFIaXRUZXN0QWxsU3ByaXRlcyhtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNwcml0ZUhpdElEKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpdGVIaXRJRCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU3ByaXRlTWVkaWFIaXRUZXN0T25lU3ByaXRlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlRVEF0b21JRCBzcHJpdGVJRDsKLQlsb25nIGZsYWdzOwotCVBvaW50IGxvYzsKLQlCb29sZWFuIHdhc0hpdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgUVRBdG9tSUQgc3ByaXRlSUQ7CisgICAgbG9uZyBmbGFnczsKKyAgICBQb2ludCBsb2M7CisgICAgQm9vbGVhbiB3YXNIaXQ7CiAjaWZuZGVmIFNwcml0ZU1lZGlhSGl0VGVzdE9uZVNwcml0ZQotCVB5TWFjX1BSRUNIRUNLKFNwcml0ZU1lZGlhSGl0VGVzdE9uZVNwcml0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU3ByaXRlTWVkaWFIaXRUZXN0T25lU3ByaXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmc3ByaXRlSUQsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZsb2MpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTcHJpdGVNZWRpYUhpdFRlc3RPbmVTcHJpdGUobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcml0ZUlELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd2FzSGl0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICB3YXNIaXQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3ByaXRlSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZsb2MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTcHJpdGVNZWRpYUhpdFRlc3RPbmVTcHJpdGUobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcml0ZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd2FzSGl0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB3YXNIaXQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1Nwcml0ZU1lZGlhU3ByaXRlSW5kZXhUb0lEKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlzaG9ydCBzcHJpdGVJbmRleDsKLQlRVEF0b21JRCBzcHJpdGVJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgc2hvcnQgc3ByaXRlSW5kZXg7CisgICAgUVRBdG9tSUQgc3ByaXRlSUQ7CiAjaWZuZGVmIFNwcml0ZU1lZGlhU3ByaXRlSW5kZXhUb0lECi0JUHlNYWNfUFJFQ0hFQ0soU3ByaXRlTWVkaWFTcHJpdGVJbmRleFRvSUQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNwcml0ZU1lZGlhU3ByaXRlSW5kZXhUb0lEKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmc3ByaXRlSW5kZXgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTcHJpdGVNZWRpYVNwcml0ZUluZGV4VG9JRChtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpdGVJbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3ByaXRlSUQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHNwcml0ZUlEKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNwcml0ZUluZGV4KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU3ByaXRlTWVkaWFTcHJpdGVJbmRleFRvSUQobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaXRlSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNwcml0ZUlEKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpdGVJRCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU3ByaXRlTWVkaWFTcHJpdGVJRFRvSW5kZXgoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCVFUQXRvbUlEIHNwcml0ZUlEOwotCXNob3J0IHNwcml0ZUluZGV4OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBRVEF0b21JRCBzcHJpdGVJRDsKKyAgICBzaG9ydCBzcHJpdGVJbmRleDsKICNpZm5kZWYgU3ByaXRlTWVkaWFTcHJpdGVJRFRvSW5kZXgKLQlQeU1hY19QUkVDSEVDSyhTcHJpdGVNZWRpYVNwcml0ZUlEVG9JbmRleCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU3ByaXRlTWVkaWFTcHJpdGVJRFRvSW5kZXgpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZzcHJpdGVJRCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNwcml0ZU1lZGlhU3ByaXRlSURUb0luZGV4KG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcml0ZUlELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzcHJpdGVJbmRleCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgc3ByaXRlSW5kZXgpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3ByaXRlSUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTcHJpdGVNZWRpYVNwcml0ZUlEVG9JbmRleChtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpdGVJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3ByaXRlSW5kZXgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHNwcml0ZUluZGV4KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TcHJpdGVNZWRpYVNldEFjdGlvblZhcmlhYmxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlRVEF0b21JRCB2YXJpYWJsZUlEOwotCWZsb2F0IHZhbHVlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBRVEF0b21JRCB2YXJpYWJsZUlEOworICAgIGZsb2F0IHZhbHVlOwogI2lmbmRlZiBTcHJpdGVNZWRpYVNldEFjdGlvblZhcmlhYmxlCi0JUHlNYWNfUFJFQ0hFQ0soU3ByaXRlTWVkaWFTZXRBY3Rpb25WYXJpYWJsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU3ByaXRlTWVkaWFTZXRBY3Rpb25WYXJpYWJsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxmIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2YXJpYWJsZUlELAotCSAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTcHJpdGVNZWRpYVNldEFjdGlvblZhcmlhYmxlKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFyaWFibGVJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU3ByaXRlTWVkaWFTZXRBY3Rpb25WYXJpYWJsZShtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1Nwcml0ZU1lZGlhR2V0QWN0aW9uVmFyaWFibGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCVFUQXRvbUlEIHZhcmlhYmxlSUQ7Ci0JZmxvYXQgdmFsdWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIFFUQXRvbUlEIHZhcmlhYmxlSUQ7CisgICAgZmxvYXQgdmFsdWU7CiAjaWZuZGVmIFNwcml0ZU1lZGlhR2V0QWN0aW9uVmFyaWFibGUKLQlQeU1hY19QUkVDSEVDSyhTcHJpdGVNZWRpYUdldEFjdGlvblZhcmlhYmxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTcHJpdGVNZWRpYUdldEFjdGlvblZhcmlhYmxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmdmFyaWFibGVJRCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNwcml0ZU1lZGlhR2V0QWN0aW9uVmFyaWFibGUobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZUlELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICB2YWx1ZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YXJpYWJsZUlEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU3ByaXRlTWVkaWFHZXRBY3Rpb25WYXJpYWJsZShtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TcHJpdGVNZWRpYURpc3Bvc2VTcHJpdGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCVFUQXRvbUlEIHNwcml0ZUlEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBRVEF0b21JRCBzcHJpdGVJRDsKICNpZm5kZWYgU3ByaXRlTWVkaWFEaXNwb3NlU3ByaXRlCi0JUHlNYWNfUFJFQ0hFQ0soU3ByaXRlTWVkaWFEaXNwb3NlU3ByaXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTcHJpdGVNZWRpYURpc3Bvc2VTcHJpdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZzcHJpdGVJRCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNwcml0ZU1lZGlhRGlzcG9zZVNwcml0ZShtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaXRlSUQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3ByaXRlSUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTcHJpdGVNZWRpYURpc3Bvc2VTcHJpdGUobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcml0ZUlEKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TcHJpdGVNZWRpYVNldEFjdGlvblZhcmlhYmxlVG9TdHJpbmcoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCVFUQXRvbUlEIHZhcmlhYmxlSUQ7Ci0JUHRyIHRoZUNTdHJpbmc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIFFUQXRvbUlEIHZhcmlhYmxlSUQ7CisgICAgUHRyIHRoZUNTdHJpbmc7CiAjaWZuZGVmIFNwcml0ZU1lZGlhU2V0QWN0aW9uVmFyaWFibGVUb1N0cmluZwotCVB5TWFjX1BSRUNIRUNLKFNwcml0ZU1lZGlhU2V0QWN0aW9uVmFyaWFibGVUb1N0cmluZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU3ByaXRlTWVkaWFTZXRBY3Rpb25WYXJpYWJsZVRvU3RyaW5nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbHMiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZhcmlhYmxlSUQsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aGVDU3RyaW5nKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU3ByaXRlTWVkaWFTZXRBY3Rpb25WYXJpYWJsZVRvU3RyaW5nKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZUlELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVDU3RyaW5nKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YXJpYWJsZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlQ1N0cmluZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNwcml0ZU1lZGlhU2V0QWN0aW9uVmFyaWFibGVUb1N0cmluZyhtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlQ1N0cmluZyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU3ByaXRlTWVkaWFHZXRBY3Rpb25WYXJpYWJsZUFzU3RyaW5nKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlRVEF0b21JRCB2YXJpYWJsZUlEOwotCUhhbmRsZSB0aGVDU3RyaW5nOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBRVEF0b21JRCB2YXJpYWJsZUlEOworICAgIEhhbmRsZSB0aGVDU3RyaW5nOwogI2lmbmRlZiBTcHJpdGVNZWRpYUdldEFjdGlvblZhcmlhYmxlQXNTdHJpbmcKLQlQeU1hY19QUkVDSEVDSyhTcHJpdGVNZWRpYUdldEFjdGlvblZhcmlhYmxlQXNTdHJpbmcpOworICAgIFB5TWFjX1BSRUNIRUNLKFNwcml0ZU1lZGlhR2V0QWN0aW9uVmFyaWFibGVBc1N0cmluZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZhcmlhYmxlSUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTcHJpdGVNZWRpYUdldEFjdGlvblZhcmlhYmxlQXNTdHJpbmcobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlSUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVDU3RyaW5nKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgdGhlQ1N0cmluZyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YXJpYWJsZUlEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU3ByaXRlTWVkaWFHZXRBY3Rpb25WYXJpYWJsZUFzU3RyaW5nKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlQ1N0cmluZyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHRoZUNTdHJpbmcpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1Nwcml0ZU1lZGlhTmV3SW1hZ2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCUhhbmRsZSBkYXRhUmVmOwotCU9TVHlwZSBkYXRhUmVmVHlwZTsKLQlRVEF0b21JRCBkZXNpcmVkSUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIEhhbmRsZSBkYXRhUmVmOworICAgIE9TVHlwZSBkYXRhUmVmVHlwZTsKKyAgICBRVEF0b21JRCBkZXNpcmVkSUQ7CiAjaWZuZGVmIFNwcml0ZU1lZGlhTmV3SW1hZ2UKLQlQeU1hY19QUkVDSEVDSyhTcHJpdGVNZWRpYU5ld0ltYWdlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTcHJpdGVNZWRpYU5ld0ltYWdlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkYXRhUmVmVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRlc2lyZWRJRCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNwcml0ZU1lZGlhTmV3SW1hZ2UobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZlR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNpcmVkSUQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkYXRhUmVmVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc2lyZWRJRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNwcml0ZU1lZGlhTmV3SW1hZ2UobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZlR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNpcmVkSUQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1Nwcml0ZU1lZGlhRGlzcG9zZUltYWdlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlzaG9ydCBpbWFnZUluZGV4OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBzaG9ydCBpbWFnZUluZGV4OwogI2lmbmRlZiBTcHJpdGVNZWRpYURpc3Bvc2VJbWFnZQotCVB5TWFjX1BSRUNIRUNLKFNwcml0ZU1lZGlhRGlzcG9zZUltYWdlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTcHJpdGVNZWRpYURpc3Bvc2VJbWFnZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmltYWdlSW5kZXgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTcHJpdGVNZWRpYURpc3Bvc2VJbWFnZShtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUluZGV4KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmltYWdlSW5kZXgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTcHJpdGVNZWRpYURpc3Bvc2VJbWFnZShtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUluZGV4KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TcHJpdGVNZWRpYUltYWdlSW5kZXhUb0lEKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlzaG9ydCBpbWFnZUluZGV4OwotCVFUQXRvbUlEIGltYWdlSUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIHNob3J0IGltYWdlSW5kZXg7CisgICAgUVRBdG9tSUQgaW1hZ2VJRDsKICNpZm5kZWYgU3ByaXRlTWVkaWFJbWFnZUluZGV4VG9JRAotCVB5TWFjX1BSRUNIRUNLKFNwcml0ZU1lZGlhSW1hZ2VJbmRleFRvSUQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNwcml0ZU1lZGlhSW1hZ2VJbmRleFRvSUQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbWFnZUluZGV4KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU3ByaXRlTWVkaWFJbWFnZUluZGV4VG9JRChtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlSW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW1hZ2VJRCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgaW1hZ2VJRCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbWFnZUluZGV4KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU3ByaXRlTWVkaWFJbWFnZUluZGV4VG9JRChtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW1hZ2VJRCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VJRCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU3ByaXRlTWVkaWFJbWFnZUlEVG9JbmRleChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JUVRBdG9tSUQgaW1hZ2VJRDsKLQlzaG9ydCBpbWFnZUluZGV4OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBRVEF0b21JRCBpbWFnZUlEOworICAgIHNob3J0IGltYWdlSW5kZXg7CiAjaWZuZGVmIFNwcml0ZU1lZGlhSW1hZ2VJRFRvSW5kZXgKLQlQeU1hY19QUkVDSEVDSyhTcHJpdGVNZWRpYUltYWdlSURUb0luZGV4KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTcHJpdGVNZWRpYUltYWdlSURUb0luZGV4KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW1hZ2VJRCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNwcml0ZU1lZGlhSW1hZ2VJRFRvSW5kZXgobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUlELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmltYWdlSW5kZXgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGltYWdlSW5kZXgpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW1hZ2VJRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNwcml0ZU1lZGlhSW1hZ2VJRFRvSW5kZXgobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmltYWdlSW5kZXgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlSW5kZXgpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0ZsYXNoTWVkaWFTZXRQYW4oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCXNob3J0IHhQZXJjZW50OwotCXNob3J0IHlQZXJjZW50OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBzaG9ydCB4UGVyY2VudDsKKyAgICBzaG9ydCB5UGVyY2VudDsKICNpZm5kZWYgRmxhc2hNZWRpYVNldFBhbgotCVB5TWFjX1BSRUNIRUNLKEZsYXNoTWVkaWFTZXRQYW4pOworICAgIFB5TWFjX1BSRUNIRUNLKEZsYXNoTWVkaWFTZXRQYW4pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmeFBlcmNlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICZ5UGVyY2VudCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEZsYXNoTWVkaWFTZXRQYW4obWgsCi0JICAgICAgICAgICAgICAgICAgICAgICB4UGVyY2VudCwKLQkgICAgICAgICAgICAgICAgICAgICAgIHlQZXJjZW50KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ4UGVyY2VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnlQZXJjZW50KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRmxhc2hNZWRpYVNldFBhbihtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHhQZXJjZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgeVBlcmNlbnQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0ZsYXNoTWVkaWFTZXRab29tKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlzaG9ydCBmYWN0b3I7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIHNob3J0IGZhY3RvcjsKICNpZm5kZWYgRmxhc2hNZWRpYVNldFpvb20KLQlQeU1hY19QUkVDSEVDSyhGbGFzaE1lZGlhU2V0Wm9vbSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRmxhc2hNZWRpYVNldFpvb20pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZmYWN0b3IpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBGbGFzaE1lZGlhU2V0Wm9vbShtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3IpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmFjdG9yKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRmxhc2hNZWRpYVNldFpvb20obWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9GbGFzaE1lZGlhU2V0Wm9vbVJlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCWxvbmcgbGVmdDsKLQlsb25nIHRvcDsKLQlsb25nIHJpZ2h0OwotCWxvbmcgYm90dG9tOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBsb25nIGxlZnQ7CisgICAgbG9uZyB0b3A7CisgICAgbG9uZyByaWdodDsKKyAgICBsb25nIGJvdHRvbTsKICNpZm5kZWYgRmxhc2hNZWRpYVNldFpvb21SZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soRmxhc2hNZWRpYVNldFpvb21SZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhGbGFzaE1lZGlhU2V0Wm9vbVJlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbGxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZsZWZ0LAotCSAgICAgICAgICAgICAgICAgICAgICAmdG9wLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmlnaHQsCi0JICAgICAgICAgICAgICAgICAgICAgICZib3R0b20pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBGbGFzaE1lZGlhU2V0Wm9vbVJlY3QobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdHRvbSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbGxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZib3R0b20pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBGbGFzaE1lZGlhU2V0Wm9vbVJlY3QobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdHRvbSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRmxhc2hNZWRpYUdldFJlZkNvbkJvdW5kcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JbG9uZyByZWZDb247Ci0JbG9uZyBsZWZ0OwotCWxvbmcgdG9wOwotCWxvbmcgcmlnaHQ7Ci0JbG9uZyBib3R0b207CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIGxvbmcgcmVmQ29uOworICAgIGxvbmcgbGVmdDsKKyAgICBsb25nIHRvcDsKKyAgICBsb25nIHJpZ2h0OworICAgIGxvbmcgYm90dG9tOwogI2lmbmRlZiBGbGFzaE1lZGlhR2V0UmVmQ29uQm91bmRzCi0JUHlNYWNfUFJFQ0hFQ0soRmxhc2hNZWRpYUdldFJlZkNvbkJvdW5kcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRmxhc2hNZWRpYUdldFJlZkNvbkJvdW5kcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJlZkNvbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEZsYXNoTWVkaWFHZXRSZWZDb25Cb3VuZHMobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZDb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGVmdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0b3AsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmlnaHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm90dG9tKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGxsbGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBsZWZ0LAotCSAgICAgICAgICAgICAgICAgICAgIHRvcCwKLQkgICAgICAgICAgICAgICAgICAgICByaWdodCwKLQkgICAgICAgICAgICAgICAgICAgICBib3R0b20pOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVmQ29uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRmxhc2hNZWRpYUdldFJlZkNvbkJvdW5kcyhtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZkNvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3R0b20pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbGxsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvdHRvbSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRmxhc2hNZWRpYUdldFJlZkNvbklEKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlsb25nIHJlZkNvbjsKLQlsb25nIHJlZkNvbklEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBsb25nIHJlZkNvbjsKKyAgICBsb25nIHJlZkNvbklEOwogI2lmbmRlZiBGbGFzaE1lZGlhR2V0UmVmQ29uSUQKLQlQeU1hY19QUkVDSEVDSyhGbGFzaE1lZGlhR2V0UmVmQ29uSUQpOworICAgIFB5TWFjX1BSRUNIRUNLKEZsYXNoTWVkaWFHZXRSZWZDb25JRCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJlZkNvbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEZsYXNoTWVkaWFHZXRSZWZDb25JRChtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmQ29uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVmQ29uSUQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHJlZkNvbklEKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZkNvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEZsYXNoTWVkaWFHZXRSZWZDb25JRChtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmQ29uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVmQ29uSUQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlZkNvbklEKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9GbGFzaE1lZGlhSURUb1JlZkNvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JbG9uZyByZWZDb25JRDsKLQlsb25nIHJlZkNvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgbG9uZyByZWZDb25JRDsKKyAgICBsb25nIHJlZkNvbjsKICNpZm5kZWYgRmxhc2hNZWRpYUlEVG9SZWZDb24KLQlQeU1hY19QUkVDSEVDSyhGbGFzaE1lZGlhSURUb1JlZkNvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soRmxhc2hNZWRpYUlEVG9SZWZDb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZWZDb25JRCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEZsYXNoTWVkaWFJRFRvUmVmQ29uKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZkNvbklELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWZDb24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHJlZkNvbik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWZDb25JRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEZsYXNoTWVkaWFJRFRvUmVmQ29uKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZkNvbklELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWZDb24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlZkNvbik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRmxhc2hNZWRpYUdldERpc3BsYXllZEZyYW1lTnVtYmVyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlsb25nIGZsYXNoRnJhbWVOdW1iZXI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIGxvbmcgZmxhc2hGcmFtZU51bWJlcjsKICNpZm5kZWYgRmxhc2hNZWRpYUdldERpc3BsYXllZEZyYW1lTnVtYmVyCi0JUHlNYWNfUFJFQ0hFQ0soRmxhc2hNZWRpYUdldERpc3BsYXllZEZyYW1lTnVtYmVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhGbGFzaE1lZGlhR2V0RGlzcGxheWVkRnJhbWVOdW1iZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEZsYXNoTWVkaWFHZXREaXNwbGF5ZWRGcmFtZU51bWJlcihtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYXNoRnJhbWVOdW1iZXIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGZsYXNoRnJhbWVOdW1iZXIpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBGbGFzaE1lZGlhR2V0RGlzcGxheWVkRnJhbWVOdW1iZXIobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFzaEZyYW1lTnVtYmVyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmbGFzaEZyYW1lTnVtYmVyKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9GbGFzaE1lZGlhRnJhbWVOdW1iZXJUb01vdmllVGltZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JbG9uZyBmbGFzaEZyYW1lTnVtYmVyOwotCVRpbWVWYWx1ZSBtb3ZpZVRpbWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIGxvbmcgZmxhc2hGcmFtZU51bWJlcjsKKyAgICBUaW1lVmFsdWUgbW92aWVUaW1lOwogI2lmbmRlZiBGbGFzaE1lZGlhRnJhbWVOdW1iZXJUb01vdmllVGltZQotCVB5TWFjX1BSRUNIRUNLKEZsYXNoTWVkaWFGcmFtZU51bWJlclRvTW92aWVUaW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhGbGFzaE1lZGlhRnJhbWVOdW1iZXJUb01vdmllVGltZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYXNoRnJhbWVOdW1iZXIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBGbGFzaE1lZGlhRnJhbWVOdW1iZXJUb01vdmllVGltZShtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFzaEZyYW1lTnVtYmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtb3ZpZVRpbWUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIG1vdmllVGltZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFzaEZyYW1lTnVtYmVyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRmxhc2hNZWRpYUZyYW1lTnVtYmVyVG9Nb3ZpZVRpbWUobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhc2hGcmFtZU51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbW92aWVUaW1lKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtb3ZpZVRpbWUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0ZsYXNoTWVkaWFGcmFtZUxhYmVsVG9Nb3ZpZVRpbWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCVB0ciB0aGVMYWJlbDsKLQlUaW1lVmFsdWUgbW92aWVUaW1lOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBQdHIgdGhlTGFiZWw7CisgICAgVGltZVZhbHVlIG1vdmllVGltZTsKICNpZm5kZWYgRmxhc2hNZWRpYUZyYW1lTGFiZWxUb01vdmllVGltZQotCVB5TWFjX1BSRUNIRUNLKEZsYXNoTWVkaWFGcmFtZUxhYmVsVG9Nb3ZpZVRpbWUpOworICAgIFB5TWFjX1BSRUNIRUNLKEZsYXNoTWVkaWFGcmFtZUxhYmVsVG9Nb3ZpZVRpbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aGVMYWJlbCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEZsYXNoTWVkaWFGcmFtZUxhYmVsVG9Nb3ZpZVRpbWUobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVMYWJlbCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtb3ZpZVRpbWUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIG1vdmllVGltZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVMYWJlbCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEZsYXNoTWVkaWFGcmFtZUxhYmVsVG9Nb3ZpZVRpbWUobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVMYWJlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtb3ZpZVRpbWUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIG1vdmllVGltZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRmxhc2hNZWRpYUdldEZsYXNoVmFyaWFibGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCWNoYXIgcGF0aDsKLQljaGFyIG5hbWU7Ci0JSGFuZGxlIHRoZVZhcmlhYmxlQ1N0cmluZ091dDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgY2hhciBwYXRoOworICAgIGNoYXIgbmFtZTsKKyAgICBIYW5kbGUgdGhlVmFyaWFibGVDU3RyaW5nT3V0OwogI2lmbmRlZiBGbGFzaE1lZGlhR2V0Rmxhc2hWYXJpYWJsZQotCVB5TWFjX1BSRUNIRUNLKEZsYXNoTWVkaWFHZXRGbGFzaFZhcmlhYmxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhGbGFzaE1lZGlhR2V0Rmxhc2hWYXJpYWJsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRmxhc2hNZWRpYUdldEZsYXNoVmFyaWFibGUobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhdGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZVZhcmlhYmxlQ1N0cmluZ091dCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxjY08mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgcGF0aCwKLQkgICAgICAgICAgICAgICAgICAgICBuYW1lLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHRoZVZhcmlhYmxlQ1N0cmluZ091dCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEZsYXNoTWVkaWFHZXRGbGFzaFZhcmlhYmxlKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVWYXJpYWJsZUNTdHJpbmdPdXQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsY2NPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCB0aGVWYXJpYWJsZUNTdHJpbmdPdXQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0ZsYXNoTWVkaWFTZXRGbGFzaFZhcmlhYmxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQljaGFyIHBhdGg7Ci0JY2hhciBuYW1lOwotCWNoYXIgdmFsdWU7Ci0JQm9vbGVhbiB1cGRhdGVGb2N1czsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgY2hhciBwYXRoOworICAgIGNoYXIgbmFtZTsKKyAgICBjaGFyIHZhbHVlOworICAgIEJvb2xlYW4gdXBkYXRlRm9jdXM7CiAjaWZuZGVmIEZsYXNoTWVkaWFTZXRGbGFzaFZhcmlhYmxlCi0JUHlNYWNfUFJFQ0hFQ0soRmxhc2hNZWRpYVNldEZsYXNoVmFyaWFibGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEZsYXNoTWVkaWFTZXRGbGFzaFZhcmlhYmxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmdXBkYXRlRm9jdXMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBGbGFzaE1lZGlhU2V0Rmxhc2hWYXJpYWJsZShtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGF0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlRm9jdXMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsY2NjIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgcGF0aCwKLQkgICAgICAgICAgICAgICAgICAgICBuYW1lLAotCSAgICAgICAgICAgICAgICAgICAgIHZhbHVlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnVwZGF0ZUZvY3VzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRmxhc2hNZWRpYVNldEZsYXNoVmFyaWFibGUobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUZvY3VzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGNjYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRmxhc2hNZWRpYURvQnV0dG9uQWN0aW9ucyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JY2hhciBwYXRoOwotCWxvbmcgYnV0dG9uSUQ7Ci0JbG9uZyB0cmFuc2l0aW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBjaGFyIHBhdGg7CisgICAgbG9uZyBidXR0b25JRDsKKyAgICBsb25nIHRyYW5zaXRpb247CiAjaWZuZGVmIEZsYXNoTWVkaWFEb0J1dHRvbkFjdGlvbnMKLQlQeU1hY19QUkVDSEVDSyhGbGFzaE1lZGlhRG9CdXR0b25BY3Rpb25zKTsKKyAgICBQeU1hY19QUkVDSEVDSyhGbGFzaE1lZGlhRG9CdXR0b25BY3Rpb25zKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmJ1dHRvbklELAotCSAgICAgICAgICAgICAgICAgICAgICAmdHJhbnNpdGlvbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEZsYXNoTWVkaWFEb0J1dHRvbkFjdGlvbnMobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGF0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvbklELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxjIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgcGF0aCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYnV0dG9uSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFuc2l0aW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRmxhc2hNZWRpYURvQnV0dG9uQWN0aW9ucyhtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9uSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGMiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9GbGFzaE1lZGlhR2V0U3VwcG9ydGVkU3dmVmVyc2lvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JVUludDggc3dmVmVyc2lvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgVUludDggc3dmVmVyc2lvbjsKICNpZm5kZWYgRmxhc2hNZWRpYUdldFN1cHBvcnRlZFN3ZlZlcnNpb24KLQlQeU1hY19QUkVDSEVDSyhGbGFzaE1lZGlhR2V0U3VwcG9ydGVkU3dmVmVyc2lvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soRmxhc2hNZWRpYUdldFN1cHBvcnRlZFN3ZlZlcnNpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEZsYXNoTWVkaWFHZXRTdXBwb3J0ZWRTd2ZWZXJzaW9uKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzd2ZWZXJzaW9uKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBzd2ZWZXJzaW9uKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRmxhc2hNZWRpYUdldFN1cHBvcnRlZFN3ZlZlcnNpb24obWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN3ZlZlcnNpb24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHN3ZlZlcnNpb24pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhM0RHZXRDdXJyZW50R3JvdXAoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCXZvaWQgKiBncm91cDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgdm9pZCAqIGdyb3VwOwogI2lmbmRlZiBNZWRpYTNER2V0Q3VycmVudEdyb3VwCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWEzREdldEN1cnJlbnRHcm91cCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWEzREdldEN1cnJlbnRHcm91cCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnMiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmdyb3VwKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWEzREdldEN1cnJlbnRHcm91cChtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmdyb3VwKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWEzREdldEN1cnJlbnRHcm91cChtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYTNEVHJhbnNsYXRlTmFtZWRPYmplY3RUbyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JY2hhciBvYmplY3ROYW1lOwotCUZpeGVkIHg7Ci0JRml4ZWQgeTsKLQlGaXhlZCB6OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBjaGFyIG9iamVjdE5hbWU7CisgICAgRml4ZWQgeDsKKyAgICBGaXhlZCB5OworICAgIEZpeGVkIHo7CiAjaWZuZGVmIE1lZGlhM0RUcmFuc2xhdGVOYW1lZE9iamVjdFRvCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWEzRFRyYW5zbGF0ZU5hbWVkT2JqZWN0VG8pOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhM0RUcmFuc2xhdGVOYW1lZE9iamVjdFRvKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmeCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZ5LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJnopKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYTNEVHJhbnNsYXRlTmFtZWRPYmplY3RUbyhtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2JqZWN0TmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxjIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgb2JqZWN0TmFtZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZ4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJnksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmeikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhM0RUcmFuc2xhdGVOYW1lZE9iamVjdFRvKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvYmplY3ROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGMiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3ROYW1lKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYTNEU2NhbGVOYW1lZE9iamVjdFRvKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQljaGFyIG9iamVjdE5hbWU7Ci0JRml4ZWQgeFNjYWxlOwotCUZpeGVkIHlTY2FsZTsKLQlGaXhlZCB6U2NhbGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIGNoYXIgb2JqZWN0TmFtZTsKKyAgICBGaXhlZCB4U2NhbGU7CisgICAgRml4ZWQgeVNjYWxlOworICAgIEZpeGVkIHpTY2FsZTsKICNpZm5kZWYgTWVkaWEzRFNjYWxlTmFtZWRPYmplY3RUbwotCVB5TWFjX1BSRUNIRUNLKE1lZGlhM0RTY2FsZU5hbWVkT2JqZWN0VG8pOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhM0RTY2FsZU5hbWVkT2JqZWN0VG8pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZ4U2NhbGUsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmeVNjYWxlLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJnpTY2FsZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhM0RTY2FsZU5hbWVkT2JqZWN0VG8obWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2JqZWN0TmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhTY2FsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlTY2FsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpTY2FsZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxjIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgb2JqZWN0TmFtZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZ4U2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmeVNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJnpTY2FsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhM0RTY2FsZU5hbWVkT2JqZWN0VG8obWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2JqZWN0TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhTY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlTY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpTY2FsZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0TmFtZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWEzRFJvdGF0ZU5hbWVkT2JqZWN0VG8oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCWNoYXIgb2JqZWN0TmFtZTsKLQlGaXhlZCB4RGVncmVlczsKLQlGaXhlZCB5RGVncmVlczsKLQlGaXhlZCB6RGVncmVlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgY2hhciBvYmplY3ROYW1lOworICAgIEZpeGVkIHhEZWdyZWVzOworICAgIEZpeGVkIHlEZWdyZWVzOworICAgIEZpeGVkIHpEZWdyZWVzOwogI2lmbmRlZiBNZWRpYTNEUm90YXRlTmFtZWRPYmplY3RUbwotCVB5TWFjX1BSRUNIRUNLKE1lZGlhM0RSb3RhdGVOYW1lZE9iamVjdFRvKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYTNEUm90YXRlTmFtZWRPYmplY3RUbyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJnhEZWdyZWVzLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJnlEZWdyZWVzLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJnpEZWdyZWVzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWEzRFJvdGF0ZU5hbWVkT2JqZWN0VG8obWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9iamVjdE5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeERlZ3JlZXMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeURlZ3JlZXMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgekRlZ3JlZXMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsYyIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIG9iamVjdE5hbWUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmeERlZ3JlZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmeURlZ3JlZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmekRlZ3JlZXMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYTNEUm90YXRlTmFtZWRPYmplY3RUbyhtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2JqZWN0TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4RGVncmVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5RGVncmVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6RGVncmVlcyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0TmFtZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWEzRFNldENhbWVyYURhdGEoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCXZvaWQgKiBjYW1lcmFEYXRhOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICB2b2lkICogY2FtZXJhRGF0YTsKICNpZm5kZWYgTWVkaWEzRFNldENhbWVyYURhdGEKLQlQeU1hY19QUkVDSEVDSyhNZWRpYTNEU2V0Q2FtZXJhRGF0YSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWEzRFNldENhbWVyYURhdGEpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZjYW1lcmFEYXRhKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWEzRFNldENhbWVyYURhdGEobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhRGF0YSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjYW1lcmFEYXRhKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWEzRFNldENhbWVyYURhdGEobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhRGF0YSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWEzREdldENhbWVyYURhdGEoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCXZvaWQgKiBjYW1lcmFEYXRhOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICB2b2lkICogY2FtZXJhRGF0YTsKICNpZm5kZWYgTWVkaWEzREdldENhbWVyYURhdGEKLQlQeU1hY19QUkVDSEVDSyhNZWRpYTNER2V0Q2FtZXJhRGF0YSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWEzREdldENhbWVyYURhdGEpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZjYW1lcmFEYXRhKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWEzREdldENhbWVyYURhdGEobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhRGF0YSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjYW1lcmFEYXRhKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWEzREdldENhbWVyYURhdGEobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhRGF0YSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWEzRFNldENhbWVyYUFuZ2xlQXNwZWN0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlRVEZsb2F0U2luZ2xlIGZvdjsKLQlRVEZsb2F0U2luZ2xlIGFzcGVjdFJhdGlvWFRvWTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgUVRGbG9hdFNpbmdsZSBmb3Y7CisgICAgUVRGbG9hdFNpbmdsZSBhc3BlY3RSYXRpb1hUb1k7CiAjaWZuZGVmIE1lZGlhM0RTZXRDYW1lcmFBbmdsZUFzcGVjdAotCVB5TWFjX1BSRUNIRUNLKE1lZGlhM0RTZXRDYW1lcmFBbmdsZUFzcGVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWEzRFNldENhbWVyYUFuZ2xlQXNwZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mZmYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZvdiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmFzcGVjdFJhdGlvWFRvWSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhM0RTZXRDYW1lcmFBbmdsZUFzcGVjdChtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm92LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3BlY3RSYXRpb1hUb1kpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mZmYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZvdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFzcGVjdFJhdGlvWFRvWSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhM0RTZXRDYW1lcmFBbmdsZUFzcGVjdChtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm92LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3BlY3RSYXRpb1hUb1kpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhM0RHZXRDYW1lcmFBbmdsZUFzcGVjdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JUVRGbG9hdFNpbmdsZSBmb3Y7Ci0JUVRGbG9hdFNpbmdsZSBhc3BlY3RSYXRpb1hUb1k7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIFFURmxvYXRTaW5nbGUgZm92OworICAgIFFURmxvYXRTaW5nbGUgYXNwZWN0UmF0aW9YVG9ZOwogI2lmbmRlZiBNZWRpYTNER2V0Q2FtZXJhQW5nbGVBc3BlY3QKLQlQeU1hY19QUkVDSEVDSyhNZWRpYTNER2V0Q2FtZXJhQW5nbGVBc3BlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhM0RHZXRDYW1lcmFBbmdsZUFzcGVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWEzREdldENhbWVyYUFuZ2xlQXNwZWN0KG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZm92LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXNwZWN0UmF0aW9YVG9ZKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGZmIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgZm92LAotCSAgICAgICAgICAgICAgICAgICAgIGFzcGVjdFJhdGlvWFRvWSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhM0RHZXRDYW1lcmFBbmdsZUFzcGVjdChtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZvdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFzcGVjdFJhdGlvWFRvWSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxmZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGZvdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhc3BlY3RSYXRpb1hUb1kpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhM0RTZXRDYW1lcmFSYW5nZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0Jdm9pZCAqIHRRM0NhbWVyYVJhbmdlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICB2b2lkICogdFEzQ2FtZXJhUmFuZ2U7CiAjaWZuZGVmIE1lZGlhM0RTZXRDYW1lcmFSYW5nZQotCVB5TWFjX1BSRUNIRUNLKE1lZGlhM0RTZXRDYW1lcmFSYW5nZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWEzRFNldENhbWVyYVJhbmdlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmdFEzQ2FtZXJhUmFuZ2UpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYTNEU2V0Q2FtZXJhUmFuZ2UobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRRM0NhbWVyYVJhbmdlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRRM0NhbWVyYVJhbmdlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWEzRFNldENhbWVyYVJhbmdlKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0UTNDYW1lcmFSYW5nZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWEzREdldENhbWVyYVJhbmdlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQl2b2lkICogdFEzQ2FtZXJhUmFuZ2U7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIHZvaWQgKiB0UTNDYW1lcmFSYW5nZTsKICNpZm5kZWYgTWVkaWEzREdldENhbWVyYVJhbmdlCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWEzREdldENhbWVyYVJhbmdlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYTNER2V0Q2FtZXJhUmFuZ2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0UTNDYW1lcmFSYW5nZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhM0RHZXRDYW1lcmFSYW5nZShtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFEzQ2FtZXJhUmFuZ2UpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdFEzQ2FtZXJhUmFuZ2UpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYTNER2V0Q2FtZXJhUmFuZ2UobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRRM0NhbWVyYVJhbmdlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9OZXdUaW1lQmFzZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVGltZUJhc2UgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBUaW1lQmFzZSBfcnY7CiAjaWZuZGVmIE5ld1RpbWVCYXNlCi0JUHlNYWNfUFJFQ0hFQ0soTmV3VGltZUJhc2UpOworICAgIFB5TWFjX1BSRUNIRUNLKE5ld1RpbWVCYXNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBOZXdUaW1lQmFzZSgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgVGltZUJhc2VPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBOZXdUaW1lQmFzZSgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgVGltZUJhc2VPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0NvbnZlcnRUaW1lKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlUaW1lUmVjb3JkIHRoZVRpbWU7Ci0JVGltZUJhc2UgbmV3QmFzZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVGltZVJlY29yZCB0aGVUaW1lOworICAgIFRpbWVCYXNlIG5ld0Jhc2U7CiAjaWZuZGVmIENvbnZlcnRUaW1lCi0JUHlNYWNfUFJFQ0hFQ0soQ29udmVydFRpbWUpOworICAgIFB5TWFjX1BSRUNIRUNLKENvbnZlcnRUaW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBRdFRpbWVSZWNvcmRfQ29udmVydCwgJnRoZVRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgIFRpbWVCYXNlT2JqX0NvbnZlcnQsICZuZXdCYXNlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ29udmVydFRpbWUoJnRoZVRpbWUsCi0JICAgICAgICAgICAgbmV3QmFzZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBRdFRpbWVSZWNvcmRfTmV3LCAmdGhlVGltZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFF0VGltZVJlY29yZF9Db252ZXJ0LCAmdGhlVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZUJhc2VPYmpfQ29udmVydCwgJm5ld0Jhc2UpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDb252ZXJ0VGltZSgmdGhlVGltZSwKKyAgICAgICAgICAgICAgICBuZXdCYXNlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFF0VGltZVJlY29yZF9OZXcsICZ0aGVUaW1lKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9Db252ZXJ0VGltZVNjYWxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlUaW1lUmVjb3JkIHRoZVRpbWU7Ci0JVGltZVNjYWxlIG5ld1NjYWxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBUaW1lUmVjb3JkIHRoZVRpbWU7CisgICAgVGltZVNjYWxlIG5ld1NjYWxlOwogI2lmbmRlZiBDb252ZXJ0VGltZVNjYWxlCi0JUHlNYWNfUFJFQ0hFQ0soQ29udmVydFRpbWVTY2FsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ29udmVydFRpbWVTY2FsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBRdFRpbWVSZWNvcmRfQ29udmVydCwgJnRoZVRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZuZXdTY2FsZSkpCi0JCXJldHVybiBOVUxMOwotCUNvbnZlcnRUaW1lU2NhbGUoJnRoZVRpbWUsCi0JICAgICAgICAgICAgICAgICBuZXdTY2FsZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBRdFRpbWVSZWNvcmRfTmV3LCAmdGhlVGltZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUXRUaW1lUmVjb3JkX0NvbnZlcnQsICZ0aGVUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbmV3U2NhbGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDb252ZXJ0VGltZVNjYWxlKCZ0aGVUaW1lLAorICAgICAgICAgICAgICAgICAgICAgbmV3U2NhbGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUXRUaW1lUmVjb3JkX05ldywgJnRoZVRpbWUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0FkZFRpbWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVRpbWVSZWNvcmQgZHN0OwotCVRpbWVSZWNvcmQgc3JjOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBUaW1lUmVjb3JkIGRzdDsKKyAgICBUaW1lUmVjb3JkIHNyYzsKICNpZm5kZWYgQWRkVGltZQotCVB5TWFjX1BSRUNIRUNLKEFkZFRpbWUpOworICAgIFB5TWFjX1BSRUNIRUNLKEFkZFRpbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFF0VGltZVJlY29yZF9Db252ZXJ0LCAmZHN0LAotCSAgICAgICAgICAgICAgICAgICAgICBRdFRpbWVSZWNvcmRfQ29udmVydCwgJnNyYykpCi0JCXJldHVybiBOVUxMOwotCUFkZFRpbWUoJmRzdCwKLQkgICAgICAgICZzcmMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUXRUaW1lUmVjb3JkX05ldywgJmRzdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFF0VGltZVJlY29yZF9Db252ZXJ0LCAmZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBRdFRpbWVSZWNvcmRfQ29udmVydCwgJnNyYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEFkZFRpbWUoJmRzdCwKKyAgICAgICAgJnNyYyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBRdFRpbWVSZWNvcmRfTmV3LCAmZHN0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TdWJ0cmFjdFRpbWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVRpbWVSZWNvcmQgZHN0OwotCVRpbWVSZWNvcmQgc3JjOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBUaW1lUmVjb3JkIGRzdDsKKyAgICBUaW1lUmVjb3JkIHNyYzsKICNpZm5kZWYgU3VidHJhY3RUaW1lCi0JUHlNYWNfUFJFQ0hFQ0soU3VidHJhY3RUaW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTdWJ0cmFjdFRpbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFF0VGltZVJlY29yZF9Db252ZXJ0LCAmZHN0LAotCSAgICAgICAgICAgICAgICAgICAgICBRdFRpbWVSZWNvcmRfQ29udmVydCwgJnNyYykpCi0JCXJldHVybiBOVUxMOwotCVN1YnRyYWN0VGltZSgmZHN0LAotCSAgICAgICAgICAgICAmc3JjKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFF0VGltZVJlY29yZF9OZXcsICZkc3QpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBRdFRpbWVSZWNvcmRfQ29udmVydCwgJmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUXRUaW1lUmVjb3JkX0NvbnZlcnQsICZzcmMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTdWJ0cmFjdFRpbWUoJmRzdCwKKyAgICAgICAgICAgICAgICAgJnNyYyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBRdFRpbWVSZWNvcmRfTmV3LCAmZHN0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NdXNpY01lZGlhR2V0SW5kZXhlZFR1bmVQbGF5ZXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JQ29tcG9uZW50SW5zdGFuY2UgdGk7Ci0JbG9uZyBzYW1wbGVEZXNjSW5kZXg7Ci0JQ29tcG9uZW50SW5zdGFuY2UgdHA7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgQ29tcG9uZW50SW5zdGFuY2UgdGk7CisgICAgbG9uZyBzYW1wbGVEZXNjSW5kZXg7CisgICAgQ29tcG9uZW50SW5zdGFuY2UgdHA7CiAjaWZuZGVmIE11c2ljTWVkaWFHZXRJbmRleGVkVHVuZVBsYXllcgotCVB5TWFjX1BSRUNIRUNLKE11c2ljTWVkaWFHZXRJbmRleGVkVHVuZVBsYXllcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTXVzaWNNZWRpYUdldEluZGV4ZWRUdW5lUGxheWVyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnRpLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlRGVzY0luZGV4KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTXVzaWNNZWRpYUdldEluZGV4ZWRUdW5lUGxheWVyKHRpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVEZXNjSW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfTmV3LCB0cCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGVEZXNjSW5kZXgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNdXNpY01lZGlhR2V0SW5kZXhlZFR1bmVQbGF5ZXIodGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZURlc2NJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRwKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9OZXcsIHRwKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9Db2RlY01hbmFnZXJWZXJzaW9uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCWxvbmcgdmVyc2lvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBsb25nIHZlcnNpb247CiAjaWZuZGVmIENvZGVjTWFuYWdlclZlcnNpb24KLQlQeU1hY19QUkVDSEVDSyhDb2RlY01hbmFnZXJWZXJzaW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb2RlY01hbmFnZXJWZXJzaW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ29kZWNNYW5hZ2VyVmVyc2lvbigmdmVyc2lvbik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDb2RlY01hbmFnZXJWZXJzaW9uKCZ2ZXJzaW9uKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HZXRNYXhDb21wcmVzc2lvblNpemUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JUGl4TWFwSGFuZGxlIHNyYzsKLQlSZWN0IHNyY1JlY3Q7Ci0Jc2hvcnQgY29sb3JEZXB0aDsKLQlDb2RlY1EgcXVhbGl0eTsKLQlDb2RlY1R5cGUgY1R5cGU7Ci0JQ29tcHJlc3NvckNvbXBvbmVudCBjb2RlYzsKLQlsb25nIHNpemU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgUGl4TWFwSGFuZGxlIHNyYzsKKyAgICBSZWN0IHNyY1JlY3Q7CisgICAgc2hvcnQgY29sb3JEZXB0aDsKKyAgICBDb2RlY1EgcXVhbGl0eTsKKyAgICBDb2RlY1R5cGUgY1R5cGU7CisgICAgQ29tcHJlc3NvckNvbXBvbmVudCBjb2RlYzsKKyAgICBsb25nIHNpemU7CiAjaWZuZGVmIEdldE1heENvbXByZXNzaW9uU2l6ZQotCVB5TWFjX1BSRUNIRUNLKEdldE1heENvbXByZXNzaW9uU2l6ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TWF4Q29tcHJlc3Npb25TaXplKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZobE8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNyYywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnNyY1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICZjb2xvckRlcHRoLAotCSAgICAgICAgICAgICAgICAgICAgICAmcXVhbGl0eSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY1R5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcE9ial9Db252ZXJ0LCAmY29kZWMpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0TWF4Q29tcHJlc3Npb25TaXplKHNyYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzcmNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JEZXB0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpdHksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIHNpemUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZobE8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnNyY1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2xvckRlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcXVhbGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcE9ial9Db252ZXJ0LCAmY29kZWMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0TWF4Q29tcHJlc3Npb25TaXplKHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzcmNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JEZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dldENvbXByZXNzaW9uVGltZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlQaXhNYXBIYW5kbGUgc3JjOwotCVJlY3Qgc3JjUmVjdDsKLQlzaG9ydCBjb2xvckRlcHRoOwotCUNvZGVjVHlwZSBjVHlwZTsKLQlDb21wcmVzc29yQ29tcG9uZW50IGNvZGVjOwotCUNvZGVjUSBzcGF0aWFsUXVhbGl0eTsKLQlDb2RlY1EgdGVtcG9yYWxRdWFsaXR5OwotCXVuc2lnbmVkIGxvbmcgY29tcHJlc3NUaW1lOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFBpeE1hcEhhbmRsZSBzcmM7CisgICAgUmVjdCBzcmNSZWN0OworICAgIHNob3J0IGNvbG9yRGVwdGg7CisgICAgQ29kZWNUeXBlIGNUeXBlOworICAgIENvbXByZXNzb3JDb21wb25lbnQgY29kZWM7CisgICAgQ29kZWNRIHNwYXRpYWxRdWFsaXR5OworICAgIENvZGVjUSB0ZW1wb3JhbFF1YWxpdHk7CisgICAgdW5zaWduZWQgbG9uZyBjb21wcmVzc1RpbWU7CiAjaWZuZGVmIEdldENvbXByZXNzaW9uVGltZQotCVB5TWFjX1BSRUNIRUNLKEdldENvbXByZXNzaW9uVGltZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0Q29tcHJlc3Npb25UaW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZoTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc3JjLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmc3JjUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNvbG9yRGVwdGgsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBPYmpfQ29udmVydCwgJmNvZGVjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldENvbXByZXNzaW9uVGltZShzcmMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmc3JjUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yRGVwdGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBjVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJnNwYXRpYWxRdWFsaXR5LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJnRlbXBvcmFsUXVhbGl0eSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZjb21wcmVzc1RpbWUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgc3BhdGlhbFF1YWxpdHksCi0JICAgICAgICAgICAgICAgICAgICAgdGVtcG9yYWxRdWFsaXR5LAotCSAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzVGltZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmhPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZzcmNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY29sb3JEZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcE9ial9Db252ZXJ0LCAmY29kZWMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0Q29tcHJlc3Npb25UaW1lKHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzcmNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JEZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3BhdGlhbFF1YWxpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGVtcG9yYWxRdWFsaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbXByZXNzVGltZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcGF0aWFsUXVhbGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wb3JhbFF1YWxpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgY29tcHJlc3NUaW1lKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9Db21wcmVzc0ltYWdlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVBpeE1hcEhhbmRsZSBzcmM7Ci0JUmVjdCBzcmNSZWN0OwotCUNvZGVjUSBxdWFsaXR5OwotCUNvZGVjVHlwZSBjVHlwZTsKLQlJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2M7Ci0JUHRyIGRhdGE7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgUGl4TWFwSGFuZGxlIHNyYzsKKyAgICBSZWN0IHNyY1JlY3Q7CisgICAgQ29kZWNRIHF1YWxpdHk7CisgICAgQ29kZWNUeXBlIGNUeXBlOworICAgIEltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYzsKKyAgICBQdHIgZGF0YTsKICNpZm5kZWYgQ29tcHJlc3NJbWFnZQotCVB5TWFjX1BSRUNIRUNLKENvbXByZXNzSW1hZ2UpOworICAgIFB5TWFjX1BSRUNIRUNLKENvbXByZXNzSW1hZ2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmxPJk8mcyIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc3JjLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmc3JjUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnF1YWxpdHksCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRlc2MsCi0JICAgICAgICAgICAgICAgICAgICAgICZkYXRhKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENvbXByZXNzSW1hZ2Uoc3JjLAotCSAgICAgICAgICAgICAgICAgICAgICZzcmNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgIHF1YWxpdHksCi0JICAgICAgICAgICAgICAgICAgICAgY1R5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgZGVzYywKLQkgICAgICAgICAgICAgICAgICAgICBkYXRhKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbE8mTyZzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZzcmNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcXVhbGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ29tcHJlc3NJbWFnZShzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgJnNyY1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RlY29tcHJlc3NJbWFnZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlQdHIgZGF0YTsKLQlJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2M7Ci0JUGl4TWFwSGFuZGxlIGRzdDsKLQlSZWN0IHNyY1JlY3Q7Ci0JUmVjdCBkc3RSZWN0OwotCXNob3J0IG1vZGU7Ci0JUmduSGFuZGxlIG1hc2s7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgUHRyIGRhdGE7CisgICAgSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjOworICAgIFBpeE1hcEhhbmRsZSBkc3Q7CisgICAgUmVjdCBzcmNSZWN0OworICAgIFJlY3QgZHN0UmVjdDsKKyAgICBzaG9ydCBtb2RlOworICAgIFJnbkhhbmRsZSBtYXNrOwogI2lmbmRlZiBEZWNvbXByZXNzSW1hZ2UKLQlQeU1hY19QUkVDSEVDSyhEZWNvbXByZXNzSW1hZ2UpOworICAgIFB5TWFjX1BSRUNIRUNLKERlY29tcHJlc3NJbWFnZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzTyZPJk8mTyZoTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGF0YSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkZXNjLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRzdCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnNyY1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZkc3RSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmbW9kZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZtYXNrKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IERlY29tcHJlc3NJbWFnZShkYXRhLAotCSAgICAgICAgICAgICAgICAgICAgICAgZGVzYywKLQkgICAgICAgICAgICAgICAgICAgICAgIGRzdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICZzcmNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgJmRzdFJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICBtb2RlLAotCSAgICAgICAgICAgICAgICAgICAgICAgbWFzayk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAic08mTyZPJk8maE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZzcmNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmZHN0UmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmbWFzaykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBEZWNvbXByZXNzSW1hZ2UoZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3JjUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZkc3RSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2spOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dldFNpbWlsYXJpdHkoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JUGl4TWFwSGFuZGxlIHNyYzsKLQlSZWN0IHNyY1JlY3Q7Ci0JSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjOwotCVB0ciBkYXRhOwotCUZpeGVkIHNpbWlsYXJpdHk7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgUGl4TWFwSGFuZGxlIHNyYzsKKyAgICBSZWN0IHNyY1JlY3Q7CisgICAgSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjOworICAgIFB0ciBkYXRhOworICAgIEZpeGVkIHNpbWlsYXJpdHk7CiAjaWZuZGVmIEdldFNpbWlsYXJpdHkKLQlQeU1hY19QUkVDSEVDSyhHZXRTaW1pbGFyaXR5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRTaW1pbGFyaXR5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJnMiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNyYywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnNyY1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGVzYywKLQkgICAgICAgICAgICAgICAgICAgICAgJmRhdGEpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0U2ltaWxhcml0eShzcmMsCi0JICAgICAgICAgICAgICAgICAgICAgJnNyY1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgZGVzYywKLQkgICAgICAgICAgICAgICAgICAgICBkYXRhLAotCSAgICAgICAgICAgICAgICAgICAgICZzaW1pbGFyaXR5KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGaXhlZCwgc2ltaWxhcml0eSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmc3JjUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRTaW1pbGFyaXR5KHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAmc3JjUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgJnNpbWlsYXJpdHkpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBzaW1pbGFyaXR5KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HZXRJbWFnZURlc2NyaXB0aW9uQ1RhYmxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYzsKLQlDVGFiSGFuZGxlIGN0YWJsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2M7CisgICAgQ1RhYkhhbmRsZSBjdGFibGU7CiAjaWZuZGVmIEdldEltYWdlRGVzY3JpcHRpb25DVGFibGUKLQlQeU1hY19QUkVDSEVDSyhHZXRJbWFnZURlc2NyaXB0aW9uQ1RhYmxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRJbWFnZURlc2NyaXB0aW9uQ1RhYmxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkZXNjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldEltYWdlRGVzY3JpcHRpb25DVGFibGUoZGVzYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3RhYmxlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgY3RhYmxlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGVzYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRJbWFnZURlc2NyaXB0aW9uQ1RhYmxlKGRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmN0YWJsZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGN0YWJsZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU2V0SW1hZ2VEZXNjcmlwdGlvbkNUYWJsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2M7Ci0JQ1RhYkhhbmRsZSBjdGFibGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjOworICAgIENUYWJIYW5kbGUgY3RhYmxlOwogI2lmbmRlZiBTZXRJbWFnZURlc2NyaXB0aW9uQ1RhYmxlCi0JUHlNYWNfUFJFQ0hFQ0soU2V0SW1hZ2VEZXNjcmlwdGlvbkNUYWJsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0SW1hZ2VEZXNjcmlwdGlvbkNUYWJsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkZXNjLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmN0YWJsZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRJbWFnZURlc2NyaXB0aW9uQ1RhYmxlKGRlc2MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3RhYmxlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmN0YWJsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRJbWFnZURlc2NyaXB0aW9uQ1RhYmxlKGRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3RhYmxlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HZXRJbWFnZURlc2NyaXB0aW9uRXh0ZW5zaW9uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYzsKLQlIYW5kbGUgZXh0ZW5zaW9uOwotCWxvbmcgaWRUeXBlOwotCWxvbmcgaW5kZXg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjOworICAgIEhhbmRsZSBleHRlbnNpb247CisgICAgbG9uZyBpZFR5cGU7CisgICAgbG9uZyBpbmRleDsKICNpZm5kZWYgR2V0SW1hZ2VEZXNjcmlwdGlvbkV4dGVuc2lvbgotCVB5TWFjX1BSRUNIRUNLKEdldEltYWdlRGVzY3JpcHRpb25FeHRlbnNpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKEdldEltYWdlRGVzY3JpcHRpb25FeHRlbnNpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGVzYywKLQkgICAgICAgICAgICAgICAgICAgICAgJmlkVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluZGV4KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldEltYWdlRGVzY3JpcHRpb25FeHRlbnNpb24oZGVzYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXh0ZW5zaW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGV4dGVuc2lvbik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZGV4KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldEltYWdlRGVzY3JpcHRpb25FeHRlbnNpb24oZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXh0ZW5zaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGV4dGVuc2lvbik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfQWRkSW1hZ2VEZXNjcmlwdGlvbkV4dGVuc2lvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2M7Ci0JSGFuZGxlIGV4dGVuc2lvbjsKLQlsb25nIGlkVHlwZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2M7CisgICAgSGFuZGxlIGV4dGVuc2lvbjsKKyAgICBsb25nIGlkVHlwZTsKICNpZm5kZWYgQWRkSW1hZ2VEZXNjcmlwdGlvbkV4dGVuc2lvbgotCVB5TWFjX1BSRUNIRUNLKEFkZEltYWdlRGVzY3JpcHRpb25FeHRlbnNpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKEFkZEltYWdlRGVzY3JpcHRpb25FeHRlbnNpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRlc2MsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZXh0ZW5zaW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAmaWRUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEFkZEltYWdlRGVzY3JpcHRpb25FeHRlbnNpb24oZGVzYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRUeXBlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZleHRlbnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpZFR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQWRkSW1hZ2VEZXNjcmlwdGlvbkV4dGVuc2lvbihkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZFR5cGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1JlbW92ZUltYWdlRGVzY3JpcHRpb25FeHRlbnNpb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjOwotCWxvbmcgaWRUeXBlOwotCWxvbmcgaW5kZXg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjOworICAgIGxvbmcgaWRUeXBlOworICAgIGxvbmcgaW5kZXg7CiAjaWZuZGVmIFJlbW92ZUltYWdlRGVzY3JpcHRpb25FeHRlbnNpb24KLQlQeU1hY19QUkVDSEVDSyhSZW1vdmVJbWFnZURlc2NyaXB0aW9uRXh0ZW5zaW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhSZW1vdmVJbWFnZURlc2NyaXB0aW9uRXh0ZW5zaW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRlc2MsCi0JICAgICAgICAgICAgICAgICAgICAgICZpZFR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBSZW1vdmVJbWFnZURlc2NyaXB0aW9uRXh0ZW5zaW9uKGRlc2MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaWRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUmVtb3ZlSW1hZ2VEZXNjcmlwdGlvbkV4dGVuc2lvbihkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfQ291bnRJbWFnZURlc2NyaXB0aW9uRXh0ZW5zaW9uVHlwZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2M7Ci0JbG9uZyBpZFR5cGU7Ci0JbG9uZyBjb3VudDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2M7CisgICAgbG9uZyBpZFR5cGU7CisgICAgbG9uZyBjb3VudDsKICNpZm5kZWYgQ291bnRJbWFnZURlc2NyaXB0aW9uRXh0ZW5zaW9uVHlwZQotCVB5TWFjX1BSRUNIRUNLKENvdW50SW1hZ2VEZXNjcmlwdGlvbkV4dGVuc2lvblR5cGUpOworICAgIFB5TWFjX1BSRUNIRUNLKENvdW50SW1hZ2VEZXNjcmlwdGlvbkV4dGVuc2lvblR5cGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkZXNjLAotCSAgICAgICAgICAgICAgICAgICAgICAmaWRUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENvdW50SW1hZ2VEZXNjcmlwdGlvbkV4dGVuc2lvblR5cGUoZGVzYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZFR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvdW50KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBjb3VudCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaWRUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENvdW50SW1hZ2VEZXNjcmlwdGlvbkV4dGVuc2lvblR5cGUoZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvdW50KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR2V0TmV4dEltYWdlRGVzY3JpcHRpb25FeHRlbnNpb25UeXBlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYzsKLQlsb25nIGlkVHlwZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2M7CisgICAgbG9uZyBpZFR5cGU7CiAjaWZuZGVmIEdldE5leHRJbWFnZURlc2NyaXB0aW9uRXh0ZW5zaW9uVHlwZQotCVB5TWFjX1BSRUNIRUNLKEdldE5leHRJbWFnZURlc2NyaXB0aW9uRXh0ZW5zaW9uVHlwZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TmV4dEltYWdlRGVzY3JpcHRpb25FeHRlbnNpb25UeXBlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkZXNjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldE5leHRJbWFnZURlc2NyaXB0aW9uRXh0ZW5zaW9uVHlwZShkZXNjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlkVHlwZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgaWRUeXBlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGVzYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXROZXh0SW1hZ2VEZXNjcmlwdGlvbkV4dGVuc2lvblR5cGUoZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpZFR5cGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGlkVHlwZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRmluZENvZGVjKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUNvZGVjVHlwZSBjVHlwZTsKLQlDb2RlY0NvbXBvbmVudCBzcGVjQ29kZWM7Ci0JQ29tcHJlc3NvckNvbXBvbmVudCBjb21wcmVzc29yOwotCURlY29tcHJlc3NvckNvbXBvbmVudCBkZWNvbXByZXNzb3I7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgQ29kZWNUeXBlIGNUeXBlOworICAgIENvZGVjQ29tcG9uZW50IHNwZWNDb2RlYzsKKyAgICBDb21wcmVzc29yQ29tcG9uZW50IGNvbXByZXNzb3I7CisgICAgRGVjb21wcmVzc29yQ29tcG9uZW50IGRlY29tcHJlc3NvcjsKICNpZm5kZWYgRmluZENvZGVjCi0JUHlNYWNfUFJFQ0hFQ0soRmluZENvZGVjKTsKKyAgICBQeU1hY19QUkVDSEVDSyhGaW5kQ29kZWMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBPYmpfQ29udmVydCwgJnNwZWNDb2RlYykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBGaW5kQ29kZWMoY1R5cGUsCi0JICAgICAgICAgICAgICAgICBzcGVjQ29kZWMsCi0JICAgICAgICAgICAgICAgICAmY29tcHJlc3NvciwKLQkgICAgICAgICAgICAgICAgICZkZWNvbXByZXNzb3IpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENtcE9ial9OZXcsIGNvbXByZXNzb3IsCi0JICAgICAgICAgICAgICAgICAgICAgQ21wT2JqX05ldywgZGVjb21wcmVzc29yKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcE9ial9Db252ZXJ0LCAmc3BlY0NvZGVjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEZpbmRDb2RlYyhjVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgIHNwZWNDb2RlYywKKyAgICAgICAgICAgICAgICAgICAgICZjb21wcmVzc29yLAorICAgICAgICAgICAgICAgICAgICAgJmRlY29tcHJlc3Nvcik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ21wT2JqX05ldywgY29tcHJlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDbXBPYmpfTmV3LCBkZWNvbXByZXNzb3IpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0NvbXByZXNzUGljdHVyZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlQaWNIYW5kbGUgc3JjUGljdHVyZTsKLQlQaWNIYW5kbGUgZHN0UGljdHVyZTsKLQlDb2RlY1EgcXVhbGl0eTsKLQlDb2RlY1R5cGUgY1R5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgUGljSGFuZGxlIHNyY1BpY3R1cmU7CisgICAgUGljSGFuZGxlIGRzdFBpY3R1cmU7CisgICAgQ29kZWNRIHF1YWxpdHk7CisgICAgQ29kZWNUeXBlIGNUeXBlOwogI2lmbmRlZiBDb21wcmVzc1BpY3R1cmUKLQlQeU1hY19QUkVDSEVDSyhDb21wcmVzc1BpY3R1cmUpOworICAgIFB5TWFjX1BSRUNIRUNLKENvbXByZXNzUGljdHVyZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzcmNQaWN0dXJlLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRzdFBpY3R1cmUsCi0JICAgICAgICAgICAgICAgICAgICAgICZxdWFsaXR5LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjVHlwZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDb21wcmVzc1BpY3R1cmUoc3JjUGljdHVyZSwKLQkgICAgICAgICAgICAgICAgICAgICAgIGRzdFBpY3R1cmUsCi0JICAgICAgICAgICAgICAgICAgICAgICBxdWFsaXR5LAotCSAgICAgICAgICAgICAgICAgICAgICAgY1R5cGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNyY1BpY3R1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZHN0UGljdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnF1YWxpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENvbXByZXNzUGljdHVyZShzcmNQaWN0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0UGljdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjVHlwZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfQ29tcHJlc3NQaWN0dXJlRmlsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlzaG9ydCBzcmNSZWZOdW07Ci0Jc2hvcnQgZHN0UmVmTnVtOwotCUNvZGVjUSBxdWFsaXR5OwotCUNvZGVjVHlwZSBjVHlwZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBzaG9ydCBzcmNSZWZOdW07CisgICAgc2hvcnQgZHN0UmVmTnVtOworICAgIENvZGVjUSBxdWFsaXR5OworICAgIENvZGVjVHlwZSBjVHlwZTsKICNpZm5kZWYgQ29tcHJlc3NQaWN0dXJlRmlsZQotCVB5TWFjX1BSRUNIRUNLKENvbXByZXNzUGljdHVyZUZpbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKENvbXByZXNzUGljdHVyZUZpbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGhsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmc3JjUmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmZHN0UmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmcXVhbGl0eSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY1R5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ29tcHJlc3NQaWN0dXJlRmlsZShzcmNSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0UmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpdHksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgY1R5cGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhobE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNyY1JlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRzdFJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnF1YWxpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENvbXByZXNzUGljdHVyZUZpbGUoc3JjUmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFsaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNUeXBlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9Db252ZXJ0SW1hZ2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBzcmNERDsKLQlQdHIgc3JjRGF0YTsKLQlzaG9ydCBjb2xvckRlcHRoOwotCUNUYWJIYW5kbGUgY3RhYmxlOwotCUNvZGVjUSBhY2N1cmFjeTsKLQlDb2RlY1EgcXVhbGl0eTsKLQlDb2RlY1R5cGUgY1R5cGU7Ci0JQ29kZWNDb21wb25lbnQgY29kZWM7Ci0JSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkc3RERDsKLQlQdHIgZHN0RGF0YTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBJbWFnZURlc2NyaXB0aW9uSGFuZGxlIHNyY0REOworICAgIFB0ciBzcmNEYXRhOworICAgIHNob3J0IGNvbG9yRGVwdGg7CisgICAgQ1RhYkhhbmRsZSBjdGFibGU7CisgICAgQ29kZWNRIGFjY3VyYWN5OworICAgIENvZGVjUSBxdWFsaXR5OworICAgIENvZGVjVHlwZSBjVHlwZTsKKyAgICBDb2RlY0NvbXBvbmVudCBjb2RlYzsKKyAgICBJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRzdEREOworICAgIFB0ciBkc3REYXRhOwogI2lmbmRlZiBDb252ZXJ0SW1hZ2UKLQlQeU1hY19QUkVDSEVDSyhDb252ZXJ0SW1hZ2UpOworICAgIFB5TWFjX1BSRUNIRUNLKENvbnZlcnRJbWFnZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnNoTyZsbE8mTyZPJnMiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNyY0RELAotCSAgICAgICAgICAgICAgICAgICAgICAmc3JjRGF0YSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNvbG9yRGVwdGgsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmY3RhYmxlLAotCSAgICAgICAgICAgICAgICAgICAgICAmYWNjdXJhY3ksCi0JICAgICAgICAgICAgICAgICAgICAgICZxdWFsaXR5LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wT2JqX0NvbnZlcnQsICZjb2RlYywKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkc3RERCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRzdERhdGEpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ29udmVydEltYWdlKHNyY0RELAotCSAgICAgICAgICAgICAgICAgICAgc3JjRGF0YSwKLQkgICAgICAgICAgICAgICAgICAgIGNvbG9yRGVwdGgsCi0JICAgICAgICAgICAgICAgICAgICBjdGFibGUsCi0JICAgICAgICAgICAgICAgICAgICBhY2N1cmFjeSwKLQkgICAgICAgICAgICAgICAgICAgIHF1YWxpdHksCi0JICAgICAgICAgICAgICAgICAgICBjVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgIGNvZGVjLAotCSAgICAgICAgICAgICAgICAgICAgZHN0REQsCi0JICAgICAgICAgICAgICAgICAgICBkc3REYXRhKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnNoTyZsbE8mTyZPJnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNyY0RELAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3JjRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbG9yRGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmY3RhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYWNjdXJhY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZxdWFsaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wT2JqX0NvbnZlcnQsICZjb2RlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkc3RERCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRzdERhdGEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ29udmVydEltYWdlKHNyY0RELAorICAgICAgICAgICAgICAgICAgICAgICAgc3JjRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yRGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICBjdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICBhY2N1cmFjeSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpdHksCisgICAgICAgICAgICAgICAgICAgICAgICBjVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgZHN0REQsCisgICAgICAgICAgICAgICAgICAgICAgICBkc3REYXRhKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9BZGRGaWxlUHJldmlldyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlzaG9ydCByZXNSZWZOdW07Ci0JT1NUeXBlIHByZXZpZXdUeXBlOwotCUhhbmRsZSBwcmV2aWV3RGF0YTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBzaG9ydCByZXNSZWZOdW07CisgICAgT1NUeXBlIHByZXZpZXdUeXBlOworICAgIEhhbmRsZSBwcmV2aWV3RGF0YTsKICNpZm5kZWYgQWRkRmlsZVByZXZpZXcKLQlQeU1hY19QUkVDSEVDSyhBZGRGaWxlUHJldmlldyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQWRkRmlsZVByZXZpZXcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVzUmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZwcmV2aWV3VHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwcmV2aWV3RGF0YSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBZGRGaWxlUHJldmlldyhyZXNSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgIHByZXZpZXdUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICBwcmV2aWV3RGF0YSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzUmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZwcmV2aWV3VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwcmV2aWV3RGF0YSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBBZGRGaWxlUHJldmlldyhyZXNSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpZXdUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aWV3RGF0YSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR2V0QmVzdERldmljZVJlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JR0RIYW5kbGUgZ2RoOwotCVJlY3QgcnA7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgR0RIYW5kbGUgZ2RoOworICAgIFJlY3QgcnA7CiAjaWZuZGVmIEdldEJlc3REZXZpY2VSZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0QmVzdERldmljZVJlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldEJlc3REZXZpY2VSZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0QmVzdERldmljZVJlY3QoJmdkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJnJwKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfTmV3LCBnZGgsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmcnApOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0QmVzdERldmljZVJlY3QoJmdkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJwKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfTmV3LCBnZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmcnApOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dESGFzU2NhbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JR0RIYW5kbGUgZ2RoOwotCXNob3J0IGRlcHRoOwotCUZpeGVkIHNjYWxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEdESGFuZGxlIGdkaDsKKyAgICBzaG9ydCBkZXB0aDsKKyAgICBGaXhlZCBzY2FsZTsKICNpZm5kZWYgR0RIYXNTY2FsZQotCVB5TWFjX1BSRUNIRUNLKEdESGFzU2NhbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdESGFzU2NhbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgT3B0UmVzT2JqX0NvbnZlcnQsICZnZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZkZXB0aCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHREhhc1NjYWxlKGdkaCwKLQkgICAgICAgICAgICAgICAgICBkZXB0aCwKLQkgICAgICAgICAgICAgICAgICAmc2NhbGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBzY2FsZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0UmVzT2JqX0NvbnZlcnQsICZnZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXB0aCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHREhhc1NjYWxlKGdkaCwKKyAgICAgICAgICAgICAgICAgICAgICBkZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAmc2NhbGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBzY2FsZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR0RHZXRTY2FsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlHREhhbmRsZSBnZGg7Ci0JRml4ZWQgc2NhbGU7Ci0Jc2hvcnQgZmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgR0RIYW5kbGUgZ2RoOworICAgIEZpeGVkIHNjYWxlOworICAgIHNob3J0IGZsYWdzOwogI2lmbmRlZiBHREdldFNjYWxlCi0JUHlNYWNfUFJFQ0hFQ0soR0RHZXRTY2FsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR0RHZXRTY2FsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIE9wdFJlc09ial9Db252ZXJ0LCAmZ2RoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdER2V0U2NhbGUoZ2RoLAotCSAgICAgICAgICAgICAgICAgICZzY2FsZSwKLQkgICAgICAgICAgICAgICAgICAmZmxhZ3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGaXhlZCwgc2NhbGUsCi0JICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0UmVzT2JqX0NvbnZlcnQsICZnZGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR0RHZXRTY2FsZShnZGgsCisgICAgICAgICAgICAgICAgICAgICAgJnNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICZmbGFncyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBzY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR0RTZXRTY2FsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlHREhhbmRsZSBnZGg7Ci0JRml4ZWQgc2NhbGU7Ci0Jc2hvcnQgZmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgR0RIYW5kbGUgZ2RoOworICAgIEZpeGVkIHNjYWxlOworICAgIHNob3J0IGZsYWdzOwogI2lmbmRlZiBHRFNldFNjYWxlCi0JUHlNYWNfUFJFQ0hFQ0soR0RTZXRTY2FsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR0RTZXRTY2FsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIE9wdFJlc09ial9Db252ZXJ0LCAmZ2RoLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJnNjYWxlLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR0RTZXRTY2FsZShnZGgsCi0JICAgICAgICAgICAgICAgICAgc2NhbGUsCi0JICAgICAgICAgICAgICAgICAgZmxhZ3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0UmVzT2JqX0NvbnZlcnQsICZnZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmc2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHRFNldFNjYWxlKGdkaCwKKyAgICAgICAgICAgICAgICAgICAgICBzY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR2V0R3JhcGhpY3NJbXBvcnRlckZvckZpbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JRlNTcGVjIHRoZUZpbGU7Ci0JQ29tcG9uZW50SW5zdGFuY2UgZ2k7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgRlNTcGVjIHRoZUZpbGU7CisgICAgQ29tcG9uZW50SW5zdGFuY2UgZ2k7CiAjaWZuZGVmIEdldEdyYXBoaWNzSW1wb3J0ZXJGb3JGaWxlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0R3JhcGhpY3NJbXBvcnRlckZvckZpbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldEdyYXBoaWNzSW1wb3J0ZXJGb3JGaWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmdGhlRmlsZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRHcmFwaGljc0ltcG9ydGVyRm9yRmlsZSgmdGhlRmlsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdpKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9OZXcsIGdpKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJnRoZUZpbGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0R3JhcGhpY3NJbXBvcnRlckZvckZpbGUoJnRoZUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnaSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfTmV3LCBnaSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR2V0R3JhcGhpY3NJbXBvcnRlckZvckRhdGFSZWYoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSGFuZGxlIGRhdGFSZWY7Ci0JT1NUeXBlIGRhdGFSZWZUeXBlOwotCUNvbXBvbmVudEluc3RhbmNlIGdpOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEhhbmRsZSBkYXRhUmVmOworICAgIE9TVHlwZSBkYXRhUmVmVHlwZTsKKyAgICBDb21wb25lbnRJbnN0YW5jZSBnaTsKICNpZm5kZWYgR2V0R3JhcGhpY3NJbXBvcnRlckZvckRhdGFSZWYKLQlQeU1hY19QUkVDSEVDSyhHZXRHcmFwaGljc0ltcG9ydGVyRm9yRGF0YVJlZik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0R3JhcGhpY3NJbXBvcnRlckZvckRhdGFSZWYpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGF0YVJlZlR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0R3JhcGhpY3NJbXBvcnRlckZvckRhdGFSZWYoZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZlR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnaSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfTmV3LCBnaSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGF0YVJlZlR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0R3JhcGhpY3NJbXBvcnRlckZvckRhdGFSZWYoZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZlR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnaSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfTmV3LCBnaSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR2V0R3JhcGhpY3NJbXBvcnRlckZvckZpbGVXaXRoRmxhZ3MoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JRlNTcGVjIHRoZUZpbGU7Ci0JQ29tcG9uZW50SW5zdGFuY2UgZ2k7Ci0JbG9uZyBmbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBGU1NwZWMgdGhlRmlsZTsKKyAgICBDb21wb25lbnRJbnN0YW5jZSBnaTsKKyAgICBsb25nIGZsYWdzOwogI2lmbmRlZiBHZXRHcmFwaGljc0ltcG9ydGVyRm9yRmlsZVdpdGhGbGFncwotCVB5TWFjX1BSRUNIRUNLKEdldEdyYXBoaWNzSW1wb3J0ZXJGb3JGaWxlV2l0aEZsYWdzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRHcmFwaGljc0ltcG9ydGVyRm9yRmlsZVdpdGhGbGFncyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZ0aGVGaWxlLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0R3JhcGhpY3NJbXBvcnRlckZvckZpbGVXaXRoRmxhZ3MoJnRoZUZpbGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX05ldywgZ2kpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJnRoZUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRHcmFwaGljc0ltcG9ydGVyRm9yRmlsZVdpdGhGbGFncygmdGhlRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfTmV3LCBnaSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR2V0R3JhcGhpY3NJbXBvcnRlckZvckRhdGFSZWZXaXRoRmxhZ3MoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSGFuZGxlIGRhdGFSZWY7Ci0JT1NUeXBlIGRhdGFSZWZUeXBlOwotCUNvbXBvbmVudEluc3RhbmNlIGdpOwotCWxvbmcgZmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSGFuZGxlIGRhdGFSZWY7CisgICAgT1NUeXBlIGRhdGFSZWZUeXBlOworICAgIENvbXBvbmVudEluc3RhbmNlIGdpOworICAgIGxvbmcgZmxhZ3M7CiAjaWZuZGVmIEdldEdyYXBoaWNzSW1wb3J0ZXJGb3JEYXRhUmVmV2l0aEZsYWdzCi0JUHlNYWNfUFJFQ0hFQ0soR2V0R3JhcGhpY3NJbXBvcnRlckZvckRhdGFSZWZXaXRoRmxhZ3MpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldEdyYXBoaWNzSW1wb3J0ZXJGb3JEYXRhUmVmV2l0aEZsYWdzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkYXRhUmVmVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldEdyYXBoaWNzSW1wb3J0ZXJGb3JEYXRhUmVmV2l0aEZsYWdzKGRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWZUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9OZXcsIGdpKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGF0YVJlZlR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRHcmFwaGljc0ltcG9ydGVyRm9yRGF0YVJlZldpdGhGbGFncyhkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfTmV3LCBnaSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWFrZUltYWdlRGVzY3JpcHRpb25Gb3JQaXhNYXAoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JUGl4TWFwSGFuZGxlIHBpeG1hcDsKLQlJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGlkaDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBQaXhNYXBIYW5kbGUgcGl4bWFwOworICAgIEltYWdlRGVzY3JpcHRpb25IYW5kbGUgaWRoOwogI2lmbmRlZiBNYWtlSW1hZ2VEZXNjcmlwdGlvbkZvclBpeE1hcAotCVB5TWFjX1BSRUNIRUNLKE1ha2VJbWFnZURlc2NyaXB0aW9uRm9yUGl4TWFwKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNYWtlSW1hZ2VEZXNjcmlwdGlvbkZvclBpeE1hcCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcGl4bWFwKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IE1ha2VJbWFnZURlc2NyaXB0aW9uRm9yUGl4TWFwKHBpeG1hcCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlkaCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGlkaCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBpeG1hcCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBNYWtlSW1hZ2VEZXNjcmlwdGlvbkZvclBpeE1hcChwaXhtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpZGgpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBpZGgpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01ha2VJbWFnZURlc2NyaXB0aW9uRm9yRWZmZWN0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCU9TVHlwZSBlZmZlY3RUeXBlOwotCUltYWdlRGVzY3JpcHRpb25IYW5kbGUgaWRoOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIE9TVHlwZSBlZmZlY3RUeXBlOworICAgIEltYWdlRGVzY3JpcHRpb25IYW5kbGUgaWRoOwogI2lmbmRlZiBNYWtlSW1hZ2VEZXNjcmlwdGlvbkZvckVmZmVjdAotCVB5TWFjX1BSRUNIRUNLKE1ha2VJbWFnZURlc2NyaXB0aW9uRm9yRWZmZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhNYWtlSW1hZ2VEZXNjcmlwdGlvbkZvckVmZmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmVmZmVjdFR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gTWFrZUltYWdlRGVzY3JpcHRpb25Gb3JFZmZlY3QoZWZmZWN0VHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlkaCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGlkaCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZlZmZlY3RUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IE1ha2VJbWFnZURlc2NyaXB0aW9uRm9yRWZmZWN0KGVmZmVjdFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpZGgpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBpZGgpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1FUR2V0UGl4ZWxTaXplKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBfcnY7Ci0JT1NUeXBlIFBpeGVsRm9ybWF0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBfcnY7CisgICAgT1NUeXBlIFBpeGVsRm9ybWF0OwogI2lmbmRlZiBRVEdldFBpeGVsU2l6ZQotCVB5TWFjX1BSRUNIRUNLKFFUR2V0UGl4ZWxTaXplKTsKKyAgICBQeU1hY19QUkVDSEVDSyhRVEdldFBpeGVsU2l6ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJlBpeGVsRm9ybWF0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gUVRHZXRQaXhlbFNpemUoUGl4ZWxGb3JtYXQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmUGl4ZWxGb3JtYXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBRVEdldFBpeGVsU2l6ZShQaXhlbEZvcm1hdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfUVRHZXRQaXhlbEZvcm1hdERlcHRoRm9ySW1hZ2VEZXNjcmlwdGlvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgX3J2OwotCU9TVHlwZSBQaXhlbEZvcm1hdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgX3J2OworICAgIE9TVHlwZSBQaXhlbEZvcm1hdDsKICNpZm5kZWYgUVRHZXRQaXhlbEZvcm1hdERlcHRoRm9ySW1hZ2VEZXNjcmlwdGlvbgotCVB5TWFjX1BSRUNIRUNLKFFUR2V0UGl4ZWxGb3JtYXREZXB0aEZvckltYWdlRGVzY3JpcHRpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKFFUR2V0UGl4ZWxGb3JtYXREZXB0aEZvckltYWdlRGVzY3JpcHRpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZQaXhlbEZvcm1hdCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFFUR2V0UGl4ZWxGb3JtYXREZXB0aEZvckltYWdlRGVzY3JpcHRpb24oUGl4ZWxGb3JtYXQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmUGl4ZWxGb3JtYXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBRVEdldFBpeGVsRm9ybWF0RGVwdGhGb3JJbWFnZURlc2NyaXB0aW9uKFBpeGVsRm9ybWF0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9RVEdldFBpeE1hcEhhbmRsZVJvd0J5dGVzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIF9ydjsKLQlQaXhNYXBIYW5kbGUgcG07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgX3J2OworICAgIFBpeE1hcEhhbmRsZSBwbTsKICNpZm5kZWYgUVRHZXRQaXhNYXBIYW5kbGVSb3dCeXRlcwotCVB5TWFjX1BSRUNIRUNLKFFUR2V0UGl4TWFwSGFuZGxlUm93Qnl0ZXMpOworICAgIFB5TWFjX1BSRUNIRUNLKFFUR2V0UGl4TWFwSGFuZGxlUm93Qnl0ZXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gUVRHZXRQaXhNYXBIYW5kbGVSb3dCeXRlcyhwbSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gUVRHZXRQaXhNYXBIYW5kbGVSb3dCeXRlcyhwbSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfUVRTZXRQaXhNYXBIYW5kbGVSb3dCeXRlcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlQaXhNYXBIYW5kbGUgcG07Ci0JbG9uZyByb3dCeXRlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBQaXhNYXBIYW5kbGUgcG07CisgICAgbG9uZyByb3dCeXRlczsKICNpZm5kZWYgUVRTZXRQaXhNYXBIYW5kbGVSb3dCeXRlcwotCVB5TWFjX1BSRUNIRUNLKFFUU2V0UGl4TWFwSGFuZGxlUm93Qnl0ZXMpOworICAgIFB5TWFjX1BSRUNIRUNLKFFUU2V0UGl4TWFwSGFuZGxlUm93Qnl0ZXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwbSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJvd0J5dGVzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFFUU2V0UGl4TWFwSGFuZGxlUm93Qnl0ZXMocG0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93Qnl0ZXMpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyb3dCeXRlcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBRVFNldFBpeE1hcEhhbmRsZVJvd0J5dGVzKHBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd0J5dGVzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9RVEdldFBpeE1hcEhhbmRsZUdhbW1hTGV2ZWwoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUZpeGVkIF9ydjsKLQlQaXhNYXBIYW5kbGUgcG07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEZpeGVkIF9ydjsKKyAgICBQaXhNYXBIYW5kbGUgcG07CiAjaWZuZGVmIFFUR2V0UGl4TWFwSGFuZGxlR2FtbWFMZXZlbAotCVB5TWFjX1BSRUNIRUNLKFFUR2V0UGl4TWFwSGFuZGxlR2FtbWFMZXZlbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUVRHZXRQaXhNYXBIYW5kbGVHYW1tYUxldmVsKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwbSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFFUR2V0UGl4TWFwSGFuZGxlR2FtbWFMZXZlbChwbSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFFUR2V0UGl4TWFwSGFuZGxlR2FtbWFMZXZlbChwbSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1FUU2V0UGl4TWFwSGFuZGxlR2FtbWFMZXZlbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlQaXhNYXBIYW5kbGUgcG07Ci0JRml4ZWQgZ2FtbWFMZXZlbDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBQaXhNYXBIYW5kbGUgcG07CisgICAgRml4ZWQgZ2FtbWFMZXZlbDsKICNpZm5kZWYgUVRTZXRQaXhNYXBIYW5kbGVHYW1tYUxldmVsCi0JUHlNYWNfUFJFQ0hFQ0soUVRTZXRQaXhNYXBIYW5kbGVHYW1tYUxldmVsKTsKKyAgICBQeU1hY19QUkVDSEVDSyhRVFNldFBpeE1hcEhhbmRsZUdhbW1hTGV2ZWwpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcG0sCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmZ2FtbWFMZXZlbCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBRVFNldFBpeE1hcEhhbmRsZUdhbW1hTGV2ZWwocG0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnYW1tYUxldmVsKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZnYW1tYUxldmVsKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFFUU2V0UGl4TWFwSGFuZGxlR2FtbWFMZXZlbChwbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdhbW1hTGV2ZWwpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1FUR2V0UGl4TWFwSGFuZGxlUmVxdWVzdGVkR2FtbWFMZXZlbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JRml4ZWQgX3J2OwotCVBpeE1hcEhhbmRsZSBwbTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgRml4ZWQgX3J2OworICAgIFBpeE1hcEhhbmRsZSBwbTsKICNpZm5kZWYgUVRHZXRQaXhNYXBIYW5kbGVSZXF1ZXN0ZWRHYW1tYUxldmVsCi0JUHlNYWNfUFJFQ0hFQ0soUVRHZXRQaXhNYXBIYW5kbGVSZXF1ZXN0ZWRHYW1tYUxldmVsKTsKKyAgICBQeU1hY19QUkVDSEVDSyhRVEdldFBpeE1hcEhhbmRsZVJlcXVlc3RlZEdhbW1hTGV2ZWwpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gUVRHZXRQaXhNYXBIYW5kbGVSZXF1ZXN0ZWRHYW1tYUxldmVsKHBtKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRml4ZWQsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gUVRHZXRQaXhNYXBIYW5kbGVSZXF1ZXN0ZWRHYW1tYUxldmVsKHBtKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRml4ZWQsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfUVRTZXRQaXhNYXBIYW5kbGVSZXF1ZXN0ZWRHYW1tYUxldmVsKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVBpeE1hcEhhbmRsZSBwbTsKLQlGaXhlZCByZXF1ZXN0ZWRHYW1tYUxldmVsOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFBpeE1hcEhhbmRsZSBwbTsKKyAgICBGaXhlZCByZXF1ZXN0ZWRHYW1tYUxldmVsOwogI2lmbmRlZiBRVFNldFBpeE1hcEhhbmRsZVJlcXVlc3RlZEdhbW1hTGV2ZWwKLQlQeU1hY19QUkVDSEVDSyhRVFNldFBpeE1hcEhhbmRsZVJlcXVlc3RlZEdhbW1hTGV2ZWwpOworICAgIFB5TWFjX1BSRUNIRUNLKFFUU2V0UGl4TWFwSGFuZGxlUmVxdWVzdGVkR2FtbWFMZXZlbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwbSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZyZXF1ZXN0ZWRHYW1tYUxldmVsKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFFUU2V0UGl4TWFwSGFuZGxlUmVxdWVzdGVkR2FtbWFMZXZlbChwbSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZEdhbW1hTGV2ZWwpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJnJlcXVlc3RlZEdhbW1hTGV2ZWwpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUVRTZXRQaXhNYXBIYW5kbGVSZXF1ZXN0ZWRHYW1tYUxldmVsKHBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkR2FtbWFMZXZlbCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfQ29tcEFkZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jd2lkZSBzcmM7Ci0Jd2lkZSBkc3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHdpZGUgc3JjOworICAgIHdpZGUgZHN0OwogI2lmbmRlZiBDb21wQWRkCi0JUHlNYWNfUFJFQ0hFQ0soQ29tcEFkZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ29tcEFkZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ29tcEFkZCgmc3JjLAotCSAgICAgICAgJmRzdCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgc3JjLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgZHN0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ29tcEFkZCgmc3JjLAorICAgICAgICAmZHN0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGR3aWRlLCBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGR3aWRlLCBkc3QpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0NvbXBTdWIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXdpZGUgc3JjOwotCXdpZGUgZHN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICB3aWRlIHNyYzsKKyAgICB3aWRlIGRzdDsKICNpZm5kZWYgQ29tcFN1YgotCVB5TWFjX1BSRUNIRUNLKENvbXBTdWIpOworICAgIFB5TWFjX1BSRUNIRUNLKENvbXBTdWIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUNvbXBTdWIoJnNyYywKLQkgICAgICAgICZkc3QpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZHdpZGUsIHNyYywKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZHdpZGUsIGRzdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENvbXBTdWIoJnNyYywKKyAgICAgICAgJmRzdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgZHN0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9Db21wTmVnKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQl3aWRlIGRzdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgd2lkZSBkc3Q7CiAjaWZuZGVmIENvbXBOZWcKLQlQeU1hY19QUkVDSEVDSyhDb21wTmVnKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb21wTmVnKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlDb21wTmVnKCZkc3QpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGR3aWRlLCBkc3QpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDb21wTmVnKCZkc3QpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGR3aWRlLCBkc3QpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0NvbXBTaGlmdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jd2lkZSBzcmM7Ci0Jc2hvcnQgc2hpZnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHdpZGUgc3JjOworICAgIHNob3J0IHNoaWZ0OwogI2lmbmRlZiBDb21wU2hpZnQKLQlQeU1hY19QUkVDSEVDSyhDb21wU2hpZnQpOworICAgIFB5TWFjX1BSRUNIRUNLKENvbXBTaGlmdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNoaWZ0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ29tcFNoaWZ0KCZzcmMsCi0JICAgICAgICAgIHNoaWZ0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgc3JjKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNoaWZ0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ29tcFNoaWZ0KCZzcmMsCisgICAgICAgICAgICAgIHNoaWZ0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgc3JjKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9Db21wTXVsKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIHNyYzE7Ci0JbG9uZyBzcmMyOwotCXdpZGUgZHN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBsb25nIHNyYzE7CisgICAgbG9uZyBzcmMyOworICAgIHdpZGUgZHN0OwogI2lmbmRlZiBDb21wTXVsCi0JUHlNYWNfUFJFQ0hFQ0soQ29tcE11bCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ29tcE11bCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZzcmMxLAotCSAgICAgICAgICAgICAgICAgICAgICAmc3JjMikpCi0JCXJldHVybiBOVUxMOwotCUNvbXBNdWwoc3JjMSwKLQkgICAgICAgIHNyYzIsCi0JICAgICAgICAmZHN0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgZHN0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3JjMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENvbXBNdWwoc3JjMSwKKyAgICAgICAgc3JjMiwKKyAgICAgICAgJmRzdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZHdpZGUsIGRzdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfQ29tcERpdihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBfcnY7Ci0Jd2lkZSBudW1lcmF0b3I7Ci0JbG9uZyBkZW5vbWluYXRvcjsKLQlsb25nIHJlbWFpbmRlcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgbG9uZyBfcnY7CisgICAgd2lkZSBudW1lcmF0b3I7CisgICAgbG9uZyBkZW5vbWluYXRvcjsKKyAgICBsb25nIHJlbWFpbmRlcjsKICNpZm5kZWYgQ29tcERpdgotCVB5TWFjX1BSRUNIRUNLKENvbXBEaXYpOworICAgIFB5TWFjX1BSRUNIRUNLKENvbXBEaXYpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZkZW5vbWluYXRvcikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENvbXBEaXYoJm51bWVyYXRvciwKLQkgICAgICAgICAgICAgIGRlbm9taW5hdG9yLAotCSAgICAgICAgICAgICAgJnJlbWFpbmRlcik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZHdpZGUsIG51bWVyYXRvciwKLQkgICAgICAgICAgICAgICAgICAgICByZW1haW5kZXIpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVub21pbmF0b3IpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDb21wRGl2KCZudW1lcmF0b3IsCisgICAgICAgICAgICAgICAgICBkZW5vbWluYXRvciwKKyAgICAgICAgICAgICAgICAgICZyZW1haW5kZXIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGR3aWRlLCBudW1lcmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVtYWluZGVyKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9Db21wRml4TXVsKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQl3aWRlIGNvbXBTcmM7Ci0JRml4ZWQgZml4U3JjOwotCXdpZGUgY29tcERzdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgd2lkZSBjb21wU3JjOworICAgIEZpeGVkIGZpeFNyYzsKKyAgICB3aWRlIGNvbXBEc3Q7CiAjaWZuZGVmIENvbXBGaXhNdWwKLQlQeU1hY19QUkVDSEVDSyhDb21wRml4TXVsKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb21wRml4TXVsKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZmaXhTcmMpKQotCQlyZXR1cm4gTlVMTDsKLQlDb21wRml4TXVsKCZjb21wU3JjLAotCSAgICAgICAgICAgZml4U3JjLAotCSAgICAgICAgICAgJmNvbXBEc3QpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZHdpZGUsIGNvbXBTcmMsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGR3aWRlLCBjb21wRHN0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmZml4U3JjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ29tcEZpeE11bCgmY29tcFNyYywKKyAgICAgICAgICAgICAgIGZpeFNyYywKKyAgICAgICAgICAgICAgICZjb21wRHN0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGR3aWRlLCBjb21wU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgY29tcERzdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfQ29tcE11bERpdihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jd2lkZSBjbzsKLQlsb25nIG11bDsKLQlsb25nIGRpdmlzb3I7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHdpZGUgY287CisgICAgbG9uZyBtdWw7CisgICAgbG9uZyBkaXZpc29yOwogI2lmbmRlZiBDb21wTXVsRGl2Ci0JUHlNYWNfUFJFQ0hFQ0soQ29tcE11bERpdik7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ29tcE11bERpdik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZtdWwsCi0JICAgICAgICAgICAgICAgICAgICAgICZkaXZpc29yKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ29tcE11bERpdigmY28sCi0JICAgICAgICAgICBtdWwsCi0JICAgICAgICAgICBkaXZpc29yKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgY28pOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm11bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRpdmlzb3IpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDb21wTXVsRGl2KCZjbywKKyAgICAgICAgICAgICAgIG11bCwKKyAgICAgICAgICAgICAgIGRpdmlzb3IpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGR3aWRlLCBjbyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfQ29tcE11bERpdlRydW5jKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQl3aWRlIGNvOwotCWxvbmcgbXVsOwotCWxvbmcgZGl2aXNvcjsKLQlsb25nIHJlbWFpbmRlcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgd2lkZSBjbzsKKyAgICBsb25nIG11bDsKKyAgICBsb25nIGRpdmlzb3I7CisgICAgbG9uZyByZW1haW5kZXI7CiAjaWZuZGVmIENvbXBNdWxEaXZUcnVuYwotCVB5TWFjX1BSRUNIRUNLKENvbXBNdWxEaXZUcnVuYyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ29tcE11bERpdlRydW5jKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm11bCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRpdmlzb3IpKQotCQlyZXR1cm4gTlVMTDsKLQlDb21wTXVsRGl2VHJ1bmMoJmNvLAotCSAgICAgICAgICAgICAgICBtdWwsCi0JICAgICAgICAgICAgICAgIGRpdmlzb3IsCi0JICAgICAgICAgICAgICAgICZyZW1haW5kZXIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgY28sCi0JICAgICAgICAgICAgICAgICAgICAgcmVtYWluZGVyKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtdWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkaXZpc29yKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ29tcE11bERpdlRydW5jKCZjbywKKyAgICAgICAgICAgICAgICAgICAgbXVsLAorICAgICAgICAgICAgICAgICAgICBkaXZpc29yLAorICAgICAgICAgICAgICAgICAgICAmcmVtYWluZGVyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZHdpZGUsIGNvLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmRlcik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfQ29tcENvbXBhcmUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWxvbmcgX3J2OwotCXdpZGUgYTsKLQl3aWRlIG1pbnVzYjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgbG9uZyBfcnY7CisgICAgd2lkZSBhOworICAgIHdpZGUgbWludXNiOwogI2lmbmRlZiBDb21wQ29tcGFyZQotCVB5TWFjX1BSRUNIRUNLKENvbXBDb21wYXJlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb21wQ29tcGFyZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0d2lkZSwgJmEsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldHdpZGUsICZtaW51c2IpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDb21wQ29tcGFyZSgmYSwKLQkgICAgICAgICAgICAgICAgICAmbWludXNiKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0d2lkZSwgJmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldHdpZGUsICZtaW51c2IpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDb21wQ29tcGFyZSgmYSwKKyAgICAgICAgICAgICAgICAgICAgICAmbWludXNiKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9Db21wU3F1YXJlUm9vdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JdW5zaWduZWQgbG9uZyBfcnY7Ci0Jd2lkZSBzcmM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHVuc2lnbmVkIGxvbmcgX3J2OworICAgIHdpZGUgc3JjOwogI2lmbmRlZiBDb21wU3F1YXJlUm9vdAotCVB5TWFjX1BSRUNIRUNLKENvbXBTcXVhcmVSb290KTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb21wU3F1YXJlUm9vdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldHdpZGUsICZzcmMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDb21wU3F1YXJlUm9vdCgmc3JjKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldHdpZGUsICZzcmMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDb21wU3F1YXJlUm9vdCgmc3JjKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9GaXhNdWxEaXYoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUZpeGVkIF9ydjsKLQlGaXhlZCBzcmM7Ci0JRml4ZWQgbXVsOwotCUZpeGVkIGRpdmlzb3I7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEZpeGVkIF9ydjsKKyAgICBGaXhlZCBzcmM7CisgICAgRml4ZWQgbXVsOworICAgIEZpeGVkIGRpdmlzb3I7CiAjaWZuZGVmIEZpeE11bERpdgotCVB5TWFjX1BSRUNIRUNLKEZpeE11bERpdik7CisgICAgUHlNYWNfUFJFQ0hFQ0soRml4TXVsRGl2KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmc3JjLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJm11bCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZkaXZpc29yKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRml4TXVsRGl2KHNyYywKLQkgICAgICAgICAgICAgICAgbXVsLAotCSAgICAgICAgICAgICAgICBkaXZpc29yKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRml4ZWQsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmbXVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJmRpdmlzb3IpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBGaXhNdWxEaXYoc3JjLAorICAgICAgICAgICAgICAgICAgICBtdWwsCisgICAgICAgICAgICAgICAgICAgIGRpdmlzb3IpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGaXhlZCwgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9VbnNpZ25lZEZpeE11bERpdihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JRml4ZWQgX3J2OwotCUZpeGVkIHNyYzsKLQlGaXhlZCBtdWw7Ci0JRml4ZWQgZGl2aXNvcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgRml4ZWQgX3J2OworICAgIEZpeGVkIHNyYzsKKyAgICBGaXhlZCBtdWw7CisgICAgRml4ZWQgZGl2aXNvcjsKICNpZm5kZWYgVW5zaWduZWRGaXhNdWxEaXYKLQlQeU1hY19QUkVDSEVDSyhVbnNpZ25lZEZpeE11bERpdik7CisgICAgUHlNYWNfUFJFQ0hFQ0soVW5zaWduZWRGaXhNdWxEaXYpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZzcmMsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmbXVsLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJmRpdmlzb3IpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBVbnNpZ25lZEZpeE11bERpdihzcmMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgbXVsLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGRpdmlzb3IpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGaXhlZCwgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZtdWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmZGl2aXNvcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFVuc2lnbmVkRml4TXVsRGl2KHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGl2aXNvcik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0ZpeEV4cDIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUZpeGVkIF9ydjsKLQlGaXhlZCBzcmM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEZpeGVkIF9ydjsKKyAgICBGaXhlZCBzcmM7CiAjaWZuZGVmIEZpeEV4cDIKLQlQeU1hY19QUkVDSEVDSyhGaXhFeHAyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhGaXhFeHAyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZzcmMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBGaXhFeHAyKHNyYyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZzcmMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBGaXhFeHAyKHNyYyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0ZpeExvZzIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUZpeGVkIF9ydjsKLQlGaXhlZCBzcmM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEZpeGVkIF9ydjsKKyAgICBGaXhlZCBzcmM7CiAjaWZuZGVmIEZpeExvZzIKLQlQeU1hY19QUkVDSEVDSyhGaXhMb2cyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhGaXhMb2cyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZzcmMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBGaXhMb2cyKHNyYyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZzcmMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBGaXhMb2cyKHNyYyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0ZpeFBvdyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JRml4ZWQgX3J2OwotCUZpeGVkIGJhc2U7Ci0JRml4ZWQgZXhwOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBGaXhlZCBfcnY7CisgICAgRml4ZWQgYmFzZTsKKyAgICBGaXhlZCBleHA7CiAjaWZuZGVmIEZpeFBvdwotCVB5TWFjX1BSRUNIRUNLKEZpeFBvdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRml4UG93KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJmJhc2UsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmZXhwKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRml4UG93KGJhc2UsCi0JICAgICAgICAgICAgIGV4cCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJmJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmZXhwKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRml4UG93KGJhc2UsCisgICAgICAgICAgICAgICAgIGV4cCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzSW1wb3J0U2V0RGF0YVJlZmVyZW5jZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKLQlIYW5kbGUgZGF0YVJlZjsKLQlPU1R5cGUgZGF0YVJlVHlwZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKKyAgICBIYW5kbGUgZGF0YVJlZjsKKyAgICBPU1R5cGUgZGF0YVJlVHlwZTsKICNpZm5kZWYgR3JhcGhpY3NJbXBvcnRTZXREYXRhUmVmZXJlbmNlCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRTZXREYXRhUmVmZXJlbmNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydFNldERhdGFSZWZlcmVuY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGF0YVJlVHlwZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzSW1wb3J0U2V0RGF0YVJlZmVyZW5jZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlVHlwZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGF0YVJlVHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzSW1wb3J0U2V0RGF0YVJlZmVyZW5jZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlVHlwZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NJbXBvcnRHZXREYXRhUmVmZXJlbmNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOwotCUhhbmRsZSBkYXRhUmVmOwotCU9TVHlwZSBkYXRhUmVUeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOworICAgIEhhbmRsZSBkYXRhUmVmOworICAgIE9TVHlwZSBkYXRhUmVUeXBlOwogI2lmbmRlZiBHcmFwaGljc0ltcG9ydEdldERhdGFSZWZlcmVuY2UKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydEdldERhdGFSZWZlcmVuY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0R2V0RGF0YVJlZmVyZW5jZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXREYXRhUmVmZXJlbmNlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFSZVR5cGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIGRhdGFSZVR5cGUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0ltcG9ydEdldERhdGFSZWZlcmVuY2UoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVJlVHlwZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgZGF0YVJlVHlwZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NJbXBvcnRTZXREYXRhRmlsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKLQlGU1NwZWMgdGhlRmlsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKKyAgICBGU1NwZWMgdGhlRmlsZTsKICNpZm5kZWYgR3JhcGhpY3NJbXBvcnRTZXREYXRhRmlsZQotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0U2V0RGF0YUZpbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0U2V0RGF0YUZpbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZ0aGVGaWxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NJbXBvcnRTZXREYXRhRmlsZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVGaWxlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJnRoZUZpbGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0ltcG9ydFNldERhdGFGaWxlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUZpbGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzSW1wb3J0R2V0RGF0YUZpbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7Ci0JRlNTcGVjIHRoZUZpbGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7CisgICAgRlNTcGVjIHRoZUZpbGU7CiAjaWZuZGVmIEdyYXBoaWNzSW1wb3J0R2V0RGF0YUZpbGUKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydEdldERhdGFGaWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydEdldERhdGFGaWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmdGhlRmlsZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzSW1wb3J0R2V0RGF0YUZpbGUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlRmlsZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZ0aGVGaWxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXREYXRhRmlsZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVGaWxlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0ltcG9ydFNldERhdGFIYW5kbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7Ci0JSGFuZGxlIGg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7CisgICAgSGFuZGxlIGg7CiAjaWZuZGVmIEdyYXBoaWNzSW1wb3J0U2V0RGF0YUhhbmRsZQotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0U2V0RGF0YUhhbmRsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRTZXREYXRhSGFuZGxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NJbXBvcnRTZXREYXRhSGFuZGxlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzSW1wb3J0U2V0RGF0YUhhbmRsZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NJbXBvcnRHZXREYXRhSGFuZGxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOwotCUhhbmRsZSBoOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOworICAgIEhhbmRsZSBoOwogI2lmbmRlZiBHcmFwaGljc0ltcG9ydEdldERhdGFIYW5kbGUKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydEdldERhdGFIYW5kbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0R2V0RGF0YUhhbmRsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXREYXRhSGFuZGxlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGgpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0ltcG9ydEdldERhdGFIYW5kbGUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgaCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NJbXBvcnRHZXRJbWFnZURlc2NyaXB0aW9uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOwotCUltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKKyAgICBJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2M7CiAjaWZuZGVmIEdyYXBoaWNzSW1wb3J0R2V0SW1hZ2VEZXNjcmlwdGlvbgotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0R2V0SW1hZ2VEZXNjcmlwdGlvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRHZXRJbWFnZURlc2NyaXB0aW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0ltcG9ydEdldEltYWdlRGVzY3JpcHRpb24oY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXNjKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgZGVzYyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzSW1wb3J0R2V0SW1hZ2VEZXNjcmlwdGlvbihjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc2MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBkZXNjKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0ltcG9ydEdldERhdGFPZmZzZXRBbmRTaXplKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOwotCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OwotCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKKyAgICB1bnNpZ25lZCBsb25nIG9mZnNldDsKKyAgICB1bnNpZ25lZCBsb25nIHNpemU7CiAjaWZuZGVmIEdyYXBoaWNzSW1wb3J0R2V0RGF0YU9mZnNldEFuZFNpemUKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydEdldERhdGFPZmZzZXRBbmRTaXplKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydEdldERhdGFPZmZzZXRBbmRTaXplKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0ltcG9ydEdldERhdGFPZmZzZXRBbmRTaXplKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgIHNpemUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0ltcG9ydEdldERhdGFPZmZzZXRBbmRTaXplKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzSW1wb3J0UmVhZERhdGEoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7Ci0Jdm9pZCAqIGRhdGFQdHI7Ci0JdW5zaWduZWQgbG9uZyBkYXRhT2Zmc2V0OwotCXVuc2lnbmVkIGxvbmcgZGF0YVNpemU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7CisgICAgdm9pZCAqIGRhdGFQdHI7CisgICAgdW5zaWduZWQgbG9uZyBkYXRhT2Zmc2V0OworICAgIHVuc2lnbmVkIGxvbmcgZGF0YVNpemU7CiAjaWZuZGVmIEdyYXBoaWNzSW1wb3J0UmVhZERhdGEKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydFJlYWREYXRhKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydFJlYWREYXRhKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mc2xsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZkYXRhUHRyLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGF0YU9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRhdGFTaXplKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NJbXBvcnRSZWFkRGF0YShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFQdHIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhT2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVNpemUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mc2xsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFTaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NJbXBvcnRSZWFkRGF0YShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVNpemUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzSW1wb3J0U2V0Q2xpcChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKLQlSZ25IYW5kbGUgY2xpcFJnbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKKyAgICBSZ25IYW5kbGUgY2xpcFJnbjsKICNpZm5kZWYgR3JhcGhpY3NJbXBvcnRTZXRDbGlwCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRTZXRDbGlwKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydFNldENsaXApOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmNsaXBSZ24pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0ltcG9ydFNldENsaXAoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBSZ24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZjbGlwUmduKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NJbXBvcnRTZXRDbGlwKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwUmduKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0ltcG9ydEdldENsaXAoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7Ci0JUmduSGFuZGxlIGNsaXBSZ247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7CisgICAgUmduSGFuZGxlIGNsaXBSZ247CiAjaWZuZGVmIEdyYXBoaWNzSW1wb3J0R2V0Q2xpcAotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0R2V0Q2xpcCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRHZXRDbGlwKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0ltcG9ydEdldENsaXAoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjbGlwUmduKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgY2xpcFJnbik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzSW1wb3J0R2V0Q2xpcChjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNsaXBSZ24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBjbGlwUmduKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0ltcG9ydFNldFNvdXJjZVJlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7Ci0JUmVjdCBzb3VyY2VSZWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOworICAgIFJlY3Qgc291cmNlUmVjdDsKICNpZm5kZWYgR3JhcGhpY3NJbXBvcnRTZXRTb3VyY2VSZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRTZXRTb3VyY2VSZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydFNldFNvdXJjZVJlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmc291cmNlUmVjdCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzSW1wb3J0U2V0U291cmNlUmVjdChjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNvdXJjZVJlY3QpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnNvdXJjZVJlY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0ltcG9ydFNldFNvdXJjZVJlY3QoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzb3VyY2VSZWN0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0ltcG9ydEdldFNvdXJjZVJlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7Ci0JUmVjdCBzb3VyY2VSZWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOworICAgIFJlY3Qgc291cmNlUmVjdDsKICNpZm5kZWYgR3JhcGhpY3NJbXBvcnRHZXRTb3VyY2VSZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRHZXRTb3VyY2VSZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydEdldFNvdXJjZVJlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzSW1wb3J0R2V0U291cmNlUmVjdChjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNvdXJjZVJlY3QpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZzb3VyY2VSZWN0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXRTb3VyY2VSZWN0KGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc291cmNlUmVjdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJnNvdXJjZVJlY3QpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzSW1wb3J0R2V0TmF0dXJhbEJvdW5kcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKLQlSZWN0IG5hdHVyYWxCb3VuZHM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7CisgICAgUmVjdCBuYXR1cmFsQm91bmRzOwogI2lmbmRlZiBHcmFwaGljc0ltcG9ydEdldE5hdHVyYWxCb3VuZHMKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydEdldE5hdHVyYWxCb3VuZHMpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0R2V0TmF0dXJhbEJvdW5kcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXROYXR1cmFsQm91bmRzKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmF0dXJhbEJvdW5kcyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJm5hdHVyYWxCb3VuZHMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0ltcG9ydEdldE5hdHVyYWxCb3VuZHMoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuYXR1cmFsQm91bmRzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmbmF0dXJhbEJvdW5kcyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NJbXBvcnREcmF3KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOwogI2lmbmRlZiBHcmFwaGljc0ltcG9ydERyYXcKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydERyYXcpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0RHJhdyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NJbXBvcnREcmF3KGNpKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NJbXBvcnREcmF3KGNpKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0ltcG9ydFNldEdXb3JsZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKLQlDR3JhZlB0ciBwb3J0OwotCUdESGFuZGxlIGdkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOworICAgIENHcmFmUHRyIHBvcnQ7CisgICAgR0RIYW5kbGUgZ2Q7CiAjaWZuZGVmIEdyYXBoaWNzSW1wb3J0U2V0R1dvcmxkCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRTZXRHV29ybGQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0U2V0R1dvcmxkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX0NvbnZlcnQsICZwb3J0LAotCSAgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfQ29udmVydCwgJmdkKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NJbXBvcnRTZXRHV29ybGQoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfQ29udmVydCwgJnBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdFJlc09ial9Db252ZXJ0LCAmZ2QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0ltcG9ydFNldEdXb3JsZChjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdkKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0ltcG9ydEdldEdXb3JsZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKLQlDR3JhZlB0ciBwb3J0OwotCUdESGFuZGxlIGdkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOworICAgIENHcmFmUHRyIHBvcnQ7CisgICAgR0RIYW5kbGUgZ2Q7CiAjaWZuZGVmIEdyYXBoaWNzSW1wb3J0R2V0R1dvcmxkCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRHZXRHV29ybGQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0R2V0R1dvcmxkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0ltcG9ydEdldEdXb3JsZChjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcG9ydCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2QpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfTmV3LCBwb3J0LAotCSAgICAgICAgICAgICAgICAgICAgIE9wdFJlc09ial9OZXcsIGdkKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXRHV29ybGQoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdkKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX05ldywgcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfTmV3LCBnZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NJbXBvcnRTZXRCb3VuZHNSZWN0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOwotCVJlY3QgYm91bmRzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOworICAgIFJlY3QgYm91bmRzOwogI2lmbmRlZiBHcmFwaGljc0ltcG9ydFNldEJvdW5kc1JlY3QKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydFNldEJvdW5kc1JlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0U2V0Qm91bmRzUmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0ltcG9ydFNldEJvdW5kc1JlY3QoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzSW1wb3J0U2V0Qm91bmRzUmVjdChjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kcyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NJbXBvcnRHZXRCb3VuZHNSZWN0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOwotCVJlY3QgYm91bmRzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOworICAgIFJlY3QgYm91bmRzOwogI2lmbmRlZiBHcmFwaGljc0ltcG9ydEdldEJvdW5kc1JlY3QKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydEdldEJvdW5kc1JlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0R2V0Qm91bmRzUmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXRCb3VuZHNSZWN0KGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmYm91bmRzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXRCb3VuZHNSZWN0KGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmYm91bmRzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0ltcG9ydFNhdmVBc1BpY3R1cmUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7Ci0JRlNTcGVjIGZzczsKLQlTY3JpcHRDb2RlIHNjcmlwdFRhZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKKyAgICBGU1NwZWMgZnNzOworICAgIFNjcmlwdENvZGUgc2NyaXB0VGFnOwogI2lmbmRlZiBHcmFwaGljc0ltcG9ydFNhdmVBc1BpY3R1cmUKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydFNhdmVBc1BpY3R1cmUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0U2F2ZUFzUGljdHVyZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZmc3MsCi0JICAgICAgICAgICAgICAgICAgICAgICZzY3JpcHRUYWcpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0ltcG9ydFNhdmVBc1BpY3R1cmUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmc3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdFRhZyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmZnNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2NyaXB0VGFnKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NJbXBvcnRTYXZlQXNQaWN0dXJlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZnNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRUYWcpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzSW1wb3J0U2V0R3JhcGhpY3NNb2RlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOwotCWxvbmcgZ3JhcGhpY3NNb2RlOwotCVJHQkNvbG9yIG9wQ29sb3I7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7CisgICAgbG9uZyBncmFwaGljc01vZGU7CisgICAgUkdCQ29sb3Igb3BDb2xvcjsKICNpZm5kZWYgR3JhcGhpY3NJbXBvcnRTZXRHcmFwaGljc01vZGUKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydFNldEdyYXBoaWNzTW9kZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRTZXRHcmFwaGljc01vZGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmdyYXBoaWNzTW9kZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUWRSR0JfQ29udmVydCwgJm9wQ29sb3IpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0ltcG9ydFNldEdyYXBoaWNzTW9kZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFwaGljc01vZGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9wQ29sb3IpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZncmFwaGljc01vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFFkUkdCX0NvbnZlcnQsICZvcENvbG9yKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NJbXBvcnRTZXRHcmFwaGljc01vZGUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhcGhpY3NNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvcENvbG9yKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0ltcG9ydEdldEdyYXBoaWNzTW9kZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKLQlsb25nIGdyYXBoaWNzTW9kZTsKLQlSR0JDb2xvciBvcENvbG9yOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOworICAgIGxvbmcgZ3JhcGhpY3NNb2RlOworICAgIFJHQkNvbG9yIG9wQ29sb3I7CiAjaWZuZGVmIEdyYXBoaWNzSW1wb3J0R2V0R3JhcGhpY3NNb2RlCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRHZXRHcmFwaGljc01vZGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0R2V0R3JhcGhpY3NNb2RlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0ltcG9ydEdldEdyYXBoaWNzTW9kZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ3JhcGhpY3NNb2RlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvcENvbG9yKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGdyYXBoaWNzTW9kZSwKLQkgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZvcENvbG9yKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXRHcmFwaGljc01vZGUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdyYXBoaWNzTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3BDb2xvcik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBncmFwaGljc01vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgUWRSR0JfTmV3LCAmb3BDb2xvcik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NJbXBvcnRTZXRRdWFsaXR5KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOwotCUNvZGVjUSBxdWFsaXR5OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOworICAgIENvZGVjUSBxdWFsaXR5OwogI2lmbmRlZiBHcmFwaGljc0ltcG9ydFNldFF1YWxpdHkKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydFNldFF1YWxpdHkpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0U2V0UXVhbGl0eSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnF1YWxpdHkpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0ltcG9ydFNldFF1YWxpdHkoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpdHkpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcXVhbGl0eSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzSW1wb3J0U2V0UXVhbGl0eShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGl0eSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NJbXBvcnRHZXRRdWFsaXR5KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOwotCUNvZGVjUSBxdWFsaXR5OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOworICAgIENvZGVjUSBxdWFsaXR5OwogI2lmbmRlZiBHcmFwaGljc0ltcG9ydEdldFF1YWxpdHkKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydEdldFF1YWxpdHkpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0R2V0UXVhbGl0eSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXRRdWFsaXR5KGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcXVhbGl0eSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgcXVhbGl0eSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzSW1wb3J0R2V0UXVhbGl0eShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnF1YWxpdHkpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpdHkpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzSW1wb3J0U2F2ZUFzUXVpY2tUaW1lSW1hZ2VGaWxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOwotCUZTU3BlYyBmc3M7Ci0JU2NyaXB0Q29kZSBzY3JpcHRUYWc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7CisgICAgRlNTcGVjIGZzczsKKyAgICBTY3JpcHRDb2RlIHNjcmlwdFRhZzsKICNpZm5kZWYgR3JhcGhpY3NJbXBvcnRTYXZlQXNRdWlja1RpbWVJbWFnZUZpbGUKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydFNhdmVBc1F1aWNrVGltZUltYWdlRmlsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRTYXZlQXNRdWlja1RpbWVJbWFnZUZpbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmZnNzLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2NyaXB0VGFnKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NJbXBvcnRTYXZlQXNRdWlja1RpbWVJbWFnZUZpbGUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZzcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRUYWcpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJmZzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNjcmlwdFRhZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzSW1wb3J0U2F2ZUFzUXVpY2tUaW1lSW1hZ2VGaWxlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0VGFnKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0ltcG9ydFNldERhdGFSZWZlcmVuY2VPZmZzZXRBbmRMaW1pdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKLQl1bnNpZ25lZCBsb25nIG9mZnNldDsKLQl1bnNpZ25lZCBsb25nIGxpbWl0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOworICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0OworICAgIHVuc2lnbmVkIGxvbmcgbGltaXQ7CiAjaWZuZGVmIEdyYXBoaWNzSW1wb3J0U2V0RGF0YVJlZmVyZW5jZU9mZnNldEFuZExpbWl0Ci0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRTZXREYXRhUmVmZXJlbmNlT2Zmc2V0QW5kTGltaXQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0U2V0RGF0YVJlZmVyZW5jZU9mZnNldEFuZExpbWl0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmxpbWl0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NJbXBvcnRTZXREYXRhUmVmZXJlbmNlT2Zmc2V0QW5kTGltaXQoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZsaW1pdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzSW1wb3J0U2V0RGF0YVJlZmVyZW5jZU9mZnNldEFuZExpbWl0KGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NJbXBvcnRHZXREYXRhUmVmZXJlbmNlT2Zmc2V0QW5kTGltaXQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7Ci0JdW5zaWduZWQgbG9uZyBvZmZzZXQ7Ci0JdW5zaWduZWQgbG9uZyBsaW1pdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKKyAgICB1bnNpZ25lZCBsb25nIG9mZnNldDsKKyAgICB1bnNpZ25lZCBsb25nIGxpbWl0OwogI2lmbmRlZiBHcmFwaGljc0ltcG9ydEdldERhdGFSZWZlcmVuY2VPZmZzZXRBbmRMaW1pdAotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0R2V0RGF0YVJlZmVyZW5jZU9mZnNldEFuZExpbWl0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydEdldERhdGFSZWZlcmVuY2VPZmZzZXRBbmRMaW1pdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXREYXRhUmVmZXJlbmNlT2Zmc2V0QW5kTGltaXQoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGltaXQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgbGltaXQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0ltcG9ydEdldERhdGFSZWZlcmVuY2VPZmZzZXRBbmRMaW1pdChjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsaW1pdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NJbXBvcnRHZXRBbGlhc2VkRGF0YVJlZmVyZW5jZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKLQlIYW5kbGUgZGF0YVJlZjsKLQlPU1R5cGUgZGF0YVJlZlR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7CisgICAgSGFuZGxlIGRhdGFSZWY7CisgICAgT1NUeXBlIGRhdGFSZWZUeXBlOwogI2lmbmRlZiBHcmFwaGljc0ltcG9ydEdldEFsaWFzZWREYXRhUmVmZXJlbmNlCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRHZXRBbGlhc2VkRGF0YVJlZmVyZW5jZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRHZXRBbGlhc2VkRGF0YVJlZmVyZW5jZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXRBbGlhc2VkRGF0YVJlZmVyZW5jZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFSZWZUeXBlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBkYXRhUmVmVHlwZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzSW1wb3J0R2V0QWxpYXNlZERhdGFSZWZlcmVuY2UoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUmVmVHlwZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgZGF0YVJlZlR5cGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzSW1wb3J0VmFsaWRhdGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7Ci0JQm9vbGVhbiB2YWxpZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKKyAgICBCb29sZWFuIHZhbGlkOwogI2lmbmRlZiBHcmFwaGljc0ltcG9ydFZhbGlkYXRlCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRWYWxpZGF0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRWYWxpZGF0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NJbXBvcnRWYWxpZGF0ZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWxpZCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgdmFsaWQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0ltcG9ydFZhbGlkYXRlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbGlkKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NJbXBvcnRHZXRNZXRhRGF0YShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKLQl2b2lkICogdXNlckRhdGE7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7CisgICAgdm9pZCAqIHVzZXJEYXRhOwogI2lmbmRlZiBHcmFwaGljc0ltcG9ydEdldE1ldGFEYXRhCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRHZXRNZXRhRGF0YSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRHZXRNZXRhRGF0YSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnMiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnVzZXJEYXRhKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXRNZXRhRGF0YShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJEYXRhKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnVzZXJEYXRhKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXRNZXRhRGF0YShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJEYXRhKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0ltcG9ydEdldE1JTUVUeXBlTGlzdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKLQl2b2lkICogcXRBdG9tQ29udGFpbmVyUHRyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOworICAgIHZvaWQgKiBxdEF0b21Db250YWluZXJQdHI7CiAjaWZuZGVmIEdyYXBoaWNzSW1wb3J0R2V0TUlNRVR5cGVMaXN0Ci0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRHZXRNSU1FVHlwZUxpc3QpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0R2V0TUlNRVR5cGVMaXN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmcXRBdG9tQ29udGFpbmVyUHRyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXRNSU1FVHlwZUxpc3QoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXRBdG9tQ29udGFpbmVyUHRyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnF0QXRvbUNvbnRhaW5lclB0cikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzSW1wb3J0R2V0TUlNRVR5cGVMaXN0KGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF0QXRvbUNvbnRhaW5lclB0cik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NJbXBvcnREb2VzRHJhd0FsbFBpeGVscyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKLQlzaG9ydCBkcmF3c0FsbFBpeGVsczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKKyAgICBzaG9ydCBkcmF3c0FsbFBpeGVsczsKICNpZm5kZWYgR3JhcGhpY3NJbXBvcnREb2VzRHJhd0FsbFBpeGVscwotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0RG9lc0RyYXdBbGxQaXhlbHMpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0RG9lc0RyYXdBbGxQaXhlbHMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzSW1wb3J0RG9lc0RyYXdBbGxQaXhlbHMoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHJhd3NBbGxQaXhlbHMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGRyYXdzQWxsUGl4ZWxzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NJbXBvcnREb2VzRHJhd0FsbFBpeGVscyhjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkcmF3c0FsbFBpeGVscyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgZHJhd3NBbGxQaXhlbHMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzSW1wb3J0R2V0QXNQaWN0dXJlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOwotCVBpY0hhbmRsZSBwaWN0dXJlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOworICAgIFBpY0hhbmRsZSBwaWN0dXJlOwogI2lmbmRlZiBHcmFwaGljc0ltcG9ydEdldEFzUGljdHVyZQotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0R2V0QXNQaWN0dXJlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydEdldEFzUGljdHVyZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXRBc1BpY3R1cmUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBpY3R1cmUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBwaWN0dXJlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXRBc1BpY3R1cmUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBpY3R1cmUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBwaWN0dXJlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0ltcG9ydEV4cG9ydEltYWdlRmlsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKLQlPU1R5cGUgZmlsZVR5cGU7Ci0JT1NUeXBlIGZpbGVDcmVhdG9yOwotCUZTU3BlYyBmc3M7Ci0JU2NyaXB0Q29kZSBzY3JpcHRUYWc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7CisgICAgT1NUeXBlIGZpbGVUeXBlOworICAgIE9TVHlwZSBmaWxlQ3JlYXRvcjsKKyAgICBGU1NwZWMgZnNzOworICAgIFNjcmlwdENvZGUgc2NyaXB0VGFnOwogI2lmbmRlZiBHcmFwaGljc0ltcG9ydEV4cG9ydEltYWdlRmlsZQotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0RXhwb3J0SW1hZ2VGaWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydEV4cG9ydEltYWdlRmlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZmlsZVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmZpbGVDcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZmc3MsCi0JICAgICAgICAgICAgICAgICAgICAgICZzY3JpcHRUYWcpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0ltcG9ydEV4cG9ydEltYWdlRmlsZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlQ3JlYXRvciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZnNzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdFRhZyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmZpbGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZmaWxlQ3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmZnNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2NyaXB0VGFnKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NJbXBvcnRFeHBvcnRJbWFnZUZpbGUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZUNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRUYWcpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzSW1wb3J0R2V0RXhwb3J0SW1hZ2VUeXBlTGlzdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKLQl2b2lkICogcXRBdG9tQ29udGFpbmVyUHRyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOworICAgIHZvaWQgKiBxdEF0b21Db250YWluZXJQdHI7CiAjaWZuZGVmIEdyYXBoaWNzSW1wb3J0R2V0RXhwb3J0SW1hZ2VUeXBlTGlzdAotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0R2V0RXhwb3J0SW1hZ2VUeXBlTGlzdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRHZXRFeHBvcnRJbWFnZVR5cGVMaXN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmcXRBdG9tQ29udGFpbmVyUHRyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXRFeHBvcnRJbWFnZVR5cGVMaXN0KGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdEF0b21Db250YWluZXJQdHIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcXRBdG9tQ29udGFpbmVyUHRyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXRFeHBvcnRJbWFnZVR5cGVMaXN0KGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdEF0b21Db250YWluZXJQdHIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzSW1wb3J0R2V0RXhwb3J0U2V0dGluZ3NBc0F0b21Db250YWluZXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7Ci0Jdm9pZCAqIHF0QXRvbUNvbnRhaW5lclB0cjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKKyAgICB2b2lkICogcXRBdG9tQ29udGFpbmVyUHRyOwogI2lmbmRlZiBHcmFwaGljc0ltcG9ydEdldEV4cG9ydFNldHRpbmdzQXNBdG9tQ29udGFpbmVyCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRHZXRFeHBvcnRTZXR0aW5nc0FzQXRvbUNvbnRhaW5lcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRHZXRFeHBvcnRTZXR0aW5nc0FzQXRvbUNvbnRhaW5lcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnMiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnF0QXRvbUNvbnRhaW5lclB0cikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzSW1wb3J0R2V0RXhwb3J0U2V0dGluZ3NBc0F0b21Db250YWluZXIoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdEF0b21Db250YWluZXJQdHIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcXRBdG9tQ29udGFpbmVyUHRyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXRFeHBvcnRTZXR0aW5nc0FzQXRvbUNvbnRhaW5lcihjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF0QXRvbUNvbnRhaW5lclB0cik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NJbXBvcnRTZXRFeHBvcnRTZXR0aW5nc0Zyb21BdG9tQ29udGFpbmVyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOwotCXZvaWQgKiBxdEF0b21Db250YWluZXI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7CisgICAgdm9pZCAqIHF0QXRvbUNvbnRhaW5lcjsKICNpZm5kZWYgR3JhcGhpY3NJbXBvcnRTZXRFeHBvcnRTZXR0aW5nc0Zyb21BdG9tQ29udGFpbmVyCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRTZXRFeHBvcnRTZXR0aW5nc0Zyb21BdG9tQ29udGFpbmVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydFNldEV4cG9ydFNldHRpbmdzRnJvbUF0b21Db250YWluZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZxdEF0b21Db250YWluZXIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0ltcG9ydFNldEV4cG9ydFNldHRpbmdzRnJvbUF0b21Db250YWluZXIoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF0QXRvbUNvbnRhaW5lcik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZxdEF0b21Db250YWluZXIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0ltcG9ydFNldEV4cG9ydFNldHRpbmdzRnJvbUF0b21Db250YWluZXIoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF0QXRvbUNvbnRhaW5lcik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NJbXBvcnRHZXRJbWFnZUNvdW50KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOwotCXVuc2lnbmVkIGxvbmcgaW1hZ2VDb3VudDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKKyAgICB1bnNpZ25lZCBsb25nIGltYWdlQ291bnQ7CiAjaWZuZGVmIEdyYXBoaWNzSW1wb3J0R2V0SW1hZ2VDb3VudAotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0R2V0SW1hZ2VDb3VudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRHZXRJbWFnZUNvdW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0ltcG9ydEdldEltYWdlQ291bnQoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbWFnZUNvdW50KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBpbWFnZUNvdW50KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXRJbWFnZUNvdW50KGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW1hZ2VDb3VudCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VDb3VudCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NJbXBvcnRTZXRJbWFnZUluZGV4KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOwotCXVuc2lnbmVkIGxvbmcgaW1hZ2VJbmRleDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKKyAgICB1bnNpZ25lZCBsb25nIGltYWdlSW5kZXg7CiAjaWZuZGVmIEdyYXBoaWNzSW1wb3J0U2V0SW1hZ2VJbmRleAotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0U2V0SW1hZ2VJbmRleCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRTZXRJbWFnZUluZGV4KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW1hZ2VJbmRleCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzSW1wb3J0U2V0SW1hZ2VJbmRleChjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VJbmRleCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbWFnZUluZGV4KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NJbXBvcnRTZXRJbWFnZUluZGV4KGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUluZGV4KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0ltcG9ydEdldEltYWdlSW5kZXgoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7Ci0JdW5zaWduZWQgbG9uZyBpbWFnZUluZGV4OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOworICAgIHVuc2lnbmVkIGxvbmcgaW1hZ2VJbmRleDsKICNpZm5kZWYgR3JhcGhpY3NJbXBvcnRHZXRJbWFnZUluZGV4Ci0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRHZXRJbWFnZUluZGV4KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydEdldEltYWdlSW5kZXgpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzSW1wb3J0R2V0SW1hZ2VJbmRleChjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmltYWdlSW5kZXgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGltYWdlSW5kZXgpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0ltcG9ydEdldEltYWdlSW5kZXgoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbWFnZUluZGV4KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUluZGV4KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0ltcG9ydEdldERhdGFPZmZzZXRBbmRTaXplNjQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7Ci0Jd2lkZSBvZmZzZXQ7Ci0Jd2lkZSBzaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOworICAgIHdpZGUgb2Zmc2V0OworICAgIHdpZGUgc2l6ZTsKICNpZm5kZWYgR3JhcGhpY3NJbXBvcnRHZXREYXRhT2Zmc2V0QW5kU2l6ZTY0Ci0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRHZXREYXRhT2Zmc2V0QW5kU2l6ZTY0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydEdldERhdGFPZmZzZXRBbmRTaXplNjQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzSW1wb3J0R2V0RGF0YU9mZnNldEFuZFNpemU2NChjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgb2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgc2l6ZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzSW1wb3J0R2V0RGF0YU9mZnNldEFuZFNpemU2NChjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgc2l6ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NJbXBvcnRSZWFkRGF0YTY0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOwotCXZvaWQgKiBkYXRhUHRyOwotCXdpZGUgZGF0YU9mZnNldDsKLQl1bnNpZ25lZCBsb25nIGRhdGFTaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOworICAgIHZvaWQgKiBkYXRhUHRyOworICAgIHdpZGUgZGF0YU9mZnNldDsKKyAgICB1bnNpZ25lZCBsb25nIGRhdGFTaXplOwogI2lmbmRlZiBHcmFwaGljc0ltcG9ydFJlYWREYXRhNjQKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydFJlYWREYXRhNjQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0UmVhZERhdGE2NCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnNPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRhdGFQdHIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldHdpZGUsICZkYXRhT2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAmZGF0YVNpemUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0ltcG9ydFJlYWREYXRhNjQoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFQdHIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhT2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhU2l6ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXR3aWRlLCAmZGF0YU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFTaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NJbXBvcnRSZWFkRGF0YTY0KGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVNpemUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzSW1wb3J0U2V0RGF0YVJlZmVyZW5jZU9mZnNldEFuZExpbWl0NjQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7Ci0Jd2lkZSBvZmZzZXQ7Ci0Jd2lkZSBsaW1pdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKKyAgICB3aWRlIG9mZnNldDsKKyAgICB3aWRlIGxpbWl0OwogI2lmbmRlZiBHcmFwaGljc0ltcG9ydFNldERhdGFSZWZlcmVuY2VPZmZzZXRBbmRMaW1pdDY0Ci0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRTZXREYXRhUmVmZXJlbmNlT2Zmc2V0QW5kTGltaXQ2NCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRTZXREYXRhUmVmZXJlbmNlT2Zmc2V0QW5kTGltaXQ2NCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0d2lkZSwgJm9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0d2lkZSwgJmxpbWl0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NJbXBvcnRTZXREYXRhUmVmZXJlbmNlT2Zmc2V0QW5kTGltaXQ2NChjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGltaXQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXR3aWRlLCAmb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXR3aWRlLCAmbGltaXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0ltcG9ydFNldERhdGFSZWZlcmVuY2VPZmZzZXRBbmRMaW1pdDY0KGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsaW1pdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NJbXBvcnRHZXREYXRhUmVmZXJlbmNlT2Zmc2V0QW5kTGltaXQ2NChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKLQl3aWRlIG9mZnNldDsKLQl3aWRlIGxpbWl0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOworICAgIHdpZGUgb2Zmc2V0OworICAgIHdpZGUgbGltaXQ7CiAjaWZuZGVmIEdyYXBoaWNzSW1wb3J0R2V0RGF0YVJlZmVyZW5jZU9mZnNldEFuZExpbWl0NjQKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydEdldERhdGFSZWZlcmVuY2VPZmZzZXRBbmRMaW1pdDY0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydEdldERhdGFSZWZlcmVuY2VPZmZzZXRBbmRMaW1pdDY0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0ltcG9ydEdldERhdGFSZWZlcmVuY2VPZmZzZXRBbmRMaW1pdDY0KGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsaW1pdCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGR3aWRlLCBvZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGR3aWRlLCBsaW1pdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzSW1wb3J0R2V0RGF0YVJlZmVyZW5jZU9mZnNldEFuZExpbWl0NjQoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxpbWl0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZHdpZGUsIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZHdpZGUsIGxpbWl0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0ltcG9ydEdldERlZmF1bHRDbGlwKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOwotCVJnbkhhbmRsZSBkZWZhdWx0UmduOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOworICAgIFJnbkhhbmRsZSBkZWZhdWx0UmduOwogI2lmbmRlZiBHcmFwaGljc0ltcG9ydEdldERlZmF1bHRDbGlwCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRHZXREZWZhdWx0Q2xpcCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRHZXREZWZhdWx0Q2xpcCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXREZWZhdWx0Q2xpcChjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZWZhdWx0UmduKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgZGVmYXVsdFJnbik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzSW1wb3J0R2V0RGVmYXVsdENsaXAoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVmYXVsdFJnbik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGRlZmF1bHRSZ24pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzSW1wb3J0R2V0RGVmYXVsdEdyYXBoaWNzTW9kZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKLQlsb25nIGRlZmF1bHRHcmFwaGljc01vZGU7Ci0JUkdCQ29sb3IgZGVmYXVsdE9wQ29sb3I7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7CisgICAgbG9uZyBkZWZhdWx0R3JhcGhpY3NNb2RlOworICAgIFJHQkNvbG9yIGRlZmF1bHRPcENvbG9yOwogI2lmbmRlZiBHcmFwaGljc0ltcG9ydEdldERlZmF1bHRHcmFwaGljc01vZGUKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydEdldERlZmF1bHRHcmFwaGljc01vZGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0R2V0RGVmYXVsdEdyYXBoaWNzTW9kZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXREZWZhdWx0R3JhcGhpY3NNb2RlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVmYXVsdEdyYXBoaWNzTW9kZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlZmF1bHRPcENvbG9yKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRHcmFwaGljc01vZGUsCi0JICAgICAgICAgICAgICAgICAgICAgUWRSR0JfTmV3LCAmZGVmYXVsdE9wQ29sb3IpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0ltcG9ydEdldERlZmF1bHRHcmFwaGljc01vZGUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZWZhdWx0R3JhcGhpY3NNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVmYXVsdE9wQ29sb3IpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdEdyYXBoaWNzTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZkZWZhdWx0T3BDb2xvcik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NJbXBvcnRHZXREZWZhdWx0U291cmNlUmVjdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKLQlSZWN0IGRlZmF1bHRTb3VyY2VSZWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOworICAgIFJlY3QgZGVmYXVsdFNvdXJjZVJlY3Q7CiAjaWZuZGVmIEdyYXBoaWNzSW1wb3J0R2V0RGVmYXVsdFNvdXJjZVJlY3QKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydEdldERlZmF1bHRTb3VyY2VSZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydEdldERlZmF1bHRTb3VyY2VSZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0ltcG9ydEdldERlZmF1bHRTb3VyY2VSZWN0KGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlZmF1bHRTb3VyY2VSZWN0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmZGVmYXVsdFNvdXJjZVJlY3QpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0ltcG9ydEdldERlZmF1bHRTb3VyY2VSZWN0KGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlZmF1bHRTb3VyY2VSZWN0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmZGVmYXVsdFNvdXJjZVJlY3QpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzSW1wb3J0R2V0Q29sb3JTeW5jUHJvZmlsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKLQlIYW5kbGUgcHJvZmlsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKKyAgICBIYW5kbGUgcHJvZmlsZTsKICNpZm5kZWYgR3JhcGhpY3NJbXBvcnRHZXRDb2xvclN5bmNQcm9maWxlCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRHZXRDb2xvclN5bmNQcm9maWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydEdldENvbG9yU3luY1Byb2ZpbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzSW1wb3J0R2V0Q29sb3JTeW5jUHJvZmlsZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnByb2ZpbGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBwcm9maWxlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXRDb2xvclN5bmNQcm9maWxlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJvZmlsZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHByb2ZpbGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzSW1wb3J0U2V0RGVzdFJlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7Ci0JUmVjdCBkZXN0UmVjdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKKyAgICBSZWN0IGRlc3RSZWN0OwogI2lmbmRlZiBHcmFwaGljc0ltcG9ydFNldERlc3RSZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRTZXREZXN0UmVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRTZXREZXN0UmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZkZXN0UmVjdCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzSW1wb3J0U2V0RGVzdFJlY3QoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVzdFJlY3QpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmRlc3RSZWN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NJbXBvcnRTZXREZXN0UmVjdChjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXN0UmVjdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NJbXBvcnRHZXREZXN0UmVjdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKLQlSZWN0IGRlc3RSZWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOworICAgIFJlY3QgZGVzdFJlY3Q7CiAjaWZuZGVmIEdyYXBoaWNzSW1wb3J0R2V0RGVzdFJlY3QKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydEdldERlc3RSZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydEdldERlc3RSZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0ltcG9ydEdldERlc3RSZWN0KGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc3RSZWN0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmZGVzdFJlY3QpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0ltcG9ydEdldERlc3RSZWN0KGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc3RSZWN0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmZGVzdFJlY3QpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzSW1wb3J0U2V0RmxhZ3MoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7Ci0JbG9uZyBmbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKKyAgICBsb25nIGZsYWdzOwogI2lmbmRlZiBHcmFwaGljc0ltcG9ydFNldEZsYWdzCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRTZXRGbGFncyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRTZXRGbGFncyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NJbXBvcnRTZXRGbGFncyhjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NJbXBvcnRTZXRGbGFncyhjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0ltcG9ydEdldEZsYWdzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOwotCWxvbmcgZmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7CisgICAgbG9uZyBmbGFnczsKICNpZm5kZWYgR3JhcGhpY3NJbXBvcnRHZXRGbGFncwotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0R2V0RmxhZ3MpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0R2V0RmxhZ3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzSW1wb3J0R2V0RmxhZ3MoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXRGbGFncyhjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzSW1wb3J0R2V0QmFzZURhdGFPZmZzZXRBbmRTaXplNjQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7Ci0Jd2lkZSBvZmZzZXQ7Ci0Jd2lkZSBzaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOworICAgIHdpZGUgb2Zmc2V0OworICAgIHdpZGUgc2l6ZTsKICNpZm5kZWYgR3JhcGhpY3NJbXBvcnRHZXRCYXNlRGF0YU9mZnNldEFuZFNpemU2NAotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0R2V0QmFzZURhdGFPZmZzZXRBbmRTaXplNjQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0R2V0QmFzZURhdGFPZmZzZXRBbmRTaXplNjQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzSW1wb3J0R2V0QmFzZURhdGFPZmZzZXRBbmRTaXplNjQoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgb2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgc2l6ZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzSW1wb3J0R2V0QmFzZURhdGFPZmZzZXRBbmRTaXplNjQoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgc2l6ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NJbXBvcnRTZXRJbWFnZUluZGV4VG9UaHVtYm5haWwoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7CiAjaWZuZGVmIEdyYXBoaWNzSW1wb3J0U2V0SW1hZ2VJbmRleFRvVGh1bWJuYWlsCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRTZXRJbWFnZUluZGV4VG9UaHVtYm5haWwpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0U2V0SW1hZ2VJbmRleFRvVGh1bWJuYWlsKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0ltcG9ydFNldEltYWdlSW5kZXhUb1RodW1ibmFpbChjaSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzSW1wb3J0U2V0SW1hZ2VJbmRleFRvVGh1bWJuYWlsKGNpKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydERvRXhwb3J0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwotCXVuc2lnbmVkIGxvbmcgYWN0dWFsU2l6ZVdyaXR0ZW47CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgdW5zaWduZWQgbG9uZyBhY3R1YWxTaXplV3JpdHRlbjsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnREb0V4cG9ydAotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0RG9FeHBvcnQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0RG9FeHBvcnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0RG9FeHBvcnQoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYWN0dWFsU2l6ZVdyaXR0ZW4pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGFjdHVhbFNpemVXcml0dGVuKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnREb0V4cG9ydChjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhY3R1YWxTaXplV3JpdHRlbik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsU2l6ZVdyaXR0ZW4pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzRXhwb3J0Q2FuVHJhbnNjb2RlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwotCUJvb2xlYW4gY2FuVHJhbnNjb2RlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIEJvb2xlYW4gY2FuVHJhbnNjb2RlOwogI2lmbmRlZiBHcmFwaGljc0V4cG9ydENhblRyYW5zY29kZQotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0Q2FuVHJhbnNjb2RlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydENhblRyYW5zY29kZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRDYW5UcmFuc2NvZGUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNhblRyYW5zY29kZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgY2FuVHJhbnNjb2RlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRDYW5UcmFuc2NvZGUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNhblRyYW5zY29kZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgY2FuVHJhbnNjb2RlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydERvVHJhbnNjb2RlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwogI2lmbmRlZiBHcmFwaGljc0V4cG9ydERvVHJhbnNjb2RlCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnREb1RyYW5zY29kZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnREb1RyYW5zY29kZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnREb1RyYW5zY29kZShjaSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0RG9UcmFuc2NvZGUoY2kpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzRXhwb3J0Q2FuVXNlQ29tcHJlc3NvcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQlCb29sZWFuIGNhblVzZUNvbXByZXNzb3I7Ci0Jdm9pZCAqIGNvZGVjU2V0dGluZ3NBdG9tQ29udGFpbmVyUHRyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIEJvb2xlYW4gY2FuVXNlQ29tcHJlc3NvcjsKKyAgICB2b2lkICogY29kZWNTZXR0aW5nc0F0b21Db250YWluZXJQdHI7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0Q2FuVXNlQ29tcHJlc3NvcgotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0Q2FuVXNlQ29tcHJlc3Nvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRDYW5Vc2VDb21wcmVzc29yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmY29kZWNTZXR0aW5nc0F0b21Db250YWluZXJQdHIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0V4cG9ydENhblVzZUNvbXByZXNzb3IoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjYW5Vc2VDb21wcmVzc29yLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY1NldHRpbmdzQXRvbUNvbnRhaW5lclB0cik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgY2FuVXNlQ29tcHJlc3Nvcik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2RlY1NldHRpbmdzQXRvbUNvbnRhaW5lclB0cikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0Q2FuVXNlQ29tcHJlc3NvcihjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNhblVzZUNvbXByZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjU2V0dGluZ3NBdG9tQ29udGFpbmVyUHRyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjYW5Vc2VDb21wcmVzc29yKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydERvVXNlQ29tcHJlc3NvcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQl2b2lkICogY29kZWNTZXR0aW5nc0F0b21Db250YWluZXI7Ci0JSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBvdXREZXNjOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIHZvaWQgKiBjb2RlY1NldHRpbmdzQXRvbUNvbnRhaW5lcjsKKyAgICBJbWFnZURlc2NyaXB0aW9uSGFuZGxlIG91dERlc2M7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0RG9Vc2VDb21wcmVzc29yCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnREb1VzZUNvbXByZXNzb3IpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0RG9Vc2VDb21wcmVzc29yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmY29kZWNTZXR0aW5nc0F0b21Db250YWluZXIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0V4cG9ydERvVXNlQ29tcHJlc3NvcihjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY1NldHRpbmdzQXRvbUNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0RGVzYyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIG91dERlc2MpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY29kZWNTZXR0aW5nc0F0b21Db250YWluZXIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydERvVXNlQ29tcHJlc3NvcihjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY1NldHRpbmdzQXRvbUNvbnRhaW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0RGVzYyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIG91dERlc2MpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzRXhwb3J0RG9TdGFuZGFsb25lRXhwb3J0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwogI2lmbmRlZiBHcmFwaGljc0V4cG9ydERvU3RhbmRhbG9uZUV4cG9ydAotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0RG9TdGFuZGFsb25lRXhwb3J0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydERvU3RhbmRhbG9uZUV4cG9ydCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnREb1N0YW5kYWxvbmVFeHBvcnQoY2kpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydERvU3RhbmRhbG9uZUV4cG9ydChjaSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRHZXREZWZhdWx0RmlsZVR5cGVBbmRDcmVhdG9yKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwotCU9TVHlwZSBmaWxlVHlwZTsKLQlPU1R5cGUgZmlsZUNyZWF0b3I7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgT1NUeXBlIGZpbGVUeXBlOworICAgIE9TVHlwZSBmaWxlQ3JlYXRvcjsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRHZXREZWZhdWx0RmlsZVR5cGVBbmRDcmVhdG9yCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRHZXREZWZhdWx0RmlsZVR5cGVBbmRDcmVhdG9yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldERlZmF1bHRGaWxlVHlwZUFuZENyZWF0b3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0RGVmYXVsdEZpbGVUeXBlQW5kQ3JlYXRvcihjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpbGVUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlsZUNyZWF0b3IpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBmaWxlVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgZmlsZUNyZWF0b3IpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydEdldERlZmF1bHRGaWxlVHlwZUFuZENyZWF0b3IoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWxlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpbGVDcmVhdG9yKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgZmlsZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIGZpbGVDcmVhdG9yKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydEdldERlZmF1bHRGaWxlTmFtZUV4dGVuc2lvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQlPU1R5cGUgZmlsZU5hbWVFeHRlbnNpb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgT1NUeXBlIGZpbGVOYW1lRXh0ZW5zaW9uOwogI2lmbmRlZiBHcmFwaGljc0V4cG9ydEdldERlZmF1bHRGaWxlTmFtZUV4dGVuc2lvbgotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0R2V0RGVmYXVsdEZpbGVOYW1lRXh0ZW5zaW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldERlZmF1bHRGaWxlTmFtZUV4dGVuc2lvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRHZXREZWZhdWx0RmlsZU5hbWVFeHRlbnNpb24oY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpbGVOYW1lRXh0ZW5zaW9uKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIGZpbGVOYW1lRXh0ZW5zaW9uKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRHZXREZWZhdWx0RmlsZU5hbWVFeHRlbnNpb24oY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpbGVOYW1lRXh0ZW5zaW9uKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIGZpbGVOYW1lRXh0ZW5zaW9uKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydEdldE1JTUVUeXBlTGlzdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQl2b2lkICogcXRBdG9tQ29udGFpbmVyUHRyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIHZvaWQgKiBxdEF0b21Db250YWluZXJQdHI7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0R2V0TUlNRVR5cGVMaXN0Ci0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRHZXRNSU1FVHlwZUxpc3QpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0R2V0TUlNRVR5cGVMaXN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmcXRBdG9tQ29udGFpbmVyUHRyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRHZXRNSU1FVHlwZUxpc3QoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXRBdG9tQ29udGFpbmVyUHRyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnF0QXRvbUNvbnRhaW5lclB0cikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0TUlNRVR5cGVMaXN0KGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF0QXRvbUNvbnRhaW5lclB0cik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRTZXRTZXR0aW5nc0Zyb21BdG9tQ29udGFpbmVyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwotCXZvaWQgKiBxdEF0b21Db250YWluZXI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgdm9pZCAqIHF0QXRvbUNvbnRhaW5lcjsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRTZXRTZXR0aW5nc0Zyb21BdG9tQ29udGFpbmVyCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRTZXRTZXR0aW5nc0Zyb21BdG9tQ29udGFpbmVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydFNldFNldHRpbmdzRnJvbUF0b21Db250YWluZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZxdEF0b21Db250YWluZXIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0V4cG9ydFNldFNldHRpbmdzRnJvbUF0b21Db250YWluZXIoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF0QXRvbUNvbnRhaW5lcik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZxdEF0b21Db250YWluZXIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydFNldFNldHRpbmdzRnJvbUF0b21Db250YWluZXIoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF0QXRvbUNvbnRhaW5lcik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRHZXRTZXR0aW5nc0FzQXRvbUNvbnRhaW5lcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQl2b2lkICogcXRBdG9tQ29udGFpbmVyUHRyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIHZvaWQgKiBxdEF0b21Db250YWluZXJQdHI7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0R2V0U2V0dGluZ3NBc0F0b21Db250YWluZXIKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldFNldHRpbmdzQXNBdG9tQ29udGFpbmVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldFNldHRpbmdzQXNBdG9tQ29udGFpbmVyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmcXRBdG9tQ29udGFpbmVyUHRyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRHZXRTZXR0aW5nc0FzQXRvbUNvbnRhaW5lcihjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF0QXRvbUNvbnRhaW5lclB0cik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZxdEF0b21Db250YWluZXJQdHIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydEdldFNldHRpbmdzQXNBdG9tQ29udGFpbmVyKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXRBdG9tQ29udGFpbmVyUHRyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydEdldFNldHRpbmdzQXNUZXh0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwotCUhhbmRsZSB0aGVUZXh0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIEhhbmRsZSB0aGVUZXh0OwogI2lmbmRlZiBHcmFwaGljc0V4cG9ydEdldFNldHRpbmdzQXNUZXh0Ci0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRHZXRTZXR0aW5nc0FzVGV4dCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRHZXRTZXR0aW5nc0FzVGV4dCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRHZXRTZXR0aW5nc0FzVGV4dChjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVUZXh0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgdGhlVGV4dCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0U2V0dGluZ3NBc1RleHQoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlVGV4dCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHRoZVRleHQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzRXhwb3J0U2V0RG9udFJlY29tcHJlc3MoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7Ci0JQm9vbGVhbiBkb250UmVjb21wcmVzczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKKyAgICBCb29sZWFuIGRvbnRSZWNvbXByZXNzOwogI2lmbmRlZiBHcmFwaGljc0V4cG9ydFNldERvbnRSZWNvbXByZXNzCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRTZXREb250UmVjb21wcmVzcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRTZXREb250UmVjb21wcmVzcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmIiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRvbnRSZWNvbXByZXNzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRTZXREb250UmVjb21wcmVzcyhjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbnRSZWNvbXByZXNzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRvbnRSZWNvbXByZXNzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRTZXREb250UmVjb21wcmVzcyhjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbnRSZWNvbXByZXNzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydEdldERvbnRSZWNvbXByZXNzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwotCUJvb2xlYW4gZG9udFJlY29tcHJlc3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgQm9vbGVhbiBkb250UmVjb21wcmVzczsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRHZXREb250UmVjb21wcmVzcwotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0R2V0RG9udFJlY29tcHJlc3MpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0R2V0RG9udFJlY29tcHJlc3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0RG9udFJlY29tcHJlc3MoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZG9udFJlY29tcHJlc3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGRvbnRSZWNvbXByZXNzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRHZXREb250UmVjb21wcmVzcyhjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkb250UmVjb21wcmVzcyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgZG9udFJlY29tcHJlc3MpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzRXhwb3J0U2V0SW50ZXJsYWNlU3R5bGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7Ci0JdW5zaWduZWQgbG9uZyBpbnRlcmxhY2VTdHlsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKKyAgICB1bnNpZ25lZCBsb25nIGludGVybGFjZVN0eWxlOwogI2lmbmRlZiBHcmFwaGljc0V4cG9ydFNldEludGVybGFjZVN0eWxlCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRTZXRJbnRlcmxhY2VTdHlsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRTZXRJbnRlcmxhY2VTdHlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmludGVybGFjZVN0eWxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRTZXRJbnRlcmxhY2VTdHlsZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybGFjZVN0eWxlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmludGVybGFjZVN0eWxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRTZXRJbnRlcmxhY2VTdHlsZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybGFjZVN0eWxlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydEdldEludGVybGFjZVN0eWxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwotCXVuc2lnbmVkIGxvbmcgaW50ZXJsYWNlU3R5bGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgdW5zaWduZWQgbG9uZyBpbnRlcmxhY2VTdHlsZTsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRHZXRJbnRlcmxhY2VTdHlsZQotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0R2V0SW50ZXJsYWNlU3R5bGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0R2V0SW50ZXJsYWNlU3R5bGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0SW50ZXJsYWNlU3R5bGUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW50ZXJsYWNlU3R5bGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGludGVybGFjZVN0eWxlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRHZXRJbnRlcmxhY2VTdHlsZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnRlcmxhY2VTdHlsZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJsYWNlU3R5bGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzRXhwb3J0U2V0TWV0YURhdGEoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7Ci0Jdm9pZCAqIHVzZXJEYXRhOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIHZvaWQgKiB1c2VyRGF0YTsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRTZXRNZXRhRGF0YQotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0U2V0TWV0YURhdGEpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0U2V0TWV0YURhdGEpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZ1c2VyRGF0YSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0U2V0TWV0YURhdGEoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyRGF0YSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ1c2VyRGF0YSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0U2V0TWV0YURhdGEoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyRGF0YSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRHZXRNZXRhRGF0YShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQl2b2lkICogdXNlckRhdGE7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgdm9pZCAqIHVzZXJEYXRhOwogI2lmbmRlZiBHcmFwaGljc0V4cG9ydEdldE1ldGFEYXRhCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRHZXRNZXRhRGF0YSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRHZXRNZXRhRGF0YSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnMiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnVzZXJEYXRhKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRHZXRNZXRhRGF0YShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJEYXRhKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnVzZXJEYXRhKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRHZXRNZXRhRGF0YShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJEYXRhKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydFNldFRhcmdldERhdGFTaXplKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwotCXVuc2lnbmVkIGxvbmcgdGFyZ2V0RGF0YVNpemU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgdW5zaWduZWQgbG9uZyB0YXJnZXREYXRhU2l6ZTsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRTZXRUYXJnZXREYXRhU2l6ZQotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0U2V0VGFyZ2V0RGF0YVNpemUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0U2V0VGFyZ2V0RGF0YVNpemUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZ0YXJnZXREYXRhU2l6ZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0U2V0VGFyZ2V0RGF0YVNpemUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXREYXRhU2l6ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0YXJnZXREYXRhU2l6ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0U2V0VGFyZ2V0RGF0YVNpemUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXREYXRhU2l6ZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRHZXRUYXJnZXREYXRhU2l6ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQl1bnNpZ25lZCBsb25nIHRhcmdldERhdGFTaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIHVuc2lnbmVkIGxvbmcgdGFyZ2V0RGF0YVNpemU7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0R2V0VGFyZ2V0RGF0YVNpemUKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldFRhcmdldERhdGFTaXplKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldFRhcmdldERhdGFTaXplKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0V4cG9ydEdldFRhcmdldERhdGFTaXplKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRhcmdldERhdGFTaXplKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICB0YXJnZXREYXRhU2l6ZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0VGFyZ2V0RGF0YVNpemUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGFyZ2V0RGF0YVNpemUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldERhdGFTaXplKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydFNldENvbXByZXNzaW9uTWV0aG9kKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwotCWxvbmcgY29tcHJlc3Npb25NZXRob2Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgbG9uZyBjb21wcmVzc2lvbk1ldGhvZDsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRTZXRDb21wcmVzc2lvbk1ldGhvZAotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0U2V0Q29tcHJlc3Npb25NZXRob2QpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0U2V0Q29tcHJlc3Npb25NZXRob2QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZjb21wcmVzc2lvbk1ldGhvZCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0U2V0Q29tcHJlc3Npb25NZXRob2QoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc2lvbk1ldGhvZCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjb21wcmVzc2lvbk1ldGhvZCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0U2V0Q29tcHJlc3Npb25NZXRob2QoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc2lvbk1ldGhvZCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRHZXRDb21wcmVzc2lvbk1ldGhvZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQlsb25nIGNvbXByZXNzaW9uTWV0aG9kOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIGxvbmcgY29tcHJlc3Npb25NZXRob2Q7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0R2V0Q29tcHJlc3Npb25NZXRob2QKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldENvbXByZXNzaW9uTWV0aG9kKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldENvbXByZXNzaW9uTWV0aG9kKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0V4cG9ydEdldENvbXByZXNzaW9uTWV0aG9kKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbXByZXNzaW9uTWV0aG9kKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc2lvbk1ldGhvZCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0Q29tcHJlc3Npb25NZXRob2QoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29tcHJlc3Npb25NZXRob2QpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzaW9uTWV0aG9kKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydFNldENvbXByZXNzaW9uUXVhbGl0eShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQlDb2RlY1Egc3BhdGlhbFF1YWxpdHk7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgQ29kZWNRIHNwYXRpYWxRdWFsaXR5OwogI2lmbmRlZiBHcmFwaGljc0V4cG9ydFNldENvbXByZXNzaW9uUXVhbGl0eQotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0U2V0Q29tcHJlc3Npb25RdWFsaXR5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydFNldENvbXByZXNzaW9uUXVhbGl0eSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNwYXRpYWxRdWFsaXR5KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRTZXRDb21wcmVzc2lvblF1YWxpdHkoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhdGlhbFF1YWxpdHkpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3BhdGlhbFF1YWxpdHkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydFNldENvbXByZXNzaW9uUXVhbGl0eShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGF0aWFsUXVhbGl0eSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRHZXRDb21wcmVzc2lvblF1YWxpdHkoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7Ci0JQ29kZWNRIHNwYXRpYWxRdWFsaXR5OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIENvZGVjUSBzcGF0aWFsUXVhbGl0eTsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRHZXRDb21wcmVzc2lvblF1YWxpdHkKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldENvbXByZXNzaW9uUXVhbGl0eSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRHZXRDb21wcmVzc2lvblF1YWxpdHkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0Q29tcHJlc3Npb25RdWFsaXR5KGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzcGF0aWFsUXVhbGl0eSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgc3BhdGlhbFF1YWxpdHkpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydEdldENvbXByZXNzaW9uUXVhbGl0eShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3BhdGlhbFF1YWxpdHkpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHNwYXRpYWxRdWFsaXR5KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydFNldFJlc29sdXRpb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7Ci0JRml4ZWQgaG9yaXpvbnRhbFJlc29sdXRpb247Ci0JRml4ZWQgdmVydGljYWxSZXNvbHV0aW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIEZpeGVkIGhvcml6b250YWxSZXNvbHV0aW9uOworICAgIEZpeGVkIHZlcnRpY2FsUmVzb2x1dGlvbjsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRTZXRSZXNvbHV0aW9uCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRTZXRSZXNvbHV0aW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydFNldFJlc29sdXRpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmaG9yaXpvbnRhbFJlc29sdXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmdmVydGljYWxSZXNvbHV0aW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRTZXRSZXNvbHV0aW9uKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3Jpem9udGFsUmVzb2x1dGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydGljYWxSZXNvbHV0aW9uKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZob3Jpem9udGFsUmVzb2x1dGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZ2ZXJ0aWNhbFJlc29sdXRpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydFNldFJlc29sdXRpb24oY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvcml6b250YWxSZXNvbHV0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNhbFJlc29sdXRpb24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzRXhwb3J0R2V0UmVzb2x1dGlvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQlGaXhlZCBob3Jpem9udGFsUmVzb2x1dGlvbjsKLQlGaXhlZCB2ZXJ0aWNhbFJlc29sdXRpb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgRml4ZWQgaG9yaXpvbnRhbFJlc29sdXRpb247CisgICAgRml4ZWQgdmVydGljYWxSZXNvbHV0aW9uOwogI2lmbmRlZiBHcmFwaGljc0V4cG9ydEdldFJlc29sdXRpb24KLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldFJlc29sdXRpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0R2V0UmVzb2x1dGlvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRHZXRSZXNvbHV0aW9uKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaG9yaXpvbnRhbFJlc29sdXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2ZXJ0aWNhbFJlc29sdXRpb24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRml4ZWQsIGhvcml6b250YWxSZXNvbHV0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRml4ZWQsIHZlcnRpY2FsUmVzb2x1dGlvbik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0UmVzb2x1dGlvbihjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhvcml6b250YWxSZXNvbHV0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmVydGljYWxSZXNvbHV0aW9uKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBob3Jpem9udGFsUmVzb2x1dGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCB2ZXJ0aWNhbFJlc29sdXRpb24pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzRXhwb3J0U2V0RGVwdGgoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7Ci0JbG9uZyBkZXB0aDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKKyAgICBsb25nIGRlcHRoOwogI2lmbmRlZiBHcmFwaGljc0V4cG9ydFNldERlcHRoCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRTZXREZXB0aCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRTZXREZXB0aCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRlcHRoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRTZXREZXB0aChjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlcHRoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRTZXREZXB0aChjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydEdldERlcHRoKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwotCWxvbmcgZGVwdGg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgbG9uZyBkZXB0aDsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRHZXREZXB0aAotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0R2V0RGVwdGgpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0R2V0RGVwdGgpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0RGVwdGgoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVwdGgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGRlcHRoKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRHZXREZXB0aChjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXB0aCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGgpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzRXhwb3J0U2V0Q29sb3JTeW5jUHJvZmlsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQlIYW5kbGUgY29sb3JTeW5jUHJvZmlsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKKyAgICBIYW5kbGUgY29sb3JTeW5jUHJvZmlsZTsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRTZXRDb2xvclN5bmNQcm9maWxlCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRTZXRDb2xvclN5bmNQcm9maWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydFNldENvbG9yU3luY1Byb2ZpbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmNvbG9yU3luY1Byb2ZpbGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0V4cG9ydFNldENvbG9yU3luY1Byb2ZpbGUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yU3luY1Byb2ZpbGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZjb2xvclN5bmNQcm9maWxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRTZXRDb2xvclN5bmNQcm9maWxlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvclN5bmNQcm9maWxlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydEdldENvbG9yU3luY1Byb2ZpbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7Ci0JSGFuZGxlIGNvbG9yU3luY1Byb2ZpbGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgSGFuZGxlIGNvbG9yU3luY1Byb2ZpbGU7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0R2V0Q29sb3JTeW5jUHJvZmlsZQotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0R2V0Q29sb3JTeW5jUHJvZmlsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRHZXRDb2xvclN5bmNQcm9maWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0V4cG9ydEdldENvbG9yU3luY1Byb2ZpbGUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2xvclN5bmNQcm9maWxlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgY29sb3JTeW5jUHJvZmlsZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0Q29sb3JTeW5jUHJvZmlsZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbG9yU3luY1Byb2ZpbGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBjb2xvclN5bmNQcm9maWxlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydFNldElucHV0RGF0YVJlZmVyZW5jZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQlIYW5kbGUgZGF0YVJlZjsKLQlPU1R5cGUgZGF0YVJlZlR5cGU7Ci0JSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIEhhbmRsZSBkYXRhUmVmOworICAgIE9TVHlwZSBkYXRhUmVmVHlwZTsKKyAgICBJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2M7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0U2V0SW5wdXREYXRhUmVmZXJlbmNlCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRTZXRJbnB1dERhdGFSZWZlcmVuY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0U2V0SW5wdXREYXRhUmVmZXJlbmNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGF0YVJlZlR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGVzYykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0U2V0SW5wdXREYXRhUmVmZXJlbmNlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZlR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkYXRhUmVmVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkZXNjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRTZXRJbnB1dERhdGFSZWZlcmVuY2UoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydEdldElucHV0RGF0YVJlZmVyZW5jZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQlIYW5kbGUgZGF0YVJlZjsKLQlPU1R5cGUgZGF0YVJlZlR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgSGFuZGxlIGRhdGFSZWY7CisgICAgT1NUeXBlIGRhdGFSZWZUeXBlOwogI2lmbmRlZiBHcmFwaGljc0V4cG9ydEdldElucHV0RGF0YVJlZmVyZW5jZQotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0R2V0SW5wdXREYXRhUmVmZXJlbmNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldElucHV0RGF0YVJlZmVyZW5jZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRHZXRJbnB1dERhdGFSZWZlcmVuY2UoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFSZWZUeXBlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBkYXRhUmVmVHlwZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0SW5wdXREYXRhUmVmZXJlbmNlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUmVmVHlwZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgZGF0YVJlZlR5cGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzRXhwb3J0U2V0SW5wdXRGaWxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwotCUZTU3BlYyB0aGVGaWxlOwotCUltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKKyAgICBGU1NwZWMgdGhlRmlsZTsKKyAgICBJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2M7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0U2V0SW5wdXRGaWxlCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRTZXRJbnB1dEZpbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0U2V0SW5wdXRGaWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZ0aGVGaWxlLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRlc2MpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0V4cG9ydFNldElucHV0RmlsZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlRmlsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmdGhlRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkZXNjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRTZXRJbnB1dEZpbGUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEZpbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7Ci0JRlNTcGVjIHRoZUZpbGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgRlNTcGVjIHRoZUZpbGU7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0R2V0SW5wdXRGaWxlCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEZpbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0R2V0SW5wdXRGaWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmdGhlRmlsZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0SW5wdXRGaWxlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVGaWxlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJnRoZUZpbGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydEdldElucHV0RmlsZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlRmlsZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRTZXRJbnB1dEhhbmRsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQlIYW5kbGUgaDsKLQlJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgSGFuZGxlIGg7CisgICAgSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjOwogI2lmbmRlZiBHcmFwaGljc0V4cG9ydFNldElucHV0SGFuZGxlCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRTZXRJbnB1dEhhbmRsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRTZXRJbnB1dEhhbmRsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZoLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRlc2MpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0V4cG9ydFNldElucHV0SGFuZGxlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGVzYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0U2V0SW5wdXRIYW5kbGUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEhhbmRsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQlIYW5kbGUgaDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKKyAgICBIYW5kbGUgaDsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEhhbmRsZQotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0R2V0SW5wdXRIYW5kbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0R2V0SW5wdXRIYW5kbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0SW5wdXRIYW5kbGUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGgpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydEdldElucHV0SGFuZGxlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBoKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydFNldElucHV0UHRyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwotCVB0ciBwOwotCXVuc2lnbmVkIGxvbmcgc2l6ZTsKLQlJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgUHRyIHA7CisgICAgdW5zaWduZWQgbG9uZyBzaXplOworICAgIEltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYzsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRTZXRJbnB1dFB0cgotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0U2V0SW5wdXRQdHIpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0U2V0SW5wdXRQdHIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzbE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZwLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkZXNjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRTZXRJbnB1dFB0cihjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzbE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkZXNjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRTZXRJbnB1dFB0cihjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRTZXRJbnB1dEdyYXBoaWNzSW1wb3J0ZXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7Ci0JR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgZ3JpcDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKKyAgICBHcmFwaGljc0ltcG9ydENvbXBvbmVudCBncmlwOwogI2lmbmRlZiBHcmFwaGljc0V4cG9ydFNldElucHV0R3JhcGhpY3NJbXBvcnRlcgotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0U2V0SW5wdXRHcmFwaGljc0ltcG9ydGVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydFNldElucHV0R3JhcGhpY3NJbXBvcnRlcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmdyaXApKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0V4cG9ydFNldElucHV0R3JhcGhpY3NJbXBvcnRlcihjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmlwKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmdyaXApKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydFNldElucHV0R3JhcGhpY3NJbXBvcnRlcihjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmlwKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydEdldElucHV0R3JhcGhpY3NJbXBvcnRlcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQlHcmFwaGljc0ltcG9ydENvbXBvbmVudCBncmlwOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGdyaXA7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0R2V0SW5wdXRHcmFwaGljc0ltcG9ydGVyCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEdyYXBoaWNzSW1wb3J0ZXIpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0R2V0SW5wdXRHcmFwaGljc0ltcG9ydGVyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0V4cG9ydEdldElucHV0R3JhcGhpY3NJbXBvcnRlcihjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ3JpcCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfTmV3LCBncmlwKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEdyYXBoaWNzSW1wb3J0ZXIoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdyaXApOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX05ldywgZ3JpcCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRTZXRJbnB1dFBpY3R1cmUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7Ci0JUGljSGFuZGxlIHBpY3R1cmU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgUGljSGFuZGxlIHBpY3R1cmU7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0U2V0SW5wdXRQaWN0dXJlCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRTZXRJbnB1dFBpY3R1cmUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0U2V0SW5wdXRQaWN0dXJlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwaWN0dXJlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRTZXRJbnB1dFBpY3R1cmUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGljdHVyZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBpY3R1cmUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydFNldElucHV0UGljdHVyZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWN0dXJlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydEdldElucHV0UGljdHVyZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQlQaWNIYW5kbGUgcGljdHVyZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKKyAgICBQaWNIYW5kbGUgcGljdHVyZTsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRHZXRJbnB1dFBpY3R1cmUKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldElucHV0UGljdHVyZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRHZXRJbnB1dFBpY3R1cmUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0SW5wdXRQaWN0dXJlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwaWN0dXJlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgcGljdHVyZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0SW5wdXRQaWN0dXJlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwaWN0dXJlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgcGljdHVyZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRTZXRJbnB1dEdXb3JsZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQlHV29ybGRQdHIgZ3dvcmxkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIEdXb3JsZFB0ciBnd29ybGQ7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0U2V0SW5wdXRHV29ybGQKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydFNldElucHV0R1dvcmxkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydFNldElucHV0R1dvcmxkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgR1dvcmxkT2JqX0NvbnZlcnQsICZnd29ybGQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0V4cG9ydFNldElucHV0R1dvcmxkKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3dvcmxkKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdXb3JsZE9ial9Db252ZXJ0LCAmZ3dvcmxkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRTZXRJbnB1dEdXb3JsZChjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd3b3JsZCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEdXb3JsZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQlHV29ybGRQdHIgZ3dvcmxkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIEdXb3JsZFB0ciBnd29ybGQ7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0R2V0SW5wdXRHV29ybGQKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldElucHV0R1dvcmxkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldElucHV0R1dvcmxkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0V4cG9ydEdldElucHV0R1dvcmxkKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmd3b3JsZCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIEdXb3JsZE9ial9OZXcsIGd3b3JsZCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0SW5wdXRHV29ybGQoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ3dvcmxkKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgR1dvcmxkT2JqX05ldywgZ3dvcmxkKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydFNldElucHV0UGl4bWFwKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwotCVBpeE1hcEhhbmRsZSBwaXhtYXA7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgUGl4TWFwSGFuZGxlIHBpeG1hcDsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRTZXRJbnB1dFBpeG1hcAotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0U2V0SW5wdXRQaXhtYXApOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0U2V0SW5wdXRQaXhtYXApOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBpeG1hcCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0U2V0SW5wdXRQaXhtYXAoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhtYXApOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwaXhtYXApKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydFNldElucHV0UGl4bWFwKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4bWFwKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydEdldElucHV0UGl4bWFwKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwotCVBpeE1hcEhhbmRsZSBwaXhtYXA7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgUGl4TWFwSGFuZGxlIHBpeG1hcDsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRHZXRJbnB1dFBpeG1hcAotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0R2V0SW5wdXRQaXhtYXApOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0R2V0SW5wdXRQaXhtYXApOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0SW5wdXRQaXhtYXAoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGl4bWFwKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgcGl4bWFwKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRHZXRJbnB1dFBpeG1hcChjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwaXhtYXApOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBwaXhtYXApOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzRXhwb3J0U2V0SW5wdXRPZmZzZXRBbmRMaW1pdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQl1bnNpZ25lZCBsb25nIG9mZnNldDsKLQl1bnNpZ25lZCBsb25nIGxpbWl0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0OworICAgIHVuc2lnbmVkIGxvbmcgbGltaXQ7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0U2V0SW5wdXRPZmZzZXRBbmRMaW1pdAotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0U2V0SW5wdXRPZmZzZXRBbmRMaW1pdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRTZXRJbnB1dE9mZnNldEFuZExpbWl0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmxpbWl0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRTZXRJbnB1dE9mZnNldEFuZExpbWl0KGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZsaW1pdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0U2V0SW5wdXRPZmZzZXRBbmRMaW1pdChjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRHZXRJbnB1dE9mZnNldEFuZExpbWl0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwotCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OwotCXVuc2lnbmVkIGxvbmcgbGltaXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisgICAgdW5zaWduZWQgbG9uZyBsaW1pdDsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRHZXRJbnB1dE9mZnNldEFuZExpbWl0Ci0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRHZXRJbnB1dE9mZnNldEFuZExpbWl0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldElucHV0T2Zmc2V0QW5kTGltaXQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0SW5wdXRPZmZzZXRBbmRMaW1pdChjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxpbWl0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgIGxpbWl0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRHZXRJbnB1dE9mZnNldEFuZExpbWl0KGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGltaXQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzRXhwb3J0TWF5RXhwb3J0ZXJSZWFkSW5wdXREYXRhKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwotCUJvb2xlYW4gbWF5UmVhZElucHV0RGF0YTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKKyAgICBCb29sZWFuIG1heVJlYWRJbnB1dERhdGE7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0TWF5RXhwb3J0ZXJSZWFkSW5wdXREYXRhCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRNYXlFeHBvcnRlclJlYWRJbnB1dERhdGEpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0TWF5RXhwb3J0ZXJSZWFkSW5wdXREYXRhKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0V4cG9ydE1heUV4cG9ydGVyUmVhZElucHV0RGF0YShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWF5UmVhZElucHV0RGF0YSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgbWF5UmVhZElucHV0RGF0YSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0TWF5RXhwb3J0ZXJSZWFkSW5wdXREYXRhKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXlSZWFkSW5wdXREYXRhKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtYXlSZWFkSW5wdXREYXRhKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydEdldElucHV0RGF0YVNpemUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7Ci0JdW5zaWduZWQgbG9uZyBzaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIHVuc2lnbmVkIGxvbmcgc2l6ZTsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRHZXRJbnB1dERhdGFTaXplCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRHZXRJbnB1dERhdGFTaXplKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldElucHV0RGF0YVNpemUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0SW5wdXREYXRhU2l6ZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHNpemUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydEdldElucHV0RGF0YVNpemUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydFJlYWRJbnB1dERhdGEoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7Ci0Jdm9pZCAqIGRhdGFQdHI7Ci0JdW5zaWduZWQgbG9uZyBkYXRhT2Zmc2V0OwotCXVuc2lnbmVkIGxvbmcgZGF0YVNpemU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgdm9pZCAqIGRhdGFQdHI7CisgICAgdW5zaWduZWQgbG9uZyBkYXRhT2Zmc2V0OworICAgIHVuc2lnbmVkIGxvbmcgZGF0YVNpemU7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0UmVhZElucHV0RGF0YQotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0UmVhZElucHV0RGF0YSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRSZWFkSW5wdXREYXRhKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mc2xsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZkYXRhUHRyLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGF0YU9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRhdGFTaXplKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRSZWFkSW5wdXREYXRhKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUHRyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhT2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhU2l6ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVNpemUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydFJlYWRJbnB1dERhdGEoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTaXplKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydEdldElucHV0SW1hZ2VEZXNjcmlwdGlvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQlJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjOwogI2lmbmRlZiBHcmFwaGljc0V4cG9ydEdldElucHV0SW1hZ2VEZXNjcmlwdGlvbgotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0R2V0SW5wdXRJbWFnZURlc2NyaXB0aW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldElucHV0SW1hZ2VEZXNjcmlwdGlvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEltYWdlRGVzY3JpcHRpb24oY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc2MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBkZXNjKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEltYWdlRGVzY3JpcHRpb24oY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc2MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBkZXNjKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydEdldElucHV0SW1hZ2VEaW1lbnNpb25zKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwotCVJlY3QgZGltZW5zaW9uczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKKyAgICBSZWN0IGRpbWVuc2lvbnM7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0R2V0SW5wdXRJbWFnZURpbWVuc2lvbnMKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldElucHV0SW1hZ2VEaW1lbnNpb25zKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldElucHV0SW1hZ2VEaW1lbnNpb25zKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0V4cG9ydEdldElucHV0SW1hZ2VEaW1lbnNpb25zKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRpbWVuc2lvbnMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZkaW1lbnNpb25zKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEltYWdlRGltZW5zaW9ucyhjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkaW1lbnNpb25zKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmZGltZW5zaW9ucyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEltYWdlRGVwdGgoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7Ci0JbG9uZyBpbnB1dERlcHRoOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIGxvbmcgaW5wdXREZXB0aDsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEltYWdlRGVwdGgKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldElucHV0SW1hZ2VEZXB0aCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEltYWdlRGVwdGgpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0SW5wdXRJbWFnZURlcHRoKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnB1dERlcHRoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBpbnB1dERlcHRoKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEltYWdlRGVwdGgoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlucHV0RGVwdGgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0RGVwdGgpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzRXhwb3J0RHJhd0lucHV0SW1hZ2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7Ci0JQ0dyYWZQdHIgZ3c7Ci0JR0RIYW5kbGUgZ2Q7Ci0JUmVjdCBzcmNSZWN0OwotCVJlY3QgZHN0UmVjdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKKyAgICBDR3JhZlB0ciBndzsKKyAgICBHREhhbmRsZSBnZDsKKyAgICBSZWN0IHNyY1JlY3Q7CisgICAgUmVjdCBkc3RSZWN0OwogI2lmbmRlZiBHcmFwaGljc0V4cG9ydERyYXdJbnB1dEltYWdlCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnREcmF3SW5wdXRJbWFnZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnREcmF3SW5wdXRJbWFnZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfQ29udmVydCwgJmd3LAotCSAgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfQ29udmVydCwgJmdkLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmc3JjUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmRzdFJlY3QpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0V4cG9ydERyYXdJbnB1dEltYWdlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3csCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzcmNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRzdFJlY3QpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhZk9ial9Db252ZXJ0LCAmZ3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdFJlc09ial9Db252ZXJ0LCAmZ2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZzcmNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmZHN0UmVjdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0RHJhd0lucHV0SW1hZ2UoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNyY1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHN0UmVjdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRTZXRPdXRwdXREYXRhUmVmZXJlbmNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwotCUhhbmRsZSBkYXRhUmVmOwotCU9TVHlwZSBkYXRhUmVmVHlwZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKKyAgICBIYW5kbGUgZGF0YVJlZjsKKyAgICBPU1R5cGUgZGF0YVJlZlR5cGU7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0U2V0T3V0cHV0RGF0YVJlZmVyZW5jZQotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0U2V0T3V0cHV0RGF0YVJlZmVyZW5jZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRTZXRPdXRwdXREYXRhUmVmZXJlbmNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRhdGFSZWZUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRTZXRPdXRwdXREYXRhUmVmZXJlbmNlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmVHlwZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGF0YVJlZlR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydFNldE91dHB1dERhdGFSZWZlcmVuY2UoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWZUeXBlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydEdldE91dHB1dERhdGFSZWZlcmVuY2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7Ci0JSGFuZGxlIGRhdGFSZWY7Ci0JT1NUeXBlIGRhdGFSZWZUeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIEhhbmRsZSBkYXRhUmVmOworICAgIE9TVHlwZSBkYXRhUmVmVHlwZTsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXREYXRhUmVmZXJlbmNlCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXREYXRhUmVmZXJlbmNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldE91dHB1dERhdGFSZWZlcmVuY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0T3V0cHV0RGF0YVJlZmVyZW5jZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUmVmVHlwZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgZGF0YVJlZlR5cGUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydEdldE91dHB1dERhdGFSZWZlcmVuY2UoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVJlZlR5cGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIGRhdGFSZWZUeXBlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydFNldE91dHB1dEZpbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7Ci0JRlNTcGVjIHRoZUZpbGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgRlNTcGVjIHRoZUZpbGU7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0U2V0T3V0cHV0RmlsZQotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0U2V0T3V0cHV0RmlsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRTZXRPdXRwdXRGaWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmdGhlRmlsZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0U2V0T3V0cHV0RmlsZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUZpbGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmdGhlRmlsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0U2V0T3V0cHV0RmlsZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUZpbGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzRXhwb3J0R2V0T3V0cHV0RmlsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQlGU1NwZWMgdGhlRmlsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKKyAgICBGU1NwZWMgdGhlRmlsZTsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXRGaWxlCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXRGaWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldE91dHB1dEZpbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZ0aGVGaWxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXRGaWxlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlRmlsZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZ0aGVGaWxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXRGaWxlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlRmlsZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRTZXRPdXRwdXRIYW5kbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7Ci0JSGFuZGxlIGg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgSGFuZGxlIGg7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0U2V0T3V0cHV0SGFuZGxlCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRTZXRPdXRwdXRIYW5kbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0U2V0T3V0cHV0SGFuZGxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRTZXRPdXRwdXRIYW5kbGUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydFNldE91dHB1dEhhbmRsZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydEdldE91dHB1dEhhbmRsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQlIYW5kbGUgaDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKKyAgICBIYW5kbGUgaDsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXRIYW5kbGUKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldE91dHB1dEhhbmRsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXRIYW5kbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0T3V0cHV0SGFuZGxlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgaCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0T3V0cHV0SGFuZGxlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgaCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRTZXRPdXRwdXRPZmZzZXRBbmRNYXhTaXplKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwotCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OwotCXVuc2lnbmVkIGxvbmcgbWF4U2l6ZTsKLQlCb29sZWFuIHRydW5jYXRlRmlsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKKyAgICB1bnNpZ25lZCBsb25nIG9mZnNldDsKKyAgICB1bnNpZ25lZCBsb25nIG1heFNpemU7CisgICAgQm9vbGVhbiB0cnVuY2F0ZUZpbGU7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0U2V0T3V0cHV0T2Zmc2V0QW5kTWF4U2l6ZQotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0U2V0T3V0cHV0T2Zmc2V0QW5kTWF4U2l6ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRTZXRPdXRwdXRPZmZzZXRBbmRNYXhTaXplKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGxiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZvZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICZtYXhTaXplLAotCSAgICAgICAgICAgICAgICAgICAgICAmdHJ1bmNhdGVGaWxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRTZXRPdXRwdXRPZmZzZXRBbmRNYXhTaXplKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFNpemUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydW5jYXRlRmlsZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1heFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cnVuY2F0ZUZpbGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydFNldE91dHB1dE9mZnNldEFuZE1heFNpemUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1bmNhdGVGaWxlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydEdldE91dHB1dE9mZnNldEFuZE1heFNpemUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7Ci0JdW5zaWduZWQgbG9uZyBvZmZzZXQ7Ci0JdW5zaWduZWQgbG9uZyBtYXhTaXplOwotCUJvb2xlYW4gdHJ1bmNhdGVGaWxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0OworICAgIHVuc2lnbmVkIGxvbmcgbWF4U2l6ZTsKKyAgICBCb29sZWFuIHRydW5jYXRlRmlsZTsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXRPZmZzZXRBbmRNYXhTaXplCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXRPZmZzZXRBbmRNYXhTaXplKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldE91dHB1dE9mZnNldEFuZE1heFNpemUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0T3V0cHV0T2Zmc2V0QW5kTWF4U2l6ZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1heFNpemUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cnVuY2F0ZUZpbGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbGxiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgIG1heFNpemUsCi0JICAgICAgICAgICAgICAgICAgICAgdHJ1bmNhdGVGaWxlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXRPZmZzZXRBbmRNYXhTaXplKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWF4U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRydW5jYXRlRmlsZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsbGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgbWF4U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0cnVuY2F0ZUZpbGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzRXhwb3J0U2V0T3V0cHV0RmlsZVR5cGVBbmRDcmVhdG9yKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwotCU9TVHlwZSBmaWxlVHlwZTsKLQlPU1R5cGUgZmlsZUNyZWF0b3I7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgT1NUeXBlIGZpbGVUeXBlOworICAgIE9TVHlwZSBmaWxlQ3JlYXRvcjsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRTZXRPdXRwdXRGaWxlVHlwZUFuZENyZWF0b3IKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydFNldE91dHB1dEZpbGVUeXBlQW5kQ3JlYXRvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRTZXRPdXRwdXRGaWxlVHlwZUFuZENyZWF0b3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmZpbGVUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZmaWxlQ3JlYXRvcikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0U2V0T3V0cHV0RmlsZVR5cGVBbmRDcmVhdG9yKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVDcmVhdG9yKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZmlsZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmZpbGVDcmVhdG9yKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRTZXRPdXRwdXRGaWxlVHlwZUFuZENyZWF0b3IoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZUNyZWF0b3IpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzRXhwb3J0R2V0T3V0cHV0RmlsZVR5cGVBbmRDcmVhdG9yKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwotCU9TVHlwZSBmaWxlVHlwZTsKLQlPU1R5cGUgZmlsZUNyZWF0b3I7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgT1NUeXBlIGZpbGVUeXBlOworICAgIE9TVHlwZSBmaWxlQ3JlYXRvcjsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXRGaWxlVHlwZUFuZENyZWF0b3IKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldE91dHB1dEZpbGVUeXBlQW5kQ3JlYXRvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXRGaWxlVHlwZUFuZENyZWF0b3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0T3V0cHV0RmlsZVR5cGVBbmRDcmVhdG9yKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWxlVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlsZUNyZWF0b3IpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBmaWxlVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgZmlsZUNyZWF0b3IpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydEdldE91dHB1dEZpbGVUeXBlQW5kQ3JlYXRvcihjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlsZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpbGVDcmVhdG9yKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgZmlsZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIGZpbGVDcmVhdG9yKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydFNldE91dHB1dE1hcmsoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7Ci0JdW5zaWduZWQgbG9uZyBtYXJrOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIHVuc2lnbmVkIGxvbmcgbWFyazsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRTZXRPdXRwdXRNYXJrCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRTZXRPdXRwdXRNYXJrKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydFNldE91dHB1dE1hcmspOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZtYXJrKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRTZXRPdXRwdXRNYXJrKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1hcmspKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydFNldE91dHB1dE1hcmsoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmspOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzRXhwb3J0R2V0T3V0cHV0TWFyayhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQl1bnNpZ25lZCBsb25nIG1hcms7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgdW5zaWduZWQgbG9uZyBtYXJrOwogI2lmbmRlZiBHcmFwaGljc0V4cG9ydEdldE91dHB1dE1hcmsKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldE91dHB1dE1hcmspOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0R2V0T3V0cHV0TWFyayk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXRNYXJrKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWFyayk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgbWFyayk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0T3V0cHV0TWFyayhjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1hcmspOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmspOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzRXhwb3J0UmVhZE91dHB1dERhdGEoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7Ci0Jdm9pZCAqIGRhdGFQdHI7Ci0JdW5zaWduZWQgbG9uZyBkYXRhT2Zmc2V0OwotCXVuc2lnbmVkIGxvbmcgZGF0YVNpemU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgdm9pZCAqIGRhdGFQdHI7CisgICAgdW5zaWduZWQgbG9uZyBkYXRhT2Zmc2V0OworICAgIHVuc2lnbmVkIGxvbmcgZGF0YVNpemU7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0UmVhZE91dHB1dERhdGEKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydFJlYWRPdXRwdXREYXRhKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydFJlYWRPdXRwdXREYXRhKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mc2xsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZkYXRhUHRyLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGF0YU9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRhdGFTaXplKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRSZWFkT3V0cHV0RGF0YShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFQdHIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhT2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVNpemUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mc2xsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFTaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRSZWFkT3V0cHV0RGF0YShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVNpemUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzRXhwb3J0U2V0VGh1bWJuYWlsRW5hYmxlZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQlCb29sZWFuIGVuYWJsZVRodW1ibmFpbDsKLQlsb25nIG1heFRodW1ibmFpbFdpZHRoOwotCWxvbmcgbWF4VGh1bWJuYWlsSGVpZ2h0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIEJvb2xlYW4gZW5hYmxlVGh1bWJuYWlsOworICAgIGxvbmcgbWF4VGh1bWJuYWlsV2lkdGg7CisgICAgbG9uZyBtYXhUaHVtYm5haWxIZWlnaHQ7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0U2V0VGh1bWJuYWlsRW5hYmxlZAotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0U2V0VGh1bWJuYWlsRW5hYmxlZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRTZXRUaHVtYm5haWxFbmFibGVkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYmxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZlbmFibGVUaHVtYm5haWwsCi0JICAgICAgICAgICAgICAgICAgICAgICZtYXhUaHVtYm5haWxXaWR0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1heFRodW1ibmFpbEhlaWdodCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0U2V0VGh1bWJuYWlsRW5hYmxlZChjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlVGh1bWJuYWlsLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhUaHVtYm5haWxXaWR0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4VGh1bWJuYWlsSGVpZ2h0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5hYmxlVGh1bWJuYWlsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWF4VGh1bWJuYWlsV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXhUaHVtYm5haWxIZWlnaHQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydFNldFRodW1ibmFpbEVuYWJsZWQoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZVRodW1ibmFpbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4VGh1bWJuYWlsV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFRodW1ibmFpbEhlaWdodCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRHZXRUaHVtYm5haWxFbmFibGVkKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwotCUJvb2xlYW4gdGh1bWJuYWlsRW5hYmxlZDsKLQlsb25nIG1heFRodW1ibmFpbFdpZHRoOwotCWxvbmcgbWF4VGh1bWJuYWlsSGVpZ2h0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIEJvb2xlYW4gdGh1bWJuYWlsRW5hYmxlZDsKKyAgICBsb25nIG1heFRodW1ibmFpbFdpZHRoOworICAgIGxvbmcgbWF4VGh1bWJuYWlsSGVpZ2h0OwogI2lmbmRlZiBHcmFwaGljc0V4cG9ydEdldFRodW1ibmFpbEVuYWJsZWQKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldFRodW1ibmFpbEVuYWJsZWQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0R2V0VGh1bWJuYWlsRW5hYmxlZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRHZXRUaHVtYm5haWxFbmFibGVkKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGh1bWJuYWlsRW5hYmxlZCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1heFRodW1ibmFpbFdpZHRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWF4VGh1bWJuYWlsSGVpZ2h0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHRodW1ibmFpbEVuYWJsZWQsCi0JICAgICAgICAgICAgICAgICAgICAgbWF4VGh1bWJuYWlsV2lkdGgsCi0JICAgICAgICAgICAgICAgICAgICAgbWF4VGh1bWJuYWlsSGVpZ2h0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRHZXRUaHVtYm5haWxFbmFibGVkKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGh1bWJuYWlsRW5hYmxlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1heFRodW1ibmFpbFdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWF4VGh1bWJuYWlsSGVpZ2h0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHRodW1ibmFpbEVuYWJsZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgbWF4VGh1bWJuYWlsV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgbWF4VGh1bWJuYWlsSGVpZ2h0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydFNldEV4aWZFbmFibGVkKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwotCUJvb2xlYW4gZW5hYmxlRXhpZjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKKyAgICBCb29sZWFuIGVuYWJsZUV4aWY7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0U2V0RXhpZkVuYWJsZWQKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydFNldEV4aWZFbmFibGVkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydFNldEV4aWZFbmFibGVkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmZW5hYmxlRXhpZikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0U2V0RXhpZkVuYWJsZWQoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVFeGlmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmVuYWJsZUV4aWYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydFNldEV4aWZFbmFibGVkKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlRXhpZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRHZXRFeGlmRW5hYmxlZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQlCb29sZWFuIGV4aWZFbmFibGVkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIEJvb2xlYW4gZXhpZkVuYWJsZWQ7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0R2V0RXhpZkVuYWJsZWQKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldEV4aWZFbmFibGVkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldEV4aWZFbmFibGVkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0V4cG9ydEdldEV4aWZFbmFibGVkKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmV4aWZFbmFibGVkKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBleGlmRW5hYmxlZCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0RXhpZkVuYWJsZWQoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXhpZkVuYWJsZWQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGV4aWZFbmFibGVkKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9JbWFnZVRyYW5zY29kZXJCZWdpblNlcXVlbmNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUltYWdlVHJhbnNjb2RlckNvbXBvbmVudCBpdGM7Ci0JSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBzcmNEZXNjOwotCUltYWdlRGVzY3JpcHRpb25IYW5kbGUgZHN0RGVzYzsKLQl2b2lkICogZGF0YTsKLQlsb25nIGRhdGFTaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEltYWdlVHJhbnNjb2RlckNvbXBvbmVudCBpdGM7CisgICAgSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBzcmNEZXNjOworICAgIEltYWdlRGVzY3JpcHRpb25IYW5kbGUgZHN0RGVzYzsKKyAgICB2b2lkICogZGF0YTsKKyAgICBsb25nIGRhdGFTaXplOwogI2lmbmRlZiBJbWFnZVRyYW5zY29kZXJCZWdpblNlcXVlbmNlCi0JUHlNYWNfUFJFQ0hFQ0soSW1hZ2VUcmFuc2NvZGVyQmVnaW5TZXF1ZW5jZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSW1hZ2VUcmFuc2NvZGVyQmVnaW5TZXF1ZW5jZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mc2wiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZpdGMsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc3JjRGVzYywKLQkgICAgICAgICAgICAgICAgICAgICAgJmRhdGEsCi0JICAgICAgICAgICAgICAgICAgICAgICZkYXRhU2l6ZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEltYWdlVHJhbnNjb2RlckJlZ2luU2VxdWVuY2UoaXRjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjRGVzYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkc3REZXNjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTaXplKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgZHN0RGVzYyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJnNsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmaXRjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNyY0Rlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVNpemUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBJbWFnZVRyYW5zY29kZXJCZWdpblNlcXVlbmNlKGl0YywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0Rlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHN0RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhU2l6ZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGRzdERlc2MpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0ltYWdlVHJhbnNjb2RlckRpc3Bvc2VEYXRhKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUltYWdlVHJhbnNjb2RlckNvbXBvbmVudCBpdGM7Ci0Jdm9pZCAqIGRzdERhdGE7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgSW1hZ2VUcmFuc2NvZGVyQ29tcG9uZW50IGl0YzsKKyAgICB2b2lkICogZHN0RGF0YTsKICNpZm5kZWYgSW1hZ2VUcmFuc2NvZGVyRGlzcG9zZURhdGEKLQlQeU1hY19QUkVDSEVDSyhJbWFnZVRyYW5zY29kZXJEaXNwb3NlRGF0YSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSW1hZ2VUcmFuc2NvZGVyRGlzcG9zZURhdGEpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmaXRjLAotCSAgICAgICAgICAgICAgICAgICAgICAmZHN0RGF0YSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEltYWdlVHJhbnNjb2RlckRpc3Bvc2VEYXRhKGl0YywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3REYXRhKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZpdGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkc3REYXRhKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gSW1hZ2VUcmFuc2NvZGVyRGlzcG9zZURhdGEoaXRjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdERhdGEpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0ltYWdlVHJhbnNjb2RlckVuZFNlcXVlbmNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUltYWdlVHJhbnNjb2RlckNvbXBvbmVudCBpdGM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgSW1hZ2VUcmFuc2NvZGVyQ29tcG9uZW50IGl0YzsKICNpZm5kZWYgSW1hZ2VUcmFuc2NvZGVyRW5kU2VxdWVuY2UKLQlQeU1hY19QUkVDSEVDSyhJbWFnZVRyYW5zY29kZXJFbmRTZXF1ZW5jZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSW1hZ2VUcmFuc2NvZGVyRW5kU2VxdWVuY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZpdGMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBJbWFnZVRyYW5zY29kZXJFbmRTZXF1ZW5jZShpdGMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmaXRjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gSW1hZ2VUcmFuc2NvZGVyRW5kU2VxdWVuY2UoaXRjKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9DbG9ja0dldFRpbWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JQ29tcG9uZW50SW5zdGFuY2UgYUNsb2NrOwotCVRpbWVSZWNvcmQgb3V0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIENvbXBvbmVudEluc3RhbmNlIGFDbG9jazsKKyAgICBUaW1lUmVjb3JkIG91dDsKICNpZm5kZWYgQ2xvY2tHZXRUaW1lCi0JUHlNYWNfUFJFQ0hFQ0soQ2xvY2tHZXRUaW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDbG9ja0dldFRpbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZhQ2xvY2spKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDbG9ja0dldFRpbWUoYUNsb2NrLAotCSAgICAgICAgICAgICAgICAgICAmb3V0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUXRUaW1lUmVjb3JkX05ldywgJm91dCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZhQ2xvY2spKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDbG9ja0dldFRpbWUoYUNsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAmb3V0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUXRUaW1lUmVjb3JkX05ldywgJm91dCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfQ2xvY2tTZXRUaW1lQmFzZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlDb21wb25lbnRJbnN0YW5jZSBhQ2xvY2s7Ci0JVGltZUJhc2UgdGI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgQ29tcG9uZW50SW5zdGFuY2UgYUNsb2NrOworICAgIFRpbWVCYXNlIHRiOwogI2lmbmRlZiBDbG9ja1NldFRpbWVCYXNlCi0JUHlNYWNfUFJFQ0hFQ0soQ2xvY2tTZXRUaW1lQmFzZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ2xvY2tTZXRUaW1lQmFzZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYUNsb2NrLAotCSAgICAgICAgICAgICAgICAgICAgICBUaW1lQmFzZU9ial9Db252ZXJ0LCAmdGIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDbG9ja1NldFRpbWVCYXNlKGFDbG9jaywKLQkgICAgICAgICAgICAgICAgICAgICAgIHRiKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYUNsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lQmFzZU9ial9Db252ZXJ0LCAmdGIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDbG9ja1NldFRpbWVCYXNlKGFDbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRiKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9DbG9ja0dldFJhdGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JQ29tcG9uZW50SW5zdGFuY2UgYUNsb2NrOwotCUZpeGVkIHJhdGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgQ29tcG9uZW50SW5zdGFuY2UgYUNsb2NrOworICAgIEZpeGVkIHJhdGU7CiAjaWZuZGVmIENsb2NrR2V0UmF0ZQotCVB5TWFjX1BSRUNIRUNLKENsb2NrR2V0UmF0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ2xvY2tHZXRSYXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYUNsb2NrKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ2xvY2tHZXRSYXRlKGFDbG9jaywKLQkgICAgICAgICAgICAgICAgICAgJnJhdGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCByYXRlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmFDbG9jaykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENsb2NrR2V0UmF0ZShhQ2xvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICZyYXRlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGaXhlZCwgcmF0ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0NQb3NpdGlvblJlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JQ29tcG9uZW50SW5zdGFuY2UgY2k7Ci0JUmVjdCBycDsKLQlQb2ludCB3aGVyZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBDb21wb25lbnRJbnN0YW5jZSBjaTsKKyAgICBSZWN0IHJwOworICAgIFBvaW50IHdoZXJlOwogI2lmbmRlZiBTQ1Bvc2l0aW9uUmVjdAotCVB5TWFjX1BSRUNIRUNLKFNDUG9zaXRpb25SZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTQ1Bvc2l0aW9uUmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0NQb3NpdGlvblJlY3QoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgJnJwLAotCSAgICAgICAgICAgICAgICAgICAgICZ3aGVyZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmcnAsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRQb2ludCwgd2hlcmUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTQ1Bvc2l0aW9uUmVjdChjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmcnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgJndoZXJlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZycCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFBvaW50LCB3aGVyZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0NQb3NpdGlvbkRpYWxvZyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlDb21wb25lbnRJbnN0YW5jZSBjaTsKLQlzaG9ydCBpZDsKLQlQb2ludCB3aGVyZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBDb21wb25lbnRJbnN0YW5jZSBjaTsKKyAgICBzaG9ydCBpZDsKKyAgICBQb2ludCB3aGVyZTsKICNpZm5kZWYgU0NQb3NpdGlvbkRpYWxvZwotCVB5TWFjX1BSRUNIRUNLKFNDUG9zaXRpb25EaWFsb2cpOworICAgIFB5TWFjX1BSRUNIRUNLKFNDUG9zaXRpb25EaWFsb2cpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZpZCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNDUG9zaXRpb25EaWFsb2coY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICBpZCwKLQkgICAgICAgICAgICAgICAgICAgICAgICZ3aGVyZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUG9pbnQsIHdoZXJlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0NQb3NpdGlvbkRpYWxvZyhjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJndoZXJlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRQb2ludCwgd2hlcmUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NDU2V0VGVzdEltYWdlUGljdEhhbmRsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlDb21wb25lbnRJbnN0YW5jZSBjaTsKLQlQaWNIYW5kbGUgdGVzdFBpY3Q7Ci0JUmVjdCB0ZXN0UmVjdDsKLQlzaG9ydCB0ZXN0RmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgQ29tcG9uZW50SW5zdGFuY2UgY2k7CisgICAgUGljSGFuZGxlIHRlc3RQaWN0OworICAgIFJlY3QgdGVzdFJlY3Q7CisgICAgc2hvcnQgdGVzdEZsYWdzOwogI2lmbmRlZiBTQ1NldFRlc3RJbWFnZVBpY3RIYW5kbGUKLQlQeU1hY19QUkVDSEVDSyhTQ1NldFRlc3RJbWFnZVBpY3RIYW5kbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNDU2V0VGVzdEltYWdlUGljdEhhbmRsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRlc3RQaWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmdGVzdEZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0NTZXRUZXN0SW1hZ2VQaWN0SGFuZGxlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0UGljdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRlc3RSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0RmxhZ3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZ0ZXN0UmVjdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0ZXN0UGljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRlc3RGbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNDU2V0VGVzdEltYWdlUGljdEhhbmRsZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdFBpY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZXN0UmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdEZsYWdzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmdGVzdFJlY3QpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NDU2V0VGVzdEltYWdlUGljdEZpbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JQ29tcG9uZW50SW5zdGFuY2UgY2k7Ci0Jc2hvcnQgdGVzdEZpbGVSZWY7Ci0JUmVjdCB0ZXN0UmVjdDsKLQlzaG9ydCB0ZXN0RmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgQ29tcG9uZW50SW5zdGFuY2UgY2k7CisgICAgc2hvcnQgdGVzdEZpbGVSZWY7CisgICAgUmVjdCB0ZXN0UmVjdDsKKyAgICBzaG9ydCB0ZXN0RmxhZ3M7CiAjaWZuZGVmIFNDU2V0VGVzdEltYWdlUGljdEZpbGUKLQlQeU1hY19QUkVDSEVDSyhTQ1NldFRlc3RJbWFnZVBpY3RGaWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTQ1NldFRlc3RJbWFnZVBpY3RGaWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGgiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRlc3RGaWxlUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGVzdEZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0NTZXRUZXN0SW1hZ2VQaWN0RmlsZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RGaWxlUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRlc3RSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdEZsYWdzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmdGVzdFJlY3QpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRlc3RGaWxlUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGVzdEZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0NTZXRUZXN0SW1hZ2VQaWN0RmlsZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RGaWxlUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRlc3RSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdEZsYWdzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmdGVzdFJlY3QpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NDU2V0VGVzdEltYWdlUGl4TWFwKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUNvbXBvbmVudEluc3RhbmNlIGNpOwotCVBpeE1hcEhhbmRsZSB0ZXN0UGl4TWFwOwotCVJlY3QgdGVzdFJlY3Q7Ci0Jc2hvcnQgdGVzdEZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIENvbXBvbmVudEluc3RhbmNlIGNpOworICAgIFBpeE1hcEhhbmRsZSB0ZXN0UGl4TWFwOworICAgIFJlY3QgdGVzdFJlY3Q7CisgICAgc2hvcnQgdGVzdEZsYWdzOwogI2lmbmRlZiBTQ1NldFRlc3RJbWFnZVBpeE1hcAotCVB5TWFjX1BSRUNIRUNLKFNDU2V0VGVzdEltYWdlUGl4TWFwKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTQ1NldFRlc3RJbWFnZVBpeE1hcCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRlc3RQaXhNYXAsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0ZXN0RmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTQ1NldFRlc3RJbWFnZVBpeE1hcChjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0UGl4TWFwLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZXN0UmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0RmxhZ3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZ0ZXN0UmVjdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0ZXN0UGl4TWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGVzdEZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0NTZXRUZXN0SW1hZ2VQaXhNYXAoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdFBpeE1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGVzdFJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdEZsYWdzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmdGVzdFJlY3QpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NDR2V0QmVzdERldmljZVJlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JQ29tcG9uZW50SW5zdGFuY2UgY2k7Ci0JUmVjdCByOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIENvbXBvbmVudEluc3RhbmNlIGNpOworICAgIFJlY3QgcjsKICNpZm5kZWYgU0NHZXRCZXN0RGV2aWNlUmVjdAotCVB5TWFjX1BSRUNIRUNLKFNDR2V0QmVzdERldmljZVJlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKFNDR2V0QmVzdERldmljZVJlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNDR2V0QmVzdERldmljZVJlY3QoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmcik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJnIpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTQ0dldEJlc3REZXZpY2VSZWN0KGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZyKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TQ1JlcXVlc3RJbWFnZVNldHRpbmdzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUNvbXBvbmVudEluc3RhbmNlIGNpOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIENvbXBvbmVudEluc3RhbmNlIGNpOwogI2lmbmRlZiBTQ1JlcXVlc3RJbWFnZVNldHRpbmdzCi0JUHlNYWNfUFJFQ0hFQ0soU0NSZXF1ZXN0SW1hZ2VTZXR0aW5ncyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0NSZXF1ZXN0SW1hZ2VTZXR0aW5ncyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0NSZXF1ZXN0SW1hZ2VTZXR0aW5ncyhjaSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNDUmVxdWVzdEltYWdlU2V0dGluZ3MoY2kpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NDQ29tcHJlc3NJbWFnZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlDb21wb25lbnRJbnN0YW5jZSBjaTsKLQlQaXhNYXBIYW5kbGUgc3JjOwotCVJlY3Qgc3JjUmVjdDsKLQlJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2M7Ci0JSGFuZGxlIGRhdGE7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgQ29tcG9uZW50SW5zdGFuY2UgY2k7CisgICAgUGl4TWFwSGFuZGxlIHNyYzsKKyAgICBSZWN0IHNyY1JlY3Q7CisgICAgSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjOworICAgIEhhbmRsZSBkYXRhOwogI2lmbmRlZiBTQ0NvbXByZXNzSW1hZ2UKLQlQeU1hY19QUkVDSEVDSyhTQ0NvbXByZXNzSW1hZ2UpOworICAgIFB5TWFjX1BSRUNIRUNLKFNDQ29tcHJlc3NJbWFnZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzcmMsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZzcmNSZWN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0NDb21wcmVzc0ltYWdlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICBzcmMsCi0JICAgICAgICAgICAgICAgICAgICAgICZzcmNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmZGVzYywKLQkgICAgICAgICAgICAgICAgICAgICAgJmRhdGEpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGRlc2MsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgZGF0YSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmc3JjUmVjdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNDQ29tcHJlc3NJbWFnZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3JjUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGRhdGEpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NDQ29tcHJlc3NQaWN0dXJlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUNvbXBvbmVudEluc3RhbmNlIGNpOwotCVBpY0hhbmRsZSBzcmNQaWN0dXJlOwotCVBpY0hhbmRsZSBkc3RQaWN0dXJlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIENvbXBvbmVudEluc3RhbmNlIGNpOworICAgIFBpY0hhbmRsZSBzcmNQaWN0dXJlOworICAgIFBpY0hhbmRsZSBkc3RQaWN0dXJlOwogI2lmbmRlZiBTQ0NvbXByZXNzUGljdHVyZQotCVB5TWFjX1BSRUNIRUNLKFNDQ29tcHJlc3NQaWN0dXJlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTQ0NvbXByZXNzUGljdHVyZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzcmNQaWN0dXJlLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRzdFBpY3R1cmUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTQ0NvbXByZXNzUGljdHVyZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICBzcmNQaWN0dXJlLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGRzdFBpY3R1cmUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNyY1BpY3R1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZHN0UGljdHVyZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNDQ29tcHJlc3NQaWN0dXJlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1BpY3R1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0UGljdHVyZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0NDb21wcmVzc1BpY3R1cmVGaWxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUNvbXBvbmVudEluc3RhbmNlIGNpOwotCXNob3J0IHNyY1JlZk51bTsKLQlzaG9ydCBkc3RSZWZOdW07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgQ29tcG9uZW50SW5zdGFuY2UgY2k7CisgICAgc2hvcnQgc3JjUmVmTnVtOworICAgIHNob3J0IGRzdFJlZk51bTsKICNpZm5kZWYgU0NDb21wcmVzc1BpY3R1cmVGaWxlCi0JUHlNYWNfUFJFQ0hFQ0soU0NDb21wcmVzc1BpY3R1cmVGaWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTQ0NvbXByZXNzUGljdHVyZUZpbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmc3JjUmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmZHN0UmVmTnVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0NDb21wcmVzc1BpY3R1cmVGaWxlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFJlZk51bSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3JjUmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZHN0UmVmTnVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0NDb21wcmVzc1BpY3R1cmVGaWxlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFJlZk51bSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0NSZXF1ZXN0U2VxdWVuY2VTZXR0aW5ncyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlDb21wb25lbnRJbnN0YW5jZSBjaTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBDb21wb25lbnRJbnN0YW5jZSBjaTsKICNpZm5kZWYgU0NSZXF1ZXN0U2VxdWVuY2VTZXR0aW5ncwotCVB5TWFjX1BSRUNIRUNLKFNDUmVxdWVzdFNlcXVlbmNlU2V0dGluZ3MpOworICAgIFB5TWFjX1BSRUNIRUNLKFNDUmVxdWVzdFNlcXVlbmNlU2V0dGluZ3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNDUmVxdWVzdFNlcXVlbmNlU2V0dGluZ3MoY2kpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTQ1JlcXVlc3RTZXF1ZW5jZVNldHRpbmdzKGNpKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TQ0NvbXByZXNzU2VxdWVuY2VCZWdpbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlDb21wb25lbnRJbnN0YW5jZSBjaTsKLQlQaXhNYXBIYW5kbGUgc3JjOwotCVJlY3Qgc3JjUmVjdDsKLQlJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgQ29tcG9uZW50SW5zdGFuY2UgY2k7CisgICAgUGl4TWFwSGFuZGxlIHNyYzsKKyAgICBSZWN0IHNyY1JlY3Q7CisgICAgSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjOwogI2lmbmRlZiBTQ0NvbXByZXNzU2VxdWVuY2VCZWdpbgotCVB5TWFjX1BSRUNIRUNLKFNDQ29tcHJlc3NTZXF1ZW5jZUJlZ2luKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTQ0NvbXByZXNzU2VxdWVuY2VCZWdpbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzcmMsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZzcmNSZWN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0NDb21wcmVzc1NlcXVlbmNlQmVnaW4oY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzcmNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXNjKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgZGVzYyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmc3JjUmVjdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNDQ29tcHJlc3NTZXF1ZW5jZUJlZ2luKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3JjUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVzYyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGRlc2MpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NDQ29tcHJlc3NTZXF1ZW5jZUZyYW1lKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUNvbXBvbmVudEluc3RhbmNlIGNpOwotCVBpeE1hcEhhbmRsZSBzcmM7Ci0JUmVjdCBzcmNSZWN0OwotCUhhbmRsZSBkYXRhOwotCWxvbmcgZGF0YVNpemU7Ci0Jc2hvcnQgbm90U3luY0ZsYWc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgQ29tcG9uZW50SW5zdGFuY2UgY2k7CisgICAgUGl4TWFwSGFuZGxlIHNyYzsKKyAgICBSZWN0IHNyY1JlY3Q7CisgICAgSGFuZGxlIGRhdGE7CisgICAgbG9uZyBkYXRhU2l6ZTsKKyAgICBzaG9ydCBub3RTeW5jRmxhZzsKICNpZm5kZWYgU0NDb21wcmVzc1NlcXVlbmNlRnJhbWUKLQlQeU1hY19QUkVDSEVDSyhTQ0NvbXByZXNzU2VxdWVuY2VGcmFtZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0NDb21wcmVzc1NlcXVlbmNlRnJhbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc3JjLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmc3JjUmVjdCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNDQ29tcHJlc3NTZXF1ZW5jZUZyYW1lKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3JjUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVNpemUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5vdFN5bmNGbGFnKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mbGgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBkYXRhLAotCSAgICAgICAgICAgICAgICAgICAgIGRhdGFTaXplLAotCSAgICAgICAgICAgICAgICAgICAgIG5vdFN5bmNGbGFnKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZzcmNSZWN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0NDb21wcmVzc1NlcXVlbmNlRnJhbWUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzcmNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbm90U3luY0ZsYWcpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZsaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgbm90U3luY0ZsYWcpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NDQ29tcHJlc3NTZXF1ZW5jZUVuZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlDb21wb25lbnRJbnN0YW5jZSBjaTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBDb21wb25lbnRJbnN0YW5jZSBjaTsKICNpZm5kZWYgU0NDb21wcmVzc1NlcXVlbmNlRW5kCi0JUHlNYWNfUFJFQ0hFQ0soU0NDb21wcmVzc1NlcXVlbmNlRW5kKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTQ0NvbXByZXNzU2VxdWVuY2VFbmQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNDQ29tcHJlc3NTZXF1ZW5jZUVuZChjaSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNDQ29tcHJlc3NTZXF1ZW5jZUVuZChjaSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0NEZWZhdWx0UGljdEhhbmRsZVNldHRpbmdzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUNvbXBvbmVudEluc3RhbmNlIGNpOwotCVBpY0hhbmRsZSBzcmNQaWN0dXJlOwotCXNob3J0IG1vdGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBDb21wb25lbnRJbnN0YW5jZSBjaTsKKyAgICBQaWNIYW5kbGUgc3JjUGljdHVyZTsKKyAgICBzaG9ydCBtb3Rpb247CiAjaWZuZGVmIFNDRGVmYXVsdFBpY3RIYW5kbGVTZXR0aW5ncwotCVB5TWFjX1BSRUNIRUNLKFNDRGVmYXVsdFBpY3RIYW5kbGVTZXR0aW5ncyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0NEZWZhdWx0UGljdEhhbmRsZVNldHRpbmdzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc3JjUGljdHVyZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vdGlvbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNDRGVmYXVsdFBpY3RIYW5kbGVTZXR0aW5ncyhjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjUGljdHVyZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW90aW9uKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNyY1BpY3R1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtb3Rpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTQ0RlZmF1bHRQaWN0SGFuZGxlU2V0dGluZ3MoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1BpY3R1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdGlvbik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0NEZWZhdWx0UGljdEZpbGVTZXR0aW5ncyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlDb21wb25lbnRJbnN0YW5jZSBjaTsKLQlzaG9ydCBzcmNSZWY7Ci0Jc2hvcnQgbW90aW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIENvbXBvbmVudEluc3RhbmNlIGNpOworICAgIHNob3J0IHNyY1JlZjsKKyAgICBzaG9ydCBtb3Rpb247CiAjaWZuZGVmIFNDRGVmYXVsdFBpY3RGaWxlU2V0dGluZ3MKLQlQeU1hY19QUkVDSEVDSyhTQ0RlZmF1bHRQaWN0RmlsZVNldHRpbmdzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTQ0RlZmF1bHRQaWN0RmlsZVNldHRpbmdzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGgiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNyY1JlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vdGlvbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNDRGVmYXVsdFBpY3RGaWxlU2V0dGluZ3MoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3Rpb24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNyY1JlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vdGlvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNDRGVmYXVsdFBpY3RGaWxlU2V0dGluZ3MoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3Rpb24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NDRGVmYXVsdFBpeE1hcFNldHRpbmdzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUNvbXBvbmVudEluc3RhbmNlIGNpOwotCVBpeE1hcEhhbmRsZSBzcmM7Ci0Jc2hvcnQgbW90aW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIENvbXBvbmVudEluc3RhbmNlIGNpOworICAgIFBpeE1hcEhhbmRsZSBzcmM7CisgICAgc2hvcnQgbW90aW9uOwogI2lmbmRlZiBTQ0RlZmF1bHRQaXhNYXBTZXR0aW5ncwotCVB5TWFjX1BSRUNIRUNLKFNDRGVmYXVsdFBpeE1hcFNldHRpbmdzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTQ0RlZmF1bHRQaXhNYXBTZXR0aW5ncyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNyYywKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vdGlvbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNDRGVmYXVsdFBpeE1hcFNldHRpbmdzKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3Rpb24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbW90aW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0NEZWZhdWx0UGl4TWFwU2V0dGluZ3MoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdGlvbik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0NHZXRJbmZvKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUNvbXBvbmVudEluc3RhbmNlIGNpOwotCU9TVHlwZSBpbmZvVHlwZTsKLQl2b2lkICogaW5mbzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBDb21wb25lbnRJbnN0YW5jZSBjaTsKKyAgICBPU1R5cGUgaW5mb1R5cGU7CisgICAgdm9pZCAqIGluZm87CiAjaWZuZGVmIFNDR2V0SW5mbwotCVB5TWFjX1BSRUNIRUNLKFNDR2V0SW5mbyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0NHZXRJbmZvKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZzIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmluZm9UeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5mbykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNDR2V0SW5mbyhjaSwKLQkgICAgICAgICAgICAgICAgaW5mb1R5cGUsCi0JICAgICAgICAgICAgICAgIGluZm8pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmluZm9UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5mbykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNDR2V0SW5mbyhjaSwKKyAgICAgICAgICAgICAgICAgICAgaW5mb1R5cGUsCisgICAgICAgICAgICAgICAgICAgIGluZm8pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NDU2V0SW5mbyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlDb21wb25lbnRJbnN0YW5jZSBjaTsKLQlPU1R5cGUgaW5mb1R5cGU7Ci0Jdm9pZCAqIGluZm87CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgQ29tcG9uZW50SW5zdGFuY2UgY2k7CisgICAgT1NUeXBlIGluZm9UeXBlOworICAgIHZvaWQgKiBpbmZvOwogI2lmbmRlZiBTQ1NldEluZm8KLQlQeU1hY19QUkVDSEVDSyhTQ1NldEluZm8pOworICAgIFB5TWFjX1BSRUNIRUNLKFNDU2V0SW5mbyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mcyIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpbmZvVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluZm8pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTQ1NldEluZm8oY2ksCi0JICAgICAgICAgICAgICAgIGluZm9UeXBlLAotCSAgICAgICAgICAgICAgICBpbmZvKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpbmZvVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZm8pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTQ1NldEluZm8oY2ksCisgICAgICAgICAgICAgICAgICAgIGluZm9UeXBlLAorICAgICAgICAgICAgICAgICAgICBpbmZvKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TQ1NldENvbXByZXNzRmxhZ3MoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JQ29tcG9uZW50SW5zdGFuY2UgY2k7Ci0JbG9uZyBmbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBDb21wb25lbnRJbnN0YW5jZSBjaTsKKyAgICBsb25nIGZsYWdzOwogI2lmbmRlZiBTQ1NldENvbXByZXNzRmxhZ3MKLQlQeU1hY19QUkVDSEVDSyhTQ1NldENvbXByZXNzRmxhZ3MpOworICAgIFB5TWFjX1BSRUNIRUNLKFNDU2V0Q29tcHJlc3NGbGFncyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0NTZXRDb21wcmVzc0ZsYWdzKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNDU2V0Q29tcHJlc3NGbGFncyhjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NDR2V0Q29tcHJlc3NGbGFncyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlDb21wb25lbnRJbnN0YW5jZSBjaTsKLQlsb25nIGZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIENvbXBvbmVudEluc3RhbmNlIGNpOworICAgIGxvbmcgZmxhZ3M7CiAjaWZuZGVmIFNDR2V0Q29tcHJlc3NGbGFncwotCVB5TWFjX1BSRUNIRUNLKFNDR2V0Q29tcHJlc3NGbGFncyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0NHZXRDb21wcmVzc0ZsYWdzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTQ0dldENvbXByZXNzRmxhZ3MoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTQ0dldENvbXByZXNzRmxhZ3MoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NDR2V0U2V0dGluZ3NBc1RleHQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JQ29tcG9uZW50SW5zdGFuY2UgY2k7Ci0JSGFuZGxlIHRleHQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgQ29tcG9uZW50SW5zdGFuY2UgY2k7CisgICAgSGFuZGxlIHRleHQ7CiAjaWZuZGVmIFNDR2V0U2V0dGluZ3NBc1RleHQKLQlQeU1hY19QUkVDSEVDSyhTQ0dldFNldHRpbmdzQXNUZXh0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTQ0dldFNldHRpbmdzQXNUZXh0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTQ0dldFNldHRpbmdzQXNUZXh0KGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJnRleHQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCB0ZXh0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0NHZXRTZXR0aW5nc0FzVGV4dChjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZXh0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgdGV4dCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0NBc3luY0lkbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JQ29tcG9uZW50SW5zdGFuY2UgY2k7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgQ29tcG9uZW50SW5zdGFuY2UgY2k7CiAjaWZuZGVmIFNDQXN5bmNJZGxlCi0JUHlNYWNfUFJFQ0hFQ0soU0NBc3luY0lkbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNDQXN5bmNJZGxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTQ0FzeW5jSWRsZShjaSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNDQXN5bmNJZGxlKGNpKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9Ud2VlbmVyUmVzZXQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVHdlZW5lckNvbXBvbmVudCB0YzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBUd2VlbmVyQ29tcG9uZW50IHRjOwogI2lmbmRlZiBUd2VlbmVyUmVzZXQKLQlQeU1hY19QUkVDSEVDSyhUd2VlbmVyUmVzZXQpOworICAgIFB5TWFjX1BSRUNIRUNLKFR3ZWVuZXJSZXNldCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnRjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVHdlZW5lclJlc2V0KHRjKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnRjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVHdlZW5lclJlc2V0KHRjKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9UQ0dldFNvdXJjZVJlZihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JSGFuZGxlckVycm9yIF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JVGltZUNvZGVEZXNjcmlwdGlvbkhhbmRsZSB0Y2RIOwotCVVzZXJEYXRhIHNyZWZIOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBIYW5kbGVyRXJyb3IgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBUaW1lQ29kZURlc2NyaXB0aW9uSGFuZGxlIHRjZEg7CisgICAgVXNlckRhdGEgc3JlZkg7CiAjaWZuZGVmIFRDR2V0U291cmNlUmVmCi0JUHlNYWNfUFJFQ0hFQ0soVENHZXRTb3VyY2VSZWYpOworICAgIFB5TWFjX1BSRUNIRUNLKFRDR2V0U291cmNlUmVmKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0Y2RIKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVENHZXRTb3VyY2VSZWYobWgsCi0JICAgICAgICAgICAgICAgICAgICAgdGNkSCwKLQkgICAgICAgICAgICAgICAgICAgICAmc3JlZkgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBVc2VyRGF0YU9ial9OZXcsIHNyZWZIKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGNkSCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFRDR2V0U291cmNlUmVmKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRjZEgsCisgICAgICAgICAgICAgICAgICAgICAgICAgJnNyZWZIKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgVXNlckRhdGFPYmpfTmV3LCBzcmVmSCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVENTZXRTb3VyY2VSZWYoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUhhbmRsZXJFcnJvciBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCVRpbWVDb2RlRGVzY3JpcHRpb25IYW5kbGUgdGNkSDsKLQlVc2VyRGF0YSBzcmVmSDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgSGFuZGxlckVycm9yIF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgVGltZUNvZGVEZXNjcmlwdGlvbkhhbmRsZSB0Y2RIOworICAgIFVzZXJEYXRhIHNyZWZIOwogI2lmbmRlZiBUQ1NldFNvdXJjZVJlZgotCVB5TWFjX1BSRUNIRUNLKFRDU2V0U291cmNlUmVmKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUQ1NldFNvdXJjZVJlZik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0Y2RILAotCSAgICAgICAgICAgICAgICAgICAgICBVc2VyRGF0YU9ial9Db252ZXJ0LCAmc3JlZkgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBUQ1NldFNvdXJjZVJlZihtaCwKLQkgICAgICAgICAgICAgICAgICAgICB0Y2RILAotCSAgICAgICAgICAgICAgICAgICAgIHNyZWZIKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0Y2RILAorICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VyRGF0YU9ial9Db252ZXJ0LCAmc3JlZkgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBUQ1NldFNvdXJjZVJlZihtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0Y2RILAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyZWZIKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9UQ1NldFRpbWVDb2RlRmxhZ3MoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUhhbmRsZXJFcnJvciBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCWxvbmcgZmxhZ3M7Ci0JbG9uZyBmbGFnc01hc2s7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEhhbmRsZXJFcnJvciBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIGxvbmcgZmxhZ3M7CisgICAgbG9uZyBmbGFnc01hc2s7CiAjaWZuZGVmIFRDU2V0VGltZUNvZGVGbGFncwotCVB5TWFjX1BSRUNIRUNLKFRDU2V0VGltZUNvZGVGbGFncyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVENTZXRUaW1lQ29kZUZsYWdzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3NNYXNrKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVENTZXRUaW1lQ29kZUZsYWdzKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3NNYXNrKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzTWFzaykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFRDU2V0VGltZUNvZGVGbGFncyhtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzTWFzayk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVENHZXRUaW1lQ29kZUZsYWdzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlIYW5kbGVyRXJyb3IgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlsb25nIGZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBIYW5kbGVyRXJyb3IgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBsb25nIGZsYWdzOwogI2lmbmRlZiBUQ0dldFRpbWVDb2RlRmxhZ3MKLQlQeU1hY19QUkVDSEVDSyhUQ0dldFRpbWVDb2RlRmxhZ3MpOworICAgIFB5TWFjX1BSRUNIRUNLKFRDR2V0VGltZUNvZGVGbGFncyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVENHZXRUaW1lQ29kZUZsYWdzKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVENHZXRUaW1lQ29kZUZsYWdzKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9Nb3ZpZUltcG9ydEhhbmRsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNb3ZpZUltcG9ydENvbXBvbmVudCBjaTsKLQlIYW5kbGUgZGF0YUg7Ci0JTW92aWUgdGhlTW92aWU7Ci0JVHJhY2sgdGFyZ2V0VHJhY2s7Ci0JVHJhY2sgdXNlZFRyYWNrOwotCVRpbWVWYWx1ZSBhdFRpbWU7Ci0JVGltZVZhbHVlIGFkZGVkRHVyYXRpb247Ci0JbG9uZyBpbkZsYWdzOwotCWxvbmcgb3V0RmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTW92aWVJbXBvcnRDb21wb25lbnQgY2k7CisgICAgSGFuZGxlIGRhdGFIOworICAgIE1vdmllIHRoZU1vdmllOworICAgIFRyYWNrIHRhcmdldFRyYWNrOworICAgIFRyYWNrIHVzZWRUcmFjazsKKyAgICBUaW1lVmFsdWUgYXRUaW1lOworICAgIFRpbWVWYWx1ZSBhZGRlZER1cmF0aW9uOworICAgIGxvbmcgaW5GbGFnczsKKyAgICBsb25nIG91dEZsYWdzOwogI2lmbmRlZiBNb3ZpZUltcG9ydEhhbmRsZQotCVB5TWFjX1BSRUNIRUNLKE1vdmllSW1wb3J0SGFuZGxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNb3ZpZUltcG9ydEhhbmRsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJmxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YUgsCi0JICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX0NvbnZlcnQsICZ0aGVNb3ZpZSwKLQkgICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfQ29udmVydCwgJnRhcmdldFRyYWNrLAotCSAgICAgICAgICAgICAgICAgICAgICAmYXRUaW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5GbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1vdmllSW1wb3J0SGFuZGxlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFILAotCSAgICAgICAgICAgICAgICAgICAgICAgIHRoZU1vdmllLAotCSAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFRyYWNrLAotCSAgICAgICAgICAgICAgICAgICAgICAgICZ1c2VkVHJhY2ssCi0JICAgICAgICAgICAgICAgICAgICAgICAgYXRUaW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICZhZGRlZER1cmF0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGluRmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgJm91dEZsYWdzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mbGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9OZXcsIHVzZWRUcmFjaywKLQkgICAgICAgICAgICAgICAgICAgICBhZGRlZER1cmF0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgIG91dEZsYWdzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJmxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YUgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX0NvbnZlcnQsICZ0aGVNb3ZpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfQ29udmVydCwgJnRhcmdldFRyYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYXRUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5GbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1vdmllSW1wb3J0SGFuZGxlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZU1vdmllLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFRyYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1c2VkVHJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXRUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhZGRlZER1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEZsYWdzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9OZXcsIHVzZWRUcmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICBhZGRlZER1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dEZsYWdzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9Nb3ZpZUltcG9ydEZpbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTW92aWVJbXBvcnRDb21wb25lbnQgY2k7Ci0JRlNTcGVjIHRoZUZpbGU7Ci0JTW92aWUgdGhlTW92aWU7Ci0JVHJhY2sgdGFyZ2V0VHJhY2s7Ci0JVHJhY2sgdXNlZFRyYWNrOwotCVRpbWVWYWx1ZSBhdFRpbWU7Ci0JVGltZVZhbHVlIGFkZGVkRHVyYXRpb247Ci0JbG9uZyBpbkZsYWdzOwotCWxvbmcgb3V0RmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTW92aWVJbXBvcnRDb21wb25lbnQgY2k7CisgICAgRlNTcGVjIHRoZUZpbGU7CisgICAgTW92aWUgdGhlTW92aWU7CisgICAgVHJhY2sgdGFyZ2V0VHJhY2s7CisgICAgVHJhY2sgdXNlZFRyYWNrOworICAgIFRpbWVWYWx1ZSBhdFRpbWU7CisgICAgVGltZVZhbHVlIGFkZGVkRHVyYXRpb247CisgICAgbG9uZyBpbkZsYWdzOworICAgIGxvbmcgb3V0RmxhZ3M7CiAjaWZuZGVmIE1vdmllSW1wb3J0RmlsZQotCVB5TWFjX1BSRUNIRUNLKE1vdmllSW1wb3J0RmlsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTW92aWVJbXBvcnRGaWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJk8mbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmdGhlRmlsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfQ29udmVydCwgJnRoZU1vdmllLAotCSAgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9Db252ZXJ0LCAmdGFyZ2V0VHJhY2ssCi0JICAgICAgICAgICAgICAgICAgICAgICZhdFRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTW92aWVJbXBvcnRGaWxlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGhlRmlsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgdGhlTW92aWUsCi0JICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFRyYWNrLAotCSAgICAgICAgICAgICAgICAgICAgICAmdXNlZFRyYWNrLAotCSAgICAgICAgICAgICAgICAgICAgICBhdFRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZhZGRlZER1cmF0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICBpbkZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAmb3V0RmxhZ3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFRyYWNrT2JqX05ldywgdXNlZFRyYWNrLAotCSAgICAgICAgICAgICAgICAgICAgIGFkZGVkRHVyYXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgb3V0RmxhZ3MpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJk8mbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmdGhlRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfQ29udmVydCwgJnRoZU1vdmllLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9Db252ZXJ0LCAmdGFyZ2V0VHJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhdFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTW92aWVJbXBvcnRGaWxlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlTW92aWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFRyYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdXNlZFRyYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICBhdFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhZGRlZER1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbkZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0RmxhZ3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFRyYWNrT2JqX05ldywgdXNlZFRyYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgIGFkZGVkRHVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0RmxhZ3MpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01vdmllSW1wb3J0U2V0U2FtcGxlRHVyYXRpb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTW92aWVJbXBvcnRDb21wb25lbnQgY2k7Ci0JVGltZVZhbHVlIGR1cmF0aW9uOwotCVRpbWVTY2FsZSBzY2FsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNb3ZpZUltcG9ydENvbXBvbmVudCBjaTsKKyAgICBUaW1lVmFsdWUgZHVyYXRpb247CisgICAgVGltZVNjYWxlIHNjYWxlOwogI2lmbmRlZiBNb3ZpZUltcG9ydFNldFNhbXBsZUR1cmF0aW9uCi0JUHlNYWNfUFJFQ0hFQ0soTW92aWVJbXBvcnRTZXRTYW1wbGVEdXJhdGlvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTW92aWVJbXBvcnRTZXRTYW1wbGVEdXJhdGlvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNjYWxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTW92aWVJbXBvcnRTZXRTYW1wbGVEdXJhdGlvbihjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmR1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2NhbGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNb3ZpZUltcG9ydFNldFNhbXBsZUR1cmF0aW9uKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTW92aWVJbXBvcnRTZXRTYW1wbGVEZXNjcmlwdGlvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNb3ZpZUltcG9ydENvbXBvbmVudCBjaTsKLQlTYW1wbGVEZXNjcmlwdGlvbkhhbmRsZSBkZXNjOwotCU9TVHlwZSBtZWRpYVR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTW92aWVJbXBvcnRDb21wb25lbnQgY2k7CisgICAgU2FtcGxlRGVzY3JpcHRpb25IYW5kbGUgZGVzYzsKKyAgICBPU1R5cGUgbWVkaWFUeXBlOwogI2lmbmRlZiBNb3ZpZUltcG9ydFNldFNhbXBsZURlc2NyaXB0aW9uCi0JUHlNYWNfUFJFQ0hFQ0soTW92aWVJbXBvcnRTZXRTYW1wbGVEZXNjcmlwdGlvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTW92aWVJbXBvcnRTZXRTYW1wbGVEZXNjcmlwdGlvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkZXNjLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZtZWRpYVR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNb3ZpZUltcG9ydFNldFNhbXBsZURlc2NyaXB0aW9uKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhVHlwZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmbWVkaWFUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTW92aWVJbXBvcnRTZXRTYW1wbGVEZXNjcmlwdGlvbihjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYVR5cGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01vdmllSW1wb3J0U2V0TWVkaWFGaWxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1vdmllSW1wb3J0Q29tcG9uZW50IGNpOwotCUFsaWFzSGFuZGxlIGFsaWFzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1vdmllSW1wb3J0Q29tcG9uZW50IGNpOworICAgIEFsaWFzSGFuZGxlIGFsaWFzOwogI2lmbmRlZiBNb3ZpZUltcG9ydFNldE1lZGlhRmlsZQotCVB5TWFjX1BSRUNIRUNLKE1vdmllSW1wb3J0U2V0TWVkaWFGaWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNb3ZpZUltcG9ydFNldE1lZGlhRmlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmYWxpYXMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNb3ZpZUltcG9ydFNldE1lZGlhRmlsZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlhcyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmFsaWFzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTW92aWVJbXBvcnRTZXRNZWRpYUZpbGUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01vdmllSW1wb3J0U2V0RGltZW5zaW9ucyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNb3ZpZUltcG9ydENvbXBvbmVudCBjaTsKLQlGaXhlZCB3aWR0aDsKLQlGaXhlZCBoZWlnaHQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTW92aWVJbXBvcnRDb21wb25lbnQgY2k7CisgICAgRml4ZWQgd2lkdGg7CisgICAgRml4ZWQgaGVpZ2h0OwogI2lmbmRlZiBNb3ZpZUltcG9ydFNldERpbWVuc2lvbnMKLQlQeU1hY19QUkVDSEVDSyhNb3ZpZUltcG9ydFNldERpbWVuc2lvbnMpOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmllSW1wb3J0U2V0RGltZW5zaW9ucyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZ3aWR0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZoZWlnaHQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNb3ZpZUltcG9ydFNldERpbWVuc2lvbnMoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJndpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJmhlaWdodCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1vdmllSW1wb3J0U2V0RGltZW5zaW9ucyhjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTW92aWVJbXBvcnRTZXRDaHVua1NpemUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTW92aWVJbXBvcnRDb21wb25lbnQgY2k7Ci0JbG9uZyBjaHVua1NpemU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTW92aWVJbXBvcnRDb21wb25lbnQgY2k7CisgICAgbG9uZyBjaHVua1NpemU7CiAjaWZuZGVmIE1vdmllSW1wb3J0U2V0Q2h1bmtTaXplCi0JUHlNYWNfUFJFQ0hFQ0soTW92aWVJbXBvcnRTZXRDaHVua1NpemUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmllSW1wb3J0U2V0Q2h1bmtTaXplKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmY2h1bmtTaXplKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTW92aWVJbXBvcnRTZXRDaHVua1NpemUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmtTaXplKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNodW5rU2l6ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1vdmllSW1wb3J0U2V0Q2h1bmtTaXplKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rU2l6ZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTW92aWVJbXBvcnRTZXRBdXhpbGlhcnlEYXRhKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1vdmllSW1wb3J0Q29tcG9uZW50IGNpOwotCUhhbmRsZSBkYXRhOwotCU9TVHlwZSBoYW5kbGVUeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1vdmllSW1wb3J0Q29tcG9uZW50IGNpOworICAgIEhhbmRsZSBkYXRhOworICAgIE9TVHlwZSBoYW5kbGVUeXBlOwogI2lmbmRlZiBNb3ZpZUltcG9ydFNldEF1eGlsaWFyeURhdGEKLQlQeU1hY19QUkVDSEVDSyhNb3ZpZUltcG9ydFNldEF1eGlsaWFyeURhdGEpOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmllSW1wb3J0U2V0QXV4aWxpYXJ5RGF0YSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZoYW5kbGVUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTW92aWVJbXBvcnRTZXRBdXhpbGlhcnlEYXRhKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVUeXBlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZoYW5kbGVUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTW92aWVJbXBvcnRTZXRBdXhpbGlhcnlEYXRhKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVUeXBlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9Nb3ZpZUltcG9ydFNldEZyb21TY3JhcChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNb3ZpZUltcG9ydENvbXBvbmVudCBjaTsKLQlCb29sZWFuIGZyb21TY3JhcDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNb3ZpZUltcG9ydENvbXBvbmVudCBjaTsKKyAgICBCb29sZWFuIGZyb21TY3JhcDsKICNpZm5kZWYgTW92aWVJbXBvcnRTZXRGcm9tU2NyYXAKLQlQeU1hY19QUkVDSEVDSyhNb3ZpZUltcG9ydFNldEZyb21TY3JhcCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTW92aWVJbXBvcnRTZXRGcm9tU2NyYXApOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZmcm9tU2NyYXApKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNb3ZpZUltcG9ydFNldEZyb21TY3JhcChjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tU2NyYXApOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZnJvbVNjcmFwKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTW92aWVJbXBvcnRTZXRGcm9tU2NyYXAoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbVNjcmFwKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9Nb3ZpZUltcG9ydERvVXNlckRpYWxvZyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNb3ZpZUltcG9ydENvbXBvbmVudCBjaTsKLQlGU1NwZWMgdGhlRmlsZTsKLQlIYW5kbGUgdGhlRGF0YTsKLQlCb29sZWFuIGNhbmNlbGVkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1vdmllSW1wb3J0Q29tcG9uZW50IGNpOworICAgIEZTU3BlYyB0aGVGaWxlOworICAgIEhhbmRsZSB0aGVEYXRhOworICAgIEJvb2xlYW4gY2FuY2VsZWQ7CiAjaWZuZGVmIE1vdmllSW1wb3J0RG9Vc2VyRGlhbG9nCi0JUHlNYWNfUFJFQ0hFQ0soTW92aWVJbXBvcnREb1VzZXJEaWFsb2cpOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmllSW1wb3J0RG9Vc2VyRGlhbG9nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZ0aGVGaWxlLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZURhdGEpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNb3ZpZUltcG9ydERvVXNlckRpYWxvZyhjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlRmlsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVEYXRhLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjYW5jZWxlZCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgY2FuY2VsZWQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZ0aGVGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZURhdGEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNb3ZpZUltcG9ydERvVXNlckRpYWxvZyhjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjYW5jZWxlZCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsZWQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01vdmllSW1wb3J0U2V0RHVyYXRpb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTW92aWVJbXBvcnRDb21wb25lbnQgY2k7Ci0JVGltZVZhbHVlIGR1cmF0aW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1vdmllSW1wb3J0Q29tcG9uZW50IGNpOworICAgIFRpbWVWYWx1ZSBkdXJhdGlvbjsKICNpZm5kZWYgTW92aWVJbXBvcnRTZXREdXJhdGlvbgotCVB5TWFjX1BSRUNIRUNLKE1vdmllSW1wb3J0U2V0RHVyYXRpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmllSW1wb3J0U2V0RHVyYXRpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1vdmllSW1wb3J0U2V0RHVyYXRpb24oY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1vdmllSW1wb3J0U2V0RHVyYXRpb24oY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTW92aWVJbXBvcnRHZXRBdXhpbGlhcnlEYXRhVHlwZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNb3ZpZUltcG9ydENvbXBvbmVudCBjaTsKLQlPU1R5cGUgYXV4VHlwZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNb3ZpZUltcG9ydENvbXBvbmVudCBjaTsKKyAgICBPU1R5cGUgYXV4VHlwZTsKICNpZm5kZWYgTW92aWVJbXBvcnRHZXRBdXhpbGlhcnlEYXRhVHlwZQotCVB5TWFjX1BSRUNIRUNLKE1vdmllSW1wb3J0R2V0QXV4aWxpYXJ5RGF0YVR5cGUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmllSW1wb3J0R2V0QXV4aWxpYXJ5RGF0YVR5cGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1vdmllSW1wb3J0R2V0QXV4aWxpYXJ5RGF0YVR5cGUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXV4VHlwZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBhdXhUeXBlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTW92aWVJbXBvcnRHZXRBdXhpbGlhcnlEYXRhVHlwZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhdXhUeXBlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIGF1eFR5cGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01vdmllSW1wb3J0VmFsaWRhdGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTW92aWVJbXBvcnRDb21wb25lbnQgY2k7Ci0JRlNTcGVjIHRoZUZpbGU7Ci0JSGFuZGxlIHRoZURhdGE7Ci0JQm9vbGVhbiB2YWxpZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNb3ZpZUltcG9ydENvbXBvbmVudCBjaTsKKyAgICBGU1NwZWMgdGhlRmlsZTsKKyAgICBIYW5kbGUgdGhlRGF0YTsKKyAgICBCb29sZWFuIHZhbGlkOwogI2lmbmRlZiBNb3ZpZUltcG9ydFZhbGlkYXRlCi0JUHlNYWNfUFJFQ0hFQ0soTW92aWVJbXBvcnRWYWxpZGF0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTW92aWVJbXBvcnRWYWxpZGF0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmdGhlRmlsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVEYXRhKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTW92aWVJbXBvcnRWYWxpZGF0ZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVGaWxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlRGF0YSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWxpZCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgdmFsaWQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZ0aGVGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZURhdGEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNb3ZpZUltcG9ydFZhbGlkYXRlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbGlkKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTW92aWVJbXBvcnRHZXRGaWxlVHlwZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNb3ZpZUltcG9ydENvbXBvbmVudCBjaTsKLQlPU1R5cGUgZmlsZVR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTW92aWVJbXBvcnRDb21wb25lbnQgY2k7CisgICAgT1NUeXBlIGZpbGVUeXBlOwogI2lmbmRlZiBNb3ZpZUltcG9ydEdldEZpbGVUeXBlCi0JUHlNYWNfUFJFQ0hFQ0soTW92aWVJbXBvcnRHZXRGaWxlVHlwZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTW92aWVJbXBvcnRHZXRGaWxlVHlwZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTW92aWVJbXBvcnRHZXRGaWxlVHlwZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWxlVHlwZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBmaWxlVHlwZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1vdmllSW1wb3J0R2V0RmlsZVR5cGUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlsZVR5cGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgZmlsZVR5cGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01vdmllSW1wb3J0RGF0YVJlZihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNb3ZpZUltcG9ydENvbXBvbmVudCBjaTsKLQlIYW5kbGUgZGF0YVJlZjsKLQlPU1R5cGUgZGF0YVJlZlR5cGU7Ci0JTW92aWUgdGhlTW92aWU7Ci0JVHJhY2sgdGFyZ2V0VHJhY2s7Ci0JVHJhY2sgdXNlZFRyYWNrOwotCVRpbWVWYWx1ZSBhdFRpbWU7Ci0JVGltZVZhbHVlIGFkZGVkRHVyYXRpb247Ci0JbG9uZyBpbkZsYWdzOwotCWxvbmcgb3V0RmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTW92aWVJbXBvcnRDb21wb25lbnQgY2k7CisgICAgSGFuZGxlIGRhdGFSZWY7CisgICAgT1NUeXBlIGRhdGFSZWZUeXBlOworICAgIE1vdmllIHRoZU1vdmllOworICAgIFRyYWNrIHRhcmdldFRyYWNrOworICAgIFRyYWNrIHVzZWRUcmFjazsKKyAgICBUaW1lVmFsdWUgYXRUaW1lOworICAgIFRpbWVWYWx1ZSBhZGRlZER1cmF0aW9uOworICAgIGxvbmcgaW5GbGFnczsKKyAgICBsb25nIG91dEZsYWdzOwogI2lmbmRlZiBNb3ZpZUltcG9ydERhdGFSZWYKLQlQeU1hY19QUkVDSEVDSyhNb3ZpZUltcG9ydERhdGFSZWYpOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmllSW1wb3J0RGF0YVJlZik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJk8mbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkYXRhUmVmVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfQ29udmVydCwgJnRoZU1vdmllLAotCSAgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9Db252ZXJ0LCAmdGFyZ2V0VHJhY2ssCi0JICAgICAgICAgICAgICAgICAgICAgICZhdFRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTW92aWVJbXBvcnREYXRhUmVmKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgdGhlTW92aWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFRyYWNrLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmdXNlZFRyYWNrLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBhdFRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZhZGRlZER1cmF0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBpbkZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0RmxhZ3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFRyYWNrT2JqX05ldywgdXNlZFRyYWNrLAotCSAgICAgICAgICAgICAgICAgICAgIGFkZGVkRHVyYXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgb3V0RmxhZ3MpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJk8mTyZsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRhdGFSZWZUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9Db252ZXJ0LCAmdGhlTW92aWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYWNrT2JqX0NvbnZlcnQsICZ0YXJnZXRUcmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmF0VGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluRmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNb3ZpZUltcG9ydERhdGFSZWYoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWZUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVNb3ZpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0VHJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1c2VkVHJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0VGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFkZGVkRHVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRGbGFncyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJmxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfTmV3LCB1c2VkVHJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgYWRkZWREdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRGbGFncyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTW92aWVJbXBvcnRHZXRTYW1wbGVEZXNjcmlwdGlvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNb3ZpZUltcG9ydENvbXBvbmVudCBjaTsKLQlTYW1wbGVEZXNjcmlwdGlvbkhhbmRsZSBkZXNjOwotCU9TVHlwZSBtZWRpYVR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTW92aWVJbXBvcnRDb21wb25lbnQgY2k7CisgICAgU2FtcGxlRGVzY3JpcHRpb25IYW5kbGUgZGVzYzsKKyAgICBPU1R5cGUgbWVkaWFUeXBlOwogI2lmbmRlZiBNb3ZpZUltcG9ydEdldFNhbXBsZURlc2NyaXB0aW9uCi0JUHlNYWNfUFJFQ0hFQ0soTW92aWVJbXBvcnRHZXRTYW1wbGVEZXNjcmlwdGlvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTW92aWVJbXBvcnRHZXRTYW1wbGVEZXNjcmlwdGlvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTW92aWVJbXBvcnRHZXRTYW1wbGVEZXNjcmlwdGlvbihjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXNjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lZGlhVHlwZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgZGVzYywKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgbWVkaWFUeXBlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTW92aWVJbXBvcnRHZXRTYW1wbGVEZXNjcmlwdGlvbihjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lZGlhVHlwZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgbWVkaWFUeXBlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9Nb3ZpZUltcG9ydFNldE9mZnNldEFuZExpbWl0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1vdmllSW1wb3J0Q29tcG9uZW50IGNpOwotCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OwotCXVuc2lnbmVkIGxvbmcgbGltaXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTW92aWVJbXBvcnRDb21wb25lbnQgY2k7CisgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisgICAgdW5zaWduZWQgbG9uZyBsaW1pdDsKICNpZm5kZWYgTW92aWVJbXBvcnRTZXRPZmZzZXRBbmRMaW1pdAotCVB5TWFjX1BSRUNIRUNLKE1vdmllSW1wb3J0U2V0T2Zmc2V0QW5kTGltaXQpOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmllSW1wb3J0U2V0T2Zmc2V0QW5kTGltaXQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAmbGltaXQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNb3ZpZUltcG9ydFNldE9mZnNldEFuZExpbWl0KGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmxpbWl0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTW92aWVJbXBvcnRTZXRPZmZzZXRBbmRMaW1pdChjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9Nb3ZpZUltcG9ydFNldE9mZnNldEFuZExpbWl0NjQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTW92aWVJbXBvcnRDb21wb25lbnQgY2k7Ci0Jd2lkZSBvZmZzZXQ7Ci0Jd2lkZSBsaW1pdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNb3ZpZUltcG9ydENvbXBvbmVudCBjaTsKKyAgICB3aWRlIG9mZnNldDsKKyAgICB3aWRlIGxpbWl0OwogI2lmbmRlZiBNb3ZpZUltcG9ydFNldE9mZnNldEFuZExpbWl0NjQKLQlQeU1hY19QUkVDSEVDSyhNb3ZpZUltcG9ydFNldE9mZnNldEFuZExpbWl0NjQpOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmllSW1wb3J0U2V0T2Zmc2V0QW5kTGltaXQ2NCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0d2lkZSwgJm9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0d2lkZSwgJmxpbWl0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTW92aWVJbXBvcnRTZXRPZmZzZXRBbmRMaW1pdDY0KGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGltaXQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXR3aWRlLCAmb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXR3aWRlLCAmbGltaXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNb3ZpZUltcG9ydFNldE9mZnNldEFuZExpbWl0NjQoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsaW1pdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTW92aWVJbXBvcnRJZGxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1vdmllSW1wb3J0Q29tcG9uZW50IGNpOwotCWxvbmcgaW5GbGFnczsKLQlsb25nIG91dEZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1vdmllSW1wb3J0Q29tcG9uZW50IGNpOworICAgIGxvbmcgaW5GbGFnczsKKyAgICBsb25nIG91dEZsYWdzOwogI2lmbmRlZiBNb3ZpZUltcG9ydElkbGUKLQlQeU1hY19QUkVDSEVDSyhNb3ZpZUltcG9ydElkbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmllSW1wb3J0SWRsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluRmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNb3ZpZUltcG9ydElkbGUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIGluRmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICZvdXRGbGFncyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0RmxhZ3MpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5GbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1vdmllSW1wb3J0SWRsZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW5GbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEZsYWdzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRGbGFncyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTW92aWVJbXBvcnRWYWxpZGF0ZURhdGFSZWYoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTW92aWVJbXBvcnRDb21wb25lbnQgY2k7Ci0JSGFuZGxlIGRhdGFSZWY7Ci0JT1NUeXBlIGRhdGFSZWZUeXBlOwotCVVJbnQ4IHZhbGlkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1vdmllSW1wb3J0Q29tcG9uZW50IGNpOworICAgIEhhbmRsZSBkYXRhUmVmOworICAgIE9TVHlwZSBkYXRhUmVmVHlwZTsKKyAgICBVSW50OCB2YWxpZDsKICNpZm5kZWYgTW92aWVJbXBvcnRWYWxpZGF0ZURhdGFSZWYKLQlQeU1hY19QUkVDSEVDSyhNb3ZpZUltcG9ydFZhbGlkYXRlRGF0YVJlZik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTW92aWVJbXBvcnRWYWxpZGF0ZURhdGFSZWYpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGF0YVJlZlR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNb3ZpZUltcG9ydFZhbGlkYXRlRGF0YVJlZihjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWZUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWxpZCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgdmFsaWQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRhdGFSZWZUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTW92aWVJbXBvcnRWYWxpZGF0ZURhdGFSZWYoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsaWQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9Nb3ZpZUltcG9ydEdldExvYWRTdGF0ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNb3ZpZUltcG9ydENvbXBvbmVudCBjaTsKLQlsb25nIGltcG9ydGVyTG9hZFN0YXRlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1vdmllSW1wb3J0Q29tcG9uZW50IGNpOworICAgIGxvbmcgaW1wb3J0ZXJMb2FkU3RhdGU7CiAjaWZuZGVmIE1vdmllSW1wb3J0R2V0TG9hZFN0YXRlCi0JUHlNYWNfUFJFQ0hFQ0soTW92aWVJbXBvcnRHZXRMb2FkU3RhdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmllSW1wb3J0R2V0TG9hZFN0YXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNb3ZpZUltcG9ydEdldExvYWRTdGF0ZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW1wb3J0ZXJMb2FkU3RhdGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGltcG9ydGVyTG9hZFN0YXRlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTW92aWVJbXBvcnRHZXRMb2FkU3RhdGUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmltcG9ydGVyTG9hZFN0YXRlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnRlckxvYWRTdGF0ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTW92aWVJbXBvcnRHZXRNYXhMb2FkZWRUaW1lKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1vdmllSW1wb3J0Q29tcG9uZW50IGNpOwotCVRpbWVWYWx1ZSB0aW1lOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1vdmllSW1wb3J0Q29tcG9uZW50IGNpOworICAgIFRpbWVWYWx1ZSB0aW1lOwogI2lmbmRlZiBNb3ZpZUltcG9ydEdldE1heExvYWRlZFRpbWUKLQlQeU1hY19QUkVDSEVDSyhNb3ZpZUltcG9ydEdldE1heExvYWRlZFRpbWUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmllSW1wb3J0R2V0TWF4TG9hZGVkVGltZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTW92aWVJbXBvcnRHZXRNYXhMb2FkZWRUaW1lKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGltZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgdGltZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1vdmllSW1wb3J0R2V0TWF4TG9hZGVkVGltZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRpbWUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01vdmllSW1wb3J0RXN0aW1hdGVDb21wbGV0aW9uVGltZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNb3ZpZUltcG9ydENvbXBvbmVudCBjaTsKLQlUaW1lUmVjb3JkIHRpbWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTW92aWVJbXBvcnRDb21wb25lbnQgY2k7CisgICAgVGltZVJlY29yZCB0aW1lOwogI2lmbmRlZiBNb3ZpZUltcG9ydEVzdGltYXRlQ29tcGxldGlvblRpbWUKLQlQeU1hY19QUkVDSEVDSyhNb3ZpZUltcG9ydEVzdGltYXRlQ29tcGxldGlvblRpbWUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmllSW1wb3J0RXN0aW1hdGVDb21wbGV0aW9uVGltZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTW92aWVJbXBvcnRFc3RpbWF0ZUNvbXBsZXRpb25UaW1lKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGltZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFF0VGltZVJlY29yZF9OZXcsICZ0aW1lKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTW92aWVJbXBvcnRFc3RpbWF0ZUNvbXBsZXRpb25UaW1lKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGltZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFF0VGltZVJlY29yZF9OZXcsICZ0aW1lKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9Nb3ZpZUltcG9ydFNldERvbnRCbG9jayhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNb3ZpZUltcG9ydENvbXBvbmVudCBjaTsKLQlCb29sZWFuIGRvbnRCbG9jazsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNb3ZpZUltcG9ydENvbXBvbmVudCBjaTsKKyAgICBCb29sZWFuIGRvbnRCbG9jazsKICNpZm5kZWYgTW92aWVJbXBvcnRTZXREb250QmxvY2sKLQlQeU1hY19QUkVDSEVDSyhNb3ZpZUltcG9ydFNldERvbnRCbG9jayk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTW92aWVJbXBvcnRTZXREb250QmxvY2spOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZkb250QmxvY2spKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNb3ZpZUltcG9ydFNldERvbnRCbG9jayhjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb250QmxvY2spOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZG9udEJsb2NrKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTW92aWVJbXBvcnRTZXREb250QmxvY2soY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9udEJsb2NrKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9Nb3ZpZUltcG9ydEdldERvbnRCbG9jayhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNb3ZpZUltcG9ydENvbXBvbmVudCBjaTsKLQlCb29sZWFuIHdpbGxCbG9jazsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNb3ZpZUltcG9ydENvbXBvbmVudCBjaTsKKyAgICBCb29sZWFuIHdpbGxCbG9jazsKICNpZm5kZWYgTW92aWVJbXBvcnRHZXREb250QmxvY2sKLQlQeU1hY19QUkVDSEVDSyhNb3ZpZUltcG9ydEdldERvbnRCbG9jayk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTW92aWVJbXBvcnRHZXREb250QmxvY2spOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1vdmllSW1wb3J0R2V0RG9udEJsb2NrKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3aWxsQmxvY2spOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHdpbGxCbG9jayk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1vdmllSW1wb3J0R2V0RG9udEJsb2NrKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3aWxsQmxvY2spOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGxCbG9jayk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTW92aWVJbXBvcnRTZXRJZGxlTWFuYWdlcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNb3ZpZUltcG9ydENvbXBvbmVudCBjaTsKLQlJZGxlTWFuYWdlciBpbTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNb3ZpZUltcG9ydENvbXBvbmVudCBjaTsKKyAgICBJZGxlTWFuYWdlciBpbTsKICNpZm5kZWYgTW92aWVJbXBvcnRTZXRJZGxlTWFuYWdlcgotCVB5TWFjX1BSRUNIRUNLKE1vdmllSW1wb3J0U2V0SWRsZU1hbmFnZXIpOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmllSW1wb3J0U2V0SWRsZU1hbmFnZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBJZGxlTWFuYWdlck9ial9Db252ZXJ0LCAmaW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNb3ZpZUltcG9ydFNldElkbGVNYW5hZ2VyKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW0pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSWRsZU1hbmFnZXJPYmpfQ29udmVydCwgJmltKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTW92aWVJbXBvcnRTZXRJZGxlTWFuYWdlcihjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9Nb3ZpZUltcG9ydFNldE5ld01vdmllRmxhZ3MoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTW92aWVJbXBvcnRDb21wb25lbnQgY2k7Ci0JbG9uZyBuZXdNb3ZpZUZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1vdmllSW1wb3J0Q29tcG9uZW50IGNpOworICAgIGxvbmcgbmV3TW92aWVGbGFnczsKICNpZm5kZWYgTW92aWVJbXBvcnRTZXROZXdNb3ZpZUZsYWdzCi0JUHlNYWNfUFJFQ0hFQ0soTW92aWVJbXBvcnRTZXROZXdNb3ZpZUZsYWdzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNb3ZpZUltcG9ydFNldE5ld01vdmllRmxhZ3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZuZXdNb3ZpZUZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTW92aWVJbXBvcnRTZXROZXdNb3ZpZUZsYWdzKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdNb3ZpZUZsYWdzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld01vdmllRmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNb3ZpZUltcG9ydFNldE5ld01vdmllRmxhZ3MoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld01vdmllRmxhZ3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01vdmllSW1wb3J0R2V0RGVzdGluYXRpb25NZWRpYVR5cGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTW92aWVJbXBvcnRDb21wb25lbnQgY2k7Ci0JT1NUeXBlIG1lZGlhVHlwZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNb3ZpZUltcG9ydENvbXBvbmVudCBjaTsKKyAgICBPU1R5cGUgbWVkaWFUeXBlOwogI2lmbmRlZiBNb3ZpZUltcG9ydEdldERlc3RpbmF0aW9uTWVkaWFUeXBlCi0JUHlNYWNfUFJFQ0hFQ0soTW92aWVJbXBvcnRHZXREZXN0aW5hdGlvbk1lZGlhVHlwZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTW92aWVJbXBvcnRHZXREZXN0aW5hdGlvbk1lZGlhVHlwZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTW92aWVJbXBvcnRHZXREZXN0aW5hdGlvbk1lZGlhVHlwZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZWRpYVR5cGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgbWVkaWFUeXBlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTW92aWVJbXBvcnRHZXREZXN0aW5hdGlvbk1lZGlhVHlwZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZWRpYVR5cGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgbWVkaWFUeXBlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9Nb3ZpZUV4cG9ydFRvSGFuZGxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1vdmllRXhwb3J0Q29tcG9uZW50IGNpOwotCUhhbmRsZSBkYXRhSDsKLQlNb3ZpZSB0aGVNb3ZpZTsKLQlUcmFjayBvbmx5VGhpc1RyYWNrOwotCVRpbWVWYWx1ZSBzdGFydFRpbWU7Ci0JVGltZVZhbHVlIGR1cmF0aW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1vdmllRXhwb3J0Q29tcG9uZW50IGNpOworICAgIEhhbmRsZSBkYXRhSDsKKyAgICBNb3ZpZSB0aGVNb3ZpZTsKKyAgICBUcmFjayBvbmx5VGhpc1RyYWNrOworICAgIFRpbWVWYWx1ZSBzdGFydFRpbWU7CisgICAgVGltZVZhbHVlIGR1cmF0aW9uOwogI2lmbmRlZiBNb3ZpZUV4cG9ydFRvSGFuZGxlCi0JUHlNYWNfUFJFQ0hFQ0soTW92aWVFeHBvcnRUb0hhbmRsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTW92aWVFeHBvcnRUb0hhbmRsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJmxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YUgsCi0JICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX0NvbnZlcnQsICZ0aGVNb3ZpZSwKLQkgICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfQ29udmVydCwgJm9ubHlUaGlzVHJhY2ssCi0JICAgICAgICAgICAgICAgICAgICAgICZzdGFydFRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1vdmllRXhwb3J0VG9IYW5kbGUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhSCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZU1vdmllLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgb25seVRoaXNUcmFjaywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJmxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YUgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX0NvbnZlcnQsICZ0aGVNb3ZpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfQ29udmVydCwgJm9ubHlUaGlzVHJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGFydFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1vdmllRXhwb3J0VG9IYW5kbGUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZU1vdmllLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25seVRoaXNUcmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9Nb3ZpZUV4cG9ydFRvRmlsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNb3ZpZUV4cG9ydENvbXBvbmVudCBjaTsKLQlGU1NwZWMgdGhlRmlsZTsKLQlNb3ZpZSB0aGVNb3ZpZTsKLQlUcmFjayBvbmx5VGhpc1RyYWNrOwotCVRpbWVWYWx1ZSBzdGFydFRpbWU7Ci0JVGltZVZhbHVlIGR1cmF0aW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1vdmllRXhwb3J0Q29tcG9uZW50IGNpOworICAgIEZTU3BlYyB0aGVGaWxlOworICAgIE1vdmllIHRoZU1vdmllOworICAgIFRyYWNrIG9ubHlUaGlzVHJhY2s7CisgICAgVGltZVZhbHVlIHN0YXJ0VGltZTsKKyAgICBUaW1lVmFsdWUgZHVyYXRpb247CiAjaWZuZGVmIE1vdmllRXhwb3J0VG9GaWxlCi0JUHlNYWNfUFJFQ0hFQ0soTW92aWVFeHBvcnRUb0ZpbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmllRXhwb3J0VG9GaWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJk8mbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmdGhlRmlsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfQ29udmVydCwgJnRoZU1vdmllLAotCSAgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9Db252ZXJ0LCAmb25seVRoaXNUcmFjaywKLQkgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0VGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmR1cmF0aW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTW92aWVFeHBvcnRUb0ZpbGUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUZpbGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgdGhlTW92aWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgb25seVRoaXNUcmFjaywKLQkgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJk8mbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmdGhlRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfQ29udmVydCwgJnRoZU1vdmllLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9Db252ZXJ0LCAmb25seVRoaXNUcmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0VGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmR1cmF0aW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTW92aWVFeHBvcnRUb0ZpbGUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlTW92aWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25seVRoaXNUcmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01vdmllRXhwb3J0R2V0QXV4aWxpYXJ5RGF0YShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNb3ZpZUV4cG9ydENvbXBvbmVudCBjaTsKLQlIYW5kbGUgZGF0YUg7Ci0JT1NUeXBlIGhhbmRsZVR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTW92aWVFeHBvcnRDb21wb25lbnQgY2k7CisgICAgSGFuZGxlIGRhdGFIOworICAgIE9TVHlwZSBoYW5kbGVUeXBlOwogI2lmbmRlZiBNb3ZpZUV4cG9ydEdldEF1eGlsaWFyeURhdGEKLQlQeU1hY19QUkVDSEVDSyhNb3ZpZUV4cG9ydEdldEF1eGlsaWFyeURhdGEpOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmllRXhwb3J0R2V0QXV4aWxpYXJ5RGF0YSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YUgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNb3ZpZUV4cG9ydEdldEF1eGlsaWFyeURhdGEoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFILAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaGFuZGxlVHlwZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBoYW5kbGVUeXBlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YUgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNb3ZpZUV4cG9ydEdldEF1eGlsaWFyeURhdGEoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaGFuZGxlVHlwZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBoYW5kbGVUeXBlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9Nb3ZpZUV4cG9ydFNldFNhbXBsZURlc2NyaXB0aW9uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1vdmllRXhwb3J0Q29tcG9uZW50IGNpOwotCVNhbXBsZURlc2NyaXB0aW9uSGFuZGxlIGRlc2M7Ci0JT1NUeXBlIG1lZGlhVHlwZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNb3ZpZUV4cG9ydENvbXBvbmVudCBjaTsKKyAgICBTYW1wbGVEZXNjcmlwdGlvbkhhbmRsZSBkZXNjOworICAgIE9TVHlwZSBtZWRpYVR5cGU7CiAjaWZuZGVmIE1vdmllRXhwb3J0U2V0U2FtcGxlRGVzY3JpcHRpb24KLQlQeU1hY19QUkVDSEVDSyhNb3ZpZUV4cG9ydFNldFNhbXBsZURlc2NyaXB0aW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNb3ZpZUV4cG9ydFNldFNhbXBsZURlc2NyaXB0aW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRlc2MsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJm1lZGlhVHlwZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1vdmllRXhwb3J0U2V0U2FtcGxlRGVzY3JpcHRpb24oY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFUeXBlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZtZWRpYVR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNb3ZpZUV4cG9ydFNldFNhbXBsZURlc2NyaXB0aW9uKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhVHlwZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTW92aWVFeHBvcnREb1VzZXJEaWFsb2coUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTW92aWVFeHBvcnRDb21wb25lbnQgY2k7Ci0JTW92aWUgdGhlTW92aWU7Ci0JVHJhY2sgb25seVRoaXNUcmFjazsKLQlUaW1lVmFsdWUgc3RhcnRUaW1lOwotCVRpbWVWYWx1ZSBkdXJhdGlvbjsKLQlCb29sZWFuIGNhbmNlbGVkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1vdmllRXhwb3J0Q29tcG9uZW50IGNpOworICAgIE1vdmllIHRoZU1vdmllOworICAgIFRyYWNrIG9ubHlUaGlzVHJhY2s7CisgICAgVGltZVZhbHVlIHN0YXJ0VGltZTsKKyAgICBUaW1lVmFsdWUgZHVyYXRpb247CisgICAgQm9vbGVhbiBjYW5jZWxlZDsKICNpZm5kZWYgTW92aWVFeHBvcnREb1VzZXJEaWFsb2cKLQlQeU1hY19QUkVDSEVDSyhNb3ZpZUV4cG9ydERvVXNlckRpYWxvZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTW92aWVFeHBvcnREb1VzZXJEaWFsb2cpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfQ29udmVydCwgJnRoZU1vdmllLAotCSAgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9Db252ZXJ0LCAmb25seVRoaXNUcmFjaywKLQkgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0VGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmR1cmF0aW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTW92aWVFeHBvcnREb1VzZXJEaWFsb2coY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlTW92aWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25seVRoaXNUcmFjaywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNhbmNlbGVkKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBjYW5jZWxlZCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfQ29udmVydCwgJnRoZU1vdmllLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9Db252ZXJ0LCAmb25seVRoaXNUcmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0VGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmR1cmF0aW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTW92aWVFeHBvcnREb1VzZXJEaWFsb2coY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlTW92aWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25seVRoaXNUcmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNhbmNlbGVkKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxlZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTW92aWVFeHBvcnRHZXRDcmVhdG9yVHlwZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNb3ZpZUV4cG9ydENvbXBvbmVudCBjaTsKLQlPU1R5cGUgY3JlYXRvcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNb3ZpZUV4cG9ydENvbXBvbmVudCBjaTsKKyAgICBPU1R5cGUgY3JlYXRvcjsKICNpZm5kZWYgTW92aWVFeHBvcnRHZXRDcmVhdG9yVHlwZQotCVB5TWFjX1BSRUNIRUNLKE1vdmllRXhwb3J0R2V0Q3JlYXRvclR5cGUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmllRXhwb3J0R2V0Q3JlYXRvclR5cGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1vdmllRXhwb3J0R2V0Q3JlYXRvclR5cGUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3JlYXRvcik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBjcmVhdG9yKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTW92aWVFeHBvcnRHZXRDcmVhdG9yVHlwZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjcmVhdG9yKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIGNyZWF0b3IpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01vdmllRXhwb3J0VG9EYXRhUmVmKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1vdmllRXhwb3J0Q29tcG9uZW50IGNpOwotCUhhbmRsZSBkYXRhUmVmOwotCU9TVHlwZSBkYXRhUmVmVHlwZTsKLQlNb3ZpZSB0aGVNb3ZpZTsKLQlUcmFjayBvbmx5VGhpc1RyYWNrOwotCVRpbWVWYWx1ZSBzdGFydFRpbWU7Ci0JVGltZVZhbHVlIGR1cmF0aW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1vdmllRXhwb3J0Q29tcG9uZW50IGNpOworICAgIEhhbmRsZSBkYXRhUmVmOworICAgIE9TVHlwZSBkYXRhUmVmVHlwZTsKKyAgICBNb3ZpZSB0aGVNb3ZpZTsKKyAgICBUcmFjayBvbmx5VGhpc1RyYWNrOworICAgIFRpbWVWYWx1ZSBzdGFydFRpbWU7CisgICAgVGltZVZhbHVlIGR1cmF0aW9uOwogI2lmbmRlZiBNb3ZpZUV4cG9ydFRvRGF0YVJlZgotCVB5TWFjX1BSRUNIRUNLKE1vdmllRXhwb3J0VG9EYXRhUmVmKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNb3ZpZUV4cG9ydFRvRGF0YVJlZik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJk8mbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkYXRhUmVmVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfQ29udmVydCwgJnRoZU1vdmllLAotCSAgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9Db252ZXJ0LCAmb25seVRoaXNUcmFjaywKLQkgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0VGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmR1cmF0aW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTW92aWVFeHBvcnRUb0RhdGFSZWYoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVNb3ZpZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5VGhpc1RyYWNrLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mTyZPJmxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGF0YVJlZlR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX0NvbnZlcnQsICZ0aGVNb3ZpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfQ29udmVydCwgJm9ubHlUaGlzVHJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGFydFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1vdmllRXhwb3J0VG9EYXRhUmVmKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZlR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlTW92aWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25seVRoaXNUcmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01vdmllRXhwb3J0RnJvbVByb2NlZHVyZXNUb0RhdGFSZWYoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTW92aWVFeHBvcnRDb21wb25lbnQgY2k7Ci0JSGFuZGxlIGRhdGFSZWY7Ci0JT1NUeXBlIGRhdGFSZWZUeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1vdmllRXhwb3J0Q29tcG9uZW50IGNpOworICAgIEhhbmRsZSBkYXRhUmVmOworICAgIE9TVHlwZSBkYXRhUmVmVHlwZTsKICNpZm5kZWYgTW92aWVFeHBvcnRGcm9tUHJvY2VkdXJlc1RvRGF0YVJlZgotCVB5TWFjX1BSRUNIRUNLKE1vdmllRXhwb3J0RnJvbVByb2NlZHVyZXNUb0RhdGFSZWYpOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmllRXhwb3J0RnJvbVByb2NlZHVyZXNUb0RhdGFSZWYpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGF0YVJlZlR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNb3ZpZUV4cG9ydEZyb21Qcm9jZWR1cmVzVG9EYXRhUmVmKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWZUeXBlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkYXRhUmVmVHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1vdmllRXhwb3J0RnJvbVByb2NlZHVyZXNUb0RhdGFSZWYoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZlR5cGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01vdmllRXhwb3J0VmFsaWRhdGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTW92aWVFeHBvcnRDb21wb25lbnQgY2k7Ci0JTW92aWUgdGhlTW92aWU7Ci0JVHJhY2sgb25seVRoaXNUcmFjazsKLQlCb29sZWFuIHZhbGlkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1vdmllRXhwb3J0Q29tcG9uZW50IGNpOworICAgIE1vdmllIHRoZU1vdmllOworICAgIFRyYWNrIG9ubHlUaGlzVHJhY2s7CisgICAgQm9vbGVhbiB2YWxpZDsKICNpZm5kZWYgTW92aWVFeHBvcnRWYWxpZGF0ZQotCVB5TWFjX1BSRUNIRUNLKE1vdmllRXhwb3J0VmFsaWRhdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmllRXhwb3J0VmFsaWRhdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX0NvbnZlcnQsICZ0aGVNb3ZpZSwKLQkgICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfQ29udmVydCwgJm9ubHlUaGlzVHJhY2spKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNb3ZpZUV4cG9ydFZhbGlkYXRlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlTW92aWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5VGhpc1RyYWNrLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbGlkKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICB2YWxpZCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX0NvbnZlcnQsICZ0aGVNb3ZpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfQ29udmVydCwgJm9ubHlUaGlzVHJhY2spKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNb3ZpZUV4cG9ydFZhbGlkYXRlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlTW92aWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5VGhpc1RyYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbGlkKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTW92aWVFeHBvcnRHZXRGaWxlTmFtZUV4dGVuc2lvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNb3ZpZUV4cG9ydENvbXBvbmVudCBjaTsKLQlPU1R5cGUgZXh0ZW5zaW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1vdmllRXhwb3J0Q29tcG9uZW50IGNpOworICAgIE9TVHlwZSBleHRlbnNpb247CiAjaWZuZGVmIE1vdmllRXhwb3J0R2V0RmlsZU5hbWVFeHRlbnNpb24KLQlQeU1hY19QUkVDSEVDSyhNb3ZpZUV4cG9ydEdldEZpbGVOYW1lRXh0ZW5zaW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNb3ZpZUV4cG9ydEdldEZpbGVOYW1lRXh0ZW5zaW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNb3ZpZUV4cG9ydEdldEZpbGVOYW1lRXh0ZW5zaW9uKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmV4dGVuc2lvbik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBleHRlbnNpb24pOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNb3ZpZUV4cG9ydEdldEZpbGVOYW1lRXh0ZW5zaW9uKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmV4dGVuc2lvbik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBleHRlbnNpb24pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01vdmllRXhwb3J0R2V0U2hvcnRGaWxlVHlwZVN0cmluZyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNb3ZpZUV4cG9ydENvbXBvbmVudCBjaTsKLQlTdHIyNTUgdHlwZVN0cmluZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNb3ZpZUV4cG9ydENvbXBvbmVudCBjaTsKKyAgICBTdHIyNTUgdHlwZVN0cmluZzsKICNpZm5kZWYgTW92aWVFeHBvcnRHZXRTaG9ydEZpbGVUeXBlU3RyaW5nCi0JUHlNYWNfUFJFQ0hFQ0soTW92aWVFeHBvcnRHZXRTaG9ydEZpbGVUeXBlU3RyaW5nKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNb3ZpZUV4cG9ydEdldFNob3J0RmlsZVR5cGVTdHJpbmcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIHR5cGVTdHJpbmcpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNb3ZpZUV4cG9ydEdldFNob3J0RmlsZVR5cGVTdHJpbmcoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVTdHJpbmcpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCB0eXBlU3RyaW5nKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTW92aWVFeHBvcnRHZXRTaG9ydEZpbGVUeXBlU3RyaW5nKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlU3RyaW5nKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9Nb3ZpZUV4cG9ydEdldFNvdXJjZU1lZGlhVHlwZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNb3ZpZUV4cG9ydENvbXBvbmVudCBjaTsKLQlPU1R5cGUgbWVkaWFUeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1vdmllRXhwb3J0Q29tcG9uZW50IGNpOworICAgIE9TVHlwZSBtZWRpYVR5cGU7CiAjaWZuZGVmIE1vdmllRXhwb3J0R2V0U291cmNlTWVkaWFUeXBlCi0JUHlNYWNfUFJFQ0hFQ0soTW92aWVFeHBvcnRHZXRTb3VyY2VNZWRpYVR5cGUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmllRXhwb3J0R2V0U291cmNlTWVkaWFUeXBlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNb3ZpZUV4cG9ydEdldFNvdXJjZU1lZGlhVHlwZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVkaWFUeXBlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIG1lZGlhVHlwZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1vdmllRXhwb3J0R2V0U291cmNlTWVkaWFUeXBlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZWRpYVR5cGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgbWVkaWFUeXBlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9UZXh0RXhwb3J0R2V0VGltZUZyYWN0aW9uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVRleHRFeHBvcnRDb21wb25lbnQgY2k7Ci0JbG9uZyBtb3ZpZVRpbWVGcmFjdGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBUZXh0RXhwb3J0Q29tcG9uZW50IGNpOworICAgIGxvbmcgbW92aWVUaW1lRnJhY3Rpb247CiAjaWZuZGVmIFRleHRFeHBvcnRHZXRUaW1lRnJhY3Rpb24KLQlQeU1hY19QUkVDSEVDSyhUZXh0RXhwb3J0R2V0VGltZUZyYWN0aW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUZXh0RXhwb3J0R2V0VGltZUZyYWN0aW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBUZXh0RXhwb3J0R2V0VGltZUZyYWN0aW9uKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vdmllVGltZUZyYWN0aW9uKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBtb3ZpZVRpbWVGcmFjdGlvbik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFRleHRFeHBvcnRHZXRUaW1lRnJhY3Rpb24oY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbW92aWVUaW1lRnJhY3Rpb24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIG1vdmllVGltZUZyYWN0aW9uKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9UZXh0RXhwb3J0U2V0VGltZUZyYWN0aW9uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVRleHRFeHBvcnRDb21wb25lbnQgY2k7Ci0JbG9uZyBtb3ZpZVRpbWVGcmFjdGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBUZXh0RXhwb3J0Q29tcG9uZW50IGNpOworICAgIGxvbmcgbW92aWVUaW1lRnJhY3Rpb247CiAjaWZuZGVmIFRleHRFeHBvcnRTZXRUaW1lRnJhY3Rpb24KLQlQeU1hY19QUkVDSEVDSyhUZXh0RXhwb3J0U2V0VGltZUZyYWN0aW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUZXh0RXhwb3J0U2V0VGltZUZyYWN0aW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmbW92aWVUaW1lRnJhY3Rpb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBUZXh0RXhwb3J0U2V0VGltZUZyYWN0aW9uKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW92aWVUaW1lRnJhY3Rpb24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbW92aWVUaW1lRnJhY3Rpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBUZXh0RXhwb3J0U2V0VGltZUZyYWN0aW9uKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW92aWVUaW1lRnJhY3Rpb24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1RleHRFeHBvcnRHZXRTZXR0aW5ncyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlUZXh0RXhwb3J0Q29tcG9uZW50IGNpOwotCWxvbmcgc2V0dGluZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBUZXh0RXhwb3J0Q29tcG9uZW50IGNpOworICAgIGxvbmcgc2V0dGluZzsKICNpZm5kZWYgVGV4dEV4cG9ydEdldFNldHRpbmdzCi0JUHlNYWNfUFJFQ0hFQ0soVGV4dEV4cG9ydEdldFNldHRpbmdzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUZXh0RXhwb3J0R2V0U2V0dGluZ3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFRleHRFeHBvcnRHZXRTZXR0aW5ncyhjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNldHRpbmcpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHNldHRpbmcpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBUZXh0RXhwb3J0R2V0U2V0dGluZ3MoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXR0aW5nKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9UZXh0RXhwb3J0U2V0U2V0dGluZ3MoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVGV4dEV4cG9ydENvbXBvbmVudCBjaTsKLQlsb25nIHNldHRpbmc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVGV4dEV4cG9ydENvbXBvbmVudCBjaTsKKyAgICBsb25nIHNldHRpbmc7CiAjaWZuZGVmIFRleHRFeHBvcnRTZXRTZXR0aW5ncwotCVB5TWFjX1BSRUNIRUNLKFRleHRFeHBvcnRTZXRTZXR0aW5ncyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVGV4dEV4cG9ydFNldFNldHRpbmdzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2V0dGluZykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFRleHRFeHBvcnRTZXRTZXR0aW5ncyhjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXR0aW5nKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVGV4dEV4cG9ydFNldFNldHRpbmdzKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NSURJSW1wb3J0R2V0U2V0dGluZ3MoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVGV4dEV4cG9ydENvbXBvbmVudCBjaTsKLQlsb25nIHNldHRpbmc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVGV4dEV4cG9ydENvbXBvbmVudCBjaTsKKyAgICBsb25nIHNldHRpbmc7CiAjaWZuZGVmIE1JRElJbXBvcnRHZXRTZXR0aW5ncwotCVB5TWFjX1BSRUNIRUNLKE1JRElJbXBvcnRHZXRTZXR0aW5ncyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTUlESUltcG9ydEdldFNldHRpbmdzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNSURJSW1wb3J0R2V0U2V0dGluZ3MoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXR0aW5nKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTUlESUltcG9ydEdldFNldHRpbmdzKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2V0dGluZyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTUlESUltcG9ydFNldFNldHRpbmdzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVRleHRFeHBvcnRDb21wb25lbnQgY2k7Ci0JbG9uZyBzZXR0aW5nOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFRleHRFeHBvcnRDb21wb25lbnQgY2k7CisgICAgbG9uZyBzZXR0aW5nOwogI2lmbmRlZiBNSURJSW1wb3J0U2V0U2V0dGluZ3MKLQlQeU1hY19QUkVDSEVDSyhNSURJSW1wb3J0U2V0U2V0dGluZ3MpOworICAgIFB5TWFjX1BSRUNIRUNLKE1JRElJbXBvcnRTZXRTZXR0aW5ncyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNldHRpbmcpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNSURJSW1wb3J0U2V0U2V0dGluZ3MoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmcpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2V0dGluZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1JRElJbXBvcnRTZXRTZXR0aW5ncyhjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NJbWFnZUltcG9ydFNldFNlcXVlbmNlRW5hYmxlZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljSW1hZ2VNb3ZpZUltcG9ydENvbXBvbmVudCBjaTsKLQlCb29sZWFuIGVuYWJsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljSW1hZ2VNb3ZpZUltcG9ydENvbXBvbmVudCBjaTsKKyAgICBCb29sZWFuIGVuYWJsZTsKICNpZm5kZWYgR3JhcGhpY3NJbWFnZUltcG9ydFNldFNlcXVlbmNlRW5hYmxlZAotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1hZ2VJbXBvcnRTZXRTZXF1ZW5jZUVuYWJsZWQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1hZ2VJbXBvcnRTZXRTZXF1ZW5jZUVuYWJsZWQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZlbmFibGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0ltYWdlSW1wb3J0U2V0U2VxdWVuY2VFbmFibGVkKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmVuYWJsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzSW1hZ2VJbXBvcnRTZXRTZXF1ZW5jZUVuYWJsZWQoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzSW1hZ2VJbXBvcnRHZXRTZXF1ZW5jZUVuYWJsZWQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY0ltYWdlTW92aWVJbXBvcnRDb21wb25lbnQgY2k7Ci0JQm9vbGVhbiBlbmFibGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY0ltYWdlTW92aWVJbXBvcnRDb21wb25lbnQgY2k7CisgICAgQm9vbGVhbiBlbmFibGU7CiAjaWZuZGVmIEdyYXBoaWNzSW1hZ2VJbXBvcnRHZXRTZXF1ZW5jZUVuYWJsZWQKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltYWdlSW1wb3J0R2V0U2VxdWVuY2VFbmFibGVkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltYWdlSW1wb3J0R2V0U2VxdWVuY2VFbmFibGVkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0ltYWdlSW1wb3J0R2V0U2VxdWVuY2VFbmFibGVkKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVuYWJsZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgZW5hYmxlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NJbWFnZUltcG9ydEdldFNlcXVlbmNlRW5hYmxlZChjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmFibGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfUHJldmlld1Nob3dEYXRhKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCXBub3RDb21wb25lbnQgcDsKLQlPU1R5cGUgZGF0YVR5cGU7Ci0JSGFuZGxlIGRhdGE7Ci0JUmVjdCBpbkhlcmU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgcG5vdENvbXBvbmVudCBwOworICAgIE9TVHlwZSBkYXRhVHlwZTsKKyAgICBIYW5kbGUgZGF0YTsKKyAgICBSZWN0IGluSGVyZTsKICNpZm5kZWYgUHJldmlld1Nob3dEYXRhCi0JUHlNYWNfUFJFQ0hFQ0soUHJldmlld1Nob3dEYXRhKTsKKyAgICBQeU1hY19QUkVDSEVDSyhQcmV2aWV3U2hvd0RhdGEpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZwLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkYXRhVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5IZXJlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gUHJldmlld1Nob3dEYXRhKHAsCi0JICAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICBkYXRhLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5IZXJlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRhdGFUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpbkhlcmUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBQcmV2aWV3U2hvd0RhdGEocCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkhlcmUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ByZXZpZXdNYWtlUHJldmlld1JlZmVyZW5jZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlwbm90Q29tcG9uZW50IHA7Ci0JT1NUeXBlIHByZXZpZXdUeXBlOwotCXNob3J0IHJlc0lEOwotCUZTU3BlYyBzb3VyY2VGaWxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIHBub3RDb21wb25lbnQgcDsKKyAgICBPU1R5cGUgcHJldmlld1R5cGU7CisgICAgc2hvcnQgcmVzSUQ7CisgICAgRlNTcGVjIHNvdXJjZUZpbGU7CiAjaWZuZGVmIFByZXZpZXdNYWtlUHJldmlld1JlZmVyZW5jZQotCVB5TWFjX1BSRUNIRUNLKFByZXZpZXdNYWtlUHJldmlld1JlZmVyZW5jZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUHJldmlld01ha2VQcmV2aWV3UmVmZXJlbmNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZwLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZzb3VyY2VGaWxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gUHJldmlld01ha2VQcmV2aWV3UmVmZXJlbmNlKHAsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcmV2aWV3VHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc0lELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc291cmNlRmlsZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgcHJldmlld1R5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgcmVzSUQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZzb3VyY2VGaWxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gUHJldmlld01ha2VQcmV2aWV3UmVmZXJlbmNlKHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcmV2aWV3VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc291cmNlRmlsZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgcHJldmlld1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVzSUQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ByZXZpZXdFdmVudChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlwbm90Q29tcG9uZW50IHA7Ci0JRXZlbnRSZWNvcmQgZTsKLQlCb29sZWFuIGhhbmRsZWRFdmVudDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBwbm90Q29tcG9uZW50IHA7CisgICAgRXZlbnRSZWNvcmQgZTsKKyAgICBCb29sZWFuIGhhbmRsZWRFdmVudDsKICNpZm5kZWYgUHJldmlld0V2ZW50Ci0JUHlNYWNfUFJFQ0hFQ0soUHJldmlld0V2ZW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhQcmV2aWV3RXZlbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZwKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gUHJldmlld0V2ZW50KHAsCi0JICAgICAgICAgICAgICAgICAgICZlLAotCSAgICAgICAgICAgICAgICAgICAmaGFuZGxlZEV2ZW50KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRXZlbnRSZWNvcmQsICZlLAotCSAgICAgICAgICAgICAgICAgICAgIGhhbmRsZWRFdmVudCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZwKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gUHJldmlld0V2ZW50KHAsCisgICAgICAgICAgICAgICAgICAgICAgICZlLAorICAgICAgICAgICAgICAgICAgICAgICAmaGFuZGxlZEV2ZW50KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRXZlbnRSZWNvcmQsICZlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZWRFdmVudCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUNvZGVjRGVjb21wcmVzcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhQ29kZWNDb21wb25lbnQgZGM7Ci0Jdm9pZCAqIHNyY0RhdGE7Ci0JVUludDMyIHNyY1NpemU7Ci0Jdm9pZCAqIGRzdERhdGE7Ci0JVUludDMyIGRzdEJ1ZmZlclNpemU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUNvZGVjQ29tcG9uZW50IGRjOworICAgIHZvaWQgKiBzcmNEYXRhOworICAgIFVJbnQzMiBzcmNTaXplOworICAgIHZvaWQgKiBkc3REYXRhOworICAgIFVJbnQzMiBkc3RCdWZmZXJTaXplOwogI2lmbmRlZiBEYXRhQ29kZWNEZWNvbXByZXNzCi0JUHlNYWNfUFJFQ0hFQ0soRGF0YUNvZGVjRGVjb21wcmVzcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGF0YUNvZGVjRGVjb21wcmVzcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnNsc2wiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkYywKLQkgICAgICAgICAgICAgICAgICAgICAgJnNyY0RhdGEsCi0JICAgICAgICAgICAgICAgICAgICAgICZzcmNTaXplLAotCSAgICAgICAgICAgICAgICAgICAgICAmZHN0RGF0YSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRzdEJ1ZmZlclNpemUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhQ29kZWNEZWNvbXByZXNzKGRjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjRGF0YSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1NpemUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBkc3REYXRhLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0QnVmZmVyU2l6ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzbHNsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzcmNEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3JjU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRzdERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkc3RCdWZmZXJTaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRGF0YUNvZGVjRGVjb21wcmVzcyhkYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEJ1ZmZlclNpemUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFDb2RlY0dldENvbXByZXNzQnVmZmVyU2l6ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhQ29kZWNDb21wb25lbnQgZGM7Ci0JVUludDMyIHNyY1NpemU7Ci0JVUludDMyIGRzdFNpemU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUNvZGVjQ29tcG9uZW50IGRjOworICAgIFVJbnQzMiBzcmNTaXplOworICAgIFVJbnQzMiBkc3RTaXplOwogI2lmbmRlZiBEYXRhQ29kZWNHZXRDb21wcmVzc0J1ZmZlclNpemUKLQlQeU1hY19QUkVDSEVDSyhEYXRhQ29kZWNHZXRDb21wcmVzc0J1ZmZlclNpemUpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFDb2RlY0dldENvbXByZXNzQnVmZmVyU2l6ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkYywKLQkgICAgICAgICAgICAgICAgICAgICAgJnNyY1NpemUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhQ29kZWNHZXRDb21wcmVzc0J1ZmZlclNpemUoZGMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1NpemUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkc3RTaXplKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBkc3RTaXplKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNyY1NpemUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhQ29kZWNHZXRDb21wcmVzc0J1ZmZlclNpemUoZGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkc3RTaXplKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkc3RTaXplKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EYXRhQ29kZWNDb21wcmVzcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhQ29kZWNDb21wb25lbnQgZGM7Ci0Jdm9pZCAqIHNyY0RhdGE7Ci0JVUludDMyIHNyY1NpemU7Ci0Jdm9pZCAqIGRzdERhdGE7Ci0JVUludDMyIGRzdEJ1ZmZlclNpemU7Ci0JVUludDMyIGFjdHVhbERzdFNpemU7Ci0JVUludDMyIGRlY29tcHJlc3NTbG9wOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFDb2RlY0NvbXBvbmVudCBkYzsKKyAgICB2b2lkICogc3JjRGF0YTsKKyAgICBVSW50MzIgc3JjU2l6ZTsKKyAgICB2b2lkICogZHN0RGF0YTsKKyAgICBVSW50MzIgZHN0QnVmZmVyU2l6ZTsKKyAgICBVSW50MzIgYWN0dWFsRHN0U2l6ZTsKKyAgICBVSW50MzIgZGVjb21wcmVzc1Nsb3A7CiAjaWZuZGVmIERhdGFDb2RlY0NvbXByZXNzCi0JUHlNYWNfUFJFQ0hFQ0soRGF0YUNvZGVjQ29tcHJlc3MpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFDb2RlY0NvbXByZXNzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mc2xzbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRjLAotCSAgICAgICAgICAgICAgICAgICAgICAmc3JjRGF0YSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNyY1NpemUsCi0JICAgICAgICAgICAgICAgICAgICAgICZkc3REYXRhLAotCSAgICAgICAgICAgICAgICAgICAgICAmZHN0QnVmZmVyU2l6ZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IERhdGFDb2RlY0NvbXByZXNzKGRjLAotCSAgICAgICAgICAgICAgICAgICAgICAgIHNyY0RhdGEsCi0JICAgICAgICAgICAgICAgICAgICAgICAgc3JjU2l6ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICBkc3REYXRhLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGRzdEJ1ZmZlclNpemUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgJmFjdHVhbERzdFNpemUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgJmRlY29tcHJlc3NTbG9wKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgYWN0dWFsRHN0U2l6ZSwKLQkgICAgICAgICAgICAgICAgICAgICBkZWNvbXByZXNzU2xvcCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzbHNsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzcmNEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3JjU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRzdERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkc3RCdWZmZXJTaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRGF0YUNvZGVjQ29tcHJlc3MoZGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0QnVmZmVyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYWN0dWFsRHN0U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVjb21wcmVzc1Nsb3ApOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxEc3RTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29tcHJlc3NTbG9wKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EYXRhQ29kZWNCZWdpbkludGVycnVwdFNhZmUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUNvZGVjQ29tcG9uZW50IGRjOwotCXVuc2lnbmVkIGxvbmcgbWF4U3JjU2l6ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBEYXRhQ29kZWNDb21wb25lbnQgZGM7CisgICAgdW5zaWduZWQgbG9uZyBtYXhTcmNTaXplOwogI2lmbmRlZiBEYXRhQ29kZWNCZWdpbkludGVycnVwdFNhZmUKLQlQeU1hY19QUkVDSEVDSyhEYXRhQ29kZWNCZWdpbkludGVycnVwdFNhZmUpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFDb2RlY0JlZ2luSW50ZXJydXB0U2FmZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkYywKLQkgICAgICAgICAgICAgICAgICAgICAgJm1heFNyY1NpemUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhQ29kZWNCZWdpbkludGVycnVwdFNhZmUoZGMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFNyY1NpemUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWF4U3JjU2l6ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IERhdGFDb2RlY0JlZ2luSW50ZXJydXB0U2FmZShkYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4U3JjU2l6ZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUNvZGVjRW5kSW50ZXJydXB0U2FmZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhQ29kZWNDb21wb25lbnQgZGM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUNvZGVjQ29tcG9uZW50IGRjOwogI2lmbmRlZiBEYXRhQ29kZWNFbmRJbnRlcnJ1cHRTYWZlCi0JUHlNYWNfUFJFQ0hFQ0soRGF0YUNvZGVjRW5kSW50ZXJydXB0U2FmZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGF0YUNvZGVjRW5kSW50ZXJydXB0U2FmZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUNvZGVjRW5kSW50ZXJydXB0U2FmZShkYyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IERhdGFDb2RlY0VuZEludGVycnVwdFNhZmUoZGMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIR2V0RGF0YShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhSGFuZGxlciBkaDsKLQlIYW5kbGUgaDsKLQlsb25nIGhPZmZzZXQ7Ci0JbG9uZyBvZmZzZXQ7Ci0JbG9uZyBzaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFIYW5kbGVyIGRoOworICAgIEhhbmRsZSBoOworICAgIGxvbmcgaE9mZnNldDsKKyAgICBsb25nIG9mZnNldDsKKyAgICBsb25nIHNpemU7CiAjaWZuZGVmIERhdGFIR2V0RGF0YQotCVB5TWFjX1BSRUNIRUNLKERhdGFIR2V0RGF0YSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGF0YUhHZXREYXRhKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZsbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZoLAotCSAgICAgICAgICAgICAgICAgICAgICAmaE9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNpemUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSEdldERhdGEoZGgsCi0JICAgICAgICAgICAgICAgICAgIGgsCi0JICAgICAgICAgICAgICAgICAgIGhPZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgIG9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgc2l6ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmxsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZoT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IERhdGFIR2V0RGF0YShkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgaCwKKyAgICAgICAgICAgICAgICAgICAgICAgaE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICBzaXplKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EYXRhSFB1dERhdGEoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7Ci0JSGFuZGxlIGg7Ci0JbG9uZyBoT2Zmc2V0OwotCWxvbmcgb2Zmc2V0OwotCWxvbmcgc2l6ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBEYXRhSGFuZGxlciBkaDsKKyAgICBIYW5kbGUgaDsKKyAgICBsb25nIGhPZmZzZXQ7CisgICAgbG9uZyBvZmZzZXQ7CisgICAgbG9uZyBzaXplOwogI2lmbmRlZiBEYXRhSFB1dERhdGEKLQlQeU1hY19QUkVDSEVDSyhEYXRhSFB1dERhdGEpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFIUHV0RGF0YSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZoLAotCSAgICAgICAgICAgICAgICAgICAgICAmaE9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNpemUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSFB1dERhdGEoZGgsCi0JICAgICAgICAgICAgICAgICAgIGgsCi0JICAgICAgICAgICAgICAgICAgIGhPZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICZvZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgIHNpemUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIG9mZnNldCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmhPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRGF0YUhQdXREYXRhKGRoLAorICAgICAgICAgICAgICAgICAgICAgICBoLAorICAgICAgICAgICAgICAgICAgICAgICBoT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICBzaXplKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIRmx1c2hEYXRhKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCURhdGFIYW5kbGVyIGRoOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFIYW5kbGVyIGRoOwogI2lmbmRlZiBEYXRhSEZsdXNoRGF0YQotCVB5TWFjX1BSRUNIRUNLKERhdGFIRmx1c2hEYXRhKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEYXRhSEZsdXNoRGF0YSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhGbHVzaERhdGEoZGgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSEZsdXNoRGF0YShkaCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUhPcGVuRm9yV3JpdGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CiAjaWZuZGVmIERhdGFIT3BlbkZvcldyaXRlCi0JUHlNYWNfUFJFQ0hFQ0soRGF0YUhPcGVuRm9yV3JpdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFIT3BlbkZvcldyaXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSE9wZW5Gb3JXcml0ZShkaCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IERhdGFIT3BlbkZvcldyaXRlKGRoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EYXRhSENsb3NlRm9yV3JpdGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CiAjaWZuZGVmIERhdGFIQ2xvc2VGb3JXcml0ZQotCVB5TWFjX1BSRUNIRUNLKERhdGFIQ2xvc2VGb3JXcml0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGF0YUhDbG9zZUZvcldyaXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSENsb3NlRm9yV3JpdGUoZGgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSENsb3NlRm9yV3JpdGUoZGgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIT3BlbkZvclJlYWQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CiAjaWZuZGVmIERhdGFIT3BlbkZvclJlYWQKLQlQeU1hY19QUkVDSEVDSyhEYXRhSE9wZW5Gb3JSZWFkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEYXRhSE9wZW5Gb3JSZWFkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSE9wZW5Gb3JSZWFkKGRoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRGF0YUhPcGVuRm9yUmVhZChkaCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUhDbG9zZUZvclJlYWQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CiAjaWZuZGVmIERhdGFIQ2xvc2VGb3JSZWFkCi0JUHlNYWNfUFJFQ0hFQ0soRGF0YUhDbG9zZUZvclJlYWQpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFIQ2xvc2VGb3JSZWFkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSENsb3NlRm9yUmVhZChkaCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IERhdGFIQ2xvc2VGb3JSZWFkKGRoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EYXRhSFNldERhdGFSZWYoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7Ci0JSGFuZGxlIGRhdGFSZWY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CisgICAgSGFuZGxlIGRhdGFSZWY7CiAjaWZuZGVmIERhdGFIU2V0RGF0YVJlZgotCVB5TWFjX1BSRUNIRUNLKERhdGFIU2V0RGF0YVJlZik7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGF0YUhTZXREYXRhUmVmKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhUmVmKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhTZXREYXRhUmVmKGRoLAotCSAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YVJlZikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IERhdGFIU2V0RGF0YVJlZihkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUhHZXREYXRhUmVmKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCURhdGFIYW5kbGVyIGRoOwotCUhhbmRsZSBkYXRhUmVmOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFIYW5kbGVyIGRoOworICAgIEhhbmRsZSBkYXRhUmVmOwogI2lmbmRlZiBEYXRhSEdldERhdGFSZWYKLQlQeU1hY19QUkVDSEVDSyhEYXRhSEdldERhdGFSZWYpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFIR2V0RGF0YVJlZik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhHZXREYXRhUmVmKGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGF0YVJlZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGRhdGFSZWYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSEdldERhdGFSZWYoZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUmVmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgZGF0YVJlZik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUhDb21wYXJlRGF0YVJlZihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhSGFuZGxlciBkaDsKLQlIYW5kbGUgZGF0YVJlZjsKLQlCb29sZWFuIGVxdWFsOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFIYW5kbGVyIGRoOworICAgIEhhbmRsZSBkYXRhUmVmOworICAgIEJvb2xlYW4gZXF1YWw7CiAjaWZuZGVmIERhdGFIQ29tcGFyZURhdGFSZWYKLQlQeU1hY19QUkVDSEVDSyhEYXRhSENvbXBhcmVEYXRhUmVmKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEYXRhSENvbXBhcmVEYXRhUmVmKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhUmVmKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhDb21wYXJlRGF0YVJlZihkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmZXF1YWwpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGVxdWFsKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YVJlZikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IERhdGFIQ29tcGFyZURhdGFSZWYoZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVxdWFsKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBlcXVhbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUhUYXNrKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCURhdGFIYW5kbGVyIGRoOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFIYW5kbGVyIGRoOwogI2lmbmRlZiBEYXRhSFRhc2sKLQlQeU1hY19QUkVDSEVDSyhEYXRhSFRhc2spOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFIVGFzayk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhUYXNrKGRoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRGF0YUhUYXNrKGRoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EYXRhSEZpbmlzaERhdGEoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7Ci0JUHRyIFBsYWNlVG9QdXREYXRhUHRyOwotCUJvb2xlYW4gQ2FuY2VsOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFIYW5kbGVyIGRoOworICAgIFB0ciBQbGFjZVRvUHV0RGF0YVB0cjsKKyAgICBCb29sZWFuIENhbmNlbDsKICNpZm5kZWYgRGF0YUhGaW5pc2hEYXRhCi0JUHlNYWNfUFJFQ0hFQ0soRGF0YUhGaW5pc2hEYXRhKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEYXRhSEZpbmlzaERhdGEpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAotCSAgICAgICAgICAgICAgICAgICAgICAmUGxhY2VUb1B1dERhdGFQdHIsCi0JICAgICAgICAgICAgICAgICAgICAgICZDYW5jZWwpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSEZpbmlzaERhdGEoZGgsCi0JICAgICAgICAgICAgICAgICAgICAgIFBsYWNlVG9QdXREYXRhUHRyLAotCSAgICAgICAgICAgICAgICAgICAgICBDYW5jZWwpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mc2IiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJlBsYWNlVG9QdXREYXRhUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmQ2FuY2VsKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRGF0YUhGaW5pc2hEYXRhKGRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQbGFjZVRvUHV0RGF0YVB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FuY2VsKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EYXRhSEZsdXNoQ2FjaGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CiAjaWZuZGVmIERhdGFIRmx1c2hDYWNoZQotCVB5TWFjX1BSRUNIRUNLKERhdGFIRmx1c2hDYWNoZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGF0YUhGbHVzaENhY2hlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSEZsdXNoQ2FjaGUoZGgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSEZsdXNoQ2FjaGUoZGgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIUmVzb2x2ZURhdGFSZWYoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7Ci0JSGFuZGxlIHRoZURhdGFSZWY7Ci0JQm9vbGVhbiB3YXNDaGFuZ2VkOwotCUJvb2xlYW4gdXNlckludGVyZmFjZUFsbG93ZWQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CisgICAgSGFuZGxlIHRoZURhdGFSZWY7CisgICAgQm9vbGVhbiB3YXNDaGFuZ2VkOworICAgIEJvb2xlYW4gdXNlckludGVyZmFjZUFsbG93ZWQ7CiAjaWZuZGVmIERhdGFIUmVzb2x2ZURhdGFSZWYKLQlQeU1hY19QUkVDSEVDSyhEYXRhSFJlc29sdmVEYXRhUmVmKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEYXRhSFJlc29sdmVEYXRhUmVmKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlRGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnVzZXJJbnRlcmZhY2VBbGxvd2VkKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhSZXNvbHZlRGF0YVJlZihkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZURhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmd2FzQ2hhbmdlZCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJbnRlcmZhY2VBbGxvd2VkKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICB3YXNDaGFuZ2VkKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZURhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ1c2VySW50ZXJmYWNlQWxsb3dlZCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IERhdGFIUmVzb2x2ZURhdGFSZWYoZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVEYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJndhc0NoYW5nZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySW50ZXJmYWNlQWxsb3dlZCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgd2FzQ2hhbmdlZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUhHZXRGaWxlU2l6ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhSGFuZGxlciBkaDsKLQlsb25nIGZpbGVTaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFIYW5kbGVyIGRoOworICAgIGxvbmcgZmlsZVNpemU7CiAjaWZuZGVmIERhdGFIR2V0RmlsZVNpemUKLQlQeU1hY19QUkVDSEVDSyhEYXRhSEdldEZpbGVTaXplKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEYXRhSEdldEZpbGVTaXplKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSEdldEZpbGVTaXplKGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgJmZpbGVTaXplKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBmaWxlU2l6ZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IERhdGFIR2V0RmlsZVNpemUoZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlsZVNpemUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVTaXplKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EYXRhSENhblVzZURhdGFSZWYoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7Ci0JSGFuZGxlIGRhdGFSZWY7Ci0JbG9uZyB1c2VGbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBEYXRhSGFuZGxlciBkaDsKKyAgICBIYW5kbGUgZGF0YVJlZjsKKyAgICBsb25nIHVzZUZsYWdzOwogI2lmbmRlZiBEYXRhSENhblVzZURhdGFSZWYKLQlQeU1hY19QUkVDSEVDSyhEYXRhSENhblVzZURhdGFSZWYpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFIQ2FuVXNlRGF0YVJlZik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YVJlZikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IERhdGFIQ2FuVXNlRGF0YVJlZihkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJnVzZUZsYWdzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICB1c2VGbGFncyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFSZWYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSENhblVzZURhdGFSZWYoZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1c2VGbGFncyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgdXNlRmxhZ3MpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIUHJlZXh0ZW5kKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCURhdGFIYW5kbGVyIGRoOwotCXVuc2lnbmVkIGxvbmcgbWF4VG9BZGQ7Ci0JdW5zaWduZWQgbG9uZyBzcGFjZUFkZGVkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFIYW5kbGVyIGRoOworICAgIHVuc2lnbmVkIGxvbmcgbWF4VG9BZGQ7CisgICAgdW5zaWduZWQgbG9uZyBzcGFjZUFkZGVkOwogI2lmbmRlZiBEYXRhSFByZWV4dGVuZAotCVB5TWFjX1BSRUNIRUNLKERhdGFIUHJlZXh0ZW5kKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEYXRhSFByZWV4dGVuZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1heFRvQWRkKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhQcmVleHRlbmQoZGgsCi0JICAgICAgICAgICAgICAgICAgICAgbWF4VG9BZGQsCi0JICAgICAgICAgICAgICAgICAgICAgJnNwYWNlQWRkZWQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHNwYWNlQWRkZWQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWF4VG9BZGQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSFByZWV4dGVuZChkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtYXhUb0FkZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmc3BhY2VBZGRlZCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3BhY2VBZGRlZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUhTZXRGaWxlU2l6ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhSGFuZGxlciBkaDsKLQlsb25nIGZpbGVTaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFIYW5kbGVyIGRoOworICAgIGxvbmcgZmlsZVNpemU7CiAjaWZuZGVmIERhdGFIU2V0RmlsZVNpemUKLQlQeU1hY19QUkVDSEVDSyhEYXRhSFNldEZpbGVTaXplKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEYXRhSFNldEZpbGVTaXplKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmlsZVNpemUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSFNldEZpbGVTaXplKGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgZmlsZVNpemUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlsZVNpemUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSFNldEZpbGVTaXplKGRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVNpemUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIR2V0RnJlZVNwYWNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCURhdGFIYW5kbGVyIGRoOwotCXVuc2lnbmVkIGxvbmcgZnJlZVNpemU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CisgICAgdW5zaWduZWQgbG9uZyBmcmVlU2l6ZTsKICNpZm5kZWYgRGF0YUhHZXRGcmVlU3BhY2UKLQlQeU1hY19QUkVDSEVDSyhEYXRhSEdldEZyZWVTcGFjZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGF0YUhHZXRGcmVlU3BhY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IERhdGFIR2V0RnJlZVNwYWNlKGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICZmcmVlU2l6ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgZnJlZVNpemUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSEdldEZyZWVTcGFjZShkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZnJlZVNpemUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWVTaXplKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EYXRhSENyZWF0ZUZpbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7Ci0JT1NUeXBlIGNyZWF0b3I7Ci0JQm9vbGVhbiBkZWxldGVFeGlzdGluZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBEYXRhSGFuZGxlciBkaDsKKyAgICBPU1R5cGUgY3JlYXRvcjsKKyAgICBCb29sZWFuIGRlbGV0ZUV4aXN0aW5nOwogI2lmbmRlZiBEYXRhSENyZWF0ZUZpbGUKLQlQeU1hY19QUkVDSEVDSyhEYXRhSENyZWF0ZUZpbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFIQ3JlYXRlRmlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGVsZXRlRXhpc3RpbmcpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSENyZWF0ZUZpbGUoZGgsCi0JICAgICAgICAgICAgICAgICAgICAgIGNyZWF0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZUV4aXN0aW5nKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjcmVhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVsZXRlRXhpc3RpbmcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSENyZWF0ZUZpbGUoZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZUV4aXN0aW5nKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EYXRhSEdldFByZWZlcnJlZEJsb2NrU2l6ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhSGFuZGxlciBkaDsKLQlsb25nIGJsb2NrU2l6ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBEYXRhSGFuZGxlciBkaDsKKyAgICBsb25nIGJsb2NrU2l6ZTsKICNpZm5kZWYgRGF0YUhHZXRQcmVmZXJyZWRCbG9ja1NpemUKLQlQeU1hY19QUkVDSEVDSyhEYXRhSEdldFByZWZlcnJlZEJsb2NrU2l6ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGF0YUhHZXRQcmVmZXJyZWRCbG9ja1NpemUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IERhdGFIR2V0UHJlZmVycmVkQmxvY2tTaXplKGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZibG9ja1NpemUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGJsb2NrU2l6ZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IERhdGFIR2V0UHJlZmVycmVkQmxvY2tTaXplKGRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZibG9ja1NpemUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrU2l6ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUhHZXREZXZpY2VJbmRleChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhSGFuZGxlciBkaDsKLQlsb25nIGRldmljZUluZGV4OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFIYW5kbGVyIGRoOworICAgIGxvbmcgZGV2aWNlSW5kZXg7CiAjaWZuZGVmIERhdGFIR2V0RGV2aWNlSW5kZXgKLQlQeU1hY19QUkVDSEVDSyhEYXRhSEdldERldmljZUluZGV4KTsKKyAgICBQeU1hY19QUkVDSEVDSyhEYXRhSEdldERldmljZUluZGV4KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSEdldERldmljZUluZGV4KGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJmRldmljZUluZGV4KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBkZXZpY2VJbmRleCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IERhdGFIR2V0RGV2aWNlSW5kZXgoZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGV2aWNlSW5kZXgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZUluZGV4KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EYXRhSElzU3RyZWFtaW5nRGF0YUhhbmRsZXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7Ci0JQm9vbGVhbiB5ZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CisgICAgQm9vbGVhbiB5ZXM7CiAjaWZuZGVmIERhdGFISXNTdHJlYW1pbmdEYXRhSGFuZGxlcgotCVB5TWFjX1BSRUNIRUNLKERhdGFISXNTdHJlYW1pbmdEYXRhSGFuZGxlcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGF0YUhJc1N0cmVhbWluZ0RhdGFIYW5kbGVyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSElzU3RyZWFtaW5nRGF0YUhhbmRsZXIoZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ5ZXMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHllcyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IERhdGFISXNTdHJlYW1pbmdEYXRhSGFuZGxlcihkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnllcyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgeWVzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EYXRhSEdldERhdGFJbkJ1ZmZlcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhSGFuZGxlciBkaDsKLQlsb25nIHN0YXJ0T2Zmc2V0OwotCWxvbmcgc2l6ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBEYXRhSGFuZGxlciBkaDsKKyAgICBsb25nIHN0YXJ0T2Zmc2V0OworICAgIGxvbmcgc2l6ZTsKICNpZm5kZWYgRGF0YUhHZXREYXRhSW5CdWZmZXIKLQlQeU1hY19QUkVDSEVDSyhEYXRhSEdldERhdGFJbkJ1ZmZlcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGF0YUhHZXREYXRhSW5CdWZmZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZzdGFydE9mZnNldCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IERhdGFIR2V0RGF0YUluQnVmZmVyKGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0T2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBzaXplKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0T2Zmc2V0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRGF0YUhHZXREYXRhSW5CdWZmZXIoZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIR2V0U2NoZWR1bGVBaGVhZFRpbWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7Ci0JbG9uZyBtaWxsaXNlY3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CisgICAgbG9uZyBtaWxsaXNlY3M7CiAjaWZuZGVmIERhdGFIR2V0U2NoZWR1bGVBaGVhZFRpbWUKLQlQeU1hY19QUkVDSEVDSyhEYXRhSEdldFNjaGVkdWxlQWhlYWRUaW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEYXRhSEdldFNjaGVkdWxlQWhlYWRUaW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSEdldFNjaGVkdWxlQWhlYWRUaW1lKGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1pbGxpc2Vjcyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgbWlsbGlzZWNzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRGF0YUhHZXRTY2hlZHVsZUFoZWFkVGltZShkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtaWxsaXNlY3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIG1pbGxpc2Vjcyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUhTZXRDYWNoZVNpemVMaW1pdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhSGFuZGxlciBkaDsKLQlTaXplIGNhY2hlU2l6ZUxpbWl0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFIYW5kbGVyIGRoOworICAgIFNpemUgY2FjaGVTaXplTGltaXQ7CiAjaWZuZGVmIERhdGFIU2V0Q2FjaGVTaXplTGltaXQKLQlQeU1hY19QUkVDSEVDSyhEYXRhSFNldENhY2hlU2l6ZUxpbWl0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhEYXRhSFNldENhY2hlU2l6ZUxpbWl0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAotCSAgICAgICAgICAgICAgICAgICAgICAmY2FjaGVTaXplTGltaXQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSFNldENhY2hlU2l6ZUxpbWl0KGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVTaXplTGltaXQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY2FjaGVTaXplTGltaXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSFNldENhY2hlU2l6ZUxpbWl0KGRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVTaXplTGltaXQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIR2V0Q2FjaGVTaXplTGltaXQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7Ci0JU2l6ZSBjYWNoZVNpemVMaW1pdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBEYXRhSGFuZGxlciBkaDsKKyAgICBTaXplIGNhY2hlU2l6ZUxpbWl0OwogI2lmbmRlZiBEYXRhSEdldENhY2hlU2l6ZUxpbWl0Ci0JUHlNYWNfUFJFQ0hFQ0soRGF0YUhHZXRDYWNoZVNpemVMaW1pdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGF0YUhHZXRDYWNoZVNpemVMaW1pdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhHZXRDYWNoZVNpemVMaW1pdChkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjYWNoZVNpemVMaW1pdCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgY2FjaGVTaXplTGltaXQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSEdldENhY2hlU2l6ZUxpbWl0KGRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNhY2hlU2l6ZUxpbWl0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZVNpemVMaW1pdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUhHZXRNb3ZpZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhSGFuZGxlciBkaDsKLQlNb3ZpZSB0aGVNb3ZpZTsKLQlzaG9ydCBpZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBEYXRhSGFuZGxlciBkaDsKKyAgICBNb3ZpZSB0aGVNb3ZpZTsKKyAgICBzaG9ydCBpZDsKICNpZm5kZWYgRGF0YUhHZXRNb3ZpZQotCVB5TWFjX1BSRUNIRUNLKERhdGFIR2V0TW92aWUpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFIR2V0TW92aWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IERhdGFIR2V0TW92aWUoZGgsCi0JICAgICAgICAgICAgICAgICAgICAmdGhlTW92aWUsCi0JICAgICAgICAgICAgICAgICAgICAmaWQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfTmV3LCB0aGVNb3ZpZSwKLQkgICAgICAgICAgICAgICAgICAgICBpZCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IERhdGFIR2V0TW92aWUoZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAmdGhlTW92aWUsCisgICAgICAgICAgICAgICAgICAgICAgICAmaWQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfTmV3LCB0aGVNb3ZpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUhBZGRNb3ZpZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhSGFuZGxlciBkaDsKLQlNb3ZpZSB0aGVNb3ZpZTsKLQlzaG9ydCBpZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBEYXRhSGFuZGxlciBkaDsKKyAgICBNb3ZpZSB0aGVNb3ZpZTsKKyAgICBzaG9ydCBpZDsKICNpZm5kZWYgRGF0YUhBZGRNb3ZpZQotCVB5TWFjX1BSRUNIRUNLKERhdGFIQWRkTW92aWUpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFIQWRkTW92aWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAotCSAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9Db252ZXJ0LCAmdGhlTW92aWUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSEFkZE1vdmllKGRoLAotCSAgICAgICAgICAgICAgICAgICAgdGhlTW92aWUsCi0JICAgICAgICAgICAgICAgICAgICAmaWQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGlkKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX0NvbnZlcnQsICZ0aGVNb3ZpZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IERhdGFIQWRkTW92aWUoZGgsCisgICAgICAgICAgICAgICAgICAgICAgICB0aGVNb3ZpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZpZCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgaWQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIVXBkYXRlTW92aWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7Ci0JTW92aWUgdGhlTW92aWU7Ci0Jc2hvcnQgaWQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CisgICAgTW92aWUgdGhlTW92aWU7CisgICAgc2hvcnQgaWQ7CiAjaWZuZGVmIERhdGFIVXBkYXRlTW92aWUKLQlQeU1hY19QUkVDSEVDSyhEYXRhSFVwZGF0ZU1vdmllKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEYXRhSFVwZGF0ZU1vdmllKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCi0JICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX0NvbnZlcnQsICZ0aGVNb3ZpZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlkKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhVcGRhdGVNb3ZpZShkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgIHRoZU1vdmllLAotCSAgICAgICAgICAgICAgICAgICAgICAgaWQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX0NvbnZlcnQsICZ0aGVNb3ZpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRGF0YUhVcGRhdGVNb3ZpZShkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZU1vdmllLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIRG9lc0J1ZmZlcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhSGFuZGxlciBkaDsKLQlCb29sZWFuIGJ1ZmZlcnNSZWFkczsKLQlCb29sZWFuIGJ1ZmZlcnNXcml0ZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CisgICAgQm9vbGVhbiBidWZmZXJzUmVhZHM7CisgICAgQm9vbGVhbiBidWZmZXJzV3JpdGVzOwogI2lmbmRlZiBEYXRhSERvZXNCdWZmZXIKLQlQeU1hY19QUkVDSEVDSyhEYXRhSERvZXNCdWZmZXIpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFIRG9lc0J1ZmZlcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhEb2VzQnVmZmVyKGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAmYnVmZmVyc1JlYWRzLAotCSAgICAgICAgICAgICAgICAgICAgICAmYnVmZmVyc1dyaXRlcyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcnNSZWFkcywKLQkgICAgICAgICAgICAgICAgICAgICBidWZmZXJzV3JpdGVzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRGF0YUhEb2VzQnVmZmVyKGRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYnVmZmVyc1JlYWRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYnVmZmVyc1dyaXRlcyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcnNSZWFkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJzV3JpdGVzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EYXRhSEdldEZpbGVOYW1lKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCURhdGFIYW5kbGVyIGRoOwotCVN0cjI1NSBzdHI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CisgICAgU3RyMjU1IHN0cjsKICNpZm5kZWYgRGF0YUhHZXRGaWxlTmFtZQotCVB5TWFjX1BSRUNIRUNLKERhdGFIR2V0RmlsZU5hbWUpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFIR2V0RmlsZU5hbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIHN0cikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IERhdGFIR2V0RmlsZU5hbWUoZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICBzdHIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBzdHIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSEdldEZpbGVOYW1lKGRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EYXRhSEdldEF2YWlsYWJsZUZpbGVTaXplKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCURhdGFIYW5kbGVyIGRoOwotCWxvbmcgZmlsZVNpemU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CisgICAgbG9uZyBmaWxlU2l6ZTsKICNpZm5kZWYgRGF0YUhHZXRBdmFpbGFibGVGaWxlU2l6ZQotCVB5TWFjX1BSRUNIRUNLKERhdGFIR2V0QXZhaWxhYmxlRmlsZVNpemUpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFIR2V0QXZhaWxhYmxlRmlsZVNpemUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IERhdGFIR2V0QXZhaWxhYmxlRmlsZVNpemUoZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlsZVNpemUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGZpbGVTaXplKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRGF0YUhHZXRBdmFpbGFibGVGaWxlU2l6ZShkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWxlU2l6ZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVNpemUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIR2V0TWFjT1NGaWxlVHlwZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhSGFuZGxlciBkaDsKLQlPU1R5cGUgZmlsZVR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CisgICAgT1NUeXBlIGZpbGVUeXBlOwogI2lmbmRlZiBEYXRhSEdldE1hY09TRmlsZVR5cGUKLQlQeU1hY19QUkVDSEVDSyhEYXRhSEdldE1hY09TRmlsZVR5cGUpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFIR2V0TWFjT1NGaWxlVHlwZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhHZXRNYWNPU0ZpbGVUeXBlKGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlsZVR5cGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgZmlsZVR5cGUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSEdldE1hY09TRmlsZVR5cGUoZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWxlVHlwZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBmaWxlVHlwZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUhHZXRNSU1FVHlwZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhSGFuZGxlciBkaDsKLQlTdHIyNTUgbWltZVR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CisgICAgU3RyMjU1IG1pbWVUeXBlOwogI2lmbmRlZiBEYXRhSEdldE1JTUVUeXBlCi0JUHlNYWNfUFJFQ0hFQ0soRGF0YUhHZXRNSU1FVHlwZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGF0YUhHZXRNSU1FVHlwZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgbWltZVR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSEdldE1JTUVUeXBlKGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgbWltZVR5cGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBtaW1lVHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IERhdGFIR2V0TUlNRVR5cGUoZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW1lVHlwZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUhTZXREYXRhUmVmV2l0aEFuY2hvcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhSGFuZGxlciBkaDsKLQlIYW5kbGUgYW5jaG9yRGF0YVJlZjsKLQlPU1R5cGUgZGF0YVJlZlR5cGU7Ci0JSGFuZGxlIGRhdGFSZWY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CisgICAgSGFuZGxlIGFuY2hvckRhdGFSZWY7CisgICAgT1NUeXBlIGRhdGFSZWZUeXBlOworICAgIEhhbmRsZSBkYXRhUmVmOwogI2lmbmRlZiBEYXRhSFNldERhdGFSZWZXaXRoQW5jaG9yCi0JUHlNYWNfUFJFQ0hFQ0soRGF0YUhTZXREYXRhUmVmV2l0aEFuY2hvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGF0YUhTZXREYXRhUmVmV2l0aEFuY2hvcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmFuY2hvckRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRhdGFSZWZUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFSZWYpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSFNldERhdGFSZWZXaXRoQW5jaG9yKGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jaG9yRGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWZUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZhbmNob3JEYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkYXRhUmVmVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhUmVmKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRGF0YUhTZXREYXRhUmVmV2l0aEFuY2hvcihkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2hvckRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIR2V0RGF0YVJlZldpdGhBbmNob3IoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7Ci0JSGFuZGxlIGFuY2hvckRhdGFSZWY7Ci0JT1NUeXBlIGRhdGFSZWZUeXBlOwotCUhhbmRsZSBkYXRhUmVmOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFIYW5kbGVyIGRoOworICAgIEhhbmRsZSBhbmNob3JEYXRhUmVmOworICAgIE9TVHlwZSBkYXRhUmVmVHlwZTsKKyAgICBIYW5kbGUgZGF0YVJlZjsKICNpZm5kZWYgRGF0YUhHZXREYXRhUmVmV2l0aEFuY2hvcgotCVB5TWFjX1BSRUNIRUNLKERhdGFIR2V0RGF0YVJlZldpdGhBbmNob3IpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFIR2V0RGF0YVJlZldpdGhBbmNob3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmYW5jaG9yRGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGF0YVJlZlR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSEdldERhdGFSZWZXaXRoQW5jaG9yKGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jaG9yRGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWZUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFSZWYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBkYXRhUmVmKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZhbmNob3JEYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkYXRhUmVmVHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IERhdGFIR2V0RGF0YVJlZldpdGhBbmNob3IoZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmNob3JEYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZlR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVJlZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGRhdGFSZWYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIU2V0TWFjT1NGaWxlVHlwZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhSGFuZGxlciBkaDsKLQlPU1R5cGUgZmlsZVR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CisgICAgT1NUeXBlIGZpbGVUeXBlOwogI2lmbmRlZiBEYXRhSFNldE1hY09TRmlsZVR5cGUKLQlQeU1hY19QUkVDSEVDSyhEYXRhSFNldE1hY09TRmlsZVR5cGUpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFIU2V0TWFjT1NGaWxlVHlwZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmZpbGVUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhTZXRNYWNPU0ZpbGVUeXBlKGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlVHlwZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZmaWxlVHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IERhdGFIU2V0TWFjT1NGaWxlVHlwZShkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVR5cGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIU2V0VGltZUJhc2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7Ci0JVGltZUJhc2UgdGI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CisgICAgVGltZUJhc2UgdGI7CiAjaWZuZGVmIERhdGFIU2V0VGltZUJhc2UKLQlQeU1hY19QUkVDSEVDSyhEYXRhSFNldFRpbWVCYXNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEYXRhSFNldFRpbWVCYXNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgVGltZUJhc2VPYmpfQ29udmVydCwgJnRiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhTZXRUaW1lQmFzZShkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgIHRiKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVCYXNlT2JqX0NvbnZlcnQsICZ0YikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IERhdGFIU2V0VGltZUJhc2UoZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0Yik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUhHZXRJbmZvRmxhZ3MoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7Ci0JVUludDMyIGZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFIYW5kbGVyIGRoOworICAgIFVJbnQzMiBmbGFnczsKICNpZm5kZWYgRGF0YUhHZXRJbmZvRmxhZ3MKLQlQeU1hY19QUkVDSEVDSyhEYXRhSEdldEluZm9GbGFncyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGF0YUhHZXRJbmZvRmxhZ3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IERhdGFIR2V0SW5mb0ZsYWdzKGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSEdldEluZm9GbGFncyhkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EYXRhSEdldEZpbGVTaXplNjQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7Ci0Jd2lkZSBmaWxlU2l6ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBEYXRhSGFuZGxlciBkaDsKKyAgICB3aWRlIGZpbGVTaXplOwogI2lmbmRlZiBEYXRhSEdldEZpbGVTaXplNjQKLQlQeU1hY19QUkVDSEVDSyhEYXRhSEdldEZpbGVTaXplNjQpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFIR2V0RmlsZVNpemU2NCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhHZXRGaWxlU2l6ZTY0KGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmZmlsZVNpemUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZHdpZGUsIGZpbGVTaXplKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRGF0YUhHZXRGaWxlU2l6ZTY0KGRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlsZVNpemUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZHdpZGUsIGZpbGVTaXplKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EYXRhSFByZWV4dGVuZDY0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCURhdGFIYW5kbGVyIGRoOwotCXdpZGUgbWF4VG9BZGQ7Ci0Jd2lkZSBzcGFjZUFkZGVkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFIYW5kbGVyIGRoOworICAgIHdpZGUgbWF4VG9BZGQ7CisgICAgd2lkZSBzcGFjZUFkZGVkOwogI2lmbmRlZiBEYXRhSFByZWV4dGVuZDY0Ci0JUHlNYWNfUFJFQ0hFQ0soRGF0YUhQcmVleHRlbmQ2NCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGF0YUhQcmVleHRlbmQ2NCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldHdpZGUsICZtYXhUb0FkZCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IERhdGFIUHJlZXh0ZW5kNjQoZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAmbWF4VG9BZGQsCi0JICAgICAgICAgICAgICAgICAgICAgICAmc3BhY2VBZGRlZCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgc3BhY2VBZGRlZCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXR3aWRlLCAmbWF4VG9BZGQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSFByZWV4dGVuZDY0KGRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1heFRvQWRkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNwYWNlQWRkZWQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZHdpZGUsIHNwYWNlQWRkZWQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIU2V0RmlsZVNpemU2NChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhSGFuZGxlciBkaDsKLQl3aWRlIGZpbGVTaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFIYW5kbGVyIGRoOworICAgIHdpZGUgZmlsZVNpemU7CiAjaWZuZGVmIERhdGFIU2V0RmlsZVNpemU2NAotCVB5TWFjX1BSRUNIRUNLKERhdGFIU2V0RmlsZVNpemU2NCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGF0YUhTZXRGaWxlU2l6ZTY0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0d2lkZSwgJmZpbGVTaXplKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhTZXRGaWxlU2l6ZTY0KGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmZmlsZVNpemUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0d2lkZSwgJmZpbGVTaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRGF0YUhTZXRGaWxlU2l6ZTY0KGRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlsZVNpemUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIR2V0RnJlZVNwYWNlNjQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7Ci0Jd2lkZSBmcmVlU2l6ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBEYXRhSGFuZGxlciBkaDsKKyAgICB3aWRlIGZyZWVTaXplOwogI2lmbmRlZiBEYXRhSEdldEZyZWVTcGFjZTY0Ci0JUHlNYWNfUFJFQ0hFQ0soRGF0YUhHZXRGcmVlU3BhY2U2NCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGF0YUhHZXRGcmVlU3BhY2U2NCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhHZXRGcmVlU3BhY2U2NChkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZmcmVlU2l6ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgZnJlZVNpemUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSEdldEZyZWVTcGFjZTY0KGRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZyZWVTaXplKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGR3aWRlLCBmcmVlU2l6ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUhBcHBlbmQ2NChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhSGFuZGxlciBkaDsKLQl2b2lkICogZGF0YTsKLQl3aWRlIGZpbGVPZmZzZXQ7Ci0JdW5zaWduZWQgbG9uZyBzaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFIYW5kbGVyIGRoOworICAgIHZvaWQgKiBkYXRhOworICAgIHdpZGUgZmlsZU9mZnNldDsKKyAgICB1bnNpZ25lZCBsb25nIHNpemU7CiAjaWZuZGVmIERhdGFIQXBwZW5kNjQKLQlQeU1hY19QUkVDSEVDSyhEYXRhSEFwcGVuZDY0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhEYXRhSEFwcGVuZDY0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mc2wiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRhdGEsCi0JICAgICAgICAgICAgICAgICAgICAgICZzaXplKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhBcHBlbmQ2NChkaCwKLQkgICAgICAgICAgICAgICAgICAgIGRhdGEsCi0JICAgICAgICAgICAgICAgICAgICAmZmlsZU9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgIHNpemUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZHdpZGUsIGZpbGVPZmZzZXQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mc2wiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRGF0YUhBcHBlbmQ2NChkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAmZmlsZU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZHdpZGUsIGZpbGVPZmZzZXQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIUG9sbFJlYWQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7Ci0Jdm9pZCAqIGRhdGFQdHI7Ci0JVUludDMyIGRhdGFTaXplU29GYXI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CisgICAgdm9pZCAqIGRhdGFQdHI7CisgICAgVUludDMyIGRhdGFTaXplU29GYXI7CiAjaWZuZGVmIERhdGFIUG9sbFJlYWQKLQlQeU1hY19QUkVDSEVDSyhEYXRhSFBvbGxSZWFkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEYXRhSFBvbGxSZWFkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGF0YVB0cikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IERhdGFIUG9sbFJlYWQoZGgsCi0JICAgICAgICAgICAgICAgICAgICBkYXRhUHRyLAotCSAgICAgICAgICAgICAgICAgICAgJmRhdGFTaXplU29GYXIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGRhdGFTaXplU29GYXIpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVB0cikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IERhdGFIUG9sbFJlYWQoZGgsCisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFTaXplU29GYXIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTaXplU29GYXIpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIR2V0RGF0YUF2YWlsYWJpbGl0eShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhSGFuZGxlciBkaDsKLQlsb25nIG9mZnNldDsKLQlsb25nIGxlbjsKLQlsb25nIG1pc3Npbmdfb2Zmc2V0OwotCWxvbmcgbWlzc2luZ19sZW47CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CisgICAgbG9uZyBvZmZzZXQ7CisgICAgbG9uZyBsZW47CisgICAgbG9uZyBtaXNzaW5nX29mZnNldDsKKyAgICBsb25nIG1pc3NpbmdfbGVuOwogI2lmbmRlZiBEYXRhSEdldERhdGFBdmFpbGFiaWxpdHkKLQlQeU1hY19QUkVDSEVDSyhEYXRhSEdldERhdGFBdmFpbGFiaWxpdHkpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFIR2V0RGF0YUF2YWlsYWJpbGl0eSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZvZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICZsZW4pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSEdldERhdGFBdmFpbGFiaWxpdHkoZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWlzc2luZ19vZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtaXNzaW5nX2xlbik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIG1pc3Npbmdfb2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgIG1pc3NpbmdfbGVuKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZsZW4pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSEdldERhdGFBdmFpbGFiaWxpdHkoZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWlzc2luZ19vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtaXNzaW5nX2xlbik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIG1pc3Npbmdfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIG1pc3NpbmdfbGVuKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EYXRhSEdldERhdGFSZWZBc1R5cGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7Ci0JT1NUeXBlIHJlcXVlc3RlZFR5cGU7Ci0JSGFuZGxlIGRhdGFSZWY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CisgICAgT1NUeXBlIHJlcXVlc3RlZFR5cGU7CisgICAgSGFuZGxlIGRhdGFSZWY7CiAjaWZuZGVmIERhdGFIR2V0RGF0YVJlZkFzVHlwZQotCVB5TWFjX1BSRUNIRUNLKERhdGFIR2V0RGF0YVJlZkFzVHlwZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGF0YUhHZXREYXRhUmVmQXNUeXBlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcmVxdWVzdGVkVHlwZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IERhdGFIR2V0RGF0YVJlZkFzVHlwZShkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFSZWYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBkYXRhUmVmKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnJlcXVlc3RlZFR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSEdldERhdGFSZWZBc1R5cGUoZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUmVmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgZGF0YVJlZik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUhTZXREYXRhUmVmRXh0ZW5zaW9uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCURhdGFIYW5kbGVyIGRoOwotCUhhbmRsZSBleHRlbnNpb247Ci0JT1NUeXBlIGlkVHlwZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBEYXRhSGFuZGxlciBkaDsKKyAgICBIYW5kbGUgZXh0ZW5zaW9uOworICAgIE9TVHlwZSBpZFR5cGU7CiAjaWZuZGVmIERhdGFIU2V0RGF0YVJlZkV4dGVuc2lvbgotCVB5TWFjX1BSRUNIRUNLKERhdGFIU2V0RGF0YVJlZkV4dGVuc2lvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGF0YUhTZXREYXRhUmVmRXh0ZW5zaW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmV4dGVuc2lvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaWRUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhTZXREYXRhUmVmRXh0ZW5zaW9uKGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkVHlwZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZXh0ZW5zaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpZFR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSFNldERhdGFSZWZFeHRlbnNpb24oZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRUeXBlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EYXRhSEdldERhdGFSZWZFeHRlbnNpb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7Ci0JSGFuZGxlIGV4dGVuc2lvbjsKLQlPU1R5cGUgaWRUeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFIYW5kbGVyIGRoOworICAgIEhhbmRsZSBleHRlbnNpb247CisgICAgT1NUeXBlIGlkVHlwZTsKICNpZm5kZWYgRGF0YUhHZXREYXRhUmVmRXh0ZW5zaW9uCi0JUHlNYWNfUFJFQ0hFQ0soRGF0YUhHZXREYXRhUmVmRXh0ZW5zaW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEYXRhSEdldERhdGFSZWZFeHRlbnNpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpZFR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSEdldERhdGFSZWZFeHRlbnNpb24oZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZleHRlbnNpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkVHlwZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGV4dGVuc2lvbik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpZFR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSEdldERhdGFSZWZFeHRlbnNpb24oZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZleHRlbnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkVHlwZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGV4dGVuc2lvbik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUhHZXRNb3ZpZVdpdGhGbGFncyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhSGFuZGxlciBkaDsKLQlNb3ZpZSB0aGVNb3ZpZTsKLQlzaG9ydCBpZDsKLQlzaG9ydCBmbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBEYXRhSGFuZGxlciBkaDsKKyAgICBNb3ZpZSB0aGVNb3ZpZTsKKyAgICBzaG9ydCBpZDsKKyAgICBzaG9ydCBmbGFnczsKICNpZm5kZWYgRGF0YUhHZXRNb3ZpZVdpdGhGbGFncwotCVB5TWFjX1BSRUNIRUNLKERhdGFIR2V0TW92aWVXaXRoRmxhZ3MpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFIR2V0TW92aWVXaXRoRmxhZ3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IERhdGFIR2V0TW92aWVXaXRoRmxhZ3MoZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlTW92aWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaWQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9OZXcsIHRoZU1vdmllLAotCSAgICAgICAgICAgICAgICAgICAgIGlkKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRGF0YUhHZXRNb3ZpZVdpdGhGbGFncyhkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVNb3ZpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX05ldywgdGhlTW92aWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaWQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIR2V0RmlsZVR5cGVPcmRlcmluZyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhSGFuZGxlciBkaDsKLQlEYXRhSEZpbGVUeXBlT3JkZXJpbmdIYW5kbGUgb3JkZXJpbmdMaXN0SGFuZGxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFIYW5kbGVyIGRoOworICAgIERhdGFIRmlsZVR5cGVPcmRlcmluZ0hhbmRsZSBvcmRlcmluZ0xpc3RIYW5kbGU7CiAjaWZuZGVmIERhdGFIR2V0RmlsZVR5cGVPcmRlcmluZwotCVB5TWFjX1BSRUNIRUNLKERhdGFIR2V0RmlsZVR5cGVPcmRlcmluZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGF0YUhHZXRGaWxlVHlwZU9yZGVyaW5nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSEdldEZpbGVUeXBlT3JkZXJpbmcoZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvcmRlcmluZ0xpc3RIYW5kbGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBvcmRlcmluZ0xpc3RIYW5kbGUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSEdldEZpbGVUeXBlT3JkZXJpbmcoZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvcmRlcmluZ0xpc3RIYW5kbGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBvcmRlcmluZ0xpc3RIYW5kbGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIQ3JlYXRlRmlsZVdpdGhGbGFncyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhSGFuZGxlciBkaDsKLQlPU1R5cGUgY3JlYXRvcjsKLQlCb29sZWFuIGRlbGV0ZUV4aXN0aW5nOwotCVVJbnQzMiBmbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBEYXRhSGFuZGxlciBkaDsKKyAgICBPU1R5cGUgY3JlYXRvcjsKKyAgICBCb29sZWFuIGRlbGV0ZUV4aXN0aW5nOworICAgIFVJbnQzMiBmbGFnczsKICNpZm5kZWYgRGF0YUhDcmVhdGVGaWxlV2l0aEZsYWdzCi0JUHlNYWNfUFJFQ0hFQ0soRGF0YUhDcmVhdGVGaWxlV2l0aEZsYWdzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEYXRhSENyZWF0ZUZpbGVXaXRoRmxhZ3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNyZWF0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgICZkZWxldGVFeGlzdGluZywKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhDcmVhdGVGaWxlV2l0aEZsYWdzKGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGVFeGlzdGluZywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjcmVhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVsZXRlRXhpc3RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IERhdGFIQ3JlYXRlRmlsZVdpdGhGbGFncyhkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlRXhpc3RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EYXRhSEdldEluZm8oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7Ci0JT1NUeXBlIHdoYXQ7Ci0Jdm9pZCAqIGluZm87CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CisgICAgT1NUeXBlIHdoYXQ7CisgICAgdm9pZCAqIGluZm87CiAjaWZuZGVmIERhdGFIR2V0SW5mbwotCVB5TWFjX1BSRUNIRUNLKERhdGFIR2V0SW5mbyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGF0YUhHZXRJbmZvKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZzIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJndoYXQsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbmZvKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhHZXRJbmZvKGRoLAotCSAgICAgICAgICAgICAgICAgICB3aGF0LAotCSAgICAgICAgICAgICAgICAgICBpbmZvKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ3aGF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5mbykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IERhdGFIR2V0SW5mbyhkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgd2hhdCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW5mbyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUhTZXRJZGxlTWFuYWdlcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhSGFuZGxlciBkaDsKLQlJZGxlTWFuYWdlciBpbTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBEYXRhSGFuZGxlciBkaDsKKyAgICBJZGxlTWFuYWdlciBpbTsKICNpZm5kZWYgRGF0YUhTZXRJZGxlTWFuYWdlcgotCVB5TWFjX1BSRUNIRUNLKERhdGFIU2V0SWRsZU1hbmFnZXIpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFIU2V0SWRsZU1hbmFnZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAotCSAgICAgICAgICAgICAgICAgICAgICBJZGxlTWFuYWdlck9ial9Db252ZXJ0LCAmaW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSFNldElkbGVNYW5hZ2VyKGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgaW0pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSWRsZU1hbmFnZXJPYmpfQ29udmVydCwgJmltKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRGF0YUhTZXRJZGxlTWFuYWdlcihkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EYXRhSERlbGV0ZUZpbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CiAjaWZuZGVmIERhdGFIRGVsZXRlRmlsZQotCVB5TWFjX1BSRUNIRUNLKERhdGFIRGVsZXRlRmlsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGF0YUhEZWxldGVGaWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSERlbGV0ZUZpbGUoZGgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSERlbGV0ZUZpbGUoZGgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIU2V0TW92aWVVc2FnZUZsYWdzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCURhdGFIYW5kbGVyIGRoOwotCWxvbmcgZmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CisgICAgbG9uZyBmbGFnczsKICNpZm5kZWYgRGF0YUhTZXRNb3ZpZVVzYWdlRmxhZ3MKLQlQeU1hY19QUkVDSEVDSyhEYXRhSFNldE1vdmllVXNhZ2VGbGFncyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGF0YUhTZXRNb3ZpZVVzYWdlRmxhZ3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IERhdGFIU2V0TW92aWVVc2FnZUZsYWdzKGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRGF0YUhTZXRNb3ZpZVVzYWdlRmxhZ3MoZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIVXNlVGVtcG9yYXJ5RGF0YVJlZihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhSGFuZGxlciBkaDsKLQlsb25nIGluRmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CisgICAgbG9uZyBpbkZsYWdzOwogI2lmbmRlZiBEYXRhSFVzZVRlbXBvcmFyeURhdGFSZWYKLQlQeU1hY19QUkVDSEVDSyhEYXRhSFVzZVRlbXBvcmFyeURhdGFSZWYpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFIVXNlVGVtcG9yYXJ5RGF0YVJlZik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluRmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSFVzZVRlbXBvcmFyeURhdGFSZWYoZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRmxhZ3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5GbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IERhdGFIVXNlVGVtcG9yYXJ5RGF0YVJlZihkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5GbGFncyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUhHZXRUZW1wb3JhcnlEYXRhUmVmQ2FwYWJpbGl0aWVzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCURhdGFIYW5kbGVyIGRoOwotCWxvbmcgb3V0VW5kZXJzdG9vZEZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFIYW5kbGVyIGRoOworICAgIGxvbmcgb3V0VW5kZXJzdG9vZEZsYWdzOwogI2lmbmRlZiBEYXRhSEdldFRlbXBvcmFyeURhdGFSZWZDYXBhYmlsaXRpZXMKLQlQeU1hY19QUkVDSEVDSyhEYXRhSEdldFRlbXBvcmFyeURhdGFSZWZDYXBhYmlsaXRpZXMpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFIR2V0VGVtcG9yYXJ5RGF0YVJlZkNhcGFiaWxpdGllcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhHZXRUZW1wb3JhcnlEYXRhUmVmQ2FwYWJpbGl0aWVzKGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0VW5kZXJzdG9vZEZsYWdzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRVbmRlcnN0b29kRmxhZ3MpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSEdldFRlbXBvcmFyeURhdGFSZWZDYXBhYmlsaXRpZXMoZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRVbmRlcnN0b29kRmxhZ3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dFVuZGVyc3Rvb2RGbGFncyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUhSZW5hbWVGaWxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCURhdGFIYW5kbGVyIGRoOwotCUhhbmRsZSBuZXdEYXRhUmVmOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFIYW5kbGVyIGRoOworICAgIEhhbmRsZSBuZXdEYXRhUmVmOwogI2lmbmRlZiBEYXRhSFJlbmFtZUZpbGUKLQlQeU1hY19QUkVDSEVDSyhEYXRhSFJlbmFtZUZpbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFIUmVuYW1lRmlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmbmV3RGF0YVJlZikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IERhdGFIUmVuYW1lRmlsZShkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgbmV3RGF0YVJlZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJm5ld0RhdGFSZWYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSFJlbmFtZUZpbGUoZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0RhdGFSZWYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIUGxheWJhY2tIaW50cyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhSGFuZGxlciBkaDsKLQlsb25nIGZsYWdzOwotCXVuc2lnbmVkIGxvbmcgbWluRmlsZU9mZnNldDsKLQl1bnNpZ25lZCBsb25nIG1heEZpbGVPZmZzZXQ7Ci0JbG9uZyBieXRlc1BlclNlY29uZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBEYXRhSGFuZGxlciBkaDsKKyAgICBsb25nIGZsYWdzOworICAgIHVuc2lnbmVkIGxvbmcgbWluRmlsZU9mZnNldDsKKyAgICB1bnNpZ25lZCBsb25nIG1heEZpbGVPZmZzZXQ7CisgICAgbG9uZyBieXRlc1BlclNlY29uZDsKICNpZm5kZWYgRGF0YUhQbGF5YmFja0hpbnRzCi0JUHlNYWNfUFJFQ0hFQ0soRGF0YUhQbGF5YmFja0hpbnRzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEYXRhSFBsYXliYWNrSGludHMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbGxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgJm1pbkZpbGVPZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICZtYXhGaWxlT2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAmYnl0ZXNQZXJTZWNvbmQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSFBsYXliYWNrSGludHMoZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5GaWxlT2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhGaWxlT2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICBieXRlc1BlclNlY29uZCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbGxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1pbkZpbGVPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXhGaWxlT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYnl0ZXNQZXJTZWNvbmQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSFBsYXliYWNrSGludHMoZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5GaWxlT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhGaWxlT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlc1BlclNlY29uZCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUhQbGF5YmFja0hpbnRzNjQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7Ci0JbG9uZyBmbGFnczsKLQl3aWRlIG1pbkZpbGVPZmZzZXQ7Ci0Jd2lkZSBtYXhGaWxlT2Zmc2V0OwotCWxvbmcgYnl0ZXNQZXJTZWNvbmQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CisgICAgbG9uZyBmbGFnczsKKyAgICB3aWRlIG1pbkZpbGVPZmZzZXQ7CisgICAgd2lkZSBtYXhGaWxlT2Zmc2V0OworICAgIGxvbmcgYnl0ZXNQZXJTZWNvbmQ7CiAjaWZuZGVmIERhdGFIUGxheWJhY2tIaW50czY0Ci0JUHlNYWNfUFJFQ0hFQ0soRGF0YUhQbGF5YmFja0hpbnRzNjQpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFIUGxheWJhY2tIaW50czY0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbE8mTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0d2lkZSwgJm1pbkZpbGVPZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldHdpZGUsICZtYXhGaWxlT2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAmYnl0ZXNQZXJTZWNvbmQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSFBsYXliYWNrSGludHM2NChkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWluRmlsZU9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWF4RmlsZU9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlc1BlclNlY29uZCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsTyZPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXR3aWRlLCAmbWluRmlsZU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0d2lkZSwgJm1heEZpbGVPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZieXRlc1BlclNlY29uZCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IERhdGFIUGxheWJhY2tIaW50czY0KGRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtaW5GaWxlT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXhGaWxlT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzUGVyU2Vjb25kKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EYXRhSEdldERhdGFSYXRlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCURhdGFIYW5kbGVyIGRoOwotCWxvbmcgZmxhZ3M7Ci0JbG9uZyBieXRlc1BlclNlY29uZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBEYXRhSGFuZGxlciBkaDsKKyAgICBsb25nIGZsYWdzOworICAgIGxvbmcgYnl0ZXNQZXJTZWNvbmQ7CiAjaWZuZGVmIERhdGFIR2V0RGF0YVJhdGUKLQlQeU1hY19QUkVDSEVDSyhEYXRhSEdldERhdGFSYXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEYXRhSEdldERhdGFSYXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSEdldERhdGFSYXRlKGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAmYnl0ZXNQZXJTZWNvbmQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGJ5dGVzUGVyU2Vjb25kKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRGF0YUhHZXREYXRhUmF0ZShkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ5dGVzUGVyU2Vjb25kKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBieXRlc1BlclNlY29uZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUhTZXRUaW1lSGludHMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7Ci0JbG9uZyBmbGFnczsKLQlsb25nIGJhbmR3aWR0aFByaW9yaXR5OwotCVRpbWVTY2FsZSBzY2FsZTsKLQlUaW1lVmFsdWUgbWluVGltZTsKLQlUaW1lVmFsdWUgbWF4VGltZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBEYXRhSGFuZGxlciBkaDsKKyAgICBsb25nIGZsYWdzOworICAgIGxvbmcgYmFuZHdpZHRoUHJpb3JpdHk7CisgICAgVGltZVNjYWxlIHNjYWxlOworICAgIFRpbWVWYWx1ZSBtaW5UaW1lOworICAgIFRpbWVWYWx1ZSBtYXhUaW1lOwogI2lmbmRlZiBEYXRhSFNldFRpbWVIaW50cwotCVB5TWFjX1BSRUNIRUNLKERhdGFIU2V0VGltZUhpbnRzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEYXRhSFNldFRpbWVIaW50cyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsbGxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgJmJhbmR3aWR0aFByaW9yaXR5LAotCSAgICAgICAgICAgICAgICAgICAgICAmc2NhbGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZtaW5UaW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAmbWF4VGltZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IERhdGFIU2V0VGltZUhpbnRzKGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGJhbmR3aWR0aFByaW9yaXR5LAotCSAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgIG1pblRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgbWF4VGltZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbGxsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZiYW5kd2lkdGhQcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWluVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1heFRpbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSFNldFRpbWVIaW50cyhkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYW5kd2lkdGhQcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5UaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFRpbWUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZER2V0TWF4U3JjUmVjdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQlzaG9ydCBpbnB1dFN0ZDsKLQlSZWN0IG1heFNyY1JlY3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgc2hvcnQgaW5wdXRTdGQ7CisgICAgUmVjdCBtYXhTcmNSZWN0OwogI2lmbmRlZiBWREdldE1heFNyY1JlY3QKLQlQeU1hY19QUkVDSEVDSyhWREdldE1heFNyY1JlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKFZER2V0TWF4U3JjUmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlucHV0U3RkKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRHZXRNYXhTcmNSZWN0KGNpLAotCSAgICAgICAgICAgICAgICAgICAgICBpbnB1dFN0ZCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1heFNyY1JlY3QpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZtYXhTcmNSZWN0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlucHV0U3RkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRHZXRNYXhTcmNSZWN0KGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFN0ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1heFNyY1JlY3QpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZtYXhTcmNSZWN0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WREdldEFjdGl2ZVNyY1JlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0Jc2hvcnQgaW5wdXRTdGQ7Ci0JUmVjdCBhY3RpdmVTcmNSZWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIHNob3J0IGlucHV0U3RkOworICAgIFJlY3QgYWN0aXZlU3JjUmVjdDsKICNpZm5kZWYgVkRHZXRBY3RpdmVTcmNSZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soVkRHZXRBY3RpdmVTcmNSZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhWREdldEFjdGl2ZVNyY1JlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZpbnB1dFN0ZCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZER2V0QWN0aXZlU3JjUmVjdChjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRTdGQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZhY3RpdmVTcmNSZWN0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmYWN0aXZlU3JjUmVjdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnB1dFN0ZCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZER2V0QWN0aXZlU3JjUmVjdChjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRTdGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhY3RpdmVTcmNSZWN0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmYWN0aXZlU3JjUmVjdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRTZXREaWdpdGl6ZXJSZWN0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCVJlY3QgZGlnaXRpemVyUmVjdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICBSZWN0IGRpZ2l0aXplclJlY3Q7CiAjaWZuZGVmIFZEU2V0RGlnaXRpemVyUmVjdAotCVB5TWFjX1BSRUNIRUNLKFZEU2V0RGlnaXRpemVyUmVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRTZXREaWdpdGl6ZXJSZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWRFNldERpZ2l0aXplclJlY3QoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZkaWdpdGl6ZXJSZWN0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmZGlnaXRpemVyUmVjdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZEU2V0RGlnaXRpemVyUmVjdChjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRpZ2l0aXplclJlY3QpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZkaWdpdGl6ZXJSZWN0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WREdldERpZ2l0aXplclJlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0JUmVjdCBkaWdpdGl6ZXJSZWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIFJlY3QgZGlnaXRpemVyUmVjdDsKICNpZm5kZWYgVkRHZXREaWdpdGl6ZXJSZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soVkRHZXREaWdpdGl6ZXJSZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhWREdldERpZ2l0aXplclJlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZER2V0RGlnaXRpemVyUmVjdChjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJmRpZ2l0aXplclJlY3QpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZkaWdpdGl6ZXJSZWN0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRHZXREaWdpdGl6ZXJSZWN0KGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGlnaXRpemVyUmVjdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmRpZ2l0aXplclJlY3QpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZER2V0VkJsYW5rUmVjdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQlzaG9ydCBpbnB1dFN0ZDsKLQlSZWN0IHZCbGFua1JlY3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgc2hvcnQgaW5wdXRTdGQ7CisgICAgUmVjdCB2QmxhbmtSZWN0OwogI2lmbmRlZiBWREdldFZCbGFua1JlY3QKLQlQeU1hY19QUkVDSEVDSyhWREdldFZCbGFua1JlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKFZER2V0VkJsYW5rUmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlucHV0U3RkKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRHZXRWQmxhbmtSZWN0KGNpLAotCSAgICAgICAgICAgICAgICAgICAgICBpbnB1dFN0ZCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZCbGFua1JlY3QpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZ2QmxhbmtSZWN0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlucHV0U3RkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRHZXRWQmxhbmtSZWN0KGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFN0ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZCbGFua1JlY3QpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZ2QmxhbmtSZWN0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WREdldE1hc2tQaXhNYXAoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0JUGl4TWFwSGFuZGxlIG1hc2tQaXhNYXA7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgUGl4TWFwSGFuZGxlIG1hc2tQaXhNYXA7CiAjaWZuZGVmIFZER2V0TWFza1BpeE1hcAotCVB5TWFjX1BSRUNIRUNLKFZER2V0TWFza1BpeE1hcCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRHZXRNYXNrUGl4TWFwKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZtYXNrUGl4TWFwKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRHZXRNYXNrUGl4TWFwKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICBtYXNrUGl4TWFwKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmbWFza1BpeE1hcCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZER2V0TWFza1BpeE1hcChjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFza1BpeE1hcCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRVc2VUaGlzQ0xVVChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQlDVGFiSGFuZGxlIGNvbG9yVGFibGVIYW5kbGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgQ1RhYkhhbmRsZSBjb2xvclRhYmxlSGFuZGxlOwogI2lmbmRlZiBWRFVzZVRoaXNDTFVUCi0JUHlNYWNfUFJFQ0hFQ0soVkRVc2VUaGlzQ0xVVCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRVc2VUaGlzQ0xVVCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmY29sb3JUYWJsZUhhbmRsZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZEVXNlVGhpc0NMVVQoY2ksCi0JICAgICAgICAgICAgICAgICAgICBjb2xvclRhYmxlSGFuZGxlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmY29sb3JUYWJsZUhhbmRsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZEVXNlVGhpc0NMVVQoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICBjb2xvclRhYmxlSGFuZGxlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WRFNldElucHV0R2FtbWFWYWx1ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQlGaXhlZCBjaGFubmVsMTsKLQlGaXhlZCBjaGFubmVsMjsKLQlGaXhlZCBjaGFubmVsMzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICBGaXhlZCBjaGFubmVsMTsKKyAgICBGaXhlZCBjaGFubmVsMjsKKyAgICBGaXhlZCBjaGFubmVsMzsKICNpZm5kZWYgVkRTZXRJbnB1dEdhbW1hVmFsdWUKLQlQeU1hY19QUkVDSEVDSyhWRFNldElucHV0R2FtbWFWYWx1ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRTZXRJbnB1dEdhbW1hVmFsdWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZjaGFubmVsMSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZjaGFubmVsMiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZjaGFubmVsMykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZEU2V0SW5wdXRHYW1tYVZhbHVlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwxLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJmNoYW5uZWwxLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJmNoYW5uZWwyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJmNoYW5uZWwzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRTZXRJbnB1dEdhbW1hVmFsdWUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbDMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZER2V0SW5wdXRHYW1tYVZhbHVlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCUZpeGVkIGNoYW5uZWwxOwotCUZpeGVkIGNoYW5uZWwyOwotCUZpeGVkIGNoYW5uZWwzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIEZpeGVkIGNoYW5uZWwxOworICAgIEZpeGVkIGNoYW5uZWwyOworICAgIEZpeGVkIGNoYW5uZWwzOwogI2lmbmRlZiBWREdldElucHV0R2FtbWFWYWx1ZQotCVB5TWFjX1BSRUNIRUNLKFZER2V0SW5wdXRHYW1tYVZhbHVlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWREdldElucHV0R2FtbWFWYWx1ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRHZXRJbnB1dEdhbW1hVmFsdWUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNoYW5uZWwxLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZjaGFubmVsMiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2hhbm5lbDMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGaXhlZCwgY2hhbm5lbDEsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGaXhlZCwgY2hhbm5lbDIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGaXhlZCwgY2hhbm5lbDMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWREdldElucHV0R2FtbWFWYWx1ZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2hhbm5lbDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNoYW5uZWwyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjaGFubmVsMyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBjaGFubmVsMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBjaGFubmVsMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBjaGFubmVsMyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRTZXRCcmlnaHRuZXNzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCXVuc2lnbmVkIHNob3J0IGJyaWdodG5lc3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgdW5zaWduZWQgc2hvcnQgYnJpZ2h0bmVzczsKICNpZm5kZWYgVkRTZXRCcmlnaHRuZXNzCi0JUHlNYWNfUFJFQ0hFQ0soVkRTZXRCcmlnaHRuZXNzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWRFNldEJyaWdodG5lc3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZEU2V0QnJpZ2h0bmVzcyhjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmJyaWdodG5lc3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsSCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGJyaWdodG5lc3MpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWRFNldEJyaWdodG5lc3MoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZicmlnaHRuZXNzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibEgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBicmlnaHRuZXNzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WREdldEJyaWdodG5lc3MoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0JdW5zaWduZWQgc2hvcnQgYnJpZ2h0bmVzczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICB1bnNpZ25lZCBzaG9ydCBicmlnaHRuZXNzOwogI2lmbmRlZiBWREdldEJyaWdodG5lc3MKLQlQeU1hY19QUkVDSEVDSyhWREdldEJyaWdodG5lc3MpOworICAgIFB5TWFjX1BSRUNIRUNLKFZER2V0QnJpZ2h0bmVzcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRHZXRCcmlnaHRuZXNzKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmYnJpZ2h0bmVzcyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxIIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgYnJpZ2h0bmVzcyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZER2V0QnJpZ2h0bmVzcyhjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmJyaWdodG5lc3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGJyaWdodG5lc3MpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZEU2V0Q29udHJhc3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0JdW5zaWduZWQgc2hvcnQgY29udHJhc3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgdW5zaWduZWQgc2hvcnQgY29udHJhc3Q7CiAjaWZuZGVmIFZEU2V0Q29udHJhc3QKLQlQeU1hY19QUkVDSEVDSyhWRFNldENvbnRyYXN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhWRFNldENvbnRyYXN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWRFNldENvbnRyYXN0KGNpLAotCSAgICAgICAgICAgICAgICAgICAgJmNvbnRyYXN0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibEgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBjb250cmFzdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZEU2V0Q29udHJhc3QoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAmY29udHJhc3QpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyYXN0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WRFNldEh1ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQl1bnNpZ25lZCBzaG9ydCBodWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgdW5zaWduZWQgc2hvcnQgaHVlOwogI2lmbmRlZiBWRFNldEh1ZQotCVB5TWFjX1BSRUNIRUNLKFZEU2V0SHVlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWRFNldEh1ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRTZXRIdWUoY2ksCi0JICAgICAgICAgICAgICAgJmh1ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxIIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgaHVlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRTZXRIdWUoY2ksCisgICAgICAgICAgICAgICAgICAgJmh1ZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgaHVlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WRFNldFNoYXJwbmVzcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQl1bnNpZ25lZCBzaG9ydCBzaGFycG5lc3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgdW5zaWduZWQgc2hvcnQgc2hhcnBuZXNzOwogI2lmbmRlZiBWRFNldFNoYXJwbmVzcwotCVB5TWFjX1BSRUNIRUNLKFZEU2V0U2hhcnBuZXNzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWRFNldFNoYXJwbmVzcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRTZXRTaGFycG5lc3MoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgJnNoYXJwbmVzcyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxIIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgc2hhcnBuZXNzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRTZXRTaGFycG5lc3MoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgJnNoYXJwbmVzcyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcnBuZXNzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WRFNldFNhdHVyYXRpb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0JdW5zaWduZWQgc2hvcnQgc2F0dXJhdGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICB1bnNpZ25lZCBzaG9ydCBzYXR1cmF0aW9uOwogI2lmbmRlZiBWRFNldFNhdHVyYXRpb24KLQlQeU1hY19QUkVDSEVDSyhWRFNldFNhdHVyYXRpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKFZEU2V0U2F0dXJhdGlvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRTZXRTYXR1cmF0aW9uKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2F0dXJhdGlvbik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxIIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgc2F0dXJhdGlvbik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZEU2V0U2F0dXJhdGlvbihjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNhdHVyYXRpb24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHNhdHVyYXRpb24pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZER2V0Q29udHJhc3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0JdW5zaWduZWQgc2hvcnQgY29udHJhc3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgdW5zaWduZWQgc2hvcnQgY29udHJhc3Q7CiAjaWZuZGVmIFZER2V0Q29udHJhc3QKLQlQeU1hY19QUkVDSEVDSyhWREdldENvbnRyYXN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhWREdldENvbnRyYXN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWREdldENvbnRyYXN0KGNpLAotCSAgICAgICAgICAgICAgICAgICAgJmNvbnRyYXN0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibEgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBjb250cmFzdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZER2V0Q29udHJhc3QoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAmY29udHJhc3QpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyYXN0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WREdldEh1ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQl1bnNpZ25lZCBzaG9ydCBodWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgdW5zaWduZWQgc2hvcnQgaHVlOwogI2lmbmRlZiBWREdldEh1ZQotCVB5TWFjX1BSRUNIRUNLKFZER2V0SHVlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWREdldEh1ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRHZXRIdWUoY2ksCi0JICAgICAgICAgICAgICAgJmh1ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxIIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgaHVlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRHZXRIdWUoY2ksCisgICAgICAgICAgICAgICAgICAgJmh1ZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgaHVlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WREdldFNoYXJwbmVzcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQl1bnNpZ25lZCBzaG9ydCBzaGFycG5lc3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgdW5zaWduZWQgc2hvcnQgc2hhcnBuZXNzOwogI2lmbmRlZiBWREdldFNoYXJwbmVzcwotCVB5TWFjX1BSRUNIRUNLKFZER2V0U2hhcnBuZXNzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWREdldFNoYXJwbmVzcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRHZXRTaGFycG5lc3MoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgJnNoYXJwbmVzcyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxIIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgc2hhcnBuZXNzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRHZXRTaGFycG5lc3MoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgJnNoYXJwbmVzcyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcnBuZXNzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WREdldFNhdHVyYXRpb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0JdW5zaWduZWQgc2hvcnQgc2F0dXJhdGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICB1bnNpZ25lZCBzaG9ydCBzYXR1cmF0aW9uOwogI2lmbmRlZiBWREdldFNhdHVyYXRpb24KLQlQeU1hY19QUkVDSEVDSyhWREdldFNhdHVyYXRpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKFZER2V0U2F0dXJhdGlvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRHZXRTYXR1cmF0aW9uKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2F0dXJhdGlvbik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxIIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgc2F0dXJhdGlvbik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZER2V0U2F0dXJhdGlvbihjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNhdHVyYXRpb24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHNhdHVyYXRpb24pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZER3JhYk9uZUZyYW1lKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwogI2lmbmRlZiBWREdyYWJPbmVGcmFtZQotCVB5TWFjX1BSRUNIRUNLKFZER3JhYk9uZUZyYW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWREdyYWJPbmVGcmFtZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRHcmFiT25lRnJhbWUoY2kpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWREdyYWJPbmVGcmFtZShjaSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRHZXRNYXhBdXhCdWZmZXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0JUGl4TWFwSGFuZGxlIHBtOwotCVJlY3QgcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICBQaXhNYXBIYW5kbGUgcG07CisgICAgUmVjdCByOwogI2lmbmRlZiBWREdldE1heEF1eEJ1ZmZlcgotCVB5TWFjX1BSRUNIRUNLKFZER2V0TWF4QXV4QnVmZmVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWREdldE1heEF1eEJ1ZmZlcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRHZXRNYXhBdXhCdWZmZXIoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgJnBtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICZyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBwbSwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZyKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRHZXRNYXhBdXhCdWZmZXIoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBwbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZyKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WREdldEN1cnJlbnRGbGFncyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQlsb25nIGlucHV0Q3VycmVudEZsYWc7Ci0JbG9uZyBvdXRwdXRDdXJyZW50RmxhZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICBsb25nIGlucHV0Q3VycmVudEZsYWc7CisgICAgbG9uZyBvdXRwdXRDdXJyZW50RmxhZzsKICNpZm5kZWYgVkRHZXRDdXJyZW50RmxhZ3MKLQlQeU1hY19QUkVDSEVDSyhWREdldEN1cnJlbnRGbGFncyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRHZXRDdXJyZW50RmxhZ3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZER2V0Q3VycmVudEZsYWdzKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICZpbnB1dEN1cnJlbnRGbGFnLAotCSAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXRDdXJyZW50RmxhZyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGlucHV0Q3VycmVudEZsYWcsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0cHV0Q3VycmVudEZsYWcpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWREdldEN1cnJlbnRGbGFncyhjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5wdXRDdXJyZW50RmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0Q3VycmVudEZsYWcpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dEN1cnJlbnRGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dEN1cnJlbnRGbGFnKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WRFNldEtleUNvbG9yKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCWxvbmcgaW5kZXg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgbG9uZyBpbmRleDsKICNpZm5kZWYgVkRTZXRLZXlDb2xvcgotCVB5TWFjX1BSRUNIRUNLKFZEU2V0S2V5Q29sb3IpOworICAgIFB5TWFjX1BSRUNIRUNLKFZEU2V0S2V5Q29sb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZEU2V0S2V5Q29sb3IoY2ksCi0JICAgICAgICAgICAgICAgICAgICBpbmRleCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZEU2V0S2V5Q29sb3IoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRHZXRLZXlDb2xvcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQlsb25nIGluZGV4OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIGxvbmcgaW5kZXg7CiAjaWZuZGVmIFZER2V0S2V5Q29sb3IKLQlQeU1hY19QUkVDSEVDSyhWREdldEtleUNvbG9yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWREdldEtleUNvbG9yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWREdldEtleUNvbG9yKGNpLAotCSAgICAgICAgICAgICAgICAgICAgJmluZGV4KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBpbmRleCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZER2V0S2V5Q29sb3IoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WREFkZEtleUNvbG9yKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCWxvbmcgaW5kZXg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgbG9uZyBpbmRleDsKICNpZm5kZWYgVkRBZGRLZXlDb2xvcgotCVB5TWFjX1BSRUNIRUNLKFZEQWRkS2V5Q29sb3IpOworICAgIFB5TWFjX1BSRUNIRUNLKFZEQWRkS2V5Q29sb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZEQWRkS2V5Q29sb3IoY2ksCi0JICAgICAgICAgICAgICAgICAgICAmaW5kZXgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGluZGV4KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRBZGRLZXlDb2xvcihjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZpbmRleCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZER2V0TmV4dEtleUNvbG9yKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCWxvbmcgaW5kZXg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgbG9uZyBpbmRleDsKICNpZm5kZWYgVkRHZXROZXh0S2V5Q29sb3IKLQlQeU1hY19QUkVDSEVDSyhWREdldE5leHRLZXlDb2xvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRHZXROZXh0S2V5Q29sb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZER2V0TmV4dEtleUNvbG9yKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZGV4KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRHZXROZXh0S2V5Q29sb3IoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZEU2V0S2V5Q29sb3JSYW5nZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQlSR0JDb2xvciBtaW5SR0I7Ci0JUkdCQ29sb3IgbWF4UkdCOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIFJHQkNvbG9yIG1pblJHQjsKKyAgICBSR0JDb2xvciBtYXhSR0I7CiAjaWZuZGVmIFZEU2V0S2V5Q29sb3JSYW5nZQotCVB5TWFjX1BSRUNIRUNLKFZEU2V0S2V5Q29sb3JSYW5nZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRTZXRLZXlDb2xvclJhbmdlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWRFNldEtleUNvbG9yUmFuZ2UoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZtaW5SR0IsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZtYXhSR0IpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFFkUkdCX05ldywgJm1pblJHQiwKLQkgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZtYXhSR0IpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWRFNldEtleUNvbG9yUmFuZ2UoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtaW5SR0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXhSR0IpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFFkUkdCX05ldywgJm1pblJHQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZtYXhSR0IpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZER2V0S2V5Q29sb3JSYW5nZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQlSR0JDb2xvciBtaW5SR0I7Ci0JUkdCQ29sb3IgbWF4UkdCOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIFJHQkNvbG9yIG1pblJHQjsKKyAgICBSR0JDb2xvciBtYXhSR0I7CiAjaWZuZGVmIFZER2V0S2V5Q29sb3JSYW5nZQotCVB5TWFjX1BSRUNIRUNLKFZER2V0S2V5Q29sb3JSYW5nZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRHZXRLZXlDb2xvclJhbmdlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWREdldEtleUNvbG9yUmFuZ2UoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZtaW5SR0IsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZtYXhSR0IpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFFkUkdCX05ldywgJm1pblJHQiwKLQkgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZtYXhSR0IpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWREdldEtleUNvbG9yUmFuZ2UoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtaW5SR0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXhSR0IpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFFkUkdCX05ldywgJm1pblJHQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZtYXhSR0IpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZEU2V0SW5wdXRDb2xvclNwYWNlTW9kZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQlzaG9ydCBjb2xvclNwYWNlTW9kZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICBzaG9ydCBjb2xvclNwYWNlTW9kZTsKICNpZm5kZWYgVkRTZXRJbnB1dENvbG9yU3BhY2VNb2RlCi0JUHlNYWNfUFJFQ0hFQ0soVkRTZXRJbnB1dENvbG9yU3BhY2VNb2RlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWRFNldElucHV0Q29sb3JTcGFjZU1vZGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZjb2xvclNwYWNlTW9kZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZEU2V0SW5wdXRDb2xvclNwYWNlTW9kZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JTcGFjZU1vZGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY29sb3JTcGFjZU1vZGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWRFNldElucHV0Q29sb3JTcGFjZU1vZGUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yU3BhY2VNb2RlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WREdldElucHV0Q29sb3JTcGFjZU1vZGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0Jc2hvcnQgY29sb3JTcGFjZU1vZGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgc2hvcnQgY29sb3JTcGFjZU1vZGU7CiAjaWZuZGVmIFZER2V0SW5wdXRDb2xvclNwYWNlTW9kZQotCVB5TWFjX1BSRUNIRUNLKFZER2V0SW5wdXRDb2xvclNwYWNlTW9kZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRHZXRJbnB1dENvbG9yU3BhY2VNb2RlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWREdldElucHV0Q29sb3JTcGFjZU1vZGUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2xvclNwYWNlTW9kZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgY29sb3JTcGFjZU1vZGUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWREdldElucHV0Q29sb3JTcGFjZU1vZGUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2xvclNwYWNlTW9kZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JTcGFjZU1vZGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZEU2V0Q2xpcFN0YXRlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCXNob3J0IGNsaXBFbmFibGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgc2hvcnQgY2xpcEVuYWJsZTsKICNpZm5kZWYgVkRTZXRDbGlwU3RhdGUKLQlQeU1hY19QUkVDSEVDSyhWRFNldENsaXBTdGF0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRTZXRDbGlwU3RhdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZjbGlwRW5hYmxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRTZXRDbGlwU3RhdGUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgY2xpcEVuYWJsZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjbGlwRW5hYmxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRTZXRDbGlwU3RhdGUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcEVuYWJsZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRHZXRDbGlwU3RhdGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0Jc2hvcnQgY2xpcEVuYWJsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICBzaG9ydCBjbGlwRW5hYmxlOwogI2lmbmRlZiBWREdldENsaXBTdGF0ZQotCVB5TWFjX1BSRUNIRUNLKFZER2V0Q2xpcFN0YXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWREdldENsaXBTdGF0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRHZXRDbGlwU3RhdGUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgJmNsaXBFbmFibGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGNsaXBFbmFibGUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWREdldENsaXBTdGF0ZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmY2xpcEVuYWJsZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcEVuYWJsZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRTZXRDbGlwUmduKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCVJnbkhhbmRsZSBjbGlwUmVnaW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIFJnbkhhbmRsZSBjbGlwUmVnaW9uOwogI2lmbmRlZiBWRFNldENsaXBSZ24KLQlQeU1hY19QUkVDSEVDSyhWRFNldENsaXBSZ24pOworICAgIFB5TWFjX1BSRUNIRUNLKFZEU2V0Q2xpcFJnbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmY2xpcFJlZ2lvbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZEU2V0Q2xpcFJnbihjaSwKLQkgICAgICAgICAgICAgICAgICAgY2xpcFJlZ2lvbik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmNsaXBSZWdpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWRFNldENsaXBSZ24oY2ksCisgICAgICAgICAgICAgICAgICAgICAgIGNsaXBSZWdpb24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZEQ2xlYXJDbGlwUmduKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCVJnbkhhbmRsZSBjbGlwUmVnaW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIFJnbkhhbmRsZSBjbGlwUmVnaW9uOwogI2lmbmRlZiBWRENsZWFyQ2xpcFJnbgotCVB5TWFjX1BSRUNIRUNLKFZEQ2xlYXJDbGlwUmduKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWRENsZWFyQ2xpcFJnbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmY2xpcFJlZ2lvbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZEQ2xlYXJDbGlwUmduKGNpLAotCSAgICAgICAgICAgICAgICAgICAgIGNsaXBSZWdpb24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZjbGlwUmVnaW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRDbGVhckNsaXBSZ24oY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcFJlZ2lvbik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRHZXRDTFVUSW5Vc2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0JQ1RhYkhhbmRsZSBjb2xvclRhYmxlSGFuZGxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIENUYWJIYW5kbGUgY29sb3JUYWJsZUhhbmRsZTsKICNpZm5kZWYgVkRHZXRDTFVUSW5Vc2UKLQlQeU1hY19QUkVDSEVDSyhWREdldENMVVRJblVzZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRHZXRDTFVUSW5Vc2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZER2V0Q0xVVEluVXNlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICZjb2xvclRhYmxlSGFuZGxlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgY29sb3JUYWJsZUhhbmRsZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZER2V0Q0xVVEluVXNlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICZjb2xvclRhYmxlSGFuZGxlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgY29sb3JUYWJsZUhhbmRsZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRTZXRQTExGaWx0ZXJUeXBlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCXNob3J0IHBsbFR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgc2hvcnQgcGxsVHlwZTsKICNpZm5kZWYgVkRTZXRQTExGaWx0ZXJUeXBlCi0JUHlNYWNfUFJFQ0hFQ0soVkRTZXRQTExGaWx0ZXJUeXBlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWRFNldFBMTEZpbHRlclR5cGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZwbGxUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRTZXRQTExGaWx0ZXJUeXBlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBwbGxUeXBlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBsbFR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWRFNldFBMTEZpbHRlclR5cGUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsbFR5cGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZER2V0UExMRmlsdGVyVHlwZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQlzaG9ydCBwbGxUeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIHNob3J0IHBsbFR5cGU7CiAjaWZuZGVmIFZER2V0UExMRmlsdGVyVHlwZQotCVB5TWFjX1BSRUNIRUNLKFZER2V0UExMRmlsdGVyVHlwZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRHZXRQTExGaWx0ZXJUeXBlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWREdldFBMTEZpbHRlclR5cGUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZwbGxUeXBlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBwbGxUeXBlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRHZXRQTExGaWx0ZXJUeXBlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGxsVHlwZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgcGxsVHlwZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRHZXRNYXNrYW5kVmFsdWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0JdW5zaWduZWQgc2hvcnQgYmxlbmRMZXZlbDsKLQlsb25nIG1hc2s7Ci0JbG9uZyB2YWx1ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICB1bnNpZ25lZCBzaG9ydCBibGVuZExldmVsOworICAgIGxvbmcgbWFzazsKKyAgICBsb25nIHZhbHVlOwogI2lmbmRlZiBWREdldE1hc2thbmRWYWx1ZQotCVB5TWFjX1BSRUNIRUNLKFZER2V0TWFza2FuZFZhbHVlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWREdldE1hc2thbmRWYWx1ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJkgiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmJsZW5kTGV2ZWwpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWREdldE1hc2thbmRWYWx1ZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICBibGVuZExldmVsLAotCSAgICAgICAgICAgICAgICAgICAgICAgICZtYXNrLAotCSAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIG1hc2ssCi0JICAgICAgICAgICAgICAgICAgICAgdmFsdWUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYmxlbmRMZXZlbCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZER2V0TWFza2FuZFZhbHVlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsZW5kTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgbWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRTZXRNYXN0ZXJCbGVuZExldmVsKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCXVuc2lnbmVkIHNob3J0IGJsZW5kTGV2ZWw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgdW5zaWduZWQgc2hvcnQgYmxlbmRMZXZlbDsKICNpZm5kZWYgVkRTZXRNYXN0ZXJCbGVuZExldmVsCi0JUHlNYWNfUFJFQ0hFQ0soVkRTZXRNYXN0ZXJCbGVuZExldmVsKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWRFNldE1hc3RlckJsZW5kTGV2ZWwpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZEU2V0TWFzdGVyQmxlbmRMZXZlbChjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJsZW5kTGV2ZWwpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsSCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGJsZW5kTGV2ZWwpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWRFNldE1hc3RlckJsZW5kTGV2ZWwoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZibGVuZExldmVsKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibEgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBibGVuZExldmVsKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WRFNldFBsYXlUaHJ1T25PZmYoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0Jc2hvcnQgc3RhdGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgc2hvcnQgc3RhdGU7CiAjaWZuZGVmIFZEU2V0UGxheVRocnVPbk9mZgotCVB5TWFjX1BSRUNIRUNLKFZEU2V0UGxheVRocnVPbk9mZik7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRTZXRQbGF5VGhydU9uT2ZmKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmc3RhdGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWRFNldFBsYXlUaHJ1T25PZmYoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXRlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRTZXRQbGF5VGhydU9uT2ZmKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRTZXRGaWVsZFByZWZlcmVuY2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0Jc2hvcnQgZmllbGRGbGFnOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIHNob3J0IGZpZWxkRmxhZzsKICNpZm5kZWYgVkRTZXRGaWVsZFByZWZlcmVuY2UKLQlQeU1hY19QUkVDSEVDSyhWRFNldEZpZWxkUHJlZmVyZW5jZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRTZXRGaWVsZFByZWZlcmVuY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZmaWVsZEZsYWcpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWRFNldEZpZWxkUHJlZmVyZW5jZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZEZsYWcpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRGbGFnKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRTZXRGaWVsZFByZWZlcmVuY2UoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRGbGFnKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WREdldEZpZWxkUHJlZmVyZW5jZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQlzaG9ydCBmaWVsZEZsYWc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgc2hvcnQgZmllbGRGbGFnOwogI2lmbmRlZiBWREdldEZpZWxkUHJlZmVyZW5jZQotCVB5TWFjX1BSRUNIRUNLKFZER2V0RmllbGRQcmVmZXJlbmNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWREdldEZpZWxkUHJlZmVyZW5jZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRHZXRGaWVsZFByZWZlcmVuY2UoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkRmxhZyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgZmllbGRGbGFnKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRHZXRGaWVsZFByZWZlcmVuY2UoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkRmxhZyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRGbGFnKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WRFByZWZsaWdodEdsb2JhbFJlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0JR3JhZlB0ciB0aGVXaW5kb3c7Ci0JUmVjdCBnbG9iYWxSZWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIEdyYWZQdHIgdGhlV2luZG93OworICAgIFJlY3QgZ2xvYmFsUmVjdDsKICNpZm5kZWYgVkRQcmVmbGlnaHRHbG9iYWxSZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soVkRQcmVmbGlnaHRHbG9iYWxSZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhWRFByZWZsaWdodEdsb2JhbFJlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX0NvbnZlcnQsICZ0aGVXaW5kb3cpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWRFByZWZsaWdodEdsb2JhbFJlY3QoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZVdpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsb2JhbFJlY3QpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZnbG9iYWxSZWN0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfQ29udmVydCwgJnRoZVdpbmRvdykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZEUHJlZmxpZ2h0R2xvYmFsUmVjdChjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlV2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xvYmFsUmVjdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmdsb2JhbFJlY3QpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZEU2V0UGxheVRocnVHbG9iYWxSZWN0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCUdyYWZQdHIgdGhlV2luZG93OwotCVJlY3QgZ2xvYmFsUmVjdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICBHcmFmUHRyIHRoZVdpbmRvdzsKKyAgICBSZWN0IGdsb2JhbFJlY3Q7CiAjaWZuZGVmIFZEU2V0UGxheVRocnVHbG9iYWxSZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soVkRTZXRQbGF5VGhydUdsb2JhbFJlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKFZEU2V0UGxheVRocnVHbG9iYWxSZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgR3JhZk9ial9Db252ZXJ0LCAmdGhlV2luZG93KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRTZXRQbGF5VGhydUdsb2JhbFJlY3QoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlV2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG9iYWxSZWN0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmZ2xvYmFsUmVjdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX0NvbnZlcnQsICZ0aGVXaW5kb3cpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWRFNldFBsYXlUaHJ1R2xvYmFsUmVjdChjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVXaW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsb2JhbFJlY3QpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZnbG9iYWxSZWN0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WRFNldEJsYWNrTGV2ZWxWYWx1ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQl1bnNpZ25lZCBzaG9ydCBibGFja0xldmVsOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIHVuc2lnbmVkIHNob3J0IGJsYWNrTGV2ZWw7CiAjaWZuZGVmIFZEU2V0QmxhY2tMZXZlbFZhbHVlCi0JUHlNYWNfUFJFQ0hFQ0soVkRTZXRCbGFja0xldmVsVmFsdWUpOworICAgIFB5TWFjX1BSRUNIRUNLKFZEU2V0QmxhY2tMZXZlbFZhbHVlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWRFNldEJsYWNrTGV2ZWxWYWx1ZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmYmxhY2tMZXZlbCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxIIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgYmxhY2tMZXZlbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZEU2V0QmxhY2tMZXZlbFZhbHVlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZibGFja0xldmVsKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibEgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBibGFja0xldmVsKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WREdldEJsYWNrTGV2ZWxWYWx1ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQl1bnNpZ25lZCBzaG9ydCBibGFja0xldmVsOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIHVuc2lnbmVkIHNob3J0IGJsYWNrTGV2ZWw7CiAjaWZuZGVmIFZER2V0QmxhY2tMZXZlbFZhbHVlCi0JUHlNYWNfUFJFQ0hFQ0soVkRHZXRCbGFja0xldmVsVmFsdWUpOworICAgIFB5TWFjX1BSRUNIRUNLKFZER2V0QmxhY2tMZXZlbFZhbHVlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWREdldEJsYWNrTGV2ZWxWYWx1ZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmYmxhY2tMZXZlbCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxIIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgYmxhY2tMZXZlbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZER2V0QmxhY2tMZXZlbFZhbHVlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZibGFja0xldmVsKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibEgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBibGFja0xldmVsKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WRFNldFdoaXRlTGV2ZWxWYWx1ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQl1bnNpZ25lZCBzaG9ydCB3aGl0ZUxldmVsOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIHVuc2lnbmVkIHNob3J0IHdoaXRlTGV2ZWw7CiAjaWZuZGVmIFZEU2V0V2hpdGVMZXZlbFZhbHVlCi0JUHlNYWNfUFJFQ0hFQ0soVkRTZXRXaGl0ZUxldmVsVmFsdWUpOworICAgIFB5TWFjX1BSRUNIRUNLKFZEU2V0V2hpdGVMZXZlbFZhbHVlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWRFNldFdoaXRlTGV2ZWxWYWx1ZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmd2hpdGVMZXZlbCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxIIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgd2hpdGVMZXZlbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZEU2V0V2hpdGVMZXZlbFZhbHVlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3aGl0ZUxldmVsKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibEgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB3aGl0ZUxldmVsKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WREdldFdoaXRlTGV2ZWxWYWx1ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQl1bnNpZ25lZCBzaG9ydCB3aGl0ZUxldmVsOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIHVuc2lnbmVkIHNob3J0IHdoaXRlTGV2ZWw7CiAjaWZuZGVmIFZER2V0V2hpdGVMZXZlbFZhbHVlCi0JUHlNYWNfUFJFQ0hFQ0soVkRHZXRXaGl0ZUxldmVsVmFsdWUpOworICAgIFB5TWFjX1BSRUNIRUNLKFZER2V0V2hpdGVMZXZlbFZhbHVlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWREdldFdoaXRlTGV2ZWxWYWx1ZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmd2hpdGVMZXZlbCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxIIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgd2hpdGVMZXZlbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZER2V0V2hpdGVMZXZlbFZhbHVlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3aGl0ZUxldmVsKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibEgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB3aGl0ZUxldmVsKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WREdldFZpZGVvRGVmYXVsdHMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0JdW5zaWduZWQgc2hvcnQgYmxhY2tMZXZlbDsKLQl1bnNpZ25lZCBzaG9ydCB3aGl0ZUxldmVsOwotCXVuc2lnbmVkIHNob3J0IGJyaWdodG5lc3M7Ci0JdW5zaWduZWQgc2hvcnQgaHVlOwotCXVuc2lnbmVkIHNob3J0IHNhdHVyYXRpb247Ci0JdW5zaWduZWQgc2hvcnQgY29udHJhc3Q7Ci0JdW5zaWduZWQgc2hvcnQgc2hhcnBuZXNzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIHVuc2lnbmVkIHNob3J0IGJsYWNrTGV2ZWw7CisgICAgdW5zaWduZWQgc2hvcnQgd2hpdGVMZXZlbDsKKyAgICB1bnNpZ25lZCBzaG9ydCBicmlnaHRuZXNzOworICAgIHVuc2lnbmVkIHNob3J0IGh1ZTsKKyAgICB1bnNpZ25lZCBzaG9ydCBzYXR1cmF0aW9uOworICAgIHVuc2lnbmVkIHNob3J0IGNvbnRyYXN0OworICAgIHVuc2lnbmVkIHNob3J0IHNoYXJwbmVzczsKICNpZm5kZWYgVkRHZXRWaWRlb0RlZmF1bHRzCi0JUHlNYWNfUFJFQ0hFQ0soVkRHZXRWaWRlb0RlZmF1bHRzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWREdldFZpZGVvRGVmYXVsdHMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZER2V0VmlkZW9EZWZhdWx0cyhjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJmJsYWNrTGV2ZWwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZ3aGl0ZUxldmVsLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmYnJpZ2h0bmVzcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJmh1ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJnNhdHVyYXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZjb250cmFzdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJnNoYXJwbmVzcyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxISEhISEhIIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgYmxhY2tMZXZlbCwKLQkgICAgICAgICAgICAgICAgICAgICB3aGl0ZUxldmVsLAotCSAgICAgICAgICAgICAgICAgICAgIGJyaWdodG5lc3MsCi0JICAgICAgICAgICAgICAgICAgICAgaHVlLAotCSAgICAgICAgICAgICAgICAgICAgIHNhdHVyYXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgY29udHJhc3QsCi0JICAgICAgICAgICAgICAgICAgICAgc2hhcnBuZXNzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRHZXRWaWRlb0RlZmF1bHRzKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYmxhY2tMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJndoaXRlTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZicmlnaHRuZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2F0dXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbnRyYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2hhcnBuZXNzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibEhISEhISEgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBibGFja0xldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgIHdoaXRlTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgYnJpZ2h0bmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBodWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2F0dXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb250cmFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaGFycG5lc3MpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZER2V0TnVtYmVyT2ZJbnB1dHMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0Jc2hvcnQgaW5wdXRzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIHNob3J0IGlucHV0czsKICNpZm5kZWYgVkRHZXROdW1iZXJPZklucHV0cwotCVB5TWFjX1BSRUNIRUNLKFZER2V0TnVtYmVyT2ZJbnB1dHMpOworICAgIFB5TWFjX1BSRUNIRUNLKFZER2V0TnVtYmVyT2ZJbnB1dHMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZER2V0TnVtYmVyT2ZJbnB1dHMoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5wdXRzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBpbnB1dHMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWREdldE51bWJlck9mSW5wdXRzKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlucHV0cyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WREdldElucHV0Rm9ybWF0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCXNob3J0IGlucHV0OwotCXNob3J0IGZvcm1hdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICBzaG9ydCBpbnB1dDsKKyAgICBzaG9ydCBmb3JtYXQ7CiAjaWZuZGVmIFZER2V0SW5wdXRGb3JtYXQKLQlQeU1hY19QUkVDSEVDSyhWREdldElucHV0Rm9ybWF0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhWREdldElucHV0Rm9ybWF0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5wdXQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWREdldElucHV0Rm9ybWF0KGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQsCi0JICAgICAgICAgICAgICAgICAgICAgICAmZm9ybWF0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBmb3JtYXQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5wdXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWREdldElucHV0Rm9ybWF0KGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmZm9ybWF0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZEU2V0SW5wdXQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0Jc2hvcnQgaW5wdXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgc2hvcnQgaW5wdXQ7CiAjaWZuZGVmIFZEU2V0SW5wdXQKLQlQeU1hY19QUkVDSEVDSyhWRFNldElucHV0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhWRFNldElucHV0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5wdXQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWRFNldElucHV0KGNpLAotCSAgICAgICAgICAgICAgICAgaW5wdXQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5wdXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWRFNldElucHV0KGNpLAorICAgICAgICAgICAgICAgICAgICAgaW5wdXQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZER2V0SW5wdXQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0Jc2hvcnQgaW5wdXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgc2hvcnQgaW5wdXQ7CiAjaWZuZGVmIFZER2V0SW5wdXQKLQlQeU1hY19QUkVDSEVDSyhWREdldElucHV0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhWREdldElucHV0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWREdldElucHV0KGNpLAotCSAgICAgICAgICAgICAgICAgJmlucHV0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBpbnB1dCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZER2V0SW5wdXQoY2ksCisgICAgICAgICAgICAgICAgICAgICAmaW5wdXQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WRFNldElucHV0U3RhbmRhcmQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0Jc2hvcnQgaW5wdXRTdGFuZGFyZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICBzaG9ydCBpbnB1dFN0YW5kYXJkOwogI2lmbmRlZiBWRFNldElucHV0U3RhbmRhcmQKLQlQeU1hY19QUkVDSEVDSyhWRFNldElucHV0U3RhbmRhcmQpOworICAgIFB5TWFjX1BSRUNIRUNLKFZEU2V0SW5wdXRTdGFuZGFyZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlucHV0U3RhbmRhcmQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWRFNldElucHV0U3RhbmRhcmQoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0U3RhbmRhcmQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5wdXRTdGFuZGFyZCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZEU2V0SW5wdXRTdGFuZGFyZChjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRTdGFuZGFyZCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRTZXR1cEJ1ZmZlcnMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0JVmRpZ0J1ZmZlclJlY0xpc3RIYW5kbGUgYnVmZmVyTGlzdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICBWZGlnQnVmZmVyUmVjTGlzdEhhbmRsZSBidWZmZXJMaXN0OwogI2lmbmRlZiBWRFNldHVwQnVmZmVycwotCVB5TWFjX1BSRUNIRUNLKFZEU2V0dXBCdWZmZXJzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWRFNldHVwQnVmZmVycyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmYnVmZmVyTGlzdCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZEU2V0dXBCdWZmZXJzKGNpLAotCSAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlckxpc3QpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZidWZmZXJMaXN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRTZXR1cEJ1ZmZlcnMoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyTGlzdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRHcmFiT25lRnJhbWVBc3luYyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQlzaG9ydCBidWZmZXI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgc2hvcnQgYnVmZmVyOwogI2lmbmRlZiBWREdyYWJPbmVGcmFtZUFzeW5jCi0JUHlNYWNfUFJFQ0hFQ0soVkRHcmFiT25lRnJhbWVBc3luYyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRHcmFiT25lRnJhbWVBc3luYyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmJ1ZmZlcikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZER3JhYk9uZUZyYW1lQXN5bmMoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYnVmZmVyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRHcmFiT25lRnJhbWVBc3luYyhjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkREb25lKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCXNob3J0IGJ1ZmZlcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICBzaG9ydCBidWZmZXI7CiAjaWZuZGVmIFZERG9uZQotCVB5TWFjX1BSRUNIRUNLKFZERG9uZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkREb25lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmYnVmZmVyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkREb25lKGNpLAotCSAgICAgICAgICAgICBidWZmZXIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYnVmZmVyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkREb25lKGNpLAorICAgICAgICAgICAgICAgICBidWZmZXIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZEU2V0Q29tcHJlc3Npb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0JT1NUeXBlIGNvbXByZXNzVHlwZTsKLQlzaG9ydCBkZXB0aDsKLQlSZWN0IGJvdW5kczsKLQlDb2RlY1Egc3BhdGlhbFF1YWxpdHk7Ci0JQ29kZWNRIHRlbXBvcmFsUXVhbGl0eTsKLQlsb25nIGtleUZyYW1lUmF0ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICBPU1R5cGUgY29tcHJlc3NUeXBlOworICAgIHNob3J0IGRlcHRoOworICAgIFJlY3QgYm91bmRzOworICAgIENvZGVjUSBzcGF0aWFsUXVhbGl0eTsKKyAgICBDb2RlY1EgdGVtcG9yYWxRdWFsaXR5OworICAgIGxvbmcga2V5RnJhbWVSYXRlOwogI2lmbmRlZiBWRFNldENvbXByZXNzaW9uCi0JUHlNYWNfUFJFQ0hFQ0soVkRTZXRDb21wcmVzc2lvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRTZXRDb21wcmVzc2lvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maGxsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjb21wcmVzc1R5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZkZXB0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNwYXRpYWxRdWFsaXR5LAotCSAgICAgICAgICAgICAgICAgICAgICAmdGVtcG9yYWxRdWFsaXR5LAotCSAgICAgICAgICAgICAgICAgICAgICAma2V5RnJhbWVSYXRlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRTZXRDb21wcmVzc2lvbihjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kcywKLQkgICAgICAgICAgICAgICAgICAgICAgIHNwYXRpYWxRdWFsaXR5LAotCSAgICAgICAgICAgICAgICAgICAgICAgdGVtcG9yYWxRdWFsaXR5LAotCSAgICAgICAgICAgICAgICAgICAgICAga2V5RnJhbWVSYXRlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmYm91bmRzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maGxsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjb21wcmVzc1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNwYXRpYWxRdWFsaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGVtcG9yYWxRdWFsaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAma2V5RnJhbWVSYXRlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRTZXRDb21wcmVzc2lvbihjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYXRpYWxRdWFsaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcG9yYWxRdWFsaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5RnJhbWVSYXRlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmYm91bmRzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WRENvbXByZXNzT25lRnJhbWVBc3luYyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKICNpZm5kZWYgVkRDb21wcmVzc09uZUZyYW1lQXN5bmMKLQlQeU1hY19QUkVDSEVDSyhWRENvbXByZXNzT25lRnJhbWVBc3luYyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRDb21wcmVzc09uZUZyYW1lQXN5bmMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZEQ29tcHJlc3NPbmVGcmFtZUFzeW5jKGNpKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRDb21wcmVzc09uZUZyYW1lQXN5bmMoY2kpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZER2V0SW1hZ2VEZXNjcmlwdGlvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQlJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjOwogI2lmbmRlZiBWREdldEltYWdlRGVzY3JpcHRpb24KLQlQeU1hY19QUkVDSEVDSyhWREdldEltYWdlRGVzY3JpcHRpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKFZER2V0SW1hZ2VEZXNjcmlwdGlvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGVzYykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZER2V0SW1hZ2VEZXNjcmlwdGlvbihjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRlc2MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWREdldEltYWdlRGVzY3JpcHRpb24oY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZEUmVzZXRDb21wcmVzc1NlcXVlbmNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwogI2lmbmRlZiBWRFJlc2V0Q29tcHJlc3NTZXF1ZW5jZQotCVB5TWFjX1BSRUNIRUNLKFZEUmVzZXRDb21wcmVzc1NlcXVlbmNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWRFJlc2V0Q29tcHJlc3NTZXF1ZW5jZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRSZXNldENvbXByZXNzU2VxdWVuY2UoY2kpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWRFJlc2V0Q29tcHJlc3NTZXF1ZW5jZShjaSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRTZXRDb21wcmVzc2lvbk9uT2ZmKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCUJvb2xlYW4gc3RhdGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgQm9vbGVhbiBzdGF0ZTsKICNpZm5kZWYgVkRTZXRDb21wcmVzc2lvbk9uT2ZmCi0JUHlNYWNfUFJFQ0hFQ0soVkRTZXRDb21wcmVzc2lvbk9uT2ZmKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWRFNldENvbXByZXNzaW9uT25PZmYpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZzdGF0ZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZEU2V0Q29tcHJlc3Npb25Pbk9mZihjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWRFNldENvbXByZXNzaW9uT25PZmYoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WREdldENvbXByZXNzaW9uVHlwZXMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0JVkRDb21wcmVzc2lvbkxpc3RIYW5kbGUgaDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICBWRENvbXByZXNzaW9uTGlzdEhhbmRsZSBoOwogI2lmbmRlZiBWREdldENvbXByZXNzaW9uVHlwZXMKLQlQeU1hY19QUkVDSEVDSyhWREdldENvbXByZXNzaW9uVHlwZXMpOworICAgIFB5TWFjX1BSRUNIRUNLKFZER2V0Q29tcHJlc3Npb25UeXBlcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZER2V0Q29tcHJlc3Npb25UeXBlcyhjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgaCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWREdldENvbXByZXNzaW9uVHlwZXMoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZEU2V0VGltZUJhc2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0JVGltZUJhc2UgdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICBUaW1lQmFzZSB0OwogI2lmbmRlZiBWRFNldFRpbWVCYXNlCi0JUHlNYWNfUFJFQ0hFQ0soVkRTZXRUaW1lQmFzZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRTZXRUaW1lQmFzZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIFRpbWVCYXNlT2JqX0NvbnZlcnQsICZ0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRTZXRUaW1lQmFzZShjaSwKLQkgICAgICAgICAgICAgICAgICAgIHQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZUJhc2VPYmpfQ29udmVydCwgJnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWRFNldFRpbWVCYXNlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRTZXRGcmFtZVJhdGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0JRml4ZWQgZnJhbWVzUGVyU2Vjb25kOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIEZpeGVkIGZyYW1lc1BlclNlY29uZDsKICNpZm5kZWYgVkRTZXRGcmFtZVJhdGUKLQlQeU1hY19QUkVDSEVDSyhWRFNldEZyYW1lUmF0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRTZXRGcmFtZVJhdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJmZyYW1lc1BlclNlY29uZCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZEU2V0RnJhbWVSYXRlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgIGZyYW1lc1BlclNlY29uZCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJmZyYW1lc1BlclNlY29uZCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZEU2V0RnJhbWVSYXRlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc1BlclNlY29uZCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRHZXREYXRhUmF0ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQlsb25nIG1pbGxpU2VjUGVyRnJhbWU7Ci0JRml4ZWQgZnJhbWVzUGVyU2Vjb25kOwotCWxvbmcgYnl0ZXNQZXJTZWNvbmQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgbG9uZyBtaWxsaVNlY1BlckZyYW1lOworICAgIEZpeGVkIGZyYW1lc1BlclNlY29uZDsKKyAgICBsb25nIGJ5dGVzUGVyU2Vjb25kOwogI2lmbmRlZiBWREdldERhdGFSYXRlCi0JUHlNYWNfUFJFQ0hFQ0soVkRHZXREYXRhUmF0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRHZXREYXRhUmF0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRHZXREYXRhUmF0ZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICZtaWxsaVNlY1BlckZyYW1lLAotCSAgICAgICAgICAgICAgICAgICAgJmZyYW1lc1BlclNlY29uZCwKLQkgICAgICAgICAgICAgICAgICAgICZieXRlc1BlclNlY29uZCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgbWlsbGlTZWNQZXJGcmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBmcmFtZXNQZXJTZWNvbmQsCi0JICAgICAgICAgICAgICAgICAgICAgYnl0ZXNQZXJTZWNvbmQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWREdldERhdGFSYXRlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgJm1pbGxpU2VjUGVyRnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAmZnJhbWVzUGVyU2Vjb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgJmJ5dGVzUGVyU2Vjb25kKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGxPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtaWxsaVNlY1BlckZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRml4ZWQsIGZyYW1lc1BlclNlY29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBieXRlc1BlclNlY29uZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRHZXRTb3VuZElucHV0RHJpdmVyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCVN0cjI1NSBzb3VuZERyaXZlck5hbWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgU3RyMjU1IHNvdW5kRHJpdmVyTmFtZTsKICNpZm5kZWYgVkRHZXRTb3VuZElucHV0RHJpdmVyCi0JUHlNYWNfUFJFQ0hFQ0soVkRHZXRTb3VuZElucHV0RHJpdmVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWREdldFNvdW5kSW5wdXREcml2ZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIHNvdW5kRHJpdmVyTmFtZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZER2V0U291bmRJbnB1dERyaXZlcihjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291bmREcml2ZXJOYW1lKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgc291bmREcml2ZXJOYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRHZXRTb3VuZElucHV0RHJpdmVyKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VuZERyaXZlck5hbWUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZER2V0RE1BRGVwdGhzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCWxvbmcgZGVwdGhBcnJheTsKLQlsb25nIHByZWZlcnJlZERlcHRoOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIGxvbmcgZGVwdGhBcnJheTsKKyAgICBsb25nIHByZWZlcnJlZERlcHRoOwogI2lmbmRlZiBWREdldERNQURlcHRocwotCVB5TWFjX1BSRUNIRUNLKFZER2V0RE1BRGVwdGhzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWREdldERNQURlcHRocyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRHZXRETUFEZXB0aHMoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgJmRlcHRoQXJyYXksCi0JICAgICAgICAgICAgICAgICAgICAgJnByZWZlcnJlZERlcHRoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgZGVwdGhBcnJheSwKLQkgICAgICAgICAgICAgICAgICAgICBwcmVmZXJyZWREZXB0aCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZER2V0RE1BRGVwdGhzKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICZkZXB0aEFycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICZwcmVmZXJyZWREZXB0aCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoQXJyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZmVycmVkRGVwdGgpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZER2V0UHJlZmVycmVkVGltZVNjYWxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCVRpbWVTY2FsZSBwcmVmZXJyZWQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgVGltZVNjYWxlIHByZWZlcnJlZDsKICNpZm5kZWYgVkRHZXRQcmVmZXJyZWRUaW1lU2NhbGUKLQlQeU1hY19QUkVDSEVDSyhWREdldFByZWZlcnJlZFRpbWVTY2FsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRHZXRQcmVmZXJyZWRUaW1lU2NhbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZER2V0UHJlZmVycmVkVGltZVNjYWxlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcmVmZXJyZWQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHByZWZlcnJlZCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZER2V0UHJlZmVycmVkVGltZVNjYWxlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcmVmZXJyZWQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZlcnJlZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRSZWxlYXNlQXN5bmNCdWZmZXJzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwogI2lmbmRlZiBWRFJlbGVhc2VBc3luY0J1ZmZlcnMKLQlQeU1hY19QUkVDSEVDSyhWRFJlbGVhc2VBc3luY0J1ZmZlcnMpOworICAgIFB5TWFjX1BSRUNIRUNLKFZEUmVsZWFzZUFzeW5jQnVmZmVycyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRSZWxlYXNlQXN5bmNCdWZmZXJzKGNpKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRSZWxlYXNlQXN5bmNCdWZmZXJzKGNpKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WRFNldERhdGFSYXRlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCWxvbmcgYnl0ZXNQZXJTZWNvbmQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgbG9uZyBieXRlc1BlclNlY29uZDsKICNpZm5kZWYgVkRTZXREYXRhUmF0ZQotCVB5TWFjX1BSRUNIRUNLKFZEU2V0RGF0YVJhdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFZEU2V0RGF0YVJhdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZieXRlc1BlclNlY29uZCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZEU2V0RGF0YVJhdGUoY2ksCi0JICAgICAgICAgICAgICAgICAgICBieXRlc1BlclNlY29uZCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZieXRlc1BlclNlY29uZCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZEU2V0RGF0YVJhdGUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICBieXRlc1BlclNlY29uZCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRHZXRUaW1lQ29kZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQlUaW1lUmVjb3JkIGF0VGltZTsKLQl2b2lkICogdGltZUNvZGVGb3JtYXQ7Ci0Jdm9pZCAqIHRpbWVDb2RlVGltZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICBUaW1lUmVjb3JkIGF0VGltZTsKKyAgICB2b2lkICogdGltZUNvZGVGb3JtYXQ7CisgICAgdm9pZCAqIHRpbWVDb2RlVGltZTsKICNpZm5kZWYgVkRHZXRUaW1lQ29kZQotCVB5TWFjX1BSRUNIRUNLKFZER2V0VGltZUNvZGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFZER2V0VGltZUNvZGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzcyIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGltZUNvZGVGb3JtYXQsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aW1lQ29kZVRpbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWREdldFRpbWVDb2RlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgJmF0VGltZSwKLQkgICAgICAgICAgICAgICAgICAgIHRpbWVDb2RlRm9ybWF0LAotCSAgICAgICAgICAgICAgICAgICAgdGltZUNvZGVUaW1lKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUXRUaW1lUmVjb3JkX05ldywgJmF0VGltZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGltZUNvZGVGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aW1lQ29kZVRpbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWREdldFRpbWVDb2RlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgJmF0VGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVDb2RlRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgdGltZUNvZGVUaW1lKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUXRUaW1lUmVjb3JkX05ldywgJmF0VGltZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRVc2VTYWZlQnVmZmVycyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQlCb29sZWFuIHVzZVNhZmVCdWZmZXJzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIEJvb2xlYW4gdXNlU2FmZUJ1ZmZlcnM7CiAjaWZuZGVmIFZEVXNlU2FmZUJ1ZmZlcnMKLQlQeU1hY19QUkVDSEVDSyhWRFVzZVNhZmVCdWZmZXJzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWRFVzZVNhZmVCdWZmZXJzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmdXNlU2FmZUJ1ZmZlcnMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWRFVzZVNhZmVCdWZmZXJzKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgdXNlU2FmZUJ1ZmZlcnMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdXNlU2FmZUJ1ZmZlcnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWRFVzZVNhZmVCdWZmZXJzKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlU2FmZUJ1ZmZlcnMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZER2V0U291bmRJbnB1dFNvdXJjZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQlsb25nIHZpZGVvSW5wdXQ7Ci0JbG9uZyBzb3VuZElucHV0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIGxvbmcgdmlkZW9JbnB1dDsKKyAgICBsb25nIHNvdW5kSW5wdXQ7CiAjaWZuZGVmIFZER2V0U291bmRJbnB1dFNvdXJjZQotCVB5TWFjX1BSRUNIRUNLKFZER2V0U291bmRJbnB1dFNvdXJjZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRHZXRTb3VuZElucHV0U291cmNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmdmlkZW9JbnB1dCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZER2V0U291bmRJbnB1dFNvdXJjZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9JbnB1dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNvdW5kSW5wdXQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHNvdW5kSW5wdXQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdmlkZW9JbnB1dCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZER2V0U291bmRJbnB1dFNvdXJjZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9JbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNvdW5kSW5wdXQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHNvdW5kSW5wdXQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZER2V0Q29tcHJlc3Npb25UaW1lKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCU9TVHlwZSBjb21wcmVzc2lvblR5cGU7Ci0Jc2hvcnQgZGVwdGg7Ci0JUmVjdCBzcmNSZWN0OwotCUNvZGVjUSBzcGF0aWFsUXVhbGl0eTsKLQlDb2RlY1EgdGVtcG9yYWxRdWFsaXR5OwotCXVuc2lnbmVkIGxvbmcgY29tcHJlc3NUaW1lOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIE9TVHlwZSBjb21wcmVzc2lvblR5cGU7CisgICAgc2hvcnQgZGVwdGg7CisgICAgUmVjdCBzcmNSZWN0OworICAgIENvZGVjUSBzcGF0aWFsUXVhbGl0eTsKKyAgICBDb2RlY1EgdGVtcG9yYWxRdWFsaXR5OworICAgIHVuc2lnbmVkIGxvbmcgY29tcHJlc3NUaW1lOwogI2lmbmRlZiBWREdldENvbXByZXNzaW9uVGltZQotCVB5TWFjX1BSRUNIRUNLKFZER2V0Q29tcHJlc3Npb25UaW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWREdldENvbXByZXNzaW9uVGltZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjb21wcmVzc2lvblR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZkZXB0aCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZER2V0Q29tcHJlc3Npb25UaW1lKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzaW9uVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3JjUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3BhdGlhbFF1YWxpdHksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRlbXBvcmFsUXVhbGl0eSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29tcHJlc3NUaW1lKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mbGxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmc3JjUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICBzcGF0aWFsUXVhbGl0eSwKLQkgICAgICAgICAgICAgICAgICAgICB0ZW1wb3JhbFF1YWxpdHksCi0JICAgICAgICAgICAgICAgICAgICAgY29tcHJlc3NUaW1lKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjb21wcmVzc2lvblR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXB0aCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZER2V0Q29tcHJlc3Npb25UaW1lKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzaW9uVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3JjUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3BhdGlhbFF1YWxpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRlbXBvcmFsUXVhbGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29tcHJlc3NUaW1lKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mbGxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmc3JjUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcGF0aWFsUXVhbGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wb3JhbFF1YWxpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgY29tcHJlc3NUaW1lKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WRFNldFByZWZlcnJlZFBhY2tldFNpemUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0JbG9uZyBwcmVmZXJyZWRQYWNrZXRTaXplSW5CeXRlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICBsb25nIHByZWZlcnJlZFBhY2tldFNpemVJbkJ5dGVzOwogI2lmbmRlZiBWRFNldFByZWZlcnJlZFBhY2tldFNpemUKLQlQeU1hY19QUkVDSEVDSyhWRFNldFByZWZlcnJlZFBhY2tldFNpemUpOworICAgIFB5TWFjX1BSRUNIRUNLKFZEU2V0UHJlZmVycmVkUGFja2V0U2l6ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnByZWZlcnJlZFBhY2tldFNpemVJbkJ5dGVzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRTZXRQcmVmZXJyZWRQYWNrZXRTaXplKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmZXJyZWRQYWNrZXRTaXplSW5CeXRlcyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwcmVmZXJyZWRQYWNrZXRTaXplSW5CeXRlcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZEU2V0UHJlZmVycmVkUGFja2V0U2l6ZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZmVycmVkUGFja2V0U2l6ZUluQnl0ZXMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZEU2V0UHJlZmVycmVkSW1hZ2VEaW1lbnNpb25zKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCWxvbmcgd2lkdGg7Ci0JbG9uZyBoZWlnaHQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgbG9uZyB3aWR0aDsKKyAgICBsb25nIGhlaWdodDsKICNpZm5kZWYgVkRTZXRQcmVmZXJyZWRJbWFnZURpbWVuc2lvbnMKLQlQeU1hY19QUkVDSEVDSyhWRFNldFByZWZlcnJlZEltYWdlRGltZW5zaW9ucyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRTZXRQcmVmZXJyZWRJbWFnZURpbWVuc2lvbnMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmd2lkdGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZoZWlnaHQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWRFNldFByZWZlcnJlZEltYWdlRGltZW5zaW9ucyhjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJndpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaGVpZ2h0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRTZXRQcmVmZXJyZWRJbWFnZURpbWVuc2lvbnMoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WREdldFByZWZlcnJlZEltYWdlRGltZW5zaW9ucyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQlsb25nIHdpZHRoOwotCWxvbmcgaGVpZ2h0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIGxvbmcgd2lkdGg7CisgICAgbG9uZyBoZWlnaHQ7CiAjaWZuZGVmIFZER2V0UHJlZmVycmVkSW1hZ2VEaW1lbnNpb25zCi0JUHlNYWNfUFJFQ0hFQ0soVkRHZXRQcmVmZXJyZWRJbWFnZURpbWVuc2lvbnMpOworICAgIFB5TWFjX1BSRUNIRUNLKFZER2V0UHJlZmVycmVkSW1hZ2VEaW1lbnNpb25zKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWREdldFByZWZlcnJlZEltYWdlRGltZW5zaW9ucyhjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd2lkdGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhlaWdodCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHdpZHRoLAotCSAgICAgICAgICAgICAgICAgICAgIGhlaWdodCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZER2V0UHJlZmVycmVkSW1hZ2VEaW1lbnNpb25zKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaGVpZ2h0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WREdldElucHV0TmFtZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQlsb25nIHZpZGVvSW5wdXQ7Ci0JU3RyMjU1IG5hbWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgbG9uZyB2aWRlb0lucHV0OworICAgIFN0cjI1NSBuYW1lOwogI2lmbmRlZiBWREdldElucHV0TmFtZQotCVB5TWFjX1BSRUNIRUNLKFZER2V0SW5wdXROYW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWREdldElucHV0TmFtZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmdmlkZW9JbnB1dCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBuYW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRHZXRJbnB1dE5hbWUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgdmlkZW9JbnB1dCwKLQkgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdmlkZW9JbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBuYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRHZXRJbnB1dE5hbWUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9JbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WRFNldERlc3RpbmF0aW9uUG9ydChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQlDR3JhZlB0ciBkZXN0UG9ydDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICBDR3JhZlB0ciBkZXN0UG9ydDsKICNpZm5kZWYgVkRTZXREZXN0aW5hdGlvblBvcnQKLQlQeU1hY19QUkVDSEVDSyhWRFNldERlc3RpbmF0aW9uUG9ydCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRTZXREZXN0aW5hdGlvblBvcnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX0NvbnZlcnQsICZkZXN0UG9ydCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZEU2V0RGVzdGluYXRpb25Qb3J0KGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RQb3J0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfQ29udmVydCwgJmRlc3RQb3J0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRTZXREZXN0aW5hdGlvblBvcnQoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdFBvcnQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZER2V0RGV2aWNlTmFtZUFuZEZsYWdzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCVN0cjI1NSBvdXROYW1lOwotCVVJbnQzMiBvdXROYW1lRmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgU3RyMjU1IG91dE5hbWU7CisgICAgVUludDMyIG91dE5hbWVGbGFnczsKICNpZm5kZWYgVkRHZXREZXZpY2VOYW1lQW5kRmxhZ3MKLQlQeU1hY19QUkVDSEVDSyhWREdldERldmljZU5hbWVBbmRGbGFncyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRHZXREZXZpY2VOYW1lQW5kRmxhZ3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIG91dE5hbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWREdldERldmljZU5hbWVBbmRGbGFncyhjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXROYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXROYW1lRmxhZ3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIG91dE5hbWVGbGFncyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIG91dE5hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWREdldERldmljZU5hbWVBbmRGbGFncyhjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXROYW1lRmxhZ3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dE5hbWVGbGFncyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRDYXB0dXJlU3RhdGVDaGFuZ2luZyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQlVSW50MzIgaW5TdGF0ZUZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIFVJbnQzMiBpblN0YXRlRmxhZ3M7CiAjaWZuZGVmIFZEQ2FwdHVyZVN0YXRlQ2hhbmdpbmcKLQlQeU1hY19QUkVDSEVDSyhWRENhcHR1cmVTdGF0ZUNoYW5naW5nKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWRENhcHR1cmVTdGF0ZUNoYW5naW5nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5TdGF0ZUZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRDYXB0dXJlU3RhdGVDaGFuZ2luZyhjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluU3RhdGVGbGFncyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblN0YXRlRmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWRENhcHR1cmVTdGF0ZUNoYW5naW5nKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5TdGF0ZUZsYWdzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9YTUxQYXJzZUdldERldGFpbGVkUGFyc2VFcnJvcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlDb21wb25lbnRJbnN0YW5jZSBhUGFyc2VyOwotCWxvbmcgZXJyb3JMaW5lOwotCVN0cmluZ1B0ciBlcnJEZXNjOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIENvbXBvbmVudEluc3RhbmNlIGFQYXJzZXI7CisgICAgbG9uZyBlcnJvckxpbmU7CisgICAgU3RyaW5nUHRyIGVyckRlc2M7CiAjaWZuZGVmIFhNTFBhcnNlR2V0RGV0YWlsZWRQYXJzZUVycm9yCi0JUHlNYWNfUFJFQ0hFQ0soWE1MUGFyc2VHZXREZXRhaWxlZFBhcnNlRXJyb3IpOworICAgIFB5TWFjX1BSRUNIRUNLKFhNTFBhcnNlR2V0RGV0YWlsZWRQYXJzZUVycm9yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmFQYXJzZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICZlcnJEZXNjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gWE1MUGFyc2VHZXREZXRhaWxlZFBhcnNlRXJyb3IoYVBhcnNlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3JMaW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyckRlc2MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGVycm9yTGluZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYVBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmVyckRlc2MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBYTUxQYXJzZUdldERldGFpbGVkUGFyc2VFcnJvcihhUGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvckxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyRGVzYyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JMaW5lKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9YTUxQYXJzZUFkZEVsZW1lbnQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JQ29tcG9uZW50SW5zdGFuY2UgYVBhcnNlcjsKLQljaGFyIGVsZW1lbnROYW1lOwotCVVJbnQzMiBuYW1lU3BhY2VJRDsKLQlVSW50MzIgZWxlbWVudElEOwotCWxvbmcgZWxlbWVudEZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIENvbXBvbmVudEluc3RhbmNlIGFQYXJzZXI7CisgICAgY2hhciBlbGVtZW50TmFtZTsKKyAgICBVSW50MzIgbmFtZVNwYWNlSUQ7CisgICAgVUludDMyIGVsZW1lbnRJRDsKKyAgICBsb25nIGVsZW1lbnRGbGFnczsKICNpZm5kZWYgWE1MUGFyc2VBZGRFbGVtZW50Ci0JUHlNYWNfUFJFQ0hFQ0soWE1MUGFyc2VBZGRFbGVtZW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhYTUxQYXJzZUFkZEVsZW1lbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmFQYXJzZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICZuYW1lU3BhY2VJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmVsZW1lbnRGbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFhNTFBhcnNlQWRkRWxlbWVudChhUGFyc2VyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmZWxlbWVudE5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVTcGFjZUlELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmZWxlbWVudElELAotCSAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50RmxhZ3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsY2wiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICBlbGVtZW50SUQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZhUGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbmFtZVNwYWNlSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZlbGVtZW50RmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBYTUxQYXJzZUFkZEVsZW1lbnQoYVBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVsZW1lbnROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lU3BhY2VJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVsZW1lbnRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudEZsYWdzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGNsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudElEKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9YTUxQYXJzZUFkZEF0dHJpYnV0ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlDb21wb25lbnRJbnN0YW5jZSBhUGFyc2VyOwotCVVJbnQzMiBlbGVtZW50SUQ7Ci0JVUludDMyIG5hbWVTcGFjZUlEOwotCWNoYXIgYXR0cmlidXRlTmFtZTsKLQlVSW50MzIgYXR0cmlidXRlSUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgQ29tcG9uZW50SW5zdGFuY2UgYVBhcnNlcjsKKyAgICBVSW50MzIgZWxlbWVudElEOworICAgIFVJbnQzMiBuYW1lU3BhY2VJRDsKKyAgICBjaGFyIGF0dHJpYnV0ZU5hbWU7CisgICAgVUludDMyIGF0dHJpYnV0ZUlEOwogI2lmbmRlZiBYTUxQYXJzZUFkZEF0dHJpYnV0ZQotCVB5TWFjX1BSRUNIRUNLKFhNTFBhcnNlQWRkQXR0cmlidXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhYTUxQYXJzZUFkZEF0dHJpYnV0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYVBhcnNlciwKLQkgICAgICAgICAgICAgICAgICAgICAgJmVsZW1lbnRJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm5hbWVTcGFjZUlEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gWE1MUGFyc2VBZGRBdHRyaWJ1dGUoYVBhcnNlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZVNwYWNlSUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJmF0dHJpYnV0ZU5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJmF0dHJpYnV0ZUlEKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGNsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlTmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVJRCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmFQYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZlbGVtZW50SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lU3BhY2VJRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFhNTFBhcnNlQWRkQXR0cmlidXRlKGFQYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVTcGFjZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhdHRyaWJ1dGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhdHRyaWJ1dGVJRCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxjbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlSUQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1hNTFBhcnNlQWRkTXVsdGlwbGVBdHRyaWJ1dGVzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUNvbXBvbmVudEluc3RhbmNlIGFQYXJzZXI7Ci0JVUludDMyIGVsZW1lbnRJRDsKLQlVSW50MzIgbmFtZVNwYWNlSURzOwotCWNoYXIgYXR0cmlidXRlTmFtZXM7Ci0JVUludDMyIGF0dHJpYnV0ZUlEczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBDb21wb25lbnRJbnN0YW5jZSBhUGFyc2VyOworICAgIFVJbnQzMiBlbGVtZW50SUQ7CisgICAgVUludDMyIG5hbWVTcGFjZUlEczsKKyAgICBjaGFyIGF0dHJpYnV0ZU5hbWVzOworICAgIFVJbnQzMiBhdHRyaWJ1dGVJRHM7CiAjaWZuZGVmIFhNTFBhcnNlQWRkTXVsdGlwbGVBdHRyaWJ1dGVzCi0JUHlNYWNfUFJFQ0hFQ0soWE1MUGFyc2VBZGRNdWx0aXBsZUF0dHJpYnV0ZXMpOworICAgIFB5TWFjX1BSRUNIRUNLKFhNTFBhcnNlQWRkTXVsdGlwbGVBdHRyaWJ1dGVzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmFQYXJzZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICZlbGVtZW50SUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBYTUxQYXJzZUFkZE11bHRpcGxlQXR0cmlidXRlcyhhUGFyc2VyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmFtZVNwYWNlSURzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhdHRyaWJ1dGVOYW1lcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXR0cmlidXRlSURzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGxjbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIG5hbWVTcGFjZUlEcywKLQkgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVOYW1lcywKLQkgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVJRHMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmFQYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZlbGVtZW50SUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBYTUxQYXJzZUFkZE11bHRpcGxlQXR0cmlidXRlcyhhUGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmFtZVNwYWNlSURzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhdHRyaWJ1dGVOYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXR0cmlidXRlSURzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGxjbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVTcGFjZUlEcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVOYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVJRHMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1hNTFBhcnNlQWRkQXR0cmlidXRlQW5kVmFsdWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JQ29tcG9uZW50SW5zdGFuY2UgYVBhcnNlcjsKLQlVSW50MzIgZWxlbWVudElEOwotCVVJbnQzMiBuYW1lU3BhY2VJRDsKLQljaGFyIGF0dHJpYnV0ZU5hbWU7Ci0JVUludDMyIGF0dHJpYnV0ZUlEOwotCVVJbnQzMiBhdHRyaWJ1dGVWYWx1ZUtpbmQ7Ci0Jdm9pZCAqIGF0dHJpYnV0ZVZhbHVlS2luZEluZm87CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgQ29tcG9uZW50SW5zdGFuY2UgYVBhcnNlcjsKKyAgICBVSW50MzIgZWxlbWVudElEOworICAgIFVJbnQzMiBuYW1lU3BhY2VJRDsKKyAgICBjaGFyIGF0dHJpYnV0ZU5hbWU7CisgICAgVUludDMyIGF0dHJpYnV0ZUlEOworICAgIFVJbnQzMiBhdHRyaWJ1dGVWYWx1ZUtpbmQ7CisgICAgdm9pZCAqIGF0dHJpYnV0ZVZhbHVlS2luZEluZm87CiAjaWZuZGVmIFhNTFBhcnNlQWRkQXR0cmlidXRlQW5kVmFsdWUKLQlQeU1hY19QUkVDSEVDSyhYTUxQYXJzZUFkZEF0dHJpYnV0ZUFuZFZhbHVlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhYTUxQYXJzZUFkZEF0dHJpYnV0ZUFuZFZhbHVlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGxscyIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmFQYXJzZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICZlbGVtZW50SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICZuYW1lU3BhY2VJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmF0dHJpYnV0ZVZhbHVlS2luZCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmF0dHJpYnV0ZVZhbHVlS2luZEluZm8pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBYTUxQYXJzZUFkZEF0dHJpYnV0ZUFuZFZhbHVlKGFQYXJzZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lU3BhY2VJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhdHRyaWJ1dGVOYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmF0dHJpYnV0ZUlELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWVLaW5kLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWVLaW5kSW5mbyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxjbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZU5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlSUQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGxscyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmFQYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZlbGVtZW50SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lU3BhY2VJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmF0dHJpYnV0ZVZhbHVlS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmF0dHJpYnV0ZVZhbHVlS2luZEluZm8pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBYTUxQYXJzZUFkZEF0dHJpYnV0ZUFuZFZhbHVlKGFQYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lU3BhY2VJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhdHRyaWJ1dGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmF0dHJpYnV0ZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWVLaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWVLaW5kSW5mbyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxjbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlSUQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1hNTFBhcnNlQWRkQXR0cmlidXRlVmFsdWVLaW5kKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUNvbXBvbmVudEluc3RhbmNlIGFQYXJzZXI7Ci0JVUludDMyIGVsZW1lbnRJRDsKLQlVSW50MzIgYXR0cmlidXRlSUQ7Ci0JVUludDMyIGF0dHJpYnV0ZVZhbHVlS2luZDsKLQl2b2lkICogYXR0cmlidXRlVmFsdWVLaW5kSW5mbzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBDb21wb25lbnRJbnN0YW5jZSBhUGFyc2VyOworICAgIFVJbnQzMiBlbGVtZW50SUQ7CisgICAgVUludDMyIGF0dHJpYnV0ZUlEOworICAgIFVJbnQzMiBhdHRyaWJ1dGVWYWx1ZUtpbmQ7CisgICAgdm9pZCAqIGF0dHJpYnV0ZVZhbHVlS2luZEluZm87CiAjaWZuZGVmIFhNTFBhcnNlQWRkQXR0cmlidXRlVmFsdWVLaW5kCi0JUHlNYWNfUFJFQ0hFQ0soWE1MUGFyc2VBZGRBdHRyaWJ1dGVWYWx1ZUtpbmQpOworICAgIFB5TWFjX1BSRUNIRUNLKFhNTFBhcnNlQWRkQXR0cmlidXRlVmFsdWVLaW5kKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGxscyIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmFQYXJzZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICZlbGVtZW50SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICZhdHRyaWJ1dGVJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmF0dHJpYnV0ZVZhbHVlS2luZCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmF0dHJpYnV0ZVZhbHVlS2luZEluZm8pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBYTUxQYXJzZUFkZEF0dHJpYnV0ZVZhbHVlS2luZChhUGFyc2VyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZUtpbmQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWVLaW5kSW5mbyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbGxzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYVBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmVsZW1lbnRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmF0dHJpYnV0ZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYXR0cmlidXRlVmFsdWVLaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYXR0cmlidXRlVmFsdWVLaW5kSW5mbykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFhNTFBhcnNlQWRkQXR0cmlidXRlVmFsdWVLaW5kKGFQYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZUtpbmRJbmZvKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9YTUxQYXJzZUFkZE5hbWVTcGFjZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlDb21wb25lbnRJbnN0YW5jZSBhUGFyc2VyOwotCWNoYXIgbmFtZVNwYWNlVVJMOwotCVVJbnQzMiBuYW1lU3BhY2VJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBDb21wb25lbnRJbnN0YW5jZSBhUGFyc2VyOworICAgIGNoYXIgbmFtZVNwYWNlVVJMOworICAgIFVJbnQzMiBuYW1lU3BhY2VJRDsKICNpZm5kZWYgWE1MUGFyc2VBZGROYW1lU3BhY2UKLQlQeU1hY19QUkVDSEVDSyhYTUxQYXJzZUFkZE5hbWVTcGFjZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soWE1MUGFyc2VBZGROYW1lU3BhY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZhUGFyc2VyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gWE1MUGFyc2VBZGROYW1lU3BhY2UoYVBhcnNlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmFtZVNwYWNlVVJMLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lU3BhY2VJRCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxjbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIG5hbWVTcGFjZVVSTCwKLQkgICAgICAgICAgICAgICAgICAgICBuYW1lU3BhY2VJRCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZhUGFyc2VyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gWE1MUGFyc2VBZGROYW1lU3BhY2UoYVBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmFtZVNwYWNlVVJMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lU3BhY2VJRCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxjbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVTcGFjZVVSTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lU3BhY2VJRCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfWE1MUGFyc2VTZXRPZmZzZXRBbmRMaW1pdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlDb21wb25lbnRJbnN0YW5jZSBhUGFyc2VyOwotCVVJbnQzMiBvZmZzZXQ7Ci0JVUludDMyIGxpbWl0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIENvbXBvbmVudEluc3RhbmNlIGFQYXJzZXI7CisgICAgVUludDMyIG9mZnNldDsKKyAgICBVSW50MzIgbGltaXQ7CiAjaWZuZGVmIFhNTFBhcnNlU2V0T2Zmc2V0QW5kTGltaXQKLQlQeU1hY19QUkVDSEVDSyhYTUxQYXJzZVNldE9mZnNldEFuZExpbWl0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhYTUxQYXJzZVNldE9mZnNldEFuZExpbWl0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZhUGFyc2VyLAotCSAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAmbGltaXQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBYTUxQYXJzZVNldE9mZnNldEFuZExpbWl0KGFQYXJzZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmFQYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZsaW1pdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFhNTFBhcnNlU2V0T2Zmc2V0QW5kTGltaXQoYVBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9YTUxQYXJzZVNldEV2ZW50UGFyc2VSZWZDb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JQ29tcG9uZW50SW5zdGFuY2UgYVBhcnNlcjsKLQlsb25nIHJlZmNvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBDb21wb25lbnRJbnN0YW5jZSBhUGFyc2VyOworICAgIGxvbmcgcmVmY29uOwogI2lmbmRlZiBYTUxQYXJzZVNldEV2ZW50UGFyc2VSZWZDb24KLQlQeU1hY19QUkVDSEVDSyhYTUxQYXJzZVNldEV2ZW50UGFyc2VSZWZDb24pOworICAgIFB5TWFjX1BSRUNIRUNLKFhNTFBhcnNlU2V0RXZlbnRQYXJzZVJlZkNvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZhUGFyc2VyLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVmY29uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gWE1MUGFyc2VTZXRFdmVudFBhcnNlUmVmQ29uKGFQYXJzZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmNvbik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYVBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZmNvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFhNTFBhcnNlU2V0RXZlbnRQYXJzZVJlZkNvbihhUGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZjb24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHSW5pdGlhbGl6ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOwogI2lmbmRlZiBTR0luaXRpYWxpemUKLQlQeU1hY19QUkVDSEVDSyhTR0luaXRpYWxpemUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHSW5pdGlhbGl6ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0luaXRpYWxpemUocyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dJbml0aWFsaXplKHMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHU2V0RGF0YU91dHB1dChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JRlNTcGVjIG1vdmllRmlsZTsKLQlsb25nIHdoZXJlRmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOworICAgIEZTU3BlYyBtb3ZpZUZpbGU7CisgICAgbG9uZyB3aGVyZUZsYWdzOwogI2lmbmRlZiBTR1NldERhdGFPdXRwdXQKLQlQeU1hY19QUkVDSEVDSyhTR1NldERhdGFPdXRwdXQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHU2V0RGF0YU91dHB1dCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJm1vdmllRmlsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJndoZXJlRmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR1NldERhdGFPdXRwdXQocywKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vdmllRmlsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgd2hlcmVGbGFncyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZtb3ZpZUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ3aGVyZUZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dTZXREYXRhT3V0cHV0KHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtb3ZpZUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlRmxhZ3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHR2V0RGF0YU91dHB1dChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JRlNTcGVjIG1vdmllRmlsZTsKLQlsb25nIHdoZXJlRmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOworICAgIEZTU3BlYyBtb3ZpZUZpbGU7CisgICAgbG9uZyB3aGVyZUZsYWdzOwogI2lmbmRlZiBTR0dldERhdGFPdXRwdXQKLQlQeU1hY19QUkVDSEVDSyhTR0dldERhdGFPdXRwdXQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHR2V0RGF0YU91dHB1dCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmbW92aWVGaWxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dHZXREYXRhT3V0cHV0KHMsCi0JICAgICAgICAgICAgICAgICAgICAgICZtb3ZpZUZpbGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZ3aGVyZUZsYWdzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICB3aGVyZUZsYWdzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmbW92aWVGaWxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dHZXREYXRhT3V0cHV0KHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtb3ZpZUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ3aGVyZUZsYWdzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZUZsYWdzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1NldEdXb3JsZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JQ0dyYWZQdHIgZ3A7Ci0JR0RIYW5kbGUgZ2Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOworICAgIENHcmFmUHRyIGdwOworICAgIEdESGFuZGxlIGdkOwogI2lmbmRlZiBTR1NldEdXb3JsZAotCVB5TWFjX1BSRUNIRUNLKFNHU2V0R1dvcmxkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR1NldEdXb3JsZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAotCSAgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX0NvbnZlcnQsICZncCwKLQkgICAgICAgICAgICAgICAgICAgICAgT3B0UmVzT2JqX0NvbnZlcnQsICZnZCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHU2V0R1dvcmxkKHMsCi0JICAgICAgICAgICAgICAgICAgZ3AsCi0JICAgICAgICAgICAgICAgICAgZ2QpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfQ29udmVydCwgJmdwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfQ29udmVydCwgJmdkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dTZXRHV29ybGQocywKKyAgICAgICAgICAgICAgICAgICAgICBncCwKKyAgICAgICAgICAgICAgICAgICAgICBnZCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dHZXRHV29ybGQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU2VxR3JhYkNvbXBvbmVudCBzOwotCUNHcmFmUHRyIGdwOwotCUdESGFuZGxlIGdkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNlcUdyYWJDb21wb25lbnQgczsKKyAgICBDR3JhZlB0ciBncDsKKyAgICBHREhhbmRsZSBnZDsKICNpZm5kZWYgU0dHZXRHV29ybGQKLQlQeU1hY19QUkVDSEVDSyhTR0dldEdXb3JsZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dHZXRHV29ybGQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dHZXRHV29ybGQocywKLQkgICAgICAgICAgICAgICAgICAmZ3AsCi0JICAgICAgICAgICAgICAgICAgJmdkKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX05ldywgZ3AsCi0JICAgICAgICAgICAgICAgICAgICAgT3B0UmVzT2JqX05ldywgZ2QpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHR2V0R1dvcmxkKHMsCisgICAgICAgICAgICAgICAgICAgICAgJmdwLAorICAgICAgICAgICAgICAgICAgICAgICZnZCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgR3JhZk9ial9OZXcsIGdwLAorICAgICAgICAgICAgICAgICAgICAgICAgIE9wdFJlc09ial9OZXcsIGdkKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR05ld0NoYW5uZWwoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU2VxR3JhYkNvbXBvbmVudCBzOwotCU9TVHlwZSBjaGFubmVsVHlwZTsKLQlTR0NoYW5uZWwgcmVmOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNlcUdyYWJDb21wb25lbnQgczsKKyAgICBPU1R5cGUgY2hhbm5lbFR5cGU7CisgICAgU0dDaGFubmVsIHJlZjsKICNpZm5kZWYgU0dOZXdDaGFubmVsCi0JUHlNYWNfUFJFQ0hFQ0soU0dOZXdDaGFubmVsKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR05ld0NoYW5uZWwpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNoYW5uZWxUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dOZXdDaGFubmVsKHMsCi0JICAgICAgICAgICAgICAgICAgIGNoYW5uZWxUeXBlLAotCSAgICAgICAgICAgICAgICAgICAmcmVmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9OZXcsIHJlZik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNoYW5uZWxUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dOZXdDaGFubmVsKHMsCisgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAmcmVmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9OZXcsIHJlZik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dEaXNwb3NlQ2hhbm5lbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JU0dDaGFubmVsIGM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOworICAgIFNHQ2hhbm5lbCBjOwogI2lmbmRlZiBTR0Rpc3Bvc2VDaGFubmVsCi0JUHlNYWNfUFJFQ0hFQ0soU0dEaXNwb3NlQ2hhbm5lbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dEaXNwb3NlQ2hhbm5lbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHRGlzcG9zZUNoYW5uZWwocywKLQkgICAgICAgICAgICAgICAgICAgICAgIGMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dEaXNwb3NlQ2hhbm5lbChzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dTdGFydFByZXZpZXcoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU2VxR3JhYkNvbXBvbmVudCBzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNlcUdyYWJDb21wb25lbnQgczsKICNpZm5kZWYgU0dTdGFydFByZXZpZXcKLQlQeU1hY19QUkVDSEVDSyhTR1N0YXJ0UHJldmlldyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dTdGFydFByZXZpZXcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dTdGFydFByZXZpZXcocyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dTdGFydFByZXZpZXcocyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dTdGFydFJlY29yZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOwogI2lmbmRlZiBTR1N0YXJ0UmVjb3JkCi0JUHlNYWNfUFJFQ0hFQ0soU0dTdGFydFJlY29yZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dTdGFydFJlY29yZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR1N0YXJ0UmVjb3JkKHMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHU3RhcnRSZWNvcmQocyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dJZGxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNlcUdyYWJDb21wb25lbnQgczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTZXFHcmFiQ29tcG9uZW50IHM7CiAjaWZuZGVmIFNHSWRsZQotCVB5TWFjX1BSRUNIRUNLKFNHSWRsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dJZGxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHSWRsZShzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0lkbGUocyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dTdG9wKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNlcUdyYWJDb21wb25lbnQgczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTZXFHcmFiQ29tcG9uZW50IHM7CiAjaWZuZGVmIFNHU3RvcAotCVB5TWFjX1BSRUNIRUNLKFNHU3RvcCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dTdG9wKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHU3RvcChzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1N0b3Aocyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dQYXVzZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JQm9vbGVhbiBwYXVzZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTZXFHcmFiQ29tcG9uZW50IHM7CisgICAgQm9vbGVhbiBwYXVzZTsKICNpZm5kZWYgU0dQYXVzZQotCVB5TWFjX1BSRUNIRUNLKFNHUGF1c2UpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHUGF1c2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKLQkgICAgICAgICAgICAgICAgICAgICAgJnBhdXNlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dQYXVzZShzLAotCSAgICAgICAgICAgICAgcGF1c2UpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXVzZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHUGF1c2UocywKKyAgICAgICAgICAgICAgICAgIHBhdXNlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1ByZXBhcmUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU2VxR3JhYkNvbXBvbmVudCBzOwotCUJvb2xlYW4gcHJlcGFyZUZvclByZXZpZXc7Ci0JQm9vbGVhbiBwcmVwYXJlRm9yUmVjb3JkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNlcUdyYWJDb21wb25lbnQgczsKKyAgICBCb29sZWFuIHByZXBhcmVGb3JQcmV2aWV3OworICAgIEJvb2xlYW4gcHJlcGFyZUZvclJlY29yZDsKICNpZm5kZWYgU0dQcmVwYXJlCi0JUHlNYWNfUFJFQ0hFQ0soU0dQcmVwYXJlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR1ByZXBhcmUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCi0JICAgICAgICAgICAgICAgICAgICAgICZwcmVwYXJlRm9yUHJldmlldywKLQkgICAgICAgICAgICAgICAgICAgICAgJnByZXBhcmVGb3JSZWNvcmQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR1ByZXBhcmUocywKLQkgICAgICAgICAgICAgICAgcHJlcGFyZUZvclByZXZpZXcsCi0JICAgICAgICAgICAgICAgIHByZXBhcmVGb3JSZWNvcmQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJlcGFyZUZvclByZXZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwcmVwYXJlRm9yUmVjb3JkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dQcmVwYXJlKHMsCisgICAgICAgICAgICAgICAgICAgIHByZXBhcmVGb3JQcmV2aWV3LAorICAgICAgICAgICAgICAgICAgICBwcmVwYXJlRm9yUmVjb3JkKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1JlbGVhc2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU2VxR3JhYkNvbXBvbmVudCBzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNlcUdyYWJDb21wb25lbnQgczsKICNpZm5kZWYgU0dSZWxlYXNlCi0JUHlNYWNfUFJFQ0hFQ0soU0dSZWxlYXNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR1JlbGVhc2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dSZWxlYXNlKHMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHUmVsZWFzZShzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0dldE1vdmllKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlNb3ZpZSBfcnY7Ci0JU2VxR3JhYkNvbXBvbmVudCBzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBNb3ZpZSBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOwogI2lmbmRlZiBTR0dldE1vdmllCi0JUHlNYWNfUFJFQ0hFQ0soU0dHZXRNb3ZpZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dHZXRNb3ZpZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0dldE1vdmllKHMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHR2V0TW92aWUocyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dTZXRNYXhpbXVtUmVjb3JkVGltZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JdW5zaWduZWQgbG9uZyB0aWNrczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTZXFHcmFiQ29tcG9uZW50IHM7CisgICAgdW5zaWduZWQgbG9uZyB0aWNrczsKICNpZm5kZWYgU0dTZXRNYXhpbXVtUmVjb3JkVGltZQotCVB5TWFjX1BSRUNIRUNLKFNHU2V0TWF4aW11bVJlY29yZFRpbWUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHU2V0TWF4aW11bVJlY29yZFRpbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKLQkgICAgICAgICAgICAgICAgICAgICAgJnRpY2tzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dTZXRNYXhpbXVtUmVjb3JkVGltZShzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlja3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aWNrcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHU2V0TWF4aW11bVJlY29yZFRpbWUocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpY2tzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0dldE1heGltdW1SZWNvcmRUaW1lKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNlcUdyYWJDb21wb25lbnQgczsKLQl1bnNpZ25lZCBsb25nIHRpY2tzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNlcUdyYWJDb21wb25lbnQgczsKKyAgICB1bnNpZ25lZCBsb25nIHRpY2tzOwogI2lmbmRlZiBTR0dldE1heGltdW1SZWNvcmRUaW1lCi0JUHlNYWNfUFJFQ0hFQ0soU0dHZXRNYXhpbXVtUmVjb3JkVGltZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dHZXRNYXhpbXVtUmVjb3JkVGltZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0dldE1heGltdW1SZWNvcmRUaW1lKHMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGlja3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHRpY2tzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0dldE1heGltdW1SZWNvcmRUaW1lKHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGlja3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHRpY2tzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0dldFN0b3JhZ2VTcGFjZVJlbWFpbmluZyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JdW5zaWduZWQgbG9uZyBieXRlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTZXFHcmFiQ29tcG9uZW50IHM7CisgICAgdW5zaWduZWQgbG9uZyBieXRlczsKICNpZm5kZWYgU0dHZXRTdG9yYWdlU3BhY2VSZW1haW5pbmcKLQlQeU1hY19QUkVDSEVDSyhTR0dldFN0b3JhZ2VTcGFjZVJlbWFpbmluZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dHZXRTdG9yYWdlU3BhY2VSZW1haW5pbmcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dHZXRTdG9yYWdlU3BhY2VSZW1haW5pbmcocywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnl0ZXMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGJ5dGVzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0dldFN0b3JhZ2VTcGFjZVJlbWFpbmluZyhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZieXRlcyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHR2V0VGltZVJlbWFpbmluZyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JbG9uZyB0aWNrc0xlZnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOworICAgIGxvbmcgdGlja3NMZWZ0OwogI2lmbmRlZiBTR0dldFRpbWVSZW1haW5pbmcKLQlQeU1hY19QUkVDSEVDSyhTR0dldFRpbWVSZW1haW5pbmcpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHR2V0VGltZVJlbWFpbmluZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0dldFRpbWVSZW1haW5pbmcocywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJnRpY2tzTGVmdCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgdGlja3NMZWZ0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0dldFRpbWVSZW1haW5pbmcocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRpY2tzTGVmdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgdGlja3NMZWZ0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0dyYWJQaWN0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNlcUdyYWJDb21wb25lbnQgczsKLQlQaWNIYW5kbGUgcDsKLQlSZWN0IGJvdW5kczsKLQlzaG9ydCBvZmZzY3JlZW5EZXB0aDsKLQlsb25nIGdyYWJQaWN0RmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOworICAgIFBpY0hhbmRsZSBwOworICAgIFJlY3QgYm91bmRzOworICAgIHNob3J0IG9mZnNjcmVlbkRlcHRoOworICAgIGxvbmcgZ3JhYlBpY3RGbGFnczsKICNpZm5kZWYgU0dHcmFiUGljdAotCVB5TWFjX1BSRUNIRUNLKFNHR3JhYlBpY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHR3JhYlBpY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmhsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kcywKLQkgICAgICAgICAgICAgICAgICAgICAgJm9mZnNjcmVlbkRlcHRoLAotCSAgICAgICAgICAgICAgICAgICAgICAmZ3JhYlBpY3RGbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHR3JhYlBpY3QocywKLQkgICAgICAgICAgICAgICAgICZwLAotCSAgICAgICAgICAgICAgICAgJmJvdW5kcywKLQkgICAgICAgICAgICAgICAgIG9mZnNjcmVlbkRlcHRoLAotCSAgICAgICAgICAgICAgICAgZ3JhYlBpY3RGbGFncyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHApOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZobCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZvZmZzY3JlZW5EZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmdyYWJQaWN0RmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0dyYWJQaWN0KHMsCisgICAgICAgICAgICAgICAgICAgICAmcCwKKyAgICAgICAgICAgICAgICAgICAgICZib3VuZHMsCisgICAgICAgICAgICAgICAgICAgICBvZmZzY3JlZW5EZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgIGdyYWJQaWN0RmxhZ3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBwKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0dldExhc3RNb3ZpZVJlc0lEKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNlcUdyYWJDb21wb25lbnQgczsKLQlzaG9ydCByZXNJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTZXFHcmFiQ29tcG9uZW50IHM7CisgICAgc2hvcnQgcmVzSUQ7CiAjaWZuZGVmIFNHR2V0TGFzdE1vdmllUmVzSUQKLQlQeU1hY19QUkVDSEVDSyhTR0dldExhc3RNb3ZpZVJlc0lEKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0dldExhc3RNb3ZpZVJlc0lEKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHR2V0TGFzdE1vdmllUmVzSUQocywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXNJRCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgcmVzSUQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHR2V0TGFzdE1vdmllUmVzSUQocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXNJRCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVzSUQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHU2V0RmxhZ3MoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU2VxR3JhYkNvbXBvbmVudCBzOwotCWxvbmcgc2dGbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTZXFHcmFiQ29tcG9uZW50IHM7CisgICAgbG9uZyBzZ0ZsYWdzOwogI2lmbmRlZiBTR1NldEZsYWdzCi0JUHlNYWNfUFJFQ0hFQ0soU0dTZXRGbGFncyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dTZXRGbGFncyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2dGbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHU2V0RmxhZ3MocywKLQkgICAgICAgICAgICAgICAgIHNnRmxhZ3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzZ0ZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dTZXRGbGFncyhzLAorICAgICAgICAgICAgICAgICAgICAgc2dGbGFncyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dHZXRGbGFncyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JbG9uZyBzZ0ZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNlcUdyYWJDb21wb25lbnQgczsKKyAgICBsb25nIHNnRmxhZ3M7CiAjaWZuZGVmIFNHR2V0RmxhZ3MKLQlQeU1hY19QUkVDSEVDSyhTR0dldEZsYWdzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0dldEZsYWdzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHR2V0RmxhZ3MocywKLQkgICAgICAgICAgICAgICAgICZzZ0ZsYWdzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBzZ0ZsYWdzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0dldEZsYWdzKHMsCisgICAgICAgICAgICAgICAgICAgICAmc2dGbGFncyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2dGbGFncyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dOZXdDaGFubmVsRnJvbUNvbXBvbmVudChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JU0dDaGFubmVsIG5ld0NoYW5uZWw7Ci0JQ29tcG9uZW50IHNnQ2hhbm5lbENvbXBvbmVudDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTZXFHcmFiQ29tcG9uZW50IHM7CisgICAgU0dDaGFubmVsIG5ld0NoYW5uZWw7CisgICAgQ29tcG9uZW50IHNnQ2hhbm5lbENvbXBvbmVudDsKICNpZm5kZWYgU0dOZXdDaGFubmVsRnJvbUNvbXBvbmVudAotCVB5TWFjX1BSRUNIRUNLKFNHTmV3Q2hhbm5lbEZyb21Db21wb25lbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHTmV3Q2hhbm5lbEZyb21Db21wb25lbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcE9ial9Db252ZXJ0LCAmc2dDaGFubmVsQ29tcG9uZW50KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dOZXdDaGFubmVsRnJvbUNvbXBvbmVudChzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld0NoYW5uZWwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZ0NoYW5uZWxDb21wb25lbnQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX05ldywgbmV3Q2hhbm5lbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcE9ial9Db252ZXJ0LCAmc2dDaGFubmVsQ29tcG9uZW50KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dOZXdDaGFubmVsRnJvbUNvbXBvbmVudChzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld0NoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZ0NoYW5uZWxDb21wb25lbnQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX05ldywgbmV3Q2hhbm5lbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dTZXRTZXR0aW5ncyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JVXNlckRhdGEgdWQ7Ci0JbG9uZyBmbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTZXFHcmFiQ29tcG9uZW50IHM7CisgICAgVXNlckRhdGEgdWQ7CisgICAgbG9uZyBmbGFnczsKICNpZm5kZWYgU0dTZXRTZXR0aW5ncwotCVB5TWFjX1BSRUNIRUNLKFNHU2V0U2V0dGluZ3MpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHU2V0U2V0dGluZ3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAotCSAgICAgICAgICAgICAgICAgICAgICBVc2VyRGF0YU9ial9Db252ZXJ0LCAmdWQsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHU2V0U2V0dGluZ3MocywKLQkgICAgICAgICAgICAgICAgICAgIHVkLAotCSAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlckRhdGFPYmpfQ29udmVydCwgJnVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1NldFNldHRpbmdzKHMsCisgICAgICAgICAgICAgICAgICAgICAgICB1ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0dldFNldHRpbmdzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNlcUdyYWJDb21wb25lbnQgczsKLQlVc2VyRGF0YSB1ZDsKLQlsb25nIGZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNlcUdyYWJDb21wb25lbnQgczsKKyAgICBVc2VyRGF0YSB1ZDsKKyAgICBsb25nIGZsYWdzOwogI2lmbmRlZiBTR0dldFNldHRpbmdzCi0JUHlNYWNfUFJFQ0hFQ0soU0dHZXRTZXR0aW5ncyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dHZXRTZXR0aW5ncyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0dldFNldHRpbmdzKHMsCi0JICAgICAgICAgICAgICAgICAgICAmdWQsCi0JICAgICAgICAgICAgICAgICAgICBmbGFncyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFVzZXJEYXRhT2JqX05ldywgdWQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHR2V0U2V0dGluZ3MocywKKyAgICAgICAgICAgICAgICAgICAgICAgICZ1ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgVXNlckRhdGFPYmpfTmV3LCB1ZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dHZXRJbmRDaGFubmVsKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNlcUdyYWJDb21wb25lbnQgczsKLQlzaG9ydCBpbmRleDsKLQlTR0NoYW5uZWwgcmVmOwotCU9TVHlwZSBjaGFuVHlwZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTZXFHcmFiQ29tcG9uZW50IHM7CisgICAgc2hvcnQgaW5kZXg7CisgICAgU0dDaGFubmVsIHJlZjsKKyAgICBPU1R5cGUgY2hhblR5cGU7CiAjaWZuZGVmIFNHR2V0SW5kQ2hhbm5lbAotCVB5TWFjX1BSRUNIRUNLKFNHR2V0SW5kQ2hhbm5lbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dHZXRJbmRDaGFubmVsKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHR2V0SW5kQ2hhbm5lbChzLAotCSAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNoYW5UeXBlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX05ldywgcmVmLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBjaGFuVHlwZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZGV4KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dHZXRJbmRDaGFubmVsKHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY2hhblR5cGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfTmV3LCByZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIGNoYW5UeXBlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1VwZGF0ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JUmduSGFuZGxlIHVwZGF0ZVJnbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTZXFHcmFiQ29tcG9uZW50IHM7CisgICAgUmduSGFuZGxlIHVwZGF0ZVJnbjsKICNpZm5kZWYgU0dVcGRhdGUKLQlQeU1hY19QUkVDSEVDSyhTR1VwZGF0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dVcGRhdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdXBkYXRlUmduKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dVcGRhdGUocywKLQkgICAgICAgICAgICAgICB1cGRhdGVSZ24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnVwZGF0ZVJnbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHVXBkYXRlKHMsCisgICAgICAgICAgICAgICAgICAgdXBkYXRlUmduKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0dldFBhdXNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNlcUdyYWJDb21wb25lbnQgczsKLQlCb29sZWFuIHBhdXNlZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTZXFHcmFiQ29tcG9uZW50IHM7CisgICAgQm9vbGVhbiBwYXVzZWQ7CiAjaWZuZGVmIFNHR2V0UGF1c2UKLQlQeU1hY19QUkVDSEVDSyhTR0dldFBhdXNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0dldFBhdXNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHR2V0UGF1c2UocywKLQkgICAgICAgICAgICAgICAgICZwYXVzZWQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHBhdXNlZCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dHZXRQYXVzZShzLAorICAgICAgICAgICAgICAgICAgICAgJnBhdXNlZCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgcGF1c2VkKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1NldENoYW5uZWxTZXR0aW5ncyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JU0dDaGFubmVsIGM7Ci0JVXNlckRhdGEgdWQ7Ci0JbG9uZyBmbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTZXFHcmFiQ29tcG9uZW50IHM7CisgICAgU0dDaGFubmVsIGM7CisgICAgVXNlckRhdGEgdWQ7CisgICAgbG9uZyBmbGFnczsKICNpZm5kZWYgU0dTZXRDaGFubmVsU2V0dGluZ3MKLQlQeU1hY19QUkVDSEVDSyhTR1NldENoYW5uZWxTZXR0aW5ncyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dTZXRDaGFubmVsU2V0dGluZ3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgIFVzZXJEYXRhT2JqX0NvbnZlcnQsICZ1ZCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dTZXRDaGFubmVsU2V0dGluZ3MocywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVkLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlckRhdGFPYmpfQ29udmVydCwgJnVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1NldENoYW5uZWxTZXR0aW5ncyhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHR2V0Q2hhbm5lbFNldHRpbmdzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNlcUdyYWJDb21wb25lbnQgczsKLQlTR0NoYW5uZWwgYzsKLQlVc2VyRGF0YSB1ZDsKLQlsb25nIGZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNlcUdyYWJDb21wb25lbnQgczsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBVc2VyRGF0YSB1ZDsKKyAgICBsb25nIGZsYWdzOwogI2lmbmRlZiBTR0dldENoYW5uZWxTZXR0aW5ncwotCVB5TWFjX1BSRUNIRUNLKFNHR2V0Q2hhbm5lbFNldHRpbmdzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0dldENoYW5uZWxTZXR0aW5ncyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHR2V0Q2hhbm5lbFNldHRpbmdzKHMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmdWQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBVc2VyRGF0YU9ial9OZXcsIHVkKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHR2V0Q2hhbm5lbFNldHRpbmdzKHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBVc2VyRGF0YU9ial9OZXcsIHVkKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0dldE1vZGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU2VxR3JhYkNvbXBvbmVudCBzOwotCUJvb2xlYW4gcHJldmlld01vZGU7Ci0JQm9vbGVhbiByZWNvcmRNb2RlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNlcUdyYWJDb21wb25lbnQgczsKKyAgICBCb29sZWFuIHByZXZpZXdNb2RlOworICAgIEJvb2xlYW4gcmVjb3JkTW9kZTsKICNpZm5kZWYgU0dHZXRNb2RlCi0JUHlNYWNfUFJFQ0hFQ0soU0dHZXRNb2RlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0dldE1vZGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dHZXRNb2RlKHMsCi0JICAgICAgICAgICAgICAgICZwcmV2aWV3TW9kZSwKLQkgICAgICAgICAgICAgICAgJnJlY29yZE1vZGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsYmIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBwcmV2aWV3TW9kZSwKLQkgICAgICAgICAgICAgICAgICAgICByZWNvcmRNb2RlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0dldE1vZGUocywKKyAgICAgICAgICAgICAgICAgICAgJnByZXZpZXdNb2RlLAorICAgICAgICAgICAgICAgICAgICAmcmVjb3JkTW9kZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpZXdNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZE1vZGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHU2V0RGF0YVJlZihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JSGFuZGxlIGRhdGFSZWY7Ci0JT1NUeXBlIGRhdGFSZWZUeXBlOwotCWxvbmcgd2hlcmVGbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTZXFHcmFiQ29tcG9uZW50IHM7CisgICAgSGFuZGxlIGRhdGFSZWY7CisgICAgT1NUeXBlIGRhdGFSZWZUeXBlOworICAgIGxvbmcgd2hlcmVGbGFnczsKICNpZm5kZWYgU0dTZXREYXRhUmVmCi0JUHlNYWNfUFJFQ0hFQ0soU0dTZXREYXRhUmVmKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR1NldERhdGFSZWYpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGF0YVJlZlR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZ3aGVyZUZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dTZXREYXRhUmVmKHMsCi0JICAgICAgICAgICAgICAgICAgIGRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgIGRhdGFSZWZUeXBlLAotCSAgICAgICAgICAgICAgICAgICB3aGVyZUZsYWdzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkYXRhUmVmVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJndoZXJlRmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1NldERhdGFSZWYocywKKyAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZlR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlRmxhZ3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHR2V0RGF0YVJlZihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JSGFuZGxlIGRhdGFSZWY7Ci0JT1NUeXBlIGRhdGFSZWZUeXBlOwotCWxvbmcgd2hlcmVGbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTZXFHcmFiQ29tcG9uZW50IHM7CisgICAgSGFuZGxlIGRhdGFSZWY7CisgICAgT1NUeXBlIGRhdGFSZWZUeXBlOworICAgIGxvbmcgd2hlcmVGbGFnczsKICNpZm5kZWYgU0dHZXREYXRhUmVmCi0JUHlNYWNfUFJFQ0hFQ0soU0dHZXREYXRhUmVmKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0dldERhdGFSZWYpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dHZXREYXRhUmVmKHMsCi0JICAgICAgICAgICAgICAgICAgICZkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAmZGF0YVJlZlR5cGUsCi0JICAgICAgICAgICAgICAgICAgICZ3aGVyZUZsYWdzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgZGF0YVJlZlR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgd2hlcmVGbGFncyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dHZXREYXRhUmVmKHMsCisgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVJlZlR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICZ3aGVyZUZsYWdzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgZGF0YVJlZlR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmVGbGFncyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dOZXdPdXRwdXQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU2VxR3JhYkNvbXBvbmVudCBzOwotCUhhbmRsZSBkYXRhUmVmOwotCU9TVHlwZSBkYXRhUmVmVHlwZTsKLQlsb25nIHdoZXJlRmxhZ3M7Ci0JU0dPdXRwdXQgc2dPdXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOworICAgIEhhbmRsZSBkYXRhUmVmOworICAgIE9TVHlwZSBkYXRhUmVmVHlwZTsKKyAgICBsb25nIHdoZXJlRmxhZ3M7CisgICAgU0dPdXRwdXQgc2dPdXQ7CiAjaWZuZGVmIFNHTmV3T3V0cHV0Ci0JUHlNYWNfUFJFQ0hFQ0soU0dOZXdPdXRwdXQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHTmV3T3V0cHV0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRhdGFSZWZUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAmd2hlcmVGbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHTmV3T3V0cHV0KHMsCi0JICAgICAgICAgICAgICAgICAgZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICBkYXRhUmVmVHlwZSwKLQkgICAgICAgICAgICAgICAgICB3aGVyZUZsYWdzLAotCSAgICAgICAgICAgICAgICAgICZzZ091dCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFNHT3V0cHV0T2JqX05ldywgc2dPdXQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRhdGFSZWZUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmd2hlcmVGbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHTmV3T3V0cHV0KHMsCisgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICB3aGVyZUZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICZzZ091dCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFNHT3V0cHV0T2JqX05ldywgc2dPdXQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHRGlzcG9zZU91dHB1dChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JU0dPdXRwdXQgc2dPdXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOworICAgIFNHT3V0cHV0IHNnT3V0OwogI2lmbmRlZiBTR0Rpc3Bvc2VPdXRwdXQKLQlQeU1hY19QUkVDSEVDSyhTR0Rpc3Bvc2VPdXRwdXQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHRGlzcG9zZU91dHB1dCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKLQkgICAgICAgICAgICAgICAgICAgICAgU0dPdXRwdXRPYmpfQ29udmVydCwgJnNnT3V0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dEaXNwb3NlT3V0cHV0KHMsCi0JICAgICAgICAgICAgICAgICAgICAgIHNnT3V0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU0dPdXRwdXRPYmpfQ29udmVydCwgJnNnT3V0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dEaXNwb3NlT3V0cHV0KHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNnT3V0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1NldE91dHB1dEZsYWdzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNlcUdyYWJDb21wb25lbnQgczsKLQlTR091dHB1dCBzZ091dDsKLQlsb25nIHdoZXJlRmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOworICAgIFNHT3V0cHV0IHNnT3V0OworICAgIGxvbmcgd2hlcmVGbGFnczsKICNpZm5kZWYgU0dTZXRPdXRwdXRGbGFncwotCVB5TWFjX1BSRUNIRUNLKFNHU2V0T3V0cHV0RmxhZ3MpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHU2V0T3V0cHV0RmxhZ3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAotCSAgICAgICAgICAgICAgICAgICAgICBTR091dHB1dE9ial9Db252ZXJ0LCAmc2dPdXQsCi0JICAgICAgICAgICAgICAgICAgICAgICZ3aGVyZUZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dTZXRPdXRwdXRGbGFncyhzLAotCSAgICAgICAgICAgICAgICAgICAgICAgc2dPdXQsCi0JICAgICAgICAgICAgICAgICAgICAgICB3aGVyZUZsYWdzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNHT3V0cHV0T2JqX0NvbnZlcnQsICZzZ091dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJndoZXJlRmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1NldE91dHB1dEZsYWdzKHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzZ091dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlRmxhZ3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHU2V0Q2hhbm5lbE91dHB1dChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JU0dDaGFubmVsIGM7Ci0JU0dPdXRwdXQgc2dPdXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOworICAgIFNHQ2hhbm5lbCBjOworICAgIFNHT3V0cHV0IHNnT3V0OwogI2lmbmRlZiBTR1NldENoYW5uZWxPdXRwdXQKLQlQeU1hY19QUkVDSEVDSyhTR1NldENoYW5uZWxPdXRwdXQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHU2V0Q2hhbm5lbE91dHB1dCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAotCSAgICAgICAgICAgICAgICAgICAgICBTR091dHB1dE9ial9Db252ZXJ0LCAmc2dPdXQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR1NldENoYW5uZWxPdXRwdXQocywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgc2dPdXQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNHT3V0cHV0T2JqX0NvbnZlcnQsICZzZ091dCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHU2V0Q2hhbm5lbE91dHB1dChzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZ091dCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dHZXREYXRhT3V0cHV0U3RvcmFnZVNwYWNlUmVtYWluaW5nKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNlcUdyYWJDb21wb25lbnQgczsKLQlTR091dHB1dCBzZ091dDsKLQl1bnNpZ25lZCBsb25nIHNwYWNlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNlcUdyYWJDb21wb25lbnQgczsKKyAgICBTR091dHB1dCBzZ091dDsKKyAgICB1bnNpZ25lZCBsb25nIHNwYWNlOwogI2lmbmRlZiBTR0dldERhdGFPdXRwdXRTdG9yYWdlU3BhY2VSZW1haW5pbmcKLQlQeU1hY19QUkVDSEVDSyhTR0dldERhdGFPdXRwdXRTdG9yYWdlU3BhY2VSZW1haW5pbmcpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHR2V0RGF0YU91dHB1dFN0b3JhZ2VTcGFjZVJlbWFpbmluZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKLQkgICAgICAgICAgICAgICAgICAgICAgU0dPdXRwdXRPYmpfQ29udmVydCwgJnNnT3V0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dHZXREYXRhT3V0cHV0U3RvcmFnZVNwYWNlUmVtYWluaW5nKHMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNnT3V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3BhY2UpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHNwYWNlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU0dPdXRwdXRPYmpfQ29udmVydCwgJnNnT3V0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dHZXREYXRhT3V0cHV0U3RvcmFnZVNwYWNlUmVtYWluaW5nKHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNnT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3BhY2UpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0hhbmRsZVVwZGF0ZUV2ZW50KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNlcUdyYWJDb21wb25lbnQgczsKLQlFdmVudFJlY29yZCBldmVudDsKLQlCb29sZWFuIGhhbmRsZWQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOworICAgIEV2ZW50UmVjb3JkIGV2ZW50OworICAgIEJvb2xlYW4gaGFuZGxlZDsKICNpZm5kZWYgU0dIYW5kbGVVcGRhdGVFdmVudAotCVB5TWFjX1BSRUNIRUNLKFNHSGFuZGxlVXBkYXRlRXZlbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHSGFuZGxlVXBkYXRlRXZlbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEV2ZW50UmVjb3JkLCAmZXZlbnQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0hhbmRsZVVwZGF0ZUV2ZW50KHMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmZXZlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmaGFuZGxlZCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgaGFuZGxlZCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEV2ZW50UmVjb3JkLCAmZXZlbnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0hhbmRsZVVwZGF0ZUV2ZW50KHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaGFuZGxlZCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dTZXRPdXRwdXROZXh0T3V0cHV0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNlcUdyYWJDb21wb25lbnQgczsKLQlTR091dHB1dCBzZ091dDsKLQlTR091dHB1dCBuZXh0T3V0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNlcUdyYWJDb21wb25lbnQgczsKKyAgICBTR091dHB1dCBzZ091dDsKKyAgICBTR091dHB1dCBuZXh0T3V0OwogI2lmbmRlZiBTR1NldE91dHB1dE5leHRPdXRwdXQKLQlQeU1hY19QUkVDSEVDSyhTR1NldE91dHB1dE5leHRPdXRwdXQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHU2V0T3V0cHV0TmV4dE91dHB1dCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAotCSAgICAgICAgICAgICAgICAgICAgICBTR091dHB1dE9ial9Db252ZXJ0LCAmc2dPdXQsCi0JICAgICAgICAgICAgICAgICAgICAgIFNHT3V0cHV0T2JqX0NvbnZlcnQsICZuZXh0T3V0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dTZXRPdXRwdXROZXh0T3V0cHV0KHMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNnT3V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0T3V0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTR091dHB1dE9ial9Db252ZXJ0LCAmc2dPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNHT3V0cHV0T2JqX0NvbnZlcnQsICZuZXh0T3V0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dTZXRPdXRwdXROZXh0T3V0cHV0KHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNnT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0T3V0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0dldE91dHB1dE5leHRPdXRwdXQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU2VxR3JhYkNvbXBvbmVudCBzOwotCVNHT3V0cHV0IHNnT3V0OwotCVNHT3V0cHV0IG5leHRPdXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOworICAgIFNHT3V0cHV0IHNnT3V0OworICAgIFNHT3V0cHV0IG5leHRPdXQ7CiAjaWZuZGVmIFNHR2V0T3V0cHV0TmV4dE91dHB1dAotCVB5TWFjX1BSRUNIRUNLKFNHR2V0T3V0cHV0TmV4dE91dHB1dCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dHZXRPdXRwdXROZXh0T3V0cHV0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAotCSAgICAgICAgICAgICAgICAgICAgICBTR091dHB1dE9ial9Db252ZXJ0LCAmc2dPdXQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0dldE91dHB1dE5leHRPdXRwdXQocywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2dPdXQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXh0T3V0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgU0dPdXRwdXRPYmpfTmV3LCBuZXh0T3V0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU0dPdXRwdXRPYmpfQ29udmVydCwgJnNnT3V0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dHZXRPdXRwdXROZXh0T3V0cHV0KHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNnT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmV4dE91dCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFNHT3V0cHV0T2JqX05ldywgbmV4dE91dCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dTZXRPdXRwdXRNYXhpbXVtT2Zmc2V0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNlcUdyYWJDb21wb25lbnQgczsKLQlTR091dHB1dCBzZ091dDsKLQl3aWRlIG1heE9mZnNldDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTZXFHcmFiQ29tcG9uZW50IHM7CisgICAgU0dPdXRwdXQgc2dPdXQ7CisgICAgd2lkZSBtYXhPZmZzZXQ7CiAjaWZuZGVmIFNHU2V0T3V0cHV0TWF4aW11bU9mZnNldAotCVB5TWFjX1BSRUNIRUNLKFNHU2V0T3V0cHV0TWF4aW11bU9mZnNldCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dTZXRPdXRwdXRNYXhpbXVtT2Zmc2V0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCi0JICAgICAgICAgICAgICAgICAgICAgIFNHT3V0cHV0T2JqX0NvbnZlcnQsICZzZ091dCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0d2lkZSwgJm1heE9mZnNldCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHU2V0T3V0cHV0TWF4aW11bU9mZnNldChzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZ091dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1heE9mZnNldCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU0dPdXRwdXRPYmpfQ29udmVydCwgJnNnT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXR3aWRlLCAmbWF4T2Zmc2V0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dTZXRPdXRwdXRNYXhpbXVtT2Zmc2V0KHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNnT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWF4T2Zmc2V0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0dldE91dHB1dE1heGltdW1PZmZzZXQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU2VxR3JhYkNvbXBvbmVudCBzOwotCVNHT3V0cHV0IHNnT3V0OwotCXdpZGUgbWF4T2Zmc2V0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNlcUdyYWJDb21wb25lbnQgczsKKyAgICBTR091dHB1dCBzZ091dDsKKyAgICB3aWRlIG1heE9mZnNldDsKICNpZm5kZWYgU0dHZXRPdXRwdXRNYXhpbXVtT2Zmc2V0Ci0JUHlNYWNfUFJFQ0hFQ0soU0dHZXRPdXRwdXRNYXhpbXVtT2Zmc2V0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0dldE91dHB1dE1heGltdW1PZmZzZXQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCi0JICAgICAgICAgICAgICAgICAgICAgIFNHT3V0cHV0T2JqX0NvbnZlcnQsICZzZ091dCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHR2V0T3V0cHV0TWF4aW11bU9mZnNldChzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZ091dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1heE9mZnNldCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgbWF4T2Zmc2V0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU0dPdXRwdXRPYmpfQ29udmVydCwgJnNnT3V0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dHZXRPdXRwdXRNYXhpbXVtT2Zmc2V0KHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNnT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWF4T2Zmc2V0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGR3aWRlLCBtYXhPZmZzZXQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHR2V0T3V0cHV0RGF0YVJlZmVyZW5jZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JU0dPdXRwdXQgc2dPdXQ7Ci0JSGFuZGxlIGRhdGFSZWY7Ci0JT1NUeXBlIGRhdGFSZWZUeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNlcUdyYWJDb21wb25lbnQgczsKKyAgICBTR091dHB1dCBzZ091dDsKKyAgICBIYW5kbGUgZGF0YVJlZjsKKyAgICBPU1R5cGUgZGF0YVJlZlR5cGU7CiAjaWZuZGVmIFNHR2V0T3V0cHV0RGF0YVJlZmVyZW5jZQotCVB5TWFjX1BSRUNIRUNLKFNHR2V0T3V0cHV0RGF0YVJlZmVyZW5jZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dHZXRPdXRwdXREYXRhUmVmZXJlbmNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAotCSAgICAgICAgICAgICAgICAgICAgICBTR091dHB1dE9ial9Db252ZXJ0LCAmc2dPdXQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0dldE91dHB1dERhdGFSZWZlcmVuY2UocywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2dPdXQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVJlZlR5cGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIGRhdGFSZWZUeXBlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU0dPdXRwdXRPYmpfQ29udmVydCwgJnNnT3V0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dHZXRPdXRwdXREYXRhUmVmZXJlbmNlKHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNnT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFSZWZUeXBlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBkYXRhUmVmVHlwZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dXcml0ZUV4dGVuZGVkTW92aWVEYXRhKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNlcUdyYWJDb21wb25lbnQgczsKLQlTR0NoYW5uZWwgYzsKLQlQdHIgcDsKLQlsb25nIGxlbjsKLQl3aWRlIG9mZnNldDsKLQlTR091dHB1dCBzZ091dDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTZXFHcmFiQ29tcG9uZW50IHM7CisgICAgU0dDaGFubmVsIGM7CisgICAgUHRyIHA7CisgICAgbG9uZyBsZW47CisgICAgd2lkZSBvZmZzZXQ7CisgICAgU0dPdXRwdXQgc2dPdXQ7CiAjaWZuZGVmIFNHV3JpdGVFeHRlbmRlZE1vdmllRGF0YQotCVB5TWFjX1BSRUNIRUNLKFNHV3JpdGVFeHRlbmRlZE1vdmllRGF0YSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dXcml0ZUV4dGVuZGVkTW92aWVEYXRhKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZzbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgICZwLAotCSAgICAgICAgICAgICAgICAgICAgICAmbGVuKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dXcml0ZUV4dGVuZGVkTW92aWVEYXRhKHMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNnT3V0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZHdpZGUsIG9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICBTR091dHB1dE9ial9OZXcsIHNnT3V0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mc2wiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmxlbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHV3JpdGVFeHRlbmRlZE1vdmllRGF0YShzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZ091dCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGR3aWRlLCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgU0dPdXRwdXRPYmpfTmV3LCBzZ091dCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dHZXRTdG9yYWdlU3BhY2VSZW1haW5pbmc2NChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0Jd2lkZSBieXRlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTZXFHcmFiQ29tcG9uZW50IHM7CisgICAgd2lkZSBieXRlczsKICNpZm5kZWYgU0dHZXRTdG9yYWdlU3BhY2VSZW1haW5pbmc2NAotCVB5TWFjX1BSRUNIRUNLKFNHR2V0U3RvcmFnZVNwYWNlUmVtYWluaW5nNjQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHR2V0U3RvcmFnZVNwYWNlUmVtYWluaW5nNjQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dHZXRTdG9yYWdlU3BhY2VSZW1haW5pbmc2NChzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ5dGVzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGR3aWRlLCBieXRlcyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dHZXRTdG9yYWdlU3BhY2VSZW1haW5pbmc2NChzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ5dGVzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGR3aWRlLCBieXRlcyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dHZXREYXRhT3V0cHV0U3RvcmFnZVNwYWNlUmVtYWluaW5nNjQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU2VxR3JhYkNvbXBvbmVudCBzOwotCVNHT3V0cHV0IHNnT3V0OwotCXdpZGUgc3BhY2U7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOworICAgIFNHT3V0cHV0IHNnT3V0OworICAgIHdpZGUgc3BhY2U7CiAjaWZuZGVmIFNHR2V0RGF0YU91dHB1dFN0b3JhZ2VTcGFjZVJlbWFpbmluZzY0Ci0JUHlNYWNfUFJFQ0hFQ0soU0dHZXREYXRhT3V0cHV0U3RvcmFnZVNwYWNlUmVtYWluaW5nNjQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHR2V0RGF0YU91dHB1dFN0b3JhZ2VTcGFjZVJlbWFpbmluZzY0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAotCSAgICAgICAgICAgICAgICAgICAgICBTR091dHB1dE9ial9Db252ZXJ0LCAmc2dPdXQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0dldERhdGFPdXRwdXRTdG9yYWdlU3BhY2VSZW1haW5pbmc2NChzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNnT3V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzcGFjZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgc3BhY2UpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTR091dHB1dE9ial9Db252ZXJ0LCAmc2dPdXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0dldERhdGFPdXRwdXRTdG9yYWdlU3BhY2VSZW1haW5pbmc2NChzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNnT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzcGFjZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgc3BhY2UpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHV3JpdGVNb3ZpZURhdGEoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU2VxR3JhYkNvbXBvbmVudCBzOwotCVNHQ2hhbm5lbCBjOwotCVB0ciBwOwotCWxvbmcgbGVuOwotCWxvbmcgb2Zmc2V0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNlcUdyYWJDb21wb25lbnQgczsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBQdHIgcDsKKyAgICBsb25nIGxlbjsKKyAgICBsb25nIG9mZnNldDsKICNpZm5kZWYgU0dXcml0ZU1vdmllRGF0YQotCVB5TWFjX1BSRUNIRUNLKFNHV3JpdGVNb3ZpZURhdGEpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHV3JpdGVNb3ZpZURhdGEpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJnNsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKLQkgICAgICAgICAgICAgICAgICAgICAgJnAsCi0JICAgICAgICAgICAgICAgICAgICAgICZsZW4pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR1dyaXRlTW92aWVEYXRhKHMsCi0JICAgICAgICAgICAgICAgICAgICAgICBjLAotCSAgICAgICAgICAgICAgICAgICAgICAgcCwKLQkgICAgICAgICAgICAgICAgICAgICAgIGxlbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICZvZmZzZXQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIG9mZnNldCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJnNsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZsZW4pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1dyaXRlTW92aWVEYXRhKHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZvZmZzZXQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dHZXRUaW1lQmFzZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JVGltZUJhc2UgdGI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOworICAgIFRpbWVCYXNlIHRiOwogI2lmbmRlZiBTR0dldFRpbWVCYXNlCi0JUHlNYWNfUFJFQ0hFQ0soU0dHZXRUaW1lQmFzZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dHZXRUaW1lQmFzZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0dldFRpbWVCYXNlKHMsCi0JICAgICAgICAgICAgICAgICAgICAmdGIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBUaW1lQmFzZU9ial9OZXcsIHRiKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0dldFRpbWVCYXNlKHMsCisgICAgICAgICAgICAgICAgICAgICAgICAmdGIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lQmFzZU9ial9OZXcsIHRiKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0FkZE1vdmllRGF0YShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JU0dDaGFubmVsIGM7Ci0JUHRyIHA7Ci0JbG9uZyBsZW47Ci0JbG9uZyBvZmZzZXQ7Ci0JbG9uZyBjaFJlZkNvbjsKLQlUaW1lVmFsdWUgdGltZTsKLQlzaG9ydCB3cml0ZVR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOworICAgIFNHQ2hhbm5lbCBjOworICAgIFB0ciBwOworICAgIGxvbmcgbGVuOworICAgIGxvbmcgb2Zmc2V0OworICAgIGxvbmcgY2hSZWZDb247CisgICAgVGltZVZhbHVlIHRpbWU7CisgICAgc2hvcnQgd3JpdGVUeXBlOwogI2lmbmRlZiBTR0FkZE1vdmllRGF0YQotCVB5TWFjX1BSRUNIRUNLKFNHQWRkTW92aWVEYXRhKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0FkZE1vdmllRGF0YSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mc2xsbGgiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAotCSAgICAgICAgICAgICAgICAgICAgICAmcCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmxlbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNoUmVmQ29uLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJndyaXRlVHlwZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHQWRkTW92aWVEYXRhKHMsCi0JICAgICAgICAgICAgICAgICAgICAgYywKLQkgICAgICAgICAgICAgICAgICAgICBwLAotCSAgICAgICAgICAgICAgICAgICAgIGxlbiwKLQkgICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgIGNoUmVmQ29uLAotCSAgICAgICAgICAgICAgICAgICAgIHRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgd3JpdGVUeXBlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBvZmZzZXQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZzbGxsaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY2hSZWZDb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmd3JpdGVUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dBZGRNb3ZpZURhdGEocywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjLAorICAgICAgICAgICAgICAgICAgICAgICAgIHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICZvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgY2hSZWZDb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgdGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZVR5cGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dDaGFuZ2VkU291cmNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNlcUdyYWJDb21wb25lbnQgczsKLQlTR0NoYW5uZWwgYzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTZXFHcmFiQ29tcG9uZW50IHM7CisgICAgU0dDaGFubmVsIGM7CiAjaWZuZGVmIFNHQ2hhbmdlZFNvdXJjZQotCVB5TWFjX1BSRUNIRUNLKFNHQ2hhbmdlZFNvdXJjZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dDaGFuZ2VkU291cmNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dDaGFuZ2VkU291cmNlKHMsCi0JICAgICAgICAgICAgICAgICAgICAgIGMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dDaGFuZ2VkU291cmNlKHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHQWRkRXh0ZW5kZWRNb3ZpZURhdGEoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU2VxR3JhYkNvbXBvbmVudCBzOwotCVNHQ2hhbm5lbCBjOwotCVB0ciBwOwotCWxvbmcgbGVuOwotCXdpZGUgb2Zmc2V0OwotCWxvbmcgY2hSZWZDb247Ci0JVGltZVZhbHVlIHRpbWU7Ci0Jc2hvcnQgd3JpdGVUeXBlOwotCVNHT3V0cHV0IHdoaWNoT3V0cHV0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNlcUdyYWJDb21wb25lbnQgczsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBQdHIgcDsKKyAgICBsb25nIGxlbjsKKyAgICB3aWRlIG9mZnNldDsKKyAgICBsb25nIGNoUmVmQ29uOworICAgIFRpbWVWYWx1ZSB0aW1lOworICAgIHNob3J0IHdyaXRlVHlwZTsKKyAgICBTR091dHB1dCB3aGljaE91dHB1dDsKICNpZm5kZWYgU0dBZGRFeHRlbmRlZE1vdmllRGF0YQotCVB5TWFjX1BSRUNIRUNLKFNHQWRkRXh0ZW5kZWRNb3ZpZURhdGEpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHQWRkRXh0ZW5kZWRNb3ZpZURhdGEpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJnNsbGxoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKLQkgICAgICAgICAgICAgICAgICAgICAgJnAsCi0JICAgICAgICAgICAgICAgICAgICAgICZsZW4sCi0JICAgICAgICAgICAgICAgICAgICAgICZjaFJlZkNvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZ3cml0ZVR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0FkZEV4dGVuZGVkTW92aWVEYXRhKHMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaFJlZkNvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd2hpY2hPdXRwdXQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgb2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgIFNHT3V0cHV0T2JqX05ldywgd2hpY2hPdXRwdXQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZzbGxsaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY2hSZWZDb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmd3JpdGVUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dBZGRFeHRlbmRlZE1vdmllRGF0YShzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hSZWZDb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJndoaWNoT3V0cHV0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZHdpZGUsIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTR091dHB1dE9ial9OZXcsIHdoaWNoT3V0cHV0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0FkZE91dHB1dERhdGFSZWZUb01lZGlhKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNlcUdyYWJDb21wb25lbnQgczsKLQlTR091dHB1dCBzZ091dDsKLQlNZWRpYSB0aGVNZWRpYTsKLQlTYW1wbGVEZXNjcmlwdGlvbkhhbmRsZSBkZXNjOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNlcUdyYWJDb21wb25lbnQgczsKKyAgICBTR091dHB1dCBzZ091dDsKKyAgICBNZWRpYSB0aGVNZWRpYTsKKyAgICBTYW1wbGVEZXNjcmlwdGlvbkhhbmRsZSBkZXNjOwogI2lmbmRlZiBTR0FkZE91dHB1dERhdGFSZWZUb01lZGlhCi0JUHlNYWNfUFJFQ0hFQ0soU0dBZGRPdXRwdXREYXRhUmVmVG9NZWRpYSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dBZGRPdXRwdXREYXRhUmVmVG9NZWRpYSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCi0JICAgICAgICAgICAgICAgICAgICAgIFNHT3V0cHV0T2JqX0NvbnZlcnQsICZzZ091dCwKLQkgICAgICAgICAgICAgICAgICAgICAgTWVkaWFPYmpfQ29udmVydCwgJnRoZU1lZGlhLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRlc2MpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0FkZE91dHB1dERhdGFSZWZUb01lZGlhKHMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZ091dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZU1lZGlhLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTR091dHB1dE9ial9Db252ZXJ0LCAmc2dPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhT2JqX0NvbnZlcnQsICZ0aGVNZWRpYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkZXNjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dBZGRPdXRwdXREYXRhUmVmVG9NZWRpYShzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2dPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVNZWRpYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHU2V0U2V0dGluZ3NTdW1tYXJ5KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNlcUdyYWJDb21wb25lbnQgczsKLQlIYW5kbGUgc3VtbWFyeVRleHQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOworICAgIEhhbmRsZSBzdW1tYXJ5VGV4dDsKICNpZm5kZWYgU0dTZXRTZXR0aW5nc1N1bW1hcnkKLQlQeU1hY19QUkVDSEVDSyhTR1NldFNldHRpbmdzU3VtbWFyeSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dTZXRTZXR0aW5nc1N1bW1hcnkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc3VtbWFyeVRleHQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR1NldFNldHRpbmdzU3VtbWFyeShzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcnlUZXh0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzdW1tYXJ5VGV4dCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHU2V0U2V0dGluZ3NTdW1tYXJ5KHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtbWFyeVRleHQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHU2V0Q2hhbm5lbFVzYWdlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNHQ2hhbm5lbCBjOwotCWxvbmcgdXNhZ2U7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CisgICAgbG9uZyB1c2FnZTsKICNpZm5kZWYgU0dTZXRDaGFubmVsVXNhZ2UKLQlQeU1hY19QUkVDSEVDSyhTR1NldENoYW5uZWxVc2FnZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dTZXRDaGFubmVsVXNhZ2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKLQkgICAgICAgICAgICAgICAgICAgICAgJnVzYWdlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dTZXRDaGFubmVsVXNhZ2UoYywKLQkgICAgICAgICAgICAgICAgICAgICAgICB1c2FnZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnVzYWdlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dTZXRDaGFubmVsVXNhZ2UoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2FnZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dHZXRDaGFubmVsVXNhZ2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU0dDaGFubmVsIGM7Ci0JbG9uZyB1c2FnZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBsb25nIHVzYWdlOwogI2lmbmRlZiBTR0dldENoYW5uZWxVc2FnZQotCVB5TWFjX1BSRUNIRUNLKFNHR2V0Q2hhbm5lbFVzYWdlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0dldENoYW5uZWxVc2FnZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0dldENoYW5uZWxVc2FnZShjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICZ1c2FnZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgdXNhZ2UpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHR2V0Q2hhbm5lbFVzYWdlKGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVzYWdlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1c2FnZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dTZXRDaGFubmVsQm91bmRzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNHQ2hhbm5lbCBjOwotCVJlY3QgYm91bmRzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOworICAgIFJlY3QgYm91bmRzOwogI2lmbmRlZiBTR1NldENoYW5uZWxCb3VuZHMKLQlQeU1hY19QUkVDSEVDSyhTR1NldENoYW5uZWxCb3VuZHMpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHU2V0Q2hhbm5lbEJvdW5kcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kcykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHU2V0Q2hhbm5lbEJvdW5kcyhjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHU2V0Q2hhbm5lbEJvdW5kcyhjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0dldENoYW5uZWxCb3VuZHMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU0dDaGFubmVsIGM7Ci0JUmVjdCBib3VuZHM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CisgICAgUmVjdCBib3VuZHM7CiAjaWZuZGVmIFNHR2V0Q2hhbm5lbEJvdW5kcwotCVB5TWFjX1BSRUNIRUNLKFNHR2V0Q2hhbm5lbEJvdW5kcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dHZXRDaGFubmVsQm91bmRzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHR2V0Q2hhbm5lbEJvdW5kcyhjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmYm91bmRzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0dldENoYW5uZWxCb3VuZHMoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kcyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmJvdW5kcyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dTZXRDaGFubmVsVm9sdW1lKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNHQ2hhbm5lbCBjOwotCXNob3J0IHZvbHVtZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBzaG9ydCB2b2x1bWU7CiAjaWZuZGVmIFNHU2V0Q2hhbm5lbFZvbHVtZQotCVB5TWFjX1BSRUNIRUNLKFNHU2V0Q2hhbm5lbFZvbHVtZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dTZXRDaGFubmVsVm9sdW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2b2x1bWUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR1NldENoYW5uZWxWb2x1bWUoYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdm9sdW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dTZXRDaGFubmVsVm9sdW1lKGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dHZXRDaGFubmVsVm9sdW1lKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNHQ2hhbm5lbCBjOwotCXNob3J0IHZvbHVtZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBzaG9ydCB2b2x1bWU7CiAjaWZuZGVmIFNHR2V0Q2hhbm5lbFZvbHVtZQotCVB5TWFjX1BSRUNIRUNLKFNHR2V0Q2hhbm5lbFZvbHVtZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dHZXRDaGFubmVsVm9sdW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHR2V0Q2hhbm5lbFZvbHVtZShjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmdm9sdW1lKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICB2b2x1bWUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHR2V0Q2hhbm5lbFZvbHVtZShjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdm9sdW1lKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHR2V0Q2hhbm5lbEluZm8oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU0dDaGFubmVsIGM7Ci0JbG9uZyBjaGFubmVsSW5mbzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBsb25nIGNoYW5uZWxJbmZvOwogI2lmbmRlZiBTR0dldENoYW5uZWxJbmZvCi0JUHlNYWNfUFJFQ0hFQ0soU0dHZXRDaGFubmVsSW5mbyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dHZXRDaGFubmVsSW5mbyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0dldENoYW5uZWxJbmZvKGMsCi0JICAgICAgICAgICAgICAgICAgICAgICAmY2hhbm5lbEluZm8pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxJbmZvKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0dldENoYW5uZWxJbmZvKGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2hhbm5lbEluZm8pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxJbmZvKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1NldENoYW5uZWxQbGF5RmxhZ3MoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU0dDaGFubmVsIGM7Ci0JbG9uZyBwbGF5RmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CisgICAgbG9uZyBwbGF5RmxhZ3M7CiAjaWZuZGVmIFNHU2V0Q2hhbm5lbFBsYXlGbGFncwotCVB5TWFjX1BSRUNIRUNLKFNHU2V0Q2hhbm5lbFBsYXlGbGFncyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dTZXRDaGFubmVsUGxheUZsYWdzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgICZwbGF5RmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR1NldENoYW5uZWxQbGF5RmxhZ3MoYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheUZsYWdzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGxheUZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dTZXRDaGFubmVsUGxheUZsYWdzKGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXlGbGFncyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dHZXRDaGFubmVsUGxheUZsYWdzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNHQ2hhbm5lbCBjOwotCWxvbmcgcGxheUZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOworICAgIGxvbmcgcGxheUZsYWdzOwogI2lmbmRlZiBTR0dldENoYW5uZWxQbGF5RmxhZ3MKLQlQeU1hY19QUkVDSEVDSyhTR0dldENoYW5uZWxQbGF5RmxhZ3MpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHR2V0Q2hhbm5lbFBsYXlGbGFncyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0dldENoYW5uZWxQbGF5RmxhZ3MoYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBsYXlGbGFncyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgcGxheUZsYWdzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0dldENoYW5uZWxQbGF5RmxhZ3MoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBsYXlGbGFncyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgcGxheUZsYWdzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1NldENoYW5uZWxNYXhGcmFtZXMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU0dDaGFubmVsIGM7Ci0JbG9uZyBmcmFtZUNvdW50OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOworICAgIGxvbmcgZnJhbWVDb3VudDsKICNpZm5kZWYgU0dTZXRDaGFubmVsTWF4RnJhbWVzCi0JUHlNYWNfUFJFQ0hFQ0soU0dTZXRDaGFubmVsTWF4RnJhbWVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR1NldENoYW5uZWxNYXhGcmFtZXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKLQkgICAgICAgICAgICAgICAgICAgICAgJmZyYW1lQ291bnQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR1NldENoYW5uZWxNYXhGcmFtZXMoYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZyYW1lQ291bnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1NldENoYW5uZWxNYXhGcmFtZXMoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dHZXRDaGFubmVsTWF4RnJhbWVzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNHQ2hhbm5lbCBjOwotCWxvbmcgZnJhbWVDb3VudDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBsb25nIGZyYW1lQ291bnQ7CiAjaWZuZGVmIFNHR2V0Q2hhbm5lbE1heEZyYW1lcwotCVB5TWFjX1BSRUNIRUNLKFNHR2V0Q2hhbm5lbE1heEZyYW1lcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dHZXRDaGFubmVsTWF4RnJhbWVzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHR2V0Q2hhbm5lbE1heEZyYW1lcyhjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZnJhbWVDb3VudCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dHZXRDaGFubmVsTWF4RnJhbWVzKGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmcmFtZUNvdW50KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1NldENoYW5uZWxSZWZDb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU0dDaGFubmVsIGM7Ci0JbG9uZyByZWZDb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CisgICAgbG9uZyByZWZDb247CiAjaWZuZGVmIFNHU2V0Q2hhbm5lbFJlZkNvbgotCVB5TWFjX1BSRUNIRUNLKFNHU2V0Q2hhbm5lbFJlZkNvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dTZXRDaGFubmVsUmVmQ29uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZWZDb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR1NldENoYW5uZWxSZWZDb24oYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgcmVmQ29uKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVmQ29uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dTZXRDaGFubmVsUmVmQ29uKGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZkNvbik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dTZXRDaGFubmVsQ2xpcChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlSZ25IYW5kbGUgdGhlQ2xpcDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBSZ25IYW5kbGUgdGhlQ2xpcDsKICNpZm5kZWYgU0dTZXRDaGFubmVsQ2xpcAotCVB5TWFjX1BSRUNIRUNLKFNHU2V0Q2hhbm5lbENsaXApOworICAgIFB5TWFjX1BSRUNIRUNLKFNHU2V0Q2hhbm5lbENsaXApOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlQ2xpcCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHU2V0Q2hhbm5lbENsaXAoYywKLQkgICAgICAgICAgICAgICAgICAgICAgIHRoZUNsaXApOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUNsaXApKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1NldENoYW5uZWxDbGlwKGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVDbGlwKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0dldENoYW5uZWxDbGlwKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNHQ2hhbm5lbCBjOwotCVJnbkhhbmRsZSB0aGVDbGlwOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOworICAgIFJnbkhhbmRsZSB0aGVDbGlwOwogI2lmbmRlZiBTR0dldENoYW5uZWxDbGlwCi0JUHlNYWNfUFJFQ0hFQ0soU0dHZXRDaGFubmVsQ2xpcCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dHZXRDaGFubmVsQ2xpcCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0dldENoYW5uZWxDbGlwKGMsCi0JICAgICAgICAgICAgICAgICAgICAgICAmdGhlQ2xpcCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHRoZUNsaXApOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHR2V0Q2hhbm5lbENsaXAoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVDbGlwKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgdGhlQ2xpcCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dHZXRDaGFubmVsU2FtcGxlRGVzY3JpcHRpb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU0dDaGFubmVsIGM7Ci0JSGFuZGxlIHNhbXBsZURlc2M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CisgICAgSGFuZGxlIHNhbXBsZURlc2M7CiAjaWZuZGVmIFNHR2V0Q2hhbm5lbFNhbXBsZURlc2NyaXB0aW9uCi0JUHlNYWNfUFJFQ0hFQ0soU0dHZXRDaGFubmVsU2FtcGxlRGVzY3JpcHRpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKFNHR2V0Q2hhbm5lbFNhbXBsZURlc2NyaXB0aW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNhbXBsZURlc2MpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0dldENoYW5uZWxTYW1wbGVEZXNjcmlwdGlvbihjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZURlc2MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNhbXBsZURlc2MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0dldENoYW5uZWxTYW1wbGVEZXNjcmlwdGlvbihjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZURlc2MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHU2V0Q2hhbm5lbERldmljZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlTdHJpbmdQdHIgbmFtZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBTdHJpbmdQdHIgbmFtZTsKICNpZm5kZWYgU0dTZXRDaGFubmVsRGV2aWNlCi0JUHlNYWNfUFJFQ0hFQ0soU0dTZXRDaGFubmVsRGV2aWNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR1NldENoYW5uZWxEZXZpY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKLQkgICAgICAgICAgICAgICAgICAgICAgJm5hbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR1NldENoYW5uZWxEZXZpY2UoYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1NldENoYW5uZWxEZXZpY2UoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dHZXRDaGFubmVsVGltZVNjYWxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNHQ2hhbm5lbCBjOwotCVRpbWVTY2FsZSBzY2FsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBUaW1lU2NhbGUgc2NhbGU7CiAjaWZuZGVmIFNHR2V0Q2hhbm5lbFRpbWVTY2FsZQotCVB5TWFjX1BSRUNIRUNLKFNHR2V0Q2hhbm5lbFRpbWVTY2FsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dHZXRDaGFubmVsVGltZVNjYWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHR2V0Q2hhbm5lbFRpbWVTY2FsZShjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2NhbGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHNjYWxlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0dldENoYW5uZWxUaW1lU2NhbGUoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNjYWxlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dDaGFubmVsUHV0UGljdHVyZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKICNpZm5kZWYgU0dDaGFubmVsUHV0UGljdHVyZQotCVB5TWFjX1BSRUNIRUNLKFNHQ2hhbm5lbFB1dFBpY3R1cmUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHQ2hhbm5lbFB1dFBpY3R1cmUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dDaGFubmVsUHV0UGljdHVyZShjKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0NoYW5uZWxQdXRQaWN0dXJlKGMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHQ2hhbm5lbFNldFJlcXVlc3RlZERhdGFSYXRlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNHQ2hhbm5lbCBjOwotCWxvbmcgYnl0ZXNQZXJTZWNvbmQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CisgICAgbG9uZyBieXRlc1BlclNlY29uZDsKICNpZm5kZWYgU0dDaGFubmVsU2V0UmVxdWVzdGVkRGF0YVJhdGUKLQlQeU1hY19QUkVDSEVDSyhTR0NoYW5uZWxTZXRSZXF1ZXN0ZWREYXRhUmF0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dDaGFubmVsU2V0UmVxdWVzdGVkRGF0YVJhdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKLQkgICAgICAgICAgICAgICAgICAgICAgJmJ5dGVzUGVyU2Vjb25kKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dDaGFubmVsU2V0UmVxdWVzdGVkRGF0YVJhdGUoYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlc1BlclNlY29uZCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ5dGVzUGVyU2Vjb25kKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dDaGFubmVsU2V0UmVxdWVzdGVkRGF0YVJhdGUoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlc1BlclNlY29uZCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dDaGFubmVsR2V0UmVxdWVzdGVkRGF0YVJhdGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU0dDaGFubmVsIGM7Ci0JbG9uZyBieXRlc1BlclNlY29uZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBsb25nIGJ5dGVzUGVyU2Vjb25kOwogI2lmbmRlZiBTR0NoYW5uZWxHZXRSZXF1ZXN0ZWREYXRhUmF0ZQotCVB5TWFjX1BSRUNIRUNLKFNHQ2hhbm5lbEdldFJlcXVlc3RlZERhdGFSYXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0NoYW5uZWxHZXRSZXF1ZXN0ZWREYXRhUmF0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0NoYW5uZWxHZXRSZXF1ZXN0ZWREYXRhUmF0ZShjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZieXRlc1BlclNlY29uZCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgYnl0ZXNQZXJTZWNvbmQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHQ2hhbm5lbEdldFJlcXVlc3RlZERhdGFSYXRlKGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ5dGVzUGVyU2Vjb25kKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBieXRlc1BlclNlY29uZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dDaGFubmVsU2V0RGF0YVNvdXJjZU5hbWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU0dDaGFubmVsIGM7Ci0JU3RyMjU1IG5hbWU7Ci0JU2NyaXB0Q29kZSBzY3JpcHRUYWc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CisgICAgU3RyMjU1IG5hbWU7CisgICAgU2NyaXB0Q29kZSBzY3JpcHRUYWc7CiAjaWZuZGVmIFNHQ2hhbm5lbFNldERhdGFTb3VyY2VOYW1lCi0JUHlNYWNfUFJFQ0hFQ0soU0dDaGFubmVsU2V0RGF0YVNvdXJjZU5hbWUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHQ2hhbm5lbFNldERhdGFTb3VyY2VOYW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBuYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2NyaXB0VGFnKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dDaGFubmVsU2V0RGF0YVNvdXJjZU5hbWUoYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdFRhZyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzY3JpcHRUYWcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0NoYW5uZWxTZXREYXRhU291cmNlTmFtZShjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0VGFnKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0NoYW5uZWxHZXREYXRhU291cmNlTmFtZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlTdHIyNTUgbmFtZTsKLQlTY3JpcHRDb2RlIHNjcmlwdFRhZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBTdHIyNTUgbmFtZTsKKyAgICBTY3JpcHRDb2RlIHNjcmlwdFRhZzsKICNpZm5kZWYgU0dDaGFubmVsR2V0RGF0YVNvdXJjZU5hbWUKLQlQeU1hY19QUkVDSEVDSyhTR0NoYW5uZWxHZXREYXRhU291cmNlTmFtZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dDaGFubmVsR2V0RGF0YVNvdXJjZU5hbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgbmFtZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHQ2hhbm5lbEdldERhdGFTb3VyY2VOYW1lKGMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2NyaXB0VGFnKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBzY3JpcHRUYWcpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIG5hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0NoYW5uZWxHZXREYXRhU291cmNlTmFtZShjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNjcmlwdFRhZyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0VGFnKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0NoYW5uZWxTZXRDb2RlY1NldHRpbmdzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNHQ2hhbm5lbCBjOwotCUhhbmRsZSBzZXR0aW5nczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBIYW5kbGUgc2V0dGluZ3M7CiAjaWZuZGVmIFNHQ2hhbm5lbFNldENvZGVjU2V0dGluZ3MKLQlQeU1hY19QUkVDSEVDSyhTR0NoYW5uZWxTZXRDb2RlY1NldHRpbmdzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0NoYW5uZWxTZXRDb2RlY1NldHRpbmdzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNldHRpbmdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dDaGFubmVsU2V0Q29kZWNTZXR0aW5ncyhjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNldHRpbmdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dDaGFubmVsU2V0Q29kZWNTZXR0aW5ncyhjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHQ2hhbm5lbEdldENvZGVjU2V0dGluZ3MoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU0dDaGFubmVsIGM7Ci0JSGFuZGxlIHNldHRpbmdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOworICAgIEhhbmRsZSBzZXR0aW5nczsKICNpZm5kZWYgU0dDaGFubmVsR2V0Q29kZWNTZXR0aW5ncwotCVB5TWFjX1BSRUNIRUNLKFNHQ2hhbm5lbEdldENvZGVjU2V0dGluZ3MpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHQ2hhbm5lbEdldENvZGVjU2V0dGluZ3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dDaGFubmVsR2V0Q29kZWNTZXR0aW5ncyhjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNldHRpbmdzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgc2V0dGluZ3MpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHQ2hhbm5lbEdldENvZGVjU2V0dGluZ3MoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXR0aW5ncyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHNldHRpbmdzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0dldENoYW5uZWxUaW1lQmFzZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlUaW1lQmFzZSB0YjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBUaW1lQmFzZSB0YjsKICNpZm5kZWYgU0dHZXRDaGFubmVsVGltZUJhc2UKLQlQeU1hY19QUkVDSEVDSyhTR0dldENoYW5uZWxUaW1lQmFzZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dHZXRDaGFubmVsVGltZUJhc2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dHZXRDaGFubmVsVGltZUJhc2UoYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBUaW1lQmFzZU9ial9OZXcsIHRiKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0dldENoYW5uZWxUaW1lQmFzZShjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0Yik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVCYXNlT2JqX05ldywgdGIpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHR2V0Q2hhbm5lbFJlZkNvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlsb25nIHJlZkNvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBsb25nIHJlZkNvbjsKICNpZm5kZWYgU0dHZXRDaGFubmVsUmVmQ29uCi0JUHlNYWNfUFJFQ0hFQ0soU0dHZXRDaGFubmVsUmVmQ29uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0dldENoYW5uZWxSZWZDb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dHZXRDaGFubmVsUmVmQ29uKGMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZyZWZDb24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHJlZkNvbik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dHZXRDaGFubmVsUmVmQ29uKGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWZDb24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlZkNvbik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dHZXRDaGFubmVsRGV2aWNlQW5kSW5wdXROYW1lcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlTdHIyNTUgb3V0RGV2aWNlTmFtZTsKLQlTdHIyNTUgb3V0SW5wdXROYW1lOwotCXNob3J0IG91dElucHV0TnVtYmVyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOworICAgIFN0cjI1NSBvdXREZXZpY2VOYW1lOworICAgIFN0cjI1NSBvdXRJbnB1dE5hbWU7CisgICAgc2hvcnQgb3V0SW5wdXROdW1iZXI7CiAjaWZuZGVmIFNHR2V0Q2hhbm5lbERldmljZUFuZElucHV0TmFtZXMKLQlQeU1hY19QUkVDSEVDSyhTR0dldENoYW5uZWxEZXZpY2VBbmRJbnB1dE5hbWVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0dldENoYW5uZWxEZXZpY2VBbmRJbnB1dE5hbWVzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgb3V0RGV2aWNlTmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBvdXRJbnB1dE5hbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0dldENoYW5uZWxEZXZpY2VBbmRJbnB1dE5hbWVzKGMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXREZXZpY2VOYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0SW5wdXROYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dElucHV0TnVtYmVyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRJbnB1dE51bWJlcik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBvdXREZXZpY2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIG91dElucHV0TmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHR2V0Q2hhbm5lbERldmljZUFuZElucHV0TmFtZXMoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dERldmljZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRJbnB1dE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0SW5wdXROdW1iZXIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dElucHV0TnVtYmVyKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1NldENoYW5uZWxEZXZpY2VJbnB1dChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlzaG9ydCBpbklucHV0TnVtYmVyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOworICAgIHNob3J0IGluSW5wdXROdW1iZXI7CiAjaWZuZGVmIFNHU2V0Q2hhbm5lbERldmljZUlucHV0Ci0JUHlNYWNfUFJFQ0hFQ0soU0dTZXRDaGFubmVsRGV2aWNlSW5wdXQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHU2V0Q2hhbm5lbERldmljZUlucHV0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbklucHV0TnVtYmVyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dTZXRDaGFubmVsRGV2aWNlSW5wdXQoYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbklucHV0TnVtYmVyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5JbnB1dE51bWJlcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHU2V0Q2hhbm5lbERldmljZUlucHV0KGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5JbnB1dE51bWJlcik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dTZXRDaGFubmVsU2V0dGluZ3NTdGF0ZUNoYW5naW5nKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNHQ2hhbm5lbCBjOwotCVVJbnQzMiBpbkZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOworICAgIFVJbnQzMiBpbkZsYWdzOwogI2lmbmRlZiBTR1NldENoYW5uZWxTZXR0aW5nc1N0YXRlQ2hhbmdpbmcKLQlQeU1hY19QUkVDSEVDSyhTR1NldENoYW5uZWxTZXR0aW5nc1N0YXRlQ2hhbmdpbmcpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHU2V0Q2hhbm5lbFNldHRpbmdzU3RhdGVDaGFuZ2luZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5GbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHU2V0Q2hhbm5lbFNldHRpbmdzU3RhdGVDaGFuZ2luZyhjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkZsYWdzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5GbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHU2V0Q2hhbm5lbFNldHRpbmdzU3RhdGVDaGFuZ2luZyhjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkZsYWdzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0luaXRDaGFubmVsKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNHQ2hhbm5lbCBjOwotCVNlcUdyYWJDb21wb25lbnQgb3duZXI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CisgICAgU2VxR3JhYkNvbXBvbmVudCBvd25lcjsKICNpZm5kZWYgU0dJbml0Q2hhbm5lbAotCVB5TWFjX1BSRUNIRUNLKFNHSW5pdENoYW5uZWwpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHSW5pdENoYW5uZWwpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm93bmVyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dJbml0Q2hhbm5lbChjLAotCSAgICAgICAgICAgICAgICAgICAgb3duZXIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZvd25lcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHSW5pdENoYW5uZWwoYywKKyAgICAgICAgICAgICAgICAgICAgICAgIG93bmVyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1dyaXRlU2FtcGxlcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlNb3ZpZSBtOwotCUFsaWFzSGFuZGxlIHRoZUZpbGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CisgICAgTW92aWUgbTsKKyAgICBBbGlhc0hhbmRsZSB0aGVGaWxlOwogI2lmbmRlZiBTR1dyaXRlU2FtcGxlcwotCVB5TWFjX1BSRUNIRUNLKFNHV3JpdGVTYW1wbGVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR1dyaXRlU2FtcGxlcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAotCSAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9Db252ZXJ0LCAmbSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVGaWxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dXcml0ZVNhbXBsZXMoYywKLQkgICAgICAgICAgICAgICAgICAgICBtLAotCSAgICAgICAgICAgICAgICAgICAgIHRoZUZpbGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX0NvbnZlcnQsICZtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUZpbGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1dyaXRlU2FtcGxlcyhjLAorICAgICAgICAgICAgICAgICAgICAgICAgIG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgdGhlRmlsZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dHZXREYXRhUmF0ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlsb25nIGJ5dGVzUGVyU2Vjb25kOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOworICAgIGxvbmcgYnl0ZXNQZXJTZWNvbmQ7CiAjaWZuZGVmIFNHR2V0RGF0YVJhdGUKLQlQeU1hY19QUkVDSEVDSyhTR0dldERhdGFSYXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0dldERhdGFSYXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHR2V0RGF0YVJhdGUoYywKLQkgICAgICAgICAgICAgICAgICAgICZieXRlc1BlclNlY29uZCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgYnl0ZXNQZXJTZWNvbmQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHR2V0RGF0YVJhdGUoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICZieXRlc1BlclNlY29uZCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNQZXJTZWNvbmQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHQWxpZ25DaGFubmVsUmVjdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlSZWN0IHI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CisgICAgUmVjdCByOwogI2lmbmRlZiBTR0FsaWduQ2hhbm5lbFJlY3QKLQlQeU1hY19QUkVDSEVDSyhTR0FsaWduQ2hhbm5lbFJlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHQWxpZ25DaGFubmVsUmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0FsaWduQ2hhbm5lbFJlY3QoYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZyKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0FsaWduQ2hhbm5lbFJlY3QoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZyKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1BhbmVsR2V0RGl0bChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JSGFuZGxlIGRpdGw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOworICAgIEhhbmRsZSBkaXRsOwogI2lmbmRlZiBTR1BhbmVsR2V0RGl0bAotCVB5TWFjX1BSRUNIRUNLKFNHUGFuZWxHZXREaXRsKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR1BhbmVsR2V0RGl0bCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR1BhbmVsR2V0RGl0bChzLAotCSAgICAgICAgICAgICAgICAgICAgICZkaXRsKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgZGl0bCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dQYW5lbEdldERpdGwocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAmZGl0bCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGRpdGwpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHUGFuZWxHZXRUaXRsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JU3RyMjU1IHRpdGxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNlcUdyYWJDb21wb25lbnQgczsKKyAgICBTdHIyNTUgdGl0bGU7CiAjaWZuZGVmIFNHUGFuZWxHZXRUaXRsZQotCVB5TWFjX1BSRUNIRUNLKFNHUGFuZWxHZXRUaXRsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dQYW5lbEdldFRpdGxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIHRpdGxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dQYW5lbEdldFRpdGxlKHMsCi0JICAgICAgICAgICAgICAgICAgICAgIHRpdGxlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCB0aXRsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHUGFuZWxHZXRUaXRsZShzLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dQYW5lbENhblJ1bihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JU0dDaGFubmVsIGM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOworICAgIFNHQ2hhbm5lbCBjOwogI2lmbmRlZiBTR1BhbmVsQ2FuUnVuCi0JUHlNYWNfUFJFQ0hFQ0soU0dQYW5lbENhblJ1bik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dQYW5lbENhblJ1bik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHUGFuZWxDYW5SdW4ocywKLQkgICAgICAgICAgICAgICAgICAgIGMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dQYW5lbENhblJ1bihzLAorICAgICAgICAgICAgICAgICAgICAgICAgYyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dQYW5lbEluc3RhbGwoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU2VxR3JhYkNvbXBvbmVudCBzOwotCVNHQ2hhbm5lbCBjOwotCURpYWxvZ1B0ciBkOwotCXNob3J0IGl0ZW1PZmZzZXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOworICAgIFNHQ2hhbm5lbCBjOworICAgIERpYWxvZ1B0ciBkOworICAgIHNob3J0IGl0ZW1PZmZzZXQ7CiAjaWZuZGVmIFNHUGFuZWxJbnN0YWxsCi0JUHlNYWNfUFJFQ0hFQ0soU0dQYW5lbEluc3RhbGwpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHUGFuZWxJbnN0YWxsKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAotCSAgICAgICAgICAgICAgICAgICAgICBEbGdPYmpfQ29udmVydCwgJmQsCi0JICAgICAgICAgICAgICAgICAgICAgICZpdGVtT2Zmc2V0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dQYW5lbEluc3RhbGwocywKLQkgICAgICAgICAgICAgICAgICAgICBjLAotCSAgICAgICAgICAgICAgICAgICAgIGQsCi0JICAgICAgICAgICAgICAgICAgICAgaXRlbU9mZnNldCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERsZ09ial9Db252ZXJ0LCAmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZW1PZmZzZXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1BhbmVsSW5zdGFsbChzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtT2Zmc2V0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1BhbmVsRXZlbnQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU2VxR3JhYkNvbXBvbmVudCBzOwotCVNHQ2hhbm5lbCBjOwotCURpYWxvZ1B0ciBkOwotCXNob3J0IGl0ZW1PZmZzZXQ7Ci0JRXZlbnRSZWNvcmQgdGhlRXZlbnQ7Ci0Jc2hvcnQgaXRlbUhpdDsKLQlCb29sZWFuIGhhbmRsZWQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOworICAgIFNHQ2hhbm5lbCBjOworICAgIERpYWxvZ1B0ciBkOworICAgIHNob3J0IGl0ZW1PZmZzZXQ7CisgICAgRXZlbnRSZWNvcmQgdGhlRXZlbnQ7CisgICAgc2hvcnQgaXRlbUhpdDsKKyAgICBCb29sZWFuIGhhbmRsZWQ7CiAjaWZuZGVmIFNHUGFuZWxFdmVudAotCVB5TWFjX1BSRUNIRUNLKFNHUGFuZWxFdmVudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dQYW5lbEV2ZW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmhPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgIERsZ09ial9Db252ZXJ0LCAmZCwKLQkgICAgICAgICAgICAgICAgICAgICAgJml0ZW1PZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEV2ZW50UmVjb3JkLCAmdGhlRXZlbnQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR1BhbmVsRXZlbnQocywKLQkgICAgICAgICAgICAgICAgICAgYywKLQkgICAgICAgICAgICAgICAgICAgZCwKLQkgICAgICAgICAgICAgICAgICAgaXRlbU9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgJnRoZUV2ZW50LAotCSAgICAgICAgICAgICAgICAgICAmaXRlbUhpdCwKLQkgICAgICAgICAgICAgICAgICAgJmhhbmRsZWQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsaGIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBpdGVtSGl0LAotCSAgICAgICAgICAgICAgICAgICAgIGhhbmRsZWQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmhPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERsZ09ial9Db252ZXJ0LCAmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZW1PZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEV2ZW50UmVjb3JkLCAmdGhlRXZlbnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1BhbmVsRXZlbnQocywKKyAgICAgICAgICAgICAgICAgICAgICAgYywKKyAgICAgICAgICAgICAgICAgICAgICAgZCwKKyAgICAgICAgICAgICAgICAgICAgICAgaXRlbU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgJnRoZUV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAmaXRlbUhpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgJmhhbmRsZWQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsaGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtSGl0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZWQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHUGFuZWxJdGVtKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNlcUdyYWJDb21wb25lbnQgczsKLQlTR0NoYW5uZWwgYzsKLQlEaWFsb2dQdHIgZDsKLQlzaG9ydCBpdGVtT2Zmc2V0OwotCXNob3J0IGl0ZW1OdW07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOworICAgIFNHQ2hhbm5lbCBjOworICAgIERpYWxvZ1B0ciBkOworICAgIHNob3J0IGl0ZW1PZmZzZXQ7CisgICAgc2hvcnQgaXRlbU51bTsKICNpZm5kZWYgU0dQYW5lbEl0ZW0KLQlQeU1hY19QUkVDSEVDSyhTR1BhbmVsSXRlbSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dQYW5lbEl0ZW0pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8maGgiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAotCSAgICAgICAgICAgICAgICAgICAgICBEbGdPYmpfQ29udmVydCwgJmQsCi0JICAgICAgICAgICAgICAgICAgICAgICZpdGVtT2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAmaXRlbU51bSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHUGFuZWxJdGVtKHMsCi0JICAgICAgICAgICAgICAgICAgYywKLQkgICAgICAgICAgICAgICAgICBkLAotCSAgICAgICAgICAgICAgICAgIGl0ZW1PZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgaXRlbU51bSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8maGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEbGdPYmpfQ29udmVydCwgJmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpdGVtT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRlbU51bSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHUGFuZWxJdGVtKHMsCisgICAgICAgICAgICAgICAgICAgICAgYywKKyAgICAgICAgICAgICAgICAgICAgICBkLAorICAgICAgICAgICAgICAgICAgICAgIGl0ZW1PZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgaXRlbU51bSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dQYW5lbFJlbW92ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JU0dDaGFubmVsIGM7Ci0JRGlhbG9nUHRyIGQ7Ci0Jc2hvcnQgaXRlbU9mZnNldDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTZXFHcmFiQ29tcG9uZW50IHM7CisgICAgU0dDaGFubmVsIGM7CisgICAgRGlhbG9nUHRyIGQ7CisgICAgc2hvcnQgaXRlbU9mZnNldDsKICNpZm5kZWYgU0dQYW5lbFJlbW92ZQotCVB5TWFjX1BSRUNIRUNLKFNHUGFuZWxSZW1vdmUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHUGFuZWxSZW1vdmUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgIERsZ09ial9Db252ZXJ0LCAmZCwKLQkgICAgICAgICAgICAgICAgICAgICAgJml0ZW1PZmZzZXQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR1BhbmVsUmVtb3ZlKHMsCi0JICAgICAgICAgICAgICAgICAgICBjLAotCSAgICAgICAgICAgICAgICAgICAgZCwKLQkgICAgICAgICAgICAgICAgICAgIGl0ZW1PZmZzZXQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEbGdPYmpfQ29udmVydCwgJmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpdGVtT2Zmc2V0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dQYW5lbFJlbW92ZShzLAorICAgICAgICAgICAgICAgICAgICAgICAgYywKKyAgICAgICAgICAgICAgICAgICAgICAgIGQsCisgICAgICAgICAgICAgICAgICAgICAgICBpdGVtT2Zmc2V0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1BhbmVsU2V0R3JhYmJlcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JU2VxR3JhYkNvbXBvbmVudCBzZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTZXFHcmFiQ29tcG9uZW50IHM7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzZzsKICNpZm5kZWYgU0dQYW5lbFNldEdyYWJiZXIKLQlQeU1hY19QUkVDSEVDSyhTR1BhbmVsU2V0R3JhYmJlcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dQYW5lbFNldEdyYWJiZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnNnKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dQYW5lbFNldEdyYWJiZXIocywKLQkgICAgICAgICAgICAgICAgICAgICAgICBzZyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnNnKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dQYW5lbFNldEdyYWJiZXIocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dQYW5lbFNldFJlc0ZpbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU2VxR3JhYkNvbXBvbmVudCBzOwotCXNob3J0IHJlc1JlZjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTZXFHcmFiQ29tcG9uZW50IHM7CisgICAgc2hvcnQgcmVzUmVmOwogI2lmbmRlZiBTR1BhbmVsU2V0UmVzRmlsZQotCVB5TWFjX1BSRUNIRUNLKFNHUGFuZWxTZXRSZXNGaWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR1BhbmVsU2V0UmVzRmlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVzUmVmKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dQYW5lbFNldFJlc0ZpbGUocywKLQkgICAgICAgICAgICAgICAgICAgICAgICByZXNSZWYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXNSZWYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1BhbmVsU2V0UmVzRmlsZShzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc1JlZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dQYW5lbEdldFNldHRpbmdzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNlcUdyYWJDb21wb25lbnQgczsKLQlTR0NoYW5uZWwgYzsKLQlVc2VyRGF0YSB1ZDsKLQlsb25nIGZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNlcUdyYWJDb21wb25lbnQgczsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBVc2VyRGF0YSB1ZDsKKyAgICBsb25nIGZsYWdzOwogI2lmbmRlZiBTR1BhbmVsR2V0U2V0dGluZ3MKLQlQeU1hY19QUkVDSEVDSyhTR1BhbmVsR2V0U2V0dGluZ3MpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHUGFuZWxHZXRTZXR0aW5ncyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHUGFuZWxHZXRTZXR0aW5ncyhzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmdWQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgVXNlckRhdGFPYmpfTmV3LCB1ZCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1BhbmVsR2V0U2V0dGluZ3MocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJEYXRhT2JqX05ldywgdWQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHUGFuZWxTZXRTZXR0aW5ncyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JU0dDaGFubmVsIGM7Ci0JVXNlckRhdGEgdWQ7Ci0JbG9uZyBmbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTZXFHcmFiQ29tcG9uZW50IHM7CisgICAgU0dDaGFubmVsIGM7CisgICAgVXNlckRhdGEgdWQ7CisgICAgbG9uZyBmbGFnczsKICNpZm5kZWYgU0dQYW5lbFNldFNldHRpbmdzCi0JUHlNYWNfUFJFQ0hFQ0soU0dQYW5lbFNldFNldHRpbmdzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR1BhbmVsU2V0U2V0dGluZ3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgIFVzZXJEYXRhT2JqX0NvbnZlcnQsICZ1ZCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dQYW5lbFNldFNldHRpbmdzKHMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIHVkLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJEYXRhT2JqX0NvbnZlcnQsICZ1ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dQYW5lbFNldFNldHRpbmdzKHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dQYW5lbFZhbGlkYXRlSW5wdXQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU2VxR3JhYkNvbXBvbmVudCBzOwotCUJvb2xlYW4gb2s7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOworICAgIEJvb2xlYW4gb2s7CiAjaWZuZGVmIFNHUGFuZWxWYWxpZGF0ZUlucHV0Ci0JUHlNYWNfUFJFQ0hFQ0soU0dQYW5lbFZhbGlkYXRlSW5wdXQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHUGFuZWxWYWxpZGF0ZUlucHV0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHUGFuZWxWYWxpZGF0ZUlucHV0KHMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9rKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBvayk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dQYW5lbFZhbGlkYXRlSW5wdXQocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2spOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIG9rKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1BhbmVsR2V0RElUTEZvclNpemUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU2VxR3JhYkNvbXBvbmVudCBzOwotCUhhbmRsZSBkaXRsOwotCVBvaW50IHJlcXVlc3RlZFNpemU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOworICAgIEhhbmRsZSBkaXRsOworICAgIFBvaW50IHJlcXVlc3RlZFNpemU7CiAjaWZuZGVmIFNHUGFuZWxHZXRESVRMRm9yU2l6ZQotCVB5TWFjX1BSRUNIRUNLKFNHUGFuZWxHZXRESVRMRm9yU2l6ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dQYW5lbEdldERJVExGb3JTaXplKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHUGFuZWxHZXRESVRMRm9yU2l6ZShzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGl0bCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlcXVlc3RlZFNpemUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGRpdGwsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRQb2ludCwgcmVxdWVzdGVkU2l6ZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dQYW5lbEdldERJVExGb3JTaXplKHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkaXRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVxdWVzdGVkU2l6ZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgZGl0bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFBvaW50LCByZXF1ZXN0ZWRTaXplKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0dldFNyY1ZpZGVvQm91bmRzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNHQ2hhbm5lbCBjOwotCVJlY3QgcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBSZWN0IHI7CiAjaWZuZGVmIFNHR2V0U3JjVmlkZW9Cb3VuZHMKLQlQeU1hY19QUkVDSEVDSyhTR0dldFNyY1ZpZGVvQm91bmRzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0dldFNyY1ZpZGVvQm91bmRzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHR2V0U3JjVmlkZW9Cb3VuZHMoYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmcik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dHZXRTcmNWaWRlb0JvdW5kcyhjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZyKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1NldFZpZGVvUmVjdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlSZWN0IHI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CisgICAgUmVjdCByOwogI2lmbmRlZiBTR1NldFZpZGVvUmVjdAotCVB5TWFjX1BSRUNIRUNLKFNHU2V0VmlkZW9SZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR1NldFZpZGVvUmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR1NldFZpZGVvUmVjdChjLAotCSAgICAgICAgICAgICAgICAgICAgICZyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1NldFZpZGVvUmVjdChjLAorICAgICAgICAgICAgICAgICAgICAgICAgICZyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0dldFZpZGVvUmVjdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlSZWN0IHI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CisgICAgUmVjdCByOwogI2lmbmRlZiBTR0dldFZpZGVvUmVjdAotCVB5TWFjX1BSRUNIRUNLKFNHR2V0VmlkZW9SZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0dldFZpZGVvUmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0dldFZpZGVvUmVjdChjLAotCSAgICAgICAgICAgICAgICAgICAgICZyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmcik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dHZXRWaWRlb1JlY3QoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAmcik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJnIpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHR2V0VmlkZW9Db21wcmVzc29yVHlwZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlPU1R5cGUgY29tcHJlc3NvclR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CisgICAgT1NUeXBlIGNvbXByZXNzb3JUeXBlOwogI2lmbmRlZiBTR0dldFZpZGVvQ29tcHJlc3NvclR5cGUKLQlQeU1hY19QUkVDSEVDSyhTR0dldFZpZGVvQ29tcHJlc3NvclR5cGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHR2V0VmlkZW9Db21wcmVzc29yVHlwZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0dldFZpZGVvQ29tcHJlc3NvclR5cGUoYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbXByZXNzb3JUeXBlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIGNvbXByZXNzb3JUeXBlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0dldFZpZGVvQ29tcHJlc3NvclR5cGUoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbXByZXNzb3JUeXBlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIGNvbXByZXNzb3JUeXBlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1NldFZpZGVvQ29tcHJlc3NvclR5cGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU0dDaGFubmVsIGM7Ci0JT1NUeXBlIGNvbXByZXNzb3JUeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOworICAgIE9TVHlwZSBjb21wcmVzc29yVHlwZTsKICNpZm5kZWYgU0dTZXRWaWRlb0NvbXByZXNzb3JUeXBlCi0JUHlNYWNfUFJFQ0hFQ0soU0dTZXRWaWRlb0NvbXByZXNzb3JUeXBlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR1NldFZpZGVvQ29tcHJlc3NvclR5cGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNvbXByZXNzb3JUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dTZXRWaWRlb0NvbXByZXNzb3JUeXBlKGMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzb3JUeXBlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY29tcHJlc3NvclR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1NldFZpZGVvQ29tcHJlc3NvclR5cGUoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcHJlc3NvclR5cGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHU2V0VmlkZW9Db21wcmVzc29yKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNHQ2hhbm5lbCBjOwotCXNob3J0IGRlcHRoOwotCUNvbXByZXNzb3JDb21wb25lbnQgY29tcHJlc3NvcjsKLQlDb2RlY1Egc3BhdGlhbFF1YWxpdHk7Ci0JQ29kZWNRIHRlbXBvcmFsUXVhbGl0eTsKLQlsb25nIGtleUZyYW1lUmF0ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBzaG9ydCBkZXB0aDsKKyAgICBDb21wcmVzc29yQ29tcG9uZW50IGNvbXByZXNzb3I7CisgICAgQ29kZWNRIHNwYXRpYWxRdWFsaXR5OworICAgIENvZGVjUSB0ZW1wb3JhbFF1YWxpdHk7CisgICAgbG9uZyBrZXlGcmFtZVJhdGU7CiAjaWZuZGVmIFNHU2V0VmlkZW9Db21wcmVzc29yCi0JUHlNYWNfUFJFQ0hFQ0soU0dTZXRWaWRlb0NvbXByZXNzb3IpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHU2V0VmlkZW9Db21wcmVzc29yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maE8mbGxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKLQkgICAgICAgICAgICAgICAgICAgICAgJmRlcHRoLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBPYmpfQ29udmVydCwgJmNvbXByZXNzb3IsCi0JICAgICAgICAgICAgICAgICAgICAgICZzcGF0aWFsUXVhbGl0eSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRlbXBvcmFsUXVhbGl0eSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmtleUZyYW1lUmF0ZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHU2V0VmlkZW9Db21wcmVzc29yKGMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcHJlc3NvciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGF0aWFsUXVhbGl0eSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wb3JhbFF1YWxpdHksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5RnJhbWVSYXRlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhPJmxsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wT2JqX0NvbnZlcnQsICZjb21wcmVzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3BhdGlhbFF1YWxpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZW1wb3JhbFF1YWxpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXlGcmFtZVJhdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1NldFZpZGVvQ29tcHJlc3NvcihjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhdGlhbFF1YWxpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcG9yYWxRdWFsaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleUZyYW1lUmF0ZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dHZXRWaWRlb0NvbXByZXNzb3IoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU0dDaGFubmVsIGM7Ci0Jc2hvcnQgZGVwdGg7Ci0JQ29tcHJlc3NvckNvbXBvbmVudCBjb21wcmVzc29yOwotCUNvZGVjUSBzcGF0aWFsUXVhbGl0eTsKLQlDb2RlY1EgdGVtcG9yYWxRdWFsaXR5OwotCWxvbmcga2V5RnJhbWVSYXRlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOworICAgIHNob3J0IGRlcHRoOworICAgIENvbXByZXNzb3JDb21wb25lbnQgY29tcHJlc3NvcjsKKyAgICBDb2RlY1Egc3BhdGlhbFF1YWxpdHk7CisgICAgQ29kZWNRIHRlbXBvcmFsUXVhbGl0eTsKKyAgICBsb25nIGtleUZyYW1lUmF0ZTsKICNpZm5kZWYgU0dHZXRWaWRlb0NvbXByZXNzb3IKLQlQeU1hY19QUkVDSEVDSyhTR0dldFZpZGVvQ29tcHJlc3Nvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dHZXRWaWRlb0NvbXByZXNzb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dHZXRWaWRlb0NvbXByZXNzb3IoYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVwdGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbXByZXNzb3IsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNwYXRpYWxRdWFsaXR5LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZW1wb3JhbFF1YWxpdHksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtleUZyYW1lUmF0ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxoTyZsbGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBkZXB0aCwKLQkgICAgICAgICAgICAgICAgICAgICBDbXBPYmpfTmV3LCBjb21wcmVzc29yLAotCSAgICAgICAgICAgICAgICAgICAgIHNwYXRpYWxRdWFsaXR5LAotCSAgICAgICAgICAgICAgICAgICAgIHRlbXBvcmFsUXVhbGl0eSwKLQkgICAgICAgICAgICAgICAgICAgICBrZXlGcmFtZVJhdGUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHR2V0VmlkZW9Db21wcmVzc29yKGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb21wcmVzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzcGF0aWFsUXVhbGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGVtcG9yYWxRdWFsaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXlGcmFtZVJhdGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsaE8mbGxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ21wT2JqX05ldywgY29tcHJlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcGF0aWFsUXVhbGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wb3JhbFF1YWxpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAga2V5RnJhbWVSYXRlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0dldFZpZGVvRGlnaXRpemVyQ29tcG9uZW50KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRJbnN0YW5jZSBfcnY7Ci0JU0dDaGFubmVsIGM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudEluc3RhbmNlIF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKICNpZm5kZWYgU0dHZXRWaWRlb0RpZ2l0aXplckNvbXBvbmVudAotCVB5TWFjX1BSRUNIRUNLKFNHR2V0VmlkZW9EaWdpdGl6ZXJDb21wb25lbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHR2V0VmlkZW9EaWdpdGl6ZXJDb21wb25lbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dHZXRWaWRlb0RpZ2l0aXplckNvbXBvbmVudChjKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHR2V0VmlkZW9EaWdpdGl6ZXJDb21wb25lbnQoYyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1NldFZpZGVvRGlnaXRpemVyQ29tcG9uZW50KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNHQ2hhbm5lbCBjOwotCUNvbXBvbmVudEluc3RhbmNlIHZkaWc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CisgICAgQ29tcG9uZW50SW5zdGFuY2UgdmRpZzsKICNpZm5kZWYgU0dTZXRWaWRlb0RpZ2l0aXplckNvbXBvbmVudAotCVB5TWFjX1BSRUNIRUNLKFNHU2V0VmlkZW9EaWdpdGl6ZXJDb21wb25lbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHU2V0VmlkZW9EaWdpdGl6ZXJDb21wb25lbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnZkaWcpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR1NldFZpZGVvRGlnaXRpemVyQ29tcG9uZW50KGMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZGlnKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdmRpZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHU2V0VmlkZW9EaWdpdGl6ZXJDb21wb25lbnQoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZkaWcpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHVmlkZW9EaWdpdGl6ZXJDaGFuZ2VkKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNHQ2hhbm5lbCBjOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOwogI2lmbmRlZiBTR1ZpZGVvRGlnaXRpemVyQ2hhbmdlZAotCVB5TWFjX1BSRUNIRUNLKFNHVmlkZW9EaWdpdGl6ZXJDaGFuZ2VkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR1ZpZGVvRGlnaXRpemVyQ2hhbmdlZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR1ZpZGVvRGlnaXRpemVyQ2hhbmdlZChjKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1ZpZGVvRGlnaXRpemVyQ2hhbmdlZChjKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0dyYWJGcmFtZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlzaG9ydCBidWZmZXJOdW07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CisgICAgc2hvcnQgYnVmZmVyTnVtOwogI2lmbmRlZiBTR0dyYWJGcmFtZQotCVB5TWFjX1BSRUNIRUNLKFNHR3JhYkZyYW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0dyYWJGcmFtZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAotCSAgICAgICAgICAgICAgICAgICAgICAmYnVmZmVyTnVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dHcmFiRnJhbWUoYywKLQkgICAgICAgICAgICAgICAgICBidWZmZXJOdW0pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZidWZmZXJOdW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0dyYWJGcmFtZShjLAorICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlck51bSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dHcmFiRnJhbWVDb21wbGV0ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlzaG9ydCBidWZmZXJOdW07Ci0JQm9vbGVhbiBkb25lOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOworICAgIHNob3J0IGJ1ZmZlck51bTsKKyAgICBCb29sZWFuIGRvbmU7CiAjaWZuZGVmIFNHR3JhYkZyYW1lQ29tcGxldGUKLQlQeU1hY19QUkVDSEVDSyhTR0dyYWJGcmFtZUNvbXBsZXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0dyYWJGcmFtZUNvbXBsZXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgICZidWZmZXJOdW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0dyYWJGcmFtZUNvbXBsZXRlKGMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmZG9uZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgZG9uZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ1ZmZlck51bSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHR3JhYkZyYW1lQ29tcGxldGUoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlck51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkb25lKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkb25lKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0NvbXByZXNzRnJhbWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU0dDaGFubmVsIGM7Ci0Jc2hvcnQgYnVmZmVyTnVtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOworICAgIHNob3J0IGJ1ZmZlck51bTsKICNpZm5kZWYgU0dDb21wcmVzc0ZyYW1lCi0JUHlNYWNfUFJFQ0hFQ0soU0dDb21wcmVzc0ZyYW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0NvbXByZXNzRnJhbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKLQkgICAgICAgICAgICAgICAgICAgICAgJmJ1ZmZlck51bSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHQ29tcHJlc3NGcmFtZShjLAotCSAgICAgICAgICAgICAgICAgICAgICBidWZmZXJOdW0pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZidWZmZXJOdW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0NvbXByZXNzRnJhbWUoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyTnVtKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1NldENvbXByZXNzQnVmZmVyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNHQ2hhbm5lbCBjOwotCXNob3J0IGRlcHRoOwotCVJlY3QgY29tcHJlc3NTaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOworICAgIHNob3J0IGRlcHRoOworICAgIFJlY3QgY29tcHJlc3NTaXplOwogI2lmbmRlZiBTR1NldENvbXByZXNzQnVmZmVyCi0JUHlNYWNfUFJFQ0hFQ0soU0dTZXRDb21wcmVzc0J1ZmZlcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dTZXRDb21wcmVzc0J1ZmZlcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgICZkZXB0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmNvbXByZXNzU2l6ZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHU2V0Q29tcHJlc3NCdWZmZXIoYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbXByZXNzU2l6ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZjb21wcmVzc1NpemUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1NldENvbXByZXNzQnVmZmVyKGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb21wcmVzc1NpemUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHR2V0Q29tcHJlc3NCdWZmZXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU0dDaGFubmVsIGM7Ci0Jc2hvcnQgZGVwdGg7Ci0JUmVjdCBjb21wcmVzc1NpemU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CisgICAgc2hvcnQgZGVwdGg7CisgICAgUmVjdCBjb21wcmVzc1NpemU7CiAjaWZuZGVmIFNHR2V0Q29tcHJlc3NCdWZmZXIKLQlQeU1hY19QUkVDSEVDSyhTR0dldENvbXByZXNzQnVmZmVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0dldENvbXByZXNzQnVmZmVyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHR2V0Q29tcHJlc3NCdWZmZXIoYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXB0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZjb21wcmVzc1NpemUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsaE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgZGVwdGgsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmY29tcHJlc3NTaXplKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0dldENvbXByZXNzQnVmZmVyKGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29tcHJlc3NTaXplKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGhPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmNvbXByZXNzU2l6ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dHZXRCdWZmZXJJbmZvKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNHQ2hhbm5lbCBjOwotCXNob3J0IGJ1ZmZlck51bTsKLQlQaXhNYXBIYW5kbGUgYnVmZmVyUE07Ci0JUmVjdCBidWZmZXJSZWN0OwotCUdXb3JsZFB0ciBjb21wcmVzc0J1ZmZlcjsKLQlSZWN0IGNvbXByZXNzQnVmZmVyUmVjdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBzaG9ydCBidWZmZXJOdW07CisgICAgUGl4TWFwSGFuZGxlIGJ1ZmZlclBNOworICAgIFJlY3QgYnVmZmVyUmVjdDsKKyAgICBHV29ybGRQdHIgY29tcHJlc3NCdWZmZXI7CisgICAgUmVjdCBjb21wcmVzc0J1ZmZlclJlY3Q7CiAjaWZuZGVmIFNHR2V0QnVmZmVySW5mbwotCVB5TWFjX1BSRUNIRUNLKFNHR2V0QnVmZmVySW5mbyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dHZXRCdWZmZXJJbmZvKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgICZidWZmZXJOdW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0dldEJ1ZmZlckluZm8oYywKLQkgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmYnVmZmVyUE0sCi0JICAgICAgICAgICAgICAgICAgICAgICZidWZmZXJSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmY29tcHJlc3NCdWZmZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICZjb21wcmVzc0J1ZmZlclJlY3QpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBidWZmZXJQTSwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZidWZmZXJSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgIEdXb3JsZE9ial9OZXcsIGNvbXByZXNzQnVmZmVyLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmNvbXByZXNzQnVmZmVyUmVjdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ1ZmZlck51bSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHR2V0QnVmZmVySW5mbyhjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZidWZmZXJQTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ1ZmZlclJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjb21wcmVzc0J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbXByZXNzQnVmZmVyUmVjdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGJ1ZmZlclBNLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmJ1ZmZlclJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgR1dvcmxkT2JqX05ldywgY29tcHJlc3NCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmY29tcHJlc3NCdWZmZXJSZWN0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1NldFVzZVNjcmVlbkJ1ZmZlcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlCb29sZWFuIHVzZVNjcmVlbkJ1ZmZlcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBCb29sZWFuIHVzZVNjcmVlbkJ1ZmZlcjsKICNpZm5kZWYgU0dTZXRVc2VTY3JlZW5CdWZmZXIKLQlQeU1hY19QUkVDSEVDSyhTR1NldFVzZVNjcmVlbkJ1ZmZlcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dTZXRVc2VTY3JlZW5CdWZmZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKLQkgICAgICAgICAgICAgICAgICAgICAgJnVzZVNjcmVlbkJ1ZmZlcikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHU2V0VXNlU2NyZWVuQnVmZmVyKGMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlU2NyZWVuQnVmZmVyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdXNlU2NyZWVuQnVmZmVyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dTZXRVc2VTY3JlZW5CdWZmZXIoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VTY3JlZW5CdWZmZXIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHR2V0VXNlU2NyZWVuQnVmZmVyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNHQ2hhbm5lbCBjOwotCUJvb2xlYW4gdXNlU2NyZWVuQnVmZmVyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOworICAgIEJvb2xlYW4gdXNlU2NyZWVuQnVmZmVyOwogI2lmbmRlZiBTR0dldFVzZVNjcmVlbkJ1ZmZlcgotCVB5TWFjX1BSRUNIRUNLKFNHR2V0VXNlU2NyZWVuQnVmZmVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0dldFVzZVNjcmVlbkJ1ZmZlcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0dldFVzZVNjcmVlbkJ1ZmZlcihjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1c2VTY3JlZW5CdWZmZXIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHVzZVNjcmVlbkJ1ZmZlcik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dHZXRVc2VTY3JlZW5CdWZmZXIoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdXNlU2NyZWVuQnVmZmVyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1c2VTY3JlZW5CdWZmZXIpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHU2V0RnJhbWVSYXRlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNHQ2hhbm5lbCBjOwotCUZpeGVkIGZyYW1lUmF0ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBGaXhlZCBmcmFtZVJhdGU7CiAjaWZuZGVmIFNHU2V0RnJhbWVSYXRlCi0JUHlNYWNfUFJFQ0hFQ0soU0dTZXRGcmFtZVJhdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHU2V0RnJhbWVSYXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJmZyYW1lUmF0ZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHU2V0RnJhbWVSYXRlKGMsCi0JICAgICAgICAgICAgICAgICAgICAgZnJhbWVSYXRlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZmcmFtZVJhdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1NldEZyYW1lUmF0ZShjLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lUmF0ZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dHZXRGcmFtZVJhdGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU0dDaGFubmVsIGM7Ci0JRml4ZWQgZnJhbWVSYXRlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOworICAgIEZpeGVkIGZyYW1lUmF0ZTsKICNpZm5kZWYgU0dHZXRGcmFtZVJhdGUKLQlQeU1hY19QUkVDSEVDSyhTR0dldEZyYW1lUmF0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dHZXRGcmFtZVJhdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dHZXRGcmFtZVJhdGUoYywKLQkgICAgICAgICAgICAgICAgICAgICAmZnJhbWVSYXRlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGaXhlZCwgZnJhbWVSYXRlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0dldEZyYW1lUmF0ZShjLAorICAgICAgICAgICAgICAgICAgICAgICAgICZmcmFtZVJhdGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBmcmFtZVJhdGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHU2V0UHJlZmVycmVkUGFja2V0U2l6ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlsb25nIHByZWZlcnJlZFBhY2tldFNpemVJbkJ5dGVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOworICAgIGxvbmcgcHJlZmVycmVkUGFja2V0U2l6ZUluQnl0ZXM7CiAjaWZuZGVmIFNHU2V0UHJlZmVycmVkUGFja2V0U2l6ZQotCVB5TWFjX1BSRUNIRUNLKFNHU2V0UHJlZmVycmVkUGFja2V0U2l6ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dTZXRQcmVmZXJyZWRQYWNrZXRTaXplKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgICZwcmVmZXJyZWRQYWNrZXRTaXplSW5CeXRlcykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHU2V0UHJlZmVycmVkUGFja2V0U2l6ZShjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmZXJyZWRQYWNrZXRTaXplSW5CeXRlcyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnByZWZlcnJlZFBhY2tldFNpemVJbkJ5dGVzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dTZXRQcmVmZXJyZWRQYWNrZXRTaXplKGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZlcnJlZFBhY2tldFNpemVJbkJ5dGVzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0dldFByZWZlcnJlZFBhY2tldFNpemUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU0dDaGFubmVsIGM7Ci0JbG9uZyBwcmVmZXJyZWRQYWNrZXRTaXplSW5CeXRlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBsb25nIHByZWZlcnJlZFBhY2tldFNpemVJbkJ5dGVzOwogI2lmbmRlZiBTR0dldFByZWZlcnJlZFBhY2tldFNpemUKLQlQeU1hY19QUkVDSEVDSyhTR0dldFByZWZlcnJlZFBhY2tldFNpemUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHR2V0UHJlZmVycmVkUGFja2V0U2l6ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0dldFByZWZlcnJlZFBhY2tldFNpemUoYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnByZWZlcnJlZFBhY2tldFNpemVJbkJ5dGVzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBwcmVmZXJyZWRQYWNrZXRTaXplSW5CeXRlcyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dHZXRQcmVmZXJyZWRQYWNrZXRTaXplKGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcmVmZXJyZWRQYWNrZXRTaXplSW5CeXRlcyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZmVycmVkUGFja2V0U2l6ZUluQnl0ZXMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHU2V0VXNlclZpZGVvQ29tcHJlc3Nvckxpc3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU0dDaGFubmVsIGM7Ci0JSGFuZGxlIGNvbXByZXNzb3JUeXBlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBIYW5kbGUgY29tcHJlc3NvclR5cGVzOwogI2lmbmRlZiBTR1NldFVzZXJWaWRlb0NvbXByZXNzb3JMaXN0Ci0JUHlNYWNfUFJFQ0hFQ0soU0dTZXRVc2VyVmlkZW9Db21wcmVzc29yTGlzdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dTZXRVc2VyVmlkZW9Db21wcmVzc29yTGlzdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZjb21wcmVzc29yVHlwZXMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR1NldFVzZXJWaWRlb0NvbXByZXNzb3JMaXN0KGMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc29yVHlwZXMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmNvbXByZXNzb3JUeXBlcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHU2V0VXNlclZpZGVvQ29tcHJlc3Nvckxpc3QoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzb3JUeXBlcyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dHZXRVc2VyVmlkZW9Db21wcmVzc29yTGlzdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlIYW5kbGUgY29tcHJlc3NvclR5cGVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOworICAgIEhhbmRsZSBjb21wcmVzc29yVHlwZXM7CiAjaWZuZGVmIFNHR2V0VXNlclZpZGVvQ29tcHJlc3Nvckxpc3QKLQlQeU1hY19QUkVDSEVDSyhTR0dldFVzZXJWaWRlb0NvbXByZXNzb3JMaXN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0dldFVzZXJWaWRlb0NvbXByZXNzb3JMaXN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHR2V0VXNlclZpZGVvQ29tcHJlc3Nvckxpc3QoYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb21wcmVzc29yVHlwZXMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBjb21wcmVzc29yVHlwZXMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHR2V0VXNlclZpZGVvQ29tcHJlc3Nvckxpc3QoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb21wcmVzc29yVHlwZXMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBjb21wcmVzc29yVHlwZXMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHU2V0U291bmRJbnB1dERyaXZlcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlTdHIyNTUgZHJpdmVyTmFtZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBTdHIyNTUgZHJpdmVyTmFtZTsKICNpZm5kZWYgU0dTZXRTb3VuZElucHV0RHJpdmVyCi0JUHlNYWNfUFJFQ0hFQ0soU0dTZXRTb3VuZElucHV0RHJpdmVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR1NldFNvdW5kSW5wdXREcml2ZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgZHJpdmVyTmFtZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHU2V0U291bmRJbnB1dERyaXZlcihjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcml2ZXJOYW1lKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBkcml2ZXJOYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dTZXRTb3VuZElucHV0RHJpdmVyKGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyaXZlck5hbWUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHR2V0U291bmRJbnB1dERyaXZlcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBfcnY7Ci0JU0dDaGFubmVsIGM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgX3J2OworICAgIFNHQ2hhbm5lbCBjOwogI2lmbmRlZiBTR0dldFNvdW5kSW5wdXREcml2ZXIKLQlQeU1hY19QUkVDSEVDSyhTR0dldFNvdW5kSW5wdXREcml2ZXIpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHR2V0U291bmRJbnB1dERyaXZlcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0dldFNvdW5kSW5wdXREcml2ZXIoYyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dHZXRTb3VuZElucHV0RHJpdmVyKGMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHU291bmRJbnB1dERyaXZlckNoYW5nZWQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU0dDaGFubmVsIGM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CiAjaWZuZGVmIFNHU291bmRJbnB1dERyaXZlckNoYW5nZWQKLQlQeU1hY19QUkVDSEVDSyhTR1NvdW5kSW5wdXREcml2ZXJDaGFuZ2VkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR1NvdW5kSW5wdXREcml2ZXJDaGFuZ2VkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHU291bmRJbnB1dERyaXZlckNoYW5nZWQoYyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dTb3VuZElucHV0RHJpdmVyQ2hhbmdlZChjKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1NldFNvdW5kUmVjb3JkQ2h1bmtTaXplKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNHQ2hhbm5lbCBjOwotCWxvbmcgc2Vjb25kczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBsb25nIHNlY29uZHM7CiAjaWZuZGVmIFNHU2V0U291bmRSZWNvcmRDaHVua1NpemUKLQlQeU1hY19QUkVDSEVDSyhTR1NldFNvdW5kUmVjb3JkQ2h1bmtTaXplKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR1NldFNvdW5kUmVjb3JkQ2h1bmtTaXplKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgICZzZWNvbmRzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dTZXRTb3VuZFJlY29yZENodW5rU2l6ZShjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kcyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlY29uZHMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1NldFNvdW5kUmVjb3JkQ2h1bmtTaXplKGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0dldFNvdW5kUmVjb3JkQ2h1bmtTaXplKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIF9ydjsKLQlTR0NoYW5uZWwgYzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgbG9uZyBfcnY7CisgICAgU0dDaGFubmVsIGM7CiAjaWZuZGVmIFNHR2V0U291bmRSZWNvcmRDaHVua1NpemUKLQlQeU1hY19QUkVDSEVDSyhTR0dldFNvdW5kUmVjb3JkQ2h1bmtTaXplKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0dldFNvdW5kUmVjb3JkQ2h1bmtTaXplKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHR2V0U291bmRSZWNvcmRDaHVua1NpemUoYyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dHZXRTb3VuZFJlY29yZENodW5rU2l6ZShjKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1NldFNvdW5kSW5wdXRSYXRlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNHQ2hhbm5lbCBjOwotCUZpeGVkIHJhdGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CisgICAgRml4ZWQgcmF0ZTsKICNpZm5kZWYgU0dTZXRTb3VuZElucHV0UmF0ZQotCVB5TWFjX1BSRUNIRUNLKFNHU2V0U291bmRJbnB1dFJhdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHU2V0U291bmRJbnB1dFJhdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmcmF0ZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHU2V0U291bmRJbnB1dFJhdGUoYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJnJhdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1NldFNvdW5kSW5wdXRSYXRlKGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0dldFNvdW5kSW5wdXRSYXRlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlGaXhlZCBfcnY7Ci0JU0dDaGFubmVsIGM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEZpeGVkIF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKICNpZm5kZWYgU0dHZXRTb3VuZElucHV0UmF0ZQotCVB5TWFjX1BSRUNIRUNLKFNHR2V0U291bmRJbnB1dFJhdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHR2V0U291bmRJbnB1dFJhdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dHZXRTb3VuZElucHV0UmF0ZShjKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRml4ZWQsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dHZXRTb3VuZElucHV0UmF0ZShjKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRml4ZWQsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dTZXRTb3VuZElucHV0UGFyYW1ldGVycyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlzaG9ydCBzYW1wbGVTaXplOwotCXNob3J0IG51bUNoYW5uZWxzOwotCU9TVHlwZSBjb21wcmVzc2lvblR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CisgICAgc2hvcnQgc2FtcGxlU2l6ZTsKKyAgICBzaG9ydCBudW1DaGFubmVsczsKKyAgICBPU1R5cGUgY29tcHJlc3Npb25UeXBlOwogI2lmbmRlZiBTR1NldFNvdW5kSW5wdXRQYXJhbWV0ZXJzCi0JUHlNYWNfUFJFQ0hFQ0soU0dTZXRTb3VuZElucHV0UGFyYW1ldGVycyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dTZXRTb3VuZElucHV0UGFyYW1ldGVycyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlU2l6ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJm51bUNoYW5uZWxzLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjb21wcmVzc2lvblR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR1NldFNvdW5kSW5wdXRQYXJhbWV0ZXJzKGMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVTaXplLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtQ2hhbm5lbHMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc2lvblR5cGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGhPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGVTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbnVtQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNvbXByZXNzaW9uVHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHU2V0U291bmRJbnB1dFBhcmFtZXRlcnMoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1DaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzaW9uVHlwZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dHZXRTb3VuZElucHV0UGFyYW1ldGVycyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlzaG9ydCBzYW1wbGVTaXplOwotCXNob3J0IG51bUNoYW5uZWxzOwotCU9TVHlwZSBjb21wcmVzc2lvblR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CisgICAgc2hvcnQgc2FtcGxlU2l6ZTsKKyAgICBzaG9ydCBudW1DaGFubmVsczsKKyAgICBPU1R5cGUgY29tcHJlc3Npb25UeXBlOwogI2lmbmRlZiBTR0dldFNvdW5kSW5wdXRQYXJhbWV0ZXJzCi0JUHlNYWNfUFJFQ0hFQ0soU0dHZXRTb3VuZElucHV0UGFyYW1ldGVycyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dHZXRTb3VuZElucHV0UGFyYW1ldGVycyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0dldFNvdW5kSW5wdXRQYXJhbWV0ZXJzKGMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlU2l6ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZudW1DaGFubmVscywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb21wcmVzc2lvblR5cGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsaGhPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVNpemUsCi0JICAgICAgICAgICAgICAgICAgICAgbnVtQ2hhbm5lbHMsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIGNvbXByZXNzaW9uVHlwZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dHZXRTb3VuZElucHV0UGFyYW1ldGVycyhjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbnVtQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29tcHJlc3Npb25UeXBlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGhoTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIG51bUNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBjb21wcmVzc2lvblR5cGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHU2V0QWRkaXRpb25hbFNvdW5kUmF0ZXMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU0dDaGFubmVsIGM7Ci0JSGFuZGxlIHJhdGVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOworICAgIEhhbmRsZSByYXRlczsKICNpZm5kZWYgU0dTZXRBZGRpdGlvbmFsU291bmRSYXRlcwotCVB5TWFjX1BSRUNIRUNLKFNHU2V0QWRkaXRpb25hbFNvdW5kUmF0ZXMpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHU2V0QWRkaXRpb25hbFNvdW5kUmF0ZXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmF0ZXMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR1NldEFkZGl0aW9uYWxTb3VuZFJhdGVzKGMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRlcyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmF0ZXMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1NldEFkZGl0aW9uYWxTb3VuZFJhdGVzKGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRlcyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dHZXRBZGRpdGlvbmFsU291bmRSYXRlcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlIYW5kbGUgcmF0ZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CisgICAgSGFuZGxlIHJhdGVzOwogI2lmbmRlZiBTR0dldEFkZGl0aW9uYWxTb3VuZFJhdGVzCi0JUHlNYWNfUFJFQ0hFQ0soU0dHZXRBZGRpdGlvbmFsU291bmRSYXRlcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dHZXRBZGRpdGlvbmFsU291bmRSYXRlcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0dldEFkZGl0aW9uYWxTb3VuZFJhdGVzKGMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmF0ZXMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCByYXRlcyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dHZXRBZGRpdGlvbmFsU291bmRSYXRlcyhjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJhdGVzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgcmF0ZXMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHU2V0Rm9udE5hbWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU0dDaGFubmVsIGM7Ci0JU3RyaW5nUHRyIHBzdHI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CisgICAgU3RyaW5nUHRyIHBzdHI7CiAjaWZuZGVmIFNHU2V0Rm9udE5hbWUKLQlQeU1hY19QUkVDSEVDSyhTR1NldEZvbnROYW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR1NldEZvbnROYW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgICZwc3RyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dTZXRGb250TmFtZShjLAotCSAgICAgICAgICAgICAgICAgICAgcHN0cik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBzdHIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1NldEZvbnROYW1lKGMsCisgICAgICAgICAgICAgICAgICAgICAgICBwc3RyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1NldEZvbnRTaXplKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNHQ2hhbm5lbCBjOwotCXNob3J0IGZvbnRTaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOworICAgIHNob3J0IGZvbnRTaXplOwogI2lmbmRlZiBTR1NldEZvbnRTaXplCi0JUHlNYWNfUFJFQ0hFQ0soU0dTZXRGb250U2l6ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dTZXRGb250U2l6ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAotCSAgICAgICAgICAgICAgICAgICAgICAmZm9udFNpemUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR1NldEZvbnRTaXplKGMsCi0JICAgICAgICAgICAgICAgICAgICBmb250U2l6ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZvbnRTaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dTZXRGb250U2l6ZShjLAorICAgICAgICAgICAgICAgICAgICAgICAgZm9udFNpemUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHU2V0VGV4dEZvcmVDb2xvcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlSR0JDb2xvciB0aGVDb2xvcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBSR0JDb2xvciB0aGVDb2xvcjsKICNpZm5kZWYgU0dTZXRUZXh0Rm9yZUNvbG9yCi0JUHlNYWNfUFJFQ0hFQ0soU0dTZXRUZXh0Rm9yZUNvbG9yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR1NldFRleHRGb3JlQ29sb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dTZXRUZXh0Rm9yZUNvbG9yKGMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVDb2xvcik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFFkUkdCX05ldywgJnRoZUNvbG9yKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1NldFRleHRGb3JlQ29sb3IoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUNvbG9yKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUWRSR0JfTmV3LCAmdGhlQ29sb3IpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHU2V0VGV4dEJhY2tDb2xvcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlSR0JDb2xvciB0aGVDb2xvcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBSR0JDb2xvciB0aGVDb2xvcjsKICNpZm5kZWYgU0dTZXRUZXh0QmFja0NvbG9yCi0JUHlNYWNfUFJFQ0hFQ0soU0dTZXRUZXh0QmFja0NvbG9yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR1NldFRleHRCYWNrQ29sb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dTZXRUZXh0QmFja0NvbG9yKGMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVDb2xvcik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFFkUkdCX05ldywgJnRoZUNvbG9yKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1NldFRleHRCYWNrQ29sb3IoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUNvbG9yKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUWRSR0JfTmV3LCAmdGhlQ29sb3IpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHU2V0SnVzdGlmaWNhdGlvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlzaG9ydCBqdXN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOworICAgIHNob3J0IGp1c3Q7CiAjaWZuZGVmIFNHU2V0SnVzdGlmaWNhdGlvbgotCVB5TWFjX1BSRUNIRUNLKFNHU2V0SnVzdGlmaWNhdGlvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dTZXRKdXN0aWZpY2F0aW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgICZqdXN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dTZXRKdXN0aWZpY2F0aW9uKGMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGp1c3QpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZqdXN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dTZXRKdXN0aWZpY2F0aW9uKGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGp1c3QpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHR2V0VGV4dFJldHVyblRvU3BhY2VWYWx1ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlzaG9ydCByZXR0b3NwYWNlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOworICAgIHNob3J0IHJldHRvc3BhY2U7CiAjaWZuZGVmIFNHR2V0VGV4dFJldHVyblRvU3BhY2VWYWx1ZQotCVB5TWFjX1BSRUNIRUNLKFNHR2V0VGV4dFJldHVyblRvU3BhY2VWYWx1ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dHZXRUZXh0UmV0dXJuVG9TcGFjZVZhbHVlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHR2V0VGV4dFJldHVyblRvU3BhY2VWYWx1ZShjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmV0dG9zcGFjZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgcmV0dG9zcGFjZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dHZXRUZXh0UmV0dXJuVG9TcGFjZVZhbHVlKGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXR0b3NwYWNlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZXR0b3NwYWNlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1NldFRleHRSZXR1cm5Ub1NwYWNlVmFsdWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU0dDaGFubmVsIGM7Ci0Jc2hvcnQgcmV0dG9zcGFjZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBzaG9ydCByZXR0b3NwYWNlOwogI2lmbmRlZiBTR1NldFRleHRSZXR1cm5Ub1NwYWNlVmFsdWUKLQlQeU1hY19QUkVDSEVDSyhTR1NldFRleHRSZXR1cm5Ub1NwYWNlVmFsdWUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHU2V0VGV4dFJldHVyblRvU3BhY2VWYWx1ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmV0dG9zcGFjZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHU2V0VGV4dFJldHVyblRvU3BhY2VWYWx1ZShjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR0b3NwYWNlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmV0dG9zcGFjZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHU2V0VGV4dFJldHVyblRvU3BhY2VWYWx1ZShjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR0b3NwYWNlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9RVFZpZGVvT3V0cHV0R2V0Q3VycmVudENsaWVudE5hbWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JUVRWaWRlb091dHB1dENvbXBvbmVudCB2bzsKLQlTdHIyNTUgc3RyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFFUVmlkZW9PdXRwdXRDb21wb25lbnQgdm87CisgICAgU3RyMjU1IHN0cjsKICNpZm5kZWYgUVRWaWRlb091dHB1dEdldEN1cnJlbnRDbGllbnROYW1lCi0JUHlNYWNfUFJFQ0hFQ0soUVRWaWRlb091dHB1dEdldEN1cnJlbnRDbGllbnROYW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhRVFZpZGVvT3V0cHV0R2V0Q3VycmVudENsaWVudE5hbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnZvLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIHN0cikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFFUVmlkZW9PdXRwdXRHZXRDdXJyZW50Q2xpZW50TmFtZSh2bywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgc3RyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gUVRWaWRlb091dHB1dEdldEN1cnJlbnRDbGllbnROYW1lKHZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1FUVmlkZW9PdXRwdXRTZXRDbGllbnROYW1lKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVFUVmlkZW9PdXRwdXRDb21wb25lbnQgdm87Ci0JU3RyMjU1IHN0cjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBRVFZpZGVvT3V0cHV0Q29tcG9uZW50IHZvOworICAgIFN0cjI1NSBzdHI7CiAjaWZuZGVmIFFUVmlkZW9PdXRwdXRTZXRDbGllbnROYW1lCi0JUHlNYWNfUFJFQ0hFQ0soUVRWaWRlb091dHB1dFNldENsaWVudE5hbWUpOworICAgIFB5TWFjX1BSRUNIRUNLKFFUVmlkZW9PdXRwdXRTZXRDbGllbnROYW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ2bywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBzdHIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBRVFZpZGVvT3V0cHV0U2V0Q2xpZW50TmFtZSh2bywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ2bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBzdHIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBRVFZpZGVvT3V0cHV0U2V0Q2xpZW50TmFtZSh2bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1FUVmlkZW9PdXRwdXRHZXRDbGllbnROYW1lKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVFUVmlkZW9PdXRwdXRDb21wb25lbnQgdm87Ci0JU3RyMjU1IHN0cjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBRVFZpZGVvT3V0cHV0Q29tcG9uZW50IHZvOworICAgIFN0cjI1NSBzdHI7CiAjaWZuZGVmIFFUVmlkZW9PdXRwdXRHZXRDbGllbnROYW1lCi0JUHlNYWNfUFJFQ0hFQ0soUVRWaWRlb091dHB1dEdldENsaWVudE5hbWUpOworICAgIFB5TWFjX1BSRUNIRUNLKFFUVmlkZW9PdXRwdXRHZXRDbGllbnROYW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ2bywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBzdHIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBRVFZpZGVvT3V0cHV0R2V0Q2xpZW50TmFtZSh2bywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ2bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBzdHIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBRVFZpZGVvT3V0cHV0R2V0Q2xpZW50TmFtZSh2bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1FUVmlkZW9PdXRwdXRCZWdpbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlRVFZpZGVvT3V0cHV0Q29tcG9uZW50IHZvOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFFUVmlkZW9PdXRwdXRDb21wb25lbnQgdm87CiAjaWZuZGVmIFFUVmlkZW9PdXRwdXRCZWdpbgotCVB5TWFjX1BSRUNIRUNLKFFUVmlkZW9PdXRwdXRCZWdpbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soUVRWaWRlb091dHB1dEJlZ2luKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdm8pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBRVFZpZGVvT3V0cHV0QmVnaW4odm8pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdm8pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBRVFZpZGVvT3V0cHV0QmVnaW4odm8pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1FUVmlkZW9PdXRwdXRFbmQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JUVRWaWRlb091dHB1dENvbXBvbmVudCB2bzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBRVFZpZGVvT3V0cHV0Q29tcG9uZW50IHZvOwogI2lmbmRlZiBRVFZpZGVvT3V0cHV0RW5kCi0JUHlNYWNfUFJFQ0hFQ0soUVRWaWRlb091dHB1dEVuZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUVRWaWRlb091dHB1dEVuZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnZvKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gUVRWaWRlb091dHB1dEVuZCh2byk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ2bykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFFUVmlkZW9PdXRwdXRFbmQodm8pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1FUVmlkZW9PdXRwdXRTZXREaXNwbGF5TW9kZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlRVFZpZGVvT3V0cHV0Q29tcG9uZW50IHZvOwotCWxvbmcgZGlzcGxheU1vZGVJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBRVFZpZGVvT3V0cHV0Q29tcG9uZW50IHZvOworICAgIGxvbmcgZGlzcGxheU1vZGVJRDsKICNpZm5kZWYgUVRWaWRlb091dHB1dFNldERpc3BsYXlNb2RlCi0JUHlNYWNfUFJFQ0hFQ0soUVRWaWRlb091dHB1dFNldERpc3BsYXlNb2RlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhRVFZpZGVvT3V0cHV0U2V0RGlzcGxheU1vZGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdm8sCi0JICAgICAgICAgICAgICAgICAgICAgICZkaXNwbGF5TW9kZUlEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gUVRWaWRlb091dHB1dFNldERpc3BsYXlNb2RlKHZvLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5TW9kZUlEKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ2bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRpc3BsYXlNb2RlSUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBRVFZpZGVvT3V0cHV0U2V0RGlzcGxheU1vZGUodm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlNb2RlSUQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1FUVmlkZW9PdXRwdXRHZXREaXNwbGF5TW9kZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlRVFZpZGVvT3V0cHV0Q29tcG9uZW50IHZvOwotCWxvbmcgZGlzcGxheU1vZGVJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBRVFZpZGVvT3V0cHV0Q29tcG9uZW50IHZvOworICAgIGxvbmcgZGlzcGxheU1vZGVJRDsKICNpZm5kZWYgUVRWaWRlb091dHB1dEdldERpc3BsYXlNb2RlCi0JUHlNYWNfUFJFQ0hFQ0soUVRWaWRlb091dHB1dEdldERpc3BsYXlNb2RlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhRVFZpZGVvT3V0cHV0R2V0RGlzcGxheU1vZGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ2bykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFFUVmlkZW9PdXRwdXRHZXREaXNwbGF5TW9kZSh2bywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRpc3BsYXlNb2RlSUQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlNb2RlSUQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdm8pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBRVFZpZGVvT3V0cHV0R2V0RGlzcGxheU1vZGUodm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkaXNwbGF5TW9kZUlEKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5TW9kZUlEKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9RVFZpZGVvT3V0cHV0R2V0R1dvcmxkKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVFUVmlkZW9PdXRwdXRDb21wb25lbnQgdm87Ci0JR1dvcmxkUHRyIGd3OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFFUVmlkZW9PdXRwdXRDb21wb25lbnQgdm87CisgICAgR1dvcmxkUHRyIGd3OwogI2lmbmRlZiBRVFZpZGVvT3V0cHV0R2V0R1dvcmxkCi0JUHlNYWNfUFJFQ0hFQ0soUVRWaWRlb091dHB1dEdldEdXb3JsZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUVRWaWRlb091dHB1dEdldEdXb3JsZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnZvKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gUVRWaWRlb091dHB1dEdldEdXb3JsZCh2bywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZndyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIEdXb3JsZE9ial9OZXcsIGd3KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnZvKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gUVRWaWRlb091dHB1dEdldEdXb3JsZCh2bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZndyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIEdXb3JsZE9ial9OZXcsIGd3KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9RVFZpZGVvT3V0cHV0R2V0SW5kU291bmRPdXRwdXQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JUVRWaWRlb091dHB1dENvbXBvbmVudCB2bzsKLQlsb25nIGluZGV4OwotCUNvbXBvbmVudCBvdXRwdXRDb21wb25lbnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgUVRWaWRlb091dHB1dENvbXBvbmVudCB2bzsKKyAgICBsb25nIGluZGV4OworICAgIENvbXBvbmVudCBvdXRwdXRDb21wb25lbnQ7CiAjaWZuZGVmIFFUVmlkZW9PdXRwdXRHZXRJbmRTb3VuZE91dHB1dAotCVB5TWFjX1BSRUNIRUNLKFFUVmlkZW9PdXRwdXRHZXRJbmRTb3VuZE91dHB1dCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUVRWaWRlb091dHB1dEdldEluZFNvdW5kT3V0cHV0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnZvLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBRVFZpZGVvT3V0cHV0R2V0SW5kU291bmRPdXRwdXQodm8sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0Q29tcG9uZW50KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgQ21wT2JqX05ldywgb3V0cHV0Q29tcG9uZW50KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ2bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZGV4KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gUVRWaWRlb091dHB1dEdldEluZFNvdW5kT3V0cHV0KHZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dENvbXBvbmVudCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIENtcE9ial9OZXcsIG91dHB1dENvbXBvbmVudCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfUVRWaWRlb091dHB1dEdldENsb2NrKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVFUVmlkZW9PdXRwdXRDb21wb25lbnQgdm87Ci0JQ29tcG9uZW50SW5zdGFuY2UgY2xvY2s7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgUVRWaWRlb091dHB1dENvbXBvbmVudCB2bzsKKyAgICBDb21wb25lbnRJbnN0YW5jZSBjbG9jazsKICNpZm5kZWYgUVRWaWRlb091dHB1dEdldENsb2NrCi0JUHlNYWNfUFJFQ0hFQ0soUVRWaWRlb091dHB1dEdldENsb2NrKTsKKyAgICBQeU1hY19QUkVDSEVDSyhRVFZpZGVvT3V0cHV0R2V0Q2xvY2spOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ2bykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFFUVmlkZW9PdXRwdXRHZXRDbG9jayh2bywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNsb2NrKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9OZXcsIGNsb2NrKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnZvKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gUVRWaWRlb091dHB1dEdldENsb2NrKHZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2xvY2spOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX05ldywgY2xvY2spOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1FUVmlkZW9PdXRwdXRTZXRFY2hvUG9ydChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlRVFZpZGVvT3V0cHV0Q29tcG9uZW50IHZvOwotCUNHcmFmUHRyIGVjaG9Qb3J0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFFUVmlkZW9PdXRwdXRDb21wb25lbnQgdm87CisgICAgQ0dyYWZQdHIgZWNob1BvcnQ7CiAjaWZuZGVmIFFUVmlkZW9PdXRwdXRTZXRFY2hvUG9ydAotCVB5TWFjX1BSRUNIRUNLKFFUVmlkZW9PdXRwdXRTZXRFY2hvUG9ydCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUVRWaWRlb091dHB1dFNldEVjaG9Qb3J0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ2bywKLQkgICAgICAgICAgICAgICAgICAgICAgR3JhZk9ial9Db252ZXJ0LCAmZWNob1BvcnQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBRVFZpZGVvT3V0cHV0U2V0RWNob1BvcnQodm8sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG9Qb3J0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfQ29udmVydCwgJmVjaG9Qb3J0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gUVRWaWRlb091dHB1dFNldEVjaG9Qb3J0KHZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvUG9ydCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfUVRWaWRlb091dHB1dEdldEluZEltYWdlRGVjb21wcmVzc29yKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVFUVmlkZW9PdXRwdXRDb21wb25lbnQgdm87Ci0JbG9uZyBpbmRleDsKLQlDb21wb25lbnQgY29kZWM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgUVRWaWRlb091dHB1dENvbXBvbmVudCB2bzsKKyAgICBsb25nIGluZGV4OworICAgIENvbXBvbmVudCBjb2RlYzsKICNpZm5kZWYgUVRWaWRlb091dHB1dEdldEluZEltYWdlRGVjb21wcmVzc29yCi0JUHlNYWNfUFJFQ0hFQ0soUVRWaWRlb091dHB1dEdldEluZEltYWdlRGVjb21wcmVzc29yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhRVFZpZGVvT3V0cHV0R2V0SW5kSW1hZ2VEZWNvbXByZXNzb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdm8sCi0JICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFFUVmlkZW9PdXRwdXRHZXRJbmRJbWFnZURlY29tcHJlc3Nvcih2bywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2RlYyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIENtcE9ial9OZXcsIGNvZGVjKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ2bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZGV4KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gUVRWaWRlb091dHB1dEdldEluZEltYWdlRGVjb21wcmVzc29yKHZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvZGVjKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ21wT2JqX05ldywgY29kZWMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1FUVmlkZW9PdXRwdXRCYXNlU2V0RWNob1BvcnQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JUVRWaWRlb091dHB1dENvbXBvbmVudCB2bzsKLQlDR3JhZlB0ciBlY2hvUG9ydDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBRVFZpZGVvT3V0cHV0Q29tcG9uZW50IHZvOworICAgIENHcmFmUHRyIGVjaG9Qb3J0OwogI2lmbmRlZiBRVFZpZGVvT3V0cHV0QmFzZVNldEVjaG9Qb3J0Ci0JUHlNYWNfUFJFQ0hFQ0soUVRWaWRlb091dHB1dEJhc2VTZXRFY2hvUG9ydCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUVRWaWRlb091dHB1dEJhc2VTZXRFY2hvUG9ydCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdm8sCi0JICAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfQ29udmVydCwgJmVjaG9Qb3J0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gUVRWaWRlb091dHB1dEJhc2VTZXRFY2hvUG9ydCh2bywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG9Qb3J0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfQ29udmVydCwgJmVjaG9Qb3J0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gUVRWaWRlb091dHB1dEJhc2VTZXRFY2hvUG9ydCh2bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG9Qb3J0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYVNldENodW5rTWFuYWdlbWVudEZsYWdzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlVSW50MzIgZmxhZ3M7Ci0JVUludDMyIGZsYWdzTWFzazsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgVUludDMyIGZsYWdzOworICAgIFVJbnQzMiBmbGFnc01hc2s7CiAjaWZuZGVmIE1lZGlhU2V0Q2h1bmtNYW5hZ2VtZW50RmxhZ3MKLQlQeU1hY19QUkVDSEVDSyhNZWRpYVNldENodW5rTWFuYWdlbWVudEZsYWdzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYVNldENodW5rTWFuYWdlbWVudEZsYWdzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3NNYXNrKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFTZXRDaHVua01hbmFnZW1lbnRGbGFncyhtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3NNYXNrKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzTWFzaykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhU2V0Q2h1bmtNYW5hZ2VtZW50RmxhZ3MobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzTWFzayk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFHZXRDaHVua01hbmFnZW1lbnRGbGFncyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JVUludDMyIGZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBVSW50MzIgZmxhZ3M7CiAjaWZuZGVmIE1lZGlhR2V0Q2h1bmtNYW5hZ2VtZW50RmxhZ3MKLQlQeU1hY19QUkVDSEVDSyhNZWRpYUdldENodW5rTWFuYWdlbWVudEZsYWdzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYUdldENodW5rTWFuYWdlbWVudEZsYWdzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYUdldENodW5rTWFuYWdlbWVudEZsYWdzKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBmbGFncyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhR2V0Q2h1bmtNYW5hZ2VtZW50RmxhZ3MobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYVNldFB1cmdlYWJsZUNodW5rTWVtb3J5QWxsb3dhbmNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlTaXplIGFsbG93YW5jZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgU2l6ZSBhbGxvd2FuY2U7CiAjaWZuZGVmIE1lZGlhU2V0UHVyZ2VhYmxlQ2h1bmtNZW1vcnlBbGxvd2FuY2UKLQlQeU1hY19QUkVDSEVDSyhNZWRpYVNldFB1cmdlYWJsZUNodW5rTWVtb3J5QWxsb3dhbmNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYVNldFB1cmdlYWJsZUNodW5rTWVtb3J5QWxsb3dhbmNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmYWxsb3dhbmNlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFTZXRQdXJnZWFibGVDaHVua01lbW9yeUFsbG93YW5jZShtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93YW5jZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhbGxvd2FuY2UpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYVNldFB1cmdlYWJsZUNodW5rTWVtb3J5QWxsb3dhbmNlKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dhbmNlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYUdldFB1cmdlYWJsZUNodW5rTWVtb3J5QWxsb3dhbmNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlTaXplIGFsbG93YW5jZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgU2l6ZSBhbGxvd2FuY2U7CiAjaWZuZGVmIE1lZGlhR2V0UHVyZ2VhYmxlQ2h1bmtNZW1vcnlBbGxvd2FuY2UKLQlQeU1hY19QUkVDSEVDSyhNZWRpYUdldFB1cmdlYWJsZUNodW5rTWVtb3J5QWxsb3dhbmNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYUdldFB1cmdlYWJsZUNodW5rTWVtb3J5QWxsb3dhbmNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYUdldFB1cmdlYWJsZUNodW5rTWVtb3J5QWxsb3dhbmNlKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFsbG93YW5jZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgYWxsb3dhbmNlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFHZXRQdXJnZWFibGVDaHVua01lbW9yeUFsbG93YW5jZShtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhbGxvd2FuY2UpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93YW5jZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFFbXB0eUFsbFB1cmdlYWJsZUNodW5rcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOwogI2lmbmRlZiBNZWRpYUVtcHR5QWxsUHVyZ2VhYmxlQ2h1bmtzCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFFbXB0eUFsbFB1cmdlYWJsZUNodW5rcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFFbXB0eUFsbFB1cmdlYWJsZUNodW5rcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFFbXB0eUFsbFB1cmdlYWJsZUNodW5rcyhtaCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhRW1wdHlBbGxQdXJnZWFibGVDaHVua3MobWgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhU2V0SGFuZGxlckNhcGFiaWxpdGllcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JbG9uZyBmbGFnczsKLQlsb25nIGZsYWdzTWFzazsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgbG9uZyBmbGFnczsKKyAgICBsb25nIGZsYWdzTWFzazsKICNpZm5kZWYgTWVkaWFTZXRIYW5kbGVyQ2FwYWJpbGl0aWVzCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFTZXRIYW5kbGVyQ2FwYWJpbGl0aWVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYVNldEhhbmRsZXJDYXBhYmlsaXRpZXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFnc01hc2spKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYVNldEhhbmRsZXJDYXBhYmlsaXRpZXMobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnc01hc2spOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3NNYXNrKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFTZXRIYW5kbGVyQ2FwYWJpbGl0aWVzKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3NNYXNrKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYUlkbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCVRpbWVWYWx1ZSBhdE1lZGlhVGltZTsKLQlsb25nIGZsYWdzSW47Ci0JbG9uZyBmbGFnc091dDsKLQlUaW1lUmVjb3JkIG1vdmllVGltZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgVGltZVZhbHVlIGF0TWVkaWFUaW1lOworICAgIGxvbmcgZmxhZ3NJbjsKKyAgICBsb25nIGZsYWdzT3V0OworICAgIFRpbWVSZWNvcmQgbW92aWVUaW1lOwogI2lmbmRlZiBNZWRpYUlkbGUKLQlQeU1hY19QUkVDSEVDSyhNZWRpYUlkbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhSWRsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmF0TWVkaWFUaW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3NJbiwKLQkgICAgICAgICAgICAgICAgICAgICAgUXRUaW1lUmVjb3JkX0NvbnZlcnQsICZtb3ZpZVRpbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYUlkbGUobWgsCi0JICAgICAgICAgICAgICAgIGF0TWVkaWFUaW1lLAotCSAgICAgICAgICAgICAgICBmbGFnc0luLAotCSAgICAgICAgICAgICAgICAmZmxhZ3NPdXQsCi0JICAgICAgICAgICAgICAgICZtb3ZpZVRpbWUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGZsYWdzT3V0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmF0TWVkaWFUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3NJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUXRUaW1lUmVjb3JkX0NvbnZlcnQsICZtb3ZpZVRpbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYUlkbGUobWgsCisgICAgICAgICAgICAgICAgICAgIGF0TWVkaWFUaW1lLAorICAgICAgICAgICAgICAgICAgICBmbGFnc0luLAorICAgICAgICAgICAgICAgICAgICAmZmxhZ3NPdXQsCisgICAgICAgICAgICAgICAgICAgICZtb3ZpZVRpbWUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzT3V0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYUdldE1lZGlhSW5mbyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JSGFuZGxlIGg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIEhhbmRsZSBoOwogI2lmbmRlZiBNZWRpYUdldE1lZGlhSW5mbwotCVB5TWFjX1BSRUNIRUNLKE1lZGlhR2V0TWVkaWFJbmZvKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYUdldE1lZGlhSW5mbyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhR2V0TWVkaWFJbmZvKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFHZXRNZWRpYUluZm8obWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFQdXRNZWRpYUluZm8oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCUhhbmRsZSBoOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBIYW5kbGUgaDsKICNpZm5kZWYgTWVkaWFQdXRNZWRpYUluZm8KLQlQeU1hY19QUkVDSEVDSyhNZWRpYVB1dE1lZGlhSW5mbyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFQdXRNZWRpYUluZm8pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYVB1dE1lZGlhSW5mbyhtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICBoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhUHV0TWVkaWFJbmZvKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhU2V0QWN0aXZlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlCb29sZWFuIGVuYWJsZU1lZGlhOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBCb29sZWFuIGVuYWJsZU1lZGlhOwogI2lmbmRlZiBNZWRpYVNldEFjdGl2ZQotCVB5TWFjX1BSRUNIRUNLKE1lZGlhU2V0QWN0aXZlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYVNldEFjdGl2ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmIiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmVuYWJsZU1lZGlhKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFTZXRBY3RpdmUobWgsCi0JICAgICAgICAgICAgICAgICAgICAgZW5hYmxlTWVkaWEpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5hYmxlTWVkaWEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYVNldEFjdGl2ZShtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVNZWRpYSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFTZXRSYXRlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlGaXhlZCByYXRlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBGaXhlZCByYXRlOwogI2lmbmRlZiBNZWRpYVNldFJhdGUKLQlQeU1hY19QUkVDSEVDSyhNZWRpYVNldFJhdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhU2V0UmF0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmcmF0ZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhU2V0UmF0ZShtaCwKLQkgICAgICAgICAgICAgICAgICAgcmF0ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJnJhdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYVNldFJhdGUobWgsCisgICAgICAgICAgICAgICAgICAgICAgIHJhdGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhR0dldFN0YXR1cyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JQ29tcG9uZW50UmVzdWx0IHN0YXR1c0VycjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgQ29tcG9uZW50UmVzdWx0IHN0YXR1c0VycjsKICNpZm5kZWYgTWVkaWFHR2V0U3RhdHVzCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFHR2V0U3RhdHVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYUdHZXRTdGF0dXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhR0dldFN0YXR1cyhtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnN0YXR1c0Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgc3RhdHVzRXJyKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFHR2V0U3RhdHVzKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhdHVzRXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNFcnIpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhVHJhY2tFZGl0ZWQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKICNpZm5kZWYgTWVkaWFUcmFja0VkaXRlZAotCVB5TWFjX1BSRUNIRUNLKE1lZGlhVHJhY2tFZGl0ZWQpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhVHJhY2tFZGl0ZWQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhVHJhY2tFZGl0ZWQobWgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYVRyYWNrRWRpdGVkKG1oKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYVNldE1lZGlhVGltZVNjYWxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlUaW1lU2NhbGUgbmV3VGltZVNjYWxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBUaW1lU2NhbGUgbmV3VGltZVNjYWxlOwogI2lmbmRlZiBNZWRpYVNldE1lZGlhVGltZVNjYWxlCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFTZXRNZWRpYVRpbWVTY2FsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFTZXRNZWRpYVRpbWVTY2FsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm5ld1RpbWVTY2FsZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhU2V0TWVkaWFUaW1lU2NhbGUobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdUaW1lU2NhbGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbmV3VGltZVNjYWxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFTZXRNZWRpYVRpbWVTY2FsZShtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1RpbWVTY2FsZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFTZXRNb3ZpZVRpbWVTY2FsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JVGltZVNjYWxlIG5ld1RpbWVTY2FsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgVGltZVNjYWxlIG5ld1RpbWVTY2FsZTsKICNpZm5kZWYgTWVkaWFTZXRNb3ZpZVRpbWVTY2FsZQotCVB5TWFjX1BSRUNIRUNLKE1lZGlhU2V0TW92aWVUaW1lU2NhbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhU2V0TW92aWVUaW1lU2NhbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZuZXdUaW1lU2NhbGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYVNldE1vdmllVGltZVNjYWxlKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3VGltZVNjYWxlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld1RpbWVTY2FsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhU2V0TW92aWVUaW1lU2NhbGUobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdUaW1lU2NhbGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhU2V0R1dvcmxkKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlDR3JhZlB0ciBhUG9ydDsKLQlHREhhbmRsZSBhR0Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIENHcmFmUHRyIGFQb3J0OworICAgIEdESGFuZGxlIGFHRDsKICNpZm5kZWYgTWVkaWFTZXRHV29ybGQKLQlQeU1hY19QUkVDSEVDSyhNZWRpYVNldEdXb3JsZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFTZXRHV29ybGQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfQ29udmVydCwgJmFQb3J0LAotCSAgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfQ29udmVydCwgJmFHRCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhU2V0R1dvcmxkKG1oLAotCSAgICAgICAgICAgICAgICAgICAgIGFQb3J0LAotCSAgICAgICAgICAgICAgICAgICAgIGFHRCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfQ29udmVydCwgJmFQb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfQ29udmVydCwgJmFHRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhU2V0R1dvcmxkKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgIGFQb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGFHRCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFTZXREaW1lbnNpb25zKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlGaXhlZCB3aWR0aDsKLQlGaXhlZCBoZWlnaHQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIEZpeGVkIHdpZHRoOworICAgIEZpeGVkIGhlaWdodDsKICNpZm5kZWYgTWVkaWFTZXREaW1lbnNpb25zCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFTZXREaW1lbnNpb25zKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYVNldERpbWVuc2lvbnMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmd2lkdGgsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmaGVpZ2h0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFTZXREaW1lbnNpb25zKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZ3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZoZWlnaHQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYVNldERpbWVuc2lvbnMobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhU2V0Q2xpcChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JUmduSGFuZGxlIHRoZUNsaXA7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIFJnbkhhbmRsZSB0aGVDbGlwOwogI2lmbmRlZiBNZWRpYVNldENsaXAKLQlQeU1hY19QUkVDSEVDSyhNZWRpYVNldENsaXApOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhU2V0Q2xpcCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlQ2xpcCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhU2V0Q2xpcChtaCwKLQkgICAgICAgICAgICAgICAgICAgdGhlQ2xpcCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUNsaXApKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYVNldENsaXAobWgsCisgICAgICAgICAgICAgICAgICAgICAgIHRoZUNsaXApOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhR2V0VHJhY2tPcGFxdWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCUJvb2xlYW4gdHJhY2tJc09wYXF1ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgQm9vbGVhbiB0cmFja0lzT3BhcXVlOwogI2lmbmRlZiBNZWRpYUdldFRyYWNrT3BhcXVlCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFHZXRUcmFja09wYXF1ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFHZXRUcmFja09wYXF1ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFHZXRUcmFja09wYXF1ZShtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFja0lzT3BhcXVlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICB0cmFja0lzT3BhcXVlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFHZXRUcmFja09wYXF1ZShtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFja0lzT3BhcXVlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja0lzT3BhcXVlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYVNldEdyYXBoaWNzTW9kZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JbG9uZyBtb2RlOwotCVJHQkNvbG9yIG9wQ29sb3I7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIGxvbmcgbW9kZTsKKyAgICBSR0JDb2xvciBvcENvbG9yOwogI2lmbmRlZiBNZWRpYVNldEdyYXBoaWNzTW9kZQotCVB5TWFjX1BSRUNIRUNLKE1lZGlhU2V0R3JhcGhpY3NNb2RlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYVNldEdyYXBoaWNzTW9kZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmbW9kZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUWRSR0JfQ29udmVydCwgJm9wQ29sb3IpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYVNldEdyYXBoaWNzTW9kZShtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZvcENvbG9yKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUWRSR0JfQ29udmVydCwgJm9wQ29sb3IpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYVNldEdyYXBoaWNzTW9kZShtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvcENvbG9yKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYUdldEdyYXBoaWNzTW9kZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JbG9uZyBtb2RlOwotCVJHQkNvbG9yIG9wQ29sb3I7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIGxvbmcgbW9kZTsKKyAgICBSR0JDb2xvciBvcENvbG9yOwogI2lmbmRlZiBNZWRpYUdldEdyYXBoaWNzTW9kZQotCVB5TWFjX1BSRUNIRUNLKE1lZGlhR2V0R3JhcGhpY3NNb2RlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYUdldEdyYXBoaWNzTW9kZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFHZXRHcmFwaGljc01vZGUobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9wQ29sb3IpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgbW9kZSwKLQkgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZvcENvbG9yKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFHZXRHcmFwaGljc01vZGUobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9wQ29sb3IpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZvcENvbG9yKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYUdTZXRWb2x1bWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCXNob3J0IHZvbHVtZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgc2hvcnQgdm9sdW1lOwogI2lmbmRlZiBNZWRpYUdTZXRWb2x1bWUKLQlQeU1hY19QUkVDSEVDSyhNZWRpYUdTZXRWb2x1bWUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhR1NldFZvbHVtZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZvbHVtZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhR1NldFZvbHVtZShtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZvbHVtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhR1NldFZvbHVtZShtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYVNldFNvdW5kQmFsYW5jZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0Jc2hvcnQgYmFsYW5jZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgc2hvcnQgYmFsYW5jZTsKICNpZm5kZWYgTWVkaWFTZXRTb3VuZEJhbGFuY2UKLQlQeU1hY19QUkVDSEVDSyhNZWRpYVNldFNvdW5kQmFsYW5jZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFTZXRTb3VuZEJhbGFuY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZiYWxhbmNlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFTZXRTb3VuZEJhbGFuY2UobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFsYW5jZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZiYWxhbmNlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFTZXRTb3VuZEJhbGFuY2UobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFsYW5jZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFHZXRTb3VuZEJhbGFuY2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCXNob3J0IGJhbGFuY2U7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIHNob3J0IGJhbGFuY2U7CiAjaWZuZGVmIE1lZGlhR2V0U291bmRCYWxhbmNlCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFHZXRTb3VuZEJhbGFuY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhR2V0U291bmRCYWxhbmNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYUdldFNvdW5kQmFsYW5jZShtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmYmFsYW5jZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgYmFsYW5jZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhR2V0U291bmRCYWxhbmNlKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZiYWxhbmNlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiYWxhbmNlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYUdldE5leHRCb3VuZHNDaGFuZ2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCVRpbWVWYWx1ZSB3aGVuOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBUaW1lVmFsdWUgd2hlbjsKICNpZm5kZWYgTWVkaWFHZXROZXh0Qm91bmRzQ2hhbmdlCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFHZXROZXh0Qm91bmRzQ2hhbmdlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYUdldE5leHRCb3VuZHNDaGFuZ2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhR2V0TmV4dEJvdW5kc0NoYW5nZShtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJndoZW4pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHdoZW4pOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYUdldE5leHRCb3VuZHNDaGFuZ2UobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3aGVuKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB3aGVuKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYUdldFNyY1JnbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JUmduSGFuZGxlIHJnbjsKLQlUaW1lVmFsdWUgYXRNZWRpYVRpbWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIFJnbkhhbmRsZSByZ247CisgICAgVGltZVZhbHVlIGF0TWVkaWFUaW1lOwogI2lmbmRlZiBNZWRpYUdldFNyY1JnbgotCVB5TWFjX1BSRUNIRUNLKE1lZGlhR2V0U3JjUmduKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYUdldFNyY1Jnbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmF0TWVkaWFUaW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFHZXRTcmNSZ24obWgsCi0JICAgICAgICAgICAgICAgICAgICAgcmduLAotCSAgICAgICAgICAgICAgICAgICAgIGF0TWVkaWFUaW1lKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmF0TWVkaWFUaW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFHZXRTcmNSZ24obWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmduLAorICAgICAgICAgICAgICAgICAgICAgICAgIGF0TWVkaWFUaW1lKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYVByZXJvbGwoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCVRpbWVWYWx1ZSB0aW1lOwotCUZpeGVkIHJhdGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIFRpbWVWYWx1ZSB0aW1lOworICAgIEZpeGVkIHJhdGU7CiAjaWZuZGVmIE1lZGlhUHJlcm9sbAotCVB5TWFjX1BSRUNIRUNLKE1lZGlhUHJlcm9sbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFQcmVyb2xsKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aW1lLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJnJhdGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYVByZXJvbGwobWgsCi0JICAgICAgICAgICAgICAgICAgIHRpbWUsCi0JICAgICAgICAgICAgICAgICAgIHJhdGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJnJhdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYVByZXJvbGwobWgsCisgICAgICAgICAgICAgICAgICAgICAgIHRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgIHJhdGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhU2FtcGxlRGVzY3JpcHRpb25DaGFuZ2VkKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlsb25nIGluZGV4OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBsb25nIGluZGV4OwogI2lmbmRlZiBNZWRpYVNhbXBsZURlc2NyaXB0aW9uQ2hhbmdlZAotCVB5TWFjX1BSRUNIRUNLKE1lZGlhU2FtcGxlRGVzY3JpcHRpb25DaGFuZ2VkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYVNhbXBsZURlc2NyaXB0aW9uQ2hhbmdlZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluZGV4KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFTYW1wbGVEZXNjcmlwdGlvbkNoYW5nZWQobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYVNhbXBsZURlc2NyaXB0aW9uQ2hhbmdlZChtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFIYXNDaGFyYWN0ZXJpc3RpYyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JT1NUeXBlIGNoYXJhY3RlcmlzdGljOwotCUJvb2xlYW4gaGFzSXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIE9TVHlwZSBjaGFyYWN0ZXJpc3RpYzsKKyAgICBCb29sZWFuIGhhc0l0OwogI2lmbmRlZiBNZWRpYUhhc0NoYXJhY3RlcmlzdGljCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFIYXNDaGFyYWN0ZXJpc3RpYyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFIYXNDaGFyYWN0ZXJpc3RpYyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNoYXJhY3RlcmlzdGljKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFIYXNDaGFyYWN0ZXJpc3RpYyhtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlcmlzdGljLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhhc0l0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBoYXNJdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjaGFyYWN0ZXJpc3RpYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhSGFzQ2hhcmFjdGVyaXN0aWMobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXJpc3RpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoYXNJdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgaGFzSXQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhR2V0T2Zmc2NyZWVuQnVmZmVyU2l6ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JUmVjdCBib3VuZHM7Ci0Jc2hvcnQgZGVwdGg7Ci0JQ1RhYkhhbmRsZSBjdGFiOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBSZWN0IGJvdW5kczsKKyAgICBzaG9ydCBkZXB0aDsKKyAgICBDVGFiSGFuZGxlIGN0YWI7CiAjaWZuZGVmIE1lZGlhR2V0T2Zmc2NyZWVuQnVmZmVyU2l6ZQotCVB5TWFjX1BSRUNIRUNLKE1lZGlhR2V0T2Zmc2NyZWVuQnVmZmVyU2l6ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFHZXRPZmZzY3JlZW5CdWZmZXJTaXplKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZkZXB0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZjdGFiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFHZXRPZmZzY3JlZW5CdWZmZXJTaXplKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3RhYik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmJvdW5kcyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmN0YWIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYUdldE9mZnNjcmVlbkJ1ZmZlclNpemUobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdGFiKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmYm91bmRzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYVNldEhpbnRzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlsb25nIGhpbnRzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBsb25nIGhpbnRzOwogI2lmbmRlZiBNZWRpYVNldEhpbnRzCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFTZXRIaW50cyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFTZXRIaW50cyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmhpbnRzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFTZXRIaW50cyhtaCwKLQkgICAgICAgICAgICAgICAgICAgIGhpbnRzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmhpbnRzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFTZXRIaW50cyhtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhpbnRzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYUdldE5hbWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCVN0cjI1NSBuYW1lOwotCWxvbmcgcmVxdWVzdGVkTGFuZ3VhZ2U7Ci0JbG9uZyBhY3R1YWxMYW5ndWFnZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgU3RyMjU1IG5hbWU7CisgICAgbG9uZyByZXF1ZXN0ZWRMYW5ndWFnZTsKKyAgICBsb25nIGFjdHVhbExhbmd1YWdlOwogI2lmbmRlZiBNZWRpYUdldE5hbWUKLQlQeU1hY19QUkVDSEVDSyhNZWRpYUdldE5hbWUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhR2V0TmFtZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIG5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZXF1ZXN0ZWRMYW5ndWFnZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhR2V0TmFtZShtaCwKLQkgICAgICAgICAgICAgICAgICAgbmFtZSwKLQkgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkTGFuZ3VhZ2UsCi0JICAgICAgICAgICAgICAgICAgICZhY3R1YWxMYW5ndWFnZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgYWN0dWFsTGFuZ3VhZ2UpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlcXVlc3RlZExhbmd1YWdlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFHZXROYW1lKG1oLAorICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRMYW5ndWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgJmFjdHVhbExhbmd1YWdlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxMYW5ndWFnZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFGb3JjZVVwZGF0ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JbG9uZyBmb3JjZVVwZGF0ZUZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBsb25nIGZvcmNlVXBkYXRlRmxhZ3M7CiAjaWZuZGVmIE1lZGlhRm9yY2VVcGRhdGUKLQlQeU1hY19QUkVDSEVDSyhNZWRpYUZvcmNlVXBkYXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYUZvcmNlVXBkYXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmZm9yY2VVcGRhdGVGbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhRm9yY2VVcGRhdGUobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICBmb3JjZVVwZGF0ZUZsYWdzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZvcmNlVXBkYXRlRmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYUZvcmNlVXBkYXRlKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yY2VVcGRhdGVGbGFncyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFHZXREcmF3aW5nUmduKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlSZ25IYW5kbGUgcGFydGlhbFJnbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgUmduSGFuZGxlIHBhcnRpYWxSZ247CiAjaWZuZGVmIE1lZGlhR2V0RHJhd2luZ1JnbgotCVB5TWFjX1BSRUNIRUNLKE1lZGlhR2V0RHJhd2luZ1Jnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFHZXREcmF3aW5nUmduKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYUdldERyYXdpbmdSZ24obWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJ0aWFsUmduKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgcGFydGlhbFJnbik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhR2V0RHJhd2luZ1JnbihtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnRpYWxSZ24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBwYXJ0aWFsUmduKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYUdTZXRBY3RpdmVTZWdtZW50KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlUaW1lVmFsdWUgYWN0aXZlU3RhcnQ7Ci0JVGltZVZhbHVlIGFjdGl2ZUR1cmF0aW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBUaW1lVmFsdWUgYWN0aXZlU3RhcnQ7CisgICAgVGltZVZhbHVlIGFjdGl2ZUR1cmF0aW9uOwogI2lmbmRlZiBNZWRpYUdTZXRBY3RpdmVTZWdtZW50Ci0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFHU2V0QWN0aXZlU2VnbWVudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFHU2V0QWN0aXZlU2VnbWVudCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZhY3RpdmVTdGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmFjdGl2ZUR1cmF0aW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFHU2V0QWN0aXZlU2VnbWVudChtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVN0YXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlRHVyYXRpb24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFjdGl2ZVN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYWN0aXZlRHVyYXRpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYUdTZXRBY3RpdmVTZWdtZW50KG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVEdXJhdGlvbik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFJbnZhbGlkYXRlUmVnaW9uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlSZ25IYW5kbGUgaW52YWxSZ247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIFJnbkhhbmRsZSBpbnZhbFJnbjsKICNpZm5kZWYgTWVkaWFJbnZhbGlkYXRlUmVnaW9uCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFJbnZhbGlkYXRlUmVnaW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYUludmFsaWRhdGVSZWdpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmludmFsUmduKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFJbnZhbGlkYXRlUmVnaW9uKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZhbFJnbik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmludmFsUmduKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFJbnZhbGlkYXRlUmVnaW9uKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZhbFJnbik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFHZXROZXh0U3RlcFRpbWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCXNob3J0IGZsYWdzOwotCVRpbWVWYWx1ZSBtZWRpYVRpbWVJbjsKLQlUaW1lVmFsdWUgbWVkaWFUaW1lT3V0OwotCUZpeGVkIHJhdGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIHNob3J0IGZsYWdzOworICAgIFRpbWVWYWx1ZSBtZWRpYVRpbWVJbjsKKyAgICBUaW1lVmFsdWUgbWVkaWFUaW1lT3V0OworICAgIEZpeGVkIHJhdGU7CiAjaWZuZGVmIE1lZGlhR2V0TmV4dFN0ZXBUaW1lCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFHZXROZXh0U3RlcFRpbWUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhR2V0TmV4dFN0ZXBUaW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICZtZWRpYVRpbWVJbiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZyYXRlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFHZXROZXh0U3RlcFRpbWUobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFUaW1lSW4sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lZGlhVGltZU91dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBtZWRpYVRpbWVPdXQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtZWRpYVRpbWVJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZyYXRlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFHZXROZXh0U3RlcFRpbWUobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFUaW1lSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lZGlhVGltZU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYVRpbWVPdXQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhQ2hhbmdlZE5vblByaW1hcnlTb3VyY2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCWxvbmcgaW5wdXRJbmRleDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgbG9uZyBpbnB1dEluZGV4OwogI2lmbmRlZiBNZWRpYUNoYW5nZWROb25QcmltYXJ5U291cmNlCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFDaGFuZ2VkTm9uUHJpbWFyeVNvdXJjZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFDaGFuZ2VkTm9uUHJpbWFyeVNvdXJjZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlucHV0SW5kZXgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYUNoYW5nZWROb25QcmltYXJ5U291cmNlKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRJbmRleCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnB1dEluZGV4KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFDaGFuZ2VkTm9uUHJpbWFyeVNvdXJjZShtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0SW5kZXgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhVHJhY2tSZWZlcmVuY2VzQ2hhbmdlZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOwogI2lmbmRlZiBNZWRpYVRyYWNrUmVmZXJlbmNlc0NoYW5nZWQKLQlQeU1hY19QUkVDSEVDSyhNZWRpYVRyYWNrUmVmZXJlbmNlc0NoYW5nZWQpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhVHJhY2tSZWZlcmVuY2VzQ2hhbmdlZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFUcmFja1JlZmVyZW5jZXNDaGFuZ2VkKG1oKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFUcmFja1JlZmVyZW5jZXNDaGFuZ2VkKG1oKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYVJlbGVhc2VTYW1wbGVEYXRhUG9pbnRlcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JbG9uZyBzYW1wbGVOdW07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIGxvbmcgc2FtcGxlTnVtOwogI2lmbmRlZiBNZWRpYVJlbGVhc2VTYW1wbGVEYXRhUG9pbnRlcgotCVB5TWFjX1BSRUNIRUNLKE1lZGlhUmVsZWFzZVNhbXBsZURhdGFQb2ludGVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYVJlbGVhc2VTYW1wbGVEYXRhUG9pbnRlcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZU51bSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhUmVsZWFzZVNhbXBsZURhdGFQb2ludGVyKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZU51bSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGVOdW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYVJlbGVhc2VTYW1wbGVEYXRhUG9pbnRlcihtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVOdW0pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhVHJhY2tQcm9wZXJ0eUF0b21DaGFuZ2VkKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CiAjaWZuZGVmIE1lZGlhVHJhY2tQcm9wZXJ0eUF0b21DaGFuZ2VkCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFUcmFja1Byb3BlcnR5QXRvbUNoYW5nZWQpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhVHJhY2tQcm9wZXJ0eUF0b21DaGFuZ2VkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYVRyYWNrUHJvcGVydHlBdG9tQ2hhbmdlZChtaCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhVHJhY2tQcm9wZXJ0eUF0b21DaGFuZ2VkKG1oKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYVNldFZpZGVvUGFyYW0oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCWxvbmcgd2hpY2hQYXJhbTsKLQl1bnNpZ25lZCBzaG9ydCB2YWx1ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgbG9uZyB3aGljaFBhcmFtOworICAgIHVuc2lnbmVkIHNob3J0IHZhbHVlOwogI2lmbmRlZiBNZWRpYVNldFZpZGVvUGFyYW0KLQlQeU1hY19QUkVDSEVDSyhNZWRpYVNldFZpZGVvUGFyYW0pOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhU2V0VmlkZW9QYXJhbSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJndoaWNoUGFyYW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYVNldFZpZGVvUGFyYW0obWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoUGFyYW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxIIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgdmFsdWUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmd2hpY2hQYXJhbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhU2V0VmlkZW9QYXJhbShtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2hQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibEgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFHZXRWaWRlb1BhcmFtKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlsb25nIHdoaWNoUGFyYW07Ci0JdW5zaWduZWQgc2hvcnQgdmFsdWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIGxvbmcgd2hpY2hQYXJhbTsKKyAgICB1bnNpZ25lZCBzaG9ydCB2YWx1ZTsKICNpZm5kZWYgTWVkaWFHZXRWaWRlb1BhcmFtCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFHZXRWaWRlb1BhcmFtKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYUdldFZpZGVvUGFyYW0pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZ3aGljaFBhcmFtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFHZXRWaWRlb1BhcmFtKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaFBhcmFtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsSCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHZhbHVlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJndoaWNoUGFyYW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYUdldFZpZGVvUGFyYW0obWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoUGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhQ29tcGFyZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JQm9vbGVhbiBpc09LOwotCU1lZGlhIHNyY01lZGlhOwotCUNvbXBvbmVudEluc3RhbmNlIHNyY01lZGlhQ29tcG9uZW50OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBCb29sZWFuIGlzT0s7CisgICAgTWVkaWEgc3JjTWVkaWE7CisgICAgQ29tcG9uZW50SW5zdGFuY2Ugc3JjTWVkaWFDb21wb25lbnQ7CiAjaWZuZGVmIE1lZGlhQ29tcGFyZQotCVB5TWFjX1BSRUNIRUNLKE1lZGlhQ29tcGFyZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFDb21wYXJlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICBNZWRpYU9ial9Db252ZXJ0LCAmc3JjTWVkaWEsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnNyY01lZGlhQ29tcG9uZW50KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFDb21wYXJlKG1oLAotCSAgICAgICAgICAgICAgICAgICAmaXNPSywKLQkgICAgICAgICAgICAgICAgICAgc3JjTWVkaWEsCi0JICAgICAgICAgICAgICAgICAgIHNyY01lZGlhQ29tcG9uZW50KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBpc09LKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFPYmpfQ29udmVydCwgJnNyY01lZGlhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzcmNNZWRpYUNvbXBvbmVudCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhQ29tcGFyZShtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgJmlzT0ssCisgICAgICAgICAgICAgICAgICAgICAgIHNyY01lZGlhLAorICAgICAgICAgICAgICAgICAgICAgICBzcmNNZWRpYUNvbXBvbmVudCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgaXNPSyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFHZXRDbG9jayhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JQ29tcG9uZW50SW5zdGFuY2UgY2xvY2s7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIENvbXBvbmVudEluc3RhbmNlIGNsb2NrOwogI2lmbmRlZiBNZWRpYUdldENsb2NrCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFHZXRDbG9jayk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFHZXRDbG9jayk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFHZXRDbG9jayhtaCwKLQkgICAgICAgICAgICAgICAgICAgICZjbG9jayk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfTmV3LCBjbG9jayk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhR2V0Q2xvY2sobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAmY2xvY2spOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX05ldywgY2xvY2spOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhU2V0U291bmRPdXRwdXRDb21wb25lbnQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCUNvbXBvbmVudCBvdXRwdXRDb21wb25lbnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIENvbXBvbmVudCBvdXRwdXRDb21wb25lbnQ7CiAjaWZuZGVmIE1lZGlhU2V0U291bmRPdXRwdXRDb21wb25lbnQKLQlQeU1hY19QUkVDSEVDSyhNZWRpYVNldFNvdW5kT3V0cHV0Q29tcG9uZW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYVNldFNvdW5kT3V0cHV0Q29tcG9uZW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wT2JqX0NvbnZlcnQsICZvdXRwdXRDb21wb25lbnQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYVNldFNvdW5kT3V0cHV0Q29tcG9uZW50KG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0Q29tcG9uZW50KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcE9ial9Db252ZXJ0LCAmb3V0cHV0Q29tcG9uZW50KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFTZXRTb3VuZE91dHB1dENvbXBvbmVudChtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dENvbXBvbmVudCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFHZXRTb3VuZE91dHB1dENvbXBvbmVudChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JQ29tcG9uZW50IG91dHB1dENvbXBvbmVudDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgQ29tcG9uZW50IG91dHB1dENvbXBvbmVudDsKICNpZm5kZWYgTWVkaWFHZXRTb3VuZE91dHB1dENvbXBvbmVudAotCVB5TWFjX1BSRUNIRUNLKE1lZGlhR2V0U291bmRPdXRwdXRDb21wb25lbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhR2V0U291bmRPdXRwdXRDb21wb25lbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhR2V0U291bmRPdXRwdXRDb21wb25lbnQobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0Q29tcG9uZW50KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgQ21wT2JqX05ldywgb3V0cHV0Q29tcG9uZW50KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFHZXRTb3VuZE91dHB1dENvbXBvbmVudChtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXRDb21wb25lbnQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDbXBPYmpfTmV3LCBvdXRwdXRDb21wb25lbnQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhU2V0U291bmRMb2NhbGl6YXRpb25EYXRhKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlIYW5kbGUgZGF0YTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgSGFuZGxlIGRhdGE7CiAjaWZuZGVmIE1lZGlhU2V0U291bmRMb2NhbGl6YXRpb25EYXRhCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFTZXRTb3VuZExvY2FsaXphdGlvbkRhdGEpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhU2V0U291bmRMb2NhbGl6YXRpb25EYXRhKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFTZXRTb3VuZExvY2FsaXphdGlvbkRhdGEobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYVNldFNvdW5kTG9jYWxpemF0aW9uRGF0YShtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYUdldEludmFsaWRSZWdpb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCVJnbkhhbmRsZSByZ247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIFJnbkhhbmRsZSByZ247CiAjaWZuZGVmIE1lZGlhR2V0SW52YWxpZFJlZ2lvbgotCVB5TWFjX1BSRUNIRUNLKE1lZGlhR2V0SW52YWxpZFJlZ2lvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFHZXRJbnZhbGlkUmVnaW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZ24pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYUdldEludmFsaWRSZWdpb24obWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJnbik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhR2V0SW52YWxpZFJlZ2lvbihtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmduKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYVNhbXBsZURlc2NyaXB0aW9uQjJOKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlTYW1wbGVEZXNjcmlwdGlvbkhhbmRsZSBzYW1wbGVEZXNjcmlwdGlvbkg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIFNhbXBsZURlc2NyaXB0aW9uSGFuZGxlIHNhbXBsZURlc2NyaXB0aW9uSDsKICNpZm5kZWYgTWVkaWFTYW1wbGVEZXNjcmlwdGlvbkIyTgotCVB5TWFjX1BSRUNIRUNLKE1lZGlhU2FtcGxlRGVzY3JpcHRpb25CMk4pOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhU2FtcGxlRGVzY3JpcHRpb25CMk4pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNhbXBsZURlc2NyaXB0aW9uSCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhU2FtcGxlRGVzY3JpcHRpb25CMk4obWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVEZXNjcmlwdGlvbkgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzYW1wbGVEZXNjcmlwdGlvbkgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYVNhbXBsZURlc2NyaXB0aW9uQjJOKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlRGVzY3JpcHRpb25IKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYVNhbXBsZURlc2NyaXB0aW9uTjJCKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlTYW1wbGVEZXNjcmlwdGlvbkhhbmRsZSBzYW1wbGVEZXNjcmlwdGlvbkg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIFNhbXBsZURlc2NyaXB0aW9uSGFuZGxlIHNhbXBsZURlc2NyaXB0aW9uSDsKICNpZm5kZWYgTWVkaWFTYW1wbGVEZXNjcmlwdGlvbk4yQgotCVB5TWFjX1BSRUNIRUNLKE1lZGlhU2FtcGxlRGVzY3JpcHRpb25OMkIpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhU2FtcGxlRGVzY3JpcHRpb25OMkIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNhbXBsZURlc2NyaXB0aW9uSCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhU2FtcGxlRGVzY3JpcHRpb25OMkIobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVEZXNjcmlwdGlvbkgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzYW1wbGVEZXNjcmlwdGlvbkgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYVNhbXBsZURlc2NyaXB0aW9uTjJCKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlRGVzY3JpcHRpb25IKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYUZsdXNoTm9uUHJpbWFyeVNvdXJjZURhdGEoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCWxvbmcgaW5wdXRJbmRleDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgbG9uZyBpbnB1dEluZGV4OwogI2lmbmRlZiBNZWRpYUZsdXNoTm9uUHJpbWFyeVNvdXJjZURhdGEKLQlQeU1hY19QUkVDSEVDSyhNZWRpYUZsdXNoTm9uUHJpbWFyeVNvdXJjZURhdGEpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhRmx1c2hOb25QcmltYXJ5U291cmNlRGF0YSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlucHV0SW5kZXgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYUZsdXNoTm9uUHJpbWFyeVNvdXJjZURhdGEobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0SW5kZXgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5wdXRJbmRleCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhRmx1c2hOb25QcmltYXJ5U291cmNlRGF0YShtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRJbmRleCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFHZXRVUkxMaW5rKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlQb2ludCBkaXNwbGF5V2hlcmU7Ci0JSGFuZGxlIHVybExpbms7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIFBvaW50IGRpc3BsYXlXaGVyZTsKKyAgICBIYW5kbGUgdXJsTGluazsKICNpZm5kZWYgTWVkaWFHZXRVUkxMaW5rCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFHZXRVUkxMaW5rKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYUdldFVSTExpbmspOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJmRpc3BsYXlXaGVyZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhR2V0VVJMTGluayhtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheVdoZXJlLAotCSAgICAgICAgICAgICAgICAgICAgICAmdXJsTGluayk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHVybExpbmspOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZkaXNwbGF5V2hlcmUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYUdldFVSTExpbmsobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlXaGVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnVybExpbmspOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCB1cmxMaW5rKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYUhpdFRlc3RGb3JUYXJnZXRSZWZDb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCWxvbmcgZmxhZ3M7Ci0JUG9pbnQgbG9jOwotCWxvbmcgdGFyZ2V0UmVmQ29uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBsb25nIGZsYWdzOworICAgIFBvaW50IGxvYzsKKyAgICBsb25nIHRhcmdldFJlZkNvbjsKICNpZm5kZWYgTWVkaWFIaXRUZXN0Rm9yVGFyZ2V0UmVmQ29uCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFIaXRUZXN0Rm9yVGFyZ2V0UmVmQ29uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYUhpdFRlc3RGb3JUYXJnZXRSZWZDb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJmxvYykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhSGl0VGVzdEZvclRhcmdldFJlZkNvbihtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRhcmdldFJlZkNvbik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0UmVmQ29uKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmbG9jKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFIaXRUZXN0Rm9yVGFyZ2V0UmVmQ29uKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGFyZ2V0UmVmQ29uKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRSZWZDb24pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhSGl0VGVzdFRhcmdldFJlZkNvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JbG9uZyB0YXJnZXRSZWZDb247Ci0JbG9uZyBmbGFnczsKLQlQb2ludCBsb2M7Ci0JQm9vbGVhbiB3YXNIaXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIGxvbmcgdGFyZ2V0UmVmQ29uOworICAgIGxvbmcgZmxhZ3M7CisgICAgUG9pbnQgbG9jOworICAgIEJvb2xlYW4gd2FzSGl0OwogI2lmbmRlZiBNZWRpYUhpdFRlc3RUYXJnZXRSZWZDb24KLQlQeU1hY19QUkVDSEVDSyhNZWRpYUhpdFRlc3RUYXJnZXRSZWZDb24pOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhSGl0VGVzdFRhcmdldFJlZkNvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRhcmdldFJlZkNvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJmxvYykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhSGl0VGVzdFRhcmdldFJlZkNvbihtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0UmVmQ29uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd2FzSGl0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICB3YXNIaXQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGFyZ2V0UmVmQ29uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmbG9jKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFIaXRUZXN0VGFyZ2V0UmVmQ29uKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRSZWZDb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3YXNIaXQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHdhc0hpdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFEaXNwb3NlVGFyZ2V0UmVmQ29uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlsb25nIHRhcmdldFJlZkNvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgbG9uZyB0YXJnZXRSZWZDb247CiAjaWZuZGVmIE1lZGlhRGlzcG9zZVRhcmdldFJlZkNvbgotCVB5TWFjX1BSRUNIRUNLKE1lZGlhRGlzcG9zZVRhcmdldFJlZkNvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFEaXNwb3NlVGFyZ2V0UmVmQ29uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGFyZ2V0UmVmQ29uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFEaXNwb3NlVGFyZ2V0UmVmQ29uKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRSZWZDb24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGFyZ2V0UmVmQ29uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFEaXNwb3NlVGFyZ2V0UmVmQ29uKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRSZWZDb24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhVGFyZ2V0UmVmQ29uc0VxdWFsKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlsb25nIGZpcnN0UmVmQ29uOwotCWxvbmcgc2Vjb25kUmVmQ29uOwotCUJvb2xlYW4gZXF1YWw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIGxvbmcgZmlyc3RSZWZDb247CisgICAgbG9uZyBzZWNvbmRSZWZDb247CisgICAgQm9vbGVhbiBlcXVhbDsKICNpZm5kZWYgTWVkaWFUYXJnZXRSZWZDb25zRXF1YWwKLQlQeU1hY19QUkVDSEVDSyhNZWRpYVRhcmdldFJlZkNvbnNFcXVhbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFUYXJnZXRSZWZDb25zRXF1YWwpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmlyc3RSZWZDb24sCi0JICAgICAgICAgICAgICAgICAgICAgICZzZWNvbmRSZWZDb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYVRhcmdldFJlZkNvbnNFcXVhbChtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFJlZkNvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRSZWZDb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVxdWFsKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBlcXVhbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlyc3RSZWZDb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzZWNvbmRSZWZDb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYVRhcmdldFJlZkNvbnNFcXVhbChtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFJlZkNvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRSZWZDb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVxdWFsKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBlcXVhbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFQcmVQcmVyb2xsQ2FuY2VsKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQl2b2lkICogcmVmY29uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICB2b2lkICogcmVmY29uOwogI2lmbmRlZiBNZWRpYVByZVByZXJvbGxDYW5jZWwKLQlQeU1hY19QUkVDSEVDSyhNZWRpYVByZVByZXJvbGxDYW5jZWwpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhUHJlUHJlcm9sbENhbmNlbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnMiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJlZmNvbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhUHJlUHJlcm9sbENhbmNlbChtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmY29uKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZmNvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhUHJlUHJlcm9sbENhbmNlbChtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmY29uKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYUVudGVyRW1wdHlFZGl0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CiAjaWZuZGVmIE1lZGlhRW50ZXJFbXB0eUVkaXQKLQlQeU1hY19QUkVDSEVDSyhNZWRpYUVudGVyRW1wdHlFZGl0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYUVudGVyRW1wdHlFZGl0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYUVudGVyRW1wdHlFZGl0KG1oKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFFbnRlckVtcHR5RWRpdChtaCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFDdXJyZW50TWVkaWFRdWV1ZWREYXRhKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlsb25nIG1pbGxpU2VjczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgbG9uZyBtaWxsaVNlY3M7CiAjaWZuZGVmIE1lZGlhQ3VycmVudE1lZGlhUXVldWVkRGF0YQotCVB5TWFjX1BSRUNIRUNLKE1lZGlhQ3VycmVudE1lZGlhUXVldWVkRGF0YSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFDdXJyZW50TWVkaWFRdWV1ZWREYXRhKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYUN1cnJlbnRNZWRpYVF1ZXVlZERhdGEobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtaWxsaVNlY3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIG1pbGxpU2Vjcyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhQ3VycmVudE1lZGlhUXVldWVkRGF0YShtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1pbGxpU2Vjcyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgbWlsbGlTZWNzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYUdldEVmZmVjdGl2ZVZvbHVtZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0Jc2hvcnQgdm9sdW1lOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBzaG9ydCB2b2x1bWU7CiAjaWZuZGVmIE1lZGlhR2V0RWZmZWN0aXZlVm9sdW1lCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFHZXRFZmZlY3RpdmVWb2x1bWUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhR2V0RWZmZWN0aXZlVm9sdW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYUdldEVmZmVjdGl2ZVZvbHVtZShtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdm9sdW1lKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICB2b2x1bWUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYUdldEVmZmVjdGl2ZVZvbHVtZShtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdm9sdW1lKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhR2V0U291bmRMZXZlbE1ldGVyaW5nRW5hYmxlZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JQm9vbGVhbiBlbmFibGVkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBCb29sZWFuIGVuYWJsZWQ7CiAjaWZuZGVmIE1lZGlhR2V0U291bmRMZXZlbE1ldGVyaW5nRW5hYmxlZAotCVB5TWFjX1BSRUNIRUNLKE1lZGlhR2V0U291bmRMZXZlbE1ldGVyaW5nRW5hYmxlZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFHZXRTb3VuZExldmVsTWV0ZXJpbmdFbmFibGVkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYUdldFNvdW5kTGV2ZWxNZXRlcmluZ0VuYWJsZWQobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmFibGVkKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBlbmFibGVkKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFHZXRTb3VuZExldmVsTWV0ZXJpbmdFbmFibGVkKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5hYmxlZCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFTZXRTb3VuZExldmVsTWV0ZXJpbmdFbmFibGVkKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlCb29sZWFuIGVuYWJsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgQm9vbGVhbiBlbmFibGU7CiAjaWZuZGVmIE1lZGlhU2V0U291bmRMZXZlbE1ldGVyaW5nRW5hYmxlZAotCVB5TWFjX1BSRUNIRUNLKE1lZGlhU2V0U291bmRMZXZlbE1ldGVyaW5nRW5hYmxlZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFTZXRTb3VuZExldmVsTWV0ZXJpbmdFbmFibGVkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmZW5hYmxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFTZXRTb3VuZExldmVsTWV0ZXJpbmdFbmFibGVkKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5hYmxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFTZXRTb3VuZExldmVsTWV0ZXJpbmdFbmFibGVkKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhR2V0RWZmZWN0aXZlU291bmRCYWxhbmNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlzaG9ydCBiYWxhbmNlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBzaG9ydCBiYWxhbmNlOwogI2lmbmRlZiBNZWRpYUdldEVmZmVjdGl2ZVNvdW5kQmFsYW5jZQotCVB5TWFjX1BSRUNIRUNLKE1lZGlhR2V0RWZmZWN0aXZlU291bmRCYWxhbmNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYUdldEVmZmVjdGl2ZVNvdW5kQmFsYW5jZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFHZXRFZmZlY3RpdmVTb3VuZEJhbGFuY2UobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJhbGFuY2UpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGJhbGFuY2UpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYUdldEVmZmVjdGl2ZVNvdW5kQmFsYW5jZShtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYmFsYW5jZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgYmFsYW5jZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFTZXRTY3JlZW5Mb2NrKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlCb29sZWFuIGxvY2tJdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgQm9vbGVhbiBsb2NrSXQ7CiAjaWZuZGVmIE1lZGlhU2V0U2NyZWVuTG9jawotCVB5TWFjX1BSRUNIRUNLKE1lZGlhU2V0U2NyZWVuTG9jayk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFTZXRTY3JlZW5Mb2NrKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmbG9ja0l0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFTZXRTY3JlZW5Mb2NrKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBsb2NrSXQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbG9ja0l0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFTZXRTY3JlZW5Mb2NrKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NrSXQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhR2V0RXJyb3JTdHJpbmcoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCUNvbXBvbmVudFJlc3VsdCB0aGVFcnJvcjsKLQlTdHIyNTUgZXJyb3JTdHJpbmc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIENvbXBvbmVudFJlc3VsdCB0aGVFcnJvcjsKKyAgICBTdHIyNTUgZXJyb3JTdHJpbmc7CiAjaWZuZGVmIE1lZGlhR2V0RXJyb3JTdHJpbmcKLQlQeU1hY19QUkVDSEVDSyhNZWRpYUdldEVycm9yU3RyaW5nKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYUdldEVycm9yU3RyaW5nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aGVFcnJvciwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBlcnJvclN0cmluZykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhR2V0RXJyb3JTdHJpbmcobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVFcnJvciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yU3RyaW5nKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgZXJyb3JTdHJpbmcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYUdldEVycm9yU3RyaW5nKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvclN0cmluZyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFHZXRTb3VuZEVxdWFsaXplckJhbmRMZXZlbHMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCVVJbnQ4IGJhbmRMZXZlbHM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIFVJbnQ4IGJhbmRMZXZlbHM7CiAjaWZuZGVmIE1lZGlhR2V0U291bmRFcXVhbGl6ZXJCYW5kTGV2ZWxzCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFHZXRTb3VuZEVxdWFsaXplckJhbmRMZXZlbHMpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhR2V0U291bmRFcXVhbGl6ZXJCYW5kTGV2ZWxzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYUdldFNvdW5kRXF1YWxpemVyQmFuZExldmVscyhtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYmFuZExldmVscyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgYmFuZExldmVscyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhR2V0U291bmRFcXVhbGl6ZXJCYW5kTGV2ZWxzKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZiYW5kTGV2ZWxzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiYW5kTGV2ZWxzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYURvSWRsZUFjdGlvbnMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKICNpZm5kZWYgTWVkaWFEb0lkbGVBY3Rpb25zCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFEb0lkbGVBY3Rpb25zKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYURvSWRsZUFjdGlvbnMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhRG9JZGxlQWN0aW9ucyhtaCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhRG9JZGxlQWN0aW9ucyhtaCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFTZXRTb3VuZEJhc3NBbmRUcmVibGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCXNob3J0IGJhc3M7Ci0Jc2hvcnQgdHJlYmxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBzaG9ydCBiYXNzOworICAgIHNob3J0IHRyZWJsZTsKICNpZm5kZWYgTWVkaWFTZXRTb3VuZEJhc3NBbmRUcmVibGUKLQlQeU1hY19QUkVDSEVDSyhNZWRpYVNldFNvdW5kQmFzc0FuZFRyZWJsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFTZXRTb3VuZEJhc3NBbmRUcmVibGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmYmFzcywKLQkgICAgICAgICAgICAgICAgICAgICAgJnRyZWJsZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhU2V0U291bmRCYXNzQW5kVHJlYmxlKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJlYmxlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZiYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdHJlYmxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFTZXRTb3VuZEJhc3NBbmRUcmVibGUobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmVibGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhR2V0U291bmRCYXNzQW5kVHJlYmxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlzaG9ydCBiYXNzOwotCXNob3J0IHRyZWJsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgc2hvcnQgYmFzczsKKyAgICBzaG9ydCB0cmVibGU7CiAjaWZuZGVmIE1lZGlhR2V0U291bmRCYXNzQW5kVHJlYmxlCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFHZXRTb3VuZEJhc3NBbmRUcmVibGUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhR2V0U291bmRCYXNzQW5kVHJlYmxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYUdldFNvdW5kQmFzc0FuZFRyZWJsZShtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYmFzcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHJlYmxlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGhoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgYmFzcywKLQkgICAgICAgICAgICAgICAgICAgICB0cmVibGUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYUdldFNvdW5kQmFzc0FuZFRyZWJsZShtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYmFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHJlYmxlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgYmFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICB0cmVibGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhVGltZUJhc2VDaGFuZ2VkKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CiAjaWZuZGVmIE1lZGlhVGltZUJhc2VDaGFuZ2VkCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFUaW1lQmFzZUNoYW5nZWQpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhVGltZUJhc2VDaGFuZ2VkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYVRpbWVCYXNlQ2hhbmdlZChtaCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhVGltZUJhc2VDaGFuZ2VkKG1oKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYU1DSXNQbGF5ZXJFdmVudChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JRXZlbnRSZWNvcmQgZTsKLQlCb29sZWFuIGhhbmRsZWRJdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgRXZlbnRSZWNvcmQgZTsKKyAgICBCb29sZWFuIGhhbmRsZWRJdDsKICNpZm5kZWYgTWVkaWFNQ0lzUGxheWVyRXZlbnQKLQlQeU1hY19QUkVDSEVDSyhNZWRpYU1DSXNQbGF5ZXJFdmVudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFNQ0lzUGxheWVyRXZlbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRFdmVudFJlY29yZCwgJmUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYU1DSXNQbGF5ZXJFdmVudChtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmaGFuZGxlZEl0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBoYW5kbGVkSXQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RXZlbnRSZWNvcmQsICZlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFNQ0lzUGxheWVyRXZlbnQobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhhbmRsZWRJdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlZEl0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYUdldE1lZGlhTG9hZFN0YXRlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlsb25nIG1lZGlhTG9hZFN0YXRlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBsb25nIG1lZGlhTG9hZFN0YXRlOwogI2lmbmRlZiBNZWRpYUdldE1lZGlhTG9hZFN0YXRlCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFHZXRNZWRpYUxvYWRTdGF0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFHZXRNZWRpYUxvYWRTdGF0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFHZXRNZWRpYUxvYWRTdGF0ZShtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZWRpYUxvYWRTdGF0ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgbWVkaWFMb2FkU3RhdGUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYUdldE1lZGlhTG9hZFN0YXRlKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lZGlhTG9hZFN0YXRlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUxvYWRTdGF0ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFWaWRlb091dHB1dENoYW5nZWQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCUNvbXBvbmVudEluc3RhbmNlIHZvdXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIENvbXBvbmVudEluc3RhbmNlIHZvdXQ7CiAjaWZuZGVmIE1lZGlhVmlkZW9PdXRwdXRDaGFuZ2VkCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFWaWRlb091dHB1dENoYW5nZWQpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhVmlkZW9PdXRwdXRDaGFuZ2VkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdm91dCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhVmlkZW9PdXRwdXRDaGFuZ2VkKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvdXQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdm91dCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhVmlkZW9PdXRwdXRDaGFuZ2VkKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvdXQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhRW1wdHlTYW1wbGVDYWNoZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JbG9uZyBzYW1wbGVOdW07Ci0JbG9uZyBzYW1wbGVDb3VudDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgbG9uZyBzYW1wbGVOdW07CisgICAgbG9uZyBzYW1wbGVDb3VudDsKICNpZm5kZWYgTWVkaWFFbXB0eVNhbXBsZUNhY2hlCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFFbXB0eVNhbXBsZUNhY2hlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYUVtcHR5U2FtcGxlQ2FjaGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlQ291bnQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYUVtcHR5U2FtcGxlQ2FjaGUobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZU51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlQ291bnQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZU51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZUNvdW50KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFFbXB0eVNhbXBsZUNhY2hlKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZUNvdW50KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYUdldFB1YmxpY0luZm8oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCU9TVHlwZSBpbmZvU2VsZWN0b3I7Ci0Jdm9pZCAqIGluZm9EYXRhUHRyOwotCVNpemUgaW9EYXRhU2l6ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgT1NUeXBlIGluZm9TZWxlY3RvcjsKKyAgICB2b2lkICogaW5mb0RhdGFQdHI7CisgICAgU2l6ZSBpb0RhdGFTaXplOwogI2lmbmRlZiBNZWRpYUdldFB1YmxpY0luZm8KLQlQeU1hY19QUkVDSEVDSyhNZWRpYUdldFB1YmxpY0luZm8pOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhR2V0UHVibGljSW5mbyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mcyIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpbmZvU2VsZWN0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbmZvRGF0YVB0cikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhR2V0UHVibGljSW5mbyhtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb1NlbGVjdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvRGF0YVB0ciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJmlvRGF0YVNpemUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGlvRGF0YVNpemUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmluZm9TZWxlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZm9EYXRhUHRyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFHZXRQdWJsaWNJbmZvKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvU2VsZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9EYXRhUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW9EYXRhU2l6ZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW9EYXRhU2l6ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFTZXRQdWJsaWNJbmZvKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlPU1R5cGUgaW5mb1NlbGVjdG9yOwotCXZvaWQgKiBpbmZvRGF0YVB0cjsKLQlTaXplIGRhdGFTaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBPU1R5cGUgaW5mb1NlbGVjdG9yOworICAgIHZvaWQgKiBpbmZvRGF0YVB0cjsKKyAgICBTaXplIGRhdGFTaXplOwogI2lmbmRlZiBNZWRpYVNldFB1YmxpY0luZm8KLQlQeU1hY19QUkVDSEVDSyhNZWRpYVNldFB1YmxpY0luZm8pOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhU2V0UHVibGljSW5mbyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mc2wiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaW5mb1NlbGVjdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5mb0RhdGFQdHIsCi0JICAgICAgICAgICAgICAgICAgICAgICZkYXRhU2l6ZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhU2V0UHVibGljSW5mbyhtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb1NlbGVjdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvRGF0YVB0ciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVNpemUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZzbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpbmZvU2VsZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmZvRGF0YVB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFTaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFTZXRQdWJsaWNJbmZvKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvU2VsZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9EYXRhUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhU2l6ZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFSZWZDb25TZXRQcm9wZXJ0eShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JbG9uZyByZWZDb247Ci0JbG9uZyBwcm9wZXJ0eVR5cGU7Ci0Jdm9pZCAqIHByb3BlcnR5VmFsdWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIGxvbmcgcmVmQ29uOworICAgIGxvbmcgcHJvcGVydHlUeXBlOworICAgIHZvaWQgKiBwcm9wZXJ0eVZhbHVlOwogI2lmbmRlZiBNZWRpYVJlZkNvblNldFByb3BlcnR5Ci0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFSZWZDb25TZXRQcm9wZXJ0eSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFSZWZDb25TZXRQcm9wZXJ0eSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxscyIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVmQ29uLAotCSAgICAgICAgICAgICAgICAgICAgICAmcHJvcGVydHlUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAmcHJvcGVydHlWYWx1ZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhUmVmQ29uU2V0UHJvcGVydHkobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZDb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVZhbHVlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxscyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVmQ29uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJvcGVydHlUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJvcGVydHlWYWx1ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhUmVmQ29uU2V0UHJvcGVydHkobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZDb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVZhbHVlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYVJlZkNvbkdldFByb3BlcnR5KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlsb25nIHJlZkNvbjsKLQlsb25nIHByb3BlcnR5VHlwZTsKLQl2b2lkICogcHJvcGVydHlWYWx1ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgbG9uZyByZWZDb247CisgICAgbG9uZyBwcm9wZXJ0eVR5cGU7CisgICAgdm9pZCAqIHByb3BlcnR5VmFsdWU7CiAjaWZuZGVmIE1lZGlhUmVmQ29uR2V0UHJvcGVydHkKLQlQeU1hY19QUkVDSEVDSyhNZWRpYVJlZkNvbkdldFByb3BlcnR5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYVJlZkNvbkdldFByb3BlcnR5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGxzIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZWZDb24sCi0JICAgICAgICAgICAgICAgICAgICAgICZwcm9wZXJ0eVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZwcm9wZXJ0eVZhbHVlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFSZWZDb25HZXRQcm9wZXJ0eShtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZkNvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5VHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5VmFsdWUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGxzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWZDb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwcm9wZXJ0eVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwcm9wZXJ0eVZhbHVlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFSZWZDb25HZXRQcm9wZXJ0eShtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZkNvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5VmFsdWUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhTmF2aWdhdGVUYXJnZXRSZWZDb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCWxvbmcgbmF2aWdhdGlvbjsKLQlsb25nIHJlZkNvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgbG9uZyBuYXZpZ2F0aW9uOworICAgIGxvbmcgcmVmQ29uOwogI2lmbmRlZiBNZWRpYU5hdmlnYXRlVGFyZ2V0UmVmQ29uCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFOYXZpZ2F0ZVRhcmdldFJlZkNvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFOYXZpZ2F0ZVRhcmdldFJlZkNvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm5hdmlnYXRpb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYU5hdmlnYXRlVGFyZ2V0UmVmQ29uKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWZDb24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHJlZkNvbik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZuYXZpZ2F0aW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFOYXZpZ2F0ZVRhcmdldFJlZkNvbihtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVmQ29uKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZWZDb24pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhR0dldElkbGVNYW5hZ2VyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlJZGxlTWFuYWdlciBwaW07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIElkbGVNYW5hZ2VyIHBpbTsKICNpZm5kZWYgTWVkaWFHR2V0SWRsZU1hbmFnZXIKLQlQeU1hY19QUkVDSEVDSyhNZWRpYUdHZXRJZGxlTWFuYWdlcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFHR2V0SWRsZU1hbmFnZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhR0dldElkbGVNYW5hZ2VyKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZwaW0pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBJZGxlTWFuYWdlck9ial9OZXcsIHBpbSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhR0dldElkbGVNYW5hZ2VyKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwaW0pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBJZGxlTWFuYWdlck9ial9OZXcsIHBpbSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFHU2V0SWRsZU1hbmFnZXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCUlkbGVNYW5hZ2VyIGltOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBJZGxlTWFuYWdlciBpbTsKICNpZm5kZWYgTWVkaWFHU2V0SWRsZU1hbmFnZXIKLQlQeU1hY19QUkVDSEVDSyhNZWRpYUdTZXRJZGxlTWFuYWdlcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFHU2V0SWRsZU1hbmFnZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICBJZGxlTWFuYWdlck9ial9Db252ZXJ0LCAmaW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYUdTZXRJZGxlTWFuYWdlcihtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBpbSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICBJZGxlTWFuYWdlck9ial9Db252ZXJ0LCAmaW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYUdTZXRJZGxlTWFuYWdlcihtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfUVRNSURJR2V0TUlESVBvcnRzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVFUTUlESUNvbXBvbmVudCBjaTsKLQlRVE1JRElQb3J0TGlzdEhhbmRsZSBpbnB1dFBvcnRzOwotCVFUTUlESVBvcnRMaXN0SGFuZGxlIG91dHB1dFBvcnRzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFFUTUlESUNvbXBvbmVudCBjaTsKKyAgICBRVE1JRElQb3J0TGlzdEhhbmRsZSBpbnB1dFBvcnRzOworICAgIFFUTUlESVBvcnRMaXN0SGFuZGxlIG91dHB1dFBvcnRzOwogI2lmbmRlZiBRVE1JRElHZXRNSURJUG9ydHMKLQlQeU1hY19QUkVDSEVDSyhRVE1JRElHZXRNSURJUG9ydHMpOworICAgIFB5TWFjX1BSRUNIRUNLKFFUTUlESUdldE1JRElQb3J0cyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gUVRNSURJR2V0TUlESVBvcnRzKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmaW5wdXRQb3J0cywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dFBvcnRzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBpbnB1dFBvcnRzLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIG91dHB1dFBvcnRzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gUVRNSURJR2V0TUlESVBvcnRzKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5wdXRQb3J0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dFBvcnRzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBpbnB1dFBvcnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIG91dHB1dFBvcnRzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9RVE1JRElVc2VTZW5kUG9ydChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlRVE1JRElDb21wb25lbnQgY2k7Ci0JbG9uZyBwb3J0SW5kZXg7Ci0JbG9uZyBpblVzZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBRVE1JRElDb21wb25lbnQgY2k7CisgICAgbG9uZyBwb3J0SW5kZXg7CisgICAgbG9uZyBpblVzZTsKICNpZm5kZWYgUVRNSURJVXNlU2VuZFBvcnQKLQlQeU1hY19QUkVDSEVDSyhRVE1JRElVc2VTZW5kUG9ydCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUVRNSURJVXNlU2VuZFBvcnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmcG9ydEluZGV4LAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5Vc2UpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBRVE1JRElVc2VTZW5kUG9ydChjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICBwb3J0SW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgaW5Vc2UpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBvcnRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluVXNlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gUVRNSURJVXNlU2VuZFBvcnQoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluVXNlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9RVE1JRElTZW5kTUlESShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlRVE1JRElDb21wb25lbnQgY2k7Ci0JbG9uZyBwb3J0SW5kZXg7Ci0JTXVzaWNNSURJUGFja2V0IG1wOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFFUTUlESUNvbXBvbmVudCBjaTsKKyAgICBsb25nIHBvcnRJbmRleDsKKyAgICBNdXNpY01JRElQYWNrZXQgbXA7CiAjaWZuZGVmIFFUTUlESVNlbmRNSURJCi0JUHlNYWNfUFJFQ0hFQ0soUVRNSURJU2VuZE1JREkpOworICAgIFB5TWFjX1BSRUNIRUNLKFFUTUlESVNlbmRNSURJKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZwb3J0SW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgIFF0TXVzaWNNSURJUGFja2V0X0NvbnZlcnQsICZtcCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFFUTUlESVNlbmRNSURJKGNpLAotCSAgICAgICAgICAgICAgICAgICAgIHBvcnRJbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICAmbXApOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwb3J0SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFF0TXVzaWNNSURJUGFja2V0X0NvbnZlcnQsICZtcCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFFUTUlESVNlbmRNSURJKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmbXApOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X011c2ljR2V0UGFydChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNdXNpY0NvbXBvbmVudCBtYzsKLQlsb25nIHBhcnQ7Ci0JbG9uZyBtaWRpQ2hhbm5lbDsKLQlsb25nIHBvbHlwaG9ueTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNdXNpY0NvbXBvbmVudCBtYzsKKyAgICBsb25nIHBhcnQ7CisgICAgbG9uZyBtaWRpQ2hhbm5lbDsKKyAgICBsb25nIHBvbHlwaG9ueTsKICNpZm5kZWYgTXVzaWNHZXRQYXJ0Ci0JUHlNYWNfUFJFQ0hFQ0soTXVzaWNHZXRQYXJ0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhNdXNpY0dldFBhcnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCi0JICAgICAgICAgICAgICAgICAgICAgICZwYXJ0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTXVzaWNHZXRQYXJ0KG1jLAotCSAgICAgICAgICAgICAgICAgICBwYXJ0LAotCSAgICAgICAgICAgICAgICAgICAmbWlkaUNoYW5uZWwsCi0JICAgICAgICAgICAgICAgICAgICZwb2x5cGhvbnkpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBtaWRpQ2hhbm5lbCwKLQkgICAgICAgICAgICAgICAgICAgICBwb2x5cGhvbnkpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFydCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE11c2ljR2V0UGFydChtYywKKyAgICAgICAgICAgICAgICAgICAgICAgcGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgJm1pZGlDaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAmcG9seXBob255KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgbWlkaUNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgcG9seXBob255KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NdXNpY1NldFBhcnQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTXVzaWNDb21wb25lbnQgbWM7Ci0JbG9uZyBwYXJ0OwotCWxvbmcgbWlkaUNoYW5uZWw7Ci0JbG9uZyBwb2x5cGhvbnk7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTXVzaWNDb21wb25lbnQgbWM7CisgICAgbG9uZyBwYXJ0OworICAgIGxvbmcgbWlkaUNoYW5uZWw7CisgICAgbG9uZyBwb2x5cGhvbnk7CiAjaWZuZGVmIE11c2ljU2V0UGFydAotCVB5TWFjX1BSRUNIRUNLKE11c2ljU2V0UGFydCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTXVzaWNTZXRQYXJ0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCi0JICAgICAgICAgICAgICAgICAgICAgICZwYXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICAmbWlkaUNoYW5uZWwsCi0JICAgICAgICAgICAgICAgICAgICAgICZwb2x5cGhvbnkpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNdXNpY1NldFBhcnQobWMsCi0JICAgICAgICAgICAgICAgICAgIHBhcnQsCi0JICAgICAgICAgICAgICAgICAgIG1pZGlDaGFubmVsLAotCSAgICAgICAgICAgICAgICAgICBwb2x5cGhvbnkpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWlkaUNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwb2x5cGhvbnkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNdXNpY1NldFBhcnQobWMsCisgICAgICAgICAgICAgICAgICAgICAgIHBhcnQsCisgICAgICAgICAgICAgICAgICAgICAgIG1pZGlDaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICBwb2x5cGhvbnkpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X011c2ljU2V0UGFydEluc3RydW1lbnROdW1iZXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTXVzaWNDb21wb25lbnQgbWM7Ci0JbG9uZyBwYXJ0OwotCWxvbmcgaW5zdHJ1bWVudE51bWJlcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNdXNpY0NvbXBvbmVudCBtYzsKKyAgICBsb25nIHBhcnQ7CisgICAgbG9uZyBpbnN0cnVtZW50TnVtYmVyOwogI2lmbmRlZiBNdXNpY1NldFBhcnRJbnN0cnVtZW50TnVtYmVyCi0JUHlNYWNfUFJFQ0hFQ0soTXVzaWNTZXRQYXJ0SW5zdHJ1bWVudE51bWJlcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTXVzaWNTZXRQYXJ0SW5zdHJ1bWVudE51bWJlcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCi0JICAgICAgICAgICAgICAgICAgICAgICZwYXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5zdHJ1bWVudE51bWJlcikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE11c2ljU2V0UGFydEluc3RydW1lbnROdW1iZXIobWMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdHJ1bWVudE51bWJlcik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluc3RydW1lbnROdW1iZXIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNdXNpY1NldFBhcnRJbnN0cnVtZW50TnVtYmVyKG1jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RydW1lbnROdW1iZXIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X011c2ljR2V0UGFydEluc3RydW1lbnROdW1iZXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTXVzaWNDb21wb25lbnQgbWM7Ci0JbG9uZyBwYXJ0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE11c2ljQ29tcG9uZW50IG1jOworICAgIGxvbmcgcGFydDsKICNpZm5kZWYgTXVzaWNHZXRQYXJ0SW5zdHJ1bWVudE51bWJlcgotCVB5TWFjX1BSRUNIRUNLKE11c2ljR2V0UGFydEluc3RydW1lbnROdW1iZXIpOworICAgIFB5TWFjX1BSRUNIRUNLKE11c2ljR2V0UGFydEluc3RydW1lbnROdW1iZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCi0JICAgICAgICAgICAgICAgICAgICAgICZwYXJ0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTXVzaWNHZXRQYXJ0SW5zdHJ1bWVudE51bWJlcihtYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFydCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE11c2ljR2V0UGFydEluc3RydW1lbnROdW1iZXIobWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NdXNpY1N0b3JlUGFydEluc3RydW1lbnQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTXVzaWNDb21wb25lbnQgbWM7Ci0JbG9uZyBwYXJ0OwotCWxvbmcgaW5zdHJ1bWVudE51bWJlcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNdXNpY0NvbXBvbmVudCBtYzsKKyAgICBsb25nIHBhcnQ7CisgICAgbG9uZyBpbnN0cnVtZW50TnVtYmVyOwogI2lmbmRlZiBNdXNpY1N0b3JlUGFydEluc3RydW1lbnQKLQlQeU1hY19QUkVDSEVDSyhNdXNpY1N0b3JlUGFydEluc3RydW1lbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKE11c2ljU3RvcmVQYXJ0SW5zdHJ1bWVudCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCi0JICAgICAgICAgICAgICAgICAgICAgICZwYXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5zdHJ1bWVudE51bWJlcikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE11c2ljU3RvcmVQYXJ0SW5zdHJ1bWVudChtYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdHJ1bWVudE51bWJlcik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluc3RydW1lbnROdW1iZXIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNdXNpY1N0b3JlUGFydEluc3RydW1lbnQobWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RydW1lbnROdW1iZXIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X011c2ljR2V0UGFydEF0b21pY0luc3RydW1lbnQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTXVzaWNDb21wb25lbnQgbWM7Ci0JbG9uZyBwYXJ0OwotCUF0b21pY0luc3RydW1lbnQgYWk7Ci0JbG9uZyBmbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNdXNpY0NvbXBvbmVudCBtYzsKKyAgICBsb25nIHBhcnQ7CisgICAgQXRvbWljSW5zdHJ1bWVudCBhaTsKKyAgICBsb25nIGZsYWdzOwogI2lmbmRlZiBNdXNpY0dldFBhcnRBdG9taWNJbnN0cnVtZW50Ci0JUHlNYWNfUFJFQ0hFQ0soTXVzaWNHZXRQYXJ0QXRvbWljSW5zdHJ1bWVudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTXVzaWNHZXRQYXJ0QXRvbWljSW5zdHJ1bWVudCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCi0JICAgICAgICAgICAgICAgICAgICAgICZwYXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNdXNpY0dldFBhcnRBdG9taWNJbnN0cnVtZW50KG1jLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgYWkpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE11c2ljR2V0UGFydEF0b21pY0luc3RydW1lbnQobWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBhaSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTXVzaWNTZXRQYXJ0QXRvbWljSW5zdHJ1bWVudChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNdXNpY0NvbXBvbmVudCBtYzsKLQlsb25nIHBhcnQ7Ci0JQXRvbWljSW5zdHJ1bWVudFB0ciBhaVA7Ci0JbG9uZyBmbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNdXNpY0NvbXBvbmVudCBtYzsKKyAgICBsb25nIHBhcnQ7CisgICAgQXRvbWljSW5zdHJ1bWVudFB0ciBhaVA7CisgICAgbG9uZyBmbGFnczsKICNpZm5kZWYgTXVzaWNTZXRQYXJ0QXRvbWljSW5zdHJ1bWVudAotCVB5TWFjX1BSRUNIRUNLKE11c2ljU2V0UGFydEF0b21pY0luc3RydW1lbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKE11c2ljU2V0UGFydEF0b21pY0luc3RydW1lbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsc2wiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYywKLQkgICAgICAgICAgICAgICAgICAgICAgJnBhcnQsCi0JICAgICAgICAgICAgICAgICAgICAgICZhaVAsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE11c2ljU2V0UGFydEF0b21pY0luc3RydW1lbnQobWMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlQLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbHNsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYWlQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNdXNpY1NldFBhcnRBdG9taWNJbnN0cnVtZW50KG1jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NdXNpY0dldFBhcnRLbm9iKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU11c2ljQ29tcG9uZW50IG1jOwotCWxvbmcgcGFydDsKLQlsb25nIGtub2JJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNdXNpY0NvbXBvbmVudCBtYzsKKyAgICBsb25nIHBhcnQ7CisgICAgbG9uZyBrbm9iSUQ7CiAjaWZuZGVmIE11c2ljR2V0UGFydEtub2IKLQlQeU1hY19QUkVDSEVDSyhNdXNpY0dldFBhcnRLbm9iKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNdXNpY0dldFBhcnRLbm9iKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYywKLQkgICAgICAgICAgICAgICAgICAgICAgJnBhcnQsCi0JICAgICAgICAgICAgICAgICAgICAgICZrbm9iSUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNdXNpY0dldFBhcnRLbm9iKG1jLAotCSAgICAgICAgICAgICAgICAgICAgICAgcGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgIGtub2JJRCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmtub2JJRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE11c2ljR2V0UGFydEtub2IobWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAga25vYklEKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NdXNpY1NldFBhcnRLbm9iKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU11c2ljQ29tcG9uZW50IG1jOwotCWxvbmcgcGFydDsKLQlsb25nIGtub2JJRDsKLQlsb25nIGtub2JWYWx1ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNdXNpY0NvbXBvbmVudCBtYzsKKyAgICBsb25nIHBhcnQ7CisgICAgbG9uZyBrbm9iSUQ7CisgICAgbG9uZyBrbm9iVmFsdWU7CiAjaWZuZGVmIE11c2ljU2V0UGFydEtub2IKLQlQeU1hY19QUkVDSEVDSyhNdXNpY1NldFBhcnRLbm9iKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNdXNpY1NldFBhcnRLbm9iKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCi0JICAgICAgICAgICAgICAgICAgICAgICZwYXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICAma25vYklELAotCSAgICAgICAgICAgICAgICAgICAgICAma25vYlZhbHVlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTXVzaWNTZXRQYXJ0S25vYihtYywKLQkgICAgICAgICAgICAgICAgICAgICAgIHBhcnQsCi0JICAgICAgICAgICAgICAgICAgICAgICBrbm9iSUQsCi0JICAgICAgICAgICAgICAgICAgICAgICBrbm9iVmFsdWUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAma25vYklELAorICAgICAgICAgICAgICAgICAgICAgICAgICAma25vYlZhbHVlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTXVzaWNTZXRQYXJ0S25vYihtYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBrbm9iSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBrbm9iVmFsdWUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X011c2ljR2V0S25vYihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNdXNpY0NvbXBvbmVudCBtYzsKLQlsb25nIGtub2JJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNdXNpY0NvbXBvbmVudCBtYzsKKyAgICBsb25nIGtub2JJRDsKICNpZm5kZWYgTXVzaWNHZXRLbm9iCi0JUHlNYWNfUFJFQ0hFQ0soTXVzaWNHZXRLbm9iKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNdXNpY0dldEtub2IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCi0JICAgICAgICAgICAgICAgICAgICAgICZrbm9iSUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNdXNpY0dldEtub2IobWMsCi0JICAgICAgICAgICAgICAgICAgIGtub2JJRCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZrbm9iSUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNdXNpY0dldEtub2IobWMsCisgICAgICAgICAgICAgICAgICAgICAgIGtub2JJRCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTXVzaWNTZXRLbm9iKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU11c2ljQ29tcG9uZW50IG1jOwotCWxvbmcga25vYklEOwotCWxvbmcga25vYlZhbHVlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE11c2ljQ29tcG9uZW50IG1jOworICAgIGxvbmcga25vYklEOworICAgIGxvbmcga25vYlZhbHVlOwogI2lmbmRlZiBNdXNpY1NldEtub2IKLQlQeU1hY19QUkVDSEVDSyhNdXNpY1NldEtub2IpOworICAgIFB5TWFjX1BSRUNIRUNLKE11c2ljU2V0S25vYik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCi0JICAgICAgICAgICAgICAgICAgICAgICZrbm9iSUQsCi0JICAgICAgICAgICAgICAgICAgICAgICZrbm9iVmFsdWUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNdXNpY1NldEtub2IobWMsCi0JICAgICAgICAgICAgICAgICAgIGtub2JJRCwKLQkgICAgICAgICAgICAgICAgICAga25vYlZhbHVlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZrbm9iSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZrbm9iVmFsdWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNdXNpY1NldEtub2IobWMsCisgICAgICAgICAgICAgICAgICAgICAgIGtub2JJRCwKKyAgICAgICAgICAgICAgICAgICAgICAga25vYlZhbHVlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NdXNpY0dldFBhcnROYW1lKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU11c2ljQ29tcG9uZW50IG1jOwotCWxvbmcgcGFydDsKLQlTdHJpbmdQdHIgbmFtZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNdXNpY0NvbXBvbmVudCBtYzsKKyAgICBsb25nIHBhcnQ7CisgICAgU3RyaW5nUHRyIG5hbWU7CiAjaWZuZGVmIE11c2ljR2V0UGFydE5hbWUKLQlQeU1hY19QUkVDSEVDSyhNdXNpY0dldFBhcnROYW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNdXNpY0dldFBhcnROYW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbHMiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYywKLQkgICAgICAgICAgICAgICAgICAgICAgJnBhcnQsCi0JICAgICAgICAgICAgICAgICAgICAgICZuYW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTXVzaWNHZXRQYXJ0TmFtZShtYywKLQkgICAgICAgICAgICAgICAgICAgICAgIHBhcnQsCi0JICAgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE11c2ljR2V0UGFydE5hbWUobWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTXVzaWNTZXRQYXJ0TmFtZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNdXNpY0NvbXBvbmVudCBtYzsKLQlsb25nIHBhcnQ7Ci0JU3RyaW5nUHRyIG5hbWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTXVzaWNDb21wb25lbnQgbWM7CisgICAgbG9uZyBwYXJ0OworICAgIFN0cmluZ1B0ciBuYW1lOwogI2lmbmRlZiBNdXNpY1NldFBhcnROYW1lCi0JUHlNYWNfUFJFQ0hFQ0soTXVzaWNTZXRQYXJ0TmFtZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTXVzaWNTZXRQYXJ0TmFtZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxzIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCi0JICAgICAgICAgICAgICAgICAgICAgICZwYXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICAmbmFtZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE11c2ljU2V0UGFydE5hbWUobWMsCi0JICAgICAgICAgICAgICAgICAgICAgICBwYXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZscyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNdXNpY1NldFBhcnROYW1lKG1jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X011c2ljUGxheU5vdGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTXVzaWNDb21wb25lbnQgbWM7Ci0JbG9uZyBwYXJ0OwotCWxvbmcgcGl0Y2g7Ci0JbG9uZyB2ZWxvY2l0eTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNdXNpY0NvbXBvbmVudCBtYzsKKyAgICBsb25nIHBhcnQ7CisgICAgbG9uZyBwaXRjaDsKKyAgICBsb25nIHZlbG9jaXR5OwogI2lmbmRlZiBNdXNpY1BsYXlOb3RlCi0JUHlNYWNfUFJFQ0hFQ0soTXVzaWNQbGF5Tm90ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTXVzaWNQbGF5Tm90ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1jLAotCSAgICAgICAgICAgICAgICAgICAgICAmcGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnBpdGNoLAotCSAgICAgICAgICAgICAgICAgICAgICAmdmVsb2NpdHkpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNdXNpY1BsYXlOb3RlKG1jLAotCSAgICAgICAgICAgICAgICAgICAgcGFydCwKLQkgICAgICAgICAgICAgICAgICAgIHBpdGNoLAotCSAgICAgICAgICAgICAgICAgICAgdmVsb2NpdHkpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2ZWxvY2l0eSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE11c2ljUGxheU5vdGUobWMsCisgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgcGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICB2ZWxvY2l0eSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTXVzaWNSZXNldFBhcnQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTXVzaWNDb21wb25lbnQgbWM7Ci0JbG9uZyBwYXJ0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE11c2ljQ29tcG9uZW50IG1jOworICAgIGxvbmcgcGFydDsKICNpZm5kZWYgTXVzaWNSZXNldFBhcnQKLQlQeU1hY19QUkVDSEVDSyhNdXNpY1Jlc2V0UGFydCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTXVzaWNSZXNldFBhcnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCi0JICAgICAgICAgICAgICAgICAgICAgICZwYXJ0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTXVzaWNSZXNldFBhcnQobWMsCi0JICAgICAgICAgICAgICAgICAgICAgcGFydCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJ0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTXVzaWNSZXNldFBhcnQobWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgcGFydCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTXVzaWNTZXRQYXJ0Q29udHJvbGxlcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNdXNpY0NvbXBvbmVudCBtYzsKLQlsb25nIHBhcnQ7Ci0JTXVzaWNDb250cm9sbGVyIGNvbnRyb2xsZXJOdW1iZXI7Ci0JbG9uZyBjb250cm9sbGVyVmFsdWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTXVzaWNDb21wb25lbnQgbWM7CisgICAgbG9uZyBwYXJ0OworICAgIE11c2ljQ29udHJvbGxlciBjb250cm9sbGVyTnVtYmVyOworICAgIGxvbmcgY29udHJvbGxlclZhbHVlOwogI2lmbmRlZiBNdXNpY1NldFBhcnRDb250cm9sbGVyCi0JUHlNYWNfUFJFQ0hFQ0soTXVzaWNTZXRQYXJ0Q29udHJvbGxlcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTXVzaWNTZXRQYXJ0Q29udHJvbGxlcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1jLAotCSAgICAgICAgICAgICAgICAgICAgICAmcGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNvbnRyb2xsZXJOdW1iZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICZjb250cm9sbGVyVmFsdWUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNdXNpY1NldFBhcnRDb250cm9sbGVyKG1jLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXJOdW1iZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyVmFsdWUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY29udHJvbGxlck51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbnRyb2xsZXJWYWx1ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE11c2ljU2V0UGFydENvbnRyb2xsZXIobWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlck51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXJWYWx1ZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTXVzaWNHZXRQYXJ0Q29udHJvbGxlcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNdXNpY0NvbXBvbmVudCBtYzsKLQlsb25nIHBhcnQ7Ci0JTXVzaWNDb250cm9sbGVyIGNvbnRyb2xsZXJOdW1iZXI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTXVzaWNDb21wb25lbnQgbWM7CisgICAgbG9uZyBwYXJ0OworICAgIE11c2ljQ29udHJvbGxlciBjb250cm9sbGVyTnVtYmVyOwogI2lmbmRlZiBNdXNpY0dldFBhcnRDb250cm9sbGVyCi0JUHlNYWNfUFJFQ0hFQ0soTXVzaWNHZXRQYXJ0Q29udHJvbGxlcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTXVzaWNHZXRQYXJ0Q29udHJvbGxlcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCi0JICAgICAgICAgICAgICAgICAgICAgICZwYXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICAmY29udHJvbGxlck51bWJlcikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE11c2ljR2V0UGFydENvbnRyb2xsZXIobWMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlck51bWJlcik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbnRyb2xsZXJOdW1iZXIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNdXNpY0dldFBhcnRDb250cm9sbGVyKG1jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXJOdW1iZXIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X011c2ljR2V0SW5zdHJ1bWVudE5hbWVzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU11c2ljQ29tcG9uZW50IG1jOwotCWxvbmcgbW9kaWZpYWJsZUluc3RydW1lbnRzOwotCUhhbmRsZSBpbnN0cnVtZW50TmFtZXM7Ci0JSGFuZGxlIGluc3RydW1lbnRDYXRlZ29yeUxhc3RzOwotCUhhbmRsZSBpbnN0cnVtZW50Q2F0ZWdvcnlOYW1lczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNdXNpY0NvbXBvbmVudCBtYzsKKyAgICBsb25nIG1vZGlmaWFibGVJbnN0cnVtZW50czsKKyAgICBIYW5kbGUgaW5zdHJ1bWVudE5hbWVzOworICAgIEhhbmRsZSBpbnN0cnVtZW50Q2F0ZWdvcnlMYXN0czsKKyAgICBIYW5kbGUgaW5zdHJ1bWVudENhdGVnb3J5TmFtZXM7CiAjaWZuZGVmIE11c2ljR2V0SW5zdHJ1bWVudE5hbWVzCi0JUHlNYWNfUFJFQ0hFQ0soTXVzaWNHZXRJbnN0cnVtZW50TmFtZXMpOworICAgIFB5TWFjX1BSRUNIRUNLKE11c2ljR2V0SW5zdHJ1bWVudE5hbWVzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1jLAotCSAgICAgICAgICAgICAgICAgICAgICAmbW9kaWZpYWJsZUluc3RydW1lbnRzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTXVzaWNHZXRJbnN0cnVtZW50TmFtZXMobWMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpYWJsZUluc3RydW1lbnRzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnN0cnVtZW50TmFtZXMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluc3RydW1lbnRDYXRlZ29yeUxhc3RzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnN0cnVtZW50Q2F0ZWdvcnlOYW1lcyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBpbnN0cnVtZW50TmFtZXMsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgaW5zdHJ1bWVudENhdGVnb3J5TGFzdHMsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgaW5zdHJ1bWVudENhdGVnb3J5TmFtZXMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbW9kaWZpYWJsZUluc3RydW1lbnRzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTXVzaWNHZXRJbnN0cnVtZW50TmFtZXMobWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpYWJsZUluc3RydW1lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnN0cnVtZW50TmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluc3RydW1lbnRDYXRlZ29yeUxhc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnN0cnVtZW50Q2F0ZWdvcnlOYW1lcyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBpbnN0cnVtZW50TmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgaW5zdHJ1bWVudENhdGVnb3J5TGFzdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgaW5zdHJ1bWVudENhdGVnb3J5TmFtZXMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X011c2ljR2V0RHJ1bU5hbWVzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU11c2ljQ29tcG9uZW50IG1jOwotCWxvbmcgbW9kaWZpYWJsZUluc3RydW1lbnRzOwotCUhhbmRsZSBpbnN0cnVtZW50TnVtYmVyczsKLQlIYW5kbGUgaW5zdHJ1bWVudE5hbWVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE11c2ljQ29tcG9uZW50IG1jOworICAgIGxvbmcgbW9kaWZpYWJsZUluc3RydW1lbnRzOworICAgIEhhbmRsZSBpbnN0cnVtZW50TnVtYmVyczsKKyAgICBIYW5kbGUgaW5zdHJ1bWVudE5hbWVzOwogI2lmbmRlZiBNdXNpY0dldERydW1OYW1lcwotCVB5TWFjX1BSRUNIRUNLKE11c2ljR2V0RHJ1bU5hbWVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNdXNpY0dldERydW1OYW1lcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYywKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vZGlmaWFibGVJbnN0cnVtZW50cykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE11c2ljR2V0RHJ1bU5hbWVzKG1jLAotCSAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWFibGVJbnN0cnVtZW50cywKLQkgICAgICAgICAgICAgICAgICAgICAgICAmaW5zdHJ1bWVudE51bWJlcnMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgJmluc3RydW1lbnROYW1lcyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgaW5zdHJ1bWVudE51bWJlcnMsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgaW5zdHJ1bWVudE5hbWVzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGlmaWFibGVJbnN0cnVtZW50cykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE11c2ljR2V0RHJ1bU5hbWVzKG1jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWFibGVJbnN0cnVtZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5zdHJ1bWVudE51bWJlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluc3RydW1lbnROYW1lcyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgaW5zdHJ1bWVudE51bWJlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgaW5zdHJ1bWVudE5hbWVzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NdXNpY0dldE1hc3RlclR1bmUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTXVzaWNDb21wb25lbnQgbWM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTXVzaWNDb21wb25lbnQgbWM7CiAjaWZuZGVmIE11c2ljR2V0TWFzdGVyVHVuZQotCVB5TWFjX1BSRUNIRUNLKE11c2ljR2V0TWFzdGVyVHVuZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTXVzaWNHZXRNYXN0ZXJUdW5lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNdXNpY0dldE1hc3RlclR1bmUobWMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNdXNpY0dldE1hc3RlclR1bmUobWMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X011c2ljU2V0TWFzdGVyVHVuZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNdXNpY0NvbXBvbmVudCBtYzsKLQlsb25nIG1hc3RlclR1bmU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTXVzaWNDb21wb25lbnQgbWM7CisgICAgbG9uZyBtYXN0ZXJUdW5lOwogI2lmbmRlZiBNdXNpY1NldE1hc3RlclR1bmUKLQlQeU1hY19QUkVDSEVDSyhNdXNpY1NldE1hc3RlclR1bmUpOworICAgIFB5TWFjX1BSRUNIRUNLKE11c2ljU2V0TWFzdGVyVHVuZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYywKLQkgICAgICAgICAgICAgICAgICAgICAgJm1hc3RlclR1bmUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNdXNpY1NldE1hc3RlclR1bmUobWMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIG1hc3RlclR1bmUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWFzdGVyVHVuZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE11c2ljU2V0TWFzdGVyVHVuZShtYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFzdGVyVHVuZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTXVzaWNHZXREZXZpY2VDb25uZWN0aW9uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU11c2ljQ29tcG9uZW50IG1jOwotCWxvbmcgaW5kZXg7Ci0JbG9uZyBpZDE7Ci0JbG9uZyBpZDI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTXVzaWNDb21wb25lbnQgbWM7CisgICAgbG9uZyBpbmRleDsKKyAgICBsb25nIGlkMTsKKyAgICBsb25nIGlkMjsKICNpZm5kZWYgTXVzaWNHZXREZXZpY2VDb25uZWN0aW9uCi0JUHlNYWNfUFJFQ0hFQ0soTXVzaWNHZXREZXZpY2VDb25uZWN0aW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNdXNpY0dldERldmljZUNvbm5lY3Rpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE11c2ljR2V0RGV2aWNlQ29ubmVjdGlvbihtYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpZDEsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpZDIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBpZDEsCi0JICAgICAgICAgICAgICAgICAgICAgaWQyKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZGV4KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTXVzaWNHZXREZXZpY2VDb25uZWN0aW9uKG1jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlkMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlkMik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGlkMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpZDIpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X011c2ljVXNlRGV2aWNlQ29ubmVjdGlvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNdXNpY0NvbXBvbmVudCBtYzsKLQlsb25nIGlkMTsKLQlsb25nIGlkMjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNdXNpY0NvbXBvbmVudCBtYzsKKyAgICBsb25nIGlkMTsKKyAgICBsb25nIGlkMjsKICNpZm5kZWYgTXVzaWNVc2VEZXZpY2VDb25uZWN0aW9uCi0JUHlNYWNfUFJFQ0hFQ0soTXVzaWNVc2VEZXZpY2VDb25uZWN0aW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNdXNpY1VzZURldmljZUNvbm5lY3Rpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1jLAotCSAgICAgICAgICAgICAgICAgICAgICAmaWQxLAotCSAgICAgICAgICAgICAgICAgICAgICAmaWQyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTXVzaWNVc2VEZXZpY2VDb25uZWN0aW9uKG1jLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDEsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkMik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaWQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaWQyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTXVzaWNVc2VEZXZpY2VDb25uZWN0aW9uKG1jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkMik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTXVzaWNHZXRLbm9iU2V0dGluZ1N0cmluZ3MoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTXVzaWNDb21wb25lbnQgbWM7Ci0JbG9uZyBrbm9iSW5kZXg7Ci0JbG9uZyBpc0dsb2JhbDsKLQlIYW5kbGUgc2V0dGluZ3NOYW1lczsKLQlIYW5kbGUgc2V0dGluZ3NDYXRlZ29yeUxhc3RzOwotCUhhbmRsZSBzZXR0aW5nc0NhdGVnb3J5TmFtZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTXVzaWNDb21wb25lbnQgbWM7CisgICAgbG9uZyBrbm9iSW5kZXg7CisgICAgbG9uZyBpc0dsb2JhbDsKKyAgICBIYW5kbGUgc2V0dGluZ3NOYW1lczsKKyAgICBIYW5kbGUgc2V0dGluZ3NDYXRlZ29yeUxhc3RzOworICAgIEhhbmRsZSBzZXR0aW5nc0NhdGVnb3J5TmFtZXM7CiAjaWZuZGVmIE11c2ljR2V0S25vYlNldHRpbmdTdHJpbmdzCi0JUHlNYWNfUFJFQ0hFQ0soTXVzaWNHZXRLbm9iU2V0dGluZ1N0cmluZ3MpOworICAgIFB5TWFjX1BSRUNIRUNLKE11c2ljR2V0S25vYlNldHRpbmdTdHJpbmdzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYywKLQkgICAgICAgICAgICAgICAgICAgICAgJmtub2JJbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlzR2xvYmFsKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTXVzaWNHZXRLbm9iU2V0dGluZ1N0cmluZ3MobWMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga25vYkluZGV4LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzR2xvYmFsLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXR0aW5nc05hbWVzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXR0aW5nc0NhdGVnb3J5TGFzdHMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNldHRpbmdzQ2F0ZWdvcnlOYW1lcyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBzZXR0aW5nc05hbWVzLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHNldHRpbmdzQ2F0ZWdvcnlMYXN0cywKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBzZXR0aW5nc0NhdGVnb3J5TmFtZXMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmtub2JJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlzR2xvYmFsKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTXVzaWNHZXRLbm9iU2V0dGluZ1N0cmluZ3MobWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga25vYkluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzR2xvYmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXR0aW5nc05hbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXR0aW5nc0NhdGVnb3J5TGFzdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNldHRpbmdzQ2F0ZWdvcnlOYW1lcyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBzZXR0aW5nc05hbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHNldHRpbmdzQ2F0ZWdvcnlMYXN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBzZXR0aW5nc0NhdGVnb3J5TmFtZXMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X011c2ljR2V0TUlESVBvcnRzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU11c2ljQ29tcG9uZW50IG1jOwotCWxvbmcgaW5wdXRQb3J0Q291bnQ7Ci0JbG9uZyBvdXRwdXRQb3J0Q291bnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTXVzaWNDb21wb25lbnQgbWM7CisgICAgbG9uZyBpbnB1dFBvcnRDb3VudDsKKyAgICBsb25nIG91dHB1dFBvcnRDb3VudDsKICNpZm5kZWYgTXVzaWNHZXRNSURJUG9ydHMKLQlQeU1hY19QUkVDSEVDSyhNdXNpY0dldE1JRElQb3J0cyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTXVzaWNHZXRNSURJUG9ydHMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE11c2ljR2V0TUlESVBvcnRzKG1jLAotCSAgICAgICAgICAgICAgICAgICAgICAgICZpbnB1dFBvcnRDb3VudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0UG9ydENvdW50KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgaW5wdXRQb3J0Q291bnQsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UG9ydENvdW50KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1jKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTXVzaWNHZXRNSURJUG9ydHMobWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlucHV0UG9ydENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXRQb3J0Q291bnQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFBvcnRDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQb3J0Q291bnQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X011c2ljU2VuZE1JREkoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTXVzaWNDb21wb25lbnQgbWM7Ci0JbG9uZyBwb3J0SW5kZXg7Ci0JTXVzaWNNSURJUGFja2V0IG1wOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE11c2ljQ29tcG9uZW50IG1jOworICAgIGxvbmcgcG9ydEluZGV4OworICAgIE11c2ljTUlESVBhY2tldCBtcDsKICNpZm5kZWYgTXVzaWNTZW5kTUlESQotCVB5TWFjX1BSRUNIRUNLKE11c2ljU2VuZE1JREkpOworICAgIFB5TWFjX1BSRUNIRUNLKE11c2ljU2VuZE1JREkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYywKLQkgICAgICAgICAgICAgICAgICAgICAgJnBvcnRJbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICAgUXRNdXNpY01JRElQYWNrZXRfQ29udmVydCwgJm1wKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTXVzaWNTZW5kTUlESShtYywKLQkgICAgICAgICAgICAgICAgICAgIHBvcnRJbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICZtcCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBvcnRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUXRNdXNpY01JRElQYWNrZXRfQ29udmVydCwgJm1wKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTXVzaWNTZW5kTUlESShtYywKKyAgICAgICAgICAgICAgICAgICAgICAgIHBvcnRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICZtcCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTXVzaWNTZXRPZmZsaW5lVGltZVRvKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU11c2ljQ29tcG9uZW50IG1jOwotCWxvbmcgbmV3VGltZVN0YW1wOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE11c2ljQ29tcG9uZW50IG1jOworICAgIGxvbmcgbmV3VGltZVN0YW1wOwogI2lmbmRlZiBNdXNpY1NldE9mZmxpbmVUaW1lVG8KLQlQeU1hY19QUkVDSEVDSyhNdXNpY1NldE9mZmxpbmVUaW1lVG8pOworICAgIFB5TWFjX1BSRUNIRUNLKE11c2ljU2V0T2ZmbGluZVRpbWVUbyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYywKLQkgICAgICAgICAgICAgICAgICAgICAgJm5ld1RpbWVTdGFtcCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE11c2ljU2V0T2ZmbGluZVRpbWVUbyhtYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3VGltZVN0YW1wKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld1RpbWVTdGFtcCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE11c2ljU2V0T2ZmbGluZVRpbWVUbyhtYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3VGltZVN0YW1wKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NdXNpY0dldEluZm9UZXh0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU11c2ljQ29tcG9uZW50IG1jOwotCWxvbmcgc2VsZWN0b3I7Ci0JSGFuZGxlIHRleHRIOwotCUhhbmRsZSBzdHlsZUg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTXVzaWNDb21wb25lbnQgbWM7CisgICAgbG9uZyBzZWxlY3RvcjsKKyAgICBIYW5kbGUgdGV4dEg7CisgICAgSGFuZGxlIHN0eWxlSDsKICNpZm5kZWYgTXVzaWNHZXRJbmZvVGV4dAotCVB5TWFjX1BSRUNIRUNLKE11c2ljR2V0SW5mb1RleHQpOworICAgIFB5TWFjX1BSRUNIRUNLKE11c2ljR2V0SW5mb1RleHQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCi0JICAgICAgICAgICAgICAgICAgICAgICZzZWxlY3RvcikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE11c2ljR2V0SW5mb1RleHQobWMsCi0JICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RvciwKLQkgICAgICAgICAgICAgICAgICAgICAgICZ0ZXh0SCwKLQkgICAgICAgICAgICAgICAgICAgICAgICZzdHlsZUgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHRleHRILAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHN0eWxlSCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzZWxlY3RvcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE11c2ljR2V0SW5mb1RleHQobWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZXh0SCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHlsZUgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHRleHRILAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHN0eWxlSCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTXVzaWNHZXRJbnN0cnVtZW50SW5mbyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNdXNpY0NvbXBvbmVudCBtYzsKLQlsb25nIGdldEluc3RydW1lbnRJbmZvRmxhZ3M7Ci0JSW5zdHJ1bWVudEluZm9MaXN0SGFuZGxlIGluZm9MaXN0SDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNdXNpY0NvbXBvbmVudCBtYzsKKyAgICBsb25nIGdldEluc3RydW1lbnRJbmZvRmxhZ3M7CisgICAgSW5zdHJ1bWVudEluZm9MaXN0SGFuZGxlIGluZm9MaXN0SDsKICNpZm5kZWYgTXVzaWNHZXRJbnN0cnVtZW50SW5mbwotCVB5TWFjX1BSRUNIRUNLKE11c2ljR2V0SW5zdHJ1bWVudEluZm8pOworICAgIFB5TWFjX1BSRUNIRUNLKE11c2ljR2V0SW5zdHJ1bWVudEluZm8pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCi0JICAgICAgICAgICAgICAgICAgICAgICZnZXRJbnN0cnVtZW50SW5mb0ZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTXVzaWNHZXRJbnN0cnVtZW50SW5mbyhtYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEluc3RydW1lbnRJbmZvRmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5mb0xpc3RIKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgaW5mb0xpc3RIKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmdldEluc3RydW1lbnRJbmZvRmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNdXNpY0dldEluc3RydW1lbnRJbmZvKG1jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0SW5zdHJ1bWVudEluZm9GbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmZvTGlzdEgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBpbmZvTGlzdEgpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X011c2ljVGFzayhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNdXNpY0NvbXBvbmVudCBtYzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNdXNpY0NvbXBvbmVudCBtYzsKICNpZm5kZWYgTXVzaWNUYXNrCi0JUHlNYWNfUFJFQ0hFQ0soTXVzaWNUYXNrKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNdXNpY1Rhc2spOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE11c2ljVGFzayhtYyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE11c2ljVGFzayhtYyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTXVzaWNTZXRQYXJ0SW5zdHJ1bWVudE51bWJlckludGVycnVwdFNhZmUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTXVzaWNDb21wb25lbnQgbWM7Ci0JbG9uZyBwYXJ0OwotCWxvbmcgaW5zdHJ1bWVudE51bWJlcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNdXNpY0NvbXBvbmVudCBtYzsKKyAgICBsb25nIHBhcnQ7CisgICAgbG9uZyBpbnN0cnVtZW50TnVtYmVyOwogI2lmbmRlZiBNdXNpY1NldFBhcnRJbnN0cnVtZW50TnVtYmVySW50ZXJydXB0U2FmZQotCVB5TWFjX1BSRUNIRUNLKE11c2ljU2V0UGFydEluc3RydW1lbnROdW1iZXJJbnRlcnJ1cHRTYWZlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNdXNpY1NldFBhcnRJbnN0cnVtZW50TnVtYmVySW50ZXJydXB0U2FmZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCi0JICAgICAgICAgICAgICAgICAgICAgICZwYXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5zdHJ1bWVudE51bWJlcikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE11c2ljU2V0UGFydEluc3RydW1lbnROdW1iZXJJbnRlcnJ1cHRTYWZlKG1jLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdHJ1bWVudE51bWJlcik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluc3RydW1lbnROdW1iZXIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNdXNpY1NldFBhcnRJbnN0cnVtZW50TnVtYmVySW50ZXJydXB0U2FmZShtYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RydW1lbnROdW1iZXIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X011c2ljU2V0UGFydFNvdW5kTG9jYWxpemF0aW9uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU11c2ljQ29tcG9uZW50IG1jOwotCWxvbmcgcGFydDsKLQlIYW5kbGUgZGF0YTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNdXNpY0NvbXBvbmVudCBtYzsKKyAgICBsb25nIHBhcnQ7CisgICAgSGFuZGxlIGRhdGE7CiAjaWZuZGVmIE11c2ljU2V0UGFydFNvdW5kTG9jYWxpemF0aW9uCi0JUHlNYWNfUFJFQ0hFQ0soTXVzaWNTZXRQYXJ0U291bmRMb2NhbGl6YXRpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKE11c2ljU2V0UGFydFNvdW5kTG9jYWxpemF0aW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCi0JICAgICAgICAgICAgICAgICAgICAgICZwYXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGEpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNdXNpY1NldFBhcnRTb3VuZExvY2FsaXphdGlvbihtYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNdXNpY1NldFBhcnRTb3VuZExvY2FsaXphdGlvbihtYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X011c2ljR2VuZXJpY0NvbmZpZ3VyZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNdXNpY0NvbXBvbmVudCBtYzsKLQlsb25nIG1vZGU7Ci0JbG9uZyBmbGFnczsKLQlsb25nIGJhc2VSZXNJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNdXNpY0NvbXBvbmVudCBtYzsKKyAgICBsb25nIG1vZGU7CisgICAgbG9uZyBmbGFnczsKKyAgICBsb25nIGJhc2VSZXNJRDsKICNpZm5kZWYgTXVzaWNHZW5lcmljQ29uZmlndXJlCi0JUHlNYWNfUFJFQ0hFQ0soTXVzaWNHZW5lcmljQ29uZmlndXJlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNdXNpY0dlbmVyaWNDb25maWd1cmUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYywKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vZGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgJmJhc2VSZXNJRCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE11c2ljR2VuZXJpY0NvbmZpZ3VyZShtYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VSZXNJRCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmJhc2VSZXNJRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE11c2ljR2VuZXJpY0NvbmZpZ3VyZShtYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VSZXNJRCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTXVzaWNHZW5lcmljR2V0S25vYkxpc3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTXVzaWNDb21wb25lbnQgbWM7Ci0JbG9uZyBrbm9iVHlwZTsKLQlHZW5lcmljS25vYkRlc2NyaXB0aW9uTGlzdEhhbmRsZSBna2RsSDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNdXNpY0NvbXBvbmVudCBtYzsKKyAgICBsb25nIGtub2JUeXBlOworICAgIEdlbmVyaWNLbm9iRGVzY3JpcHRpb25MaXN0SGFuZGxlIGdrZGxIOwogI2lmbmRlZiBNdXNpY0dlbmVyaWNHZXRLbm9iTGlzdAotCVB5TWFjX1BSRUNIRUNLKE11c2ljR2VuZXJpY0dldEtub2JMaXN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhNdXNpY0dlbmVyaWNHZXRLbm9iTGlzdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYywKLQkgICAgICAgICAgICAgICAgICAgICAgJmtub2JUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTXVzaWNHZW5lcmljR2V0S25vYkxpc3QobWMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga25vYlR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdrZGxIKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgZ2tkbEgpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAma25vYlR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNdXNpY0dlbmVyaWNHZXRLbm9iTGlzdChtYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbm9iVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2tkbEgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBna2RsSCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTXVzaWNHZW5lcmljU2V0UmVzb3VyY2VOdW1iZXJzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU11c2ljQ29tcG9uZW50IG1jOwotCUhhbmRsZSByZXNvdXJjZUlESDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNdXNpY0NvbXBvbmVudCBtYzsKKyAgICBIYW5kbGUgcmVzb3VyY2VJREg7CiAjaWZuZGVmIE11c2ljR2VuZXJpY1NldFJlc291cmNlTnVtYmVycwotCVB5TWFjX1BSRUNIRUNLKE11c2ljR2VuZXJpY1NldFJlc291cmNlTnVtYmVycyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTXVzaWNHZW5lcmljU2V0UmVzb3VyY2VOdW1iZXJzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYywKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZXNvdXJjZUlESCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE11c2ljR2VuZXJpY1NldFJlc291cmNlTnVtYmVycyhtYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VJREgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZXNvdXJjZUlESCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE11c2ljR2VuZXJpY1NldFJlc291cmNlTnVtYmVycyhtYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VJREgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X011c2ljRGVyaXZlZE1JRElTZW5kKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU11c2ljQ29tcG9uZW50IG1jOwotCU11c2ljTUlESVBhY2tldCBwYWNrZXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTXVzaWNDb21wb25lbnQgbWM7CisgICAgTXVzaWNNSURJUGFja2V0IHBhY2tldDsKICNpZm5kZWYgTXVzaWNEZXJpdmVkTUlESVNlbmQKLQlQeU1hY19QUkVDSEVDSyhNdXNpY0Rlcml2ZWRNSURJU2VuZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTXVzaWNEZXJpdmVkTUlESVNlbmQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1jLAotCSAgICAgICAgICAgICAgICAgICAgICBRdE11c2ljTUlESVBhY2tldF9Db252ZXJ0LCAmcGFja2V0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTXVzaWNEZXJpdmVkTUlESVNlbmQobWMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhY2tldCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1jLAorICAgICAgICAgICAgICAgICAgICAgICAgICBRdE11c2ljTUlESVBhY2tldF9Db252ZXJ0LCAmcGFja2V0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTXVzaWNEZXJpdmVkTUlESVNlbmQobWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhY2tldCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTXVzaWNEZXJpdmVkT3BlblJlc0ZpbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTXVzaWNDb21wb25lbnQgbWM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTXVzaWNDb21wb25lbnQgbWM7CiAjaWZuZGVmIE11c2ljRGVyaXZlZE9wZW5SZXNGaWxlCi0JUHlNYWNfUFJFQ0hFQ0soTXVzaWNEZXJpdmVkT3BlblJlc0ZpbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKE11c2ljRGVyaXZlZE9wZW5SZXNGaWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNdXNpY0Rlcml2ZWRPcGVuUmVzRmlsZShtYyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE11c2ljRGVyaXZlZE9wZW5SZXNGaWxlKG1jKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NdXNpY0Rlcml2ZWRDbG9zZVJlc0ZpbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTXVzaWNDb21wb25lbnQgbWM7Ci0Jc2hvcnQgcmVzUmVmTnVtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE11c2ljQ29tcG9uZW50IG1jOworICAgIHNob3J0IHJlc1JlZk51bTsKICNpZm5kZWYgTXVzaWNEZXJpdmVkQ2xvc2VSZXNGaWxlCi0JUHlNYWNfUFJFQ0hFQ0soTXVzaWNEZXJpdmVkQ2xvc2VSZXNGaWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNdXNpY0Rlcml2ZWRDbG9zZVJlc0ZpbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZXNSZWZOdW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNdXNpY0Rlcml2ZWRDbG9zZVJlc0ZpbGUobWMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc1JlZk51bSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXNSZWZOdW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNdXNpY0Rlcml2ZWRDbG9zZVJlc0ZpbGUobWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc1JlZk51bSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTkFVbnJlZ2lzdGVyTXVzaWNEZXZpY2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTm90ZUFsbG9jYXRvciBuYTsKLQlsb25nIGluZGV4OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE5vdGVBbGxvY2F0b3IgbmE7CisgICAgbG9uZyBpbmRleDsKICNpZm5kZWYgTkFVbnJlZ2lzdGVyTXVzaWNEZXZpY2UKLQlQeU1hY19QUkVDSEVDSyhOQVVucmVnaXN0ZXJNdXNpY0RldmljZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTkFVbnJlZ2lzdGVyTXVzaWNEZXZpY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbmEsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE5BVW5yZWdpc3Rlck11c2ljRGV2aWNlKG5hLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZuYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZGV4KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTkFVbnJlZ2lzdGVyTXVzaWNEZXZpY2UobmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X05BU2F2ZU11c2ljQ29uZmlndXJhdGlvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlOb3RlQWxsb2NhdG9yIG5hOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE5vdGVBbGxvY2F0b3IgbmE7CiAjaWZuZGVmIE5BU2F2ZU11c2ljQ29uZmlndXJhdGlvbgotCVB5TWFjX1BSRUNIRUNLKE5BU2F2ZU11c2ljQ29uZmlndXJhdGlvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTkFTYXZlTXVzaWNDb25maWd1cmF0aW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbmEpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBOQVNhdmVNdXNpY0NvbmZpZ3VyYXRpb24obmEpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbmEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBOQVNhdmVNdXNpY0NvbmZpZ3VyYXRpb24obmEpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X05BR2V0TUlESVBvcnRzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU5vdGVBbGxvY2F0b3IgbmE7Ci0JUVRNSURJUG9ydExpc3RIYW5kbGUgaW5wdXRQb3J0czsKLQlRVE1JRElQb3J0TGlzdEhhbmRsZSBvdXRwdXRQb3J0czsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBOb3RlQWxsb2NhdG9yIG5hOworICAgIFFUTUlESVBvcnRMaXN0SGFuZGxlIGlucHV0UG9ydHM7CisgICAgUVRNSURJUG9ydExpc3RIYW5kbGUgb3V0cHV0UG9ydHM7CiAjaWZuZGVmIE5BR2V0TUlESVBvcnRzCi0JUHlNYWNfUFJFQ0hFQ0soTkFHZXRNSURJUG9ydHMpOworICAgIFB5TWFjX1BSRUNIRUNLKE5BR2V0TUlESVBvcnRzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbmEpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBOQUdldE1JRElQb3J0cyhuYSwKLQkgICAgICAgICAgICAgICAgICAgICAmaW5wdXRQb3J0cywKLQkgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0UG9ydHMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGlucHV0UG9ydHMsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgb3V0cHV0UG9ydHMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbmEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBOQUdldE1JRElQb3J0cyhuYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmaW5wdXRQb3J0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0UG9ydHMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGlucHV0UG9ydHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgb3V0cHV0UG9ydHMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X05BVGFzayhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlOb3RlQWxsb2NhdG9yIG5hOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE5vdGVBbGxvY2F0b3IgbmE7CiAjaWZuZGVmIE5BVGFzawotCVB5TWFjX1BSRUNIRUNLKE5BVGFzayk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTkFUYXNrKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbmEpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBOQVRhc2sobmEpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbmEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBOQVRhc2sobmEpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1R1bmVTZXRIZWFkZXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVHVuZVBsYXllciB0cDsKLQl1bnNpZ25lZCBsb25nICogaGVhZGVyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFR1bmVQbGF5ZXIgdHA7CisgICAgdW5zaWduZWQgbG9uZyAqIGhlYWRlcjsKICNpZm5kZWYgVHVuZVNldEhlYWRlcgotCVB5TWFjX1BSRUNIRUNLKFR1bmVTZXRIZWFkZXIpOworICAgIFB5TWFjX1BSRUNIRUNLKFR1bmVTZXRIZWFkZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdHAsCi0JICAgICAgICAgICAgICAgICAgICAgICZoZWFkZXIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBUdW5lU2V0SGVhZGVyKHRwLAotCSAgICAgICAgICAgICAgICAgICAgaGVhZGVyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ0cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmhlYWRlcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFR1bmVTZXRIZWFkZXIodHAsCisgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1R1bmVHZXRUaW1lQmFzZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlUdW5lUGxheWVyIHRwOwotCVRpbWVCYXNlIHRiOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFR1bmVQbGF5ZXIgdHA7CisgICAgVGltZUJhc2UgdGI7CiAjaWZuZGVmIFR1bmVHZXRUaW1lQmFzZQotCVB5TWFjX1BSRUNIRUNLKFR1bmVHZXRUaW1lQmFzZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVHVuZUdldFRpbWVCYXNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdHApKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBUdW5lR2V0VGltZUJhc2UodHAsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0Yik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFRpbWVCYXNlT2JqX05ldywgdGIpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdHApKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBUdW5lR2V0VGltZUJhc2UodHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0Yik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVCYXNlT2JqX05ldywgdGIpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1R1bmVTZXRUaW1lU2NhbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVHVuZVBsYXllciB0cDsKLQlUaW1lU2NhbGUgc2NhbGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVHVuZVBsYXllciB0cDsKKyAgICBUaW1lU2NhbGUgc2NhbGU7CiAjaWZuZGVmIFR1bmVTZXRUaW1lU2NhbGUKLQlQeU1hY19QUkVDSEVDSyhUdW5lU2V0VGltZVNjYWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUdW5lU2V0VGltZVNjYWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnRwLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2NhbGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBUdW5lU2V0VGltZVNjYWxlKHRwLAotCSAgICAgICAgICAgICAgICAgICAgICAgc2NhbGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnRwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2NhbGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBUdW5lU2V0VGltZVNjYWxlKHRwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1R1bmVHZXRUaW1lU2NhbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVHVuZVBsYXllciB0cDsKLQlUaW1lU2NhbGUgc2NhbGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVHVuZVBsYXllciB0cDsKKyAgICBUaW1lU2NhbGUgc2NhbGU7CiAjaWZuZGVmIFR1bmVHZXRUaW1lU2NhbGUKLQlQeU1hY19QUkVDSEVDSyhUdW5lR2V0VGltZVNjYWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUdW5lR2V0VGltZVNjYWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdHApKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBUdW5lR2V0VGltZVNjYWxlKHRwLAotCSAgICAgICAgICAgICAgICAgICAgICAgJnNjYWxlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBzY2FsZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ0cCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFR1bmVHZXRUaW1lU2NhbGUodHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2NhbGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9UdW5lSW5zdGFudChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlUdW5lUGxheWVyIHRwOwotCXVuc2lnbmVkIGxvbmcgdHVuZTsKLQl1bnNpZ25lZCBsb25nIHR1bmVQb3NpdGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBUdW5lUGxheWVyIHRwOworICAgIHVuc2lnbmVkIGxvbmcgdHVuZTsKKyAgICB1bnNpZ25lZCBsb25nIHR1bmVQb3NpdGlvbjsKICNpZm5kZWYgVHVuZUluc3RhbnQKLQlQeU1hY19QUkVDSEVDSyhUdW5lSW5zdGFudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVHVuZUluc3RhbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdHAsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0dW5lUG9zaXRpb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBUdW5lSW5zdGFudCh0cCwKLQkgICAgICAgICAgICAgICAgICAmdHVuZSwKLQkgICAgICAgICAgICAgICAgICB0dW5lUG9zaXRpb24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHR1bmUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnRwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdHVuZVBvc2l0aW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVHVuZUluc3RhbnQodHAsCisgICAgICAgICAgICAgICAgICAgICAgJnR1bmUsCisgICAgICAgICAgICAgICAgICAgICAgdHVuZVBvc2l0aW9uKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0dW5lKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9UdW5lU3RvcChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlUdW5lUGxheWVyIHRwOwotCWxvbmcgc3RvcEZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFR1bmVQbGF5ZXIgdHA7CisgICAgbG9uZyBzdG9wRmxhZ3M7CiAjaWZuZGVmIFR1bmVTdG9wCi0JUHlNYWNfUFJFQ0hFQ0soVHVuZVN0b3ApOworICAgIFB5TWFjX1BSRUNIRUNLKFR1bmVTdG9wKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnRwLAotCSAgICAgICAgICAgICAgICAgICAgICAmc3RvcEZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVHVuZVN0b3AodHAsCi0JICAgICAgICAgICAgICAgc3RvcEZsYWdzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ0cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0b3BGbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFR1bmVTdG9wKHRwLAorICAgICAgICAgICAgICAgICAgIHN0b3BGbGFncyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVHVuZVNldFZvbHVtZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlUdW5lUGxheWVyIHRwOwotCUZpeGVkIHZvbHVtZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBUdW5lUGxheWVyIHRwOworICAgIEZpeGVkIHZvbHVtZTsKICNpZm5kZWYgVHVuZVNldFZvbHVtZQotCVB5TWFjX1BSRUNIRUNLKFR1bmVTZXRWb2x1bWUpOworICAgIFB5TWFjX1BSRUNIRUNLKFR1bmVTZXRWb2x1bWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnRwLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJnZvbHVtZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFR1bmVTZXRWb2x1bWUodHAsCi0JICAgICAgICAgICAgICAgICAgICB2b2x1bWUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ0cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZ2b2x1bWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBUdW5lU2V0Vm9sdW1lKHRwLAorICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9UdW5lR2V0Vm9sdW1lKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVR1bmVQbGF5ZXIgdHA7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVHVuZVBsYXllciB0cDsKICNpZm5kZWYgVHVuZUdldFZvbHVtZQotCVB5TWFjX1BSRUNIRUNLKFR1bmVHZXRWb2x1bWUpOworICAgIFB5TWFjX1BSRUNIRUNLKFR1bmVHZXRWb2x1bWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ0cCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFR1bmVHZXRWb2x1bWUodHApOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdHApKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBUdW5lR2V0Vm9sdW1lKHRwKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9UdW5lUHJlcm9sbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlUdW5lUGxheWVyIHRwOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFR1bmVQbGF5ZXIgdHA7CiAjaWZuZGVmIFR1bmVQcmVyb2xsCi0JUHlNYWNfUFJFQ0hFQ0soVHVuZVByZXJvbGwpOworICAgIFB5TWFjX1BSRUNIRUNLKFR1bmVQcmVyb2xsKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdHApKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBUdW5lUHJlcm9sbCh0cCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ0cCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFR1bmVQcmVyb2xsKHRwKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9UdW5lVW5yb2xsKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVR1bmVQbGF5ZXIgdHA7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVHVuZVBsYXllciB0cDsKICNpZm5kZWYgVHVuZVVucm9sbAotCVB5TWFjX1BSRUNIRUNLKFR1bmVVbnJvbGwpOworICAgIFB5TWFjX1BSRUNIRUNLKFR1bmVVbnJvbGwpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ0cCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFR1bmVVbnJvbGwodHApOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdHApKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBUdW5lVW5yb2xsKHRwKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9UdW5lU2V0UGFydFRyYW5zcG9zZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlUdW5lUGxheWVyIHRwOwotCXVuc2lnbmVkIGxvbmcgcGFydDsKLQlsb25nIHRyYW5zcG9zZTsKLQlsb25nIHZlbG9jaXR5U2hpZnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVHVuZVBsYXllciB0cDsKKyAgICB1bnNpZ25lZCBsb25nIHBhcnQ7CisgICAgbG9uZyB0cmFuc3Bvc2U7CisgICAgbG9uZyB2ZWxvY2l0eVNoaWZ0OwogI2lmbmRlZiBUdW5lU2V0UGFydFRyYW5zcG9zZQotCVB5TWFjX1BSRUNIRUNLKFR1bmVTZXRQYXJ0VHJhbnNwb3NlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUdW5lU2V0UGFydFRyYW5zcG9zZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnRwLAotCSAgICAgICAgICAgICAgICAgICAgICAmcGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRyYW5zcG9zZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZlbG9jaXR5U2hpZnQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBUdW5lU2V0UGFydFRyYW5zcG9zZSh0cCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9zZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWxvY2l0eVNoaWZ0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnRwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRyYW5zcG9zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZlbG9jaXR5U2hpZnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBUdW5lU2V0UGFydFRyYW5zcG9zZSh0cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWxvY2l0eVNoaWZ0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9UdW5lR2V0Tm90ZUFsbG9jYXRvcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JTm90ZUFsbG9jYXRvciBfcnY7Ci0JVHVuZVBsYXllciB0cDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgTm90ZUFsbG9jYXRvciBfcnY7CisgICAgVHVuZVBsYXllciB0cDsKICNpZm5kZWYgVHVuZUdldE5vdGVBbGxvY2F0b3IKLQlQeU1hY19QUkVDSEVDSyhUdW5lR2V0Tm90ZUFsbG9jYXRvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soVHVuZUdldE5vdGVBbGxvY2F0b3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ0cCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFR1bmVHZXROb3RlQWxsb2NhdG9yKHRwKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdHApKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBUdW5lR2V0Tm90ZUFsbG9jYXRvcih0cCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9UdW5lU2V0U29mdGVyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVR1bmVQbGF5ZXIgdHA7Ci0JbG9uZyBzb2Z0ZXI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVHVuZVBsYXllciB0cDsKKyAgICBsb25nIHNvZnRlcjsKICNpZm5kZWYgVHVuZVNldFNvZnRlcgotCVB5TWFjX1BSRUNIRUNLKFR1bmVTZXRTb2Z0ZXIpOworICAgIFB5TWFjX1BSRUNIRUNLKFR1bmVTZXRTb2Z0ZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdHAsCi0JICAgICAgICAgICAgICAgICAgICAgICZzb2Z0ZXIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBUdW5lU2V0U29mdGVyKHRwLAotCSAgICAgICAgICAgICAgICAgICAgc29mdGVyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ0cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNvZnRlcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFR1bmVTZXRTb2Z0ZXIodHAsCisgICAgICAgICAgICAgICAgICAgICAgICBzb2Z0ZXIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1R1bmVUYXNrKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVR1bmVQbGF5ZXIgdHA7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVHVuZVBsYXllciB0cDsKICNpZm5kZWYgVHVuZVRhc2sKLQlQeU1hY19QUkVDSEVDSyhUdW5lVGFzayk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVHVuZVRhc2spOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ0cCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFR1bmVUYXNrKHRwKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnRwKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVHVuZVRhc2sodHApOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1R1bmVTZXRCYWxhbmNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVR1bmVQbGF5ZXIgdHA7Ci0JbG9uZyBiYWxhbmNlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFR1bmVQbGF5ZXIgdHA7CisgICAgbG9uZyBiYWxhbmNlOwogI2lmbmRlZiBUdW5lU2V0QmFsYW5jZQotCVB5TWFjX1BSRUNIRUNLKFR1bmVTZXRCYWxhbmNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUdW5lU2V0QmFsYW5jZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ0cCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmJhbGFuY2UpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBUdW5lU2V0QmFsYW5jZSh0cCwKLQkgICAgICAgICAgICAgICAgICAgICBiYWxhbmNlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ0cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmJhbGFuY2UpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBUdW5lU2V0QmFsYW5jZSh0cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiYWxhbmNlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9UdW5lU2V0U291bmRMb2NhbGl6YXRpb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVHVuZVBsYXllciB0cDsKLQlIYW5kbGUgZGF0YTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBUdW5lUGxheWVyIHRwOworICAgIEhhbmRsZSBkYXRhOwogI2lmbmRlZiBUdW5lU2V0U291bmRMb2NhbGl6YXRpb24KLQlQeU1hY19QUkVDSEVDSyhUdW5lU2V0U291bmRMb2NhbGl6YXRpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKFR1bmVTZXRTb3VuZExvY2FsaXphdGlvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdHAsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFR1bmVTZXRTb3VuZExvY2FsaXphdGlvbih0cCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnRwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBUdW5lU2V0U291bmRMb2NhbGl6YXRpb24odHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1R1bmVTZXRIZWFkZXJXaXRoU2l6ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlUdW5lUGxheWVyIHRwOwotCXVuc2lnbmVkIGxvbmcgKiBoZWFkZXI7Ci0JdW5zaWduZWQgbG9uZyBzaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFR1bmVQbGF5ZXIgdHA7CisgICAgdW5zaWduZWQgbG9uZyAqIGhlYWRlcjsKKyAgICB1bnNpZ25lZCBsb25nIHNpemU7CiAjaWZuZGVmIFR1bmVTZXRIZWFkZXJXaXRoU2l6ZQotCVB5TWFjX1BSRUNIRUNLKFR1bmVTZXRIZWFkZXJXaXRoU2l6ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVHVuZVNldEhlYWRlcldpdGhTaXplKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mc2wiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ0cCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmhlYWRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNpemUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBUdW5lU2V0SGVhZGVyV2l0aFNpemUodHAsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnRwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFR1bmVTZXRIZWFkZXJXaXRoU2l6ZSh0cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9UdW5lU2V0UGFydE1peChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlUdW5lUGxheWVyIHRwOwotCXVuc2lnbmVkIGxvbmcgcGFydE51bWJlcjsKLQlsb25nIHZvbHVtZTsKLQlsb25nIGJhbGFuY2U7Ci0JbG9uZyBtaXhGbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBUdW5lUGxheWVyIHRwOworICAgIHVuc2lnbmVkIGxvbmcgcGFydE51bWJlcjsKKyAgICBsb25nIHZvbHVtZTsKKyAgICBsb25nIGJhbGFuY2U7CisgICAgbG9uZyBtaXhGbGFnczsKICNpZm5kZWYgVHVuZVNldFBhcnRNaXgKLQlQeU1hY19QUkVDSEVDSyhUdW5lU2V0UGFydE1peCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVHVuZVNldFBhcnRNaXgpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbGxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdHAsCi0JICAgICAgICAgICAgICAgICAgICAgICZwYXJ0TnVtYmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAmdm9sdW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAmYmFsYW5jZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1peEZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVHVuZVNldFBhcnRNaXgodHAsCi0JICAgICAgICAgICAgICAgICAgICAgcGFydE51bWJlciwKLQkgICAgICAgICAgICAgICAgICAgICB2b2x1bWUsCi0JICAgICAgICAgICAgICAgICAgICAgYmFsYW5jZSwKLQkgICAgICAgICAgICAgICAgICAgICBtaXhGbGFncyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbGxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJ0TnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdm9sdW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYmFsYW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1peEZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVHVuZVNldFBhcnRNaXgodHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgcGFydE51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgYmFsYW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtaXhGbGFncyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVHVuZUdldFBhcnRNaXgoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVHVuZVBsYXllciB0cDsKLQl1bnNpZ25lZCBsb25nIHBhcnROdW1iZXI7Ci0JbG9uZyB2b2x1bWVPdXQ7Ci0JbG9uZyBiYWxhbmNlT3V0OwotCWxvbmcgbWl4RmxhZ3NPdXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVHVuZVBsYXllciB0cDsKKyAgICB1bnNpZ25lZCBsb25nIHBhcnROdW1iZXI7CisgICAgbG9uZyB2b2x1bWVPdXQ7CisgICAgbG9uZyBiYWxhbmNlT3V0OworICAgIGxvbmcgbWl4RmxhZ3NPdXQ7CiAjaWZuZGVmIFR1bmVHZXRQYXJ0TWl4Ci0JUHlNYWNfUFJFQ0hFQ0soVHVuZUdldFBhcnRNaXgpOworICAgIFB5TWFjX1BSRUNIRUNLKFR1bmVHZXRQYXJ0TWl4KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnRwLAotCSAgICAgICAgICAgICAgICAgICAgICAmcGFydE51bWJlcikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFR1bmVHZXRQYXJ0TWl4KHRwLAotCSAgICAgICAgICAgICAgICAgICAgIHBhcnROdW1iZXIsCi0JICAgICAgICAgICAgICAgICAgICAgJnZvbHVtZU91dCwKLQkgICAgICAgICAgICAgICAgICAgICAmYmFsYW5jZU91dCwKLQkgICAgICAgICAgICAgICAgICAgICAmbWl4RmxhZ3NPdXQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbGxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgdm9sdW1lT3V0LAotCSAgICAgICAgICAgICAgICAgICAgIGJhbGFuY2VPdXQsCi0JICAgICAgICAgICAgICAgICAgICAgbWl4RmxhZ3NPdXQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnRwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFydE51bWJlcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFR1bmVHZXRQYXJ0TWl4KHRwLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnROdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgJnZvbHVtZU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmYmFsYW5jZU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmbWl4RmxhZ3NPdXQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbGxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGJhbGFuY2VPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgbWl4RmxhZ3NPdXQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0FsaWduV2luZG93KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlXaW5kb3dQdHIgd3A7Ci0JQm9vbGVhbiBmcm9udDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgV2luZG93UHRyIHdwOworICAgIEJvb2xlYW4gZnJvbnQ7CiAjaWZuZGVmIEFsaWduV2luZG93Ci0JUHlNYWNfUFJFQ0hFQ0soQWxpZ25XaW5kb3cpOworICAgIFB5TWFjX1BSRUNIRUNLKEFsaWduV2luZG93KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd3AsCi0JICAgICAgICAgICAgICAgICAgICAgICZmcm9udCkpCi0JCXJldHVybiBOVUxMOwotCUFsaWduV2luZG93KHdwLAotCSAgICAgICAgICAgIGZyb250LAotCSAgICAgICAgICAgIChSZWN0ICopMCwKLQkgICAgICAgICAgICAoSUNNQWxpZ25tZW50UHJvY1JlY29yZFB0cikwKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZyb250KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQWxpZ25XaW5kb3cod3AsCisgICAgICAgICAgICAgICAgZnJvbnQsCisgICAgICAgICAgICAgICAgKFJlY3QgKikwLAorICAgICAgICAgICAgICAgIChJQ01BbGlnbm1lbnRQcm9jUmVjb3JkUHRyKTApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EcmFnQWxpZ25lZFdpbmRvdyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JV2luZG93UHRyIHdwOwotCVBvaW50IHN0YXJ0UHQ7Ci0JUmVjdCBib3VuZHNSZWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBXaW5kb3dQdHIgd3A7CisgICAgUG9pbnQgc3RhcnRQdDsKKyAgICBSZWN0IGJvdW5kc1JlY3Q7CiAjaWZuZGVmIERyYWdBbGlnbmVkV2luZG93Ci0JUHlNYWNfUFJFQ0hFQ0soRHJhZ0FsaWduZWRXaW5kb3cpOworICAgIFB5TWFjX1BSRUNIRUNLKERyYWdBbGlnbmVkV2luZG93KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd3AsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmc3RhcnRQdCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kc1JlY3QpKQotCQlyZXR1cm4gTlVMTDsKLQlEcmFnQWxpZ25lZFdpbmRvdyh3cCwKLQkgICAgICAgICAgICAgICAgICBzdGFydFB0LAotCSAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgIChSZWN0ICopMCwKLQkgICAgICAgICAgICAgICAgICAoSUNNQWxpZ25tZW50UHJvY1JlY29yZFB0cikwKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZzdGFydFB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIERyYWdBbGlnbmVkV2luZG93KHdwLAorICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0UHQsCisgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgKFJlY3QgKikwLAorICAgICAgICAgICAgICAgICAgICAgIChJQ01BbGlnbm1lbnRQcm9jUmVjb3JkUHRyKTApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9Nb3ZpZXNUYXNrKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIG1heE1pbGxpU2VjVG9Vc2U7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgbWF4TWlsbGlTZWNUb1VzZTsKICNpZm5kZWYgTW92aWVzVGFzawotCVB5TWFjX1BSRUNIRUNLKE1vdmllc1Rhc2spOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmllc1Rhc2spOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZtYXhNaWxsaVNlY1RvVXNlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTW92aWVzVGFzaygoTW92aWUpMCwKLQkgICAgICAgICAgIG1heE1pbGxpU2VjVG9Vc2UpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1heE1pbGxpU2VjVG9Vc2UpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNb3ZpZXNUYXNrKChNb3ZpZSkwLAorICAgICAgICAgICAgICAgbWF4TWlsbGlTZWNUb1VzZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogI2VuZGlmIC8qIF9fTFA2NF9fICovCiAKIHN0YXRpYyBQeU1ldGhvZERlZiBRdF9tZXRob2RzW10gPSB7CiAjaWZuZGVmIF9fTFA2NF9fCi0JeyJFbnRlck1vdmllcyIsIChQeUNGdW5jdGlvbilRdF9FbnRlck1vdmllcywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiRXhpdE1vdmllcyIsIChQeUNGdW5jdGlvbilRdF9FeGl0TW92aWVzLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJHZXRNb3ZpZXNFcnJvciIsIChQeUNGdW5jdGlvbilRdF9HZXRNb3ZpZXNFcnJvciwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiQ2xlYXJNb3ZpZXNTdGlja3lFcnJvciIsIChQeUNGdW5jdGlvbilRdF9DbGVhck1vdmllc1N0aWNreUVycm9yLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJHZXRNb3ZpZXNTdGlja3lFcnJvciIsIChQeUNGdW5jdGlvbilRdF9HZXRNb3ZpZXNTdGlja3lFcnJvciwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiUVRHZXRXYWxsQ2xvY2tUaW1lQmFzZSIsIChQeUNGdW5jdGlvbilRdF9RVEdldFdhbGxDbG9ja1RpbWVCYXNlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChUaW1lQmFzZSB3YWxsQ2xvY2tUaW1lQmFzZSkiKX0sCi0JeyJRVElkbGVNYW5hZ2VyT3BlbiIsIChQeUNGdW5jdGlvbilRdF9RVElkbGVNYW5hZ2VyT3BlbiwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoSWRsZU1hbmFnZXIgX3J2KSIpfSwKLQl7IkNyZWF0ZU1vdmllQ29udHJvbCIsIChQeUNGdW5jdGlvbilRdF9DcmVhdGVNb3ZpZUNvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB0aGVXaW5kb3csIE1vdmllIHRoZU1vdmllLCBVSW50MzIgb3B0aW9ucykgLT4gKFJlY3QgbG9jYWxSZWN0LCBDb250cm9sSGFuZGxlIHJldHVybmVkQ29udHJvbCkiKX0sCi0JeyJEaXNwb3NlTWF0dGUiLCAoUHlDRnVuY3Rpb24pUXRfRGlzcG9zZU1hdHRlLCAxLAotCSBQeURvY19TVFIoIihQaXhNYXBIYW5kbGUgdGhlTWF0dGUpIC0+IE5vbmUiKX0sCi0JeyJOZXdNb3ZpZSIsIChQeUNGdW5jdGlvbilRdF9OZXdNb3ZpZSwgMSwKLQkgUHlEb2NfU1RSKCIobG9uZyBmbGFncykgLT4gKE1vdmllIF9ydikiKX0sCi0JeyJRVEdldFRpbWVVbnRpbE5leHRUYXNrIiwgKFB5Q0Z1bmN0aW9uKVF0X1FUR2V0VGltZVVudGlsTmV4dFRhc2ssIDEsCi0JIFB5RG9jX1NUUigiKGxvbmcgc2NhbGUpIC0+IChsb25nIGR1cmF0aW9uKSIpfSwKLQl7IkdldERhdGFIYW5kbGVyIiwgKFB5Q0Z1bmN0aW9uKVF0X0dldERhdGFIYW5kbGVyLCAxLAotCSBQeURvY19TVFIoIihIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFIYW5kbGVyU3ViVHlwZSwgbG9uZyBmbGFncykgLT4gKENvbXBvbmVudCBfcnYpIil9LAotCXsiUGFzdGVIYW5kbGVJbnRvTW92aWUiLCAoUHlDRnVuY3Rpb24pUXRfUGFzdGVIYW5kbGVJbnRvTW92aWUsIDEsCi0JIFB5RG9jX1NUUigiKEhhbmRsZSBoLCBPU1R5cGUgaGFuZGxlVHlwZSwgTW92aWUgdGhlTW92aWUsIGxvbmcgZmxhZ3MsIENvbXBvbmVudEluc3RhbmNlIHVzZXJDb21wKSAtPiBOb25lIil9LAotCXsiR2V0TW92aWVJbXBvcnRlckZvckRhdGFSZWYiLCAoUHlDRnVuY3Rpb24pUXRfR2V0TW92aWVJbXBvcnRlckZvckRhdGFSZWYsIDEsCi0JIFB5RG9jX1NUUigiKE9TVHlwZSBkYXRhUmVmVHlwZSwgSGFuZGxlIGRhdGFSZWYsIGxvbmcgZmxhZ3MpIC0+IChDb21wb25lbnQgaW1wb3J0ZXIpIil9LAotCXsiUVRHZXRNSU1FVHlwZUluZm8iLCAoUHlDRnVuY3Rpb24pUXRfUVRHZXRNSU1FVHlwZUluZm8sIDEsCi0JIFB5RG9jX1NUUigiKGNoYXIqIG1pbWVTdHJpbmdTdGFydCwgc2hvcnQgbWltZVN0cmluZ0xlbmd0aCwgT1NUeXBlIGluZm9TZWxlY3Rvciwgdm9pZCAqIGluZm9EYXRhUHRyKSAtPiAobG9uZyBpbmZvRGF0YVNpemUpIil9LAotCXsiVHJhY2tUaW1lVG9NZWRpYVRpbWUiLCAoUHlDRnVuY3Rpb24pUXRfVHJhY2tUaW1lVG9NZWRpYVRpbWUsIDEsCi0JIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSB2YWx1ZSwgVHJhY2sgdGhlVHJhY2spIC0+IChUaW1lVmFsdWUgX3J2KSIpfSwKLQl7Ik5ld1VzZXJEYXRhIiwgKFB5Q0Z1bmN0aW9uKVF0X05ld1VzZXJEYXRhLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChVc2VyRGF0YSB0aGVVc2VyRGF0YSkiKX0sCi0JeyJOZXdVc2VyRGF0YUZyb21IYW5kbGUiLCAoUHlDRnVuY3Rpb24pUXRfTmV3VXNlckRhdGFGcm9tSGFuZGxlLCAxLAotCSBQeURvY19TVFIoIihIYW5kbGUgaCkgLT4gKFVzZXJEYXRhIHRoZVVzZXJEYXRhKSIpfSwKLQl7IkNyZWF0ZU1vdmllRmlsZSIsIChQeUNGdW5jdGlvbilRdF9DcmVhdGVNb3ZpZUZpbGUsIDEsCi0JIFB5RG9jX1NUUigiKEZTU3BlYyBmaWxlU3BlYywgT1NUeXBlIGNyZWF0b3IsIFNjcmlwdENvZGUgc2NyaXB0VGFnLCBsb25nIGNyZWF0ZU1vdmllRmlsZUZsYWdzKSAtPiAoc2hvcnQgcmVzUmVmTnVtLCBNb3ZpZSBuZXdtb3ZpZSkiKX0sCi0JeyJPcGVuTW92aWVGaWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X09wZW5Nb3ZpZUZpbGUsIDEsCi0JIFB5RG9jX1NUUigiKEZTU3BlYyBmaWxlU3BlYywgU0ludDggcGVybWlzc2lvbikgLT4gKHNob3J0IHJlc1JlZk51bSkiKX0sCi0JeyJDbG9zZU1vdmllRmlsZSIsIChQeUNGdW5jdGlvbilRdF9DbG9zZU1vdmllRmlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgcmVzUmVmTnVtKSAtPiBOb25lIil9LAotCXsiRGVsZXRlTW92aWVGaWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0RlbGV0ZU1vdmllRmlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoRlNTcGVjIGZpbGVTcGVjKSAtPiBOb25lIil9LAotCXsiTmV3TW92aWVGcm9tRmlsZSIsIChQeUNGdW5jdGlvbilRdF9OZXdNb3ZpZUZyb21GaWxlLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCByZXNSZWZOdW0sIHNob3J0IHJlc0lkLCBzaG9ydCBuZXdNb3ZpZUZsYWdzKSAtPiAoTW92aWUgdGhlTW92aWUsIHNob3J0IHJlc0lkLCBCb29sZWFuIGRhdGFSZWZXYXNDaGFuZ2VkKSIpfSwKLQl7Ik5ld01vdmllRnJvbUhhbmRsZSIsIChQeUNGdW5jdGlvbilRdF9OZXdNb3ZpZUZyb21IYW5kbGUsIDEsCi0JIFB5RG9jX1NUUigiKEhhbmRsZSBoLCBzaG9ydCBuZXdNb3ZpZUZsYWdzKSAtPiAoTW92aWUgdGhlTW92aWUsIEJvb2xlYW4gZGF0YVJlZldhc0NoYW5nZWQpIil9LAotCXsiTmV3TW92aWVGcm9tRGF0YUZvcmsiLCAoUHlDRnVuY3Rpb24pUXRfTmV3TW92aWVGcm9tRGF0YUZvcmssIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGZSZWZOdW0sIGxvbmcgZmlsZU9mZnNldCwgc2hvcnQgbmV3TW92aWVGbGFncykgLT4gKE1vdmllIHRoZU1vdmllLCBCb29sZWFuIGRhdGFSZWZXYXNDaGFuZ2VkKSIpfSwKLQl7Ik5ld01vdmllRnJvbURhdGFGb3JrNjQiLCAoUHlDRnVuY3Rpb24pUXRfTmV3TW92aWVGcm9tRGF0YUZvcms2NCwgMSwKLQkgUHlEb2NfU1RSKCIobG9uZyBmUmVmTnVtLCB3aWRlIGZpbGVPZmZzZXQsIHNob3J0IG5ld01vdmllRmxhZ3MpIC0+IChNb3ZpZSB0aGVNb3ZpZSwgQm9vbGVhbiBkYXRhUmVmV2FzQ2hhbmdlZCkiKX0sCi0JeyJOZXdNb3ZpZUZyb21EYXRhUmVmIiwgKFB5Q0Z1bmN0aW9uKVF0X05ld01vdmllRnJvbURhdGFSZWYsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGZsYWdzLCBIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGR0YVJlZlR5cGUpIC0+IChNb3ZpZSBtLCBzaG9ydCBpZCkiKX0sCi0JeyJOZXdNb3ZpZUZyb21TdG9yYWdlT2Zmc2V0IiwgKFB5Q0Z1bmN0aW9uKVF0X05ld01vdmllRnJvbVN0b3JhZ2VPZmZzZXQsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCB3aWRlIGZpbGVPZmZzZXQsIHNob3J0IG5ld01vdmllRmxhZ3MpIC0+IChNb3ZpZSB0aGVNb3ZpZSwgQm9vbGVhbiBkYXRhUmVmV2FzQ2F0YVJlZlR5cGUpIil9LAotCXsiTmV3TW92aWVGb3JEYXRhUmVmRnJvbUhhbmRsZSIsIChQeUNGdW5jdGlvbilRdF9OZXdNb3ZpZUZvckRhdGFSZWZGcm9tSGFuZGxlLCAxLAotCSBQeURvY19TVFIoIihIYW5kbGUgaCwgc2hvcnQgbmV3TW92aWVGbGFncywgSGFuZGxlIGRhdGFSZWYsIE9TVHlwZSBkYXRhUmVmVHlwZSkgLT4gKE1vdmllIHRoZU1vdmllLCBCb29sZWFuIGRhdGFSZWZXYXNDaGFuZ2VkKSIpfSwKLQl7IlJlbW92ZU1vdmllUmVzb3VyY2UiLCAoUHlDRnVuY3Rpb24pUXRfUmVtb3ZlTW92aWVSZXNvdXJjZSwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgcmVzUmVmTnVtLCBzaG9ydCByZXNJZCkgLT4gTm9uZSIpfSwKLQl7IkNyZWF0ZU1vdmllU3RvcmFnZSIsIChQeUNGdW5jdGlvbilRdF9DcmVhdGVNb3ZpZVN0b3JhZ2UsIDEsCi0JIFB5RG9jX1NUUigiKEhhbmRsZSBkYXRhUmVmLCBPU1R5cGUgZGF0YVJlZlR5cGUsIE9TVHlwZSBjcmVhdG9yLCBTY3JpcHRDb2RlIHNjcmlwdFRhZywgbG9uZyBjcmVhdGVNb3ZpZUZpbGVGbGFncykgLT4gKERhdGFIYW5kbGVyIG91dERhdGFIYW5kbGVyLCBNb3ZpZSBuZXdtb3ZpZSkiKX0sCi0JeyJPcGVuTW92aWVTdG9yYWdlIiwgKFB5Q0Z1bmN0aW9uKVF0X09wZW5Nb3ZpZVN0b3JhZ2UsIDEsCi0JIFB5RG9jX1NUUigiKEhhbmRsZSBkYXRhUmVmLCBPU1R5cGUgZGF0YVJlZlR5cGUsIGxvbmcgZmxhZ3MpIC0+IChEYXRhSGFuZGxlciBvdXREYXRhSGFuZGxlcikiKX0sCi0JeyJDbG9zZU1vdmllU3RvcmFnZSIsIChQeUNGdW5jdGlvbilRdF9DbG9zZU1vdmllU3RvcmFnZSwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgpIC0+IE5vbmUiKX0sCi0JeyJEZWxldGVNb3ZpZVN0b3JhZ2UiLCAoUHlDRnVuY3Rpb24pUXRfRGVsZXRlTW92aWVTdG9yYWdlLCAxLAotCSBQeURvY19TVFIoIihIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlKSAtPiBOb25lIil9LAotCXsiQ3JlYXRlU2hvcnRjdXRNb3ZpZUZpbGUiLCAoUHlDRnVuY3Rpb24pUXRfQ3JlYXRlU2hvcnRjdXRNb3ZpZUZpbGUsIDEsCi0JIFB5RG9jX1NUUigiKEZTU3BlYyBmaWxlU3BlYywgT1NUeXBlIGNyZWF0b3IsIFNjcmlwdENvZGUgc2NyaXB0VGFnLCBsb25nIGNyZWF0ZU1vdmllRmlsZUZsYWdzLCBIYW5kbGUgdGFyZ2V0RGF0YVJlZiwgT1NUeXBlIHRhcmdldERhdGFSZWZUeXBlKSAtPiBOb25lIil9LAotCXsiQ2FuUXVpY2tUaW1lT3BlbkZpbGUiLCAoUHlDRnVuY3Rpb24pUXRfQ2FuUXVpY2tUaW1lT3BlbkZpbGUsIDEsCi0JIFB5RG9jX1NUUigiKEZTU3BlYyBmaWxlU3BlYywgT1NUeXBlIGZpbGVUeXBlLCBPU1R5cGUgZmlsZU5hbWVFeHRlbnNpb24sIFVJbnQzMiBpbkZsYWdzKSAtPiAoQm9vbGVhbiBvdXRDYW5PcGVuV2l0aEdyYXBoaWNzSW1wb3J0ZXIsIEJvb2xlYW4gb3V0Q2FuT3BlbkFzTW92aWUsIEJvb2xlYW4gb3V0UHJlZmVyR3JhcGhpY3NJbXBvcnRlcikiKX0sCi0JeyJDYW5RdWlja1RpbWVPcGVuRGF0YVJlZiIsIChQeUNGdW5jdGlvbilRdF9DYW5RdWlja1RpbWVPcGVuRGF0YVJlZiwgMSwKLQkgUHlEb2NfU1RSKCIoSGFuZGxlIGRhdGFSZWYsIE9TVHlwZSBkYXRhUmVmVHlwZSwgVUludDMyIGluRmxhZ3MpIC0+IChCb29sZWFuIG91dENhbk9wZW5XaXRoR3JhcGhpY3NJbXBvcnRlciwgQm9vbGVhbiBvdXRDYW5PcGVuQXNNb3ZpZSwgQm9vbGVhbiBvdXRQcmVmZXJHcmFwaGljc0ltcG9ydGVyKSIpfSwKLQl7Ik5ld01vdmllRnJvbVNjcmFwIiwgKFB5Q0Z1bmN0aW9uKVF0X05ld01vdmllRnJvbVNjcmFwLCAxLAotCSBQeURvY19TVFIoIihsb25nIG5ld01vdmllRmxhZ3MpIC0+IChNb3ZpZSBfcnYpIil9LAotCXsiUVROZXdBbGlhcyIsIChQeUNGdW5jdGlvbilRdF9RVE5ld0FsaWFzLCAxLAotCSBQeURvY19TVFIoIihGU1NwZWMgZnNzLCBCb29sZWFuIG1pbmltYWwpIC0+IChBbGlhc0hhbmRsZSBhbGlhcykiKX0sCi0JeyJFbmRGdWxsU2NyZWVuIiwgKFB5Q0Z1bmN0aW9uKVF0X0VuZEZ1bGxTY3JlZW4sIDEsCi0JIFB5RG9jX1NUUigiKFB0ciBmdWxsU3RhdGUsIGxvbmcgZmxhZ3MpIC0+IE5vbmUiKX0sCi0JeyJBZGRTb3VuZERlc2NyaXB0aW9uRXh0ZW5zaW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X0FkZFNvdW5kRGVzY3JpcHRpb25FeHRlbnNpb24sIDEsCi0JIFB5RG9jX1NUUigiKFNvdW5kRGVzY3JpcHRpb25IYW5kbGUgZGVzYywgSGFuZGxlIGV4dGVuc2lvbiwgT1NUeXBlIGlkVHlwZSkgLT4gTm9uZSIpfSwKLQl7IkdldFNvdW5kRGVzY3JpcHRpb25FeHRlbnNpb24iLCAoUHlDRnVuY3Rpb24pUXRfR2V0U291bmREZXNjcmlwdGlvbkV4dGVuc2lvbiwgMSwKLQkgUHlEb2NfU1RSKCIoU291bmREZXNjcmlwdGlvbkhhbmRsZSBkZXNjLCBPU1R5cGUgaWRUeXBlKSAtPiAoSGFuZGxlIGV4dGVuc2lvbikiKX0sCi0JeyJSZW1vdmVTb3VuZERlc2NyaXB0aW9uRXh0ZW5zaW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X1JlbW92ZVNvdW5kRGVzY3JpcHRpb25FeHRlbnNpb24sIDEsCi0JIFB5RG9jX1NUUigiKFNvdW5kRGVzY3JpcHRpb25IYW5kbGUgZGVzYywgT1NUeXBlIGlkVHlwZSkgLT4gTm9uZSIpfSwKLQl7IlFUSXNTdGFuZGFyZFBhcmFtZXRlckRpYWxvZ0V2ZW50IiwgKFB5Q0Z1bmN0aW9uKVF0X1FUSXNTdGFuZGFyZFBhcmFtZXRlckRpYWxvZ0V2ZW50LCAxLAotCSBQeURvY19TVFIoIihRVFBhcmFtZXRlckRpYWxvZyBjcmVhdGVkRGlhbG9nKSAtPiAoRXZlbnRSZWNvcmQgcEV2ZW50KSIpfSwKLQl7IlFURGlzbWlzc1N0YW5kYXJkUGFyYW1ldGVyRGlhbG9nIiwgKFB5Q0Z1bmN0aW9uKVF0X1FURGlzbWlzc1N0YW5kYXJkUGFyYW1ldGVyRGlhbG9nLCAxLAotCSBQeURvY19TVFIoIihRVFBhcmFtZXRlckRpYWxvZyBjcmVhdGVkRGlhbG9nKSAtPiBOb25lIil9LAotCXsiUVRTdGFuZGFyZFBhcmFtZXRlckRpYWxvZ0RvQWN0aW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X1FUU3RhbmRhcmRQYXJhbWV0ZXJEaWFsb2dEb0FjdGlvbiwgMSwKLQkgUHlEb2NfU1RSKCIoUVRQYXJhbWV0ZXJEaWFsb2cgY3JlYXRlZERpYWxvZywgbG9uZyBhY3Rpb24sIHZvaWQgKiBwYXJhbXMpIC0+IE5vbmUiKX0sCi0JeyJRVFJlZ2lzdGVyQWNjZXNzS2V5IiwgKFB5Q0Z1bmN0aW9uKVF0X1FUUmVnaXN0ZXJBY2Nlc3NLZXksIDEsCi0JIFB5RG9jX1NUUigiKFN0cjI1NSBhY2Nlc3NLZXlUeXBlLCBsb25nIGZsYWdzLCBIYW5kbGUgYWNjZXNzS2V5KSAtPiBOb25lIil9LAotCXsiUVRVbnJlZ2lzdGVyQWNjZXNzS2V5IiwgKFB5Q0Z1bmN0aW9uKVF0X1FUVW5yZWdpc3RlckFjY2Vzc0tleSwgMSwKLQkgUHlEb2NfU1RSKCIoU3RyMjU1IGFjY2Vzc0tleVR5cGUsIGxvbmcgZmxhZ3MsIEhhbmRsZSBhY2Nlc3NLZXkpIC0+IE5vbmUiKX0sCi0JeyJRVEdldFN1cHBvcnRlZFJlc3RyaWN0aW9ucyIsIChQeUNGdW5jdGlvbilRdF9RVEdldFN1cHBvcnRlZFJlc3RyaWN0aW9ucywgMSwKLQkgUHlEb2NfU1RSKCIoT1NUeXBlIGluUmVzdHJpY3Rpb25DbGFzcykgLT4gKFVJbnQzMiBvdXRSZXN0cmljdGlvbklEcykiKX0sCi0JeyJRVFRleHRUb05hdGl2ZVRleHQiLCAoUHlDRnVuY3Rpb24pUXRfUVRUZXh0VG9OYXRpdmVUZXh0LCAxLAotCSBQeURvY19TVFIoIihIYW5kbGUgdGhlVGV4dCwgbG9uZyBlbmNvZGluZywgbG9uZyBmbGFncykgLT4gTm9uZSIpfSwKLQl7IlZpZGVvTWVkaWFSZXNldFN0YXRpc3RpY3MiLCAoUHlDRnVuY3Rpb24pUXRfVmlkZW9NZWRpYVJlc2V0U3RhdGlzdGljcywgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJWaWRlb01lZGlhR2V0U3RhdGlzdGljcyIsIChQeUNGdW5jdGlvbilRdF9WaWRlb01lZGlhR2V0U3RhdGlzdGljcywgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJWaWRlb01lZGlhR2V0U3RhbGxDb3VudCIsIChQeUNGdW5jdGlvbilRdF9WaWRlb01lZGlhR2V0U3RhbGxDb3VudCwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgbG9uZyBzdGFsbHMpIil9LAotCXsiVmlkZW9NZWRpYVNldENvZGVjUGFyYW1ldGVyIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZpZGVvTWVkaWFTZXRDb2RlY1BhcmFtZXRlciwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBDb2RlY1R5cGUgY1R5cGUsIE9TVHlwZSBwYXJhbWV0ZXJJRCwgbG9uZyBwYXJhbWV0ZXJDaGFuZ2VTZWVkLCB2b2lkICogZGF0YVB0ciwgbG9uZyBkYXRhU2l6ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiVmlkZW9NZWRpYUdldENvZGVjUGFyYW1ldGVyIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZpZGVvTWVkaWFHZXRDb2RlY1BhcmFtZXRlciwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBDb2RlY1R5cGUgY1R5cGUsIE9TVHlwZSBwYXJhbWV0ZXJJRCwgSGFuZGxlIG91dFBhcmFtZXRlckRhdGEpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlRleHRNZWRpYUFkZFRleHRTYW1wbGUiLCAoUHlDRnVuY3Rpb24pUXRfVGV4dE1lZGlhQWRkVGV4dFNhbXBsZSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBQdHIgdGV4dCwgdW5zaWduZWQgbG9uZyBzaXplLCBzaG9ydCBmb250TnVtYmVyLCBzaG9ydCBmb250U2l6ZSwgU3R5bGUgdGV4dEZhY2UsIHNob3J0IHRleHRKdXN0aWZpY2F0aW9uLCBsb25nIGRpc3BsYXlGbGFncywgVGltZVZhbHVlIHNjcm9sbERlbGF5LCBzaG9ydCBoaWxpdGVTdGFydCwgc2hvcnQgaGlsaXRlRW5kLCBUaW1lVmFsdWUgZHVyYXRpb24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSR0JDb2xvciB0ZXh0Q29sb3IsIFJHQkNvbG9yIGJhY2tDb2xvciwgUmVjdCB0ZXh0Qm94LCBSR0JDb2xvciByZ2JIaWxpdGVDb2xvciwgVGltZVZhbHVlIHNhbXBsZVRpbWUpIil9LAotCXsiVGV4dE1lZGlhQWRkVEVTYW1wbGUiLCAoUHlDRnVuY3Rpb24pUXRfVGV4dE1lZGlhQWRkVEVTYW1wbGUsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgVEVIYW5kbGUgaFRFLCBzaG9ydCB0ZXh0SnVzdGlmaWNhdGlvbiwgbG9uZyBkaXNwbGF5RmxhZ3MsIFRpbWVWYWx1ZSBzY3JvbGxEZWxheSwgc2hvcnQgaGlsaXRlU3RhcnQsIHNob3J0IGhpbGl0ZUVuZCwgVGltZVZhbHVlIGR1cmF0aW9uKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUkdCQ29sb3IgYmFja0NvbG9yLCBSZWN0IHRleHRCb3gsIFJHQkNvbG9yIHJnYkhpbGl0ZUNvbG9yLCBUaW1lVmFsdWUgc2FtcGxlVGltZSkiKX0sCi0JeyJUZXh0TWVkaWFBZGRIaWxpdGVTYW1wbGUiLCAoUHlDRnVuY3Rpb24pUXRfVGV4dE1lZGlhQWRkSGlsaXRlU2FtcGxlLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIHNob3J0IGhpbGl0ZVN0YXJ0LCBzaG9ydCBoaWxpdGVFbmQsIFRpbWVWYWx1ZSBkdXJhdGlvbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJHQkNvbG9yIHJnYkhpbGl0ZUNvbG9yLCBUaW1lVmFsdWUgc2FtcGxlVGltZSkiKX0sCi0JeyJUZXh0TWVkaWFEcmF3UmF3IiwgKFB5Q0Z1bmN0aW9uKVF0X1RleHRNZWRpYURyYXdSYXcsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgR1dvcmxkUHRyIGd3LCBHREhhbmRsZSBnZCwgdm9pZCAqIGRhdGEsIGxvbmcgZGF0YVNpemUsIFRleHREZXNjcmlwdGlvbkhhbmRsZSB0ZGgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlRleHRNZWRpYVNldFRleHRQcm9wZXJ0eSIsIChQeUNGdW5jdGlvbilRdF9UZXh0TWVkaWFTZXRUZXh0UHJvcGVydHksIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgVGltZVZhbHVlIGF0TWVkaWFUaW1lLCBsb25nIHByb3BlcnR5VHlwZSwgdm9pZCAqIGRhdGEsIGxvbmcgZGF0YVNpemUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlRleHRNZWRpYVJhd1NldHVwIiwgKFB5Q0Z1bmN0aW9uKVF0X1RleHRNZWRpYVJhd1NldHVwLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIEdXb3JsZFB0ciBndywgR0RIYW5kbGUgZ2QsIHZvaWQgKiBkYXRhLCBsb25nIGRhdGFTaXplLCBUZXh0RGVzY3JpcHRpb25IYW5kbGUgdGRoLCBUaW1lVmFsdWUgc2FtcGxlRHVyYXRpb24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlRleHRNZWRpYVJhd0lkbGUiLCAoUHlDRnVuY3Rpb24pUXRfVGV4dE1lZGlhUmF3SWRsZSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBHV29ybGRQdHIgZ3csIEdESGFuZGxlIGdkLCBUaW1lVmFsdWUgc2FtcGxlVGltZSwgbG9uZyBmbGFnc0luKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBmbGFnc091dCkiKX0sCi0JeyJUZXh0TWVkaWFHZXRUZXh0UHJvcGVydHkiLCAoUHlDRnVuY3Rpb24pUXRfVGV4dE1lZGlhR2V0VGV4dFByb3BlcnR5LCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFRpbWVWYWx1ZSBhdE1lZGlhVGltZSwgbG9uZyBwcm9wZXJ0eVR5cGUsIHZvaWQgKiBkYXRhLCBsb25nIGRhdGFTaXplKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJUZXh0TWVkaWFGaW5kTmV4dFRleHQiLCAoUHlDRnVuY3Rpb24pUXRfVGV4dE1lZGlhRmluZE5leHRUZXh0LCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFB0ciB0ZXh0LCBsb25nIHNpemUsIHNob3J0IGZpbmRGbGFncywgVGltZVZhbHVlIHN0YXJ0VGltZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFRpbWVWYWx1ZSBmb3VuZFRpbWUsIFRpbWVWYWx1ZSBmb3VuZER1cmF0aW9uLCBsb25nIG9mZnNldCkiKX0sCi0JeyJUZXh0TWVkaWFIaWxpdGVUZXh0U2FtcGxlIiwgKFB5Q0Z1bmN0aW9uKVF0X1RleHRNZWRpYUhpbGl0ZVRleHRTYW1wbGUsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgVGltZVZhbHVlIHNhbXBsZVRpbWUsIHNob3J0IGhpbGl0ZVN0YXJ0LCBzaG9ydCBoaWxpdGVFbmQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSR0JDb2xvciByZ2JIaWxpdGVDb2xvcikiKX0sCi0JeyJUZXh0TWVkaWFTZXRUZXh0U2FtcGxlRGF0YSIsIChQeUNGdW5jdGlvbilRdF9UZXh0TWVkaWFTZXRUZXh0U2FtcGxlRGF0YSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCB2b2lkICogZGF0YSwgT1NUeXBlIGRhdGFUeXBlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTcHJpdGVNZWRpYVNldFByb3BlcnR5IiwgKFB5Q0Z1bmN0aW9uKVF0X1Nwcml0ZU1lZGlhU2V0UHJvcGVydHksIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgc2hvcnQgc3ByaXRlSW5kZXgsIGxvbmcgcHJvcGVydHlUeXBlLCB2b2lkICogcHJvcGVydHlWYWx1ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU3ByaXRlTWVkaWFHZXRQcm9wZXJ0eSIsIChQeUNGdW5jdGlvbilRdF9TcHJpdGVNZWRpYUdldFByb3BlcnR5LCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIHNob3J0IHNwcml0ZUluZGV4LCBsb25nIHByb3BlcnR5VHlwZSwgdm9pZCAqIHByb3BlcnR5VmFsdWUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNwcml0ZU1lZGlhSGl0VGVzdFNwcml0ZXMiLCAoUHlDRnVuY3Rpb24pUXRfU3ByaXRlTWVkaWFIaXRUZXN0U3ByaXRlcywgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBsb25nIGZsYWdzLCBQb2ludCBsb2MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBzaG9ydCBzcHJpdGVIaXRJbmRleCkiKX0sCi0JeyJTcHJpdGVNZWRpYUNvdW50U3ByaXRlcyIsIChQeUNGdW5jdGlvbilRdF9TcHJpdGVNZWRpYUNvdW50U3ByaXRlcywgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgc2hvcnQgbnVtU3ByaXRlcykiKX0sCi0JeyJTcHJpdGVNZWRpYUNvdW50SW1hZ2VzIiwgKFB5Q0Z1bmN0aW9uKVF0X1Nwcml0ZU1lZGlhQ291bnRJbWFnZXMsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHNob3J0IG51bUltYWdlcykiKX0sCi0JeyJTcHJpdGVNZWRpYUdldEluZEltYWdlRGVzY3JpcHRpb24iLCAoUHlDRnVuY3Rpb24pUXRfU3ByaXRlTWVkaWFHZXRJbmRJbWFnZURlc2NyaXB0aW9uLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIHNob3J0IGltYWdlSW5kZXgsIEltYWdlRGVzY3JpcHRpb25IYW5kbGUgaW1hZ2VEZXNjcmlwdGlvbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU3ByaXRlTWVkaWFHZXREaXNwbGF5ZWRTYW1wbGVOdW1iZXIiLCAoUHlDRnVuY3Rpb24pUXRfU3ByaXRlTWVkaWFHZXREaXNwbGF5ZWRTYW1wbGVOdW1iZXIsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgc2FtcGxlTnVtKSIpfSwKLQl7IlNwcml0ZU1lZGlhR2V0U3ByaXRlTmFtZSIsIChQeUNGdW5jdGlvbilRdF9TcHJpdGVNZWRpYUdldFNwcml0ZU5hbWUsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgUVRBdG9tSUQgc3ByaXRlSUQsIFN0cjI1NSBzcHJpdGVOYW1lKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTcHJpdGVNZWRpYUdldEltYWdlTmFtZSIsIChQeUNGdW5jdGlvbilRdF9TcHJpdGVNZWRpYUdldEltYWdlTmFtZSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBzaG9ydCBpbWFnZUluZGV4LCBTdHIyNTUgaW1hZ2VOYW1lKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTcHJpdGVNZWRpYVNldFNwcml0ZVByb3BlcnR5IiwgKFB5Q0Z1bmN0aW9uKVF0X1Nwcml0ZU1lZGlhU2V0U3ByaXRlUHJvcGVydHksIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgUVRBdG9tSUQgc3ByaXRlSUQsIGxvbmcgcHJvcGVydHlUeXBlLCB2b2lkICogcHJvcGVydHlWYWx1ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU3ByaXRlTWVkaWFHZXRTcHJpdGVQcm9wZXJ0eSIsIChQeUNGdW5jdGlvbilRdF9TcHJpdGVNZWRpYUdldFNwcml0ZVByb3BlcnR5LCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFFUQXRvbUlEIHNwcml0ZUlELCBsb25nIHByb3BlcnR5VHlwZSwgdm9pZCAqIHByb3BlcnR5VmFsdWUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNwcml0ZU1lZGlhSGl0VGVzdEFsbFNwcml0ZXMiLCAoUHlDRnVuY3Rpb24pUXRfU3ByaXRlTWVkaWFIaXRUZXN0QWxsU3ByaXRlcywgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBsb25nIGZsYWdzLCBQb2ludCBsb2MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBRVEF0b21JRCBzcHJpdGVIaXRJRCkiKX0sCi0JeyJTcHJpdGVNZWRpYUhpdFRlc3RPbmVTcHJpdGUiLCAoUHlDRnVuY3Rpb24pUXRfU3ByaXRlTWVkaWFIaXRUZXN0T25lU3ByaXRlLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFFUQXRvbUlEIHNwcml0ZUlELCBsb25nIGZsYWdzLCBQb2ludCBsb2MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBCb29sZWFuIHdhc0hpdCkiKX0sCi0JeyJTcHJpdGVNZWRpYVNwcml0ZUluZGV4VG9JRCIsIChQeUNGdW5jdGlvbilRdF9TcHJpdGVNZWRpYVNwcml0ZUluZGV4VG9JRCwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBzaG9ydCBzcHJpdGVJbmRleCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFFUQXRvbUlEIHNwcml0ZUlEKSIpfSwKLQl7IlNwcml0ZU1lZGlhU3ByaXRlSURUb0luZGV4IiwgKFB5Q0Z1bmN0aW9uKVF0X1Nwcml0ZU1lZGlhU3ByaXRlSURUb0luZGV4LCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFFUQXRvbUlEIHNwcml0ZUlEKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgc2hvcnQgc3ByaXRlSW5kZXgpIil9LAotCXsiU3ByaXRlTWVkaWFTZXRBY3Rpb25WYXJpYWJsZSIsIChQeUNGdW5jdGlvbilRdF9TcHJpdGVNZWRpYVNldEFjdGlvblZhcmlhYmxlLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFFUQXRvbUlEIHZhcmlhYmxlSUQsIGZsb2F0IHZhbHVlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTcHJpdGVNZWRpYUdldEFjdGlvblZhcmlhYmxlIiwgKFB5Q0Z1bmN0aW9uKVF0X1Nwcml0ZU1lZGlhR2V0QWN0aW9uVmFyaWFibGUsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgUVRBdG9tSUQgdmFyaWFibGVJRCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGZsb2F0IHZhbHVlKSIpfSwKLQl7IlNwcml0ZU1lZGlhRGlzcG9zZVNwcml0ZSIsIChQeUNGdW5jdGlvbilRdF9TcHJpdGVNZWRpYURpc3Bvc2VTcHJpdGUsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgUVRBdG9tSUQgc3ByaXRlSUQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNwcml0ZU1lZGlhU2V0QWN0aW9uVmFyaWFibGVUb1N0cmluZyIsIChQeUNGdW5jdGlvbilRdF9TcHJpdGVNZWRpYVNldEFjdGlvblZhcmlhYmxlVG9TdHJpbmcsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgUVRBdG9tSUQgdmFyaWFibGVJRCwgUHRyIHRoZUNTdHJpbmcpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNwcml0ZU1lZGlhR2V0QWN0aW9uVmFyaWFibGVBc1N0cmluZyIsIChQeUNGdW5jdGlvbilRdF9TcHJpdGVNZWRpYUdldEFjdGlvblZhcmlhYmxlQXNTdHJpbmcsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgUVRBdG9tSUQgdmFyaWFibGVJRCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEhhbmRsZSB0aGVDU3RyaW5nKSIpfSwKLQl7IlNwcml0ZU1lZGlhTmV3SW1hZ2UiLCAoUHlDRnVuY3Rpb24pUXRfU3ByaXRlTWVkaWFOZXdJbWFnZSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlLCBRVEF0b21JRCBkZXNpcmVkSUQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNwcml0ZU1lZGlhRGlzcG9zZUltYWdlIiwgKFB5Q0Z1bmN0aW9uKVF0X1Nwcml0ZU1lZGlhRGlzcG9zZUltYWdlLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIHNob3J0IGltYWdlSW5kZXgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNwcml0ZU1lZGlhSW1hZ2VJbmRleFRvSUQiLCAoUHlDRnVuY3Rpb24pUXRfU3ByaXRlTWVkaWFJbWFnZUluZGV4VG9JRCwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBzaG9ydCBpbWFnZUluZGV4KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUVRBdG9tSUQgaW1hZ2VJRCkiKX0sCi0JeyJTcHJpdGVNZWRpYUltYWdlSURUb0luZGV4IiwgKFB5Q0Z1bmN0aW9uKVF0X1Nwcml0ZU1lZGlhSW1hZ2VJRFRvSW5kZXgsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgUVRBdG9tSUQgaW1hZ2VJRCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHNob3J0IGltYWdlSW5kZXgpIil9LAotCXsiRmxhc2hNZWRpYVNldFBhbiIsIChQeUNGdW5jdGlvbilRdF9GbGFzaE1lZGlhU2V0UGFuLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIHNob3J0IHhQZXJjZW50LCBzaG9ydCB5UGVyY2VudCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiRmxhc2hNZWRpYVNldFpvb20iLCAoUHlDRnVuY3Rpb24pUXRfRmxhc2hNZWRpYVNldFpvb20sIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgc2hvcnQgZmFjdG9yKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJGbGFzaE1lZGlhU2V0Wm9vbVJlY3QiLCAoUHlDRnVuY3Rpb24pUXRfRmxhc2hNZWRpYVNldFpvb21SZWN0LCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIGxvbmcgbGVmdCwgbG9uZyB0b3AsIGxvbmcgcmlnaHQsIGxvbmcgYm90dG9tKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJGbGFzaE1lZGlhR2V0UmVmQ29uQm91bmRzIiwgKFB5Q0Z1bmN0aW9uKVF0X0ZsYXNoTWVkaWFHZXRSZWZDb25Cb3VuZHMsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgbG9uZyByZWZDb24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIGxlZnQsIGxvbmcgdG9wLCBsb25nIHJpZ2h0LCBsb25nIGJvdHRvbSkiKX0sCi0JeyJGbGFzaE1lZGlhR2V0UmVmQ29uSUQiLCAoUHlDRnVuY3Rpb24pUXRfRmxhc2hNZWRpYUdldFJlZkNvbklELCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIGxvbmcgcmVmQ29uKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyByZWZDb25JRCkiKX0sCi0JeyJGbGFzaE1lZGlhSURUb1JlZkNvbiIsIChQeUNGdW5jdGlvbilRdF9GbGFzaE1lZGlhSURUb1JlZkNvbiwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBsb25nIHJlZkNvbklEKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyByZWZDb24pIil9LAotCXsiRmxhc2hNZWRpYUdldERpc3BsYXllZEZyYW1lTnVtYmVyIiwgKFB5Q0Z1bmN0aW9uKVF0X0ZsYXNoTWVkaWFHZXREaXNwbGF5ZWRGcmFtZU51bWJlciwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBmbGFzaEZyYW1lTnVtYmVyKSIpfSwKLQl7IkZsYXNoTWVkaWFGcmFtZU51bWJlclRvTW92aWVUaW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X0ZsYXNoTWVkaWFGcmFtZU51bWJlclRvTW92aWVUaW1lLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIGxvbmcgZmxhc2hGcmFtZU51bWJlcikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFRpbWVWYWx1ZSBtb3ZpZVRpbWUpIil9LAotCXsiRmxhc2hNZWRpYUZyYW1lTGFiZWxUb01vdmllVGltZSIsIChQeUNGdW5jdGlvbilRdF9GbGFzaE1lZGlhRnJhbWVMYWJlbFRvTW92aWVUaW1lLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFB0ciB0aGVMYWJlbCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFRpbWVWYWx1ZSBtb3ZpZVRpbWUpIil9LAotCXsiRmxhc2hNZWRpYUdldEZsYXNoVmFyaWFibGUiLCAoUHlDRnVuY3Rpb24pUXRfRmxhc2hNZWRpYUdldEZsYXNoVmFyaWFibGUsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGNoYXIgcGF0aCwgY2hhciBuYW1lLCBIYW5kbGUgdGhlVmFyaWFibGVDU3RyaW5nT3V0KSIpfSwKLQl7IkZsYXNoTWVkaWFTZXRGbGFzaFZhcmlhYmxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0ZsYXNoTWVkaWFTZXRGbGFzaFZhcmlhYmxlLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIEJvb2xlYW4gdXBkYXRlRm9jdXMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBjaGFyIHBhdGgsIGNoYXIgbmFtZSwgY2hhciB2YWx1ZSkiKX0sCi0JeyJGbGFzaE1lZGlhRG9CdXR0b25BY3Rpb25zIiwgKFB5Q0Z1bmN0aW9uKVF0X0ZsYXNoTWVkaWFEb0J1dHRvbkFjdGlvbnMsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgbG9uZyBidXR0b25JRCwgbG9uZyB0cmFuc2l0aW9uKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgY2hhciBwYXRoKSIpfSwKLQl7IkZsYXNoTWVkaWFHZXRTdXBwb3J0ZWRTd2ZWZXJzaW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X0ZsYXNoTWVkaWFHZXRTdXBwb3J0ZWRTd2ZWZXJzaW9uLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBVSW50OCBzd2ZWZXJzaW9uKSIpfSwKLQl7Ik1lZGlhM0RHZXRDdXJyZW50R3JvdXAiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWEzREdldEN1cnJlbnRHcm91cCwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCB2b2lkICogZ3JvdXApIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1lZGlhM0RUcmFuc2xhdGVOYW1lZE9iamVjdFRvIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhM0RUcmFuc2xhdGVOYW1lZE9iamVjdFRvLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIEZpeGVkIHgsIEZpeGVkIHksIEZpeGVkIHopIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBjaGFyIG9iamVjdE5hbWUpIil9LAotCXsiTWVkaWEzRFNjYWxlTmFtZWRPYmplY3RUbyIsIChQeUNGdW5jdGlvbilRdF9NZWRpYTNEU2NhbGVOYW1lZE9iamVjdFRvLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIEZpeGVkIHhTY2FsZSwgRml4ZWQgeVNjYWxlLCBGaXhlZCB6U2NhbGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBjaGFyIG9iamVjdE5hbWUpIil9LAotCXsiTWVkaWEzRFJvdGF0ZU5hbWVkT2JqZWN0VG8iLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWEzRFJvdGF0ZU5hbWVkT2JqZWN0VG8sIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgRml4ZWQgeERlZ3JlZXMsIEZpeGVkIHlEZWdyZWVzLCBGaXhlZCB6RGVncmVlcykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGNoYXIgb2JqZWN0TmFtZSkiKX0sCi0JeyJNZWRpYTNEU2V0Q2FtZXJhRGF0YSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYTNEU2V0Q2FtZXJhRGF0YSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCB2b2lkICogY2FtZXJhRGF0YSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTWVkaWEzREdldENhbWVyYURhdGEiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWEzREdldENhbWVyYURhdGEsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgdm9pZCAqIGNhbWVyYURhdGEpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1lZGlhM0RTZXRDYW1lcmFBbmdsZUFzcGVjdCIsIChQeUNGdW5jdGlvbilRdF9NZWRpYTNEU2V0Q2FtZXJhQW5nbGVBc3BlY3QsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgUVRGbG9hdFNpbmdsZSBmb3YsIFFURmxvYXRTaW5nbGUgYXNwZWN0UmF0aW9YVG9ZKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNZWRpYTNER2V0Q2FtZXJhQW5nbGVBc3BlY3QiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWEzREdldENhbWVyYUFuZ2xlQXNwZWN0LCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBRVEZsb2F0U2luZ2xlIGZvdiwgUVRGbG9hdFNpbmdsZSBhc3BlY3RSYXRpb1hUb1kpIil9LAotCXsiTWVkaWEzRFNldENhbWVyYVJhbmdlIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhM0RTZXRDYW1lcmFSYW5nZSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCB2b2lkICogdFEzQ2FtZXJhUmFuZ2UpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1lZGlhM0RHZXRDYW1lcmFSYW5nZSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYTNER2V0Q2FtZXJhUmFuZ2UsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgdm9pZCAqIHRRM0NhbWVyYVJhbmdlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJOZXdUaW1lQmFzZSIsIChQeUNGdW5jdGlvbilRdF9OZXdUaW1lQmFzZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVGltZUJhc2UgX3J2KSIpfSwKLQl7IkNvbnZlcnRUaW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X0NvbnZlcnRUaW1lLCAxLAotCSBQeURvY19TVFIoIihUaW1lUmVjb3JkIHRoZVRpbWUsIFRpbWVCYXNlIG5ld0Jhc2UpIC0+IChUaW1lUmVjb3JkIHRoZVRpbWUpIil9LAotCXsiQ29udmVydFRpbWVTY2FsZSIsIChQeUNGdW5jdGlvbilRdF9Db252ZXJ0VGltZVNjYWxlLCAxLAotCSBQeURvY19TVFIoIihUaW1lUmVjb3JkIHRoZVRpbWUsIFRpbWVTY2FsZSBuZXdTY2FsZSkgLT4gKFRpbWVSZWNvcmQgdGhlVGltZSkiKX0sCi0JeyJBZGRUaW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X0FkZFRpbWUsIDEsCi0JIFB5RG9jX1NUUigiKFRpbWVSZWNvcmQgZHN0LCBUaW1lUmVjb3JkIHNyYykgLT4gKFRpbWVSZWNvcmQgZHN0KSIpfSwKLQl7IlN1YnRyYWN0VGltZSIsIChQeUNGdW5jdGlvbilRdF9TdWJ0cmFjdFRpbWUsIDEsCi0JIFB5RG9jX1NUUigiKFRpbWVSZWNvcmQgZHN0LCBUaW1lUmVjb3JkIHNyYykgLT4gKFRpbWVSZWNvcmQgZHN0KSIpfSwKLQl7Ik11c2ljTWVkaWFHZXRJbmRleGVkVHVuZVBsYXllciIsIChQeUNGdW5jdGlvbilRdF9NdXNpY01lZGlhR2V0SW5kZXhlZFR1bmVQbGF5ZXIsIDEsCi0JIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIHRpLCBsb25nIHNhbXBsZURlc2NJbmRleCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIENvbXBvbmVudEluc3RhbmNlIHRwKSIpfSwKLQl7IkNvZGVjTWFuYWdlclZlcnNpb24iLCAoUHlDRnVuY3Rpb24pUXRfQ29kZWNNYW5hZ2VyVmVyc2lvbiwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAobG9uZyB2ZXJzaW9uKSIpfSwKLQl7IkdldE1heENvbXByZXNzaW9uU2l6ZSIsIChQeUNGdW5jdGlvbilRdF9HZXRNYXhDb21wcmVzc2lvblNpemUsIDEsCi0JIFB5RG9jX1NUUigiKFBpeE1hcEhhbmRsZSBzcmMsIFJlY3Qgc3JjUmVjdCwgc2hvcnQgY29sb3JEZXB0aCwgQ29kZWNRIHF1YWxpdHksIENvZGVjVHlwZSBjVHlwZSwgQ29tcHJlc3NvckNvbXBvbmVudCBjb2RlYykgLT4gKGxvbmcgc2l6ZSkiKX0sCi0JeyJHZXRDb21wcmVzc2lvblRpbWUiLCAoUHlDRnVuY3Rpb24pUXRfR2V0Q29tcHJlc3Npb25UaW1lLCAxLAotCSBQeURvY19TVFIoIihQaXhNYXBIYW5kbGUgc3JjLCBSZWN0IHNyY1JlY3QsIHNob3J0IGNvbG9yRGVwdGgsIENvZGVjVHlwZSBjVHlwZSwgQ29tcHJlc3NvckNvbXBvbmVudCBjb2RlYykgLT4gKENvZGVjUSBzcGF0aWFsUXVhbGl0eSwgQ29kZWNRIHRlbXBvcmFsUXVhbGl0eSwgdW5zaWduZWQgbG9uZyBjb21wcmVzc1RpbWUpIil9LAotCXsiQ29tcHJlc3NJbWFnZSIsIChQeUNGdW5jdGlvbilRdF9Db21wcmVzc0ltYWdlLCAxLAotCSBQeURvY19TVFIoIihQaXhNYXBIYW5kbGUgc3JjLCBSZWN0IHNyY1JlY3QsIENvZGVjUSBxdWFsaXR5LCBDb2RlY1R5cGUgY1R5cGUsIEltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYywgUHRyIGRhdGEpIC0+IE5vbmUiKX0sCi0JeyJEZWNvbXByZXNzSW1hZ2UiLCAoUHlDRnVuY3Rpb24pUXRfRGVjb21wcmVzc0ltYWdlLCAxLAotCSBQeURvY19TVFIoIihQdHIgZGF0YSwgSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjLCBQaXhNYXBIYW5kbGUgZHN0LCBSZWN0IHNyY1JlY3QsIFJlY3QgZHN0UmVjdCwgc2hvcnQgbW9kZSwgUmduSGFuZGxlIG1hc2spIC0+IE5vbmUiKX0sCi0JeyJHZXRTaW1pbGFyaXR5IiwgKFB5Q0Z1bmN0aW9uKVF0X0dldFNpbWlsYXJpdHksIDEsCi0JIFB5RG9jX1NUUigiKFBpeE1hcEhhbmRsZSBzcmMsIFJlY3Qgc3JjUmVjdCwgSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjLCBQdHIgZGF0YSkgLT4gKEZpeGVkIHNpbWlsYXJpdHkpIil9LAotCXsiR2V0SW1hZ2VEZXNjcmlwdGlvbkNUYWJsZSIsIChQeUNGdW5jdGlvbilRdF9HZXRJbWFnZURlc2NyaXB0aW9uQ1RhYmxlLCAxLAotCSBQeURvY19TVFIoIihJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2MpIC0+IChDVGFiSGFuZGxlIGN0YWJsZSkiKX0sCi0JeyJTZXRJbWFnZURlc2NyaXB0aW9uQ1RhYmxlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NldEltYWdlRGVzY3JpcHRpb25DVGFibGUsIDEsCi0JIFB5RG9jX1NUUigiKEltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYywgQ1RhYkhhbmRsZSBjdGFibGUpIC0+IE5vbmUiKX0sCi0JeyJHZXRJbWFnZURlc2NyaXB0aW9uRXh0ZW5zaW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X0dldEltYWdlRGVzY3JpcHRpb25FeHRlbnNpb24sIDEsCi0JIFB5RG9jX1NUUigiKEltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYywgbG9uZyBpZFR5cGUsIGxvbmcgaW5kZXgpIC0+IChIYW5kbGUgZXh0ZW5zaW9uKSIpfSwKLQl7IkFkZEltYWdlRGVzY3JpcHRpb25FeHRlbnNpb24iLCAoUHlDRnVuY3Rpb24pUXRfQWRkSW1hZ2VEZXNjcmlwdGlvbkV4dGVuc2lvbiwgMSwKLQkgUHlEb2NfU1RSKCIoSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjLCBIYW5kbGUgZXh0ZW5zaW9uLCBsb25nIGlkVHlwZSkgLT4gTm9uZSIpfSwKLQl7IlJlbW92ZUltYWdlRGVzY3JpcHRpb25FeHRlbnNpb24iLCAoUHlDRnVuY3Rpb24pUXRfUmVtb3ZlSW1hZ2VEZXNjcmlwdGlvbkV4dGVuc2lvbiwgMSwKLQkgUHlEb2NfU1RSKCIoSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjLCBsb25nIGlkVHlwZSwgbG9uZyBpbmRleCkgLT4gTm9uZSIpfSwKLQl7IkNvdW50SW1hZ2VEZXNjcmlwdGlvbkV4dGVuc2lvblR5cGUiLCAoUHlDRnVuY3Rpb24pUXRfQ291bnRJbWFnZURlc2NyaXB0aW9uRXh0ZW5zaW9uVHlwZSwgMSwKLQkgUHlEb2NfU1RSKCIoSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjLCBsb25nIGlkVHlwZSkgLT4gKGxvbmcgY291bnQpIil9LAotCXsiR2V0TmV4dEltYWdlRGVzY3JpcHRpb25FeHRlbnNpb25UeXBlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dldE5leHRJbWFnZURlc2NyaXB0aW9uRXh0ZW5zaW9uVHlwZSwgMSwKLQkgUHlEb2NfU1RSKCIoSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjKSAtPiAobG9uZyBpZFR5cGUpIil9LAotCXsiRmluZENvZGVjIiwgKFB5Q0Z1bmN0aW9uKVF0X0ZpbmRDb2RlYywgMSwKLQkgUHlEb2NfU1RSKCIoQ29kZWNUeXBlIGNUeXBlLCBDb2RlY0NvbXBvbmVudCBzcGVjQ29kZWMpIC0+IChDb21wcmVzc29yQ29tcG9uZW50IGNvbXByZXNzb3IsIERlY29tcHJlc3NvckNvbXBvbmVudCBkZWNvbXByZXNzb3IpIil9LAotCXsiQ29tcHJlc3NQaWN0dXJlIiwgKFB5Q0Z1bmN0aW9uKVF0X0NvbXByZXNzUGljdHVyZSwgMSwKLQkgUHlEb2NfU1RSKCIoUGljSGFuZGxlIHNyY1BpY3R1cmUsIFBpY0hhbmRsZSBkc3RQaWN0dXJlLCBDb2RlY1EgcXVhbGl0eSwgQ29kZWNUeXBlIGNUeXBlKSAtPiBOb25lIil9LAotCXsiQ29tcHJlc3NQaWN0dXJlRmlsZSIsIChQeUNGdW5jdGlvbilRdF9Db21wcmVzc1BpY3R1cmVGaWxlLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBzcmNSZWZOdW0sIHNob3J0IGRzdFJlZk51bSwgQ29kZWNRIHF1YWxpdHksIENvZGVjVHlwZSBjVHlwZSkgLT4gTm9uZSIpfSwKLQl7IkNvbnZlcnRJbWFnZSIsIChQeUNGdW5jdGlvbilRdF9Db252ZXJ0SW1hZ2UsIDEsCi0JIFB5RG9jX1NUUigiKEltYWdlRGVzY3JpcHRpb25IYW5kbGUgc3JjREQsIFB0ciBzcmNEYXRhLCBzaG9ydCBjb2xvckRlcHRoLCBDVGFiSGFuZGxlIGN0YWJsZSwgQ29kZWNRIGFjY3VyYWN5LCBDb2RlY1EgcXVhbGl0eSwgQ29kZWNUeXBlIGNUeXBlLCBDb2RlY0NvbXBvbmVudCBjb2RlYywgSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkc3RERCwgUHRyIGRzdERhdGEpIC0+IE5vbmUiKX0sCi0JeyJBZGRGaWxlUHJldmlldyIsIChQeUNGdW5jdGlvbilRdF9BZGRGaWxlUHJldmlldywgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgcmVzUmVmTnVtLCBPU1R5cGUgcHJldmlld1R5cGUsIEhhbmRsZSBwcmV2aWV3RGF0YSkgLT4gTm9uZSIpfSwKLQl7IkdldEJlc3REZXZpY2VSZWN0IiwgKFB5Q0Z1bmN0aW9uKVF0X0dldEJlc3REZXZpY2VSZWN0LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChHREhhbmRsZSBnZGgsIFJlY3QgcnApIil9LAotCXsiR0RIYXNTY2FsZSIsIChQeUNGdW5jdGlvbilRdF9HREhhc1NjYWxlLCAxLAotCSBQeURvY19TVFIoIihHREhhbmRsZSBnZGgsIHNob3J0IGRlcHRoKSAtPiAoRml4ZWQgc2NhbGUpIil9LAotCXsiR0RHZXRTY2FsZSIsIChQeUNGdW5jdGlvbilRdF9HREdldFNjYWxlLCAxLAotCSBQeURvY19TVFIoIihHREhhbmRsZSBnZGgpIC0+IChGaXhlZCBzY2FsZSwgc2hvcnQgZmxhZ3MpIil9LAotCXsiR0RTZXRTY2FsZSIsIChQeUNGdW5jdGlvbilRdF9HRFNldFNjYWxlLCAxLAotCSBQeURvY19TVFIoIihHREhhbmRsZSBnZGgsIEZpeGVkIHNjYWxlLCBzaG9ydCBmbGFncykgLT4gTm9uZSIpfSwKLQl7IkdldEdyYXBoaWNzSW1wb3J0ZXJGb3JGaWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dldEdyYXBoaWNzSW1wb3J0ZXJGb3JGaWxlLCAxLAotCSBQeURvY19TVFIoIihGU1NwZWMgdGhlRmlsZSkgLT4gKENvbXBvbmVudEluc3RhbmNlIGdpKSIpfSwKLQl7IkdldEdyYXBoaWNzSW1wb3J0ZXJGb3JEYXRhUmVmIiwgKFB5Q0Z1bmN0aW9uKVF0X0dldEdyYXBoaWNzSW1wb3J0ZXJGb3JEYXRhUmVmLCAxLAotCSBQeURvY19TVFIoIihIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlKSAtPiAoQ29tcG9uZW50SW5zdGFuY2UgZ2kpIil9LAotCXsiR2V0R3JhcGhpY3NJbXBvcnRlckZvckZpbGVXaXRoRmxhZ3MiLCAoUHlDRnVuY3Rpb24pUXRfR2V0R3JhcGhpY3NJbXBvcnRlckZvckZpbGVXaXRoRmxhZ3MsIDEsCi0JIFB5RG9jX1NUUigiKEZTU3BlYyB0aGVGaWxlLCBsb25nIGZsYWdzKSAtPiAoQ29tcG9uZW50SW5zdGFuY2UgZ2kpIil9LAotCXsiR2V0R3JhcGhpY3NJbXBvcnRlckZvckRhdGFSZWZXaXRoRmxhZ3MiLCAoUHlDRnVuY3Rpb24pUXRfR2V0R3JhcGhpY3NJbXBvcnRlckZvckRhdGFSZWZXaXRoRmxhZ3MsIDEsCi0JIFB5RG9jX1NUUigiKEhhbmRsZSBkYXRhUmVmLCBPU1R5cGUgZGF0YVJlZlR5cGUsIGxvbmcgZmxhZ3MpIC0+IChDb21wb25lbnRJbnN0YW5jZSBnaSkiKX0sCi0JeyJNYWtlSW1hZ2VEZXNjcmlwdGlvbkZvclBpeE1hcCIsIChQeUNGdW5jdGlvbilRdF9NYWtlSW1hZ2VEZXNjcmlwdGlvbkZvclBpeE1hcCwgMSwKLQkgUHlEb2NfU1RSKCIoUGl4TWFwSGFuZGxlIHBpeG1hcCkgLT4gKEltYWdlRGVzY3JpcHRpb25IYW5kbGUgaWRoKSIpfSwKLQl7Ik1ha2VJbWFnZURlc2NyaXB0aW9uRm9yRWZmZWN0IiwgKFB5Q0Z1bmN0aW9uKVF0X01ha2VJbWFnZURlc2NyaXB0aW9uRm9yRWZmZWN0LCAxLAotCSBQeURvY19TVFIoIihPU1R5cGUgZWZmZWN0VHlwZSkgLT4gKEltYWdlRGVzY3JpcHRpb25IYW5kbGUgaWRoKSIpfSwKLQl7IlFUR2V0UGl4ZWxTaXplIiwgKFB5Q0Z1bmN0aW9uKVF0X1FUR2V0UGl4ZWxTaXplLCAxLAotCSBQeURvY19TVFIoIihPU1R5cGUgUGl4ZWxGb3JtYXQpIC0+IChzaG9ydCBfcnYpIil9LAotCXsiUVRHZXRQaXhlbEZvcm1hdERlcHRoRm9ySW1hZ2VEZXNjcmlwdGlvbiIsIChQeUNGdW5jdGlvbilRdF9RVEdldFBpeGVsRm9ybWF0RGVwdGhGb3JJbWFnZURlc2NyaXB0aW9uLCAxLAotCSBQeURvY19TVFIoIihPU1R5cGUgUGl4ZWxGb3JtYXQpIC0+IChzaG9ydCBfcnYpIil9LAotCXsiUVRHZXRQaXhNYXBIYW5kbGVSb3dCeXRlcyIsIChQeUNGdW5jdGlvbilRdF9RVEdldFBpeE1hcEhhbmRsZVJvd0J5dGVzLCAxLAotCSBQeURvY19TVFIoIihQaXhNYXBIYW5kbGUgcG0pIC0+IChsb25nIF9ydikiKX0sCi0JeyJRVFNldFBpeE1hcEhhbmRsZVJvd0J5dGVzIiwgKFB5Q0Z1bmN0aW9uKVF0X1FUU2V0UGl4TWFwSGFuZGxlUm93Qnl0ZXMsIDEsCi0JIFB5RG9jX1NUUigiKFBpeE1hcEhhbmRsZSBwbSwgbG9uZyByb3dCeXRlcykgLT4gTm9uZSIpfSwKLQl7IlFUR2V0UGl4TWFwSGFuZGxlR2FtbWFMZXZlbCIsIChQeUNGdW5jdGlvbilRdF9RVEdldFBpeE1hcEhhbmRsZUdhbW1hTGV2ZWwsIDEsCi0JIFB5RG9jX1NUUigiKFBpeE1hcEhhbmRsZSBwbSkgLT4gKEZpeGVkIF9ydikiKX0sCi0JeyJRVFNldFBpeE1hcEhhbmRsZUdhbW1hTGV2ZWwiLCAoUHlDRnVuY3Rpb24pUXRfUVRTZXRQaXhNYXBIYW5kbGVHYW1tYUxldmVsLCAxLAotCSBQeURvY19TVFIoIihQaXhNYXBIYW5kbGUgcG0sIEZpeGVkIGdhbW1hTGV2ZWwpIC0+IE5vbmUiKX0sCi0JeyJRVEdldFBpeE1hcEhhbmRsZVJlcXVlc3RlZEdhbW1hTGV2ZWwiLCAoUHlDRnVuY3Rpb24pUXRfUVRHZXRQaXhNYXBIYW5kbGVSZXF1ZXN0ZWRHYW1tYUxldmVsLCAxLAotCSBQeURvY19TVFIoIihQaXhNYXBIYW5kbGUgcG0pIC0+IChGaXhlZCBfcnYpIil9LAotCXsiUVRTZXRQaXhNYXBIYW5kbGVSZXF1ZXN0ZWRHYW1tYUxldmVsIiwgKFB5Q0Z1bmN0aW9uKVF0X1FUU2V0UGl4TWFwSGFuZGxlUmVxdWVzdGVkR2FtbWFMZXZlbCwgMSwKLQkgUHlEb2NfU1RSKCIoUGl4TWFwSGFuZGxlIHBtLCBGaXhlZCByZXF1ZXN0ZWRHYW1tYUxldmVsKSAtPiBOb25lIil9LAotCXsiQ29tcEFkZCIsIChQeUNGdW5jdGlvbilRdF9Db21wQWRkLCAxLAotCSBQeURvY19TVFIoIigpIC0+ICh3aWRlIHNyYywgd2lkZSBkc3QpIil9LAotCXsiQ29tcFN1YiIsIChQeUNGdW5jdGlvbilRdF9Db21wU3ViLCAxLAotCSBQeURvY19TVFIoIigpIC0+ICh3aWRlIHNyYywgd2lkZSBkc3QpIil9LAotCXsiQ29tcE5lZyIsIChQeUNGdW5jdGlvbilRdF9Db21wTmVnLCAxLAotCSBQeURvY19TVFIoIigpIC0+ICh3aWRlIGRzdCkiKX0sCi0JeyJDb21wU2hpZnQiLCAoUHlDRnVuY3Rpb24pUXRfQ29tcFNoaWZ0LCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBzaGlmdCkgLT4gKHdpZGUgc3JjKSIpfSwKLQl7IkNvbXBNdWwiLCAoUHlDRnVuY3Rpb24pUXRfQ29tcE11bCwgMSwKLQkgUHlEb2NfU1RSKCIobG9uZyBzcmMxLCBsb25nIHNyYzIpIC0+ICh3aWRlIGRzdCkiKX0sCi0JeyJDb21wRGl2IiwgKFB5Q0Z1bmN0aW9uKVF0X0NvbXBEaXYsIDEsCi0JIFB5RG9jX1NUUigiKGxvbmcgZGVub21pbmF0b3IpIC0+IChsb25nIF9ydiwgd2lkZSBudW1lcmF0b3IsIGxvbmcgcmVtYWluZGVyKSIpfSwKLQl7IkNvbXBGaXhNdWwiLCAoUHlDRnVuY3Rpb24pUXRfQ29tcEZpeE11bCwgMSwKLQkgUHlEb2NfU1RSKCIoRml4ZWQgZml4U3JjKSAtPiAod2lkZSBjb21wU3JjLCB3aWRlIGNvbXBEc3QpIil9LAotCXsiQ29tcE11bERpdiIsIChQeUNGdW5jdGlvbilRdF9Db21wTXVsRGl2LCAxLAotCSBQeURvY19TVFIoIihsb25nIG11bCwgbG9uZyBkaXZpc29yKSAtPiAod2lkZSBjbykiKX0sCi0JeyJDb21wTXVsRGl2VHJ1bmMiLCAoUHlDRnVuY3Rpb24pUXRfQ29tcE11bERpdlRydW5jLCAxLAotCSBQeURvY19TVFIoIihsb25nIG11bCwgbG9uZyBkaXZpc29yKSAtPiAod2lkZSBjbywgbG9uZyByZW1haW5kZXIpIil9LAotCXsiQ29tcENvbXBhcmUiLCAoUHlDRnVuY3Rpb24pUXRfQ29tcENvbXBhcmUsIDEsCi0JIFB5RG9jX1NUUigiKHdpZGUgYSwgd2lkZSBtaW51c2IpIC0+IChsb25nIF9ydikiKX0sCi0JeyJDb21wU3F1YXJlUm9vdCIsIChQeUNGdW5jdGlvbilRdF9Db21wU3F1YXJlUm9vdCwgMSwKLQkgUHlEb2NfU1RSKCIod2lkZSBzcmMpIC0+ICh1bnNpZ25lZCBsb25nIF9ydikiKX0sCi0JeyJGaXhNdWxEaXYiLCAoUHlDRnVuY3Rpb24pUXRfRml4TXVsRGl2LCAxLAotCSBQeURvY19TVFIoIihGaXhlZCBzcmMsIEZpeGVkIG11bCwgRml4ZWQgZGl2aXNvcikgLT4gKEZpeGVkIF9ydikiKX0sCi0JeyJVbnNpZ25lZEZpeE11bERpdiIsIChQeUNGdW5jdGlvbilRdF9VbnNpZ25lZEZpeE11bERpdiwgMSwKLQkgUHlEb2NfU1RSKCIoRml4ZWQgc3JjLCBGaXhlZCBtdWwsIEZpeGVkIGRpdmlzb3IpIC0+IChGaXhlZCBfcnYpIil9LAotCXsiRml4RXhwMiIsIChQeUNGdW5jdGlvbilRdF9GaXhFeHAyLCAxLAotCSBQeURvY19TVFIoIihGaXhlZCBzcmMpIC0+IChGaXhlZCBfcnYpIil9LAotCXsiRml4TG9nMiIsIChQeUNGdW5jdGlvbilRdF9GaXhMb2cyLCAxLAotCSBQeURvY19TVFIoIihGaXhlZCBzcmMpIC0+IChGaXhlZCBfcnYpIil9LAotCXsiRml4UG93IiwgKFB5Q0Z1bmN0aW9uKVF0X0ZpeFBvdywgMSwKLQkgUHlEb2NfU1RSKCIoRml4ZWQgYmFzZSwgRml4ZWQgZXhwKSAtPiAoRml4ZWQgX3J2KSIpfSwKLQl7IkdyYXBoaWNzSW1wb3J0U2V0RGF0YVJlZmVyZW5jZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydFNldERhdGFSZWZlcmVuY2UsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpLCBIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZVR5cGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkdyYXBoaWNzSW1wb3J0R2V0RGF0YVJlZmVyZW5jZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydEdldERhdGFSZWZlcmVuY2UsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSGFuZGxlIGRhdGFSZWYsIE9TVHlwZSBkYXRhUmVUeXBlKSIpfSwKLQl7IkdyYXBoaWNzSW1wb3J0U2V0RGF0YUZpbGUiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRTZXREYXRhRmlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2ksIEZTU3BlYyB0aGVGaWxlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0ltcG9ydEdldERhdGFGaWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0RGF0YUZpbGUsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpLCBGU1NwZWMgdGhlRmlsZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiR3JhcGhpY3NJbXBvcnRTZXREYXRhSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0U2V0RGF0YUhhbmRsZSwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2ksIEhhbmRsZSBoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0ltcG9ydEdldERhdGFIYW5kbGUiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRHZXREYXRhSGFuZGxlLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEhhbmRsZSBoKSIpfSwKLQl7IkdyYXBoaWNzSW1wb3J0R2V0SW1hZ2VEZXNjcmlwdGlvbiIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydEdldEltYWdlRGVzY3JpcHRpb24sIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjKSIpfSwKLQl7IkdyYXBoaWNzSW1wb3J0R2V0RGF0YU9mZnNldEFuZFNpemUiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRHZXREYXRhT2Zmc2V0QW5kU2l6ZSwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyBzaXplKSIpfSwKLQl7IkdyYXBoaWNzSW1wb3J0UmVhZERhdGEiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRSZWFkRGF0YSwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2ksIHZvaWQgKiBkYXRhUHRyLCB1bnNpZ25lZCBsb25nIGRhdGFPZmZzZXQsIHVuc2lnbmVkIGxvbmcgZGF0YVNpemUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkdyYXBoaWNzSW1wb3J0U2V0Q2xpcCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydFNldENsaXAsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpLCBSZ25IYW5kbGUgY2xpcFJnbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiR3JhcGhpY3NJbXBvcnRHZXRDbGlwIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0Q2xpcCwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSZ25IYW5kbGUgY2xpcFJnbikiKX0sCi0JeyJHcmFwaGljc0ltcG9ydFNldFNvdXJjZVJlY3QiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRTZXRTb3VyY2VSZWN0LCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSwgUmVjdCBzb3VyY2VSZWN0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0ltcG9ydEdldFNvdXJjZVJlY3QiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRHZXRTb3VyY2VSZWN0LCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJlY3Qgc291cmNlUmVjdCkiKX0sCi0JeyJHcmFwaGljc0ltcG9ydEdldE5hdHVyYWxCb3VuZHMiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRHZXROYXR1cmFsQm91bmRzLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJlY3QgbmF0dXJhbEJvdW5kcykiKX0sCi0JeyJHcmFwaGljc0ltcG9ydERyYXciLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnREcmF3LCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiR3JhcGhpY3NJbXBvcnRTZXRHV29ybGQiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRTZXRHV29ybGQsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpLCBDR3JhZlB0ciBwb3J0LCBHREhhbmRsZSBnZCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiR3JhcGhpY3NJbXBvcnRHZXRHV29ybGQiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRHZXRHV29ybGQsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQ0dyYWZQdHIgcG9ydCwgR0RIYW5kbGUgZ2QpIil9LAotCXsiR3JhcGhpY3NJbXBvcnRTZXRCb3VuZHNSZWN0IiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0U2V0Qm91bmRzUmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2ksIFJlY3QgYm91bmRzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0ltcG9ydEdldEJvdW5kc1JlY3QiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRHZXRCb3VuZHNSZWN0LCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJlY3QgYm91bmRzKSIpfSwKLQl7IkdyYXBoaWNzSW1wb3J0U2F2ZUFzUGljdHVyZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydFNhdmVBc1BpY3R1cmUsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpLCBGU1NwZWMgZnNzLCBTY3JpcHRDb2RlIHNjcmlwdFRhZykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiR3JhcGhpY3NJbXBvcnRTZXRHcmFwaGljc01vZGUiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRTZXRHcmFwaGljc01vZGUsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpLCBsb25nIGdyYXBoaWNzTW9kZSwgUkdCQ29sb3Igb3BDb2xvcikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiR3JhcGhpY3NJbXBvcnRHZXRHcmFwaGljc01vZGUiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRHZXRHcmFwaGljc01vZGUsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBncmFwaGljc01vZGUsIFJHQkNvbG9yIG9wQ29sb3IpIil9LAotCXsiR3JhcGhpY3NJbXBvcnRTZXRRdWFsaXR5IiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0U2V0UXVhbGl0eSwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2ksIENvZGVjUSBxdWFsaXR5KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0ltcG9ydEdldFF1YWxpdHkiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRHZXRRdWFsaXR5LCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIENvZGVjUSBxdWFsaXR5KSIpfSwKLQl7IkdyYXBoaWNzSW1wb3J0U2F2ZUFzUXVpY2tUaW1lSW1hZ2VGaWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0U2F2ZUFzUXVpY2tUaW1lSW1hZ2VGaWxlLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSwgRlNTcGVjIGZzcywgU2NyaXB0Q29kZSBzY3JpcHRUYWcpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkdyYXBoaWNzSW1wb3J0U2V0RGF0YVJlZmVyZW5jZU9mZnNldEFuZExpbWl0IiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0U2V0RGF0YVJlZmVyZW5jZU9mZnNldEFuZExpbWl0LCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSwgdW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgbGltaXQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkdyYXBoaWNzSW1wb3J0R2V0RGF0YVJlZmVyZW5jZU9mZnNldEFuZExpbWl0IiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0RGF0YVJlZmVyZW5jZU9mZnNldEFuZExpbWl0LCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIGxpbWl0KSIpfSwKLQl7IkdyYXBoaWNzSW1wb3J0R2V0QWxpYXNlZERhdGFSZWZlcmVuY2UiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRHZXRBbGlhc2VkRGF0YVJlZmVyZW5jZSwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlKSIpfSwKLQl7IkdyYXBoaWNzSW1wb3J0VmFsaWRhdGUiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRWYWxpZGF0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBCb29sZWFuIHZhbGlkKSIpfSwKLQl7IkdyYXBoaWNzSW1wb3J0R2V0TWV0YURhdGEiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRHZXRNZXRhRGF0YSwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2ksIHZvaWQgKiB1c2VyRGF0YSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiR3JhcGhpY3NJbXBvcnRHZXRNSU1FVHlwZUxpc3QiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRHZXRNSU1FVHlwZUxpc3QsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpLCB2b2lkICogcXRBdG9tQ29udGFpbmVyUHRyKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0ltcG9ydERvZXNEcmF3QWxsUGl4ZWxzIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0RG9lc0RyYXdBbGxQaXhlbHMsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgc2hvcnQgZHJhd3NBbGxQaXhlbHMpIil9LAotCXsiR3JhcGhpY3NJbXBvcnRHZXRBc1BpY3R1cmUiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRHZXRBc1BpY3R1cmUsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUGljSGFuZGxlIHBpY3R1cmUpIil9LAotCXsiR3JhcGhpY3NJbXBvcnRFeHBvcnRJbWFnZUZpbGUiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRFeHBvcnRJbWFnZUZpbGUsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpLCBPU1R5cGUgZmlsZVR5cGUsIE9TVHlwZSBmaWxlQ3JlYXRvciwgRlNTcGVjIGZzcywgU2NyaXB0Q29kZSBzY3JpcHRUYWcpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkdyYXBoaWNzSW1wb3J0R2V0RXhwb3J0SW1hZ2VUeXBlTGlzdCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydEdldEV4cG9ydEltYWdlVHlwZUxpc3QsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpLCB2b2lkICogcXRBdG9tQ29udGFpbmVyUHRyKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0ltcG9ydEdldEV4cG9ydFNldHRpbmdzQXNBdG9tQ29udGFpbmVyIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0RXhwb3J0U2V0dGluZ3NBc0F0b21Db250YWluZXIsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpLCB2b2lkICogcXRBdG9tQ29udGFpbmVyUHRyKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0ltcG9ydFNldEV4cG9ydFNldHRpbmdzRnJvbUF0b21Db250YWluZXIiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRTZXRFeHBvcnRTZXR0aW5nc0Zyb21BdG9tQ29udGFpbmVyLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSwgdm9pZCAqIHF0QXRvbUNvbnRhaW5lcikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiR3JhcGhpY3NJbXBvcnRHZXRJbWFnZUNvdW50IiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0SW1hZ2VDb3VudCwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBsb25nIGltYWdlQ291bnQpIil9LAotCXsiR3JhcGhpY3NJbXBvcnRTZXRJbWFnZUluZGV4IiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0U2V0SW1hZ2VJbmRleCwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2ksIHVuc2lnbmVkIGxvbmcgaW1hZ2VJbmRleCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiR3JhcGhpY3NJbXBvcnRHZXRJbWFnZUluZGV4IiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0SW1hZ2VJbmRleCwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBsb25nIGltYWdlSW5kZXgpIil9LAotCXsiR3JhcGhpY3NJbXBvcnRHZXREYXRhT2Zmc2V0QW5kU2l6ZTY0IiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0RGF0YU9mZnNldEFuZFNpemU2NCwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB3aWRlIG9mZnNldCwgd2lkZSBzaXplKSIpfSwKLQl7IkdyYXBoaWNzSW1wb3J0UmVhZERhdGE2NCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydFJlYWREYXRhNjQsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpLCB2b2lkICogZGF0YVB0ciwgd2lkZSBkYXRhT2Zmc2V0LCB1bnNpZ25lZCBsb25nIGRhdGFTaXplKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0ltcG9ydFNldERhdGFSZWZlcmVuY2VPZmZzZXRBbmRMaW1pdDY0IiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0U2V0RGF0YVJlZmVyZW5jZU9mZnNldEFuZExpbWl0NjQsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpLCB3aWRlIG9mZnNldCwgd2lkZSBsaW1pdCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiR3JhcGhpY3NJbXBvcnRHZXREYXRhUmVmZXJlbmNlT2Zmc2V0QW5kTGltaXQ2NCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydEdldERhdGFSZWZlcmVuY2VPZmZzZXRBbmRMaW1pdDY0LCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHdpZGUgb2Zmc2V0LCB3aWRlIGxpbWl0KSIpfSwKLQl7IkdyYXBoaWNzSW1wb3J0R2V0RGVmYXVsdENsaXAiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRHZXREZWZhdWx0Q2xpcCwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSZ25IYW5kbGUgZGVmYXVsdFJnbikiKX0sCi0JeyJHcmFwaGljc0ltcG9ydEdldERlZmF1bHRHcmFwaGljc01vZGUiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRHZXREZWZhdWx0R3JhcGhpY3NNb2RlLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgZGVmYXVsdEdyYXBoaWNzTW9kZSwgUkdCQ29sb3IgZGVmYXVsdE9wQ29sb3IpIil9LAotCXsiR3JhcGhpY3NJbXBvcnRHZXREZWZhdWx0U291cmNlUmVjdCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydEdldERlZmF1bHRTb3VyY2VSZWN0LCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJlY3QgZGVmYXVsdFNvdXJjZVJlY3QpIil9LAotCXsiR3JhcGhpY3NJbXBvcnRHZXRDb2xvclN5bmNQcm9maWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0Q29sb3JTeW5jUHJvZmlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBIYW5kbGUgcHJvZmlsZSkiKX0sCi0JeyJHcmFwaGljc0ltcG9ydFNldERlc3RSZWN0IiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0U2V0RGVzdFJlY3QsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpLCBSZWN0IGRlc3RSZWN0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0ltcG9ydEdldERlc3RSZWN0IiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0RGVzdFJlY3QsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmVjdCBkZXN0UmVjdCkiKX0sCi0JeyJHcmFwaGljc0ltcG9ydFNldEZsYWdzIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0U2V0RmxhZ3MsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpLCBsb25nIGZsYWdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0ltcG9ydEdldEZsYWdzIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0RmxhZ3MsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBmbGFncykiKX0sCi0JeyJHcmFwaGljc0ltcG9ydEdldEJhc2VEYXRhT2Zmc2V0QW5kU2l6ZTY0IiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0QmFzZURhdGFPZmZzZXRBbmRTaXplNjQsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgd2lkZSBvZmZzZXQsIHdpZGUgc2l6ZSkiKX0sCi0JeyJHcmFwaGljc0ltcG9ydFNldEltYWdlSW5kZXhUb1RodW1ibmFpbCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydFNldEltYWdlSW5kZXhUb1RodW1ibmFpbCwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkdyYXBoaWNzRXhwb3J0RG9FeHBvcnQiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnREb0V4cG9ydCwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBsb25nIGFjdHVhbFNpemVXcml0dGVuKSIpfSwKLQl7IkdyYXBoaWNzRXhwb3J0Q2FuVHJhbnNjb2RlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0Q2FuVHJhbnNjb2RlLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEJvb2xlYW4gY2FuVHJhbnNjb2RlKSIpfSwKLQl7IkdyYXBoaWNzRXhwb3J0RG9UcmFuc2NvZGUiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnREb1RyYW5zY29kZSwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkdyYXBoaWNzRXhwb3J0Q2FuVXNlQ29tcHJlc3NvciIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydENhblVzZUNvbXByZXNzb3IsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCB2b2lkICogY29kZWNTZXR0aW5nc0F0b21Db250YWluZXJQdHIpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBCb29sZWFuIGNhblVzZUNvbXByZXNzb3IpIil9LAotCXsiR3JhcGhpY3NFeHBvcnREb1VzZUNvbXByZXNzb3IiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnREb1VzZUNvbXByZXNzb3IsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCB2b2lkICogY29kZWNTZXR0aW5nc0F0b21Db250YWluZXIpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBJbWFnZURlc2NyaXB0aW9uSGFuZGxlIG91dERlc2MpIil9LAotCXsiR3JhcGhpY3NFeHBvcnREb1N0YW5kYWxvbmVFeHBvcnQiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnREb1N0YW5kYWxvbmVFeHBvcnQsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0V4cG9ydEdldERlZmF1bHRGaWxlVHlwZUFuZENyZWF0b3IiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRHZXREZWZhdWx0RmlsZVR5cGVBbmRDcmVhdG9yLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIE9TVHlwZSBmaWxlVHlwZSwgT1NUeXBlIGZpbGVDcmVhdG9yKSIpfSwKLQl7IkdyYXBoaWNzRXhwb3J0R2V0RGVmYXVsdEZpbGVOYW1lRXh0ZW5zaW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0RGVmYXVsdEZpbGVOYW1lRXh0ZW5zaW9uLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIE9TVHlwZSBmaWxlTmFtZUV4dGVuc2lvbikiKX0sCi0JeyJHcmFwaGljc0V4cG9ydEdldE1JTUVUeXBlTGlzdCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydEdldE1JTUVUeXBlTGlzdCwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIHZvaWQgKiBxdEF0b21Db250YWluZXJQdHIpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkdyYXBoaWNzRXhwb3J0U2V0U2V0dGluZ3NGcm9tQXRvbUNvbnRhaW5lciIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydFNldFNldHRpbmdzRnJvbUF0b21Db250YWluZXIsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCB2b2lkICogcXRBdG9tQ29udGFpbmVyKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0V4cG9ydEdldFNldHRpbmdzQXNBdG9tQ29udGFpbmVyIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0U2V0dGluZ3NBc0F0b21Db250YWluZXIsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCB2b2lkICogcXRBdG9tQ29udGFpbmVyUHRyKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0V4cG9ydEdldFNldHRpbmdzQXNUZXh0IiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0U2V0dGluZ3NBc1RleHQsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSGFuZGxlIHRoZVRleHQpIil9LAotCXsiR3JhcGhpY3NFeHBvcnRTZXREb250UmVjb21wcmVzcyIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydFNldERvbnRSZWNvbXByZXNzLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgQm9vbGVhbiBkb250UmVjb21wcmVzcykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiR3JhcGhpY3NFeHBvcnRHZXREb250UmVjb21wcmVzcyIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydEdldERvbnRSZWNvbXByZXNzLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEJvb2xlYW4gZG9udFJlY29tcHJlc3MpIil9LAotCXsiR3JhcGhpY3NFeHBvcnRTZXRJbnRlcmxhY2VTdHlsZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydFNldEludGVybGFjZVN0eWxlLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgdW5zaWduZWQgbG9uZyBpbnRlcmxhY2VTdHlsZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiR3JhcGhpY3NFeHBvcnRHZXRJbnRlcmxhY2VTdHlsZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydEdldEludGVybGFjZVN0eWxlLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHVuc2lnbmVkIGxvbmcgaW50ZXJsYWNlU3R5bGUpIil9LAotCXsiR3JhcGhpY3NFeHBvcnRTZXRNZXRhRGF0YSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydFNldE1ldGFEYXRhLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgdm9pZCAqIHVzZXJEYXRhKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0V4cG9ydEdldE1ldGFEYXRhIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0TWV0YURhdGEsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCB2b2lkICogdXNlckRhdGEpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkdyYXBoaWNzRXhwb3J0U2V0VGFyZ2V0RGF0YVNpemUiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRTZXRUYXJnZXREYXRhU2l6ZSwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIHVuc2lnbmVkIGxvbmcgdGFyZ2V0RGF0YVNpemUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkdyYXBoaWNzRXhwb3J0R2V0VGFyZ2V0RGF0YVNpemUiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRHZXRUYXJnZXREYXRhU2l6ZSwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBsb25nIHRhcmdldERhdGFTaXplKSIpfSwKLQl7IkdyYXBoaWNzRXhwb3J0U2V0Q29tcHJlc3Npb25NZXRob2QiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRTZXRDb21wcmVzc2lvbk1ldGhvZCwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIGxvbmcgY29tcHJlc3Npb25NZXRob2QpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkdyYXBoaWNzRXhwb3J0R2V0Q29tcHJlc3Npb25NZXRob2QiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRHZXRDb21wcmVzc2lvbk1ldGhvZCwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIGNvbXByZXNzaW9uTWV0aG9kKSIpfSwKLQl7IkdyYXBoaWNzRXhwb3J0U2V0Q29tcHJlc3Npb25RdWFsaXR5IiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0U2V0Q29tcHJlc3Npb25RdWFsaXR5LCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgQ29kZWNRIHNwYXRpYWxRdWFsaXR5KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0V4cG9ydEdldENvbXByZXNzaW9uUXVhbGl0eSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydEdldENvbXByZXNzaW9uUXVhbGl0eSwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBDb2RlY1Egc3BhdGlhbFF1YWxpdHkpIil9LAotCXsiR3JhcGhpY3NFeHBvcnRTZXRSZXNvbHV0aW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0U2V0UmVzb2x1dGlvbiwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIEZpeGVkIGhvcml6b250YWxSZXNvbHV0aW9uLCBGaXhlZCB2ZXJ0aWNhbFJlc29sdXRpb24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkdyYXBoaWNzRXhwb3J0R2V0UmVzb2x1dGlvbiIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydEdldFJlc29sdXRpb24sIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgRml4ZWQgaG9yaXpvbnRhbFJlc29sdXRpb24sIEZpeGVkIHZlcnRpY2FsUmVzb2x1dGlvbikiKX0sCi0JeyJHcmFwaGljc0V4cG9ydFNldERlcHRoIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0U2V0RGVwdGgsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCBsb25nIGRlcHRoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0V4cG9ydEdldERlcHRoIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0RGVwdGgsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBkZXB0aCkiKX0sCi0JeyJHcmFwaGljc0V4cG9ydFNldENvbG9yU3luY1Byb2ZpbGUiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRTZXRDb2xvclN5bmNQcm9maWxlLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgSGFuZGxlIGNvbG9yU3luY1Byb2ZpbGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkdyYXBoaWNzRXhwb3J0R2V0Q29sb3JTeW5jUHJvZmlsZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydEdldENvbG9yU3luY1Byb2ZpbGUsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSGFuZGxlIGNvbG9yU3luY1Byb2ZpbGUpIil9LAotCXsiR3JhcGhpY3NFeHBvcnRTZXRJbnB1dERhdGFSZWZlcmVuY2UiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRTZXRJbnB1dERhdGFSZWZlcmVuY2UsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCBIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlLCBJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkdyYXBoaWNzRXhwb3J0R2V0SW5wdXREYXRhUmVmZXJlbmNlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0SW5wdXREYXRhUmVmZXJlbmNlLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEhhbmRsZSBkYXRhUmVmLCBPU1R5cGUgZGF0YVJlZlR5cGUpIil9LAotCXsiR3JhcGhpY3NFeHBvcnRTZXRJbnB1dEZpbGUiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRTZXRJbnB1dEZpbGUsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCBGU1NwZWMgdGhlRmlsZSwgSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0V4cG9ydEdldElucHV0RmlsZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydEdldElucHV0RmlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIEZTU3BlYyB0aGVGaWxlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0V4cG9ydFNldElucHV0SGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0U2V0SW5wdXRIYW5kbGUsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCBIYW5kbGUgaCwgSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0V4cG9ydEdldElucHV0SGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0SW5wdXRIYW5kbGUsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSGFuZGxlIGgpIil9LAotCXsiR3JhcGhpY3NFeHBvcnRTZXRJbnB1dFB0ciIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydFNldElucHV0UHRyLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgUHRyIHAsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0V4cG9ydFNldElucHV0R3JhcGhpY3NJbXBvcnRlciIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydFNldElucHV0R3JhcGhpY3NJbXBvcnRlciwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGdyaXApIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkdyYXBoaWNzRXhwb3J0R2V0SW5wdXRHcmFwaGljc0ltcG9ydGVyIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0SW5wdXRHcmFwaGljc0ltcG9ydGVyLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGdyaXApIil9LAotCXsiR3JhcGhpY3NFeHBvcnRTZXRJbnB1dFBpY3R1cmUiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRTZXRJbnB1dFBpY3R1cmUsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCBQaWNIYW5kbGUgcGljdHVyZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiR3JhcGhpY3NFeHBvcnRHZXRJbnB1dFBpY3R1cmUiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRHZXRJbnB1dFBpY3R1cmUsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUGljSGFuZGxlIHBpY3R1cmUpIil9LAotCXsiR3JhcGhpY3NFeHBvcnRTZXRJbnB1dEdXb3JsZCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydFNldElucHV0R1dvcmxkLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgR1dvcmxkUHRyIGd3b3JsZCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEdXb3JsZCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydEdldElucHV0R1dvcmxkLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEdXb3JsZFB0ciBnd29ybGQpIil9LAotCXsiR3JhcGhpY3NFeHBvcnRTZXRJbnB1dFBpeG1hcCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydFNldElucHV0UGl4bWFwLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgUGl4TWFwSGFuZGxlIHBpeG1hcCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiR3JhcGhpY3NFeHBvcnRHZXRJbnB1dFBpeG1hcCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydEdldElucHV0UGl4bWFwLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFBpeE1hcEhhbmRsZSBwaXhtYXApIil9LAotCXsiR3JhcGhpY3NFeHBvcnRTZXRJbnB1dE9mZnNldEFuZExpbWl0IiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0U2V0SW5wdXRPZmZzZXRBbmRMaW1pdCwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIGxpbWl0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0V4cG9ydEdldElucHV0T2Zmc2V0QW5kTGltaXQiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRHZXRJbnB1dE9mZnNldEFuZExpbWl0LCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIGxpbWl0KSIpfSwKLQl7IkdyYXBoaWNzRXhwb3J0TWF5RXhwb3J0ZXJSZWFkSW5wdXREYXRhIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0TWF5RXhwb3J0ZXJSZWFkSW5wdXREYXRhLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEJvb2xlYW4gbWF5UmVhZElucHV0RGF0YSkiKX0sCi0JeyJHcmFwaGljc0V4cG9ydEdldElucHV0RGF0YVNpemUiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRHZXRJbnB1dERhdGFTaXplLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHVuc2lnbmVkIGxvbmcgc2l6ZSkiKX0sCi0JeyJHcmFwaGljc0V4cG9ydFJlYWRJbnB1dERhdGEiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRSZWFkSW5wdXREYXRhLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgdm9pZCAqIGRhdGFQdHIsIHVuc2lnbmVkIGxvbmcgZGF0YU9mZnNldCwgdW5zaWduZWQgbG9uZyBkYXRhU2l6ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEltYWdlRGVzY3JpcHRpb24iLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEltYWdlRGVzY3JpcHRpb24sIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjKSIpfSwKLQl7IkdyYXBoaWNzRXhwb3J0R2V0SW5wdXRJbWFnZURpbWVuc2lvbnMiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEltYWdlRGltZW5zaW9ucywgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSZWN0IGRpbWVuc2lvbnMpIil9LAotCXsiR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEltYWdlRGVwdGgiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEltYWdlRGVwdGgsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBpbnB1dERlcHRoKSIpfSwKLQl7IkdyYXBoaWNzRXhwb3J0RHJhd0lucHV0SW1hZ2UiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnREcmF3SW5wdXRJbWFnZSwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIENHcmFmUHRyIGd3LCBHREhhbmRsZSBnZCwgUmVjdCBzcmNSZWN0LCBSZWN0IGRzdFJlY3QpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkdyYXBoaWNzRXhwb3J0U2V0T3V0cHV0RGF0YVJlZmVyZW5jZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydFNldE91dHB1dERhdGFSZWZlcmVuY2UsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCBIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0V4cG9ydEdldE91dHB1dERhdGFSZWZlcmVuY2UiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXREYXRhUmVmZXJlbmNlLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEhhbmRsZSBkYXRhUmVmLCBPU1R5cGUgZGF0YVJlZlR5cGUpIil9LAotCXsiR3JhcGhpY3NFeHBvcnRTZXRPdXRwdXRGaWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0U2V0T3V0cHV0RmlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIEZTU3BlYyB0aGVGaWxlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0V4cG9ydEdldE91dHB1dEZpbGUiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXRGaWxlLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgRlNTcGVjIHRoZUZpbGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkdyYXBoaWNzRXhwb3J0U2V0T3V0cHV0SGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0U2V0T3V0cHV0SGFuZGxlLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgSGFuZGxlIGgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkdyYXBoaWNzRXhwb3J0R2V0T3V0cHV0SGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0T3V0cHV0SGFuZGxlLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEhhbmRsZSBoKSIpfSwKLQl7IkdyYXBoaWNzRXhwb3J0U2V0T3V0cHV0T2Zmc2V0QW5kTWF4U2l6ZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydFNldE91dHB1dE9mZnNldEFuZE1heFNpemUsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCB1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyBtYXhTaXplLCBCb29sZWFuIHRydW5jYXRlRmlsZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXRPZmZzZXRBbmRNYXhTaXplIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0T3V0cHV0T2Zmc2V0QW5kTWF4U2l6ZSwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyBtYXhTaXplLCBCb29sZWFuIHRydW5jYXRlRmlsZSkiKX0sCi0JeyJHcmFwaGljc0V4cG9ydFNldE91dHB1dEZpbGVUeXBlQW5kQ3JlYXRvciIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydFNldE91dHB1dEZpbGVUeXBlQW5kQ3JlYXRvciwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIE9TVHlwZSBmaWxlVHlwZSwgT1NUeXBlIGZpbGVDcmVhdG9yKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0V4cG9ydEdldE91dHB1dEZpbGVUeXBlQW5kQ3JlYXRvciIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydEdldE91dHB1dEZpbGVUeXBlQW5kQ3JlYXRvciwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBPU1R5cGUgZmlsZVR5cGUsIE9TVHlwZSBmaWxlQ3JlYXRvcikiKX0sCi0JeyJHcmFwaGljc0V4cG9ydFNldE91dHB1dE1hcmsiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRTZXRPdXRwdXRNYXJrLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgdW5zaWduZWQgbG9uZyBtYXJrKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0V4cG9ydEdldE91dHB1dE1hcmsiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXRNYXJrLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHVuc2lnbmVkIGxvbmcgbWFyaykiKX0sCi0JeyJHcmFwaGljc0V4cG9ydFJlYWRPdXRwdXREYXRhIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0UmVhZE91dHB1dERhdGEsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCB2b2lkICogZGF0YVB0ciwgdW5zaWduZWQgbG9uZyBkYXRhT2Zmc2V0LCB1bnNpZ25lZCBsb25nIGRhdGFTaXplKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0V4cG9ydFNldFRodW1ibmFpbEVuYWJsZWQiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRTZXRUaHVtYm5haWxFbmFibGVkLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgQm9vbGVhbiBlbmFibGVUaHVtYm5haWwsIGxvbmcgbWF4VGh1bWJuYWlsV2lkdGgsIGxvbmcgbWF4VGh1bWJuYWlsSGVpZ2h0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0V4cG9ydEdldFRodW1ibmFpbEVuYWJsZWQiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRHZXRUaHVtYm5haWxFbmFibGVkLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEJvb2xlYW4gdGh1bWJuYWlsRW5hYmxlZCwgbG9uZyBtYXhUaHVtYm5haWxXaWR0aCwgbG9uZyBtYXhUaHVtYm5haWxIZWlnaHQpIil9LAotCXsiR3JhcGhpY3NFeHBvcnRTZXRFeGlmRW5hYmxlZCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydFNldEV4aWZFbmFibGVkLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgQm9vbGVhbiBlbmFibGVFeGlmKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0V4cG9ydEdldEV4aWZFbmFibGVkIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0RXhpZkVuYWJsZWQsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQm9vbGVhbiBleGlmRW5hYmxlZCkiKX0sCi0JeyJJbWFnZVRyYW5zY29kZXJCZWdpblNlcXVlbmNlIiwgKFB5Q0Z1bmN0aW9uKVF0X0ltYWdlVHJhbnNjb2RlckJlZ2luU2VxdWVuY2UsIDEsCi0JIFB5RG9jX1NUUigiKEltYWdlVHJhbnNjb2RlckNvbXBvbmVudCBpdGMsIEltYWdlRGVzY3JpcHRpb25IYW5kbGUgc3JjRGVzYywgdm9pZCAqIGRhdGEsIGxvbmcgZGF0YVNpemUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRzdERlc2MpIil9LAotCXsiSW1hZ2VUcmFuc2NvZGVyRGlzcG9zZURhdGEiLCAoUHlDRnVuY3Rpb24pUXRfSW1hZ2VUcmFuc2NvZGVyRGlzcG9zZURhdGEsIDEsCi0JIFB5RG9jX1NUUigiKEltYWdlVHJhbnNjb2RlckNvbXBvbmVudCBpdGMsIHZvaWQgKiBkc3REYXRhKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJJbWFnZVRyYW5zY29kZXJFbmRTZXF1ZW5jZSIsIChQeUNGdW5jdGlvbilRdF9JbWFnZVRyYW5zY29kZXJFbmRTZXF1ZW5jZSwgMSwKLQkgUHlEb2NfU1RSKCIoSW1hZ2VUcmFuc2NvZGVyQ29tcG9uZW50IGl0YykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiQ2xvY2tHZXRUaW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X0Nsb2NrR2V0VGltZSwgMSwKLQkgUHlEb2NfU1RSKCIoQ29tcG9uZW50SW5zdGFuY2UgYUNsb2NrKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgVGltZVJlY29yZCBvdXQpIil9LAotCXsiQ2xvY2tTZXRUaW1lQmFzZSIsIChQeUNGdW5jdGlvbilRdF9DbG9ja1NldFRpbWVCYXNlLCAxLAotCSBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBhQ2xvY2ssIFRpbWVCYXNlIHRiKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJDbG9ja0dldFJhdGUiLCAoUHlDRnVuY3Rpb24pUXRfQ2xvY2tHZXRSYXRlLCAxLAotCSBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBhQ2xvY2spIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBGaXhlZCByYXRlKSIpfSwKLQl7IlNDUG9zaXRpb25SZWN0IiwgKFB5Q0Z1bmN0aW9uKVF0X1NDUG9zaXRpb25SZWN0LCAxLAotCSBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJlY3QgcnAsIFBvaW50IHdoZXJlKSIpfSwKLQl7IlNDUG9zaXRpb25EaWFsb2ciLCAoUHlDRnVuY3Rpb24pUXRfU0NQb3NpdGlvbkRpYWxvZywgMSwKLQkgUHlEb2NfU1RSKCIoQ29tcG9uZW50SW5zdGFuY2UgY2ksIHNob3J0IGlkKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUG9pbnQgd2hlcmUpIil9LAotCXsiU0NTZXRUZXN0SW1hZ2VQaWN0SGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NDU2V0VGVzdEltYWdlUGljdEhhbmRsZSwgMSwKLQkgUHlEb2NfU1RSKCIoQ29tcG9uZW50SW5zdGFuY2UgY2ksIFBpY0hhbmRsZSB0ZXN0UGljdCwgc2hvcnQgdGVzdEZsYWdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmVjdCB0ZXN0UmVjdCkiKX0sCi0JeyJTQ1NldFRlc3RJbWFnZVBpY3RGaWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NDU2V0VGVzdEltYWdlUGljdEZpbGUsIDEsCi0JIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGNpLCBzaG9ydCB0ZXN0RmlsZVJlZiwgc2hvcnQgdGVzdEZsYWdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmVjdCB0ZXN0UmVjdCkiKX0sCi0JeyJTQ1NldFRlc3RJbWFnZVBpeE1hcCIsIChQeUNGdW5jdGlvbilRdF9TQ1NldFRlc3RJbWFnZVBpeE1hcCwgMSwKLQkgUHlEb2NfU1RSKCIoQ29tcG9uZW50SW5zdGFuY2UgY2ksIFBpeE1hcEhhbmRsZSB0ZXN0UGl4TWFwLCBzaG9ydCB0ZXN0RmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSZWN0IHRlc3RSZWN0KSIpfSwKLQl7IlNDR2V0QmVzdERldmljZVJlY3QiLCAoUHlDRnVuY3Rpb24pUXRfU0NHZXRCZXN0RGV2aWNlUmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoQ29tcG9uZW50SW5zdGFuY2UgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSZWN0IHIpIil9LAotCXsiU0NSZXF1ZXN0SW1hZ2VTZXR0aW5ncyIsIChQeUNGdW5jdGlvbilRdF9TQ1JlcXVlc3RJbWFnZVNldHRpbmdzLCAxLAotCSBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0NDb21wcmVzc0ltYWdlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NDQ29tcHJlc3NJbWFnZSwgMSwKLQkgUHlEb2NfU1RSKCIoQ29tcG9uZW50SW5zdGFuY2UgY2ksIFBpeE1hcEhhbmRsZSBzcmMsIFJlY3Qgc3JjUmVjdCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYywgSGFuZGxlIGRhdGEpIil9LAotCXsiU0NDb21wcmVzc1BpY3R1cmUiLCAoUHlDRnVuY3Rpb24pUXRfU0NDb21wcmVzc1BpY3R1cmUsIDEsCi0JIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGNpLCBQaWNIYW5kbGUgc3JjUGljdHVyZSwgUGljSGFuZGxlIGRzdFBpY3R1cmUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNDQ29tcHJlc3NQaWN0dXJlRmlsZSIsIChQeUNGdW5jdGlvbilRdF9TQ0NvbXByZXNzUGljdHVyZUZpbGUsIDEsCi0JIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGNpLCBzaG9ydCBzcmNSZWZOdW0sIHNob3J0IGRzdFJlZk51bSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0NSZXF1ZXN0U2VxdWVuY2VTZXR0aW5ncyIsIChQeUNGdW5jdGlvbilRdF9TQ1JlcXVlc3RTZXF1ZW5jZVNldHRpbmdzLCAxLAotCSBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0NDb21wcmVzc1NlcXVlbmNlQmVnaW4iLCAoUHlDRnVuY3Rpb24pUXRfU0NDb21wcmVzc1NlcXVlbmNlQmVnaW4sIDEsCi0JIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGNpLCBQaXhNYXBIYW5kbGUgc3JjLCBSZWN0IHNyY1JlY3QpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2MpIil9LAotCXsiU0NDb21wcmVzc1NlcXVlbmNlRnJhbWUiLCAoUHlDRnVuY3Rpb24pUXRfU0NDb21wcmVzc1NlcXVlbmNlRnJhbWUsIDEsCi0JIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGNpLCBQaXhNYXBIYW5kbGUgc3JjLCBSZWN0IHNyY1JlY3QpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBIYW5kbGUgZGF0YSwgbG9uZyBkYXRhU2l6ZSwgc2hvcnQgbm90U3luY0ZsYWcpIil9LAotCXsiU0NDb21wcmVzc1NlcXVlbmNlRW5kIiwgKFB5Q0Z1bmN0aW9uKVF0X1NDQ29tcHJlc3NTZXF1ZW5jZUVuZCwgMSwKLQkgUHlEb2NfU1RSKCIoQ29tcG9uZW50SW5zdGFuY2UgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNDRGVmYXVsdFBpY3RIYW5kbGVTZXR0aW5ncyIsIChQeUNGdW5jdGlvbilRdF9TQ0RlZmF1bHRQaWN0SGFuZGxlU2V0dGluZ3MsIDEsCi0JIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGNpLCBQaWNIYW5kbGUgc3JjUGljdHVyZSwgc2hvcnQgbW90aW9uKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTQ0RlZmF1bHRQaWN0RmlsZVNldHRpbmdzIiwgKFB5Q0Z1bmN0aW9uKVF0X1NDRGVmYXVsdFBpY3RGaWxlU2V0dGluZ3MsIDEsCi0JIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGNpLCBzaG9ydCBzcmNSZWYsIHNob3J0IG1vdGlvbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0NEZWZhdWx0UGl4TWFwU2V0dGluZ3MiLCAoUHlDRnVuY3Rpb24pUXRfU0NEZWZhdWx0UGl4TWFwU2V0dGluZ3MsIDEsCi0JIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGNpLCBQaXhNYXBIYW5kbGUgc3JjLCBzaG9ydCBtb3Rpb24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNDR2V0SW5mbyIsIChQeUNGdW5jdGlvbilRdF9TQ0dldEluZm8sIDEsCi0JIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGNpLCBPU1R5cGUgaW5mb1R5cGUsIHZvaWQgKiBpbmZvKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTQ1NldEluZm8iLCAoUHlDRnVuY3Rpb24pUXRfU0NTZXRJbmZvLCAxLAotCSBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBjaSwgT1NUeXBlIGluZm9UeXBlLCB2b2lkICogaW5mbykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0NTZXRDb21wcmVzc0ZsYWdzIiwgKFB5Q0Z1bmN0aW9uKVF0X1NDU2V0Q29tcHJlc3NGbGFncywgMSwKLQkgUHlEb2NfU1RSKCIoQ29tcG9uZW50SW5zdGFuY2UgY2ksIGxvbmcgZmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNDR2V0Q29tcHJlc3NGbGFncyIsIChQeUNGdW5jdGlvbilRdF9TQ0dldENvbXByZXNzRmxhZ3MsIDEsCi0JIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBmbGFncykiKX0sCi0JeyJTQ0dldFNldHRpbmdzQXNUZXh0IiwgKFB5Q0Z1bmN0aW9uKVF0X1NDR2V0U2V0dGluZ3NBc1RleHQsIDEsCi0JIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSGFuZGxlIHRleHQpIil9LAotCXsiU0NBc3luY0lkbGUiLCAoUHlDRnVuY3Rpb24pUXRfU0NBc3luY0lkbGUsIDEsCi0JIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJUd2VlbmVyUmVzZXQiLCAoUHlDRnVuY3Rpb24pUXRfVHdlZW5lclJlc2V0LCAxLAotCSBQeURvY19TVFIoIihUd2VlbmVyQ29tcG9uZW50IHRjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJUQ0dldFNvdXJjZVJlZiIsIChQeUNGdW5jdGlvbilRdF9UQ0dldFNvdXJjZVJlZiwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBUaW1lQ29kZURlc2NyaXB0aW9uSGFuZGxlIHRjZEgpIC0+IChIYW5kbGVyRXJyb3IgX3J2LCBVc2VyRGF0YSBzcmVmSCkiKX0sCi0JeyJUQ1NldFNvdXJjZVJlZiIsIChQeUNGdW5jdGlvbilRdF9UQ1NldFNvdXJjZVJlZiwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBUaW1lQ29kZURlc2NyaXB0aW9uSGFuZGxlIHRjZEgsIFVzZXJEYXRhIHNyZWZIKSAtPiAoSGFuZGxlckVycm9yIF9ydikiKX0sCi0JeyJUQ1NldFRpbWVDb2RlRmxhZ3MiLCAoUHlDRnVuY3Rpb24pUXRfVENTZXRUaW1lQ29kZUZsYWdzLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIGxvbmcgZmxhZ3MsIGxvbmcgZmxhZ3NNYXNrKSAtPiAoSGFuZGxlckVycm9yIF9ydikiKX0sCi0JeyJUQ0dldFRpbWVDb2RlRmxhZ3MiLCAoUHlDRnVuY3Rpb24pUXRfVENHZXRUaW1lQ29kZUZsYWdzLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgpIC0+IChIYW5kbGVyRXJyb3IgX3J2LCBsb25nIGZsYWdzKSIpfSwKLQl7Ik1vdmllSW1wb3J0SGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllSW1wb3J0SGFuZGxlLCAxLAotCSBQeURvY19TVFIoIihNb3ZpZUltcG9ydENvbXBvbmVudCBjaSwgSGFuZGxlIGRhdGFILCBNb3ZpZSB0aGVNb3ZpZSwgVHJhY2sgdGFyZ2V0VHJhY2ssIFRpbWVWYWx1ZSBhdFRpbWUsIGxvbmcgaW5GbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFRyYWNrIHVzZWRUcmFjaywgVGltZVZhbHVlIGFkZGVkRHVyYXRpb24sIGxvbmcgb3V0RmxhZ3MpIil9LAotCXsiTW92aWVJbXBvcnRGaWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllSW1wb3J0RmlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoTW92aWVJbXBvcnRDb21wb25lbnQgY2ksIEZTU3BlYyB0aGVGaWxlLCBNb3ZpZSB0aGVNb3ZpZSwgVHJhY2sgdGFyZ2V0VHJhY2ssIFRpbWVWYWx1ZSBhdFRpbWUsIGxvbmcgaW5GbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFRyYWNrIHVzZWRUcmFjaywgVGltZVZhbHVlIGFkZGVkRHVyYXRpb24sIGxvbmcgb3V0RmxhZ3MpIil9LAotCXsiTW92aWVJbXBvcnRTZXRTYW1wbGVEdXJhdGlvbiIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUltcG9ydFNldFNhbXBsZUR1cmF0aW9uLCAxLAotCSBQeURvY19TVFIoIihNb3ZpZUltcG9ydENvbXBvbmVudCBjaSwgVGltZVZhbHVlIGR1cmF0aW9uLCBUaW1lU2NhbGUgc2NhbGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1vdmllSW1wb3J0U2V0U2FtcGxlRGVzY3JpcHRpb24iLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVJbXBvcnRTZXRTYW1wbGVEZXNjcmlwdGlvbiwgMSwKLQkgUHlEb2NfU1RSKCIoTW92aWVJbXBvcnRDb21wb25lbnQgY2ksIFNhbXBsZURlc2NyaXB0aW9uSGFuZGxlIGRlc2MsIE9TVHlwZSBtZWRpYVR5cGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1vdmllSW1wb3J0U2V0TWVkaWFGaWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllSW1wb3J0U2V0TWVkaWFGaWxlLCAxLAotCSBQeURvY19TVFIoIihNb3ZpZUltcG9ydENvbXBvbmVudCBjaSwgQWxpYXNIYW5kbGUgYWxpYXMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1vdmllSW1wb3J0U2V0RGltZW5zaW9ucyIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUltcG9ydFNldERpbWVuc2lvbnMsIDEsCi0JIFB5RG9jX1NUUigiKE1vdmllSW1wb3J0Q29tcG9uZW50IGNpLCBGaXhlZCB3aWR0aCwgRml4ZWQgaGVpZ2h0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNb3ZpZUltcG9ydFNldENodW5rU2l6ZSIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUltcG9ydFNldENodW5rU2l6ZSwgMSwKLQkgUHlEb2NfU1RSKCIoTW92aWVJbXBvcnRDb21wb25lbnQgY2ksIGxvbmcgY2h1bmtTaXplKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNb3ZpZUltcG9ydFNldEF1eGlsaWFyeURhdGEiLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVJbXBvcnRTZXRBdXhpbGlhcnlEYXRhLCAxLAotCSBQeURvY19TVFIoIihNb3ZpZUltcG9ydENvbXBvbmVudCBjaSwgSGFuZGxlIGRhdGEsIE9TVHlwZSBoYW5kbGVUeXBlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNb3ZpZUltcG9ydFNldEZyb21TY3JhcCIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUltcG9ydFNldEZyb21TY3JhcCwgMSwKLQkgUHlEb2NfU1RSKCIoTW92aWVJbXBvcnRDb21wb25lbnQgY2ksIEJvb2xlYW4gZnJvbVNjcmFwKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNb3ZpZUltcG9ydERvVXNlckRpYWxvZyIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUltcG9ydERvVXNlckRpYWxvZywgMSwKLQkgUHlEb2NfU1RSKCIoTW92aWVJbXBvcnRDb21wb25lbnQgY2ksIEZTU3BlYyB0aGVGaWxlLCBIYW5kbGUgdGhlRGF0YSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEJvb2xlYW4gY2FuY2VsZWQpIil9LAotCXsiTW92aWVJbXBvcnRTZXREdXJhdGlvbiIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUltcG9ydFNldER1cmF0aW9uLCAxLAotCSBQeURvY19TVFIoIihNb3ZpZUltcG9ydENvbXBvbmVudCBjaSwgVGltZVZhbHVlIGR1cmF0aW9uKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNb3ZpZUltcG9ydEdldEF1eGlsaWFyeURhdGFUeXBlIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllSW1wb3J0R2V0QXV4aWxpYXJ5RGF0YVR5cGUsIDEsCi0JIFB5RG9jX1NUUigiKE1vdmllSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgT1NUeXBlIGF1eFR5cGUpIil9LAotCXsiTW92aWVJbXBvcnRWYWxpZGF0ZSIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUltcG9ydFZhbGlkYXRlLCAxLAotCSBQeURvY19TVFIoIihNb3ZpZUltcG9ydENvbXBvbmVudCBjaSwgRlNTcGVjIHRoZUZpbGUsIEhhbmRsZSB0aGVEYXRhKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQm9vbGVhbiB2YWxpZCkiKX0sCi0JeyJNb3ZpZUltcG9ydEdldEZpbGVUeXBlIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllSW1wb3J0R2V0RmlsZVR5cGUsIDEsCi0JIFB5RG9jX1NUUigiKE1vdmllSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgT1NUeXBlIGZpbGVUeXBlKSIpfSwKLQl7Ik1vdmllSW1wb3J0RGF0YVJlZiIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUltcG9ydERhdGFSZWYsIDEsCi0JIFB5RG9jX1NUUigiKE1vdmllSW1wb3J0Q29tcG9uZW50IGNpLCBIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlLCBNb3ZpZSB0aGVNb3ZpZSwgVHJhY2sgdGFyZ2V0VHJhY2ssIFRpbWVWYWx1ZSBhdFRpbWUsIGxvbmcgaW5GbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFRyYWNrIHVzZWRUcmFjaywgVGltZVZhbHVlIGFkZGVkRHVyYXRpb24sIGxvbmcgb3V0RmxhZ3MpIil9LAotCXsiTW92aWVJbXBvcnRHZXRTYW1wbGVEZXNjcmlwdGlvbiIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUltcG9ydEdldFNhbXBsZURlc2NyaXB0aW9uLCAxLAotCSBQeURvY19TVFIoIihNb3ZpZUltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFNhbXBsZURlc2NyaXB0aW9uSGFuZGxlIGRlc2MsIE9TVHlwZSBtZWRpYVR5cGUpIil9LAotCXsiTW92aWVJbXBvcnRTZXRPZmZzZXRBbmRMaW1pdCIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUltcG9ydFNldE9mZnNldEFuZExpbWl0LCAxLAotCSBQeURvY19TVFIoIihNb3ZpZUltcG9ydENvbXBvbmVudCBjaSwgdW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgbGltaXQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1vdmllSW1wb3J0U2V0T2Zmc2V0QW5kTGltaXQ2NCIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUltcG9ydFNldE9mZnNldEFuZExpbWl0NjQsIDEsCi0JIFB5RG9jX1NUUigiKE1vdmllSW1wb3J0Q29tcG9uZW50IGNpLCB3aWRlIG9mZnNldCwgd2lkZSBsaW1pdCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTW92aWVJbXBvcnRJZGxlIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllSW1wb3J0SWRsZSwgMSwKLQkgUHlEb2NfU1RSKCIoTW92aWVJbXBvcnRDb21wb25lbnQgY2ksIGxvbmcgaW5GbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgb3V0RmxhZ3MpIil9LAotCXsiTW92aWVJbXBvcnRWYWxpZGF0ZURhdGFSZWYiLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVJbXBvcnRWYWxpZGF0ZURhdGFSZWYsIDEsCi0JIFB5RG9jX1NUUigiKE1vdmllSW1wb3J0Q29tcG9uZW50IGNpLCBIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgVUludDggdmFsaWQpIil9LAotCXsiTW92aWVJbXBvcnRHZXRMb2FkU3RhdGUiLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVJbXBvcnRHZXRMb2FkU3RhdGUsIDEsCi0JIFB5RG9jX1NUUigiKE1vdmllSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBpbXBvcnRlckxvYWRTdGF0ZSkiKX0sCi0JeyJNb3ZpZUltcG9ydEdldE1heExvYWRlZFRpbWUiLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVJbXBvcnRHZXRNYXhMb2FkZWRUaW1lLCAxLAotCSBQeURvY19TVFIoIihNb3ZpZUltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFRpbWVWYWx1ZSB0aW1lKSIpfSwKLQl7Ik1vdmllSW1wb3J0RXN0aW1hdGVDb21wbGV0aW9uVGltZSIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUltcG9ydEVzdGltYXRlQ29tcGxldGlvblRpbWUsIDEsCi0JIFB5RG9jX1NUUigiKE1vdmllSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgVGltZVJlY29yZCB0aW1lKSIpfSwKLQl7Ik1vdmllSW1wb3J0U2V0RG9udEJsb2NrIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllSW1wb3J0U2V0RG9udEJsb2NrLCAxLAotCSBQeURvY19TVFIoIihNb3ZpZUltcG9ydENvbXBvbmVudCBjaSwgQm9vbGVhbiBkb250QmxvY2spIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1vdmllSW1wb3J0R2V0RG9udEJsb2NrIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllSW1wb3J0R2V0RG9udEJsb2NrLCAxLAotCSBQeURvY19TVFIoIihNb3ZpZUltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEJvb2xlYW4gd2lsbEJsb2NrKSIpfSwKLQl7Ik1vdmllSW1wb3J0U2V0SWRsZU1hbmFnZXIiLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVJbXBvcnRTZXRJZGxlTWFuYWdlciwgMSwKLQkgUHlEb2NfU1RSKCIoTW92aWVJbXBvcnRDb21wb25lbnQgY2ksIElkbGVNYW5hZ2VyIGltKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNb3ZpZUltcG9ydFNldE5ld01vdmllRmxhZ3MiLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVJbXBvcnRTZXROZXdNb3ZpZUZsYWdzLCAxLAotCSBQeURvY19TVFIoIihNb3ZpZUltcG9ydENvbXBvbmVudCBjaSwgbG9uZyBuZXdNb3ZpZUZsYWdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNb3ZpZUltcG9ydEdldERlc3RpbmF0aW9uTWVkaWFUeXBlIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllSW1wb3J0R2V0RGVzdGluYXRpb25NZWRpYVR5cGUsIDEsCi0JIFB5RG9jX1NUUigiKE1vdmllSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgT1NUeXBlIG1lZGlhVHlwZSkiKX0sCi0JeyJNb3ZpZUV4cG9ydFRvSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllRXhwb3J0VG9IYW5kbGUsIDEsCi0JIFB5RG9jX1NUUigiKE1vdmllRXhwb3J0Q29tcG9uZW50IGNpLCBIYW5kbGUgZGF0YUgsIE1vdmllIHRoZU1vdmllLCBUcmFjayBvbmx5VGhpc1RyYWNrLCBUaW1lVmFsdWUgc3RhcnRUaW1lLCBUaW1lVmFsdWUgZHVyYXRpb24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1vdmllRXhwb3J0VG9GaWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllRXhwb3J0VG9GaWxlLCAxLAotCSBQeURvY19TVFIoIihNb3ZpZUV4cG9ydENvbXBvbmVudCBjaSwgRlNTcGVjIHRoZUZpbGUsIE1vdmllIHRoZU1vdmllLCBUcmFjayBvbmx5VGhpc1RyYWNrLCBUaW1lVmFsdWUgc3RhcnRUaW1lLCBUaW1lVmFsdWUgZHVyYXRpb24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1vdmllRXhwb3J0R2V0QXV4aWxpYXJ5RGF0YSIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUV4cG9ydEdldEF1eGlsaWFyeURhdGEsIDEsCi0JIFB5RG9jX1NUUigiKE1vdmllRXhwb3J0Q29tcG9uZW50IGNpLCBIYW5kbGUgZGF0YUgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBPU1R5cGUgaGFuZGxlVHlwZSkiKX0sCi0JeyJNb3ZpZUV4cG9ydFNldFNhbXBsZURlc2NyaXB0aW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllRXhwb3J0U2V0U2FtcGxlRGVzY3JpcHRpb24sIDEsCi0JIFB5RG9jX1NUUigiKE1vdmllRXhwb3J0Q29tcG9uZW50IGNpLCBTYW1wbGVEZXNjcmlwdGlvbkhhbmRsZSBkZXNjLCBPU1R5cGUgbWVkaWFUeXBlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNb3ZpZUV4cG9ydERvVXNlckRpYWxvZyIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUV4cG9ydERvVXNlckRpYWxvZywgMSwKLQkgUHlEb2NfU1RSKCIoTW92aWVFeHBvcnRDb21wb25lbnQgY2ksIE1vdmllIHRoZU1vdmllLCBUcmFjayBvbmx5VGhpc1RyYWNrLCBUaW1lVmFsdWUgc3RhcnRUaW1lLCBUaW1lVmFsdWUgZHVyYXRpb24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBCb29sZWFuIGNhbmNlbGVkKSIpfSwKLQl7Ik1vdmllRXhwb3J0R2V0Q3JlYXRvclR5cGUiLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVFeHBvcnRHZXRDcmVhdG9yVHlwZSwgMSwKLQkgUHlEb2NfU1RSKCIoTW92aWVFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBPU1R5cGUgY3JlYXRvcikiKX0sCi0JeyJNb3ZpZUV4cG9ydFRvRGF0YVJlZiIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUV4cG9ydFRvRGF0YVJlZiwgMSwKLQkgUHlEb2NfU1RSKCIoTW92aWVFeHBvcnRDb21wb25lbnQgY2ksIEhhbmRsZSBkYXRhUmVmLCBPU1R5cGUgZGF0YVJlZlR5cGUsIE1vdmllIHRoZU1vdmllLCBUcmFjayBvbmx5VGhpc1RyYWNrLCBUaW1lVmFsdWUgc3RhcnRUaW1lLCBUaW1lVmFsdWUgZHVyYXRpb24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1vdmllRXhwb3J0RnJvbVByb2NlZHVyZXNUb0RhdGFSZWYiLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVFeHBvcnRGcm9tUHJvY2VkdXJlc1RvRGF0YVJlZiwgMSwKLQkgUHlEb2NfU1RSKCIoTW92aWVFeHBvcnRDb21wb25lbnQgY2ksIEhhbmRsZSBkYXRhUmVmLCBPU1R5cGUgZGF0YVJlZlR5cGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1vdmllRXhwb3J0VmFsaWRhdGUiLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVFeHBvcnRWYWxpZGF0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoTW92aWVFeHBvcnRDb21wb25lbnQgY2ksIE1vdmllIHRoZU1vdmllLCBUcmFjayBvbmx5VGhpc1RyYWNrKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQm9vbGVhbiB2YWxpZCkiKX0sCi0JeyJNb3ZpZUV4cG9ydEdldEZpbGVOYW1lRXh0ZW5zaW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllRXhwb3J0R2V0RmlsZU5hbWVFeHRlbnNpb24sIDEsCi0JIFB5RG9jX1NUUigiKE1vdmllRXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgT1NUeXBlIGV4dGVuc2lvbikiKX0sCi0JeyJNb3ZpZUV4cG9ydEdldFNob3J0RmlsZVR5cGVTdHJpbmciLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVFeHBvcnRHZXRTaG9ydEZpbGVUeXBlU3RyaW5nLCAxLAotCSBQeURvY19TVFIoIihNb3ZpZUV4cG9ydENvbXBvbmVudCBjaSwgU3RyMjU1IHR5cGVTdHJpbmcpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1vdmllRXhwb3J0R2V0U291cmNlTWVkaWFUeXBlIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllRXhwb3J0R2V0U291cmNlTWVkaWFUeXBlLCAxLAotCSBQeURvY19TVFIoIihNb3ZpZUV4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIE9TVHlwZSBtZWRpYVR5cGUpIil9LAotCXsiVGV4dEV4cG9ydEdldFRpbWVGcmFjdGlvbiIsIChQeUNGdW5jdGlvbilRdF9UZXh0RXhwb3J0R2V0VGltZUZyYWN0aW9uLCAxLAotCSBQeURvY19TVFIoIihUZXh0RXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBtb3ZpZVRpbWVGcmFjdGlvbikiKX0sCi0JeyJUZXh0RXhwb3J0U2V0VGltZUZyYWN0aW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X1RleHRFeHBvcnRTZXRUaW1lRnJhY3Rpb24sIDEsCi0JIFB5RG9jX1NUUigiKFRleHRFeHBvcnRDb21wb25lbnQgY2ksIGxvbmcgbW92aWVUaW1lRnJhY3Rpb24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlRleHRFeHBvcnRHZXRTZXR0aW5ncyIsIChQeUNGdW5jdGlvbilRdF9UZXh0RXhwb3J0R2V0U2V0dGluZ3MsIDEsCi0JIFB5RG9jX1NUUigiKFRleHRFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIHNldHRpbmcpIil9LAotCXsiVGV4dEV4cG9ydFNldFNldHRpbmdzIiwgKFB5Q0Z1bmN0aW9uKVF0X1RleHRFeHBvcnRTZXRTZXR0aW5ncywgMSwKLQkgUHlEb2NfU1RSKCIoVGV4dEV4cG9ydENvbXBvbmVudCBjaSwgbG9uZyBzZXR0aW5nKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNSURJSW1wb3J0R2V0U2V0dGluZ3MiLCAoUHlDRnVuY3Rpb24pUXRfTUlESUltcG9ydEdldFNldHRpbmdzLCAxLAotCSBQeURvY19TVFIoIihUZXh0RXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBzZXR0aW5nKSIpfSwKLQl7Ik1JRElJbXBvcnRTZXRTZXR0aW5ncyIsIChQeUNGdW5jdGlvbilRdF9NSURJSW1wb3J0U2V0U2V0dGluZ3MsIDEsCi0JIFB5RG9jX1NUUigiKFRleHRFeHBvcnRDb21wb25lbnQgY2ksIGxvbmcgc2V0dGluZykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiR3JhcGhpY3NJbWFnZUltcG9ydFNldFNlcXVlbmNlRW5hYmxlZCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltYWdlSW1wb3J0U2V0U2VxdWVuY2VFbmFibGVkLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljSW1hZ2VNb3ZpZUltcG9ydENvbXBvbmVudCBjaSwgQm9vbGVhbiBlbmFibGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkdyYXBoaWNzSW1hZ2VJbXBvcnRHZXRTZXF1ZW5jZUVuYWJsZWQiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbWFnZUltcG9ydEdldFNlcXVlbmNlRW5hYmxlZCwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY0ltYWdlTW92aWVJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBCb29sZWFuIGVuYWJsZSkiKX0sCi0JeyJQcmV2aWV3U2hvd0RhdGEiLCAoUHlDRnVuY3Rpb24pUXRfUHJldmlld1Nob3dEYXRhLCAxLAotCSBQeURvY19TVFIoIihwbm90Q29tcG9uZW50IHAsIE9TVHlwZSBkYXRhVHlwZSwgSGFuZGxlIGRhdGEsIFJlY3QgaW5IZXJlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJQcmV2aWV3TWFrZVByZXZpZXdSZWZlcmVuY2UiLCAoUHlDRnVuY3Rpb24pUXRfUHJldmlld01ha2VQcmV2aWV3UmVmZXJlbmNlLCAxLAotCSBQeURvY19TVFIoIihwbm90Q29tcG9uZW50IHAsIEZTU3BlYyBzb3VyY2VGaWxlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgT1NUeXBlIHByZXZpZXdUeXBlLCBzaG9ydCByZXNJRCkiKX0sCi0JeyJQcmV2aWV3RXZlbnQiLCAoUHlDRnVuY3Rpb24pUXRfUHJldmlld0V2ZW50LCAxLAotCSBQeURvY19TVFIoIihwbm90Q29tcG9uZW50IHApIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBFdmVudFJlY29yZCBlLCBCb29sZWFuIGhhbmRsZWRFdmVudCkiKX0sCi0JeyJEYXRhQ29kZWNEZWNvbXByZXNzIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFDb2RlY0RlY29tcHJlc3MsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFDb2RlY0NvbXBvbmVudCBkYywgdm9pZCAqIHNyY0RhdGEsIFVJbnQzMiBzcmNTaXplLCB2b2lkICogZHN0RGF0YSwgVUludDMyIGRzdEJ1ZmZlclNpemUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkRhdGFDb2RlY0dldENvbXByZXNzQnVmZmVyU2l6ZSIsIChQeUNGdW5jdGlvbilRdF9EYXRhQ29kZWNHZXRDb21wcmVzc0J1ZmZlclNpemUsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFDb2RlY0NvbXBvbmVudCBkYywgVUludDMyIHNyY1NpemUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBVSW50MzIgZHN0U2l6ZSkiKX0sCi0JeyJEYXRhQ29kZWNDb21wcmVzcyIsIChQeUNGdW5jdGlvbilRdF9EYXRhQ29kZWNDb21wcmVzcywgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUNvZGVjQ29tcG9uZW50IGRjLCB2b2lkICogc3JjRGF0YSwgVUludDMyIHNyY1NpemUsIHZvaWQgKiBkc3REYXRhLCBVSW50MzIgZHN0QnVmZmVyU2l6ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFVJbnQzMiBhY3R1YWxEc3RTaXplLCBVSW50MzIgZGVjb21wcmVzc1Nsb3ApIil9LAotCXsiRGF0YUNvZGVjQmVnaW5JbnRlcnJ1cHRTYWZlIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFDb2RlY0JlZ2luSW50ZXJydXB0U2FmZSwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUNvZGVjQ29tcG9uZW50IGRjLCB1bnNpZ25lZCBsb25nIG1heFNyY1NpemUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkRhdGFDb2RlY0VuZEludGVycnVwdFNhZmUiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUNvZGVjRW5kSW50ZXJydXB0U2FmZSwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUNvZGVjQ29tcG9uZW50IGRjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJEYXRhSEdldERhdGEiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhHZXREYXRhLCAxLAotCSBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgSGFuZGxlIGgsIGxvbmcgaE9mZnNldCwgbG9uZyBvZmZzZXQsIGxvbmcgc2l6ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiRGF0YUhQdXREYXRhIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIUHV0RGF0YSwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIEhhbmRsZSBoLCBsb25nIGhPZmZzZXQsIGxvbmcgc2l6ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgb2Zmc2V0KSIpfSwKLQl7IkRhdGFIRmx1c2hEYXRhIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIRmx1c2hEYXRhLCAxLAotCSBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiRGF0YUhPcGVuRm9yV3JpdGUiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhPcGVuRm9yV3JpdGUsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJEYXRhSENsb3NlRm9yV3JpdGUiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhDbG9zZUZvcldyaXRlLCAxLAotCSBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiRGF0YUhPcGVuRm9yUmVhZCIsIChQeUNGdW5jdGlvbilRdF9EYXRhSE9wZW5Gb3JSZWFkLCAxLAotCSBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiRGF0YUhDbG9zZUZvclJlYWQiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhDbG9zZUZvclJlYWQsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJEYXRhSFNldERhdGFSZWYiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhTZXREYXRhUmVmLCAxLAotCSBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgSGFuZGxlIGRhdGFSZWYpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkRhdGFIR2V0RGF0YVJlZiIsIChQeUNGdW5jdGlvbilRdF9EYXRhSEdldERhdGFSZWYsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSGFuZGxlIGRhdGFSZWYpIil9LAotCXsiRGF0YUhDb21wYXJlRGF0YVJlZiIsIChQeUNGdW5jdGlvbilRdF9EYXRhSENvbXBhcmVEYXRhUmVmLCAxLAotCSBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgSGFuZGxlIGRhdGFSZWYpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBCb29sZWFuIGVxdWFsKSIpfSwKLQl7IkRhdGFIVGFzayIsIChQeUNGdW5jdGlvbilRdF9EYXRhSFRhc2ssIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJEYXRhSEZpbmlzaERhdGEiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhGaW5pc2hEYXRhLCAxLAotCSBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgUHRyIFBsYWNlVG9QdXREYXRhUHRyLCBCb29sZWFuIENhbmNlbCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiRGF0YUhGbHVzaENhY2hlIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIRmx1c2hDYWNoZSwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkRhdGFIUmVzb2x2ZURhdGFSZWYiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhSZXNvbHZlRGF0YVJlZiwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIEhhbmRsZSB0aGVEYXRhUmVmLCBCb29sZWFuIHVzZXJJbnRlcmZhY2VBbGxvd2VkKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQm9vbGVhbiB3YXNDaGFuZ2VkKSIpfSwKLQl7IkRhdGFIR2V0RmlsZVNpemUiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhHZXRGaWxlU2l6ZSwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIGZpbGVTaXplKSIpfSwKLQl7IkRhdGFIQ2FuVXNlRGF0YVJlZiIsIChQeUNGdW5jdGlvbilRdF9EYXRhSENhblVzZURhdGFSZWYsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBIYW5kbGUgZGF0YVJlZikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgdXNlRmxhZ3MpIil9LAotCXsiRGF0YUhQcmVleHRlbmQiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhQcmVleHRlbmQsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCB1bnNpZ25lZCBsb25nIG1heFRvQWRkKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgbG9uZyBzcGFjZUFkZGVkKSIpfSwKLQl7IkRhdGFIU2V0RmlsZVNpemUiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhTZXRGaWxlU2l6ZSwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIGxvbmcgZmlsZVNpemUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkRhdGFIR2V0RnJlZVNwYWNlIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIR2V0RnJlZVNwYWNlLCAxLAotCSBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHVuc2lnbmVkIGxvbmcgZnJlZVNpemUpIil9LAotCXsiRGF0YUhDcmVhdGVGaWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIQ3JlYXRlRmlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIE9TVHlwZSBjcmVhdG9yLCBCb29sZWFuIGRlbGV0ZUV4aXN0aW5nKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJEYXRhSEdldFByZWZlcnJlZEJsb2NrU2l6ZSIsIChQeUNGdW5jdGlvbilRdF9EYXRhSEdldFByZWZlcnJlZEJsb2NrU2l6ZSwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIGJsb2NrU2l6ZSkiKX0sCi0JeyJEYXRhSEdldERldmljZUluZGV4IiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIR2V0RGV2aWNlSW5kZXgsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBkZXZpY2VJbmRleCkiKX0sCi0JeyJEYXRhSElzU3RyZWFtaW5nRGF0YUhhbmRsZXIiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhJc1N0cmVhbWluZ0RhdGFIYW5kbGVyLCAxLAotCSBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEJvb2xlYW4geWVzKSIpfSwKLQl7IkRhdGFIR2V0RGF0YUluQnVmZmVyIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIR2V0RGF0YUluQnVmZmVyLCAxLAotCSBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgbG9uZyBzdGFydE9mZnNldCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgc2l6ZSkiKX0sCi0JeyJEYXRhSEdldFNjaGVkdWxlQWhlYWRUaW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIR2V0U2NoZWR1bGVBaGVhZFRpbWUsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBtaWxsaXNlY3MpIil9LAotCXsiRGF0YUhTZXRDYWNoZVNpemVMaW1pdCIsIChQeUNGdW5jdGlvbilRdF9EYXRhSFNldENhY2hlU2l6ZUxpbWl0LCAxLAotCSBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgU2l6ZSBjYWNoZVNpemVMaW1pdCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiRGF0YUhHZXRDYWNoZVNpemVMaW1pdCIsIChQeUNGdW5jdGlvbilRdF9EYXRhSEdldENhY2hlU2l6ZUxpbWl0LCAxLAotCSBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFNpemUgY2FjaGVTaXplTGltaXQpIil9LAotCXsiRGF0YUhHZXRNb3ZpZSIsIChQeUNGdW5jdGlvbilRdF9EYXRhSEdldE1vdmllLCAxLAotCSBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIE1vdmllIHRoZU1vdmllLCBzaG9ydCBpZCkiKX0sCi0JeyJEYXRhSEFkZE1vdmllIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIQWRkTW92aWUsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBNb3ZpZSB0aGVNb3ZpZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHNob3J0IGlkKSIpfSwKLQl7IkRhdGFIVXBkYXRlTW92aWUiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhVcGRhdGVNb3ZpZSwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIE1vdmllIHRoZU1vdmllLCBzaG9ydCBpZCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiRGF0YUhEb2VzQnVmZmVyIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIRG9lc0J1ZmZlciwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBCb29sZWFuIGJ1ZmZlcnNSZWFkcywgQm9vbGVhbiBidWZmZXJzV3JpdGVzKSIpfSwKLQl7IkRhdGFIR2V0RmlsZU5hbWUiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhHZXRGaWxlTmFtZSwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIFN0cjI1NSBzdHIpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkRhdGFIR2V0QXZhaWxhYmxlRmlsZVNpemUiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhHZXRBdmFpbGFibGVGaWxlU2l6ZSwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIGZpbGVTaXplKSIpfSwKLQl7IkRhdGFIR2V0TWFjT1NGaWxlVHlwZSIsIChQeUNGdW5jdGlvbilRdF9EYXRhSEdldE1hY09TRmlsZVR5cGUsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgT1NUeXBlIGZpbGVUeXBlKSIpfSwKLQl7IkRhdGFIR2V0TUlNRVR5cGUiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhHZXRNSU1FVHlwZSwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIFN0cjI1NSBtaW1lVHlwZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiRGF0YUhTZXREYXRhUmVmV2l0aEFuY2hvciIsIChQeUNGdW5jdGlvbilRdF9EYXRhSFNldERhdGFSZWZXaXRoQW5jaG9yLCAxLAotCSBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgSGFuZGxlIGFuY2hvckRhdGFSZWYsIE9TVHlwZSBkYXRhUmVmVHlwZSwgSGFuZGxlIGRhdGFSZWYpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkRhdGFIR2V0RGF0YVJlZldpdGhBbmNob3IiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhHZXREYXRhUmVmV2l0aEFuY2hvciwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIEhhbmRsZSBhbmNob3JEYXRhUmVmLCBPU1R5cGUgZGF0YVJlZlR5cGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBIYW5kbGUgZGF0YVJlZikiKX0sCi0JeyJEYXRhSFNldE1hY09TRmlsZVR5cGUiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhTZXRNYWNPU0ZpbGVUeXBlLCAxLAotCSBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgT1NUeXBlIGZpbGVUeXBlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJEYXRhSFNldFRpbWVCYXNlIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIU2V0VGltZUJhc2UsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBUaW1lQmFzZSB0YikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiRGF0YUhHZXRJbmZvRmxhZ3MiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhHZXRJbmZvRmxhZ3MsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgVUludDMyIGZsYWdzKSIpfSwKLQl7IkRhdGFIR2V0RmlsZVNpemU2NCIsIChQeUNGdW5jdGlvbilRdF9EYXRhSEdldEZpbGVTaXplNjQsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgd2lkZSBmaWxlU2l6ZSkiKX0sCi0JeyJEYXRhSFByZWV4dGVuZDY0IiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIUHJlZXh0ZW5kNjQsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCB3aWRlIG1heFRvQWRkKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgd2lkZSBzcGFjZUFkZGVkKSIpfSwKLQl7IkRhdGFIU2V0RmlsZVNpemU2NCIsIChQeUNGdW5jdGlvbilRdF9EYXRhSFNldEZpbGVTaXplNjQsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCB3aWRlIGZpbGVTaXplKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJEYXRhSEdldEZyZWVTcGFjZTY0IiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIR2V0RnJlZVNwYWNlNjQsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgd2lkZSBmcmVlU2l6ZSkiKX0sCi0JeyJEYXRhSEFwcGVuZDY0IiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIQXBwZW5kNjQsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCB2b2lkICogZGF0YSwgdW5zaWduZWQgbG9uZyBzaXplKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgd2lkZSBmaWxlT2Zmc2V0KSIpfSwKLQl7IkRhdGFIUG9sbFJlYWQiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhQb2xsUmVhZCwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIHZvaWQgKiBkYXRhUHRyKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgVUludDMyIGRhdGFTaXplU29GYXIpIil9LAotCXsiRGF0YUhHZXREYXRhQXZhaWxhYmlsaXR5IiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIR2V0RGF0YUF2YWlsYWJpbGl0eSwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIGxvbmcgb2Zmc2V0LCBsb25nIGxlbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgbWlzc2luZ19vZmZzZXQsIGxvbmcgbWlzc2luZ19sZW4pIil9LAotCXsiRGF0YUhHZXREYXRhUmVmQXNUeXBlIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIR2V0RGF0YVJlZkFzVHlwZSwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIE9TVHlwZSByZXF1ZXN0ZWRUeXBlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSGFuZGxlIGRhdGFSZWYpIil9LAotCXsiRGF0YUhTZXREYXRhUmVmRXh0ZW5zaW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIU2V0RGF0YVJlZkV4dGVuc2lvbiwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIEhhbmRsZSBleHRlbnNpb24sIE9TVHlwZSBpZFR5cGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkRhdGFIR2V0RGF0YVJlZkV4dGVuc2lvbiIsIChQeUNGdW5jdGlvbilRdF9EYXRhSEdldERhdGFSZWZFeHRlbnNpb24sIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBPU1R5cGUgaWRUeXBlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSGFuZGxlIGV4dGVuc2lvbikiKX0sCi0JeyJEYXRhSEdldE1vdmllV2l0aEZsYWdzIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIR2V0TW92aWVXaXRoRmxhZ3MsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBzaG9ydCBmbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIE1vdmllIHRoZU1vdmllLCBzaG9ydCBpZCkiKX0sCi0JeyJEYXRhSEdldEZpbGVUeXBlT3JkZXJpbmciLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhHZXRGaWxlVHlwZU9yZGVyaW5nLCAxLAotCSBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIERhdGFIRmlsZVR5cGVPcmRlcmluZ0hhbmRsZSBvcmRlcmluZ0xpc3RIYW5kbGUpIil9LAotCXsiRGF0YUhDcmVhdGVGaWxlV2l0aEZsYWdzIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIQ3JlYXRlRmlsZVdpdGhGbGFncywgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIE9TVHlwZSBjcmVhdG9yLCBCb29sZWFuIGRlbGV0ZUV4aXN0aW5nLCBVSW50MzIgZmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkRhdGFIR2V0SW5mbyIsIChQeUNGdW5jdGlvbilRdF9EYXRhSEdldEluZm8sIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBPU1R5cGUgd2hhdCwgdm9pZCAqIGluZm8pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkRhdGFIU2V0SWRsZU1hbmFnZXIiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhTZXRJZGxlTWFuYWdlciwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIElkbGVNYW5hZ2VyIGltKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJEYXRhSERlbGV0ZUZpbGUiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhEZWxldGVGaWxlLCAxLAotCSBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiRGF0YUhTZXRNb3ZpZVVzYWdlRmxhZ3MiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhTZXRNb3ZpZVVzYWdlRmxhZ3MsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBsb25nIGZsYWdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJEYXRhSFVzZVRlbXBvcmFyeURhdGFSZWYiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhVc2VUZW1wb3JhcnlEYXRhUmVmLCAxLAotCSBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgbG9uZyBpbkZsYWdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJEYXRhSEdldFRlbXBvcmFyeURhdGFSZWZDYXBhYmlsaXRpZXMiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhHZXRUZW1wb3JhcnlEYXRhUmVmQ2FwYWJpbGl0aWVzLCAxLAotCSBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgb3V0VW5kZXJzdG9vZEZsYWdzKSIpfSwKLQl7IkRhdGFIUmVuYW1lRmlsZSIsIChQeUNGdW5jdGlvbilRdF9EYXRhSFJlbmFtZUZpbGUsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBIYW5kbGUgbmV3RGF0YVJlZikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiRGF0YUhQbGF5YmFja0hpbnRzIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIUGxheWJhY2tIaW50cywgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIGxvbmcgZmxhZ3MsIHVuc2lnbmVkIGxvbmcgbWluRmlsZU9mZnNldCwgdW5zaWduZWQgbG9uZyBtYXhGaWxlT2Zmc2V0LCBsb25nIGJ5dGVzUGVyU2Vjb25kKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJEYXRhSFBsYXliYWNrSGludHM2NCIsIChQeUNGdW5jdGlvbilRdF9EYXRhSFBsYXliYWNrSGludHM2NCwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIGxvbmcgZmxhZ3MsIHdpZGUgbWluRmlsZU9mZnNldCwgd2lkZSBtYXhGaWxlT2Zmc2V0LCBsb25nIGJ5dGVzUGVyU2Vjb25kKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJEYXRhSEdldERhdGFSYXRlIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIR2V0RGF0YVJhdGUsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBsb25nIGZsYWdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBieXRlc1BlclNlY29uZCkiKX0sCi0JeyJEYXRhSFNldFRpbWVIaW50cyIsIChQeUNGdW5jdGlvbilRdF9EYXRhSFNldFRpbWVIaW50cywgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIGxvbmcgZmxhZ3MsIGxvbmcgYmFuZHdpZHRoUHJpb3JpdHksIFRpbWVTY2FsZSBzY2FsZSwgVGltZVZhbHVlIG1pblRpbWUsIFRpbWVWYWx1ZSBtYXhUaW1lKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJWREdldE1heFNyY1JlY3QiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXRNYXhTcmNSZWN0LCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgc2hvcnQgaW5wdXRTdGQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSZWN0IG1heFNyY1JlY3QpIil9LAotCXsiVkRHZXRBY3RpdmVTcmNSZWN0IiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0QWN0aXZlU3JjUmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIHNob3J0IGlucHV0U3RkKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmVjdCBhY3RpdmVTcmNSZWN0KSIpfSwKLQl7IlZEU2V0RGlnaXRpemVyUmVjdCIsIChQeUNGdW5jdGlvbilRdF9WRFNldERpZ2l0aXplclJlY3QsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmVjdCBkaWdpdGl6ZXJSZWN0KSIpfSwKLQl7IlZER2V0RGlnaXRpemVyUmVjdCIsIChQeUNGdW5jdGlvbilRdF9WREdldERpZ2l0aXplclJlY3QsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmVjdCBkaWdpdGl6ZXJSZWN0KSIpfSwKLQl7IlZER2V0VkJsYW5rUmVjdCIsIChQeUNGdW5jdGlvbilRdF9WREdldFZCbGFua1JlY3QsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBzaG9ydCBpbnB1dFN0ZCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJlY3QgdkJsYW5rUmVjdCkiKX0sCi0JeyJWREdldE1hc2tQaXhNYXAiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXRNYXNrUGl4TWFwLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgUGl4TWFwSGFuZGxlIG1hc2tQaXhNYXApIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlZEVXNlVGhpc0NMVVQiLCAoUHlDRnVuY3Rpb24pUXRfVkRVc2VUaGlzQ0xVVCwgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIENUYWJIYW5kbGUgY29sb3JUYWJsZUhhbmRsZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiVkRTZXRJbnB1dEdhbW1hVmFsdWUiLCAoUHlDRnVuY3Rpb24pUXRfVkRTZXRJbnB1dEdhbW1hVmFsdWUsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBGaXhlZCBjaGFubmVsMSwgRml4ZWQgY2hhbm5lbDIsIEZpeGVkIGNoYW5uZWwzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJWREdldElucHV0R2FtbWFWYWx1ZSIsIChQeUNGdW5jdGlvbilRdF9WREdldElucHV0R2FtbWFWYWx1ZSwgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBGaXhlZCBjaGFubmVsMSwgRml4ZWQgY2hhbm5lbDIsIEZpeGVkIGNoYW5uZWwzKSIpfSwKLQl7IlZEU2V0QnJpZ2h0bmVzcyIsIChQeUNGdW5jdGlvbilRdF9WRFNldEJyaWdodG5lc3MsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgc2hvcnQgYnJpZ2h0bmVzcykiKX0sCi0JeyJWREdldEJyaWdodG5lc3MiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXRCcmlnaHRuZXNzLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHVuc2lnbmVkIHNob3J0IGJyaWdodG5lc3MpIil9LAotCXsiVkRTZXRDb250cmFzdCIsIChQeUNGdW5jdGlvbilRdF9WRFNldENvbnRyYXN0LCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHVuc2lnbmVkIHNob3J0IGNvbnRyYXN0KSIpfSwKLQl7IlZEU2V0SHVlIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEU2V0SHVlLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHVuc2lnbmVkIHNob3J0IGh1ZSkiKX0sCi0JeyJWRFNldFNoYXJwbmVzcyIsIChQeUNGdW5jdGlvbilRdF9WRFNldFNoYXJwbmVzcywgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBzaG9ydCBzaGFycG5lc3MpIil9LAotCXsiVkRTZXRTYXR1cmF0aW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEU2V0U2F0dXJhdGlvbiwgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBzaG9ydCBzYXR1cmF0aW9uKSIpfSwKLQl7IlZER2V0Q29udHJhc3QiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXRDb250cmFzdCwgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBzaG9ydCBjb250cmFzdCkiKX0sCi0JeyJWREdldEh1ZSIsIChQeUNGdW5jdGlvbilRdF9WREdldEh1ZSwgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBzaG9ydCBodWUpIil9LAotCXsiVkRHZXRTaGFycG5lc3MiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXRTaGFycG5lc3MsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgc2hvcnQgc2hhcnBuZXNzKSIpfSwKLQl7IlZER2V0U2F0dXJhdGlvbiIsIChQeUNGdW5jdGlvbilRdF9WREdldFNhdHVyYXRpb24sIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgc2hvcnQgc2F0dXJhdGlvbikiKX0sCi0JeyJWREdyYWJPbmVGcmFtZSIsIChQeUNGdW5jdGlvbilRdF9WREdyYWJPbmVGcmFtZSwgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlZER2V0TWF4QXV4QnVmZmVyIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0TWF4QXV4QnVmZmVyLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFBpeE1hcEhhbmRsZSBwbSwgUmVjdCByKSIpfSwKLQl7IlZER2V0Q3VycmVudEZsYWdzIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0Q3VycmVudEZsYWdzLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgaW5wdXRDdXJyZW50RmxhZywgbG9uZyBvdXRwdXRDdXJyZW50RmxhZykiKX0sCi0JeyJWRFNldEtleUNvbG9yIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEU2V0S2V5Q29sb3IsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBsb25nIGluZGV4KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJWREdldEtleUNvbG9yIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0S2V5Q29sb3IsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBpbmRleCkiKX0sCi0JeyJWREFkZEtleUNvbG9yIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEQWRkS2V5Q29sb3IsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBpbmRleCkiKX0sCi0JeyJWREdldE5leHRLZXlDb2xvciIsIChQeUNGdW5jdGlvbilRdF9WREdldE5leHRLZXlDb2xvciwgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIGxvbmcgaW5kZXgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlZEU2V0S2V5Q29sb3JSYW5nZSIsIChQeUNGdW5jdGlvbilRdF9WRFNldEtleUNvbG9yUmFuZ2UsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUkdCQ29sb3IgbWluUkdCLCBSR0JDb2xvciBtYXhSR0IpIil9LAotCXsiVkRHZXRLZXlDb2xvclJhbmdlIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0S2V5Q29sb3JSYW5nZSwgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSR0JDb2xvciBtaW5SR0IsIFJHQkNvbG9yIG1heFJHQikiKX0sCi0JeyJWRFNldElucHV0Q29sb3JTcGFjZU1vZGUiLCAoUHlDRnVuY3Rpb24pUXRfVkRTZXRJbnB1dENvbG9yU3BhY2VNb2RlLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgc2hvcnQgY29sb3JTcGFjZU1vZGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlZER2V0SW5wdXRDb2xvclNwYWNlTW9kZSIsIChQeUNGdW5jdGlvbilRdF9WREdldElucHV0Q29sb3JTcGFjZU1vZGUsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgc2hvcnQgY29sb3JTcGFjZU1vZGUpIil9LAotCXsiVkRTZXRDbGlwU3RhdGUiLCAoUHlDRnVuY3Rpb24pUXRfVkRTZXRDbGlwU3RhdGUsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBzaG9ydCBjbGlwRW5hYmxlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJWREdldENsaXBTdGF0ZSIsIChQeUNGdW5jdGlvbilRdF9WREdldENsaXBTdGF0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBzaG9ydCBjbGlwRW5hYmxlKSIpfSwKLQl7IlZEU2V0Q2xpcFJnbiIsIChQeUNGdW5jdGlvbilRdF9WRFNldENsaXBSZ24sIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBSZ25IYW5kbGUgY2xpcFJlZ2lvbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiVkRDbGVhckNsaXBSZ24iLCAoUHlDRnVuY3Rpb24pUXRfVkRDbGVhckNsaXBSZ24sIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBSZ25IYW5kbGUgY2xpcFJlZ2lvbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiVkRHZXRDTFVUSW5Vc2UiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXRDTFVUSW5Vc2UsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQ1RhYkhhbmRsZSBjb2xvclRhYmxlSGFuZGxlKSIpfSwKLQl7IlZEU2V0UExMRmlsdGVyVHlwZSIsIChQeUNGdW5jdGlvbilRdF9WRFNldFBMTEZpbHRlclR5cGUsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBzaG9ydCBwbGxUeXBlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJWREdldFBMTEZpbHRlclR5cGUiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXRQTExGaWx0ZXJUeXBlLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHNob3J0IHBsbFR5cGUpIil9LAotCXsiVkRHZXRNYXNrYW5kVmFsdWUiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXRNYXNrYW5kVmFsdWUsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCB1bnNpZ25lZCBzaG9ydCBibGVuZExldmVsKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBtYXNrLCBsb25nIHZhbHVlKSIpfSwKLQl7IlZEU2V0TWFzdGVyQmxlbmRMZXZlbCIsIChQeUNGdW5jdGlvbilRdF9WRFNldE1hc3RlckJsZW5kTGV2ZWwsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgc2hvcnQgYmxlbmRMZXZlbCkiKX0sCi0JeyJWRFNldFBsYXlUaHJ1T25PZmYiLCAoUHlDRnVuY3Rpb24pUXRfVkRTZXRQbGF5VGhydU9uT2ZmLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgc2hvcnQgc3RhdGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlZEU2V0RmllbGRQcmVmZXJlbmNlIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEU2V0RmllbGRQcmVmZXJlbmNlLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgc2hvcnQgZmllbGRGbGFnKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJWREdldEZpZWxkUHJlZmVyZW5jZSIsIChQeUNGdW5jdGlvbilRdF9WREdldEZpZWxkUHJlZmVyZW5jZSwgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBzaG9ydCBmaWVsZEZsYWcpIil9LAotCXsiVkRQcmVmbGlnaHRHbG9iYWxSZWN0IiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEUHJlZmxpZ2h0R2xvYmFsUmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIEdyYWZQdHIgdGhlV2luZG93KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmVjdCBnbG9iYWxSZWN0KSIpfSwKLQl7IlZEU2V0UGxheVRocnVHbG9iYWxSZWN0IiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEU2V0UGxheVRocnVHbG9iYWxSZWN0LCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgR3JhZlB0ciB0aGVXaW5kb3cpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSZWN0IGdsb2JhbFJlY3QpIil9LAotCXsiVkRTZXRCbGFja0xldmVsVmFsdWUiLCAoUHlDRnVuY3Rpb24pUXRfVkRTZXRCbGFja0xldmVsVmFsdWUsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgc2hvcnQgYmxhY2tMZXZlbCkiKX0sCi0JeyJWREdldEJsYWNrTGV2ZWxWYWx1ZSIsIChQeUNGdW5jdGlvbilRdF9WREdldEJsYWNrTGV2ZWxWYWx1ZSwgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBzaG9ydCBibGFja0xldmVsKSIpfSwKLQl7IlZEU2V0V2hpdGVMZXZlbFZhbHVlIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEU2V0V2hpdGVMZXZlbFZhbHVlLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHVuc2lnbmVkIHNob3J0IHdoaXRlTGV2ZWwpIil9LAotCXsiVkRHZXRXaGl0ZUxldmVsVmFsdWUiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXRXaGl0ZUxldmVsVmFsdWUsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgc2hvcnQgd2hpdGVMZXZlbCkiKX0sCi0JeyJWREdldFZpZGVvRGVmYXVsdHMiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXRWaWRlb0RlZmF1bHRzLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHVuc2lnbmVkIHNob3J0IGJsYWNrTGV2ZWwsIHVuc2lnbmVkIHNob3J0IHdoaXRlTGV2ZWwsIHVuc2lnbmVkIHNob3J0IGJyaWdodG5lc3MsIHVuc2lnbmVkIHNob3J0IGh1ZSwgdW5zaWduZWQgc2hvcnQgc2F0dXJhdGlvbiwgdW5zaWduZWQgc2hvcnQgY29udHJhc3QsIHVuc2lnbmVkIHNob3J0IHNoYXJwbmVzcykiKX0sCi0JeyJWREdldE51bWJlck9mSW5wdXRzIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0TnVtYmVyT2ZJbnB1dHMsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgc2hvcnQgaW5wdXRzKSIpfSwKLQl7IlZER2V0SW5wdXRGb3JtYXQiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXRJbnB1dEZvcm1hdCwgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIHNob3J0IGlucHV0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgc2hvcnQgZm9ybWF0KSIpfSwKLQl7IlZEU2V0SW5wdXQiLCAoUHlDRnVuY3Rpb24pUXRfVkRTZXRJbnB1dCwgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIHNob3J0IGlucHV0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJWREdldElucHV0IiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0SW5wdXQsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgc2hvcnQgaW5wdXQpIil9LAotCXsiVkRTZXRJbnB1dFN0YW5kYXJkIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEU2V0SW5wdXRTdGFuZGFyZCwgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIHNob3J0IGlucHV0U3RhbmRhcmQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlZEU2V0dXBCdWZmZXJzIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEU2V0dXBCdWZmZXJzLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgVmRpZ0J1ZmZlclJlY0xpc3RIYW5kbGUgYnVmZmVyTGlzdCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiVkRHcmFiT25lRnJhbWVBc3luYyIsIChQeUNGdW5jdGlvbilRdF9WREdyYWJPbmVGcmFtZUFzeW5jLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgc2hvcnQgYnVmZmVyKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJWRERvbmUiLCAoUHlDRnVuY3Rpb24pUXRfVkREb25lLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgc2hvcnQgYnVmZmVyKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJWRFNldENvbXByZXNzaW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEU2V0Q29tcHJlc3Npb24sIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBPU1R5cGUgY29tcHJlc3NUeXBlLCBzaG9ydCBkZXB0aCwgQ29kZWNRIHNwYXRpYWxRdWFsaXR5LCBDb2RlY1EgdGVtcG9yYWxRdWFsaXR5LCBsb25nIGtleUZyYW1lUmF0ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJlY3QgYm91bmRzKSIpfSwKLQl7IlZEQ29tcHJlc3NPbmVGcmFtZUFzeW5jIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEQ29tcHJlc3NPbmVGcmFtZUFzeW5jLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiVkRHZXRJbWFnZURlc2NyaXB0aW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0SW1hZ2VEZXNjcmlwdGlvbiwgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIEltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiVkRSZXNldENvbXByZXNzU2VxdWVuY2UiLCAoUHlDRnVuY3Rpb24pUXRfVkRSZXNldENvbXByZXNzU2VxdWVuY2UsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJWRFNldENvbXByZXNzaW9uT25PZmYiLCAoUHlDRnVuY3Rpb24pUXRfVkRTZXRDb21wcmVzc2lvbk9uT2ZmLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgQm9vbGVhbiBzdGF0ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiVkRHZXRDb21wcmVzc2lvblR5cGVzIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0Q29tcHJlc3Npb25UeXBlcywgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIFZEQ29tcHJlc3Npb25MaXN0SGFuZGxlIGgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlZEU2V0VGltZUJhc2UiLCAoUHlDRnVuY3Rpb24pUXRfVkRTZXRUaW1lQmFzZSwgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIFRpbWVCYXNlIHQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlZEU2V0RnJhbWVSYXRlIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEU2V0RnJhbWVSYXRlLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgRml4ZWQgZnJhbWVzUGVyU2Vjb25kKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJWREdldERhdGFSYXRlIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0RGF0YVJhdGUsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBtaWxsaVNlY1BlckZyYW1lLCBGaXhlZCBmcmFtZXNQZXJTZWNvbmQsIGxvbmcgYnl0ZXNQZXJTZWNvbmQpIil9LAotCXsiVkRHZXRTb3VuZElucHV0RHJpdmVyIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0U291bmRJbnB1dERyaXZlciwgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIFN0cjI1NSBzb3VuZERyaXZlck5hbWUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlZER2V0RE1BRGVwdGhzIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0RE1BRGVwdGhzLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgZGVwdGhBcnJheSwgbG9uZyBwcmVmZXJyZWREZXB0aCkiKX0sCi0JeyJWREdldFByZWZlcnJlZFRpbWVTY2FsZSIsIChQeUNGdW5jdGlvbilRdF9WREdldFByZWZlcnJlZFRpbWVTY2FsZSwgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBUaW1lU2NhbGUgcHJlZmVycmVkKSIpfSwKLQl7IlZEUmVsZWFzZUFzeW5jQnVmZmVycyIsIChQeUNGdW5jdGlvbilRdF9WRFJlbGVhc2VBc3luY0J1ZmZlcnMsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJWRFNldERhdGFSYXRlIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEU2V0RGF0YVJhdGUsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBsb25nIGJ5dGVzUGVyU2Vjb25kKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJWREdldFRpbWVDb2RlIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0VGltZUNvZGUsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCB2b2lkICogdGltZUNvZGVGb3JtYXQsIHZvaWQgKiB0aW1lQ29kZVRpbWUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBUaW1lUmVjb3JkIGF0VGltZSkiKX0sCi0JeyJWRFVzZVNhZmVCdWZmZXJzIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEVXNlU2FmZUJ1ZmZlcnMsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBCb29sZWFuIHVzZVNhZmVCdWZmZXJzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJWREdldFNvdW5kSW5wdXRTb3VyY2UiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXRTb3VuZElucHV0U291cmNlLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgbG9uZyB2aWRlb0lucHV0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBzb3VuZElucHV0KSIpfSwKLQl7IlZER2V0Q29tcHJlc3Npb25UaW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0Q29tcHJlc3Npb25UaW1lLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgT1NUeXBlIGNvbXByZXNzaW9uVHlwZSwgc2hvcnQgZGVwdGgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSZWN0IHNyY1JlY3QsIENvZGVjUSBzcGF0aWFsUXVhbGl0eSwgQ29kZWNRIHRlbXBvcmFsUXVhbGl0eSwgdW5zaWduZWQgbG9uZyBjb21wcmVzc1RpbWUpIil9LAotCXsiVkRTZXRQcmVmZXJyZWRQYWNrZXRTaXplIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEU2V0UHJlZmVycmVkUGFja2V0U2l6ZSwgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIGxvbmcgcHJlZmVycmVkUGFja2V0U2l6ZUluQnl0ZXMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlZEU2V0UHJlZmVycmVkSW1hZ2VEaW1lbnNpb25zIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEU2V0UHJlZmVycmVkSW1hZ2VEaW1lbnNpb25zLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgbG9uZyB3aWR0aCwgbG9uZyBoZWlnaHQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlZER2V0UHJlZmVycmVkSW1hZ2VEaW1lbnNpb25zIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0UHJlZmVycmVkSW1hZ2VEaW1lbnNpb25zLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgd2lkdGgsIGxvbmcgaGVpZ2h0KSIpfSwKLQl7IlZER2V0SW5wdXROYW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0SW5wdXROYW1lLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgbG9uZyB2aWRlb0lucHV0LCBTdHIyNTUgbmFtZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiVkRTZXREZXN0aW5hdGlvblBvcnQiLCAoUHlDRnVuY3Rpb24pUXRfVkRTZXREZXN0aW5hdGlvblBvcnQsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBDR3JhZlB0ciBkZXN0UG9ydCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiVkRHZXREZXZpY2VOYW1lQW5kRmxhZ3MiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXREZXZpY2VOYW1lQW5kRmxhZ3MsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBTdHIyNTUgb3V0TmFtZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFVJbnQzMiBvdXROYW1lRmxhZ3MpIil9LAotCXsiVkRDYXB0dXJlU3RhdGVDaGFuZ2luZyIsIChQeUNGdW5jdGlvbilRdF9WRENhcHR1cmVTdGF0ZUNoYW5naW5nLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgVUludDMyIGluU3RhdGVGbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiWE1MUGFyc2VHZXREZXRhaWxlZFBhcnNlRXJyb3IiLCAoUHlDRnVuY3Rpb24pUXRfWE1MUGFyc2VHZXREZXRhaWxlZFBhcnNlRXJyb3IsIDEsCi0JIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGFQYXJzZXIsIFN0cmluZ1B0ciBlcnJEZXNjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBlcnJvckxpbmUpIil9LAotCXsiWE1MUGFyc2VBZGRFbGVtZW50IiwgKFB5Q0Z1bmN0aW9uKVF0X1hNTFBhcnNlQWRkRWxlbWVudCwgMSwKLQkgUHlEb2NfU1RSKCIoQ29tcG9uZW50SW5zdGFuY2UgYVBhcnNlciwgVUludDMyIG5hbWVTcGFjZUlELCBsb25nIGVsZW1lbnRGbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGNoYXIgZWxlbWVudE5hbWUsIFVJbnQzMiBlbGVtZW50SUQpIil9LAotCXsiWE1MUGFyc2VBZGRBdHRyaWJ1dGUiLCAoUHlDRnVuY3Rpb24pUXRfWE1MUGFyc2VBZGRBdHRyaWJ1dGUsIDEsCi0JIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGFQYXJzZXIsIFVJbnQzMiBlbGVtZW50SUQsIFVJbnQzMiBuYW1lU3BhY2VJRCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGNoYXIgYXR0cmlidXRlTmFtZSwgVUludDMyIGF0dHJpYnV0ZUlEKSIpfSwKLQl7IlhNTFBhcnNlQWRkTXVsdGlwbGVBdHRyaWJ1dGVzIiwgKFB5Q0Z1bmN0aW9uKVF0X1hNTFBhcnNlQWRkTXVsdGlwbGVBdHRyaWJ1dGVzLCAxLAotCSBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBhUGFyc2VyLCBVSW50MzIgZWxlbWVudElEKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgVUludDMyIG5hbWVTcGFjZUlEcywgY2hhciBhdHRyaWJ1dGVOYW1lcywgVUludDMyIGF0dHJpYnV0ZUlEcykiKX0sCi0JeyJYTUxQYXJzZUFkZEF0dHJpYnV0ZUFuZFZhbHVlIiwgKFB5Q0Z1bmN0aW9uKVF0X1hNTFBhcnNlQWRkQXR0cmlidXRlQW5kVmFsdWUsIDEsCi0JIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGFQYXJzZXIsIFVJbnQzMiBlbGVtZW50SUQsIFVJbnQzMiBuYW1lU3BhY2VJRCwgVUludDMyIGF0dHJpYnV0ZVZhbHVlS2luZCwgdm9pZCAqIGF0dHJpYnV0ZVZhbHVlS2luZEluZm8pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBjaGFyIGF0dHJpYnV0ZU5hbWUsIFVJbnQzMiBhdHRyaWJ1dGVJRCkiKX0sCi0JeyJYTUxQYXJzZUFkZEF0dHJpYnV0ZVZhbHVlS2luZCIsIChQeUNGdW5jdGlvbilRdF9YTUxQYXJzZUFkZEF0dHJpYnV0ZVZhbHVlS2luZCwgMSwKLQkgUHlEb2NfU1RSKCIoQ29tcG9uZW50SW5zdGFuY2UgYVBhcnNlciwgVUludDMyIGVsZW1lbnRJRCwgVUludDMyIGF0dHJpYnV0ZUlELCBVSW50MzIgYXR0cmlidXRlVmFsdWVLaW5kLCB2b2lkICogYXR0cmlidXRlVmFsdWVLaW5kSW5mbykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiWE1MUGFyc2VBZGROYW1lU3BhY2UiLCAoUHlDRnVuY3Rpb24pUXRfWE1MUGFyc2VBZGROYW1lU3BhY2UsIDEsCi0JIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGFQYXJzZXIpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBjaGFyIG5hbWVTcGFjZVVSTCwgVUludDMyIG5hbWVTcGFjZUlEKSIpfSwKLQl7IlhNTFBhcnNlU2V0T2Zmc2V0QW5kTGltaXQiLCAoUHlDRnVuY3Rpb24pUXRfWE1MUGFyc2VTZXRPZmZzZXRBbmRMaW1pdCwgMSwKLQkgUHlEb2NfU1RSKCIoQ29tcG9uZW50SW5zdGFuY2UgYVBhcnNlciwgVUludDMyIG9mZnNldCwgVUludDMyIGxpbWl0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJYTUxQYXJzZVNldEV2ZW50UGFyc2VSZWZDb24iLCAoUHlDRnVuY3Rpb24pUXRfWE1MUGFyc2VTZXRFdmVudFBhcnNlUmVmQ29uLCAxLAotCSBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBhUGFyc2VyLCBsb25nIHJlZmNvbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dJbml0aWFsaXplIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHSW5pdGlhbGl6ZSwgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR1NldERhdGFPdXRwdXQiLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXREYXRhT3V0cHV0LCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIEZTU3BlYyBtb3ZpZUZpbGUsIGxvbmcgd2hlcmVGbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dHZXREYXRhT3V0cHV0IiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0RGF0YU91dHB1dCwgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBGU1NwZWMgbW92aWVGaWxlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyB3aGVyZUZsYWdzKSIpfSwKLQl7IlNHU2V0R1dvcmxkIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0R1dvcmxkLCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIENHcmFmUHRyIGdwLCBHREhhbmRsZSBnZCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dHZXRHV29ybGQiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRHV29ybGQsIDEsCi0JIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIENHcmFmUHRyIGdwLCBHREhhbmRsZSBnZCkiKX0sCi0JeyJTR05ld0NoYW5uZWwiLCAoUHlDRnVuY3Rpb24pUXRfU0dOZXdDaGFubmVsLCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIE9TVHlwZSBjaGFubmVsVHlwZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFNHQ2hhbm5lbCByZWYpIil9LAotCXsiU0dEaXNwb3NlQ2hhbm5lbCIsIChQeUNGdW5jdGlvbilRdF9TR0Rpc3Bvc2VDaGFubmVsLCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR1N0YXJ0UHJldmlldyIsIChQeUNGdW5jdGlvbilRdF9TR1N0YXJ0UHJldmlldywgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR1N0YXJ0UmVjb3JkIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU3RhcnRSZWNvcmQsIDEsCi0JIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dJZGxlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHSWRsZSwgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR1N0b3AiLCAoUHlDRnVuY3Rpb24pUXRfU0dTdG9wLCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNHUGF1c2UiLCAoUHlDRnVuY3Rpb24pUXRfU0dQYXVzZSwgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBCb29sZWFuIHBhdXNlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR1ByZXBhcmUiLCAoUHlDRnVuY3Rpb24pUXRfU0dQcmVwYXJlLCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIEJvb2xlYW4gcHJlcGFyZUZvclByZXZpZXcsIEJvb2xlYW4gcHJlcGFyZUZvclJlY29yZCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dSZWxlYXNlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHUmVsZWFzZSwgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR0dldE1vdmllIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0TW92aWUsIDEsCi0JIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcykgLT4gKE1vdmllIF9ydikiKX0sCi0JeyJTR1NldE1heGltdW1SZWNvcmRUaW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0TWF4aW11bVJlY29yZFRpbWUsIDEsCi0JIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgdW5zaWduZWQgbG9uZyB0aWNrcykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dHZXRNYXhpbXVtUmVjb3JkVGltZSIsIChQeUNGdW5jdGlvbilRdF9TR0dldE1heGltdW1SZWNvcmRUaW1lLCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBsb25nIHRpY2tzKSIpfSwKLQl7IlNHR2V0U3RvcmFnZVNwYWNlUmVtYWluaW5nIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0U3RvcmFnZVNwYWNlUmVtYWluaW5nLCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBsb25nIGJ5dGVzKSIpfSwKLQl7IlNHR2V0VGltZVJlbWFpbmluZyIsIChQeUNGdW5jdGlvbilRdF9TR0dldFRpbWVSZW1haW5pbmcsIDEsCi0JIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgdGlja3NMZWZ0KSIpfSwKLQl7IlNHR3JhYlBpY3QiLCAoUHlDRnVuY3Rpb24pUXRfU0dHcmFiUGljdCwgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBSZWN0IGJvdW5kcywgc2hvcnQgb2Zmc2NyZWVuRGVwdGgsIGxvbmcgZ3JhYlBpY3RGbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFBpY0hhbmRsZSBwKSIpfSwKLQl7IlNHR2V0TGFzdE1vdmllUmVzSUQiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRMYXN0TW92aWVSZXNJRCwgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgc2hvcnQgcmVzSUQpIil9LAotCXsiU0dTZXRGbGFncyIsIChQeUNGdW5jdGlvbilRdF9TR1NldEZsYWdzLCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIGxvbmcgc2dGbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dHZXRGbGFncyIsIChQeUNGdW5jdGlvbilRdF9TR0dldEZsYWdzLCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIHNnRmxhZ3MpIil9LAotCXsiU0dOZXdDaGFubmVsRnJvbUNvbXBvbmVudCIsIChQeUNGdW5jdGlvbilRdF9TR05ld0NoYW5uZWxGcm9tQ29tcG9uZW50LCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIENvbXBvbmVudCBzZ0NoYW5uZWxDb21wb25lbnQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBTR0NoYW5uZWwgbmV3Q2hhbm5lbCkiKX0sCi0JeyJTR1NldFNldHRpbmdzIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0U2V0dGluZ3MsIDEsCi0JIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgVXNlckRhdGEgdWQsIGxvbmcgZmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNHR2V0U2V0dGluZ3MiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRTZXR0aW5ncywgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBsb25nIGZsYWdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgVXNlckRhdGEgdWQpIil9LAotCXsiU0dHZXRJbmRDaGFubmVsIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0SW5kQ2hhbm5lbCwgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBzaG9ydCBpbmRleCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFNHQ2hhbm5lbCByZWYsIE9TVHlwZSBjaGFuVHlwZSkiKX0sCi0JeyJTR1VwZGF0ZSIsIChQeUNGdW5jdGlvbilRdF9TR1VwZGF0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBSZ25IYW5kbGUgdXBkYXRlUmduKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR0dldFBhdXNlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0UGF1c2UsIDEsCi0JIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEJvb2xlYW4gcGF1c2VkKSIpfSwKLQl7IlNHU2V0Q2hhbm5lbFNldHRpbmdzIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0Q2hhbm5lbFNldHRpbmdzLCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIFNHQ2hhbm5lbCBjLCBVc2VyRGF0YSB1ZCwgbG9uZyBmbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dHZXRDaGFubmVsU2V0dGluZ3MiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRDaGFubmVsU2V0dGluZ3MsIDEsCi0JIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgU0dDaGFubmVsIGMsIGxvbmcgZmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBVc2VyRGF0YSB1ZCkiKX0sCi0JeyJTR0dldE1vZGUiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRNb2RlLCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBCb29sZWFuIHByZXZpZXdNb2RlLCBCb29sZWFuIHJlY29yZE1vZGUpIil9LAotCXsiU0dTZXREYXRhUmVmIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0RGF0YVJlZiwgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlLCBsb25nIHdoZXJlRmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNHR2V0RGF0YVJlZiIsIChQeUNGdW5jdGlvbilRdF9TR0dldERhdGFSZWYsIDEsCi0JIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEhhbmRsZSBkYXRhUmVmLCBPU1R5cGUgZGF0YVJlZlR5cGUsIGxvbmcgd2hlcmVGbGFncykiKX0sCi0JeyJTR05ld091dHB1dCIsIChQeUNGdW5jdGlvbilRdF9TR05ld091dHB1dCwgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlLCBsb25nIHdoZXJlRmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBTR091dHB1dCBzZ091dCkiKX0sCi0JeyJTR0Rpc3Bvc2VPdXRwdXQiLCAoUHlDRnVuY3Rpb24pUXRfU0dEaXNwb3NlT3V0cHV0LCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIFNHT3V0cHV0IHNnT3V0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR1NldE91dHB1dEZsYWdzIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0T3V0cHV0RmxhZ3MsIDEsCi0JIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgU0dPdXRwdXQgc2dPdXQsIGxvbmcgd2hlcmVGbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dTZXRDaGFubmVsT3V0cHV0IiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0Q2hhbm5lbE91dHB1dCwgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBTR0NoYW5uZWwgYywgU0dPdXRwdXQgc2dPdXQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNHR2V0RGF0YU91dHB1dFN0b3JhZ2VTcGFjZVJlbWFpbmluZyIsIChQeUNGdW5jdGlvbilRdF9TR0dldERhdGFPdXRwdXRTdG9yYWdlU3BhY2VSZW1haW5pbmcsIDEsCi0JIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgU0dPdXRwdXQgc2dPdXQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBsb25nIHNwYWNlKSIpfSwKLQl7IlNHSGFuZGxlVXBkYXRlRXZlbnQiLCAoUHlDRnVuY3Rpb24pUXRfU0dIYW5kbGVVcGRhdGVFdmVudCwgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBFdmVudFJlY29yZCBldmVudCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEJvb2xlYW4gaGFuZGxlZCkiKX0sCi0JeyJTR1NldE91dHB1dE5leHRPdXRwdXQiLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRPdXRwdXROZXh0T3V0cHV0LCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIFNHT3V0cHV0IHNnT3V0LCBTR091dHB1dCBuZXh0T3V0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR0dldE91dHB1dE5leHRPdXRwdXQiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRPdXRwdXROZXh0T3V0cHV0LCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIFNHT3V0cHV0IHNnT3V0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgU0dPdXRwdXQgbmV4dE91dCkiKX0sCi0JeyJTR1NldE91dHB1dE1heGltdW1PZmZzZXQiLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRPdXRwdXRNYXhpbXVtT2Zmc2V0LCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIFNHT3V0cHV0IHNnT3V0LCB3aWRlIG1heE9mZnNldCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dHZXRPdXRwdXRNYXhpbXVtT2Zmc2V0IiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0T3V0cHV0TWF4aW11bU9mZnNldCwgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBTR091dHB1dCBzZ091dCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHdpZGUgbWF4T2Zmc2V0KSIpfSwKLQl7IlNHR2V0T3V0cHV0RGF0YVJlZmVyZW5jZSIsIChQeUNGdW5jdGlvbilRdF9TR0dldE91dHB1dERhdGFSZWZlcmVuY2UsIDEsCi0JIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgU0dPdXRwdXQgc2dPdXQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlKSIpfSwKLQl7IlNHV3JpdGVFeHRlbmRlZE1vdmllRGF0YSIsIChQeUNGdW5jdGlvbilRdF9TR1dyaXRlRXh0ZW5kZWRNb3ZpZURhdGEsIDEsCi0JIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgU0dDaGFubmVsIGMsIFB0ciBwLCBsb25nIGxlbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHdpZGUgb2Zmc2V0LCBTR091dHB1dCBzZ091dCkiKX0sCi0JeyJTR0dldFN0b3JhZ2VTcGFjZVJlbWFpbmluZzY0IiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0U3RvcmFnZVNwYWNlUmVtYWluaW5nNjQsIDEsCi0JIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHdpZGUgYnl0ZXMpIil9LAotCXsiU0dHZXREYXRhT3V0cHV0U3RvcmFnZVNwYWNlUmVtYWluaW5nNjQiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXREYXRhT3V0cHV0U3RvcmFnZVNwYWNlUmVtYWluaW5nNjQsIDEsCi0JIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgU0dPdXRwdXQgc2dPdXQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB3aWRlIHNwYWNlKSIpfSwKLQl7IlNHV3JpdGVNb3ZpZURhdGEiLCAoUHlDRnVuY3Rpb24pUXRfU0dXcml0ZU1vdmllRGF0YSwgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBTR0NoYW5uZWwgYywgUHRyIHAsIGxvbmcgbGVuKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBvZmZzZXQpIil9LAotCXsiU0dHZXRUaW1lQmFzZSIsIChQeUNGdW5jdGlvbilRdF9TR0dldFRpbWVCYXNlLCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBUaW1lQmFzZSB0YikiKX0sCi0JeyJTR0FkZE1vdmllRGF0YSIsIChQeUNGdW5jdGlvbilRdF9TR0FkZE1vdmllRGF0YSwgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBTR0NoYW5uZWwgYywgUHRyIHAsIGxvbmcgbGVuLCBsb25nIGNoUmVmQ29uLCBUaW1lVmFsdWUgdGltZSwgc2hvcnQgd3JpdGVUeXBlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBvZmZzZXQpIil9LAotCXsiU0dDaGFuZ2VkU291cmNlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHQ2hhbmdlZFNvdXJjZSwgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dBZGRFeHRlbmRlZE1vdmllRGF0YSIsIChQeUNGdW5jdGlvbilRdF9TR0FkZEV4dGVuZGVkTW92aWVEYXRhLCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIFNHQ2hhbm5lbCBjLCBQdHIgcCwgbG9uZyBsZW4sIGxvbmcgY2hSZWZDb24sIFRpbWVWYWx1ZSB0aW1lLCBzaG9ydCB3cml0ZVR5cGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB3aWRlIG9mZnNldCwgU0dPdXRwdXQgd2hpY2hPdXRwdXQpIil9LAotCXsiU0dBZGRPdXRwdXREYXRhUmVmVG9NZWRpYSIsIChQeUNGdW5jdGlvbilRdF9TR0FkZE91dHB1dERhdGFSZWZUb01lZGlhLCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIFNHT3V0cHV0IHNnT3V0LCBNZWRpYSB0aGVNZWRpYSwgU2FtcGxlRGVzY3JpcHRpb25IYW5kbGUgZGVzYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dTZXRTZXR0aW5nc1N1bW1hcnkiLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRTZXR0aW5nc1N1bW1hcnksIDEsCi0JIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgSGFuZGxlIHN1bW1hcnlUZXh0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR1NldENoYW5uZWxVc2FnZSIsIChQeUNGdW5jdGlvbilRdF9TR1NldENoYW5uZWxVc2FnZSwgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIGxvbmcgdXNhZ2UpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNHR2V0Q2hhbm5lbFVzYWdlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0Q2hhbm5lbFVzYWdlLCAxLAotCSBQeURvY19TVFIoIihTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgdXNhZ2UpIil9LAotCXsiU0dTZXRDaGFubmVsQm91bmRzIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0Q2hhbm5lbEJvdW5kcywgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIFJlY3QgYm91bmRzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR0dldENoYW5uZWxCb3VuZHMiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRDaGFubmVsQm91bmRzLCAxLAotCSBQeURvY19TVFIoIihTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJlY3QgYm91bmRzKSIpfSwKLQl7IlNHU2V0Q2hhbm5lbFZvbHVtZSIsIChQeUNGdW5jdGlvbilRdF9TR1NldENoYW5uZWxWb2x1bWUsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBzaG9ydCB2b2x1bWUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNHR2V0Q2hhbm5lbFZvbHVtZSIsIChQeUNGdW5jdGlvbilRdF9TR0dldENoYW5uZWxWb2x1bWUsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgc2hvcnQgdm9sdW1lKSIpfSwKLQl7IlNHR2V0Q2hhbm5lbEluZm8iLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRDaGFubmVsSW5mbywgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIGNoYW5uZWxJbmZvKSIpfSwKLQl7IlNHU2V0Q2hhbm5lbFBsYXlGbGFncyIsIChQeUNGdW5jdGlvbilRdF9TR1NldENoYW5uZWxQbGF5RmxhZ3MsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBsb25nIHBsYXlGbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dHZXRDaGFubmVsUGxheUZsYWdzIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0Q2hhbm5lbFBsYXlGbGFncywgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIHBsYXlGbGFncykiKX0sCi0JeyJTR1NldENoYW5uZWxNYXhGcmFtZXMiLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRDaGFubmVsTWF4RnJhbWVzLCAxLAotCSBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgbG9uZyBmcmFtZUNvdW50KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR0dldENoYW5uZWxNYXhGcmFtZXMiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRDaGFubmVsTWF4RnJhbWVzLCAxLAotCSBQeURvY19TVFIoIihTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgZnJhbWVDb3VudCkiKX0sCi0JeyJTR1NldENoYW5uZWxSZWZDb24iLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRDaGFubmVsUmVmQ29uLCAxLAotCSBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgbG9uZyByZWZDb24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNHU2V0Q2hhbm5lbENsaXAiLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRDaGFubmVsQ2xpcCwgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIFJnbkhhbmRsZSB0aGVDbGlwKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR0dldENoYW5uZWxDbGlwIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0Q2hhbm5lbENsaXAsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmduSGFuZGxlIHRoZUNsaXApIil9LAotCXsiU0dHZXRDaGFubmVsU2FtcGxlRGVzY3JpcHRpb24iLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRDaGFubmVsU2FtcGxlRGVzY3JpcHRpb24sIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBIYW5kbGUgc2FtcGxlRGVzYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dTZXRDaGFubmVsRGV2aWNlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0Q2hhbm5lbERldmljZSwgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIFN0cmluZ1B0ciBuYW1lKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR0dldENoYW5uZWxUaW1lU2NhbGUiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRDaGFubmVsVGltZVNjYWxlLCAxLAotCSBQeURvY19TVFIoIihTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFRpbWVTY2FsZSBzY2FsZSkiKX0sCi0JeyJTR0NoYW5uZWxQdXRQaWN0dXJlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHQ2hhbm5lbFB1dFBpY3R1cmUsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR0NoYW5uZWxTZXRSZXF1ZXN0ZWREYXRhUmF0ZSIsIChQeUNGdW5jdGlvbilRdF9TR0NoYW5uZWxTZXRSZXF1ZXN0ZWREYXRhUmF0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIGxvbmcgYnl0ZXNQZXJTZWNvbmQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNHQ2hhbm5lbEdldFJlcXVlc3RlZERhdGFSYXRlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHQ2hhbm5lbEdldFJlcXVlc3RlZERhdGFSYXRlLCAxLAotCSBQeURvY19TVFIoIihTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgYnl0ZXNQZXJTZWNvbmQpIil9LAotCXsiU0dDaGFubmVsU2V0RGF0YVNvdXJjZU5hbWUiLCAoUHlDRnVuY3Rpb24pUXRfU0dDaGFubmVsU2V0RGF0YVNvdXJjZU5hbWUsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBTdHIyNTUgbmFtZSwgU2NyaXB0Q29kZSBzY3JpcHRUYWcpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNHQ2hhbm5lbEdldERhdGFTb3VyY2VOYW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHQ2hhbm5lbEdldERhdGFTb3VyY2VOYW1lLCAxLAotCSBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgU3RyMjU1IG5hbWUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBTY3JpcHRDb2RlIHNjcmlwdFRhZykiKX0sCi0JeyJTR0NoYW5uZWxTZXRDb2RlY1NldHRpbmdzIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHQ2hhbm5lbFNldENvZGVjU2V0dGluZ3MsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBIYW5kbGUgc2V0dGluZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNHQ2hhbm5lbEdldENvZGVjU2V0dGluZ3MiLCAoUHlDRnVuY3Rpb24pUXRfU0dDaGFubmVsR2V0Q29kZWNTZXR0aW5ncywgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBIYW5kbGUgc2V0dGluZ3MpIil9LAotCXsiU0dHZXRDaGFubmVsVGltZUJhc2UiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRDaGFubmVsVGltZUJhc2UsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgVGltZUJhc2UgdGIpIil9LAotCXsiU0dHZXRDaGFubmVsUmVmQ29uIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0Q2hhbm5lbFJlZkNvbiwgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIHJlZkNvbikiKX0sCi0JeyJTR0dldENoYW5uZWxEZXZpY2VBbmRJbnB1dE5hbWVzIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0Q2hhbm5lbERldmljZUFuZElucHV0TmFtZXMsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBTdHIyNTUgb3V0RGV2aWNlTmFtZSwgU3RyMjU1IG91dElucHV0TmFtZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHNob3J0IG91dElucHV0TnVtYmVyKSIpfSwKLQl7IlNHU2V0Q2hhbm5lbERldmljZUlucHV0IiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0Q2hhbm5lbERldmljZUlucHV0LCAxLAotCSBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgc2hvcnQgaW5JbnB1dE51bWJlcikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dTZXRDaGFubmVsU2V0dGluZ3NTdGF0ZUNoYW5naW5nIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0Q2hhbm5lbFNldHRpbmdzU3RhdGVDaGFuZ2luZywgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIFVJbnQzMiBpbkZsYWdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR0luaXRDaGFubmVsIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHSW5pdENoYW5uZWwsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBTZXFHcmFiQ29tcG9uZW50IG93bmVyKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR1dyaXRlU2FtcGxlcyIsIChQeUNGdW5jdGlvbilRdF9TR1dyaXRlU2FtcGxlcywgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIE1vdmllIG0sIEFsaWFzSGFuZGxlIHRoZUZpbGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNHR2V0RGF0YVJhdGUiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXREYXRhUmF0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIGJ5dGVzUGVyU2Vjb25kKSIpfSwKLQl7IlNHQWxpZ25DaGFubmVsUmVjdCIsIChQeUNGdW5jdGlvbilRdF9TR0FsaWduQ2hhbm5lbFJlY3QsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmVjdCByKSIpfSwKLQl7IlNHUGFuZWxHZXREaXRsIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHUGFuZWxHZXREaXRsLCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBIYW5kbGUgZGl0bCkiKX0sCi0JeyJTR1BhbmVsR2V0VGl0bGUiLCAoUHlDRnVuY3Rpb24pUXRfU0dQYW5lbEdldFRpdGxlLCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIFN0cjI1NSB0aXRsZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dQYW5lbENhblJ1biIsIChQeUNGdW5jdGlvbilRdF9TR1BhbmVsQ2FuUnVuLCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR1BhbmVsSW5zdGFsbCIsIChQeUNGdW5jdGlvbilRdF9TR1BhbmVsSW5zdGFsbCwgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBTR0NoYW5uZWwgYywgRGlhbG9nUHRyIGQsIHNob3J0IGl0ZW1PZmZzZXQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNHUGFuZWxFdmVudCIsIChQeUNGdW5jdGlvbilRdF9TR1BhbmVsRXZlbnQsIDEsCi0JIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgU0dDaGFubmVsIGMsIERpYWxvZ1B0ciBkLCBzaG9ydCBpdGVtT2Zmc2V0LCBFdmVudFJlY29yZCB0aGVFdmVudCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHNob3J0IGl0ZW1IaXQsIEJvb2xlYW4gaGFuZGxlZCkiKX0sCi0JeyJTR1BhbmVsSXRlbSIsIChQeUNGdW5jdGlvbilRdF9TR1BhbmVsSXRlbSwgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBTR0NoYW5uZWwgYywgRGlhbG9nUHRyIGQsIHNob3J0IGl0ZW1PZmZzZXQsIHNob3J0IGl0ZW1OdW0pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNHUGFuZWxSZW1vdmUiLCAoUHlDRnVuY3Rpb24pUXRfU0dQYW5lbFJlbW92ZSwgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBTR0NoYW5uZWwgYywgRGlhbG9nUHRyIGQsIHNob3J0IGl0ZW1PZmZzZXQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNHUGFuZWxTZXRHcmFiYmVyIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHUGFuZWxTZXRHcmFiYmVyLCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIFNlcUdyYWJDb21wb25lbnQgc2cpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNHUGFuZWxTZXRSZXNGaWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHUGFuZWxTZXRSZXNGaWxlLCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIHNob3J0IHJlc1JlZikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dQYW5lbEdldFNldHRpbmdzIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHUGFuZWxHZXRTZXR0aW5ncywgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBTR0NoYW5uZWwgYywgbG9uZyBmbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFVzZXJEYXRhIHVkKSIpfSwKLQl7IlNHUGFuZWxTZXRTZXR0aW5ncyIsIChQeUNGdW5jdGlvbilRdF9TR1BhbmVsU2V0U2V0dGluZ3MsIDEsCi0JIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgU0dDaGFubmVsIGMsIFVzZXJEYXRhIHVkLCBsb25nIGZsYWdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR1BhbmVsVmFsaWRhdGVJbnB1dCIsIChQeUNGdW5jdGlvbilRdF9TR1BhbmVsVmFsaWRhdGVJbnB1dCwgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQm9vbGVhbiBvaykiKX0sCi0JeyJTR1BhbmVsR2V0RElUTEZvclNpemUiLCAoUHlDRnVuY3Rpb24pUXRfU0dQYW5lbEdldERJVExGb3JTaXplLCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBIYW5kbGUgZGl0bCwgUG9pbnQgcmVxdWVzdGVkU2l6ZSkiKX0sCi0JeyJTR0dldFNyY1ZpZGVvQm91bmRzIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0U3JjVmlkZW9Cb3VuZHMsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmVjdCByKSIpfSwKLQl7IlNHU2V0VmlkZW9SZWN0IiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0VmlkZW9SZWN0LCAxLAotCSBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgUmVjdCByKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR0dldFZpZGVvUmVjdCIsIChQeUNGdW5jdGlvbilRdF9TR0dldFZpZGVvUmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSZWN0IHIpIil9LAotCXsiU0dHZXRWaWRlb0NvbXByZXNzb3JUeXBlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0VmlkZW9Db21wcmVzc29yVHlwZSwgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBPU1R5cGUgY29tcHJlc3NvclR5cGUpIil9LAotCXsiU0dTZXRWaWRlb0NvbXByZXNzb3JUeXBlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0VmlkZW9Db21wcmVzc29yVHlwZSwgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIE9TVHlwZSBjb21wcmVzc29yVHlwZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dTZXRWaWRlb0NvbXByZXNzb3IiLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRWaWRlb0NvbXByZXNzb3IsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBzaG9ydCBkZXB0aCwgQ29tcHJlc3NvckNvbXBvbmVudCBjb21wcmVzc29yLCBDb2RlY1Egc3BhdGlhbFF1YWxpdHksIENvZGVjUSB0ZW1wb3JhbFF1YWxpdHksIGxvbmcga2V5RnJhbWVSYXRlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR0dldFZpZGVvQ29tcHJlc3NvciIsIChQeUNGdW5jdGlvbilRdF9TR0dldFZpZGVvQ29tcHJlc3NvciwgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBzaG9ydCBkZXB0aCwgQ29tcHJlc3NvckNvbXBvbmVudCBjb21wcmVzc29yLCBDb2RlY1Egc3BhdGlhbFF1YWxpdHksIENvZGVjUSB0ZW1wb3JhbFF1YWxpdHksIGxvbmcga2V5RnJhbWVSYXRlKSIpfSwKLQl7IlNHR2V0VmlkZW9EaWdpdGl6ZXJDb21wb25lbnQiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRWaWRlb0RpZ2l0aXplckNvbXBvbmVudCwgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMpIC0+IChDb21wb25lbnRJbnN0YW5jZSBfcnYpIil9LAotCXsiU0dTZXRWaWRlb0RpZ2l0aXplckNvbXBvbmVudCIsIChQeUNGdW5jdGlvbilRdF9TR1NldFZpZGVvRGlnaXRpemVyQ29tcG9uZW50LCAxLAotCSBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgQ29tcG9uZW50SW5zdGFuY2UgdmRpZykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dWaWRlb0RpZ2l0aXplckNoYW5nZWQiLCAoUHlDRnVuY3Rpb24pUXRfU0dWaWRlb0RpZ2l0aXplckNoYW5nZWQsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR0dyYWJGcmFtZSIsIChQeUNGdW5jdGlvbilRdF9TR0dyYWJGcmFtZSwgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIHNob3J0IGJ1ZmZlck51bSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dHcmFiRnJhbWVDb21wbGV0ZSIsIChQeUNGdW5jdGlvbilRdF9TR0dyYWJGcmFtZUNvbXBsZXRlLCAxLAotCSBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgc2hvcnQgYnVmZmVyTnVtKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQm9vbGVhbiBkb25lKSIpfSwKLQl7IlNHQ29tcHJlc3NGcmFtZSIsIChQeUNGdW5jdGlvbilRdF9TR0NvbXByZXNzRnJhbWUsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBzaG9ydCBidWZmZXJOdW0pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNHU2V0Q29tcHJlc3NCdWZmZXIiLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRDb21wcmVzc0J1ZmZlciwgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIHNob3J0IGRlcHRoLCBSZWN0IGNvbXByZXNzU2l6ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dHZXRDb21wcmVzc0J1ZmZlciIsIChQeUNGdW5jdGlvbilRdF9TR0dldENvbXByZXNzQnVmZmVyLCAxLAotCSBQeURvY19TVFIoIihTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHNob3J0IGRlcHRoLCBSZWN0IGNvbXByZXNzU2l6ZSkiKX0sCi0JeyJTR0dldEJ1ZmZlckluZm8iLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRCdWZmZXJJbmZvLCAxLAotCSBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgc2hvcnQgYnVmZmVyTnVtKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUGl4TWFwSGFuZGxlIGJ1ZmZlclBNLCBSZWN0IGJ1ZmZlclJlY3QsIEdXb3JsZFB0ciBjb21wcmVzc0J1ZmZlciwgUmVjdCBjb21wcmVzc0J1ZmZlclJlY3QpIil9LAotCXsiU0dTZXRVc2VTY3JlZW5CdWZmZXIiLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRVc2VTY3JlZW5CdWZmZXIsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBCb29sZWFuIHVzZVNjcmVlbkJ1ZmZlcikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dHZXRVc2VTY3JlZW5CdWZmZXIiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRVc2VTY3JlZW5CdWZmZXIsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQm9vbGVhbiB1c2VTY3JlZW5CdWZmZXIpIil9LAotCXsiU0dTZXRGcmFtZVJhdGUiLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRGcmFtZVJhdGUsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBGaXhlZCBmcmFtZVJhdGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNHR2V0RnJhbWVSYXRlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0RnJhbWVSYXRlLCAxLAotCSBQeURvY19TVFIoIihTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEZpeGVkIGZyYW1lUmF0ZSkiKX0sCi0JeyJTR1NldFByZWZlcnJlZFBhY2tldFNpemUiLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRQcmVmZXJyZWRQYWNrZXRTaXplLCAxLAotCSBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgbG9uZyBwcmVmZXJyZWRQYWNrZXRTaXplSW5CeXRlcykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dHZXRQcmVmZXJyZWRQYWNrZXRTaXplIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0UHJlZmVycmVkUGFja2V0U2l6ZSwgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIHByZWZlcnJlZFBhY2tldFNpemVJbkJ5dGVzKSIpfSwKLQl7IlNHU2V0VXNlclZpZGVvQ29tcHJlc3Nvckxpc3QiLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRVc2VyVmlkZW9Db21wcmVzc29yTGlzdCwgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIEhhbmRsZSBjb21wcmVzc29yVHlwZXMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNHR2V0VXNlclZpZGVvQ29tcHJlc3Nvckxpc3QiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRVc2VyVmlkZW9Db21wcmVzc29yTGlzdCwgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBIYW5kbGUgY29tcHJlc3NvclR5cGVzKSIpfSwKLQl7IlNHU2V0U291bmRJbnB1dERyaXZlciIsIChQeUNGdW5jdGlvbilRdF9TR1NldFNvdW5kSW5wdXREcml2ZXIsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBTdHIyNTUgZHJpdmVyTmFtZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dHZXRTb3VuZElucHV0RHJpdmVyIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0U291bmRJbnB1dERyaXZlciwgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMpIC0+IChsb25nIF9ydikiKX0sCi0JeyJTR1NvdW5kSW5wdXREcml2ZXJDaGFuZ2VkIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU291bmRJbnB1dERyaXZlckNoYW5nZWQsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR1NldFNvdW5kUmVjb3JkQ2h1bmtTaXplIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0U291bmRSZWNvcmRDaHVua1NpemUsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBsb25nIHNlY29uZHMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNHR2V0U291bmRSZWNvcmRDaHVua1NpemUiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRTb3VuZFJlY29yZENodW5rU2l6ZSwgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMpIC0+IChsb25nIF9ydikiKX0sCi0JeyJTR1NldFNvdW5kSW5wdXRSYXRlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0U291bmRJbnB1dFJhdGUsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBGaXhlZCByYXRlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR0dldFNvdW5kSW5wdXRSYXRlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0U291bmRJbnB1dFJhdGUsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoRml4ZWQgX3J2KSIpfSwKLQl7IlNHU2V0U291bmRJbnB1dFBhcmFtZXRlcnMiLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRTb3VuZElucHV0UGFyYW1ldGVycywgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIHNob3J0IHNhbXBsZVNpemUsIHNob3J0IG51bUNoYW5uZWxzLCBPU1R5cGUgY29tcHJlc3Npb25UeXBlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR0dldFNvdW5kSW5wdXRQYXJhbWV0ZXJzIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0U291bmRJbnB1dFBhcmFtZXRlcnMsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgc2hvcnQgc2FtcGxlU2l6ZSwgc2hvcnQgbnVtQ2hhbm5lbHMsIE9TVHlwZSBjb21wcmVzc2lvblR5cGUpIil9LAotCXsiU0dTZXRBZGRpdGlvbmFsU291bmRSYXRlcyIsIChQeUNGdW5jdGlvbilRdF9TR1NldEFkZGl0aW9uYWxTb3VuZFJhdGVzLCAxLAotCSBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgSGFuZGxlIHJhdGVzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR0dldEFkZGl0aW9uYWxTb3VuZFJhdGVzIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0QWRkaXRpb25hbFNvdW5kUmF0ZXMsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSGFuZGxlIHJhdGVzKSIpfSwKLQl7IlNHU2V0Rm9udE5hbWUiLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRGb250TmFtZSwgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIFN0cmluZ1B0ciBwc3RyKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR1NldEZvbnRTaXplIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0Rm9udFNpemUsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBzaG9ydCBmb250U2l6ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dTZXRUZXh0Rm9yZUNvbG9yIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0VGV4dEZvcmVDb2xvciwgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSR0JDb2xvciB0aGVDb2xvcikiKX0sCi0JeyJTR1NldFRleHRCYWNrQ29sb3IiLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRUZXh0QmFja0NvbG9yLCAxLAotCSBQeURvY19TVFIoIihTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJHQkNvbG9yIHRoZUNvbG9yKSIpfSwKLQl7IlNHU2V0SnVzdGlmaWNhdGlvbiIsIChQeUNGdW5jdGlvbilRdF9TR1NldEp1c3RpZmljYXRpb24sIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBzaG9ydCBqdXN0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR0dldFRleHRSZXR1cm5Ub1NwYWNlVmFsdWUiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRUZXh0UmV0dXJuVG9TcGFjZVZhbHVlLCAxLAotCSBQeURvY19TVFIoIihTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHNob3J0IHJldHRvc3BhY2UpIil9LAotCXsiU0dTZXRUZXh0UmV0dXJuVG9TcGFjZVZhbHVlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0VGV4dFJldHVyblRvU3BhY2VWYWx1ZSwgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIHNob3J0IHJldHRvc3BhY2UpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlFUVmlkZW9PdXRwdXRHZXRDdXJyZW50Q2xpZW50TmFtZSIsIChQeUNGdW5jdGlvbilRdF9RVFZpZGVvT3V0cHV0R2V0Q3VycmVudENsaWVudE5hbWUsIDEsCi0JIFB5RG9jX1NUUigiKFFUVmlkZW9PdXRwdXRDb21wb25lbnQgdm8sIFN0cjI1NSBzdHIpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlFUVmlkZW9PdXRwdXRTZXRDbGllbnROYW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X1FUVmlkZW9PdXRwdXRTZXRDbGllbnROYW1lLCAxLAotCSBQeURvY19TVFIoIihRVFZpZGVvT3V0cHV0Q29tcG9uZW50IHZvLCBTdHIyNTUgc3RyKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJRVFZpZGVvT3V0cHV0R2V0Q2xpZW50TmFtZSIsIChQeUNGdW5jdGlvbilRdF9RVFZpZGVvT3V0cHV0R2V0Q2xpZW50TmFtZSwgMSwKLQkgUHlEb2NfU1RSKCIoUVRWaWRlb091dHB1dENvbXBvbmVudCB2bywgU3RyMjU1IHN0cikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiUVRWaWRlb091dHB1dEJlZ2luIiwgKFB5Q0Z1bmN0aW9uKVF0X1FUVmlkZW9PdXRwdXRCZWdpbiwgMSwKLQkgUHlEb2NfU1RSKCIoUVRWaWRlb091dHB1dENvbXBvbmVudCB2bykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiUVRWaWRlb091dHB1dEVuZCIsIChQeUNGdW5jdGlvbilRdF9RVFZpZGVvT3V0cHV0RW5kLCAxLAotCSBQeURvY19TVFIoIihRVFZpZGVvT3V0cHV0Q29tcG9uZW50IHZvKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJRVFZpZGVvT3V0cHV0U2V0RGlzcGxheU1vZGUiLCAoUHlDRnVuY3Rpb24pUXRfUVRWaWRlb091dHB1dFNldERpc3BsYXlNb2RlLCAxLAotCSBQeURvY19TVFIoIihRVFZpZGVvT3V0cHV0Q29tcG9uZW50IHZvLCBsb25nIGRpc3BsYXlNb2RlSUQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlFUVmlkZW9PdXRwdXRHZXREaXNwbGF5TW9kZSIsIChQeUNGdW5jdGlvbilRdF9RVFZpZGVvT3V0cHV0R2V0RGlzcGxheU1vZGUsIDEsCi0JIFB5RG9jX1NUUigiKFFUVmlkZW9PdXRwdXRDb21wb25lbnQgdm8pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIGRpc3BsYXlNb2RlSUQpIil9LAotCXsiUVRWaWRlb091dHB1dEdldEdXb3JsZCIsIChQeUNGdW5jdGlvbilRdF9RVFZpZGVvT3V0cHV0R2V0R1dvcmxkLCAxLAotCSBQeURvY19TVFIoIihRVFZpZGVvT3V0cHV0Q29tcG9uZW50IHZvKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgR1dvcmxkUHRyIGd3KSIpfSwKLQl7IlFUVmlkZW9PdXRwdXRHZXRJbmRTb3VuZE91dHB1dCIsIChQeUNGdW5jdGlvbilRdF9RVFZpZGVvT3V0cHV0R2V0SW5kU291bmRPdXRwdXQsIDEsCi0JIFB5RG9jX1NUUigiKFFUVmlkZW9PdXRwdXRDb21wb25lbnQgdm8sIGxvbmcgaW5kZXgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBDb21wb25lbnQgb3V0cHV0Q29tcG9uZW50KSIpfSwKLQl7IlFUVmlkZW9PdXRwdXRHZXRDbG9jayIsIChQeUNGdW5jdGlvbilRdF9RVFZpZGVvT3V0cHV0R2V0Q2xvY2ssIDEsCi0JIFB5RG9jX1NUUigiKFFUVmlkZW9PdXRwdXRDb21wb25lbnQgdm8pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBDb21wb25lbnRJbnN0YW5jZSBjbG9jaykiKX0sCi0JeyJRVFZpZGVvT3V0cHV0U2V0RWNob1BvcnQiLCAoUHlDRnVuY3Rpb24pUXRfUVRWaWRlb091dHB1dFNldEVjaG9Qb3J0LCAxLAotCSBQeURvY19TVFIoIihRVFZpZGVvT3V0cHV0Q29tcG9uZW50IHZvLCBDR3JhZlB0ciBlY2hvUG9ydCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiUVRWaWRlb091dHB1dEdldEluZEltYWdlRGVjb21wcmVzc29yIiwgKFB5Q0Z1bmN0aW9uKVF0X1FUVmlkZW9PdXRwdXRHZXRJbmRJbWFnZURlY29tcHJlc3NvciwgMSwKLQkgUHlEb2NfU1RSKCIoUVRWaWRlb091dHB1dENvbXBvbmVudCB2bywgbG9uZyBpbmRleCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIENvbXBvbmVudCBjb2RlYykiKX0sCi0JeyJRVFZpZGVvT3V0cHV0QmFzZVNldEVjaG9Qb3J0IiwgKFB5Q0Z1bmN0aW9uKVF0X1FUVmlkZW9PdXRwdXRCYXNlU2V0RWNob1BvcnQsIDEsCi0JIFB5RG9jX1NUUigiKFFUVmlkZW9PdXRwdXRDb21wb25lbnQgdm8sIENHcmFmUHRyIGVjaG9Qb3J0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNZWRpYVNldENodW5rTWFuYWdlbWVudEZsYWdzIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhU2V0Q2h1bmtNYW5hZ2VtZW50RmxhZ3MsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgVUludDMyIGZsYWdzLCBVSW50MzIgZmxhZ3NNYXNrKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNZWRpYUdldENodW5rTWFuYWdlbWVudEZsYWdzIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhR2V0Q2h1bmtNYW5hZ2VtZW50RmxhZ3MsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFVJbnQzMiBmbGFncykiKX0sCi0JeyJNZWRpYVNldFB1cmdlYWJsZUNodW5rTWVtb3J5QWxsb3dhbmNlIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhU2V0UHVyZ2VhYmxlQ2h1bmtNZW1vcnlBbGxvd2FuY2UsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgU2l6ZSBhbGxvd2FuY2UpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1lZGlhR2V0UHVyZ2VhYmxlQ2h1bmtNZW1vcnlBbGxvd2FuY2UiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFHZXRQdXJnZWFibGVDaHVua01lbW9yeUFsbG93YW5jZSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgU2l6ZSBhbGxvd2FuY2UpIil9LAotCXsiTWVkaWFFbXB0eUFsbFB1cmdlYWJsZUNodW5rcyIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUVtcHR5QWxsUHVyZ2VhYmxlQ2h1bmtzLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1lZGlhU2V0SGFuZGxlckNhcGFiaWxpdGllcyIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVNldEhhbmRsZXJDYXBhYmlsaXRpZXMsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgbG9uZyBmbGFncywgbG9uZyBmbGFnc01hc2spIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1lZGlhSWRsZSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUlkbGUsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgVGltZVZhbHVlIGF0TWVkaWFUaW1lLCBsb25nIGZsYWdzSW4sIFRpbWVSZWNvcmQgbW92aWVUaW1lKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBmbGFnc091dCkiKX0sCi0JeyJNZWRpYUdldE1lZGlhSW5mbyIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUdldE1lZGlhSW5mbywgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBIYW5kbGUgaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTWVkaWFQdXRNZWRpYUluZm8iLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFQdXRNZWRpYUluZm8sIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgSGFuZGxlIGgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1lZGlhU2V0QWN0aXZlIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhU2V0QWN0aXZlLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIEJvb2xlYW4gZW5hYmxlTWVkaWEpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1lZGlhU2V0UmF0ZSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVNldFJhdGUsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgRml4ZWQgcmF0ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTWVkaWFHR2V0U3RhdHVzIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhR0dldFN0YXR1cywgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQ29tcG9uZW50UmVzdWx0IHN0YXR1c0VycikiKX0sCi0JeyJNZWRpYVRyYWNrRWRpdGVkIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhVHJhY2tFZGl0ZWQsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTWVkaWFTZXRNZWRpYVRpbWVTY2FsZSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVNldE1lZGlhVGltZVNjYWxlLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFRpbWVTY2FsZSBuZXdUaW1lU2NhbGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1lZGlhU2V0TW92aWVUaW1lU2NhbGUiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFTZXRNb3ZpZVRpbWVTY2FsZSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBUaW1lU2NhbGUgbmV3VGltZVNjYWxlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNZWRpYVNldEdXb3JsZCIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVNldEdXb3JsZCwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBDR3JhZlB0ciBhUG9ydCwgR0RIYW5kbGUgYUdEKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNZWRpYVNldERpbWVuc2lvbnMiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFTZXREaW1lbnNpb25zLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIEZpeGVkIHdpZHRoLCBGaXhlZCBoZWlnaHQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1lZGlhU2V0Q2xpcCIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVNldENsaXAsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgUmduSGFuZGxlIHRoZUNsaXApIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1lZGlhR2V0VHJhY2tPcGFxdWUiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFHZXRUcmFja09wYXF1ZSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQm9vbGVhbiB0cmFja0lzT3BhcXVlKSIpfSwKLQl7Ik1lZGlhU2V0R3JhcGhpY3NNb2RlIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhU2V0R3JhcGhpY3NNb2RlLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIGxvbmcgbW9kZSwgUkdCQ29sb3Igb3BDb2xvcikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTWVkaWFHZXRHcmFwaGljc01vZGUiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFHZXRHcmFwaGljc01vZGUsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgbW9kZSwgUkdCQ29sb3Igb3BDb2xvcikiKX0sCi0JeyJNZWRpYUdTZXRWb2x1bWUiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFHU2V0Vm9sdW1lLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIHNob3J0IHZvbHVtZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTWVkaWFTZXRTb3VuZEJhbGFuY2UiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFTZXRTb3VuZEJhbGFuY2UsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgc2hvcnQgYmFsYW5jZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTWVkaWFHZXRTb3VuZEJhbGFuY2UiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFHZXRTb3VuZEJhbGFuY2UsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHNob3J0IGJhbGFuY2UpIil9LAotCXsiTWVkaWFHZXROZXh0Qm91bmRzQ2hhbmdlIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhR2V0TmV4dEJvdW5kc0NoYW5nZSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgVGltZVZhbHVlIHdoZW4pIil9LAotCXsiTWVkaWFHZXRTcmNSZ24iLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFHZXRTcmNSZ24sIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgUmduSGFuZGxlIHJnbiwgVGltZVZhbHVlIGF0TWVkaWFUaW1lKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNZWRpYVByZXJvbGwiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFQcmVyb2xsLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFRpbWVWYWx1ZSB0aW1lLCBGaXhlZCByYXRlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNZWRpYVNhbXBsZURlc2NyaXB0aW9uQ2hhbmdlZCIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVNhbXBsZURlc2NyaXB0aW9uQ2hhbmdlZCwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBsb25nIGluZGV4KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNZWRpYUhhc0NoYXJhY3RlcmlzdGljIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhSGFzQ2hhcmFjdGVyaXN0aWMsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgT1NUeXBlIGNoYXJhY3RlcmlzdGljKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQm9vbGVhbiBoYXNJdCkiKX0sCi0JeyJNZWRpYUdldE9mZnNjcmVlbkJ1ZmZlclNpemUiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFHZXRPZmZzY3JlZW5CdWZmZXJTaXplLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIHNob3J0IGRlcHRoLCBDVGFiSGFuZGxlIGN0YWIpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSZWN0IGJvdW5kcykiKX0sCi0JeyJNZWRpYVNldEhpbnRzIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhU2V0SGludHMsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgbG9uZyBoaW50cykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTWVkaWFHZXROYW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhR2V0TmFtZSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBTdHIyNTUgbmFtZSwgbG9uZyByZXF1ZXN0ZWRMYW5ndWFnZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgYWN0dWFsTGFuZ3VhZ2UpIil9LAotCXsiTWVkaWFGb3JjZVVwZGF0ZSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUZvcmNlVXBkYXRlLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIGxvbmcgZm9yY2VVcGRhdGVGbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTWVkaWFHZXREcmF3aW5nUmduIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhR2V0RHJhd2luZ1JnbiwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmduSGFuZGxlIHBhcnRpYWxSZ24pIil9LAotCXsiTWVkaWFHU2V0QWN0aXZlU2VnbWVudCIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUdTZXRBY3RpdmVTZWdtZW50LCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFRpbWVWYWx1ZSBhY3RpdmVTdGFydCwgVGltZVZhbHVlIGFjdGl2ZUR1cmF0aW9uKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNZWRpYUludmFsaWRhdGVSZWdpb24iLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFJbnZhbGlkYXRlUmVnaW9uLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFJnbkhhbmRsZSBpbnZhbFJnbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTWVkaWFHZXROZXh0U3RlcFRpbWUiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFHZXROZXh0U3RlcFRpbWUsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgc2hvcnQgZmxhZ3MsIFRpbWVWYWx1ZSBtZWRpYVRpbWVJbiwgRml4ZWQgcmF0ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFRpbWVWYWx1ZSBtZWRpYVRpbWVPdXQpIil9LAotCXsiTWVkaWFDaGFuZ2VkTm9uUHJpbWFyeVNvdXJjZSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUNoYW5nZWROb25QcmltYXJ5U291cmNlLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIGxvbmcgaW5wdXRJbmRleCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTWVkaWFUcmFja1JlZmVyZW5jZXNDaGFuZ2VkIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhVHJhY2tSZWZlcmVuY2VzQ2hhbmdlZCwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNZWRpYVJlbGVhc2VTYW1wbGVEYXRhUG9pbnRlciIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVJlbGVhc2VTYW1wbGVEYXRhUG9pbnRlciwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBsb25nIHNhbXBsZU51bSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTWVkaWFUcmFja1Byb3BlcnR5QXRvbUNoYW5nZWQiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFUcmFja1Byb3BlcnR5QXRvbUNoYW5nZWQsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTWVkaWFTZXRWaWRlb1BhcmFtIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhU2V0VmlkZW9QYXJhbSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBsb25nIHdoaWNoUGFyYW0pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBzaG9ydCB2YWx1ZSkiKX0sCi0JeyJNZWRpYUdldFZpZGVvUGFyYW0iLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFHZXRWaWRlb1BhcmFtLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIGxvbmcgd2hpY2hQYXJhbSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHVuc2lnbmVkIHNob3J0IHZhbHVlKSIpfSwKLQl7Ik1lZGlhQ29tcGFyZSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUNvbXBhcmUsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgTWVkaWEgc3JjTWVkaWEsIENvbXBvbmVudEluc3RhbmNlIHNyY01lZGlhQ29tcG9uZW50KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQm9vbGVhbiBpc09LKSIpfSwKLQl7Ik1lZGlhR2V0Q2xvY2siLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFHZXRDbG9jaywgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQ29tcG9uZW50SW5zdGFuY2UgY2xvY2spIil9LAotCXsiTWVkaWFTZXRTb3VuZE91dHB1dENvbXBvbmVudCIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVNldFNvdW5kT3V0cHV0Q29tcG9uZW50LCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIENvbXBvbmVudCBvdXRwdXRDb21wb25lbnQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1lZGlhR2V0U291bmRPdXRwdXRDb21wb25lbnQiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFHZXRTb3VuZE91dHB1dENvbXBvbmVudCwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQ29tcG9uZW50IG91dHB1dENvbXBvbmVudCkiKX0sCi0JeyJNZWRpYVNldFNvdW5kTG9jYWxpemF0aW9uRGF0YSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVNldFNvdW5kTG9jYWxpemF0aW9uRGF0YSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBIYW5kbGUgZGF0YSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTWVkaWFHZXRJbnZhbGlkUmVnaW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhR2V0SW52YWxpZFJlZ2lvbiwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBSZ25IYW5kbGUgcmduKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNZWRpYVNhbXBsZURlc2NyaXB0aW9uQjJOIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhU2FtcGxlRGVzY3JpcHRpb25CMk4sIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgU2FtcGxlRGVzY3JpcHRpb25IYW5kbGUgc2FtcGxlRGVzY3JpcHRpb25IKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNZWRpYVNhbXBsZURlc2NyaXB0aW9uTjJCIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhU2FtcGxlRGVzY3JpcHRpb25OMkIsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgU2FtcGxlRGVzY3JpcHRpb25IYW5kbGUgc2FtcGxlRGVzY3JpcHRpb25IKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNZWRpYUZsdXNoTm9uUHJpbWFyeVNvdXJjZURhdGEiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFGbHVzaE5vblByaW1hcnlTb3VyY2VEYXRhLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIGxvbmcgaW5wdXRJbmRleCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTWVkaWFHZXRVUkxMaW5rIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhR2V0VVJMTGluaywgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBQb2ludCBkaXNwbGF5V2hlcmUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBIYW5kbGUgdXJsTGluaykiKX0sCi0JeyJNZWRpYUhpdFRlc3RGb3JUYXJnZXRSZWZDb24iLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFIaXRUZXN0Rm9yVGFyZ2V0UmVmQ29uLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIGxvbmcgZmxhZ3MsIFBvaW50IGxvYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgdGFyZ2V0UmVmQ29uKSIpfSwKLQl7Ik1lZGlhSGl0VGVzdFRhcmdldFJlZkNvbiIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUhpdFRlc3RUYXJnZXRSZWZDb24sIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgbG9uZyB0YXJnZXRSZWZDb24sIGxvbmcgZmxhZ3MsIFBvaW50IGxvYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEJvb2xlYW4gd2FzSGl0KSIpfSwKLQl7Ik1lZGlhRGlzcG9zZVRhcmdldFJlZkNvbiIsIChQeUNGdW5jdGlvbilRdF9NZWRpYURpc3Bvc2VUYXJnZXRSZWZDb24sIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgbG9uZyB0YXJnZXRSZWZDb24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1lZGlhVGFyZ2V0UmVmQ29uc0VxdWFsIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhVGFyZ2V0UmVmQ29uc0VxdWFsLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIGxvbmcgZmlyc3RSZWZDb24sIGxvbmcgc2Vjb25kUmVmQ29uKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQm9vbGVhbiBlcXVhbCkiKX0sCi0JeyJNZWRpYVByZVByZXJvbGxDYW5jZWwiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFQcmVQcmVyb2xsQ2FuY2VsLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIHZvaWQgKiByZWZjb24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1lZGlhRW50ZXJFbXB0eUVkaXQiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFFbnRlckVtcHR5RWRpdCwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNZWRpYUN1cnJlbnRNZWRpYVF1ZXVlZERhdGEiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFDdXJyZW50TWVkaWFRdWV1ZWREYXRhLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIG1pbGxpU2VjcykiKX0sCi0JeyJNZWRpYUdldEVmZmVjdGl2ZVZvbHVtZSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUdldEVmZmVjdGl2ZVZvbHVtZSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgc2hvcnQgdm9sdW1lKSIpfSwKLQl7Ik1lZGlhR2V0U291bmRMZXZlbE1ldGVyaW5nRW5hYmxlZCIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUdldFNvdW5kTGV2ZWxNZXRlcmluZ0VuYWJsZWQsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEJvb2xlYW4gZW5hYmxlZCkiKX0sCi0JeyJNZWRpYVNldFNvdW5kTGV2ZWxNZXRlcmluZ0VuYWJsZWQiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFTZXRTb3VuZExldmVsTWV0ZXJpbmdFbmFibGVkLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIEJvb2xlYW4gZW5hYmxlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNZWRpYUdldEVmZmVjdGl2ZVNvdW5kQmFsYW5jZSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUdldEVmZmVjdGl2ZVNvdW5kQmFsYW5jZSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgc2hvcnQgYmFsYW5jZSkiKX0sCi0JeyJNZWRpYVNldFNjcmVlbkxvY2siLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFTZXRTY3JlZW5Mb2NrLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIEJvb2xlYW4gbG9ja0l0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNZWRpYUdldEVycm9yU3RyaW5nIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhR2V0RXJyb3JTdHJpbmcsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgQ29tcG9uZW50UmVzdWx0IHRoZUVycm9yLCBTdHIyNTUgZXJyb3JTdHJpbmcpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1lZGlhR2V0U291bmRFcXVhbGl6ZXJCYW5kTGV2ZWxzIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhR2V0U291bmRFcXVhbGl6ZXJCYW5kTGV2ZWxzLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBVSW50OCBiYW5kTGV2ZWxzKSIpfSwKLQl7Ik1lZGlhRG9JZGxlQWN0aW9ucyIsIChQeUNGdW5jdGlvbilRdF9NZWRpYURvSWRsZUFjdGlvbnMsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTWVkaWFTZXRTb3VuZEJhc3NBbmRUcmVibGUiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFTZXRTb3VuZEJhc3NBbmRUcmVibGUsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgc2hvcnQgYmFzcywgc2hvcnQgdHJlYmxlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNZWRpYUdldFNvdW5kQmFzc0FuZFRyZWJsZSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUdldFNvdW5kQmFzc0FuZFRyZWJsZSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgc2hvcnQgYmFzcywgc2hvcnQgdHJlYmxlKSIpfSwKLQl7Ik1lZGlhVGltZUJhc2VDaGFuZ2VkIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhVGltZUJhc2VDaGFuZ2VkLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1lZGlhTUNJc1BsYXllckV2ZW50IiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhTUNJc1BsYXllckV2ZW50LCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIEV2ZW50UmVjb3JkIGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBCb29sZWFuIGhhbmRsZWRJdCkiKX0sCi0JeyJNZWRpYUdldE1lZGlhTG9hZFN0YXRlIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhR2V0TWVkaWFMb2FkU3RhdGUsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgbWVkaWFMb2FkU3RhdGUpIil9LAotCXsiTWVkaWFWaWRlb091dHB1dENoYW5nZWQiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFWaWRlb091dHB1dENoYW5nZWQsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgQ29tcG9uZW50SW5zdGFuY2Ugdm91dCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTWVkaWFFbXB0eVNhbXBsZUNhY2hlIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhRW1wdHlTYW1wbGVDYWNoZSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBsb25nIHNhbXBsZU51bSwgbG9uZyBzYW1wbGVDb3VudCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTWVkaWFHZXRQdWJsaWNJbmZvIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhR2V0UHVibGljSW5mbywgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBPU1R5cGUgaW5mb1NlbGVjdG9yLCB2b2lkICogaW5mb0RhdGFQdHIpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBTaXplIGlvRGF0YVNpemUpIil9LAotCXsiTWVkaWFTZXRQdWJsaWNJbmZvIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhU2V0UHVibGljSW5mbywgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBPU1R5cGUgaW5mb1NlbGVjdG9yLCB2b2lkICogaW5mb0RhdGFQdHIsIFNpemUgZGF0YVNpemUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1lZGlhUmVmQ29uU2V0UHJvcGVydHkiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFSZWZDb25TZXRQcm9wZXJ0eSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBsb25nIHJlZkNvbiwgbG9uZyBwcm9wZXJ0eVR5cGUsIHZvaWQgKiBwcm9wZXJ0eVZhbHVlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNZWRpYVJlZkNvbkdldFByb3BlcnR5IiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhUmVmQ29uR2V0UHJvcGVydHksIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgbG9uZyByZWZDb24sIGxvbmcgcHJvcGVydHlUeXBlLCB2b2lkICogcHJvcGVydHlWYWx1ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTWVkaWFOYXZpZ2F0ZVRhcmdldFJlZkNvbiIsIChQeUNGdW5jdGlvbilRdF9NZWRpYU5hdmlnYXRlVGFyZ2V0UmVmQ29uLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIGxvbmcgbmF2aWdhdGlvbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgcmVmQ29uKSIpfSwKLQl7Ik1lZGlhR0dldElkbGVNYW5hZ2VyIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhR0dldElkbGVNYW5hZ2VyLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBJZGxlTWFuYWdlciBwaW0pIil9LAotCXsiTWVkaWFHU2V0SWRsZU1hbmFnZXIiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFHU2V0SWRsZU1hbmFnZXIsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgSWRsZU1hbmFnZXIgaW0pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlFUTUlESUdldE1JRElQb3J0cyIsIChQeUNGdW5jdGlvbilRdF9RVE1JRElHZXRNSURJUG9ydHMsIDEsCi0JIFB5RG9jX1NUUigiKFFUTUlESUNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFFUTUlESVBvcnRMaXN0SGFuZGxlIGlucHV0UG9ydHMsIFFUTUlESVBvcnRMaXN0SGFuZGxlIG91dHB1dFBvcnRzKSIpfSwKLQl7IlFUTUlESVVzZVNlbmRQb3J0IiwgKFB5Q0Z1bmN0aW9uKVF0X1FUTUlESVVzZVNlbmRQb3J0LCAxLAotCSBQeURvY19TVFIoIihRVE1JRElDb21wb25lbnQgY2ksIGxvbmcgcG9ydEluZGV4LCBsb25nIGluVXNlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJRVE1JRElTZW5kTUlESSIsIChQeUNGdW5jdGlvbilRdF9RVE1JRElTZW5kTUlESSwgMSwKLQkgUHlEb2NfU1RSKCIoUVRNSURJQ29tcG9uZW50IGNpLCBsb25nIHBvcnRJbmRleCwgTXVzaWNNSURJUGFja2V0IG1wKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNdXNpY0dldFBhcnQiLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNHZXRQYXJ0LCAxLAotCSBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBwYXJ0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBtaWRpQ2hhbm5lbCwgbG9uZyBwb2x5cGhvbnkpIil9LAotCXsiTXVzaWNTZXRQYXJ0IiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljU2V0UGFydCwgMSwKLQkgUHlEb2NfU1RSKCIoTXVzaWNDb21wb25lbnQgbWMsIGxvbmcgcGFydCwgbG9uZyBtaWRpQ2hhbm5lbCwgbG9uZyBwb2x5cGhvbnkpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik11c2ljU2V0UGFydEluc3RydW1lbnROdW1iZXIiLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNTZXRQYXJ0SW5zdHJ1bWVudE51bWJlciwgMSwKLQkgUHlEb2NfU1RSKCIoTXVzaWNDb21wb25lbnQgbWMsIGxvbmcgcGFydCwgbG9uZyBpbnN0cnVtZW50TnVtYmVyKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNdXNpY0dldFBhcnRJbnN0cnVtZW50TnVtYmVyIiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljR2V0UGFydEluc3RydW1lbnROdW1iZXIsIDEsCi0JIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jLCBsb25nIHBhcnQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik11c2ljU3RvcmVQYXJ0SW5zdHJ1bWVudCIsIChQeUNGdW5jdGlvbilRdF9NdXNpY1N0b3JlUGFydEluc3RydW1lbnQsIDEsCi0JIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jLCBsb25nIHBhcnQsIGxvbmcgaW5zdHJ1bWVudE51bWJlcikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTXVzaWNHZXRQYXJ0QXRvbWljSW5zdHJ1bWVudCIsIChQeUNGdW5jdGlvbilRdF9NdXNpY0dldFBhcnRBdG9taWNJbnN0cnVtZW50LCAxLAotCSBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBwYXJ0LCBsb25nIGZsYWdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQXRvbWljSW5zdHJ1bWVudCBhaSkiKX0sCi0JeyJNdXNpY1NldFBhcnRBdG9taWNJbnN0cnVtZW50IiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljU2V0UGFydEF0b21pY0luc3RydW1lbnQsIDEsCi0JIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jLCBsb25nIHBhcnQsIEF0b21pY0luc3RydW1lbnRQdHIgYWlQLCBsb25nIGZsYWdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNdXNpY0dldFBhcnRLbm9iIiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljR2V0UGFydEtub2IsIDEsCi0JIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jLCBsb25nIHBhcnQsIGxvbmcga25vYklEKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNdXNpY1NldFBhcnRLbm9iIiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljU2V0UGFydEtub2IsIDEsCi0JIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jLCBsb25nIHBhcnQsIGxvbmcga25vYklELCBsb25nIGtub2JWYWx1ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTXVzaWNHZXRLbm9iIiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljR2V0S25vYiwgMSwKLQkgUHlEb2NfU1RSKCIoTXVzaWNDb21wb25lbnQgbWMsIGxvbmcga25vYklEKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNdXNpY1NldEtub2IiLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNTZXRLbm9iLCAxLAotCSBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBrbm9iSUQsIGxvbmcga25vYlZhbHVlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNdXNpY0dldFBhcnROYW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljR2V0UGFydE5hbWUsIDEsCi0JIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jLCBsb25nIHBhcnQsIFN0cmluZ1B0ciBuYW1lKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNdXNpY1NldFBhcnROYW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljU2V0UGFydE5hbWUsIDEsCi0JIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jLCBsb25nIHBhcnQsIFN0cmluZ1B0ciBuYW1lKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNdXNpY1BsYXlOb3RlIiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljUGxheU5vdGUsIDEsCi0JIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jLCBsb25nIHBhcnQsIGxvbmcgcGl0Y2gsIGxvbmcgdmVsb2NpdHkpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik11c2ljUmVzZXRQYXJ0IiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljUmVzZXRQYXJ0LCAxLAotCSBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBwYXJ0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNdXNpY1NldFBhcnRDb250cm9sbGVyIiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljU2V0UGFydENvbnRyb2xsZXIsIDEsCi0JIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jLCBsb25nIHBhcnQsIE11c2ljQ29udHJvbGxlciBjb250cm9sbGVyTnVtYmVyLCBsb25nIGNvbnRyb2xsZXJWYWx1ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTXVzaWNHZXRQYXJ0Q29udHJvbGxlciIsIChQeUNGdW5jdGlvbilRdF9NdXNpY0dldFBhcnRDb250cm9sbGVyLCAxLAotCSBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBwYXJ0LCBNdXNpY0NvbnRyb2xsZXIgY29udHJvbGxlck51bWJlcikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTXVzaWNHZXRJbnN0cnVtZW50TmFtZXMiLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNHZXRJbnN0cnVtZW50TmFtZXMsIDEsCi0JIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jLCBsb25nIG1vZGlmaWFibGVJbnN0cnVtZW50cykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEhhbmRsZSBpbnN0cnVtZW50TmFtZXMsIEhhbmRsZSBpbnN0cnVtZW50Q2F0ZWdvcnlMYXN0cywgSGFuZGxlIGluc3RydW1lbnRDYXRlZ29yeU5hbWVzKSIpfSwKLQl7Ik11c2ljR2V0RHJ1bU5hbWVzIiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljR2V0RHJ1bU5hbWVzLCAxLAotCSBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBtb2RpZmlhYmxlSW5zdHJ1bWVudHMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBIYW5kbGUgaW5zdHJ1bWVudE51bWJlcnMsIEhhbmRsZSBpbnN0cnVtZW50TmFtZXMpIil9LAotCXsiTXVzaWNHZXRNYXN0ZXJUdW5lIiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljR2V0TWFzdGVyVHVuZSwgMSwKLQkgUHlEb2NfU1RSKCIoTXVzaWNDb21wb25lbnQgbWMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik11c2ljU2V0TWFzdGVyVHVuZSIsIChQeUNGdW5jdGlvbilRdF9NdXNpY1NldE1hc3RlclR1bmUsIDEsCi0JIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jLCBsb25nIG1hc3RlclR1bmUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik11c2ljR2V0RGV2aWNlQ29ubmVjdGlvbiIsIChQeUNGdW5jdGlvbilRdF9NdXNpY0dldERldmljZUNvbm5lY3Rpb24sIDEsCi0JIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jLCBsb25nIGluZGV4KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBpZDEsIGxvbmcgaWQyKSIpfSwKLQl7Ik11c2ljVXNlRGV2aWNlQ29ubmVjdGlvbiIsIChQeUNGdW5jdGlvbilRdF9NdXNpY1VzZURldmljZUNvbm5lY3Rpb24sIDEsCi0JIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jLCBsb25nIGlkMSwgbG9uZyBpZDIpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik11c2ljR2V0S25vYlNldHRpbmdTdHJpbmdzIiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljR2V0S25vYlNldHRpbmdTdHJpbmdzLCAxLAotCSBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBrbm9iSW5kZXgsIGxvbmcgaXNHbG9iYWwpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBIYW5kbGUgc2V0dGluZ3NOYW1lcywgSGFuZGxlIHNldHRpbmdzQ2F0ZWdvcnlMYXN0cywgSGFuZGxlIHNldHRpbmdzQ2F0ZWdvcnlOYW1lcykiKX0sCi0JeyJNdXNpY0dldE1JRElQb3J0cyIsIChQeUNGdW5jdGlvbilRdF9NdXNpY0dldE1JRElQb3J0cywgMSwKLQkgUHlEb2NfU1RSKCIoTXVzaWNDb21wb25lbnQgbWMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIGlucHV0UG9ydENvdW50LCBsb25nIG91dHB1dFBvcnRDb3VudCkiKX0sCi0JeyJNdXNpY1NlbmRNSURJIiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljU2VuZE1JREksIDEsCi0JIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jLCBsb25nIHBvcnRJbmRleCwgTXVzaWNNSURJUGFja2V0IG1wKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNdXNpY1NldE9mZmxpbmVUaW1lVG8iLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNTZXRPZmZsaW5lVGltZVRvLCAxLAotCSBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBuZXdUaW1lU3RhbXApIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik11c2ljR2V0SW5mb1RleHQiLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNHZXRJbmZvVGV4dCwgMSwKLQkgUHlEb2NfU1RSKCIoTXVzaWNDb21wb25lbnQgbWMsIGxvbmcgc2VsZWN0b3IpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBIYW5kbGUgdGV4dEgsIEhhbmRsZSBzdHlsZUgpIil9LAotCXsiTXVzaWNHZXRJbnN0cnVtZW50SW5mbyIsIChQeUNGdW5jdGlvbilRdF9NdXNpY0dldEluc3RydW1lbnRJbmZvLCAxLAotCSBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBnZXRJbnN0cnVtZW50SW5mb0ZsYWdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSW5zdHJ1bWVudEluZm9MaXN0SGFuZGxlIGluZm9MaXN0SCkiKX0sCi0JeyJNdXNpY1Rhc2siLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNUYXNrLCAxLAotCSBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTXVzaWNTZXRQYXJ0SW5zdHJ1bWVudE51bWJlckludGVycnVwdFNhZmUiLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNTZXRQYXJ0SW5zdHJ1bWVudE51bWJlckludGVycnVwdFNhZmUsIDEsCi0JIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jLCBsb25nIHBhcnQsIGxvbmcgaW5zdHJ1bWVudE51bWJlcikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTXVzaWNTZXRQYXJ0U291bmRMb2NhbGl6YXRpb24iLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNTZXRQYXJ0U291bmRMb2NhbGl6YXRpb24sIDEsCi0JIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jLCBsb25nIHBhcnQsIEhhbmRsZSBkYXRhKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNdXNpY0dlbmVyaWNDb25maWd1cmUiLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNHZW5lcmljQ29uZmlndXJlLCAxLAotCSBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBtb2RlLCBsb25nIGZsYWdzLCBsb25nIGJhc2VSZXNJRCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTXVzaWNHZW5lcmljR2V0S25vYkxpc3QiLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNHZW5lcmljR2V0S25vYkxpc3QsIDEsCi0JIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jLCBsb25nIGtub2JUeXBlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgR2VuZXJpY0tub2JEZXNjcmlwdGlvbkxpc3RIYW5kbGUgZ2tkbEgpIil9LAotCXsiTXVzaWNHZW5lcmljU2V0UmVzb3VyY2VOdW1iZXJzIiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljR2VuZXJpY1NldFJlc291cmNlTnVtYmVycywgMSwKLQkgUHlEb2NfU1RSKCIoTXVzaWNDb21wb25lbnQgbWMsIEhhbmRsZSByZXNvdXJjZUlESCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTXVzaWNEZXJpdmVkTUlESVNlbmQiLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNEZXJpdmVkTUlESVNlbmQsIDEsCi0JIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jLCBNdXNpY01JRElQYWNrZXQgcGFja2V0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNdXNpY0Rlcml2ZWRPcGVuUmVzRmlsZSIsIChQeUNGdW5jdGlvbilRdF9NdXNpY0Rlcml2ZWRPcGVuUmVzRmlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoTXVzaWNDb21wb25lbnQgbWMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik11c2ljRGVyaXZlZENsb3NlUmVzRmlsZSIsIChQeUNGdW5jdGlvbilRdF9NdXNpY0Rlcml2ZWRDbG9zZVJlc0ZpbGUsIDEsCi0JIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jLCBzaG9ydCByZXNSZWZOdW0pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik5BVW5yZWdpc3Rlck11c2ljRGV2aWNlIiwgKFB5Q0Z1bmN0aW9uKVF0X05BVW5yZWdpc3Rlck11c2ljRGV2aWNlLCAxLAotCSBQeURvY19TVFIoIihOb3RlQWxsb2NhdG9yIG5hLCBsb25nIGluZGV4KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJOQVNhdmVNdXNpY0NvbmZpZ3VyYXRpb24iLCAoUHlDRnVuY3Rpb24pUXRfTkFTYXZlTXVzaWNDb25maWd1cmF0aW9uLCAxLAotCSBQeURvY19TVFIoIihOb3RlQWxsb2NhdG9yIG5hKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJOQUdldE1JRElQb3J0cyIsIChQeUNGdW5jdGlvbilRdF9OQUdldE1JRElQb3J0cywgMSwKLQkgUHlEb2NfU1RSKCIoTm90ZUFsbG9jYXRvciBuYSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFFUTUlESVBvcnRMaXN0SGFuZGxlIGlucHV0UG9ydHMsIFFUTUlESVBvcnRMaXN0SGFuZGxlIG91dHB1dFBvcnRzKSIpfSwKLQl7Ik5BVGFzayIsIChQeUNGdW5jdGlvbilRdF9OQVRhc2ssIDEsCi0JIFB5RG9jX1NUUigiKE5vdGVBbGxvY2F0b3IgbmEpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlR1bmVTZXRIZWFkZXIiLCAoUHlDRnVuY3Rpb24pUXRfVHVuZVNldEhlYWRlciwgMSwKLQkgUHlEb2NfU1RSKCIoVHVuZVBsYXllciB0cCwgdW5zaWduZWQgbG9uZyAqIGhlYWRlcikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiVHVuZUdldFRpbWVCYXNlIiwgKFB5Q0Z1bmN0aW9uKVF0X1R1bmVHZXRUaW1lQmFzZSwgMSwKLQkgUHlEb2NfU1RSKCIoVHVuZVBsYXllciB0cCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFRpbWVCYXNlIHRiKSIpfSwKLQl7IlR1bmVTZXRUaW1lU2NhbGUiLCAoUHlDRnVuY3Rpb24pUXRfVHVuZVNldFRpbWVTY2FsZSwgMSwKLQkgUHlEb2NfU1RSKCIoVHVuZVBsYXllciB0cCwgVGltZVNjYWxlIHNjYWxlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJUdW5lR2V0VGltZVNjYWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X1R1bmVHZXRUaW1lU2NhbGUsIDEsCi0JIFB5RG9jX1NUUigiKFR1bmVQbGF5ZXIgdHApIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBUaW1lU2NhbGUgc2NhbGUpIil9LAotCXsiVHVuZUluc3RhbnQiLCAoUHlDRnVuY3Rpb24pUXRfVHVuZUluc3RhbnQsIDEsCi0JIFB5RG9jX1NUUigiKFR1bmVQbGF5ZXIgdHAsIHVuc2lnbmVkIGxvbmcgdHVuZVBvc2l0aW9uKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgbG9uZyB0dW5lKSIpfSwKLQl7IlR1bmVTdG9wIiwgKFB5Q0Z1bmN0aW9uKVF0X1R1bmVTdG9wLCAxLAotCSBQeURvY19TVFIoIihUdW5lUGxheWVyIHRwLCBsb25nIHN0b3BGbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiVHVuZVNldFZvbHVtZSIsIChQeUNGdW5jdGlvbilRdF9UdW5lU2V0Vm9sdW1lLCAxLAotCSBQeURvY19TVFIoIihUdW5lUGxheWVyIHRwLCBGaXhlZCB2b2x1bWUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlR1bmVHZXRWb2x1bWUiLCAoUHlDRnVuY3Rpb24pUXRfVHVuZUdldFZvbHVtZSwgMSwKLQkgUHlEb2NfU1RSKCIoVHVuZVBsYXllciB0cCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiVHVuZVByZXJvbGwiLCAoUHlDRnVuY3Rpb24pUXRfVHVuZVByZXJvbGwsIDEsCi0JIFB5RG9jX1NUUigiKFR1bmVQbGF5ZXIgdHApIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlR1bmVVbnJvbGwiLCAoUHlDRnVuY3Rpb24pUXRfVHVuZVVucm9sbCwgMSwKLQkgUHlEb2NfU1RSKCIoVHVuZVBsYXllciB0cCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiVHVuZVNldFBhcnRUcmFuc3Bvc2UiLCAoUHlDRnVuY3Rpb24pUXRfVHVuZVNldFBhcnRUcmFuc3Bvc2UsIDEsCi0JIFB5RG9jX1NUUigiKFR1bmVQbGF5ZXIgdHAsIHVuc2lnbmVkIGxvbmcgcGFydCwgbG9uZyB0cmFuc3Bvc2UsIGxvbmcgdmVsb2NpdHlTaGlmdCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiVHVuZUdldE5vdGVBbGxvY2F0b3IiLCAoUHlDRnVuY3Rpb24pUXRfVHVuZUdldE5vdGVBbGxvY2F0b3IsIDEsCi0JIFB5RG9jX1NUUigiKFR1bmVQbGF5ZXIgdHApIC0+IChOb3RlQWxsb2NhdG9yIF9ydikiKX0sCi0JeyJUdW5lU2V0U29mdGVyIiwgKFB5Q0Z1bmN0aW9uKVF0X1R1bmVTZXRTb2Z0ZXIsIDEsCi0JIFB5RG9jX1NUUigiKFR1bmVQbGF5ZXIgdHAsIGxvbmcgc29mdGVyKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJUdW5lVGFzayIsIChQeUNGdW5jdGlvbilRdF9UdW5lVGFzaywgMSwKLQkgUHlEb2NfU1RSKCIoVHVuZVBsYXllciB0cCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiVHVuZVNldEJhbGFuY2UiLCAoUHlDRnVuY3Rpb24pUXRfVHVuZVNldEJhbGFuY2UsIDEsCi0JIFB5RG9jX1NUUigiKFR1bmVQbGF5ZXIgdHAsIGxvbmcgYmFsYW5jZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiVHVuZVNldFNvdW5kTG9jYWxpemF0aW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X1R1bmVTZXRTb3VuZExvY2FsaXphdGlvbiwgMSwKLQkgUHlEb2NfU1RSKCIoVHVuZVBsYXllciB0cCwgSGFuZGxlIGRhdGEpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlR1bmVTZXRIZWFkZXJXaXRoU2l6ZSIsIChQeUNGdW5jdGlvbilRdF9UdW5lU2V0SGVhZGVyV2l0aFNpemUsIDEsCi0JIFB5RG9jX1NUUigiKFR1bmVQbGF5ZXIgdHAsIHVuc2lnbmVkIGxvbmcgKiBoZWFkZXIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiVHVuZVNldFBhcnRNaXgiLCAoUHlDRnVuY3Rpb24pUXRfVHVuZVNldFBhcnRNaXgsIDEsCi0JIFB5RG9jX1NUUigiKFR1bmVQbGF5ZXIgdHAsIHVuc2lnbmVkIGxvbmcgcGFydE51bWJlciwgbG9uZyB2b2x1bWUsIGxvbmcgYmFsYW5jZSwgbG9uZyBtaXhGbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiVHVuZUdldFBhcnRNaXgiLCAoUHlDRnVuY3Rpb24pUXRfVHVuZUdldFBhcnRNaXgsIDEsCi0JIFB5RG9jX1NUUigiKFR1bmVQbGF5ZXIgdHAsIHVuc2lnbmVkIGxvbmcgcGFydE51bWJlcikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgdm9sdW1lT3V0LCBsb25nIGJhbGFuY2VPdXQsIGxvbmcgbWl4RmxhZ3NPdXQpIil9LAotCXsiQWxpZ25XaW5kb3ciLCAoUHlDRnVuY3Rpb24pUXRfQWxpZ25XaW5kb3csIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3cCwgQm9vbGVhbiBmcm9udCkgLT4gTm9uZSIpfSwKLQl7IkRyYWdBbGlnbmVkV2luZG93IiwgKFB5Q0Z1bmN0aW9uKVF0X0RyYWdBbGlnbmVkV2luZG93LCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQdHIgd3AsIFBvaW50IHN0YXJ0UHQsIFJlY3QgYm91bmRzUmVjdCkgLT4gTm9uZSIpfSwKLQl7Ik1vdmllc1Rhc2siLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVzVGFzaywgMSwKLQkgUHlEb2NfU1RSKCIobG9uZyBtYXhNaWxsaVNlY1RvVXNlKSAtPiBOb25lIil9LAorICAgIHsiRW50ZXJNb3ZpZXMiLCAoUHlDRnVuY3Rpb24pUXRfRW50ZXJNb3ZpZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkV4aXRNb3ZpZXMiLCAoUHlDRnVuY3Rpb24pUXRfRXhpdE1vdmllcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiR2V0TW92aWVzRXJyb3IiLCAoUHlDRnVuY3Rpb24pUXRfR2V0TW92aWVzRXJyb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkNsZWFyTW92aWVzU3RpY2t5RXJyb3IiLCAoUHlDRnVuY3Rpb24pUXRfQ2xlYXJNb3ZpZXNTdGlja3lFcnJvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiR2V0TW92aWVzU3RpY2t5RXJyb3IiLCAoUHlDRnVuY3Rpb24pUXRfR2V0TW92aWVzU3RpY2t5RXJyb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IlFUR2V0V2FsbENsb2NrVGltZUJhc2UiLCAoUHlDRnVuY3Rpb24pUXRfUVRHZXRXYWxsQ2xvY2tUaW1lQmFzZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVGltZUJhc2Ugd2FsbENsb2NrVGltZUJhc2UpIil9LAorICAgIHsiUVRJZGxlTWFuYWdlck9wZW4iLCAoUHlDRnVuY3Rpb24pUXRfUVRJZGxlTWFuYWdlck9wZW4sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKElkbGVNYW5hZ2VyIF9ydikiKX0sCisgICAgeyJDcmVhdGVNb3ZpZUNvbnRyb2wiLCAoUHlDRnVuY3Rpb24pUXRfQ3JlYXRlTW92aWVDb250cm9sLCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgdGhlV2luZG93LCBNb3ZpZSB0aGVNb3ZpZSwgVUludDMyIG9wdGlvbnMpIC0+IChSZWN0IGxvY2FsUmVjdCwgQ29udHJvbEhhbmRsZSByZXR1cm5lZENvbnRyb2wpIil9LAorICAgIHsiRGlzcG9zZU1hdHRlIiwgKFB5Q0Z1bmN0aW9uKVF0X0Rpc3Bvc2VNYXR0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUGl4TWFwSGFuZGxlIHRoZU1hdHRlKSAtPiBOb25lIil9LAorICAgIHsiTmV3TW92aWUiLCAoUHlDRnVuY3Rpb24pUXRfTmV3TW92aWUsIDEsCisgICAgIFB5RG9jX1NUUigiKGxvbmcgZmxhZ3MpIC0+IChNb3ZpZSBfcnYpIil9LAorICAgIHsiUVRHZXRUaW1lVW50aWxOZXh0VGFzayIsIChQeUNGdW5jdGlvbilRdF9RVEdldFRpbWVVbnRpbE5leHRUYXNrLCAxLAorICAgICBQeURvY19TVFIoIihsb25nIHNjYWxlKSAtPiAobG9uZyBkdXJhdGlvbikiKX0sCisgICAgeyJHZXREYXRhSGFuZGxlciIsIChQeUNGdW5jdGlvbilRdF9HZXREYXRhSGFuZGxlciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSGFuZGxlIGRhdGFSZWYsIE9TVHlwZSBkYXRhSGFuZGxlclN1YlR5cGUsIGxvbmcgZmxhZ3MpIC0+IChDb21wb25lbnQgX3J2KSIpfSwKKyAgICB7IlBhc3RlSGFuZGxlSW50b01vdmllIiwgKFB5Q0Z1bmN0aW9uKVF0X1Bhc3RlSGFuZGxlSW50b01vdmllLCAxLAorICAgICBQeURvY19TVFIoIihIYW5kbGUgaCwgT1NUeXBlIGhhbmRsZVR5cGUsIE1vdmllIHRoZU1vdmllLCBsb25nIGZsYWdzLCBDb21wb25lbnRJbnN0YW5jZSB1c2VyQ29tcCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldE1vdmllSW1wb3J0ZXJGb3JEYXRhUmVmIiwgKFB5Q0Z1bmN0aW9uKVF0X0dldE1vdmllSW1wb3J0ZXJGb3JEYXRhUmVmLCAxLAorICAgICBQeURvY19TVFIoIihPU1R5cGUgZGF0YVJlZlR5cGUsIEhhbmRsZSBkYXRhUmVmLCBsb25nIGZsYWdzKSAtPiAoQ29tcG9uZW50IGltcG9ydGVyKSIpfSwKKyAgICB7IlFUR2V0TUlNRVR5cGVJbmZvIiwgKFB5Q0Z1bmN0aW9uKVF0X1FUR2V0TUlNRVR5cGVJbmZvLCAxLAorICAgICBQeURvY19TVFIoIihjaGFyKiBtaW1lU3RyaW5nU3RhcnQsIHNob3J0IG1pbWVTdHJpbmdMZW5ndGgsIE9TVHlwZSBpbmZvU2VsZWN0b3IsIHZvaWQgKiBpbmZvRGF0YVB0cikgLT4gKGxvbmcgaW5mb0RhdGFTaXplKSIpfSwKKyAgICB7IlRyYWNrVGltZVRvTWVkaWFUaW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X1RyYWNrVGltZVRvTWVkaWFUaW1lLCAxLAorICAgICBQeURvY19TVFIoIihUaW1lVmFsdWUgdmFsdWUsIFRyYWNrIHRoZVRyYWNrKSAtPiAoVGltZVZhbHVlIF9ydikiKX0sCisgICAgeyJOZXdVc2VyRGF0YSIsIChQeUNGdW5jdGlvbilRdF9OZXdVc2VyRGF0YSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVXNlckRhdGEgdGhlVXNlckRhdGEpIil9LAorICAgIHsiTmV3VXNlckRhdGFGcm9tSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKVF0X05ld1VzZXJEYXRhRnJvbUhhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSGFuZGxlIGgpIC0+IChVc2VyRGF0YSB0aGVVc2VyRGF0YSkiKX0sCisgICAgeyJDcmVhdGVNb3ZpZUZpbGUiLCAoUHlDRnVuY3Rpb24pUXRfQ3JlYXRlTW92aWVGaWxlLCAxLAorICAgICBQeURvY19TVFIoIihGU1NwZWMgZmlsZVNwZWMsIE9TVHlwZSBjcmVhdG9yLCBTY3JpcHRDb2RlIHNjcmlwdFRhZywgbG9uZyBjcmVhdGVNb3ZpZUZpbGVGbGFncykgLT4gKHNob3J0IHJlc1JlZk51bSwgTW92aWUgbmV3bW92aWUpIil9LAorICAgIHsiT3Blbk1vdmllRmlsZSIsIChQeUNGdW5jdGlvbilRdF9PcGVuTW92aWVGaWxlLCAxLAorICAgICBQeURvY19TVFIoIihGU1NwZWMgZmlsZVNwZWMsIFNJbnQ4IHBlcm1pc3Npb24pIC0+IChzaG9ydCByZXNSZWZOdW0pIil9LAorICAgIHsiQ2xvc2VNb3ZpZUZpbGUiLCAoUHlDRnVuY3Rpb24pUXRfQ2xvc2VNb3ZpZUZpbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IHJlc1JlZk51bSkgLT4gTm9uZSIpfSwKKyAgICB7IkRlbGV0ZU1vdmllRmlsZSIsIChQeUNGdW5jdGlvbilRdF9EZWxldGVNb3ZpZUZpbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEZTU3BlYyBmaWxlU3BlYykgLT4gTm9uZSIpfSwKKyAgICB7Ik5ld01vdmllRnJvbUZpbGUiLCAoUHlDRnVuY3Rpb24pUXRfTmV3TW92aWVGcm9tRmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgcmVzUmVmTnVtLCBzaG9ydCByZXNJZCwgc2hvcnQgbmV3TW92aWVGbGFncykgLT4gKE1vdmllIHRoZU1vdmllLCBzaG9ydCByZXNJZCwgQm9vbGVhbiBkYXRhUmVmV2FzQ2hhbmdlZCkiKX0sCisgICAgeyJOZXdNb3ZpZUZyb21IYW5kbGUiLCAoUHlDRnVuY3Rpb24pUXRfTmV3TW92aWVGcm9tSGFuZGxlLCAxLAorICAgICBQeURvY19TVFIoIihIYW5kbGUgaCwgc2hvcnQgbmV3TW92aWVGbGFncykgLT4gKE1vdmllIHRoZU1vdmllLCBCb29sZWFuIGRhdGFSZWZXYXNDaGFuZ2VkKSIpfSwKKyAgICB7Ik5ld01vdmllRnJvbURhdGFGb3JrIiwgKFB5Q0Z1bmN0aW9uKVF0X05ld01vdmllRnJvbURhdGFGb3JrLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBmUmVmTnVtLCBsb25nIGZpbGVPZmZzZXQsIHNob3J0IG5ld01vdmllRmxhZ3MpIC0+IChNb3ZpZSB0aGVNb3ZpZSwgQm9vbGVhbiBkYXRhUmVmV2FzQ2hhbmdlZCkiKX0sCisgICAgeyJOZXdNb3ZpZUZyb21EYXRhRm9yazY0IiwgKFB5Q0Z1bmN0aW9uKVF0X05ld01vdmllRnJvbURhdGFGb3JrNjQsIDEsCisgICAgIFB5RG9jX1NUUigiKGxvbmcgZlJlZk51bSwgd2lkZSBmaWxlT2Zmc2V0LCBzaG9ydCBuZXdNb3ZpZUZsYWdzKSAtPiAoTW92aWUgdGhlTW92aWUsIEJvb2xlYW4gZGF0YVJlZldhc0NoYW5nZWQpIil9LAorICAgIHsiTmV3TW92aWVGcm9tRGF0YVJlZiIsIChQeUNGdW5jdGlvbilRdF9OZXdNb3ZpZUZyb21EYXRhUmVmLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBmbGFncywgSGFuZGxlIGRhdGFSZWYsIE9TVHlwZSBkdGFSZWZUeXBlKSAtPiAoTW92aWUgbSwgc2hvcnQgaWQpIil9LAorICAgIHsiTmV3TW92aWVGcm9tU3RvcmFnZU9mZnNldCIsIChQeUNGdW5jdGlvbilRdF9OZXdNb3ZpZUZyb21TdG9yYWdlT2Zmc2V0LCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgd2lkZSBmaWxlT2Zmc2V0LCBzaG9ydCBuZXdNb3ZpZUZsYWdzKSAtPiAoTW92aWUgdGhlTW92aWUsIEJvb2xlYW4gZGF0YVJlZldhc0NhdGFSZWZUeXBlKSIpfSwKKyAgICB7Ik5ld01vdmllRm9yRGF0YVJlZkZyb21IYW5kbGUiLCAoUHlDRnVuY3Rpb24pUXRfTmV3TW92aWVGb3JEYXRhUmVmRnJvbUhhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSGFuZGxlIGgsIHNob3J0IG5ld01vdmllRmxhZ3MsIEhhbmRsZSBkYXRhUmVmLCBPU1R5cGUgZGF0YVJlZlR5cGUpIC0+IChNb3ZpZSB0aGVNb3ZpZSwgQm9vbGVhbiBkYXRhUmVmV2FzQ2hhbmdlZCkiKX0sCisgICAgeyJSZW1vdmVNb3ZpZVJlc291cmNlIiwgKFB5Q0Z1bmN0aW9uKVF0X1JlbW92ZU1vdmllUmVzb3VyY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IHJlc1JlZk51bSwgc2hvcnQgcmVzSWQpIC0+IE5vbmUiKX0sCisgICAgeyJDcmVhdGVNb3ZpZVN0b3JhZ2UiLCAoUHlDRnVuY3Rpb24pUXRfQ3JlYXRlTW92aWVTdG9yYWdlLCAxLAorICAgICBQeURvY19TVFIoIihIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlLCBPU1R5cGUgY3JlYXRvciwgU2NyaXB0Q29kZSBzY3JpcHRUYWcsIGxvbmcgY3JlYXRlTW92aWVGaWxlRmxhZ3MpIC0+IChEYXRhSGFuZGxlciBvdXREYXRhSGFuZGxlciwgTW92aWUgbmV3bW92aWUpIil9LAorICAgIHsiT3Blbk1vdmllU3RvcmFnZSIsIChQeUNGdW5jdGlvbilRdF9PcGVuTW92aWVTdG9yYWdlLCAxLAorICAgICBQeURvY19TVFIoIihIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlLCBsb25nIGZsYWdzKSAtPiAoRGF0YUhhbmRsZXIgb3V0RGF0YUhhbmRsZXIpIil9LAorICAgIHsiQ2xvc2VNb3ZpZVN0b3JhZ2UiLCAoUHlDRnVuY3Rpb24pUXRfQ2xvc2VNb3ZpZVN0b3JhZ2UsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoKSAtPiBOb25lIil9LAorICAgIHsiRGVsZXRlTW92aWVTdG9yYWdlIiwgKFB5Q0Z1bmN0aW9uKVF0X0RlbGV0ZU1vdmllU3RvcmFnZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSGFuZGxlIGRhdGFSZWYsIE9TVHlwZSBkYXRhUmVmVHlwZSkgLT4gTm9uZSIpfSwKKyAgICB7IkNyZWF0ZVNob3J0Y3V0TW92aWVGaWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0NyZWF0ZVNob3J0Y3V0TW92aWVGaWxlLCAxLAorICAgICBQeURvY19TVFIoIihGU1NwZWMgZmlsZVNwZWMsIE9TVHlwZSBjcmVhdG9yLCBTY3JpcHRDb2RlIHNjcmlwdFRhZywgbG9uZyBjcmVhdGVNb3ZpZUZpbGVGbGFncywgSGFuZGxlIHRhcmdldERhdGFSZWYsIE9TVHlwZSB0YXJnZXREYXRhUmVmVHlwZSkgLT4gTm9uZSIpfSwKKyAgICB7IkNhblF1aWNrVGltZU9wZW5GaWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0NhblF1aWNrVGltZU9wZW5GaWxlLCAxLAorICAgICBQeURvY19TVFIoIihGU1NwZWMgZmlsZVNwZWMsIE9TVHlwZSBmaWxlVHlwZSwgT1NUeXBlIGZpbGVOYW1lRXh0ZW5zaW9uLCBVSW50MzIgaW5GbGFncykgLT4gKEJvb2xlYW4gb3V0Q2FuT3BlbldpdGhHcmFwaGljc0ltcG9ydGVyLCBCb29sZWFuIG91dENhbk9wZW5Bc01vdmllLCBCb29sZWFuIG91dFByZWZlckdyYXBoaWNzSW1wb3J0ZXIpIil9LAorICAgIHsiQ2FuUXVpY2tUaW1lT3BlbkRhdGFSZWYiLCAoUHlDRnVuY3Rpb24pUXRfQ2FuUXVpY2tUaW1lT3BlbkRhdGFSZWYsIDEsCisgICAgIFB5RG9jX1NUUigiKEhhbmRsZSBkYXRhUmVmLCBPU1R5cGUgZGF0YVJlZlR5cGUsIFVJbnQzMiBpbkZsYWdzKSAtPiAoQm9vbGVhbiBvdXRDYW5PcGVuV2l0aEdyYXBoaWNzSW1wb3J0ZXIsIEJvb2xlYW4gb3V0Q2FuT3BlbkFzTW92aWUsIEJvb2xlYW4gb3V0UHJlZmVyR3JhcGhpY3NJbXBvcnRlcikiKX0sCisgICAgeyJOZXdNb3ZpZUZyb21TY3JhcCIsIChQeUNGdW5jdGlvbilRdF9OZXdNb3ZpZUZyb21TY3JhcCwgMSwKKyAgICAgUHlEb2NfU1RSKCIobG9uZyBuZXdNb3ZpZUZsYWdzKSAtPiAoTW92aWUgX3J2KSIpfSwKKyAgICB7IlFUTmV3QWxpYXMiLCAoUHlDRnVuY3Rpb24pUXRfUVROZXdBbGlhcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoRlNTcGVjIGZzcywgQm9vbGVhbiBtaW5pbWFsKSAtPiAoQWxpYXNIYW5kbGUgYWxpYXMpIil9LAorICAgIHsiRW5kRnVsbFNjcmVlbiIsIChQeUNGdW5jdGlvbilRdF9FbmRGdWxsU2NyZWVuLCAxLAorICAgICBQeURvY19TVFIoIihQdHIgZnVsbFN0YXRlLCBsb25nIGZsYWdzKSAtPiBOb25lIil9LAorICAgIHsiQWRkU291bmREZXNjcmlwdGlvbkV4dGVuc2lvbiIsIChQeUNGdW5jdGlvbilRdF9BZGRTb3VuZERlc2NyaXB0aW9uRXh0ZW5zaW9uLCAxLAorICAgICBQeURvY19TVFIoIihTb3VuZERlc2NyaXB0aW9uSGFuZGxlIGRlc2MsIEhhbmRsZSBleHRlbnNpb24sIE9TVHlwZSBpZFR5cGUpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRTb3VuZERlc2NyaXB0aW9uRXh0ZW5zaW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X0dldFNvdW5kRGVzY3JpcHRpb25FeHRlbnNpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKFNvdW5kRGVzY3JpcHRpb25IYW5kbGUgZGVzYywgT1NUeXBlIGlkVHlwZSkgLT4gKEhhbmRsZSBleHRlbnNpb24pIil9LAorICAgIHsiUmVtb3ZlU291bmREZXNjcmlwdGlvbkV4dGVuc2lvbiIsIChQeUNGdW5jdGlvbilRdF9SZW1vdmVTb3VuZERlc2NyaXB0aW9uRXh0ZW5zaW9uLCAxLAorICAgICBQeURvY19TVFIoIihTb3VuZERlc2NyaXB0aW9uSGFuZGxlIGRlc2MsIE9TVHlwZSBpZFR5cGUpIC0+IE5vbmUiKX0sCisgICAgeyJRVElzU3RhbmRhcmRQYXJhbWV0ZXJEaWFsb2dFdmVudCIsIChQeUNGdW5jdGlvbilRdF9RVElzU3RhbmRhcmRQYXJhbWV0ZXJEaWFsb2dFdmVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUVRQYXJhbWV0ZXJEaWFsb2cgY3JlYXRlZERpYWxvZykgLT4gKEV2ZW50UmVjb3JkIHBFdmVudCkiKX0sCisgICAgeyJRVERpc21pc3NTdGFuZGFyZFBhcmFtZXRlckRpYWxvZyIsIChQeUNGdW5jdGlvbilRdF9RVERpc21pc3NTdGFuZGFyZFBhcmFtZXRlckRpYWxvZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoUVRQYXJhbWV0ZXJEaWFsb2cgY3JlYXRlZERpYWxvZykgLT4gTm9uZSIpfSwKKyAgICB7IlFUU3RhbmRhcmRQYXJhbWV0ZXJEaWFsb2dEb0FjdGlvbiIsIChQeUNGdW5jdGlvbilRdF9RVFN0YW5kYXJkUGFyYW1ldGVyRGlhbG9nRG9BY3Rpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKFFUUGFyYW1ldGVyRGlhbG9nIGNyZWF0ZWREaWFsb2csIGxvbmcgYWN0aW9uLCB2b2lkICogcGFyYW1zKSAtPiBOb25lIil9LAorICAgIHsiUVRSZWdpc3RlckFjY2Vzc0tleSIsIChQeUNGdW5jdGlvbilRdF9RVFJlZ2lzdGVyQWNjZXNzS2V5LCAxLAorICAgICBQeURvY19TVFIoIihTdHIyNTUgYWNjZXNzS2V5VHlwZSwgbG9uZyBmbGFncywgSGFuZGxlIGFjY2Vzc0tleSkgLT4gTm9uZSIpfSwKKyAgICB7IlFUVW5yZWdpc3RlckFjY2Vzc0tleSIsIChQeUNGdW5jdGlvbilRdF9RVFVucmVnaXN0ZXJBY2Nlc3NLZXksIDEsCisgICAgIFB5RG9jX1NUUigiKFN0cjI1NSBhY2Nlc3NLZXlUeXBlLCBsb25nIGZsYWdzLCBIYW5kbGUgYWNjZXNzS2V5KSAtPiBOb25lIil9LAorICAgIHsiUVRHZXRTdXBwb3J0ZWRSZXN0cmljdGlvbnMiLCAoUHlDRnVuY3Rpb24pUXRfUVRHZXRTdXBwb3J0ZWRSZXN0cmljdGlvbnMsIDEsCisgICAgIFB5RG9jX1NUUigiKE9TVHlwZSBpblJlc3RyaWN0aW9uQ2xhc3MpIC0+IChVSW50MzIgb3V0UmVzdHJpY3Rpb25JRHMpIil9LAorICAgIHsiUVRUZXh0VG9OYXRpdmVUZXh0IiwgKFB5Q0Z1bmN0aW9uKVF0X1FUVGV4dFRvTmF0aXZlVGV4dCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSGFuZGxlIHRoZVRleHQsIGxvbmcgZW5jb2RpbmcsIGxvbmcgZmxhZ3MpIC0+IE5vbmUiKX0sCisgICAgeyJWaWRlb01lZGlhUmVzZXRTdGF0aXN0aWNzIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZpZGVvTWVkaWFSZXNldFN0YXRpc3RpY3MsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiVmlkZW9NZWRpYUdldFN0YXRpc3RpY3MiLCAoUHlDRnVuY3Rpb24pUXRfVmlkZW9NZWRpYUdldFN0YXRpc3RpY3MsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiVmlkZW9NZWRpYUdldFN0YWxsQ291bnQiLCAoUHlDRnVuY3Rpb24pUXRfVmlkZW9NZWRpYUdldFN0YWxsQ291bnQsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHVuc2lnbmVkIGxvbmcgc3RhbGxzKSIpfSwKKyAgICB7IlZpZGVvTWVkaWFTZXRDb2RlY1BhcmFtZXRlciIsIChQeUNGdW5jdGlvbilRdF9WaWRlb01lZGlhU2V0Q29kZWNQYXJhbWV0ZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgQ29kZWNUeXBlIGNUeXBlLCBPU1R5cGUgcGFyYW1ldGVySUQsIGxvbmcgcGFyYW1ldGVyQ2hhbmdlU2VlZCwgdm9pZCAqIGRhdGFQdHIsIGxvbmcgZGF0YVNpemUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlZpZGVvTWVkaWFHZXRDb2RlY1BhcmFtZXRlciIsIChQeUNGdW5jdGlvbilRdF9WaWRlb01lZGlhR2V0Q29kZWNQYXJhbWV0ZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgQ29kZWNUeXBlIGNUeXBlLCBPU1R5cGUgcGFyYW1ldGVySUQsIEhhbmRsZSBvdXRQYXJhbWV0ZXJEYXRhKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJUZXh0TWVkaWFBZGRUZXh0U2FtcGxlIiwgKFB5Q0Z1bmN0aW9uKVF0X1RleHRNZWRpYUFkZFRleHRTYW1wbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgUHRyIHRleHQsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgc2hvcnQgZm9udE51bWJlciwgc2hvcnQgZm9udFNpemUsIFN0eWxlIHRleHRGYWNlLCBzaG9ydCB0ZXh0SnVzdGlmaWNhdGlvbiwgbG9uZyBkaXNwbGF5RmxhZ3MsIFRpbWVWYWx1ZSBzY3JvbGxEZWxheSwgc2hvcnQgaGlsaXRlU3RhcnQsIHNob3J0IGhpbGl0ZUVuZCwgVGltZVZhbHVlIGR1cmF0aW9uKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUkdCQ29sb3IgdGV4dENvbG9yLCBSR0JDb2xvciBiYWNrQ29sb3IsIFJlY3QgdGV4dEJveCwgUkdCQ29sb3IgcmdiSGlsaXRlQ29sb3IsIFRpbWVWYWx1ZSBzYW1wbGVUaW1lKSIpfSwKKyAgICB7IlRleHRNZWRpYUFkZFRFU2FtcGxlIiwgKFB5Q0Z1bmN0aW9uKVF0X1RleHRNZWRpYUFkZFRFU2FtcGxlLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFRFSGFuZGxlIGhURSwgc2hvcnQgdGV4dEp1c3RpZmljYXRpb24sIGxvbmcgZGlzcGxheUZsYWdzLCBUaW1lVmFsdWUgc2Nyb2xsRGVsYXksIHNob3J0IGhpbGl0ZVN0YXJ0LCBzaG9ydCBoaWxpdGVFbmQsIFRpbWVWYWx1ZSBkdXJhdGlvbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJHQkNvbG9yIGJhY2tDb2xvciwgUmVjdCB0ZXh0Qm94LCBSR0JDb2xvciByZ2JIaWxpdGVDb2xvciwgVGltZVZhbHVlIHNhbXBsZVRpbWUpIil9LAorICAgIHsiVGV4dE1lZGlhQWRkSGlsaXRlU2FtcGxlIiwgKFB5Q0Z1bmN0aW9uKVF0X1RleHRNZWRpYUFkZEhpbGl0ZVNhbXBsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBzaG9ydCBoaWxpdGVTdGFydCwgc2hvcnQgaGlsaXRlRW5kLCBUaW1lVmFsdWUgZHVyYXRpb24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSR0JDb2xvciByZ2JIaWxpdGVDb2xvciwgVGltZVZhbHVlIHNhbXBsZVRpbWUpIil9LAorICAgIHsiVGV4dE1lZGlhRHJhd1JhdyIsIChQeUNGdW5jdGlvbilRdF9UZXh0TWVkaWFEcmF3UmF3LCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIEdXb3JsZFB0ciBndywgR0RIYW5kbGUgZ2QsIHZvaWQgKiBkYXRhLCBsb25nIGRhdGFTaXplLCBUZXh0RGVzY3JpcHRpb25IYW5kbGUgdGRoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJUZXh0TWVkaWFTZXRUZXh0UHJvcGVydHkiLCAoUHlDRnVuY3Rpb24pUXRfVGV4dE1lZGlhU2V0VGV4dFByb3BlcnR5LCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFRpbWVWYWx1ZSBhdE1lZGlhVGltZSwgbG9uZyBwcm9wZXJ0eVR5cGUsIHZvaWQgKiBkYXRhLCBsb25nIGRhdGFTaXplKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJUZXh0TWVkaWFSYXdTZXR1cCIsIChQeUNGdW5jdGlvbilRdF9UZXh0TWVkaWFSYXdTZXR1cCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBHV29ybGRQdHIgZ3csIEdESGFuZGxlIGdkLCB2b2lkICogZGF0YSwgbG9uZyBkYXRhU2l6ZSwgVGV4dERlc2NyaXB0aW9uSGFuZGxlIHRkaCwgVGltZVZhbHVlIHNhbXBsZUR1cmF0aW9uKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJUZXh0TWVkaWFSYXdJZGxlIiwgKFB5Q0Z1bmN0aW9uKVF0X1RleHRNZWRpYVJhd0lkbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgR1dvcmxkUHRyIGd3LCBHREhhbmRsZSBnZCwgVGltZVZhbHVlIHNhbXBsZVRpbWUsIGxvbmcgZmxhZ3NJbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgZmxhZ3NPdXQpIil9LAorICAgIHsiVGV4dE1lZGlhR2V0VGV4dFByb3BlcnR5IiwgKFB5Q0Z1bmN0aW9uKVF0X1RleHRNZWRpYUdldFRleHRQcm9wZXJ0eSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBUaW1lVmFsdWUgYXRNZWRpYVRpbWUsIGxvbmcgcHJvcGVydHlUeXBlLCB2b2lkICogZGF0YSwgbG9uZyBkYXRhU2l6ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiVGV4dE1lZGlhRmluZE5leHRUZXh0IiwgKFB5Q0Z1bmN0aW9uKVF0X1RleHRNZWRpYUZpbmROZXh0VGV4dCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBQdHIgdGV4dCwgbG9uZyBzaXplLCBzaG9ydCBmaW5kRmxhZ3MsIFRpbWVWYWx1ZSBzdGFydFRpbWUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBUaW1lVmFsdWUgZm91bmRUaW1lLCBUaW1lVmFsdWUgZm91bmREdXJhdGlvbiwgbG9uZyBvZmZzZXQpIil9LAorICAgIHsiVGV4dE1lZGlhSGlsaXRlVGV4dFNhbXBsZSIsIChQeUNGdW5jdGlvbilRdF9UZXh0TWVkaWFIaWxpdGVUZXh0U2FtcGxlLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFRpbWVWYWx1ZSBzYW1wbGVUaW1lLCBzaG9ydCBoaWxpdGVTdGFydCwgc2hvcnQgaGlsaXRlRW5kKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUkdCQ29sb3IgcmdiSGlsaXRlQ29sb3IpIil9LAorICAgIHsiVGV4dE1lZGlhU2V0VGV4dFNhbXBsZURhdGEiLCAoUHlDRnVuY3Rpb24pUXRfVGV4dE1lZGlhU2V0VGV4dFNhbXBsZURhdGEsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgdm9pZCAqIGRhdGEsIE9TVHlwZSBkYXRhVHlwZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU3ByaXRlTWVkaWFTZXRQcm9wZXJ0eSIsIChQeUNGdW5jdGlvbilRdF9TcHJpdGVNZWRpYVNldFByb3BlcnR5LCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIHNob3J0IHNwcml0ZUluZGV4LCBsb25nIHByb3BlcnR5VHlwZSwgdm9pZCAqIHByb3BlcnR5VmFsdWUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNwcml0ZU1lZGlhR2V0UHJvcGVydHkiLCAoUHlDRnVuY3Rpb24pUXRfU3ByaXRlTWVkaWFHZXRQcm9wZXJ0eSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBzaG9ydCBzcHJpdGVJbmRleCwgbG9uZyBwcm9wZXJ0eVR5cGUsIHZvaWQgKiBwcm9wZXJ0eVZhbHVlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTcHJpdGVNZWRpYUhpdFRlc3RTcHJpdGVzIiwgKFB5Q0Z1bmN0aW9uKVF0X1Nwcml0ZU1lZGlhSGl0VGVzdFNwcml0ZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgbG9uZyBmbGFncywgUG9pbnQgbG9jKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgc2hvcnQgc3ByaXRlSGl0SW5kZXgpIil9LAorICAgIHsiU3ByaXRlTWVkaWFDb3VudFNwcml0ZXMiLCAoUHlDRnVuY3Rpb24pUXRfU3ByaXRlTWVkaWFDb3VudFNwcml0ZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHNob3J0IG51bVNwcml0ZXMpIil9LAorICAgIHsiU3ByaXRlTWVkaWFDb3VudEltYWdlcyIsIChQeUNGdW5jdGlvbilRdF9TcHJpdGVNZWRpYUNvdW50SW1hZ2VzLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBzaG9ydCBudW1JbWFnZXMpIil9LAorICAgIHsiU3ByaXRlTWVkaWFHZXRJbmRJbWFnZURlc2NyaXB0aW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X1Nwcml0ZU1lZGlhR2V0SW5kSW1hZ2VEZXNjcmlwdGlvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBzaG9ydCBpbWFnZUluZGV4LCBJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGltYWdlRGVzY3JpcHRpb24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNwcml0ZU1lZGlhR2V0RGlzcGxheWVkU2FtcGxlTnVtYmVyIiwgKFB5Q0Z1bmN0aW9uKVF0X1Nwcml0ZU1lZGlhR2V0RGlzcGxheWVkU2FtcGxlTnVtYmVyLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIHNhbXBsZU51bSkiKX0sCisgICAgeyJTcHJpdGVNZWRpYUdldFNwcml0ZU5hbWUiLCAoUHlDRnVuY3Rpb24pUXRfU3ByaXRlTWVkaWFHZXRTcHJpdGVOYW1lLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFFUQXRvbUlEIHNwcml0ZUlELCBTdHIyNTUgc3ByaXRlTmFtZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU3ByaXRlTWVkaWFHZXRJbWFnZU5hbWUiLCAoUHlDRnVuY3Rpb24pUXRfU3ByaXRlTWVkaWFHZXRJbWFnZU5hbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgc2hvcnQgaW1hZ2VJbmRleCwgU3RyMjU1IGltYWdlTmFtZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU3ByaXRlTWVkaWFTZXRTcHJpdGVQcm9wZXJ0eSIsIChQeUNGdW5jdGlvbilRdF9TcHJpdGVNZWRpYVNldFNwcml0ZVByb3BlcnR5LCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFFUQXRvbUlEIHNwcml0ZUlELCBsb25nIHByb3BlcnR5VHlwZSwgdm9pZCAqIHByb3BlcnR5VmFsdWUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNwcml0ZU1lZGlhR2V0U3ByaXRlUHJvcGVydHkiLCAoUHlDRnVuY3Rpb24pUXRfU3ByaXRlTWVkaWFHZXRTcHJpdGVQcm9wZXJ0eSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBRVEF0b21JRCBzcHJpdGVJRCwgbG9uZyBwcm9wZXJ0eVR5cGUsIHZvaWQgKiBwcm9wZXJ0eVZhbHVlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTcHJpdGVNZWRpYUhpdFRlc3RBbGxTcHJpdGVzIiwgKFB5Q0Z1bmN0aW9uKVF0X1Nwcml0ZU1lZGlhSGl0VGVzdEFsbFNwcml0ZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgbG9uZyBmbGFncywgUG9pbnQgbG9jKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUVRBdG9tSUQgc3ByaXRlSGl0SUQpIil9LAorICAgIHsiU3ByaXRlTWVkaWFIaXRUZXN0T25lU3ByaXRlIiwgKFB5Q0Z1bmN0aW9uKVF0X1Nwcml0ZU1lZGlhSGl0VGVzdE9uZVNwcml0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBRVEF0b21JRCBzcHJpdGVJRCwgbG9uZyBmbGFncywgUG9pbnQgbG9jKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQm9vbGVhbiB3YXNIaXQpIil9LAorICAgIHsiU3ByaXRlTWVkaWFTcHJpdGVJbmRleFRvSUQiLCAoUHlDRnVuY3Rpb24pUXRfU3ByaXRlTWVkaWFTcHJpdGVJbmRleFRvSUQsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgc2hvcnQgc3ByaXRlSW5kZXgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBRVEF0b21JRCBzcHJpdGVJRCkiKX0sCisgICAgeyJTcHJpdGVNZWRpYVNwcml0ZUlEVG9JbmRleCIsIChQeUNGdW5jdGlvbilRdF9TcHJpdGVNZWRpYVNwcml0ZUlEVG9JbmRleCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBRVEF0b21JRCBzcHJpdGVJRCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHNob3J0IHNwcml0ZUluZGV4KSIpfSwKKyAgICB7IlNwcml0ZU1lZGlhU2V0QWN0aW9uVmFyaWFibGUiLCAoUHlDRnVuY3Rpb24pUXRfU3ByaXRlTWVkaWFTZXRBY3Rpb25WYXJpYWJsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBRVEF0b21JRCB2YXJpYWJsZUlELCBmbG9hdCB2YWx1ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU3ByaXRlTWVkaWFHZXRBY3Rpb25WYXJpYWJsZSIsIChQeUNGdW5jdGlvbilRdF9TcHJpdGVNZWRpYUdldEFjdGlvblZhcmlhYmxlLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFFUQXRvbUlEIHZhcmlhYmxlSUQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBmbG9hdCB2YWx1ZSkiKX0sCisgICAgeyJTcHJpdGVNZWRpYURpc3Bvc2VTcHJpdGUiLCAoUHlDRnVuY3Rpb24pUXRfU3ByaXRlTWVkaWFEaXNwb3NlU3ByaXRlLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFFUQXRvbUlEIHNwcml0ZUlEKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTcHJpdGVNZWRpYVNldEFjdGlvblZhcmlhYmxlVG9TdHJpbmciLCAoUHlDRnVuY3Rpb24pUXRfU3ByaXRlTWVkaWFTZXRBY3Rpb25WYXJpYWJsZVRvU3RyaW5nLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFFUQXRvbUlEIHZhcmlhYmxlSUQsIFB0ciB0aGVDU3RyaW5nKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTcHJpdGVNZWRpYUdldEFjdGlvblZhcmlhYmxlQXNTdHJpbmciLCAoUHlDRnVuY3Rpb24pUXRfU3ByaXRlTWVkaWFHZXRBY3Rpb25WYXJpYWJsZUFzU3RyaW5nLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFFUQXRvbUlEIHZhcmlhYmxlSUQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBIYW5kbGUgdGhlQ1N0cmluZykiKX0sCisgICAgeyJTcHJpdGVNZWRpYU5ld0ltYWdlIiwgKFB5Q0Z1bmN0aW9uKVF0X1Nwcml0ZU1lZGlhTmV3SW1hZ2UsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgSGFuZGxlIGRhdGFSZWYsIE9TVHlwZSBkYXRhUmVmVHlwZSwgUVRBdG9tSUQgZGVzaXJlZElEKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTcHJpdGVNZWRpYURpc3Bvc2VJbWFnZSIsIChQeUNGdW5jdGlvbilRdF9TcHJpdGVNZWRpYURpc3Bvc2VJbWFnZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBzaG9ydCBpbWFnZUluZGV4KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTcHJpdGVNZWRpYUltYWdlSW5kZXhUb0lEIiwgKFB5Q0Z1bmN0aW9uKVF0X1Nwcml0ZU1lZGlhSW1hZ2VJbmRleFRvSUQsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgc2hvcnQgaW1hZ2VJbmRleCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFFUQXRvbUlEIGltYWdlSUQpIil9LAorICAgIHsiU3ByaXRlTWVkaWFJbWFnZUlEVG9JbmRleCIsIChQeUNGdW5jdGlvbilRdF9TcHJpdGVNZWRpYUltYWdlSURUb0luZGV4LCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFFUQXRvbUlEIGltYWdlSUQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBzaG9ydCBpbWFnZUluZGV4KSIpfSwKKyAgICB7IkZsYXNoTWVkaWFTZXRQYW4iLCAoUHlDRnVuY3Rpb24pUXRfRmxhc2hNZWRpYVNldFBhbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBzaG9ydCB4UGVyY2VudCwgc2hvcnQgeVBlcmNlbnQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkZsYXNoTWVkaWFTZXRab29tIiwgKFB5Q0Z1bmN0aW9uKVF0X0ZsYXNoTWVkaWFTZXRab29tLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIHNob3J0IGZhY3RvcikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiRmxhc2hNZWRpYVNldFpvb21SZWN0IiwgKFB5Q0Z1bmN0aW9uKVF0X0ZsYXNoTWVkaWFTZXRab29tUmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBsb25nIGxlZnQsIGxvbmcgdG9wLCBsb25nIHJpZ2h0LCBsb25nIGJvdHRvbSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiRmxhc2hNZWRpYUdldFJlZkNvbkJvdW5kcyIsIChQeUNGdW5jdGlvbilRdF9GbGFzaE1lZGlhR2V0UmVmQ29uQm91bmRzLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIGxvbmcgcmVmQ29uKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBsZWZ0LCBsb25nIHRvcCwgbG9uZyByaWdodCwgbG9uZyBib3R0b20pIil9LAorICAgIHsiRmxhc2hNZWRpYUdldFJlZkNvbklEIiwgKFB5Q0Z1bmN0aW9uKVF0X0ZsYXNoTWVkaWFHZXRSZWZDb25JRCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBsb25nIHJlZkNvbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgcmVmQ29uSUQpIil9LAorICAgIHsiRmxhc2hNZWRpYUlEVG9SZWZDb24iLCAoUHlDRnVuY3Rpb24pUXRfRmxhc2hNZWRpYUlEVG9SZWZDb24sIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgbG9uZyByZWZDb25JRCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgcmVmQ29uKSIpfSwKKyAgICB7IkZsYXNoTWVkaWFHZXREaXNwbGF5ZWRGcmFtZU51bWJlciIsIChQeUNGdW5jdGlvbilRdF9GbGFzaE1lZGlhR2V0RGlzcGxheWVkRnJhbWVOdW1iZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgZmxhc2hGcmFtZU51bWJlcikiKX0sCisgICAgeyJGbGFzaE1lZGlhRnJhbWVOdW1iZXJUb01vdmllVGltZSIsIChQeUNGdW5jdGlvbilRdF9GbGFzaE1lZGlhRnJhbWVOdW1iZXJUb01vdmllVGltZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBsb25nIGZsYXNoRnJhbWVOdW1iZXIpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBUaW1lVmFsdWUgbW92aWVUaW1lKSIpfSwKKyAgICB7IkZsYXNoTWVkaWFGcmFtZUxhYmVsVG9Nb3ZpZVRpbWUiLCAoUHlDRnVuY3Rpb24pUXRfRmxhc2hNZWRpYUZyYW1lTGFiZWxUb01vdmllVGltZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBQdHIgdGhlTGFiZWwpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBUaW1lVmFsdWUgbW92aWVUaW1lKSIpfSwKKyAgICB7IkZsYXNoTWVkaWFHZXRGbGFzaFZhcmlhYmxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0ZsYXNoTWVkaWFHZXRGbGFzaFZhcmlhYmxlLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBjaGFyIHBhdGgsIGNoYXIgbmFtZSwgSGFuZGxlIHRoZVZhcmlhYmxlQ1N0cmluZ091dCkiKX0sCisgICAgeyJGbGFzaE1lZGlhU2V0Rmxhc2hWYXJpYWJsZSIsIChQeUNGdW5jdGlvbilRdF9GbGFzaE1lZGlhU2V0Rmxhc2hWYXJpYWJsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBCb29sZWFuIHVwZGF0ZUZvY3VzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgY2hhciBwYXRoLCBjaGFyIG5hbWUsIGNoYXIgdmFsdWUpIil9LAorICAgIHsiRmxhc2hNZWRpYURvQnV0dG9uQWN0aW9ucyIsIChQeUNGdW5jdGlvbilRdF9GbGFzaE1lZGlhRG9CdXR0b25BY3Rpb25zLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIGxvbmcgYnV0dG9uSUQsIGxvbmcgdHJhbnNpdGlvbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGNoYXIgcGF0aCkiKX0sCisgICAgeyJGbGFzaE1lZGlhR2V0U3VwcG9ydGVkU3dmVmVyc2lvbiIsIChQeUNGdW5jdGlvbilRdF9GbGFzaE1lZGlhR2V0U3VwcG9ydGVkU3dmVmVyc2lvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgVUludDggc3dmVmVyc2lvbikiKX0sCisgICAgeyJNZWRpYTNER2V0Q3VycmVudEdyb3VwIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhM0RHZXRDdXJyZW50R3JvdXAsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgdm9pZCAqIGdyb3VwKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNZWRpYTNEVHJhbnNsYXRlTmFtZWRPYmplY3RUbyIsIChQeUNGdW5jdGlvbilRdF9NZWRpYTNEVHJhbnNsYXRlTmFtZWRPYmplY3RUbywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBGaXhlZCB4LCBGaXhlZCB5LCBGaXhlZCB6KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgY2hhciBvYmplY3ROYW1lKSIpfSwKKyAgICB7Ik1lZGlhM0RTY2FsZU5hbWVkT2JqZWN0VG8iLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWEzRFNjYWxlTmFtZWRPYmplY3RUbywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBGaXhlZCB4U2NhbGUsIEZpeGVkIHlTY2FsZSwgRml4ZWQgelNjYWxlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgY2hhciBvYmplY3ROYW1lKSIpfSwKKyAgICB7Ik1lZGlhM0RSb3RhdGVOYW1lZE9iamVjdFRvIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhM0RSb3RhdGVOYW1lZE9iamVjdFRvLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIEZpeGVkIHhEZWdyZWVzLCBGaXhlZCB5RGVncmVlcywgRml4ZWQgekRlZ3JlZXMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBjaGFyIG9iamVjdE5hbWUpIil9LAorICAgIHsiTWVkaWEzRFNldENhbWVyYURhdGEiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWEzRFNldENhbWVyYURhdGEsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgdm9pZCAqIGNhbWVyYURhdGEpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1lZGlhM0RHZXRDYW1lcmFEYXRhIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhM0RHZXRDYW1lcmFEYXRhLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIHZvaWQgKiBjYW1lcmFEYXRhKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNZWRpYTNEU2V0Q2FtZXJhQW5nbGVBc3BlY3QiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWEzRFNldENhbWVyYUFuZ2xlQXNwZWN0LCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFFURmxvYXRTaW5nbGUgZm92LCBRVEZsb2F0U2luZ2xlIGFzcGVjdFJhdGlvWFRvWSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTWVkaWEzREdldENhbWVyYUFuZ2xlQXNwZWN0IiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhM0RHZXRDYW1lcmFBbmdsZUFzcGVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUVRGbG9hdFNpbmdsZSBmb3YsIFFURmxvYXRTaW5nbGUgYXNwZWN0UmF0aW9YVG9ZKSIpfSwKKyAgICB7Ik1lZGlhM0RTZXRDYW1lcmFSYW5nZSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYTNEU2V0Q2FtZXJhUmFuZ2UsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgdm9pZCAqIHRRM0NhbWVyYVJhbmdlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNZWRpYTNER2V0Q2FtZXJhUmFuZ2UiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWEzREdldENhbWVyYVJhbmdlLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIHZvaWQgKiB0UTNDYW1lcmFSYW5nZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTmV3VGltZUJhc2UiLCAoUHlDRnVuY3Rpb24pUXRfTmV3VGltZUJhc2UsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFRpbWVCYXNlIF9ydikiKX0sCisgICAgeyJDb252ZXJ0VGltZSIsIChQeUNGdW5jdGlvbilRdF9Db252ZXJ0VGltZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGltZVJlY29yZCB0aGVUaW1lLCBUaW1lQmFzZSBuZXdCYXNlKSAtPiAoVGltZVJlY29yZCB0aGVUaW1lKSIpfSwKKyAgICB7IkNvbnZlcnRUaW1lU2NhbGUiLCAoUHlDRnVuY3Rpb24pUXRfQ29udmVydFRpbWVTY2FsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGltZVJlY29yZCB0aGVUaW1lLCBUaW1lU2NhbGUgbmV3U2NhbGUpIC0+IChUaW1lUmVjb3JkIHRoZVRpbWUpIil9LAorICAgIHsiQWRkVGltZSIsIChQeUNGdW5jdGlvbilRdF9BZGRUaW1lLCAxLAorICAgICBQeURvY19TVFIoIihUaW1lUmVjb3JkIGRzdCwgVGltZVJlY29yZCBzcmMpIC0+IChUaW1lUmVjb3JkIGRzdCkiKX0sCisgICAgeyJTdWJ0cmFjdFRpbWUiLCAoUHlDRnVuY3Rpb24pUXRfU3VidHJhY3RUaW1lLCAxLAorICAgICBQeURvY19TVFIoIihUaW1lUmVjb3JkIGRzdCwgVGltZVJlY29yZCBzcmMpIC0+IChUaW1lUmVjb3JkIGRzdCkiKX0sCisgICAgeyJNdXNpY01lZGlhR2V0SW5kZXhlZFR1bmVQbGF5ZXIiLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNNZWRpYUdldEluZGV4ZWRUdW5lUGxheWVyLCAxLAorICAgICBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSB0aSwgbG9uZyBzYW1wbGVEZXNjSW5kZXgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBDb21wb25lbnRJbnN0YW5jZSB0cCkiKX0sCisgICAgeyJDb2RlY01hbmFnZXJWZXJzaW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X0NvZGVjTWFuYWdlclZlcnNpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKGxvbmcgdmVyc2lvbikiKX0sCisgICAgeyJHZXRNYXhDb21wcmVzc2lvblNpemUiLCAoUHlDRnVuY3Rpb24pUXRfR2V0TWF4Q29tcHJlc3Npb25TaXplLCAxLAorICAgICBQeURvY19TVFIoIihQaXhNYXBIYW5kbGUgc3JjLCBSZWN0IHNyY1JlY3QsIHNob3J0IGNvbG9yRGVwdGgsIENvZGVjUSBxdWFsaXR5LCBDb2RlY1R5cGUgY1R5cGUsIENvbXByZXNzb3JDb21wb25lbnQgY29kZWMpIC0+IChsb25nIHNpemUpIil9LAorICAgIHsiR2V0Q29tcHJlc3Npb25UaW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X0dldENvbXByZXNzaW9uVGltZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUGl4TWFwSGFuZGxlIHNyYywgUmVjdCBzcmNSZWN0LCBzaG9ydCBjb2xvckRlcHRoLCBDb2RlY1R5cGUgY1R5cGUsIENvbXByZXNzb3JDb21wb25lbnQgY29kZWMpIC0+IChDb2RlY1Egc3BhdGlhbFF1YWxpdHksIENvZGVjUSB0ZW1wb3JhbFF1YWxpdHksIHVuc2lnbmVkIGxvbmcgY29tcHJlc3NUaW1lKSIpfSwKKyAgICB7IkNvbXByZXNzSW1hZ2UiLCAoUHlDRnVuY3Rpb24pUXRfQ29tcHJlc3NJbWFnZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUGl4TWFwSGFuZGxlIHNyYywgUmVjdCBzcmNSZWN0LCBDb2RlY1EgcXVhbGl0eSwgQ29kZWNUeXBlIGNUeXBlLCBJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2MsIFB0ciBkYXRhKSAtPiBOb25lIil9LAorICAgIHsiRGVjb21wcmVzc0ltYWdlIiwgKFB5Q0Z1bmN0aW9uKVF0X0RlY29tcHJlc3NJbWFnZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUHRyIGRhdGEsIEltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYywgUGl4TWFwSGFuZGxlIGRzdCwgUmVjdCBzcmNSZWN0LCBSZWN0IGRzdFJlY3QsIHNob3J0IG1vZGUsIFJnbkhhbmRsZSBtYXNrKSAtPiBOb25lIil9LAorICAgIHsiR2V0U2ltaWxhcml0eSIsIChQeUNGdW5jdGlvbilRdF9HZXRTaW1pbGFyaXR5LCAxLAorICAgICBQeURvY19TVFIoIihQaXhNYXBIYW5kbGUgc3JjLCBSZWN0IHNyY1JlY3QsIEltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYywgUHRyIGRhdGEpIC0+IChGaXhlZCBzaW1pbGFyaXR5KSIpfSwKKyAgICB7IkdldEltYWdlRGVzY3JpcHRpb25DVGFibGUiLCAoUHlDRnVuY3Rpb24pUXRfR2V0SW1hZ2VEZXNjcmlwdGlvbkNUYWJsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjKSAtPiAoQ1RhYkhhbmRsZSBjdGFibGUpIil9LAorICAgIHsiU2V0SW1hZ2VEZXNjcmlwdGlvbkNUYWJsZSIsIChQeUNGdW5jdGlvbilRdF9TZXRJbWFnZURlc2NyaXB0aW9uQ1RhYmxlLCAxLAorICAgICBQeURvY19TVFIoIihJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2MsIENUYWJIYW5kbGUgY3RhYmxlKSAtPiBOb25lIil9LAorICAgIHsiR2V0SW1hZ2VEZXNjcmlwdGlvbkV4dGVuc2lvbiIsIChQeUNGdW5jdGlvbilRdF9HZXRJbWFnZURlc2NyaXB0aW9uRXh0ZW5zaW9uLCAxLAorICAgICBQeURvY19TVFIoIihJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2MsIGxvbmcgaWRUeXBlLCBsb25nIGluZGV4KSAtPiAoSGFuZGxlIGV4dGVuc2lvbikiKX0sCisgICAgeyJBZGRJbWFnZURlc2NyaXB0aW9uRXh0ZW5zaW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X0FkZEltYWdlRGVzY3JpcHRpb25FeHRlbnNpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKEltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYywgSGFuZGxlIGV4dGVuc2lvbiwgbG9uZyBpZFR5cGUpIC0+IE5vbmUiKX0sCisgICAgeyJSZW1vdmVJbWFnZURlc2NyaXB0aW9uRXh0ZW5zaW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X1JlbW92ZUltYWdlRGVzY3JpcHRpb25FeHRlbnNpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKEltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYywgbG9uZyBpZFR5cGUsIGxvbmcgaW5kZXgpIC0+IE5vbmUiKX0sCisgICAgeyJDb3VudEltYWdlRGVzY3JpcHRpb25FeHRlbnNpb25UeXBlIiwgKFB5Q0Z1bmN0aW9uKVF0X0NvdW50SW1hZ2VEZXNjcmlwdGlvbkV4dGVuc2lvblR5cGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYywgbG9uZyBpZFR5cGUpIC0+IChsb25nIGNvdW50KSIpfSwKKyAgICB7IkdldE5leHRJbWFnZURlc2NyaXB0aW9uRXh0ZW5zaW9uVHlwZSIsIChQeUNGdW5jdGlvbilRdF9HZXROZXh0SW1hZ2VEZXNjcmlwdGlvbkV4dGVuc2lvblR5cGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYykgLT4gKGxvbmcgaWRUeXBlKSIpfSwKKyAgICB7IkZpbmRDb2RlYyIsIChQeUNGdW5jdGlvbilRdF9GaW5kQ29kZWMsIDEsCisgICAgIFB5RG9jX1NUUigiKENvZGVjVHlwZSBjVHlwZSwgQ29kZWNDb21wb25lbnQgc3BlY0NvZGVjKSAtPiAoQ29tcHJlc3NvckNvbXBvbmVudCBjb21wcmVzc29yLCBEZWNvbXByZXNzb3JDb21wb25lbnQgZGVjb21wcmVzc29yKSIpfSwKKyAgICB7IkNvbXByZXNzUGljdHVyZSIsIChQeUNGdW5jdGlvbilRdF9Db21wcmVzc1BpY3R1cmUsIDEsCisgICAgIFB5RG9jX1NUUigiKFBpY0hhbmRsZSBzcmNQaWN0dXJlLCBQaWNIYW5kbGUgZHN0UGljdHVyZSwgQ29kZWNRIHF1YWxpdHksIENvZGVjVHlwZSBjVHlwZSkgLT4gTm9uZSIpfSwKKyAgICB7IkNvbXByZXNzUGljdHVyZUZpbGUiLCAoUHlDRnVuY3Rpb24pUXRfQ29tcHJlc3NQaWN0dXJlRmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgc3JjUmVmTnVtLCBzaG9ydCBkc3RSZWZOdW0sIENvZGVjUSBxdWFsaXR5LCBDb2RlY1R5cGUgY1R5cGUpIC0+IE5vbmUiKX0sCisgICAgeyJDb252ZXJ0SW1hZ2UiLCAoUHlDRnVuY3Rpb24pUXRfQ29udmVydEltYWdlLCAxLAorICAgICBQeURvY19TVFIoIihJbWFnZURlc2NyaXB0aW9uSGFuZGxlIHNyY0RELCBQdHIgc3JjRGF0YSwgc2hvcnQgY29sb3JEZXB0aCwgQ1RhYkhhbmRsZSBjdGFibGUsIENvZGVjUSBhY2N1cmFjeSwgQ29kZWNRIHF1YWxpdHksIENvZGVjVHlwZSBjVHlwZSwgQ29kZWNDb21wb25lbnQgY29kZWMsIEltYWdlRGVzY3JpcHRpb25IYW5kbGUgZHN0REQsIFB0ciBkc3REYXRhKSAtPiBOb25lIil9LAorICAgIHsiQWRkRmlsZVByZXZpZXciLCAoUHlDRnVuY3Rpb24pUXRfQWRkRmlsZVByZXZpZXcsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IHJlc1JlZk51bSwgT1NUeXBlIHByZXZpZXdUeXBlLCBIYW5kbGUgcHJldmlld0RhdGEpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRCZXN0RGV2aWNlUmVjdCIsIChQeUNGdW5jdGlvbilRdF9HZXRCZXN0RGV2aWNlUmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoR0RIYW5kbGUgZ2RoLCBSZWN0IHJwKSIpfSwKKyAgICB7IkdESGFzU2NhbGUiLCAoUHlDRnVuY3Rpb24pUXRfR0RIYXNTY2FsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR0RIYW5kbGUgZ2RoLCBzaG9ydCBkZXB0aCkgLT4gKEZpeGVkIHNjYWxlKSIpfSwKKyAgICB7IkdER2V0U2NhbGUiLCAoUHlDRnVuY3Rpb24pUXRfR0RHZXRTY2FsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR0RIYW5kbGUgZ2RoKSAtPiAoRml4ZWQgc2NhbGUsIHNob3J0IGZsYWdzKSIpfSwKKyAgICB7IkdEU2V0U2NhbGUiLCAoUHlDRnVuY3Rpb24pUXRfR0RTZXRTY2FsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR0RIYW5kbGUgZ2RoLCBGaXhlZCBzY2FsZSwgc2hvcnQgZmxhZ3MpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRHcmFwaGljc0ltcG9ydGVyRm9yRmlsZSIsIChQeUNGdW5jdGlvbilRdF9HZXRHcmFwaGljc0ltcG9ydGVyRm9yRmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRlNTcGVjIHRoZUZpbGUpIC0+IChDb21wb25lbnRJbnN0YW5jZSBnaSkiKX0sCisgICAgeyJHZXRHcmFwaGljc0ltcG9ydGVyRm9yRGF0YVJlZiIsIChQeUNGdW5jdGlvbilRdF9HZXRHcmFwaGljc0ltcG9ydGVyRm9yRGF0YVJlZiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSGFuZGxlIGRhdGFSZWYsIE9TVHlwZSBkYXRhUmVmVHlwZSkgLT4gKENvbXBvbmVudEluc3RhbmNlIGdpKSIpfSwKKyAgICB7IkdldEdyYXBoaWNzSW1wb3J0ZXJGb3JGaWxlV2l0aEZsYWdzIiwgKFB5Q0Z1bmN0aW9uKVF0X0dldEdyYXBoaWNzSW1wb3J0ZXJGb3JGaWxlV2l0aEZsYWdzLCAxLAorICAgICBQeURvY19TVFIoIihGU1NwZWMgdGhlRmlsZSwgbG9uZyBmbGFncykgLT4gKENvbXBvbmVudEluc3RhbmNlIGdpKSIpfSwKKyAgICB7IkdldEdyYXBoaWNzSW1wb3J0ZXJGb3JEYXRhUmVmV2l0aEZsYWdzIiwgKFB5Q0Z1bmN0aW9uKVF0X0dldEdyYXBoaWNzSW1wb3J0ZXJGb3JEYXRhUmVmV2l0aEZsYWdzLCAxLAorICAgICBQeURvY19TVFIoIihIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlLCBsb25nIGZsYWdzKSAtPiAoQ29tcG9uZW50SW5zdGFuY2UgZ2kpIil9LAorICAgIHsiTWFrZUltYWdlRGVzY3JpcHRpb25Gb3JQaXhNYXAiLCAoUHlDRnVuY3Rpb24pUXRfTWFrZUltYWdlRGVzY3JpcHRpb25Gb3JQaXhNYXAsIDEsCisgICAgIFB5RG9jX1NUUigiKFBpeE1hcEhhbmRsZSBwaXhtYXApIC0+IChJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGlkaCkiKX0sCisgICAgeyJNYWtlSW1hZ2VEZXNjcmlwdGlvbkZvckVmZmVjdCIsIChQeUNGdW5jdGlvbilRdF9NYWtlSW1hZ2VEZXNjcmlwdGlvbkZvckVmZmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoT1NUeXBlIGVmZmVjdFR5cGUpIC0+IChJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGlkaCkiKX0sCisgICAgeyJRVEdldFBpeGVsU2l6ZSIsIChQeUNGdW5jdGlvbilRdF9RVEdldFBpeGVsU2l6ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoT1NUeXBlIFBpeGVsRm9ybWF0KSAtPiAoc2hvcnQgX3J2KSIpfSwKKyAgICB7IlFUR2V0UGl4ZWxGb3JtYXREZXB0aEZvckltYWdlRGVzY3JpcHRpb24iLCAoUHlDRnVuY3Rpb24pUXRfUVRHZXRQaXhlbEZvcm1hdERlcHRoRm9ySW1hZ2VEZXNjcmlwdGlvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoT1NUeXBlIFBpeGVsRm9ybWF0KSAtPiAoc2hvcnQgX3J2KSIpfSwKKyAgICB7IlFUR2V0UGl4TWFwSGFuZGxlUm93Qnl0ZXMiLCAoUHlDRnVuY3Rpb24pUXRfUVRHZXRQaXhNYXBIYW5kbGVSb3dCeXRlcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoUGl4TWFwSGFuZGxlIHBtKSAtPiAobG9uZyBfcnYpIil9LAorICAgIHsiUVRTZXRQaXhNYXBIYW5kbGVSb3dCeXRlcyIsIChQeUNGdW5jdGlvbilRdF9RVFNldFBpeE1hcEhhbmRsZVJvd0J5dGVzLCAxLAorICAgICBQeURvY19TVFIoIihQaXhNYXBIYW5kbGUgcG0sIGxvbmcgcm93Qnl0ZXMpIC0+IE5vbmUiKX0sCisgICAgeyJRVEdldFBpeE1hcEhhbmRsZUdhbW1hTGV2ZWwiLCAoUHlDRnVuY3Rpb24pUXRfUVRHZXRQaXhNYXBIYW5kbGVHYW1tYUxldmVsLCAxLAorICAgICBQeURvY19TVFIoIihQaXhNYXBIYW5kbGUgcG0pIC0+IChGaXhlZCBfcnYpIil9LAorICAgIHsiUVRTZXRQaXhNYXBIYW5kbGVHYW1tYUxldmVsIiwgKFB5Q0Z1bmN0aW9uKVF0X1FUU2V0UGl4TWFwSGFuZGxlR2FtbWFMZXZlbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUGl4TWFwSGFuZGxlIHBtLCBGaXhlZCBnYW1tYUxldmVsKSAtPiBOb25lIil9LAorICAgIHsiUVRHZXRQaXhNYXBIYW5kbGVSZXF1ZXN0ZWRHYW1tYUxldmVsIiwgKFB5Q0Z1bmN0aW9uKVF0X1FUR2V0UGl4TWFwSGFuZGxlUmVxdWVzdGVkR2FtbWFMZXZlbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUGl4TWFwSGFuZGxlIHBtKSAtPiAoRml4ZWQgX3J2KSIpfSwKKyAgICB7IlFUU2V0UGl4TWFwSGFuZGxlUmVxdWVzdGVkR2FtbWFMZXZlbCIsIChQeUNGdW5jdGlvbilRdF9RVFNldFBpeE1hcEhhbmRsZVJlcXVlc3RlZEdhbW1hTGV2ZWwsIDEsCisgICAgIFB5RG9jX1NUUigiKFBpeE1hcEhhbmRsZSBwbSwgRml4ZWQgcmVxdWVzdGVkR2FtbWFMZXZlbCkgLT4gTm9uZSIpfSwKKyAgICB7IkNvbXBBZGQiLCAoUHlDRnVuY3Rpb24pUXRfQ29tcEFkZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAod2lkZSBzcmMsIHdpZGUgZHN0KSIpfSwKKyAgICB7IkNvbXBTdWIiLCAoUHlDRnVuY3Rpb24pUXRfQ29tcFN1YiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAod2lkZSBzcmMsIHdpZGUgZHN0KSIpfSwKKyAgICB7IkNvbXBOZWciLCAoUHlDRnVuY3Rpb24pUXRfQ29tcE5lZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAod2lkZSBkc3QpIil9LAorICAgIHsiQ29tcFNoaWZ0IiwgKFB5Q0Z1bmN0aW9uKVF0X0NvbXBTaGlmdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgc2hpZnQpIC0+ICh3aWRlIHNyYykiKX0sCisgICAgeyJDb21wTXVsIiwgKFB5Q0Z1bmN0aW9uKVF0X0NvbXBNdWwsIDEsCisgICAgIFB5RG9jX1NUUigiKGxvbmcgc3JjMSwgbG9uZyBzcmMyKSAtPiAod2lkZSBkc3QpIil9LAorICAgIHsiQ29tcERpdiIsIChQeUNGdW5jdGlvbilRdF9Db21wRGl2LCAxLAorICAgICBQeURvY19TVFIoIihsb25nIGRlbm9taW5hdG9yKSAtPiAobG9uZyBfcnYsIHdpZGUgbnVtZXJhdG9yLCBsb25nIHJlbWFpbmRlcikiKX0sCisgICAgeyJDb21wRml4TXVsIiwgKFB5Q0Z1bmN0aW9uKVF0X0NvbXBGaXhNdWwsIDEsCisgICAgIFB5RG9jX1NUUigiKEZpeGVkIGZpeFNyYykgLT4gKHdpZGUgY29tcFNyYywgd2lkZSBjb21wRHN0KSIpfSwKKyAgICB7IkNvbXBNdWxEaXYiLCAoUHlDRnVuY3Rpb24pUXRfQ29tcE11bERpdiwgMSwKKyAgICAgUHlEb2NfU1RSKCIobG9uZyBtdWwsIGxvbmcgZGl2aXNvcikgLT4gKHdpZGUgY28pIil9LAorICAgIHsiQ29tcE11bERpdlRydW5jIiwgKFB5Q0Z1bmN0aW9uKVF0X0NvbXBNdWxEaXZUcnVuYywgMSwKKyAgICAgUHlEb2NfU1RSKCIobG9uZyBtdWwsIGxvbmcgZGl2aXNvcikgLT4gKHdpZGUgY28sIGxvbmcgcmVtYWluZGVyKSIpfSwKKyAgICB7IkNvbXBDb21wYXJlIiwgKFB5Q0Z1bmN0aW9uKVF0X0NvbXBDb21wYXJlLCAxLAorICAgICBQeURvY19TVFIoIih3aWRlIGEsIHdpZGUgbWludXNiKSAtPiAobG9uZyBfcnYpIil9LAorICAgIHsiQ29tcFNxdWFyZVJvb3QiLCAoUHlDRnVuY3Rpb24pUXRfQ29tcFNxdWFyZVJvb3QsIDEsCisgICAgIFB5RG9jX1NUUigiKHdpZGUgc3JjKSAtPiAodW5zaWduZWQgbG9uZyBfcnYpIil9LAorICAgIHsiRml4TXVsRGl2IiwgKFB5Q0Z1bmN0aW9uKVF0X0ZpeE11bERpdiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRml4ZWQgc3JjLCBGaXhlZCBtdWwsIEZpeGVkIGRpdmlzb3IpIC0+IChGaXhlZCBfcnYpIil9LAorICAgIHsiVW5zaWduZWRGaXhNdWxEaXYiLCAoUHlDRnVuY3Rpb24pUXRfVW5zaWduZWRGaXhNdWxEaXYsIDEsCisgICAgIFB5RG9jX1NUUigiKEZpeGVkIHNyYywgRml4ZWQgbXVsLCBGaXhlZCBkaXZpc29yKSAtPiAoRml4ZWQgX3J2KSIpfSwKKyAgICB7IkZpeEV4cDIiLCAoUHlDRnVuY3Rpb24pUXRfRml4RXhwMiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRml4ZWQgc3JjKSAtPiAoRml4ZWQgX3J2KSIpfSwKKyAgICB7IkZpeExvZzIiLCAoUHlDRnVuY3Rpb24pUXRfRml4TG9nMiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRml4ZWQgc3JjKSAtPiAoRml4ZWQgX3J2KSIpfSwKKyAgICB7IkZpeFBvdyIsIChQeUNGdW5jdGlvbilRdF9GaXhQb3csIDEsCisgICAgIFB5RG9jX1NUUigiKEZpeGVkIGJhc2UsIEZpeGVkIGV4cCkgLT4gKEZpeGVkIF9ydikiKX0sCisgICAgeyJHcmFwaGljc0ltcG9ydFNldERhdGFSZWZlcmVuY2UiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRTZXREYXRhUmVmZXJlbmNlLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSwgSGFuZGxlIGRhdGFSZWYsIE9TVHlwZSBkYXRhUmVUeXBlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJHcmFwaGljc0ltcG9ydEdldERhdGFSZWZlcmVuY2UiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRHZXREYXRhUmVmZXJlbmNlLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEhhbmRsZSBkYXRhUmVmLCBPU1R5cGUgZGF0YVJlVHlwZSkiKX0sCisgICAgeyJHcmFwaGljc0ltcG9ydFNldERhdGFGaWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0U2V0RGF0YUZpbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpLCBGU1NwZWMgdGhlRmlsZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NJbXBvcnRHZXREYXRhRmlsZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydEdldERhdGFGaWxlLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSwgRlNTcGVjIHRoZUZpbGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkdyYXBoaWNzSW1wb3J0U2V0RGF0YUhhbmRsZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydFNldERhdGFIYW5kbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpLCBIYW5kbGUgaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NJbXBvcnRHZXREYXRhSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0RGF0YUhhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBIYW5kbGUgaCkiKX0sCisgICAgeyJHcmFwaGljc0ltcG9ydEdldEltYWdlRGVzY3JpcHRpb24iLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRHZXRJbWFnZURlc2NyaXB0aW9uLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYykiKX0sCisgICAgeyJHcmFwaGljc0ltcG9ydEdldERhdGFPZmZzZXRBbmRTaXplIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0RGF0YU9mZnNldEFuZFNpemUsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgc2l6ZSkiKX0sCisgICAgeyJHcmFwaGljc0ltcG9ydFJlYWREYXRhIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0UmVhZERhdGEsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpLCB2b2lkICogZGF0YVB0ciwgdW5zaWduZWQgbG9uZyBkYXRhT2Zmc2V0LCB1bnNpZ25lZCBsb25nIGRhdGFTaXplKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJHcmFwaGljc0ltcG9ydFNldENsaXAiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRTZXRDbGlwLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSwgUmduSGFuZGxlIGNsaXBSZ24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkdyYXBoaWNzSW1wb3J0R2V0Q2xpcCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydEdldENsaXAsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmduSGFuZGxlIGNsaXBSZ24pIil9LAorICAgIHsiR3JhcGhpY3NJbXBvcnRTZXRTb3VyY2VSZWN0IiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0U2V0U291cmNlUmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2ksIFJlY3Qgc291cmNlUmVjdCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NJbXBvcnRHZXRTb3VyY2VSZWN0IiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0U291cmNlUmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSZWN0IHNvdXJjZVJlY3QpIil9LAorICAgIHsiR3JhcGhpY3NJbXBvcnRHZXROYXR1cmFsQm91bmRzIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0TmF0dXJhbEJvdW5kcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSZWN0IG5hdHVyYWxCb3VuZHMpIil9LAorICAgIHsiR3JhcGhpY3NJbXBvcnREcmF3IiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0RHJhdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkdyYXBoaWNzSW1wb3J0U2V0R1dvcmxkIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0U2V0R1dvcmxkLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSwgQ0dyYWZQdHIgcG9ydCwgR0RIYW5kbGUgZ2QpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkdyYXBoaWNzSW1wb3J0R2V0R1dvcmxkIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0R1dvcmxkLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIENHcmFmUHRyIHBvcnQsIEdESGFuZGxlIGdkKSIpfSwKKyAgICB7IkdyYXBoaWNzSW1wb3J0U2V0Qm91bmRzUmVjdCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydFNldEJvdW5kc1JlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpLCBSZWN0IGJvdW5kcykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NJbXBvcnRHZXRCb3VuZHNSZWN0IiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0Qm91bmRzUmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSZWN0IGJvdW5kcykiKX0sCisgICAgeyJHcmFwaGljc0ltcG9ydFNhdmVBc1BpY3R1cmUiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRTYXZlQXNQaWN0dXJlLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSwgRlNTcGVjIGZzcywgU2NyaXB0Q29kZSBzY3JpcHRUYWcpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkdyYXBoaWNzSW1wb3J0U2V0R3JhcGhpY3NNb2RlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0U2V0R3JhcGhpY3NNb2RlLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSwgbG9uZyBncmFwaGljc01vZGUsIFJHQkNvbG9yIG9wQ29sb3IpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkdyYXBoaWNzSW1wb3J0R2V0R3JhcGhpY3NNb2RlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0R3JhcGhpY3NNb2RlLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgZ3JhcGhpY3NNb2RlLCBSR0JDb2xvciBvcENvbG9yKSIpfSwKKyAgICB7IkdyYXBoaWNzSW1wb3J0U2V0UXVhbGl0eSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydFNldFF1YWxpdHksIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpLCBDb2RlY1EgcXVhbGl0eSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NJbXBvcnRHZXRRdWFsaXR5IiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0UXVhbGl0eSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBDb2RlY1EgcXVhbGl0eSkiKX0sCisgICAgeyJHcmFwaGljc0ltcG9ydFNhdmVBc1F1aWNrVGltZUltYWdlRmlsZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydFNhdmVBc1F1aWNrVGltZUltYWdlRmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2ksIEZTU3BlYyBmc3MsIFNjcmlwdENvZGUgc2NyaXB0VGFnKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJHcmFwaGljc0ltcG9ydFNldERhdGFSZWZlcmVuY2VPZmZzZXRBbmRMaW1pdCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydFNldERhdGFSZWZlcmVuY2VPZmZzZXRBbmRMaW1pdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2ksIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIGxpbWl0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJHcmFwaGljc0ltcG9ydEdldERhdGFSZWZlcmVuY2VPZmZzZXRBbmRMaW1pdCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydEdldERhdGFSZWZlcmVuY2VPZmZzZXRBbmRMaW1pdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyBsaW1pdCkiKX0sCisgICAgeyJHcmFwaGljc0ltcG9ydEdldEFsaWFzZWREYXRhUmVmZXJlbmNlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0QWxpYXNlZERhdGFSZWZlcmVuY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSGFuZGxlIGRhdGFSZWYsIE9TVHlwZSBkYXRhUmVmVHlwZSkiKX0sCisgICAgeyJHcmFwaGljc0ltcG9ydFZhbGlkYXRlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0VmFsaWRhdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQm9vbGVhbiB2YWxpZCkiKX0sCisgICAgeyJHcmFwaGljc0ltcG9ydEdldE1ldGFEYXRhIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0TWV0YURhdGEsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpLCB2b2lkICogdXNlckRhdGEpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkdyYXBoaWNzSW1wb3J0R2V0TUlNRVR5cGVMaXN0IiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0TUlNRVR5cGVMaXN0LCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSwgdm9pZCAqIHF0QXRvbUNvbnRhaW5lclB0cikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NJbXBvcnREb2VzRHJhd0FsbFBpeGVscyIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydERvZXNEcmF3QWxsUGl4ZWxzLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHNob3J0IGRyYXdzQWxsUGl4ZWxzKSIpfSwKKyAgICB7IkdyYXBoaWNzSW1wb3J0R2V0QXNQaWN0dXJlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0QXNQaWN0dXJlLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFBpY0hhbmRsZSBwaWN0dXJlKSIpfSwKKyAgICB7IkdyYXBoaWNzSW1wb3J0RXhwb3J0SW1hZ2VGaWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0RXhwb3J0SW1hZ2VGaWxlLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSwgT1NUeXBlIGZpbGVUeXBlLCBPU1R5cGUgZmlsZUNyZWF0b3IsIEZTU3BlYyBmc3MsIFNjcmlwdENvZGUgc2NyaXB0VGFnKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJHcmFwaGljc0ltcG9ydEdldEV4cG9ydEltYWdlVHlwZUxpc3QiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRHZXRFeHBvcnRJbWFnZVR5cGVMaXN0LCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSwgdm9pZCAqIHF0QXRvbUNvbnRhaW5lclB0cikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NJbXBvcnRHZXRFeHBvcnRTZXR0aW5nc0FzQXRvbUNvbnRhaW5lciIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydEdldEV4cG9ydFNldHRpbmdzQXNBdG9tQ29udGFpbmVyLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSwgdm9pZCAqIHF0QXRvbUNvbnRhaW5lclB0cikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NJbXBvcnRTZXRFeHBvcnRTZXR0aW5nc0Zyb21BdG9tQ29udGFpbmVyIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0U2V0RXhwb3J0U2V0dGluZ3NGcm9tQXRvbUNvbnRhaW5lciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2ksIHZvaWQgKiBxdEF0b21Db250YWluZXIpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkdyYXBoaWNzSW1wb3J0R2V0SW1hZ2VDb3VudCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydEdldEltYWdlQ291bnQsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgbG9uZyBpbWFnZUNvdW50KSIpfSwKKyAgICB7IkdyYXBoaWNzSW1wb3J0U2V0SW1hZ2VJbmRleCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydFNldEltYWdlSW5kZXgsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpLCB1bnNpZ25lZCBsb25nIGltYWdlSW5kZXgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkdyYXBoaWNzSW1wb3J0R2V0SW1hZ2VJbmRleCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydEdldEltYWdlSW5kZXgsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgbG9uZyBpbWFnZUluZGV4KSIpfSwKKyAgICB7IkdyYXBoaWNzSW1wb3J0R2V0RGF0YU9mZnNldEFuZFNpemU2NCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydEdldERhdGFPZmZzZXRBbmRTaXplNjQsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgd2lkZSBvZmZzZXQsIHdpZGUgc2l6ZSkiKX0sCisgICAgeyJHcmFwaGljc0ltcG9ydFJlYWREYXRhNjQiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRSZWFkRGF0YTY0LCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSwgdm9pZCAqIGRhdGFQdHIsIHdpZGUgZGF0YU9mZnNldCwgdW5zaWduZWQgbG9uZyBkYXRhU2l6ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NJbXBvcnRTZXREYXRhUmVmZXJlbmNlT2Zmc2V0QW5kTGltaXQ2NCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydFNldERhdGFSZWZlcmVuY2VPZmZzZXRBbmRMaW1pdDY0LCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSwgd2lkZSBvZmZzZXQsIHdpZGUgbGltaXQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkdyYXBoaWNzSW1wb3J0R2V0RGF0YVJlZmVyZW5jZU9mZnNldEFuZExpbWl0NjQiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRHZXREYXRhUmVmZXJlbmNlT2Zmc2V0QW5kTGltaXQ2NCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB3aWRlIG9mZnNldCwgd2lkZSBsaW1pdCkiKX0sCisgICAgeyJHcmFwaGljc0ltcG9ydEdldERlZmF1bHRDbGlwIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0RGVmYXVsdENsaXAsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmduSGFuZGxlIGRlZmF1bHRSZ24pIil9LAorICAgIHsiR3JhcGhpY3NJbXBvcnRHZXREZWZhdWx0R3JhcGhpY3NNb2RlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0RGVmYXVsdEdyYXBoaWNzTW9kZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIGRlZmF1bHRHcmFwaGljc01vZGUsIFJHQkNvbG9yIGRlZmF1bHRPcENvbG9yKSIpfSwKKyAgICB7IkdyYXBoaWNzSW1wb3J0R2V0RGVmYXVsdFNvdXJjZVJlY3QiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRHZXREZWZhdWx0U291cmNlUmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSZWN0IGRlZmF1bHRTb3VyY2VSZWN0KSIpfSwKKyAgICB7IkdyYXBoaWNzSW1wb3J0R2V0Q29sb3JTeW5jUHJvZmlsZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydEdldENvbG9yU3luY1Byb2ZpbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSGFuZGxlIHByb2ZpbGUpIil9LAorICAgIHsiR3JhcGhpY3NJbXBvcnRTZXREZXN0UmVjdCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydFNldERlc3RSZWN0LCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSwgUmVjdCBkZXN0UmVjdCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NJbXBvcnRHZXREZXN0UmVjdCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydEdldERlc3RSZWN0LCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJlY3QgZGVzdFJlY3QpIil9LAorICAgIHsiR3JhcGhpY3NJbXBvcnRTZXRGbGFncyIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydFNldEZsYWdzLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSwgbG9uZyBmbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NJbXBvcnRHZXRGbGFncyIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydEdldEZsYWdzLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgZmxhZ3MpIil9LAorICAgIHsiR3JhcGhpY3NJbXBvcnRHZXRCYXNlRGF0YU9mZnNldEFuZFNpemU2NCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydEdldEJhc2VEYXRhT2Zmc2V0QW5kU2l6ZTY0LCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHdpZGUgb2Zmc2V0LCB3aWRlIHNpemUpIil9LAorICAgIHsiR3JhcGhpY3NJbXBvcnRTZXRJbWFnZUluZGV4VG9UaHVtYm5haWwiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRTZXRJbWFnZUluZGV4VG9UaHVtYm5haWwsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJHcmFwaGljc0V4cG9ydERvRXhwb3J0IiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0RG9FeHBvcnQsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgbG9uZyBhY3R1YWxTaXplV3JpdHRlbikiKX0sCisgICAgeyJHcmFwaGljc0V4cG9ydENhblRyYW5zY29kZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydENhblRyYW5zY29kZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBCb29sZWFuIGNhblRyYW5zY29kZSkiKX0sCisgICAgeyJHcmFwaGljc0V4cG9ydERvVHJhbnNjb2RlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0RG9UcmFuc2NvZGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJHcmFwaGljc0V4cG9ydENhblVzZUNvbXByZXNzb3IiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRDYW5Vc2VDb21wcmVzc29yLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgdm9pZCAqIGNvZGVjU2V0dGluZ3NBdG9tQ29udGFpbmVyUHRyKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQm9vbGVhbiBjYW5Vc2VDb21wcmVzc29yKSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0RG9Vc2VDb21wcmVzc29yIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0RG9Vc2VDb21wcmVzc29yLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgdm9pZCAqIGNvZGVjU2V0dGluZ3NBdG9tQ29udGFpbmVyKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBvdXREZXNjKSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0RG9TdGFuZGFsb25lRXhwb3J0IiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0RG9TdGFuZGFsb25lRXhwb3J0LCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRHZXREZWZhdWx0RmlsZVR5cGVBbmRDcmVhdG9yIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0RGVmYXVsdEZpbGVUeXBlQW5kQ3JlYXRvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBPU1R5cGUgZmlsZVR5cGUsIE9TVHlwZSBmaWxlQ3JlYXRvcikiKX0sCisgICAgeyJHcmFwaGljc0V4cG9ydEdldERlZmF1bHRGaWxlTmFtZUV4dGVuc2lvbiIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydEdldERlZmF1bHRGaWxlTmFtZUV4dGVuc2lvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBPU1R5cGUgZmlsZU5hbWVFeHRlbnNpb24pIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRHZXRNSU1FVHlwZUxpc3QiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRHZXRNSU1FVHlwZUxpc3QsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCB2b2lkICogcXRBdG9tQ29udGFpbmVyUHRyKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJHcmFwaGljc0V4cG9ydFNldFNldHRpbmdzRnJvbUF0b21Db250YWluZXIiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRTZXRTZXR0aW5nc0Zyb21BdG9tQ29udGFpbmVyLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgdm9pZCAqIHF0QXRvbUNvbnRhaW5lcikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRHZXRTZXR0aW5nc0FzQXRvbUNvbnRhaW5lciIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydEdldFNldHRpbmdzQXNBdG9tQ29udGFpbmVyLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgdm9pZCAqIHF0QXRvbUNvbnRhaW5lclB0cikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRHZXRTZXR0aW5nc0FzVGV4dCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydEdldFNldHRpbmdzQXNUZXh0LCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEhhbmRsZSB0aGVUZXh0KSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0U2V0RG9udFJlY29tcHJlc3MiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRTZXREb250UmVjb21wcmVzcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIEJvb2xlYW4gZG9udFJlY29tcHJlc3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0R2V0RG9udFJlY29tcHJlc3MiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRHZXREb250UmVjb21wcmVzcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBCb29sZWFuIGRvbnRSZWNvbXByZXNzKSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0U2V0SW50ZXJsYWNlU3R5bGUiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRTZXRJbnRlcmxhY2VTdHlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIHVuc2lnbmVkIGxvbmcgaW50ZXJsYWNlU3R5bGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0R2V0SW50ZXJsYWNlU3R5bGUiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRHZXRJbnRlcmxhY2VTdHlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBsb25nIGludGVybGFjZVN0eWxlKSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0U2V0TWV0YURhdGEiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRTZXRNZXRhRGF0YSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIHZvaWQgKiB1c2VyRGF0YSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRHZXRNZXRhRGF0YSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydEdldE1ldGFEYXRhLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgdm9pZCAqIHVzZXJEYXRhKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJHcmFwaGljc0V4cG9ydFNldFRhcmdldERhdGFTaXplIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0U2V0VGFyZ2V0RGF0YVNpemUsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCB1bnNpZ25lZCBsb25nIHRhcmdldERhdGFTaXplKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJHcmFwaGljc0V4cG9ydEdldFRhcmdldERhdGFTaXplIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0VGFyZ2V0RGF0YVNpemUsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgbG9uZyB0YXJnZXREYXRhU2l6ZSkiKX0sCisgICAgeyJHcmFwaGljc0V4cG9ydFNldENvbXByZXNzaW9uTWV0aG9kIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0U2V0Q29tcHJlc3Npb25NZXRob2QsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCBsb25nIGNvbXByZXNzaW9uTWV0aG9kKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJHcmFwaGljc0V4cG9ydEdldENvbXByZXNzaW9uTWV0aG9kIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0Q29tcHJlc3Npb25NZXRob2QsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBjb21wcmVzc2lvbk1ldGhvZCkiKX0sCisgICAgeyJHcmFwaGljc0V4cG9ydFNldENvbXByZXNzaW9uUXVhbGl0eSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydFNldENvbXByZXNzaW9uUXVhbGl0eSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIENvZGVjUSBzcGF0aWFsUXVhbGl0eSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRHZXRDb21wcmVzc2lvblF1YWxpdHkiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRHZXRDb21wcmVzc2lvblF1YWxpdHksIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQ29kZWNRIHNwYXRpYWxRdWFsaXR5KSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0U2V0UmVzb2x1dGlvbiIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydFNldFJlc29sdXRpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCBGaXhlZCBob3Jpem9udGFsUmVzb2x1dGlvbiwgRml4ZWQgdmVydGljYWxSZXNvbHV0aW9uKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJHcmFwaGljc0V4cG9ydEdldFJlc29sdXRpb24iLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRHZXRSZXNvbHV0aW9uLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEZpeGVkIGhvcml6b250YWxSZXNvbHV0aW9uLCBGaXhlZCB2ZXJ0aWNhbFJlc29sdXRpb24pIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRTZXREZXB0aCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydFNldERlcHRoLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgbG9uZyBkZXB0aCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRHZXREZXB0aCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydEdldERlcHRoLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgZGVwdGgpIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRTZXRDb2xvclN5bmNQcm9maWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0U2V0Q29sb3JTeW5jUHJvZmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIEhhbmRsZSBjb2xvclN5bmNQcm9maWxlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJHcmFwaGljc0V4cG9ydEdldENvbG9yU3luY1Byb2ZpbGUiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRHZXRDb2xvclN5bmNQcm9maWxlLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEhhbmRsZSBjb2xvclN5bmNQcm9maWxlKSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0U2V0SW5wdXREYXRhUmVmZXJlbmNlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0U2V0SW5wdXREYXRhUmVmZXJlbmNlLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgSGFuZGxlIGRhdGFSZWYsIE9TVHlwZSBkYXRhUmVmVHlwZSwgSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJHcmFwaGljc0V4cG9ydEdldElucHV0RGF0YVJlZmVyZW5jZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydEdldElucHV0RGF0YVJlZmVyZW5jZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlKSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0U2V0SW5wdXRGaWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0U2V0SW5wdXRGaWxlLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgRlNTcGVjIHRoZUZpbGUsIEltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEZpbGUiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEZpbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCBGU1NwZWMgdGhlRmlsZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRTZXRJbnB1dEhhbmRsZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydFNldElucHV0SGFuZGxlLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgSGFuZGxlIGgsIEltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEhhbmRsZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydEdldElucHV0SGFuZGxlLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEhhbmRsZSBoKSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0U2V0SW5wdXRQdHIiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRTZXRJbnB1dFB0ciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIFB0ciBwLCB1bnNpZ25lZCBsb25nIHNpemUsIEltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRTZXRJbnB1dEdyYXBoaWNzSW1wb3J0ZXIiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRTZXRJbnB1dEdyYXBoaWNzSW1wb3J0ZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCBHcmFwaGljc0ltcG9ydENvbXBvbmVudCBncmlwKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJHcmFwaGljc0V4cG9ydEdldElucHV0R3JhcGhpY3NJbXBvcnRlciIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydEdldElucHV0R3JhcGhpY3NJbXBvcnRlciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBHcmFwaGljc0ltcG9ydENvbXBvbmVudCBncmlwKSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0U2V0SW5wdXRQaWN0dXJlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0U2V0SW5wdXRQaWN0dXJlLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgUGljSGFuZGxlIHBpY3R1cmUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0R2V0SW5wdXRQaWN0dXJlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0SW5wdXRQaWN0dXJlLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFBpY0hhbmRsZSBwaWN0dXJlKSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0U2V0SW5wdXRHV29ybGQiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRTZXRJbnB1dEdXb3JsZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIEdXb3JsZFB0ciBnd29ybGQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0R2V0SW5wdXRHV29ybGQiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEdXb3JsZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBHV29ybGRQdHIgZ3dvcmxkKSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0U2V0SW5wdXRQaXhtYXAiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRTZXRJbnB1dFBpeG1hcCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIFBpeE1hcEhhbmRsZSBwaXhtYXApIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0R2V0SW5wdXRQaXhtYXAiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRHZXRJbnB1dFBpeG1hcCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBQaXhNYXBIYW5kbGUgcGl4bWFwKSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0U2V0SW5wdXRPZmZzZXRBbmRMaW1pdCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydFNldElucHV0T2Zmc2V0QW5kTGltaXQsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCB1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyBsaW1pdCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRHZXRJbnB1dE9mZnNldEFuZExpbWl0IiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0SW5wdXRPZmZzZXRBbmRMaW1pdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyBsaW1pdCkiKX0sCisgICAgeyJHcmFwaGljc0V4cG9ydE1heUV4cG9ydGVyUmVhZElucHV0RGF0YSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydE1heUV4cG9ydGVyUmVhZElucHV0RGF0YSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBCb29sZWFuIG1heVJlYWRJbnB1dERhdGEpIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRHZXRJbnB1dERhdGFTaXplIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0SW5wdXREYXRhU2l6ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBsb25nIHNpemUpIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRSZWFkSW5wdXREYXRhIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0UmVhZElucHV0RGF0YSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIHZvaWQgKiBkYXRhUHRyLCB1bnNpZ25lZCBsb25nIGRhdGFPZmZzZXQsIHVuc2lnbmVkIGxvbmcgZGF0YVNpemUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0R2V0SW5wdXRJbWFnZURlc2NyaXB0aW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0SW5wdXRJbWFnZURlc2NyaXB0aW9uLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYykiKX0sCisgICAgeyJHcmFwaGljc0V4cG9ydEdldElucHV0SW1hZ2VEaW1lbnNpb25zIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0SW5wdXRJbWFnZURpbWVuc2lvbnMsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmVjdCBkaW1lbnNpb25zKSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0R2V0SW5wdXRJbWFnZURlcHRoIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0SW5wdXRJbWFnZURlcHRoLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgaW5wdXREZXB0aCkiKX0sCisgICAgeyJHcmFwaGljc0V4cG9ydERyYXdJbnB1dEltYWdlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0RHJhd0lucHV0SW1hZ2UsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCBDR3JhZlB0ciBndywgR0RIYW5kbGUgZ2QsIFJlY3Qgc3JjUmVjdCwgUmVjdCBkc3RSZWN0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJHcmFwaGljc0V4cG9ydFNldE91dHB1dERhdGFSZWZlcmVuY2UiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRTZXRPdXRwdXREYXRhUmVmZXJlbmNlLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgSGFuZGxlIGRhdGFSZWYsIE9TVHlwZSBkYXRhUmVmVHlwZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXREYXRhUmVmZXJlbmNlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0T3V0cHV0RGF0YVJlZmVyZW5jZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlKSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0U2V0T3V0cHV0RmlsZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydFNldE91dHB1dEZpbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCBGU1NwZWMgdGhlRmlsZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXRGaWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0T3V0cHV0RmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIEZTU3BlYyB0aGVGaWxlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJHcmFwaGljc0V4cG9ydFNldE91dHB1dEhhbmRsZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydFNldE91dHB1dEhhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIEhhbmRsZSBoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJHcmFwaGljc0V4cG9ydEdldE91dHB1dEhhbmRsZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydEdldE91dHB1dEhhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBIYW5kbGUgaCkiKX0sCisgICAgeyJHcmFwaGljc0V4cG9ydFNldE91dHB1dE9mZnNldEFuZE1heFNpemUiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRTZXRPdXRwdXRPZmZzZXRBbmRNYXhTaXplLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgdW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgbWF4U2l6ZSwgQm9vbGVhbiB0cnVuY2F0ZUZpbGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0R2V0T3V0cHV0T2Zmc2V0QW5kTWF4U2l6ZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydEdldE91dHB1dE9mZnNldEFuZE1heFNpemUsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgbWF4U2l6ZSwgQm9vbGVhbiB0cnVuY2F0ZUZpbGUpIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRTZXRPdXRwdXRGaWxlVHlwZUFuZENyZWF0b3IiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRTZXRPdXRwdXRGaWxlVHlwZUFuZENyZWF0b3IsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCBPU1R5cGUgZmlsZVR5cGUsIE9TVHlwZSBmaWxlQ3JlYXRvcikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXRGaWxlVHlwZUFuZENyZWF0b3IiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXRGaWxlVHlwZUFuZENyZWF0b3IsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgT1NUeXBlIGZpbGVUeXBlLCBPU1R5cGUgZmlsZUNyZWF0b3IpIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRTZXRPdXRwdXRNYXJrIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0U2V0T3V0cHV0TWFyaywgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIHVuc2lnbmVkIGxvbmcgbWFyaykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXRNYXJrIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0T3V0cHV0TWFyaywgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBsb25nIG1hcmspIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRSZWFkT3V0cHV0RGF0YSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydFJlYWRPdXRwdXREYXRhLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgdm9pZCAqIGRhdGFQdHIsIHVuc2lnbmVkIGxvbmcgZGF0YU9mZnNldCwgdW5zaWduZWQgbG9uZyBkYXRhU2l6ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRTZXRUaHVtYm5haWxFbmFibGVkIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0U2V0VGh1bWJuYWlsRW5hYmxlZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIEJvb2xlYW4gZW5hYmxlVGh1bWJuYWlsLCBsb25nIG1heFRodW1ibmFpbFdpZHRoLCBsb25nIG1heFRodW1ibmFpbEhlaWdodCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRHZXRUaHVtYm5haWxFbmFibGVkIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0VGh1bWJuYWlsRW5hYmxlZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBCb29sZWFuIHRodW1ibmFpbEVuYWJsZWQsIGxvbmcgbWF4VGh1bWJuYWlsV2lkdGgsIGxvbmcgbWF4VGh1bWJuYWlsSGVpZ2h0KSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0U2V0RXhpZkVuYWJsZWQiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRTZXRFeGlmRW5hYmxlZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIEJvb2xlYW4gZW5hYmxlRXhpZikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRHZXRFeGlmRW5hYmxlZCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydEdldEV4aWZFbmFibGVkLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEJvb2xlYW4gZXhpZkVuYWJsZWQpIil9LAorICAgIHsiSW1hZ2VUcmFuc2NvZGVyQmVnaW5TZXF1ZW5jZSIsIChQeUNGdW5jdGlvbilRdF9JbWFnZVRyYW5zY29kZXJCZWdpblNlcXVlbmNlLCAxLAorICAgICBQeURvY19TVFIoIihJbWFnZVRyYW5zY29kZXJDb21wb25lbnQgaXRjLCBJbWFnZURlc2NyaXB0aW9uSGFuZGxlIHNyY0Rlc2MsIHZvaWQgKiBkYXRhLCBsb25nIGRhdGFTaXplKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkc3REZXNjKSIpfSwKKyAgICB7IkltYWdlVHJhbnNjb2RlckRpc3Bvc2VEYXRhIiwgKFB5Q0Z1bmN0aW9uKVF0X0ltYWdlVHJhbnNjb2RlckRpc3Bvc2VEYXRhLCAxLAorICAgICBQeURvY19TVFIoIihJbWFnZVRyYW5zY29kZXJDb21wb25lbnQgaXRjLCB2b2lkICogZHN0RGF0YSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiSW1hZ2VUcmFuc2NvZGVyRW5kU2VxdWVuY2UiLCAoUHlDRnVuY3Rpb24pUXRfSW1hZ2VUcmFuc2NvZGVyRW5kU2VxdWVuY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKEltYWdlVHJhbnNjb2RlckNvbXBvbmVudCBpdGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkNsb2NrR2V0VGltZSIsIChQeUNGdW5jdGlvbilRdF9DbG9ja0dldFRpbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGFDbG9jaykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFRpbWVSZWNvcmQgb3V0KSIpfSwKKyAgICB7IkNsb2NrU2V0VGltZUJhc2UiLCAoUHlDRnVuY3Rpb24pUXRfQ2xvY2tTZXRUaW1lQmFzZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ29tcG9uZW50SW5zdGFuY2UgYUNsb2NrLCBUaW1lQmFzZSB0YikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiQ2xvY2tHZXRSYXRlIiwgKFB5Q0Z1bmN0aW9uKVF0X0Nsb2NrR2V0UmF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ29tcG9uZW50SW5zdGFuY2UgYUNsb2NrKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgRml4ZWQgcmF0ZSkiKX0sCisgICAgeyJTQ1Bvc2l0aW9uUmVjdCIsIChQeUNGdW5jdGlvbilRdF9TQ1Bvc2l0aW9uUmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ29tcG9uZW50SW5zdGFuY2UgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSZWN0IHJwLCBQb2ludCB3aGVyZSkiKX0sCisgICAgeyJTQ1Bvc2l0aW9uRGlhbG9nIiwgKFB5Q0Z1bmN0aW9uKVF0X1NDUG9zaXRpb25EaWFsb2csIDEsCisgICAgIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGNpLCBzaG9ydCBpZCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFBvaW50IHdoZXJlKSIpfSwKKyAgICB7IlNDU2V0VGVzdEltYWdlUGljdEhhbmRsZSIsIChQeUNGdW5jdGlvbilRdF9TQ1NldFRlc3RJbWFnZVBpY3RIYW5kbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGNpLCBQaWNIYW5kbGUgdGVzdFBpY3QsIHNob3J0IHRlc3RGbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJlY3QgdGVzdFJlY3QpIil9LAorICAgIHsiU0NTZXRUZXN0SW1hZ2VQaWN0RmlsZSIsIChQeUNGdW5jdGlvbilRdF9TQ1NldFRlc3RJbWFnZVBpY3RGaWxlLCAxLAorICAgICBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBjaSwgc2hvcnQgdGVzdEZpbGVSZWYsIHNob3J0IHRlc3RGbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJlY3QgdGVzdFJlY3QpIil9LAorICAgIHsiU0NTZXRUZXN0SW1hZ2VQaXhNYXAiLCAoUHlDRnVuY3Rpb24pUXRfU0NTZXRUZXN0SW1hZ2VQaXhNYXAsIDEsCisgICAgIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGNpLCBQaXhNYXBIYW5kbGUgdGVzdFBpeE1hcCwgc2hvcnQgdGVzdEZsYWdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmVjdCB0ZXN0UmVjdCkiKX0sCisgICAgeyJTQ0dldEJlc3REZXZpY2VSZWN0IiwgKFB5Q0Z1bmN0aW9uKVF0X1NDR2V0QmVzdERldmljZVJlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmVjdCByKSIpfSwKKyAgICB7IlNDUmVxdWVzdEltYWdlU2V0dGluZ3MiLCAoUHlDRnVuY3Rpb24pUXRfU0NSZXF1ZXN0SW1hZ2VTZXR0aW5ncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ29tcG9uZW50SW5zdGFuY2UgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNDQ29tcHJlc3NJbWFnZSIsIChQeUNGdW5jdGlvbilRdF9TQ0NvbXByZXNzSW1hZ2UsIDEsCisgICAgIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGNpLCBQaXhNYXBIYW5kbGUgc3JjLCBSZWN0IHNyY1JlY3QpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2MsIEhhbmRsZSBkYXRhKSIpfSwKKyAgICB7IlNDQ29tcHJlc3NQaWN0dXJlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NDQ29tcHJlc3NQaWN0dXJlLCAxLAorICAgICBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBjaSwgUGljSGFuZGxlIHNyY1BpY3R1cmUsIFBpY0hhbmRsZSBkc3RQaWN0dXJlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTQ0NvbXByZXNzUGljdHVyZUZpbGUiLCAoUHlDRnVuY3Rpb24pUXRfU0NDb21wcmVzc1BpY3R1cmVGaWxlLCAxLAorICAgICBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBjaSwgc2hvcnQgc3JjUmVmTnVtLCBzaG9ydCBkc3RSZWZOdW0pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNDUmVxdWVzdFNlcXVlbmNlU2V0dGluZ3MiLCAoUHlDRnVuY3Rpb24pUXRfU0NSZXF1ZXN0U2VxdWVuY2VTZXR0aW5ncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ29tcG9uZW50SW5zdGFuY2UgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNDQ29tcHJlc3NTZXF1ZW5jZUJlZ2luIiwgKFB5Q0Z1bmN0aW9uKVF0X1NDQ29tcHJlc3NTZXF1ZW5jZUJlZ2luLCAxLAorICAgICBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBjaSwgUGl4TWFwSGFuZGxlIHNyYywgUmVjdCBzcmNSZWN0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjKSIpfSwKKyAgICB7IlNDQ29tcHJlc3NTZXF1ZW5jZUZyYW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X1NDQ29tcHJlc3NTZXF1ZW5jZUZyYW1lLCAxLAorICAgICBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBjaSwgUGl4TWFwSGFuZGxlIHNyYywgUmVjdCBzcmNSZWN0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSGFuZGxlIGRhdGEsIGxvbmcgZGF0YVNpemUsIHNob3J0IG5vdFN5bmNGbGFnKSIpfSwKKyAgICB7IlNDQ29tcHJlc3NTZXF1ZW5jZUVuZCIsIChQeUNGdW5jdGlvbilRdF9TQ0NvbXByZXNzU2VxdWVuY2VFbmQsIDEsCisgICAgIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTQ0RlZmF1bHRQaWN0SGFuZGxlU2V0dGluZ3MiLCAoUHlDRnVuY3Rpb24pUXRfU0NEZWZhdWx0UGljdEhhbmRsZVNldHRpbmdzLCAxLAorICAgICBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBjaSwgUGljSGFuZGxlIHNyY1BpY3R1cmUsIHNob3J0IG1vdGlvbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0NEZWZhdWx0UGljdEZpbGVTZXR0aW5ncyIsIChQeUNGdW5jdGlvbilRdF9TQ0RlZmF1bHRQaWN0RmlsZVNldHRpbmdzLCAxLAorICAgICBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBjaSwgc2hvcnQgc3JjUmVmLCBzaG9ydCBtb3Rpb24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNDRGVmYXVsdFBpeE1hcFNldHRpbmdzIiwgKFB5Q0Z1bmN0aW9uKVF0X1NDRGVmYXVsdFBpeE1hcFNldHRpbmdzLCAxLAorICAgICBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBjaSwgUGl4TWFwSGFuZGxlIHNyYywgc2hvcnQgbW90aW9uKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTQ0dldEluZm8iLCAoUHlDRnVuY3Rpb24pUXRfU0NHZXRJbmZvLCAxLAorICAgICBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBjaSwgT1NUeXBlIGluZm9UeXBlLCB2b2lkICogaW5mbykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0NTZXRJbmZvIiwgKFB5Q0Z1bmN0aW9uKVF0X1NDU2V0SW5mbywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ29tcG9uZW50SW5zdGFuY2UgY2ksIE9TVHlwZSBpbmZvVHlwZSwgdm9pZCAqIGluZm8pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNDU2V0Q29tcHJlc3NGbGFncyIsIChQeUNGdW5jdGlvbilRdF9TQ1NldENvbXByZXNzRmxhZ3MsIDEsCisgICAgIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGNpLCBsb25nIGZsYWdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTQ0dldENvbXByZXNzRmxhZ3MiLCAoUHlDRnVuY3Rpb24pUXRfU0NHZXRDb21wcmVzc0ZsYWdzLCAxLAorICAgICBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgZmxhZ3MpIil9LAorICAgIHsiU0NHZXRTZXR0aW5nc0FzVGV4dCIsIChQeUNGdW5jdGlvbilRdF9TQ0dldFNldHRpbmdzQXNUZXh0LCAxLAorICAgICBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEhhbmRsZSB0ZXh0KSIpfSwKKyAgICB7IlNDQXN5bmNJZGxlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NDQXN5bmNJZGxlLCAxLAorICAgICBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiVHdlZW5lclJlc2V0IiwgKFB5Q0Z1bmN0aW9uKVF0X1R3ZWVuZXJSZXNldCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVHdlZW5lckNvbXBvbmVudCB0YykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiVENHZXRTb3VyY2VSZWYiLCAoUHlDRnVuY3Rpb24pUXRfVENHZXRTb3VyY2VSZWYsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgVGltZUNvZGVEZXNjcmlwdGlvbkhhbmRsZSB0Y2RIKSAtPiAoSGFuZGxlckVycm9yIF9ydiwgVXNlckRhdGEgc3JlZkgpIil9LAorICAgIHsiVENTZXRTb3VyY2VSZWYiLCAoUHlDRnVuY3Rpb24pUXRfVENTZXRTb3VyY2VSZWYsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgVGltZUNvZGVEZXNjcmlwdGlvbkhhbmRsZSB0Y2RILCBVc2VyRGF0YSBzcmVmSCkgLT4gKEhhbmRsZXJFcnJvciBfcnYpIil9LAorICAgIHsiVENTZXRUaW1lQ29kZUZsYWdzIiwgKFB5Q0Z1bmN0aW9uKVF0X1RDU2V0VGltZUNvZGVGbGFncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBsb25nIGZsYWdzLCBsb25nIGZsYWdzTWFzaykgLT4gKEhhbmRsZXJFcnJvciBfcnYpIil9LAorICAgIHsiVENHZXRUaW1lQ29kZUZsYWdzIiwgKFB5Q0Z1bmN0aW9uKVF0X1RDR2V0VGltZUNvZGVGbGFncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoSGFuZGxlckVycm9yIF9ydiwgbG9uZyBmbGFncykiKX0sCisgICAgeyJNb3ZpZUltcG9ydEhhbmRsZSIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUltcG9ydEhhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTW92aWVJbXBvcnRDb21wb25lbnQgY2ksIEhhbmRsZSBkYXRhSCwgTW92aWUgdGhlTW92aWUsIFRyYWNrIHRhcmdldFRyYWNrLCBUaW1lVmFsdWUgYXRUaW1lLCBsb25nIGluRmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBUcmFjayB1c2VkVHJhY2ssIFRpbWVWYWx1ZSBhZGRlZER1cmF0aW9uLCBsb25nIG91dEZsYWdzKSIpfSwKKyAgICB7Ik1vdmllSW1wb3J0RmlsZSIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUltcG9ydEZpbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKE1vdmllSW1wb3J0Q29tcG9uZW50IGNpLCBGU1NwZWMgdGhlRmlsZSwgTW92aWUgdGhlTW92aWUsIFRyYWNrIHRhcmdldFRyYWNrLCBUaW1lVmFsdWUgYXRUaW1lLCBsb25nIGluRmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBUcmFjayB1c2VkVHJhY2ssIFRpbWVWYWx1ZSBhZGRlZER1cmF0aW9uLCBsb25nIG91dEZsYWdzKSIpfSwKKyAgICB7Ik1vdmllSW1wb3J0U2V0U2FtcGxlRHVyYXRpb24iLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVJbXBvcnRTZXRTYW1wbGVEdXJhdGlvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTW92aWVJbXBvcnRDb21wb25lbnQgY2ksIFRpbWVWYWx1ZSBkdXJhdGlvbiwgVGltZVNjYWxlIHNjYWxlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNb3ZpZUltcG9ydFNldFNhbXBsZURlc2NyaXB0aW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllSW1wb3J0U2V0U2FtcGxlRGVzY3JpcHRpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKE1vdmllSW1wb3J0Q29tcG9uZW50IGNpLCBTYW1wbGVEZXNjcmlwdGlvbkhhbmRsZSBkZXNjLCBPU1R5cGUgbWVkaWFUeXBlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNb3ZpZUltcG9ydFNldE1lZGlhRmlsZSIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUltcG9ydFNldE1lZGlhRmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTW92aWVJbXBvcnRDb21wb25lbnQgY2ksIEFsaWFzSGFuZGxlIGFsaWFzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNb3ZpZUltcG9ydFNldERpbWVuc2lvbnMiLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVJbXBvcnRTZXREaW1lbnNpb25zLCAxLAorICAgICBQeURvY19TVFIoIihNb3ZpZUltcG9ydENvbXBvbmVudCBjaSwgRml4ZWQgd2lkdGgsIEZpeGVkIGhlaWdodCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTW92aWVJbXBvcnRTZXRDaHVua1NpemUiLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVJbXBvcnRTZXRDaHVua1NpemUsIDEsCisgICAgIFB5RG9jX1NUUigiKE1vdmllSW1wb3J0Q29tcG9uZW50IGNpLCBsb25nIGNodW5rU2l6ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTW92aWVJbXBvcnRTZXRBdXhpbGlhcnlEYXRhIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllSW1wb3J0U2V0QXV4aWxpYXJ5RGF0YSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTW92aWVJbXBvcnRDb21wb25lbnQgY2ksIEhhbmRsZSBkYXRhLCBPU1R5cGUgaGFuZGxlVHlwZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTW92aWVJbXBvcnRTZXRGcm9tU2NyYXAiLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVJbXBvcnRTZXRGcm9tU2NyYXAsIDEsCisgICAgIFB5RG9jX1NUUigiKE1vdmllSW1wb3J0Q29tcG9uZW50IGNpLCBCb29sZWFuIGZyb21TY3JhcCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTW92aWVJbXBvcnREb1VzZXJEaWFsb2ciLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVJbXBvcnREb1VzZXJEaWFsb2csIDEsCisgICAgIFB5RG9jX1NUUigiKE1vdmllSW1wb3J0Q29tcG9uZW50IGNpLCBGU1NwZWMgdGhlRmlsZSwgSGFuZGxlIHRoZURhdGEpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBCb29sZWFuIGNhbmNlbGVkKSIpfSwKKyAgICB7Ik1vdmllSW1wb3J0U2V0RHVyYXRpb24iLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVJbXBvcnRTZXREdXJhdGlvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTW92aWVJbXBvcnRDb21wb25lbnQgY2ksIFRpbWVWYWx1ZSBkdXJhdGlvbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTW92aWVJbXBvcnRHZXRBdXhpbGlhcnlEYXRhVHlwZSIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUltcG9ydEdldEF1eGlsaWFyeURhdGFUeXBlLCAxLAorICAgICBQeURvY19TVFIoIihNb3ZpZUltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIE9TVHlwZSBhdXhUeXBlKSIpfSwKKyAgICB7Ik1vdmllSW1wb3J0VmFsaWRhdGUiLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVJbXBvcnRWYWxpZGF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTW92aWVJbXBvcnRDb21wb25lbnQgY2ksIEZTU3BlYyB0aGVGaWxlLCBIYW5kbGUgdGhlRGF0YSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEJvb2xlYW4gdmFsaWQpIil9LAorICAgIHsiTW92aWVJbXBvcnRHZXRGaWxlVHlwZSIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUltcG9ydEdldEZpbGVUeXBlLCAxLAorICAgICBQeURvY19TVFIoIihNb3ZpZUltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIE9TVHlwZSBmaWxlVHlwZSkiKX0sCisgICAgeyJNb3ZpZUltcG9ydERhdGFSZWYiLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVJbXBvcnREYXRhUmVmLCAxLAorICAgICBQeURvY19TVFIoIihNb3ZpZUltcG9ydENvbXBvbmVudCBjaSwgSGFuZGxlIGRhdGFSZWYsIE9TVHlwZSBkYXRhUmVmVHlwZSwgTW92aWUgdGhlTW92aWUsIFRyYWNrIHRhcmdldFRyYWNrLCBUaW1lVmFsdWUgYXRUaW1lLCBsb25nIGluRmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBUcmFjayB1c2VkVHJhY2ssIFRpbWVWYWx1ZSBhZGRlZER1cmF0aW9uLCBsb25nIG91dEZsYWdzKSIpfSwKKyAgICB7Ik1vdmllSW1wb3J0R2V0U2FtcGxlRGVzY3JpcHRpb24iLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVJbXBvcnRHZXRTYW1wbGVEZXNjcmlwdGlvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTW92aWVJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBTYW1wbGVEZXNjcmlwdGlvbkhhbmRsZSBkZXNjLCBPU1R5cGUgbWVkaWFUeXBlKSIpfSwKKyAgICB7Ik1vdmllSW1wb3J0U2V0T2Zmc2V0QW5kTGltaXQiLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVJbXBvcnRTZXRPZmZzZXRBbmRMaW1pdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTW92aWVJbXBvcnRDb21wb25lbnQgY2ksIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIGxpbWl0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNb3ZpZUltcG9ydFNldE9mZnNldEFuZExpbWl0NjQiLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVJbXBvcnRTZXRPZmZzZXRBbmRMaW1pdDY0LCAxLAorICAgICBQeURvY19TVFIoIihNb3ZpZUltcG9ydENvbXBvbmVudCBjaSwgd2lkZSBvZmZzZXQsIHdpZGUgbGltaXQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1vdmllSW1wb3J0SWRsZSIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUltcG9ydElkbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKE1vdmllSW1wb3J0Q29tcG9uZW50IGNpLCBsb25nIGluRmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIG91dEZsYWdzKSIpfSwKKyAgICB7Ik1vdmllSW1wb3J0VmFsaWRhdGVEYXRhUmVmIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllSW1wb3J0VmFsaWRhdGVEYXRhUmVmLCAxLAorICAgICBQeURvY19TVFIoIihNb3ZpZUltcG9ydENvbXBvbmVudCBjaSwgSGFuZGxlIGRhdGFSZWYsIE9TVHlwZSBkYXRhUmVmVHlwZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFVJbnQ4IHZhbGlkKSIpfSwKKyAgICB7Ik1vdmllSW1wb3J0R2V0TG9hZFN0YXRlIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllSW1wb3J0R2V0TG9hZFN0YXRlLCAxLAorICAgICBQeURvY19TVFIoIihNb3ZpZUltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgaW1wb3J0ZXJMb2FkU3RhdGUpIil9LAorICAgIHsiTW92aWVJbXBvcnRHZXRNYXhMb2FkZWRUaW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllSW1wb3J0R2V0TWF4TG9hZGVkVGltZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTW92aWVJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBUaW1lVmFsdWUgdGltZSkiKX0sCisgICAgeyJNb3ZpZUltcG9ydEVzdGltYXRlQ29tcGxldGlvblRpbWUiLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVJbXBvcnRFc3RpbWF0ZUNvbXBsZXRpb25UaW1lLCAxLAorICAgICBQeURvY19TVFIoIihNb3ZpZUltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFRpbWVSZWNvcmQgdGltZSkiKX0sCisgICAgeyJNb3ZpZUltcG9ydFNldERvbnRCbG9jayIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUltcG9ydFNldERvbnRCbG9jaywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTW92aWVJbXBvcnRDb21wb25lbnQgY2ksIEJvb2xlYW4gZG9udEJsb2NrKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNb3ZpZUltcG9ydEdldERvbnRCbG9jayIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUltcG9ydEdldERvbnRCbG9jaywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTW92aWVJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBCb29sZWFuIHdpbGxCbG9jaykiKX0sCisgICAgeyJNb3ZpZUltcG9ydFNldElkbGVNYW5hZ2VyIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllSW1wb3J0U2V0SWRsZU1hbmFnZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKE1vdmllSW1wb3J0Q29tcG9uZW50IGNpLCBJZGxlTWFuYWdlciBpbSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTW92aWVJbXBvcnRTZXROZXdNb3ZpZUZsYWdzIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllSW1wb3J0U2V0TmV3TW92aWVGbGFncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTW92aWVJbXBvcnRDb21wb25lbnQgY2ksIGxvbmcgbmV3TW92aWVGbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTW92aWVJbXBvcnRHZXREZXN0aW5hdGlvbk1lZGlhVHlwZSIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUltcG9ydEdldERlc3RpbmF0aW9uTWVkaWFUeXBlLCAxLAorICAgICBQeURvY19TVFIoIihNb3ZpZUltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIE9TVHlwZSBtZWRpYVR5cGUpIil9LAorICAgIHsiTW92aWVFeHBvcnRUb0hhbmRsZSIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUV4cG9ydFRvSGFuZGxlLCAxLAorICAgICBQeURvY19TVFIoIihNb3ZpZUV4cG9ydENvbXBvbmVudCBjaSwgSGFuZGxlIGRhdGFILCBNb3ZpZSB0aGVNb3ZpZSwgVHJhY2sgb25seVRoaXNUcmFjaywgVGltZVZhbHVlIHN0YXJ0VGltZSwgVGltZVZhbHVlIGR1cmF0aW9uKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNb3ZpZUV4cG9ydFRvRmlsZSIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUV4cG9ydFRvRmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTW92aWVFeHBvcnRDb21wb25lbnQgY2ksIEZTU3BlYyB0aGVGaWxlLCBNb3ZpZSB0aGVNb3ZpZSwgVHJhY2sgb25seVRoaXNUcmFjaywgVGltZVZhbHVlIHN0YXJ0VGltZSwgVGltZVZhbHVlIGR1cmF0aW9uKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNb3ZpZUV4cG9ydEdldEF1eGlsaWFyeURhdGEiLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVFeHBvcnRHZXRBdXhpbGlhcnlEYXRhLCAxLAorICAgICBQeURvY19TVFIoIihNb3ZpZUV4cG9ydENvbXBvbmVudCBjaSwgSGFuZGxlIGRhdGFIKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgT1NUeXBlIGhhbmRsZVR5cGUpIil9LAorICAgIHsiTW92aWVFeHBvcnRTZXRTYW1wbGVEZXNjcmlwdGlvbiIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUV4cG9ydFNldFNhbXBsZURlc2NyaXB0aW9uLCAxLAorICAgICBQeURvY19TVFIoIihNb3ZpZUV4cG9ydENvbXBvbmVudCBjaSwgU2FtcGxlRGVzY3JpcHRpb25IYW5kbGUgZGVzYywgT1NUeXBlIG1lZGlhVHlwZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTW92aWVFeHBvcnREb1VzZXJEaWFsb2ciLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVFeHBvcnREb1VzZXJEaWFsb2csIDEsCisgICAgIFB5RG9jX1NUUigiKE1vdmllRXhwb3J0Q29tcG9uZW50IGNpLCBNb3ZpZSB0aGVNb3ZpZSwgVHJhY2sgb25seVRoaXNUcmFjaywgVGltZVZhbHVlIHN0YXJ0VGltZSwgVGltZVZhbHVlIGR1cmF0aW9uKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQm9vbGVhbiBjYW5jZWxlZCkiKX0sCisgICAgeyJNb3ZpZUV4cG9ydEdldENyZWF0b3JUeXBlIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllRXhwb3J0R2V0Q3JlYXRvclR5cGUsIDEsCisgICAgIFB5RG9jX1NUUigiKE1vdmllRXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgT1NUeXBlIGNyZWF0b3IpIil9LAorICAgIHsiTW92aWVFeHBvcnRUb0RhdGFSZWYiLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVFeHBvcnRUb0RhdGFSZWYsIDEsCisgICAgIFB5RG9jX1NUUigiKE1vdmllRXhwb3J0Q29tcG9uZW50IGNpLCBIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlLCBNb3ZpZSB0aGVNb3ZpZSwgVHJhY2sgb25seVRoaXNUcmFjaywgVGltZVZhbHVlIHN0YXJ0VGltZSwgVGltZVZhbHVlIGR1cmF0aW9uKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNb3ZpZUV4cG9ydEZyb21Qcm9jZWR1cmVzVG9EYXRhUmVmIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllRXhwb3J0RnJvbVByb2NlZHVyZXNUb0RhdGFSZWYsIDEsCisgICAgIFB5RG9jX1NUUigiKE1vdmllRXhwb3J0Q29tcG9uZW50IGNpLCBIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNb3ZpZUV4cG9ydFZhbGlkYXRlIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllRXhwb3J0VmFsaWRhdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKE1vdmllRXhwb3J0Q29tcG9uZW50IGNpLCBNb3ZpZSB0aGVNb3ZpZSwgVHJhY2sgb25seVRoaXNUcmFjaykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEJvb2xlYW4gdmFsaWQpIil9LAorICAgIHsiTW92aWVFeHBvcnRHZXRGaWxlTmFtZUV4dGVuc2lvbiIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUV4cG9ydEdldEZpbGVOYW1lRXh0ZW5zaW9uLCAxLAorICAgICBQeURvY19TVFIoIihNb3ZpZUV4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIE9TVHlwZSBleHRlbnNpb24pIil9LAorICAgIHsiTW92aWVFeHBvcnRHZXRTaG9ydEZpbGVUeXBlU3RyaW5nIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllRXhwb3J0R2V0U2hvcnRGaWxlVHlwZVN0cmluZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTW92aWVFeHBvcnRDb21wb25lbnQgY2ksIFN0cjI1NSB0eXBlU3RyaW5nKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNb3ZpZUV4cG9ydEdldFNvdXJjZU1lZGlhVHlwZSIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUV4cG9ydEdldFNvdXJjZU1lZGlhVHlwZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTW92aWVFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBPU1R5cGUgbWVkaWFUeXBlKSIpfSwKKyAgICB7IlRleHRFeHBvcnRHZXRUaW1lRnJhY3Rpb24iLCAoUHlDRnVuY3Rpb24pUXRfVGV4dEV4cG9ydEdldFRpbWVGcmFjdGlvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGV4dEV4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgbW92aWVUaW1lRnJhY3Rpb24pIil9LAorICAgIHsiVGV4dEV4cG9ydFNldFRpbWVGcmFjdGlvbiIsIChQeUNGdW5jdGlvbilRdF9UZXh0RXhwb3J0U2V0VGltZUZyYWN0aW9uLCAxLAorICAgICBQeURvY19TVFIoIihUZXh0RXhwb3J0Q29tcG9uZW50IGNpLCBsb25nIG1vdmllVGltZUZyYWN0aW9uKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJUZXh0RXhwb3J0R2V0U2V0dGluZ3MiLCAoUHlDRnVuY3Rpb24pUXRfVGV4dEV4cG9ydEdldFNldHRpbmdzLCAxLAorICAgICBQeURvY19TVFIoIihUZXh0RXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBzZXR0aW5nKSIpfSwKKyAgICB7IlRleHRFeHBvcnRTZXRTZXR0aW5ncyIsIChQeUNGdW5jdGlvbilRdF9UZXh0RXhwb3J0U2V0U2V0dGluZ3MsIDEsCisgICAgIFB5RG9jX1NUUigiKFRleHRFeHBvcnRDb21wb25lbnQgY2ksIGxvbmcgc2V0dGluZykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTUlESUltcG9ydEdldFNldHRpbmdzIiwgKFB5Q0Z1bmN0aW9uKVF0X01JRElJbXBvcnRHZXRTZXR0aW5ncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGV4dEV4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgc2V0dGluZykiKX0sCisgICAgeyJNSURJSW1wb3J0U2V0U2V0dGluZ3MiLCAoUHlDRnVuY3Rpb24pUXRfTUlESUltcG9ydFNldFNldHRpbmdzLCAxLAorICAgICBQeURvY19TVFIoIihUZXh0RXhwb3J0Q29tcG9uZW50IGNpLCBsb25nIHNldHRpbmcpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkdyYXBoaWNzSW1hZ2VJbXBvcnRTZXRTZXF1ZW5jZUVuYWJsZWQiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbWFnZUltcG9ydFNldFNlcXVlbmNlRW5hYmxlZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY0ltYWdlTW92aWVJbXBvcnRDb21wb25lbnQgY2ksIEJvb2xlYW4gZW5hYmxlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJHcmFwaGljc0ltYWdlSW1wb3J0R2V0U2VxdWVuY2VFbmFibGVkIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1hZ2VJbXBvcnRHZXRTZXF1ZW5jZUVuYWJsZWQsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNJbWFnZU1vdmllSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQm9vbGVhbiBlbmFibGUpIil9LAorICAgIHsiUHJldmlld1Nob3dEYXRhIiwgKFB5Q0Z1bmN0aW9uKVF0X1ByZXZpZXdTaG93RGF0YSwgMSwKKyAgICAgUHlEb2NfU1RSKCIocG5vdENvbXBvbmVudCBwLCBPU1R5cGUgZGF0YVR5cGUsIEhhbmRsZSBkYXRhLCBSZWN0IGluSGVyZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiUHJldmlld01ha2VQcmV2aWV3UmVmZXJlbmNlIiwgKFB5Q0Z1bmN0aW9uKVF0X1ByZXZpZXdNYWtlUHJldmlld1JlZmVyZW5jZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIocG5vdENvbXBvbmVudCBwLCBGU1NwZWMgc291cmNlRmlsZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIE9TVHlwZSBwcmV2aWV3VHlwZSwgc2hvcnQgcmVzSUQpIil9LAorICAgIHsiUHJldmlld0V2ZW50IiwgKFB5Q0Z1bmN0aW9uKVF0X1ByZXZpZXdFdmVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIocG5vdENvbXBvbmVudCBwKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgRXZlbnRSZWNvcmQgZSwgQm9vbGVhbiBoYW5kbGVkRXZlbnQpIil9LAorICAgIHsiRGF0YUNvZGVjRGVjb21wcmVzcyIsIChQeUNGdW5jdGlvbilRdF9EYXRhQ29kZWNEZWNvbXByZXNzLCAxLAorICAgICBQeURvY19TVFIoIihEYXRhQ29kZWNDb21wb25lbnQgZGMsIHZvaWQgKiBzcmNEYXRhLCBVSW50MzIgc3JjU2l6ZSwgdm9pZCAqIGRzdERhdGEsIFVJbnQzMiBkc3RCdWZmZXJTaXplKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJEYXRhQ29kZWNHZXRDb21wcmVzc0J1ZmZlclNpemUiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUNvZGVjR2V0Q29tcHJlc3NCdWZmZXJTaXplLCAxLAorICAgICBQeURvY19TVFIoIihEYXRhQ29kZWNDb21wb25lbnQgZGMsIFVJbnQzMiBzcmNTaXplKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgVUludDMyIGRzdFNpemUpIil9LAorICAgIHsiRGF0YUNvZGVjQ29tcHJlc3MiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUNvZGVjQ29tcHJlc3MsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFDb2RlY0NvbXBvbmVudCBkYywgdm9pZCAqIHNyY0RhdGEsIFVJbnQzMiBzcmNTaXplLCB2b2lkICogZHN0RGF0YSwgVUludDMyIGRzdEJ1ZmZlclNpemUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBVSW50MzIgYWN0dWFsRHN0U2l6ZSwgVUludDMyIGRlY29tcHJlc3NTbG9wKSIpfSwKKyAgICB7IkRhdGFDb2RlY0JlZ2luSW50ZXJydXB0U2FmZSIsIChQeUNGdW5jdGlvbilRdF9EYXRhQ29kZWNCZWdpbkludGVycnVwdFNhZmUsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFDb2RlY0NvbXBvbmVudCBkYywgdW5zaWduZWQgbG9uZyBtYXhTcmNTaXplKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJEYXRhQ29kZWNFbmRJbnRlcnJ1cHRTYWZlIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFDb2RlY0VuZEludGVycnVwdFNhZmUsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFDb2RlY0NvbXBvbmVudCBkYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiRGF0YUhHZXREYXRhIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIR2V0RGF0YSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIEhhbmRsZSBoLCBsb25nIGhPZmZzZXQsIGxvbmcgb2Zmc2V0LCBsb25nIHNpemUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkRhdGFIUHV0RGF0YSIsIChQeUNGdW5jdGlvbilRdF9EYXRhSFB1dERhdGEsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBIYW5kbGUgaCwgbG9uZyBoT2Zmc2V0LCBsb25nIHNpemUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIG9mZnNldCkiKX0sCisgICAgeyJEYXRhSEZsdXNoRGF0YSIsIChQeUNGdW5jdGlvbilRdF9EYXRhSEZsdXNoRGF0YSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkRhdGFIT3BlbkZvcldyaXRlIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIT3BlbkZvcldyaXRlLCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiRGF0YUhDbG9zZUZvcldyaXRlIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIQ2xvc2VGb3JXcml0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkRhdGFIT3BlbkZvclJlYWQiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhPcGVuRm9yUmVhZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkRhdGFIQ2xvc2VGb3JSZWFkIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIQ2xvc2VGb3JSZWFkLCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiRGF0YUhTZXREYXRhUmVmIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIU2V0RGF0YVJlZiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIEhhbmRsZSBkYXRhUmVmKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJEYXRhSEdldERhdGFSZWYiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhHZXREYXRhUmVmLCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEhhbmRsZSBkYXRhUmVmKSIpfSwKKyAgICB7IkRhdGFIQ29tcGFyZURhdGFSZWYiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhDb21wYXJlRGF0YVJlZiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIEhhbmRsZSBkYXRhUmVmKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQm9vbGVhbiBlcXVhbCkiKX0sCisgICAgeyJEYXRhSFRhc2siLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhUYXNrLCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiRGF0YUhGaW5pc2hEYXRhIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIRmluaXNoRGF0YSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIFB0ciBQbGFjZVRvUHV0RGF0YVB0ciwgQm9vbGVhbiBDYW5jZWwpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkRhdGFIRmx1c2hDYWNoZSIsIChQeUNGdW5jdGlvbilRdF9EYXRhSEZsdXNoQ2FjaGUsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJEYXRhSFJlc29sdmVEYXRhUmVmIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIUmVzb2x2ZURhdGFSZWYsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBIYW5kbGUgdGhlRGF0YVJlZiwgQm9vbGVhbiB1c2VySW50ZXJmYWNlQWxsb3dlZCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEJvb2xlYW4gd2FzQ2hhbmdlZCkiKX0sCisgICAgeyJEYXRhSEdldEZpbGVTaXplIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIR2V0RmlsZVNpemUsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBmaWxlU2l6ZSkiKX0sCisgICAgeyJEYXRhSENhblVzZURhdGFSZWYiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhDYW5Vc2VEYXRhUmVmLCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgSGFuZGxlIGRhdGFSZWYpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIHVzZUZsYWdzKSIpfSwKKyAgICB7IkRhdGFIUHJlZXh0ZW5kIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIUHJlZXh0ZW5kLCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgdW5zaWduZWQgbG9uZyBtYXhUb0FkZCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHVuc2lnbmVkIGxvbmcgc3BhY2VBZGRlZCkiKX0sCisgICAgeyJEYXRhSFNldEZpbGVTaXplIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIU2V0RmlsZVNpemUsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBsb25nIGZpbGVTaXplKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJEYXRhSEdldEZyZWVTcGFjZSIsIChQeUNGdW5jdGlvbilRdF9EYXRhSEdldEZyZWVTcGFjZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBsb25nIGZyZWVTaXplKSIpfSwKKyAgICB7IkRhdGFIQ3JlYXRlRmlsZSIsIChQeUNGdW5jdGlvbilRdF9EYXRhSENyZWF0ZUZpbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBPU1R5cGUgY3JlYXRvciwgQm9vbGVhbiBkZWxldGVFeGlzdGluZykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiRGF0YUhHZXRQcmVmZXJyZWRCbG9ja1NpemUiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhHZXRQcmVmZXJyZWRCbG9ja1NpemUsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBibG9ja1NpemUpIil9LAorICAgIHsiRGF0YUhHZXREZXZpY2VJbmRleCIsIChQeUNGdW5jdGlvbilRdF9EYXRhSEdldERldmljZUluZGV4LCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgZGV2aWNlSW5kZXgpIil9LAorICAgIHsiRGF0YUhJc1N0cmVhbWluZ0RhdGFIYW5kbGVyIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFISXNTdHJlYW1pbmdEYXRhSGFuZGxlciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBCb29sZWFuIHllcykiKX0sCisgICAgeyJEYXRhSEdldERhdGFJbkJ1ZmZlciIsIChQeUNGdW5jdGlvbilRdF9EYXRhSEdldERhdGFJbkJ1ZmZlciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIGxvbmcgc3RhcnRPZmZzZXQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIHNpemUpIil9LAorICAgIHsiRGF0YUhHZXRTY2hlZHVsZUFoZWFkVGltZSIsIChQeUNGdW5jdGlvbilRdF9EYXRhSEdldFNjaGVkdWxlQWhlYWRUaW1lLCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgbWlsbGlzZWNzKSIpfSwKKyAgICB7IkRhdGFIU2V0Q2FjaGVTaXplTGltaXQiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhTZXRDYWNoZVNpemVMaW1pdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIFNpemUgY2FjaGVTaXplTGltaXQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkRhdGFIR2V0Q2FjaGVTaXplTGltaXQiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhHZXRDYWNoZVNpemVMaW1pdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBTaXplIGNhY2hlU2l6ZUxpbWl0KSIpfSwKKyAgICB7IkRhdGFIR2V0TW92aWUiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhHZXRNb3ZpZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBNb3ZpZSB0aGVNb3ZpZSwgc2hvcnQgaWQpIil9LAorICAgIHsiRGF0YUhBZGRNb3ZpZSIsIChQeUNGdW5jdGlvbilRdF9EYXRhSEFkZE1vdmllLCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgTW92aWUgdGhlTW92aWUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBzaG9ydCBpZCkiKX0sCisgICAgeyJEYXRhSFVwZGF0ZU1vdmllIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIVXBkYXRlTW92aWUsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBNb3ZpZSB0aGVNb3ZpZSwgc2hvcnQgaWQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkRhdGFIRG9lc0J1ZmZlciIsIChQeUNGdW5jdGlvbilRdF9EYXRhSERvZXNCdWZmZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQm9vbGVhbiBidWZmZXJzUmVhZHMsIEJvb2xlYW4gYnVmZmVyc1dyaXRlcykiKX0sCisgICAgeyJEYXRhSEdldEZpbGVOYW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIR2V0RmlsZU5hbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBTdHIyNTUgc3RyKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJEYXRhSEdldEF2YWlsYWJsZUZpbGVTaXplIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIR2V0QXZhaWxhYmxlRmlsZVNpemUsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBmaWxlU2l6ZSkiKX0sCisgICAgeyJEYXRhSEdldE1hY09TRmlsZVR5cGUiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhHZXRNYWNPU0ZpbGVUeXBlLCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIE9TVHlwZSBmaWxlVHlwZSkiKX0sCisgICAgeyJEYXRhSEdldE1JTUVUeXBlIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIR2V0TUlNRVR5cGUsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBTdHIyNTUgbWltZVR5cGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkRhdGFIU2V0RGF0YVJlZldpdGhBbmNob3IiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhTZXREYXRhUmVmV2l0aEFuY2hvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIEhhbmRsZSBhbmNob3JEYXRhUmVmLCBPU1R5cGUgZGF0YVJlZlR5cGUsIEhhbmRsZSBkYXRhUmVmKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJEYXRhSEdldERhdGFSZWZXaXRoQW5jaG9yIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIR2V0RGF0YVJlZldpdGhBbmNob3IsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBIYW5kbGUgYW5jaG9yRGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSGFuZGxlIGRhdGFSZWYpIil9LAorICAgIHsiRGF0YUhTZXRNYWNPU0ZpbGVUeXBlIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIU2V0TWFjT1NGaWxlVHlwZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIE9TVHlwZSBmaWxlVHlwZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiRGF0YUhTZXRUaW1lQmFzZSIsIChQeUNGdW5jdGlvbilRdF9EYXRhSFNldFRpbWVCYXNlLCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgVGltZUJhc2UgdGIpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkRhdGFIR2V0SW5mb0ZsYWdzIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIR2V0SW5mb0ZsYWdzLCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFVJbnQzMiBmbGFncykiKX0sCisgICAgeyJEYXRhSEdldEZpbGVTaXplNjQiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhHZXRGaWxlU2l6ZTY0LCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHdpZGUgZmlsZVNpemUpIil9LAorICAgIHsiRGF0YUhQcmVleHRlbmQ2NCIsIChQeUNGdW5jdGlvbilRdF9EYXRhSFByZWV4dGVuZDY0LCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgd2lkZSBtYXhUb0FkZCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHdpZGUgc3BhY2VBZGRlZCkiKX0sCisgICAgeyJEYXRhSFNldEZpbGVTaXplNjQiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhTZXRGaWxlU2l6ZTY0LCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgd2lkZSBmaWxlU2l6ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiRGF0YUhHZXRGcmVlU3BhY2U2NCIsIChQeUNGdW5jdGlvbilRdF9EYXRhSEdldEZyZWVTcGFjZTY0LCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHdpZGUgZnJlZVNpemUpIil9LAorICAgIHsiRGF0YUhBcHBlbmQ2NCIsIChQeUNGdW5jdGlvbilRdF9EYXRhSEFwcGVuZDY0LCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgdm9pZCAqIGRhdGEsIHVuc2lnbmVkIGxvbmcgc2l6ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHdpZGUgZmlsZU9mZnNldCkiKX0sCisgICAgeyJEYXRhSFBvbGxSZWFkIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIUG9sbFJlYWQsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCB2b2lkICogZGF0YVB0cikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFVJbnQzMiBkYXRhU2l6ZVNvRmFyKSIpfSwKKyAgICB7IkRhdGFIR2V0RGF0YUF2YWlsYWJpbGl0eSIsIChQeUNGdW5jdGlvbilRdF9EYXRhSEdldERhdGFBdmFpbGFiaWxpdHksIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBsb25nIG9mZnNldCwgbG9uZyBsZW4pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIG1pc3Npbmdfb2Zmc2V0LCBsb25nIG1pc3NpbmdfbGVuKSIpfSwKKyAgICB7IkRhdGFIR2V0RGF0YVJlZkFzVHlwZSIsIChQeUNGdW5jdGlvbilRdF9EYXRhSEdldERhdGFSZWZBc1R5cGUsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBPU1R5cGUgcmVxdWVzdGVkVHlwZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEhhbmRsZSBkYXRhUmVmKSIpfSwKKyAgICB7IkRhdGFIU2V0RGF0YVJlZkV4dGVuc2lvbiIsIChQeUNGdW5jdGlvbilRdF9EYXRhSFNldERhdGFSZWZFeHRlbnNpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBIYW5kbGUgZXh0ZW5zaW9uLCBPU1R5cGUgaWRUeXBlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJEYXRhSEdldERhdGFSZWZFeHRlbnNpb24iLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhHZXREYXRhUmVmRXh0ZW5zaW9uLCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgT1NUeXBlIGlkVHlwZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEhhbmRsZSBleHRlbnNpb24pIil9LAorICAgIHsiRGF0YUhHZXRNb3ZpZVdpdGhGbGFncyIsIChQeUNGdW5jdGlvbilRdF9EYXRhSEdldE1vdmllV2l0aEZsYWdzLCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgc2hvcnQgZmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBNb3ZpZSB0aGVNb3ZpZSwgc2hvcnQgaWQpIil9LAorICAgIHsiRGF0YUhHZXRGaWxlVHlwZU9yZGVyaW5nIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIR2V0RmlsZVR5cGVPcmRlcmluZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBEYXRhSEZpbGVUeXBlT3JkZXJpbmdIYW5kbGUgb3JkZXJpbmdMaXN0SGFuZGxlKSIpfSwKKyAgICB7IkRhdGFIQ3JlYXRlRmlsZVdpdGhGbGFncyIsIChQeUNGdW5jdGlvbilRdF9EYXRhSENyZWF0ZUZpbGVXaXRoRmxhZ3MsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBPU1R5cGUgY3JlYXRvciwgQm9vbGVhbiBkZWxldGVFeGlzdGluZywgVUludDMyIGZsYWdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJEYXRhSEdldEluZm8iLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhHZXRJbmZvLCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgT1NUeXBlIHdoYXQsIHZvaWQgKiBpbmZvKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJEYXRhSFNldElkbGVNYW5hZ2VyIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIU2V0SWRsZU1hbmFnZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBJZGxlTWFuYWdlciBpbSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiRGF0YUhEZWxldGVGaWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIRGVsZXRlRmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkRhdGFIU2V0TW92aWVVc2FnZUZsYWdzIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIU2V0TW92aWVVc2FnZUZsYWdzLCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgbG9uZyBmbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiRGF0YUhVc2VUZW1wb3JhcnlEYXRhUmVmIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIVXNlVGVtcG9yYXJ5RGF0YVJlZiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIGxvbmcgaW5GbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiRGF0YUhHZXRUZW1wb3JhcnlEYXRhUmVmQ2FwYWJpbGl0aWVzIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIR2V0VGVtcG9yYXJ5RGF0YVJlZkNhcGFiaWxpdGllcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIG91dFVuZGVyc3Rvb2RGbGFncykiKX0sCisgICAgeyJEYXRhSFJlbmFtZUZpbGUiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhSZW5hbWVGaWxlLCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgSGFuZGxlIG5ld0RhdGFSZWYpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkRhdGFIUGxheWJhY2tIaW50cyIsIChQeUNGdW5jdGlvbilRdF9EYXRhSFBsYXliYWNrSGludHMsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBsb25nIGZsYWdzLCB1bnNpZ25lZCBsb25nIG1pbkZpbGVPZmZzZXQsIHVuc2lnbmVkIGxvbmcgbWF4RmlsZU9mZnNldCwgbG9uZyBieXRlc1BlclNlY29uZCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiRGF0YUhQbGF5YmFja0hpbnRzNjQiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhQbGF5YmFja0hpbnRzNjQsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBsb25nIGZsYWdzLCB3aWRlIG1pbkZpbGVPZmZzZXQsIHdpZGUgbWF4RmlsZU9mZnNldCwgbG9uZyBieXRlc1BlclNlY29uZCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiRGF0YUhHZXREYXRhUmF0ZSIsIChQeUNGdW5jdGlvbilRdF9EYXRhSEdldERhdGFSYXRlLCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgbG9uZyBmbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgYnl0ZXNQZXJTZWNvbmQpIil9LAorICAgIHsiRGF0YUhTZXRUaW1lSGludHMiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhTZXRUaW1lSGludHMsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBsb25nIGZsYWdzLCBsb25nIGJhbmR3aWR0aFByaW9yaXR5LCBUaW1lU2NhbGUgc2NhbGUsIFRpbWVWYWx1ZSBtaW5UaW1lLCBUaW1lVmFsdWUgbWF4VGltZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiVkRHZXRNYXhTcmNSZWN0IiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0TWF4U3JjUmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIHNob3J0IGlucHV0U3RkKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmVjdCBtYXhTcmNSZWN0KSIpfSwKKyAgICB7IlZER2V0QWN0aXZlU3JjUmVjdCIsIChQeUNGdW5jdGlvbilRdF9WREdldEFjdGl2ZVNyY1JlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBzaG9ydCBpbnB1dFN0ZCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJlY3QgYWN0aXZlU3JjUmVjdCkiKX0sCisgICAgeyJWRFNldERpZ2l0aXplclJlY3QiLCAoUHlDRnVuY3Rpb24pUXRfVkRTZXREaWdpdGl6ZXJSZWN0LCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJlY3QgZGlnaXRpemVyUmVjdCkiKX0sCisgICAgeyJWREdldERpZ2l0aXplclJlY3QiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXREaWdpdGl6ZXJSZWN0LCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJlY3QgZGlnaXRpemVyUmVjdCkiKX0sCisgICAgeyJWREdldFZCbGFua1JlY3QiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXRWQmxhbmtSZWN0LCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgc2hvcnQgaW5wdXRTdGQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSZWN0IHZCbGFua1JlY3QpIil9LAorICAgIHsiVkRHZXRNYXNrUGl4TWFwIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0TWFza1BpeE1hcCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIFBpeE1hcEhhbmRsZSBtYXNrUGl4TWFwKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJWRFVzZVRoaXNDTFVUIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEVXNlVGhpc0NMVVQsIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBDVGFiSGFuZGxlIGNvbG9yVGFibGVIYW5kbGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlZEU2V0SW5wdXRHYW1tYVZhbHVlIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEU2V0SW5wdXRHYW1tYVZhbHVlLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgRml4ZWQgY2hhbm5lbDEsIEZpeGVkIGNoYW5uZWwyLCBGaXhlZCBjaGFubmVsMykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiVkRHZXRJbnB1dEdhbW1hVmFsdWUiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXRJbnB1dEdhbW1hVmFsdWUsIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgRml4ZWQgY2hhbm5lbDEsIEZpeGVkIGNoYW5uZWwyLCBGaXhlZCBjaGFubmVsMykiKX0sCisgICAgeyJWRFNldEJyaWdodG5lc3MiLCAoUHlDRnVuY3Rpb24pUXRfVkRTZXRCcmlnaHRuZXNzLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHVuc2lnbmVkIHNob3J0IGJyaWdodG5lc3MpIil9LAorICAgIHsiVkRHZXRCcmlnaHRuZXNzIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0QnJpZ2h0bmVzcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBzaG9ydCBicmlnaHRuZXNzKSIpfSwKKyAgICB7IlZEU2V0Q29udHJhc3QiLCAoUHlDRnVuY3Rpb24pUXRfVkRTZXRDb250cmFzdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBzaG9ydCBjb250cmFzdCkiKX0sCisgICAgeyJWRFNldEh1ZSIsIChQeUNGdW5jdGlvbilRdF9WRFNldEh1ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBzaG9ydCBodWUpIil9LAorICAgIHsiVkRTZXRTaGFycG5lc3MiLCAoUHlDRnVuY3Rpb24pUXRfVkRTZXRTaGFycG5lc3MsIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgc2hvcnQgc2hhcnBuZXNzKSIpfSwKKyAgICB7IlZEU2V0U2F0dXJhdGlvbiIsIChQeUNGdW5jdGlvbilRdF9WRFNldFNhdHVyYXRpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgc2hvcnQgc2F0dXJhdGlvbikiKX0sCisgICAgeyJWREdldENvbnRyYXN0IiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0Q29udHJhc3QsIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgc2hvcnQgY29udHJhc3QpIil9LAorICAgIHsiVkRHZXRIdWUiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXRIdWUsIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgc2hvcnQgaHVlKSIpfSwKKyAgICB7IlZER2V0U2hhcnBuZXNzIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0U2hhcnBuZXNzLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHVuc2lnbmVkIHNob3J0IHNoYXJwbmVzcykiKX0sCisgICAgeyJWREdldFNhdHVyYXRpb24iLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXRTYXR1cmF0aW9uLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHVuc2lnbmVkIHNob3J0IHNhdHVyYXRpb24pIil9LAorICAgIHsiVkRHcmFiT25lRnJhbWUiLCAoUHlDRnVuY3Rpb24pUXRfVkRHcmFiT25lRnJhbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJWREdldE1heEF1eEJ1ZmZlciIsIChQeUNGdW5jdGlvbilRdF9WREdldE1heEF1eEJ1ZmZlciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBQaXhNYXBIYW5kbGUgcG0sIFJlY3QgcikiKX0sCisgICAgeyJWREdldEN1cnJlbnRGbGFncyIsIChQeUNGdW5jdGlvbilRdF9WREdldEN1cnJlbnRGbGFncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIGlucHV0Q3VycmVudEZsYWcsIGxvbmcgb3V0cHV0Q3VycmVudEZsYWcpIil9LAorICAgIHsiVkRTZXRLZXlDb2xvciIsIChQeUNGdW5jdGlvbilRdF9WRFNldEtleUNvbG9yLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgbG9uZyBpbmRleCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiVkRHZXRLZXlDb2xvciIsIChQeUNGdW5jdGlvbilRdF9WREdldEtleUNvbG9yLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgaW5kZXgpIil9LAorICAgIHsiVkRBZGRLZXlDb2xvciIsIChQeUNGdW5jdGlvbilRdF9WREFkZEtleUNvbG9yLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgaW5kZXgpIil9LAorICAgIHsiVkRHZXROZXh0S2V5Q29sb3IiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXROZXh0S2V5Q29sb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBsb25nIGluZGV4KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJWRFNldEtleUNvbG9yUmFuZ2UiLCAoUHlDRnVuY3Rpb24pUXRfVkRTZXRLZXlDb2xvclJhbmdlLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJHQkNvbG9yIG1pblJHQiwgUkdCQ29sb3IgbWF4UkdCKSIpfSwKKyAgICB7IlZER2V0S2V5Q29sb3JSYW5nZSIsIChQeUNGdW5jdGlvbilRdF9WREdldEtleUNvbG9yUmFuZ2UsIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUkdCQ29sb3IgbWluUkdCLCBSR0JDb2xvciBtYXhSR0IpIil9LAorICAgIHsiVkRTZXRJbnB1dENvbG9yU3BhY2VNb2RlIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEU2V0SW5wdXRDb2xvclNwYWNlTW9kZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIHNob3J0IGNvbG9yU3BhY2VNb2RlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJWREdldElucHV0Q29sb3JTcGFjZU1vZGUiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXRJbnB1dENvbG9yU3BhY2VNb2RlLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHNob3J0IGNvbG9yU3BhY2VNb2RlKSIpfSwKKyAgICB7IlZEU2V0Q2xpcFN0YXRlIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEU2V0Q2xpcFN0YXRlLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgc2hvcnQgY2xpcEVuYWJsZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiVkRHZXRDbGlwU3RhdGUiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXRDbGlwU3RhdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgc2hvcnQgY2xpcEVuYWJsZSkiKX0sCisgICAgeyJWRFNldENsaXBSZ24iLCAoUHlDRnVuY3Rpb24pUXRfVkRTZXRDbGlwUmduLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgUmduSGFuZGxlIGNsaXBSZWdpb24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlZEQ2xlYXJDbGlwUmduIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEQ2xlYXJDbGlwUmduLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgUmduSGFuZGxlIGNsaXBSZWdpb24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlZER2V0Q0xVVEluVXNlIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0Q0xVVEluVXNlLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIENUYWJIYW5kbGUgY29sb3JUYWJsZUhhbmRsZSkiKX0sCisgICAgeyJWRFNldFBMTEZpbHRlclR5cGUiLCAoUHlDRnVuY3Rpb24pUXRfVkRTZXRQTExGaWx0ZXJUeXBlLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgc2hvcnQgcGxsVHlwZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiVkRHZXRQTExGaWx0ZXJUeXBlIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0UExMRmlsdGVyVHlwZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBzaG9ydCBwbGxUeXBlKSIpfSwKKyAgICB7IlZER2V0TWFza2FuZFZhbHVlIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0TWFza2FuZFZhbHVlLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgdW5zaWduZWQgc2hvcnQgYmxlbmRMZXZlbCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgbWFzaywgbG9uZyB2YWx1ZSkiKX0sCisgICAgeyJWRFNldE1hc3RlckJsZW5kTGV2ZWwiLCAoUHlDRnVuY3Rpb24pUXRfVkRTZXRNYXN0ZXJCbGVuZExldmVsLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHVuc2lnbmVkIHNob3J0IGJsZW5kTGV2ZWwpIil9LAorICAgIHsiVkRTZXRQbGF5VGhydU9uT2ZmIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEU2V0UGxheVRocnVPbk9mZiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIHNob3J0IHN0YXRlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJWRFNldEZpZWxkUHJlZmVyZW5jZSIsIChQeUNGdW5jdGlvbilRdF9WRFNldEZpZWxkUHJlZmVyZW5jZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIHNob3J0IGZpZWxkRmxhZykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiVkRHZXRGaWVsZFByZWZlcmVuY2UiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXRGaWVsZFByZWZlcmVuY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgc2hvcnQgZmllbGRGbGFnKSIpfSwKKyAgICB7IlZEUHJlZmxpZ2h0R2xvYmFsUmVjdCIsIChQeUNGdW5jdGlvbilRdF9WRFByZWZsaWdodEdsb2JhbFJlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBHcmFmUHRyIHRoZVdpbmRvdykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJlY3QgZ2xvYmFsUmVjdCkiKX0sCisgICAgeyJWRFNldFBsYXlUaHJ1R2xvYmFsUmVjdCIsIChQeUNGdW5jdGlvbilRdF9WRFNldFBsYXlUaHJ1R2xvYmFsUmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIEdyYWZQdHIgdGhlV2luZG93KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmVjdCBnbG9iYWxSZWN0KSIpfSwKKyAgICB7IlZEU2V0QmxhY2tMZXZlbFZhbHVlIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEU2V0QmxhY2tMZXZlbFZhbHVlLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHVuc2lnbmVkIHNob3J0IGJsYWNrTGV2ZWwpIil9LAorICAgIHsiVkRHZXRCbGFja0xldmVsVmFsdWUiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXRCbGFja0xldmVsVmFsdWUsIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgc2hvcnQgYmxhY2tMZXZlbCkiKX0sCisgICAgeyJWRFNldFdoaXRlTGV2ZWxWYWx1ZSIsIChQeUNGdW5jdGlvbilRdF9WRFNldFdoaXRlTGV2ZWxWYWx1ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBzaG9ydCB3aGl0ZUxldmVsKSIpfSwKKyAgICB7IlZER2V0V2hpdGVMZXZlbFZhbHVlIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0V2hpdGVMZXZlbFZhbHVlLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHVuc2lnbmVkIHNob3J0IHdoaXRlTGV2ZWwpIil9LAorICAgIHsiVkRHZXRWaWRlb0RlZmF1bHRzIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0VmlkZW9EZWZhdWx0cywgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBzaG9ydCBibGFja0xldmVsLCB1bnNpZ25lZCBzaG9ydCB3aGl0ZUxldmVsLCB1bnNpZ25lZCBzaG9ydCBicmlnaHRuZXNzLCB1bnNpZ25lZCBzaG9ydCBodWUsIHVuc2lnbmVkIHNob3J0IHNhdHVyYXRpb24sIHVuc2lnbmVkIHNob3J0IGNvbnRyYXN0LCB1bnNpZ25lZCBzaG9ydCBzaGFycG5lc3MpIil9LAorICAgIHsiVkRHZXROdW1iZXJPZklucHV0cyIsIChQeUNGdW5jdGlvbilRdF9WREdldE51bWJlck9mSW5wdXRzLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHNob3J0IGlucHV0cykiKX0sCisgICAgeyJWREdldElucHV0Rm9ybWF0IiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0SW5wdXRGb3JtYXQsIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBzaG9ydCBpbnB1dCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHNob3J0IGZvcm1hdCkiKX0sCisgICAgeyJWRFNldElucHV0IiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEU2V0SW5wdXQsIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBzaG9ydCBpbnB1dCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiVkRHZXRJbnB1dCIsIChQeUNGdW5jdGlvbilRdF9WREdldElucHV0LCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHNob3J0IGlucHV0KSIpfSwKKyAgICB7IlZEU2V0SW5wdXRTdGFuZGFyZCIsIChQeUNGdW5jdGlvbilRdF9WRFNldElucHV0U3RhbmRhcmQsIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBzaG9ydCBpbnB1dFN0YW5kYXJkKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJWRFNldHVwQnVmZmVycyIsIChQeUNGdW5jdGlvbilRdF9WRFNldHVwQnVmZmVycywgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIFZkaWdCdWZmZXJSZWNMaXN0SGFuZGxlIGJ1ZmZlckxpc3QpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlZER3JhYk9uZUZyYW1lQXN5bmMiLCAoUHlDRnVuY3Rpb24pUXRfVkRHcmFiT25lRnJhbWVBc3luYywgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIHNob3J0IGJ1ZmZlcikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiVkREb25lIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZERG9uZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIHNob3J0IGJ1ZmZlcikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiVkRTZXRDb21wcmVzc2lvbiIsIChQeUNGdW5jdGlvbilRdF9WRFNldENvbXByZXNzaW9uLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgT1NUeXBlIGNvbXByZXNzVHlwZSwgc2hvcnQgZGVwdGgsIENvZGVjUSBzcGF0aWFsUXVhbGl0eSwgQ29kZWNRIHRlbXBvcmFsUXVhbGl0eSwgbG9uZyBrZXlGcmFtZVJhdGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSZWN0IGJvdW5kcykiKX0sCisgICAgeyJWRENvbXByZXNzT25lRnJhbWVBc3luYyIsIChQeUNGdW5jdGlvbilRdF9WRENvbXByZXNzT25lRnJhbWVBc3luYywgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlZER2V0SW1hZ2VEZXNjcmlwdGlvbiIsIChQeUNGdW5jdGlvbilRdF9WREdldEltYWdlRGVzY3JpcHRpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlZEUmVzZXRDb21wcmVzc1NlcXVlbmNlIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEUmVzZXRDb21wcmVzc1NlcXVlbmNlLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiVkRTZXRDb21wcmVzc2lvbk9uT2ZmIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEU2V0Q29tcHJlc3Npb25Pbk9mZiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIEJvb2xlYW4gc3RhdGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlZER2V0Q29tcHJlc3Npb25UeXBlcyIsIChQeUNGdW5jdGlvbilRdF9WREdldENvbXByZXNzaW9uVHlwZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBWRENvbXByZXNzaW9uTGlzdEhhbmRsZSBoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJWRFNldFRpbWVCYXNlIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEU2V0VGltZUJhc2UsIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBUaW1lQmFzZSB0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJWRFNldEZyYW1lUmF0ZSIsIChQeUNGdW5jdGlvbilRdF9WRFNldEZyYW1lUmF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIEZpeGVkIGZyYW1lc1BlclNlY29uZCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiVkRHZXREYXRhUmF0ZSIsIChQeUNGdW5jdGlvbilRdF9WREdldERhdGFSYXRlLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgbWlsbGlTZWNQZXJGcmFtZSwgRml4ZWQgZnJhbWVzUGVyU2Vjb25kLCBsb25nIGJ5dGVzUGVyU2Vjb25kKSIpfSwKKyAgICB7IlZER2V0U291bmRJbnB1dERyaXZlciIsIChQeUNGdW5jdGlvbilRdF9WREdldFNvdW5kSW5wdXREcml2ZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBTdHIyNTUgc291bmREcml2ZXJOYW1lKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJWREdldERNQURlcHRocyIsIChQeUNGdW5jdGlvbilRdF9WREdldERNQURlcHRocywgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIGRlcHRoQXJyYXksIGxvbmcgcHJlZmVycmVkRGVwdGgpIil9LAorICAgIHsiVkRHZXRQcmVmZXJyZWRUaW1lU2NhbGUiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXRQcmVmZXJyZWRUaW1lU2NhbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgVGltZVNjYWxlIHByZWZlcnJlZCkiKX0sCisgICAgeyJWRFJlbGVhc2VBc3luY0J1ZmZlcnMiLCAoUHlDRnVuY3Rpb24pUXRfVkRSZWxlYXNlQXN5bmNCdWZmZXJzLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiVkRTZXREYXRhUmF0ZSIsIChQeUNGdW5jdGlvbilRdF9WRFNldERhdGFSYXRlLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgbG9uZyBieXRlc1BlclNlY29uZCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiVkRHZXRUaW1lQ29kZSIsIChQeUNGdW5jdGlvbilRdF9WREdldFRpbWVDb2RlLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgdm9pZCAqIHRpbWVDb2RlRm9ybWF0LCB2b2lkICogdGltZUNvZGVUaW1lKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgVGltZVJlY29yZCBhdFRpbWUpIil9LAorICAgIHsiVkRVc2VTYWZlQnVmZmVycyIsIChQeUNGdW5jdGlvbilRdF9WRFVzZVNhZmVCdWZmZXJzLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgQm9vbGVhbiB1c2VTYWZlQnVmZmVycykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiVkRHZXRTb3VuZElucHV0U291cmNlIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0U291bmRJbnB1dFNvdXJjZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIGxvbmcgdmlkZW9JbnB1dCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgc291bmRJbnB1dCkiKX0sCisgICAgeyJWREdldENvbXByZXNzaW9uVGltZSIsIChQeUNGdW5jdGlvbilRdF9WREdldENvbXByZXNzaW9uVGltZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIE9TVHlwZSBjb21wcmVzc2lvblR5cGUsIHNob3J0IGRlcHRoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmVjdCBzcmNSZWN0LCBDb2RlY1Egc3BhdGlhbFF1YWxpdHksIENvZGVjUSB0ZW1wb3JhbFF1YWxpdHksIHVuc2lnbmVkIGxvbmcgY29tcHJlc3NUaW1lKSIpfSwKKyAgICB7IlZEU2V0UHJlZmVycmVkUGFja2V0U2l6ZSIsIChQeUNGdW5jdGlvbilRdF9WRFNldFByZWZlcnJlZFBhY2tldFNpemUsIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBsb25nIHByZWZlcnJlZFBhY2tldFNpemVJbkJ5dGVzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJWRFNldFByZWZlcnJlZEltYWdlRGltZW5zaW9ucyIsIChQeUNGdW5jdGlvbilRdF9WRFNldFByZWZlcnJlZEltYWdlRGltZW5zaW9ucywgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIGxvbmcgd2lkdGgsIGxvbmcgaGVpZ2h0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJWREdldFByZWZlcnJlZEltYWdlRGltZW5zaW9ucyIsIChQeUNGdW5jdGlvbilRdF9WREdldFByZWZlcnJlZEltYWdlRGltZW5zaW9ucywgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIHdpZHRoLCBsb25nIGhlaWdodCkiKX0sCisgICAgeyJWREdldElucHV0TmFtZSIsIChQeUNGdW5jdGlvbilRdF9WREdldElucHV0TmFtZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIGxvbmcgdmlkZW9JbnB1dCwgU3RyMjU1IG5hbWUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlZEU2V0RGVzdGluYXRpb25Qb3J0IiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEU2V0RGVzdGluYXRpb25Qb3J0LCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgQ0dyYWZQdHIgZGVzdFBvcnQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlZER2V0RGV2aWNlTmFtZUFuZEZsYWdzIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0RGV2aWNlTmFtZUFuZEZsYWdzLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgU3RyMjU1IG91dE5hbWUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBVSW50MzIgb3V0TmFtZUZsYWdzKSIpfSwKKyAgICB7IlZEQ2FwdHVyZVN0YXRlQ2hhbmdpbmciLCAoUHlDRnVuY3Rpb24pUXRfVkRDYXB0dXJlU3RhdGVDaGFuZ2luZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIFVJbnQzMiBpblN0YXRlRmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlhNTFBhcnNlR2V0RGV0YWlsZWRQYXJzZUVycm9yIiwgKFB5Q0Z1bmN0aW9uKVF0X1hNTFBhcnNlR2V0RGV0YWlsZWRQYXJzZUVycm9yLCAxLAorICAgICBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBhUGFyc2VyLCBTdHJpbmdQdHIgZXJyRGVzYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgZXJyb3JMaW5lKSIpfSwKKyAgICB7IlhNTFBhcnNlQWRkRWxlbWVudCIsIChQeUNGdW5jdGlvbilRdF9YTUxQYXJzZUFkZEVsZW1lbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGFQYXJzZXIsIFVJbnQzMiBuYW1lU3BhY2VJRCwgbG9uZyBlbGVtZW50RmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBjaGFyIGVsZW1lbnROYW1lLCBVSW50MzIgZWxlbWVudElEKSIpfSwKKyAgICB7IlhNTFBhcnNlQWRkQXR0cmlidXRlIiwgKFB5Q0Z1bmN0aW9uKVF0X1hNTFBhcnNlQWRkQXR0cmlidXRlLCAxLAorICAgICBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBhUGFyc2VyLCBVSW50MzIgZWxlbWVudElELCBVSW50MzIgbmFtZVNwYWNlSUQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBjaGFyIGF0dHJpYnV0ZU5hbWUsIFVJbnQzMiBhdHRyaWJ1dGVJRCkiKX0sCisgICAgeyJYTUxQYXJzZUFkZE11bHRpcGxlQXR0cmlidXRlcyIsIChQeUNGdW5jdGlvbilRdF9YTUxQYXJzZUFkZE11bHRpcGxlQXR0cmlidXRlcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ29tcG9uZW50SW5zdGFuY2UgYVBhcnNlciwgVUludDMyIGVsZW1lbnRJRCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFVJbnQzMiBuYW1lU3BhY2VJRHMsIGNoYXIgYXR0cmlidXRlTmFtZXMsIFVJbnQzMiBhdHRyaWJ1dGVJRHMpIil9LAorICAgIHsiWE1MUGFyc2VBZGRBdHRyaWJ1dGVBbmRWYWx1ZSIsIChQeUNGdW5jdGlvbilRdF9YTUxQYXJzZUFkZEF0dHJpYnV0ZUFuZFZhbHVlLCAxLAorICAgICBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBhUGFyc2VyLCBVSW50MzIgZWxlbWVudElELCBVSW50MzIgbmFtZVNwYWNlSUQsIFVJbnQzMiBhdHRyaWJ1dGVWYWx1ZUtpbmQsIHZvaWQgKiBhdHRyaWJ1dGVWYWx1ZUtpbmRJbmZvKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgY2hhciBhdHRyaWJ1dGVOYW1lLCBVSW50MzIgYXR0cmlidXRlSUQpIil9LAorICAgIHsiWE1MUGFyc2VBZGRBdHRyaWJ1dGVWYWx1ZUtpbmQiLCAoUHlDRnVuY3Rpb24pUXRfWE1MUGFyc2VBZGRBdHRyaWJ1dGVWYWx1ZUtpbmQsIDEsCisgICAgIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGFQYXJzZXIsIFVJbnQzMiBlbGVtZW50SUQsIFVJbnQzMiBhdHRyaWJ1dGVJRCwgVUludDMyIGF0dHJpYnV0ZVZhbHVlS2luZCwgdm9pZCAqIGF0dHJpYnV0ZVZhbHVlS2luZEluZm8pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlhNTFBhcnNlQWRkTmFtZVNwYWNlIiwgKFB5Q0Z1bmN0aW9uKVF0X1hNTFBhcnNlQWRkTmFtZVNwYWNlLCAxLAorICAgICBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBhUGFyc2VyKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgY2hhciBuYW1lU3BhY2VVUkwsIFVJbnQzMiBuYW1lU3BhY2VJRCkiKX0sCisgICAgeyJYTUxQYXJzZVNldE9mZnNldEFuZExpbWl0IiwgKFB5Q0Z1bmN0aW9uKVF0X1hNTFBhcnNlU2V0T2Zmc2V0QW5kTGltaXQsIDEsCisgICAgIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGFQYXJzZXIsIFVJbnQzMiBvZmZzZXQsIFVJbnQzMiBsaW1pdCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiWE1MUGFyc2VTZXRFdmVudFBhcnNlUmVmQ29uIiwgKFB5Q0Z1bmN0aW9uKVF0X1hNTFBhcnNlU2V0RXZlbnRQYXJzZVJlZkNvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ29tcG9uZW50SW5zdGFuY2UgYVBhcnNlciwgbG9uZyByZWZjb24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHSW5pdGlhbGl6ZSIsIChQeUNGdW5jdGlvbilRdF9TR0luaXRpYWxpemUsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dTZXREYXRhT3V0cHV0IiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0RGF0YU91dHB1dCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBGU1NwZWMgbW92aWVGaWxlLCBsb25nIHdoZXJlRmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHR2V0RGF0YU91dHB1dCIsIChQeUNGdW5jdGlvbilRdF9TR0dldERhdGFPdXRwdXQsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgRlNTcGVjIG1vdmllRmlsZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgd2hlcmVGbGFncykiKX0sCisgICAgeyJTR1NldEdXb3JsZCIsIChQeUNGdW5jdGlvbilRdF9TR1NldEdXb3JsZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBDR3JhZlB0ciBncCwgR0RIYW5kbGUgZ2QpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHR2V0R1dvcmxkIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0R1dvcmxkLCAxLAorICAgICBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBDR3JhZlB0ciBncCwgR0RIYW5kbGUgZ2QpIil9LAorICAgIHsiU0dOZXdDaGFubmVsIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHTmV3Q2hhbm5lbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBPU1R5cGUgY2hhbm5lbFR5cGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBTR0NoYW5uZWwgcmVmKSIpfSwKKyAgICB7IlNHRGlzcG9zZUNoYW5uZWwiLCAoUHlDRnVuY3Rpb24pUXRfU0dEaXNwb3NlQ2hhbm5lbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dTdGFydFByZXZpZXciLCAoUHlDRnVuY3Rpb24pUXRfU0dTdGFydFByZXZpZXcsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dTdGFydFJlY29yZCIsIChQeUNGdW5jdGlvbilRdF9TR1N0YXJ0UmVjb3JkLCAxLAorICAgICBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHSWRsZSIsIChQeUNGdW5jdGlvbilRdF9TR0lkbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dTdG9wIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU3RvcCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTR1BhdXNlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHUGF1c2UsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgQm9vbGVhbiBwYXVzZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dQcmVwYXJlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHUHJlcGFyZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBCb29sZWFuIHByZXBhcmVGb3JQcmV2aWV3LCBCb29sZWFuIHByZXBhcmVGb3JSZWNvcmQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHUmVsZWFzZSIsIChQeUNGdW5jdGlvbilRdF9TR1JlbGVhc2UsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dHZXRNb3ZpZSIsIChQeUNGdW5jdGlvbilRdF9TR0dldE1vdmllLCAxLAorICAgICBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMpIC0+IChNb3ZpZSBfcnYpIil9LAorICAgIHsiU0dTZXRNYXhpbXVtUmVjb3JkVGltZSIsIChQeUNGdW5jdGlvbilRdF9TR1NldE1heGltdW1SZWNvcmRUaW1lLCAxLAorICAgICBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIHVuc2lnbmVkIGxvbmcgdGlja3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHR2V0TWF4aW11bVJlY29yZFRpbWUiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRNYXhpbXVtUmVjb3JkVGltZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgbG9uZyB0aWNrcykiKX0sCisgICAgeyJTR0dldFN0b3JhZ2VTcGFjZVJlbWFpbmluZyIsIChQeUNGdW5jdGlvbilRdF9TR0dldFN0b3JhZ2VTcGFjZVJlbWFpbmluZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgbG9uZyBieXRlcykiKX0sCisgICAgeyJTR0dldFRpbWVSZW1haW5pbmciLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRUaW1lUmVtYWluaW5nLCAxLAorICAgICBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIHRpY2tzTGVmdCkiKX0sCisgICAgeyJTR0dyYWJQaWN0IiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR3JhYlBpY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgUmVjdCBib3VuZHMsIHNob3J0IG9mZnNjcmVlbkRlcHRoLCBsb25nIGdyYWJQaWN0RmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBQaWNIYW5kbGUgcCkiKX0sCisgICAgeyJTR0dldExhc3RNb3ZpZVJlc0lEIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0TGFzdE1vdmllUmVzSUQsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHNob3J0IHJlc0lEKSIpfSwKKyAgICB7IlNHU2V0RmxhZ3MiLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRGbGFncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBsb25nIHNnRmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHR2V0RmxhZ3MiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRGbGFncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBzZ0ZsYWdzKSIpfSwKKyAgICB7IlNHTmV3Q2hhbm5lbEZyb21Db21wb25lbnQiLCAoUHlDRnVuY3Rpb24pUXRfU0dOZXdDaGFubmVsRnJvbUNvbXBvbmVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBDb21wb25lbnQgc2dDaGFubmVsQ29tcG9uZW50KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgU0dDaGFubmVsIG5ld0NoYW5uZWwpIil9LAorICAgIHsiU0dTZXRTZXR0aW5ncyIsIChQeUNGdW5jdGlvbilRdF9TR1NldFNldHRpbmdzLCAxLAorICAgICBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIFVzZXJEYXRhIHVkLCBsb25nIGZsYWdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTR0dldFNldHRpbmdzIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0U2V0dGluZ3MsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgbG9uZyBmbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFVzZXJEYXRhIHVkKSIpfSwKKyAgICB7IlNHR2V0SW5kQ2hhbm5lbCIsIChQeUNGdW5jdGlvbilRdF9TR0dldEluZENoYW5uZWwsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgc2hvcnQgaW5kZXgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBTR0NoYW5uZWwgcmVmLCBPU1R5cGUgY2hhblR5cGUpIil9LAorICAgIHsiU0dVcGRhdGUiLCAoUHlDRnVuY3Rpb24pUXRfU0dVcGRhdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgUmduSGFuZGxlIHVwZGF0ZVJnbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dHZXRQYXVzZSIsIChQeUNGdW5jdGlvbilRdF9TR0dldFBhdXNlLCAxLAorICAgICBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBCb29sZWFuIHBhdXNlZCkiKX0sCisgICAgeyJTR1NldENoYW5uZWxTZXR0aW5ncyIsIChQeUNGdW5jdGlvbilRdF9TR1NldENoYW5uZWxTZXR0aW5ncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBTR0NoYW5uZWwgYywgVXNlckRhdGEgdWQsIGxvbmcgZmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHR2V0Q2hhbm5lbFNldHRpbmdzIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0Q2hhbm5lbFNldHRpbmdzLCAxLAorICAgICBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIFNHQ2hhbm5lbCBjLCBsb25nIGZsYWdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgVXNlckRhdGEgdWQpIil9LAorICAgIHsiU0dHZXRNb2RlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0TW9kZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQm9vbGVhbiBwcmV2aWV3TW9kZSwgQm9vbGVhbiByZWNvcmRNb2RlKSIpfSwKKyAgICB7IlNHU2V0RGF0YVJlZiIsIChQeUNGdW5jdGlvbilRdF9TR1NldERhdGFSZWYsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgSGFuZGxlIGRhdGFSZWYsIE9TVHlwZSBkYXRhUmVmVHlwZSwgbG9uZyB3aGVyZUZsYWdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTR0dldERhdGFSZWYiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXREYXRhUmVmLCAxLAorICAgICBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlLCBsb25nIHdoZXJlRmxhZ3MpIil9LAorICAgIHsiU0dOZXdPdXRwdXQiLCAoUHlDRnVuY3Rpb24pUXRfU0dOZXdPdXRwdXQsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgSGFuZGxlIGRhdGFSZWYsIE9TVHlwZSBkYXRhUmVmVHlwZSwgbG9uZyB3aGVyZUZsYWdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgU0dPdXRwdXQgc2dPdXQpIil9LAorICAgIHsiU0dEaXNwb3NlT3V0cHV0IiwgKFB5Q0Z1bmN0aW9uKVF0X1NHRGlzcG9zZU91dHB1dCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBTR091dHB1dCBzZ091dCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dTZXRPdXRwdXRGbGFncyIsIChQeUNGdW5jdGlvbilRdF9TR1NldE91dHB1dEZsYWdzLCAxLAorICAgICBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIFNHT3V0cHV0IHNnT3V0LCBsb25nIHdoZXJlRmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHU2V0Q2hhbm5lbE91dHB1dCIsIChQeUNGdW5jdGlvbilRdF9TR1NldENoYW5uZWxPdXRwdXQsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgU0dDaGFubmVsIGMsIFNHT3V0cHV0IHNnT3V0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTR0dldERhdGFPdXRwdXRTdG9yYWdlU3BhY2VSZW1haW5pbmciLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXREYXRhT3V0cHV0U3RvcmFnZVNwYWNlUmVtYWluaW5nLCAxLAorICAgICBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIFNHT3V0cHV0IHNnT3V0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgbG9uZyBzcGFjZSkiKX0sCisgICAgeyJTR0hhbmRsZVVwZGF0ZUV2ZW50IiwgKFB5Q0Z1bmN0aW9uKVF0X1NHSGFuZGxlVXBkYXRlRXZlbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgRXZlbnRSZWNvcmQgZXZlbnQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBCb29sZWFuIGhhbmRsZWQpIil9LAorICAgIHsiU0dTZXRPdXRwdXROZXh0T3V0cHV0IiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0T3V0cHV0TmV4dE91dHB1dCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBTR091dHB1dCBzZ091dCwgU0dPdXRwdXQgbmV4dE91dCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dHZXRPdXRwdXROZXh0T3V0cHV0IiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0T3V0cHV0TmV4dE91dHB1dCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBTR091dHB1dCBzZ091dCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFNHT3V0cHV0IG5leHRPdXQpIil9LAorICAgIHsiU0dTZXRPdXRwdXRNYXhpbXVtT2Zmc2V0IiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0T3V0cHV0TWF4aW11bU9mZnNldCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBTR091dHB1dCBzZ091dCwgd2lkZSBtYXhPZmZzZXQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHR2V0T3V0cHV0TWF4aW11bU9mZnNldCIsIChQeUNGdW5jdGlvbilRdF9TR0dldE91dHB1dE1heGltdW1PZmZzZXQsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgU0dPdXRwdXQgc2dPdXQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB3aWRlIG1heE9mZnNldCkiKX0sCisgICAgeyJTR0dldE91dHB1dERhdGFSZWZlcmVuY2UiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRPdXRwdXREYXRhUmVmZXJlbmNlLCAxLAorICAgICBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIFNHT3V0cHV0IHNnT3V0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSGFuZGxlIGRhdGFSZWYsIE9TVHlwZSBkYXRhUmVmVHlwZSkiKX0sCisgICAgeyJTR1dyaXRlRXh0ZW5kZWRNb3ZpZURhdGEiLCAoUHlDRnVuY3Rpb24pUXRfU0dXcml0ZUV4dGVuZGVkTW92aWVEYXRhLCAxLAorICAgICBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIFNHQ2hhbm5lbCBjLCBQdHIgcCwgbG9uZyBsZW4pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB3aWRlIG9mZnNldCwgU0dPdXRwdXQgc2dPdXQpIil9LAorICAgIHsiU0dHZXRTdG9yYWdlU3BhY2VSZW1haW5pbmc2NCIsIChQeUNGdW5jdGlvbilRdF9TR0dldFN0b3JhZ2VTcGFjZVJlbWFpbmluZzY0LCAxLAorICAgICBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB3aWRlIGJ5dGVzKSIpfSwKKyAgICB7IlNHR2V0RGF0YU91dHB1dFN0b3JhZ2VTcGFjZVJlbWFpbmluZzY0IiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0RGF0YU91dHB1dFN0b3JhZ2VTcGFjZVJlbWFpbmluZzY0LCAxLAorICAgICBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIFNHT3V0cHV0IHNnT3V0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgd2lkZSBzcGFjZSkiKX0sCisgICAgeyJTR1dyaXRlTW92aWVEYXRhIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHV3JpdGVNb3ZpZURhdGEsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgU0dDaGFubmVsIGMsIFB0ciBwLCBsb25nIGxlbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgb2Zmc2V0KSIpfSwKKyAgICB7IlNHR2V0VGltZUJhc2UiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRUaW1lQmFzZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgVGltZUJhc2UgdGIpIil9LAorICAgIHsiU0dBZGRNb3ZpZURhdGEiLCAoUHlDRnVuY3Rpb24pUXRfU0dBZGRNb3ZpZURhdGEsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgU0dDaGFubmVsIGMsIFB0ciBwLCBsb25nIGxlbiwgbG9uZyBjaFJlZkNvbiwgVGltZVZhbHVlIHRpbWUsIHNob3J0IHdyaXRlVHlwZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgb2Zmc2V0KSIpfSwKKyAgICB7IlNHQ2hhbmdlZFNvdXJjZSIsIChQeUNGdW5jdGlvbilRdF9TR0NoYW5nZWRTb3VyY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgU0dDaGFubmVsIGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHQWRkRXh0ZW5kZWRNb3ZpZURhdGEiLCAoUHlDRnVuY3Rpb24pUXRfU0dBZGRFeHRlbmRlZE1vdmllRGF0YSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBTR0NoYW5uZWwgYywgUHRyIHAsIGxvbmcgbGVuLCBsb25nIGNoUmVmQ29uLCBUaW1lVmFsdWUgdGltZSwgc2hvcnQgd3JpdGVUeXBlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgd2lkZSBvZmZzZXQsIFNHT3V0cHV0IHdoaWNoT3V0cHV0KSIpfSwKKyAgICB7IlNHQWRkT3V0cHV0RGF0YVJlZlRvTWVkaWEiLCAoUHlDRnVuY3Rpb24pUXRfU0dBZGRPdXRwdXREYXRhUmVmVG9NZWRpYSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBTR091dHB1dCBzZ091dCwgTWVkaWEgdGhlTWVkaWEsIFNhbXBsZURlc2NyaXB0aW9uSGFuZGxlIGRlc2MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHU2V0U2V0dGluZ3NTdW1tYXJ5IiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0U2V0dGluZ3NTdW1tYXJ5LCAxLAorICAgICBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIEhhbmRsZSBzdW1tYXJ5VGV4dCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dTZXRDaGFubmVsVXNhZ2UiLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRDaGFubmVsVXNhZ2UsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBsb25nIHVzYWdlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTR0dldENoYW5uZWxVc2FnZSIsIChQeUNGdW5jdGlvbilRdF9TR0dldENoYW5uZWxVc2FnZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIHVzYWdlKSIpfSwKKyAgICB7IlNHU2V0Q2hhbm5lbEJvdW5kcyIsIChQeUNGdW5jdGlvbilRdF9TR1NldENoYW5uZWxCb3VuZHMsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBSZWN0IGJvdW5kcykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dHZXRDaGFubmVsQm91bmRzIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0Q2hhbm5lbEJvdW5kcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSZWN0IGJvdW5kcykiKX0sCisgICAgeyJTR1NldENoYW5uZWxWb2x1bWUiLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRDaGFubmVsVm9sdW1lLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgc2hvcnQgdm9sdW1lKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTR0dldENoYW5uZWxWb2x1bWUiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRDaGFubmVsVm9sdW1lLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHNob3J0IHZvbHVtZSkiKX0sCisgICAgeyJTR0dldENoYW5uZWxJbmZvIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0Q2hhbm5lbEluZm8sIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBjaGFubmVsSW5mbykiKX0sCisgICAgeyJTR1NldENoYW5uZWxQbGF5RmxhZ3MiLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRDaGFubmVsUGxheUZsYWdzLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgbG9uZyBwbGF5RmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHR2V0Q2hhbm5lbFBsYXlGbGFncyIsIChQeUNGdW5jdGlvbilRdF9TR0dldENoYW5uZWxQbGF5RmxhZ3MsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBwbGF5RmxhZ3MpIil9LAorICAgIHsiU0dTZXRDaGFubmVsTWF4RnJhbWVzIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0Q2hhbm5lbE1heEZyYW1lcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIGxvbmcgZnJhbWVDb3VudCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dHZXRDaGFubmVsTWF4RnJhbWVzIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0Q2hhbm5lbE1heEZyYW1lcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIGZyYW1lQ291bnQpIil9LAorICAgIHsiU0dTZXRDaGFubmVsUmVmQ29uIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0Q2hhbm5lbFJlZkNvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIGxvbmcgcmVmQ29uKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTR1NldENoYW5uZWxDbGlwIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0Q2hhbm5lbENsaXAsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBSZ25IYW5kbGUgdGhlQ2xpcCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dHZXRDaGFubmVsQ2xpcCIsIChQeUNGdW5jdGlvbilRdF9TR0dldENoYW5uZWxDbGlwLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJnbkhhbmRsZSB0aGVDbGlwKSIpfSwKKyAgICB7IlNHR2V0Q2hhbm5lbFNhbXBsZURlc2NyaXB0aW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0Q2hhbm5lbFNhbXBsZURlc2NyaXB0aW9uLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgSGFuZGxlIHNhbXBsZURlc2MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHU2V0Q2hhbm5lbERldmljZSIsIChQeUNGdW5jdGlvbilRdF9TR1NldENoYW5uZWxEZXZpY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBTdHJpbmdQdHIgbmFtZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dHZXRDaGFubmVsVGltZVNjYWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0Q2hhbm5lbFRpbWVTY2FsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBUaW1lU2NhbGUgc2NhbGUpIil9LAorICAgIHsiU0dDaGFubmVsUHV0UGljdHVyZSIsIChQeUNGdW5jdGlvbilRdF9TR0NoYW5uZWxQdXRQaWN0dXJlLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dDaGFubmVsU2V0UmVxdWVzdGVkRGF0YVJhdGUiLCAoUHlDRnVuY3Rpb24pUXRfU0dDaGFubmVsU2V0UmVxdWVzdGVkRGF0YVJhdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBsb25nIGJ5dGVzUGVyU2Vjb25kKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTR0NoYW5uZWxHZXRSZXF1ZXN0ZWREYXRhUmF0ZSIsIChQeUNGdW5jdGlvbilRdF9TR0NoYW5uZWxHZXRSZXF1ZXN0ZWREYXRhUmF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIGJ5dGVzUGVyU2Vjb25kKSIpfSwKKyAgICB7IlNHQ2hhbm5lbFNldERhdGFTb3VyY2VOYW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHQ2hhbm5lbFNldERhdGFTb3VyY2VOYW1lLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgU3RyMjU1IG5hbWUsIFNjcmlwdENvZGUgc2NyaXB0VGFnKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTR0NoYW5uZWxHZXREYXRhU291cmNlTmFtZSIsIChQeUNGdW5jdGlvbilRdF9TR0NoYW5uZWxHZXREYXRhU291cmNlTmFtZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIFN0cjI1NSBuYW1lKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgU2NyaXB0Q29kZSBzY3JpcHRUYWcpIil9LAorICAgIHsiU0dDaGFubmVsU2V0Q29kZWNTZXR0aW5ncyIsIChQeUNGdW5jdGlvbilRdF9TR0NoYW5uZWxTZXRDb2RlY1NldHRpbmdzLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgSGFuZGxlIHNldHRpbmdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTR0NoYW5uZWxHZXRDb2RlY1NldHRpbmdzIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHQ2hhbm5lbEdldENvZGVjU2V0dGluZ3MsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSGFuZGxlIHNldHRpbmdzKSIpfSwKKyAgICB7IlNHR2V0Q2hhbm5lbFRpbWVCYXNlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0Q2hhbm5lbFRpbWVCYXNlLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFRpbWVCYXNlIHRiKSIpfSwKKyAgICB7IlNHR2V0Q2hhbm5lbFJlZkNvbiIsIChQeUNGdW5jdGlvbilRdF9TR0dldENoYW5uZWxSZWZDb24sIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyByZWZDb24pIil9LAorICAgIHsiU0dHZXRDaGFubmVsRGV2aWNlQW5kSW5wdXROYW1lcyIsIChQeUNGdW5jdGlvbilRdF9TR0dldENoYW5uZWxEZXZpY2VBbmRJbnB1dE5hbWVzLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgU3RyMjU1IG91dERldmljZU5hbWUsIFN0cjI1NSBvdXRJbnB1dE5hbWUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBzaG9ydCBvdXRJbnB1dE51bWJlcikiKX0sCisgICAgeyJTR1NldENoYW5uZWxEZXZpY2VJbnB1dCIsIChQeUNGdW5jdGlvbilRdF9TR1NldENoYW5uZWxEZXZpY2VJbnB1dCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIHNob3J0IGluSW5wdXROdW1iZXIpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHU2V0Q2hhbm5lbFNldHRpbmdzU3RhdGVDaGFuZ2luZyIsIChQeUNGdW5jdGlvbilRdF9TR1NldENoYW5uZWxTZXR0aW5nc1N0YXRlQ2hhbmdpbmcsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBVSW50MzIgaW5GbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dJbml0Q2hhbm5lbCIsIChQeUNGdW5jdGlvbilRdF9TR0luaXRDaGFubmVsLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgU2VxR3JhYkNvbXBvbmVudCBvd25lcikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dXcml0ZVNhbXBsZXMiLCAoUHlDRnVuY3Rpb24pUXRfU0dXcml0ZVNhbXBsZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBNb3ZpZSBtLCBBbGlhc0hhbmRsZSB0aGVGaWxlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTR0dldERhdGFSYXRlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0RGF0YVJhdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBieXRlc1BlclNlY29uZCkiKX0sCisgICAgeyJTR0FsaWduQ2hhbm5lbFJlY3QiLCAoUHlDRnVuY3Rpb24pUXRfU0dBbGlnbkNoYW5uZWxSZWN0LCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJlY3QgcikiKX0sCisgICAgeyJTR1BhbmVsR2V0RGl0bCIsIChQeUNGdW5jdGlvbilRdF9TR1BhbmVsR2V0RGl0bCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSGFuZGxlIGRpdGwpIil9LAorICAgIHsiU0dQYW5lbEdldFRpdGxlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHUGFuZWxHZXRUaXRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBTdHIyNTUgdGl0bGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHUGFuZWxDYW5SdW4iLCAoUHlDRnVuY3Rpb24pUXRfU0dQYW5lbENhblJ1biwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dQYW5lbEluc3RhbGwiLCAoUHlDRnVuY3Rpb24pUXRfU0dQYW5lbEluc3RhbGwsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgU0dDaGFubmVsIGMsIERpYWxvZ1B0ciBkLCBzaG9ydCBpdGVtT2Zmc2V0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTR1BhbmVsRXZlbnQiLCAoUHlDRnVuY3Rpb24pUXRfU0dQYW5lbEV2ZW50LCAxLAorICAgICBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIFNHQ2hhbm5lbCBjLCBEaWFsb2dQdHIgZCwgc2hvcnQgaXRlbU9mZnNldCwgRXZlbnRSZWNvcmQgdGhlRXZlbnQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBzaG9ydCBpdGVtSGl0LCBCb29sZWFuIGhhbmRsZWQpIil9LAorICAgIHsiU0dQYW5lbEl0ZW0iLCAoUHlDRnVuY3Rpb24pUXRfU0dQYW5lbEl0ZW0sIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgU0dDaGFubmVsIGMsIERpYWxvZ1B0ciBkLCBzaG9ydCBpdGVtT2Zmc2V0LCBzaG9ydCBpdGVtTnVtKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTR1BhbmVsUmVtb3ZlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHUGFuZWxSZW1vdmUsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgU0dDaGFubmVsIGMsIERpYWxvZ1B0ciBkLCBzaG9ydCBpdGVtT2Zmc2V0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTR1BhbmVsU2V0R3JhYmJlciIsIChQeUNGdW5jdGlvbilRdF9TR1BhbmVsU2V0R3JhYmJlciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBTZXFHcmFiQ29tcG9uZW50IHNnKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTR1BhbmVsU2V0UmVzRmlsZSIsIChQeUNGdW5jdGlvbilRdF9TR1BhbmVsU2V0UmVzRmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBzaG9ydCByZXNSZWYpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHUGFuZWxHZXRTZXR0aW5ncyIsIChQeUNGdW5jdGlvbilRdF9TR1BhbmVsR2V0U2V0dGluZ3MsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgU0dDaGFubmVsIGMsIGxvbmcgZmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBVc2VyRGF0YSB1ZCkiKX0sCisgICAgeyJTR1BhbmVsU2V0U2V0dGluZ3MiLCAoUHlDRnVuY3Rpb24pUXRfU0dQYW5lbFNldFNldHRpbmdzLCAxLAorICAgICBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIFNHQ2hhbm5lbCBjLCBVc2VyRGF0YSB1ZCwgbG9uZyBmbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dQYW5lbFZhbGlkYXRlSW5wdXQiLCAoUHlDRnVuY3Rpb24pUXRfU0dQYW5lbFZhbGlkYXRlSW5wdXQsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEJvb2xlYW4gb2spIil9LAorICAgIHsiU0dQYW5lbEdldERJVExGb3JTaXplIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHUGFuZWxHZXRESVRMRm9yU2l6ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSGFuZGxlIGRpdGwsIFBvaW50IHJlcXVlc3RlZFNpemUpIil9LAorICAgIHsiU0dHZXRTcmNWaWRlb0JvdW5kcyIsIChQeUNGdW5jdGlvbilRdF9TR0dldFNyY1ZpZGVvQm91bmRzLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJlY3QgcikiKX0sCisgICAgeyJTR1NldFZpZGVvUmVjdCIsIChQeUNGdW5jdGlvbilRdF9TR1NldFZpZGVvUmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIFJlY3QgcikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dHZXRWaWRlb1JlY3QiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRWaWRlb1JlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmVjdCByKSIpfSwKKyAgICB7IlNHR2V0VmlkZW9Db21wcmVzc29yVHlwZSIsIChQeUNGdW5jdGlvbilRdF9TR0dldFZpZGVvQ29tcHJlc3NvclR5cGUsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgT1NUeXBlIGNvbXByZXNzb3JUeXBlKSIpfSwKKyAgICB7IlNHU2V0VmlkZW9Db21wcmVzc29yVHlwZSIsIChQeUNGdW5jdGlvbilRdF9TR1NldFZpZGVvQ29tcHJlc3NvclR5cGUsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBPU1R5cGUgY29tcHJlc3NvclR5cGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHU2V0VmlkZW9Db21wcmVzc29yIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0VmlkZW9Db21wcmVzc29yLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgc2hvcnQgZGVwdGgsIENvbXByZXNzb3JDb21wb25lbnQgY29tcHJlc3NvciwgQ29kZWNRIHNwYXRpYWxRdWFsaXR5LCBDb2RlY1EgdGVtcG9yYWxRdWFsaXR5LCBsb25nIGtleUZyYW1lUmF0ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dHZXRWaWRlb0NvbXByZXNzb3IiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRWaWRlb0NvbXByZXNzb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgc2hvcnQgZGVwdGgsIENvbXByZXNzb3JDb21wb25lbnQgY29tcHJlc3NvciwgQ29kZWNRIHNwYXRpYWxRdWFsaXR5LCBDb2RlY1EgdGVtcG9yYWxRdWFsaXR5LCBsb25nIGtleUZyYW1lUmF0ZSkiKX0sCisgICAgeyJTR0dldFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0VmlkZW9EaWdpdGl6ZXJDb21wb25lbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50SW5zdGFuY2UgX3J2KSIpfSwKKyAgICB7IlNHU2V0VmlkZW9EaWdpdGl6ZXJDb21wb25lbnQiLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRWaWRlb0RpZ2l0aXplckNvbXBvbmVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIENvbXBvbmVudEluc3RhbmNlIHZkaWcpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHVmlkZW9EaWdpdGl6ZXJDaGFuZ2VkIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHVmlkZW9EaWdpdGl6ZXJDaGFuZ2VkLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dHcmFiRnJhbWUiLCAoUHlDRnVuY3Rpb24pUXRfU0dHcmFiRnJhbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBzaG9ydCBidWZmZXJOdW0pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHR3JhYkZyYW1lQ29tcGxldGUiLCAoUHlDRnVuY3Rpb24pUXRfU0dHcmFiRnJhbWVDb21wbGV0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIHNob3J0IGJ1ZmZlck51bSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEJvb2xlYW4gZG9uZSkiKX0sCisgICAgeyJTR0NvbXByZXNzRnJhbWUiLCAoUHlDRnVuY3Rpb24pUXRfU0dDb21wcmVzc0ZyYW1lLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgc2hvcnQgYnVmZmVyTnVtKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTR1NldENvbXByZXNzQnVmZmVyIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0Q29tcHJlc3NCdWZmZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBzaG9ydCBkZXB0aCwgUmVjdCBjb21wcmVzc1NpemUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHR2V0Q29tcHJlc3NCdWZmZXIiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRDb21wcmVzc0J1ZmZlciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBzaG9ydCBkZXB0aCwgUmVjdCBjb21wcmVzc1NpemUpIil9LAorICAgIHsiU0dHZXRCdWZmZXJJbmZvIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0QnVmZmVySW5mbywgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIHNob3J0IGJ1ZmZlck51bSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFBpeE1hcEhhbmRsZSBidWZmZXJQTSwgUmVjdCBidWZmZXJSZWN0LCBHV29ybGRQdHIgY29tcHJlc3NCdWZmZXIsIFJlY3QgY29tcHJlc3NCdWZmZXJSZWN0KSIpfSwKKyAgICB7IlNHU2V0VXNlU2NyZWVuQnVmZmVyIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0VXNlU2NyZWVuQnVmZmVyLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgQm9vbGVhbiB1c2VTY3JlZW5CdWZmZXIpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHR2V0VXNlU2NyZWVuQnVmZmVyIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0VXNlU2NyZWVuQnVmZmVyLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEJvb2xlYW4gdXNlU2NyZWVuQnVmZmVyKSIpfSwKKyAgICB7IlNHU2V0RnJhbWVSYXRlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0RnJhbWVSYXRlLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgRml4ZWQgZnJhbWVSYXRlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTR0dldEZyYW1lUmF0ZSIsIChQeUNGdW5jdGlvbilRdF9TR0dldEZyYW1lUmF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBGaXhlZCBmcmFtZVJhdGUpIil9LAorICAgIHsiU0dTZXRQcmVmZXJyZWRQYWNrZXRTaXplIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0UHJlZmVycmVkUGFja2V0U2l6ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIGxvbmcgcHJlZmVycmVkUGFja2V0U2l6ZUluQnl0ZXMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHR2V0UHJlZmVycmVkUGFja2V0U2l6ZSIsIChQeUNGdW5jdGlvbilRdF9TR0dldFByZWZlcnJlZFBhY2tldFNpemUsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBwcmVmZXJyZWRQYWNrZXRTaXplSW5CeXRlcykiKX0sCisgICAgeyJTR1NldFVzZXJWaWRlb0NvbXByZXNzb3JMaXN0IiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0VXNlclZpZGVvQ29tcHJlc3Nvckxpc3QsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBIYW5kbGUgY29tcHJlc3NvclR5cGVzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTR0dldFVzZXJWaWRlb0NvbXByZXNzb3JMaXN0IiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0VXNlclZpZGVvQ29tcHJlc3Nvckxpc3QsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSGFuZGxlIGNvbXByZXNzb3JUeXBlcykiKX0sCisgICAgeyJTR1NldFNvdW5kSW5wdXREcml2ZXIiLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRTb3VuZElucHV0RHJpdmVyLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgU3RyMjU1IGRyaXZlck5hbWUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHR2V0U291bmRJbnB1dERyaXZlciIsIChQeUNGdW5jdGlvbilRdF9TR0dldFNvdW5kSW5wdXREcml2ZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAobG9uZyBfcnYpIil9LAorICAgIHsiU0dTb3VuZElucHV0RHJpdmVyQ2hhbmdlZCIsIChQeUNGdW5jdGlvbilRdF9TR1NvdW5kSW5wdXREcml2ZXJDaGFuZ2VkLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dTZXRTb3VuZFJlY29yZENodW5rU2l6ZSIsIChQeUNGdW5jdGlvbilRdF9TR1NldFNvdW5kUmVjb3JkQ2h1bmtTaXplLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgbG9uZyBzZWNvbmRzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTR0dldFNvdW5kUmVjb3JkQ2h1bmtTaXplIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0U291bmRSZWNvcmRDaHVua1NpemUsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAobG9uZyBfcnYpIil9LAorICAgIHsiU0dTZXRTb3VuZElucHV0UmF0ZSIsIChQeUNGdW5jdGlvbilRdF9TR1NldFNvdW5kSW5wdXRSYXRlLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgRml4ZWQgcmF0ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dHZXRTb3VuZElucHV0UmF0ZSIsIChQeUNGdW5jdGlvbilRdF9TR0dldFNvdW5kSW5wdXRSYXRlLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYykgLT4gKEZpeGVkIF9ydikiKX0sCisgICAgeyJTR1NldFNvdW5kSW5wdXRQYXJhbWV0ZXJzIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0U291bmRJbnB1dFBhcmFtZXRlcnMsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBzaG9ydCBzYW1wbGVTaXplLCBzaG9ydCBudW1DaGFubmVscywgT1NUeXBlIGNvbXByZXNzaW9uVHlwZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dHZXRTb3VuZElucHV0UGFyYW1ldGVycyIsIChQeUNGdW5jdGlvbilRdF9TR0dldFNvdW5kSW5wdXRQYXJhbWV0ZXJzLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHNob3J0IHNhbXBsZVNpemUsIHNob3J0IG51bUNoYW5uZWxzLCBPU1R5cGUgY29tcHJlc3Npb25UeXBlKSIpfSwKKyAgICB7IlNHU2V0QWRkaXRpb25hbFNvdW5kUmF0ZXMiLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRBZGRpdGlvbmFsU291bmRSYXRlcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIEhhbmRsZSByYXRlcykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dHZXRBZGRpdGlvbmFsU291bmRSYXRlcyIsIChQeUNGdW5jdGlvbilRdF9TR0dldEFkZGl0aW9uYWxTb3VuZFJhdGVzLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEhhbmRsZSByYXRlcykiKX0sCisgICAgeyJTR1NldEZvbnROYW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0Rm9udE5hbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBTdHJpbmdQdHIgcHN0cikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dTZXRGb250U2l6ZSIsIChQeUNGdW5jdGlvbilRdF9TR1NldEZvbnRTaXplLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgc2hvcnQgZm9udFNpemUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHU2V0VGV4dEZvcmVDb2xvciIsIChQeUNGdW5jdGlvbilRdF9TR1NldFRleHRGb3JlQ29sb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUkdCQ29sb3IgdGhlQ29sb3IpIil9LAorICAgIHsiU0dTZXRUZXh0QmFja0NvbG9yIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0VGV4dEJhY2tDb2xvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSR0JDb2xvciB0aGVDb2xvcikiKX0sCisgICAgeyJTR1NldEp1c3RpZmljYXRpb24iLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRKdXN0aWZpY2F0aW9uLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgc2hvcnQganVzdCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dHZXRUZXh0UmV0dXJuVG9TcGFjZVZhbHVlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0VGV4dFJldHVyblRvU3BhY2VWYWx1ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBzaG9ydCByZXR0b3NwYWNlKSIpfSwKKyAgICB7IlNHU2V0VGV4dFJldHVyblRvU3BhY2VWYWx1ZSIsIChQeUNGdW5jdGlvbilRdF9TR1NldFRleHRSZXR1cm5Ub1NwYWNlVmFsdWUsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBzaG9ydCByZXR0b3NwYWNlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJRVFZpZGVvT3V0cHV0R2V0Q3VycmVudENsaWVudE5hbWUiLCAoUHlDRnVuY3Rpb24pUXRfUVRWaWRlb091dHB1dEdldEN1cnJlbnRDbGllbnROYW1lLCAxLAorICAgICBQeURvY19TVFIoIihRVFZpZGVvT3V0cHV0Q29tcG9uZW50IHZvLCBTdHIyNTUgc3RyKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJRVFZpZGVvT3V0cHV0U2V0Q2xpZW50TmFtZSIsIChQeUNGdW5jdGlvbilRdF9RVFZpZGVvT3V0cHV0U2V0Q2xpZW50TmFtZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUVRWaWRlb091dHB1dENvbXBvbmVudCB2bywgU3RyMjU1IHN0cikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiUVRWaWRlb091dHB1dEdldENsaWVudE5hbWUiLCAoUHlDRnVuY3Rpb24pUXRfUVRWaWRlb091dHB1dEdldENsaWVudE5hbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKFFUVmlkZW9PdXRwdXRDb21wb25lbnQgdm8sIFN0cjI1NSBzdHIpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlFUVmlkZW9PdXRwdXRCZWdpbiIsIChQeUNGdW5jdGlvbilRdF9RVFZpZGVvT3V0cHV0QmVnaW4sIDEsCisgICAgIFB5RG9jX1NUUigiKFFUVmlkZW9PdXRwdXRDb21wb25lbnQgdm8pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlFUVmlkZW9PdXRwdXRFbmQiLCAoUHlDRnVuY3Rpb24pUXRfUVRWaWRlb091dHB1dEVuZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUVRWaWRlb091dHB1dENvbXBvbmVudCB2bykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiUVRWaWRlb091dHB1dFNldERpc3BsYXlNb2RlIiwgKFB5Q0Z1bmN0aW9uKVF0X1FUVmlkZW9PdXRwdXRTZXREaXNwbGF5TW9kZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUVRWaWRlb091dHB1dENvbXBvbmVudCB2bywgbG9uZyBkaXNwbGF5TW9kZUlEKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJRVFZpZGVvT3V0cHV0R2V0RGlzcGxheU1vZGUiLCAoUHlDRnVuY3Rpb24pUXRfUVRWaWRlb091dHB1dEdldERpc3BsYXlNb2RlLCAxLAorICAgICBQeURvY19TVFIoIihRVFZpZGVvT3V0cHV0Q29tcG9uZW50IHZvKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBkaXNwbGF5TW9kZUlEKSIpfSwKKyAgICB7IlFUVmlkZW9PdXRwdXRHZXRHV29ybGQiLCAoUHlDRnVuY3Rpb24pUXRfUVRWaWRlb091dHB1dEdldEdXb3JsZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUVRWaWRlb091dHB1dENvbXBvbmVudCB2bykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEdXb3JsZFB0ciBndykiKX0sCisgICAgeyJRVFZpZGVvT3V0cHV0R2V0SW5kU291bmRPdXRwdXQiLCAoUHlDRnVuY3Rpb24pUXRfUVRWaWRlb091dHB1dEdldEluZFNvdW5kT3V0cHV0LCAxLAorICAgICBQeURvY19TVFIoIihRVFZpZGVvT3V0cHV0Q29tcG9uZW50IHZvLCBsb25nIGluZGV4KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQ29tcG9uZW50IG91dHB1dENvbXBvbmVudCkiKX0sCisgICAgeyJRVFZpZGVvT3V0cHV0R2V0Q2xvY2siLCAoUHlDRnVuY3Rpb24pUXRfUVRWaWRlb091dHB1dEdldENsb2NrLCAxLAorICAgICBQeURvY19TVFIoIihRVFZpZGVvT3V0cHV0Q29tcG9uZW50IHZvKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQ29tcG9uZW50SW5zdGFuY2UgY2xvY2spIil9LAorICAgIHsiUVRWaWRlb091dHB1dFNldEVjaG9Qb3J0IiwgKFB5Q0Z1bmN0aW9uKVF0X1FUVmlkZW9PdXRwdXRTZXRFY2hvUG9ydCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUVRWaWRlb091dHB1dENvbXBvbmVudCB2bywgQ0dyYWZQdHIgZWNob1BvcnQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlFUVmlkZW9PdXRwdXRHZXRJbmRJbWFnZURlY29tcHJlc3NvciIsIChQeUNGdW5jdGlvbilRdF9RVFZpZGVvT3V0cHV0R2V0SW5kSW1hZ2VEZWNvbXByZXNzb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKFFUVmlkZW9PdXRwdXRDb21wb25lbnQgdm8sIGxvbmcgaW5kZXgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBDb21wb25lbnQgY29kZWMpIil9LAorICAgIHsiUVRWaWRlb091dHB1dEJhc2VTZXRFY2hvUG9ydCIsIChQeUNGdW5jdGlvbilRdF9RVFZpZGVvT3V0cHV0QmFzZVNldEVjaG9Qb3J0LCAxLAorICAgICBQeURvY19TVFIoIihRVFZpZGVvT3V0cHV0Q29tcG9uZW50IHZvLCBDR3JhZlB0ciBlY2hvUG9ydCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTWVkaWFTZXRDaHVua01hbmFnZW1lbnRGbGFncyIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVNldENodW5rTWFuYWdlbWVudEZsYWdzLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFVJbnQzMiBmbGFncywgVUludDMyIGZsYWdzTWFzaykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTWVkaWFHZXRDaHVua01hbmFnZW1lbnRGbGFncyIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUdldENodW5rTWFuYWdlbWVudEZsYWdzLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBVSW50MzIgZmxhZ3MpIil9LAorICAgIHsiTWVkaWFTZXRQdXJnZWFibGVDaHVua01lbW9yeUFsbG93YW5jZSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVNldFB1cmdlYWJsZUNodW5rTWVtb3J5QWxsb3dhbmNlLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFNpemUgYWxsb3dhbmNlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNZWRpYUdldFB1cmdlYWJsZUNodW5rTWVtb3J5QWxsb3dhbmNlIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhR2V0UHVyZ2VhYmxlQ2h1bmtNZW1vcnlBbGxvd2FuY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFNpemUgYWxsb3dhbmNlKSIpfSwKKyAgICB7Ik1lZGlhRW1wdHlBbGxQdXJnZWFibGVDaHVua3MiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFFbXB0eUFsbFB1cmdlYWJsZUNodW5rcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNZWRpYVNldEhhbmRsZXJDYXBhYmlsaXRpZXMiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFTZXRIYW5kbGVyQ2FwYWJpbGl0aWVzLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIGxvbmcgZmxhZ3MsIGxvbmcgZmxhZ3NNYXNrKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNZWRpYUlkbGUiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFJZGxlLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFRpbWVWYWx1ZSBhdE1lZGlhVGltZSwgbG9uZyBmbGFnc0luLCBUaW1lUmVjb3JkIG1vdmllVGltZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgZmxhZ3NPdXQpIil9LAorICAgIHsiTWVkaWFHZXRNZWRpYUluZm8iLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFHZXRNZWRpYUluZm8sIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgSGFuZGxlIGgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1lZGlhUHV0TWVkaWFJbmZvIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhUHV0TWVkaWFJbmZvLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIEhhbmRsZSBoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNZWRpYVNldEFjdGl2ZSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVNldEFjdGl2ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBCb29sZWFuIGVuYWJsZU1lZGlhKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNZWRpYVNldFJhdGUiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFTZXRSYXRlLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIEZpeGVkIHJhdGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1lZGlhR0dldFN0YXR1cyIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUdHZXRTdGF0dXMsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIENvbXBvbmVudFJlc3VsdCBzdGF0dXNFcnIpIil9LAorICAgIHsiTWVkaWFUcmFja0VkaXRlZCIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVRyYWNrRWRpdGVkLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1lZGlhU2V0TWVkaWFUaW1lU2NhbGUiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFTZXRNZWRpYVRpbWVTY2FsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBUaW1lU2NhbGUgbmV3VGltZVNjYWxlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNZWRpYVNldE1vdmllVGltZVNjYWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhU2V0TW92aWVUaW1lU2NhbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgVGltZVNjYWxlIG5ld1RpbWVTY2FsZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTWVkaWFTZXRHV29ybGQiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFTZXRHV29ybGQsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgQ0dyYWZQdHIgYVBvcnQsIEdESGFuZGxlIGFHRCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTWVkaWFTZXREaW1lbnNpb25zIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhU2V0RGltZW5zaW9ucywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBGaXhlZCB3aWR0aCwgRml4ZWQgaGVpZ2h0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNZWRpYVNldENsaXAiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFTZXRDbGlwLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFJnbkhhbmRsZSB0aGVDbGlwKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNZWRpYUdldFRyYWNrT3BhcXVlIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhR2V0VHJhY2tPcGFxdWUsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEJvb2xlYW4gdHJhY2tJc09wYXF1ZSkiKX0sCisgICAgeyJNZWRpYVNldEdyYXBoaWNzTW9kZSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVNldEdyYXBoaWNzTW9kZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBsb25nIG1vZGUsIFJHQkNvbG9yIG9wQ29sb3IpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1lZGlhR2V0R3JhcGhpY3NNb2RlIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhR2V0R3JhcGhpY3NNb2RlLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIG1vZGUsIFJHQkNvbG9yIG9wQ29sb3IpIil9LAorICAgIHsiTWVkaWFHU2V0Vm9sdW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhR1NldFZvbHVtZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBzaG9ydCB2b2x1bWUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1lZGlhU2V0U291bmRCYWxhbmNlIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhU2V0U291bmRCYWxhbmNlLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIHNob3J0IGJhbGFuY2UpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1lZGlhR2V0U291bmRCYWxhbmNlIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhR2V0U291bmRCYWxhbmNlLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBzaG9ydCBiYWxhbmNlKSIpfSwKKyAgICB7Ik1lZGlhR2V0TmV4dEJvdW5kc0NoYW5nZSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUdldE5leHRCb3VuZHNDaGFuZ2UsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFRpbWVWYWx1ZSB3aGVuKSIpfSwKKyAgICB7Ik1lZGlhR2V0U3JjUmduIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhR2V0U3JjUmduLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFJnbkhhbmRsZSByZ24sIFRpbWVWYWx1ZSBhdE1lZGlhVGltZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTWVkaWFQcmVyb2xsIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhUHJlcm9sbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBUaW1lVmFsdWUgdGltZSwgRml4ZWQgcmF0ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTWVkaWFTYW1wbGVEZXNjcmlwdGlvbkNoYW5nZWQiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFTYW1wbGVEZXNjcmlwdGlvbkNoYW5nZWQsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgbG9uZyBpbmRleCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTWVkaWFIYXNDaGFyYWN0ZXJpc3RpYyIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUhhc0NoYXJhY3RlcmlzdGljLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIE9TVHlwZSBjaGFyYWN0ZXJpc3RpYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEJvb2xlYW4gaGFzSXQpIil9LAorICAgIHsiTWVkaWFHZXRPZmZzY3JlZW5CdWZmZXJTaXplIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhR2V0T2Zmc2NyZWVuQnVmZmVyU2l6ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBzaG9ydCBkZXB0aCwgQ1RhYkhhbmRsZSBjdGFiKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmVjdCBib3VuZHMpIil9LAorICAgIHsiTWVkaWFTZXRIaW50cyIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVNldEhpbnRzLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIGxvbmcgaGludHMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1lZGlhR2V0TmFtZSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUdldE5hbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgU3RyMjU1IG5hbWUsIGxvbmcgcmVxdWVzdGVkTGFuZ3VhZ2UpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIGFjdHVhbExhbmd1YWdlKSIpfSwKKyAgICB7Ik1lZGlhRm9yY2VVcGRhdGUiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFGb3JjZVVwZGF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBsb25nIGZvcmNlVXBkYXRlRmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1lZGlhR2V0RHJhd2luZ1JnbiIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUdldERyYXdpbmdSZ24sIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJnbkhhbmRsZSBwYXJ0aWFsUmduKSIpfSwKKyAgICB7Ik1lZGlhR1NldEFjdGl2ZVNlZ21lbnQiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFHU2V0QWN0aXZlU2VnbWVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBUaW1lVmFsdWUgYWN0aXZlU3RhcnQsIFRpbWVWYWx1ZSBhY3RpdmVEdXJhdGlvbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTWVkaWFJbnZhbGlkYXRlUmVnaW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhSW52YWxpZGF0ZVJlZ2lvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBSZ25IYW5kbGUgaW52YWxSZ24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1lZGlhR2V0TmV4dFN0ZXBUaW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhR2V0TmV4dFN0ZXBUaW1lLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIHNob3J0IGZsYWdzLCBUaW1lVmFsdWUgbWVkaWFUaW1lSW4sIEZpeGVkIHJhdGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBUaW1lVmFsdWUgbWVkaWFUaW1lT3V0KSIpfSwKKyAgICB7Ik1lZGlhQ2hhbmdlZE5vblByaW1hcnlTb3VyY2UiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFDaGFuZ2VkTm9uUHJpbWFyeVNvdXJjZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBsb25nIGlucHV0SW5kZXgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1lZGlhVHJhY2tSZWZlcmVuY2VzQ2hhbmdlZCIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVRyYWNrUmVmZXJlbmNlc0NoYW5nZWQsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTWVkaWFSZWxlYXNlU2FtcGxlRGF0YVBvaW50ZXIiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFSZWxlYXNlU2FtcGxlRGF0YVBvaW50ZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgbG9uZyBzYW1wbGVOdW0pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1lZGlhVHJhY2tQcm9wZXJ0eUF0b21DaGFuZ2VkIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhVHJhY2tQcm9wZXJ0eUF0b21DaGFuZ2VkLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1lZGlhU2V0VmlkZW9QYXJhbSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVNldFZpZGVvUGFyYW0sIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgbG9uZyB3aGljaFBhcmFtKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgc2hvcnQgdmFsdWUpIil9LAorICAgIHsiTWVkaWFHZXRWaWRlb1BhcmFtIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhR2V0VmlkZW9QYXJhbSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBsb25nIHdoaWNoUGFyYW0pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBzaG9ydCB2YWx1ZSkiKX0sCisgICAgeyJNZWRpYUNvbXBhcmUiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFDb21wYXJlLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIE1lZGlhIHNyY01lZGlhLCBDb21wb25lbnRJbnN0YW5jZSBzcmNNZWRpYUNvbXBvbmVudCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEJvb2xlYW4gaXNPSykiKX0sCisgICAgeyJNZWRpYUdldENsb2NrIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhR2V0Q2xvY2ssIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIENvbXBvbmVudEluc3RhbmNlIGNsb2NrKSIpfSwKKyAgICB7Ik1lZGlhU2V0U291bmRPdXRwdXRDb21wb25lbnQiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFTZXRTb3VuZE91dHB1dENvbXBvbmVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBDb21wb25lbnQgb3V0cHV0Q29tcG9uZW50KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNZWRpYUdldFNvdW5kT3V0cHV0Q29tcG9uZW50IiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhR2V0U291bmRPdXRwdXRDb21wb25lbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIENvbXBvbmVudCBvdXRwdXRDb21wb25lbnQpIil9LAorICAgIHsiTWVkaWFTZXRTb3VuZExvY2FsaXphdGlvbkRhdGEiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFTZXRTb3VuZExvY2FsaXphdGlvbkRhdGEsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgSGFuZGxlIGRhdGEpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1lZGlhR2V0SW52YWxpZFJlZ2lvbiIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUdldEludmFsaWRSZWdpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgUmduSGFuZGxlIHJnbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTWVkaWFTYW1wbGVEZXNjcmlwdGlvbkIyTiIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVNhbXBsZURlc2NyaXB0aW9uQjJOLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFNhbXBsZURlc2NyaXB0aW9uSGFuZGxlIHNhbXBsZURlc2NyaXB0aW9uSCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTWVkaWFTYW1wbGVEZXNjcmlwdGlvbk4yQiIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVNhbXBsZURlc2NyaXB0aW9uTjJCLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFNhbXBsZURlc2NyaXB0aW9uSGFuZGxlIHNhbXBsZURlc2NyaXB0aW9uSCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTWVkaWFGbHVzaE5vblByaW1hcnlTb3VyY2VEYXRhIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhRmx1c2hOb25QcmltYXJ5U291cmNlRGF0YSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBsb25nIGlucHV0SW5kZXgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1lZGlhR2V0VVJMTGluayIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUdldFVSTExpbmssIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgUG9pbnQgZGlzcGxheVdoZXJlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSGFuZGxlIHVybExpbmspIil9LAorICAgIHsiTWVkaWFIaXRUZXN0Rm9yVGFyZ2V0UmVmQ29uIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhSGl0VGVzdEZvclRhcmdldFJlZkNvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBsb25nIGZsYWdzLCBQb2ludCBsb2MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIHRhcmdldFJlZkNvbikiKX0sCisgICAgeyJNZWRpYUhpdFRlc3RUYXJnZXRSZWZDb24iLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFIaXRUZXN0VGFyZ2V0UmVmQ29uLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIGxvbmcgdGFyZ2V0UmVmQ29uLCBsb25nIGZsYWdzLCBQb2ludCBsb2MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBCb29sZWFuIHdhc0hpdCkiKX0sCisgICAgeyJNZWRpYURpc3Bvc2VUYXJnZXRSZWZDb24iLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFEaXNwb3NlVGFyZ2V0UmVmQ29uLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIGxvbmcgdGFyZ2V0UmVmQ29uKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNZWRpYVRhcmdldFJlZkNvbnNFcXVhbCIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVRhcmdldFJlZkNvbnNFcXVhbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBsb25nIGZpcnN0UmVmQ29uLCBsb25nIHNlY29uZFJlZkNvbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEJvb2xlYW4gZXF1YWwpIil9LAorICAgIHsiTWVkaWFQcmVQcmVyb2xsQ2FuY2VsIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhUHJlUHJlcm9sbENhbmNlbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCB2b2lkICogcmVmY29uKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNZWRpYUVudGVyRW1wdHlFZGl0IiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhRW50ZXJFbXB0eUVkaXQsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTWVkaWFDdXJyZW50TWVkaWFRdWV1ZWREYXRhIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhQ3VycmVudE1lZGlhUXVldWVkRGF0YSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBtaWxsaVNlY3MpIil9LAorICAgIHsiTWVkaWFHZXRFZmZlY3RpdmVWb2x1bWUiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFHZXRFZmZlY3RpdmVWb2x1bWUsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHNob3J0IHZvbHVtZSkiKX0sCisgICAgeyJNZWRpYUdldFNvdW5kTGV2ZWxNZXRlcmluZ0VuYWJsZWQiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFHZXRTb3VuZExldmVsTWV0ZXJpbmdFbmFibGVkLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBCb29sZWFuIGVuYWJsZWQpIil9LAorICAgIHsiTWVkaWFTZXRTb3VuZExldmVsTWV0ZXJpbmdFbmFibGVkIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhU2V0U291bmRMZXZlbE1ldGVyaW5nRW5hYmxlZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBCb29sZWFuIGVuYWJsZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTWVkaWFHZXRFZmZlY3RpdmVTb3VuZEJhbGFuY2UiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFHZXRFZmZlY3RpdmVTb3VuZEJhbGFuY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHNob3J0IGJhbGFuY2UpIil9LAorICAgIHsiTWVkaWFTZXRTY3JlZW5Mb2NrIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhU2V0U2NyZWVuTG9jaywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBCb29sZWFuIGxvY2tJdCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTWVkaWFHZXRFcnJvclN0cmluZyIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUdldEVycm9yU3RyaW5nLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIENvbXBvbmVudFJlc3VsdCB0aGVFcnJvciwgU3RyMjU1IGVycm9yU3RyaW5nKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNZWRpYUdldFNvdW5kRXF1YWxpemVyQmFuZExldmVscyIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUdldFNvdW5kRXF1YWxpemVyQmFuZExldmVscywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgVUludDggYmFuZExldmVscykiKX0sCisgICAgeyJNZWRpYURvSWRsZUFjdGlvbnMiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFEb0lkbGVBY3Rpb25zLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1lZGlhU2V0U291bmRCYXNzQW5kVHJlYmxlIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhU2V0U291bmRCYXNzQW5kVHJlYmxlLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIHNob3J0IGJhc3MsIHNob3J0IHRyZWJsZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTWVkaWFHZXRTb3VuZEJhc3NBbmRUcmVibGUiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFHZXRTb3VuZEJhc3NBbmRUcmVibGUsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHNob3J0IGJhc3MsIHNob3J0IHRyZWJsZSkiKX0sCisgICAgeyJNZWRpYVRpbWVCYXNlQ2hhbmdlZCIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVRpbWVCYXNlQ2hhbmdlZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNZWRpYU1DSXNQbGF5ZXJFdmVudCIsIChQeUNGdW5jdGlvbilRdF9NZWRpYU1DSXNQbGF5ZXJFdmVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBFdmVudFJlY29yZCBlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQm9vbGVhbiBoYW5kbGVkSXQpIil9LAorICAgIHsiTWVkaWFHZXRNZWRpYUxvYWRTdGF0ZSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUdldE1lZGlhTG9hZFN0YXRlLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIG1lZGlhTG9hZFN0YXRlKSIpfSwKKyAgICB7Ik1lZGlhVmlkZW9PdXRwdXRDaGFuZ2VkIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhVmlkZW9PdXRwdXRDaGFuZ2VkLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIENvbXBvbmVudEluc3RhbmNlIHZvdXQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1lZGlhRW1wdHlTYW1wbGVDYWNoZSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUVtcHR5U2FtcGxlQ2FjaGUsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgbG9uZyBzYW1wbGVOdW0sIGxvbmcgc2FtcGxlQ291bnQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1lZGlhR2V0UHVibGljSW5mbyIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUdldFB1YmxpY0luZm8sIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgT1NUeXBlIGluZm9TZWxlY3Rvciwgdm9pZCAqIGluZm9EYXRhUHRyKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgU2l6ZSBpb0RhdGFTaXplKSIpfSwKKyAgICB7Ik1lZGlhU2V0UHVibGljSW5mbyIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVNldFB1YmxpY0luZm8sIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgT1NUeXBlIGluZm9TZWxlY3Rvciwgdm9pZCAqIGluZm9EYXRhUHRyLCBTaXplIGRhdGFTaXplKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNZWRpYVJlZkNvblNldFByb3BlcnR5IiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhUmVmQ29uU2V0UHJvcGVydHksIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgbG9uZyByZWZDb24sIGxvbmcgcHJvcGVydHlUeXBlLCB2b2lkICogcHJvcGVydHlWYWx1ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTWVkaWFSZWZDb25HZXRQcm9wZXJ0eSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVJlZkNvbkdldFByb3BlcnR5LCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIGxvbmcgcmVmQ29uLCBsb25nIHByb3BlcnR5VHlwZSwgdm9pZCAqIHByb3BlcnR5VmFsdWUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1lZGlhTmF2aWdhdGVUYXJnZXRSZWZDb24iLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFOYXZpZ2F0ZVRhcmdldFJlZkNvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBsb25nIG5hdmlnYXRpb24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIHJlZkNvbikiKX0sCisgICAgeyJNZWRpYUdHZXRJZGxlTWFuYWdlciIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUdHZXRJZGxlTWFuYWdlciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSWRsZU1hbmFnZXIgcGltKSIpfSwKKyAgICB7Ik1lZGlhR1NldElkbGVNYW5hZ2VyIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhR1NldElkbGVNYW5hZ2VyLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIElkbGVNYW5hZ2VyIGltKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJRVE1JRElHZXRNSURJUG9ydHMiLCAoUHlDRnVuY3Rpb24pUXRfUVRNSURJR2V0TUlESVBvcnRzLCAxLAorICAgICBQeURvY19TVFIoIihRVE1JRElDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBRVE1JRElQb3J0TGlzdEhhbmRsZSBpbnB1dFBvcnRzLCBRVE1JRElQb3J0TGlzdEhhbmRsZSBvdXRwdXRQb3J0cykiKX0sCisgICAgeyJRVE1JRElVc2VTZW5kUG9ydCIsIChQeUNGdW5jdGlvbilRdF9RVE1JRElVc2VTZW5kUG9ydCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUVRNSURJQ29tcG9uZW50IGNpLCBsb25nIHBvcnRJbmRleCwgbG9uZyBpblVzZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiUVRNSURJU2VuZE1JREkiLCAoUHlDRnVuY3Rpb24pUXRfUVRNSURJU2VuZE1JREksIDEsCisgICAgIFB5RG9jX1NUUigiKFFUTUlESUNvbXBvbmVudCBjaSwgbG9uZyBwb3J0SW5kZXgsIE11c2ljTUlESVBhY2tldCBtcCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTXVzaWNHZXRQYXJ0IiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljR2V0UGFydCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTXVzaWNDb21wb25lbnQgbWMsIGxvbmcgcGFydCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgbWlkaUNoYW5uZWwsIGxvbmcgcG9seXBob255KSIpfSwKKyAgICB7Ik11c2ljU2V0UGFydCIsIChQeUNGdW5jdGlvbilRdF9NdXNpY1NldFBhcnQsIDEsCisgICAgIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jLCBsb25nIHBhcnQsIGxvbmcgbWlkaUNoYW5uZWwsIGxvbmcgcG9seXBob255KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNdXNpY1NldFBhcnRJbnN0cnVtZW50TnVtYmVyIiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljU2V0UGFydEluc3RydW1lbnROdW1iZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jLCBsb25nIHBhcnQsIGxvbmcgaW5zdHJ1bWVudE51bWJlcikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTXVzaWNHZXRQYXJ0SW5zdHJ1bWVudE51bWJlciIsIChQeUNGdW5jdGlvbilRdF9NdXNpY0dldFBhcnRJbnN0cnVtZW50TnVtYmVyLCAxLAorICAgICBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBwYXJ0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNdXNpY1N0b3JlUGFydEluc3RydW1lbnQiLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNTdG9yZVBhcnRJbnN0cnVtZW50LCAxLAorICAgICBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBwYXJ0LCBsb25nIGluc3RydW1lbnROdW1iZXIpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik11c2ljR2V0UGFydEF0b21pY0luc3RydW1lbnQiLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNHZXRQYXJ0QXRvbWljSW5zdHJ1bWVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTXVzaWNDb21wb25lbnQgbWMsIGxvbmcgcGFydCwgbG9uZyBmbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEF0b21pY0luc3RydW1lbnQgYWkpIil9LAorICAgIHsiTXVzaWNTZXRQYXJ0QXRvbWljSW5zdHJ1bWVudCIsIChQeUNGdW5jdGlvbilRdF9NdXNpY1NldFBhcnRBdG9taWNJbnN0cnVtZW50LCAxLAorICAgICBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBwYXJ0LCBBdG9taWNJbnN0cnVtZW50UHRyIGFpUCwgbG9uZyBmbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTXVzaWNHZXRQYXJ0S25vYiIsIChQeUNGdW5jdGlvbilRdF9NdXNpY0dldFBhcnRLbm9iLCAxLAorICAgICBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBwYXJ0LCBsb25nIGtub2JJRCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTXVzaWNTZXRQYXJ0S25vYiIsIChQeUNGdW5jdGlvbilRdF9NdXNpY1NldFBhcnRLbm9iLCAxLAorICAgICBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBwYXJ0LCBsb25nIGtub2JJRCwgbG9uZyBrbm9iVmFsdWUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik11c2ljR2V0S25vYiIsIChQeUNGdW5jdGlvbilRdF9NdXNpY0dldEtub2IsIDEsCisgICAgIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jLCBsb25nIGtub2JJRCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTXVzaWNTZXRLbm9iIiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljU2V0S25vYiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTXVzaWNDb21wb25lbnQgbWMsIGxvbmcga25vYklELCBsb25nIGtub2JWYWx1ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTXVzaWNHZXRQYXJ0TmFtZSIsIChQeUNGdW5jdGlvbilRdF9NdXNpY0dldFBhcnROYW1lLCAxLAorICAgICBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBwYXJ0LCBTdHJpbmdQdHIgbmFtZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTXVzaWNTZXRQYXJ0TmFtZSIsIChQeUNGdW5jdGlvbilRdF9NdXNpY1NldFBhcnROYW1lLCAxLAorICAgICBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBwYXJ0LCBTdHJpbmdQdHIgbmFtZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTXVzaWNQbGF5Tm90ZSIsIChQeUNGdW5jdGlvbilRdF9NdXNpY1BsYXlOb3RlLCAxLAorICAgICBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBwYXJ0LCBsb25nIHBpdGNoLCBsb25nIHZlbG9jaXR5KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNdXNpY1Jlc2V0UGFydCIsIChQeUNGdW5jdGlvbilRdF9NdXNpY1Jlc2V0UGFydCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTXVzaWNDb21wb25lbnQgbWMsIGxvbmcgcGFydCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTXVzaWNTZXRQYXJ0Q29udHJvbGxlciIsIChQeUNGdW5jdGlvbilRdF9NdXNpY1NldFBhcnRDb250cm9sbGVyLCAxLAorICAgICBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBwYXJ0LCBNdXNpY0NvbnRyb2xsZXIgY29udHJvbGxlck51bWJlciwgbG9uZyBjb250cm9sbGVyVmFsdWUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik11c2ljR2V0UGFydENvbnRyb2xsZXIiLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNHZXRQYXJ0Q29udHJvbGxlciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTXVzaWNDb21wb25lbnQgbWMsIGxvbmcgcGFydCwgTXVzaWNDb250cm9sbGVyIGNvbnRyb2xsZXJOdW1iZXIpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik11c2ljR2V0SW5zdHJ1bWVudE5hbWVzIiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljR2V0SW5zdHJ1bWVudE5hbWVzLCAxLAorICAgICBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBtb2RpZmlhYmxlSW5zdHJ1bWVudHMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBIYW5kbGUgaW5zdHJ1bWVudE5hbWVzLCBIYW5kbGUgaW5zdHJ1bWVudENhdGVnb3J5TGFzdHMsIEhhbmRsZSBpbnN0cnVtZW50Q2F0ZWdvcnlOYW1lcykiKX0sCisgICAgeyJNdXNpY0dldERydW1OYW1lcyIsIChQeUNGdW5jdGlvbilRdF9NdXNpY0dldERydW1OYW1lcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTXVzaWNDb21wb25lbnQgbWMsIGxvbmcgbW9kaWZpYWJsZUluc3RydW1lbnRzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSGFuZGxlIGluc3RydW1lbnROdW1iZXJzLCBIYW5kbGUgaW5zdHJ1bWVudE5hbWVzKSIpfSwKKyAgICB7Ik11c2ljR2V0TWFzdGVyVHVuZSIsIChQeUNGdW5jdGlvbilRdF9NdXNpY0dldE1hc3RlclR1bmUsIDEsCisgICAgIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNdXNpY1NldE1hc3RlclR1bmUiLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNTZXRNYXN0ZXJUdW5lLCAxLAorICAgICBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBtYXN0ZXJUdW5lKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNdXNpY0dldERldmljZUNvbm5lY3Rpb24iLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNHZXREZXZpY2VDb25uZWN0aW9uLCAxLAorICAgICBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBpbmRleCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgaWQxLCBsb25nIGlkMikiKX0sCisgICAgeyJNdXNpY1VzZURldmljZUNvbm5lY3Rpb24iLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNVc2VEZXZpY2VDb25uZWN0aW9uLCAxLAorICAgICBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBpZDEsIGxvbmcgaWQyKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNdXNpY0dldEtub2JTZXR0aW5nU3RyaW5ncyIsIChQeUNGdW5jdGlvbilRdF9NdXNpY0dldEtub2JTZXR0aW5nU3RyaW5ncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTXVzaWNDb21wb25lbnQgbWMsIGxvbmcga25vYkluZGV4LCBsb25nIGlzR2xvYmFsKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSGFuZGxlIHNldHRpbmdzTmFtZXMsIEhhbmRsZSBzZXR0aW5nc0NhdGVnb3J5TGFzdHMsIEhhbmRsZSBzZXR0aW5nc0NhdGVnb3J5TmFtZXMpIil9LAorICAgIHsiTXVzaWNHZXRNSURJUG9ydHMiLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNHZXRNSURJUG9ydHMsIDEsCisgICAgIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBpbnB1dFBvcnRDb3VudCwgbG9uZyBvdXRwdXRQb3J0Q291bnQpIil9LAorICAgIHsiTXVzaWNTZW5kTUlESSIsIChQeUNGdW5jdGlvbilRdF9NdXNpY1NlbmRNSURJLCAxLAorICAgICBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBwb3J0SW5kZXgsIE11c2ljTUlESVBhY2tldCBtcCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTXVzaWNTZXRPZmZsaW5lVGltZVRvIiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljU2V0T2ZmbGluZVRpbWVUbywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTXVzaWNDb21wb25lbnQgbWMsIGxvbmcgbmV3VGltZVN0YW1wKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNdXNpY0dldEluZm9UZXh0IiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljR2V0SW5mb1RleHQsIDEsCisgICAgIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jLCBsb25nIHNlbGVjdG9yKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSGFuZGxlIHRleHRILCBIYW5kbGUgc3R5bGVIKSIpfSwKKyAgICB7Ik11c2ljR2V0SW5zdHJ1bWVudEluZm8iLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNHZXRJbnN0cnVtZW50SW5mbywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTXVzaWNDb21wb25lbnQgbWMsIGxvbmcgZ2V0SW5zdHJ1bWVudEluZm9GbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEluc3RydW1lbnRJbmZvTGlzdEhhbmRsZSBpbmZvTGlzdEgpIil9LAorICAgIHsiTXVzaWNUYXNrIiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljVGFzaywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTXVzaWNDb21wb25lbnQgbWMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik11c2ljU2V0UGFydEluc3RydW1lbnROdW1iZXJJbnRlcnJ1cHRTYWZlIiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljU2V0UGFydEluc3RydW1lbnROdW1iZXJJbnRlcnJ1cHRTYWZlLCAxLAorICAgICBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBwYXJ0LCBsb25nIGluc3RydW1lbnROdW1iZXIpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik11c2ljU2V0UGFydFNvdW5kTG9jYWxpemF0aW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljU2V0UGFydFNvdW5kTG9jYWxpemF0aW9uLCAxLAorICAgICBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBwYXJ0LCBIYW5kbGUgZGF0YSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTXVzaWNHZW5lcmljQ29uZmlndXJlIiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljR2VuZXJpY0NvbmZpZ3VyZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTXVzaWNDb21wb25lbnQgbWMsIGxvbmcgbW9kZSwgbG9uZyBmbGFncywgbG9uZyBiYXNlUmVzSUQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik11c2ljR2VuZXJpY0dldEtub2JMaXN0IiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljR2VuZXJpY0dldEtub2JMaXN0LCAxLAorICAgICBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBrbm9iVHlwZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEdlbmVyaWNLbm9iRGVzY3JpcHRpb25MaXN0SGFuZGxlIGdrZGxIKSIpfSwKKyAgICB7Ik11c2ljR2VuZXJpY1NldFJlc291cmNlTnVtYmVycyIsIChQeUNGdW5jdGlvbilRdF9NdXNpY0dlbmVyaWNTZXRSZXNvdXJjZU51bWJlcnMsIDEsCisgICAgIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jLCBIYW5kbGUgcmVzb3VyY2VJREgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik11c2ljRGVyaXZlZE1JRElTZW5kIiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljRGVyaXZlZE1JRElTZW5kLCAxLAorICAgICBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgTXVzaWNNSURJUGFja2V0IHBhY2tldCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTXVzaWNEZXJpdmVkT3BlblJlc0ZpbGUiLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNEZXJpdmVkT3BlblJlc0ZpbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNdXNpY0Rlcml2ZWRDbG9zZVJlc0ZpbGUiLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNEZXJpdmVkQ2xvc2VSZXNGaWxlLCAxLAorICAgICBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgc2hvcnQgcmVzUmVmTnVtKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJOQVVucmVnaXN0ZXJNdXNpY0RldmljZSIsIChQeUNGdW5jdGlvbilRdF9OQVVucmVnaXN0ZXJNdXNpY0RldmljZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTm90ZUFsbG9jYXRvciBuYSwgbG9uZyBpbmRleCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTkFTYXZlTXVzaWNDb25maWd1cmF0aW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X05BU2F2ZU11c2ljQ29uZmlndXJhdGlvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTm90ZUFsbG9jYXRvciBuYSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTkFHZXRNSURJUG9ydHMiLCAoUHlDRnVuY3Rpb24pUXRfTkFHZXRNSURJUG9ydHMsIDEsCisgICAgIFB5RG9jX1NUUigiKE5vdGVBbGxvY2F0b3IgbmEpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBRVE1JRElQb3J0TGlzdEhhbmRsZSBpbnB1dFBvcnRzLCBRVE1JRElQb3J0TGlzdEhhbmRsZSBvdXRwdXRQb3J0cykiKX0sCisgICAgeyJOQVRhc2siLCAoUHlDRnVuY3Rpb24pUXRfTkFUYXNrLCAxLAorICAgICBQeURvY19TVFIoIihOb3RlQWxsb2NhdG9yIG5hKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJUdW5lU2V0SGVhZGVyIiwgKFB5Q0Z1bmN0aW9uKVF0X1R1bmVTZXRIZWFkZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKFR1bmVQbGF5ZXIgdHAsIHVuc2lnbmVkIGxvbmcgKiBoZWFkZXIpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlR1bmVHZXRUaW1lQmFzZSIsIChQeUNGdW5jdGlvbilRdF9UdW5lR2V0VGltZUJhc2UsIDEsCisgICAgIFB5RG9jX1NUUigiKFR1bmVQbGF5ZXIgdHApIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBUaW1lQmFzZSB0YikiKX0sCisgICAgeyJUdW5lU2V0VGltZVNjYWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X1R1bmVTZXRUaW1lU2NhbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKFR1bmVQbGF5ZXIgdHAsIFRpbWVTY2FsZSBzY2FsZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiVHVuZUdldFRpbWVTY2FsZSIsIChQeUNGdW5jdGlvbilRdF9UdW5lR2V0VGltZVNjYWxlLCAxLAorICAgICBQeURvY19TVFIoIihUdW5lUGxheWVyIHRwKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgVGltZVNjYWxlIHNjYWxlKSIpfSwKKyAgICB7IlR1bmVJbnN0YW50IiwgKFB5Q0Z1bmN0aW9uKVF0X1R1bmVJbnN0YW50LCAxLAorICAgICBQeURvY19TVFIoIihUdW5lUGxheWVyIHRwLCB1bnNpZ25lZCBsb25nIHR1bmVQb3NpdGlvbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHVuc2lnbmVkIGxvbmcgdHVuZSkiKX0sCisgICAgeyJUdW5lU3RvcCIsIChQeUNGdW5jdGlvbilRdF9UdW5lU3RvcCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVHVuZVBsYXllciB0cCwgbG9uZyBzdG9wRmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlR1bmVTZXRWb2x1bWUiLCAoUHlDRnVuY3Rpb24pUXRfVHVuZVNldFZvbHVtZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVHVuZVBsYXllciB0cCwgRml4ZWQgdm9sdW1lKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJUdW5lR2V0Vm9sdW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X1R1bmVHZXRWb2x1bWUsIDEsCisgICAgIFB5RG9jX1NUUigiKFR1bmVQbGF5ZXIgdHApIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlR1bmVQcmVyb2xsIiwgKFB5Q0Z1bmN0aW9uKVF0X1R1bmVQcmVyb2xsLCAxLAorICAgICBQeURvY19TVFIoIihUdW5lUGxheWVyIHRwKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJUdW5lVW5yb2xsIiwgKFB5Q0Z1bmN0aW9uKVF0X1R1bmVVbnJvbGwsIDEsCisgICAgIFB5RG9jX1NUUigiKFR1bmVQbGF5ZXIgdHApIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlR1bmVTZXRQYXJ0VHJhbnNwb3NlIiwgKFB5Q0Z1bmN0aW9uKVF0X1R1bmVTZXRQYXJ0VHJhbnNwb3NlLCAxLAorICAgICBQeURvY19TVFIoIihUdW5lUGxheWVyIHRwLCB1bnNpZ25lZCBsb25nIHBhcnQsIGxvbmcgdHJhbnNwb3NlLCBsb25nIHZlbG9jaXR5U2hpZnQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlR1bmVHZXROb3RlQWxsb2NhdG9yIiwgKFB5Q0Z1bmN0aW9uKVF0X1R1bmVHZXROb3RlQWxsb2NhdG9yLCAxLAorICAgICBQeURvY19TVFIoIihUdW5lUGxheWVyIHRwKSAtPiAoTm90ZUFsbG9jYXRvciBfcnYpIil9LAorICAgIHsiVHVuZVNldFNvZnRlciIsIChQeUNGdW5jdGlvbilRdF9UdW5lU2V0U29mdGVyLCAxLAorICAgICBQeURvY19TVFIoIihUdW5lUGxheWVyIHRwLCBsb25nIHNvZnRlcikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiVHVuZVRhc2siLCAoUHlDRnVuY3Rpb24pUXRfVHVuZVRhc2ssIDEsCisgICAgIFB5RG9jX1NUUigiKFR1bmVQbGF5ZXIgdHApIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlR1bmVTZXRCYWxhbmNlIiwgKFB5Q0Z1bmN0aW9uKVF0X1R1bmVTZXRCYWxhbmNlLCAxLAorICAgICBQeURvY19TVFIoIihUdW5lUGxheWVyIHRwLCBsb25nIGJhbGFuY2UpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlR1bmVTZXRTb3VuZExvY2FsaXphdGlvbiIsIChQeUNGdW5jdGlvbilRdF9UdW5lU2V0U291bmRMb2NhbGl6YXRpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKFR1bmVQbGF5ZXIgdHAsIEhhbmRsZSBkYXRhKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJUdW5lU2V0SGVhZGVyV2l0aFNpemUiLCAoUHlDRnVuY3Rpb24pUXRfVHVuZVNldEhlYWRlcldpdGhTaXplLCAxLAorICAgICBQeURvY19TVFIoIihUdW5lUGxheWVyIHRwLCB1bnNpZ25lZCBsb25nICogaGVhZGVyLCB1bnNpZ25lZCBsb25nIHNpemUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlR1bmVTZXRQYXJ0TWl4IiwgKFB5Q0Z1bmN0aW9uKVF0X1R1bmVTZXRQYXJ0TWl4LCAxLAorICAgICBQeURvY19TVFIoIihUdW5lUGxheWVyIHRwLCB1bnNpZ25lZCBsb25nIHBhcnROdW1iZXIsIGxvbmcgdm9sdW1lLCBsb25nIGJhbGFuY2UsIGxvbmcgbWl4RmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlR1bmVHZXRQYXJ0TWl4IiwgKFB5Q0Z1bmN0aW9uKVF0X1R1bmVHZXRQYXJ0TWl4LCAxLAorICAgICBQeURvY19TVFIoIihUdW5lUGxheWVyIHRwLCB1bnNpZ25lZCBsb25nIHBhcnROdW1iZXIpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIHZvbHVtZU91dCwgbG9uZyBiYWxhbmNlT3V0LCBsb25nIG1peEZsYWdzT3V0KSIpfSwKKyAgICB7IkFsaWduV2luZG93IiwgKFB5Q0Z1bmN0aW9uKVF0X0FsaWduV2luZG93LCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgd3AsIEJvb2xlYW4gZnJvbnQpIC0+IE5vbmUiKX0sCisgICAgeyJEcmFnQWxpZ25lZFdpbmRvdyIsIChQeUNGdW5jdGlvbilRdF9EcmFnQWxpZ25lZFdpbmRvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdwLCBQb2ludCBzdGFydFB0LCBSZWN0IGJvdW5kc1JlY3QpIC0+IE5vbmUiKX0sCisgICAgeyJNb3ZpZXNUYXNrIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllc1Rhc2ssIDEsCisgICAgIFB5RG9jX1NUUigiKGxvbmcgbWF4TWlsbGlTZWNUb1VzZSkgLT4gTm9uZSIpfSwKICNlbmRpZiAvKiBfX0xQNjRfXyAqLwotCXtOVUxMLCBOVUxMLCAwfQorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogCkBAIC0yODAwMCw5MCArMjgwMDAsOTAgQEAKIAogdm9pZCBpbml0X1F0KHZvaWQpCiB7Ci0JUHlPYmplY3QgKm07CisgICAgUHlPYmplY3QgKm07CiAjaWZuZGVmIF9fTFA2NF9fCi0JUHlPYmplY3QgKmQ7CisgICAgUHlPYmplY3QgKmQ7CiAKIAogCi0JICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhUcmFjaywgVHJhY2tPYmpfTmV3KTsKLQkgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChUcmFjaywgVHJhY2tPYmpfQ29udmVydCk7Ci0JICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhNb3ZpZSwgTW92aWVPYmpfTmV3KTsKLQkgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChNb3ZpZSwgTW92aWVPYmpfQ29udmVydCk7Ci0JICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhNb3ZpZUNvbnRyb2xsZXIsIE1vdmllQ3RsT2JqX05ldyk7Ci0JICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoTW92aWVDb250cm9sbGVyLCBNb3ZpZUN0bE9ial9Db252ZXJ0KTsKLQkgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKFRpbWVCYXNlLCBUaW1lQmFzZU9ial9OZXcpOwotCSAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKFRpbWVCYXNlLCBUaW1lQmFzZU9ial9Db252ZXJ0KTsKLQkgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKFVzZXJEYXRhLCBVc2VyRGF0YU9ial9OZXcpOwotCSAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKFVzZXJEYXRhLCBVc2VyRGF0YU9ial9Db252ZXJ0KTsKLQkgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKE1lZGlhLCBNZWRpYU9ial9OZXcpOwotCSAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKE1lZGlhLCBNZWRpYU9ial9Db252ZXJ0KTsKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoVHJhY2ssIFRyYWNrT2JqX05ldyk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChUcmFjaywgVHJhY2tPYmpfQ29udmVydCk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKE1vdmllLCBNb3ZpZU9ial9OZXcpOworICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoTW92aWUsIE1vdmllT2JqX0NvbnZlcnQpOworICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhNb3ZpZUNvbnRyb2xsZXIsIE1vdmllQ3RsT2JqX05ldyk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChNb3ZpZUNvbnRyb2xsZXIsIE1vdmllQ3RsT2JqX0NvbnZlcnQpOworICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhUaW1lQmFzZSwgVGltZUJhc2VPYmpfTmV3KTsKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKFRpbWVCYXNlLCBUaW1lQmFzZU9ial9Db252ZXJ0KTsKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoVXNlckRhdGEsIFVzZXJEYXRhT2JqX05ldyk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChVc2VyRGF0YSwgVXNlckRhdGFPYmpfQ29udmVydCk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKE1lZGlhLCBNZWRpYU9ial9OZXcpOworICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoTWVkaWEsIE1lZGlhT2JqX0NvbnZlcnQpOwogI2VuZGlmIC8qIF9fTFA2NF9fICovCiAKIAotCW0gPSBQeV9Jbml0TW9kdWxlKCJfUXQiLCBRdF9tZXRob2RzKTsKKyAgICBtID0gUHlfSW5pdE1vZHVsZSgiX1F0IiwgUXRfbWV0aG9kcyk7CiAjaWZuZGVmIF9fTFA2NF9fCi0JZCA9IFB5TW9kdWxlX0dldERpY3QobSk7Ci0JUXRfRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOwotCWlmIChRdF9FcnJvciA9PSBOVUxMIHx8Ci0JICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFcnJvciIsIFF0X0Vycm9yKSAhPSAwKQotCQlyZXR1cm47Ci0JSWRsZU1hbmFnZXJfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCWlmIChQeVR5cGVfUmVhZHkoJklkbGVNYW5hZ2VyX1R5cGUpIDwgMCkgcmV0dXJuOwotCVB5X0lOQ1JFRigmSWRsZU1hbmFnZXJfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJJZGxlTWFuYWdlciIsIChQeU9iamVjdCAqKSZJZGxlTWFuYWdlcl9UeXBlKTsKLQkvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KLQlQeV9JTkNSRUYoJklkbGVNYW5hZ2VyX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiSWRsZU1hbmFnZXJUeXBlIiwgKFB5T2JqZWN0ICopJklkbGVNYW5hZ2VyX1R5cGUpOwotCU1vdmllQ29udHJvbGxlcl9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmTW92aWVDb250cm9sbGVyX1R5cGUpIDwgMCkgcmV0dXJuOwotCVB5X0lOQ1JFRigmTW92aWVDb250cm9sbGVyX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiTW92aWVDb250cm9sbGVyIiwgKFB5T2JqZWN0ICopJk1vdmllQ29udHJvbGxlcl9UeXBlKTsKLQkvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KLQlQeV9JTkNSRUYoJk1vdmllQ29udHJvbGxlcl9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIk1vdmllQ29udHJvbGxlclR5cGUiLCAoUHlPYmplY3QgKikmTW92aWVDb250cm9sbGVyX1R5cGUpOwotCVRpbWVCYXNlX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKLQlpZiAoUHlUeXBlX1JlYWR5KCZUaW1lQmFzZV9UeXBlKSA8IDApIHJldHVybjsKLQlQeV9JTkNSRUYoJlRpbWVCYXNlX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiVGltZUJhc2UiLCAoUHlPYmplY3QgKikmVGltZUJhc2VfVHlwZSk7Ci0JLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCi0JUHlfSU5DUkVGKCZUaW1lQmFzZV9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIlRpbWVCYXNlVHlwZSIsIChQeU9iamVjdCAqKSZUaW1lQmFzZV9UeXBlKTsKLQlVc2VyRGF0YV9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmVXNlckRhdGFfVHlwZSkgPCAwKSByZXR1cm47Ci0JUHlfSU5DUkVGKCZVc2VyRGF0YV9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIlVzZXJEYXRhIiwgKFB5T2JqZWN0ICopJlVzZXJEYXRhX1R5cGUpOwotCS8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLwotCVB5X0lOQ1JFRigmVXNlckRhdGFfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJVc2VyRGF0YVR5cGUiLCAoUHlPYmplY3QgKikmVXNlckRhdGFfVHlwZSk7Ci0JTWVkaWFfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCWlmIChQeVR5cGVfUmVhZHkoJk1lZGlhX1R5cGUpIDwgMCkgcmV0dXJuOwotCVB5X0lOQ1JFRigmTWVkaWFfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJNZWRpYSIsIChQeU9iamVjdCAqKSZNZWRpYV9UeXBlKTsKLQkvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KLQlQeV9JTkNSRUYoJk1lZGlhX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiTWVkaWFUeXBlIiwgKFB5T2JqZWN0ICopJk1lZGlhX1R5cGUpOwotCVRyYWNrX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKLQlpZiAoUHlUeXBlX1JlYWR5KCZUcmFja19UeXBlKSA8IDApIHJldHVybjsKLQlQeV9JTkNSRUYoJlRyYWNrX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiVHJhY2siLCAoUHlPYmplY3QgKikmVHJhY2tfVHlwZSk7Ci0JLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCi0JUHlfSU5DUkVGKCZUcmFja19UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIlRyYWNrVHlwZSIsIChQeU9iamVjdCAqKSZUcmFja19UeXBlKTsKLQlNb3ZpZV9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmTW92aWVfVHlwZSkgPCAwKSByZXR1cm47Ci0JUHlfSU5DUkVGKCZNb3ZpZV9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIk1vdmllIiwgKFB5T2JqZWN0ICopJk1vdmllX1R5cGUpOwotCS8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLwotCVB5X0lOQ1JFRigmTW92aWVfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJNb3ZpZVR5cGUiLCAoUHlPYmplY3QgKikmTW92aWVfVHlwZSk7Ci0JU0dPdXRwdXRfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCWlmIChQeVR5cGVfUmVhZHkoJlNHT3V0cHV0X1R5cGUpIDwgMCkgcmV0dXJuOwotCVB5X0lOQ1JFRigmU0dPdXRwdXRfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJTR091dHB1dCIsIChQeU9iamVjdCAqKSZTR091dHB1dF9UeXBlKTsKLQkvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KLQlQeV9JTkNSRUYoJlNHT3V0cHV0X1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiU0dPdXRwdXRUeXBlIiwgKFB5T2JqZWN0ICopJlNHT3V0cHV0X1R5cGUpOworICAgIGQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOworICAgIFF0X0Vycm9yID0gUHlNYWNfR2V0T1NFcnJFeGNlcHRpb24oKTsKKyAgICBpZiAoUXRfRXJyb3IgPT0gTlVMTCB8fAorICAgICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRXJyb3IiLCBRdF9FcnJvcikgIT0gMCkKKyAgICAgICAgcmV0dXJuOworICAgIElkbGVNYW5hZ2VyX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZJZGxlTWFuYWdlcl9UeXBlKSA8IDApIHJldHVybjsKKyAgICBQeV9JTkNSRUYoJklkbGVNYW5hZ2VyX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiSWRsZU1hbmFnZXIiLCAoUHlPYmplY3QgKikmSWRsZU1hbmFnZXJfVHlwZSk7CisgICAgLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCisgICAgUHlfSU5DUkVGKCZJZGxlTWFuYWdlcl9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIklkbGVNYW5hZ2VyVHlwZSIsIChQeU9iamVjdCAqKSZJZGxlTWFuYWdlcl9UeXBlKTsKKyAgICBNb3ZpZUNvbnRyb2xsZXJfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJk1vdmllQ29udHJvbGxlcl9UeXBlKSA8IDApIHJldHVybjsKKyAgICBQeV9JTkNSRUYoJk1vdmllQ29udHJvbGxlcl9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIk1vdmllQ29udHJvbGxlciIsIChQeU9iamVjdCAqKSZNb3ZpZUNvbnRyb2xsZXJfVHlwZSk7CisgICAgLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCisgICAgUHlfSU5DUkVGKCZNb3ZpZUNvbnRyb2xsZXJfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJNb3ZpZUNvbnRyb2xsZXJUeXBlIiwgKFB5T2JqZWN0ICopJk1vdmllQ29udHJvbGxlcl9UeXBlKTsKKyAgICBUaW1lQmFzZV9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmVGltZUJhc2VfVHlwZSkgPCAwKSByZXR1cm47CisgICAgUHlfSU5DUkVGKCZUaW1lQmFzZV9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIlRpbWVCYXNlIiwgKFB5T2JqZWN0ICopJlRpbWVCYXNlX1R5cGUpOworICAgIC8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLworICAgIFB5X0lOQ1JFRigmVGltZUJhc2VfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJUaW1lQmFzZVR5cGUiLCAoUHlPYmplY3QgKikmVGltZUJhc2VfVHlwZSk7CisgICAgVXNlckRhdGFfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJlVzZXJEYXRhX1R5cGUpIDwgMCkgcmV0dXJuOworICAgIFB5X0lOQ1JFRigmVXNlckRhdGFfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJVc2VyRGF0YSIsIChQeU9iamVjdCAqKSZVc2VyRGF0YV9UeXBlKTsKKyAgICAvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KKyAgICBQeV9JTkNSRUYoJlVzZXJEYXRhX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiVXNlckRhdGFUeXBlIiwgKFB5T2JqZWN0ICopJlVzZXJEYXRhX1R5cGUpOworICAgIE1lZGlhX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZNZWRpYV9UeXBlKSA8IDApIHJldHVybjsKKyAgICBQeV9JTkNSRUYoJk1lZGlhX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiTWVkaWEiLCAoUHlPYmplY3QgKikmTWVkaWFfVHlwZSk7CisgICAgLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCisgICAgUHlfSU5DUkVGKCZNZWRpYV9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIk1lZGlhVHlwZSIsIChQeU9iamVjdCAqKSZNZWRpYV9UeXBlKTsKKyAgICBUcmFja19UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmVHJhY2tfVHlwZSkgPCAwKSByZXR1cm47CisgICAgUHlfSU5DUkVGKCZUcmFja19UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIlRyYWNrIiwgKFB5T2JqZWN0ICopJlRyYWNrX1R5cGUpOworICAgIC8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLworICAgIFB5X0lOQ1JFRigmVHJhY2tfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJUcmFja1R5cGUiLCAoUHlPYmplY3QgKikmVHJhY2tfVHlwZSk7CisgICAgTW92aWVfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJk1vdmllX1R5cGUpIDwgMCkgcmV0dXJuOworICAgIFB5X0lOQ1JFRigmTW92aWVfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJNb3ZpZSIsIChQeU9iamVjdCAqKSZNb3ZpZV9UeXBlKTsKKyAgICAvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KKyAgICBQeV9JTkNSRUYoJk1vdmllX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiTW92aWVUeXBlIiwgKFB5T2JqZWN0ICopJk1vdmllX1R5cGUpOworICAgIFNHT3V0cHV0X1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZTR091dHB1dF9UeXBlKSA8IDApIHJldHVybjsKKyAgICBQeV9JTkNSRUYoJlNHT3V0cHV0X1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiU0dPdXRwdXQiLCAoUHlPYmplY3QgKikmU0dPdXRwdXRfVHlwZSk7CisgICAgLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCisgICAgUHlfSU5DUkVGKCZTR091dHB1dF9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIlNHT3V0cHV0VHlwZSIsIChQeU9iamVjdCAqKSZTR091dHB1dF9UeXBlKTsKICNlbmRpZiAvKiBfX0xQNjRfXyAqLwogfQogCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9yZXMvX1Jlc21vZHVsZS5jIGIvTWFjL01vZHVsZXMvcmVzL19SZXNtb2R1bGUuYwppbmRleCA4OWZkMDJjLi5mNTgyNGIxIDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9yZXMvX1Jlc21vZHVsZS5jCisrKyBiL01hYy9Nb2R1bGVzL3Jlcy9fUmVzbW9kdWxlLmMKQEAgLTgsOSArOCw5IEBACiAKIC8qIE1hY3JvIHRvIHRlc3Qgd2hldGhlciBhIHdlYWstbG9hZGVkIENGTSBmdW5jdGlvbiBleGlzdHMgKi8KICNkZWZpbmUgUHlNYWNfUFJFQ0hFQ0socnRuKSBkbyB7IGlmICggJnJ0biA9PSBOVUxMICkgIHtcCi0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yLCBcCi0gICAgICAgICJOb3QgYXZhaWxhYmxlIGluIHRoaXMgc2hhcmVkIGxpYnJhcnkvT1MgdmVyc2lvbiIpOyBcCi0gICAgICAgIHJldHVybiBOVUxMOyBcCisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsIFwKKyAgICAiTm90IGF2YWlsYWJsZSBpbiB0aGlzIHNoYXJlZCBsaWJyYXJ5L09TIHZlcnNpb24iKTsgXAorICAgIHJldHVybiBOVUxMOyBcCiAgICAgfX0gd2hpbGUoMCkKIAogCkBAIC0zMSw3ICszMSw3IEBACiBzdGF0aWMgdm9pZAogUHlNYWNfQXV0b0Rpc3Bvc2VIYW5kbGUoSGFuZGxlIGgpCiB7Ci0gICAgICAgIERpc3Bvc2VIYW5kbGUoaCk7CisgICAgRGlzcG9zZUhhbmRsZShoKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpSZXNfRXJyb3I7CkBAIC00Myw1MzEgKzQzLDUzMSBAQAogI2RlZmluZSBSZXNPYmpfQ2hlY2soeCkgKCh4KS0+b2JfdHlwZSA9PSAmUmVzb3VyY2VfVHlwZSB8fCBQeU9iamVjdF9UeXBlQ2hlY2soKHgpLCAmUmVzb3VyY2VfVHlwZSkpCiAKIHR5cGVkZWYgc3RydWN0IFJlc291cmNlT2JqZWN0IHsKLQlQeU9iamVjdF9IRUFECi0JSGFuZGxlIG9iX2l0c2VsZjsKLQl2b2lkICgqb2JfZnJlZWl0KShIYW5kbGUgcHRyKTsKKyAgICBQeU9iamVjdF9IRUFECisgICAgSGFuZGxlIG9iX2l0c2VsZjsKKyAgICB2b2lkICgqb2JfZnJlZWl0KShIYW5kbGUgcHRyKTsKIH0gUmVzb3VyY2VPYmplY3Q7CiAKIFB5T2JqZWN0ICpSZXNPYmpfTmV3KEhhbmRsZSBpdHNlbGYpCiB7Ci0JUmVzb3VyY2VPYmplY3QgKml0OwotCWlmIChpdHNlbGYgPT0gTlVMTCkgcmV0dXJuIFB5TWFjX0Vycm9yKHJlc05vdEZvdW5kKTsKLQlpdCA9IFB5T2JqZWN0X05FVyhSZXNvdXJjZU9iamVjdCwgJlJlc291cmNlX1R5cGUpOwotCWlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQlpdC0+b2JfaXRzZWxmID0gaXRzZWxmOwotCWl0LT5vYl9mcmVlaXQgPSBOVUxMOwotCXJldHVybiAoUHlPYmplY3QgKilpdDsKKyAgICBSZXNvdXJjZU9iamVjdCAqaXQ7CisgICAgaWYgKGl0c2VsZiA9PSBOVUxMKSByZXR1cm4gUHlNYWNfRXJyb3IocmVzTm90Rm91bmQpOworICAgIGl0ID0gUHlPYmplY3RfTkVXKFJlc291cmNlT2JqZWN0LCAmUmVzb3VyY2VfVHlwZSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIGl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgaXQtPm9iX2ZyZWVpdCA9IE5VTEw7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogCiBpbnQgUmVzT2JqX0NvbnZlcnQoUHlPYmplY3QgKnYsIEhhbmRsZSAqcF9pdHNlbGYpCiB7Ci0JaWYgKCFSZXNPYmpfQ2hlY2sodikpCi0JewotCQlQeU9iamVjdCAqdG1wOwotCQlpZiAoICh0bXA9UHlPYmplY3RfQ2FsbE1ldGhvZCh2LCAiYXNfUmVzb3VyY2UiLCAiIikpICkKLQkJewotCQkJKnBfaXRzZWxmID0gKChSZXNvdXJjZU9iamVjdCAqKXRtcCktPm9iX2l0c2VsZjsKLQkJCVB5X0RFQ1JFRih0bXApOwotCQkJcmV0dXJuIDE7Ci0JCX0KLQkJUHlFcnJfQ2xlYXIoKTsKLQl9Ci0JaWYgKCFSZXNPYmpfQ2hlY2sodikpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiUmVzb3VyY2UgcmVxdWlyZWQiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCSpwX2l0c2VsZiA9ICgoUmVzb3VyY2VPYmplY3QgKil2KS0+b2JfaXRzZWxmOwotCXJldHVybiAxOworICAgIGlmICghUmVzT2JqX0NoZWNrKHYpKQorICAgIHsKKyAgICAgICAgUHlPYmplY3QgKnRtcDsKKyAgICAgICAgaWYgKCAodG1wPVB5T2JqZWN0X0NhbGxNZXRob2QodiwgImFzX1Jlc291cmNlIiwgIiIpKSApCisgICAgICAgIHsKKyAgICAgICAgICAgICpwX2l0c2VsZiA9ICgoUmVzb3VyY2VPYmplY3QgKil0bXApLT5vYl9pdHNlbGY7CisgICAgICAgICAgICBQeV9ERUNSRUYodG1wKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgfQorICAgIGlmICghUmVzT2JqX0NoZWNrKHYpKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIlJlc291cmNlIHJlcXVpcmVkIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAqcF9pdHNlbGYgPSAoKFJlc291cmNlT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIHZvaWQgUmVzT2JqX2RlYWxsb2MoUmVzb3VyY2VPYmplY3QgKnNlbGYpCiB7Ci0JaWYgKHNlbGYtPm9iX2ZyZWVpdCAmJiBzZWxmLT5vYl9pdHNlbGYpCi0JewotCQlzZWxmLT5vYl9mcmVlaXQoc2VsZi0+b2JfaXRzZWxmKTsKLQl9Ci0Jc2VsZi0+b2JfaXRzZWxmID0gTlVMTDsKLQlzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOworICAgIGlmIChzZWxmLT5vYl9mcmVlaXQgJiYgc2VsZi0+b2JfaXRzZWxmKQorICAgIHsKKyAgICAgICAgc2VsZi0+b2JfZnJlZWl0KHNlbGYtPm9iX2l0c2VsZik7CisgICAgfQorICAgIHNlbGYtPm9iX2l0c2VsZiA9IE5VTEw7CisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpSZXNPYmpfSG9tZVJlc0ZpbGUoUmVzb3VyY2VPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgX3J2OwogI2lmbmRlZiBIb21lUmVzRmlsZQotCVB5TWFjX1BSRUNIRUNLKEhvbWVSZXNGaWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhIb21lUmVzRmlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gSG9tZVJlc0ZpbGUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JewotCQlPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKLQkJaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQl9Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEhvbWVSZXNGaWxlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIHsKKyAgICAgICAgT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7CisgICAgICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgfQorICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlJlc09ial9NYWNMb2FkUmVzb3VyY2UoUmVzb3VyY2VPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgTWFjTG9hZFJlc291cmNlCi0JUHlNYWNfUFJFQ0hFQ0soTWFjTG9hZFJlc291cmNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNYWNMb2FkUmVzb3VyY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCU1hY0xvYWRSZXNvdXJjZShfc2VsZi0+b2JfaXRzZWxmKTsKLQl7Ci0JCU9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOwotCQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCX0KLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE1hY0xvYWRSZXNvdXJjZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICB7CisgICAgICAgIE9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOworICAgICAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIH0KKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUmVzT2JqX1JlbGVhc2VSZXNvdXJjZShSZXNvdXJjZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBSZWxlYXNlUmVzb3VyY2UKLQlQeU1hY19QUkVDSEVDSyhSZWxlYXNlUmVzb3VyY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKFJlbGVhc2VSZXNvdXJjZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JUmVsZWFzZVJlc291cmNlKF9zZWxmLT5vYl9pdHNlbGYpOwotCXsKLQkJT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7Ci0JCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JfQotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUmVsZWFzZVJlc291cmNlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIHsKKyAgICAgICAgT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7CisgICAgICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgfQorICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpSZXNPYmpfRGV0YWNoUmVzb3VyY2UoUmVzb3VyY2VPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgRGV0YWNoUmVzb3VyY2UKLQlQeU1hY19QUkVDSEVDSyhEZXRhY2hSZXNvdXJjZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGV0YWNoUmVzb3VyY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCURldGFjaFJlc291cmNlKF9zZWxmLT5vYl9pdHNlbGYpOwotCXsKLQkJT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7Ci0JCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JfQotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgRGV0YWNoUmVzb3VyY2UoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgeworICAgICAgICBPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKKyAgICAgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICB9CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlJlc09ial9HZXRSZXNBdHRycyhSZXNvdXJjZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBfcnY7CiAjaWZuZGVmIEdldFJlc0F0dHJzCi0JUHlNYWNfUFJFQ0hFQ0soR2V0UmVzQXR0cnMpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFJlc0F0dHJzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRSZXNBdHRycyhfc2VsZi0+b2JfaXRzZWxmKTsKLQl7Ci0JCU9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOwotCQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCX0KLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0UmVzQXR0cnMoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgeworICAgICAgICBPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKKyAgICAgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICB9CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUmVzT2JqX0dldFJlc0luZm8oUmVzb3VyY2VPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IHRoZUlEOwotCVJlc1R5cGUgdGhlVHlwZTsKLQlTdHIyNTUgbmFtZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgdGhlSUQ7CisgICAgUmVzVHlwZSB0aGVUeXBlOworICAgIFN0cjI1NSBuYW1lOwogI2lmbmRlZiBHZXRSZXNJbmZvCi0JUHlNYWNfUFJFQ0hFQ0soR2V0UmVzSW5mbyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0UmVzSW5mbyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0UmVzSW5mbyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgJnRoZUlELAotCSAgICAgICAgICAgJnRoZVR5cGUsCi0JICAgICAgICAgICBuYW1lKTsKLQl7Ci0JCU9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOwotCQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCX0KLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaE8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIHRoZUlELAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCB0aGVUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkU3RyMjU1LCBuYW1lKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0UmVzSW5mbyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgJnRoZUlELAorICAgICAgICAgICAgICAgJnRoZVR5cGUsCisgICAgICAgICAgICAgICBuYW1lKTsKKyAgICB7CisgICAgICAgIE9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOworICAgICAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIH0KKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaE8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRoZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCB0aGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkU3RyMjU1LCBuYW1lKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpSZXNPYmpfU2V0UmVzSW5mbyhSZXNvdXJjZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgdGhlSUQ7Ci0JU3RyMjU1IG5hbWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IHRoZUlEOworICAgIFN0cjI1NSBuYW1lOwogI2lmbmRlZiBTZXRSZXNJbmZvCi0JUHlNYWNfUFJFQ0hFQ0soU2V0UmVzSW5mbyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0UmVzSW5mbyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGhlSUQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgbmFtZSkpCi0JCXJldHVybiBOVUxMOwotCVNldFJlc0luZm8oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgIHRoZUlELAotCSAgICAgICAgICAgbmFtZSk7Ci0JewotCQlPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKLQkJaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQl9Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBuYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0UmVzSW5mbyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgdGhlSUQsCisgICAgICAgICAgICAgICBuYW1lKTsKKyAgICB7CisgICAgICAgIE9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOworICAgICAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIH0KKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUmVzT2JqX0FkZFJlc291cmNlKFJlc291cmNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZXNUeXBlIHRoZVR5cGU7Ci0Jc2hvcnQgdGhlSUQ7Ci0JU3RyMjU1IG5hbWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlc1R5cGUgdGhlVHlwZTsKKyAgICBzaG9ydCB0aGVJRDsKKyAgICBTdHIyNTUgbmFtZTsKICNpZm5kZWYgQWRkUmVzb3VyY2UKLQlQeU1hY19QUkVDSEVDSyhBZGRSZXNvdXJjZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQWRkUmVzb3VyY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGhlSUQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgbmFtZSkpCi0JCXJldHVybiBOVUxMOwotCUFkZFJlc291cmNlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgdGhlVHlwZSwKLQkgICAgICAgICAgICB0aGVJRCwKLQkgICAgICAgICAgICBuYW1lKTsKLQl7Ci0JCU9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOwotCQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCX0KLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgbmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEFkZFJlc291cmNlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgdGhlVHlwZSwKKyAgICAgICAgICAgICAgICB0aGVJRCwKKyAgICAgICAgICAgICAgICBuYW1lKTsKKyAgICB7CisgICAgICAgIE9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOworICAgICAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIH0KKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUmVzT2JqX0dldFJlc291cmNlU2l6ZU9uRGlzayhSZXNvdXJjZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgX3J2OwogI2lmbmRlZiBHZXRSZXNvdXJjZVNpemVPbkRpc2sKLQlQeU1hY19QUkVDSEVDSyhHZXRSZXNvdXJjZVNpemVPbkRpc2spOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFJlc291cmNlU2l6ZU9uRGlzayk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0UmVzb3VyY2VTaXplT25EaXNrKF9zZWxmLT5vYl9pdHNlbGYpOwotCXsKLQkJT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7Ci0JCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JfQotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRSZXNvdXJjZVNpemVPbkRpc2soX3NlbGYtPm9iX2l0c2VsZik7CisgICAgeworICAgICAgICBPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKKyAgICAgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICB9CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUmVzT2JqX0dldE1heFJlc291cmNlU2l6ZShSZXNvdXJjZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgX3J2OwogI2lmbmRlZiBHZXRNYXhSZXNvdXJjZVNpemUKLQlQeU1hY19QUkVDSEVDSyhHZXRNYXhSZXNvdXJjZVNpemUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1heFJlc291cmNlU2l6ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TWF4UmVzb3VyY2VTaXplKF9zZWxmLT5vYl9pdHNlbGYpOwotCXsKLQkJT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7Ci0JCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JfQotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRNYXhSZXNvdXJjZVNpemUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgeworICAgICAgICBPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKKyAgICAgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICB9CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUmVzT2JqX1NldFJlc0F0dHJzKFJlc291cmNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBhdHRyczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgYXR0cnM7CiAjaWZuZGVmIFNldFJlc0F0dHJzCi0JUHlNYWNfUFJFQ0hFQ0soU2V0UmVzQXR0cnMpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFJlc0F0dHJzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmYXR0cnMpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRSZXNBdHRycyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgIGF0dHJzKTsKLQl7Ci0JCU9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOwotCQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCX0KLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhdHRycykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldFJlc0F0dHJzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgYXR0cnMpOworICAgIHsKKyAgICAgICAgT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7CisgICAgICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgfQorICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpSZXNPYmpfQ2hhbmdlZFJlc291cmNlKFJlc291cmNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIENoYW5nZWRSZXNvdXJjZQotCVB5TWFjX1BSRUNIRUNLKENoYW5nZWRSZXNvdXJjZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ2hhbmdlZFJlc291cmNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlDaGFuZ2VkUmVzb3VyY2UoX3NlbGYtPm9iX2l0c2VsZik7Ci0JewotCQlPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKLQkJaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQl9Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDaGFuZ2VkUmVzb3VyY2UoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgeworICAgICAgICBPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKKyAgICAgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICB9CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlJlc09ial9SZW1vdmVSZXNvdXJjZShSZXNvdXJjZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBSZW1vdmVSZXNvdXJjZQotCVB5TWFjX1BSRUNIRUNLKFJlbW92ZVJlc291cmNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhSZW1vdmVSZXNvdXJjZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JUmVtb3ZlUmVzb3VyY2UoX3NlbGYtPm9iX2l0c2VsZik7Ci0JewotCQlPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKLQkJaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQl9Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBSZW1vdmVSZXNvdXJjZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICB7CisgICAgICAgIE9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOworICAgICAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIH0KKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUmVzT2JqX1dyaXRlUmVzb3VyY2UoUmVzb3VyY2VPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgV3JpdGVSZXNvdXJjZQotCVB5TWFjX1BSRUNIRUNLKFdyaXRlUmVzb3VyY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKFdyaXRlUmVzb3VyY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCVdyaXRlUmVzb3VyY2UoX3NlbGYtPm9iX2l0c2VsZik7Ci0JewotCQlPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKLQkJaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQl9Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBXcml0ZVJlc291cmNlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIHsKKyAgICAgICAgT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7CisgICAgICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgfQorICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpSZXNPYmpfU2V0UmVzb3VyY2VTaXplKFJlc291cmNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIG5ld1NpemU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgbmV3U2l6ZTsKICNpZm5kZWYgU2V0UmVzb3VyY2VTaXplCi0JUHlNYWNfUFJFQ0hFQ0soU2V0UmVzb3VyY2VTaXplKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRSZXNvdXJjZVNpemUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZuZXdTaXplKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0UmVzb3VyY2VTaXplKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgIG5ld1NpemUpOwotCXsKLQkJT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7Ci0JCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JfQotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld1NpemUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRSZXNvdXJjZVNpemUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgbmV3U2l6ZSk7CisgICAgeworICAgICAgICBPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKKyAgICAgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICB9CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlJlc09ial9HZXROZXh0Rk9ORChSZXNvdXJjZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JSGFuZGxlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgSGFuZGxlIF9ydjsKICNpZm5kZWYgR2V0TmV4dEZPTkQKLQlQeU1hY19QUkVDSEVDSyhHZXROZXh0Rk9ORCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TmV4dEZPTkQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldE5leHRGT05EKF9zZWxmLT5vYl9pdHNlbGYpOwotCXsKLQkJT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7Ci0JCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JfQotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TmV4dEZPTkQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgeworICAgICAgICBPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKKyAgICAgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICB9CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiAjaWZuZGVmIF9fTFA2NF9fCiBzdGF0aWMgUHlPYmplY3QgKlJlc09ial9hc19Db250cm9sKFJlc291cmNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAKLQlfcmVzID0gQ3RsT2JqX05ldygoQ29udHJvbEhhbmRsZSlfc2VsZi0+b2JfaXRzZWxmKTsKLQlyZXR1cm4gX3JlczsKKyAgICBfcmVzID0gQ3RsT2JqX05ldygoQ29udHJvbEhhbmRsZSlfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICByZXR1cm4gX3JlczsKIAogfQogCiBzdGF0aWMgUHlPYmplY3QgKlJlc09ial9hc19NZW51KFJlc291cmNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAKLQlfcmVzID0gTWVudU9ial9OZXcoKE1lbnVIYW5kbGUpX3NlbGYtPm9iX2l0c2VsZik7Ci0JcmV0dXJuIF9yZXM7CisgICAgX3JlcyA9IE1lbnVPYmpfTmV3KChNZW51SGFuZGxlKV9zZWxmLT5vYl9pdHNlbGYpOworICAgIHJldHVybiBfcmVzOwogCiB9CiAjZW5kaWYgLyogIV9fTFA2NF9fICovCiAKIHN0YXRpYyBQeU9iamVjdCAqUmVzT2JqX0xvYWRSZXNvdXJjZShSZXNvdXJjZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBMb2FkUmVzb3VyY2UKLQlQeU1hY19QUkVDSEVDSyhMb2FkUmVzb3VyY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKExvYWRSZXNvdXJjZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTG9hZFJlc291cmNlKF9zZWxmLT5vYl9pdHNlbGYpOwotCXsKLQkJT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7Ci0JCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JfQotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTG9hZFJlc291cmNlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIHsKKyAgICAgICAgT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7CisgICAgICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgfQorICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpSZXNPYmpfQXV0b0Rpc3Bvc2UoUmVzb3VyY2VPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKIAotCWludCBvbm9mZiwgb2xkID0gMDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJpIiwgJm9ub2ZmKSkKLQkgICAgICAgIHJldHVybiBOVUxMOwotCWlmICggX3NlbGYtPm9iX2ZyZWVpdCApCi0JICAgICAgICBvbGQgPSAxOwotCWlmICggb25vZmYgKQotCSAgICAgICAgX3NlbGYtPm9iX2ZyZWVpdCA9IFB5TWFjX0F1dG9EaXNwb3NlSGFuZGxlOwotCWVsc2UKLQkgICAgICAgIF9zZWxmLT5vYl9mcmVlaXQgPSBOVUxMOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJpIiwgb2xkKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpbnQgb25vZmYsIG9sZCA9IDA7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaSIsICZvbm9mZikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICggX3NlbGYtPm9iX2ZyZWVpdCApCisgICAgICAgIG9sZCA9IDE7CisgICAgaWYgKCBvbm9mZiApCisgICAgICAgIF9zZWxmLT5vYl9mcmVlaXQgPSBQeU1hY19BdXRvRGlzcG9zZUhhbmRsZTsKKyAgICBlbHNlCisgICAgICAgIF9zZWxmLT5vYl9mcmVlaXQgPSBOVUxMOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJpIiwgb2xkKTsKKyAgICByZXR1cm4gX3JlczsKIAogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgUmVzT2JqX21ldGhvZHNbXSA9IHsKLQl7IkhvbWVSZXNGaWxlIiwgKFB5Q0Z1bmN0aW9uKVJlc09ial9Ib21lUmVzRmlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgX3J2KSIpfSwKLQl7Ik1hY0xvYWRSZXNvdXJjZSIsIChQeUNGdW5jdGlvbilSZXNPYmpfTWFjTG9hZFJlc291cmNlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJSZWxlYXNlUmVzb3VyY2UiLCAoUHlDRnVuY3Rpb24pUmVzT2JqX1JlbGVhc2VSZXNvdXJjZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiRGV0YWNoUmVzb3VyY2UiLCAoUHlDRnVuY3Rpb24pUmVzT2JqX0RldGFjaFJlc291cmNlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJHZXRSZXNBdHRycyIsIChQeUNGdW5jdGlvbilSZXNPYmpfR2V0UmVzQXR0cnMsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKHNob3J0IF9ydikiKX0sCi0JeyJHZXRSZXNJbmZvIiwgKFB5Q0Z1bmN0aW9uKVJlc09ial9HZXRSZXNJbmZvLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChzaG9ydCB0aGVJRCwgUmVzVHlwZSB0aGVUeXBlLCBTdHIyNTUgbmFtZSkiKX0sCi0JeyJTZXRSZXNJbmZvIiwgKFB5Q0Z1bmN0aW9uKVJlc09ial9TZXRSZXNJbmZvLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCB0aGVJRCwgU3RyMjU1IG5hbWUpIC0+IE5vbmUiKX0sCi0JeyJBZGRSZXNvdXJjZSIsIChQeUNGdW5jdGlvbilSZXNPYmpfQWRkUmVzb3VyY2UsIDEsCi0JIFB5RG9jX1NUUigiKFJlc1R5cGUgdGhlVHlwZSwgc2hvcnQgdGhlSUQsIFN0cjI1NSBuYW1lKSAtPiBOb25lIil9LAotCXsiR2V0UmVzb3VyY2VTaXplT25EaXNrIiwgKFB5Q0Z1bmN0aW9uKVJlc09ial9HZXRSZXNvdXJjZVNpemVPbkRpc2ssIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKGxvbmcgX3J2KSIpfSwKLQl7IkdldE1heFJlc291cmNlU2l6ZSIsIChQeUNGdW5jdGlvbilSZXNPYmpfR2V0TWF4UmVzb3VyY2VTaXplLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChsb25nIF9ydikiKX0sCi0JeyJTZXRSZXNBdHRycyIsIChQeUNGdW5jdGlvbilSZXNPYmpfU2V0UmVzQXR0cnMsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGF0dHJzKSAtPiBOb25lIil9LAotCXsiQ2hhbmdlZFJlc291cmNlIiwgKFB5Q0Z1bmN0aW9uKVJlc09ial9DaGFuZ2VkUmVzb3VyY2UsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IlJlbW92ZVJlc291cmNlIiwgKFB5Q0Z1bmN0aW9uKVJlc09ial9SZW1vdmVSZXNvdXJjZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiV3JpdGVSZXNvdXJjZSIsIChQeUNGdW5jdGlvbilSZXNPYmpfV3JpdGVSZXNvdXJjZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiU2V0UmVzb3VyY2VTaXplIiwgKFB5Q0Z1bmN0aW9uKVJlc09ial9TZXRSZXNvdXJjZVNpemUsIDEsCi0JIFB5RG9jX1NUUigiKGxvbmcgbmV3U2l6ZSkgLT4gTm9uZSIpfSwKLQl7IkdldE5leHRGT05EIiwgKFB5Q0Z1bmN0aW9uKVJlc09ial9HZXROZXh0Rk9ORCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoSGFuZGxlIF9ydikiKX0sCisgICAgeyJIb21lUmVzRmlsZSIsIChQeUNGdW5jdGlvbilSZXNPYmpfSG9tZVJlc0ZpbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKHNob3J0IF9ydikiKX0sCisgICAgeyJNYWNMb2FkUmVzb3VyY2UiLCAoUHlDRnVuY3Rpb24pUmVzT2JqX01hY0xvYWRSZXNvdXJjZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiUmVsZWFzZVJlc291cmNlIiwgKFB5Q0Z1bmN0aW9uKVJlc09ial9SZWxlYXNlUmVzb3VyY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkRldGFjaFJlc291cmNlIiwgKFB5Q0Z1bmN0aW9uKVJlc09ial9EZXRhY2hSZXNvdXJjZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiR2V0UmVzQXR0cnMiLCAoUHlDRnVuY3Rpb24pUmVzT2JqX0dldFJlc0F0dHJzLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChzaG9ydCBfcnYpIil9LAorICAgIHsiR2V0UmVzSW5mbyIsIChQeUNGdW5jdGlvbilSZXNPYmpfR2V0UmVzSW5mbywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgdGhlSUQsIFJlc1R5cGUgdGhlVHlwZSwgU3RyMjU1IG5hbWUpIil9LAorICAgIHsiU2V0UmVzSW5mbyIsIChQeUNGdW5jdGlvbilSZXNPYmpfU2V0UmVzSW5mbywgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgdGhlSUQsIFN0cjI1NSBuYW1lKSAtPiBOb25lIil9LAorICAgIHsiQWRkUmVzb3VyY2UiLCAoUHlDRnVuY3Rpb24pUmVzT2JqX0FkZFJlc291cmNlLCAxLAorICAgICBQeURvY19TVFIoIihSZXNUeXBlIHRoZVR5cGUsIHNob3J0IHRoZUlELCBTdHIyNTUgbmFtZSkgLT4gTm9uZSIpfSwKKyAgICB7IkdldFJlc291cmNlU2l6ZU9uRGlzayIsIChQeUNGdW5jdGlvbilSZXNPYmpfR2V0UmVzb3VyY2VTaXplT25EaXNrLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChsb25nIF9ydikiKX0sCisgICAgeyJHZXRNYXhSZXNvdXJjZVNpemUiLCAoUHlDRnVuY3Rpb24pUmVzT2JqX0dldE1heFJlc291cmNlU2l6ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAobG9uZyBfcnYpIil9LAorICAgIHsiU2V0UmVzQXR0cnMiLCAoUHlDRnVuY3Rpb24pUmVzT2JqX1NldFJlc0F0dHJzLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBhdHRycykgLT4gTm9uZSIpfSwKKyAgICB7IkNoYW5nZWRSZXNvdXJjZSIsIChQeUNGdW5jdGlvbilSZXNPYmpfQ2hhbmdlZFJlc291cmNlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJSZW1vdmVSZXNvdXJjZSIsIChQeUNGdW5jdGlvbilSZXNPYmpfUmVtb3ZlUmVzb3VyY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IldyaXRlUmVzb3VyY2UiLCAoUHlDRnVuY3Rpb24pUmVzT2JqX1dyaXRlUmVzb3VyY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IlNldFJlc291cmNlU2l6ZSIsIChQeUNGdW5jdGlvbilSZXNPYmpfU2V0UmVzb3VyY2VTaXplLCAxLAorICAgICBQeURvY19TVFIoIihsb25nIG5ld1NpemUpIC0+IE5vbmUiKX0sCisgICAgeyJHZXROZXh0Rk9ORCIsIChQeUNGdW5jdGlvbilSZXNPYmpfR2V0TmV4dEZPTkQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEhhbmRsZSBfcnYpIil9LAogI2lmbmRlZiBfX0xQNjRfXwotCXsiYXNfQ29udHJvbCIsIChQeUNGdW5jdGlvbilSZXNPYmpfYXNfQ29udHJvbCwgMSwKLQkgUHlEb2NfU1RSKCJSZXR1cm4gdGhpcyByZXNvdXJjZS9oYW5kbGUgYXMgYSBDb250cm9sIil9LAotCXsiYXNfTWVudSIsIChQeUNGdW5jdGlvbilSZXNPYmpfYXNfTWVudSwgMSwKLQkgUHlEb2NfU1RSKCJSZXR1cm4gdGhpcyByZXNvdXJjZS9oYW5kbGUgYXMgYSBNZW51Iil9LAorICAgIHsiYXNfQ29udHJvbCIsIChQeUNGdW5jdGlvbilSZXNPYmpfYXNfQ29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCJSZXR1cm4gdGhpcyByZXNvdXJjZS9oYW5kbGUgYXMgYSBDb250cm9sIil9LAorICAgIHsiYXNfTWVudSIsIChQeUNGdW5jdGlvbilSZXNPYmpfYXNfTWVudSwgMSwKKyAgICAgUHlEb2NfU1RSKCJSZXR1cm4gdGhpcyByZXNvdXJjZS9oYW5kbGUgYXMgYSBNZW51Iil9LAogI2VuZGlmIC8qICFfX0xQNjRfXyAqLwotCXsiTG9hZFJlc291cmNlIiwgKFB5Q0Z1bmN0aW9uKVJlc09ial9Mb2FkUmVzb3VyY2UsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkF1dG9EaXNwb3NlIiwgKFB5Q0Z1bmN0aW9uKVJlc09ial9BdXRvRGlzcG9zZSwgMSwKLQkgUHlEb2NfU1RSKCIoaW50KS0+aW50LiBBdXRvbWF0aWNhbGx5IERpc3Bvc2VIYW5kbGUgdGhlIG9iamVjdCBvbiBQeXRob24gb2JqZWN0IGNsZWFudXAiKX0sCi0Je05VTEwsIE5VTEwsIDB9CisgICAgeyJMb2FkUmVzb3VyY2UiLCAoUHlDRnVuY3Rpb24pUmVzT2JqX0xvYWRSZXNvdXJjZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiQXV0b0Rpc3Bvc2UiLCAoUHlDRnVuY3Rpb24pUmVzT2JqX0F1dG9EaXNwb3NlLCAxLAorICAgICBQeURvY19TVFIoIihpbnQpLT5pbnQuIEF1dG9tYXRpY2FsbHkgRGlzcG9zZUhhbmRsZSB0aGUgb2JqZWN0IG9uIFB5dGhvbiBvYmplY3QgY2xlYW51cCIpfSwKKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqUmVzT2JqX2dldF9kYXRhKFJlc291cmNlT2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQogewogCi0JICAgICAgICAgICAgUHlPYmplY3QgKnJlczsKLQkgICAgICAgICAgICBjaGFyIHN0YXRlOworICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqcmVzOworICAgICAgICAgICAgICAgICAgICBjaGFyIHN0YXRlOwogCi0JICAgICAgICAgICAgc3RhdGUgPSBIR2V0U3RhdGUoc2VsZi0+b2JfaXRzZWxmKTsKLQkgICAgICAgICAgICBITG9jayhzZWxmLT5vYl9pdHNlbGYpOwotCSAgICAgICAgICAgIHJlcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKAotCSAgICAgICAgICAgICAgICAgICAgKnNlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgIEdldEhhbmRsZVNpemUoc2VsZi0+b2JfaXRzZWxmKSk7Ci0JICAgICAgICAgICAgSFVubG9jayhzZWxmLT5vYl9pdHNlbGYpOwotCSAgICAgICAgICAgIEhTZXRTdGF0ZShzZWxmLT5vYl9pdHNlbGYsIHN0YXRlKTsKLQkgICAgICAgICAgICByZXR1cm4gcmVzOwotCSAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IEhHZXRTdGF0ZShzZWxmLT5vYl9pdHNlbGYpOworICAgICAgICAgICAgICAgICAgICBITG9jayhzZWxmLT5vYl9pdHNlbGYpOworICAgICAgICAgICAgICAgICAgICByZXMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldEhhbmRsZVNpemUoc2VsZi0+b2JfaXRzZWxmKSk7CisgICAgICAgICAgICAgICAgICAgIEhVbmxvY2soc2VsZi0+b2JfaXRzZWxmKTsKKyAgICAgICAgICAgICAgICAgICAgSFNldFN0YXRlKHNlbGYtPm9iX2l0c2VsZiwgc3RhdGUpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworCiB9CiAKIHN0YXRpYyBpbnQgUmVzT2JqX3NldF9kYXRhKFJlc291cmNlT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdiwgdm9pZCAqY2xvc3VyZSkKIHsKIAotCSAgICAgICAgICAgIGNoYXIgKmRhdGE7Ci0JICAgICAgICAgICAgbG9uZyBzaXplOworICAgICAgICAgICAgICAgICAgICBjaGFyICpkYXRhOworICAgICAgICAgICAgICAgICAgICBsb25nIHNpemU7CiAKLQkgICAgICAgICAgICBpZiAoIHYgPT0gTlVMTCApCi0JICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0JICAgICAgICAgICAgaWYgKCAhUHlTdHJpbmdfQ2hlY2sodikgKQotCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotCSAgICAgICAgICAgIHNpemUgPSBQeVN0cmluZ19TaXplKHYpOwotCSAgICAgICAgICAgIGRhdGEgPSBQeVN0cmluZ19Bc1N0cmluZyh2KTsKLQkgICAgICAgICAgICAvKiBYWFhYIERvIEkgbmVlZCB0aGUgR2V0U3RhdGUvU2V0U3RhdGUgY2FsbHM/ICovCi0JICAgICAgICAgICAgU2V0SGFuZGxlU2l6ZShzZWxmLT5vYl9pdHNlbGYsIHNpemUpOwotCSAgICAgICAgICAgIGlmICggTWVtRXJyb3IoKSkKLQkgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLQkgICAgICAgICAgICBITG9jayhzZWxmLT5vYl9pdHNlbGYpOwotCSAgICAgICAgICAgIG1lbWNweSgoY2hhciAqKSpzZWxmLT5vYl9pdHNlbGYsIGRhdGEsIHNpemUpOwotCSAgICAgICAgICAgIEhVbmxvY2soc2VsZi0+b2JfaXRzZWxmKTsKLQkgICAgICAgICAgICAvKiBYWFhYIFNob3VsZCBJIGRvIHRoZSBDaGFuZ2VkIGNhbGwgaW1tZWRlYXRlbHk/ICovCi0JICAgICAgICAgICAgcmV0dXJuIDA7Ci0JICAgICAgICAgICAgCi0JcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgICAgIGlmICggdiA9PSBOVUxMICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgIGlmICggIVB5U3RyaW5nX0NoZWNrKHYpICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgIHNpemUgPSBQeVN0cmluZ19TaXplKHYpOworICAgICAgICAgICAgICAgICAgICBkYXRhID0gUHlTdHJpbmdfQXNTdHJpbmcodik7CisgICAgICAgICAgICAgICAgICAgIC8qIFhYWFggRG8gSSBuZWVkIHRoZSBHZXRTdGF0ZS9TZXRTdGF0ZSBjYWxscz8gKi8KKyAgICAgICAgICAgIFNldEhhbmRsZVNpemUoc2VsZi0+b2JfaXRzZWxmLCBzaXplKTsKKyAgICAgICAgICAgIGlmICggTWVtRXJyb3IoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBITG9jayhzZWxmLT5vYl9pdHNlbGYpOworICAgICAgICAgICAgbWVtY3B5KChjaGFyICopKnNlbGYtPm9iX2l0c2VsZiwgZGF0YSwgc2l6ZSk7CisgICAgICAgICAgICBIVW5sb2NrKHNlbGYtPm9iX2l0c2VsZik7CisgICAgICAgICAgICAvKiBYWFhYIFNob3VsZCBJIGRvIHRoZSBDaGFuZ2VkIGNhbGwgaW1tZWRlYXRlbHk/ICovCisgICAgICAgICAgICByZXR1cm4gMDsKKworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlJlc09ial9nZXRfc2l6ZShSZXNvdXJjZU9iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoR2V0SGFuZGxlU2l6ZShzZWxmLT5vYl9pdHNlbGYpKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoR2V0SGFuZGxlU2l6ZShzZWxmLT5vYl9pdHNlbGYpKTsKIH0KIAogI2RlZmluZSBSZXNPYmpfc2V0X3NpemUgTlVMTAogCiBzdGF0aWMgUHlHZXRTZXREZWYgUmVzT2JqX2dldHNldGxpc3RbXSA9IHsKLQl7ImRhdGEiLCAoZ2V0dGVyKVJlc09ial9nZXRfZGF0YSwgKHNldHRlcilSZXNPYmpfc2V0X2RhdGEsICJUaGUgcmVzb3VyY2UgZGF0YSJ9LAotCXsic2l6ZSIsIChnZXR0ZXIpUmVzT2JqX2dldF9zaXplLCAoc2V0dGVyKVJlc09ial9zZXRfc2l6ZSwgIlRoZSBsZW5ndGggb2YgdGhlIHJlc291cmNlIGRhdGEifSwKLQl7TlVMTCwgTlVMTCwgTlVMTCwgTlVMTH0sCisgICAgeyJkYXRhIiwgKGdldHRlcilSZXNPYmpfZ2V0X2RhdGEsIChzZXR0ZXIpUmVzT2JqX3NldF9kYXRhLCAiVGhlIHJlc291cmNlIGRhdGEifSwKKyAgICB7InNpemUiLCAoZ2V0dGVyKVJlc09ial9nZXRfc2l6ZSwgKHNldHRlcilSZXNPYmpfc2V0X3NpemUsICJUaGUgbGVuZ3RoIG9mIHRoZSByZXNvdXJjZSBkYXRhIn0sCisgICAge05VTEwsIE5VTEwsIE5VTEwsIE5VTEx9LAogfTsKIAogCkBAIC01NzgsODkgKzU3OCw4OSBAQAogI2RlZmluZSBSZXNPYmpfaGFzaCBOVUxMCiBzdGF0aWMgaW50IFJlc09ial90cF9pbml0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzLCBQeU9iamVjdCAqX2t3ZHMpCiB7Ci0JY2hhciAqc3JjZGF0YSA9IE5VTEw7Ci0JaW50IHNyY2xlbiA9IDA7Ci0JSGFuZGxlIGl0c2VsZjsKLQljaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKKyAgICBjaGFyICpzcmNkYXRhID0gTlVMTDsKKyAgICBpbnQgc3JjbGVuID0gMDsKKyAgICBIYW5kbGUgaXRzZWxmOworICAgIGNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OwogCi0JaWYgKFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBSZXNPYmpfQ29udmVydCwgJml0c2VsZikpCi0JewotCQkoKFJlc291cmNlT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JCXJldHVybiAwOwotCX0KLQlQeUVycl9DbGVhcigpOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgInxzIyIsIGt3LCAmc3JjZGF0YSwgJnNyY2xlbikpIHJldHVybiAtMTsKLQlpZiAoKGl0c2VsZiA9IE5ld0hhbmRsZShzcmNsZW4pKSA9PSBOVUxMKQotCXsKLQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJcmV0dXJuIDA7Ci0JfQotCSgoUmVzb3VyY2VPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlpZiAoc3JjbGVuICYmIHNyY2RhdGEpCi0JewotCQlITG9jayhpdHNlbGYpOwotCQltZW1jcHkoKml0c2VsZiwgc3JjZGF0YSwgc3JjbGVuKTsKLQkJSFVubG9jayhpdHNlbGYpOwotCX0KLQlyZXR1cm4gMDsKKyAgICBpZiAoUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIFJlc09ial9Db252ZXJ0LCAmaXRzZWxmKSkKKyAgICB7CisgICAgICAgICgoUmVzb3VyY2VPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIFB5RXJyX0NsZWFyKCk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAifHMjIiwga3csICZzcmNkYXRhLCAmc3JjbGVuKSkgcmV0dXJuIC0xOworICAgIGlmICgoaXRzZWxmID0gTmV3SGFuZGxlKHNyY2xlbikpID09IE5VTEwpCisgICAgeworICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgKChSZXNvdXJjZU9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIGlmIChzcmNsZW4gJiYgc3JjZGF0YSkKKyAgICB7CisgICAgICAgIEhMb2NrKGl0c2VsZik7CisgICAgICAgIG1lbWNweSgqaXRzZWxmLCBzcmNkYXRhLCBzcmNsZW4pOworICAgICAgICBIVW5sb2NrKGl0c2VsZik7CisgICAgfQorICAgIHJldHVybiAwOwogfQogCiAjZGVmaW5lIFJlc09ial90cF9hbGxvYyBQeVR5cGVfR2VuZXJpY0FsbG9jCiAKIHN0YXRpYyBQeU9iamVjdCAqUmVzT2JqX3RwX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICpfYXJncywgUHlPYmplY3QgKl9rd2RzKQogewotCVB5T2JqZWN0ICpzZWxmOwotCWlmICgoc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkoKFJlc291cmNlT2JqZWN0ICopc2VsZiktPm9iX2l0c2VsZiA9IE5VTEw7Ci0JKChSZXNvdXJjZU9iamVjdCAqKXNlbGYpLT5vYl9mcmVlaXQgPSBOVUxMOwotCXJldHVybiBzZWxmOworICAgIFB5T2JqZWN0ICpzZWxmOworICAgIGlmICgoc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAoKFJlc291cmNlT2JqZWN0ICopc2VsZiktPm9iX2l0c2VsZiA9IE5VTEw7CisgICAgKChSZXNvdXJjZU9iamVjdCAqKXNlbGYpLT5vYl9mcmVlaXQgPSBOVUxMOworICAgIHJldHVybiBzZWxmOwogfQogCiAjZGVmaW5lIFJlc09ial90cF9mcmVlIFB5T2JqZWN0X0RlbAogCiAKIFB5VHlwZU9iamVjdCBSZXNvdXJjZV9UeXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQotCTAsIC8qb2Jfc2l6ZSovCi0JIl9SZXMuUmVzb3VyY2UiLCAvKnRwX25hbWUqLwotCXNpemVvZihSZXNvdXJjZU9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KLQkwLCAvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpIFJlc09ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsIC8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLwotCShjbXBmdW5jKSBSZXNPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpIFJlc09ial9yZXByLCAvKnRwX3JlcHIqLwotCShQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KLQkoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLwotCShQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYykgUmVzT2JqX2hhc2gsIC8qdHBfaGFzaCovCi0JMCwgLyp0cF9jYWxsKi8KLQkwLCAvKnRwX3N0ciovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLwotCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCi0JMCwgLyp0cF9hc19idWZmZXIqLwotCVB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCTAsIC8qdHBfZG9jKi8KLQkwLCAvKnRwX3RyYXZlcnNlKi8KLQkwLCAvKnRwX2NsZWFyKi8KLQkwLCAvKnRwX3JpY2hjb21wYXJlKi8KLQkwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLQkwLCAvKnRwX2l0ZXIqLwotCTAsIC8qdHBfaXRlcm5leHQqLwotCVJlc09ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCi0JMCwgLyp0cF9tZW1iZXJzKi8KLQlSZXNPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLwotCTAsIC8qdHBfYmFzZSovCi0JMCwgLyp0cF9kaWN0Ki8KLQkwLCAvKnRwX2Rlc2NyX2dldCovCi0JMCwgLyp0cF9kZXNjcl9zZXQqLwotCTAsIC8qdHBfZGljdG9mZnNldCovCi0JUmVzT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KLQlSZXNPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCi0JUmVzT2JqX3RwX25ldywgLyogdHBfbmV3ICovCi0JUmVzT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAvKm9iX3NpemUqLworICAgICJfUmVzLlJlc291cmNlIiwgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoUmVzb3VyY2VPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKSBSZXNPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KKyAgICAoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KKyAgICAoY21wZnVuYykgUmVzT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCisgICAgKHJlcHJmdW5jKSBSZXNPYmpfcmVwciwgLyp0cF9yZXByKi8KKyAgICAoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCisgICAgKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAoaGFzaGZ1bmMpIFJlc09ial9oYXNoLCAvKnRwX2hhc2gqLworICAgIDAsIC8qdHBfY2FsbCovCisgICAgMCwgLyp0cF9zdHIqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KKyAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLworICAgIDAsIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAvKnRwX2RvYyovCisgICAgMCwgLyp0cF90cmF2ZXJzZSovCisgICAgMCwgLyp0cF9jbGVhciovCisgICAgMCwgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgLyp0cF9pdGVyKi8KKyAgICAwLCAvKnRwX2l0ZXJuZXh0Ki8KKyAgICBSZXNPYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLworICAgIDAsIC8qdHBfbWVtYmVycyovCisgICAgUmVzT2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KKyAgICAwLCAvKnRwX2Jhc2UqLworICAgIDAsIC8qdHBfZGljdCovCisgICAgMCwgLyp0cF9kZXNjcl9nZXQqLworICAgIDAsIC8qdHBfZGVzY3Jfc2V0Ki8KKyAgICAwLCAvKnRwX2RpY3RvZmZzZXQqLworICAgIFJlc09ial90cF9pbml0LCAvKiB0cF9pbml0ICovCisgICAgUmVzT2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLworICAgIFJlc09ial90cF9uZXcsIC8qIHRwX25ldyAqLworICAgIFJlc09ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLSBFbmQgb2JqZWN0IHR5cGUgUmVzb3VyY2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTY2OCwxMDI3ICs2NjgsMTAyNyBAQAogCiBzdGF0aWMgUHlPYmplY3QgKlJlc19DbG9zZVJlc0ZpbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IHJlZk51bTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgcmVmTnVtOwogI2lmbmRlZiBDbG9zZVJlc0ZpbGUKLQlQeU1hY19QUkVDSEVDSyhDbG9zZVJlc0ZpbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKENsb3NlUmVzRmlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJlZk51bSkpCi0JCXJldHVybiBOVUxMOwotCUNsb3NlUmVzRmlsZShyZWZOdW0pOwotCXsKLQkJT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7Ci0JCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JfQotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZk51bSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENsb3NlUmVzRmlsZShyZWZOdW0pOworICAgIHsKKyAgICAgICAgT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7CisgICAgICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgfQorICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpSZXNfUmVzRXJyb3IoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CiAjaWZuZGVmIFJlc0Vycm9yCi0JUHlNYWNfUFJFQ0hFQ0soUmVzRXJyb3IpOworICAgIFB5TWFjX1BSRUNIRUNLKFJlc0Vycm9yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUmVzRXJyb3IoKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFJlc0Vycm9yKCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUmVzX0N1clJlc0ZpbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgX3J2OwogI2lmbmRlZiBDdXJSZXNGaWxlCi0JUHlNYWNfUFJFQ0hFQ0soQ3VyUmVzRmlsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ3VyUmVzRmlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ3VyUmVzRmlsZSgpOwotCXsKLQkJT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7Ci0JCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JfQotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDdXJSZXNGaWxlKCk7CisgICAgeworICAgICAgICBPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKKyAgICAgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICB9CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUmVzX1VzZVJlc0ZpbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IHJlZk51bTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgcmVmTnVtOwogI2lmbmRlZiBVc2VSZXNGaWxlCi0JUHlNYWNfUFJFQ0hFQ0soVXNlUmVzRmlsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVXNlUmVzRmlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJlZk51bSkpCi0JCXJldHVybiBOVUxMOwotCVVzZVJlc0ZpbGUocmVmTnVtKTsKLQl7Ci0JCU9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOwotCQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCX0KLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWZOdW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBVc2VSZXNGaWxlKHJlZk51bSk7CisgICAgeworICAgICAgICBPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKKyAgICAgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICB9CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlJlc19Db3VudFR5cGVzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IF9ydjsKICNpZm5kZWYgQ291bnRUeXBlcwotCVB5TWFjX1BSRUNIRUNLKENvdW50VHlwZXMpOworICAgIFB5TWFjX1BSRUNIRUNLKENvdW50VHlwZXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENvdW50VHlwZXMoKTsKLQl7Ci0JCU9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOwotCQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCX0KLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ291bnRUeXBlcygpOworICAgIHsKKyAgICAgICAgT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7CisgICAgICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgfQorICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlJlc19Db3VudDFUeXBlcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBfcnY7CiAjaWZuZGVmIENvdW50MVR5cGVzCi0JUHlNYWNfUFJFQ0hFQ0soQ291bnQxVHlwZXMpOworICAgIFB5TWFjX1BSRUNIRUNLKENvdW50MVR5cGVzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDb3VudDFUeXBlcygpOwotCXsKLQkJT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7Ci0JCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JfQotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDb3VudDFUeXBlcygpOworICAgIHsKKyAgICAgICAgT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7CisgICAgICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgfQorICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlJlc19HZXRJbmRUeXBlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZXNUeXBlIHRoZVR5cGU7Ci0Jc2hvcnQgaW5kZXg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlc1R5cGUgdGhlVHlwZTsKKyAgICBzaG9ydCBpbmRleDsKICNpZm5kZWYgR2V0SW5kVHlwZQotCVB5TWFjX1BSRUNIRUNLKEdldEluZFR5cGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldEluZFR5cGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCi0JCXJldHVybiBOVUxMOwotCUdldEluZFR5cGUoJnRoZVR5cGUsCi0JICAgICAgICAgICBpbmRleCk7Ci0JewotCQlPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKLQkJaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQl9Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgdGhlVHlwZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldEluZFR5cGUoJnRoZVR5cGUsCisgICAgICAgICAgICAgICBpbmRleCk7CisgICAgeworICAgICAgICBPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKKyAgICAgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICB9CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgdGhlVHlwZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUmVzX0dldDFJbmRUeXBlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZXNUeXBlIHRoZVR5cGU7Ci0Jc2hvcnQgaW5kZXg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlc1R5cGUgdGhlVHlwZTsKKyAgICBzaG9ydCBpbmRleDsKICNpZm5kZWYgR2V0MUluZFR5cGUKLQlQeU1hY19QUkVDSEVDSyhHZXQxSW5kVHlwZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0MUluZFR5cGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCi0JCXJldHVybiBOVUxMOwotCUdldDFJbmRUeXBlKCZ0aGVUeXBlLAotCSAgICAgICAgICAgIGluZGV4KTsKLQl7Ci0JCU9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOwotCQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCX0KLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCB0aGVUeXBlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZGV4KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0MUluZFR5cGUoJnRoZVR5cGUsCisgICAgICAgICAgICAgICAgaW5kZXgpOworICAgIHsKKyAgICAgICAgT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7CisgICAgICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgfQorICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIHRoZVR5cGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlJlc19TZXRSZXNMb2FkKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIGxvYWQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gbG9hZDsKICNpZm5kZWYgU2V0UmVzTG9hZAotCVB5TWFjX1BSRUNIRUNLKFNldFJlc0xvYWQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFJlc0xvYWQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZsb2FkKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0UmVzTG9hZChsb2FkKTsKLQl7Ci0JCU9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOwotCQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCX0KLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZsb2FkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0UmVzTG9hZChsb2FkKTsKKyAgICB7CisgICAgICAgIE9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOworICAgICAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIH0KKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUmVzX0NvdW50UmVzb3VyY2VzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBfcnY7Ci0JUmVzVHlwZSB0aGVUeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBfcnY7CisgICAgUmVzVHlwZSB0aGVUeXBlOwogI2lmbmRlZiBDb3VudFJlc291cmNlcwotCVB5TWFjX1BSRUNIRUNLKENvdW50UmVzb3VyY2VzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb3VudFJlc291cmNlcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZVR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDb3VudFJlc291cmNlcyh0aGVUeXBlKTsKLQl7Ci0JCU9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOwotCQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCX0KLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZVR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDb3VudFJlc291cmNlcyh0aGVUeXBlKTsKKyAgICB7CisgICAgICAgIE9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOworICAgICAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIH0KKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpSZXNfQ291bnQxUmVzb3VyY2VzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBfcnY7Ci0JUmVzVHlwZSB0aGVUeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBfcnY7CisgICAgUmVzVHlwZSB0aGVUeXBlOwogI2lmbmRlZiBDb3VudDFSZXNvdXJjZXMKLQlQeU1hY19QUkVDSEVDSyhDb3VudDFSZXNvdXJjZXMpOworICAgIFB5TWFjX1BSRUNIRUNLKENvdW50MVJlc291cmNlcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZVR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDb3VudDFSZXNvdXJjZXModGhlVHlwZSk7Ci0JewotCQlPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKLQkJaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQl9Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ291bnQxUmVzb3VyY2VzKHRoZVR5cGUpOworICAgIHsKKyAgICAgICAgT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7CisgICAgICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgfQorICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlJlc19HZXRJbmRSZXNvdXJjZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JSGFuZGxlIF9ydjsKLQlSZXNUeXBlIHRoZVR5cGU7Ci0Jc2hvcnQgaW5kZXg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEhhbmRsZSBfcnY7CisgICAgUmVzVHlwZSB0aGVUeXBlOworICAgIHNob3J0IGluZGV4OwogI2lmbmRlZiBHZXRJbmRSZXNvdXJjZQotCVB5TWFjX1BSRUNIRUNLKEdldEluZFJlc291cmNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRJbmRSZXNvdXJjZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRJbmRSZXNvdXJjZSh0aGVUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgIGluZGV4KTsKLQl7Ci0JCU9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOwotCQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCX0KLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZGV4KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0SW5kUmVzb3VyY2UodGhlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCk7CisgICAgeworICAgICAgICBPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKKyAgICAgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICB9CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlJlc19HZXQxSW5kUmVzb3VyY2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUhhbmRsZSBfcnY7Ci0JUmVzVHlwZSB0aGVUeXBlOwotCXNob3J0IGluZGV4OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBIYW5kbGUgX3J2OworICAgIFJlc1R5cGUgdGhlVHlwZTsKKyAgICBzaG9ydCBpbmRleDsKICNpZm5kZWYgR2V0MUluZFJlc291cmNlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0MUluZFJlc291cmNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXQxSW5kUmVzb3VyY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluZGV4KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0MUluZFJlc291cmNlKHRoZVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgIGluZGV4KTsKLQl7Ci0JCU9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOwotCQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCX0KLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZGV4KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0MUluZFJlc291cmNlKHRoZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4KTsKKyAgICB7CisgICAgICAgIE9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOworICAgICAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIH0KKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUmVzX0dldFJlc291cmNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlIYW5kbGUgX3J2OwotCVJlc1R5cGUgdGhlVHlwZTsKLQlzaG9ydCB0aGVJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgSGFuZGxlIF9ydjsKKyAgICBSZXNUeXBlIHRoZVR5cGU7CisgICAgc2hvcnQgdGhlSUQ7CiAjaWZuZGVmIEdldFJlc291cmNlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0UmVzb3VyY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFJlc291cmNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aGVJRCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFJlc291cmNlKHRoZVR5cGUsCi0JICAgICAgICAgICAgICAgICAgdGhlSUQpOwotCXsKLQkJT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7Ci0JCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JfQotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlSUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRSZXNvdXJjZSh0aGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgIHRoZUlEKTsKKyAgICB7CisgICAgICAgIE9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOworICAgICAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIH0KKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUmVzX0dldDFSZXNvdXJjZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JSGFuZGxlIF9ydjsKLQlSZXNUeXBlIHRoZVR5cGU7Ci0Jc2hvcnQgdGhlSUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEhhbmRsZSBfcnY7CisgICAgUmVzVHlwZSB0aGVUeXBlOworICAgIHNob3J0IHRoZUlEOwogI2lmbmRlZiBHZXQxUmVzb3VyY2UKLQlQeU1hY19QUkVDSEVDSyhHZXQxUmVzb3VyY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldDFSZXNvdXJjZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGhlSUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXQxUmVzb3VyY2UodGhlVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgdGhlSUQpOwotCXsKLQkJT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7Ci0JCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JfQotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlSUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXQxUmVzb3VyY2UodGhlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgdGhlSUQpOworICAgIHsKKyAgICAgICAgT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7CisgICAgICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgfQorICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpSZXNfR2V0TmFtZWRSZXNvdXJjZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JSGFuZGxlIF9ydjsKLQlSZXNUeXBlIHRoZVR5cGU7Ci0JU3RyMjU1IG5hbWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEhhbmRsZSBfcnY7CisgICAgUmVzVHlwZSB0aGVUeXBlOworICAgIFN0cjI1NSBuYW1lOwogI2lmbmRlZiBHZXROYW1lZFJlc291cmNlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TmFtZWRSZXNvdXJjZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TmFtZWRSZXNvdXJjZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBuYW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TmFtZWRSZXNvdXJjZSh0aGVUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7Ci0JewotCQlPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKLQkJaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQl9Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIG5hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXROYW1lZFJlc291cmNlKHRoZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKKyAgICB7CisgICAgICAgIE9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOworICAgICAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIH0KKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUmVzX0dldDFOYW1lZFJlc291cmNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlIYW5kbGUgX3J2OwotCVJlc1R5cGUgdGhlVHlwZTsKLQlTdHIyNTUgbmFtZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgSGFuZGxlIF9ydjsKKyAgICBSZXNUeXBlIHRoZVR5cGU7CisgICAgU3RyMjU1IG5hbWU7CiAjaWZuZGVmIEdldDFOYW1lZFJlc291cmNlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0MU5hbWVkUmVzb3VyY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldDFOYW1lZFJlc291cmNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIG5hbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXQxTmFtZWRSZXNvdXJjZSh0aGVUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUpOwotCXsKLQkJT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7Ci0JCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JfQotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBuYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0MU5hbWVkUmVzb3VyY2UodGhlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKKyAgICB7CisgICAgICAgIE9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOworICAgICAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIH0KKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUmVzX1VuaXF1ZUlEKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBfcnY7Ci0JUmVzVHlwZSB0aGVUeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBfcnY7CisgICAgUmVzVHlwZSB0aGVUeXBlOwogI2lmbmRlZiBVbmlxdWVJRAotCVB5TWFjX1BSRUNIRUNLKFVuaXF1ZUlEKTsKKyAgICBQeU1hY19QUkVDSEVDSyhVbmlxdWVJRCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZVR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBVbmlxdWVJRCh0aGVUeXBlKTsKLQl7Ci0JCU9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOwotCQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCX0KLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZVR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBVbmlxdWVJRCh0aGVUeXBlKTsKKyAgICB7CisgICAgICAgIE9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOworICAgICAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIH0KKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpSZXNfVW5pcXVlMUlEKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBfcnY7Ci0JUmVzVHlwZSB0aGVUeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBfcnY7CisgICAgUmVzVHlwZSB0aGVUeXBlOwogI2lmbmRlZiBVbmlxdWUxSUQKLQlQeU1hY19QUkVDSEVDSyhVbmlxdWUxSUQpOworICAgIFB5TWFjX1BSRUNIRUNLKFVuaXF1ZTFJRCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZVR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBVbmlxdWUxSUQodGhlVHlwZSk7Ci0JewotCQlPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKLQkJaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQl9Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVW5pcXVlMUlEKHRoZVR5cGUpOworICAgIHsKKyAgICAgICAgT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7CisgICAgICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgfQorICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlJlc19VcGRhdGVSZXNGaWxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCByZWZOdW07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IHJlZk51bTsKICNpZm5kZWYgVXBkYXRlUmVzRmlsZQotCVB5TWFjX1BSRUNIRUNLKFVwZGF0ZVJlc0ZpbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFVwZGF0ZVJlc0ZpbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZWZOdW0pKQotCQlyZXR1cm4gTlVMTDsKLQlVcGRhdGVSZXNGaWxlKHJlZk51bSk7Ci0JewotCQlPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKLQkJaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQl9Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVmTnVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVXBkYXRlUmVzRmlsZShyZWZOdW0pOworICAgIHsKKyAgICAgICAgT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7CisgICAgICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgfQorICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpSZXNfU2V0UmVzUHVyZ2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gaW5zdGFsbDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBpbnN0YWxsOwogI2lmbmRlZiBTZXRSZXNQdXJnZQotCVB5TWFjX1BSRUNIRUNLKFNldFJlc1B1cmdlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRSZXNQdXJnZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluc3RhbGwpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRSZXNQdXJnZShpbnN0YWxsKTsKLQl7Ci0JCU9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOwotCQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCX0KLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnN0YWxsKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0UmVzUHVyZ2UoaW5zdGFsbCk7CisgICAgeworICAgICAgICBPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKKyAgICAgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICB9CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlJlc19HZXRSZXNGaWxlQXR0cnMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IF9ydjsKLQlzaG9ydCByZWZOdW07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IF9ydjsKKyAgICBzaG9ydCByZWZOdW07CiAjaWZuZGVmIEdldFJlc0ZpbGVBdHRycwotCVB5TWFjX1BSRUNIRUNLKEdldFJlc0ZpbGVBdHRycyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0UmVzRmlsZUF0dHJzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVmTnVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0UmVzRmlsZUF0dHJzKHJlZk51bSk7Ci0JewotCQlPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKLQkJaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQl9Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWZOdW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRSZXNGaWxlQXR0cnMocmVmTnVtKTsKKyAgICB7CisgICAgICAgIE9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOworICAgICAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIH0KKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpSZXNfU2V0UmVzRmlsZUF0dHJzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCByZWZOdW07Ci0Jc2hvcnQgYXR0cnM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IHJlZk51bTsKKyAgICBzaG9ydCBhdHRyczsKICNpZm5kZWYgU2V0UmVzRmlsZUF0dHJzCi0JUHlNYWNfUFJFQ0hFQ0soU2V0UmVzRmlsZUF0dHJzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRSZXNGaWxlQXR0cnMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmYXR0cnMpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRSZXNGaWxlQXR0cnMocmVmTnVtLAotCSAgICAgICAgICAgICAgICBhdHRycyk7Ci0JewotCQlPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKLQkJaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQl9Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmF0dHJzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0UmVzRmlsZUF0dHJzKHJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgYXR0cnMpOworICAgIHsKKyAgICAgICAgT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7CisgICAgICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgfQorICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogI2lmbmRlZiBfX0xQNjRfXwogc3RhdGljIFB5T2JqZWN0ICpSZXNfT3BlblJGUGVybShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgX3J2OwotCVN0cjI1NSBmaWxlTmFtZTsKLQlzaG9ydCB2UmVmTnVtOwotCVNpZ25lZEJ5dGUgcGVybWlzc2lvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgX3J2OworICAgIFN0cjI1NSBmaWxlTmFtZTsKKyAgICBzaG9ydCB2UmVmTnVtOworICAgIFNpZ25lZEJ5dGUgcGVybWlzc2lvbjsKICNpZm5kZWYgT3BlblJGUGVybQotCVB5TWFjX1BSRUNIRUNLKE9wZW5SRlBlcm0pOworICAgIFB5TWFjX1BSRUNIRUNLKE9wZW5SRlBlcm0pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgZmlsZU5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmcGVybWlzc2lvbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE9wZW5SRlBlcm0oZmlsZU5hbWUsCi0JICAgICAgICAgICAgICAgICB2UmVmTnVtLAotCSAgICAgICAgICAgICAgICAgcGVybWlzc2lvbik7Ci0JewotCQlPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKLQkJaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQl9Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgZmlsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGVybWlzc2lvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE9wZW5SRlBlcm0oZmlsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICB2UmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbik7CisgICAgeworICAgICAgICBPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKKyAgICAgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICB9CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUmVzX0hPcGVuUmVzRmlsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgX3J2OwotCXNob3J0IHZSZWZOdW07Ci0JbG9uZyBkaXJJRDsKLQlTdHIyNTUgZmlsZU5hbWU7Ci0JU2lnbmVkQnl0ZSBwZXJtaXNzaW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBfcnY7CisgICAgc2hvcnQgdlJlZk51bTsKKyAgICBsb25nIGRpcklEOworICAgIFN0cjI1NSBmaWxlTmFtZTsKKyAgICBTaWduZWRCeXRlIHBlcm1pc3Npb247CiAjaWZuZGVmIEhPcGVuUmVzRmlsZQotCVB5TWFjX1BSRUNIRUNLKEhPcGVuUmVzRmlsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSE9wZW5SZXNGaWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsTyZiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICZkaXJJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBmaWxlTmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnBlcm1pc3Npb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBIT3BlblJlc0ZpbGUodlJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgZGlySUQsCi0JICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lLAotCSAgICAgICAgICAgICAgICAgICBwZXJtaXNzaW9uKTsKLQl7Ci0JCU9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOwotCQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCX0KLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobE8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGlySUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgZmlsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwZXJtaXNzaW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gSE9wZW5SZXNGaWxlKHZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgIGRpcklELAorICAgICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbik7CisgICAgeworICAgICAgICBPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKKyAgICAgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICB9CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUmVzX0hDcmVhdGVSZXNGaWxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCB2UmVmTnVtOwotCWxvbmcgZGlySUQ7Ci0JU3RyMjU1IGZpbGVOYW1lOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCB2UmVmTnVtOworICAgIGxvbmcgZGlySUQ7CisgICAgU3RyMjU1IGZpbGVOYW1lOwogI2lmbmRlZiBIQ3JlYXRlUmVzRmlsZQotCVB5TWFjX1BSRUNIRUNLKEhDcmVhdGVSZXNGaWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhIQ3JlYXRlUmVzRmlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICZkaXJJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBmaWxlTmFtZSkpCi0JCXJldHVybiBOVUxMOwotCUhDcmVhdGVSZXNGaWxlKHZSZWZOdW0sCi0JICAgICAgICAgICAgICAgZGlySUQsCi0JICAgICAgICAgICAgICAgZmlsZU5hbWUpOwotCXsKLQkJT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7Ci0JCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JfQotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkaXJJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBmaWxlTmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEhDcmVhdGVSZXNGaWxlKHZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgZGlySUQsCisgICAgICAgICAgICAgICAgICAgZmlsZU5hbWUpOworICAgIHsKKyAgICAgICAgT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7CisgICAgICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgfQorICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpSZXNfRlNwT3BlblJlc0ZpbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IF9ydjsKLQlGU1NwZWMgc3BlYzsKLQlTaWduZWRCeXRlIHBlcm1pc3Npb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IF9ydjsKKyAgICBGU1NwZWMgc3BlYzsKKyAgICBTaWduZWRCeXRlIHBlcm1pc3Npb247CiAjaWZuZGVmIEZTcE9wZW5SZXNGaWxlCi0JUHlNYWNfUFJFQ0hFQ0soRlNwT3BlblJlc0ZpbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEZTcE9wZW5SZXNGaWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJnNwZWMsCi0JICAgICAgICAgICAgICAgICAgICAgICZwZXJtaXNzaW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRlNwT3BlblJlc0ZpbGUoJnNwZWMsCi0JICAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbik7Ci0JewotCQlPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKLQkJaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQl9Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmc3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBlcm1pc3Npb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBGU3BPcGVuUmVzRmlsZSgmc3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBwZXJtaXNzaW9uKTsKKyAgICB7CisgICAgICAgIE9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOworICAgICAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIH0KKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpSZXNfRlNwQ3JlYXRlUmVzRmlsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JRlNTcGVjIHNwZWM7Ci0JT1NUeXBlIGNyZWF0b3I7Ci0JT1NUeXBlIGZpbGVUeXBlOwotCVNjcmlwdENvZGUgc2NyaXB0VGFnOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBGU1NwZWMgc3BlYzsKKyAgICBPU1R5cGUgY3JlYXRvcjsKKyAgICBPU1R5cGUgZmlsZVR5cGU7CisgICAgU2NyaXB0Q29kZSBzY3JpcHRUYWc7CiAjaWZuZGVmIEZTcENyZWF0ZVJlc0ZpbGUKLQlQeU1hY19QUkVDSEVDSyhGU3BDcmVhdGVSZXNGaWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhGU3BDcmVhdGVSZXNGaWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZzcGVjLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZmaWxlVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNjcmlwdFRhZykpCi0JCXJldHVybiBOVUxMOwotCUZTcENyZWF0ZVJlc0ZpbGUoJnNwZWMsCi0JICAgICAgICAgICAgICAgICBjcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgZmlsZVR5cGUsCi0JICAgICAgICAgICAgICAgICBzY3JpcHRUYWcpOwotCXsKLQkJT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7Ci0JCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JfQotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmc3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZmlsZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzY3JpcHRUYWcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBGU3BDcmVhdGVSZXNGaWxlKCZzcGVjLAorICAgICAgICAgICAgICAgICAgICAgY3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgIGZpbGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgc2NyaXB0VGFnKTsKKyAgICB7CisgICAgICAgIE9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOworICAgICAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIH0KKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAjZW5kaWYgLyogIV9fTFA2NF9fICovCiAKIHN0YXRpYyBQeU9iamVjdCAqUmVzX0luc2VydFJlc291cmNlRmlsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlTSW50MTYgcmVmTnVtOwotCVJzcmNDaGFpbkxvY2F0aW9uIHdoZXJlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFNJbnQxNiByZWZOdW07CisgICAgUnNyY0NoYWluTG9jYXRpb24gd2hlcmU7CiAjaWZuZGVmIEluc2VydFJlc291cmNlRmlsZQotCVB5TWFjX1BSRUNIRUNLKEluc2VydFJlc291cmNlRmlsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSW5zZXJ0UmVzb3VyY2VGaWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgJndoZXJlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEluc2VydFJlc291cmNlRmlsZShyZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmd2hlcmUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gSW5zZXJ0UmVzb3VyY2VGaWxlKHJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpSZXNfRGV0YWNoUmVzb3VyY2VGaWxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVNJbnQxNiByZWZOdW07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU0ludDE2IHJlZk51bTsKICNpZm5kZWYgRGV0YWNoUmVzb3VyY2VGaWxlCi0JUHlNYWNfUFJFQ0hFQ0soRGV0YWNoUmVzb3VyY2VGaWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEZXRhY2hSZXNvdXJjZUZpbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZWZOdW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRGV0YWNoUmVzb3VyY2VGaWxlKHJlZk51bSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWZOdW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRGV0YWNoUmVzb3VyY2VGaWxlKHJlZk51bSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKICNpZm5kZWYgX19MUDY0X18KIHN0YXRpYyBQeU9iamVjdCAqUmVzX0ZTcFJlc291cmNlRmlsZUFscmVhZHlPcGVuKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlGU1NwZWMgcmVzb3VyY2VGaWxlOwotCUJvb2xlYW4gaW5DaGFpbjsKLQlTSW50MTYgcmVmTnVtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBGU1NwZWMgcmVzb3VyY2VGaWxlOworICAgIEJvb2xlYW4gaW5DaGFpbjsKKyAgICBTSW50MTYgcmVmTnVtOwogI2lmbmRlZiBGU3BSZXNvdXJjZUZpbGVBbHJlYWR5T3BlbgotCVB5TWFjX1BSRUNIRUNLKEZTcFJlc291cmNlRmlsZUFscmVhZHlPcGVuKTsKKyAgICBQeU1hY19QUkVDSEVDSyhGU3BSZXNvdXJjZUZpbGVBbHJlYWR5T3Blbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJnJlc291cmNlRmlsZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEZTcFJlc291cmNlRmlsZUFscmVhZHlPcGVuKCZyZXNvdXJjZUZpbGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQ2hhaW4sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZk51bSk7Ci0JewotCQlPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKLQkJaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQl9Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImJiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGluQ2hhaW4sCi0JICAgICAgICAgICAgICAgICAgICAgcmVmTnVtKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJnJlc291cmNlRmlsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEZTcFJlc291cmNlRmlsZUFscmVhZHlPcGVuKCZyZXNvdXJjZUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQ2hhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZk51bSk7CisgICAgeworICAgICAgICBPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKKyAgICAgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICB9CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImJiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGluQ2hhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVmTnVtKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpSZXNfRlNwT3Blbk9ycGhhblJlc0ZpbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JRlNTcGVjIHNwZWM7Ci0JU2lnbmVkQnl0ZSBwZXJtaXNzaW9uOwotCVNJbnQxNiByZWZOdW07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgRlNTcGVjIHNwZWM7CisgICAgU2lnbmVkQnl0ZSBwZXJtaXNzaW9uOworICAgIFNJbnQxNiByZWZOdW07CiAjaWZuZGVmIEZTcE9wZW5PcnBoYW5SZXNGaWxlCi0JUHlNYWNfUFJFQ0hFQ0soRlNwT3Blbk9ycGhhblJlc0ZpbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEZTcE9wZW5PcnBoYW5SZXNGaWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJnNwZWMsCi0JICAgICAgICAgICAgICAgICAgICAgICZwZXJtaXNzaW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEZTcE9wZW5PcnBoYW5SZXNGaWxlKCZzcGVjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJtaXNzaW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVmTnVtKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICByZWZOdW0pOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJnNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwZXJtaXNzaW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEZTcE9wZW5PcnBoYW5SZXNGaWxlKCZzcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJtaXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVmTnVtKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZWZOdW0pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlJlc19HZXRUb3BSZXNvdXJjZUZpbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU0ludDE2IHJlZk51bTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTSW50MTYgcmVmTnVtOwogI2lmbmRlZiBHZXRUb3BSZXNvdXJjZUZpbGUKLQlQeU1hY19QUkVDSEVDSyhHZXRUb3BSZXNvdXJjZUZpbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFRvcFJlc291cmNlRmlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldFRvcFJlc291cmNlRmlsZSgmcmVmTnVtKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICByZWZOdW0pOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0VG9wUmVzb3VyY2VGaWxlKCZyZWZOdW0pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlZk51bSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIAogc3RhdGljIFB5T2JqZWN0ICpSZXNfR2V0TmV4dFJlc291cmNlRmlsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlTSW50MTYgY3VyUmVmTnVtOwotCVNJbnQxNiBuZXh0UmVmTnVtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFNJbnQxNiBjdXJSZWZOdW07CisgICAgU0ludDE2IG5leHRSZWZOdW07CiAjaWZuZGVmIEdldE5leHRSZXNvdXJjZUZpbGUKLQlQeU1hY19QUkVDSEVDSyhHZXROZXh0UmVzb3VyY2VGaWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXROZXh0UmVzb3VyY2VGaWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmY3VyUmVmTnVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldE5leHRSZXNvdXJjZUZpbGUoY3VyUmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXh0UmVmTnVtKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBuZXh0UmVmTnVtKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmN1clJlZk51bSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXROZXh0UmVzb3VyY2VGaWxlKGN1clJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmV4dFJlZk51bSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFJlZk51bSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAjZW5kaWYgLyogIV9fTFA2NF9fICovCiAKIHN0YXRpYyBQeU9iamVjdCAqUmVzX0ZTT3BlblJlc0ZpbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IF9ydjsKLQlGU1JlZiByZWY7Ci0JU2lnbmVkQnl0ZSBwZXJtaXNzaW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBfcnY7CisgICAgRlNSZWYgcmVmOworICAgIFNpZ25lZEJ5dGUgcGVybWlzc2lvbjsKICNpZm5kZWYgRlNPcGVuUmVzRmlsZQotCVB5TWFjX1BSRUNIRUNLKEZTT3BlblJlc0ZpbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEZTT3BlblJlc0ZpbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNSZWYsICZyZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICZwZXJtaXNzaW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRlNPcGVuUmVzRmlsZSgmcmVmLAotCSAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbik7Ci0JewotCQlPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKLQkJaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQl9Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNSZWYsICZyZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwZXJtaXNzaW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRlNPcGVuUmVzRmlsZSgmcmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbik7CisgICAgeworICAgICAgICBPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKKyAgICAgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICB9CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIAogI2lmbmRlZiBfX0xQNjRfXwogc3RhdGljIFB5T2JqZWN0ICpSZXNfRlNDcmVhdGVSZXNGaWxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlGU1JlZiBwYXJlbnRSZWY7Ci0JVW5pQ2hhciAqbmFtZUxlbmd0aF9faW5fXzsKLQlVbmlDaGFyQ291bnQgbmFtZUxlbmd0aF9fbGVuX187Ci0JaW50IG5hbWVMZW5ndGhfX2luX2xlbl9fOwotCUZTUmVmIG5ld1JlZjsKLQlGU1NwZWMgbmV3U3BlYzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgRlNSZWYgcGFyZW50UmVmOworICAgIFVuaUNoYXIgKm5hbWVMZW5ndGhfX2luX187CisgICAgVW5pQ2hhckNvdW50IG5hbWVMZW5ndGhfX2xlbl9fOworICAgIGludCBuYW1lTGVuZ3RoX19pbl9sZW5fXzsKKyAgICBGU1JlZiBuZXdSZWY7CisgICAgRlNTcGVjIG5ld1NwZWM7CiAjaWZuZGVmIEZTQ3JlYXRlUmVzRmlsZQotCVB5TWFjX1BSRUNIRUNLKEZTQ3JlYXRlUmVzRmlsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRlNDcmVhdGVSZXNGaWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mdSMiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1JlZiwgJnBhcmVudFJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm5hbWVMZW5ndGhfX2luX18sICZuYW1lTGVuZ3RoX19pbl9sZW5fXykpCi0JCXJldHVybiBOVUxMOwotCW5hbWVMZW5ndGhfX2xlbl9fID0gbmFtZUxlbmd0aF9faW5fbGVuX187Ci0JRlNDcmVhdGVSZXNGaWxlKCZwYXJlbnRSZWYsCi0JICAgICAgICAgICAgICAgIG5hbWVMZW5ndGhfX2xlbl9fLCBuYW1lTGVuZ3RoX19pbl9fLAotCSAgICAgICAgICAgICAgICAwLAotCSAgICAgICAgICAgICAgICAoRlNDYXRhbG9nSW5mbyAqKTAsCi0JICAgICAgICAgICAgICAgICZuZXdSZWYsCi0JICAgICAgICAgICAgICAgICZuZXdTcGVjKTsKLQl7Ci0JCU9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOwotCQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCX0KLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGU1JlZiwgJm5ld1JlZiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZTU3BlYywgJm5ld1NwZWMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mdSMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1JlZiwgJnBhcmVudFJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWVMZW5ndGhfX2luX18sICZuYW1lTGVuZ3RoX19pbl9sZW5fXykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG5hbWVMZW5ndGhfX2xlbl9fID0gbmFtZUxlbmd0aF9faW5fbGVuX187CisgICAgRlNDcmVhdGVSZXNGaWxlKCZwYXJlbnRSZWYsCisgICAgICAgICAgICAgICAgICAgIG5hbWVMZW5ndGhfX2xlbl9fLCBuYW1lTGVuZ3RoX19pbl9fLAorICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAoRlNDYXRhbG9nSW5mbyAqKTAsCisgICAgICAgICAgICAgICAgICAgICZuZXdSZWYsCisgICAgICAgICAgICAgICAgICAgICZuZXdTcGVjKTsKKyAgICB7CisgICAgICAgIE9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOworICAgICAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIH0KKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGU1JlZiwgJm5ld1JlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZTU3BlYywgJm5ld1NwZWMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlJlc19GU1Jlc291cmNlRmlsZUFscmVhZHlPcGVuKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlGU1JlZiByZXNvdXJjZUZpbGVSZWY7Ci0JQm9vbGVhbiBpbkNoYWluOwotCVNJbnQxNiByZWZOdW07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIEZTUmVmIHJlc291cmNlRmlsZVJlZjsKKyAgICBCb29sZWFuIGluQ2hhaW47CisgICAgU0ludDE2IHJlZk51bTsKICNpZm5kZWYgRlNSZXNvdXJjZUZpbGVBbHJlYWR5T3BlbgotCVB5TWFjX1BSRUNIRUNLKEZTUmVzb3VyY2VGaWxlQWxyZWFkeU9wZW4pOworICAgIFB5TWFjX1BSRUNIRUNLKEZTUmVzb3VyY2VGaWxlQWxyZWFkeU9wZW4pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1JlZiwgJnJlc291cmNlRmlsZVJlZikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEZTUmVzb3VyY2VGaWxlQWxyZWFkeU9wZW4oJnJlc291cmNlRmlsZVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkNoYWluLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZk51bSk7Ci0JewotCQlPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKLQkJaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQl9Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImJiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGluQ2hhaW4sCi0JICAgICAgICAgICAgICAgICAgICAgcmVmTnVtKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTUmVmLCAmcmVzb3VyY2VGaWxlUmVmKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRlNSZXNvdXJjZUZpbGVBbHJlYWR5T3BlbigmcmVzb3VyY2VGaWxlUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQ2hhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVmTnVtKTsKKyAgICB7CisgICAgICAgIE9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOworICAgICAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIH0KKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYmJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW5DaGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZWZOdW0pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlJlc19GU0NyZWF0ZVJlc291cmNlRmlsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlGU1JlZiBwYXJlbnRSZWY7Ci0JVW5pQ2hhciAqbmFtZUxlbmd0aF9faW5fXzsKLQlVbmlDaGFyQ291bnQgbmFtZUxlbmd0aF9fbGVuX187Ci0JaW50IG5hbWVMZW5ndGhfX2luX2xlbl9fOwotCVVuaUNoYXIgKmZvcmtOYW1lTGVuZ3RoX19pbl9fOwotCVVuaUNoYXJDb3VudCBmb3JrTmFtZUxlbmd0aF9fbGVuX187Ci0JaW50IGZvcmtOYW1lTGVuZ3RoX19pbl9sZW5fXzsKLQlGU1JlZiBuZXdSZWY7Ci0JRlNTcGVjIG5ld1NwZWM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgRlNSZWYgcGFyZW50UmVmOworICAgIFVuaUNoYXIgKm5hbWVMZW5ndGhfX2luX187CisgICAgVW5pQ2hhckNvdW50IG5hbWVMZW5ndGhfX2xlbl9fOworICAgIGludCBuYW1lTGVuZ3RoX19pbl9sZW5fXzsKKyAgICBVbmlDaGFyICpmb3JrTmFtZUxlbmd0aF9faW5fXzsKKyAgICBVbmlDaGFyQ291bnQgZm9ya05hbWVMZW5ndGhfX2xlbl9fOworICAgIGludCBmb3JrTmFtZUxlbmd0aF9faW5fbGVuX187CisgICAgRlNSZWYgbmV3UmVmOworICAgIEZTU3BlYyBuZXdTcGVjOwogI2lmbmRlZiBGU0NyZWF0ZVJlc291cmNlRmlsZQotCVB5TWFjX1BSRUNIRUNLKEZTQ3JlYXRlUmVzb3VyY2VGaWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhGU0NyZWF0ZVJlc291cmNlRmlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnUjdSMiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1JlZiwgJnBhcmVudFJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm5hbWVMZW5ndGhfX2luX18sICZuYW1lTGVuZ3RoX19pbl9sZW5fXywKLQkgICAgICAgICAgICAgICAgICAgICAgJmZvcmtOYW1lTGVuZ3RoX19pbl9fLCAmZm9ya05hbWVMZW5ndGhfX2luX2xlbl9fKSkKLQkJcmV0dXJuIE5VTEw7Ci0JbmFtZUxlbmd0aF9fbGVuX18gPSBuYW1lTGVuZ3RoX19pbl9sZW5fXzsKLQlmb3JrTmFtZUxlbmd0aF9fbGVuX18gPSBmb3JrTmFtZUxlbmd0aF9faW5fbGVuX187Ci0JX2VyciA9IEZTQ3JlYXRlUmVzb3VyY2VGaWxlKCZwYXJlbnRSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVMZW5ndGhfX2xlbl9fLCBuYW1lTGVuZ3RoX19pbl9fLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlNDYXRhbG9nSW5mbyAqKTAsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmtOYW1lTGVuZ3RoX19sZW5fXywgZm9ya05hbWVMZW5ndGhfX2luX18sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXdSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXdTcGVjKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZTUmVmLCAmbmV3UmVmLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRlNTcGVjLCAmbmV3U3BlYyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZ1I3UjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNSZWYsICZwYXJlbnRSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lTGVuZ3RoX19pbl9fLCAmbmFtZUxlbmd0aF9faW5fbGVuX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmb3JrTmFtZUxlbmd0aF9faW5fXywgJmZvcmtOYW1lTGVuZ3RoX19pbl9sZW5fXykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG5hbWVMZW5ndGhfX2xlbl9fID0gbmFtZUxlbmd0aF9faW5fbGVuX187CisgICAgZm9ya05hbWVMZW5ndGhfX2xlbl9fID0gZm9ya05hbWVMZW5ndGhfX2luX2xlbl9fOworICAgIF9lcnIgPSBGU0NyZWF0ZVJlc291cmNlRmlsZSgmcGFyZW50UmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lTGVuZ3RoX19sZW5fXywgbmFtZUxlbmd0aF9faW5fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZTQ2F0YWxvZ0luZm8gKikwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JrTmFtZUxlbmd0aF9fbGVuX18sIGZvcmtOYW1lTGVuZ3RoX19pbl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmV3UmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmV3U3BlYyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGU1JlZiwgJm5ld1JlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZTU3BlYywgJm5ld1NwZWMpOworICAgIHJldHVybiBfcmVzOwogfQogI2VuZGlmIC8qIF9fTFA2NF9fICovCiAKIHN0YXRpYyBQeU9iamVjdCAqUmVzX0ZTT3BlblJlc291cmNlRmlsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlGU1JlZiByZWY7Ci0JVW5pQ2hhciAqZm9ya05hbWVMZW5ndGhfX2luX187Ci0JVW5pQ2hhckNvdW50IGZvcmtOYW1lTGVuZ3RoX19sZW5fXzsKLQlpbnQgZm9ya05hbWVMZW5ndGhfX2luX2xlbl9fOwotCVNpZ25lZEJ5dGUgcGVybWlzc2lvbnM7Ci0JUmVzRmlsZVJlZk51bSByZWZOdW07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgRlNSZWYgcmVmOworICAgIFVuaUNoYXIgKmZvcmtOYW1lTGVuZ3RoX19pbl9fOworICAgIFVuaUNoYXJDb3VudCBmb3JrTmFtZUxlbmd0aF9fbGVuX187CisgICAgaW50IGZvcmtOYW1lTGVuZ3RoX19pbl9sZW5fXzsKKyAgICBTaWduZWRCeXRlIHBlcm1pc3Npb25zOworICAgIFJlc0ZpbGVSZWZOdW0gcmVmTnVtOwogI2lmbmRlZiBGU09wZW5SZXNvdXJjZUZpbGUKLQlQeU1hY19QUkVDSEVDSyhGU09wZW5SZXNvdXJjZUZpbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEZTT3BlblJlc291cmNlRmlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnUjYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTUmVmLCAmcmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAmZm9ya05hbWVMZW5ndGhfX2luX18sICZmb3JrTmFtZUxlbmd0aF9faW5fbGVuX18sCi0JICAgICAgICAgICAgICAgICAgICAgICZwZXJtaXNzaW9ucykpCi0JCXJldHVybiBOVUxMOwotCWZvcmtOYW1lTGVuZ3RoX19sZW5fXyA9IGZvcmtOYW1lTGVuZ3RoX19pbl9sZW5fXzsKLQlfZXJyID0gRlNPcGVuUmVzb3VyY2VGaWxlKCZyZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JrTmFtZUxlbmd0aF9fbGVuX18sIGZvcmtOYW1lTGVuZ3RoX19pbl9fLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbnMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVmTnVtKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICByZWZOdW0pOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mdSNiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNSZWYsICZyZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmb3JrTmFtZUxlbmd0aF9faW5fXywgJmZvcmtOYW1lTGVuZ3RoX19pbl9sZW5fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBlcm1pc3Npb25zKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZm9ya05hbWVMZW5ndGhfX2xlbl9fID0gZm9ya05hbWVMZW5ndGhfX2luX2xlbl9fOworICAgIF9lcnIgPSBGU09wZW5SZXNvdXJjZUZpbGUoJnJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmtOYW1lTGVuZ3RoX19sZW5fXywgZm9ya05hbWVMZW5ndGhfX2luX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJtaXNzaW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWZOdW0pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlZk51bSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUmVzX0hhbmRsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogCi0JY2hhciAqYnVmOwotCWludCBsZW47Ci0JSGFuZGxlIGg7Ci0JUmVzb3VyY2VPYmplY3QgKnJ2OworICAgIGNoYXIgKmJ1ZjsKKyAgICBpbnQgbGVuOworICAgIEhhbmRsZSBoOworICAgIFJlc291cmNlT2JqZWN0ICpydjsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInMjIiwgJmJ1ZiwgJmxlbikpCi0JICAgICAgICByZXR1cm4gTlVMTDsKLQloID0gTmV3SGFuZGxlKGxlbik7Ci0JaWYgKCBoID09IE5VTEwgKSB7Ci0JICAgICAgICBQeUVycl9Ob01lbW9yeSgpOwotCSAgICAgICAgcmV0dXJuIE5VTEw7Ci0JfQotCUhMb2NrKGgpOwotCW1lbWNweSgqaCwgYnVmLCBsZW4pOwotCUhVbmxvY2soaCk7Ci0JcnYgPSAoUmVzb3VyY2VPYmplY3QgKilSZXNPYmpfTmV3KGgpOwotCXJ2LT5vYl9mcmVlaXQgPSBQeU1hY19BdXRvRGlzcG9zZUhhbmRsZTsKLQlfcmVzID0gKFB5T2JqZWN0ICopcnY7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAicyMiLCAmYnVmLCAmbGVuKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaCA9IE5ld0hhbmRsZShsZW4pOworICAgIGlmICggaCA9PSBOVUxMICkgeworICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgSExvY2soaCk7CisgICAgbWVtY3B5KCpoLCBidWYsIGxlbik7CisgICAgSFVubG9jayhoKTsKKyAgICBydiA9IChSZXNvdXJjZU9iamVjdCAqKVJlc09ial9OZXcoaCk7CisgICAgcnYtPm9iX2ZyZWVpdCA9IFB5TWFjX0F1dG9EaXNwb3NlSGFuZGxlOworICAgIF9yZXMgPSAoUHlPYmplY3QgKilydjsKKyAgICByZXR1cm4gX3JlczsKIAogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgUmVzX21ldGhvZHNbXSA9IHsKLQl7IkNsb3NlUmVzRmlsZSIsIChQeUNGdW5jdGlvbilSZXNfQ2xvc2VSZXNGaWxlLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCByZWZOdW0pIC0+IE5vbmUiKX0sCi0JeyJSZXNFcnJvciIsIChQeUNGdW5jdGlvbilSZXNfUmVzRXJyb3IsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkN1clJlc0ZpbGUiLCAoUHlDRnVuY3Rpb24pUmVzX0N1clJlc0ZpbGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKHNob3J0IF9ydikiKX0sCi0JeyJVc2VSZXNGaWxlIiwgKFB5Q0Z1bmN0aW9uKVJlc19Vc2VSZXNGaWxlLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCByZWZOdW0pIC0+IE5vbmUiKX0sCi0JeyJDb3VudFR5cGVzIiwgKFB5Q0Z1bmN0aW9uKVJlc19Db3VudFR5cGVzLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChzaG9ydCBfcnYpIil9LAotCXsiQ291bnQxVHlwZXMiLCAoUHlDRnVuY3Rpb24pUmVzX0NvdW50MVR5cGVzLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChzaG9ydCBfcnYpIil9LAotCXsiR2V0SW5kVHlwZSIsIChQeUNGdW5jdGlvbilSZXNfR2V0SW5kVHlwZSwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgaW5kZXgpIC0+IChSZXNUeXBlIHRoZVR5cGUpIil9LAotCXsiR2V0MUluZFR5cGUiLCAoUHlDRnVuY3Rpb24pUmVzX0dldDFJbmRUeXBlLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBpbmRleCkgLT4gKFJlc1R5cGUgdGhlVHlwZSkiKX0sCi0JeyJTZXRSZXNMb2FkIiwgKFB5Q0Z1bmN0aW9uKVJlc19TZXRSZXNMb2FkLCAxLAotCSBQeURvY19TVFIoIihCb29sZWFuIGxvYWQpIC0+IE5vbmUiKX0sCi0JeyJDb3VudFJlc291cmNlcyIsIChQeUNGdW5jdGlvbilSZXNfQ291bnRSZXNvdXJjZXMsIDEsCi0JIFB5RG9jX1NUUigiKFJlc1R5cGUgdGhlVHlwZSkgLT4gKHNob3J0IF9ydikiKX0sCi0JeyJDb3VudDFSZXNvdXJjZXMiLCAoUHlDRnVuY3Rpb24pUmVzX0NvdW50MVJlc291cmNlcywgMSwKLQkgUHlEb2NfU1RSKCIoUmVzVHlwZSB0aGVUeXBlKSAtPiAoc2hvcnQgX3J2KSIpfSwKLQl7IkdldEluZFJlc291cmNlIiwgKFB5Q0Z1bmN0aW9uKVJlc19HZXRJbmRSZXNvdXJjZSwgMSwKLQkgUHlEb2NfU1RSKCIoUmVzVHlwZSB0aGVUeXBlLCBzaG9ydCBpbmRleCkgLT4gKEhhbmRsZSBfcnYpIil9LAotCXsiR2V0MUluZFJlc291cmNlIiwgKFB5Q0Z1bmN0aW9uKVJlc19HZXQxSW5kUmVzb3VyY2UsIDEsCi0JIFB5RG9jX1NUUigiKFJlc1R5cGUgdGhlVHlwZSwgc2hvcnQgaW5kZXgpIC0+IChIYW5kbGUgX3J2KSIpfSwKLQl7IkdldFJlc291cmNlIiwgKFB5Q0Z1bmN0aW9uKVJlc19HZXRSZXNvdXJjZSwgMSwKLQkgUHlEb2NfU1RSKCIoUmVzVHlwZSB0aGVUeXBlLCBzaG9ydCB0aGVJRCkgLT4gKEhhbmRsZSBfcnYpIil9LAotCXsiR2V0MVJlc291cmNlIiwgKFB5Q0Z1bmN0aW9uKVJlc19HZXQxUmVzb3VyY2UsIDEsCi0JIFB5RG9jX1NUUigiKFJlc1R5cGUgdGhlVHlwZSwgc2hvcnQgdGhlSUQpIC0+IChIYW5kbGUgX3J2KSIpfSwKLQl7IkdldE5hbWVkUmVzb3VyY2UiLCAoUHlDRnVuY3Rpb24pUmVzX0dldE5hbWVkUmVzb3VyY2UsIDEsCi0JIFB5RG9jX1NUUigiKFJlc1R5cGUgdGhlVHlwZSwgU3RyMjU1IG5hbWUpIC0+IChIYW5kbGUgX3J2KSIpfSwKLQl7IkdldDFOYW1lZFJlc291cmNlIiwgKFB5Q0Z1bmN0aW9uKVJlc19HZXQxTmFtZWRSZXNvdXJjZSwgMSwKLQkgUHlEb2NfU1RSKCIoUmVzVHlwZSB0aGVUeXBlLCBTdHIyNTUgbmFtZSkgLT4gKEhhbmRsZSBfcnYpIil9LAotCXsiVW5pcXVlSUQiLCAoUHlDRnVuY3Rpb24pUmVzX1VuaXF1ZUlELCAxLAotCSBQeURvY19TVFIoIihSZXNUeXBlIHRoZVR5cGUpIC0+IChzaG9ydCBfcnYpIil9LAotCXsiVW5pcXVlMUlEIiwgKFB5Q0Z1bmN0aW9uKVJlc19VbmlxdWUxSUQsIDEsCi0JIFB5RG9jX1NUUigiKFJlc1R5cGUgdGhlVHlwZSkgLT4gKHNob3J0IF9ydikiKX0sCi0JeyJVcGRhdGVSZXNGaWxlIiwgKFB5Q0Z1bmN0aW9uKVJlc19VcGRhdGVSZXNGaWxlLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCByZWZOdW0pIC0+IE5vbmUiKX0sCi0JeyJTZXRSZXNQdXJnZSIsIChQeUNGdW5jdGlvbilSZXNfU2V0UmVzUHVyZ2UsIDEsCi0JIFB5RG9jX1NUUigiKEJvb2xlYW4gaW5zdGFsbCkgLT4gTm9uZSIpfSwKLQl7IkdldFJlc0ZpbGVBdHRycyIsIChQeUNGdW5jdGlvbilSZXNfR2V0UmVzRmlsZUF0dHJzLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCByZWZOdW0pIC0+IChzaG9ydCBfcnYpIil9LAotCXsiU2V0UmVzRmlsZUF0dHJzIiwgKFB5Q0Z1bmN0aW9uKVJlc19TZXRSZXNGaWxlQXR0cnMsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHJlZk51bSwgc2hvcnQgYXR0cnMpIC0+IE5vbmUiKX0sCisgICAgeyJDbG9zZVJlc0ZpbGUiLCAoUHlDRnVuY3Rpb24pUmVzX0Nsb3NlUmVzRmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgcmVmTnVtKSAtPiBOb25lIil9LAorICAgIHsiUmVzRXJyb3IiLCAoUHlDRnVuY3Rpb24pUmVzX1Jlc0Vycm9yLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJDdXJSZXNGaWxlIiwgKFB5Q0Z1bmN0aW9uKVJlc19DdXJSZXNGaWxlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChzaG9ydCBfcnYpIil9LAorICAgIHsiVXNlUmVzRmlsZSIsIChQeUNGdW5jdGlvbilSZXNfVXNlUmVzRmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgcmVmTnVtKSAtPiBOb25lIil9LAorICAgIHsiQ291bnRUeXBlcyIsIChQeUNGdW5jdGlvbilSZXNfQ291bnRUeXBlcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgX3J2KSIpfSwKKyAgICB7IkNvdW50MVR5cGVzIiwgKFB5Q0Z1bmN0aW9uKVJlc19Db3VudDFUeXBlcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgX3J2KSIpfSwKKyAgICB7IkdldEluZFR5cGUiLCAoUHlDRnVuY3Rpb24pUmVzX0dldEluZFR5cGUsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGluZGV4KSAtPiAoUmVzVHlwZSB0aGVUeXBlKSIpfSwKKyAgICB7IkdldDFJbmRUeXBlIiwgKFB5Q0Z1bmN0aW9uKVJlc19HZXQxSW5kVHlwZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgaW5kZXgpIC0+IChSZXNUeXBlIHRoZVR5cGUpIil9LAorICAgIHsiU2V0UmVzTG9hZCIsIChQeUNGdW5jdGlvbilSZXNfU2V0UmVzTG9hZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQm9vbGVhbiBsb2FkKSAtPiBOb25lIil9LAorICAgIHsiQ291bnRSZXNvdXJjZXMiLCAoUHlDRnVuY3Rpb24pUmVzX0NvdW50UmVzb3VyY2VzLCAxLAorICAgICBQeURvY19TVFIoIihSZXNUeXBlIHRoZVR5cGUpIC0+IChzaG9ydCBfcnYpIil9LAorICAgIHsiQ291bnQxUmVzb3VyY2VzIiwgKFB5Q0Z1bmN0aW9uKVJlc19Db3VudDFSZXNvdXJjZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlc1R5cGUgdGhlVHlwZSkgLT4gKHNob3J0IF9ydikiKX0sCisgICAgeyJHZXRJbmRSZXNvdXJjZSIsIChQeUNGdW5jdGlvbilSZXNfR2V0SW5kUmVzb3VyY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlc1R5cGUgdGhlVHlwZSwgc2hvcnQgaW5kZXgpIC0+IChIYW5kbGUgX3J2KSIpfSwKKyAgICB7IkdldDFJbmRSZXNvdXJjZSIsIChQeUNGdW5jdGlvbilSZXNfR2V0MUluZFJlc291cmNlLCAxLAorICAgICBQeURvY19TVFIoIihSZXNUeXBlIHRoZVR5cGUsIHNob3J0IGluZGV4KSAtPiAoSGFuZGxlIF9ydikiKX0sCisgICAgeyJHZXRSZXNvdXJjZSIsIChQeUNGdW5jdGlvbilSZXNfR2V0UmVzb3VyY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlc1R5cGUgdGhlVHlwZSwgc2hvcnQgdGhlSUQpIC0+IChIYW5kbGUgX3J2KSIpfSwKKyAgICB7IkdldDFSZXNvdXJjZSIsIChQeUNGdW5jdGlvbilSZXNfR2V0MVJlc291cmNlLCAxLAorICAgICBQeURvY19TVFIoIihSZXNUeXBlIHRoZVR5cGUsIHNob3J0IHRoZUlEKSAtPiAoSGFuZGxlIF9ydikiKX0sCisgICAgeyJHZXROYW1lZFJlc291cmNlIiwgKFB5Q0Z1bmN0aW9uKVJlc19HZXROYW1lZFJlc291cmNlLCAxLAorICAgICBQeURvY19TVFIoIihSZXNUeXBlIHRoZVR5cGUsIFN0cjI1NSBuYW1lKSAtPiAoSGFuZGxlIF9ydikiKX0sCisgICAgeyJHZXQxTmFtZWRSZXNvdXJjZSIsIChQeUNGdW5jdGlvbilSZXNfR2V0MU5hbWVkUmVzb3VyY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlc1R5cGUgdGhlVHlwZSwgU3RyMjU1IG5hbWUpIC0+IChIYW5kbGUgX3J2KSIpfSwKKyAgICB7IlVuaXF1ZUlEIiwgKFB5Q0Z1bmN0aW9uKVJlc19VbmlxdWVJRCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVzVHlwZSB0aGVUeXBlKSAtPiAoc2hvcnQgX3J2KSIpfSwKKyAgICB7IlVuaXF1ZTFJRCIsIChQeUNGdW5jdGlvbilSZXNfVW5pcXVlMUlELCAxLAorICAgICBQeURvY19TVFIoIihSZXNUeXBlIHRoZVR5cGUpIC0+IChzaG9ydCBfcnYpIil9LAorICAgIHsiVXBkYXRlUmVzRmlsZSIsIChQeUNGdW5jdGlvbilSZXNfVXBkYXRlUmVzRmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgcmVmTnVtKSAtPiBOb25lIil9LAorICAgIHsiU2V0UmVzUHVyZ2UiLCAoUHlDRnVuY3Rpb24pUmVzX1NldFJlc1B1cmdlLCAxLAorICAgICBQeURvY19TVFIoIihCb29sZWFuIGluc3RhbGwpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRSZXNGaWxlQXR0cnMiLCAoUHlDRnVuY3Rpb24pUmVzX0dldFJlc0ZpbGVBdHRycywgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgcmVmTnVtKSAtPiAoc2hvcnQgX3J2KSIpfSwKKyAgICB7IlNldFJlc0ZpbGVBdHRycyIsIChQeUNGdW5jdGlvbilSZXNfU2V0UmVzRmlsZUF0dHJzLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCByZWZOdW0sIHNob3J0IGF0dHJzKSAtPiBOb25lIil9LAogI2lmbmRlZiBfX0xQNjRfXwotCXsiT3BlblJGUGVybSIsIChQeUNGdW5jdGlvbilSZXNfT3BlblJGUGVybSwgMSwKLQkgUHlEb2NfU1RSKCIoU3RyMjU1IGZpbGVOYW1lLCBzaG9ydCB2UmVmTnVtLCBTaWduZWRCeXRlIHBlcm1pc3Npb24pIC0+IChzaG9ydCBfcnYpIil9LAotCXsiSE9wZW5SZXNGaWxlIiwgKFB5Q0Z1bmN0aW9uKVJlc19IT3BlblJlc0ZpbGUsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHZSZWZOdW0sIGxvbmcgZGlySUQsIFN0cjI1NSBmaWxlTmFtZSwgU2lnbmVkQnl0ZSBwZXJtaXNzaW9uKSAtPiAoc2hvcnQgX3J2KSIpfSwKLQl7IkhDcmVhdGVSZXNGaWxlIiwgKFB5Q0Z1bmN0aW9uKVJlc19IQ3JlYXRlUmVzRmlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgdlJlZk51bSwgbG9uZyBkaXJJRCwgU3RyMjU1IGZpbGVOYW1lKSAtPiBOb25lIil9LAotCXsiRlNwT3BlblJlc0ZpbGUiLCAoUHlDRnVuY3Rpb24pUmVzX0ZTcE9wZW5SZXNGaWxlLCAxLAotCSBQeURvY19TVFIoIihGU1NwZWMgc3BlYywgU2lnbmVkQnl0ZSBwZXJtaXNzaW9uKSAtPiAoc2hvcnQgX3J2KSIpfSwKLQl7IkZTcENyZWF0ZVJlc0ZpbGUiLCAoUHlDRnVuY3Rpb24pUmVzX0ZTcENyZWF0ZVJlc0ZpbGUsIDEsCi0JIFB5RG9jX1NUUigiKEZTU3BlYyBzcGVjLCBPU1R5cGUgY3JlYXRvciwgT1NUeXBlIGZpbGVUeXBlLCBTY3JpcHRDb2RlIHNjcmlwdFRhZykgLT4gTm9uZSIpfSwKKyAgICB7Ik9wZW5SRlBlcm0iLCAoUHlDRnVuY3Rpb24pUmVzX09wZW5SRlBlcm0sIDEsCisgICAgIFB5RG9jX1NUUigiKFN0cjI1NSBmaWxlTmFtZSwgc2hvcnQgdlJlZk51bSwgU2lnbmVkQnl0ZSBwZXJtaXNzaW9uKSAtPiAoc2hvcnQgX3J2KSIpfSwKKyAgICB7IkhPcGVuUmVzRmlsZSIsIChQeUNGdW5jdGlvbilSZXNfSE9wZW5SZXNGaWxlLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCB2UmVmTnVtLCBsb25nIGRpcklELCBTdHIyNTUgZmlsZU5hbWUsIFNpZ25lZEJ5dGUgcGVybWlzc2lvbikgLT4gKHNob3J0IF9ydikiKX0sCisgICAgeyJIQ3JlYXRlUmVzRmlsZSIsIChQeUNGdW5jdGlvbilSZXNfSENyZWF0ZVJlc0ZpbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IHZSZWZOdW0sIGxvbmcgZGlySUQsIFN0cjI1NSBmaWxlTmFtZSkgLT4gTm9uZSIpfSwKKyAgICB7IkZTcE9wZW5SZXNGaWxlIiwgKFB5Q0Z1bmN0aW9uKVJlc19GU3BPcGVuUmVzRmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRlNTcGVjIHNwZWMsIFNpZ25lZEJ5dGUgcGVybWlzc2lvbikgLT4gKHNob3J0IF9ydikiKX0sCisgICAgeyJGU3BDcmVhdGVSZXNGaWxlIiwgKFB5Q0Z1bmN0aW9uKVJlc19GU3BDcmVhdGVSZXNGaWxlLCAxLAorICAgICBQeURvY19TVFIoIihGU1NwZWMgc3BlYywgT1NUeXBlIGNyZWF0b3IsIE9TVHlwZSBmaWxlVHlwZSwgU2NyaXB0Q29kZSBzY3JpcHRUYWcpIC0+IE5vbmUiKX0sCiAjZW5kaWYgLyogIV9fTFA2NF9fICovCi0JeyJJbnNlcnRSZXNvdXJjZUZpbGUiLCAoUHlDRnVuY3Rpb24pUmVzX0luc2VydFJlc291cmNlRmlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IHJlZk51bSwgUnNyY0NoYWluTG9jYXRpb24gd2hlcmUpIC0+IE5vbmUiKX0sCi0JeyJEZXRhY2hSZXNvdXJjZUZpbGUiLCAoUHlDRnVuY3Rpb24pUmVzX0RldGFjaFJlc291cmNlRmlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IHJlZk51bSkgLT4gTm9uZSIpfSwKKyAgICB7Ikluc2VydFJlc291cmNlRmlsZSIsIChQeUNGdW5jdGlvbilSZXNfSW5zZXJ0UmVzb3VyY2VGaWxlLCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgcmVmTnVtLCBSc3JjQ2hhaW5Mb2NhdGlvbiB3aGVyZSkgLT4gTm9uZSIpfSwKKyAgICB7IkRldGFjaFJlc291cmNlRmlsZSIsIChQeUNGdW5jdGlvbilSZXNfRGV0YWNoUmVzb3VyY2VGaWxlLCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgcmVmTnVtKSAtPiBOb25lIil9LAogI2lmbmRlZiBfX0xQNjRfXwotCXsiRlNwUmVzb3VyY2VGaWxlQWxyZWFkeU9wZW4iLCAoUHlDRnVuY3Rpb24pUmVzX0ZTcFJlc291cmNlRmlsZUFscmVhZHlPcGVuLCAxLAotCSBQeURvY19TVFIoIihGU1NwZWMgcmVzb3VyY2VGaWxlKSAtPiAoQm9vbGVhbiBfcnYsIEJvb2xlYW4gaW5DaGFpbiwgU0ludDE2IHJlZk51bSkiKX0sCi0JeyJGU3BPcGVuT3JwaGFuUmVzRmlsZSIsIChQeUNGdW5jdGlvbilSZXNfRlNwT3Blbk9ycGhhblJlc0ZpbGUsIDEsCi0JIFB5RG9jX1NUUigiKEZTU3BlYyBzcGVjLCBTaWduZWRCeXRlIHBlcm1pc3Npb24pIC0+IChTSW50MTYgcmVmTnVtKSIpfSwKLQl7IkdldFRvcFJlc291cmNlRmlsZSIsIChQeUNGdW5jdGlvbilSZXNfR2V0VG9wUmVzb3VyY2VGaWxlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChTSW50MTYgcmVmTnVtKSIpfSwKLQl7IkdldE5leHRSZXNvdXJjZUZpbGUiLCAoUHlDRnVuY3Rpb24pUmVzX0dldE5leHRSZXNvdXJjZUZpbGUsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiBjdXJSZWZOdW0pIC0+IChTSW50MTYgbmV4dFJlZk51bSkiKX0sCisgICAgeyJGU3BSZXNvdXJjZUZpbGVBbHJlYWR5T3BlbiIsIChQeUNGdW5jdGlvbilSZXNfRlNwUmVzb3VyY2VGaWxlQWxyZWFkeU9wZW4sIDEsCisgICAgIFB5RG9jX1NUUigiKEZTU3BlYyByZXNvdXJjZUZpbGUpIC0+IChCb29sZWFuIF9ydiwgQm9vbGVhbiBpbkNoYWluLCBTSW50MTYgcmVmTnVtKSIpfSwKKyAgICB7IkZTcE9wZW5PcnBoYW5SZXNGaWxlIiwgKFB5Q0Z1bmN0aW9uKVJlc19GU3BPcGVuT3JwaGFuUmVzRmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRlNTcGVjIHNwZWMsIFNpZ25lZEJ5dGUgcGVybWlzc2lvbikgLT4gKFNJbnQxNiByZWZOdW0pIil9LAorICAgIHsiR2V0VG9wUmVzb3VyY2VGaWxlIiwgKFB5Q0Z1bmN0aW9uKVJlc19HZXRUb3BSZXNvdXJjZUZpbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFNJbnQxNiByZWZOdW0pIil9LAorICAgIHsiR2V0TmV4dFJlc291cmNlRmlsZSIsIChQeUNGdW5jdGlvbilSZXNfR2V0TmV4dFJlc291cmNlRmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IGN1clJlZk51bSkgLT4gKFNJbnQxNiBuZXh0UmVmTnVtKSIpfSwKICNlbmRpZiAvKiBfX0xQNjRfXyAqLwotCXsiRlNPcGVuUmVzRmlsZSIsIChQeUNGdW5jdGlvbilSZXNfRlNPcGVuUmVzRmlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoRlNSZWYgcmVmLCBTaWduZWRCeXRlIHBlcm1pc3Npb24pIC0+IChzaG9ydCBfcnYpIil9LAorICAgIHsiRlNPcGVuUmVzRmlsZSIsIChQeUNGdW5jdGlvbilSZXNfRlNPcGVuUmVzRmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRlNSZWYgcmVmLCBTaWduZWRCeXRlIHBlcm1pc3Npb24pIC0+IChzaG9ydCBfcnYpIil9LAogI2lmbmRlZiBfX0xQNjRfXwotCXsiRlNDcmVhdGVSZXNGaWxlIiwgKFB5Q0Z1bmN0aW9uKVJlc19GU0NyZWF0ZVJlc0ZpbGUsIDEsCi0JIFB5RG9jX1NUUigiKEZTUmVmIHBhcmVudFJlZiwgQnVmZmVyIG5hbWVMZW5ndGgpIC0+IChGU1JlZiBuZXdSZWYsIEZTU3BlYyBuZXdTcGVjKSIpfSwKLQl7IkZTUmVzb3VyY2VGaWxlQWxyZWFkeU9wZW4iLCAoUHlDRnVuY3Rpb24pUmVzX0ZTUmVzb3VyY2VGaWxlQWxyZWFkeU9wZW4sIDEsCi0JIFB5RG9jX1NUUigiKEZTUmVmIHJlc291cmNlRmlsZVJlZikgLT4gKEJvb2xlYW4gX3J2LCBCb29sZWFuIGluQ2hhaW4sIFNJbnQxNiByZWZOdW0pIil9LAotCXsiRlNDcmVhdGVSZXNvdXJjZUZpbGUiLCAoUHlDRnVuY3Rpb24pUmVzX0ZTQ3JlYXRlUmVzb3VyY2VGaWxlLCAxLAotCSBQeURvY19TVFIoIihGU1JlZiBwYXJlbnRSZWYsIEJ1ZmZlciBuYW1lTGVuZ3RoLCBCdWZmZXIgZm9ya05hbWVMZW5ndGgpIC0+IChGU1JlZiBuZXdSZWYsIEZTU3BlYyBuZXdTcGVjKSIpfSwKKyAgICB7IkZTQ3JlYXRlUmVzRmlsZSIsIChQeUNGdW5jdGlvbilSZXNfRlNDcmVhdGVSZXNGaWxlLCAxLAorICAgICBQeURvY19TVFIoIihGU1JlZiBwYXJlbnRSZWYsIEJ1ZmZlciBuYW1lTGVuZ3RoKSAtPiAoRlNSZWYgbmV3UmVmLCBGU1NwZWMgbmV3U3BlYykiKX0sCisgICAgeyJGU1Jlc291cmNlRmlsZUFscmVhZHlPcGVuIiwgKFB5Q0Z1bmN0aW9uKVJlc19GU1Jlc291cmNlRmlsZUFscmVhZHlPcGVuLCAxLAorICAgICBQeURvY19TVFIoIihGU1JlZiByZXNvdXJjZUZpbGVSZWYpIC0+IChCb29sZWFuIF9ydiwgQm9vbGVhbiBpbkNoYWluLCBTSW50MTYgcmVmTnVtKSIpfSwKKyAgICB7IkZTQ3JlYXRlUmVzb3VyY2VGaWxlIiwgKFB5Q0Z1bmN0aW9uKVJlc19GU0NyZWF0ZVJlc291cmNlRmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRlNSZWYgcGFyZW50UmVmLCBCdWZmZXIgbmFtZUxlbmd0aCwgQnVmZmVyIGZvcmtOYW1lTGVuZ3RoKSAtPiAoRlNSZWYgbmV3UmVmLCBGU1NwZWMgbmV3U3BlYykiKX0sCiAjZW5kaWYgLyogX19MUDY0X18gKi8KLQl7IkZTT3BlblJlc291cmNlRmlsZSIsIChQeUNGdW5jdGlvbilSZXNfRlNPcGVuUmVzb3VyY2VGaWxlLCAxLAotCSBQeURvY19TVFIoIihGU1JlZiByZWYsIEJ1ZmZlciBmb3JrTmFtZUxlbmd0aCwgU2lnbmVkQnl0ZSBwZXJtaXNzaW9ucykgLT4gKFNJbnQxNiByZWZOdW0pIil9LAotCXsiSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKVJlc19IYW5kbGUsIDEsCi0JIFB5RG9jX1NUUigiQ29udmVydCBhIHN0cmluZyB0byBhIEhhbmRsZSBvYmplY3QuXG5cblJlc291cmNlKCkgYW5kIEhhbmRsZSgpIGFyZSB2ZXJ5IHNpbWlsYXIsIGJ1dCBvYmplY3RzIGNyZWF0ZWQgd2l0aCBIYW5kbGUoKSBhcmVcbmJ5IGRlZmF1bHQgYXV0b21hdGljYWxseSBEaXNwb3NlSGFuZGxlKClkIHVwb24gb2JqZWN0IGNsZWFudXAuIFVzZSBBdXRvRGlzcG9zZSgpXG50byBjaGFuZ2UgdGhpcy5cbiIpfSwKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7IkZTT3BlblJlc291cmNlRmlsZSIsIChQeUNGdW5jdGlvbilSZXNfRlNPcGVuUmVzb3VyY2VGaWxlLCAxLAorICAgICBQeURvY19TVFIoIihGU1JlZiByZWYsIEJ1ZmZlciBmb3JrTmFtZUxlbmd0aCwgU2lnbmVkQnl0ZSBwZXJtaXNzaW9ucykgLT4gKFNJbnQxNiByZWZOdW0pIil9LAorICAgIHsiSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKVJlc19IYW5kbGUsIDEsCisgICAgIFB5RG9jX1NUUigiQ29udmVydCBhIHN0cmluZyB0byBhIEhhbmRsZSBvYmplY3QuXG5cblJlc291cmNlKCkgYW5kIEhhbmRsZSgpIGFyZSB2ZXJ5IHNpbWlsYXIsIGJ1dCBvYmplY3RzIGNyZWF0ZWQgd2l0aCBIYW5kbGUoKSBhcmVcbmJ5IGRlZmF1bHQgYXV0b21hdGljYWxseSBEaXNwb3NlSGFuZGxlKClkIHVwb24gb2JqZWN0IGNsZWFudXAuIFVzZSBBdXRvRGlzcG9zZSgpXG50byBjaGFuZ2UgdGhpcy5cbiIpfSwKKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKIApAQCAtMTY5Niw2NCArMTY5Niw2NCBAQAogLyogQWx0ZXJuYXRpdmUgdmVyc2lvbiBvZiBSZXNPYmpfTmV3LCB3aGljaCByZXR1cm5zIE5vbmUgZm9yIG51bGwgYXJndW1lbnQgKi8KIFB5T2JqZWN0ICpPcHRSZXNPYmpfTmV3KEhhbmRsZSBpdHNlbGYpCiB7Ci0gICAgICAgIGlmIChpdHNlbGYgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gUHlfTm9uZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gUmVzT2JqX05ldyhpdHNlbGYpOworICAgIGlmIChpdHNlbGYgPT0gTlVMTCkgeworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIHJldHVybiBQeV9Ob25lOworICAgIH0KKyAgICByZXR1cm4gUmVzT2JqX05ldyhpdHNlbGYpOwogfQogCiBpbnQgT3B0UmVzT2JqX0NvbnZlcnQoUHlPYmplY3QgKnYsIEhhbmRsZSAqcF9pdHNlbGYpCiB7Ci0gICAgICAgIFB5T2JqZWN0ICp0bXA7CisgICAgUHlPYmplY3QgKnRtcDsKIAotICAgICAgICBpZiAoIHYgPT0gUHlfTm9uZSApIHsKLSAgICAgICAgICAgICAgICAqcF9pdHNlbGYgPSBOVUxMOwotICAgICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0gICAgICAgIGlmIChSZXNPYmpfQ2hlY2sodikpCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICAqcF9pdHNlbGYgPSAoKFJlc291cmNlT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKLSAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotICAgICAgICAvKiBJZiBpdCBpc24ndCBhIHJlc291cmNlIHlldCBzZWUgd2hldGhlciBpdCBpcyBjb252ZXJ0aWJsZSAqLwotICAgICAgICBpZiAoICh0bXA9UHlPYmplY3RfQ2FsbE1ldGhvZCh2LCAiYXNfUmVzb3VyY2UiLCAiIikpICkgewotICAgICAgICAgICAgICAgICpwX2l0c2VsZiA9ICgoUmVzb3VyY2VPYmplY3QgKil0bXApLT5vYl9pdHNlbGY7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKHRtcCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIH0KLSAgICAgICAgUHlFcnJfQ2xlYXIoKTsKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIlJlc291cmNlIHJlcXVpcmVkIik7Ci0gICAgICAgIHJldHVybiAwOworICAgIGlmICggdiA9PSBQeV9Ob25lICkgeworICAgICAgICAqcF9pdHNlbGYgPSBOVUxMOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgaWYgKFJlc09ial9DaGVjayh2KSkKKyAgICB7CisgICAgICAgICpwX2l0c2VsZiA9ICgoUmVzb3VyY2VPYmplY3QgKil2KS0+b2JfaXRzZWxmOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgLyogSWYgaXQgaXNuJ3QgYSByZXNvdXJjZSB5ZXQgc2VlIHdoZXRoZXIgaXQgaXMgY29udmVydGlibGUgKi8KKyAgICBpZiAoICh0bXA9UHlPYmplY3RfQ2FsbE1ldGhvZCh2LCAiYXNfUmVzb3VyY2UiLCAiIikpICkgeworICAgICAgICAqcF9pdHNlbGYgPSAoKFJlc291cmNlT2JqZWN0ICopdG1wKS0+b2JfaXRzZWxmOworICAgICAgICBQeV9ERUNSRUYodG1wKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIFB5RXJyX0NsZWFyKCk7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIlJlc291cmNlIHJlcXVpcmVkIik7CisgICAgcmV0dXJuIDA7CiB9CiAKIAogdm9pZCBpbml0X1Jlcyh2b2lkKQogewotCVB5T2JqZWN0ICptOwotCVB5T2JqZWN0ICpkOworICAgIFB5T2JqZWN0ICptOworICAgIFB5T2JqZWN0ICpkOwogCiAKIAotCSAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoSGFuZGxlLCBSZXNPYmpfTmV3KTsKLQkgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChIYW5kbGUsIFJlc09ial9Db252ZXJ0KTsKLQkgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKEhhbmRsZSwgT3B0UmVzT2JqX05ldyk7Ci0JICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoSGFuZGxlLCBPcHRSZXNPYmpfQ29udmVydCk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKEhhbmRsZSwgUmVzT2JqX05ldyk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChIYW5kbGUsIFJlc09ial9Db252ZXJ0KTsKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoSGFuZGxlLCBPcHRSZXNPYmpfTmV3KTsKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKEhhbmRsZSwgT3B0UmVzT2JqX0NvbnZlcnQpOwogCiAKLQltID0gUHlfSW5pdE1vZHVsZSgiX1JlcyIsIFJlc19tZXRob2RzKTsKLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQlSZXNfRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOwotCWlmIChSZXNfRXJyb3IgPT0gTlVMTCB8fAotCSAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRXJyb3IiLCBSZXNfRXJyb3IpICE9IDApCi0JCXJldHVybjsKLQlSZXNvdXJjZV9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmUmVzb3VyY2VfVHlwZSkgPCAwKSByZXR1cm47Ci0JUHlfSU5DUkVGKCZSZXNvdXJjZV9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIlJlc291cmNlIiwgKFB5T2JqZWN0ICopJlJlc291cmNlX1R5cGUpOwotCS8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLwotCVB5X0lOQ1JFRigmUmVzb3VyY2VfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJSZXNvdXJjZVR5cGUiLCAoUHlPYmplY3QgKikmUmVzb3VyY2VfVHlwZSk7CisgICAgbSA9IFB5X0luaXRNb2R1bGUoIl9SZXMiLCBSZXNfbWV0aG9kcyk7CisgICAgZCA9IFB5TW9kdWxlX0dldERpY3QobSk7CisgICAgUmVzX0Vycm9yID0gUHlNYWNfR2V0T1NFcnJFeGNlcHRpb24oKTsKKyAgICBpZiAoUmVzX0Vycm9yID09IE5VTEwgfHwKKyAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVycm9yIiwgUmVzX0Vycm9yKSAhPSAwKQorICAgICAgICByZXR1cm47CisgICAgUmVzb3VyY2VfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJlJlc291cmNlX1R5cGUpIDwgMCkgcmV0dXJuOworICAgIFB5X0lOQ1JFRigmUmVzb3VyY2VfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJSZXNvdXJjZSIsIChQeU9iamVjdCAqKSZSZXNvdXJjZV9UeXBlKTsKKyAgICAvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KKyAgICBQeV9JTkNSRUYoJlJlc291cmNlX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiUmVzb3VyY2VUeXBlIiwgKFB5T2JqZWN0ICopJlJlc291cmNlX1R5cGUpOwogfQogCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT0gRW5kIG1vZHVsZSBfUmVzID09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL3NjcmFwL19TY3JhcG1vZHVsZS5jIGIvTWFjL01vZHVsZXMvc2NyYXAvX1NjcmFwbW9kdWxlLmMKaW5kZXggMTRlM2ZkMi4uZjI0ZWQ4YiAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvc2NyYXAvX1NjcmFwbW9kdWxlLmMKKysrIGIvTWFjL01vZHVsZXMvc2NyYXAvX1NjcmFwbW9kdWxlLmMKQEAgLTEwLDkgKzEwLDkgQEAKIAogLyogTWFjcm8gdG8gdGVzdCB3aGV0aGVyIGEgd2Vhay1sb2FkZWQgQ0ZNIGZ1bmN0aW9uIGV4aXN0cyAqLwogI2RlZmluZSBQeU1hY19QUkVDSEVDSyhydG4pIGRvIHsgaWYgKCAmcnRuID09IE5VTEwgKSAge1wKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsIFwKLSAgICAgICAgIk5vdCBhdmFpbGFibGUgaW4gdGhpcyBzaGFyZWQgbGlicmFyeS9PUyB2ZXJzaW9uIik7IFwKLSAgICAgICAgcmV0dXJuIE5VTEw7IFwKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgXAorICAgICJOb3QgYXZhaWxhYmxlIGluIHRoaXMgc2hhcmVkIGxpYnJhcnkvT1MgdmVyc2lvbiIpOyBcCisgICAgcmV0dXJuIE5VTEw7IFwKICAgICB9fSB3aGlsZSgwKQogCiAKQEAgLTI3LDE5OSArMjcsMTk5IEBACiAjZGVmaW5lIFNjcmFwT2JqX0NoZWNrKHgpICgoeCktPm9iX3R5cGUgPT0gJlNjcmFwX1R5cGUgfHwgUHlPYmplY3RfVHlwZUNoZWNrKCh4KSwgJlNjcmFwX1R5cGUpKQogCiB0eXBlZGVmIHN0cnVjdCBTY3JhcE9iamVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCVNjcmFwUmVmIG9iX2l0c2VsZjsKKyAgICBQeU9iamVjdF9IRUFECisgICAgU2NyYXBSZWYgb2JfaXRzZWxmOwogfSBTY3JhcE9iamVjdDsKIAogUHlPYmplY3QgKlNjcmFwT2JqX05ldyhTY3JhcFJlZiBpdHNlbGYpCiB7Ci0JU2NyYXBPYmplY3QgKml0OwotCWl0ID0gUHlPYmplY3RfTkVXKFNjcmFwT2JqZWN0LCAmU2NyYXBfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOwotCWl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIFNjcmFwT2JqZWN0ICppdDsKKyAgICBpdCA9IFB5T2JqZWN0X05FVyhTY3JhcE9iamVjdCwgJlNjcmFwX1R5cGUpOworICAgIGlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICBpdC0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIHJldHVybiAoUHlPYmplY3QgKilpdDsKIH0KIGludCBTY3JhcE9ial9Db252ZXJ0KFB5T2JqZWN0ICp2LCBTY3JhcFJlZiAqcF9pdHNlbGYpCiB7Ci0JaWYgKCFTY3JhcE9ial9DaGVjayh2KSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJTY3JhcCByZXF1aXJlZCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JKnBfaXRzZWxmID0gKChTY3JhcE9iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0JcmV0dXJuIDE7CisgICAgaWYgKCFTY3JhcE9ial9DaGVjayh2KSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJTY3JhcCByZXF1aXJlZCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgKnBfaXRzZWxmID0gKChTY3JhcE9iamVjdCAqKXYpLT5vYl9pdHNlbGY7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyB2b2lkIFNjcmFwT2JqX2RlYWxsb2MoU2NyYXBPYmplY3QgKnNlbGYpCiB7Ci0JLyogQ2xlYW51cCBvZiBzZWxmLT5vYl9pdHNlbGYgZ29lcyBoZXJlICovCi0Jc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKKyAgICAvKiBDbGVhbnVwIG9mIHNlbGYtPm9iX2l0c2VsZiBnb2VzIGhlcmUgKi8KKyAgICBzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlNjcmFwT2JqX0dldFNjcmFwRmxhdm9yRmxhZ3MoU2NyYXBPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JU2NyYXBGbGF2b3JUeXBlIGZsYXZvclR5cGU7Ci0JU2NyYXBGbGF2b3JGbGFncyBmbGF2b3JGbGFnczsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmZsYXZvclR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0U2NyYXBGbGF2b3JGbGFncyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYXZvclR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYXZvckZsYWdzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBmbGF2b3JGbGFncyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgU2NyYXBGbGF2b3JUeXBlIGZsYXZvclR5cGU7CisgICAgU2NyYXBGbGF2b3JGbGFncyBmbGF2b3JGbGFnczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmZsYXZvclR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0U2NyYXBGbGF2b3JGbGFncyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYXZvclR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYXZvckZsYWdzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmbGF2b3JGbGFncyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqU2NyYXBPYmpfR2V0U2NyYXBGbGF2b3JTaXplKFNjcmFwT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVNjcmFwRmxhdm9yVHlwZSBmbGF2b3JUeXBlOwotCVNpemUgYnl0ZUNvdW50OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZmxhdm9yVHlwZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRTY3JhcEZsYXZvclNpemUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYXZvclR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmYnl0ZUNvdW50KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBieXRlQ291bnQpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFNjcmFwRmxhdm9yVHlwZSBmbGF2b3JUeXBlOworICAgIFNpemUgYnl0ZUNvdW50OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZmxhdm9yVHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRTY3JhcEZsYXZvclNpemUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYXZvclR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnl0ZUNvdW50KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBieXRlQ291bnQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlNjcmFwT2JqX0dldFNjcmFwRmxhdm9yRGF0YShTY3JhcE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlTY3JhcEZsYXZvclR5cGUgZmxhdm9yVHlwZTsKLQlTaXplIGJ5dGVDb3VudDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBTY3JhcEZsYXZvclR5cGUgZmxhdm9yVHlwZTsKKyAgICBTaXplIGJ5dGVDb3VudDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZmxhdm9yVHlwZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRTY3JhcEZsYXZvclNpemUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYXZvclR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmYnl0ZUNvdW50KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCAoaW50KWJ5dGVDb3VudCk7Ci0JaWYgKCBfcmVzID09IE5VTEwgKSByZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0U2NyYXBGbGF2b3JEYXRhKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBmbGF2b3JUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ5dGVDb3VudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FTX1NUUklORyhfcmVzKSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHsKLQkJUHlfWERFQ1JFRihfcmVzKTsKLQkJcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCX0KLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmZsYXZvclR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0U2NyYXBGbGF2b3JTaXplKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGF2b3JUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ5dGVDb3VudCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgKGludClieXRlQ291bnQpOworICAgIGlmICggX3JlcyA9PSBOVUxMICkgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldFNjcmFwRmxhdm9yRGF0YShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhdm9yVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZieXRlQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcoX3JlcykpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSB7CisgICAgICAgIFB5X1hERUNSRUYoX3Jlcyk7CisgICAgICAgIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICB9CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqU2NyYXBPYmpfUHV0U2NyYXBGbGF2b3IoU2NyYXBPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JU2NyYXBGbGF2b3JUeXBlIGZsYXZvclR5cGU7Ci0JU2NyYXBGbGF2b3JGbGFncyBmbGF2b3JGbGFnczsKLQljaGFyICpmbGF2b3JEYXRhX19pbl9fOwotCWludCBmbGF2b3JEYXRhX19pbl9sZW5fXzsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJktzIyIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmZsYXZvclR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGF2b3JGbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYXZvckRhdGFfX2luX18sICZmbGF2b3JEYXRhX19pbl9sZW5fXykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBQdXRTY3JhcEZsYXZvcihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICBmbGF2b3JUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICBmbGF2b3JGbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgKFNpemUpZmxhdm9yRGF0YV9faW5fbGVuX18sCi0JICAgICAgICAgICAgICAgICAgICAgIGZsYXZvckRhdGFfX2luX18pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFNjcmFwRmxhdm9yVHlwZSBmbGF2b3JUeXBlOworICAgIFNjcmFwRmxhdm9yRmxhZ3MgZmxhdm9yRmxhZ3M7CisgICAgY2hhciAqZmxhdm9yRGF0YV9faW5fXzsKKyAgICBpbnQgZmxhdm9yRGF0YV9faW5fbGVuX187CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZLcyMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZmbGF2b3JUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhdm9yRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGF2b3JEYXRhX19pbl9fLCAmZmxhdm9yRGF0YV9faW5fbGVuX18pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUHV0U2NyYXBGbGF2b3IoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhdm9yVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhdm9yRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChTaXplKWZsYXZvckRhdGFfX2luX2xlbl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmbGF2b3JEYXRhX19pbl9fKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpTY3JhcE9ial9HZXRTY3JhcEZsYXZvckNvdW50KFNjcmFwT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVVJbnQzMiBpbmZvQ291bnQ7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRTY3JhcEZsYXZvckNvdW50KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZm9Db3VudCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgaW5mb0NvdW50KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBVSW50MzIgaW5mb0NvdW50OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0U2NyYXBGbGF2b3JDb3VudChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmZvQ291bnQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9Db3VudCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqU2NyYXBPYmpfR2V0U2NyYXBGbGF2b3JJbmZvTGlzdChTY3JhcE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUHlPYmplY3QgKml0ZW07Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MzIgaW5mb0NvdW50OwotCVNjcmFwRmxhdm9ySW5mbyAqaW5mb2xpc3QgPSBOVUxMOwotCWludCBpOwotCQotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0U2NyYXBGbGF2b3JDb3VudChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmZvQ291bnQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JaWYgKGluZm9Db3VudCA9PSAwKSByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiW10iKTsKLQkKLQlpZiAoKGluZm9saXN0ID0gKFNjcmFwRmxhdm9ySW5mbyAqKW1hbGxvYyhpbmZvQ291bnQqc2l6ZW9mKFNjcmFwRmxhdm9ySW5mbykpKSA9PSBOVUxMICkKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JCi0JX2VyciA9IEdldFNjcmFwRmxhdm9ySW5mb0xpc3QoX3NlbGYtPm9iX2l0c2VsZiwgJmluZm9Db3VudCwgaW5mb2xpc3QpOwotCWlmIChfZXJyICE9IG5vRXJyKSB7Ci0JCWZyZWUoaW5mb2xpc3QpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKChfcmVzID0gUHlMaXN0X05ldyhpbmZvQ291bnQpKSA9PSBOVUxMICkgewotCQlmcmVlKGluZm9saXN0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWZvcihpPTA7IGk8aW5mb0NvdW50OyBpKyspIHsKLQkJaXRlbSA9IFB5X0J1aWxkVmFsdWUoIk8mbCIsIFB5TWFjX0J1aWxkT1NUeXBlLCBpbmZvbGlzdFtpXS5mbGF2b3JUeXBlLAotCQkJaW5mb2xpc3RbaV0uZmxhdm9yRmxhZ3MpOwotCQlpZiAoICFpdGVtIHx8IFB5TGlzdF9TZXRJdGVtKF9yZXMsIGksIGl0ZW0pIDwgMCApIHsKLQkJCVB5X0RFQ1JFRihfcmVzKTsKLQkJCWZyZWUoaW5mb2xpc3QpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9Ci0JZnJlZShpbmZvbGlzdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICppdGVtOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVUludDMyIGluZm9Db3VudDsKKyAgICBTY3JhcEZsYXZvckluZm8gKmluZm9saXN0ID0gTlVMTDsKKyAgICBpbnQgaTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0U2NyYXBGbGF2b3JDb3VudChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmZvQ291bnQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgaWYgKGluZm9Db3VudCA9PSAwKSByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiW10iKTsKKworICAgIGlmICgoaW5mb2xpc3QgPSAoU2NyYXBGbGF2b3JJbmZvICopbWFsbG9jKGluZm9Db3VudCpzaXplb2YoU2NyYXBGbGF2b3JJbmZvKSkpID09IE5VTEwgKQorICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKworICAgIF9lcnIgPSBHZXRTY3JhcEZsYXZvckluZm9MaXN0KF9zZWxmLT5vYl9pdHNlbGYsICZpbmZvQ291bnQsIGluZm9saXN0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgeworICAgICAgICBmcmVlKGluZm9saXN0KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmICgoX3JlcyA9IFB5TGlzdF9OZXcoaW5mb0NvdW50KSkgPT0gTlVMTCApIHsKKyAgICAgICAgZnJlZShpbmZvbGlzdCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBmb3IoaT0wOyBpPGluZm9Db3VudDsgaSsrKSB7CisgICAgICAgIGl0ZW0gPSBQeV9CdWlsZFZhbHVlKCJPJmwiLCBQeU1hY19CdWlsZE9TVHlwZSwgaW5mb2xpc3RbaV0uZmxhdm9yVHlwZSwKKyAgICAgICAgICAgIGluZm9saXN0W2ldLmZsYXZvckZsYWdzKTsKKyAgICAgICAgaWYgKCAhaXRlbSB8fCBQeUxpc3RfU2V0SXRlbShfcmVzLCBpLCBpdGVtKSA8IDAgKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoX3Jlcyk7CisgICAgICAgICAgICBmcmVlKGluZm9saXN0KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorICAgIGZyZWUoaW5mb2xpc3QpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgU2NyYXBPYmpfbWV0aG9kc1tdID0gewotCXsiR2V0U2NyYXBGbGF2b3JGbGFncyIsIChQeUNGdW5jdGlvbilTY3JhcE9ial9HZXRTY3JhcEZsYXZvckZsYWdzLCAxLAotCSBQeURvY19TVFIoIihTY3JhcEZsYXZvclR5cGUgZmxhdm9yVHlwZSkgLT4gKFNjcmFwRmxhdm9yRmxhZ3MgZmxhdm9yRmxhZ3MpIil9LAotCXsiR2V0U2NyYXBGbGF2b3JTaXplIiwgKFB5Q0Z1bmN0aW9uKVNjcmFwT2JqX0dldFNjcmFwRmxhdm9yU2l6ZSwgMSwKLQkgUHlEb2NfU1RSKCIoU2NyYXBGbGF2b3JUeXBlIGZsYXZvclR5cGUpIC0+IChTaXplIGJ5dGVDb3VudCkiKX0sCi0JeyJHZXRTY3JhcEZsYXZvckRhdGEiLCAoUHlDRnVuY3Rpb24pU2NyYXBPYmpfR2V0U2NyYXBGbGF2b3JEYXRhLCAxLAotCSBQeURvY19TVFIoIihTY3JhcEZsYXZvclR5cGUgZmxhdm9yVHlwZSwgQnVmZmVyIGRlc3RpbmF0aW9uKSAtPiAoU2l6ZSBieXRlQ291bnQpIil9LAotCXsiUHV0U2NyYXBGbGF2b3IiLCAoUHlDRnVuY3Rpb24pU2NyYXBPYmpfUHV0U2NyYXBGbGF2b3IsIDEsCi0JIFB5RG9jX1NUUigiKFNjcmFwRmxhdm9yVHlwZSBmbGF2b3JUeXBlLCBTY3JhcEZsYXZvckZsYWdzIGZsYXZvckZsYWdzLCBTaXplIGZsYXZvclNpemUsIEJ1ZmZlciBmbGF2b3JEYXRhKSAtPiBOb25lIil9LAotCXsiR2V0U2NyYXBGbGF2b3JDb3VudCIsIChQeUNGdW5jdGlvbilTY3JhcE9ial9HZXRTY3JhcEZsYXZvckNvdW50LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChVSW50MzIgaW5mb0NvdW50KSIpfSwKLQl7IkdldFNjcmFwRmxhdm9ySW5mb0xpc3QiLCAoUHlDRnVuY3Rpb24pU2NyYXBPYmpfR2V0U2NyYXBGbGF2b3JJbmZvTGlzdCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoWyhTY3JhcEZsYXZvclR5cGUsIFNjcmFwRmxhdm9ySW5mbyksIC4uLl0pIil9LAotCXtOVUxMLCBOVUxMLCAwfQorICAgIHsiR2V0U2NyYXBGbGF2b3JGbGFncyIsIChQeUNGdW5jdGlvbilTY3JhcE9ial9HZXRTY3JhcEZsYXZvckZsYWdzLCAxLAorICAgICBQeURvY19TVFIoIihTY3JhcEZsYXZvclR5cGUgZmxhdm9yVHlwZSkgLT4gKFNjcmFwRmxhdm9yRmxhZ3MgZmxhdm9yRmxhZ3MpIil9LAorICAgIHsiR2V0U2NyYXBGbGF2b3JTaXplIiwgKFB5Q0Z1bmN0aW9uKVNjcmFwT2JqX0dldFNjcmFwRmxhdm9yU2l6ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2NyYXBGbGF2b3JUeXBlIGZsYXZvclR5cGUpIC0+IChTaXplIGJ5dGVDb3VudCkiKX0sCisgICAgeyJHZXRTY3JhcEZsYXZvckRhdGEiLCAoUHlDRnVuY3Rpb24pU2NyYXBPYmpfR2V0U2NyYXBGbGF2b3JEYXRhLCAxLAorICAgICBQeURvY19TVFIoIihTY3JhcEZsYXZvclR5cGUgZmxhdm9yVHlwZSwgQnVmZmVyIGRlc3RpbmF0aW9uKSAtPiAoU2l6ZSBieXRlQ291bnQpIil9LAorICAgIHsiUHV0U2NyYXBGbGF2b3IiLCAoUHlDRnVuY3Rpb24pU2NyYXBPYmpfUHV0U2NyYXBGbGF2b3IsIDEsCisgICAgIFB5RG9jX1NUUigiKFNjcmFwRmxhdm9yVHlwZSBmbGF2b3JUeXBlLCBTY3JhcEZsYXZvckZsYWdzIGZsYXZvckZsYWdzLCBTaXplIGZsYXZvclNpemUsIEJ1ZmZlciBmbGF2b3JEYXRhKSAtPiBOb25lIil9LAorICAgIHsiR2V0U2NyYXBGbGF2b3JDb3VudCIsIChQeUNGdW5jdGlvbilTY3JhcE9ial9HZXRTY3JhcEZsYXZvckNvdW50LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChVSW50MzIgaW5mb0NvdW50KSIpfSwKKyAgICB7IkdldFNjcmFwRmxhdm9ySW5mb0xpc3QiLCAoUHlDRnVuY3Rpb24pU2NyYXBPYmpfR2V0U2NyYXBGbGF2b3JJbmZvTGlzdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoWyhTY3JhcEZsYXZvclR5cGUsIFNjcmFwRmxhdm9ySW5mbyksIC4uLl0pIil9LAorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogUHlNZXRob2RDaGFpbiBTY3JhcE9ial9jaGFpbiA9IHsgU2NyYXBPYmpfbWV0aG9kcywgTlVMTCB9OwogCiBzdGF0aWMgUHlPYmplY3QgKlNjcmFwT2JqX2dldGF0dHIoU2NyYXBPYmplY3QgKnNlbGYsIGNoYXIgKm5hbWUpCiB7Ci0JcmV0dXJuIFB5X0ZpbmRNZXRob2RJbkNoYWluKCZTY3JhcE9ial9jaGFpbiwgKFB5T2JqZWN0ICopc2VsZiwgbmFtZSk7CisgICAgcmV0dXJuIFB5X0ZpbmRNZXRob2RJbkNoYWluKCZTY3JhcE9ial9jaGFpbiwgKFB5T2JqZWN0ICopc2VsZiwgbmFtZSk7CiB9CiAKICNkZWZpbmUgU2NyYXBPYmpfc2V0YXR0ciBOVUxMCkBAIC0yMzEsMTA3ICsyMzEsMTA3IEBACiAjZGVmaW5lIFNjcmFwT2JqX2hhc2ggTlVMTAogCiBQeVR5cGVPYmplY3QgU2NyYXBfVHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKLQkwLCAvKm9iX3NpemUqLwotCSJfU2NyYXAuU2NyYXAiLCAvKnRwX25hbWUqLwotCXNpemVvZihTY3JhcE9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KLQkwLCAvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpIFNjcmFwT2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCi0JMCwgLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKSBTY3JhcE9ial9nZXRhdHRyLCAvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYykgU2NyYXBPYmpfc2V0YXR0ciwgLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykgU2NyYXBPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpIFNjcmFwT2JqX3JlcHIsIC8qdHBfcmVwciovCi0JKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLwotCShQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCi0JKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCi0JKGhhc2hmdW5jKSBTY3JhcE9ial9oYXNoLCAvKnRwX2hhc2gqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgIDAsIC8qb2Jfc2l6ZSovCisgICAgIl9TY3JhcC5TY3JhcCIsIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKFNjcmFwT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLworICAgIDAsIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcikgU2NyYXBPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpIFNjcmFwT2JqX2dldGF0dHIsIC8qdHBfZ2V0YXR0ciovCisgICAgKHNldGF0dHJmdW5jKSBTY3JhcE9ial9zZXRhdHRyLCAvKnRwX3NldGF0dHIqLworICAgIChjbXBmdW5jKSBTY3JhcE9ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLworICAgIChyZXByZnVuYykgU2NyYXBPYmpfcmVwciwgLyp0cF9yZXByKi8KKyAgICAoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCisgICAgKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAoaGFzaGZ1bmMpIFNjcmFwT2JqX2hhc2gsIC8qdHBfaGFzaCovCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gRW5kIG9iamVjdCB0eXBlIFNjcmFwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAogc3RhdGljIFB5T2JqZWN0ICpTY3JhcF9Mb2FkU2NyYXAoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBMb2FkU2NyYXAoKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IExvYWRTY3JhcCgpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlNjcmFwX1VubG9hZFNjcmFwKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gVW5sb2FkU2NyYXAoKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFVubG9hZFNjcmFwKCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqU2NyYXBfR2V0Q3VycmVudFNjcmFwKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVNjcmFwUmVmIHNjcmFwOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0Q3VycmVudFNjcmFwKCZzY3JhcCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFNjcmFwT2JqX05ldywgc2NyYXApOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFNjcmFwUmVmIHNjcmFwOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0Q3VycmVudFNjcmFwKCZzY3JhcCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFNjcmFwT2JqX05ldywgc2NyYXApOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlNjcmFwX0NsZWFyQ3VycmVudFNjcmFwKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ2xlYXJDdXJyZW50U2NyYXAoKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENsZWFyQ3VycmVudFNjcmFwKCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqU2NyYXBfQ2FsbEluU2NyYXBQcm9taXNlcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENhbGxJblNjcmFwUHJvbWlzZXMoKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENhbGxJblNjcmFwUHJvbWlzZXMoKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KICNlbmRpZiAvKiBfX0xQNjRfXyAqLwogCiBzdGF0aWMgUHlNZXRob2REZWYgU2NyYXBfbWV0aG9kc1tdID0gewogI2lmbmRlZiBfX0xQNjRfXwotCXsiTG9hZFNjcmFwIiwgKFB5Q0Z1bmN0aW9uKVNjcmFwX0xvYWRTY3JhcCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiVW5sb2FkU2NyYXAiLCAoUHlDRnVuY3Rpb24pU2NyYXBfVW5sb2FkU2NyYXAsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkdldEN1cnJlbnRTY3JhcCIsIChQeUNGdW5jdGlvbilTY3JhcF9HZXRDdXJyZW50U2NyYXAsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFNjcmFwUmVmIHNjcmFwKSIpfSwKLQl7IkNsZWFyQ3VycmVudFNjcmFwIiwgKFB5Q0Z1bmN0aW9uKVNjcmFwX0NsZWFyQ3VycmVudFNjcmFwLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJDYWxsSW5TY3JhcFByb21pc2VzIiwgKFB5Q0Z1bmN0aW9uKVNjcmFwX0NhbGxJblNjcmFwUHJvbWlzZXMsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkxvYWRTY3JhcCIsIChQeUNGdW5jdGlvbilTY3JhcF9Mb2FkU2NyYXAsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IlVubG9hZFNjcmFwIiwgKFB5Q0Z1bmN0aW9uKVNjcmFwX1VubG9hZFNjcmFwLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRDdXJyZW50U2NyYXAiLCAoUHlDRnVuY3Rpb24pU2NyYXBfR2V0Q3VycmVudFNjcmFwLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChTY3JhcFJlZiBzY3JhcCkiKX0sCisgICAgeyJDbGVhckN1cnJlbnRTY3JhcCIsIChQeUNGdW5jdGlvbilTY3JhcF9DbGVhckN1cnJlbnRTY3JhcCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiQ2FsbEluU2NyYXBQcm9taXNlcyIsIChQeUNGdW5jdGlvbilTY3JhcF9DYWxsSW5TY3JhcFByb21pc2VzLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCiAjZW5kaWYgLyogX19MUDY0X18gKi8KLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKIApAQCAtMzM5LDI1ICszMzksMjUgQEAKIAogdm9pZCBpbml0X1NjcmFwKHZvaWQpCiB7Ci0JUHlPYmplY3QgKm07CisgICAgUHlPYmplY3QgKm07CiAjaWZuZGVmIF9fTFA2NF9fCi0JUHlPYmplY3QgKmQ7CisgICAgUHlPYmplY3QgKmQ7CiAjZW5kaWYgLyogX19MUDY0X18gKi8KIAogCiAKIAotCW0gPSBQeV9Jbml0TW9kdWxlKCJfU2NyYXAiLCBTY3JhcF9tZXRob2RzKTsKKyAgICBtID0gUHlfSW5pdE1vZHVsZSgiX1NjcmFwIiwgU2NyYXBfbWV0aG9kcyk7CiAjaWZuZGVmIF9fTFA2NF9fCi0JZCA9IFB5TW9kdWxlX0dldERpY3QobSk7Ci0JU2NyYXBfRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOwotCWlmIChTY3JhcF9FcnJvciA9PSBOVUxMIHx8Ci0JICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFcnJvciIsIFNjcmFwX0Vycm9yKSAhPSAwKQotCQlyZXR1cm47Ci0JU2NyYXBfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCVB5X0lOQ1JFRigmU2NyYXBfVHlwZSk7Ci0JaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTY3JhcFR5cGUiLCAoUHlPYmplY3QgKikmU2NyYXBfVHlwZSkgIT0gMCkKLQkJUHlfRmF0YWxFcnJvcigiY2FuJ3QgaW5pdGlhbGl6ZSBTY3JhcFR5cGUiKTsKKyAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICBTY3JhcF9FcnJvciA9IFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCk7CisgICAgaWYgKFNjcmFwX0Vycm9yID09IE5VTEwgfHwKKyAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVycm9yIiwgU2NyYXBfRXJyb3IpICE9IDApCisgICAgICAgIHJldHVybjsKKyAgICBTY3JhcF9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7CisgICAgUHlfSU5DUkVGKCZTY3JhcF9UeXBlKTsKKyAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNjcmFwVHlwZSIsIChQeU9iamVjdCAqKSZTY3JhcF9UeXBlKSAhPSAwKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJjYW4ndCBpbml0aWFsaXplIFNjcmFwVHlwZSIpOwogI2VuZGlmIC8qIF9fTFA2NF9fICovCiB9CiAKZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL3NuZC9fU25kaWhvb2tzLmMgYi9NYWMvTW9kdWxlcy9zbmQvX1NuZGlob29rcy5jCmluZGV4IDc0Y2FkOWIuLjI1NGZjMGMgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL3NuZC9fU25kaWhvb2tzLmMKKysrIGIvTWFjL01vZHVsZXMvc25kL19TbmRpaG9va3MuYwpAQCAtMzUsMTMgKzM1LDEzIEBACiAKICNwcmFnbWEgb3B0aW9ucyBhbGlnbj1tYWM2OGsKIHN0cnVjdCBTYW1wbGVSYXRlQXZhaWxhYmxlX2FyZyB7Ci0Jc2hvcnQJbnVtcmF0ZXM7Ci0JSGFuZGxlCXJhdGVzOworICAgIHNob3J0ICAgICAgIG51bXJhdGVzOworICAgIEhhbmRsZSAgICAgIHJhdGVzOwogfTsKIAogc3RydWN0IFNhbXBsZVNpemVBdmFpbGFibGVfYXJnIHsKLQlzaG9ydAludW1zaXplczsKLQlIYW5kbGUJc2l6ZXM7CisgICAgc2hvcnQgICAgICAgbnVtc2l6ZXM7CisgICAgSGFuZGxlICAgICAgc2l6ZXM7CiB9OwogCiAjcHJhZ21hIG9wdGlvbnMgYWxpZ249cmVzZXQKQEAgLTUzLDI4ICs1MywyOCBAQAogc3RhdGljIGludAogUHlNYWNfR2V0VUZpeGVkKFB5T2JqZWN0ICp2LCBGaXhlZCAqZikKIHsKLQlkb3VibGUgZDsKLQl1bnNpZ25lZCBsb25nIHVuczsKLQkKLQlpZiggIVB5QXJnX1BhcnNlKHYsICJkIiwgJmQpKQotCQlyZXR1cm4gMDsKLQl1bnMgPSAodW5zaWduZWQgbG9uZykoZCAqIDB4MTAwMDApOwotCSpmID0gKEZpeGVkKXVuczsKLQlyZXR1cm4gMTsKKyAgICBkb3VibGUgZDsKKyAgICB1bnNpZ25lZCBsb25nIHVuczsKKworICAgIGlmKCAhUHlBcmdfUGFyc2UodiwgImQiLCAmZCkpCisgICAgICAgIHJldHVybiAwOworICAgIHVucyA9ICh1bnNpZ25lZCBsb25nKShkICogMHgxMDAwMCk7CisgICAgKmYgPSAoRml4ZWQpdW5zOworICAgIHJldHVybiAxOwogfQogCiAvKiBDb252ZXJ0IGEgUG9pbnQgdG8gYSBQeXRob24gb2JqZWN0ICovCiBzdGF0aWMgUHlPYmplY3QgKgogUHlNYWNfQnVpbGRVRml4ZWQoRml4ZWQgZikKIHsKLQlkb3VibGUgZDsKLQl1bnNpZ25lZCBsb25nIGZ1bnM7Ci0JCi0JZnVucyA9ICh1bnNpZ25lZCBsb25nKWY7Ci0JCi0JZCA9IGZ1bnM7Ci0JZCA9IGQgLyAweDEwMDAwOwotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJkIiwgZCk7CisgICAgZG91YmxlIGQ7CisgICAgdW5zaWduZWQgbG9uZyBmdW5zOworCisgICAgZnVucyA9ICh1bnNpZ25lZCBsb25nKWY7CisKKyAgICBkID0gZnVuczsKKyAgICBkID0gZCAvIDB4MTAwMDA7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImQiLCBkKTsKIH0KIAogCkBAIC04NiwxOSArODYsMTkgQEAKIAogc3RhdGljIFB5T2JqZWN0ICoKIHNuZGloX2dldENoYW5uZWxBdmFpbGFibGUoc2VsZiwgYXJncykKLQlQeU9iamVjdCAqc2VsZjsJLyogTm90IHVzZWQgKi8KLQlQeU9iamVjdCAqYXJnczsKKyAgICBQeU9iamVjdCAqc2VsZjsgICAgIC8qIE5vdCB1c2VkICovCisgICAgUHlPYmplY3QgKmFyZ3M7CiB7Ci0JbG9uZyBpblJlZk51bTsKLQlzaG9ydCBuY2hhbm5lbDsKLQlPU0VyciBlcnI7CisgICAgbG9uZyBpblJlZk51bTsKKyAgICBzaG9ydCBuY2hhbm5lbDsKKyAgICBPU0VyciBlcnI7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImwiLCAmaW5SZWZOdW0pKQotCQlyZXR1cm4gTlVMTDsKLQkKLQlpZiggKGVycj1TUEJHZXREZXZpY2VJbmZvKGluUmVmTnVtLCBzaUNoYW5uZWxBdmFpbGFibGUsIChQdHIpJm5jaGFubmVsKSkgIT0gbm9FcnIgKQotCQlyZXR1cm4gUHlNYWNfRXJyb3IoZXJyKTsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaCIsIG5jaGFubmVsKTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImwiLCAmaW5SZWZOdW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGlmKCAoZXJyPVNQQkdldERldmljZUluZm8oaW5SZWZOdW0sIHNpQ2hhbm5lbEF2YWlsYWJsZSwgKFB0cikmbmNoYW5uZWwpKSAhPSBub0VyciApCisgICAgICAgIHJldHVybiBQeU1hY19FcnJvcihlcnIpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJoIiwgbmNoYW5uZWwpOwogfQogCiBzdGF0aWMgY2hhciBzbmRpaF9nZXROdW1iZXJDaGFubmVsc19fZG9jX19bXSA9CkBAIC0xMDcsMTkgKzEwNywxOSBAQAogCiBzdGF0aWMgUHlPYmplY3QgKgogc25kaWhfZ2V0TnVtYmVyQ2hhbm5lbHMoc2VsZiwgYXJncykKLQlQeU9iamVjdCAqc2VsZjsJLyogTm90IHVzZWQgKi8KLQlQeU9iamVjdCAqYXJnczsKKyAgICBQeU9iamVjdCAqc2VsZjsgICAgIC8qIE5vdCB1c2VkICovCisgICAgUHlPYmplY3QgKmFyZ3M7CiB7Ci0JbG9uZyBpblJlZk51bTsKLQlzaG9ydCBuY2hhbm5lbDsKLQlPU0VyciBlcnI7CisgICAgbG9uZyBpblJlZk51bTsKKyAgICBzaG9ydCBuY2hhbm5lbDsKKyAgICBPU0VyciBlcnI7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImwiLCAmaW5SZWZOdW0pKQotCQlyZXR1cm4gTlVMTDsKLQkKLQlpZiggKGVycj1TUEJHZXREZXZpY2VJbmZvKGluUmVmTnVtLCBzaU51bWJlckNoYW5uZWxzLCAoUHRyKSZuY2hhbm5lbCkpICE9IG5vRXJyICkKLQkJcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImgiLCBuY2hhbm5lbCk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsIiwgJmluUmVmTnVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBpZiggKGVycj1TUEJHZXREZXZpY2VJbmZvKGluUmVmTnVtLCBzaU51bWJlckNoYW5uZWxzLCAoUHRyKSZuY2hhbm5lbCkpICE9IG5vRXJyICkKKyAgICAgICAgcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImgiLCBuY2hhbm5lbCk7CiB9CiAKIHN0YXRpYyBjaGFyIHNuZGloX3NldE51bWJlckNoYW5uZWxzX19kb2NfX1tdID0KQEAgLTEyOCwyMCArMTI4LDIwIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzbmRpaF9zZXROdW1iZXJDaGFubmVscyhzZWxmLCBhcmdzKQotCVB5T2JqZWN0ICpzZWxmOwkvKiBOb3QgdXNlZCAqLwotCVB5T2JqZWN0ICphcmdzOworICAgIFB5T2JqZWN0ICpzZWxmOyAgICAgLyogTm90IHVzZWQgKi8KKyAgICBQeU9iamVjdCAqYXJnczsKIHsKLQlsb25nIGluUmVmTnVtOwotCXNob3J0IG5jaGFubmVsOwotCU9TRXJyIGVycjsKKyAgICBsb25nIGluUmVmTnVtOworICAgIHNob3J0IG5jaGFubmVsOworICAgIE9TRXJyIGVycjsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibGgiLCAmaW5SZWZOdW0sICZuY2hhbm5lbCkpCi0JCXJldHVybiBOVUxMOwotCQotCWlmKCAoZXJyPVNQQlNldERldmljZUluZm8oaW5SZWZOdW0sIHNpTnVtYmVyQ2hhbm5lbHMsIChQdHIpJm5jaGFubmVsKSkgIT0gbm9FcnIgKQotCQlyZXR1cm4gUHlNYWNfRXJyb3IoZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsaCIsICZpblJlZk51bSwgJm5jaGFubmVsKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBpZiggKGVycj1TUEJTZXREZXZpY2VJbmZvKGluUmVmTnVtLCBzaU51bWJlckNoYW5uZWxzLCAoUHRyKSZuY2hhbm5lbCkpICE9IG5vRXJyICkKKyAgICAgICAgcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgY2hhciBzbmRpaF9nZXRDb250aW51b3VzX19kb2NfX1tdID0KQEAgLTE1MCwxOSArMTUwLDE5IEBACiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzbmRpaF9nZXRDb250aW51b3VzKHNlbGYsIGFyZ3MpCi0JUHlPYmplY3QgKnNlbGY7CS8qIE5vdCB1c2VkICovCi0JUHlPYmplY3QgKmFyZ3M7CisgICAgUHlPYmplY3QgKnNlbGY7ICAgICAvKiBOb3QgdXNlZCAqLworICAgIFB5T2JqZWN0ICphcmdzOwogewotCWxvbmcgaW5SZWZOdW07Ci0Jc2hvcnQgb25vZmY7Ci0JT1NFcnIgZXJyOworICAgIGxvbmcgaW5SZWZOdW07CisgICAgc2hvcnQgb25vZmY7CisgICAgT1NFcnIgZXJyOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsIiwgJmluUmVmTnVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JCi0JaWYoIChlcnI9U1BCR2V0RGV2aWNlSW5mbyhpblJlZk51bSwgc2lDb250aW51b3VzLCAoUHRyKSZvbm9mZikpICE9IG5vRXJyICkKLQkJcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImgiLCBvbm9mZik7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsIiwgJmluUmVmTnVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBpZiggKGVycj1TUEJHZXREZXZpY2VJbmZvKGluUmVmTnVtLCBzaUNvbnRpbnVvdXMsIChQdHIpJm9ub2ZmKSkgIT0gbm9FcnIgKQorICAgICAgICByZXR1cm4gUHlNYWNfRXJyb3IoZXJyKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaCIsIG9ub2ZmKTsKIH0KIAogc3RhdGljIGNoYXIgc25kaWhfc2V0Q29udGludW91c19fZG9jX19bXSA9CkBAIC0xNzEsMjAgKzE3MSwyMCBAQAogCiBzdGF0aWMgUHlPYmplY3QgKgogc25kaWhfc2V0Q29udGludW91cyhzZWxmLCBhcmdzKQotCVB5T2JqZWN0ICpzZWxmOwkvKiBOb3QgdXNlZCAqLwotCVB5T2JqZWN0ICphcmdzOworICAgIFB5T2JqZWN0ICpzZWxmOyAgICAgLyogTm90IHVzZWQgKi8KKyAgICBQeU9iamVjdCAqYXJnczsKIHsKLQlsb25nIGluUmVmTnVtOwotCXNob3J0IG9ub2ZmOwotCU9TRXJyIGVycjsKKyAgICBsb25nIGluUmVmTnVtOworICAgIHNob3J0IG9ub2ZmOworICAgIE9TRXJyIGVycjsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibGgiLCAmaW5SZWZOdW0sICZvbm9mZikpCi0JCXJldHVybiBOVUxMOwotCQotCWlmKCAoZXJyPVNQQlNldERldmljZUluZm8oaW5SZWZOdW0sIHNpQ29udGludW91cywgKFB0cikmb25vZmYpKSAhPSBub0VyciApCi0JCXJldHVybiBQeU1hY19FcnJvcihlcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImxoIiwgJmluUmVmTnVtLCAmb25vZmYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGlmKCAoZXJyPVNQQlNldERldmljZUluZm8oaW5SZWZOdW0sIHNpQ29udGludW91cywgKFB0cikmb25vZmYpKSAhPSBub0VyciApCisgICAgICAgIHJldHVybiBQeU1hY19FcnJvcihlcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIGNoYXIgc25kaWhfZ2V0SW5wdXRTb3VyY2VOYW1lc19fZG9jX19bXSA9CkBAIC0xOTMsMTkgKzE5MywxOSBAQAogCiBzdGF0aWMgUHlPYmplY3QgKgogc25kaWhfZ2V0SW5wdXRTb3VyY2VOYW1lcyhzZWxmLCBhcmdzKQotCVB5T2JqZWN0ICpzZWxmOwkvKiBOb3QgdXNlZCAqLwotCVB5T2JqZWN0ICphcmdzOworICAgIFB5T2JqZWN0ICpzZWxmOyAgICAgLyogTm90IHVzZWQgKi8KKyAgICBQeU9iamVjdCAqYXJnczsKIHsKLQlsb25nIGluUmVmTnVtOwotCUhhbmRsZSBuYW1lczsKLQlPU0VyciBlcnI7CisgICAgbG9uZyBpblJlZk51bTsKKyAgICBIYW5kbGUgbmFtZXM7CisgICAgT1NFcnIgZXJyOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsIiwgJmluUmVmTnVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JCi0JaWYoIChlcnI9U1BCR2V0RGV2aWNlSW5mbyhpblJlZk51bSwgc2lJbnB1dFNvdXJjZU5hbWVzLCAoUHRyKSZuYW1lcykpICE9IG5vRXJyICkKLQkJcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgUmVzT2JqX05ldywgbmFtZXMpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibCIsICZpblJlZk51bSkpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgaWYoIChlcnI9U1BCR2V0RGV2aWNlSW5mbyhpblJlZk51bSwgc2lJbnB1dFNvdXJjZU5hbWVzLCAoUHRyKSZuYW1lcykpICE9IG5vRXJyICkKKyAgICAgICAgcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgUmVzT2JqX05ldywgbmFtZXMpOwogfQogCiBzdGF0aWMgY2hhciBzbmRpaF9nZXRJbnB1dFNvdXJjZV9fZG9jX19bXSA9CkBAIC0yMTQsMTkgKzIxNCwxOSBAQAogCiBzdGF0aWMgUHlPYmplY3QgKgogc25kaWhfZ2V0SW5wdXRTb3VyY2Uoc2VsZiwgYXJncykKLQlQeU9iamVjdCAqc2VsZjsJLyogTm90IHVzZWQgKi8KLQlQeU9iamVjdCAqYXJnczsKKyAgICBQeU9iamVjdCAqc2VsZjsgICAgIC8qIE5vdCB1c2VkICovCisgICAgUHlPYmplY3QgKmFyZ3M7CiB7Ci0JbG9uZyBpblJlZk51bTsKLQlzaG9ydCBzb3VyY2U7Ci0JT1NFcnIgZXJyOworICAgIGxvbmcgaW5SZWZOdW07CisgICAgc2hvcnQgc291cmNlOworICAgIE9TRXJyIGVycjsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibCIsICZpblJlZk51bSkpCi0JCXJldHVybiBOVUxMOwotCQotCWlmKCAoZXJyPVNQQkdldERldmljZUluZm8oaW5SZWZOdW0sIHNpSW5wdXRTb3VyY2UsIChQdHIpJnNvdXJjZSkpICE9IG5vRXJyICkKLQkJcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImgiLCBzb3VyY2UpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibCIsICZpblJlZk51bSkpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgaWYoIChlcnI9U1BCR2V0RGV2aWNlSW5mbyhpblJlZk51bSwgc2lJbnB1dFNvdXJjZSwgKFB0cikmc291cmNlKSkgIT0gbm9FcnIgKQorICAgICAgICByZXR1cm4gUHlNYWNfRXJyb3IoZXJyKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaCIsIHNvdXJjZSk7CiB9CiAKIHN0YXRpYyBjaGFyIHNuZGloX3NldElucHV0U291cmNlX19kb2NfX1tdID0KQEAgLTIzNSwyMCArMjM1LDIwIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzbmRpaF9zZXRJbnB1dFNvdXJjZShzZWxmLCBhcmdzKQotCVB5T2JqZWN0ICpzZWxmOwkvKiBOb3QgdXNlZCAqLwotCVB5T2JqZWN0ICphcmdzOworICAgIFB5T2JqZWN0ICpzZWxmOyAgICAgLyogTm90IHVzZWQgKi8KKyAgICBQeU9iamVjdCAqYXJnczsKIHsKLQlsb25nIGluUmVmTnVtOwotCXNob3J0IHNvdXJjZTsKLQlPU0VyciBlcnI7CisgICAgbG9uZyBpblJlZk51bTsKKyAgICBzaG9ydCBzb3VyY2U7CisgICAgT1NFcnIgZXJyOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsaCIsICZpblJlZk51bSwgJnNvdXJjZSkpCi0JCXJldHVybiBOVUxMOwotCQotCWlmKCAoZXJyPVNQQlNldERldmljZUluZm8oaW5SZWZOdW0sIHNpSW5wdXRTb3VyY2UsIChQdHIpJnNvdXJjZSkpICE9IG5vRXJyICkKLQkJcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibGgiLCAmaW5SZWZOdW0sICZzb3VyY2UpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGlmKCAoZXJyPVNQQlNldERldmljZUluZm8oaW5SZWZOdW0sIHNpSW5wdXRTb3VyY2UsIChQdHIpJnNvdXJjZSkpICE9IG5vRXJyICkKKyAgICAgICAgcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgY2hhciBzbmRpaF9nZXRQbGF5VGhydU9uT2ZmX19kb2NfX1tdID0KQEAgLTI1NywxOSArMjU3LDE5IEBACiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzbmRpaF9nZXRQbGF5VGhydU9uT2ZmKHNlbGYsIGFyZ3MpCi0JUHlPYmplY3QgKnNlbGY7CS8qIE5vdCB1c2VkICovCi0JUHlPYmplY3QgKmFyZ3M7CisgICAgUHlPYmplY3QgKnNlbGY7ICAgICAvKiBOb3QgdXNlZCAqLworICAgIFB5T2JqZWN0ICphcmdzOwogewotCWxvbmcgaW5SZWZOdW07Ci0Jc2hvcnQgb25vZmY7Ci0JT1NFcnIgZXJyOworICAgIGxvbmcgaW5SZWZOdW07CisgICAgc2hvcnQgb25vZmY7CisgICAgT1NFcnIgZXJyOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsIiwgJmluUmVmTnVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JCi0JaWYoIChlcnI9U1BCR2V0RGV2aWNlSW5mbyhpblJlZk51bSwgc2lQbGF5VGhydU9uT2ZmLCAoUHRyKSZvbm9mZikpICE9IG5vRXJyICkKLQkJcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImgiLCBvbm9mZik7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsIiwgJmluUmVmTnVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBpZiggKGVycj1TUEJHZXREZXZpY2VJbmZvKGluUmVmTnVtLCBzaVBsYXlUaHJ1T25PZmYsIChQdHIpJm9ub2ZmKSkgIT0gbm9FcnIgKQorICAgICAgICByZXR1cm4gUHlNYWNfRXJyb3IoZXJyKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaCIsIG9ub2ZmKTsKIH0KIAogc3RhdGljIGNoYXIgc25kaWhfc2V0UGxheVRocnVPbk9mZl9fZG9jX19bXSA9CkBAIC0yNzgsMjAgKzI3OCwyMCBAQAogCiBzdGF0aWMgUHlPYmplY3QgKgogc25kaWhfc2V0UGxheVRocnVPbk9mZihzZWxmLCBhcmdzKQotCVB5T2JqZWN0ICpzZWxmOwkvKiBOb3QgdXNlZCAqLwotCVB5T2JqZWN0ICphcmdzOworICAgIFB5T2JqZWN0ICpzZWxmOyAgICAgLyogTm90IHVzZWQgKi8KKyAgICBQeU9iamVjdCAqYXJnczsKIHsKLQlsb25nIGluUmVmTnVtOwotCXNob3J0IG9ub2ZmOwotCU9TRXJyIGVycjsKKyAgICBsb25nIGluUmVmTnVtOworICAgIHNob3J0IG9ub2ZmOworICAgIE9TRXJyIGVycjsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibGgiLCAmaW5SZWZOdW0sICZvbm9mZikpCi0JCXJldHVybiBOVUxMOwotCQotCWlmKCAoZXJyPVNQQlNldERldmljZUluZm8oaW5SZWZOdW0sIHNpUGxheVRocnVPbk9mZiwgKFB0cikmb25vZmYpKSAhPSBub0VyciApCi0JCXJldHVybiBQeU1hY19FcnJvcihlcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImxoIiwgJmluUmVmTnVtLCAmb25vZmYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGlmKCAoZXJyPVNQQlNldERldmljZUluZm8oaW5SZWZOdW0sIHNpUGxheVRocnVPbk9mZiwgKFB0cikmb25vZmYpKSAhPSBub0VyciApCisgICAgICAgIHJldHVybiBQeU1hY19FcnJvcihlcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIGNoYXIgc25kaWhfZ2V0U2FtcGxlUmF0ZV9fZG9jX19bXSA9CkBAIC0zMDAsMTkgKzMwMCwxOSBAQAogCiBzdGF0aWMgUHlPYmplY3QgKgogc25kaWhfZ2V0U2FtcGxlUmF0ZShzZWxmLCBhcmdzKQotCVB5T2JqZWN0ICpzZWxmOwkvKiBOb3QgdXNlZCAqLwotCVB5T2JqZWN0ICphcmdzOworICAgIFB5T2JqZWN0ICpzZWxmOyAgICAgLyogTm90IHVzZWQgKi8KKyAgICBQeU9iamVjdCAqYXJnczsKIHsKLQlsb25nIGluUmVmTnVtOwotCUZpeGVkIHNhbXBsZV9yYXRlOwotCU9TRXJyIGVycjsKKyAgICBsb25nIGluUmVmTnVtOworICAgIEZpeGVkIHNhbXBsZV9yYXRlOworICAgIE9TRXJyIGVycjsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibCIsICZpblJlZk51bSkpCi0JCXJldHVybiBOVUxMOwotCQotCWlmKCAoZXJyPVNQQkdldERldmljZUluZm8oaW5SZWZOdW0sIHNpU2FtcGxlUmF0ZSwgKFB0cikmc2FtcGxlX3JhdGUpKSAhPSBub0VyciApCi0JCXJldHVybiBQeU1hY19FcnJvcihlcnIpOwotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJPJiIsIFB5TWFjX0J1aWxkVUZpeGVkLCBzYW1wbGVfcmF0ZSk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsIiwgJmluUmVmTnVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBpZiggKGVycj1TUEJHZXREZXZpY2VJbmZvKGluUmVmTnVtLCBzaVNhbXBsZVJhdGUsIChQdHIpJnNhbXBsZV9yYXRlKSkgIT0gbm9FcnIgKQorICAgICAgICByZXR1cm4gUHlNYWNfRXJyb3IoZXJyKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyYiLCBQeU1hY19CdWlsZFVGaXhlZCwgc2FtcGxlX3JhdGUpOwogfQogCiBzdGF0aWMgY2hhciBzbmRpaF9zZXRTYW1wbGVSYXRlX19kb2NfX1tdID0KQEAgLTMyMSwyMCArMzIxLDIwIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzbmRpaF9zZXRTYW1wbGVSYXRlKHNlbGYsIGFyZ3MpCi0JUHlPYmplY3QgKnNlbGY7CS8qIE5vdCB1c2VkICovCi0JUHlPYmplY3QgKmFyZ3M7CisgICAgUHlPYmplY3QgKnNlbGY7ICAgICAvKiBOb3QgdXNlZCAqLworICAgIFB5T2JqZWN0ICphcmdzOwogewotCWxvbmcgaW5SZWZOdW07Ci0JRml4ZWQgc2FtcGxlX3JhdGU7Ci0JT1NFcnIgZXJyOworICAgIGxvbmcgaW5SZWZOdW07CisgICAgRml4ZWQgc2FtcGxlX3JhdGU7CisgICAgT1NFcnIgZXJyOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsTyYiLCAmaW5SZWZOdW0sIFB5TWFjX0dldFVGaXhlZCwgJnNhbXBsZV9yYXRlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JCi0JaWYoIChlcnI9U1BCU2V0RGV2aWNlSW5mbyhpblJlZk51bSwgc2lTYW1wbGVSYXRlLCAoUHRyKSZzYW1wbGVfcmF0ZSkpICE9IG5vRXJyICkKLQkJcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibE8mIiwgJmluUmVmTnVtLCBQeU1hY19HZXRVRml4ZWQsICZzYW1wbGVfcmF0ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgaWYoIChlcnI9U1BCU2V0RGV2aWNlSW5mbyhpblJlZk51bSwgc2lTYW1wbGVSYXRlLCAoUHRyKSZzYW1wbGVfcmF0ZSkpICE9IG5vRXJyICkKKyAgICAgICAgcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgY2hhciBzbmRpaF9nZXRTYW1wbGVTaXplX19kb2NfX1tdID0KQEAgLTM0MywxOSArMzQzLDE5IEBACiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzbmRpaF9nZXRTYW1wbGVTaXplKHNlbGYsIGFyZ3MpCi0JUHlPYmplY3QgKnNlbGY7CS8qIE5vdCB1c2VkICovCi0JUHlPYmplY3QgKmFyZ3M7CisgICAgUHlPYmplY3QgKnNlbGY7ICAgICAvKiBOb3QgdXNlZCAqLworICAgIFB5T2JqZWN0ICphcmdzOwogewotCWxvbmcgaW5SZWZOdW07Ci0Jc2hvcnQgYml0czsKLQlPU0VyciBlcnI7CisgICAgbG9uZyBpblJlZk51bTsKKyAgICBzaG9ydCBiaXRzOworICAgIE9TRXJyIGVycjsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibCIsICZpblJlZk51bSkpCi0JCXJldHVybiBOVUxMOwotCQotCWlmKCAoZXJyPVNQQkdldERldmljZUluZm8oaW5SZWZOdW0sIHNpU2FtcGxlU2l6ZSwgKFB0cikmYml0cykpICE9IG5vRXJyICkKLQkJcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImgiLCBiaXRzKTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImwiLCAmaW5SZWZOdW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGlmKCAoZXJyPVNQQkdldERldmljZUluZm8oaW5SZWZOdW0sIHNpU2FtcGxlU2l6ZSwgKFB0cikmYml0cykpICE9IG5vRXJyICkKKyAgICAgICAgcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImgiLCBiaXRzKTsKIH0KIAogc3RhdGljIGNoYXIgc25kaWhfc2V0U2FtcGxlU2l6ZV9fZG9jX19bXSA9CkBAIC0zNjQsMjAgKzM2NCwyMCBAQAogCiBzdGF0aWMgUHlPYmplY3QgKgogc25kaWhfc2V0U2FtcGxlU2l6ZShzZWxmLCBhcmdzKQotCVB5T2JqZWN0ICpzZWxmOwkvKiBOb3QgdXNlZCAqLwotCVB5T2JqZWN0ICphcmdzOworICAgIFB5T2JqZWN0ICpzZWxmOyAgICAgLyogTm90IHVzZWQgKi8KKyAgICBQeU9iamVjdCAqYXJnczsKIHsKLQlsb25nIGluUmVmTnVtOwotCXNob3J0IHNpemU7Ci0JT1NFcnIgZXJyOworICAgIGxvbmcgaW5SZWZOdW07CisgICAgc2hvcnQgc2l6ZTsKKyAgICBPU0VyciBlcnI7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImxoIiwgJmluUmVmTnVtLCAmc2l6ZSkpCi0JCXJldHVybiBOVUxMOwotCQotCWlmKCAoZXJyPVNQQlNldERldmljZUluZm8oaW5SZWZOdW0sIHNpU2FtcGxlU2l6ZSwgKFB0cikmc2l6ZSkpICE9IG5vRXJyICkKLQkJcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibGgiLCAmaW5SZWZOdW0sICZzaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBpZiggKGVycj1TUEJTZXREZXZpY2VJbmZvKGluUmVmTnVtLCBzaVNhbXBsZVNpemUsIChQdHIpJnNpemUpKSAhPSBub0VyciApCisgICAgICAgIHJldHVybiBQeU1hY19FcnJvcihlcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIGNoYXIgc25kaWhfZ2V0U2FtcGxlU2l6ZUF2YWlsYWJsZV9fZG9jX19bXSA9CkBAIC0zODYsMzEgKzM4NiwzMSBAQAogCiBzdGF0aWMgUHlPYmplY3QgKgogc25kaWhfZ2V0U2FtcGxlU2l6ZUF2YWlsYWJsZShzZWxmLCBhcmdzKQotCVB5T2JqZWN0ICpzZWxmOwkvKiBOb3QgdXNlZCAqLwotCVB5T2JqZWN0ICphcmdzOworICAgIFB5T2JqZWN0ICpzZWxmOyAgICAgLyogTm90IHVzZWQgKi8KKyAgICBQeU9iamVjdCAqYXJnczsKIHsKLQlsb25nIGluUmVmTnVtOwotCXN0cnVjdCBTYW1wbGVTaXplQXZhaWxhYmxlX2FyZyBhcmc7Ci0JT1NFcnIgZXJyOwotCVB5T2JqZWN0ICpyc2l6ZXM7Ci0Jc2hvcnQgKmZzaXplczsKLQlpbnQgaTsKKyAgICBsb25nIGluUmVmTnVtOworICAgIHN0cnVjdCBTYW1wbGVTaXplQXZhaWxhYmxlX2FyZyBhcmc7CisgICAgT1NFcnIgZXJyOworICAgIFB5T2JqZWN0ICpyc2l6ZXM7CisgICAgc2hvcnQgKmZzaXplczsKKyAgICBpbnQgaTsKIAotCWFyZy5zaXplcyA9IE5VTEw7Ci0JcnNpemVzID0gTlVMTDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImwiLCAmaW5SZWZOdW0pKQotCQlyZXR1cm4gTlVMTDsKLQkKLQlpZiggKGVycj1TUEJHZXREZXZpY2VJbmZvKGluUmVmTnVtLCBzaVNhbXBsZVNpemVBdmFpbGFibGUsIChQdHIpJmFyZykpICE9IG5vRXJyICkgewotCQlyZXR1cm4gUHlNYWNfRXJyb3IoZXJyKTsKLQl9Ci0JZnNpemVzID0gKHNob3J0ICopKihhcmcuc2l6ZXMpOwotCS8qIEhhbmRsZSBjb250YWlucyBhIGxpc3Qgb2YgcmF0ZXMgKi8KLQlpZiggKHJzaXplcyA9IFB5VHVwbGVfTmV3KGFyZy5udW1zaXplcykpID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWZvciggaT0wOyBpPGFyZy5udW1zaXplczsgaSsrICkKLQkJUHlUdXBsZV9TZXRJdGVtKHJzaXplcywgaSwgUHlJbnRfRnJvbUxvbmcoKGxvbmcpZnNpemVzW2ldKSk7Ci0JcmV0dXJuIHJzaXplczsKKyAgICBhcmcuc2l6ZXMgPSBOVUxMOworICAgIHJzaXplcyA9IE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsIiwgJmluUmVmTnVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBpZiggKGVycj1TUEJHZXREZXZpY2VJbmZvKGluUmVmTnVtLCBzaVNhbXBsZVNpemVBdmFpbGFibGUsIChQdHIpJmFyZykpICE9IG5vRXJyICkgeworICAgICAgICByZXR1cm4gUHlNYWNfRXJyb3IoZXJyKTsKKyAgICB9CisgICAgZnNpemVzID0gKHNob3J0ICopKihhcmcuc2l6ZXMpOworICAgIC8qIEhhbmRsZSBjb250YWlucyBhIGxpc3Qgb2YgcmF0ZXMgKi8KKyAgICBpZiggKHJzaXplcyA9IFB5VHVwbGVfTmV3KGFyZy5udW1zaXplcykpID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGZvciggaT0wOyBpPGFyZy5udW1zaXplczsgaSsrICkKKyAgICAgICAgUHlUdXBsZV9TZXRJdGVtKHJzaXplcywgaSwgUHlJbnRfRnJvbUxvbmcoKGxvbmcpZnNpemVzW2ldKSk7CisgICAgcmV0dXJuIHJzaXplczsKIH0KIAogc3RhdGljIGNoYXIgc25kaWhfZ2V0U2FtcGxlUmF0ZUF2YWlsYWJsZV9fZG9jX19bXSA9CkBAIC00MTksOTQgKzQxOSw5NCBAQAogCiBzdGF0aWMgUHlPYmplY3QgKgogc25kaWhfZ2V0U2FtcGxlUmF0ZUF2YWlsYWJsZShzZWxmLCBhcmdzKQotCVB5T2JqZWN0ICpzZWxmOwkvKiBOb3QgdXNlZCAqLwotCVB5T2JqZWN0ICphcmdzOworICAgIFB5T2JqZWN0ICpzZWxmOyAgICAgLyogTm90IHVzZWQgKi8KKyAgICBQeU9iamVjdCAqYXJnczsKIHsKLQlsb25nIGluUmVmTnVtOwotCXN0cnVjdCBTYW1wbGVSYXRlQXZhaWxhYmxlX2FyZyBhcmc7Ci0JT1NFcnIgZXJyOwotCVB5T2JqZWN0ICpycmF0ZXMsICpvYmo7Ci0JRml4ZWQgKmZyYXRlczsKLQlpbnQgaTsKKyAgICBsb25nIGluUmVmTnVtOworICAgIHN0cnVjdCBTYW1wbGVSYXRlQXZhaWxhYmxlX2FyZyBhcmc7CisgICAgT1NFcnIgZXJyOworICAgIFB5T2JqZWN0ICpycmF0ZXMsICpvYmo7CisgICAgRml4ZWQgKmZyYXRlczsKKyAgICBpbnQgaTsKIAotCWFyZy5yYXRlcyA9IE5VTEw7Ci0JcnJhdGVzID0gTlVMTDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImwiLCAmaW5SZWZOdW0pKQotCQlyZXR1cm4gTlVMTDsKLQkKLQlpZiggKGVycj1TUEJHZXREZXZpY2VJbmZvKGluUmVmTnVtLCBzaVNhbXBsZVJhdGVBdmFpbGFibGUsIChQdHIpJmFyZykpICE9IG5vRXJyICkgewotCQlyZXR1cm4gUHlNYWNfRXJyb3IoZXJyKTsKLQl9Ci0JZnJhdGVzID0gKEZpeGVkICopKihhcmcucmF0ZXMpOwotCWlmKCBhcmcubnVtcmF0ZXMgPT0gMCApIHsKLQkJLyogVGhlIGhhbmRsZSBjb250YWlucyB1cHBlciBhbmQgbG93ZXJib3VuZCAqLwotCQlycmF0ZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwgZnJhdGVzWzBdLCBmcmF0ZXNbMV0pOwotCQlpZiAocnJhdGVzID09IE5VTEwpIHJldHVybiBOVUxMOwotCX0gZWxzZSB7Ci0JCS8qIEhhbmRsZSBjb250YWlucyBhIGxpc3Qgb2YgcmF0ZXMgKi8KLQkJaWYoIChycmF0ZXMgPSBQeVR1cGxlX05ldyhhcmcubnVtcmF0ZXMpKSA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWZvciggaT0wOyBpPGFyZy5udW1yYXRlczsgaSsrICkgewotCQkJaWYoIChvYmogPSBQeV9CdWlsZFZhbHVlKCJPJiIsIFB5TWFjX0J1aWxkVUZpeGVkLCBmcmF0ZXNbaV0pKT09TlVMTCkKLQkJCQlnb3RvIG91dDsKLQkJCVB5VHVwbGVfU2V0SXRlbShycmF0ZXMsIGksIG9iaik7Ci0JCX0KLQl9Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImhPIiwgYXJnLm51bXJhdGVzLCBycmF0ZXMpOworICAgIGFyZy5yYXRlcyA9IE5VTEw7CisgICAgcnJhdGVzID0gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImwiLCAmaW5SZWZOdW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGlmKCAoZXJyPVNQQkdldERldmljZUluZm8oaW5SZWZOdW0sIHNpU2FtcGxlUmF0ZUF2YWlsYWJsZSwgKFB0cikmYXJnKSkgIT0gbm9FcnIgKSB7CisgICAgICAgIHJldHVybiBQeU1hY19FcnJvcihlcnIpOworICAgIH0KKyAgICBmcmF0ZXMgPSAoRml4ZWQgKikqKGFyZy5yYXRlcyk7CisgICAgaWYoIGFyZy5udW1yYXRlcyA9PSAwICkgeworICAgICAgICAvKiBUaGUgaGFuZGxlIGNvbnRhaW5zIHVwcGVyIGFuZCBsb3dlcmJvdW5kICovCisgICAgICAgIHJyYXRlcyA9IFB5X0J1aWxkVmFsdWUoIk8mTyYiLCBmcmF0ZXNbMF0sIGZyYXRlc1sxXSk7CisgICAgICAgIGlmIChycmF0ZXMgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogSGFuZGxlIGNvbnRhaW5zIGEgbGlzdCBvZiByYXRlcyAqLworICAgICAgICBpZiggKHJyYXRlcyA9IFB5VHVwbGVfTmV3KGFyZy5udW1yYXRlcykpID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgZm9yKCBpPTA7IGk8YXJnLm51bXJhdGVzOyBpKysgKSB7CisgICAgICAgICAgICBpZiggKG9iaiA9IFB5X0J1aWxkVmFsdWUoIk8mIiwgUHlNYWNfQnVpbGRVRml4ZWQsIGZyYXRlc1tpXSkpPT1OVUxMKQorICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgUHlUdXBsZV9TZXRJdGVtKHJyYXRlcywgaSwgb2JqKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaE8iLCBhcmcubnVtcmF0ZXMsIHJyYXRlcyk7CiBvdXQ6Ci0JUHlfWERFQ1JFRihycmF0ZXMpOwotCXJldHVybiBOVUxMOworICAgIFB5X1hERUNSRUYocnJhdGVzKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogLyogTGlzdCBvZiBtZXRob2RzIGRlZmluZWQgaW4gdGhlIG1vZHVsZSAqLwogCiBzdGF0aWMgc3RydWN0IFB5TWV0aG9kRGVmIHNuZGloX21ldGhvZHNbXSA9IHsKLSB7ImdldENoYW5uZWxBdmFpbGFibGUiLAkoUHlDRnVuY3Rpb24pc25kaWhfZ2V0Q2hhbm5lbEF2YWlsYWJsZSwJTUVUSF9WQVJBUkdTLAlzbmRpaF9nZXRDaGFubmVsQXZhaWxhYmxlX19kb2NfX30sCi0geyJnZXROdW1iZXJDaGFubmVscyIsCShQeUNGdW5jdGlvbilzbmRpaF9nZXROdW1iZXJDaGFubmVscywJTUVUSF9WQVJBUkdTLAlzbmRpaF9nZXROdW1iZXJDaGFubmVsc19fZG9jX199LAotIHsic2V0TnVtYmVyQ2hhbm5lbHMiLAkoUHlDRnVuY3Rpb24pc25kaWhfc2V0TnVtYmVyQ2hhbm5lbHMsCU1FVEhfVkFSQVJHUywJc25kaWhfc2V0TnVtYmVyQ2hhbm5lbHNfX2RvY19ffSwKLSB7ImdldENvbnRpbnVvdXMiLAkoUHlDRnVuY3Rpb24pc25kaWhfZ2V0Q29udGludW91cywJTUVUSF9WQVJBUkdTLAlzbmRpaF9nZXRDb250aW51b3VzX19kb2NfX30sCi0geyJzZXRDb250aW51b3VzIiwJKFB5Q0Z1bmN0aW9uKXNuZGloX3NldENvbnRpbnVvdXMsCU1FVEhfVkFSQVJHUywJc25kaWhfc2V0Q29udGludW91c19fZG9jX199LAotIHsiZ2V0SW5wdXRTb3VyY2VOYW1lcyIsCShQeUNGdW5jdGlvbilzbmRpaF9nZXRJbnB1dFNvdXJjZU5hbWVzLAlNRVRIX1ZBUkFSR1MsCXNuZGloX2dldElucHV0U291cmNlTmFtZXNfX2RvY19ffSwKLSB7ImdldElucHV0U291cmNlIiwJKFB5Q0Z1bmN0aW9uKXNuZGloX2dldElucHV0U291cmNlLAlNRVRIX1ZBUkFSR1MsCXNuZGloX2dldElucHV0U291cmNlX19kb2NfX30sCi0geyJzZXRJbnB1dFNvdXJjZSIsCShQeUNGdW5jdGlvbilzbmRpaF9zZXRJbnB1dFNvdXJjZSwJTUVUSF9WQVJBUkdTLAlzbmRpaF9zZXRJbnB1dFNvdXJjZV9fZG9jX199LAotIHsiZ2V0UGxheVRocnVPbk9mZiIsCShQeUNGdW5jdGlvbilzbmRpaF9nZXRQbGF5VGhydU9uT2ZmLAlNRVRIX1ZBUkFSR1MsCXNuZGloX2dldFBsYXlUaHJ1T25PZmZfX2RvY19ffSwKLSB7InNldFBsYXlUaHJ1T25PZmYiLAkoUHlDRnVuY3Rpb24pc25kaWhfc2V0UGxheVRocnVPbk9mZiwJTUVUSF9WQVJBUkdTLAlzbmRpaF9zZXRQbGF5VGhydU9uT2ZmX19kb2NfX30sCi0geyJnZXRTYW1wbGVSYXRlIiwJKFB5Q0Z1bmN0aW9uKXNuZGloX2dldFNhbXBsZVJhdGUsCU1FVEhfVkFSQVJHUywJc25kaWhfZ2V0U2FtcGxlUmF0ZV9fZG9jX199LAotIHsic2V0U2FtcGxlUmF0ZSIsCShQeUNGdW5jdGlvbilzbmRpaF9zZXRTYW1wbGVSYXRlLAlNRVRIX1ZBUkFSR1MsCXNuZGloX3NldFNhbXBsZVJhdGVfX2RvY19ffSwKLSB7ImdldFNhbXBsZVNpemUiLAkoUHlDRnVuY3Rpb24pc25kaWhfZ2V0U2FtcGxlU2l6ZSwJTUVUSF9WQVJBUkdTLAlzbmRpaF9nZXRTYW1wbGVTaXplX19kb2NfX30sCi0geyJzZXRTYW1wbGVTaXplIiwJKFB5Q0Z1bmN0aW9uKXNuZGloX3NldFNhbXBsZVNpemUsCU1FVEhfVkFSQVJHUywJc25kaWhfc2V0U2FtcGxlU2l6ZV9fZG9jX199LAotIHsiZ2V0U2FtcGxlU2l6ZUF2YWlsYWJsZSIsCShQeUNGdW5jdGlvbilzbmRpaF9nZXRTYW1wbGVTaXplQXZhaWxhYmxlLAlNRVRIX1ZBUkFSR1MsCXNuZGloX2dldFNhbXBsZVNpemVBdmFpbGFibGVfX2RvY19ffSwKLSB7ImdldFNhbXBsZVJhdGVBdmFpbGFibGUiLAkoUHlDRnVuY3Rpb24pc25kaWhfZ2V0U2FtcGxlUmF0ZUF2YWlsYWJsZSwJTUVUSF9WQVJBUkdTLAlzbmRpaF9nZXRTYW1wbGVSYXRlQXZhaWxhYmxlX19kb2NfX30sCi0gCi0Je05VTEwsCSAoUHlDRnVuY3Rpb24pTlVMTCwgMCwgTlVMTH0JCS8qIHNlbnRpbmVsICovCisgeyJnZXRDaGFubmVsQXZhaWxhYmxlIiwgICAgICAgIChQeUNGdW5jdGlvbilzbmRpaF9nZXRDaGFubmVsQXZhaWxhYmxlLCBNRVRIX1ZBUkFSR1MsICAgc25kaWhfZ2V0Q2hhbm5lbEF2YWlsYWJsZV9fZG9jX199LAorIHsiZ2V0TnVtYmVyQ2hhbm5lbHMiLCAgKFB5Q0Z1bmN0aW9uKXNuZGloX2dldE51bWJlckNoYW5uZWxzLCAgIE1FVEhfVkFSQVJHUywgICBzbmRpaF9nZXROdW1iZXJDaGFubmVsc19fZG9jX199LAorIHsic2V0TnVtYmVyQ2hhbm5lbHMiLCAgKFB5Q0Z1bmN0aW9uKXNuZGloX3NldE51bWJlckNoYW5uZWxzLCAgIE1FVEhfVkFSQVJHUywgICBzbmRpaF9zZXROdW1iZXJDaGFubmVsc19fZG9jX199LAorIHsiZ2V0Q29udGludW91cyIsICAgICAgKFB5Q0Z1bmN0aW9uKXNuZGloX2dldENvbnRpbnVvdXMsICAgICAgIE1FVEhfVkFSQVJHUywgICBzbmRpaF9nZXRDb250aW51b3VzX19kb2NfX30sCisgeyJzZXRDb250aW51b3VzIiwgICAgICAoUHlDRnVuY3Rpb24pc25kaWhfc2V0Q29udGludW91cywgICAgICAgTUVUSF9WQVJBUkdTLCAgIHNuZGloX3NldENvbnRpbnVvdXNfX2RvY19ffSwKKyB7ImdldElucHV0U291cmNlTmFtZXMiLCAgICAgICAgKFB5Q0Z1bmN0aW9uKXNuZGloX2dldElucHV0U291cmNlTmFtZXMsIE1FVEhfVkFSQVJHUywgICBzbmRpaF9nZXRJbnB1dFNvdXJjZU5hbWVzX19kb2NfX30sCisgeyJnZXRJbnB1dFNvdXJjZSIsICAgICAoUHlDRnVuY3Rpb24pc25kaWhfZ2V0SW5wdXRTb3VyY2UsICAgICAgTUVUSF9WQVJBUkdTLCAgIHNuZGloX2dldElucHV0U291cmNlX19kb2NfX30sCisgeyJzZXRJbnB1dFNvdXJjZSIsICAgICAoUHlDRnVuY3Rpb24pc25kaWhfc2V0SW5wdXRTb3VyY2UsICAgICAgTUVUSF9WQVJBUkdTLCAgIHNuZGloX3NldElucHV0U291cmNlX19kb2NfX30sCisgeyJnZXRQbGF5VGhydU9uT2ZmIiwgICAoUHlDRnVuY3Rpb24pc25kaWhfZ2V0UGxheVRocnVPbk9mZiwgICAgTUVUSF9WQVJBUkdTLCAgIHNuZGloX2dldFBsYXlUaHJ1T25PZmZfX2RvY19ffSwKKyB7InNldFBsYXlUaHJ1T25PZmYiLCAgIChQeUNGdW5jdGlvbilzbmRpaF9zZXRQbGF5VGhydU9uT2ZmLCAgICBNRVRIX1ZBUkFSR1MsICAgc25kaWhfc2V0UGxheVRocnVPbk9mZl9fZG9jX199LAorIHsiZ2V0U2FtcGxlUmF0ZSIsICAgICAgKFB5Q0Z1bmN0aW9uKXNuZGloX2dldFNhbXBsZVJhdGUsICAgICAgIE1FVEhfVkFSQVJHUywgICBzbmRpaF9nZXRTYW1wbGVSYXRlX19kb2NfX30sCisgeyJzZXRTYW1wbGVSYXRlIiwgICAgICAoUHlDRnVuY3Rpb24pc25kaWhfc2V0U2FtcGxlUmF0ZSwgICAgICAgTUVUSF9WQVJBUkdTLCAgIHNuZGloX3NldFNhbXBsZVJhdGVfX2RvY19ffSwKKyB7ImdldFNhbXBsZVNpemUiLCAgICAgIChQeUNGdW5jdGlvbilzbmRpaF9nZXRTYW1wbGVTaXplLCAgICAgICBNRVRIX1ZBUkFSR1MsICAgc25kaWhfZ2V0U2FtcGxlU2l6ZV9fZG9jX199LAorIHsic2V0U2FtcGxlU2l6ZSIsICAgICAgKFB5Q0Z1bmN0aW9uKXNuZGloX3NldFNhbXBsZVNpemUsICAgICAgIE1FVEhfVkFSQVJHUywgICBzbmRpaF9zZXRTYW1wbGVTaXplX19kb2NfX30sCisgeyJnZXRTYW1wbGVTaXplQXZhaWxhYmxlIiwgICAgIChQeUNGdW5jdGlvbilzbmRpaF9nZXRTYW1wbGVTaXplQXZhaWxhYmxlLCAgICAgIE1FVEhfVkFSQVJHUywgICBzbmRpaF9nZXRTYW1wbGVTaXplQXZhaWxhYmxlX19kb2NfX30sCisgeyJnZXRTYW1wbGVSYXRlQXZhaWxhYmxlIiwgICAgIChQeUNGdW5jdGlvbilzbmRpaF9nZXRTYW1wbGVSYXRlQXZhaWxhYmxlLCAgICAgIE1FVEhfVkFSQVJHUywgICBzbmRpaF9nZXRTYW1wbGVSYXRlQXZhaWxhYmxlX19kb2NfX30sCisKKyAgICB7TlVMTCwgICAgICAgKFB5Q0Z1bmN0aW9uKU5VTEwsIDAsIE5VTEx9ICAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIAogLyogSW5pdGlhbGl6YXRpb24gZnVuY3Rpb24gZm9yIHRoZSBtb2R1bGUgKCptdXN0KiBiZSBjYWxsZWQgaW5pdFNuZGlob29rcykgKi8KIAotc3RhdGljIGNoYXIgU25kaWhvb2tzX21vZHVsZV9kb2N1bWVudGF0aW9uW10gPSAKK3N0YXRpYyBjaGFyIFNuZGlob29rc19tb2R1bGVfZG9jdW1lbnRhdGlvbltdID0KICIiCiA7CiAKIHZvaWQKIGluaXRfU25kaWhvb2tzKCkKIHsKLQlQeU9iamVjdCAqbSwgKmQ7CisgICAgUHlPYmplY3QgKm0sICpkOwogCi0JLyogQ3JlYXRlIHRoZSBtb2R1bGUgYW5kIGFkZCB0aGUgZnVuY3Rpb25zICovCi0JbSA9IFB5X0luaXRNb2R1bGU0KCJfU25kaWhvb2tzIiwgc25kaWhfbWV0aG9kcywKLQkJU25kaWhvb2tzX21vZHVsZV9kb2N1bWVudGF0aW9uLAotCQkoUHlPYmplY3QqKU5VTEwsUFlUSE9OX0FQSV9WRVJTSU9OKTsKKyAgICAvKiBDcmVhdGUgdGhlIG1vZHVsZSBhbmQgYWRkIHRoZSBmdW5jdGlvbnMgKi8KKyAgICBtID0gUHlfSW5pdE1vZHVsZTQoIl9TbmRpaG9va3MiLCBzbmRpaF9tZXRob2RzLAorICAgICAgICBTbmRpaG9va3NfbW9kdWxlX2RvY3VtZW50YXRpb24sCisgICAgICAgIChQeU9iamVjdCopTlVMTCxQWVRIT05fQVBJX1ZFUlNJT04pOwogCi0JLyogQWRkIHNvbWUgc3ltYm9saWMgY29uc3RhbnRzIHRvIHRoZSBtb2R1bGUgKi8KLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQlFcnJvck9iamVjdCA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIlNuZGlob29rcy5lcnJvciIpOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJlcnJvciIsIEVycm9yT2JqZWN0KTsKKyAgICAvKiBBZGQgc29tZSBzeW1ib2xpYyBjb25zdGFudHMgdG8gdGhlIG1vZHVsZSAqLworICAgIGQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOworICAgIEVycm9yT2JqZWN0ID0gUHlTdHJpbmdfRnJvbVN0cmluZygiU25kaWhvb2tzLmVycm9yIik7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgImVycm9yIiwgRXJyb3JPYmplY3QpOwogCi0JLyogWFhYWCBBZGQgY29uc3RhbnRzIGhlcmUgKi8KLQkKLQkvKiBDaGVjayBmb3IgZXJyb3JzICovCi0JaWYgKFB5RXJyX09jY3VycmVkKCkpCi0JCVB5X0ZhdGFsRXJyb3IoImNhbid0IGluaXRpYWxpemUgbW9kdWxlIFNuZGlob29rcyIpOworICAgIC8qIFhYWFggQWRkIGNvbnN0YW50cyBoZXJlICovCisKKyAgICAvKiBDaGVjayBmb3IgZXJyb3JzICovCisgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoImNhbid0IGluaXRpYWxpemUgbW9kdWxlIFNuZGlob29rcyIpOwogfQogCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9zbmQvX1NuZG1vZHVsZS5jIGIvTWFjL01vZHVsZXMvc25kL19TbmRtb2R1bGUuYwppbmRleCBjMGM3MzlhLi4zNWNkNDAwIDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9zbmQvX1NuZG1vZHVsZS5jCisrKyBiL01hYy9Nb2R1bGVzL3NuZC9fU25kbW9kdWxlLmMKQEAgLTEwLDkgKzEwLDkgQEAKIAogLyogTWFjcm8gdG8gdGVzdCB3aGV0aGVyIGEgd2Vhay1sb2FkZWQgQ0ZNIGZ1bmN0aW9uIGV4aXN0cyAqLwogI2RlZmluZSBQeU1hY19QUkVDSEVDSyhydG4pIGRvIHsgaWYgKCAmcnRuID09IE5VTEwgKSAge1wKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsIFwKLSAgICAgICAgIk5vdCBhdmFpbGFibGUgaW4gdGhpcyBzaGFyZWQgbGlicmFyeS9PUyB2ZXJzaW9uIik7IFwKLSAgICAgICAgcmV0dXJuIE5VTEw7IFwKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgXAorICAgICJOb3QgYXZhaWxhYmxlIGluIHRoaXMgc2hhcmVkIGxpYnJhcnkvT1MgdmVyc2lvbiIpOyBcCisgICAgcmV0dXJuIE5VTEw7IFwKICAgICB9fSB3aGlsZSgwKQogCiAKQEAgLTIyLDE2ICsyMiwxNiBAQAogc3RhdGljIGludAogU25kQ21kX0NvbnZlcnQoUHlPYmplY3QgKnYsIFNuZENvbW1hbmQgKnBjKQogewotICAgICAgICBpbnQgbGVuOwotICAgICAgICBwYy0+cGFyYW0xID0gMDsKLSAgICAgICAgcGMtPnBhcmFtMiA9IDA7Ci0gICAgICAgIGlmIChQeVR1cGxlX0NoZWNrKHYpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKFB5QXJnX1BhcnNlVHVwbGUodiwgImh8aGwiLCAmcGMtPmNtZCwgJnBjLT5wYXJhbTEsICZwYy0+cGFyYW0yKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFB5QXJnX1BhcnNlVHVwbGUodiwgIkhocyMiLCAmcGMtPmNtZCwgJnBjLT5wYXJhbTEsICZwYy0+cGFyYW0yLCAmbGVuKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gUHlBcmdfUGFyc2UodiwgIkgiLCAmcGMtPmNtZCk7CisgICAgaW50IGxlbjsKKyAgICBwYy0+cGFyYW0xID0gMDsKKyAgICBwYy0+cGFyYW0yID0gMDsKKyAgICBpZiAoUHlUdXBsZV9DaGVjayh2KSkgeworICAgICAgICBpZiAoUHlBcmdfUGFyc2VUdXBsZSh2LCAiaHxobCIsICZwYy0+Y21kLCAmcGMtPnBhcmFtMSwgJnBjLT5wYXJhbTIpKQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIHJldHVybiBQeUFyZ19QYXJzZVR1cGxlKHYsICJIaHMjIiwgJnBjLT5jbWQsICZwYy0+cGFyYW0xLCAmcGMtPnBhcmFtMiwgJmxlbik7CisgICAgfQorICAgIHJldHVybiBQeUFyZ19QYXJzZSh2LCAiSCIsICZwYy0+Y21kKTsKIH0KIAogc3RhdGljIHBhc2NhbCB2b2lkIFNuZENoX1VzZXJSb3V0aW5lKFNuZENoYW5uZWxQdHIgY2hhbiwgU25kQ29tbWFuZCAqY21kKTsgLyogRm9yd2FyZCAqLwpAQCAtNDYsMTU2ICs0NiwxNTYgQEAKICNkZWZpbmUgU25kQ2hfQ2hlY2soeCkgKCh4KS0+b2JfdHlwZSA9PSAmU25kQ2hhbm5lbF9UeXBlIHx8IFB5T2JqZWN0X1R5cGVDaGVjaygoeCksICZTbmRDaGFubmVsX1R5cGUpKQogCiB0eXBlZGVmIHN0cnVjdCBTbmRDaGFubmVsT2JqZWN0IHsKLQlQeU9iamVjdF9IRUFECi0JU25kQ2hhbm5lbFB0ciBvYl9pdHNlbGY7Ci0JLyogTWVtYmVycyB1c2VkIHRvIGltcGxlbWVudCBjYWxsYmFja3M6ICovCi0JUHlPYmplY3QgKm9iX2NhbGxiYWNrOwotCWxvbmcgb2JfQTU7Ci0JU25kQ29tbWFuZCBvYl9jbWQ7CisgICAgUHlPYmplY3RfSEVBRAorICAgIFNuZENoYW5uZWxQdHIgb2JfaXRzZWxmOworICAgIC8qIE1lbWJlcnMgdXNlZCB0byBpbXBsZW1lbnQgY2FsbGJhY2tzOiAqLworICAgIFB5T2JqZWN0ICpvYl9jYWxsYmFjazsKKyAgICBsb25nIG9iX0E1OworICAgIFNuZENvbW1hbmQgb2JfY21kOwogfSBTbmRDaGFubmVsT2JqZWN0OwogCiBzdGF0aWMgUHlPYmplY3QgKlNuZENoX05ldyhTbmRDaGFubmVsUHRyIGl0c2VsZikKIHsKLQlTbmRDaGFubmVsT2JqZWN0ICppdDsKLQlpdCA9IFB5T2JqZWN0X05FVyhTbmRDaGFubmVsT2JqZWN0LCAmU25kQ2hhbm5lbF9UeXBlKTsKLQlpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlpdC0+b2JfY2FsbGJhY2sgPSBOVUxMOwotCWl0LT5vYl9BNSA9IFNldEN1cnJlbnRBNSgpOwotCXJldHVybiAoUHlPYmplY3QgKilpdDsKKyAgICBTbmRDaGFubmVsT2JqZWN0ICppdDsKKyAgICBpdCA9IFB5T2JqZWN0X05FVyhTbmRDaGFubmVsT2JqZWN0LCAmU25kQ2hhbm5lbF9UeXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICBpdC0+b2JfY2FsbGJhY2sgPSBOVUxMOworICAgIGl0LT5vYl9BNSA9IFNldEN1cnJlbnRBNSgpOworICAgIHJldHVybiAoUHlPYmplY3QgKilpdDsKIH0KIAogc3RhdGljIHZvaWQgU25kQ2hfZGVhbGxvYyhTbmRDaGFubmVsT2JqZWN0ICpzZWxmKQogewotCVNuZERpc3Bvc2VDaGFubmVsKHNlbGYtPm9iX2l0c2VsZiwgMSk7Ci0JUHlfWERFQ1JFRihzZWxmLT5vYl9jYWxsYmFjayk7Ci0JUHlPYmplY3RfRnJlZSgoUHlPYmplY3QgKilzZWxmKTsKKyAgICBTbmREaXNwb3NlQ2hhbm5lbChzZWxmLT5vYl9pdHNlbGYsIDEpOworICAgIFB5X1hERUNSRUYoc2VsZi0+b2JfY2FsbGJhY2spOworICAgIFB5T2JqZWN0X0ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqU25kQ2hfU25kRG9Db21tYW5kKFNuZENoYW5uZWxPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU25kQ29tbWFuZCBjbWQ7Ci0JQm9vbGVhbiBub1dhaXQ7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgU25kQ21kX0NvbnZlcnQsICZjbWQsCi0JICAgICAgICAgICAgICAgICAgICAgICZub1dhaXQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU25kRG9Db21tYW5kKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAmY21kLAotCSAgICAgICAgICAgICAgICAgICAgbm9XYWl0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTbmRDb21tYW5kIGNtZDsKKyAgICBCb29sZWFuIG5vV2FpdDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTbmRDbWRfQ29udmVydCwgJmNtZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm5vV2FpdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTbmREb0NvbW1hbmQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICZjbWQsCisgICAgICAgICAgICAgICAgICAgICAgICBub1dhaXQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlNuZENoX1NuZERvSW1tZWRpYXRlKFNuZENoYW5uZWxPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU25kQ29tbWFuZCBjbWQ7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBTbmRDbWRfQ29udmVydCwgJmNtZCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTbmREb0ltbWVkaWF0ZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAmY21kKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTbmRDb21tYW5kIGNtZDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNuZENtZF9Db252ZXJ0LCAmY21kKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNuZERvSW1tZWRpYXRlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjbWQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlNuZENoX1NuZFBsYXkoU25kQ2hhbm5lbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlTbmRMaXN0SGFuZGxlIHNuZEhhbmRsZTsKLQlCb29sZWFuIGFzeW5jOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc25kSGFuZGxlLAotCSAgICAgICAgICAgICAgICAgICAgICAmYXN5bmMpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU25kUGxheShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgIHNuZEhhbmRsZSwKLQkgICAgICAgICAgICAgICBhc3luYyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU25kTGlzdEhhbmRsZSBzbmRIYW5kbGU7CisgICAgQm9vbGVhbiBhc3luYzsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNuZEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFzeW5jKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNuZFBsYXkoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICBzbmRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgYXN5bmMpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlNuZENoX1NuZENoYW5uZWxTdGF0dXMoU25kQ2hhbm5lbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlzaG9ydCB0aGVMZW5ndGg7Ci0JU0NTdGF0dXMgdGhlU3RhdHVzX19vdXRfXzsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRoZUxlbmd0aCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTbmRDaGFubmVsU3RhdHVzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgdGhlTGVuZ3RoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVTdGF0dXNfX291dF9fKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJzIyIsCi0JICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikmdGhlU3RhdHVzX19vdXRfXywgKGludClzaXplb2YoU0NTdGF0dXMpKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBzaG9ydCB0aGVMZW5ndGg7CisgICAgU0NTdGF0dXMgdGhlU3RhdHVzX19vdXRfXzsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUxlbmd0aCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTbmRDaGFubmVsU3RhdHVzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVTdGF0dXNfX291dF9fKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJzIyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikmdGhlU3RhdHVzX19vdXRfXywgKGludClzaXplb2YoU0NTdGF0dXMpKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpTbmRDaF9TbmRHZXRJbmZvKFNuZENoYW5uZWxPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JT1NUeXBlIHNlbGVjdG9yOwotCXZvaWQgKiBpbmZvUHRyOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mdyIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnNlbGVjdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5mb1B0cikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTbmRHZXRJbmZvKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgc2VsZWN0b3IsCi0JICAgICAgICAgICAgICAgICAgaW5mb1B0cik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgT1NUeXBlIHNlbGVjdG9yOworICAgIHZvaWQgKiBpbmZvUHRyOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mdyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnNlbGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5mb1B0cikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTbmRHZXRJbmZvKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgaW5mb1B0cik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqU25kQ2hfU25kU2V0SW5mbyhTbmRDaGFubmVsT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCU9TVHlwZSBzZWxlY3RvcjsKLQl2b2lkICogaW5mb1B0cjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnciLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZzZWxlY3RvciwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluZm9QdHIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU25kU2V0SW5mbyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgIHNlbGVjdG9yLAotCSAgICAgICAgICAgICAgICAgIGluZm9QdHIpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIE9TVHlwZSBzZWxlY3RvcjsKKyAgICB2b2lkICogaW5mb1B0cjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnciLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZzZWxlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZm9QdHIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU25kU2V0SW5mbyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgIGluZm9QdHIpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgU25kQ2hfbWV0aG9kc1tdID0gewotCXsiU25kRG9Db21tYW5kIiwgKFB5Q0Z1bmN0aW9uKVNuZENoX1NuZERvQ29tbWFuZCwgMSwKLQkgUHlEb2NfU1RSKCIoU25kQ29tbWFuZCBjbWQsIEJvb2xlYW4gbm9XYWl0KSAtPiBOb25lIil9LAotCXsiU25kRG9JbW1lZGlhdGUiLCAoUHlDRnVuY3Rpb24pU25kQ2hfU25kRG9JbW1lZGlhdGUsIDEsCi0JIFB5RG9jX1NUUigiKFNuZENvbW1hbmQgY21kKSAtPiBOb25lIil9LAotCXsiU25kUGxheSIsIChQeUNGdW5jdGlvbilTbmRDaF9TbmRQbGF5LCAxLAotCSBQeURvY19TVFIoIihTbmRMaXN0SGFuZGxlIHNuZEhhbmRsZSwgQm9vbGVhbiBhc3luYykgLT4gTm9uZSIpfSwKLQl7IlNuZENoYW5uZWxTdGF0dXMiLCAoUHlDRnVuY3Rpb24pU25kQ2hfU25kQ2hhbm5lbFN0YXR1cywgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgdGhlTGVuZ3RoKSAtPiAoU0NTdGF0dXMgdGhlU3RhdHVzKSIpfSwKLQl7IlNuZEdldEluZm8iLCAoUHlDRnVuY3Rpb24pU25kQ2hfU25kR2V0SW5mbywgMSwKLQkgUHlEb2NfU1RSKCIoT1NUeXBlIHNlbGVjdG9yLCB2b2lkICogaW5mb1B0cikgLT4gTm9uZSIpfSwKLQl7IlNuZFNldEluZm8iLCAoUHlDRnVuY3Rpb24pU25kQ2hfU25kU2V0SW5mbywgMSwKLQkgUHlEb2NfU1RSKCIoT1NUeXBlIHNlbGVjdG9yLCB2b2lkICogaW5mb1B0cikgLT4gTm9uZSIpfSwKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7IlNuZERvQ29tbWFuZCIsIChQeUNGdW5jdGlvbilTbmRDaF9TbmREb0NvbW1hbmQsIDEsCisgICAgIFB5RG9jX1NUUigiKFNuZENvbW1hbmQgY21kLCBCb29sZWFuIG5vV2FpdCkgLT4gTm9uZSIpfSwKKyAgICB7IlNuZERvSW1tZWRpYXRlIiwgKFB5Q0Z1bmN0aW9uKVNuZENoX1NuZERvSW1tZWRpYXRlLCAxLAorICAgICBQeURvY19TVFIoIihTbmRDb21tYW5kIGNtZCkgLT4gTm9uZSIpfSwKKyAgICB7IlNuZFBsYXkiLCAoUHlDRnVuY3Rpb24pU25kQ2hfU25kUGxheSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU25kTGlzdEhhbmRsZSBzbmRIYW5kbGUsIEJvb2xlYW4gYXN5bmMpIC0+IE5vbmUiKX0sCisgICAgeyJTbmRDaGFubmVsU3RhdHVzIiwgKFB5Q0Z1bmN0aW9uKVNuZENoX1NuZENoYW5uZWxTdGF0dXMsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IHRoZUxlbmd0aCkgLT4gKFNDU3RhdHVzIHRoZVN0YXR1cykiKX0sCisgICAgeyJTbmRHZXRJbmZvIiwgKFB5Q0Z1bmN0aW9uKVNuZENoX1NuZEdldEluZm8sIDEsCisgICAgIFB5RG9jX1NUUigiKE9TVHlwZSBzZWxlY3Rvciwgdm9pZCAqIGluZm9QdHIpIC0+IE5vbmUiKX0sCisgICAgeyJTbmRTZXRJbmZvIiwgKFB5Q0Z1bmN0aW9uKVNuZENoX1NuZFNldEluZm8sIDEsCisgICAgIFB5RG9jX1NUUigiKE9TVHlwZSBzZWxlY3Rvciwgdm9pZCAqIGluZm9QdHIpIC0+IE5vbmUiKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAjZGVmaW5lIFNuZENoX2dldHNldGxpc3QgTlVMTApAQCAtMjA4LDQ3ICsyMDgsNDcgQEAKICNkZWZpbmUgU25kQ2hfaGFzaCBOVUxMCiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgU25kQ2hhbm5lbF9UeXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQotCTAsIC8qb2Jfc2l6ZSovCi0JIl9TbmQuU25kQ2hhbm5lbCIsIC8qdHBfbmFtZSovCi0Jc2l6ZW9mKFNuZENoYW5uZWxPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCi0JMCwgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKSBTbmRDaF9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsIC8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLwotCShjbXBmdW5jKSBTbmRDaF9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYykgU25kQ2hfcmVwciwgLyp0cF9yZXByKi8KLQkoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCi0JKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpIFNuZENoX2hhc2gsIC8qdHBfaGFzaCovCi0JMCwgLyp0cF9jYWxsKi8KLQkwLCAvKnRwX3N0ciovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLwotCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCi0JMCwgLyp0cF9hc19idWZmZXIqLwotCVB5X1RQRkxBR1NfREVGQVVMVCwgLyogdHBfZmxhZ3MgKi8KLQkwLCAvKnRwX2RvYyovCi0JMCwgLyp0cF90cmF2ZXJzZSovCi0JMCwgLyp0cF9jbGVhciovCi0JMCwgLyp0cF9yaWNoY29tcGFyZSovCi0JMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCi0JMCwgLyp0cF9pdGVyKi8KLQkwLCAvKnRwX2l0ZXJuZXh0Ki8KLQlTbmRDaF9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCi0JMCwgLyp0cF9tZW1iZXJzKi8KLQlTbmRDaF9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCi0JMCwgLyp0cF9iYXNlKi8KLQkwLCAvKnRwX2RpY3QqLwotCTAsIC8qdHBfZGVzY3JfZ2V0Ki8KLQkwLCAvKnRwX2Rlc2NyX3NldCovCi0JMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KLQkwLCAvKnRwX2luaXQqLwotCTAsIC8qdHBfYWxsb2MqLwotCTAsIC8qdHBfbmV3Ki8KLQkwLCAvKnRwX2ZyZWUqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgIDAsIC8qb2Jfc2l6ZSovCisgICAgIl9TbmQuU25kQ2hhbm5lbCIsIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKFNuZENoYW5uZWxPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKSBTbmRDaF9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgIDAsIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLworICAgIChzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLworICAgIChjbXBmdW5jKSBTbmRDaF9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLworICAgIChyZXByZnVuYykgU25kQ2hfcmVwciwgLyp0cF9yZXByKi8KKyAgICAoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCisgICAgKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAoaGFzaGZ1bmMpIFNuZENoX2hhc2gsIC8qdHBfaGFzaCovCisgICAgMCwgLyp0cF9jYWxsKi8KKyAgICAwLCAvKnRwX3N0ciovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLworICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCisgICAgMCwgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCwgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAvKnRwX2RvYyovCisgICAgMCwgLyp0cF90cmF2ZXJzZSovCisgICAgMCwgLyp0cF9jbGVhciovCisgICAgMCwgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgLyp0cF9pdGVyKi8KKyAgICAwLCAvKnRwX2l0ZXJuZXh0Ki8KKyAgICBTbmRDaF9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCisgICAgMCwgLyp0cF9tZW1iZXJzKi8KKyAgICBTbmRDaF9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCisgICAgMCwgLyp0cF9iYXNlKi8KKyAgICAwLCAvKnRwX2RpY3QqLworICAgIDAsIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICAwLCAvKnRwX2luaXQqLworICAgIDAsIC8qdHBfYWxsb2MqLworICAgIDAsIC8qdHBfbmV3Ki8KKyAgICAwLCAvKnRwX2ZyZWUqLwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLSBFbmQgb2JqZWN0IHR5cGUgU25kQ2hhbm5lbCAtLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0yNjEsODkgKzI2MSw4OSBAQAogI2RlZmluZSBTUEJPYmpfQ2hlY2soeCkgKCh4KS0+b2JfdHlwZSA9PSAmU1BCX1R5cGUgfHwgUHlPYmplY3RfVHlwZUNoZWNrKCh4KSwgJlNQQl9UeXBlKSkKIAogdHlwZWRlZiBzdHJ1Y3QgU1BCT2JqZWN0IHsKLQlQeU9iamVjdF9IRUFECi0JLyogTWVtYmVycyB1c2VkIHRvIGltcGxlbWVudCBjYWxsYmFja3M6ICovCi0JUHlPYmplY3QgKm9iX2NvbXBsZXRpb247Ci0JUHlPYmplY3QgKm9iX2ludGVycnVwdDsKLQlQeU9iamVjdCAqb2JfdGhpc2NhbGxiYWNrOwotCWxvbmcgb2JfQTU7Ci0JU1BCIG9iX3NwYjsKKyAgICBQeU9iamVjdF9IRUFECisgICAgLyogTWVtYmVycyB1c2VkIHRvIGltcGxlbWVudCBjYWxsYmFja3M6ICovCisgICAgUHlPYmplY3QgKm9iX2NvbXBsZXRpb247CisgICAgUHlPYmplY3QgKm9iX2ludGVycnVwdDsKKyAgICBQeU9iamVjdCAqb2JfdGhpc2NhbGxiYWNrOworICAgIGxvbmcgb2JfQTU7CisgICAgU1BCIG9iX3NwYjsKIH0gU1BCT2JqZWN0OwogCiBzdGF0aWMgUHlPYmplY3QgKlNQQk9ial9OZXcodm9pZCkKIHsKLQlTUEJPYmplY3QgKml0OwotCWl0ID0gUHlPYmplY3RfTkVXKFNQQk9iamVjdCwgJlNQQl9UeXBlKTsKLQlpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JaXQtPm9iX2NvbXBsZXRpb24gPSBOVUxMOwotCWl0LT5vYl9pbnRlcnJ1cHQgPSBOVUxMOwotCWl0LT5vYl90aGlzY2FsbGJhY2sgPSBOVUxMOwotCWl0LT5vYl9BNSA9IFNldEN1cnJlbnRBNSgpOwotCW1lbXNldCgoY2hhciAqKSZpdC0+b2Jfc3BiLCAwLCBzaXplb2YoaXQtPm9iX3NwYikpOwotCWl0LT5vYl9zcGIudXNlckxvbmcgPSAobG9uZylpdDsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgU1BCT2JqZWN0ICppdDsKKyAgICBpdCA9IFB5T2JqZWN0X05FVyhTUEJPYmplY3QsICZTUEJfVHlwZSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIGl0LT5vYl9jb21wbGV0aW9uID0gTlVMTDsKKyAgICBpdC0+b2JfaW50ZXJydXB0ID0gTlVMTDsKKyAgICBpdC0+b2JfdGhpc2NhbGxiYWNrID0gTlVMTDsKKyAgICBpdC0+b2JfQTUgPSBTZXRDdXJyZW50QTUoKTsKKyAgICBtZW1zZXQoKGNoYXIgKikmaXQtPm9iX3NwYiwgMCwgc2l6ZW9mKGl0LT5vYl9zcGIpKTsKKyAgICBpdC0+b2Jfc3BiLnVzZXJMb25nID0gKGxvbmcpaXQ7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogc3RhdGljIGludCBTUEJPYmpfQ29udmVydChQeU9iamVjdCAqdiwgU1BCUHRyICpwX2l0c2VsZikKIHsKLQlpZiAoIVNQQk9ial9DaGVjayh2KSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJTUEIgcmVxdWlyZWQiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCSpwX2l0c2VsZiA9ICYoKFNQQk9iamVjdCAqKXYpLT5vYl9zcGI7Ci0JcmV0dXJuIDE7CisgICAgaWYgKCFTUEJPYmpfQ2hlY2sodikpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiU1BCIHJlcXVpcmVkIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAqcF9pdHNlbGYgPSAmKChTUEJPYmplY3QgKil2KS0+b2Jfc3BiOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgdm9pZCBTUEJPYmpfZGVhbGxvYyhTUEJPYmplY3QgKnNlbGYpCiB7Ci0JLyogQ2xlYW51cCBvZiBzZWxmLT5vYl9pdHNlbGYgZ29lcyBoZXJlICovCi0Jc2VsZi0+b2Jfc3BiLnVzZXJMb25nID0gMDsKLQlzZWxmLT5vYl90aGlzY2FsbGJhY2sgPSAwOwotCVB5X1hERUNSRUYoc2VsZi0+b2JfY29tcGxldGlvbik7Ci0JUHlfWERFQ1JFRihzZWxmLT5vYl9pbnRlcnJ1cHQpOwotCVB5T2JqZWN0X0ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CisgICAgLyogQ2xlYW51cCBvZiBzZWxmLT5vYl9pdHNlbGYgZ29lcyBoZXJlICovCisgICAgc2VsZi0+b2Jfc3BiLnVzZXJMb25nID0gMDsKKyAgICBzZWxmLT5vYl90aGlzY2FsbGJhY2sgPSAwOworICAgIFB5X1hERUNSRUYoc2VsZi0+b2JfY29tcGxldGlvbik7CisgICAgUHlfWERFQ1JFRihzZWxmLT5vYl9pbnRlcnJ1cHQpOworICAgIFB5T2JqZWN0X0ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBTUEJPYmpfbWV0aG9kc1tdID0gewotCXtOVUxMLCBOVUxMLCAwfQorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogc3RhdGljIFB5T2JqZWN0ICpTUEJPYmpfZ2V0X2luUmVmTnVtKFNQQk9iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgibCIsIHNlbGYtPm9iX3NwYi5pblJlZk51bSk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImwiLCBzZWxmLT5vYl9zcGIuaW5SZWZOdW0pOwogfQogCiBzdGF0aWMgaW50IFNQQk9ial9zZXRfaW5SZWZOdW0oU1BCT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gLTEgKyBQeUFyZ19QYXJzZSh2LCAibCIsICZzZWxmLT5vYl9zcGIuaW5SZWZOdW0pOwotCXJldHVybiAwOworICAgIHJldHVybiAtMSArIFB5QXJnX1BhcnNlKHYsICJsIiwgJnNlbGYtPm9iX3NwYi5pblJlZk51bSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqU1BCT2JqX2dldF9jb3VudChTUEJPYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImwiLCBzZWxmLT5vYl9zcGIuY291bnQpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJsIiwgc2VsZi0+b2Jfc3BiLmNvdW50KTsKIH0KIAogc3RhdGljIGludCBTUEJPYmpfc2V0X2NvdW50KFNQQk9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIC0xICsgUHlBcmdfUGFyc2UodiwgImwiLCAmc2VsZi0+b2Jfc3BiLmNvdW50KTsKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gLTEgKyBQeUFyZ19QYXJzZSh2LCAibCIsICZzZWxmLT5vYl9zcGIuY291bnQpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlNQQk9ial9nZXRfbWlsbGlzZWNvbmRzKFNQQk9iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgibCIsIHNlbGYtPm9iX3NwYi5taWxsaXNlY29uZHMpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJsIiwgc2VsZi0+b2Jfc3BiLm1pbGxpc2Vjb25kcyk7CiB9CiAKIHN0YXRpYyBpbnQgU1BCT2JqX3NldF9taWxsaXNlY29uZHMoU1BCT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gLTEgKyBQeUFyZ19QYXJzZSh2LCAibCIsICZzZWxmLT5vYl9zcGIubWlsbGlzZWNvbmRzKTsKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gLTEgKyBQeUFyZ19QYXJzZSh2LCAibCIsICZzZWxmLT5vYl9zcGIubWlsbGlzZWNvbmRzKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpTUEJPYmpfZ2V0X2Vycm9yKFNQQk9iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaCIsIHNlbGYtPm9iX3NwYi5lcnJvcik7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImgiLCBzZWxmLT5vYl9zcGIuZXJyb3IpOwogfQogCiAjZGVmaW5lIFNQQk9ial9zZXRfZXJyb3IgTlVMTApAQCAtMzUyLDIwICszNTIsMjAgQEAKIAogc3RhdGljIGludCBTUEJPYmpfc2V0X2NvbXBsZXRpb25Sb3V0aW5lKFNQQk9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0Jc2VsZi0+b2Jfc3BiLmNvbXBsZXRpb25Sb3V0aW5lID0gTmV3U0lDb21wbGV0aW9uVVBQKFNQQl9jb21wbGV0aW9uKTsKLQkgICAgICAgICAgICBzZWxmLT5vYl9jb21wbGV0aW9uID0gdjsKLQkgICAgICAgICAgICBQeV9JTkNSRUYodik7Ci0JICAgICAgICAgICAgcmV0dXJuIDA7Ci0JcmV0dXJuIDA7CisgICAgc2VsZi0+b2Jfc3BiLmNvbXBsZXRpb25Sb3V0aW5lID0gTmV3U0lDb21wbGV0aW9uVVBQKFNQQl9jb21wbGV0aW9uKTsKKyAgICAgICAgICAgICAgICBzZWxmLT5vYl9jb21wbGV0aW9uID0gdjsKKyAgICAgICAgICAgICAgICBQeV9JTkNSRUYodik7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeUdldFNldERlZiBTUEJPYmpfZ2V0c2V0bGlzdFtdID0gewotCXsiaW5SZWZOdW0iLCAoZ2V0dGVyKVNQQk9ial9nZXRfaW5SZWZOdW0sIChzZXR0ZXIpU1BCT2JqX3NldF9pblJlZk51bSwgTlVMTH0sCi0JeyJjb3VudCIsIChnZXR0ZXIpU1BCT2JqX2dldF9jb3VudCwgKHNldHRlcilTUEJPYmpfc2V0X2NvdW50LCBOVUxMfSwKLQl7Im1pbGxpc2Vjb25kcyIsIChnZXR0ZXIpU1BCT2JqX2dldF9taWxsaXNlY29uZHMsIChzZXR0ZXIpU1BCT2JqX3NldF9taWxsaXNlY29uZHMsIE5VTEx9LAotCXsiZXJyb3IiLCAoZ2V0dGVyKVNQQk9ial9nZXRfZXJyb3IsIChzZXR0ZXIpU1BCT2JqX3NldF9lcnJvciwgTlVMTH0sCi0JeyJjb21wbGV0aW9uUm91dGluZSIsIChnZXR0ZXIpU1BCT2JqX2dldF9jb21wbGV0aW9uUm91dGluZSwgKHNldHRlcilTUEJPYmpfc2V0X2NvbXBsZXRpb25Sb3V0aW5lLCBOVUxMfSwKLQl7TlVMTCwgTlVMTCwgTlVMTCwgTlVMTH0sCisgICAgeyJpblJlZk51bSIsIChnZXR0ZXIpU1BCT2JqX2dldF9pblJlZk51bSwgKHNldHRlcilTUEJPYmpfc2V0X2luUmVmTnVtLCBOVUxMfSwKKyAgICB7ImNvdW50IiwgKGdldHRlcilTUEJPYmpfZ2V0X2NvdW50LCAoc2V0dGVyKVNQQk9ial9zZXRfY291bnQsIE5VTEx9LAorICAgIHsibWlsbGlzZWNvbmRzIiwgKGdldHRlcilTUEJPYmpfZ2V0X21pbGxpc2Vjb25kcywgKHNldHRlcilTUEJPYmpfc2V0X21pbGxpc2Vjb25kcywgTlVMTH0sCisgICAgeyJlcnJvciIsIChnZXR0ZXIpU1BCT2JqX2dldF9lcnJvciwgKHNldHRlcilTUEJPYmpfc2V0X2Vycm9yLCBOVUxMfSwKKyAgICB7ImNvbXBsZXRpb25Sb3V0aW5lIiwgKGdldHRlcilTUEJPYmpfZ2V0X2NvbXBsZXRpb25Sb3V0aW5lLCAoc2V0dGVyKVNQQk9ial9zZXRfY29tcGxldGlvblJvdXRpbmUsIE5VTEx9LAorICAgIHtOVUxMLCBOVUxMLCBOVUxMLCBOVUxMfSwKIH07CiAKIApAQCAtMzc2LDQ3ICszNzYsNDcgQEAKICNkZWZpbmUgU1BCT2JqX2hhc2ggTlVMTAogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IFNQQl9UeXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQotCTAsIC8qb2Jfc2l6ZSovCi0JIl9TbmQuU1BCIiwgLyp0cF9uYW1lKi8KLQlzaXplb2YoU1BCT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLwotCTAsIC8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcikgU1BCT2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCi0JMCwgLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCi0JKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCi0JKGNtcGZ1bmMpIFNQQk9ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYykgU1BCT2JqX3JlcHIsIC8qdHBfcmVwciovCi0JKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLwotCShQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCi0JKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCi0JKGhhc2hmdW5jKSBTUEJPYmpfaGFzaCwgLyp0cF9oYXNoKi8KLQkwLCAvKnRwX2NhbGwqLwotCTAsIC8qdHBfc3RyKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCi0JUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KLQkwLCAvKnRwX2FzX2J1ZmZlciovCi0JUHlfVFBGTEFHU19ERUZBVUxULCAvKiB0cF9mbGFncyAqLwotCTAsIC8qdHBfZG9jKi8KLQkwLCAvKnRwX3RyYXZlcnNlKi8KLQkwLCAvKnRwX2NsZWFyKi8KLQkwLCAvKnRwX3JpY2hjb21wYXJlKi8KLQkwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLQkwLCAvKnRwX2l0ZXIqLwotCTAsIC8qdHBfaXRlcm5leHQqLwotCVNQQk9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCi0JMCwgLyp0cF9tZW1iZXJzKi8KLQlTUEJPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLwotCTAsIC8qdHBfYmFzZSovCi0JMCwgLyp0cF9kaWN0Ki8KLQkwLCAvKnRwX2Rlc2NyX2dldCovCi0JMCwgLyp0cF9kZXNjcl9zZXQqLwotCTAsIC8qdHBfZGljdG9mZnNldCovCi0JMCwgLyp0cF9pbml0Ki8KLQkwLCAvKnRwX2FsbG9jKi8KLQkwLCAvKnRwX25ldyovCi0JMCwgLyp0cF9mcmVlKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAvKm9iX3NpemUqLworICAgICJfU25kLlNQQiIsIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKFNQQk9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpIFNQQk9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgIDAsIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLworICAgIChzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLworICAgIChjbXBmdW5jKSBTUEJPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpIFNQQk9ial9yZXByLCAvKnRwX3JlcHIqLworICAgIChQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIChQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLworICAgIChoYXNoZnVuYykgU1BCT2JqX2hhc2gsIC8qdHBfaGFzaCovCisgICAgMCwgLyp0cF9jYWxsKi8KKyAgICAwLCAvKnRwX3N0ciovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLworICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCisgICAgMCwgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCwgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAvKnRwX2RvYyovCisgICAgMCwgLyp0cF90cmF2ZXJzZSovCisgICAgMCwgLyp0cF9jbGVhciovCisgICAgMCwgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgLyp0cF9pdGVyKi8KKyAgICAwLCAvKnRwX2l0ZXJuZXh0Ki8KKyAgICBTUEJPYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLworICAgIDAsIC8qdHBfbWVtYmVycyovCisgICAgU1BCT2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KKyAgICAwLCAvKnRwX2Jhc2UqLworICAgIDAsIC8qdHBfZGljdCovCisgICAgMCwgLyp0cF9kZXNjcl9nZXQqLworICAgIDAsIC8qdHBfZGVzY3Jfc2V0Ki8KKyAgICAwLCAvKnRwX2RpY3RvZmZzZXQqLworICAgIDAsIC8qdHBfaW5pdCovCisgICAgMCwgLyp0cF9hbGxvYyovCisgICAgMCwgLyp0cF9uZXcqLworICAgIDAsIC8qdHBfZnJlZSovCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEVuZCBvYmplY3QgdHlwZSBTUEIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTQyNCw2MzQgKzQyNCw2MzQgQEAKIAogc3RhdGljIFB5T2JqZWN0ICpTbmRfU1BCKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlfcmVzID0gU1BCT2JqX05ldygpOyByZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgX3JlcyA9IFNQQk9ial9OZXcoKTsgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqU25kX1N5c0JlZXAoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IGR1cmF0aW9uOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZHVyYXRpb24pKQotCQlyZXR1cm4gTlVMTDsKLQlTeXNCZWVwKGR1cmF0aW9uKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IGR1cmF0aW9uOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZHVyYXRpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTeXNCZWVwKGR1cmF0aW9uKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqU25kX1NuZE5ld0NoYW5uZWwoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU25kQ2hhbm5lbFB0ciBjaGFuID0gMDsKLQlzaG9ydCBzeW50aDsKLQlsb25nIGluaXQ7Ci0JUHlPYmplY3QqIHVzZXJSb3V0aW5lOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsTyIsCi0JICAgICAgICAgICAgICAgICAgICAgICZzeW50aCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluaXQsCi0JICAgICAgICAgICAgICAgICAgICAgICZ1c2VyUm91dGluZSkpCi0JCXJldHVybiBOVUxMOwotCWlmICh1c2VyUm91dGluZSAhPSBQeV9Ob25lICYmICFQeUNhbGxhYmxlX0NoZWNrKHVzZXJSb3V0aW5lKSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJjYWxsYmFjayBtdXN0IGJlIGNhbGxhYmxlIik7Ci0JCWdvdG8gdXNlclJvdXRpbmVfX2Vycm9yX187Ci0JfQotCV9lcnIgPSBTbmROZXdDaGFubmVsKCZjaGFuLAotCSAgICAgICAgICAgICAgICAgICAgIHN5bnRoLAotCSAgICAgICAgICAgICAgICAgICAgIGluaXQsCi0JICAgICAgICAgICAgICAgICAgICAgTmV3U25kQ2FsbEJhY2tVUFAoU25kQ2hfVXNlclJvdXRpbmUpKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgU25kQ2hfTmV3LCBjaGFuKTsKLQlpZiAoX3JlcyAhPSBOVUxMICYmIHVzZXJSb3V0aW5lICE9IFB5X05vbmUpCi0JewotCQlTbmRDaGFubmVsT2JqZWN0ICpwID0gKFNuZENoYW5uZWxPYmplY3QgKilfcmVzOwotCQlwLT5vYl9pdHNlbGYtPnVzZXJJbmZvID0gKGxvbmcpcDsKLQkJUHlfSU5DUkVGKHVzZXJSb3V0aW5lKTsKLQkJcC0+b2JfY2FsbGJhY2sgPSB1c2VyUm91dGluZTsKLQl9CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU25kQ2hhbm5lbFB0ciBjaGFuID0gMDsKKyAgICBzaG9ydCBzeW50aDsKKyAgICBsb25nIGluaXQ7CisgICAgUHlPYmplY3QqIHVzZXJSb3V0aW5lOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsTyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzeW50aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ1c2VyUm91dGluZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICh1c2VyUm91dGluZSAhPSBQeV9Ob25lICYmICFQeUNhbGxhYmxlX0NoZWNrKHVzZXJSb3V0aW5lKSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJjYWxsYmFjayBtdXN0IGJlIGNhbGxhYmxlIik7CisgICAgICAgIGdvdG8gdXNlclJvdXRpbmVfX2Vycm9yX187CisgICAgfQorICAgIF9lcnIgPSBTbmROZXdDaGFubmVsKCZjaGFuLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN5bnRoLAorICAgICAgICAgICAgICAgICAgICAgICAgIGluaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgTmV3U25kQ2FsbEJhY2tVUFAoU25kQ2hfVXNlclJvdXRpbmUpKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgU25kQ2hfTmV3LCBjaGFuKTsKKyAgICBpZiAoX3JlcyAhPSBOVUxMICYmIHVzZXJSb3V0aW5lICE9IFB5X05vbmUpCisgICAgeworICAgICAgICBTbmRDaGFubmVsT2JqZWN0ICpwID0gKFNuZENoYW5uZWxPYmplY3QgKilfcmVzOworICAgICAgICBwLT5vYl9pdHNlbGYtPnVzZXJJbmZvID0gKGxvbmcpcDsKKyAgICAgICAgUHlfSU5DUkVGKHVzZXJSb3V0aW5lKTsKKyAgICAgICAgcC0+b2JfY2FsbGJhY2sgPSB1c2VyUm91dGluZTsKKyAgICB9CiAgdXNlclJvdXRpbmVfX2Vycm9yX186IDsKLQlyZXR1cm4gX3JlczsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpTbmRfU25kU291bmRNYW5hZ2VyVmVyc2lvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JTnVtVmVyc2lvbiBfcnY7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNuZFNvdW5kTWFuYWdlclZlcnNpb24oKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkTnVtVmVyc2lvbiwgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgTnVtVmVyc2lvbiBfcnY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNuZFNvdW5kTWFuYWdlclZlcnNpb24oKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkTnVtVmVyc2lvbiwgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpTbmRfU25kTWFuYWdlclN0YXR1cyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlzaG9ydCB0aGVMZW5ndGg7Ci0JU01TdGF0dXMgdGhlU3RhdHVzX19vdXRfXzsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRoZUxlbmd0aCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTbmRNYW5hZ2VyU3RhdHVzKHRoZUxlbmd0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAmdGhlU3RhdHVzX19vdXRfXyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgicyMiLAotCSAgICAgICAgICAgICAgICAgICAgIChjaGFyICopJnRoZVN0YXR1c19fb3V0X18sIChpbnQpc2l6ZW9mKFNNU3RhdHVzKSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgc2hvcnQgdGhlTGVuZ3RoOworICAgIFNNU3RhdHVzIHRoZVN0YXR1c19fb3V0X187CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVMZW5ndGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU25kTWFuYWdlclN0YXR1cyh0aGVMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZVN0YXR1c19fb3V0X18pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoInMjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSZ0aGVTdGF0dXNfX291dF9fLCAoaW50KXNpemVvZihTTVN0YXR1cykpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlNuZF9TbmRHZXRTeXNCZWVwU3RhdGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IHN5c0JlZXBTdGF0ZTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU25kR2V0U3lzQmVlcFN0YXRlKCZzeXNCZWVwU3RhdGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBzeXNCZWVwU3RhdGUpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBzeXNCZWVwU3RhdGU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNuZEdldFN5c0JlZXBTdGF0ZSgmc3lzQmVlcFN0YXRlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3lzQmVlcFN0YXRlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpTbmRfU25kU2V0U3lzQmVlcFN0YXRlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCXNob3J0IHN5c0JlZXBTdGF0ZTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnN5c0JlZXBTdGF0ZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTbmRTZXRTeXNCZWVwU3RhdGUoc3lzQmVlcFN0YXRlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBzaG9ydCBzeXNCZWVwU3RhdGU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzeXNCZWVwU3RhdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU25kU2V0U3lzQmVlcFN0YXRlKHN5c0JlZXBTdGF0ZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqU25kX0dldFN5c0JlZXBWb2x1bWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JbG9uZyBsZXZlbDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldFN5c0JlZXBWb2x1bWUoJmxldmVsKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBsZXZlbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgbG9uZyBsZXZlbDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldFN5c0JlZXBWb2x1bWUoJmxldmVsKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqU25kX1NldFN5c0JlZXBWb2x1bWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JbG9uZyBsZXZlbDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmxldmVsKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldFN5c0JlZXBWb2x1bWUobGV2ZWwpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIGxvbmcgbGV2ZWw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZsZXZlbCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRTeXNCZWVwVm9sdW1lKGxldmVsKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpTbmRfR2V0RGVmYXVsdE91dHB1dFZvbHVtZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlsb25nIGxldmVsOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0RGVmYXVsdE91dHB1dFZvbHVtZSgmbGV2ZWwpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIGxldmVsKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBsb25nIGxldmVsOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0RGVmYXVsdE91dHB1dFZvbHVtZSgmbGV2ZWwpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpTbmRfU2V0RGVmYXVsdE91dHB1dFZvbHVtZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlsb25nIGxldmVsOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmbGV2ZWwpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0RGVmYXVsdE91dHB1dFZvbHVtZShsZXZlbCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgbG9uZyBsZXZlbDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmxldmVsKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldERlZmF1bHRPdXRwdXRWb2x1bWUobGV2ZWwpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlNuZF9HZXRTb3VuZEhlYWRlck9mZnNldChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlTbmRMaXN0SGFuZGxlIHNuZEhhbmRsZTsKLQlsb25nIG9mZnNldDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc25kSGFuZGxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldFNvdW5kSGVhZGVyT2Zmc2V0KHNuZEhhbmRsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTbmRMaXN0SGFuZGxlIHNuZEhhbmRsZTsKKyAgICBsb25nIG9mZnNldDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc25kSGFuZGxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldFNvdW5kSGVhZGVyT2Zmc2V0KHNuZEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpTbmRfR2V0Q29tcHJlc3Npb25JbmZvKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCXNob3J0IGNvbXByZXNzaW9uSUQ7Ci0JT1NUeXBlIGZvcm1hdDsKLQlzaG9ydCBudW1DaGFubmVsczsKLQlzaG9ydCBzYW1wbGVTaXplOwotCUNvbXByZXNzaW9uSW5mbyBjcF9fb3V0X187Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8maGgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmY29tcHJlc3Npb25JRCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZm9ybWF0LAotCSAgICAgICAgICAgICAgICAgICAgICAmbnVtQ2hhbm5lbHMsCi0JICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGVTaXplKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldENvbXByZXNzaW9uSW5mbyhjb21wcmVzc2lvbklELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtQ2hhbm5lbHMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVTaXplLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJmNwX19vdXRfXyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgicyMiLAotCSAgICAgICAgICAgICAgICAgICAgIChjaGFyICopJmNwX19vdXRfXywgKGludClzaXplb2YoQ29tcHJlc3Npb25JbmZvKSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgc2hvcnQgY29tcHJlc3Npb25JRDsKKyAgICBPU1R5cGUgZm9ybWF0OworICAgIHNob3J0IG51bUNoYW5uZWxzOworICAgIHNob3J0IHNhbXBsZVNpemU7CisgICAgQ29tcHJlc3Npb25JbmZvIGNwX19vdXRfXzsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyZoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjb21wcmVzc2lvbklELAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZudW1DaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZVNpemUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0Q29tcHJlc3Npb25JbmZvKGNvbXByZXNzaW9uSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1DaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3BfX291dF9fKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJzIyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikmY3BfX291dF9fLCAoaW50KXNpemVvZihDb21wcmVzc2lvbkluZm8pKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpTbmRfU2V0U291bmRQcmVmZXJlbmNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCU9TVHlwZSB0aGVUeXBlOwotCVN0cjI1NSBuYW1lOwotCUhhbmRsZSBzZXR0aW5nczsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzZXR0aW5ncykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRTb3VuZFByZWZlcmVuY2UodGhlVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkU3RyMjU1LCBuYW1lKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBPU1R5cGUgdGhlVHlwZTsKKyAgICBTdHIyNTUgbmFtZTsKKyAgICBIYW5kbGUgc2V0dGluZ3M7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc2V0dGluZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0U291bmRQcmVmZXJlbmNlKHRoZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFN0cjI1NSwgbmFtZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqU25kX0dldFNvdW5kUHJlZmVyZW5jZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlPU1R5cGUgdGhlVHlwZTsKLQlTdHIyNTUgbmFtZTsKLQlIYW5kbGUgc2V0dGluZ3M7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc2V0dGluZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0U291bmRQcmVmZXJlbmNlKHRoZVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFN0cjI1NSwgbmFtZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgT1NUeXBlIHRoZVR5cGU7CisgICAgU3RyMjU1IG5hbWU7CisgICAgSGFuZGxlIHNldHRpbmdzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNldHRpbmdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldFNvdW5kUHJlZmVyZW5jZSh0aGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRTdHIyNTUsIG5hbWUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlNuZF9HZXRDb21wcmVzc2lvbk5hbWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JT1NUeXBlIGNvbXByZXNzaW9uVHlwZTsKLQlTdHIyNTUgY29tcHJlc3Npb25OYW1lOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY29tcHJlc3Npb25UeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldENvbXByZXNzaW9uTmFtZShjb21wcmVzc2lvblR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc2lvbk5hbWUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFN0cjI1NSwgY29tcHJlc3Npb25OYW1lKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBPU1R5cGUgY29tcHJlc3Npb25UeXBlOworICAgIFN0cjI1NSBjb21wcmVzc2lvbk5hbWU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjb21wcmVzc2lvblR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0Q29tcHJlc3Npb25OYW1lKGNvbXByZXNzaW9uVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzaW9uTmFtZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkU3RyMjU1LCBjb21wcmVzc2lvbk5hbWUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlNuZF9TUEJWZXJzaW9uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlOdW1WZXJzaW9uIF9ydjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU1BCVmVyc2lvbigpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGROdW1WZXJzaW9uLCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBOdW1WZXJzaW9uIF9ydjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU1BCVmVyc2lvbigpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGROdW1WZXJzaW9uLCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlNuZF9TbmRSZWNvcmQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JUG9pbnQgY29ybmVyOwotCU9TVHlwZSBxdWFsaXR5OwotCVNuZExpc3RIYW5kbGUgc25kSGFuZGxlOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJmNvcm5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcXVhbGl0eSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTbmRSZWNvcmQoKE1vZGFsRmlsdGVyVVBQKTAsCi0JICAgICAgICAgICAgICAgICBjb3JuZXIsCi0JICAgICAgICAgICAgICAgICBxdWFsaXR5LAotCSAgICAgICAgICAgICAgICAgJnNuZEhhbmRsZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHNuZEhhbmRsZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgUG9pbnQgY29ybmVyOworICAgIE9TVHlwZSBxdWFsaXR5OworICAgIFNuZExpc3RIYW5kbGUgc25kSGFuZGxlOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJmNvcm5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcXVhbGl0eSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTbmRSZWNvcmQoKE1vZGFsRmlsdGVyVVBQKTAsCisgICAgICAgICAgICAgICAgICAgICBjb3JuZXIsCisgICAgICAgICAgICAgICAgICAgICBxdWFsaXR5LAorICAgICAgICAgICAgICAgICAgICAgJnNuZEhhbmRsZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHNuZEhhbmRsZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqU25kX1NQQlNpZ25JbkRldmljZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlzaG9ydCBkZXZpY2VSZWZOdW07Ci0JU3RyMjU1IGRldmljZU5hbWU7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRldmljZVJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBkZXZpY2VOYW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNQQlNpZ25JbkRldmljZShkZXZpY2VSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VOYW1lKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBzaG9ydCBkZXZpY2VSZWZOdW07CisgICAgU3RyMjU1IGRldmljZU5hbWU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRldmljZVJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBkZXZpY2VOYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNQQlNpZ25JbkRldmljZShkZXZpY2VSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VOYW1lKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpTbmRfU1BCU2lnbk91dERldmljZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlzaG9ydCBkZXZpY2VSZWZOdW07Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZkZXZpY2VSZWZOdW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU1BCU2lnbk91dERldmljZShkZXZpY2VSZWZOdW0pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIHNob3J0IGRldmljZVJlZk51bTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRldmljZVJlZk51bSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTUEJTaWduT3V0RGV2aWNlKGRldmljZVJlZk51bSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqU25kX1NQQkdldEluZGV4ZWREZXZpY2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0Jc2hvcnQgY291bnQ7Ci0JU3RyMjU1IGRldmljZU5hbWU7Ci0JSGFuZGxlIGRldmljZUljb25IYW5kbGU7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZjb3VudCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTUEJHZXRJbmRleGVkRGV2aWNlKGNvdW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZU5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRldmljZUljb25IYW5kbGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkU3RyMjU1LCBkZXZpY2VOYW1lLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGRldmljZUljb25IYW5kbGUpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIHNob3J0IGNvdW50OworICAgIFN0cjI1NSBkZXZpY2VOYW1lOworICAgIEhhbmRsZSBkZXZpY2VJY29uSGFuZGxlOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY291bnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU1BCR2V0SW5kZXhlZERldmljZShjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXZpY2VJY29uSGFuZGxlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFN0cjI1NSwgZGV2aWNlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBkZXZpY2VJY29uSGFuZGxlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpTbmRfU1BCT3BlbkRldmljZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlTdHIyNTUgZGV2aWNlTmFtZTsKLQlzaG9ydCBwZXJtaXNzaW9uOwotCWxvbmcgaW5SZWZOdW07Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBkZXZpY2VOYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAmcGVybWlzc2lvbikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTUEJPcGVuRGV2aWNlKGRldmljZU5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbiwKLQkgICAgICAgICAgICAgICAgICAgICAmaW5SZWZOdW0pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIGluUmVmTnVtKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTdHIyNTUgZGV2aWNlTmFtZTsKKyAgICBzaG9ydCBwZXJtaXNzaW9uOworICAgIGxvbmcgaW5SZWZOdW07CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBkZXZpY2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGVybWlzc2lvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTUEJPcGVuRGV2aWNlKGRldmljZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmaW5SZWZOdW0pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGluUmVmTnVtKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpTbmRfU1BCQ2xvc2VEZXZpY2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JbG9uZyBpblJlZk51bTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluUmVmTnVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNQQkNsb3NlRGV2aWNlKGluUmVmTnVtKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBsb25nIGluUmVmTnVtOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5SZWZOdW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU1BCQ2xvc2VEZXZpY2UoaW5SZWZOdW0pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlNuZF9TUEJSZWNvcmQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU1BCUHRyIGluUGFyYW1QdHI7Ci0JQm9vbGVhbiBhc3luY2hGbGFnOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFNQQk9ial9Db252ZXJ0LCAmaW5QYXJhbVB0ciwKLQkgICAgICAgICAgICAgICAgICAgICAgJmFzeW5jaEZsYWcpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU1BCUmVjb3JkKGluUGFyYW1QdHIsCi0JICAgICAgICAgICAgICAgICBhc3luY2hGbGFnKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTUEJQdHIgaW5QYXJhbVB0cjsKKyAgICBCb29sZWFuIGFzeW5jaEZsYWc7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU1BCT2JqX0NvbnZlcnQsICZpblBhcmFtUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYXN5bmNoRmxhZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTUEJSZWNvcmQoaW5QYXJhbVB0ciwKKyAgICAgICAgICAgICAgICAgICAgIGFzeW5jaEZsYWcpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlNuZF9TUEJQYXVzZVJlY29yZGluZyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlsb25nIGluUmVmTnVtOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5SZWZOdW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU1BCUGF1c2VSZWNvcmRpbmcoaW5SZWZOdW0pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIGxvbmcgaW5SZWZOdW07CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblJlZk51bSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTUEJQYXVzZVJlY29yZGluZyhpblJlZk51bSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqU25kX1NQQlJlc3VtZVJlY29yZGluZyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlsb25nIGluUmVmTnVtOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5SZWZOdW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU1BCUmVzdW1lUmVjb3JkaW5nKGluUmVmTnVtKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBsb25nIGluUmVmTnVtOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5SZWZOdW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU1BCUmVzdW1lUmVjb3JkaW5nKGluUmVmTnVtKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpTbmRfU1BCU3RvcFJlY29yZGluZyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlsb25nIGluUmVmTnVtOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5SZWZOdW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU1BCU3RvcFJlY29yZGluZyhpblJlZk51bSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgbG9uZyBpblJlZk51bTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluUmVmTnVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNQQlN0b3BSZWNvcmRpbmcoaW5SZWZOdW0pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlNuZF9TUEJHZXRSZWNvcmRpbmdTdGF0dXMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JbG9uZyBpblJlZk51bTsKLQlzaG9ydCByZWNvcmRpbmdTdGF0dXM7Ci0Jc2hvcnQgbWV0ZXJMZXZlbDsKLQl1bnNpZ25lZCBsb25nIHRvdGFsU2FtcGxlc1RvUmVjb3JkOwotCXVuc2lnbmVkIGxvbmcgbnVtYmVyT2ZTYW1wbGVzUmVjb3JkZWQ7Ci0JdW5zaWduZWQgbG9uZyB0b3RhbE1zZWNzVG9SZWNvcmQ7Ci0JdW5zaWduZWQgbG9uZyBudW1iZXJPZk1zZWNzUmVjb3JkZWQ7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpblJlZk51bSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTUEJHZXRSZWNvcmRpbmdTdGF0dXMoaW5SZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVjb3JkaW5nU3RhdHVzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1ldGVyTGV2ZWwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG90YWxTYW1wbGVzVG9SZWNvcmQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbnVtYmVyT2ZTYW1wbGVzUmVjb3JkZWQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG90YWxNc2Vjc1RvUmVjb3JkLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm51bWJlck9mTXNlY3NSZWNvcmRlZCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaGhsbGxsIiwKLQkgICAgICAgICAgICAgICAgICAgICByZWNvcmRpbmdTdGF0dXMsCi0JICAgICAgICAgICAgICAgICAgICAgbWV0ZXJMZXZlbCwKLQkgICAgICAgICAgICAgICAgICAgICB0b3RhbFNhbXBsZXNUb1JlY29yZCwKLQkgICAgICAgICAgICAgICAgICAgICBudW1iZXJPZlNhbXBsZXNSZWNvcmRlZCwKLQkgICAgICAgICAgICAgICAgICAgICB0b3RhbE1zZWNzVG9SZWNvcmQsCi0JICAgICAgICAgICAgICAgICAgICAgbnVtYmVyT2ZNc2Vjc1JlY29yZGVkKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBsb25nIGluUmVmTnVtOworICAgIHNob3J0IHJlY29yZGluZ1N0YXR1czsKKyAgICBzaG9ydCBtZXRlckxldmVsOworICAgIHVuc2lnbmVkIGxvbmcgdG90YWxTYW1wbGVzVG9SZWNvcmQ7CisgICAgdW5zaWduZWQgbG9uZyBudW1iZXJPZlNhbXBsZXNSZWNvcmRlZDsKKyAgICB1bnNpZ25lZCBsb25nIHRvdGFsTXNlY3NUb1JlY29yZDsKKyAgICB1bnNpZ25lZCBsb25nIG51bWJlck9mTXNlY3NSZWNvcmRlZDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluUmVmTnVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNQQkdldFJlY29yZGluZ1N0YXR1cyhpblJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWNvcmRpbmdTdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWV0ZXJMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0b3RhbFNhbXBsZXNUb1JlY29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZudW1iZXJPZlNhbXBsZXNSZWNvcmRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0b3RhbE1zZWNzVG9SZWNvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbnVtYmVyT2ZNc2Vjc1JlY29yZGVkKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoaGxsbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZGluZ1N0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICBtZXRlckxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsU2FtcGxlc1RvUmVjb3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlck9mU2FtcGxlc1JlY29yZGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsTXNlY3NUb1JlY29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXJPZk1zZWNzUmVjb3JkZWQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlNuZF9TUEJHZXREZXZpY2VJbmZvKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCWxvbmcgaW5SZWZOdW07Ci0JT1NUeXBlIGluZm9UeXBlOwotCXZvaWQgKiBpbmZvRGF0YTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyZ3IiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluUmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpbmZvVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluZm9EYXRhKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNQQkdldERldmljZUluZm8oaW5SZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgaW5mb1R5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgaW5mb0RhdGEpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIGxvbmcgaW5SZWZOdW07CisgICAgT1NUeXBlIGluZm9UeXBlOworICAgIHZvaWQgKiBpbmZvRGF0YTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyZ3IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluUmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpbmZvVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZm9EYXRhKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNQQkdldERldmljZUluZm8oaW5SZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb0RhdGEpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlNuZF9TUEJTZXREZXZpY2VJbmZvKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCWxvbmcgaW5SZWZOdW07Ci0JT1NUeXBlIGluZm9UeXBlOwotCXZvaWQgKiBpbmZvRGF0YTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyZ3IiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluUmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpbmZvVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluZm9EYXRhKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNQQlNldERldmljZUluZm8oaW5SZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgaW5mb1R5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgaW5mb0RhdGEpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIGxvbmcgaW5SZWZOdW07CisgICAgT1NUeXBlIGluZm9UeXBlOworICAgIHZvaWQgKiBpbmZvRGF0YTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyZ3IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluUmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpbmZvVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZm9EYXRhKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNQQlNldERldmljZUluZm8oaW5SZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb0RhdGEpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlNuZF9TUEJNaWxsaXNlY29uZHNUb0J5dGVzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCWxvbmcgaW5SZWZOdW07Ci0JbG9uZyBtaWxsaXNlY29uZHM7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpblJlZk51bSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTUEJNaWxsaXNlY29uZHNUb0J5dGVzKGluUmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtaWxsaXNlY29uZHMpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIG1pbGxpc2Vjb25kcyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgbG9uZyBpblJlZk51bTsKKyAgICBsb25nIG1pbGxpc2Vjb25kczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluUmVmTnVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNQQk1pbGxpc2Vjb25kc1RvQnl0ZXMoaW5SZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1pbGxpc2Vjb25kcyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgbWlsbGlzZWNvbmRzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpTbmRfU1BCQnl0ZXNUb01pbGxpc2Vjb25kcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlsb25nIGluUmVmTnVtOwotCWxvbmcgYnl0ZUNvdW50OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5SZWZOdW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU1BCQnl0ZXNUb01pbGxpc2Vjb25kcyhpblJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnl0ZUNvdW50KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBieXRlQ291bnQpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIGxvbmcgaW5SZWZOdW07CisgICAgbG9uZyBieXRlQ291bnQ7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblJlZk51bSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTUEJCeXRlc1RvTWlsbGlzZWNvbmRzKGluUmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZieXRlQ291bnQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVDb3VudCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAjZW5kaWYgLyogX19MUDY0X18gKi8KIAogc3RhdGljIFB5TWV0aG9kRGVmIFNuZF9tZXRob2RzW10gPSB7CiAjaWZuZGVmIF9fTFA2NF9fCi0JeyJTUEIiLCAoUHlDRnVuY3Rpb24pU25kX1NQQiwgMSwKLQkgUHlEb2NfU1RSKE5VTEwpfSwKLQl7IlN5c0JlZXAiLCAoUHlDRnVuY3Rpb24pU25kX1N5c0JlZXAsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGR1cmF0aW9uKSAtPiBOb25lIil9LAotCXsiU25kTmV3Q2hhbm5lbCIsIChQeUNGdW5jdGlvbilTbmRfU25kTmV3Q2hhbm5lbCwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgc3ludGgsIGxvbmcgaW5pdCwgUHlPYmplY3QqIHVzZXJSb3V0aW5lKSAtPiAoU25kQ2hhbm5lbFB0ciBjaGFuKSIpfSwKLQl7IlNuZFNvdW5kTWFuYWdlclZlcnNpb24iLCAoUHlDRnVuY3Rpb24pU25kX1NuZFNvdW5kTWFuYWdlclZlcnNpb24sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKE51bVZlcnNpb24gX3J2KSIpfSwKLQl7IlNuZE1hbmFnZXJTdGF0dXMiLCAoUHlDRnVuY3Rpb24pU25kX1NuZE1hbmFnZXJTdGF0dXMsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHRoZUxlbmd0aCkgLT4gKFNNU3RhdHVzIHRoZVN0YXR1cykiKX0sCi0JeyJTbmRHZXRTeXNCZWVwU3RhdGUiLCAoUHlDRnVuY3Rpb24pU25kX1NuZEdldFN5c0JlZXBTdGF0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgc3lzQmVlcFN0YXRlKSIpfSwKLQl7IlNuZFNldFN5c0JlZXBTdGF0ZSIsIChQeUNGdW5jdGlvbilTbmRfU25kU2V0U3lzQmVlcFN0YXRlLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBzeXNCZWVwU3RhdGUpIC0+IE5vbmUiKX0sCi0JeyJHZXRTeXNCZWVwVm9sdW1lIiwgKFB5Q0Z1bmN0aW9uKVNuZF9HZXRTeXNCZWVwVm9sdW1lLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChsb25nIGxldmVsKSIpfSwKLQl7IlNldFN5c0JlZXBWb2x1bWUiLCAoUHlDRnVuY3Rpb24pU25kX1NldFN5c0JlZXBWb2x1bWUsIDEsCi0JIFB5RG9jX1NUUigiKGxvbmcgbGV2ZWwpIC0+IE5vbmUiKX0sCi0JeyJHZXREZWZhdWx0T3V0cHV0Vm9sdW1lIiwgKFB5Q0Z1bmN0aW9uKVNuZF9HZXREZWZhdWx0T3V0cHV0Vm9sdW1lLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChsb25nIGxldmVsKSIpfSwKLQl7IlNldERlZmF1bHRPdXRwdXRWb2x1bWUiLCAoUHlDRnVuY3Rpb24pU25kX1NldERlZmF1bHRPdXRwdXRWb2x1bWUsIDEsCi0JIFB5RG9jX1NUUigiKGxvbmcgbGV2ZWwpIC0+IE5vbmUiKX0sCi0JeyJHZXRTb3VuZEhlYWRlck9mZnNldCIsIChQeUNGdW5jdGlvbilTbmRfR2V0U291bmRIZWFkZXJPZmZzZXQsIDEsCi0JIFB5RG9jX1NUUigiKFNuZExpc3RIYW5kbGUgc25kSGFuZGxlKSAtPiAobG9uZyBvZmZzZXQpIil9LAotCXsiR2V0Q29tcHJlc3Npb25JbmZvIiwgKFB5Q0Z1bmN0aW9uKVNuZF9HZXRDb21wcmVzc2lvbkluZm8sIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGNvbXByZXNzaW9uSUQsIE9TVHlwZSBmb3JtYXQsIHNob3J0IG51bUNoYW5uZWxzLCBzaG9ydCBzYW1wbGVTaXplKSAtPiAoQ29tcHJlc3Npb25JbmZvIGNwKSIpfSwKLQl7IlNldFNvdW5kUHJlZmVyZW5jZSIsIChQeUNGdW5jdGlvbilTbmRfU2V0U291bmRQcmVmZXJlbmNlLCAxLAotCSBQeURvY19TVFIoIihPU1R5cGUgdGhlVHlwZSwgSGFuZGxlIHNldHRpbmdzKSAtPiAoU3RyMjU1IG5hbWUpIil9LAotCXsiR2V0U291bmRQcmVmZXJlbmNlIiwgKFB5Q0Z1bmN0aW9uKVNuZF9HZXRTb3VuZFByZWZlcmVuY2UsIDEsCi0JIFB5RG9jX1NUUigiKE9TVHlwZSB0aGVUeXBlLCBIYW5kbGUgc2V0dGluZ3MpIC0+IChTdHIyNTUgbmFtZSkiKX0sCi0JeyJHZXRDb21wcmVzc2lvbk5hbWUiLCAoUHlDRnVuY3Rpb24pU25kX0dldENvbXByZXNzaW9uTmFtZSwgMSwKLQkgUHlEb2NfU1RSKCIoT1NUeXBlIGNvbXByZXNzaW9uVHlwZSkgLT4gKFN0cjI1NSBjb21wcmVzc2lvbk5hbWUpIil9LAotCXsiU1BCVmVyc2lvbiIsIChQeUNGdW5jdGlvbilTbmRfU1BCVmVyc2lvbiwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoTnVtVmVyc2lvbiBfcnYpIil9LAotCXsiU25kUmVjb3JkIiwgKFB5Q0Z1bmN0aW9uKVNuZF9TbmRSZWNvcmQsIDEsCi0JIFB5RG9jX1NUUigiKFBvaW50IGNvcm5lciwgT1NUeXBlIHF1YWxpdHkpIC0+IChTbmRMaXN0SGFuZGxlIHNuZEhhbmRsZSkiKX0sCi0JeyJTUEJTaWduSW5EZXZpY2UiLCAoUHlDRnVuY3Rpb24pU25kX1NQQlNpZ25JbkRldmljZSwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgZGV2aWNlUmVmTnVtLCBTdHIyNTUgZGV2aWNlTmFtZSkgLT4gTm9uZSIpfSwKLQl7IlNQQlNpZ25PdXREZXZpY2UiLCAoUHlDRnVuY3Rpb24pU25kX1NQQlNpZ25PdXREZXZpY2UsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGRldmljZVJlZk51bSkgLT4gTm9uZSIpfSwKLQl7IlNQQkdldEluZGV4ZWREZXZpY2UiLCAoUHlDRnVuY3Rpb24pU25kX1NQQkdldEluZGV4ZWREZXZpY2UsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGNvdW50KSAtPiAoU3RyMjU1IGRldmljZU5hbWUsIEhhbmRsZSBkZXZpY2VJY29uSGFuZGxlKSIpfSwKLQl7IlNQQk9wZW5EZXZpY2UiLCAoUHlDRnVuY3Rpb24pU25kX1NQQk9wZW5EZXZpY2UsIDEsCi0JIFB5RG9jX1NUUigiKFN0cjI1NSBkZXZpY2VOYW1lLCBzaG9ydCBwZXJtaXNzaW9uKSAtPiAobG9uZyBpblJlZk51bSkiKX0sCi0JeyJTUEJDbG9zZURldmljZSIsIChQeUNGdW5jdGlvbilTbmRfU1BCQ2xvc2VEZXZpY2UsIDEsCi0JIFB5RG9jX1NUUigiKGxvbmcgaW5SZWZOdW0pIC0+IE5vbmUiKX0sCi0JeyJTUEJSZWNvcmQiLCAoUHlDRnVuY3Rpb24pU25kX1NQQlJlY29yZCwgMSwKLQkgUHlEb2NfU1RSKCIoU1BCUHRyIGluUGFyYW1QdHIsIEJvb2xlYW4gYXN5bmNoRmxhZykgLT4gTm9uZSIpfSwKLQl7IlNQQlBhdXNlUmVjb3JkaW5nIiwgKFB5Q0Z1bmN0aW9uKVNuZF9TUEJQYXVzZVJlY29yZGluZywgMSwKLQkgUHlEb2NfU1RSKCIobG9uZyBpblJlZk51bSkgLT4gTm9uZSIpfSwKLQl7IlNQQlJlc3VtZVJlY29yZGluZyIsIChQeUNGdW5jdGlvbilTbmRfU1BCUmVzdW1lUmVjb3JkaW5nLCAxLAotCSBQeURvY19TVFIoIihsb25nIGluUmVmTnVtKSAtPiBOb25lIil9LAotCXsiU1BCU3RvcFJlY29yZGluZyIsIChQeUNGdW5jdGlvbilTbmRfU1BCU3RvcFJlY29yZGluZywgMSwKLQkgUHlEb2NfU1RSKCIobG9uZyBpblJlZk51bSkgLT4gTm9uZSIpfSwKLQl7IlNQQkdldFJlY29yZGluZ1N0YXR1cyIsIChQeUNGdW5jdGlvbilTbmRfU1BCR2V0UmVjb3JkaW5nU3RhdHVzLCAxLAotCSBQeURvY19TVFIoIihsb25nIGluUmVmTnVtKSAtPiAoc2hvcnQgcmVjb3JkaW5nU3RhdHVzLCBzaG9ydCBtZXRlckxldmVsLCB1bnNpZ25lZCBsb25nIHRvdGFsU2FtcGxlc1RvUmVjb3JkLCB1bnNpZ25lZCBsb25nIG51bWJlck9mU2FtcGxlc1JlY29yZGVkLCB1bnNpZ25lZCBsb25nIHRvdGFsTXNlY3NUb1JlY29yZCwgdW5zaWduZWQgbG9uZyBudW1iZXJPZk1zZWNzUmVjb3JkZWQpIil9LAotCXsiU1BCR2V0RGV2aWNlSW5mbyIsIChQeUNGdW5jdGlvbilTbmRfU1BCR2V0RGV2aWNlSW5mbywgMSwKLQkgUHlEb2NfU1RSKCIobG9uZyBpblJlZk51bSwgT1NUeXBlIGluZm9UeXBlLCB2b2lkICogaW5mb0RhdGEpIC0+IE5vbmUiKX0sCi0JeyJTUEJTZXREZXZpY2VJbmZvIiwgKFB5Q0Z1bmN0aW9uKVNuZF9TUEJTZXREZXZpY2VJbmZvLCAxLAotCSBQeURvY19TVFIoIihsb25nIGluUmVmTnVtLCBPU1R5cGUgaW5mb1R5cGUsIHZvaWQgKiBpbmZvRGF0YSkgLT4gTm9uZSIpfSwKLQl7IlNQQk1pbGxpc2Vjb25kc1RvQnl0ZXMiLCAoUHlDRnVuY3Rpb24pU25kX1NQQk1pbGxpc2Vjb25kc1RvQnl0ZXMsIDEsCi0JIFB5RG9jX1NUUigiKGxvbmcgaW5SZWZOdW0pIC0+IChsb25nIG1pbGxpc2Vjb25kcykiKX0sCi0JeyJTUEJCeXRlc1RvTWlsbGlzZWNvbmRzIiwgKFB5Q0Z1bmN0aW9uKVNuZF9TUEJCeXRlc1RvTWlsbGlzZWNvbmRzLCAxLAotCSBQeURvY19TVFIoIihsb25nIGluUmVmTnVtKSAtPiAobG9uZyBieXRlQ291bnQpIil9LAorICAgIHsiU1BCIiwgKFB5Q0Z1bmN0aW9uKVNuZF9TUEIsIDEsCisgICAgIFB5RG9jX1NUUihOVUxMKX0sCisgICAgeyJTeXNCZWVwIiwgKFB5Q0Z1bmN0aW9uKVNuZF9TeXNCZWVwLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBkdXJhdGlvbikgLT4gTm9uZSIpfSwKKyAgICB7IlNuZE5ld0NoYW5uZWwiLCAoUHlDRnVuY3Rpb24pU25kX1NuZE5ld0NoYW5uZWwsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IHN5bnRoLCBsb25nIGluaXQsIFB5T2JqZWN0KiB1c2VyUm91dGluZSkgLT4gKFNuZENoYW5uZWxQdHIgY2hhbikiKX0sCisgICAgeyJTbmRTb3VuZE1hbmFnZXJWZXJzaW9uIiwgKFB5Q0Z1bmN0aW9uKVNuZF9TbmRTb3VuZE1hbmFnZXJWZXJzaW9uLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChOdW1WZXJzaW9uIF9ydikiKX0sCisgICAgeyJTbmRNYW5hZ2VyU3RhdHVzIiwgKFB5Q0Z1bmN0aW9uKVNuZF9TbmRNYW5hZ2VyU3RhdHVzLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCB0aGVMZW5ndGgpIC0+IChTTVN0YXR1cyB0aGVTdGF0dXMpIil9LAorICAgIHsiU25kR2V0U3lzQmVlcFN0YXRlIiwgKFB5Q0Z1bmN0aW9uKVNuZF9TbmRHZXRTeXNCZWVwU3RhdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKHNob3J0IHN5c0JlZXBTdGF0ZSkiKX0sCisgICAgeyJTbmRTZXRTeXNCZWVwU3RhdGUiLCAoUHlDRnVuY3Rpb24pU25kX1NuZFNldFN5c0JlZXBTdGF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgc3lzQmVlcFN0YXRlKSAtPiBOb25lIil9LAorICAgIHsiR2V0U3lzQmVlcFZvbHVtZSIsIChQeUNGdW5jdGlvbilTbmRfR2V0U3lzQmVlcFZvbHVtZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAobG9uZyBsZXZlbCkiKX0sCisgICAgeyJTZXRTeXNCZWVwVm9sdW1lIiwgKFB5Q0Z1bmN0aW9uKVNuZF9TZXRTeXNCZWVwVm9sdW1lLCAxLAorICAgICBQeURvY19TVFIoIihsb25nIGxldmVsKSAtPiBOb25lIil9LAorICAgIHsiR2V0RGVmYXVsdE91dHB1dFZvbHVtZSIsIChQeUNGdW5jdGlvbilTbmRfR2V0RGVmYXVsdE91dHB1dFZvbHVtZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAobG9uZyBsZXZlbCkiKX0sCisgICAgeyJTZXREZWZhdWx0T3V0cHV0Vm9sdW1lIiwgKFB5Q0Z1bmN0aW9uKVNuZF9TZXREZWZhdWx0T3V0cHV0Vm9sdW1lLCAxLAorICAgICBQeURvY19TVFIoIihsb25nIGxldmVsKSAtPiBOb25lIil9LAorICAgIHsiR2V0U291bmRIZWFkZXJPZmZzZXQiLCAoUHlDRnVuY3Rpb24pU25kX0dldFNvdW5kSGVhZGVyT2Zmc2V0LCAxLAorICAgICBQeURvY19TVFIoIihTbmRMaXN0SGFuZGxlIHNuZEhhbmRsZSkgLT4gKGxvbmcgb2Zmc2V0KSIpfSwKKyAgICB7IkdldENvbXByZXNzaW9uSW5mbyIsIChQeUNGdW5jdGlvbilTbmRfR2V0Q29tcHJlc3Npb25JbmZvLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBjb21wcmVzc2lvbklELCBPU1R5cGUgZm9ybWF0LCBzaG9ydCBudW1DaGFubmVscywgc2hvcnQgc2FtcGxlU2l6ZSkgLT4gKENvbXByZXNzaW9uSW5mbyBjcCkiKX0sCisgICAgeyJTZXRTb3VuZFByZWZlcmVuY2UiLCAoUHlDRnVuY3Rpb24pU25kX1NldFNvdW5kUHJlZmVyZW5jZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoT1NUeXBlIHRoZVR5cGUsIEhhbmRsZSBzZXR0aW5ncykgLT4gKFN0cjI1NSBuYW1lKSIpfSwKKyAgICB7IkdldFNvdW5kUHJlZmVyZW5jZSIsIChQeUNGdW5jdGlvbilTbmRfR2V0U291bmRQcmVmZXJlbmNlLCAxLAorICAgICBQeURvY19TVFIoIihPU1R5cGUgdGhlVHlwZSwgSGFuZGxlIHNldHRpbmdzKSAtPiAoU3RyMjU1IG5hbWUpIil9LAorICAgIHsiR2V0Q29tcHJlc3Npb25OYW1lIiwgKFB5Q0Z1bmN0aW9uKVNuZF9HZXRDb21wcmVzc2lvbk5hbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKE9TVHlwZSBjb21wcmVzc2lvblR5cGUpIC0+IChTdHIyNTUgY29tcHJlc3Npb25OYW1lKSIpfSwKKyAgICB7IlNQQlZlcnNpb24iLCAoUHlDRnVuY3Rpb24pU25kX1NQQlZlcnNpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKE51bVZlcnNpb24gX3J2KSIpfSwKKyAgICB7IlNuZFJlY29yZCIsIChQeUNGdW5jdGlvbilTbmRfU25kUmVjb3JkLCAxLAorICAgICBQeURvY19TVFIoIihQb2ludCBjb3JuZXIsIE9TVHlwZSBxdWFsaXR5KSAtPiAoU25kTGlzdEhhbmRsZSBzbmRIYW5kbGUpIil9LAorICAgIHsiU1BCU2lnbkluRGV2aWNlIiwgKFB5Q0Z1bmN0aW9uKVNuZF9TUEJTaWduSW5EZXZpY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGRldmljZVJlZk51bSwgU3RyMjU1IGRldmljZU5hbWUpIC0+IE5vbmUiKX0sCisgICAgeyJTUEJTaWduT3V0RGV2aWNlIiwgKFB5Q0Z1bmN0aW9uKVNuZF9TUEJTaWduT3V0RGV2aWNlLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBkZXZpY2VSZWZOdW0pIC0+IE5vbmUiKX0sCisgICAgeyJTUEJHZXRJbmRleGVkRGV2aWNlIiwgKFB5Q0Z1bmN0aW9uKVNuZF9TUEJHZXRJbmRleGVkRGV2aWNlLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBjb3VudCkgLT4gKFN0cjI1NSBkZXZpY2VOYW1lLCBIYW5kbGUgZGV2aWNlSWNvbkhhbmRsZSkiKX0sCisgICAgeyJTUEJPcGVuRGV2aWNlIiwgKFB5Q0Z1bmN0aW9uKVNuZF9TUEJPcGVuRGV2aWNlLCAxLAorICAgICBQeURvY19TVFIoIihTdHIyNTUgZGV2aWNlTmFtZSwgc2hvcnQgcGVybWlzc2lvbikgLT4gKGxvbmcgaW5SZWZOdW0pIil9LAorICAgIHsiU1BCQ2xvc2VEZXZpY2UiLCAoUHlDRnVuY3Rpb24pU25kX1NQQkNsb3NlRGV2aWNlLCAxLAorICAgICBQeURvY19TVFIoIihsb25nIGluUmVmTnVtKSAtPiBOb25lIil9LAorICAgIHsiU1BCUmVjb3JkIiwgKFB5Q0Z1bmN0aW9uKVNuZF9TUEJSZWNvcmQsIDEsCisgICAgIFB5RG9jX1NUUigiKFNQQlB0ciBpblBhcmFtUHRyLCBCb29sZWFuIGFzeW5jaEZsYWcpIC0+IE5vbmUiKX0sCisgICAgeyJTUEJQYXVzZVJlY29yZGluZyIsIChQeUNGdW5jdGlvbilTbmRfU1BCUGF1c2VSZWNvcmRpbmcsIDEsCisgICAgIFB5RG9jX1NUUigiKGxvbmcgaW5SZWZOdW0pIC0+IE5vbmUiKX0sCisgICAgeyJTUEJSZXN1bWVSZWNvcmRpbmciLCAoUHlDRnVuY3Rpb24pU25kX1NQQlJlc3VtZVJlY29yZGluZywgMSwKKyAgICAgUHlEb2NfU1RSKCIobG9uZyBpblJlZk51bSkgLT4gTm9uZSIpfSwKKyAgICB7IlNQQlN0b3BSZWNvcmRpbmciLCAoUHlDRnVuY3Rpb24pU25kX1NQQlN0b3BSZWNvcmRpbmcsIDEsCisgICAgIFB5RG9jX1NUUigiKGxvbmcgaW5SZWZOdW0pIC0+IE5vbmUiKX0sCisgICAgeyJTUEJHZXRSZWNvcmRpbmdTdGF0dXMiLCAoUHlDRnVuY3Rpb24pU25kX1NQQkdldFJlY29yZGluZ1N0YXR1cywgMSwKKyAgICAgUHlEb2NfU1RSKCIobG9uZyBpblJlZk51bSkgLT4gKHNob3J0IHJlY29yZGluZ1N0YXR1cywgc2hvcnQgbWV0ZXJMZXZlbCwgdW5zaWduZWQgbG9uZyB0b3RhbFNhbXBsZXNUb1JlY29yZCwgdW5zaWduZWQgbG9uZyBudW1iZXJPZlNhbXBsZXNSZWNvcmRlZCwgdW5zaWduZWQgbG9uZyB0b3RhbE1zZWNzVG9SZWNvcmQsIHVuc2lnbmVkIGxvbmcgbnVtYmVyT2ZNc2Vjc1JlY29yZGVkKSIpfSwKKyAgICB7IlNQQkdldERldmljZUluZm8iLCAoUHlDRnVuY3Rpb24pU25kX1NQQkdldERldmljZUluZm8sIDEsCisgICAgIFB5RG9jX1NUUigiKGxvbmcgaW5SZWZOdW0sIE9TVHlwZSBpbmZvVHlwZSwgdm9pZCAqIGluZm9EYXRhKSAtPiBOb25lIil9LAorICAgIHsiU1BCU2V0RGV2aWNlSW5mbyIsIChQeUNGdW5jdGlvbilTbmRfU1BCU2V0RGV2aWNlSW5mbywgMSwKKyAgICAgUHlEb2NfU1RSKCIobG9uZyBpblJlZk51bSwgT1NUeXBlIGluZm9UeXBlLCB2b2lkICogaW5mb0RhdGEpIC0+IE5vbmUiKX0sCisgICAgeyJTUEJNaWxsaXNlY29uZHNUb0J5dGVzIiwgKFB5Q0Z1bmN0aW9uKVNuZF9TUEJNaWxsaXNlY29uZHNUb0J5dGVzLCAxLAorICAgICBQeURvY19TVFIoIihsb25nIGluUmVmTnVtKSAtPiAobG9uZyBtaWxsaXNlY29uZHMpIil9LAorICAgIHsiU1BCQnl0ZXNUb01pbGxpc2Vjb25kcyIsIChQeUNGdW5jdGlvbilTbmRfU1BCQnl0ZXNUb01pbGxpc2Vjb25kcywgMSwKKyAgICAgUHlEb2NfU1RSKCIobG9uZyBpblJlZk51bSkgLT4gKGxvbmcgYnl0ZUNvdW50KSIpfSwKICNlbmRpZiAvKiBfX0xQNjRfXyAqLwotCXtOVUxMLCBOVUxMLCAwfQorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogCkBAIC0xMDYxLDYyICsxMDYxLDYyIEBACiBzdGF0aWMgaW50CiBTbmRDaF9DYWxsQ2FsbEJhY2sodm9pZCAqYXJnKQogewotICAgICAgICBTbmRDaGFubmVsT2JqZWN0ICpwID0gKFNuZENoYW5uZWxPYmplY3QgKilhcmc7Ci0gICAgICAgIFB5T2JqZWN0ICphcmdzOwotICAgICAgICBQeU9iamVjdCAqcmVzOwotICAgICAgICBhcmdzID0gUHlfQnVpbGRWYWx1ZSgiKE8oaGhsKSkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLCBwLT5vYl9jbWQuY21kLCBwLT5vYl9jbWQucGFyYW0xLCBwLT5vYl9jbWQucGFyYW0yKTsKLSAgICAgICAgcmVzID0gUHlFdmFsX0NhbGxPYmplY3QocC0+b2JfY2FsbGJhY2ssIGFyZ3MpOwotICAgICAgICBQeV9ERUNSRUYoYXJncyk7Ci0gICAgICAgIGlmIChyZXMgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIFB5X0RFQ1JFRihyZXMpOwotICAgICAgICByZXR1cm4gMDsKKyAgICBTbmRDaGFubmVsT2JqZWN0ICpwID0gKFNuZENoYW5uZWxPYmplY3QgKilhcmc7CisgICAgUHlPYmplY3QgKmFyZ3M7CisgICAgUHlPYmplY3QgKnJlczsKKyAgICBhcmdzID0gUHlfQnVpbGRWYWx1ZSgiKE8oaGhsKSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHAsIHAtPm9iX2NtZC5jbWQsIHAtPm9iX2NtZC5wYXJhbTEsIHAtPm9iX2NtZC5wYXJhbTIpOworICAgIHJlcyA9IFB5RXZhbF9DYWxsT2JqZWN0KHAtPm9iX2NhbGxiYWNrLCBhcmdzKTsKKyAgICBQeV9ERUNSRUYoYXJncyk7CisgICAgaWYgKHJlcyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAgUHlfREVDUkVGKHJlcyk7CisgICAgcmV0dXJuIDA7CiB9CiAKIC8qIFJvdXRpbmUgcGFzc2VkIHRvIE5ld1NuZENoYW5uZWwgLS0gc2NoZWR1bGUgYSBjYWxsIHRvIFNuZENoX0NhbGxDYWxsQmFjayAqLwogc3RhdGljIHBhc2NhbCB2b2lkCiBTbmRDaF9Vc2VyUm91dGluZShTbmRDaGFubmVsUHRyIGNoYW4sIFNuZENvbW1hbmQgKmNtZCkKIHsKLSAgICAgICAgU25kQ2hhbm5lbE9iamVjdCAqcCA9IChTbmRDaGFubmVsT2JqZWN0ICopKGNoYW4tPnVzZXJJbmZvKTsKLSAgICAgICAgaWYgKHAtPm9iX2NhbGxiYWNrICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBsb25nIEE1ID0gU2V0QTUocC0+b2JfQTUpOwotICAgICAgICAgICAgICAgIHAtPm9iX2NtZCA9ICpjbWQ7Ci0gICAgICAgICAgICAgICAgUHlfQWRkUGVuZGluZ0NhbGwoU25kQ2hfQ2FsbENhbGxCYWNrLCAodm9pZCAqKXApOwotICAgICAgICAgICAgICAgIFNldEE1KEE1KTsKLSAgICAgICAgfQorICAgIFNuZENoYW5uZWxPYmplY3QgKnAgPSAoU25kQ2hhbm5lbE9iamVjdCAqKShjaGFuLT51c2VySW5mbyk7CisgICAgaWYgKHAtPm9iX2NhbGxiYWNrICE9IE5VTEwpIHsKKyAgICAgICAgbG9uZyBBNSA9IFNldEE1KHAtPm9iX0E1KTsKKyAgICAgICAgcC0+b2JfY21kID0gKmNtZDsKKyAgICAgICAgUHlfQWRkUGVuZGluZ0NhbGwoU25kQ2hfQ2FsbENhbGxCYWNrLCAodm9pZCAqKXApOworICAgICAgICBTZXRBNShBNSk7CisgICAgfQogfQogCiAvKiBTUEIgY2FsbGJhY2tzIC0gU2NoZWR1bGUgY2FsbGJhY2tzIHRvIFB5dGhvbiAqLwogc3RhdGljIGludAogU1BCX0NhbGxDYWxsQmFjayh2b2lkICphcmcpCiB7Ci0gICAgICAgIFNQQk9iamVjdCAqcCA9IChTUEJPYmplY3QgKilhcmc7Ci0gICAgICAgIFB5T2JqZWN0ICphcmdzOwotICAgICAgICBQeU9iamVjdCAqcmVzOworICAgIFNQQk9iamVjdCAqcCA9IChTUEJPYmplY3QgKilhcmc7CisgICAgUHlPYmplY3QgKmFyZ3M7CisgICAgUHlPYmplY3QgKnJlczsKIAotICAgICAgICBpZiAoIHAtPm9iX3RoaXNjYWxsYmFjayA9PSAwICkgcmV0dXJuIDA7Ci0gICAgICAgIGFyZ3MgPSBQeV9CdWlsZFZhbHVlKCIoTykiLCBwKTsKLSAgICAgICAgcmVzID0gUHlFdmFsX0NhbGxPYmplY3QocC0+b2JfdGhpc2NhbGxiYWNrLCBhcmdzKTsKLSAgICAgICAgcC0+b2JfdGhpc2NhbGxiYWNrID0gMDsKLSAgICAgICAgUHlfREVDUkVGKGFyZ3MpOwotICAgICAgICBpZiAocmVzID09IE5VTEwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICBQeV9ERUNSRUYocmVzKTsKLSAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKCBwLT5vYl90aGlzY2FsbGJhY2sgPT0gMCApIHJldHVybiAwOworICAgIGFyZ3MgPSBQeV9CdWlsZFZhbHVlKCIoTykiLCBwKTsKKyAgICByZXMgPSBQeUV2YWxfQ2FsbE9iamVjdChwLT5vYl90aGlzY2FsbGJhY2ssIGFyZ3MpOworICAgIHAtPm9iX3RoaXNjYWxsYmFjayA9IDA7CisgICAgUHlfREVDUkVGKGFyZ3MpOworICAgIGlmIChyZXMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIFB5X0RFQ1JFRihyZXMpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgcGFzY2FsIHZvaWQKIFNQQl9jb21wbGV0aW9uKFNQQlB0ciBteV9zcGIpCiB7Ci0gICAgICAgIFNQQk9iamVjdCAqcCA9IChTUEJPYmplY3QgKikobXlfc3BiLT51c2VyTG9uZyk7CisgICAgU1BCT2JqZWN0ICpwID0gKFNQQk9iamVjdCAqKShteV9zcGItPnVzZXJMb25nKTsKIAotICAgICAgICBpZiAocCAmJiBwLT5vYl9jb21wbGV0aW9uKSB7Ci0gICAgICAgICAgICAgICAgbG9uZyBBNSA9IFNldEE1KHAtPm9iX0E1KTsKLSAgICAgICAgICAgICAgICBwLT5vYl90aGlzY2FsbGJhY2sgPSBwLT5vYl9jb21wbGV0aW9uOyAgLyogSG9wZSB3ZSBjYW5ub3QgZ2V0IHR3byBhdCB0aGUgc2FtZSB0aW1lICovCi0gICAgICAgICAgICAgICAgUHlfQWRkUGVuZGluZ0NhbGwoU1BCX0NhbGxDYWxsQmFjaywgKHZvaWQgKilwKTsKLSAgICAgICAgICAgICAgICBTZXRBNShBNSk7Ci0gICAgICAgIH0KKyAgICBpZiAocCAmJiBwLT5vYl9jb21wbGV0aW9uKSB7CisgICAgICAgIGxvbmcgQTUgPSBTZXRBNShwLT5vYl9BNSk7CisgICAgICAgIHAtPm9iX3RoaXNjYWxsYmFjayA9IHAtPm9iX2NvbXBsZXRpb247ICAvKiBIb3BlIHdlIGNhbm5vdCBnZXQgdHdvIGF0IHRoZSBzYW1lIHRpbWUgKi8KKyAgICAgICAgUHlfQWRkUGVuZGluZ0NhbGwoU1BCX0NhbGxDYWxsQmFjaywgKHZvaWQgKilwKTsKKyAgICAgICAgU2V0QTUoQTUpOworICAgIH0KIH0KICNlbmRpZiAvKiBfX0xQNjRfXyAqLwogCkBAIC0xMTI0LDM2ICsxMTI0LDM2IEBACiAKIHZvaWQgaW5pdF9TbmQodm9pZCkKIHsKLQlQeU9iamVjdCAqbTsKKyAgICBQeU9iamVjdCAqbTsKICNpZm5kZWYgX19MUDY0X18KLQlQeU9iamVjdCAqZDsKKyAgICBQeU9iamVjdCAqZDsKICNlbmRpZiAvKiBfX0xQNjRfXyAqLwogCiAKIAogCiAKLQltID0gUHlfSW5pdE1vZHVsZSgiX1NuZCIsIFNuZF9tZXRob2RzKTsKKyAgICBtID0gUHlfSW5pdE1vZHVsZSgiX1NuZCIsIFNuZF9tZXRob2RzKTsKICNpZm5kZWYgX19MUDY0X18KLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQlTbmRfRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOwotCWlmIChTbmRfRXJyb3IgPT0gTlVMTCB8fAotCSAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRXJyb3IiLCBTbmRfRXJyb3IpICE9IDApCi0JCXJldHVybjsKLQlTbmRDaGFubmVsX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKLQlpZiAoUHlUeXBlX1JlYWR5KCZTbmRDaGFubmVsX1R5cGUpIDwgMCkgcmV0dXJuOwotCVB5X0lOQ1JFRigmU25kQ2hhbm5lbF9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIlNuZENoYW5uZWwiLCAoUHlPYmplY3QgKikmU25kQ2hhbm5lbF9UeXBlKTsKLQkvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KLQlQeV9JTkNSRUYoJlNuZENoYW5uZWxfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJTbmRDaGFubmVsVHlwZSIsIChQeU9iamVjdCAqKSZTbmRDaGFubmVsX1R5cGUpOwotCVNQQl9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmU1BCX1R5cGUpIDwgMCkgcmV0dXJuOwotCVB5X0lOQ1JFRigmU1BCX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiU1BCIiwgKFB5T2JqZWN0ICopJlNQQl9UeXBlKTsKLQkvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KLQlQeV9JTkNSRUYoJlNQQl9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIlNQQlR5cGUiLCAoUHlPYmplY3QgKikmU1BCX1R5cGUpOworICAgIGQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOworICAgIFNuZF9FcnJvciA9IFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCk7CisgICAgaWYgKFNuZF9FcnJvciA9PSBOVUxMIHx8CisgICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFcnJvciIsIFNuZF9FcnJvcikgIT0gMCkKKyAgICAgICAgcmV0dXJuOworICAgIFNuZENoYW5uZWxfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJlNuZENoYW5uZWxfVHlwZSkgPCAwKSByZXR1cm47CisgICAgUHlfSU5DUkVGKCZTbmRDaGFubmVsX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiU25kQ2hhbm5lbCIsIChQeU9iamVjdCAqKSZTbmRDaGFubmVsX1R5cGUpOworICAgIC8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLworICAgIFB5X0lOQ1JFRigmU25kQ2hhbm5lbF9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIlNuZENoYW5uZWxUeXBlIiwgKFB5T2JqZWN0ICopJlNuZENoYW5uZWxfVHlwZSk7CisgICAgU1BCX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZTUEJfVHlwZSkgPCAwKSByZXR1cm47CisgICAgUHlfSU5DUkVGKCZTUEJfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJTUEIiLCAoUHlPYmplY3QgKikmU1BCX1R5cGUpOworICAgIC8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLworICAgIFB5X0lOQ1JFRigmU1BCX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiU1BCVHlwZSIsIChQeU9iamVjdCAqKSZTUEJfVHlwZSk7CiAjZW5kaWYgLyogX19MUDY0X18gKi8KIH0KIApkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvdGUvX1RFbW9kdWxlLmMgYi9NYWMvTW9kdWxlcy90ZS9fVEVtb2R1bGUuYwppbmRleCBmMTgyNjg4Li5hOTk4ZmM4IDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy90ZS9fVEVtb2R1bGUuYworKysgYi9NYWMvTW9kdWxlcy90ZS9fVEVtb2R1bGUuYwpAQCAtMTAsOSArMTAsOSBAQAogCiAvKiBNYWNybyB0byB0ZXN0IHdoZXRoZXIgYSB3ZWFrLWxvYWRlZCBDRk0gZnVuY3Rpb24gZXhpc3RzICovCiAjZGVmaW5lIFB5TWFjX1BSRUNIRUNLKHJ0bikgZG8geyBpZiAoICZydG4gPT0gTlVMTCApICB7XAotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgXAotICAgICAgICAiTm90IGF2YWlsYWJsZSBpbiB0aGlzIHNoYXJlZCBsaWJyYXJ5L09TIHZlcnNpb24iKTsgXAotICAgICAgICByZXR1cm4gTlVMTDsgXAorICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yLCBcCisgICAgIk5vdCBhdmFpbGFibGUgaW4gdGhpcyBzaGFyZWQgbGlicmFyeS9PUyB2ZXJzaW9uIik7IFwKKyAgICByZXR1cm4gTlVMTDsgXAogICAgIH19IHdoaWxlKDApCiAKIApAQCAtMzYsMjEgKzM2LDIxIEBACiBUZXh0U3R5bGVfTmV3KFRleHRTdHlsZVB0ciBpdHNlbGYpCiB7CiAKLSAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImxsbE8mIiwgKGxvbmcpaXRzZWxmLT50c0ZvbnQsIChsb25nKWl0c2VsZi0+dHNGYWNlLCAobG9uZylpdHNlbGYtPnRzU2l6ZSwgUWRSR0JfTmV3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRzZWxmLT50c0NvbG9yKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgibGxsTyYiLCAobG9uZylpdHNlbGYtPnRzRm9udCwgKGxvbmcpaXRzZWxmLT50c0ZhY2UsIChsb25nKWl0c2VsZi0+dHNTaXplLCBRZFJHQl9OZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJml0c2VsZi0+dHNDb2xvcik7CiB9CiAKIHN0YXRpYyBpbnQKIFRleHRTdHlsZV9Db252ZXJ0KFB5T2JqZWN0ICp2LCBUZXh0U3R5bGVQdHIgcF9pdHNlbGYpCiB7Ci0gICAgICAgIGxvbmcgZm9udCwgZmFjZSwgc2l6ZTsKKyAgICBsb25nIGZvbnQsIGZhY2UsIHNpemU7CiAKLSAgICAgICAgaWYoICFQeUFyZ19QYXJzZVR1cGxlKHYsICJsbGxPJiIsICZmb250LCAmZmFjZSwgJnNpemUsIFFkUkdCX0NvbnZlcnQsICZwX2l0c2VsZi0+dHNDb2xvcikgKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICBwX2l0c2VsZi0+dHNGb250ID0gKHNob3J0KWZvbnQ7Ci0gICAgICAgIHBfaXRzZWxmLT50c0ZhY2UgPSAoU3R5bGUpZmFjZTsKLSAgICAgICAgcF9pdHNlbGYtPnRzU2l6ZSA9IChzaG9ydClzaXplOwotICAgICAgICByZXR1cm4gMTsKKyAgICBpZiggIVB5QXJnX1BhcnNlVHVwbGUodiwgImxsbE8mIiwgJmZvbnQsICZmYWNlLCAmc2l6ZSwgUWRSR0JfQ29udmVydCwgJnBfaXRzZWxmLT50c0NvbG9yKSApCisgICAgICAgIHJldHVybiAwOworICAgIHBfaXRzZWxmLT50c0ZvbnQgPSAoc2hvcnQpZm9udDsKKyAgICBwX2l0c2VsZi0+dHNGYWNlID0gKFN0eWxlKWZhY2U7CisgICAgcF9pdHNlbGYtPnRzU2l6ZSA9IChzaG9ydClzaXplOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRFX0Vycm9yOwpAQCAtNjIsOTE3ICs2Miw5MTcgQEAKICNkZWZpbmUgVEVPYmpfQ2hlY2soeCkgKCh4KS0+b2JfdHlwZSA9PSAmVEVfVHlwZSB8fCBQeU9iamVjdF9UeXBlQ2hlY2soKHgpLCAmVEVfVHlwZSkpCiAKIHR5cGVkZWYgc3RydWN0IFRFT2JqZWN0IHsKLQlQeU9iamVjdF9IRUFECi0JVEVIYW5kbGUgb2JfaXRzZWxmOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBURUhhbmRsZSBvYl9pdHNlbGY7CiB9IFRFT2JqZWN0OwogCiBQeU9iamVjdCAqVEVPYmpfTmV3KFRFSGFuZGxlIGl0c2VsZikKIHsKLQlURU9iamVjdCAqaXQ7Ci0JaWYgKGl0c2VsZiA9PSBOVUxMKSB7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoVEVfRXJyb3IsIkNhbm5vdCBjcmVhdGUgbnVsbCBURSIpOwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgfQotCWl0ID0gUHlPYmplY3RfTkVXKFRFT2JqZWN0LCAmVEVfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOwotCWl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIFRFT2JqZWN0ICppdDsKKyAgICBpZiAoaXRzZWxmID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhURV9FcnJvciwiQ2Fubm90IGNyZWF0ZSBudWxsIFRFIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgaXQgPSBQeU9iamVjdF9ORVcoVEVPYmplY3QsICZURV9UeXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiAKIGludCBURU9ial9Db252ZXJ0KFB5T2JqZWN0ICp2LCBURUhhbmRsZSAqcF9pdHNlbGYpCiB7Ci0JaWYgKCFURU9ial9DaGVjayh2KSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJURSByZXF1aXJlZCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JKnBfaXRzZWxmID0gKChURU9iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0JcmV0dXJuIDE7CisgICAgaWYgKCFURU9ial9DaGVjayh2KSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJURSByZXF1aXJlZCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgKnBfaXRzZWxmID0gKChURU9iamVjdCAqKXYpLT5vYl9pdHNlbGY7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyB2b2lkIFRFT2JqX2RlYWxsb2MoVEVPYmplY3QgKnNlbGYpCiB7Ci0JVEVEaXNwb3NlKHNlbGYtPm9iX2l0c2VsZik7Ci0Jc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKKyAgICBURURpc3Bvc2Uoc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRFT2JqX1RFU2V0VGV4dChURU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JY2hhciAqdGV4dF9faW5fXzsKLQlsb25nIHRleHRfX2xlbl9fOwotCWludCB0ZXh0X19pbl9sZW5fXzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgY2hhciAqdGV4dF9faW5fXzsKKyAgICBsb25nIHRleHRfX2xlbl9fOworICAgIGludCB0ZXh0X19pbl9sZW5fXzsKICNpZm5kZWYgVEVTZXRUZXh0Ci0JUHlNYWNfUFJFQ0hFQ0soVEVTZXRUZXh0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhURVNldFRleHQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAicyMiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGV4dF9faW5fXywgJnRleHRfX2luX2xlbl9fKSkKLQkJcmV0dXJuIE5VTEw7Ci0JdGV4dF9fbGVuX18gPSB0ZXh0X19pbl9sZW5fXzsKLQlURVNldFRleHQodGV4dF9faW5fXywgdGV4dF9fbGVuX18sCi0JICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzIyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZXh0X19pbl9fLCAmdGV4dF9faW5fbGVuX18pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB0ZXh0X19sZW5fXyA9IHRleHRfX2luX2xlbl9fOworICAgIFRFU2V0VGV4dCh0ZXh0X19pbl9fLCB0ZXh0X19sZW5fXywKKyAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRFT2JqX1RFR2V0VGV4dChURU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ2hhcnNIYW5kbGUgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDaGFyc0hhbmRsZSBfcnY7CiAjaWZuZGVmIFRFR2V0VGV4dAotCVB5TWFjX1BSRUNIRUNLKFRFR2V0VGV4dCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVEVHZXRUZXh0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBURUdldFRleHQoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBURUdldFRleHQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRFT2JqX1RFSWRsZShURU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBURUlkbGUKLQlQeU1hY19QUkVDSEVDSyhURUlkbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFRFSWRsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JVEVJZGxlKF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVEVJZGxlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpURU9ial9URVNldFNlbGVjdChURU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBzZWxTdGFydDsKLQlsb25nIHNlbEVuZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgbG9uZyBzZWxTdGFydDsKKyAgICBsb25nIHNlbEVuZDsKICNpZm5kZWYgVEVTZXRTZWxlY3QKLQlQeU1hY19QUkVDSEVDSyhURVNldFNlbGVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVEVTZXRTZWxlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2VsU3RhcnQsCi0JICAgICAgICAgICAgICAgICAgICAgICZzZWxFbmQpKQotCQlyZXR1cm4gTlVMTDsKLQlURVNldFNlbGVjdChzZWxTdGFydCwKLQkgICAgICAgICAgICBzZWxFbmQsCi0JICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlbFN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VsRW5kKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVEVTZXRTZWxlY3Qoc2VsU3RhcnQsCisgICAgICAgICAgICAgICAgc2VsRW5kLAorICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpURU9ial9URUFjdGl2YXRlKFRFT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIFRFQWN0aXZhdGUKLQlQeU1hY19QUkVDSEVDSyhURUFjdGl2YXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhURUFjdGl2YXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlURUFjdGl2YXRlKF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVEVBY3RpdmF0ZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVEVPYmpfVEVEZWFjdGl2YXRlKFRFT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIFRFRGVhY3RpdmF0ZQotCVB5TWFjX1BSRUNIRUNLKFRFRGVhY3RpdmF0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVEVEZWFjdGl2YXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlURURlYWN0aXZhdGUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBURURlYWN0aXZhdGUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRFT2JqX1RFS2V5KFRFT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDaGFyUGFyYW1ldGVyIGtleTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ2hhclBhcmFtZXRlciBrZXk7CiAjaWZuZGVmIFRFS2V5Ci0JUHlNYWNfUFJFQ0hFQ0soVEVLZXkpOworICAgIFB5TWFjX1BSRUNIRUNLKFRFS2V5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAma2V5KSkKLQkJcmV0dXJuIE5VTEw7Ci0JVEVLZXkoa2V5LAotCSAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmtleSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFRFS2V5KGtleSwKKyAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVEVPYmpfVEVDdXQoVEVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgVEVDdXQKLQlQeU1hY19QUkVDSEVDSyhURUN1dCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVEVDdXQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCVRFQ3V0KF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVEVDdXQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRFT2JqX1RFQ29weShURU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBURUNvcHkKLQlQeU1hY19QUkVDSEVDSyhURUNvcHkpOworICAgIFB5TWFjX1BSRUNIRUNLKFRFQ29weSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JVEVDb3B5KF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVEVDb3B5KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpURU9ial9URVBhc3RlKFRFT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIFRFUGFzdGUKLQlQeU1hY19QUkVDSEVDSyhURVBhc3RlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhURVBhc3RlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlURVBhc3RlKF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVEVQYXN0ZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVEVPYmpfVEVEZWxldGUoVEVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgVEVEZWxldGUKLQlQeU1hY19QUkVDSEVDSyhURURlbGV0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVEVEZWxldGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCVRFRGVsZXRlKF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVEVEZWxldGUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRFT2JqX1RFSW5zZXJ0KFRFT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQljaGFyICp0ZXh0X19pbl9fOwotCWxvbmcgdGV4dF9fbGVuX187Ci0JaW50IHRleHRfX2luX2xlbl9fOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBjaGFyICp0ZXh0X19pbl9fOworICAgIGxvbmcgdGV4dF9fbGVuX187CisgICAgaW50IHRleHRfX2luX2xlbl9fOwogI2lmbmRlZiBURUluc2VydAotCVB5TWFjX1BSRUNIRUNLKFRFSW5zZXJ0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhURUluc2VydCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzIyIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0ZXh0X19pbl9fLCAmdGV4dF9faW5fbGVuX18pKQotCQlyZXR1cm4gTlVMTDsKLQl0ZXh0X19sZW5fXyA9IHRleHRfX2luX2xlbl9fOwotCVRFSW5zZXJ0KHRleHRfX2luX18sIHRleHRfX2xlbl9fLAotCSAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzIyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZXh0X19pbl9fLCAmdGV4dF9faW5fbGVuX18pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB0ZXh0X19sZW5fXyA9IHRleHRfX2luX2xlbl9fOworICAgIFRFSW5zZXJ0KHRleHRfX2luX18sIHRleHRfX2xlbl9fLAorICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpURU9ial9URVNldEFsaWdubWVudChURU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQganVzdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQganVzdDsKICNpZm5kZWYgVEVTZXRBbGlnbm1lbnQKLQlQeU1hY19QUkVDSEVDSyhURVNldEFsaWdubWVudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVEVTZXRBbGlnbm1lbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZqdXN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JVEVTZXRBbGlnbm1lbnQoanVzdCwKLQkgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZqdXN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVEVTZXRBbGlnbm1lbnQoanVzdCwKKyAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVEVPYmpfVEVVcGRhdGUoVEVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3QgclVwZGF0ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmVjdCByVXBkYXRlOwogI2lmbmRlZiBURVVwZGF0ZQotCVB5TWFjX1BSRUNIRUNLKFRFVXBkYXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhURVVwZGF0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyVXBkYXRlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JVEVVcGRhdGUoJnJVcGRhdGUsCi0JICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnJVcGRhdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBURVVwZGF0ZSgmclVwZGF0ZSwKKyAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVEVPYmpfVEVTY3JvbGwoVEVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IGRoOwotCXNob3J0IGR2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBkaDsKKyAgICBzaG9ydCBkdjsKICNpZm5kZWYgVEVTY3JvbGwKLQlQeU1hY19QUkVDSEVDSyhURVNjcm9sbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVEVTY3JvbGwpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZkdikpCi0JCXJldHVybiBOVUxMOwotCVRFU2Nyb2xsKGRoLAotCSAgICAgICAgIGR2LAotCSAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmR2KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVEVTY3JvbGwoZGgsCisgICAgICAgICAgICAgZHYsCisgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRFT2JqX1RFU2VsVmlldyhURU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBURVNlbFZpZXcKLQlQeU1hY19QUkVDSEVDSyhURVNlbFZpZXcpOworICAgIFB5TWFjX1BSRUNIRUNLKFRFU2VsVmlldyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JVEVTZWxWaWV3KF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVEVTZWxWaWV3KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpURU9ial9URVBpblNjcm9sbChURU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgZGg7Ci0Jc2hvcnQgZHY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IGRoOworICAgIHNob3J0IGR2OwogI2lmbmRlZiBURVBpblNjcm9sbAotCVB5TWFjX1BSRUNIRUNLKFRFUGluU2Nyb2xsKTsKKyAgICBQeU1hY19QUkVDSEVDSyhURVBpblNjcm9sbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmR2KSkKLQkJcmV0dXJuIE5VTEw7Ci0JVEVQaW5TY3JvbGwoZGgsCi0JICAgICAgICAgICAgZHYsCi0JICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZHYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBURVBpblNjcm9sbChkaCwKKyAgICAgICAgICAgICAgICBkdiwKKyAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVEVPYmpfVEVBdXRvVmlldyhURU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBmQXV0bzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBmQXV0bzsKICNpZm5kZWYgVEVBdXRvVmlldwotCVB5TWFjX1BSRUNIRUNLKFRFQXV0b1ZpZXcpOworICAgIFB5TWFjX1BSRUNIRUNLKFRFQXV0b1ZpZXcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZmQXV0bykpCi0JCXJldHVybiBOVUxMOwotCVRFQXV0b1ZpZXcoZkF1dG8sCi0JICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmQXV0bykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFRFQXV0b1ZpZXcoZkF1dG8sCisgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVEVPYmpfVEVDYWxUZXh0KFRFT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIFRFQ2FsVGV4dAotCVB5TWFjX1BSRUNIRUNLKFRFQ2FsVGV4dCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVEVDYWxUZXh0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlURUNhbFRleHQoX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBURUNhbFRleHQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRFT2JqX1RFR2V0T2Zmc2V0KFRFT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBfcnY7Ci0JUG9pbnQgcHQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IF9ydjsKKyAgICBQb2ludCBwdDsKICNpZm5kZWYgVEVHZXRPZmZzZXQKLQlQeU1hY19QUkVDSEVDSyhURUdldE9mZnNldCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVEVHZXRPZmZzZXQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnB0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVEVHZXRPZmZzZXQocHQsCi0JICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnB0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVEVHZXRPZmZzZXQocHQsCisgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVEVPYmpfVEVHZXRQb2ludChURU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUG9pbnQgX3J2OwotCXNob3J0IG9mZnNldDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUG9pbnQgX3J2OworICAgIHNob3J0IG9mZnNldDsKICNpZm5kZWYgVEVHZXRQb2ludAotCVB5TWFjX1BSRUNIRUNLKFRFR2V0UG9pbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKFRFR2V0UG9pbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZvZmZzZXQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBURUdldFBvaW50KG9mZnNldCwKLQkgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRQb2ludCwgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFRFR2V0UG9pbnQob2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFBvaW50LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRFT2JqX1RFQ2xpY2soVEVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBvaW50IHB0OwotCUJvb2xlYW4gZkV4dGVuZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUG9pbnQgcHQ7CisgICAgQm9vbGVhbiBmRXh0ZW5kOwogI2lmbmRlZiBURUNsaWNrCi0JUHlNYWNfUFJFQ0hFQ0soVEVDbGljayk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVEVDbGljayk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmIiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnB0LAotCSAgICAgICAgICAgICAgICAgICAgICAmZkV4dGVuZCkpCi0JCXJldHVybiBOVUxMOwotCVRFQ2xpY2socHQsCi0JICAgICAgICBmRXh0ZW5kLAotCSAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmcHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmRXh0ZW5kKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVEVDbGljayhwdCwKKyAgICAgICAgZkV4dGVuZCwKKyAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRFT2JqX1RFU2V0U3R5bGVIYW5kbGUoVEVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVRFU3R5bGVIYW5kbGUgdGhlSGFuZGxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBURVN0eWxlSGFuZGxlIHRoZUhhbmRsZTsKICNpZm5kZWYgVEVTZXRTdHlsZUhhbmRsZQotCVB5TWFjX1BSRUNIRUNLKFRFU2V0U3R5bGVIYW5kbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFRFU2V0U3R5bGVIYW5kbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUhhbmRsZSkpCi0JCXJldHVybiBOVUxMOwotCVRFU2V0U3R5bGVIYW5kbGUodGhlSGFuZGxlLAotCSAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVIYW5kbGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBURVNldFN0eWxlSGFuZGxlKHRoZUhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpURU9ial9URUdldFN0eWxlSGFuZGxlKFRFT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlURVN0eWxlSGFuZGxlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVEVTdHlsZUhhbmRsZSBfcnY7CiAjaWZuZGVmIFRFR2V0U3R5bGVIYW5kbGUKLQlQeU1hY19QUkVDSEVDSyhURUdldFN0eWxlSGFuZGxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhURUdldFN0eWxlSGFuZGxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBURUdldFN0eWxlSGFuZGxlKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVEVHZXRTdHlsZUhhbmRsZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVEVPYmpfVEVHZXRTdHlsZShURU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgb2Zmc2V0OwotCVRleHRTdHlsZSB0aGVTdHlsZTsKLQlzaG9ydCBsaW5lSGVpZ2h0OwotCXNob3J0IGZvbnRBc2NlbnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IG9mZnNldDsKKyAgICBUZXh0U3R5bGUgdGhlU3R5bGU7CisgICAgc2hvcnQgbGluZUhlaWdodDsKKyAgICBzaG9ydCBmb250QXNjZW50OwogI2lmbmRlZiBURUdldFN0eWxlCi0JUHlNYWNfUFJFQ0hFQ0soVEVHZXRTdHlsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVEVHZXRTdHlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCkpCi0JCXJldHVybiBOVUxMOwotCVRFR2V0U3R5bGUob2Zmc2V0LAotCSAgICAgICAgICAgJnRoZVN0eWxlLAotCSAgICAgICAgICAgJmxpbmVIZWlnaHQsCi0JICAgICAgICAgICAmZm9udEFzY2VudCwKLQkgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmhoIiwKLQkgICAgICAgICAgICAgICAgICAgICBUZXh0U3R5bGVfTmV3LCAmdGhlU3R5bGUsCi0JICAgICAgICAgICAgICAgICAgICAgbGluZUhlaWdodCwKLQkgICAgICAgICAgICAgICAgICAgICBmb250QXNjZW50KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFRFR2V0U3R5bGUob2Zmc2V0LAorICAgICAgICAgICAgICAgJnRoZVN0eWxlLAorICAgICAgICAgICAgICAgJmxpbmVIZWlnaHQsCisgICAgICAgICAgICAgICAmZm9udEFzY2VudCwKKyAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0U3R5bGVfTmV3LCAmdGhlU3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgbGluZUhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmb250QXNjZW50KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpURU9ial9URVN0eWxlUGFzdGUoVEVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgVEVTdHlsZVBhc3RlCi0JUHlNYWNfUFJFQ0hFQ0soVEVTdHlsZVBhc3RlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhURVN0eWxlUGFzdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCVRFU3R5bGVQYXN0ZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFRFU3R5bGVQYXN0ZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVEVPYmpfVEVTZXRTdHlsZShURU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgbW9kZTsKLQlUZXh0U3R5bGUgbmV3U3R5bGU7Ci0JQm9vbGVhbiBmUmVkcmF3OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBtb2RlOworICAgIFRleHRTdHlsZSBuZXdTdHlsZTsKKyAgICBCb29sZWFuIGZSZWRyYXc7CiAjaWZuZGVmIFRFU2V0U3R5bGUKLQlQeU1hY19QUkVDSEVDSyhURVNldFN0eWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhURVNldFN0eWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJmIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmbW9kZSwKLQkgICAgICAgICAgICAgICAgICAgICAgVGV4dFN0eWxlX0NvbnZlcnQsICZuZXdTdHlsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZSZWRyYXcpKQotCQlyZXR1cm4gTlVMTDsKLQlURVNldFN0eWxlKG1vZGUsCi0JICAgICAgICAgICAmbmV3U3R5bGUsCi0JICAgICAgICAgICBmUmVkcmF3LAotCSAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dFN0eWxlX0NvbnZlcnQsICZuZXdTdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZSZWRyYXcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBURVNldFN0eWxlKG1vZGUsCisgICAgICAgICAgICAgICAmbmV3U3R5bGUsCisgICAgICAgICAgICAgICBmUmVkcmF3LAorICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRFT2JqX1RFUmVwbGFjZVN0eWxlKFRFT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBtb2RlOwotCVRleHRTdHlsZSBvbGRTdHlsZTsKLQlUZXh0U3R5bGUgbmV3U3R5bGU7Ci0JQm9vbGVhbiBmUmVkcmF3OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBtb2RlOworICAgIFRleHRTdHlsZSBvbGRTdHlsZTsKKyAgICBUZXh0U3R5bGUgbmV3U3R5bGU7CisgICAgQm9vbGVhbiBmUmVkcmF3OwogI2lmbmRlZiBURVJlcGxhY2VTdHlsZQotCVB5TWFjX1BSRUNIRUNLKFRFUmVwbGFjZVN0eWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhURVJlcGxhY2VTdHlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyZPJmIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmbW9kZSwKLQkgICAgICAgICAgICAgICAgICAgICAgVGV4dFN0eWxlX0NvbnZlcnQsICZvbGRTdHlsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgVGV4dFN0eWxlX0NvbnZlcnQsICZuZXdTdHlsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZSZWRyYXcpKQotCQlyZXR1cm4gTlVMTDsKLQlURVJlcGxhY2VTdHlsZShtb2RlLAotCSAgICAgICAgICAgICAgICZvbGRTdHlsZSwKLQkgICAgICAgICAgICAgICAmbmV3U3R5bGUsCi0JICAgICAgICAgICAgICAgZlJlZHJhdywKLQkgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mTyZiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRTdHlsZV9Db252ZXJ0LCAmb2xkU3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRTdHlsZV9Db252ZXJ0LCAmbmV3U3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmUmVkcmF3KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVEVSZXBsYWNlU3R5bGUobW9kZSwKKyAgICAgICAgICAgICAgICAgICAmb2xkU3R5bGUsCisgICAgICAgICAgICAgICAgICAgJm5ld1N0eWxlLAorICAgICAgICAgICAgICAgICAgIGZSZWRyYXcsCisgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRFT2JqX1RFR2V0U3R5bGVTY3JhcEhhbmRsZShURU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JU3RTY3JwSGFuZGxlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgU3RTY3JwSGFuZGxlIF9ydjsKICNpZm5kZWYgVEVHZXRTdHlsZVNjcmFwSGFuZGxlCi0JUHlNYWNfUFJFQ0hFQ0soVEVHZXRTdHlsZVNjcmFwSGFuZGxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhURUdldFN0eWxlU2NyYXBIYW5kbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFRFR2V0U3R5bGVTY3JhcEhhbmRsZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFRFR2V0U3R5bGVTY3JhcEhhbmRsZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVEVPYmpfVEVTdHlsZUluc2VydChURU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JY2hhciAqdGV4dF9faW5fXzsKLQlsb25nIHRleHRfX2xlbl9fOwotCWludCB0ZXh0X19pbl9sZW5fXzsKLQlTdFNjcnBIYW5kbGUgaFNUOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBjaGFyICp0ZXh0X19pbl9fOworICAgIGxvbmcgdGV4dF9fbGVuX187CisgICAgaW50IHRleHRfX2luX2xlbl9fOworICAgIFN0U2NycEhhbmRsZSBoU1Q7CiAjaWZuZGVmIFRFU3R5bGVJbnNlcnQKLQlQeU1hY19QUkVDSEVDSyhURVN0eWxlSW5zZXJ0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhURVN0eWxlSW5zZXJ0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInMjTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGV4dF9faW5fXywgJnRleHRfX2luX2xlbl9fLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmhTVCkpCi0JCXJldHVybiBOVUxMOwotCXRleHRfX2xlbl9fID0gdGV4dF9faW5fbGVuX187Ci0JVEVTdHlsZUluc2VydCh0ZXh0X19pbl9fLCB0ZXh0X19sZW5fXywKLQkgICAgICAgICAgICAgIGhTVCwKLQkgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzI08mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRleHRfX2luX18sICZ0ZXh0X19pbl9sZW5fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZoU1QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB0ZXh0X19sZW5fXyA9IHRleHRfX2luX2xlbl9fOworICAgIFRFU3R5bGVJbnNlcnQodGV4dF9faW5fXywgdGV4dF9fbGVuX18sCisgICAgICAgICAgICAgICAgICBoU1QsCisgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVEVPYmpfVEVHZXRIZWlnaHQoVEVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWxvbmcgX3J2OwotCWxvbmcgZW5kTGluZTsKLQlsb25nIHN0YXJ0TGluZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgbG9uZyBfcnY7CisgICAgbG9uZyBlbmRMaW5lOworICAgIGxvbmcgc3RhcnRMaW5lOwogI2lmbmRlZiBURUdldEhlaWdodAotCVB5TWFjX1BSRUNIRUNLKFRFR2V0SGVpZ2h0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhURUdldEhlaWdodCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZlbmRMaW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAmc3RhcnRMaW5lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVEVHZXRIZWlnaHQoZW5kTGluZSwKLQkgICAgICAgICAgICAgICAgICBzdGFydExpbmUsCi0JICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5kTGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0TGluZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFRFR2V0SGVpZ2h0KGVuZExpbmUsCisgICAgICAgICAgICAgICAgICAgICAgc3RhcnRMaW5lLAorICAgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRFT2JqX1RFQ29udGludW91c1N0eWxlKFRFT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlzaG9ydCBtb2RlOwotCVRleHRTdHlsZSBhU3R5bGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIHNob3J0IG1vZGU7CisgICAgVGV4dFN0eWxlIGFTdHlsZTsKICNpZm5kZWYgVEVDb250aW51b3VzU3R5bGUKLQlQeU1hY19QUkVDSEVDSyhURUNvbnRpbnVvdXNTdHlsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVEVDb250aW51b3VzU3R5bGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vZGUsCi0JICAgICAgICAgICAgICAgICAgICAgIFRleHRTdHlsZV9Db252ZXJ0LCAmYVN0eWxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVEVDb250aW51b3VzU3R5bGUoJm1vZGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgJmFTdHlsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYmhPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIG1vZGUsCi0JICAgICAgICAgICAgICAgICAgICAgVGV4dFN0eWxlX05ldywgJmFTdHlsZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRTdHlsZV9Db252ZXJ0LCAmYVN0eWxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVEVDb250aW51b3VzU3R5bGUoJm1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFTdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYmhPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dFN0eWxlX05ldywgJmFTdHlsZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVEVPYmpfVEVVc2VTdHlsZVNjcmFwKFRFT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIHJhbmdlU3RhcnQ7Ci0JbG9uZyByYW5nZUVuZDsKLQlTdFNjcnBIYW5kbGUgbmV3U3R5bGVzOwotCUJvb2xlYW4gZlJlZHJhdzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgbG9uZyByYW5nZVN0YXJ0OworICAgIGxvbmcgcmFuZ2VFbmQ7CisgICAgU3RTY3JwSGFuZGxlIG5ld1N0eWxlczsKKyAgICBCb29sZWFuIGZSZWRyYXc7CiAjaWZuZGVmIFRFVXNlU3R5bGVTY3JhcAotCVB5TWFjX1BSRUNIRUNLKFRFVXNlU3R5bGVTY3JhcCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVEVVc2VTdHlsZVNjcmFwKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsTyZiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJhbmdlU3RhcnQsCi0JICAgICAgICAgICAgICAgICAgICAgICZyYW5nZUVuZCwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZuZXdTdHlsZXMsCi0JICAgICAgICAgICAgICAgICAgICAgICZmUmVkcmF3KSkKLQkJcmV0dXJuIE5VTEw7Ci0JVEVVc2VTdHlsZVNjcmFwKHJhbmdlU3RhcnQsCi0JICAgICAgICAgICAgICAgIHJhbmdlRW5kLAotCSAgICAgICAgICAgICAgICBuZXdTdHlsZXMsCi0JICAgICAgICAgICAgICAgIGZSZWRyYXcsCi0JICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbE8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyYW5nZVN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmFuZ2VFbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmbmV3U3R5bGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZlJlZHJhdykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFRFVXNlU3R5bGVTY3JhcChyYW5nZVN0YXJ0LAorICAgICAgICAgICAgICAgICAgICByYW5nZUVuZCwKKyAgICAgICAgICAgICAgICAgICAgbmV3U3R5bGVzLAorICAgICAgICAgICAgICAgICAgICBmUmVkcmF3LAorICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVEVPYmpfVEVOdW1TdHlsZXMoVEVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWxvbmcgX3J2OwotCWxvbmcgcmFuZ2VTdGFydDsKLQlsb25nIHJhbmdlRW5kOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBsb25nIF9ydjsKKyAgICBsb25nIHJhbmdlU3RhcnQ7CisgICAgbG9uZyByYW5nZUVuZDsKICNpZm5kZWYgVEVOdW1TdHlsZXMKLQlQeU1hY19QUkVDSEVDSyhURU51bVN0eWxlcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVEVOdW1TdHlsZXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmFuZ2VTdGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJhbmdlRW5kKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVEVOdW1TdHlsZXMocmFuZ2VTdGFydCwKLQkgICAgICAgICAgICAgICAgICByYW5nZUVuZCwKLQkgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyYW5nZVN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmFuZ2VFbmQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBURU51bVN0eWxlcyhyYW5nZVN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgIHJhbmdlRW5kLAorICAgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRFT2JqX1RFRmVhdHVyZUZsYWcoVEVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IF9ydjsKLQlzaG9ydCBmZWF0dXJlOwotCXNob3J0IGFjdGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgX3J2OworICAgIHNob3J0IGZlYXR1cmU7CisgICAgc2hvcnQgYWN0aW9uOwogI2lmbmRlZiBURUZlYXR1cmVGbGFnCi0JUHlNYWNfUFJFQ0hFQ0soVEVGZWF0dXJlRmxhZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVEVGZWF0dXJlRmxhZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZmZWF0dXJlLAotCSAgICAgICAgICAgICAgICAgICAgICAmYWN0aW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVEVGZWF0dXJlRmxhZyhmZWF0dXJlLAotCSAgICAgICAgICAgICAgICAgICAgYWN0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmVhdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFjdGlvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFRFRmVhdHVyZUZsYWcoZmVhdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRFT2JqX1RFR2V0SGlsaXRlUmduKFRFT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVJnbkhhbmRsZSByZWdpb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgUmduSGFuZGxlIHJlZ2lvbjsKICNpZm5kZWYgVEVHZXRIaWxpdGVSZ24KLQlQeU1hY19QUkVDSEVDSyhURUdldEhpbGl0ZVJnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soVEVHZXRIaWxpdGVSZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJlZ2lvbikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBURUdldEhpbGl0ZVJnbihyZWdpb24sCi0JICAgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZWdpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVEVHZXRIaWxpdGVSZ24ocmVnaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpURU9ial9hc19SZXNvdXJjZShURU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JSGFuZGxlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgSGFuZGxlIF9ydjsKICNpZm5kZWYgYXNfUmVzb3VyY2UKLQlQeU1hY19QUkVDSEVDSyhhc19SZXNvdXJjZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soYXNfUmVzb3VyY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IGFzX1Jlc291cmNlKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gYXNfUmVzb3VyY2UoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgVEVPYmpfbWV0aG9kc1tdID0gewotCXsiVEVTZXRUZXh0IiwgKFB5Q0Z1bmN0aW9uKVRFT2JqX1RFU2V0VGV4dCwgMSwKLQkgUHlEb2NfU1RSKCIoQnVmZmVyIHRleHQpIC0+IE5vbmUiKX0sCi0JeyJURUdldFRleHQiLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVHZXRUZXh0LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDaGFyc0hhbmRsZSBfcnYpIil9LAotCXsiVEVJZGxlIiwgKFB5Q0Z1bmN0aW9uKVRFT2JqX1RFSWRsZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiVEVTZXRTZWxlY3QiLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVTZXRTZWxlY3QsIDEsCi0JIFB5RG9jX1NUUigiKGxvbmcgc2VsU3RhcnQsIGxvbmcgc2VsRW5kKSAtPiBOb25lIil9LAotCXsiVEVBY3RpdmF0ZSIsIChQeUNGdW5jdGlvbilURU9ial9URUFjdGl2YXRlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJURURlYWN0aXZhdGUiLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVEZWFjdGl2YXRlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJURUtleSIsIChQeUNGdW5jdGlvbilURU9ial9URUtleSwgMSwKLQkgUHlEb2NfU1RSKCIoQ2hhclBhcmFtZXRlciBrZXkpIC0+IE5vbmUiKX0sCi0JeyJURUN1dCIsIChQeUNGdW5jdGlvbilURU9ial9URUN1dCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiVEVDb3B5IiwgKFB5Q0Z1bmN0aW9uKVRFT2JqX1RFQ29weSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiVEVQYXN0ZSIsIChQeUNGdW5jdGlvbilURU9ial9URVBhc3RlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJURURlbGV0ZSIsIChQeUNGdW5jdGlvbilURU9ial9URURlbGV0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiVEVJbnNlcnQiLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVJbnNlcnQsIDEsCi0JIFB5RG9jX1NUUigiKEJ1ZmZlciB0ZXh0KSAtPiBOb25lIil9LAotCXsiVEVTZXRBbGlnbm1lbnQiLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVTZXRBbGlnbm1lbnQsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGp1c3QpIC0+IE5vbmUiKX0sCi0JeyJURVVwZGF0ZSIsIChQeUNGdW5jdGlvbilURU9ial9URVVwZGF0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCByVXBkYXRlKSAtPiBOb25lIil9LAotCXsiVEVTY3JvbGwiLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVTY3JvbGwsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGRoLCBzaG9ydCBkdikgLT4gTm9uZSIpfSwKLQl7IlRFU2VsVmlldyIsIChQeUNGdW5jdGlvbilURU9ial9URVNlbFZpZXcsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IlRFUGluU2Nyb2xsIiwgKFB5Q0Z1bmN0aW9uKVRFT2JqX1RFUGluU2Nyb2xsLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBkaCwgc2hvcnQgZHYpIC0+IE5vbmUiKX0sCi0JeyJURUF1dG9WaWV3IiwgKFB5Q0Z1bmN0aW9uKVRFT2JqX1RFQXV0b1ZpZXcsIDEsCi0JIFB5RG9jX1NUUigiKEJvb2xlYW4gZkF1dG8pIC0+IE5vbmUiKX0sCi0JeyJURUNhbFRleHQiLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVDYWxUZXh0LCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJURUdldE9mZnNldCIsIChQeUNGdW5jdGlvbilURU9ial9URUdldE9mZnNldCwgMSwKLQkgUHlEb2NfU1RSKCIoUG9pbnQgcHQpIC0+IChzaG9ydCBfcnYpIil9LAotCXsiVEVHZXRQb2ludCIsIChQeUNGdW5jdGlvbilURU9ial9URUdldFBvaW50LCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBvZmZzZXQpIC0+IChQb2ludCBfcnYpIil9LAotCXsiVEVDbGljayIsIChQeUNGdW5jdGlvbilURU9ial9URUNsaWNrLCAxLAotCSBQeURvY19TVFIoIihQb2ludCBwdCwgQm9vbGVhbiBmRXh0ZW5kKSAtPiBOb25lIil9LAotCXsiVEVTZXRTdHlsZUhhbmRsZSIsIChQeUNGdW5jdGlvbilURU9ial9URVNldFN0eWxlSGFuZGxlLCAxLAotCSBQeURvY19TVFIoIihURVN0eWxlSGFuZGxlIHRoZUhhbmRsZSkgLT4gTm9uZSIpfSwKLQl7IlRFR2V0U3R5bGVIYW5kbGUiLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVHZXRTdHlsZUhhbmRsZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVEVTdHlsZUhhbmRsZSBfcnYpIil9LAotCXsiVEVHZXRTdHlsZSIsIChQeUNGdW5jdGlvbilURU9ial9URUdldFN0eWxlLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBvZmZzZXQpIC0+IChUZXh0U3R5bGUgdGhlU3R5bGUsIHNob3J0IGxpbmVIZWlnaHQsIHNob3J0IGZvbnRBc2NlbnQpIil9LAotCXsiVEVTdHlsZVBhc3RlIiwgKFB5Q0Z1bmN0aW9uKVRFT2JqX1RFU3R5bGVQYXN0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiVEVTZXRTdHlsZSIsIChQeUNGdW5jdGlvbilURU9ial9URVNldFN0eWxlLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBtb2RlLCBUZXh0U3R5bGUgbmV3U3R5bGUsIEJvb2xlYW4gZlJlZHJhdykgLT4gTm9uZSIpfSwKLQl7IlRFUmVwbGFjZVN0eWxlIiwgKFB5Q0Z1bmN0aW9uKVRFT2JqX1RFUmVwbGFjZVN0eWxlLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBtb2RlLCBUZXh0U3R5bGUgb2xkU3R5bGUsIFRleHRTdHlsZSBuZXdTdHlsZSwgQm9vbGVhbiBmUmVkcmF3KSAtPiBOb25lIil9LAotCXsiVEVHZXRTdHlsZVNjcmFwSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKVRFT2JqX1RFR2V0U3R5bGVTY3JhcEhhbmRsZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoU3RTY3JwSGFuZGxlIF9ydikiKX0sCi0JeyJURVN0eWxlSW5zZXJ0IiwgKFB5Q0Z1bmN0aW9uKVRFT2JqX1RFU3R5bGVJbnNlcnQsIDEsCi0JIFB5RG9jX1NUUigiKEJ1ZmZlciB0ZXh0LCBTdFNjcnBIYW5kbGUgaFNUKSAtPiBOb25lIil9LAotCXsiVEVHZXRIZWlnaHQiLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVHZXRIZWlnaHQsIDEsCi0JIFB5RG9jX1NUUigiKGxvbmcgZW5kTGluZSwgbG9uZyBzdGFydExpbmUpIC0+IChsb25nIF9ydikiKX0sCi0JeyJURUNvbnRpbnVvdXNTdHlsZSIsIChQeUNGdW5jdGlvbilURU9ial9URUNvbnRpbnVvdXNTdHlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgbW9kZSwgVGV4dFN0eWxlIGFTdHlsZSkgLT4gKEJvb2xlYW4gX3J2LCBzaG9ydCBtb2RlLCBUZXh0U3R5bGUgYVN0eWxlKSIpfSwKLQl7IlRFVXNlU3R5bGVTY3JhcCIsIChQeUNGdW5jdGlvbilURU9ial9URVVzZVN0eWxlU2NyYXAsIDEsCi0JIFB5RG9jX1NUUigiKGxvbmcgcmFuZ2VTdGFydCwgbG9uZyByYW5nZUVuZCwgU3RTY3JwSGFuZGxlIG5ld1N0eWxlcywgQm9vbGVhbiBmUmVkcmF3KSAtPiBOb25lIil9LAotCXsiVEVOdW1TdHlsZXMiLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVOdW1TdHlsZXMsIDEsCi0JIFB5RG9jX1NUUigiKGxvbmcgcmFuZ2VTdGFydCwgbG9uZyByYW5nZUVuZCkgLT4gKGxvbmcgX3J2KSIpfSwKLQl7IlRFRmVhdHVyZUZsYWciLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVGZWF0dXJlRmxhZywgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgZmVhdHVyZSwgc2hvcnQgYWN0aW9uKSAtPiAoc2hvcnQgX3J2KSIpfSwKLQl7IlRFR2V0SGlsaXRlUmduIiwgKFB5Q0Z1bmN0aW9uKVRFT2JqX1RFR2V0SGlsaXRlUmduLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgcmVnaW9uKSAtPiBOb25lIil9LAotCXsiYXNfUmVzb3VyY2UiLCAoUHlDRnVuY3Rpb24pVEVPYmpfYXNfUmVzb3VyY2UsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEhhbmRsZSBfcnYpIil9LAotCXtOVUxMLCBOVUxMLCAwfQorICAgIHsiVEVTZXRUZXh0IiwgKFB5Q0Z1bmN0aW9uKVRFT2JqX1RFU2V0VGV4dCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQnVmZmVyIHRleHQpIC0+IE5vbmUiKX0sCisgICAgeyJURUdldFRleHQiLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVHZXRUZXh0LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDaGFyc0hhbmRsZSBfcnYpIil9LAorICAgIHsiVEVJZGxlIiwgKFB5Q0Z1bmN0aW9uKVRFT2JqX1RFSWRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiVEVTZXRTZWxlY3QiLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVTZXRTZWxlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKGxvbmcgc2VsU3RhcnQsIGxvbmcgc2VsRW5kKSAtPiBOb25lIil9LAorICAgIHsiVEVBY3RpdmF0ZSIsIChQeUNGdW5jdGlvbilURU9ial9URUFjdGl2YXRlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJURURlYWN0aXZhdGUiLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVEZWFjdGl2YXRlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJURUtleSIsIChQeUNGdW5jdGlvbilURU9ial9URUtleSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ2hhclBhcmFtZXRlciBrZXkpIC0+IE5vbmUiKX0sCisgICAgeyJURUN1dCIsIChQeUNGdW5jdGlvbilURU9ial9URUN1dCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiVEVDb3B5IiwgKFB5Q0Z1bmN0aW9uKVRFT2JqX1RFQ29weSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiVEVQYXN0ZSIsIChQeUNGdW5jdGlvbilURU9ial9URVBhc3RlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJURURlbGV0ZSIsIChQeUNGdW5jdGlvbilURU9ial9URURlbGV0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiVEVJbnNlcnQiLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVJbnNlcnQsIDEsCisgICAgIFB5RG9jX1NUUigiKEJ1ZmZlciB0ZXh0KSAtPiBOb25lIil9LAorICAgIHsiVEVTZXRBbGlnbm1lbnQiLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVTZXRBbGlnbm1lbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGp1c3QpIC0+IE5vbmUiKX0sCisgICAgeyJURVVwZGF0ZSIsIChQeUNGdW5jdGlvbilURU9ial9URVVwZGF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCByVXBkYXRlKSAtPiBOb25lIil9LAorICAgIHsiVEVTY3JvbGwiLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVTY3JvbGwsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGRoLCBzaG9ydCBkdikgLT4gTm9uZSIpfSwKKyAgICB7IlRFU2VsVmlldyIsIChQeUNGdW5jdGlvbilURU9ial9URVNlbFZpZXcsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IlRFUGluU2Nyb2xsIiwgKFB5Q0Z1bmN0aW9uKVRFT2JqX1RFUGluU2Nyb2xsLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBkaCwgc2hvcnQgZHYpIC0+IE5vbmUiKX0sCisgICAgeyJURUF1dG9WaWV3IiwgKFB5Q0Z1bmN0aW9uKVRFT2JqX1RFQXV0b1ZpZXcsIDEsCisgICAgIFB5RG9jX1NUUigiKEJvb2xlYW4gZkF1dG8pIC0+IE5vbmUiKX0sCisgICAgeyJURUNhbFRleHQiLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVDYWxUZXh0LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJURUdldE9mZnNldCIsIChQeUNGdW5jdGlvbilURU9ial9URUdldE9mZnNldCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgcHQpIC0+IChzaG9ydCBfcnYpIil9LAorICAgIHsiVEVHZXRQb2ludCIsIChQeUNGdW5jdGlvbilURU9ial9URUdldFBvaW50LCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBvZmZzZXQpIC0+IChQb2ludCBfcnYpIil9LAorICAgIHsiVEVDbGljayIsIChQeUNGdW5jdGlvbilURU9ial9URUNsaWNrLCAxLAorICAgICBQeURvY19TVFIoIihQb2ludCBwdCwgQm9vbGVhbiBmRXh0ZW5kKSAtPiBOb25lIil9LAorICAgIHsiVEVTZXRTdHlsZUhhbmRsZSIsIChQeUNGdW5jdGlvbilURU9ial9URVNldFN0eWxlSGFuZGxlLCAxLAorICAgICBQeURvY19TVFIoIihURVN0eWxlSGFuZGxlIHRoZUhhbmRsZSkgLT4gTm9uZSIpfSwKKyAgICB7IlRFR2V0U3R5bGVIYW5kbGUiLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVHZXRTdHlsZUhhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVEVTdHlsZUhhbmRsZSBfcnYpIil9LAorICAgIHsiVEVHZXRTdHlsZSIsIChQeUNGdW5jdGlvbilURU9ial9URUdldFN0eWxlLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBvZmZzZXQpIC0+IChUZXh0U3R5bGUgdGhlU3R5bGUsIHNob3J0IGxpbmVIZWlnaHQsIHNob3J0IGZvbnRBc2NlbnQpIil9LAorICAgIHsiVEVTdHlsZVBhc3RlIiwgKFB5Q0Z1bmN0aW9uKVRFT2JqX1RFU3R5bGVQYXN0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiVEVTZXRTdHlsZSIsIChQeUNGdW5jdGlvbilURU9ial9URVNldFN0eWxlLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBtb2RlLCBUZXh0U3R5bGUgbmV3U3R5bGUsIEJvb2xlYW4gZlJlZHJhdykgLT4gTm9uZSIpfSwKKyAgICB7IlRFUmVwbGFjZVN0eWxlIiwgKFB5Q0Z1bmN0aW9uKVRFT2JqX1RFUmVwbGFjZVN0eWxlLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBtb2RlLCBUZXh0U3R5bGUgb2xkU3R5bGUsIFRleHRTdHlsZSBuZXdTdHlsZSwgQm9vbGVhbiBmUmVkcmF3KSAtPiBOb25lIil9LAorICAgIHsiVEVHZXRTdHlsZVNjcmFwSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKVRFT2JqX1RFR2V0U3R5bGVTY3JhcEhhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoU3RTY3JwSGFuZGxlIF9ydikiKX0sCisgICAgeyJURVN0eWxlSW5zZXJ0IiwgKFB5Q0Z1bmN0aW9uKVRFT2JqX1RFU3R5bGVJbnNlcnQsIDEsCisgICAgIFB5RG9jX1NUUigiKEJ1ZmZlciB0ZXh0LCBTdFNjcnBIYW5kbGUgaFNUKSAtPiBOb25lIil9LAorICAgIHsiVEVHZXRIZWlnaHQiLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVHZXRIZWlnaHQsIDEsCisgICAgIFB5RG9jX1NUUigiKGxvbmcgZW5kTGluZSwgbG9uZyBzdGFydExpbmUpIC0+IChsb25nIF9ydikiKX0sCisgICAgeyJURUNvbnRpbnVvdXNTdHlsZSIsIChQeUNGdW5jdGlvbilURU9ial9URUNvbnRpbnVvdXNTdHlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgbW9kZSwgVGV4dFN0eWxlIGFTdHlsZSkgLT4gKEJvb2xlYW4gX3J2LCBzaG9ydCBtb2RlLCBUZXh0U3R5bGUgYVN0eWxlKSIpfSwKKyAgICB7IlRFVXNlU3R5bGVTY3JhcCIsIChQeUNGdW5jdGlvbilURU9ial9URVVzZVN0eWxlU2NyYXAsIDEsCisgICAgIFB5RG9jX1NUUigiKGxvbmcgcmFuZ2VTdGFydCwgbG9uZyByYW5nZUVuZCwgU3RTY3JwSGFuZGxlIG5ld1N0eWxlcywgQm9vbGVhbiBmUmVkcmF3KSAtPiBOb25lIil9LAorICAgIHsiVEVOdW1TdHlsZXMiLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVOdW1TdHlsZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKGxvbmcgcmFuZ2VTdGFydCwgbG9uZyByYW5nZUVuZCkgLT4gKGxvbmcgX3J2KSIpfSwKKyAgICB7IlRFRmVhdHVyZUZsYWciLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVGZWF0dXJlRmxhZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgZmVhdHVyZSwgc2hvcnQgYWN0aW9uKSAtPiAoc2hvcnQgX3J2KSIpfSwKKyAgICB7IlRFR2V0SGlsaXRlUmduIiwgKFB5Q0Z1bmN0aW9uKVRFT2JqX1RFR2V0SGlsaXRlUmduLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgcmVnaW9uKSAtPiBOb25lIil9LAorICAgIHsiYXNfUmVzb3VyY2UiLCAoUHlDRnVuY3Rpb24pVEVPYmpfYXNfUmVzb3VyY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEhhbmRsZSBfcnYpIil9LAorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogc3RhdGljIFB5T2JqZWN0ICpURU9ial9nZXRfZGVzdFJlY3QoVEVPYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgUHlNYWNfQnVpbGRSZWN0LCAmKCpzZWxmLT5vYl9pdHNlbGYpLT5kZXN0UmVjdCk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgUHlNYWNfQnVpbGRSZWN0LCAmKCpzZWxmLT5vYl9pdHNlbGYpLT5kZXN0UmVjdCk7CiB9CiAKICNkZWZpbmUgVEVPYmpfc2V0X2Rlc3RSZWN0IE5VTEwKIAogc3RhdGljIFB5T2JqZWN0ICpURU9ial9nZXRfdmlld1JlY3QoVEVPYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgUHlNYWNfQnVpbGRSZWN0LCAmKCpzZWxmLT5vYl9pdHNlbGYpLT52aWV3UmVjdCk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgUHlNYWNfQnVpbGRSZWN0LCAmKCpzZWxmLT5vYl9pdHNlbGYpLT52aWV3UmVjdCk7CiB9CiAKICNkZWZpbmUgVEVPYmpfc2V0X3ZpZXdSZWN0IE5VTEwKIAogc3RhdGljIFB5T2JqZWN0ICpURU9ial9nZXRfc2VsUmVjdChURU9iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyYiLCBQeU1hY19CdWlsZFJlY3QsICYoKnNlbGYtPm9iX2l0c2VsZiktPnNlbFJlY3QpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPJiIsIFB5TWFjX0J1aWxkUmVjdCwgJigqc2VsZi0+b2JfaXRzZWxmKS0+c2VsUmVjdCk7CiB9CiAKICNkZWZpbmUgVEVPYmpfc2V0X3NlbFJlY3QgTlVMTAogCiBzdGF0aWMgUHlPYmplY3QgKlRFT2JqX2dldF9saW5lSGVpZ2h0KFRFT2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJoIiwgKCpzZWxmLT5vYl9pdHNlbGYpLT5saW5lSGVpZ2h0KTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaCIsICgqc2VsZi0+b2JfaXRzZWxmKS0+bGluZUhlaWdodCk7CiB9CiAKICNkZWZpbmUgVEVPYmpfc2V0X2xpbmVIZWlnaHQgTlVMTAogCiBzdGF0aWMgUHlPYmplY3QgKlRFT2JqX2dldF9mb250QXNjZW50KFRFT2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJoIiwgKCpzZWxmLT5vYl9pdHNlbGYpLT5mb250QXNjZW50KTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaCIsICgqc2VsZi0+b2JfaXRzZWxmKS0+Zm9udEFzY2VudCk7CiB9CiAKICNkZWZpbmUgVEVPYmpfc2V0X2ZvbnRBc2NlbnQgTlVMTAogCiBzdGF0aWMgUHlPYmplY3QgKlRFT2JqX2dldF9zZWxQb2ludChURU9iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyYiLCBQeU1hY19CdWlsZFBvaW50LCAoKnNlbGYtPm9iX2l0c2VsZiktPnNlbFBvaW50KTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyYiLCBQeU1hY19CdWlsZFBvaW50LCAoKnNlbGYtPm9iX2l0c2VsZiktPnNlbFBvaW50KTsKIH0KIAogI2RlZmluZSBURU9ial9zZXRfc2VsUG9pbnQgTlVMTAogCiBzdGF0aWMgUHlPYmplY3QgKlRFT2JqX2dldF9zZWxTdGFydChURU9iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaCIsICgqc2VsZi0+b2JfaXRzZWxmKS0+c2VsU3RhcnQpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJoIiwgKCpzZWxmLT5vYl9pdHNlbGYpLT5zZWxTdGFydCk7CiB9CiAKICNkZWZpbmUgVEVPYmpfc2V0X3NlbFN0YXJ0IE5VTEwKIAogc3RhdGljIFB5T2JqZWN0ICpURU9ial9nZXRfc2VsRW5kKFRFT2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJoIiwgKCpzZWxmLT5vYl9pdHNlbGYpLT5zZWxFbmQpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJoIiwgKCpzZWxmLT5vYl9pdHNlbGYpLT5zZWxFbmQpOwogfQogCiAjZGVmaW5lIFRFT2JqX3NldF9zZWxFbmQgTlVMTAogCiBzdGF0aWMgUHlPYmplY3QgKlRFT2JqX2dldF9hY3RpdmUoVEVPYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImgiLCAoKnNlbGYtPm9iX2l0c2VsZiktPmFjdGl2ZSk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImgiLCAoKnNlbGYtPm9iX2l0c2VsZiktPmFjdGl2ZSk7CiB9CiAKICNkZWZpbmUgVEVPYmpfc2V0X2FjdGl2ZSBOVUxMCiAKIHN0YXRpYyBQeU9iamVjdCAqVEVPYmpfZ2V0X2p1c3QoVEVPYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImgiLCAoKnNlbGYtPm9iX2l0c2VsZiktPmp1c3QpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJoIiwgKCpzZWxmLT5vYl9pdHNlbGYpLT5qdXN0KTsKIH0KIAogI2RlZmluZSBURU9ial9zZXRfanVzdCBOVUxMCiAKIHN0YXRpYyBQeU9iamVjdCAqVEVPYmpfZ2V0X3RlTGVuZ3RoKFRFT2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJoIiwgKCpzZWxmLT5vYl9pdHNlbGYpLT50ZUxlbmd0aCk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImgiLCAoKnNlbGYtPm9iX2l0c2VsZiktPnRlTGVuZ3RoKTsKIH0KIAogI2RlZmluZSBURU9ial9zZXRfdGVMZW5ndGggTlVMTAogCiBzdGF0aWMgUHlPYmplY3QgKlRFT2JqX2dldF90eEZvbnQoVEVPYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImgiLCAoKnNlbGYtPm9iX2l0c2VsZiktPnR4Rm9udCk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImgiLCAoKnNlbGYtPm9iX2l0c2VsZiktPnR4Rm9udCk7CiB9CiAKICNkZWZpbmUgVEVPYmpfc2V0X3R4Rm9udCBOVUxMCiAKIHN0YXRpYyBQeU9iamVjdCAqVEVPYmpfZ2V0X3R4RmFjZShURU9iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaCIsICgqc2VsZi0+b2JfaXRzZWxmKS0+dHhGYWNlKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaCIsICgqc2VsZi0+b2JfaXRzZWxmKS0+dHhGYWNlKTsKIH0KIAogI2RlZmluZSBURU9ial9zZXRfdHhGYWNlIE5VTEwKIAogc3RhdGljIFB5T2JqZWN0ICpURU9ial9nZXRfdHhNb2RlKFRFT2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJoIiwgKCpzZWxmLT5vYl9pdHNlbGYpLT50eE1vZGUpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJoIiwgKCpzZWxmLT5vYl9pdHNlbGYpLT50eE1vZGUpOwogfQogCiAjZGVmaW5lIFRFT2JqX3NldF90eE1vZGUgTlVMTAogCiBzdGF0aWMgUHlPYmplY3QgKlRFT2JqX2dldF90eFNpemUoVEVPYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImgiLCAoKnNlbGYtPm9iX2l0c2VsZiktPnR4U2l6ZSk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImgiLCAoKnNlbGYtPm9iX2l0c2VsZiktPnR4U2l6ZSk7CiB9CiAKICNkZWZpbmUgVEVPYmpfc2V0X3R4U2l6ZSBOVUxMCiAKIHN0YXRpYyBQeU9iamVjdCAqVEVPYmpfZ2V0X25MaW5lcyhURU9iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaCIsICgqc2VsZi0+b2JfaXRzZWxmKS0+bkxpbmVzKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaCIsICgqc2VsZi0+b2JfaXRzZWxmKS0+bkxpbmVzKTsKIH0KIAogI2RlZmluZSBURU9ial9zZXRfbkxpbmVzIE5VTEwKIAogc3RhdGljIFB5R2V0U2V0RGVmIFRFT2JqX2dldHNldGxpc3RbXSA9IHsKLQl7ImRlc3RSZWN0IiwgKGdldHRlcilURU9ial9nZXRfZGVzdFJlY3QsIChzZXR0ZXIpVEVPYmpfc2V0X2Rlc3RSZWN0LCAiRGVzdGluYXRpb24gcmVjdGFuZ2xlIn0sCi0JeyJ2aWV3UmVjdCIsIChnZXR0ZXIpVEVPYmpfZ2V0X3ZpZXdSZWN0LCAoc2V0dGVyKVRFT2JqX3NldF92aWV3UmVjdCwgIlZpZXdpbmcgcmVjdGFuZ2xlIn0sCi0JeyJzZWxSZWN0IiwgKGdldHRlcilURU9ial9nZXRfc2VsUmVjdCwgKHNldHRlcilURU9ial9zZXRfc2VsUmVjdCwgIlNlbGVjdGlvbiByZWN0YW5nbGUifSwKLQl7ImxpbmVIZWlnaHQiLCAoZ2V0dGVyKVRFT2JqX2dldF9saW5lSGVpZ2h0LCAoc2V0dGVyKVRFT2JqX3NldF9saW5lSGVpZ2h0LCAiSGVpZ2h0IG9mIGEgbGluZSJ9LAotCXsiZm9udEFzY2VudCIsIChnZXR0ZXIpVEVPYmpfZ2V0X2ZvbnRBc2NlbnQsIChzZXR0ZXIpVEVPYmpfc2V0X2ZvbnRBc2NlbnQsICJBc2NlbnQgb2YgYSBsaW5lIn0sCi0JeyJzZWxQb2ludCIsIChnZXR0ZXIpVEVPYmpfZ2V0X3NlbFBvaW50LCAoc2V0dGVyKVRFT2JqX3NldF9zZWxQb2ludCwgIlNlbGVjdGlvbiBQb2ludCJ9LAotCXsic2VsU3RhcnQiLCAoZ2V0dGVyKVRFT2JqX2dldF9zZWxTdGFydCwgKHNldHRlcilURU9ial9zZXRfc2VsU3RhcnQsICJTdGFydCBvZiBzZWxlY3Rpb24ifSwKLQl7InNlbEVuZCIsIChnZXR0ZXIpVEVPYmpfZ2V0X3NlbEVuZCwgKHNldHRlcilURU9ial9zZXRfc2VsRW5kLCAiRW5kIG9mIHNlbGVjdGlvbiJ9LAotCXsiYWN0aXZlIiwgKGdldHRlcilURU9ial9nZXRfYWN0aXZlLCAoc2V0dGVyKVRFT2JqX3NldF9hY3RpdmUsICJUQkQifSwKLQl7Imp1c3QiLCAoZ2V0dGVyKVRFT2JqX2dldF9qdXN0LCAoc2V0dGVyKVRFT2JqX3NldF9qdXN0LCAiSnVzdGlmaWNhdGlvbiJ9LAotCXsidGVMZW5ndGgiLCAoZ2V0dGVyKVRFT2JqX2dldF90ZUxlbmd0aCwgKHNldHRlcilURU9ial9zZXRfdGVMZW5ndGgsICJUQkQifSwKLQl7InR4Rm9udCIsIChnZXR0ZXIpVEVPYmpfZ2V0X3R4Rm9udCwgKHNldHRlcilURU9ial9zZXRfdHhGb250LCAiQ3VycmVudCBmb250In0sCi0JeyJ0eEZhY2UiLCAoZ2V0dGVyKVRFT2JqX2dldF90eEZhY2UsIChzZXR0ZXIpVEVPYmpfc2V0X3R4RmFjZSwgIkN1cnJlbnQgZm9udCB2YXJpYW50In0sCi0JeyJ0eE1vZGUiLCAoZ2V0dGVyKVRFT2JqX2dldF90eE1vZGUsIChzZXR0ZXIpVEVPYmpfc2V0X3R4TW9kZSwgIkN1cnJlbnQgdGV4dC1kcmF3aW5nIG1vZGUifSwKLQl7InR4U2l6ZSIsIChnZXR0ZXIpVEVPYmpfZ2V0X3R4U2l6ZSwgKHNldHRlcilURU9ial9zZXRfdHhTaXplLCAiQ3VycmVudCBmb250IHNpemUifSwKLQl7Im5MaW5lcyIsIChnZXR0ZXIpVEVPYmpfZ2V0X25MaW5lcywgKHNldHRlcilURU9ial9zZXRfbkxpbmVzLCAiVEJEIn0sCi0Je05VTEwsIE5VTEwsIE5VTEwsIE5VTEx9LAorICAgIHsiZGVzdFJlY3QiLCAoZ2V0dGVyKVRFT2JqX2dldF9kZXN0UmVjdCwgKHNldHRlcilURU9ial9zZXRfZGVzdFJlY3QsICJEZXN0aW5hdGlvbiByZWN0YW5nbGUifSwKKyAgICB7InZpZXdSZWN0IiwgKGdldHRlcilURU9ial9nZXRfdmlld1JlY3QsIChzZXR0ZXIpVEVPYmpfc2V0X3ZpZXdSZWN0LCAiVmlld2luZyByZWN0YW5nbGUifSwKKyAgICB7InNlbFJlY3QiLCAoZ2V0dGVyKVRFT2JqX2dldF9zZWxSZWN0LCAoc2V0dGVyKVRFT2JqX3NldF9zZWxSZWN0LCAiU2VsZWN0aW9uIHJlY3RhbmdsZSJ9LAorICAgIHsibGluZUhlaWdodCIsIChnZXR0ZXIpVEVPYmpfZ2V0X2xpbmVIZWlnaHQsIChzZXR0ZXIpVEVPYmpfc2V0X2xpbmVIZWlnaHQsICJIZWlnaHQgb2YgYSBsaW5lIn0sCisgICAgeyJmb250QXNjZW50IiwgKGdldHRlcilURU9ial9nZXRfZm9udEFzY2VudCwgKHNldHRlcilURU9ial9zZXRfZm9udEFzY2VudCwgIkFzY2VudCBvZiBhIGxpbmUifSwKKyAgICB7InNlbFBvaW50IiwgKGdldHRlcilURU9ial9nZXRfc2VsUG9pbnQsIChzZXR0ZXIpVEVPYmpfc2V0X3NlbFBvaW50LCAiU2VsZWN0aW9uIFBvaW50In0sCisgICAgeyJzZWxTdGFydCIsIChnZXR0ZXIpVEVPYmpfZ2V0X3NlbFN0YXJ0LCAoc2V0dGVyKVRFT2JqX3NldF9zZWxTdGFydCwgIlN0YXJ0IG9mIHNlbGVjdGlvbiJ9LAorICAgIHsic2VsRW5kIiwgKGdldHRlcilURU9ial9nZXRfc2VsRW5kLCAoc2V0dGVyKVRFT2JqX3NldF9zZWxFbmQsICJFbmQgb2Ygc2VsZWN0aW9uIn0sCisgICAgeyJhY3RpdmUiLCAoZ2V0dGVyKVRFT2JqX2dldF9hY3RpdmUsIChzZXR0ZXIpVEVPYmpfc2V0X2FjdGl2ZSwgIlRCRCJ9LAorICAgIHsianVzdCIsIChnZXR0ZXIpVEVPYmpfZ2V0X2p1c3QsIChzZXR0ZXIpVEVPYmpfc2V0X2p1c3QsICJKdXN0aWZpY2F0aW9uIn0sCisgICAgeyJ0ZUxlbmd0aCIsIChnZXR0ZXIpVEVPYmpfZ2V0X3RlTGVuZ3RoLCAoc2V0dGVyKVRFT2JqX3NldF90ZUxlbmd0aCwgIlRCRCJ9LAorICAgIHsidHhGb250IiwgKGdldHRlcilURU9ial9nZXRfdHhGb250LCAoc2V0dGVyKVRFT2JqX3NldF90eEZvbnQsICJDdXJyZW50IGZvbnQifSwKKyAgICB7InR4RmFjZSIsIChnZXR0ZXIpVEVPYmpfZ2V0X3R4RmFjZSwgKHNldHRlcilURU9ial9zZXRfdHhGYWNlLCAiQ3VycmVudCBmb250IHZhcmlhbnQifSwKKyAgICB7InR4TW9kZSIsIChnZXR0ZXIpVEVPYmpfZ2V0X3R4TW9kZSwgKHNldHRlcilURU9ial9zZXRfdHhNb2RlLCAiQ3VycmVudCB0ZXh0LWRyYXdpbmcgbW9kZSJ9LAorICAgIHsidHhTaXplIiwgKGdldHRlcilURU9ial9nZXRfdHhTaXplLCAoc2V0dGVyKVRFT2JqX3NldF90eFNpemUsICJDdXJyZW50IGZvbnQgc2l6ZSJ9LAorICAgIHsibkxpbmVzIiwgKGdldHRlcilURU9ial9nZXRfbkxpbmVzLCAoc2V0dGVyKVRFT2JqX3NldF9uTGluZXMsICJUQkQifSwKKyAgICB7TlVMTCwgTlVMTCwgTlVMTCwgTlVMTH0sCiB9OwogCiAKQEAgLTk4Nyw2MSArOTg3LDYxIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqVEVPYmpfdHBfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKl9hcmdzLCBQeU9iamVjdCAqX2t3ZHMpCiB7Ci0JUHlPYmplY3QgKl9zZWxmOwotCVRFSGFuZGxlIGl0c2VsZjsKLQljaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKKyAgICBQeU9iamVjdCAqX3NlbGY7CisgICAgVEVIYW5kbGUgaXRzZWxmOworICAgIGNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgVEVPYmpfQ29udmVydCwgJml0c2VsZikpIHJldHVybiBOVUxMOwotCWlmICgoX3NlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JKChURU9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiBfc2VsZjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBURU9ial9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAoKFRFT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgcmV0dXJuIF9zZWxmOwogfQogCiAjZGVmaW5lIFRFT2JqX3RwX2ZyZWUgUHlPYmplY3RfRGVsCiAKIAogUHlUeXBlT2JqZWN0IFRFX1R5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCi0JMCwgLypvYl9zaXplKi8KLQkiX1RFLlRFIiwgLyp0cF9uYW1lKi8KLQlzaXplb2YoVEVPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCi0JMCwgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKSBURU9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsIC8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLwotCShjbXBmdW5jKSBURU9ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYykgVEVPYmpfcmVwciwgLyp0cF9yZXByKi8KLQkoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCi0JKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpIFRFT2JqX2hhc2gsIC8qdHBfaGFzaCovCi0JMCwgLyp0cF9jYWxsKi8KLQkwLCAvKnRwX3N0ciovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLwotCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCi0JMCwgLyp0cF9hc19idWZmZXIqLwotCVB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCTAsIC8qdHBfZG9jKi8KLQkwLCAvKnRwX3RyYXZlcnNlKi8KLQkwLCAvKnRwX2NsZWFyKi8KLQkwLCAvKnRwX3JpY2hjb21wYXJlKi8KLQkwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLQkwLCAvKnRwX2l0ZXIqLwotCTAsIC8qdHBfaXRlcm5leHQqLwotCVRFT2JqX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KLQkwLCAvKnRwX21lbWJlcnMqLwotCVRFT2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KLQkwLCAvKnRwX2Jhc2UqLwotCTAsIC8qdHBfZGljdCovCi0JMCwgLyp0cF9kZXNjcl9nZXQqLwotCTAsIC8qdHBfZGVzY3Jfc2V0Ki8KLQkwLCAvKnRwX2RpY3RvZmZzZXQqLwotCVRFT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KLQlURU9ial90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KLQlURU9ial90cF9uZXcsIC8qIHRwX25ldyAqLwotCVRFT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAvKm9iX3NpemUqLworICAgICJfVEUuVEUiLCAvKnRwX25hbWUqLworICAgIHNpemVvZihURU9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpIFRFT2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgMCwgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCisgICAgKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCisgICAgKGNtcGZ1bmMpIFRFT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCisgICAgKHJlcHJmdW5jKSBURU9ial9yZXByLCAvKnRwX3JlcHIqLworICAgIChQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIChQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLworICAgIChoYXNoZnVuYykgVEVPYmpfaGFzaCwgLyp0cF9oYXNoKi8KKyAgICAwLCAvKnRwX2NhbGwqLworICAgIDAsIC8qdHBfc3RyKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCisgICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgMCwgLyp0cF9kb2MqLworICAgIDAsIC8qdHBfdHJhdmVyc2UqLworICAgIDAsIC8qdHBfY2xlYXIqLworICAgIDAsIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsIC8qdHBfaXRlciovCisgICAgMCwgLyp0cF9pdGVybmV4dCovCisgICAgVEVPYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLworICAgIDAsIC8qdHBfbWVtYmVycyovCisgICAgVEVPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLworICAgIDAsIC8qdHBfYmFzZSovCisgICAgMCwgLyp0cF9kaWN0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX2dldCovCisgICAgMCwgLyp0cF9kZXNjcl9zZXQqLworICAgIDAsIC8qdHBfZGljdG9mZnNldCovCisgICAgVEVPYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLworICAgIFRFT2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLworICAgIFRFT2JqX3RwX25ldywgLyogdHBfbmV3ICovCisgICAgVEVPYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRW5kIG9iamVjdCB0eXBlIFRFIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0xMDQ5LDI1NyArMTA0OSwyNTcgQEAKIAogc3RhdGljIFB5T2JqZWN0ICpURV9URVNjcmFwSGFuZGxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlIYW5kbGUgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBIYW5kbGUgX3J2OwogI2lmbmRlZiBURVNjcmFwSGFuZGxlCi0JUHlNYWNfUFJFQ0hFQ0soVEVTY3JhcEhhbmRsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVEVTY3JhcEhhbmRsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVEVTY3JhcEhhbmRsZSgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVEVTY3JhcEhhbmRsZSgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpURV9URUdldFNjcmFwTGVuZ3RoKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgbG9uZyBfcnY7CiAjaWZuZGVmIFRFR2V0U2NyYXBMZW5ndGgKLQlQeU1hY19QUkVDSEVDSyhURUdldFNjcmFwTGVuZ3RoKTsKKyAgICBQeU1hY19QUkVDSEVDSyhURUdldFNjcmFwTGVuZ3RoKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBURUdldFNjcmFwTGVuZ3RoKCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFRFR2V0U2NyYXBMZW5ndGgoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpURV9URU5ldyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVEVIYW5kbGUgX3J2OwotCVJlY3QgZGVzdFJlY3Q7Ci0JUmVjdCB2aWV3UmVjdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVEVIYW5kbGUgX3J2OworICAgIFJlY3QgZGVzdFJlY3Q7CisgICAgUmVjdCB2aWV3UmVjdDsKICNpZm5kZWYgVEVOZXcKLQlQeU1hY19QUkVDSEVDSyhURU5ldyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVEVOZXcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZkZXN0UmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnZpZXdSZWN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVEVOZXcoJmRlc3RSZWN0LAotCSAgICAgICAgICAgICZ2aWV3UmVjdCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBURU9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZkZXN0UmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnZpZXdSZWN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVEVOZXcoJmRlc3RSZWN0LAorICAgICAgICAgICAgICAgICZ2aWV3UmVjdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBURU9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVEVfVEVUZXh0Qm94KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQljaGFyICp0ZXh0X19pbl9fOwotCWxvbmcgdGV4dF9fbGVuX187Ci0JaW50IHRleHRfX2luX2xlbl9fOwotCVJlY3QgYm94OwotCXNob3J0IGp1c3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGNoYXIgKnRleHRfX2luX187CisgICAgbG9uZyB0ZXh0X19sZW5fXzsKKyAgICBpbnQgdGV4dF9faW5fbGVuX187CisgICAgUmVjdCBib3g7CisgICAgc2hvcnQganVzdDsKICNpZm5kZWYgVEVUZXh0Qm94Ci0JUHlNYWNfUFJFQ0hFQ0soVEVUZXh0Qm94KTsKKyAgICBQeU1hY19QUkVDSEVDSyhURVRleHRCb3gpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAicyNPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGV4dF9faW5fXywgJnRleHRfX2luX2xlbl9fLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm94LAotCSAgICAgICAgICAgICAgICAgICAgICAmanVzdCkpCi0JCXJldHVybiBOVUxMOwotCXRleHRfX2xlbl9fID0gdGV4dF9faW5fbGVuX187Ci0JVEVUZXh0Qm94KHRleHRfX2luX18sIHRleHRfX2xlbl9fLAotCSAgICAgICAgICAmYm94LAotCSAgICAgICAgICBqdXN0KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAicyNPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGV4dF9faW5fXywgJnRleHRfX2luX2xlbl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmanVzdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHRleHRfX2xlbl9fID0gdGV4dF9faW5fbGVuX187CisgICAgVEVUZXh0Qm94KHRleHRfX2luX18sIHRleHRfX2xlbl9fLAorICAgICAgICAgICAgICAmYm94LAorICAgICAgICAgICAgICBqdXN0KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVEVfVEVTdHlsZU5ldyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVEVIYW5kbGUgX3J2OwotCVJlY3QgZGVzdFJlY3Q7Ci0JUmVjdCB2aWV3UmVjdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVEVIYW5kbGUgX3J2OworICAgIFJlY3QgZGVzdFJlY3Q7CisgICAgUmVjdCB2aWV3UmVjdDsKICNpZm5kZWYgVEVTdHlsZU5ldwotCVB5TWFjX1BSRUNIRUNLKFRFU3R5bGVOZXcpOworICAgIFB5TWFjX1BSRUNIRUNLKFRFU3R5bGVOZXcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZkZXN0UmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnZpZXdSZWN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVEVTdHlsZU5ldygmZGVzdFJlY3QsCi0JICAgICAgICAgICAgICAgICAmdmlld1JlY3QpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgVEVPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmZGVzdFJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZ2aWV3UmVjdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFRFU3R5bGVOZXcoJmRlc3RSZWN0LAorICAgICAgICAgICAgICAgICAgICAgJnZpZXdSZWN0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFRFT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpURV9URVNldFNjcmFwTGVuZ3RoKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIGxlbmd0aDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgbG9uZyBsZW5ndGg7CiAjaWZuZGVmIFRFU2V0U2NyYXBMZW5ndGgKLQlQeU1hY19QUkVDSEVDSyhURVNldFNjcmFwTGVuZ3RoKTsKKyAgICBQeU1hY19QUkVDSEVDSyhURVNldFNjcmFwTGVuZ3RoKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmbGVuZ3RoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JVEVTZXRTY3JhcExlbmd0aChsZW5ndGgpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmxlbmd0aCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFRFU2V0U2NyYXBMZW5ndGgobGVuZ3RoKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVEVfVEVGcm9tU2NyYXAoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CiAjaWZuZGVmIFRFRnJvbVNjcmFwCi0JUHlNYWNfUFJFQ0hFQ0soVEVGcm9tU2NyYXApOworICAgIFB5TWFjX1BSRUNIRUNLKFRFRnJvbVNjcmFwKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gVEVGcm9tU2NyYXAoKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFRFRnJvbVNjcmFwKCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVEVfVEVUb1NjcmFwKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOwogI2lmbmRlZiBURVRvU2NyYXAKLQlQeU1hY19QUkVDSEVDSyhURVRvU2NyYXApOworICAgIFB5TWFjX1BSRUNIRUNLKFRFVG9TY3JhcCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFRFVG9TY3JhcCgpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVEVUb1NjcmFwKCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVEVfVEVHZXRTY3JhcEhhbmRsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JSGFuZGxlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgSGFuZGxlIF9ydjsKICNpZm5kZWYgVEVHZXRTY3JhcEhhbmRsZQotCVB5TWFjX1BSRUNIRUNLKFRFR2V0U2NyYXBIYW5kbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFRFR2V0U2NyYXBIYW5kbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFRFR2V0U2NyYXBIYW5kbGUoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFRFR2V0U2NyYXBIYW5kbGUoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVEVfVEVTZXRTY3JhcEhhbmRsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JSGFuZGxlIHZhbHVlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBIYW5kbGUgdmFsdWU7CiAjaWZuZGVmIFRFU2V0U2NyYXBIYW5kbGUKLQlQeU1hY19QUkVDSEVDSyhURVNldFNjcmFwSGFuZGxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhURVNldFNjcmFwSGFuZGxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ2YWx1ZSkpCi0JCXJldHVybiBOVUxMOwotCVRFU2V0U2NyYXBIYW5kbGUodmFsdWUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdmFsdWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBURVNldFNjcmFwSGFuZGxlKHZhbHVlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVEVfTE1HZXRXb3JkUmVkcmF3KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlVSW50OCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFVJbnQ4IF9ydjsKICNpZm5kZWYgTE1HZXRXb3JkUmVkcmF3Ci0JUHlNYWNfUFJFQ0hFQ0soTE1HZXRXb3JkUmVkcmF3KTsKKyAgICBQeU1hY19QUkVDSEVDSyhMTUdldFdvcmRSZWRyYXcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IExNR2V0V29yZFJlZHJhdygpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBMTUdldFdvcmRSZWRyYXcoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpURV9MTVNldFdvcmRSZWRyYXcoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVVJbnQ4IHZhbHVlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBVSW50OCB2YWx1ZTsKICNpZm5kZWYgTE1TZXRXb3JkUmVkcmF3Ci0JUHlNYWNfUFJFQ0hFQ0soTE1TZXRXb3JkUmVkcmF3KTsKKyAgICBQeU1hY19QUkVDSEVDSyhMTVNldFdvcmRSZWRyYXcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSkpCi0JCXJldHVybiBOVUxMOwotCUxNU2V0V29yZFJlZHJhdyh2YWx1ZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBMTVNldFdvcmRSZWRyYXcodmFsdWUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpURV9hc19URShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVEVIYW5kbGUgX3J2OwotCUhhbmRsZSBoOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBURUhhbmRsZSBfcnY7CisgICAgSGFuZGxlIGg7CiAjaWZuZGVmIGFzX1RFCi0JUHlNYWNfUFJFQ0hFQ0soYXNfVEUpOworICAgIFB5TWFjX1BSRUNIRUNLKGFzX1RFKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gYXNfVEUoaCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBURU9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBhc19URShoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFRFT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KICNlbmRpZiAvKiBfX0xQNjRfXyAqLwogCiBzdGF0aWMgUHlNZXRob2REZWYgVEVfbWV0aG9kc1tdID0gewogI2lmbmRlZiBfX0xQNjRfXwotCXsiVEVTY3JhcEhhbmRsZSIsIChQeUNGdW5jdGlvbilURV9URVNjcmFwSGFuZGxlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChIYW5kbGUgX3J2KSIpfSwKLQl7IlRFR2V0U2NyYXBMZW5ndGgiLCAoUHlDRnVuY3Rpb24pVEVfVEVHZXRTY3JhcExlbmd0aCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAobG9uZyBfcnYpIil9LAotCXsiVEVOZXciLCAoUHlDRnVuY3Rpb24pVEVfVEVOZXcsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgZGVzdFJlY3QsIFJlY3Qgdmlld1JlY3QpIC0+IChURUhhbmRsZSBfcnYpIil9LAotCXsiVEVUZXh0Qm94IiwgKFB5Q0Z1bmN0aW9uKVRFX1RFVGV4dEJveCwgMSwKLQkgUHlEb2NfU1RSKCIoQnVmZmVyIHRleHQsIFJlY3QgYm94LCBzaG9ydCBqdXN0KSAtPiBOb25lIil9LAotCXsiVEVTdHlsZU5ldyIsIChQeUNGdW5jdGlvbilURV9URVN0eWxlTmV3LCAxLAotCSBQeURvY19TVFIoIihSZWN0IGRlc3RSZWN0LCBSZWN0IHZpZXdSZWN0KSAtPiAoVEVIYW5kbGUgX3J2KSIpfSwKLQl7IlRFU2V0U2NyYXBMZW5ndGgiLCAoUHlDRnVuY3Rpb24pVEVfVEVTZXRTY3JhcExlbmd0aCwgMSwKLQkgUHlEb2NfU1RSKCIobG9uZyBsZW5ndGgpIC0+IE5vbmUiKX0sCi0JeyJURUZyb21TY3JhcCIsIChQeUNGdW5jdGlvbilURV9URUZyb21TY3JhcCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiVEVUb1NjcmFwIiwgKFB5Q0Z1bmN0aW9uKVRFX1RFVG9TY3JhcCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiVEVHZXRTY3JhcEhhbmRsZSIsIChQeUNGdW5jdGlvbilURV9URUdldFNjcmFwSGFuZGxlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChIYW5kbGUgX3J2KSIpfSwKLQl7IlRFU2V0U2NyYXBIYW5kbGUiLCAoUHlDRnVuY3Rpb24pVEVfVEVTZXRTY3JhcEhhbmRsZSwgMSwKLQkgUHlEb2NfU1RSKCIoSGFuZGxlIHZhbHVlKSAtPiBOb25lIil9LAotCXsiTE1HZXRXb3JkUmVkcmF3IiwgKFB5Q0Z1bmN0aW9uKVRFX0xNR2V0V29yZFJlZHJhdywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVUludDggX3J2KSIpfSwKLQl7IkxNU2V0V29yZFJlZHJhdyIsIChQeUNGdW5jdGlvbilURV9MTVNldFdvcmRSZWRyYXcsIDEsCi0JIFB5RG9jX1NUUigiKFVJbnQ4IHZhbHVlKSAtPiBOb25lIil9LAotCXsiYXNfVEUiLCAoUHlDRnVuY3Rpb24pVEVfYXNfVEUsIDEsCi0JIFB5RG9jX1NUUigiKEhhbmRsZSBoKSAtPiAoVEVIYW5kbGUgX3J2KSIpfSwKKyAgICB7IlRFU2NyYXBIYW5kbGUiLCAoUHlDRnVuY3Rpb24pVEVfVEVTY3JhcEhhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoSGFuZGxlIF9ydikiKX0sCisgICAgeyJURUdldFNjcmFwTGVuZ3RoIiwgKFB5Q0Z1bmN0aW9uKVRFX1RFR2V0U2NyYXBMZW5ndGgsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKGxvbmcgX3J2KSIpfSwKKyAgICB7IlRFTmV3IiwgKFB5Q0Z1bmN0aW9uKVRFX1RFTmV3LCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IGRlc3RSZWN0LCBSZWN0IHZpZXdSZWN0KSAtPiAoVEVIYW5kbGUgX3J2KSIpfSwKKyAgICB7IlRFVGV4dEJveCIsIChQeUNGdW5jdGlvbilURV9URVRleHRCb3gsIDEsCisgICAgIFB5RG9jX1NUUigiKEJ1ZmZlciB0ZXh0LCBSZWN0IGJveCwgc2hvcnQganVzdCkgLT4gTm9uZSIpfSwKKyAgICB7IlRFU3R5bGVOZXciLCAoUHlDRnVuY3Rpb24pVEVfVEVTdHlsZU5ldywgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCBkZXN0UmVjdCwgUmVjdCB2aWV3UmVjdCkgLT4gKFRFSGFuZGxlIF9ydikiKX0sCisgICAgeyJURVNldFNjcmFwTGVuZ3RoIiwgKFB5Q0Z1bmN0aW9uKVRFX1RFU2V0U2NyYXBMZW5ndGgsIDEsCisgICAgIFB5RG9jX1NUUigiKGxvbmcgbGVuZ3RoKSAtPiBOb25lIil9LAorICAgIHsiVEVGcm9tU2NyYXAiLCAoUHlDRnVuY3Rpb24pVEVfVEVGcm9tU2NyYXAsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IlRFVG9TY3JhcCIsIChQeUNGdW5jdGlvbilURV9URVRvU2NyYXAsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IlRFR2V0U2NyYXBIYW5kbGUiLCAoUHlDRnVuY3Rpb24pVEVfVEVHZXRTY3JhcEhhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoSGFuZGxlIF9ydikiKX0sCisgICAgeyJURVNldFNjcmFwSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKVRFX1RFU2V0U2NyYXBIYW5kbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEhhbmRsZSB2YWx1ZSkgLT4gTm9uZSIpfSwKKyAgICB7IkxNR2V0V29yZFJlZHJhdyIsIChQeUNGdW5jdGlvbilURV9MTUdldFdvcmRSZWRyYXcsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQ4IF9ydikiKX0sCisgICAgeyJMTVNldFdvcmRSZWRyYXciLCAoUHlDRnVuY3Rpb24pVEVfTE1TZXRXb3JkUmVkcmF3LCAxLAorICAgICBQeURvY19TVFIoIihVSW50OCB2YWx1ZSkgLT4gTm9uZSIpfSwKKyAgICB7ImFzX1RFIiwgKFB5Q0Z1bmN0aW9uKVRFX2FzX1RFLCAxLAorICAgICBQeURvY19TVFIoIihIYW5kbGUgaCkgLT4gKFRFSGFuZGxlIF9ydikiKX0sCiAjZW5kaWYgLyogX19MUDY0X18gKi8KLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKIApAQCAtMTMwNywzMSArMTMwNywzMSBAQAogCiB2b2lkIGluaXRfVEUodm9pZCkKIHsKLQlQeU9iamVjdCAqbTsKKyAgICBQeU9iamVjdCAqbTsKICNpZm5kZWYgX19MUDY0X18KLQlQeU9iamVjdCAqZDsKKyAgICBQeU9iamVjdCAqZDsKIAogCiAKLQkgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKFRFSGFuZGxlLCBURU9ial9OZXcpOwotCSAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKFRFSGFuZGxlLCBURU9ial9Db252ZXJ0KTsKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoVEVIYW5kbGUsIFRFT2JqX05ldyk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChURUhhbmRsZSwgVEVPYmpfQ29udmVydCk7CiAKICNlbmRpZiAvKiBfX0xQNjRfXyAqLwogCi0JbSA9IFB5X0luaXRNb2R1bGUoIl9URSIsIFRFX21ldGhvZHMpOworICAgIG0gPSBQeV9Jbml0TW9kdWxlKCJfVEUiLCBURV9tZXRob2RzKTsKICNpZm5kZWYgX19MUDY0X18KLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQlURV9FcnJvciA9IFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCk7Ci0JaWYgKFRFX0Vycm9yID09IE5VTEwgfHwKLQkgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVycm9yIiwgVEVfRXJyb3IpICE9IDApCi0JCXJldHVybjsKLQlURV9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmVEVfVHlwZSkgPCAwKSByZXR1cm47Ci0JUHlfSU5DUkVGKCZURV9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIlRFIiwgKFB5T2JqZWN0ICopJlRFX1R5cGUpOwotCS8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLwotCVB5X0lOQ1JFRigmVEVfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJURVR5cGUiLCAoUHlPYmplY3QgKikmVEVfVHlwZSk7CisgICAgZCA9IFB5TW9kdWxlX0dldERpY3QobSk7CisgICAgVEVfRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOworICAgIGlmIChURV9FcnJvciA9PSBOVUxMIHx8CisgICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFcnJvciIsIFRFX0Vycm9yKSAhPSAwKQorICAgICAgICByZXR1cm47CisgICAgVEVfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJlRFX1R5cGUpIDwgMCkgcmV0dXJuOworICAgIFB5X0lOQ1JFRigmVEVfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJURSIsIChQeU9iamVjdCAqKSZURV9UeXBlKTsKKyAgICAvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KKyAgICBQeV9JTkNSRUYoJlRFX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiVEVUeXBlIiwgKFB5T2JqZWN0ICopJlRFX1R5cGUpOwogI2VuZGlmIC8qIF9fTFA2NF9fICovCiB9CiAKZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL3dpbi9fV2lubW9kdWxlLmMgYi9NYWMvTW9kdWxlcy93aW4vX1dpbm1vZHVsZS5jCmluZGV4IDg3Zjc1OTEuLjg5MjMzZWQgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL3dpbi9fV2lubW9kdWxlLmMKKysrIGIvTWFjL01vZHVsZXMvd2luL19XaW5tb2R1bGUuYwpAQCAtOSw5ICs5LDkgQEAKIAogLyogTWFjcm8gdG8gdGVzdCB3aGV0aGVyIGEgd2Vhay1sb2FkZWQgQ0ZNIGZ1bmN0aW9uIGV4aXN0cyAqLwogI2RlZmluZSBQeU1hY19QUkVDSEVDSyhydG4pIGRvIHsgaWYgKCAmcnRuID09IE5VTEwgKSAge1wKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsIFwKLSAgICAgICAgIk5vdCBhdmFpbGFibGUgaW4gdGhpcyBzaGFyZWQgbGlicmFyeS9PUyB2ZXJzaW9uIik7IFwKLSAgICAgICAgcmV0dXJuIE5VTEw7IFwKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgXAorICAgICJOb3QgYXZhaWxhYmxlIGluIHRoaXMgc2hhcmVkIGxpYnJhcnkvT1MgdmVyc2lvbiIpOyBcCisgICAgcmV0dXJuIE5VTEw7IFwKICAgICB9fSB3aGlsZSgwKQogCiAKQEAgLTM2LDcgKzM2LDcgQEAKIHN0YXRpYyB2b2lkCiBQeU1hY19BdXRvRGlzcG9zZVdpbmRvdyhXaW5kb3dQdHIgdykKIHsKLSAgICAgICAgRGlzcG9zZVdpbmRvdyh3KTsKKyAgICBEaXNwb3NlV2luZG93KHcpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbl9FcnJvcjsKQEAgLTQ4LDI1MjIgKzQ4LDI1MjIgQEAKICNkZWZpbmUgV2luT2JqX0NoZWNrKHgpICgoeCktPm9iX3R5cGUgPT0gJldpbmRvd19UeXBlIHx8IFB5T2JqZWN0X1R5cGVDaGVjaygoeCksICZXaW5kb3dfVHlwZSkpCiAKIHR5cGVkZWYgc3RydWN0IFdpbmRvd09iamVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCVdpbmRvd1B0ciBvYl9pdHNlbGY7Ci0Jdm9pZCAoKm9iX2ZyZWVpdCkoV2luZG93UHRyIHB0cik7CisgICAgUHlPYmplY3RfSEVBRAorICAgIFdpbmRvd1B0ciBvYl9pdHNlbGY7CisgICAgdm9pZCAoKm9iX2ZyZWVpdCkoV2luZG93UHRyIHB0cik7CiB9IFdpbmRvd09iamVjdDsKIAogUHlPYmplY3QgKldpbk9ial9OZXcoV2luZG93UHRyIGl0c2VsZikKIHsKLQlXaW5kb3dPYmplY3QgKml0OwotCWlmIChpdHNlbGYgPT0gTlVMTCkgcmV0dXJuIFB5TWFjX0Vycm9yKHJlc05vdEZvdW5kKTsKLQkvKiBYWFhYIE9yIHNob3VsZCB3ZSB1c2UgV2hpY2hXaW5kb3cgY29kZSBoZXJlPyAqLwotCWl0ID0gUHlPYmplY3RfTkVXKFdpbmRvd09iamVjdCwgJldpbmRvd19UeXBlKTsKLQlpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlpdC0+b2JfZnJlZWl0ID0gTlVMTDsKLQlpZiAoR2V0V1JlZkNvbihpdHNlbGYpID09IDApCi0JewotCQlTZXRXUmVmQ29uKGl0c2VsZiwgKGxvbmcpaXQpOwotCQlpdC0+b2JfZnJlZWl0ID0gUHlNYWNfQXV0b0Rpc3Bvc2VXaW5kb3c7Ci0JfQotCXJldHVybiAoUHlPYmplY3QgKilpdDsKKyAgICBXaW5kb3dPYmplY3QgKml0OworICAgIGlmIChpdHNlbGYgPT0gTlVMTCkgcmV0dXJuIFB5TWFjX0Vycm9yKHJlc05vdEZvdW5kKTsKKyAgICAvKiBYWFhYIE9yIHNob3VsZCB3ZSB1c2UgV2hpY2hXaW5kb3cgY29kZSBoZXJlPyAqLworICAgIGl0ID0gUHlPYmplY3RfTkVXKFdpbmRvd09iamVjdCwgJldpbmRvd19UeXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICBpdC0+b2JfZnJlZWl0ID0gTlVMTDsKKyAgICBpZiAoR2V0V1JlZkNvbihpdHNlbGYpID09IDApCisgICAgeworICAgICAgICBTZXRXUmVmQ29uKGl0c2VsZiwgKGxvbmcpaXQpOworICAgICAgICBpdC0+b2JfZnJlZWl0ID0gUHlNYWNfQXV0b0Rpc3Bvc2VXaW5kb3c7CisgICAgfQorICAgIHJldHVybiAoUHlPYmplY3QgKilpdDsKIH0KIAogaW50IFdpbk9ial9Db252ZXJ0KFB5T2JqZWN0ICp2LCBXaW5kb3dQdHIgKnBfaXRzZWxmKQogewogCi0JaWYgKHYgPT0gUHlfTm9uZSkgeyAqcF9pdHNlbGYgPSBOVUxMOyByZXR1cm4gMTsgfQotCWlmIChQeUludF9DaGVjayh2KSkgeyAqcF9pdHNlbGYgPSAoV2luZG93UHRyKVB5SW50X0FzTG9uZyh2KTsgcmV0dXJuIDE7IH0KKyAgICBpZiAodiA9PSBQeV9Ob25lKSB7ICpwX2l0c2VsZiA9IE5VTEw7IHJldHVybiAxOyB9CisgICAgaWYgKFB5SW50X0NoZWNrKHYpKSB7ICpwX2l0c2VsZiA9IChXaW5kb3dQdHIpUHlJbnRfQXNMb25nKHYpOyByZXR1cm4gMTsgfQogCi0JewotCQlEaWFsb2dSZWYgZGxnOwotCQlpZiAoRGxnT2JqX0NvbnZlcnQodiwgJmRsZykgJiYgZGxnKSB7Ci0JCQkqcF9pdHNlbGYgPSBHZXREaWFsb2dXaW5kb3coZGxnKTsKLQkJCXJldHVybiAxOwotCQl9Ci0JCVB5RXJyX0NsZWFyKCk7Ci0JfQotCWlmICghV2luT2JqX0NoZWNrKHYpKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIldpbmRvdyByZXF1aXJlZCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JKnBfaXRzZWxmID0gKChXaW5kb3dPYmplY3QgKil2KS0+b2JfaXRzZWxmOwotCXJldHVybiAxOworICAgIHsKKyAgICAgICAgRGlhbG9nUmVmIGRsZzsKKyAgICAgICAgaWYgKERsZ09ial9Db252ZXJ0KHYsICZkbGcpICYmIGRsZykgeworICAgICAgICAgICAgKnBfaXRzZWxmID0gR2V0RGlhbG9nV2luZG93KGRsZyk7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICBQeUVycl9DbGVhcigpOworICAgIH0KKyAgICBpZiAoIVdpbk9ial9DaGVjayh2KSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJXaW5kb3cgcmVxdWlyZWQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICpwX2l0c2VsZiA9ICgoV2luZG93T2JqZWN0ICopdiktPm9iX2l0c2VsZjsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIHZvaWQgV2luT2JqX2RlYWxsb2MoV2luZG93T2JqZWN0ICpzZWxmKQogewotCWlmIChzZWxmLT5vYl9mcmVlaXQgJiYgc2VsZi0+b2JfaXRzZWxmKQotCXsKLQkJU2V0V1JlZkNvbihzZWxmLT5vYl9pdHNlbGYsIDApOwotCQlzZWxmLT5vYl9mcmVlaXQoc2VsZi0+b2JfaXRzZWxmKTsKLQl9Ci0Jc2VsZi0+b2JfaXRzZWxmID0gTlVMTDsKLQlzZWxmLT5vYl9mcmVlaXQgPSBOVUxMOwotCXNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CisgICAgaWYgKHNlbGYtPm9iX2ZyZWVpdCAmJiBzZWxmLT5vYl9pdHNlbGYpCisgICAgeworICAgICAgICBTZXRXUmVmQ29uKHNlbGYtPm9iX2l0c2VsZiwgMCk7CisgICAgICAgIHNlbGYtPm9iX2ZyZWVpdChzZWxmLT5vYl9pdHNlbGYpOworICAgIH0KKyAgICBzZWxmLT5vYl9pdHNlbGYgPSBOVUxMOworICAgIHNlbGYtPm9iX2ZyZWVpdCA9IE5VTEw7CisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfR2V0V2luZG93T3duZXJDb3VudChXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVUludDMyIG91dENvdW50OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQzMiBvdXRDb3VudDsKICNpZm5kZWYgR2V0V2luZG93T3duZXJDb3VudAotCVB5TWFjX1BSRUNIRUNLKEdldFdpbmRvd093bmVyQ291bnQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFdpbmRvd093bmVyQ291bnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRXaW5kb3dPd25lckNvdW50KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvdW50KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRDb3VudCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRXaW5kb3dPd25lckNvdW50KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvdW50KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRDb3VudCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0Nsb25lV2luZG93KFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKICNpZm5kZWYgQ2xvbmVXaW5kb3cKLQlQeU1hY19QUkVDSEVDSyhDbG9uZVdpbmRvdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ2xvbmVXaW5kb3cpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDbG9uZVdpbmRvdyhfc2VsZi0+b2JfaXRzZWxmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENsb25lV2luZG93KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9HZXRXaW5kb3dSZXRhaW5Db3VudChXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUl0ZW1Db3VudCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEl0ZW1Db3VudCBfcnY7CiAjaWZuZGVmIEdldFdpbmRvd1JldGFpbkNvdW50Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0V2luZG93UmV0YWluQ291bnQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFdpbmRvd1JldGFpbkNvdW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRXaW5kb3dSZXRhaW5Db3VudChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0V2luZG93UmV0YWluQ291bnQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX1JldGFpbldpbmRvdyhXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CiAjaWZuZGVmIFJldGFpbldpbmRvdwotCVB5TWFjX1BSRUNIRUNLKFJldGFpbldpbmRvdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUmV0YWluV2luZG93KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUmV0YWluV2luZG93KF9zZWxmLT5vYl9pdHNlbGYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUmV0YWluV2luZG93KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9SZWxlYXNlV2luZG93KFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKICNpZm5kZWYgUmVsZWFzZVdpbmRvdwotCVB5TWFjX1BSRUNIRUNLKFJlbGVhc2VXaW5kb3cpOworICAgIFB5TWFjX1BSRUNIRUNLKFJlbGVhc2VXaW5kb3cpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBSZWxlYXNlV2luZG93KF9zZWxmLT5vYl9pdHNlbGYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUmVsZWFzZVdpbmRvdyhfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfUmVzaGFwZUN1c3RvbVdpbmRvdyhXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CiAjaWZuZGVmIFJlc2hhcGVDdXN0b21XaW5kb3cKLQlQeU1hY19QUkVDSEVDSyhSZXNoYXBlQ3VzdG9tV2luZG93KTsKKyAgICBQeU1hY19QUkVDSEVDSyhSZXNoYXBlQ3VzdG9tV2luZG93KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUmVzaGFwZUN1c3RvbVdpbmRvdyhfc2VsZi0+b2JfaXRzZWxmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFJlc2hhcGVDdXN0b21XaW5kb3coX3NlbGYtPm9iX2l0c2VsZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0dldFdpbmRvd1dpZGdldEhpbGl0ZShXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93RGVmUGFydENvZGUgb3V0SGlsaXRlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd0RlZlBhcnRDb2RlIG91dEhpbGl0ZTsKICNpZm5kZWYgR2V0V2luZG93V2lkZ2V0SGlsaXRlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0V2luZG93V2lkZ2V0SGlsaXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRXaW5kb3dXaWRnZXRIaWxpdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRXaW5kb3dXaWRnZXRIaWxpdGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRIaWxpdGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIG91dEhpbGl0ZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRXaW5kb3dXaWRnZXRIaWxpdGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRIaWxpdGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dEhpbGl0ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0dldFdpbmRvd0NsYXNzKFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlXaW5kb3dDbGFzcyBvdXRDbGFzczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBXaW5kb3dDbGFzcyBvdXRDbGFzczsKICNpZm5kZWYgR2V0V2luZG93Q2xhc3MKLQlQeU1hY19QUkVDSEVDSyhHZXRXaW5kb3dDbGFzcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0V2luZG93Q2xhc3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRXaW5kb3dDbGFzcyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAmb3V0Q2xhc3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIG91dENsYXNzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldFdpbmRvd0NsYXNzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDbGFzcyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0Q2xhc3MpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9HZXRXaW5kb3dBdHRyaWJ1dGVzKFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlXaW5kb3dBdHRyaWJ1dGVzIG91dEF0dHJpYnV0ZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93QXR0cmlidXRlcyBvdXRBdHRyaWJ1dGVzOwogI2lmbmRlZiBHZXRXaW5kb3dBdHRyaWJ1dGVzCi0JUHlNYWNfUFJFQ0hFQ0soR2V0V2luZG93QXR0cmlidXRlcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0V2luZG93QXR0cmlidXRlcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldFdpbmRvd0F0dHJpYnV0ZXMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0QXR0cmlidXRlcyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0QXR0cmlidXRlcyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRXaW5kb3dBdHRyaWJ1dGVzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEF0dHJpYnV0ZXMpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dEF0dHJpYnV0ZXMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9DaGFuZ2VXaW5kb3dBdHRyaWJ1dGVzKFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlXaW5kb3dBdHRyaWJ1dGVzIHNldFRoZXNlQXR0cmlidXRlczsKLQlXaW5kb3dBdHRyaWJ1dGVzIGNsZWFyVGhlc2VBdHRyaWJ1dGVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd0F0dHJpYnV0ZXMgc2V0VGhlc2VBdHRyaWJ1dGVzOworICAgIFdpbmRvd0F0dHJpYnV0ZXMgY2xlYXJUaGVzZUF0dHJpYnV0ZXM7CiAjaWZuZGVmIENoYW5nZVdpbmRvd0F0dHJpYnV0ZXMKLQlQeU1hY19QUkVDSEVDSyhDaGFuZ2VXaW5kb3dBdHRyaWJ1dGVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDaGFuZ2VXaW5kb3dBdHRyaWJ1dGVzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNldFRoZXNlQXR0cmlidXRlcywKLQkgICAgICAgICAgICAgICAgICAgICAgJmNsZWFyVGhlc2VBdHRyaWJ1dGVzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENoYW5nZVdpbmRvd0F0dHJpYnV0ZXMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaGVzZUF0dHJpYnV0ZXMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJUaGVzZUF0dHJpYnV0ZXMpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNldFRoZXNlQXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNsZWFyVGhlc2VBdHRyaWJ1dGVzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENoYW5nZVdpbmRvd0F0dHJpYnV0ZXMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaGVzZUF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJUaGVzZUF0dHJpYnV0ZXMpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9TZXRXaW5kb3dDbGFzcyhXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93Q2xhc3MgaW5XaW5kb3dDbGFzczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBXaW5kb3dDbGFzcyBpbldpbmRvd0NsYXNzOwogI2lmbmRlZiBTZXRXaW5kb3dDbGFzcwotCVB5TWFjX1BSRUNIRUNLKFNldFdpbmRvd0NsYXNzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRXaW5kb3dDbGFzcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluV2luZG93Q2xhc3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0V2luZG93Q2xhc3MoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgaW5XaW5kb3dDbGFzcyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbldpbmRvd0NsYXNzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldFdpbmRvd0NsYXNzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGluV2luZG93Q2xhc3MpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9TZXRXaW5kb3dNb2RhbGl0eShXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93TW9kYWxpdHkgaW5Nb2RhbEtpbmQ7Ci0JV2luZG93UHRyIGluVW5hdmFpbGFibGVXaW5kb3c7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93TW9kYWxpdHkgaW5Nb2RhbEtpbmQ7CisgICAgV2luZG93UHRyIGluVW5hdmFpbGFibGVXaW5kb3c7CiAjaWZuZGVmIFNldFdpbmRvd01vZGFsaXR5Ci0JUHlNYWNfUFJFQ0hFQ0soU2V0V2luZG93TW9kYWxpdHkpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFdpbmRvd01vZGFsaXR5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbk1vZGFsS2luZCwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpblVuYXZhaWxhYmxlV2luZG93KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldFdpbmRvd01vZGFsaXR5KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGluTW9kYWxLaW5kLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBpblVuYXZhaWxhYmxlV2luZG93KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Nb2RhbEtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5VbmF2YWlsYWJsZVdpbmRvdykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRXaW5kb3dNb2RhbGl0eShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbk1vZGFsS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5VbmF2YWlsYWJsZVdpbmRvdyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0dldFdpbmRvd01vZGFsaXR5KFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlXaW5kb3dNb2RhbGl0eSBvdXRNb2RhbEtpbmQ7Ci0JV2luZG93UHRyIG91dFVuYXZhaWxhYmxlV2luZG93OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd01vZGFsaXR5IG91dE1vZGFsS2luZDsKKyAgICBXaW5kb3dQdHIgb3V0VW5hdmFpbGFibGVXaW5kb3c7CiAjaWZuZGVmIEdldFdpbmRvd01vZGFsaXR5Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0V2luZG93TW9kYWxpdHkpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFdpbmRvd01vZGFsaXR5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0V2luZG93TW9kYWxpdHkoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJm91dE1vZGFsS2luZCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFVuYXZhaWxhYmxlV2luZG93KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIG91dE1vZGFsS2luZCwKLQkgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfV2hpY2hXaW5kb3csIG91dFVuYXZhaWxhYmxlV2luZG93KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldFdpbmRvd01vZGFsaXR5KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRNb2RhbEtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRVbmF2YWlsYWJsZVdpbmRvdyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRNb2RhbEtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX1doaWNoV2luZG93LCBvdXRVbmF2YWlsYWJsZVdpbmRvdyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX1NldFdpbmRvd0NvbnRlbnRDb2xvcihXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JUkdCQ29sb3IgY29sb3I7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgUkdCQ29sb3IgY29sb3I7CiAjaWZuZGVmIFNldFdpbmRvd0NvbnRlbnRDb2xvcgotCVB5TWFjX1BSRUNIRUNLKFNldFdpbmRvd0NvbnRlbnRDb2xvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0V2luZG93Q29udGVudENvbG9yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUWRSR0JfQ29udmVydCwgJmNvbG9yKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldFdpbmRvd0NvbnRlbnRDb2xvcihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbG9yKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFFkUkdCX0NvbnZlcnQsICZjb2xvcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRXaW5kb3dDb250ZW50Q29sb3IoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2xvcik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0dldFdpbmRvd0NvbnRlbnRDb2xvcihXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JUkdCQ29sb3IgY29sb3I7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgUkdCQ29sb3IgY29sb3I7CiAjaWZuZGVmIEdldFdpbmRvd0NvbnRlbnRDb2xvcgotCVB5TWFjX1BSRUNIRUNLKEdldFdpbmRvd0NvbnRlbnRDb2xvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0V2luZG93Q29udGVudENvbG9yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0V2luZG93Q29udGVudENvbG9yKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29sb3IpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZjb2xvcik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRXaW5kb3dDb250ZW50Q29sb3IoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2xvcik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFFkUkdCX05ldywgJmNvbG9yKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfR2V0V2luZG93Q29udGVudFBhdHRlcm4oV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVBpeFBhdEhhbmRsZSBvdXRQaXhQYXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgUGl4UGF0SGFuZGxlIG91dFBpeFBhdDsKICNpZm5kZWYgR2V0V2luZG93Q29udGVudFBhdHRlcm4KLQlQeU1hY19QUkVDSEVDSyhHZXRXaW5kb3dDb250ZW50UGF0dGVybik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0V2luZG93Q29udGVudFBhdHRlcm4pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJm91dFBpeFBhdCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRXaW5kb3dDb250ZW50UGF0dGVybihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRQaXhQYXQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZvdXRQaXhQYXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0V2luZG93Q29udGVudFBhdHRlcm4oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0UGl4UGF0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfU2V0V2luZG93Q29udGVudFBhdHRlcm4oV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVBpeFBhdEhhbmRsZSBwaXhQYXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgUGl4UGF0SGFuZGxlIHBpeFBhdDsKICNpZm5kZWYgU2V0V2luZG93Q29udGVudFBhdHRlcm4KLQlQeU1hY19QUkVDSEVDSyhTZXRXaW5kb3dDb250ZW50UGF0dGVybik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0V2luZG93Q29udGVudFBhdHRlcm4pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBpeFBhdCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRXaW5kb3dDb250ZW50UGF0dGVybihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhQYXQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwaXhQYXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0V2luZG93Q29udGVudFBhdHRlcm4oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4UGF0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfU2Nyb2xsV2luZG93UmVjdChXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JUmVjdCBpblNjcm9sbFJlY3Q7Ci0JU0ludDE2IGluSFBpeGVsczsKLQlTSW50MTYgaW5WUGl4ZWxzOwotCVNjcm9sbFdpbmRvd09wdGlvbnMgaW5PcHRpb25zOwotCVJnbkhhbmRsZSBvdXRFeHBvc2VkUmduOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFJlY3QgaW5TY3JvbGxSZWN0OworICAgIFNJbnQxNiBpbkhQaXhlbHM7CisgICAgU0ludDE2IGluVlBpeGVsczsKKyAgICBTY3JvbGxXaW5kb3dPcHRpb25zIGluT3B0aW9uczsKKyAgICBSZ25IYW5kbGUgb3V0RXhwb3NlZFJnbjsKICNpZm5kZWYgU2Nyb2xsV2luZG93UmVjdAotCVB5TWFjX1BSRUNIRUNLKFNjcm9sbFdpbmRvd1JlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKFNjcm9sbFdpbmRvd1JlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaGxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpblNjcm9sbFJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkhQaXhlbHMsCi0JICAgICAgICAgICAgICAgICAgICAgICZpblZQaXhlbHMsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbk9wdGlvbnMsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmb3V0RXhwb3NlZFJnbikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTY3JvbGxXaW5kb3dSZWN0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgJmluU2Nyb2xsUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICBpbkhQaXhlbHMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgaW5WUGl4ZWxzLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGluT3B0aW9ucywKLQkgICAgICAgICAgICAgICAgICAgICAgICBvdXRFeHBvc2VkUmduKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhobE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmluU2Nyb2xsUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluSFBpeGVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluVlBpeGVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluT3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZvdXRFeHBvc2VkUmduKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNjcm9sbFdpbmRvd1JlY3QoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5TY3JvbGxSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSFBpeGVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblZQaXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5PcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dEV4cG9zZWRSZ24pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9TY3JvbGxXaW5kb3dSZWdpb24oV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVJnbkhhbmRsZSBpblNjcm9sbFJnbjsKLQlTSW50MTYgaW5IUGl4ZWxzOwotCVNJbnQxNiBpblZQaXhlbHM7Ci0JU2Nyb2xsV2luZG93T3B0aW9ucyBpbk9wdGlvbnM7Ci0JUmduSGFuZGxlIG91dEV4cG9zZWRSZ247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgUmduSGFuZGxlIGluU2Nyb2xsUmduOworICAgIFNJbnQxNiBpbkhQaXhlbHM7CisgICAgU0ludDE2IGluVlBpeGVsczsKKyAgICBTY3JvbGxXaW5kb3dPcHRpb25zIGluT3B0aW9uczsKKyAgICBSZ25IYW5kbGUgb3V0RXhwb3NlZFJnbjsKICNpZm5kZWYgU2Nyb2xsV2luZG93UmVnaW9uCi0JUHlNYWNfUFJFQ0hFQ0soU2Nyb2xsV2luZG93UmVnaW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTY3JvbGxXaW5kb3dSZWdpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaGxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaW5TY3JvbGxSZ24sCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkhQaXhlbHMsCi0JICAgICAgICAgICAgICAgICAgICAgICZpblZQaXhlbHMsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbk9wdGlvbnMsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmb3V0RXhwb3NlZFJnbikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTY3JvbGxXaW5kb3dSZWdpb24oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGluU2Nyb2xsUmduLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgaW5IUGl4ZWxzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgaW5WUGl4ZWxzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgaW5PcHRpb25zLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0RXhwb3NlZFJnbik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaGxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaW5TY3JvbGxSZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkhQaXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblZQaXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbk9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmb3V0RXhwb3NlZFJnbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTY3JvbGxXaW5kb3dSZWdpb24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluU2Nyb2xsUmduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5IUGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5WUGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5PcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0RXhwb3NlZFJnbik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0NsaXBBYm92ZShXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgQ2xpcEFib3ZlCi0JUHlNYWNfUFJFQ0hFQ0soQ2xpcEFib3ZlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDbGlwQWJvdmUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUNsaXBBYm92ZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENsaXBBYm92ZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX1BhaW50T25lKFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIGNsb2JiZXJlZFJnbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIGNsb2JiZXJlZFJnbjsKICNpZm5kZWYgUGFpbnRPbmUKLQlQeU1hY19QUkVDSEVDSyhQYWludE9uZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUGFpbnRPbmUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmNsb2JiZXJlZFJnbikpCi0JCXJldHVybiBOVUxMOwotCVBhaW50T25lKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgY2xvYmJlcmVkUmduKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmNsb2JiZXJlZFJnbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFBhaW50T25lKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgY2xvYmJlcmVkUmduKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX1BhaW50QmVoaW5kKFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIGNsb2JiZXJlZFJnbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIGNsb2JiZXJlZFJnbjsKICNpZm5kZWYgUGFpbnRCZWhpbmQKLQlQeU1hY19QUkVDSEVDSyhQYWludEJlaGluZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUGFpbnRCZWhpbmQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmNsb2JiZXJlZFJnbikpCi0JCXJldHVybiBOVUxMOwotCVBhaW50QmVoaW5kKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgY2xvYmJlcmVkUmduKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmNsb2JiZXJlZFJnbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFBhaW50QmVoaW5kKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgY2xvYmJlcmVkUmduKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0NhbGNWaXMoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIENhbGNWaXMKLQlQeU1hY19QUkVDSEVDSyhDYWxjVmlzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDYWxjVmlzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlDYWxjVmlzKF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ2FsY1Zpcyhfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0NhbGNWaXNCZWhpbmQoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZ25IYW5kbGUgY2xvYmJlcmVkUmduOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZ25IYW5kbGUgY2xvYmJlcmVkUmduOwogI2lmbmRlZiBDYWxjVmlzQmVoaW5kCi0JUHlNYWNfUFJFQ0hFQ0soQ2FsY1Zpc0JlaGluZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ2FsY1Zpc0JlaGluZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmY2xvYmJlcmVkUmduKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ2FsY1Zpc0JlaGluZChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgY2xvYmJlcmVkUmduKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmNsb2JiZXJlZFJnbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENhbGNWaXNCZWhpbmQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgIGNsb2JiZXJlZFJnbik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9CcmluZ1RvRnJvbnQoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIEJyaW5nVG9Gcm9udAotCVB5TWFjX1BSRUNIRUNLKEJyaW5nVG9Gcm9udCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQnJpbmdUb0Zyb250KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlCcmluZ1RvRnJvbnQoX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBCcmluZ1RvRnJvbnQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9TZW5kQmVoaW5kKFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JV2luZG93UHRyIGJlaGluZFdpbmRvdzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgV2luZG93UHRyIGJlaGluZFdpbmRvdzsKICNpZm5kZWYgU2VuZEJlaGluZAotCVB5TWFjX1BSRUNIRUNLKFNlbmRCZWhpbmQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNlbmRCZWhpbmQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmJlaGluZFdpbmRvdykpCi0JCXJldHVybiBOVUxMOwotCVNlbmRCZWhpbmQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgIGJlaGluZFdpbmRvdyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZiZWhpbmRXaW5kb3cpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZW5kQmVoaW5kKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICBiZWhpbmRXaW5kb3cpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfU2VsZWN0V2luZG93KFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBTZWxlY3RXaW5kb3cKLQlQeU1hY19QUkVDSEVDSyhTZWxlY3RXaW5kb3cpOworICAgIFB5TWFjX1BSRUNIRUNLKFNlbGVjdFdpbmRvdyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2VsZWN0V2luZG93KF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2VsZWN0V2luZG93KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfR2V0TmV4dFdpbmRvd09mQ2xhc3MoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlXaW5kb3dQdHIgX3J2OwotCVdpbmRvd0NsYXNzIGluV2luZG93Q2xhc3M7Ci0JQm9vbGVhbiBtdXN0QmVWaXNpYmxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBXaW5kb3dQdHIgX3J2OworICAgIFdpbmRvd0NsYXNzIGluV2luZG93Q2xhc3M7CisgICAgQm9vbGVhbiBtdXN0QmVWaXNpYmxlOwogI2lmbmRlZiBHZXROZXh0V2luZG93T2ZDbGFzcwotCVB5TWFjX1BSRUNIRUNLKEdldE5leHRXaW5kb3dPZkNsYXNzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXROZXh0V2luZG93T2ZDbGFzcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbldpbmRvd0NsYXNzLAotCSAgICAgICAgICAgICAgICAgICAgICAmbXVzdEJlVmlzaWJsZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldE5leHRXaW5kb3dPZkNsYXNzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5XaW5kb3dDbGFzcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXN0QmVWaXNpYmxlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5XaW5kb3dDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm11c3RCZVZpc2libGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXROZXh0V2luZG93T2ZDbGFzcyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluV2luZG93Q2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVzdEJlVmlzaWJsZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9TZXRXaW5kb3dBbHRlcm5hdGVUaXRsZShXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JQ0ZTdHJpbmdSZWYgaW5UaXRsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBDRlN0cmluZ1JlZiBpblRpdGxlOwogI2lmbmRlZiBTZXRXaW5kb3dBbHRlcm5hdGVUaXRsZQotCVB5TWFjX1BSRUNIRUNLKFNldFdpbmRvd0FsdGVybmF0ZVRpdGxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRXaW5kb3dBbHRlcm5hdGVUaXRsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZpblRpdGxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldFdpbmRvd0FsdGVybmF0ZVRpdGxlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluVGl0bGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmluVGl0bGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0V2luZG93QWx0ZXJuYXRlVGl0bGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5UaXRsZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0NvcHlXaW5kb3dBbHRlcm5hdGVUaXRsZShXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JQ0ZTdHJpbmdSZWYgb3V0VGl0bGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgQ0ZTdHJpbmdSZWYgb3V0VGl0bGU7CiAjaWZuZGVmIENvcHlXaW5kb3dBbHRlcm5hdGVUaXRsZQotCVB5TWFjX1BSRUNIRUNLKENvcHlXaW5kb3dBbHRlcm5hdGVUaXRsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ29weVdpbmRvd0FsdGVybmF0ZVRpdGxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ29weVdpbmRvd0FsdGVybmF0ZVRpdGxlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0VGl0bGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIG91dFRpdGxlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENvcHlXaW5kb3dBbHRlcm5hdGVUaXRsZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFRpdGxlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBvdXRUaXRsZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0hpbGl0ZVdpbmRvdyhXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gZkhpbGl0ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBmSGlsaXRlOwogI2lmbmRlZiBIaWxpdGVXaW5kb3cKLQlQeU1hY19QUkVDSEVDSyhIaWxpdGVXaW5kb3cpOworICAgIFB5TWFjX1BSRUNIRUNLKEhpbGl0ZVdpbmRvdyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZIaWxpdGUpKQotCQlyZXR1cm4gTlVMTDsKLQlIaWxpdGVXaW5kb3coX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgZkhpbGl0ZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZkhpbGl0ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEhpbGl0ZVdpbmRvdyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICBmSGlsaXRlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX1NldFdSZWZDb24oV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIGRhdGE7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgZGF0YTsKICNpZm5kZWYgU2V0V1JlZkNvbgotCVB5TWFjX1BSRUNIRUNLKFNldFdSZWZDb24pOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFdSZWZDb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZkYXRhKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0V1JlZkNvbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgZGF0YSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldFdSZWZDb24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgIGRhdGEpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfR2V0V1JlZkNvbihXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWxvbmcgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBsb25nIF9ydjsKICNpZm5kZWYgR2V0V1JlZkNvbgotCVB5TWFjX1BSRUNIRUNLKEdldFdSZWZDb24pOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFdSZWZDb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFdSZWZDb24oX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFdSZWZDb24oX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX1NldFdpbmRvd1BpYyhXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBpY0hhbmRsZSBwaWM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBpY0hhbmRsZSBwaWM7CiAjaWZuZGVmIFNldFdpbmRvd1BpYwotCVB5TWFjX1BSRUNIRUNLKFNldFdpbmRvd1BpYyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0V2luZG93UGljKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwaWMpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRXaW5kb3dQaWMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgcGljKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBpYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldFdpbmRvd1BpYyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICBwaWMpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfR2V0V2luZG93UGljKFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUGljSGFuZGxlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUGljSGFuZGxlIF9ydjsKICNpZm5kZWYgR2V0V2luZG93UGljCi0JUHlNYWNfUFJFQ0hFQ0soR2V0V2luZG93UGljKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRXaW5kb3dQaWMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFdpbmRvd1BpYyhfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFdpbmRvd1BpYyhfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0dldFdWYXJpYW50KFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBfcnY7CiAjaWZuZGVmIEdldFdWYXJpYW50Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0V1ZhcmlhbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFdWYXJpYW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRXVmFyaWFudChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0V1ZhcmlhbnQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0dldFdpbmRvd0ZlYXR1cmVzKFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MzIgb3V0RmVhdHVyZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVUludDMyIG91dEZlYXR1cmVzOwogI2lmbmRlZiBHZXRXaW5kb3dGZWF0dXJlcwotCVB5TWFjX1BSRUNIRUNLKEdldFdpbmRvd0ZlYXR1cmVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRXaW5kb3dGZWF0dXJlcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldFdpbmRvd0ZlYXR1cmVzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRGZWF0dXJlcyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0RmVhdHVyZXMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0V2luZG93RmVhdHVyZXMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEZlYXR1cmVzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRGZWF0dXJlcyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0dldFdpbmRvd1JlZ2lvbihXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93UmVnaW9uQ29kZSBpblJlZ2lvbkNvZGU7Ci0JUmduSGFuZGxlIGlvV2luUmduOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd1JlZ2lvbkNvZGUgaW5SZWdpb25Db2RlOworICAgIFJnbkhhbmRsZSBpb1dpblJnbjsKICNpZm5kZWYgR2V0V2luZG93UmVnaW9uCi0JUHlNYWNfUFJFQ0hFQ0soR2V0V2luZG93UmVnaW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRXaW5kb3dSZWdpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiSE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluUmVnaW9uQ29kZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZpb1dpblJnbikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRXaW5kb3dSZWdpb24oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgIGluUmVnaW9uQ29kZSwKLQkgICAgICAgICAgICAgICAgICAgICAgIGlvV2luUmduKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJITyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5SZWdpb25Db2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmlvV2luUmduKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldFdpbmRvd1JlZ2lvbihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5SZWdpb25Db2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9XaW5SZ24pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9HZXRXaW5kb3dTdHJ1Y3R1cmVXaWR0aHMoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVJlY3Qgb3V0UmVjdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBSZWN0IG91dFJlY3Q7CiAjaWZuZGVmIEdldFdpbmRvd1N0cnVjdHVyZVdpZHRocwotCVB5TWFjX1BSRUNIRUNLKEdldFdpbmRvd1N0cnVjdHVyZVdpZHRocyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0V2luZG93U3RydWN0dXJlV2lkdGhzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0V2luZG93U3RydWN0dXJlV2lkdGhzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0UmVjdCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJm91dFJlY3QpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0V2luZG93U3RydWN0dXJlV2lkdGhzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0UmVjdCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJm91dFJlY3QpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9CZWdpblVwZGF0ZShXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgQmVnaW5VcGRhdGUKLQlQeU1hY19QUkVDSEVDSyhCZWdpblVwZGF0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQmVnaW5VcGRhdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUJlZ2luVXBkYXRlKF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQmVnaW5VcGRhdGUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9FbmRVcGRhdGUoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIEVuZFVwZGF0ZQotCVB5TWFjX1BSRUNIRUNLKEVuZFVwZGF0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRW5kVXBkYXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlFbmRVcGRhdGUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBFbmRVcGRhdGUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9JbnZhbFdpbmRvd1JnbihXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JUmduSGFuZGxlIHJlZ2lvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBSZ25IYW5kbGUgcmVnaW9uOwogI2lmbmRlZiBJbnZhbFdpbmRvd1JnbgotCVB5TWFjX1BSRUNIRUNLKEludmFsV2luZG93UmduKTsKKyAgICBQeU1hY19QUkVDSEVDSyhJbnZhbFdpbmRvd1Jnbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmVnaW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEludmFsV2luZG93UmduKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJlZ2lvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBJbnZhbFdpbmRvd1Jnbihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpb24pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9JbnZhbFdpbmRvd1JlY3QoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVJlY3QgYm91bmRzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFJlY3QgYm91bmRzOwogI2lmbmRlZiBJbnZhbFdpbmRvd1JlY3QKLQlQeU1hY19QUkVDSEVDSyhJbnZhbFdpbmRvd1JlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKEludmFsV2luZG93UmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHMpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gSW52YWxXaW5kb3dSZWN0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gSW52YWxXaW5kb3dSZWN0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfVmFsaWRXaW5kb3dSZ24oV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVJnbkhhbmRsZSByZWdpb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgUmduSGFuZGxlIHJlZ2lvbjsKICNpZm5kZWYgVmFsaWRXaW5kb3dSZ24KLQlQeU1hY19QUkVDSEVDSyhWYWxpZFdpbmRvd1Jnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soVmFsaWRXaW5kb3dSZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJlZ2lvbikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBWYWxpZFdpbmRvd1Jnbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICByZWdpb24pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZWdpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVmFsaWRXaW5kb3dSZ24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfVmFsaWRXaW5kb3dSZWN0KFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlSZWN0IGJvdW5kczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBSZWN0IGJvdW5kczsKICNpZm5kZWYgVmFsaWRXaW5kb3dSZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soVmFsaWRXaW5kb3dSZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhWYWxpZFdpbmRvd1JlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFZhbGlkV2luZG93UmVjdChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kcyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFZhbGlkV2luZG93UmVjdChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kcyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0RyYXdHcm93SWNvbihXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgRHJhd0dyb3dJY29uCi0JUHlNYWNfUFJFQ0hFQ0soRHJhd0dyb3dJY29uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEcmF3R3Jvd0ljb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCURyYXdHcm93SWNvbihfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIERyYXdHcm93SWNvbihfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX1NldFdUaXRsZShXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVN0cjI1NSB0aXRsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgU3RyMjU1IHRpdGxlOwogI2lmbmRlZiBTZXRXVGl0bGUKLQlQeU1hY19QUkVDSEVDSyhTZXRXVGl0bGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFdUaXRsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgdGl0bGUpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRXVGl0bGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgdGl0bGUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgdGl0bGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRXVGl0bGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgdGl0bGUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfR2V0V1RpdGxlKFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JU3RyMjU1IHRpdGxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTdHIyNTUgdGl0bGU7CiAjaWZuZGVmIEdldFdUaXRsZQotCVB5TWFjX1BSRUNIRUNLKEdldFdUaXRsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0V1RpdGxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlHZXRXVGl0bGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgdGl0bGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRTdHIyNTUsIHRpdGxlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0V1RpdGxlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgIHRpdGxlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkU3RyMjU1LCB0aXRsZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX1NldFdpbmRvd1RpdGxlV2l0aENGU3RyaW5nKFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlDRlN0cmluZ1JlZiBpblN0cmluZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBDRlN0cmluZ1JlZiBpblN0cmluZzsKICNpZm5kZWYgU2V0V2luZG93VGl0bGVXaXRoQ0ZTdHJpbmcKLQlQeU1hY19QUkVDSEVDSyhTZXRXaW5kb3dUaXRsZVdpdGhDRlN0cmluZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0V2luZG93VGl0bGVXaXRoQ0ZTdHJpbmcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmaW5TdHJpbmcpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0V2luZG93VGl0bGVXaXRoQ0ZTdHJpbmcoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5TdHJpbmcpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmluU3RyaW5nKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldFdpbmRvd1RpdGxlV2l0aENGU3RyaW5nKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluU3RyaW5nKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfQ29weVdpbmRvd1RpdGxlQXNDRlN0cmluZyhXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JQ0ZTdHJpbmdSZWYgb3V0U3RyaW5nOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIENGU3RyaW5nUmVmIG91dFN0cmluZzsKICNpZm5kZWYgQ29weVdpbmRvd1RpdGxlQXNDRlN0cmluZwotCVB5TWFjX1BSRUNIRUNLKENvcHlXaW5kb3dUaXRsZUFzQ0ZTdHJpbmcpOworICAgIFB5TWFjX1BSRUNIRUNLKENvcHlXaW5kb3dUaXRsZUFzQ0ZTdHJpbmcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDb3B5V2luZG93VGl0bGVBc0NGU3RyaW5nKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFN0cmluZyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgb3V0U3RyaW5nKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENvcHlXaW5kb3dUaXRsZUFzQ0ZTdHJpbmcoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0U3RyaW5nKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBvdXRTdHJpbmcpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9TZXRXaW5kb3dQcm94eUZTU3BlYyhXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JRlNTcGVjIGluRmlsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBGU1NwZWMgaW5GaWxlOwogI2lmbmRlZiBTZXRXaW5kb3dQcm94eUZTU3BlYwotCVB5TWFjX1BSRUNIRUNLKFNldFdpbmRvd1Byb3h5RlNTcGVjKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRXaW5kb3dQcm94eUZTU3BlYyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJmluRmlsZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRXaW5kb3dQcm94eUZTU3BlYyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5GaWxlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJmluRmlsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRXaW5kb3dQcm94eUZTU3BlYyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5GaWxlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfR2V0V2luZG93UHJveHlGU1NwZWMoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUZTU3BlYyBvdXRGaWxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIEZTU3BlYyBvdXRGaWxlOwogI2lmbmRlZiBHZXRXaW5kb3dQcm94eUZTU3BlYwotCVB5TWFjX1BSRUNIRUNLKEdldFdpbmRvd1Byb3h5RlNTcGVjKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRXaW5kb3dQcm94eUZTU3BlYyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldFdpbmRvd1Byb3h5RlNTcGVjKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRGaWxlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGU1NwZWMsICZvdXRGaWxlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldFdpbmRvd1Byb3h5RlNTcGVjKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRGaWxlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGU1NwZWMsICZvdXRGaWxlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfU2V0V2luZG93UHJveHlBbGlhcyhXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JQWxpYXNIYW5kbGUgaW5BbGlhczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBBbGlhc0hhbmRsZSBpbkFsaWFzOwogI2lmbmRlZiBTZXRXaW5kb3dQcm94eUFsaWFzCi0JUHlNYWNfUFJFQ0hFQ0soU2V0V2luZG93UHJveHlBbGlhcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0V2luZG93UHJveHlBbGlhcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaW5BbGlhcykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRXaW5kb3dQcm94eUFsaWFzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5BbGlhcyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmluQWxpYXMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0V2luZG93UHJveHlBbGlhcyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQWxpYXMpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9HZXRXaW5kb3dQcm94eUFsaWFzKFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlBbGlhc0hhbmRsZSBhbGlhczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBBbGlhc0hhbmRsZSBhbGlhczsKICNpZm5kZWYgR2V0V2luZG93UHJveHlBbGlhcwotCVB5TWFjX1BSRUNIRUNLKEdldFdpbmRvd1Byb3h5QWxpYXMpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFdpbmRvd1Byb3h5QWxpYXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRXaW5kb3dQcm94eUFsaWFzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFsaWFzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgYWxpYXMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0V2luZG93UHJveHlBbGlhcyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhbGlhcyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGFsaWFzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfU2V0V2luZG93UHJveHlDcmVhdG9yQW5kVHlwZShXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JT1NUeXBlIGZpbGVDcmVhdG9yOwotCU9TVHlwZSBmaWxlVHlwZTsKLQlTSW50MTYgdlJlZk51bTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBPU1R5cGUgZmlsZUNyZWF0b3I7CisgICAgT1NUeXBlIGZpbGVUeXBlOworICAgIFNJbnQxNiB2UmVmTnVtOwogI2lmbmRlZiBTZXRXaW5kb3dQcm94eUNyZWF0b3JBbmRUeXBlCi0JUHlNYWNfUFJFQ0hFQ0soU2V0V2luZG93UHJveHlDcmVhdG9yQW5kVHlwZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0V2luZG93UHJveHlDcmVhdG9yQW5kVHlwZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmZpbGVDcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZmaWxlVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZSZWZOdW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0V2luZG93UHJveHlDcmVhdG9yQW5kVHlwZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVDcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZSZWZOdW0pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZmlsZUNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmZpbGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdlJlZk51bSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRXaW5kb3dQcm94eUNyZWF0b3JBbmRUeXBlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZUNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdlJlZk51bSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0dldFdpbmRvd1Byb3h5SWNvbihXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JSWNvblJlZiBvdXRJY29uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIEljb25SZWYgb3V0SWNvbjsKICNpZm5kZWYgR2V0V2luZG93UHJveHlJY29uCi0JUHlNYWNfUFJFQ0hFQ0soR2V0V2luZG93UHJveHlJY29uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRXaW5kb3dQcm94eUljb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRXaW5kb3dQcm94eUljb24oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRJY29uKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgb3V0SWNvbik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRXaW5kb3dQcm94eUljb24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRJY29uKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgb3V0SWNvbik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX1NldFdpbmRvd1Byb3h5SWNvbihXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JSWNvblJlZiBpY29uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIEljb25SZWYgaWNvbjsKICNpZm5kZWYgU2V0V2luZG93UHJveHlJY29uCi0JUHlNYWNfUFJFQ0hFQ0soU2V0V2luZG93UHJveHlJY29uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRXaW5kb3dQcm94eUljb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmljb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0V2luZG93UHJveHlJY29uKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaWNvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRXaW5kb3dQcm94eUljb24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb24pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9SZW1vdmVXaW5kb3dQcm94eShXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CiAjaWZuZGVmIFJlbW92ZVdpbmRvd1Byb3h5Ci0JUHlNYWNfUFJFQ0hFQ0soUmVtb3ZlV2luZG93UHJveHkpOworICAgIFB5TWFjX1BSRUNIRUNLKFJlbW92ZVdpbmRvd1Byb3h5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUmVtb3ZlV2luZG93UHJveHkoX3NlbGYtPm9iX2l0c2VsZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBSZW1vdmVXaW5kb3dQcm94eShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfQmVnaW5XaW5kb3dQcm94eURyYWcoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCURyYWdSZWZlcmVuY2Ugb3V0TmV3RHJhZzsKLQlSZ25IYW5kbGUgb3V0RHJhZ091dGxpbmVSZ247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgRHJhZ1JlZmVyZW5jZSBvdXROZXdEcmFnOworICAgIFJnbkhhbmRsZSBvdXREcmFnT3V0bGluZVJnbjsKICNpZm5kZWYgQmVnaW5XaW5kb3dQcm94eURyYWcKLQlQeU1hY19QUkVDSEVDSyhCZWdpbldpbmRvd1Byb3h5RHJhZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQmVnaW5XaW5kb3dQcm94eURyYWcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJm91dERyYWdPdXRsaW5lUmduKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEJlZ2luV2luZG93UHJveHlEcmFnKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXROZXdEcmFnLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXREcmFnT3V0bGluZVJnbik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIERyYWdPYmpfTmV3LCBvdXROZXdEcmFnKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmb3V0RHJhZ091dGxpbmVSZ24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQmVnaW5XaW5kb3dQcm94eURyYWcoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dE5ld0RyYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dERyYWdPdXRsaW5lUmduKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRHJhZ09ial9OZXcsIG91dE5ld0RyYWcpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9FbmRXaW5kb3dQcm94eURyYWcoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCURyYWdSZWZlcmVuY2UgdGhlRHJhZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBEcmFnUmVmZXJlbmNlIHRoZURyYWc7CiAjaWZuZGVmIEVuZFdpbmRvd1Byb3h5RHJhZwotCVB5TWFjX1BSRUNIRUNLKEVuZFdpbmRvd1Byb3h5RHJhZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRW5kV2luZG93UHJveHlEcmFnKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgRHJhZ09ial9Db252ZXJ0LCAmdGhlRHJhZykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBFbmRXaW5kb3dQcm94eURyYWcoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZURyYWcpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRHJhZ09ial9Db252ZXJ0LCAmdGhlRHJhZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBFbmRXaW5kb3dQcm94eURyYWcoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZURyYWcpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9UcmFja1dpbmRvd1Byb3h5RnJvbUV4aXN0aW5nRHJhZyhXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JUG9pbnQgc3RhcnRQdDsKLQlEcmFnUmVmZXJlbmNlIGRyYWc7Ci0JUmduSGFuZGxlIGluRHJhZ091dGxpbmVSZ247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgUG9pbnQgc3RhcnRQdDsKKyAgICBEcmFnUmVmZXJlbmNlIGRyYWc7CisgICAgUmduSGFuZGxlIGluRHJhZ091dGxpbmVSZ247CiAjaWZuZGVmIFRyYWNrV2luZG93UHJveHlGcm9tRXhpc3RpbmdEcmFnCi0JUHlNYWNfUFJFQ0hFQ0soVHJhY2tXaW5kb3dQcm94eUZyb21FeGlzdGluZ0RyYWcpOworICAgIFB5TWFjX1BSRUNIRUNLKFRyYWNrV2luZG93UHJveHlGcm9tRXhpc3RpbmdEcmFnKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmc3RhcnRQdCwKLQkgICAgICAgICAgICAgICAgICAgICAgRHJhZ09ial9Db252ZXJ0LCAmZHJhZywKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZpbkRyYWdPdXRsaW5lUmduKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFRyYWNrV2luZG93UHJveHlGcm9tRXhpc3RpbmdEcmFnKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0UHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYWcsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRHJhZ091dGxpbmVSZ24pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmc3RhcnRQdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRHJhZ09ial9Db252ZXJ0LCAmZHJhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZpbkRyYWdPdXRsaW5lUmduKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFRyYWNrV2luZG93UHJveHlGcm9tRXhpc3RpbmdEcmFnKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0UHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRHJhZ091dGxpbmVSZ24pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9UcmFja1dpbmRvd1Byb3h5RHJhZyhXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JUG9pbnQgc3RhcnRQdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBQb2ludCBzdGFydFB0OwogI2lmbmRlZiBUcmFja1dpbmRvd1Byb3h5RHJhZwotCVB5TWFjX1BSRUNIRUNLKFRyYWNrV2luZG93UHJveHlEcmFnKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUcmFja1dpbmRvd1Byb3h5RHJhZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmc3RhcnRQdCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBUcmFja1dpbmRvd1Byb3h5RHJhZyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFB0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmc3RhcnRQdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBUcmFja1dpbmRvd1Byb3h5RHJhZyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFB0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfSXNXaW5kb3dNb2RpZmllZChXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKICNpZm5kZWYgSXNXaW5kb3dNb2RpZmllZAotCVB5TWFjX1BSRUNIRUNLKElzV2luZG93TW9kaWZpZWQpOworICAgIFB5TWFjX1BSRUNIRUNLKElzV2luZG93TW9kaWZpZWQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IElzV2luZG93TW9kaWZpZWQoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IElzV2luZG93TW9kaWZpZWQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX1NldFdpbmRvd01vZGlmaWVkKFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlCb29sZWFuIG1vZGlmaWVkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIEJvb2xlYW4gbW9kaWZpZWQ7CiAjaWZuZGVmIFNldFdpbmRvd01vZGlmaWVkCi0JUHlNYWNfUFJFQ0hFQ0soU2V0V2luZG93TW9kaWZpZWQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFdpbmRvd01vZGlmaWVkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmbW9kaWZpZWQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0V2luZG93TW9kaWZpZWQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbW9kaWZpZWQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0V2luZG93TW9kaWZpZWQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9Jc1dpbmRvd1BhdGhTZWxlY3RDbGljayhXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCUV2ZW50UmVjb3JkIGV2ZW50OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBFdmVudFJlY29yZCBldmVudDsKICNpZm5kZWYgSXNXaW5kb3dQYXRoU2VsZWN0Q2xpY2sKLQlQeU1hY19QUkVDSEVDSyhJc1dpbmRvd1BhdGhTZWxlY3RDbGljayk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSXNXaW5kb3dQYXRoU2VsZWN0Q2xpY2spOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRFdmVudFJlY29yZCwgJmV2ZW50KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gSXNXaW5kb3dQYXRoU2VsZWN0Q2xpY2soX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXZlbnQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RXZlbnRSZWNvcmQsICZldmVudCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IElzV2luZG93UGF0aFNlbGVjdENsaWNrKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmV2ZW50KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfV2luZG93UGF0aFNlbGVjdChXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JTWVudUhhbmRsZSBtZW51OwotCVNJbnQzMiBvdXRNZW51UmVzdWx0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIE1lbnVIYW5kbGUgbWVudTsKKyAgICBTSW50MzIgb3V0TWVudVJlc3VsdDsKICNpZm5kZWYgV2luZG93UGF0aFNlbGVjdAotCVB5TWFjX1BSRUNIRUNLKFdpbmRvd1BhdGhTZWxlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKFdpbmRvd1BhdGhTZWxlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBNZW51T2JqX0NvbnZlcnQsICZtZW51KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFdpbmRvd1BhdGhTZWxlY3QoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICBtZW51LAotCSAgICAgICAgICAgICAgICAgICAgICAgICZvdXRNZW51UmVzdWx0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRNZW51UmVzdWx0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1lbnVPYmpfQ29udmVydCwgJm1lbnUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gV2luZG93UGF0aFNlbGVjdChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbnUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dE1lbnVSZXN1bHQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dE1lbnVSZXN1bHQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9IaWxpdGVXaW5kb3dGcmFtZUZvckRyYWcoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUJvb2xlYW4gaGlsaXRlZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBCb29sZWFuIGhpbGl0ZWQ7CiAjaWZuZGVmIEhpbGl0ZVdpbmRvd0ZyYW1lRm9yRHJhZwotCVB5TWFjX1BSRUNIRUNLKEhpbGl0ZVdpbmRvd0ZyYW1lRm9yRHJhZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSGlsaXRlV2luZG93RnJhbWVGb3JEcmFnKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaGlsaXRlZCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBIaWxpdGVXaW5kb3dGcmFtZUZvckRyYWcoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpbGl0ZWQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaGlsaXRlZCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBIaWxpdGVXaW5kb3dGcmFtZUZvckRyYWcoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpbGl0ZWQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9UcmFuc2l0aW9uV2luZG93KFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlXaW5kb3dUcmFuc2l0aW9uRWZmZWN0IGluRWZmZWN0OwotCVdpbmRvd1RyYW5zaXRpb25BY3Rpb24gaW5BY3Rpb247Ci0JUmVjdCBpblJlY3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93VHJhbnNpdGlvbkVmZmVjdCBpbkVmZmVjdDsKKyAgICBXaW5kb3dUcmFuc2l0aW9uQWN0aW9uIGluQWN0aW9uOworICAgIFJlY3QgaW5SZWN0OwogI2lmbmRlZiBUcmFuc2l0aW9uV2luZG93Ci0JUHlNYWNfUFJFQ0hFQ0soVHJhbnNpdGlvbldpbmRvdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVHJhbnNpdGlvbldpbmRvdyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluRWZmZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5BY3Rpb24sCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpblJlY3QpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gVHJhbnNpdGlvbldpbmRvdyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGluRWZmZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgIGluQWN0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICZpblJlY3QpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5FZmZlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkFjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmluUmVjdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBUcmFuc2l0aW9uV2luZG93KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5FZmZlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5BY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluUmVjdCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX1RyYW5zaXRpb25XaW5kb3dBbmRQYXJlbnQoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVdpbmRvd1B0ciBpblBhcmVudFdpbmRvdzsKLQlXaW5kb3dUcmFuc2l0aW9uRWZmZWN0IGluRWZmZWN0OwotCVdpbmRvd1RyYW5zaXRpb25BY3Rpb24gaW5BY3Rpb247Ci0JUmVjdCBpblJlY3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93UHRyIGluUGFyZW50V2luZG93OworICAgIFdpbmRvd1RyYW5zaXRpb25FZmZlY3QgaW5FZmZlY3Q7CisgICAgV2luZG93VHJhbnNpdGlvbkFjdGlvbiBpbkFjdGlvbjsKKyAgICBSZWN0IGluUmVjdDsKICNpZm5kZWYgVHJhbnNpdGlvbldpbmRvd0FuZFBhcmVudAotCVB5TWFjX1BSRUNIRUNLKFRyYW5zaXRpb25XaW5kb3dBbmRQYXJlbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKFRyYW5zaXRpb25XaW5kb3dBbmRQYXJlbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpblBhcmVudFdpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgJmluRWZmZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5BY3Rpb24sCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpblJlY3QpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gVHJhbnNpdGlvbldpbmRvd0FuZFBhcmVudChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluUGFyZW50V2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRWZmZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQWN0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpblJlY3QpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5QYXJlbnRXaW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkVmZmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5SZWN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFRyYW5zaXRpb25XaW5kb3dBbmRQYXJlbnQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblBhcmVudFdpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkVmZmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkFjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5SZWN0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfTWFjTW92ZVdpbmRvdyhXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IGhHbG9iYWw7Ci0Jc2hvcnQgdkdsb2JhbDsKLQlCb29sZWFuIGZyb250OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBoR2xvYmFsOworICAgIHNob3J0IHZHbG9iYWw7CisgICAgQm9vbGVhbiBmcm9udDsKICNpZm5kZWYgTWFjTW92ZVdpbmRvdwotCVB5TWFjX1BSRUNIRUNLKE1hY01vdmVXaW5kb3cpOworICAgIFB5TWFjX1BSRUNIRUNLKE1hY01vdmVXaW5kb3cpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGhiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmhHbG9iYWwsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2R2xvYmFsLAotCSAgICAgICAgICAgICAgICAgICAgICAmZnJvbnQpKQotCQlyZXR1cm4gTlVMTDsKLQlNYWNNb3ZlV2luZG93KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICBoR2xvYmFsLAotCSAgICAgICAgICAgICAgdkdsb2JhbCwKLQkgICAgICAgICAgICAgIGZyb250KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGhiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmhHbG9iYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2R2xvYmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZnJvbnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNYWNNb3ZlV2luZG93KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICBoR2xvYmFsLAorICAgICAgICAgICAgICAgICAgdkdsb2JhbCwKKyAgICAgICAgICAgICAgICAgIGZyb250KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX1NpemVXaW5kb3coV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCB3OwotCXNob3J0IGg7Ci0JQm9vbGVhbiBmVXBkYXRlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCB3OworICAgIHNob3J0IGg7CisgICAgQm9vbGVhbiBmVXBkYXRlOwogI2lmbmRlZiBTaXplV2luZG93Ci0JUHlNYWNfUFJFQ0hFQ0soU2l6ZVdpbmRvdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2l6ZVdpbmRvdyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaGIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdywKLQkgICAgICAgICAgICAgICAgICAgICAgJmgsCi0JICAgICAgICAgICAgICAgICAgICAgICZmVXBkYXRlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2l6ZVdpbmRvdyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgdywKLQkgICAgICAgICAgIGgsCi0JICAgICAgICAgICBmVXBkYXRlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGhiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJncsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZlVwZGF0ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNpemVXaW5kb3coX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgIHcsCisgICAgICAgICAgICAgICBoLAorICAgICAgICAgICAgICAgZlVwZGF0ZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9Hcm93V2luZG93KFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBfcnY7Ci0JUG9pbnQgc3RhcnRQdDsKLQlSZWN0IGJCb3g7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgX3J2OworICAgIFBvaW50IHN0YXJ0UHQ7CisgICAgUmVjdCBiQm94OwogI2lmbmRlZiBHcm93V2luZG93Ci0JUHlNYWNfUFJFQ0hFQ0soR3Jvd1dpbmRvdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3Jvd1dpbmRvdyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZzdGFydFB0LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYkJveCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyb3dXaW5kb3coX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgIHN0YXJ0UHQsCi0JICAgICAgICAgICAgICAgICAmYkJveCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmc3RhcnRQdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJCb3gpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcm93V2luZG93KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICBzdGFydFB0LAorICAgICAgICAgICAgICAgICAgICAgJmJCb3gpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9EcmFnV2luZG93KFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUG9pbnQgc3RhcnRQdDsKLQlSZWN0IGJvdW5kc1JlY3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBvaW50IHN0YXJ0UHQ7CisgICAgUmVjdCBib3VuZHNSZWN0OwogI2lmbmRlZiBEcmFnV2luZG93Ci0JUHlNYWNfUFJFQ0hFQ0soRHJhZ1dpbmRvdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRHJhZ1dpbmRvdyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZzdGFydFB0LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCkpCi0JCXJldHVybiBOVUxMOwotCURyYWdXaW5kb3coX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgIHN0YXJ0UHQsCi0JICAgICAgICAgICAmYm91bmRzUmVjdCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnN0YXJ0UHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgRHJhZ1dpbmRvdyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgc3RhcnRQdCwKKyAgICAgICAgICAgICAgICZib3VuZHNSZWN0KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX1pvb21XaW5kb3coV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlXaW5kb3dQYXJ0Q29kZSBwYXJ0Q29kZTsKLQlCb29sZWFuIGZyb250OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBXaW5kb3dQYXJ0Q29kZSBwYXJ0Q29kZTsKKyAgICBCb29sZWFuIGZyb250OwogI2lmbmRlZiBab29tV2luZG93Ci0JUHlNYWNfUFJFQ0hFQ0soWm9vbVdpbmRvdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soWm9vbVdpbmRvdyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZwYXJ0Q29kZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZyb250KSkKLQkJcmV0dXJuIE5VTEw7Ci0JWm9vbVdpbmRvdyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgcGFydENvZGUsCi0JICAgICAgICAgICBmcm9udCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnRDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZnJvbnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBab29tV2luZG93KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICBwYXJ0Q29kZSwKKyAgICAgICAgICAgICAgIGZyb250KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0lzV2luZG93Q29sbGFwc2FibGUoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CiAjaWZuZGVmIElzV2luZG93Q29sbGFwc2FibGUKLQlQeU1hY19QUkVDSEVDSyhJc1dpbmRvd0NvbGxhcHNhYmxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhJc1dpbmRvd0NvbGxhcHNhYmxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBJc1dpbmRvd0NvbGxhcHNhYmxlKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBJc1dpbmRvd0NvbGxhcHNhYmxlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9Jc1dpbmRvd0NvbGxhcHNlZChXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKICNpZm5kZWYgSXNXaW5kb3dDb2xsYXBzZWQKLQlQeU1hY19QUkVDSEVDSyhJc1dpbmRvd0NvbGxhcHNlZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSXNXaW5kb3dDb2xsYXBzZWQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IElzV2luZG93Q29sbGFwc2VkKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBJc1dpbmRvd0NvbGxhcHNlZChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfQ29sbGFwc2VXaW5kb3coV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUJvb2xlYW4gY29sbGFwc2U7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgQm9vbGVhbiBjb2xsYXBzZTsKICNpZm5kZWYgQ29sbGFwc2VXaW5kb3cKLQlQeU1hY19QUkVDSEVDSyhDb2xsYXBzZVdpbmRvdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ29sbGFwc2VXaW5kb3cpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZjb2xsYXBzZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDb2xsYXBzZVdpbmRvdyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICBjb2xsYXBzZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2xsYXBzZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDb2xsYXBzZVdpbmRvdyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsYXBzZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0dldFdpbmRvd0JvdW5kcyhXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93UmVnaW9uQ29kZSByZWdpb25Db2RlOwotCVJlY3QgZ2xvYmFsQm91bmRzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd1JlZ2lvbkNvZGUgcmVnaW9uQ29kZTsKKyAgICBSZWN0IGdsb2JhbEJvdW5kczsKICNpZm5kZWYgR2V0V2luZG93Qm91bmRzCi0JUHlNYWNfUFJFQ0hFQ0soR2V0V2luZG93Qm91bmRzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRXaW5kb3dCb3VuZHMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiSCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZWdpb25Db2RlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldFdpbmRvd0JvdW5kcyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uQ29kZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICZnbG9iYWxCb3VuZHMpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZnbG9iYWxCb3VuZHMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIkgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVnaW9uQ29kZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRXaW5kb3dCb3VuZHMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbkNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xvYmFsQm91bmRzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmZ2xvYmFsQm91bmRzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfUmVzaXplV2luZG93KFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JUG9pbnQgaW5TdGFydFBvaW50OwotCVJlY3QgaW5TaXplQ29uc3RyYWludHM7Ci0JUmVjdCBvdXROZXdDb250ZW50UmVjdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgUG9pbnQgaW5TdGFydFBvaW50OworICAgIFJlY3QgaW5TaXplQ29uc3RyYWludHM7CisgICAgUmVjdCBvdXROZXdDb250ZW50UmVjdDsKICNpZm5kZWYgUmVzaXplV2luZG93Ci0JUHlNYWNfUFJFQ0hFQ0soUmVzaXplV2luZG93KTsKKyAgICBQeU1hY19QUkVDSEVDSyhSZXNpemVXaW5kb3cpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmaW5TdGFydFBvaW50LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5TaXplQ29uc3RyYWludHMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBSZXNpemVXaW5kb3coX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgaW5TdGFydFBvaW50LAotCSAgICAgICAgICAgICAgICAgICAmaW5TaXplQ29uc3RyYWludHMsCi0JICAgICAgICAgICAgICAgICAgICZvdXROZXdDb250ZW50UmVjdCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJm91dE5ld0NvbnRlbnRSZWN0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZpblN0YXJ0UG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpblNpemVDb25zdHJhaW50cykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFJlc2l6ZVdpbmRvdyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICBpblN0YXJ0UG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICZpblNpemVDb25zdHJhaW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgJm91dE5ld0NvbnRlbnRSZWN0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmb3V0TmV3Q29udGVudFJlY3QpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9TZXRXaW5kb3dCb3VuZHMoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVdpbmRvd1JlZ2lvbkNvZGUgcmVnaW9uQ29kZTsKLQlSZWN0IGdsb2JhbEJvdW5kczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBXaW5kb3dSZWdpb25Db2RlIHJlZ2lvbkNvZGU7CisgICAgUmVjdCBnbG9iYWxCb3VuZHM7CiAjaWZuZGVmIFNldFdpbmRvd0JvdW5kcwotCVB5TWFjX1BSRUNIRUNLKFNldFdpbmRvd0JvdW5kcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0V2luZG93Qm91bmRzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIkhPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZWdpb25Db2RlLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmZ2xvYmFsQm91bmRzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldFdpbmRvd0JvdW5kcyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uQ29kZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICZnbG9iYWxCb3VuZHMpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIkhPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWdpb25Db2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmZ2xvYmFsQm91bmRzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldFdpbmRvd0JvdW5kcyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG9iYWxCb3VuZHMpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9SZXBvc2l0aW9uV2luZG93KFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlXaW5kb3dQdHIgcGFyZW50V2luZG93OwotCVdpbmRvd1Bvc2l0aW9uTWV0aG9kIG1ldGhvZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBXaW5kb3dQdHIgcGFyZW50V2luZG93OworICAgIFdpbmRvd1Bvc2l0aW9uTWV0aG9kIG1ldGhvZDsKICNpZm5kZWYgUmVwb3NpdGlvbldpbmRvdwotCVB5TWFjX1BSRUNIRUNLKFJlcG9zaXRpb25XaW5kb3cpOworICAgIFB5TWFjX1BSRUNIRUNLKFJlcG9zaXRpb25XaW5kb3cpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZwYXJlbnRXaW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICZtZXRob2QpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUmVwb3NpdGlvbldpbmRvdyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudFdpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmcGFyZW50V2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWV0aG9kKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFJlcG9zaXRpb25XaW5kb3coX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRXaW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfTW92ZVdpbmRvd1N0cnVjdHVyZShXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0Jc2hvcnQgaEdsb2JhbDsKLQlzaG9ydCB2R2xvYmFsOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIHNob3J0IGhHbG9iYWw7CisgICAgc2hvcnQgdkdsb2JhbDsKICNpZm5kZWYgTW92ZVdpbmRvd1N0cnVjdHVyZQotCVB5TWFjX1BSRUNIRUNLKE1vdmVXaW5kb3dTdHJ1Y3R1cmUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmVXaW5kb3dTdHJ1Y3R1cmUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaEdsb2JhbCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZHbG9iYWwpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gTW92ZVdpbmRvd1N0cnVjdHVyZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGhHbG9iYWwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgdkdsb2JhbCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaEdsb2JhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZHbG9iYWwpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gTW92ZVdpbmRvd1N0cnVjdHVyZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhHbG9iYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdkdsb2JhbCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0lzV2luZG93SW5TdGFuZGFyZFN0YXRlKFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JUG9pbnQgaW5JZGVhbFNpemU7Ci0JUmVjdCBvdXRJZGVhbFN0YW5kYXJkU3RhdGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIFBvaW50IGluSWRlYWxTaXplOworICAgIFJlY3Qgb3V0SWRlYWxTdGFuZGFyZFN0YXRlOwogI2lmbmRlZiBJc1dpbmRvd0luU3RhbmRhcmRTdGF0ZQotCVB5TWFjX1BSRUNIRUNLKElzV2luZG93SW5TdGFuZGFyZFN0YXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhJc1dpbmRvd0luU3RhbmRhcmRTdGF0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmaW5JZGVhbFNpemUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBJc1dpbmRvd0luU3RhbmRhcmRTdGF0ZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbklkZWFsU2l6ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0SWRlYWxTdGFuZGFyZFN0YXRlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmb3V0SWRlYWxTdGFuZGFyZFN0YXRlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmaW5JZGVhbFNpemUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBJc1dpbmRvd0luU3RhbmRhcmRTdGF0ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbklkZWFsU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0SWRlYWxTdGFuZGFyZFN0YXRlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmb3V0SWRlYWxTdGFuZGFyZFN0YXRlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfWm9vbVdpbmRvd0lkZWFsKFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlXaW5kb3dQYXJ0Q29kZSBpblBhcnRDb2RlOwotCVBvaW50IGlvSWRlYWxTaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd1BhcnRDb2RlIGluUGFydENvZGU7CisgICAgUG9pbnQgaW9JZGVhbFNpemU7CiAjaWZuZGVmIFpvb21XaW5kb3dJZGVhbAotCVB5TWFjX1BSRUNIRUNLKFpvb21XaW5kb3dJZGVhbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soWm9vbVdpbmRvd0lkZWFsKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5QYXJ0Q29kZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBab29tV2luZG93SWRlYWwoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgIGluUGFydENvZGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAmaW9JZGVhbFNpemUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFBvaW50LCBpb0lkZWFsU2l6ZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblBhcnRDb2RlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFpvb21XaW5kb3dJZGVhbChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5QYXJ0Q29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZpb0lkZWFsU2l6ZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUG9pbnQsIGlvSWRlYWxTaXplKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfR2V0V2luZG93SWRlYWxVc2VyU3RhdGUoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVJlY3Qgb3V0VXNlclN0YXRlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFJlY3Qgb3V0VXNlclN0YXRlOwogI2lmbmRlZiBHZXRXaW5kb3dJZGVhbFVzZXJTdGF0ZQotCVB5TWFjX1BSRUNIRUNLKEdldFdpbmRvd0lkZWFsVXNlclN0YXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRXaW5kb3dJZGVhbFVzZXJTdGF0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldFdpbmRvd0lkZWFsVXNlclN0YXRlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRVc2VyU3RhdGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZvdXRVc2VyU3RhdGUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0V2luZG93SWRlYWxVc2VyU3RhdGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFVzZXJTdGF0ZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJm91dFVzZXJTdGF0ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX1NldFdpbmRvd0lkZWFsVXNlclN0YXRlKFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlSZWN0IGluVXNlclN0YXRlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFJlY3QgaW5Vc2VyU3RhdGU7CiAjaWZuZGVmIFNldFdpbmRvd0lkZWFsVXNlclN0YXRlCi0JUHlNYWNfUFJFQ0hFQ0soU2V0V2luZG93SWRlYWxVc2VyU3RhdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFdpbmRvd0lkZWFsVXNlclN0YXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmluVXNlclN0YXRlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldFdpbmRvd0lkZWFsVXNlclN0YXRlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpblVzZXJTdGF0ZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5Vc2VyU3RhdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0V2luZG93SWRlYWxVc2VyU3RhdGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluVXNlclN0YXRlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfR2V0V2luZG93R3JlYXRlc3RBcmVhRGV2aWNlKFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlXaW5kb3dSZWdpb25Db2RlIGluUmVnaW9uOwotCUdESGFuZGxlIG91dEdyZWF0ZXN0RGV2aWNlOwotCVJlY3Qgb3V0R3JlYXRlc3REZXZpY2VSZWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd1JlZ2lvbkNvZGUgaW5SZWdpb247CisgICAgR0RIYW5kbGUgb3V0R3JlYXRlc3REZXZpY2U7CisgICAgUmVjdCBvdXRHcmVhdGVzdERldmljZVJlY3Q7CiAjaWZuZGVmIEdldFdpbmRvd0dyZWF0ZXN0QXJlYURldmljZQotCVB5TWFjX1BSRUNIRUNLKEdldFdpbmRvd0dyZWF0ZXN0QXJlYURldmljZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0V2luZG93R3JlYXRlc3RBcmVhRGV2aWNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIkgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5SZWdpb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0V2luZG93R3JlYXRlc3RBcmVhRGV2aWNlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblJlZ2lvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRHcmVhdGVzdERldmljZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRHcmVhdGVzdERldmljZVJlY3QpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIG91dEdyZWF0ZXN0RGV2aWNlLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJm91dEdyZWF0ZXN0RGV2aWNlUmVjdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblJlZ2lvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRXaW5kb3dHcmVhdGVzdEFyZWFEZXZpY2UoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluUmVnaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEdyZWF0ZXN0RGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEdyZWF0ZXN0RGV2aWNlUmVjdCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgb3V0R3JlYXRlc3REZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmb3V0R3JlYXRlc3REZXZpY2VSZWN0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfQ29uc3RyYWluV2luZG93VG9TY3JlZW4oV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVdpbmRvd1JlZ2lvbkNvZGUgaW5SZWdpb25Db2RlOwotCVdpbmRvd0NvbnN0cmFpbk9wdGlvbnMgaW5PcHRpb25zOwotCVJlY3QgaW5TY3JlZW5SZWN0OwotCVJlY3Qgb3V0U3RydWN0dXJlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd1JlZ2lvbkNvZGUgaW5SZWdpb25Db2RlOworICAgIFdpbmRvd0NvbnN0cmFpbk9wdGlvbnMgaW5PcHRpb25zOworICAgIFJlY3QgaW5TY3JlZW5SZWN0OworICAgIFJlY3Qgb3V0U3RydWN0dXJlOwogI2lmbmRlZiBDb25zdHJhaW5XaW5kb3dUb1NjcmVlbgotCVB5TWFjX1BSRUNIRUNLKENvbnN0cmFpbldpbmRvd1RvU2NyZWVuKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb25zdHJhaW5XaW5kb3dUb1NjcmVlbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJIbE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluUmVnaW9uQ29kZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluT3B0aW9ucywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmluU2NyZWVuUmVjdCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDb25zdHJhaW5XaW5kb3dUb1NjcmVlbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblJlZ2lvbkNvZGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluT3B0aW9ucywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluU2NyZWVuUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFN0cnVjdHVyZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJm91dFN0cnVjdHVyZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiSGxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblJlZ2lvbkNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbk9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpblNjcmVlblJlY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ29uc3RyYWluV2luZG93VG9TY3JlZW4oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5SZWdpb25Db2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbk9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpblNjcmVlblJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRTdHJ1Y3R1cmUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZvdXRTdHJ1Y3R1cmUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9IaWRlV2luZG93KFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBIaWRlV2luZG93Ci0JUHlNYWNfUFJFQ0hFQ0soSGlkZVdpbmRvdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSGlkZVdpbmRvdyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JSGlkZVdpbmRvdyhfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEhpZGVXaW5kb3coX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9NYWNTaG93V2luZG93KFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBNYWNTaG93V2luZG93Ci0JUHlNYWNfUFJFQ0hFQ0soTWFjU2hvd1dpbmRvdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWFjU2hvd1dpbmRvdyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTWFjU2hvd1dpbmRvdyhfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE1hY1Nob3dXaW5kb3coX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9TaG93SGlkZShXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gc2hvd0ZsYWc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gc2hvd0ZsYWc7CiAjaWZuZGVmIFNob3dIaWRlCi0JUHlNYWNfUFJFQ0hFQ0soU2hvd0hpZGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNob3dIaWRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2hvd0ZsYWcpKQotCQlyZXR1cm4gTlVMTDsKLQlTaG93SGlkZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgIHNob3dGbGFnKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzaG93RmxhZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNob3dIaWRlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgc2hvd0ZsYWcpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfTWFjSXNXaW5kb3dWaXNpYmxlKFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OwogI2lmbmRlZiBNYWNJc1dpbmRvd1Zpc2libGUKLQlQeU1hY19QUkVDSEVDSyhNYWNJc1dpbmRvd1Zpc2libGUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1hY0lzV2luZG93VmlzaWJsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWFjSXNXaW5kb3dWaXNpYmxlKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNYWNJc1dpbmRvd1Zpc2libGUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX1Nob3dTaGVldFdpbmRvdyhXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93UHRyIGluUGFyZW50V2luZG93OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd1B0ciBpblBhcmVudFdpbmRvdzsKICNpZm5kZWYgU2hvd1NoZWV0V2luZG93Ci0JUHlNYWNfUFJFQ0hFQ0soU2hvd1NoZWV0V2luZG93KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTaG93U2hlZXRXaW5kb3cpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmluUGFyZW50V2luZG93KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNob3dTaGVldFdpbmRvdyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgaW5QYXJlbnRXaW5kb3cpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpblBhcmVudFdpbmRvdykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTaG93U2hlZXRXaW5kb3coX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGluUGFyZW50V2luZG93KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfSGlkZVNoZWV0V2luZG93KFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKICNpZm5kZWYgSGlkZVNoZWV0V2luZG93Ci0JUHlNYWNfUFJFQ0hFQ0soSGlkZVNoZWV0V2luZG93KTsKKyAgICBQeU1hY19QUkVDSEVDSyhIaWRlU2hlZXRXaW5kb3cpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBIaWRlU2hlZXRXaW5kb3coX3NlbGYtPm9iX2l0c2VsZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBIaWRlU2hlZXRXaW5kb3coX3NlbGYtPm9iX2l0c2VsZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0dldFNoZWV0V2luZG93UGFyZW50KFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlXaW5kb3dQdHIgb3V0UGFyZW50V2luZG93OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd1B0ciBvdXRQYXJlbnRXaW5kb3c7CiAjaWZuZGVmIEdldFNoZWV0V2luZG93UGFyZW50Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0U2hlZXRXaW5kb3dQYXJlbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFNoZWV0V2luZG93UGFyZW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0U2hlZXRXaW5kb3dQYXJlbnQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFBhcmVudFdpbmRvdyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9XaGljaFdpbmRvdywgb3V0UGFyZW50V2luZG93KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldFNoZWV0V2luZG93UGFyZW50KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRQYXJlbnRXaW5kb3cpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfV2hpY2hXaW5kb3csIG91dFBhcmVudFdpbmRvdyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0dldFdpbmRvd1Byb3BlcnR5QXR0cmlidXRlcyhXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JT1NUeXBlIHByb3BlcnR5Q3JlYXRvcjsKLQlPU1R5cGUgcHJvcGVydHlUYWc7Ci0JVUludDMyIGF0dHJpYnV0ZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgT1NUeXBlIHByb3BlcnR5Q3JlYXRvcjsKKyAgICBPU1R5cGUgcHJvcGVydHlUYWc7CisgICAgVUludDMyIGF0dHJpYnV0ZXM7CiAjaWZuZGVmIEdldFdpbmRvd1Byb3BlcnR5QXR0cmlidXRlcwotCVB5TWFjX1BSRUNIRUNLKEdldFdpbmRvd1Byb3BlcnR5QXR0cmlidXRlcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0V2luZG93UHJvcGVydHlBdHRyaWJ1dGVzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZwcm9wZXJ0eUNyZWF0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnByb3BlcnR5VGFnKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldFdpbmRvd1Byb3BlcnR5QXR0cmlidXRlcyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlDcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlUYWcsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXR0cmlidXRlcyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnByb3BlcnR5Q3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcHJvcGVydHlUYWcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0V2luZG93UHJvcGVydHlBdHRyaWJ1dGVzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eUNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhdHRyaWJ1dGVzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfQ2hhbmdlV2luZG93UHJvcGVydHlBdHRyaWJ1dGVzKFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlPU1R5cGUgcHJvcGVydHlDcmVhdG9yOwotCU9TVHlwZSBwcm9wZXJ0eVRhZzsKLQlVSW50MzIgYXR0cmlidXRlc1RvU2V0OwotCVVJbnQzMiBhdHRyaWJ1dGVzVG9DbGVhcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBPU1R5cGUgcHJvcGVydHlDcmVhdG9yOworICAgIE9TVHlwZSBwcm9wZXJ0eVRhZzsKKyAgICBVSW50MzIgYXR0cmlidXRlc1RvU2V0OworICAgIFVJbnQzMiBhdHRyaWJ1dGVzVG9DbGVhcjsKICNpZm5kZWYgQ2hhbmdlV2luZG93UHJvcGVydHlBdHRyaWJ1dGVzCi0JUHlNYWNfUFJFQ0hFQ0soQ2hhbmdlV2luZG93UHJvcGVydHlBdHRyaWJ1dGVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDaGFuZ2VXaW5kb3dQcm9wZXJ0eUF0dHJpYnV0ZXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcHJvcGVydHlDcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZwcm9wZXJ0eVRhZywKLQkgICAgICAgICAgICAgICAgICAgICAgJmF0dHJpYnV0ZXNUb1NldCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmF0dHJpYnV0ZXNUb0NsZWFyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENoYW5nZVdpbmRvd1Byb3BlcnR5QXR0cmlidXRlcyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlDcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlUYWcsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzVG9TZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzVG9DbGVhcik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcHJvcGVydHlDcmVhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZwcm9wZXJ0eVRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmF0dHJpYnV0ZXNUb1NldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmF0dHJpYnV0ZXNUb0NsZWFyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENoYW5nZVdpbmRvd1Byb3BlcnR5QXR0cmlidXRlcyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlDcmVhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlUYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzVG9TZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzVG9DbGVhcik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX1RyYWNrQm94KFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JUG9pbnQgdGhlUHQ7Ci0JV2luZG93UGFydENvZGUgcGFydENvZGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIFBvaW50IHRoZVB0OworICAgIFdpbmRvd1BhcnRDb2RlIHBhcnRDb2RlOwogI2lmbmRlZiBUcmFja0JveAotCVB5TWFjX1BSRUNIRUNLKFRyYWNrQm94KTsKKyAgICBQeU1hY19QUkVDSEVDSyhUcmFja0JveCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnRoZVB0LAotCSAgICAgICAgICAgICAgICAgICAgICAmcGFydENvZGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBUcmFja0JveChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgIHRoZVB0LAotCSAgICAgICAgICAgICAgIHBhcnRDb2RlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnRoZVB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFydENvZGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBUcmFja0JveChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgIHRoZVB0LAorICAgICAgICAgICAgICAgICAgIHBhcnRDb2RlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfVHJhY2tHb0F3YXkoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlQb2ludCB0aGVQdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgUG9pbnQgdGhlUHQ7CiAjaWZuZGVmIFRyYWNrR29Bd2F5Ci0JUHlNYWNfUFJFQ0hFQ0soVHJhY2tHb0F3YXkpOworICAgIFB5TWFjX1BSRUNIRUNLKFRyYWNrR29Bd2F5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZ0aGVQdCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFRyYWNrR29Bd2F5KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgdGhlUHQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZ0aGVQdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFRyYWNrR29Bd2F5KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgdGhlUHQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9HZXRXaW5kb3dQb3J0KFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0dyYWZQdHIgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDR3JhZlB0ciBfcnY7CiAjaWZuZGVmIEdldFdpbmRvd1BvcnQKLQlQeU1hY19QUkVDSEVDSyhHZXRXaW5kb3dQb3J0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRXaW5kb3dQb3J0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRXaW5kb3dQb3J0KF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgR3JhZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFdpbmRvd1BvcnQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfR2V0V2luZG93U3RydWN0dXJlUG9ydChXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNHcmFmUHRyIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0dyYWZQdHIgX3J2OwogI2lmbmRlZiBHZXRXaW5kb3dTdHJ1Y3R1cmVQb3J0Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0V2luZG93U3RydWN0dXJlUG9ydCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0V2luZG93U3RydWN0dXJlUG9ydCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0V2luZG93U3RydWN0dXJlUG9ydChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRXaW5kb3dTdHJ1Y3R1cmVQb3J0KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgR3JhZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0dldFdpbmRvd0tpbmQoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IF9ydjsKICNpZm5kZWYgR2V0V2luZG93S2luZAotCVB5TWFjX1BSRUNIRUNLKEdldFdpbmRvd0tpbmQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFdpbmRvd0tpbmQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFdpbmRvd0tpbmQoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFdpbmRvd0tpbmQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0lzV2luZG93SGlsaXRlZChXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKICNpZm5kZWYgSXNXaW5kb3dIaWxpdGVkCi0JUHlNYWNfUFJFQ0hFQ0soSXNXaW5kb3dIaWxpdGVkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhJc1dpbmRvd0hpbGl0ZWQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IElzV2luZG93SGlsaXRlZChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gSXNXaW5kb3dIaWxpdGVkKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9Jc1dpbmRvd1VwZGF0ZVBlbmRpbmcoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CiAjaWZuZGVmIElzV2luZG93VXBkYXRlUGVuZGluZwotCVB5TWFjX1BSRUNIRUNLKElzV2luZG93VXBkYXRlUGVuZGluZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSXNXaW5kb3dVcGRhdGVQZW5kaW5nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBJc1dpbmRvd1VwZGF0ZVBlbmRpbmcoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IElzV2luZG93VXBkYXRlUGVuZGluZyhfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfTWFjR2V0TmV4dFdpbmRvdyhXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVdpbmRvd1B0ciBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFdpbmRvd1B0ciBfcnY7CiAjaWZuZGVmIE1hY0dldE5leHRXaW5kb3cKLQlQeU1hY19QUkVDSEVDSyhNYWNHZXROZXh0V2luZG93KTsKKyAgICBQeU1hY19QUkVDSEVDSyhNYWNHZXROZXh0V2luZG93KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNYWNHZXROZXh0V2luZG93KF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgV2luT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWFjR2V0TmV4dFdpbmRvdyhfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0dldFdpbmRvd1N0YW5kYXJkU3RhdGUoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZWN0IHJlY3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlY3QgcmVjdDsKICNpZm5kZWYgR2V0V2luZG93U3RhbmRhcmRTdGF0ZQotCVB5TWFjX1BSRUNIRUNLKEdldFdpbmRvd1N0YW5kYXJkU3RhdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFdpbmRvd1N0YW5kYXJkU3RhdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUdldFdpbmRvd1N0YW5kYXJkU3RhdGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICZyZWN0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJnJlY3QpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRXaW5kb3dTdGFuZGFyZFN0YXRlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVjdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZyZWN0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfR2V0V2luZG93VXNlclN0YXRlKFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVjdCByZWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IHJlY3Q7CiAjaWZuZGVmIEdldFdpbmRvd1VzZXJTdGF0ZQotCVB5TWFjX1BSRUNIRUNLKEdldFdpbmRvd1VzZXJTdGF0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0V2luZG93VXNlclN0YXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlHZXRXaW5kb3dVc2VyU3RhdGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgJnJlY3QpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmcmVjdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldFdpbmRvd1VzZXJTdGF0ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAmcmVjdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZyZWN0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfU2V0V2luZG93S2luZChXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IGtpbmQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IGtpbmQ7CiAjaWZuZGVmIFNldFdpbmRvd0tpbmQKLQlQeU1hY19QUkVDSEVDSyhTZXRXaW5kb3dLaW5kKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRXaW5kb3dLaW5kKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAma2luZCkpCi0JCXJldHVybiBOVUxMOwotCVNldFdpbmRvd0tpbmQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgIGtpbmQpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmtpbmQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRXaW5kb3dLaW5kKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICBraW5kKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX1NldFdpbmRvd1N0YW5kYXJkU3RhdGUoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZWN0IHJlY3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlY3QgcmVjdDsKICNpZm5kZWYgU2V0V2luZG93U3RhbmRhcmRTdGF0ZQotCVB5TWFjX1BSRUNIRUNLKFNldFdpbmRvd1N0YW5kYXJkU3RhdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFdpbmRvd1N0YW5kYXJkU3RhdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmcmVjdCkpCi0JCXJldHVybiBOVUxMOwotCVNldFdpbmRvd1N0YW5kYXJkU3RhdGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICZyZWN0KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmcmVjdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldFdpbmRvd1N0YW5kYXJkU3RhdGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWN0KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX1NldFdpbmRvd1VzZXJTdGF0ZShXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3QgcmVjdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmVjdCByZWN0OwogI2lmbmRlZiBTZXRXaW5kb3dVc2VyU3RhdGUKLQlQeU1hY19QUkVDSEVDSyhTZXRXaW5kb3dVc2VyU3RhdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFdpbmRvd1VzZXJTdGF0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyZWN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0V2luZG93VXNlclN0YXRlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICZyZWN0KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmcmVjdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldFdpbmRvd1VzZXJTdGF0ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAmcmVjdCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9TZXRQb3J0V2luZG93UG9ydChXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgU2V0UG9ydFdpbmRvd1BvcnQKLQlQeU1hY19QUkVDSEVDSyhTZXRQb3J0V2luZG93UG9ydCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0UG9ydFdpbmRvd1BvcnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCVNldFBvcnRXaW5kb3dQb3J0KF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0UG9ydFdpbmRvd1BvcnQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9HZXRXaW5kb3dQb3J0Qm91bmRzKFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVjdCBib3VuZHM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlY3QgYm91bmRzOwogI2lmbmRlZiBHZXRXaW5kb3dQb3J0Qm91bmRzCi0JUHlNYWNfUFJFQ0hFQ0soR2V0V2luZG93UG9ydEJvdW5kcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0V2luZG93UG9ydEJvdW5kcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0V2luZG93UG9ydEJvdW5kcyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgJmJvdW5kcyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZib3VuZHMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRXaW5kb3dQb3J0Qm91bmRzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmJvdW5kcyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0lzV2luZG93VmlzaWJsZShXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKICNpZm5kZWYgSXNXaW5kb3dWaXNpYmxlCi0JUHlNYWNfUFJFQ0hFQ0soSXNXaW5kb3dWaXNpYmxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhJc1dpbmRvd1Zpc2libGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IElzV2luZG93VmlzaWJsZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gSXNXaW5kb3dWaXNpYmxlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9HZXRXaW5kb3dTdHJ1Y3R1cmVSZ24oV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZ25IYW5kbGUgcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIHI7CiAjaWZuZGVmIEdldFdpbmRvd1N0cnVjdHVyZVJnbgotCVB5TWFjX1BSRUNIRUNLKEdldFdpbmRvd1N0cnVjdHVyZVJnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0V2luZG93U3RydWN0dXJlUmduKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0V2luZG93U3RydWN0dXJlUmduKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgIHIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldFdpbmRvd1N0cnVjdHVyZVJnbihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICByKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0dldFdpbmRvd0NvbnRlbnRSZ24oV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZ25IYW5kbGUgcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIHI7CiAjaWZuZGVmIEdldFdpbmRvd0NvbnRlbnRSZ24KLQlQeU1hY19QUkVDSEVDSyhHZXRXaW5kb3dDb250ZW50UmduKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRXaW5kb3dDb250ZW50UmduKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0V2luZG93Q29udGVudFJnbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgcik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0V2luZG93Q29udGVudFJnbihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgcik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9HZXRXaW5kb3dVcGRhdGVSZ24oV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZ25IYW5kbGUgcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIHI7CiAjaWZuZGVmIEdldFdpbmRvd1VwZGF0ZVJnbgotCVB5TWFjX1BSRUNIRUNLKEdldFdpbmRvd1VwZGF0ZVJnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0V2luZG93VXBkYXRlUmduKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0V2luZG93VXBkYXRlUmduKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgIHIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldFdpbmRvd1VwZGF0ZVJnbihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICByKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0dldE5leHRXaW5kb3coV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlXaW5kb3dQdHIgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBXaW5kb3dQdHIgX3J2OwogI2lmbmRlZiBHZXROZXh0V2luZG93Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0TmV4dFdpbmRvdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TmV4dFdpbmRvdyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TmV4dFdpbmRvdyhfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9XaGljaFdpbmRvdywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TmV4dFdpbmRvdyhfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9XaGljaFdpbmRvdywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfTW92ZVdpbmRvdyhXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IGhHbG9iYWw7Ci0Jc2hvcnQgdkdsb2JhbDsKLQlCb29sZWFuIGZyb250OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBoR2xvYmFsOworICAgIHNob3J0IHZHbG9iYWw7CisgICAgQm9vbGVhbiBmcm9udDsKICNpZm5kZWYgTW92ZVdpbmRvdwotCVB5TWFjX1BSRUNIRUNLKE1vdmVXaW5kb3cpOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmVXaW5kb3cpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGhiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmhHbG9iYWwsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2R2xvYmFsLAotCSAgICAgICAgICAgICAgICAgICAgICAmZnJvbnQpKQotCQlyZXR1cm4gTlVMTDsKLQlNb3ZlV2luZG93KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICBoR2xvYmFsLAotCSAgICAgICAgICAgdkdsb2JhbCwKLQkgICAgICAgICAgIGZyb250KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGhiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmhHbG9iYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2R2xvYmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZnJvbnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNb3ZlV2luZG93KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICBoR2xvYmFsLAorICAgICAgICAgICAgICAgdkdsb2JhbCwKKyAgICAgICAgICAgICAgIGZyb250KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX1Nob3dXaW5kb3coV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIFNob3dXaW5kb3cKLQlQeU1hY19QUkVDSEVDSyhTaG93V2luZG93KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTaG93V2luZG93KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlTaG93V2luZG93KF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2hvd1dpbmRvdyhfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0F1dG9EaXNwb3NlKFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogCi0JaW50IG9ub2ZmLCBvbGQgPSAwOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImkiLCAmb25vZmYpKQotCSAgICAgICAgcmV0dXJuIE5VTEw7Ci0JaWYgKCBfc2VsZi0+b2JfZnJlZWl0ICkKLQkgICAgICAgIG9sZCA9IDE7Ci0JaWYgKCBvbm9mZiApCi0JICAgICAgICBfc2VsZi0+b2JfZnJlZWl0ID0gUHlNYWNfQXV0b0Rpc3Bvc2VXaW5kb3c7Ci0JZWxzZQotCSAgICAgICAgX3NlbGYtPm9iX2ZyZWVpdCA9IE5VTEw7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImkiLCBvbGQpOwotCXJldHVybiBfcmVzOworICAgIGludCBvbm9mZiwgb2xkID0gMDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJpIiwgJm9ub2ZmKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCBfc2VsZi0+b2JfZnJlZWl0ICkKKyAgICAgICAgb2xkID0gMTsKKyAgICBpZiAoIG9ub2ZmICkKKyAgICAgICAgX3NlbGYtPm9iX2ZyZWVpdCA9IFB5TWFjX0F1dG9EaXNwb3NlV2luZG93OworICAgIGVsc2UKKyAgICAgICAgX3NlbGYtPm9iX2ZyZWVpdCA9IE5VTEw7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImkiLCBvbGQpOworICAgIHJldHVybiBfcmVzOwogCiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBXaW5PYmpfbWV0aG9kc1tdID0gewotCXsiR2V0V2luZG93T3duZXJDb3VudCIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V2luZG93T3duZXJDb3VudCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVUludDMyIG91dENvdW50KSIpfSwKLQl7IkNsb25lV2luZG93IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9DbG9uZVdpbmRvdywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiR2V0V2luZG93UmV0YWluQ291bnQiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldFdpbmRvd1JldGFpbkNvdW50LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChJdGVtQ291bnQgX3J2KSIpfSwKLQl7IlJldGFpbldpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5PYmpfUmV0YWluV2luZG93LCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJSZWxlYXNlV2luZG93IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9SZWxlYXNlV2luZG93LCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJSZXNoYXBlQ3VzdG9tV2luZG93IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9SZXNoYXBlQ3VzdG9tV2luZG93LCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJHZXRXaW5kb3dXaWRnZXRIaWxpdGUiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldFdpbmRvd1dpZGdldEhpbGl0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoV2luZG93RGVmUGFydENvZGUgb3V0SGlsaXRlKSIpfSwKLQl7IkdldFdpbmRvd0NsYXNzIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9HZXRXaW5kb3dDbGFzcywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoV2luZG93Q2xhc3Mgb3V0Q2xhc3MpIil9LAotCXsiR2V0V2luZG93QXR0cmlidXRlcyIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V2luZG93QXR0cmlidXRlcywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoV2luZG93QXR0cmlidXRlcyBvdXRBdHRyaWJ1dGVzKSIpfSwKLQl7IkNoYW5nZVdpbmRvd0F0dHJpYnV0ZXMiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0NoYW5nZVdpbmRvd0F0dHJpYnV0ZXMsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd0F0dHJpYnV0ZXMgc2V0VGhlc2VBdHRyaWJ1dGVzLCBXaW5kb3dBdHRyaWJ1dGVzIGNsZWFyVGhlc2VBdHRyaWJ1dGVzKSAtPiBOb25lIil9LAotCXsiU2V0V2luZG93Q2xhc3MiLCAoUHlDRnVuY3Rpb24pV2luT2JqX1NldFdpbmRvd0NsYXNzLCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dDbGFzcyBpbldpbmRvd0NsYXNzKSAtPiBOb25lIil9LAotCXsiU2V0V2luZG93TW9kYWxpdHkiLCAoUHlDRnVuY3Rpb24pV2luT2JqX1NldFdpbmRvd01vZGFsaXR5LCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dNb2RhbGl0eSBpbk1vZGFsS2luZCwgV2luZG93UHRyIGluVW5hdmFpbGFibGVXaW5kb3cpIC0+IE5vbmUiKX0sCi0JeyJHZXRXaW5kb3dNb2RhbGl0eSIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V2luZG93TW9kYWxpdHksIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFdpbmRvd01vZGFsaXR5IG91dE1vZGFsS2luZCwgV2luZG93UHRyIG91dFVuYXZhaWxhYmxlV2luZG93KSIpfSwKLQl7IlNldFdpbmRvd0NvbnRlbnRDb2xvciIsIChQeUNGdW5jdGlvbilXaW5PYmpfU2V0V2luZG93Q29udGVudENvbG9yLCAxLAotCSBQeURvY19TVFIoIihSR0JDb2xvciBjb2xvcikgLT4gTm9uZSIpfSwKLQl7IkdldFdpbmRvd0NvbnRlbnRDb2xvciIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V2luZG93Q29udGVudENvbG9yLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChSR0JDb2xvciBjb2xvcikiKX0sCi0JeyJHZXRXaW5kb3dDb250ZW50UGF0dGVybiIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V2luZG93Q29udGVudFBhdHRlcm4sIDEsCi0JIFB5RG9jX1NUUigiKFBpeFBhdEhhbmRsZSBvdXRQaXhQYXQpIC0+IE5vbmUiKX0sCi0JeyJTZXRXaW5kb3dDb250ZW50UGF0dGVybiIsIChQeUNGdW5jdGlvbilXaW5PYmpfU2V0V2luZG93Q29udGVudFBhdHRlcm4sIDEsCi0JIFB5RG9jX1NUUigiKFBpeFBhdEhhbmRsZSBwaXhQYXQpIC0+IE5vbmUiKX0sCi0JeyJTY3JvbGxXaW5kb3dSZWN0IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9TY3JvbGxXaW5kb3dSZWN0LCAxLAotCSBQeURvY19TVFIoIihSZWN0IGluU2Nyb2xsUmVjdCwgU0ludDE2IGluSFBpeGVscywgU0ludDE2IGluVlBpeGVscywgU2Nyb2xsV2luZG93T3B0aW9ucyBpbk9wdGlvbnMsIFJnbkhhbmRsZSBvdXRFeHBvc2VkUmduKSAtPiBOb25lIil9LAotCXsiU2Nyb2xsV2luZG93UmVnaW9uIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9TY3JvbGxXaW5kb3dSZWdpb24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSBpblNjcm9sbFJnbiwgU0ludDE2IGluSFBpeGVscywgU0ludDE2IGluVlBpeGVscywgU2Nyb2xsV2luZG93T3B0aW9ucyBpbk9wdGlvbnMsIFJnbkhhbmRsZSBvdXRFeHBvc2VkUmduKSAtPiBOb25lIil9LAotCXsiQ2xpcEFib3ZlIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9DbGlwQWJvdmUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IlBhaW50T25lIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9QYWludE9uZSwgMSwKLQkgUHlEb2NfU1RSKCIoUmduSGFuZGxlIGNsb2JiZXJlZFJnbikgLT4gTm9uZSIpfSwKLQl7IlBhaW50QmVoaW5kIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9QYWludEJlaGluZCwgMSwKLQkgUHlEb2NfU1RSKCIoUmduSGFuZGxlIGNsb2JiZXJlZFJnbikgLT4gTm9uZSIpfSwKLQl7IkNhbGNWaXMiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0NhbGNWaXMsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkNhbGNWaXNCZWhpbmQiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0NhbGNWaXNCZWhpbmQsIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSBjbG9iYmVyZWRSZ24pIC0+IE5vbmUiKX0sCi0JeyJCcmluZ1RvRnJvbnQiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0JyaW5nVG9Gcm9udCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiU2VuZEJlaGluZCIsIChQeUNGdW5jdGlvbilXaW5PYmpfU2VuZEJlaGluZCwgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIGJlaGluZFdpbmRvdykgLT4gTm9uZSIpfSwKLQl7IlNlbGVjdFdpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5PYmpfU2VsZWN0V2luZG93LCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJHZXROZXh0V2luZG93T2ZDbGFzcyIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0TmV4dFdpbmRvd09mQ2xhc3MsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd0NsYXNzIGluV2luZG93Q2xhc3MsIEJvb2xlYW4gbXVzdEJlVmlzaWJsZSkgLT4gKFdpbmRvd1B0ciBfcnYpIil9LAotCXsiU2V0V2luZG93QWx0ZXJuYXRlVGl0bGUiLCAoUHlDRnVuY3Rpb24pV2luT2JqX1NldFdpbmRvd0FsdGVybmF0ZVRpdGxlLCAxLAotCSBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBpblRpdGxlKSAtPiBOb25lIil9LAotCXsiQ29weVdpbmRvd0FsdGVybmF0ZVRpdGxlIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9Db3B5V2luZG93QWx0ZXJuYXRlVGl0bGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENGU3RyaW5nUmVmIG91dFRpdGxlKSIpfSwKLQl7IkhpbGl0ZVdpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5PYmpfSGlsaXRlV2luZG93LCAxLAotCSBQeURvY19TVFIoIihCb29sZWFuIGZIaWxpdGUpIC0+IE5vbmUiKX0sCi0JeyJTZXRXUmVmQ29uIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9TZXRXUmVmQ29uLCAxLAotCSBQeURvY19TVFIoIihsb25nIGRhdGEpIC0+IE5vbmUiKX0sCi0JeyJHZXRXUmVmQ29uIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9HZXRXUmVmQ29uLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChsb25nIF9ydikiKX0sCi0JeyJTZXRXaW5kb3dQaWMiLCAoUHlDRnVuY3Rpb24pV2luT2JqX1NldFdpbmRvd1BpYywgMSwKLQkgUHlEb2NfU1RSKCIoUGljSGFuZGxlIHBpYykgLT4gTm9uZSIpfSwKLQl7IkdldFdpbmRvd1BpYyIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V2luZG93UGljLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChQaWNIYW5kbGUgX3J2KSIpfSwKLQl7IkdldFdWYXJpYW50IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9HZXRXVmFyaWFudCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgX3J2KSIpfSwKLQl7IkdldFdpbmRvd0ZlYXR1cmVzIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9HZXRXaW5kb3dGZWF0dXJlcywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVUludDMyIG91dEZlYXR1cmVzKSIpfSwKLQl7IkdldFdpbmRvd1JlZ2lvbiIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V2luZG93UmVnaW9uLCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dSZWdpb25Db2RlIGluUmVnaW9uQ29kZSwgUmduSGFuZGxlIGlvV2luUmduKSAtPiBOb25lIil9LAotCXsiR2V0V2luZG93U3RydWN0dXJlV2lkdGhzIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9HZXRXaW5kb3dTdHJ1Y3R1cmVXaWR0aHMsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFJlY3Qgb3V0UmVjdCkiKX0sCi0JeyJCZWdpblVwZGF0ZSIsIChQeUNGdW5jdGlvbilXaW5PYmpfQmVnaW5VcGRhdGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkVuZFVwZGF0ZSIsIChQeUNGdW5jdGlvbilXaW5PYmpfRW5kVXBkYXRlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJJbnZhbFdpbmRvd1JnbiIsIChQeUNGdW5jdGlvbilXaW5PYmpfSW52YWxXaW5kb3dSZ24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZWdpb24pIC0+IE5vbmUiKX0sCi0JeyJJbnZhbFdpbmRvd1JlY3QiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0ludmFsV2luZG93UmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCBib3VuZHMpIC0+IE5vbmUiKX0sCi0JeyJWYWxpZFdpbmRvd1JnbiIsIChQeUNGdW5jdGlvbilXaW5PYmpfVmFsaWRXaW5kb3dSZ24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZWdpb24pIC0+IE5vbmUiKX0sCi0JeyJWYWxpZFdpbmRvd1JlY3QiLCAoUHlDRnVuY3Rpb24pV2luT2JqX1ZhbGlkV2luZG93UmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCBib3VuZHMpIC0+IE5vbmUiKX0sCi0JeyJEcmF3R3Jvd0ljb24iLCAoUHlDRnVuY3Rpb24pV2luT2JqX0RyYXdHcm93SWNvbiwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiU2V0V1RpdGxlIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9TZXRXVGl0bGUsIDEsCi0JIFB5RG9jX1NUUigiKFN0cjI1NSB0aXRsZSkgLT4gTm9uZSIpfSwKLQl7IkdldFdUaXRsZSIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V1RpdGxlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChTdHIyNTUgdGl0bGUpIil9LAotCXsiU2V0V2luZG93VGl0bGVXaXRoQ0ZTdHJpbmciLCAoUHlDRnVuY3Rpb24pV2luT2JqX1NldFdpbmRvd1RpdGxlV2l0aENGU3RyaW5nLCAxLAotCSBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBpblN0cmluZykgLT4gTm9uZSIpfSwKLQl7IkNvcHlXaW5kb3dUaXRsZUFzQ0ZTdHJpbmciLCAoUHlDRnVuY3Rpb24pV2luT2JqX0NvcHlXaW5kb3dUaXRsZUFzQ0ZTdHJpbmcsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENGU3RyaW5nUmVmIG91dFN0cmluZykiKX0sCi0JeyJTZXRXaW5kb3dQcm94eUZTU3BlYyIsIChQeUNGdW5jdGlvbilXaW5PYmpfU2V0V2luZG93UHJveHlGU1NwZWMsIDEsCi0JIFB5RG9jX1NUUigiKEZTU3BlYyBpbkZpbGUpIC0+IE5vbmUiKX0sCi0JeyJHZXRXaW5kb3dQcm94eUZTU3BlYyIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V2luZG93UHJveHlGU1NwZWMsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEZTU3BlYyBvdXRGaWxlKSIpfSwKLQl7IlNldFdpbmRvd1Byb3h5QWxpYXMiLCAoUHlDRnVuY3Rpb24pV2luT2JqX1NldFdpbmRvd1Byb3h5QWxpYXMsIDEsCi0JIFB5RG9jX1NUUigiKEFsaWFzSGFuZGxlIGluQWxpYXMpIC0+IE5vbmUiKX0sCi0JeyJHZXRXaW5kb3dQcm94eUFsaWFzIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9HZXRXaW5kb3dQcm94eUFsaWFzLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChBbGlhc0hhbmRsZSBhbGlhcykiKX0sCi0JeyJTZXRXaW5kb3dQcm94eUNyZWF0b3JBbmRUeXBlIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9TZXRXaW5kb3dQcm94eUNyZWF0b3JBbmRUeXBlLCAxLAotCSBQeURvY19TVFIoIihPU1R5cGUgZmlsZUNyZWF0b3IsIE9TVHlwZSBmaWxlVHlwZSwgU0ludDE2IHZSZWZOdW0pIC0+IE5vbmUiKX0sCi0JeyJHZXRXaW5kb3dQcm94eUljb24iLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldFdpbmRvd1Byb3h5SWNvbiwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoSWNvblJlZiBvdXRJY29uKSIpfSwKLQl7IlNldFdpbmRvd1Byb3h5SWNvbiIsIChQeUNGdW5jdGlvbilXaW5PYmpfU2V0V2luZG93UHJveHlJY29uLCAxLAotCSBQeURvY19TVFIoIihJY29uUmVmIGljb24pIC0+IE5vbmUiKX0sCi0JeyJSZW1vdmVXaW5kb3dQcm94eSIsIChQeUNGdW5jdGlvbilXaW5PYmpfUmVtb3ZlV2luZG93UHJveHksIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkJlZ2luV2luZG93UHJveHlEcmFnIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9CZWdpbldpbmRvd1Byb3h5RHJhZywgMSwKLQkgUHlEb2NfU1RSKCIoUmduSGFuZGxlIG91dERyYWdPdXRsaW5lUmduKSAtPiAoRHJhZ1JlZmVyZW5jZSBvdXROZXdEcmFnKSIpfSwKLQl7IkVuZFdpbmRvd1Byb3h5RHJhZyIsIChQeUNGdW5jdGlvbilXaW5PYmpfRW5kV2luZG93UHJveHlEcmFnLCAxLAotCSBQeURvY19TVFIoIihEcmFnUmVmZXJlbmNlIHRoZURyYWcpIC0+IE5vbmUiKX0sCi0JeyJUcmFja1dpbmRvd1Byb3h5RnJvbUV4aXN0aW5nRHJhZyIsIChQeUNGdW5jdGlvbilXaW5PYmpfVHJhY2tXaW5kb3dQcm94eUZyb21FeGlzdGluZ0RyYWcsIDEsCi0JIFB5RG9jX1NUUigiKFBvaW50IHN0YXJ0UHQsIERyYWdSZWZlcmVuY2UgZHJhZywgUmduSGFuZGxlIGluRHJhZ091dGxpbmVSZ24pIC0+IE5vbmUiKX0sCi0JeyJUcmFja1dpbmRvd1Byb3h5RHJhZyIsIChQeUNGdW5jdGlvbilXaW5PYmpfVHJhY2tXaW5kb3dQcm94eURyYWcsIDEsCi0JIFB5RG9jX1NUUigiKFBvaW50IHN0YXJ0UHQpIC0+IE5vbmUiKX0sCi0JeyJJc1dpbmRvd01vZGlmaWVkIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9Jc1dpbmRvd01vZGlmaWVkLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJTZXRXaW5kb3dNb2RpZmllZCIsIChQeUNGdW5jdGlvbilXaW5PYmpfU2V0V2luZG93TW9kaWZpZWQsIDEsCi0JIFB5RG9jX1NUUigiKEJvb2xlYW4gbW9kaWZpZWQpIC0+IE5vbmUiKX0sCi0JeyJJc1dpbmRvd1BhdGhTZWxlY3RDbGljayIsIChQeUNGdW5jdGlvbilXaW5PYmpfSXNXaW5kb3dQYXRoU2VsZWN0Q2xpY2ssIDEsCi0JIFB5RG9jX1NUUigiKEV2ZW50UmVjb3JkIGV2ZW50KSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiV2luZG93UGF0aFNlbGVjdCIsIChQeUNGdW5jdGlvbilXaW5PYmpfV2luZG93UGF0aFNlbGVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoTWVudUhhbmRsZSBtZW51KSAtPiAoU0ludDMyIG91dE1lbnVSZXN1bHQpIil9LAotCXsiSGlsaXRlV2luZG93RnJhbWVGb3JEcmFnIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9IaWxpdGVXaW5kb3dGcmFtZUZvckRyYWcsIDEsCi0JIFB5RG9jX1NUUigiKEJvb2xlYW4gaGlsaXRlZCkgLT4gTm9uZSIpfSwKLQl7IlRyYW5zaXRpb25XaW5kb3ciLCAoUHlDRnVuY3Rpb24pV2luT2JqX1RyYW5zaXRpb25XaW5kb3csIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1RyYW5zaXRpb25FZmZlY3QgaW5FZmZlY3QsIFdpbmRvd1RyYW5zaXRpb25BY3Rpb24gaW5BY3Rpb24sIFJlY3QgaW5SZWN0KSAtPiBOb25lIil9LAotCXsiVHJhbnNpdGlvbldpbmRvd0FuZFBhcmVudCIsIChQeUNGdW5jdGlvbilXaW5PYmpfVHJhbnNpdGlvbldpbmRvd0FuZFBhcmVudCwgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluUGFyZW50V2luZG93LCBXaW5kb3dUcmFuc2l0aW9uRWZmZWN0IGluRWZmZWN0LCBXaW5kb3dUcmFuc2l0aW9uQWN0aW9uIGluQWN0aW9uLCBSZWN0IGluUmVjdCkgLT4gTm9uZSIpfSwKLQl7Ik1hY01vdmVXaW5kb3ciLCAoUHlDRnVuY3Rpb24pV2luT2JqX01hY01vdmVXaW5kb3csIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGhHbG9iYWwsIHNob3J0IHZHbG9iYWwsIEJvb2xlYW4gZnJvbnQpIC0+IE5vbmUiKX0sCi0JeyJTaXplV2luZG93IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9TaXplV2luZG93LCAxLAotCSBQeURvY19TVFIoIihzaG9ydCB3LCBzaG9ydCBoLCBCb29sZWFuIGZVcGRhdGUpIC0+IE5vbmUiKX0sCi0JeyJHcm93V2luZG93IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9Hcm93V2luZG93LCAxLAotCSBQeURvY19TVFIoIihQb2ludCBzdGFydFB0LCBSZWN0IGJCb3gpIC0+IChsb25nIF9ydikiKX0sCi0JeyJEcmFnV2luZG93IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9EcmFnV2luZG93LCAxLAotCSBQeURvY19TVFIoIihQb2ludCBzdGFydFB0LCBSZWN0IGJvdW5kc1JlY3QpIC0+IE5vbmUiKX0sCi0JeyJab29tV2luZG93IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9ab29tV2luZG93LCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQYXJ0Q29kZSBwYXJ0Q29kZSwgQm9vbGVhbiBmcm9udCkgLT4gTm9uZSIpfSwKLQl7IklzV2luZG93Q29sbGFwc2FibGUiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0lzV2luZG93Q29sbGFwc2FibGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IklzV2luZG93Q29sbGFwc2VkIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9Jc1dpbmRvd0NvbGxhcHNlZCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiQ29sbGFwc2VXaW5kb3ciLCAoUHlDRnVuY3Rpb24pV2luT2JqX0NvbGxhcHNlV2luZG93LCAxLAotCSBQeURvY19TVFIoIihCb29sZWFuIGNvbGxhcHNlKSAtPiBOb25lIil9LAotCXsiR2V0V2luZG93Qm91bmRzIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9HZXRXaW5kb3dCb3VuZHMsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1JlZ2lvbkNvZGUgcmVnaW9uQ29kZSkgLT4gKFJlY3QgZ2xvYmFsQm91bmRzKSIpfSwKLQl7IlJlc2l6ZVdpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5PYmpfUmVzaXplV2luZG93LCAxLAotCSBQeURvY19TVFIoIihQb2ludCBpblN0YXJ0UG9pbnQsIFJlY3QgaW5TaXplQ29uc3RyYWludHMpIC0+IChCb29sZWFuIF9ydiwgUmVjdCBvdXROZXdDb250ZW50UmVjdCkiKX0sCi0JeyJTZXRXaW5kb3dCb3VuZHMiLCAoUHlDRnVuY3Rpb24pV2luT2JqX1NldFdpbmRvd0JvdW5kcywgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UmVnaW9uQ29kZSByZWdpb25Db2RlLCBSZWN0IGdsb2JhbEJvdW5kcykgLT4gTm9uZSIpfSwKLQl7IlJlcG9zaXRpb25XaW5kb3ciLCAoUHlDRnVuY3Rpb24pV2luT2JqX1JlcG9zaXRpb25XaW5kb3csIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBwYXJlbnRXaW5kb3csIFdpbmRvd1Bvc2l0aW9uTWV0aG9kIG1ldGhvZCkgLT4gTm9uZSIpfSwKLQl7Ik1vdmVXaW5kb3dTdHJ1Y3R1cmUiLCAoUHlDRnVuY3Rpb24pV2luT2JqX01vdmVXaW5kb3dTdHJ1Y3R1cmUsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGhHbG9iYWwsIHNob3J0IHZHbG9iYWwpIC0+IE5vbmUiKX0sCi0JeyJJc1dpbmRvd0luU3RhbmRhcmRTdGF0ZSIsIChQeUNGdW5jdGlvbilXaW5PYmpfSXNXaW5kb3dJblN0YW5kYXJkU3RhdGUsIDEsCi0JIFB5RG9jX1NUUigiKFBvaW50IGluSWRlYWxTaXplKSAtPiAoQm9vbGVhbiBfcnYsIFJlY3Qgb3V0SWRlYWxTdGFuZGFyZFN0YXRlKSIpfSwKLQl7Ilpvb21XaW5kb3dJZGVhbCIsIChQeUNGdW5jdGlvbilXaW5PYmpfWm9vbVdpbmRvd0lkZWFsLCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQYXJ0Q29kZSBpblBhcnRDb2RlKSAtPiAoUG9pbnQgaW9JZGVhbFNpemUpIil9LAotCXsiR2V0V2luZG93SWRlYWxVc2VyU3RhdGUiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldFdpbmRvd0lkZWFsVXNlclN0YXRlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChSZWN0IG91dFVzZXJTdGF0ZSkiKX0sCi0JeyJTZXRXaW5kb3dJZGVhbFVzZXJTdGF0ZSIsIChQeUNGdW5jdGlvbilXaW5PYmpfU2V0V2luZG93SWRlYWxVc2VyU3RhdGUsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgaW5Vc2VyU3RhdGUpIC0+IE5vbmUiKX0sCi0JeyJHZXRXaW5kb3dHcmVhdGVzdEFyZWFEZXZpY2UiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldFdpbmRvd0dyZWF0ZXN0QXJlYURldmljZSwgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UmVnaW9uQ29kZSBpblJlZ2lvbikgLT4gKEdESGFuZGxlIG91dEdyZWF0ZXN0RGV2aWNlLCBSZWN0IG91dEdyZWF0ZXN0RGV2aWNlUmVjdCkiKX0sCi0JeyJDb25zdHJhaW5XaW5kb3dUb1NjcmVlbiIsIChQeUNGdW5jdGlvbilXaW5PYmpfQ29uc3RyYWluV2luZG93VG9TY3JlZW4sIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1JlZ2lvbkNvZGUgaW5SZWdpb25Db2RlLCBXaW5kb3dDb25zdHJhaW5PcHRpb25zIGluT3B0aW9ucywgUmVjdCBpblNjcmVlblJlY3QpIC0+IChSZWN0IG91dFN0cnVjdHVyZSkiKX0sCi0JeyJIaWRlV2luZG93IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9IaWRlV2luZG93LCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJNYWNTaG93V2luZG93IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9NYWNTaG93V2luZG93LCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJTaG93SGlkZSIsIChQeUNGdW5jdGlvbilXaW5PYmpfU2hvd0hpZGUsIDEsCi0JIFB5RG9jX1NUUigiKEJvb2xlYW4gc2hvd0ZsYWcpIC0+IE5vbmUiKX0sCi0JeyJNYWNJc1dpbmRvd1Zpc2libGUiLCAoUHlDRnVuY3Rpb24pV2luT2JqX01hY0lzV2luZG93VmlzaWJsZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiU2hvd1NoZWV0V2luZG93IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9TaG93U2hlZXRXaW5kb3csIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBpblBhcmVudFdpbmRvdykgLT4gTm9uZSIpfSwKLQl7IkhpZGVTaGVldFdpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5PYmpfSGlkZVNoZWV0V2luZG93LCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJHZXRTaGVldFdpbmRvd1BhcmVudCIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0U2hlZXRXaW5kb3dQYXJlbnQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFdpbmRvd1B0ciBvdXRQYXJlbnRXaW5kb3cpIil9LAotCXsiR2V0V2luZG93UHJvcGVydHlBdHRyaWJ1dGVzIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9HZXRXaW5kb3dQcm9wZXJ0eUF0dHJpYnV0ZXMsIDEsCi0JIFB5RG9jX1NUUigiKE9TVHlwZSBwcm9wZXJ0eUNyZWF0b3IsIE9TVHlwZSBwcm9wZXJ0eVRhZykgLT4gKFVJbnQzMiBhdHRyaWJ1dGVzKSIpfSwKLQl7IkNoYW5nZVdpbmRvd1Byb3BlcnR5QXR0cmlidXRlcyIsIChQeUNGdW5jdGlvbilXaW5PYmpfQ2hhbmdlV2luZG93UHJvcGVydHlBdHRyaWJ1dGVzLCAxLAotCSBQeURvY19TVFIoIihPU1R5cGUgcHJvcGVydHlDcmVhdG9yLCBPU1R5cGUgcHJvcGVydHlUYWcsIFVJbnQzMiBhdHRyaWJ1dGVzVG9TZXQsIFVJbnQzMiBhdHRyaWJ1dGVzVG9DbGVhcikgLT4gTm9uZSIpfSwKLQl7IlRyYWNrQm94IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9UcmFja0JveCwgMSwKLQkgUHlEb2NfU1RSKCIoUG9pbnQgdGhlUHQsIFdpbmRvd1BhcnRDb2RlIHBhcnRDb2RlKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiVHJhY2tHb0F3YXkiLCAoUHlDRnVuY3Rpb24pV2luT2JqX1RyYWNrR29Bd2F5LCAxLAotCSBQeURvY19TVFIoIihQb2ludCB0aGVQdCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IkdldFdpbmRvd1BvcnQiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldFdpbmRvd1BvcnQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENHcmFmUHRyIF9ydikiKX0sCi0JeyJHZXRXaW5kb3dTdHJ1Y3R1cmVQb3J0IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9HZXRXaW5kb3dTdHJ1Y3R1cmVQb3J0LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDR3JhZlB0ciBfcnYpIil9LAotCXsiR2V0V2luZG93S2luZCIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V2luZG93S2luZCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgX3J2KSIpfSwKLQl7IklzV2luZG93SGlsaXRlZCIsIChQeUNGdW5jdGlvbilXaW5PYmpfSXNXaW5kb3dIaWxpdGVkLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJJc1dpbmRvd1VwZGF0ZVBlbmRpbmciLCAoUHlDRnVuY3Rpb24pV2luT2JqX0lzV2luZG93VXBkYXRlUGVuZGluZywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiTWFjR2V0TmV4dFdpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5PYmpfTWFjR2V0TmV4dFdpbmRvdywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoV2luZG93UHRyIF9ydikiKX0sCi0JeyJHZXRXaW5kb3dTdGFuZGFyZFN0YXRlIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9HZXRXaW5kb3dTdGFuZGFyZFN0YXRlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChSZWN0IHJlY3QpIil9LAotCXsiR2V0V2luZG93VXNlclN0YXRlIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9HZXRXaW5kb3dVc2VyU3RhdGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFJlY3QgcmVjdCkiKX0sCi0JeyJTZXRXaW5kb3dLaW5kIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9TZXRXaW5kb3dLaW5kLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBraW5kKSAtPiBOb25lIil9LAotCXsiU2V0V2luZG93U3RhbmRhcmRTdGF0ZSIsIChQeUNGdW5jdGlvbilXaW5PYmpfU2V0V2luZG93U3RhbmRhcmRTdGF0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCByZWN0KSAtPiBOb25lIil9LAotCXsiU2V0V2luZG93VXNlclN0YXRlIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9TZXRXaW5kb3dVc2VyU3RhdGUsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgcmVjdCkgLT4gTm9uZSIpfSwKLQl7IlNldFBvcnRXaW5kb3dQb3J0IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9TZXRQb3J0V2luZG93UG9ydCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiR2V0V2luZG93UG9ydEJvdW5kcyIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V2luZG93UG9ydEJvdW5kcywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoUmVjdCBib3VuZHMpIil9LAotCXsiSXNXaW5kb3dWaXNpYmxlIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9Jc1dpbmRvd1Zpc2libGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IkdldFdpbmRvd1N0cnVjdHVyZVJnbiIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V2luZG93U3RydWN0dXJlUmduLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgcikgLT4gTm9uZSIpfSwKLQl7IkdldFdpbmRvd0NvbnRlbnRSZ24iLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldFdpbmRvd0NvbnRlbnRSZ24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByKSAtPiBOb25lIil9LAotCXsiR2V0V2luZG93VXBkYXRlUmduIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9HZXRXaW5kb3dVcGRhdGVSZ24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByKSAtPiBOb25lIil9LAotCXsiR2V0TmV4dFdpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0TmV4dFdpbmRvdywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoV2luZG93UHRyIF9ydikiKX0sCi0JeyJNb3ZlV2luZG93IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9Nb3ZlV2luZG93LCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBoR2xvYmFsLCBzaG9ydCB2R2xvYmFsLCBCb29sZWFuIGZyb250KSAtPiBOb25lIil9LAotCXsiU2hvd1dpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5PYmpfU2hvd1dpbmRvdywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiQXV0b0Rpc3Bvc2UiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0F1dG9EaXNwb3NlLCAxLAotCSBQeURvY19TVFIoIihpbnQpLT5pbnQuIEF1dG9tYXRpY2FsbHkgRGlzcG9zZUhhbmRsZSB0aGUgb2JqZWN0IG9uIFB5dGhvbiBvYmplY3QgY2xlYW51cCIpfSwKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7IkdldFdpbmRvd093bmVyQ291bnQiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldFdpbmRvd093bmVyQ291bnQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQzMiBvdXRDb3VudCkiKX0sCisgICAgeyJDbG9uZVdpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5PYmpfQ2xvbmVXaW5kb3csIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldFdpbmRvd1JldGFpbkNvdW50IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9HZXRXaW5kb3dSZXRhaW5Db3VudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoSXRlbUNvdW50IF9ydikiKX0sCisgICAgeyJSZXRhaW5XaW5kb3ciLCAoUHlDRnVuY3Rpb24pV2luT2JqX1JldGFpbldpbmRvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiUmVsZWFzZVdpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5PYmpfUmVsZWFzZVdpbmRvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiUmVzaGFwZUN1c3RvbVdpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5PYmpfUmVzaGFwZUN1c3RvbVdpbmRvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiR2V0V2luZG93V2lkZ2V0SGlsaXRlIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9HZXRXaW5kb3dXaWRnZXRIaWxpdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFdpbmRvd0RlZlBhcnRDb2RlIG91dEhpbGl0ZSkiKX0sCisgICAgeyJHZXRXaW5kb3dDbGFzcyIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V2luZG93Q2xhc3MsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFdpbmRvd0NsYXNzIG91dENsYXNzKSIpfSwKKyAgICB7IkdldFdpbmRvd0F0dHJpYnV0ZXMiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldFdpbmRvd0F0dHJpYnV0ZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFdpbmRvd0F0dHJpYnV0ZXMgb3V0QXR0cmlidXRlcykiKX0sCisgICAgeyJDaGFuZ2VXaW5kb3dBdHRyaWJ1dGVzIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9DaGFuZ2VXaW5kb3dBdHRyaWJ1dGVzLCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dBdHRyaWJ1dGVzIHNldFRoZXNlQXR0cmlidXRlcywgV2luZG93QXR0cmlidXRlcyBjbGVhclRoZXNlQXR0cmlidXRlcykgLT4gTm9uZSIpfSwKKyAgICB7IlNldFdpbmRvd0NsYXNzIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9TZXRXaW5kb3dDbGFzcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93Q2xhc3MgaW5XaW5kb3dDbGFzcykgLT4gTm9uZSIpfSwKKyAgICB7IlNldFdpbmRvd01vZGFsaXR5IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9TZXRXaW5kb3dNb2RhbGl0eSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93TW9kYWxpdHkgaW5Nb2RhbEtpbmQsIFdpbmRvd1B0ciBpblVuYXZhaWxhYmxlV2luZG93KSAtPiBOb25lIil9LAorICAgIHsiR2V0V2luZG93TW9kYWxpdHkiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldFdpbmRvd01vZGFsaXR5LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChXaW5kb3dNb2RhbGl0eSBvdXRNb2RhbEtpbmQsIFdpbmRvd1B0ciBvdXRVbmF2YWlsYWJsZVdpbmRvdykiKX0sCisgICAgeyJTZXRXaW5kb3dDb250ZW50Q29sb3IiLCAoUHlDRnVuY3Rpb24pV2luT2JqX1NldFdpbmRvd0NvbnRlbnRDb2xvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUkdCQ29sb3IgY29sb3IpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRXaW5kb3dDb250ZW50Q29sb3IiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldFdpbmRvd0NvbnRlbnRDb2xvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoUkdCQ29sb3IgY29sb3IpIil9LAorICAgIHsiR2V0V2luZG93Q29udGVudFBhdHRlcm4iLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldFdpbmRvd0NvbnRlbnRQYXR0ZXJuLCAxLAorICAgICBQeURvY19TVFIoIihQaXhQYXRIYW5kbGUgb3V0UGl4UGF0KSAtPiBOb25lIil9LAorICAgIHsiU2V0V2luZG93Q29udGVudFBhdHRlcm4iLCAoUHlDRnVuY3Rpb24pV2luT2JqX1NldFdpbmRvd0NvbnRlbnRQYXR0ZXJuLCAxLAorICAgICBQeURvY19TVFIoIihQaXhQYXRIYW5kbGUgcGl4UGF0KSAtPiBOb25lIil9LAorICAgIHsiU2Nyb2xsV2luZG93UmVjdCIsIChQeUNGdW5jdGlvbilXaW5PYmpfU2Nyb2xsV2luZG93UmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCBpblNjcm9sbFJlY3QsIFNJbnQxNiBpbkhQaXhlbHMsIFNJbnQxNiBpblZQaXhlbHMsIFNjcm9sbFdpbmRvd09wdGlvbnMgaW5PcHRpb25zLCBSZ25IYW5kbGUgb3V0RXhwb3NlZFJnbikgLT4gTm9uZSIpfSwKKyAgICB7IlNjcm9sbFdpbmRvd1JlZ2lvbiIsIChQeUNGdW5jdGlvbilXaW5PYmpfU2Nyb2xsV2luZG93UmVnaW9uLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgaW5TY3JvbGxSZ24sIFNJbnQxNiBpbkhQaXhlbHMsIFNJbnQxNiBpblZQaXhlbHMsIFNjcm9sbFdpbmRvd09wdGlvbnMgaW5PcHRpb25zLCBSZ25IYW5kbGUgb3V0RXhwb3NlZFJnbikgLT4gTm9uZSIpfSwKKyAgICB7IkNsaXBBYm92ZSIsIChQeUNGdW5jdGlvbilXaW5PYmpfQ2xpcEFib3ZlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJQYWludE9uZSIsIChQeUNGdW5jdGlvbilXaW5PYmpfUGFpbnRPbmUsIDEsCisgICAgIFB5RG9jX1NUUigiKFJnbkhhbmRsZSBjbG9iYmVyZWRSZ24pIC0+IE5vbmUiKX0sCisgICAgeyJQYWludEJlaGluZCIsIChQeUNGdW5jdGlvbilXaW5PYmpfUGFpbnRCZWhpbmQsIDEsCisgICAgIFB5RG9jX1NUUigiKFJnbkhhbmRsZSBjbG9iYmVyZWRSZ24pIC0+IE5vbmUiKX0sCisgICAgeyJDYWxjVmlzIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9DYWxjVmlzLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJDYWxjVmlzQmVoaW5kIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9DYWxjVmlzQmVoaW5kLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgY2xvYmJlcmVkUmduKSAtPiBOb25lIil9LAorICAgIHsiQnJpbmdUb0Zyb250IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9CcmluZ1RvRnJvbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IlNlbmRCZWhpbmQiLCAoUHlDRnVuY3Rpb24pV2luT2JqX1NlbmRCZWhpbmQsIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBiZWhpbmRXaW5kb3cpIC0+IE5vbmUiKX0sCisgICAgeyJTZWxlY3RXaW5kb3ciLCAoUHlDRnVuY3Rpb24pV2luT2JqX1NlbGVjdFdpbmRvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiR2V0TmV4dFdpbmRvd09mQ2xhc3MiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldE5leHRXaW5kb3dPZkNsYXNzLCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dDbGFzcyBpbldpbmRvd0NsYXNzLCBCb29sZWFuIG11c3RCZVZpc2libGUpIC0+IChXaW5kb3dQdHIgX3J2KSIpfSwKKyAgICB7IlNldFdpbmRvd0FsdGVybmF0ZVRpdGxlIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9TZXRXaW5kb3dBbHRlcm5hdGVUaXRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgaW5UaXRsZSkgLT4gTm9uZSIpfSwKKyAgICB7IkNvcHlXaW5kb3dBbHRlcm5hdGVUaXRsZSIsIChQeUNGdW5jdGlvbilXaW5PYmpfQ29weVdpbmRvd0FsdGVybmF0ZVRpdGxlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDRlN0cmluZ1JlZiBvdXRUaXRsZSkiKX0sCisgICAgeyJIaWxpdGVXaW5kb3ciLCAoUHlDRnVuY3Rpb24pV2luT2JqX0hpbGl0ZVdpbmRvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQm9vbGVhbiBmSGlsaXRlKSAtPiBOb25lIil9LAorICAgIHsiU2V0V1JlZkNvbiIsIChQeUNGdW5jdGlvbilXaW5PYmpfU2V0V1JlZkNvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIobG9uZyBkYXRhKSAtPiBOb25lIil9LAorICAgIHsiR2V0V1JlZkNvbiIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V1JlZkNvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAobG9uZyBfcnYpIil9LAorICAgIHsiU2V0V2luZG93UGljIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9TZXRXaW5kb3dQaWMsIDEsCisgICAgIFB5RG9jX1NUUigiKFBpY0hhbmRsZSBwaWMpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRXaW5kb3dQaWMiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldFdpbmRvd1BpYywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoUGljSGFuZGxlIF9ydikiKX0sCisgICAgeyJHZXRXVmFyaWFudCIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V1ZhcmlhbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKHNob3J0IF9ydikiKX0sCisgICAgeyJHZXRXaW5kb3dGZWF0dXJlcyIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V2luZG93RmVhdHVyZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQzMiBvdXRGZWF0dXJlcykiKX0sCisgICAgeyJHZXRXaW5kb3dSZWdpb24iLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldFdpbmRvd1JlZ2lvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UmVnaW9uQ29kZSBpblJlZ2lvbkNvZGUsIFJnbkhhbmRsZSBpb1dpblJnbikgLT4gTm9uZSIpfSwKKyAgICB7IkdldFdpbmRvd1N0cnVjdHVyZVdpZHRocyIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V2luZG93U3RydWN0dXJlV2lkdGhzLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChSZWN0IG91dFJlY3QpIil9LAorICAgIHsiQmVnaW5VcGRhdGUiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0JlZ2luVXBkYXRlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJFbmRVcGRhdGUiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0VuZFVwZGF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiSW52YWxXaW5kb3dSZ24iLCAoUHlDRnVuY3Rpb24pV2luT2JqX0ludmFsV2luZG93UmduLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgcmVnaW9uKSAtPiBOb25lIil9LAorICAgIHsiSW52YWxXaW5kb3dSZWN0IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9JbnZhbFdpbmRvd1JlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgYm91bmRzKSAtPiBOb25lIil9LAorICAgIHsiVmFsaWRXaW5kb3dSZ24iLCAoUHlDRnVuY3Rpb24pV2luT2JqX1ZhbGlkV2luZG93UmduLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgcmVnaW9uKSAtPiBOb25lIil9LAorICAgIHsiVmFsaWRXaW5kb3dSZWN0IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9WYWxpZFdpbmRvd1JlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgYm91bmRzKSAtPiBOb25lIil9LAorICAgIHsiRHJhd0dyb3dJY29uIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9EcmF3R3Jvd0ljb24sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IlNldFdUaXRsZSIsIChQeUNGdW5jdGlvbilXaW5PYmpfU2V0V1RpdGxlLCAxLAorICAgICBQeURvY19TVFIoIihTdHIyNTUgdGl0bGUpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRXVGl0bGUiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldFdUaXRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoU3RyMjU1IHRpdGxlKSIpfSwKKyAgICB7IlNldFdpbmRvd1RpdGxlV2l0aENGU3RyaW5nIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9TZXRXaW5kb3dUaXRsZVdpdGhDRlN0cmluZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgaW5TdHJpbmcpIC0+IE5vbmUiKX0sCisgICAgeyJDb3B5V2luZG93VGl0bGVBc0NGU3RyaW5nIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9Db3B5V2luZG93VGl0bGVBc0NGU3RyaW5nLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDRlN0cmluZ1JlZiBvdXRTdHJpbmcpIil9LAorICAgIHsiU2V0V2luZG93UHJveHlGU1NwZWMiLCAoUHlDRnVuY3Rpb24pV2luT2JqX1NldFdpbmRvd1Byb3h5RlNTcGVjLCAxLAorICAgICBQeURvY19TVFIoIihGU1NwZWMgaW5GaWxlKSAtPiBOb25lIil9LAorICAgIHsiR2V0V2luZG93UHJveHlGU1NwZWMiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldFdpbmRvd1Byb3h5RlNTcGVjLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChGU1NwZWMgb3V0RmlsZSkiKX0sCisgICAgeyJTZXRXaW5kb3dQcm94eUFsaWFzIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9TZXRXaW5kb3dQcm94eUFsaWFzLCAxLAorICAgICBQeURvY19TVFIoIihBbGlhc0hhbmRsZSBpbkFsaWFzKSAtPiBOb25lIil9LAorICAgIHsiR2V0V2luZG93UHJveHlBbGlhcyIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V2luZG93UHJveHlBbGlhcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQWxpYXNIYW5kbGUgYWxpYXMpIil9LAorICAgIHsiU2V0V2luZG93UHJveHlDcmVhdG9yQW5kVHlwZSIsIChQeUNGdW5jdGlvbilXaW5PYmpfU2V0V2luZG93UHJveHlDcmVhdG9yQW5kVHlwZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoT1NUeXBlIGZpbGVDcmVhdG9yLCBPU1R5cGUgZmlsZVR5cGUsIFNJbnQxNiB2UmVmTnVtKSAtPiBOb25lIil9LAorICAgIHsiR2V0V2luZG93UHJveHlJY29uIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9HZXRXaW5kb3dQcm94eUljb24sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEljb25SZWYgb3V0SWNvbikiKX0sCisgICAgeyJTZXRXaW5kb3dQcm94eUljb24iLCAoUHlDRnVuY3Rpb24pV2luT2JqX1NldFdpbmRvd1Byb3h5SWNvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSWNvblJlZiBpY29uKSAtPiBOb25lIil9LAorICAgIHsiUmVtb3ZlV2luZG93UHJveHkiLCAoUHlDRnVuY3Rpb24pV2luT2JqX1JlbW92ZVdpbmRvd1Byb3h5LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJCZWdpbldpbmRvd1Byb3h5RHJhZyIsIChQeUNGdW5jdGlvbilXaW5PYmpfQmVnaW5XaW5kb3dQcm94eURyYWcsIDEsCisgICAgIFB5RG9jX1NUUigiKFJnbkhhbmRsZSBvdXREcmFnT3V0bGluZVJnbikgLT4gKERyYWdSZWZlcmVuY2Ugb3V0TmV3RHJhZykiKX0sCisgICAgeyJFbmRXaW5kb3dQcm94eURyYWciLCAoUHlDRnVuY3Rpb24pV2luT2JqX0VuZFdpbmRvd1Byb3h5RHJhZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoRHJhZ1JlZmVyZW5jZSB0aGVEcmFnKSAtPiBOb25lIil9LAorICAgIHsiVHJhY2tXaW5kb3dQcm94eUZyb21FeGlzdGluZ0RyYWciLCAoUHlDRnVuY3Rpb24pV2luT2JqX1RyYWNrV2luZG93UHJveHlGcm9tRXhpc3RpbmdEcmFnLCAxLAorICAgICBQeURvY19TVFIoIihQb2ludCBzdGFydFB0LCBEcmFnUmVmZXJlbmNlIGRyYWcsIFJnbkhhbmRsZSBpbkRyYWdPdXRsaW5lUmduKSAtPiBOb25lIil9LAorICAgIHsiVHJhY2tXaW5kb3dQcm94eURyYWciLCAoUHlDRnVuY3Rpb24pV2luT2JqX1RyYWNrV2luZG93UHJveHlEcmFnLCAxLAorICAgICBQeURvY19TVFIoIihQb2ludCBzdGFydFB0KSAtPiBOb25lIil9LAorICAgIHsiSXNXaW5kb3dNb2RpZmllZCIsIChQeUNGdW5jdGlvbilXaW5PYmpfSXNXaW5kb3dNb2RpZmllZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiU2V0V2luZG93TW9kaWZpZWQiLCAoUHlDRnVuY3Rpb24pV2luT2JqX1NldFdpbmRvd01vZGlmaWVkLCAxLAorICAgICBQeURvY19TVFIoIihCb29sZWFuIG1vZGlmaWVkKSAtPiBOb25lIil9LAorICAgIHsiSXNXaW5kb3dQYXRoU2VsZWN0Q2xpY2siLCAoUHlDRnVuY3Rpb24pV2luT2JqX0lzV2luZG93UGF0aFNlbGVjdENsaWNrLCAxLAorICAgICBQeURvY19TVFIoIihFdmVudFJlY29yZCBldmVudCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IldpbmRvd1BhdGhTZWxlY3QiLCAoUHlDRnVuY3Rpb24pV2luT2JqX1dpbmRvd1BhdGhTZWxlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lbnVIYW5kbGUgbWVudSkgLT4gKFNJbnQzMiBvdXRNZW51UmVzdWx0KSIpfSwKKyAgICB7IkhpbGl0ZVdpbmRvd0ZyYW1lRm9yRHJhZyIsIChQeUNGdW5jdGlvbilXaW5PYmpfSGlsaXRlV2luZG93RnJhbWVGb3JEcmFnLCAxLAorICAgICBQeURvY19TVFIoIihCb29sZWFuIGhpbGl0ZWQpIC0+IE5vbmUiKX0sCisgICAgeyJUcmFuc2l0aW9uV2luZG93IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9UcmFuc2l0aW9uV2luZG93LCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dUcmFuc2l0aW9uRWZmZWN0IGluRWZmZWN0LCBXaW5kb3dUcmFuc2l0aW9uQWN0aW9uIGluQWN0aW9uLCBSZWN0IGluUmVjdCkgLT4gTm9uZSIpfSwKKyAgICB7IlRyYW5zaXRpb25XaW5kb3dBbmRQYXJlbnQiLCAoUHlDRnVuY3Rpb24pV2luT2JqX1RyYW5zaXRpb25XaW5kb3dBbmRQYXJlbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBpblBhcmVudFdpbmRvdywgV2luZG93VHJhbnNpdGlvbkVmZmVjdCBpbkVmZmVjdCwgV2luZG93VHJhbnNpdGlvbkFjdGlvbiBpbkFjdGlvbiwgUmVjdCBpblJlY3QpIC0+IE5vbmUiKX0sCisgICAgeyJNYWNNb3ZlV2luZG93IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9NYWNNb3ZlV2luZG93LCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBoR2xvYmFsLCBzaG9ydCB2R2xvYmFsLCBCb29sZWFuIGZyb250KSAtPiBOb25lIil9LAorICAgIHsiU2l6ZVdpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5PYmpfU2l6ZVdpbmRvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgdywgc2hvcnQgaCwgQm9vbGVhbiBmVXBkYXRlKSAtPiBOb25lIil9LAorICAgIHsiR3Jvd1dpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5PYmpfR3Jvd1dpbmRvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgc3RhcnRQdCwgUmVjdCBiQm94KSAtPiAobG9uZyBfcnYpIil9LAorICAgIHsiRHJhZ1dpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5PYmpfRHJhZ1dpbmRvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgc3RhcnRQdCwgUmVjdCBib3VuZHNSZWN0KSAtPiBOb25lIil9LAorICAgIHsiWm9vbVdpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5PYmpfWm9vbVdpbmRvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UGFydENvZGUgcGFydENvZGUsIEJvb2xlYW4gZnJvbnQpIC0+IE5vbmUiKX0sCisgICAgeyJJc1dpbmRvd0NvbGxhcHNhYmxlIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9Jc1dpbmRvd0NvbGxhcHNhYmxlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJJc1dpbmRvd0NvbGxhcHNlZCIsIChQeUNGdW5jdGlvbilXaW5PYmpfSXNXaW5kb3dDb2xsYXBzZWQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IkNvbGxhcHNlV2luZG93IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9Db2xsYXBzZVdpbmRvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQm9vbGVhbiBjb2xsYXBzZSkgLT4gTm9uZSIpfSwKKyAgICB7IkdldFdpbmRvd0JvdW5kcyIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V2luZG93Qm91bmRzLCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dSZWdpb25Db2RlIHJlZ2lvbkNvZGUpIC0+IChSZWN0IGdsb2JhbEJvdW5kcykiKX0sCisgICAgeyJSZXNpemVXaW5kb3ciLCAoUHlDRnVuY3Rpb24pV2luT2JqX1Jlc2l6ZVdpbmRvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgaW5TdGFydFBvaW50LCBSZWN0IGluU2l6ZUNvbnN0cmFpbnRzKSAtPiAoQm9vbGVhbiBfcnYsIFJlY3Qgb3V0TmV3Q29udGVudFJlY3QpIil9LAorICAgIHsiU2V0V2luZG93Qm91bmRzIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9TZXRXaW5kb3dCb3VuZHMsIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1JlZ2lvbkNvZGUgcmVnaW9uQ29kZSwgUmVjdCBnbG9iYWxCb3VuZHMpIC0+IE5vbmUiKX0sCisgICAgeyJSZXBvc2l0aW9uV2luZG93IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9SZXBvc2l0aW9uV2luZG93LCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgcGFyZW50V2luZG93LCBXaW5kb3dQb3NpdGlvbk1ldGhvZCBtZXRob2QpIC0+IE5vbmUiKX0sCisgICAgeyJNb3ZlV2luZG93U3RydWN0dXJlIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9Nb3ZlV2luZG93U3RydWN0dXJlLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBoR2xvYmFsLCBzaG9ydCB2R2xvYmFsKSAtPiBOb25lIil9LAorICAgIHsiSXNXaW5kb3dJblN0YW5kYXJkU3RhdGUiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0lzV2luZG93SW5TdGFuZGFyZFN0YXRlLCAxLAorICAgICBQeURvY19TVFIoIihQb2ludCBpbklkZWFsU2l6ZSkgLT4gKEJvb2xlYW4gX3J2LCBSZWN0IG91dElkZWFsU3RhbmRhcmRTdGF0ZSkiKX0sCisgICAgeyJab29tV2luZG93SWRlYWwiLCAoUHlDRnVuY3Rpb24pV2luT2JqX1pvb21XaW5kb3dJZGVhbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UGFydENvZGUgaW5QYXJ0Q29kZSkgLT4gKFBvaW50IGlvSWRlYWxTaXplKSIpfSwKKyAgICB7IkdldFdpbmRvd0lkZWFsVXNlclN0YXRlIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9HZXRXaW5kb3dJZGVhbFVzZXJTdGF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoUmVjdCBvdXRVc2VyU3RhdGUpIil9LAorICAgIHsiU2V0V2luZG93SWRlYWxVc2VyU3RhdGUiLCAoUHlDRnVuY3Rpb24pV2luT2JqX1NldFdpbmRvd0lkZWFsVXNlclN0YXRlLCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IGluVXNlclN0YXRlKSAtPiBOb25lIil9LAorICAgIHsiR2V0V2luZG93R3JlYXRlc3RBcmVhRGV2aWNlIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9HZXRXaW5kb3dHcmVhdGVzdEFyZWFEZXZpY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1JlZ2lvbkNvZGUgaW5SZWdpb24pIC0+IChHREhhbmRsZSBvdXRHcmVhdGVzdERldmljZSwgUmVjdCBvdXRHcmVhdGVzdERldmljZVJlY3QpIil9LAorICAgIHsiQ29uc3RyYWluV2luZG93VG9TY3JlZW4iLCAoUHlDRnVuY3Rpb24pV2luT2JqX0NvbnN0cmFpbldpbmRvd1RvU2NyZWVuLCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dSZWdpb25Db2RlIGluUmVnaW9uQ29kZSwgV2luZG93Q29uc3RyYWluT3B0aW9ucyBpbk9wdGlvbnMsIFJlY3QgaW5TY3JlZW5SZWN0KSAtPiAoUmVjdCBvdXRTdHJ1Y3R1cmUpIil9LAorICAgIHsiSGlkZVdpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5PYmpfSGlkZVdpbmRvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiTWFjU2hvd1dpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5PYmpfTWFjU2hvd1dpbmRvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiU2hvd0hpZGUiLCAoUHlDRnVuY3Rpb24pV2luT2JqX1Nob3dIaWRlLCAxLAorICAgICBQeURvY19TVFIoIihCb29sZWFuIHNob3dGbGFnKSAtPiBOb25lIil9LAorICAgIHsiTWFjSXNXaW5kb3dWaXNpYmxlIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9NYWNJc1dpbmRvd1Zpc2libGUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IlNob3dTaGVldFdpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5PYmpfU2hvd1NoZWV0V2luZG93LCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgaW5QYXJlbnRXaW5kb3cpIC0+IE5vbmUiKX0sCisgICAgeyJIaWRlU2hlZXRXaW5kb3ciLCAoUHlDRnVuY3Rpb24pV2luT2JqX0hpZGVTaGVldFdpbmRvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiR2V0U2hlZXRXaW5kb3dQYXJlbnQiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldFNoZWV0V2luZG93UGFyZW50LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChXaW5kb3dQdHIgb3V0UGFyZW50V2luZG93KSIpfSwKKyAgICB7IkdldFdpbmRvd1Byb3BlcnR5QXR0cmlidXRlcyIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V2luZG93UHJvcGVydHlBdHRyaWJ1dGVzLCAxLAorICAgICBQeURvY19TVFIoIihPU1R5cGUgcHJvcGVydHlDcmVhdG9yLCBPU1R5cGUgcHJvcGVydHlUYWcpIC0+IChVSW50MzIgYXR0cmlidXRlcykiKX0sCisgICAgeyJDaGFuZ2VXaW5kb3dQcm9wZXJ0eUF0dHJpYnV0ZXMiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0NoYW5nZVdpbmRvd1Byb3BlcnR5QXR0cmlidXRlcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoT1NUeXBlIHByb3BlcnR5Q3JlYXRvciwgT1NUeXBlIHByb3BlcnR5VGFnLCBVSW50MzIgYXR0cmlidXRlc1RvU2V0LCBVSW50MzIgYXR0cmlidXRlc1RvQ2xlYXIpIC0+IE5vbmUiKX0sCisgICAgeyJUcmFja0JveCIsIChQeUNGdW5jdGlvbilXaW5PYmpfVHJhY2tCb3gsIDEsCisgICAgIFB5RG9jX1NUUigiKFBvaW50IHRoZVB0LCBXaW5kb3dQYXJ0Q29kZSBwYXJ0Q29kZSkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IlRyYWNrR29Bd2F5IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9UcmFja0dvQXdheSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgdGhlUHQpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJHZXRXaW5kb3dQb3J0IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9HZXRXaW5kb3dQb3J0LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDR3JhZlB0ciBfcnYpIil9LAorICAgIHsiR2V0V2luZG93U3RydWN0dXJlUG9ydCIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V2luZG93U3RydWN0dXJlUG9ydCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ0dyYWZQdHIgX3J2KSIpfSwKKyAgICB7IkdldFdpbmRvd0tpbmQiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldFdpbmRvd0tpbmQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKHNob3J0IF9ydikiKX0sCisgICAgeyJJc1dpbmRvd0hpbGl0ZWQiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0lzV2luZG93SGlsaXRlZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiSXNXaW5kb3dVcGRhdGVQZW5kaW5nIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9Jc1dpbmRvd1VwZGF0ZVBlbmRpbmcsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7Ik1hY0dldE5leHRXaW5kb3ciLCAoUHlDRnVuY3Rpb24pV2luT2JqX01hY0dldE5leHRXaW5kb3csIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFdpbmRvd1B0ciBfcnYpIil9LAorICAgIHsiR2V0V2luZG93U3RhbmRhcmRTdGF0ZSIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V2luZG93U3RhbmRhcmRTdGF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoUmVjdCByZWN0KSIpfSwKKyAgICB7IkdldFdpbmRvd1VzZXJTdGF0ZSIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V2luZG93VXNlclN0YXRlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChSZWN0IHJlY3QpIil9LAorICAgIHsiU2V0V2luZG93S2luZCIsIChQeUNGdW5jdGlvbilXaW5PYmpfU2V0V2luZG93S2luZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQga2luZCkgLT4gTm9uZSIpfSwKKyAgICB7IlNldFdpbmRvd1N0YW5kYXJkU3RhdGUiLCAoUHlDRnVuY3Rpb24pV2luT2JqX1NldFdpbmRvd1N0YW5kYXJkU3RhdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgcmVjdCkgLT4gTm9uZSIpfSwKKyAgICB7IlNldFdpbmRvd1VzZXJTdGF0ZSIsIChQeUNGdW5jdGlvbilXaW5PYmpfU2V0V2luZG93VXNlclN0YXRlLCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IHJlY3QpIC0+IE5vbmUiKX0sCisgICAgeyJTZXRQb3J0V2luZG93UG9ydCIsIChQeUNGdW5jdGlvbilXaW5PYmpfU2V0UG9ydFdpbmRvd1BvcnQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldFdpbmRvd1BvcnRCb3VuZHMiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldFdpbmRvd1BvcnRCb3VuZHMsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFJlY3QgYm91bmRzKSIpfSwKKyAgICB7IklzV2luZG93VmlzaWJsZSIsIChQeUNGdW5jdGlvbilXaW5PYmpfSXNXaW5kb3dWaXNpYmxlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJHZXRXaW5kb3dTdHJ1Y3R1cmVSZ24iLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldFdpbmRvd1N0cnVjdHVyZVJnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHIpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRXaW5kb3dDb250ZW50UmduIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9HZXRXaW5kb3dDb250ZW50UmduLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgcikgLT4gTm9uZSIpfSwKKyAgICB7IkdldFdpbmRvd1VwZGF0ZVJnbiIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V2luZG93VXBkYXRlUmduLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgcikgLT4gTm9uZSIpfSwKKyAgICB7IkdldE5leHRXaW5kb3ciLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldE5leHRXaW5kb3csIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFdpbmRvd1B0ciBfcnYpIil9LAorICAgIHsiTW92ZVdpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5PYmpfTW92ZVdpbmRvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgaEdsb2JhbCwgc2hvcnQgdkdsb2JhbCwgQm9vbGVhbiBmcm9udCkgLT4gTm9uZSIpfSwKKyAgICB7IlNob3dXaW5kb3ciLCAoUHlDRnVuY3Rpb24pV2luT2JqX1Nob3dXaW5kb3csIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkF1dG9EaXNwb3NlIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9BdXRvRGlzcG9zZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoaW50KS0+aW50LiBBdXRvbWF0aWNhbGx5IERpc3Bvc2VIYW5kbGUgdGhlIG9iamVjdCBvbiBQeXRob24gb2JqZWN0IGNsZWFudXAiKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAjZGVmaW5lIFdpbk9ial9nZXRzZXRsaXN0IE5VTEwKQEAgLTI1NzEsMjEgKzI1NzEsMjEgQEAKIAogc3RhdGljIGludCBXaW5PYmpfY29tcGFyZShXaW5kb3dPYmplY3QgKnNlbGYsIFdpbmRvd09iamVjdCAqb3RoZXIpCiB7Ci0JaWYgKCBzZWxmLT5vYl9pdHNlbGYgPiBvdGhlci0+b2JfaXRzZWxmICkgcmV0dXJuIDE7Ci0JaWYgKCBzZWxmLT5vYl9pdHNlbGYgPCBvdGhlci0+b2JfaXRzZWxmICkgcmV0dXJuIC0xOwotCXJldHVybiAwOworICAgIGlmICggc2VsZi0+b2JfaXRzZWxmID4gb3RoZXItPm9iX2l0c2VsZiApIHJldHVybiAxOworICAgIGlmICggc2VsZi0+b2JfaXRzZWxmIDwgb3RoZXItPm9iX2l0c2VsZiApIHJldHVybiAtMTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICogV2luT2JqX3JlcHIoV2luZG93T2JqZWN0ICpzZWxmKQogewotCWNoYXIgYnVmWzEwMF07Ci0Jc3ByaW50ZihidWYsICI8V2luZG93IG9iamVjdCBhdCAweCU4Ljh4IGZvciAweCU4Ljh4PiIsICh1bnNpZ25lZClzZWxmLCAodW5zaWduZWQpc2VsZi0+b2JfaXRzZWxmKTsKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOworICAgIGNoYXIgYnVmWzEwMF07CisgICAgc3ByaW50ZihidWYsICI8V2luZG93IG9iamVjdCBhdCAweCU4Ljh4IGZvciAweCU4Ljh4PiIsICh1bnNpZ25lZClzZWxmLCAodW5zaWduZWQpc2VsZi0+b2JfaXRzZWxmKTsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOwogfQogCiBzdGF0aWMgaW50IFdpbk9ial9oYXNoKFdpbmRvd09iamVjdCAqc2VsZikKIHsKLQlyZXR1cm4gKGludClzZWxmLT5vYl9pdHNlbGY7CisgICAgcmV0dXJuIChpbnQpc2VsZi0+b2JfaXRzZWxmOwogfQogI2RlZmluZSBXaW5PYmpfdHBfaW5pdCAwCiAKQEAgLTI1OTMsNjEgKzI1OTMsNjEgQEAKIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfdHBfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKl9hcmdzLCBQeU9iamVjdCAqX2t3ZHMpCiB7Ci0JUHlPYmplY3QgKl9zZWxmOwotCVdpbmRvd1B0ciBpdHNlbGY7Ci0JY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CisgICAgUHlPYmplY3QgKl9zZWxmOworICAgIFdpbmRvd1B0ciBpdHNlbGY7CisgICAgY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBXaW5PYmpfQ29udmVydCwgJml0c2VsZikpIHJldHVybiBOVUxMOwotCWlmICgoX3NlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JKChXaW5kb3dPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlyZXR1cm4gX3NlbGY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgV2luT2JqX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOworICAgICgoV2luZG93T2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgcmV0dXJuIF9zZWxmOwogfQogCiAjZGVmaW5lIFdpbk9ial90cF9mcmVlIFB5T2JqZWN0X0RlbAogCiAKIFB5VHlwZU9iamVjdCBXaW5kb3dfVHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKLQkwLCAvKm9iX3NpemUqLwotCSJfV2luLldpbmRvdyIsIC8qdHBfbmFtZSovCi0Jc2l6ZW9mKFdpbmRvd09iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KLQkwLCAvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpIFdpbk9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsIC8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLwotCShjbXBmdW5jKSBXaW5PYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpIFdpbk9ial9yZXByLCAvKnRwX3JlcHIqLwotCShQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KLQkoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLwotCShQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYykgV2luT2JqX2hhc2gsIC8qdHBfaGFzaCovCi0JMCwgLyp0cF9jYWxsKi8KLQkwLCAvKnRwX3N0ciovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLwotCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCi0JMCwgLyp0cF9hc19idWZmZXIqLwotCVB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCTAsIC8qdHBfZG9jKi8KLQkwLCAvKnRwX3RyYXZlcnNlKi8KLQkwLCAvKnRwX2NsZWFyKi8KLQkwLCAvKnRwX3JpY2hjb21wYXJlKi8KLQkwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLQkwLCAvKnRwX2l0ZXIqLwotCTAsIC8qdHBfaXRlcm5leHQqLwotCVdpbk9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCi0JMCwgLyp0cF9tZW1iZXJzKi8KLQlXaW5PYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLwotCTAsIC8qdHBfYmFzZSovCi0JMCwgLyp0cF9kaWN0Ki8KLQkwLCAvKnRwX2Rlc2NyX2dldCovCi0JMCwgLyp0cF9kZXNjcl9zZXQqLwotCTAsIC8qdHBfZGljdG9mZnNldCovCi0JV2luT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KLQlXaW5PYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCi0JV2luT2JqX3RwX25ldywgLyogdHBfbmV3ICovCi0JV2luT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAvKm9iX3NpemUqLworICAgICJfV2luLldpbmRvdyIsIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKFdpbmRvd09iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpIFdpbk9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgIDAsIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLworICAgIChzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLworICAgIChjbXBmdW5jKSBXaW5PYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpIFdpbk9ial9yZXByLCAvKnRwX3JlcHIqLworICAgIChQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIChQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLworICAgIChoYXNoZnVuYykgV2luT2JqX2hhc2gsIC8qdHBfaGFzaCovCisgICAgMCwgLyp0cF9jYWxsKi8KKyAgICAwLCAvKnRwX3N0ciovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLworICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCisgICAgMCwgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLworICAgIDAsIC8qdHBfZG9jKi8KKyAgICAwLCAvKnRwX3RyYXZlcnNlKi8KKyAgICAwLCAvKnRwX2NsZWFyKi8KKyAgICAwLCAvKnRwX3JpY2hjb21wYXJlKi8KKyAgICAwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KKyAgICAwLCAvKnRwX2l0ZXIqLworICAgIDAsIC8qdHBfaXRlcm5leHQqLworICAgIFdpbk9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCisgICAgMCwgLyp0cF9tZW1iZXJzKi8KKyAgICBXaW5PYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLworICAgIDAsIC8qdHBfYmFzZSovCisgICAgMCwgLyp0cF9kaWN0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX2dldCovCisgICAgMCwgLyp0cF9kZXNjcl9zZXQqLworICAgIDAsIC8qdHBfZGljdG9mZnNldCovCisgICAgV2luT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KKyAgICBXaW5PYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCisgICAgV2luT2JqX3RwX25ldywgLyogdHBfbmV3ICovCisgICAgV2luT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSBFbmQgb2JqZWN0IHR5cGUgV2luZG93IC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMjY1NSw1NTMgKzI2NTUsNTUzIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqV2luX0dldE5ld0NXaW5kb3coUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVdpbmRvd1B0ciBfcnY7Ci0Jc2hvcnQgd2luZG93SUQ7Ci0JV2luZG93UHRyIGJlaGluZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgV2luZG93UHRyIF9ydjsKKyAgICBzaG9ydCB3aW5kb3dJRDsKKyAgICBXaW5kb3dQdHIgYmVoaW5kOwogI2lmbmRlZiBHZXROZXdDV2luZG93Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0TmV3Q1dpbmRvdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TmV3Q1dpbmRvdyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmd2luZG93SUQsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmYmVoaW5kKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TmV3Q1dpbmRvdyh3aW5kb3dJRCwKLQkgICAgICAgICAgICAgICAgICAgICh2b2lkICopMCwKLQkgICAgICAgICAgICAgICAgICAgIGJlaGluZCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ3aW5kb3dJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZiZWhpbmQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXROZXdDV2luZG93KHdpbmRvd0lELAorICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikwLAorICAgICAgICAgICAgICAgICAgICAgICAgYmVoaW5kKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luX05ld1dpbmRvdyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JV2luZG93UHRyIF9ydjsKLQlSZWN0IGJvdW5kc1JlY3Q7Ci0JU3RyMjU1IHRpdGxlOwotCUJvb2xlYW4gdmlzaWJsZTsKLQlzaG9ydCB0aGVQcm9jOwotCVdpbmRvd1B0ciBiZWhpbmQ7Ci0JQm9vbGVhbiBnb0F3YXlGbGFnOwotCWxvbmcgcmVmQ29uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBXaW5kb3dQdHIgX3J2OworICAgIFJlY3QgYm91bmRzUmVjdDsKKyAgICBTdHIyNTUgdGl0bGU7CisgICAgQm9vbGVhbiB2aXNpYmxlOworICAgIHNob3J0IHRoZVByb2M7CisgICAgV2luZG93UHRyIGJlaGluZDsKKyAgICBCb29sZWFuIGdvQXdheUZsYWc7CisgICAgbG9uZyByZWZDb247CiAjaWZuZGVmIE5ld1dpbmRvdwotCVB5TWFjX1BSRUNIRUNLKE5ld1dpbmRvdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTmV3V2luZG93KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZiaE8mYmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCB0aXRsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZpc2libGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aGVQcm9jLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmJlaGluZCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmdvQXdheUZsYWcsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZWZDb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBOZXdXaW5kb3coKHZvaWQgKikwLAotCSAgICAgICAgICAgICAgICAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgdGl0bGUsCi0JICAgICAgICAgICAgICAgIHZpc2libGUsCi0JICAgICAgICAgICAgICAgIHRoZVByb2MsCi0JICAgICAgICAgICAgICAgIGJlaGluZCwKLQkgICAgICAgICAgICAgICAgZ29Bd2F5RmxhZywKLQkgICAgICAgICAgICAgICAgcmVmQ29uKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmJoTyZibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIHRpdGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdmlzaWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZVByb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmYmVoaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZ29Bd2F5RmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZkNvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE5ld1dpbmRvdygodm9pZCAqKTAsCisgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICB0aXRsZSwKKyAgICAgICAgICAgICAgICAgICAgdmlzaWJsZSwKKyAgICAgICAgICAgICAgICAgICAgdGhlUHJvYywKKyAgICAgICAgICAgICAgICAgICAgYmVoaW5kLAorICAgICAgICAgICAgICAgICAgICBnb0F3YXlGbGFnLAorICAgICAgICAgICAgICAgICAgICByZWZDb24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5fR2V0TmV3V2luZG93KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlXaW5kb3dQdHIgX3J2OwotCXNob3J0IHdpbmRvd0lEOwotCVdpbmRvd1B0ciBiZWhpbmQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFdpbmRvd1B0ciBfcnY7CisgICAgc2hvcnQgd2luZG93SUQ7CisgICAgV2luZG93UHRyIGJlaGluZDsKICNpZm5kZWYgR2V0TmV3V2luZG93Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0TmV3V2luZG93KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXROZXdXaW5kb3cpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJndpbmRvd0lELAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmJlaGluZCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldE5ld1dpbmRvdyh3aW5kb3dJRCwKLQkgICAgICAgICAgICAgICAgICAgKHZvaWQgKikwLAotCSAgICAgICAgICAgICAgICAgICBiZWhpbmQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgV2luT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmd2luZG93SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmYmVoaW5kKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TmV3V2luZG93KHdpbmRvd0lELAorICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKTAsCisgICAgICAgICAgICAgICAgICAgICAgIGJlaGluZCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbl9OZXdDV2luZG93KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlXaW5kb3dQdHIgX3J2OwotCVJlY3QgYm91bmRzUmVjdDsKLQlTdHIyNTUgdGl0bGU7Ci0JQm9vbGVhbiB2aXNpYmxlOwotCXNob3J0IHByb2NJRDsKLQlXaW5kb3dQdHIgYmVoaW5kOwotCUJvb2xlYW4gZ29Bd2F5RmxhZzsKLQlsb25nIHJlZkNvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgV2luZG93UHRyIF9ydjsKKyAgICBSZWN0IGJvdW5kc1JlY3Q7CisgICAgU3RyMjU1IHRpdGxlOworICAgIEJvb2xlYW4gdmlzaWJsZTsKKyAgICBzaG9ydCBwcm9jSUQ7CisgICAgV2luZG93UHRyIGJlaGluZDsKKyAgICBCb29sZWFuIGdvQXdheUZsYWc7CisgICAgbG9uZyByZWZDb247CiAjaWZuZGVmIE5ld0NXaW5kb3cKLQlQeU1hY19QUkVDSEVDSyhOZXdDV2luZG93KTsKKyAgICBQeU1hY19QUkVDSEVDSyhOZXdDV2luZG93KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZiaE8mYmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCB0aXRsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZpc2libGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZwcm9jSUQsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmYmVoaW5kLAotCSAgICAgICAgICAgICAgICAgICAgICAmZ29Bd2F5RmxhZywKLQkgICAgICAgICAgICAgICAgICAgICAgJnJlZkNvbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE5ld0NXaW5kb3coKHZvaWQgKikwLAotCSAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICB0aXRsZSwKLQkgICAgICAgICAgICAgICAgIHZpc2libGUsCi0JICAgICAgICAgICAgICAgICBwcm9jSUQsCi0JICAgICAgICAgICAgICAgICBiZWhpbmQsCi0JICAgICAgICAgICAgICAgICBnb0F3YXlGbGFnLAotCSAgICAgICAgICAgICAgICAgcmVmQ29uKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmJoTyZibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIHRpdGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdmlzaWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnByb2NJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZiZWhpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZnb0F3YXlGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVmQ29uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTmV3Q1dpbmRvdygodm9pZCAqKTAsCisgICAgICAgICAgICAgICAgICAgICAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgIHRpdGxlLAorICAgICAgICAgICAgICAgICAgICAgdmlzaWJsZSwKKyAgICAgICAgICAgICAgICAgICAgIHByb2NJRCwKKyAgICAgICAgICAgICAgICAgICAgIGJlaGluZCwKKyAgICAgICAgICAgICAgICAgICAgIGdvQXdheUZsYWcsCisgICAgICAgICAgICAgICAgICAgICByZWZDb24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5fQ3JlYXRlTmV3V2luZG93KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVdpbmRvd0NsYXNzIHdpbmRvd0NsYXNzOwotCVdpbmRvd0F0dHJpYnV0ZXMgYXR0cmlidXRlczsKLQlSZWN0IGNvbnRlbnRCb3VuZHM7Ci0JV2luZG93UHRyIG91dFdpbmRvdzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBXaW5kb3dDbGFzcyB3aW5kb3dDbGFzczsKKyAgICBXaW5kb3dBdHRyaWJ1dGVzIGF0dHJpYnV0ZXM7CisgICAgUmVjdCBjb250ZW50Qm91bmRzOworICAgIFdpbmRvd1B0ciBvdXRXaW5kb3c7CiAjaWZuZGVmIENyZWF0ZU5ld1dpbmRvdwotCVB5TWFjX1BSRUNIRUNLKENyZWF0ZU5ld1dpbmRvdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlTmV3V2luZG93KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmd2luZG93Q2xhc3MsCi0JICAgICAgICAgICAgICAgICAgICAgICZhdHRyaWJ1dGVzLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmY29udGVudEJvdW5kcykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDcmVhdGVOZXdXaW5kb3cod2luZG93Q2xhc3MsCi0JICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLAotCSAgICAgICAgICAgICAgICAgICAgICAgJmNvbnRlbnRCb3VuZHMsCi0JICAgICAgICAgICAgICAgICAgICAgICAmb3V0V2luZG93KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgV2luT2JqX05ldywgb3V0V2luZG93KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJndpbmRvd0NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmNvbnRlbnRCb3VuZHMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ3JlYXRlTmV3V2luZG93KHdpbmRvd0NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb250ZW50Qm91bmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFdpbmRvdyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9OZXcsIG91dFdpbmRvdyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luX0NyZWF0ZVdpbmRvd0Zyb21SZXNvdXJjZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlTSW50MTYgcmVzSUQ7Ci0JV2luZG93UHRyIG91dFdpbmRvdzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBTSW50MTYgcmVzSUQ7CisgICAgV2luZG93UHRyIG91dFdpbmRvdzsKICNpZm5kZWYgQ3JlYXRlV2luZG93RnJvbVJlc291cmNlCi0JUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlV2luZG93RnJvbVJlc291cmNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDcmVhdGVXaW5kb3dGcm9tUmVzb3VyY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZXNJRCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDcmVhdGVXaW5kb3dGcm9tUmVzb3VyY2UocmVzSUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0V2luZG93KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgV2luT2JqX05ldywgb3V0V2luZG93KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc0lEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENyZWF0ZVdpbmRvd0Zyb21SZXNvdXJjZShyZXNJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRXaW5kb3cpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfTmV3LCBvdXRXaW5kb3cpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbl9TaG93RmxvYXRpbmdXaW5kb3dzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOwogI2lmbmRlZiBTaG93RmxvYXRpbmdXaW5kb3dzCi0JUHlNYWNfUFJFQ0hFQ0soU2hvd0Zsb2F0aW5nV2luZG93cyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2hvd0Zsb2F0aW5nV2luZG93cyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNob3dGbG9hdGluZ1dpbmRvd3MoKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNob3dGbG9hdGluZ1dpbmRvd3MoKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5fSGlkZUZsb2F0aW5nV2luZG93cyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKICNpZm5kZWYgSGlkZUZsb2F0aW5nV2luZG93cwotCVB5TWFjX1BSRUNIRUNLKEhpZGVGbG9hdGluZ1dpbmRvd3MpOworICAgIFB5TWFjX1BSRUNIRUNLKEhpZGVGbG9hdGluZ1dpbmRvd3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBIaWRlRmxvYXRpbmdXaW5kb3dzKCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBIaWRlRmxvYXRpbmdXaW5kb3dzKCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luX0FyZUZsb2F0aW5nV2luZG93c1Zpc2libGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKICNpZm5kZWYgQXJlRmxvYXRpbmdXaW5kb3dzVmlzaWJsZQotCVB5TWFjX1BSRUNIRUNLKEFyZUZsb2F0aW5nV2luZG93c1Zpc2libGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEFyZUZsb2F0aW5nV2luZG93c1Zpc2libGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEFyZUZsb2F0aW5nV2luZG93c1Zpc2libGUoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQXJlRmxvYXRpbmdXaW5kb3dzVmlzaWJsZSgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbl9DaGVja1VwZGF0ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JRXZlbnRSZWNvcmQgdGhlRXZlbnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIEV2ZW50UmVjb3JkIHRoZUV2ZW50OwogI2lmbmRlZiBDaGVja1VwZGF0ZQotCVB5TWFjX1BSRUNIRUNLKENoZWNrVXBkYXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDaGVja1VwZGF0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ2hlY2tVcGRhdGUoJnRoZUV2ZW50KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRFdmVudFJlY29yZCwgJnRoZUV2ZW50KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ2hlY2tVcGRhdGUoJnRoZUV2ZW50KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRFdmVudFJlY29yZCwgJnRoZUV2ZW50KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5fTWFjRmluZFdpbmRvdyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JV2luZG93UGFydENvZGUgX3J2OwotCVBvaW50IHRoZVBvaW50OwotCVdpbmRvd1B0ciB3aW5kb3c7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFdpbmRvd1BhcnRDb2RlIF9ydjsKKyAgICBQb2ludCB0aGVQb2ludDsKKyAgICBXaW5kb3dQdHIgd2luZG93OwogI2lmbmRlZiBNYWNGaW5kV2luZG93Ci0JUHlNYWNfUFJFQ0hFQ0soTWFjRmluZFdpbmRvdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWFjRmluZFdpbmRvdyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmdGhlUG9pbnQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNYWNGaW5kV2luZG93KHRoZVBvaW50LAotCSAgICAgICAgICAgICAgICAgICAgJndpbmRvdyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImhPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9XaGljaFdpbmRvdywgd2luZG93KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmdGhlUG9pbnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNYWNGaW5kV2luZG93KHRoZVBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgJndpbmRvdyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImhPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9XaGljaFdpbmRvdywgd2luZG93KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5fRnJvbnRXaW5kb3coUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVdpbmRvd1B0ciBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFdpbmRvd1B0ciBfcnY7CiAjaWZuZGVmIEZyb250V2luZG93Ci0JUHlNYWNfUFJFQ0hFQ0soRnJvbnRXaW5kb3cpOworICAgIFB5TWFjX1BSRUNIRUNLKEZyb250V2luZG93KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBGcm9udFdpbmRvdygpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgV2luT2JqX1doaWNoV2luZG93LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBGcm9udFdpbmRvdygpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX1doaWNoV2luZG93LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbl9Gcm9udE5vbkZsb2F0aW5nV2luZG93KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlXaW5kb3dQdHIgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBXaW5kb3dQdHIgX3J2OwogI2lmbmRlZiBGcm9udE5vbkZsb2F0aW5nV2luZG93Ci0JUHlNYWNfUFJFQ0hFQ0soRnJvbnROb25GbG9hdGluZ1dpbmRvdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRnJvbnROb25GbG9hdGluZ1dpbmRvdyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRnJvbnROb25GbG9hdGluZ1dpbmRvdygpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgV2luT2JqX1doaWNoV2luZG93LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBGcm9udE5vbkZsb2F0aW5nV2luZG93KCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfV2hpY2hXaW5kb3csIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luX0dldEZyb250V2luZG93T2ZDbGFzcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JV2luZG93UHRyIF9ydjsKLQlXaW5kb3dDbGFzcyBpbldpbmRvd0NsYXNzOwotCUJvb2xlYW4gbXVzdEJlVmlzaWJsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgV2luZG93UHRyIF9ydjsKKyAgICBXaW5kb3dDbGFzcyBpbldpbmRvd0NsYXNzOworICAgIEJvb2xlYW4gbXVzdEJlVmlzaWJsZTsKICNpZm5kZWYgR2V0RnJvbnRXaW5kb3dPZkNsYXNzCi0JUHlNYWNfUFJFQ0hFQ0soR2V0RnJvbnRXaW5kb3dPZkNsYXNzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRGcm9udFdpbmRvd09mQ2xhc3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5XaW5kb3dDbGFzcywKLQkgICAgICAgICAgICAgICAgICAgICAgJm11c3RCZVZpc2libGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRGcm9udFdpbmRvd09mQ2xhc3MoaW5XaW5kb3dDbGFzcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVzdEJlVmlzaWJsZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluV2luZG93Q2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtdXN0QmVWaXNpYmxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0RnJvbnRXaW5kb3dPZkNsYXNzKGluV2luZG93Q2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11c3RCZVZpc2libGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5fRmluZFdpbmRvd09mQ2xhc3MoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JUG9pbnQgd2hlcmU7Ci0JV2luZG93Q2xhc3MgaW5XaW5kb3dDbGFzczsKLQlXaW5kb3dQdHIgb3V0V2luZG93OwotCVdpbmRvd1BhcnRDb2RlIG91dFdpbmRvd1BhcnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgUG9pbnQgd2hlcmU7CisgICAgV2luZG93Q2xhc3MgaW5XaW5kb3dDbGFzczsKKyAgICBXaW5kb3dQdHIgb3V0V2luZG93OworICAgIFdpbmRvd1BhcnRDb2RlIG91dFdpbmRvd1BhcnQ7CiAjaWZuZGVmIEZpbmRXaW5kb3dPZkNsYXNzCi0JUHlNYWNfUFJFQ0hFQ0soRmluZFdpbmRvd09mQ2xhc3MpOworICAgIFB5TWFjX1BSRUNIRUNLKEZpbmRXaW5kb3dPZkNsYXNzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmd2hlcmUsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbldpbmRvd0NsYXNzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEZpbmRXaW5kb3dPZkNsYXNzKCZ3aGVyZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgaW5XaW5kb3dDbGFzcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFdpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFdpbmRvd1BhcnQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgV2luT2JqX1doaWNoV2luZG93LCBvdXRXaW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgb3V0V2luZG93UGFydCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZ3aGVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluV2luZG93Q2xhc3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRmluZFdpbmRvd09mQ2xhc3MoJndoZXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbldpbmRvd0NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0V2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0V2luZG93UGFydCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfV2hpY2hXaW5kb3csIG91dFdpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRXaW5kb3dQYXJ0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5fQ3JlYXRlU3RhbmRhcmRXaW5kb3dNZW51KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCU9wdGlvbkJpdHMgaW5PcHRpb25zOwotCU1lbnVIYW5kbGUgb3V0TWVudTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBPcHRpb25CaXRzIGluT3B0aW9uczsKKyAgICBNZW51SGFuZGxlIG91dE1lbnU7CiAjaWZuZGVmIENyZWF0ZVN0YW5kYXJkV2luZG93TWVudQotCVB5TWFjX1BSRUNIRUNLKENyZWF0ZVN0YW5kYXJkV2luZG93TWVudSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlU3RhbmRhcmRXaW5kb3dNZW51KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5PcHRpb25zKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENyZWF0ZVN0YW5kYXJkV2luZG93TWVudShpbk9wdGlvbnMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0TWVudSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIE1lbnVPYmpfTmV3LCBvdXRNZW51KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluT3B0aW9ucykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDcmVhdGVTdGFuZGFyZFdpbmRvd01lbnUoaW5PcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dE1lbnUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBNZW51T2JqX05ldywgb3V0TWVudSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luX0NvbGxhcHNlQWxsV2luZG93cyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlCb29sZWFuIGNvbGxhcHNlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIEJvb2xlYW4gY29sbGFwc2U7CiAjaWZuZGVmIENvbGxhcHNlQWxsV2luZG93cwotCVB5TWFjX1BSRUNIRUNLKENvbGxhcHNlQWxsV2luZG93cyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ29sbGFwc2VBbGxXaW5kb3dzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmY29sbGFwc2UpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ29sbGFwc2VBbGxXaW5kb3dzKGNvbGxhcHNlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbGxhcHNlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENvbGxhcHNlQWxsV2luZG93cyhjb2xsYXBzZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luX0dldEF2YWlsYWJsZVdpbmRvd1Bvc2l0aW9uaW5nQm91bmRzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUdESGFuZGxlIGluRGV2aWNlOwotCVJlY3Qgb3V0QXZhaWxhYmxlUmVjdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBHREhhbmRsZSBpbkRldmljZTsKKyAgICBSZWN0IG91dEF2YWlsYWJsZVJlY3Q7CiAjaWZuZGVmIEdldEF2YWlsYWJsZVdpbmRvd1Bvc2l0aW9uaW5nQm91bmRzCi0JUHlNYWNfUFJFQ0hFQ0soR2V0QXZhaWxhYmxlV2luZG93UG9zaXRpb25pbmdCb3VuZHMpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldEF2YWlsYWJsZVdpbmRvd1Bvc2l0aW9uaW5nQm91bmRzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZpbkRldmljZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRBdmFpbGFibGVXaW5kb3dQb3NpdGlvbmluZ0JvdW5kcyhpbkRldmljZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEF2YWlsYWJsZVJlY3QpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZvdXRBdmFpbGFibGVSZWN0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaW5EZXZpY2UpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0QXZhaWxhYmxlV2luZG93UG9zaXRpb25pbmdCb3VuZHMoaW5EZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRBdmFpbGFibGVSZWN0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmb3V0QXZhaWxhYmxlUmVjdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luX0Rpc2FibGVTY3JlZW5VcGRhdGVzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOwogI2lmbmRlZiBEaXNhYmxlU2NyZWVuVXBkYXRlcwotCVB5TWFjX1BSRUNIRUNLKERpc2FibGVTY3JlZW5VcGRhdGVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEaXNhYmxlU2NyZWVuVXBkYXRlcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IERpc2FibGVTY3JlZW5VcGRhdGVzKCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBEaXNhYmxlU2NyZWVuVXBkYXRlcygpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbl9FbmFibGVTY3JlZW5VcGRhdGVzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOwogI2lmbmRlZiBFbmFibGVTY3JlZW5VcGRhdGVzCi0JUHlNYWNfUFJFQ0hFQ0soRW5hYmxlU2NyZWVuVXBkYXRlcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRW5hYmxlU2NyZWVuVXBkYXRlcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEVuYWJsZVNjcmVlblVwZGF0ZXMoKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEVuYWJsZVNjcmVlblVwZGF0ZXMoKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5fUGluUmVjdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBfcnY7Ci0JUmVjdCB0aGVSZWN0OwotCVBvaW50IHRoZVB0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBsb25nIF9ydjsKKyAgICBSZWN0IHRoZVJlY3Q7CisgICAgUG9pbnQgdGhlUHQ7CiAjaWZuZGVmIFBpblJlY3QKLQlQeU1hY19QUkVDSEVDSyhQaW5SZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhQaW5SZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmdGhlUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZ0aGVQdCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFBpblJlY3QoJnRoZVJlY3QsCi0JICAgICAgICAgICAgICB0aGVQdCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZ0aGVSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnRoZVB0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gUGluUmVjdCgmdGhlUmVjdCwKKyAgICAgICAgICAgICAgICAgIHRoZVB0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5fR2V0R3JheVJnbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIF9ydjsKICNpZm5kZWYgR2V0R3JheVJnbgotCVB5TWFjX1BSRUNIRUNLKEdldEdyYXlSZ24pOworICAgIFB5TWFjX1BSRUNIRUNLKEdldEdyYXlSZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldEdyYXlSZ24oKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldEdyYXlSZ24oKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luX0dldFdpbmRvd0Zyb21Qb3J0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlXaW5kb3dQdHIgX3J2OwotCUNHcmFmUHRyIHBvcnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFdpbmRvd1B0ciBfcnY7CisgICAgQ0dyYWZQdHIgcG9ydDsKICNpZm5kZWYgR2V0V2luZG93RnJvbVBvcnQKLQlQeU1hY19QUkVDSEVDSyhHZXRXaW5kb3dGcm9tUG9ydCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0V2luZG93RnJvbVBvcnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX0NvbnZlcnQsICZwb3J0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0V2luZG93RnJvbVBvcnQocG9ydCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhZk9ial9Db252ZXJ0LCAmcG9ydCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFdpbmRvd0Zyb21Qb3J0KHBvcnQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5fV2hpY2hXaW5kb3coUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKIAotCWxvbmcgcHRyOworICAgIGxvbmcgcHRyOwogCi0JaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImkiLCAmcHRyKSApCi0JICAgICAgICByZXR1cm4gTlVMTDsKLQlfcmVzID0gV2luT2JqX1doaWNoV2luZG93KChXaW5kb3dQdHIpcHRyKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaSIsICZwdHIpICkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3JlcyA9IFdpbk9ial9XaGljaFdpbmRvdygoV2luZG93UHRyKXB0cik7CisgICAgcmV0dXJuIF9yZXM7CiAKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5fRmluZFdpbmRvdyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgX3J2OwotCVBvaW50IHRoZVBvaW50OwotCVdpbmRvd1B0ciB0aGVXaW5kb3c7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IF9ydjsKKyAgICBQb2ludCB0aGVQb2ludDsKKyAgICBXaW5kb3dQdHIgdGhlV2luZG93OwogI2lmbmRlZiBGaW5kV2luZG93Ci0JUHlNYWNfUFJFQ0hFQ0soRmluZFdpbmRvdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRmluZFdpbmRvdyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmdGhlUG9pbnQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBGaW5kV2luZG93KHRoZVBvaW50LAotCSAgICAgICAgICAgICAgICAgJnRoZVdpbmRvdyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImhPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9XaGljaFdpbmRvdywgdGhlV2luZG93KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmdGhlUG9pbnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBGaW5kV2luZG93KHRoZVBvaW50LAorICAgICAgICAgICAgICAgICAgICAgJnRoZVdpbmRvdyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImhPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9XaGljaFdpbmRvdywgdGhlV2luZG93KTsKKyAgICByZXR1cm4gX3JlczsKIH0KICNlbmRpZiAvKiBfX0xQNjRfXyAqLwogCiBzdGF0aWMgUHlNZXRob2REZWYgV2luX21ldGhvZHNbXSA9IHsKICNpZm5kZWYgX19MUDY0X18KLQl7IkdldE5ld0NXaW5kb3ciLCAoUHlDRnVuY3Rpb24pV2luX0dldE5ld0NXaW5kb3csIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHdpbmRvd0lELCBXaW5kb3dQdHIgYmVoaW5kKSAtPiAoV2luZG93UHRyIF9ydikiKX0sCi0JeyJOZXdXaW5kb3ciLCAoUHlDRnVuY3Rpb24pV2luX05ld1dpbmRvdywgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCBib3VuZHNSZWN0LCBTdHIyNTUgdGl0bGUsIEJvb2xlYW4gdmlzaWJsZSwgc2hvcnQgdGhlUHJvYywgV2luZG93UHRyIGJlaGluZCwgQm9vbGVhbiBnb0F3YXlGbGFnLCBsb25nIHJlZkNvbikgLT4gKFdpbmRvd1B0ciBfcnYpIil9LAotCXsiR2V0TmV3V2luZG93IiwgKFB5Q0Z1bmN0aW9uKVdpbl9HZXROZXdXaW5kb3csIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHdpbmRvd0lELCBXaW5kb3dQdHIgYmVoaW5kKSAtPiAoV2luZG93UHRyIF9ydikiKX0sCi0JeyJOZXdDV2luZG93IiwgKFB5Q0Z1bmN0aW9uKVdpbl9OZXdDV2luZG93LCAxLAotCSBQeURvY19TVFIoIihSZWN0IGJvdW5kc1JlY3QsIFN0cjI1NSB0aXRsZSwgQm9vbGVhbiB2aXNpYmxlLCBzaG9ydCBwcm9jSUQsIFdpbmRvd1B0ciBiZWhpbmQsIEJvb2xlYW4gZ29Bd2F5RmxhZywgbG9uZyByZWZDb24pIC0+IChXaW5kb3dQdHIgX3J2KSIpfSwKLQl7IkNyZWF0ZU5ld1dpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5fQ3JlYXRlTmV3V2luZG93LCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dDbGFzcyB3aW5kb3dDbGFzcywgV2luZG93QXR0cmlidXRlcyBhdHRyaWJ1dGVzLCBSZWN0IGNvbnRlbnRCb3VuZHMpIC0+IChXaW5kb3dQdHIgb3V0V2luZG93KSIpfSwKLQl7IkNyZWF0ZVdpbmRvd0Zyb21SZXNvdXJjZSIsIChQeUNGdW5jdGlvbilXaW5fQ3JlYXRlV2luZG93RnJvbVJlc291cmNlLCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgcmVzSUQpIC0+IChXaW5kb3dQdHIgb3V0V2luZG93KSIpfSwKLQl7IlNob3dGbG9hdGluZ1dpbmRvd3MiLCAoUHlDRnVuY3Rpb24pV2luX1Nob3dGbG9hdGluZ1dpbmRvd3MsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkhpZGVGbG9hdGluZ1dpbmRvd3MiLCAoUHlDRnVuY3Rpb24pV2luX0hpZGVGbG9hdGluZ1dpbmRvd3MsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkFyZUZsb2F0aW5nV2luZG93c1Zpc2libGUiLCAoUHlDRnVuY3Rpb24pV2luX0FyZUZsb2F0aW5nV2luZG93c1Zpc2libGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IkNoZWNrVXBkYXRlIiwgKFB5Q0Z1bmN0aW9uKVdpbl9DaGVja1VwZGF0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYsIEV2ZW50UmVjb3JkIHRoZUV2ZW50KSIpfSwKLQl7Ik1hY0ZpbmRXaW5kb3ciLCAoUHlDRnVuY3Rpb24pV2luX01hY0ZpbmRXaW5kb3csIDEsCi0JIFB5RG9jX1NUUigiKFBvaW50IHRoZVBvaW50KSAtPiAoV2luZG93UGFydENvZGUgX3J2LCBXaW5kb3dQdHIgd2luZG93KSIpfSwKLQl7IkZyb250V2luZG93IiwgKFB5Q0Z1bmN0aW9uKVdpbl9Gcm9udFdpbmRvdywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoV2luZG93UHRyIF9ydikiKX0sCi0JeyJGcm9udE5vbkZsb2F0aW5nV2luZG93IiwgKFB5Q0Z1bmN0aW9uKVdpbl9Gcm9udE5vbkZsb2F0aW5nV2luZG93LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChXaW5kb3dQdHIgX3J2KSIpfSwKLQl7IkdldEZyb250V2luZG93T2ZDbGFzcyIsIChQeUNGdW5jdGlvbilXaW5fR2V0RnJvbnRXaW5kb3dPZkNsYXNzLCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dDbGFzcyBpbldpbmRvd0NsYXNzLCBCb29sZWFuIG11c3RCZVZpc2libGUpIC0+IChXaW5kb3dQdHIgX3J2KSIpfSwKLQl7IkZpbmRXaW5kb3dPZkNsYXNzIiwgKFB5Q0Z1bmN0aW9uKVdpbl9GaW5kV2luZG93T2ZDbGFzcywgMSwKLQkgUHlEb2NfU1RSKCIoUG9pbnQgd2hlcmUsIFdpbmRvd0NsYXNzIGluV2luZG93Q2xhc3MpIC0+IChXaW5kb3dQdHIgb3V0V2luZG93LCBXaW5kb3dQYXJ0Q29kZSBvdXRXaW5kb3dQYXJ0KSIpfSwKLQl7IkNyZWF0ZVN0YW5kYXJkV2luZG93TWVudSIsIChQeUNGdW5jdGlvbilXaW5fQ3JlYXRlU3RhbmRhcmRXaW5kb3dNZW51LCAxLAotCSBQeURvY19TVFIoIihPcHRpb25CaXRzIGluT3B0aW9ucykgLT4gKE1lbnVIYW5kbGUgb3V0TWVudSkiKX0sCi0JeyJDb2xsYXBzZUFsbFdpbmRvd3MiLCAoUHlDRnVuY3Rpb24pV2luX0NvbGxhcHNlQWxsV2luZG93cywgMSwKLQkgUHlEb2NfU1RSKCIoQm9vbGVhbiBjb2xsYXBzZSkgLT4gTm9uZSIpfSwKLQl7IkdldEF2YWlsYWJsZVdpbmRvd1Bvc2l0aW9uaW5nQm91bmRzIiwgKFB5Q0Z1bmN0aW9uKVdpbl9HZXRBdmFpbGFibGVXaW5kb3dQb3NpdGlvbmluZ0JvdW5kcywgMSwKLQkgUHlEb2NfU1RSKCIoR0RIYW5kbGUgaW5EZXZpY2UpIC0+IChSZWN0IG91dEF2YWlsYWJsZVJlY3QpIil9LAotCXsiRGlzYWJsZVNjcmVlblVwZGF0ZXMiLCAoUHlDRnVuY3Rpb24pV2luX0Rpc2FibGVTY3JlZW5VcGRhdGVzLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJFbmFibGVTY3JlZW5VcGRhdGVzIiwgKFB5Q0Z1bmN0aW9uKVdpbl9FbmFibGVTY3JlZW5VcGRhdGVzLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJQaW5SZWN0IiwgKFB5Q0Z1bmN0aW9uKVdpbl9QaW5SZWN0LCAxLAotCSBQeURvY19TVFIoIihSZWN0IHRoZVJlY3QsIFBvaW50IHRoZVB0KSAtPiAobG9uZyBfcnYpIil9LAotCXsiR2V0R3JheVJnbiIsIChQeUNGdW5jdGlvbilXaW5fR2V0R3JheVJnbiwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoUmduSGFuZGxlIF9ydikiKX0sCi0JeyJHZXRXaW5kb3dGcm9tUG9ydCIsIChQeUNGdW5jdGlvbilXaW5fR2V0V2luZG93RnJvbVBvcnQsIDEsCi0JIFB5RG9jX1NUUigiKENHcmFmUHRyIHBvcnQpIC0+IChXaW5kb3dQdHIgX3J2KSIpfSwKLQl7IldoaWNoV2luZG93IiwgKFB5Q0Z1bmN0aW9uKVdpbl9XaGljaFdpbmRvdywgMSwKLQkgUHlEb2NfU1RSKCJSZXNvbHZlIGFuIGludGVnZXIgV2luZG93UHRyIGFkZHJlc3MgdG8gYSBXaW5kb3cgb2JqZWN0Iil9LAotCXsiRmluZFdpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5fRmluZFdpbmRvdywgMSwKLQkgUHlEb2NfU1RSKCIoUG9pbnQgdGhlUG9pbnQpIC0+IChzaG9ydCBfcnYsIFdpbmRvd1B0ciB0aGVXaW5kb3cpIil9LAotCXtOVUxMLCBOVUxMLCAwfQorICAgIHsiR2V0TmV3Q1dpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5fR2V0TmV3Q1dpbmRvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgd2luZG93SUQsIFdpbmRvd1B0ciBiZWhpbmQpIC0+IChXaW5kb3dQdHIgX3J2KSIpfSwKKyAgICB7Ik5ld1dpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5fTmV3V2luZG93LCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IGJvdW5kc1JlY3QsIFN0cjI1NSB0aXRsZSwgQm9vbGVhbiB2aXNpYmxlLCBzaG9ydCB0aGVQcm9jLCBXaW5kb3dQdHIgYmVoaW5kLCBCb29sZWFuIGdvQXdheUZsYWcsIGxvbmcgcmVmQ29uKSAtPiAoV2luZG93UHRyIF9ydikiKX0sCisgICAgeyJHZXROZXdXaW5kb3ciLCAoUHlDRnVuY3Rpb24pV2luX0dldE5ld1dpbmRvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgd2luZG93SUQsIFdpbmRvd1B0ciBiZWhpbmQpIC0+IChXaW5kb3dQdHIgX3J2KSIpfSwKKyAgICB7Ik5ld0NXaW5kb3ciLCAoUHlDRnVuY3Rpb24pV2luX05ld0NXaW5kb3csIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgYm91bmRzUmVjdCwgU3RyMjU1IHRpdGxlLCBCb29sZWFuIHZpc2libGUsIHNob3J0IHByb2NJRCwgV2luZG93UHRyIGJlaGluZCwgQm9vbGVhbiBnb0F3YXlGbGFnLCBsb25nIHJlZkNvbikgLT4gKFdpbmRvd1B0ciBfcnYpIil9LAorICAgIHsiQ3JlYXRlTmV3V2luZG93IiwgKFB5Q0Z1bmN0aW9uKVdpbl9DcmVhdGVOZXdXaW5kb3csIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd0NsYXNzIHdpbmRvd0NsYXNzLCBXaW5kb3dBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMsIFJlY3QgY29udGVudEJvdW5kcykgLT4gKFdpbmRvd1B0ciBvdXRXaW5kb3cpIil9LAorICAgIHsiQ3JlYXRlV2luZG93RnJvbVJlc291cmNlIiwgKFB5Q0Z1bmN0aW9uKVdpbl9DcmVhdGVXaW5kb3dGcm9tUmVzb3VyY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiByZXNJRCkgLT4gKFdpbmRvd1B0ciBvdXRXaW5kb3cpIil9LAorICAgIHsiU2hvd0Zsb2F0aW5nV2luZG93cyIsIChQeUNGdW5jdGlvbilXaW5fU2hvd0Zsb2F0aW5nV2luZG93cywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiSGlkZUZsb2F0aW5nV2luZG93cyIsIChQeUNGdW5jdGlvbilXaW5fSGlkZUZsb2F0aW5nV2luZG93cywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiQXJlRmxvYXRpbmdXaW5kb3dzVmlzaWJsZSIsIChQeUNGdW5jdGlvbilXaW5fQXJlRmxvYXRpbmdXaW5kb3dzVmlzaWJsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiQ2hlY2tVcGRhdGUiLCAoUHlDRnVuY3Rpb24pV2luX0NoZWNrVXBkYXRlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydiwgRXZlbnRSZWNvcmQgdGhlRXZlbnQpIil9LAorICAgIHsiTWFjRmluZFdpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5fTWFjRmluZFdpbmRvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgdGhlUG9pbnQpIC0+IChXaW5kb3dQYXJ0Q29kZSBfcnYsIFdpbmRvd1B0ciB3aW5kb3cpIil9LAorICAgIHsiRnJvbnRXaW5kb3ciLCAoUHlDRnVuY3Rpb24pV2luX0Zyb250V2luZG93LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChXaW5kb3dQdHIgX3J2KSIpfSwKKyAgICB7IkZyb250Tm9uRmxvYXRpbmdXaW5kb3ciLCAoUHlDRnVuY3Rpb24pV2luX0Zyb250Tm9uRmxvYXRpbmdXaW5kb3csIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFdpbmRvd1B0ciBfcnYpIil9LAorICAgIHsiR2V0RnJvbnRXaW5kb3dPZkNsYXNzIiwgKFB5Q0Z1bmN0aW9uKVdpbl9HZXRGcm9udFdpbmRvd09mQ2xhc3MsIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd0NsYXNzIGluV2luZG93Q2xhc3MsIEJvb2xlYW4gbXVzdEJlVmlzaWJsZSkgLT4gKFdpbmRvd1B0ciBfcnYpIil9LAorICAgIHsiRmluZFdpbmRvd09mQ2xhc3MiLCAoUHlDRnVuY3Rpb24pV2luX0ZpbmRXaW5kb3dPZkNsYXNzLCAxLAorICAgICBQeURvY19TVFIoIihQb2ludCB3aGVyZSwgV2luZG93Q2xhc3MgaW5XaW5kb3dDbGFzcykgLT4gKFdpbmRvd1B0ciBvdXRXaW5kb3csIFdpbmRvd1BhcnRDb2RlIG91dFdpbmRvd1BhcnQpIil9LAorICAgIHsiQ3JlYXRlU3RhbmRhcmRXaW5kb3dNZW51IiwgKFB5Q0Z1bmN0aW9uKVdpbl9DcmVhdGVTdGFuZGFyZFdpbmRvd01lbnUsIDEsCisgICAgIFB5RG9jX1NUUigiKE9wdGlvbkJpdHMgaW5PcHRpb25zKSAtPiAoTWVudUhhbmRsZSBvdXRNZW51KSIpfSwKKyAgICB7IkNvbGxhcHNlQWxsV2luZG93cyIsIChQeUNGdW5jdGlvbilXaW5fQ29sbGFwc2VBbGxXaW5kb3dzLCAxLAorICAgICBQeURvY19TVFIoIihCb29sZWFuIGNvbGxhcHNlKSAtPiBOb25lIil9LAorICAgIHsiR2V0QXZhaWxhYmxlV2luZG93UG9zaXRpb25pbmdCb3VuZHMiLCAoUHlDRnVuY3Rpb24pV2luX0dldEF2YWlsYWJsZVdpbmRvd1Bvc2l0aW9uaW5nQm91bmRzLCAxLAorICAgICBQeURvY19TVFIoIihHREhhbmRsZSBpbkRldmljZSkgLT4gKFJlY3Qgb3V0QXZhaWxhYmxlUmVjdCkiKX0sCisgICAgeyJEaXNhYmxlU2NyZWVuVXBkYXRlcyIsIChQeUNGdW5jdGlvbilXaW5fRGlzYWJsZVNjcmVlblVwZGF0ZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkVuYWJsZVNjcmVlblVwZGF0ZXMiLCAoUHlDRnVuY3Rpb24pV2luX0VuYWJsZVNjcmVlblVwZGF0ZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IlBpblJlY3QiLCAoUHlDRnVuY3Rpb24pV2luX1BpblJlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgdGhlUmVjdCwgUG9pbnQgdGhlUHQpIC0+IChsb25nIF9ydikiKX0sCisgICAgeyJHZXRHcmF5UmduIiwgKFB5Q0Z1bmN0aW9uKVdpbl9HZXRHcmF5UmduLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChSZ25IYW5kbGUgX3J2KSIpfSwKKyAgICB7IkdldFdpbmRvd0Zyb21Qb3J0IiwgKFB5Q0Z1bmN0aW9uKVdpbl9HZXRXaW5kb3dGcm9tUG9ydCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0dyYWZQdHIgcG9ydCkgLT4gKFdpbmRvd1B0ciBfcnYpIil9LAorICAgIHsiV2hpY2hXaW5kb3ciLCAoUHlDRnVuY3Rpb24pV2luX1doaWNoV2luZG93LCAxLAorICAgICBQeURvY19TVFIoIlJlc29sdmUgYW4gaW50ZWdlciBXaW5kb3dQdHIgYWRkcmVzcyB0byBhIFdpbmRvdyBvYmplY3QiKX0sCisgICAgeyJGaW5kV2luZG93IiwgKFB5Q0Z1bmN0aW9uKVdpbl9GaW5kV2luZG93LCAxLAorICAgICBQeURvY19TVFIoIihQb2ludCB0aGVQb2ludCkgLT4gKHNob3J0IF9ydiwgV2luZG93UHRyIHRoZVdpbmRvdykiKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiAjZW5kaWYgLyogX19MUDY0X18gKi8KIH07CiAKQEAgLTMyMTMsNTEgKzMyMTMsNTEgQEAKIFB5T2JqZWN0ICoKIFdpbk9ial9XaGljaFdpbmRvdyhXaW5kb3dQdHIgdykKIHsKLSAgICAgICAgUHlPYmplY3QgKml0OworICAgIFB5T2JqZWN0ICppdDsKIAotICAgICAgICBpZiAodyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgaXQgPSBQeV9Ob25lOwotICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihpdCk7CisgICAgaWYgKHcgPT0gTlVMTCkgeworICAgICAgICBpdCA9IFB5X05vbmU7CisgICAgICAgIFB5X0lOQ1JFRihpdCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaXQgPSAoUHlPYmplY3QgKikgR2V0V1JlZkNvbih3KTsKKyAgICAgICAgaWYgKGl0ID09IE5VTEwgfHwgIUlzUG9pbnRlclZhbGlkKChQdHIpaXQpIHx8ICgoV2luZG93T2JqZWN0ICopaXQpLT5vYl9pdHNlbGYgIT0gdyB8fCAhV2luT2JqX0NoZWNrKGl0KSkgeworICAgICAgICAgICAgaXQgPSBXaW5PYmpfTmV3KHcpOworICAgICAgICAgICAgKChXaW5kb3dPYmplY3QgKilpdCktPm9iX2ZyZWVpdCA9IE5VTEw7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaXQgPSAoUHlPYmplY3QgKikgR2V0V1JlZkNvbih3KTsKLSAgICAgICAgICAgICAgICBpZiAoaXQgPT0gTlVMTCB8fCAhSXNQb2ludGVyVmFsaWQoKFB0cilpdCkgfHwgKChXaW5kb3dPYmplY3QgKilpdCktPm9iX2l0c2VsZiAhPSB3IHx8ICFXaW5PYmpfQ2hlY2soaXQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpdCA9IFdpbk9ial9OZXcodyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKFdpbmRvd09iamVjdCAqKWl0KS0+b2JfZnJlZWl0ID0gTlVMTDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgUHlfSU5DUkVGKGl0KTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBQeV9JTkNSRUYoaXQpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpdDsKKyAgICB9CisgICAgcmV0dXJuIGl0OwogfQogCiAjZW5kaWYgLyogX19MUDY0X18gKi8KIAogdm9pZCBpbml0X1dpbih2b2lkKQogewotCVB5T2JqZWN0ICptOworICAgIFB5T2JqZWN0ICptOwogI2lmbmRlZiBfX0xQNjRfXwotCVB5T2JqZWN0ICpkOworICAgIFB5T2JqZWN0ICpkOwogCi0JUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoV2luZG93UHRyLCBXaW5PYmpfTmV3KTsKLQlQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhXaW5kb3dQdHIsIFdpbk9ial9XaGljaFdpbmRvdyk7Ci0JUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKFdpbmRvd1B0ciwgV2luT2JqX0NvbnZlcnQpOworICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKFdpbmRvd1B0ciwgV2luT2JqX05ldyk7CisgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoV2luZG93UHRyLCBXaW5PYmpfV2hpY2hXaW5kb3cpOworICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChXaW5kb3dQdHIsIFdpbk9ial9Db252ZXJ0KTsKIAogI2VuZGlmIC8qIF9fTFA2NF9fICovCiAKLQltID0gUHlfSW5pdE1vZHVsZSgiX1dpbiIsIFdpbl9tZXRob2RzKTsKKyAgICBtID0gUHlfSW5pdE1vZHVsZSgiX1dpbiIsIFdpbl9tZXRob2RzKTsKICNpZm5kZWYgX19MUDY0X18KLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQlXaW5fRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOwotCWlmIChXaW5fRXJyb3IgPT0gTlVMTCB8fAotCSAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRXJyb3IiLCBXaW5fRXJyb3IpICE9IDApCi0JCXJldHVybjsKLQlXaW5kb3dfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCWlmIChQeVR5cGVfUmVhZHkoJldpbmRvd19UeXBlKSA8IDApIHJldHVybjsKLQlQeV9JTkNSRUYoJldpbmRvd19UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIldpbmRvdyIsIChQeU9iamVjdCAqKSZXaW5kb3dfVHlwZSk7Ci0JLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCi0JUHlfSU5DUkVGKCZXaW5kb3dfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJXaW5kb3dUeXBlIiwgKFB5T2JqZWN0ICopJldpbmRvd19UeXBlKTsKKyAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICBXaW5fRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOworICAgIGlmIChXaW5fRXJyb3IgPT0gTlVMTCB8fAorICAgICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRXJyb3IiLCBXaW5fRXJyb3IpICE9IDApCisgICAgICAgIHJldHVybjsKKyAgICBXaW5kb3dfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJldpbmRvd19UeXBlKSA8IDApIHJldHVybjsKKyAgICBQeV9JTkNSRUYoJldpbmRvd19UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIldpbmRvdyIsIChQeU9iamVjdCAqKSZXaW5kb3dfVHlwZSk7CisgICAgLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCisgICAgUHlfSU5DUkVGKCZXaW5kb3dfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJXaW5kb3dUeXBlIiwgKFB5T2JqZWN0ICopJldpbmRvd19UeXBlKTsKICNlbmRpZiAvKiBfX0xQNjRfXyAqLwogfQogCmRpZmYgLS1naXQgYS9NaXNjL3NldHVpZC1wcm9nLmMgYi9NaXNjL3NldHVpZC1wcm9nLmMKaW5kZXggZDg1MGI0Ny4uNzI1NzQ5ZCAxMDA2NDQKLS0tIGEvTWlzYy9zZXR1aWQtcHJvZy5jCisrKyBiL01pc2Mvc2V0dWlkLXByb2cuYwpAQCAtMjEsMjggKzIxLDI4IEBACiAKICAgIEFzc3VtaW5nIHRoZSBzY3JpcHQgaXMgYSBCb3VybmUgc2hlbGwgc2NyaXB0LCB0aGUgZmlyc3QgbGluZSBvZiB0aGUKICAgIHNjcmlwdCBzaG91bGQgYmUKLQkjIS9iaW4vc2ggLQorICAgICMhL2Jpbi9zaCAtCiAgICBUaGUgLSBpcyBpbXBvcnRhbnQsIGRvbid0IG9taXQgaXQuICBJZiB5b3UncmUgdXNpbmcgZXNoLCB0aGUgZmlyc3QKICAgIGxpbmUgc2hvdWxkIGJlCi0JIyEvdXNyL2xvY2FsL2Jpbi9lc2ggLWYKKyAgICAjIS91c3IvbG9jYWwvYmluL2VzaCAtZgogICAgYW5kIGZvciBrc2gsIHRoZSBmaXJzdCBsaW5lIHNob3VsZCBiZQotCSMhL3Vzci9sb2NhbC9iaW4va3NoIC1wCisgICAgIyEvdXNyL2xvY2FsL2Jpbi9rc2ggLXAKICAgIFRoZSBzY3JpcHQgc2hvdWxkIHRoZW4gc2V0IHRoZSB2YXJpYWJsZSBJRlMgdG8gdGhlIHN0cmluZwogICAgY29uc2lzdGluZyBvZiA8c3BhY2U+LCA8dGFiPiwgYW5kIDxuZXdsaW5lPi4gIEFmdGVyIHRoaXMgKCpub3QqCiAgICBiZWZvcmUhKSwgdGhlIFBBVEggdmFyaWFibGUgc2hvdWxkIGJlIHNldCB0byBhIHJlYXNvbmFibGUgdmFsdWUgYW5kCiAgICBleHBvcnRlZC4gIERvIG5vdCBleHBlY3QgdGhlIFBBVEggdG8gaGF2ZSBhIHJlYXNvbmFibGUgdmFsdWUsIHNvIGRvCiAgICBub3QgdHJ1c3QgdGhlIG9sZCB2YWx1ZSBvZiBQQVRILiAgWW91IHNob3VsZCB0aGVuIHNldCB0aGUgdW1hc2sgb2YKICAgIHRoZSBwcm9ncmFtIGJ5IGNhbGxpbmcKLQl1bWFzayAwNzcgIyBvciAwMjIgaWYgeW91IHdhbnQgdGhlIGZpbGVzIHRvIGJlIHJlYWRhYmxlCisgICAgdW1hc2sgMDc3ICMgb3IgMDIyIGlmIHlvdSB3YW50IHRoZSBmaWxlcyB0byBiZSByZWFkYWJsZQogICAgSWYgeW91IHBsYW4gdG8gY2hhbmdlIGRpcmVjdG9yaWVzLCB5b3Ugc2hvdWxkIGVpdGhlciB1bnNldCBDRFBBVEgKICAgIG9yIHNldCBpdCB0byBhIGdvb2QgdmFsdWUuICBTZXR0aW5nIENEUEFUSCB0byBqdXN0IGBgLicnIChkb3QpIGlzIGEKICAgIGdvb2QgaWRlYS4KICAgIElmLCBmb3Igc29tZSByZWFzb24sIHlvdSB3YW50IHRvIHVzZSBjc2gsIHRoZSBmaXJzdCBsaW5lIHNob3VsZCBiZQotCSMhL2Jpbi9jc2ggLWZiCisgICAgIyEvYmluL2NzaCAtZmIKICAgIFlvdSBzaG91bGQgdGhlbiBzZXQgdGhlIHBhdGggdmFyaWFibGUgdG8gc29tZXRoaW5nIHJlYXNvbmFibGUsCiAgICB3aXRob3V0IHRydXN0aW5nIHRoZSBpbmhlcml0ZWQgcGF0aC4gIEhlcmUgdG9vLCB5b3Ugc2hvdWxkIHNldCB0aGUKICAgIHVtYXNrIHVzaW5nIHRoZSBjb21tYW5kCi0JdW1hc2sgMDc3ICMgb3IgMDIyIGlmIHlvdSB3YW50IHRoZSBmaWxlcyB0byBiZSByZWFkYWJsZQorICAgIHVtYXNrIDA3NyAjIG9yIDAyMiBpZiB5b3Ugd2FudCB0aGUgZmlsZXMgdG8gYmUgcmVhZGFibGUKICovCiAKICNpbmNsdWRlIDx1bmlzdGQuaD4KQEAgLTU0LDE0ICs1NCwxNCBAQAogCiAvKiBDT05GSUdVUkFUSU9OIFNFQ1RJT04gKi8KIAotI2lmbmRlZiBGVUxMX1BBVEgJLyogc28gdGhhdCB0aGlzIGNhbiBiZSBzcGVjaWZpZWQgZnJvbSB0aGUgTWFrZWZpbGUgKi8KKyNpZm5kZWYgRlVMTF9QQVRIICAgICAgIC8qIHNvIHRoYXQgdGhpcyBjYW4gYmUgc3BlY2lmaWVkIGZyb20gdGhlIE1ha2VmaWxlICovCiAvKiBVbmNvbW1lbnQgdGhlIGZvbGxvd2luZyBsaW5lOgotI2RlZmluZSBGVUxMX1BBVEgJIi9mdWxsL3BhdGgvb2Yvc2NyaXB0IiAKKyNkZWZpbmUgRlVMTF9QQVRIICAgICAgICIvZnVsbC9wYXRoL29mL3NjcmlwdCIKICogVGhlbiBjb21tZW50IG91dCB0aGUgI2Vycm9yIGxpbmUuICovCiAjZXJyb3IgIllvdSBtdXN0IGRlZmluZSBGVUxMX1BBVEggc29tZXdoZXJlIgogI2VuZGlmCiAjaWZuZGVmIFVNQVNLCi0jZGVmaW5lIFVNQVNLCQkwNzcKKyNkZWZpbmUgVU1BU0sgICAgICAgICAgIDA3NwogI2VuZGlmCiAKIC8qIEVORCBPRiBDT05GSUdVUkFUSU9OIFNFQ1RJT04gKi8KQEAgLTEwMSw3NiArMTAxLDc2IEBACiB2b2lkCiBjbGVhbl9lbnZpcm9uKHZvaWQpCiB7Ci0JY2hhciAqKnA7Ci0JZXh0ZXJuIGNoYXIgKiplbnZpcm9uOworICAgIGNoYXIgKipwOworICAgIGV4dGVybiBjaGFyICoqZW52aXJvbjsKIAotCWZvciAocCA9IGVudmlyb247ICpwOyBwKyspIHsKLQkJaWYgKHN0cm5jbXAoKnAsICJMRF8iLCAzKSA9PSAwKQotCQkJKipwID0gJ1gnOwotCQllbHNlIGlmIChzdHJuY21wKCpwLCAiX1JMRCIsIDQpID09IDApCi0JCQkqKnAgPSAnWCc7Ci0JCWVsc2UgaWYgKHN0cm5jbXAoKnAsICJQWVRIT04iLCA2KSA9PSAwKQotCQkJKipwID0gJ1gnOwotCQllbHNlIGlmIChzdHJuY21wKCpwLCAiSUZTPSIsIDQpID09IDApCi0JCQkqcCA9IGRlZl9JRlM7Ci0JCWVsc2UgaWYgKHN0cm5jbXAoKnAsICJDRFBBVEg9IiwgNykgPT0gMCkKLQkJCSpwID0gZGVmX0NEUEFUSDsKLQkJZWxzZSBpZiAoc3RybmNtcCgqcCwgIkVOVj0iLCA0KSA9PSAwKQotCQkJKnAgPSBkZWZfRU5WOwotCX0KLQlwdXRlbnYoZGVmX1BBVEgpOworICAgIGZvciAocCA9IGVudmlyb247ICpwOyBwKyspIHsKKyAgICAgICAgaWYgKHN0cm5jbXAoKnAsICJMRF8iLCAzKSA9PSAwKQorICAgICAgICAgICAgKipwID0gJ1gnOworICAgICAgICBlbHNlIGlmIChzdHJuY21wKCpwLCAiX1JMRCIsIDQpID09IDApCisgICAgICAgICAgICAqKnAgPSAnWCc7CisgICAgICAgIGVsc2UgaWYgKHN0cm5jbXAoKnAsICJQWVRIT04iLCA2KSA9PSAwKQorICAgICAgICAgICAgKipwID0gJ1gnOworICAgICAgICBlbHNlIGlmIChzdHJuY21wKCpwLCAiSUZTPSIsIDQpID09IDApCisgICAgICAgICAgICAqcCA9IGRlZl9JRlM7CisgICAgICAgIGVsc2UgaWYgKHN0cm5jbXAoKnAsICJDRFBBVEg9IiwgNykgPT0gMCkKKyAgICAgICAgICAgICpwID0gZGVmX0NEUEFUSDsKKyAgICAgICAgZWxzZSBpZiAoc3RybmNtcCgqcCwgIkVOVj0iLCA0KSA9PSAwKQorICAgICAgICAgICAgKnAgPSBkZWZfRU5WOworICAgIH0KKyAgICBwdXRlbnYoZGVmX1BBVEgpOwogfQogCiBpbnQKIG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogewotCXN0cnVjdCBzdGF0IHN0YXRiOwotCWdpZF90IGVnaWQgPSBnZXRlZ2lkKCk7Ci0JdWlkX3QgZXVpZCA9IGdldGV1aWQoKTsKKyAgICBzdHJ1Y3Qgc3RhdCBzdGF0YjsKKyAgICBnaWRfdCBlZ2lkID0gZ2V0ZWdpZCgpOworICAgIHVpZF90IGV1aWQgPSBnZXRldWlkKCk7CiAKLQkvKgotCSAgIFNhbml0eSBjaGVjayAjMS4KLQkgICBUaGlzIGNoZWNrIHNob3VsZCBiZSBtYWRlIGNvbXBpbGUtdGltZSwgYnV0IHRoYXQncyBub3QgcG9zc2libGUuCi0JICAgSWYgeW91J3JlIHN1cmUgdGhhdCB5b3Ugc3BlY2lmaWVkIGEgZnVsbCBwYXRoIG5hbWUgZm9yIEZVTExfUEFUSCwKLQkgICB5b3UgY2FuIG9taXQgdGhpcyBjaGVjay4KLQkqLwotCWlmIChGVUxMX1BBVEhbMF0gIT0gJy8nKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAiJXM6ICVzIGlzIG5vdCBhIGZ1bGwgcGF0aCBuYW1lXG4iLCBhcmd2WzBdLAotCQkJRlVMTF9QQVRIKTsKLQkJZnByaW50ZihzdGRlcnIsICJZb3UgY2FuIG9ubHkgdXNlIHRoaXMgd3JhcHBlciBpZiB5b3VcbiIpOwotCQlmcHJpbnRmKHN0ZGVyciwgImNvbXBpbGUgaXQgd2l0aCBhbiBhYnNvbHV0ZSBwYXRoLlxuIik7Ci0JCWV4aXQoMSk7Ci0JfQorICAgIC8qCisgICAgICAgU2FuaXR5IGNoZWNrICMxLgorICAgICAgIFRoaXMgY2hlY2sgc2hvdWxkIGJlIG1hZGUgY29tcGlsZS10aW1lLCBidXQgdGhhdCdzIG5vdCBwb3NzaWJsZS4KKyAgICAgICBJZiB5b3UncmUgc3VyZSB0aGF0IHlvdSBzcGVjaWZpZWQgYSBmdWxsIHBhdGggbmFtZSBmb3IgRlVMTF9QQVRILAorICAgICAgIHlvdSBjYW4gb21pdCB0aGlzIGNoZWNrLgorICAgICovCisgICAgaWYgKEZVTExfUEFUSFswXSAhPSAnLycpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogJXMgaXMgbm90IGEgZnVsbCBwYXRoIG5hbWVcbiIsIGFyZ3ZbMF0sCisgICAgICAgICAgICBGVUxMX1BBVEgpOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIllvdSBjYW4gb25seSB1c2UgdGhpcyB3cmFwcGVyIGlmIHlvdVxuIik7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiY29tcGlsZSBpdCB3aXRoIGFuIGFic29sdXRlIHBhdGguXG4iKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CiAKLQkvKgotCSAgIFNhbml0eSBjaGVjayAjMi4KLQkgICBDaGVjayB0aGF0IHRoZSBvd25lciBvZiB0aGUgc2NyaXB0IGlzIGVxdWFsIHRvIGVpdGhlciB0aGUKLQkgICBlZmZlY3RpdmUgdWlkIG9yIHRoZSBzdXBlciB1c2VyLgotCSovCi0JaWYgKHN0YXQoRlVMTF9QQVRILCAmc3RhdGIpIDwgMCkgewotCQlwZXJyb3IoInN0YXQiKTsKLQkJZXhpdCgxKTsKLQl9Ci0JaWYgKHN0YXRiLnN0X3VpZCAhPSAwICYmIHN0YXRiLnN0X3VpZCAhPSBldWlkKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAiJXM6ICVzIGhhcyB0aGUgd3Jvbmcgb3duZXJcbiIsIGFyZ3ZbMF0sCi0JCQlGVUxMX1BBVEgpOwotCQlmcHJpbnRmKHN0ZGVyciwgIlRoZSBzY3JpcHQgc2hvdWxkIGJlIG93bmVkIGJ5IHJvb3QsXG4iKTsKLQkJZnByaW50ZihzdGRlcnIsICJhbmQgc2hvdWxkbid0IGJlIHdyaXRlYWJsZSBieSBhbnlvbmUuXG4iKTsKLQkJZXhpdCgxKTsKLQl9CisgICAgLyoKKyAgICAgICBTYW5pdHkgY2hlY2sgIzIuCisgICAgICAgQ2hlY2sgdGhhdCB0aGUgb3duZXIgb2YgdGhlIHNjcmlwdCBpcyBlcXVhbCB0byBlaXRoZXIgdGhlCisgICAgICAgZWZmZWN0aXZlIHVpZCBvciB0aGUgc3VwZXIgdXNlci4KKyAgICAqLworICAgIGlmIChzdGF0KEZVTExfUEFUSCwgJnN0YXRiKSA8IDApIHsKKyAgICAgICAgcGVycm9yKCJzdGF0Iik7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorICAgIGlmIChzdGF0Yi5zdF91aWQgIT0gMCAmJiBzdGF0Yi5zdF91aWQgIT0gZXVpZCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiAlcyBoYXMgdGhlIHdyb25nIG93bmVyXG4iLCBhcmd2WzBdLAorICAgICAgICAgICAgRlVMTF9QQVRIKTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJUaGUgc2NyaXB0IHNob3VsZCBiZSBvd25lZCBieSByb290LFxuIik7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiYW5kIHNob3VsZG4ndCBiZSB3cml0ZWFibGUgYnkgYW55b25lLlxuIik7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQogCi0JaWYgKHNldHJlZ2lkKGVnaWQsIGVnaWQpIDwgMCkKLQkJcGVycm9yKCJzZXRyZWdpZCIpOwotCWlmIChzZXRyZXVpZChldWlkLCBldWlkKSA8IDApCi0JCXBlcnJvcigic2V0cmV1aWQiKTsKKyAgICBpZiAoc2V0cmVnaWQoZWdpZCwgZWdpZCkgPCAwKQorICAgICAgICBwZXJyb3IoInNldHJlZ2lkIik7CisgICAgaWYgKHNldHJldWlkKGV1aWQsIGV1aWQpIDwgMCkKKyAgICAgICAgcGVycm9yKCJzZXRyZXVpZCIpOwogCi0JY2xlYW5fZW52aXJvbigpOworICAgIGNsZWFuX2Vudmlyb24oKTsKIAotCXVtYXNrKFVNQVNLKTsKKyAgICB1bWFzayhVTUFTSyk7CiAKLQl3aGlsZSAoKiphcmd2ID09ICctJykJLyogZG9uJ3QgbGV0IGFyZ3ZbMF0gc3RhcnQgd2l0aCAnLScgKi8KLQkJKCphcmd2KSsrOwotCWV4ZWN2KEZVTExfUEFUSCwgYXJndik7Ci0JZnByaW50ZihzdGRlcnIsICIlczogY291bGQgbm90IGV4ZWN1dGUgdGhlIHNjcmlwdFxuIiwgYXJndlswXSk7Ci0JZXhpdCgxKTsKKyAgICB3aGlsZSAoKiphcmd2ID09ICctJykgICAgICAgLyogZG9uJ3QgbGV0IGFyZ3ZbMF0gc3RhcnQgd2l0aCAnLScgKi8KKyAgICAgICAgKCphcmd2KSsrOworICAgIGV4ZWN2KEZVTExfUEFUSCwgYXJndik7CisgICAgZnByaW50ZihzdGRlcnIsICIlczogY291bGQgbm90IGV4ZWN1dGUgdGhlIHNjcmlwdFxuIiwgYXJndlswXSk7CisgICAgZXhpdCgxKTsKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvX2Jpc2VjdG1vZHVsZS5jIGIvTW9kdWxlcy9fYmlzZWN0bW9kdWxlLmMKaW5kZXggZmM1NDk1NC4uYjUxZjNkZSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fYmlzZWN0bW9kdWxlLmMKKysrIGIvTW9kdWxlcy9fYmlzZWN0bW9kdWxlLmMKQEAgLTgsNTEgKzgsNTEgQEAKIHN0YXRpYyBQeV9zc2l6ZV90CiBpbnRlcm5hbF9iaXNlY3RfcmlnaHQoUHlPYmplY3QgKmxpc3QsIFB5T2JqZWN0ICppdGVtLCBQeV9zc2l6ZV90IGxvLCBQeV9zc2l6ZV90IGhpKQogewotCVB5T2JqZWN0ICpsaXRlbTsKLQlQeV9zc2l6ZV90IG1pZCwgcmVzOworICAgIFB5T2JqZWN0ICpsaXRlbTsKKyAgICBQeV9zc2l6ZV90IG1pZCwgcmVzOwogCi0JaWYgKGxvIDwgMCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImxvIG11c3QgYmUgbm9uLW5lZ2F0aXZlIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKGhpID09IC0xKSB7Ci0JCWhpID0gUHlTZXF1ZW5jZV9TaXplKGxpc3QpOwotCQlpZiAoaGkgPCAwKQotCQkJcmV0dXJuIC0xOwotCX0KLQl3aGlsZSAobG8gPCBoaSkgewotCQltaWQgPSAobG8gKyBoaSkgLyAyOwotCQlsaXRlbSA9IFB5U2VxdWVuY2VfR2V0SXRlbShsaXN0LCBtaWQpOwotCQlpZiAobGl0ZW0gPT0gTlVMTCkKLQkJCXJldHVybiAtMTsKLQkJcmVzID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKGl0ZW0sIGxpdGVtLCBQeV9MVCk7Ci0JCVB5X0RFQ1JFRihsaXRlbSk7Ci0JCWlmIChyZXMgPCAwKQotCQkJcmV0dXJuIC0xOwotCQlpZiAocmVzKQotCQkJaGkgPSBtaWQ7Ci0JCWVsc2UKLQkJCWxvID0gbWlkICsgMTsKLQl9Ci0JcmV0dXJuIGxvOworICAgIGlmIChsbyA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJsbyBtdXN0IGJlIG5vbi1uZWdhdGl2ZSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChoaSA9PSAtMSkgeworICAgICAgICBoaSA9IFB5U2VxdWVuY2VfU2l6ZShsaXN0KTsKKyAgICAgICAgaWYgKGhpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgd2hpbGUgKGxvIDwgaGkpIHsKKyAgICAgICAgbWlkID0gKGxvICsgaGkpIC8gMjsKKyAgICAgICAgbGl0ZW0gPSBQeVNlcXVlbmNlX0dldEl0ZW0obGlzdCwgbWlkKTsKKyAgICAgICAgaWYgKGxpdGVtID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIHJlcyA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChpdGVtLCBsaXRlbSwgUHlfTFQpOworICAgICAgICBQeV9ERUNSRUYobGl0ZW0pOworICAgICAgICBpZiAocmVzIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaWYgKHJlcykKKyAgICAgICAgICAgIGhpID0gbWlkOworICAgICAgICBlbHNlCisgICAgICAgICAgICBsbyA9IG1pZCArIDE7CisgICAgfQorICAgIHJldHVybiBsbzsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGJpc2VjdF9yaWdodChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprdykKIHsKLQlQeU9iamVjdCAqbGlzdCwgKml0ZW07Ci0JUHlfc3NpemVfdCBsbyA9IDA7Ci0JUHlfc3NpemVfdCBoaSA9IC0xOwotCVB5X3NzaXplX3QgaW5kZXg7Ci0Jc3RhdGljIGNoYXIgKmtleXdvcmRzW10gPSB7ImEiLCAieCIsICJsbyIsICJoaSIsIE5VTEx9OworICAgIFB5T2JqZWN0ICpsaXN0LCAqaXRlbTsKKyAgICBQeV9zc2l6ZV90IGxvID0gMDsKKyAgICBQeV9zc2l6ZV90IGhpID0gLTE7CisgICAgUHlfc3NpemVfdCBpbmRleDsKKyAgICBzdGF0aWMgY2hhciAqa2V5d29yZHNbXSA9IHsiYSIsICJ4IiwgImxvIiwgImhpIiwgTlVMTH07CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrdywgIk9PfG5uOmJpc2VjdF9yaWdodCIsCi0JCWtleXdvcmRzLCAmbGlzdCwgJml0ZW0sICZsbywgJmhpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaW5kZXggPSBpbnRlcm5hbF9iaXNlY3RfcmlnaHQobGlzdCwgaXRlbSwgbG8sIGhpKTsKLQlpZiAoaW5kZXggPCAwKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QoaW5kZXgpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3LCAiT098bm46YmlzZWN0X3JpZ2h0IiwKKyAgICAgICAga2V5d29yZHMsICZsaXN0LCAmaXRlbSwgJmxvLCAmaGkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpbmRleCA9IGludGVybmFsX2Jpc2VjdF9yaWdodChsaXN0LCBpdGVtLCBsbywgaGkpOworICAgIGlmIChpbmRleCA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeUludF9Gcm9tU3NpemVfdChpbmRleCk7CiB9CiAKIFB5RG9jX1NUUlZBUihiaXNlY3RfcmlnaHRfZG9jLApAQCAtNzAsMzAgKzcwLDMwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogaW5zb3J0X3JpZ2h0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3KQogewotCVB5T2JqZWN0ICpsaXN0LCAqaXRlbSwgKnJlc3VsdDsKLQlQeV9zc2l6ZV90IGxvID0gMDsKLQlQeV9zc2l6ZV90IGhpID0gLTE7Ci0JUHlfc3NpemVfdCBpbmRleDsKLQlzdGF0aWMgY2hhciAqa2V5d29yZHNbXSA9IHsiYSIsICJ4IiwgImxvIiwgImhpIiwgTlVMTH07CisgICAgUHlPYmplY3QgKmxpc3QsICppdGVtLCAqcmVzdWx0OworICAgIFB5X3NzaXplX3QgbG8gPSAwOworICAgIFB5X3NzaXplX3QgaGkgPSAtMTsKKyAgICBQeV9zc2l6ZV90IGluZGV4OworICAgIHN0YXRpYyBjaGFyICprZXl3b3Jkc1tdID0geyJhIiwgIngiLCAibG8iLCAiaGkiLCBOVUxMfTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3LCAiT098bm46aW5zb3J0X3JpZ2h0IiwKLQkJa2V5d29yZHMsICZsaXN0LCAmaXRlbSwgJmxvLCAmaGkpKQotCQlyZXR1cm4gTlVMTDsKLQlpbmRleCA9IGludGVybmFsX2Jpc2VjdF9yaWdodChsaXN0LCBpdGVtLCBsbywgaGkpOwotCWlmIChpbmRleCA8IDApCi0JCXJldHVybiBOVUxMOwotCWlmIChQeUxpc3RfQ2hlY2tFeGFjdChsaXN0KSkgewotCQlpZiAoUHlMaXN0X0luc2VydChsaXN0LCBpbmRleCwgaXRlbSkgPCAwKQotCQkJcmV0dXJuIE5VTEw7Ci0JfSBlbHNlIHsKLQkJcmVzdWx0ID0gUHlPYmplY3RfQ2FsbE1ldGhvZChsaXN0LCAiaW5zZXJ0IiwgIm5PIiwKLQkJCQkJICAgICBpbmRleCwgaXRlbSk7Ci0JCWlmIChyZXN1bHQgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQlQeV9ERUNSRUYocmVzdWx0KTsKLQl9CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3csICJPT3xubjppbnNvcnRfcmlnaHQiLAorICAgICAgICBrZXl3b3JkcywgJmxpc3QsICZpdGVtLCAmbG8sICZoaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGluZGV4ID0gaW50ZXJuYWxfYmlzZWN0X3JpZ2h0KGxpc3QsIGl0ZW0sIGxvLCBoaSk7CisgICAgaWYgKGluZGV4IDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKFB5TGlzdF9DaGVja0V4YWN0KGxpc3QpKSB7CisgICAgICAgIGlmIChQeUxpc3RfSW5zZXJ0KGxpc3QsIGluZGV4LCBpdGVtKSA8IDApCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9IGVsc2UgeworICAgICAgICByZXN1bHQgPSBQeU9iamVjdF9DYWxsTWV0aG9kKGxpc3QsICJpbnNlcnQiLCAibk8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LCBpdGVtKTsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgIH0KIAotCVB5X1JFVFVSTl9OT05FOworICAgIFB5X1JFVFVSTl9OT05FOwogfQogCiBQeURvY19TVFJWQVIoaW5zb3J0X3JpZ2h0X2RvYywKQEAgLTEwOSw1MSArMTA5LDUxIEBACiBzdGF0aWMgUHlfc3NpemVfdAogaW50ZXJuYWxfYmlzZWN0X2xlZnQoUHlPYmplY3QgKmxpc3QsIFB5T2JqZWN0ICppdGVtLCBQeV9zc2l6ZV90IGxvLCBQeV9zc2l6ZV90IGhpKQogewotCVB5T2JqZWN0ICpsaXRlbTsKLQlQeV9zc2l6ZV90IG1pZCwgcmVzOworICAgIFB5T2JqZWN0ICpsaXRlbTsKKyAgICBQeV9zc2l6ZV90IG1pZCwgcmVzOwogCi0JaWYgKGxvIDwgMCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImxvIG11c3QgYmUgbm9uLW5lZ2F0aXZlIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKGhpID09IC0xKSB7Ci0JCWhpID0gUHlTZXF1ZW5jZV9TaXplKGxpc3QpOwotCQlpZiAoaGkgPCAwKQotCQkJcmV0dXJuIC0xOwotCX0KLQl3aGlsZSAobG8gPCBoaSkgewotCQltaWQgPSAobG8gKyBoaSkgLyAyOwotCQlsaXRlbSA9IFB5U2VxdWVuY2VfR2V0SXRlbShsaXN0LCBtaWQpOwotCQlpZiAobGl0ZW0gPT0gTlVMTCkKLQkJCXJldHVybiAtMTsKLQkJcmVzID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKGxpdGVtLCBpdGVtLCBQeV9MVCk7Ci0JCVB5X0RFQ1JFRihsaXRlbSk7Ci0JCWlmIChyZXMgPCAwKQotCQkJcmV0dXJuIC0xOwotCQlpZiAocmVzKQotCQkJbG8gPSBtaWQgKyAxOwotCQllbHNlCi0JCQloaSA9IG1pZDsKLQl9Ci0JcmV0dXJuIGxvOworICAgIGlmIChsbyA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJsbyBtdXN0IGJlIG5vbi1uZWdhdGl2ZSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChoaSA9PSAtMSkgeworICAgICAgICBoaSA9IFB5U2VxdWVuY2VfU2l6ZShsaXN0KTsKKyAgICAgICAgaWYgKGhpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgd2hpbGUgKGxvIDwgaGkpIHsKKyAgICAgICAgbWlkID0gKGxvICsgaGkpIC8gMjsKKyAgICAgICAgbGl0ZW0gPSBQeVNlcXVlbmNlX0dldEl0ZW0obGlzdCwgbWlkKTsKKyAgICAgICAgaWYgKGxpdGVtID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIHJlcyA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChsaXRlbSwgaXRlbSwgUHlfTFQpOworICAgICAgICBQeV9ERUNSRUYobGl0ZW0pOworICAgICAgICBpZiAocmVzIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaWYgKHJlcykKKyAgICAgICAgICAgIGxvID0gbWlkICsgMTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaGkgPSBtaWQ7CisgICAgfQorICAgIHJldHVybiBsbzsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGJpc2VjdF9sZWZ0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3KQogewotCVB5T2JqZWN0ICpsaXN0LCAqaXRlbTsKLQlQeV9zc2l6ZV90IGxvID0gMDsKLQlQeV9zc2l6ZV90IGhpID0gLTE7Ci0JUHlfc3NpemVfdCBpbmRleDsKLQlzdGF0aWMgY2hhciAqa2V5d29yZHNbXSA9IHsiYSIsICJ4IiwgImxvIiwgImhpIiwgTlVMTH07CisgICAgUHlPYmplY3QgKmxpc3QsICppdGVtOworICAgIFB5X3NzaXplX3QgbG8gPSAwOworICAgIFB5X3NzaXplX3QgaGkgPSAtMTsKKyAgICBQeV9zc2l6ZV90IGluZGV4OworICAgIHN0YXRpYyBjaGFyICprZXl3b3Jkc1tdID0geyJhIiwgIngiLCAibG8iLCAiaGkiLCBOVUxMfTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3LCAiT098bm46YmlzZWN0X2xlZnQiLAotCQlrZXl3b3JkcywgJmxpc3QsICZpdGVtLCAmbG8sICZoaSkpCi0JCXJldHVybiBOVUxMOwotCWluZGV4ID0gaW50ZXJuYWxfYmlzZWN0X2xlZnQobGlzdCwgaXRlbSwgbG8sIGhpKTsKLQlpZiAoaW5kZXggPCAwKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QoaW5kZXgpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3LCAiT098bm46YmlzZWN0X2xlZnQiLAorICAgICAgICBrZXl3b3JkcywgJmxpc3QsICZpdGVtLCAmbG8sICZoaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGluZGV4ID0gaW50ZXJuYWxfYmlzZWN0X2xlZnQobGlzdCwgaXRlbSwgbG8sIGhpKTsKKyAgICBpZiAoaW5kZXggPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QoaW5kZXgpOwogfQogCiBQeURvY19TVFJWQVIoYmlzZWN0X2xlZnRfZG9jLApAQCAtMTcxLDMwICsxNzEsMzAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbnNvcnRfbGVmdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprdykKIHsKLQlQeU9iamVjdCAqbGlzdCwgKml0ZW0sICpyZXN1bHQ7Ci0JUHlfc3NpemVfdCBsbyA9IDA7Ci0JUHlfc3NpemVfdCBoaSA9IC0xOwotCVB5X3NzaXplX3QgaW5kZXg7Ci0Jc3RhdGljIGNoYXIgKmtleXdvcmRzW10gPSB7ImEiLCAieCIsICJsbyIsICJoaSIsIE5VTEx9OworICAgIFB5T2JqZWN0ICpsaXN0LCAqaXRlbSwgKnJlc3VsdDsKKyAgICBQeV9zc2l6ZV90IGxvID0gMDsKKyAgICBQeV9zc2l6ZV90IGhpID0gLTE7CisgICAgUHlfc3NpemVfdCBpbmRleDsKKyAgICBzdGF0aWMgY2hhciAqa2V5d29yZHNbXSA9IHsiYSIsICJ4IiwgImxvIiwgImhpIiwgTlVMTH07CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrdywgIk9PfG5uOmluc29ydF9sZWZ0IiwKLQkJa2V5d29yZHMsICZsaXN0LCAmaXRlbSwgJmxvLCAmaGkpKQotCQlyZXR1cm4gTlVMTDsKLQlpbmRleCA9IGludGVybmFsX2Jpc2VjdF9sZWZ0KGxpc3QsIGl0ZW0sIGxvLCBoaSk7Ci0JaWYgKGluZGV4IDwgMCkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKFB5TGlzdF9DaGVja0V4YWN0KGxpc3QpKSB7Ci0JCWlmIChQeUxpc3RfSW5zZXJ0KGxpc3QsIGluZGV4LCBpdGVtKSA8IDApCi0JCQlyZXR1cm4gTlVMTDsKLQl9IGVsc2UgewotCQlyZXN1bHQgPSBQeU9iamVjdF9DYWxsTWV0aG9kKGxpc3QsICJpbnNlcnQiLCAiaU8iLAotCQkJCQkgICAgIGluZGV4LCBpdGVtKTsKLQkJaWYgKHJlc3VsdCA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCVB5X0RFQ1JFRihyZXN1bHQpOwotCX0KKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrdywgIk9PfG5uOmluc29ydF9sZWZ0IiwKKyAgICAgICAga2V5d29yZHMsICZsaXN0LCAmaXRlbSwgJmxvLCAmaGkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpbmRleCA9IGludGVybmFsX2Jpc2VjdF9sZWZ0KGxpc3QsIGl0ZW0sIGxvLCBoaSk7CisgICAgaWYgKGluZGV4IDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKFB5TGlzdF9DaGVja0V4YWN0KGxpc3QpKSB7CisgICAgICAgIGlmIChQeUxpc3RfSW5zZXJ0KGxpc3QsIGluZGV4LCBpdGVtKSA8IDApCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9IGVsc2UgeworICAgICAgICByZXN1bHQgPSBQeU9iamVjdF9DYWxsTWV0aG9kKGxpc3QsICJpbnNlcnQiLCAiaU8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LCBpdGVtKTsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgIH0KIAotCVB5X1JFVFVSTl9OT05FOworICAgIFB5X1JFVFVSTl9OT05FOwogfQogCiBQeURvY19TVFJWQVIoaW5zb3J0X2xlZnRfZG9jLApAQCAtMjExLDE5ICsyMTEsMTkgQEAKIFB5RG9jX1NUUlZBUihpbnNvcnRfZG9jLCAiQWxpYXMgZm9yIGluc29ydF9yaWdodCgpLlxuIik7CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBiaXNlY3RfbWV0aG9kc1tdID0gewotCXsiYmlzZWN0X3JpZ2h0IiwgKFB5Q0Z1bmN0aW9uKWJpc2VjdF9yaWdodCwKLQkJTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsIGJpc2VjdF9yaWdodF9kb2N9LAotCXsiYmlzZWN0IiwgKFB5Q0Z1bmN0aW9uKWJpc2VjdF9yaWdodCwKLQkJTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsIGJpc2VjdF9kb2N9LAotCXsiaW5zb3J0X3JpZ2h0IiwgKFB5Q0Z1bmN0aW9uKWluc29ydF9yaWdodCwKLQkJTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsIGluc29ydF9yaWdodF9kb2N9LAotCXsiaW5zb3J0IiwgKFB5Q0Z1bmN0aW9uKWluc29ydF9yaWdodCwKLQkJTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsIGluc29ydF9kb2N9LAotCXsiYmlzZWN0X2xlZnQiLCAoUHlDRnVuY3Rpb24pYmlzZWN0X2xlZnQsCi0JCU1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLCBiaXNlY3RfbGVmdF9kb2N9LAotCXsiaW5zb3J0X2xlZnQiLCAoUHlDRnVuY3Rpb24paW5zb3J0X2xlZnQsCi0JCU1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLCBpbnNvcnRfbGVmdF9kb2N9LAotCXtOVUxMLCBOVUxMfSAvKiBzZW50aW5lbCAqLworICAgIHsiYmlzZWN0X3JpZ2h0IiwgKFB5Q0Z1bmN0aW9uKWJpc2VjdF9yaWdodCwKKyAgICAgICAgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsIGJpc2VjdF9yaWdodF9kb2N9LAorICAgIHsiYmlzZWN0IiwgKFB5Q0Z1bmN0aW9uKWJpc2VjdF9yaWdodCwKKyAgICAgICAgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsIGJpc2VjdF9kb2N9LAorICAgIHsiaW5zb3J0X3JpZ2h0IiwgKFB5Q0Z1bmN0aW9uKWluc29ydF9yaWdodCwKKyAgICAgICAgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsIGluc29ydF9yaWdodF9kb2N9LAorICAgIHsiaW5zb3J0IiwgKFB5Q0Z1bmN0aW9uKWluc29ydF9yaWdodCwKKyAgICAgICAgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsIGluc29ydF9kb2N9LAorICAgIHsiYmlzZWN0X2xlZnQiLCAoUHlDRnVuY3Rpb24pYmlzZWN0X2xlZnQsCisgICAgICAgIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLCBiaXNlY3RfbGVmdF9kb2N9LAorICAgIHsiaW5zb3J0X2xlZnQiLCAoUHlDRnVuY3Rpb24paW5zb3J0X2xlZnQsCisgICAgICAgIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLCBpbnNvcnRfbGVmdF9kb2N9LAorICAgIHtOVUxMLCBOVUxMfSAvKiBzZW50aW5lbCAqLwogfTsKIAogUHlEb2NfU1RSVkFSKG1vZHVsZV9kb2MsCkBAIC0yMzcsNyArMjM3LDcgQEAKIFB5TU9ESU5JVF9GVU5DCiBpbml0X2Jpc2VjdCh2b2lkKQogewotCVB5T2JqZWN0ICptOworICAgIFB5T2JqZWN0ICptOwogCi0JbSA9IFB5X0luaXRNb2R1bGUzKCJfYmlzZWN0IiwgYmlzZWN0X21ldGhvZHMsIG1vZHVsZV9kb2MpOworICAgIG0gPSBQeV9Jbml0TW9kdWxlMygiX2Jpc2VjdCIsIGJpc2VjdF9tZXRob2RzLCBtb2R1bGVfZG9jKTsKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvX2JzZGRiLmMgYi9Nb2R1bGVzL19ic2RkYi5jCmluZGV4IDVhZWRmY2EuLjc1NTI0MmMgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2JzZGRiLmMKKysrIGIvTW9kdWxlcy9fYnNkZGIuYwpAQCAtMTM5LDkgKzEzOSw5IEBACiAvKiBhbmQgdGhlc2UgYXJlIGZvciBjYWxsaW5nIEMgLS0+IFB5dGhvbiAqLwogI2lmIGRlZmluZWQoTVlEQl9VU0VfR0lMU1RBVEUpCiAjZGVmaW5lIE1ZREJfQkVHSU5fQkxPQ0tfVEhSRUFEUyBcCi0JCVB5R0lMU3RhdGVfU1RBVEUgX19zYXZlc3RhdGUgPSBQeUdJTFN0YXRlX0Vuc3VyZSgpOworICAgICAgICAgICAgICAgIFB5R0lMU3RhdGVfU1RBVEUgX19zYXZlc3RhdGUgPSBQeUdJTFN0YXRlX0Vuc3VyZSgpOwogI2RlZmluZSBNWURCX0VORF9CTE9DS19USFJFQURTIFwKLQkJUHlHSUxTdGF0ZV9SZWxlYXNlKF9fc2F2ZXN0YXRlKTsKKyAgICAgICAgICAgICAgICBQeUdJTFN0YXRlX1JlbGVhc2UoX19zYXZlc3RhdGUpOwogI2Vsc2UgLyogTVlEQl9VU0VfR0lMU1RBVEUgKi8KIC8qIFByZSBHSUxTdGF0ZSBBUEkgLSBkbyBpdCB0aGUgbG9uZyBvbGQgd2F5ICovCiBzdGF0aWMgUHlJbnRlcnByZXRlclN0YXRlKiBfZGJfaW50ZXJwcmV0ZXJTdGF0ZSA9IE5VTEw7CkBAIC0yMTIsNyArMjEyLDcgQEAKIHN0YXRpYyBQeU9iamVjdCogREJSZXBVbmF2YWlsRXJyb3I7ICAgICAvKiBEQl9SRVBfVU5BVkFJTCAqLwogCiAjaWYgKERCVkVSIDwgNDMpCi0jZGVmaW5lCURCX0JVRkZFUl9TTUFMTAkJRU5PTUVNCisjZGVmaW5lIERCX0JVRkZFUl9TTUFMTCAgICAgICAgIEVOT01FTQogI2VuZGlmCiAKIApAQCAtNTM3LDcgKzUzNyw3IEBACiAKICAgICBzcmNsZW4gPSBzdHJsZW4oc3JjKTsKICAgICBpZiAobiA8PSAwKQotCXJldHVybiBzcmNsZW47CisgICAgICAgIHJldHVybiBzcmNsZW47CiAgICAgY29weWxlbiA9IChzcmNsZW4gPiBuLTEpID8gbi0xIDogc3JjbGVuOwogICAgIC8qIHBvcHVsYXRlIGRlc3RbMF0gdGhydSBkZXN0W2NvcHlsZW4tMV0gKi8KICAgICBtZW1jcHkoZGVzdCwgc3JjLCBjb3B5bGVuKTsKQEAgLTU1NCw3ICs1NTQsNyBAQAogc3RhdGljIHZvaWQgX2RiX2Vycm9yQ2FsbGJhY2soY29uc3QgY2hhciogcHJlZml4LCBjaGFyKiBtc2cpCiAjZWxzZQogc3RhdGljIHZvaWQgX2RiX2Vycm9yQ2FsbGJhY2soY29uc3QgREJfRU5WICpkYl9lbnYsCi0JY29uc3QgY2hhciogcHJlZml4LCBjb25zdCBjaGFyKiBtc2cpCisgICAgICAgIGNvbnN0IGNoYXIqIHByZWZpeCwgY29uc3QgY2hhciogbXNnKQogI2VuZGlmCiB7CiAgICAgb3VyX3N0cmxjcHkoX2RiX2Vycm1zZywgbXNnLCBzaXplb2YoX2RiX2Vycm1zZykpOwpAQCAtNjc2LDcgKzY3Niw3IEBACiAgICAgICAgICAgICAvKiBFbnN1cmUgdGhhdCBieXRlc19sZWZ0IG5ldmVyIGdvZXMgbmVnYXRpdmUgKi8KICAgICAgICAgICAgIGlmIChfZGJfZXJybXNnWzBdICYmIGJ5dGVzX2xlZnQgPCAoc2l6ZW9mKGVyclR4dCkgLSA0KSkgewogICAgICAgICAgICAgICAgIGJ5dGVzX2xlZnQgPSBzaXplb2YoZXJyVHh0KSAtIGJ5dGVzX2xlZnQgLSA0IC0gMTsKLQkJYXNzZXJ0KGJ5dGVzX2xlZnQgPj0gMCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0KGJ5dGVzX2xlZnQgPj0gMCk7CiAgICAgICAgICAgICAgICAgc3RyY2F0KGVyclR4dCwgIiAtLSAiKTsKICAgICAgICAgICAgICAgICBzdHJuY2F0KGVyclR4dCwgX2RiX2Vycm1zZywgYnl0ZXNfbGVmdCk7CiAgICAgICAgICAgICB9CkBAIC03MDUsOCArNzA1LDggQEAKICAgICAgICAgY2FzZSBEQl9CVUZGRVJfU01BTEw6ICAgICAgIGVyck9iaiA9IERCTm9NZW1vcnlFcnJvcjsgICAgICAgYnJlYWs7CiAKICNpZiAoREJWRVIgPj0gNDMpCi0JLyogRU5PTUVNIGFuZCBEQl9CVUZGRVJfU01BTEwgd2VyZSBvbmUgYW5kIHRoZSBzYW1lIHVudGlsIDQuMyAqLwotCWNhc2UgRU5PTUVNOiAgZXJyT2JqID0gUHlFeGNfTWVtb3J5RXJyb3I7ICAgYnJlYWs7CisgICAgICAgIC8qIEVOT01FTSBhbmQgREJfQlVGRkVSX1NNQUxMIHdlcmUgb25lIGFuZCB0aGUgc2FtZSB1bnRpbCA0LjMgKi8KKyAgICAgICAgY2FzZSBFTk9NRU06ICBlcnJPYmogPSBQeUV4Y19NZW1vcnlFcnJvcjsgICBicmVhazsKICNlbmRpZgogICAgICAgICBjYXNlIEVJTlZBTDogIGVyck9iaiA9IERCSW52YWxpZEFyZ0Vycm9yOyAgIGJyZWFrOwogICAgICAgICBjYXNlIEVBQ0NFUzogIGVyck9iaiA9IERCQWNjZXNzRXJyb3I7ICAgICAgIGJyZWFrOwpAQCAtODExLDcgKzgxMSw3IEBACiAKIC8qIEdldCBhIGtleS9kYXRhIHBhaXIgZnJvbSBhIGN1cnNvciAqLwogc3RhdGljIFB5T2JqZWN0KiBfREJDdXJzb3JfZ2V0KERCQ3Vyc29yT2JqZWN0KiBzZWxmLCBpbnQgZXh0cmFfZmxhZ3MsCi0JCQkgICAgICAgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MsIGNoYXIgKmZvcm1hdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncywgY2hhciAqZm9ybWF0KQogewogICAgIGludCBlcnI7CiAgICAgUHlPYmplY3QqIHJldHZhbCA9IE5VTEw7CkBAIC04MjIsNyArODIyLDcgQEAKICAgICBzdGF0aWMgY2hhcioga3duYW1lc1tdID0geyAiZmxhZ3MiLCAiZGxlbiIsICJkb2ZmIiwgTlVMTCB9OwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCBmb3JtYXQsIGt3bmFtZXMsCi0JCQkJICAgICAmZmxhZ3MsICZkbGVuLCAmZG9mZikpIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncywgJmRsZW4sICZkb2ZmKSkKICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgQ0hFQ0tfQ1VSU09SX05PVF9DTE9TRUQoc2VsZik7CkBAIC04MzgsNyArODM4LDcgQEAKICAgICBNWURCX0VORF9BTExPV19USFJFQURTOwogCiAgICAgaWYgKChlcnIgPT0gREJfTk9URk9VTkQgfHwgZXJyID09IERCX0tFWUVNUFRZKQotCSAgICAmJiBzZWxmLT5teWRiLT5tb2R1bGVGbGFncy5nZXRSZXR1cm5zTm9uZSkgeworICAgICAgICAgICAgJiYgc2VsZi0+bXlkYi0+bW9kdWxlRmxhZ3MuZ2V0UmV0dXJuc05vbmUpIHsKICAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwogICAgICAgICByZXR2YWwgPSBQeV9Ob25lOwogICAgIH0KQEAgLTg4MiwxMyArODgyLDEzIEBACiBzdGF0aWMgdm9pZCBfYWRkVGltZVRUb0RpY3QoUHlPYmplY3QqIGRpY3QsIGNoYXIgKm5hbWUsIHRpbWVfdCB2YWx1ZSkKIHsKICAgICBQeU9iamVjdCogdjsKLQkvKiBpZiB0aGUgdmFsdWUgZml0cyBpbiByZWd1bGFyIGludCwgdXNlIHRoYXQuICovCisgICAgICAgIC8qIGlmIHRoZSB2YWx1ZSBmaXRzIGluIHJlZ3VsYXIgaW50LCB1c2UgdGhhdC4gKi8KICNpZmRlZiBQWV9MT05HX0xPTkcKLQlpZiAoc2l6ZW9mKHRpbWVfdCkgPiBzaXplb2YobG9uZykpCi0JCXYgPSBQeUxvbmdfRnJvbUxvbmdMb25nKChQWV9MT05HX0xPTkcpIHZhbHVlKTsKLQllbHNlCisgICAgICAgIGlmIChzaXplb2YodGltZV90KSA+IHNpemVvZihsb25nKSkKKyAgICAgICAgICAgICAgICB2ID0gUHlMb25nX0Zyb21Mb25nTG9uZygoUFlfTE9OR19MT05HKSB2YWx1ZSk7CisgICAgICAgIGVsc2UKICNlbmRpZgotCQl2ID0gTlVNQkVSX0Zyb21Mb25nKChsb25nKSB2YWx1ZSk7CisgICAgICAgICAgICAgICAgdiA9IE5VTUJFUl9Gcm9tTG9uZygobG9uZykgdmFsdWUpOwogICAgIGlmICghdiB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCBuYW1lLCB2KSkKICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKIApAQCAtMTAzOCwxMCArMTAzOCwxMCBAQAogCiAgICAgSU5TRVJUX0lOX0RPVUJMRV9MSU5LRURfTElTVChzZWxmLT5teWRiLT5jaGlsZHJlbl9jdXJzb3JzLHNlbGYpOwogICAgIGlmICh0eG4gJiYgKChQeU9iamVjdCAqKXR4biE9UHlfTm9uZSkpIHsKLQkgICAgSU5TRVJUX0lOX0RPVUJMRV9MSU5LRURfTElTVF9UWE4odHhuLT5jaGlsZHJlbl9jdXJzb3JzLHNlbGYpOwotCSAgICBzZWxmLT50eG49dHhuOworICAgICAgICAgICAgSU5TRVJUX0lOX0RPVUJMRV9MSU5LRURfTElTVF9UWE4odHhuLT5jaGlsZHJlbl9jdXJzb3JzLHNlbGYpOworICAgICAgICAgICAgc2VsZi0+dHhuPXR4bjsKICAgICB9IGVsc2UgewotCSAgICBzZWxmLT50eG49TlVMTDsKKyAgICAgICAgICAgIHNlbGYtPnR4bj1OVUxMOwogICAgIH0KIAogICAgIHNlbGYtPmluX3dlYWtyZWZsaXN0ID0gTlVMTDsKQEAgLTE0MDYsMTYgKzE0MDYsMTYgQEAKICAgICAgICAgICAgIFB5Qnl0ZXNfQXNTdHJpbmdBbmRTaXplKHJlc3VsdCwgJmRhdGEsICZzaXplKTsKICAgICAgICAgICAgIHNlY0tleS0+ZmxhZ3MgPSBEQl9EQlRfQVBQTUFMTE9DOyAgIC8qIERCIHdpbGwgZnJlZSAqLwogICAgICAgICAgICAgc2VjS2V5LT5kYXRhID0gbWFsbG9jKHNpemUpOyAgICAgICAgLyogVE9ETywgY2hlY2sgdGhpcyAqLwotCSAgICBpZiAoc2VjS2V5LT5kYXRhKSB7Ci0JCW1lbWNweShzZWNLZXktPmRhdGEsIGRhdGEsIHNpemUpOwotCQlzZWNLZXktPnNpemUgPSBzaXplOwotCQlyZXR2YWwgPSAwOwotCSAgICB9Ci0JICAgIGVsc2UgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfTWVtb3J5RXJyb3IsCisgICAgICAgICAgICBpZiAoc2VjS2V5LT5kYXRhKSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KHNlY0tleS0+ZGF0YSwgZGF0YSwgc2l6ZSk7CisgICAgICAgICAgICAgICAgc2VjS2V5LT5zaXplID0gc2l6ZTsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX01lbW9yeUVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFsbG9jIGZhaWxlZCBpbiBfZGJfYXNzb2NpYXRlQ2FsbGJhY2siKTsKLQkJUHlFcnJfUHJpbnQoKTsKLQkgICAgfQorICAgICAgICAgICAgICAgIFB5RXJyX1ByaW50KCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoCkBAIC0xNDk5LDcgKzE0OTksNyBAQAogICAgIE1ZREJfQkVHSU5fQUxMT1dfVEhSRUFEUzsKICNpZiAoREJWRVIgPj0gNDEpCiAgICAgZXJyID0gc2VsZi0+ZGItPmFzc29jaWF0ZShzZWxmLT5kYiwKLQkgICAgICAgICAgICAgICAgICAgICAgdHhuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHhuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kYXJ5REItPmRiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RiX2Fzc29jaWF0ZUNhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOwpAQCAtMTYxNyw3ICsxNjE3LDcgQEAKICAgICBNWURCX0VORF9BTExPV19USFJFQURTOwogCiAgICAgaWYgKChlcnIgPT0gREJfTk9URk9VTkQgfHwgZXJyID09IERCX0tFWUVNUFRZKQotCSAgICAmJiBzZWxmLT5tb2R1bGVGbGFncy5nZXRSZXR1cm5zTm9uZSkgeworICAgICAgICAgICAgJiYgc2VsZi0+bW9kdWxlRmxhZ3MuZ2V0UmV0dXJuc05vbmUpIHsKICAgICAgICAgZXJyID0gMDsKICAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwogICAgICAgICByZXR2YWwgPSBQeV9Ob25lOwpAQCAtMTc2NCw3ICsxNzY0LDcgQEAKICAgICAgICAgcmV0dmFsID0gZGZsdG9iajsKICAgICB9CiAgICAgZWxzZSBpZiAoKGVyciA9PSBEQl9OT1RGT1VORCB8fCBlcnIgPT0gREJfS0VZRU1QVFkpCi0JICAgICAmJiBzZWxmLT5tb2R1bGVGbGFncy5nZXRSZXR1cm5zTm9uZSkgeworICAgICAgICAgICAgICYmIHNlbGYtPm1vZHVsZUZsYWdzLmdldFJldHVybnNOb25lKSB7CiAgICAgICAgIGVyciA9IDA7CiAgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKICAgICAgICAgcmV0dmFsID0gUHlfTm9uZTsKQEAgLTE4MzMsNyArMTgzMyw3IEBACiAgICAgICAgIHJldHZhbCA9IGRmbHRvYmo7CiAgICAgfQogICAgIGVsc2UgaWYgKChlcnIgPT0gREJfTk9URk9VTkQgfHwgZXJyID09IERCX0tFWUVNUFRZKQotCSAgICAgJiYgc2VsZi0+bW9kdWxlRmxhZ3MuZ2V0UmV0dXJuc05vbmUpIHsKKyAgICAgICAgICAgICAmJiBzZWxmLT5tb2R1bGVGbGFncy5nZXRSZXR1cm5zTm9uZSkgewogICAgICAgICBlcnIgPSAwOwogICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CiAgICAgICAgIHJldHZhbCA9IFB5X05vbmU7CkBAIC0xOTY4LDcgKzE5NjgsNyBAQAogICAgIE1ZREJfRU5EX0FMTE9XX1RIUkVBRFM7CiAKICAgICBpZiAoKGVyciA9PSBEQl9OT1RGT1VORCB8fCBlcnIgPT0gREJfS0VZRU1QVFkpCi0JICAgICYmIHNlbGYtPm1vZHVsZUZsYWdzLmdldFJldHVybnNOb25lKSB7CisgICAgICAgICAgICAmJiBzZWxmLT5tb2R1bGVGbGFncy5nZXRSZXR1cm5zTm9uZSkgewogICAgICAgICBlcnIgPSAwOwogICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CiAgICAgICAgIHJldHZhbCA9IFB5X05vbmU7CkBAIC0yMDQyLDggKzIwNDIsOCBAQAogICAgIGxlbmd0aCA9IFB5T2JqZWN0X0xlbmd0aChjdXJzb3JzT2JqKTsKICAgICBjdXJzb3JzID0gbWFsbG9jKChsZW5ndGgrMSkgKiBzaXplb2YoREJDKikpOwogICAgIGlmICghY3Vyc29ycykgewotCVB5RXJyX05vTWVtb3J5KCk7Ci0JcmV0dXJuIE5VTEw7CisgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAogICAgIGN1cnNvcnNbbGVuZ3RoXSA9IE5VTEw7CkBAIC0yMTM0LDI4ICsyMTM0LDI4IEBACiAKICNpZiAoREJWRVIgPj0gNDEpCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAienx6aWlpTzpvcGVuIiwga3duYW1lcywKLQkJCQkgICAgICZmaWxlbmFtZSwgJmRibmFtZSwgJnR5cGUsICZmbGFncywgJm1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpbGVuYW1lLCAmZGJuYW1lLCAmdHlwZSwgJmZsYWdzLCAmbW9kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHhub2JqKSkKICNlbHNlCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAienx6aWlpOm9wZW4iLCBrd25hbWVzLAotCQkJCSAgICAgJmZpbGVuYW1lLCAmZGJuYW1lLCAmdHlwZSwgJmZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWxlbmFtZSwgJmRibmFtZSwgJnR5cGUsICZmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbW9kZSkpCiAjZW5kaWYKICAgICB7Ci0JUHlFcnJfQ2xlYXIoKTsKLQl0eXBlID0gREJfVU5LTk9XTjsgZmxhZ3MgPSAwOyBtb2RlID0gMDY2MDsKLQlmaWxlbmFtZSA9IE5VTEw7IGRibmFtZSA9IE5VTEw7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIHR5cGUgPSBEQl9VTktOT1dOOyBmbGFncyA9IDA7IG1vZGUgPSAwNjYwOworICAgICAgICBmaWxlbmFtZSA9IE5VTEw7IGRibmFtZSA9IE5VTEw7CiAjaWYgKERCVkVSID49IDQxKQotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywienxpaWlPOm9wZW4iLAorICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsInp8aWlpTzpvcGVuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3duYW1lc19iYXNpYywKLQkJCQkJICZmaWxlbmFtZSwgJnR5cGUsICZmbGFncywgJm1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWxlbmFtZSwgJnR5cGUsICZmbGFncywgJm1vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0eG5vYmopKQotCSAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogI2Vsc2UKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsInp8aWlpOm9wZW4iLAorICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsInp8aWlpOm9wZW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrd25hbWVzX2Jhc2ljLAotCQkJCQkgJmZpbGVuYW1lLCAmdHlwZSwgJmZsYWdzLCAmbW9kZSkpCi0JICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlsZW5hbWUsICZ0eXBlLCAmZmxhZ3MsICZtb2RlKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogI2VuZGlmCiAgICAgfQogCkBAIC0yMzM4LDIwICsyMzM4LDIwIEBACiAKIHN0YXRpYyBpbnQKIF9kZWZhdWx0X2NtcChjb25zdCBEQlQgKmxlZnRLZXksCi0JICAgICBjb25zdCBEQlQgKnJpZ2h0S2V5KQorICAgICAgICAgICAgIGNvbnN0IERCVCAqcmlnaHRLZXkpCiB7CiAgIGludCByZXM7CiAgIGludCBsc2l6ZSA9IGxlZnRLZXktPnNpemUsIHJzaXplID0gcmlnaHRLZXktPnNpemU7CiAKICAgcmVzID0gbWVtY21wKGxlZnRLZXktPmRhdGEsIHJpZ2h0S2V5LT5kYXRhLAotCSAgICAgICBsc2l6ZSA8IHJzaXplID8gbHNpemUgOiByc2l6ZSk7CisgICAgICAgICAgICAgICBsc2l6ZSA8IHJzaXplID8gbHNpemUgOiByc2l6ZSk7CiAKICAgaWYgKHJlcyA9PSAwKSB7CiAgICAgICBpZiAobHNpemUgPCByc2l6ZSkgewotCSAgcmVzID0gLTE7CisgICAgICAgICAgcmVzID0gLTE7CiAgICAgICB9CiAgICAgICBlbHNlIGlmIChsc2l6ZSA+IHJzaXplKSB7Ci0JICByZXMgPSAxOworICAgICAgICAgIHJlcyA9IDE7CiAgICAgICB9CiAgIH0KICAgcmV0dXJuIHJlczsKQEAgLTIzNTksOCArMjM1OSw4IEBACiAKIHN0YXRpYyBpbnQKIF9kYl9jb21wYXJlQ2FsbGJhY2soREIqIGRiLAotCQkgICAgY29uc3QgREJUICpsZWZ0S2V5LAotCQkgICAgY29uc3QgREJUICpyaWdodEtleSkKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgREJUICpsZWZ0S2V5LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBEQlQgKnJpZ2h0S2V5KQogewogICAgIGludCByZXMgPSAwOwogICAgIFB5T2JqZWN0ICphcmdzOwpAQCAtMjM2OCw0MCArMjM2OCw0MCBAQAogICAgIERCT2JqZWN0ICpzZWxmID0gKERCT2JqZWN0ICopZGItPmFwcF9wcml2YXRlOwogCiAgICAgaWYgKHNlbGYgPT0gTlVMTCB8fCBzZWxmLT5idENvbXBhcmVDYWxsYmFjayA9PSBOVUxMKSB7Ci0JTVlEQl9CRUdJTl9CTE9DS19USFJFQURTOwotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkoc2VsZiA9PSAwCi0JCQkgPyAiREJfYnRfY29tcGFyZSBkYiBpcyBOVUxMLiIKLQkJCSA6ICJEQl9idF9jb21wYXJlIGNhbGxiYWNrIGlzIE5VTEwuIikpOwotCS8qIHdlJ3JlIGluIGEgY2FsbGJhY2sgd2l0aGluIHRoZSBEQiBjb2RlLCB3ZSBjYW4ndCByYWlzZSAqLwotCVB5RXJyX1ByaW50KCk7Ci0JcmVzID0gX2RlZmF1bHRfY21wKGxlZnRLZXksIHJpZ2h0S2V5KTsKLQlNWURCX0VORF9CTE9DS19USFJFQURTOworICAgICAgICBNWURCX0JFR0lOX0JMT0NLX1RIUkVBRFM7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZiA9PSAwCisgICAgICAgICAgICAgICAgICAgICAgICAgPyAiREJfYnRfY29tcGFyZSBkYiBpcyBOVUxMLiIKKyAgICAgICAgICAgICAgICAgICAgICAgICA6ICJEQl9idF9jb21wYXJlIGNhbGxiYWNrIGlzIE5VTEwuIikpOworICAgICAgICAvKiB3ZSdyZSBpbiBhIGNhbGxiYWNrIHdpdGhpbiB0aGUgREIgY29kZSwgd2UgY2FuJ3QgcmFpc2UgKi8KKyAgICAgICAgUHlFcnJfUHJpbnQoKTsKKyAgICAgICAgcmVzID0gX2RlZmF1bHRfY21wKGxlZnRLZXksIHJpZ2h0S2V5KTsKKyAgICAgICAgTVlEQl9FTkRfQkxPQ0tfVEhSRUFEUzsKICAgICB9IGVsc2UgewotCU1ZREJfQkVHSU5fQkxPQ0tfVEhSRUFEUzsKKyAgICAgICAgTVlEQl9CRUdJTl9CTE9DS19USFJFQURTOwogCi0JYXJncyA9IEJ1aWxkVmFsdWVfU1MobGVmdEtleS0+ZGF0YSwgbGVmdEtleS0+c2l6ZSwgcmlnaHRLZXktPmRhdGEsIHJpZ2h0S2V5LT5zaXplKTsKLQlpZiAoYXJncyAhPSBOVUxMKSB7Ci0JCXJlc3VsdCA9IFB5RXZhbF9DYWxsT2JqZWN0KHNlbGYtPmJ0Q29tcGFyZUNhbGxiYWNrLCBhcmdzKTsKLQl9Ci0JaWYgKGFyZ3MgPT0gTlVMTCB8fCByZXN1bHQgPT0gTlVMTCkgewotCSAgICAvKiB3ZSdyZSBpbiBhIGNhbGxiYWNrIHdpdGhpbiB0aGUgREIgY29kZSwgd2UgY2FuJ3QgcmFpc2UgKi8KLQkgICAgUHlFcnJfUHJpbnQoKTsKLQkgICAgcmVzID0gX2RlZmF1bHRfY21wKGxlZnRLZXksIHJpZ2h0S2V5KTsKLQl9IGVsc2UgaWYgKE5VTUJFUl9DaGVjayhyZXN1bHQpKSB7Ci0JICAgIHJlcyA9IE5VTUJFUl9Bc0xvbmcocmVzdWx0KTsKLQl9IGVsc2UgewotCSAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJICAgICJEQl9idF9jb21wYXJlIGNhbGxiYWNrIE1VU1QgcmV0dXJuIGFuIGludC4iKTsKLQkgICAgLyogd2UncmUgaW4gYSBjYWxsYmFjayB3aXRoaW4gdGhlIERCIGNvZGUsIHdlIGNhbid0IHJhaXNlICovCi0JICAgIFB5RXJyX1ByaW50KCk7Ci0JICAgIHJlcyA9IF9kZWZhdWx0X2NtcChsZWZ0S2V5LCByaWdodEtleSk7Ci0JfQorICAgICAgICBhcmdzID0gQnVpbGRWYWx1ZV9TUyhsZWZ0S2V5LT5kYXRhLCBsZWZ0S2V5LT5zaXplLCByaWdodEtleS0+ZGF0YSwgcmlnaHRLZXktPnNpemUpOworICAgICAgICBpZiAoYXJncyAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gUHlFdmFsX0NhbGxPYmplY3Qoc2VsZi0+YnRDb21wYXJlQ2FsbGJhY2ssIGFyZ3MpOworICAgICAgICB9CisgICAgICAgIGlmIChhcmdzID09IE5VTEwgfHwgcmVzdWx0ID09IE5VTEwpIHsKKyAgICAgICAgICAgIC8qIHdlJ3JlIGluIGEgY2FsbGJhY2sgd2l0aGluIHRoZSBEQiBjb2RlLCB3ZSBjYW4ndCByYWlzZSAqLworICAgICAgICAgICAgUHlFcnJfUHJpbnQoKTsKKyAgICAgICAgICAgIHJlcyA9IF9kZWZhdWx0X2NtcChsZWZ0S2V5LCByaWdodEtleSk7CisgICAgICAgIH0gZWxzZSBpZiAoTlVNQkVSX0NoZWNrKHJlc3VsdCkpIHsKKyAgICAgICAgICAgIHJlcyA9IE5VTUJFUl9Bc0xvbmcocmVzdWx0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRCX2J0X2NvbXBhcmUgY2FsbGJhY2sgTVVTVCByZXR1cm4gYW4gaW50LiIpOworICAgICAgICAgICAgLyogd2UncmUgaW4gYSBjYWxsYmFjayB3aXRoaW4gdGhlIERCIGNvZGUsIHdlIGNhbid0IHJhaXNlICovCisgICAgICAgICAgICBQeUVycl9QcmludCgpOworICAgICAgICAgICAgcmVzID0gX2RlZmF1bHRfY21wKGxlZnRLZXksIHJpZ2h0S2V5KTsKKyAgICAgICAgfQogCi0JUHlfWERFQ1JFRihhcmdzKTsKLQlQeV9YREVDUkVGKHJlc3VsdCk7CisgICAgICAgIFB5X1hERUNSRUYoYXJncyk7CisgICAgICAgIFB5X1hERUNSRUYocmVzdWx0KTsKIAotCU1ZREJfRU5EX0JMT0NLX1RIUkVBRFM7CisgICAgICAgIE1ZREJfRU5EX0JMT0NLX1RIUkVBRFM7CiAgICAgfQogICAgIHJldHVybiByZXM7CiB9CkBAIC0yNDE1LDggKzI0MTUsOCBAQAogICAgIENIRUNLX0RCX05PVF9DTE9TRUQoc2VsZik7CiAKICAgICBpZiAoIVB5Q2FsbGFibGVfQ2hlY2soY29tcGFyYXRvcikpIHsKLQltYWtlVHlwZUVycm9yKCJDYWxsYWJsZSIsIGNvbXBhcmF0b3IpOwotCXJldHVybiBOVUxMOworICAgICAgICBtYWtlVHlwZUVycm9yKCJDYWxsYWJsZSIsIGNvbXBhcmF0b3IpOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKICAgICAvKgpAQCAtMjQzMCwxNSArMjQzMCwxNSBAQAogICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgaWYgKCFOVU1CRVJfQ2hlY2socmVzdWx0KSkgewotCVB5X0RFQ1JFRihyZXN1bHQpOwotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCSAgICAgICAgImNhbGxiYWNrIE1VU1QgcmV0dXJuIGFuIGludCIpOwotCXJldHVybiBOVUxMOworICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjYWxsYmFjayBNVVNUIHJldHVybiBhbiBpbnQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfSBlbHNlIGlmIChOVU1CRVJfQXNMb25nKHJlc3VsdCkgIT0gMCkgewotCVB5X0RFQ1JFRihyZXN1bHQpOwotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCSAgICAgICAgImNhbGxiYWNrIGZhaWxlZCB0byByZXR1cm4gMCBvbiB0d28gZW1wdHkgc3RyaW5ncyIpOwotCXJldHVybiBOVUxMOworICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjYWxsYmFjayBmYWlsZWQgdG8gcmV0dXJuIDAgb24gdHdvIGVtcHR5IHN0cmluZ3MiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogICAgIFB5X0RFQ1JFRihyZXN1bHQpOwogCkBAIC0yNDQ2LDggKzI0NDYsOCBAQAogICAgICAqIHNpbXBsaWZ5IHRoZSBjb2RlLiBUaGlzIHdvdWxkIGhhdmUgbm8gcmVhbCB1c2UsIGFzIG9uZSBjYW5ub3QKICAgICAgKiBjaGFuZ2UgdGhlIGZ1bmN0aW9uIG9uY2UgdGhlIGRiIGlzIG9wZW5lZCBhbnl3YXkgKi8KICAgICBpZiAoc2VsZi0+YnRDb21wYXJlQ2FsbGJhY2sgIT0gTlVMTCkgewotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJzZXRfYnRfY29tcGFyZSgpIGNhbm5vdCBiZSBjYWxsZWQgbW9yZSB0aGFuIG9uY2UiKTsKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgInNldF9idF9jb21wYXJlKCkgY2Fubm90IGJlIGNhbGxlZCBtb3JlIHRoYW4gb25jZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKICAgICBQeV9JTkNSRUYoY29tcGFyYXRvcik7CkBAIC0yNDYyLDkgKzI0NjIsOSBAQAogICAgIGVyciA9IHNlbGYtPmRiLT5zZXRfYnRfY29tcGFyZShzZWxmLT5kYiwgX2RiX2NvbXBhcmVDYWxsYmFjayk7CiAKICAgICBpZiAoZXJyKSB7Ci0JLyogcmVzdG9yZSB0aGUgb2xkIHN0YXRlIGluIGNhc2Ugb2YgZXJyb3IgKi8KLQlQeV9ERUNSRUYoY29tcGFyYXRvcik7Ci0Jc2VsZi0+YnRDb21wYXJlQ2FsbGJhY2sgPSBOVUxMOworICAgICAgICAvKiByZXN0b3JlIHRoZSBvbGQgc3RhdGUgaW4gY2FzZSBvZiBlcnJvciAqLworICAgICAgICBQeV9ERUNSRUYoY29tcGFyYXRvcik7CisgICAgICAgIHNlbGYtPmJ0Q29tcGFyZUNhbGxiYWNrID0gTlVMTDsKICAgICB9CiAKICAgICBSRVRVUk5fSUZfRVJSKCk7CkBAIC0yODg1LDggKzI4ODUsOCBAQAogICAgIENIRUNLX0RCX05PVF9DTE9TRUQoc2VsZik7CiAgICAgaWYgKG91dEZpbGVOYW1lKQogICAgICAgICBvdXRGaWxlID0gZm9wZW4ob3V0RmlsZU5hbWUsICJ3Iik7Ci0JLyogWFhYKG5ub3J3aXR6KTogaXQgc2hvdWxkIHByb2JhYmx5IGJlIGFuIGV4Y2VwdGlvbiBpZiBvdXRGaWxlCi0JICAgY2FuJ3QgYmUgb3BlbmVkLiAqLworICAgICAgICAvKiBYWFgobm5vcndpdHopOiBpdCBzaG91bGQgcHJvYmFibHkgYmUgYW4gZXhjZXB0aW9uIGlmIG91dEZpbGUKKyAgICAgICAgICAgY2FuJ3QgYmUgb3BlbmVkLiAqLwogCiAgICAgeyAgLyogREIudmVyaWZ5IGFjdHMgYXMgYSBEQiBoYW5kbGUgZGVzdHJ1Y3RvciAobGlrZSBjbG9zZSkgKi8KICAgICAgICAgUHlPYmplY3QgKmVycm9yOwpAQCAtMjk0MCw4ICsyOTQwLDggQEAKICAgICBzdGF0aWMgY2hhcioga3duYW1lc1tdID0geyAicGFzc3dkIiwgImZsYWdzIiwgTlVMTCB9OwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAic3xpOnNldF9lbmNyeXB0Iiwga3duYW1lcywKLQkJJnBhc3N3ZCwgJmZsYWdzKSkgewotCXJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICZwYXNzd2QsICZmbGFncykpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCiAgICAgTVlEQl9CRUdJTl9BTExPV19USFJFQURTOwpAQCAtMzQxNCwxMiArMzQxNCwxMiBAQAogICAgIENMRUFSX0RCVChrZXkpOwogICAgIENMRUFSX0RCVChkYXRhKTsKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJpfGlpOmdldCIsICZrd25hbWVzWzJdLAotCQkJCSAgICAgJmZsYWdzLCAmZGxlbiwgJmRvZmYpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncywgJmRsZW4sICZkb2ZmKSkKICAgICB7CiAgICAgICAgIFB5RXJyX0NsZWFyKCk7CiAgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk9pfGlpOmdldCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrd25hbWVzWzFdLAotCQkJCQkgJmtleW9iaiwgJmZsYWdzLCAmZGxlbiwgJmRvZmYpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma2V5b2JqLCAmZmxhZ3MsICZkbGVuLCAmZG9mZikpCiAgICAgICAgIHsKICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CiAgICAgICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPT2l8aWk6Z2V0IiwKQEAgLTM0MjcsOCArMzQyNyw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsICZkbGVuLCAmZG9mZikpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgIH0KLQl9CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiAKICAgICBDSEVDS19DVVJTT1JfTk9UX0NMT1NFRChzZWxmKTsKQEAgLTM0NDcsNyArMzQ0Nyw3IEBACiAgICAgTVlEQl9FTkRfQUxMT1dfVEhSRUFEUzsKIAogICAgIGlmICgoZXJyID09IERCX05PVEZPVU5EIHx8IGVyciA9PSBEQl9LRVlFTVBUWSkKLQkgICAgJiYgc2VsZi0+bXlkYi0+bW9kdWxlRmxhZ3MuZ2V0UmV0dXJuc05vbmUpIHsKKyAgICAgICAgICAgICYmIHNlbGYtPm15ZGItPm1vZHVsZUZsYWdzLmdldFJldHVybnNOb25lKSB7CiAgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKICAgICAgICAgcmV0dmFsID0gUHlfTm9uZTsKICAgICB9CkBAIC0zNDkwLDEyICszNDkwLDEyIEBACiAgICAgQ0xFQVJfREJUKGtleSk7CiAgICAgQ0xFQVJfREJUKGRhdGEpOwogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIml8aWk6cGdldCIsICZrd25hbWVzWzJdLAotCQkJCSAgICAgJmZsYWdzLCAmZGxlbiwgJmRvZmYpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncywgJmRsZW4sICZkb2ZmKSkKICAgICB7CiAgICAgICAgIFB5RXJyX0NsZWFyKCk7CiAgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk9pfGlpOnBnZXQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrd25hbWVzX2tleU9ubHksIAotCQkJCQkgJmtleW9iaiwgJmZsYWdzLCAmZGxlbiwgJmRvZmYpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrd25hbWVzX2tleU9ubHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXlvYmosICZmbGFncywgJmRsZW4sICZkb2ZmKSkKICAgICAgICAgewogICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKICAgICAgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk9PaXxpaTpwZ2V0IiwKQEAgLTM1MDMsOCArMzUwMyw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsICZkbGVuLCAmZG9mZikpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgIH0KLQl9CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiAKICAgICBDSEVDS19DVVJTT1JfTk9UX0NMT1NFRChzZWxmKTsKQEAgLTM1MjUsNyArMzUyNSw3IEBACiAgICAgTVlEQl9FTkRfQUxMT1dfVEhSRUFEUzsKIAogICAgIGlmICgoZXJyID09IERCX05PVEZPVU5EIHx8IGVyciA9PSBEQl9LRVlFTVBUWSkKLQkgICAgJiYgc2VsZi0+bXlkYi0+bW9kdWxlRmxhZ3MuZ2V0UmV0dXJuc05vbmUpIHsKKyAgICAgICAgICAgICYmIHNlbGYtPm15ZGItPm1vZHVsZUZsYWdzLmdldFJldHVybnNOb25lKSB7CiAgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKICAgICAgICAgcmV0dmFsID0gUHlfTm9uZTsKICAgICB9CkBAIC0zNjM2LDcgKzM2MzYsNyBAQAogICAgIGludCBkb2ZmID0gLTE7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPT3xpaWk6cHV0Iiwga3duYW1lcywKLQkJCQkgICAgICZrZXlvYmosICZkYXRhb2JqLCAmZmxhZ3MsICZkbGVuLCAmZG9mZikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtleW9iaiwgJmRhdGFvYmosICZmbGFncywgJmRsZW4sICZkb2ZmKSkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICBDSEVDS19DVVJTT1JfTk9UX0NMT1NFRChzZWxmKTsKQEAgLTM2NzEsNyArMzY3MSw3IEBACiAgICAgaW50IGRvZmYgPSAtMTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk98aWlpOnNldCIsIGt3bmFtZXMsCi0JCQkJICAgICAma2V5b2JqLCAmZmxhZ3MsICZkbGVuLCAmZG9mZikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtleW9iaiwgJmZsYWdzLCAmZGxlbiwgJmRvZmYpKQogICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIENIRUNLX0NVUlNPUl9OT1RfQ0xPU0VEKHNlbGYpOwpAQCAtMzY4OSw3ICszNjg5LDcgQEAKICAgICBlcnIgPSBfREJDX2dldChzZWxmLT5kYmMsICZrZXksICZkYXRhLCBmbGFnc3xEQl9TRVQpOwogICAgIE1ZREJfRU5EX0FMTE9XX1RIUkVBRFM7CiAgICAgaWYgKChlcnIgPT0gREJfTk9URk9VTkQgfHwgZXJyID09IERCX0tFWUVNUFRZKQotCSAgICAmJiBzZWxmLT5teWRiLT5tb2R1bGVGbGFncy5jdXJzb3JTZXRSZXR1cm5zTm9uZSkgeworICAgICAgICAgICAgJiYgc2VsZi0+bXlkYi0+bW9kdWxlRmxhZ3MuY3Vyc29yU2V0UmV0dXJuc05vbmUpIHsKICAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwogICAgICAgICByZXR2YWwgPSBQeV9Ob25lOwogICAgIH0KQEAgLTM3MzQsNyArMzczNCw3IEBACiAgICAgaW50IGRvZmYgPSAtMTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk98aWlpOnNldF9yYW5nZSIsIGt3bmFtZXMsCi0JCQkJICAgICAma2V5b2JqLCAmZmxhZ3MsICZkbGVuLCAmZG9mZikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtleW9iaiwgJmZsYWdzLCAmZGxlbiwgJmRvZmYpKQogICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIENIRUNLX0NVUlNPUl9OT1RfQ0xPU0VEKHNlbGYpOwpAQCAtMzc1MSw3ICszNzUxLDcgQEAKICAgICBlcnIgPSBfREJDX2dldChzZWxmLT5kYmMsICZrZXksICZkYXRhLCBmbGFnc3xEQl9TRVRfUkFOR0UpOwogICAgIE1ZREJfRU5EX0FMTE9XX1RIUkVBRFM7CiAgICAgaWYgKChlcnIgPT0gREJfTk9URk9VTkQgfHwgZXJyID09IERCX0tFWUVNUFRZKQotCSAgICAmJiBzZWxmLT5teWRiLT5tb2R1bGVGbGFncy5jdXJzb3JTZXRSZXR1cm5zTm9uZSkgeworICAgICAgICAgICAgJiYgc2VsZi0+bXlkYi0+bW9kdWxlRmxhZ3MuY3Vyc29yU2V0UmV0dXJuc05vbmUpIHsKICAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwogICAgICAgICByZXR2YWwgPSBQeV9Ob25lOwogICAgIH0KQEAgLTM5MDUsNyArMzkwNSw3IEBACiAgICAgc3RhdGljIGNoYXIqIGt3bmFtZXNbXSA9IHsgInJlY25vIiwiZmxhZ3MiLCAiZGxlbiIsICJkb2ZmIiwgTlVMTCB9OwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiaXxpaWk6c2V0X3JlY25vIiwga3duYW1lcywKLQkJCQkgICAgICZpcmVjbm8sICZmbGFncywgJmRsZW4sICZkb2ZmKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaXJlY25vLCAmZmxhZ3MsICZkbGVuLCAmZG9mZikpCiAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIENIRUNLX0NVUlNPUl9OT1RfQ0xPU0VEKHNlbGYpOwpAQCAtMzkzNCw3ICszOTM0LDcgQEAKICAgICBlcnIgPSBfREJDX2dldChzZWxmLT5kYmMsICZrZXksICZkYXRhLCBmbGFnc3xEQl9TRVRfUkVDTk8pOwogICAgIE1ZREJfRU5EX0FMTE9XX1RIUkVBRFM7CiAgICAgaWYgKChlcnIgPT0gREJfTk9URk9VTkQgfHwgZXJyID09IERCX0tFWUVNUFRZKQotCSAgICAmJiBzZWxmLT5teWRiLT5tb2R1bGVGbGFncy5jdXJzb3JTZXRSZXR1cm5zTm9uZSkgeworICAgICAgICAgICAgJiYgc2VsZi0+bXlkYi0+bW9kdWxlRmxhZ3MuY3Vyc29yU2V0UmV0dXJuc05vbmUpIHsKICAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwogICAgICAgICByZXR2YWwgPSBQeV9Ob25lOwogICAgIH0KQEAgLTM5OTcsNyArMzk5Nyw3IEBACiAgICAgZXJyID0gX0RCQ19nZXQoc2VsZi0+ZGJjLCAma2V5LCAmZGF0YSwgZmxhZ3MgfCBEQl9KT0lOX0lURU0pOwogICAgIE1ZREJfRU5EX0FMTE9XX1RIUkVBRFM7CiAgICAgaWYgKChlcnIgPT0gREJfTk9URk9VTkQgfHwgZXJyID09IERCX0tFWUVNUFRZKQotCSAgICAmJiBzZWxmLT5teWRiLT5tb2R1bGVGbGFncy5nZXRSZXR1cm5zTm9uZSkgeworICAgICAgICAgICAgJiYgc2VsZi0+bXlkYi0+bW9kdWxlRmxhZ3MuZ2V0UmV0dXJuc05vbmUpIHsKICAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwogICAgICAgICByZXR2YWwgPSBQeV9Ob25lOwogICAgIH0KQEAgLTQxMDksOCArNDEwOSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCB9OwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAic3x6T2k6ZGJyZW1vdmUiLCBrd25hbWVzLAotCQkmZmlsZSwgJmRhdGFiYXNlLCAmdHhub2JqLCAmZmxhZ3MpKSB7Ci0JcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgJmZpbGUsICZkYXRhYmFzZSwgJnR4bm9iaiwgJmZsYWdzKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAgICAgaWYgKCFjaGVja1R4bk9iaih0eG5vYmosICZ0eG4pKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtNDEzNyw4ICs0MTM3LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmxhZ3MiLCBOVUxMIH07CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJzenN8T2k6ZGJyZW5hbWUiLCBrd25hbWVzLAotCQkmZmlsZSwgJmRhdGFiYXNlLCAmbmV3bmFtZSwgJnR4bm9iaiwgJmZsYWdzKSkgewotCXJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICZmaWxlLCAmZGF0YWJhc2UsICZuZXduYW1lLCAmdHhub2JqLCAmZmxhZ3MpKSB7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICBpZiAoIWNoZWNrVHhuT2JqKHR4bm9iaiwgJnR4bikpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC00MTYxLDggKzQxNjEsOCBAQAogICAgIHN0YXRpYyBjaGFyKiBrd25hbWVzW10gPSB7ICJwYXNzd2QiLCAiZmxhZ3MiLCBOVUxMIH07CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJzfGk6c2V0X2VuY3J5cHQiLCBrd25hbWVzLAotCQkmcGFzc3dkLCAmZmxhZ3MpKSB7Ci0JcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgJnBhc3N3ZCwgJmZsYWdzKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKICAgICBNWURCX0JFR0lOX0FMTE9XX1RIUkVBRFM7CkBAIC00MTgzLDggKzQxODMsOCBAQAogICAgIHN0YXRpYyBjaGFyKiBrd25hbWVzW10gPSB7ICJ0aW1lb3V0IiwgImZsYWdzIiwgTlVMTCB9OwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiaWk6c2V0X3RpbWVvdXQiLCBrd25hbWVzLAotCQkmdGltZW91dCwgJmZsYWdzKSkgewotCXJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICZ0aW1lb3V0LCAmZmxhZ3MpKSB7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAogICAgIE1ZREJfQkVHSU5fQUxMT1dfVEhSRUFEUzsKQEAgLTUxNDYsOCArNTE0Niw4IEBACiAgICAgQ0hFQ0tfRU5WX05PVF9DTE9TRUQoc2VsZik7CiAKICAgICBpZiAoIVB5Q2FsbGFibGVfQ2hlY2sobm90aWZ5RnVuYykpIHsKLQkgICAgbWFrZVR5cGVFcnJvcigiQ2FsbGFibGUiLCBub3RpZnlGdW5jKTsKLQkgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICBtYWtlVHlwZUVycm9yKCJDYWxsYWJsZSIsIG5vdGlmeUZ1bmMpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCiAgICAgUHlfWERFQ1JFRihzZWxmLT5ldmVudF9ub3RpZnlDYWxsYmFjayk7CkBAIC01MTY1LDggKzUxNjUsOCBAQAogICAgIE1ZREJfRU5EX0FMTE9XX1RIUkVBRFM7CiAKICAgICBpZiAoZXJyKSB7Ci0JICAgIFB5X0RFQ1JFRihub3RpZnlGdW5jKTsKLQkgICAgc2VsZi0+ZXZlbnRfbm90aWZ5Q2FsbGJhY2sgPSBOVUxMOworICAgICAgICAgICAgUHlfREVDUkVGKG5vdGlmeUZ1bmMpOworICAgICAgICAgICAgc2VsZi0+ZXZlbnRfbm90aWZ5Q2FsbGJhY2sgPSBOVUxMOwogICAgIH0KIAogICAgIFJFVFVSTl9JRl9FUlIoKTsKQEAgLTU0ODcsNyArNTQ4Nyw3IEBACiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLAogICAgICAgICAgICAgICAgICJpfE86cmVwX3N0YXJ0Iiwga3duYW1lcywgJmZsYWdzLCAmY2RhdGFfcHkpKQogICAgIHsKLQkgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAgICAgQ0hFQ0tfRU5WX05PVF9DTE9TRUQoc2VsZik7CiAKQEAgLTU2NDAsNyArNTY0MCw3IEBACiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLAogICAgICAgICAgICAgICAgICJpaTpyZXBtZ3Jfc3RhcnQiLCBrd25hbWVzLCAmbnRocmVhZHMsICZmbGFncykpCiAgICAgewotCSAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICBDSEVDS19FTlZfTk9UX0NMT1NFRChzZWxmKTsKICAgICBNWURCX0JFR0lOX0FMTE9XX1RIUkVBRFM7CkBAIC01NjYzLDcgKzU2NjMsNyBAQAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywKICAgICAgICAgICAgICAgICAic2l8aTpyZXBtZ3Jfc2V0X2xvY2FsX3NpdGUiLCBrd25hbWVzLCAmaG9zdCwgJnBvcnQsICZmbGFncykpCiAgICAgewotCSAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICBDSEVDS19FTlZfTk9UX0NMT1NFRChzZWxmKTsKICAgICBNWURCX0JFR0lOX0FMTE9XX1RIUkVBRFM7CkBAIC01Njg3LDcgKzU2ODcsNyBAQAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywKICAgICAgICAgICAgICAgICAic2l8aTpyZXBtZ3JfYWRkX3JlbW90ZV9zaXRlIiwga3duYW1lcywgJmhvc3QsICZwb3J0LCAmZmxhZ3MpKQogICAgIHsKLQkgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAgICAgQ0hFQ0tfRU5WX05PVF9DTE9TRUQoc2VsZik7CiAgICAgTVlEQl9CRUdJTl9BTExPV19USFJFQURTOwpAQCAtNTcwNSw3ICs1NzA1LDcgQEAKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpyZXBtZ3Jfc2V0X2Fja19wb2xpY3kiLCAmYWNrX3BvbGljeSkpCiAgICAgewotCSAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICBDSEVDS19FTlZfTk9UX0NMT1NFRChzZWxmKTsKICAgICBNWURCX0JFR0lOX0FMTE9XX1RIUkVBRFM7CkBAIC01ODgwLDcgKzU4ODAsNyBAQAogICAgICAgICAgICAgLyogVGhlIGRiIGlzIGFscmVhZHkgbGlua2VkIHRvIGl0cyBlbnZpcm9ubWVudCwKICAgICAgICAgICAgICoqIHNvIG5vdGhpbmcgdG8gZG8uCiAgICAgICAgICAgICAqLwotICAgICAgICAgICAgZGItPnR4bj1OVUxMOyAKKyAgICAgICAgICAgIGRiLT50eG49TlVMTDsKICAgICAgICAgfQogICAgIH0KIApAQCAtNjY4MiwyMCArNjY4MiwyMCBAQAogICAgIDAsICAgICAgICAgIC8qdHBfYXNfc2VxdWVuY2UqLwogICAgICZEQl9tYXBwaW5nLC8qdHBfYXNfbWFwcGluZyovCiAgICAgMCwgICAgICAgICAgLyp0cF9oYXNoKi8KLSAgICAwLAkJCS8qIHRwX2NhbGwgKi8KLSAgICAwLAkJCS8qIHRwX3N0ciAqLwotICAgIDAsICAJCS8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCiAgICAgMCwgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KLSAgICAwLAkJCS8qIHRwX2FzX2J1ZmZlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCiAjaWYgKFBZX1ZFUlNJT05fSEVYIDwgMHgwMzAwMDAwMCkKICAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfV0VBS1JFRlMsICAgICAgLyogdHBfZmxhZ3MgKi8KICNlbHNlCiAgICAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgIC8qIHRwX2ZsYWdzICovCiAjZW5kaWYKICAgICAwLCAgICAgICAgICAvKiB0cF9kb2MgKi8KLSAgICAwLAkJICAgIC8qIHRwX3RyYXZlcnNlICovCi0gICAgMCwJCQkvKiB0cF9jbGVhciAqLwotICAgIDAsCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLwogICAgIG9mZnNldG9mKERCT2JqZWN0LCBpbl93ZWFrcmVmbGlzdCksICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KICAgICAwLCAgICAgICAgICAvKnRwX2l0ZXIqLwogICAgIDAsICAgICAgICAgIC8qdHBfaXRlcm5leHQqLwpAQCAtNjc2OCwyMCArNjc2OCwyMCBAQAogICAgIDAsICAgICAgICAgIC8qdHBfYXNfc2VxdWVuY2UqLwogICAgIDAsICAgICAgICAgIC8qdHBfYXNfbWFwcGluZyovCiAgICAgMCwgICAgICAgICAgLyp0cF9oYXNoKi8KLSAgICAwLAkJCS8qIHRwX2NhbGwgKi8KLSAgICAwLAkJCS8qIHRwX3N0ciAqLwotICAgIDAsICAJCS8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCiAgICAgMCwgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KLSAgICAwLAkJCS8qIHRwX2FzX2J1ZmZlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCiAjaWYgKFBZX1ZFUlNJT05fSEVYIDwgMHgwMzAwMDAwMCkKICAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfV0VBS1JFRlMsICAgICAgLyogdHBfZmxhZ3MgKi8KICNlbHNlCiAgICAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgIC8qIHRwX2ZsYWdzICovCiAjZW5kaWYKICAgICAwLCAgICAgICAgICAvKiB0cF9kb2MgKi8KLSAgICAwLAkJICAgIC8qIHRwX3RyYXZlcnNlICovCi0gICAgMCwJCQkvKiB0cF9jbGVhciAqLwotICAgIDAsCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLwogICAgIG9mZnNldG9mKERCRW52T2JqZWN0LCBpbl93ZWFrcmVmbGlzdCksICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KICAgICAwLCAgICAgICAgICAvKiB0cF9pdGVyICovCiAgICAgMCwgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KQEAgLTY4MTEsMjAgKzY4MTEsMjAgQEAKICAgICAwLCAgICAgICAgICAvKnRwX2FzX3NlcXVlbmNlKi8KICAgICAwLCAgICAgICAgICAvKnRwX2FzX21hcHBpbmcqLwogICAgIDAsICAgICAgICAgIC8qdHBfaGFzaCovCi0gICAgMCwJCQkvKiB0cF9jYWxsICovCi0gICAgMCwJCQkvKiB0cF9zdHIgKi8KLSAgICAwLCAgCQkvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLwogICAgIDAsICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCi0gICAgMCwJCQkvKiB0cF9hc19idWZmZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLwogI2lmIChQWV9WRVJTSU9OX0hFWCA8IDB4MDMwMDAwMDApCiAgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX1dFQUtSRUZTLCAgICAgIC8qIHRwX2ZsYWdzICovCiAjZWxzZQogICAgIFB5X1RQRkxBR1NfREVGQVVMVCwgICAgICAvKiB0cF9mbGFncyAqLwogI2VuZGlmCiAgICAgMCwgICAgICAgICAgLyogdHBfZG9jICovCi0gICAgMCwJICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLwotICAgIDAsCQkJLyogdHBfY2xlYXIgKi8KLSAgICAwLAkJCS8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLwogICAgIG9mZnNldG9mKERCVHhuT2JqZWN0LCBpbl93ZWFrcmVmbGlzdCksICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KICAgICAwLCAgICAgICAgICAvKnRwX2l0ZXIqLwogICAgIDAsICAgICAgICAgIC8qdHBfaXRlcm5leHQqLwpAQCAtNjg1NCwyMCArNjg1NCwyMCBAQAogICAgIDAsICAgICAgICAgIC8qdHBfYXNfc2VxdWVuY2UqLwogICAgIDAsICAgICAgICAgIC8qdHBfYXNfbWFwcGluZyovCiAgICAgMCwgICAgICAgICAgLyp0cF9oYXNoKi8KLSAgICAwLAkJCS8qIHRwX2NhbGwgKi8KLSAgICAwLAkJCS8qIHRwX3N0ciAqLwotICAgIDAsICAJCS8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCiAgICAgMCwgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KLSAgICAwLAkJCS8qIHRwX2FzX2J1ZmZlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCiAjaWYgKFBZX1ZFUlNJT05fSEVYIDwgMHgwMzAwMDAwMCkKICAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfV0VBS1JFRlMsICAgICAgLyogdHBfZmxhZ3MgKi8KICNlbHNlCiAgICAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgIC8qIHRwX2ZsYWdzICovCiAjZW5kaWYKICAgICAwLCAgICAgICAgICAvKiB0cF9kb2MgKi8KLSAgICAwLAkJICAgIC8qIHRwX3RyYXZlcnNlICovCi0gICAgMCwJCQkvKiB0cF9jbGVhciAqLwotICAgIDAsCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLwogICAgIG9mZnNldG9mKERCTG9ja09iamVjdCwgaW5fd2Vha3JlZmxpc3QpLCAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCiB9OwogCkBAIC02ODkzLDIwICs2ODkzLDIwIEBACiAgICAgMCwgICAgICAgICAgLyp0cF9hc19zZXF1ZW5jZSovCiAgICAgMCwgICAgICAgICAgLyp0cF9hc19tYXBwaW5nKi8KICAgICAwLCAgICAgICAgICAvKnRwX2hhc2gqLwotICAgIDAsCQkJLyogdHBfY2FsbCAqLwotICAgIDAsCQkJLyogdHBfc3RyICovCi0gICAgMCwgIAkJLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KICAgICAwLCAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLwotICAgIDAsCQkJLyogdHBfYXNfYnVmZmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KICNpZiAoUFlfVkVSU0lPTl9IRVggPCAweDAzMDAwMDAwKQogICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9XRUFLUkVGUywgICAgICAvKiB0cF9mbGFncyAqLwogI2Vsc2UKICAgICBQeV9UUEZMQUdTX0RFRkFVTFQsICAgICAgLyogdHBfZmxhZ3MgKi8KICNlbmRpZgogICAgIDAsICAgICAgICAgIC8qIHRwX2RvYyAqLwotICAgIDAsCQkgICAgLyogdHBfdHJhdmVyc2UgKi8KLSAgICAwLAkJCS8qIHRwX2NsZWFyICovCi0gICAgMCwJCQkvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCiAgICAgb2Zmc2V0b2YoREJTZXF1ZW5jZU9iamVjdCwgaW5fd2Vha3JlZmxpc3QpLCAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCiAgICAgMCwgICAgICAgICAgLyp0cF9pdGVyKi8KICAgICAwLCAgICAgICAgICAvKnRwX2l0ZXJuZXh0Ki8KQEAgLTcwNjgsNyArNzA2OCw3IEBACiAjaWYgKFBZX1ZFUlNJT05fSEVYIDwgMHgwMzAwMDAwMCkKICAgICAgICAgcmV0dXJuOwogI2Vsc2UKLSAgICAJcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBOVUxMOwogI2VuZGlmCiAgICAgfQogCkBAIC03NDczLDcgKzc0NzMsNyBAQAogICAgICAqIHVzaW5nIG9uZSBiYXNlIGNsYXNzLiAqLwogICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJLZXlFcnJvciIsIFB5RXhjX0tleUVycm9yKTsKICAgICBQeVJ1bl9TdHJpbmcoImNsYXNzIERCTm90Rm91bmRFcnJvcihEQkVycm9yLCBLZXlFcnJvcik6IHBhc3NcbiIKLQkgICAgICAgICAiY2xhc3MgREJLZXlFbXB0eUVycm9yKERCRXJyb3IsIEtleUVycm9yKTogcGFzcyIsCisgICAgICAgICAgICAgICAgICJjbGFzcyBEQktleUVtcHR5RXJyb3IoREJFcnJvciwgS2V5RXJyb3IpOiBwYXNzIiwKICAgICAgICAgICAgICAgICAgUHlfZmlsZV9pbnB1dCwgZCwgZCk7CiAgICAgREJOb3RGb3VuZEVycm9yID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoZCwgIkRCTm90Rm91bmRFcnJvciIpOwogICAgIERCS2V5RW1wdHlFcnJvciA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKGQsICJEQktleUVtcHR5RXJyb3IiKTsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2NvZGVjc21vZHVsZS5jIGIvTW9kdWxlcy9fY29kZWNzbW9kdWxlLmMKaW5kZXggNjg3NzIzOC4uOWYyMjg3MSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY29kZWNzbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9fY29kZWNzbW9kdWxlLmMKQEAgLTE1LDcgKzE1LDcgQEAKICAgIFRoZSBidWlsdGluIFVuaWNvZGUgY29kZWNzIHVzZSB0aGUgZm9sbG93aW5nIGludGVyZmFjZToKIAogICAgICA8ZW5jb2Rpbmc+X2VuY29kZShVbmljb2RlX29iamVjdFssZXJyb3JzPSdzdHJpY3QnXSkgLT4KLSAgICAgCShzdHJpbmcgb2JqZWN0LCBieXRlcyBjb25zdW1lZCkKKyAgICAgICAgKHN0cmluZyBvYmplY3QsIGJ5dGVzIGNvbnN1bWVkKQogCiAgICAgIDxlbmNvZGluZz5fZGVjb2RlKGNoYXJfYnVmZmVyX29ialssZXJyb3JzPSdzdHJpY3QnXSkgLT4KICAgICAgICAgKFVuaWNvZGUgb2JqZWN0LCBieXRlcyBjb25zdW1lZCkKQEAgLTk2LDExICs5NiwxMSBAQAogCiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQogICAgIGlmIChlbmNvZGluZyA9PSBOVUxMKQotCWVuY29kaW5nID0gUHlVbmljb2RlX0dldERlZmF1bHRFbmNvZGluZygpOworICAgICAgICBlbmNvZGluZyA9IFB5VW5pY29kZV9HZXREZWZhdWx0RW5jb2RpbmcoKTsKICNlbHNlCiAgICAgaWYgKGVuY29kaW5nID09IE5VTEwpIHsKLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIm5vIGVuY29kaW5nIHNwZWNpZmllZCIpOwotCXJldHVybiBOVUxMOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIm5vIGVuY29kaW5nIHNwZWNpZmllZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAjZW5kaWYKIApAQCAtMTMwLDExICsxMzAsMTEgQEAKIAogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKICAgICBpZiAoZW5jb2RpbmcgPT0gTlVMTCkKLQllbmNvZGluZyA9IFB5VW5pY29kZV9HZXREZWZhdWx0RW5jb2RpbmcoKTsKKyAgICAgICAgZW5jb2RpbmcgPSBQeVVuaWNvZGVfR2V0RGVmYXVsdEVuY29kaW5nKCk7CiAjZWxzZQogICAgIGlmIChlbmNvZGluZyA9PSBOVUxMKSB7Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJubyBlbmNvZGluZyBzcGVjaWZpZWQiKTsKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJubyBlbmNvZGluZyBzcGVjaWZpZWQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogI2VuZGlmCiAKQEAgLTE0Niw3ICsxNDYsNyBAQAogCiBzdGF0aWMKIFB5T2JqZWN0ICpjb2RlY190dXBsZShQeU9iamVjdCAqdW5pY29kZSwKLQkJICAgICAgUHlfc3NpemVfdCBsZW4pCisgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBsZW4pCiB7CiAgICAgUHlPYmplY3QgKnY7CiAgICAgaWYgKHVuaWNvZGUgPT0gTlVMTCkKQEAgLTE1OSw0NCArMTU5LDQ0IEBACiAvKiAtLS0gU3RyaW5nIGNvZGVjcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIHN0YXRpYyBQeU9iamVjdCAqCiBlc2NhcGVfZGVjb2RlKFB5T2JqZWN0ICpzZWxmLAotCSAgICAgIFB5T2JqZWN0ICphcmdzKQorICAgICAgICAgICAgICBQeU9iamVjdCAqYXJncykKIHsKICAgICBjb25zdCBjaGFyICplcnJvcnMgPSBOVUxMOwogICAgIGNvbnN0IGNoYXIgKmRhdGE7CiAgICAgUHlfc3NpemVfdCBzaXplOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI3x6OmVzY2FwZV9kZWNvZGUiLAotCQkJICAmZGF0YSwgJnNpemUsICZlcnJvcnMpKQotCXJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YSwgJnNpemUsICZlcnJvcnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKICAgICByZXR1cm4gY29kZWNfdHVwbGUoUHlTdHJpbmdfRGVjb2RlRXNjYXBlKGRhdGEsIHNpemUsIGVycm9ycywgMCwgTlVMTCksCi0JCSAgICAgICBzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBlc2NhcGVfZW5jb2RlKFB5T2JqZWN0ICpzZWxmLAotCSAgICAgIFB5T2JqZWN0ICphcmdzKQorICAgICAgICAgICAgICBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqc3RyOwotCWNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7Ci0JY2hhciAqYnVmOwotCVB5X3NzaXplX3QgbGVuOworICAgICAgICBQeU9iamVjdCAqc3RyOworICAgICAgICBjb25zdCBjaGFyICplcnJvcnMgPSBOVUxMOworICAgICAgICBjaGFyICpidWY7CisgICAgICAgIFB5X3NzaXplX3QgbGVuOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPIXx6OmVzY2FwZV9lbmNvZGUiLAotCQkJICAgICAgJlB5U3RyaW5nX1R5cGUsICZzdHIsICZlcnJvcnMpKQotCQlyZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPIXx6OmVzY2FwZV9lbmNvZGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlB5U3RyaW5nX1R5cGUsICZzdHIsICZlcnJvcnMpKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogCi0Jc3RyID0gUHlTdHJpbmdfUmVwcihzdHIsIDApOwotCWlmICghc3RyKQotCQlyZXR1cm4gTlVMTDsKKyAgICAgICAgc3RyID0gUHlTdHJpbmdfUmVwcihzdHIsIDApOworICAgICAgICBpZiAoIXN0cikKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKIAotCS8qIFRoZSBzdHJpbmcgd2lsbCBiZSBxdW90ZWQuIFVucXVvdGUsIHNpbWlsYXIgdG8gdW5pY29kZS1lc2NhcGUuICovCi0JYnVmID0gUHlTdHJpbmdfQVNfU1RSSU5HIChzdHIpOwotCWxlbiA9IFB5U3RyaW5nX0dFVF9TSVpFIChzdHIpOwotCW1lbW1vdmUoYnVmLCBidWYrMSwgbGVuLTIpOwotCWlmIChfUHlTdHJpbmdfUmVzaXplKCZzdHIsIGxlbi0yKSA8IDApCi0JCXJldHVybiBOVUxMOwotCQotCXJldHVybiBjb2RlY190dXBsZShzdHIsIFB5U3RyaW5nX1NpemUoc3RyKSk7CisgICAgICAgIC8qIFRoZSBzdHJpbmcgd2lsbCBiZSBxdW90ZWQuIFVucXVvdGUsIHNpbWlsYXIgdG8gdW5pY29kZS1lc2NhcGUuICovCisgICAgICAgIGJ1ZiA9IFB5U3RyaW5nX0FTX1NUUklORyAoc3RyKTsKKyAgICAgICAgbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUgKHN0cik7CisgICAgICAgIG1lbW1vdmUoYnVmLCBidWYrMSwgbGVuLTIpOworICAgICAgICBpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmc3RyLCBsZW4tMikgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworCisgICAgICAgIHJldHVybiBjb2RlY190dXBsZShzdHIsIFB5U3RyaW5nX1NpemUoc3RyKSk7CiB9CiAKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCkBAIC0yMDQsNyArMjA0LDcgQEAKIAogc3RhdGljIFB5T2JqZWN0ICoKIHVuaWNvZGVfaW50ZXJuYWxfZGVjb2RlKFB5T2JqZWN0ICpzZWxmLAotCQkJUHlPYmplY3QgKmFyZ3MpCisgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqYXJncykKIHsKICAgICBQeU9iamVjdCAqb2JqOwogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CkBAIC0yMTIsMTkgKzIxMiwxOSBAQAogICAgIFB5X3NzaXplX3Qgc2l6ZTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3x6OnVuaWNvZGVfaW50ZXJuYWxfZGVjb2RlIiwKLQkJCSAgJm9iaiwgJmVycm9ycykpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICZvYmosICZlcnJvcnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIGlmIChQeVVuaWNvZGVfQ2hlY2sob2JqKSkgewotCVB5X0lOQ1JFRihvYmopOwotCXJldHVybiBjb2RlY190dXBsZShvYmosIFB5VW5pY29kZV9HRVRfU0laRShvYmopKTsKKyAgICAgICAgUHlfSU5DUkVGKG9iaik7CisgICAgICAgIHJldHVybiBjb2RlY190dXBsZShvYmosIFB5VW5pY29kZV9HRVRfU0laRShvYmopKTsKICAgICB9CiAgICAgZWxzZSB7Ci0JaWYgKFB5T2JqZWN0X0FzUmVhZEJ1ZmZlcihvYmosIChjb25zdCB2b2lkICoqKSZkYXRhLCAmc2l6ZSkpCi0JICAgIHJldHVybiBOVUxMOworICAgICAgICBpZiAoUHlPYmplY3RfQXNSZWFkQnVmZmVyKG9iaiwgKGNvbnN0IHZvaWQgKiopJmRhdGEsICZzaXplKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogCi0JcmV0dXJuIGNvZGVjX3R1cGxlKF9QeVVuaWNvZGVfRGVjb2RlVW5pY29kZUludGVybmFsKGRhdGEsIHNpemUsIGVycm9ycyksCi0JCQkgICBzaXplKTsKKyAgICAgICAgcmV0dXJuIGNvZGVjX3R1cGxlKF9QeVVuaWNvZGVfRGVjb2RlVW5pY29kZUludGVybmFsKGRhdGEsIHNpemUsIGVycm9ycyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplKTsKICAgICB9CiB9CiAKQEAgLTIzMiwyMCArMjMyLDIwIEBACiB1dGZfN19kZWNvZGUoUHlPYmplY3QgKnNlbGYsCiAgICAgICAgICAgICAgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlfYnVmZmVyIHBidWY7CisgICAgICAgIFB5X2J1ZmZlciBwYnVmOwogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAgICAgaW50IGZpbmFsID0gMDsKICAgICBQeV9zc2l6ZV90IGNvbnN1bWVkOwogICAgIFB5T2JqZWN0ICpkZWNvZGVkID0gTlVMTDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyp8emk6dXRmXzdfZGVjb2RlIiwKLQkJCSAgJnBidWYsICZlcnJvcnMsICZmaW5hbCkpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICZwYnVmLCAmZXJyb3JzLCAmZmluYWwpKQorICAgICAgICByZXR1cm4gTlVMTDsKICAgICBjb25zdW1lZCA9IHBidWYubGVuOwogCiAgICAgZGVjb2RlZCA9IFB5VW5pY29kZV9EZWNvZGVVVEY3U3RhdGVmdWwocGJ1Zi5idWYsIHBidWYubGVuLCBlcnJvcnMsCi0JCQkJCSAgIGZpbmFsID8gTlVMTCA6ICZjb25zdW1lZCk7Ci0JUHlCdWZmZXJfUmVsZWFzZSgmcGJ1Zik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgPyBOVUxMIDogJmNvbnN1bWVkKTsKKyAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmcGJ1Zik7CiAgICAgaWYgKGRlY29kZWQgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgcmV0dXJuIGNvZGVjX3R1cGxlKGRlY29kZWQsIGNvbnN1bWVkKTsKQEAgLTI1MywzMiArMjUzLDMyIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqCiB1dGZfOF9kZWNvZGUoUHlPYmplY3QgKnNlbGYsCi0JICAgIFB5T2JqZWN0ICphcmdzKQorICAgICAgICAgICAgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlfYnVmZmVyIHBidWY7CisgICAgICAgIFB5X2J1ZmZlciBwYnVmOwogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAgICAgaW50IGZpbmFsID0gMDsKICAgICBQeV9zc2l6ZV90IGNvbnN1bWVkOwogICAgIFB5T2JqZWN0ICpkZWNvZGVkID0gTlVMTDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyp8emk6dXRmXzhfZGVjb2RlIiwKLQkJCSAgJnBidWYsICZlcnJvcnMsICZmaW5hbCkpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICZwYnVmLCAmZXJyb3JzLCAmZmluYWwpKQorICAgICAgICByZXR1cm4gTlVMTDsKICAgICBjb25zdW1lZCA9IHBidWYubGVuOwogCiAgICAgZGVjb2RlZCA9IFB5VW5pY29kZV9EZWNvZGVVVEY4U3RhdGVmdWwocGJ1Zi5idWYsIHBidWYubGVuLCBlcnJvcnMsCi0JCQkJCSAgIGZpbmFsID8gTlVMTCA6ICZjb25zdW1lZCk7Ci0JUHlCdWZmZXJfUmVsZWFzZSgmcGJ1Zik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgPyBOVUxMIDogJmNvbnN1bWVkKTsKKyAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmcGJ1Zik7CiAgICAgaWYgKGRlY29kZWQgPT0gTlVMTCkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgcmV0dXJuIGNvZGVjX3R1cGxlKGRlY29kZWQsIGNvbnN1bWVkKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHV0Zl8xNl9kZWNvZGUoUHlPYmplY3QgKnNlbGYsCi0JICAgIFB5T2JqZWN0ICphcmdzKQorICAgICAgICAgICAgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlfYnVmZmVyIHBidWY7CisgICAgICAgIFB5X2J1ZmZlciBwYnVmOwogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAgICAgaW50IGJ5dGVvcmRlciA9IDA7CiAgICAgaW50IGZpbmFsID0gMDsKQEAgLTI4NiwyMiArMjg2LDIyIEBACiAgICAgUHlPYmplY3QgKmRlY29kZWQ7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMqfHppOnV0Zl8xNl9kZWNvZGUiLAotCQkJICAmcGJ1ZiwgJmVycm9ycywgJmZpbmFsKSkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBidWYsICZlcnJvcnMsICZmaW5hbCkpCisgICAgICAgIHJldHVybiBOVUxMOwogICAgIGNvbnN1bWVkID0gcGJ1Zi5sZW47IC8qIFRoaXMgaXMgb3ZlcndyaXR0ZW4gdW5sZXNzIGZpbmFsIGlzIHRydWUuICovCiAgICAgZGVjb2RlZCA9IFB5VW5pY29kZV9EZWNvZGVVVEYxNlN0YXRlZnVsKHBidWYuYnVmLCBwYnVmLmxlbiwgZXJyb3JzLAotCQkJCQkmYnl0ZW9yZGVyLCBmaW5hbCA/IE5VTEwgOiAmY29uc3VtZWQpOwotCVB5QnVmZmVyX1JlbGVhc2UoJnBidWYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZieXRlb3JkZXIsIGZpbmFsID8gTlVMTCA6ICZjb25zdW1lZCk7CisgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnBidWYpOwogICAgIGlmIChkZWNvZGVkID09IE5VTEwpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIHJldHVybiBjb2RlY190dXBsZShkZWNvZGVkLCBjb25zdW1lZCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB1dGZfMTZfbGVfZGVjb2RlKFB5T2JqZWN0ICpzZWxmLAotCQkgUHlPYmplY3QgKmFyZ3MpCisgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICphcmdzKQogewotCVB5X2J1ZmZlciBwYnVmOworICAgICAgICBQeV9idWZmZXIgcGJ1ZjsKICAgICBjb25zdCBjaGFyICplcnJvcnMgPSBOVUxMOwogICAgIGludCBieXRlb3JkZXIgPSAtMTsKICAgICBpbnQgZmluYWwgPSAwOwpAQCAtMzA5LDIzICszMDksMjMgQEAKICAgICBQeU9iamVjdCAqZGVjb2RlZCA9IE5VTEw7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMqfHppOnV0Zl8xNl9sZV9kZWNvZGUiLAotCQkJICAmcGJ1ZiwgJmVycm9ycywgJmZpbmFsKSkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBidWYsICZlcnJvcnMsICZmaW5hbCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgY29uc3VtZWQgPSBwYnVmLmxlbjsgLyogVGhpcyBpcyBvdmVyd3JpdHRlbiB1bmxlc3MgZmluYWwgaXMgdHJ1ZS4gKi8KICAgICBkZWNvZGVkID0gUHlVbmljb2RlX0RlY29kZVVURjE2U3RhdGVmdWwocGJ1Zi5idWYsIHBidWYubGVuLCBlcnJvcnMsCi0JJmJ5dGVvcmRlciwgZmluYWwgPyBOVUxMIDogJmNvbnN1bWVkKTsKLQlQeUJ1ZmZlcl9SZWxlYXNlKCZwYnVmKTsKKyAgICAgICAgJmJ5dGVvcmRlciwgZmluYWwgPyBOVUxMIDogJmNvbnN1bWVkKTsKKyAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmcGJ1Zik7CiAgICAgaWYgKGRlY29kZWQgPT0gTlVMTCkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgcmV0dXJuIGNvZGVjX3R1cGxlKGRlY29kZWQsIGNvbnN1bWVkKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHV0Zl8xNl9iZV9kZWNvZGUoUHlPYmplY3QgKnNlbGYsCi0JCSBQeU9iamVjdCAqYXJncykKKyAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlfYnVmZmVyIHBidWY7CisgICAgICAgIFB5X2J1ZmZlciBwYnVmOwogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAgICAgaW50IGJ5dGVvcmRlciA9IDE7CiAgICAgaW50IGZpbmFsID0gMDsKQEAgLTMzMywxNSArMzMzLDE1IEBACiAgICAgUHlPYmplY3QgKmRlY29kZWQgPSBOVUxMOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzKnx6aTp1dGZfMTZfYmVfZGVjb2RlIiwKLQkJCSAgJnBidWYsICZlcnJvcnMsICZmaW5hbCkpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICZwYnVmLCAmZXJyb3JzLCAmZmluYWwpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIGNvbnN1bWVkID0gcGJ1Zi5sZW47IC8qIFRoaXMgaXMgb3ZlcndyaXR0ZW4gdW5sZXNzIGZpbmFsIGlzIHRydWUuICovCiAgICAgZGVjb2RlZCA9IFB5VW5pY29kZV9EZWNvZGVVVEYxNlN0YXRlZnVsKHBidWYuYnVmLCBwYnVmLmxlbiwgZXJyb3JzLAotCSZieXRlb3JkZXIsIGZpbmFsID8gTlVMTCA6ICZjb25zdW1lZCk7Ci0JUHlCdWZmZXJfUmVsZWFzZSgmcGJ1Zik7CisgICAgICAgICZieXRlb3JkZXIsIGZpbmFsID8gTlVMTCA6ICZjb25zdW1lZCk7CisgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnBidWYpOwogICAgIGlmIChkZWNvZGVkID09IE5VTEwpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIHJldHVybiBjb2RlY190dXBsZShkZWNvZGVkLCBjb25zdW1lZCk7CiB9CiAKQEAgLTM1NSw5ICszNTUsOSBAQAogCiBzdGF0aWMgUHlPYmplY3QgKgogdXRmXzE2X2V4X2RlY29kZShQeU9iamVjdCAqc2VsZiwKLQkJIFB5T2JqZWN0ICphcmdzKQorICAgICAgICAgICAgICAgICBQeU9iamVjdCAqYXJncykKIHsKLQlQeV9idWZmZXIgcGJ1ZjsKKyAgICAgICAgUHlfYnVmZmVyIHBidWY7CiAgICAgY29uc3QgY2hhciAqZXJyb3JzID0gTlVMTDsKICAgICBpbnQgYnl0ZW9yZGVyID0gMDsKICAgICBQeU9iamVjdCAqdW5pY29kZSwgKnR1cGxlOwpAQCAtMzY1LDE0ICszNjUsMTQgQEAKICAgICBQeV9zc2l6ZV90IGNvbnN1bWVkOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzKnx6aWk6dXRmXzE2X2V4X2RlY29kZSIsCi0JCQkgICZwYnVmLCAmZXJyb3JzLCAmYnl0ZW9yZGVyLCAmZmluYWwpKQotCXJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAmcGJ1ZiwgJmVycm9ycywgJmJ5dGVvcmRlciwgJmZpbmFsKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgY29uc3VtZWQgPSBwYnVmLmxlbjsgLyogVGhpcyBpcyBvdmVyd3JpdHRlbiB1bmxlc3MgZmluYWwgaXMgdHJ1ZS4gKi8KICAgICB1bmljb2RlID0gUHlVbmljb2RlX0RlY29kZVVURjE2U3RhdGVmdWwocGJ1Zi5idWYsIHBidWYubGVuLCBlcnJvcnMsCi0JCQkJCSZieXRlb3JkZXIsIGZpbmFsID8gTlVMTCA6ICZjb25zdW1lZCk7Ci0JUHlCdWZmZXJfUmVsZWFzZSgmcGJ1Zik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ5dGVvcmRlciwgZmluYWwgPyBOVUxMIDogJmNvbnN1bWVkKTsKKyAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmcGJ1Zik7CiAgICAgaWYgKHVuaWNvZGUgPT0gTlVMTCkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgdHVwbGUgPSBQeV9CdWlsZFZhbHVlKCJPbmkiLCB1bmljb2RlLCBjb25zdW1lZCwgYnl0ZW9yZGVyKTsKICAgICBQeV9ERUNSRUYodW5pY29kZSk7CiAgICAgcmV0dXJuIHR1cGxlOwpAQCAtMzgwLDkgKzM4MCw5IEBACiAKIHN0YXRpYyBQeU9iamVjdCAqCiB1dGZfMzJfZGVjb2RlKFB5T2JqZWN0ICpzZWxmLAotCSAgICBQeU9iamVjdCAqYXJncykKKyAgICAgICAgICAgIFB5T2JqZWN0ICphcmdzKQogewotCVB5X2J1ZmZlciBwYnVmOworICAgICAgICBQeV9idWZmZXIgcGJ1ZjsKICAgICBjb25zdCBjaGFyICplcnJvcnMgPSBOVUxMOwogICAgIGludCBieXRlb3JkZXIgPSAwOwogICAgIGludCBmaW5hbCA9IDA7CkBAIC0zOTAsMjIgKzM5MCwyMiBAQAogICAgIFB5T2JqZWN0ICpkZWNvZGVkOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzKnx6aTp1dGZfMzJfZGVjb2RlIiwKLQkJCSAgJnBidWYsICZlcnJvcnMsICZmaW5hbCkpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICZwYnVmLCAmZXJyb3JzLCAmZmluYWwpKQorICAgICAgICByZXR1cm4gTlVMTDsKICAgICBjb25zdW1lZCA9IHBidWYubGVuOyAvKiBUaGlzIGlzIG92ZXJ3cml0dGVuIHVubGVzcyBmaW5hbCBpcyB0cnVlLiAqLwogICAgIGRlY29kZWQgPSBQeVVuaWNvZGVfRGVjb2RlVVRGMzJTdGF0ZWZ1bChwYnVmLmJ1ZiwgcGJ1Zi5sZW4sIGVycm9ycywKLQkJCQkJJmJ5dGVvcmRlciwgZmluYWwgPyBOVUxMIDogJmNvbnN1bWVkKTsKLQlQeUJ1ZmZlcl9SZWxlYXNlKCZwYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnl0ZW9yZGVyLCBmaW5hbCA/IE5VTEwgOiAmY29uc3VtZWQpOworICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZwYnVmKTsKICAgICBpZiAoZGVjb2RlZCA9PSBOVUxMKQotCXJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICByZXR1cm4gY29kZWNfdHVwbGUoZGVjb2RlZCwgY29uc3VtZWQpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogdXRmXzMyX2xlX2RlY29kZShQeU9iamVjdCAqc2VsZiwKLQkJIFB5T2JqZWN0ICphcmdzKQorICAgICAgICAgICAgICAgICBQeU9iamVjdCAqYXJncykKIHsKLQlQeV9idWZmZXIgcGJ1ZjsKKyAgICAgICAgUHlfYnVmZmVyIHBidWY7CiAgICAgY29uc3QgY2hhciAqZXJyb3JzID0gTlVMTDsKICAgICBpbnQgYnl0ZW9yZGVyID0gLTE7CiAgICAgaW50IGZpbmFsID0gMDsKQEAgLTQxMywyMiArNDEzLDIyIEBACiAgICAgUHlPYmplY3QgKmRlY29kZWQ7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMqfHppOnV0Zl8zMl9sZV9kZWNvZGUiLAotCQkJICAmcGJ1ZiwgJmVycm9ycywgJmZpbmFsKSkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBidWYsICZlcnJvcnMsICZmaW5hbCkpCisgICAgICAgIHJldHVybiBOVUxMOwogICAgIGNvbnN1bWVkID0gcGJ1Zi5sZW47IC8qIFRoaXMgaXMgb3ZlcndyaXR0ZW4gdW5sZXNzIGZpbmFsIGlzIHRydWUuICovCiAgICAgZGVjb2RlZCA9IFB5VW5pY29kZV9EZWNvZGVVVEYzMlN0YXRlZnVsKHBidWYuYnVmLCBwYnVmLmxlbiwgZXJyb3JzLAotCQkJCQkmYnl0ZW9yZGVyLCBmaW5hbCA/IE5VTEwgOiAmY29uc3VtZWQpOwotCVB5QnVmZmVyX1JlbGVhc2UoJnBidWYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZieXRlb3JkZXIsIGZpbmFsID8gTlVMTCA6ICZjb25zdW1lZCk7CisgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnBidWYpOwogICAgIGlmIChkZWNvZGVkID09IE5VTEwpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIHJldHVybiBjb2RlY190dXBsZShkZWNvZGVkLCBjb25zdW1lZCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB1dGZfMzJfYmVfZGVjb2RlKFB5T2JqZWN0ICpzZWxmLAotCQkgUHlPYmplY3QgKmFyZ3MpCisgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICphcmdzKQogewotCVB5X2J1ZmZlciBwYnVmOworICAgICAgICBQeV9idWZmZXIgcGJ1ZjsKICAgICBjb25zdCBjaGFyICplcnJvcnMgPSBOVUxMOwogICAgIGludCBieXRlb3JkZXIgPSAxOwogICAgIGludCBmaW5hbCA9IDA7CkBAIC00MzYsMTQgKzQzNiwxNCBAQAogICAgIFB5T2JqZWN0ICpkZWNvZGVkOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzKnx6aTp1dGZfMzJfYmVfZGVjb2RlIiwKLQkJCSAgJnBidWYsICZlcnJvcnMsICZmaW5hbCkpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICZwYnVmLCAmZXJyb3JzLCAmZmluYWwpKQorICAgICAgICByZXR1cm4gTlVMTDsKICAgICBjb25zdW1lZCA9IHBidWYubGVuOyAvKiBUaGlzIGlzIG92ZXJ3cml0dGVuIHVubGVzcyBmaW5hbCBpcyB0cnVlLiAqLwogICAgIGRlY29kZWQgPSBQeVVuaWNvZGVfRGVjb2RlVVRGMzJTdGF0ZWZ1bChwYnVmLmJ1ZiwgcGJ1Zi5sZW4sIGVycm9ycywKLQkJCQkJJmJ5dGVvcmRlciwgZmluYWwgPyBOVUxMIDogJmNvbnN1bWVkKTsKLQlQeUJ1ZmZlcl9SZWxlYXNlKCZwYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnl0ZW9yZGVyLCBmaW5hbCA/IE5VTEwgOiAmY29uc3VtZWQpOworICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZwYnVmKTsKICAgICBpZiAoZGVjb2RlZCA9PSBOVUxMKQotCXJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICByZXR1cm4gY29kZWNfdHVwbGUoZGVjb2RlZCwgY29uc3VtZWQpOwogfQogCkBAIC00NTcsOSArNDU3LDkgQEAKIAogc3RhdGljIFB5T2JqZWN0ICoKIHV0Zl8zMl9leF9kZWNvZGUoUHlPYmplY3QgKnNlbGYsCi0JCSBQeU9iamVjdCAqYXJncykKKyAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlfYnVmZmVyIHBidWY7CisgICAgICAgIFB5X2J1ZmZlciBwYnVmOwogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAgICAgaW50IGJ5dGVvcmRlciA9IDA7CiAgICAgUHlPYmplY3QgKnVuaWNvZGUsICp0dXBsZTsKQEAgLTQ2NywxNCArNDY3LDE0IEBACiAgICAgUHlfc3NpemVfdCBjb25zdW1lZDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyp8emlpOnV0Zl8zMl9leF9kZWNvZGUiLAotCQkJICAmcGJ1ZiwgJmVycm9ycywgJmJ5dGVvcmRlciwgJmZpbmFsKSkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBidWYsICZlcnJvcnMsICZieXRlb3JkZXIsICZmaW5hbCkpCisgICAgICAgIHJldHVybiBOVUxMOwogICAgIGNvbnN1bWVkID0gcGJ1Zi5sZW47IC8qIFRoaXMgaXMgb3ZlcndyaXR0ZW4gdW5sZXNzIGZpbmFsIGlzIHRydWUuICovCiAgICAgdW5pY29kZSA9IFB5VW5pY29kZV9EZWNvZGVVVEYzMlN0YXRlZnVsKHBidWYuYnVmLCBwYnVmLmxlbiwgZXJyb3JzLAotCQkJCQkmYnl0ZW9yZGVyLCBmaW5hbCA/IE5VTEwgOiAmY29uc3VtZWQpOwotCVB5QnVmZmVyX1JlbGVhc2UoJnBidWYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZieXRlb3JkZXIsIGZpbmFsID8gTlVMTCA6ICZjb25zdW1lZCk7CisgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnBidWYpOwogICAgIGlmICh1bmljb2RlID09IE5VTEwpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIHR1cGxlID0gUHlfQnVpbGRWYWx1ZSgiT25pIiwgdW5pY29kZSwgY29uc3VtZWQsIGJ5dGVvcmRlcik7CiAgICAgUHlfREVDUkVGKHVuaWNvZGUpOwogICAgIHJldHVybiB0dXBsZTsKQEAgLTQ4MiwxMTQgKzQ4MiwxMTQgQEAKIAogc3RhdGljIFB5T2JqZWN0ICoKIHVuaWNvZGVfZXNjYXBlX2RlY29kZShQeU9iamVjdCAqc2VsZiwKLQkJICAgICBQeU9iamVjdCAqYXJncykKKyAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICphcmdzKQogewotCVB5X2J1ZmZlciBwYnVmOworICAgICAgICBQeV9idWZmZXIgcGJ1ZjsKICAgICBjb25zdCBjaGFyICplcnJvcnMgPSBOVUxMOwotCVB5T2JqZWN0ICp1bmljb2RlOworICAgICAgICBQeU9iamVjdCAqdW5pY29kZTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyp8ejp1bmljb2RlX2VzY2FwZV9kZWNvZGUiLAotCQkJICAmcGJ1ZiwgJmVycm9ycykpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICZwYnVmLCAmZXJyb3JzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQl1bmljb2RlID0gUHlVbmljb2RlX0RlY29kZVVuaWNvZGVFc2NhcGUocGJ1Zi5idWYsIHBidWYubGVuLCBlcnJvcnMpOwotCVB5QnVmZmVyX1JlbGVhc2UoJnBidWYpOwotCXJldHVybiBjb2RlY190dXBsZSh1bmljb2RlLCBwYnVmLmxlbik7CisgICAgICAgIHVuaWNvZGUgPSBQeVVuaWNvZGVfRGVjb2RlVW5pY29kZUVzY2FwZShwYnVmLmJ1ZiwgcGJ1Zi5sZW4sIGVycm9ycyk7CisgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnBidWYpOworICAgICAgICByZXR1cm4gY29kZWNfdHVwbGUodW5pY29kZSwgcGJ1Zi5sZW4pOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogcmF3X3VuaWNvZGVfZXNjYXBlX2RlY29kZShQeU9iamVjdCAqc2VsZiwKLQkJCVB5T2JqZWN0ICphcmdzKQorICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlfYnVmZmVyIHBidWY7CisgICAgICAgIFB5X2J1ZmZlciBwYnVmOwogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7Ci0JUHlPYmplY3QgKnVuaWNvZGU7CisgICAgICAgIFB5T2JqZWN0ICp1bmljb2RlOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzKnx6OnJhd191bmljb2RlX2VzY2FwZV9kZWNvZGUiLAotCQkJICAmcGJ1ZiwgJmVycm9ycykpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICZwYnVmLCAmZXJyb3JzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQl1bmljb2RlID0gUHlVbmljb2RlX0RlY29kZVJhd1VuaWNvZGVFc2NhcGUocGJ1Zi5idWYsIHBidWYubGVuLCBlcnJvcnMpOwotCVB5QnVmZmVyX1JlbGVhc2UoJnBidWYpOwotCXJldHVybiBjb2RlY190dXBsZSh1bmljb2RlLCBwYnVmLmxlbik7CisgICAgICAgIHVuaWNvZGUgPSBQeVVuaWNvZGVfRGVjb2RlUmF3VW5pY29kZUVzY2FwZShwYnVmLmJ1ZiwgcGJ1Zi5sZW4sIGVycm9ycyk7CisgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnBidWYpOworICAgICAgICByZXR1cm4gY29kZWNfdHVwbGUodW5pY29kZSwgcGJ1Zi5sZW4pOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbGF0aW5fMV9kZWNvZGUoUHlPYmplY3QgKnNlbGYsCi0JICAgICAgIFB5T2JqZWN0ICphcmdzKQorICAgICAgICAgICAgICAgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlfYnVmZmVyIHBidWY7Ci0JUHlPYmplY3QgKnVuaWNvZGU7CisgICAgICAgIFB5X2J1ZmZlciBwYnVmOworICAgICAgICBQeU9iamVjdCAqdW5pY29kZTsKICAgICBjb25zdCBjaGFyICplcnJvcnMgPSBOVUxMOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzKnx6OmxhdGluXzFfZGVjb2RlIiwKLQkJCSAgJnBidWYsICZlcnJvcnMpKQotCXJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAmcGJ1ZiwgJmVycm9ycykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JdW5pY29kZSA9IFB5VW5pY29kZV9EZWNvZGVMYXRpbjEocGJ1Zi5idWYsIHBidWYubGVuLCBlcnJvcnMpOwotCVB5QnVmZmVyX1JlbGVhc2UoJnBidWYpOwotCXJldHVybiBjb2RlY190dXBsZSh1bmljb2RlLCBwYnVmLmxlbik7CisgICAgICAgIHVuaWNvZGUgPSBQeVVuaWNvZGVfRGVjb2RlTGF0aW4xKHBidWYuYnVmLCBwYnVmLmxlbiwgZXJyb3JzKTsKKyAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmcGJ1Zik7CisgICAgICAgIHJldHVybiBjb2RlY190dXBsZSh1bmljb2RlLCBwYnVmLmxlbik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhc2NpaV9kZWNvZGUoUHlPYmplY3QgKnNlbGYsCi0JICAgICBQeU9iamVjdCAqYXJncykKKyAgICAgICAgICAgICBQeU9iamVjdCAqYXJncykKIHsKLQlQeV9idWZmZXIgcGJ1ZjsKLQlQeU9iamVjdCAqdW5pY29kZTsKKyAgICAgICAgUHlfYnVmZmVyIHBidWY7CisgICAgICAgIFB5T2JqZWN0ICp1bmljb2RlOwogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMqfHo6YXNjaWlfZGVjb2RlIiwKLQkJCSAgJnBidWYsICZlcnJvcnMpKQotCXJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAmcGJ1ZiwgJmVycm9ycykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JdW5pY29kZSA9IFB5VW5pY29kZV9EZWNvZGVBU0NJSShwYnVmLmJ1ZiwgcGJ1Zi5sZW4sIGVycm9ycyk7Ci0JUHlCdWZmZXJfUmVsZWFzZSgmcGJ1Zik7Ci0JcmV0dXJuIGNvZGVjX3R1cGxlKHVuaWNvZGUsIHBidWYubGVuKTsKKyAgICAgICAgdW5pY29kZSA9IFB5VW5pY29kZV9EZWNvZGVBU0NJSShwYnVmLmJ1ZiwgcGJ1Zi5sZW4sIGVycm9ycyk7CisgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnBidWYpOworICAgICAgICByZXR1cm4gY29kZWNfdHVwbGUodW5pY29kZSwgcGJ1Zi5sZW4pOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY2hhcm1hcF9kZWNvZGUoUHlPYmplY3QgKnNlbGYsCi0JICAgICAgIFB5T2JqZWN0ICphcmdzKQorICAgICAgICAgICAgICAgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlfYnVmZmVyIHBidWY7Ci0JUHlPYmplY3QgKnVuaWNvZGU7CisgICAgICAgIFB5X2J1ZmZlciBwYnVmOworICAgICAgICBQeU9iamVjdCAqdW5pY29kZTsKICAgICBjb25zdCBjaGFyICplcnJvcnMgPSBOVUxMOwogICAgIFB5T2JqZWN0ICptYXBwaW5nID0gTlVMTDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyp8ek86Y2hhcm1hcF9kZWNvZGUiLAotCQkJICAmcGJ1ZiwgJmVycm9ycywgJm1hcHBpbmcpKQotCXJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAmcGJ1ZiwgJmVycm9ycywgJm1hcHBpbmcpKQorICAgICAgICByZXR1cm4gTlVMTDsKICAgICBpZiAobWFwcGluZyA9PSBQeV9Ob25lKQotCW1hcHBpbmcgPSBOVUxMOworICAgICAgICBtYXBwaW5nID0gTlVMTDsKIAotCXVuaWNvZGUgPSBQeVVuaWNvZGVfRGVjb2RlQ2hhcm1hcChwYnVmLmJ1ZiwgcGJ1Zi5sZW4sIG1hcHBpbmcsIGVycm9ycyk7Ci0JUHlCdWZmZXJfUmVsZWFzZSgmcGJ1Zik7Ci0JcmV0dXJuIGNvZGVjX3R1cGxlKHVuaWNvZGUsIHBidWYubGVuKTsKKyAgICAgICAgdW5pY29kZSA9IFB5VW5pY29kZV9EZWNvZGVDaGFybWFwKHBidWYuYnVmLCBwYnVmLmxlbiwgbWFwcGluZywgZXJyb3JzKTsKKyAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmcGJ1Zik7CisgICAgICAgIHJldHVybiBjb2RlY190dXBsZSh1bmljb2RlLCBwYnVmLmxlbik7CiB9CiAKICNpZiBkZWZpbmVkKE1TX1dJTkRPV1MpICYmIGRlZmluZWQoSEFWRV9VU0FCTEVfV0NIQVJfVCkKIAogc3RhdGljIFB5T2JqZWN0ICoKIG1iY3NfZGVjb2RlKFB5T2JqZWN0ICpzZWxmLAotCSAgICBQeU9iamVjdCAqYXJncykKKyAgICAgICAgICAgIFB5T2JqZWN0ICphcmdzKQogewotCVB5X2J1ZmZlciBwYnVmOworICAgICAgICBQeV9idWZmZXIgcGJ1ZjsKICAgICBjb25zdCBjaGFyICplcnJvcnMgPSBOVUxMOwogICAgIGludCBmaW5hbCA9IDA7CiAgICAgUHlfc3NpemVfdCBjb25zdW1lZDsKICAgICBQeU9iamVjdCAqZGVjb2RlZCA9IE5VTEw7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMqfHppOm1iY3NfZGVjb2RlIiwKLQkJCSAgJnBidWYsICZlcnJvcnMsICZmaW5hbCkpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICZwYnVmLCAmZXJyb3JzLCAmZmluYWwpKQorICAgICAgICByZXR1cm4gTlVMTDsKICAgICBjb25zdW1lZCA9IHBidWYubGVuOwogCiAgICAgZGVjb2RlZCA9IFB5VW5pY29kZV9EZWNvZGVNQkNTU3RhdGVmdWwocGJ1Zi5idWYsIHBidWYubGVuLCBlcnJvcnMsCi0JCQkJCSAgIGZpbmFsID8gTlVMTCA6ICZjb25zdW1lZCk7Ci0JUHlCdWZmZXJfUmVsZWFzZSgmcGJ1Zik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgPyBOVUxMIDogJmNvbnN1bWVkKTsKKyAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmcGJ1Zik7CiAgICAgaWYgKGRlY29kZWQgPT0gTlVMTCkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgcmV0dXJuIGNvZGVjX3R1cGxlKGRlY29kZWQsIGNvbnN1bWVkKTsKIH0KIApAQCAtNTk5LDM5ICs1OTksMzkgQEAKIAogc3RhdGljIFB5T2JqZWN0ICoKIHJlYWRidWZmZXJfZW5jb2RlKFB5T2JqZWN0ICpzZWxmLAotCQkgIFB5T2JqZWN0ICphcmdzKQorICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmFyZ3MpCiB7CiAgICAgY29uc3QgY2hhciAqZGF0YTsKICAgICBQeV9zc2l6ZV90IHNpemU7CiAgICAgY29uc3QgY2hhciAqZXJyb3JzID0gTlVMTDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyN8ejpyZWFkYnVmZmVyX2VuY29kZSIsCi0JCQkgICZkYXRhLCAmc2l6ZSwgJmVycm9ycykpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhLCAmc2l6ZSwgJmVycm9ycykpCisgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgcmV0dXJuIGNvZGVjX3R1cGxlKFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGRhdGEsIHNpemUpLAotCQkgICAgICAgc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgIHNpemUpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY2hhcmJ1ZmZlcl9lbmNvZGUoUHlPYmplY3QgKnNlbGYsCi0JCSAgUHlPYmplY3QgKmFyZ3MpCisgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqYXJncykKIHsKICAgICBjb25zdCBjaGFyICpkYXRhOwogICAgIFB5X3NzaXplX3Qgc2l6ZTsKICAgICBjb25zdCBjaGFyICplcnJvcnMgPSBOVUxMOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ0I3x6OmNoYXJidWZmZXJfZW5jb2RlIiwKLQkJCSAgJmRhdGEsICZzaXplLCAmZXJyb3JzKSkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGEsICZzaXplLCAmZXJyb3JzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICByZXR1cm4gY29kZWNfdHVwbGUoUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoZGF0YSwgc2l6ZSksCi0JCSAgICAgICBzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB1bmljb2RlX2ludGVybmFsX2VuY29kZShQeU9iamVjdCAqc2VsZiwKLQkJCVB5T2JqZWN0ICphcmdzKQorICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmFyZ3MpCiB7CiAgICAgUHlPYmplY3QgKm9iajsKICAgICBjb25zdCBjaGFyICplcnJvcnMgPSBOVUxMOwpAQCAtNjM5LDY1ICs2MzksNjUgQEAKICAgICBQeV9zc2l6ZV90IHNpemU7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98ejp1bmljb2RlX2ludGVybmFsX2VuY29kZSIsCi0JCQkgICZvYmosICZlcnJvcnMpKQotCXJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAmb2JqLCAmZXJyb3JzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICBpZiAoUHlVbmljb2RlX0NoZWNrKG9iaikpIHsKLQlkYXRhID0gUHlVbmljb2RlX0FTX0RBVEEob2JqKTsKLQlzaXplID0gUHlVbmljb2RlX0dFVF9EQVRBX1NJWkUob2JqKTsKLQlyZXR1cm4gY29kZWNfdHVwbGUoUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoZGF0YSwgc2l6ZSksCi0JCQkgICBzaXplKTsKKyAgICAgICAgZGF0YSA9IFB5VW5pY29kZV9BU19EQVRBKG9iaik7CisgICAgICAgIHNpemUgPSBQeVVuaWNvZGVfR0VUX0RBVEFfU0laRShvYmopOworICAgICAgICByZXR1cm4gY29kZWNfdHVwbGUoUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoZGF0YSwgc2l6ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplKTsKICAgICB9CiAgICAgZWxzZSB7Ci0JaWYgKFB5T2JqZWN0X0FzUmVhZEJ1ZmZlcihvYmosIChjb25zdCB2b2lkICoqKSZkYXRhLCAmc2l6ZSkpCi0JICAgIHJldHVybiBOVUxMOwotCXJldHVybiBjb2RlY190dXBsZShQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShkYXRhLCBzaXplKSwKLQkJCSAgIHNpemUpOworICAgICAgICBpZiAoUHlPYmplY3RfQXNSZWFkQnVmZmVyKG9iaiwgKGNvbnN0IHZvaWQgKiopJmRhdGEsICZzaXplKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gY29kZWNfdHVwbGUoUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoZGF0YSwgc2l6ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplKTsKICAgICB9CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB1dGZfN19lbmNvZGUoUHlPYmplY3QgKnNlbGYsCi0JICAgIFB5T2JqZWN0ICphcmdzKQorICAgICAgICAgICAgUHlPYmplY3QgKmFyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnN0ciwgKnY7CiAgICAgY29uc3QgY2hhciAqZXJyb3JzID0gTlVMTDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3x6OnV0Zl83X2VuY29kZSIsCi0JCQkgICZzdHIsICZlcnJvcnMpKQotCXJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RyLCAmZXJyb3JzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICBzdHIgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChzdHIpOwogICAgIGlmIChzdHIgPT0gTlVMTCkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgdiA9IGNvZGVjX3R1cGxlKFB5VW5pY29kZV9FbmNvZGVVVEY3KFB5VW5pY29kZV9BU19VTklDT0RFKHN0ciksCi0JCQkJCSBQeVVuaWNvZGVfR0VUX1NJWkUoc3RyKSwKLQkJCQkJIDAsCi0JCQkJCSAwLAotCQkJCQkgZXJyb3JzKSwKLQkJICAgIFB5VW5pY29kZV9HRVRfU0laRShzdHIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0dFVF9TSVpFKHN0ciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycyksCisgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfU0laRShzdHIpKTsKICAgICBQeV9ERUNSRUYoc3RyKTsKICAgICByZXR1cm4gdjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHV0Zl84X2VuY29kZShQeU9iamVjdCAqc2VsZiwKLQkgICAgUHlPYmplY3QgKmFyZ3MpCisgICAgICAgICAgICBQeU9iamVjdCAqYXJncykKIHsKICAgICBQeU9iamVjdCAqc3RyLCAqdjsKICAgICBjb25zdCBjaGFyICplcnJvcnMgPSBOVUxMOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfHo6dXRmXzhfZW5jb2RlIiwKLQkJCSAgJnN0ciwgJmVycm9ycykpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHIsICZlcnJvcnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIHN0ciA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KHN0cik7CiAgICAgaWYgKHN0ciA9PSBOVUxMKQotCXJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB2ID0gY29kZWNfdHVwbGUoUHlVbmljb2RlX0VuY29kZVVURjgoUHlVbmljb2RlX0FTX1VOSUNPREUoc3RyKSwKLQkJCQkJIFB5VW5pY29kZV9HRVRfU0laRShzdHIpLAotCQkJCQkgZXJyb3JzKSwKLQkJICAgIFB5VW5pY29kZV9HRVRfU0laRShzdHIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0dFVF9TSVpFKHN0ciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycyksCisgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfU0laRShzdHIpKTsKICAgICBQeV9ERUNSRUYoc3RyKTsKICAgICByZXR1cm4gdjsKIH0KQEAgLTcxMSw3MCArNzExLDcwIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqCiB1dGZfMTZfZW5jb2RlKFB5T2JqZWN0ICpzZWxmLAotCSAgICBQeU9iamVjdCAqYXJncykKKyAgICAgICAgICAgIFB5T2JqZWN0ICphcmdzKQogewogICAgIFB5T2JqZWN0ICpzdHIsICp2OwogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAgICAgaW50IGJ5dGVvcmRlciA9IDA7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98emk6dXRmXzE2X2VuY29kZSIsCi0JCQkgICZzdHIsICZlcnJvcnMsICZieXRlb3JkZXIpKQotCXJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RyLCAmZXJyb3JzLCAmYnl0ZW9yZGVyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICBzdHIgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChzdHIpOwogICAgIGlmIChzdHIgPT0gTlVMTCkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgdiA9IGNvZGVjX3R1cGxlKFB5VW5pY29kZV9FbmNvZGVVVEYxNihQeVVuaWNvZGVfQVNfVU5JQ09ERShzdHIpLAotCQkJCQkgIFB5VW5pY29kZV9HRVRfU0laRShzdHIpLAotCQkJCQkgIGVycm9ycywKLQkJCQkJICBieXRlb3JkZXIpLAotCQkgICAgUHlVbmljb2RlX0dFVF9TSVpFKHN0cikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0dFVF9TSVpFKHN0ciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlb3JkZXIpLAorICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX1NJWkUoc3RyKSk7CiAgICAgUHlfREVDUkVGKHN0cik7CiAgICAgcmV0dXJuIHY7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB1dGZfMTZfbGVfZW5jb2RlKFB5T2JqZWN0ICpzZWxmLAotCQkgUHlPYmplY3QgKmFyZ3MpCisgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICphcmdzKQogewogICAgIFB5T2JqZWN0ICpzdHIsICp2OwogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98ejp1dGZfMTZfbGVfZW5jb2RlIiwKLQkJCSAgJnN0ciwgJmVycm9ycykpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHIsICZlcnJvcnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIHN0ciA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KHN0cik7CiAgICAgaWYgKHN0ciA9PSBOVUxMKQotCXJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB2ID0gY29kZWNfdHVwbGUoUHlVbmljb2RlX0VuY29kZVVURjE2KFB5VW5pY29kZV9BU19VTklDT0RFKHN0ciksCi0JCQkJCSAgICAgUHlVbmljb2RlX0dFVF9TSVpFKHN0ciksCi0JCQkJCSAgICAgZXJyb3JzLAotCQkJCQkgICAgIC0xKSwKLQkJICAgICAgIFB5VW5pY29kZV9HRVRfU0laRShzdHIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfU0laRShzdHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEpLAorICAgICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX1NJWkUoc3RyKSk7CiAgICAgUHlfREVDUkVGKHN0cik7CiAgICAgcmV0dXJuIHY7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB1dGZfMTZfYmVfZW5jb2RlKFB5T2JqZWN0ICpzZWxmLAotCQkgUHlPYmplY3QgKmFyZ3MpCisgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICphcmdzKQogewogICAgIFB5T2JqZWN0ICpzdHIsICp2OwogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98ejp1dGZfMTZfYmVfZW5jb2RlIiwKLQkJCSAgJnN0ciwgJmVycm9ycykpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHIsICZlcnJvcnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIHN0ciA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KHN0cik7CiAgICAgaWYgKHN0ciA9PSBOVUxMKQotCXJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB2ID0gY29kZWNfdHVwbGUoUHlVbmljb2RlX0VuY29kZVVURjE2KFB5VW5pY29kZV9BU19VTklDT0RFKHN0ciksCi0JCQkJCSAgUHlVbmljb2RlX0dFVF9TSVpFKHN0ciksCi0JCQkJCSAgZXJyb3JzLAotCQkJCQkgICsxKSwKLQkJICAgIFB5VW5pY29kZV9HRVRfU0laRShzdHIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfU0laRShzdHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKzEpLAorICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX1NJWkUoc3RyKSk7CiAgICAgUHlfREVDUkVGKHN0cik7CiAgICAgcmV0dXJuIHY7CiB9CkBAIC03ODgsMTg2ICs3ODgsMTg2IEBACiAKIHN0YXRpYyBQeU9iamVjdCAqCiB1dGZfMzJfZW5jb2RlKFB5T2JqZWN0ICpzZWxmLAotCSAgICBQeU9iamVjdCAqYXJncykKKyAgICAgICAgICAgIFB5T2JqZWN0ICphcmdzKQogewogICAgIFB5T2JqZWN0ICpzdHIsICp2OwogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAgICAgaW50IGJ5dGVvcmRlciA9IDA7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98emk6dXRmXzMyX2VuY29kZSIsCi0JCQkgICZzdHIsICZlcnJvcnMsICZieXRlb3JkZXIpKQotCXJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RyLCAmZXJyb3JzLCAmYnl0ZW9yZGVyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICBzdHIgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChzdHIpOwogICAgIGlmIChzdHIgPT0gTlVMTCkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgdiA9IGNvZGVjX3R1cGxlKFB5VW5pY29kZV9FbmNvZGVVVEYzMihQeVVuaWNvZGVfQVNfVU5JQ09ERShzdHIpLAotCQkJCQkgIFB5VW5pY29kZV9HRVRfU0laRShzdHIpLAotCQkJCQkgIGVycm9ycywKLQkJCQkJICBieXRlb3JkZXIpLAotCQkgICAgUHlVbmljb2RlX0dFVF9TSVpFKHN0cikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0dFVF9TSVpFKHN0ciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlb3JkZXIpLAorICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX1NJWkUoc3RyKSk7CiAgICAgUHlfREVDUkVGKHN0cik7CiAgICAgcmV0dXJuIHY7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB1dGZfMzJfbGVfZW5jb2RlKFB5T2JqZWN0ICpzZWxmLAotCQkgUHlPYmplY3QgKmFyZ3MpCisgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICphcmdzKQogewogICAgIFB5T2JqZWN0ICpzdHIsICp2OwogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98ejp1dGZfMzJfbGVfZW5jb2RlIiwKLQkJCSAgJnN0ciwgJmVycm9ycykpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHIsICZlcnJvcnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIHN0ciA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KHN0cik7CiAgICAgaWYgKHN0ciA9PSBOVUxMKQotCXJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB2ID0gY29kZWNfdHVwbGUoUHlVbmljb2RlX0VuY29kZVVURjMyKFB5VW5pY29kZV9BU19VTklDT0RFKHN0ciksCi0JCQkJCSAgICAgUHlVbmljb2RlX0dFVF9TSVpFKHN0ciksCi0JCQkJCSAgICAgZXJyb3JzLAotCQkJCQkgICAgIC0xKSwKLQkJICAgICAgIFB5VW5pY29kZV9HRVRfU0laRShzdHIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfU0laRShzdHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEpLAorICAgICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX1NJWkUoc3RyKSk7CiAgICAgUHlfREVDUkVGKHN0cik7CiAgICAgcmV0dXJuIHY7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB1dGZfMzJfYmVfZW5jb2RlKFB5T2JqZWN0ICpzZWxmLAotCQkgUHlPYmplY3QgKmFyZ3MpCisgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICphcmdzKQogewogICAgIFB5T2JqZWN0ICpzdHIsICp2OwogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98ejp1dGZfMzJfYmVfZW5jb2RlIiwKLQkJCSAgJnN0ciwgJmVycm9ycykpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHIsICZlcnJvcnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIHN0ciA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KHN0cik7CiAgICAgaWYgKHN0ciA9PSBOVUxMKQotCXJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB2ID0gY29kZWNfdHVwbGUoUHlVbmljb2RlX0VuY29kZVVURjMyKFB5VW5pY29kZV9BU19VTklDT0RFKHN0ciksCi0JCQkJCSAgUHlVbmljb2RlX0dFVF9TSVpFKHN0ciksCi0JCQkJCSAgZXJyb3JzLAotCQkJCQkgICsxKSwKLQkJICAgIFB5VW5pY29kZV9HRVRfU0laRShzdHIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfU0laRShzdHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKzEpLAorICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX1NJWkUoc3RyKSk7CiAgICAgUHlfREVDUkVGKHN0cik7CiAgICAgcmV0dXJuIHY7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB1bmljb2RlX2VzY2FwZV9lbmNvZGUoUHlPYmplY3QgKnNlbGYsCi0JCSAgICAgUHlPYmplY3QgKmFyZ3MpCisgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqYXJncykKIHsKICAgICBQeU9iamVjdCAqc3RyLCAqdjsKICAgICBjb25zdCBjaGFyICplcnJvcnMgPSBOVUxMOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfHo6dW5pY29kZV9lc2NhcGVfZW5jb2RlIiwKLQkJCSAgJnN0ciwgJmVycm9ycykpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHIsICZlcnJvcnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIHN0ciA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KHN0cik7CiAgICAgaWYgKHN0ciA9PSBOVUxMKQotCXJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB2ID0gY29kZWNfdHVwbGUoUHlVbmljb2RlX0VuY29kZVVuaWNvZGVFc2NhcGUoUHlVbmljb2RlX0FTX1VOSUNPREUoc3RyKSwKLQkJCQkJCSAgUHlVbmljb2RlX0dFVF9TSVpFKHN0cikpLAotCQkgICAgUHlVbmljb2RlX0dFVF9TSVpFKHN0cikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX1NJWkUoc3RyKSksCisgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfU0laRShzdHIpKTsKICAgICBQeV9ERUNSRUYoc3RyKTsKICAgICByZXR1cm4gdjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHJhd191bmljb2RlX2VzY2FwZV9lbmNvZGUoUHlPYmplY3QgKnNlbGYsCi0JCQlQeU9iamVjdCAqYXJncykKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICphcmdzKQogewogICAgIFB5T2JqZWN0ICpzdHIsICp2OwogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98ejpyYXdfdW5pY29kZV9lc2NhcGVfZW5jb2RlIiwKLQkJCSAgJnN0ciwgJmVycm9ycykpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHIsICZlcnJvcnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIHN0ciA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KHN0cik7CiAgICAgaWYgKHN0ciA9PSBOVUxMKQotCXJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB2ID0gY29kZWNfdHVwbGUoUHlVbmljb2RlX0VuY29kZVJhd1VuaWNvZGVFc2NhcGUoCi0JCQkgICAgICAgUHlVbmljb2RlX0FTX1VOSUNPREUoc3RyKSwKLQkJCSAgICAgICBQeVVuaWNvZGVfR0VUX1NJWkUoc3RyKSksCi0JCSAgICBQeVVuaWNvZGVfR0VUX1NJWkUoc3RyKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0FTX1VOSUNPREUoc3RyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX1NJWkUoc3RyKSksCisgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfU0laRShzdHIpKTsKICAgICBQeV9ERUNSRUYoc3RyKTsKICAgICByZXR1cm4gdjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGxhdGluXzFfZW5jb2RlKFB5T2JqZWN0ICpzZWxmLAotCSAgICAgICBQeU9iamVjdCAqYXJncykKKyAgICAgICAgICAgICAgIFB5T2JqZWN0ICphcmdzKQogewogICAgIFB5T2JqZWN0ICpzdHIsICp2OwogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98ejpsYXRpbl8xX2VuY29kZSIsCi0JCQkgICZzdHIsICZlcnJvcnMpKQotCXJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RyLCAmZXJyb3JzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICBzdHIgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChzdHIpOwogICAgIGlmIChzdHIgPT0gTlVMTCkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgdiA9IGNvZGVjX3R1cGxlKFB5VW5pY29kZV9FbmNvZGVMYXRpbjEoCi0JCQkgICAgICAgUHlVbmljb2RlX0FTX1VOSUNPREUoc3RyKSwKLQkJCSAgICAgICBQeVVuaWNvZGVfR0VUX1NJWkUoc3RyKSwKLQkJCSAgICAgICBlcnJvcnMpLAotCQkgICAgUHlVbmljb2RlX0dFVF9TSVpFKHN0cikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9BU19VTklDT0RFKHN0ciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0dFVF9TSVpFKHN0ciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzKSwKKyAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0dFVF9TSVpFKHN0cikpOwogICAgIFB5X0RFQ1JFRihzdHIpOwogICAgIHJldHVybiB2OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYXNjaWlfZW5jb2RlKFB5T2JqZWN0ICpzZWxmLAotCSAgICAgUHlPYmplY3QgKmFyZ3MpCisgICAgICAgICAgICAgUHlPYmplY3QgKmFyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnN0ciwgKnY7CiAgICAgY29uc3QgY2hhciAqZXJyb3JzID0gTlVMTDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3x6OmFzY2lpX2VuY29kZSIsCi0JCQkgICZzdHIsICZlcnJvcnMpKQotCXJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RyLCAmZXJyb3JzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICBzdHIgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChzdHIpOwogICAgIGlmIChzdHIgPT0gTlVMTCkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgdiA9IGNvZGVjX3R1cGxlKFB5VW5pY29kZV9FbmNvZGVBU0NJSSgKLQkJCSAgICAgICBQeVVuaWNvZGVfQVNfVU5JQ09ERShzdHIpLAotCQkJICAgICAgIFB5VW5pY29kZV9HRVRfU0laRShzdHIpLAotCQkJICAgICAgIGVycm9ycyksCi0JCSAgICBQeVVuaWNvZGVfR0VUX1NJWkUoc3RyKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0FTX1VOSUNPREUoc3RyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX1NJWkUoc3RyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMpLAorICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX1NJWkUoc3RyKSk7CiAgICAgUHlfREVDUkVGKHN0cik7CiAgICAgcmV0dXJuIHY7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjaGFybWFwX2VuY29kZShQeU9iamVjdCAqc2VsZiwKLQkgICAgIFB5T2JqZWN0ICphcmdzKQorICAgICAgICAgICAgIFB5T2JqZWN0ICphcmdzKQogewogICAgIFB5T2JqZWN0ICpzdHIsICp2OwogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAgICAgUHlPYmplY3QgKm1hcHBpbmcgPSBOVUxMOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfHpPOmNoYXJtYXBfZW5jb2RlIiwKLQkJCSAgJnN0ciwgJmVycm9ycywgJm1hcHBpbmcpKQotCXJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RyLCAmZXJyb3JzLCAmbWFwcGluZykpCisgICAgICAgIHJldHVybiBOVUxMOwogICAgIGlmIChtYXBwaW5nID09IFB5X05vbmUpCi0JbWFwcGluZyA9IE5VTEw7CisgICAgICAgIG1hcHBpbmcgPSBOVUxMOwogCiAgICAgc3RyID0gUHlVbmljb2RlX0Zyb21PYmplY3Qoc3RyKTsKICAgICBpZiAoc3RyID09IE5VTEwpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIHYgPSBjb2RlY190dXBsZShQeVVuaWNvZGVfRW5jb2RlQ2hhcm1hcCgKLQkJCSAgICAgICBQeVVuaWNvZGVfQVNfVU5JQ09ERShzdHIpLAotCQkJICAgICAgIFB5VW5pY29kZV9HRVRfU0laRShzdHIpLAotCQkJICAgICAgIG1hcHBpbmcsCi0JCQkgICAgICAgZXJyb3JzKSwKLQkJICAgIFB5VW5pY29kZV9HRVRfU0laRShzdHIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfQVNfVU5JQ09ERShzdHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfU0laRShzdHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzKSwKKyAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0dFVF9TSVpFKHN0cikpOwogICAgIFB5X0RFQ1JFRihzdHIpOwogICAgIHJldHVybiB2OwogfQpAQCAtOTg1LDIzICs5ODUsMjMgQEAKIAogc3RhdGljIFB5T2JqZWN0ICoKIG1iY3NfZW5jb2RlKFB5T2JqZWN0ICpzZWxmLAotCSAgICBQeU9iamVjdCAqYXJncykKKyAgICAgICAgICAgIFB5T2JqZWN0ICphcmdzKQogewogICAgIFB5T2JqZWN0ICpzdHIsICp2OwogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98ejptYmNzX2VuY29kZSIsCi0JCQkgICZzdHIsICZlcnJvcnMpKQotCXJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RyLCAmZXJyb3JzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICBzdHIgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChzdHIpOwogICAgIGlmIChzdHIgPT0gTlVMTCkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgdiA9IGNvZGVjX3R1cGxlKFB5VW5pY29kZV9FbmNvZGVNQkNTKAotCQkJICAgICAgIFB5VW5pY29kZV9BU19VTklDT0RFKHN0ciksCi0JCQkgICAgICAgUHlVbmljb2RlX0dFVF9TSVpFKHN0ciksCi0JCQkgICAgICAgZXJyb3JzKSwKLQkJICAgIFB5VW5pY29kZV9HRVRfU0laRShzdHIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfQVNfVU5JQ09ERShzdHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfU0laRShzdHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycyksCisgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfU0laRShzdHIpKTsKICAgICBQeV9ERUNSRUYoc3RyKTsKICAgICByZXR1cm4gdjsKIH0KQEAgLTEwMjYsOCArMTAyNiw4IEBACiAgICAgUHlPYmplY3QgKmhhbmRsZXI7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInNPOnJlZ2lzdGVyX2Vycm9yIiwKLQkJCSAgJm5hbWUsICZoYW5kbGVyKSkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWUsICZoYW5kbGVyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgaWYgKFB5Q29kZWNfUmVnaXN0ZXJFcnJvcihuYW1lLCBoYW5kbGVyKSkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgUHlfUkVUVVJOX05PTkU7CkBAIC0xMDQ0LDY4ICsxMDQ0LDY4IEBACiAgICAgY29uc3QgY2hhciAqbmFtZTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczpsb29rdXBfZXJyb3IiLAotCQkJICAmbmFtZSkpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgcmV0dXJuIFB5Q29kZWNfTG9va3VwRXJyb3IobmFtZSk7CiB9CiAKIC8qIC0tLSBNb2R1bGUgQVBJIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiBzdGF0aWMgUHlNZXRob2REZWYgX2NvZGVjc19mdW5jdGlvbnNbXSA9IHsKLSAgICB7InJlZ2lzdGVyIiwJCWNvZGVjX3JlZ2lzdGVyLAkJCU1FVEhfTywKKyAgICB7InJlZ2lzdGVyIiwgICAgICAgICAgICAgICAgY29kZWNfcmVnaXN0ZXIsICAgICAgICAgICAgICAgICBNRVRIX08sCiAgICAgICAgIHJlZ2lzdGVyX19kb2NfX30sCi0gICAgeyJsb29rdXAiLAkJCWNvZGVjX2xvb2t1cCwgCQkJTUVUSF9WQVJBUkdTLAorICAgIHsibG9va3VwIiwgICAgICAgICAgICAgICAgICBjb2RlY19sb29rdXAsICAgICAgICAgICAgICAgICAgIE1FVEhfVkFSQVJHUywKICAgICAgICAgbG9va3VwX19kb2NfX30sCi0gICAgeyJlbmNvZGUiLAkJCWNvZGVjX2VuY29kZSwJCQlNRVRIX1ZBUkFSR1MsCi0JZW5jb2RlX19kb2NfX30sCi0gICAgeyJkZWNvZGUiLAkJCWNvZGVjX2RlY29kZSwJCQlNRVRIX1ZBUkFSR1MsCi0JZGVjb2RlX19kb2NfX30sCi0gICAgeyJlc2NhcGVfZW5jb2RlIiwJCWVzY2FwZV9lbmNvZGUsCQkJTUVUSF9WQVJBUkdTfSwKLSAgICB7ImVzY2FwZV9kZWNvZGUiLAkJZXNjYXBlX2RlY29kZSwJCQlNRVRIX1ZBUkFSR1N9LAorICAgIHsiZW5jb2RlIiwgICAgICAgICAgICAgICAgICBjb2RlY19lbmNvZGUsICAgICAgICAgICAgICAgICAgIE1FVEhfVkFSQVJHUywKKyAgICAgICAgZW5jb2RlX19kb2NfX30sCisgICAgeyJkZWNvZGUiLCAgICAgICAgICAgICAgICAgIGNvZGVjX2RlY29kZSwgICAgICAgICAgICAgICAgICAgTUVUSF9WQVJBUkdTLAorICAgICAgICBkZWNvZGVfX2RvY19ffSwKKyAgICB7ImVzY2FwZV9lbmNvZGUiLCAgICAgICAgICAgZXNjYXBlX2VuY29kZSwgICAgICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsiZXNjYXBlX2RlY29kZSIsICAgICAgICAgICBlc2NhcGVfZGVjb2RlLCAgICAgICAgICAgICAgICAgIE1FVEhfVkFSQVJHU30sCiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotICAgIHsidXRmXzhfZW5jb2RlIiwJCXV0Zl84X2VuY29kZSwJCQlNRVRIX1ZBUkFSR1N9LAotICAgIHsidXRmXzhfZGVjb2RlIiwJCXV0Zl84X2RlY29kZSwJCQlNRVRIX1ZBUkFSR1N9LAotICAgIHsidXRmXzdfZW5jb2RlIiwJCXV0Zl83X2VuY29kZSwJCQlNRVRIX1ZBUkFSR1N9LAotICAgIHsidXRmXzdfZGVjb2RlIiwJCXV0Zl83X2RlY29kZSwJCQlNRVRIX1ZBUkFSR1N9LAotICAgIHsidXRmXzE2X2VuY29kZSIsCQl1dGZfMTZfZW5jb2RlLAkJCU1FVEhfVkFSQVJHU30sCi0gICAgeyJ1dGZfMTZfbGVfZW5jb2RlIiwJdXRmXzE2X2xlX2VuY29kZSwJCU1FVEhfVkFSQVJHU30sCi0gICAgeyJ1dGZfMTZfYmVfZW5jb2RlIiwJdXRmXzE2X2JlX2VuY29kZSwJCU1FVEhfVkFSQVJHU30sCi0gICAgeyJ1dGZfMTZfZGVjb2RlIiwJCXV0Zl8xNl9kZWNvZGUsCQkJTUVUSF9WQVJBUkdTfSwKLSAgICB7InV0Zl8xNl9sZV9kZWNvZGUiLAl1dGZfMTZfbGVfZGVjb2RlLAkJTUVUSF9WQVJBUkdTfSwKLSAgICB7InV0Zl8xNl9iZV9kZWNvZGUiLAl1dGZfMTZfYmVfZGVjb2RlLAkJTUVUSF9WQVJBUkdTfSwKLSAgICB7InV0Zl8xNl9leF9kZWNvZGUiLAl1dGZfMTZfZXhfZGVjb2RlLAkJTUVUSF9WQVJBUkdTfSwKLSAgICB7InV0Zl8zMl9lbmNvZGUiLAkJdXRmXzMyX2VuY29kZSwJCQlNRVRIX1ZBUkFSR1N9LAotICAgIHsidXRmXzMyX2xlX2VuY29kZSIsCXV0Zl8zMl9sZV9lbmNvZGUsCQlNRVRIX1ZBUkFSR1N9LAotICAgIHsidXRmXzMyX2JlX2VuY29kZSIsCXV0Zl8zMl9iZV9lbmNvZGUsCQlNRVRIX1ZBUkFSR1N9LAotICAgIHsidXRmXzMyX2RlY29kZSIsCQl1dGZfMzJfZGVjb2RlLAkJCU1FVEhfVkFSQVJHU30sCi0gICAgeyJ1dGZfMzJfbGVfZGVjb2RlIiwJdXRmXzMyX2xlX2RlY29kZSwJCU1FVEhfVkFSQVJHU30sCi0gICAgeyJ1dGZfMzJfYmVfZGVjb2RlIiwJdXRmXzMyX2JlX2RlY29kZSwJCU1FVEhfVkFSQVJHU30sCi0gICAgeyJ1dGZfMzJfZXhfZGVjb2RlIiwJdXRmXzMyX2V4X2RlY29kZSwJCU1FVEhfVkFSQVJHU30sCi0gICAgeyJ1bmljb2RlX2VzY2FwZV9lbmNvZGUiLAl1bmljb2RlX2VzY2FwZV9lbmNvZGUsCQlNRVRIX1ZBUkFSR1N9LAotICAgIHsidW5pY29kZV9lc2NhcGVfZGVjb2RlIiwJdW5pY29kZV9lc2NhcGVfZGVjb2RlLAkJTUVUSF9WQVJBUkdTfSwKLSAgICB7InVuaWNvZGVfaW50ZXJuYWxfZW5jb2RlIiwJdW5pY29kZV9pbnRlcm5hbF9lbmNvZGUsCU1FVEhfVkFSQVJHU30sCi0gICAgeyJ1bmljb2RlX2ludGVybmFsX2RlY29kZSIsCXVuaWNvZGVfaW50ZXJuYWxfZGVjb2RlLAlNRVRIX1ZBUkFSR1N9LAotICAgIHsicmF3X3VuaWNvZGVfZXNjYXBlX2VuY29kZSIsIHJhd191bmljb2RlX2VzY2FwZV9lbmNvZGUsCU1FVEhfVkFSQVJHU30sCi0gICAgeyJyYXdfdW5pY29kZV9lc2NhcGVfZGVjb2RlIiwgcmF3X3VuaWNvZGVfZXNjYXBlX2RlY29kZSwJTUVUSF9WQVJBUkdTfSwKLSAgICB7ImxhdGluXzFfZW5jb2RlIiwgCQlsYXRpbl8xX2VuY29kZSwJCQlNRVRIX1ZBUkFSR1N9LAotICAgIHsibGF0aW5fMV9kZWNvZGUiLCAJCWxhdGluXzFfZGVjb2RlLAkJCU1FVEhfVkFSQVJHU30sCi0gICAgeyJhc2NpaV9lbmNvZGUiLCAJCWFzY2lpX2VuY29kZSwJCQlNRVRIX1ZBUkFSR1N9LAotICAgIHsiYXNjaWlfZGVjb2RlIiwgCQlhc2NpaV9kZWNvZGUsCQkJTUVUSF9WQVJBUkdTfSwKLSAgICB7ImNoYXJtYXBfZW5jb2RlIiwgCQljaGFybWFwX2VuY29kZSwJCQlNRVRIX1ZBUkFSR1N9LAotICAgIHsiY2hhcm1hcF9kZWNvZGUiLCAJCWNoYXJtYXBfZGVjb2RlLAkJCU1FVEhfVkFSQVJHU30sCi0gICAgeyJjaGFybWFwX2J1aWxkIiwgCQljaGFybWFwX2J1aWxkLAkJCU1FVEhfVkFSQVJHU30sCi0gICAgeyJyZWFkYnVmZmVyX2VuY29kZSIsCXJlYWRidWZmZXJfZW5jb2RlLAkJTUVUSF9WQVJBUkdTfSwKLSAgICB7ImNoYXJidWZmZXJfZW5jb2RlIiwJY2hhcmJ1ZmZlcl9lbmNvZGUsCQlNRVRIX1ZBUkFSR1N9LAorICAgIHsidXRmXzhfZW5jb2RlIiwgICAgICAgICAgICB1dGZfOF9lbmNvZGUsICAgICAgICAgICAgICAgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJ1dGZfOF9kZWNvZGUiLCAgICAgICAgICAgIHV0Zl84X2RlY29kZSwgICAgICAgICAgICAgICAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7InV0Zl83X2VuY29kZSIsICAgICAgICAgICAgdXRmXzdfZW5jb2RlLCAgICAgICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsidXRmXzdfZGVjb2RlIiwgICAgICAgICAgICB1dGZfN19kZWNvZGUsICAgICAgICAgICAgICAgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJ1dGZfMTZfZW5jb2RlIiwgICAgICAgICAgIHV0Zl8xNl9lbmNvZGUsICAgICAgICAgICAgICAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7InV0Zl8xNl9sZV9lbmNvZGUiLCAgICAgICAgdXRmXzE2X2xlX2VuY29kZSwgICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsidXRmXzE2X2JlX2VuY29kZSIsICAgICAgICB1dGZfMTZfYmVfZW5jb2RlLCAgICAgICAgICAgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJ1dGZfMTZfZGVjb2RlIiwgICAgICAgICAgIHV0Zl8xNl9kZWNvZGUsICAgICAgICAgICAgICAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7InV0Zl8xNl9sZV9kZWNvZGUiLCAgICAgICAgdXRmXzE2X2xlX2RlY29kZSwgICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsidXRmXzE2X2JlX2RlY29kZSIsICAgICAgICB1dGZfMTZfYmVfZGVjb2RlLCAgICAgICAgICAgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJ1dGZfMTZfZXhfZGVjb2RlIiwgICAgICAgIHV0Zl8xNl9leF9kZWNvZGUsICAgICAgICAgICAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7InV0Zl8zMl9lbmNvZGUiLCAgICAgICAgICAgdXRmXzMyX2VuY29kZSwgICAgICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsidXRmXzMyX2xlX2VuY29kZSIsICAgICAgICB1dGZfMzJfbGVfZW5jb2RlLCAgICAgICAgICAgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJ1dGZfMzJfYmVfZW5jb2RlIiwgICAgICAgIHV0Zl8zMl9iZV9lbmNvZGUsICAgICAgICAgICAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7InV0Zl8zMl9kZWNvZGUiLCAgICAgICAgICAgdXRmXzMyX2RlY29kZSwgICAgICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsidXRmXzMyX2xlX2RlY29kZSIsICAgICAgICB1dGZfMzJfbGVfZGVjb2RlLCAgICAgICAgICAgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJ1dGZfMzJfYmVfZGVjb2RlIiwgICAgICAgIHV0Zl8zMl9iZV9kZWNvZGUsICAgICAgICAgICAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7InV0Zl8zMl9leF9kZWNvZGUiLCAgICAgICAgdXRmXzMyX2V4X2RlY29kZSwgICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsidW5pY29kZV9lc2NhcGVfZW5jb2RlIiwgICB1bmljb2RlX2VzY2FwZV9lbmNvZGUsICAgICAgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJ1bmljb2RlX2VzY2FwZV9kZWNvZGUiLCAgIHVuaWNvZGVfZXNjYXBlX2RlY29kZSwgICAgICAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7InVuaWNvZGVfaW50ZXJuYWxfZW5jb2RlIiwgdW5pY29kZV9pbnRlcm5hbF9lbmNvZGUsICAgICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsidW5pY29kZV9pbnRlcm5hbF9kZWNvZGUiLCB1bmljb2RlX2ludGVybmFsX2RlY29kZSwgICAgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJyYXdfdW5pY29kZV9lc2NhcGVfZW5jb2RlIiwgcmF3X3VuaWNvZGVfZXNjYXBlX2VuY29kZSwgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7InJhd191bmljb2RlX2VzY2FwZV9kZWNvZGUiLCByYXdfdW5pY29kZV9lc2NhcGVfZGVjb2RlLCAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsibGF0aW5fMV9lbmNvZGUiLCAgICAgICAgICBsYXRpbl8xX2VuY29kZSwgICAgICAgICAgICAgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJsYXRpbl8xX2RlY29kZSIsICAgICAgICAgIGxhdGluXzFfZGVjb2RlLCAgICAgICAgICAgICAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImFzY2lpX2VuY29kZSIsICAgICAgICAgICAgYXNjaWlfZW5jb2RlLCAgICAgICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsiYXNjaWlfZGVjb2RlIiwgICAgICAgICAgICBhc2NpaV9kZWNvZGUsICAgICAgICAgICAgICAgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJjaGFybWFwX2VuY29kZSIsICAgICAgICAgIGNoYXJtYXBfZW5jb2RlLCAgICAgICAgICAgICAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImNoYXJtYXBfZGVjb2RlIiwgICAgICAgICAgY2hhcm1hcF9kZWNvZGUsICAgICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsiY2hhcm1hcF9idWlsZCIsICAgICAgICAgICBjaGFybWFwX2J1aWxkLCAgICAgICAgICAgICAgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJyZWFkYnVmZmVyX2VuY29kZSIsICAgICAgIHJlYWRidWZmZXJfZW5jb2RlLCAgICAgICAgICAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImNoYXJidWZmZXJfZW5jb2RlIiwgICAgICAgY2hhcmJ1ZmZlcl9lbmNvZGUsICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1N9LAogI2lmIGRlZmluZWQoTVNfV0lORE9XUykgJiYgZGVmaW5lZChIQVZFX1VTQUJMRV9XQ0hBUl9UKQotICAgIHsibWJjc19lbmNvZGUiLCAJCW1iY3NfZW5jb2RlLAkJCU1FVEhfVkFSQVJHU30sCi0gICAgeyJtYmNzX2RlY29kZSIsIAkJbWJjc19kZWNvZGUsCQkJTUVUSF9WQVJBUkdTfSwKKyAgICB7Im1iY3NfZW5jb2RlIiwgICAgICAgICAgICAgbWJjc19lbmNvZGUsICAgICAgICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsibWJjc19kZWNvZGUiLCAgICAgICAgICAgICBtYmNzX2RlY29kZSwgICAgICAgICAgICAgICAgICAgIE1FVEhfVkFSQVJHU30sCiAjZW5kaWYKICNlbmRpZiAvKiBQeV9VU0lOR19VTklDT0RFICovCi0gICAgeyJyZWdpc3Rlcl9lcnJvciIsIAkJcmVnaXN0ZXJfZXJyb3IsCQkJTUVUSF9WQVJBUkdTLAorICAgIHsicmVnaXN0ZXJfZXJyb3IiLCAgICAgICAgICByZWdpc3Rlcl9lcnJvciwgICAgICAgICAgICAgICAgIE1FVEhfVkFSQVJHUywKICAgICAgICAgcmVnaXN0ZXJfZXJyb3JfX2RvY19ffSwKLSAgICB7Imxvb2t1cF9lcnJvciIsIAkJbG9va3VwX2Vycm9yLAkJCU1FVEhfVkFSQVJHUywKKyAgICB7Imxvb2t1cF9lcnJvciIsICAgICAgICAgICAgbG9va3VwX2Vycm9yLCAgICAgICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1MsCiAgICAgICAgIGxvb2t1cF9lcnJvcl9fZG9jX199LAotICAgIHtOVUxMLCBOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7TlVMTCwgTlVMTH0gICAgICAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIFB5TU9ESU5JVF9GVU5DCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jb2xsZWN0aW9uc21vZHVsZS5jIGIvTW9kdWxlcy9fY29sbGVjdGlvbnNtb2R1bGUuYwppbmRleCA0MmNmZTZiLi42YWFkZWMxIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jb2xsZWN0aW9uc21vZHVsZS5jCisrKyBiL01vZHVsZXMvX2NvbGxlY3Rpb25zbW9kdWxlLmMKQEAgLTQ2LDkgKzQ2LDkgQEAKICAqLwogCiB0eXBlZGVmIHN0cnVjdCBCTE9DSyB7Ci0Jc3RydWN0IEJMT0NLICpsZWZ0bGluazsKLQlzdHJ1Y3QgQkxPQ0sgKnJpZ2h0bGluazsKLQlQeU9iamVjdCAqZGF0YVtCTE9DS0xFTl07CisgICAgc3RydWN0IEJMT0NLICpsZWZ0bGluazsKKyAgICBzdHJ1Y3QgQkxPQ0sgKnJpZ2h0bGluazsKKyAgICBQeU9iamVjdCAqZGF0YVtCTE9DS0xFTl07CiB9IGJsb2NrOwogCiAjZGVmaW5lIE1BWEZSRUVCTE9DS1MgMTAKQEAgLTU3LDcxICs1Nyw3MSBAQAogCiBzdGF0aWMgYmxvY2sgKgogbmV3YmxvY2soYmxvY2sgKmxlZnRsaW5rLCBibG9jayAqcmlnaHRsaW5rLCBQeV9zc2l6ZV90IGxlbikgewotCWJsb2NrICpiOwotCS8qIFRvIHByZXZlbnQgbGVuIGZyb20gb3ZlcmZsb3dpbmcgUFlfU1NJWkVfVF9NQVggb24gNjQtYml0IG1hY2hpbmVzLCB3ZQotCSAqIHJlZnVzZSB0byBhbGxvY2F0ZSBuZXcgYmxvY2tzIGlmIHRoZSBjdXJyZW50IGxlbiBpcyBkYW5nZXJvdXNseQotCSAqIGNsb3NlLiAgVGhlcmUgaXMgc29tZSBleHRyYSBtYXJnaW4gdG8gcHJldmVudCBzcHVyaW91cyBhcml0aG1ldGljCi0JICogb3ZlcmZsb3dzIGF0IHZhcmlvdXMgcGxhY2VzLiAgVGhlIGZvbGxvd2luZyBjaGVjayBlbnN1cmVzIHRoYXQKLQkgKiB0aGUgYmxvY2tzIGFsbG9jYXRlZCB0byB0aGUgZGVxdWUsIGluIHRoZSB3b3JzdCBjYXNlLCBjYW4gb25seQotCSAqIGhhdmUgUFlfU1NJWkVfVF9NQVgtMiBlbnRyaWVzIGluIHRvdGFsLgotCSAqLwotCWlmIChsZW4gPj0gUFlfU1NJWkVfVF9NQVggLSAyKkJMT0NLTEVOKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJCSJjYW5ub3QgYWRkIG1vcmUgYmxvY2tzIHRvIHRoZSBkZXF1ZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKG51bWZyZWVibG9ja3MpIHsKLQkJbnVtZnJlZWJsb2NrcyAtPSAxOwotCQliID0gZnJlZWJsb2Nrc1tudW1mcmVlYmxvY2tzXTsKLQl9IGVsc2UgewotCQliID0gUHlNZW1fTWFsbG9jKHNpemVvZihibG9jaykpOwotCQlpZiAoYiA9PSBOVUxMKSB7Ci0JCQlQeUVycl9Ob01lbW9yeSgpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9Ci0JYi0+bGVmdGxpbmsgPSBsZWZ0bGluazsKLQliLT5yaWdodGxpbmsgPSByaWdodGxpbms7Ci0JcmV0dXJuIGI7CisgICAgYmxvY2sgKmI7CisgICAgLyogVG8gcHJldmVudCBsZW4gZnJvbSBvdmVyZmxvd2luZyBQWV9TU0laRV9UX01BWCBvbiA2NC1iaXQgbWFjaGluZXMsIHdlCisgICAgICogcmVmdXNlIHRvIGFsbG9jYXRlIG5ldyBibG9ja3MgaWYgdGhlIGN1cnJlbnQgbGVuIGlzIGRhbmdlcm91c2x5CisgICAgICogY2xvc2UuICBUaGVyZSBpcyBzb21lIGV4dHJhIG1hcmdpbiB0byBwcmV2ZW50IHNwdXJpb3VzIGFyaXRobWV0aWMKKyAgICAgKiBvdmVyZmxvd3MgYXQgdmFyaW91cyBwbGFjZXMuICBUaGUgZm9sbG93aW5nIGNoZWNrIGVuc3VyZXMgdGhhdAorICAgICAqIHRoZSBibG9ja3MgYWxsb2NhdGVkIHRvIHRoZSBkZXF1ZSwgaW4gdGhlIHdvcnN0IGNhc2UsIGNhbiBvbmx5CisgICAgICogaGF2ZSBQWV9TU0laRV9UX01BWC0yIGVudHJpZXMgaW4gdG90YWwuCisgICAgICovCisgICAgaWYgKGxlbiA+PSBQWV9TU0laRV9UX01BWCAtIDIqQkxPQ0tMRU4pIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiY2Fubm90IGFkZCBtb3JlIGJsb2NrcyB0byB0aGUgZGVxdWUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChudW1mcmVlYmxvY2tzKSB7CisgICAgICAgIG51bWZyZWVibG9ja3MgLT0gMTsKKyAgICAgICAgYiA9IGZyZWVibG9ja3NbbnVtZnJlZWJsb2Nrc107CisgICAgfSBlbHNlIHsKKyAgICAgICAgYiA9IFB5TWVtX01hbGxvYyhzaXplb2YoYmxvY2spKTsKKyAgICAgICAgaWYgKGIgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorICAgIGItPmxlZnRsaW5rID0gbGVmdGxpbms7CisgICAgYi0+cmlnaHRsaW5rID0gcmlnaHRsaW5rOworICAgIHJldHVybiBiOwogfQogCiBzdGF0aWMgdm9pZAogZnJlZWJsb2NrKGJsb2NrICpiKQogewotCWlmIChudW1mcmVlYmxvY2tzIDwgTUFYRlJFRUJMT0NLUykgewotCQlmcmVlYmxvY2tzW251bWZyZWVibG9ja3NdID0gYjsKLQkJbnVtZnJlZWJsb2NrcysrOwotCX0gZWxzZSB7Ci0JCVB5TWVtX0ZyZWUoYik7Ci0JfQorICAgIGlmIChudW1mcmVlYmxvY2tzIDwgTUFYRlJFRUJMT0NLUykgeworICAgICAgICBmcmVlYmxvY2tzW251bWZyZWVibG9ja3NdID0gYjsKKyAgICAgICAgbnVtZnJlZWJsb2NrcysrOworICAgIH0gZWxzZSB7CisgICAgICAgIFB5TWVtX0ZyZWUoYik7CisgICAgfQogfQogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCWJsb2NrICpsZWZ0YmxvY2s7Ci0JYmxvY2sgKnJpZ2h0YmxvY2s7Ci0JUHlfc3NpemVfdCBsZWZ0aW5kZXg7CS8qIGluIHJhbmdlKEJMT0NLTEVOKSAqLwotCVB5X3NzaXplX3QgcmlnaHRpbmRleDsJLyogaW4gcmFuZ2UoQkxPQ0tMRU4pICovCi0JUHlfc3NpemVfdCBsZW47Ci0JUHlfc3NpemVfdCBtYXhsZW47Ci0JbG9uZyBzdGF0ZTsJLyogaW5jcmVtZW50ZWQgd2hlbmV2ZXIgdGhlIGluZGljZXMgbW92ZSAqLwotCVB5T2JqZWN0ICp3ZWFrcmVmbGlzdDsgLyogTGlzdCBvZiB3ZWFrIHJlZmVyZW5jZXMgKi8KKyAgICBQeU9iamVjdF9IRUFECisgICAgYmxvY2sgKmxlZnRibG9jazsKKyAgICBibG9jayAqcmlnaHRibG9jazsKKyAgICBQeV9zc2l6ZV90IGxlZnRpbmRleDsgICAgICAgLyogaW4gcmFuZ2UoQkxPQ0tMRU4pICovCisgICAgUHlfc3NpemVfdCByaWdodGluZGV4OyAgICAgIC8qIGluIHJhbmdlKEJMT0NLTEVOKSAqLworICAgIFB5X3NzaXplX3QgbGVuOworICAgIFB5X3NzaXplX3QgbWF4bGVuOworICAgIGxvbmcgc3RhdGU7ICAgICAgICAgLyogaW5jcmVtZW50ZWQgd2hlbmV2ZXIgdGhlIGluZGljZXMgbW92ZSAqLworICAgIFB5T2JqZWN0ICp3ZWFrcmVmbGlzdDsgLyogTGlzdCBvZiB3ZWFrIHJlZmVyZW5jZXMgKi8KIH0gZGVxdWVvYmplY3Q7CiAKIC8qIFRoZSBkZXF1ZSdzIHNpemUgbGltaXQgaXMgZC5tYXhsZW4uICBUaGUgbGltaXQgY2FuIGJlIHplcm8gb3IgcG9zaXRpdmUuCiAgKiBJZiB0aGVyZSBpcyBubyBsaW1pdCwgdGhlbiBkLm1heGxlbiA9PSAtMS4KLSAqIAorICoKICAqIEFmdGVyIGFuIGl0ZW0gaXMgYWRkZWQgdG8gYSBkZXF1ZSwgd2UgY2hlY2sgdG8gc2VlIGlmIHRoZSBzaXplIGhhcyBncm93biBwYXN0CiAgKiB0aGUgbGltaXQuIElmIGl0IGhhcywgd2UgZ2V0IHRoZSBzaXplIGJhY2sgZG93biB0byB0aGUgbGltaXQgYnkgcG9wcGluZyBhbgogICogaXRlbSBvZmYgb2YgdGhlIG9wcG9zaXRlIGVuZC4gIFRoZSBtZXRob2RzIHRoYXQgY2FuIHRyaWdnZXIgdGhpcyBhcmUgYXBwZW5kKCksCiAgKiBhcHBlbmRsZWZ0KCksIGV4dGVuZCgpLCBhbmQgZXh0ZW5kbGVmdCgpLgogICovCiAKLSNkZWZpbmUgVFJJTShkLCBwb3BmdW5jdGlvbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLSAgICBpZiAoZC0+bWF4bGVuICE9IC0xICYmIGQtPmxlbiA+IGQtPm1heGxlbikgeyAgICAgICAgICAgICAgCVwKLSAgICAgICAgICAgIFB5T2JqZWN0ICpydiA9IHBvcGZ1bmN0aW9uKGQsIE5VTEwpOyAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBhc3NlcnQocnYgIT0gTlVMTCAgJiYgIGQtPmxlbiA8PSBkLT5tYXhsZW4pOyAgICAgICAgXAotICAgICAgICAgICAgUHlfREVDUkVGKHJ2KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyNkZWZpbmUgVFJJTShkLCBwb3BmdW5jdGlvbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGQtPm1heGxlbiAhPSAtMSAmJiBkLT5sZW4gPiBkLT5tYXhsZW4pIHsgICAgICAgICAgICAgICAgXAorICAgICAgICBQeU9iamVjdCAqcnYgPSBwb3BmdW5jdGlvbihkLCBOVUxMKTsgICAgICAgICAgICAgICAgXAorICAgICAgICBhc3NlcnQocnYgIT0gTlVMTCAgJiYgIGQtPmxlbiA8PSBkLT5tYXhsZW4pOyAgICAgICAgXAorICAgICAgICBQeV9ERUNSRUYocnYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIH0KIAogc3RhdGljIFB5VHlwZU9iamVjdCBkZXF1ZV90eXBlOwpAQCAtMTI5LDY1ICsxMjksNjUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBkZXF1ZV9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JZGVxdWVvYmplY3QgKmRlcXVlOwotCWJsb2NrICpiOworICAgIGRlcXVlb2JqZWN0ICpkZXF1ZTsKKyAgICBibG9jayAqYjsKIAotCS8qIGNyZWF0ZSBkZXF1ZW9iamVjdCBzdHJ1Y3R1cmUgKi8KLQlkZXF1ZSA9IChkZXF1ZW9iamVjdCAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOwotCWlmIChkZXF1ZSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICAvKiBjcmVhdGUgZGVxdWVvYmplY3Qgc3RydWN0dXJlICovCisgICAgZGVxdWUgPSAoZGVxdWVvYmplY3QgKil0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKKyAgICBpZiAoZGVxdWUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQliID0gbmV3YmxvY2soTlVMTCwgTlVMTCwgMCk7Ci0JaWYgKGIgPT0gTlVMTCkgewotCQlQeV9ERUNSRUYoZGVxdWUpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgYiA9IG5ld2Jsb2NrKE5VTEwsIE5VTEwsIDApOworICAgIGlmIChiID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKGRlcXVlKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JYXNzZXJ0KEJMT0NLTEVOID49IDIpOwotCWRlcXVlLT5sZWZ0YmxvY2sgPSBiOwotCWRlcXVlLT5yaWdodGJsb2NrID0gYjsKLQlkZXF1ZS0+bGVmdGluZGV4ID0gQ0VOVEVSICsgMTsKLQlkZXF1ZS0+cmlnaHRpbmRleCA9IENFTlRFUjsKLQlkZXF1ZS0+bGVuID0gMDsKLQlkZXF1ZS0+c3RhdGUgPSAwOwotCWRlcXVlLT53ZWFrcmVmbGlzdCA9IE5VTEw7Ci0JZGVxdWUtPm1heGxlbiA9IC0xOworICAgIGFzc2VydChCTE9DS0xFTiA+PSAyKTsKKyAgICBkZXF1ZS0+bGVmdGJsb2NrID0gYjsKKyAgICBkZXF1ZS0+cmlnaHRibG9jayA9IGI7CisgICAgZGVxdWUtPmxlZnRpbmRleCA9IENFTlRFUiArIDE7CisgICAgZGVxdWUtPnJpZ2h0aW5kZXggPSBDRU5URVI7CisgICAgZGVxdWUtPmxlbiA9IDA7CisgICAgZGVxdWUtPnN0YXRlID0gMDsKKyAgICBkZXF1ZS0+d2Vha3JlZmxpc3QgPSBOVUxMOworICAgIGRlcXVlLT5tYXhsZW4gPSAtMTsKIAotCXJldHVybiAoUHlPYmplY3QgKilkZXF1ZTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopZGVxdWU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkZXF1ZV9wb3AoZGVxdWVvYmplY3QgKmRlcXVlLCBQeU9iamVjdCAqdW51c2VkKQogewotCVB5T2JqZWN0ICppdGVtOwotCWJsb2NrICpwcmV2YmxvY2s7CisgICAgUHlPYmplY3QgKml0ZW07CisgICAgYmxvY2sgKnByZXZibG9jazsKIAotCWlmIChkZXF1ZS0+bGVuID09IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsICJwb3AgZnJvbSBhbiBlbXB0eSBkZXF1ZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaXRlbSA9IGRlcXVlLT5yaWdodGJsb2NrLT5kYXRhW2RlcXVlLT5yaWdodGluZGV4XTsKLQlkZXF1ZS0+cmlnaHRpbmRleC0tOwotCWRlcXVlLT5sZW4tLTsKLQlkZXF1ZS0+c3RhdGUrKzsKKyAgICBpZiAoZGVxdWUtPmxlbiA9PSAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLCAicG9wIGZyb20gYW4gZW1wdHkgZGVxdWUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGl0ZW0gPSBkZXF1ZS0+cmlnaHRibG9jay0+ZGF0YVtkZXF1ZS0+cmlnaHRpbmRleF07CisgICAgZGVxdWUtPnJpZ2h0aW5kZXgtLTsKKyAgICBkZXF1ZS0+bGVuLS07CisgICAgZGVxdWUtPnN0YXRlKys7CiAKLQlpZiAoZGVxdWUtPnJpZ2h0aW5kZXggPT0gLTEpIHsKLQkJaWYgKGRlcXVlLT5sZW4gPT0gMCkgewotCQkJYXNzZXJ0KGRlcXVlLT5sZWZ0YmxvY2sgPT0gZGVxdWUtPnJpZ2h0YmxvY2spOwotCQkJYXNzZXJ0KGRlcXVlLT5sZWZ0aW5kZXggPT0gZGVxdWUtPnJpZ2h0aW5kZXgrMSk7Ci0JCQkvKiByZS1jZW50ZXIgaW5zdGVhZCBvZiBmcmVlaW5nIGEgYmxvY2sgKi8KLQkJCWRlcXVlLT5sZWZ0aW5kZXggPSBDRU5URVIgKyAxOwotCQkJZGVxdWUtPnJpZ2h0aW5kZXggPSBDRU5URVI7Ci0JCX0gZWxzZSB7Ci0JCQlwcmV2YmxvY2sgPSBkZXF1ZS0+cmlnaHRibG9jay0+bGVmdGxpbms7Ci0JCQlhc3NlcnQoZGVxdWUtPmxlZnRibG9jayAhPSBkZXF1ZS0+cmlnaHRibG9jayk7Ci0JCQlmcmVlYmxvY2soZGVxdWUtPnJpZ2h0YmxvY2spOwotCQkJcHJldmJsb2NrLT5yaWdodGxpbmsgPSBOVUxMOwotCQkJZGVxdWUtPnJpZ2h0YmxvY2sgPSBwcmV2YmxvY2s7Ci0JCQlkZXF1ZS0+cmlnaHRpbmRleCA9IEJMT0NLTEVOIC0gMTsKLQkJfQotCX0KLQlyZXR1cm4gaXRlbTsKKyAgICBpZiAoZGVxdWUtPnJpZ2h0aW5kZXggPT0gLTEpIHsKKyAgICAgICAgaWYgKGRlcXVlLT5sZW4gPT0gMCkgeworICAgICAgICAgICAgYXNzZXJ0KGRlcXVlLT5sZWZ0YmxvY2sgPT0gZGVxdWUtPnJpZ2h0YmxvY2spOworICAgICAgICAgICAgYXNzZXJ0KGRlcXVlLT5sZWZ0aW5kZXggPT0gZGVxdWUtPnJpZ2h0aW5kZXgrMSk7CisgICAgICAgICAgICAvKiByZS1jZW50ZXIgaW5zdGVhZCBvZiBmcmVlaW5nIGEgYmxvY2sgKi8KKyAgICAgICAgICAgIGRlcXVlLT5sZWZ0aW5kZXggPSBDRU5URVIgKyAxOworICAgICAgICAgICAgZGVxdWUtPnJpZ2h0aW5kZXggPSBDRU5URVI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcmV2YmxvY2sgPSBkZXF1ZS0+cmlnaHRibG9jay0+bGVmdGxpbms7CisgICAgICAgICAgICBhc3NlcnQoZGVxdWUtPmxlZnRibG9jayAhPSBkZXF1ZS0+cmlnaHRibG9jayk7CisgICAgICAgICAgICBmcmVlYmxvY2soZGVxdWUtPnJpZ2h0YmxvY2spOworICAgICAgICAgICAgcHJldmJsb2NrLT5yaWdodGxpbmsgPSBOVUxMOworICAgICAgICAgICAgZGVxdWUtPnJpZ2h0YmxvY2sgPSBwcmV2YmxvY2s7CisgICAgICAgICAgICBkZXF1ZS0+cmlnaHRpbmRleCA9IEJMT0NLTEVOIC0gMTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gaXRlbTsKIH0KIAogUHlEb2NfU1RSVkFSKHBvcF9kb2MsICJSZW1vdmUgYW5kIHJldHVybiB0aGUgcmlnaHRtb3N0IGVsZW1lbnQuIik7CkBAIC0xOTUsMzcgKzE5NSwzNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGRlcXVlX3BvcGxlZnQoZGVxdWVvYmplY3QgKmRlcXVlLCBQeU9iamVjdCAqdW51c2VkKQogewotCVB5T2JqZWN0ICppdGVtOwotCWJsb2NrICpwcmV2YmxvY2s7CisgICAgUHlPYmplY3QgKml0ZW07CisgICAgYmxvY2sgKnByZXZibG9jazsKIAotCWlmIChkZXF1ZS0+bGVuID09IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsICJwb3AgZnJvbSBhbiBlbXB0eSBkZXF1ZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JYXNzZXJ0KGRlcXVlLT5sZWZ0YmxvY2sgIT0gTlVMTCk7Ci0JaXRlbSA9IGRlcXVlLT5sZWZ0YmxvY2stPmRhdGFbZGVxdWUtPmxlZnRpbmRleF07Ci0JZGVxdWUtPmxlZnRpbmRleCsrOwotCWRlcXVlLT5sZW4tLTsKLQlkZXF1ZS0+c3RhdGUrKzsKKyAgICBpZiAoZGVxdWUtPmxlbiA9PSAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLCAicG9wIGZyb20gYW4gZW1wdHkgZGVxdWUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGFzc2VydChkZXF1ZS0+bGVmdGJsb2NrICE9IE5VTEwpOworICAgIGl0ZW0gPSBkZXF1ZS0+bGVmdGJsb2NrLT5kYXRhW2RlcXVlLT5sZWZ0aW5kZXhdOworICAgIGRlcXVlLT5sZWZ0aW5kZXgrKzsKKyAgICBkZXF1ZS0+bGVuLS07CisgICAgZGVxdWUtPnN0YXRlKys7CiAKLQlpZiAoZGVxdWUtPmxlZnRpbmRleCA9PSBCTE9DS0xFTikgewotCQlpZiAoZGVxdWUtPmxlbiA9PSAwKSB7Ci0JCQlhc3NlcnQoZGVxdWUtPmxlZnRibG9jayA9PSBkZXF1ZS0+cmlnaHRibG9jayk7Ci0JCQlhc3NlcnQoZGVxdWUtPmxlZnRpbmRleCA9PSBkZXF1ZS0+cmlnaHRpbmRleCsxKTsKLQkJCS8qIHJlLWNlbnRlciBpbnN0ZWFkIG9mIGZyZWVpbmcgYSBibG9jayAqLwotCQkJZGVxdWUtPmxlZnRpbmRleCA9IENFTlRFUiArIDE7Ci0JCQlkZXF1ZS0+cmlnaHRpbmRleCA9IENFTlRFUjsKLQkJfSBlbHNlIHsKLQkJCWFzc2VydChkZXF1ZS0+bGVmdGJsb2NrICE9IGRlcXVlLT5yaWdodGJsb2NrKTsKLQkJCXByZXZibG9jayA9IGRlcXVlLT5sZWZ0YmxvY2stPnJpZ2h0bGluazsKLQkJCWZyZWVibG9jayhkZXF1ZS0+bGVmdGJsb2NrKTsKLQkJCWFzc2VydChwcmV2YmxvY2sgIT0gTlVMTCk7Ci0JCQlwcmV2YmxvY2stPmxlZnRsaW5rID0gTlVMTDsKLQkJCWRlcXVlLT5sZWZ0YmxvY2sgPSBwcmV2YmxvY2s7Ci0JCQlkZXF1ZS0+bGVmdGluZGV4ID0gMDsKLQkJfQotCX0KLQlyZXR1cm4gaXRlbTsKKyAgICBpZiAoZGVxdWUtPmxlZnRpbmRleCA9PSBCTE9DS0xFTikgeworICAgICAgICBpZiAoZGVxdWUtPmxlbiA9PSAwKSB7CisgICAgICAgICAgICBhc3NlcnQoZGVxdWUtPmxlZnRibG9jayA9PSBkZXF1ZS0+cmlnaHRibG9jayk7CisgICAgICAgICAgICBhc3NlcnQoZGVxdWUtPmxlZnRpbmRleCA9PSBkZXF1ZS0+cmlnaHRpbmRleCsxKTsKKyAgICAgICAgICAgIC8qIHJlLWNlbnRlciBpbnN0ZWFkIG9mIGZyZWVpbmcgYSBibG9jayAqLworICAgICAgICAgICAgZGVxdWUtPmxlZnRpbmRleCA9IENFTlRFUiArIDE7CisgICAgICAgICAgICBkZXF1ZS0+cmlnaHRpbmRleCA9IENFTlRFUjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFzc2VydChkZXF1ZS0+bGVmdGJsb2NrICE9IGRlcXVlLT5yaWdodGJsb2NrKTsKKyAgICAgICAgICAgIHByZXZibG9jayA9IGRlcXVlLT5sZWZ0YmxvY2stPnJpZ2h0bGluazsKKyAgICAgICAgICAgIGZyZWVibG9jayhkZXF1ZS0+bGVmdGJsb2NrKTsKKyAgICAgICAgICAgIGFzc2VydChwcmV2YmxvY2sgIT0gTlVMTCk7CisgICAgICAgICAgICBwcmV2YmxvY2stPmxlZnRsaW5rID0gTlVMTDsKKyAgICAgICAgICAgIGRlcXVlLT5sZWZ0YmxvY2sgPSBwcmV2YmxvY2s7CisgICAgICAgICAgICBkZXF1ZS0+bGVmdGluZGV4ID0gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gaXRlbTsKIH0KIAogUHlEb2NfU1RSVkFSKHBvcGxlZnRfZG9jLCAiUmVtb3ZlIGFuZCByZXR1cm4gdGhlIGxlZnRtb3N0IGVsZW1lbnQuIik7CkBAIC0yMzMsMjIgKzIzMywyMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGRlcXVlX2FwcGVuZChkZXF1ZW9iamVjdCAqZGVxdWUsIFB5T2JqZWN0ICppdGVtKQogewotCWRlcXVlLT5zdGF0ZSsrOwotCWlmIChkZXF1ZS0+cmlnaHRpbmRleCA9PSBCTE9DS0xFTi0xKSB7Ci0JCWJsb2NrICpiID0gbmV3YmxvY2soZGVxdWUtPnJpZ2h0YmxvY2ssIE5VTEwsIGRlcXVlLT5sZW4pOwotCQlpZiAoYiA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWFzc2VydChkZXF1ZS0+cmlnaHRibG9jay0+cmlnaHRsaW5rID09IE5VTEwpOwotCQlkZXF1ZS0+cmlnaHRibG9jay0+cmlnaHRsaW5rID0gYjsKLQkJZGVxdWUtPnJpZ2h0YmxvY2sgPSBiOwotCQlkZXF1ZS0+cmlnaHRpbmRleCA9IC0xOwotCX0KLQlQeV9JTkNSRUYoaXRlbSk7Ci0JZGVxdWUtPmxlbisrOwotCWRlcXVlLT5yaWdodGluZGV4Kys7Ci0JZGVxdWUtPnJpZ2h0YmxvY2stPmRhdGFbZGVxdWUtPnJpZ2h0aW5kZXhdID0gaXRlbTsKLQlUUklNKGRlcXVlLCBkZXF1ZV9wb3BsZWZ0KTsKLQlQeV9SRVRVUk5fTk9ORTsKKyAgICBkZXF1ZS0+c3RhdGUrKzsKKyAgICBpZiAoZGVxdWUtPnJpZ2h0aW5kZXggPT0gQkxPQ0tMRU4tMSkgeworICAgICAgICBibG9jayAqYiA9IG5ld2Jsb2NrKGRlcXVlLT5yaWdodGJsb2NrLCBOVUxMLCBkZXF1ZS0+bGVuKTsKKyAgICAgICAgaWYgKGIgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBhc3NlcnQoZGVxdWUtPnJpZ2h0YmxvY2stPnJpZ2h0bGluayA9PSBOVUxMKTsKKyAgICAgICAgZGVxdWUtPnJpZ2h0YmxvY2stPnJpZ2h0bGluayA9IGI7CisgICAgICAgIGRlcXVlLT5yaWdodGJsb2NrID0gYjsKKyAgICAgICAgZGVxdWUtPnJpZ2h0aW5kZXggPSAtMTsKKyAgICB9CisgICAgUHlfSU5DUkVGKGl0ZW0pOworICAgIGRlcXVlLT5sZW4rKzsKKyAgICBkZXF1ZS0+cmlnaHRpbmRleCsrOworICAgIGRlcXVlLT5yaWdodGJsb2NrLT5kYXRhW2RlcXVlLT5yaWdodGluZGV4XSA9IGl0ZW07CisgICAgVFJJTShkZXF1ZSwgZGVxdWVfcG9wbGVmdCk7CisgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKIFB5RG9jX1NUUlZBUihhcHBlbmRfZG9jLCAiQWRkIGFuIGVsZW1lbnQgdG8gdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIGRlcXVlLiIpOwpAQCAtMjU2LDIyICsyNTYsMjIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBkZXF1ZV9hcHBlbmRsZWZ0KGRlcXVlb2JqZWN0ICpkZXF1ZSwgUHlPYmplY3QgKml0ZW0pCiB7Ci0JZGVxdWUtPnN0YXRlKys7Ci0JaWYgKGRlcXVlLT5sZWZ0aW5kZXggPT0gMCkgewotCQlibG9jayAqYiA9IG5ld2Jsb2NrKE5VTEwsIGRlcXVlLT5sZWZ0YmxvY2ssIGRlcXVlLT5sZW4pOwotCQlpZiAoYiA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWFzc2VydChkZXF1ZS0+bGVmdGJsb2NrLT5sZWZ0bGluayA9PSBOVUxMKTsKLQkJZGVxdWUtPmxlZnRibG9jay0+bGVmdGxpbmsgPSBiOwotCQlkZXF1ZS0+bGVmdGJsb2NrID0gYjsKLQkJZGVxdWUtPmxlZnRpbmRleCA9IEJMT0NLTEVOOwotCX0KLQlQeV9JTkNSRUYoaXRlbSk7Ci0JZGVxdWUtPmxlbisrOwotCWRlcXVlLT5sZWZ0aW5kZXgtLTsKLQlkZXF1ZS0+bGVmdGJsb2NrLT5kYXRhW2RlcXVlLT5sZWZ0aW5kZXhdID0gaXRlbTsKLQlUUklNKGRlcXVlLCBkZXF1ZV9wb3ApOwotCVB5X1JFVFVSTl9OT05FOworICAgIGRlcXVlLT5zdGF0ZSsrOworICAgIGlmIChkZXF1ZS0+bGVmdGluZGV4ID09IDApIHsKKyAgICAgICAgYmxvY2sgKmIgPSBuZXdibG9jayhOVUxMLCBkZXF1ZS0+bGVmdGJsb2NrLCBkZXF1ZS0+bGVuKTsKKyAgICAgICAgaWYgKGIgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBhc3NlcnQoZGVxdWUtPmxlZnRibG9jay0+bGVmdGxpbmsgPT0gTlVMTCk7CisgICAgICAgIGRlcXVlLT5sZWZ0YmxvY2stPmxlZnRsaW5rID0gYjsKKyAgICAgICAgZGVxdWUtPmxlZnRibG9jayA9IGI7CisgICAgICAgIGRlcXVlLT5sZWZ0aW5kZXggPSBCTE9DS0xFTjsKKyAgICB9CisgICAgUHlfSU5DUkVGKGl0ZW0pOworICAgIGRlcXVlLT5sZW4rKzsKKyAgICBkZXF1ZS0+bGVmdGluZGV4LS07CisgICAgZGVxdWUtPmxlZnRibG9jay0+ZGF0YVtkZXF1ZS0+bGVmdGluZGV4XSA9IGl0ZW07CisgICAgVFJJTShkZXF1ZSwgZGVxdWVfcG9wKTsKKyAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAogUHlEb2NfU1RSVkFSKGFwcGVuZGxlZnRfZG9jLCAiQWRkIGFuIGVsZW1lbnQgdG8gdGhlIGxlZnQgc2lkZSBvZiB0aGUgZGVxdWUuIik7CkBAIC0yNzksNDcgKzI3OSw0NyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGRlcXVlX2V4dGVuZChkZXF1ZW9iamVjdCAqZGVxdWUsIFB5T2JqZWN0ICppdGVyYWJsZSkKIHsKLQlQeU9iamVjdCAqaXQsICppdGVtOworICAgIFB5T2JqZWN0ICppdCwgKml0ZW07CiAKLQkvKiBIYW5kbGUgY2FzZSB3aGVyZSBpZChkZXF1ZSkgPT0gaWQoaXRlcmFibGUpICovCi0JaWYgKChQeU9iamVjdCAqKWRlcXVlID09IGl0ZXJhYmxlKSB7Ci0JCVB5T2JqZWN0ICpyZXN1bHQ7Ci0JCVB5T2JqZWN0ICpzID0gUHlTZXF1ZW5jZV9MaXN0KGl0ZXJhYmxlKTsKLQkJaWYgKHMgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQlyZXN1bHQgPSBkZXF1ZV9leHRlbmQoZGVxdWUsIHMpOwotCQlQeV9ERUNSRUYocyk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQorICAgIC8qIEhhbmRsZSBjYXNlIHdoZXJlIGlkKGRlcXVlKSA9PSBpZChpdGVyYWJsZSkgKi8KKyAgICBpZiAoKFB5T2JqZWN0ICopZGVxdWUgPT0gaXRlcmFibGUpIHsKKyAgICAgICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICAgICAgUHlPYmplY3QgKnMgPSBQeVNlcXVlbmNlX0xpc3QoaXRlcmFibGUpOworICAgICAgICBpZiAocyA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHJlc3VsdCA9IGRlcXVlX2V4dGVuZChkZXF1ZSwgcyk7CisgICAgICAgIFB5X0RFQ1JFRihzKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CiAKLQlpdCA9IFB5T2JqZWN0X0dldEl0ZXIoaXRlcmFibGUpOwotCWlmIChpdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpdCA9IFB5T2JqZWN0X0dldEl0ZXIoaXRlcmFibGUpOworICAgIGlmIChpdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXdoaWxlICgoaXRlbSA9IFB5SXRlcl9OZXh0KGl0KSkgIT0gTlVMTCkgewotCQlkZXF1ZS0+c3RhdGUrKzsKLQkJaWYgKGRlcXVlLT5yaWdodGluZGV4ID09IEJMT0NLTEVOLTEpIHsKLQkJCWJsb2NrICpiID0gbmV3YmxvY2soZGVxdWUtPnJpZ2h0YmxvY2ssIE5VTEwsCi0JCQkJCSAgICBkZXF1ZS0+bGVuKTsKLQkJCWlmIChiID09IE5VTEwpIHsKLQkJCQlQeV9ERUNSRUYoaXRlbSk7Ci0JCQkJUHlfREVDUkVGKGl0KTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJCWFzc2VydChkZXF1ZS0+cmlnaHRibG9jay0+cmlnaHRsaW5rID09IE5VTEwpOwotCQkJZGVxdWUtPnJpZ2h0YmxvY2stPnJpZ2h0bGluayA9IGI7Ci0JCQlkZXF1ZS0+cmlnaHRibG9jayA9IGI7Ci0JCQlkZXF1ZS0+cmlnaHRpbmRleCA9IC0xOwotCQl9Ci0JCWRlcXVlLT5sZW4rKzsKLQkJZGVxdWUtPnJpZ2h0aW5kZXgrKzsKLQkJZGVxdWUtPnJpZ2h0YmxvY2stPmRhdGFbZGVxdWUtPnJpZ2h0aW5kZXhdID0gaXRlbTsKLQkJVFJJTShkZXF1ZSwgZGVxdWVfcG9wbGVmdCk7ICAgICAgICAgICAgICAgCi0JfQotCVB5X0RFQ1JFRihpdCk7Ci0JaWYgKFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiBOVUxMOwotCVB5X1JFVFVSTl9OT05FOworICAgIHdoaWxlICgoaXRlbSA9IFB5SXRlcl9OZXh0KGl0KSkgIT0gTlVMTCkgeworICAgICAgICBkZXF1ZS0+c3RhdGUrKzsKKyAgICAgICAgaWYgKGRlcXVlLT5yaWdodGluZGV4ID09IEJMT0NLTEVOLTEpIHsKKyAgICAgICAgICAgIGJsb2NrICpiID0gbmV3YmxvY2soZGVxdWUtPnJpZ2h0YmxvY2ssIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcXVlLT5sZW4pOworICAgICAgICAgICAgaWYgKGIgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoaXQpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXNzZXJ0KGRlcXVlLT5yaWdodGJsb2NrLT5yaWdodGxpbmsgPT0gTlVMTCk7CisgICAgICAgICAgICBkZXF1ZS0+cmlnaHRibG9jay0+cmlnaHRsaW5rID0gYjsKKyAgICAgICAgICAgIGRlcXVlLT5yaWdodGJsb2NrID0gYjsKKyAgICAgICAgICAgIGRlcXVlLT5yaWdodGluZGV4ID0gLTE7CisgICAgICAgIH0KKyAgICAgICAgZGVxdWUtPmxlbisrOworICAgICAgICBkZXF1ZS0+cmlnaHRpbmRleCsrOworICAgICAgICBkZXF1ZS0+cmlnaHRibG9jay0+ZGF0YVtkZXF1ZS0+cmlnaHRpbmRleF0gPSBpdGVtOworICAgICAgICBUUklNKGRlcXVlLCBkZXF1ZV9wb3BsZWZ0KTsKKyAgICB9CisgICAgUHlfREVDUkVGKGl0KTsKKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKIFB5RG9jX1NUUlZBUihleHRlbmRfZG9jLApAQCAtMzI4LDQ3ICszMjgsNDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBkZXF1ZV9leHRlbmRsZWZ0KGRlcXVlb2JqZWN0ICpkZXF1ZSwgUHlPYmplY3QgKml0ZXJhYmxlKQogewotCVB5T2JqZWN0ICppdCwgKml0ZW07CisgICAgUHlPYmplY3QgKml0LCAqaXRlbTsKIAotCS8qIEhhbmRsZSBjYXNlIHdoZXJlIGlkKGRlcXVlKSA9PSBpZChpdGVyYWJsZSkgKi8KLQlpZiAoKFB5T2JqZWN0ICopZGVxdWUgPT0gaXRlcmFibGUpIHsKLQkJUHlPYmplY3QgKnJlc3VsdDsKLQkJUHlPYmplY3QgKnMgPSBQeVNlcXVlbmNlX0xpc3QoaXRlcmFibGUpOwotCQlpZiAocyA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCXJlc3VsdCA9IGRlcXVlX2V4dGVuZGxlZnQoZGVxdWUsIHMpOwotCQlQeV9ERUNSRUYocyk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQorICAgIC8qIEhhbmRsZSBjYXNlIHdoZXJlIGlkKGRlcXVlKSA9PSBpZChpdGVyYWJsZSkgKi8KKyAgICBpZiAoKFB5T2JqZWN0ICopZGVxdWUgPT0gaXRlcmFibGUpIHsKKyAgICAgICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICAgICAgUHlPYmplY3QgKnMgPSBQeVNlcXVlbmNlX0xpc3QoaXRlcmFibGUpOworICAgICAgICBpZiAocyA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHJlc3VsdCA9IGRlcXVlX2V4dGVuZGxlZnQoZGVxdWUsIHMpOworICAgICAgICBQeV9ERUNSRUYocyk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQogCi0JaXQgPSBQeU9iamVjdF9HZXRJdGVyKGl0ZXJhYmxlKTsKLQlpZiAoaXQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgaXQgPSBQeU9iamVjdF9HZXRJdGVyKGl0ZXJhYmxlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQl3aGlsZSAoKGl0ZW0gPSBQeUl0ZXJfTmV4dChpdCkpICE9IE5VTEwpIHsKLQkJZGVxdWUtPnN0YXRlKys7Ci0JCWlmIChkZXF1ZS0+bGVmdGluZGV4ID09IDApIHsKLQkJCWJsb2NrICpiID0gbmV3YmxvY2soTlVMTCwgZGVxdWUtPmxlZnRibG9jaywKLQkJCQkJICAgIGRlcXVlLT5sZW4pOwotCQkJaWYgKGIgPT0gTlVMTCkgewotCQkJCVB5X0RFQ1JFRihpdGVtKTsKLQkJCQlQeV9ERUNSRUYoaXQpOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQkJYXNzZXJ0KGRlcXVlLT5sZWZ0YmxvY2stPmxlZnRsaW5rID09IE5VTEwpOwotCQkJZGVxdWUtPmxlZnRibG9jay0+bGVmdGxpbmsgPSBiOwotCQkJZGVxdWUtPmxlZnRibG9jayA9IGI7Ci0JCQlkZXF1ZS0+bGVmdGluZGV4ID0gQkxPQ0tMRU47Ci0JCX0KLQkJZGVxdWUtPmxlbisrOwotCQlkZXF1ZS0+bGVmdGluZGV4LS07Ci0JCWRlcXVlLT5sZWZ0YmxvY2stPmRhdGFbZGVxdWUtPmxlZnRpbmRleF0gPSBpdGVtOwotCQlUUklNKGRlcXVlLCBkZXF1ZV9wb3ApOyAgICAgICAgICAgICAgIAotCX0KLQlQeV9ERUNSRUYoaXQpOwotCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gTlVMTDsKLQlQeV9SRVRVUk5fTk9ORTsKKyAgICB3aGlsZSAoKGl0ZW0gPSBQeUl0ZXJfTmV4dChpdCkpICE9IE5VTEwpIHsKKyAgICAgICAgZGVxdWUtPnN0YXRlKys7CisgICAgICAgIGlmIChkZXF1ZS0+bGVmdGluZGV4ID09IDApIHsKKyAgICAgICAgICAgIGJsb2NrICpiID0gbmV3YmxvY2soTlVMTCwgZGVxdWUtPmxlZnRibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVxdWUtPmxlbik7CisgICAgICAgICAgICBpZiAoYiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihpdCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhc3NlcnQoZGVxdWUtPmxlZnRibG9jay0+bGVmdGxpbmsgPT0gTlVMTCk7CisgICAgICAgICAgICBkZXF1ZS0+bGVmdGJsb2NrLT5sZWZ0bGluayA9IGI7CisgICAgICAgICAgICBkZXF1ZS0+bGVmdGJsb2NrID0gYjsKKyAgICAgICAgICAgIGRlcXVlLT5sZWZ0aW5kZXggPSBCTE9DS0xFTjsKKyAgICAgICAgfQorICAgICAgICBkZXF1ZS0+bGVuKys7CisgICAgICAgIGRlcXVlLT5sZWZ0aW5kZXgtLTsKKyAgICAgICAgZGVxdWUtPmxlZnRibG9jay0+ZGF0YVtkZXF1ZS0+bGVmdGluZGV4XSA9IGl0ZW07CisgICAgICAgIFRSSU0oZGVxdWUsIGRlcXVlX3BvcCk7CisgICAgfQorICAgIFB5X0RFQ1JFRihpdCk7CisgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5X1JFVFVSTl9OT05FOwogfQogCiBQeURvY19TVFJWQVIoZXh0ZW5kbGVmdF9kb2MsCkBAIC0zNzcsNjMgKzM3Nyw2MyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGRlcXVlX2lucGxhY2VfY29uY2F0KGRlcXVlb2JqZWN0ICpkZXF1ZSwgUHlPYmplY3QgKm90aGVyKQogewotCVB5T2JqZWN0ICpyZXN1bHQ7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKIAotCXJlc3VsdCA9IGRlcXVlX2V4dGVuZChkZXF1ZSwgb3RoZXIpOwotCWlmIChyZXN1bHQgPT0gTlVMTCkKLQkJcmV0dXJuIHJlc3VsdDsKLQlQeV9ERUNSRUYocmVzdWx0KTsKLQlQeV9JTkNSRUYoZGVxdWUpOwotCXJldHVybiAoUHlPYmplY3QgKilkZXF1ZTsKKyAgICByZXN1bHQgPSBkZXF1ZV9leHRlbmQoZGVxdWUsIG90aGVyKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgUHlfSU5DUkVGKGRlcXVlKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopZGVxdWU7CiB9CiAKIHN0YXRpYyBpbnQKIF9kZXF1ZV9yb3RhdGUoZGVxdWVvYmplY3QgKmRlcXVlLCBQeV9zc2l6ZV90IG4pCiB7Ci0JUHlfc3NpemVfdCBpLCBsZW49ZGVxdWUtPmxlbiwgaGFsZmxlbj0obGVuKzEpPj4xOwotCVB5T2JqZWN0ICppdGVtLCAqcnY7CisgICAgUHlfc3NpemVfdCBpLCBsZW49ZGVxdWUtPmxlbiwgaGFsZmxlbj0obGVuKzEpPj4xOworICAgIFB5T2JqZWN0ICppdGVtLCAqcnY7CiAKLQlpZiAobGVuID09IDApCi0JCXJldHVybiAwOwotCWlmIChuID4gaGFsZmxlbiB8fCBuIDwgLWhhbGZsZW4pIHsKLQkJbiAlPSBsZW47Ci0JCWlmIChuID4gaGFsZmxlbikKLQkJCW4gLT0gbGVuOwotCQllbHNlIGlmIChuIDwgLWhhbGZsZW4pCi0JCQluICs9IGxlbjsKLQl9CisgICAgaWYgKGxlbiA9PSAwKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAobiA+IGhhbGZsZW4gfHwgbiA8IC1oYWxmbGVuKSB7CisgICAgICAgIG4gJT0gbGVuOworICAgICAgICBpZiAobiA+IGhhbGZsZW4pCisgICAgICAgICAgICBuIC09IGxlbjsKKyAgICAgICAgZWxzZSBpZiAobiA8IC1oYWxmbGVuKQorICAgICAgICAgICAgbiArPSBsZW47CisgICAgfQogCi0JZm9yIChpPTAgOyBpPG4gOyBpKyspIHsKLQkJaXRlbSA9IGRlcXVlX3BvcChkZXF1ZSwgTlVMTCk7Ci0JCWFzc2VydCAoaXRlbSAhPSBOVUxMKTsKLQkJcnYgPSBkZXF1ZV9hcHBlbmRsZWZ0KGRlcXVlLCBpdGVtKTsKLQkJUHlfREVDUkVGKGl0ZW0pOwotCQlpZiAocnYgPT0gTlVMTCkKLQkJCXJldHVybiAtMTsKLQkJUHlfREVDUkVGKHJ2KTsKLQl9Ci0JZm9yIChpPTAgOyBpPm4gOyBpLS0pIHsKLQkJaXRlbSA9IGRlcXVlX3BvcGxlZnQoZGVxdWUsIE5VTEwpOwotCQlhc3NlcnQgKGl0ZW0gIT0gTlVMTCk7Ci0JCXJ2ID0gZGVxdWVfYXBwZW5kKGRlcXVlLCBpdGVtKTsKLQkJUHlfREVDUkVGKGl0ZW0pOwotCQlpZiAocnYgPT0gTlVMTCkKLQkJCXJldHVybiAtMTsKLQkJUHlfREVDUkVGKHJ2KTsKLQl9Ci0JcmV0dXJuIDA7CisgICAgZm9yIChpPTAgOyBpPG4gOyBpKyspIHsKKyAgICAgICAgaXRlbSA9IGRlcXVlX3BvcChkZXF1ZSwgTlVMTCk7CisgICAgICAgIGFzc2VydCAoaXRlbSAhPSBOVUxMKTsKKyAgICAgICAgcnYgPSBkZXF1ZV9hcHBlbmRsZWZ0KGRlcXVlLCBpdGVtKTsKKyAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgICAgICBpZiAocnYgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgUHlfREVDUkVGKHJ2KTsKKyAgICB9CisgICAgZm9yIChpPTAgOyBpPm4gOyBpLS0pIHsKKyAgICAgICAgaXRlbSA9IGRlcXVlX3BvcGxlZnQoZGVxdWUsIE5VTEwpOworICAgICAgICBhc3NlcnQgKGl0ZW0gIT0gTlVMTCk7CisgICAgICAgIHJ2ID0gZGVxdWVfYXBwZW5kKGRlcXVlLCBpdGVtKTsKKyAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgICAgICBpZiAocnYgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgUHlfREVDUkVGKHJ2KTsKKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkZXF1ZV9yb3RhdGUoZGVxdWVvYmplY3QgKmRlcXVlLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeV9zc2l6ZV90IG49MTsKKyAgICBQeV9zc2l6ZV90IG49MTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifG46cm90YXRlIiwgJm4pKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoX2RlcXVlX3JvdGF0ZShkZXF1ZSwgbikgPT0gMCkKLQkJUHlfUkVUVVJOX05PTkU7Ci0JcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8bjpyb3RhdGUiLCAmbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChfZGVxdWVfcm90YXRlKGRlcXVlLCBuKSA9PSAwKQorICAgICAgICBQeV9SRVRVUk5fTk9ORTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogUHlEb2NfU1RSVkFSKHJvdGF0ZV9kb2MsCkBAIC00NDIsMzkgKzQ0MiwzOSBAQAogc3RhdGljIFB5X3NzaXplX3QKIGRlcXVlX2xlbihkZXF1ZW9iamVjdCAqZGVxdWUpCiB7Ci0JcmV0dXJuIGRlcXVlLT5sZW47CisgICAgcmV0dXJuIGRlcXVlLT5sZW47CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkZXF1ZV9yZW1vdmUoZGVxdWVvYmplY3QgKmRlcXVlLCBQeU9iamVjdCAqdmFsdWUpCiB7Ci0JUHlfc3NpemVfdCBpLCBuPWRlcXVlLT5sZW47CisgICAgUHlfc3NpemVfdCBpLCBuPWRlcXVlLT5sZW47CiAKLQlmb3IgKGk9MCA7IGk8biA7IGkrKykgewotCQlQeU9iamVjdCAqaXRlbSA9IGRlcXVlLT5sZWZ0YmxvY2stPmRhdGFbZGVxdWUtPmxlZnRpbmRleF07Ci0JCWludCBjbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woaXRlbSwgdmFsdWUsIFB5X0VRKTsKKyAgICBmb3IgKGk9MCA7IGk8biA7IGkrKykgeworICAgICAgICBQeU9iamVjdCAqaXRlbSA9IGRlcXVlLT5sZWZ0YmxvY2stPmRhdGFbZGVxdWUtPmxlZnRpbmRleF07CisgICAgICAgIGludCBjbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woaXRlbSwgdmFsdWUsIFB5X0VRKTsKIAotCQlpZiAoZGVxdWUtPmxlbiAhPSBuKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwKLQkJCQkiZGVxdWUgbXV0YXRlZCBkdXJpbmcgcmVtb3ZlKCkuIik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlpZiAoY21wID4gMCkgewotCQkJUHlPYmplY3QgKnRndCA9IGRlcXVlX3BvcGxlZnQoZGVxdWUsIE5VTEwpOwotCQkJYXNzZXJ0ICh0Z3QgIT0gTlVMTCk7Ci0JCQlQeV9ERUNSRUYodGd0KTsKLQkJCWlmIChfZGVxdWVfcm90YXRlKGRlcXVlLCBpKSA9PSAtMSkKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCVB5X1JFVFVSTl9OT05FOwotCQl9Ci0JCWVsc2UgaWYgKGNtcCA8IDApIHsKLQkJCV9kZXF1ZV9yb3RhdGUoZGVxdWUsIGkpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJX2RlcXVlX3JvdGF0ZShkZXF1ZSwgLTEpOwotCX0KLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImRlcXVlLnJlbW92ZSh4KTogeCBub3QgaW4gZGVxdWUiKTsKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKGRlcXVlLT5sZW4gIT0gbikgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsCisgICAgICAgICAgICAgICAgImRlcXVlIG11dGF0ZWQgZHVyaW5nIHJlbW92ZSgpLiIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNtcCA+IDApIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICp0Z3QgPSBkZXF1ZV9wb3BsZWZ0KGRlcXVlLCBOVUxMKTsKKyAgICAgICAgICAgIGFzc2VydCAodGd0ICE9IE5VTEwpOworICAgICAgICAgICAgUHlfREVDUkVGKHRndCk7CisgICAgICAgICAgICBpZiAoX2RlcXVlX3JvdGF0ZShkZXF1ZSwgaSkgPT0gLTEpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICBQeV9SRVRVUk5fTk9ORTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChjbXAgPCAwKSB7CisgICAgICAgICAgICBfZGVxdWVfcm90YXRlKGRlcXVlLCBpKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIF9kZXF1ZV9yb3RhdGUoZGVxdWUsIC0xKTsKKyAgICB9CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJkZXF1ZS5yZW1vdmUoeCk6IHggbm90IGluIGRlcXVlIik7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIFB5RG9jX1NUUlZBUihyZW1vdmVfZG9jLApAQCAtNDgzLDU2ICs0ODMsNTYgQEAKIHN0YXRpYyBpbnQKIGRlcXVlX2NsZWFyKGRlcXVlb2JqZWN0ICpkZXF1ZSkKIHsKLQlQeU9iamVjdCAqaXRlbTsKKyAgICBQeU9iamVjdCAqaXRlbTsKIAotCXdoaWxlIChkZXF1ZS0+bGVuKSB7Ci0JCWl0ZW0gPSBkZXF1ZV9wb3AoZGVxdWUsIE5VTEwpOwotCQlhc3NlcnQgKGl0ZW0gIT0gTlVMTCk7Ci0JCVB5X0RFQ1JFRihpdGVtKTsKLQl9Ci0JYXNzZXJ0KGRlcXVlLT5sZWZ0YmxvY2sgPT0gZGVxdWUtPnJpZ2h0YmxvY2sgJiYKLQkgICAgICAgZGVxdWUtPmxlZnRpbmRleCAtIDEgPT0gZGVxdWUtPnJpZ2h0aW5kZXggJiYKLQkgICAgICAgZGVxdWUtPmxlbiA9PSAwKTsKLQlyZXR1cm4gMDsKKyAgICB3aGlsZSAoZGVxdWUtPmxlbikgeworICAgICAgICBpdGVtID0gZGVxdWVfcG9wKGRlcXVlLCBOVUxMKTsKKyAgICAgICAgYXNzZXJ0IChpdGVtICE9IE5VTEwpOworICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CisgICAgfQorICAgIGFzc2VydChkZXF1ZS0+bGVmdGJsb2NrID09IGRlcXVlLT5yaWdodGJsb2NrICYmCisgICAgICAgICAgIGRlcXVlLT5sZWZ0aW5kZXggLSAxID09IGRlcXVlLT5yaWdodGluZGV4ICYmCisgICAgICAgICAgIGRlcXVlLT5sZW4gPT0gMCk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkZXF1ZV9pdGVtKGRlcXVlb2JqZWN0ICpkZXF1ZSwgUHlfc3NpemVfdCBpKQogewotCWJsb2NrICpiOwotCVB5T2JqZWN0ICppdGVtOwotCVB5X3NzaXplX3QgbiwgaW5kZXg9aTsKKyAgICBibG9jayAqYjsKKyAgICBQeU9iamVjdCAqaXRlbTsKKyAgICBQeV9zc2l6ZV90IG4sIGluZGV4PWk7CiAKLQlpZiAoaSA8IDAgfHwgaSA+PSBkZXF1ZS0+bGVuKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLAotCQkJCSJkZXF1ZSBpbmRleCBvdXQgb2YgcmFuZ2UiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChpIDwgMCB8fCBpID49IGRlcXVlLT5sZW4pIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiZGVxdWUgaW5kZXggb3V0IG9mIHJhbmdlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWlmIChpID09IDApIHsKLQkJaSA9IGRlcXVlLT5sZWZ0aW5kZXg7Ci0JCWIgPSBkZXF1ZS0+bGVmdGJsb2NrOwotCX0gZWxzZSBpZiAoaSA9PSBkZXF1ZS0+bGVuIC0gMSkgewotCQlpID0gZGVxdWUtPnJpZ2h0aW5kZXg7Ci0JCWIgPSBkZXF1ZS0+cmlnaHRibG9jazsKLQl9IGVsc2UgewotCQlpICs9IGRlcXVlLT5sZWZ0aW5kZXg7Ci0JCW4gPSBpIC8gQkxPQ0tMRU47Ci0JCWkgJT0gQkxPQ0tMRU47Ci0JCWlmIChpbmRleCA8IChkZXF1ZS0+bGVuID4+IDEpKSB7Ci0JCQliID0gZGVxdWUtPmxlZnRibG9jazsKLQkJCXdoaWxlIChuLS0pCi0JCQkJYiA9IGItPnJpZ2h0bGluazsKLQkJfSBlbHNlIHsKLQkJCW4gPSAoZGVxdWUtPmxlZnRpbmRleCArIGRlcXVlLT5sZW4gLSAxKSAvIEJMT0NLTEVOIC0gbjsKLQkJCWIgPSBkZXF1ZS0+cmlnaHRibG9jazsKLQkJCXdoaWxlIChuLS0pCi0JCQkJYiA9IGItPmxlZnRsaW5rOwotCQl9Ci0JfQotCWl0ZW0gPSBiLT5kYXRhW2ldOwotCVB5X0lOQ1JFRihpdGVtKTsKLQlyZXR1cm4gaXRlbTsKKyAgICBpZiAoaSA9PSAwKSB7CisgICAgICAgIGkgPSBkZXF1ZS0+bGVmdGluZGV4OworICAgICAgICBiID0gZGVxdWUtPmxlZnRibG9jazsKKyAgICB9IGVsc2UgaWYgKGkgPT0gZGVxdWUtPmxlbiAtIDEpIHsKKyAgICAgICAgaSA9IGRlcXVlLT5yaWdodGluZGV4OworICAgICAgICBiID0gZGVxdWUtPnJpZ2h0YmxvY2s7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaSArPSBkZXF1ZS0+bGVmdGluZGV4OworICAgICAgICBuID0gaSAvIEJMT0NLTEVOOworICAgICAgICBpICU9IEJMT0NLTEVOOworICAgICAgICBpZiAoaW5kZXggPCAoZGVxdWUtPmxlbiA+PiAxKSkgeworICAgICAgICAgICAgYiA9IGRlcXVlLT5sZWZ0YmxvY2s7CisgICAgICAgICAgICB3aGlsZSAobi0tKQorICAgICAgICAgICAgICAgIGIgPSBiLT5yaWdodGxpbms7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBuID0gKGRlcXVlLT5sZWZ0aW5kZXggKyBkZXF1ZS0+bGVuIC0gMSkgLyBCTE9DS0xFTiAtIG47CisgICAgICAgICAgICBiID0gZGVxdWUtPnJpZ2h0YmxvY2s7CisgICAgICAgICAgICB3aGlsZSAobi0tKQorICAgICAgICAgICAgICAgIGIgPSBiLT5sZWZ0bGluazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpdGVtID0gYi0+ZGF0YVtpXTsKKyAgICBQeV9JTkNSRUYoaXRlbSk7CisgICAgcmV0dXJuIGl0ZW07CiB9CiAKIC8qIGRlbGl0ZW0oKSBpbXBsZW1lbnRlZCBpbiB0ZXJtcyBvZiByb3RhdGUgZm9yIHNpbXBsaWNpdHkgYW5kIHJlYXNvbmFibGUKQEAgLTU0NSw2MiArNTQ1LDYyIEBACiBzdGF0aWMgaW50CiBkZXF1ZV9kZWxfaXRlbShkZXF1ZW9iamVjdCAqZGVxdWUsIFB5X3NzaXplX3QgaSkKIHsKLQlQeU9iamVjdCAqaXRlbTsKKyAgICBQeU9iamVjdCAqaXRlbTsKIAotCWFzc2VydCAoaSA+PSAwICYmIGkgPCBkZXF1ZS0+bGVuKTsKLQlpZiAoX2RlcXVlX3JvdGF0ZShkZXF1ZSwgLWkpID09IC0xKQotCQlyZXR1cm4gLTE7CisgICAgYXNzZXJ0IChpID49IDAgJiYgaSA8IGRlcXVlLT5sZW4pOworICAgIGlmIChfZGVxdWVfcm90YXRlKGRlcXVlLCAtaSkgPT0gLTEpCisgICAgICAgIHJldHVybiAtMTsKIAotCWl0ZW0gPSBkZXF1ZV9wb3BsZWZ0KGRlcXVlLCBOVUxMKTsKLQlhc3NlcnQgKGl0ZW0gIT0gTlVMTCk7Ci0JUHlfREVDUkVGKGl0ZW0pOworICAgIGl0ZW0gPSBkZXF1ZV9wb3BsZWZ0KGRlcXVlLCBOVUxMKTsKKyAgICBhc3NlcnQgKGl0ZW0gIT0gTlVMTCk7CisgICAgUHlfREVDUkVGKGl0ZW0pOwogCi0JcmV0dXJuIF9kZXF1ZV9yb3RhdGUoZGVxdWUsIGkpOworICAgIHJldHVybiBfZGVxdWVfcm90YXRlKGRlcXVlLCBpKTsKIH0KIAogc3RhdGljIGludAogZGVxdWVfYXNzX2l0ZW0oZGVxdWVvYmplY3QgKmRlcXVlLCBQeV9zc2l6ZV90IGksIFB5T2JqZWN0ICp2KQogewotCVB5T2JqZWN0ICpvbGRfdmFsdWU7Ci0JYmxvY2sgKmI7Ci0JUHlfc3NpemVfdCBuLCBsZW49ZGVxdWUtPmxlbiwgaGFsZmxlbj0obGVuKzEpPj4xLCBpbmRleD1pOworICAgIFB5T2JqZWN0ICpvbGRfdmFsdWU7CisgICAgYmxvY2sgKmI7CisgICAgUHlfc3NpemVfdCBuLCBsZW49ZGVxdWUtPmxlbiwgaGFsZmxlbj0obGVuKzEpPj4xLCBpbmRleD1pOwogCi0JaWYgKGkgPCAwIHx8IGkgPj0gbGVuKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLAotCQkJCSJkZXF1ZSBpbmRleCBvdXQgb2YgcmFuZ2UiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAodiA9PSBOVUxMKQotCQlyZXR1cm4gZGVxdWVfZGVsX2l0ZW0oZGVxdWUsIGkpOworICAgIGlmIChpIDwgMCB8fCBpID49IGxlbikgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJkZXF1ZSBpbmRleCBvdXQgb2YgcmFuZ2UiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gZGVxdWVfZGVsX2l0ZW0oZGVxdWUsIGkpOwogCi0JaSArPSBkZXF1ZS0+bGVmdGluZGV4OwotCW4gPSBpIC8gQkxPQ0tMRU47Ci0JaSAlPSBCTE9DS0xFTjsKLQlpZiAoaW5kZXggPD0gaGFsZmxlbikgewotCQliID0gZGVxdWUtPmxlZnRibG9jazsKLQkJd2hpbGUgKG4tLSkKLQkJCWIgPSBiLT5yaWdodGxpbms7Ci0JfSBlbHNlIHsKLQkJbiA9IChkZXF1ZS0+bGVmdGluZGV4ICsgbGVuIC0gMSkgLyBCTE9DS0xFTiAtIG47Ci0JCWIgPSBkZXF1ZS0+cmlnaHRibG9jazsKLQkJd2hpbGUgKG4tLSkKLQkJCWIgPSBiLT5sZWZ0bGluazsKLQl9Ci0JUHlfSU5DUkVGKHYpOwotCW9sZF92YWx1ZSA9IGItPmRhdGFbaV07Ci0JYi0+ZGF0YVtpXSA9IHY7Ci0JUHlfREVDUkVGKG9sZF92YWx1ZSk7Ci0JcmV0dXJuIDA7CisgICAgaSArPSBkZXF1ZS0+bGVmdGluZGV4OworICAgIG4gPSBpIC8gQkxPQ0tMRU47CisgICAgaSAlPSBCTE9DS0xFTjsKKyAgICBpZiAoaW5kZXggPD0gaGFsZmxlbikgeworICAgICAgICBiID0gZGVxdWUtPmxlZnRibG9jazsKKyAgICAgICAgd2hpbGUgKG4tLSkKKyAgICAgICAgICAgIGIgPSBiLT5yaWdodGxpbms7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbiA9IChkZXF1ZS0+bGVmdGluZGV4ICsgbGVuIC0gMSkgLyBCTE9DS0xFTiAtIG47CisgICAgICAgIGIgPSBkZXF1ZS0+cmlnaHRibG9jazsKKyAgICAgICAgd2hpbGUgKG4tLSkKKyAgICAgICAgICAgIGIgPSBiLT5sZWZ0bGluazsKKyAgICB9CisgICAgUHlfSU5DUkVGKHYpOworICAgIG9sZF92YWx1ZSA9IGItPmRhdGFbaV07CisgICAgYi0+ZGF0YVtpXSA9IHY7CisgICAgUHlfREVDUkVGKG9sZF92YWx1ZSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkZXF1ZV9jbGVhcm1ldGhvZChkZXF1ZW9iamVjdCAqZGVxdWUpCiB7Ci0JaW50IHJ2OworICAgIGludCBydjsKIAotCXJ2ID0gZGVxdWVfY2xlYXIoZGVxdWUpOwotCWFzc2VydCAocnYgIT0gLTEpOwotCVB5X1JFVFVSTl9OT05FOworICAgIHJ2ID0gZGVxdWVfY2xlYXIoZGVxdWUpOworICAgIGFzc2VydCAocnYgIT0gLTEpOworICAgIFB5X1JFVFVSTl9OT05FOwogfQogCiBQeURvY19TVFJWQVIoY2xlYXJfZG9jLCAiUmVtb3ZlIGFsbCBlbGVtZW50cyBmcm9tIHRoZSBkZXF1ZS4iKTsKQEAgLTYwOCw0OSArNjA4LDQ5IEBACiBzdGF0aWMgdm9pZAogZGVxdWVfZGVhbGxvYyhkZXF1ZW9iamVjdCAqZGVxdWUpCiB7Ci0JUHlPYmplY3RfR0NfVW5UcmFjayhkZXF1ZSk7Ci0JaWYgKGRlcXVlLT53ZWFrcmVmbGlzdCAhPSBOVUxMKQotCQlQeU9iamVjdF9DbGVhcldlYWtSZWZzKChQeU9iamVjdCAqKSBkZXF1ZSk7Ci0JaWYgKGRlcXVlLT5sZWZ0YmxvY2sgIT0gTlVMTCkgewotCQlkZXF1ZV9jbGVhcihkZXF1ZSk7Ci0JCWFzc2VydChkZXF1ZS0+bGVmdGJsb2NrICE9IE5VTEwpOwotCQlmcmVlYmxvY2soZGVxdWUtPmxlZnRibG9jayk7Ci0JfQotCWRlcXVlLT5sZWZ0YmxvY2sgPSBOVUxMOwotCWRlcXVlLT5yaWdodGJsb2NrID0gTlVMTDsKLQlQeV9UWVBFKGRlcXVlKS0+dHBfZnJlZShkZXF1ZSk7CisgICAgUHlPYmplY3RfR0NfVW5UcmFjayhkZXF1ZSk7CisgICAgaWYgKGRlcXVlLT53ZWFrcmVmbGlzdCAhPSBOVUxMKQorICAgICAgICBQeU9iamVjdF9DbGVhcldlYWtSZWZzKChQeU9iamVjdCAqKSBkZXF1ZSk7CisgICAgaWYgKGRlcXVlLT5sZWZ0YmxvY2sgIT0gTlVMTCkgeworICAgICAgICBkZXF1ZV9jbGVhcihkZXF1ZSk7CisgICAgICAgIGFzc2VydChkZXF1ZS0+bGVmdGJsb2NrICE9IE5VTEwpOworICAgICAgICBmcmVlYmxvY2soZGVxdWUtPmxlZnRibG9jayk7CisgICAgfQorICAgIGRlcXVlLT5sZWZ0YmxvY2sgPSBOVUxMOworICAgIGRlcXVlLT5yaWdodGJsb2NrID0gTlVMTDsKKyAgICBQeV9UWVBFKGRlcXVlKS0+dHBfZnJlZShkZXF1ZSk7CiB9CiAKIHN0YXRpYyBpbnQKIGRlcXVlX3RyYXZlcnNlKGRlcXVlb2JqZWN0ICpkZXF1ZSwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JYmxvY2sgKmI7Ci0JUHlPYmplY3QgKml0ZW07Ci0JUHlfc3NpemVfdCBpbmRleDsKLQlQeV9zc2l6ZV90IGluZGV4bG8gPSBkZXF1ZS0+bGVmdGluZGV4OworICAgIGJsb2NrICpiOworICAgIFB5T2JqZWN0ICppdGVtOworICAgIFB5X3NzaXplX3QgaW5kZXg7CisgICAgUHlfc3NpemVfdCBpbmRleGxvID0gZGVxdWUtPmxlZnRpbmRleDsKIAotCWZvciAoYiA9IGRlcXVlLT5sZWZ0YmxvY2s7IGIgIT0gTlVMTDsgYiA9IGItPnJpZ2h0bGluaykgewotCQljb25zdCBQeV9zc2l6ZV90IGluZGV4aGkgPSBiID09IGRlcXVlLT5yaWdodGJsb2NrID8KLQkJCQkJIGRlcXVlLT5yaWdodGluZGV4IDoKLQkJCQkgICAgCSBCTE9DS0xFTiAtIDE7CisgICAgZm9yIChiID0gZGVxdWUtPmxlZnRibG9jazsgYiAhPSBOVUxMOyBiID0gYi0+cmlnaHRsaW5rKSB7CisgICAgICAgIGNvbnN0IFB5X3NzaXplX3QgaW5kZXhoaSA9IGIgPT0gZGVxdWUtPnJpZ2h0YmxvY2sgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVxdWUtPnJpZ2h0aW5kZXggOgorICAgICAgICAgICAgICAgICAgICAgQkxPQ0tMRU4gLSAxOwogCi0JCWZvciAoaW5kZXggPSBpbmRleGxvOyBpbmRleCA8PSBpbmRleGhpOyArK2luZGV4KSB7Ci0JCQlpdGVtID0gYi0+ZGF0YVtpbmRleF07Ci0JCQlQeV9WSVNJVChpdGVtKTsKLQkJfQotCQlpbmRleGxvID0gMDsKLQl9Ci0JcmV0dXJuIDA7CisgICAgICAgIGZvciAoaW5kZXggPSBpbmRleGxvOyBpbmRleCA8PSBpbmRleGhpOyArK2luZGV4KSB7CisgICAgICAgICAgICBpdGVtID0gYi0+ZGF0YVtpbmRleF07CisgICAgICAgICAgICBQeV9WSVNJVChpdGVtKTsKKyAgICAgICAgfQorICAgICAgICBpbmRleGxvID0gMDsKKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkZXF1ZV9jb3B5KFB5T2JqZWN0ICpkZXF1ZSkKIHsKLQlpZiAoKChkZXF1ZW9iamVjdCAqKWRlcXVlKS0+bWF4bGVuID09IC0xKQotCQlyZXR1cm4gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKChQeU9iamVjdCAqKShQeV9UWVBFKGRlcXVlKSksICJPIiwgZGVxdWUsIE5VTEwpOwotCWVsc2UKLQkJcmV0dXJuIFB5T2JqZWN0X0NhbGxGdW5jdGlvbigoUHlPYmplY3QgKikoUHlfVFlQRShkZXF1ZSkpLCAiT2kiLAotCQkJZGVxdWUsICgoZGVxdWVvYmplY3QgKilkZXF1ZSktPm1heGxlbiwgTlVMTCk7CisgICAgaWYgKCgoZGVxdWVvYmplY3QgKilkZXF1ZSktPm1heGxlbiA9PSAtMSkKKyAgICAgICAgcmV0dXJuIFB5T2JqZWN0X0NhbGxGdW5jdGlvbigoUHlPYmplY3QgKikoUHlfVFlQRShkZXF1ZSkpLCAiTyIsIGRlcXVlLCBOVUxMKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBQeU9iamVjdF9DYWxsRnVuY3Rpb24oKFB5T2JqZWN0ICopKFB5X1RZUEUoZGVxdWUpKSwgIk9pIiwKKyAgICAgICAgICAgIGRlcXVlLCAoKGRlcXVlb2JqZWN0ICopZGVxdWUpLT5tYXhsZW4sIE5VTEwpOwogfQogCiBQeURvY19TVFJWQVIoY29weV9kb2MsICJSZXR1cm4gYSBzaGFsbG93IGNvcHkgb2YgYSBkZXF1ZS4iKTsKQEAgLTY1OCwzMCArNjU4LDMwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZGVxdWVfcmVkdWNlKGRlcXVlb2JqZWN0ICpkZXF1ZSkKIHsKLQlQeU9iamVjdCAqZGljdCwgKnJlc3VsdCwgKmFzbGlzdDsKKyAgICBQeU9iamVjdCAqZGljdCwgKnJlc3VsdCwgKmFzbGlzdDsKIAotCWRpY3QgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKChQeU9iamVjdCAqKWRlcXVlLCAiX19kaWN0X18iKTsKLQlpZiAoZGljdCA9PSBOVUxMKQotCQlQeUVycl9DbGVhcigpOwotCWFzbGlzdCA9IFB5U2VxdWVuY2VfTGlzdCgoUHlPYmplY3QgKilkZXF1ZSk7Ci0JaWYgKGFzbGlzdCA9PSBOVUxMKSB7Ci0JCVB5X1hERUNSRUYoZGljdCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoZGljdCA9PSBOVUxMKSB7Ci0JCWlmIChkZXF1ZS0+bWF4bGVuID09IC0xKQotCQkJcmVzdWx0ID0gUHlfQnVpbGRWYWx1ZSgiTyhPKSIsIFB5X1RZUEUoZGVxdWUpLCBhc2xpc3QpOwotCQllbHNlCi0JCQlyZXN1bHQgPSBQeV9CdWlsZFZhbHVlKCJPKE9uKSIsIFB5X1RZUEUoZGVxdWUpLCBhc2xpc3QsIGRlcXVlLT5tYXhsZW4pOwotCX0gZWxzZSB7Ci0JCWlmIChkZXF1ZS0+bWF4bGVuID09IC0xKQotCQkJcmVzdWx0ID0gUHlfQnVpbGRWYWx1ZSgiTyhPTylPIiwgUHlfVFlQRShkZXF1ZSksIGFzbGlzdCwgUHlfTm9uZSwgZGljdCk7Ci0JCWVsc2UKLQkJCXJlc3VsdCA9IFB5X0J1aWxkVmFsdWUoIk8oT24pTyIsIFB5X1RZUEUoZGVxdWUpLCBhc2xpc3QsIGRlcXVlLT5tYXhsZW4sIGRpY3QpOwotCX0KLQlQeV9YREVDUkVGKGRpY3QpOwotCVB5X0RFQ1JFRihhc2xpc3QpOwotCXJldHVybiByZXN1bHQ7CisgICAgZGljdCA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoKFB5T2JqZWN0ICopZGVxdWUsICJfX2RpY3RfXyIpOworICAgIGlmIChkaWN0ID09IE5VTEwpCisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgYXNsaXN0ID0gUHlTZXF1ZW5jZV9MaXN0KChQeU9iamVjdCAqKWRlcXVlKTsKKyAgICBpZiAoYXNsaXN0ID09IE5VTEwpIHsKKyAgICAgICAgUHlfWERFQ1JFRihkaWN0KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChkaWN0ID09IE5VTEwpIHsKKyAgICAgICAgaWYgKGRlcXVlLT5tYXhsZW4gPT0gLTEpCisgICAgICAgICAgICByZXN1bHQgPSBQeV9CdWlsZFZhbHVlKCJPKE8pIiwgUHlfVFlQRShkZXF1ZSksIGFzbGlzdCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJlc3VsdCA9IFB5X0J1aWxkVmFsdWUoIk8oT24pIiwgUHlfVFlQRShkZXF1ZSksIGFzbGlzdCwgZGVxdWUtPm1heGxlbik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGRlcXVlLT5tYXhsZW4gPT0gLTEpCisgICAgICAgICAgICByZXN1bHQgPSBQeV9CdWlsZFZhbHVlKCJPKE9PKU8iLCBQeV9UWVBFKGRlcXVlKSwgYXNsaXN0LCBQeV9Ob25lLCBkaWN0KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmVzdWx0ID0gUHlfQnVpbGRWYWx1ZSgiTyhPbilPIiwgUHlfVFlQRShkZXF1ZSksIGFzbGlzdCwgZGVxdWUtPm1heGxlbiwgZGljdCk7CisgICAgfQorICAgIFB5X1hERUNSRUYoZGljdCk7CisgICAgUHlfREVDUkVGKGFzbGlzdCk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogUHlEb2NfU1RSVkFSKHJlZHVjZV9kb2MsICJSZXR1cm4gc3RhdGUgaW5mb3JtYXRpb24gZm9yIHBpY2tsaW5nLiIpOwpAQCAtNjg5LDIxMCArNjg5LDIxMCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGRlcXVlX3JlcHIoUHlPYmplY3QgKmRlcXVlKQogewotCVB5T2JqZWN0ICphc2xpc3QsICpyZXN1bHQsICpmbXQ7Ci0JaW50IGk7CisgICAgUHlPYmplY3QgKmFzbGlzdCwgKnJlc3VsdCwgKmZtdDsKKyAgICBpbnQgaTsKIAotCWkgPSBQeV9SZXByRW50ZXIoZGVxdWUpOwotCWlmIChpICE9IDApIHsKLQkJaWYgKGkgPCAwKQotCQkJcmV0dXJuIE5VTEw7Ci0JCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKCJbLi4uXSIpOwotCX0KKyAgICBpID0gUHlfUmVwckVudGVyKGRlcXVlKTsKKyAgICBpZiAoaSAhPSAwKSB7CisgICAgICAgIGlmIChpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZygiWy4uLl0iKTsKKyAgICB9CiAKLQlhc2xpc3QgPSBQeVNlcXVlbmNlX0xpc3QoZGVxdWUpOwotCWlmIChhc2xpc3QgPT0gTlVMTCkgewotCQlQeV9SZXByTGVhdmUoZGVxdWUpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKCgoZGVxdWVvYmplY3QgKilkZXF1ZSktPm1heGxlbiAhPSAtMSkKLQkJZm10ID0gUHlTdHJpbmdfRnJvbUZvcm1hdCgiZGVxdWUoJSVyLCBtYXhsZW49JXpkKSIsIAotCQkJCQkoKGRlcXVlb2JqZWN0ICopZGVxdWUpLT5tYXhsZW4pOwotCWVsc2UKLQkJZm10ID0gUHlTdHJpbmdfRnJvbVN0cmluZygiZGVxdWUoJXIpIik7ICAKLQlpZiAoZm10ID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKGFzbGlzdCk7Ci0JCVB5X1JlcHJMZWF2ZShkZXF1ZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXN1bHQgPSBQeVN0cmluZ19Gb3JtYXQoZm10LCBhc2xpc3QpOwotCVB5X0RFQ1JFRihmbXQpOwotCVB5X0RFQ1JFRihhc2xpc3QpOwotCVB5X1JlcHJMZWF2ZShkZXF1ZSk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBhc2xpc3QgPSBQeVNlcXVlbmNlX0xpc3QoZGVxdWUpOworICAgIGlmIChhc2xpc3QgPT0gTlVMTCkgeworICAgICAgICBQeV9SZXByTGVhdmUoZGVxdWUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKCgoZGVxdWVvYmplY3QgKilkZXF1ZSktPm1heGxlbiAhPSAtMSkKKyAgICAgICAgZm10ID0gUHlTdHJpbmdfRnJvbUZvcm1hdCgiZGVxdWUoJSVyLCBtYXhsZW49JXpkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoZGVxdWVvYmplY3QgKilkZXF1ZSktPm1heGxlbik7CisgICAgZWxzZQorICAgICAgICBmbXQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCJkZXF1ZSglcikiKTsKKyAgICBpZiAoZm10ID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKGFzbGlzdCk7CisgICAgICAgIFB5X1JlcHJMZWF2ZShkZXF1ZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXN1bHQgPSBQeVN0cmluZ19Gb3JtYXQoZm10LCBhc2xpc3QpOworICAgIFB5X0RFQ1JFRihmbXQpOworICAgIFB5X0RFQ1JFRihhc2xpc3QpOworICAgIFB5X1JlcHJMZWF2ZShkZXF1ZSk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIGludAogZGVxdWVfdHBfcHJpbnQoUHlPYmplY3QgKmRlcXVlLCBGSUxFICpmcCwgaW50IGZsYWdzKQogewotCVB5T2JqZWN0ICppdCwgKml0ZW07Ci0JY2hhciAqZW1pdCA9ICIiOwkvKiBObyBzZXBhcmF0b3IgZW1pdHRlZCBvbiBmaXJzdCBwYXNzICovCi0JY2hhciAqc2VwYXJhdG9yID0gIiwgIjsKLQlpbnQgaTsKKyAgICBQeU9iamVjdCAqaXQsICppdGVtOworICAgIGNoYXIgKmVtaXQgPSAiIjsgICAgICAgICAgICAvKiBObyBzZXBhcmF0b3IgZW1pdHRlZCBvbiBmaXJzdCBwYXNzICovCisgICAgY2hhciAqc2VwYXJhdG9yID0gIiwgIjsKKyAgICBpbnQgaTsKIAotCWkgPSBQeV9SZXByRW50ZXIoZGVxdWUpOwotCWlmIChpICE9IDApIHsKLQkJaWYgKGkgPCAwKQotCQkJcmV0dXJuIGk7Ci0JCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQkJZnB1dHMoIlsuLi5dIiwgZnApOwotCQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCQlyZXR1cm4gMDsKLQl9CisgICAgaSA9IFB5X1JlcHJFbnRlcihkZXF1ZSk7CisgICAgaWYgKGkgIT0gMCkgeworICAgICAgICBpZiAoaSA8IDApCisgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICBmcHV0cygiWy4uLl0iLCBmcCk7CisgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgICAgIHJldHVybiAwOworICAgIH0KIAotCWl0ID0gUHlPYmplY3RfR2V0SXRlcihkZXF1ZSk7Ci0JaWYgKGl0ID09IE5VTEwpCi0JCXJldHVybiAtMTsKKyAgICBpdCA9IFB5T2JqZWN0X0dldEl0ZXIoZGVxdWUpOworICAgIGlmIChpdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CiAKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JZnB1dHMoImRlcXVlKFsiLCBmcCk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQl3aGlsZSAoKGl0ZW0gPSBQeUl0ZXJfTmV4dChpdCkpICE9IE5VTEwpIHsKLQkJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCQlmcHV0cyhlbWl0LCBmcCk7Ci0JCVB5X0VORF9BTExPV19USFJFQURTCi0JCWVtaXQgPSBzZXBhcmF0b3I7Ci0JCWlmIChQeU9iamVjdF9QcmludChpdGVtLCBmcCwgMCkgIT0gMCkgewotCQkJUHlfREVDUkVGKGl0ZW0pOwotCQkJUHlfREVDUkVGKGl0KTsKLQkJCVB5X1JlcHJMZWF2ZShkZXF1ZSk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJUHlfREVDUkVGKGl0ZW0pOwotCX0KLQlQeV9SZXByTGVhdmUoZGVxdWUpOwotCVB5X0RFQ1JFRihpdCk7Ci0JaWYgKFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiAtMTsKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgZnB1dHMoImRlcXVlKFsiLCBmcCk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICB3aGlsZSAoKGl0ZW0gPSBQeUl0ZXJfTmV4dChpdCkpICE9IE5VTEwpIHsKKyAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICBmcHV0cyhlbWl0LCBmcCk7CisgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgICAgIGVtaXQgPSBzZXBhcmF0b3I7CisgICAgICAgIGlmIChQeU9iamVjdF9QcmludChpdGVtLCBmcCwgMCkgIT0gMCkgeworICAgICAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgICAgICAgICAgUHlfREVDUkVGKGl0KTsKKyAgICAgICAgICAgIFB5X1JlcHJMZWF2ZShkZXF1ZSk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgIH0KKyAgICBQeV9SZXByTGVhdmUoZGVxdWUpOworICAgIFB5X0RFQ1JFRihpdCk7CisgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiAtMTsKIAotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlpZiAoKChkZXF1ZW9iamVjdCAqKWRlcXVlKS0+bWF4bGVuID09IC0xKQotCQlmcHV0cygiXSkiLCBmcCk7Ci0JZWxzZQotCQlmcHJpbnRmKGZwLCAiXSwgbWF4bGVuPSUiIFBZX0ZPUk1BVF9TSVpFX1QgImQpIiwgKChkZXF1ZW9iamVjdCAqKWRlcXVlKS0+bWF4bGVuKTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCXJldHVybiAwOworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICBpZiAoKChkZXF1ZW9iamVjdCAqKWRlcXVlKS0+bWF4bGVuID09IC0xKQorICAgICAgICBmcHV0cygiXSkiLCBmcCk7CisgICAgZWxzZQorICAgICAgICBmcHJpbnRmKGZwLCAiXSwgbWF4bGVuPSUiIFBZX0ZPUk1BVF9TSVpFX1QgImQpIiwgKChkZXF1ZW9iamVjdCAqKWRlcXVlKS0+bWF4bGVuKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZGVxdWVfcmljaGNvbXBhcmUoUHlPYmplY3QgKnYsIFB5T2JqZWN0ICp3LCBpbnQgb3ApCiB7Ci0JUHlPYmplY3QgKml0MT1OVUxMLCAqaXQyPU5VTEwsICp4LCAqeTsKLQlQeV9zc2l6ZV90IHZzLCB3czsKLQlpbnQgYiwgY21wPS0xOworICAgIFB5T2JqZWN0ICppdDE9TlVMTCwgKml0Mj1OVUxMLCAqeCwgKnk7CisgICAgUHlfc3NpemVfdCB2cywgd3M7CisgICAgaW50IGIsIGNtcD0tMTsKIAotCWlmICghUHlPYmplY3RfVHlwZUNoZWNrKHYsICZkZXF1ZV90eXBlKSB8fAotCSAgICAhUHlPYmplY3RfVHlwZUNoZWNrKHcsICZkZXF1ZV90eXBlKSkgewotCQlQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOwotCQlyZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7Ci0JfQorICAgIGlmICghUHlPYmplY3RfVHlwZUNoZWNrKHYsICZkZXF1ZV90eXBlKSB8fAorICAgICAgICAhUHlPYmplY3RfVHlwZUNoZWNrKHcsICZkZXF1ZV90eXBlKSkgeworICAgICAgICBQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOworICAgICAgICByZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7CisgICAgfQogCi0JLyogU2hvcnRjdXRzICovCi0JdnMgPSAoKGRlcXVlb2JqZWN0ICopdiktPmxlbjsKLQl3cyA9ICgoZGVxdWVvYmplY3QgKil3KS0+bGVuOwotCWlmIChvcCA9PSBQeV9FUSkgewotCQlpZiAodiA9PSB3KQotCQkJUHlfUkVUVVJOX1RSVUU7Ci0JCWlmICh2cyAhPSB3cykKLQkJCVB5X1JFVFVSTl9GQUxTRTsKLQl9Ci0JaWYgKG9wID09IFB5X05FKSB7Ci0JCWlmICh2ID09IHcpCi0JCQlQeV9SRVRVUk5fRkFMU0U7Ci0JCWlmICh2cyAhPSB3cykKLQkJCVB5X1JFVFVSTl9UUlVFOwotCX0KKyAgICAvKiBTaG9ydGN1dHMgKi8KKyAgICB2cyA9ICgoZGVxdWVvYmplY3QgKil2KS0+bGVuOworICAgIHdzID0gKChkZXF1ZW9iamVjdCAqKXcpLT5sZW47CisgICAgaWYgKG9wID09IFB5X0VRKSB7CisgICAgICAgIGlmICh2ID09IHcpCisgICAgICAgICAgICBQeV9SRVRVUk5fVFJVRTsKKyAgICAgICAgaWYgKHZzICE9IHdzKQorICAgICAgICAgICAgUHlfUkVUVVJOX0ZBTFNFOworICAgIH0KKyAgICBpZiAob3AgPT0gUHlfTkUpIHsKKyAgICAgICAgaWYgKHYgPT0gdykKKyAgICAgICAgICAgIFB5X1JFVFVSTl9GQUxTRTsKKyAgICAgICAgaWYgKHZzICE9IHdzKQorICAgICAgICAgICAgUHlfUkVUVVJOX1RSVUU7CisgICAgfQogCi0JLyogU2VhcmNoIGZvciB0aGUgZmlyc3QgaW5kZXggd2hlcmUgaXRlbXMgYXJlIGRpZmZlcmVudCAqLwotCWl0MSA9IFB5T2JqZWN0X0dldEl0ZXIodik7Ci0JaWYgKGl0MSA9PSBOVUxMKQotCQlnb3RvIGRvbmU7Ci0JaXQyID0gUHlPYmplY3RfR2V0SXRlcih3KTsKLQlpZiAoaXQyID09IE5VTEwpCi0JCWdvdG8gZG9uZTsKLQlmb3IgKDs7KSB7Ci0JCXggPSBQeUl0ZXJfTmV4dChpdDEpOwotCQlpZiAoeCA9PSBOVUxMICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCQlnb3RvIGRvbmU7Ci0JCXkgPSBQeUl0ZXJfTmV4dChpdDIpOwotCQlpZiAoeCA9PSBOVUxMIHx8IHkgPT0gTlVMTCkKLQkJCWJyZWFrOwotCQliID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKHgsIHksIFB5X0VRKTsKLQkJaWYgKGIgPT0gMCkgewotCQkJY21wID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKHgsIHksIG9wKTsKLQkJCVB5X0RFQ1JFRih4KTsKLQkJCVB5X0RFQ1JFRih5KTsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCQlQeV9ERUNSRUYoeCk7Ci0JCVB5X0RFQ1JFRih5KTsKLQkJaWYgKGIgPT0gLTEpCi0JCQlnb3RvIGRvbmU7Ci0JfQotCS8qIFdlIHJlYWNoZWQgdGhlIGVuZCBvZiBvbmUgZGVxdWUgb3IgYm90aCAqLwotCVB5X1hERUNSRUYoeCk7Ci0JUHlfWERFQ1JFRih5KTsKLQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkKLQkJZ290byBkb25lOwotCXN3aXRjaCAob3ApIHsKLQljYXNlIFB5X0xUOiBjbXAgPSB5ICE9IE5VTEw7IGJyZWFrOyAgLyogaWYgdyB3YXMgbG9uZ2VyICovCi0JY2FzZSBQeV9MRTogY21wID0geCA9PSBOVUxMOyBicmVhazsgIC8qIGlmIHYgd2FzIG5vdCBsb25nZXIgKi8KLQljYXNlIFB5X0VROiBjbXAgPSB4ID09IHk7ICAgIGJyZWFrOyAgLyogaWYgd2UgcmVhY2hlZCB0aGUgZW5kIG9mIGJvdGggKi8KLQljYXNlIFB5X05FOiBjbXAgPSB4ICE9IHk7ICAgIGJyZWFrOyAgLyogaWYgb25lIGRlcXVlIGNvbnRpbnVlcyAqLwotCWNhc2UgUHlfR1Q6IGNtcCA9IHggIT0gTlVMTDsgYnJlYWs7ICAvKiBpZiB2IHdhcyBsb25nZXIgKi8KLQljYXNlIFB5X0dFOiBjbXAgPSB5ID09IE5VTEw7IGJyZWFrOyAgLyogaWYgdyB3YXMgbm90IGxvbmdlciAqLwotCX0KKyAgICAvKiBTZWFyY2ggZm9yIHRoZSBmaXJzdCBpbmRleCB3aGVyZSBpdGVtcyBhcmUgZGlmZmVyZW50ICovCisgICAgaXQxID0gUHlPYmplY3RfR2V0SXRlcih2KTsKKyAgICBpZiAoaXQxID09IE5VTEwpCisgICAgICAgIGdvdG8gZG9uZTsKKyAgICBpdDIgPSBQeU9iamVjdF9HZXRJdGVyKHcpOworICAgIGlmIChpdDIgPT0gTlVMTCkKKyAgICAgICAgZ290byBkb25lOworICAgIGZvciAoOzspIHsKKyAgICAgICAgeCA9IFB5SXRlcl9OZXh0KGl0MSk7CisgICAgICAgIGlmICh4ID09IE5VTEwgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgICAgeSA9IFB5SXRlcl9OZXh0KGl0Mik7CisgICAgICAgIGlmICh4ID09IE5VTEwgfHwgeSA9PSBOVUxMKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGIgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woeCwgeSwgUHlfRVEpOworICAgICAgICBpZiAoYiA9PSAwKSB7CisgICAgICAgICAgICBjbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woeCwgeSwgb3ApOworICAgICAgICAgICAgUHlfREVDUkVGKHgpOworICAgICAgICAgICAgUHlfREVDUkVGKHkpOworICAgICAgICAgICAgZ290byBkb25lOworICAgICAgICB9CisgICAgICAgIFB5X0RFQ1JFRih4KTsKKyAgICAgICAgUHlfREVDUkVGKHkpOworICAgICAgICBpZiAoYiA9PSAtMSkKKyAgICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICB9CisgICAgLyogV2UgcmVhY2hlZCB0aGUgZW5kIG9mIG9uZSBkZXF1ZSBvciBib3RoICovCisgICAgUHlfWERFQ1JFRih4KTsKKyAgICBQeV9YREVDUkVGKHkpOworICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICBnb3RvIGRvbmU7CisgICAgc3dpdGNoIChvcCkgeworICAgIGNhc2UgUHlfTFQ6IGNtcCA9IHkgIT0gTlVMTDsgYnJlYWs7ICAvKiBpZiB3IHdhcyBsb25nZXIgKi8KKyAgICBjYXNlIFB5X0xFOiBjbXAgPSB4ID09IE5VTEw7IGJyZWFrOyAgLyogaWYgdiB3YXMgbm90IGxvbmdlciAqLworICAgIGNhc2UgUHlfRVE6IGNtcCA9IHggPT0geTsgICAgYnJlYWs7ICAvKiBpZiB3ZSByZWFjaGVkIHRoZSBlbmQgb2YgYm90aCAqLworICAgIGNhc2UgUHlfTkU6IGNtcCA9IHggIT0geTsgICAgYnJlYWs7ICAvKiBpZiBvbmUgZGVxdWUgY29udGludWVzICovCisgICAgY2FzZSBQeV9HVDogY21wID0geCAhPSBOVUxMOyBicmVhazsgIC8qIGlmIHYgd2FzIGxvbmdlciAqLworICAgIGNhc2UgUHlfR0U6IGNtcCA9IHkgPT0gTlVMTDsgYnJlYWs7ICAvKiBpZiB3IHdhcyBub3QgbG9uZ2VyICovCisgICAgfQogCiBkb25lOgotCVB5X1hERUNSRUYoaXQxKTsKLQlQeV9YREVDUkVGKGl0Mik7Ci0JaWYgKGNtcCA9PSAxKQotCQlQeV9SRVRVUk5fVFJVRTsKLQlpZiAoY21wID09IDApCi0JCVB5X1JFVFVSTl9GQUxTRTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeV9YREVDUkVGKGl0MSk7CisgICAgUHlfWERFQ1JFRihpdDIpOworICAgIGlmIChjbXAgPT0gMSkKKyAgICAgICAgUHlfUkVUVVJOX1RSVUU7CisgICAgaWYgKGNtcCA9PSAwKQorICAgICAgICBQeV9SRVRVUk5fRkFMU0U7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBpbnQKIGRlcXVlX2luaXQoZGVxdWVvYmplY3QgKmRlcXVlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZGFyZ3MpCiB7Ci0JUHlPYmplY3QgKml0ZXJhYmxlID0gTlVMTDsKLQlQeU9iamVjdCAqbWF4bGVub2JqID0gTlVMTDsKLQlQeV9zc2l6ZV90IG1heGxlbiA9IC0xOwotCWNoYXIgKmt3bGlzdFtdID0geyJpdGVyYWJsZSIsICJtYXhsZW4iLCAwfTsKKyAgICBQeU9iamVjdCAqaXRlcmFibGUgPSBOVUxMOworICAgIFB5T2JqZWN0ICptYXhsZW5vYmogPSBOVUxMOworICAgIFB5X3NzaXplX3QgbWF4bGVuID0gLTE7CisgICAgY2hhciAqa3dsaXN0W10gPSB7Iml0ZXJhYmxlIiwgIm1heGxlbiIsIDB9OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkYXJncywgInxPTzpkZXF1ZSIsIGt3bGlzdCwgJml0ZXJhYmxlLCAmbWF4bGVub2JqKSkKLQkJcmV0dXJuIC0xOwotCWlmIChtYXhsZW5vYmogIT0gTlVMTCAmJiBtYXhsZW5vYmogIT0gUHlfTm9uZSkgewotCQltYXhsZW4gPSBQeUludF9Bc1NzaXplX3QobWF4bGVub2JqKTsKLQkJaWYgKG1heGxlbiA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIC0xOwotCQlpZiAobWF4bGVuIDwgMCkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJtYXhsZW4gbXVzdCBiZSBub24tbmVnYXRpdmUiKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCX0KLQlkZXF1ZS0+bWF4bGVuID0gbWF4bGVuOwotCWRlcXVlX2NsZWFyKGRlcXVlKTsKLQlpZiAoaXRlcmFibGUgIT0gTlVMTCkgewotCQlQeU9iamVjdCAqcnYgPSBkZXF1ZV9leHRlbmQoZGVxdWUsIGl0ZXJhYmxlKTsKLQkJaWYgKHJ2ID09IE5VTEwpCi0JCQlyZXR1cm4gLTE7Ci0JCVB5X0RFQ1JFRihydik7Ci0JfQotCXJldHVybiAwOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZGFyZ3MsICJ8T086ZGVxdWUiLCBrd2xpc3QsICZpdGVyYWJsZSwgJm1heGxlbm9iaikpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAobWF4bGVub2JqICE9IE5VTEwgJiYgbWF4bGVub2JqICE9IFB5X05vbmUpIHsKKyAgICAgICAgbWF4bGVuID0gUHlJbnRfQXNTc2l6ZV90KG1heGxlbm9iaik7CisgICAgICAgIGlmIChtYXhsZW4gPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaWYgKG1heGxlbiA8IDApIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAibWF4bGVuIG11c3QgYmUgbm9uLW5lZ2F0aXZlIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisgICAgZGVxdWUtPm1heGxlbiA9IG1heGxlbjsKKyAgICBkZXF1ZV9jbGVhcihkZXF1ZSk7CisgICAgaWYgKGl0ZXJhYmxlICE9IE5VTEwpIHsKKyAgICAgICAgUHlPYmplY3QgKnJ2ID0gZGVxdWVfZXh0ZW5kKGRlcXVlLCBpdGVyYWJsZSk7CisgICAgICAgIGlmIChydiA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBQeV9ERUNSRUYocnYpOworICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5U2VxdWVuY2VNZXRob2RzIGRlcXVlX2FzX3NlcXVlbmNlID0gewotCShsZW5mdW5jKWRlcXVlX2xlbiwJCS8qIHNxX2xlbmd0aCAqLwotCTAsCQkJCS8qIHNxX2NvbmNhdCAqLwotCTAsCQkJCS8qIHNxX3JlcGVhdCAqLwotCShzc2l6ZWFyZ2Z1bmMpZGVxdWVfaXRlbSwJLyogc3FfaXRlbSAqLwotCTAsCQkJCS8qIHNxX3NsaWNlICovCi0JKHNzaXplb2JqYXJncHJvYylkZXF1ZV9hc3NfaXRlbSwJLyogc3FfYXNzX2l0ZW0gKi8KLQkwLAkJCQkvKiBzcV9hc3Nfc2xpY2UgKi8KLQkwLAkJCQkvKiBzcV9jb250YWlucyAqLwotCShiaW5hcnlmdW5jKWRlcXVlX2lucGxhY2VfY29uY2F0LAkvKiBzcV9pbnBsYWNlX2NvbmNhdCAqLwotCTAsCQkJCS8qIHNxX2lucGxhY2VfcmVwZWF0ICovCisgICAgKGxlbmZ1bmMpZGVxdWVfbGVuLCAgICAgICAgICAgICAgICAgLyogc3FfbGVuZ3RoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3FfY29uY2F0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3FfcmVwZWF0ICovCisgICAgKHNzaXplYXJnZnVuYylkZXF1ZV9pdGVtLCAgICAgICAgICAgLyogc3FfaXRlbSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNxX3NsaWNlICovCisgICAgKHNzaXplb2JqYXJncHJvYylkZXF1ZV9hc3NfaXRlbSwgICAgICAgICAgICAvKiBzcV9hc3NfaXRlbSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNxX2Fzc19zbGljZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNxX2NvbnRhaW5zICovCisgICAgKGJpbmFyeWZ1bmMpZGVxdWVfaW5wbGFjZV9jb25jYXQsICAgICAgICAgICAvKiBzcV9pbnBsYWNlX2NvbmNhdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNxX2lucGxhY2VfcmVwZWF0ICovCiAKIH07CiAKQEAgLTkwMSwzNCArOTAxLDM0IEBACiBzdGF0aWMgUHlPYmplY3QgKmRlcXVlX2l0ZXIoZGVxdWVvYmplY3QgKmRlcXVlKTsKIHN0YXRpYyBQeU9iamVjdCAqZGVxdWVfcmV2aXRlcihkZXF1ZW9iamVjdCAqZGVxdWUpOwogUHlEb2NfU1RSVkFSKHJldmVyc2VkX2RvYywKLQkiRC5fX3JldmVyc2VkX18oKSAtLSByZXR1cm4gYSByZXZlcnNlIGl0ZXJhdG9yIG92ZXIgdGhlIGRlcXVlIik7CisgICAgIkQuX19yZXZlcnNlZF9fKCkgLS0gcmV0dXJuIGEgcmV2ZXJzZSBpdGVyYXRvciBvdmVyIHRoZSBkZXF1ZSIpOwogCiBzdGF0aWMgUHlNZXRob2REZWYgZGVxdWVfbWV0aG9kc1tdID0gewotCXsiYXBwZW5kIiwJCShQeUNGdW5jdGlvbilkZXF1ZV9hcHBlbmQsCi0JCU1FVEhfTywJCSBhcHBlbmRfZG9jfSwKLQl7ImFwcGVuZGxlZnQiLAkJKFB5Q0Z1bmN0aW9uKWRlcXVlX2FwcGVuZGxlZnQsCi0JCU1FVEhfTywJCSBhcHBlbmRsZWZ0X2RvY30sCi0JeyJjbGVhciIsCQkoUHlDRnVuY3Rpb24pZGVxdWVfY2xlYXJtZXRob2QsCi0JCU1FVEhfTk9BUkdTLAkgY2xlYXJfZG9jfSwKLQl7Il9fY29weV9fIiwJCShQeUNGdW5jdGlvbilkZXF1ZV9jb3B5LAotCQlNRVRIX05PQVJHUywJIGNvcHlfZG9jfSwKLQl7ImV4dGVuZCIsCQkoUHlDRnVuY3Rpb24pZGVxdWVfZXh0ZW5kLAotCQlNRVRIX08sCQkgZXh0ZW5kX2RvY30sCi0JeyJleHRlbmRsZWZ0IiwJCShQeUNGdW5jdGlvbilkZXF1ZV9leHRlbmRsZWZ0LAotCQlNRVRIX08sCQkgZXh0ZW5kbGVmdF9kb2N9LAotCXsicG9wIiwJCQkoUHlDRnVuY3Rpb24pZGVxdWVfcG9wLAotCQlNRVRIX05PQVJHUywJIHBvcF9kb2N9LAotCXsicG9wbGVmdCIsCQkoUHlDRnVuY3Rpb24pZGVxdWVfcG9wbGVmdCwKLQkJTUVUSF9OT0FSR1MsCSBwb3BsZWZ0X2RvY30sCi0JeyJfX3JlZHVjZV9fIiwJKFB5Q0Z1bmN0aW9uKWRlcXVlX3JlZHVjZSwKLQkJTUVUSF9OT0FSR1MsCSByZWR1Y2VfZG9jfSwKLQl7InJlbW92ZSIsCQkoUHlDRnVuY3Rpb24pZGVxdWVfcmVtb3ZlLAotCQlNRVRIX08sCQkgcmVtb3ZlX2RvY30sCi0JeyJfX3JldmVyc2VkX18iLAkoUHlDRnVuY3Rpb24pZGVxdWVfcmV2aXRlciwKLQkJTUVUSF9OT0FSR1MsCSByZXZlcnNlZF9kb2N9LAotCXsicm90YXRlIiwJCShQeUNGdW5jdGlvbilkZXF1ZV9yb3RhdGUsCi0JCU1FVEhfVkFSQVJHUywJcm90YXRlX2RvY30sCi0Je05VTEwsCQlOVUxMfQkvKiBzZW50aW5lbCAqLworICAgIHsiYXBwZW5kIiwgICAgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pZGVxdWVfYXBwZW5kLAorICAgICAgICBNRVRIX08sICAgICAgICAgICAgICAgICAgYXBwZW5kX2RvY30sCisgICAgeyJhcHBlbmRsZWZ0IiwgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilkZXF1ZV9hcHBlbmRsZWZ0LAorICAgICAgICBNRVRIX08sICAgICAgICAgICAgICAgICAgYXBwZW5kbGVmdF9kb2N9LAorICAgIHsiY2xlYXIiLCAgICAgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pZGVxdWVfY2xlYXJtZXRob2QsCisgICAgICAgIE1FVEhfTk9BUkdTLCAgICAgICAgICAgICBjbGVhcl9kb2N9LAorICAgIHsiX19jb3B5X18iLCAgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pZGVxdWVfY29weSwKKyAgICAgICAgTUVUSF9OT0FSR1MsICAgICAgICAgICAgIGNvcHlfZG9jfSwKKyAgICB7ImV4dGVuZCIsICAgICAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWRlcXVlX2V4dGVuZCwKKyAgICAgICAgTUVUSF9PLCAgICAgICAgICAgICAgICAgIGV4dGVuZF9kb2N9LAorICAgIHsiZXh0ZW5kbGVmdCIsICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pZGVxdWVfZXh0ZW5kbGVmdCwKKyAgICAgICAgTUVUSF9PLCAgICAgICAgICAgICAgICAgIGV4dGVuZGxlZnRfZG9jfSwKKyAgICB7InBvcCIsICAgICAgICAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWRlcXVlX3BvcCwKKyAgICAgICAgTUVUSF9OT0FSR1MsICAgICAgICAgICAgIHBvcF9kb2N9LAorICAgIHsicG9wbGVmdCIsICAgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pZGVxdWVfcG9wbGVmdCwKKyAgICAgICAgTUVUSF9OT0FSR1MsICAgICAgICAgICAgIHBvcGxlZnRfZG9jfSwKKyAgICB7Il9fcmVkdWNlX18iLCAgICAgIChQeUNGdW5jdGlvbilkZXF1ZV9yZWR1Y2UsCisgICAgICAgIE1FVEhfTk9BUkdTLCAgICAgICAgICAgICByZWR1Y2VfZG9jfSwKKyAgICB7InJlbW92ZSIsICAgICAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWRlcXVlX3JlbW92ZSwKKyAgICAgICAgTUVUSF9PLCAgICAgICAgICAgICAgICAgIHJlbW92ZV9kb2N9LAorICAgIHsiX19yZXZlcnNlZF9fIiwgICAgICAgICAgICAoUHlDRnVuY3Rpb24pZGVxdWVfcmV2aXRlciwKKyAgICAgICAgTUVUSF9OT0FSR1MsICAgICAgICAgICAgIHJldmVyc2VkX2RvY30sCisgICAgeyJyb3RhdGUiLCAgICAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilkZXF1ZV9yb3RhdGUsCisgICAgICAgIE1FVEhfVkFSQVJHUywgICAgICAgICAgIHJvdGF0ZV9kb2N9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0gICAvKiBzZW50aW5lbCAqLwogfTsKIAogUHlEb2NfU1RSVkFSKGRlcXVlX2RvYywKQEAgLTkzNyw1OCArOTM3LDU4IEBACiBCdWlsZCBhbiBvcmRlcmVkIGNvbGxlY3Rpb24gYWNjZXNzaWJsZSBmcm9tIGVuZHBvaW50cyBvbmx5LiIpOwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IGRlcXVlX3R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JImNvbGxlY3Rpb25zLmRlcXVlIiwJCS8qIHRwX25hbWUgKi8KLQlzaXplb2YoZGVxdWVvYmplY3QpLAkJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpZGVxdWVfZGVhbGxvYywJLyogdHBfZGVhbGxvYyAqLwotCWRlcXVlX3RwX3ByaW50LAkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkvKiB0cF9jb21wYXJlICovCi0JZGVxdWVfcmVwciwJCQkvKiB0cF9yZXByICovCi0JMCwJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JJmRlcXVlX2FzX3NlcXVlbmNlLAkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JKGhhc2hmdW5jKVB5T2JqZWN0X0hhc2hOb3RJbXBsZW1lbnRlZCwJLyogdHBfaGFzaCAqLwotCTAsCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkvKiB0cF9zdHIgKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfQkFTRVRZUEUgfCBQeV9UUEZMQUdTX0hBVkVfR0MgfAotCQlQeV9UUEZMQUdTX0hBVkVfV0VBS1JFRlMsCS8qIHRwX2ZsYWdzICovCi0JZGVxdWVfZG9jLAkJCS8qIHRwX2RvYyAqLwotCSh0cmF2ZXJzZXByb2MpZGVxdWVfdHJhdmVyc2UsCS8qIHRwX3RyYXZlcnNlICovCi0JKGlucXVpcnkpZGVxdWVfY2xlYXIsCQkvKiB0cF9jbGVhciAqLwotCShyaWNoY21wZnVuYylkZXF1ZV9yaWNoY29tcGFyZSwJLyogdHBfcmljaGNvbXBhcmUgKi8KLQlvZmZzZXRvZihkZXF1ZW9iamVjdCwgd2Vha3JlZmxpc3QpLAkvKiB0cF93ZWFrbGlzdG9mZnNldCovCi0JKGdldGl0ZXJmdW5jKWRlcXVlX2l0ZXIsCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkvKiB0cF9pdGVybmV4dCAqLwotCWRlcXVlX21ldGhvZHMsCQkJLyogdHBfbWV0aG9kcyAqLwotCTAsCQkJCS8qIHRwX21lbWJlcnMgKi8KLQkwLAkJCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQkoaW5pdHByb2MpZGVxdWVfaW5pdCwJCS8qIHRwX2luaXQgKi8KLQlQeVR5cGVfR2VuZXJpY0FsbG9jLAkJLyogdHBfYWxsb2MgKi8KLQlkZXF1ZV9uZXcsCQkJLyogdHBfbmV3ICovCi0JUHlPYmplY3RfR0NfRGVsLAkJLyogdHBfZnJlZSAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQorICAgICJjb2xsZWN0aW9ucy5kZXF1ZSIsICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICBzaXplb2YoZGVxdWVvYmplY3QpLCAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcilkZXF1ZV9kZWFsbG9jLCAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgZGVxdWVfdHBfcHJpbnQsICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICBkZXF1ZV9yZXByLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgJmRlcXVlX2FzX3NlcXVlbmNlLCAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKVB5T2JqZWN0X0hhc2hOb3RJbXBsZW1lbnRlZCwgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFIHwgUHlfVFBGTEFHU19IQVZFX0dDIHwKKyAgICAgICAgUHlfVFBGTEFHU19IQVZFX1dFQUtSRUZTLCAgICAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCisgICAgZGVxdWVfZG9jLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgKHRyYXZlcnNlcHJvYylkZXF1ZV90cmF2ZXJzZSwgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAoaW5xdWlyeSlkZXF1ZV9jbGVhciwgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIChyaWNoY21wZnVuYylkZXF1ZV9yaWNoY29tcGFyZSwgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgb2Zmc2V0b2YoZGVxdWVvYmplY3QsIHdlYWtyZWZsaXN0KSwgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCovCisgICAgKGdldGl0ZXJmdW5jKWRlcXVlX2l0ZXIsICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgZGVxdWVfbWV0aG9kcywgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAoaW5pdHByb2MpZGVxdWVfaW5pdCwgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgUHlUeXBlX0dlbmVyaWNBbGxvYywgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBkZXF1ZV9uZXcsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICBQeU9iamVjdF9HQ19EZWwsICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCiB9OwogCiAvKioqKioqKioqKioqKioqKioqKioqKiogRGVxdWUgSXRlcmF0b3IgKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JUHlfc3NpemVfdCBpbmRleDsKLQlibG9jayAqYjsKLQlkZXF1ZW9iamVjdCAqZGVxdWU7Ci0JbG9uZyBzdGF0ZTsJLyogc3RhdGUgd2hlbiB0aGUgaXRlcmF0b3IgaXMgY3JlYXRlZCAqLwotCVB5X3NzaXplX3QgY291bnRlcjsgICAgLyogbnVtYmVyIG9mIGl0ZW1zIHJlbWFpbmluZyBmb3IgaXRlcmF0aW9uICovCisgICAgUHlPYmplY3RfSEVBRAorICAgIFB5X3NzaXplX3QgaW5kZXg7CisgICAgYmxvY2sgKmI7CisgICAgZGVxdWVvYmplY3QgKmRlcXVlOworICAgIGxvbmcgc3RhdGU7ICAgICAgICAgLyogc3RhdGUgd2hlbiB0aGUgaXRlcmF0b3IgaXMgY3JlYXRlZCAqLworICAgIFB5X3NzaXplX3QgY291bnRlcjsgICAgLyogbnVtYmVyIG9mIGl0ZW1zIHJlbWFpbmluZyBmb3IgaXRlcmF0aW9uICovCiB9IGRlcXVlaXRlcm9iamVjdDsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBkZXF1ZWl0ZXJfdHlwZTsKQEAgLTk5NiwxMDcgKzk5NiwxMDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBkZXF1ZV9pdGVyKGRlcXVlb2JqZWN0ICpkZXF1ZSkKIHsKLQlkZXF1ZWl0ZXJvYmplY3QgKml0OworICAgIGRlcXVlaXRlcm9iamVjdCAqaXQ7CiAKLQlpdCA9IFB5T2JqZWN0X0dDX05ldyhkZXF1ZWl0ZXJvYmplY3QsICZkZXF1ZWl0ZXJfdHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWl0LT5iID0gZGVxdWUtPmxlZnRibG9jazsKLQlpdC0+aW5kZXggPSBkZXF1ZS0+bGVmdGluZGV4OwotCVB5X0lOQ1JFRihkZXF1ZSk7Ci0JaXQtPmRlcXVlID0gZGVxdWU7Ci0JaXQtPnN0YXRlID0gZGVxdWUtPnN0YXRlOwotCWl0LT5jb3VudGVyID0gZGVxdWUtPmxlbjsKLQlQeU9iamVjdF9HQ19UcmFjayhpdCk7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIGl0ID0gUHlPYmplY3RfR0NfTmV3KGRlcXVlaXRlcm9iamVjdCwgJmRlcXVlaXRlcl90eXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaXQtPmIgPSBkZXF1ZS0+bGVmdGJsb2NrOworICAgIGl0LT5pbmRleCA9IGRlcXVlLT5sZWZ0aW5kZXg7CisgICAgUHlfSU5DUkVGKGRlcXVlKTsKKyAgICBpdC0+ZGVxdWUgPSBkZXF1ZTsKKyAgICBpdC0+c3RhdGUgPSBkZXF1ZS0+c3RhdGU7CisgICAgaXQtPmNvdW50ZXIgPSBkZXF1ZS0+bGVuOworICAgIFB5T2JqZWN0X0dDX1RyYWNrKGl0KTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiAKIHN0YXRpYyBpbnQKIGRlcXVlaXRlcl90cmF2ZXJzZShkZXF1ZWl0ZXJvYmplY3QgKmRpbywgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JUHlfVklTSVQoZGlvLT5kZXF1ZSk7Ci0JcmV0dXJuIDA7CisgICAgUHlfVklTSVQoZGlvLT5kZXF1ZSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkCiBkZXF1ZWl0ZXJfZGVhbGxvYyhkZXF1ZWl0ZXJvYmplY3QgKmRpbykKIHsKLQlQeV9YREVDUkVGKGRpby0+ZGVxdWUpOwotCVB5T2JqZWN0X0dDX0RlbChkaW8pOworICAgIFB5X1hERUNSRUYoZGlvLT5kZXF1ZSk7CisgICAgUHlPYmplY3RfR0NfRGVsKGRpbyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkZXF1ZWl0ZXJfbmV4dChkZXF1ZWl0ZXJvYmplY3QgKml0KQogewotCVB5T2JqZWN0ICppdGVtOworICAgIFB5T2JqZWN0ICppdGVtOwogCi0JaWYgKGl0LT5kZXF1ZS0+c3RhdGUgIT0gaXQtPnN0YXRlKSB7Ci0JCWl0LT5jb3VudGVyID0gMDsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKLQkJCQkiZGVxdWUgbXV0YXRlZCBkdXJpbmcgaXRlcmF0aW9uIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoaXQtPmNvdW50ZXIgPT0gMCkKLQkJcmV0dXJuIE5VTEw7ICAgICAgICAKLQlhc3NlcnQgKCEoaXQtPmIgPT0gaXQtPmRlcXVlLT5yaWdodGJsb2NrICYmCi0JCSAgaXQtPmluZGV4ID4gaXQtPmRlcXVlLT5yaWdodGluZGV4KSk7CisgICAgaWYgKGl0LT5kZXF1ZS0+c3RhdGUgIT0gaXQtPnN0YXRlKSB7CisgICAgICAgIGl0LT5jb3VudGVyID0gMDsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJkZXF1ZSBtdXRhdGVkIGR1cmluZyBpdGVyYXRpb24iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChpdC0+Y291bnRlciA9PSAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBhc3NlcnQgKCEoaXQtPmIgPT0gaXQtPmRlcXVlLT5yaWdodGJsb2NrICYmCisgICAgICAgICAgICAgIGl0LT5pbmRleCA+IGl0LT5kZXF1ZS0+cmlnaHRpbmRleCkpOwogCi0JaXRlbSA9IGl0LT5iLT5kYXRhW2l0LT5pbmRleF07Ci0JaXQtPmluZGV4Kys7Ci0JaXQtPmNvdW50ZXItLTsKLQlpZiAoaXQtPmluZGV4ID09IEJMT0NLTEVOICYmIGl0LT5jb3VudGVyID4gMCkgewotCQlhc3NlcnQgKGl0LT5iLT5yaWdodGxpbmsgIT0gTlVMTCk7Ci0JCWl0LT5iID0gaXQtPmItPnJpZ2h0bGluazsKLQkJaXQtPmluZGV4ID0gMDsKLQl9Ci0JUHlfSU5DUkVGKGl0ZW0pOwotCXJldHVybiBpdGVtOworICAgIGl0ZW0gPSBpdC0+Yi0+ZGF0YVtpdC0+aW5kZXhdOworICAgIGl0LT5pbmRleCsrOworICAgIGl0LT5jb3VudGVyLS07CisgICAgaWYgKGl0LT5pbmRleCA9PSBCTE9DS0xFTiAmJiBpdC0+Y291bnRlciA+IDApIHsKKyAgICAgICAgYXNzZXJ0IChpdC0+Yi0+cmlnaHRsaW5rICE9IE5VTEwpOworICAgICAgICBpdC0+YiA9IGl0LT5iLT5yaWdodGxpbms7CisgICAgICAgIGl0LT5pbmRleCA9IDA7CisgICAgfQorICAgIFB5X0lOQ1JFRihpdGVtKTsKKyAgICByZXR1cm4gaXRlbTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRlcXVlaXRlcl9sZW4oZGVxdWVpdGVyb2JqZWN0ICppdCkKIHsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoaXQtPmNvdW50ZXIpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhpdC0+Y291bnRlcik7CiB9CiAKIFB5RG9jX1NUUlZBUihsZW5ndGhfaGludF9kb2MsICJQcml2YXRlIG1ldGhvZCByZXR1cm5pbmcgYW4gZXN0aW1hdGUgb2YgbGVuKGxpc3QoaXQpKS4iKTsKIAogc3RhdGljIFB5TWV0aG9kRGVmIGRlcXVlaXRlcl9tZXRob2RzW10gPSB7Ci0JeyJfX2xlbmd0aF9oaW50X18iLCAoUHlDRnVuY3Rpb24pZGVxdWVpdGVyX2xlbiwgTUVUSF9OT0FSR1MsIGxlbmd0aF9oaW50X2RvY30sCi0gCXtOVUxMLAkJTlVMTH0JCS8qIHNlbnRpbmVsICovCisgICAgeyJfX2xlbmd0aF9oaW50X18iLCAoUHlDRnVuY3Rpb24pZGVxdWVpdGVyX2xlbiwgTUVUSF9OT0FSR1MsIGxlbmd0aF9oaW50X2RvY30sCisgICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgZGVxdWVpdGVyX3R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JImRlcXVlX2l0ZXJhdG9yIiwJCQkvKiB0cF9uYW1lICovCi0Jc2l6ZW9mKGRlcXVlaXRlcm9iamVjdCksCQkvKiB0cF9iYXNpY3NpemUgKi8KLQkwLAkJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpZGVxdWVpdGVyX2RlYWxsb2MsCQkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9jb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDLC8qIHRwX2ZsYWdzICovCi0JMCwJCQkJCS8qIHRwX2RvYyAqLwotCSh0cmF2ZXJzZXByb2MpZGVxdWVpdGVyX3RyYXZlcnNlLAkvKiB0cF90cmF2ZXJzZSAqLwotCTAsCQkJCQkvKiB0cF9jbGVhciAqLwotCTAsCQkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCVB5T2JqZWN0X1NlbGZJdGVyLAkJCS8qIHRwX2l0ZXIgKi8KLQkoaXRlcm5leHRmdW5jKWRlcXVlaXRlcl9uZXh0LAkJLyogdHBfaXRlcm5leHQgKi8KLQlkZXF1ZWl0ZXJfbWV0aG9kcywJCQkvKiB0cF9tZXRob2RzICovCi0JMCwKKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAiZGVxdWVfaXRlcmF0b3IiLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICBzaXplb2YoZGVxdWVpdGVyb2JqZWN0KSwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpZGVxdWVpdGVyX2RlYWxsb2MsICAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQywvKiB0cF9mbGFncyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgKHRyYXZlcnNlcHJvYylkZXF1ZWl0ZXJfdHJhdmVyc2UsICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIFB5T2JqZWN0X1NlbGZJdGVyLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIChpdGVybmV4dGZ1bmMpZGVxdWVpdGVyX25leHQsICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICBkZXF1ZWl0ZXJfbWV0aG9kcywgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLAogfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqIERlcXVlIFJldmVyc2UgSXRlcmF0b3IgKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xMTA2LDg3ICsxMTA2LDg3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZGVxdWVfcmV2aXRlcihkZXF1ZW9iamVjdCAqZGVxdWUpCiB7Ci0JZGVxdWVpdGVyb2JqZWN0ICppdDsKKyAgICBkZXF1ZWl0ZXJvYmplY3QgKml0OwogCi0JaXQgPSBQeU9iamVjdF9HQ19OZXcoZGVxdWVpdGVyb2JqZWN0LCAmZGVxdWVyZXZpdGVyX3R5cGUpOwotCWlmIChpdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlpdC0+YiA9IGRlcXVlLT5yaWdodGJsb2NrOwotCWl0LT5pbmRleCA9IGRlcXVlLT5yaWdodGluZGV4OwotCVB5X0lOQ1JFRihkZXF1ZSk7Ci0JaXQtPmRlcXVlID0gZGVxdWU7Ci0JaXQtPnN0YXRlID0gZGVxdWUtPnN0YXRlOwotCWl0LT5jb3VudGVyID0gZGVxdWUtPmxlbjsKLQlQeU9iamVjdF9HQ19UcmFjayhpdCk7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIGl0ID0gUHlPYmplY3RfR0NfTmV3KGRlcXVlaXRlcm9iamVjdCwgJmRlcXVlcmV2aXRlcl90eXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaXQtPmIgPSBkZXF1ZS0+cmlnaHRibG9jazsKKyAgICBpdC0+aW5kZXggPSBkZXF1ZS0+cmlnaHRpbmRleDsKKyAgICBQeV9JTkNSRUYoZGVxdWUpOworICAgIGl0LT5kZXF1ZSA9IGRlcXVlOworICAgIGl0LT5zdGF0ZSA9IGRlcXVlLT5zdGF0ZTsKKyAgICBpdC0+Y291bnRlciA9IGRlcXVlLT5sZW47CisgICAgUHlPYmplY3RfR0NfVHJhY2soaXQpOworICAgIHJldHVybiAoUHlPYmplY3QgKilpdDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRlcXVlcmV2aXRlcl9uZXh0KGRlcXVlaXRlcm9iamVjdCAqaXQpCiB7Ci0JUHlPYmplY3QgKml0ZW07Ci0JaWYgKGl0LT5jb3VudGVyID09IDApCi0JCXJldHVybiBOVUxMOworICAgIFB5T2JqZWN0ICppdGVtOworICAgIGlmIChpdC0+Y291bnRlciA9PSAwKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChpdC0+ZGVxdWUtPnN0YXRlICE9IGl0LT5zdGF0ZSkgewotCQlpdC0+Y291bnRlciA9IDA7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCi0JCQkJImRlcXVlIG11dGF0ZWQgZHVyaW5nIGl0ZXJhdGlvbiIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JYXNzZXJ0ICghKGl0LT5iID09IGl0LT5kZXF1ZS0+bGVmdGJsb2NrICYmCi0JCSAgaXQtPmluZGV4IDwgaXQtPmRlcXVlLT5sZWZ0aW5kZXgpKTsKKyAgICBpZiAoaXQtPmRlcXVlLT5zdGF0ZSAhPSBpdC0+c3RhdGUpIHsKKyAgICAgICAgaXQtPmNvdW50ZXIgPSAwOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImRlcXVlIG11dGF0ZWQgZHVyaW5nIGl0ZXJhdGlvbiIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgYXNzZXJ0ICghKGl0LT5iID09IGl0LT5kZXF1ZS0+bGVmdGJsb2NrICYmCisgICAgICAgICAgICAgIGl0LT5pbmRleCA8IGl0LT5kZXF1ZS0+bGVmdGluZGV4KSk7CiAKLQlpdGVtID0gaXQtPmItPmRhdGFbaXQtPmluZGV4XTsKLQlpdC0+aW5kZXgtLTsKLQlpdC0+Y291bnRlci0tOwotCWlmIChpdC0+aW5kZXggPT0gLTEgJiYgaXQtPmNvdW50ZXIgPiAwKSB7Ci0JCWFzc2VydCAoaXQtPmItPmxlZnRsaW5rICE9IE5VTEwpOwotCQlpdC0+YiA9IGl0LT5iLT5sZWZ0bGluazsKLQkJaXQtPmluZGV4ID0gQkxPQ0tMRU4gLSAxOwotCX0KLQlQeV9JTkNSRUYoaXRlbSk7Ci0JcmV0dXJuIGl0ZW07CisgICAgaXRlbSA9IGl0LT5iLT5kYXRhW2l0LT5pbmRleF07CisgICAgaXQtPmluZGV4LS07CisgICAgaXQtPmNvdW50ZXItLTsKKyAgICBpZiAoaXQtPmluZGV4ID09IC0xICYmIGl0LT5jb3VudGVyID4gMCkgeworICAgICAgICBhc3NlcnQgKGl0LT5iLT5sZWZ0bGluayAhPSBOVUxMKTsKKyAgICAgICAgaXQtPmIgPSBpdC0+Yi0+bGVmdGxpbms7CisgICAgICAgIGl0LT5pbmRleCA9IEJMT0NLTEVOIC0gMTsKKyAgICB9CisgICAgUHlfSU5DUkVGKGl0ZW0pOworICAgIHJldHVybiBpdGVtOwogfQogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IGRlcXVlcmV2aXRlcl90eXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotCSJkZXF1ZV9yZXZlcnNlX2l0ZXJhdG9yIiwJCS8qIHRwX25hbWUgKi8KLQlzaXplb2YoZGVxdWVpdGVyb2JqZWN0KSwJCS8qIHRwX2Jhc2ljc2l6ZSAqLwotCTAsCQkJCQkvKiB0cF9pdGVtc2l6ZSAqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcilkZXF1ZWl0ZXJfZGVhbGxvYywJCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfcmVwciAqLwotCTAsCQkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCQkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsLyogdHBfZmxhZ3MgKi8KLQkwLAkJCQkJLyogdHBfZG9jICovCi0JKHRyYXZlcnNlcHJvYylkZXF1ZWl0ZXJfdHJhdmVyc2UsCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JUHlPYmplY3RfU2VsZkl0ZXIsCQkJLyogdHBfaXRlciAqLwotCShpdGVybmV4dGZ1bmMpZGVxdWVyZXZpdGVyX25leHQsCS8qIHRwX2l0ZXJuZXh0ICovCi0JZGVxdWVpdGVyX21ldGhvZHMsCQkJLyogdHBfbWV0aG9kcyAqLwotCTAsCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisgICAgImRlcXVlX3JldmVyc2VfaXRlcmF0b3IiLCAgICAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCisgICAgc2l6ZW9mKGRlcXVlaXRlcm9iamVjdCksICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKWRlcXVlaXRlcl9kZWFsbG9jLCAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2MpZGVxdWVpdGVyX3RyYXZlcnNlLCAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICBQeU9iamVjdF9TZWxmSXRlciwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAoaXRlcm5leHRmdW5jKWRlcXVlcmV2aXRlcl9uZXh0LCAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgZGVxdWVpdGVyX21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwKIH07CiAKIC8qIGRlZmF1bHRkaWN0IHR5cGUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlEaWN0T2JqZWN0IGRpY3Q7Ci0JUHlPYmplY3QgKmRlZmF1bHRfZmFjdG9yeTsKKyAgICBQeURpY3RPYmplY3QgZGljdDsKKyAgICBQeU9iamVjdCAqZGVmYXVsdF9mYWN0b3J5OwogfSBkZWZkaWN0b2JqZWN0OwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IGRlZmRpY3RfdHlwZTsgLyogRm9yd2FyZCAqLwpAQCAtMTIwMSwyNSArMTIwMSwyNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGRlZmRpY3RfbWlzc2luZyhkZWZkaWN0b2JqZWN0ICpkZCwgUHlPYmplY3QgKmtleSkKIHsKLQlQeU9iamVjdCAqZmFjdG9yeSA9IGRkLT5kZWZhdWx0X2ZhY3Rvcnk7Ci0JUHlPYmplY3QgKnZhbHVlOwotCWlmIChmYWN0b3J5ID09IE5VTEwgfHwgZmFjdG9yeSA9PSBQeV9Ob25lKSB7Ci0JCS8qIFhYWCBDYWxsIGRpY3QuX19taXNzaW5nX18oa2V5KSAqLwotCQlQeU9iamVjdCAqdHVwOwotCQl0dXAgPSBQeVR1cGxlX1BhY2soMSwga2V5KTsKLQkJaWYgKCF0dXApIHJldHVybiBOVUxMOwotCQlQeUVycl9TZXRPYmplY3QoUHlFeGNfS2V5RXJyb3IsIHR1cCk7Ci0JCVB5X0RFQ1JFRih0dXApOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JdmFsdWUgPSBQeUV2YWxfQ2FsbE9iamVjdChmYWN0b3J5LCBOVUxMKTsKLQlpZiAodmFsdWUgPT0gTlVMTCkKLQkJcmV0dXJuIHZhbHVlOwotCWlmIChQeU9iamVjdF9TZXRJdGVtKChQeU9iamVjdCAqKWRkLCBrZXksIHZhbHVlKSA8IDApIHsKLQkJUHlfREVDUkVGKHZhbHVlKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiB2YWx1ZTsKKyAgICBQeU9iamVjdCAqZmFjdG9yeSA9IGRkLT5kZWZhdWx0X2ZhY3Rvcnk7CisgICAgUHlPYmplY3QgKnZhbHVlOworICAgIGlmIChmYWN0b3J5ID09IE5VTEwgfHwgZmFjdG9yeSA9PSBQeV9Ob25lKSB7CisgICAgICAgIC8qIFhYWCBDYWxsIGRpY3QuX19taXNzaW5nX18oa2V5KSAqLworICAgICAgICBQeU9iamVjdCAqdHVwOworICAgICAgICB0dXAgPSBQeVR1cGxlX1BhY2soMSwga2V5KTsKKyAgICAgICAgaWYgKCF0dXApIHJldHVybiBOVUxMOworICAgICAgICBQeUVycl9TZXRPYmplY3QoUHlFeGNfS2V5RXJyb3IsIHR1cCk7CisgICAgICAgIFB5X0RFQ1JFRih0dXApOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgdmFsdWUgPSBQeUV2YWxfQ2FsbE9iamVjdChmYWN0b3J5LCBOVUxMKTsKKyAgICBpZiAodmFsdWUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIGlmIChQeU9iamVjdF9TZXRJdGVtKChQeU9iamVjdCAqKWRkLCBrZXksIHZhbHVlKSA8IDApIHsKKyAgICAgICAgUHlfREVDUkVGKHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiB2YWx1ZTsKIH0KIAogUHlEb2NfU1RSVkFSKGRlZmRpY3RfY29weV9kb2MsICJELmNvcHkoKSAtPiBhIHNoYWxsb3cgY29weSBvZiBELiIpOwpAQCAtMTIyNywxOTIgKzEyMjcsMTkyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZGVmZGljdF9jb3B5KGRlZmRpY3RvYmplY3QgKmRkKQogewotCS8qIFRoaXMgY2FsbHMgdGhlIG9iamVjdCdzIGNsYXNzLiAgVGhhdCBvbmx5IHdvcmtzIGZvciBzdWJjbGFzc2VzCi0JICAgd2hvc2UgY2xhc3MgY29uc3RydWN0b3IgaGFzIHRoZSBzYW1lIHNpZ25hdHVyZS4gIFN1YmNsYXNzZXMgdGhhdAotCSAgIGRlZmluZSBhIGRpZmZlcmVudCBjb25zdHJ1Y3RvciBzaWduYXR1cmUgbXVzdCBvdmVycmlkZSBjb3B5KCkuCi0JKi8KKyAgICAvKiBUaGlzIGNhbGxzIHRoZSBvYmplY3QncyBjbGFzcy4gIFRoYXQgb25seSB3b3JrcyBmb3Igc3ViY2xhc3NlcworICAgICAgIHdob3NlIGNsYXNzIGNvbnN0cnVjdG9yIGhhcyB0aGUgc2FtZSBzaWduYXR1cmUuICBTdWJjbGFzc2VzIHRoYXQKKyAgICAgICBkZWZpbmUgYSBkaWZmZXJlbnQgY29uc3RydWN0b3Igc2lnbmF0dXJlIG11c3Qgb3ZlcnJpZGUgY29weSgpLgorICAgICovCiAKLQlpZiAoZGQtPmRlZmF1bHRfZmFjdG9yeSA9PSBOVUxMKQotCQlyZXR1cm4gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncygoUHlPYmplY3QqKVB5X1RZUEUoZGQpLCBQeV9Ob25lLCBkZCwgTlVMTCk7Ci0JcmV0dXJuIFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoKFB5T2JqZWN0KilQeV9UWVBFKGRkKSwKLQkJCQkJICAgIGRkLT5kZWZhdWx0X2ZhY3RvcnksIGRkLCBOVUxMKTsKKyAgICBpZiAoZGQtPmRlZmF1bHRfZmFjdG9yeSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncygoUHlPYmplY3QqKVB5X1RZUEUoZGQpLCBQeV9Ob25lLCBkZCwgTlVMTCk7CisgICAgcmV0dXJuIFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoKFB5T2JqZWN0KilQeV9UWVBFKGRkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZC0+ZGVmYXVsdF9mYWN0b3J5LCBkZCwgTlVMTCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkZWZkaWN0X3JlZHVjZShkZWZkaWN0b2JqZWN0ICpkZCkKIHsKLQkvKiBfX3JlZHVjZV9fIG11c3QgcmV0dXJuIGEgNS10dXBsZSBhcyBmb2xsb3dzOgorICAgIC8qIF9fcmVkdWNlX18gbXVzdCByZXR1cm4gYSA1LXR1cGxlIGFzIGZvbGxvd3M6CiAKLQkgICAtIGZhY3RvcnkgZnVuY3Rpb24KLQkgICAtIHR1cGxlIG9mIGFyZ3MgZm9yIHRoZSBmYWN0b3J5IGZ1bmN0aW9uCi0JICAgLSBhZGRpdGlvbmFsIHN0YXRlIChoZXJlIE5vbmUpCi0JICAgLSBzZXF1ZW5jZSBpdGVyYXRvciAoaGVyZSBOb25lKQotCSAgIC0gZGljdGlvbmFyeSBpdGVyYXRvciAoeWllbGRpbmcgc3VjY2Vzc2l2ZSAoa2V5LCB2YWx1ZSkgcGFpcnMKKyAgICAgICAtIGZhY3RvcnkgZnVuY3Rpb24KKyAgICAgICAtIHR1cGxlIG9mIGFyZ3MgZm9yIHRoZSBmYWN0b3J5IGZ1bmN0aW9uCisgICAgICAgLSBhZGRpdGlvbmFsIHN0YXRlIChoZXJlIE5vbmUpCisgICAgICAgLSBzZXF1ZW5jZSBpdGVyYXRvciAoaGVyZSBOb25lKQorICAgICAgIC0gZGljdGlvbmFyeSBpdGVyYXRvciAoeWllbGRpbmcgc3VjY2Vzc2l2ZSAoa2V5LCB2YWx1ZSkgcGFpcnMKIAotCSAgIFRoaXMgQVBJIGlzIHVzZWQgYnkgcGlja2xlLnB5IGFuZCBjb3B5LnB5LgorICAgICAgIFRoaXMgQVBJIGlzIHVzZWQgYnkgcGlja2xlLnB5IGFuZCBjb3B5LnB5LgogCi0JICAgRm9yIHRoaXMgdG8gYmUgdXNlZnVsIHdpdGggcGlja2xlLnB5LCB0aGUgZGVmYXVsdF9mYWN0b3J5Ci0JICAgbXVzdCBiZSBwaWNrbGFibGU7IGUuZy4sIE5vbmUsIGEgYnVpbHQtaW4sIG9yIGEgZ2xvYmFsCi0JICAgZnVuY3Rpb24gaW4gYSBtb2R1bGUgb3IgcGFja2FnZS4KKyAgICAgICBGb3IgdGhpcyB0byBiZSB1c2VmdWwgd2l0aCBwaWNrbGUucHksIHRoZSBkZWZhdWx0X2ZhY3RvcnkKKyAgICAgICBtdXN0IGJlIHBpY2tsYWJsZTsgZS5nLiwgTm9uZSwgYSBidWlsdC1pbiwgb3IgYSBnbG9iYWwKKyAgICAgICBmdW5jdGlvbiBpbiBhIG1vZHVsZSBvciBwYWNrYWdlLgogCi0JICAgQm90aCBzaGFsbG93IGFuZCBkZWVwIGNvcHlpbmcgYXJlIHN1cHBvcnRlZCwgYnV0IGZvciBkZWVwCi0JICAgY29weWluZywgdGhlIGRlZmF1bHRfZmFjdG9yeSBtdXN0IGJlIGRlZXAtY29weWFibGU7IGUuZy4gTm9uZSwKLQkgICBvciBhIGJ1aWx0LWluIChmdW5jdGlvbnMgYXJlIG5vdCBjb3B5YWJsZSBhdCB0aGlzIHRpbWUpLgorICAgICAgIEJvdGggc2hhbGxvdyBhbmQgZGVlcCBjb3B5aW5nIGFyZSBzdXBwb3J0ZWQsIGJ1dCBmb3IgZGVlcAorICAgICAgIGNvcHlpbmcsIHRoZSBkZWZhdWx0X2ZhY3RvcnkgbXVzdCBiZSBkZWVwLWNvcHlhYmxlOyBlLmcuIE5vbmUsCisgICAgICAgb3IgYSBidWlsdC1pbiAoZnVuY3Rpb25zIGFyZSBub3QgY29weWFibGUgYXQgdGhpcyB0aW1lKS4KIAotCSAgIFRoaXMgb25seSB3b3JrcyBmb3Igc3ViY2xhc3NlcyBhcyBsb25nIGFzIHRoZWlyIGNvbnN0cnVjdG9yCi0JICAgc2lnbmF0dXJlIGlzIGNvbXBhdGlibGU7IHRoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIHRoZQotCSAgIG9wdGlvbmFsIGRlZmF1bHRfZmFjdG9yeSwgZGVmYXVsdGluZyB0byBOb25lLgotCSovCi0JUHlPYmplY3QgKmFyZ3M7Ci0JUHlPYmplY3QgKml0ZW1zOwotCVB5T2JqZWN0ICpyZXN1bHQ7Ci0JaWYgKGRkLT5kZWZhdWx0X2ZhY3RvcnkgPT0gTlVMTCB8fCBkZC0+ZGVmYXVsdF9mYWN0b3J5ID09IFB5X05vbmUpCi0JCWFyZ3MgPSBQeVR1cGxlX05ldygwKTsKLQllbHNlCi0JCWFyZ3MgPSBQeVR1cGxlX1BhY2soMSwgZGQtPmRlZmF1bHRfZmFjdG9yeSk7Ci0JaWYgKGFyZ3MgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JaXRlbXMgPSBQeU9iamVjdF9DYWxsTWV0aG9kKChQeU9iamVjdCAqKWRkLCAiaXRlcml0ZW1zIiwgIigpIik7Ci0JaWYgKGl0ZW1zID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKGFyZ3MpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmVzdWx0ID0gUHlUdXBsZV9QYWNrKDUsIFB5X1RZUEUoZGQpLCBhcmdzLAotCQkJICAgICAgUHlfTm9uZSwgUHlfTm9uZSwgaXRlbXMpOwotCVB5X0RFQ1JFRihpdGVtcyk7Ci0JUHlfREVDUkVGKGFyZ3MpOwotCXJldHVybiByZXN1bHQ7CisgICAgICAgVGhpcyBvbmx5IHdvcmtzIGZvciBzdWJjbGFzc2VzIGFzIGxvbmcgYXMgdGhlaXIgY29uc3RydWN0b3IKKyAgICAgICBzaWduYXR1cmUgaXMgY29tcGF0aWJsZTsgdGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgdGhlCisgICAgICAgb3B0aW9uYWwgZGVmYXVsdF9mYWN0b3J5LCBkZWZhdWx0aW5nIHRvIE5vbmUuCisgICAgKi8KKyAgICBQeU9iamVjdCAqYXJnczsKKyAgICBQeU9iamVjdCAqaXRlbXM7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICBpZiAoZGQtPmRlZmF1bHRfZmFjdG9yeSA9PSBOVUxMIHx8IGRkLT5kZWZhdWx0X2ZhY3RvcnkgPT0gUHlfTm9uZSkKKyAgICAgICAgYXJncyA9IFB5VHVwbGVfTmV3KDApOworICAgIGVsc2UKKyAgICAgICAgYXJncyA9IFB5VHVwbGVfUGFjaygxLCBkZC0+ZGVmYXVsdF9mYWN0b3J5KTsKKyAgICBpZiAoYXJncyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpdGVtcyA9IFB5T2JqZWN0X0NhbGxNZXRob2QoKFB5T2JqZWN0ICopZGQsICJpdGVyaXRlbXMiLCAiKCkiKTsKKyAgICBpZiAoaXRlbXMgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYoYXJncyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXN1bHQgPSBQeVR1cGxlX1BhY2soNSwgUHlfVFlQRShkZCksIGFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X05vbmUsIFB5X05vbmUsIGl0ZW1zKTsKKyAgICBQeV9ERUNSRUYoaXRlbXMpOworICAgIFB5X0RFQ1JFRihhcmdzKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgZGVmZGljdF9tZXRob2RzW10gPSB7Ci0JeyJfX21pc3NpbmdfXyIsIChQeUNGdW5jdGlvbilkZWZkaWN0X21pc3NpbmcsIE1FVEhfTywKLQkgZGVmZGljdF9taXNzaW5nX2RvY30sCi0JeyJjb3B5IiwgKFB5Q0Z1bmN0aW9uKWRlZmRpY3RfY29weSwgTUVUSF9OT0FSR1MsCi0JIGRlZmRpY3RfY29weV9kb2N9LAotCXsiX19jb3B5X18iLCAoUHlDRnVuY3Rpb24pZGVmZGljdF9jb3B5LCBNRVRIX05PQVJHUywKLQkgZGVmZGljdF9jb3B5X2RvY30sCi0JeyJfX3JlZHVjZV9fIiwgKFB5Q0Z1bmN0aW9uKWRlZmRpY3RfcmVkdWNlLCBNRVRIX05PQVJHUywKLQkgcmVkdWNlX2RvY30sCi0Je05VTEx9CisgICAgeyJfX21pc3NpbmdfXyIsIChQeUNGdW5jdGlvbilkZWZkaWN0X21pc3NpbmcsIE1FVEhfTywKKyAgICAgZGVmZGljdF9taXNzaW5nX2RvY30sCisgICAgeyJjb3B5IiwgKFB5Q0Z1bmN0aW9uKWRlZmRpY3RfY29weSwgTUVUSF9OT0FSR1MsCisgICAgIGRlZmRpY3RfY29weV9kb2N9LAorICAgIHsiX19jb3B5X18iLCAoUHlDRnVuY3Rpb24pZGVmZGljdF9jb3B5LCBNRVRIX05PQVJHUywKKyAgICAgZGVmZGljdF9jb3B5X2RvY30sCisgICAgeyJfX3JlZHVjZV9fIiwgKFB5Q0Z1bmN0aW9uKWRlZmRpY3RfcmVkdWNlLCBNRVRIX05PQVJHUywKKyAgICAgcmVkdWNlX2RvY30sCisgICAge05VTEx9CiB9OwogCiBzdGF0aWMgUHlNZW1iZXJEZWYgZGVmZGljdF9tZW1iZXJzW10gPSB7Ci0JeyJkZWZhdWx0X2ZhY3RvcnkiLCBUX09CSkVDVCwKLQkgb2Zmc2V0b2YoZGVmZGljdG9iamVjdCwgZGVmYXVsdF9mYWN0b3J5KSwgMCwKLQkgUHlEb2NfU1RSKCJGYWN0b3J5IGZvciBkZWZhdWx0IHZhbHVlIGNhbGxlZCBieSBfX21pc3NpbmdfXygpLiIpfSwKLQl7TlVMTH0KKyAgICB7ImRlZmF1bHRfZmFjdG9yeSIsIFRfT0JKRUNULAorICAgICBvZmZzZXRvZihkZWZkaWN0b2JqZWN0LCBkZWZhdWx0X2ZhY3RvcnkpLCAwLAorICAgICBQeURvY19TVFIoIkZhY3RvcnkgZm9yIGRlZmF1bHQgdmFsdWUgY2FsbGVkIGJ5IF9fbWlzc2luZ19fKCkuIil9LAorICAgIHtOVUxMfQogfTsKIAogc3RhdGljIHZvaWQKIGRlZmRpY3RfZGVhbGxvYyhkZWZkaWN0b2JqZWN0ICpkZCkKIHsKLQlQeV9DTEVBUihkZC0+ZGVmYXVsdF9mYWN0b3J5KTsKLQlQeURpY3RfVHlwZS50cF9kZWFsbG9jKChQeU9iamVjdCAqKWRkKTsKKyAgICBQeV9DTEVBUihkZC0+ZGVmYXVsdF9mYWN0b3J5KTsKKyAgICBQeURpY3RfVHlwZS50cF9kZWFsbG9jKChQeU9iamVjdCAqKWRkKTsKIH0KIAogc3RhdGljIGludAogZGVmZGljdF9wcmludChkZWZkaWN0b2JqZWN0ICpkZCwgRklMRSAqZnAsIGludCBmbGFncykKIHsKLQlpbnQgc3RzOwotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlmcHJpbnRmKGZwLCAiZGVmYXVsdGRpY3QoIik7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQlpZiAoZGQtPmRlZmF1bHRfZmFjdG9yeSA9PSBOVUxMKSB7Ci0JCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQkJZnByaW50ZihmcCwgIk5vbmUiKTsKLQkJUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQl9IGVsc2UgewotCQlQeU9iamVjdF9QcmludChkZC0+ZGVmYXVsdF9mYWN0b3J5LCBmcCwgMCk7Ci0JfQotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlmcHJpbnRmKGZwLCAiLCAiKTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCXN0cyA9IFB5RGljdF9UeXBlLnRwX3ByaW50KChQeU9iamVjdCAqKWRkLCBmcCwgMCk7Ci0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCWZwcmludGYoZnAsICIpIik7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQlyZXR1cm4gc3RzOworICAgIGludCBzdHM7CisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIGZwcmludGYoZnAsICJkZWZhdWx0ZGljdCgiKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIGlmIChkZC0+ZGVmYXVsdF9mYWN0b3J5ID09IE5VTEwpIHsKKyAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICBmcHJpbnRmKGZwLCAiTm9uZSIpOworICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIH0gZWxzZSB7CisgICAgICAgIFB5T2JqZWN0X1ByaW50KGRkLT5kZWZhdWx0X2ZhY3RvcnksIGZwLCAwKTsKKyAgICB9CisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIGZwcmludGYoZnAsICIsICIpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgc3RzID0gUHlEaWN0X1R5cGUudHBfcHJpbnQoKFB5T2JqZWN0ICopZGQsIGZwLCAwKTsKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgZnByaW50ZihmcCwgIikiKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIHJldHVybiBzdHM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkZWZkaWN0X3JlcHIoZGVmZGljdG9iamVjdCAqZGQpCiB7Ci0JUHlPYmplY3QgKmRlZnJlcHI7Ci0JUHlPYmplY3QgKmJhc2VyZXByOwotCVB5T2JqZWN0ICpyZXN1bHQ7Ci0JYmFzZXJlcHIgPSBQeURpY3RfVHlwZS50cF9yZXByKChQeU9iamVjdCAqKWRkKTsKLQlpZiAoYmFzZXJlcHIgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKGRkLT5kZWZhdWx0X2ZhY3RvcnkgPT0gTlVMTCkKLQkJZGVmcmVwciA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIk5vbmUiKTsKLQllbHNlCi0JewotCQlpbnQgc3RhdHVzID0gUHlfUmVwckVudGVyKGRkLT5kZWZhdWx0X2ZhY3RvcnkpOwotCQlpZiAoc3RhdHVzICE9IDApIHsKLQkJCWlmIChzdGF0dXMgPCAwKQotCQkJCXJldHVybiBOVUxMOwotCQkJZGVmcmVwciA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIi4uLiIpOwotCQl9Ci0JCWVsc2UKLQkJCWRlZnJlcHIgPSBQeU9iamVjdF9SZXByKGRkLT5kZWZhdWx0X2ZhY3RvcnkpOwotCQlQeV9SZXByTGVhdmUoZGQtPmRlZmF1bHRfZmFjdG9yeSk7Ci0JfQotCWlmIChkZWZyZXByID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKGJhc2VyZXByKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJlc3VsdCA9IFB5U3RyaW5nX0Zyb21Gb3JtYXQoImRlZmF1bHRkaWN0KCVzLCAlcykiLAotCQkJCSAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKGRlZnJlcHIpLAotCQkJCSAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKGJhc2VyZXByKSk7Ci0JUHlfREVDUkVGKGRlZnJlcHIpOwotCVB5X0RFQ1JFRihiYXNlcmVwcik7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBQeU9iamVjdCAqZGVmcmVwcjsKKyAgICBQeU9iamVjdCAqYmFzZXJlcHI7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICBiYXNlcmVwciA9IFB5RGljdF9UeXBlLnRwX3JlcHIoKFB5T2JqZWN0ICopZGQpOworICAgIGlmIChiYXNlcmVwciA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoZGQtPmRlZmF1bHRfZmFjdG9yeSA9PSBOVUxMKQorICAgICAgICBkZWZyZXByID0gUHlTdHJpbmdfRnJvbVN0cmluZygiTm9uZSIpOworICAgIGVsc2UKKyAgICB7CisgICAgICAgIGludCBzdGF0dXMgPSBQeV9SZXByRW50ZXIoZGQtPmRlZmF1bHRfZmFjdG9yeSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgaWYgKHN0YXR1cyA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICBkZWZyZXByID0gUHlTdHJpbmdfRnJvbVN0cmluZygiLi4uIik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZGVmcmVwciA9IFB5T2JqZWN0X1JlcHIoZGQtPmRlZmF1bHRfZmFjdG9yeSk7CisgICAgICAgIFB5X1JlcHJMZWF2ZShkZC0+ZGVmYXVsdF9mYWN0b3J5KTsKKyAgICB9CisgICAgaWYgKGRlZnJlcHIgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYoYmFzZXJlcHIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmVzdWx0ID0gUHlTdHJpbmdfRnJvbUZvcm1hdCgiZGVmYXVsdGRpY3QoJXMsICVzKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcoZGVmcmVwciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcoYmFzZXJlcHIpKTsKKyAgICBQeV9ERUNSRUYoZGVmcmVwcik7CisgICAgUHlfREVDUkVGKGJhc2VyZXByKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgaW50CiBkZWZkaWN0X3RyYXZlcnNlKFB5T2JqZWN0ICpzZWxmLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlQeV9WSVNJVCgoKGRlZmRpY3RvYmplY3QgKilzZWxmKS0+ZGVmYXVsdF9mYWN0b3J5KTsKLQlyZXR1cm4gUHlEaWN0X1R5cGUudHBfdHJhdmVyc2Uoc2VsZiwgdmlzaXQsIGFyZyk7CisgICAgUHlfVklTSVQoKChkZWZkaWN0b2JqZWN0ICopc2VsZiktPmRlZmF1bHRfZmFjdG9yeSk7CisgICAgcmV0dXJuIFB5RGljdF9UeXBlLnRwX3RyYXZlcnNlKHNlbGYsIHZpc2l0LCBhcmcpOwogfQogCiBzdGF0aWMgaW50CiBkZWZkaWN0X3RwX2NsZWFyKGRlZmRpY3RvYmplY3QgKmRkKQogewotCVB5X0NMRUFSKGRkLT5kZWZhdWx0X2ZhY3RvcnkpOwotCXJldHVybiBQeURpY3RfVHlwZS50cF9jbGVhcigoUHlPYmplY3QgKilkZCk7CisgICAgUHlfQ0xFQVIoZGQtPmRlZmF1bHRfZmFjdG9yeSk7CisgICAgcmV0dXJuIFB5RGljdF9UeXBlLnRwX2NsZWFyKChQeU9iamVjdCAqKWRkKTsKIH0KIAogc3RhdGljIGludAogZGVmZGljdF9pbml0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JZGVmZGljdG9iamVjdCAqZGQgPSAoZGVmZGljdG9iamVjdCAqKXNlbGY7Ci0JUHlPYmplY3QgKm9sZGRlZmF1bHQgPSBkZC0+ZGVmYXVsdF9mYWN0b3J5OwotCVB5T2JqZWN0ICpuZXdkZWZhdWx0ID0gTlVMTDsKLQlQeU9iamVjdCAqbmV3YXJnczsKLQlpbnQgcmVzdWx0OwotCWlmIChhcmdzID09IE5VTEwgfHwgIVB5VHVwbGVfQ2hlY2soYXJncykpCi0JCW5ld2FyZ3MgPSBQeVR1cGxlX05ldygwKTsKLQllbHNlIHsKLQkJUHlfc3NpemVfdCBuID0gUHlUdXBsZV9HRVRfU0laRShhcmdzKTsKLQkJaWYgKG4gPiAwKSB7Ci0JCQluZXdkZWZhdWx0ID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCAwKTsKLQkJCWlmICghUHlDYWxsYWJsZV9DaGVjayhuZXdkZWZhdWx0KSAmJiBuZXdkZWZhdWx0ICE9IFB5X05vbmUpIHsKLQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCQkiZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBjYWxsYWJsZSIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfQotCQluZXdhcmdzID0gUHlTZXF1ZW5jZV9HZXRTbGljZShhcmdzLCAxLCBuKTsKLQl9Ci0JaWYgKG5ld2FyZ3MgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCVB5X1hJTkNSRUYobmV3ZGVmYXVsdCk7Ci0JZGQtPmRlZmF1bHRfZmFjdG9yeSA9IG5ld2RlZmF1bHQ7Ci0JcmVzdWx0ID0gUHlEaWN0X1R5cGUudHBfaW5pdChzZWxmLCBuZXdhcmdzLCBrd2RzKTsKLQlQeV9ERUNSRUYobmV3YXJncyk7Ci0JUHlfWERFQ1JFRihvbGRkZWZhdWx0KTsKLQlyZXR1cm4gcmVzdWx0OworICAgIGRlZmRpY3RvYmplY3QgKmRkID0gKGRlZmRpY3RvYmplY3QgKilzZWxmOworICAgIFB5T2JqZWN0ICpvbGRkZWZhdWx0ID0gZGQtPmRlZmF1bHRfZmFjdG9yeTsKKyAgICBQeU9iamVjdCAqbmV3ZGVmYXVsdCA9IE5VTEw7CisgICAgUHlPYmplY3QgKm5ld2FyZ3M7CisgICAgaW50IHJlc3VsdDsKKyAgICBpZiAoYXJncyA9PSBOVUxMIHx8ICFQeVR1cGxlX0NoZWNrKGFyZ3MpKQorICAgICAgICBuZXdhcmdzID0gUHlUdXBsZV9OZXcoMCk7CisgICAgZWxzZSB7CisgICAgICAgIFB5X3NzaXplX3QgbiA9IFB5VHVwbGVfR0VUX1NJWkUoYXJncyk7CisgICAgICAgIGlmIChuID4gMCkgeworICAgICAgICAgICAgbmV3ZGVmYXVsdCA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgMCk7CisgICAgICAgICAgICBpZiAoIVB5Q2FsbGFibGVfQ2hlY2sobmV3ZGVmYXVsdCkgJiYgbmV3ZGVmYXVsdCAhPSBQeV9Ob25lKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgImZpcnN0IGFyZ3VtZW50IG11c3QgYmUgY2FsbGFibGUiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbmV3YXJncyA9IFB5U2VxdWVuY2VfR2V0U2xpY2UoYXJncywgMSwgbik7CisgICAgfQorICAgIGlmIChuZXdhcmdzID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBQeV9YSU5DUkVGKG5ld2RlZmF1bHQpOworICAgIGRkLT5kZWZhdWx0X2ZhY3RvcnkgPSBuZXdkZWZhdWx0OworICAgIHJlc3VsdCA9IFB5RGljdF9UeXBlLnRwX2luaXQoc2VsZiwgbmV3YXJncywga3dkcyk7CisgICAgUHlfREVDUkVGKG5ld2FyZ3MpOworICAgIFB5X1hERUNSRUYob2xkZGVmYXVsdCk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogUHlEb2NfU1RSVkFSKGRlZmRpY3RfZG9jLApAQCAtMTQyNyw0NyArMTQyNyw0NyBAQAogI2RlZmluZSBERUZFUlJFRF9BRERSRVNTKEFERFIpIDAKIAogc3RhdGljIFB5VHlwZU9iamVjdCBkZWZkaWN0X3R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKERFRkVSUkVEX0FERFJFU1MoJlB5VHlwZV9UeXBlKSwgMCkKLQkiY29sbGVjdGlvbnMuZGVmYXVsdGRpY3QiLAkvKiB0cF9uYW1lICovCi0Jc2l6ZW9mKGRlZmRpY3RvYmplY3QpLAkJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpZGVmZGljdF9kZWFsbG9jLAkvKiB0cF9kZWFsbG9jICovCi0JKHByaW50ZnVuYylkZWZkaWN0X3ByaW50LAkvKiB0cF9wcmludCAqLwotCTAsCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJLyogdHBfY29tcGFyZSAqLwotCShyZXByZnVuYylkZWZkaWN0X3JlcHIsCQkvKiB0cF9yZXByICovCi0JMCwJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJICAgICAgIAkJCS8qIHRwX2hhc2ggKi8KLQkwLAkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFIHwgUHlfVFBGTEFHU19IQVZFX0dDIHwKLQkJUHlfVFBGTEFHU19IQVZFX1dFQUtSRUZTLAkvKiB0cF9mbGFncyAqLwotCWRlZmRpY3RfZG9jLAkJCS8qIHRwX2RvYyAqLwotCWRlZmRpY3RfdHJhdmVyc2UsCQkvKiB0cF90cmF2ZXJzZSAqLwotCShpbnF1aXJ5KWRlZmRpY3RfdHBfY2xlYXIsCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCovCi0JMCwJCQkJLyogdHBfaXRlciAqLwotCTAsCQkJCS8qIHRwX2l0ZXJuZXh0ICovCi0JZGVmZGljdF9tZXRob2RzLAkJLyogdHBfbWV0aG9kcyAqLwotCWRlZmRpY3RfbWVtYmVycywJCS8qIHRwX21lbWJlcnMgKi8KLQkwLAkJCQkvKiB0cF9nZXRzZXQgKi8KLQlERUZFUlJFRF9BRERSRVNTKCZQeURpY3RfVHlwZSksCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkvKiB0cF9kaWN0ICovCi0JMCwJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJCQkJLyogdHBfZGljdG9mZnNldCAqLwotCWRlZmRpY3RfaW5pdCwJCQkvKiB0cF9pbml0ICovCi0JUHlUeXBlX0dlbmVyaWNBbGxvYywJCS8qIHRwX2FsbG9jICovCi0JMCwJCQkJLyogdHBfbmV3ICovCi0JUHlPYmplY3RfR0NfRGVsLAkJLyogdHBfZnJlZSAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChERUZFUlJFRF9BRERSRVNTKCZQeVR5cGVfVHlwZSksIDApCisgICAgImNvbGxlY3Rpb25zLmRlZmF1bHRkaWN0IiwgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgIHNpemVvZihkZWZkaWN0b2JqZWN0KSwgICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKWRlZmRpY3RfZGVhbGxvYywgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAocHJpbnRmdW5jKWRlZmRpY3RfcHJpbnQsICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIChyZXByZnVuYylkZWZkaWN0X3JlcHIsICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFIHwgUHlfVFBGTEFHU19IQVZFX0dDIHwKKyAgICAgICAgUHlfVFBGTEFHU19IQVZFX1dFQUtSRUZTLCAgICAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCisgICAgZGVmZGljdF9kb2MsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgZGVmZGljdF90cmF2ZXJzZSwgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAoaW5xdWlyeSlkZWZkaWN0X3RwX2NsZWFyLCAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIGRlZmRpY3RfbWV0aG9kcywgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICBkZWZkaWN0X21lbWJlcnMsICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgREVGRVJSRURfQUREUkVTUygmUHlEaWN0X1R5cGUpLCAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgZGVmZGljdF9pbml0LCAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIFB5VHlwZV9HZW5lcmljQWxsb2MsICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgUHlPYmplY3RfR0NfRGVsLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKIAogLyogbW9kdWxlIGxldmVsIGNvZGUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xNDgxLDI4ICsxNDgxLDI4IEBACiBQeU1PRElOSVRfRlVOQwogaW5pdF9jb2xsZWN0aW9ucyh2b2lkKQogewotCVB5T2JqZWN0ICptOworICAgIFB5T2JqZWN0ICptOwogCi0JbSA9IFB5X0luaXRNb2R1bGUzKCJfY29sbGVjdGlvbnMiLCBOVUxMLCBtb2R1bGVfZG9jKTsKLQlpZiAobSA9PSBOVUxMKQotCQlyZXR1cm47CisgICAgbSA9IFB5X0luaXRNb2R1bGUzKCJfY29sbGVjdGlvbnMiLCBOVUxMLCBtb2R1bGVfZG9jKTsKKyAgICBpZiAobSA9PSBOVUxMKQorICAgICAgICByZXR1cm47CiAKLQlpZiAoUHlUeXBlX1JlYWR5KCZkZXF1ZV90eXBlKSA8IDApCi0JCXJldHVybjsKLQlQeV9JTkNSRUYoJmRlcXVlX3R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiZGVxdWUiLCAoUHlPYmplY3QgKikmZGVxdWVfdHlwZSk7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmZGVxdWVfdHlwZSkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfSU5DUkVGKCZkZXF1ZV90eXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgImRlcXVlIiwgKFB5T2JqZWN0ICopJmRlcXVlX3R5cGUpOwogCi0JZGVmZGljdF90eXBlLnRwX2Jhc2UgPSAmUHlEaWN0X1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmZGVmZGljdF90eXBlKSA8IDApCi0JCXJldHVybjsKLQlQeV9JTkNSRUYoJmRlZmRpY3RfdHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJkZWZhdWx0ZGljdCIsIChQeU9iamVjdCAqKSZkZWZkaWN0X3R5cGUpOworICAgIGRlZmRpY3RfdHlwZS50cF9iYXNlID0gJlB5RGljdF9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJmRlZmRpY3RfdHlwZSkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfSU5DUkVGKCZkZWZkaWN0X3R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiZGVmYXVsdGRpY3QiLCAoUHlPYmplY3QgKikmZGVmZGljdF90eXBlKTsKIAotCWlmIChQeVR5cGVfUmVhZHkoJmRlcXVlaXRlcl90eXBlKSA8IDApCi0JCXJldHVybjsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZkZXF1ZWl0ZXJfdHlwZSkgPCAwKQorICAgICAgICByZXR1cm47CiAKLQlpZiAoUHlUeXBlX1JlYWR5KCZkZXF1ZXJldml0ZXJfdHlwZSkgPCAwKQotCQlyZXR1cm47CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmZGVxdWVyZXZpdGVyX3R5cGUpIDwgMCkKKyAgICAgICAgcmV0dXJuOwogCi0JcmV0dXJuOworICAgIHJldHVybjsKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvX2Nzdi5jIGIvTW9kdWxlcy9fY3N2LmMKaW5kZXggYTU3ODdkMy4uOTgzZjZhNSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3N2LmMKKysrIGIvTW9kdWxlcy9fY3N2LmMKQEAgLTMxLDk2ICszMSw5NiBAQAogI2VuZGlmIC8qIGlmbmRlZiBQeURvY19TVFJWQVIgKi8KIAogI2lmbmRlZiBQeU1PRElOSVRfRlVOQwotIwlpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQotIwkJZGVmaW5lIFB5TU9ESU5JVF9GVU5DIGV4dGVybiAiQyIgdm9pZAotIwllbHNlIC8qIF9fY3BsdXNwbHVzICovCi0jCQlkZWZpbmUgUHlNT0RJTklUX0ZVTkMgdm9pZAotIwllbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworIyAgICAgICBpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorIyAgICAgICAgICAgICAgIGRlZmluZSBQeU1PRElOSVRfRlVOQyBleHRlcm4gIkMiIHZvaWQKKyMgICAgICAgZWxzZSAvKiBfX2NwbHVzcGx1cyAqLworIyAgICAgICAgICAgICAgIGRlZmluZSBQeU1PRElOSVRfRlVOQyB2b2lkCisjICAgICAgIGVuZGlmIC8qIF9fY3BsdXNwbHVzICovCiAjZW5kaWYKIAogI2lmbmRlZiBQeV9DTEVBUgotI2RlZmluZSBQeV9DTEVBUihvcCkJCQkJCQlcCi0JZG8gewkJCQkJCQlcCi0JCWlmIChvcCkgewkJCQkJXAotCQkJUHlPYmplY3QgKnRtcCA9IChQeU9iamVjdCAqKShvcCk7CVwKLQkJCShvcCkgPSBOVUxMOwkJCQlcCi0JCQlQeV9ERUNSRUYodG1wKTsJCQkJXAotCQl9CQkJCQkJXAotCX0gd2hpbGUgKDApCisjZGVmaW5lIFB5X0NMRUFSKG9wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKG9wKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBQeU9iamVjdCAqdG1wID0gKFB5T2JqZWN0ICopKG9wKTsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKG9wKSA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIFB5X0RFQ1JFRih0bXApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKDApCiAjZW5kaWYKICNpZm5kZWYgUHlfVklTSVQKLSNkZWZpbmUgUHlfVklTSVQob3ApCQkJCQkJCVwKLSAgICAgICAgZG8geyAJCQkJCQkJCVwKLSAgICAgICAgICAgICAgICBpZiAob3ApIHsJCQkJCQlcCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgdnJldCA9IHZpc2l0KChQeU9iamVjdCAqKShvcCksIGFyZyk7CVwKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2cmV0KQkJCQkJXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdnJldDsJCQkJXAotICAgICAgICAgICAgICAgIH0JCQkJCQkJXAotICAgICAgICB9IHdoaWxlICgwKQorI2RlZmluZSBQeV9WSVNJVChvcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAob3ApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaW50IHZyZXQgPSB2aXNpdCgoUHlPYmplY3QgKikob3ApLCBhcmcpOyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKHZyZXQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHJldHVybiB2cmV0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKDApCiAjZW5kaWYKIAogLyogZW5kIDIuMiBjb21wYXRpYmlsaXR5IG1hY3JvcyAqLwogCiAjZGVmaW5lIElTX0JBU0VTVFJJTkcobykgXAotCVB5T2JqZWN0X1R5cGVDaGVjayhvLCAmUHlCYXNlU3RyaW5nX1R5cGUpCisgICAgUHlPYmplY3RfVHlwZUNoZWNrKG8sICZQeUJhc2VTdHJpbmdfVHlwZSkKIAotc3RhdGljIFB5T2JqZWN0ICplcnJvcl9vYmo7CS8qIENTViBleGNlcHRpb24gKi8KK3N0YXRpYyBQeU9iamVjdCAqZXJyb3Jfb2JqOyAgICAgLyogQ1NWIGV4Y2VwdGlvbiAqLwogc3RhdGljIFB5T2JqZWN0ICpkaWFsZWN0czsgICAgICAvKiBEaWFsZWN0IHJlZ2lzdHJ5ICovCi1zdGF0aWMgbG9uZyBmaWVsZF9saW1pdCA9IDEyOCAqIDEwMjQ7CS8qIG1heCBwYXJzZWQgZmllbGQgc2l6ZSAqLworc3RhdGljIGxvbmcgZmllbGRfbGltaXQgPSAxMjggKiAxMDI0OyAgIC8qIG1heCBwYXJzZWQgZmllbGQgc2l6ZSAqLwogCiB0eXBlZGVmIGVudW0gewotCVNUQVJUX1JFQ09SRCwgU1RBUlRfRklFTEQsIEVTQ0FQRURfQ0hBUiwgSU5fRklFTEQsIAotCUlOX1FVT1RFRF9GSUVMRCwgRVNDQVBFX0lOX1FVT1RFRF9GSUVMRCwgUVVPVEVfSU5fUVVPVEVEX0ZJRUxELAotCUVBVF9DUk5MCisgICAgU1RBUlRfUkVDT1JELCBTVEFSVF9GSUVMRCwgRVNDQVBFRF9DSEFSLCBJTl9GSUVMRCwKKyAgICBJTl9RVU9URURfRklFTEQsIEVTQ0FQRV9JTl9RVU9URURfRklFTEQsIFFVT1RFX0lOX1FVT1RFRF9GSUVMRCwKKyAgICBFQVRfQ1JOTAogfSBQYXJzZXJTdGF0ZTsKIAogdHlwZWRlZiBlbnVtIHsKLQlRVU9URV9NSU5JTUFMLCBRVU9URV9BTEwsIFFVT1RFX05PTk5VTUVSSUMsIFFVT1RFX05PTkUKKyAgICBRVU9URV9NSU5JTUFMLCBRVU9URV9BTEwsIFFVT1RFX05PTk5VTUVSSUMsIFFVT1RFX05PTkUKIH0gUXVvdGVTdHlsZTsKIAogdHlwZWRlZiBzdHJ1Y3QgewotCVF1b3RlU3R5bGUgc3R5bGU7Ci0JY2hhciAqbmFtZTsKKyAgICBRdW90ZVN0eWxlIHN0eWxlOworICAgIGNoYXIgKm5hbWU7CiB9IFN0eWxlRGVzYzsKIAogc3RhdGljIFN0eWxlRGVzYyBxdW90ZV9zdHlsZXNbXSA9IHsKLQl7IFFVT1RFX01JTklNQUwsICAgICJRVU9URV9NSU5JTUFMIiB9LAotCXsgUVVPVEVfQUxMLCAgICAgICAgIlFVT1RFX0FMTCIgfSwKLQl7IFFVT1RFX05PTk5VTUVSSUMsICJRVU9URV9OT05OVU1FUklDIiB9LAotCXsgUVVPVEVfTk9ORSwgICAgICAgIlFVT1RFX05PTkUiIH0sCi0JeyAwIH0KKyAgICB7IFFVT1RFX01JTklNQUwsICAgICJRVU9URV9NSU5JTUFMIiB9LAorICAgIHsgUVVPVEVfQUxMLCAgICAgICAgIlFVT1RFX0FMTCIgfSwKKyAgICB7IFFVT1RFX05PTk5VTUVSSUMsICJRVU9URV9OT05OVU1FUklDIiB9LAorICAgIHsgUVVPVEVfTk9ORSwgICAgICAgIlFVT1RFX05PTkUiIH0sCisgICAgeyAwIH0KIH07CiAKIHR5cGVkZWYgc3RydWN0IHsKLSAgICAgICAgUHlPYmplY3RfSEVBRAotICAgICAgICAKLQlpbnQgZG91YmxlcXVvdGU7CS8qIGlzICIgcmVwcmVzZW50ZWQgYnkgIiI/ICovCi0JY2hhciBkZWxpbWl0ZXI7CQkvKiBmaWVsZCBzZXBhcmF0b3IgKi8KLQljaGFyIHF1b3RlY2hhcjsJCS8qIHF1b3RlIGNoYXJhY3RlciAqLwotCWNoYXIgZXNjYXBlY2hhcjsJLyogZXNjYXBlIGNoYXJhY3RlciAqLwotCWludCBza2lwaW5pdGlhbHNwYWNlOwkvKiBpZ25vcmUgc3BhY2VzIGZvbGxvd2luZyBkZWxpbWl0ZXI/ICovCi0JUHlPYmplY3QgKmxpbmV0ZXJtaW5hdG9yOyAvKiBzdHJpbmcgdG8gd3JpdGUgYmV0d2VlbiByZWNvcmRzICovCi0JaW50IHF1b3Rpbmc7CQkvKiBzdHlsZSBvZiBxdW90aW5nIHRvIHdyaXRlICovCisgICAgUHlPYmplY3RfSEVBRAogCi0JaW50IHN0cmljdDsJCS8qIHJhaXNlIGV4Y2VwdGlvbiBvbiBiYWQgQ1NWICovCisgICAgaW50IGRvdWJsZXF1b3RlOyAgICAgICAgICAgIC8qIGlzICIgcmVwcmVzZW50ZWQgYnkgIiI/ICovCisgICAgY2hhciBkZWxpbWl0ZXI7ICAgICAgICAgICAgIC8qIGZpZWxkIHNlcGFyYXRvciAqLworICAgIGNoYXIgcXVvdGVjaGFyOyAgICAgICAgICAgICAvKiBxdW90ZSBjaGFyYWN0ZXIgKi8KKyAgICBjaGFyIGVzY2FwZWNoYXI7ICAgICAgICAgICAgLyogZXNjYXBlIGNoYXJhY3RlciAqLworICAgIGludCBza2lwaW5pdGlhbHNwYWNlOyAgICAgICAvKiBpZ25vcmUgc3BhY2VzIGZvbGxvd2luZyBkZWxpbWl0ZXI/ICovCisgICAgUHlPYmplY3QgKmxpbmV0ZXJtaW5hdG9yOyAvKiBzdHJpbmcgdG8gd3JpdGUgYmV0d2VlbiByZWNvcmRzICovCisgICAgaW50IHF1b3Rpbmc7ICAgICAgICAgICAgICAgIC8qIHN0eWxlIG9mIHF1b3RpbmcgdG8gd3JpdGUgKi8KKworICAgIGludCBzdHJpY3Q7ICAgICAgICAgICAgICAgICAvKiByYWlzZSBleGNlcHRpb24gb24gYmFkIENTViAqLwogfSBEaWFsZWN0T2JqOwogCiBzdGF0aWNmb3J3YXJkIFB5VHlwZU9iamVjdCBEaWFsZWN0X1R5cGU7CiAKIHR5cGVkZWYgc3RydWN0IHsKLSAgICAgICAgUHlPYmplY3RfSEVBRAorICAgIFB5T2JqZWN0X0hFQUQKIAotICAgICAgICBQeU9iamVjdCAqaW5wdXRfaXRlcjsgICAvKiBpdGVyYXRlIG92ZXIgdGhpcyBmb3IgaW5wdXQgbGluZXMgKi8KKyAgICBQeU9iamVjdCAqaW5wdXRfaXRlcjsgICAvKiBpdGVyYXRlIG92ZXIgdGhpcyBmb3IgaW5wdXQgbGluZXMgKi8KIAotICAgICAgICBEaWFsZWN0T2JqICpkaWFsZWN0OyAgICAvKiBwYXJzaW5nIGRpYWxlY3QgKi8KKyAgICBEaWFsZWN0T2JqICpkaWFsZWN0OyAgICAvKiBwYXJzaW5nIGRpYWxlY3QgKi8KIAotCVB5T2JqZWN0ICpmaWVsZHM7CS8qIGZpZWxkIGxpc3QgZm9yIGN1cnJlbnQgcmVjb3JkICovCi0JUGFyc2VyU3RhdGUgc3RhdGU7CS8qIGN1cnJlbnQgQ1NWIHBhcnNlIHN0YXRlICovCi0JY2hhciAqZmllbGQ7CQkvKiBidWlsZCBjdXJyZW50IGZpZWxkIGluIGhlcmUgKi8KLQlpbnQgZmllbGRfc2l6ZTsJCS8qIHNpemUgb2YgYWxsb2NhdGVkIGJ1ZmZlciAqLwotCWludCBmaWVsZF9sZW47CQkvKiBsZW5ndGggb2YgY3VycmVudCBmaWVsZCAqLwotCWludCBudW1lcmljX2ZpZWxkOwkvKiB0cmVhdCBmaWVsZCBhcyBudW1lcmljICovCi0JdW5zaWduZWQgbG9uZyBsaW5lX251bTsJLyogU291cmNlLWZpbGUgbGluZSBudW1iZXIgKi8KKyAgICBQeU9iamVjdCAqZmllbGRzOyAgICAgICAgICAgLyogZmllbGQgbGlzdCBmb3IgY3VycmVudCByZWNvcmQgKi8KKyAgICBQYXJzZXJTdGF0ZSBzdGF0ZTsgICAgICAgICAgLyogY3VycmVudCBDU1YgcGFyc2Ugc3RhdGUgKi8KKyAgICBjaGFyICpmaWVsZDsgICAgICAgICAgICAgICAgLyogYnVpbGQgY3VycmVudCBmaWVsZCBpbiBoZXJlICovCisgICAgaW50IGZpZWxkX3NpemU7ICAgICAgICAgICAgIC8qIHNpemUgb2YgYWxsb2NhdGVkIGJ1ZmZlciAqLworICAgIGludCBmaWVsZF9sZW47ICAgICAgICAgICAgICAvKiBsZW5ndGggb2YgY3VycmVudCBmaWVsZCAqLworICAgIGludCBudW1lcmljX2ZpZWxkOyAgICAgICAgICAvKiB0cmVhdCBmaWVsZCBhcyBudW1lcmljICovCisgICAgdW5zaWduZWQgbG9uZyBsaW5lX251bTsgICAgIC8qIFNvdXJjZS1maWxlIGxpbmUgbnVtYmVyICovCiB9IFJlYWRlck9iajsKIAogc3RhdGljZm9yd2FyZCBQeVR5cGVPYmplY3QgUmVhZGVyX1R5cGU7CkBAIC0xMjgsMTcgKzEyOCwxNyBAQAogI2RlZmluZSBSZWFkZXJPYmplY3RfQ2hlY2sodikgICAoUHlfVFlQRSh2KSA9PSAmUmVhZGVyX1R5cGUpCiAKIHR5cGVkZWYgc3RydWN0IHsKLSAgICAgICAgUHlPYmplY3RfSEVBRAorICAgIFB5T2JqZWN0X0hFQUQKIAotICAgICAgICBQeU9iamVjdCAqd3JpdGVsaW5lOyAgICAvKiB3cml0ZSBvdXRwdXQgbGluZXMgdG8gdGhpcyBmaWxlICovCisgICAgUHlPYmplY3QgKndyaXRlbGluZTsgICAgLyogd3JpdGUgb3V0cHV0IGxpbmVzIHRvIHRoaXMgZmlsZSAqLwogCi0gICAgICAgIERpYWxlY3RPYmogKmRpYWxlY3Q7ICAgIC8qIHBhcnNpbmcgZGlhbGVjdCAqLworICAgIERpYWxlY3RPYmogKmRpYWxlY3Q7ICAgIC8qIHBhcnNpbmcgZGlhbGVjdCAqLwogCi0JY2hhciAqcmVjOwkJLyogYnVmZmVyIGZvciBwYXJzZXIuam9pbiAqLwotCWludCByZWNfc2l6ZTsJCS8qIHNpemUgb2YgYWxsb2NhdGVkIHJlY29yZCAqLwotCWludCByZWNfbGVuOwkJLyogbGVuZ3RoIG9mIHJlY29yZCAqLwotCWludCBudW1fZmllbGRzOwkJLyogbnVtYmVyIG9mIGZpZWxkcyBpbiByZWNvcmQgKi8KLX0gV3JpdGVyT2JqOyAgICAgICAgCisgICAgY2hhciAqcmVjOyAgICAgICAgICAgICAgICAgIC8qIGJ1ZmZlciBmb3IgcGFyc2VyLmpvaW4gKi8KKyAgICBpbnQgcmVjX3NpemU7ICAgICAgICAgICAgICAgLyogc2l6ZSBvZiBhbGxvY2F0ZWQgcmVjb3JkICovCisgICAgaW50IHJlY19sZW47ICAgICAgICAgICAgICAgIC8qIGxlbmd0aCBvZiByZWNvcmQgKi8KKyAgICBpbnQgbnVtX2ZpZWxkczsgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGZpZWxkcyBpbiByZWNvcmQgKi8KK30gV3JpdGVyT2JqOwogCiBzdGF0aWNmb3J3YXJkIFB5VHlwZU9iamVjdCBXcml0ZXJfVHlwZTsKIApAQCAtMTQ5LDM1NyArMTQ5LDM1NyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdldF9kaWFsZWN0X2Zyb21fcmVnaXN0cnkoUHlPYmplY3QgKiBuYW1lX29iaikKIHsKLSAgICAgICAgUHlPYmplY3QgKmRpYWxlY3Rfb2JqOworICAgIFB5T2JqZWN0ICpkaWFsZWN0X29iajsKIAotICAgICAgICBkaWFsZWN0X29iaiA9IFB5RGljdF9HZXRJdGVtKGRpYWxlY3RzLCBuYW1lX29iaik7Ci0JaWYgKGRpYWxlY3Rfb2JqID09IE5VTEwpIHsKLQkJaWYgKCFQeUVycl9PY2N1cnJlZCgpKQotCQkJUHlFcnJfRm9ybWF0KGVycm9yX29iaiwgInVua25vd24gZGlhbGVjdCIpOwotCX0KLQllbHNlCi0JCVB5X0lOQ1JFRihkaWFsZWN0X29iaik7Ci0gICAgICAgIHJldHVybiBkaWFsZWN0X29iajsKKyAgICBkaWFsZWN0X29iaiA9IFB5RGljdF9HZXRJdGVtKGRpYWxlY3RzLCBuYW1lX29iaik7CisgICAgaWYgKGRpYWxlY3Rfb2JqID09IE5VTEwpIHsKKyAgICAgICAgaWYgKCFQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgUHlFcnJfRm9ybWF0KGVycm9yX29iaiwgInVua25vd24gZGlhbGVjdCIpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIFB5X0lOQ1JFRihkaWFsZWN0X29iaik7CisgICAgcmV0dXJuIGRpYWxlY3Rfb2JqOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZ2V0X3N0cmluZyhQeU9iamVjdCAqc3RyKQogewotICAgICAgICBQeV9YSU5DUkVGKHN0cik7Ci0gICAgICAgIHJldHVybiBzdHI7CisgICAgUHlfWElOQ1JFRihzdHIpOworICAgIHJldHVybiBzdHI7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZXRfbnVsbGNoYXJfYXNfTm9uZShjaGFyIGMpCiB7Ci0gICAgICAgIGlmIChjID09ICdcMCcpIHsKLSAgICAgICAgICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFB5X05vbmU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciopJmMsIDEpOworICAgIGlmIChjID09ICdcMCcpIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIqKSZjLCAxKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIERpYWxlY3RfZ2V0X2xpbmV0ZXJtaW5hdG9yKERpYWxlY3RPYmogKnNlbGYpCiB7Ci0gICAgICAgIHJldHVybiBnZXRfc3RyaW5nKHNlbGYtPmxpbmV0ZXJtaW5hdG9yKTsKKyAgICByZXR1cm4gZ2V0X3N0cmluZyhzZWxmLT5saW5ldGVybWluYXRvcik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBEaWFsZWN0X2dldF9lc2NhcGVjaGFyKERpYWxlY3RPYmogKnNlbGYpCiB7Ci0gICAgICAgIHJldHVybiBnZXRfbnVsbGNoYXJfYXNfTm9uZShzZWxmLT5lc2NhcGVjaGFyKTsKKyAgICByZXR1cm4gZ2V0X251bGxjaGFyX2FzX05vbmUoc2VsZi0+ZXNjYXBlY2hhcik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBEaWFsZWN0X2dldF9xdW90ZWNoYXIoRGlhbGVjdE9iaiAqc2VsZikKIHsKLSAgICAgICAgcmV0dXJuIGdldF9udWxsY2hhcl9hc19Ob25lKHNlbGYtPnF1b3RlY2hhcik7CisgICAgcmV0dXJuIGdldF9udWxsY2hhcl9hc19Ob25lKHNlbGYtPnF1b3RlY2hhcik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBEaWFsZWN0X2dldF9xdW90aW5nKERpYWxlY3RPYmogKnNlbGYpCiB7Ci0gICAgICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhzZWxmLT5xdW90aW5nKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoc2VsZi0+cXVvdGluZyk7CiB9CiAKIHN0YXRpYyBpbnQKIF9zZXRfYm9vbChjb25zdCBjaGFyICpuYW1lLCBpbnQgKnRhcmdldCwgUHlPYmplY3QgKnNyYywgaW50IGRmbHQpCiB7Ci0JaWYgKHNyYyA9PSBOVUxMKQotCQkqdGFyZ2V0ID0gZGZsdDsKLQllbHNlCi0JCSp0YXJnZXQgPSBQeU9iamVjdF9Jc1RydWUoc3JjKTsKLQlyZXR1cm4gMDsKKyAgICBpZiAoc3JjID09IE5VTEwpCisgICAgICAgICp0YXJnZXQgPSBkZmx0OworICAgIGVsc2UKKyAgICAgICAgKnRhcmdldCA9IFB5T2JqZWN0X0lzVHJ1ZShzcmMpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBfc2V0X2ludChjb25zdCBjaGFyICpuYW1lLCBpbnQgKnRhcmdldCwgUHlPYmplY3QgKnNyYywgaW50IGRmbHQpCiB7Ci0JaWYgKHNyYyA9PSBOVUxMKQotCQkqdGFyZ2V0ID0gZGZsdDsKLQllbHNlIHsKLQkJaWYgKCFQeUludF9DaGVjayhzcmMpKSB7Ci0JCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAKLQkJCQkgICAgICJcIiVzXCIgbXVzdCBiZSBhbiBpbnRlZ2VyIiwgbmFtZSk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJKnRhcmdldCA9IFB5SW50X0FzTG9uZyhzcmMpOwotCX0KLQlyZXR1cm4gMDsKKyAgICBpZiAoc3JjID09IE5VTEwpCisgICAgICAgICp0YXJnZXQgPSBkZmx0OworICAgIGVsc2UgeworICAgICAgICBpZiAoIVB5SW50X0NoZWNrKHNyYykpIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIlwiJXNcIiBtdXN0IGJlIGFuIGludGVnZXIiLCBuYW1lKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICAqdGFyZ2V0ID0gUHlJbnRfQXNMb25nKHNyYyk7CisgICAgfQorICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBfc2V0X2NoYXIoY29uc3QgY2hhciAqbmFtZSwgY2hhciAqdGFyZ2V0LCBQeU9iamVjdCAqc3JjLCBjaGFyIGRmbHQpCiB7Ci0JaWYgKHNyYyA9PSBOVUxMKQotCQkqdGFyZ2V0ID0gZGZsdDsKLQllbHNlIHsKLQkJaWYgKHNyYyA9PSBQeV9Ob25lIHx8IFB5U3RyaW5nX1NpemUoc3JjKSA9PSAwKQotCQkJKnRhcmdldCA9ICdcMCc7Ci0JCWVsc2UgaWYgKCFQeVN0cmluZ19DaGVjayhzcmMpIHx8IFB5U3RyaW5nX1NpemUoc3JjKSAhPSAxKSB7Ci0JCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAKLQkJCQkgICAgICJcIiVzXCIgbXVzdCBiZSBhbiAxLWNoYXJhY3RlciBzdHJpbmciLCAKLQkJCQkgICAgIG5hbWUpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWVsc2UgewotCQkJY2hhciAqcyA9IFB5U3RyaW5nX0FzU3RyaW5nKHNyYyk7Ci0JCQlpZiAocyA9PSBOVUxMKQotCQkJCXJldHVybiAtMTsKLQkJCSp0YXJnZXQgPSBzWzBdOwotCQl9Ci0JfQotICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoc3JjID09IE5VTEwpCisgICAgICAgICp0YXJnZXQgPSBkZmx0OworICAgIGVsc2UgeworICAgICAgICBpZiAoc3JjID09IFB5X05vbmUgfHwgUHlTdHJpbmdfU2l6ZShzcmMpID09IDApCisgICAgICAgICAgICAqdGFyZ2V0ID0gJ1wwJzsKKyAgICAgICAgZWxzZSBpZiAoIVB5U3RyaW5nX0NoZWNrKHNyYykgfHwgUHlTdHJpbmdfU2l6ZShzcmMpICE9IDEpIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIlwiJXNcIiBtdXN0IGJlIGFuIDEtY2hhcmFjdGVyIHN0cmluZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBjaGFyICpzID0gUHlTdHJpbmdfQXNTdHJpbmcoc3JjKTsKKyAgICAgICAgICAgIGlmIChzID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgKnRhcmdldCA9IHNbMF07CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIF9zZXRfc3RyKGNvbnN0IGNoYXIgKm5hbWUsIFB5T2JqZWN0ICoqdGFyZ2V0LCBQeU9iamVjdCAqc3JjLCBjb25zdCBjaGFyICpkZmx0KQogewotCWlmIChzcmMgPT0gTlVMTCkKLQkJKnRhcmdldCA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoZGZsdCk7Ci0JZWxzZSB7Ci0JCWlmIChzcmMgPT0gUHlfTm9uZSkKLQkJCSp0YXJnZXQgPSBOVUxMOwotCQllbHNlIGlmICghSVNfQkFTRVNUUklORyhzcmMpKSB7Ci0JCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAKLQkJCQkgICAgICJcIiVzXCIgbXVzdCBiZSBhbiBzdHJpbmciLCBuYW1lKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQllbHNlIHsKLQkJCVB5X1hERUNSRUYoKnRhcmdldCk7Ci0JCQlQeV9JTkNSRUYoc3JjKTsKLQkJCSp0YXJnZXQgPSBzcmM7Ci0JCX0KLQl9Ci0gICAgICAgIHJldHVybiAwOworICAgIGlmIChzcmMgPT0gTlVMTCkKKyAgICAgICAgKnRhcmdldCA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoZGZsdCk7CisgICAgZWxzZSB7CisgICAgICAgIGlmIChzcmMgPT0gUHlfTm9uZSkKKyAgICAgICAgICAgICp0YXJnZXQgPSBOVUxMOworICAgICAgICBlbHNlIGlmICghSVNfQkFTRVNUUklORyhzcmMpKSB7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICJcIiVzXCIgbXVzdCBiZSBhbiBzdHJpbmciLCBuYW1lKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIFB5X1hERUNSRUYoKnRhcmdldCk7CisgICAgICAgICAgICBQeV9JTkNSRUYoc3JjKTsKKyAgICAgICAgICAgICp0YXJnZXQgPSBzcmM7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIGRpYWxlY3RfY2hlY2tfcXVvdGluZyhpbnQgcXVvdGluZykKIHsKLSAgICAgICAgU3R5bGVEZXNjICpxcyA9IHF1b3RlX3N0eWxlczsKKyAgICBTdHlsZURlc2MgKnFzID0gcXVvdGVfc3R5bGVzOwogCi0JZm9yIChxcyA9IHF1b3RlX3N0eWxlczsgcXMtPm5hbWU7IHFzKyspIHsKLQkJaWYgKHFzLT5zdHlsZSA9PSBxdW90aW5nKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAiYmFkIFwicXVvdGluZ1wiIHZhbHVlIik7Ci0gICAgICAgIHJldHVybiAtMTsKKyAgICBmb3IgKHFzID0gcXVvdGVfc3R5bGVzOyBxcy0+bmFtZTsgcXMrKykgeworICAgICAgICBpZiAocXMtPnN0eWxlID09IHF1b3RpbmcpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgImJhZCBcInF1b3RpbmdcIiB2YWx1ZSIpOworICAgIHJldHVybiAtMTsKIH0KIAogI2RlZmluZSBEX09GRih4KSBvZmZzZXRvZihEaWFsZWN0T2JqLCB4KQogCiBzdGF0aWMgc3RydWN0IFB5TWVtYmVyRGVmIERpYWxlY3RfbWVtYmVybGlzdFtdID0gewotCXsgImRlbGltaXRlciIsICAgICAgICAgIFRfQ0hBUiwgRF9PRkYoZGVsaW1pdGVyKSwgUkVBRE9OTFkgfSwKLQl7ICJza2lwaW5pdGlhbHNwYWNlIiwgICBUX0lOVCwgRF9PRkYoc2tpcGluaXRpYWxzcGFjZSksIFJFQURPTkxZIH0sCi0JeyAiZG91YmxlcXVvdGUiLCAgICAgICAgVF9JTlQsIERfT0ZGKGRvdWJsZXF1b3RlKSwgUkVBRE9OTFkgfSwKLQl7ICJzdHJpY3QiLCAgICAgICAgICAgICBUX0lOVCwgRF9PRkYoc3RyaWN0KSwgUkVBRE9OTFkgfSwKLQl7IE5VTEwgfQorICAgIHsgImRlbGltaXRlciIsICAgICAgICAgIFRfQ0hBUiwgRF9PRkYoZGVsaW1pdGVyKSwgUkVBRE9OTFkgfSwKKyAgICB7ICJza2lwaW5pdGlhbHNwYWNlIiwgICBUX0lOVCwgRF9PRkYoc2tpcGluaXRpYWxzcGFjZSksIFJFQURPTkxZIH0sCisgICAgeyAiZG91YmxlcXVvdGUiLCAgICAgICAgVF9JTlQsIERfT0ZGKGRvdWJsZXF1b3RlKSwgUkVBRE9OTFkgfSwKKyAgICB7ICJzdHJpY3QiLCAgICAgICAgICAgICBUX0lOVCwgRF9PRkYoc3RyaWN0KSwgUkVBRE9OTFkgfSwKKyAgICB7IE5VTEwgfQogfTsKIAogc3RhdGljIFB5R2V0U2V0RGVmIERpYWxlY3RfZ2V0c2V0bGlzdFtdID0gewotCXsgImVzY2FwZWNoYXIiLAkJKGdldHRlcilEaWFsZWN0X2dldF9lc2NhcGVjaGFyfSwKLQl7ICJsaW5ldGVybWluYXRvciIsCShnZXR0ZXIpRGlhbGVjdF9nZXRfbGluZXRlcm1pbmF0b3J9LAotCXsgInF1b3RlY2hhciIsCQkoZ2V0dGVyKURpYWxlY3RfZ2V0X3F1b3RlY2hhcn0sCi0JeyAicXVvdGluZyIsCQkoZ2V0dGVyKURpYWxlY3RfZ2V0X3F1b3Rpbmd9LAotCXtOVUxMfSwKKyAgICB7ICJlc2NhcGVjaGFyIiwgICAgICAgICAgICAgKGdldHRlcilEaWFsZWN0X2dldF9lc2NhcGVjaGFyfSwKKyAgICB7ICJsaW5ldGVybWluYXRvciIsICAgICAgICAgKGdldHRlcilEaWFsZWN0X2dldF9saW5ldGVybWluYXRvcn0sCisgICAgeyAicXVvdGVjaGFyIiwgICAgICAgICAgICAgIChnZXR0ZXIpRGlhbGVjdF9nZXRfcXVvdGVjaGFyfSwKKyAgICB7ICJxdW90aW5nIiwgICAgICAgICAgICAgICAgKGdldHRlcilEaWFsZWN0X2dldF9xdW90aW5nfSwKKyAgICB7TlVMTH0sCiB9OwogCiBzdGF0aWMgdm9pZAogRGlhbGVjdF9kZWFsbG9jKERpYWxlY3RPYmogKnNlbGYpCiB7Ci0gICAgICAgIFB5X1hERUNSRUYoc2VsZi0+bGluZXRlcm1pbmF0b3IpOwotICAgICAgICBQeV9UWVBFKHNlbGYpLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOworICAgIFB5X1hERUNSRUYoc2VsZi0+bGluZXRlcm1pbmF0b3IpOworICAgIFB5X1RZUEUoc2VsZiktPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIHN0YXRpYyBjaGFyICpkaWFsZWN0X2t3c1tdID0gewotCSJkaWFsZWN0IiwKLQkiZGVsaW1pdGVyIiwKLQkiZG91YmxlcXVvdGUiLAotCSJlc2NhcGVjaGFyIiwKLQkibGluZXRlcm1pbmF0b3IiLAotCSJxdW90ZWNoYXIiLAotCSJxdW90aW5nIiwKLQkic2tpcGluaXRpYWxzcGFjZSIsCi0JInN0cmljdCIsCi0JTlVMTAorICAgICJkaWFsZWN0IiwKKyAgICAiZGVsaW1pdGVyIiwKKyAgICAiZG91YmxlcXVvdGUiLAorICAgICJlc2NhcGVjaGFyIiwKKyAgICAibGluZXRlcm1pbmF0b3IiLAorICAgICJxdW90ZWNoYXIiLAorICAgICJxdW90aW5nIiwKKyAgICAic2tpcGluaXRpYWxzcGFjZSIsCisgICAgInN0cmljdCIsCisgICAgTlVMTAogfTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIGRpYWxlY3RfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7Ci0JRGlhbGVjdE9iaiAqc2VsZjsKLQlQeU9iamVjdCAqcmV0ID0gTlVMTDsKLQlQeU9iamVjdCAqZGlhbGVjdCA9IE5VTEw7Ci0JUHlPYmplY3QgKmRlbGltaXRlciA9IE5VTEw7Ci0JUHlPYmplY3QgKmRvdWJsZXF1b3RlID0gTlVMTDsKLQlQeU9iamVjdCAqZXNjYXBlY2hhciA9IE5VTEw7Ci0JUHlPYmplY3QgKmxpbmV0ZXJtaW5hdG9yID0gTlVMTDsKLQlQeU9iamVjdCAqcXVvdGVjaGFyID0gTlVMTDsKLQlQeU9iamVjdCAqcXVvdGluZyA9IE5VTEw7Ci0JUHlPYmplY3QgKnNraXBpbml0aWFsc3BhY2UgPSBOVUxMOwotCVB5T2JqZWN0ICpzdHJpY3QgPSBOVUxMOworICAgIERpYWxlY3RPYmogKnNlbGY7CisgICAgUHlPYmplY3QgKnJldCA9IE5VTEw7CisgICAgUHlPYmplY3QgKmRpYWxlY3QgPSBOVUxMOworICAgIFB5T2JqZWN0ICpkZWxpbWl0ZXIgPSBOVUxMOworICAgIFB5T2JqZWN0ICpkb3VibGVxdW90ZSA9IE5VTEw7CisgICAgUHlPYmplY3QgKmVzY2FwZWNoYXIgPSBOVUxMOworICAgIFB5T2JqZWN0ICpsaW5ldGVybWluYXRvciA9IE5VTEw7CisgICAgUHlPYmplY3QgKnF1b3RlY2hhciA9IE5VTEw7CisgICAgUHlPYmplY3QgKnF1b3RpbmcgPSBOVUxMOworICAgIFB5T2JqZWN0ICpza2lwaW5pdGlhbHNwYWNlID0gTlVMTDsKKyAgICBQeU9iamVjdCAqc3RyaWN0ID0gTlVMTDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywKLQkJCQkJICJ8T09PT09PT09PIiwgZGlhbGVjdF9rd3MsCi0JCQkJCSAmZGlhbGVjdCwKLQkJCQkJICZkZWxpbWl0ZXIsCi0JCQkJCSAmZG91YmxlcXVvdGUsCi0JCQkJCSAmZXNjYXBlY2hhciwKLQkJCQkJICZsaW5ldGVybWluYXRvciwKLQkJCQkJICZxdW90ZWNoYXIsCi0JCQkJCSAmcXVvdGluZywKLQkJCQkJICZza2lwaW5pdGlhbHNwYWNlLAotCQkJCQkgJnN0cmljdCkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAifE9PT09PT09PTyIsIGRpYWxlY3Rfa3dzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkaWFsZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZWxpbWl0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRvdWJsZXF1b3RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlc2NhcGVjaGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsaW5ldGVybWluYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcXVvdGVjaGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZxdW90aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZza2lwaW5pdGlhbHNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHJpY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChkaWFsZWN0ICE9IE5VTEwpIHsKLQkJaWYgKElTX0JBU0VTVFJJTkcoZGlhbGVjdCkpIHsKLQkJCWRpYWxlY3QgPSBnZXRfZGlhbGVjdF9mcm9tX3JlZ2lzdHJ5KGRpYWxlY3QpOwotCQkJaWYgKGRpYWxlY3QgPT0gTlVMTCkKLQkJCQlyZXR1cm4gTlVMTDsKLQkJfQotCQllbHNlCi0JCQlQeV9JTkNSRUYoZGlhbGVjdCk7Ci0JCS8qIENhbiB3ZSByZXVzZSB0aGlzIGluc3RhbmNlPyAqLwotCQlpZiAoUHlPYmplY3RfVHlwZUNoZWNrKGRpYWxlY3QsICZEaWFsZWN0X1R5cGUpICYmCi0JCSAgICBkZWxpbWl0ZXIgPT0gMCAmJgotCQkgICAgZG91YmxlcXVvdGUgPT0gMCAmJgotCQkgICAgZXNjYXBlY2hhciA9PSAwICYmCi0JCSAgICBsaW5ldGVybWluYXRvciA9PSAwICYmCi0JCSAgICBxdW90ZWNoYXIgPT0gMCAmJgotCQkgICAgcXVvdGluZyA9PSAwICYmCi0JCSAgICBza2lwaW5pdGlhbHNwYWNlID09IDAgJiYKLQkJICAgIHN0cmljdCA9PSAwKQotCQkJcmV0dXJuIGRpYWxlY3Q7Ci0JfQorICAgIGlmIChkaWFsZWN0ICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKElTX0JBU0VTVFJJTkcoZGlhbGVjdCkpIHsKKyAgICAgICAgICAgIGRpYWxlY3QgPSBnZXRfZGlhbGVjdF9mcm9tX3JlZ2lzdHJ5KGRpYWxlY3QpOworICAgICAgICAgICAgaWYgKGRpYWxlY3QgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBQeV9JTkNSRUYoZGlhbGVjdCk7CisgICAgICAgIC8qIENhbiB3ZSByZXVzZSB0aGlzIGluc3RhbmNlPyAqLworICAgICAgICBpZiAoUHlPYmplY3RfVHlwZUNoZWNrKGRpYWxlY3QsICZEaWFsZWN0X1R5cGUpICYmCisgICAgICAgICAgICBkZWxpbWl0ZXIgPT0gMCAmJgorICAgICAgICAgICAgZG91YmxlcXVvdGUgPT0gMCAmJgorICAgICAgICAgICAgZXNjYXBlY2hhciA9PSAwICYmCisgICAgICAgICAgICBsaW5ldGVybWluYXRvciA9PSAwICYmCisgICAgICAgICAgICBxdW90ZWNoYXIgPT0gMCAmJgorICAgICAgICAgICAgcXVvdGluZyA9PSAwICYmCisgICAgICAgICAgICBza2lwaW5pdGlhbHNwYWNlID09IDAgJiYKKyAgICAgICAgICAgIHN0cmljdCA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIGRpYWxlY3Q7CisgICAgfQogCi0Jc2VsZiA9IChEaWFsZWN0T2JqICopdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7Ci0JaWYgKHNlbGYgPT0gTlVMTCkgewotCQlQeV9YREVDUkVGKGRpYWxlY3QpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0Jc2VsZi0+bGluZXRlcm1pbmF0b3IgPSBOVUxMOworICAgIHNlbGYgPSAoRGlhbGVjdE9iaiAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOworICAgIGlmIChzZWxmID09IE5VTEwpIHsKKyAgICAgICAgUHlfWERFQ1JFRihkaWFsZWN0KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHNlbGYtPmxpbmV0ZXJtaW5hdG9yID0gTlVMTDsKIAotCVB5X1hJTkNSRUYoZGVsaW1pdGVyKTsKLQlQeV9YSU5DUkVGKGRvdWJsZXF1b3RlKTsKLQlQeV9YSU5DUkVGKGVzY2FwZWNoYXIpOwotCVB5X1hJTkNSRUYobGluZXRlcm1pbmF0b3IpOwotCVB5X1hJTkNSRUYocXVvdGVjaGFyKTsKLQlQeV9YSU5DUkVGKHF1b3RpbmcpOwotCVB5X1hJTkNSRUYoc2tpcGluaXRpYWxzcGFjZSk7Ci0JUHlfWElOQ1JFRihzdHJpY3QpOwotCWlmIChkaWFsZWN0ICE9IE5VTEwpIHsKKyAgICBQeV9YSU5DUkVGKGRlbGltaXRlcik7CisgICAgUHlfWElOQ1JFRihkb3VibGVxdW90ZSk7CisgICAgUHlfWElOQ1JFRihlc2NhcGVjaGFyKTsKKyAgICBQeV9YSU5DUkVGKGxpbmV0ZXJtaW5hdG9yKTsKKyAgICBQeV9YSU5DUkVGKHF1b3RlY2hhcik7CisgICAgUHlfWElOQ1JFRihxdW90aW5nKTsKKyAgICBQeV9YSU5DUkVGKHNraXBpbml0aWFsc3BhY2UpOworICAgIFB5X1hJTkNSRUYoc3RyaWN0KTsKKyAgICBpZiAoZGlhbGVjdCAhPSBOVUxMKSB7CiAjZGVmaW5lIERJQUxFQ1RfR0VUQVRUUih2LCBuKSBcCi0JCWlmICh2ID09IE5VTEwpIFwKLQkJCXYgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKGRpYWxlY3QsIG4pCi0JCURJQUxFQ1RfR0VUQVRUUihkZWxpbWl0ZXIsICJkZWxpbWl0ZXIiKTsKLQkJRElBTEVDVF9HRVRBVFRSKGRvdWJsZXF1b3RlLCAiZG91YmxlcXVvdGUiKTsKLQkJRElBTEVDVF9HRVRBVFRSKGVzY2FwZWNoYXIsICJlc2NhcGVjaGFyIik7Ci0JCURJQUxFQ1RfR0VUQVRUUihsaW5ldGVybWluYXRvciwgImxpbmV0ZXJtaW5hdG9yIik7Ci0JCURJQUxFQ1RfR0VUQVRUUihxdW90ZWNoYXIsICJxdW90ZWNoYXIiKTsKLQkJRElBTEVDVF9HRVRBVFRSKHF1b3RpbmcsICJxdW90aW5nIik7Ci0JCURJQUxFQ1RfR0VUQVRUUihza2lwaW5pdGlhbHNwYWNlLCAic2tpcGluaXRpYWxzcGFjZSIpOwotCQlESUFMRUNUX0dFVEFUVFIoc3RyaWN0LCAic3RyaWN0Iik7Ci0JCVB5RXJyX0NsZWFyKCk7Ci0JfQorICAgICAgICBpZiAodiA9PSBOVUxMKSBcCisgICAgICAgICAgICB2ID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhkaWFsZWN0LCBuKQorICAgICAgICBESUFMRUNUX0dFVEFUVFIoZGVsaW1pdGVyLCAiZGVsaW1pdGVyIik7CisgICAgICAgIERJQUxFQ1RfR0VUQVRUUihkb3VibGVxdW90ZSwgImRvdWJsZXF1b3RlIik7CisgICAgICAgIERJQUxFQ1RfR0VUQVRUUihlc2NhcGVjaGFyLCAiZXNjYXBlY2hhciIpOworICAgICAgICBESUFMRUNUX0dFVEFUVFIobGluZXRlcm1pbmF0b3IsICJsaW5ldGVybWluYXRvciIpOworICAgICAgICBESUFMRUNUX0dFVEFUVFIocXVvdGVjaGFyLCAicXVvdGVjaGFyIik7CisgICAgICAgIERJQUxFQ1RfR0VUQVRUUihxdW90aW5nLCAicXVvdGluZyIpOworICAgICAgICBESUFMRUNUX0dFVEFUVFIoc2tpcGluaXRpYWxzcGFjZSwgInNraXBpbml0aWFsc3BhY2UiKTsKKyAgICAgICAgRElBTEVDVF9HRVRBVFRSKHN0cmljdCwgInN0cmljdCIpOworICAgICAgICBQeUVycl9DbGVhcigpOworICAgIH0KIAotCS8qIGNoZWNrIHR5cGVzIGFuZCBjb252ZXJ0IHRvIEMgdmFsdWVzICovCisgICAgLyogY2hlY2sgdHlwZXMgYW5kIGNvbnZlcnQgdG8gQyB2YWx1ZXMgKi8KICNkZWZpbmUgRElBU0VUKG1ldGgsIG5hbWUsIHRhcmdldCwgc3JjLCBkZmx0KSBcCi0JaWYgKG1ldGgobmFtZSwgdGFyZ2V0LCBzcmMsIGRmbHQpKSBcCi0JCWdvdG8gZXJyCi0JRElBU0VUKF9zZXRfY2hhciwgImRlbGltaXRlciIsICZzZWxmLT5kZWxpbWl0ZXIsIGRlbGltaXRlciwgJywnKTsKLQlESUFTRVQoX3NldF9ib29sLCAiZG91YmxlcXVvdGUiLCAmc2VsZi0+ZG91YmxlcXVvdGUsIGRvdWJsZXF1b3RlLCAxKTsKLQlESUFTRVQoX3NldF9jaGFyLCAiZXNjYXBlY2hhciIsICZzZWxmLT5lc2NhcGVjaGFyLCBlc2NhcGVjaGFyLCAwKTsKLQlESUFTRVQoX3NldF9zdHIsICJsaW5ldGVybWluYXRvciIsICZzZWxmLT5saW5ldGVybWluYXRvciwgbGluZXRlcm1pbmF0b3IsICJcclxuIik7Ci0JRElBU0VUKF9zZXRfY2hhciwgInF1b3RlY2hhciIsICZzZWxmLT5xdW90ZWNoYXIsIHF1b3RlY2hhciwgJyInKTsKLQlESUFTRVQoX3NldF9pbnQsICJxdW90aW5nIiwgJnNlbGYtPnF1b3RpbmcsIHF1b3RpbmcsIFFVT1RFX01JTklNQUwpOwotCURJQVNFVChfc2V0X2Jvb2wsICJza2lwaW5pdGlhbHNwYWNlIiwgJnNlbGYtPnNraXBpbml0aWFsc3BhY2UsIHNraXBpbml0aWFsc3BhY2UsIDApOwotCURJQVNFVChfc2V0X2Jvb2wsICJzdHJpY3QiLCAmc2VsZi0+c3RyaWN0LCBzdHJpY3QsIDApOworICAgIGlmIChtZXRoKG5hbWUsIHRhcmdldCwgc3JjLCBkZmx0KSkgXAorICAgICAgICBnb3RvIGVycgorICAgIERJQVNFVChfc2V0X2NoYXIsICJkZWxpbWl0ZXIiLCAmc2VsZi0+ZGVsaW1pdGVyLCBkZWxpbWl0ZXIsICcsJyk7CisgICAgRElBU0VUKF9zZXRfYm9vbCwgImRvdWJsZXF1b3RlIiwgJnNlbGYtPmRvdWJsZXF1b3RlLCBkb3VibGVxdW90ZSwgMSk7CisgICAgRElBU0VUKF9zZXRfY2hhciwgImVzY2FwZWNoYXIiLCAmc2VsZi0+ZXNjYXBlY2hhciwgZXNjYXBlY2hhciwgMCk7CisgICAgRElBU0VUKF9zZXRfc3RyLCAibGluZXRlcm1pbmF0b3IiLCAmc2VsZi0+bGluZXRlcm1pbmF0b3IsIGxpbmV0ZXJtaW5hdG9yLCAiXHJcbiIpOworICAgIERJQVNFVChfc2V0X2NoYXIsICJxdW90ZWNoYXIiLCAmc2VsZi0+cXVvdGVjaGFyLCBxdW90ZWNoYXIsICciJyk7CisgICAgRElBU0VUKF9zZXRfaW50LCAicXVvdGluZyIsICZzZWxmLT5xdW90aW5nLCBxdW90aW5nLCBRVU9URV9NSU5JTUFMKTsKKyAgICBESUFTRVQoX3NldF9ib29sLCAic2tpcGluaXRpYWxzcGFjZSIsICZzZWxmLT5za2lwaW5pdGlhbHNwYWNlLCBza2lwaW5pdGlhbHNwYWNlLCAwKTsKKyAgICBESUFTRVQoX3NldF9ib29sLCAic3RyaWN0IiwgJnNlbGYtPnN0cmljdCwgc3RyaWN0LCAwKTsKIAotCS8qIHZhbGlkYXRlIG9wdGlvbnMgKi8KLQlpZiAoZGlhbGVjdF9jaGVja19xdW90aW5nKHNlbGYtPnF1b3RpbmcpKQotCQlnb3RvIGVycjsKLQlpZiAoc2VsZi0+ZGVsaW1pdGVyID09IDApIHsKLSAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiZGVsaW1pdGVyIG11c3QgYmUgc2V0Iik7Ci0JCWdvdG8gZXJyOwotCX0KLQlpZiAocXVvdGVjaGFyID09IFB5X05vbmUgJiYgcXVvdGluZyA9PSBOVUxMKQotCQlzZWxmLT5xdW90aW5nID0gUVVPVEVfTk9ORTsKLQlpZiAoc2VsZi0+cXVvdGluZyAhPSBRVU9URV9OT05FICYmIHNlbGYtPnF1b3RlY2hhciA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgCi0JCQkJInF1b3RlY2hhciBtdXN0IGJlIHNldCBpZiBxdW90aW5nIGVuYWJsZWQiKTsKLQkJZ290byBlcnI7Ci0JfQotCWlmIChzZWxmLT5saW5ldGVybWluYXRvciA9PSAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJsaW5ldGVybWluYXRvciBtdXN0IGJlIHNldCIpOwotCQlnb3RvIGVycjsKLQl9CisgICAgLyogdmFsaWRhdGUgb3B0aW9ucyAqLworICAgIGlmIChkaWFsZWN0X2NoZWNrX3F1b3Rpbmcoc2VsZi0+cXVvdGluZykpCisgICAgICAgIGdvdG8gZXJyOworICAgIGlmIChzZWxmLT5kZWxpbWl0ZXIgPT0gMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiZGVsaW1pdGVyIG11c3QgYmUgc2V0Iik7CisgICAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgICBpZiAocXVvdGVjaGFyID09IFB5X05vbmUgJiYgcXVvdGluZyA9PSBOVUxMKQorICAgICAgICBzZWxmLT5xdW90aW5nID0gUVVPVEVfTk9ORTsKKyAgICBpZiAoc2VsZi0+cXVvdGluZyAhPSBRVU9URV9OT05FICYmIHNlbGYtPnF1b3RlY2hhciA9PSAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAicXVvdGVjaGFyIG11c3QgYmUgc2V0IGlmIHF1b3RpbmcgZW5hYmxlZCIpOworICAgICAgICBnb3RvIGVycjsKKyAgICB9CisgICAgaWYgKHNlbGYtPmxpbmV0ZXJtaW5hdG9yID09IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImxpbmV0ZXJtaW5hdG9yIG11c3QgYmUgc2V0Iik7CisgICAgICAgIGdvdG8gZXJyOworICAgIH0KIAotCXJldCA9IChQeU9iamVjdCAqKXNlbGY7Ci0JUHlfSU5DUkVGKHNlbGYpOworICAgIHJldCA9IChQeU9iamVjdCAqKXNlbGY7CisgICAgUHlfSU5DUkVGKHNlbGYpOwogZXJyOgotCVB5X1hERUNSRUYoc2VsZik7Ci0JUHlfWERFQ1JFRihkaWFsZWN0KTsKLQlQeV9YREVDUkVGKGRlbGltaXRlcik7Ci0JUHlfWERFQ1JFRihkb3VibGVxdW90ZSk7Ci0JUHlfWERFQ1JFRihlc2NhcGVjaGFyKTsKLQlQeV9YREVDUkVGKGxpbmV0ZXJtaW5hdG9yKTsKLQlQeV9YREVDUkVGKHF1b3RlY2hhcik7Ci0JUHlfWERFQ1JFRihxdW90aW5nKTsKLQlQeV9YREVDUkVGKHNraXBpbml0aWFsc3BhY2UpOwotCVB5X1hERUNSRUYoc3RyaWN0KTsKLQlyZXR1cm4gcmV0OworICAgIFB5X1hERUNSRUYoc2VsZik7CisgICAgUHlfWERFQ1JFRihkaWFsZWN0KTsKKyAgICBQeV9YREVDUkVGKGRlbGltaXRlcik7CisgICAgUHlfWERFQ1JFRihkb3VibGVxdW90ZSk7CisgICAgUHlfWERFQ1JFRihlc2NhcGVjaGFyKTsKKyAgICBQeV9YREVDUkVGKGxpbmV0ZXJtaW5hdG9yKTsKKyAgICBQeV9YREVDUkVGKHF1b3RlY2hhcik7CisgICAgUHlfWERFQ1JFRihxdW90aW5nKTsKKyAgICBQeV9YREVDUkVGKHNraXBpbml0aWFsc3BhY2UpOworICAgIFB5X1hERUNSRUYoc3RyaWN0KTsKKyAgICByZXR1cm4gcmV0OwogfQogCiAKLVB5RG9jX1NUUlZBUihEaWFsZWN0X1R5cGVfZG9jLCAKK1B5RG9jX1NUUlZBUihEaWFsZWN0X1R5cGVfZG9jLAogIkNTViBkaWFsZWN0XG4iCiAiXG4iCiAiVGhlIERpYWxlY3QgdHlwZSByZWNvcmRzIENTViBwYXJzaW5nIGFuZCBnZW5lcmF0aW9uIG9wdGlvbnMuXG4iKTsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBEaWFsZWN0X1R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JIl9jc3YuRGlhbGVjdCIsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KLQlzaXplb2YoRGlhbGVjdE9iaiksICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCi0JLyogIG1ldGhvZHMgICovCi0JKGRlc3RydWN0b3IpRGlhbGVjdF9kZWFsbG9jLCAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KLQkocHJpbnRmdW5jKTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KLQkoZ2V0YXR0cmZ1bmMpMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLwotCShzZXRhdHRyZnVuYykwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCi0JKGNtcGZ1bmMpMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KLQkocmVwcmZ1bmMpMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYykwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCi0JKHRlcm5hcnlmdW5jKTAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KLQkocmVwcmZ1bmMpMCwgICAgICAgICAgICAgICAgICAgIAkvKiB0cF9zdHIgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KLSAgICAgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQlEaWFsZWN0X1R5cGVfZG9jLCAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KLQkwLAkJCQkJLyogdHBfbWV0aG9kcyAqLwotICAgICAgICBEaWFsZWN0X21lbWJlcmxpc3QsICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLwotICAgICAgICBEaWFsZWN0X2dldHNldGxpc3QsICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaW5pdCAqLwotCTAsCQkJCQkvKiB0cF9hbGxvYyAqLwotCWRpYWxlY3RfbmV3LAkJCSAgICAgICAgLyogdHBfbmV3ICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAJCS8qIHRwX2ZyZWUgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAiX2Nzdi5EaWFsZWN0IiwgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgIHNpemVvZihEaWFsZWN0T2JqKSwgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAvKiAgbWV0aG9kcyAgKi8KKyAgICAoZGVzdHJ1Y3RvcilEaWFsZWN0X2RlYWxsb2MsICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIChwcmludGZ1bmMpMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIChnZXRhdHRyZnVuYykwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgKHNldGF0dHJmdW5jKTAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAoY21wZnVuYykwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIChyZXByZnVuYykwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAodGVybmFyeWZ1bmMpMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIChyZXByZnVuYykwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgRGlhbGVjdF9UeXBlX2RvYywgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgRGlhbGVjdF9tZW1iZXJsaXN0LCAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICBEaWFsZWN0X2dldHNldGxpc3QsICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBkaWFsZWN0X25ldywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKIAogLyoKQEAgLTUwOSwxNSArNTA5LDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogX2NhbGxfZGlhbGVjdChQeU9iamVjdCAqZGlhbGVjdF9pbnN0LCBQeU9iamVjdCAqa3dhcmdzKQogewotCVB5T2JqZWN0ICpjdG9yX2FyZ3M7Ci0JUHlPYmplY3QgKmRpYWxlY3Q7CisgICAgUHlPYmplY3QgKmN0b3JfYXJnczsKKyAgICBQeU9iamVjdCAqZGlhbGVjdDsKIAotCWN0b3JfYXJncyA9IFB5X0J1aWxkVmFsdWUoZGlhbGVjdF9pbnN0ID8gIihPKSIgOiAiKCkiLCBkaWFsZWN0X2luc3QpOwotCWlmIChjdG9yX2FyZ3MgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JZGlhbGVjdCA9IFB5T2JqZWN0X0NhbGwoKFB5T2JqZWN0ICopJkRpYWxlY3RfVHlwZSwgY3Rvcl9hcmdzLCBrd2FyZ3MpOwotCVB5X0RFQ1JFRihjdG9yX2FyZ3MpOwotCXJldHVybiBkaWFsZWN0OworICAgIGN0b3JfYXJncyA9IFB5X0J1aWxkVmFsdWUoZGlhbGVjdF9pbnN0ID8gIihPKSIgOiAiKCkiLCBkaWFsZWN0X2luc3QpOworICAgIGlmIChjdG9yX2FyZ3MgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZGlhbGVjdCA9IFB5T2JqZWN0X0NhbGwoKFB5T2JqZWN0ICopJkRpYWxlY3RfVHlwZSwgY3Rvcl9hcmdzLCBrd2FyZ3MpOworICAgIFB5X0RFQ1JFRihjdG9yX2FyZ3MpOworICAgIHJldHVybiBkaWFsZWN0OwogfQogCiAvKgpAQCAtNTI2LDMzMCArNTI2LDMzMCBAQAogc3RhdGljIGludAogcGFyc2Vfc2F2ZV9maWVsZChSZWFkZXJPYmogKnNlbGYpCiB7Ci0JUHlPYmplY3QgKmZpZWxkOworICAgIFB5T2JqZWN0ICpmaWVsZDsKIAotCWZpZWxkID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoc2VsZi0+ZmllbGQsIHNlbGYtPmZpZWxkX2xlbik7Ci0JaWYgKGZpZWxkID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQlzZWxmLT5maWVsZF9sZW4gPSAwOwotCWlmIChzZWxmLT5udW1lcmljX2ZpZWxkKSB7Ci0JCVB5T2JqZWN0ICp0bXA7CisgICAgZmllbGQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzZWxmLT5maWVsZCwgc2VsZi0+ZmllbGRfbGVuKTsKKyAgICBpZiAoZmllbGQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHNlbGYtPmZpZWxkX2xlbiA9IDA7CisgICAgaWYgKHNlbGYtPm51bWVyaWNfZmllbGQpIHsKKyAgICAgICAgUHlPYmplY3QgKnRtcDsKIAotCQlzZWxmLT5udW1lcmljX2ZpZWxkID0gMDsKLQkJdG1wID0gUHlOdW1iZXJfRmxvYXQoZmllbGQpOwotCQlpZiAodG1wID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRihmaWVsZCk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJUHlfREVDUkVGKGZpZWxkKTsKLQkJZmllbGQgPSB0bXA7Ci0JfQotCVB5TGlzdF9BcHBlbmQoc2VsZi0+ZmllbGRzLCBmaWVsZCk7Ci0JUHlfREVDUkVGKGZpZWxkKTsKLQlyZXR1cm4gMDsKKyAgICAgICAgc2VsZi0+bnVtZXJpY19maWVsZCA9IDA7CisgICAgICAgIHRtcCA9IFB5TnVtYmVyX0Zsb2F0KGZpZWxkKTsKKyAgICAgICAgaWYgKHRtcCA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoZmllbGQpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIFB5X0RFQ1JFRihmaWVsZCk7CisgICAgICAgIGZpZWxkID0gdG1wOworICAgIH0KKyAgICBQeUxpc3RfQXBwZW5kKHNlbGYtPmZpZWxkcywgZmllbGQpOworICAgIFB5X0RFQ1JFRihmaWVsZCk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIHBhcnNlX2dyb3dfYnVmZihSZWFkZXJPYmogKnNlbGYpCiB7Ci0JaWYgKHNlbGYtPmZpZWxkX3NpemUgPT0gMCkgewotCQlzZWxmLT5maWVsZF9zaXplID0gNDA5NjsKLQkJaWYgKHNlbGYtPmZpZWxkICE9IE5VTEwpCi0JCQlQeU1lbV9GcmVlKHNlbGYtPmZpZWxkKTsKLQkJc2VsZi0+ZmllbGQgPSBQeU1lbV9NYWxsb2Moc2VsZi0+ZmllbGRfc2l6ZSk7Ci0JfQotCWVsc2UgewotCQlpZiAoc2VsZi0+ZmllbGRfc2l6ZSA+IElOVF9NQVggLyAyKSB7Ci0JCQlQeUVycl9Ob01lbW9yeSgpOwotCQkJcmV0dXJuIDA7Ci0JCX0gCi0JCXNlbGYtPmZpZWxkX3NpemUgKj0gMjsKLQkJc2VsZi0+ZmllbGQgPSBQeU1lbV9SZWFsbG9jKHNlbGYtPmZpZWxkLCBzZWxmLT5maWVsZF9zaXplKTsKLQl9Ci0JaWYgKHNlbGYtPmZpZWxkID09IE5VTEwpIHsKLQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiAxOworICAgIGlmIChzZWxmLT5maWVsZF9zaXplID09IDApIHsKKyAgICAgICAgc2VsZi0+ZmllbGRfc2l6ZSA9IDQwOTY7CisgICAgICAgIGlmIChzZWxmLT5maWVsZCAhPSBOVUxMKQorICAgICAgICAgICAgUHlNZW1fRnJlZShzZWxmLT5maWVsZCk7CisgICAgICAgIHNlbGYtPmZpZWxkID0gUHlNZW1fTWFsbG9jKHNlbGYtPmZpZWxkX3NpemUpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKHNlbGYtPmZpZWxkX3NpemUgPiBJTlRfTUFYIC8gMikgeworICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIHNlbGYtPmZpZWxkX3NpemUgKj0gMjsKKyAgICAgICAgc2VsZi0+ZmllbGQgPSBQeU1lbV9SZWFsbG9jKHNlbGYtPmZpZWxkLCBzZWxmLT5maWVsZF9zaXplKTsKKyAgICB9CisgICAgaWYgKHNlbGYtPmZpZWxkID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgaW50CiBwYXJzZV9hZGRfY2hhcihSZWFkZXJPYmogKnNlbGYsIGNoYXIgYykKIHsKLQlpZiAoc2VsZi0+ZmllbGRfbGVuID49IGZpZWxkX2xpbWl0KSB7Ci0JCVB5RXJyX0Zvcm1hdChlcnJvcl9vYmosICJmaWVsZCBsYXJnZXIgdGhhbiBmaWVsZCBsaW1pdCAoJWxkKSIsCi0JCQkgICAgIGZpZWxkX2xpbWl0KTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoc2VsZi0+ZmllbGRfbGVuID09IHNlbGYtPmZpZWxkX3NpemUgJiYgIXBhcnNlX2dyb3dfYnVmZihzZWxmKSkKLQkJcmV0dXJuIC0xOwotCXNlbGYtPmZpZWxkW3NlbGYtPmZpZWxkX2xlbisrXSA9IGM7Ci0JcmV0dXJuIDA7CisgICAgaWYgKHNlbGYtPmZpZWxkX2xlbiA+PSBmaWVsZF9saW1pdCkgeworICAgICAgICBQeUVycl9Gb3JtYXQoZXJyb3Jfb2JqLCAiZmllbGQgbGFyZ2VyIHRoYW4gZmllbGQgbGltaXQgKCVsZCkiLAorICAgICAgICAgICAgICAgICAgICAgZmllbGRfbGltaXQpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChzZWxmLT5maWVsZF9sZW4gPT0gc2VsZi0+ZmllbGRfc2l6ZSAmJiAhcGFyc2VfZ3Jvd19idWZmKHNlbGYpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgc2VsZi0+ZmllbGRbc2VsZi0+ZmllbGRfbGVuKytdID0gYzsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogcGFyc2VfcHJvY2Vzc19jaGFyKFJlYWRlck9iaiAqc2VsZiwgY2hhciBjKQogewotICAgICAgICBEaWFsZWN0T2JqICpkaWFsZWN0ID0gc2VsZi0+ZGlhbGVjdDsKKyAgICBEaWFsZWN0T2JqICpkaWFsZWN0ID0gc2VsZi0+ZGlhbGVjdDsKIAotCXN3aXRjaCAoc2VsZi0+c3RhdGUpIHsKLQljYXNlIFNUQVJUX1JFQ09SRDoKLQkJLyogc3RhcnQgb2YgcmVjb3JkICovCi0JCWlmIChjID09ICdcMCcpCi0JCQkvKiBlbXB0eSBsaW5lIC0gcmV0dXJuIFtdICovCi0JCQlicmVhazsKLQkJZWxzZSBpZiAoYyA9PSAnXG4nIHx8IGMgPT0gJ1xyJykgewotCQkJc2VsZi0+c3RhdGUgPSBFQVRfQ1JOTDsKLQkJCWJyZWFrOwotCQl9Ci0JCS8qIG5vcm1hbCBjaGFyYWN0ZXIgLSBoYW5kbGUgYXMgU1RBUlRfRklFTEQgKi8KLQkJc2VsZi0+c3RhdGUgPSBTVEFSVF9GSUVMRDsKLQkJLyogZmFsbHRocnUgKi8KLQljYXNlIFNUQVJUX0ZJRUxEOgotCQkvKiBleHBlY3RpbmcgZmllbGQgKi8KLQkJaWYgKGMgPT0gJ1xuJyB8fCBjID09ICdccicgfHwgYyA9PSAnXDAnKSB7Ci0JCQkvKiBzYXZlIGVtcHR5IGZpZWxkIC0gcmV0dXJuIFtmaWVsZHNdICovCi0JCQlpZiAocGFyc2Vfc2F2ZV9maWVsZChzZWxmKSA8IDApCi0JCQkJcmV0dXJuIC0xOwotCQkJc2VsZi0+c3RhdGUgPSAoYyA9PSAnXDAnID8gU1RBUlRfUkVDT1JEIDogRUFUX0NSTkwpOwotCQl9Ci0JCWVsc2UgaWYgKGMgPT0gZGlhbGVjdC0+cXVvdGVjaGFyICYmIAotCQkJIGRpYWxlY3QtPnF1b3RpbmcgIT0gUVVPVEVfTk9ORSkgewotCQkJLyogc3RhcnQgcXVvdGVkIGZpZWxkICovCi0JCQlzZWxmLT5zdGF0ZSA9IElOX1FVT1RFRF9GSUVMRDsKLQkJfQotCQllbHNlIGlmIChjID09IGRpYWxlY3QtPmVzY2FwZWNoYXIpIHsKLQkJCS8qIHBvc3NpYmxlIGVzY2FwZWQgY2hhcmFjdGVyICovCi0JCQlzZWxmLT5zdGF0ZSA9IEVTQ0FQRURfQ0hBUjsKLQkJfQotCQllbHNlIGlmIChjID09ICcgJyAmJiBkaWFsZWN0LT5za2lwaW5pdGlhbHNwYWNlKQotCQkJLyogaWdub3JlIHNwYWNlIGF0IHN0YXJ0IG9mIGZpZWxkICovCi0JCQk7Ci0JCWVsc2UgaWYgKGMgPT0gZGlhbGVjdC0+ZGVsaW1pdGVyKSB7Ci0JCQkvKiBzYXZlIGVtcHR5IGZpZWxkICovCi0JCQlpZiAocGFyc2Vfc2F2ZV9maWVsZChzZWxmKSA8IDApCi0JCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWVsc2UgewotCQkJLyogYmVnaW4gbmV3IHVucXVvdGVkIGZpZWxkICovCi0JCQlpZiAoZGlhbGVjdC0+cXVvdGluZyA9PSBRVU9URV9OT05OVU1FUklDKQotCQkJCXNlbGYtPm51bWVyaWNfZmllbGQgPSAxOwotCQkJaWYgKHBhcnNlX2FkZF9jaGFyKHNlbGYsIGMpIDwgMCkKLQkJCQlyZXR1cm4gLTE7Ci0JCQlzZWxmLT5zdGF0ZSA9IElOX0ZJRUxEOwotCQl9Ci0JCWJyZWFrOworICAgIHN3aXRjaCAoc2VsZi0+c3RhdGUpIHsKKyAgICBjYXNlIFNUQVJUX1JFQ09SRDoKKyAgICAgICAgLyogc3RhcnQgb2YgcmVjb3JkICovCisgICAgICAgIGlmIChjID09ICdcMCcpCisgICAgICAgICAgICAvKiBlbXB0eSBsaW5lIC0gcmV0dXJuIFtdICovCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZWxzZSBpZiAoYyA9PSAnXG4nIHx8IGMgPT0gJ1xyJykgeworICAgICAgICAgICAgc2VsZi0+c3RhdGUgPSBFQVRfQ1JOTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIC8qIG5vcm1hbCBjaGFyYWN0ZXIgLSBoYW5kbGUgYXMgU1RBUlRfRklFTEQgKi8KKyAgICAgICAgc2VsZi0+c3RhdGUgPSBTVEFSVF9GSUVMRDsKKyAgICAgICAgLyogZmFsbHRocnUgKi8KKyAgICBjYXNlIFNUQVJUX0ZJRUxEOgorICAgICAgICAvKiBleHBlY3RpbmcgZmllbGQgKi8KKyAgICAgICAgaWYgKGMgPT0gJ1xuJyB8fCBjID09ICdccicgfHwgYyA9PSAnXDAnKSB7CisgICAgICAgICAgICAvKiBzYXZlIGVtcHR5IGZpZWxkIC0gcmV0dXJuIFtmaWVsZHNdICovCisgICAgICAgICAgICBpZiAocGFyc2Vfc2F2ZV9maWVsZChzZWxmKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgc2VsZi0+c3RhdGUgPSAoYyA9PSAnXDAnID8gU1RBUlRfUkVDT1JEIDogRUFUX0NSTkwpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGMgPT0gZGlhbGVjdC0+cXVvdGVjaGFyICYmCisgICAgICAgICAgICAgICAgIGRpYWxlY3QtPnF1b3RpbmcgIT0gUVVPVEVfTk9ORSkgeworICAgICAgICAgICAgLyogc3RhcnQgcXVvdGVkIGZpZWxkICovCisgICAgICAgICAgICBzZWxmLT5zdGF0ZSA9IElOX1FVT1RFRF9GSUVMRDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChjID09IGRpYWxlY3QtPmVzY2FwZWNoYXIpIHsKKyAgICAgICAgICAgIC8qIHBvc3NpYmxlIGVzY2FwZWQgY2hhcmFjdGVyICovCisgICAgICAgICAgICBzZWxmLT5zdGF0ZSA9IEVTQ0FQRURfQ0hBUjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChjID09ICcgJyAmJiBkaWFsZWN0LT5za2lwaW5pdGlhbHNwYWNlKQorICAgICAgICAgICAgLyogaWdub3JlIHNwYWNlIGF0IHN0YXJ0IG9mIGZpZWxkICovCisgICAgICAgICAgICA7CisgICAgICAgIGVsc2UgaWYgKGMgPT0gZGlhbGVjdC0+ZGVsaW1pdGVyKSB7CisgICAgICAgICAgICAvKiBzYXZlIGVtcHR5IGZpZWxkICovCisgICAgICAgICAgICBpZiAocGFyc2Vfc2F2ZV9maWVsZChzZWxmKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLyogYmVnaW4gbmV3IHVucXVvdGVkIGZpZWxkICovCisgICAgICAgICAgICBpZiAoZGlhbGVjdC0+cXVvdGluZyA9PSBRVU9URV9OT05OVU1FUklDKQorICAgICAgICAgICAgICAgIHNlbGYtPm51bWVyaWNfZmllbGQgPSAxOworICAgICAgICAgICAgaWYgKHBhcnNlX2FkZF9jaGFyKHNlbGYsIGMpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBzZWxmLT5zdGF0ZSA9IElOX0ZJRUxEOworICAgICAgICB9CisgICAgICAgIGJyZWFrOwogCi0JY2FzZSBFU0NBUEVEX0NIQVI6Ci0JCWlmIChjID09ICdcMCcpCi0JCQljID0gJ1xuJzsKLQkJaWYgKHBhcnNlX2FkZF9jaGFyKHNlbGYsIGMpIDwgMCkKLQkJCXJldHVybiAtMTsKLQkJc2VsZi0+c3RhdGUgPSBJTl9GSUVMRDsKLQkJYnJlYWs7CisgICAgY2FzZSBFU0NBUEVEX0NIQVI6CisgICAgICAgIGlmIChjID09ICdcMCcpCisgICAgICAgICAgICBjID0gJ1xuJzsKKyAgICAgICAgaWYgKHBhcnNlX2FkZF9jaGFyKHNlbGYsIGMpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgc2VsZi0+c3RhdGUgPSBJTl9GSUVMRDsKKyAgICAgICAgYnJlYWs7CiAKLQljYXNlIElOX0ZJRUxEOgotCQkvKiBpbiB1bnF1b3RlZCBmaWVsZCAqLwotCQlpZiAoYyA9PSAnXG4nIHx8IGMgPT0gJ1xyJyB8fCBjID09ICdcMCcpIHsKLQkJCS8qIGVuZCBvZiBsaW5lIC0gcmV0dXJuIFtmaWVsZHNdICovCi0JCQlpZiAocGFyc2Vfc2F2ZV9maWVsZChzZWxmKSA8IDApCi0JCQkJcmV0dXJuIC0xOwotCQkJc2VsZi0+c3RhdGUgPSAoYyA9PSAnXDAnID8gU1RBUlRfUkVDT1JEIDogRUFUX0NSTkwpOwotCQl9Ci0JCWVsc2UgaWYgKGMgPT0gZGlhbGVjdC0+ZXNjYXBlY2hhcikgewotCQkJLyogcG9zc2libGUgZXNjYXBlZCBjaGFyYWN0ZXIgKi8KLQkJCXNlbGYtPnN0YXRlID0gRVNDQVBFRF9DSEFSOwotCQl9Ci0JCWVsc2UgaWYgKGMgPT0gZGlhbGVjdC0+ZGVsaW1pdGVyKSB7Ci0JCQkvKiBzYXZlIGZpZWxkIC0gd2FpdCBmb3IgbmV3IGZpZWxkICovCi0JCQlpZiAocGFyc2Vfc2F2ZV9maWVsZChzZWxmKSA8IDApCi0JCQkJcmV0dXJuIC0xOwotCQkJc2VsZi0+c3RhdGUgPSBTVEFSVF9GSUVMRDsKLQkJfQotCQllbHNlIHsKLQkJCS8qIG5vcm1hbCBjaGFyYWN0ZXIgLSBzYXZlIGluIGZpZWxkICovCi0JCQlpZiAocGFyc2VfYWRkX2NoYXIoc2VsZiwgYykgPCAwKQotCQkJCXJldHVybiAtMTsKLQkJfQotCQlicmVhazsKKyAgICBjYXNlIElOX0ZJRUxEOgorICAgICAgICAvKiBpbiB1bnF1b3RlZCBmaWVsZCAqLworICAgICAgICBpZiAoYyA9PSAnXG4nIHx8IGMgPT0gJ1xyJyB8fCBjID09ICdcMCcpIHsKKyAgICAgICAgICAgIC8qIGVuZCBvZiBsaW5lIC0gcmV0dXJuIFtmaWVsZHNdICovCisgICAgICAgICAgICBpZiAocGFyc2Vfc2F2ZV9maWVsZChzZWxmKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgc2VsZi0+c3RhdGUgPSAoYyA9PSAnXDAnID8gU1RBUlRfUkVDT1JEIDogRUFUX0NSTkwpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGMgPT0gZGlhbGVjdC0+ZXNjYXBlY2hhcikgeworICAgICAgICAgICAgLyogcG9zc2libGUgZXNjYXBlZCBjaGFyYWN0ZXIgKi8KKyAgICAgICAgICAgIHNlbGYtPnN0YXRlID0gRVNDQVBFRF9DSEFSOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGMgPT0gZGlhbGVjdC0+ZGVsaW1pdGVyKSB7CisgICAgICAgICAgICAvKiBzYXZlIGZpZWxkIC0gd2FpdCBmb3IgbmV3IGZpZWxkICovCisgICAgICAgICAgICBpZiAocGFyc2Vfc2F2ZV9maWVsZChzZWxmKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgc2VsZi0+c3RhdGUgPSBTVEFSVF9GSUVMRDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8qIG5vcm1hbCBjaGFyYWN0ZXIgLSBzYXZlIGluIGZpZWxkICovCisgICAgICAgICAgICBpZiAocGFyc2VfYWRkX2NoYXIoc2VsZiwgYykgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKIAotCWNhc2UgSU5fUVVPVEVEX0ZJRUxEOgotCQkvKiBpbiBxdW90ZWQgZmllbGQgKi8KLQkJaWYgKGMgPT0gJ1wwJykKLQkJCTsKLQkJZWxzZSBpZiAoYyA9PSBkaWFsZWN0LT5lc2NhcGVjaGFyKSB7Ci0JCQkvKiBQb3NzaWJsZSBlc2NhcGUgY2hhcmFjdGVyICovCi0JCQlzZWxmLT5zdGF0ZSA9IEVTQ0FQRV9JTl9RVU9URURfRklFTEQ7Ci0JCX0KLQkJZWxzZSBpZiAoYyA9PSBkaWFsZWN0LT5xdW90ZWNoYXIgJiYKLQkJCSBkaWFsZWN0LT5xdW90aW5nICE9IFFVT1RFX05PTkUpIHsKLQkJCWlmIChkaWFsZWN0LT5kb3VibGVxdW90ZSkgewotCQkJCS8qIGRvdWJsZXF1b3RlOyAiIHJlcHJlc2VudGVkIGJ5ICIiICovCi0JCQkJc2VsZi0+c3RhdGUgPSBRVU9URV9JTl9RVU9URURfRklFTEQ7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvKiBlbmQgb2YgcXVvdGUgcGFydCBvZiBmaWVsZCAqLwotCQkJCXNlbGYtPnN0YXRlID0gSU5fRklFTEQ7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvKiBub3JtYWwgY2hhcmFjdGVyIC0gc2F2ZSBpbiBmaWVsZCAqLwotCQkJaWYgKHBhcnNlX2FkZF9jaGFyKHNlbGYsIGMpIDwgMCkKLQkJCQlyZXR1cm4gLTE7Ci0JCX0KLQkJYnJlYWs7CisgICAgY2FzZSBJTl9RVU9URURfRklFTEQ6CisgICAgICAgIC8qIGluIHF1b3RlZCBmaWVsZCAqLworICAgICAgICBpZiAoYyA9PSAnXDAnKQorICAgICAgICAgICAgOworICAgICAgICBlbHNlIGlmIChjID09IGRpYWxlY3QtPmVzY2FwZWNoYXIpIHsKKyAgICAgICAgICAgIC8qIFBvc3NpYmxlIGVzY2FwZSBjaGFyYWN0ZXIgKi8KKyAgICAgICAgICAgIHNlbGYtPnN0YXRlID0gRVNDQVBFX0lOX1FVT1RFRF9GSUVMRDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChjID09IGRpYWxlY3QtPnF1b3RlY2hhciAmJgorICAgICAgICAgICAgICAgICBkaWFsZWN0LT5xdW90aW5nICE9IFFVT1RFX05PTkUpIHsKKyAgICAgICAgICAgIGlmIChkaWFsZWN0LT5kb3VibGVxdW90ZSkgeworICAgICAgICAgICAgICAgIC8qIGRvdWJsZXF1b3RlOyAiIHJlcHJlc2VudGVkIGJ5ICIiICovCisgICAgICAgICAgICAgICAgc2VsZi0+c3RhdGUgPSBRVU9URV9JTl9RVU9URURfRklFTEQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBlbmQgb2YgcXVvdGUgcGFydCBvZiBmaWVsZCAqLworICAgICAgICAgICAgICAgIHNlbGYtPnN0YXRlID0gSU5fRklFTEQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvKiBub3JtYWwgY2hhcmFjdGVyIC0gc2F2ZSBpbiBmaWVsZCAqLworICAgICAgICAgICAgaWYgKHBhcnNlX2FkZF9jaGFyKHNlbGYsIGMpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CiAKLQljYXNlIEVTQ0FQRV9JTl9RVU9URURfRklFTEQ6Ci0JCWlmIChjID09ICdcMCcpCi0JCQljID0gJ1xuJzsKLQkJaWYgKHBhcnNlX2FkZF9jaGFyKHNlbGYsIGMpIDwgMCkKLQkJCXJldHVybiAtMTsKLQkJc2VsZi0+c3RhdGUgPSBJTl9RVU9URURfRklFTEQ7Ci0JCWJyZWFrOworICAgIGNhc2UgRVNDQVBFX0lOX1FVT1RFRF9GSUVMRDoKKyAgICAgICAgaWYgKGMgPT0gJ1wwJykKKyAgICAgICAgICAgIGMgPSAnXG4nOworICAgICAgICBpZiAocGFyc2VfYWRkX2NoYXIoc2VsZiwgYykgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBzZWxmLT5zdGF0ZSA9IElOX1FVT1RFRF9GSUVMRDsKKyAgICAgICAgYnJlYWs7CiAKLQljYXNlIFFVT1RFX0lOX1FVT1RFRF9GSUVMRDoKLQkJLyogZG91YmxlcXVvdGUgLSBzZWVuIGEgcXVvdGUgaW4gYW4gcXVvdGVkIGZpZWxkICovCi0JCWlmIChkaWFsZWN0LT5xdW90aW5nICE9IFFVT1RFX05PTkUgJiYgCi0gICAgICAgICAgICAgICAgICAgIGMgPT0gZGlhbGVjdC0+cXVvdGVjaGFyKSB7Ci0JCQkvKiBzYXZlICIiIGFzICIgKi8KLQkJCWlmIChwYXJzZV9hZGRfY2hhcihzZWxmLCBjKSA8IDApCi0JCQkJcmV0dXJuIC0xOwotCQkJc2VsZi0+c3RhdGUgPSBJTl9RVU9URURfRklFTEQ7Ci0JCX0KLQkJZWxzZSBpZiAoYyA9PSBkaWFsZWN0LT5kZWxpbWl0ZXIpIHsKLQkJCS8qIHNhdmUgZmllbGQgLSB3YWl0IGZvciBuZXcgZmllbGQgKi8KLQkJCWlmIChwYXJzZV9zYXZlX2ZpZWxkKHNlbGYpIDwgMCkKLQkJCQlyZXR1cm4gLTE7Ci0JCQlzZWxmLT5zdGF0ZSA9IFNUQVJUX0ZJRUxEOwotCQl9Ci0JCWVsc2UgaWYgKGMgPT0gJ1xuJyB8fCBjID09ICdccicgfHwgYyA9PSAnXDAnKSB7Ci0JCQkvKiBlbmQgb2YgbGluZSAtIHJldHVybiBbZmllbGRzXSAqLwotCQkJaWYgKHBhcnNlX3NhdmVfZmllbGQoc2VsZikgPCAwKQotCQkJCXJldHVybiAtMTsKLQkJCXNlbGYtPnN0YXRlID0gKGMgPT0gJ1wwJyA/IFNUQVJUX1JFQ09SRCA6IEVBVF9DUk5MKTsKLQkJfQotCQllbHNlIGlmICghZGlhbGVjdC0+c3RyaWN0KSB7Ci0JCQlpZiAocGFyc2VfYWRkX2NoYXIoc2VsZiwgYykgPCAwKQotCQkJCXJldHVybiAtMTsKLQkJCXNlbGYtPnN0YXRlID0gSU5fRklFTEQ7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvKiBpbGxlZ2FsICovCi0JCQlQeUVycl9Gb3JtYXQoZXJyb3Jfb2JqLCAiJyVjJyBleHBlY3RlZCBhZnRlciAnJWMnIiwgCi0JCQkJCWRpYWxlY3QtPmRlbGltaXRlciwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlhbGVjdC0+cXVvdGVjaGFyKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlicmVhazsKKyAgICBjYXNlIFFVT1RFX0lOX1FVT1RFRF9GSUVMRDoKKyAgICAgICAgLyogZG91YmxlcXVvdGUgLSBzZWVuIGEgcXVvdGUgaW4gYW4gcXVvdGVkIGZpZWxkICovCisgICAgICAgIGlmIChkaWFsZWN0LT5xdW90aW5nICE9IFFVT1RFX05PTkUgJiYKKyAgICAgICAgICAgIGMgPT0gZGlhbGVjdC0+cXVvdGVjaGFyKSB7CisgICAgICAgICAgICAvKiBzYXZlICIiIGFzICIgKi8KKyAgICAgICAgICAgIGlmIChwYXJzZV9hZGRfY2hhcihzZWxmLCBjKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgc2VsZi0+c3RhdGUgPSBJTl9RVU9URURfRklFTEQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoYyA9PSBkaWFsZWN0LT5kZWxpbWl0ZXIpIHsKKyAgICAgICAgICAgIC8qIHNhdmUgZmllbGQgLSB3YWl0IGZvciBuZXcgZmllbGQgKi8KKyAgICAgICAgICAgIGlmIChwYXJzZV9zYXZlX2ZpZWxkKHNlbGYpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBzZWxmLT5zdGF0ZSA9IFNUQVJUX0ZJRUxEOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGMgPT0gJ1xuJyB8fCBjID09ICdccicgfHwgYyA9PSAnXDAnKSB7CisgICAgICAgICAgICAvKiBlbmQgb2YgbGluZSAtIHJldHVybiBbZmllbGRzXSAqLworICAgICAgICAgICAgaWYgKHBhcnNlX3NhdmVfZmllbGQoc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIHNlbGYtPnN0YXRlID0gKGMgPT0gJ1wwJyA/IFNUQVJUX1JFQ09SRCA6IEVBVF9DUk5MKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICghZGlhbGVjdC0+c3RyaWN0KSB7CisgICAgICAgICAgICBpZiAocGFyc2VfYWRkX2NoYXIoc2VsZiwgYykgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIHNlbGYtPnN0YXRlID0gSU5fRklFTEQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvKiBpbGxlZ2FsICovCisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoZXJyb3Jfb2JqLCAiJyVjJyBleHBlY3RlZCBhZnRlciAnJWMnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWFsZWN0LT5kZWxpbWl0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlhbGVjdC0+cXVvdGVjaGFyKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKIAotCWNhc2UgRUFUX0NSTkw6Ci0JCWlmIChjID09ICdcbicgfHwgYyA9PSAnXHInKQotCQkJOwotCQllbHNlIGlmIChjID09ICdcMCcpCi0JCQlzZWxmLT5zdGF0ZSA9IFNUQVJUX1JFQ09SRDsKLQkJZWxzZSB7Ci0JCQlQeUVycl9Gb3JtYXQoZXJyb3Jfb2JqLCAibmV3LWxpbmUgY2hhcmFjdGVyIHNlZW4gaW4gdW5xdW90ZWQgZmllbGQgLSBkbyB5b3UgbmVlZCB0byBvcGVuIHRoZSBmaWxlIGluIHVuaXZlcnNhbC1uZXdsaW5lIG1vZGU/Iik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJYnJlYWs7CisgICAgY2FzZSBFQVRfQ1JOTDoKKyAgICAgICAgaWYgKGMgPT0gJ1xuJyB8fCBjID09ICdccicpCisgICAgICAgICAgICA7CisgICAgICAgIGVsc2UgaWYgKGMgPT0gJ1wwJykKKyAgICAgICAgICAgIHNlbGYtPnN0YXRlID0gU1RBUlRfUkVDT1JEOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChlcnJvcl9vYmosICJuZXctbGluZSBjaGFyYWN0ZXIgc2VlbiBpbiB1bnF1b3RlZCBmaWVsZCAtIGRvIHlvdSBuZWVkIHRvIG9wZW4gdGhlIGZpbGUgaW4gdW5pdmVyc2FsLW5ld2xpbmUgbW9kZT8iKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKIAotCX0KLQlyZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIHBhcnNlX3Jlc2V0KFJlYWRlck9iaiAqc2VsZikKIHsKLQlQeV9YREVDUkVGKHNlbGYtPmZpZWxkcyk7Ci0Jc2VsZi0+ZmllbGRzID0gUHlMaXN0X05ldygwKTsKLQlpZiAoc2VsZi0+ZmllbGRzID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQlzZWxmLT5maWVsZF9sZW4gPSAwOwotCXNlbGYtPnN0YXRlID0gU1RBUlRfUkVDT1JEOwotCXNlbGYtPm51bWVyaWNfZmllbGQgPSAwOwotCXJldHVybiAwOworICAgIFB5X1hERUNSRUYoc2VsZi0+ZmllbGRzKTsKKyAgICBzZWxmLT5maWVsZHMgPSBQeUxpc3RfTmV3KDApOworICAgIGlmIChzZWxmLT5maWVsZHMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHNlbGYtPmZpZWxkX2xlbiA9IDA7CisgICAgc2VsZi0+c3RhdGUgPSBTVEFSVF9SRUNPUkQ7CisgICAgc2VsZi0+bnVtZXJpY19maWVsZCA9IDA7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBSZWFkZXJfaXRlcm5leHQoUmVhZGVyT2JqICpzZWxmKQogewotICAgICAgICBQeU9iamVjdCAqbGluZW9iajsKLSAgICAgICAgUHlPYmplY3QgKmZpZWxkcyA9IE5VTEw7Ci0gICAgICAgIGNoYXIgKmxpbmUsIGM7Ci0JaW50IGxpbmVsZW47CisgICAgUHlPYmplY3QgKmxpbmVvYmo7CisgICAgUHlPYmplY3QgKmZpZWxkcyA9IE5VTEw7CisgICAgY2hhciAqbGluZSwgYzsKKyAgICBpbnQgbGluZWxlbjsKIAotCWlmIChwYXJzZV9yZXNldChzZWxmKSA8IDApCi0JCXJldHVybiBOVUxMOwotICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgbGluZW9iaiA9IFB5SXRlcl9OZXh0KHNlbGYtPmlucHV0X2l0ZXIpOwotICAgICAgICAgICAgICAgIGlmIChsaW5lb2JqID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVuZCBvZiBpbnB1dCBPUiBleGNlcHRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghUHlFcnJfT2NjdXJyZWQoKSAmJiBzZWxmLT5maWVsZF9sZW4gIT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KGVycm9yX29iaiwKLQkJCQkJICAgICAibmV3bGluZSBpbnNpZGUgc3RyaW5nIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0JCSsrc2VsZi0+bGluZV9udW07CisgICAgaWYgKHBhcnNlX3Jlc2V0KHNlbGYpIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZG8geworICAgICAgICBsaW5lb2JqID0gUHlJdGVyX05leHQoc2VsZi0+aW5wdXRfaXRlcik7CisgICAgICAgIGlmIChsaW5lb2JqID09IE5VTEwpIHsKKyAgICAgICAgICAgIC8qIEVuZCBvZiBpbnB1dCBPUiBleGNlcHRpb24gKi8KKyAgICAgICAgICAgIGlmICghUHlFcnJfT2NjdXJyZWQoKSAmJiBzZWxmLT5maWVsZF9sZW4gIT0gMCkKKyAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoZXJyb3Jfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmV3bGluZSBpbnNpZGUgc3RyaW5nIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICArK3NlbGYtPmxpbmVfbnVtOwogCi0gICAgICAgICAgICAgICAgbGluZSA9IFB5U3RyaW5nX0FzU3RyaW5nKGxpbmVvYmopOwotCQlsaW5lbGVuID0gUHlTdHJpbmdfU2l6ZShsaW5lb2JqKTsKKyAgICAgICAgbGluZSA9IFB5U3RyaW5nX0FzU3RyaW5nKGxpbmVvYmopOworICAgICAgICBsaW5lbGVuID0gUHlTdHJpbmdfU2l6ZShsaW5lb2JqKTsKIAotICAgICAgICAgICAgICAgIGlmIChsaW5lID09IE5VTEwgfHwgbGluZWxlbiA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihsaW5lb2JqKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB3aGlsZSAobGluZWxlbi0tKSB7Ci0JCQljID0gKmxpbmUrKzsKLQkJCWlmIChjID09ICdcMCcpIHsKLQkJCQlQeV9ERUNSRUYobGluZW9iaik7Ci0JCQkJUHlFcnJfRm9ybWF0KGVycm9yX29iaiwKLQkJCQkJICAgICAibGluZSBjb250YWlucyBOVUxMIGJ5dGUiKTsKLQkJCQlnb3RvIGVycjsKLQkJCX0KLQkJCWlmIChwYXJzZV9wcm9jZXNzX2NoYXIoc2VsZiwgYykgPCAwKSB7Ci0JCQkJUHlfREVDUkVGKGxpbmVvYmopOwotCQkJCWdvdG8gZXJyOwotCQkJfQotCQl9CisgICAgICAgIGlmIChsaW5lID09IE5VTEwgfHwgbGluZWxlbiA8IDApIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihsaW5lb2JqKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHdoaWxlIChsaW5lbGVuLS0pIHsKKyAgICAgICAgICAgIGMgPSAqbGluZSsrOworICAgICAgICAgICAgaWYgKGMgPT0gJ1wwJykgewogICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihsaW5lb2JqKTsKLQkJaWYgKHBhcnNlX3Byb2Nlc3NfY2hhcihzZWxmLCAwKSA8IDApCi0JCQlnb3RvIGVycjsKLSAgICAgICAgfSB3aGlsZSAoc2VsZi0+c3RhdGUgIT0gU1RBUlRfUkVDT1JEKTsKKyAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoZXJyb3Jfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGluZSBjb250YWlucyBOVUxMIGJ5dGUiKTsKKyAgICAgICAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwYXJzZV9wcm9jZXNzX2NoYXIoc2VsZiwgYykgPCAwKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGxpbmVvYmopOworICAgICAgICAgICAgICAgIGdvdG8gZXJyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFB5X0RFQ1JFRihsaW5lb2JqKTsKKyAgICAgICAgaWYgKHBhcnNlX3Byb2Nlc3NfY2hhcihzZWxmLCAwKSA8IDApCisgICAgICAgICAgICBnb3RvIGVycjsKKyAgICB9IHdoaWxlIChzZWxmLT5zdGF0ZSAhPSBTVEFSVF9SRUNPUkQpOwogCi0gICAgICAgIGZpZWxkcyA9IHNlbGYtPmZpZWxkczsKLSAgICAgICAgc2VsZi0+ZmllbGRzID0gTlVMTDsKKyAgICBmaWVsZHMgPSBzZWxmLT5maWVsZHM7CisgICAgc2VsZi0+ZmllbGRzID0gTlVMTDsKIGVycjoKLSAgICAgICAgcmV0dXJuIGZpZWxkczsKKyAgICByZXR1cm4gZmllbGRzOwogfQogCiBzdGF0aWMgdm9pZAogUmVhZGVyX2RlYWxsb2MoUmVhZGVyT2JqICpzZWxmKQogewotCVB5T2JqZWN0X0dDX1VuVHJhY2soc2VsZik7Ci0gICAgICAgIFB5X1hERUNSRUYoc2VsZi0+ZGlhbGVjdCk7Ci0gICAgICAgIFB5X1hERUNSRUYoc2VsZi0+aW5wdXRfaXRlcik7Ci0gICAgICAgIFB5X1hERUNSRUYoc2VsZi0+ZmllbGRzKTsKLSAgICAgICAgaWYgKHNlbGYtPmZpZWxkICE9IE5VTEwpCi0gICAgICAgIAlQeU1lbV9GcmVlKHNlbGYtPmZpZWxkKTsKLQlQeU9iamVjdF9HQ19EZWwoc2VsZik7CisgICAgUHlPYmplY3RfR0NfVW5UcmFjayhzZWxmKTsKKyAgICBQeV9YREVDUkVGKHNlbGYtPmRpYWxlY3QpOworICAgIFB5X1hERUNSRUYoc2VsZi0+aW5wdXRfaXRlcik7CisgICAgUHlfWERFQ1JFRihzZWxmLT5maWVsZHMpOworICAgIGlmIChzZWxmLT5maWVsZCAhPSBOVUxMKQorICAgICAgICBQeU1lbV9GcmVlKHNlbGYtPmZpZWxkKTsKKyAgICBQeU9iamVjdF9HQ19EZWwoc2VsZik7CiB9CiAKIHN0YXRpYyBpbnQKIFJlYWRlcl90cmF2ZXJzZShSZWFkZXJPYmogKnNlbGYsIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotCVB5X1ZJU0lUKHNlbGYtPmRpYWxlY3QpOwotCVB5X1ZJU0lUKHNlbGYtPmlucHV0X2l0ZXIpOwotCVB5X1ZJU0lUKHNlbGYtPmZpZWxkcyk7Ci0JcmV0dXJuIDA7CisgICAgUHlfVklTSVQoc2VsZi0+ZGlhbGVjdCk7CisgICAgUHlfVklTSVQoc2VsZi0+aW5wdXRfaXRlcik7CisgICAgUHlfVklTSVQoc2VsZi0+ZmllbGRzKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogUmVhZGVyX2NsZWFyKFJlYWRlck9iaiAqc2VsZikKIHsKLQlQeV9DTEVBUihzZWxmLT5kaWFsZWN0KTsKLQlQeV9DTEVBUihzZWxmLT5pbnB1dF9pdGVyKTsKLQlQeV9DTEVBUihzZWxmLT5maWVsZHMpOwotCXJldHVybiAwOworICAgIFB5X0NMRUFSKHNlbGYtPmRpYWxlY3QpOworICAgIFB5X0NMRUFSKHNlbGYtPmlucHV0X2l0ZXIpOworICAgIFB5X0NMRUFSKHNlbGYtPmZpZWxkcyk7CisgICAgcmV0dXJuIDA7CiB9CiAKIFB5RG9jX1NUUlZBUihSZWFkZXJfVHlwZV9kb2MsCkBAIC04NjAsOTMgKzg2MCw5MyBAQAogKTsKIAogc3RhdGljIHN0cnVjdCBQeU1ldGhvZERlZiBSZWFkZXJfbWV0aG9kc1tdID0gewotCXsgTlVMTCwgTlVMTCB9CisgICAgeyBOVUxMLCBOVUxMIH0KIH07CiAjZGVmaW5lIFJfT0ZGKHgpIG9mZnNldG9mKFJlYWRlck9iaiwgeCkKIAogc3RhdGljIHN0cnVjdCBQeU1lbWJlckRlZiBSZWFkZXJfbWVtYmVybGlzdFtdID0gewotCXsgImRpYWxlY3QiLCBUX09CSkVDVCwgUl9PRkYoZGlhbGVjdCksIFJPIH0sCi0JeyAibGluZV9udW0iLCBUX1VMT05HLCBSX09GRihsaW5lX251bSksIFJPIH0sCi0JeyBOVUxMIH0KKyAgICB7ICJkaWFsZWN0IiwgVF9PQkpFQ1QsIFJfT0ZGKGRpYWxlY3QpLCBSTyB9LAorICAgIHsgImxpbmVfbnVtIiwgVF9VTE9ORywgUl9PRkYobGluZV9udW0pLCBSTyB9LAorICAgIHsgTlVMTCB9CiB9OwogCiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgUmVhZGVyX1R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JIl9jc3YucmVhZGVyIiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfbmFtZSovCi0Jc2l6ZW9mKFJlYWRlck9iaiksICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYmFzaWNzaXplKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKVJlYWRlcl9kZWFsbG9jLCAgICAgICAgICAgICAvKnRwX2RlYWxsb2MqLwotCShwcmludGZ1bmMpMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9yZXByKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19udW1iZXIqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX3NlcXVlbmNlKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19tYXBwaW5nKi8KLQkoaGFzaGZ1bmMpMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9oYXNoKi8KLQkodGVybmFyeWZ1bmMpMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jYWxsKi8KLQkocmVwcmZ1bmMpMCwgICAgICAgICAgICAgICAgICAgIAkvKnRwX3N0ciovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0YXR0cm8qLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRybyovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX2J1ZmZlciovCi0gICAgICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfQkFTRVRZUEUgfAotCQlQeV9UUEZMQUdTX0hBVkVfR0MsCQkvKnRwX2ZsYWdzKi8KLQlSZWFkZXJfVHlwZV9kb2MsICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kb2MqLwotICAgICAgICAodHJhdmVyc2Vwcm9jKVJlYWRlcl90cmF2ZXJzZSwgICAgICAgICAgLyp0cF90cmF2ZXJzZSovCi0gICAgICAgIChpbnF1aXJ5KVJlYWRlcl9jbGVhciwgICAgICAgICAgICAgICAgICAvKnRwX2NsZWFyKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmljaGNvbXBhcmUqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF93ZWFrbGlzdG9mZnNldCovCi0gICAgICAgIFB5T2JqZWN0X1NlbGZJdGVyLAkJICAgICAgICAvKnRwX2l0ZXIqLwotICAgICAgICAoZ2V0aXRlcmZ1bmMpUmVhZGVyX2l0ZXJuZXh0LCAgICAgICAgICAgLyp0cF9pdGVybmV4dCovCi0gICAgICAgIFJlYWRlcl9tZXRob2RzLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX21ldGhvZHMqLwotICAgICAgICBSZWFkZXJfbWVtYmVybGlzdCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9tZW1iZXJzKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0c2V0Ki8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAiX2Nzdi5yZWFkZXIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoUmVhZGVyT2JqKSwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9iYXNpY3NpemUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpUmVhZGVyX2RlYWxsb2MsICAgICAgICAgICAgIC8qdHBfZGVhbGxvYyovCisgICAgKHByaW50ZnVuYykwLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYykwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHIqLworICAgIChzZXRhdHRyZnVuYykwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHIqLworICAgIChjbXBmdW5jKTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NvbXBhcmUqLworICAgIChyZXByZnVuYykwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3JlcHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX251bWJlciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfc2VxdWVuY2UqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX21hcHBpbmcqLworICAgIChoYXNoZnVuYykwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2hhc2gqLworICAgICh0ZXJuYXJ5ZnVuYykwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NhbGwqLworICAgIChyZXByZnVuYykwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zdHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHJvKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRybyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFIHwKKyAgICAgICAgUHlfVFBGTEFHU19IQVZFX0dDLCAgICAgICAgICAgICAgICAgICAgIC8qdHBfZmxhZ3MqLworICAgIFJlYWRlcl9UeXBlX2RvYywgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2RvYyovCisgICAgKHRyYXZlcnNlcHJvYylSZWFkZXJfdHJhdmVyc2UsICAgICAgICAgIC8qdHBfdHJhdmVyc2UqLworICAgIChpbnF1aXJ5KVJlYWRlcl9jbGVhciwgICAgICAgICAgICAgICAgICAvKnRwX2NsZWFyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIFB5T2JqZWN0X1NlbGZJdGVyLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVyKi8KKyAgICAoZ2V0aXRlcmZ1bmMpUmVhZGVyX2l0ZXJuZXh0LCAgICAgICAgICAgLyp0cF9pdGVybmV4dCovCisgICAgUmVhZGVyX21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfbWV0aG9kcyovCisgICAgUmVhZGVyX21lbWJlcmxpc3QsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfbWVtYmVycyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0c2V0Ki8KIAogfTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIGNzdl9yZWFkZXIoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprZXl3b3JkX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKiBpdGVyYXRvciwgKiBkaWFsZWN0ID0gTlVMTDsKLSAgICAgICAgUmVhZGVyT2JqICogc2VsZiA9IFB5T2JqZWN0X0dDX05ldyhSZWFkZXJPYmosICZSZWFkZXJfVHlwZSk7CisgICAgUHlPYmplY3QgKiBpdGVyYXRvciwgKiBkaWFsZWN0ID0gTlVMTDsKKyAgICBSZWFkZXJPYmogKiBzZWxmID0gUHlPYmplY3RfR0NfTmV3KFJlYWRlck9iaiwgJlJlYWRlcl9UeXBlKTsKIAotICAgICAgICBpZiAoIXNlbGYpCi0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFzZWxmKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotICAgICAgICBzZWxmLT5kaWFsZWN0ID0gTlVMTDsKLSAgICAgICAgc2VsZi0+ZmllbGRzID0gTlVMTDsKLSAgICAgICAgc2VsZi0+aW5wdXRfaXRlciA9IE5VTEw7Ci0Jc2VsZi0+ZmllbGQgPSBOVUxMOwotCXNlbGYtPmZpZWxkX3NpemUgPSAwOwotCXNlbGYtPmxpbmVfbnVtID0gMDsKKyAgICBzZWxmLT5kaWFsZWN0ID0gTlVMTDsKKyAgICBzZWxmLT5maWVsZHMgPSBOVUxMOworICAgIHNlbGYtPmlucHV0X2l0ZXIgPSBOVUxMOworICAgIHNlbGYtPmZpZWxkID0gTlVMTDsKKyAgICBzZWxmLT5maWVsZF9zaXplID0gMDsKKyAgICBzZWxmLT5saW5lX251bSA9IDA7CiAKLQlpZiAocGFyc2VfcmVzZXQoc2VsZikgPCAwKSB7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKHNlbGYpOwotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotCX0KKyAgICBpZiAocGFyc2VfcmVzZXQoc2VsZikgPCAwKSB7CisgICAgICAgIFB5X0RFQ1JFRihzZWxmKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiIiwgMSwgMiwgJml0ZXJhdG9yLCAmZGlhbGVjdCkpIHsKLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYoc2VsZik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgc2VsZi0+aW5wdXRfaXRlciA9IFB5T2JqZWN0X0dldEl0ZXIoaXRlcmF0b3IpOwotICAgICAgICBpZiAoc2VsZi0+aW5wdXRfaXRlciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhcmd1bWVudCAxIG11c3QgYmUgYW4gaXRlcmF0b3IiKTsKLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYoc2VsZik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLQlzZWxmLT5kaWFsZWN0ID0gKERpYWxlY3RPYmogKilfY2FsbF9kaWFsZWN0KGRpYWxlY3QsIGtleXdvcmRfYXJncyk7Ci0gICAgICAgIGlmIChzZWxmLT5kaWFsZWN0ID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYoc2VsZik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICIiLCAxLCAyLCAmaXRlcmF0b3IsICZkaWFsZWN0KSkgeworICAgICAgICBQeV9ERUNSRUYoc2VsZik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBzZWxmLT5pbnB1dF9pdGVyID0gUHlPYmplY3RfR2V0SXRlcihpdGVyYXRvcik7CisgICAgaWYgKHNlbGYtPmlucHV0X2l0ZXIgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImFyZ3VtZW50IDEgbXVzdCBiZSBhbiBpdGVyYXRvciIpOworICAgICAgICBQeV9ERUNSRUYoc2VsZik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBzZWxmLT5kaWFsZWN0ID0gKERpYWxlY3RPYmogKilfY2FsbF9kaWFsZWN0KGRpYWxlY3QsIGtleXdvcmRfYXJncyk7CisgICAgaWYgKHNlbGYtPmRpYWxlY3QgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYoc2VsZik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCVB5T2JqZWN0X0dDX1RyYWNrKHNlbGYpOwotICAgICAgICByZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKKyAgICBQeU9iamVjdF9HQ19UcmFjayhzZWxmKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKIH0KIAogLyoKQEAgLTk1Niw4ICs5NTYsOCBAQAogc3RhdGljIHZvaWQKIGpvaW5fcmVzZXQoV3JpdGVyT2JqICpzZWxmKQogewotCXNlbGYtPnJlY19sZW4gPSAwOwotCXNlbGYtPm51bV9maWVsZHMgPSAwOworICAgIHNlbGYtPnJlY19sZW4gPSAwOworICAgIHNlbGYtPm51bV9maWVsZHMgPSAwOwogfQogCiAjZGVmaW5lIE1FTV9JTkNSIDMyNzY4CkBAIC05NjcsOTAgKzk2Nyw5MCBAQAogICovCiBzdGF0aWMgaW50CiBqb2luX2FwcGVuZF9kYXRhKFdyaXRlck9iaiAqc2VsZiwgY2hhciAqZmllbGQsIGludCBxdW90ZV9lbXB0eSwKLQkJIGludCAqcXVvdGVkLCBpbnQgY29weV9waGFzZSkKKyAgICAgICAgICAgICAgICAgaW50ICpxdW90ZWQsIGludCBjb3B5X3BoYXNlKQogewotICAgICAgICBEaWFsZWN0T2JqICpkaWFsZWN0ID0gc2VsZi0+ZGlhbGVjdDsKLQlpbnQgaSwgcmVjX2xlbjsKLQljaGFyICpsaW5ldGVybTsKKyAgICBEaWFsZWN0T2JqICpkaWFsZWN0ID0gc2VsZi0+ZGlhbGVjdDsKKyAgICBpbnQgaSwgcmVjX2xlbjsKKyAgICBjaGFyICpsaW5ldGVybTsKIAogI2RlZmluZSBBRERDSChjKSBcCi0JZG8ge1wKLQkJaWYgKGNvcHlfcGhhc2UpIFwKLQkJCXNlbGYtPnJlY1tyZWNfbGVuXSA9IGM7XAotCQlyZWNfbGVuKys7XAotCX0gd2hpbGUoMCkKKyAgICBkbyB7XAorICAgICAgICBpZiAoY29weV9waGFzZSkgXAorICAgICAgICAgICAgc2VsZi0+cmVjW3JlY19sZW5dID0gYztcCisgICAgICAgIHJlY19sZW4rKztcCisgICAgfSB3aGlsZSgwKQogCi0JbGluZXRlcm0gPSBQeVN0cmluZ19Bc1N0cmluZyhkaWFsZWN0LT5saW5ldGVybWluYXRvcik7Ci0JaWYgKGxpbmV0ZXJtID09IE5VTEwpCi0JCXJldHVybiAtMTsKKyAgICBsaW5ldGVybSA9IFB5U3RyaW5nX0FzU3RyaW5nKGRpYWxlY3QtPmxpbmV0ZXJtaW5hdG9yKTsKKyAgICBpZiAobGluZXRlcm0gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0JcmVjX2xlbiA9IHNlbGYtPnJlY19sZW47CisgICAgcmVjX2xlbiA9IHNlbGYtPnJlY19sZW47CiAKLQkvKiBJZiB0aGlzIGlzIG5vdCB0aGUgZmlyc3QgZmllbGQgd2UgbmVlZCBhIGZpZWxkIHNlcGFyYXRvciAqLwotCWlmIChzZWxmLT5udW1fZmllbGRzID4gMCkKLQkJQUREQ0goZGlhbGVjdC0+ZGVsaW1pdGVyKTsKKyAgICAvKiBJZiB0aGlzIGlzIG5vdCB0aGUgZmlyc3QgZmllbGQgd2UgbmVlZCBhIGZpZWxkIHNlcGFyYXRvciAqLworICAgIGlmIChzZWxmLT5udW1fZmllbGRzID4gMCkKKyAgICAgICAgQUREQ0goZGlhbGVjdC0+ZGVsaW1pdGVyKTsKIAotCS8qIEhhbmRsZSBwcmVjZWRpbmcgcXVvdGUgKi8KLQlpZiAoY29weV9waGFzZSAmJiAqcXVvdGVkKQotCQlBRERDSChkaWFsZWN0LT5xdW90ZWNoYXIpOworICAgIC8qIEhhbmRsZSBwcmVjZWRpbmcgcXVvdGUgKi8KKyAgICBpZiAoY29weV9waGFzZSAmJiAqcXVvdGVkKQorICAgICAgICBBRERDSChkaWFsZWN0LT5xdW90ZWNoYXIpOwogCi0JLyogQ29weS9jb3VudCBmaWVsZCBkYXRhICovCi0JZm9yIChpID0gMDs7IGkrKykgewotCQljaGFyIGMgPSBmaWVsZFtpXTsKLQkJaW50IHdhbnRfZXNjYXBlID0gMDsKKyAgICAvKiBDb3B5L2NvdW50IGZpZWxkIGRhdGEgKi8KKyAgICBmb3IgKGkgPSAwOzsgaSsrKSB7CisgICAgICAgIGNoYXIgYyA9IGZpZWxkW2ldOworICAgICAgICBpbnQgd2FudF9lc2NhcGUgPSAwOwogCi0JCWlmIChjID09ICdcMCcpCi0JCQlicmVhazsKKyAgICAgICAgaWYgKGMgPT0gJ1wwJykKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWlmIChjID09IGRpYWxlY3QtPmRlbGltaXRlciB8fAotCQkgICAgYyA9PSBkaWFsZWN0LT5lc2NhcGVjaGFyIHx8Ci0JCSAgICBjID09IGRpYWxlY3QtPnF1b3RlY2hhciB8fAotCQkgICAgc3RyY2hyKGxpbmV0ZXJtLCBjKSkgewotCQkJaWYgKGRpYWxlY3QtPnF1b3RpbmcgPT0gUVVPVEVfTk9ORSkKLQkJCQl3YW50X2VzY2FwZSA9IDE7Ci0JCQllbHNlIHsKLQkJCQlpZiAoYyA9PSBkaWFsZWN0LT5xdW90ZWNoYXIpIHsKLQkJCQkJaWYgKGRpYWxlY3QtPmRvdWJsZXF1b3RlKQotCQkJCQkJQUREQ0goZGlhbGVjdC0+cXVvdGVjaGFyKTsKLQkJCQkJZWxzZQotCQkJCQkJd2FudF9lc2NhcGUgPSAxOwotCQkJCX0KLQkJCQlpZiAoIXdhbnRfZXNjYXBlKQotCQkJCQkqcXVvdGVkID0gMTsKLQkJCX0KLQkJCWlmICh3YW50X2VzY2FwZSkgewotCQkJCWlmICghZGlhbGVjdC0+ZXNjYXBlY2hhcikgewotCQkJCQlQeUVycl9Gb3JtYXQoZXJyb3Jfb2JqLCAKLQkJCQkJCSAgICAgIm5lZWQgdG8gZXNjYXBlLCBidXQgbm8gZXNjYXBlY2hhciBzZXQiKTsKLQkJCQkJcmV0dXJuIC0xOwotCQkJCX0KLQkJCQlBRERDSChkaWFsZWN0LT5lc2NhcGVjaGFyKTsKLQkJCX0KLQkJfQotCQkvKiBDb3B5IGZpZWxkIGNoYXJhY3RlciBpbnRvIHJlY29yZCBidWZmZXIuCi0JCSAqLwotCQlBRERDSChjKTsKLQl9CisgICAgICAgIGlmIChjID09IGRpYWxlY3QtPmRlbGltaXRlciB8fAorICAgICAgICAgICAgYyA9PSBkaWFsZWN0LT5lc2NhcGVjaGFyIHx8CisgICAgICAgICAgICBjID09IGRpYWxlY3QtPnF1b3RlY2hhciB8fAorICAgICAgICAgICAgc3RyY2hyKGxpbmV0ZXJtLCBjKSkgeworICAgICAgICAgICAgaWYgKGRpYWxlY3QtPnF1b3RpbmcgPT0gUVVPVEVfTk9ORSkKKyAgICAgICAgICAgICAgICB3YW50X2VzY2FwZSA9IDE7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoYyA9PSBkaWFsZWN0LT5xdW90ZWNoYXIpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRpYWxlY3QtPmRvdWJsZXF1b3RlKQorICAgICAgICAgICAgICAgICAgICAgICAgQUREQ0goZGlhbGVjdC0+cXVvdGVjaGFyKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgd2FudF9lc2NhcGUgPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIXdhbnRfZXNjYXBlKQorICAgICAgICAgICAgICAgICAgICAqcXVvdGVkID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh3YW50X2VzY2FwZSkgeworICAgICAgICAgICAgICAgIGlmICghZGlhbGVjdC0+ZXNjYXBlY2hhcikgeworICAgICAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoZXJyb3Jfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5lZWQgdG8gZXNjYXBlLCBidXQgbm8gZXNjYXBlY2hhciBzZXQiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBBRERDSChkaWFsZWN0LT5lc2NhcGVjaGFyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiBDb3B5IGZpZWxkIGNoYXJhY3RlciBpbnRvIHJlY29yZCBidWZmZXIuCisgICAgICAgICAqLworICAgICAgICBBRERDSChjKTsKKyAgICB9CiAKLQkvKiBJZiBmaWVsZCBpcyBlbXB0eSBjaGVjayBpZiBpdCBuZWVkcyB0byBiZSBxdW90ZWQuCi0JICovCi0JaWYgKGkgPT0gMCAmJiBxdW90ZV9lbXB0eSkgewotCQlpZiAoZGlhbGVjdC0+cXVvdGluZyA9PSBRVU9URV9OT05FKSB7Ci0JCQlQeUVycl9Gb3JtYXQoZXJyb3Jfb2JqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzaW5nbGUgZW1wdHkgZmllbGQgcmVjb3JkIG11c3QgYmUgcXVvdGVkIik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJZWxzZQotCQkJKnF1b3RlZCA9IDE7Ci0JfQorICAgIC8qIElmIGZpZWxkIGlzIGVtcHR5IGNoZWNrIGlmIGl0IG5lZWRzIHRvIGJlIHF1b3RlZC4KKyAgICAgKi8KKyAgICBpZiAoaSA9PSAwICYmIHF1b3RlX2VtcHR5KSB7CisgICAgICAgIGlmIChkaWFsZWN0LT5xdW90aW5nID09IFFVT1RFX05PTkUpIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChlcnJvcl9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgInNpbmdsZSBlbXB0eSBmaWVsZCByZWNvcmQgbXVzdCBiZSBxdW90ZWQiKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICAqcXVvdGVkID0gMTsKKyAgICB9CiAKLQlpZiAoKnF1b3RlZCkgewotCQlpZiAoY29weV9waGFzZSkKLQkJCUFERENIKGRpYWxlY3QtPnF1b3RlY2hhcik7Ci0JCWVsc2UKLQkJCXJlY19sZW4gKz0gMjsKLQl9Ci0JcmV0dXJuIHJlY19sZW47CisgICAgaWYgKCpxdW90ZWQpIHsKKyAgICAgICAgaWYgKGNvcHlfcGhhc2UpCisgICAgICAgICAgICBBRERDSChkaWFsZWN0LT5xdW90ZWNoYXIpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZWNfbGVuICs9IDI7CisgICAgfQorICAgIHJldHVybiByZWNfbGVuOwogI3VuZGVmIEFERENICiB9CiAKQEAgLTEwNTgsNzQgKzEwNTgsNzQgQEAKIGpvaW5fY2hlY2tfcmVjX3NpemUoV3JpdGVyT2JqICpzZWxmLCBpbnQgcmVjX2xlbikKIHsKIAotCWlmIChyZWNfbGVuIDwgMCB8fCByZWNfbGVuID4gSU5UX01BWCAtIE1FTV9JTkNSKSB7Ci0JCVB5RXJyX05vTWVtb3J5KCk7Ci0JCXJldHVybiAwOwotCX0KKyAgICBpZiAocmVjX2xlbiA8IDAgfHwgcmVjX2xlbiA+IElOVF9NQVggLSBNRU1fSU5DUikgeworICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLQlpZiAocmVjX2xlbiA+IHNlbGYtPnJlY19zaXplKSB7Ci0JCWlmIChzZWxmLT5yZWNfc2l6ZSA9PSAwKSB7Ci0JCQlzZWxmLT5yZWNfc2l6ZSA9IChyZWNfbGVuIC8gTUVNX0lOQ1IgKyAxKSAqIE1FTV9JTkNSOwotCQkJaWYgKHNlbGYtPnJlYyAhPSBOVUxMKQotCQkJCVB5TWVtX0ZyZWUoc2VsZi0+cmVjKTsKLQkJCXNlbGYtPnJlYyA9IFB5TWVtX01hbGxvYyhzZWxmLT5yZWNfc2l6ZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQljaGFyICpvbGRfcmVjID0gc2VsZi0+cmVjOworICAgIGlmIChyZWNfbGVuID4gc2VsZi0+cmVjX3NpemUpIHsKKyAgICAgICAgaWYgKHNlbGYtPnJlY19zaXplID09IDApIHsKKyAgICAgICAgICAgIHNlbGYtPnJlY19zaXplID0gKHJlY19sZW4gLyBNRU1fSU5DUiArIDEpICogTUVNX0lOQ1I7CisgICAgICAgICAgICBpZiAoc2VsZi0+cmVjICE9IE5VTEwpCisgICAgICAgICAgICAgICAgUHlNZW1fRnJlZShzZWxmLT5yZWMpOworICAgICAgICAgICAgc2VsZi0+cmVjID0gUHlNZW1fTWFsbG9jKHNlbGYtPnJlY19zaXplKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGNoYXIgKm9sZF9yZWMgPSBzZWxmLT5yZWM7CiAKLQkJCXNlbGYtPnJlY19zaXplID0gKHJlY19sZW4gLyBNRU1fSU5DUiArIDEpICogTUVNX0lOQ1I7Ci0JCQlzZWxmLT5yZWMgPSBQeU1lbV9SZWFsbG9jKHNlbGYtPnJlYywgc2VsZi0+cmVjX3NpemUpOwotCQkJaWYgKHNlbGYtPnJlYyA9PSBOVUxMKQotCQkJCVB5TWVtX0ZyZWUob2xkX3JlYyk7Ci0JCX0KLQkJaWYgKHNlbGYtPnJlYyA9PSBOVUxMKSB7Ci0JCQlQeUVycl9Ob01lbW9yeSgpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0JcmV0dXJuIDE7CisgICAgICAgICAgICBzZWxmLT5yZWNfc2l6ZSA9IChyZWNfbGVuIC8gTUVNX0lOQ1IgKyAxKSAqIE1FTV9JTkNSOworICAgICAgICAgICAgc2VsZi0+cmVjID0gUHlNZW1fUmVhbGxvYyhzZWxmLT5yZWMsIHNlbGYtPnJlY19zaXplKTsKKyAgICAgICAgICAgIGlmIChzZWxmLT5yZWMgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBQeU1lbV9GcmVlKG9sZF9yZWMpOworICAgICAgICB9CisgICAgICAgIGlmIChzZWxmLT5yZWMgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgaW50CiBqb2luX2FwcGVuZChXcml0ZXJPYmogKnNlbGYsIGNoYXIgKmZpZWxkLCBpbnQgKnF1b3RlZCwgaW50IHF1b3RlX2VtcHR5KQogewotCWludCByZWNfbGVuOworICAgIGludCByZWNfbGVuOwogCi0JcmVjX2xlbiA9IGpvaW5fYXBwZW5kX2RhdGEoc2VsZiwgZmllbGQsIHF1b3RlX2VtcHR5LCBxdW90ZWQsIDApOwotCWlmIChyZWNfbGVuIDwgMCkKLQkJcmV0dXJuIDA7CisgICAgcmVjX2xlbiA9IGpvaW5fYXBwZW5kX2RhdGEoc2VsZiwgZmllbGQsIHF1b3RlX2VtcHR5LCBxdW90ZWQsIDApOworICAgIGlmIChyZWNfbGVuIDwgMCkKKyAgICAgICAgcmV0dXJuIDA7CiAKLQkvKiBncm93IHJlY29yZCBidWZmZXIgaWYgbmVjZXNzYXJ5ICovCi0JaWYgKCFqb2luX2NoZWNrX3JlY19zaXplKHNlbGYsIHJlY19sZW4pKQotCQlyZXR1cm4gMDsKKyAgICAvKiBncm93IHJlY29yZCBidWZmZXIgaWYgbmVjZXNzYXJ5ICovCisgICAgaWYgKCFqb2luX2NoZWNrX3JlY19zaXplKHNlbGYsIHJlY19sZW4pKQorICAgICAgICByZXR1cm4gMDsKIAotCXNlbGYtPnJlY19sZW4gPSBqb2luX2FwcGVuZF9kYXRhKHNlbGYsIGZpZWxkLCBxdW90ZV9lbXB0eSwgcXVvdGVkLCAxKTsKLQlzZWxmLT5udW1fZmllbGRzKys7CisgICAgc2VsZi0+cmVjX2xlbiA9IGpvaW5fYXBwZW5kX2RhdGEoc2VsZiwgZmllbGQsIHF1b3RlX2VtcHR5LCBxdW90ZWQsIDEpOworICAgIHNlbGYtPm51bV9maWVsZHMrKzsKIAotCXJldHVybiAxOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgaW50CiBqb2luX2FwcGVuZF9saW5ldGVybWluYXRvcihXcml0ZXJPYmogKnNlbGYpCiB7Ci0JaW50IHRlcm1pbmF0b3JfbGVuOwotCWNoYXIgKnRlcm1pbmF0b3I7CisgICAgaW50IHRlcm1pbmF0b3JfbGVuOworICAgIGNoYXIgKnRlcm1pbmF0b3I7CiAKLQl0ZXJtaW5hdG9yX2xlbiA9IFB5U3RyaW5nX1NpemUoc2VsZi0+ZGlhbGVjdC0+bGluZXRlcm1pbmF0b3IpOwotCWlmICh0ZXJtaW5hdG9yX2xlbiA9PSAtMSkKLQkJcmV0dXJuIDA7CisgICAgdGVybWluYXRvcl9sZW4gPSBQeVN0cmluZ19TaXplKHNlbGYtPmRpYWxlY3QtPmxpbmV0ZXJtaW5hdG9yKTsKKyAgICBpZiAodGVybWluYXRvcl9sZW4gPT0gLTEpCisgICAgICAgIHJldHVybiAwOwogCi0JLyogZ3JvdyByZWNvcmQgYnVmZmVyIGlmIG5lY2Vzc2FyeSAqLwotCWlmICgham9pbl9jaGVja19yZWNfc2l6ZShzZWxmLCBzZWxmLT5yZWNfbGVuICsgdGVybWluYXRvcl9sZW4pKQotCQlyZXR1cm4gMDsKKyAgICAvKiBncm93IHJlY29yZCBidWZmZXIgaWYgbmVjZXNzYXJ5ICovCisgICAgaWYgKCFqb2luX2NoZWNrX3JlY19zaXplKHNlbGYsIHNlbGYtPnJlY19sZW4gKyB0ZXJtaW5hdG9yX2xlbikpCisgICAgICAgIHJldHVybiAwOwogCi0JdGVybWluYXRvciA9IFB5U3RyaW5nX0FzU3RyaW5nKHNlbGYtPmRpYWxlY3QtPmxpbmV0ZXJtaW5hdG9yKTsgCi0JaWYgKHRlcm1pbmF0b3IgPT0gTlVMTCkKLQkJcmV0dXJuIDA7Ci0JbWVtbW92ZShzZWxmLT5yZWMgKyBzZWxmLT5yZWNfbGVuLCB0ZXJtaW5hdG9yLCB0ZXJtaW5hdG9yX2xlbik7Ci0Jc2VsZi0+cmVjX2xlbiArPSB0ZXJtaW5hdG9yX2xlbjsKKyAgICB0ZXJtaW5hdG9yID0gUHlTdHJpbmdfQXNTdHJpbmcoc2VsZi0+ZGlhbGVjdC0+bGluZXRlcm1pbmF0b3IpOworICAgIGlmICh0ZXJtaW5hdG9yID09IE5VTEwpCisgICAgICAgIHJldHVybiAwOworICAgIG1lbW1vdmUoc2VsZi0+cmVjICsgc2VsZi0+cmVjX2xlbiwgdGVybWluYXRvciwgdGVybWluYXRvcl9sZW4pOworICAgIHNlbGYtPnJlY19sZW4gKz0gdGVybWluYXRvcl9sZW47CiAKLQlyZXR1cm4gMTsKKyAgICByZXR1cm4gMTsKIH0KIAogUHlEb2NfU1RSVkFSKGNzdl93cml0ZXJvd19kb2MsCkBAIC0xMTM3LDczICsxMTM3LDczIEBACiBzdGF0aWMgUHlPYmplY3QgKgogY3N2X3dyaXRlcm93KFdyaXRlck9iaiAqc2VsZiwgUHlPYmplY3QgKnNlcSkKIHsKLSAgICAgICAgRGlhbGVjdE9iaiAqZGlhbGVjdCA9IHNlbGYtPmRpYWxlY3Q7Ci0JaW50IGxlbiwgaTsKKyAgICBEaWFsZWN0T2JqICpkaWFsZWN0ID0gc2VsZi0+ZGlhbGVjdDsKKyAgICBpbnQgbGVuLCBpOwogCi0JaWYgKCFQeVNlcXVlbmNlX0NoZWNrKHNlcSkpCi0JCXJldHVybiBQeUVycl9Gb3JtYXQoZXJyb3Jfb2JqLCAic2VxdWVuY2UgZXhwZWN0ZWQiKTsKKyAgICBpZiAoIVB5U2VxdWVuY2VfQ2hlY2soc2VxKSkKKyAgICAgICAgcmV0dXJuIFB5RXJyX0Zvcm1hdChlcnJvcl9vYmosICJzZXF1ZW5jZSBleHBlY3RlZCIpOwogCi0JbGVuID0gUHlTZXF1ZW5jZV9MZW5ndGgoc2VxKTsKLQlpZiAobGVuIDwgMCkKLQkJcmV0dXJuIE5VTEw7CisgICAgbGVuID0gUHlTZXF1ZW5jZV9MZW5ndGgoc2VxKTsKKyAgICBpZiAobGVuIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkvKiBKb2luIGFsbCBmaWVsZHMgaW4gaW50ZXJuYWwgYnVmZmVyLgotCSAqLwotCWpvaW5fcmVzZXQoc2VsZik7Ci0JZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCVB5T2JqZWN0ICpmaWVsZDsKLQkJaW50IGFwcGVuZF9vazsKLQkJaW50IHF1b3RlZDsKKyAgICAvKiBKb2luIGFsbCBmaWVsZHMgaW4gaW50ZXJuYWwgYnVmZmVyLgorICAgICAqLworICAgIGpvaW5fcmVzZXQoc2VsZik7CisgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgIFB5T2JqZWN0ICpmaWVsZDsKKyAgICAgICAgaW50IGFwcGVuZF9vazsKKyAgICAgICAgaW50IHF1b3RlZDsKIAotCQlmaWVsZCA9IFB5U2VxdWVuY2VfR2V0SXRlbShzZXEsIGkpOwotCQlpZiAoZmllbGQgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOworICAgICAgICBmaWVsZCA9IFB5U2VxdWVuY2VfR2V0SXRlbShzZXEsIGkpOworICAgICAgICBpZiAoZmllbGQgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogCi0JCXN3aXRjaCAoZGlhbGVjdC0+cXVvdGluZykgewotCQljYXNlIFFVT1RFX05PTk5VTUVSSUM6Ci0JCQlxdW90ZWQgPSAhUHlOdW1iZXJfQ2hlY2soZmllbGQpOwotCQkJYnJlYWs7Ci0JCWNhc2UgUVVPVEVfQUxMOgotCQkJcXVvdGVkID0gMTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcXVvdGVkID0gMDsKLQkJCWJyZWFrOwotCQl9CisgICAgICAgIHN3aXRjaCAoZGlhbGVjdC0+cXVvdGluZykgeworICAgICAgICBjYXNlIFFVT1RFX05PTk5VTUVSSUM6CisgICAgICAgICAgICBxdW90ZWQgPSAhUHlOdW1iZXJfQ2hlY2soZmllbGQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUVVPVEVfQUxMOgorICAgICAgICAgICAgcXVvdGVkID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcXVvdGVkID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CiAKLQkJaWYgKFB5U3RyaW5nX0NoZWNrKGZpZWxkKSkgewotCQkJYXBwZW5kX29rID0gam9pbl9hcHBlbmQoc2VsZiwKLQkJCQkJCVB5U3RyaW5nX0FTX1NUUklORyhmaWVsZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcXVvdGVkLCBsZW4gPT0gMSk7Ci0JCQlQeV9ERUNSRUYoZmllbGQpOwotCQl9Ci0JCWVsc2UgaWYgKGZpZWxkID09IFB5X05vbmUpIHsKLQkJCWFwcGVuZF9vayA9IGpvaW5fYXBwZW5kKHNlbGYsICIiLCAmcXVvdGVkLCBsZW4gPT0gMSk7Ci0JCQlQeV9ERUNSRUYoZmllbGQpOwotCQl9Ci0JCWVsc2UgewotCQkJUHlPYmplY3QgKnN0cjsKKyAgICAgICAgaWYgKFB5U3RyaW5nX0NoZWNrKGZpZWxkKSkgeworICAgICAgICAgICAgYXBwZW5kX29rID0gam9pbl9hcHBlbmQoc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FTX1NUUklORyhmaWVsZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcXVvdGVkLCBsZW4gPT0gMSk7CisgICAgICAgICAgICBQeV9ERUNSRUYoZmllbGQpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGZpZWxkID09IFB5X05vbmUpIHsKKyAgICAgICAgICAgIGFwcGVuZF9vayA9IGpvaW5fYXBwZW5kKHNlbGYsICIiLCAmcXVvdGVkLCBsZW4gPT0gMSk7CisgICAgICAgICAgICBQeV9ERUNSRUYoZmllbGQpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgUHlPYmplY3QgKnN0cjsKIAotCQkJc3RyID0gUHlPYmplY3RfU3RyKGZpZWxkKTsKLQkJCVB5X0RFQ1JFRihmaWVsZCk7Ci0JCQlpZiAoc3RyID09IE5VTEwpCi0JCQkJcmV0dXJuIE5VTEw7CisgICAgICAgICAgICBzdHIgPSBQeU9iamVjdF9TdHIoZmllbGQpOworICAgICAgICAgICAgUHlfREVDUkVGKGZpZWxkKTsKKyAgICAgICAgICAgIGlmIChzdHIgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKIAotCQkJYXBwZW5kX29rID0gam9pbl9hcHBlbmQoc2VsZiwgUHlTdHJpbmdfQVNfU1RSSU5HKHN0ciksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnF1b3RlZCwgbGVuID09IDEpOwotCQkJUHlfREVDUkVGKHN0cik7Ci0JCX0KLQkJaWYgKCFhcHBlbmRfb2spCi0JCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgICAgICAgICBhcHBlbmRfb2sgPSBqb2luX2FwcGVuZChzZWxmLCBQeVN0cmluZ19BU19TVFJJTkcoc3RyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZxdW90ZWQsIGxlbiA9PSAxKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihzdHIpOworICAgICAgICB9CisgICAgICAgIGlmICghYXBwZW5kX29rKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JLyogQWRkIGxpbmUgdGVybWluYXRvci4KLQkgKi8KLQlpZiAoIWpvaW5fYXBwZW5kX2xpbmV0ZXJtaW5hdG9yKHNlbGYpKQotCQlyZXR1cm4gMDsKKyAgICAvKiBBZGQgbGluZSB0ZXJtaW5hdG9yLgorICAgICAqLworICAgIGlmICgham9pbl9hcHBlbmRfbGluZXRlcm1pbmF0b3Ioc2VsZikpCisgICAgICAgIHJldHVybiAwOwogCi0JcmV0dXJuIFB5T2JqZWN0X0NhbGxGdW5jdGlvbihzZWxmLT53cml0ZWxpbmUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIocyMpIiwgc2VsZi0+cmVjLCBzZWxmLT5yZWNfbGVuKTsKKyAgICByZXR1cm4gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKHNlbGYtPndyaXRlbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIocyMpIiwgc2VsZi0+cmVjLCBzZWxmLT5yZWNfbGVuKTsKIH0KIAogUHlEb2NfU1RSVkFSKGNzdl93cml0ZXJvd3NfZG9jLApAQCAtMTIxNSw3MiArMTIxNSw3MiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGNzdl93cml0ZXJvd3MoV3JpdGVyT2JqICpzZWxmLCBQeU9iamVjdCAqc2Vxc2VxKQogewotICAgICAgICBQeU9iamVjdCAqcm93X2l0ZXIsICpyb3dfb2JqLCAqcmVzdWx0OworICAgIFB5T2JqZWN0ICpyb3dfaXRlciwgKnJvd19vYmosICpyZXN1bHQ7CiAKLSAgICAgICAgcm93X2l0ZXIgPSBQeU9iamVjdF9HZXRJdGVyKHNlcXNlcSk7Ci0gICAgICAgIGlmIChyb3dfaXRlciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndyaXRlcm93cygpIGFyZ3VtZW50IG11c3QgYmUgaXRlcmFibGUiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByb3dfaXRlciA9IFB5T2JqZWN0X0dldEl0ZXIoc2Vxc2VxKTsKKyAgICBpZiAocm93X2l0ZXIgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIndyaXRlcm93cygpIGFyZ3VtZW50IG11c3QgYmUgaXRlcmFibGUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHdoaWxlICgocm93X29iaiA9IFB5SXRlcl9OZXh0KHJvd19pdGVyKSkpIHsKKyAgICAgICAgcmVzdWx0ID0gY3N2X3dyaXRlcm93KHNlbGYsIHJvd19vYmopOworICAgICAgICBQeV9ERUNSRUYocm93X29iaik7CisgICAgICAgIGlmICghcmVzdWx0KSB7CisgICAgICAgICAgICBQeV9ERUNSRUYocm93X2l0ZXIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KLSAgICAgICAgd2hpbGUgKChyb3dfb2JqID0gUHlJdGVyX05leHQocm93X2l0ZXIpKSkgewotICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNzdl93cml0ZXJvdyhzZWxmLCByb3dfb2JqKTsKLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYocm93X29iaik7Ci0gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihyb3dfaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7ICAgCi0gICAgICAgIH0KLSAgICAgICAgUHlfREVDUkVGKHJvd19pdGVyKTsKLSAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKLSAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICB9CisgICAgUHlfREVDUkVGKHJvd19pdGVyKTsKKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgc3RydWN0IFB5TWV0aG9kRGVmIFdyaXRlcl9tZXRob2RzW10gPSB7Ci0gICAgICAgIHsgIndyaXRlcm93IiwgKFB5Q0Z1bmN0aW9uKWNzdl93cml0ZXJvdywgTUVUSF9PLCBjc3Zfd3JpdGVyb3dfZG9jfSwKLSAgICAgICAgeyAid3JpdGVyb3dzIiwgKFB5Q0Z1bmN0aW9uKWNzdl93cml0ZXJvd3MsIE1FVEhfTywgY3N2X3dyaXRlcm93c19kb2N9LAotCXsgTlVMTCwgTlVMTCB9CisgICAgeyAid3JpdGVyb3ciLCAoUHlDRnVuY3Rpb24pY3N2X3dyaXRlcm93LCBNRVRIX08sIGNzdl93cml0ZXJvd19kb2N9LAorICAgIHsgIndyaXRlcm93cyIsIChQeUNGdW5jdGlvbiljc3Zfd3JpdGVyb3dzLCBNRVRIX08sIGNzdl93cml0ZXJvd3NfZG9jfSwKKyAgICB7IE5VTEwsIE5VTEwgfQogfTsKIAogI2RlZmluZSBXX09GRih4KSBvZmZzZXRvZihXcml0ZXJPYmosIHgpCiAKIHN0YXRpYyBzdHJ1Y3QgUHlNZW1iZXJEZWYgV3JpdGVyX21lbWJlcmxpc3RbXSA9IHsKLQl7ICJkaWFsZWN0IiwgVF9PQkpFQ1QsIFdfT0ZGKGRpYWxlY3QpLCBSTyB9LAotCXsgTlVMTCB9CisgICAgeyAiZGlhbGVjdCIsIFRfT0JKRUNULCBXX09GRihkaWFsZWN0KSwgUk8gfSwKKyAgICB7IE5VTEwgfQogfTsKIAogc3RhdGljIHZvaWQKIFdyaXRlcl9kZWFsbG9jKFdyaXRlck9iaiAqc2VsZikKIHsKLQlQeU9iamVjdF9HQ19VblRyYWNrKHNlbGYpOwotICAgICAgICBQeV9YREVDUkVGKHNlbGYtPmRpYWxlY3QpOwotICAgICAgICBQeV9YREVDUkVGKHNlbGYtPndyaXRlbGluZSk7Ci0JaWYgKHNlbGYtPnJlYyAhPSBOVUxMKQotCQlQeU1lbV9GcmVlKHNlbGYtPnJlYyk7Ci0JUHlPYmplY3RfR0NfRGVsKHNlbGYpOworICAgIFB5T2JqZWN0X0dDX1VuVHJhY2soc2VsZik7CisgICAgUHlfWERFQ1JFRihzZWxmLT5kaWFsZWN0KTsKKyAgICBQeV9YREVDUkVGKHNlbGYtPndyaXRlbGluZSk7CisgICAgaWYgKHNlbGYtPnJlYyAhPSBOVUxMKQorICAgICAgICBQeU1lbV9GcmVlKHNlbGYtPnJlYyk7CisgICAgUHlPYmplY3RfR0NfRGVsKHNlbGYpOwogfQogCiBzdGF0aWMgaW50CiBXcml0ZXJfdHJhdmVyc2UoV3JpdGVyT2JqICpzZWxmLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlQeV9WSVNJVChzZWxmLT5kaWFsZWN0KTsKLQlQeV9WSVNJVChzZWxmLT53cml0ZWxpbmUpOwotCXJldHVybiAwOworICAgIFB5X1ZJU0lUKHNlbGYtPmRpYWxlY3QpOworICAgIFB5X1ZJU0lUKHNlbGYtPndyaXRlbGluZSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIFdyaXRlcl9jbGVhcihXcml0ZXJPYmogKnNlbGYpCiB7Ci0JUHlfQ0xFQVIoc2VsZi0+ZGlhbGVjdCk7Ci0JUHlfQ0xFQVIoc2VsZi0+d3JpdGVsaW5lKTsKLQlyZXR1cm4gMDsKKyAgICBQeV9DTEVBUihzZWxmLT5kaWFsZWN0KTsKKyAgICBQeV9DTEVBUihzZWxmLT53cml0ZWxpbmUpOworICAgIHJldHVybiAwOwogfQogCi1QeURvY19TVFJWQVIoV3JpdGVyX1R5cGVfZG9jLCAKK1B5RG9jX1NUUlZBUihXcml0ZXJfVHlwZV9kb2MsCiAiQ1NWIHdyaXRlclxuIgogIlxuIgogIldyaXRlciBvYmplY3RzIGFyZSByZXNwb25zaWJsZSBmb3IgZ2VuZXJhdGluZyB0YWJ1bGFyIGRhdGFcbiIKQEAgLTEyODgsNzUgKzEyODgsNzUgQEAKICk7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgV3JpdGVyX1R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JIl9jc3Yud3JpdGVyIiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfbmFtZSovCi0Jc2l6ZW9mKFdyaXRlck9iaiksICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYmFzaWNzaXplKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKVdyaXRlcl9kZWFsbG9jLCAgICAgICAgICAgICAvKnRwX2RlYWxsb2MqLwotCShwcmludGZ1bmMpMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9yZXByKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19udW1iZXIqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX3NlcXVlbmNlKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19tYXBwaW5nKi8KLQkoaGFzaGZ1bmMpMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9oYXNoKi8KLQkodGVybmFyeWZ1bmMpMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jYWxsKi8KLQkocmVwcmZ1bmMpMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zdHIqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHJvKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc2V0YXR0cm8qLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19idWZmZXIqLwotICAgICAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFIHwKLQkJUHlfVFBGTEFHU19IQVZFX0dDLAkJLyp0cF9mbGFncyovCi0JV3JpdGVyX1R5cGVfZG9jLAotICAgICAgICAodHJhdmVyc2Vwcm9jKVdyaXRlcl90cmF2ZXJzZSwgICAgICAgICAgLyp0cF90cmF2ZXJzZSovCi0gICAgICAgIChpbnF1aXJ5KVdyaXRlcl9jbGVhciwgICAgICAgICAgICAgICAgICAvKnRwX2NsZWFyKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmljaGNvbXBhcmUqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF93ZWFrbGlzdG9mZnNldCovCi0gICAgICAgIChnZXRpdGVyZnVuYykwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZXIqLwotICAgICAgICAoZ2V0aXRlcmZ1bmMpMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVybmV4dCovCi0gICAgICAgIFdyaXRlcl9tZXRob2RzLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX21ldGhvZHMqLwotICAgICAgICBXcml0ZXJfbWVtYmVybGlzdCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9tZW1iZXJzKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0c2V0Ki8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAiX2Nzdi53cml0ZXIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoV3JpdGVyT2JqKSwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9iYXNpY3NpemUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpV3JpdGVyX2RlYWxsb2MsICAgICAgICAgICAgIC8qdHBfZGVhbGxvYyovCisgICAgKHByaW50ZnVuYykwLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYykwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHIqLworICAgIChzZXRhdHRyZnVuYykwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHIqLworICAgIChjbXBmdW5jKTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NvbXBhcmUqLworICAgIChyZXByZnVuYykwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3JlcHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX251bWJlciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfc2VxdWVuY2UqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX21hcHBpbmcqLworICAgIChoYXNoZnVuYykwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2hhc2gqLworICAgICh0ZXJuYXJ5ZnVuYykwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NhbGwqLworICAgIChyZXByZnVuYykwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3N0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0YXR0cm8qLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHJvKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfQkFTRVRZUEUgfAorICAgICAgICBQeV9UUEZMQUdTX0hBVkVfR0MsICAgICAgICAgICAgICAgICAgICAgLyp0cF9mbGFncyovCisgICAgV3JpdGVyX1R5cGVfZG9jLAorICAgICh0cmF2ZXJzZXByb2MpV3JpdGVyX3RyYXZlcnNlLCAgICAgICAgICAvKnRwX3RyYXZlcnNlKi8KKyAgICAoaW5xdWlyeSlXcml0ZXJfY2xlYXIsICAgICAgICAgICAgICAgICAgLyp0cF9jbGVhciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KKyAgICAoZ2V0aXRlcmZ1bmMpMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVyKi8KKyAgICAoZ2V0aXRlcmZ1bmMpMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVybmV4dCovCisgICAgV3JpdGVyX21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfbWV0aG9kcyovCisgICAgV3JpdGVyX21lbWJlcmxpc3QsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfbWVtYmVycyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0c2V0Ki8KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjc3Zfd3JpdGVyKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa2V5d29yZF9hcmdzKQogewotCVB5T2JqZWN0ICogb3V0cHV0X2ZpbGUsICogZGlhbGVjdCA9IE5VTEw7Ci0gICAgICAgIFdyaXRlck9iaiAqIHNlbGYgPSBQeU9iamVjdF9HQ19OZXcoV3JpdGVyT2JqLCAmV3JpdGVyX1R5cGUpOworICAgIFB5T2JqZWN0ICogb3V0cHV0X2ZpbGUsICogZGlhbGVjdCA9IE5VTEw7CisgICAgV3JpdGVyT2JqICogc2VsZiA9IFB5T2JqZWN0X0dDX05ldyhXcml0ZXJPYmosICZXcml0ZXJfVHlwZSk7CiAKLSAgICAgICAgaWYgKCFzZWxmKQotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghc2VsZikKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLSAgICAgICAgc2VsZi0+ZGlhbGVjdCA9IE5VTEw7Ci0gICAgICAgIHNlbGYtPndyaXRlbGluZSA9IE5VTEw7CisgICAgc2VsZi0+ZGlhbGVjdCA9IE5VTEw7CisgICAgc2VsZi0+d3JpdGVsaW5lID0gTlVMTDsKIAotCXNlbGYtPnJlYyA9IE5VTEw7Ci0Jc2VsZi0+cmVjX3NpemUgPSAwOwotCXNlbGYtPnJlY19sZW4gPSAwOwotCXNlbGYtPm51bV9maWVsZHMgPSAwOworICAgIHNlbGYtPnJlYyA9IE5VTEw7CisgICAgc2VsZi0+cmVjX3NpemUgPSAwOworICAgIHNlbGYtPnJlY19sZW4gPSAwOworICAgIHNlbGYtPm51bV9maWVsZHMgPSAwOwogCi0JaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiIiwgMSwgMiwgJm91dHB1dF9maWxlLCAmZGlhbGVjdCkpIHsKLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYoc2VsZik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgc2VsZi0+d3JpdGVsaW5lID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhvdXRwdXRfZmlsZSwgIndyaXRlIik7Ci0gICAgICAgIGlmIChzZWxmLT53cml0ZWxpbmUgPT0gTlVMTCB8fCAhUHlDYWxsYWJsZV9DaGVjayhzZWxmLT53cml0ZWxpbmUpKSB7Ci0gICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFyZ3VtZW50IDEgbXVzdCBoYXZlIGEgXCJ3cml0ZVwiIG1ldGhvZCIpOwotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihzZWxmKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotCXNlbGYtPmRpYWxlY3QgPSAoRGlhbGVjdE9iaiAqKV9jYWxsX2RpYWxlY3QoZGlhbGVjdCwga2V5d29yZF9hcmdzKTsKLSAgICAgICAgaWYgKHNlbGYtPmRpYWxlY3QgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihzZWxmKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotCVB5T2JqZWN0X0dDX1RyYWNrKHNlbGYpOwotICAgICAgICByZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICIiLCAxLCAyLCAmb3V0cHV0X2ZpbGUsICZkaWFsZWN0KSkgeworICAgICAgICBQeV9ERUNSRUYoc2VsZik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBzZWxmLT53cml0ZWxpbmUgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKG91dHB1dF9maWxlLCAid3JpdGUiKTsKKyAgICBpZiAoc2VsZi0+d3JpdGVsaW5lID09IE5VTEwgfHwgIVB5Q2FsbGFibGVfQ2hlY2soc2VsZi0+d3JpdGVsaW5lKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImFyZ3VtZW50IDEgbXVzdCBoYXZlIGEgXCJ3cml0ZVwiIG1ldGhvZCIpOworICAgICAgICBQeV9ERUNSRUYoc2VsZik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBzZWxmLT5kaWFsZWN0ID0gKERpYWxlY3RPYmogKilfY2FsbF9kaWFsZWN0KGRpYWxlY3QsIGtleXdvcmRfYXJncyk7CisgICAgaWYgKHNlbGYtPmRpYWxlY3QgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYoc2VsZik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeU9iamVjdF9HQ19UcmFjayhzZWxmKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKIH0KIAogLyoKQEAgLTEzNjUsNjYgKzEzNjUsNjYgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBjc3ZfbGlzdF9kaWFsZWN0cyhQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqYXJncykKIHsKLSAgICAgICAgcmV0dXJuIFB5RGljdF9LZXlzKGRpYWxlY3RzKTsKKyAgICByZXR1cm4gUHlEaWN0X0tleXMoZGlhbGVjdHMpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY3N2X3JlZ2lzdGVyX2RpYWxlY3QoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7Ci0JUHlPYmplY3QgKm5hbWVfb2JqLCAqZGlhbGVjdF9vYmogPSBOVUxMOwotCVB5T2JqZWN0ICpkaWFsZWN0OworICAgIFB5T2JqZWN0ICpuYW1lX29iaiwgKmRpYWxlY3Rfb2JqID0gTlVMTDsKKyAgICBQeU9iamVjdCAqZGlhbGVjdDsKIAotCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgIiIsIDEsIDIsICZuYW1lX29iaiwgJmRpYWxlY3Rfb2JqKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgaWYgKCFJU19CQVNFU1RSSU5HKG5hbWVfb2JqKSkgewotICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGlhbGVjdCBuYW1lIG11c3QgYmUgYSBzdHJpbmcgb3IgdW5pY29kZSIpOwotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0JZGlhbGVjdCA9IF9jYWxsX2RpYWxlY3QoZGlhbGVjdF9vYmosIGt3YXJncyk7Ci0JaWYgKGRpYWxlY3QgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKFB5RGljdF9TZXRJdGVtKGRpYWxlY3RzLCBuYW1lX29iaiwgZGlhbGVjdCkgPCAwKSB7Ci0JCVB5X0RFQ1JFRihkaWFsZWN0KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotCVB5X0RFQ1JFRihkaWFsZWN0KTsKLSAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwotICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICIiLCAxLCAyLCAmbmFtZV9vYmosICZkaWFsZWN0X29iaikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghSVNfQkFTRVNUUklORyhuYW1lX29iaikpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJkaWFsZWN0IG5hbWUgbXVzdCBiZSBhIHN0cmluZyBvciB1bmljb2RlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBkaWFsZWN0ID0gX2NhbGxfZGlhbGVjdChkaWFsZWN0X29iaiwga3dhcmdzKTsKKyAgICBpZiAoZGlhbGVjdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoUHlEaWN0X1NldEl0ZW0oZGlhbGVjdHMsIG5hbWVfb2JqLCBkaWFsZWN0KSA8IDApIHsKKyAgICAgICAgUHlfREVDUkVGKGRpYWxlY3QpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlfREVDUkVGKGRpYWxlY3QpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNzdl91bnJlZ2lzdGVyX2RpYWxlY3QoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKm5hbWVfb2JqKQogewotICAgICAgICBpZiAoUHlEaWN0X0RlbEl0ZW0oZGlhbGVjdHMsIG5hbWVfb2JqKSA8IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIFB5RXJyX0Zvcm1hdChlcnJvcl9vYmosICJ1bmtub3duIGRpYWxlY3QiKTsKLSAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwotICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAoUHlEaWN0X0RlbEl0ZW0oZGlhbGVjdHMsIG5hbWVfb2JqKSA8IDApCisgICAgICAgIHJldHVybiBQeUVycl9Gb3JtYXQoZXJyb3Jfb2JqLCAidW5rbm93biBkaWFsZWN0Iik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY3N2X2dldF9kaWFsZWN0KFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICpuYW1lX29iaikKIHsKLSAgICAgICAgcmV0dXJuIGdldF9kaWFsZWN0X2Zyb21fcmVnaXN0cnkobmFtZV9vYmopOworICAgIHJldHVybiBnZXRfZGlhbGVjdF9mcm9tX3JlZ2lzdHJ5KG5hbWVfb2JqKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNzdl9maWVsZF9zaXplX2xpbWl0KFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICpuZXdfbGltaXQgPSBOVUxMOwotCWxvbmcgb2xkX2xpbWl0ID0gZmllbGRfbGltaXQ7CisgICAgUHlPYmplY3QgKm5ld19saW1pdCA9IE5VTEw7CisgICAgbG9uZyBvbGRfbGltaXQgPSBmaWVsZF9saW1pdDsKIAotCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImZpZWxkX3NpemVfbGltaXQiLCAwLCAxLCAmbmV3X2xpbWl0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKG5ld19saW1pdCAhPSBOVUxMKSB7Ci0JCWlmICghUHlJbnRfQ2hlY2sobmV3X2xpbWl0KSkgewotCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgCi0JCQkJICAgICAibGltaXQgbXVzdCBiZSBhbiBpbnRlZ2VyIik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlmaWVsZF9saW1pdCA9IFB5SW50X0FzTG9uZyhuZXdfbGltaXQpOwotCX0KLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcob2xkX2xpbWl0KTsKKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJmaWVsZF9zaXplX2xpbWl0IiwgMCwgMSwgJm5ld19saW1pdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChuZXdfbGltaXQgIT0gTlVMTCkgeworICAgICAgICBpZiAoIVB5SW50X0NoZWNrKG5ld19saW1pdCkpIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgImxpbWl0IG11c3QgYmUgYW4gaW50ZWdlciIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgZmllbGRfbGltaXQgPSBQeUludF9Bc0xvbmcobmV3X2xpbWl0KTsKKyAgICB9CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKG9sZF9saW1pdCk7CiB9CiAKIC8qCkBAIC0xNTQyLDcwICsxNTQyLDcwIEBACiAidGhlIG9sZCBsaW1pdCBpcyByZXR1cm5lZCIpOwogCiBzdGF0aWMgc3RydWN0IFB5TWV0aG9kRGVmIGNzdl9tZXRob2RzW10gPSB7Ci0JeyAicmVhZGVyIiwgKFB5Q0Z1bmN0aW9uKWNzdl9yZWFkZXIsIAotCQlNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLCBjc3ZfcmVhZGVyX2RvY30sCi0JeyAid3JpdGVyIiwgKFB5Q0Z1bmN0aW9uKWNzdl93cml0ZXIsIAotCQlNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLCBjc3Zfd3JpdGVyX2RvY30sCi0JeyAibGlzdF9kaWFsZWN0cyIsIChQeUNGdW5jdGlvbiljc3ZfbGlzdF9kaWFsZWN0cywgCi0JCU1FVEhfTk9BUkdTLCBjc3ZfbGlzdF9kaWFsZWN0c19kb2N9LAotCXsgInJlZ2lzdGVyX2RpYWxlY3QiLCAoUHlDRnVuY3Rpb24pY3N2X3JlZ2lzdGVyX2RpYWxlY3QsIAotCQlNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLCBjc3ZfcmVnaXN0ZXJfZGlhbGVjdF9kb2N9LAotCXsgInVucmVnaXN0ZXJfZGlhbGVjdCIsIChQeUNGdW5jdGlvbiljc3ZfdW5yZWdpc3Rlcl9kaWFsZWN0LCAKLQkJTUVUSF9PLCBjc3ZfdW5yZWdpc3Rlcl9kaWFsZWN0X2RvY30sCi0JeyAiZ2V0X2RpYWxlY3QiLCAoUHlDRnVuY3Rpb24pY3N2X2dldF9kaWFsZWN0LCAKLQkJTUVUSF9PLCBjc3ZfZ2V0X2RpYWxlY3RfZG9jfSwKLQl7ICJmaWVsZF9zaXplX2xpbWl0IiwgKFB5Q0Z1bmN0aW9uKWNzdl9maWVsZF9zaXplX2xpbWl0LCAKLQkJTUVUSF9WQVJBUkdTLCBjc3ZfZmllbGRfc2l6ZV9saW1pdF9kb2N9LAotCXsgTlVMTCwgTlVMTCB9CisgICAgeyAicmVhZGVyIiwgKFB5Q0Z1bmN0aW9uKWNzdl9yZWFkZXIsCisgICAgICAgIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsIGNzdl9yZWFkZXJfZG9jfSwKKyAgICB7ICJ3cml0ZXIiLCAoUHlDRnVuY3Rpb24pY3N2X3dyaXRlciwKKyAgICAgICAgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywgY3N2X3dyaXRlcl9kb2N9LAorICAgIHsgImxpc3RfZGlhbGVjdHMiLCAoUHlDRnVuY3Rpb24pY3N2X2xpc3RfZGlhbGVjdHMsCisgICAgICAgIE1FVEhfTk9BUkdTLCBjc3ZfbGlzdF9kaWFsZWN0c19kb2N9LAorICAgIHsgInJlZ2lzdGVyX2RpYWxlY3QiLCAoUHlDRnVuY3Rpb24pY3N2X3JlZ2lzdGVyX2RpYWxlY3QsCisgICAgICAgIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsIGNzdl9yZWdpc3Rlcl9kaWFsZWN0X2RvY30sCisgICAgeyAidW5yZWdpc3Rlcl9kaWFsZWN0IiwgKFB5Q0Z1bmN0aW9uKWNzdl91bnJlZ2lzdGVyX2RpYWxlY3QsCisgICAgICAgIE1FVEhfTywgY3N2X3VucmVnaXN0ZXJfZGlhbGVjdF9kb2N9LAorICAgIHsgImdldF9kaWFsZWN0IiwgKFB5Q0Z1bmN0aW9uKWNzdl9nZXRfZGlhbGVjdCwKKyAgICAgICAgTUVUSF9PLCBjc3ZfZ2V0X2RpYWxlY3RfZG9jfSwKKyAgICB7ICJmaWVsZF9zaXplX2xpbWl0IiwgKFB5Q0Z1bmN0aW9uKWNzdl9maWVsZF9zaXplX2xpbWl0LAorICAgICAgICBNRVRIX1ZBUkFSR1MsIGNzdl9maWVsZF9zaXplX2xpbWl0X2RvY30sCisgICAgeyBOVUxMLCBOVUxMIH0KIH07CiAKIFB5TU9ESU5JVF9GVU5DCiBpbml0X2Nzdih2b2lkKQogewotCVB5T2JqZWN0ICptb2R1bGU7Ci0JU3R5bGVEZXNjICpzdHlsZTsKKyAgICBQeU9iamVjdCAqbW9kdWxlOworICAgIFN0eWxlRGVzYyAqc3R5bGU7CiAKLQlpZiAoUHlUeXBlX1JlYWR5KCZEaWFsZWN0X1R5cGUpIDwgMCkKLQkJcmV0dXJuOworICAgIGlmIChQeVR5cGVfUmVhZHkoJkRpYWxlY3RfVHlwZSkgPCAwKQorICAgICAgICByZXR1cm47CiAKLQlpZiAoUHlUeXBlX1JlYWR5KCZSZWFkZXJfVHlwZSkgPCAwKQotCQlyZXR1cm47CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmUmVhZGVyX1R5cGUpIDwgMCkKKyAgICAgICAgcmV0dXJuOwogCi0JaWYgKFB5VHlwZV9SZWFkeSgmV3JpdGVyX1R5cGUpIDwgMCkKLQkJcmV0dXJuOworICAgIGlmIChQeVR5cGVfUmVhZHkoJldyaXRlcl9UeXBlKSA8IDApCisgICAgICAgIHJldHVybjsKIAotCS8qIENyZWF0ZSB0aGUgbW9kdWxlIGFuZCBhZGQgdGhlIGZ1bmN0aW9ucyAqLwotCW1vZHVsZSA9IFB5X0luaXRNb2R1bGUzKCJfY3N2IiwgY3N2X21ldGhvZHMsIGNzdl9tb2R1bGVfZG9jKTsKLQlpZiAobW9kdWxlID09IE5VTEwpCi0JCXJldHVybjsKKyAgICAvKiBDcmVhdGUgdGhlIG1vZHVsZSBhbmQgYWRkIHRoZSBmdW5jdGlvbnMgKi8KKyAgICBtb2R1bGUgPSBQeV9Jbml0TW9kdWxlMygiX2NzdiIsIGNzdl9tZXRob2RzLCBjc3ZfbW9kdWxlX2RvYyk7CisgICAgaWYgKG1vZHVsZSA9PSBOVUxMKQorICAgICAgICByZXR1cm47CiAKLQkvKiBBZGQgdmVyc2lvbiB0byB0aGUgbW9kdWxlLiAqLwotCWlmIChQeU1vZHVsZV9BZGRTdHJpbmdDb25zdGFudChtb2R1bGUsICJfX3ZlcnNpb25fXyIsCi0JCQkJICAgICAgIE1PRFVMRV9WRVJTSU9OKSA9PSAtMSkKLQkJcmV0dXJuOworICAgIC8qIEFkZCB2ZXJzaW9uIHRvIHRoZSBtb2R1bGUuICovCisgICAgaWYgKFB5TW9kdWxlX0FkZFN0cmluZ0NvbnN0YW50KG1vZHVsZSwgIl9fdmVyc2lvbl9fIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTU9EVUxFX1ZFUlNJT04pID09IC0xKQorICAgICAgICByZXR1cm47CiAKLSAgICAgICAgLyogQWRkIF9kaWFsZWN0cyBkaWN0aW9uYXJ5ICovCi0gICAgICAgIGRpYWxlY3RzID0gUHlEaWN0X05ldygpOwotICAgICAgICBpZiAoZGlhbGVjdHMgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGlmIChQeU1vZHVsZV9BZGRPYmplY3QobW9kdWxlLCAiX2RpYWxlY3RzIiwgZGlhbGVjdHMpKQotICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAvKiBBZGQgX2RpYWxlY3RzIGRpY3Rpb25hcnkgKi8KKyAgICBkaWFsZWN0cyA9IFB5RGljdF9OZXcoKTsKKyAgICBpZiAoZGlhbGVjdHMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOworICAgIGlmIChQeU1vZHVsZV9BZGRPYmplY3QobW9kdWxlLCAiX2RpYWxlY3RzIiwgZGlhbGVjdHMpKQorICAgICAgICByZXR1cm47CiAKLQkvKiBBZGQgcXVvdGUgc3R5bGVzIGludG8gZGljdGlvbmFyeSAqLwotCWZvciAoc3R5bGUgPSBxdW90ZV9zdHlsZXM7IHN0eWxlLT5uYW1lOyBzdHlsZSsrKSB7Ci0JCWlmIChQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtb2R1bGUsIHN0eWxlLT5uYW1lLAotCQkJCQkgICAgc3R5bGUtPnN0eWxlKSA9PSAtMSkKLQkJCXJldHVybjsKLQl9CisgICAgLyogQWRkIHF1b3RlIHN0eWxlcyBpbnRvIGRpY3Rpb25hcnkgKi8KKyAgICBmb3IgKHN0eWxlID0gcXVvdGVfc3R5bGVzOyBzdHlsZS0+bmFtZTsgc3R5bGUrKykgeworICAgICAgICBpZiAoUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobW9kdWxlLCBzdHlsZS0+bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlLT5zdHlsZSkgPT0gLTEpCisgICAgICAgICAgICByZXR1cm47CisgICAgfQogCi0gICAgICAgIC8qIEFkZCB0aGUgRGlhbGVjdCB0eXBlICovCi0JUHlfSU5DUkVGKCZEaWFsZWN0X1R5cGUpOwotICAgICAgICBpZiAoUHlNb2R1bGVfQWRkT2JqZWN0KG1vZHVsZSwgIkRpYWxlY3QiLCAoUHlPYmplY3QgKikmRGlhbGVjdF9UeXBlKSkKLSAgICAgICAgICAgICAgICByZXR1cm47CisgICAgLyogQWRkIHRoZSBEaWFsZWN0IHR5cGUgKi8KKyAgICBQeV9JTkNSRUYoJkRpYWxlY3RfVHlwZSk7CisgICAgaWYgKFB5TW9kdWxlX0FkZE9iamVjdChtb2R1bGUsICJEaWFsZWN0IiwgKFB5T2JqZWN0ICopJkRpYWxlY3RfVHlwZSkpCisgICAgICAgIHJldHVybjsKIAotCS8qIEFkZCB0aGUgQ1NWIGV4Y2VwdGlvbiBvYmplY3QgdG8gdGhlIG1vZHVsZS4gKi8KLQllcnJvcl9vYmogPSBQeUVycl9OZXdFeGNlcHRpb24oIl9jc3YuRXJyb3IiLCBOVUxMLCBOVUxMKTsKLQlpZiAoZXJyb3Jfb2JqID09IE5VTEwpCi0JCXJldHVybjsKLQlQeU1vZHVsZV9BZGRPYmplY3QobW9kdWxlLCAiRXJyb3IiLCBlcnJvcl9vYmopOworICAgIC8qIEFkZCB0aGUgQ1NWIGV4Y2VwdGlvbiBvYmplY3QgdG8gdGhlIG1vZHVsZS4gKi8KKyAgICBlcnJvcl9vYmogPSBQeUVycl9OZXdFeGNlcHRpb24oIl9jc3YuRXJyb3IiLCBOVUxMLCBOVUxMKTsKKyAgICBpZiAoZXJyb3Jfb2JqID09IE5VTEwpCisgICAgICAgIHJldHVybjsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobW9kdWxlLCAiRXJyb3IiLCBlcnJvcl9vYmopOwogfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL19jdHlwZXMuYyBiL01vZHVsZXMvX2N0eXBlcy9fY3R5cGVzLmMKaW5kZXggYzYyY2VjNS4uYWY0ZmY0OSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL19jdHlwZXMuYworKysgYi9Nb2R1bGVzL19jdHlwZXMvX2N0eXBlcy5jCkBAIC0yNSwyMCArMjUsMjAgQEAKIAogLyoKIAotTmFtZQkJCW1ldGhvZHMsIG1lbWJlcnMsIGdldHNldHMKK05hbWUgICAgICAgICAgICAgICAgICAgIG1ldGhvZHMsIG1lbWJlcnMsIGdldHNldHMKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi1TdHJ1Y3RUeXBlX1R5cGUJCV9fbmV3X18oKSwgZnJvbV9hZGRyZXNzKCksIF9fbXVsX18oKSwgZnJvbV9wYXJhbSgpCi1VbmlvblR5cGVfVHlwZQkJX19uZXdfXygpLCBmcm9tX2FkZHJlc3MoKSwgX19tdWxfXygpLCBmcm9tX3BhcmFtKCkKLVBvaW50ZXJUeXBlX1R5cGUJX19uZXdfXygpLCBmcm9tX2FkZHJlc3MoKSwgX19tdWxfXygpLCBmcm9tX3BhcmFtKCksIHNldF90eXBlKCkKLUFycmF5VHlwZV9UeXBlCQlfX25ld19fKCksIGZyb21fYWRkcmVzcygpLCBfX211bF9fKCksIGZyb21fcGFyYW0oKQotU2ltcGxlVHlwZV9UeXBlCQlfX25ld19fKCksIGZyb21fYWRkcmVzcygpLCBfX211bF9fKCksIGZyb21fcGFyYW0oKQorU3RydWN0VHlwZV9UeXBlICAgICAgICAgX19uZXdfXygpLCBmcm9tX2FkZHJlc3MoKSwgX19tdWxfXygpLCBmcm9tX3BhcmFtKCkKK1VuaW9uVHlwZV9UeXBlICAgICAgICAgIF9fbmV3X18oKSwgZnJvbV9hZGRyZXNzKCksIF9fbXVsX18oKSwgZnJvbV9wYXJhbSgpCitQb2ludGVyVHlwZV9UeXBlICAgICAgICBfX25ld19fKCksIGZyb21fYWRkcmVzcygpLCBfX211bF9fKCksIGZyb21fcGFyYW0oKSwgc2V0X3R5cGUoKQorQXJyYXlUeXBlX1R5cGUgICAgICAgICAgX19uZXdfXygpLCBmcm9tX2FkZHJlc3MoKSwgX19tdWxfXygpLCBmcm9tX3BhcmFtKCkKK1NpbXBsZVR5cGVfVHlwZSAgICAgICAgIF9fbmV3X18oKSwgZnJvbV9hZGRyZXNzKCksIF9fbXVsX18oKSwgZnJvbV9wYXJhbSgpCiAKIENEYXRhX1R5cGUKLSAgU3RydWN0X1R5cGUJCV9fbmV3X18oKSwgX19pbml0X18oKQotICBQb2ludGVyX1R5cGUJCV9fbmV3X18oKSwgX19pbml0X18oKSwgX2FzX3BhcmFtZXRlcl8sIGNvbnRlbnRzCi0gIEFycmF5X1R5cGUJCV9fbmV3X18oKSwgX19pbml0X18oKSwgX2FzX3BhcmFtZXRlcl8sIF9fZ2V0L3NldGl0ZW1fXygpLCBfX2xlbl9fKCkKLSAgU2ltcGxlX1R5cGUJCV9fbmV3X18oKSwgX19pbml0X18oKSwgX2FzX3BhcmFtZXRlcl8KKyAgU3RydWN0X1R5cGUgICAgICAgICAgIF9fbmV3X18oKSwgX19pbml0X18oKQorICBQb2ludGVyX1R5cGUgICAgICAgICAgX19uZXdfXygpLCBfX2luaXRfXygpLCBfYXNfcGFyYW1ldGVyXywgY29udGVudHMKKyAgQXJyYXlfVHlwZSAgICAgICAgICAgIF9fbmV3X18oKSwgX19pbml0X18oKSwgX2FzX3BhcmFtZXRlcl8sIF9fZ2V0L3NldGl0ZW1fXygpLCBfX2xlbl9fKCkKKyAgU2ltcGxlX1R5cGUgICAgICAgICAgIF9fbmV3X18oKSwgX19pbml0X18oKSwgX2FzX3BhcmFtZXRlcl8KIAogQ0ZpZWxkX1R5cGUKIFN0Z0RpY3RfVHlwZQpAQCAtNTAsMjggKzUwLDI4IEBACiAKIEl0IGhhcyBzb21lIHNpbWlsYXJpdHkgdG8gdGhlIGJ5cmVmKCkgY29uc3RydWN0IGNvbXBhcmVkIHRvIHBvaW50ZXIoKQogZnJvbV9hZGRyZXNzKGFkZHIpCi0JLSBjb25zdHJ1Y3QgYW4gaW5zdGFuY2UgZnJvbSBhIGdpdmVuIG1lbW9yeSBibG9jayAoc2hhcmluZyB0aGlzIG1lbW9yeSBibG9jaykKKyAgICAtIGNvbnN0cnVjdCBhbiBpbnN0YW5jZSBmcm9tIGEgZ2l2ZW4gbWVtb3J5IGJsb2NrIChzaGFyaW5nIHRoaXMgbWVtb3J5IGJsb2NrKQogCiBmcm9tX3BhcmFtKG9iaikKLQktIHR5cGVjaGVjayBhbmQgY29udmVydCBhIFB5dGhvbiBvYmplY3QgaW50byBhIEMgZnVuY3Rpb24gY2FsbCBwYXJhbWV0ZXIKLQkgIHRoZSByZXN1bHQgbWF5IGJlIGFuIGluc3RhbmNlIG9mIHRoZSB0eXBlLCBvciBhbiBpbnRlZ2VyIG9yIHR1cGxlCi0JICAodHlwZWNvZGUsIHZhbHVlWywgb2JqXSkKKyAgICAtIHR5cGVjaGVjayBhbmQgY29udmVydCBhIFB5dGhvbiBvYmplY3QgaW50byBhIEMgZnVuY3Rpb24gY2FsbCBwYXJhbWV0ZXIKKyAgICAgIHRoZSByZXN1bHQgbWF5IGJlIGFuIGluc3RhbmNlIG9mIHRoZSB0eXBlLCBvciBhbiBpbnRlZ2VyIG9yIHR1cGxlCisgICAgICAodHlwZWNvZGUsIHZhbHVlWywgb2JqXSkKIAogaW5zdGFuY2UgbWV0aG9kcy9wcm9wZXJ0aWVzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogX2FzX3BhcmFtZXRlcl8KLQktIGNvbnZlcnQgc2VsZiBpbnRvIGEgQyBmdW5jdGlvbiBjYWxsIHBhcmFtZXRlcgotCSAgVGhpcyBpcyBlaXRoZXIgYW4gaW50ZWdlciwgb3IgYSAzLXR1cGxlICh0eXBlY29kZSwgdmFsdWUsIG9iaikKKyAgICAtIGNvbnZlcnQgc2VsZiBpbnRvIGEgQyBmdW5jdGlvbiBjYWxsIHBhcmFtZXRlcgorICAgICAgVGhpcyBpcyBlaXRoZXIgYW4gaW50ZWdlciwgb3IgYSAzLXR1cGxlICh0eXBlY29kZSwgdmFsdWUsIG9iaikKIAogZnVuY3Rpb25zCiAtLS0tLS0tLS0KIAogc2l6ZW9mKGNkYXRhKQotCS0gcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhlIGJ1ZmZlciBjb250YWlucworICAgIC0gcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhlIGJ1ZmZlciBjb250YWlucwogCiBzaXplb2YoY3R5cGUpCi0JLSByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyB0aGUgYnVmZmVyIG9mIGFuIGluc3RhbmNlIHdvdWxkIGNvbnRhaW4KKyAgICAtIHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoZSBidWZmZXIgb2YgYW4gaW5zdGFuY2Ugd291bGQgY29udGFpbgogCiBieXJlZihjZGF0YSkKIApAQCAtODIsNyArODIsNyBAQAogUE9JTlRFUihjdHlwZSkKIAogYnl0ZXMoY2RhdGEpCi0JLSByZXR1cm4gdGhlIGJ1ZmZlciBjb250ZW50cyBhcyBhIHNlcXVlbmNlIG9mIGJ5dGVzICh3aGljaCBpcyBjdXJyZW50bHkgYSBzdHJpbmcpCisgICAgLSByZXR1cm4gdGhlIGJ1ZmZlciBjb250ZW50cyBhcyBhIHNlcXVlbmNlIG9mIGJ5dGVzICh3aGljaCBpcyBjdXJyZW50bHkgYSBzdHJpbmcpCiAKICovCiAKQEAgLTEwMyw3ICsxMDMsNyBAQAogICogQ0ZpZWxkX1R5cGUKICAqCiAgKi8KLQwKKwogI2RlZmluZSBQWV9TU0laRV9UX0NMRUFOCiAKICNpbmNsdWRlICJQeXRob24uaCIKQEAgLTE0MCw3ICsxNDAsNyBAQAogY2hhciAqY29udmVyc2lvbl9tb2RlX2VuY29kaW5nID0gTlVMTDsKIGNoYXIgKmNvbnZlcnNpb25fbW9kZV9lcnJvcnMgPSBOVUxMOwogCi0MCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaWYgKFBZX1ZFUlNJT05fSEVYIDwgMHgwMjA0MDAwMCkKQEAgLTE0OCwxNDggKzE0OCwxNDggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBQeVR1cGxlX1BhY2soaW50IG4sIC4uLikKIHsKLQlpbnQgaTsKLQlQeU9iamVjdCAqbzsKLQlQeU9iamVjdCAqcmVzdWx0OwotCVB5T2JqZWN0ICoqaXRlbXM7Ci0JdmFfbGlzdCB2YXJnczsKKyAgICBpbnQgaTsKKyAgICBQeU9iamVjdCAqbzsKKyAgICBQeU9iamVjdCAqcmVzdWx0OworICAgIFB5T2JqZWN0ICoqaXRlbXM7CisgICAgdmFfbGlzdCB2YXJnczsKIAotCXZhX3N0YXJ0KHZhcmdzLCBuKTsKLQlyZXN1bHQgPSBQeVR1cGxlX05ldyhuKTsKLQlpZiAocmVzdWx0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWl0ZW1zID0gKChQeVR1cGxlT2JqZWN0ICopcmVzdWx0KS0+b2JfaXRlbTsKLQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCW8gPSB2YV9hcmcodmFyZ3MsIFB5T2JqZWN0ICopOwotCQlQeV9JTkNSRUYobyk7Ci0JCWl0ZW1zW2ldID0gbzsKLQl9Ci0JdmFfZW5kKHZhcmdzKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIHZhX3N0YXJ0KHZhcmdzLCBuKTsKKyAgICByZXN1bHQgPSBQeVR1cGxlX05ldyhuKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGl0ZW1zID0gKChQeVR1cGxlT2JqZWN0ICopcmVzdWx0KS0+b2JfaXRlbTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIG8gPSB2YV9hcmcodmFyZ3MsIFB5T2JqZWN0ICopOworICAgICAgICBQeV9JTkNSRUYobyk7CisgICAgICAgIGl0ZW1zW2ldID0gbzsKKyAgICB9CisgICAgdmFfZW5kKHZhcmdzKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCVB5T2JqZWN0ICprZXk7Ci0JUHlPYmplY3QgKmRpY3Q7CisgICAgUHlPYmplY3RfSEVBRAorICAgIFB5T2JqZWN0ICprZXk7CisgICAgUHlPYmplY3QgKmRpY3Q7CiB9IERpY3RSZW1vdmVyT2JqZWN0OwogCiBzdGF0aWMgdm9pZAogX0RpY3RSZW1vdmVyX2RlYWxsb2MoUHlPYmplY3QgKl9zZWxmKQogewotCURpY3RSZW1vdmVyT2JqZWN0ICpzZWxmID0gKERpY3RSZW1vdmVyT2JqZWN0ICopX3NlbGY7Ci0JUHlfWERFQ1JFRihzZWxmLT5rZXkpOwotCVB5X1hERUNSRUYoc2VsZi0+ZGljdCk7Ci0JUHlfVFlQRShzZWxmKS0+dHBfZnJlZShfc2VsZik7CisgICAgRGljdFJlbW92ZXJPYmplY3QgKnNlbGYgPSAoRGljdFJlbW92ZXJPYmplY3QgKilfc2VsZjsKKyAgICBQeV9YREVDUkVGKHNlbGYtPmtleSk7CisgICAgUHlfWERFQ1JFRihzZWxmLT5kaWN0KTsKKyAgICBQeV9UWVBFKHNlbGYpLT50cF9mcmVlKF9zZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIF9EaWN0UmVtb3Zlcl9jYWxsKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprdykKIHsKLQlEaWN0UmVtb3Zlck9iamVjdCAqc2VsZiA9IChEaWN0UmVtb3Zlck9iamVjdCAqKV9zZWxmOwotCWlmIChzZWxmLT5rZXkgJiYgc2VsZi0+ZGljdCkgewotCQlpZiAoLTEgPT0gUHlEaWN0X0RlbEl0ZW0oc2VsZi0+ZGljdCwgc2VsZi0+a2V5KSkKLQkJCS8qIFhYWCBFcnJvciBjb250ZXh0ICovCi0JCQlQeUVycl9Xcml0ZVVucmFpc2FibGUoUHlfTm9uZSk7Ci0JCVB5X0RFQ1JFRihzZWxmLT5rZXkpOwotCQlzZWxmLT5rZXkgPSBOVUxMOwotCQlQeV9ERUNSRUYoc2VsZi0+ZGljdCk7Ci0JCXNlbGYtPmRpY3QgPSBOVUxMOwotCX0KLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgRGljdFJlbW92ZXJPYmplY3QgKnNlbGYgPSAoRGljdFJlbW92ZXJPYmplY3QgKilfc2VsZjsKKyAgICBpZiAoc2VsZi0+a2V5ICYmIHNlbGYtPmRpY3QpIHsKKyAgICAgICAgaWYgKC0xID09IFB5RGljdF9EZWxJdGVtKHNlbGYtPmRpY3QsIHNlbGYtPmtleSkpCisgICAgICAgICAgICAvKiBYWFggRXJyb3IgY29udGV4dCAqLworICAgICAgICAgICAgUHlFcnJfV3JpdGVVbnJhaXNhYmxlKFB5X05vbmUpOworICAgICAgICBQeV9ERUNSRUYoc2VsZi0+a2V5KTsKKyAgICAgICAgc2VsZi0+a2V5ID0gTlVMTDsKKyAgICAgICAgUHlfREVDUkVGKHNlbGYtPmRpY3QpOworICAgICAgICBzZWxmLT5kaWN0ID0gTlVMTDsKKyAgICB9CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IERpY3RSZW1vdmVyX1R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JIl9jdHlwZXMuRGljdFJlbW92ZXIiLAkJCS8qIHRwX25hbWUgKi8KLQlzaXplb2YoRGljdFJlbW92ZXJPYmplY3QpLAkJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJCS8qIHRwX2l0ZW1zaXplICovCi0JX0RpY3RSZW1vdmVyX2RlYWxsb2MsCQkJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfY29tcGFyZSAqLwotCTAsCQkJICAgICAgIAkJLyogdHBfcmVwciAqLwotCTAsCQkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCQkvKiB0cF9oYXNoICovCi0JX0RpY3RSZW1vdmVyX2NhbGwsCQkJLyogdHBfY2FsbCAqLwotCTAsCQkJCQkvKiB0cF9zdHIgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisgICAgIl9jdHlwZXMuRGljdFJlbW92ZXIiLCAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCisgICAgc2l6ZW9mKERpY3RSZW1vdmVyT2JqZWN0KSwgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgX0RpY3RSZW1vdmVyX2RlYWxsb2MsICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIF9EaWN0UmVtb3Zlcl9jYWxsLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLwogLyogWFhYIHNob3VsZCBwYXJ0aWNpcGF0ZSBpbiBHQz8gKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQsCQkJLyogdHBfZmxhZ3MgKi8KLQkiZGVsZXRlcyBhIGtleSBmcm9tIGEgZGljdGlvbmFyeSIsCS8qIHRwX2RvYyAqLwotCTAsCQkJCQkvKiB0cF90cmF2ZXJzZSAqLwotCTAsCQkJCQkvKiB0cF9jbGVhciAqLwotCTAsCQkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCTAsCQkJCQkvKiB0cF9pdGVyICovCi0JMCwJCQkJCS8qIHRwX2l0ZXJuZXh0ICovCi0JMCwJCQkJCS8qIHRwX21ldGhvZHMgKi8KLQkwLAkJCQkJLyogdHBfbWVtYmVycyAqLwotCTAsCQkJCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCQkvKiB0cF9kaWN0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KLQkwLAkJCQkJLyogdHBfZGljdG9mZnNldCAqLwotCTAsCQkJCQkvKiB0cF9pbml0ICovCi0JMCwJCQkJCS8qIHRwX2FsbG9jICovCi0JMCwJCQkJCS8qIHRwX25ldyAqLwotCTAsCQkJCQkvKiB0cF9mcmVlICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mbGFncyAqLworICAgICJkZWxldGVzIGEga2V5IGZyb20gYSBkaWN0aW9uYXJ5IiwgICAgICAgICAgLyogdHBfZG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KIH07CiAKIGludAogUHlEaWN0X1NldEl0ZW1Qcm94eShQeU9iamVjdCAqZGljdCwgUHlPYmplY3QgKmtleSwgUHlPYmplY3QgKml0ZW0pCiB7Ci0JUHlPYmplY3QgKm9iajsKLQlEaWN0UmVtb3Zlck9iamVjdCAqcmVtb3ZlcjsKLQlQeU9iamVjdCAqcHJveHk7Ci0JaW50IHJlc3VsdDsKKyAgICBQeU9iamVjdCAqb2JqOworICAgIERpY3RSZW1vdmVyT2JqZWN0ICpyZW1vdmVyOworICAgIFB5T2JqZWN0ICpwcm94eTsKKyAgICBpbnQgcmVzdWx0OwogCi0Jb2JqID0gUHlPYmplY3RfQ2FsbE9iamVjdCgoUHlPYmplY3QgKikmRGljdFJlbW92ZXJfVHlwZSwgTlVMTCk7Ci0JaWYgKG9iaiA9PSBOVUxMKQotCQlyZXR1cm4gLTE7CisgICAgb2JqID0gUHlPYmplY3RfQ2FsbE9iamVjdCgoUHlPYmplY3QgKikmRGljdFJlbW92ZXJfVHlwZSwgTlVMTCk7CisgICAgaWYgKG9iaiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CiAKLQlyZW1vdmVyID0gKERpY3RSZW1vdmVyT2JqZWN0ICopb2JqOwotCWFzc2VydChyZW1vdmVyLT5rZXkgPT0gTlVMTCk7Ci0JYXNzZXJ0KHJlbW92ZXItPmRpY3QgPT0gTlVMTCk7Ci0JUHlfSU5DUkVGKGtleSk7Ci0JcmVtb3Zlci0+a2V5ID0ga2V5OwotCVB5X0lOQ1JFRihkaWN0KTsKLQlyZW1vdmVyLT5kaWN0ID0gZGljdDsKKyAgICByZW1vdmVyID0gKERpY3RSZW1vdmVyT2JqZWN0ICopb2JqOworICAgIGFzc2VydChyZW1vdmVyLT5rZXkgPT0gTlVMTCk7CisgICAgYXNzZXJ0KHJlbW92ZXItPmRpY3QgPT0gTlVMTCk7CisgICAgUHlfSU5DUkVGKGtleSk7CisgICAgcmVtb3Zlci0+a2V5ID0ga2V5OworICAgIFB5X0lOQ1JFRihkaWN0KTsKKyAgICByZW1vdmVyLT5kaWN0ID0gZGljdDsKIAotCXByb3h5ID0gUHlXZWFrcmVmX05ld1Byb3h5KGl0ZW0sIG9iaik7Ci0JUHlfREVDUkVGKG9iaik7Ci0JaWYgKHByb3h5ID09IE5VTEwpCi0JCXJldHVybiAtMTsKKyAgICBwcm94eSA9IFB5V2Vha3JlZl9OZXdQcm94eShpdGVtLCBvYmopOworICAgIFB5X0RFQ1JFRihvYmopOworICAgIGlmIChwcm94eSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CiAKLQlyZXN1bHQgPSBQeURpY3RfU2V0SXRlbShkaWN0LCBrZXksIHByb3h5KTsKLQlQeV9ERUNSRUYocHJveHkpOwotCXJldHVybiByZXN1bHQ7CisgICAgcmVzdWx0ID0gUHlEaWN0X1NldEl0ZW0oZGljdCwga2V5LCBwcm94eSk7CisgICAgUHlfREVDUkVGKHByb3h5KTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBQeU9iamVjdCAqCiBQeURpY3RfR2V0SXRlbVByb3h5KFB5T2JqZWN0ICpkaWN0LCBQeU9iamVjdCAqa2V5KQogewotCVB5T2JqZWN0ICpyZXN1bHQ7Ci0JUHlPYmplY3QgKml0ZW0gPSBQeURpY3RfR2V0SXRlbShkaWN0LCBrZXkpOworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisgICAgUHlPYmplY3QgKml0ZW0gPSBQeURpY3RfR2V0SXRlbShkaWN0LCBrZXkpOwogCi0JaWYgKGl0ZW0gPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFQeVdlYWtyZWZfQ2hlY2tQcm94eShpdGVtKSkKLQkJcmV0dXJuIGl0ZW07Ci0JcmVzdWx0ID0gUHlXZWFrcmVmX0dFVF9PQkpFQ1QoaXRlbSk7Ci0JaWYgKHJlc3VsdCA9PSBQeV9Ob25lKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gcmVzdWx0OworICAgIGlmIChpdGVtID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHlXZWFrcmVmX0NoZWNrUHJveHkoaXRlbSkpCisgICAgICAgIHJldHVybiBpdGVtOworICAgIHJlc3VsdCA9IFB5V2Vha3JlZl9HRVRfT0JKRUNUKGl0ZW0pOworICAgIGlmIChyZXN1bHQgPT0gUHlfTm9uZSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTMwMiwyNSArMzAyLDI1IEBACiBjaGFyICoKIGFsbG9jX2Zvcm1hdF9zdHJpbmcoY29uc3QgY2hhciAqcHJlZml4LCBjb25zdCBjaGFyICpzdWZmaXgpCiB7Ci0Jc2l6ZV90IGxlbjsKLQljaGFyICpyZXN1bHQ7CisgICAgc2l6ZV90IGxlbjsKKyAgICBjaGFyICpyZXN1bHQ7CiAKLQlpZiAoc3VmZml4ID09IE5VTEwpIHsKLQkJYXNzZXJ0KFB5RXJyX09jY3VycmVkKCkpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JbGVuID0gc3RybGVuKHN1ZmZpeCk7Ci0JaWYgKHByZWZpeCkKLQkJbGVuICs9IHN0cmxlbihwcmVmaXgpOwotCXJlc3VsdCA9IFB5TWVtX01hbGxvYyhsZW4gKyAxKTsKLQlpZiAocmVzdWx0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWlmIChwcmVmaXgpCi0JCXN0cmNweShyZXN1bHQsIHByZWZpeCk7Ci0JZWxzZQotCQlyZXN1bHRbMF0gPSAnXDAnOwotCXN0cmNhdChyZXN1bHQsIHN1ZmZpeCk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBpZiAoc3VmZml4ID09IE5VTEwpIHsKKyAgICAgICAgYXNzZXJ0KFB5RXJyX09jY3VycmVkKCkpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgbGVuID0gc3RybGVuKHN1ZmZpeCk7CisgICAgaWYgKHByZWZpeCkKKyAgICAgICAgbGVuICs9IHN0cmxlbihwcmVmaXgpOworICAgIHJlc3VsdCA9IFB5TWVtX01hbGxvYyhsZW4gKyAxKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChwcmVmaXgpCisgICAgICAgIHN0cmNweShyZXN1bHQsIHByZWZpeCk7CisgICAgZWxzZQorICAgICAgICByZXN1bHRbMF0gPSAnXDAnOworICAgIHN0cmNhdChyZXN1bHQsIHN1ZmZpeCk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogLyoKQEAgLTMzMywxMDAgKzMzMywxMDAgQEAKIHN0YXRpYyBQeUNBcmdPYmplY3QgKgogU3RydWN0VW5pb25UeXBlX3BhcmFtZnVuYyhDRGF0YU9iamVjdCAqc2VsZikKIHsKLQlQeUNBcmdPYmplY3QgKnBhcmc7Ci0JU3RnRGljdE9iamVjdCAqc3RnZGljdDsKLQkKLQlwYXJnID0gbmV3X0NBcmdPYmplY3QoKTsKLQlpZiAocGFyZyA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBQeUNBcmdPYmplY3QgKnBhcmc7CisgICAgU3RnRGljdE9iamVjdCAqc3RnZGljdDsKIAotCXBhcmctPnRhZyA9ICdWJzsKLQlzdGdkaWN0ID0gUHlPYmplY3Rfc3RnZGljdCgoUHlPYmplY3QgKilzZWxmKTsKLQlhc3NlcnQoc3RnZGljdCk7IC8qIENhbm5vdCBiZSBOVUxMIGZvciBzdHJ1Y3R1cmUvdW5pb24gaW5zdGFuY2VzICovCi0JcGFyZy0+cGZmaV90eXBlID0gJnN0Z2RpY3QtPmZmaV90eXBlX3BvaW50ZXI7Ci0JLyogRm9yIHN0cnVjdHVyZSBwYXJhbWV0ZXJzIChieSB2YWx1ZSksIHBhcmctPnZhbHVlIGRvZXNuJ3QgY29udGFpbiB0aGUgc3RydWN0dXJlCi0JICAgZGF0YSBpdHNlbGYsIGluc3RlYWQgcGFyZy0+dmFsdWUucCAqcG9pbnRzKiB0byB0aGUgc3RydWN0dXJlJ3MgZGF0YQotCSAgIFNlZSBhbHNvIF9jdHlwZXMuYywgZnVuY3Rpb24gX2NhbGxfZnVuY3Rpb25fcG9pbnRlcigpLgotCSovCi0JcGFyZy0+dmFsdWUucCA9IHNlbGYtPmJfcHRyOwotCXBhcmctPnNpemUgPSBzZWxmLT5iX3NpemU7Ci0JUHlfSU5DUkVGKHNlbGYpOwotCXBhcmctPm9iaiA9IChQeU9iamVjdCAqKXNlbGY7Ci0JcmV0dXJuIHBhcmc7CQorICAgIHBhcmcgPSBuZXdfQ0FyZ09iamVjdCgpOworICAgIGlmIChwYXJnID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgcGFyZy0+dGFnID0gJ1YnOworICAgIHN0Z2RpY3QgPSBQeU9iamVjdF9zdGdkaWN0KChQeU9iamVjdCAqKXNlbGYpOworICAgIGFzc2VydChzdGdkaWN0KTsgLyogQ2Fubm90IGJlIE5VTEwgZm9yIHN0cnVjdHVyZS91bmlvbiBpbnN0YW5jZXMgKi8KKyAgICBwYXJnLT5wZmZpX3R5cGUgPSAmc3RnZGljdC0+ZmZpX3R5cGVfcG9pbnRlcjsKKyAgICAvKiBGb3Igc3RydWN0dXJlIHBhcmFtZXRlcnMgKGJ5IHZhbHVlKSwgcGFyZy0+dmFsdWUgZG9lc24ndCBjb250YWluIHRoZSBzdHJ1Y3R1cmUKKyAgICAgICBkYXRhIGl0c2VsZiwgaW5zdGVhZCBwYXJnLT52YWx1ZS5wICpwb2ludHMqIHRvIHRoZSBzdHJ1Y3R1cmUncyBkYXRhCisgICAgICAgU2VlIGFsc28gX2N0eXBlcy5jLCBmdW5jdGlvbiBfY2FsbF9mdW5jdGlvbl9wb2ludGVyKCkuCisgICAgKi8KKyAgICBwYXJnLT52YWx1ZS5wID0gc2VsZi0+Yl9wdHI7CisgICAgcGFyZy0+c2l6ZSA9IHNlbGYtPmJfc2l6ZTsKKyAgICBQeV9JTkNSRUYoc2VsZik7CisgICAgcGFyZy0+b2JqID0gKFB5T2JqZWN0ICopc2VsZjsKKyAgICByZXR1cm4gcGFyZzsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFN0cnVjdFVuaW9uVHlwZV9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMsIGludCBpc1N0cnVjdCkKIHsKLQlQeVR5cGVPYmplY3QgKnJlc3VsdDsKLQlQeU9iamVjdCAqZmllbGRzOwotCVN0Z0RpY3RPYmplY3QgKmRpY3Q7CisgICAgUHlUeXBlT2JqZWN0ICpyZXN1bHQ7CisgICAgUHlPYmplY3QgKmZpZWxkczsKKyAgICBTdGdEaWN0T2JqZWN0ICpkaWN0OwogCi0JLyogY3JlYXRlIHRoZSBuZXcgaW5zdGFuY2UgKHdoaWNoIGlzIGEgY2xhc3MsCi0JICAgc2luY2Ugd2UgYXJlIGEgbWV0YXR5cGUhKSAqLwotCXJlc3VsdCA9IChQeVR5cGVPYmplY3QgKilQeVR5cGVfVHlwZS50cF9uZXcodHlwZSwgYXJncywga3dkcyk7Ci0JaWYgKCFyZXN1bHQpCi0JCXJldHVybiBOVUxMOworICAgIC8qIGNyZWF0ZSB0aGUgbmV3IGluc3RhbmNlICh3aGljaCBpcyBhIGNsYXNzLAorICAgICAgIHNpbmNlIHdlIGFyZSBhIG1ldGF0eXBlISkgKi8KKyAgICByZXN1bHQgPSAoUHlUeXBlT2JqZWN0ICopUHlUeXBlX1R5cGUudHBfbmV3KHR5cGUsIGFyZ3MsIGt3ZHMpOworICAgIGlmICghcmVzdWx0KQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCS8qIGtlZXAgdGhpcyBmb3IgYncgY29tcGF0aWJpbGl0eSAqLwotCWlmIChQeURpY3RfR2V0SXRlbVN0cmluZyhyZXN1bHQtPnRwX2RpY3QsICJfYWJzdHJhY3RfIikpCi0JCXJldHVybiAoUHlPYmplY3QgKilyZXN1bHQ7CisgICAgLyoga2VlcCB0aGlzIGZvciBidyBjb21wYXRpYmlsaXR5ICovCisgICAgaWYgKFB5RGljdF9HZXRJdGVtU3RyaW5nKHJlc3VsdC0+dHBfZGljdCwgIl9hYnN0cmFjdF8iKSkKKyAgICAgICAgcmV0dXJuIChQeU9iamVjdCAqKXJlc3VsdDsKIAotCWRpY3QgPSAoU3RnRGljdE9iamVjdCAqKVB5T2JqZWN0X0NhbGxPYmplY3QoKFB5T2JqZWN0ICopJlN0Z0RpY3RfVHlwZSwgTlVMTCk7Ci0JaWYgKCFkaWN0KSB7Ci0JCVB5X0RFQ1JFRihyZXN1bHQpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JLyogcmVwbGFjZSB0aGUgY2xhc3MgZGljdCBieSBvdXIgdXBkYXRlZCBzdGdkaWN0LCB3aGljaCBob2xkcyBpbmZvCi0JICAgYWJvdXQgc3RvcmFnZSByZXF1aXJlbWVudHMgb2YgdGhlIGluc3RhbmNlcyAqLwotCWlmICgtMSA9PSBQeURpY3RfVXBkYXRlKChQeU9iamVjdCAqKWRpY3QsIHJlc3VsdC0+dHBfZGljdCkpIHsKLQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCVB5X0RFQ1JFRigoUHlPYmplY3QgKilkaWN0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5X0RFQ1JFRihyZXN1bHQtPnRwX2RpY3QpOwotCXJlc3VsdC0+dHBfZGljdCA9IChQeU9iamVjdCAqKWRpY3Q7Ci0JZGljdC0+Zm9ybWF0ID0gYWxsb2NfZm9ybWF0X3N0cmluZyhOVUxMLCAiQiIpOwotCWlmIChkaWN0LT5mb3JtYXQgPT0gTlVMTCkgewotCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGRpY3QgPSAoU3RnRGljdE9iamVjdCAqKVB5T2JqZWN0X0NhbGxPYmplY3QoKFB5T2JqZWN0ICopJlN0Z0RpY3RfVHlwZSwgTlVMTCk7CisgICAgaWYgKCFkaWN0KSB7CisgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgLyogcmVwbGFjZSB0aGUgY2xhc3MgZGljdCBieSBvdXIgdXBkYXRlZCBzdGdkaWN0LCB3aGljaCBob2xkcyBpbmZvCisgICAgICAgYWJvdXQgc3RvcmFnZSByZXF1aXJlbWVudHMgb2YgdGhlIGluc3RhbmNlcyAqLworICAgIGlmICgtMSA9PSBQeURpY3RfVXBkYXRlKChQeU9iamVjdCAqKWRpY3QsIHJlc3VsdC0+dHBfZGljdCkpIHsKKyAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgIFB5X0RFQ1JFRigoUHlPYmplY3QgKilkaWN0KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5X0RFQ1JFRihyZXN1bHQtPnRwX2RpY3QpOworICAgIHJlc3VsdC0+dHBfZGljdCA9IChQeU9iamVjdCAqKWRpY3Q7CisgICAgZGljdC0+Zm9ybWF0ID0gYWxsb2NfZm9ybWF0X3N0cmluZyhOVUxMLCAiQiIpOworICAgIGlmIChkaWN0LT5mb3JtYXQgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JZGljdC0+cGFyYW1mdW5jID0gU3RydWN0VW5pb25UeXBlX3BhcmFtZnVuYzsKKyAgICBkaWN0LT5wYXJhbWZ1bmMgPSBTdHJ1Y3RVbmlvblR5cGVfcGFyYW1mdW5jOwogCi0JZmllbGRzID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoKFB5T2JqZWN0ICopZGljdCwgIl9maWVsZHNfIik7Ci0JaWYgKCFmaWVsZHMpIHsKLQkJU3RnRGljdE9iamVjdCAqYmFzZWRpY3QgPSBQeVR5cGVfc3RnZGljdCgoUHlPYmplY3QgKilyZXN1bHQtPnRwX2Jhc2UpOworICAgIGZpZWxkcyA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKChQeU9iamVjdCAqKWRpY3QsICJfZmllbGRzXyIpOworICAgIGlmICghZmllbGRzKSB7CisgICAgICAgIFN0Z0RpY3RPYmplY3QgKmJhc2VkaWN0ID0gUHlUeXBlX3N0Z2RpY3QoKFB5T2JqZWN0ICopcmVzdWx0LT50cF9iYXNlKTsKIAotCQlpZiAoYmFzZWRpY3QgPT0gTlVMTCkKLQkJCXJldHVybiAoUHlPYmplY3QgKilyZXN1bHQ7Ci0JCS8qIGNvcHkgYmFzZSBkaWN0ICovCi0JCWlmICgtMSA9PSBTdGdEaWN0X2Nsb25lKGRpY3QsIGJhc2VkaWN0KSkgewotCQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlkaWN0LT5mbGFncyAmPSB+RElDVEZMQUdfRklOQUw7IC8qIGNsZWFyIHRoZSAnZmluYWwnIGZsYWcgaW4gdGhlIHN1YmNsYXNzIGRpY3QgKi8KLQkJYmFzZWRpY3QtPmZsYWdzIHw9IERJQ1RGTEFHX0ZJTkFMOyAvKiBzZXQgdGhlICdmaW5hbCcgZmxhZyBpbiB0aGUgYmFzZWNsYXNzIGRpY3QgKi8KLQkJcmV0dXJuIChQeU9iamVjdCAqKXJlc3VsdDsKLQl9CisgICAgICAgIGlmIChiYXNlZGljdCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIChQeU9iamVjdCAqKXJlc3VsdDsKKyAgICAgICAgLyogY29weSBiYXNlIGRpY3QgKi8KKyAgICAgICAgaWYgKC0xID09IFN0Z0RpY3RfY2xvbmUoZGljdCwgYmFzZWRpY3QpKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGRpY3QtPmZsYWdzICY9IH5ESUNURkxBR19GSU5BTDsgLyogY2xlYXIgdGhlICdmaW5hbCcgZmxhZyBpbiB0aGUgc3ViY2xhc3MgZGljdCAqLworICAgICAgICBiYXNlZGljdC0+ZmxhZ3MgfD0gRElDVEZMQUdfRklOQUw7IC8qIHNldCB0aGUgJ2ZpbmFsJyBmbGFnIGluIHRoZSBiYXNlY2xhc3MgZGljdCAqLworICAgICAgICByZXR1cm4gKFB5T2JqZWN0ICopcmVzdWx0OworICAgIH0KIAotCWlmICgtMSA9PSBQeU9iamVjdF9TZXRBdHRyU3RyaW5nKChQeU9iamVjdCAqKXJlc3VsdCwgIl9maWVsZHNfIiwgZmllbGRzKSkgewotCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiAoUHlPYmplY3QgKilyZXN1bHQ7CisgICAgaWYgKC0xID09IFB5T2JqZWN0X1NldEF0dHJTdHJpbmcoKFB5T2JqZWN0ICopcmVzdWx0LCAiX2ZpZWxkc18iLCBmaWVsZHMpKSB7CisgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIChQeU9iamVjdCAqKXJlc3VsdDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFN0cnVjdFR5cGVfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCXJldHVybiBTdHJ1Y3RVbmlvblR5cGVfbmV3KHR5cGUsIGFyZ3MsIGt3ZHMsIDEpOworICAgIHJldHVybiBTdHJ1Y3RVbmlvblR5cGVfbmV3KHR5cGUsIGFyZ3MsIGt3ZHMsIDEpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogVW5pb25UeXBlX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlyZXR1cm4gU3RydWN0VW5pb25UeXBlX25ldyh0eXBlLCBhcmdzLCBrd2RzLCAwKTsKKyAgICByZXR1cm4gU3RydWN0VW5pb25UeXBlX25ldyh0eXBlLCBhcmdzLCBrd2RzLCAwKTsKIH0KIAogc3RhdGljIGNoYXIgZnJvbV9hZGRyZXNzX2RvY1tdID0KQEAgLTQzNSwxNiArNDM1LDE2IEBACiBzdGF0aWMgUHlPYmplY3QgKgogQ0RhdGFUeXBlX2Zyb21fYWRkcmVzcyhQeU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKnZhbHVlKQogewotCXZvaWQgKmJ1ZjsKLQlpZiAoIVB5SW50X0NoZWNrKHZhbHVlKSAmJiAhUHlMb25nX0NoZWNrKHZhbHVlKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJpbnRlZ2VyIGV4cGVjdGVkIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlidWYgPSAodm9pZCAqKVB5TG9uZ19Bc1ZvaWRQdHIodmFsdWUpOwotCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gQ0RhdGFfQXRBZGRyZXNzKHR5cGUsIGJ1Zik7CisgICAgdm9pZCAqYnVmOworICAgIGlmICghUHlJbnRfQ2hlY2sodmFsdWUpICYmICFQeUxvbmdfQ2hlY2sodmFsdWUpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiaW50ZWdlciBleHBlY3RlZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgYnVmID0gKHZvaWQgKilQeUxvbmdfQXNWb2lkUHRyKHZhbHVlKTsKKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIENEYXRhX0F0QWRkcmVzcyh0eXBlLCBidWYpOwogfQogCiBzdGF0aWMgY2hhciBmcm9tX2J1ZmZlcl9kb2NbXSA9CkBAIC00NTYsNTEgKzQ1Niw1MSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIENEYXRhVHlwZV9mcm9tX2J1ZmZlcihQeU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jdm9pZCAqYnVmZmVyOwotCVB5X3NzaXplX3QgYnVmZmVyX2xlbjsKLQlQeV9zc2l6ZV90IG9mZnNldCA9IDA7Ci0JUHlPYmplY3QgKm9iaiwgKnJlc3VsdDsKLQlTdGdEaWN0T2JqZWN0ICpkaWN0ID0gUHlUeXBlX3N0Z2RpY3QodHlwZSk7Ci0JYXNzZXJ0IChkaWN0KTsKKyAgICB2b2lkICpidWZmZXI7CisgICAgUHlfc3NpemVfdCBidWZmZXJfbGVuOworICAgIFB5X3NzaXplX3Qgb2Zmc2V0ID0gMDsKKyAgICBQeU9iamVjdCAqb2JqLCAqcmVzdWx0OworICAgIFN0Z0RpY3RPYmplY3QgKmRpY3QgPSBQeVR5cGVfc3RnZGljdCh0eXBlKTsKKyAgICBhc3NlcnQgKGRpY3QpOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsCiAjaWYgKFBZX1ZFUlNJT05fSEVYIDwgMHgwMjA1MDAwMCkKLQkJCSAgICAgICJPfGk6ZnJvbV9idWZmZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiT3xpOmZyb21fYnVmZmVyIiwKICNlbHNlCi0JCQkgICAgICAiT3xuOmZyb21fYnVmZmVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIk98bjpmcm9tX2J1ZmZlciIsCiAjZW5kaWYKLQkJCSAgICAgICZvYmosICZvZmZzZXQpKQotCQlyZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm9iaiwgJm9mZnNldCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKC0xID09IFB5T2JqZWN0X0FzV3JpdGVCdWZmZXIob2JqLCAmYnVmZmVyLCAmYnVmZmVyX2xlbikpCi0JCXJldHVybiBOVUxMOworICAgIGlmICgtMSA9PSBQeU9iamVjdF9Bc1dyaXRlQnVmZmVyKG9iaiwgJmJ1ZmZlciwgJmJ1ZmZlcl9sZW4pKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChvZmZzZXQgPCAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJvZmZzZXQgY2Fubm90IGJlIG5lZ2F0aXZlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoZGljdC0+c2l6ZSA+IGJ1ZmZlcl9sZW4gLSBvZmZzZXQpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgaWYgKG9mZnNldCA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAib2Zmc2V0IGNhbm5vdCBiZSBuZWdhdGl2ZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKGRpY3QtPnNpemUgPiBidWZmZXJfbGVuIC0gb2Zmc2V0KSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAogI2lmIChQWV9WRVJTSU9OX0hFWCA8IDB4MDIwNTAwMDApCi0JCQkgICAgICJCdWZmZXIgc2l6ZSB0b28gc21hbGwgKCVkIGluc3RlYWQgb2YgYXQgbGVhc3QgJWQgYnl0ZXMpIiwKKyAgICAgICAgICAgICAgICAgICAgICJCdWZmZXIgc2l6ZSB0b28gc21hbGwgKCVkIGluc3RlYWQgb2YgYXQgbGVhc3QgJWQgYnl0ZXMpIiwKICNlbHNlCi0JCQkgICAgICJCdWZmZXIgc2l6ZSB0b28gc21hbGwgKCV6ZCBpbnN0ZWFkIG9mIGF0IGxlYXN0ICV6ZCBieXRlcykiLAorICAgICAgICAgICAgICAgICAgICAgIkJ1ZmZlciBzaXplIHRvbyBzbWFsbCAoJXpkIGluc3RlYWQgb2YgYXQgbGVhc3QgJXpkIGJ5dGVzKSIsCiAjZW5kaWYKLQkJCSAgICAgYnVmZmVyX2xlbiwgZGljdC0+c2l6ZSArIG9mZnNldCk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcl9sZW4sIGRpY3QtPnNpemUgKyBvZmZzZXQpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlyZXN1bHQgPSBDRGF0YV9BdEFkZHJlc3ModHlwZSwgKGNoYXIgKilidWZmZXIgKyBvZmZzZXQpOwotCWlmIChyZXN1bHQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgcmVzdWx0ID0gQ0RhdGFfQXRBZGRyZXNzKHR5cGUsIChjaGFyICopYnVmZmVyICsgb2Zmc2V0KTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JUHlfSU5DUkVGKG9iaik7Ci0JaWYgKC0xID09IEtlZXBSZWYoKENEYXRhT2JqZWN0ICopcmVzdWx0LCAtMSwgb2JqKSkgewotCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiByZXN1bHQ7CisgICAgUHlfSU5DUkVGKG9iaik7CisgICAgaWYgKC0xID09IEtlZXBSZWYoKENEYXRhT2JqZWN0ICopcmVzdWx0LCAtMSwgb2JqKSkgeworICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBjaGFyIGZyb21fYnVmZmVyX2NvcHlfZG9jW10gPQpAQCAtNTEyLDQ4ICs1MTIsNDggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBDRGF0YVR5cGVfZnJvbV9idWZmZXJfY29weShQeU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY29uc3Qgdm9pZCAqYnVmZmVyOwotCVB5X3NzaXplX3QgYnVmZmVyX2xlbjsKLQlQeV9zc2l6ZV90IG9mZnNldCA9IDA7Ci0JUHlPYmplY3QgKm9iaiwgKnJlc3VsdDsKLQlTdGdEaWN0T2JqZWN0ICpkaWN0ID0gUHlUeXBlX3N0Z2RpY3QodHlwZSk7Ci0JYXNzZXJ0IChkaWN0KTsKKyAgICBjb25zdCB2b2lkICpidWZmZXI7CisgICAgUHlfc3NpemVfdCBidWZmZXJfbGVuOworICAgIFB5X3NzaXplX3Qgb2Zmc2V0ID0gMDsKKyAgICBQeU9iamVjdCAqb2JqLCAqcmVzdWx0OworICAgIFN0Z0RpY3RPYmplY3QgKmRpY3QgPSBQeVR5cGVfc3RnZGljdCh0eXBlKTsKKyAgICBhc3NlcnQgKGRpY3QpOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsCiAjaWYgKFBZX1ZFUlNJT05fSEVYIDwgMHgwMjA1MDAwMCkKLQkJCSAgICAgICJPfGk6ZnJvbV9idWZmZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiT3xpOmZyb21fYnVmZmVyIiwKICNlbHNlCi0JCQkgICAgICAiT3xuOmZyb21fYnVmZmVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIk98bjpmcm9tX2J1ZmZlciIsCiAjZW5kaWYKLQkJCSAgICAgICZvYmosICZvZmZzZXQpKQotCQlyZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm9iaiwgJm9mZnNldCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKC0xID09IFB5T2JqZWN0X0FzUmVhZEJ1ZmZlcihvYmosICZidWZmZXIsICZidWZmZXJfbGVuKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKC0xID09IFB5T2JqZWN0X0FzUmVhZEJ1ZmZlcihvYmosICZidWZmZXIsICZidWZmZXJfbGVuKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAob2Zmc2V0IDwgMCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkib2Zmc2V0IGNhbm5vdCBiZSBuZWdhdGl2ZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKG9mZnNldCA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAib2Zmc2V0IGNhbm5vdCBiZSBuZWdhdGl2ZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlpZiAoZGljdC0+c2l6ZSA+IGJ1ZmZlcl9sZW4gLSBvZmZzZXQpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgaWYgKGRpY3QtPnNpemUgPiBidWZmZXJfbGVuIC0gb2Zmc2V0KSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAogI2lmIChQWV9WRVJTSU9OX0hFWCA8IDB4MDIwNTAwMDApCi0JCQkgICAgICJCdWZmZXIgc2l6ZSB0b28gc21hbGwgKCVkIGluc3RlYWQgb2YgYXQgbGVhc3QgJWQgYnl0ZXMpIiwKKyAgICAgICAgICAgICAgICAgICAgICJCdWZmZXIgc2l6ZSB0b28gc21hbGwgKCVkIGluc3RlYWQgb2YgYXQgbGVhc3QgJWQgYnl0ZXMpIiwKICNlbHNlCi0JCQkgICAgICJCdWZmZXIgc2l6ZSB0b28gc21hbGwgKCV6ZCBpbnN0ZWFkIG9mIGF0IGxlYXN0ICV6ZCBieXRlcykiLAorICAgICAgICAgICAgICAgICAgICAgIkJ1ZmZlciBzaXplIHRvbyBzbWFsbCAoJXpkIGluc3RlYWQgb2YgYXQgbGVhc3QgJXpkIGJ5dGVzKSIsCiAjZW5kaWYKLQkJCSAgICAgYnVmZmVyX2xlbiwgZGljdC0+c2l6ZSArIG9mZnNldCk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcl9sZW4sIGRpY3QtPnNpemUgKyBvZmZzZXQpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlyZXN1bHQgPSBHZW5lcmljQ0RhdGFfbmV3KChQeVR5cGVPYmplY3QgKil0eXBlLCBOVUxMLCBOVUxMKTsKLQlpZiAocmVzdWx0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCW1lbWNweSgoKENEYXRhT2JqZWN0ICopcmVzdWx0KS0+Yl9wdHIsCi0JICAgICAgIChjaGFyICopYnVmZmVyK29mZnNldCwgZGljdC0+c2l6ZSk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICByZXN1bHQgPSBHZW5lcmljQ0RhdGFfbmV3KChQeVR5cGVPYmplY3QgKil0eXBlLCBOVUxMLCBOVUxMKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG1lbWNweSgoKENEYXRhT2JqZWN0ICopcmVzdWx0KS0+Yl9wdHIsCisgICAgICAgICAgIChjaGFyICopYnVmZmVyK29mZnNldCwgZGljdC0+c2l6ZSk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIGNoYXIgaW5fZGxsX2RvY1tdID0KQEAgLTU2Miw1NSArNTYyLDU1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogQ0RhdGFUeXBlX2luX2RsbChQeU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKmRsbDsKLQljaGFyICpuYW1lOwotCVB5T2JqZWN0ICpvYmo7Ci0Jdm9pZCAqaGFuZGxlOwotCXZvaWQgKmFkZHJlc3M7CisgICAgUHlPYmplY3QgKmRsbDsKKyAgICBjaGFyICpuYW1lOworICAgIFB5T2JqZWN0ICpvYmo7CisgICAgdm9pZCAqaGFuZGxlOworICAgIHZvaWQgKmFkZHJlc3M7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9zOmluX2RsbCIsICZkbGwsICZuYW1lKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPczppbl9kbGwiLCAmZGxsLCAmbmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0Jb2JqID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhkbGwsICJfaGFuZGxlIik7Ci0JaWYgKCFvYmopCi0JCXJldHVybiBOVUxMOwotCWlmICghUHlJbnRfQ2hlY2sob2JqKSAmJiAhUHlMb25nX0NoZWNrKG9iaikpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkidGhlIF9oYW5kbGUgYXR0cmlidXRlIG9mIHRoZSBzZWNvbmQgYXJndW1lbnQgbXVzdCBiZSBhbiBpbnRlZ2VyIik7Ci0JCVB5X0RFQ1JFRihvYmopOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaGFuZGxlID0gKHZvaWQgKilQeUxvbmdfQXNWb2lkUHRyKG9iaik7Ci0JUHlfREVDUkVGKG9iaik7Ci0JaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJImNvdWxkIG5vdCBjb252ZXJ0IHRoZSBfaGFuZGxlIGF0dHJpYnV0ZSB0byBhIHBvaW50ZXIiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIG9iaiA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoZGxsLCAiX2hhbmRsZSIpOworICAgIGlmICghb2JqKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5SW50X0NoZWNrKG9iaikgJiYgIVB5TG9uZ19DaGVjayhvYmopKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAidGhlIF9oYW5kbGUgYXR0cmlidXRlIG9mIHRoZSBzZWNvbmQgYXJndW1lbnQgbXVzdCBiZSBhbiBpbnRlZ2VyIik7CisgICAgICAgIFB5X0RFQ1JFRihvYmopOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaGFuZGxlID0gKHZvaWQgKilQeUxvbmdfQXNWb2lkUHRyKG9iaik7CisgICAgUHlfREVDUkVGKG9iaik7CisgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiY291bGQgbm90IGNvbnZlcnQgdGhlIF9oYW5kbGUgYXR0cmlidXRlIHRvIGEgcG9pbnRlciIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKICNpZmRlZiBNU19XSU4zMgotCWFkZHJlc3MgPSAodm9pZCAqKUdldFByb2NBZGRyZXNzKGhhbmRsZSwgbmFtZSk7Ci0JaWYgKCFhZGRyZXNzKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAotCQkJICAgICAic3ltYm9sICclcycgbm90IGZvdW5kIiwKLQkJCSAgICAgbmFtZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBhZGRyZXNzID0gKHZvaWQgKilHZXRQcm9jQWRkcmVzcyhoYW5kbGUsIG5hbWUpOworICAgIGlmICghYWRkcmVzcykgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJzeW1ib2wgJyVzJyBub3QgZm91bmQiLAorICAgICAgICAgICAgICAgICAgICAgbmFtZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KICNlbHNlCi0JYWRkcmVzcyA9ICh2b2lkICopY3R5cGVzX2Rsc3ltKGhhbmRsZSwgbmFtZSk7Ci0JaWYgKCFhZGRyZXNzKSB7CisgICAgYWRkcmVzcyA9ICh2b2lkICopY3R5cGVzX2Rsc3ltKGhhbmRsZSwgbmFtZSk7CisgICAgaWYgKCFhZGRyZXNzKSB7CiAjaWZkZWYgX19DWUdXSU5fXwogLyogZGxlcnJvcigpIGlzbid0IHZlcnkgaGVscGZ1bCBvbiBjeWd3aW4gKi8KLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkgICAgICJzeW1ib2wgJyVzJyBub3QgZm91bmQgKCVzKSAiLAotCQkJICAgICBuYW1lKTsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAic3ltYm9sICclcycgbm90IGZvdW5kICglcykgIiwKKyAgICAgICAgICAgICAgICAgICAgIG5hbWUpOwogI2Vsc2UKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsIGN0eXBlc19kbGVycm9yKCkpOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgY3R5cGVzX2RsZXJyb3IoKSk7CiAjZW5kaWYKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAjZW5kaWYKLQlyZXR1cm4gQ0RhdGFfQXRBZGRyZXNzKHR5cGUsIGFkZHJlc3MpOworICAgIHJldHVybiBDRGF0YV9BdEFkZHJlc3ModHlwZSwgYWRkcmVzcyk7CiB9CiAKIHN0YXRpYyBjaGFyIGZyb21fcGFyYW1fZG9jW10gPQpAQCAtNjE5LDIxMyArNjE5LDIxMyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIENEYXRhVHlwZV9mcm9tX3BhcmFtKFB5T2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqdmFsdWUpCiB7Ci0JUHlPYmplY3QgKmFzX3BhcmFtZXRlcjsKLQlpZiAoMSA9PSBQeU9iamVjdF9Jc0luc3RhbmNlKHZhbHVlLCB0eXBlKSkgewotCQlQeV9JTkNSRUYodmFsdWUpOwotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCWlmIChQeUNBcmdfQ2hlY2tFeGFjdCh2YWx1ZSkpIHsKLQkJUHlDQXJnT2JqZWN0ICpwID0gKFB5Q0FyZ09iamVjdCAqKXZhbHVlOwotCQlQeU9iamVjdCAqb2IgPSBwLT5vYmo7Ci0JCWNvbnN0IGNoYXIgKm9iX25hbWU7Ci0JCVN0Z0RpY3RPYmplY3QgKmRpY3Q7Ci0JCWRpY3QgPSBQeVR5cGVfc3RnZGljdCh0eXBlKTsKKyAgICBQeU9iamVjdCAqYXNfcGFyYW1ldGVyOworICAgIGlmICgxID09IFB5T2JqZWN0X0lzSW5zdGFuY2UodmFsdWUsIHR5cGUpKSB7CisgICAgICAgIFB5X0lOQ1JFRih2YWx1ZSk7CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisgICAgaWYgKFB5Q0FyZ19DaGVja0V4YWN0KHZhbHVlKSkgeworICAgICAgICBQeUNBcmdPYmplY3QgKnAgPSAoUHlDQXJnT2JqZWN0ICopdmFsdWU7CisgICAgICAgIFB5T2JqZWN0ICpvYiA9IHAtPm9iajsKKyAgICAgICAgY29uc3QgY2hhciAqb2JfbmFtZTsKKyAgICAgICAgU3RnRGljdE9iamVjdCAqZGljdDsKKyAgICAgICAgZGljdCA9IFB5VHlwZV9zdGdkaWN0KHR5cGUpOwogCi0JCS8qIElmIHdlIGdvdCBhIFB5Q0FyZ09iamVjdCwgd2UgbXVzdCBjaGVjayBpZiB0aGUgb2JqZWN0IHBhY2tlZCBpbiBpdAotCQkgICBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgdHlwZSdzIGRpY3QtPnByb3RvICovCi0JCWlmKGRpY3QgJiYgb2IKLQkJICAgJiYgUHlPYmplY3RfSXNJbnN0YW5jZShvYiwgZGljdC0+cHJvdG8pKSB7Ci0JCQlQeV9JTkNSRUYodmFsdWUpOwotCQkJcmV0dXJuIHZhbHVlOwotCQl9Ci0JCW9iX25hbWUgPSAob2IpID8gUHlfVFlQRShvYiktPnRwX25hbWUgOiAiPz8/IjsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAgImV4cGVjdGVkICVzIGluc3RhbmNlIGluc3RlYWQgb2YgcG9pbnRlciB0byAlcyIsCi0JCQkgICAgICgoUHlUeXBlT2JqZWN0ICopdHlwZSktPnRwX25hbWUsIG9iX25hbWUpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgICAgIC8qIElmIHdlIGdvdCBhIFB5Q0FyZ09iamVjdCwgd2UgbXVzdCBjaGVjayBpZiB0aGUgb2JqZWN0IHBhY2tlZCBpbiBpdAorICAgICAgICAgICBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgdHlwZSdzIGRpY3QtPnByb3RvICovCisgICAgICAgIGlmKGRpY3QgJiYgb2IKKyAgICAgICAgICAgJiYgUHlPYmplY3RfSXNJbnN0YW5jZShvYiwgZGljdC0+cHJvdG8pKSB7CisgICAgICAgICAgICBQeV9JTkNSRUYodmFsdWUpOworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisgICAgICAgIG9iX25hbWUgPSAob2IpID8gUHlfVFlQRShvYiktPnRwX25hbWUgOiAiPz8/IjsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCAlcyBpbnN0YW5jZSBpbnN0ZWFkIG9mIHBvaW50ZXIgdG8gJXMiLAorICAgICAgICAgICAgICAgICAgICAgKChQeVR5cGVPYmplY3QgKil0eXBlKS0+dHBfbmFtZSwgb2JfbmFtZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWFzX3BhcmFtZXRlciA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcodmFsdWUsICJfYXNfcGFyYW1ldGVyXyIpOwotCWlmIChhc19wYXJhbWV0ZXIpIHsKLQkJdmFsdWUgPSBDRGF0YVR5cGVfZnJvbV9wYXJhbSh0eXBlLCBhc19wYXJhbWV0ZXIpOwotCQlQeV9ERUNSRUYoYXNfcGFyYW1ldGVyKTsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkgICAgICJleHBlY3RlZCAlcyBpbnN0YW5jZSBpbnN0ZWFkIG9mICVzIiwKLQkJICAgICAoKFB5VHlwZU9iamVjdCAqKXR5cGUpLT50cF9uYW1lLAotCQkgICAgIFB5X1RZUEUodmFsdWUpLT50cF9uYW1lKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBhc19wYXJhbWV0ZXIgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHZhbHVlLCAiX2FzX3BhcmFtZXRlcl8iKTsKKyAgICBpZiAoYXNfcGFyYW1ldGVyKSB7CisgICAgICAgIHZhbHVlID0gQ0RhdGFUeXBlX2Zyb21fcGFyYW0odHlwZSwgYXNfcGFyYW1ldGVyKTsKKyAgICAgICAgUHlfREVDUkVGKGFzX3BhcmFtZXRlcik7CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgImV4cGVjdGVkICVzIGluc3RhbmNlIGluc3RlYWQgb2YgJXMiLAorICAgICAgICAgICAgICAgICAoKFB5VHlwZU9iamVjdCAqKXR5cGUpLT50cF9uYW1lLAorICAgICAgICAgICAgICAgICBQeV9UWVBFKHZhbHVlKS0+dHBfbmFtZSk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBDRGF0YVR5cGVfbWV0aG9kc1tdID0gewotCXsgImZyb21fcGFyYW0iLCBDRGF0YVR5cGVfZnJvbV9wYXJhbSwgTUVUSF9PLCBmcm9tX3BhcmFtX2RvYyB9LAotCXsgImZyb21fYWRkcmVzcyIsIENEYXRhVHlwZV9mcm9tX2FkZHJlc3MsIE1FVEhfTywgZnJvbV9hZGRyZXNzX2RvYyB9LAotCXsgImZyb21fYnVmZmVyIiwgQ0RhdGFUeXBlX2Zyb21fYnVmZmVyLCBNRVRIX1ZBUkFSR1MsIGZyb21fYnVmZmVyX2RvYywgfSwKLQl7ICJmcm9tX2J1ZmZlcl9jb3B5IiwgQ0RhdGFUeXBlX2Zyb21fYnVmZmVyX2NvcHksIE1FVEhfVkFSQVJHUywgZnJvbV9idWZmZXJfY29weV9kb2MsIH0sCi0JeyAiaW5fZGxsIiwgQ0RhdGFUeXBlX2luX2RsbCwgTUVUSF9WQVJBUkdTLCBpbl9kbGxfZG9jIH0sCi0JeyBOVUxMLCBOVUxMIH0sCisgICAgeyAiZnJvbV9wYXJhbSIsIENEYXRhVHlwZV9mcm9tX3BhcmFtLCBNRVRIX08sIGZyb21fcGFyYW1fZG9jIH0sCisgICAgeyAiZnJvbV9hZGRyZXNzIiwgQ0RhdGFUeXBlX2Zyb21fYWRkcmVzcywgTUVUSF9PLCBmcm9tX2FkZHJlc3NfZG9jIH0sCisgICAgeyAiZnJvbV9idWZmZXIiLCBDRGF0YVR5cGVfZnJvbV9idWZmZXIsIE1FVEhfVkFSQVJHUywgZnJvbV9idWZmZXJfZG9jLCB9LAorICAgIHsgImZyb21fYnVmZmVyX2NvcHkiLCBDRGF0YVR5cGVfZnJvbV9idWZmZXJfY29weSwgTUVUSF9WQVJBUkdTLCBmcm9tX2J1ZmZlcl9jb3B5X2RvYywgfSwKKyAgICB7ICJpbl9kbGwiLCBDRGF0YVR5cGVfaW5fZGxsLCBNRVRIX1ZBUkFSR1MsIGluX2RsbF9kb2MgfSwKKyAgICB7IE5VTEwsIE5VTEwgfSwKIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBDRGF0YVR5cGVfcmVwZWF0KFB5T2JqZWN0ICpzZWxmLCBQeV9zc2l6ZV90IGxlbmd0aCkKIHsKLQlpZiAobGVuZ3RoIDwgMCkKLQkJcmV0dXJuIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAorICAgIGlmIChsZW5ndGggPCAwKQorICAgICAgICByZXR1cm4gUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCiAjaWYgKFBZX1ZFUlNJT05fSEVYIDwgMHgwMjA1MDAwMCkKLQkJCQkgICAgIkFycmF5IGxlbmd0aCBtdXN0IGJlID49IDAsIG5vdCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFycmF5IGxlbmd0aCBtdXN0IGJlID49IDAsIG5vdCAlZCIsCiAjZWxzZQotCQkJCSAgICAiQXJyYXkgbGVuZ3RoIG11c3QgYmUgPj0gMCwgbm90ICV6ZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFycmF5IGxlbmd0aCBtdXN0IGJlID49IDAsIG5vdCAlemQiLAogI2VuZGlmCi0JCQkJICAgIGxlbmd0aCk7Ci0JcmV0dXJuIENyZWF0ZUFycmF5VHlwZShzZWxmLCBsZW5ndGgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCk7CisgICAgcmV0dXJuIENyZWF0ZUFycmF5VHlwZShzZWxmLCBsZW5ndGgpOwogfQogCiBzdGF0aWMgUHlTZXF1ZW5jZU1ldGhvZHMgQ0RhdGFUeXBlX2FzX3NlcXVlbmNlID0gewotCTAsCQkJLyogaW5xdWlyeSBzcV9sZW5ndGg7ICovCi0JMCwJCQkvKiBiaW5hcnlmdW5jIHNxX2NvbmNhdDsgKi8KLQlDRGF0YVR5cGVfcmVwZWF0LAkvKiBpbnRhcmdmdW5jIHNxX3JlcGVhdDsgKi8KLQkwLAkJCS8qIGludGFyZ2Z1bmMgc3FfaXRlbTsgKi8KLQkwLAkJCS8qIGludGludGFyZ2Z1bmMgc3Ffc2xpY2U7ICovCi0JMCwJCQkvKiBpbnRvYmphcmdwcm9jIHNxX2Fzc19pdGVtOyAqLwotCTAsCQkJLyogaW50aW50b2JqYXJncHJvYyBzcV9hc3Nfc2xpY2U7ICovCi0JMCwJCQkvKiBvYmpvYmpwcm9jIHNxX2NvbnRhaW5zOyAqLwotCQotCTAsCQkJLyogYmluYXJ5ZnVuYyBzcV9pbnBsYWNlX2NvbmNhdDsgKi8KLQkwLAkJCS8qIGludGFyZ2Z1bmMgc3FfaW5wbGFjZV9yZXBlYXQ7ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlucXVpcnkgc3FfbGVuZ3RoOyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBiaW5hcnlmdW5jIHNxX2NvbmNhdDsgKi8KKyAgICBDRGF0YVR5cGVfcmVwZWF0LCAgICAgICAgICAgLyogaW50YXJnZnVuYyBzcV9yZXBlYXQ7ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGludGFyZ2Z1bmMgc3FfaXRlbTsgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW50aW50YXJnZnVuYyBzcV9zbGljZTsgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW50b2JqYXJncHJvYyBzcV9hc3NfaXRlbTsgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW50aW50b2JqYXJncHJvYyBzcV9hc3Nfc2xpY2U7ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9iam9ianByb2Mgc3FfY29udGFpbnM7ICovCisKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYmluYXJ5ZnVuYyBzcV9pbnBsYWNlX2NvbmNhdDsgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW50YXJnZnVuYyBzcV9pbnBsYWNlX3JlcGVhdDsgKi8KIH07CiAKIHN0YXRpYyBpbnQKIENEYXRhVHlwZV9jbGVhcihQeVR5cGVPYmplY3QgKnNlbGYpCiB7Ci0JU3RnRGljdE9iamVjdCAqZGljdCA9IFB5VHlwZV9zdGdkaWN0KChQeU9iamVjdCAqKXNlbGYpOwotCWlmIChkaWN0KQotCQlQeV9DTEVBUihkaWN0LT5wcm90byk7Ci0JcmV0dXJuIFB5VHlwZV9UeXBlLnRwX2NsZWFyKChQeU9iamVjdCAqKXNlbGYpOworICAgIFN0Z0RpY3RPYmplY3QgKmRpY3QgPSBQeVR5cGVfc3RnZGljdCgoUHlPYmplY3QgKilzZWxmKTsKKyAgICBpZiAoZGljdCkKKyAgICAgICAgUHlfQ0xFQVIoZGljdC0+cHJvdG8pOworICAgIHJldHVybiBQeVR5cGVfVHlwZS50cF9jbGVhcigoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIGludAogQ0RhdGFUeXBlX3RyYXZlcnNlKFB5VHlwZU9iamVjdCAqc2VsZiwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JU3RnRGljdE9iamVjdCAqZGljdCA9IFB5VHlwZV9zdGdkaWN0KChQeU9iamVjdCAqKXNlbGYpOwotCWlmIChkaWN0KQotCQlQeV9WSVNJVChkaWN0LT5wcm90byk7Ci0JcmV0dXJuIFB5VHlwZV9UeXBlLnRwX3RyYXZlcnNlKChQeU9iamVjdCAqKXNlbGYsIHZpc2l0LCBhcmcpOworICAgIFN0Z0RpY3RPYmplY3QgKmRpY3QgPSBQeVR5cGVfc3RnZGljdCgoUHlPYmplY3QgKilzZWxmKTsKKyAgICBpZiAoZGljdCkKKyAgICAgICAgUHlfVklTSVQoZGljdC0+cHJvdG8pOworICAgIHJldHVybiBQeVR5cGVfVHlwZS50cF90cmF2ZXJzZSgoUHlPYmplY3QgKilzZWxmLCB2aXNpdCwgYXJnKTsKIH0KIAogc3RhdGljIGludAogU3RydWN0VHlwZV9zZXRhdHRybyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmtleSwgUHlPYmplY3QgKnZhbHVlKQogewotCS8qIFhYWCBTaG91bGQgd2UgZGlzYWxsb3cgZGVsZXRpbmcgX2ZpZWxkc18/ICovCi0JaWYgKC0xID09IFB5VHlwZV9UeXBlLnRwX3NldGF0dHJvKHNlbGYsIGtleSwgdmFsdWUpKQotCQlyZXR1cm4gLTE7Ci0JCi0JaWYgKHZhbHVlICYmIFB5U3RyaW5nX0NoZWNrKGtleSkgJiYKLQkgICAgMCA9PSBzdHJjbXAoUHlTdHJpbmdfQVNfU1RSSU5HKGtleSksICJfZmllbGRzXyIpKQotCQlyZXR1cm4gU3RydWN0VW5pb25UeXBlX3VwZGF0ZV9zdGdkaWN0KHNlbGYsIHZhbHVlLCAxKTsKLQlyZXR1cm4gMDsKKyAgICAvKiBYWFggU2hvdWxkIHdlIGRpc2FsbG93IGRlbGV0aW5nIF9maWVsZHNfPyAqLworICAgIGlmICgtMSA9PSBQeVR5cGVfVHlwZS50cF9zZXRhdHRybyhzZWxmLCBrZXksIHZhbHVlKSkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgaWYgKHZhbHVlICYmIFB5U3RyaW5nX0NoZWNrKGtleSkgJiYKKyAgICAgICAgMCA9PSBzdHJjbXAoUHlTdHJpbmdfQVNfU1RSSU5HKGtleSksICJfZmllbGRzXyIpKQorICAgICAgICByZXR1cm4gU3RydWN0VW5pb25UeXBlX3VwZGF0ZV9zdGdkaWN0KHNlbGYsIHZhbHVlLCAxKTsKKyAgICByZXR1cm4gMDsKIH0KIAogCiBzdGF0aWMgaW50CiBVbmlvblR5cGVfc2V0YXR0cm8oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICprZXksIFB5T2JqZWN0ICp2YWx1ZSkKIHsKLQkvKiBYWFggU2hvdWxkIHdlIGRpc2FsbG93IGRlbGV0aW5nIF9maWVsZHNfPyAqLwotCWlmICgtMSA9PSBQeU9iamVjdF9HZW5lcmljU2V0QXR0cihzZWxmLCBrZXksIHZhbHVlKSkKLQkJcmV0dXJuIC0xOwotCQotCWlmIChQeVN0cmluZ19DaGVjayhrZXkpICYmCi0JICAgIDAgPT0gc3RyY21wKFB5U3RyaW5nX0FTX1NUUklORyhrZXkpLCAiX2ZpZWxkc18iKSkKLQkJcmV0dXJuIFN0cnVjdFVuaW9uVHlwZV91cGRhdGVfc3RnZGljdChzZWxmLCB2YWx1ZSwgMCk7Ci0JcmV0dXJuIDA7CisgICAgLyogWFhYIFNob3VsZCB3ZSBkaXNhbGxvdyBkZWxldGluZyBfZmllbGRzXz8gKi8KKyAgICBpZiAoLTEgPT0gUHlPYmplY3RfR2VuZXJpY1NldEF0dHIoc2VsZiwga2V5LCB2YWx1ZSkpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGlmIChQeVN0cmluZ19DaGVjayhrZXkpICYmCisgICAgICAgIDAgPT0gc3RyY21wKFB5U3RyaW5nX0FTX1NUUklORyhrZXkpLCAiX2ZpZWxkc18iKSkKKyAgICAgICAgcmV0dXJuIFN0cnVjdFVuaW9uVHlwZV91cGRhdGVfc3RnZGljdChzZWxmLCB2YWx1ZSwgMCk7CisgICAgcmV0dXJuIDA7CiB9CiAKIAogUHlUeXBlT2JqZWN0IFN0cnVjdFR5cGVfVHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKLQkiX2N0eXBlcy5TdHJ1Y3RUeXBlIiwJCQkvKiB0cF9uYW1lICovCi0JMCwJCQkJCS8qIHRwX2Jhc2ljc2l6ZSAqLwotCTAsCQkJCQkvKiB0cF9pdGVtc2l6ZSAqLwotCTAsCQkJCQkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9jb21wYXJlICovCi0JMCwJCQkgICAgICAgCQkvKiB0cF9yZXByICovCi0JMCwJCQkJCS8qIHRwX2FzX251bWJlciAqLwotCSZDRGF0YVR5cGVfYXNfc2VxdWVuY2UsCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkJLyogdHBfc3RyICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHJvICovCi0JU3RydWN0VHlwZV9zZXRhdHRybywJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFIHwgUHlfVFBGTEFHU19IQVZFX0dDLCAvKiB0cF9mbGFncyAqLwotCSJtZXRhdHlwZSBmb3IgdGhlIENEYXRhIE9iamVjdHMiLAkvKiB0cF9kb2MgKi8KLQkodHJhdmVyc2Vwcm9jKUNEYXRhVHlwZV90cmF2ZXJzZSwJLyogdHBfdHJhdmVyc2UgKi8KLQkoaW5xdWlyeSlDRGF0YVR5cGVfY2xlYXIsCQkvKiB0cF9jbGVhciAqLwotCTAsCQkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCTAsCQkJCQkvKiB0cF9pdGVyICovCi0JMCwJCQkJCS8qIHRwX2l0ZXJuZXh0ICovCi0JQ0RhdGFUeXBlX21ldGhvZHMsCQkJLyogdHBfbWV0aG9kcyAqLwotCTAsCQkJCQkvKiB0cF9tZW1iZXJzICovCi0JMCwJCQkJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJCS8qIHRwX2RpY3QgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2luaXQgKi8KLQkwLAkJCQkJLyogdHBfYWxsb2MgKi8KLQlTdHJ1Y3RUeXBlX25ldywJCQkJLyogdHBfbmV3ICovCi0JMCwJCQkJCS8qIHRwX2ZyZWUgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAiX2N0eXBlcy5TdHJ1Y3RUeXBlIiwgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAmQ0RhdGFUeXBlX2FzX3NlcXVlbmNlLCAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgU3RydWN0VHlwZV9zZXRhdHRybywgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19CQVNFVFlQRSB8IFB5X1RQRkxBR1NfSEFWRV9HQywgLyogdHBfZmxhZ3MgKi8KKyAgICAibWV0YXR5cGUgZm9yIHRoZSBDRGF0YSBPYmplY3RzIiwgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2MpQ0RhdGFUeXBlX3RyYXZlcnNlLCAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAoaW5xdWlyeSlDRGF0YVR5cGVfY2xlYXIsICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgQ0RhdGFUeXBlX21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIFN0cnVjdFR5cGVfbmV3LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCiB9OwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IFVuaW9uVHlwZV9UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotCSJfY3R5cGVzLlVuaW9uVHlwZSIsCQkJLyogdHBfbmFtZSAqLwotCTAsCQkJCQkvKiB0cF9iYXNpY3NpemUgKi8KLQkwLAkJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkwLAkJCQkJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfY29tcGFyZSAqLwotCTAsCQkJICAgICAgIAkJLyogdHBfcmVwciAqLwotCTAsCQkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkmQ0RhdGFUeXBlX2FzX3NlcXVlbmNlLAkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkJLyogdHBfc3RyICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHJvICovCi0JVW5pb25UeXBlX3NldGF0dHJvLAkJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfQkFTRVRZUEUgfCBQeV9UUEZMQUdTX0hBVkVfR0MsIC8qIHRwX2ZsYWdzICovCi0JIm1ldGF0eXBlIGZvciB0aGUgQ0RhdGEgT2JqZWN0cyIsCS8qIHRwX2RvYyAqLwotCSh0cmF2ZXJzZXByb2MpQ0RhdGFUeXBlX3RyYXZlcnNlLAkvKiB0cF90cmF2ZXJzZSAqLwotCShpbnF1aXJ5KUNEYXRhVHlwZV9jbGVhciwJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkJLyogdHBfaXRlcm5leHQgKi8KLQlDRGF0YVR5cGVfbWV0aG9kcywJCQkvKiB0cF9tZXRob2RzICovCi0JMCwJCQkJCS8qIHRwX21lbWJlcnMgKi8KLQkwLAkJCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaW5pdCAqLwotCTAsCQkJCQkvKiB0cF9hbGxvYyAqLwotCVVuaW9uVHlwZV9uZXcsCQkJCS8qIHRwX25ldyAqLwotCTAsCQkJCQkvKiB0cF9mcmVlICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisgICAgIl9jdHlwZXMuVW5pb25UeXBlIiwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgJkNEYXRhVHlwZV9hc19zZXF1ZW5jZSwgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICBVbmlvblR5cGVfc2V0YXR0cm8sICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFIHwgUHlfVFBGTEFHU19IQVZFX0dDLCAvKiB0cF9mbGFncyAqLworICAgICJtZXRhdHlwZSBmb3IgdGhlIENEYXRhIE9iamVjdHMiLCAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgKHRyYXZlcnNlcHJvYylDRGF0YVR5cGVfdHJhdmVyc2UsICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIChpbnF1aXJ5KUNEYXRhVHlwZV9jbGVhciwgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICBDRGF0YVR5cGVfbWV0aG9kcywgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgVW5pb25UeXBlX25ldywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KIH07CiAKLQwKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKQEAgLTg0NSwxMjQgKzg0NSwxMjQgQEAKIHN0YXRpYyBpbnQKIFBvaW50ZXJUeXBlX1NldFByb3RvKFN0Z0RpY3RPYmplY3QgKnN0Z2RpY3QsIFB5T2JqZWN0ICpwcm90bykKIHsKLQlpZiAoIXByb3RvIHx8ICFQeVR5cGVfQ2hlY2socHJvdG8pKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJIl90eXBlXyBtdXN0IGJlIGEgdHlwZSIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmICghUHlUeXBlX3N0Z2RpY3QocHJvdG8pKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJIl90eXBlXyBtdXN0IGhhdmUgc3RvcmFnZSBpbmZvIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JUHlfSU5DUkVGKHByb3RvKTsKLQlQeV9YREVDUkVGKHN0Z2RpY3QtPnByb3RvKTsKLQlzdGdkaWN0LT5wcm90byA9IHByb3RvOwotCXJldHVybiAwOworICAgIGlmICghcHJvdG8gfHwgIVB5VHlwZV9DaGVjayhwcm90bykpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJfdHlwZV8gbXVzdCBiZSBhIHR5cGUiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoIVB5VHlwZV9zdGdkaWN0KHByb3RvKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIl90eXBlXyBtdXN0IGhhdmUgc3RvcmFnZSBpbmZvIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgUHlfSU5DUkVGKHByb3RvKTsKKyAgICBQeV9YREVDUkVGKHN0Z2RpY3QtPnByb3RvKTsKKyAgICBzdGdkaWN0LT5wcm90byA9IHByb3RvOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlDQXJnT2JqZWN0ICoKIFBvaW50ZXJUeXBlX3BhcmFtZnVuYyhDRGF0YU9iamVjdCAqc2VsZikKIHsKLQlQeUNBcmdPYmplY3QgKnBhcmc7CisgICAgUHlDQXJnT2JqZWN0ICpwYXJnOwogCi0JcGFyZyA9IG5ld19DQXJnT2JqZWN0KCk7Ci0JaWYgKHBhcmcgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgcGFyZyA9IG5ld19DQXJnT2JqZWN0KCk7CisgICAgaWYgKHBhcmcgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlwYXJnLT50YWcgPSAnUCc7Ci0JcGFyZy0+cGZmaV90eXBlID0gJmZmaV90eXBlX3BvaW50ZXI7Ci0JUHlfSU5DUkVGKHNlbGYpOwotCXBhcmctPm9iaiA9IChQeU9iamVjdCAqKXNlbGY7Ci0JcGFyZy0+dmFsdWUucCA9ICoodm9pZCAqKilzZWxmLT5iX3B0cjsKLQlyZXR1cm4gcGFyZzsKKyAgICBwYXJnLT50YWcgPSAnUCc7CisgICAgcGFyZy0+cGZmaV90eXBlID0gJmZmaV90eXBlX3BvaW50ZXI7CisgICAgUHlfSU5DUkVGKHNlbGYpOworICAgIHBhcmctPm9iaiA9IChQeU9iamVjdCAqKXNlbGY7CisgICAgcGFyZy0+dmFsdWUucCA9ICoodm9pZCAqKilzZWxmLT5iX3B0cjsKKyAgICByZXR1cm4gcGFyZzsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFBvaW50ZXJUeXBlX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlQeVR5cGVPYmplY3QgKnJlc3VsdDsKLQlTdGdEaWN0T2JqZWN0ICpzdGdkaWN0OwotCVB5T2JqZWN0ICpwcm90bzsKLQlQeU9iamVjdCAqdHlwZWRpY3Q7CisgICAgUHlUeXBlT2JqZWN0ICpyZXN1bHQ7CisgICAgU3RnRGljdE9iamVjdCAqc3RnZGljdDsKKyAgICBQeU9iamVjdCAqcHJvdG87CisgICAgUHlPYmplY3QgKnR5cGVkaWN0OwogCi0JdHlwZWRpY3QgPSBQeVR1cGxlX0dldEl0ZW0oYXJncywgMik7Ci0JaWYgKCF0eXBlZGljdCkKLQkJcmV0dXJuIE5VTEw7CisgICAgdHlwZWRpY3QgPSBQeVR1cGxlX0dldEl0ZW0oYXJncywgMik7CisgICAgaWYgKCF0eXBlZGljdCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAvKgogICBzdGdkaWN0IGl0ZW1zIHNpemUsIGFsaWduLCBsZW5ndGggY29udGFpbiBpbmZvIGFib3V0IHBvaW50ZXJzIGl0c2VsZiwKICAgc3RnZGljdC0+cHJvdG8gaGFzIGluZm8gYWJvdXQgdGhlIHBvaW50ZWQgdG8gdHlwZSEKICovCi0Jc3RnZGljdCA9IChTdGdEaWN0T2JqZWN0ICopUHlPYmplY3RfQ2FsbE9iamVjdCgKLQkJKFB5T2JqZWN0ICopJlN0Z0RpY3RfVHlwZSwgTlVMTCk7Ci0JaWYgKCFzdGdkaWN0KQotCQlyZXR1cm4gTlVMTDsKLQlzdGdkaWN0LT5zaXplID0gc2l6ZW9mKHZvaWQgKik7Ci0Jc3RnZGljdC0+YWxpZ24gPSBnZXRlbnRyeSgiUCIpLT5wZmZpX3R5cGUtPmFsaWdubWVudDsKLQlzdGdkaWN0LT5sZW5ndGggPSAxOwotCXN0Z2RpY3QtPmZmaV90eXBlX3BvaW50ZXIgPSBmZmlfdHlwZV9wb2ludGVyOwotCXN0Z2RpY3QtPnBhcmFtZnVuYyA9IFBvaW50ZXJUeXBlX3BhcmFtZnVuYzsKLQlzdGdkaWN0LT5mbGFncyB8PSBUWVBFRkxBR19JU1BPSU5URVI7CisgICAgc3RnZGljdCA9IChTdGdEaWN0T2JqZWN0ICopUHlPYmplY3RfQ2FsbE9iamVjdCgKKyAgICAgICAgKFB5T2JqZWN0ICopJlN0Z0RpY3RfVHlwZSwgTlVMTCk7CisgICAgaWYgKCFzdGdkaWN0KQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBzdGdkaWN0LT5zaXplID0gc2l6ZW9mKHZvaWQgKik7CisgICAgc3RnZGljdC0+YWxpZ24gPSBnZXRlbnRyeSgiUCIpLT5wZmZpX3R5cGUtPmFsaWdubWVudDsKKyAgICBzdGdkaWN0LT5sZW5ndGggPSAxOworICAgIHN0Z2RpY3QtPmZmaV90eXBlX3BvaW50ZXIgPSBmZmlfdHlwZV9wb2ludGVyOworICAgIHN0Z2RpY3QtPnBhcmFtZnVuYyA9IFBvaW50ZXJUeXBlX3BhcmFtZnVuYzsKKyAgICBzdGdkaWN0LT5mbGFncyB8PSBUWVBFRkxBR19JU1BPSU5URVI7CiAKLQlwcm90byA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKHR5cGVkaWN0LCAiX3R5cGVfIik7IC8qIEJvcnJvd2VkIHJlZiAqLwotCWlmIChwcm90byAmJiAtMSA9PSBQb2ludGVyVHlwZV9TZXRQcm90byhzdGdkaWN0LCBwcm90bykpIHsKLQkJUHlfREVDUkVGKChQeU9iamVjdCAqKXN0Z2RpY3QpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgcHJvdG8gPSBQeURpY3RfR2V0SXRlbVN0cmluZyh0eXBlZGljdCwgIl90eXBlXyIpOyAvKiBCb3Jyb3dlZCByZWYgKi8KKyAgICBpZiAocHJvdG8gJiYgLTEgPT0gUG9pbnRlclR5cGVfU2V0UHJvdG8oc3RnZGljdCwgcHJvdG8pKSB7CisgICAgICAgIFB5X0RFQ1JFRigoUHlPYmplY3QgKilzdGdkaWN0KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaWYgKHByb3RvKSB7Ci0JCVN0Z0RpY3RPYmplY3QgKml0ZW1kaWN0ID0gUHlUeXBlX3N0Z2RpY3QocHJvdG8pOwotCQlhc3NlcnQoaXRlbWRpY3QpOwotCQkvKiBJZiBpdGVtZGljdC0+Zm9ybWF0IGlzIE5VTEwsIHRoZW4gdGhpcyBpcyBhIHBvaW50ZXIgdG8gYW4KLQkJICAgaW5jb21wbGV0ZSB0eXBlLiAgV2UgY3JlYXRlIGEgZ2VuZXJpYyBmb3JtYXQgc3RyaW5nCi0JCSAgICdwb2ludGVyIHRvIGJ5dGVzJyBpbiB0aGlzIGNhc2UuICBYWFggQmV0dGVyIHdvdWxkIGJlIHRvCi0JCSAgIGZpeCB0aGUgZm9ybWF0IHN0cmluZyBsYXRlci4uLgotCQkqLwotCQlzdGdkaWN0LT5mb3JtYXQgPSBhbGxvY19mb3JtYXRfc3RyaW5nKCImIiwKLQkJCSAgICAgIGl0ZW1kaWN0LT5mb3JtYXQgPyBpdGVtZGljdC0+Zm9ybWF0IDogIkIiKTsKLQkJaWYgKHN0Z2RpY3QtPmZvcm1hdCA9PSBOVUxMKSB7Ci0JCQlQeV9ERUNSRUYoKFB5T2JqZWN0ICopc3RnZGljdCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KKyAgICBpZiAocHJvdG8pIHsKKyAgICAgICAgU3RnRGljdE9iamVjdCAqaXRlbWRpY3QgPSBQeVR5cGVfc3RnZGljdChwcm90byk7CisgICAgICAgIGFzc2VydChpdGVtZGljdCk7CisgICAgICAgIC8qIElmIGl0ZW1kaWN0LT5mb3JtYXQgaXMgTlVMTCwgdGhlbiB0aGlzIGlzIGEgcG9pbnRlciB0byBhbgorICAgICAgICAgICBpbmNvbXBsZXRlIHR5cGUuICBXZSBjcmVhdGUgYSBnZW5lcmljIGZvcm1hdCBzdHJpbmcKKyAgICAgICAgICAgJ3BvaW50ZXIgdG8gYnl0ZXMnIGluIHRoaXMgY2FzZS4gIFhYWCBCZXR0ZXIgd291bGQgYmUgdG8KKyAgICAgICAgICAgZml4IHRoZSBmb3JtYXQgc3RyaW5nIGxhdGVyLi4uCisgICAgICAgICovCisgICAgICAgIHN0Z2RpY3QtPmZvcm1hdCA9IGFsbG9jX2Zvcm1hdF9zdHJpbmcoIiYiLAorICAgICAgICAgICAgICAgICAgICAgIGl0ZW1kaWN0LT5mb3JtYXQgPyBpdGVtZGljdC0+Zm9ybWF0IDogIkIiKTsKKyAgICAgICAgaWYgKHN0Z2RpY3QtPmZvcm1hdCA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoKFB5T2JqZWN0ICopc3RnZGljdCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KIAotCS8qIGNyZWF0ZSB0aGUgbmV3IGluc3RhbmNlICh3aGljaCBpcyBhIGNsYXNzLAotCSAgIHNpbmNlIHdlIGFyZSBhIG1ldGF0eXBlISkgKi8KLQlyZXN1bHQgPSAoUHlUeXBlT2JqZWN0ICopUHlUeXBlX1R5cGUudHBfbmV3KHR5cGUsIGFyZ3MsIGt3ZHMpOwotCWlmIChyZXN1bHQgPT0gTlVMTCkgewotCQlQeV9ERUNSRUYoKFB5T2JqZWN0ICopc3RnZGljdCk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICAvKiBjcmVhdGUgdGhlIG5ldyBpbnN0YW5jZSAod2hpY2ggaXMgYSBjbGFzcywKKyAgICAgICBzaW5jZSB3ZSBhcmUgYSBtZXRhdHlwZSEpICovCisgICAgcmVzdWx0ID0gKFB5VHlwZU9iamVjdCAqKVB5VHlwZV9UeXBlLnRwX25ldyh0eXBlLCBhcmdzLCBrd2RzKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKChQeU9iamVjdCAqKXN0Z2RpY3QpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQkvKiByZXBsYWNlIHRoZSBjbGFzcyBkaWN0IGJ5IG91ciB1cGRhdGVkIHNwYW0gZGljdCAqLwotCWlmICgtMSA9PSBQeURpY3RfVXBkYXRlKChQeU9iamVjdCAqKXN0Z2RpY3QsIHJlc3VsdC0+dHBfZGljdCkpIHsKLQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCVB5X0RFQ1JFRigoUHlPYmplY3QgKilzdGdkaWN0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5X0RFQ1JFRihyZXN1bHQtPnRwX2RpY3QpOwotCXJlc3VsdC0+dHBfZGljdCA9IChQeU9iamVjdCAqKXN0Z2RpY3Q7CisgICAgLyogcmVwbGFjZSB0aGUgY2xhc3MgZGljdCBieSBvdXIgdXBkYXRlZCBzcGFtIGRpY3QgKi8KKyAgICBpZiAoLTEgPT0gUHlEaWN0X1VwZGF0ZSgoUHlPYmplY3QgKilzdGdkaWN0LCByZXN1bHQtPnRwX2RpY3QpKSB7CisgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICBQeV9ERUNSRUYoKFB5T2JqZWN0ICopc3RnZGljdCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeV9ERUNSRUYocmVzdWx0LT50cF9kaWN0KTsKKyAgICByZXN1bHQtPnRwX2RpY3QgPSAoUHlPYmplY3QgKilzdGdkaWN0OwogCi0JcmV0dXJuIChQeU9iamVjdCAqKXJlc3VsdDsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopcmVzdWx0OwogfQogCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBQb2ludGVyVHlwZV9zZXRfdHlwZShQeVR5cGVPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp0eXBlKQogewotCVN0Z0RpY3RPYmplY3QgKmRpY3Q7CisgICAgU3RnRGljdE9iamVjdCAqZGljdDsKIAotCWRpY3QgPSBQeVR5cGVfc3RnZGljdCgoUHlPYmplY3QgKilzZWxmKTsKLQlhc3NlcnQoZGljdCk7CisgICAgZGljdCA9IFB5VHlwZV9zdGdkaWN0KChQeU9iamVjdCAqKXNlbGYpOworICAgIGFzc2VydChkaWN0KTsKIAotCWlmICgtMSA9PSBQb2ludGVyVHlwZV9TZXRQcm90byhkaWN0LCB0eXBlKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKC0xID09IFBvaW50ZXJUeXBlX1NldFByb3RvKGRpY3QsIHR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmICgtMSA9PSBQeURpY3RfU2V0SXRlbVN0cmluZygoUHlPYmplY3QgKilkaWN0LCAiX3R5cGVfIiwgdHlwZSkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICgtMSA9PSBQeURpY3RfU2V0SXRlbVN0cmluZygoUHlPYmplY3QgKilkaWN0LCAiX3R5cGVfIiwgdHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljZm9yd2FyZCBQeU9iamVjdCAqX2J5cmVmKFB5T2JqZWN0ICopOwpAQCAtOTcwLDk4ICs5NzAsOTggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBQb2ludGVyVHlwZV9mcm9tX3BhcmFtKFB5T2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqdmFsdWUpCiB7Ci0JU3RnRGljdE9iamVjdCAqdHlwZWRpY3Q7CisgICAgU3RnRGljdE9iamVjdCAqdHlwZWRpY3Q7CiAKLQlpZiAodmFsdWUgPT0gUHlfTm9uZSkgewotCQkvKiBDb252UGFyYW0gd2lsbCBjb252ZXJ0IHRvIGEgTlVMTCBwb2ludGVyIGxhdGVyICovCi0JCVB5X0lOQ1JFRih2YWx1ZSk7Ci0JCXJldHVybiB2YWx1ZTsKLQl9CisgICAgaWYgKHZhbHVlID09IFB5X05vbmUpIHsKKyAgICAgICAgLyogQ29udlBhcmFtIHdpbGwgY29udmVydCB0byBhIE5VTEwgcG9pbnRlciBsYXRlciAqLworICAgICAgICBQeV9JTkNSRUYodmFsdWUpOworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQogCi0JdHlwZWRpY3QgPSBQeVR5cGVfc3RnZGljdCh0eXBlKTsKLQlhc3NlcnQodHlwZWRpY3QpOyAvKiBDYW5ub3QgYmUgTlVMTCBmb3IgcG9pbnRlciB0eXBlcyAqLworICAgIHR5cGVkaWN0ID0gUHlUeXBlX3N0Z2RpY3QodHlwZSk7CisgICAgYXNzZXJ0KHR5cGVkaWN0KTsgLyogQ2Fubm90IGJlIE5VTEwgZm9yIHBvaW50ZXIgdHlwZXMgKi8KIAotCS8qIElmIHdlIGV4cGVjdCBQT0lOVEVSKDx0eXBlPiksIGJ1dCByZWNlaXZlIGEgPHR5cGU+IGluc3RhbmNlLCBhY2NlcHQKLQkgICBpdCBieSBjYWxsaW5nIGJ5cmVmKDx0eXBlPikuCi0JKi8KLQlzd2l0Y2ggKFB5T2JqZWN0X0lzSW5zdGFuY2UodmFsdWUsIHR5cGVkaWN0LT5wcm90bykpIHsKLQljYXNlIDE6Ci0JCVB5X0lOQ1JFRih2YWx1ZSk7IC8qIF9ieXJlZiBzdGVhbHMgYSByZWZjb3VudCAqLwotCQlyZXR1cm4gX2J5cmVmKHZhbHVlKTsKLQljYXNlIC0xOgotCQlQeUVycl9DbGVhcigpOwotCQlicmVhazsKLQlkZWZhdWx0OgotIAkJYnJlYWs7Ci0JfQorICAgIC8qIElmIHdlIGV4cGVjdCBQT0lOVEVSKDx0eXBlPiksIGJ1dCByZWNlaXZlIGEgPHR5cGU+IGluc3RhbmNlLCBhY2NlcHQKKyAgICAgICBpdCBieSBjYWxsaW5nIGJ5cmVmKDx0eXBlPikuCisgICAgKi8KKyAgICBzd2l0Y2ggKFB5T2JqZWN0X0lzSW5zdGFuY2UodmFsdWUsIHR5cGVkaWN0LT5wcm90bykpIHsKKyAgICBjYXNlIDE6CisgICAgICAgIFB5X0lOQ1JFRih2YWx1ZSk7IC8qIF9ieXJlZiBzdGVhbHMgYSByZWZjb3VudCAqLworICAgICAgICByZXR1cm4gX2J5cmVmKHZhbHVlKTsKKyAgICBjYXNlIC0xOgorICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CiAKLSAJaWYgKFBvaW50ZXJPYmplY3RfQ2hlY2sodmFsdWUpIHx8IEFycmF5T2JqZWN0X0NoZWNrKHZhbHVlKSkgewotIAkJLyogQXJyYXkgaW5zdGFuY2VzIGFyZSBhbHNvIHBvaW50ZXJzIHdoZW4KLSAJCSAgIHRoZSBpdGVtIHR5cGVzIGFyZSB0aGUgc2FtZS4KLSAJCSovCi0gCQlTdGdEaWN0T2JqZWN0ICp2ID0gUHlPYmplY3Rfc3RnZGljdCh2YWx1ZSk7Ci0JCWFzc2VydCh2KTsgLyogQ2Fubm90IGJlIE5VTEwgZm9yIHBvaW50ZXIgb3IgYXJyYXkgb2JqZWN0cyAqLwotIAkJaWYgKFB5T2JqZWN0X0lzU3ViY2xhc3Modi0+cHJvdG8sIHR5cGVkaWN0LT5wcm90bykpIHsKLSAgCQkJUHlfSU5DUkVGKHZhbHVlKTsKLSAgCQkJcmV0dXJuIHZhbHVlOwotICAJCX0KLSAgCX0KLSAgICAgCXJldHVybiBDRGF0YVR5cGVfZnJvbV9wYXJhbSh0eXBlLCB2YWx1ZSk7CisgICAgaWYgKFBvaW50ZXJPYmplY3RfQ2hlY2sodmFsdWUpIHx8IEFycmF5T2JqZWN0X0NoZWNrKHZhbHVlKSkgeworICAgICAgICAvKiBBcnJheSBpbnN0YW5jZXMgYXJlIGFsc28gcG9pbnRlcnMgd2hlbgorICAgICAgICAgICB0aGUgaXRlbSB0eXBlcyBhcmUgdGhlIHNhbWUuCisgICAgICAgICovCisgICAgICAgIFN0Z0RpY3RPYmplY3QgKnYgPSBQeU9iamVjdF9zdGdkaWN0KHZhbHVlKTsKKyAgICAgICAgYXNzZXJ0KHYpOyAvKiBDYW5ub3QgYmUgTlVMTCBmb3IgcG9pbnRlciBvciBhcnJheSBvYmplY3RzICovCisgICAgICAgIGlmIChQeU9iamVjdF9Jc1N1YmNsYXNzKHYtPnByb3RvLCB0eXBlZGljdC0+cHJvdG8pKSB7CisgICAgICAgICAgICBQeV9JTkNSRUYodmFsdWUpOworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBDRGF0YVR5cGVfZnJvbV9wYXJhbSh0eXBlLCB2YWx1ZSk7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBQb2ludGVyVHlwZV9tZXRob2RzW10gPSB7Ci0JeyAiZnJvbV9hZGRyZXNzIiwgQ0RhdGFUeXBlX2Zyb21fYWRkcmVzcywgTUVUSF9PLCBmcm9tX2FkZHJlc3NfZG9jIH0sCi0JeyAiZnJvbV9idWZmZXIiLCBDRGF0YVR5cGVfZnJvbV9idWZmZXIsIE1FVEhfVkFSQVJHUywgZnJvbV9idWZmZXJfZG9jLCB9LAotCXsgImZyb21fYnVmZmVyX2NvcHkiLCBDRGF0YVR5cGVfZnJvbV9idWZmZXJfY29weSwgTUVUSF9WQVJBUkdTLCBmcm9tX2J1ZmZlcl9jb3B5X2RvYywgfSwKLQl7ICJpbl9kbGwiLCBDRGF0YVR5cGVfaW5fZGxsLCBNRVRIX1ZBUkFSR1MsIGluX2RsbF9kb2N9LAotCXsgImZyb21fcGFyYW0iLCAoUHlDRnVuY3Rpb24pUG9pbnRlclR5cGVfZnJvbV9wYXJhbSwgTUVUSF9PLCBmcm9tX3BhcmFtX2RvY30sCi0JeyAic2V0X3R5cGUiLCAoUHlDRnVuY3Rpb24pUG9pbnRlclR5cGVfc2V0X3R5cGUsIE1FVEhfTyB9LAotCXsgTlVMTCwgTlVMTCB9LAorICAgIHsgImZyb21fYWRkcmVzcyIsIENEYXRhVHlwZV9mcm9tX2FkZHJlc3MsIE1FVEhfTywgZnJvbV9hZGRyZXNzX2RvYyB9LAorICAgIHsgImZyb21fYnVmZmVyIiwgQ0RhdGFUeXBlX2Zyb21fYnVmZmVyLCBNRVRIX1ZBUkFSR1MsIGZyb21fYnVmZmVyX2RvYywgfSwKKyAgICB7ICJmcm9tX2J1ZmZlcl9jb3B5IiwgQ0RhdGFUeXBlX2Zyb21fYnVmZmVyX2NvcHksIE1FVEhfVkFSQVJHUywgZnJvbV9idWZmZXJfY29weV9kb2MsIH0sCisgICAgeyAiaW5fZGxsIiwgQ0RhdGFUeXBlX2luX2RsbCwgTUVUSF9WQVJBUkdTLCBpbl9kbGxfZG9jfSwKKyAgICB7ICJmcm9tX3BhcmFtIiwgKFB5Q0Z1bmN0aW9uKVBvaW50ZXJUeXBlX2Zyb21fcGFyYW0sIE1FVEhfTywgZnJvbV9wYXJhbV9kb2N9LAorICAgIHsgInNldF90eXBlIiwgKFB5Q0Z1bmN0aW9uKVBvaW50ZXJUeXBlX3NldF90eXBlLCBNRVRIX08gfSwKKyAgICB7IE5VTEwsIE5VTEwgfSwKIH07CiAKIFB5VHlwZU9iamVjdCBQb2ludGVyVHlwZV9UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotCSJfY3R5cGVzLlBvaW50ZXJUeXBlIiwJCQkJLyogdHBfbmFtZSAqLwotCTAsCQkJCQkvKiB0cF9iYXNpY3NpemUgKi8KLQkwLAkJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkwLAkJCQkJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfY29tcGFyZSAqLwotCTAsCQkJICAgICAgIAkJLyogdHBfcmVwciAqLwotCTAsCQkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkmQ0RhdGFUeXBlX2FzX3NlcXVlbmNlLAkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkJLyogdHBfc3RyICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfQkFTRVRZUEUgfCBQeV9UUEZMQUdTX0hBVkVfR0MsIC8qIHRwX2ZsYWdzICovCi0JIm1ldGF0eXBlIGZvciB0aGUgUG9pbnRlciBPYmplY3RzIiwJLyogdHBfZG9jICovCi0JKHRyYXZlcnNlcHJvYylDRGF0YVR5cGVfdHJhdmVyc2UsCS8qIHRwX3RyYXZlcnNlICovCi0JKGlucXVpcnkpQ0RhdGFUeXBlX2NsZWFyLAkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaXRlciAqLwotCTAsCQkJCQkvKiB0cF9pdGVybmV4dCAqLwotCVBvaW50ZXJUeXBlX21ldGhvZHMsCQkJLyogdHBfbWV0aG9kcyAqLwotCTAsCQkJCQkvKiB0cF9tZW1iZXJzICovCi0JMCwJCQkJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJCS8qIHRwX2RpY3QgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2luaXQgKi8KLQkwLAkJCQkJLyogdHBfYWxsb2MgKi8KLQlQb2ludGVyVHlwZV9uZXcsCQkJLyogdHBfbmV3ICovCi0JMCwJCQkJCS8qIHRwX2ZyZWUgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAiX2N0eXBlcy5Qb2ludGVyVHlwZSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgICZDRGF0YVR5cGVfYXNfc2VxdWVuY2UsICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19CQVNFVFlQRSB8IFB5X1RQRkxBR1NfSEFWRV9HQywgLyogdHBfZmxhZ3MgKi8KKyAgICAibWV0YXR5cGUgZm9yIHRoZSBQb2ludGVyIE9iamVjdHMiLCAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2MpQ0RhdGFUeXBlX3RyYXZlcnNlLCAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAoaW5xdWlyeSlDRGF0YVR5cGVfY2xlYXIsICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgUG9pbnRlclR5cGVfbWV0aG9kcywgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIFBvaW50ZXJUeXBlX25ldywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCiB9OwogCi0MCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgogICBBcnJheVR5cGVfVHlwZQpAQCAtMTA3NCwxNDkgKzEwNzQsMTQ5IEBACiBzdGF0aWMgaW50CiBDaGFyQXJyYXlfc2V0X3JhdyhDRGF0YU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnZhbHVlKQogewotCWNoYXIgKnB0cjsKLQlQeV9zc2l6ZV90IHNpemU7Ci0JaWYgKFB5QnVmZmVyX0NoZWNrKHZhbHVlKSkgewotCQlzaXplID0gUHlfVFlQRSh2YWx1ZSktPnRwX2FzX2J1ZmZlci0+YmZfZ2V0cmVhZGJ1ZmZlcih2YWx1ZSwgMCwgKHZvaWQgKikmcHRyKTsKLQkJaWYgKHNpemUgPCAwKQotCQkJcmV0dXJuIC0xOwotCX0gZWxzZSBpZiAoLTEgPT0gUHlTdHJpbmdfQXNTdHJpbmdBbmRTaXplKHZhbHVlLCAmcHRyLCAmc2l6ZSkpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoc2l6ZSA+IHNlbGYtPmJfc2l6ZSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkic3RyaW5nIHRvbyBsb25nIik7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgY2hhciAqcHRyOworICAgIFB5X3NzaXplX3Qgc2l6ZTsKKyAgICBpZiAoUHlCdWZmZXJfQ2hlY2sodmFsdWUpKSB7CisgICAgICAgIHNpemUgPSBQeV9UWVBFKHZhbHVlKS0+dHBfYXNfYnVmZmVyLT5iZl9nZXRyZWFkYnVmZmVyKHZhbHVlLCAwLCAodm9pZCAqKSZwdHIpOworICAgICAgICBpZiAoc2l6ZSA8IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfSBlbHNlIGlmICgtMSA9PSBQeVN0cmluZ19Bc1N0cmluZ0FuZFNpemUodmFsdWUsICZwdHIsICZzaXplKSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChzaXplID4gc2VsZi0+Yl9zaXplKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInN0cmluZyB0b28gbG9uZyIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JbWVtY3B5KHNlbGYtPmJfcHRyLCBwdHIsIHNpemUpOworICAgIG1lbWNweShzZWxmLT5iX3B0ciwgcHRyLCBzaXplKTsKIAotCXJldHVybiAwOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogQ2hhckFycmF5X2dldF9yYXcoQ0RhdGFPYmplY3QgKnNlbGYpCiB7Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHNlbGYtPmJfcHRyLCBzZWxmLT5iX3NpemUpOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzZWxmLT5iX3B0ciwgc2VsZi0+Yl9zaXplKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIENoYXJBcnJheV9nZXRfdmFsdWUoQ0RhdGFPYmplY3QgKnNlbGYpCiB7Ci0JaW50IGk7Ci0JY2hhciAqcHRyID0gc2VsZi0+Yl9wdHI7Ci0JZm9yIChpID0gMDsgaSA8IHNlbGYtPmJfc2l6ZTsgKytpKQotCQlpZiAoKnB0cisrID09ICdcMCcpCi0JCQlicmVhazsKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoc2VsZi0+Yl9wdHIsIGkpOworICAgIGludCBpOworICAgIGNoYXIgKnB0ciA9IHNlbGYtPmJfcHRyOworICAgIGZvciAoaSA9IDA7IGkgPCBzZWxmLT5iX3NpemU7ICsraSkKKyAgICAgICAgaWYgKCpwdHIrKyA9PSAnXDAnKQorICAgICAgICAgICAgYnJlYWs7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHNlbGYtPmJfcHRyLCBpKTsKIH0KIAogc3RhdGljIGludAogQ2hhckFycmF5X3NldF92YWx1ZShDRGF0YU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnZhbHVlKQogewotCWNoYXIgKnB0cjsKLQlQeV9zc2l6ZV90IHNpemU7CisgICAgY2hhciAqcHRyOworICAgIFB5X3NzaXplX3Qgc2l6ZTsKIAotCWlmICh2YWx1ZSA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJImNhbid0IGRlbGV0ZSBhdHRyaWJ1dGUiKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICBpZiAodmFsdWUgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImNhbid0IGRlbGV0ZSBhdHRyaWJ1dGUiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCWlmIChQeVVuaWNvZGVfQ2hlY2sodmFsdWUpKSB7Ci0JCXZhbHVlID0gUHlVbmljb2RlX0FzRW5jb2RlZFN0cmluZyh2YWx1ZSwKLQkJCQkJCSAgY29udmVyc2lvbl9tb2RlX2VuY29kaW5nLAotCQkJCQkJICBjb252ZXJzaW9uX21vZGVfZXJyb3JzKTsKLQkJaWYgKCF2YWx1ZSkKLQkJCXJldHVybiAtMTsKLQl9IGVsc2UgaWYgKCFQeVN0cmluZ19DaGVjayh2YWx1ZSkpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAgInN0cmluZyBleHBlY3RlZCBpbnN0ZWFkIG9mICVzIGluc3RhbmNlIiwKLQkJCSAgICAgUHlfVFlQRSh2YWx1ZSktPnRwX25hbWUpOwotCQlyZXR1cm4gLTE7Ci0JfSBlbHNlCi0JCVB5X0lOQ1JFRih2YWx1ZSk7Ci0Jc2l6ZSA9IFB5U3RyaW5nX0dFVF9TSVpFKHZhbHVlKTsKLQlpZiAoc2l6ZSA+IHNlbGYtPmJfc2l6ZSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkic3RyaW5nIHRvbyBsb25nIik7Ci0JCVB5X0RFQ1JFRih2YWx1ZSk7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgaWYgKFB5VW5pY29kZV9DaGVjayh2YWx1ZSkpIHsKKyAgICAgICAgdmFsdWUgPSBQeVVuaWNvZGVfQXNFbmNvZGVkU3RyaW5nKHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVyc2lvbl9tb2RlX2VuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVyc2lvbl9tb2RlX2Vycm9ycyk7CisgICAgICAgIGlmICghdmFsdWUpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfSBlbHNlIGlmICghUHlTdHJpbmdfQ2hlY2sodmFsdWUpKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAic3RyaW5nIGV4cGVjdGVkIGluc3RlYWQgb2YgJXMgaW5zdGFuY2UiLAorICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRSh2YWx1ZSktPnRwX25hbWUpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfSBlbHNlCisgICAgICAgIFB5X0lOQ1JFRih2YWx1ZSk7CisgICAgc2l6ZSA9IFB5U3RyaW5nX0dFVF9TSVpFKHZhbHVlKTsKKyAgICBpZiAoc2l6ZSA+IHNlbGYtPmJfc2l6ZSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJzdHJpbmcgdG9vIGxvbmciKTsKKyAgICAgICAgUHlfREVDUkVGKHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCXB0ciA9IFB5U3RyaW5nX0FTX1NUUklORyh2YWx1ZSk7Ci0JbWVtY3B5KHNlbGYtPmJfcHRyLCBwdHIsIHNpemUpOwotCWlmIChzaXplIDwgc2VsZi0+Yl9zaXplKQotCQlzZWxmLT5iX3B0cltzaXplXSA9ICdcMCc7Ci0JUHlfREVDUkVGKHZhbHVlKTsKKyAgICBwdHIgPSBQeVN0cmluZ19BU19TVFJJTkcodmFsdWUpOworICAgIG1lbWNweShzZWxmLT5iX3B0ciwgcHRyLCBzaXplKTsKKyAgICBpZiAoc2l6ZSA8IHNlbGYtPmJfc2l6ZSkKKyAgICAgICAgc2VsZi0+Yl9wdHJbc2l6ZV0gPSAnXDAnOworICAgIFB5X0RFQ1JFRih2YWx1ZSk7CiAKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5R2V0U2V0RGVmIENoYXJBcnJheV9nZXRzZXRzW10gPSB7Ci0JeyAicmF3IiwgKGdldHRlcilDaGFyQXJyYXlfZ2V0X3JhdywgKHNldHRlcilDaGFyQXJyYXlfc2V0X3JhdywKLQkgICJ2YWx1ZSIsIE5VTEwgfSwKLQl7ICJ2YWx1ZSIsIChnZXR0ZXIpQ2hhckFycmF5X2dldF92YWx1ZSwgKHNldHRlcilDaGFyQXJyYXlfc2V0X3ZhbHVlLAotCSAgInN0cmluZyB2YWx1ZSJ9LAotCXsgTlVMTCwgTlVMTCB9CisgICAgeyAicmF3IiwgKGdldHRlcilDaGFyQXJyYXlfZ2V0X3JhdywgKHNldHRlcilDaGFyQXJyYXlfc2V0X3JhdywKKyAgICAgICJ2YWx1ZSIsIE5VTEwgfSwKKyAgICB7ICJ2YWx1ZSIsIChnZXR0ZXIpQ2hhckFycmF5X2dldF92YWx1ZSwgKHNldHRlcilDaGFyQXJyYXlfc2V0X3ZhbHVlLAorICAgICAgInN0cmluZyB2YWx1ZSJ9LAorICAgIHsgTlVMTCwgTlVMTCB9CiB9OwogCiAjaWZkZWYgQ1RZUEVTX1VOSUNPREUKIHN0YXRpYyBQeU9iamVjdCAqCiBXQ2hhckFycmF5X2dldF92YWx1ZShDRGF0YU9iamVjdCAqc2VsZikKIHsKLQl1bnNpZ25lZCBpbnQgaTsKLQl3Y2hhcl90ICpwdHIgPSAod2NoYXJfdCAqKXNlbGYtPmJfcHRyOwotCWZvciAoaSA9IDA7IGkgPCBzZWxmLT5iX3NpemUvc2l6ZW9mKHdjaGFyX3QpOyArK2kpCi0JCWlmICgqcHRyKysgPT0gKHdjaGFyX3QpMCkKLQkJCWJyZWFrOwotCXJldHVybiBQeVVuaWNvZGVfRnJvbVdpZGVDaGFyKCh3Y2hhcl90ICopc2VsZi0+Yl9wdHIsIGkpOworICAgIHVuc2lnbmVkIGludCBpOworICAgIHdjaGFyX3QgKnB0ciA9ICh3Y2hhcl90ICopc2VsZi0+Yl9wdHI7CisgICAgZm9yIChpID0gMDsgaSA8IHNlbGYtPmJfc2l6ZS9zaXplb2Yod2NoYXJfdCk7ICsraSkKKyAgICAgICAgaWYgKCpwdHIrKyA9PSAod2NoYXJfdCkwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgcmV0dXJuIFB5VW5pY29kZV9Gcm9tV2lkZUNoYXIoKHdjaGFyX3QgKilzZWxmLT5iX3B0ciwgaSk7CiB9CiAKIHN0YXRpYyBpbnQKIFdDaGFyQXJyYXlfc2V0X3ZhbHVlKENEYXRhT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdmFsdWUpCiB7Ci0JUHlfc3NpemVfdCByZXN1bHQgPSAwOworICAgIFB5X3NzaXplX3QgcmVzdWx0ID0gMDsKIAotCWlmICh2YWx1ZSA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJImNhbid0IGRlbGV0ZSBhdHRyaWJ1dGUiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoUHlTdHJpbmdfQ2hlY2sodmFsdWUpKSB7Ci0JCXZhbHVlID0gUHlVbmljb2RlX0Zyb21FbmNvZGVkT2JqZWN0KHZhbHVlLAotCQkJCQkJICAgIGNvbnZlcnNpb25fbW9kZV9lbmNvZGluZywKLQkJCQkJCSAgICBjb252ZXJzaW9uX21vZGVfZXJyb3JzKTsKLQkJaWYgKCF2YWx1ZSkKLQkJCXJldHVybiAtMTsKLQl9IGVsc2UgaWYgKCFQeVVuaWNvZGVfQ2hlY2sodmFsdWUpKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkJInVuaWNvZGUgc3RyaW5nIGV4cGVjdGVkIGluc3RlYWQgb2YgJXMgaW5zdGFuY2UiLAotCQkJCVB5X1RZUEUodmFsdWUpLT50cF9uYW1lKTsKLQkJcmV0dXJuIC0xOwotCX0gZWxzZQotCQlQeV9JTkNSRUYodmFsdWUpOwotCWlmICgodW5zaWduZWQpUHlVbmljb2RlX0dFVF9TSVpFKHZhbHVlKSA+IHNlbGYtPmJfc2l6ZS9zaXplb2Yod2NoYXJfdCkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJInN0cmluZyB0b28gbG9uZyIpOwotCQlyZXN1bHQgPSAtMTsKLQkJZ290byBkb25lOwotCX0KLQlyZXN1bHQgPSBQeVVuaWNvZGVfQXNXaWRlQ2hhcigoUHlVbmljb2RlT2JqZWN0ICopdmFsdWUsCi0JCQkJICAgICAgKHdjaGFyX3QgKilzZWxmLT5iX3B0ciwKLQkJCQkgICAgICBzZWxmLT5iX3NpemUvc2l6ZW9mKHdjaGFyX3QpKTsKLQlpZiAocmVzdWx0ID49IDAgJiYgKHNpemVfdClyZXN1bHQgPCBzZWxmLT5iX3NpemUvc2l6ZW9mKHdjaGFyX3QpKQotCQkoKHdjaGFyX3QgKilzZWxmLT5iX3B0cilbcmVzdWx0XSA9ICh3Y2hhcl90KTA7CisgICAgaWYgKHZhbHVlID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjYW4ndCBkZWxldGUgYXR0cmlidXRlIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKFB5U3RyaW5nX0NoZWNrKHZhbHVlKSkgeworICAgICAgICB2YWx1ZSA9IFB5VW5pY29kZV9Gcm9tRW5jb2RlZE9iamVjdCh2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVyc2lvbl9tb2RlX2VuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJzaW9uX21vZGVfZXJyb3JzKTsKKyAgICAgICAgaWYgKCF2YWx1ZSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9IGVsc2UgaWYgKCFQeVVuaWNvZGVfQ2hlY2sodmFsdWUpKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAidW5pY29kZSBzdHJpbmcgZXhwZWN0ZWQgaW5zdGVhZCBvZiAlcyBpbnN0YW5jZSIsCisgICAgICAgICAgICAgICAgICAgICAgICBQeV9UWVBFKHZhbHVlKS0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9IGVsc2UKKyAgICAgICAgUHlfSU5DUkVGKHZhbHVlKTsKKyAgICBpZiAoKHVuc2lnbmVkKVB5VW5pY29kZV9HRVRfU0laRSh2YWx1ZSkgPiBzZWxmLT5iX3NpemUvc2l6ZW9mKHdjaGFyX3QpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInN0cmluZyB0b28gbG9uZyIpOworICAgICAgICByZXN1bHQgPSAtMTsKKyAgICAgICAgZ290byBkb25lOworICAgIH0KKyAgICByZXN1bHQgPSBQeVVuaWNvZGVfQXNXaWRlQ2hhcigoUHlVbmljb2RlT2JqZWN0ICopdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdjaGFyX3QgKilzZWxmLT5iX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5iX3NpemUvc2l6ZW9mKHdjaGFyX3QpKTsKKyAgICBpZiAocmVzdWx0ID49IDAgJiYgKHNpemVfdClyZXN1bHQgPCBzZWxmLT5iX3NpemUvc2l6ZW9mKHdjaGFyX3QpKQorICAgICAgICAoKHdjaGFyX3QgKilzZWxmLT5iX3B0cilbcmVzdWx0XSA9ICh3Y2hhcl90KTA7CiAgIGRvbmU6Ci0JUHlfREVDUkVGKHZhbHVlKTsKKyAgICBQeV9ERUNSRUYodmFsdWUpOwogCi0JcmV0dXJuIHJlc3VsdCA+PSAwID8gMCA6IC0xOworICAgIHJldHVybiByZXN1bHQgPj0gMCA/IDAgOiAtMTsKIH0KIAogc3RhdGljIFB5R2V0U2V0RGVmIFdDaGFyQXJyYXlfZ2V0c2V0c1tdID0gewotCXsgInZhbHVlIiwgKGdldHRlcilXQ2hhckFycmF5X2dldF92YWx1ZSwgKHNldHRlcilXQ2hhckFycmF5X3NldF92YWx1ZSwKLQkgICJzdHJpbmcgdmFsdWUifSwKLQl7IE5VTEwsIE5VTEwgfQorICAgIHsgInZhbHVlIiwgKGdldHRlcilXQ2hhckFycmF5X2dldF92YWx1ZSwgKHNldHRlcilXQ2hhckFycmF5X3NldF92YWx1ZSwKKyAgICAgICJzdHJpbmcgdmFsdWUifSwKKyAgICB7IE5VTEwsIE5VTEwgfQogfTsKICNlbmRpZgogCkBAIC0xMjMxLDIzMSArMTIzMSwyMzEgQEAKIHN0YXRpYyBpbnQKIGFkZF9tZXRob2RzKFB5VHlwZU9iamVjdCAqdHlwZSwgUHlNZXRob2REZWYgKm1ldGgpCiB7Ci0JUHlPYmplY3QgKmRpY3QgPSB0eXBlLT50cF9kaWN0OwotCWZvciAoOyBtZXRoLT5tbF9uYW1lICE9IE5VTEw7IG1ldGgrKykgewotCQlQeU9iamVjdCAqZGVzY3I7Ci0JCWRlc2NyID0gUHlEZXNjcl9OZXdNZXRob2QodHlwZSwgbWV0aCk7Ci0JCWlmIChkZXNjciA9PSBOVUxMKQotCQkJcmV0dXJuIC0xOwotCQlpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCxtZXRoLT5tbF9uYW1lLCBkZXNjcikgPCAwKQotCQkJcmV0dXJuIC0xOwotCQlQeV9ERUNSRUYoZGVzY3IpOwotCX0KLQlyZXR1cm4gMDsKKyAgICBQeU9iamVjdCAqZGljdCA9IHR5cGUtPnRwX2RpY3Q7CisgICAgZm9yICg7IG1ldGgtPm1sX25hbWUgIT0gTlVMTDsgbWV0aCsrKSB7CisgICAgICAgIFB5T2JqZWN0ICpkZXNjcjsKKyAgICAgICAgZGVzY3IgPSBQeURlc2NyX05ld01ldGhvZCh0eXBlLCBtZXRoKTsKKyAgICAgICAgaWYgKGRlc2NyID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LG1ldGgtPm1sX25hbWUsIGRlc2NyKSA8IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIFB5X0RFQ1JFRihkZXNjcik7CisgICAgfQorICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBhZGRfbWVtYmVycyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5TWVtYmVyRGVmICptZW1iKQogewotCVB5T2JqZWN0ICpkaWN0ID0gdHlwZS0+dHBfZGljdDsKLQlmb3IgKDsgbWVtYi0+bmFtZSAhPSBOVUxMOyBtZW1iKyspIHsKLQkJUHlPYmplY3QgKmRlc2NyOwotCQlkZXNjciA9IFB5RGVzY3JfTmV3TWVtYmVyKHR5cGUsIG1lbWIpOwotCQlpZiAoZGVzY3IgPT0gTlVMTCkKLQkJCXJldHVybiAtMTsKLQkJaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsIG1lbWItPm5hbWUsIGRlc2NyKSA8IDApCi0JCQlyZXR1cm4gLTE7Ci0JCVB5X0RFQ1JFRihkZXNjcik7Ci0JfQotCXJldHVybiAwOworICAgIFB5T2JqZWN0ICpkaWN0ID0gdHlwZS0+dHBfZGljdDsKKyAgICBmb3IgKDsgbWVtYi0+bmFtZSAhPSBOVUxMOyBtZW1iKyspIHsKKyAgICAgICAgUHlPYmplY3QgKmRlc2NyOworICAgICAgICBkZXNjciA9IFB5RGVzY3JfTmV3TWVtYmVyKHR5cGUsIG1lbWIpOworICAgICAgICBpZiAoZGVzY3IgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsIG1lbWItPm5hbWUsIGRlc2NyKSA8IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIFB5X0RFQ1JFRihkZXNjcik7CisgICAgfQorICAgIHJldHVybiAwOwogfQogKi8KIAogc3RhdGljIGludAogYWRkX2dldHNldChQeVR5cGVPYmplY3QgKnR5cGUsIFB5R2V0U2V0RGVmICpnc3ApCiB7Ci0JUHlPYmplY3QgKmRpY3QgPSB0eXBlLT50cF9kaWN0OwotCWZvciAoOyBnc3AtPm5hbWUgIT0gTlVMTDsgZ3NwKyspIHsKLQkJUHlPYmplY3QgKmRlc2NyOwotCQlkZXNjciA9IFB5RGVzY3JfTmV3R2V0U2V0KHR5cGUsIGdzcCk7Ci0JCWlmIChkZXNjciA9PSBOVUxMKQotCQkJcmV0dXJuIC0xOwotCQlpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgZ3NwLT5uYW1lLCBkZXNjcikgPCAwKQotCQkJcmV0dXJuIC0xOwotCQlQeV9ERUNSRUYoZGVzY3IpOwotCX0KLQlyZXR1cm4gMDsKKyAgICBQeU9iamVjdCAqZGljdCA9IHR5cGUtPnRwX2RpY3Q7CisgICAgZm9yICg7IGdzcC0+bmFtZSAhPSBOVUxMOyBnc3ArKykgeworICAgICAgICBQeU9iamVjdCAqZGVzY3I7CisgICAgICAgIGRlc2NyID0gUHlEZXNjcl9OZXdHZXRTZXQodHlwZSwgZ3NwKTsKKyAgICAgICAgaWYgKGRlc2NyID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCBnc3AtPm5hbWUsIGRlc2NyKSA8IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIFB5X0RFQ1JFRihkZXNjcik7CisgICAgfQorICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlDQXJnT2JqZWN0ICoKIEFycmF5VHlwZV9wYXJhbWZ1bmMoQ0RhdGFPYmplY3QgKnNlbGYpCiB7Ci0JUHlDQXJnT2JqZWN0ICpwID0gbmV3X0NBcmdPYmplY3QoKTsKLQlpZiAocCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlwLT50YWcgPSAnUCc7Ci0JcC0+cGZmaV90eXBlID0gJmZmaV90eXBlX3BvaW50ZXI7Ci0JcC0+dmFsdWUucCA9IChjaGFyICopc2VsZi0+Yl9wdHI7Ci0JUHlfSU5DUkVGKHNlbGYpOwotCXAtPm9iaiA9IChQeU9iamVjdCAqKXNlbGY7Ci0JcmV0dXJuIHA7CisgICAgUHlDQXJnT2JqZWN0ICpwID0gbmV3X0NBcmdPYmplY3QoKTsKKyAgICBpZiAocCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBwLT50YWcgPSAnUCc7CisgICAgcC0+cGZmaV90eXBlID0gJmZmaV90eXBlX3BvaW50ZXI7CisgICAgcC0+dmFsdWUucCA9IChjaGFyICopc2VsZi0+Yl9wdHI7CisgICAgUHlfSU5DUkVGKHNlbGYpOworICAgIHAtPm9iaiA9IChQeU9iamVjdCAqKXNlbGY7CisgICAgcmV0dXJuIHA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBBcnJheVR5cGVfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCVB5VHlwZU9iamVjdCAqcmVzdWx0OwotCVN0Z0RpY3RPYmplY3QgKnN0Z2RpY3Q7Ci0JU3RnRGljdE9iamVjdCAqaXRlbWRpY3Q7Ci0JUHlPYmplY3QgKnByb3RvOwotCVB5T2JqZWN0ICp0eXBlZGljdDsKLQlsb25nIGxlbmd0aDsKKyAgICBQeVR5cGVPYmplY3QgKnJlc3VsdDsKKyAgICBTdGdEaWN0T2JqZWN0ICpzdGdkaWN0OworICAgIFN0Z0RpY3RPYmplY3QgKml0ZW1kaWN0OworICAgIFB5T2JqZWN0ICpwcm90bzsKKyAgICBQeU9iamVjdCAqdHlwZWRpY3Q7CisgICAgbG9uZyBsZW5ndGg7CiAKLQlQeV9zc2l6ZV90IGl0ZW1zaXplLCBpdGVtYWxpZ247Ci0JY2hhciBidWZbMzJdOworICAgIFB5X3NzaXplX3QgaXRlbXNpemUsIGl0ZW1hbGlnbjsKKyAgICBjaGFyIGJ1ZlszMl07CiAKLQl0eXBlZGljdCA9IFB5VHVwbGVfR2V0SXRlbShhcmdzLCAyKTsKLQlpZiAoIXR5cGVkaWN0KQotCQlyZXR1cm4gTlVMTDsKKyAgICB0eXBlZGljdCA9IFB5VHVwbGVfR2V0SXRlbShhcmdzLCAyKTsKKyAgICBpZiAoIXR5cGVkaWN0KQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXByb3RvID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcodHlwZWRpY3QsICJfbGVuZ3RoXyIpOyAvKiBCb3Jyb3dlZCByZWYgKi8KLQlpZiAoIXByb3RvIHx8ICFQeUludF9DaGVjayhwcm90bykpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0F0dHJpYnV0ZUVycm9yLAotCQkJCSJjbGFzcyBtdXN0IGRlZmluZSBhICdfbGVuZ3RoXycgYXR0cmlidXRlLCAiCi0JCQkJIndoaWNoIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlsZW5ndGggPSBQeUludF9BU19MT05HKHByb3RvKTsKKyAgICBwcm90byA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKHR5cGVkaWN0LCAiX2xlbmd0aF8iKTsgLyogQm9ycm93ZWQgcmVmICovCisgICAgaWYgKCFwcm90byB8fCAhUHlJbnRfQ2hlY2socHJvdG8pKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19BdHRyaWJ1dGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjbGFzcyBtdXN0IGRlZmluZSBhICdfbGVuZ3RoXycgYXR0cmlidXRlLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAid2hpY2ggbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGxlbmd0aCA9IFB5SW50X0FTX0xPTkcocHJvdG8pOwogCi0JcHJvdG8gPSBQeURpY3RfR2V0SXRlbVN0cmluZyh0eXBlZGljdCwgIl90eXBlXyIpOyAvKiBCb3Jyb3dlZCByZWYgKi8KLQlpZiAoIXByb3RvKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19BdHRyaWJ1dGVFcnJvciwKLQkJCQkiY2xhc3MgbXVzdCBkZWZpbmUgYSAnX3R5cGVfJyBhdHRyaWJ1dGUiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIHByb3RvID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcodHlwZWRpY3QsICJfdHlwZV8iKTsgLyogQm9ycm93ZWQgcmVmICovCisgICAgaWYgKCFwcm90bykgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfQXR0cmlidXRlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiY2xhc3MgbXVzdCBkZWZpbmUgYSAnX3R5cGVfJyBhdHRyaWJ1dGUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0Jc3RnZGljdCA9IChTdGdEaWN0T2JqZWN0ICopUHlPYmplY3RfQ2FsbE9iamVjdCgKLQkJKFB5T2JqZWN0ICopJlN0Z0RpY3RfVHlwZSwgTlVMTCk7Ci0JaWYgKCFzdGdkaWN0KQotCQlyZXR1cm4gTlVMTDsKKyAgICBzdGdkaWN0ID0gKFN0Z0RpY3RPYmplY3QgKilQeU9iamVjdF9DYWxsT2JqZWN0KAorICAgICAgICAoUHlPYmplY3QgKikmU3RnRGljdF9UeXBlLCBOVUxMKTsKKyAgICBpZiAoIXN0Z2RpY3QpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaXRlbWRpY3QgPSBQeVR5cGVfc3RnZGljdChwcm90byk7Ci0JaWYgKCFpdGVtZGljdCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJfdHlwZV8gbXVzdCBoYXZlIHN0b3JhZ2UgaW5mbyIpOwotCQlQeV9ERUNSRUYoKFB5T2JqZWN0ICopc3RnZGljdCk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpdGVtZGljdCA9IFB5VHlwZV9zdGdkaWN0KHByb3RvKTsKKyAgICBpZiAoIWl0ZW1kaWN0KSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiX3R5cGVfIG11c3QgaGF2ZSBzdG9yYWdlIGluZm8iKTsKKyAgICAgICAgUHlfREVDUkVGKChQeU9iamVjdCAqKXN0Z2RpY3QpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlhc3NlcnQoaXRlbWRpY3QtPmZvcm1hdCk7Ci0JaWYgKGl0ZW1kaWN0LT5mb3JtYXRbMF0gPT0gJygnKSB7Ci0JCXNwcmludGYoYnVmLCAiKCVsZCwiLCBsZW5ndGgpOwotCQlzdGdkaWN0LT5mb3JtYXQgPSBhbGxvY19mb3JtYXRfc3RyaW5nKGJ1ZiwgaXRlbWRpY3QtPmZvcm1hdCsxKTsKLQl9IGVsc2UgewotCQlzcHJpbnRmKGJ1ZiwgIiglbGQpIiwgbGVuZ3RoKTsKLQkJc3RnZGljdC0+Zm9ybWF0ID0gYWxsb2NfZm9ybWF0X3N0cmluZyhidWYsIGl0ZW1kaWN0LT5mb3JtYXQpOwotCX0KLQlpZiAoc3RnZGljdC0+Zm9ybWF0ID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKChQeU9iamVjdCAqKXN0Z2RpY3QpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0Jc3RnZGljdC0+bmRpbSA9IGl0ZW1kaWN0LT5uZGltICsgMTsKLQlzdGdkaWN0LT5zaGFwZSA9IFB5TWVtX01hbGxvYyhzaXplb2YoUHlfc3NpemVfdCAqKSAqIHN0Z2RpY3QtPm5kaW0pOwotCWlmIChzdGdkaWN0LT5zaGFwZSA9PSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRigoUHlPYmplY3QgKilzdGdkaWN0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXN0Z2RpY3QtPnNoYXBlWzBdID0gbGVuZ3RoOwotCW1lbW1vdmUoJnN0Z2RpY3QtPnNoYXBlWzFdLCBpdGVtZGljdC0+c2hhcGUsCi0JCXNpemVvZihQeV9zc2l6ZV90KSAqIChzdGdkaWN0LT5uZGltIC0gMSkpOworICAgIGFzc2VydChpdGVtZGljdC0+Zm9ybWF0KTsKKyAgICBpZiAoaXRlbWRpY3QtPmZvcm1hdFswXSA9PSAnKCcpIHsKKyAgICAgICAgc3ByaW50ZihidWYsICIoJWxkLCIsIGxlbmd0aCk7CisgICAgICAgIHN0Z2RpY3QtPmZvcm1hdCA9IGFsbG9jX2Zvcm1hdF9zdHJpbmcoYnVmLCBpdGVtZGljdC0+Zm9ybWF0KzEpOworICAgIH0gZWxzZSB7CisgICAgICAgIHNwcmludGYoYnVmLCAiKCVsZCkiLCBsZW5ndGgpOworICAgICAgICBzdGdkaWN0LT5mb3JtYXQgPSBhbGxvY19mb3JtYXRfc3RyaW5nKGJ1ZiwgaXRlbWRpY3QtPmZvcm1hdCk7CisgICAgfQorICAgIGlmIChzdGdkaWN0LT5mb3JtYXQgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYoKFB5T2JqZWN0ICopc3RnZGljdCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBzdGdkaWN0LT5uZGltID0gaXRlbWRpY3QtPm5kaW0gKyAxOworICAgIHN0Z2RpY3QtPnNoYXBlID0gUHlNZW1fTWFsbG9jKHNpemVvZihQeV9zc2l6ZV90ICopICogc3RnZGljdC0+bmRpbSk7CisgICAgaWYgKHN0Z2RpY3QtPnNoYXBlID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKChQeU9iamVjdCAqKXN0Z2RpY3QpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgc3RnZGljdC0+c2hhcGVbMF0gPSBsZW5ndGg7CisgICAgbWVtbW92ZSgmc3RnZGljdC0+c2hhcGVbMV0sIGl0ZW1kaWN0LT5zaGFwZSwKKyAgICAgICAgc2l6ZW9mKFB5X3NzaXplX3QpICogKHN0Z2RpY3QtPm5kaW0gLSAxKSk7CiAKLQlpdGVtc2l6ZSA9IGl0ZW1kaWN0LT5zaXplOwotCWlmIChsZW5ndGggKiBpdGVtc2l6ZSA8IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0JCQkJImFycmF5IHRvbyBsYXJnZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaXRlbXNpemUgPSBpdGVtZGljdC0+c2l6ZTsKKyAgICBpZiAobGVuZ3RoICogaXRlbXNpemUgPCAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImFycmF5IHRvbyBsYXJnZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlpdGVtYWxpZ24gPSBpdGVtZGljdC0+YWxpZ247CisgICAgaXRlbWFsaWduID0gaXRlbWRpY3QtPmFsaWduOwogCi0JaWYgKGl0ZW1kaWN0LT5mbGFncyAmIChUWVBFRkxBR19JU1BPSU5URVIgfCBUWVBFRkxBR19IQVNQT0lOVEVSKSkKLQkJc3RnZGljdC0+ZmxhZ3MgfD0gVFlQRUZMQUdfSEFTUE9JTlRFUjsKKyAgICBpZiAoaXRlbWRpY3QtPmZsYWdzICYgKFRZUEVGTEFHX0lTUE9JTlRFUiB8IFRZUEVGTEFHX0hBU1BPSU5URVIpKQorICAgICAgICBzdGdkaWN0LT5mbGFncyB8PSBUWVBFRkxBR19IQVNQT0lOVEVSOwogCi0Jc3RnZGljdC0+c2l6ZSA9IGl0ZW1zaXplICogbGVuZ3RoOwotCXN0Z2RpY3QtPmFsaWduID0gaXRlbWFsaWduOwotCXN0Z2RpY3QtPmxlbmd0aCA9IGxlbmd0aDsKLQlQeV9JTkNSRUYocHJvdG8pOwotCXN0Z2RpY3QtPnByb3RvID0gcHJvdG87CisgICAgc3RnZGljdC0+c2l6ZSA9IGl0ZW1zaXplICogbGVuZ3RoOworICAgIHN0Z2RpY3QtPmFsaWduID0gaXRlbWFsaWduOworICAgIHN0Z2RpY3QtPmxlbmd0aCA9IGxlbmd0aDsKKyAgICBQeV9JTkNSRUYocHJvdG8pOworICAgIHN0Z2RpY3QtPnByb3RvID0gcHJvdG87CiAKLQlzdGdkaWN0LT5wYXJhbWZ1bmMgPSAmQXJyYXlUeXBlX3BhcmFtZnVuYzsKKyAgICBzdGdkaWN0LT5wYXJhbWZ1bmMgPSAmQXJyYXlUeXBlX3BhcmFtZnVuYzsKIAotCS8qIEFycmF5cyBhcmUgcGFzc2VkIGFzIHBvaW50ZXJzIHRvIGZ1bmN0aW9uIGNhbGxzLiAqLwotCXN0Z2RpY3QtPmZmaV90eXBlX3BvaW50ZXIgPSBmZmlfdHlwZV9wb2ludGVyOworICAgIC8qIEFycmF5cyBhcmUgcGFzc2VkIGFzIHBvaW50ZXJzIHRvIGZ1bmN0aW9uIGNhbGxzLiAqLworICAgIHN0Z2RpY3QtPmZmaV90eXBlX3BvaW50ZXIgPSBmZmlfdHlwZV9wb2ludGVyOwogCi0JLyogY3JlYXRlIHRoZSBuZXcgaW5zdGFuY2UgKHdoaWNoIGlzIGEgY2xhc3MsCi0JICAgc2luY2Ugd2UgYXJlIGEgbWV0YXR5cGUhKSAqLwotCXJlc3VsdCA9IChQeVR5cGVPYmplY3QgKilQeVR5cGVfVHlwZS50cF9uZXcodHlwZSwgYXJncywga3dkcyk7Ci0JaWYgKHJlc3VsdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICAvKiBjcmVhdGUgdGhlIG5ldyBpbnN0YW5jZSAod2hpY2ggaXMgYSBjbGFzcywKKyAgICAgICBzaW5jZSB3ZSBhcmUgYSBtZXRhdHlwZSEpICovCisgICAgcmVzdWx0ID0gKFB5VHlwZU9iamVjdCAqKVB5VHlwZV9UeXBlLnRwX25ldyh0eXBlLCBhcmdzLCBrd2RzKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JLyogcmVwbGFjZSB0aGUgY2xhc3MgZGljdCBieSBvdXIgdXBkYXRlZCBzcGFtIGRpY3QgKi8KLQlpZiAoLTEgPT0gUHlEaWN0X1VwZGF0ZSgoUHlPYmplY3QgKilzdGdkaWN0LCByZXN1bHQtPnRwX2RpY3QpKSB7Ci0JCVB5X0RFQ1JFRihyZXN1bHQpOwotCQlQeV9ERUNSRUYoKFB5T2JqZWN0ICopc3RnZGljdCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlQeV9ERUNSRUYocmVzdWx0LT50cF9kaWN0KTsKLQlyZXN1bHQtPnRwX2RpY3QgPSAoUHlPYmplY3QgKilzdGdkaWN0OworICAgIC8qIHJlcGxhY2UgdGhlIGNsYXNzIGRpY3QgYnkgb3VyIHVwZGF0ZWQgc3BhbSBkaWN0ICovCisgICAgaWYgKC0xID09IFB5RGljdF9VcGRhdGUoKFB5T2JqZWN0ICopc3RnZGljdCwgcmVzdWx0LT50cF9kaWN0KSkgeworICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgUHlfREVDUkVGKChQeU9iamVjdCAqKXN0Z2RpY3QpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlfREVDUkVGKHJlc3VsdC0+dHBfZGljdCk7CisgICAgcmVzdWx0LT50cF9kaWN0ID0gKFB5T2JqZWN0ICopc3RnZGljdDsKIAotCS8qIFNwZWNpYWwgY2FzZSBmb3IgY2hhcmFjdGVyIGFycmF5cy4KLQkgICBBIHBlcm1hbmVudCBhbm5veWFuY2U6IGNoYXIgYXJyYXlzIGFyZSBhbHNvIHN0cmluZ3MhCi0JKi8KLQlpZiAoaXRlbWRpY3QtPmdldGZ1bmMgPT0gZ2V0ZW50cnkoImMiKS0+Z2V0ZnVuYykgewotCQlpZiAoLTEgPT0gYWRkX2dldHNldChyZXN1bHQsIENoYXJBcnJheV9nZXRzZXRzKSkKLQkJCXJldHVybiBOVUxMOworICAgIC8qIFNwZWNpYWwgY2FzZSBmb3IgY2hhcmFjdGVyIGFycmF5cy4KKyAgICAgICBBIHBlcm1hbmVudCBhbm5veWFuY2U6IGNoYXIgYXJyYXlzIGFyZSBhbHNvIHN0cmluZ3MhCisgICAgKi8KKyAgICBpZiAoaXRlbWRpY3QtPmdldGZ1bmMgPT0gZ2V0ZW50cnkoImMiKS0+Z2V0ZnVuYykgeworICAgICAgICBpZiAoLTEgPT0gYWRkX2dldHNldChyZXN1bHQsIENoYXJBcnJheV9nZXRzZXRzKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogI2lmZGVmIENUWVBFU19VTklDT0RFCi0JfSBlbHNlIGlmIChpdGVtZGljdC0+Z2V0ZnVuYyA9PSBnZXRlbnRyeSgidSIpLT5nZXRmdW5jKSB7Ci0JCWlmICgtMSA9PSBhZGRfZ2V0c2V0KHJlc3VsdCwgV0NoYXJBcnJheV9nZXRzZXRzKSkKLQkJCXJldHVybiBOVUxMOworICAgIH0gZWxzZSBpZiAoaXRlbWRpY3QtPmdldGZ1bmMgPT0gZ2V0ZW50cnkoInUiKS0+Z2V0ZnVuYykgeworICAgICAgICBpZiAoLTEgPT0gYWRkX2dldHNldChyZXN1bHQsIFdDaGFyQXJyYXlfZ2V0c2V0cykpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKICNlbmRpZgotCX0KKyAgICB9CiAKLQlyZXR1cm4gKFB5T2JqZWN0ICopcmVzdWx0OworICAgIHJldHVybiAoUHlPYmplY3QgKilyZXN1bHQ7CiB9CiAKIFB5VHlwZU9iamVjdCBBcnJheVR5cGVfVHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKLQkiX2N0eXBlcy5BcnJheVR5cGUiLAkJCS8qIHRwX25hbWUgKi8KLQkwLAkJCQkJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJCS8qIHRwX2l0ZW1zaXplICovCi0JMCwJCQkJCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkwLAkJCSAgICAgICAJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JJkNEYXRhVHlwZV9hc19zZXF1ZW5jZSwJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJCQkJCS8qIHRwX2hhc2ggKi8KLQkwLAkJCQkJLyogdHBfY2FsbCAqLwotCTAsCQkJCQkvKiB0cF9zdHIgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQkibWV0YXR5cGUgZm9yIHRoZSBBcnJheSBPYmplY3RzIiwJLyogdHBfZG9jICovCi0JMCwJCQkJCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkJLyogdHBfaXRlcm5leHQgKi8KLQlDRGF0YVR5cGVfbWV0aG9kcywJCQkvKiB0cF9tZXRob2RzICovCi0JMCwJCQkJCS8qIHRwX21lbWJlcnMgKi8KLQkwLAkJCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaW5pdCAqLwotCTAsCQkJCQkvKiB0cF9hbGxvYyAqLwotCUFycmF5VHlwZV9uZXcsCQkJCS8qIHRwX25ldyAqLwotCTAsCQkJCQkvKiB0cF9mcmVlICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisgICAgIl9jdHlwZXMuQXJyYXlUeXBlIiwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgJkNEYXRhVHlwZV9hc19zZXF1ZW5jZSwgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgIm1ldGF0eXBlIGZvciB0aGUgQXJyYXkgT2JqZWN0cyIsICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIENEYXRhVHlwZV9tZXRob2RzLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBBcnJheVR5cGVfbmV3LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKIAotDAorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKICAgU2ltcGxlVHlwZV9UeXBlCkBAIC0xNDcyLDI2NCArMTQ3MiwyNjQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBjX3djaGFyX3BfZnJvbV9wYXJhbShQeU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKnZhbHVlKQogewotCVB5T2JqZWN0ICphc19wYXJhbWV0ZXI7CisgICAgUHlPYmplY3QgKmFzX3BhcmFtZXRlcjsKICNpZiAoUFlUSE9OX0FQSV9WRVJTSU9OIDwgMTAxMikKICMgZXJyb3Igbm90IHN1cHBvcnRlZAogI2VuZGlmCi0JaWYgKHZhbHVlID09IFB5X05vbmUpIHsKLQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQlyZXR1cm4gUHlfTm9uZTsKLQl9Ci0JaWYgKFB5VW5pY29kZV9DaGVjayh2YWx1ZSkgfHwgUHlTdHJpbmdfQ2hlY2sodmFsdWUpKSB7Ci0JCVB5Q0FyZ09iamVjdCAqcGFyZzsKLQkJc3RydWN0IGZpZWxkZGVzYyAqZmQgPSBnZXRlbnRyeSgiWiIpOworICAgIGlmICh2YWx1ZSA9PSBQeV9Ob25lKSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgfQorICAgIGlmIChQeVVuaWNvZGVfQ2hlY2sodmFsdWUpIHx8IFB5U3RyaW5nX0NoZWNrKHZhbHVlKSkgeworICAgICAgICBQeUNBcmdPYmplY3QgKnBhcmc7CisgICAgICAgIHN0cnVjdCBmaWVsZGRlc2MgKmZkID0gZ2V0ZW50cnkoIloiKTsKIAotCQlwYXJnID0gbmV3X0NBcmdPYmplY3QoKTsKLQkJaWYgKHBhcmcgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQlwYXJnLT5wZmZpX3R5cGUgPSAmZmZpX3R5cGVfcG9pbnRlcjsKLQkJcGFyZy0+dGFnID0gJ1onOwotCQlwYXJnLT5vYmogPSBmZC0+c2V0ZnVuYygmcGFyZy0+dmFsdWUsIHZhbHVlLCAwKTsKLQkJaWYgKHBhcmctPm9iaiA9PSBOVUxMKSB7Ci0JCQlQeV9ERUNSRUYocGFyZyk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlyZXR1cm4gKFB5T2JqZWN0ICopcGFyZzsKLQl9Ci0JaWYgKFB5T2JqZWN0X0lzSW5zdGFuY2UodmFsdWUsIHR5cGUpKSB7Ci0JCVB5X0lOQ1JFRih2YWx1ZSk7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0JaWYgKEFycmF5T2JqZWN0X0NoZWNrKHZhbHVlKSB8fCBQb2ludGVyT2JqZWN0X0NoZWNrKHZhbHVlKSkgewotCQkvKiBjX3djaGFyIGFycmF5IGluc3RhbmNlIG9yIHBvaW50ZXIoY193Y2hhciguLi4pKSAqLwotCQlTdGdEaWN0T2JqZWN0ICpkdCA9IFB5T2JqZWN0X3N0Z2RpY3QodmFsdWUpOwotCQlTdGdEaWN0T2JqZWN0ICpkaWN0OwotCQlhc3NlcnQoZHQpOyAvKiBDYW5ub3QgYmUgTlVMTCBmb3IgcG9pbnRlciBvciBhcnJheSBvYmplY3RzICovCi0JCWRpY3QgPSBkdCAmJiBkdC0+cHJvdG8gPyBQeVR5cGVfc3RnZGljdChkdC0+cHJvdG8pIDogTlVMTDsKLQkJaWYgKGRpY3QgJiYgKGRpY3QtPnNldGZ1bmMgPT0gZ2V0ZW50cnkoInUiKS0+c2V0ZnVuYykpIHsKLQkJCVB5X0lOQ1JFRih2YWx1ZSk7Ci0JCQlyZXR1cm4gdmFsdWU7Ci0JCX0KLQl9Ci0JaWYgKFB5Q0FyZ19DaGVja0V4YWN0KHZhbHVlKSkgewotCQkvKiBieXJlZihjX2NoYXIoLi4uKSkgKi8KLQkJUHlDQXJnT2JqZWN0ICphID0gKFB5Q0FyZ09iamVjdCAqKXZhbHVlOwotCQlTdGdEaWN0T2JqZWN0ICpkaWN0ID0gUHlPYmplY3Rfc3RnZGljdChhLT5vYmopOwotCQlpZiAoZGljdCAmJiAoZGljdC0+c2V0ZnVuYyA9PSBnZXRlbnRyeSgidSIpLT5zZXRmdW5jKSkgewotCQkJUHlfSU5DUkVGKHZhbHVlKTsKLQkJCXJldHVybiB2YWx1ZTsKLQkJfQotCX0KKyAgICAgICAgcGFyZyA9IG5ld19DQXJnT2JqZWN0KCk7CisgICAgICAgIGlmIChwYXJnID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgcGFyZy0+cGZmaV90eXBlID0gJmZmaV90eXBlX3BvaW50ZXI7CisgICAgICAgIHBhcmctPnRhZyA9ICdaJzsKKyAgICAgICAgcGFyZy0+b2JqID0gZmQtPnNldGZ1bmMoJnBhcmctPnZhbHVlLCB2YWx1ZSwgMCk7CisgICAgICAgIGlmIChwYXJnLT5vYmogPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKHBhcmcpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChQeU9iamVjdCAqKXBhcmc7CisgICAgfQorICAgIGlmIChQeU9iamVjdF9Jc0luc3RhbmNlKHZhbHVlLCB0eXBlKSkgeworICAgICAgICBQeV9JTkNSRUYodmFsdWUpOworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorICAgIGlmIChBcnJheU9iamVjdF9DaGVjayh2YWx1ZSkgfHwgUG9pbnRlck9iamVjdF9DaGVjayh2YWx1ZSkpIHsKKyAgICAgICAgLyogY193Y2hhciBhcnJheSBpbnN0YW5jZSBvciBwb2ludGVyKGNfd2NoYXIoLi4uKSkgKi8KKyAgICAgICAgU3RnRGljdE9iamVjdCAqZHQgPSBQeU9iamVjdF9zdGdkaWN0KHZhbHVlKTsKKyAgICAgICAgU3RnRGljdE9iamVjdCAqZGljdDsKKyAgICAgICAgYXNzZXJ0KGR0KTsgLyogQ2Fubm90IGJlIE5VTEwgZm9yIHBvaW50ZXIgb3IgYXJyYXkgb2JqZWN0cyAqLworICAgICAgICBkaWN0ID0gZHQgJiYgZHQtPnByb3RvID8gUHlUeXBlX3N0Z2RpY3QoZHQtPnByb3RvKSA6IE5VTEw7CisgICAgICAgIGlmIChkaWN0ICYmIChkaWN0LT5zZXRmdW5jID09IGdldGVudHJ5KCJ1IiktPnNldGZ1bmMpKSB7CisgICAgICAgICAgICBQeV9JTkNSRUYodmFsdWUpOworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisgICAgfQorICAgIGlmIChQeUNBcmdfQ2hlY2tFeGFjdCh2YWx1ZSkpIHsKKyAgICAgICAgLyogYnlyZWYoY19jaGFyKC4uLikpICovCisgICAgICAgIFB5Q0FyZ09iamVjdCAqYSA9IChQeUNBcmdPYmplY3QgKil2YWx1ZTsKKyAgICAgICAgU3RnRGljdE9iamVjdCAqZGljdCA9IFB5T2JqZWN0X3N0Z2RpY3QoYS0+b2JqKTsKKyAgICAgICAgaWYgKGRpY3QgJiYgKGRpY3QtPnNldGZ1bmMgPT0gZ2V0ZW50cnkoInUiKS0+c2V0ZnVuYykpIHsKKyAgICAgICAgICAgIFB5X0lOQ1JFRih2YWx1ZSk7CisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKyAgICB9CiAKLQlhc19wYXJhbWV0ZXIgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHZhbHVlLCAiX2FzX3BhcmFtZXRlcl8iKTsKLQlpZiAoYXNfcGFyYW1ldGVyKSB7Ci0JCXZhbHVlID0gY193Y2hhcl9wX2Zyb21fcGFyYW0odHlwZSwgYXNfcGFyYW1ldGVyKTsKLQkJUHlfREVDUkVGKGFzX3BhcmFtZXRlcik7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0JLyogWFhYIGJldHRlciBtZXNzYWdlICovCi0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCSJ3cm9uZyB0eXBlIik7Ci0JcmV0dXJuIE5VTEw7CisgICAgYXNfcGFyYW1ldGVyID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyh2YWx1ZSwgIl9hc19wYXJhbWV0ZXJfIik7CisgICAgaWYgKGFzX3BhcmFtZXRlcikgeworICAgICAgICB2YWx1ZSA9IGNfd2NoYXJfcF9mcm9tX3BhcmFtKHR5cGUsIGFzX3BhcmFtZXRlcik7CisgICAgICAgIFB5X0RFQ1JFRihhc19wYXJhbWV0ZXIpOworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorICAgIC8qIFhYWCBiZXR0ZXIgbWVzc2FnZSAqLworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICJ3cm9uZyB0eXBlIik7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjX2NoYXJfcF9mcm9tX3BhcmFtKFB5T2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqdmFsdWUpCiB7Ci0JUHlPYmplY3QgKmFzX3BhcmFtZXRlcjsKKyAgICBQeU9iamVjdCAqYXNfcGFyYW1ldGVyOwogI2lmIChQWVRIT05fQVBJX1ZFUlNJT04gPCAxMDEyKQogIyBlcnJvciBub3Qgc3VwcG9ydGVkCiAjZW5kaWYKLQlpZiAodmFsdWUgPT0gUHlfTm9uZSkgewotCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCXJldHVybiBQeV9Ob25lOwotCX0KLQlpZiAoUHlTdHJpbmdfQ2hlY2sodmFsdWUpIHx8IFB5VW5pY29kZV9DaGVjayh2YWx1ZSkpIHsKLQkJUHlDQXJnT2JqZWN0ICpwYXJnOwotCQlzdHJ1Y3QgZmllbGRkZXNjICpmZCA9IGdldGVudHJ5KCJ6Iik7CisgICAgaWYgKHZhbHVlID09IFB5X05vbmUpIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICB9CisgICAgaWYgKFB5U3RyaW5nX0NoZWNrKHZhbHVlKSB8fCBQeVVuaWNvZGVfQ2hlY2sodmFsdWUpKSB7CisgICAgICAgIFB5Q0FyZ09iamVjdCAqcGFyZzsKKyAgICAgICAgc3RydWN0IGZpZWxkZGVzYyAqZmQgPSBnZXRlbnRyeSgieiIpOwogCi0JCXBhcmcgPSBuZXdfQ0FyZ09iamVjdCgpOwotCQlpZiAocGFyZyA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCXBhcmctPnBmZmlfdHlwZSA9ICZmZmlfdHlwZV9wb2ludGVyOwotCQlwYXJnLT50YWcgPSAneic7Ci0JCXBhcmctPm9iaiA9IGZkLT5zZXRmdW5jKCZwYXJnLT52YWx1ZSwgdmFsdWUsIDApOwotCQlpZiAocGFyZy0+b2JqID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRihwYXJnKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCXJldHVybiAoUHlPYmplY3QgKilwYXJnOwotCX0KLQlpZiAoUHlPYmplY3RfSXNJbnN0YW5jZSh2YWx1ZSwgdHlwZSkpIHsKLQkJUHlfSU5DUkVGKHZhbHVlKTsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQlpZiAoQXJyYXlPYmplY3RfQ2hlY2sodmFsdWUpIHx8IFBvaW50ZXJPYmplY3RfQ2hlY2sodmFsdWUpKSB7Ci0JCS8qIGNfY2hhciBhcnJheSBpbnN0YW5jZSBvciBwb2ludGVyKGNfY2hhciguLi4pKSAqLwotCQlTdGdEaWN0T2JqZWN0ICpkdCA9IFB5T2JqZWN0X3N0Z2RpY3QodmFsdWUpOwotCQlTdGdEaWN0T2JqZWN0ICpkaWN0OwotCQlhc3NlcnQoZHQpOyAvKiBDYW5ub3QgYmUgTlVMTCBmb3IgcG9pbnRlciBvciBhcnJheSBvYmplY3RzICovCi0JCWRpY3QgPSBkdCAmJiBkdC0+cHJvdG8gPyBQeVR5cGVfc3RnZGljdChkdC0+cHJvdG8pIDogTlVMTDsKLQkJaWYgKGRpY3QgJiYgKGRpY3QtPnNldGZ1bmMgPT0gZ2V0ZW50cnkoImMiKS0+c2V0ZnVuYykpIHsKLQkJCVB5X0lOQ1JFRih2YWx1ZSk7Ci0JCQlyZXR1cm4gdmFsdWU7Ci0JCX0KLQl9Ci0JaWYgKFB5Q0FyZ19DaGVja0V4YWN0KHZhbHVlKSkgewotCQkvKiBieXJlZihjX2NoYXIoLi4uKSkgKi8KLQkJUHlDQXJnT2JqZWN0ICphID0gKFB5Q0FyZ09iamVjdCAqKXZhbHVlOwotCQlTdGdEaWN0T2JqZWN0ICpkaWN0ID0gUHlPYmplY3Rfc3RnZGljdChhLT5vYmopOwotCQlpZiAoZGljdCAmJiAoZGljdC0+c2V0ZnVuYyA9PSBnZXRlbnRyeSgiYyIpLT5zZXRmdW5jKSkgewotCQkJUHlfSU5DUkVGKHZhbHVlKTsKLQkJCXJldHVybiB2YWx1ZTsKLQkJfQotCX0KKyAgICAgICAgcGFyZyA9IG5ld19DQXJnT2JqZWN0KCk7CisgICAgICAgIGlmIChwYXJnID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgcGFyZy0+cGZmaV90eXBlID0gJmZmaV90eXBlX3BvaW50ZXI7CisgICAgICAgIHBhcmctPnRhZyA9ICd6JzsKKyAgICAgICAgcGFyZy0+b2JqID0gZmQtPnNldGZ1bmMoJnBhcmctPnZhbHVlLCB2YWx1ZSwgMCk7CisgICAgICAgIGlmIChwYXJnLT5vYmogPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKHBhcmcpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChQeU9iamVjdCAqKXBhcmc7CisgICAgfQorICAgIGlmIChQeU9iamVjdF9Jc0luc3RhbmNlKHZhbHVlLCB0eXBlKSkgeworICAgICAgICBQeV9JTkNSRUYodmFsdWUpOworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorICAgIGlmIChBcnJheU9iamVjdF9DaGVjayh2YWx1ZSkgfHwgUG9pbnRlck9iamVjdF9DaGVjayh2YWx1ZSkpIHsKKyAgICAgICAgLyogY19jaGFyIGFycmF5IGluc3RhbmNlIG9yIHBvaW50ZXIoY19jaGFyKC4uLikpICovCisgICAgICAgIFN0Z0RpY3RPYmplY3QgKmR0ID0gUHlPYmplY3Rfc3RnZGljdCh2YWx1ZSk7CisgICAgICAgIFN0Z0RpY3RPYmplY3QgKmRpY3Q7CisgICAgICAgIGFzc2VydChkdCk7IC8qIENhbm5vdCBiZSBOVUxMIGZvciBwb2ludGVyIG9yIGFycmF5IG9iamVjdHMgKi8KKyAgICAgICAgZGljdCA9IGR0ICYmIGR0LT5wcm90byA/IFB5VHlwZV9zdGdkaWN0KGR0LT5wcm90bykgOiBOVUxMOworICAgICAgICBpZiAoZGljdCAmJiAoZGljdC0+c2V0ZnVuYyA9PSBnZXRlbnRyeSgiYyIpLT5zZXRmdW5jKSkgeworICAgICAgICAgICAgUHlfSU5DUkVGKHZhbHVlKTsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoUHlDQXJnX0NoZWNrRXhhY3QodmFsdWUpKSB7CisgICAgICAgIC8qIGJ5cmVmKGNfY2hhciguLi4pKSAqLworICAgICAgICBQeUNBcmdPYmplY3QgKmEgPSAoUHlDQXJnT2JqZWN0ICopdmFsdWU7CisgICAgICAgIFN0Z0RpY3RPYmplY3QgKmRpY3QgPSBQeU9iamVjdF9zdGdkaWN0KGEtPm9iaik7CisgICAgICAgIGlmIChkaWN0ICYmIChkaWN0LT5zZXRmdW5jID09IGdldGVudHJ5KCJjIiktPnNldGZ1bmMpKSB7CisgICAgICAgICAgICBQeV9JTkNSRUYodmFsdWUpOworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisgICAgfQogCi0JYXNfcGFyYW1ldGVyID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyh2YWx1ZSwgIl9hc19wYXJhbWV0ZXJfIik7Ci0JaWYgKGFzX3BhcmFtZXRlcikgewotCQl2YWx1ZSA9IGNfY2hhcl9wX2Zyb21fcGFyYW0odHlwZSwgYXNfcGFyYW1ldGVyKTsKLQkJUHlfREVDUkVGKGFzX3BhcmFtZXRlcik7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0JLyogWFhYIGJldHRlciBtZXNzYWdlICovCi0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCSJ3cm9uZyB0eXBlIik7Ci0JcmV0dXJuIE5VTEw7CisgICAgYXNfcGFyYW1ldGVyID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyh2YWx1ZSwgIl9hc19wYXJhbWV0ZXJfIik7CisgICAgaWYgKGFzX3BhcmFtZXRlcikgeworICAgICAgICB2YWx1ZSA9IGNfY2hhcl9wX2Zyb21fcGFyYW0odHlwZSwgYXNfcGFyYW1ldGVyKTsKKyAgICAgICAgUHlfREVDUkVGKGFzX3BhcmFtZXRlcik7CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisgICAgLyogWFhYIGJldHRlciBtZXNzYWdlICovCisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgIndyb25nIHR5cGUiKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNfdm9pZF9wX2Zyb21fcGFyYW0oUHlPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICp2YWx1ZSkKIHsKLQlTdGdEaWN0T2JqZWN0ICpzdGdkOwotCVB5T2JqZWN0ICphc19wYXJhbWV0ZXI7CisgICAgU3RnRGljdE9iamVjdCAqc3RnZDsKKyAgICBQeU9iamVjdCAqYXNfcGFyYW1ldGVyOwogI2lmIChQWVRIT05fQVBJX1ZFUlNJT04gPCAxMDEyKQogIyBlcnJvciBub3Qgc3VwcG9ydGVkCiAjZW5kaWYKIAogLyogTm9uZSAqLwotCWlmICh2YWx1ZSA9PSBQeV9Ob25lKSB7Ci0JCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJcmV0dXJuIFB5X05vbmU7Ci0JfQotCS8qIFNob3VsZCBwcm9iYWJseSBhbGxvdyBidWZmZXIgaW50ZXJmYWNlIGFzIHdlbGwgKi8KKyAgICBpZiAodmFsdWUgPT0gUHlfTm9uZSkgeworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIHJldHVybiBQeV9Ob25lOworICAgIH0KKyAgICAvKiBTaG91bGQgcHJvYmFibHkgYWxsb3cgYnVmZmVyIGludGVyZmFjZSBhcyB3ZWxsICovCiAvKiBpbnQsIGxvbmcgKi8KLQlpZiAoUHlJbnRfQ2hlY2sodmFsdWUpIHx8IFB5TG9uZ19DaGVjayh2YWx1ZSkpIHsKLQkJUHlDQXJnT2JqZWN0ICpwYXJnOwotCQlzdHJ1Y3QgZmllbGRkZXNjICpmZCA9IGdldGVudHJ5KCJQIik7CisgICAgaWYgKFB5SW50X0NoZWNrKHZhbHVlKSB8fCBQeUxvbmdfQ2hlY2sodmFsdWUpKSB7CisgICAgICAgIFB5Q0FyZ09iamVjdCAqcGFyZzsKKyAgICAgICAgc3RydWN0IGZpZWxkZGVzYyAqZmQgPSBnZXRlbnRyeSgiUCIpOwogCi0JCXBhcmcgPSBuZXdfQ0FyZ09iamVjdCgpOwotCQlpZiAocGFyZyA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCXBhcmctPnBmZmlfdHlwZSA9ICZmZmlfdHlwZV9wb2ludGVyOwotCQlwYXJnLT50YWcgPSAnUCc7Ci0JCXBhcmctPm9iaiA9IGZkLT5zZXRmdW5jKCZwYXJnLT52YWx1ZSwgdmFsdWUsIDApOwotCQlpZiAocGFyZy0+b2JqID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRihwYXJnKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCXJldHVybiAoUHlPYmplY3QgKilwYXJnOwotCX0KKyAgICAgICAgcGFyZyA9IG5ld19DQXJnT2JqZWN0KCk7CisgICAgICAgIGlmIChwYXJnID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgcGFyZy0+cGZmaV90eXBlID0gJmZmaV90eXBlX3BvaW50ZXI7CisgICAgICAgIHBhcmctPnRhZyA9ICdQJzsKKyAgICAgICAgcGFyZy0+b2JqID0gZmQtPnNldGZ1bmMoJnBhcmctPnZhbHVlLCB2YWx1ZSwgMCk7CisgICAgICAgIGlmIChwYXJnLT5vYmogPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKHBhcmcpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChQeU9iamVjdCAqKXBhcmc7CisgICAgfQogLyogc3RyaW5nICovCi0JaWYgKFB5U3RyaW5nX0NoZWNrKHZhbHVlKSkgewotCQlQeUNBcmdPYmplY3QgKnBhcmc7Ci0JCXN0cnVjdCBmaWVsZGRlc2MgKmZkID0gZ2V0ZW50cnkoInoiKTsKKyAgICBpZiAoUHlTdHJpbmdfQ2hlY2sodmFsdWUpKSB7CisgICAgICAgIFB5Q0FyZ09iamVjdCAqcGFyZzsKKyAgICAgICAgc3RydWN0IGZpZWxkZGVzYyAqZmQgPSBnZXRlbnRyeSgieiIpOwogCi0JCXBhcmcgPSBuZXdfQ0FyZ09iamVjdCgpOwotCQlpZiAocGFyZyA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCXBhcmctPnBmZmlfdHlwZSA9ICZmZmlfdHlwZV9wb2ludGVyOwotCQlwYXJnLT50YWcgPSAneic7Ci0JCXBhcmctPm9iaiA9IGZkLT5zZXRmdW5jKCZwYXJnLT52YWx1ZSwgdmFsdWUsIDApOwotCQlpZiAocGFyZy0+b2JqID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRihwYXJnKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCXJldHVybiAoUHlPYmplY3QgKilwYXJnOwotCX0KKyAgICAgICAgcGFyZyA9IG5ld19DQXJnT2JqZWN0KCk7CisgICAgICAgIGlmIChwYXJnID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgcGFyZy0+cGZmaV90eXBlID0gJmZmaV90eXBlX3BvaW50ZXI7CisgICAgICAgIHBhcmctPnRhZyA9ICd6JzsKKyAgICAgICAgcGFyZy0+b2JqID0gZmQtPnNldGZ1bmMoJnBhcmctPnZhbHVlLCB2YWx1ZSwgMCk7CisgICAgICAgIGlmIChwYXJnLT5vYmogPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKHBhcmcpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChQeU9iamVjdCAqKXBhcmc7CisgICAgfQogLyogdW5pY29kZSAqLwotCWlmIChQeVVuaWNvZGVfQ2hlY2sodmFsdWUpKSB7Ci0JCVB5Q0FyZ09iamVjdCAqcGFyZzsKLQkJc3RydWN0IGZpZWxkZGVzYyAqZmQgPSBnZXRlbnRyeSgiWiIpOworICAgIGlmIChQeVVuaWNvZGVfQ2hlY2sodmFsdWUpKSB7CisgICAgICAgIFB5Q0FyZ09iamVjdCAqcGFyZzsKKyAgICAgICAgc3RydWN0IGZpZWxkZGVzYyAqZmQgPSBnZXRlbnRyeSgiWiIpOwogCi0JCXBhcmcgPSBuZXdfQ0FyZ09iamVjdCgpOwotCQlpZiAocGFyZyA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCXBhcmctPnBmZmlfdHlwZSA9ICZmZmlfdHlwZV9wb2ludGVyOwotCQlwYXJnLT50YWcgPSAnWic7Ci0JCXBhcmctPm9iaiA9IGZkLT5zZXRmdW5jKCZwYXJnLT52YWx1ZSwgdmFsdWUsIDApOwotCQlpZiAocGFyZy0+b2JqID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRihwYXJnKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCXJldHVybiAoUHlPYmplY3QgKilwYXJnOwotCX0KKyAgICAgICAgcGFyZyA9IG5ld19DQXJnT2JqZWN0KCk7CisgICAgICAgIGlmIChwYXJnID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgcGFyZy0+cGZmaV90eXBlID0gJmZmaV90eXBlX3BvaW50ZXI7CisgICAgICAgIHBhcmctPnRhZyA9ICdaJzsKKyAgICAgICAgcGFyZy0+b2JqID0gZmQtPnNldGZ1bmMoJnBhcmctPnZhbHVlLCB2YWx1ZSwgMCk7CisgICAgICAgIGlmIChwYXJnLT5vYmogPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKHBhcmcpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChQeU9iamVjdCAqKXBhcmc7CisgICAgfQogLyogY192b2lkX3AgaW5zdGFuY2UgKG9yIHN1YmNsYXNzKSAqLwotCWlmIChQeU9iamVjdF9Jc0luc3RhbmNlKHZhbHVlLCB0eXBlKSkgewotCQkvKiBjX3ZvaWRfcCBpbnN0YW5jZXMgKi8KLQkJUHlfSU5DUkVGKHZhbHVlKTsKLQkJcmV0dXJuIHZhbHVlOwotCX0KKyAgICBpZiAoUHlPYmplY3RfSXNJbnN0YW5jZSh2YWx1ZSwgdHlwZSkpIHsKKyAgICAgICAgLyogY192b2lkX3AgaW5zdGFuY2VzICovCisgICAgICAgIFB5X0lOQ1JFRih2YWx1ZSk7CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CiAvKiBjdHlwZXMgYXJyYXkgb3IgcG9pbnRlciBpbnN0YW5jZSAqLwotCWlmIChBcnJheU9iamVjdF9DaGVjayh2YWx1ZSkgfHwgUG9pbnRlck9iamVjdF9DaGVjayh2YWx1ZSkpIHsKLQkJLyogQW55IGFycmF5IG9yIHBvaW50ZXIgaXMgYWNjZXB0ZWQgKi8KLQkJUHlfSU5DUkVGKHZhbHVlKTsKLQkJcmV0dXJuIHZhbHVlOwotCX0KKyAgICBpZiAoQXJyYXlPYmplY3RfQ2hlY2sodmFsdWUpIHx8IFBvaW50ZXJPYmplY3RfQ2hlY2sodmFsdWUpKSB7CisgICAgICAgIC8qIEFueSBhcnJheSBvciBwb2ludGVyIGlzIGFjY2VwdGVkICovCisgICAgICAgIFB5X0lOQ1JFRih2YWx1ZSk7CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CiAvKiBieXJlZiguLi4pICovCi0JaWYgKFB5Q0FyZ19DaGVja0V4YWN0KHZhbHVlKSkgewotCQkvKiBieXJlZihjX3h4eCgpKSAqLwotCQlQeUNBcmdPYmplY3QgKmEgPSAoUHlDQXJnT2JqZWN0ICopdmFsdWU7Ci0JCWlmIChhLT50YWcgPT0gJ1AnKSB7Ci0JCQlQeV9JTkNSRUYodmFsdWUpOwotCQkJcmV0dXJuIHZhbHVlOwotCQl9Ci0JfQorICAgIGlmIChQeUNBcmdfQ2hlY2tFeGFjdCh2YWx1ZSkpIHsKKyAgICAgICAgLyogYnlyZWYoY194eHgoKSkgKi8KKyAgICAgICAgUHlDQXJnT2JqZWN0ICphID0gKFB5Q0FyZ09iamVjdCAqKXZhbHVlOworICAgICAgICBpZiAoYS0+dGFnID09ICdQJykgeworICAgICAgICAgICAgUHlfSU5DUkVGKHZhbHVlKTsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorICAgIH0KIC8qIGZ1bmN0aW9uIHBvaW50ZXIgKi8KLQlpZiAoQ0Z1bmNQdHJPYmplY3RfQ2hlY2sodmFsdWUpKSB7Ci0JCVB5Q0FyZ09iamVjdCAqcGFyZzsKLQkJQ0Z1bmNQdHJPYmplY3QgKmZ1bmM7Ci0JCWZ1bmMgPSAoQ0Z1bmNQdHJPYmplY3QgKil2YWx1ZTsKLQkJcGFyZyA9IG5ld19DQXJnT2JqZWN0KCk7Ci0JCWlmIChwYXJnID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQkJcGFyZy0+cGZmaV90eXBlID0gJmZmaV90eXBlX3BvaW50ZXI7Ci0JCXBhcmctPnRhZyA9ICdQJzsKLQkJUHlfSU5DUkVGKHZhbHVlKTsKLQkJcGFyZy0+dmFsdWUucCA9ICoodm9pZCAqKilmdW5jLT5iX3B0cjsKLQkJcGFyZy0+b2JqID0gdmFsdWU7Ci0JCXJldHVybiAoUHlPYmplY3QgKilwYXJnOwotCX0KKyAgICBpZiAoQ0Z1bmNQdHJPYmplY3RfQ2hlY2sodmFsdWUpKSB7CisgICAgICAgIFB5Q0FyZ09iamVjdCAqcGFyZzsKKyAgICAgICAgQ0Z1bmNQdHJPYmplY3QgKmZ1bmM7CisgICAgICAgIGZ1bmMgPSAoQ0Z1bmNQdHJPYmplY3QgKil2YWx1ZTsKKyAgICAgICAgcGFyZyA9IG5ld19DQXJnT2JqZWN0KCk7CisgICAgICAgIGlmIChwYXJnID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgcGFyZy0+cGZmaV90eXBlID0gJmZmaV90eXBlX3BvaW50ZXI7CisgICAgICAgIHBhcmctPnRhZyA9ICdQJzsKKyAgICAgICAgUHlfSU5DUkVGKHZhbHVlKTsKKyAgICAgICAgcGFyZy0+dmFsdWUucCA9ICoodm9pZCAqKilmdW5jLT5iX3B0cjsKKyAgICAgICAgcGFyZy0+b2JqID0gdmFsdWU7CisgICAgICAgIHJldHVybiAoUHlPYmplY3QgKilwYXJnOworICAgIH0KIC8qIGNfY2hhcl9wLCBjX3djaGFyX3AgKi8KLQlzdGdkID0gUHlPYmplY3Rfc3RnZGljdCh2YWx1ZSk7Ci0JaWYgKHN0Z2QgJiYgQ0RhdGFPYmplY3RfQ2hlY2sodmFsdWUpICYmIHN0Z2QtPnByb3RvICYmIFB5U3RyaW5nX0NoZWNrKHN0Z2QtPnByb3RvKSkgewotCQlQeUNBcmdPYmplY3QgKnBhcmc7CisgICAgc3RnZCA9IFB5T2JqZWN0X3N0Z2RpY3QodmFsdWUpOworICAgIGlmIChzdGdkICYmIENEYXRhT2JqZWN0X0NoZWNrKHZhbHVlKSAmJiBzdGdkLT5wcm90byAmJiBQeVN0cmluZ19DaGVjayhzdGdkLT5wcm90bykpIHsKKyAgICAgICAgUHlDQXJnT2JqZWN0ICpwYXJnOwogCi0JCXN3aXRjaCAoUHlTdHJpbmdfQVNfU1RSSU5HKHN0Z2QtPnByb3RvKVswXSkgewotCQljYXNlICd6JzogLyogY19jaGFyX3AgKi8KLQkJY2FzZSAnWic6IC8qIGNfd2NoYXJfcCAqLwotCQkJcGFyZyA9IG5ld19DQXJnT2JqZWN0KCk7Ci0JCQlpZiAocGFyZyA9PSBOVUxMKQotCQkJCXJldHVybiBOVUxMOwotCQkJcGFyZy0+cGZmaV90eXBlID0gJmZmaV90eXBlX3BvaW50ZXI7Ci0JCQlwYXJnLT50YWcgPSAnWic7Ci0JCQlQeV9JTkNSRUYodmFsdWUpOwotCQkJcGFyZy0+b2JqID0gdmFsdWU7Ci0JCQkvKiBSZW1lbWJlcjogYl9wdHIgcG9pbnRzIHRvIHdoZXJlIHRoZSBwb2ludGVyIGlzIHN0b3JlZCEgKi8KLQkJCXBhcmctPnZhbHVlLnAgPSAqKHZvaWQgKiopKCgoQ0RhdGFPYmplY3QgKil2YWx1ZSktPmJfcHRyKTsKLQkJCXJldHVybiAoUHlPYmplY3QgKilwYXJnOwotCQl9Ci0JfQorICAgICAgICBzd2l0Y2ggKFB5U3RyaW5nX0FTX1NUUklORyhzdGdkLT5wcm90bylbMF0pIHsKKyAgICAgICAgY2FzZSAneic6IC8qIGNfY2hhcl9wICovCisgICAgICAgIGNhc2UgJ1onOiAvKiBjX3djaGFyX3AgKi8KKyAgICAgICAgICAgIHBhcmcgPSBuZXdfQ0FyZ09iamVjdCgpOworICAgICAgICAgICAgaWYgKHBhcmcgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIHBhcmctPnBmZmlfdHlwZSA9ICZmZmlfdHlwZV9wb2ludGVyOworICAgICAgICAgICAgcGFyZy0+dGFnID0gJ1onOworICAgICAgICAgICAgUHlfSU5DUkVGKHZhbHVlKTsKKyAgICAgICAgICAgIHBhcmctPm9iaiA9IHZhbHVlOworICAgICAgICAgICAgLyogUmVtZW1iZXI6IGJfcHRyIHBvaW50cyB0byB3aGVyZSB0aGUgcG9pbnRlciBpcyBzdG9yZWQhICovCisgICAgICAgICAgICBwYXJnLT52YWx1ZS5wID0gKih2b2lkICoqKSgoKENEYXRhT2JqZWN0ICopdmFsdWUpLT5iX3B0cik7CisgICAgICAgICAgICByZXR1cm4gKFB5T2JqZWN0ICopcGFyZzsKKyAgICAgICAgfQorICAgIH0KIAotCWFzX3BhcmFtZXRlciA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcodmFsdWUsICJfYXNfcGFyYW1ldGVyXyIpOwotCWlmIChhc19wYXJhbWV0ZXIpIHsKLQkJdmFsdWUgPSBjX3ZvaWRfcF9mcm9tX3BhcmFtKHR5cGUsIGFzX3BhcmFtZXRlcik7Ci0JCVB5X0RFQ1JFRihhc19wYXJhbWV0ZXIpOwotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCS8qIFhYWCBiZXR0ZXIgbWVzc2FnZSAqLwotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkid3JvbmcgdHlwZSIpOwotCXJldHVybiBOVUxMOworICAgIGFzX3BhcmFtZXRlciA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcodmFsdWUsICJfYXNfcGFyYW1ldGVyXyIpOworICAgIGlmIChhc19wYXJhbWV0ZXIpIHsKKyAgICAgICAgdmFsdWUgPSBjX3ZvaWRfcF9mcm9tX3BhcmFtKHR5cGUsIGFzX3BhcmFtZXRlcik7CisgICAgICAgIFB5X0RFQ1JFRihhc19wYXJhbWV0ZXIpOworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorICAgIC8qIFhYWCBiZXR0ZXIgbWVzc2FnZSAqLworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICJ3cm9uZyB0eXBlIik7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAjaWYgKFBZVEhPTl9BUElfVkVSU0lPTiA+PSAxMDEyKQogCkBAIC0xNzQ2LDI5MSArMTc0NiwyOTEgQEAKICNlbmRpZgogCiBzdGF0aWMgUHlPYmplY3QgKkNyZWF0ZVN3YXBwZWRUeXBlKFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzLAotCQkJCSAgIFB5T2JqZWN0ICpwcm90bywgc3RydWN0IGZpZWxkZGVzYyAqZm10KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqcHJvdG8sIHN0cnVjdCBmaWVsZGRlc2MgKmZtdCkKIHsKLQlQeVR5cGVPYmplY3QgKnJlc3VsdDsKLQlTdGdEaWN0T2JqZWN0ICpzdGdkaWN0OwotCVB5T2JqZWN0ICpuYW1lID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCAwKTsKLQlQeU9iamVjdCAqc3dhcHBlZF9hcmdzOwotCXN0YXRpYyBQeU9iamVjdCAqc3VmZml4OwotCVB5X3NzaXplX3QgaTsKKyAgICBQeVR5cGVPYmplY3QgKnJlc3VsdDsKKyAgICBTdGdEaWN0T2JqZWN0ICpzdGdkaWN0OworICAgIFB5T2JqZWN0ICpuYW1lID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCAwKTsKKyAgICBQeU9iamVjdCAqc3dhcHBlZF9hcmdzOworICAgIHN0YXRpYyBQeU9iamVjdCAqc3VmZml4OworICAgIFB5X3NzaXplX3QgaTsKIAotCXN3YXBwZWRfYXJncyA9IFB5VHVwbGVfTmV3KFB5VHVwbGVfR0VUX1NJWkUoYXJncykpOwotCWlmICghc3dhcHBlZF9hcmdzKQotCQlyZXR1cm4gTlVMTDsKKyAgICBzd2FwcGVkX2FyZ3MgPSBQeVR1cGxlX05ldyhQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpKTsKKyAgICBpZiAoIXN3YXBwZWRfYXJncykKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoc3VmZml4ID09IE5VTEwpCisgICAgaWYgKHN1ZmZpeCA9PSBOVUxMKQogI2lmZGVmIFdPUkRTX0JJR0VORElBTgotCQlzdWZmaXggPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfbGUiKTsKKyAgICAgICAgc3VmZml4ID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX2xlIik7CiAjZWxzZQotCQlzdWZmaXggPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfYmUiKTsKKyAgICAgICAgc3VmZml4ID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX2JlIik7CiAjZW5kaWYKIAotCVB5X0lOQ1JFRihuYW1lKTsKLQlQeVN0cmluZ19Db25jYXQoJm5hbWUsIHN1ZmZpeCk7Ci0JaWYgKG5hbWUgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgUHlfSU5DUkVGKG5hbWUpOworICAgIFB5U3RyaW5nX0NvbmNhdCgmbmFtZSwgc3VmZml4KTsKKyAgICBpZiAobmFtZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCVB5VHVwbGVfU0VUX0lURU0oc3dhcHBlZF9hcmdzLCAwLCBuYW1lKTsKLQlmb3IgKGk9MTsgaTxQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpOyArK2kpIHsKLQkJUHlPYmplY3QgKnYgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIGkpOwotCQlQeV9JTkNSRUYodik7Ci0JCVB5VHVwbGVfU0VUX0lURU0oc3dhcHBlZF9hcmdzLCBpLCB2KTsKLQl9CisgICAgUHlUdXBsZV9TRVRfSVRFTShzd2FwcGVkX2FyZ3MsIDAsIG5hbWUpOworICAgIGZvciAoaT0xOyBpPFB5VHVwbGVfR0VUX1NJWkUoYXJncyk7ICsraSkgeworICAgICAgICBQeU9iamVjdCAqdiA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgaSk7CisgICAgICAgIFB5X0lOQ1JFRih2KTsKKyAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShzd2FwcGVkX2FyZ3MsIGksIHYpOworICAgIH0KIAotCS8qIGNyZWF0ZSB0aGUgbmV3IGluc3RhbmNlICh3aGljaCBpcyBhIGNsYXNzLAotCSAgIHNpbmNlIHdlIGFyZSBhIG1ldGF0eXBlISkgKi8KLQlyZXN1bHQgPSAoUHlUeXBlT2JqZWN0ICopUHlUeXBlX1R5cGUudHBfbmV3KHR5cGUsIHN3YXBwZWRfYXJncywga3dkcyk7Ci0JUHlfREVDUkVGKHN3YXBwZWRfYXJncyk7Ci0JaWYgKHJlc3VsdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICAvKiBjcmVhdGUgdGhlIG5ldyBpbnN0YW5jZSAod2hpY2ggaXMgYSBjbGFzcywKKyAgICAgICBzaW5jZSB3ZSBhcmUgYSBtZXRhdHlwZSEpICovCisgICAgcmVzdWx0ID0gKFB5VHlwZU9iamVjdCAqKVB5VHlwZV9UeXBlLnRwX25ldyh0eXBlLCBzd2FwcGVkX2FyZ3MsIGt3ZHMpOworICAgIFB5X0RFQ1JFRihzd2FwcGVkX2FyZ3MpOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlzdGdkaWN0ID0gKFN0Z0RpY3RPYmplY3QgKilQeU9iamVjdF9DYWxsT2JqZWN0KAotCQkoUHlPYmplY3QgKikmU3RnRGljdF9UeXBlLCBOVUxMKTsKLQlpZiAoIXN0Z2RpY3QpIC8qIFhYWCBsZWFrcyByZXN1bHQhICovCi0JCXJldHVybiBOVUxMOworICAgIHN0Z2RpY3QgPSAoU3RnRGljdE9iamVjdCAqKVB5T2JqZWN0X0NhbGxPYmplY3QoCisgICAgICAgIChQeU9iamVjdCAqKSZTdGdEaWN0X1R5cGUsIE5VTEwpOworICAgIGlmICghc3RnZGljdCkgLyogWFhYIGxlYWtzIHJlc3VsdCEgKi8KKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlzdGdkaWN0LT5mZmlfdHlwZV9wb2ludGVyID0gKmZtdC0+cGZmaV90eXBlOwotCXN0Z2RpY3QtPmFsaWduID0gZm10LT5wZmZpX3R5cGUtPmFsaWdubWVudDsKLQlzdGdkaWN0LT5sZW5ndGggPSAwOwotCXN0Z2RpY3QtPnNpemUgPSBmbXQtPnBmZmlfdHlwZS0+c2l6ZTsKLQlzdGdkaWN0LT5zZXRmdW5jID0gZm10LT5zZXRmdW5jX3N3YXBwZWQ7Ci0Jc3RnZGljdC0+Z2V0ZnVuYyA9IGZtdC0+Z2V0ZnVuY19zd2FwcGVkOworICAgIHN0Z2RpY3QtPmZmaV90eXBlX3BvaW50ZXIgPSAqZm10LT5wZmZpX3R5cGU7CisgICAgc3RnZGljdC0+YWxpZ24gPSBmbXQtPnBmZmlfdHlwZS0+YWxpZ25tZW50OworICAgIHN0Z2RpY3QtPmxlbmd0aCA9IDA7CisgICAgc3RnZGljdC0+c2l6ZSA9IGZtdC0+cGZmaV90eXBlLT5zaXplOworICAgIHN0Z2RpY3QtPnNldGZ1bmMgPSBmbXQtPnNldGZ1bmNfc3dhcHBlZDsKKyAgICBzdGdkaWN0LT5nZXRmdW5jID0gZm10LT5nZXRmdW5jX3N3YXBwZWQ7CiAKLQlQeV9JTkNSRUYocHJvdG8pOwotCXN0Z2RpY3QtPnByb3RvID0gcHJvdG87CisgICAgUHlfSU5DUkVGKHByb3RvKTsKKyAgICBzdGdkaWN0LT5wcm90byA9IHByb3RvOwogCi0JLyogcmVwbGFjZSB0aGUgY2xhc3MgZGljdCBieSBvdXIgdXBkYXRlZCBzcGFtIGRpY3QgKi8KLQlpZiAoLTEgPT0gUHlEaWN0X1VwZGF0ZSgoUHlPYmplY3QgKilzdGdkaWN0LCByZXN1bHQtPnRwX2RpY3QpKSB7Ci0JCVB5X0RFQ1JFRihyZXN1bHQpOwotCQlQeV9ERUNSRUYoKFB5T2JqZWN0ICopc3RnZGljdCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlQeV9ERUNSRUYocmVzdWx0LT50cF9kaWN0KTsKLQlyZXN1bHQtPnRwX2RpY3QgPSAoUHlPYmplY3QgKilzdGdkaWN0OworICAgIC8qIHJlcGxhY2UgdGhlIGNsYXNzIGRpY3QgYnkgb3VyIHVwZGF0ZWQgc3BhbSBkaWN0ICovCisgICAgaWYgKC0xID09IFB5RGljdF9VcGRhdGUoKFB5T2JqZWN0ICopc3RnZGljdCwgcmVzdWx0LT50cF9kaWN0KSkgeworICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgUHlfREVDUkVGKChQeU9iamVjdCAqKXN0Z2RpY3QpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlfREVDUkVGKHJlc3VsdC0+dHBfZGljdCk7CisgICAgcmVzdWx0LT50cF9kaWN0ID0gKFB5T2JqZWN0ICopc3RnZGljdDsKIAotCXJldHVybiAoUHlPYmplY3QgKilyZXN1bHQ7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKXJlc3VsdDsKIH0KIAogc3RhdGljIFB5Q0FyZ09iamVjdCAqCiBTaW1wbGVUeXBlX3BhcmFtZnVuYyhDRGF0YU9iamVjdCAqc2VsZikKIHsKLQlTdGdEaWN0T2JqZWN0ICpkaWN0OwotCWNoYXIgKmZtdDsKLQlQeUNBcmdPYmplY3QgKnBhcmc7Ci0Jc3RydWN0IGZpZWxkZGVzYyAqZmQ7Ci0JCi0JZGljdCA9IFB5T2JqZWN0X3N0Z2RpY3QoKFB5T2JqZWN0ICopc2VsZik7Ci0JYXNzZXJ0KGRpY3QpOyAvKiBDYW5ub3QgYmUgTlVMTCBmb3IgQ0RhdGFPYmplY3QgaW5zdGFuY2VzICovCi0JZm10ID0gUHlTdHJpbmdfQXNTdHJpbmcoZGljdC0+cHJvdG8pOwotCWFzc2VydChmbXQpOworICAgIFN0Z0RpY3RPYmplY3QgKmRpY3Q7CisgICAgY2hhciAqZm10OworICAgIFB5Q0FyZ09iamVjdCAqcGFyZzsKKyAgICBzdHJ1Y3QgZmllbGRkZXNjICpmZDsKIAotCWZkID0gZ2V0ZW50cnkoZm10KTsKLQlhc3NlcnQoZmQpOwotCQotCXBhcmcgPSBuZXdfQ0FyZ09iamVjdCgpOwotCWlmIChwYXJnID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCQotCXBhcmctPnRhZyA9IGZtdFswXTsKLQlwYXJnLT5wZmZpX3R5cGUgPSBmZC0+cGZmaV90eXBlOwotCVB5X0lOQ1JFRihzZWxmKTsKLQlwYXJnLT5vYmogPSAoUHlPYmplY3QgKilzZWxmOwotCW1lbWNweSgmcGFyZy0+dmFsdWUsIHNlbGYtPmJfcHRyLCBzZWxmLT5iX3NpemUpOwotCXJldHVybiBwYXJnOwkKKyAgICBkaWN0ID0gUHlPYmplY3Rfc3RnZGljdCgoUHlPYmplY3QgKilzZWxmKTsKKyAgICBhc3NlcnQoZGljdCk7IC8qIENhbm5vdCBiZSBOVUxMIGZvciBDRGF0YU9iamVjdCBpbnN0YW5jZXMgKi8KKyAgICBmbXQgPSBQeVN0cmluZ19Bc1N0cmluZyhkaWN0LT5wcm90byk7CisgICAgYXNzZXJ0KGZtdCk7CisKKyAgICBmZCA9IGdldGVudHJ5KGZtdCk7CisgICAgYXNzZXJ0KGZkKTsKKworICAgIHBhcmcgPSBuZXdfQ0FyZ09iamVjdCgpOworICAgIGlmIChwYXJnID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgcGFyZy0+dGFnID0gZm10WzBdOworICAgIHBhcmctPnBmZmlfdHlwZSA9IGZkLT5wZmZpX3R5cGU7CisgICAgUHlfSU5DUkVGKHNlbGYpOworICAgIHBhcmctPm9iaiA9IChQeU9iamVjdCAqKXNlbGY7CisgICAgbWVtY3B5KCZwYXJnLT52YWx1ZSwgc2VsZi0+Yl9wdHIsIHNlbGYtPmJfc2l6ZSk7CisgICAgcmV0dXJuIHBhcmc7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBTaW1wbGVUeXBlX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlQeVR5cGVPYmplY3QgKnJlc3VsdDsKLQlTdGdEaWN0T2JqZWN0ICpzdGdkaWN0OwotCVB5T2JqZWN0ICpwcm90bzsKLQljb25zdCBjaGFyICpwcm90b19zdHI7Ci0JUHlfc3NpemVfdCBwcm90b19sZW47Ci0JUHlNZXRob2REZWYgKm1sOwotCXN0cnVjdCBmaWVsZGRlc2MgKmZtdDsKKyAgICBQeVR5cGVPYmplY3QgKnJlc3VsdDsKKyAgICBTdGdEaWN0T2JqZWN0ICpzdGdkaWN0OworICAgIFB5T2JqZWN0ICpwcm90bzsKKyAgICBjb25zdCBjaGFyICpwcm90b19zdHI7CisgICAgUHlfc3NpemVfdCBwcm90b19sZW47CisgICAgUHlNZXRob2REZWYgKm1sOworICAgIHN0cnVjdCBmaWVsZGRlc2MgKmZtdDsKIAotCS8qIGNyZWF0ZSB0aGUgbmV3IGluc3RhbmNlICh3aGljaCBpcyBhIGNsYXNzLAotCSAgIHNpbmNlIHdlIGFyZSBhIG1ldGF0eXBlISkgKi8KLQlyZXN1bHQgPSAoUHlUeXBlT2JqZWN0ICopUHlUeXBlX1R5cGUudHBfbmV3KHR5cGUsIGFyZ3MsIGt3ZHMpOwotCWlmIChyZXN1bHQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgLyogY3JlYXRlIHRoZSBuZXcgaW5zdGFuY2UgKHdoaWNoIGlzIGEgY2xhc3MsCisgICAgICAgc2luY2Ugd2UgYXJlIGEgbWV0YXR5cGUhKSAqLworICAgIHJlc3VsdCA9IChQeVR5cGVPYmplY3QgKilQeVR5cGVfVHlwZS50cF9uZXcodHlwZSwgYXJncywga3dkcyk7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXByb3RvID0gUHlPYmplY3RfR2V0QXR0clN0cmluZygoUHlPYmplY3QgKilyZXN1bHQsICJfdHlwZV8iKTsgLyogbmV3IHJlZiAqLwotCWlmICghcHJvdG8pIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0F0dHJpYnV0ZUVycm9yLAotCQkJCSJjbGFzcyBtdXN0IGRlZmluZSBhICdfdHlwZV8nIGF0dHJpYnV0ZSIpOworICAgIHByb3RvID0gUHlPYmplY3RfR2V0QXR0clN0cmluZygoUHlPYmplY3QgKilyZXN1bHQsICJfdHlwZV8iKTsgLyogbmV3IHJlZiAqLworICAgIGlmICghcHJvdG8pIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0F0dHJpYnV0ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImNsYXNzIG11c3QgZGVmaW5lIGEgJ190eXBlXycgYXR0cmlidXRlIik7CiAgIGVycm9yOgotCQlQeV9YREVDUkVGKHByb3RvKTsKLQkJUHlfWERFQ1JFRihyZXN1bHQpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKFB5U3RyaW5nX0NoZWNrKHByb3RvKSkgewotCQlwcm90b19zdHIgPSBQeVN0cmluZ19BU19TVFJJTkcocHJvdG8pOwotCQlwcm90b19sZW4gPSBQeVN0cmluZ19HRVRfU0laRShwcm90byk7Ci0JfSBlbHNlIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCSJjbGFzcyBtdXN0IGRlZmluZSBhICdfdHlwZV8nIHN0cmluZyBhdHRyaWJ1dGUiKTsKLQkJZ290byBlcnJvcjsKLQl9Ci0JaWYgKHByb3RvX2xlbiAhPSAxKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJjbGFzcyBtdXN0IGRlZmluZSBhICdfdHlwZV8nIGF0dHJpYnV0ZSAiCi0JCQkJIndoaWNoIG11c3QgYmUgYSBzdHJpbmcgb2YgbGVuZ3RoIDEiKTsKLQkJZ290byBlcnJvcjsKLQl9Ci0JaWYgKCFzdHJjaHIoU0lNUExFX1RZUEVfQ0hBUlMsICpwcm90b19zdHIpKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19BdHRyaWJ1dGVFcnJvciwKLQkJCSAgICAgImNsYXNzIG11c3QgZGVmaW5lIGEgJ190eXBlXycgYXR0cmlidXRlIHdoaWNoIG11c3QgYmVcbiIKLQkJCSAgICAgImEgc2luZ2xlIGNoYXJhY3RlciBzdHJpbmcgY29udGFpbmluZyBvbmUgb2YgJyVzJy4iLAotCQkJICAgICBTSU1QTEVfVFlQRV9DSEFSUyk7Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCWZtdCA9IGdldGVudHJ5KFB5U3RyaW5nX0FTX1NUUklORyhwcm90bykpOwotCWlmIChmbXQgPT0gTlVMTCkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKLQkJCSAgICAgIl90eXBlXyAnJXMnIG5vdCBzdXBwb3J0ZWQiLAotCQkJICAgICBQeVN0cmluZ19BU19TVFJJTkcocHJvdG8pKTsKLQkJZ290byBlcnJvcjsKLQl9CisgICAgICAgIFB5X1hERUNSRUYocHJvdG8pOworICAgICAgICBQeV9YREVDUkVGKHJlc3VsdCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoUHlTdHJpbmdfQ2hlY2socHJvdG8pKSB7CisgICAgICAgIHByb3RvX3N0ciA9IFB5U3RyaW5nX0FTX1NUUklORyhwcm90byk7CisgICAgICAgIHByb3RvX2xlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHByb3RvKTsKKyAgICB9IGVsc2UgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgImNsYXNzIG11c3QgZGVmaW5lIGEgJ190eXBlXycgc3RyaW5nIGF0dHJpYnV0ZSIpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgICBpZiAocHJvdG9fbGVuICE9IDEpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiY2xhc3MgbXVzdCBkZWZpbmUgYSAnX3R5cGVfJyBhdHRyaWJ1dGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgIndoaWNoIG11c3QgYmUgYSBzdHJpbmcgb2YgbGVuZ3RoIDEiKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgaWYgKCFzdHJjaHIoU0lNUExFX1RZUEVfQ0hBUlMsICpwcm90b19zdHIpKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19BdHRyaWJ1dGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJjbGFzcyBtdXN0IGRlZmluZSBhICdfdHlwZV8nIGF0dHJpYnV0ZSB3aGljaCBtdXN0IGJlXG4iCisgICAgICAgICAgICAgICAgICAgICAiYSBzaW5nbGUgY2hhcmFjdGVyIHN0cmluZyBjb250YWluaW5nIG9uZSBvZiAnJXMnLiIsCisgICAgICAgICAgICAgICAgICAgICBTSU1QTEVfVFlQRV9DSEFSUyk7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorICAgIGZtdCA9IGdldGVudHJ5KFB5U3RyaW5nX0FTX1NUUklORyhwcm90bykpOworICAgIGlmIChmbXQgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJfdHlwZV8gJyVzJyBub3Qgc3VwcG9ydGVkIiwKKyAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FTX1NUUklORyhwcm90bykpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KIAotCXN0Z2RpY3QgPSAoU3RnRGljdE9iamVjdCAqKVB5T2JqZWN0X0NhbGxPYmplY3QoCi0JCShQeU9iamVjdCAqKSZTdGdEaWN0X1R5cGUsIE5VTEwpOwotCWlmICghc3RnZGljdCkKLQkJZ290byBlcnJvcjsKKyAgICBzdGdkaWN0ID0gKFN0Z0RpY3RPYmplY3QgKilQeU9iamVjdF9DYWxsT2JqZWN0KAorICAgICAgICAoUHlPYmplY3QgKikmU3RnRGljdF9UeXBlLCBOVUxMKTsKKyAgICBpZiAoIXN0Z2RpY3QpCisgICAgICAgIGdvdG8gZXJyb3I7CiAKLQlzdGdkaWN0LT5mZmlfdHlwZV9wb2ludGVyID0gKmZtdC0+cGZmaV90eXBlOwotCXN0Z2RpY3QtPmFsaWduID0gZm10LT5wZmZpX3R5cGUtPmFsaWdubWVudDsKLQlzdGdkaWN0LT5sZW5ndGggPSAwOwotCXN0Z2RpY3QtPnNpemUgPSBmbXQtPnBmZmlfdHlwZS0+c2l6ZTsKLQlzdGdkaWN0LT5zZXRmdW5jID0gZm10LT5zZXRmdW5jOwotCXN0Z2RpY3QtPmdldGZ1bmMgPSBmbXQtPmdldGZ1bmM7CisgICAgc3RnZGljdC0+ZmZpX3R5cGVfcG9pbnRlciA9ICpmbXQtPnBmZmlfdHlwZTsKKyAgICBzdGdkaWN0LT5hbGlnbiA9IGZtdC0+cGZmaV90eXBlLT5hbGlnbm1lbnQ7CisgICAgc3RnZGljdC0+bGVuZ3RoID0gMDsKKyAgICBzdGdkaWN0LT5zaXplID0gZm10LT5wZmZpX3R5cGUtPnNpemU7CisgICAgc3RnZGljdC0+c2V0ZnVuYyA9IGZtdC0+c2V0ZnVuYzsKKyAgICBzdGdkaWN0LT5nZXRmdW5jID0gZm10LT5nZXRmdW5jOwogI2lmZGVmIFdPUkRTX0JJR0VORElBTgotCXN0Z2RpY3QtPmZvcm1hdCA9IGFsbG9jX2Zvcm1hdF9zdHJpbmcoIj4iLCBwcm90b19zdHIpOworICAgIHN0Z2RpY3QtPmZvcm1hdCA9IGFsbG9jX2Zvcm1hdF9zdHJpbmcoIj4iLCBwcm90b19zdHIpOwogI2Vsc2UKLQlzdGdkaWN0LT5mb3JtYXQgPSBhbGxvY19mb3JtYXRfc3RyaW5nKCI8IiwgcHJvdG9fc3RyKTsKKyAgICBzdGdkaWN0LT5mb3JtYXQgPSBhbGxvY19mb3JtYXRfc3RyaW5nKCI8IiwgcHJvdG9fc3RyKTsKICNlbmRpZgotCWlmIChzdGdkaWN0LT5mb3JtYXQgPT0gTlVMTCkgewotCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJUHlfREVDUkVGKHByb3RvKTsKLQkJUHlfREVDUkVGKChQeU9iamVjdCAqKXN0Z2RpY3QpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKHN0Z2RpY3QtPmZvcm1hdCA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICBQeV9ERUNSRUYocHJvdG8pOworICAgICAgICBQeV9ERUNSRUYoKFB5T2JqZWN0ICopc3RnZGljdCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXN0Z2RpY3QtPnBhcmFtZnVuYyA9IFNpbXBsZVR5cGVfcGFyYW1mdW5jOworICAgIHN0Z2RpY3QtPnBhcmFtZnVuYyA9IFNpbXBsZVR5cGVfcGFyYW1mdW5jOwogLyoKLQlpZiAocmVzdWx0LT50cF9iYXNlICE9ICZTaW1wbGVfVHlwZSkgewotCQlzdGdkaWN0LT5zZXRmdW5jID0gTlVMTDsKLQkJc3RnZGljdC0+Z2V0ZnVuYyA9IE5VTEw7Ci0JfQorICAgIGlmIChyZXN1bHQtPnRwX2Jhc2UgIT0gJlNpbXBsZV9UeXBlKSB7CisgICAgICAgIHN0Z2RpY3QtPnNldGZ1bmMgPSBOVUxMOworICAgICAgICBzdGdkaWN0LT5nZXRmdW5jID0gTlVMTDsKKyAgICB9CiAqLwogCi0JLyogVGhpcyBjb25zdW1lcyB0aGUgcmVmY291bnQgb24gcHJvdG8gd2hpY2ggd2UgaGF2ZSAqLwotCXN0Z2RpY3QtPnByb3RvID0gcHJvdG87CisgICAgLyogVGhpcyBjb25zdW1lcyB0aGUgcmVmY291bnQgb24gcHJvdG8gd2hpY2ggd2UgaGF2ZSAqLworICAgIHN0Z2RpY3QtPnByb3RvID0gcHJvdG87CiAKLQkvKiByZXBsYWNlIHRoZSBjbGFzcyBkaWN0IGJ5IG91ciB1cGRhdGVkIHNwYW0gZGljdCAqLwotCWlmICgtMSA9PSBQeURpY3RfVXBkYXRlKChQeU9iamVjdCAqKXN0Z2RpY3QsIHJlc3VsdC0+dHBfZGljdCkpIHsKLQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCVB5X0RFQ1JFRigoUHlPYmplY3QgKilzdGdkaWN0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5X0RFQ1JFRihyZXN1bHQtPnRwX2RpY3QpOwotCXJlc3VsdC0+dHBfZGljdCA9IChQeU9iamVjdCAqKXN0Z2RpY3Q7CisgICAgLyogcmVwbGFjZSB0aGUgY2xhc3MgZGljdCBieSBvdXIgdXBkYXRlZCBzcGFtIGRpY3QgKi8KKyAgICBpZiAoLTEgPT0gUHlEaWN0X1VwZGF0ZSgoUHlPYmplY3QgKilzdGdkaWN0LCByZXN1bHQtPnRwX2RpY3QpKSB7CisgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICBQeV9ERUNSRUYoKFB5T2JqZWN0ICopc3RnZGljdCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeV9ERUNSRUYocmVzdWx0LT50cF9kaWN0KTsKKyAgICByZXN1bHQtPnRwX2RpY3QgPSAoUHlPYmplY3QgKilzdGdkaWN0OwogCi0JLyogSW5zdGFsbCBmcm9tX3BhcmFtIGNsYXNzIG1ldGhvZHMgaW4gY3R5cGVzIGJhc2UgY2xhc3Nlcy4KLQkgICBPdmVycmlkZXMgdGhlIFNpbXBsZVR5cGVfZnJvbV9wYXJhbSBnZW5lcmljIG1ldGhvZC4KLQkgKi8KLQlpZiAocmVzdWx0LT50cF9iYXNlID09ICZTaW1wbGVfVHlwZSkgewotCQlzd2l0Y2ggKFB5U3RyaW5nX0FTX1NUUklORyhwcm90bylbMF0pIHsKLQkJY2FzZSAneic6IC8qIGNfY2hhcl9wICovCi0JCQltbCA9ICZjX2NoYXJfcF9tZXRob2Q7Ci0JCQlzdGdkaWN0LT5mbGFncyB8PSBUWVBFRkxBR19JU1BPSU5URVI7Ci0JCQlicmVhazsKLQkJY2FzZSAnWic6IC8qIGNfd2NoYXJfcCAqLwotCQkJbWwgPSAmY193Y2hhcl9wX21ldGhvZDsKLQkJCXN0Z2RpY3QtPmZsYWdzIHw9IFRZUEVGTEFHX0lTUE9JTlRFUjsKLQkJCWJyZWFrOwotCQljYXNlICdQJzogLyogY192b2lkX3AgKi8KLQkJCW1sID0gJmNfdm9pZF9wX21ldGhvZDsKLQkJCXN0Z2RpY3QtPmZsYWdzIHw9IFRZUEVGTEFHX0lTUE9JTlRFUjsKLQkJCWJyZWFrOwotCQljYXNlICdzJzoKLQkJY2FzZSAnWCc6Ci0JCWNhc2UgJ08nOgotCQkJbWwgPSBOVUxMOwotCQkJc3RnZGljdC0+ZmxhZ3MgfD0gVFlQRUZMQUdfSVNQT0lOVEVSOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQltbCA9IE5VTEw7Ci0JCQlicmVhazsKLQkJfQotCQkJCi0JCWlmIChtbCkgeworICAgIC8qIEluc3RhbGwgZnJvbV9wYXJhbSBjbGFzcyBtZXRob2RzIGluIGN0eXBlcyBiYXNlIGNsYXNzZXMuCisgICAgICAgT3ZlcnJpZGVzIHRoZSBTaW1wbGVUeXBlX2Zyb21fcGFyYW0gZ2VuZXJpYyBtZXRob2QuCisgICAgICovCisgICAgaWYgKHJlc3VsdC0+dHBfYmFzZSA9PSAmU2ltcGxlX1R5cGUpIHsKKyAgICAgICAgc3dpdGNoIChQeVN0cmluZ19BU19TVFJJTkcocHJvdG8pWzBdKSB7CisgICAgICAgIGNhc2UgJ3onOiAvKiBjX2NoYXJfcCAqLworICAgICAgICAgICAgbWwgPSAmY19jaGFyX3BfbWV0aG9kOworICAgICAgICAgICAgc3RnZGljdC0+ZmxhZ3MgfD0gVFlQRUZMQUdfSVNQT0lOVEVSOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ1onOiAvKiBjX3djaGFyX3AgKi8KKyAgICAgICAgICAgIG1sID0gJmNfd2NoYXJfcF9tZXRob2Q7CisgICAgICAgICAgICBzdGdkaWN0LT5mbGFncyB8PSBUWVBFRkxBR19JU1BPSU5URVI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnUCc6IC8qIGNfdm9pZF9wICovCisgICAgICAgICAgICBtbCA9ICZjX3ZvaWRfcF9tZXRob2Q7CisgICAgICAgICAgICBzdGdkaWN0LT5mbGFncyB8PSBUWVBFRkxBR19JU1BPSU5URVI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAncyc6CisgICAgICAgIGNhc2UgJ1gnOgorICAgICAgICBjYXNlICdPJzoKKyAgICAgICAgICAgIG1sID0gTlVMTDsKKyAgICAgICAgICAgIHN0Z2RpY3QtPmZsYWdzIHw9IFRZUEVGTEFHX0lTUE9JTlRFUjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgbWwgPSBOVUxMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAobWwpIHsKICNpZiAoUFlUSE9OX0FQSV9WRVJTSU9OID49IDEwMTIpCi0JCQlQeU9iamVjdCAqbWV0aDsKLQkJCWludCB4OwotCQkJbWV0aCA9IFB5RGVzY3JfTmV3Q2xhc3NNZXRob2QocmVzdWx0LCBtbCk7Ci0JCQlpZiAoIW1ldGgpCi0JCQkJcmV0dXJuIE5VTEw7CisgICAgICAgICAgICBQeU9iamVjdCAqbWV0aDsKKyAgICAgICAgICAgIGludCB4OworICAgICAgICAgICAgbWV0aCA9IFB5RGVzY3JfTmV3Q2xhc3NNZXRob2QocmVzdWx0LCBtbCk7CisgICAgICAgICAgICBpZiAoIW1ldGgpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAjZWxzZQogI2Vycm9yCi0JCQlQeU9iamVjdCAqbWV0aCwgKmZ1bmM7Ci0JCQlpbnQgeDsKLQkJCWZ1bmMgPSBQeUNGdW5jdGlvbl9OZXcobWwsIE5VTEwpOwotCQkJaWYgKCFmdW5jKQotCQkJCXJldHVybiBOVUxMOwotCQkJbWV0aCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoCi0JCQkJKFB5T2JqZWN0ICopJlB5Q2xhc3NNZXRob2RfVHlwZSwKLQkJCQlmdW5jLCBOVUxMKTsKLQkJCVB5X0RFQ1JFRihmdW5jKTsKLQkJCWlmICghbWV0aCkgewotCQkJCXJldHVybiBOVUxMOwotCQkJfQorICAgICAgICAgICAgUHlPYmplY3QgKm1ldGgsICpmdW5jOworICAgICAgICAgICAgaW50IHg7CisgICAgICAgICAgICBmdW5jID0gUHlDRnVuY3Rpb25fTmV3KG1sLCBOVUxMKTsKKyAgICAgICAgICAgIGlmICghZnVuYykKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIG1ldGggPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKAorICAgICAgICAgICAgICAgIChQeU9iamVjdCAqKSZQeUNsYXNzTWV0aG9kX1R5cGUsCisgICAgICAgICAgICAgICAgZnVuYywgTlVMTCk7CisgICAgICAgICAgICBQeV9ERUNSRUYoZnVuYyk7CisgICAgICAgICAgICBpZiAoIW1ldGgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KICNlbmRpZgotCQkJeCA9IFB5RGljdF9TZXRJdGVtU3RyaW5nKHJlc3VsdC0+dHBfZGljdCwKLQkJCQkJCSBtbC0+bWxfbmFtZSwKLQkJCQkJCSBtZXRoKTsKLQkJCVB5X0RFQ1JFRihtZXRoKTsKLQkJCWlmICh4ID09IC0xKSB7Ci0JCQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCX0KLQl9CisgICAgICAgICAgICB4ID0gUHlEaWN0X1NldEl0ZW1TdHJpbmcocmVzdWx0LT50cF9kaWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1sLT5tbF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGgpOworICAgICAgICAgICAgUHlfREVDUkVGKG1ldGgpOworICAgICAgICAgICAgaWYgKHggPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIAotCWlmICh0eXBlID09ICZTaW1wbGVUeXBlX1R5cGUgJiYgZm10LT5zZXRmdW5jX3N3YXBwZWQgJiYgZm10LT5nZXRmdW5jX3N3YXBwZWQpIHsKLQkJUHlPYmplY3QgKnN3YXBwZWQgPSBDcmVhdGVTd2FwcGVkVHlwZSh0eXBlLCBhcmdzLCBrd2RzLAotCQkJCQkJICAgICAgcHJvdG8sIGZtdCk7Ci0JCVN0Z0RpY3RPYmplY3QgKnN3X2RpY3Q7Ci0JCWlmIChzd2FwcGVkID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRihyZXN1bHQpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJc3dfZGljdCA9IFB5VHlwZV9zdGdkaWN0KHN3YXBwZWQpOworICAgIGlmICh0eXBlID09ICZTaW1wbGVUeXBlX1R5cGUgJiYgZm10LT5zZXRmdW5jX3N3YXBwZWQgJiYgZm10LT5nZXRmdW5jX3N3YXBwZWQpIHsKKyAgICAgICAgUHlPYmplY3QgKnN3YXBwZWQgPSBDcmVhdGVTd2FwcGVkVHlwZSh0eXBlLCBhcmdzLCBrd2RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvLCBmbXQpOworICAgICAgICBTdGdEaWN0T2JqZWN0ICpzd19kaWN0OworICAgICAgICBpZiAoc3dhcHBlZCA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHN3X2RpY3QgPSBQeVR5cGVfc3RnZGljdChzd2FwcGVkKTsKICNpZmRlZiBXT1JEU19CSUdFTkRJQU4KLQkJUHlPYmplY3RfU2V0QXR0clN0cmluZygoUHlPYmplY3QgKilyZXN1bHQsICJfX2N0eXBlX2xlX18iLCBzd2FwcGVkKTsKLQkJUHlPYmplY3RfU2V0QXR0clN0cmluZygoUHlPYmplY3QgKilyZXN1bHQsICJfX2N0eXBlX2JlX18iLCAoUHlPYmplY3QgKilyZXN1bHQpOwotCQlQeU9iamVjdF9TZXRBdHRyU3RyaW5nKHN3YXBwZWQsICJfX2N0eXBlX2JlX18iLCAoUHlPYmplY3QgKilyZXN1bHQpOwotCQlQeU9iamVjdF9TZXRBdHRyU3RyaW5nKHN3YXBwZWQsICJfX2N0eXBlX2xlX18iLCBzd2FwcGVkKTsKLQkJLyogV2UgYXJlIGNyZWF0aW5nIHRoZSB0eXBlIGZvciB0aGUgT1RIRVIgZW5kaWFuICovCi0JCXN3X2RpY3QtPmZvcm1hdCA9IGFsbG9jX2Zvcm1hdF9zdHJpbmcoIjwiLCBzdGdkaWN0LT5mb3JtYXQrMSk7CisgICAgICAgIFB5T2JqZWN0X1NldEF0dHJTdHJpbmcoKFB5T2JqZWN0ICopcmVzdWx0LCAiX19jdHlwZV9sZV9fIiwgc3dhcHBlZCk7CisgICAgICAgIFB5T2JqZWN0X1NldEF0dHJTdHJpbmcoKFB5T2JqZWN0ICopcmVzdWx0LCAiX19jdHlwZV9iZV9fIiwgKFB5T2JqZWN0ICopcmVzdWx0KTsKKyAgICAgICAgUHlPYmplY3RfU2V0QXR0clN0cmluZyhzd2FwcGVkLCAiX19jdHlwZV9iZV9fIiwgKFB5T2JqZWN0ICopcmVzdWx0KTsKKyAgICAgICAgUHlPYmplY3RfU2V0QXR0clN0cmluZyhzd2FwcGVkLCAiX19jdHlwZV9sZV9fIiwgc3dhcHBlZCk7CisgICAgICAgIC8qIFdlIGFyZSBjcmVhdGluZyB0aGUgdHlwZSBmb3IgdGhlIE9USEVSIGVuZGlhbiAqLworICAgICAgICBzd19kaWN0LT5mb3JtYXQgPSBhbGxvY19mb3JtYXRfc3RyaW5nKCI8Iiwgc3RnZGljdC0+Zm9ybWF0KzEpOwogI2Vsc2UKLQkJUHlPYmplY3RfU2V0QXR0clN0cmluZygoUHlPYmplY3QgKilyZXN1bHQsICJfX2N0eXBlX2JlX18iLCBzd2FwcGVkKTsKLQkJUHlPYmplY3RfU2V0QXR0clN0cmluZygoUHlPYmplY3QgKilyZXN1bHQsICJfX2N0eXBlX2xlX18iLCAoUHlPYmplY3QgKilyZXN1bHQpOwotCQlQeU9iamVjdF9TZXRBdHRyU3RyaW5nKHN3YXBwZWQsICJfX2N0eXBlX2xlX18iLCAoUHlPYmplY3QgKilyZXN1bHQpOwotCQlQeU9iamVjdF9TZXRBdHRyU3RyaW5nKHN3YXBwZWQsICJfX2N0eXBlX2JlX18iLCBzd2FwcGVkKTsKLQkJLyogV2UgYXJlIGNyZWF0aW5nIHRoZSB0eXBlIGZvciB0aGUgT1RIRVIgZW5kaWFuICovCi0JCXN3X2RpY3QtPmZvcm1hdCA9IGFsbG9jX2Zvcm1hdF9zdHJpbmcoIj4iLCBzdGdkaWN0LT5mb3JtYXQrMSk7CisgICAgICAgIFB5T2JqZWN0X1NldEF0dHJTdHJpbmcoKFB5T2JqZWN0ICopcmVzdWx0LCAiX19jdHlwZV9iZV9fIiwgc3dhcHBlZCk7CisgICAgICAgIFB5T2JqZWN0X1NldEF0dHJTdHJpbmcoKFB5T2JqZWN0ICopcmVzdWx0LCAiX19jdHlwZV9sZV9fIiwgKFB5T2JqZWN0ICopcmVzdWx0KTsKKyAgICAgICAgUHlPYmplY3RfU2V0QXR0clN0cmluZyhzd2FwcGVkLCAiX19jdHlwZV9sZV9fIiwgKFB5T2JqZWN0ICopcmVzdWx0KTsKKyAgICAgICAgUHlPYmplY3RfU2V0QXR0clN0cmluZyhzd2FwcGVkLCAiX19jdHlwZV9iZV9fIiwgc3dhcHBlZCk7CisgICAgICAgIC8qIFdlIGFyZSBjcmVhdGluZyB0aGUgdHlwZSBmb3IgdGhlIE9USEVSIGVuZGlhbiAqLworICAgICAgICBzd19kaWN0LT5mb3JtYXQgPSBhbGxvY19mb3JtYXRfc3RyaW5nKCI+Iiwgc3RnZGljdC0+Zm9ybWF0KzEpOwogI2VuZGlmCi0JCVB5X0RFQ1JFRihzd2FwcGVkKTsKLQkJaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKLQkJCVB5X0RFQ1JFRihyZXN1bHQpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9OworICAgICAgICBQeV9ERUNSRUYoc3dhcHBlZCk7CisgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfTsKIAotCXJldHVybiAoUHlPYmplY3QgKilyZXN1bHQ7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKXJlc3VsdDsKIH0KIAogLyoKQEAgLTIwNDAsMTAxICsyMDQwLDEwMSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIFNpbXBsZVR5cGVfZnJvbV9wYXJhbShQeU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKnZhbHVlKQogewotCVN0Z0RpY3RPYmplY3QgKmRpY3Q7Ci0JY2hhciAqZm10OwotCVB5Q0FyZ09iamVjdCAqcGFyZzsKLQlzdHJ1Y3QgZmllbGRkZXNjICpmZDsKLQlQeU9iamVjdCAqYXNfcGFyYW1ldGVyOworICAgIFN0Z0RpY3RPYmplY3QgKmRpY3Q7CisgICAgY2hhciAqZm10OworICAgIFB5Q0FyZ09iamVjdCAqcGFyZzsKKyAgICBzdHJ1Y3QgZmllbGRkZXNjICpmZDsKKyAgICBQeU9iamVjdCAqYXNfcGFyYW1ldGVyOwogCi0JLyogSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkgYW4gaW5zdGFuY2Ugb2YgdGhlIHJlcXVlc3RlZCB0eXBlLAotCSAgIHdlIGNhbiB1c2UgaXQgYXMgaXMgKi8KLQlpZiAoMSA9PSBQeU9iamVjdF9Jc0luc3RhbmNlKHZhbHVlLCB0eXBlKSkgewotCQlQeV9JTkNSRUYodmFsdWUpOwotCQlyZXR1cm4gdmFsdWU7Ci0JfQorICAgIC8qIElmIHRoZSB2YWx1ZSBpcyBhbHJlYWR5IGFuIGluc3RhbmNlIG9mIHRoZSByZXF1ZXN0ZWQgdHlwZSwKKyAgICAgICB3ZSBjYW4gdXNlIGl0IGFzIGlzICovCisgICAgaWYgKDEgPT0gUHlPYmplY3RfSXNJbnN0YW5jZSh2YWx1ZSwgdHlwZSkpIHsKKyAgICAgICAgUHlfSU5DUkVGKHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KIAotCWRpY3QgPSBQeVR5cGVfc3RnZGljdCh0eXBlKTsKLQlhc3NlcnQoZGljdCk7CisgICAgZGljdCA9IFB5VHlwZV9zdGdkaWN0KHR5cGUpOworICAgIGFzc2VydChkaWN0KTsKIAotCS8qIEkgdGhpbmsgd2UgY2FuIHJlbHkgb24gdGhpcyBiZWluZyBhIG9uZS1jaGFyYWN0ZXIgc3RyaW5nICovCi0JZm10ID0gUHlTdHJpbmdfQXNTdHJpbmcoZGljdC0+cHJvdG8pOwotCWFzc2VydChmbXQpOwotCQotCWZkID0gZ2V0ZW50cnkoZm10KTsKLQlhc3NlcnQoZmQpOwotCQotCXBhcmcgPSBuZXdfQ0FyZ09iamVjdCgpOwotCWlmIChwYXJnID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIC8qIEkgdGhpbmsgd2UgY2FuIHJlbHkgb24gdGhpcyBiZWluZyBhIG9uZS1jaGFyYWN0ZXIgc3RyaW5nICovCisgICAgZm10ID0gUHlTdHJpbmdfQXNTdHJpbmcoZGljdC0+cHJvdG8pOworICAgIGFzc2VydChmbXQpOwogCi0JcGFyZy0+dGFnID0gZm10WzBdOwotCXBhcmctPnBmZmlfdHlwZSA9IGZkLT5wZmZpX3R5cGU7Ci0JcGFyZy0+b2JqID0gZmQtPnNldGZ1bmMoJnBhcmctPnZhbHVlLCB2YWx1ZSwgMCk7Ci0JaWYgKHBhcmctPm9iaikKLQkJcmV0dXJuIChQeU9iamVjdCAqKXBhcmc7Ci0JUHlFcnJfQ2xlYXIoKTsKLQlQeV9ERUNSRUYocGFyZyk7CisgICAgZmQgPSBnZXRlbnRyeShmbXQpOworICAgIGFzc2VydChmZCk7CiAKLQlhc19wYXJhbWV0ZXIgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHZhbHVlLCAiX2FzX3BhcmFtZXRlcl8iKTsKLQlpZiAoYXNfcGFyYW1ldGVyKSB7Ci0JCXZhbHVlID0gU2ltcGxlVHlwZV9mcm9tX3BhcmFtKHR5cGUsIGFzX3BhcmFtZXRlcik7Ci0JCVB5X0RFQ1JFRihhc19wYXJhbWV0ZXIpOwotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkid3JvbmcgdHlwZSIpOwotCXJldHVybiBOVUxMOworICAgIHBhcmcgPSBuZXdfQ0FyZ09iamVjdCgpOworICAgIGlmIChwYXJnID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgcGFyZy0+dGFnID0gZm10WzBdOworICAgIHBhcmctPnBmZmlfdHlwZSA9IGZkLT5wZmZpX3R5cGU7CisgICAgcGFyZy0+b2JqID0gZmQtPnNldGZ1bmMoJnBhcmctPnZhbHVlLCB2YWx1ZSwgMCk7CisgICAgaWYgKHBhcmctPm9iaikKKyAgICAgICAgcmV0dXJuIChQeU9iamVjdCAqKXBhcmc7CisgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICBQeV9ERUNSRUYocGFyZyk7CisKKyAgICBhc19wYXJhbWV0ZXIgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHZhbHVlLCAiX2FzX3BhcmFtZXRlcl8iKTsKKyAgICBpZiAoYXNfcGFyYW1ldGVyKSB7CisgICAgICAgIHZhbHVlID0gU2ltcGxlVHlwZV9mcm9tX3BhcmFtKHR5cGUsIGFzX3BhcmFtZXRlcik7CisgICAgICAgIFB5X0RFQ1JFRihhc19wYXJhbWV0ZXIpOworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICJ3cm9uZyB0eXBlIik7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBTaW1wbGVUeXBlX21ldGhvZHNbXSA9IHsKLQl7ICJmcm9tX3BhcmFtIiwgU2ltcGxlVHlwZV9mcm9tX3BhcmFtLCBNRVRIX08sIGZyb21fcGFyYW1fZG9jIH0sCi0JeyAiZnJvbV9hZGRyZXNzIiwgQ0RhdGFUeXBlX2Zyb21fYWRkcmVzcywgTUVUSF9PLCBmcm9tX2FkZHJlc3NfZG9jIH0sCi0JeyAiZnJvbV9idWZmZXIiLCBDRGF0YVR5cGVfZnJvbV9idWZmZXIsIE1FVEhfVkFSQVJHUywgZnJvbV9idWZmZXJfZG9jLCB9LAotCXsgImZyb21fYnVmZmVyX2NvcHkiLCBDRGF0YVR5cGVfZnJvbV9idWZmZXJfY29weSwgTUVUSF9WQVJBUkdTLCBmcm9tX2J1ZmZlcl9jb3B5X2RvYywgfSwKLQl7ICJpbl9kbGwiLCBDRGF0YVR5cGVfaW5fZGxsLCBNRVRIX1ZBUkFSR1MsIGluX2RsbF9kb2N9LAotCXsgTlVMTCwgTlVMTCB9LAorICAgIHsgImZyb21fcGFyYW0iLCBTaW1wbGVUeXBlX2Zyb21fcGFyYW0sIE1FVEhfTywgZnJvbV9wYXJhbV9kb2MgfSwKKyAgICB7ICJmcm9tX2FkZHJlc3MiLCBDRGF0YVR5cGVfZnJvbV9hZGRyZXNzLCBNRVRIX08sIGZyb21fYWRkcmVzc19kb2MgfSwKKyAgICB7ICJmcm9tX2J1ZmZlciIsIENEYXRhVHlwZV9mcm9tX2J1ZmZlciwgTUVUSF9WQVJBUkdTLCBmcm9tX2J1ZmZlcl9kb2MsIH0sCisgICAgeyAiZnJvbV9idWZmZXJfY29weSIsIENEYXRhVHlwZV9mcm9tX2J1ZmZlcl9jb3B5LCBNRVRIX1ZBUkFSR1MsIGZyb21fYnVmZmVyX2NvcHlfZG9jLCB9LAorICAgIHsgImluX2RsbCIsIENEYXRhVHlwZV9pbl9kbGwsIE1FVEhfVkFSQVJHUywgaW5fZGxsX2RvY30sCisgICAgeyBOVUxMLCBOVUxMIH0sCiB9OwogCiBQeVR5cGVPYmplY3QgU2ltcGxlVHlwZV9UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotCSJfY3R5cGVzLlNpbXBsZVR5cGUiLAkJCQkvKiB0cF9uYW1lICovCi0JMCwJCQkJCS8qIHRwX2Jhc2ljc2l6ZSAqLwotCTAsCQkJCQkvKiB0cF9pdGVtc2l6ZSAqLwotCTAsCQkJCQkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9jb21wYXJlICovCi0JMCwJCQkgICAgICAgCQkvKiB0cF9yZXByICovCi0JMCwJCQkJCS8qIHRwX2FzX251bWJlciAqLwotCSZDRGF0YVR5cGVfYXNfc2VxdWVuY2UsCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJCQkJCS8qIHRwX2hhc2ggKi8KLQkwLAkJCQkJLyogdHBfY2FsbCAqLwotCTAsCQkJCQkvKiB0cF9zdHIgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQkibWV0YXR5cGUgZm9yIHRoZSBTaW1wbGVUeXBlIE9iamVjdHMiLAkvKiB0cF9kb2MgKi8KLQkwLAkJCQkJLyogdHBfdHJhdmVyc2UgKi8KLQkwLAkJCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaXRlciAqLwotCTAsCQkJCQkvKiB0cF9pdGVybmV4dCAqLwotCVNpbXBsZVR5cGVfbWV0aG9kcywJCQkvKiB0cF9tZXRob2RzICovCi0JMCwJCQkJCS8qIHRwX21lbWJlcnMgKi8KLQkwLAkJCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaW5pdCAqLwotCTAsCQkJCQkvKiB0cF9hbGxvYyAqLwotCVNpbXBsZVR5cGVfbmV3LAkJCQkvKiB0cF9uZXcgKi8KLQkwLAkJCQkJLyogdHBfZnJlZSAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQorICAgICJfY3R5cGVzLlNpbXBsZVR5cGUiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgJkNEYXRhVHlwZV9hc19zZXF1ZW5jZSwgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLworICAgICJtZXRhdHlwZSBmb3IgdGhlIFNpbXBsZVR5cGUgT2JqZWN0cyIsICAgICAgLyogdHBfZG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICBTaW1wbGVUeXBlX21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgU2ltcGxlVHlwZV9uZXcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KIH07CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0yMTQ1LDIyMSArMjE0NSwyMjEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBjb252ZXJ0ZXJzX2Zyb21fYXJndHlwZXMoUHlPYmplY3QgKm9iKQogewotCVB5T2JqZWN0ICpjb252ZXJ0ZXJzOwotCVB5X3NzaXplX3QgaTsKLQlQeV9zc2l6ZV90IG5BcmdzOworICAgIFB5T2JqZWN0ICpjb252ZXJ0ZXJzOworICAgIFB5X3NzaXplX3QgaTsKKyAgICBQeV9zc2l6ZV90IG5BcmdzOwogCi0Jb2IgPSBQeVNlcXVlbmNlX1R1cGxlKG9iKTsgLyogbmV3IHJlZmVyZW5jZSAqLwotCWlmICghb2IpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiX2FyZ3R5cGVzXyBtdXN0IGJlIGEgc2VxdWVuY2Ugb2YgdHlwZXMiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIG9iID0gUHlTZXF1ZW5jZV9UdXBsZShvYik7IC8qIG5ldyByZWZlcmVuY2UgKi8KKyAgICBpZiAoIW9iKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiX2FyZ3R5cGVzXyBtdXN0IGJlIGEgc2VxdWVuY2Ugb2YgdHlwZXMiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JbkFyZ3MgPSBQeVR1cGxlX0dFVF9TSVpFKG9iKTsKLQljb252ZXJ0ZXJzID0gUHlUdXBsZV9OZXcobkFyZ3MpOwotCWlmICghY29udmVydGVycykKLQkJcmV0dXJuIE5VTEw7Ci0JCQotCS8qIEkgaGF2ZSB0byBjaGVjayBpZiB0aGlzIGlzIGNvcnJlY3QuIFVzaW5nIGNfY2hhciwgd2hpY2ggaGFzIGEgc2l6ZQotCSAgIG9mIDEsIHdpbGwgYmUgYXNzdW1lZCB0byBiZSBwdXNoZWQgYXMgb25seSBvbmUgYnl0ZSEKLQkgICBBcmVuJ3QgdGhlc2UgcHJvbW90ZWQgdG8gaW50ZWdlcnMgYnkgdGhlIEMgY29tcGlsZXIgYW5kIHB1c2hlZCBhcyA0IGJ5dGVzPwotCSovCisgICAgbkFyZ3MgPSBQeVR1cGxlX0dFVF9TSVpFKG9iKTsKKyAgICBjb252ZXJ0ZXJzID0gUHlUdXBsZV9OZXcobkFyZ3MpOworICAgIGlmICghY29udmVydGVycykKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlmb3IgKGkgPSAwOyBpIDwgbkFyZ3M7ICsraSkgewotCQlQeU9iamVjdCAqdHAgPSBQeVR1cGxlX0dFVF9JVEVNKG9iLCBpKTsKLQkJUHlPYmplY3QgKmNudiA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcodHAsICJmcm9tX3BhcmFtIik7Ci0JCWlmICghY252KQotCQkJZ290byBhcmd0eXBlc19lcnJvcl8xOwotCQlQeVR1cGxlX1NFVF9JVEVNKGNvbnZlcnRlcnMsIGksIGNudik7Ci0JfQotCVB5X0RFQ1JFRihvYik7Ci0JcmV0dXJuIGNvbnZlcnRlcnM7CisgICAgLyogSSBoYXZlIHRvIGNoZWNrIGlmIHRoaXMgaXMgY29ycmVjdC4gVXNpbmcgY19jaGFyLCB3aGljaCBoYXMgYSBzaXplCisgICAgICAgb2YgMSwgd2lsbCBiZSBhc3N1bWVkIHRvIGJlIHB1c2hlZCBhcyBvbmx5IG9uZSBieXRlIQorICAgICAgIEFyZW4ndCB0aGVzZSBwcm9tb3RlZCB0byBpbnRlZ2VycyBieSB0aGUgQyBjb21waWxlciBhbmQgcHVzaGVkIGFzIDQgYnl0ZXM/CisgICAgKi8KKworICAgIGZvciAoaSA9IDA7IGkgPCBuQXJnczsgKytpKSB7CisgICAgICAgIFB5T2JqZWN0ICp0cCA9IFB5VHVwbGVfR0VUX0lURU0ob2IsIGkpOworICAgICAgICBQeU9iamVjdCAqY252ID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyh0cCwgImZyb21fcGFyYW0iKTsKKyAgICAgICAgaWYgKCFjbnYpCisgICAgICAgICAgICBnb3RvIGFyZ3R5cGVzX2Vycm9yXzE7CisgICAgICAgIFB5VHVwbGVfU0VUX0lURU0oY29udmVydGVycywgaSwgY252KTsKKyAgICB9CisgICAgUHlfREVDUkVGKG9iKTsKKyAgICByZXR1cm4gY29udmVydGVyczsKIAogICBhcmd0eXBlc19lcnJvcl8xOgotCVB5X1hERUNSRUYoY29udmVydGVycyk7Ci0JUHlfREVDUkVGKG9iKTsKLQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgIFB5X1hERUNSRUYoY29udmVydGVycyk7CisgICAgUHlfREVDUkVGKG9iKTsKKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAogI2lmIChQWV9WRVJTSU9OX0hFWCA8IDB4MDIwNTAwMDApCi0JCSAgICAgIml0ZW0gJWQgaW4gX2FyZ3R5cGVzXyBoYXMgbm8gZnJvbV9wYXJhbSBtZXRob2QiLAorICAgICAgICAgICAgICAgICAiaXRlbSAlZCBpbiBfYXJndHlwZXNfIGhhcyBubyBmcm9tX3BhcmFtIG1ldGhvZCIsCiAjZWxzZQotCQkgICAgICJpdGVtICV6ZCBpbiBfYXJndHlwZXNfIGhhcyBubyBmcm9tX3BhcmFtIG1ldGhvZCIsCisgICAgICAgICAgICAgICAgICJpdGVtICV6ZCBpbiBfYXJndHlwZXNfIGhhcyBubyBmcm9tX3BhcmFtIG1ldGhvZCIsCiAjZW5kaWYKLQkJICAgICBpKzEpOwotCXJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICBpKzEpOworICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgaW50CiBtYWtlX2Z1bmNwdHJ0eXBlX2RpY3QoU3RnRGljdE9iamVjdCAqc3RnZGljdCkKIHsKLQlQeU9iamVjdCAqb2I7Ci0JUHlPYmplY3QgKmNvbnZlcnRlcnMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpvYjsKKyAgICBQeU9iamVjdCAqY29udmVydGVycyA9IE5VTEw7CiAKLQlzdGdkaWN0LT5hbGlnbiA9IGdldGVudHJ5KCJQIiktPnBmZmlfdHlwZS0+YWxpZ25tZW50OwotCXN0Z2RpY3QtPmxlbmd0aCA9IDE7Ci0Jc3RnZGljdC0+c2l6ZSA9IHNpemVvZih2b2lkICopOwotCXN0Z2RpY3QtPnNldGZ1bmMgPSBOVUxMOwotCXN0Z2RpY3QtPmdldGZ1bmMgPSBOVUxMOwotCXN0Z2RpY3QtPmZmaV90eXBlX3BvaW50ZXIgPSBmZmlfdHlwZV9wb2ludGVyOworICAgIHN0Z2RpY3QtPmFsaWduID0gZ2V0ZW50cnkoIlAiKS0+cGZmaV90eXBlLT5hbGlnbm1lbnQ7CisgICAgc3RnZGljdC0+bGVuZ3RoID0gMTsKKyAgICBzdGdkaWN0LT5zaXplID0gc2l6ZW9mKHZvaWQgKik7CisgICAgc3RnZGljdC0+c2V0ZnVuYyA9IE5VTEw7CisgICAgc3RnZGljdC0+Z2V0ZnVuYyA9IE5VTEw7CisgICAgc3RnZGljdC0+ZmZpX3R5cGVfcG9pbnRlciA9IGZmaV90eXBlX3BvaW50ZXI7CiAKLQlvYiA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKChQeU9iamVjdCAqKXN0Z2RpY3QsICJfZmxhZ3NfIik7Ci0JaWYgKCFvYiB8fCAhUHlJbnRfQ2hlY2sob2IpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCSAgICAiY2xhc3MgbXVzdCBkZWZpbmUgX2ZsYWdzXyB3aGljaCBtdXN0IGJlIGFuIGludGVnZXIiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlzdGdkaWN0LT5mbGFncyA9IFB5SW50X0FTX0xPTkcob2IpIHwgVFlQRUZMQUdfSVNQT0lOVEVSOworICAgIG9iID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoKFB5T2JqZWN0ICopc3RnZGljdCwgIl9mbGFnc18iKTsKKyAgICBpZiAoIW9iIHx8ICFQeUludF9DaGVjayhvYikpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICJjbGFzcyBtdXN0IGRlZmluZSBfZmxhZ3NfIHdoaWNoIG11c3QgYmUgYW4gaW50ZWdlciIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHN0Z2RpY3QtPmZsYWdzID0gUHlJbnRfQVNfTE9ORyhvYikgfCBUWVBFRkxBR19JU1BPSU5URVI7CiAKLQkvKiBfYXJndHlwZXNfIGlzIG9wdGlvbmFsLi4uICovCi0Jb2IgPSBQeURpY3RfR2V0SXRlbVN0cmluZygoUHlPYmplY3QgKilzdGdkaWN0LCAiX2FyZ3R5cGVzXyIpOwotCWlmIChvYikgewotCQljb252ZXJ0ZXJzID0gY29udmVydGVyc19mcm9tX2FyZ3R5cGVzKG9iKTsKLQkJaWYgKCFjb252ZXJ0ZXJzKQotCQkJZ290byBlcnJvcjsKLQkJUHlfSU5DUkVGKG9iKTsKLQkJc3RnZGljdC0+YXJndHlwZXMgPSBvYjsKLQkJc3RnZGljdC0+Y29udmVydGVycyA9IGNvbnZlcnRlcnM7Ci0JfQorICAgIC8qIF9hcmd0eXBlc18gaXMgb3B0aW9uYWwuLi4gKi8KKyAgICBvYiA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKChQeU9iamVjdCAqKXN0Z2RpY3QsICJfYXJndHlwZXNfIik7CisgICAgaWYgKG9iKSB7CisgICAgICAgIGNvbnZlcnRlcnMgPSBjb252ZXJ0ZXJzX2Zyb21fYXJndHlwZXMob2IpOworICAgICAgICBpZiAoIWNvbnZlcnRlcnMpCisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICBQeV9JTkNSRUYob2IpOworICAgICAgICBzdGdkaWN0LT5hcmd0eXBlcyA9IG9iOworICAgICAgICBzdGdkaWN0LT5jb252ZXJ0ZXJzID0gY29udmVydGVyczsKKyAgICB9CiAKLQlvYiA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKChQeU9iamVjdCAqKXN0Z2RpY3QsICJfcmVzdHlwZV8iKTsKLQlpZiAob2IpIHsKLQkJaWYgKG9iICE9IFB5X05vbmUgJiYgIVB5VHlwZV9zdGdkaWN0KG9iKSAmJiAhUHlDYWxsYWJsZV9DaGVjayhvYikpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJIl9yZXN0eXBlXyBtdXN0IGJlIGEgdHlwZSwgYSBjYWxsYWJsZSwgb3IgTm9uZSIpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCVB5X0lOQ1JFRihvYik7Ci0JCXN0Z2RpY3QtPnJlc3R5cGUgPSBvYjsKLQkJc3RnZGljdC0+Y2hlY2tlciA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcob2IsICJfY2hlY2tfcmV0dmFsXyIpOwotCQlpZiAoc3RnZGljdC0+Y2hlY2tlciA9PSBOVUxMKQotCQkJUHlFcnJfQ2xlYXIoKTsKLQl9CisgICAgb2IgPSBQeURpY3RfR2V0SXRlbVN0cmluZygoUHlPYmplY3QgKilzdGdkaWN0LCAiX3Jlc3R5cGVfIik7CisgICAgaWYgKG9iKSB7CisgICAgICAgIGlmIChvYiAhPSBQeV9Ob25lICYmICFQeVR5cGVfc3RnZGljdChvYikgJiYgIVB5Q2FsbGFibGVfQ2hlY2sob2IpKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICJfcmVzdHlwZV8gbXVzdCBiZSBhIHR5cGUsIGEgY2FsbGFibGUsIG9yIE5vbmUiKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBQeV9JTkNSRUYob2IpOworICAgICAgICBzdGdkaWN0LT5yZXN0eXBlID0gb2I7CisgICAgICAgIHN0Z2RpY3QtPmNoZWNrZXIgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKG9iLCAiX2NoZWNrX3JldHZhbF8iKTsKKyAgICAgICAgaWYgKHN0Z2RpY3QtPmNoZWNrZXIgPT0gTlVMTCkKKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgfQogLyogWFhYIGxhdGVyLCBtYXliZS4KLQlvYiA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKChQeU9iamVjdCAqKXN0Z2RpY3QsICJfZXJyY2hlY2tfIik7Ci0JaWYgKG9iKSB7Ci0JCWlmICghUHlDYWxsYWJsZV9DaGVjayhvYikpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJIl9lcnJjaGVja18gbXVzdCBiZSBjYWxsYWJsZSIpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCVB5X0lOQ1JFRihvYik7Ci0JCXN0Z2RpY3QtPmVycmNoZWNrID0gb2I7Ci0JfQorICAgIG9iID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoKFB5T2JqZWN0ICopc3RnZGljdCwgIl9lcnJjaGVja18iKTsKKyAgICBpZiAob2IpIHsKKyAgICAgICAgaWYgKCFQeUNhbGxhYmxlX0NoZWNrKG9iKSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAiX2VycmNoZWNrXyBtdXN0IGJlIGNhbGxhYmxlIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgUHlfSU5DUkVGKG9iKTsKKyAgICAgICAgc3RnZGljdC0+ZXJyY2hlY2sgPSBvYjsKKyAgICB9CiAqLwotCXJldHVybiAwOworICAgIHJldHVybiAwOwogCiAgIGVycm9yOgotCVB5X1hERUNSRUYoY29udmVydGVycyk7Ci0JcmV0dXJuIC0xOworICAgIFB5X1hERUNSRUYoY29udmVydGVycyk7CisgICAgcmV0dXJuIC0xOwogCiB9CiAKIHN0YXRpYyBQeUNBcmdPYmplY3QgKgogQ0Z1bmNQdHJUeXBlX3BhcmFtZnVuYyhDRGF0YU9iamVjdCAqc2VsZikKIHsKLQlQeUNBcmdPYmplY3QgKnBhcmc7Ci0JCi0JcGFyZyA9IG5ld19DQXJnT2JqZWN0KCk7Ci0JaWYgKHBhcmcgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JCi0JcGFyZy0+dGFnID0gJ1AnOwotCXBhcmctPnBmZmlfdHlwZSA9ICZmZmlfdHlwZV9wb2ludGVyOwotCVB5X0lOQ1JFRihzZWxmKTsKLQlwYXJnLT5vYmogPSAoUHlPYmplY3QgKilzZWxmOwotCXBhcmctPnZhbHVlLnAgPSAqKHZvaWQgKiopc2VsZi0+Yl9wdHI7Ci0JcmV0dXJuIHBhcmc7CQorICAgIFB5Q0FyZ09iamVjdCAqcGFyZzsKKworICAgIHBhcmcgPSBuZXdfQ0FyZ09iamVjdCgpOworICAgIGlmIChwYXJnID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgcGFyZy0+dGFnID0gJ1AnOworICAgIHBhcmctPnBmZmlfdHlwZSA9ICZmZmlfdHlwZV9wb2ludGVyOworICAgIFB5X0lOQ1JFRihzZWxmKTsKKyAgICBwYXJnLT5vYmogPSAoUHlPYmplY3QgKilzZWxmOworICAgIHBhcmctPnZhbHVlLnAgPSAqKHZvaWQgKiopc2VsZi0+Yl9wdHI7CisgICAgcmV0dXJuIHBhcmc7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBDRnVuY1B0clR5cGVfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCVB5VHlwZU9iamVjdCAqcmVzdWx0OwotCVN0Z0RpY3RPYmplY3QgKnN0Z2RpY3Q7CisgICAgUHlUeXBlT2JqZWN0ICpyZXN1bHQ7CisgICAgU3RnRGljdE9iamVjdCAqc3RnZGljdDsKIAotCXN0Z2RpY3QgPSAoU3RnRGljdE9iamVjdCAqKVB5T2JqZWN0X0NhbGxPYmplY3QoCi0JCShQeU9iamVjdCAqKSZTdGdEaWN0X1R5cGUsIE5VTEwpOwotCWlmICghc3RnZGljdCkKLQkJcmV0dXJuIE5VTEw7CisgICAgc3RnZGljdCA9IChTdGdEaWN0T2JqZWN0ICopUHlPYmplY3RfQ2FsbE9iamVjdCgKKyAgICAgICAgKFB5T2JqZWN0ICopJlN0Z0RpY3RfVHlwZSwgTlVMTCk7CisgICAgaWYgKCFzdGdkaWN0KQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXN0Z2RpY3QtPnBhcmFtZnVuYyA9IENGdW5jUHRyVHlwZV9wYXJhbWZ1bmM7Ci0JLyogV2UgZG8gTk9UIGV4cG9zZSB0aGUgZnVuY3Rpb24gc2lnbmF0dXJlIGluIHRoZSBmb3JtYXQgc3RyaW5nLiAgSXQKLQkgICBpcyBpbXBvc3NpYmxlLCBnZW5lcmFsbHksIGJlY2F1c2UgdGhlIG9ubHkgcmVxdWlyZW1lbnQgZm9yIHRoZQotCSAgIGFyZ3R5cGVzIGl0ZW1zIGlzIHRoYXQgdGhleSBoYXZlIGEgLmZyb21fcGFyYW0gbWV0aG9kIC0gd2UgZG8gbm90Ci0JICAga25vdyB0aGUgdHlwZXMgb2YgdGhlIGFyZ3VtZW50cyAoYWx0aG91Z2gsIGluIHByYWN0aWNlLCBtb3N0Ci0JICAgYXJndHlwZXMgd291bGQgYmUgYSBjdHlwZXMgdHlwZSkuCi0JKi8KLQlzdGdkaWN0LT5mb3JtYXQgPSBhbGxvY19mb3JtYXRfc3RyaW5nKE5VTEwsICJYe30iKTsKLQlzdGdkaWN0LT5mbGFncyB8PSBUWVBFRkxBR19JU1BPSU5URVI7CisgICAgc3RnZGljdC0+cGFyYW1mdW5jID0gQ0Z1bmNQdHJUeXBlX3BhcmFtZnVuYzsKKyAgICAvKiBXZSBkbyBOT1QgZXhwb3NlIHRoZSBmdW5jdGlvbiBzaWduYXR1cmUgaW4gdGhlIGZvcm1hdCBzdHJpbmcuICBJdAorICAgICAgIGlzIGltcG9zc2libGUsIGdlbmVyYWxseSwgYmVjYXVzZSB0aGUgb25seSByZXF1aXJlbWVudCBmb3IgdGhlCisgICAgICAgYXJndHlwZXMgaXRlbXMgaXMgdGhhdCB0aGV5IGhhdmUgYSAuZnJvbV9wYXJhbSBtZXRob2QgLSB3ZSBkbyBub3QKKyAgICAgICBrbm93IHRoZSB0eXBlcyBvZiB0aGUgYXJndW1lbnRzIChhbHRob3VnaCwgaW4gcHJhY3RpY2UsIG1vc3QKKyAgICAgICBhcmd0eXBlcyB3b3VsZCBiZSBhIGN0eXBlcyB0eXBlKS4KKyAgICAqLworICAgIHN0Z2RpY3QtPmZvcm1hdCA9IGFsbG9jX2Zvcm1hdF9zdHJpbmcoTlVMTCwgIlh7fSIpOworICAgIHN0Z2RpY3QtPmZsYWdzIHw9IFRZUEVGTEFHX0lTUE9JTlRFUjsKIAotCS8qIGNyZWF0ZSB0aGUgbmV3IGluc3RhbmNlICh3aGljaCBpcyBhIGNsYXNzLAotCSAgIHNpbmNlIHdlIGFyZSBhIG1ldGF0eXBlISkgKi8KLQlyZXN1bHQgPSAoUHlUeXBlT2JqZWN0ICopUHlUeXBlX1R5cGUudHBfbmV3KHR5cGUsIGFyZ3MsIGt3ZHMpOwotCWlmIChyZXN1bHQgPT0gTlVMTCkgewotCQlQeV9ERUNSRUYoKFB5T2JqZWN0ICopc3RnZGljdCk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICAvKiBjcmVhdGUgdGhlIG5ldyBpbnN0YW5jZSAod2hpY2ggaXMgYSBjbGFzcywKKyAgICAgICBzaW5jZSB3ZSBhcmUgYSBtZXRhdHlwZSEpICovCisgICAgcmVzdWx0ID0gKFB5VHlwZU9iamVjdCAqKVB5VHlwZV9UeXBlLnRwX25ldyh0eXBlLCBhcmdzLCBrd2RzKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKChQeU9iamVjdCAqKXN0Z2RpY3QpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQkvKiByZXBsYWNlIHRoZSBjbGFzcyBkaWN0IGJ5IG91ciB1cGRhdGVkIHN0b3JhZ2UgZGljdCAqLwotCWlmICgtMSA9PSBQeURpY3RfVXBkYXRlKChQeU9iamVjdCAqKXN0Z2RpY3QsIHJlc3VsdC0+dHBfZGljdCkpIHsKLQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCVB5X0RFQ1JFRigoUHlPYmplY3QgKilzdGdkaWN0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5X0RFQ1JFRihyZXN1bHQtPnRwX2RpY3QpOwotCXJlc3VsdC0+dHBfZGljdCA9IChQeU9iamVjdCAqKXN0Z2RpY3Q7CisgICAgLyogcmVwbGFjZSB0aGUgY2xhc3MgZGljdCBieSBvdXIgdXBkYXRlZCBzdG9yYWdlIGRpY3QgKi8KKyAgICBpZiAoLTEgPT0gUHlEaWN0X1VwZGF0ZSgoUHlPYmplY3QgKilzdGdkaWN0LCByZXN1bHQtPnRwX2RpY3QpKSB7CisgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICBQeV9ERUNSRUYoKFB5T2JqZWN0ICopc3RnZGljdCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeV9ERUNSRUYocmVzdWx0LT50cF9kaWN0KTsKKyAgICByZXN1bHQtPnRwX2RpY3QgPSAoUHlPYmplY3QgKilzdGdkaWN0OwogCi0JaWYgKC0xID09IG1ha2VfZnVuY3B0cnR5cGVfZGljdChzdGdkaWN0KSkgewotCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICgtMSA9PSBtYWtlX2Z1bmNwdHJ0eXBlX2RpY3Qoc3RnZGljdCkpIHsKKyAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXJldHVybiAoUHlPYmplY3QgKilyZXN1bHQ7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKXJlc3VsdDsKIH0KIAogUHlUeXBlT2JqZWN0IENGdW5jUHRyVHlwZV9UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotCSJfY3R5cGVzLkNGdW5jUHRyVHlwZSIsCQkJLyogdHBfbmFtZSAqLwotCTAsCQkJCQkvKiB0cF9iYXNpY3NpemUgKi8KLQkwLAkJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkwLAkJCQkJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfY29tcGFyZSAqLwotCTAsCQkJICAgICAgIAkJLyogdHBfcmVwciAqLwotCTAsCQkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkmQ0RhdGFUeXBlX2FzX3NlcXVlbmNlLAkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJCS8qIHRwX3N0ciAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFIHwgUHlfVFBGTEFHU19IQVZFX0dDLCAvKiB0cF9mbGFncyAqLwotCSJtZXRhdHlwZSBmb3IgQyBmdW5jdGlvbiBwb2ludGVycyIsCS8qIHRwX2RvYyAqLwotCSh0cmF2ZXJzZXByb2MpQ0RhdGFUeXBlX3RyYXZlcnNlLAkvKiB0cF90cmF2ZXJzZSAqLwotCShpbnF1aXJ5KUNEYXRhVHlwZV9jbGVhciwJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkJLyogdHBfaXRlcm5leHQgKi8KLQlDRGF0YVR5cGVfbWV0aG9kcywJCQkvKiB0cF9tZXRob2RzICovCi0JMCwJCQkJCS8qIHRwX21lbWJlcnMgKi8KLQkwLAkJCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaW5pdCAqLwotCTAsCQkJCQkvKiB0cF9hbGxvYyAqLwotCUNGdW5jUHRyVHlwZV9uZXcsCQkJLyogdHBfbmV3ICovCi0JMCwJCQkJCS8qIHRwX2ZyZWUgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAiX2N0eXBlcy5DRnVuY1B0clR5cGUiLCAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAmQ0RhdGFUeXBlX2FzX3NlcXVlbmNlLCAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19CQVNFVFlQRSB8IFB5X1RQRkxBR1NfSEFWRV9HQywgLyogdHBfZmxhZ3MgKi8KKyAgICAibWV0YXR5cGUgZm9yIEMgZnVuY3Rpb24gcG9pbnRlcnMiLCAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2MpQ0RhdGFUeXBlX3RyYXZlcnNlLCAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAoaW5xdWlyeSlDRGF0YVR5cGVfY2xlYXIsICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgQ0RhdGFUeXBlX21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIENGdW5jUHRyVHlwZV9uZXcsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCiB9OwogCi0MCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogQ29kZSB0byBrZWVwIG5lZWRlZCBvYmplY3RzIGFsaXZlCiAgKi8KQEAgLTIzNjcsNTQgKzIzNjcsNTQgQEAKIHN0YXRpYyBDRGF0YU9iamVjdCAqCiBDRGF0YV9HZXRDb250YWluZXIoQ0RhdGFPYmplY3QgKnNlbGYpCiB7Ci0Jd2hpbGUgKHNlbGYtPmJfYmFzZSkKLQkJc2VsZiA9IHNlbGYtPmJfYmFzZTsKLQlpZiAoc2VsZi0+Yl9vYmplY3RzID09IE5VTEwpIHsKLQkJaWYgKHNlbGYtPmJfbGVuZ3RoKSB7Ci0JCQlzZWxmLT5iX29iamVjdHMgPSBQeURpY3RfTmV3KCk7Ci0JCX0gZWxzZSB7Ci0JCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCQlzZWxmLT5iX29iamVjdHMgPSBQeV9Ob25lOwotCQl9Ci0JfQotCXJldHVybiBzZWxmOworICAgIHdoaWxlIChzZWxmLT5iX2Jhc2UpCisgICAgICAgIHNlbGYgPSBzZWxmLT5iX2Jhc2U7CisgICAgaWYgKHNlbGYtPmJfb2JqZWN0cyA9PSBOVUxMKSB7CisgICAgICAgIGlmIChzZWxmLT5iX2xlbmd0aCkgeworICAgICAgICAgICAgc2VsZi0+Yl9vYmplY3RzID0gUHlEaWN0X05ldygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICAgICAgc2VsZi0+Yl9vYmplY3RzID0gUHlfTm9uZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2VsZjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIEdldEtlZXBlZE9iamVjdHMoQ0RhdGFPYmplY3QgKnRhcmdldCkKIHsKLQlyZXR1cm4gQ0RhdGFfR2V0Q29udGFpbmVyKHRhcmdldCktPmJfb2JqZWN0czsKKyAgICByZXR1cm4gQ0RhdGFfR2V0Q29udGFpbmVyKHRhcmdldCktPmJfb2JqZWN0czsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHVuaXF1ZV9rZXkoQ0RhdGFPYmplY3QgKnRhcmdldCwgUHlfc3NpemVfdCBpbmRleCkKIHsKLQljaGFyIHN0cmluZ1syNTZdOwotCWNoYXIgKmNwID0gc3RyaW5nOwotCXNpemVfdCBieXRlc19sZWZ0OworICAgIGNoYXIgc3RyaW5nWzI1Nl07CisgICAgY2hhciAqY3AgPSBzdHJpbmc7CisgICAgc2l6ZV90IGJ5dGVzX2xlZnQ7CiAKLQlhc3NlcnQoc2l6ZW9mKHN0cmluZykgLSAxID4gc2l6ZW9mKFB5X3NzaXplX3QpICogMik7CisgICAgYXNzZXJ0KHNpemVvZihzdHJpbmcpIC0gMSA+IHNpemVvZihQeV9zc2l6ZV90KSAqIDIpOwogI2lmIChQWV9WRVJTSU9OX0hFWCA8IDB4MDIwNTAwMDApCi0JY3AgKz0gc3ByaW50ZihjcCwgIiV4IiwgaW5kZXgpOworICAgIGNwICs9IHNwcmludGYoY3AsICIleCIsIGluZGV4KTsKICNlbHNlCi0JY3AgKz0gc3ByaW50ZihjcCwgIiV4IiwgUHlfU0FGRV9ET1dOQ0FTVChpbmRleCwgUHlfc3NpemVfdCwgaW50KSk7CisgICAgY3AgKz0gc3ByaW50ZihjcCwgIiV4IiwgUHlfU0FGRV9ET1dOQ0FTVChpbmRleCwgUHlfc3NpemVfdCwgaW50KSk7CiAjZW5kaWYKLQl3aGlsZSAodGFyZ2V0LT5iX2Jhc2UpIHsKLQkJYnl0ZXNfbGVmdCA9IHNpemVvZihzdHJpbmcpIC0gKGNwIC0gc3RyaW5nKSAtIDE7Ci0JCS8qIEhleCBmb3JtYXQgbmVlZHMgMiBjaGFyYWN0ZXJzIHBlciBieXRlICovCi0JCWlmIChieXRlc19sZWZ0IDwgc2l6ZW9mKFB5X3NzaXplX3QpICogMikgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJCSJjdHlwZXMgb2JqZWN0IHN0cnVjdHVyZSB0b28gZGVlcCIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KKyAgICB3aGlsZSAodGFyZ2V0LT5iX2Jhc2UpIHsKKyAgICAgICAgYnl0ZXNfbGVmdCA9IHNpemVvZihzdHJpbmcpIC0gKGNwIC0gc3RyaW5nKSAtIDE7CisgICAgICAgIC8qIEhleCBmb3JtYXQgbmVlZHMgMiBjaGFyYWN0ZXJzIHBlciBieXRlICovCisgICAgICAgIGlmIChieXRlc19sZWZ0IDwgc2l6ZW9mKFB5X3NzaXplX3QpICogMikgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImN0eXBlcyBvYmplY3Qgc3RydWN0dXJlIHRvbyBkZWVwIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQogI2lmIChQWV9WRVJTSU9OX0hFWCA8IDB4MDIwNTAwMDApCi0JCWNwICs9IHNwcmludGYoY3AsICI6JXgiLCAoaW50KXRhcmdldC0+Yl9pbmRleCk7CisgICAgICAgIGNwICs9IHNwcmludGYoY3AsICI6JXgiLCAoaW50KXRhcmdldC0+Yl9pbmRleCk7CiAjZWxzZQotCQljcCArPSBzcHJpbnRmKGNwLCAiOiV4IiwgUHlfU0FGRV9ET1dOQ0FTVCh0YXJnZXQtPmJfaW5kZXgsIFB5X3NzaXplX3QsIGludCkpOworICAgICAgICBjcCArPSBzcHJpbnRmKGNwLCAiOiV4IiwgUHlfU0FGRV9ET1dOQ0FTVCh0YXJnZXQtPmJfaW5kZXgsIFB5X3NzaXplX3QsIGludCkpOwogI2VuZGlmCi0JCXRhcmdldCA9IHRhcmdldC0+Yl9iYXNlOwotCX0KLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoc3RyaW5nLCBjcC1zdHJpbmcpOworICAgICAgICB0YXJnZXQgPSB0YXJnZXQtPmJfYmFzZTsKKyAgICB9CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHN0cmluZywgY3Atc3RyaW5nKTsKIH0KIAogLyoKQEAgLTI0MzgsMzAgKzI0MzgsMzAgQEAKIHN0YXRpYyBpbnQKIEtlZXBSZWYoQ0RhdGFPYmplY3QgKnRhcmdldCwgUHlfc3NpemVfdCBpbmRleCwgUHlPYmplY3QgKmtlZXApCiB7Ci0JaW50IHJlc3VsdDsKLQlDRGF0YU9iamVjdCAqb2I7Ci0JUHlPYmplY3QgKmtleTsKKyAgICBpbnQgcmVzdWx0OworICAgIENEYXRhT2JqZWN0ICpvYjsKKyAgICBQeU9iamVjdCAqa2V5OwogCiAvKiBPcHRpbWl6YXRpb246IG5vIG5lZWQgdG8gc3RvcmUgTm9uZSAqLwotCWlmIChrZWVwID09IFB5X05vbmUpIHsKLQkJUHlfREVDUkVGKFB5X05vbmUpOwotCQlyZXR1cm4gMDsKLQl9Ci0Jb2IgPSBDRGF0YV9HZXRDb250YWluZXIodGFyZ2V0KTsKLQlpZiAob2ItPmJfb2JqZWN0cyA9PSBOVUxMIHx8ICFQeURpY3RfQ2hlY2tFeGFjdChvYi0+Yl9vYmplY3RzKSkgewotCQlQeV9YREVDUkVGKG9iLT5iX29iamVjdHMpOwotCQlvYi0+Yl9vYmplY3RzID0ga2VlcDsgLyogcmVmY291bnQgY29uc3VtZWQgKi8KLQkJcmV0dXJuIDA7Ci0JfQotCWtleSA9IHVuaXF1ZV9rZXkodGFyZ2V0LCBpbmRleCk7Ci0JaWYgKGtleSA9PSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRihrZWVwKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlyZXN1bHQgPSBQeURpY3RfU2V0SXRlbShvYi0+Yl9vYmplY3RzLCBrZXksIGtlZXApOwotCVB5X0RFQ1JFRihrZXkpOwotCVB5X0RFQ1JFRihrZWVwKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIGlmIChrZWVwID09IFB5X05vbmUpIHsKKyAgICAgICAgUHlfREVDUkVGKFB5X05vbmUpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgb2IgPSBDRGF0YV9HZXRDb250YWluZXIodGFyZ2V0KTsKKyAgICBpZiAob2ItPmJfb2JqZWN0cyA9PSBOVUxMIHx8ICFQeURpY3RfQ2hlY2tFeGFjdChvYi0+Yl9vYmplY3RzKSkgeworICAgICAgICBQeV9YREVDUkVGKG9iLT5iX29iamVjdHMpOworICAgICAgICBvYi0+Yl9vYmplY3RzID0ga2VlcDsgLyogcmVmY291bnQgY29uc3VtZWQgKi8KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGtleSA9IHVuaXF1ZV9rZXkodGFyZ2V0LCBpbmRleCk7CisgICAgaWYgKGtleSA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihrZWVwKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXN1bHQgPSBQeURpY3RfU2V0SXRlbShvYi0+Yl9vYmplY3RzLCBrZXksIGtlZXApOworICAgIFB5X0RFQ1JFRihrZXkpOworICAgIFB5X0RFQ1JFRihrZWVwKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMjQ3MSwxMDAgKzI0NzEsMTAwIEBACiBzdGF0aWMgaW50CiBDRGF0YV90cmF2ZXJzZShDRGF0YU9iamVjdCAqc2VsZiwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JUHlfVklTSVQoc2VsZi0+Yl9vYmplY3RzKTsKLQlQeV9WSVNJVCgoUHlPYmplY3QgKilzZWxmLT5iX2Jhc2UpOwotCXJldHVybiAwOworICAgIFB5X1ZJU0lUKHNlbGYtPmJfb2JqZWN0cyk7CisgICAgUHlfVklTSVQoKFB5T2JqZWN0ICopc2VsZi0+Yl9iYXNlKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogQ0RhdGFfY2xlYXIoQ0RhdGFPYmplY3QgKnNlbGYpCiB7Ci0JU3RnRGljdE9iamVjdCAqZGljdCA9IFB5T2JqZWN0X3N0Z2RpY3QoKFB5T2JqZWN0ICopc2VsZik7Ci0JYXNzZXJ0KGRpY3QpOyAvKiBDYW5ub3QgYmUgTlVMTCBmb3IgQ0RhdGFPYmplY3QgaW5zdGFuY2VzICovCi0JUHlfQ0xFQVIoc2VsZi0+Yl9vYmplY3RzKTsKLQlpZiAoKHNlbGYtPmJfbmVlZHNmcmVlKQotCSAgICAmJiAoKHNpemVfdClkaWN0LT5zaXplID4gc2l6ZW9mKHNlbGYtPmJfdmFsdWUpKSkKLQkJUHlNZW1fRnJlZShzZWxmLT5iX3B0cik7Ci0Jc2VsZi0+Yl9wdHIgPSBOVUxMOwotCVB5X0NMRUFSKHNlbGYtPmJfYmFzZSk7Ci0JcmV0dXJuIDA7CisgICAgU3RnRGljdE9iamVjdCAqZGljdCA9IFB5T2JqZWN0X3N0Z2RpY3QoKFB5T2JqZWN0ICopc2VsZik7CisgICAgYXNzZXJ0KGRpY3QpOyAvKiBDYW5ub3QgYmUgTlVMTCBmb3IgQ0RhdGFPYmplY3QgaW5zdGFuY2VzICovCisgICAgUHlfQ0xFQVIoc2VsZi0+Yl9vYmplY3RzKTsKKyAgICBpZiAoKHNlbGYtPmJfbmVlZHNmcmVlKQorICAgICAgICAmJiAoKHNpemVfdClkaWN0LT5zaXplID4gc2l6ZW9mKHNlbGYtPmJfdmFsdWUpKSkKKyAgICAgICAgUHlNZW1fRnJlZShzZWxmLT5iX3B0cik7CisgICAgc2VsZi0+Yl9wdHIgPSBOVUxMOworICAgIFB5X0NMRUFSKHNlbGYtPmJfYmFzZSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkCiBDRGF0YV9kZWFsbG9jKFB5T2JqZWN0ICpzZWxmKQogewotCUNEYXRhX2NsZWFyKChDRGF0YU9iamVjdCAqKXNlbGYpOwotCVB5X1RZUEUoc2VsZiktPnRwX2ZyZWUoc2VsZik7CisgICAgQ0RhdGFfY2xlYXIoKENEYXRhT2JqZWN0ICopc2VsZik7CisgICAgUHlfVFlQRShzZWxmKS0+dHBfZnJlZShzZWxmKTsKIH0KIAogc3RhdGljIFB5TWVtYmVyRGVmIENEYXRhX21lbWJlcnNbXSA9IHsKLQl7ICJfYl9iYXNlXyIsIFRfT0JKRUNULAotCSAgb2Zmc2V0b2YoQ0RhdGFPYmplY3QsIGJfYmFzZSksIFJFQURPTkxZLAotCSAgInRoZSBiYXNlIG9iamVjdCIgfSwKLQl7ICJfYl9uZWVkc2ZyZWVfIiwgVF9JTlQsCi0JICBvZmZzZXRvZihDRGF0YU9iamVjdCwgYl9uZWVkc2ZyZWUpLCBSRUFET05MWSwKLQkgICJ3aGV0aGVyIHRoZSBvYmplY3Qgb3ducyB0aGUgbWVtb3J5IG9yIG5vdCIgfSwKLQl7ICJfb2JqZWN0cyIsIFRfT0JKRUNULAotCSAgb2Zmc2V0b2YoQ0RhdGFPYmplY3QsIGJfb2JqZWN0cyksIFJFQURPTkxZLAotCSAgImludGVybmFsIG9iamVjdHMgdHJlZSAoTkVWRVIgQ0hBTkdFIFRISVMgT0JKRUNUISkifSwKLQl7IE5VTEwgfSwKKyAgICB7ICJfYl9iYXNlXyIsIFRfT0JKRUNULAorICAgICAgb2Zmc2V0b2YoQ0RhdGFPYmplY3QsIGJfYmFzZSksIFJFQURPTkxZLAorICAgICAgInRoZSBiYXNlIG9iamVjdCIgfSwKKyAgICB7ICJfYl9uZWVkc2ZyZWVfIiwgVF9JTlQsCisgICAgICBvZmZzZXRvZihDRGF0YU9iamVjdCwgYl9uZWVkc2ZyZWUpLCBSRUFET05MWSwKKyAgICAgICJ3aGV0aGVyIHRoZSBvYmplY3Qgb3ducyB0aGUgbWVtb3J5IG9yIG5vdCIgfSwKKyAgICB7ICJfb2JqZWN0cyIsIFRfT0JKRUNULAorICAgICAgb2Zmc2V0b2YoQ0RhdGFPYmplY3QsIGJfb2JqZWN0cyksIFJFQURPTkxZLAorICAgICAgImludGVybmFsIG9iamVjdHMgdHJlZSAoTkVWRVIgQ0hBTkdFIFRISVMgT0JKRUNUISkifSwKKyAgICB7IE5VTEwgfSwKIH07CiAKICNpZiAoUFlfVkVSU0lPTl9IRVggPj0gMHgwMjA2MDAwMCkKIHN0YXRpYyBpbnQgQ0RhdGFfTmV3R2V0QnVmZmVyKFB5T2JqZWN0ICpfc2VsZiwgUHlfYnVmZmVyICp2aWV3LCBpbnQgZmxhZ3MpCiB7Ci0JQ0RhdGFPYmplY3QgKnNlbGYgPSAoQ0RhdGFPYmplY3QgKilfc2VsZjsKLQlTdGdEaWN0T2JqZWN0ICpkaWN0ID0gUHlPYmplY3Rfc3RnZGljdChfc2VsZik7Ci0JUHlfc3NpemVfdCBpOworICAgIENEYXRhT2JqZWN0ICpzZWxmID0gKENEYXRhT2JqZWN0ICopX3NlbGY7CisgICAgU3RnRGljdE9iamVjdCAqZGljdCA9IFB5T2JqZWN0X3N0Z2RpY3QoX3NlbGYpOworICAgIFB5X3NzaXplX3QgaTsKIAotCWlmICh2aWV3ID09IE5VTEwpIHJldHVybiAwOworICAgIGlmICh2aWV3ID09IE5VTEwpIHJldHVybiAwOwogCi0Jdmlldy0+YnVmID0gc2VsZi0+Yl9wdHI7Ci0Jdmlldy0+b2JqID0gX3NlbGY7Ci0JUHlfSU5DUkVGKF9zZWxmKTsKLQl2aWV3LT5sZW4gPSBzZWxmLT5iX3NpemU7Ci0Jdmlldy0+cmVhZG9ubHkgPSAwOwotCS8qIHVzZSBkZWZhdWx0IGZvcm1hdCBjaGFyYWN0ZXIgaWYgbm90IHNldCAqLwotCXZpZXctPmZvcm1hdCA9IGRpY3QtPmZvcm1hdCA/IGRpY3QtPmZvcm1hdCA6ICJCIjsKLQl2aWV3LT5uZGltID0gZGljdC0+bmRpbTsKLQl2aWV3LT5zaGFwZSA9IGRpY3QtPnNoYXBlOwotCXZpZXctPml0ZW1zaXplID0gc2VsZi0+Yl9zaXplOwotCWZvciAoaSA9IDA7IGkgPCB2aWV3LT5uZGltOyArK2kpIHsKLQkJdmlldy0+aXRlbXNpemUgLz0gZGljdC0+c2hhcGVbaV07Ci0JfQotCXZpZXctPnN0cmlkZXMgPSBOVUxMOwotCXZpZXctPnN1Ym9mZnNldHMgPSBOVUxMOwotCXZpZXctPmludGVybmFsID0gTlVMTDsKLQlyZXR1cm4gMDsKKyAgICB2aWV3LT5idWYgPSBzZWxmLT5iX3B0cjsKKyAgICB2aWV3LT5vYmogPSBfc2VsZjsKKyAgICBQeV9JTkNSRUYoX3NlbGYpOworICAgIHZpZXctPmxlbiA9IHNlbGYtPmJfc2l6ZTsKKyAgICB2aWV3LT5yZWFkb25seSA9IDA7CisgICAgLyogdXNlIGRlZmF1bHQgZm9ybWF0IGNoYXJhY3RlciBpZiBub3Qgc2V0ICovCisgICAgdmlldy0+Zm9ybWF0ID0gZGljdC0+Zm9ybWF0ID8gZGljdC0+Zm9ybWF0IDogIkIiOworICAgIHZpZXctPm5kaW0gPSBkaWN0LT5uZGltOworICAgIHZpZXctPnNoYXBlID0gZGljdC0+c2hhcGU7CisgICAgdmlldy0+aXRlbXNpemUgPSBzZWxmLT5iX3NpemU7CisgICAgZm9yIChpID0gMDsgaSA8IHZpZXctPm5kaW07ICsraSkgeworICAgICAgICB2aWV3LT5pdGVtc2l6ZSAvPSBkaWN0LT5zaGFwZVtpXTsKKyAgICB9CisgICAgdmlldy0+c3RyaWRlcyA9IE5VTEw7CisgICAgdmlldy0+c3Vib2Zmc2V0cyA9IE5VTEw7CisgICAgdmlldy0+aW50ZXJuYWwgPSBOVUxMOworICAgIHJldHVybiAwOwogfQogI2VuZGlmCiAKIHN0YXRpYyBQeV9zc2l6ZV90IENEYXRhX0dldFNlZ2NvdW50KFB5T2JqZWN0ICpfc2VsZiwgUHlfc3NpemVfdCAqbGVucCkKIHsKLQlpZiAobGVucCkKLQkJKmxlbnAgPSAxOwotCXJldHVybiAxOworICAgIGlmIChsZW5wKQorICAgICAgICAqbGVucCA9IDE7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyBQeV9zc2l6ZV90IENEYXRhX0dldEJ1ZmZlcihQeU9iamVjdCAqX3NlbGYsIFB5X3NzaXplX3Qgc2VnLCB2b2lkICoqcHB0cikKIHsKLQlDRGF0YU9iamVjdCAqc2VsZiA9IChDRGF0YU9iamVjdCAqKV9zZWxmOwotCWlmIChzZWcgIT0gMCkgewotCQkvKiBIbS4gTXVzdCB0aGlzIHNldCBhbiBleGNlcHRpb24/ICovCi0JCXJldHVybiAtMTsKLQl9Ci0JKnBwdHIgPSBzZWxmLT5iX3B0cjsKLQlyZXR1cm4gc2VsZi0+Yl9zaXplOworICAgIENEYXRhT2JqZWN0ICpzZWxmID0gKENEYXRhT2JqZWN0ICopX3NlbGY7CisgICAgaWYgKHNlZyAhPSAwKSB7CisgICAgICAgIC8qIEhtLiBNdXN0IHRoaXMgc2V0IGFuIGV4Y2VwdGlvbj8gKi8KKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICAqcHB0ciA9IHNlbGYtPmJfcHRyOworICAgIHJldHVybiBzZWxmLT5iX3NpemU7CiB9CiAKIHN0YXRpYyBQeUJ1ZmZlclByb2NzIENEYXRhX2FzX2J1ZmZlciA9IHsKLQkocmVhZGJ1ZmZlcnByb2MpQ0RhdGFfR2V0QnVmZmVyLAotCSh3cml0ZWJ1ZmZlcnByb2MpQ0RhdGFfR2V0QnVmZmVyLAotCShzZWdjb3VudHByb2MpQ0RhdGFfR2V0U2VnY291bnQsCi0JKGNoYXJidWZmZXJwcm9jKU5VTEwsCisgICAgKHJlYWRidWZmZXJwcm9jKUNEYXRhX0dldEJ1ZmZlciwKKyAgICAod3JpdGVidWZmZXJwcm9jKUNEYXRhX0dldEJ1ZmZlciwKKyAgICAoc2VnY291bnRwcm9jKUNEYXRhX0dldFNlZ2NvdW50LAorICAgIChjaGFyYnVmZmVycHJvYylOVUxMLAogI2lmIChQWV9WRVJTSU9OX0hFWCA+PSAweDAyMDYwMDAwKQotCShnZXRidWZmZXJwcm9jKUNEYXRhX05ld0dldEJ1ZmZlciwKLQkocmVsZWFzZWJ1ZmZlcnByb2MpTlVMTCwKKyAgICAoZ2V0YnVmZmVycHJvYylDRGF0YV9OZXdHZXRCdWZmZXIsCisgICAgKHJlbGVhc2VidWZmZXJwcm9jKU5VTEwsCiAjZW5kaWYKIH07CiAKQEAgLTI1NzQsNDcgKzI1NzQsNDcgQEAKIHN0YXRpYyBsb25nCiBDRGF0YV9ub2hhc2goUHlPYmplY3QgKnNlbGYpCiB7Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgInVuaGFzaGFibGUgdHlwZSIpOwotCXJldHVybiAtMTsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAidW5oYXNoYWJsZSB0eXBlIik7CisgICAgcmV0dXJuIC0xOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogQ0RhdGFfcmVkdWNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JQ0RhdGFPYmplY3QgKnNlbGYgPSAoQ0RhdGFPYmplY3QgKilfc2VsZjsKKyAgICBDRGF0YU9iamVjdCAqc2VsZiA9IChDRGF0YU9iamVjdCAqKV9zZWxmOwogCi0JaWYgKFB5T2JqZWN0X3N0Z2RpY3QoX3NlbGYpLT5mbGFncyAmIChUWVBFRkxBR19JU1BPSU5URVJ8VFlQRUZMQUdfSEFTUE9JTlRFUikpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJImN0eXBlcyBvYmplY3RzIGNvbnRhaW5pbmcgcG9pbnRlcnMgY2Fubm90IGJlIHBpY2tsZWQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJPKE8oTk4pKSIsCi0JCQkgICAgIF91bnBpY2tsZSwKLQkJCSAgICAgUHlfVFlQRShfc2VsZiksCi0JCQkgICAgIFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoX3NlbGYsICJfX2RpY3RfXyIpLAotCQkJICAgICBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzZWxmLT5iX3B0ciwgc2VsZi0+Yl9zaXplKSk7CisgICAgaWYgKFB5T2JqZWN0X3N0Z2RpY3QoX3NlbGYpLT5mbGFncyAmIChUWVBFRkxBR19JU1BPSU5URVJ8VFlQRUZMQUdfSEFTUE9JTlRFUikpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiY3R5cGVzIG9iamVjdHMgY29udGFpbmluZyBwb2ludGVycyBjYW5ub3QgYmUgcGlja2xlZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8oTyhOTikpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfdW5waWNrbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRShfc2VsZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3RfR2V0QXR0clN0cmluZyhfc2VsZiwgIl9fZGljdF9fIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoc2VsZi0+Yl9wdHIsIHNlbGYtPmJfc2l6ZSkpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogQ0RhdGFfc2V0c3RhdGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQl2b2lkICpkYXRhOwotCVB5X3NzaXplX3QgbGVuOwotCWludCByZXM7Ci0JUHlPYmplY3QgKmRpY3QsICpteWRpY3Q7Ci0JQ0RhdGFPYmplY3QgKnNlbGYgPSAoQ0RhdGFPYmplY3QgKilfc2VsZjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9zIyIsICZkaWN0LCAmZGF0YSwgJmxlbikpCi0JCXJldHVybiBOVUxMOwotCWlmIChsZW4gPiBzZWxmLT5iX3NpemUpCi0JCWxlbiA9IHNlbGYtPmJfc2l6ZTsKLQltZW1tb3ZlKHNlbGYtPmJfcHRyLCBkYXRhLCBsZW4pOwotCW15ZGljdCA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoX3NlbGYsICJfX2RpY3RfXyIpOwotCXJlcyA9IFB5RGljdF9VcGRhdGUobXlkaWN0LCBkaWN0KTsKLQlQeV9ERUNSRUYobXlkaWN0KTsKLQlpZiAocmVzID09IC0xKQotCQlyZXR1cm4gTlVMTDsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgdm9pZCAqZGF0YTsKKyAgICBQeV9zc2l6ZV90IGxlbjsKKyAgICBpbnQgcmVzOworICAgIFB5T2JqZWN0ICpkaWN0LCAqbXlkaWN0OworICAgIENEYXRhT2JqZWN0ICpzZWxmID0gKENEYXRhT2JqZWN0ICopX3NlbGY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPcyMiLCAmZGljdCwgJmRhdGEsICZsZW4pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAobGVuID4gc2VsZi0+Yl9zaXplKQorICAgICAgICBsZW4gPSBzZWxmLT5iX3NpemU7CisgICAgbWVtbW92ZShzZWxmLT5iX3B0ciwgZGF0YSwgbGVuKTsKKyAgICBteWRpY3QgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKF9zZWxmLCAiX19kaWN0X18iKTsKKyAgICByZXMgPSBQeURpY3RfVXBkYXRlKG15ZGljdCwgZGljdCk7CisgICAgUHlfREVDUkVGKG15ZGljdCk7CisgICAgaWYgKHJlcyA9PSAtMSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKgpAQCAtMjYyMywxMjQgKzI2MjMsMTI0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogQ0RhdGFfZnJvbV9vdXRwYXJhbShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlfSU5DUkVGKHNlbGYpOwotCXJldHVybiBzZWxmOworICAgIFB5X0lOQ1JFRihzZWxmKTsKKyAgICByZXR1cm4gc2VsZjsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIENEYXRhX21ldGhvZHNbXSA9IHsKLQl7ICJfX2N0eXBlc19mcm9tX291dHBhcmFtX18iLCBDRGF0YV9mcm9tX291dHBhcmFtLCBNRVRIX05PQVJHUywgfSwKLQl7ICJfX3JlZHVjZV9fIiwgQ0RhdGFfcmVkdWNlLCBNRVRIX05PQVJHUywgfSwKLQl7ICJfX3NldHN0YXRlX18iLCBDRGF0YV9zZXRzdGF0ZSwgTUVUSF9WQVJBUkdTLCB9LAotCXsgTlVMTCwgTlVMTCB9LAorICAgIHsgIl9fY3R5cGVzX2Zyb21fb3V0cGFyYW1fXyIsIENEYXRhX2Zyb21fb3V0cGFyYW0sIE1FVEhfTk9BUkdTLCB9LAorICAgIHsgIl9fcmVkdWNlX18iLCBDRGF0YV9yZWR1Y2UsIE1FVEhfTk9BUkdTLCB9LAorICAgIHsgIl9fc2V0c3RhdGVfXyIsIENEYXRhX3NldHN0YXRlLCBNRVRIX1ZBUkFSR1MsIH0sCisgICAgeyBOVUxMLCBOVUxMIH0sCiB9OwogCiBQeVR5cGVPYmplY3QgQ0RhdGFfVHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKLQkiX2N0eXBlcy5fQ0RhdGEiLAotCXNpemVvZihDRGF0YU9iamVjdCksCQkJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJCS8qIHRwX2l0ZW1zaXplICovCi0JQ0RhdGFfZGVhbGxvYywJCQkJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfY29tcGFyZSAqLwotCTAsCQkJCQkvKiB0cF9yZXByICovCi0JMCwJCQkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JQ0RhdGFfbm9oYXNoLAkJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkJLyogdHBfc3RyICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHJvICovCi0JJkNEYXRhX2FzX2J1ZmZlciwJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfTkVXQlVGRkVSIHwgUHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQkiWFhYIHRvIGJlIHByb3ZpZGVkIiwJCQkvKiB0cF9kb2MgKi8KLQkodHJhdmVyc2Vwcm9jKUNEYXRhX3RyYXZlcnNlLAkJLyogdHBfdHJhdmVyc2UgKi8KLQkoaW5xdWlyeSlDRGF0YV9jbGVhciwJCQkvKiB0cF9jbGVhciAqLwotCTAsCQkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCTAsCQkJCQkvKiB0cF9pdGVyICovCi0JMCwJCQkJCS8qIHRwX2l0ZXJuZXh0ICovCi0JQ0RhdGFfbWV0aG9kcywJCQkJLyogdHBfbWV0aG9kcyAqLwotCUNEYXRhX21lbWJlcnMsCQkJCS8qIHRwX21lbWJlcnMgKi8KLQkwLAkJCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaW5pdCAqLwotCTAsCQkJCQkvKiB0cF9hbGxvYyAqLwotCTAsCQkJCQkvKiB0cF9uZXcgKi8KLQkwLAkJCQkJLyogdHBfZnJlZSAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQorICAgICJfY3R5cGVzLl9DRGF0YSIsCisgICAgc2l6ZW9mKENEYXRhT2JqZWN0KSwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgQ0RhdGFfZGVhbGxvYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIENEYXRhX25vaGFzaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAmQ0RhdGFfYXNfYnVmZmVyLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9ORVdCVUZGRVIgfCBQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLworICAgICJYWFggdG8gYmUgcHJvdmlkZWQiLCAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgKHRyYXZlcnNlcHJvYylDRGF0YV90cmF2ZXJzZSwgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIChpbnF1aXJ5KUNEYXRhX2NsZWFyLCAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICBDRGF0YV9tZXRob2RzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICBDRGF0YV9tZW1iZXJzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KIH07CiAKIHN0YXRpYyBpbnQgQ0RhdGFfTWFsbG9jQnVmZmVyKENEYXRhT2JqZWN0ICpvYmosIFN0Z0RpY3RPYmplY3QgKmRpY3QpCiB7Ci0JaWYgKChzaXplX3QpZGljdC0+c2l6ZSA8PSBzaXplb2Yob2JqLT5iX3ZhbHVlKSkgewotCQkvKiBObyBuZWVkIHRvIGNhbGwgbWFsbG9jLCBjYW4gdXNlIHRoZSBkZWZhdWx0IGJ1ZmZlciAqLwotCQlvYmotPmJfcHRyID0gKGNoYXIgKikmb2JqLT5iX3ZhbHVlOwotCQkvKiBUaGUgYl9uZWVkc2ZyZWUgZmxhZyBkb2VzIG5vdCBtZWFuIHRoYXQgd2UgYWN0dWFsbHkgZGlkCi0JCSAgIGNhbGwgUHlNZW1fTWFsbG9jIHRvIGFsbG9jYXRlIHRoZSBtZW1vcnkgYmxvY2s7IGluc3RlYWQgaXQKLQkJICAgbWVhbnMgd2UgYXJlIHRoZSAqb3duZXIqIG9mIHRoZSBtZW1vcnkgYW5kIGFyZSByZXNwb25zaWJsZQotCQkgICBmb3IgZnJlZWluZyByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBtZW1vcnkuICBUaGlzIGlzCi0JCSAgIGFsc28gdGhlIHJlYXNvbiB0aGF0IGJfbmVlZHNmcmVlIGlzIGV4cG9zZWQgdG8gUHl0aG9uLgotCQkgKi8KLQkJb2JqLT5iX25lZWRzZnJlZSA9IDE7Ci0JfSBlbHNlIHsKLQkJLyogSW4gcHl0aG9uIDIuNCwgYW5kIGN0eXBlcyAwLjkuNiwgdGhlIG1hbGxvYyBjYWxsIHRvb2sgYWJvdXQKLQkJICAgMzMlIG9mIHRoZSBjcmVhdGlvbiB0aW1lIGZvciBjX2ludCgpLgotCQkqLwotCQlvYmotPmJfcHRyID0gKGNoYXIgKilQeU1lbV9NYWxsb2MoZGljdC0+c2l6ZSk7Ci0JCWlmIChvYmotPmJfcHRyID09IE5VTEwpIHsKLQkJCVB5RXJyX05vTWVtb3J5KCk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJb2JqLT5iX25lZWRzZnJlZSA9IDE7Ci0JCW1lbXNldChvYmotPmJfcHRyLCAwLCBkaWN0LT5zaXplKTsKLQl9Ci0Jb2JqLT5iX3NpemUgPSBkaWN0LT5zaXplOwotCXJldHVybiAwOworICAgIGlmICgoc2l6ZV90KWRpY3QtPnNpemUgPD0gc2l6ZW9mKG9iai0+Yl92YWx1ZSkpIHsKKyAgICAgICAgLyogTm8gbmVlZCB0byBjYWxsIG1hbGxvYywgY2FuIHVzZSB0aGUgZGVmYXVsdCBidWZmZXIgKi8KKyAgICAgICAgb2JqLT5iX3B0ciA9IChjaGFyICopJm9iai0+Yl92YWx1ZTsKKyAgICAgICAgLyogVGhlIGJfbmVlZHNmcmVlIGZsYWcgZG9lcyBub3QgbWVhbiB0aGF0IHdlIGFjdHVhbGx5IGRpZAorICAgICAgICAgICBjYWxsIFB5TWVtX01hbGxvYyB0byBhbGxvY2F0ZSB0aGUgbWVtb3J5IGJsb2NrOyBpbnN0ZWFkIGl0CisgICAgICAgICAgIG1lYW5zIHdlIGFyZSB0aGUgKm93bmVyKiBvZiB0aGUgbWVtb3J5IGFuZCBhcmUgcmVzcG9uc2libGUKKyAgICAgICAgICAgZm9yIGZyZWVpbmcgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWVtb3J5LiAgVGhpcyBpcworICAgICAgICAgICBhbHNvIHRoZSByZWFzb24gdGhhdCBiX25lZWRzZnJlZSBpcyBleHBvc2VkIHRvIFB5dGhvbi4KKyAgICAgICAgICovCisgICAgICAgIG9iai0+Yl9uZWVkc2ZyZWUgPSAxOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIEluIHB5dGhvbiAyLjQsIGFuZCBjdHlwZXMgMC45LjYsIHRoZSBtYWxsb2MgY2FsbCB0b29rIGFib3V0CisgICAgICAgICAgIDMzJSBvZiB0aGUgY3JlYXRpb24gdGltZSBmb3IgY19pbnQoKS4KKyAgICAgICAgKi8KKyAgICAgICAgb2JqLT5iX3B0ciA9IChjaGFyICopUHlNZW1fTWFsbG9jKGRpY3QtPnNpemUpOworICAgICAgICBpZiAob2JqLT5iX3B0ciA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIG9iai0+Yl9uZWVkc2ZyZWUgPSAxOworICAgICAgICBtZW1zZXQob2JqLT5iX3B0ciwgMCwgZGljdC0+c2l6ZSk7CisgICAgfQorICAgIG9iai0+Yl9zaXplID0gZGljdC0+c2l6ZTsKKyAgICByZXR1cm4gMDsKIH0KIAogUHlPYmplY3QgKgogQ0RhdGFfRnJvbUJhc2VPYmooUHlPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICpiYXNlLCBQeV9zc2l6ZV90IGluZGV4LCBjaGFyICphZHIpCiB7Ci0JQ0RhdGFPYmplY3QgKmNtZW07Ci0JU3RnRGljdE9iamVjdCAqZGljdDsKKyAgICBDRGF0YU9iamVjdCAqY21lbTsKKyAgICBTdGdEaWN0T2JqZWN0ICpkaWN0OwogCi0JYXNzZXJ0KFB5VHlwZV9DaGVjayh0eXBlKSk7Ci0JZGljdCA9IFB5VHlwZV9zdGdkaWN0KHR5cGUpOwotCWlmICghZGljdCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJhYnN0cmFjdCBjbGFzcyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZGljdC0+ZmxhZ3MgfD0gRElDVEZMQUdfRklOQUw7Ci0JY21lbSA9IChDRGF0YU9iamVjdCAqKSgoUHlUeXBlT2JqZWN0ICopdHlwZSktPnRwX2FsbG9jKChQeVR5cGVPYmplY3QgKil0eXBlLCAwKTsKLQlpZiAoY21lbSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlhc3NlcnQoQ0RhdGFPYmplY3RfQ2hlY2soY21lbSkpOworICAgIGFzc2VydChQeVR5cGVfQ2hlY2sodHlwZSkpOworICAgIGRpY3QgPSBQeVR5cGVfc3RnZGljdCh0eXBlKTsKKyAgICBpZiAoIWRpY3QpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJhYnN0cmFjdCBjbGFzcyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZGljdC0+ZmxhZ3MgfD0gRElDVEZMQUdfRklOQUw7CisgICAgY21lbSA9IChDRGF0YU9iamVjdCAqKSgoUHlUeXBlT2JqZWN0ICopdHlwZSktPnRwX2FsbG9jKChQeVR5cGVPYmplY3QgKil0eXBlLCAwKTsKKyAgICBpZiAoY21lbSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBhc3NlcnQoQ0RhdGFPYmplY3RfQ2hlY2soY21lbSkpOwogCi0JY21lbS0+Yl9sZW5ndGggPSBkaWN0LT5sZW5ndGg7Ci0JY21lbS0+Yl9zaXplID0gZGljdC0+c2l6ZTsKLQlpZiAoYmFzZSkgeyAvKiB1c2UgYmFzZSdzIGJ1ZmZlciAqLwotCQlhc3NlcnQoQ0RhdGFPYmplY3RfQ2hlY2soYmFzZSkpOwotCQljbWVtLT5iX3B0ciA9IGFkcjsKLQkJY21lbS0+Yl9uZWVkc2ZyZWUgPSAwOwotCQlQeV9JTkNSRUYoYmFzZSk7Ci0JCWNtZW0tPmJfYmFzZSA9IChDRGF0YU9iamVjdCAqKWJhc2U7Ci0JCWNtZW0tPmJfaW5kZXggPSBpbmRleDsKLQl9IGVsc2UgeyAvKiBjb3B5IGNvbnRlbnRzIG9mIGFkciAqLwotCQlpZiAoLTEgPT0gQ0RhdGFfTWFsbG9jQnVmZmVyKGNtZW0sIGRpY3QpKSB7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJCVB5X0RFQ1JFRihjbWVtKTsKLQkJfQotCQltZW1jcHkoY21lbS0+Yl9wdHIsIGFkciwgZGljdC0+c2l6ZSk7Ci0JCWNtZW0tPmJfaW5kZXggPSBpbmRleDsKLQl9Ci0JcmV0dXJuIChQeU9iamVjdCAqKWNtZW07CisgICAgY21lbS0+Yl9sZW5ndGggPSBkaWN0LT5sZW5ndGg7CisgICAgY21lbS0+Yl9zaXplID0gZGljdC0+c2l6ZTsKKyAgICBpZiAoYmFzZSkgeyAvKiB1c2UgYmFzZSdzIGJ1ZmZlciAqLworICAgICAgICBhc3NlcnQoQ0RhdGFPYmplY3RfQ2hlY2soYmFzZSkpOworICAgICAgICBjbWVtLT5iX3B0ciA9IGFkcjsKKyAgICAgICAgY21lbS0+Yl9uZWVkc2ZyZWUgPSAwOworICAgICAgICBQeV9JTkNSRUYoYmFzZSk7CisgICAgICAgIGNtZW0tPmJfYmFzZSA9IChDRGF0YU9iamVjdCAqKWJhc2U7CisgICAgICAgIGNtZW0tPmJfaW5kZXggPSBpbmRleDsKKyAgICB9IGVsc2UgeyAvKiBjb3B5IGNvbnRlbnRzIG9mIGFkciAqLworICAgICAgICBpZiAoLTEgPT0gQ0RhdGFfTWFsbG9jQnVmZmVyKGNtZW0sIGRpY3QpKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihjbWVtKTsKKyAgICAgICAgfQorICAgICAgICBtZW1jcHkoY21lbS0+Yl9wdHIsIGFkciwgZGljdC0+c2l6ZSk7CisgICAgICAgIGNtZW0tPmJfaW5kZXggPSBpbmRleDsKKyAgICB9CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWNtZW07CiB9CiAKIC8qCkBAIC0yNzQ5LDI2ICsyNzQ5LDI2IEBACiBQeU9iamVjdCAqCiBDRGF0YV9BdEFkZHJlc3MoUHlPYmplY3QgKnR5cGUsIHZvaWQgKmJ1ZikKIHsKLQlDRGF0YU9iamVjdCAqcGQ7Ci0JU3RnRGljdE9iamVjdCAqZGljdDsKKyAgICBDRGF0YU9iamVjdCAqcGQ7CisgICAgU3RnRGljdE9iamVjdCAqZGljdDsKIAotCWFzc2VydChQeVR5cGVfQ2hlY2sodHlwZSkpOwotCWRpY3QgPSBQeVR5cGVfc3RnZGljdCh0eXBlKTsKLQlpZiAoIWRpY3QpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiYWJzdHJhY3QgY2xhc3MiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWRpY3QtPmZsYWdzIHw9IERJQ1RGTEFHX0ZJTkFMOworICAgIGFzc2VydChQeVR5cGVfQ2hlY2sodHlwZSkpOworICAgIGRpY3QgPSBQeVR5cGVfc3RnZGljdCh0eXBlKTsKKyAgICBpZiAoIWRpY3QpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJhYnN0cmFjdCBjbGFzcyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZGljdC0+ZmxhZ3MgfD0gRElDVEZMQUdfRklOQUw7CiAKLQlwZCA9IChDRGF0YU9iamVjdCAqKSgoUHlUeXBlT2JqZWN0ICopdHlwZSktPnRwX2FsbG9jKChQeVR5cGVPYmplY3QgKil0eXBlLCAwKTsKLQlpZiAoIXBkKQotCQlyZXR1cm4gTlVMTDsKLQlhc3NlcnQoQ0RhdGFPYmplY3RfQ2hlY2socGQpKTsKLQlwZC0+Yl9wdHIgPSAoY2hhciAqKWJ1ZjsKLQlwZC0+Yl9sZW5ndGggPSBkaWN0LT5sZW5ndGg7Ci0JcGQtPmJfc2l6ZSA9IGRpY3QtPnNpemU7Ci0JcmV0dXJuIChQeU9iamVjdCAqKXBkOworICAgIHBkID0gKENEYXRhT2JqZWN0ICopKChQeVR5cGVPYmplY3QgKil0eXBlKS0+dHBfYWxsb2MoKFB5VHlwZU9iamVjdCAqKXR5cGUsIDApOworICAgIGlmICghcGQpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGFzc2VydChDRGF0YU9iamVjdF9DaGVjayhwZCkpOworICAgIHBkLT5iX3B0ciA9IChjaGFyICopYnVmOworICAgIHBkLT5iX2xlbmd0aCA9IGRpY3QtPmxlbmd0aDsKKyAgICBwZC0+Yl9zaXplID0gZGljdC0+c2l6ZTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopcGQ7CiB9CiAKIC8qCkBAIC0yNzc4LDI1ICsyNzc4LDI1IEBACiAqLwogaW50IElzU2ltcGxlU3ViVHlwZShQeU9iamVjdCAqb2JqKQogewotCVB5VHlwZU9iamVjdCAqdHlwZSA9IChQeVR5cGVPYmplY3QgKilvYmo7CisgICAgUHlUeXBlT2JqZWN0ICp0eXBlID0gKFB5VHlwZU9iamVjdCAqKW9iajsKIAotCWlmIChTaW1wbGVUeXBlT2JqZWN0X0NoZWNrKHR5cGUpKQotCQlyZXR1cm4gdHlwZS0+dHBfYmFzZSAhPSAmU2ltcGxlX1R5cGU7Ci0JcmV0dXJuIDA7CisgICAgaWYgKFNpbXBsZVR5cGVPYmplY3RfQ2hlY2sodHlwZSkpCisgICAgICAgIHJldHVybiB0eXBlLT50cF9iYXNlICE9ICZTaW1wbGVfVHlwZTsKKyAgICByZXR1cm4gMDsKIH0KIAogUHlPYmplY3QgKgogQ0RhdGFfZ2V0KFB5T2JqZWN0ICp0eXBlLCBHRVRGVU5DIGdldGZ1bmMsIFB5T2JqZWN0ICpzcmMsCi0JICBQeV9zc2l6ZV90IGluZGV4LCBQeV9zc2l6ZV90IHNpemUsIGNoYXIgKmFkcikKKyAgICAgICAgICBQeV9zc2l6ZV90IGluZGV4LCBQeV9zc2l6ZV90IHNpemUsIGNoYXIgKmFkcikKIHsKLQlTdGdEaWN0T2JqZWN0ICpkaWN0OwotCWlmIChnZXRmdW5jKQotCQlyZXR1cm4gZ2V0ZnVuYyhhZHIsIHNpemUpOwotCWFzc2VydCh0eXBlKTsKLQlkaWN0ID0gUHlUeXBlX3N0Z2RpY3QodHlwZSk7Ci0JaWYgKGRpY3QgJiYgZGljdC0+Z2V0ZnVuYyAmJiAhSXNTaW1wbGVTdWJUeXBlKHR5cGUpKQotCQlyZXR1cm4gZGljdC0+Z2V0ZnVuYyhhZHIsIHNpemUpOwotCXJldHVybiBDRGF0YV9Gcm9tQmFzZU9iaih0eXBlLCBzcmMsIGluZGV4LCBhZHIpOworICAgIFN0Z0RpY3RPYmplY3QgKmRpY3Q7CisgICAgaWYgKGdldGZ1bmMpCisgICAgICAgIHJldHVybiBnZXRmdW5jKGFkciwgc2l6ZSk7CisgICAgYXNzZXJ0KHR5cGUpOworICAgIGRpY3QgPSBQeVR5cGVfc3RnZGljdCh0eXBlKTsKKyAgICBpZiAoZGljdCAmJiBkaWN0LT5nZXRmdW5jICYmICFJc1NpbXBsZVN1YlR5cGUodHlwZSkpCisgICAgICAgIHJldHVybiBkaWN0LT5nZXRmdW5jKGFkciwgc2l6ZSk7CisgICAgcmV0dXJuIENEYXRhX0Zyb21CYXNlT2JqKHR5cGUsIHNyYywgaW5kZXgsIGFkcik7CiB9CiAKIC8qCkBAIC0yODA0LDk2ICsyODA0LDk2IEBACiAqLwogc3RhdGljIFB5T2JqZWN0ICoKIF9DRGF0YV9zZXQoQ0RhdGFPYmplY3QgKmRzdCwgUHlPYmplY3QgKnR5cGUsIFNFVEZVTkMgc2V0ZnVuYywgUHlPYmplY3QgKnZhbHVlLAotCSAgIFB5X3NzaXplX3Qgc2l6ZSwgY2hhciAqcHRyKQorICAgICAgICAgICBQeV9zc2l6ZV90IHNpemUsIGNoYXIgKnB0cikKIHsKLQlDRGF0YU9iamVjdCAqc3JjOworICAgIENEYXRhT2JqZWN0ICpzcmM7CiAKLQlpZiAoc2V0ZnVuYykKLQkJcmV0dXJuIHNldGZ1bmMocHRyLCB2YWx1ZSwgc2l6ZSk7Ci0JCi0JaWYgKCFDRGF0YU9iamVjdF9DaGVjayh2YWx1ZSkpIHsKLQkJU3RnRGljdE9iamVjdCAqZGljdCA9IFB5VHlwZV9zdGdkaWN0KHR5cGUpOwotCQlpZiAoZGljdCAmJiBkaWN0LT5zZXRmdW5jKQotCQkJcmV0dXJuIGRpY3QtPnNldGZ1bmMocHRyLCB2YWx1ZSwgc2l6ZSk7Ci0JCS8qCi0JCSAgIElmIHZhbHVlIGlzIGEgdHVwbGUsIHdlIHRyeSB0byBjYWxsIHRoZSB0eXBlIHdpdGggdGhlIHR1cGxlCi0JCSAgIGFuZCB1c2UgdGhlIHJlc3VsdCEKLQkJKi8KLQkJYXNzZXJ0KFB5VHlwZV9DaGVjayh0eXBlKSk7Ci0JCWlmIChQeVR1cGxlX0NoZWNrKHZhbHVlKSkgewotCQkJUHlPYmplY3QgKm9iOwotCQkJUHlPYmplY3QgKnJlc3VsdDsKLQkJCW9iID0gUHlPYmplY3RfQ2FsbE9iamVjdCh0eXBlLCB2YWx1ZSk7Ci0JCQlpZiAob2IgPT0gTlVMTCkgewotCQkJCUV4dGVuZF9FcnJvcl9JbmZvKFB5RXhjX1J1bnRpbWVFcnJvciwgIiglcykgIiwKLQkJCQkJCSAgKChQeVR5cGVPYmplY3QgKil0eXBlKS0+dHBfbmFtZSk7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCQlyZXN1bHQgPSBfQ0RhdGFfc2V0KGRzdCwgdHlwZSwgc2V0ZnVuYywgb2IsCi0JCQkJCSAgICBzaXplLCBwdHIpOwotCQkJUHlfREVDUkVGKG9iKTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0gZWxzZSBpZiAodmFsdWUgPT0gUHlfTm9uZSAmJiBQb2ludGVyVHlwZU9iamVjdF9DaGVjayh0eXBlKSkgewotCQkJKih2b2lkICoqKXB0ciA9IE5VTEw7Ci0JCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCQlyZXR1cm4gUHlfTm9uZTsKLQkJfSBlbHNlIHsKLQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkJICAgICAiZXhwZWN0ZWQgJXMgaW5zdGFuY2UsIGdvdCAlcyIsCi0JCQkJICAgICAoKFB5VHlwZU9iamVjdCAqKXR5cGUpLT50cF9uYW1lLAotCQkJCSAgICAgUHlfVFlQRSh2YWx1ZSktPnRwX25hbWUpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9Ci0Jc3JjID0gKENEYXRhT2JqZWN0ICopdmFsdWU7CisgICAgaWYgKHNldGZ1bmMpCisgICAgICAgIHJldHVybiBzZXRmdW5jKHB0ciwgdmFsdWUsIHNpemUpOwogCi0JaWYgKFB5T2JqZWN0X0lzSW5zdGFuY2UodmFsdWUsIHR5cGUpKSB7Ci0JCW1lbWNweShwdHIsCi0JCSAgICAgICBzcmMtPmJfcHRyLAotCQkgICAgICAgc2l6ZSk7CisgICAgaWYgKCFDRGF0YU9iamVjdF9DaGVjayh2YWx1ZSkpIHsKKyAgICAgICAgU3RnRGljdE9iamVjdCAqZGljdCA9IFB5VHlwZV9zdGdkaWN0KHR5cGUpOworICAgICAgICBpZiAoZGljdCAmJiBkaWN0LT5zZXRmdW5jKQorICAgICAgICAgICAgcmV0dXJuIGRpY3QtPnNldGZ1bmMocHRyLCB2YWx1ZSwgc2l6ZSk7CisgICAgICAgIC8qCisgICAgICAgICAgIElmIHZhbHVlIGlzIGEgdHVwbGUsIHdlIHRyeSB0byBjYWxsIHRoZSB0eXBlIHdpdGggdGhlIHR1cGxlCisgICAgICAgICAgIGFuZCB1c2UgdGhlIHJlc3VsdCEKKyAgICAgICAgKi8KKyAgICAgICAgYXNzZXJ0KFB5VHlwZV9DaGVjayh0eXBlKSk7CisgICAgICAgIGlmIChQeVR1cGxlX0NoZWNrKHZhbHVlKSkgeworICAgICAgICAgICAgUHlPYmplY3QgKm9iOworICAgICAgICAgICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICAgICAgICAgIG9iID0gUHlPYmplY3RfQ2FsbE9iamVjdCh0eXBlLCB2YWx1ZSk7CisgICAgICAgICAgICBpZiAob2IgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIEV4dGVuZF9FcnJvcl9JbmZvKFB5RXhjX1J1bnRpbWVFcnJvciwgIiglcykgIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFB5VHlwZU9iamVjdCAqKXR5cGUpLT50cF9uYW1lKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc3VsdCA9IF9DRGF0YV9zZXQoZHN0LCB0eXBlLCBzZXRmdW5jLCBvYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwgcHRyKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihvYik7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09IFB5X05vbmUgJiYgUG9pbnRlclR5cGVPYmplY3RfQ2hlY2sodHlwZSkpIHsKKyAgICAgICAgICAgICoodm9pZCAqKilwdHIgPSBOVUxMOworICAgICAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCAlcyBpbnN0YW5jZSwgZ290ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoKFB5VHlwZU9iamVjdCAqKXR5cGUpLT50cF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5X1RZUEUodmFsdWUpLT50cF9uYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorICAgIHNyYyA9IChDRGF0YU9iamVjdCAqKXZhbHVlOwogCi0JCWlmIChQb2ludGVyVHlwZU9iamVjdF9DaGVjayh0eXBlKSkKLQkJCS8qIFhYWCAqLzsKKyAgICBpZiAoUHlPYmplY3RfSXNJbnN0YW5jZSh2YWx1ZSwgdHlwZSkpIHsKKyAgICAgICAgbWVtY3B5KHB0ciwKKyAgICAgICAgICAgICAgIHNyYy0+Yl9wdHIsCisgICAgICAgICAgICAgICBzaXplKTsKIAotCQl2YWx1ZSA9IEdldEtlZXBlZE9iamVjdHMoc3JjKTsKLQkJUHlfSU5DUkVGKHZhbHVlKTsKLQkJcmV0dXJuIHZhbHVlOwotCX0KKyAgICAgICAgaWYgKFBvaW50ZXJUeXBlT2JqZWN0X0NoZWNrKHR5cGUpKQorICAgICAgICAgICAgLyogWFhYICovOwogCi0JaWYgKFBvaW50ZXJUeXBlT2JqZWN0X0NoZWNrKHR5cGUpCi0JICAgICYmIEFycmF5T2JqZWN0X0NoZWNrKHZhbHVlKSkgewotCQlTdGdEaWN0T2JqZWN0ICpwMSwgKnAyOwotCQlQeU9iamVjdCAqa2VlcDsKLQkJcDEgPSBQeU9iamVjdF9zdGdkaWN0KHZhbHVlKTsKLQkJYXNzZXJ0KHAxKTsgLyogQ2Fubm90IGJlIE5VTEwgZm9yIGFycmF5IGluc3RhbmNlcyAqLwotCQlwMiA9IFB5VHlwZV9zdGdkaWN0KHR5cGUpOwotCQlhc3NlcnQocDIpOyAvKiBDYW5ub3QgYmUgTlVMTCBmb3IgcG9pbnRlciB0eXBlcyAqLworICAgICAgICB2YWx1ZSA9IEdldEtlZXBlZE9iamVjdHMoc3JjKTsKKyAgICAgICAgUHlfSU5DUkVGKHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KIAotCQlpZiAocDEtPnByb3RvICE9IHAyLT5wcm90bykgewotCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCQkgICAgICJpbmNvbXBhdGlibGUgdHlwZXMsICVzIGluc3RhbmNlIGluc3RlYWQgb2YgJXMgaW5zdGFuY2UiLAotCQkJCSAgICAgUHlfVFlQRSh2YWx1ZSktPnRwX25hbWUsCi0JCQkJICAgICAoKFB5VHlwZU9iamVjdCAqKXR5cGUpLT50cF9uYW1lKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCSoodm9pZCAqKilwdHIgPSBzcmMtPmJfcHRyOworICAgIGlmIChQb2ludGVyVHlwZU9iamVjdF9DaGVjayh0eXBlKQorICAgICAgICAmJiBBcnJheU9iamVjdF9DaGVjayh2YWx1ZSkpIHsKKyAgICAgICAgU3RnRGljdE9iamVjdCAqcDEsICpwMjsKKyAgICAgICAgUHlPYmplY3QgKmtlZXA7CisgICAgICAgIHAxID0gUHlPYmplY3Rfc3RnZGljdCh2YWx1ZSk7CisgICAgICAgIGFzc2VydChwMSk7IC8qIENhbm5vdCBiZSBOVUxMIGZvciBhcnJheSBpbnN0YW5jZXMgKi8KKyAgICAgICAgcDIgPSBQeVR5cGVfc3RnZGljdCh0eXBlKTsKKyAgICAgICAgYXNzZXJ0KHAyKTsgLyogQ2Fubm90IGJlIE5VTEwgZm9yIHBvaW50ZXIgdHlwZXMgKi8KIAotCQlrZWVwID0gR2V0S2VlcGVkT2JqZWN0cyhzcmMpOwotCQkvKgotCQkgIFdlIGFyZSBhc3NpZ25pbmcgYW4gYXJyYXkgb2JqZWN0IHRvIGEgZmllbGQgd2hpY2ggcmVwcmVzZW50cwotCQkgIGEgcG9pbnRlci4gVGhpcyBoYXMgdGhlIHNhbWUgZWZmZWN0IGFzIGNvbnZlcnRpbmcgYW4gYXJyYXkKLQkJICBpbnRvIGEgcG9pbnRlci4gU28sIGFnYWluLCB3ZSBoYXZlIHRvIGtlZXAgdGhlIHdob2xlIG9iamVjdAotCQkgIHBvaW50ZWQgdG8gKHdoaWNoIGlzIHRoZSBhcnJheSBpbiB0aGlzIGNhc2UpIGFsaXZlLCBhbmQgbm90Ci0JCSAgb25seSBpdCdzIG9iamVjdCBsaXN0LiAgU28gd2UgY3JlYXRlIGEgdHVwbGUsIGNvbnRhaW5pbmcKLQkJICBiX29iamVjdHMgbGlzdCBQTFVTIHRoZSBhcnJheSBpdHNlbGYsIGFuZCByZXR1cm4gdGhhdCEKLQkJKi8KLQkJcmV0dXJuIFB5VHVwbGVfUGFjaygyLCBrZWVwLCB2YWx1ZSk7Ci0JfQotCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCSAgICAgImluY29tcGF0aWJsZSB0eXBlcywgJXMgaW5zdGFuY2UgaW5zdGVhZCBvZiAlcyBpbnN0YW5jZSIsCi0JCSAgICAgUHlfVFlQRSh2YWx1ZSktPnRwX25hbWUsCi0JCSAgICAgKChQeVR5cGVPYmplY3QgKil0eXBlKS0+dHBfbmFtZSk7Ci0JcmV0dXJuIE5VTEw7CisgICAgICAgIGlmIChwMS0+cHJvdG8gIT0gcDItPnByb3RvKSB7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICJpbmNvbXBhdGlibGUgdHlwZXMsICVzIGluc3RhbmNlIGluc3RlYWQgb2YgJXMgaW5zdGFuY2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5X1RZUEUodmFsdWUpLT50cF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICgoUHlUeXBlT2JqZWN0ICopdHlwZSktPnRwX25hbWUpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgKih2b2lkICoqKXB0ciA9IHNyYy0+Yl9wdHI7CisKKyAgICAgICAga2VlcCA9IEdldEtlZXBlZE9iamVjdHMoc3JjKTsKKyAgICAgICAgLyoKKyAgICAgICAgICBXZSBhcmUgYXNzaWduaW5nIGFuIGFycmF5IG9iamVjdCB0byBhIGZpZWxkIHdoaWNoIHJlcHJlc2VudHMKKyAgICAgICAgICBhIHBvaW50ZXIuIFRoaXMgaGFzIHRoZSBzYW1lIGVmZmVjdCBhcyBjb252ZXJ0aW5nIGFuIGFycmF5CisgICAgICAgICAgaW50byBhIHBvaW50ZXIuIFNvLCBhZ2Fpbiwgd2UgaGF2ZSB0byBrZWVwIHRoZSB3aG9sZSBvYmplY3QKKyAgICAgICAgICBwb2ludGVkIHRvICh3aGljaCBpcyB0aGUgYXJyYXkgaW4gdGhpcyBjYXNlKSBhbGl2ZSwgYW5kIG5vdAorICAgICAgICAgIG9ubHkgaXQncyBvYmplY3QgbGlzdC4gIFNvIHdlIGNyZWF0ZSBhIHR1cGxlLCBjb250YWluaW5nCisgICAgICAgICAgYl9vYmplY3RzIGxpc3QgUExVUyB0aGUgYXJyYXkgaXRzZWxmLCBhbmQgcmV0dXJuIHRoYXQhCisgICAgICAgICovCisgICAgICAgIHJldHVybiBQeVR1cGxlX1BhY2soMiwga2VlcCwgdmFsdWUpOworICAgIH0KKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAiaW5jb21wYXRpYmxlIHR5cGVzLCAlcyBpbnN0YW5jZSBpbnN0ZWFkIG9mICVzIGluc3RhbmNlIiwKKyAgICAgICAgICAgICAgICAgUHlfVFlQRSh2YWx1ZSktPnRwX25hbWUsCisgICAgICAgICAgICAgICAgICgoUHlUeXBlT2JqZWN0ICopdHlwZSktPnRwX25hbWUpOworICAgIHJldHVybiBOVUxMOwogfQogCiAvKgpAQCAtMjkwMiw1OCArMjkwMiw1OCBAQAogICovCiBpbnQKIENEYXRhX3NldChQeU9iamVjdCAqZHN0LCBQeU9iamVjdCAqdHlwZSwgU0VURlVOQyBzZXRmdW5jLCBQeU9iamVjdCAqdmFsdWUsCi0JICBQeV9zc2l6ZV90IGluZGV4LCBQeV9zc2l6ZV90IHNpemUsIGNoYXIgKnB0cikKKyAgICAgICAgICBQeV9zc2l6ZV90IGluZGV4LCBQeV9zc2l6ZV90IHNpemUsIGNoYXIgKnB0cikKIHsKLQlDRGF0YU9iamVjdCAqbWVtID0gKENEYXRhT2JqZWN0ICopZHN0OwotCVB5T2JqZWN0ICpyZXN1bHQ7CisgICAgQ0RhdGFPYmplY3QgKm1lbSA9IChDRGF0YU9iamVjdCAqKWRzdDsKKyAgICBQeU9iamVjdCAqcmVzdWx0OwogCi0JaWYgKCFDRGF0YU9iamVjdF9DaGVjayhkc3QpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJIm5vdCBhIGN0eXBlIGluc3RhbmNlIik7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgaWYgKCFDRGF0YU9iamVjdF9DaGVjayhkc3QpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAibm90IGEgY3R5cGUgaW5zdGFuY2UiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCXJlc3VsdCA9IF9DRGF0YV9zZXQobWVtLCB0eXBlLCBzZXRmdW5jLCB2YWx1ZSwKLQkJCSAgICBzaXplLCBwdHIpOwotCWlmIChyZXN1bHQgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOworICAgIHJlc3VsdCA9IF9DRGF0YV9zZXQobWVtLCB0eXBlLCBzZXRmdW5jLCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsIHB0cik7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CiAKLQkvKiBLZWVwUmVmIHN0ZWFscyBhIHJlZmNvdW50IGZyb20gaXQncyBsYXN0IGFyZ3VtZW50ICovCi0JLyogSWYgS2VlcFJlZiBmYWlscywgd2UgYXJlIHN0dW1wZWQuICBUaGUgZHN0IG1lbW9yeSBibG9jayBoYXMgYWxyZWFkeQotCSAgIGJlZW4gY2hhbmdlZCAqLwotCXJldHVybiBLZWVwUmVmKG1lbSwgaW5kZXgsIHJlc3VsdCk7CisgICAgLyogS2VlcFJlZiBzdGVhbHMgYSByZWZjb3VudCBmcm9tIGl0J3MgbGFzdCBhcmd1bWVudCAqLworICAgIC8qIElmIEtlZXBSZWYgZmFpbHMsIHdlIGFyZSBzdHVtcGVkLiAgVGhlIGRzdCBtZW1vcnkgYmxvY2sgaGFzIGFscmVhZHkKKyAgICAgICBiZWVuIGNoYW5nZWQgKi8KKyAgICByZXR1cm4gS2VlcFJlZihtZW0sIGluZGV4LCByZXN1bHQpOwogfQogCi0MCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBzdGF0aWMgUHlPYmplY3QgKgogR2VuZXJpY0NEYXRhX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlDRGF0YU9iamVjdCAqb2JqOwotCVN0Z0RpY3RPYmplY3QgKmRpY3Q7CisgICAgQ0RhdGFPYmplY3QgKm9iajsKKyAgICBTdGdEaWN0T2JqZWN0ICpkaWN0OwogCi0JZGljdCA9IFB5VHlwZV9zdGdkaWN0KChQeU9iamVjdCAqKXR5cGUpOwotCWlmICghZGljdCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJhYnN0cmFjdCBjbGFzcyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZGljdC0+ZmxhZ3MgfD0gRElDVEZMQUdfRklOQUw7CisgICAgZGljdCA9IFB5VHlwZV9zdGdkaWN0KChQeU9iamVjdCAqKXR5cGUpOworICAgIGlmICghZGljdCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImFic3RyYWN0IGNsYXNzIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBkaWN0LT5mbGFncyB8PSBESUNURkxBR19GSU5BTDsKIAotCW9iaiA9IChDRGF0YU9iamVjdCAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOwotCWlmICghb2JqKQotCQlyZXR1cm4gTlVMTDsKKyAgICBvYmogPSAoQ0RhdGFPYmplY3QgKil0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKKyAgICBpZiAoIW9iaikKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlvYmotPmJfYmFzZSA9IE5VTEw7Ci0Jb2JqLT5iX2luZGV4ID0gMDsKLQlvYmotPmJfb2JqZWN0cyA9IE5VTEw7Ci0Jb2JqLT5iX2xlbmd0aCA9IGRpY3QtPmxlbmd0aDsKLQkJCQotCWlmICgtMSA9PSBDRGF0YV9NYWxsb2NCdWZmZXIob2JqLCBkaWN0KSkgewotCQlQeV9ERUNSRUYob2JqKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiAoUHlPYmplY3QgKilvYmo7CisgICAgb2JqLT5iX2Jhc2UgPSBOVUxMOworICAgIG9iai0+Yl9pbmRleCA9IDA7CisgICAgb2JqLT5iX29iamVjdHMgPSBOVUxMOworICAgIG9iai0+Yl9sZW5ndGggPSBkaWN0LT5sZW5ndGg7CisKKyAgICBpZiAoLTEgPT0gQ0RhdGFfTWFsbG9jQnVmZmVyKG9iaiwgZGljdCkpIHsKKyAgICAgICAgUHlfREVDUkVGKG9iaik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gKFB5T2JqZWN0ICopb2JqOwogfQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKQEAgLTI5NjMsMTY1ICsyOTYzLDE2NSBAQAogc3RhdGljIGludAogQ0Z1bmNQdHJfc2V0X2VycmNoZWNrKENGdW5jUHRyT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqb2IpCiB7Ci0JaWYgKG9iICYmICFQeUNhbGxhYmxlX0NoZWNrKG9iKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJ0aGUgZXJyY2hlY2sgYXR0cmlidXRlIG11c3QgYmUgY2FsbGFibGUiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlQeV9YREVDUkVGKHNlbGYtPmVycmNoZWNrKTsKLQlQeV9YSU5DUkVGKG9iKTsKLQlzZWxmLT5lcnJjaGVjayA9IG9iOwotCXJldHVybiAwOworICAgIGlmIChvYiAmJiAhUHlDYWxsYWJsZV9DaGVjayhvYikpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0aGUgZXJyY2hlY2sgYXR0cmlidXRlIG11c3QgYmUgY2FsbGFibGUiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBQeV9YREVDUkVGKHNlbGYtPmVycmNoZWNrKTsKKyAgICBQeV9YSU5DUkVGKG9iKTsKKyAgICBzZWxmLT5lcnJjaGVjayA9IG9iOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogQ0Z1bmNQdHJfZ2V0X2VycmNoZWNrKENGdW5jUHRyT2JqZWN0ICpzZWxmKQogewotCWlmIChzZWxmLT5lcnJjaGVjaykgewotCQlQeV9JTkNSRUYoc2VsZi0+ZXJyY2hlY2spOwotCQlyZXR1cm4gc2VsZi0+ZXJyY2hlY2s7Ci0JfQotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAoc2VsZi0+ZXJyY2hlY2spIHsKKyAgICAgICAgUHlfSU5DUkVGKHNlbGYtPmVycmNoZWNrKTsKKyAgICAgICAgcmV0dXJuIHNlbGYtPmVycmNoZWNrOworICAgIH0KKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBpbnQKIENGdW5jUHRyX3NldF9yZXN0eXBlKENGdW5jUHRyT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqb2IpCiB7Ci0JaWYgKG9iID09IE5VTEwpIHsKLQkJUHlfWERFQ1JFRihzZWxmLT5yZXN0eXBlKTsKLQkJc2VsZi0+cmVzdHlwZSA9IE5VTEw7Ci0JCVB5X1hERUNSRUYoc2VsZi0+Y2hlY2tlcik7Ci0JCXNlbGYtPmNoZWNrZXIgPSBOVUxMOwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKG9iICE9IFB5X05vbmUgJiYgIVB5VHlwZV9zdGdkaWN0KG9iKSAmJiAhUHlDYWxsYWJsZV9DaGVjayhvYikpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkicmVzdHlwZSBtdXN0IGJlIGEgdHlwZSwgYSBjYWxsYWJsZSwgb3IgTm9uZSIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCVB5X1hERUNSRUYoc2VsZi0+Y2hlY2tlcik7Ci0JUHlfWERFQ1JFRihzZWxmLT5yZXN0eXBlKTsKLQlQeV9JTkNSRUYob2IpOwotCXNlbGYtPnJlc3R5cGUgPSBvYjsKLQlzZWxmLT5jaGVja2VyID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhvYiwgIl9jaGVja19yZXR2YWxfIik7Ci0JaWYgKHNlbGYtPmNoZWNrZXIgPT0gTlVMTCkKLQkJUHlFcnJfQ2xlYXIoKTsKLQlyZXR1cm4gMDsKKyAgICBpZiAob2IgPT0gTlVMTCkgeworICAgICAgICBQeV9YREVDUkVGKHNlbGYtPnJlc3R5cGUpOworICAgICAgICBzZWxmLT5yZXN0eXBlID0gTlVMTDsKKyAgICAgICAgUHlfWERFQ1JFRihzZWxmLT5jaGVja2VyKTsKKyAgICAgICAgc2VsZi0+Y2hlY2tlciA9IE5VTEw7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAob2IgIT0gUHlfTm9uZSAmJiAhUHlUeXBlX3N0Z2RpY3Qob2IpICYmICFQeUNhbGxhYmxlX0NoZWNrKG9iKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInJlc3R5cGUgbXVzdCBiZSBhIHR5cGUsIGEgY2FsbGFibGUsIG9yIE5vbmUiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBQeV9YREVDUkVGKHNlbGYtPmNoZWNrZXIpOworICAgIFB5X1hERUNSRUYoc2VsZi0+cmVzdHlwZSk7CisgICAgUHlfSU5DUkVGKG9iKTsKKyAgICBzZWxmLT5yZXN0eXBlID0gb2I7CisgICAgc2VsZi0+Y2hlY2tlciA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcob2IsICJfY2hlY2tfcmV0dmFsXyIpOworICAgIGlmIChzZWxmLT5jaGVja2VyID09IE5VTEwpCisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBDRnVuY1B0cl9nZXRfcmVzdHlwZShDRnVuY1B0ck9iamVjdCAqc2VsZikKIHsKLQlTdGdEaWN0T2JqZWN0ICpkaWN0OwotCWlmIChzZWxmLT5yZXN0eXBlKSB7Ci0JCVB5X0lOQ1JFRihzZWxmLT5yZXN0eXBlKTsKLQkJcmV0dXJuIHNlbGYtPnJlc3R5cGU7Ci0JfQotCWRpY3QgPSBQeU9iamVjdF9zdGdkaWN0KChQeU9iamVjdCAqKXNlbGYpOwotCWFzc2VydChkaWN0KTsgLyogQ2Fubm90IGJlIE5VTEwgZm9yIENGdW5jUHRyT2JqZWN0IGluc3RhbmNlcyAqLwotCWlmIChkaWN0LT5yZXN0eXBlKSB7Ci0JCVB5X0lOQ1JFRihkaWN0LT5yZXN0eXBlKTsKLQkJcmV0dXJuIGRpY3QtPnJlc3R5cGU7Ci0JfSBlbHNlIHsKLQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQlyZXR1cm4gUHlfTm9uZTsKLQl9CisgICAgU3RnRGljdE9iamVjdCAqZGljdDsKKyAgICBpZiAoc2VsZi0+cmVzdHlwZSkgeworICAgICAgICBQeV9JTkNSRUYoc2VsZi0+cmVzdHlwZSk7CisgICAgICAgIHJldHVybiBzZWxmLT5yZXN0eXBlOworICAgIH0KKyAgICBkaWN0ID0gUHlPYmplY3Rfc3RnZGljdCgoUHlPYmplY3QgKilzZWxmKTsKKyAgICBhc3NlcnQoZGljdCk7IC8qIENhbm5vdCBiZSBOVUxMIGZvciBDRnVuY1B0ck9iamVjdCBpbnN0YW5jZXMgKi8KKyAgICBpZiAoZGljdC0+cmVzdHlwZSkgeworICAgICAgICBQeV9JTkNSRUYoZGljdC0+cmVzdHlwZSk7CisgICAgICAgIHJldHVybiBkaWN0LT5yZXN0eXBlOworICAgIH0gZWxzZSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgfQogfQogCiBzdGF0aWMgaW50CiBDRnVuY1B0cl9zZXRfYXJndHlwZXMoQ0Z1bmNQdHJPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpvYikKIHsKLQlQeU9iamVjdCAqY29udmVydGVyczsKKyAgICBQeU9iamVjdCAqY29udmVydGVyczsKIAotCWlmIChvYiA9PSBOVUxMIHx8IG9iID09IFB5X05vbmUpIHsKLQkJUHlfWERFQ1JFRihzZWxmLT5jb252ZXJ0ZXJzKTsKLQkJc2VsZi0+Y29udmVydGVycyA9IE5VTEw7Ci0JCVB5X1hERUNSRUYoc2VsZi0+YXJndHlwZXMpOwotCQlzZWxmLT5hcmd0eXBlcyA9IE5VTEw7Ci0JfSBlbHNlIHsKLQkJY29udmVydGVycyA9IGNvbnZlcnRlcnNfZnJvbV9hcmd0eXBlcyhvYik7Ci0JCWlmICghY29udmVydGVycykKLQkJCXJldHVybiAtMTsKLQkJUHlfWERFQ1JFRihzZWxmLT5jb252ZXJ0ZXJzKTsKLQkJc2VsZi0+Y29udmVydGVycyA9IGNvbnZlcnRlcnM7Ci0JCVB5X1hERUNSRUYoc2VsZi0+YXJndHlwZXMpOwotCQlQeV9JTkNSRUYob2IpOwotCQlzZWxmLT5hcmd0eXBlcyA9IG9iOwotCX0KLQlyZXR1cm4gMDsKKyAgICBpZiAob2IgPT0gTlVMTCB8fCBvYiA9PSBQeV9Ob25lKSB7CisgICAgICAgIFB5X1hERUNSRUYoc2VsZi0+Y29udmVydGVycyk7CisgICAgICAgIHNlbGYtPmNvbnZlcnRlcnMgPSBOVUxMOworICAgICAgICBQeV9YREVDUkVGKHNlbGYtPmFyZ3R5cGVzKTsKKyAgICAgICAgc2VsZi0+YXJndHlwZXMgPSBOVUxMOworICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnZlcnRlcnMgPSBjb252ZXJ0ZXJzX2Zyb21fYXJndHlwZXMob2IpOworICAgICAgICBpZiAoIWNvbnZlcnRlcnMpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIFB5X1hERUNSRUYoc2VsZi0+Y29udmVydGVycyk7CisgICAgICAgIHNlbGYtPmNvbnZlcnRlcnMgPSBjb252ZXJ0ZXJzOworICAgICAgICBQeV9YREVDUkVGKHNlbGYtPmFyZ3R5cGVzKTsKKyAgICAgICAgUHlfSU5DUkVGKG9iKTsKKyAgICAgICAgc2VsZi0+YXJndHlwZXMgPSBvYjsKKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBDRnVuY1B0cl9nZXRfYXJndHlwZXMoQ0Z1bmNQdHJPYmplY3QgKnNlbGYpCiB7Ci0JU3RnRGljdE9iamVjdCAqZGljdDsKLQlpZiAoc2VsZi0+YXJndHlwZXMpIHsKLQkJUHlfSU5DUkVGKHNlbGYtPmFyZ3R5cGVzKTsKLQkJcmV0dXJuIHNlbGYtPmFyZ3R5cGVzOwotCX0KLQlkaWN0ID0gUHlPYmplY3Rfc3RnZGljdCgoUHlPYmplY3QgKilzZWxmKTsKLQlhc3NlcnQoZGljdCk7IC8qIENhbm5vdCBiZSBOVUxMIGZvciBDRnVuY1B0ck9iamVjdCBpbnN0YW5jZXMgKi8KLQlpZiAoZGljdC0+YXJndHlwZXMpIHsKLQkJUHlfSU5DUkVGKGRpY3QtPmFyZ3R5cGVzKTsKLQkJcmV0dXJuIGRpY3QtPmFyZ3R5cGVzOwotCX0gZWxzZSB7Ci0JCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJcmV0dXJuIFB5X05vbmU7Ci0JfQorICAgIFN0Z0RpY3RPYmplY3QgKmRpY3Q7CisgICAgaWYgKHNlbGYtPmFyZ3R5cGVzKSB7CisgICAgICAgIFB5X0lOQ1JFRihzZWxmLT5hcmd0eXBlcyk7CisgICAgICAgIHJldHVybiBzZWxmLT5hcmd0eXBlczsKKyAgICB9CisgICAgZGljdCA9IFB5T2JqZWN0X3N0Z2RpY3QoKFB5T2JqZWN0ICopc2VsZik7CisgICAgYXNzZXJ0KGRpY3QpOyAvKiBDYW5ub3QgYmUgTlVMTCBmb3IgQ0Z1bmNQdHJPYmplY3QgaW5zdGFuY2VzICovCisgICAgaWYgKGRpY3QtPmFyZ3R5cGVzKSB7CisgICAgICAgIFB5X0lOQ1JFRihkaWN0LT5hcmd0eXBlcyk7CisgICAgICAgIHJldHVybiBkaWN0LT5hcmd0eXBlczsKKyAgICB9IGVsc2UgeworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIHJldHVybiBQeV9Ob25lOworICAgIH0KIH0KIAogc3RhdGljIFB5R2V0U2V0RGVmIENGdW5jUHRyX2dldHNldHNbXSA9IHsKLQl7ICJlcnJjaGVjayIsIChnZXR0ZXIpQ0Z1bmNQdHJfZ2V0X2VycmNoZWNrLCAoc2V0dGVyKUNGdW5jUHRyX3NldF9lcnJjaGVjaywKLQkgICJhIGZ1bmN0aW9uIHRvIGNoZWNrIGZvciBlcnJvcnMiLCBOVUxMIH0sCi0JeyAicmVzdHlwZSIsIChnZXR0ZXIpQ0Z1bmNQdHJfZ2V0X3Jlc3R5cGUsIChzZXR0ZXIpQ0Z1bmNQdHJfc2V0X3Jlc3R5cGUsCi0JICAic3BlY2lmeSB0aGUgcmVzdWx0IHR5cGUiLCBOVUxMIH0sCi0JeyAiYXJndHlwZXMiLCAoZ2V0dGVyKUNGdW5jUHRyX2dldF9hcmd0eXBlcywKLQkgIChzZXR0ZXIpQ0Z1bmNQdHJfc2V0X2FyZ3R5cGVzLAotCSAgInNwZWNpZnkgdGhlIGFyZ3VtZW50IHR5cGVzIiwgTlVMTCB9LAotCXsgTlVMTCwgTlVMTCB9CisgICAgeyAiZXJyY2hlY2siLCAoZ2V0dGVyKUNGdW5jUHRyX2dldF9lcnJjaGVjaywgKHNldHRlcilDRnVuY1B0cl9zZXRfZXJyY2hlY2ssCisgICAgICAiYSBmdW5jdGlvbiB0byBjaGVjayBmb3IgZXJyb3JzIiwgTlVMTCB9LAorICAgIHsgInJlc3R5cGUiLCAoZ2V0dGVyKUNGdW5jUHRyX2dldF9yZXN0eXBlLCAoc2V0dGVyKUNGdW5jUHRyX3NldF9yZXN0eXBlLAorICAgICAgInNwZWNpZnkgdGhlIHJlc3VsdCB0eXBlIiwgTlVMTCB9LAorICAgIHsgImFyZ3R5cGVzIiwgKGdldHRlcilDRnVuY1B0cl9nZXRfYXJndHlwZXMsCisgICAgICAoc2V0dGVyKUNGdW5jUHRyX3NldF9hcmd0eXBlcywKKyAgICAgICJzcGVjaWZ5IHRoZSBhcmd1bWVudCB0eXBlcyIsIE5VTEwgfSwKKyAgICB7IE5VTEwsIE5VTEwgfQogfTsKIAogI2lmZGVmIE1TX1dJTjMyCiBzdGF0aWMgUFBST0MgRmluZEFkZHJlc3Modm9pZCAqaGFuZGxlLCBjaGFyICpuYW1lLCBQeU9iamVjdCAqdHlwZSkKIHsKICNpZmRlZiBNU19XSU42NAotCS8qIHdpbjY0IGhhcyBubyBzdGRjYWxsIGNhbGxpbmcgY29udiwgc28gaXQgc2hvdWxkCi0JICAgYWxzbyBub3QgaGF2ZSB0aGUgbmFtZSBtYW5nbGluZyBvZiBpdC4KLQkqLwotCXJldHVybiAoUFBST0MpR2V0UHJvY0FkZHJlc3MoaGFuZGxlLCBuYW1lKTsKKyAgICAvKiB3aW42NCBoYXMgbm8gc3RkY2FsbCBjYWxsaW5nIGNvbnYsIHNvIGl0IHNob3VsZAorICAgICAgIGFsc28gbm90IGhhdmUgdGhlIG5hbWUgbWFuZ2xpbmcgb2YgaXQuCisgICAgKi8KKyAgICByZXR1cm4gKFBQUk9DKUdldFByb2NBZGRyZXNzKGhhbmRsZSwgbmFtZSk7CiAjZWxzZQotCVBQUk9DIGFkZHJlc3M7Ci0JY2hhciAqbWFuZ2xlZF9uYW1lOwotCWludCBpOwotCVN0Z0RpY3RPYmplY3QgKmRpY3Q7CisgICAgUFBST0MgYWRkcmVzczsKKyAgICBjaGFyICptYW5nbGVkX25hbWU7CisgICAgaW50IGk7CisgICAgU3RnRGljdE9iamVjdCAqZGljdDsKIAotCWFkZHJlc3MgPSAoUFBST0MpR2V0UHJvY0FkZHJlc3MoaGFuZGxlLCBuYW1lKTsKLQlpZiAoYWRkcmVzcykKLQkJcmV0dXJuIGFkZHJlc3M7Ci0JaWYgKCgoc2l6ZV90KW5hbWUgJiB+MHhGRkZGKSA9PSAwKSB7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBhZGRyZXNzID0gKFBQUk9DKUdldFByb2NBZGRyZXNzKGhhbmRsZSwgbmFtZSk7CisgICAgaWYgKGFkZHJlc3MpCisgICAgICAgIHJldHVybiBhZGRyZXNzOworICAgIGlmICgoKHNpemVfdCluYW1lICYgfjB4RkZGRikgPT0gMCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlkaWN0ID0gUHlUeXBlX3N0Z2RpY3QoKFB5T2JqZWN0ICopdHlwZSk7Ci0JLyogSXQgc2hvdWxkIG5vdCBoYXBwZW4gdGhhdCBkaWN0IGlzIE5VTEwsIGJ1dCBiZXR0ZXIgYmUgc2FmZSAqLwotCWlmIChkaWN0PT1OVUxMIHx8IGRpY3QtPmZsYWdzICYgRlVOQ0ZMQUdfQ0RFQ0wpCi0JCXJldHVybiBhZGRyZXNzOworICAgIGRpY3QgPSBQeVR5cGVfc3RnZGljdCgoUHlPYmplY3QgKil0eXBlKTsKKyAgICAvKiBJdCBzaG91bGQgbm90IGhhcHBlbiB0aGF0IGRpY3QgaXMgTlVMTCwgYnV0IGJldHRlciBiZSBzYWZlICovCisgICAgaWYgKGRpY3Q9PU5VTEwgfHwgZGljdC0+ZmxhZ3MgJiBGVU5DRkxBR19DREVDTCkKKyAgICAgICAgcmV0dXJuIGFkZHJlc3M7CiAKLQkvKiBmb3Igc3RkY2FsbCwgdHJ5IG1hbmdsZWQgbmFtZXM6Ci0JICAgZnVuY25hbWUgLT4gX2Z1bmNuYW1lQDxuPgotCSAgIHdoZXJlIG4gaXMgMCwgNCwgOCwgMTIsIC4uLiwgMTI4Ci0JICovCi0JbWFuZ2xlZF9uYW1lID0gYWxsb2NhKHN0cmxlbihuYW1lKSArIDEgKyAxICsgMSArIDMpOyAvKiBcMCBfIEAgJWQgKi8KLQlpZiAoIW1hbmdsZWRfbmFtZSkKLQkJcmV0dXJuIE5VTEw7Ci0JZm9yIChpID0gMDsgaSA8IDMyOyArK2kpIHsKLQkJc3ByaW50ZihtYW5nbGVkX25hbWUsICJfJXNAJWQiLCBuYW1lLCBpKjQpOwotCQlhZGRyZXNzID0gKFBQUk9DKUdldFByb2NBZGRyZXNzKGhhbmRsZSwgbWFuZ2xlZF9uYW1lKTsKLQkJaWYgKGFkZHJlc3MpCi0JCQlyZXR1cm4gYWRkcmVzczsKLQl9Ci0JcmV0dXJuIE5VTEw7CisgICAgLyogZm9yIHN0ZGNhbGwsIHRyeSBtYW5nbGVkIG5hbWVzOgorICAgICAgIGZ1bmNuYW1lIC0+IF9mdW5jbmFtZUA8bj4KKyAgICAgICB3aGVyZSBuIGlzIDAsIDQsIDgsIDEyLCAuLi4sIDEyOAorICAgICAqLworICAgIG1hbmdsZWRfbmFtZSA9IGFsbG9jYShzdHJsZW4obmFtZSkgKyAxICsgMSArIDEgKyAzKTsgLyogXDAgXyBAICVkICovCisgICAgaWYgKCFtYW5nbGVkX25hbWUpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGZvciAoaSA9IDA7IGkgPCAzMjsgKytpKSB7CisgICAgICAgIHNwcmludGYobWFuZ2xlZF9uYW1lLCAiXyVzQCVkIiwgbmFtZSwgaSo0KTsKKyAgICAgICAgYWRkcmVzcyA9IChQUFJPQylHZXRQcm9jQWRkcmVzcyhoYW5kbGUsIG1hbmdsZWRfbmFtZSk7CisgICAgICAgIGlmIChhZGRyZXNzKQorICAgICAgICAgICAgcmV0dXJuIGFkZHJlc3M7CisgICAgfQorICAgIHJldHVybiBOVUxMOwogI2VuZGlmCiB9CiAjZW5kaWYKQEAgLTMxMzAsMjIzICszMTMwLDIyMyBAQAogc3RhdGljIGludAogX2NoZWNrX291dGFyZ190eXBlKFB5T2JqZWN0ICphcmcsIFB5X3NzaXplX3QgaW5kZXgpCiB7Ci0JU3RnRGljdE9iamVjdCAqZGljdDsKKyAgICBTdGdEaWN0T2JqZWN0ICpkaWN0OwogCi0JaWYgKFBvaW50ZXJUeXBlT2JqZWN0X0NoZWNrKGFyZykpCi0JCXJldHVybiAxOworICAgIGlmIChQb2ludGVyVHlwZU9iamVjdF9DaGVjayhhcmcpKQorICAgICAgICByZXR1cm4gMTsKIAotCWlmIChBcnJheVR5cGVPYmplY3RfQ2hlY2soYXJnKSkKLQkJcmV0dXJuIDE7CisgICAgaWYgKEFycmF5VHlwZU9iamVjdF9DaGVjayhhcmcpKQorICAgICAgICByZXR1cm4gMTsKIAotCWRpY3QgPSBQeVR5cGVfc3RnZGljdChhcmcpOwotCWlmIChkaWN0Ci0JICAgIC8qIHNpbXBsZSBwb2ludGVyIHR5cGVzLCBjX3ZvaWRfcCwgY193Y2hhcl9wLCBCU1RSLCAuLi4gKi8KLQkgICAgJiYgUHlTdHJpbmdfQ2hlY2soZGljdC0+cHJvdG8pCisgICAgZGljdCA9IFB5VHlwZV9zdGdkaWN0KGFyZyk7CisgICAgaWYgKGRpY3QKKyAgICAgICAgLyogc2ltcGxlIHBvaW50ZXIgdHlwZXMsIGNfdm9pZF9wLCBjX3djaGFyX3AsIEJTVFIsIC4uLiAqLworICAgICAgICAmJiBQeVN0cmluZ19DaGVjayhkaWN0LT5wcm90bykKIC8qIFdlIG9ubHkgYWxsb3cgY192b2lkX3AsIGNfY2hhcl9wIGFuZCBjX3djaGFyX3AgYXMgYSBzaW1wbGUgb3V0cHV0IHBhcmFtZXRlciB0eXBlICovCi0JICAgICYmIChzdHJjaHIoIlB6WiIsIFB5U3RyaW5nX0FTX1NUUklORyhkaWN0LT5wcm90bylbMF0pKSkgewotCQlyZXR1cm4gMTsKLQl9CisgICAgICAgICYmIChzdHJjaHIoIlB6WiIsIFB5U3RyaW5nX0FTX1NUUklORyhkaWN0LT5wcm90bylbMF0pKSkgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9CiAKLQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkgICAgICInb3V0JyBwYXJhbWV0ZXIgJWQgbXVzdCBiZSBhIHBvaW50ZXIgdHlwZSwgbm90ICVzIiwKLQkJICAgICBQeV9TQUZFX0RPV05DQVNUKGluZGV4LCBQeV9zc2l6ZV90LCBpbnQpLAotCQkgICAgIFB5VHlwZV9DaGVjayhhcmcpID8KLQkJICAgICAoKFB5VHlwZU9iamVjdCAqKWFyZyktPnRwX25hbWUgOgotCQkgICAgIFB5X1RZUEUoYXJnKS0+dHBfbmFtZSk7Ci0JcmV0dXJuIDA7CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgIidvdXQnIHBhcmFtZXRlciAlZCBtdXN0IGJlIGEgcG9pbnRlciB0eXBlLCBub3QgJXMiLAorICAgICAgICAgICAgICAgICBQeV9TQUZFX0RPV05DQVNUKGluZGV4LCBQeV9zc2l6ZV90LCBpbnQpLAorICAgICAgICAgICAgICAgICBQeVR5cGVfQ2hlY2soYXJnKSA/CisgICAgICAgICAgICAgICAgICgoUHlUeXBlT2JqZWN0ICopYXJnKS0+dHBfbmFtZSA6CisgICAgICAgICAgICAgUHlfVFlQRShhcmcpLT50cF9uYW1lKTsKKyAgICByZXR1cm4gMDsKIH0KIAogLyogUmV0dXJucyAxIG9uIHN1Y2Nlc3MsIDAgb24gZXJyb3IgKi8KIHN0YXRpYyBpbnQKIF92YWxpZGF0ZV9wYXJhbWZsYWdzKFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKnBhcmFtZmxhZ3MpCiB7Ci0JUHlfc3NpemVfdCBpLCBsZW47Ci0JU3RnRGljdE9iamVjdCAqZGljdDsKLQlQeU9iamVjdCAqYXJndHlwZXM7CisgICAgUHlfc3NpemVfdCBpLCBsZW47CisgICAgU3RnRGljdE9iamVjdCAqZGljdDsKKyAgICBQeU9iamVjdCAqYXJndHlwZXM7CiAKLQlkaWN0ID0gUHlUeXBlX3N0Z2RpY3QoKFB5T2JqZWN0ICopdHlwZSk7Ci0JYXNzZXJ0KGRpY3QpOyAvKiBDYW5ub3QgYmUgTlVMTC4gJ3R5cGUnIGlzIGEgQ0Z1bmNQdHIgdHlwZS4gKi8KLQlhcmd0eXBlcyA9IGRpY3QtPmFyZ3R5cGVzOworICAgIGRpY3QgPSBQeVR5cGVfc3RnZGljdCgoUHlPYmplY3QgKil0eXBlKTsKKyAgICBhc3NlcnQoZGljdCk7IC8qIENhbm5vdCBiZSBOVUxMLiAndHlwZScgaXMgYSBDRnVuY1B0ciB0eXBlLiAqLworICAgIGFyZ3R5cGVzID0gZGljdC0+YXJndHlwZXM7CiAKLQlpZiAocGFyYW1mbGFncyA9PSBOVUxMIHx8IGRpY3QtPmFyZ3R5cGVzID09IE5VTEwpCi0JCXJldHVybiAxOworICAgIGlmIChwYXJhbWZsYWdzID09IE5VTEwgfHwgZGljdC0+YXJndHlwZXMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIDE7CiAKLQlpZiAoIVB5VHVwbGVfQ2hlY2socGFyYW1mbGFncykpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkicGFyYW1mbGFncyBtdXN0IGJlIGEgdHVwbGUgb3IgTm9uZSIpOwotCQlyZXR1cm4gMDsKLQl9CisgICAgaWYgKCFQeVR1cGxlX0NoZWNrKHBhcmFtZmxhZ3MpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAicGFyYW1mbGFncyBtdXN0IGJlIGEgdHVwbGUgb3IgTm9uZSIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLQlsZW4gPSBQeVR1cGxlX0dFVF9TSVpFKHBhcmFtZmxhZ3MpOwotCWlmIChsZW4gIT0gUHlUdXBsZV9HRVRfU0laRShkaWN0LT5hcmd0eXBlcykpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJInBhcmFtZmxhZ3MgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aCBhcyBhcmd0eXBlcyIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JCi0JZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKSB7Ci0JCVB5T2JqZWN0ICppdGVtID0gUHlUdXBsZV9HRVRfSVRFTShwYXJhbWZsYWdzLCBpKTsKLQkJaW50IGZsYWc7Ci0JCWNoYXIgKm5hbWU7Ci0JCVB5T2JqZWN0ICpkZWZ2YWw7Ci0JCVB5T2JqZWN0ICp0eXA7Ci0JCWlmICghUHlBcmdfUGFyc2VUdXBsZShpdGVtLCAiaXx6TyIsICZmbGFnLCAmbmFtZSwgJmRlZnZhbCkpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgICAgInBhcmFtZmxhZ3MgbXVzdCBiZSBhIHNlcXVlbmNlIG9mIChpbnQgWyxzdHJpbmcgWyx2YWx1ZV1dKSB0dXBsZXMiKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JCXR5cCA9IFB5VHVwbGVfR0VUX0lURU0oYXJndHlwZXMsIGkpOwotCQlzd2l0Y2ggKGZsYWcgJiAoUEFSQU1GTEFHX0ZJTiB8IFBBUkFNRkxBR19GT1VUIHwgUEFSQU1GTEFHX0ZMQ0lEKSkgewotCQljYXNlIDA6Ci0JCWNhc2UgUEFSQU1GTEFHX0ZJTjoKLQkJY2FzZSBQQVJBTUZMQUdfRklOIHwgUEFSQU1GTEFHX0ZMQ0lEOgotCQljYXNlIFBBUkFNRkxBR19GSU4gfCBQQVJBTUZMQUdfRk9VVDoKLQkJCWJyZWFrOwotCQljYXNlIFBBUkFNRkxBR19GT1VUOgotCQkJaWYgKCFfY2hlY2tfb3V0YXJnX3R5cGUodHlwLCBpKzEpKQotCQkJCXJldHVybiAwOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJCSAgICAgInBhcmFtZmxhZyB2YWx1ZSAlZCBub3Qgc3VwcG9ydGVkIiwKLQkJCQkgICAgIGZsYWcpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0JcmV0dXJuIDE7CisgICAgbGVuID0gUHlUdXBsZV9HRVRfU0laRShwYXJhbWZsYWdzKTsKKyAgICBpZiAobGVuICE9IFB5VHVwbGVfR0VUX1NJWkUoZGljdC0+YXJndHlwZXMpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInBhcmFtZmxhZ3MgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aCBhcyBhcmd0eXBlcyIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKKyAgICAgICAgUHlPYmplY3QgKml0ZW0gPSBQeVR1cGxlX0dFVF9JVEVNKHBhcmFtZmxhZ3MsIGkpOworICAgICAgICBpbnQgZmxhZzsKKyAgICAgICAgY2hhciAqbmFtZTsKKyAgICAgICAgUHlPYmplY3QgKmRlZnZhbDsKKyAgICAgICAgUHlPYmplY3QgKnR5cDsKKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGl0ZW0sICJpfHpPIiwgJmZsYWcsICZuYW1lLCAmZGVmdmFsKSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAicGFyYW1mbGFncyBtdXN0IGJlIGEgc2VxdWVuY2Ugb2YgKGludCBbLHN0cmluZyBbLHZhbHVlXV0pIHR1cGxlcyIpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgdHlwID0gUHlUdXBsZV9HRVRfSVRFTShhcmd0eXBlcywgaSk7CisgICAgICAgIHN3aXRjaCAoZmxhZyAmIChQQVJBTUZMQUdfRklOIHwgUEFSQU1GTEFHX0ZPVVQgfCBQQVJBTUZMQUdfRkxDSUQpKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgY2FzZSBQQVJBTUZMQUdfRklOOgorICAgICAgICBjYXNlIFBBUkFNRkxBR19GSU4gfCBQQVJBTUZMQUdfRkxDSUQ6CisgICAgICAgIGNhc2UgUEFSQU1GTEFHX0ZJTiB8IFBBUkFNRkxBR19GT1VUOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUEFSQU1GTEFHX0ZPVVQ6CisgICAgICAgICAgICBpZiAoIV9jaGVja19vdXRhcmdfdHlwZSh0eXAsIGkrMSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgInBhcmFtZmxhZyB2YWx1ZSAlZCBub3Qgc3VwcG9ydGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgaW50CiBfZ2V0X25hbWUoUHlPYmplY3QgKm9iaiwgY2hhciAqKnBuYW1lKQogewogI2lmZGVmIE1TX1dJTjMyCi0JaWYgKFB5SW50X0NoZWNrKG9iaikgfHwgUHlMb25nX0NoZWNrKG9iaikpIHsKLQkJLyogV2UgaGF2ZSB0byB1c2UgTUFLRUlOVFJFU09VUkNFQSBmb3IgV2luZG93cyBDRS4KLQkJICAgV29ya3Mgb24gV2luZG93cyBhcyB3ZWxsLCBvZiBjb3Vyc2UuCi0JCSovCi0JCSpwbmFtZSA9IE1BS0VJTlRSRVNPVVJDRUEoUHlJbnRfQXNVbnNpZ25lZExvbmdNYXNrKG9iaikgJiAweEZGRkYpOwotCQlyZXR1cm4gMTsKLQl9CisgICAgaWYgKFB5SW50X0NoZWNrKG9iaikgfHwgUHlMb25nX0NoZWNrKG9iaikpIHsKKyAgICAgICAgLyogV2UgaGF2ZSB0byB1c2UgTUFLRUlOVFJFU09VUkNFQSBmb3IgV2luZG93cyBDRS4KKyAgICAgICAgICAgV29ya3Mgb24gV2luZG93cyBhcyB3ZWxsLCBvZiBjb3Vyc2UuCisgICAgICAgICovCisgICAgICAgICpwbmFtZSA9IE1BS0VJTlRSRVNPVVJDRUEoUHlJbnRfQXNVbnNpZ25lZExvbmdNYXNrKG9iaikgJiAweEZGRkYpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CiAjZW5kaWYKLQlpZiAoUHlTdHJpbmdfQ2hlY2sob2JqKSB8fCBQeVVuaWNvZGVfQ2hlY2sob2JqKSkgewotCQkqcG5hbWUgPSBQeVN0cmluZ19Bc1N0cmluZyhvYmopOwotCQlyZXR1cm4gKnBuYW1lID8gMSA6IDA7Ci0JfQotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkiZnVuY3Rpb24gbmFtZSBtdXN0IGJlIHN0cmluZyBvciBpbnRlZ2VyIik7Ci0JcmV0dXJuIDA7CisgICAgaWYgKFB5U3RyaW5nX0NoZWNrKG9iaikgfHwgUHlVbmljb2RlX0NoZWNrKG9iaikpIHsKKyAgICAgICAgKnBuYW1lID0gUHlTdHJpbmdfQXNTdHJpbmcob2JqKTsKKyAgICAgICAgcmV0dXJuICpwbmFtZSA/IDEgOiAwOworICAgIH0KKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAiZnVuY3Rpb24gbmFtZSBtdXN0IGJlIHN0cmluZyBvciBpbnRlZ2VyIik7CisgICAgcmV0dXJuIDA7CiB9CiAKIAogc3RhdGljIFB5T2JqZWN0ICoKIENGdW5jUHRyX0Zyb21EbGwoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JY2hhciAqbmFtZTsKLQlpbnQgKCogYWRkcmVzcykodm9pZCk7Ci0JUHlPYmplY3QgKmRsbDsKLQlQeU9iamVjdCAqb2JqOwotCUNGdW5jUHRyT2JqZWN0ICpzZWxmOwotCXZvaWQgKmhhbmRsZTsKLQlQeU9iamVjdCAqcGFyYW1mbGFncyA9IE5VTEw7CisgICAgY2hhciAqbmFtZTsKKyAgICBpbnQgKCogYWRkcmVzcykodm9pZCk7CisgICAgUHlPYmplY3QgKmRsbDsKKyAgICBQeU9iamVjdCAqb2JqOworICAgIENGdW5jUHRyT2JqZWN0ICpzZWxmOworICAgIHZvaWQgKmhhbmRsZTsKKyAgICBQeU9iamVjdCAqcGFyYW1mbGFncyA9IE5VTEw7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIihPJk8pfE8iLCBfZ2V0X25hbWUsICZuYW1lLCAmZGxsLCAmcGFyYW1mbGFncykpCi0JCXJldHVybiBOVUxMOwotCWlmIChwYXJhbWZsYWdzID09IFB5X05vbmUpCi0JCXBhcmFtZmxhZ3MgPSBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiKE8mTyl8TyIsIF9nZXRfbmFtZSwgJm5hbWUsICZkbGwsICZwYXJhbWZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKHBhcmFtZmxhZ3MgPT0gUHlfTm9uZSkKKyAgICAgICAgcGFyYW1mbGFncyA9IE5VTEw7CiAKLQlvYmogPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKGRsbCwgIl9oYW5kbGUiKTsKLQlpZiAoIW9iaikKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFQeUludF9DaGVjayhvYmopICYmICFQeUxvbmdfQ2hlY2sob2JqKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJ0aGUgX2hhbmRsZSBhdHRyaWJ1dGUgb2YgdGhlIHNlY29uZCBhcmd1bWVudCBtdXN0IGJlIGFuIGludGVnZXIiKTsKLQkJUHlfREVDUkVGKG9iaik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQloYW5kbGUgPSAodm9pZCAqKVB5TG9uZ19Bc1ZvaWRQdHIob2JqKTsKLQlQeV9ERUNSRUYob2JqKTsKLQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkiY291bGQgbm90IGNvbnZlcnQgdGhlIF9oYW5kbGUgYXR0cmlidXRlIHRvIGEgcG9pbnRlciIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgb2JqID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhkbGwsICJfaGFuZGxlIik7CisgICAgaWYgKCFvYmopCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHlJbnRfQ2hlY2sob2JqKSAmJiAhUHlMb25nX0NoZWNrKG9iaikpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0aGUgX2hhbmRsZSBhdHRyaWJ1dGUgb2YgdGhlIHNlY29uZCBhcmd1bWVudCBtdXN0IGJlIGFuIGludGVnZXIiKTsKKyAgICAgICAgUHlfREVDUkVGKG9iaik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBoYW5kbGUgPSAodm9pZCAqKVB5TG9uZ19Bc1ZvaWRQdHIob2JqKTsKKyAgICBQeV9ERUNSRUYob2JqKTsKKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjb3VsZCBub3QgY29udmVydCB0aGUgX2hhbmRsZSBhdHRyaWJ1dGUgdG8gYSBwb2ludGVyIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAogI2lmZGVmIE1TX1dJTjMyCi0JYWRkcmVzcyA9IEZpbmRBZGRyZXNzKGhhbmRsZSwgbmFtZSwgKFB5T2JqZWN0ICopdHlwZSk7Ci0JaWYgKCFhZGRyZXNzKSB7Ci0JCWlmICghSVNfSU5UUkVTT1VSQ0UobmFtZSkpCi0JCQlQeUVycl9Gb3JtYXQoUHlFeGNfQXR0cmlidXRlRXJyb3IsCi0JCQkJICAgICAiZnVuY3Rpb24gJyVzJyBub3QgZm91bmQiLAotCQkJCSAgICAgbmFtZSk7Ci0JCWVsc2UKLQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19BdHRyaWJ1dGVFcnJvciwKLQkJCQkgICAgICJmdW5jdGlvbiBvcmRpbmFsICVkIG5vdCBmb3VuZCIsCi0JCQkJICAgICAoV09SRCkoc2l6ZV90KW5hbWUpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgYWRkcmVzcyA9IEZpbmRBZGRyZXNzKGhhbmRsZSwgbmFtZSwgKFB5T2JqZWN0ICopdHlwZSk7CisgICAgaWYgKCFhZGRyZXNzKSB7CisgICAgICAgIGlmICghSVNfSU5UUkVTT1VSQ0UobmFtZSkpCisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfQXR0cmlidXRlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgImZ1bmN0aW9uICclcycgbm90IGZvdW5kIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX0F0dHJpYnV0ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICJmdW5jdGlvbiBvcmRpbmFsICVkIG5vdCBmb3VuZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgKFdPUkQpKHNpemVfdCluYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogI2Vsc2UKLQlhZGRyZXNzID0gKFBQUk9DKWN0eXBlc19kbHN5bShoYW5kbGUsIG5hbWUpOwotCWlmICghYWRkcmVzcykgeworICAgIGFkZHJlc3MgPSAoUFBST0MpY3R5cGVzX2Rsc3ltKGhhbmRsZSwgbmFtZSk7CisgICAgaWYgKCFhZGRyZXNzKSB7CiAjaWZkZWYgX19DWUdXSU5fXwogLyogZGxlcnJvcigpIGlzbid0IHZlcnkgaGVscGZ1bCBvbiBjeWd3aW4gKi8KLQkJUHlFcnJfRm9ybWF0KFB5RXhjX0F0dHJpYnV0ZUVycm9yLAotCQkJICAgICAiZnVuY3Rpb24gJyVzJyBub3QgZm91bmQgKCVzKSAiLAotCQkJICAgICBuYW1lKTsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX0F0dHJpYnV0ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgImZ1bmN0aW9uICclcycgbm90IGZvdW5kICglcykgIiwKKyAgICAgICAgICAgICAgICAgICAgIG5hbWUpOwogI2Vsc2UKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0F0dHJpYnV0ZUVycm9yLCBjdHlwZXNfZGxlcnJvcigpKTsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0F0dHJpYnV0ZUVycm9yLCBjdHlwZXNfZGxlcnJvcigpKTsKICNlbmRpZgotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KICNlbmRpZgotCWlmICghX3ZhbGlkYXRlX3BhcmFtZmxhZ3ModHlwZSwgcGFyYW1mbGFncykpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghX3ZhbGlkYXRlX3BhcmFtZmxhZ3ModHlwZSwgcGFyYW1mbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0Jc2VsZiA9IChDRnVuY1B0ck9iamVjdCAqKUdlbmVyaWNDRGF0YV9uZXcodHlwZSwgYXJncywga3dkcyk7Ci0JaWYgKCFzZWxmKQotCQlyZXR1cm4gTlVMTDsKKyAgICBzZWxmID0gKENGdW5jUHRyT2JqZWN0ICopR2VuZXJpY0NEYXRhX25ldyh0eXBlLCBhcmdzLCBrd2RzKTsKKyAgICBpZiAoIXNlbGYpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JUHlfWElOQ1JFRihwYXJhbWZsYWdzKTsKLQlzZWxmLT5wYXJhbWZsYWdzID0gcGFyYW1mbGFnczsKKyAgICBQeV9YSU5DUkVGKHBhcmFtZmxhZ3MpOworICAgIHNlbGYtPnBhcmFtZmxhZ3MgPSBwYXJhbWZsYWdzOwogCi0JKih2b2lkICoqKXNlbGYtPmJfcHRyID0gYWRkcmVzczsKKyAgICAqKHZvaWQgKiopc2VsZi0+Yl9wdHIgPSBhZGRyZXNzOwogCi0JUHlfSU5DUkVGKChQeU9iamVjdCAqKWRsbCk7IC8qIGZvciBLZWVwUmVmICovCi0JaWYgKC0xID09IEtlZXBSZWYoKENEYXRhT2JqZWN0ICopc2VsZiwgMCwgZGxsKSkgewotCQlQeV9ERUNSRUYoKFB5T2JqZWN0ICopc2VsZik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBQeV9JTkNSRUYoKFB5T2JqZWN0ICopZGxsKTsgLyogZm9yIEtlZXBSZWYgKi8KKyAgICBpZiAoLTEgPT0gS2VlcFJlZigoQ0RhdGFPYmplY3QgKilzZWxmLCAwLCBkbGwpKSB7CisgICAgICAgIFB5X0RFQ1JFRigoUHlPYmplY3QgKilzZWxmKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JUHlfSU5DUkVGKHNlbGYpOwotCXNlbGYtPmNhbGxhYmxlID0gKFB5T2JqZWN0ICopc2VsZjsKLQlyZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKKyAgICBQeV9JTkNSRUYoc2VsZik7CisgICAgc2VsZi0+Y2FsbGFibGUgPSAoUHlPYmplY3QgKilzZWxmOworICAgIHJldHVybiAoUHlPYmplY3QgKilzZWxmOwogfQogCiAjaWZkZWYgTVNfV0lOMzIKIHN0YXRpYyBQeU9iamVjdCAqCiBDRnVuY1B0cl9Gcm9tVnRibEluZGV4KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCUNGdW5jUHRyT2JqZWN0ICpzZWxmOwotCWludCBpbmRleDsKLQljaGFyICpuYW1lID0gTlVMTDsKLQlQeU9iamVjdCAqcGFyYW1mbGFncyA9IE5VTEw7Ci0JR1VJRCAqaWlkID0gTlVMTDsKLQlQeV9zc2l6ZV90IGlpZF9sZW4gPSAwOworICAgIENGdW5jUHRyT2JqZWN0ICpzZWxmOworICAgIGludCBpbmRleDsKKyAgICBjaGFyICpuYW1lID0gTlVMTDsKKyAgICBQeU9iamVjdCAqcGFyYW1mbGFncyA9IE5VTEw7CisgICAgR1VJRCAqaWlkID0gTlVMTDsKKyAgICBQeV9zc2l6ZV90IGlpZF9sZW4gPSAwOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpc3xPeiMiLCAmaW5kZXgsICZuYW1lLCAmcGFyYW1mbGFncywgJmlpZCwgJmlpZF9sZW4pKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAocGFyYW1mbGFncyA9PSBQeV9Ob25lKQotCQlwYXJhbWZsYWdzID0gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlzfE96IyIsICZpbmRleCwgJm5hbWUsICZwYXJhbWZsYWdzLCAmaWlkLCAmaWlkX2xlbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChwYXJhbWZsYWdzID09IFB5X05vbmUpCisgICAgICAgIHBhcmFtZmxhZ3MgPSBOVUxMOwogCi0JaWYgKCFfdmFsaWRhdGVfcGFyYW1mbGFncyh0eXBlLCBwYXJhbWZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFfdmFsaWRhdGVfcGFyYW1mbGFncyh0eXBlLCBwYXJhbWZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlzZWxmID0gKENGdW5jUHRyT2JqZWN0ICopR2VuZXJpY0NEYXRhX25ldyh0eXBlLCBhcmdzLCBrd2RzKTsKLQlzZWxmLT5pbmRleCA9IGluZGV4ICsgMHgxMDAwOwotCVB5X1hJTkNSRUYocGFyYW1mbGFncyk7Ci0Jc2VsZi0+cGFyYW1mbGFncyA9IHBhcmFtZmxhZ3M7Ci0JaWYgKGlpZF9sZW4gPT0gc2l6ZW9mKEdVSUQpKQotCQlzZWxmLT5paWQgPSBpaWQ7Ci0JcmV0dXJuIChQeU9iamVjdCAqKXNlbGY7CisgICAgc2VsZiA9IChDRnVuY1B0ck9iamVjdCAqKUdlbmVyaWNDRGF0YV9uZXcodHlwZSwgYXJncywga3dkcyk7CisgICAgc2VsZi0+aW5kZXggPSBpbmRleCArIDB4MTAwMDsKKyAgICBQeV9YSU5DUkVGKHBhcmFtZmxhZ3MpOworICAgIHNlbGYtPnBhcmFtZmxhZ3MgPSBwYXJhbWZsYWdzOworICAgIGlmIChpaWRfbGVuID09IHNpemVvZihHVUlEKSkKKyAgICAgICAgc2VsZi0+aWlkID0gaWlkOworICAgIHJldHVybiAoUHlPYmplY3QgKilzZWxmOwogfQogI2VuZGlmCiAKQEAgLTMzNjYsOTEgKzMzNjYsOTEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBDRnVuY1B0cl9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JQ0Z1bmNQdHJPYmplY3QgKnNlbGY7Ci0JUHlPYmplY3QgKmNhbGxhYmxlOwotCVN0Z0RpY3RPYmplY3QgKmRpY3Q7Ci0JQ1RodW5rT2JqZWN0ICp0aHVuazsKKyAgICBDRnVuY1B0ck9iamVjdCAqc2VsZjsKKyAgICBQeU9iamVjdCAqY2FsbGFibGU7CisgICAgU3RnRGljdE9iamVjdCAqZGljdDsKKyAgICBDVGh1bmtPYmplY3QgKnRodW5rOwogCi0JaWYgKFB5VHVwbGVfR0VUX1NJWkUoYXJncykgPT0gMCkKLQkJcmV0dXJuIEdlbmVyaWNDRGF0YV9uZXcodHlwZSwgYXJncywga3dkcyk7CisgICAgaWYgKFB5VHVwbGVfR0VUX1NJWkUoYXJncykgPT0gMCkKKyAgICAgICAgcmV0dXJuIEdlbmVyaWNDRGF0YV9uZXcodHlwZSwgYXJncywga3dkcyk7CiAKLQlpZiAoMSA8PSBQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpICYmIFB5VHVwbGVfQ2hlY2soUHlUdXBsZV9HRVRfSVRFTShhcmdzLCAwKSkpCi0JCXJldHVybiBDRnVuY1B0cl9Gcm9tRGxsKHR5cGUsIGFyZ3MsIGt3ZHMpOworICAgIGlmICgxIDw9IFB5VHVwbGVfR0VUX1NJWkUoYXJncykgJiYgUHlUdXBsZV9DaGVjayhQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDApKSkKKyAgICAgICAgcmV0dXJuIENGdW5jUHRyX0Zyb21EbGwodHlwZSwgYXJncywga3dkcyk7CiAKICNpZmRlZiBNU19XSU4zMgotCWlmICgyIDw9IFB5VHVwbGVfR0VUX1NJWkUoYXJncykgJiYgUHlJbnRfQ2hlY2soUHlUdXBsZV9HRVRfSVRFTShhcmdzLCAwKSkpCi0JCXJldHVybiBDRnVuY1B0cl9Gcm9tVnRibEluZGV4KHR5cGUsIGFyZ3MsIGt3ZHMpOworICAgIGlmICgyIDw9IFB5VHVwbGVfR0VUX1NJWkUoYXJncykgJiYgUHlJbnRfQ2hlY2soUHlUdXBsZV9HRVRfSVRFTShhcmdzLCAwKSkpCisgICAgICAgIHJldHVybiBDRnVuY1B0cl9Gcm9tVnRibEluZGV4KHR5cGUsIGFyZ3MsIGt3ZHMpOwogI2VuZGlmCiAKLQlpZiAoMSA9PSBQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpCi0JICAgICYmIChQeUludF9DaGVjayhQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDApKQotCQl8fCBQeUxvbmdfQ2hlY2soUHlUdXBsZV9HRVRfSVRFTShhcmdzLCAwKSkpKSB7Ci0JCUNEYXRhT2JqZWN0ICpvYjsKLQkJdm9pZCAqcHRyID0gUHlMb25nX0FzVm9pZFB0cihQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDApKTsKLQkJaWYgKHB0ciA9PSBOVUxMICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCQlyZXR1cm4gTlVMTDsKLQkJb2IgPSAoQ0RhdGFPYmplY3QgKilHZW5lcmljQ0RhdGFfbmV3KHR5cGUsIGFyZ3MsIGt3ZHMpOwotCQlpZiAob2IgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQkqKHZvaWQgKiopb2ItPmJfcHRyID0gcHRyOwotCQlyZXR1cm4gKFB5T2JqZWN0ICopb2I7Ci0JfQorICAgIGlmICgxID09IFB5VHVwbGVfR0VUX1NJWkUoYXJncykKKyAgICAgICAgJiYgKFB5SW50X0NoZWNrKFB5VHVwbGVfR0VUX0lURU0oYXJncywgMCkpCisgICAgICAgIHx8IFB5TG9uZ19DaGVjayhQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDApKSkpIHsKKyAgICAgICAgQ0RhdGFPYmplY3QgKm9iOworICAgICAgICB2b2lkICpwdHIgPSBQeUxvbmdfQXNWb2lkUHRyKFB5VHVwbGVfR0VUX0lURU0oYXJncywgMCkpOworICAgICAgICBpZiAocHRyID09IE5VTEwgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBvYiA9IChDRGF0YU9iamVjdCAqKUdlbmVyaWNDRGF0YV9uZXcodHlwZSwgYXJncywga3dkcyk7CisgICAgICAgIGlmIChvYiA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICoodm9pZCAqKilvYi0+Yl9wdHIgPSBwdHI7CisgICAgICAgIHJldHVybiAoUHlPYmplY3QgKilvYjsKKyAgICB9CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8iLCAmY2FsbGFibGUpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIVB5Q2FsbGFibGVfQ2hlY2soY2FsbGFibGUpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJImFyZ3VtZW50IG11c3QgYmUgY2FsbGFibGUgb3IgaW50ZWdlciBmdW5jdGlvbiBhZGRyZXNzIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8iLCAmY2FsbGFibGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5Q2FsbGFibGVfQ2hlY2soY2FsbGFibGUpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiYXJndW1lbnQgbXVzdCBiZSBjYWxsYWJsZSBvciBpbnRlZ2VyIGZ1bmN0aW9uIGFkZHJlc3MiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JLyogWFhYIFhYWCBUaGlzIHdvdWxkIGFsbG93IHRvIHBhc3MgYWRkaXRpb25hbCBvcHRpb25zLiAgRm9yIENPTQotCSAgIG1ldGhvZCAqaW1wbGVtZW50YXRpb25zKiwgd2Ugd291bGQgcHJvYmFibHkgd2FudCBkaWZmZXJlbnQKLQkgICBiZWhhdmlvdXIgdGhhbiBpbiAnbm9ybWFsJyBjYWxsYmFjayBmdW5jdGlvbnM6IHJldHVybiBhIEhSRVNVTFQgaWYKLQkgICBhbiBleGNlcHRpb24gb2NjdXJycyBpbiB0aGUgY2FsbGJhY2ssIGFuZCBwcmludCB0aGUgdHJhY2ViYWNrIG5vdAotCSAgIG9ubHkgb24gdGhlIGNvbnNvbGUsIGJ1dCBhbHNvIHRvIE91dHB1dERlYnVnU3RyaW5nKCkgb3Igc29tZXRoaW5nCi0JICAgbGlrZSB0aGF0LgotCSovCisgICAgLyogWFhYIFhYWCBUaGlzIHdvdWxkIGFsbG93IHRvIHBhc3MgYWRkaXRpb25hbCBvcHRpb25zLiAgRm9yIENPTQorICAgICAgIG1ldGhvZCAqaW1wbGVtZW50YXRpb25zKiwgd2Ugd291bGQgcHJvYmFibHkgd2FudCBkaWZmZXJlbnQKKyAgICAgICBiZWhhdmlvdXIgdGhhbiBpbiAnbm9ybWFsJyBjYWxsYmFjayBmdW5jdGlvbnM6IHJldHVybiBhIEhSRVNVTFQgaWYKKyAgICAgICBhbiBleGNlcHRpb24gb2NjdXJycyBpbiB0aGUgY2FsbGJhY2ssIGFuZCBwcmludCB0aGUgdHJhY2ViYWNrIG5vdAorICAgICAgIG9ubHkgb24gdGhlIGNvbnNvbGUsIGJ1dCBhbHNvIHRvIE91dHB1dERlYnVnU3RyaW5nKCkgb3Igc29tZXRoaW5nCisgICAgICAgbGlrZSB0aGF0LgorICAgICovCiAvKgotCWlmIChrd2RzICYmIFB5RGljdF9HZXRJdGVtU3RyaW5nKGt3ZHMsICJvcHRpb25zIikpIHsKLQkJLi4uCi0JfQorICAgIGlmIChrd2RzICYmIFB5RGljdF9HZXRJdGVtU3RyaW5nKGt3ZHMsICJvcHRpb25zIikpIHsKKyAgICAgICAgLi4uCisgICAgfQogKi8KIAotCWRpY3QgPSBQeVR5cGVfc3RnZGljdCgoUHlPYmplY3QgKil0eXBlKTsKLQkvKiBYWFhYIEZhaWxzIGlmIHdlIGRvOiAnQ0Z1bmNQdHIobGFtYmRhIHg6IHgpJyAqLwotCWlmICghZGljdCB8fCAhZGljdC0+YXJndHlwZXMpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJICAgICAgICJjYW5ub3QgY29uc3RydWN0IGluc3RhbmNlIG9mIHRoaXMgY2xhc3M6IgotCQkJIiBubyBhcmd0eXBlcyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgZGljdCA9IFB5VHlwZV9zdGdkaWN0KChQeU9iamVjdCAqKXR5cGUpOworICAgIC8qIFhYWFggRmFpbHMgaWYgd2UgZG86ICdDRnVuY1B0cihsYW1iZGEgeDogeCknICovCisgICAgaWYgKCFkaWN0IHx8ICFkaWN0LT5hcmd0eXBlcykgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgImNhbm5vdCBjb25zdHJ1Y3QgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzczoiCisgICAgICAgICAgICAiIG5vIGFyZ3R5cGVzIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXRodW5rID0gQWxsb2NGdW5jdGlvbkNhbGxiYWNrKGNhbGxhYmxlLAotCQkJCSAgICAgIGRpY3QtPmFyZ3R5cGVzLAotCQkJCSAgICAgIGRpY3QtPnJlc3R5cGUsCi0JCQkJICAgICAgZGljdC0+ZmxhZ3MpOwotCWlmICghdGh1bmspCi0JCXJldHVybiBOVUxMOworICAgIHRodW5rID0gQWxsb2NGdW5jdGlvbkNhbGxiYWNrKGNhbGxhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpY3QtPmFyZ3R5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpY3QtPnJlc3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGljdC0+ZmxhZ3MpOworICAgIGlmICghdGh1bmspCisgICAgICAgIHJldHVybiBOVUxMOwogCi0Jc2VsZiA9IChDRnVuY1B0ck9iamVjdCAqKUdlbmVyaWNDRGF0YV9uZXcodHlwZSwgYXJncywga3dkcyk7Ci0JaWYgKHNlbGYgPT0gTlVMTCkgewotCQlQeV9ERUNSRUYodGh1bmspOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgc2VsZiA9IChDRnVuY1B0ck9iamVjdCAqKUdlbmVyaWNDRGF0YV9uZXcodHlwZSwgYXJncywga3dkcyk7CisgICAgaWYgKHNlbGYgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYodGh1bmspOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlQeV9JTkNSRUYoY2FsbGFibGUpOwotCXNlbGYtPmNhbGxhYmxlID0gY2FsbGFibGU7CisgICAgUHlfSU5DUkVGKGNhbGxhYmxlKTsKKyAgICBzZWxmLT5jYWxsYWJsZSA9IGNhbGxhYmxlOwogCi0Jc2VsZi0+dGh1bmsgPSB0aHVuazsKLQkqKHZvaWQgKiopc2VsZi0+Yl9wdHIgPSAodm9pZCAqKXRodW5rLT5wY2w7Ci0JCi0JUHlfSU5DUkVGKChQeU9iamVjdCAqKXRodW5rKTsgLyogZm9yIEtlZXBSZWYgKi8KLQlpZiAoLTEgPT0gS2VlcFJlZigoQ0RhdGFPYmplY3QgKilzZWxmLCAwLCAoUHlPYmplY3QgKil0aHVuaykpIHsKLQkJUHlfREVDUkVGKChQeU9iamVjdCAqKXNlbGYpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIChQeU9iamVjdCAqKXNlbGY7CisgICAgc2VsZi0+dGh1bmsgPSB0aHVuazsKKyAgICAqKHZvaWQgKiopc2VsZi0+Yl9wdHIgPSAodm9pZCAqKXRodW5rLT5wY2w7CisKKyAgICBQeV9JTkNSRUYoKFB5T2JqZWN0ICopdGh1bmspOyAvKiBmb3IgS2VlcFJlZiAqLworICAgIGlmICgtMSA9PSBLZWVwUmVmKChDRGF0YU9iamVjdCAqKXNlbGYsIDAsIChQeU9iamVjdCAqKXRodW5rKSkgeworICAgICAgICBQeV9ERUNSRUYoKFB5T2JqZWN0ICopc2VsZik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKIH0KIAogCkBAIC0zNDYwLDU0ICszNDYwLDU0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogX2J5cmVmKFB5T2JqZWN0ICpvYmopCiB7Ci0JUHlDQXJnT2JqZWN0ICpwYXJnOwotCWlmICghQ0RhdGFPYmplY3RfQ2hlY2sob2JqKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJleHBlY3RlZCBDRGF0YSBpbnN0YW5jZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgUHlDQXJnT2JqZWN0ICpwYXJnOworICAgIGlmICghQ0RhdGFPYmplY3RfQ2hlY2sob2JqKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIENEYXRhIGluc3RhbmNlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXBhcmcgPSBuZXdfQ0FyZ09iamVjdCgpOwotCWlmIChwYXJnID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKG9iaik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBwYXJnID0gbmV3X0NBcmdPYmplY3QoKTsKKyAgICBpZiAocGFyZyA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihvYmopOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlwYXJnLT50YWcgPSAnUCc7Ci0JcGFyZy0+cGZmaV90eXBlID0gJmZmaV90eXBlX3BvaW50ZXI7Ci0JcGFyZy0+b2JqID0gb2JqOwotCXBhcmctPnZhbHVlLnAgPSAoKENEYXRhT2JqZWN0ICopb2JqKS0+Yl9wdHI7Ci0JcmV0dXJuIChQeU9iamVjdCAqKXBhcmc7CisgICAgcGFyZy0+dGFnID0gJ1AnOworICAgIHBhcmctPnBmZmlfdHlwZSA9ICZmZmlfdHlwZV9wb2ludGVyOworICAgIHBhcmctPm9iaiA9IG9iajsKKyAgICBwYXJnLT52YWx1ZS5wID0gKChDRGF0YU9iamVjdCAqKW9iaiktPmJfcHRyOworICAgIHJldHVybiAoUHlPYmplY3QgKilwYXJnOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogX2dldF9hcmcoaW50ICpwaW5kZXgsIGNoYXIgKm5hbWUsIFB5T2JqZWN0ICpkZWZ2YWwsIFB5T2JqZWN0ICppbmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCVB5T2JqZWN0ICp2OworICAgIFB5T2JqZWN0ICp2OwogCi0JaWYgKCpwaW5kZXggPCBQeVR1cGxlX0dFVF9TSVpFKGluYXJncykpIHsKLQkJdiA9IFB5VHVwbGVfR0VUX0lURU0oaW5hcmdzLCAqcGluZGV4KTsKLQkJKysqcGluZGV4OwotCQlQeV9JTkNSRUYodik7Ci0JCXJldHVybiB2OwotCX0KLQlpZiAoa3dkcyAmJiAodiA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKGt3ZHMsIG5hbWUpKSkgewotCQkrKypwaW5kZXg7Ci0JCVB5X0lOQ1JFRih2KTsKLQkJcmV0dXJuIHY7Ci0JfQotCWlmIChkZWZ2YWwpIHsKLQkJUHlfSU5DUkVGKGRlZnZhbCk7Ci0JCXJldHVybiBkZWZ2YWw7Ci0JfQotCS8qIHdlIGNhbid0IGN1cnJlbnRseSBlbWl0IGEgYmV0dGVyIGVycm9yIG1lc3NhZ2UgKi8KLQlpZiAobmFtZSkKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAgInJlcXVpcmVkIGFyZ3VtZW50ICclcycgbWlzc2luZyIsIG5hbWUpOwotCWVsc2UKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAgIm5vdCBlbm91Z2ggYXJndW1lbnRzIik7Ci0JcmV0dXJuIE5VTEw7CisgICAgaWYgKCpwaW5kZXggPCBQeVR1cGxlX0dFVF9TSVpFKGluYXJncykpIHsKKyAgICAgICAgdiA9IFB5VHVwbGVfR0VUX0lURU0oaW5hcmdzLCAqcGluZGV4KTsKKyAgICAgICAgKysqcGluZGV4OworICAgICAgICBQeV9JTkNSRUYodik7CisgICAgICAgIHJldHVybiB2OworICAgIH0KKyAgICBpZiAoa3dkcyAmJiAodiA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKGt3ZHMsIG5hbWUpKSkgeworICAgICAgICArKypwaW5kZXg7CisgICAgICAgIFB5X0lOQ1JFRih2KTsKKyAgICAgICAgcmV0dXJuIHY7CisgICAgfQorICAgIGlmIChkZWZ2YWwpIHsKKyAgICAgICAgUHlfSU5DUkVGKGRlZnZhbCk7CisgICAgICAgIHJldHVybiBkZWZ2YWw7CisgICAgfQorICAgIC8qIHdlIGNhbid0IGN1cnJlbnRseSBlbWl0IGEgYmV0dGVyIGVycm9yIG1lc3NhZ2UgKi8KKyAgICBpZiAobmFtZSkKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJyZXF1aXJlZCBhcmd1bWVudCAnJXMnIG1pc3NpbmciLCBuYW1lKTsKKyAgICBlbHNlCisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAibm90IGVub3VnaCBhcmd1bWVudHMiKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogLyoKQEAgLTM1MzAsMTcwICszNTMwLDE3MCBAQAogKi8KIHN0YXRpYyBQeU9iamVjdCAqCiBfYnVpbGRfY2FsbGFyZ3MoQ0Z1bmNQdHJPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmd0eXBlcywKLQkJUHlPYmplY3QgKmluYXJncywgUHlPYmplY3QgKmt3ZHMsCi0JCWludCAqcG91dG1hc2ssIGludCAqcGlub3V0bWFzaywgdW5zaWduZWQgaW50ICpwbnVtcmV0dmFscykKKyAgICAgICAgICAgICAgICBQeU9iamVjdCAqaW5hcmdzLCBQeU9iamVjdCAqa3dkcywKKyAgICAgICAgICAgICAgICBpbnQgKnBvdXRtYXNrLCBpbnQgKnBpbm91dG1hc2ssIHVuc2lnbmVkIGludCAqcG51bXJldHZhbHMpCiB7Ci0JUHlPYmplY3QgKnBhcmFtZmxhZ3MgPSBzZWxmLT5wYXJhbWZsYWdzOwotCVB5T2JqZWN0ICpjYWxsYXJnczsKLQlTdGdEaWN0T2JqZWN0ICpkaWN0OwotCVB5X3NzaXplX3QgaSwgbGVuOwotCWludCBpbmFyZ3NfaW5kZXggPSAwOwotCS8qIEl0J3MgYSBsaXR0bGUgYml0IGRpZmZpY3VsdCB0byBkZXRlcm1pbmUgaG93IG1hbnkgYXJndW1lbnRzIHRoZQotCWZ1bmN0aW9uIGNhbGwgcmVxdWlyZXMvYWNjZXB0cy4gIEZvciBzaW1wbGljaXR5LCB3ZSBjb3VudCB0aGUgY29uc3VtZWQKLQlhcmdzIGFuZCBjb21wYXJlIHRoaXMgdG8gdGhlIG51bWJlciBvZiBzdXBwbGllZCBhcmdzLiAqLwotCVB5X3NzaXplX3QgYWN0dWFsX2FyZ3M7CisgICAgUHlPYmplY3QgKnBhcmFtZmxhZ3MgPSBzZWxmLT5wYXJhbWZsYWdzOworICAgIFB5T2JqZWN0ICpjYWxsYXJnczsKKyAgICBTdGdEaWN0T2JqZWN0ICpkaWN0OworICAgIFB5X3NzaXplX3QgaSwgbGVuOworICAgIGludCBpbmFyZ3NfaW5kZXggPSAwOworICAgIC8qIEl0J3MgYSBsaXR0bGUgYml0IGRpZmZpY3VsdCB0byBkZXRlcm1pbmUgaG93IG1hbnkgYXJndW1lbnRzIHRoZQorICAgIGZ1bmN0aW9uIGNhbGwgcmVxdWlyZXMvYWNjZXB0cy4gIEZvciBzaW1wbGljaXR5LCB3ZSBjb3VudCB0aGUgY29uc3VtZWQKKyAgICBhcmdzIGFuZCBjb21wYXJlIHRoaXMgdG8gdGhlIG51bWJlciBvZiBzdXBwbGllZCBhcmdzLiAqLworICAgIFB5X3NzaXplX3QgYWN0dWFsX2FyZ3M7CiAKLQkqcG91dG1hc2sgPSAwOwotCSpwaW5vdXRtYXNrID0gMDsKLQkqcG51bXJldHZhbHMgPSAwOworICAgICpwb3V0bWFzayA9IDA7CisgICAgKnBpbm91dG1hc2sgPSAwOworICAgICpwbnVtcmV0dmFscyA9IDA7CiAKLQkvKiBUcml2aWFsIGNhc2VzLCB3aGVyZSB3ZSBlaXRoZXIgcmV0dXJuIGluYXJncyBpdHNlbGYsIG9yIGEgc2xpY2Ugb2YgaXQuICovCi0JaWYgKGFyZ3R5cGVzID09IE5VTEwgfHwgcGFyYW1mbGFncyA9PSBOVUxMIHx8IFB5VHVwbGVfR0VUX1NJWkUoYXJndHlwZXMpID09IDApIHsKKyAgICAvKiBUcml2aWFsIGNhc2VzLCB3aGVyZSB3ZSBlaXRoZXIgcmV0dXJuIGluYXJncyBpdHNlbGYsIG9yIGEgc2xpY2Ugb2YgaXQuICovCisgICAgaWYgKGFyZ3R5cGVzID09IE5VTEwgfHwgcGFyYW1mbGFncyA9PSBOVUxMIHx8IFB5VHVwbGVfR0VUX1NJWkUoYXJndHlwZXMpID09IDApIHsKICNpZmRlZiBNU19XSU4zMgotCQlpZiAoc2VsZi0+aW5kZXgpCi0JCQlyZXR1cm4gUHlUdXBsZV9HZXRTbGljZShpbmFyZ3MsIDEsIFB5VHVwbGVfR0VUX1NJWkUoaW5hcmdzKSk7CisgICAgICAgIGlmIChzZWxmLT5pbmRleCkKKyAgICAgICAgICAgIHJldHVybiBQeVR1cGxlX0dldFNsaWNlKGluYXJncywgMSwgUHlUdXBsZV9HRVRfU0laRShpbmFyZ3MpKTsKICNlbmRpZgotCQlQeV9JTkNSRUYoaW5hcmdzKTsKLQkJcmV0dXJuIGluYXJnczsKLQl9CisgICAgICAgIFB5X0lOQ1JFRihpbmFyZ3MpOworICAgICAgICByZXR1cm4gaW5hcmdzOworICAgIH0KIAotCWxlbiA9IFB5VHVwbGVfR0VUX1NJWkUoYXJndHlwZXMpOwotCWNhbGxhcmdzID0gUHlUdXBsZV9OZXcobGVuKTsgLyogdGhlIGFyZ3VtZW50IHR1cGxlIHdlIGJ1aWxkICovCi0JaWYgKGNhbGxhcmdzID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIGxlbiA9IFB5VHVwbGVfR0VUX1NJWkUoYXJndHlwZXMpOworICAgIGNhbGxhcmdzID0gUHlUdXBsZV9OZXcobGVuKTsgLyogdGhlIGFyZ3VtZW50IHR1cGxlIHdlIGJ1aWxkICovCisgICAgaWYgKGNhbGxhcmdzID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCiAjaWZkZWYgTVNfV0lOMzIKLQkvKiBGb3IgYSBDT00gbWV0aG9kLCBza2lwIHRoZSBmaXJzdCBhcmcgKi8KLQlpZiAoc2VsZi0+aW5kZXgpIHsKLQkJaW5hcmdzX2luZGV4ID0gMTsKLQl9CisgICAgLyogRm9yIGEgQ09NIG1ldGhvZCwgc2tpcCB0aGUgZmlyc3QgYXJnICovCisgICAgaWYgKHNlbGYtPmluZGV4KSB7CisgICAgICAgIGluYXJnc19pbmRleCA9IDE7CisgICAgfQogI2VuZGlmCi0JZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKSB7Ci0JCVB5T2JqZWN0ICppdGVtID0gUHlUdXBsZV9HRVRfSVRFTShwYXJhbWZsYWdzLCBpKTsKLQkJUHlPYmplY3QgKm9iOwotCQlpbnQgZmxhZzsKLQkJY2hhciAqbmFtZSA9IE5VTEw7Ci0JCVB5T2JqZWN0ICpkZWZ2YWwgPSBOVUxMOworICAgIGZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkgeworICAgICAgICBQeU9iamVjdCAqaXRlbSA9IFB5VHVwbGVfR0VUX0lURU0ocGFyYW1mbGFncywgaSk7CisgICAgICAgIFB5T2JqZWN0ICpvYjsKKyAgICAgICAgaW50IGZsYWc7CisgICAgICAgIGNoYXIgKm5hbWUgPSBOVUxMOworICAgICAgICBQeU9iamVjdCAqZGVmdmFsID0gTlVMTDsKIAotCQkvKiBUaGlzIHdheSBzZWVtcyB0byBiZSB+MiB1cyBmYXN0ZXIgdGhhbiB0aGUgUHlBcmdfUGFyc2VUdXBsZQotCQkgICBjYWxscyBiZWxvdy4gKi8KLQkJLyogV2UgSEFWRSBhbHJlYWR5IGNoZWNrZWQgdGhhdCB0aGUgdHVwbGUgY2FuIGJlIHBhcnNlZCB3aXRoICJpfHpPIiwgc28uLi4gKi8KLQkJUHlfc3NpemVfdCB0c2l6ZSA9IFB5VHVwbGVfR0VUX1NJWkUoaXRlbSk7Ci0JCWZsYWcgPSBQeUludF9BU19MT05HKFB5VHVwbGVfR0VUX0lURU0oaXRlbSwgMCkpOwotCQluYW1lID0gdHNpemUgPiAxID8gUHlTdHJpbmdfQVNfU1RSSU5HKFB5VHVwbGVfR0VUX0lURU0oaXRlbSwgMSkpIDogTlVMTDsKLQkJZGVmdmFsID0gdHNpemUgPiAyID8gUHlUdXBsZV9HRVRfSVRFTShpdGVtLCAyKSA6IE5VTEw7CisgICAgICAgIC8qIFRoaXMgd2F5IHNlZW1zIHRvIGJlIH4yIHVzIGZhc3RlciB0aGFuIHRoZSBQeUFyZ19QYXJzZVR1cGxlCisgICAgICAgICAgIGNhbGxzIGJlbG93LiAqLworICAgICAgICAvKiBXZSBIQVZFIGFscmVhZHkgY2hlY2tlZCB0aGF0IHRoZSB0dXBsZSBjYW4gYmUgcGFyc2VkIHdpdGggIml8ek8iLCBzby4uLiAqLworICAgICAgICBQeV9zc2l6ZV90IHRzaXplID0gUHlUdXBsZV9HRVRfU0laRShpdGVtKTsKKyAgICAgICAgZmxhZyA9IFB5SW50X0FTX0xPTkcoUHlUdXBsZV9HRVRfSVRFTShpdGVtLCAwKSk7CisgICAgICAgIG5hbWUgPSB0c2l6ZSA+IDEgPyBQeVN0cmluZ19BU19TVFJJTkcoUHlUdXBsZV9HRVRfSVRFTShpdGVtLCAxKSkgOiBOVUxMOworICAgICAgICBkZWZ2YWwgPSB0c2l6ZSA+IDIgPyBQeVR1cGxlX0dFVF9JVEVNKGl0ZW0sIDIpIDogTlVMTDsKIAotCQlzd2l0Y2ggKGZsYWcgJiAoUEFSQU1GTEFHX0ZJTiB8IFBBUkFNRkxBR19GT1VUIHwgUEFSQU1GTEFHX0ZMQ0lEKSkgewotCQljYXNlIFBBUkFNRkxBR19GSU4gfCBQQVJBTUZMQUdfRkxDSUQ6Ci0JCQkvKiBbJ2luJywgJ2xjaWQnXSBwYXJhbWV0ZXIuICBBbHdheXMgdGFrZW4gZnJvbSBkZWZ2YWwsCi0JCQkgaWYgZ2l2ZW4sIGVsc2UgdGhlIGludGVnZXIgMC4gKi8KLQkJCWlmIChkZWZ2YWwgPT0gTlVMTCkgewotCQkJCWRlZnZhbCA9IFB5SW50X0Zyb21Mb25nKDApOwotCQkJCWlmIChkZWZ2YWwgPT0gTlVMTCkKLQkJCQkJZ290byBlcnJvcjsKLQkJCX0gZWxzZQotCQkJCVB5X0lOQ1JFRihkZWZ2YWwpOwotCQkJUHlUdXBsZV9TRVRfSVRFTShjYWxsYXJncywgaSwgZGVmdmFsKTsKLQkJCWJyZWFrOwotCQljYXNlIChQQVJBTUZMQUdfRklOIHwgUEFSQU1GTEFHX0ZPVVQpOgotCQkJKnBpbm91dG1hc2sgfD0gKDEgPDwgaSk7IC8qIG1hcmsgYXMgaW5vdXQgYXJnICovCi0JCQkoKnBudW1yZXR2YWxzKSsrOwotCQkJLyogZmFsbCB0aHJvdWdoIHRvIFBBUkFNRkxBR19GSU4uLi4gKi8KLQkJY2FzZSAwOgotCQljYXNlIFBBUkFNRkxBR19GSU46Ci0JCQkvKiAnaW4nIHBhcmFtZXRlci4gIENvcHkgaXQgZnJvbSBpbmFyZ3MuICovCi0JCQlvYiA9X2dldF9hcmcoJmluYXJnc19pbmRleCwgbmFtZSwgZGVmdmFsLCBpbmFyZ3MsIGt3ZHMpOwotCQkJaWYgKG9iID09IE5VTEwpCi0JCQkJZ290byBlcnJvcjsKLQkJCVB5VHVwbGVfU0VUX0lURU0oY2FsbGFyZ3MsIGksIG9iKTsKLQkJCWJyZWFrOwotCQljYXNlIFBBUkFNRkxBR19GT1VUOgotCQkJLyogWFhYIFJlZmFjdG9yIHRoaXMgY29kZSBpbnRvIGEgc2VwYXJhdGUgZnVuY3Rpb24uICovCi0JCQkvKiAnb3V0JyBwYXJhbWV0ZXIuCi0JCQkgICBhcmd0eXBlc1tpXSBtdXN0IGJlIGEgUE9JTlRFUiB0byBhIGMgdHlwZS4KKyAgICAgICAgc3dpdGNoIChmbGFnICYgKFBBUkFNRkxBR19GSU4gfCBQQVJBTUZMQUdfRk9VVCB8IFBBUkFNRkxBR19GTENJRCkpIHsKKyAgICAgICAgY2FzZSBQQVJBTUZMQUdfRklOIHwgUEFSQU1GTEFHX0ZMQ0lEOgorICAgICAgICAgICAgLyogWydpbicsICdsY2lkJ10gcGFyYW1ldGVyLiAgQWx3YXlzIHRha2VuIGZyb20gZGVmdmFsLAorICAgICAgICAgICAgIGlmIGdpdmVuLCBlbHNlIHRoZSBpbnRlZ2VyIDAuICovCisgICAgICAgICAgICBpZiAoZGVmdmFsID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBkZWZ2YWwgPSBQeUludF9Gcm9tTG9uZygwKTsKKyAgICAgICAgICAgICAgICBpZiAoZGVmdmFsID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICBQeV9JTkNSRUYoZGVmdmFsKTsKKyAgICAgICAgICAgIFB5VHVwbGVfU0VUX0lURU0oY2FsbGFyZ3MsIGksIGRlZnZhbCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAoUEFSQU1GTEFHX0ZJTiB8IFBBUkFNRkxBR19GT1VUKToKKyAgICAgICAgICAgICpwaW5vdXRtYXNrIHw9ICgxIDw8IGkpOyAvKiBtYXJrIGFzIGlub3V0IGFyZyAqLworICAgICAgICAgICAgKCpwbnVtcmV0dmFscykrKzsKKyAgICAgICAgICAgIC8qIGZhbGwgdGhyb3VnaCB0byBQQVJBTUZMQUdfRklOLi4uICovCisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgY2FzZSBQQVJBTUZMQUdfRklOOgorICAgICAgICAgICAgLyogJ2luJyBwYXJhbWV0ZXIuICBDb3B5IGl0IGZyb20gaW5hcmdzLiAqLworICAgICAgICAgICAgb2IgPV9nZXRfYXJnKCZpbmFyZ3NfaW5kZXgsIG5hbWUsIGRlZnZhbCwgaW5hcmdzLCBrd2RzKTsKKyAgICAgICAgICAgIGlmIChvYiA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKGNhbGxhcmdzLCBpLCBvYik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQQVJBTUZMQUdfRk9VVDoKKyAgICAgICAgICAgIC8qIFhYWCBSZWZhY3RvciB0aGlzIGNvZGUgaW50byBhIHNlcGFyYXRlIGZ1bmN0aW9uLiAqLworICAgICAgICAgICAgLyogJ291dCcgcGFyYW1ldGVyLgorICAgICAgICAgICAgICAgYXJndHlwZXNbaV0gbXVzdCBiZSBhIFBPSU5URVIgdG8gYSBjIHR5cGUuCiAKLQkJCSAgIENhbm5vdCBieSBzdXBwbGllZCBpbiBpbmFyZ3MsIGJ1dCBhIGRlZnZhbCB3aWxsIGJlIHVzZWQKLQkJCSAgIGlmIGF2YWlsYWJsZS4gIFhYWCBTaG91bGQgd2Ugc3VwcG9ydCBnZXR0aW5nIGl0IGZyb20ga3dkcz8KLQkJCSovCi0JCQlpZiAoZGVmdmFsKSB7Ci0JCQkJLyogWFhYIFVzaW5nIG11dGFibGUgb2JqZWN0cyBhcyBkZWZ2YWwgd2lsbAotCQkJCSAgIG1ha2UgdGhlIGZ1bmN0aW9uIG5vbi10aHJlYWRzYWZlLCB1bmxlc3Mgd2UKLQkJCQkgICBjb3B5IHRoZSBvYmplY3QgaW4gZWFjaCBpbnZvY2F0aW9uICovCi0JCQkJUHlfSU5DUkVGKGRlZnZhbCk7Ci0JCQkJUHlUdXBsZV9TRVRfSVRFTShjYWxsYXJncywgaSwgZGVmdmFsKTsKLQkJCQkqcG91dG1hc2sgfD0gKDEgPDwgaSk7IC8qIG1hcmsgYXMgb3V0IGFyZyAqLwotCQkJCSgqcG51bXJldHZhbHMpKys7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlvYiA9IFB5VHVwbGVfR0VUX0lURU0oYXJndHlwZXMsIGkpOwotCQkJZGljdCA9IFB5VHlwZV9zdGdkaWN0KG9iKTsKLQkJCWlmIChkaWN0ID09IE5VTEwpIHsKLQkJCQkvKiBDYW5ub3QgaGFwcGVuOiBfdmFsaWRhdGVfcGFyYW1mbGFncygpCi0JCQkJICB3b3VsZCBub3QgYWNjZXB0IHN1Y2ggYW4gb2JqZWN0ICovCi0JCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1J1bnRpbWVFcnJvciwKLQkJCQkJICAgICAiTlVMTCBzdGdkaWN0IHVuZXhwZWN0ZWQiKTsKLQkJCQlnb3RvIGVycm9yOwotCQkJfQotCQkJaWYgKFB5U3RyaW5nX0NoZWNrKGRpY3QtPnByb3RvKSkgewotCQkJCVB5RXJyX0Zvcm1hdCgKLQkJCQkJUHlFeGNfVHlwZUVycm9yLAotCQkJCQkiJXMgJ291dCcgcGFyYW1ldGVyIG11c3QgYmUgcGFzc2VkIGFzIGRlZmF1bHQgdmFsdWUiLAotCQkJCQkoKFB5VHlwZU9iamVjdCAqKW9iKS0+dHBfbmFtZSk7Ci0JCQkJZ290byBlcnJvcjsKLQkJCX0KLQkJCWlmIChBcnJheVR5cGVPYmplY3RfQ2hlY2sob2IpKQotCQkJCW9iID0gUHlPYmplY3RfQ2FsbE9iamVjdChvYiwgTlVMTCk7Ci0JCQllbHNlCi0JCQkJLyogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBwb2ludGVkLXRvIHR5cGUgKi8KLQkJCQlvYiA9IFB5T2JqZWN0X0NhbGxPYmplY3QoZGljdC0+cHJvdG8sIE5VTEwpOwotCQkJLyoJCQkgICAKLQkJCSAgIFhYWCBJcyB0aGUgZm9sbG93aW5nIGNvcnJlY3QgYW55IGxvbmdlcj8KLQkJCSAgIFdlIG11c3Qgbm90IHBhc3MgYSBieXJlZigpIHRvIHRoZSBhcnJheSB0aGVuIGJ1dAotCQkJICAgdGhlIGFycmF5IGluc3RhbmNlIGl0c2VsZi4gVGhlbiwgd2UgY2Fubm90IHJldHJpdmUKLQkJCSAgIHRoZSByZXN1bHQgZnJvbSB0aGUgUHlDQXJnT2JqZWN0LgotCQkJKi8KLQkJCWlmIChvYiA9PSBOVUxMKQotCQkJCWdvdG8gZXJyb3I7Ci0JCQkvKiBUaGUgLmZyb21fcGFyYW0gY2FsbCB0aGF0IHdpbGwgb2N1cnIgbGF0ZXIgd2lsbCBwYXNzIHRoaXMKLQkJCSAgIGFzIGEgYnlyZWYgcGFyYW1ldGVyLiAqLwotCQkJUHlUdXBsZV9TRVRfSVRFTShjYWxsYXJncywgaSwgb2IpOwotCQkJKnBvdXRtYXNrIHw9ICgxIDw8IGkpOyAvKiBtYXJrIGFzIG91dCBhcmcgKi8KLQkJCSgqcG51bXJldHZhbHMpKys7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSAgICAgInBhcmFtZmxhZyAlZCBub3QgeWV0IGltcGxlbWVudGVkIiwgZmxhZyk7Ci0JCQlnb3RvIGVycm9yOwotCQkJYnJlYWs7Ci0JCX0KLQl9CisgICAgICAgICAgICAgICBDYW5ub3QgYnkgc3VwcGxpZWQgaW4gaW5hcmdzLCBidXQgYSBkZWZ2YWwgd2lsbCBiZSB1c2VkCisgICAgICAgICAgICAgICBpZiBhdmFpbGFibGUuICBYWFggU2hvdWxkIHdlIHN1cHBvcnQgZ2V0dGluZyBpdCBmcm9tIGt3ZHM/CisgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKGRlZnZhbCkgeworICAgICAgICAgICAgICAgIC8qIFhYWCBVc2luZyBtdXRhYmxlIG9iamVjdHMgYXMgZGVmdmFsIHdpbGwKKyAgICAgICAgICAgICAgICAgICBtYWtlIHRoZSBmdW5jdGlvbiBub24tdGhyZWFkc2FmZSwgdW5sZXNzIHdlCisgICAgICAgICAgICAgICAgICAgY29weSB0aGUgb2JqZWN0IGluIGVhY2ggaW52b2NhdGlvbiAqLworICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihkZWZ2YWwpOworICAgICAgICAgICAgICAgIFB5VHVwbGVfU0VUX0lURU0oY2FsbGFyZ3MsIGksIGRlZnZhbCk7CisgICAgICAgICAgICAgICAgKnBvdXRtYXNrIHw9ICgxIDw8IGkpOyAvKiBtYXJrIGFzIG91dCBhcmcgKi8KKyAgICAgICAgICAgICAgICAoKnBudW1yZXR2YWxzKSsrOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb2IgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3R5cGVzLCBpKTsKKyAgICAgICAgICAgIGRpY3QgPSBQeVR5cGVfc3RnZGljdChvYik7CisgICAgICAgICAgICBpZiAoZGljdCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgLyogQ2Fubm90IGhhcHBlbjogX3ZhbGlkYXRlX3BhcmFtZmxhZ3MoKQorICAgICAgICAgICAgICAgICAgd291bGQgbm90IGFjY2VwdCBzdWNoIGFuIG9iamVjdCAqLworICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOVUxMIHN0Z2RpY3QgdW5leHBlY3RlZCIpOworICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoUHlTdHJpbmdfQ2hlY2soZGljdC0+cHJvdG8pKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KAorICAgICAgICAgICAgICAgICAgICBQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICIlcyAnb3V0JyBwYXJhbWV0ZXIgbXVzdCBiZSBwYXNzZWQgYXMgZGVmYXVsdCB2YWx1ZSIsCisgICAgICAgICAgICAgICAgICAgICgoUHlUeXBlT2JqZWN0ICopb2IpLT50cF9uYW1lKTsKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEFycmF5VHlwZU9iamVjdF9DaGVjayhvYikpCisgICAgICAgICAgICAgICAgb2IgPSBQeU9iamVjdF9DYWxsT2JqZWN0KG9iLCBOVUxMKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAvKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIHBvaW50ZWQtdG8gdHlwZSAqLworICAgICAgICAgICAgICAgIG9iID0gUHlPYmplY3RfQ2FsbE9iamVjdChkaWN0LT5wcm90bywgTlVMTCk7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgWFhYIElzIHRoZSBmb2xsb3dpbmcgY29ycmVjdCBhbnkgbG9uZ2VyPworICAgICAgICAgICAgICAgV2UgbXVzdCBub3QgcGFzcyBhIGJ5cmVmKCkgdG8gdGhlIGFycmF5IHRoZW4gYnV0CisgICAgICAgICAgICAgICB0aGUgYXJyYXkgaW5zdGFuY2UgaXRzZWxmLiBUaGVuLCB3ZSBjYW5ub3QgcmV0cml2ZQorICAgICAgICAgICAgICAgdGhlIHJlc3VsdCBmcm9tIHRoZSBQeUNBcmdPYmplY3QuCisgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKG9iID09IE5VTEwpCisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgIC8qIFRoZSAuZnJvbV9wYXJhbSBjYWxsIHRoYXQgd2lsbCBvY3VyciBsYXRlciB3aWxsIHBhc3MgdGhpcworICAgICAgICAgICAgICAgYXMgYSBieXJlZiBwYXJhbWV0ZXIuICovCisgICAgICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKGNhbGxhcmdzLCBpLCBvYik7CisgICAgICAgICAgICAqcG91dG1hc2sgfD0gKDEgPDwgaSk7IC8qIG1hcmsgYXMgb3V0IGFyZyAqLworICAgICAgICAgICAgKCpwbnVtcmV0dmFscykrKzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgInBhcmFtZmxhZyAlZCBub3QgeWV0IGltcGxlbWVudGVkIiwgZmxhZyk7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKiBXZSBoYXZlIGNvdW50ZWQgdGhlIGFyZ3VtZW50cyB3ZSBoYXZlIGNvbnN1bWVkIGluICdpbmFyZ3NfaW5kZXgnLiAgVGhpcwotCSAgIG11c3QgYmUgdGhlIHNhbWUgYXMgbGVuKGluYXJncykgKyBsZW4oa3dkcyksIG90aGVyd2lzZSB3ZSBoYXZlCi0JICAgZWl0aGVyIHRvbyBtdWNoIG9yIG5vdCBlbm91Z2ggYXJndW1lbnRzLiAqLworICAgIC8qIFdlIGhhdmUgY291bnRlZCB0aGUgYXJndW1lbnRzIHdlIGhhdmUgY29uc3VtZWQgaW4gJ2luYXJnc19pbmRleCcuICBUaGlzCisgICAgICAgbXVzdCBiZSB0aGUgc2FtZSBhcyBsZW4oaW5hcmdzKSArIGxlbihrd2RzKSwgb3RoZXJ3aXNlIHdlIGhhdmUKKyAgICAgICBlaXRoZXIgdG9vIG11Y2ggb3Igbm90IGVub3VnaCBhcmd1bWVudHMuICovCiAKLQlhY3R1YWxfYXJncyA9IFB5VHVwbGVfR0VUX1NJWkUoaW5hcmdzKSArIChrd2RzID8gUHlEaWN0X1NpemUoa3dkcykgOiAwKTsKLQlpZiAoYWN0dWFsX2FyZ3MgIT0gaW5hcmdzX2luZGV4KSB7Ci0JCS8qIFdoZW4gd2UgaGF2ZSBkZWZhdWx0IHZhbHVlcyBvciBuYW1lZCBwYXJhbWV0ZXJzLCB0aGlzIGVycm9yCi0JCSAgIG1lc3NhZ2UgaXMgbWlzbGVhZGluZy4gIFNlZSB1bml0dGVzdHMvdGVzdF9wYXJhbWZsYWdzLnB5Ci0JCSAqLwotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgIGFjdHVhbF9hcmdzID0gUHlUdXBsZV9HRVRfU0laRShpbmFyZ3MpICsgKGt3ZHMgPyBQeURpY3RfU2l6ZShrd2RzKSA6IDApOworICAgIGlmIChhY3R1YWxfYXJncyAhPSBpbmFyZ3NfaW5kZXgpIHsKKyAgICAgICAgLyogV2hlbiB3ZSBoYXZlIGRlZmF1bHQgdmFsdWVzIG9yIG5hbWVkIHBhcmFtZXRlcnMsIHRoaXMgZXJyb3IKKyAgICAgICAgICAgbWVzc2FnZSBpcyBtaXNsZWFkaW5nLiAgU2VlIHVuaXR0ZXN0cy90ZXN0X3BhcmFtZmxhZ3MucHkKKyAgICAgICAgICovCisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCiAjaWYgKFBZX1ZFUlNJT05fSEVYIDwgMHgwMjA1MDAwMCkKLQkJCSAgICAgImNhbGwgdGFrZXMgZXhhY3RseSAlZCBhcmd1bWVudHMgKCVkIGdpdmVuKSIsCisgICAgICAgICAgICAgICAgICAgICAiY2FsbCB0YWtlcyBleGFjdGx5ICVkIGFyZ3VtZW50cyAoJWQgZ2l2ZW4pIiwKICNlbHNlCi0JCQkgICAgICJjYWxsIHRha2VzIGV4YWN0bHkgJWQgYXJndW1lbnRzICglemQgZ2l2ZW4pIiwKKyAgICAgICAgICAgICAgICAgICAgICJjYWxsIHRha2VzIGV4YWN0bHkgJWQgYXJndW1lbnRzICglemQgZ2l2ZW4pIiwKICNlbmRpZgotCQkJICAgICBpbmFyZ3NfaW5kZXgsIGFjdHVhbF9hcmdzKTsKLQkJZ290byBlcnJvcjsKLQl9CisgICAgICAgICAgICAgICAgICAgICBpbmFyZ3NfaW5kZXgsIGFjdHVhbF9hcmdzKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CiAKLQkvKiBvdXRtYXNrIGlzIGEgYml0bWFzayBjb250YWluaW5nIGluZGV4ZXMgaW50byBjYWxsYXJncy4gIEl0ZW1zIGF0Ci0JICAgdGhlc2UgaW5kZXhlcyBjb250YWluIHZhbHVlcyB0byByZXR1cm4uCi0JICovCi0JcmV0dXJuIGNhbGxhcmdzOworICAgIC8qIG91dG1hc2sgaXMgYSBiaXRtYXNrIGNvbnRhaW5pbmcgaW5kZXhlcyBpbnRvIGNhbGxhcmdzLiAgSXRlbXMgYXQKKyAgICAgICB0aGVzZSBpbmRleGVzIGNvbnRhaW4gdmFsdWVzIHRvIHJldHVybi4KKyAgICAgKi8KKyAgICByZXR1cm4gY2FsbGFyZ3M7CiAgIGVycm9yOgotCVB5X0RFQ1JFRihjYWxsYXJncyk7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlfREVDUkVGKGNhbGxhcmdzKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogLyogU2VlIGFsc286CkBAIC0zNzA2LDMwOCArMzcwNiwzMDggQEAKICovCiBzdGF0aWMgUHlPYmplY3QgKgogX2J1aWxkX3Jlc3VsdChQeU9iamVjdCAqcmVzdWx0LCBQeU9iamVjdCAqY2FsbGFyZ3MsCi0JICAgICAgaW50IG91dG1hc2ssIGludCBpbm91dG1hc2ssIHVuc2lnbmVkIGludCBudW1yZXR2YWxzKQorICAgICAgICAgICAgICBpbnQgb3V0bWFzaywgaW50IGlub3V0bWFzaywgdW5zaWduZWQgaW50IG51bXJldHZhbHMpCiB7Ci0JdW5zaWduZWQgaW50IGksIGluZGV4OwotCWludCBiaXQ7Ci0JUHlPYmplY3QgKnR1cCA9IE5VTEw7CisgICAgdW5zaWduZWQgaW50IGksIGluZGV4OworICAgIGludCBiaXQ7CisgICAgUHlPYmplY3QgKnR1cCA9IE5VTEw7CiAKLQlpZiAoY2FsbGFyZ3MgPT0gTlVMTCkKLQkJcmV0dXJuIHJlc3VsdDsKLQlpZiAocmVzdWx0ID09IE5VTEwgfHwgbnVtcmV0dmFscyA9PSAwKSB7Ci0JCVB5X0RFQ1JFRihjYWxsYXJncyk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCVB5X0RFQ1JFRihyZXN1bHQpOworICAgIGlmIChjYWxsYXJncyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIGlmIChyZXN1bHQgPT0gTlVMTCB8fCBudW1yZXR2YWxzID09IDApIHsKKyAgICAgICAgUHlfREVDUkVGKGNhbGxhcmdzKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgUHlfREVDUkVGKHJlc3VsdCk7CiAKLQkvKiB0dXAgd2lsbCBub3QgYmUgYWxsb2NhdGVkIGlmIG51bXJldHZhbHMgPT0gMSAqLwotCS8qIGFsbG9jYXRlIHR1cGxlIHRvIGhvbGQgdGhlIHJlc3VsdCAqLwotCWlmIChudW1yZXR2YWxzID4gMSkgewotCQl0dXAgPSBQeVR1cGxlX05ldyhudW1yZXR2YWxzKTsKLQkJaWYgKHR1cCA9PSBOVUxMKSB7Ci0JCQlQeV9ERUNSRUYoY2FsbGFyZ3MpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9CisgICAgLyogdHVwIHdpbGwgbm90IGJlIGFsbG9jYXRlZCBpZiBudW1yZXR2YWxzID09IDEgKi8KKyAgICAvKiBhbGxvY2F0ZSB0dXBsZSB0byBob2xkIHRoZSByZXN1bHQgKi8KKyAgICBpZiAobnVtcmV0dmFscyA+IDEpIHsKKyAgICAgICAgdHVwID0gUHlUdXBsZV9OZXcobnVtcmV0dmFscyk7CisgICAgICAgIGlmICh0dXAgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKGNhbGxhcmdzKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQogCi0JaW5kZXggPSAwOwotCWZvciAoYml0ID0gMSwgaSA9IDA7IGkgPCAzMjsgKytpLCBiaXQgPDw9IDEpIHsKLQkJUHlPYmplY3QgKnY7Ci0JCWlmIChiaXQgJiBpbm91dG1hc2spIHsKLQkJCXYgPSBQeVR1cGxlX0dFVF9JVEVNKGNhbGxhcmdzLCBpKTsKLQkJCVB5X0lOQ1JFRih2KTsKLQkJCWlmIChudW1yZXR2YWxzID09IDEpIHsKLQkJCQlQeV9ERUNSRUYoY2FsbGFyZ3MpOwotCQkJCXJldHVybiB2OwotCQkJfQotCQkJUHlUdXBsZV9TRVRfSVRFTSh0dXAsIGluZGV4LCB2KTsKLQkJCWluZGV4Kys7Ci0JCX0gZWxzZSBpZiAoYml0ICYgb3V0bWFzaykgewotCQkJdiA9IFB5VHVwbGVfR0VUX0lURU0oY2FsbGFyZ3MsIGkpOwotCQkJdiA9IFB5T2JqZWN0X0NhbGxNZXRob2QodiwgIl9fY3R5cGVzX2Zyb21fb3V0cGFyYW1fXyIsIE5VTEwpOwotCQkJaWYgKHYgPT0gTlVMTCB8fCBudW1yZXR2YWxzID09IDEpIHsKLQkJCQlQeV9ERUNSRUYoY2FsbGFyZ3MpOwotCQkJCXJldHVybiB2OwotCQkJfQotCQkJUHlUdXBsZV9TRVRfSVRFTSh0dXAsIGluZGV4LCB2KTsKLQkJCWluZGV4Kys7Ci0JCX0KLQkJaWYgKGluZGV4ID09IG51bXJldHZhbHMpCi0JCQlicmVhazsKLQl9CisgICAgaW5kZXggPSAwOworICAgIGZvciAoYml0ID0gMSwgaSA9IDA7IGkgPCAzMjsgKytpLCBiaXQgPDw9IDEpIHsKKyAgICAgICAgUHlPYmplY3QgKnY7CisgICAgICAgIGlmIChiaXQgJiBpbm91dG1hc2spIHsKKyAgICAgICAgICAgIHYgPSBQeVR1cGxlX0dFVF9JVEVNKGNhbGxhcmdzLCBpKTsKKyAgICAgICAgICAgIFB5X0lOQ1JFRih2KTsKKyAgICAgICAgICAgIGlmIChudW1yZXR2YWxzID09IDEpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoY2FsbGFyZ3MpOworICAgICAgICAgICAgICAgIHJldHVybiB2OworICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlUdXBsZV9TRVRfSVRFTSh0dXAsIGluZGV4LCB2KTsKKyAgICAgICAgICAgIGluZGV4Kys7CisgICAgICAgIH0gZWxzZSBpZiAoYml0ICYgb3V0bWFzaykgeworICAgICAgICAgICAgdiA9IFB5VHVwbGVfR0VUX0lURU0oY2FsbGFyZ3MsIGkpOworICAgICAgICAgICAgdiA9IFB5T2JqZWN0X0NhbGxNZXRob2QodiwgIl9fY3R5cGVzX2Zyb21fb3V0cGFyYW1fXyIsIE5VTEwpOworICAgICAgICAgICAgaWYgKHYgPT0gTlVMTCB8fCBudW1yZXR2YWxzID09IDEpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoY2FsbGFyZ3MpOworICAgICAgICAgICAgICAgIHJldHVybiB2OworICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlUdXBsZV9TRVRfSVRFTSh0dXAsIGluZGV4LCB2KTsKKyAgICAgICAgICAgIGluZGV4Kys7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGluZGV4ID09IG51bXJldHZhbHMpCisgICAgICAgICAgICBicmVhazsKKyAgICB9CiAKLQlQeV9ERUNSRUYoY2FsbGFyZ3MpOwotCXJldHVybiB0dXA7CisgICAgUHlfREVDUkVGKGNhbGxhcmdzKTsKKyAgICByZXR1cm4gdHVwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogQ0Z1bmNQdHJfY2FsbChDRnVuY1B0ck9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmluYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JUHlPYmplY3QgKnJlc3R5cGU7Ci0JUHlPYmplY3QgKmNvbnZlcnRlcnM7Ci0JUHlPYmplY3QgKmNoZWNrZXI7Ci0JUHlPYmplY3QgKmFyZ3R5cGVzOwotCVN0Z0RpY3RPYmplY3QgKmRpY3QgPSBQeU9iamVjdF9zdGdkaWN0KChQeU9iamVjdCAqKXNlbGYpOwotCVB5T2JqZWN0ICpyZXN1bHQ7Ci0JUHlPYmplY3QgKmNhbGxhcmdzOwotCVB5T2JqZWN0ICplcnJjaGVjazsKKyAgICBQeU9iamVjdCAqcmVzdHlwZTsKKyAgICBQeU9iamVjdCAqY29udmVydGVyczsKKyAgICBQeU9iamVjdCAqY2hlY2tlcjsKKyAgICBQeU9iamVjdCAqYXJndHlwZXM7CisgICAgU3RnRGljdE9iamVjdCAqZGljdCA9IFB5T2JqZWN0X3N0Z2RpY3QoKFB5T2JqZWN0ICopc2VsZik7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICBQeU9iamVjdCAqY2FsbGFyZ3M7CisgICAgUHlPYmplY3QgKmVycmNoZWNrOwogI2lmZGVmIE1TX1dJTjMyCi0JSVVua25vd24gKnBpdW5rID0gTlVMTDsKKyAgICBJVW5rbm93biAqcGl1bmsgPSBOVUxMOwogI2VuZGlmCi0Jdm9pZCAqcFByb2MgPSBOVUxMOworICAgIHZvaWQgKnBQcm9jID0gTlVMTDsKIAotCWludCBpbm91dG1hc2s7Ci0JaW50IG91dG1hc2s7Ci0JdW5zaWduZWQgaW50IG51bXJldHZhbHM7CisgICAgaW50IGlub3V0bWFzazsKKyAgICBpbnQgb3V0bWFzazsKKyAgICB1bnNpZ25lZCBpbnQgbnVtcmV0dmFsczsKIAotCWFzc2VydChkaWN0KTsgLyogQ2Fubm90IGJlIE5VTEwgZm9yIENGdW5jUHRyT2JqZWN0IGluc3RhbmNlcyAqLwotCXJlc3R5cGUgPSBzZWxmLT5yZXN0eXBlID8gc2VsZi0+cmVzdHlwZSA6IGRpY3QtPnJlc3R5cGU7Ci0JY29udmVydGVycyA9IHNlbGYtPmNvbnZlcnRlcnMgPyBzZWxmLT5jb252ZXJ0ZXJzIDogZGljdC0+Y29udmVydGVyczsKLQljaGVja2VyID0gc2VsZi0+Y2hlY2tlciA/IHNlbGYtPmNoZWNrZXIgOiBkaWN0LT5jaGVja2VyOwotCWFyZ3R5cGVzID0gc2VsZi0+YXJndHlwZXMgPyBzZWxmLT5hcmd0eXBlcyA6IGRpY3QtPmFyZ3R5cGVzOworICAgIGFzc2VydChkaWN0KTsgLyogQ2Fubm90IGJlIE5VTEwgZm9yIENGdW5jUHRyT2JqZWN0IGluc3RhbmNlcyAqLworICAgIHJlc3R5cGUgPSBzZWxmLT5yZXN0eXBlID8gc2VsZi0+cmVzdHlwZSA6IGRpY3QtPnJlc3R5cGU7CisgICAgY29udmVydGVycyA9IHNlbGYtPmNvbnZlcnRlcnMgPyBzZWxmLT5jb252ZXJ0ZXJzIDogZGljdC0+Y29udmVydGVyczsKKyAgICBjaGVja2VyID0gc2VsZi0+Y2hlY2tlciA/IHNlbGYtPmNoZWNrZXIgOiBkaWN0LT5jaGVja2VyOworICAgIGFyZ3R5cGVzID0gc2VsZi0+YXJndHlwZXMgPyBzZWxmLT5hcmd0eXBlcyA6IGRpY3QtPmFyZ3R5cGVzOwogLyogbGF0ZXIsIHdlIHByb2JhYmx5IHdhbnQgdG8gaGF2ZSBhbiBlcnJjaGVjayBmaWVsZCBpbiBzdGdkaWN0ICovCi0JZXJyY2hlY2sgPSBzZWxmLT5lcnJjaGVjayAvKiA/IHNlbGYtPmVycmNoZWNrIDogZGljdC0+ZXJyY2hlY2sgKi87CisgICAgZXJyY2hlY2sgPSBzZWxmLT5lcnJjaGVjayAvKiA/IHNlbGYtPmVycmNoZWNrIDogZGljdC0+ZXJyY2hlY2sgKi87CiAKIAotCXBQcm9jID0gKih2b2lkICoqKXNlbGYtPmJfcHRyOworICAgIHBQcm9jID0gKih2b2lkICoqKXNlbGYtPmJfcHRyOwogI2lmZGVmIE1TX1dJTjMyCi0JaWYgKHNlbGYtPmluZGV4KSB7Ci0JCS8qIEl0J3MgYSBDT00gbWV0aG9kICovCi0JCUNEYXRhT2JqZWN0ICp0aGlzOwotCQl0aGlzID0gKENEYXRhT2JqZWN0ICopUHlUdXBsZV9HZXRJdGVtKGluYXJncywgMCk7IC8qIGJvcnJvd2VkIHJlZiEgKi8KLQkJaWYgKCF0aGlzKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkJIm5hdGl2ZSBjb20gbWV0aG9kIGNhbGwgd2l0aG91dCAndGhpcycgcGFyYW1ldGVyIik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlpZiAoIUNEYXRhT2JqZWN0X0NoZWNrKHRoaXMpKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCQkiRXhwZWN0ZWQgYSBDT00gdGhpcyBwb2ludGVyIGFzIGZpcnN0IGFyZ3VtZW50Iik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQkvKiB0aGVyZSBzaG91bGQgYmUgbW9yZSBjaGVja3M/IE5vLCBpbiBQeXRob24gKi8KLQkJLyogRmlyc3QgYXJnIGlzIGFuIHBvaW50ZXIgdG8gYW4gaW50ZXJmYWNlIGluc3RhbmNlICovCi0JCWlmICghdGhpcy0+Yl9wdHIgfHwgKih2b2lkICoqKXRoaXMtPmJfcHRyID09IE5VTEwpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCQkiTlVMTCBDT00gcG9pbnRlciBhY2Nlc3MiKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCXBpdW5rID0gKihJVW5rbm93biAqKil0aGlzLT5iX3B0cjsKLQkJaWYgKE5VTEwgPT0gcGl1bmstPmxwVnRibCkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJCSJDT00gbWV0aG9kIGNhbGwgd2l0aG91dCBWVGFibGUiKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCXBQcm9jID0gKCh2b2lkICoqKXBpdW5rLT5scFZ0YmwpW3NlbGYtPmluZGV4IC0gMHgxMDAwXTsKLQl9CisgICAgaWYgKHNlbGYtPmluZGV4KSB7CisgICAgICAgIC8qIEl0J3MgYSBDT00gbWV0aG9kICovCisgICAgICAgIENEYXRhT2JqZWN0ICp0aGlzOworICAgICAgICB0aGlzID0gKENEYXRhT2JqZWN0ICopUHlUdXBsZV9HZXRJdGVtKGluYXJncywgMCk7IC8qIGJvcnJvd2VkIHJlZiEgKi8KKyAgICAgICAgaWYgKCF0aGlzKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmF0aXZlIGNvbSBtZXRob2QgY2FsbCB3aXRob3V0ICd0aGlzJyBwYXJhbWV0ZXIiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGlmICghQ0RhdGFPYmplY3RfQ2hlY2sodGhpcykpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGEgQ09NIHRoaXMgcG9pbnRlciBhcyBmaXJzdCBhcmd1bWVudCIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgLyogdGhlcmUgc2hvdWxkIGJlIG1vcmUgY2hlY2tzPyBObywgaW4gUHl0aG9uICovCisgICAgICAgIC8qIEZpcnN0IGFyZyBpcyBhbiBwb2ludGVyIHRvIGFuIGludGVyZmFjZSBpbnN0YW5jZSAqLworICAgICAgICBpZiAoIXRoaXMtPmJfcHRyIHx8ICoodm9pZCAqKil0aGlzLT5iX3B0ciA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTlVMTCBDT00gcG9pbnRlciBhY2Nlc3MiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHBpdW5rID0gKihJVW5rbm93biAqKil0aGlzLT5iX3B0cjsKKyAgICAgICAgaWYgKE5VTEwgPT0gcGl1bmstPmxwVnRibCkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNPTSBtZXRob2QgY2FsbCB3aXRob3V0IFZUYWJsZSIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgcFByb2MgPSAoKHZvaWQgKiopcGl1bmstPmxwVnRibClbc2VsZi0+aW5kZXggLSAweDEwMDBdOworICAgIH0KICNlbmRpZgotCWNhbGxhcmdzID0gX2J1aWxkX2NhbGxhcmdzKHNlbGYsIGFyZ3R5cGVzLAotCQkJCSAgIGluYXJncywga3dkcywKLQkJCQkgICAmb3V0bWFzaywgJmlub3V0bWFzaywgJm51bXJldHZhbHMpOwotCWlmIChjYWxsYXJncyA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBjYWxsYXJncyA9IF9idWlsZF9jYWxsYXJncyhzZWxmLCBhcmd0eXBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmFyZ3MsIGt3ZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dG1hc2ssICZpbm91dG1hc2ssICZudW1yZXR2YWxzKTsKKyAgICBpZiAoY2FsbGFyZ3MgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoY29udmVydGVycykgewotCQlpbnQgcmVxdWlyZWQgPSBQeV9TQUZFX0RPV05DQVNUKFB5VHVwbGVfR0VUX1NJWkUoY29udmVydGVycyksCi0JCQkJCSAgICAgICAgUHlfc3NpemVfdCwgaW50KTsKLQkJaW50IGFjdHVhbCA9IFB5X1NBRkVfRE9XTkNBU1QoUHlUdXBsZV9HRVRfU0laRShjYWxsYXJncyksCi0JCQkJCSAgICAgIFB5X3NzaXplX3QsIGludCk7CisgICAgaWYgKGNvbnZlcnRlcnMpIHsKKyAgICAgICAgaW50IHJlcXVpcmVkID0gUHlfU0FGRV9ET1dOQ0FTVChQeVR1cGxlX0dFVF9TSVpFKGNvbnZlcnRlcnMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QsIGludCk7CisgICAgICAgIGludCBhY3R1YWwgPSBQeV9TQUZFX0RPV05DQVNUKFB5VHVwbGVfR0VUX1NJWkUoY2FsbGFyZ3MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90LCBpbnQpOwogCi0JCWlmICgoZGljdC0+ZmxhZ3MgJiBGVU5DRkxBR19DREVDTCkgPT0gRlVOQ0ZMQUdfQ0RFQ0wpIHsKLQkJCS8qIEZvciBjZGVjbCBmdW5jdGlvbnMsIHdlIGFsbG93IG1vcmUgYWN0dWFsIGFyZ3VtZW50cwotCQkJICAgdGhhbiB0aGUgbGVuZ3RoIG9mIHRoZSBhcmd0eXBlcyB0dXBsZS4KLQkJCSovCi0JCQlpZiAocmVxdWlyZWQgPiBhY3R1YWwpIHsKLQkJCQlQeV9ERUNSRUYoY2FsbGFyZ3MpOwotCQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICJ0aGlzIGZ1bmN0aW9uIHRha2VzIGF0IGxlYXN0ICVkIGFyZ3VtZW50JXMgKCVkIGdpdmVuKSIsCi0JCQkJCSAgICAgcmVxdWlyZWQsCi0JCQkJCSAgICAgcmVxdWlyZWQgPT0gMSA/ICIiIDogInMiLAotCQkJCQkgICAgIGFjdHVhbCk7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAocmVxdWlyZWQgIT0gYWN0dWFsKSB7Ci0JCQlQeV9ERUNSRUYoY2FsbGFyZ3MpOwotCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAgInRoaXMgZnVuY3Rpb24gdGFrZXMgJWQgYXJndW1lbnQlcyAoJWQgZ2l2ZW4pIiwKLQkJCQkgICAgIHJlcXVpcmVkLAotCQkJCSAgICAgcmVxdWlyZWQgPT0gMSA/ICIiIDogInMiLAotCQkJCSAgICAgYWN0dWFsKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQorICAgICAgICBpZiAoKGRpY3QtPmZsYWdzICYgRlVOQ0ZMQUdfQ0RFQ0wpID09IEZVTkNGTEFHX0NERUNMKSB7CisgICAgICAgICAgICAvKiBGb3IgY2RlY2wgZnVuY3Rpb25zLCB3ZSBhbGxvdyBtb3JlIGFjdHVhbCBhcmd1bWVudHMKKyAgICAgICAgICAgICAgIHRoYW4gdGhlIGxlbmd0aCBvZiB0aGUgYXJndHlwZXMgdHVwbGUuCisgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKHJlcXVpcmVkID4gYWN0dWFsKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGNhbGxhcmdzKTsKKyAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAidGhpcyBmdW5jdGlvbiB0YWtlcyBhdCBsZWFzdCAlZCBhcmd1bWVudCVzICglZCBnaXZlbikiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZCA9PSAxID8gIiIgOiAicyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWwpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHJlcXVpcmVkICE9IGFjdHVhbCkgeworICAgICAgICAgICAgUHlfREVDUkVGKGNhbGxhcmdzKTsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICJ0aGlzIGZ1bmN0aW9uIHRha2VzICVkIGFyZ3VtZW50JXMgKCVkIGdpdmVuKSIsCisgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZCwKKyAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkID09IDEgPyAiIiA6ICJzIiwKKyAgICAgICAgICAgICAgICAgICAgIGFjdHVhbCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KIAotCXJlc3VsdCA9IF9DYWxsUHJvYyhwUHJvYywKLQkJCSAgIGNhbGxhcmdzLAorICAgIHJlc3VsdCA9IF9DYWxsUHJvYyhwUHJvYywKKyAgICAgICAgICAgICAgICAgICAgICAgY2FsbGFyZ3MsCiAjaWZkZWYgTVNfV0lOMzIKLQkJCSAgIHBpdW5rLAotCQkJICAgc2VsZi0+aWlkLAorICAgICAgICAgICAgICAgICAgICAgICBwaXVuaywKKyAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+aWlkLAogI2VuZGlmCi0JCQkgICBkaWN0LT5mbGFncywKLQkJCSAgIGNvbnZlcnRlcnMsCi0JCQkgICByZXN0eXBlLAotCQkJICAgY2hlY2tlcik7CisgICAgICAgICAgICAgICAgICAgICAgIGRpY3QtPmZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICByZXN0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICBjaGVja2VyKTsKIC8qIFRoZSAnZXJyY2hlY2snIHByb3RvY29sICovCi0JaWYgKHJlc3VsdCAhPSBOVUxMICYmIGVycmNoZWNrKSB7Ci0JCVB5T2JqZWN0ICp2ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhlcnJjaGVjaywKLQkJCQkJCQkgICByZXN1bHQsCi0JCQkJCQkJICAgc2VsZiwKLQkJCQkJCQkgICBjYWxsYXJncywKLQkJCQkJCQkgICBOVUxMKTsKLQkJLyogSWYgdGhlIGVycmNoZWNrIGZ1bnRpb24gZmFpbGVkLCByZXR1cm4gTlVMTC4KLQkJICAgSWYgdGhlIGVycmNoZWNrIGZ1bmN0aW9uIHJldHVybmVkIGNhbGxhcmdzIHVuY2hhbmdlZCwKLQkJICAgY29udGludWUgbm9ybWFsIHByb2Nlc3NpbmcuCi0JCSAgIElmIHRoZSBlcnJjaGVjayBmdW5jdGlvbiByZXR1cm5lZCBzb21ldGhpbmcgZWxzZSwKLQkJICAgdXNlIHRoYXQgYXMgcmVzdWx0LgotCQkqLwotCQlpZiAodiA9PSBOVUxMIHx8IHYgIT0gY2FsbGFyZ3MpIHsKLQkJCVB5X0RFQ1JFRihyZXN1bHQpOwotCQkJUHlfREVDUkVGKGNhbGxhcmdzKTsKLQkJCXJldHVybiB2OwotCQl9Ci0JCVB5X0RFQ1JFRih2KTsKLQl9CisgICAgaWYgKHJlc3VsdCAhPSBOVUxMICYmIGVycmNoZWNrKSB7CisgICAgICAgIFB5T2JqZWN0ICp2ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhlcnJjaGVjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICAvKiBJZiB0aGUgZXJyY2hlY2sgZnVudGlvbiBmYWlsZWQsIHJldHVybiBOVUxMLgorICAgICAgICAgICBJZiB0aGUgZXJyY2hlY2sgZnVuY3Rpb24gcmV0dXJuZWQgY2FsbGFyZ3MgdW5jaGFuZ2VkLAorICAgICAgICAgICBjb250aW51ZSBub3JtYWwgcHJvY2Vzc2luZy4KKyAgICAgICAgICAgSWYgdGhlIGVycmNoZWNrIGZ1bmN0aW9uIHJldHVybmVkIHNvbWV0aGluZyBlbHNlLAorICAgICAgICAgICB1c2UgdGhhdCBhcyByZXN1bHQuCisgICAgICAgICovCisgICAgICAgIGlmICh2ID09IE5VTEwgfHwgdiAhPSBjYWxsYXJncykgeworICAgICAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgICAgICBQeV9ERUNSRUYoY2FsbGFyZ3MpOworICAgICAgICAgICAgcmV0dXJuIHY7CisgICAgICAgIH0KKyAgICAgICAgUHlfREVDUkVGKHYpOworICAgIH0KIAotCXJldHVybiBfYnVpbGRfcmVzdWx0KHJlc3VsdCwgY2FsbGFyZ3MsCi0JCQkgICAgIG91dG1hc2ssIGlub3V0bWFzaywgbnVtcmV0dmFscyk7CisgICAgcmV0dXJuIF9idWlsZF9yZXN1bHQocmVzdWx0LCBjYWxsYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRtYXNrLCBpbm91dG1hc2ssIG51bXJldHZhbHMpOwogfQogCiBzdGF0aWMgaW50CiBDRnVuY1B0cl90cmF2ZXJzZShDRnVuY1B0ck9iamVjdCAqc2VsZiwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JUHlfVklTSVQoc2VsZi0+Y2FsbGFibGUpOwotCVB5X1ZJU0lUKHNlbGYtPnJlc3R5cGUpOwotCVB5X1ZJU0lUKHNlbGYtPmNoZWNrZXIpOwotCVB5X1ZJU0lUKHNlbGYtPmVycmNoZWNrKTsKLQlQeV9WSVNJVChzZWxmLT5hcmd0eXBlcyk7Ci0JUHlfVklTSVQoc2VsZi0+Y29udmVydGVycyk7Ci0JUHlfVklTSVQoc2VsZi0+cGFyYW1mbGFncyk7Ci0JUHlfVklTSVQoc2VsZi0+dGh1bmspOwotCXJldHVybiBDRGF0YV90cmF2ZXJzZSgoQ0RhdGFPYmplY3QgKilzZWxmLCB2aXNpdCwgYXJnKTsKKyAgICBQeV9WSVNJVChzZWxmLT5jYWxsYWJsZSk7CisgICAgUHlfVklTSVQoc2VsZi0+cmVzdHlwZSk7CisgICAgUHlfVklTSVQoc2VsZi0+Y2hlY2tlcik7CisgICAgUHlfVklTSVQoc2VsZi0+ZXJyY2hlY2spOworICAgIFB5X1ZJU0lUKHNlbGYtPmFyZ3R5cGVzKTsKKyAgICBQeV9WSVNJVChzZWxmLT5jb252ZXJ0ZXJzKTsKKyAgICBQeV9WSVNJVChzZWxmLT5wYXJhbWZsYWdzKTsKKyAgICBQeV9WSVNJVChzZWxmLT50aHVuayk7CisgICAgcmV0dXJuIENEYXRhX3RyYXZlcnNlKChDRGF0YU9iamVjdCAqKXNlbGYsIHZpc2l0LCBhcmcpOwogfQogCiBzdGF0aWMgaW50CiBDRnVuY1B0cl9jbGVhcihDRnVuY1B0ck9iamVjdCAqc2VsZikKIHsKLQlQeV9DTEVBUihzZWxmLT5jYWxsYWJsZSk7Ci0JUHlfQ0xFQVIoc2VsZi0+cmVzdHlwZSk7Ci0JUHlfQ0xFQVIoc2VsZi0+Y2hlY2tlcik7Ci0JUHlfQ0xFQVIoc2VsZi0+ZXJyY2hlY2spOwotCVB5X0NMRUFSKHNlbGYtPmFyZ3R5cGVzKTsKLQlQeV9DTEVBUihzZWxmLT5jb252ZXJ0ZXJzKTsKLQlQeV9DTEVBUihzZWxmLT5wYXJhbWZsYWdzKTsKLQlQeV9DTEVBUihzZWxmLT50aHVuayk7Ci0JcmV0dXJuIENEYXRhX2NsZWFyKChDRGF0YU9iamVjdCAqKXNlbGYpOworICAgIFB5X0NMRUFSKHNlbGYtPmNhbGxhYmxlKTsKKyAgICBQeV9DTEVBUihzZWxmLT5yZXN0eXBlKTsKKyAgICBQeV9DTEVBUihzZWxmLT5jaGVja2VyKTsKKyAgICBQeV9DTEVBUihzZWxmLT5lcnJjaGVjayk7CisgICAgUHlfQ0xFQVIoc2VsZi0+YXJndHlwZXMpOworICAgIFB5X0NMRUFSKHNlbGYtPmNvbnZlcnRlcnMpOworICAgIFB5X0NMRUFSKHNlbGYtPnBhcmFtZmxhZ3MpOworICAgIFB5X0NMRUFSKHNlbGYtPnRodW5rKTsKKyAgICByZXR1cm4gQ0RhdGFfY2xlYXIoKENEYXRhT2JqZWN0ICopc2VsZik7CiB9CiAKIHN0YXRpYyB2b2lkCiBDRnVuY1B0cl9kZWFsbG9jKENGdW5jUHRyT2JqZWN0ICpzZWxmKQogewotCUNGdW5jUHRyX2NsZWFyKHNlbGYpOwotCVB5X1RZUEUoc2VsZiktPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CisgICAgQ0Z1bmNQdHJfY2xlYXIoc2VsZik7CisgICAgUHlfVFlQRShzZWxmKS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIENGdW5jUHRyX3JlcHIoQ0Z1bmNQdHJPYmplY3QgKnNlbGYpCiB7CiAjaWZkZWYgTVNfV0lOMzIKLQlpZiAoc2VsZi0+aW5kZXgpCi0JCXJldHVybiBQeVN0cmluZ19Gcm9tRm9ybWF0KCI8Q09NIG1ldGhvZCBvZmZzZXQgJWQ6ICVzIGF0ICVwPiIsCi0JCQkJCSAgIHNlbGYtPmluZGV4IC0gMHgxMDAwLAotCQkJCQkgICBQeV9UWVBFKHNlbGYpLT50cF9uYW1lLAotCQkJCQkgICBzZWxmKTsKKyAgICBpZiAoc2VsZi0+aW5kZXgpCisgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tRm9ybWF0KCI8Q09NIG1ldGhvZCBvZmZzZXQgJWQ6ICVzIGF0ICVwPiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPmluZGV4IC0gMHgxMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9UWVBFKHNlbGYpLT50cF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmKTsKICNlbmRpZgotCXJldHVybiBQeVN0cmluZ19Gcm9tRm9ybWF0KCI8JXMgb2JqZWN0IGF0ICVwPiIsCi0JCQkJICAgUHlfVFlQRShzZWxmKS0+dHBfbmFtZSwKLQkJCQkgICBzZWxmKTsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbUZvcm1hdCgiPCVzIG9iamVjdCBhdCAlcD4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X1RZUEUoc2VsZiktPnRwX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZik7CiB9CiAKIHN0YXRpYyBpbnQKIENGdW5jUHRyX25vbnplcm8oQ0Z1bmNQdHJPYmplY3QgKnNlbGYpCiB7Ci0JcmV0dXJuICgoKih2b2lkICoqKXNlbGYtPmJfcHRyICE9IE5VTEwpCisgICAgcmV0dXJuICgoKih2b2lkICoqKXNlbGYtPmJfcHRyICE9IE5VTEwpCiAjaWZkZWYgTVNfV0lOMzIKLQkJfHwgKHNlbGYtPmluZGV4ICE9IDApCisgICAgICAgIHx8IChzZWxmLT5pbmRleCAhPSAwKQogI2VuZGlmCi0JCSk7CisgICAgICAgICk7CiB9CiAKIHN0YXRpYyBQeU51bWJlck1ldGhvZHMgQ0Z1bmNQdHJfYXNfbnVtYmVyID0gewotCTAsIC8qIG5iX2FkZCAqLwotCTAsIC8qIG5iX3N1YnRyYWN0ICovCi0JMCwgLyogbmJfbXVsdGlwbHkgKi8KLQkwLCAvKiBuYl9kaXZpZGUgKi8KLQkwLCAvKiBuYl9yZW1haW5kZXIgKi8KLQkwLCAvKiBuYl9kaXZtb2QgKi8KLQkwLCAvKiBuYl9wb3dlciAqLwotCTAsIC8qIG5iX25lZ2F0aXZlICovCi0JMCwgLyogbmJfcG9zaXRpdmUgKi8KLQkwLCAvKiBuYl9hYnNvbHV0ZSAqLwotCShpbnF1aXJ5KUNGdW5jUHRyX25vbnplcm8sIC8qIG5iX25vbnplcm8gKi8KKyAgICAwLCAvKiBuYl9hZGQgKi8KKyAgICAwLCAvKiBuYl9zdWJ0cmFjdCAqLworICAgIDAsIC8qIG5iX211bHRpcGx5ICovCisgICAgMCwgLyogbmJfZGl2aWRlICovCisgICAgMCwgLyogbmJfcmVtYWluZGVyICovCisgICAgMCwgLyogbmJfZGl2bW9kICovCisgICAgMCwgLyogbmJfcG93ZXIgKi8KKyAgICAwLCAvKiBuYl9uZWdhdGl2ZSAqLworICAgIDAsIC8qIG5iX3Bvc2l0aXZlICovCisgICAgMCwgLyogbmJfYWJzb2x1dGUgKi8KKyAgICAoaW5xdWlyeSlDRnVuY1B0cl9ub256ZXJvLCAvKiBuYl9ub256ZXJvICovCiB9OwogCiBQeVR5cGVPYmplY3QgQ0Z1bmNQdHJfVHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKLQkiX2N0eXBlcy5DRnVuY1B0ciIsCi0Jc2l6ZW9mKENGdW5jUHRyT2JqZWN0KSwJCQkvKiB0cF9iYXNpY3NpemUgKi8KLQkwLAkJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkoZGVzdHJ1Y3RvcilDRnVuY1B0cl9kZWFsbG9jLAkJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfY29tcGFyZSAqLwotCShyZXByZnVuYylDRnVuY1B0cl9yZXByLAkJLyogdHBfcmVwciAqLwotCSZDRnVuY1B0cl9hc19udW1iZXIsCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkJLyogdHBfaGFzaCAqLwotCSh0ZXJuYXJ5ZnVuYylDRnVuY1B0cl9jYWxsLAkJLyogdHBfY2FsbCAqLwotCTAsCQkJCQkvKiB0cF9zdHIgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkmQ0RhdGFfYXNfYnVmZmVyLAkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9ORVdCVUZGRVIgfCBQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCSJGdW5jdGlvbiBQb2ludGVyIiwJCQkvKiB0cF9kb2MgKi8KLQkodHJhdmVyc2Vwcm9jKUNGdW5jUHRyX3RyYXZlcnNlLAkvKiB0cF90cmF2ZXJzZSAqLwotCShpbnF1aXJ5KUNGdW5jUHRyX2NsZWFyLAkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaXRlciAqLwotCTAsCQkJCQkvKiB0cF9pdGVybmV4dCAqLwotCTAsCQkJCQkvKiB0cF9tZXRob2RzICovCi0JMCwJCQkJCS8qIHRwX21lbWJlcnMgKi8KLQlDRnVuY1B0cl9nZXRzZXRzLAkJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJCS8qIHRwX2RpY3QgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2luaXQgKi8KLQkwLAkJCQkJLyogdHBfYWxsb2MgKi8KLSAgICAgICAgQ0Z1bmNQdHJfbmV3LAkJCQkvKiB0cF9uZXcgKi8KLQkwLAkJCQkJLyogdHBfZnJlZSAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQorICAgICJfY3R5cGVzLkNGdW5jUHRyIiwKKyAgICBzaXplb2YoQ0Z1bmNQdHJPYmplY3QpLCAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAoZGVzdHJ1Y3RvcilDRnVuY1B0cl9kZWFsbG9jLCAgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgKHJlcHJmdW5jKUNGdW5jUHRyX3JlcHIsICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgJkNGdW5jUHRyX2FzX251bWJlciwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgKHRlcm5hcnlmdW5jKUNGdW5jUHRyX2NhbGwsICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgICZDRGF0YV9hc19idWZmZXIsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX05FV0JVRkZFUiB8IFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgIkZ1bmN0aW9uIFBvaW50ZXIiLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAodHJhdmVyc2Vwcm9jKUNGdW5jUHRyX3RyYXZlcnNlLCAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgKGlucXVpcnkpQ0Z1bmNQdHJfY2xlYXIsICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIENGdW5jUHRyX2dldHNldHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBDRnVuY1B0cl9uZXcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKLQwKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKICAgU3RydWN0X1R5cGUKQEAgLTQwMjIsNjEgKzQwMjIsNjEgQEAKICAqLwogc3RhdGljIGludAogX2luaXRfcG9zX2FyZ3MoUHlPYmplY3QgKnNlbGYsIFB5VHlwZU9iamVjdCAqdHlwZSwKLQkgICAgICAgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzLAotCSAgICAgICBpbnQgaW5kZXgpCisgICAgICAgICAgICAgICBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMsCisgICAgICAgICAgICAgICBpbnQgaW5kZXgpCiB7Ci0JU3RnRGljdE9iamVjdCAqZGljdDsKLQlQeU9iamVjdCAqZmllbGRzOwotCWludCBpOworICAgIFN0Z0RpY3RPYmplY3QgKmRpY3Q7CisgICAgUHlPYmplY3QgKmZpZWxkczsKKyAgICBpbnQgaTsKIAotCWlmIChQeVR5cGVfc3RnZGljdCgoUHlPYmplY3QgKil0eXBlLT50cF9iYXNlKSkgewotCQlpbmRleCA9IF9pbml0X3Bvc19hcmdzKHNlbGYsIHR5cGUtPnRwX2Jhc2UsCi0JCQkJICAgICAgIGFyZ3MsIGt3ZHMsCi0JCQkJICAgICAgIGluZGV4KTsKLQkJaWYgKGluZGV4ID09IC0xKQotCQkJcmV0dXJuIC0xOwotCX0KKyAgICBpZiAoUHlUeXBlX3N0Z2RpY3QoKFB5T2JqZWN0ICopdHlwZS0+dHBfYmFzZSkpIHsKKyAgICAgICAgaW5kZXggPSBfaW5pdF9wb3NfYXJncyhzZWxmLCB0eXBlLT50cF9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MsIGt3ZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgpOworICAgICAgICBpZiAoaW5kZXggPT0gLTEpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JZGljdCA9IFB5VHlwZV9zdGdkaWN0KChQeU9iamVjdCAqKXR5cGUpOwotCWZpZWxkcyA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKChQeU9iamVjdCAqKWRpY3QsICJfZmllbGRzXyIpOwotCWlmIChmaWVsZHMgPT0gTlVMTCkKLQkJcmV0dXJuIGluZGV4OworICAgIGRpY3QgPSBQeVR5cGVfc3RnZGljdCgoUHlPYmplY3QgKil0eXBlKTsKKyAgICBmaWVsZHMgPSBQeURpY3RfR2V0SXRlbVN0cmluZygoUHlPYmplY3QgKilkaWN0LCAiX2ZpZWxkc18iKTsKKyAgICBpZiAoZmllbGRzID09IE5VTEwpCisgICAgICAgIHJldHVybiBpbmRleDsKIAotCWZvciAoaSA9IDA7Ci0JICAgICBpIDwgZGljdC0+bGVuZ3RoICYmIChpK2luZGV4KSA8IFB5VHVwbGVfR0VUX1NJWkUoYXJncyk7Ci0JICAgICArK2kpIHsKLQkJUHlPYmplY3QgKnBhaXIgPSBQeVNlcXVlbmNlX0dldEl0ZW0oZmllbGRzLCBpKTsKLQkJUHlPYmplY3QgKm5hbWUsICp2YWw7Ci0JCWludCByZXM7Ci0JCWlmICghcGFpcikKLQkJCXJldHVybiAtMTsKLQkJbmFtZSA9IFB5U2VxdWVuY2VfR2V0SXRlbShwYWlyLCAwKTsKLQkJaWYgKCFuYW1lKSB7Ci0JCQlQeV9ERUNSRUYocGFpcik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJdmFsID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCBpICsgaW5kZXgpOwotCQlpZiAoa3dkcyAmJiBQeURpY3RfR2V0SXRlbShrd2RzLCBuYW1lKSkgewotCQkJY2hhciAqZmllbGQgPSBQeVN0cmluZ19Bc1N0cmluZyhuYW1lKTsKLQkJCWlmIChmaWVsZCA9PSBOVUxMKSB7Ci0JCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCQlmaWVsZCA9ICI/Pz8iOwotCQkJfQotCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCQkgICAgICJkdXBsaWNhdGUgdmFsdWVzIGZvciBmaWVsZCAnJXMnIiwKLQkJCQkgICAgIGZpZWxkKTsKLQkJCVB5X0RFQ1JFRihwYWlyKTsKLQkJCVB5X0RFQ1JFRihuYW1lKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQkKLQkJcmVzID0gUHlPYmplY3RfU2V0QXR0cihzZWxmLCBuYW1lLCB2YWwpOwotCQlQeV9ERUNSRUYocGFpcik7Ci0JCVB5X0RFQ1JFRihuYW1lKTsKLQkJaWYgKHJlcyA9PSAtMSkKLQkJCXJldHVybiAtMTsKLQl9Ci0JcmV0dXJuIGluZGV4ICsgZGljdC0+bGVuZ3RoOworICAgIGZvciAoaSA9IDA7CisgICAgICAgICBpIDwgZGljdC0+bGVuZ3RoICYmIChpK2luZGV4KSA8IFB5VHVwbGVfR0VUX1NJWkUoYXJncyk7CisgICAgICAgICArK2kpIHsKKyAgICAgICAgUHlPYmplY3QgKnBhaXIgPSBQeVNlcXVlbmNlX0dldEl0ZW0oZmllbGRzLCBpKTsKKyAgICAgICAgUHlPYmplY3QgKm5hbWUsICp2YWw7CisgICAgICAgIGludCByZXM7CisgICAgICAgIGlmICghcGFpcikKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgbmFtZSA9IFB5U2VxdWVuY2VfR2V0SXRlbShwYWlyLCAwKTsKKyAgICAgICAgaWYgKCFuYW1lKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYocGFpcik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgdmFsID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCBpICsgaW5kZXgpOworICAgICAgICBpZiAoa3dkcyAmJiBQeURpY3RfR2V0SXRlbShrd2RzLCBuYW1lKSkgeworICAgICAgICAgICAgY2hhciAqZmllbGQgPSBQeVN0cmluZ19Bc1N0cmluZyhuYW1lKTsKKyAgICAgICAgICAgIGlmIChmaWVsZCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgICAgICBmaWVsZCA9ICI/Pz8iOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiZHVwbGljYXRlIHZhbHVlcyBmb3IgZmllbGQgJyVzJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQpOworICAgICAgICAgICAgUHlfREVDUkVGKHBhaXIpOworICAgICAgICAgICAgUHlfREVDUkVGKG5hbWUpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgcmVzID0gUHlPYmplY3RfU2V0QXR0cihzZWxmLCBuYW1lLCB2YWwpOworICAgICAgICBQeV9ERUNSRUYocGFpcik7CisgICAgICAgIFB5X0RFQ1JFRihuYW1lKTsKKyAgICAgICAgaWYgKHJlcyA9PSAtMSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIGluZGV4ICsgZGljdC0+bGVuZ3RoOwogfQogCiBzdGF0aWMgaW50CkBAIC00MDg1LDExOSArNDA4NSwxMTkgQEAKIC8qIE9wdGltaXphdGlvbiBwb3NzaWJsZTogU3RvcmUgdGhlIGF0dHJpYnV0ZSBuYW1lcyBfZmllbGRzX1t4XVswXQogICogaW4gQyBhY2Nlc3NpYmxlIGZpZWxkcyBzb21ld2hlcmUgPwogICovCi0JaWYgKCFQeVR1cGxlX0NoZWNrKGFyZ3MpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJImFyZ3Mgbm90IGEgdHVwbGU/Iik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKFB5VHVwbGVfR0VUX1NJWkUoYXJncykpIHsKLQkJaW50IHJlcyA9IF9pbml0X3Bvc19hcmdzKHNlbGYsIFB5X1RZUEUoc2VsZiksCi0JCQkJCSBhcmdzLCBrd2RzLCAwKTsKLQkJaWYgKHJlcyA9PSAtMSkKLQkJCXJldHVybiAtMTsKLQkJaWYgKHJlcyA8IFB5VHVwbGVfR0VUX1NJWkUoYXJncykpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJCSJ0b28gbWFueSBpbml0aWFsaXplcnMiKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCX0KKyAgICBpZiAoIVB5VHVwbGVfQ2hlY2soYXJncykpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJhcmdzIG5vdCBhIHR1cGxlPyIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpKSB7CisgICAgICAgIGludCByZXMgPSBfaW5pdF9wb3NfYXJncyhzZWxmLCBQeV9UWVBFKHNlbGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncywga3dkcywgMCk7CisgICAgICAgIGlmIChyZXMgPT0gLTEpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmIChyZXMgPCBQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0b28gbWFueSBpbml0aWFsaXplcnMiKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KIAotCWlmIChrd2RzKSB7Ci0JCVB5T2JqZWN0ICprZXksICp2YWx1ZTsKLQkJUHlfc3NpemVfdCBwb3MgPSAwOwotCQl3aGlsZShQeURpY3RfTmV4dChrd2RzLCAmcG9zLCAma2V5LCAmdmFsdWUpKSB7Ci0JCQlpZiAoLTEgPT0gUHlPYmplY3RfU2V0QXR0cihzZWxmLCBrZXksIHZhbHVlKSkKLQkJCQlyZXR1cm4gLTE7Ci0JCX0KLQl9Ci0JcmV0dXJuIDA7CisgICAgaWYgKGt3ZHMpIHsKKyAgICAgICAgUHlPYmplY3QgKmtleSwgKnZhbHVlOworICAgICAgICBQeV9zc2l6ZV90IHBvcyA9IDA7CisgICAgICAgIHdoaWxlKFB5RGljdF9OZXh0KGt3ZHMsICZwb3MsICZrZXksICZ2YWx1ZSkpIHsKKyAgICAgICAgICAgIGlmICgtMSA9PSBQeU9iamVjdF9TZXRBdHRyKHNlbGYsIGtleSwgdmFsdWUpKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5VHlwZU9iamVjdCBTdHJ1Y3RfVHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKLQkiX2N0eXBlcy5TdHJ1Y3R1cmUiLAotCXNpemVvZihDRGF0YU9iamVjdCksCQkJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJCS8qIHRwX2l0ZW1zaXplICovCi0JMCwJCQkJCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfcmVwciAqLwotCTAsCQkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkJLyogdHBfc3RyICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHJvICovCi0JJkNEYXRhX2FzX2J1ZmZlciwJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfTkVXQlVGRkVSIHwgUHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQkiU3RydWN0dXJlIGJhc2UgY2xhc3MiLAkJCS8qIHRwX2RvYyAqLwotCSh0cmF2ZXJzZXByb2MpQ0RhdGFfdHJhdmVyc2UsCQkvKiB0cF90cmF2ZXJzZSAqLwotCShpbnF1aXJ5KUNEYXRhX2NsZWFyLAkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkJLyogdHBfaXRlcm5leHQgKi8KLQkwLAkJCQkJLyogdHBfbWV0aG9kcyAqLwotCTAsCQkJCQkvKiB0cF9tZW1iZXJzICovCi0JMCwJCQkJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJCS8qIHRwX2RpY3QgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCi0JU3RydWN0X2luaXQsCQkJCS8qIHRwX2luaXQgKi8KLQkwLAkJCQkJLyogdHBfYWxsb2MgKi8KLQlHZW5lcmljQ0RhdGFfbmV3LAkJCS8qIHRwX25ldyAqLwotCTAsCQkJCQkvKiB0cF9mcmVlICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisgICAgIl9jdHlwZXMuU3RydWN0dXJlIiwKKyAgICBzaXplb2YoQ0RhdGFPYmplY3QpLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgICZDRGF0YV9hc19idWZmZXIsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX05FV0JVRkZFUiB8IFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgIlN0cnVjdHVyZSBiYXNlIGNsYXNzIiwgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAodHJhdmVyc2Vwcm9jKUNEYXRhX3RyYXZlcnNlLCAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgKGlucXVpcnkpQ0RhdGFfY2xlYXIsICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIFN0cnVjdF9pbml0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBHZW5lcmljQ0RhdGFfbmV3LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBVbmlvbl9UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotCSJfY3R5cGVzLlVuaW9uIiwKLQlzaXplb2YoQ0RhdGFPYmplY3QpLAkJCS8qIHRwX2Jhc2ljc2l6ZSAqLwotCTAsCQkJCQkvKiB0cF9pdGVtc2l6ZSAqLwotCTAsCQkJCQkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9jb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJCS8qIHRwX3N0ciAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRybyAqLwotCSZDRGF0YV9hc19idWZmZXIsCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX05FV0JVRkZFUiB8IFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCi0JIlVuaW9uIGJhc2UgY2xhc3MiLAkJCS8qIHRwX2RvYyAqLwotCSh0cmF2ZXJzZXByb2MpQ0RhdGFfdHJhdmVyc2UsCQkvKiB0cF90cmF2ZXJzZSAqLwotCShpbnF1aXJ5KUNEYXRhX2NsZWFyLAkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkJLyogdHBfaXRlcm5leHQgKi8KLQkwLAkJCQkJLyogdHBfbWV0aG9kcyAqLwotCTAsCQkJCQkvKiB0cF9tZW1iZXJzICovCi0JMCwJCQkJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJCS8qIHRwX2RpY3QgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCi0JU3RydWN0X2luaXQsCQkJCS8qIHRwX2luaXQgKi8KLQkwLAkJCQkJLyogdHBfYWxsb2MgKi8KLQlHZW5lcmljQ0RhdGFfbmV3LAkJCS8qIHRwX25ldyAqLwotCTAsCQkJCQkvKiB0cF9mcmVlICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisgICAgIl9jdHlwZXMuVW5pb24iLAorICAgIHNpemVvZihDRGF0YU9iamVjdCksICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgJkNEYXRhX2FzX2J1ZmZlciwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfTkVXQlVGRkVSIHwgUHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KKyAgICAiVW5pb24gYmFzZSBjbGFzcyIsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2MpQ0RhdGFfdHJhdmVyc2UsICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAoaW5xdWlyeSlDRGF0YV9jbGVhciwgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgU3RydWN0X2luaXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIEdlbmVyaWNDRGF0YV9uZXcsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCiB9OwogCi0MCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgogICBBcnJheV9UeXBlCkBAIC00MjA1LDQ2MyArNDIwNSw0NjMgQEAKIHN0YXRpYyBpbnQKIEFycmF5X2luaXQoQ0RhdGFPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3cpCiB7Ci0JUHlfc3NpemVfdCBpOwotCVB5X3NzaXplX3QgbjsKKyAgICBQeV9zc2l6ZV90IGk7CisgICAgUHlfc3NpemVfdCBuOwogCi0JaWYgKCFQeVR1cGxlX0NoZWNrKGFyZ3MpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJImFyZ3Mgbm90IGEgdHVwbGU/Iik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JbiA9IFB5VHVwbGVfR0VUX1NJWkUoYXJncyk7Ci0JZm9yIChpID0gMDsgaSA8IG47ICsraSkgewotCQlQeU9iamVjdCAqdjsKLQkJdiA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgaSk7Ci0JCWlmICgtMSA9PSBQeVNlcXVlbmNlX1NldEl0ZW0oKFB5T2JqZWN0ICopc2VsZiwgaSwgdikpCi0JCQlyZXR1cm4gLTE7Ci0JfQotCXJldHVybiAwOworICAgIGlmICghUHlUdXBsZV9DaGVjayhhcmdzKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImFyZ3Mgbm90IGEgdHVwbGU/Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbiA9IFB5VHVwbGVfR0VUX1NJWkUoYXJncyk7CisgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgeworICAgICAgICBQeU9iamVjdCAqdjsKKyAgICAgICAgdiA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgaSk7CisgICAgICAgIGlmICgtMSA9PSBQeVNlcXVlbmNlX1NldEl0ZW0oKFB5T2JqZWN0ICopc2VsZiwgaSwgdikpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogQXJyYXlfaXRlbShQeU9iamVjdCAqX3NlbGYsIFB5X3NzaXplX3QgaW5kZXgpCiB7Ci0JQ0RhdGFPYmplY3QgKnNlbGYgPSAoQ0RhdGFPYmplY3QgKilfc2VsZjsKLQlQeV9zc2l6ZV90IG9mZnNldCwgc2l6ZTsKLQlTdGdEaWN0T2JqZWN0ICpzdGdkaWN0OworICAgIENEYXRhT2JqZWN0ICpzZWxmID0gKENEYXRhT2JqZWN0ICopX3NlbGY7CisgICAgUHlfc3NpemVfdCBvZmZzZXQsIHNpemU7CisgICAgU3RnRGljdE9iamVjdCAqc3RnZGljdDsKIAogCi0JaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBzZWxmLT5iX2xlbmd0aCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwKLQkJCQkiaW52YWxpZCBpbmRleCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBzZWxmLT5iX2xlbmd0aCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIGluZGV4Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXN0Z2RpY3QgPSBQeU9iamVjdF9zdGdkaWN0KChQeU9iamVjdCAqKXNlbGYpOwotCWFzc2VydChzdGdkaWN0KTsgLyogQ2Fubm90IGJlIE5VTEwgZm9yIGFycmF5IGluc3RhbmNlcyAqLwotCS8qIFdvdWxkIGl0IGJlIGNsZWFyZXIgaWYgd2UgZ290IHRoZSBpdGVtIHNpemUgZnJvbQotCSAgIHN0Z2RpY3QtPnByb3RvJ3Mgc3RnZGljdD8KLQkqLwotCXNpemUgPSBzdGdkaWN0LT5zaXplIC8gc3RnZGljdC0+bGVuZ3RoOwotCW9mZnNldCA9IGluZGV4ICogc2l6ZTsKKyAgICBzdGdkaWN0ID0gUHlPYmplY3Rfc3RnZGljdCgoUHlPYmplY3QgKilzZWxmKTsKKyAgICBhc3NlcnQoc3RnZGljdCk7IC8qIENhbm5vdCBiZSBOVUxMIGZvciBhcnJheSBpbnN0YW5jZXMgKi8KKyAgICAvKiBXb3VsZCBpdCBiZSBjbGVhcmVyIGlmIHdlIGdvdCB0aGUgaXRlbSBzaXplIGZyb20KKyAgICAgICBzdGdkaWN0LT5wcm90bydzIHN0Z2RpY3Q/CisgICAgKi8KKyAgICBzaXplID0gc3RnZGljdC0+c2l6ZSAvIHN0Z2RpY3QtPmxlbmd0aDsKKyAgICBvZmZzZXQgPSBpbmRleCAqIHNpemU7CiAKLQlyZXR1cm4gQ0RhdGFfZ2V0KHN0Z2RpY3QtPnByb3RvLCBzdGdkaWN0LT5nZXRmdW5jLCAoUHlPYmplY3QgKilzZWxmLAotCQkJIGluZGV4LCBzaXplLCBzZWxmLT5iX3B0ciArIG9mZnNldCk7CisgICAgcmV0dXJuIENEYXRhX2dldChzdGdkaWN0LT5wcm90bywgc3RnZGljdC0+Z2V0ZnVuYywgKFB5T2JqZWN0ICopc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgIGluZGV4LCBzaXplLCBzZWxmLT5iX3B0ciArIG9mZnNldCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBBcnJheV9zbGljZShQeU9iamVjdCAqX3NlbGYsIFB5X3NzaXplX3QgaWxvdywgUHlfc3NpemVfdCBpaGlnaCkKIHsKLQlDRGF0YU9iamVjdCAqc2VsZiA9IChDRGF0YU9iamVjdCAqKV9zZWxmOwotCVN0Z0RpY3RPYmplY3QgKnN0Z2RpY3QsICppdGVtZGljdDsKLQlQeU9iamVjdCAqcHJvdG87Ci0JUHlMaXN0T2JqZWN0ICpucDsKLQlQeV9zc2l6ZV90IGksIGxlbjsKKyAgICBDRGF0YU9iamVjdCAqc2VsZiA9IChDRGF0YU9iamVjdCAqKV9zZWxmOworICAgIFN0Z0RpY3RPYmplY3QgKnN0Z2RpY3QsICppdGVtZGljdDsKKyAgICBQeU9iamVjdCAqcHJvdG87CisgICAgUHlMaXN0T2JqZWN0ICpucDsKKyAgICBQeV9zc2l6ZV90IGksIGxlbjsKIAotCWlmIChpbG93IDwgMCkKLQkJaWxvdyA9IDA7Ci0JZWxzZSBpZiAoaWxvdyA+IHNlbGYtPmJfbGVuZ3RoKQotCQlpbG93ID0gc2VsZi0+Yl9sZW5ndGg7Ci0JaWYgKGloaWdoIDwgaWxvdykKLQkJaWhpZ2ggPSBpbG93OwotCWVsc2UgaWYgKGloaWdoID4gc2VsZi0+Yl9sZW5ndGgpCi0JCWloaWdoID0gc2VsZi0+Yl9sZW5ndGg7Ci0JbGVuID0gaWhpZ2ggLSBpbG93OworICAgIGlmIChpbG93IDwgMCkKKyAgICAgICAgaWxvdyA9IDA7CisgICAgZWxzZSBpZiAoaWxvdyA+IHNlbGYtPmJfbGVuZ3RoKQorICAgICAgICBpbG93ID0gc2VsZi0+Yl9sZW5ndGg7CisgICAgaWYgKGloaWdoIDwgaWxvdykKKyAgICAgICAgaWhpZ2ggPSBpbG93OworICAgIGVsc2UgaWYgKGloaWdoID4gc2VsZi0+Yl9sZW5ndGgpCisgICAgICAgIGloaWdoID0gc2VsZi0+Yl9sZW5ndGg7CisgICAgbGVuID0gaWhpZ2ggLSBpbG93OwogCi0Jc3RnZGljdCA9IFB5T2JqZWN0X3N0Z2RpY3QoKFB5T2JqZWN0ICopc2VsZik7Ci0JYXNzZXJ0KHN0Z2RpY3QpOyAvKiBDYW5ub3QgYmUgTlVMTCBmb3IgYXJyYXkgb2JqZWN0IGluc3RhbmNlcyAqLwotCXByb3RvID0gc3RnZGljdC0+cHJvdG87Ci0JaXRlbWRpY3QgPSBQeVR5cGVfc3RnZGljdChwcm90byk7Ci0JYXNzZXJ0KGl0ZW1kaWN0KTsgLyogcHJvdG8gaXMgdGhlIGl0ZW0gdHlwZSBvZiB0aGUgYXJyYXksIGEgY3R5cGVzCi0JCQkgICAgIHR5cGUsIHNvIHRoaXMgY2Fubm90IGJlIE5VTEwgKi8KLQlpZiAoaXRlbWRpY3QtPmdldGZ1bmMgPT0gZ2V0ZW50cnkoImMiKS0+Z2V0ZnVuYykgewotCQljaGFyICpwdHIgPSAoY2hhciAqKXNlbGYtPmJfcHRyOwotCQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocHRyICsgaWxvdywgbGVuKTsKKyAgICBzdGdkaWN0ID0gUHlPYmplY3Rfc3RnZGljdCgoUHlPYmplY3QgKilzZWxmKTsKKyAgICBhc3NlcnQoc3RnZGljdCk7IC8qIENhbm5vdCBiZSBOVUxMIGZvciBhcnJheSBvYmplY3QgaW5zdGFuY2VzICovCisgICAgcHJvdG8gPSBzdGdkaWN0LT5wcm90bzsKKyAgICBpdGVtZGljdCA9IFB5VHlwZV9zdGdkaWN0KHByb3RvKTsKKyAgICBhc3NlcnQoaXRlbWRpY3QpOyAvKiBwcm90byBpcyB0aGUgaXRlbSB0eXBlIG9mIHRoZSBhcnJheSwgYSBjdHlwZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLCBzbyB0aGlzIGNhbm5vdCBiZSBOVUxMICovCisgICAgaWYgKGl0ZW1kaWN0LT5nZXRmdW5jID09IGdldGVudHJ5KCJjIiktPmdldGZ1bmMpIHsKKyAgICAgICAgY2hhciAqcHRyID0gKGNoYXIgKilzZWxmLT5iX3B0cjsKKyAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHB0ciArIGlsb3csIGxlbik7CiAjaWZkZWYgQ1RZUEVTX1VOSUNPREUKLQl9IGVsc2UgaWYgKGl0ZW1kaWN0LT5nZXRmdW5jID09IGdldGVudHJ5KCJ1IiktPmdldGZ1bmMpIHsKLQkJd2NoYXJfdCAqcHRyID0gKHdjaGFyX3QgKilzZWxmLT5iX3B0cjsKLQkJcmV0dXJuIFB5VW5pY29kZV9Gcm9tV2lkZUNoYXIocHRyICsgaWxvdywgbGVuKTsKKyAgICB9IGVsc2UgaWYgKGl0ZW1kaWN0LT5nZXRmdW5jID09IGdldGVudHJ5KCJ1IiktPmdldGZ1bmMpIHsKKyAgICAgICAgd2NoYXJfdCAqcHRyID0gKHdjaGFyX3QgKilzZWxmLT5iX3B0cjsKKyAgICAgICAgcmV0dXJuIFB5VW5pY29kZV9Gcm9tV2lkZUNoYXIocHRyICsgaWxvdywgbGVuKTsKICNlbmRpZgotCX0KKyAgICB9CiAKLQlucCA9IChQeUxpc3RPYmplY3QgKikgUHlMaXN0X05ldyhsZW4pOwotCWlmIChucCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBucCA9IChQeUxpc3RPYmplY3QgKikgUHlMaXN0X05ldyhsZW4pOworICAgIGlmIChucCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQlQeU9iamVjdCAqdiA9IEFycmF5X2l0ZW0oX3NlbGYsIGkraWxvdyk7Ci0JCVB5TGlzdF9TRVRfSVRFTShucCwgaSwgdik7Ci0JfQotCXJldHVybiAoUHlPYmplY3QgKilucDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgUHlPYmplY3QgKnYgPSBBcnJheV9pdGVtKF9zZWxmLCBpK2lsb3cpOworICAgICAgICBQeUxpc3RfU0VUX0lURU0obnAsIGksIHYpOworICAgIH0KKyAgICByZXR1cm4gKFB5T2JqZWN0ICopbnA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBBcnJheV9zdWJzY3JpcHQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqaXRlbSkKIHsKLQlDRGF0YU9iamVjdCAqc2VsZiA9IChDRGF0YU9iamVjdCAqKV9zZWxmOworICAgIENEYXRhT2JqZWN0ICpzZWxmID0gKENEYXRhT2JqZWN0ICopX3NlbGY7CiAKLQlpZiAoUHlJbmRleF9DaGVjayhpdGVtKSkgewotCQlQeV9zc2l6ZV90IGkgPSBQeU51bWJlcl9Bc1NzaXplX3QoaXRlbSwgUHlFeGNfSW5kZXhFcnJvcik7Ci0JCQotCQlpZiAoaSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWlmIChpIDwgMCkKLQkJCWkgKz0gc2VsZi0+Yl9sZW5ndGg7Ci0JCXJldHVybiBBcnJheV9pdGVtKF9zZWxmLCBpKTsKLQl9Ci0JZWxzZSBpZiBQeVNsaWNlX0NoZWNrKGl0ZW0pIHsKLQkJU3RnRGljdE9iamVjdCAqc3RnZGljdCwgKml0ZW1kaWN0OwotCQlQeU9iamVjdCAqcHJvdG87Ci0JCVB5T2JqZWN0ICpucDsKLQkJUHlfc3NpemVfdCBzdGFydCwgc3RvcCwgc3RlcCwgc2xpY2VsZW4sIGN1ciwgaTsKLQkJCi0JCWlmIChQeVNsaWNlX0dldEluZGljZXNFeCgoUHlTbGljZU9iamVjdCAqKWl0ZW0sCi0JCQkJCSBzZWxmLT5iX2xlbmd0aCwgJnN0YXJ0LCAmc3RvcCwKLQkJCQkJICZzdGVwLCAmc2xpY2VsZW4pIDwgMCkgewotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJCi0JCXN0Z2RpY3QgPSBQeU9iamVjdF9zdGdkaWN0KChQeU9iamVjdCAqKXNlbGYpOwotCQlhc3NlcnQoc3RnZGljdCk7IC8qIENhbm5vdCBiZSBOVUxMIGZvciBhcnJheSBvYmplY3QgaW5zdGFuY2VzICovCi0JCXByb3RvID0gc3RnZGljdC0+cHJvdG87Ci0JCWl0ZW1kaWN0ID0gUHlUeXBlX3N0Z2RpY3QocHJvdG8pOwotCQlhc3NlcnQoaXRlbWRpY3QpOyAvKiBwcm90byBpcyB0aGUgaXRlbSB0eXBlIG9mIHRoZSBhcnJheSwgYQotCQkJCSAgICAgY3R5cGVzIHR5cGUsIHNvIHRoaXMgY2Fubm90IGJlIE5VTEwgKi8KKyAgICBpZiAoUHlJbmRleF9DaGVjayhpdGVtKSkgeworICAgICAgICBQeV9zc2l6ZV90IGkgPSBQeU51bWJlcl9Bc1NzaXplX3QoaXRlbSwgUHlFeGNfSW5kZXhFcnJvcik7CiAKLQkJaWYgKGl0ZW1kaWN0LT5nZXRmdW5jID09IGdldGVudHJ5KCJjIiktPmdldGZ1bmMpIHsKLQkJCWNoYXIgKnB0ciA9IChjaGFyICopc2VsZi0+Yl9wdHI7Ci0JCQljaGFyICpkZXN0OworICAgICAgICBpZiAoaSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGlmIChpIDwgMCkKKyAgICAgICAgICAgIGkgKz0gc2VsZi0+Yl9sZW5ndGg7CisgICAgICAgIHJldHVybiBBcnJheV9pdGVtKF9zZWxmLCBpKTsKKyAgICB9CisgICAgZWxzZSBpZiBQeVNsaWNlX0NoZWNrKGl0ZW0pIHsKKyAgICAgICAgU3RnRGljdE9iamVjdCAqc3RnZGljdCwgKml0ZW1kaWN0OworICAgICAgICBQeU9iamVjdCAqcHJvdG87CisgICAgICAgIFB5T2JqZWN0ICpucDsKKyAgICAgICAgUHlfc3NpemVfdCBzdGFydCwgc3RvcCwgc3RlcCwgc2xpY2VsZW4sIGN1ciwgaTsKIAotCQkJaWYgKHNsaWNlbGVuIDw9IDApCi0JCQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoIiIpOwotCQkJaWYgKHN0ZXAgPT0gMSkgewotCQkJCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShwdHIgKyBzdGFydCwKLQkJCQkJCQkJICBzbGljZWxlbik7Ci0JCQl9Ci0JCQlkZXN0ID0gKGNoYXIgKilQeU1lbV9NYWxsb2Moc2xpY2VsZW4pOworICAgICAgICBpZiAoUHlTbGljZV9HZXRJbmRpY2VzRXgoKFB5U2xpY2VPYmplY3QgKilpdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+Yl9sZW5ndGgsICZzdGFydCwgJnN0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RlcCwgJnNsaWNlbGVuKSA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CiAKLQkJCWlmIChkZXN0ID09IE5VTEwpCi0JCQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIHN0Z2RpY3QgPSBQeU9iamVjdF9zdGdkaWN0KChQeU9iamVjdCAqKXNlbGYpOworICAgICAgICBhc3NlcnQoc3RnZGljdCk7IC8qIENhbm5vdCBiZSBOVUxMIGZvciBhcnJheSBvYmplY3QgaW5zdGFuY2VzICovCisgICAgICAgIHByb3RvID0gc3RnZGljdC0+cHJvdG87CisgICAgICAgIGl0ZW1kaWN0ID0gUHlUeXBlX3N0Z2RpY3QocHJvdG8pOworICAgICAgICBhc3NlcnQoaXRlbWRpY3QpOyAvKiBwcm90byBpcyB0aGUgaXRlbSB0eXBlIG9mIHRoZSBhcnJheSwgYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHlwZXMgdHlwZSwgc28gdGhpcyBjYW5ub3QgYmUgTlVMTCAqLwogCi0JCQlmb3IgKGN1ciA9IHN0YXJ0LCBpID0gMDsgaSA8IHNsaWNlbGVuOwotCQkJICAgICBjdXIgKz0gc3RlcCwgaSsrKSB7Ci0JCQkJZGVzdFtpXSA9IHB0cltjdXJdOwotCQkJfQorICAgICAgICBpZiAoaXRlbWRpY3QtPmdldGZ1bmMgPT0gZ2V0ZW50cnkoImMiKS0+Z2V0ZnVuYykgeworICAgICAgICAgICAgY2hhciAqcHRyID0gKGNoYXIgKilzZWxmLT5iX3B0cjsKKyAgICAgICAgICAgIGNoYXIgKmRlc3Q7CiAKLQkJCW5wID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoZGVzdCwgc2xpY2VsZW4pOwotCQkJUHlNZW1fRnJlZShkZXN0KTsKLQkJCXJldHVybiBucDsKLQkJfQorICAgICAgICAgICAgaWYgKHNsaWNlbGVuIDw9IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoIiIpOworICAgICAgICAgICAgaWYgKHN0ZXAgPT0gMSkgeworICAgICAgICAgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShwdHIgKyBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xpY2VsZW4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVzdCA9IChjaGFyICopUHlNZW1fTWFsbG9jKHNsaWNlbGVuKTsKKworICAgICAgICAgICAgaWYgKGRlc3QgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKworICAgICAgICAgICAgZm9yIChjdXIgPSBzdGFydCwgaSA9IDA7IGkgPCBzbGljZWxlbjsKKyAgICAgICAgICAgICAgICAgY3VyICs9IHN0ZXAsIGkrKykgeworICAgICAgICAgICAgICAgIGRlc3RbaV0gPSBwdHJbY3VyXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbnAgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShkZXN0LCBzbGljZWxlbik7CisgICAgICAgICAgICBQeU1lbV9GcmVlKGRlc3QpOworICAgICAgICAgICAgcmV0dXJuIG5wOworICAgICAgICB9CiAjaWZkZWYgQ1RZUEVTX1VOSUNPREUKLQkJaWYgKGl0ZW1kaWN0LT5nZXRmdW5jID09IGdldGVudHJ5KCJ1IiktPmdldGZ1bmMpIHsKLQkJCXdjaGFyX3QgKnB0ciA9ICh3Y2hhcl90ICopc2VsZi0+Yl9wdHI7Ci0JCQl3Y2hhcl90ICpkZXN0OwotCQkJCi0JCQlpZiAoc2xpY2VsZW4gPD0gMCkKLQkJCQlyZXR1cm4gUHlVbmljb2RlX0Zyb21Vbmljb2RlKE5VTEwsIDApOwotCQkJaWYgKHN0ZXAgPT0gMSkgewotCQkJCXJldHVybiBQeVVuaWNvZGVfRnJvbVdpZGVDaGFyKHB0ciArIHN0YXJ0LAotCQkJCQkJCSAgICAgIHNsaWNlbGVuKTsKLQkJCX0KKyAgICAgICAgaWYgKGl0ZW1kaWN0LT5nZXRmdW5jID09IGdldGVudHJ5KCJ1IiktPmdldGZ1bmMpIHsKKyAgICAgICAgICAgIHdjaGFyX3QgKnB0ciA9ICh3Y2hhcl90ICopc2VsZi0+Yl9wdHI7CisgICAgICAgICAgICB3Y2hhcl90ICpkZXN0OwogCi0JCQlkZXN0ID0gKHdjaGFyX3QgKilQeU1lbV9NYWxsb2MoCi0JCQkJCQlzbGljZWxlbiAqIHNpemVvZih3Y2hhcl90KSk7Ci0JCQkKLQkJCWZvciAoY3VyID0gc3RhcnQsIGkgPSAwOyBpIDwgc2xpY2VsZW47Ci0JCQkgICAgIGN1ciArPSBzdGVwLCBpKyspIHsKLQkJCQlkZXN0W2ldID0gcHRyW2N1cl07Ci0JCQl9Ci0JCQkKLQkJCW5wID0gUHlVbmljb2RlX0Zyb21XaWRlQ2hhcihkZXN0LCBzbGljZWxlbik7Ci0JCQlQeU1lbV9GcmVlKGRlc3QpOwotCQkJcmV0dXJuIG5wOwotCQl9CisgICAgICAgICAgICBpZiAoc2xpY2VsZW4gPD0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gUHlVbmljb2RlX0Zyb21Vbmljb2RlKE5VTEwsIDApOworICAgICAgICAgICAgaWYgKHN0ZXAgPT0gMSkgeworICAgICAgICAgICAgICAgIHJldHVybiBQeVVuaWNvZGVfRnJvbVdpZGVDaGFyKHB0ciArIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsaWNlbGVuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZGVzdCA9ICh3Y2hhcl90ICopUHlNZW1fTWFsbG9jKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xpY2VsZW4gKiBzaXplb2Yod2NoYXJfdCkpOworCisgICAgICAgICAgICBmb3IgKGN1ciA9IHN0YXJ0LCBpID0gMDsgaSA8IHNsaWNlbGVuOworICAgICAgICAgICAgICAgICBjdXIgKz0gc3RlcCwgaSsrKSB7CisgICAgICAgICAgICAgICAgZGVzdFtpXSA9IHB0cltjdXJdOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBucCA9IFB5VW5pY29kZV9Gcm9tV2lkZUNoYXIoZGVzdCwgc2xpY2VsZW4pOworICAgICAgICAgICAgUHlNZW1fRnJlZShkZXN0KTsKKyAgICAgICAgICAgIHJldHVybiBucDsKKyAgICAgICAgfQogI2VuZGlmCiAKLQkJbnAgPSBQeUxpc3RfTmV3KHNsaWNlbGVuKTsKLQkJaWYgKG5wID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKKyAgICAgICAgbnAgPSBQeUxpc3RfTmV3KHNsaWNlbGVuKTsKKyAgICAgICAgaWYgKG5wID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKIAotCQlmb3IgKGN1ciA9IHN0YXJ0LCBpID0gMDsgaSA8IHNsaWNlbGVuOwotCQkgICAgIGN1ciArPSBzdGVwLCBpKyspIHsKLQkJCVB5T2JqZWN0ICp2ID0gQXJyYXlfaXRlbShfc2VsZiwgY3VyKTsKLQkJCVB5TGlzdF9TRVRfSVRFTShucCwgaSwgdik7Ci0JCX0KLQkJcmV0dXJuIG5wOwotCX0KLQllbHNlIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgCi0JCQkJImluZGljZXMgbXVzdCBiZSBpbnRlZ2VycyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgICAgIGZvciAoY3VyID0gc3RhcnQsIGkgPSAwOyBpIDwgc2xpY2VsZW47CisgICAgICAgICAgICAgY3VyICs9IHN0ZXAsIGkrKykgeworICAgICAgICAgICAgUHlPYmplY3QgKnYgPSBBcnJheV9pdGVtKF9zZWxmLCBjdXIpOworICAgICAgICAgICAgUHlMaXN0X1NFVF9JVEVNKG5wLCBpLCB2KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnA7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImluZGljZXMgbXVzdCBiZSBpbnRlZ2VycyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKIH0KIAogc3RhdGljIGludAogQXJyYXlfYXNzX2l0ZW0oUHlPYmplY3QgKl9zZWxmLCBQeV9zc2l6ZV90IGluZGV4LCBQeU9iamVjdCAqdmFsdWUpCiB7Ci0JQ0RhdGFPYmplY3QgKnNlbGYgPSAoQ0RhdGFPYmplY3QgKilfc2VsZjsKLQlQeV9zc2l6ZV90IHNpemUsIG9mZnNldDsKLQlTdGdEaWN0T2JqZWN0ICpzdGdkaWN0OwotCWNoYXIgKnB0cjsKKyAgICBDRGF0YU9iamVjdCAqc2VsZiA9IChDRGF0YU9iamVjdCAqKV9zZWxmOworICAgIFB5X3NzaXplX3Qgc2l6ZSwgb2Zmc2V0OworICAgIFN0Z0RpY3RPYmplY3QgKnN0Z2RpY3Q7CisgICAgY2hhciAqcHRyOwogCi0JaWYgKHZhbHVlID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiQXJyYXkgZG9lcyBub3Qgc3VwcG9ydCBpdGVtIGRlbGV0aW9uIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JCi0Jc3RnZGljdCA9IFB5T2JqZWN0X3N0Z2RpY3QoKFB5T2JqZWN0ICopc2VsZik7Ci0JYXNzZXJ0KHN0Z2RpY3QpOyAvKiBDYW5ub3QgYmUgTlVMTCBmb3IgYXJyYXkgb2JqZWN0IGluc3RhbmNlcyAqLwotCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gc3RnZGljdC0+bGVuZ3RoKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLAotCQkJCSJpbnZhbGlkIGluZGV4Iik7Ci0JCXJldHVybiAtMTsKLQl9Ci0Jc2l6ZSA9IHN0Z2RpY3QtPnNpemUgLyBzdGdkaWN0LT5sZW5ndGg7Ci0Jb2Zmc2V0ID0gaW5kZXggKiBzaXplOwotCXB0ciA9IHNlbGYtPmJfcHRyICsgb2Zmc2V0OworICAgIGlmICh2YWx1ZSA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiQXJyYXkgZG9lcyBub3Qgc3VwcG9ydCBpdGVtIGRlbGV0aW9uIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQlyZXR1cm4gQ0RhdGFfc2V0KChQeU9iamVjdCAqKXNlbGYsIHN0Z2RpY3QtPnByb3RvLCBzdGdkaWN0LT5zZXRmdW5jLCB2YWx1ZSwKLQkJCSBpbmRleCwgc2l6ZSwgcHRyKTsKKyAgICBzdGdkaWN0ID0gUHlPYmplY3Rfc3RnZGljdCgoUHlPYmplY3QgKilzZWxmKTsKKyAgICBhc3NlcnQoc3RnZGljdCk7IC8qIENhbm5vdCBiZSBOVUxMIGZvciBhcnJheSBvYmplY3QgaW5zdGFuY2VzICovCisgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBzdGdkaWN0LT5sZW5ndGgpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCBpbmRleCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHNpemUgPSBzdGdkaWN0LT5zaXplIC8gc3RnZGljdC0+bGVuZ3RoOworICAgIG9mZnNldCA9IGluZGV4ICogc2l6ZTsKKyAgICBwdHIgPSBzZWxmLT5iX3B0ciArIG9mZnNldDsKKworICAgIHJldHVybiBDRGF0YV9zZXQoKFB5T2JqZWN0ICopc2VsZiwgc3RnZGljdC0+cHJvdG8sIHN0Z2RpY3QtPnNldGZ1bmMsIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgaW5kZXgsIHNpemUsIHB0cik7CiB9CiAKIHN0YXRpYyBpbnQKIEFycmF5X2Fzc19zbGljZShQeU9iamVjdCAqX3NlbGYsIFB5X3NzaXplX3QgaWxvdywgUHlfc3NpemVfdCBpaGlnaCwgUHlPYmplY3QgKnZhbHVlKQogewotCUNEYXRhT2JqZWN0ICpzZWxmID0gKENEYXRhT2JqZWN0ICopX3NlbGY7Ci0JUHlfc3NpemVfdCBpLCBsZW47CisgICAgQ0RhdGFPYmplY3QgKnNlbGYgPSAoQ0RhdGFPYmplY3QgKilfc2VsZjsKKyAgICBQeV9zc2l6ZV90IGksIGxlbjsKIAotCWlmICh2YWx1ZSA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJIkFycmF5IGRvZXMgbm90IHN1cHBvcnQgaXRlbSBkZWxldGlvbiIpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIGlmICh2YWx1ZSA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiQXJyYXkgZG9lcyBub3Qgc3VwcG9ydCBpdGVtIGRlbGV0aW9uIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQlpZiAoaWxvdyA8IDApCi0JCWlsb3cgPSAwOwotCWVsc2UgaWYgKGlsb3cgPiBzZWxmLT5iX2xlbmd0aCkKLQkJaWxvdyA9IHNlbGYtPmJfbGVuZ3RoOwotCWlmIChpaGlnaCA8IDApCi0JCWloaWdoID0gMDsKLQlpZiAoaWhpZ2ggPCBpbG93KQotCQlpaGlnaCA9IGlsb3c7Ci0JZWxzZSBpZiAoaWhpZ2ggPiBzZWxmLT5iX2xlbmd0aCkKLQkJaWhpZ2ggPSBzZWxmLT5iX2xlbmd0aDsKKyAgICBpZiAoaWxvdyA8IDApCisgICAgICAgIGlsb3cgPSAwOworICAgIGVsc2UgaWYgKGlsb3cgPiBzZWxmLT5iX2xlbmd0aCkKKyAgICAgICAgaWxvdyA9IHNlbGYtPmJfbGVuZ3RoOworICAgIGlmIChpaGlnaCA8IDApCisgICAgICAgIGloaWdoID0gMDsKKyAgICBpZiAoaWhpZ2ggPCBpbG93KQorICAgICAgICBpaGlnaCA9IGlsb3c7CisgICAgZWxzZSBpZiAoaWhpZ2ggPiBzZWxmLT5iX2xlbmd0aCkKKyAgICAgICAgaWhpZ2ggPSBzZWxmLT5iX2xlbmd0aDsKIAotCWxlbiA9IFB5U2VxdWVuY2VfTGVuZ3RoKHZhbHVlKTsKLQlpZiAobGVuICE9IGloaWdoIC0gaWxvdykgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkiQ2FuIG9ubHkgYXNzaWduIHNlcXVlbmNlIG9mIHNhbWUgc2l6ZSIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQlQeU9iamVjdCAqaXRlbSA9IFB5U2VxdWVuY2VfR2V0SXRlbSh2YWx1ZSwgaSk7Ci0JCWludCByZXN1bHQ7Ci0JCWlmIChpdGVtID09IE5VTEwpCi0JCQlyZXR1cm4gLTE7Ci0JCXJlc3VsdCA9IEFycmF5X2Fzc19pdGVtKF9zZWxmLCBpK2lsb3csIGl0ZW0pOwotCQlQeV9ERUNSRUYoaXRlbSk7Ci0JCWlmIChyZXN1bHQgPT0gLTEpCi0JCQlyZXR1cm4gLTE7Ci0JfQotCXJldHVybiAwOworICAgIGxlbiA9IFB5U2VxdWVuY2VfTGVuZ3RoKHZhbHVlKTsKKyAgICBpZiAobGVuICE9IGloaWdoIC0gaWxvdykgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJDYW4gb25seSBhc3NpZ24gc2VxdWVuY2Ugb2Ygc2FtZSBzaXplIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgIFB5T2JqZWN0ICppdGVtID0gUHlTZXF1ZW5jZV9HZXRJdGVtKHZhbHVlLCBpKTsKKyAgICAgICAgaW50IHJlc3VsdDsKKyAgICAgICAgaWYgKGl0ZW0gPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgcmVzdWx0ID0gQXJyYXlfYXNzX2l0ZW0oX3NlbGYsIGkraWxvdywgaXRlbSk7CisgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSAtMSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIEFycmF5X2Fzc19zdWJzY3JpcHQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqaXRlbSwgUHlPYmplY3QgKnZhbHVlKQogewotCUNEYXRhT2JqZWN0ICpzZWxmID0gKENEYXRhT2JqZWN0ICopX3NlbGY7Ci0JCi0JaWYgKHZhbHVlID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiQXJyYXkgZG9lcyBub3Qgc3VwcG9ydCBpdGVtIGRlbGV0aW9uIik7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgQ0RhdGFPYmplY3QgKnNlbGYgPSAoQ0RhdGFPYmplY3QgKilfc2VsZjsKIAotCWlmIChQeUluZGV4X0NoZWNrKGl0ZW0pKSB7Ci0JCVB5X3NzaXplX3QgaSA9IFB5TnVtYmVyX0FzU3NpemVfdChpdGVtLCBQeUV4Y19JbmRleEVycm9yKTsKLQkJCi0JCWlmIChpID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCQlyZXR1cm4gLTE7Ci0JCWlmIChpIDwgMCkKLQkJCWkgKz0gc2VsZi0+Yl9sZW5ndGg7Ci0JCXJldHVybiBBcnJheV9hc3NfaXRlbShfc2VsZiwgaSwgdmFsdWUpOwotCX0KLQllbHNlIGlmIChQeVNsaWNlX0NoZWNrKGl0ZW0pKSB7Ci0JCVB5X3NzaXplX3Qgc3RhcnQsIHN0b3AsIHN0ZXAsIHNsaWNlbGVuLCBvdGhlcmxlbiwgaSwgY3VyOwotCQkKLQkJaWYgKFB5U2xpY2VfR2V0SW5kaWNlc0V4KChQeVNsaWNlT2JqZWN0ICopaXRlbSwKLQkJCQkJIHNlbGYtPmJfbGVuZ3RoLCAmc3RhcnQsICZzdG9wLAotCQkJCQkgJnN0ZXAsICZzbGljZWxlbikgPCAwKSB7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJaWYgKChzdGVwIDwgMCAmJiBzdGFydCA8IHN0b3ApIHx8Ci0JCSAgICAoc3RlcCA+IDAgJiYgc3RhcnQgPiBzdG9wKSkKLQkJCXN0b3AgPSBzdGFydDsKKyAgICBpZiAodmFsdWUgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIkFycmF5IGRvZXMgbm90IHN1cHBvcnQgaXRlbSBkZWxldGlvbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JCW90aGVybGVuID0gUHlTZXF1ZW5jZV9MZW5ndGgodmFsdWUpOwotCQlpZiAob3RoZXJsZW4gIT0gc2xpY2VsZW4pIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJDYW4gb25seSBhc3NpZ24gc2VxdWVuY2Ugb2Ygc2FtZSBzaXplIik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJZm9yIChjdXIgPSBzdGFydCwgaSA9IDA7IGkgPCBvdGhlcmxlbjsgY3VyICs9IHN0ZXAsIGkrKykgewotCQkJUHlPYmplY3QgKml0ZW0gPSBQeVNlcXVlbmNlX0dldEl0ZW0odmFsdWUsIGkpOwotCQkJaW50IHJlc3VsdDsKLQkJCWlmIChpdGVtID09IE5VTEwpCi0JCQkJcmV0dXJuIC0xOwotCQkJcmVzdWx0ID0gQXJyYXlfYXNzX2l0ZW0oX3NlbGYsIGN1ciwgaXRlbSk7Ci0JCQlQeV9ERUNSRUYoaXRlbSk7Ci0JCQlpZiAocmVzdWx0ID09IC0xKQotCQkJCXJldHVybiAtMTsKLQkJfQotCQlyZXR1cm4gMDsKLQl9Ci0JZWxzZSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJImluZGljZXMgbXVzdCBiZSBpbnRlZ2VyIik7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgaWYgKFB5SW5kZXhfQ2hlY2soaXRlbSkpIHsKKyAgICAgICAgUHlfc3NpemVfdCBpID0gUHlOdW1iZXJfQXNTc2l6ZV90KGl0ZW0sIFB5RXhjX0luZGV4RXJyb3IpOworCisgICAgICAgIGlmIChpID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmIChpIDwgMCkKKyAgICAgICAgICAgIGkgKz0gc2VsZi0+Yl9sZW5ndGg7CisgICAgICAgIHJldHVybiBBcnJheV9hc3NfaXRlbShfc2VsZiwgaSwgdmFsdWUpOworICAgIH0KKyAgICBlbHNlIGlmIChQeVNsaWNlX0NoZWNrKGl0ZW0pKSB7CisgICAgICAgIFB5X3NzaXplX3Qgc3RhcnQsIHN0b3AsIHN0ZXAsIHNsaWNlbGVuLCBvdGhlcmxlbiwgaSwgY3VyOworCisgICAgICAgIGlmIChQeVNsaWNlX0dldEluZGljZXNFeCgoUHlTbGljZU9iamVjdCAqKWl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5iX2xlbmd0aCwgJnN0YXJ0LCAmc3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGVwLCAmc2xpY2VsZW4pIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGlmICgoc3RlcCA8IDAgJiYgc3RhcnQgPCBzdG9wKSB8fAorICAgICAgICAgICAgKHN0ZXAgPiAwICYmIHN0YXJ0ID4gc3RvcCkpCisgICAgICAgICAgICBzdG9wID0gc3RhcnQ7CisKKyAgICAgICAgb3RoZXJsZW4gPSBQeVNlcXVlbmNlX0xlbmd0aCh2YWx1ZSk7CisgICAgICAgIGlmIChvdGhlcmxlbiAhPSBzbGljZWxlbikgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgIkNhbiBvbmx5IGFzc2lnbiBzZXF1ZW5jZSBvZiBzYW1lIHNpemUiKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGN1ciA9IHN0YXJ0LCBpID0gMDsgaSA8IG90aGVybGVuOyBjdXIgKz0gc3RlcCwgaSsrKSB7CisgICAgICAgICAgICBQeU9iamVjdCAqaXRlbSA9IFB5U2VxdWVuY2VfR2V0SXRlbSh2YWx1ZSwgaSk7CisgICAgICAgICAgICBpbnQgcmVzdWx0OworICAgICAgICAgICAgaWYgKGl0ZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICByZXN1bHQgPSBBcnJheV9hc3NfaXRlbShfc2VsZiwgY3VyLCBpdGVtKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gLTEpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJpbmRpY2VzIG11c3QgYmUgaW50ZWdlciIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogfQogCiBzdGF0aWMgUHlfc3NpemVfdAogQXJyYXlfbGVuZ3RoKFB5T2JqZWN0ICpfc2VsZikKIHsKLQlDRGF0YU9iamVjdCAqc2VsZiA9IChDRGF0YU9iamVjdCAqKV9zZWxmOwotCXJldHVybiBzZWxmLT5iX2xlbmd0aDsKKyAgICBDRGF0YU9iamVjdCAqc2VsZiA9IChDRGF0YU9iamVjdCAqKV9zZWxmOworICAgIHJldHVybiBzZWxmLT5iX2xlbmd0aDsKIH0KIAogc3RhdGljIFB5U2VxdWVuY2VNZXRob2RzIEFycmF5X2FzX3NlcXVlbmNlID0gewotCUFycmF5X2xlbmd0aCwJCQkJLyogc3FfbGVuZ3RoOyAqLwotCTAsCQkJCQkvKiBzcV9jb25jYXQ7ICovCi0JMCwJCQkJCS8qIHNxX3JlcGVhdDsgKi8KLQlBcnJheV9pdGVtLAkJCQkvKiBzcV9pdGVtOyAqLwotCUFycmF5X3NsaWNlLAkJCQkvKiBzcV9zbGljZTsgKi8KLQlBcnJheV9hc3NfaXRlbSwJCQkJLyogc3FfYXNzX2l0ZW07ICovCi0JQXJyYXlfYXNzX3NsaWNlLAkJCS8qIHNxX2Fzc19zbGljZTsgKi8KLQkwLAkJCQkJLyogc3FfY29udGFpbnM7ICovCi0JCi0JMCwJCQkJCS8qIHNxX2lucGxhY2VfY29uY2F0OyAqLwotCTAsCQkJCQkvKiBzcV9pbnBsYWNlX3JlcGVhdDsgKi8KKyAgICBBcnJheV9sZW5ndGgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNxX2xlbmd0aDsgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNxX2NvbmNhdDsgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNxX3JlcGVhdDsgKi8KKyAgICBBcnJheV9pdGVtLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNxX2l0ZW07ICovCisgICAgQXJyYXlfc2xpY2UsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzcV9zbGljZTsgKi8KKyAgICBBcnJheV9hc3NfaXRlbSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNxX2Fzc19pdGVtOyAqLworICAgIEFycmF5X2Fzc19zbGljZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3FfYXNzX3NsaWNlOyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3FfY29udGFpbnM7ICovCisKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNxX2lucGxhY2VfY29uY2F0OyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3FfaW5wbGFjZV9yZXBlYXQ7ICovCiB9OwogCiBzdGF0aWMgUHlNYXBwaW5nTWV0aG9kcyBBcnJheV9hc19tYXBwaW5nID0gewotCUFycmF5X2xlbmd0aCwKLQlBcnJheV9zdWJzY3JpcHQsCi0JQXJyYXlfYXNzX3N1YnNjcmlwdCwKKyAgICBBcnJheV9sZW5ndGgsCisgICAgQXJyYXlfc3Vic2NyaXB0LAorICAgIEFycmF5X2Fzc19zdWJzY3JpcHQsCiB9OwogCiBQeVR5cGVPYmplY3QgQXJyYXlfVHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKLQkiX2N0eXBlcy5BcnJheSIsCi0Jc2l6ZW9mKENEYXRhT2JqZWN0KSwJCQkvKiB0cF9iYXNpY3NpemUgKi8KLQkwLAkJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkwLAkJCQkJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfY29tcGFyZSAqLwotCTAsCQkJCQkvKiB0cF9yZXByICovCi0JMCwJCQkJCS8qIHRwX2FzX251bWJlciAqLwotCSZBcnJheV9hc19zZXF1ZW5jZSwJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCSZBcnJheV9hc19tYXBwaW5nLAkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJCS8qIHRwX3N0ciAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRybyAqLwotCSZDRGF0YV9hc19idWZmZXIsCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX05FV0JVRkZFUiB8IFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCi0JIlhYWCB0byBiZSBwcm92aWRlZCIsCQkJLyogdHBfZG9jICovCi0JKHRyYXZlcnNlcHJvYylDRGF0YV90cmF2ZXJzZSwJCS8qIHRwX3RyYXZlcnNlICovCi0JKGlucXVpcnkpQ0RhdGFfY2xlYXIsCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaXRlciAqLwotCTAsCQkJCQkvKiB0cF9pdGVybmV4dCAqLwotCTAsCQkJCQkvKiB0cF9tZXRob2RzICovCi0JMCwJCQkJCS8qIHRwX21lbWJlcnMgKi8KLQkwLAkJCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQkoaW5pdHByb2MpQXJyYXlfaW5pdCwJCQkvKiB0cF9pbml0ICovCi0JMCwJCQkJCS8qIHRwX2FsbG9jICovCi0gICAgICAgIEdlbmVyaWNDRGF0YV9uZXcsCQkJLyogdHBfbmV3ICovCi0JMCwJCQkJCS8qIHRwX2ZyZWUgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAiX2N0eXBlcy5BcnJheSIsCisgICAgc2l6ZW9mKENEYXRhT2JqZWN0KSwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgJkFycmF5X2FzX3NlcXVlbmNlLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgICZBcnJheV9hc19tYXBwaW5nLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAmQ0RhdGFfYXNfYnVmZmVyLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9ORVdCVUZGRVIgfCBQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLworICAgICJYWFggdG8gYmUgcHJvdmlkZWQiLCAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgKHRyYXZlcnNlcHJvYylDRGF0YV90cmF2ZXJzZSwgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIChpbnF1aXJ5KUNEYXRhX2NsZWFyLCAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAoaW5pdHByb2MpQXJyYXlfaW5pdCwgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgR2VuZXJpY0NEYXRhX25ldywgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KIH07CiAKIFB5T2JqZWN0ICoKIENyZWF0ZUFycmF5VHlwZShQeU9iamVjdCAqaXRlbXR5cGUsIFB5X3NzaXplX3QgbGVuZ3RoKQogewotCXN0YXRpYyBQeU9iamVjdCAqY2FjaGU7Ci0JUHlPYmplY3QgKmtleTsKLQlQeU9iamVjdCAqcmVzdWx0OwotCWNoYXIgbmFtZVsyNTZdOwotCVB5T2JqZWN0ICpsZW47CisgICAgc3RhdGljIFB5T2JqZWN0ICpjYWNoZTsKKyAgICBQeU9iamVjdCAqa2V5OworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisgICAgY2hhciBuYW1lWzI1Nl07CisgICAgUHlPYmplY3QgKmxlbjsKIAotCWlmIChjYWNoZSA9PSBOVUxMKSB7Ci0JCWNhY2hlID0gUHlEaWN0X05ldygpOwotCQlpZiAoY2FjaGUgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCX0KLQlsZW4gPSBQeUludF9Gcm9tU3NpemVfdChsZW5ndGgpOwotCWlmIChsZW4gPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0Ja2V5ID0gUHlUdXBsZV9QYWNrKDIsIGl0ZW10eXBlLCBsZW4pOwotCVB5X0RFQ1JFRihsZW4pOwotCWlmICgha2V5KQotCQlyZXR1cm4gTlVMTDsKLQlyZXN1bHQgPSBQeURpY3RfR2V0SXRlbVByb3h5KGNhY2hlLCBrZXkpOwotCWlmIChyZXN1bHQpIHsKLQkJUHlfSU5DUkVGKHJlc3VsdCk7Ci0JCVB5X0RFQ1JFRihrZXkpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KKyAgICBpZiAoY2FjaGUgPT0gTlVMTCkgeworICAgICAgICBjYWNoZSA9IFB5RGljdF9OZXcoKTsKKyAgICAgICAgaWYgKGNhY2hlID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgbGVuID0gUHlJbnRfRnJvbVNzaXplX3QobGVuZ3RoKTsKKyAgICBpZiAobGVuID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGtleSA9IFB5VHVwbGVfUGFjaygyLCBpdGVtdHlwZSwgbGVuKTsKKyAgICBQeV9ERUNSRUYobGVuKTsKKyAgICBpZiAoIWtleSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmVzdWx0ID0gUHlEaWN0X0dldEl0ZW1Qcm94eShjYWNoZSwga2V5KTsKKyAgICBpZiAocmVzdWx0KSB7CisgICAgICAgIFB5X0lOQ1JFRihyZXN1bHQpOworICAgICAgICBQeV9ERUNSRUYoa2V5KTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CiAKLQlpZiAoIVB5VHlwZV9DaGVjayhpdGVtdHlwZSkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiRXhwZWN0ZWQgYSB0eXBlIG9iamVjdCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKCFQeVR5cGVfQ2hlY2soaXRlbXR5cGUpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgYSB0eXBlIG9iamVjdCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAjaWZkZWYgTVNfV0lONjQKLQlzcHJpbnRmKG5hbWUsICIlLjIwMHNfQXJyYXlfJUlkIiwKLQkJKChQeVR5cGVPYmplY3QgKilpdGVtdHlwZSktPnRwX25hbWUsIGxlbmd0aCk7CisgICAgc3ByaW50ZihuYW1lLCAiJS4yMDBzX0FycmF5XyVJZCIsCisgICAgICAgICgoUHlUeXBlT2JqZWN0ICopaXRlbXR5cGUpLT50cF9uYW1lLCBsZW5ndGgpOwogI2Vsc2UKLQlzcHJpbnRmKG5hbWUsICIlLjIwMHNfQXJyYXlfJWxkIiwKLQkJKChQeVR5cGVPYmplY3QgKilpdGVtdHlwZSktPnRwX25hbWUsIChsb25nKWxlbmd0aCk7CisgICAgc3ByaW50ZihuYW1lLCAiJS4yMDBzX0FycmF5XyVsZCIsCisgICAgICAgICgoUHlUeXBlT2JqZWN0ICopaXRlbXR5cGUpLT50cF9uYW1lLCAobG9uZylsZW5ndGgpOwogI2VuZGlmCiAKLQlyZXN1bHQgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oKFB5T2JqZWN0ICopJkFycmF5VHlwZV9UeXBlLAorICAgIHJlc3VsdCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbigoUHlPYmplY3QgKikmQXJyYXlUeXBlX1R5cGUsCiAjaWYgKFBZX1ZFUlNJT05fSEVYIDwgMHgwMjA1MDAwMCkKLQkJCQkgICAgICAgInMoTyl7czppLHM6T30iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicyhPKXtzOmksczpPfSIsCiAjZWxzZQotCQkJCSAgICAgICAicyhPKXtzOm4sczpPfSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzKE8pe3M6bixzOk99IiwKICNlbmRpZgotCQkJCSAgICAgICBuYW1lLAotCQkJCSAgICAgICAmQXJyYXlfVHlwZSwKLQkJCQkgICAgICAgIl9sZW5ndGhfIiwKLQkJCQkgICAgICAgbGVuZ3RoLAotCQkJCSAgICAgICAiX3R5cGVfIiwKLQkJCQkgICAgICAgaXRlbXR5cGUKLQkJKTsKLQlpZiAocmVzdWx0ID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKGtleSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoLTEgPT0gUHlEaWN0X1NldEl0ZW1Qcm94eShjYWNoZSwga2V5LCByZXN1bHQpKSB7Ci0JCVB5X0RFQ1JFRihrZXkpOwotCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5X0RFQ1JFRihrZXkpOwotCXJldHVybiByZXN1bHQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZBcnJheV9UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX2xlbmd0aF8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfdHlwZV8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtdHlwZQorICAgICAgICApOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYoa2V5KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmICgtMSA9PSBQeURpY3RfU2V0SXRlbVByb3h5KGNhY2hlLCBrZXksIHJlc3VsdCkpIHsKKyAgICAgICAgUHlfREVDUkVGKGtleSk7CisgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlfREVDUkVGKGtleSk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAotDAorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKICAgU2ltcGxlX1R5cGUKQEAgLTQ2NzAsMTY3ICs0NjcwLDE2NyBAQAogc3RhdGljIGludAogU2ltcGxlX3NldF92YWx1ZShDRGF0YU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnZhbHVlKQogewotCVB5T2JqZWN0ICpyZXN1bHQ7Ci0JU3RnRGljdE9iamVjdCAqZGljdCA9IFB5T2JqZWN0X3N0Z2RpY3QoKFB5T2JqZWN0ICopc2VsZik7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICBTdGdEaWN0T2JqZWN0ICpkaWN0ID0gUHlPYmplY3Rfc3RnZGljdCgoUHlPYmplY3QgKilzZWxmKTsKIAotCWlmICh2YWx1ZSA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJImNhbid0IGRlbGV0ZSBhdHRyaWJ1dGUiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlhc3NlcnQoZGljdCk7IC8qIENhbm5vdCBiZSBOVUxMIGZvciBDRGF0YU9iamVjdCBpbnN0YW5jZXMgKi8KLQlhc3NlcnQoZGljdC0+c2V0ZnVuYyk7Ci0JcmVzdWx0ID0gZGljdC0+c2V0ZnVuYyhzZWxmLT5iX3B0ciwgdmFsdWUsIGRpY3QtPnNpemUpOwotCWlmICghcmVzdWx0KQotCQlyZXR1cm4gLTE7CisgICAgaWYgKHZhbHVlID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjYW4ndCBkZWxldGUgYXR0cmlidXRlIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgYXNzZXJ0KGRpY3QpOyAvKiBDYW5ub3QgYmUgTlVMTCBmb3IgQ0RhdGFPYmplY3QgaW5zdGFuY2VzICovCisgICAgYXNzZXJ0KGRpY3QtPnNldGZ1bmMpOworICAgIHJlc3VsdCA9IGRpY3QtPnNldGZ1bmMoc2VsZi0+Yl9wdHIsIHZhbHVlLCBkaWN0LT5zaXplKTsKKyAgICBpZiAoIXJlc3VsdCkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0JLyogY29uc3VtZXMgdGhlIHJlZmNvdW50IHRoZSBzZXRmdW5jIHJldHVybnMgKi8KLQlyZXR1cm4gS2VlcFJlZihzZWxmLCAwLCByZXN1bHQpOworICAgIC8qIGNvbnN1bWVzIHRoZSByZWZjb3VudCB0aGUgc2V0ZnVuYyByZXR1cm5zICovCisgICAgcmV0dXJuIEtlZXBSZWYoc2VsZiwgMCwgcmVzdWx0KTsKIH0KIAogc3RhdGljIGludAogU2ltcGxlX2luaXQoQ0RhdGFPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3cpCiB7Ci0JUHlPYmplY3QgKnZhbHVlID0gTlVMTDsKLQlpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJfX2luaXRfXyIsIDAsIDEsICZ2YWx1ZSkpCi0JCXJldHVybiAtMTsKLQlpZiAodmFsdWUpCi0JCXJldHVybiBTaW1wbGVfc2V0X3ZhbHVlKHNlbGYsIHZhbHVlKTsKLQlyZXR1cm4gMDsKKyAgICBQeU9iamVjdCAqdmFsdWUgPSBOVUxMOworICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgIl9faW5pdF9fIiwgMCwgMSwgJnZhbHVlKSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmICh2YWx1ZSkKKyAgICAgICAgcmV0dXJuIFNpbXBsZV9zZXRfdmFsdWUoc2VsZiwgdmFsdWUpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogU2ltcGxlX2dldF92YWx1ZShDRGF0YU9iamVjdCAqc2VsZikKIHsKLQlTdGdEaWN0T2JqZWN0ICpkaWN0OwotCWRpY3QgPSBQeU9iamVjdF9zdGdkaWN0KChQeU9iamVjdCAqKXNlbGYpOwotCWFzc2VydChkaWN0KTsgLyogQ2Fubm90IGJlIE5VTEwgZm9yIENEYXRhT2JqZWN0IGluc3RhbmNlcyAqLwotCWFzc2VydChkaWN0LT5nZXRmdW5jKTsKLQlyZXR1cm4gZGljdC0+Z2V0ZnVuYyhzZWxmLT5iX3B0ciwgc2VsZi0+Yl9zaXplKTsKKyAgICBTdGdEaWN0T2JqZWN0ICpkaWN0OworICAgIGRpY3QgPSBQeU9iamVjdF9zdGdkaWN0KChQeU9iamVjdCAqKXNlbGYpOworICAgIGFzc2VydChkaWN0KTsgLyogQ2Fubm90IGJlIE5VTEwgZm9yIENEYXRhT2JqZWN0IGluc3RhbmNlcyAqLworICAgIGFzc2VydChkaWN0LT5nZXRmdW5jKTsKKyAgICByZXR1cm4gZGljdC0+Z2V0ZnVuYyhzZWxmLT5iX3B0ciwgc2VsZi0+Yl9zaXplKTsKIH0KIAogc3RhdGljIFB5R2V0U2V0RGVmIFNpbXBsZV9nZXRzZXRzW10gPSB7Ci0JeyAidmFsdWUiLCAoZ2V0dGVyKVNpbXBsZV9nZXRfdmFsdWUsIChzZXR0ZXIpU2ltcGxlX3NldF92YWx1ZSwKLQkgICJjdXJyZW50IHZhbHVlIiwgTlVMTCB9LAotCXsgTlVMTCwgTlVMTCB9CisgICAgeyAidmFsdWUiLCAoZ2V0dGVyKVNpbXBsZV9nZXRfdmFsdWUsIChzZXR0ZXIpU2ltcGxlX3NldF92YWx1ZSwKKyAgICAgICJjdXJyZW50IHZhbHVlIiwgTlVMTCB9LAorICAgIHsgTlVMTCwgTlVMTCB9CiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKgogU2ltcGxlX2Zyb21fb3V0cGFybShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaWYgKElzU2ltcGxlU3ViVHlwZSgoUHlPYmplY3QgKilQeV9UWVBFKHNlbGYpKSkgewotCQlQeV9JTkNSRUYoc2VsZik7Ci0JCXJldHVybiBzZWxmOwotCX0KLQkvKiBjYWxsIHN0Z2RpY3QtPmdldGZ1bmMgKi8KLQlyZXR1cm4gU2ltcGxlX2dldF92YWx1ZSgoQ0RhdGFPYmplY3QgKilzZWxmKTsKKyAgICBpZiAoSXNTaW1wbGVTdWJUeXBlKChQeU9iamVjdCAqKVB5X1RZUEUoc2VsZikpKSB7CisgICAgICAgIFB5X0lOQ1JFRihzZWxmKTsKKyAgICAgICAgcmV0dXJuIHNlbGY7CisgICAgfQorICAgIC8qIGNhbGwgc3RnZGljdC0+Z2V0ZnVuYyAqLworICAgIHJldHVybiBTaW1wbGVfZ2V0X3ZhbHVlKChDRGF0YU9iamVjdCAqKXNlbGYpOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgU2ltcGxlX21ldGhvZHNbXSA9IHsKLQl7ICJfX2N0eXBlc19mcm9tX291dHBhcmFtX18iLCBTaW1wbGVfZnJvbV9vdXRwYXJtLCBNRVRIX05PQVJHUywgfSwKLQl7IE5VTEwsIE5VTEwgfSwKKyAgICB7ICJfX2N0eXBlc19mcm9tX291dHBhcmFtX18iLCBTaW1wbGVfZnJvbV9vdXRwYXJtLCBNRVRIX05PQVJHUywgfSwKKyAgICB7IE5VTEwsIE5VTEwgfSwKIH07CiAKIHN0YXRpYyBpbnQgU2ltcGxlX25vbnplcm8oQ0RhdGFPYmplY3QgKnNlbGYpCiB7Ci0JcmV0dXJuIG1lbWNtcChzZWxmLT5iX3B0ciwgIlwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwIiwgc2VsZi0+Yl9zaXplKTsKKyAgICByZXR1cm4gbWVtY21wKHNlbGYtPmJfcHRyLCAiXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDAiLCBzZWxmLT5iX3NpemUpOwogfQogCiBzdGF0aWMgUHlOdW1iZXJNZXRob2RzIFNpbXBsZV9hc19udW1iZXIgPSB7Ci0JMCwgLyogbmJfYWRkICovCi0JMCwgLyogbmJfc3VidHJhY3QgKi8KLQkwLCAvKiBuYl9tdWx0aXBseSAqLwotCTAsIC8qIG5iX2RpdmlkZSAqLwotCTAsIC8qIG5iX3JlbWFpbmRlciAqLwotCTAsIC8qIG5iX2Rpdm1vZCAqLwotCTAsIC8qIG5iX3Bvd2VyICovCi0JMCwgLyogbmJfbmVnYXRpdmUgKi8KLQkwLCAvKiBuYl9wb3NpdGl2ZSAqLwotCTAsIC8qIG5iX2Fic29sdXRlICovCi0JKGlucXVpcnkpU2ltcGxlX25vbnplcm8sIC8qIG5iX25vbnplcm8gKi8KKyAgICAwLCAvKiBuYl9hZGQgKi8KKyAgICAwLCAvKiBuYl9zdWJ0cmFjdCAqLworICAgIDAsIC8qIG5iX211bHRpcGx5ICovCisgICAgMCwgLyogbmJfZGl2aWRlICovCisgICAgMCwgLyogbmJfcmVtYWluZGVyICovCisgICAgMCwgLyogbmJfZGl2bW9kICovCisgICAgMCwgLyogbmJfcG93ZXIgKi8KKyAgICAwLCAvKiBuYl9uZWdhdGl2ZSAqLworICAgIDAsIC8qIG5iX3Bvc2l0aXZlICovCisgICAgMCwgLyogbmJfYWJzb2x1dGUgKi8KKyAgICAoaW5xdWlyeSlTaW1wbGVfbm9uemVybywgLyogbmJfbm9uemVybyAqLwogfTsKIAogLyogIiVzKCVzKSIgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIHNlbGYudmFsdWUpICovCiBzdGF0aWMgUHlPYmplY3QgKgogU2ltcGxlX3JlcHIoQ0RhdGFPYmplY3QgKnNlbGYpCiB7Ci0JUHlPYmplY3QgKnZhbCwgKm5hbWUsICphcmdzLCAqcmVzdWx0OwotCXN0YXRpYyBQeU9iamVjdCAqZm9ybWF0OworICAgIFB5T2JqZWN0ICp2YWwsICpuYW1lLCAqYXJncywgKnJlc3VsdDsKKyAgICBzdGF0aWMgUHlPYmplY3QgKmZvcm1hdDsKIAotCWlmIChQeV9UWVBFKHNlbGYpLT50cF9iYXNlICE9ICZTaW1wbGVfVHlwZSkgewotCQlyZXR1cm4gUHlTdHJpbmdfRnJvbUZvcm1hdCgiPCVzIG9iamVjdCBhdCAlcD4iLAotCQkJCQkgICBQeV9UWVBFKHNlbGYpLT50cF9uYW1lLCBzZWxmKTsKLQl9CisgICAgaWYgKFB5X1RZUEUoc2VsZiktPnRwX2Jhc2UgIT0gJlNpbXBsZV9UeXBlKSB7CisgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tRm9ybWF0KCI8JXMgb2JqZWN0IGF0ICVwPiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X1RZUEUoc2VsZiktPnRwX25hbWUsIHNlbGYpOworICAgIH0KIAotCWlmIChmb3JtYXQgPT0gTlVMTCkgewotCQlmb3JtYXQgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCIlcyglcikiKTsKLQkJaWYgKGZvcm1hdCA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChmb3JtYXQgPT0gTlVMTCkgeworICAgICAgICBmb3JtYXQgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCIlcyglcikiKTsKKyAgICAgICAgaWYgKGZvcm1hdCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JdmFsID0gU2ltcGxlX2dldF92YWx1ZShzZWxmKTsKLQlpZiAodmFsID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIHZhbCA9IFNpbXBsZV9nZXRfdmFsdWUoc2VsZik7CisgICAgaWYgKHZhbCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCW5hbWUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKFB5X1RZUEUoc2VsZiktPnRwX25hbWUpOwotCWlmIChuYW1lID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKHZhbCk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBuYW1lID0gUHlTdHJpbmdfRnJvbVN0cmluZyhQeV9UWVBFKHNlbGYpLT50cF9uYW1lKTsKKyAgICBpZiAobmFtZSA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRih2YWwpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlhcmdzID0gUHlUdXBsZV9QYWNrKDIsIG5hbWUsIHZhbCk7Ci0JUHlfREVDUkVGKG5hbWUpOwotCVB5X0RFQ1JFRih2YWwpOwotCWlmIChhcmdzID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIGFyZ3MgPSBQeVR1cGxlX1BhY2soMiwgbmFtZSwgdmFsKTsKKyAgICBQeV9ERUNSRUYobmFtZSk7CisgICAgUHlfREVDUkVGKHZhbCk7CisgICAgaWYgKGFyZ3MgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlyZXN1bHQgPSBQeVN0cmluZ19Gb3JtYXQoZm9ybWF0LCBhcmdzKTsKLQlQeV9ERUNSRUYoYXJncyk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICByZXN1bHQgPSBQeVN0cmluZ19Gb3JtYXQoZm9ybWF0LCBhcmdzKTsKKyAgICBQeV9ERUNSRUYoYXJncyk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIFB5VHlwZU9iamVjdCBTaW1wbGVfVHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKLQkiX2N0eXBlcy5fU2ltcGxlQ0RhdGEiLAotCXNpemVvZihDRGF0YU9iamVjdCksCQkJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJCS8qIHRwX2l0ZW1zaXplICovCi0JMCwJCQkJCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkocmVwcmZ1bmMpJlNpbXBsZV9yZXByLAkJCS8qIHRwX3JlcHIgKi8KLQkmU2ltcGxlX2FzX251bWJlciwJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkJLyogdHBfc3RyICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHJvICovCi0JJkNEYXRhX2FzX2J1ZmZlciwJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfTkVXQlVGRkVSIHwgUHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQkiWFhYIHRvIGJlIHByb3ZpZGVkIiwJCQkvKiB0cF9kb2MgKi8KLQkodHJhdmVyc2Vwcm9jKUNEYXRhX3RyYXZlcnNlLAkJLyogdHBfdHJhdmVyc2UgKi8KLQkoaW5xdWlyeSlDRGF0YV9jbGVhciwJCQkvKiB0cF9jbGVhciAqLwotCTAsCQkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCTAsCQkJCQkvKiB0cF9pdGVyICovCi0JMCwJCQkJCS8qIHRwX2l0ZXJuZXh0ICovCi0JU2ltcGxlX21ldGhvZHMsCQkJCS8qIHRwX21ldGhvZHMgKi8KLQkwLAkJCQkJLyogdHBfbWVtYmVycyAqLwotCVNpbXBsZV9nZXRzZXRzLAkJCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCQkvKiB0cF9kaWN0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KLQkwLAkJCQkJLyogdHBfZGljdG9mZnNldCAqLwotCShpbml0cHJvYylTaW1wbGVfaW5pdCwJCQkvKiB0cF9pbml0ICovCi0JMCwJCQkJCS8qIHRwX2FsbG9jICovCi0gICAgICAgIEdlbmVyaWNDRGF0YV9uZXcsCQkJLyogdHBfbmV3ICovCi0JMCwJCQkJCS8qIHRwX2ZyZWUgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAiX2N0eXBlcy5fU2ltcGxlQ0RhdGEiLAorICAgIHNpemVvZihDRGF0YU9iamVjdCksICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAocmVwcmZ1bmMpJlNpbXBsZV9yZXByLCAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAmU2ltcGxlX2FzX251bWJlciwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgJkNEYXRhX2FzX2J1ZmZlciwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfTkVXQlVGRkVSIHwgUHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KKyAgICAiWFhYIHRvIGJlIHByb3ZpZGVkIiwgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2MpQ0RhdGFfdHJhdmVyc2UsICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAoaW5xdWlyeSlDRGF0YV9jbGVhciwgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgU2ltcGxlX21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgU2ltcGxlX2dldHNldHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgKGluaXRwcm9jKVNpbXBsZV9pbml0LCAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIEdlbmVyaWNDRGF0YV9uZXcsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCiB9OwotDAorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKICAgUG9pbnRlcl9UeXBlCkBAIC00ODM4LDQyMCArNDgzOCw0MjAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBQb2ludGVyX2l0ZW0oUHlPYmplY3QgKl9zZWxmLCBQeV9zc2l6ZV90IGluZGV4KQogewotCUNEYXRhT2JqZWN0ICpzZWxmID0gKENEYXRhT2JqZWN0ICopX3NlbGY7Ci0JUHlfc3NpemVfdCBzaXplOwotCVB5X3NzaXplX3Qgb2Zmc2V0OwotCVN0Z0RpY3RPYmplY3QgKnN0Z2RpY3QsICppdGVtZGljdDsKLQlQeU9iamVjdCAqcHJvdG87CisgICAgQ0RhdGFPYmplY3QgKnNlbGYgPSAoQ0RhdGFPYmplY3QgKilfc2VsZjsKKyAgICBQeV9zc2l6ZV90IHNpemU7CisgICAgUHlfc3NpemVfdCBvZmZzZXQ7CisgICAgU3RnRGljdE9iamVjdCAqc3RnZGljdCwgKml0ZW1kaWN0OworICAgIFB5T2JqZWN0ICpwcm90bzsKIAotCWlmICgqKHZvaWQgKiopc2VsZi0+Yl9wdHIgPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkiTlVMTCBwb2ludGVyIGFjY2VzcyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKCoodm9pZCAqKilzZWxmLT5iX3B0ciA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIk5VTEwgcG9pbnRlciBhY2Nlc3MiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0Jc3RnZGljdCA9IFB5T2JqZWN0X3N0Z2RpY3QoKFB5T2JqZWN0ICopc2VsZik7Ci0JYXNzZXJ0KHN0Z2RpY3QpOyAvKiBDYW5ub3QgYmUgTlVMTCBmb3IgcG9pbnRlciBvYmplY3QgaW5zdGFuY2VzICovCi0JCi0JcHJvdG8gPSBzdGdkaWN0LT5wcm90bzsKLQlhc3NlcnQocHJvdG8pOwotCWl0ZW1kaWN0ID0gUHlUeXBlX3N0Z2RpY3QocHJvdG8pOwotCWFzc2VydChpdGVtZGljdCk7IC8qIHByb3RvIGlzIHRoZSBpdGVtIHR5cGUgb2YgdGhlIHBvaW50ZXIsIGEgY3R5cGVzCi0JCQkgICAgIHR5cGUsIHNvIHRoaXMgY2Fubm90IGJlIE5VTEwgKi8KKyAgICBzdGdkaWN0ID0gUHlPYmplY3Rfc3RnZGljdCgoUHlPYmplY3QgKilzZWxmKTsKKyAgICBhc3NlcnQoc3RnZGljdCk7IC8qIENhbm5vdCBiZSBOVUxMIGZvciBwb2ludGVyIG9iamVjdCBpbnN0YW5jZXMgKi8KIAotCXNpemUgPSBpdGVtZGljdC0+c2l6ZTsKLQlvZmZzZXQgPSBpbmRleCAqIGl0ZW1kaWN0LT5zaXplOworICAgIHByb3RvID0gc3RnZGljdC0+cHJvdG87CisgICAgYXNzZXJ0KHByb3RvKTsKKyAgICBpdGVtZGljdCA9IFB5VHlwZV9zdGdkaWN0KHByb3RvKTsKKyAgICBhc3NlcnQoaXRlbWRpY3QpOyAvKiBwcm90byBpcyB0aGUgaXRlbSB0eXBlIG9mIHRoZSBwb2ludGVyLCBhIGN0eXBlcworICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsIHNvIHRoaXMgY2Fubm90IGJlIE5VTEwgKi8KIAotCXJldHVybiBDRGF0YV9nZXQocHJvdG8sIHN0Z2RpY3QtPmdldGZ1bmMsIChQeU9iamVjdCAqKXNlbGYsCi0JCQkgaW5kZXgsIHNpemUsICgqKGNoYXIgKiopc2VsZi0+Yl9wdHIpICsgb2Zmc2V0KTsKKyAgICBzaXplID0gaXRlbWRpY3QtPnNpemU7CisgICAgb2Zmc2V0ID0gaW5kZXggKiBpdGVtZGljdC0+c2l6ZTsKKworICAgIHJldHVybiBDRGF0YV9nZXQocHJvdG8sIHN0Z2RpY3QtPmdldGZ1bmMsIChQeU9iamVjdCAqKXNlbGYsCisgICAgICAgICAgICAgICAgICAgICBpbmRleCwgc2l6ZSwgKCooY2hhciAqKilzZWxmLT5iX3B0cikgKyBvZmZzZXQpOwogfQogCiBzdGF0aWMgaW50CiBQb2ludGVyX2Fzc19pdGVtKFB5T2JqZWN0ICpfc2VsZiwgUHlfc3NpemVfdCBpbmRleCwgUHlPYmplY3QgKnZhbHVlKQogewotCUNEYXRhT2JqZWN0ICpzZWxmID0gKENEYXRhT2JqZWN0ICopX3NlbGY7Ci0JUHlfc3NpemVfdCBzaXplOwotCVB5X3NzaXplX3Qgb2Zmc2V0OwotCVN0Z0RpY3RPYmplY3QgKnN0Z2RpY3QsICppdGVtZGljdDsKLQlQeU9iamVjdCAqcHJvdG87CisgICAgQ0RhdGFPYmplY3QgKnNlbGYgPSAoQ0RhdGFPYmplY3QgKilfc2VsZjsKKyAgICBQeV9zc2l6ZV90IHNpemU7CisgICAgUHlfc3NpemVfdCBvZmZzZXQ7CisgICAgU3RnRGljdE9iamVjdCAqc3RnZGljdCwgKml0ZW1kaWN0OworICAgIFB5T2JqZWN0ICpwcm90bzsKIAotCWlmICh2YWx1ZSA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJIlBvaW50ZXIgZG9lcyBub3Qgc3VwcG9ydCBpdGVtIGRlbGV0aW9uIik7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgaWYgKHZhbHVlID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJQb2ludGVyIGRvZXMgbm90IHN1cHBvcnQgaXRlbSBkZWxldGlvbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JaWYgKCoodm9pZCAqKilzZWxmLT5iX3B0ciA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJOVUxMIHBvaW50ZXIgYWNjZXNzIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JCi0Jc3RnZGljdCA9IFB5T2JqZWN0X3N0Z2RpY3QoKFB5T2JqZWN0ICopc2VsZik7Ci0JYXNzZXJ0KHN0Z2RpY3QpOyAvKiBDYW5ub3QgYmUgTlVMTCBmciBwb2ludGVyIGluc3RhbmNlcyAqLworICAgIGlmICgqKHZvaWQgKiopc2VsZi0+Yl9wdHIgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJOVUxMIHBvaW50ZXIgYWNjZXNzIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQlwcm90byA9IHN0Z2RpY3QtPnByb3RvOwotCWFzc2VydChwcm90byk7CisgICAgc3RnZGljdCA9IFB5T2JqZWN0X3N0Z2RpY3QoKFB5T2JqZWN0ICopc2VsZik7CisgICAgYXNzZXJ0KHN0Z2RpY3QpOyAvKiBDYW5ub3QgYmUgTlVMTCBmciBwb2ludGVyIGluc3RhbmNlcyAqLwogCi0JaXRlbWRpY3QgPSBQeVR5cGVfc3RnZGljdChwcm90byk7Ci0JYXNzZXJ0KGl0ZW1kaWN0KTsgLyogQ2Fubm90IGJlIE5VTEwgYmVjYXVzZSB0aGUgaXRlbXR5cGUgb2YgYSBwb2ludGVyCi0JCQkgICAgIGlzIGFsd2F5cyBhIGN0eXBlcyB0eXBlICovCisgICAgcHJvdG8gPSBzdGdkaWN0LT5wcm90bzsKKyAgICBhc3NlcnQocHJvdG8pOwogCi0Jc2l6ZSA9IGl0ZW1kaWN0LT5zaXplOwotCW9mZnNldCA9IGluZGV4ICogaXRlbWRpY3QtPnNpemU7CisgICAgaXRlbWRpY3QgPSBQeVR5cGVfc3RnZGljdChwcm90byk7CisgICAgYXNzZXJ0KGl0ZW1kaWN0KTsgLyogQ2Fubm90IGJlIE5VTEwgYmVjYXVzZSB0aGUgaXRlbXR5cGUgb2YgYSBwb2ludGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgaXMgYWx3YXlzIGEgY3R5cGVzIHR5cGUgKi8KIAotCXJldHVybiBDRGF0YV9zZXQoKFB5T2JqZWN0ICopc2VsZiwgcHJvdG8sIHN0Z2RpY3QtPnNldGZ1bmMsIHZhbHVlLAotCQkJIGluZGV4LCBzaXplLCAoKihjaGFyICoqKXNlbGYtPmJfcHRyKSArIG9mZnNldCk7CisgICAgc2l6ZSA9IGl0ZW1kaWN0LT5zaXplOworICAgIG9mZnNldCA9IGluZGV4ICogaXRlbWRpY3QtPnNpemU7CisKKyAgICByZXR1cm4gQ0RhdGFfc2V0KChQeU9iamVjdCAqKXNlbGYsIHByb3RvLCBzdGdkaWN0LT5zZXRmdW5jLCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgIGluZGV4LCBzaXplLCAoKihjaGFyICoqKXNlbGYtPmJfcHRyKSArIG9mZnNldCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBQb2ludGVyX2dldF9jb250ZW50cyhDRGF0YU9iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlTdGdEaWN0T2JqZWN0ICpzdGdkaWN0OworICAgIFN0Z0RpY3RPYmplY3QgKnN0Z2RpY3Q7CiAKLQlpZiAoKih2b2lkICoqKXNlbGYtPmJfcHRyID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJIk5VTEwgcG9pbnRlciBhY2Nlc3MiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICgqKHZvaWQgKiopc2VsZi0+Yl9wdHIgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJOVUxMIHBvaW50ZXIgYWNjZXNzIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXN0Z2RpY3QgPSBQeU9iamVjdF9zdGdkaWN0KChQeU9iamVjdCAqKXNlbGYpOwotCWFzc2VydChzdGdkaWN0KTsgLyogQ2Fubm90IGJlIE5VTEwgZnIgcG9pbnRlciBpbnN0YW5jZXMgKi8KLQlyZXR1cm4gQ0RhdGFfRnJvbUJhc2VPYmooc3RnZGljdC0+cHJvdG8sCi0JCQkJIChQeU9iamVjdCAqKXNlbGYsIDAsCi0JCQkJICoodm9pZCAqKilzZWxmLT5iX3B0cik7CisgICAgc3RnZGljdCA9IFB5T2JqZWN0X3N0Z2RpY3QoKFB5T2JqZWN0ICopc2VsZik7CisgICAgYXNzZXJ0KHN0Z2RpY3QpOyAvKiBDYW5ub3QgYmUgTlVMTCBmciBwb2ludGVyIGluc3RhbmNlcyAqLworICAgIHJldHVybiBDRGF0YV9Gcm9tQmFzZU9iaihzdGdkaWN0LT5wcm90bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFB5T2JqZWN0ICopc2VsZiwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKih2b2lkICoqKXNlbGYtPmJfcHRyKTsKIH0KIAogc3RhdGljIGludAogUG9pbnRlcl9zZXRfY29udGVudHMoQ0RhdGFPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp2YWx1ZSwgdm9pZCAqY2xvc3VyZSkKIHsKLQlTdGdEaWN0T2JqZWN0ICpzdGdkaWN0OwotCUNEYXRhT2JqZWN0ICpkc3Q7Ci0JUHlPYmplY3QgKmtlZXA7CisgICAgU3RnRGljdE9iamVjdCAqc3RnZGljdDsKKyAgICBDRGF0YU9iamVjdCAqZHN0OworICAgIFB5T2JqZWN0ICprZWVwOwogCi0JaWYgKHZhbHVlID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiUG9pbnRlciBkb2VzIG5vdCBzdXBwb3J0IGl0ZW0gZGVsZXRpb24iKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlzdGdkaWN0ID0gUHlPYmplY3Rfc3RnZGljdCgoUHlPYmplY3QgKilzZWxmKTsKLQlhc3NlcnQoc3RnZGljdCk7IC8qIENhbm5vdCBiZSBOVUxMIGZyIHBvaW50ZXIgaW5zdGFuY2VzICovCi0JYXNzZXJ0KHN0Z2RpY3QtPnByb3RvKTsKLQlpZiAoIUNEYXRhT2JqZWN0X0NoZWNrKHZhbHVlKSAKLQkgICAgfHwgMCA9PSBQeU9iamVjdF9Jc0luc3RhbmNlKHZhbHVlLCBzdGdkaWN0LT5wcm90bykpIHsKLQkJLyogWFhYIFB5T2JqZWN0X0lzSW5zdGFuY2UgY291bGQgcmV0dXJuIC0xISAqLwotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJICAgICAiZXhwZWN0ZWQgJXMgaW5zdGVhZCBvZiAlcyIsCi0JCQkgICAgICgoUHlUeXBlT2JqZWN0ICopKHN0Z2RpY3QtPnByb3RvKSktPnRwX25hbWUsCi0JCQkgICAgIFB5X1RZUEUodmFsdWUpLT50cF9uYW1lKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICBpZiAodmFsdWUgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIlBvaW50ZXIgZG9lcyBub3Qgc3VwcG9ydCBpdGVtIGRlbGV0aW9uIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgc3RnZGljdCA9IFB5T2JqZWN0X3N0Z2RpY3QoKFB5T2JqZWN0ICopc2VsZik7CisgICAgYXNzZXJ0KHN0Z2RpY3QpOyAvKiBDYW5ub3QgYmUgTlVMTCBmciBwb2ludGVyIGluc3RhbmNlcyAqLworICAgIGFzc2VydChzdGdkaWN0LT5wcm90byk7CisgICAgaWYgKCFDRGF0YU9iamVjdF9DaGVjayh2YWx1ZSkKKyAgICAgICAgfHwgMCA9PSBQeU9iamVjdF9Jc0luc3RhbmNlKHZhbHVlLCBzdGdkaWN0LT5wcm90bykpIHsKKyAgICAgICAgLyogWFhYIFB5T2JqZWN0X0lzSW5zdGFuY2UgY291bGQgcmV0dXJuIC0xISAqLworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkICVzIGluc3RlYWQgb2YgJXMiLAorICAgICAgICAgICAgICAgICAgICAgKChQeVR5cGVPYmplY3QgKikoc3RnZGljdC0+cHJvdG8pKS0+dHBfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIFB5X1RZUEUodmFsdWUpLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCWRzdCA9IChDRGF0YU9iamVjdCAqKXZhbHVlOwotCSoodm9pZCAqKilzZWxmLT5iX3B0ciA9IGRzdC0+Yl9wdHI7CisgICAgZHN0ID0gKENEYXRhT2JqZWN0ICopdmFsdWU7CisgICAgKih2b2lkICoqKXNlbGYtPmJfcHRyID0gZHN0LT5iX3B0cjsKIAotCS8qIAotCSAgIEEgUG9pbnRlciBpbnN0YW5jZSBtdXN0IGtlZXAgYSB0aGUgdmFsdWUgaXQgcG9pbnRzIHRvIGFsaXZlLiAgU28sIGEKLQkgICBwb2ludGVyIGluc3RhbmNlIGhhcyBiX2xlbmd0aCBzZXQgdG8gMiBpbnN0ZWFkIG9mIDEsIGFuZCB3ZSBzZXQKLQkgICAndmFsdWUnIGl0c2VsZiBhcyB0aGUgc2Vjb25kIGl0ZW0gb2YgdGhlIGJfb2JqZWN0cyBsaXN0LCBhZGRpdGlvbmFsbHkuCi0JKi8KLQlQeV9JTkNSRUYodmFsdWUpOwotCWlmICgtMSA9PSBLZWVwUmVmKHNlbGYsIDEsIHZhbHVlKSkKLQkJcmV0dXJuIC0xOworICAgIC8qCisgICAgICAgQSBQb2ludGVyIGluc3RhbmNlIG11c3Qga2VlcCBhIHRoZSB2YWx1ZSBpdCBwb2ludHMgdG8gYWxpdmUuICBTbywgYQorICAgICAgIHBvaW50ZXIgaW5zdGFuY2UgaGFzIGJfbGVuZ3RoIHNldCB0byAyIGluc3RlYWQgb2YgMSwgYW5kIHdlIHNldAorICAgICAgICd2YWx1ZScgaXRzZWxmIGFzIHRoZSBzZWNvbmQgaXRlbSBvZiB0aGUgYl9vYmplY3RzIGxpc3QsIGFkZGl0aW9uYWxseS4KKyAgICAqLworICAgIFB5X0lOQ1JFRih2YWx1ZSk7CisgICAgaWYgKC0xID09IEtlZXBSZWYoc2VsZiwgMSwgdmFsdWUpKQorICAgICAgICByZXR1cm4gLTE7CiAKLQlrZWVwID0gR2V0S2VlcGVkT2JqZWN0cyhkc3QpOwotCVB5X0lOQ1JFRihrZWVwKTsKLQlyZXR1cm4gS2VlcFJlZihzZWxmLCAwLCBrZWVwKTsKKyAgICBrZWVwID0gR2V0S2VlcGVkT2JqZWN0cyhkc3QpOworICAgIFB5X0lOQ1JFRihrZWVwKTsKKyAgICByZXR1cm4gS2VlcFJlZihzZWxmLCAwLCBrZWVwKTsKIH0KIAogc3RhdGljIFB5R2V0U2V0RGVmIFBvaW50ZXJfZ2V0c2V0c1tdID0gewotCXsgImNvbnRlbnRzIiwgKGdldHRlcilQb2ludGVyX2dldF9jb250ZW50cywKLQkgIChzZXR0ZXIpUG9pbnRlcl9zZXRfY29udGVudHMsCi0JICAidGhlIG9iamVjdCB0aGlzIHBvaW50ZXIgcG9pbnRzIHRvIChyZWFkLXdyaXRlKSIsIE5VTEwgfSwKLQl7IE5VTEwsIE5VTEwgfQorICAgIHsgImNvbnRlbnRzIiwgKGdldHRlcilQb2ludGVyX2dldF9jb250ZW50cywKKyAgICAgIChzZXR0ZXIpUG9pbnRlcl9zZXRfY29udGVudHMsCisgICAgICAidGhlIG9iamVjdCB0aGlzIHBvaW50ZXIgcG9pbnRzIHRvIChyZWFkLXdyaXRlKSIsIE5VTEwgfSwKKyAgICB7IE5VTEwsIE5VTEwgfQogfTsKIAogc3RhdGljIGludAogUG9pbnRlcl9pbml0KENEYXRhT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3KQogewotCVB5T2JqZWN0ICp2YWx1ZSA9IE5VTEw7CisgICAgUHlPYmplY3QgKnZhbHVlID0gTlVMTDsKIAotCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgIlBPSU5URVIiLCAwLCAxLCAmdmFsdWUpKQotCQlyZXR1cm4gLTE7Ci0JaWYgKHZhbHVlID09IE5VTEwpCi0JCXJldHVybiAwOwotCXJldHVybiBQb2ludGVyX3NldF9jb250ZW50cyhzZWxmLCB2YWx1ZSwgTlVMTCk7CisgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiUE9JTlRFUiIsIDAsIDEsICZ2YWx1ZSkpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAodmFsdWUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIFBvaW50ZXJfc2V0X2NvbnRlbnRzKHNlbGYsIHZhbHVlLCBOVUxMKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFBvaW50ZXJfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprdykKIHsKLQlTdGdEaWN0T2JqZWN0ICpkaWN0ID0gUHlUeXBlX3N0Z2RpY3QoKFB5T2JqZWN0ICopdHlwZSk7Ci0JaWYgKCFkaWN0IHx8ICFkaWN0LT5wcm90bykgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJDYW5ub3QgY3JlYXRlIGluc3RhbmNlOiBoYXMgbm8gX3R5cGVfIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gR2VuZXJpY0NEYXRhX25ldyh0eXBlLCBhcmdzLCBrdyk7CisgICAgU3RnRGljdE9iamVjdCAqZGljdCA9IFB5VHlwZV9zdGdkaWN0KChQeU9iamVjdCAqKXR5cGUpOworICAgIGlmICghZGljdCB8fCAhZGljdC0+cHJvdG8pIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgY3JlYXRlIGluc3RhbmNlOiBoYXMgbm8gX3R5cGVfIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gR2VuZXJpY0NEYXRhX25ldyh0eXBlLCBhcmdzLCBrdyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBQb2ludGVyX3NsaWNlKFB5T2JqZWN0ICpfc2VsZiwgUHlfc3NpemVfdCBpbG93LCBQeV9zc2l6ZV90IGloaWdoKQogewotCUNEYXRhT2JqZWN0ICpzZWxmID0gKENEYXRhT2JqZWN0ICopX3NlbGY7Ci0JUHlMaXN0T2JqZWN0ICpucDsKLQlTdGdEaWN0T2JqZWN0ICpzdGdkaWN0LCAqaXRlbWRpY3Q7Ci0JUHlPYmplY3QgKnByb3RvOwotCVB5X3NzaXplX3QgaSwgbGVuOworICAgIENEYXRhT2JqZWN0ICpzZWxmID0gKENEYXRhT2JqZWN0ICopX3NlbGY7CisgICAgUHlMaXN0T2JqZWN0ICpucDsKKyAgICBTdGdEaWN0T2JqZWN0ICpzdGdkaWN0LCAqaXRlbWRpY3Q7CisgICAgUHlPYmplY3QgKnByb3RvOworICAgIFB5X3NzaXplX3QgaSwgbGVuOwogCi0JaWYgKGlsb3cgPCAwKQotCQlpbG93ID0gMDsKLQlpZiAoaWhpZ2ggPCBpbG93KQotCQlpaGlnaCA9IGlsb3c7Ci0JbGVuID0gaWhpZ2ggLSBpbG93OworICAgIGlmIChpbG93IDwgMCkKKyAgICAgICAgaWxvdyA9IDA7CisgICAgaWYgKGloaWdoIDwgaWxvdykKKyAgICAgICAgaWhpZ2ggPSBpbG93OworICAgIGxlbiA9IGloaWdoIC0gaWxvdzsKIAotCXN0Z2RpY3QgPSBQeU9iamVjdF9zdGdkaWN0KChQeU9iamVjdCAqKXNlbGYpOwotCWFzc2VydChzdGdkaWN0KTsgLyogQ2Fubm90IGJlIE5VTEwgZnIgcG9pbnRlciBpbnN0YW5jZXMgKi8KLQlwcm90byA9IHN0Z2RpY3QtPnByb3RvOwotCWFzc2VydChwcm90byk7Ci0JaXRlbWRpY3QgPSBQeVR5cGVfc3RnZGljdChwcm90byk7Ci0JYXNzZXJ0KGl0ZW1kaWN0KTsKLQlpZiAoaXRlbWRpY3QtPmdldGZ1bmMgPT0gZ2V0ZW50cnkoImMiKS0+Z2V0ZnVuYykgewotCQljaGFyICpwdHIgPSAqKGNoYXIgKiopc2VsZi0+Yl9wdHI7Ci0JCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShwdHIgKyBpbG93LCBsZW4pOworICAgIHN0Z2RpY3QgPSBQeU9iamVjdF9zdGdkaWN0KChQeU9iamVjdCAqKXNlbGYpOworICAgIGFzc2VydChzdGdkaWN0KTsgLyogQ2Fubm90IGJlIE5VTEwgZnIgcG9pbnRlciBpbnN0YW5jZXMgKi8KKyAgICBwcm90byA9IHN0Z2RpY3QtPnByb3RvOworICAgIGFzc2VydChwcm90byk7CisgICAgaXRlbWRpY3QgPSBQeVR5cGVfc3RnZGljdChwcm90byk7CisgICAgYXNzZXJ0KGl0ZW1kaWN0KTsKKyAgICBpZiAoaXRlbWRpY3QtPmdldGZ1bmMgPT0gZ2V0ZW50cnkoImMiKS0+Z2V0ZnVuYykgeworICAgICAgICBjaGFyICpwdHIgPSAqKGNoYXIgKiopc2VsZi0+Yl9wdHI7CisgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShwdHIgKyBpbG93LCBsZW4pOwogI2lmZGVmIENUWVBFU19VTklDT0RFCi0JfSBlbHNlIGlmIChpdGVtZGljdC0+Z2V0ZnVuYyA9PSBnZXRlbnRyeSgidSIpLT5nZXRmdW5jKSB7Ci0JCXdjaGFyX3QgKnB0ciA9ICood2NoYXJfdCAqKilzZWxmLT5iX3B0cjsKLQkJcmV0dXJuIFB5VW5pY29kZV9Gcm9tV2lkZUNoYXIocHRyICsgaWxvdywgbGVuKTsKKyAgICB9IGVsc2UgaWYgKGl0ZW1kaWN0LT5nZXRmdW5jID09IGdldGVudHJ5KCJ1IiktPmdldGZ1bmMpIHsKKyAgICAgICAgd2NoYXJfdCAqcHRyID0gKih3Y2hhcl90ICoqKXNlbGYtPmJfcHRyOworICAgICAgICByZXR1cm4gUHlVbmljb2RlX0Zyb21XaWRlQ2hhcihwdHIgKyBpbG93LCBsZW4pOwogI2VuZGlmCi0JfQorICAgIH0KIAotCW5wID0gKFB5TGlzdE9iamVjdCAqKSBQeUxpc3RfTmV3KGxlbik7Ci0JaWYgKG5wID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIG5wID0gKFB5TGlzdE9iamVjdCAqKSBQeUxpc3RfTmV3KGxlbik7CisgICAgaWYgKG5wID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCVB5T2JqZWN0ICp2ID0gUG9pbnRlcl9pdGVtKF9zZWxmLCBpK2lsb3cpOwotCQlQeUxpc3RfU0VUX0lURU0obnAsIGksIHYpOwotCX0KLQlyZXR1cm4gKFB5T2JqZWN0ICopbnA7CisgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgIFB5T2JqZWN0ICp2ID0gUG9pbnRlcl9pdGVtKF9zZWxmLCBpK2lsb3cpOworICAgICAgICBQeUxpc3RfU0VUX0lURU0obnAsIGksIHYpOworICAgIH0KKyAgICByZXR1cm4gKFB5T2JqZWN0ICopbnA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBQb2ludGVyX3N1YnNjcmlwdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICppdGVtKQogewotCUNEYXRhT2JqZWN0ICpzZWxmID0gKENEYXRhT2JqZWN0ICopX3NlbGY7Ci0JaWYgKFB5SW5kZXhfQ2hlY2soaXRlbSkpIHsKLQkJUHlfc3NpemVfdCBpID0gUHlOdW1iZXJfQXNTc2l6ZV90KGl0ZW0sIFB5RXhjX0luZGV4RXJyb3IpOwotCQlpZiAoaSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIE5VTEw7Ci0JCXJldHVybiBQb2ludGVyX2l0ZW0oX3NlbGYsIGkpOwotCX0KLQllbHNlIGlmIChQeVNsaWNlX0NoZWNrKGl0ZW0pKSB7Ci0JCVB5U2xpY2VPYmplY3QgKnNsaWNlID0gKFB5U2xpY2VPYmplY3QgKilpdGVtOwotCQlQeV9zc2l6ZV90IHN0YXJ0LCBzdG9wLCBzdGVwOwotCQlQeU9iamVjdCAqbnA7Ci0JCVN0Z0RpY3RPYmplY3QgKnN0Z2RpY3QsICppdGVtZGljdDsKLQkJUHlPYmplY3QgKnByb3RvOwotCQlQeV9zc2l6ZV90IGksIGxlbiwgY3VyOworICAgIENEYXRhT2JqZWN0ICpzZWxmID0gKENEYXRhT2JqZWN0ICopX3NlbGY7CisgICAgaWYgKFB5SW5kZXhfQ2hlY2soaXRlbSkpIHsKKyAgICAgICAgUHlfc3NpemVfdCBpID0gUHlOdW1iZXJfQXNTc2l6ZV90KGl0ZW0sIFB5RXhjX0luZGV4RXJyb3IpOworICAgICAgICBpZiAoaSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBQb2ludGVyX2l0ZW0oX3NlbGYsIGkpOworICAgIH0KKyAgICBlbHNlIGlmIChQeVNsaWNlX0NoZWNrKGl0ZW0pKSB7CisgICAgICAgIFB5U2xpY2VPYmplY3QgKnNsaWNlID0gKFB5U2xpY2VPYmplY3QgKilpdGVtOworICAgICAgICBQeV9zc2l6ZV90IHN0YXJ0LCBzdG9wLCBzdGVwOworICAgICAgICBQeU9iamVjdCAqbnA7CisgICAgICAgIFN0Z0RpY3RPYmplY3QgKnN0Z2RpY3QsICppdGVtZGljdDsKKyAgICAgICAgUHlPYmplY3QgKnByb3RvOworICAgICAgICBQeV9zc2l6ZV90IGksIGxlbiwgY3VyOwogCi0JCS8qIFNpbmNlIHBvaW50ZXJzIGhhdmUgbm8gbGVuZ3RoLCBhbmQgd2Ugd2FudCB0byBhcHBseQotCQkgICBkaWZmZXJlbnQgc2VtYW50aWNzIHRvIG5lZ2F0aXZlIGluZGljZXMgdGhhbiBub3JtYWwKLQkJICAgc2xpY2luZywgd2UgaGF2ZSB0byBkaXNzZWN0IHRoZSBzbGljZSBvYmplY3Qgb3Vyc2VsdmVzLiovCi0JCWlmIChzbGljZS0+c3RlcCA9PSBQeV9Ob25lKSB7Ci0JCQlzdGVwID0gMTsKLQkJfQotCQllbHNlIHsKLQkJCXN0ZXAgPSBQeU51bWJlcl9Bc1NzaXplX3Qoc2xpY2UtPnN0ZXAsCi0JCQkJCQkgIFB5RXhjX1ZhbHVlRXJyb3IpOwotCQkJaWYgKHN0ZXAgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCWlmIChzdGVwID09IDApIHsKLQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkJCSJzbGljZSBzdGVwIGNhbm5vdCBiZSB6ZXJvIik7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCX0KLQkJaWYgKHNsaWNlLT5zdGFydCA9PSBQeV9Ob25lKSB7Ci0JCQlpZiAoc3RlcCA8IDApIHsKLQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkJCSJzbGljZSBzdGFydCBpcyByZXF1aXJlZCAiCi0JCQkJCQkiZm9yIHN0ZXAgPCAwIik7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCQlzdGFydCA9IDA7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzdGFydCA9IFB5TnVtYmVyX0FzU3NpemVfdChzbGljZS0+c3RhcnQsCi0JCQkJCQkgICBQeUV4Y19WYWx1ZUVycm9yKTsKLQkJCWlmIChzdGFydCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWlmIChzbGljZS0+c3RvcCA9PSBQeV9Ob25lKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkJInNsaWNlIHN0b3AgaXMgcmVxdWlyZWQiKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCXN0b3AgPSBQeU51bWJlcl9Bc1NzaXplX3Qoc2xpY2UtPnN0b3AsCi0JCQkJCSAgUHlFeGNfVmFsdWVFcnJvcik7Ci0JCWlmIChzdG9wID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCQlyZXR1cm4gTlVMTDsKLQkJaWYgKChzdGVwID4gMCAmJiBzdGFydCA+IHN0b3ApIHx8Ci0JCSAgICAoc3RlcCA8IDAgJiYgc3RhcnQgPCBzdG9wKSkKLQkJCWxlbiA9IDA7Ci0JCWVsc2UgaWYgKHN0ZXAgPiAwKQotCQkJbGVuID0gKHN0b3AgLSBzdGFydCAtIDEpIC8gc3RlcCArIDE7Ci0JCWVsc2UKLQkJCWxlbiA9IChzdG9wIC0gc3RhcnQgKyAxKSAvIHN0ZXAgKyAxOworICAgICAgICAvKiBTaW5jZSBwb2ludGVycyBoYXZlIG5vIGxlbmd0aCwgYW5kIHdlIHdhbnQgdG8gYXBwbHkKKyAgICAgICAgICAgZGlmZmVyZW50IHNlbWFudGljcyB0byBuZWdhdGl2ZSBpbmRpY2VzIHRoYW4gbm9ybWFsCisgICAgICAgICAgIHNsaWNpbmcsIHdlIGhhdmUgdG8gZGlzc2VjdCB0aGUgc2xpY2Ugb2JqZWN0IG91cnNlbHZlcy4qLworICAgICAgICBpZiAoc2xpY2UtPnN0ZXAgPT0gUHlfTm9uZSkgeworICAgICAgICAgICAgc3RlcCA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBzdGVwID0gUHlOdW1iZXJfQXNTc2l6ZV90KHNsaWNlLT5zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUV4Y19WYWx1ZUVycm9yKTsKKyAgICAgICAgICAgIGlmIChzdGVwID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICBpZiAoc3RlcCA9PSAwKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzbGljZSBzdGVwIGNhbm5vdCBiZSB6ZXJvIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNsaWNlLT5zdGFydCA9PSBQeV9Ob25lKSB7CisgICAgICAgICAgICBpZiAoc3RlcCA8IDApIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNsaWNlIHN0YXJ0IGlzIHJlcXVpcmVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvciBzdGVwIDwgMCIpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhcnQgPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgc3RhcnQgPSBQeU51bWJlcl9Bc1NzaXplX3Qoc2xpY2UtPnN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlFeGNfVmFsdWVFcnJvcik7CisgICAgICAgICAgICBpZiAoc3RhcnQgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2xpY2UtPnN0b3AgPT0gUHlfTm9uZSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNsaWNlIHN0b3AgaXMgcmVxdWlyZWQiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHN0b3AgPSBQeU51bWJlcl9Bc1NzaXplX3Qoc2xpY2UtPnN0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlFeGNfVmFsdWVFcnJvcik7CisgICAgICAgIGlmIChzdG9wID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKChzdGVwID4gMCAmJiBzdGFydCA+IHN0b3ApIHx8CisgICAgICAgICAgICAoc3RlcCA8IDAgJiYgc3RhcnQgPCBzdG9wKSkKKyAgICAgICAgICAgIGxlbiA9IDA7CisgICAgICAgIGVsc2UgaWYgKHN0ZXAgPiAwKQorICAgICAgICAgICAgbGVuID0gKHN0b3AgLSBzdGFydCAtIDEpIC8gc3RlcCArIDE7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGxlbiA9IChzdG9wIC0gc3RhcnQgKyAxKSAvIHN0ZXAgKyAxOwogCi0JCXN0Z2RpY3QgPSBQeU9iamVjdF9zdGdkaWN0KChQeU9iamVjdCAqKXNlbGYpOwotCQlhc3NlcnQoc3RnZGljdCk7IC8qIENhbm5vdCBiZSBOVUxMIGZvciBwb2ludGVyIGluc3RhbmNlcyAqLwotCQlwcm90byA9IHN0Z2RpY3QtPnByb3RvOwotCQlhc3NlcnQocHJvdG8pOwotCQlpdGVtZGljdCA9IFB5VHlwZV9zdGdkaWN0KHByb3RvKTsKLQkJYXNzZXJ0KGl0ZW1kaWN0KTsKLQkJaWYgKGl0ZW1kaWN0LT5nZXRmdW5jID09IGdldGVudHJ5KCJjIiktPmdldGZ1bmMpIHsKLQkJCWNoYXIgKnB0ciA9ICooY2hhciAqKilzZWxmLT5iX3B0cjsKLQkJCWNoYXIgKmRlc3Q7Ci0JCQkKLQkJCWlmIChsZW4gPD0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIAlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZygiIik7Ci0JCQlpZiAoc3RlcCA9PSAxKSB7Ci0JCQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHB0ciArIHN0YXJ0LAotCQkJCQkJCQkgIGxlbik7Ci0JCQl9Ci0JCQlkZXN0ID0gKGNoYXIgKilQeU1lbV9NYWxsb2MobGVuKTsKLQkJCWlmIChkZXN0ID09IE5VTEwpCi0JCQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JCQlmb3IgKGN1ciA9IHN0YXJ0LCBpID0gMDsgaSA8IGxlbjsgY3VyICs9IHN0ZXAsIGkrKykgewotCQkJCWRlc3RbaV0gPSBwdHJbY3VyXTsKLQkJCX0KLQkJCW5wID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoZGVzdCwgbGVuKTsKLQkJCVB5TWVtX0ZyZWUoZGVzdCk7Ci0JCQlyZXR1cm4gbnA7Ci0JCX0KKyAgICAgICAgc3RnZGljdCA9IFB5T2JqZWN0X3N0Z2RpY3QoKFB5T2JqZWN0ICopc2VsZik7CisgICAgICAgIGFzc2VydChzdGdkaWN0KTsgLyogQ2Fubm90IGJlIE5VTEwgZm9yIHBvaW50ZXIgaW5zdGFuY2VzICovCisgICAgICAgIHByb3RvID0gc3RnZGljdC0+cHJvdG87CisgICAgICAgIGFzc2VydChwcm90byk7CisgICAgICAgIGl0ZW1kaWN0ID0gUHlUeXBlX3N0Z2RpY3QocHJvdG8pOworICAgICAgICBhc3NlcnQoaXRlbWRpY3QpOworICAgICAgICBpZiAoaXRlbWRpY3QtPmdldGZ1bmMgPT0gZ2V0ZW50cnkoImMiKS0+Z2V0ZnVuYykgeworICAgICAgICAgICAgY2hhciAqcHRyID0gKihjaGFyICoqKXNlbGYtPmJfcHRyOworICAgICAgICAgICAgY2hhciAqZGVzdDsKKworICAgICAgICAgICAgaWYgKGxlbiA8PSAwKQorICAgICAgICAgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKCIiKTsKKyAgICAgICAgICAgIGlmIChzdGVwID09IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocHRyICsgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZXN0ID0gKGNoYXIgKilQeU1lbV9NYWxsb2MobGVuKTsKKyAgICAgICAgICAgIGlmIChkZXN0ID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgICAgICBmb3IgKGN1ciA9IHN0YXJ0LCBpID0gMDsgaSA8IGxlbjsgY3VyICs9IHN0ZXAsIGkrKykgeworICAgICAgICAgICAgICAgIGRlc3RbaV0gPSBwdHJbY3VyXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5wID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoZGVzdCwgbGVuKTsKKyAgICAgICAgICAgIFB5TWVtX0ZyZWUoZGVzdCk7CisgICAgICAgICAgICByZXR1cm4gbnA7CisgICAgICAgIH0KICNpZmRlZiBDVFlQRVNfVU5JQ09ERQotCQlpZiAoaXRlbWRpY3QtPmdldGZ1bmMgPT0gZ2V0ZW50cnkoInUiKS0+Z2V0ZnVuYykgewotCQkJd2NoYXJfdCAqcHRyID0gKih3Y2hhcl90ICoqKXNlbGYtPmJfcHRyOwotCQkJd2NoYXJfdCAqZGVzdDsKLQkJCQotCQkJaWYgKGxlbiA8PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgCXJldHVybiBQeVVuaWNvZGVfRnJvbVVuaWNvZGUoTlVMTCwgMCk7Ci0JCQlpZiAoc3RlcCA9PSAxKSB7Ci0JCQkJcmV0dXJuIFB5VW5pY29kZV9Gcm9tV2lkZUNoYXIocHRyICsgc3RhcnQsCi0JCQkJCQkJICAgICAgbGVuKTsKLQkJCX0KLQkJCWRlc3QgPSAod2NoYXJfdCAqKVB5TWVtX01hbGxvYyhsZW4gKiBzaXplb2Yod2NoYXJfdCkpOwotCQkJaWYgKGRlc3QgPT0gTlVMTCkKLQkJCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQkJCWZvciAoY3VyID0gc3RhcnQsIGkgPSAwOyBpIDwgbGVuOyBjdXIgKz0gc3RlcCwgaSsrKSB7Ci0JCQkJZGVzdFtpXSA9IHB0cltjdXJdOwotCQkJfQotCQkJbnAgPSBQeVVuaWNvZGVfRnJvbVdpZGVDaGFyKGRlc3QsIGxlbik7Ci0JCQlQeU1lbV9GcmVlKGRlc3QpOwotCQkJcmV0dXJuIG5wOwotCQl9CisgICAgICAgIGlmIChpdGVtZGljdC0+Z2V0ZnVuYyA9PSBnZXRlbnRyeSgidSIpLT5nZXRmdW5jKSB7CisgICAgICAgICAgICB3Y2hhcl90ICpwdHIgPSAqKHdjaGFyX3QgKiopc2VsZi0+Yl9wdHI7CisgICAgICAgICAgICB3Y2hhcl90ICpkZXN0OworCisgICAgICAgICAgICBpZiAobGVuIDw9IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIFB5VW5pY29kZV9Gcm9tVW5pY29kZShOVUxMLCAwKTsKKyAgICAgICAgICAgIGlmIChzdGVwID09IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUHlVbmljb2RlX0Zyb21XaWRlQ2hhcihwdHIgKyBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVzdCA9ICh3Y2hhcl90ICopUHlNZW1fTWFsbG9jKGxlbiAqIHNpemVvZih3Y2hhcl90KSk7CisgICAgICAgICAgICBpZiAoZGVzdCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICAgICAgZm9yIChjdXIgPSBzdGFydCwgaSA9IDA7IGkgPCBsZW47IGN1ciArPSBzdGVwLCBpKyspIHsKKyAgICAgICAgICAgICAgICBkZXN0W2ldID0gcHRyW2N1cl07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBucCA9IFB5VW5pY29kZV9Gcm9tV2lkZUNoYXIoZGVzdCwgbGVuKTsKKyAgICAgICAgICAgIFB5TWVtX0ZyZWUoZGVzdCk7CisgICAgICAgICAgICByZXR1cm4gbnA7CisgICAgICAgIH0KICNlbmRpZgogCi0JCW5wID0gUHlMaXN0X05ldyhsZW4pOwotCQlpZiAobnAgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOworICAgICAgICBucCA9IFB5TGlzdF9OZXcobGVuKTsKKyAgICAgICAgaWYgKG5wID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKIAotCQlmb3IgKGN1ciA9IHN0YXJ0LCBpID0gMDsgaSA8IGxlbjsgY3VyICs9IHN0ZXAsIGkrKykgewotCQkJUHlPYmplY3QgKnYgPSBQb2ludGVyX2l0ZW0oX3NlbGYsIGN1cik7Ci0JCQlQeUxpc3RfU0VUX0lURU0obnAsIGksIHYpOwotCQl9Ci0JCXJldHVybiBucDsKLQl9Ci0JZWxzZSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJIlBvaW50ZXIgaW5kaWNlcyBtdXN0IGJlIGludGVnZXIiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgICAgICBmb3IgKGN1ciA9IHN0YXJ0LCBpID0gMDsgaSA8IGxlbjsgY3VyICs9IHN0ZXAsIGkrKykgeworICAgICAgICAgICAgUHlPYmplY3QgKnYgPSBQb2ludGVyX2l0ZW0oX3NlbGYsIGN1cik7CisgICAgICAgICAgICBQeUxpc3RfU0VUX0lURU0obnAsIGksIHYpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBucDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiUG9pbnRlciBpbmRpY2VzIG11c3QgYmUgaW50ZWdlciIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiB9CiAKIHN0YXRpYyBQeVNlcXVlbmNlTWV0aG9kcyBQb2ludGVyX2FzX3NlcXVlbmNlID0gewotCTAsCQkJCQkvKiBpbnF1aXJ5IHNxX2xlbmd0aDsgKi8KLQkwLAkJCQkJLyogYmluYXJ5ZnVuYyBzcV9jb25jYXQ7ICovCi0JMCwJCQkJCS8qIGludGFyZ2Z1bmMgc3FfcmVwZWF0OyAqLwotCVBvaW50ZXJfaXRlbSwJCQkJLyogaW50YXJnZnVuYyBzcV9pdGVtOyAqLwotCVBvaW50ZXJfc2xpY2UsCQkJCS8qIGludGludGFyZ2Z1bmMgc3Ffc2xpY2U7ICovCi0JUG9pbnRlcl9hc3NfaXRlbSwJCQkvKiBpbnRvYmphcmdwcm9jIHNxX2Fzc19pdGVtOyAqLwotCTAsCQkJCQkvKiBpbnRpbnRvYmphcmdwcm9jIHNxX2Fzc19zbGljZTsgKi8KLQkwLAkJCQkJLyogb2Jqb2JqcHJvYyBzcV9jb250YWluczsgKi8KLQkvKiBBZGRlZCBpbiByZWxlYXNlIDIuMCAqLwotCTAsCQkJCQkvKiBiaW5hcnlmdW5jIHNxX2lucGxhY2VfY29uY2F0OyAqLwotCTAsCQkJCQkvKiBpbnRhcmdmdW5jIHNxX2lucGxhY2VfcmVwZWF0OyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5xdWlyeSBzcV9sZW5ndGg7ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBiaW5hcnlmdW5jIHNxX2NvbmNhdDsgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGludGFyZ2Z1bmMgc3FfcmVwZWF0OyAqLworICAgIFBvaW50ZXJfaXRlbSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW50YXJnZnVuYyBzcV9pdGVtOyAqLworICAgIFBvaW50ZXJfc2xpY2UsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW50aW50YXJnZnVuYyBzcV9zbGljZTsgKi8KKyAgICBQb2ludGVyX2Fzc19pdGVtLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGludG9iamFyZ3Byb2Mgc3FfYXNzX2l0ZW07ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnRpbnRvYmphcmdwcm9jIHNxX2Fzc19zbGljZTsgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9iam9ianByb2Mgc3FfY29udGFpbnM7ICovCisgICAgLyogQWRkZWQgaW4gcmVsZWFzZSAyLjAgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJpbmFyeWZ1bmMgc3FfaW5wbGFjZV9jb25jYXQ7ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnRhcmdmdW5jIHNxX2lucGxhY2VfcmVwZWF0OyAqLwogfTsKIAogc3RhdGljIFB5TWFwcGluZ01ldGhvZHMgUG9pbnRlcl9hc19tYXBwaW5nID0gewotCTAsCi0JUG9pbnRlcl9zdWJzY3JpcHQsCisgICAgMCwKKyAgICBQb2ludGVyX3N1YnNjcmlwdCwKIH07CiAKIHN0YXRpYyBpbnQKIFBvaW50ZXJfbm9uemVybyhDRGF0YU9iamVjdCAqc2VsZikKIHsKLQlyZXR1cm4gKCoodm9pZCAqKilzZWxmLT5iX3B0ciAhPSBOVUxMKTsKKyAgICByZXR1cm4gKCoodm9pZCAqKilzZWxmLT5iX3B0ciAhPSBOVUxMKTsKIH0KIAogc3RhdGljIFB5TnVtYmVyTWV0aG9kcyBQb2ludGVyX2FzX251bWJlciA9IHsKLQkwLCAvKiBuYl9hZGQgKi8KLQkwLCAvKiBuYl9zdWJ0cmFjdCAqLwotCTAsIC8qIG5iX211bHRpcGx5ICovCi0JMCwgLyogbmJfZGl2aWRlICovCi0JMCwgLyogbmJfcmVtYWluZGVyICovCi0JMCwgLyogbmJfZGl2bW9kICovCi0JMCwgLyogbmJfcG93ZXIgKi8KLQkwLCAvKiBuYl9uZWdhdGl2ZSAqLwotCTAsIC8qIG5iX3Bvc2l0aXZlICovCi0JMCwgLyogbmJfYWJzb2x1dGUgKi8KLQkoaW5xdWlyeSlQb2ludGVyX25vbnplcm8sIC8qIG5iX25vbnplcm8gKi8KKyAgICAwLCAvKiBuYl9hZGQgKi8KKyAgICAwLCAvKiBuYl9zdWJ0cmFjdCAqLworICAgIDAsIC8qIG5iX211bHRpcGx5ICovCisgICAgMCwgLyogbmJfZGl2aWRlICovCisgICAgMCwgLyogbmJfcmVtYWluZGVyICovCisgICAgMCwgLyogbmJfZGl2bW9kICovCisgICAgMCwgLyogbmJfcG93ZXIgKi8KKyAgICAwLCAvKiBuYl9uZWdhdGl2ZSAqLworICAgIDAsIC8qIG5iX3Bvc2l0aXZlICovCisgICAgMCwgLyogbmJfYWJzb2x1dGUgKi8KKyAgICAoaW5xdWlyeSlQb2ludGVyX25vbnplcm8sIC8qIG5iX25vbnplcm8gKi8KIH07CiAKIFB5VHlwZU9iamVjdCBQb2ludGVyX1R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JIl9jdHlwZXMuX1BvaW50ZXIiLAotCXNpemVvZihDRGF0YU9iamVjdCksCQkJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJCS8qIHRwX2l0ZW1zaXplICovCi0JMCwJCQkJCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfcmVwciAqLwotCSZQb2ludGVyX2FzX251bWJlciwJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkmUG9pbnRlcl9hc19zZXF1ZW5jZSwJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCSZQb2ludGVyX2FzX21hcHBpbmcsCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkJLyogdHBfc3RyICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHJvICovCi0JJkNEYXRhX2FzX2J1ZmZlciwJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfTkVXQlVGRkVSIHwgUHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQkiWFhYIHRvIGJlIHByb3ZpZGVkIiwJCQkvKiB0cF9kb2MgKi8KLQkodHJhdmVyc2Vwcm9jKUNEYXRhX3RyYXZlcnNlLAkJLyogdHBfdHJhdmVyc2UgKi8KLQkoaW5xdWlyeSlDRGF0YV9jbGVhciwJCQkvKiB0cF9jbGVhciAqLwotCTAsCQkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCTAsCQkJCQkvKiB0cF9pdGVyICovCi0JMCwJCQkJCS8qIHRwX2l0ZXJuZXh0ICovCi0JMCwJCQkJCS8qIHRwX21ldGhvZHMgKi8KLQkwLAkJCQkJLyogdHBfbWVtYmVycyAqLwotCVBvaW50ZXJfZ2V0c2V0cywJCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCQkvKiB0cF9kaWN0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KLQkwLAkJCQkJLyogdHBfZGljdG9mZnNldCAqLwotCShpbml0cHJvYylQb2ludGVyX2luaXQsCQkJLyogdHBfaW5pdCAqLwotCTAsCQkJCQkvKiB0cF9hbGxvYyAqLwotCVBvaW50ZXJfbmV3LAkJCQkvKiB0cF9uZXcgKi8KLQkwLAkJCQkJLyogdHBfZnJlZSAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQorICAgICJfY3R5cGVzLl9Qb2ludGVyIiwKKyAgICBzaXplb2YoQ0RhdGFPYmplY3QpLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgJlBvaW50ZXJfYXNfbnVtYmVyLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAmUG9pbnRlcl9hc19zZXF1ZW5jZSwgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgJlBvaW50ZXJfYXNfbWFwcGluZywgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgICZDRGF0YV9hc19idWZmZXIsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX05FV0JVRkZFUiB8IFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgIlhYWCB0byBiZSBwcm92aWRlZCIsICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAodHJhdmVyc2Vwcm9jKUNEYXRhX3RyYXZlcnNlLCAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgKGlucXVpcnkpQ0RhdGFfY2xlYXIsICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIFBvaW50ZXJfZ2V0c2V0cywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIChpbml0cHJvYylQb2ludGVyX2luaXQsICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBQb2ludGVyX25ldywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKIAotDAorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKICAqICBNb2R1bGUgaW5pdGlhbGl6YXRpb24uCkBAIC01MjcyLDc4ICs1MjcyLDc4IEBACiAgICAgaW50IHN0YXR1czsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT09PTzpDT01FcnJvciIsICZzZWxmLCAmaHJlc3VsdCwgJnRleHQsICZkZXRhaWxzKSkKLQkgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgYSA9IFB5U2VxdWVuY2VfR2V0U2xpY2UoYXJncywgMSwgUHlTZXF1ZW5jZV9TaXplKGFyZ3MpKTsKICAgICBpZiAoIWEpCi0gICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBOVUxMOwogICAgIHN0YXR1cyA9IFB5T2JqZWN0X1NldEF0dHJTdHJpbmcoc2VsZiwgImFyZ3MiLCBhKTsKICAgICBQeV9ERUNSRUYoYSk7CiAgICAgaWYgKHN0YXR1cyA8IDApCi0gICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBOVUxMOwogCiAgICAgaWYgKFB5T2JqZWN0X1NldEF0dHJTdHJpbmcoc2VsZiwgImhyZXN1bHQiLCBocmVzdWx0KSA8IDApCi0JICAgIHJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIGlmIChQeU9iamVjdF9TZXRBdHRyU3RyaW5nKHNlbGYsICJ0ZXh0IiwgdGV4dCkgPCAwKQotCSAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICBpZiAoUHlPYmplY3RfU2V0QXR0clN0cmluZyhzZWxmLCAiZGV0YWlscyIsIGRldGFpbHMpIDwgMCkKLQkgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwogICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgY29tZXJyb3JfbWV0aG9kc1tdID0gewotCXsgIl9faW5pdF9fIiwgY29tZXJyb3JfaW5pdCwgTUVUSF9WQVJBUkdTIH0sCi0JeyBOVUxMLCBOVUxMIH0sCisgICAgeyAiX19pbml0X18iLCBjb21lcnJvcl9pbml0LCBNRVRIX1ZBUkFSR1MgfSwKKyAgICB7IE5VTEwsIE5VTEwgfSwKIH07CiAKIHN0YXRpYyBpbnQKIGNyZWF0ZV9jb21lcnJvcih2b2lkKQogewotCVB5T2JqZWN0ICpkaWN0ID0gUHlEaWN0X05ldygpOwotCVB5TWV0aG9kRGVmICptZXRob2RzID0gY29tZXJyb3JfbWV0aG9kczsKLQlQeU9iamVjdCAqczsKLQlpbnQgc3RhdHVzOworICAgIFB5T2JqZWN0ICpkaWN0ID0gUHlEaWN0X05ldygpOworICAgIFB5TWV0aG9kRGVmICptZXRob2RzID0gY29tZXJyb3JfbWV0aG9kczsKKyAgICBQeU9iamVjdCAqczsKKyAgICBpbnQgc3RhdHVzOwogCi0JaWYgKGRpY3QgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOworICAgIGlmIChkaWN0ID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKIAotCXdoaWxlIChtZXRob2RzLT5tbF9uYW1lKSB7Ci0JCS8qIGdldCBhIHdyYXBwZXIgZm9yIHRoZSBidWlsdC1pbiBmdW5jdGlvbiAqLwotCQlQeU9iamVjdCAqZnVuYyA9IFB5Q0Z1bmN0aW9uX05ldyhtZXRob2RzLCBOVUxMKTsKLQkJUHlPYmplY3QgKm1ldGg7Ci0JCWlmIChmdW5jID09IE5VTEwpCi0JCQlnb3RvIGVycm9yOwotCQltZXRoID0gUHlNZXRob2RfTmV3KGZ1bmMsIE5VTEwsIENvbUVycm9yKTsKLQkJUHlfREVDUkVGKGZ1bmMpOwotCQlpZiAobWV0aCA9PSBOVUxMKQotCQkJZ290byBlcnJvcjsKLQkJUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgbWV0aG9kcy0+bWxfbmFtZSwgbWV0aCk7Ci0JCVB5X0RFQ1JFRihtZXRoKTsKLQkJKyttZXRob2RzOwotCX0KKyAgICB3aGlsZSAobWV0aG9kcy0+bWxfbmFtZSkgeworICAgICAgICAvKiBnZXQgYSB3cmFwcGVyIGZvciB0aGUgYnVpbHQtaW4gZnVuY3Rpb24gKi8KKyAgICAgICAgUHlPYmplY3QgKmZ1bmMgPSBQeUNGdW5jdGlvbl9OZXcobWV0aG9kcywgTlVMTCk7CisgICAgICAgIFB5T2JqZWN0ICptZXRoOworICAgICAgICBpZiAoZnVuYyA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgbWV0aCA9IFB5TWV0aG9kX05ldyhmdW5jLCBOVUxMLCBDb21FcnJvcik7CisgICAgICAgIFB5X0RFQ1JFRihmdW5jKTsKKyAgICAgICAgaWYgKG1ldGggPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsIG1ldGhvZHMtPm1sX25hbWUsIG1ldGgpOworICAgICAgICBQeV9ERUNSRUYobWV0aCk7CisgICAgICAgICsrbWV0aG9kczsKKyAgICB9CiAKLQlzID0gUHlTdHJpbmdfRnJvbVN0cmluZyhjb21lcnJvcl9kb2MpOwotCWlmIChzID09IE5VTEwpCi0JCWdvdG8gZXJyb3I7Ci0Jc3RhdHVzID0gUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgIl9fZG9jX18iLCBzKTsKLQlQeV9ERUNSRUYocyk7Ci0JaWYgKHN0YXR1cyA9PSAtMSkKLQkJZ290byBlcnJvcjsKKyAgICBzID0gUHlTdHJpbmdfRnJvbVN0cmluZyhjb21lcnJvcl9kb2MpOworICAgIGlmIChzID09IE5VTEwpCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgc3RhdHVzID0gUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgIl9fZG9jX18iLCBzKTsKKyAgICBQeV9ERUNSRUYocyk7CisgICAgaWYgKHN0YXR1cyA9PSAtMSkKKyAgICAgICAgZ290byBlcnJvcjsKIAotCUNvbUVycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJfY3R5cGVzLkNPTUVycm9yIiwKLQkJCQkgICAgICBOVUxMLAotCQkJCSAgICAgIGRpY3QpOwotCWlmIChDb21FcnJvciA9PSBOVUxMKQotCQlnb3RvIGVycm9yOworICAgIENvbUVycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJfY3R5cGVzLkNPTUVycm9yIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpY3QpOworICAgIGlmIChDb21FcnJvciA9PSBOVUxMKQorICAgICAgICBnb3RvIGVycm9yOwogCi0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiAgIGVycm9yOgotCVB5X0RFQ1JFRihkaWN0KTsKLQlyZXR1cm4gLTE7CisgICAgUHlfREVDUkVGKGRpY3QpOworICAgIHJldHVybiAtMTsKIH0KIAogI2VuZGlmCkBAIC01MzUxLDI0NiArNTM1MSwyNDYgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdHJpbmdfYXQoY29uc3QgY2hhciAqcHRyLCBpbnQgc2l6ZSkKIHsKLQlpZiAoc2l6ZSA9PSAtMSkKLQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcocHRyKTsKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocHRyLCBzaXplKTsKKyAgICBpZiAoc2l6ZSA9PSAtMSkKKyAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcocHRyKTsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocHRyLCBzaXplKTsKIH0KIAogc3RhdGljIGludAogY2FzdF9jaGVja19wb2ludGVydHlwZShQeU9iamVjdCAqYXJnKQogewotCVN0Z0RpY3RPYmplY3QgKmRpY3Q7CisgICAgU3RnRGljdE9iamVjdCAqZGljdDsKIAotCWlmIChQb2ludGVyVHlwZU9iamVjdF9DaGVjayhhcmcpKQotCQlyZXR1cm4gMTsKLQlpZiAoQ0Z1bmNQdHJUeXBlT2JqZWN0X0NoZWNrKGFyZykpCi0JCXJldHVybiAxOwotCWRpY3QgPSBQeVR5cGVfc3RnZGljdChhcmcpOwotCWlmIChkaWN0KSB7Ci0JCWlmIChQeVN0cmluZ19DaGVjayhkaWN0LT5wcm90bykKLQkJICAgICYmIChzdHJjaHIoInNQelVaWE8iLCBQeVN0cmluZ19BU19TVFJJTkcoZGljdC0+cHJvdG8pWzBdKSkpIHsKLQkJCS8qIHNpbXBsZSBwb2ludGVyIHR5cGVzLCBjX3ZvaWRfcCwgY193Y2hhcl9wLCBCU1RSLCAuLi4gKi8KLQkJCXJldHVybiAxOwotCQl9Ci0JfQotCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCSAgICAgImNhc3QoKSBhcmd1bWVudCAyIG11c3QgYmUgYSBwb2ludGVyIHR5cGUsIG5vdCAlcyIsCi0JCSAgICAgUHlUeXBlX0NoZWNrKGFyZykKLQkJICAgICA/ICgoUHlUeXBlT2JqZWN0ICopYXJnKS0+dHBfbmFtZQotCQkgICAgIDogUHlfVFlQRShhcmcpLT50cF9uYW1lKTsKLQlyZXR1cm4gMDsKKyAgICBpZiAoUG9pbnRlclR5cGVPYmplY3RfQ2hlY2soYXJnKSkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgaWYgKENGdW5jUHRyVHlwZU9iamVjdF9DaGVjayhhcmcpKQorICAgICAgICByZXR1cm4gMTsKKyAgICBkaWN0ID0gUHlUeXBlX3N0Z2RpY3QoYXJnKTsKKyAgICBpZiAoZGljdCkgeworICAgICAgICBpZiAoUHlTdHJpbmdfQ2hlY2soZGljdC0+cHJvdG8pCisgICAgICAgICAgICAmJiAoc3RyY2hyKCJzUHpVWlhPIiwgUHlTdHJpbmdfQVNfU1RSSU5HKGRpY3QtPnByb3RvKVswXSkpKSB7CisgICAgICAgICAgICAvKiBzaW1wbGUgcG9pbnRlciB0eXBlcywgY192b2lkX3AsIGNfd2NoYXJfcCwgQlNUUiwgLi4uICovCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAiY2FzdCgpIGFyZ3VtZW50IDIgbXVzdCBiZSBhIHBvaW50ZXIgdHlwZSwgbm90ICVzIiwKKyAgICAgICAgICAgICAgICAgUHlUeXBlX0NoZWNrKGFyZykKKyAgICAgICAgICAgICAgICAgPyAoKFB5VHlwZU9iamVjdCAqKWFyZyktPnRwX25hbWUKKyAgICAgICAgICAgICAgICAgOiBQeV9UWVBFKGFyZyktPnRwX25hbWUpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY2FzdCh2b2lkICpwdHIsIFB5T2JqZWN0ICpzcmMsIFB5T2JqZWN0ICpjdHlwZSkKIHsKLQlDRGF0YU9iamVjdCAqcmVzdWx0OwotCWlmICgwID09IGNhc3RfY2hlY2tfcG9pbnRlcnR5cGUoY3R5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXN1bHQgPSAoQ0RhdGFPYmplY3QgKilQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGN0eXBlLCBOVUxMKTsKLQlpZiAocmVzdWx0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIENEYXRhT2JqZWN0ICpyZXN1bHQ7CisgICAgaWYgKDAgPT0gY2FzdF9jaGVja19wb2ludGVydHlwZShjdHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJlc3VsdCA9IChDRGF0YU9iamVjdCAqKVB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoY3R5cGUsIE5VTEwpOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkvKgotCSAgVGhlIGNhc3RlZCBvYmplY3RzICdfb2JqZWN0cycgbWVtYmVyOgorICAgIC8qCisgICAgICBUaGUgY2FzdGVkIG9iamVjdHMgJ19vYmplY3RzJyBtZW1iZXI6CiAKLQkgIEl0IG11c3QgY2VydGFpbmx5IGNvbnRhaW4gdGhlIHNvdXJjZSBvYmplY3RzIG9uZS4KLQkgIEl0IG11c3QgY29udGFpbiB0aGUgc291cmNlIG9iamVjdCBpdHNlbGYuCi0JICovCi0JaWYgKENEYXRhT2JqZWN0X0NoZWNrKHNyYykpIHsKLQkJQ0RhdGFPYmplY3QgKm9iaiA9IChDRGF0YU9iamVjdCAqKXNyYzsKLQkJLyogQ0RhdGFfR2V0Q29udGFpbmVyIHdpbGwgaW5pdGlhbGl6ZSBzcmMuYl9vYmplY3RzLCB3ZSBuZWVkCi0JCSAgIHRoaXMgc28gaXQgY2FuIGJlIHNoYXJlZCAqLwotCQlDRGF0YV9HZXRDb250YWluZXIob2JqKTsKLQkJLyogQnV0IHdlIG5lZWQgYSBkaWN0aW9uYXJ5ISAqLwotCQlpZiAob2JqLT5iX29iamVjdHMgPT0gUHlfTm9uZSkgewotCQkJUHlfREVDUkVGKFB5X05vbmUpOwotCQkJb2JqLT5iX29iamVjdHMgPSBQeURpY3RfTmV3KCk7Ci0JCQlpZiAob2JqLT5iX29iamVjdHMgPT0gTlVMTCkKLQkJCQlnb3RvIGZhaWxlZDsKLQkJfQotCQlQeV9YSU5DUkVGKG9iai0+Yl9vYmplY3RzKTsKLQkJcmVzdWx0LT5iX29iamVjdHMgPSBvYmotPmJfb2JqZWN0czsKLQkJaWYgKHJlc3VsdC0+Yl9vYmplY3RzICYmIFB5RGljdF9DaGVja0V4YWN0KHJlc3VsdC0+Yl9vYmplY3RzKSkgewotCQkJUHlPYmplY3QgKmluZGV4OwotCQkJaW50IHJjOwotCQkJaW5kZXggPSBQeUxvbmdfRnJvbVZvaWRQdHIoKHZvaWQgKilzcmMpOwotCQkJaWYgKGluZGV4ID09IE5VTEwpCi0JCQkJZ290byBmYWlsZWQ7Ci0JCQlyYyA9IFB5RGljdF9TZXRJdGVtKHJlc3VsdC0+Yl9vYmplY3RzLCBpbmRleCwgc3JjKTsKLQkJCVB5X0RFQ1JFRihpbmRleCk7Ci0JCQlpZiAocmMgPT0gLTEpCi0JCQkJZ290byBmYWlsZWQ7Ci0JCX0KLQl9Ci0JLyogU2hvdWxkIHdlIGFzc2VydCB0aGF0IHJlc3VsdCBpcyBhIHBvaW50ZXIgdHlwZT8gKi8KLQltZW1jcHkocmVzdWx0LT5iX3B0ciwgJnB0ciwgc2l6ZW9mKHZvaWQgKikpOwotCXJldHVybiAoUHlPYmplY3QgKilyZXN1bHQ7CisgICAgICBJdCBtdXN0IGNlcnRhaW5seSBjb250YWluIHRoZSBzb3VyY2Ugb2JqZWN0cyBvbmUuCisgICAgICBJdCBtdXN0IGNvbnRhaW4gdGhlIHNvdXJjZSBvYmplY3QgaXRzZWxmLgorICAgICAqLworICAgIGlmIChDRGF0YU9iamVjdF9DaGVjayhzcmMpKSB7CisgICAgICAgIENEYXRhT2JqZWN0ICpvYmogPSAoQ0RhdGFPYmplY3QgKilzcmM7CisgICAgICAgIC8qIENEYXRhX0dldENvbnRhaW5lciB3aWxsIGluaXRpYWxpemUgc3JjLmJfb2JqZWN0cywgd2UgbmVlZAorICAgICAgICAgICB0aGlzIHNvIGl0IGNhbiBiZSBzaGFyZWQgKi8KKyAgICAgICAgQ0RhdGFfR2V0Q29udGFpbmVyKG9iaik7CisgICAgICAgIC8qIEJ1dCB3ZSBuZWVkIGEgZGljdGlvbmFyeSEgKi8KKyAgICAgICAgaWYgKG9iai0+Yl9vYmplY3RzID09IFB5X05vbmUpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgICAgIG9iai0+Yl9vYmplY3RzID0gUHlEaWN0X05ldygpOworICAgICAgICAgICAgaWYgKG9iai0+Yl9vYmplY3RzID09IE5VTEwpCisgICAgICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgIH0KKyAgICAgICAgUHlfWElOQ1JFRihvYmotPmJfb2JqZWN0cyk7CisgICAgICAgIHJlc3VsdC0+Yl9vYmplY3RzID0gb2JqLT5iX29iamVjdHM7CisgICAgICAgIGlmIChyZXN1bHQtPmJfb2JqZWN0cyAmJiBQeURpY3RfQ2hlY2tFeGFjdChyZXN1bHQtPmJfb2JqZWN0cykpIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICppbmRleDsKKyAgICAgICAgICAgIGludCByYzsKKyAgICAgICAgICAgIGluZGV4ID0gUHlMb25nX0Zyb21Wb2lkUHRyKCh2b2lkICopc3JjKTsKKyAgICAgICAgICAgIGlmIChpbmRleCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICAgICAgcmMgPSBQeURpY3RfU2V0SXRlbShyZXN1bHQtPmJfb2JqZWN0cywgaW5kZXgsIHNyYyk7CisgICAgICAgICAgICBQeV9ERUNSRUYoaW5kZXgpOworICAgICAgICAgICAgaWYgKHJjID09IC0xKQorICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICB9CisgICAgfQorICAgIC8qIFNob3VsZCB3ZSBhc3NlcnQgdGhhdCByZXN1bHQgaXMgYSBwb2ludGVyIHR5cGU/ICovCisgICAgbWVtY3B5KHJlc3VsdC0+Yl9wdHIsICZwdHIsIHNpemVvZih2b2lkICopKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopcmVzdWx0OwogCiAgIGZhaWxlZDoKLQlQeV9ERUNSRUYocmVzdWx0KTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogI2lmZGVmIENUWVBFU19VTklDT0RFCiBzdGF0aWMgUHlPYmplY3QgKgogd3N0cmluZ19hdChjb25zdCB3Y2hhcl90ICpwdHIsIGludCBzaXplKQogewotCVB5X3NzaXplX3Qgc3NpemUgPSBzaXplOwotCWlmIChzc2l6ZSA9PSAtMSkKLQkJc3NpemUgPSB3Y3NsZW4ocHRyKTsKLQlyZXR1cm4gUHlVbmljb2RlX0Zyb21XaWRlQ2hhcihwdHIsIHNzaXplKTsKKyAgICBQeV9zc2l6ZV90IHNzaXplID0gc2l6ZTsKKyAgICBpZiAoc3NpemUgPT0gLTEpCisgICAgICAgIHNzaXplID0gd2NzbGVuKHB0cik7CisgICAgcmV0dXJuIFB5VW5pY29kZV9Gcm9tV2lkZUNoYXIocHRyLCBzc2l6ZSk7CiB9CiAjZW5kaWYKIAogUHlNT0RJTklUX0ZVTkMKIGluaXRfY3R5cGVzKHZvaWQpCiB7Ci0JUHlPYmplY3QgKm07CisgICAgUHlPYmplY3QgKm07CiAKIC8qIE5vdGU6CiAgICBvYl90eXBlIGlzIHRoZSBtZXRhdHlwZSAodGhlICd0eXBlJyksIGRlZmF1bHRzIHRvIFB5VHlwZV9UeXBlLAogICAgdHBfYmFzZSBpcyB0aGUgYmFzZSB0eXBlLCBkZWZhdWx0cyB0byAnb2JqZWN0JyBha2EgUHlCYXNlT2JqZWN0X1R5cGUuCiAqLwogI2lmZGVmIFdJVEhfVEhSRUFECi0JUHlFdmFsX0luaXRUaHJlYWRzKCk7CisgICAgUHlFdmFsX0luaXRUaHJlYWRzKCk7CiAjZW5kaWYKLQltID0gUHlfSW5pdE1vZHVsZTMoIl9jdHlwZXMiLCBtb2R1bGVfbWV0aG9kcywgbW9kdWxlX2RvY3MpOwotCWlmICghbSkKLQkJcmV0dXJuOworICAgIG0gPSBQeV9Jbml0TW9kdWxlMygiX2N0eXBlcyIsIG1vZHVsZV9tZXRob2RzLCBtb2R1bGVfZG9jcyk7CisgICAgaWYgKCFtKQorICAgICAgICByZXR1cm47CiAKLQlfcG9pbnRlcl90eXBlX2NhY2hlID0gUHlEaWN0X05ldygpOwotCWlmIChfcG9pbnRlcl90eXBlX2NhY2hlID09IE5VTEwpCi0JCXJldHVybjsKKyAgICBfcG9pbnRlcl90eXBlX2NhY2hlID0gUHlEaWN0X05ldygpOworICAgIGlmIChfcG9pbnRlcl90eXBlX2NhY2hlID09IE5VTEwpCisgICAgICAgIHJldHVybjsKIAotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiX3BvaW50ZXJfdHlwZV9jYWNoZSIsIChQeU9iamVjdCAqKV9wb2ludGVyX3R5cGVfY2FjaGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiX3BvaW50ZXJfdHlwZV9jYWNoZSIsIChQeU9iamVjdCAqKV9wb2ludGVyX3R5cGVfY2FjaGUpOwogCi0JX3VucGlja2xlID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhtLCAiX3VucGlja2xlIik7Ci0JaWYgKF91bnBpY2tsZSA9PSBOVUxMKQotCQlyZXR1cm47CisgICAgX3VucGlja2xlID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhtLCAiX3VucGlja2xlIik7CisgICAgaWYgKF91bnBpY2tsZSA9PSBOVUxMKQorICAgICAgICByZXR1cm47CiAKLQlpZiAoUHlUeXBlX1JlYWR5KCZQeUNBcmdfVHlwZSkgPCAwKQotCQlyZXR1cm47CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmUHlDQXJnX1R5cGUpIDwgMCkKKyAgICAgICAgcmV0dXJuOwogCi0JaWYgKFB5VHlwZV9SZWFkeSgmQ1RodW5rX1R5cGUpIDwgMCkKLQkJcmV0dXJuOworICAgIGlmIChQeVR5cGVfUmVhZHkoJkNUaHVua19UeXBlKSA8IDApCisgICAgICAgIHJldHVybjsKIAotCS8qIFN0Z0RpY3QgaXMgZGVyaXZlZCBmcm9tIFB5RGljdF9UeXBlICovCi0JU3RnRGljdF9UeXBlLnRwX2Jhc2UgPSAmUHlEaWN0X1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmU3RnRGljdF9UeXBlKSA8IDApCi0JCXJldHVybjsKKyAgICAvKiBTdGdEaWN0IGlzIGRlcml2ZWQgZnJvbSBQeURpY3RfVHlwZSAqLworICAgIFN0Z0RpY3RfVHlwZS50cF9iYXNlID0gJlB5RGljdF9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJlN0Z0RpY3RfVHlwZSkgPCAwKQorICAgICAgICByZXR1cm47CiAKLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCSAqCi0JICogTWV0YWNsYXNzZXMKLQkgKi8KKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAqCisgICAgICogTWV0YWNsYXNzZXMKKyAgICAgKi8KIAotCVN0cnVjdFR5cGVfVHlwZS50cF9iYXNlID0gJlB5VHlwZV9UeXBlOwotCWlmIChQeVR5cGVfUmVhZHkoJlN0cnVjdFR5cGVfVHlwZSkgPCAwKQotCQlyZXR1cm47CisgICAgU3RydWN0VHlwZV9UeXBlLnRwX2Jhc2UgPSAmUHlUeXBlX1R5cGU7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmU3RydWN0VHlwZV9UeXBlKSA8IDApCisgICAgICAgIHJldHVybjsKIAotCVVuaW9uVHlwZV9UeXBlLnRwX2Jhc2UgPSAmUHlUeXBlX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmVW5pb25UeXBlX1R5cGUpIDwgMCkKLQkJcmV0dXJuOworICAgIFVuaW9uVHlwZV9UeXBlLnRwX2Jhc2UgPSAmUHlUeXBlX1R5cGU7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmVW5pb25UeXBlX1R5cGUpIDwgMCkKKyAgICAgICAgcmV0dXJuOwogCi0JUG9pbnRlclR5cGVfVHlwZS50cF9iYXNlID0gJlB5VHlwZV9UeXBlOwotCWlmIChQeVR5cGVfUmVhZHkoJlBvaW50ZXJUeXBlX1R5cGUpIDwgMCkKLQkJcmV0dXJuOworICAgIFBvaW50ZXJUeXBlX1R5cGUudHBfYmFzZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZQb2ludGVyVHlwZV9UeXBlKSA8IDApCisgICAgICAgIHJldHVybjsKIAotCUFycmF5VHlwZV9UeXBlLnRwX2Jhc2UgPSAmUHlUeXBlX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmQXJyYXlUeXBlX1R5cGUpIDwgMCkKLQkJcmV0dXJuOworICAgIEFycmF5VHlwZV9UeXBlLnRwX2Jhc2UgPSAmUHlUeXBlX1R5cGU7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmQXJyYXlUeXBlX1R5cGUpIDwgMCkKKyAgICAgICAgcmV0dXJuOwogCi0JU2ltcGxlVHlwZV9UeXBlLnRwX2Jhc2UgPSAmUHlUeXBlX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmU2ltcGxlVHlwZV9UeXBlKSA8IDApCi0JCXJldHVybjsKKyAgICBTaW1wbGVUeXBlX1R5cGUudHBfYmFzZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZTaW1wbGVUeXBlX1R5cGUpIDwgMCkKKyAgICAgICAgcmV0dXJuOwogCi0JQ0Z1bmNQdHJUeXBlX1R5cGUudHBfYmFzZSA9ICZQeVR5cGVfVHlwZTsKLQlpZiAoUHlUeXBlX1JlYWR5KCZDRnVuY1B0clR5cGVfVHlwZSkgPCAwKQotCQlyZXR1cm47CisgICAgQ0Z1bmNQdHJUeXBlX1R5cGUudHBfYmFzZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZDRnVuY1B0clR5cGVfVHlwZSkgPCAwKQorICAgICAgICByZXR1cm47CiAKLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCSAqCi0JICogQ2xhc3NlcyB1c2luZyBhIGN1c3RvbSBtZXRhY2xhc3MKLQkgKi8KKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAqCisgICAgICogQ2xhc3NlcyB1c2luZyBhIGN1c3RvbSBtZXRhY2xhc3MKKyAgICAgKi8KIAotCWlmIChQeVR5cGVfUmVhZHkoJkNEYXRhX1R5cGUpIDwgMCkKLQkJcmV0dXJuOworICAgIGlmIChQeVR5cGVfUmVhZHkoJkNEYXRhX1R5cGUpIDwgMCkKKyAgICAgICAgcmV0dXJuOwogCi0JUHlfVFlQRSgmU3RydWN0X1R5cGUpID0gJlN0cnVjdFR5cGVfVHlwZTsKLQlTdHJ1Y3RfVHlwZS50cF9iYXNlID0gJkNEYXRhX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmU3RydWN0X1R5cGUpIDwgMCkKLQkJcmV0dXJuOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiU3RydWN0dXJlIiwgKFB5T2JqZWN0ICopJlN0cnVjdF9UeXBlKTsKKyAgICBQeV9UWVBFKCZTdHJ1Y3RfVHlwZSkgPSAmU3RydWN0VHlwZV9UeXBlOworICAgIFN0cnVjdF9UeXBlLnRwX2Jhc2UgPSAmQ0RhdGFfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZTdHJ1Y3RfVHlwZSkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJTdHJ1Y3R1cmUiLCAoUHlPYmplY3QgKikmU3RydWN0X1R5cGUpOwogCi0JUHlfVFlQRSgmVW5pb25fVHlwZSkgPSAmVW5pb25UeXBlX1R5cGU7Ci0JVW5pb25fVHlwZS50cF9iYXNlID0gJkNEYXRhX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmVW5pb25fVHlwZSkgPCAwKQotCQlyZXR1cm47Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJVbmlvbiIsIChQeU9iamVjdCAqKSZVbmlvbl9UeXBlKTsKKyAgICBQeV9UWVBFKCZVbmlvbl9UeXBlKSA9ICZVbmlvblR5cGVfVHlwZTsKKyAgICBVbmlvbl9UeXBlLnRwX2Jhc2UgPSAmQ0RhdGFfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZVbmlvbl9UeXBlKSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIlVuaW9uIiwgKFB5T2JqZWN0ICopJlVuaW9uX1R5cGUpOwogCi0JUHlfVFlQRSgmUG9pbnRlcl9UeXBlKSA9ICZQb2ludGVyVHlwZV9UeXBlOwotCVBvaW50ZXJfVHlwZS50cF9iYXNlID0gJkNEYXRhX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmUG9pbnRlcl9UeXBlKSA8IDApCi0JCXJldHVybjsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIl9Qb2ludGVyIiwgKFB5T2JqZWN0ICopJlBvaW50ZXJfVHlwZSk7CisgICAgUHlfVFlQRSgmUG9pbnRlcl9UeXBlKSA9ICZQb2ludGVyVHlwZV9UeXBlOworICAgIFBvaW50ZXJfVHlwZS50cF9iYXNlID0gJkNEYXRhX1R5cGU7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmUG9pbnRlcl9UeXBlKSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIl9Qb2ludGVyIiwgKFB5T2JqZWN0ICopJlBvaW50ZXJfVHlwZSk7CiAKLQlQeV9UWVBFKCZBcnJheV9UeXBlKSA9ICZBcnJheVR5cGVfVHlwZTsKLQlBcnJheV9UeXBlLnRwX2Jhc2UgPSAmQ0RhdGFfVHlwZTsKLQlpZiAoUHlUeXBlX1JlYWR5KCZBcnJheV9UeXBlKSA8IDApCi0JCXJldHVybjsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkFycmF5IiwgKFB5T2JqZWN0ICopJkFycmF5X1R5cGUpOworICAgIFB5X1RZUEUoJkFycmF5X1R5cGUpID0gJkFycmF5VHlwZV9UeXBlOworICAgIEFycmF5X1R5cGUudHBfYmFzZSA9ICZDRGF0YV9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJkFycmF5X1R5cGUpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiQXJyYXkiLCAoUHlPYmplY3QgKikmQXJyYXlfVHlwZSk7CiAKLQlQeV9UWVBFKCZTaW1wbGVfVHlwZSkgPSAmU2ltcGxlVHlwZV9UeXBlOwotCVNpbXBsZV9UeXBlLnRwX2Jhc2UgPSAmQ0RhdGFfVHlwZTsKLQlpZiAoUHlUeXBlX1JlYWR5KCZTaW1wbGVfVHlwZSkgPCAwKQotCQlyZXR1cm47Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJfU2ltcGxlQ0RhdGEiLCAoUHlPYmplY3QgKikmU2ltcGxlX1R5cGUpOworICAgIFB5X1RZUEUoJlNpbXBsZV9UeXBlKSA9ICZTaW1wbGVUeXBlX1R5cGU7CisgICAgU2ltcGxlX1R5cGUudHBfYmFzZSA9ICZDRGF0YV9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJlNpbXBsZV9UeXBlKSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIl9TaW1wbGVDRGF0YSIsIChQeU9iamVjdCAqKSZTaW1wbGVfVHlwZSk7CiAKLQlQeV9UWVBFKCZDRnVuY1B0cl9UeXBlKSA9ICZDRnVuY1B0clR5cGVfVHlwZTsKLQlDRnVuY1B0cl9UeXBlLnRwX2Jhc2UgPSAmQ0RhdGFfVHlwZTsKLQlpZiAoUHlUeXBlX1JlYWR5KCZDRnVuY1B0cl9UeXBlKSA8IDApCi0JCXJldHVybjsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkNGdW5jUHRyIiwgKFB5T2JqZWN0ICopJkNGdW5jUHRyX1R5cGUpOworICAgIFB5X1RZUEUoJkNGdW5jUHRyX1R5cGUpID0gJkNGdW5jUHRyVHlwZV9UeXBlOworICAgIENGdW5jUHRyX1R5cGUudHBfYmFzZSA9ICZDRGF0YV9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJkNGdW5jUHRyX1R5cGUpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ0Z1bmNQdHIiLCAoUHlPYmplY3QgKikmQ0Z1bmNQdHJfVHlwZSk7CiAKLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCSAqCi0JICogU2ltcGxlIGNsYXNzZXMKLQkgKi8KKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAqCisgICAgICogU2ltcGxlIGNsYXNzZXMKKyAgICAgKi8KIAotCS8qIENGaWVsZF9UeXBlIGlzIGRlcml2ZWQgZnJvbSBQeUJhc2VPYmplY3RfVHlwZSAqLwotCWlmIChQeVR5cGVfUmVhZHkoJkNGaWVsZF9UeXBlKSA8IDApCi0JCXJldHVybjsKKyAgICAvKiBDRmllbGRfVHlwZSBpcyBkZXJpdmVkIGZyb20gUHlCYXNlT2JqZWN0X1R5cGUgKi8KKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZDRmllbGRfVHlwZSkgPCAwKQorICAgICAgICByZXR1cm47CiAKLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCSAqCi0JICogT3RoZXIgc3R1ZmYKLQkgKi8KKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAqCisgICAgICogT3RoZXIgc3R1ZmYKKyAgICAgKi8KIAotCURpY3RSZW1vdmVyX1R5cGUudHBfbmV3ID0gUHlUeXBlX0dlbmVyaWNOZXc7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmRGljdFJlbW92ZXJfVHlwZSkgPCAwKQotCQlyZXR1cm47CisgICAgRGljdFJlbW92ZXJfVHlwZS50cF9uZXcgPSBQeVR5cGVfR2VuZXJpY05ldzsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZEaWN0UmVtb3Zlcl9UeXBlKSA8IDApCisgICAgICAgIHJldHVybjsKIAogI2lmZGVmIE1TX1dJTjMyCi0JaWYgKGNyZWF0ZV9jb21lcnJvcigpIDwgMCkKLQkJcmV0dXJuOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ09NRXJyb3IiLCBDb21FcnJvcik7CisgICAgaWYgKGNyZWF0ZV9jb21lcnJvcigpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ09NRXJyb3IiLCBDb21FcnJvcik7CiAKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkZVTkNGTEFHX0hSRVNVTFQiLCBQeUludF9Gcm9tTG9uZyhGVU5DRkxBR19IUkVTVUxUKSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJGVU5DRkxBR19TVERDQUxMIiwgUHlJbnRfRnJvbUxvbmcoRlVOQ0ZMQUdfU1REQ0FMTCkpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiRlVOQ0ZMQUdfSFJFU1VMVCIsIFB5SW50X0Zyb21Mb25nKEZVTkNGTEFHX0hSRVNVTFQpKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkZVTkNGTEFHX1NURENBTEwiLCBQeUludF9Gcm9tTG9uZyhGVU5DRkxBR19TVERDQUxMKSk7CiAjZW5kaWYKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkZVTkNGTEFHX0NERUNMIiwgUHlJbnRfRnJvbUxvbmcoRlVOQ0ZMQUdfQ0RFQ0wpKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkZVTkNGTEFHX1VTRV9FUlJOTyIsIFB5SW50X0Zyb21Mb25nKEZVTkNGTEFHX1VTRV9FUlJOTykpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiRlVOQ0ZMQUdfVVNFX0xBU1RFUlJPUiIsIFB5SW50X0Zyb21Mb25nKEZVTkNGTEFHX1VTRV9MQVNURVJST1IpKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkZVTkNGTEFHX1BZVEhPTkFQSSIsIFB5SW50X0Zyb21Mb25nKEZVTkNGTEFHX1BZVEhPTkFQSSkpOwotCVB5TW9kdWxlX0FkZFN0cmluZ0NvbnN0YW50KG0sICJfX3ZlcnNpb25fXyIsICIxLjEuMCIpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiRlVOQ0ZMQUdfQ0RFQ0wiLCBQeUludF9Gcm9tTG9uZyhGVU5DRkxBR19DREVDTCkpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiRlVOQ0ZMQUdfVVNFX0VSUk5PIiwgUHlJbnRfRnJvbUxvbmcoRlVOQ0ZMQUdfVVNFX0VSUk5PKSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJGVU5DRkxBR19VU0VfTEFTVEVSUk9SIiwgUHlJbnRfRnJvbUxvbmcoRlVOQ0ZMQUdfVVNFX0xBU1RFUlJPUikpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiRlVOQ0ZMQUdfUFlUSE9OQVBJIiwgUHlJbnRfRnJvbUxvbmcoRlVOQ0ZMQUdfUFlUSE9OQVBJKSk7CisgICAgUHlNb2R1bGVfQWRkU3RyaW5nQ29uc3RhbnQobSwgIl9fdmVyc2lvbl9fIiwgIjEuMS4wIik7CiAKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIl9tZW1tb3ZlX2FkZHIiLCBQeUxvbmdfRnJvbVZvaWRQdHIobWVtbW92ZSkpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiX21lbXNldF9hZGRyIiwgUHlMb25nX0Zyb21Wb2lkUHRyKG1lbXNldCkpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiX3N0cmluZ19hdF9hZGRyIiwgUHlMb25nX0Zyb21Wb2lkUHRyKHN0cmluZ19hdCkpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiX2Nhc3RfYWRkciIsIFB5TG9uZ19Gcm9tVm9pZFB0cihjYXN0KSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJfbWVtbW92ZV9hZGRyIiwgUHlMb25nX0Zyb21Wb2lkUHRyKG1lbW1vdmUpKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIl9tZW1zZXRfYWRkciIsIFB5TG9uZ19Gcm9tVm9pZFB0cihtZW1zZXQpKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIl9zdHJpbmdfYXRfYWRkciIsIFB5TG9uZ19Gcm9tVm9pZFB0cihzdHJpbmdfYXQpKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIl9jYXN0X2FkZHIiLCBQeUxvbmdfRnJvbVZvaWRQdHIoY2FzdCkpOwogI2lmZGVmIENUWVBFU19VTklDT0RFCi0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJfd3N0cmluZ19hdF9hZGRyIiwgUHlMb25nX0Zyb21Wb2lkUHRyKHdzdHJpbmdfYXQpKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIl93c3RyaW5nX2F0X2FkZHIiLCBQeUxvbmdfRnJvbVZvaWRQdHIod3N0cmluZ19hdCkpOwogI2VuZGlmCiAKIC8qIElmIFJUTERfTE9DQUwgaXMgbm90IGRlZmluZWQgKFdpbmRvd3MhKSwgc2V0IGl0IHRvIHplcm8uICovCkBAIC01NjA1LDE0ICs1NjA1LDE0IEBACiAjZGVmaW5lIFJUTERfR0xPQkFMIFJUTERfTE9DQUwKICNlbmRpZgogCi0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJSVExEX0xPQ0FMIiwgUHlJbnRfRnJvbUxvbmcoUlRMRF9MT0NBTCkpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiUlRMRF9HTE9CQUwiLCBQeUludF9Gcm9tTG9uZyhSVExEX0dMT0JBTCkpOwotCQotCVB5RXhjX0FyZ0Vycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJjdHlwZXMuQXJndW1lbnRFcnJvciIsIE5VTEwsIE5VTEwpOwotCWlmIChQeUV4Y19BcmdFcnJvcikgewotCQlQeV9JTkNSRUYoUHlFeGNfQXJnRXJyb3IpOwotCQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkFyZ3VtZW50RXJyb3IiLCBQeUV4Y19BcmdFcnJvcik7Ci0JfQorICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiUlRMRF9MT0NBTCIsIFB5SW50X0Zyb21Mb25nKFJUTERfTE9DQUwpKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIlJUTERfR0xPQkFMIiwgUHlJbnRfRnJvbUxvbmcoUlRMRF9HTE9CQUwpKTsKKworICAgIFB5RXhjX0FyZ0Vycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJjdHlwZXMuQXJndW1lbnRFcnJvciIsIE5VTEwsIE5VTEwpOworICAgIGlmIChQeUV4Y19BcmdFcnJvcikgeworICAgICAgICBQeV9JTkNSRUYoUHlFeGNfQXJnRXJyb3IpOworICAgICAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkFyZ3VtZW50RXJyb3IiLCBQeUV4Y19BcmdFcnJvcik7CisgICAgfQogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTU2MjMsMzAgKzU2MjMsMzAgQEAKICNpZmRlZiBIQVZFX1dDSEFSX0gKIAogUHlPYmplY3QgKk15X1B5VW5pY29kZV9Gcm9tV2lkZUNoYXIocmVnaXN0ZXIgY29uc3Qgd2NoYXJfdCAqdywKLQkJCQkgICAgUHlfc3NpemVfdCBzaXplKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBzaXplKQogewogICAgIFB5VW5pY29kZU9iamVjdCAqdW5pY29kZTsKIAogICAgIGlmICh3ID09IE5VTEwpIHsKLQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKICAgICB1bmljb2RlID0gKFB5VW5pY29kZU9iamVjdCAqKVB5VW5pY29kZV9Gcm9tVW5pY29kZShOVUxMLCBzaXplKTsKICAgICBpZiAoIXVuaWNvZGUpCi0gICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBOVUxMOwogCiAgICAgLyogQ29weSB0aGUgd2NoYXJfdCBkYXRhIGludG8gdGhlIG5ldyBvYmplY3QgKi8KICNpZmRlZiBIQVZFX1VTQUJMRV9XQ0hBUl9UCiAgICAgbWVtY3B5KHVuaWNvZGUtPnN0ciwgdywgc2l6ZSAqIHNpemVvZih3Y2hhcl90KSk7CiAjZWxzZQogICAgIHsKLQlyZWdpc3RlciBQeV9VTklDT0RFICp1OwotCXJlZ2lzdGVyIGludCBpOwotCXUgPSBQeVVuaWNvZGVfQVNfVU5JQ09ERSh1bmljb2RlKTsKLQkvKiBJbiBQeXRob24sIHRoZSBmb2xsb3dpbmcgbGluZSBoYXMgYSBvbmUtb2ZmIGVycm9yICovCi0JZm9yIChpID0gc2l6ZTsgaSA+IDA7IGktLSkKLQkgICAgKnUrKyA9ICp3Kys7CisgICAgcmVnaXN0ZXIgUHlfVU5JQ09ERSAqdTsKKyAgICByZWdpc3RlciBpbnQgaTsKKyAgICB1ID0gUHlVbmljb2RlX0FTX1VOSUNPREUodW5pY29kZSk7CisgICAgLyogSW4gUHl0aG9uLCB0aGUgZm9sbG93aW5nIGxpbmUgaGFzIGEgb25lLW9mZiBlcnJvciAqLworICAgIGZvciAoaSA9IHNpemU7IGkgPiAwOyBpLS0pCisgICAgICAgICp1KysgPSAqdysrOwogICAgIH0KICNlbmRpZgogCkBAIC01NjU0LDI1ICs1NjU0LDI1IEBACiB9CiAKIFB5X3NzaXplX3QgTXlfUHlVbmljb2RlX0FzV2lkZUNoYXIoUHlVbmljb2RlT2JqZWN0ICp1bmljb2RlLAotCQkJICAgIHJlZ2lzdGVyIHdjaGFyX3QgKncsCi0JCQkgICAgUHlfc3NpemVfdCBzaXplKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIHdjaGFyX3QgKncsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBzaXplKQogewogICAgIGlmICh1bmljb2RlID09IE5VTEwpIHsKLQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQlyZXR1cm4gLTE7CisgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgcmV0dXJuIC0xOwogICAgIH0KICAgICBpZiAoc2l6ZSA+IFB5VW5pY29kZV9HRVRfU0laRSh1bmljb2RlKSkKLQlzaXplID0gUHlVbmljb2RlX0dFVF9TSVpFKHVuaWNvZGUpOworICAgIHNpemUgPSBQeVVuaWNvZGVfR0VUX1NJWkUodW5pY29kZSk7CiAjaWZkZWYgSEFWRV9VU0FCTEVfV0NIQVJfVAogICAgIG1lbWNweSh3LCB1bmljb2RlLT5zdHIsIHNpemUgKiBzaXplb2Yod2NoYXJfdCkpOwogI2Vsc2UKICAgICB7Ci0JcmVnaXN0ZXIgUHlfVU5JQ09ERSAqdTsKLQlyZWdpc3RlciBpbnQgaTsKLQl1ID0gUHlVbmljb2RlX0FTX1VOSUNPREUodW5pY29kZSk7Ci0JLyogSW4gUHl0aG9uLCB0aGUgZm9sbG93aW5nIGxpbmUgaGFzIGEgb25lLW9mZiBlcnJvciAqLwotCWZvciAoaSA9IHNpemU7IGkgPiAwOyBpLS0pCi0JICAgICp3KysgPSAqdSsrOworICAgIHJlZ2lzdGVyIFB5X1VOSUNPREUgKnU7CisgICAgcmVnaXN0ZXIgaW50IGk7CisgICAgdSA9IFB5VW5pY29kZV9BU19VTklDT0RFKHVuaWNvZGUpOworICAgIC8qIEluIFB5dGhvbiwgdGhlIGZvbGxvd2luZyBsaW5lIGhhcyBhIG9uZS1vZmYgZXJyb3IgKi8KKyAgICBmb3IgKGkgPSBzaXplOyBpID4gMDsgaS0tKQorICAgICAgICAqdysrID0gKnUrKzsKICAgICB9CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL19jdHlwZXNfdGVzdC5jIGIvTW9kdWxlcy9fY3R5cGVzL19jdHlwZXNfdGVzdC5jCmluZGV4IDNmMTMxODAuLjQ2NDA2YTYgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9fY3R5cGVzX3Rlc3QuYworKysgYi9Nb2R1bGVzL19jdHlwZXMvX2N0eXBlc190ZXN0LmMKQEAgLTI3LDE1MiArMjcsMTUyIEBACiAKIEVYUE9SVCh2b2lkKXRlc3RmdW5jX2FycmF5KGludCB2YWx1ZXNbNF0pCiB7Ci0JcHJpbnRmKCJ0ZXN0ZnVuY19hcnJheSAlZCAlZCAlZCAlZFxuIiwKLQkgICAgICAgdmFsdWVzWzBdLAotCSAgICAgICB2YWx1ZXNbMV0sCi0JICAgICAgIHZhbHVlc1syXSwKLQkgICAgICAgdmFsdWVzWzNdKTsKKyAgICBwcmludGYoInRlc3RmdW5jX2FycmF5ICVkICVkICVkICVkXG4iLAorICAgICAgICAgICB2YWx1ZXNbMF0sCisgICAgICAgICAgIHZhbHVlc1sxXSwKKyAgICAgICAgICAgdmFsdWVzWzJdLAorICAgICAgICAgICB2YWx1ZXNbM10pOwogfQogCiBFWFBPUlQobG9uZyBkb3VibGUpdGVzdGZ1bmNfRGRkKGRvdWJsZSBhLCBkb3VibGUgYikKIHsKLQlsb25nIGRvdWJsZSByZXN1bHQgPSAobG9uZyBkb3VibGUpKGEgKiBiKTsKLQlwcmludGYoInRlc3RmdW5jX0RkZCglcCwgJXApXG4iLCAmYSwgJmIpOwotCXByaW50ZigidGVzdGZ1bmNfRGRkKCVnLCAlZylcbiIsIGEsIGIpOwotCXJldHVybiByZXN1bHQ7CisgICAgbG9uZyBkb3VibGUgcmVzdWx0ID0gKGxvbmcgZG91YmxlKShhICogYik7CisgICAgcHJpbnRmKCJ0ZXN0ZnVuY19EZGQoJXAsICVwKVxuIiwgJmEsICZiKTsKKyAgICBwcmludGYoInRlc3RmdW5jX0RkZCglZywgJWcpXG4iLCBhLCBiKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBFWFBPUlQobG9uZyBkb3VibGUpdGVzdGZ1bmNfREREKGxvbmcgZG91YmxlIGEsIGxvbmcgZG91YmxlIGIpCiB7Ci0JbG9uZyBkb3VibGUgcmVzdWx0ID0gYSAqIGI7Ci0JcHJpbnRmKCJ0ZXN0ZnVuY19EREQoJXAsICVwKVxuIiwgJmEsICZiKTsKLQlwcmludGYoInRlc3RmdW5jX0RERCglTGcsICVMZylcbiIsIGEsIGIpOwotCXJldHVybiByZXN1bHQ7CisgICAgbG9uZyBkb3VibGUgcmVzdWx0ID0gYSAqIGI7CisgICAgcHJpbnRmKCJ0ZXN0ZnVuY19EREQoJXAsICVwKVxuIiwgJmEsICZiKTsKKyAgICBwcmludGYoInRlc3RmdW5jX0RERCglTGcsICVMZylcbiIsIGEsIGIpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIEVYUE9SVChpbnQpdGVzdGZ1bmNfaWlpKGludCBhLCBpbnQgYikKIHsKLQlpbnQgcmVzdWx0ID0gYSAqIGI7Ci0JcHJpbnRmKCJ0ZXN0ZnVuY19paWkoJXAsICVwKVxuIiwgJmEsICZiKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIGludCByZXN1bHQgPSBhICogYjsKKyAgICBwcmludGYoInRlc3RmdW5jX2lpaSglcCwgJXApXG4iLCAmYSwgJmIpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIEVYUE9SVChpbnQpbXlwcmludGYoY2hhciAqZm10LCAuLi4pCiB7Ci0JaW50IHJlc3VsdDsKLQl2YV9saXN0IGFyZ3B0cjsKLQl2YV9zdGFydChhcmdwdHIsIGZtdCk7Ci0JcmVzdWx0ID0gdnByaW50ZihmbXQsIGFyZ3B0cik7Ci0JdmFfZW5kKGFyZ3B0cik7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBpbnQgcmVzdWx0OworICAgIHZhX2xpc3QgYXJncHRyOworICAgIHZhX3N0YXJ0KGFyZ3B0ciwgZm10KTsKKyAgICByZXN1bHQgPSB2cHJpbnRmKGZtdCwgYXJncHRyKTsKKyAgICB2YV9lbmQoYXJncHRyKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBFWFBPUlQoY2hhciAqKW15X3N0cnRvayhjaGFyICp0b2tlbiwgY29uc3QgY2hhciAqZGVsaW0pCiB7Ci0JcmV0dXJuIHN0cnRvayh0b2tlbiwgZGVsaW0pOworICAgIHJldHVybiBzdHJ0b2sodG9rZW4sIGRlbGltKTsKIH0KIAogRVhQT1JUKGNoYXIgKilteV9zdHJjaHIoY29uc3QgY2hhciAqcywgaW50IGMpCiB7Ci0JcmV0dXJuIHN0cmNocihzLCBjKTsKKyAgICByZXR1cm4gc3RyY2hyKHMsIGMpOwogfQogCiAKIEVYUE9SVChkb3VibGUpIG15X3NxcnQoZG91YmxlIGEpCiB7Ci0JcmV0dXJuIHNxcnQoYSk7CisgICAgcmV0dXJuIHNxcnQoYSk7CiB9CiAKIEVYUE9SVCh2b2lkKSBteV9xc29ydCh2b2lkICpiYXNlLCBzaXplX3QgbnVtLCBzaXplX3Qgd2lkdGgsIGludCgqY29tcGFyZSkoY29uc3Qgdm9pZCosIGNvbnN0IHZvaWQqKSkKIHsKLQlxc29ydChiYXNlLCBudW0sIHdpZHRoLCBjb21wYXJlKTsKKyAgICBxc29ydChiYXNlLCBudW0sIHdpZHRoLCBjb21wYXJlKTsKIH0KIAogRVhQT1JUKGludCAqKSBfdGVzdGZ1bmNfYWk4KGludCBhWzhdKQogewotCXJldHVybiBhOworICAgIHJldHVybiBhOwogfQogCiBFWFBPUlQodm9pZCkgX3Rlc3RmdW5jX3YoaW50IGEsIGludCBiLCBpbnQgKnByZXN1bHQpCiB7Ci0JKnByZXN1bHQgPSBhICsgYjsKKyAgICAqcHJlc3VsdCA9IGEgKyBiOwogfQogCiBFWFBPUlQoaW50KSBfdGVzdGZ1bmNfaV9iaGlsZmQoc2lnbmVkIGNoYXIgYiwgc2hvcnQgaCwgaW50IGksIGxvbmcgbCwgZmxvYXQgZiwgZG91YmxlIGQpCiB7Ci0vKglwcmludGYoIl90ZXN0ZnVuY19pX2JoaWxmZCBnb3QgJWQgJWQgJWQgJWxkICVmICVmXG4iLAotCSAgICAgICBiLCBoLCBpLCBsLCBmLCBkKTsKKy8qICAgICAgcHJpbnRmKCJfdGVzdGZ1bmNfaV9iaGlsZmQgZ290ICVkICVkICVkICVsZCAlZiAlZlxuIiwKKyAgICAgICAgICAgICAgIGIsIGgsIGksIGwsIGYsIGQpOwogKi8KLQlyZXR1cm4gKGludCkoYiArIGggKyBpICsgbCArIGYgKyBkKTsKKyAgICByZXR1cm4gKGludCkoYiArIGggKyBpICsgbCArIGYgKyBkKTsKIH0KIAogRVhQT1JUKGZsb2F0KSBfdGVzdGZ1bmNfZl9iaGlsZmQoc2lnbmVkIGNoYXIgYiwgc2hvcnQgaCwgaW50IGksIGxvbmcgbCwgZmxvYXQgZiwgZG91YmxlIGQpCiB7Ci0vKglwcmludGYoIl90ZXN0ZnVuY19mX2JoaWxmZCBnb3QgJWQgJWQgJWQgJWxkICVmICVmXG4iLAotCSAgICAgICBiLCBoLCBpLCBsLCBmLCBkKTsKKy8qICAgICAgcHJpbnRmKCJfdGVzdGZ1bmNfZl9iaGlsZmQgZ290ICVkICVkICVkICVsZCAlZiAlZlxuIiwKKyAgICAgICAgICAgICAgIGIsIGgsIGksIGwsIGYsIGQpOwogKi8KLQlyZXR1cm4gKGZsb2F0KShiICsgaCArIGkgKyBsICsgZiArIGQpOworICAgIHJldHVybiAoZmxvYXQpKGIgKyBoICsgaSArIGwgKyBmICsgZCk7CiB9CiAKIEVYUE9SVChkb3VibGUpIF90ZXN0ZnVuY19kX2JoaWxmZChzaWduZWQgY2hhciBiLCBzaG9ydCBoLCBpbnQgaSwgbG9uZyBsLCBmbG9hdCBmLCBkb3VibGUgZCkKIHsKLS8qCXByaW50ZigiX3Rlc3RmdW5jX2RfYmhpbGZkIGdvdCAlZCAlZCAlZCAlbGQgJWYgJWZcbiIsCi0JICAgICAgIGIsIGgsIGksIGwsIGYsIGQpOworLyogICAgICBwcmludGYoIl90ZXN0ZnVuY19kX2JoaWxmZCBnb3QgJWQgJWQgJWQgJWxkICVmICVmXG4iLAorICAgICAgICAgICAgICAgYiwgaCwgaSwgbCwgZiwgZCk7CiAqLwotCXJldHVybiAoZG91YmxlKShiICsgaCArIGkgKyBsICsgZiArIGQpOworICAgIHJldHVybiAoZG91YmxlKShiICsgaCArIGkgKyBsICsgZiArIGQpOwogfQogCiBFWFBPUlQobG9uZyBkb3VibGUpIF90ZXN0ZnVuY19EX2JoaWxmRChzaWduZWQgY2hhciBiLCBzaG9ydCBoLCBpbnQgaSwgbG9uZyBsLCBmbG9hdCBmLCBsb25nIGRvdWJsZSBkKQogewotLyoJcHJpbnRmKCJfdGVzdGZ1bmNfZF9iaGlsZmQgZ290ICVkICVkICVkICVsZCAlZiAlZlxuIiwKLQkgICAgICAgYiwgaCwgaSwgbCwgZiwgZCk7CisvKiAgICAgIHByaW50ZigiX3Rlc3RmdW5jX2RfYmhpbGZkIGdvdCAlZCAlZCAlZCAlbGQgJWYgJWZcbiIsCisgICAgICAgICAgICAgICBiLCBoLCBpLCBsLCBmLCBkKTsKICovCi0JcmV0dXJuIChsb25nIGRvdWJsZSkoYiArIGggKyBpICsgbCArIGYgKyBkKTsKKyAgICByZXR1cm4gKGxvbmcgZG91YmxlKShiICsgaCArIGkgKyBsICsgZiArIGQpOwogfQogCiBFWFBPUlQoY2hhciAqKSBfdGVzdGZ1bmNfcF9wKHZvaWQgKnMpCiB7Ci0JcmV0dXJuIChjaGFyICopczsKKyAgICByZXR1cm4gKGNoYXIgKilzOwogfQogCiBFWFBPUlQodm9pZCAqKSBfdGVzdGZ1bmNfY19wX3AoaW50ICphcmdjcCwgY2hhciAqKmFyZ3YpCiB7Ci0JcmV0dXJuIGFyZ3ZbKCphcmdjcCktMV07CisgICAgcmV0dXJuIGFyZ3ZbKCphcmdjcCktMV07CiB9CiAKIEVYUE9SVCh2b2lkICopIGdldF9zdHJjaHIodm9pZCkKIHsKLQlyZXR1cm4gKHZvaWQgKilzdHJjaHI7CisgICAgcmV0dXJuICh2b2lkICopc3RyY2hyOwogfQogCiBFWFBPUlQoY2hhciAqKSBteV9zdHJkdXAoY2hhciAqc3JjKQogewotCWNoYXIgKmRzdCA9IChjaGFyICopbWFsbG9jKHN0cmxlbihzcmMpKzEpOwotCWlmICghZHN0KQotCQlyZXR1cm4gTlVMTDsKLQlzdHJjcHkoZHN0LCBzcmMpOwotCXJldHVybiBkc3Q7CisgICAgY2hhciAqZHN0ID0gKGNoYXIgKiltYWxsb2Moc3RybGVuKHNyYykrMSk7CisgICAgaWYgKCFkc3QpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHN0cmNweShkc3QsIHNyYyk7CisgICAgcmV0dXJuIGRzdDsKIH0KIAogRVhQT1JUKHZvaWQpbXlfZnJlZSh2b2lkICpwdHIpCiB7Ci0JZnJlZShwdHIpOworICAgIGZyZWUocHRyKTsKIH0KIAogI2lmZGVmIEhBVkVfV0NIQVJfSAogRVhQT1JUKHdjaGFyX3QgKikgbXlfd2NzZHVwKHdjaGFyX3QgKnNyYykKIHsKLQlzaXplX3QgbGVuID0gd2NzbGVuKHNyYyk7Ci0Jd2NoYXJfdCAqcHRyID0gKHdjaGFyX3QgKiltYWxsb2MoKGxlbiArIDEpICogc2l6ZW9mKHdjaGFyX3QpKTsKLQlpZiAocHRyID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCW1lbWNweShwdHIsIHNyYywgKGxlbisxKSAqIHNpemVvZih3Y2hhcl90KSk7Ci0JcmV0dXJuIHB0cjsKKyAgICBzaXplX3QgbGVuID0gd2NzbGVuKHNyYyk7CisgICAgd2NoYXJfdCAqcHRyID0gKHdjaGFyX3QgKiltYWxsb2MoKGxlbiArIDEpICogc2l6ZW9mKHdjaGFyX3QpKTsKKyAgICBpZiAocHRyID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG1lbWNweShwdHIsIHNyYywgKGxlbisxKSAqIHNpemVvZih3Y2hhcl90KSk7CisgICAgcmV0dXJuIHB0cjsKIH0KIAogRVhQT1JUKHNpemVfdCkgbXlfd2NzbGVuKHdjaGFyX3QgKnNyYykKIHsKLQlyZXR1cm4gd2NzbGVuKHNyYyk7CisgICAgcmV0dXJuIHdjc2xlbihzcmMpOwogfQogI2VuZGlmCiAKQEAgLTE4MywxNTggKzE4MywxNTggQEAKICNlbmRpZgogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JaW50ICgqYykoaW50LCBpbnQpOwotCWludCAoX19zdGRjYWxsICpzKShpbnQsIGludCk7CisgICAgaW50ICgqYykoaW50LCBpbnQpOworICAgIGludCAoX19zdGRjYWxsICpzKShpbnQsIGludCk7CiB9IEZVTkNTOwogCiBFWFBPUlQoaW50KSBfdGVzdGZ1bmNfY2FsbGZ1bmNwKEZVTkNTICpmcCkKIHsKLQlmcC0+YygxLCAyKTsKLQlmcC0+cygzLCA0KTsKLQlyZXR1cm4gMDsKKyAgICBmcC0+YygxLCAyKTsKKyAgICBmcC0+cygzLCA0KTsKKyAgICByZXR1cm4gMDsKIH0KIAogRVhQT1JUKGludCkgX3Rlc3RmdW5jX2RlcmVmX3BvaW50ZXIoaW50ICpwaSkKIHsKLQlyZXR1cm4gKnBpOworICAgIHJldHVybiAqcGk7CiB9CiAKICNpZmRlZiBNU19XSU4zMgogRVhQT1JUKGludCkgX3Rlc3RmdW5jX3BpdW5rKElVbmtub3duIEZBUiAqcGl1bmspCiB7Ci0JcGl1bmstPmxwVnRibC0+QWRkUmVmKHBpdW5rKTsKLQlyZXR1cm4gcGl1bmstPmxwVnRibC0+UmVsZWFzZShwaXVuayk7CisgICAgcGl1bmstPmxwVnRibC0+QWRkUmVmKHBpdW5rKTsKKyAgICByZXR1cm4gcGl1bmstPmxwVnRibC0+UmVsZWFzZShwaXVuayk7CiB9CiAjZW5kaWYKIAogRVhQT1JUKGludCkgX3Rlc3RmdW5jX2NhbGxiYWNrX3dpdGhfcG9pbnRlcihpbnQgKCpmdW5jKShpbnQgKikpCiB7Ci0JaW50IHRhYmxlW10gPSB7MSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTB9OworICAgIGludCB0YWJsZVtdID0gezEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwfTsKIAotCXJldHVybiAoKmZ1bmMpKHRhYmxlKTsKKyAgICByZXR1cm4gKCpmdW5jKSh0YWJsZSk7CiB9CiAKICNpZmRlZiBIQVZFX0xPTkdfTE9ORwogRVhQT1JUKFBZX0xPTkdfTE9ORykgX3Rlc3RmdW5jX3FfYmhpbGZkcShzaWduZWQgY2hhciBiLCBzaG9ydCBoLCBpbnQgaSwgbG9uZyBsLCBmbG9hdCBmLAotCQkJCSAgICAgZG91YmxlIGQsIFBZX0xPTkdfTE9ORyBxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBkLCBQWV9MT05HX0xPTkcgcSkKIHsKLQlyZXR1cm4gKFBZX0xPTkdfTE9ORykoYiArIGggKyBpICsgbCArIGYgKyBkICsgcSk7CisgICAgcmV0dXJuIChQWV9MT05HX0xPTkcpKGIgKyBoICsgaSArIGwgKyBmICsgZCArIHEpOwogfQogCiBFWFBPUlQoUFlfTE9OR19MT05HKSBfdGVzdGZ1bmNfcV9iaGlsZmQoc2lnbmVkIGNoYXIgYiwgc2hvcnQgaCwgaW50IGksIGxvbmcgbCwgZmxvYXQgZiwgZG91YmxlIGQpCiB7Ci0JcmV0dXJuIChQWV9MT05HX0xPTkcpKGIgKyBoICsgaSArIGwgKyBmICsgZCk7CisgICAgcmV0dXJuIChQWV9MT05HX0xPTkcpKGIgKyBoICsgaSArIGwgKyBmICsgZCk7CiB9CiAKIEVYUE9SVChpbnQpIF90ZXN0ZnVuY19jYWxsYmFja19pX2lmKGludCB2YWx1ZSwgaW50ICgqZnVuYykoaW50KSkKIHsKLQlpbnQgc3VtID0gMDsKLQl3aGlsZSAodmFsdWUgIT0gMCkgewotCQlzdW0gKz0gZnVuYyh2YWx1ZSk7Ci0JCXZhbHVlIC89IDI7Ci0JfQotCXJldHVybiBzdW07CisgICAgaW50IHN1bSA9IDA7CisgICAgd2hpbGUgKHZhbHVlICE9IDApIHsKKyAgICAgICAgc3VtICs9IGZ1bmModmFsdWUpOworICAgICAgICB2YWx1ZSAvPSAyOworICAgIH0KKyAgICByZXR1cm4gc3VtOwogfQogCiBFWFBPUlQoUFlfTE9OR19MT05HKSBfdGVzdGZ1bmNfY2FsbGJhY2tfcV9xZihQWV9MT05HX0xPTkcgdmFsdWUsCi0JCQkJCSAgICAgUFlfTE9OR19MT05HICgqZnVuYykoUFlfTE9OR19MT05HKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBZX0xPTkdfTE9ORyAoKmZ1bmMpKFBZX0xPTkdfTE9ORykpCiB7Ci0JUFlfTE9OR19MT05HIHN1bSA9IDA7CisgICAgUFlfTE9OR19MT05HIHN1bSA9IDA7CiAKLQl3aGlsZSAodmFsdWUgIT0gMCkgewotCQlzdW0gKz0gZnVuYyh2YWx1ZSk7Ci0JCXZhbHVlIC89IDI7Ci0JfQotCXJldHVybiBzdW07CisgICAgd2hpbGUgKHZhbHVlICE9IDApIHsKKyAgICAgICAgc3VtICs9IGZ1bmModmFsdWUpOworICAgICAgICB2YWx1ZSAvPSAyOworICAgIH0KKyAgICByZXR1cm4gc3VtOwogfQogCiAjZW5kaWYKIAogdHlwZWRlZiBzdHJ1Y3QgewotCWNoYXIgKm5hbWU7Ci0JY2hhciAqdmFsdWU7CisgICAgY2hhciAqbmFtZTsKKyAgICBjaGFyICp2YWx1ZTsKIH0gU1BBTTsKIAogdHlwZWRlZiBzdHJ1Y3QgewotCWNoYXIgKm5hbWU7Ci0JaW50IG51bV9zcGFtczsKLQlTUEFNICpzcGFtczsKKyAgICBjaGFyICpuYW1lOworICAgIGludCBudW1fc3BhbXM7CisgICAgU1BBTSAqc3BhbXM7CiB9IEVHRzsKIAogU1BBTSBteV9zcGFtc1syXSA9IHsKLQl7ICJuYW1lMSIsICJ2YWx1ZTEiIH0sCi0JeyAibmFtZTIiLCAidmFsdWUyIiB9LAorICAgIHsgIm5hbWUxIiwgInZhbHVlMSIgfSwKKyAgICB7ICJuYW1lMiIsICJ2YWx1ZTIiIH0sCiB9OwogCiBFR0cgbXlfZWdnc1sxXSA9IHsKLQl7ICJmaXJzdCBlZ2ciLCAxLCBteV9zcGFtcyB9CisgICAgeyAiZmlyc3QgZWdnIiwgMSwgbXlfc3BhbXMgfQogfTsKIAogRVhQT1JUKGludCkgZ2V0U1BBTUFOREVHR1MoRUdHICoqZWdncykKIHsKLQkqZWdncyA9IG15X2VnZ3M7Ci0JcmV0dXJuIDE7CisgICAgKmVnZ3MgPSBteV9lZ2dzOworICAgIHJldHVybiAxOwogfQogCiB0eXBlZGVmIHN0cnVjdCB0YWdwb2ludCB7Ci0JaW50IHg7Ci0JaW50IHk7CisgICAgaW50IHg7CisgICAgaW50IHk7CiB9IHBvaW50OwogCiBFWFBPUlQoaW50KSBfdGVzdGZ1bmNfYnl2YWwocG9pbnQgaW4sIHBvaW50ICpwb3V0KQogewotCWlmIChwb3V0KSB7Ci0JCXBvdXQtPnggPSBpbi54OwotCQlwb3V0LT55ID0gaW4ueTsKLQl9Ci0JcmV0dXJuIGluLnggKyBpbi55OworICAgIGlmIChwb3V0KSB7CisgICAgICAgIHBvdXQtPnggPSBpbi54OworICAgICAgICBwb3V0LT55ID0gaW4ueTsKKyAgICB9CisgICAgcmV0dXJuIGluLnggKyBpbi55OwogfQogCiBFWFBPUlQgKGludCkgYW5faW50ZWdlciA9IDQyOwogCiBFWFBPUlQoaW50KSBnZXRfYW5faW50ZWdlcih2b2lkKQogewotCXJldHVybiBhbl9pbnRlZ2VyOworICAgIHJldHVybiBhbl9pbnRlZ2VyOwogfQogCiBFWFBPUlQoZG91YmxlKQogaW50ZWdyYXRlKGRvdWJsZSBhLCBkb3VibGUgYiwgZG91YmxlICgqZikoZG91YmxlKSwgbG9uZyBuc3RlcCkKIHsKLQlkb3VibGUgeCwgc3VtPTAuMCwgZHg9KGItYSkvKGRvdWJsZSluc3RlcDsKLQlmb3IoeD1hKzAuNSpkeDsgKGIteCkqKHgtYSk+MC4wOyB4Kz1keCkKLQkJc3VtICs9IGYoeCk7Ci0JcmV0dXJuIHN1bS8oZG91YmxlKW5zdGVwOworICAgIGRvdWJsZSB4LCBzdW09MC4wLCBkeD0oYi1hKS8oZG91YmxlKW5zdGVwOworICAgIGZvcih4PWErMC41KmR4OyAoYi14KSooeC1hKT4wLjA7IHgrPWR4KQorICAgICAgICBzdW0gKz0gZih4KTsKKyAgICByZXR1cm4gc3VtLyhkb3VibGUpbnN0ZXA7CiB9CiAKIHR5cGVkZWYgc3RydWN0IHsKLQl2b2lkICgqaW5pdGlhbGl6ZSkodm9pZCAqKCopKGludCksIHZvaWQoKikodm9pZCAqKSk7CisgICAgdm9pZCAoKmluaXRpYWxpemUpKHZvaWQgKigqKShpbnQpLCB2b2lkKCopKHZvaWQgKikpOwogfSB4eHhfbGlicmFyeTsKIAogc3RhdGljIHZvaWQgX3h4eF9pbml0KHZvaWQgKigqWGFsbG9jKShpbnQpLCB2b2lkICgqWGZyZWUpKHZvaWQgKikpCiB7Ci0Jdm9pZCAqcHRyOwotCQotCXByaW50ZigiX3h4eF9pbml0IGdvdCAlcCAlcFxuIiwgWGFsbG9jLCBYZnJlZSk7Ci0JcHJpbnRmKCJjYWxsaW5nXG4iKTsKLQlwdHIgPSBYYWxsb2MoMzIpOwotCVhmcmVlKHB0cik7Ci0JcHJpbnRmKCJjYWxscyBkb25lLCBwdHIgd2FzICVwXG4iLCBwdHIpOworICAgIHZvaWQgKnB0cjsKKworICAgIHByaW50ZigiX3h4eF9pbml0IGdvdCAlcCAlcFxuIiwgWGFsbG9jLCBYZnJlZSk7CisgICAgcHJpbnRmKCJjYWxsaW5nXG4iKTsKKyAgICBwdHIgPSBYYWxsb2MoMzIpOworICAgIFhmcmVlKHB0cik7CisgICAgcHJpbnRmKCJjYWxscyBkb25lLCBwdHIgd2FzICVwXG4iLCBwdHIpOwogfQogCiB4eHhfbGlicmFyeSBfeHh4X2xpYiA9IHsKLQlfeHh4X2luaXQKKyAgICBfeHh4X2luaXQKIH07CiAKIEVYUE9SVCh4eHhfbGlicmFyeSkgKmxpYnJhcnlfZ2V0KHZvaWQpCiB7Ci0JcmV0dXJuICZfeHh4X2xpYjsKKyAgICByZXR1cm4gJl94eHhfbGliOwogfQogCiAjaWZkZWYgTVNfV0lOMzIKIC8qIFNlZSBEb24gQm94IChnZXJtYW4pLCBwcCA3OWZmLiAqLwogRVhQT1JUKHZvaWQpIEdldFN0cmluZyhCU1RSICpwYnN0cikKIHsKLQkqcGJzdHIgPSBTeXNBbGxvY1N0cmluZyhMIkdvb2RieWUhIik7CisgICAgKnBic3RyID0gU3lzQWxsb2NTdHJpbmcoTCJHb29kYnllISIpOwogfQogI2VuZGlmCiAKQEAgLTM0MywxMiArMzQzLDEyIEBACiAgKi8KIFB5T2JqZWN0ICpweV9mdW5jX3NpKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpuYW1lOwotCWludCBpOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic2kiLCAmbmFtZSwgJmkpKQotCQlyZXR1cm4gTlVMTDsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgY2hhciAqbmFtZTsKKyAgICBpbnQgaTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInNpIiwgJm5hbWUsICZpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBFWFBPUlQodm9pZCkgX3B5X2Z1bmNfc2koY2hhciAqcywgaW50IGkpCkBAIC0zNTcsOCArMzU3LDggQEAKIAogUHlPYmplY3QgKnB5X2Z1bmMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIEVYUE9SVCh2b2lkKSBfcHlfZnVuYyh2b2lkKQpAQCAtMzY5LDY0ICszNjksNjQgQEAKIEVYUE9SVCh1bnNpZ25lZCBQWV9MT05HX0xPTkcpIGxhc3RfdGZfYXJnX3U7CiAKIHN0cnVjdCBCSVRTIHsKLQlpbnQgQTogMSwgQjoyLCBDOjMsIEQ6NCwgRTogNSwgRjogNiwgRzogNywgSDogOCwgSTogOTsKLQlzaG9ydCBNOiAxLCBOOiAyLCBPOiAzLCBQOiA0LCBROiA1LCBSOiA2LCBTOiA3OworICAgIGludCBBOiAxLCBCOjIsIEM6MywgRDo0LCBFOiA1LCBGOiA2LCBHOiA3LCBIOiA4LCBJOiA5OworICAgIHNob3J0IE06IDEsIE46IDIsIE86IDMsIFA6IDQsIFE6IDUsIFI6IDYsIFM6IDc7CiB9OwogCiBETF9FWFBPUlQodm9pZCkgc2V0X2JpdGZpZWxkcyhzdHJ1Y3QgQklUUyAqYml0cywgY2hhciBuYW1lLCBpbnQgdmFsdWUpCiB7Ci0Jc3dpdGNoIChuYW1lKSB7Ci0JY2FzZSAnQSc6IGJpdHMtPkEgPSB2YWx1ZTsgYnJlYWs7Ci0JY2FzZSAnQic6IGJpdHMtPkIgPSB2YWx1ZTsgYnJlYWs7Ci0JY2FzZSAnQyc6IGJpdHMtPkMgPSB2YWx1ZTsgYnJlYWs7Ci0JY2FzZSAnRCc6IGJpdHMtPkQgPSB2YWx1ZTsgYnJlYWs7Ci0JY2FzZSAnRSc6IGJpdHMtPkUgPSB2YWx1ZTsgYnJlYWs7Ci0JY2FzZSAnRic6IGJpdHMtPkYgPSB2YWx1ZTsgYnJlYWs7Ci0JY2FzZSAnRyc6IGJpdHMtPkcgPSB2YWx1ZTsgYnJlYWs7Ci0JY2FzZSAnSCc6IGJpdHMtPkggPSB2YWx1ZTsgYnJlYWs7Ci0JY2FzZSAnSSc6IGJpdHMtPkkgPSB2YWx1ZTsgYnJlYWs7CisgICAgc3dpdGNoIChuYW1lKSB7CisgICAgY2FzZSAnQSc6IGJpdHMtPkEgPSB2YWx1ZTsgYnJlYWs7CisgICAgY2FzZSAnQic6IGJpdHMtPkIgPSB2YWx1ZTsgYnJlYWs7CisgICAgY2FzZSAnQyc6IGJpdHMtPkMgPSB2YWx1ZTsgYnJlYWs7CisgICAgY2FzZSAnRCc6IGJpdHMtPkQgPSB2YWx1ZTsgYnJlYWs7CisgICAgY2FzZSAnRSc6IGJpdHMtPkUgPSB2YWx1ZTsgYnJlYWs7CisgICAgY2FzZSAnRic6IGJpdHMtPkYgPSB2YWx1ZTsgYnJlYWs7CisgICAgY2FzZSAnRyc6IGJpdHMtPkcgPSB2YWx1ZTsgYnJlYWs7CisgICAgY2FzZSAnSCc6IGJpdHMtPkggPSB2YWx1ZTsgYnJlYWs7CisgICAgY2FzZSAnSSc6IGJpdHMtPkkgPSB2YWx1ZTsgYnJlYWs7CiAKLQljYXNlICdNJzogYml0cy0+TSA9IHZhbHVlOyBicmVhazsKLQljYXNlICdOJzogYml0cy0+TiA9IHZhbHVlOyBicmVhazsKLQljYXNlICdPJzogYml0cy0+TyA9IHZhbHVlOyBicmVhazsKLQljYXNlICdQJzogYml0cy0+UCA9IHZhbHVlOyBicmVhazsKLQljYXNlICdRJzogYml0cy0+USA9IHZhbHVlOyBicmVhazsKLQljYXNlICdSJzogYml0cy0+UiA9IHZhbHVlOyBicmVhazsKLQljYXNlICdTJzogYml0cy0+UyA9IHZhbHVlOyBicmVhazsKLQl9CisgICAgY2FzZSAnTSc6IGJpdHMtPk0gPSB2YWx1ZTsgYnJlYWs7CisgICAgY2FzZSAnTic6IGJpdHMtPk4gPSB2YWx1ZTsgYnJlYWs7CisgICAgY2FzZSAnTyc6IGJpdHMtPk8gPSB2YWx1ZTsgYnJlYWs7CisgICAgY2FzZSAnUCc6IGJpdHMtPlAgPSB2YWx1ZTsgYnJlYWs7CisgICAgY2FzZSAnUSc6IGJpdHMtPlEgPSB2YWx1ZTsgYnJlYWs7CisgICAgY2FzZSAnUic6IGJpdHMtPlIgPSB2YWx1ZTsgYnJlYWs7CisgICAgY2FzZSAnUyc6IGJpdHMtPlMgPSB2YWx1ZTsgYnJlYWs7CisgICAgfQogfQogCiBETF9FWFBPUlQoaW50KSB1bnBhY2tfYml0ZmllbGRzKHN0cnVjdCBCSVRTICpiaXRzLCBjaGFyIG5hbWUpCiB7Ci0Jc3dpdGNoIChuYW1lKSB7Ci0JY2FzZSAnQSc6IHJldHVybiBiaXRzLT5BOwotCWNhc2UgJ0InOiByZXR1cm4gYml0cy0+QjsKLQljYXNlICdDJzogcmV0dXJuIGJpdHMtPkM7Ci0JY2FzZSAnRCc6IHJldHVybiBiaXRzLT5EOwotCWNhc2UgJ0UnOiByZXR1cm4gYml0cy0+RTsKLQljYXNlICdGJzogcmV0dXJuIGJpdHMtPkY7Ci0JY2FzZSAnRyc6IHJldHVybiBiaXRzLT5HOwotCWNhc2UgJ0gnOiByZXR1cm4gYml0cy0+SDsKLQljYXNlICdJJzogcmV0dXJuIGJpdHMtPkk7CisgICAgc3dpdGNoIChuYW1lKSB7CisgICAgY2FzZSAnQSc6IHJldHVybiBiaXRzLT5BOworICAgIGNhc2UgJ0InOiByZXR1cm4gYml0cy0+QjsKKyAgICBjYXNlICdDJzogcmV0dXJuIGJpdHMtPkM7CisgICAgY2FzZSAnRCc6IHJldHVybiBiaXRzLT5EOworICAgIGNhc2UgJ0UnOiByZXR1cm4gYml0cy0+RTsKKyAgICBjYXNlICdGJzogcmV0dXJuIGJpdHMtPkY7CisgICAgY2FzZSAnRyc6IHJldHVybiBiaXRzLT5HOworICAgIGNhc2UgJ0gnOiByZXR1cm4gYml0cy0+SDsKKyAgICBjYXNlICdJJzogcmV0dXJuIGJpdHMtPkk7CiAKLQljYXNlICdNJzogcmV0dXJuIGJpdHMtPk07Ci0JY2FzZSAnTic6IHJldHVybiBiaXRzLT5OOwotCWNhc2UgJ08nOiByZXR1cm4gYml0cy0+TzsKLQljYXNlICdQJzogcmV0dXJuIGJpdHMtPlA7Ci0JY2FzZSAnUSc6IHJldHVybiBiaXRzLT5ROwotCWNhc2UgJ1InOiByZXR1cm4gYml0cy0+UjsKLQljYXNlICdTJzogcmV0dXJuIGJpdHMtPlM7Ci0JfQotCXJldHVybiAwOworICAgIGNhc2UgJ00nOiByZXR1cm4gYml0cy0+TTsKKyAgICBjYXNlICdOJzogcmV0dXJuIGJpdHMtPk47CisgICAgY2FzZSAnTyc6IHJldHVybiBiaXRzLT5POworICAgIGNhc2UgJ1AnOiByZXR1cm4gYml0cy0+UDsKKyAgICBjYXNlICdRJzogcmV0dXJuIGJpdHMtPlE7CisgICAgY2FzZSAnUic6IHJldHVybiBiaXRzLT5SOworICAgIGNhc2UgJ1MnOiByZXR1cm4gYml0cy0+UzsKKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBtb2R1bGVfbWV0aG9kc1tdID0gewotLyoJeyJnZXRfbGFzdF90Zl9hcmdfcyIsIGdldF9sYXN0X3RmX2FyZ19zLCBNRVRIX05PQVJHU30sCi0JeyJnZXRfbGFzdF90Zl9hcmdfdSIsIGdldF9sYXN0X3RmX2FyZ191LCBNRVRIX05PQVJHU30sCisvKiAgICAgIHsiZ2V0X2xhc3RfdGZfYXJnX3MiLCBnZXRfbGFzdF90Zl9hcmdfcywgTUVUSF9OT0FSR1N9LAorICAgIHsiZ2V0X2xhc3RfdGZfYXJnX3UiLCBnZXRfbGFzdF90Zl9hcmdfdSwgTUVUSF9OT0FSR1N9LAogKi8KLQl7ImZ1bmNfc2kiLCBweV9mdW5jX3NpLCBNRVRIX1ZBUkFSR1N9LAotCXsiZnVuYyIsIHB5X2Z1bmMsIE1FVEhfTk9BUkdTfSwKLQl7IE5VTEwsIE5VTEwsIDAsIE5VTEx9LAorICAgIHsiZnVuY19zaSIsIHB5X2Z1bmNfc2ksIE1FVEhfVkFSQVJHU30sCisgICAgeyJmdW5jIiwgcHlfZnVuYywgTUVUSF9OT0FSR1N9LAorICAgIHsgTlVMTCwgTlVMTCwgMCwgTlVMTH0sCiB9OwogCiAjZGVmaW5lIFMgbGFzdF90Zl9hcmdfcyA9IChQWV9MT05HX0xPTkcpYwpAQCAtNDk2LDgwICs0OTYsODAgQEAKICNlbmRpZgogCiAvKioqKioqKiovCi0gCisKICNpZm5kZWYgTVNfV0lOMzIKIAogdHlwZWRlZiBzdHJ1Y3QgewotCWxvbmcgeDsKLQlsb25nIHk7CisgICAgbG9uZyB4OworICAgIGxvbmcgeTsKIH0gUE9JTlQ7CiAKIHR5cGVkZWYgc3RydWN0IHsKLQlsb25nIGxlZnQ7Ci0JbG9uZyB0b3A7Ci0JbG9uZyByaWdodDsKLQlsb25nIGJvdHRvbTsKKyAgICBsb25nIGxlZnQ7CisgICAgbG9uZyB0b3A7CisgICAgbG9uZyByaWdodDsKKyAgICBsb25nIGJvdHRvbTsKIH0gUkVDVDsKIAogI2VuZGlmCiAKIEVYUE9SVChpbnQpIFBvaW50SW5SZWN0KFJFQ1QgKnByYywgUE9JTlQgcHQpCiB7Ci0JaWYgKHB0LnggPCBwcmMtPmxlZnQpCi0JCXJldHVybiAwOwotCWlmIChwdC54ID4gcHJjLT5yaWdodCkKLQkJcmV0dXJuIDA7Ci0JaWYgKHB0LnkgPCBwcmMtPnRvcCkKLQkJcmV0dXJuIDA7Ci0JaWYgKHB0LnkgPiBwcmMtPmJvdHRvbSkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIDE7CisgICAgaWYgKHB0LnggPCBwcmMtPmxlZnQpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChwdC54ID4gcHJjLT5yaWdodCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKHB0LnkgPCBwcmMtPnRvcCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKHB0LnkgPiBwcmMtPmJvdHRvbSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIDE7CiB9CiAKIHR5cGVkZWYgc3RydWN0IHsKLQlzaG9ydCB4OwotCXNob3J0IHk7CisgICAgc2hvcnQgeDsKKyAgICBzaG9ydCB5OwogfSBTMkg7CiAKIEVYUE9SVChTMkgpIHJldF8yaF9mdW5jKFMySCBpbnApCiB7Ci0JaW5wLnggKj0gMjsKLQlpbnAueSAqPSAzOwotCXJldHVybiBpbnA7CisgICAgaW5wLnggKj0gMjsKKyAgICBpbnAueSAqPSAzOworICAgIHJldHVybiBpbnA7CiB9CiAKIHR5cGVkZWYgc3RydWN0IHsKLQlpbnQgYSwgYiwgYywgZCwgZSwgZiwgZywgaDsKKyAgICBpbnQgYSwgYiwgYywgZCwgZSwgZiwgZywgaDsKIH0gUzhJOwogCiBFWFBPUlQoUzhJKSByZXRfOGlfZnVuYyhTOEkgaW5wKQogewotCWlucC5hICo9IDI7Ci0JaW5wLmIgKj0gMzsKLQlpbnAuYyAqPSA0OwotCWlucC5kICo9IDU7Ci0JaW5wLmUgKj0gNjsKLQlpbnAuZiAqPSA3OwotCWlucC5nICo9IDg7Ci0JaW5wLmggKj0gOTsKLQlyZXR1cm4gaW5wOworICAgIGlucC5hICo9IDI7CisgICAgaW5wLmIgKj0gMzsKKyAgICBpbnAuYyAqPSA0OworICAgIGlucC5kICo9IDU7CisgICAgaW5wLmUgKj0gNjsKKyAgICBpbnAuZiAqPSA3OworICAgIGlucC5nICo9IDg7CisgICAgaW5wLmggKj0gOTsKKyAgICByZXR1cm4gaW5wOwogfQogCiBFWFBPUlQoaW50KSBHZXRSZWN0YW5nbGUoaW50IGZsYWcsIFJFQ1QgKnByZWN0KQogewotCWlmIChmbGFnID09IDApCi0JCXJldHVybiAwOwotCXByZWN0LT5sZWZ0ID0gKGludClmbGFnOwotCXByZWN0LT50b3AgPSAoaW50KWZsYWcgKyAxOwotCXByZWN0LT5yaWdodCA9IChpbnQpZmxhZyArIDI7Ci0JcHJlY3QtPmJvdHRvbSA9IChpbnQpZmxhZyArIDM7Ci0JcmV0dXJuIDE7CisgICAgaWYgKGZsYWcgPT0gMCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcHJlY3QtPmxlZnQgPSAoaW50KWZsYWc7CisgICAgcHJlY3QtPnRvcCA9IChpbnQpZmxhZyArIDE7CisgICAgcHJlY3QtPnJpZ2h0ID0gKGludClmbGFnICsgMjsKKyAgICBwcmVjdC0+Ym90dG9tID0gKGludClmbGFnICsgMzsKKyAgICByZXR1cm4gMTsKIH0KIAogRVhQT1JUKHZvaWQpIFR3b091dEFyZ3MoaW50IGEsIGludCAqcGksIGludCBiLCBpbnQgKnBqKQogewotCSpwaSArPSBhOwotCSpwaiArPSBiOworICAgICpwaSArPSBhOworICAgICpwaiArPSBiOwogfQogCiAjaWZkZWYgTVNfV0lOMzIKQEAgLTU4NCwxMyArNTg0LDEzIEBACiAKIEVYUE9SVCAoSFJFU1VMVCkgS2VlcE9iamVjdChJVW5rbm93biAqcHVuaykKIHsKLQlzdGF0aWMgSVVua25vd24gKnBvYmo7Ci0JaWYgKHB1bmspCi0JCXB1bmstPmxwVnRibC0+QWRkUmVmKHB1bmspOwotCWlmIChwb2JqKQotCQlwb2JqLT5scFZ0YmwtPlJlbGVhc2UocG9iaik7Ci0JcG9iaiA9IHB1bms7Ci0JcmV0dXJuIFNfT0s7CisgICAgc3RhdGljIElVbmtub3duICpwb2JqOworICAgIGlmIChwdW5rKQorICAgICAgICBwdW5rLT5scFZ0YmwtPkFkZFJlZihwdW5rKTsKKyAgICBpZiAocG9iaikKKyAgICAgICAgcG9iai0+bHBWdGJsLT5SZWxlYXNlKHBvYmopOworICAgIHBvYmogPSBwdW5rOworICAgIHJldHVybiBTX09LOwogfQogCiAjZW5kaWYKQEAgLTU5OCw1ICs1OTgsNSBAQAogRExfRVhQT1JUKHZvaWQpCiBpbml0X2N0eXBlc190ZXN0KHZvaWQpCiB7Ci0JUHlfSW5pdE1vZHVsZSgiX2N0eXBlc190ZXN0IiwgbW9kdWxlX21ldGhvZHMpOworICAgIFB5X0luaXRNb2R1bGUoIl9jdHlwZXNfdGVzdCIsIG1vZHVsZV9tZXRob2RzKTsKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9jYWxsYmFja3MuYyBiL01vZHVsZXMvX2N0eXBlcy9jYWxsYmFja3MuYwppbmRleCA1OGMwZGNhLi5iMWI2MGJhIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvY2FsbGJhY2tzLmMKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2NhbGxiYWNrcy5jCkBAIC0xNyw2NSArMTcsNjUgQEAKIHN0YXRpYyB2b2lkCiBDVGh1bmtPYmplY3RfZGVhbGxvYyhQeU9iamVjdCAqX3NlbGYpCiB7Ci0JQ1RodW5rT2JqZWN0ICpzZWxmID0gKENUaHVua09iamVjdCAqKV9zZWxmOwotCVB5X1hERUNSRUYoc2VsZi0+Y29udmVydGVycyk7Ci0JUHlfWERFQ1JFRihzZWxmLT5jYWxsYWJsZSk7Ci0JUHlfWERFQ1JFRihzZWxmLT5yZXN0eXBlKTsKLQlpZiAoc2VsZi0+cGNsKQotCQlGcmVlQ2xvc3VyZShzZWxmLT5wY2wpOwotCVB5T2JqZWN0X0dDX0RlbChzZWxmKTsKKyAgICBDVGh1bmtPYmplY3QgKnNlbGYgPSAoQ1RodW5rT2JqZWN0ICopX3NlbGY7CisgICAgUHlfWERFQ1JFRihzZWxmLT5jb252ZXJ0ZXJzKTsKKyAgICBQeV9YREVDUkVGKHNlbGYtPmNhbGxhYmxlKTsKKyAgICBQeV9YREVDUkVGKHNlbGYtPnJlc3R5cGUpOworICAgIGlmIChzZWxmLT5wY2wpCisgICAgICAgIEZyZWVDbG9zdXJlKHNlbGYtPnBjbCk7CisgICAgUHlPYmplY3RfR0NfRGVsKHNlbGYpOwogfQogCiBzdGF0aWMgaW50CiBDVGh1bmtPYmplY3RfdHJhdmVyc2UoUHlPYmplY3QgKl9zZWxmLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlDVGh1bmtPYmplY3QgKnNlbGYgPSAoQ1RodW5rT2JqZWN0ICopX3NlbGY7Ci0JUHlfVklTSVQoc2VsZi0+Y29udmVydGVycyk7Ci0JUHlfVklTSVQoc2VsZi0+Y2FsbGFibGUpOwotCVB5X1ZJU0lUKHNlbGYtPnJlc3R5cGUpOwotCXJldHVybiAwOworICAgIENUaHVua09iamVjdCAqc2VsZiA9IChDVGh1bmtPYmplY3QgKilfc2VsZjsKKyAgICBQeV9WSVNJVChzZWxmLT5jb252ZXJ0ZXJzKTsKKyAgICBQeV9WSVNJVChzZWxmLT5jYWxsYWJsZSk7CisgICAgUHlfVklTSVQoc2VsZi0+cmVzdHlwZSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIENUaHVua09iamVjdF9jbGVhcihQeU9iamVjdCAqX3NlbGYpCiB7Ci0JQ1RodW5rT2JqZWN0ICpzZWxmID0gKENUaHVua09iamVjdCAqKV9zZWxmOwotCVB5X0NMRUFSKHNlbGYtPmNvbnZlcnRlcnMpOwotCVB5X0NMRUFSKHNlbGYtPmNhbGxhYmxlKTsKLQlQeV9DTEVBUihzZWxmLT5yZXN0eXBlKTsKLQlyZXR1cm4gMDsKKyAgICBDVGh1bmtPYmplY3QgKnNlbGYgPSAoQ1RodW5rT2JqZWN0ICopX3NlbGY7CisgICAgUHlfQ0xFQVIoc2VsZi0+Y29udmVydGVycyk7CisgICAgUHlfQ0xFQVIoc2VsZi0+Y2FsbGFibGUpOworICAgIFB5X0NMRUFSKHNlbGYtPnJlc3R5cGUpOworICAgIHJldHVybiAwOwogfQogCiBQeVR5cGVPYmplY3QgQ1RodW5rX1R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JIl9jdHlwZXMuQ1RodW5rT2JqZWN0IiwKLQlzaXplb2YoQ1RodW5rT2JqZWN0KSwJCQkvKiB0cF9iYXNpY3NpemUgKi8KLQlzaXplb2YoZmZpX3R5cGUpLAkJCS8qIHRwX2l0ZW1zaXplICovCi0JQ1RodW5rT2JqZWN0X2RlYWxsb2MsCQkJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfY29tcGFyZSAqLwotCTAsCQkJCQkvKiB0cF9yZXByICovCi0JMCwJCQkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJCQkJCS8qIHRwX2hhc2ggKi8KLQkwLAkJCQkJLyogdHBfY2FsbCAqLwotCTAsCQkJCQkvKiB0cF9zdHIgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDLAkJCS8qIHRwX2ZsYWdzICovCi0JIkNUaHVua09iamVjdCIsCQkJCS8qIHRwX2RvYyAqLwotCUNUaHVua09iamVjdF90cmF2ZXJzZSwJCQkvKiB0cF90cmF2ZXJzZSAqLwotCUNUaHVua09iamVjdF9jbGVhciwJICAgICAgIAkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaXRlciAqLwotCTAsCQkJCQkvKiB0cF9pdGVybmV4dCAqLwotCTAsCQkJCQkvKiB0cF9tZXRob2RzICovCi0JMCwJCQkJCS8qIHRwX21lbWJlcnMgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAiX2N0eXBlcy5DVGh1bmtPYmplY3QiLAorICAgIHNpemVvZihDVGh1bmtPYmplY3QpLCAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgc2l6ZW9mKGZmaV90eXBlKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIENUaHVua09iamVjdF9kZWFsbG9jLCAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCisgICAgIkNUaHVua09iamVjdCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICBDVGh1bmtPYmplY3RfdHJhdmVyc2UsICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgQ1RodW5rT2JqZWN0X2NsZWFyLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLwogfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtODMsNzQgKzgzLDc0IEBACiBzdGF0aWMgdm9pZAogUHJpbnRFcnJvcihjaGFyICptc2csIC4uLikKIHsKLQljaGFyIGJ1Zls1MTJdOwotCVB5T2JqZWN0ICpmID0gUHlTeXNfR2V0T2JqZWN0KCJzdGRlcnIiKTsKLQl2YV9saXN0IG1hcmtlcjsKKyAgICBjaGFyIGJ1Zls1MTJdOworICAgIFB5T2JqZWN0ICpmID0gUHlTeXNfR2V0T2JqZWN0KCJzdGRlcnIiKTsKKyAgICB2YV9saXN0IG1hcmtlcjsKIAotCXZhX3N0YXJ0KG1hcmtlciwgbXNnKTsKLQl2c25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgbXNnLCBtYXJrZXIpOwotCXZhX2VuZChtYXJrZXIpOwotCWlmIChmKQotCQlQeUZpbGVfV3JpdGVTdHJpbmcoYnVmLCBmKTsKLQlQeUVycl9QcmludCgpOworICAgIHZhX3N0YXJ0KG1hcmtlciwgbXNnKTsKKyAgICB2c25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgbXNnLCBtYXJrZXIpOworICAgIHZhX2VuZChtYXJrZXIpOworICAgIGlmIChmKQorICAgICAgICBQeUZpbGVfV3JpdGVTdHJpbmcoYnVmLCBmKTsKKyAgICBQeUVycl9QcmludCgpOwogfQogCiAKIC8qIGFmdGVyIGNvZGUgdGhhdCBweXJleCBnZW5lcmF0ZXMgKi8KIHZvaWQgX0FkZFRyYWNlYmFjayhjaGFyICpmdW5jbmFtZSwgY2hhciAqZmlsZW5hbWUsIGludCBsaW5lbm8pCiB7Ci0JUHlPYmplY3QgKnB5X3NyY2ZpbGUgPSAwOwotCVB5T2JqZWN0ICpweV9mdW5jbmFtZSA9IDA7Ci0JUHlPYmplY3QgKnB5X2dsb2JhbHMgPSAwOwotCVB5T2JqZWN0ICplbXB0eV90dXBsZSA9IDA7Ci0JUHlPYmplY3QgKmVtcHR5X3N0cmluZyA9IDA7Ci0JUHlDb2RlT2JqZWN0ICpweV9jb2RlID0gMDsKLQlQeUZyYW1lT2JqZWN0ICpweV9mcmFtZSA9IDA7Ci0gICAgCi0JcHlfc3JjZmlsZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoZmlsZW5hbWUpOwotCWlmICghcHlfc3JjZmlsZSkgZ290byBiYWQ7Ci0JcHlfZnVuY25hbWUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGZ1bmNuYW1lKTsKLQlpZiAoIXB5X2Z1bmNuYW1lKSBnb3RvIGJhZDsKLQlweV9nbG9iYWxzID0gUHlEaWN0X05ldygpOwotCWlmICghcHlfZ2xvYmFscykgZ290byBiYWQ7Ci0JZW1wdHlfdHVwbGUgPSBQeVR1cGxlX05ldygwKTsKLQlpZiAoIWVtcHR5X3R1cGxlKSBnb3RvIGJhZDsKLQllbXB0eV9zdHJpbmcgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCIiKTsKLQlpZiAoIWVtcHR5X3N0cmluZykgZ290byBiYWQ7Ci0JcHlfY29kZSA9IFB5Q29kZV9OZXcoCi0JCTAsICAgICAgICAgICAgLyppbnQgYXJnY291bnQsKi8KLQkJMCwgICAgICAgICAgICAvKmludCBubG9jYWxzLCovCi0JCTAsICAgICAgICAgICAgLyppbnQgc3RhY2tzaXplLCovCi0JCTAsICAgICAgICAgICAgLyppbnQgZmxhZ3MsKi8KLQkJZW1wdHlfc3RyaW5nLCAvKlB5T2JqZWN0ICpjb2RlLCovCi0JCWVtcHR5X3R1cGxlLCAgLypQeU9iamVjdCAqY29uc3RzLCovCi0JCWVtcHR5X3R1cGxlLCAgLypQeU9iamVjdCAqbmFtZXMsKi8KLQkJZW1wdHlfdHVwbGUsICAvKlB5T2JqZWN0ICp2YXJuYW1lcywqLwotCQllbXB0eV90dXBsZSwgIC8qUHlPYmplY3QgKmZyZWV2YXJzLCovCi0JCWVtcHR5X3R1cGxlLCAgLypQeU9iamVjdCAqY2VsbHZhcnMsKi8KLQkJcHlfc3JjZmlsZSwgICAvKlB5T2JqZWN0ICpmaWxlbmFtZSwqLwotCQlweV9mdW5jbmFtZSwgIC8qUHlPYmplY3QgKm5hbWUsKi8KLQkJbGluZW5vLCAgIC8qaW50IGZpcnN0bGluZW5vLCovCi0JCWVtcHR5X3N0cmluZyAgLypQeU9iamVjdCAqbG5vdGFiKi8KLQkJKTsKLQlpZiAoIXB5X2NvZGUpIGdvdG8gYmFkOwotCXB5X2ZyYW1lID0gUHlGcmFtZV9OZXcoCi0JCVB5VGhyZWFkU3RhdGVfR2V0KCksIC8qUHlUaHJlYWRTdGF0ZSAqdHN0YXRlLCovCi0JCXB5X2NvZGUsICAgICAgICAgICAgIC8qUHlDb2RlT2JqZWN0ICpjb2RlLCovCi0JCXB5X2dsb2JhbHMsICAgICAgICAgIC8qUHlPYmplY3QgKmdsb2JhbHMsKi8KLQkJMCAgICAgICAgICAgICAgICAgICAgLypQeU9iamVjdCAqbG9jYWxzKi8KLQkJKTsKLQlpZiAoIXB5X2ZyYW1lKSBnb3RvIGJhZDsKLQlweV9mcmFtZS0+Zl9saW5lbm8gPSBsaW5lbm87Ci0JUHlUcmFjZUJhY2tfSGVyZShweV9mcmFtZSk7CisgICAgUHlPYmplY3QgKnB5X3NyY2ZpbGUgPSAwOworICAgIFB5T2JqZWN0ICpweV9mdW5jbmFtZSA9IDA7CisgICAgUHlPYmplY3QgKnB5X2dsb2JhbHMgPSAwOworICAgIFB5T2JqZWN0ICplbXB0eV90dXBsZSA9IDA7CisgICAgUHlPYmplY3QgKmVtcHR5X3N0cmluZyA9IDA7CisgICAgUHlDb2RlT2JqZWN0ICpweV9jb2RlID0gMDsKKyAgICBQeUZyYW1lT2JqZWN0ICpweV9mcmFtZSA9IDA7CisKKyAgICBweV9zcmNmaWxlID0gUHlTdHJpbmdfRnJvbVN0cmluZyhmaWxlbmFtZSk7CisgICAgaWYgKCFweV9zcmNmaWxlKSBnb3RvIGJhZDsKKyAgICBweV9mdW5jbmFtZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoZnVuY25hbWUpOworICAgIGlmICghcHlfZnVuY25hbWUpIGdvdG8gYmFkOworICAgIHB5X2dsb2JhbHMgPSBQeURpY3RfTmV3KCk7CisgICAgaWYgKCFweV9nbG9iYWxzKSBnb3RvIGJhZDsKKyAgICBlbXB0eV90dXBsZSA9IFB5VHVwbGVfTmV3KDApOworICAgIGlmICghZW1wdHlfdHVwbGUpIGdvdG8gYmFkOworICAgIGVtcHR5X3N0cmluZyA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIiIpOworICAgIGlmICghZW1wdHlfc3RyaW5nKSBnb3RvIGJhZDsKKyAgICBweV9jb2RlID0gUHlDb2RlX05ldygKKyAgICAgICAgMCwgICAgICAgICAgICAvKmludCBhcmdjb3VudCwqLworICAgICAgICAwLCAgICAgICAgICAgIC8qaW50IG5sb2NhbHMsKi8KKyAgICAgICAgMCwgICAgICAgICAgICAvKmludCBzdGFja3NpemUsKi8KKyAgICAgICAgMCwgICAgICAgICAgICAvKmludCBmbGFncywqLworICAgICAgICBlbXB0eV9zdHJpbmcsIC8qUHlPYmplY3QgKmNvZGUsKi8KKyAgICAgICAgZW1wdHlfdHVwbGUsICAvKlB5T2JqZWN0ICpjb25zdHMsKi8KKyAgICAgICAgZW1wdHlfdHVwbGUsICAvKlB5T2JqZWN0ICpuYW1lcywqLworICAgICAgICBlbXB0eV90dXBsZSwgIC8qUHlPYmplY3QgKnZhcm5hbWVzLCovCisgICAgICAgIGVtcHR5X3R1cGxlLCAgLypQeU9iamVjdCAqZnJlZXZhcnMsKi8KKyAgICAgICAgZW1wdHlfdHVwbGUsICAvKlB5T2JqZWN0ICpjZWxsdmFycywqLworICAgICAgICBweV9zcmNmaWxlLCAgIC8qUHlPYmplY3QgKmZpbGVuYW1lLCovCisgICAgICAgIHB5X2Z1bmNuYW1lLCAgLypQeU9iamVjdCAqbmFtZSwqLworICAgICAgICBsaW5lbm8sICAgLyppbnQgZmlyc3RsaW5lbm8sKi8KKyAgICAgICAgZW1wdHlfc3RyaW5nICAvKlB5T2JqZWN0ICpsbm90YWIqLworICAgICAgICApOworICAgIGlmICghcHlfY29kZSkgZ290byBiYWQ7CisgICAgcHlfZnJhbWUgPSBQeUZyYW1lX05ldygKKyAgICAgICAgUHlUaHJlYWRTdGF0ZV9HZXQoKSwgLypQeVRocmVhZFN0YXRlICp0c3RhdGUsKi8KKyAgICAgICAgcHlfY29kZSwgICAgICAgICAgICAgLypQeUNvZGVPYmplY3QgKmNvZGUsKi8KKyAgICAgICAgcHlfZ2xvYmFscywgICAgICAgICAgLypQeU9iamVjdCAqZ2xvYmFscywqLworICAgICAgICAwICAgICAgICAgICAgICAgICAgICAvKlB5T2JqZWN0ICpsb2NhbHMqLworICAgICAgICApOworICAgIGlmICghcHlfZnJhbWUpIGdvdG8gYmFkOworICAgIHB5X2ZyYW1lLT5mX2xpbmVubyA9IGxpbmVubzsKKyAgICBQeVRyYWNlQmFja19IZXJlKHB5X2ZyYW1lKTsKICAgYmFkOgotCVB5X1hERUNSRUYocHlfZ2xvYmFscyk7Ci0JUHlfWERFQ1JFRihweV9zcmNmaWxlKTsKLQlQeV9YREVDUkVGKHB5X2Z1bmNuYW1lKTsKLQlQeV9YREVDUkVGKGVtcHR5X3R1cGxlKTsKLQlQeV9YREVDUkVGKGVtcHR5X3N0cmluZyk7Ci0JUHlfWERFQ1JFRihweV9jb2RlKTsKLQlQeV9YREVDUkVGKHB5X2ZyYW1lKTsKKyAgICBQeV9YREVDUkVGKHB5X2dsb2JhbHMpOworICAgIFB5X1hERUNSRUYocHlfc3JjZmlsZSk7CisgICAgUHlfWERFQ1JFRihweV9mdW5jbmFtZSk7CisgICAgUHlfWERFQ1JFRihlbXB0eV90dXBsZSk7CisgICAgUHlfWERFQ1JFRihlbXB0eV9zdHJpbmcpOworICAgIFB5X1hERUNSRUYocHlfY29kZSk7CisgICAgUHlfWERFQ1JFRihweV9mcmFtZSk7CiB9CiAKICNpZmRlZiBNU19XSU4zMgpAQCAtMTY3LDE1ICsxNjcsMTUgQEAKIHN0YXRpYyB2b2lkCiBUcnlBZGRSZWYoU3RnRGljdE9iamVjdCAqZGljdCwgQ0RhdGFPYmplY3QgKm9iaikKIHsKLQlJVW5rbm93biAqcHVuazsKKyAgICBJVW5rbm93biAqcHVuazsKIAotCWlmIChOVUxMID09IFB5RGljdF9HZXRJdGVtU3RyaW5nKChQeU9iamVjdCAqKWRpY3QsICJfbmVlZHNfY29tX2FkZHJlZl8iKSkKLQkJcmV0dXJuOworICAgIGlmIChOVUxMID09IFB5RGljdF9HZXRJdGVtU3RyaW5nKChQeU9iamVjdCAqKWRpY3QsICJfbmVlZHNfY29tX2FkZHJlZl8iKSkKKyAgICAgICAgcmV0dXJuOwogCi0JcHVuayA9ICooSVVua25vd24gKiopb2JqLT5iX3B0cjsKLQlpZiAocHVuaykKLQkJcHVuay0+bHBWdGJsLT5BZGRSZWYocHVuayk7Ci0JcmV0dXJuOworICAgIHB1bmsgPSAqKElVbmtub3duICoqKW9iai0+Yl9wdHI7CisgICAgaWYgKHB1bmspCisgICAgICAgIHB1bmstPmxwVnRibC0+QWRkUmVmKHB1bmspOworICAgIHJldHVybjsKIH0KICNlbmRpZgogCkBAIC0xODUsNDIwICsxODUsNDIwIEBACiAgKgogICovCiBzdGF0aWMgdm9pZCBfQ2FsbFB5dGhvbk9iamVjdCh2b2lkICptZW0sCi0JCQkgICAgICBmZmlfdHlwZSAqcmVzdHlwZSwKLQkJCSAgICAgIFNFVEZVTkMgc2V0ZnVuYywKLQkJCSAgICAgIFB5T2JqZWN0ICpjYWxsYWJsZSwKLQkJCSAgICAgIFB5T2JqZWN0ICpjb252ZXJ0ZXJzLAotCQkJICAgICAgaW50IGZsYWdzLAotCQkJICAgICAgdm9pZCAqKnBBcmdzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmZpX3R5cGUgKnJlc3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRVRGVU5DIHNldGZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqY2FsbGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqY29udmVydGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKipwQXJncykKIHsKLQlQeV9zc2l6ZV90IGk7Ci0JUHlPYmplY3QgKnJlc3VsdDsKLQlQeU9iamVjdCAqYXJnbGlzdCA9IE5VTEw7Ci0JUHlfc3NpemVfdCBuQXJnczsKLQlQeU9iamVjdCAqZXJyb3Jfb2JqZWN0ID0gTlVMTDsKLQlpbnQgKnNwYWNlOworICAgIFB5X3NzaXplX3QgaTsKKyAgICBQeU9iamVjdCAqcmVzdWx0OworICAgIFB5T2JqZWN0ICphcmdsaXN0ID0gTlVMTDsKKyAgICBQeV9zc2l6ZV90IG5BcmdzOworICAgIFB5T2JqZWN0ICplcnJvcl9vYmplY3QgPSBOVUxMOworICAgIGludCAqc3BhY2U7CiAjaWZkZWYgV0lUSF9USFJFQUQKLQlQeUdJTFN0YXRlX1NUQVRFIHN0YXRlID0gUHlHSUxTdGF0ZV9FbnN1cmUoKTsKKyAgICBQeUdJTFN0YXRlX1NUQVRFIHN0YXRlID0gUHlHSUxTdGF0ZV9FbnN1cmUoKTsKICNlbmRpZgogCi0JbkFyZ3MgPSBQeVNlcXVlbmNlX0xlbmd0aChjb252ZXJ0ZXJzKTsKLQkvKiBIbS4gV2hhdCB0byByZXR1cm4gaW4gY2FzZSBvZiBlcnJvcj8KLQkgICBGb3IgQ09NLCAweEZGRkZGRkZGIHNlZW1zIGJldHRlciB0aGFuIDAuCi0JKi8KLQlpZiAobkFyZ3MgPCAwKSB7Ci0JCVByaW50RXJyb3IoIkJVRzogUHlTZXF1ZW5jZV9MZW5ndGgiKTsKLQkJZ290byBEb25lOwotCX0KKyAgICBuQXJncyA9IFB5U2VxdWVuY2VfTGVuZ3RoKGNvbnZlcnRlcnMpOworICAgIC8qIEhtLiBXaGF0IHRvIHJldHVybiBpbiBjYXNlIG9mIGVycm9yPworICAgICAgIEZvciBDT00sIDB4RkZGRkZGRkYgc2VlbXMgYmV0dGVyIHRoYW4gMC4KKyAgICAqLworICAgIGlmIChuQXJncyA8IDApIHsKKyAgICAgICAgUHJpbnRFcnJvcigiQlVHOiBQeVNlcXVlbmNlX0xlbmd0aCIpOworICAgICAgICBnb3RvIERvbmU7CisgICAgfQogCi0JYXJnbGlzdCA9IFB5VHVwbGVfTmV3KG5BcmdzKTsKLQlpZiAoIWFyZ2xpc3QpIHsKLQkJUHJpbnRFcnJvcigiUHlUdXBsZV9OZXcoKSIpOwotCQlnb3RvIERvbmU7Ci0JfQotCWZvciAoaSA9IDA7IGkgPCBuQXJnczsgKytpKSB7Ci0JCS8qIE5vdGU6IG5ldyByZWZlcmVuY2UhICovCi0JCVB5T2JqZWN0ICpjbnYgPSBQeVNlcXVlbmNlX0dldEl0ZW0oY29udmVydGVycywgaSk7Ci0JCVN0Z0RpY3RPYmplY3QgKmRpY3Q7Ci0JCWlmIChjbnYpCi0JCQlkaWN0ID0gUHlUeXBlX3N0Z2RpY3QoY252KTsKLQkJZWxzZSB7Ci0JCQlQcmludEVycm9yKCJHZXR0aW5nIGFyZ3VtZW50IGNvbnZlcnRlciAlZFxuIiwgaSk7Ci0JCQlnb3RvIERvbmU7Ci0JCX0KKyAgICBhcmdsaXN0ID0gUHlUdXBsZV9OZXcobkFyZ3MpOworICAgIGlmICghYXJnbGlzdCkgeworICAgICAgICBQcmludEVycm9yKCJQeVR1cGxlX05ldygpIik7CisgICAgICAgIGdvdG8gRG9uZTsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IG5BcmdzOyArK2kpIHsKKyAgICAgICAgLyogTm90ZTogbmV3IHJlZmVyZW5jZSEgKi8KKyAgICAgICAgUHlPYmplY3QgKmNudiA9IFB5U2VxdWVuY2VfR2V0SXRlbShjb252ZXJ0ZXJzLCBpKTsKKyAgICAgICAgU3RnRGljdE9iamVjdCAqZGljdDsKKyAgICAgICAgaWYgKGNudikKKyAgICAgICAgICAgIGRpY3QgPSBQeVR5cGVfc3RnZGljdChjbnYpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIFByaW50RXJyb3IoIkdldHRpbmcgYXJndW1lbnQgY29udmVydGVyICVkXG4iLCBpKTsKKyAgICAgICAgICAgIGdvdG8gRG9uZTsKKyAgICAgICAgfQogCi0JCWlmIChkaWN0ICYmIGRpY3QtPmdldGZ1bmMgJiYgIUlzU2ltcGxlU3ViVHlwZShjbnYpKSB7Ci0JCQlQeU9iamVjdCAqdiA9IGRpY3QtPmdldGZ1bmMoKnBBcmdzLCBkaWN0LT5zaXplKTsKLQkJCWlmICghdikgewotCQkJCVByaW50RXJyb3IoImNyZWF0ZSBhcmd1bWVudCAlZDpcbiIsIGkpOwotCQkJCVB5X0RFQ1JFRihjbnYpOwotCQkJCWdvdG8gRG9uZTsKLQkJCX0KLQkJCVB5VHVwbGVfU0VUX0lURU0oYXJnbGlzdCwgaSwgdik7Ci0JCQkvKiBYWFggWFhYIFhYCi0JCQkgICBXZSBoYXZlIHRoZSBwcm9ibGVtIHRoYXQgY19ieXRlIG9yIGNfc2hvcnQgaGF2ZSBkaWN0LT5zaXplIG9mCi0JCQkgICAxIHJlc3AuIDQsIGJ1dCB0aGVzZSBwYXJhbWV0ZXJzIGFyZSBwdXNoZWQgYXMgc2l6ZW9mKGludCkgYnl0ZXMuCi0JCQkgICBCVFcsIHRoZSBzYW1lIHByb2JsZW0gb2NjdXJycyB3aGVuIHRoZXkgYXJlIHB1c2hlZCBhcyBwYXJhbWV0ZXJzCi0JCQkqLwotCQl9IGVsc2UgaWYgKGRpY3QpIHsKLQkJCS8qIEhtLCBzaG91bGRuJ3Qgd2UgdXNlIENEYXRhX0F0QWRkcmVzcygpIG9yIHNvbWV0aGluZyBsaWtlIHRoYXQgaW5zdGVhZD8gKi8KLQkJCUNEYXRhT2JqZWN0ICpvYmogPSAoQ0RhdGFPYmplY3QgKilQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGNudiwgTlVMTCk7Ci0JCQlpZiAoIW9iaikgewotCQkJCVByaW50RXJyb3IoImNyZWF0ZSBhcmd1bWVudCAlZDpcbiIsIGkpOwotCQkJCVB5X0RFQ1JFRihjbnYpOwotCQkJCWdvdG8gRG9uZTsKLQkJCX0KLQkJCWlmICghQ0RhdGFPYmplY3RfQ2hlY2sob2JqKSkgewotCQkJCVB5X0RFQ1JFRihvYmopOwotCQkJCVB5X0RFQ1JFRihjbnYpOwotCQkJCVByaW50RXJyb3IoInVuZXhwZWN0ZWQgcmVzdWx0IG9mIGNyZWF0ZSBhcmd1bWVudCAlZDpcbiIsIGkpOwotCQkJCWdvdG8gRG9uZTsKLQkJCX0KLQkJCW1lbWNweShvYmotPmJfcHRyLCAqcEFyZ3MsIGRpY3QtPnNpemUpOwotCQkJUHlUdXBsZV9TRVRfSVRFTShhcmdsaXN0LCBpLCAoUHlPYmplY3QgKilvYmopOworICAgICAgICBpZiAoZGljdCAmJiBkaWN0LT5nZXRmdW5jICYmICFJc1NpbXBsZVN1YlR5cGUoY252KSkgeworICAgICAgICAgICAgUHlPYmplY3QgKnYgPSBkaWN0LT5nZXRmdW5jKCpwQXJncywgZGljdC0+c2l6ZSk7CisgICAgICAgICAgICBpZiAoIXYpIHsKKyAgICAgICAgICAgICAgICBQcmludEVycm9yKCJjcmVhdGUgYXJndW1lbnQgJWQ6XG4iLCBpKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoY252KTsKKyAgICAgICAgICAgICAgICBnb3RvIERvbmU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKGFyZ2xpc3QsIGksIHYpOworICAgICAgICAgICAgLyogWFhYIFhYWCBYWAorICAgICAgICAgICAgICAgV2UgaGF2ZSB0aGUgcHJvYmxlbSB0aGF0IGNfYnl0ZSBvciBjX3Nob3J0IGhhdmUgZGljdC0+c2l6ZSBvZgorICAgICAgICAgICAgICAgMSByZXNwLiA0LCBidXQgdGhlc2UgcGFyYW1ldGVycyBhcmUgcHVzaGVkIGFzIHNpemVvZihpbnQpIGJ5dGVzLgorICAgICAgICAgICAgICAgQlRXLCB0aGUgc2FtZSBwcm9ibGVtIG9jY3VycnMgd2hlbiB0aGV5IGFyZSBwdXNoZWQgYXMgcGFyYW1ldGVycworICAgICAgICAgICAgKi8KKyAgICAgICAgfSBlbHNlIGlmIChkaWN0KSB7CisgICAgICAgICAgICAvKiBIbSwgc2hvdWxkbid0IHdlIHVzZSBDRGF0YV9BdEFkZHJlc3MoKSBvciBzb21ldGhpbmcgbGlrZSB0aGF0IGluc3RlYWQ/ICovCisgICAgICAgICAgICBDRGF0YU9iamVjdCAqb2JqID0gKENEYXRhT2JqZWN0ICopUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhjbnYsIE5VTEwpOworICAgICAgICAgICAgaWYgKCFvYmopIHsKKyAgICAgICAgICAgICAgICBQcmludEVycm9yKCJjcmVhdGUgYXJndW1lbnQgJWQ6XG4iLCBpKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoY252KTsKKyAgICAgICAgICAgICAgICBnb3RvIERvbmU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIUNEYXRhT2JqZWN0X0NoZWNrKG9iaikpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYob2JqKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoY252KTsKKyAgICAgICAgICAgICAgICBQcmludEVycm9yKCJ1bmV4cGVjdGVkIHJlc3VsdCBvZiBjcmVhdGUgYXJndW1lbnQgJWQ6XG4iLCBpKTsKKyAgICAgICAgICAgICAgICBnb3RvIERvbmU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtZW1jcHkob2JqLT5iX3B0ciwgKnBBcmdzLCBkaWN0LT5zaXplKTsKKyAgICAgICAgICAgIFB5VHVwbGVfU0VUX0lURU0oYXJnbGlzdCwgaSwgKFB5T2JqZWN0ICopb2JqKTsKICNpZmRlZiBNU19XSU4zMgotCQkJVHJ5QWRkUmVmKGRpY3QsIG9iaik7CisgICAgICAgICAgICBUcnlBZGRSZWYoZGljdCwgb2JqKTsKICNlbmRpZgotCQl9IGVsc2UgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkJImNhbm5vdCBidWlsZCBwYXJhbWV0ZXIiKTsKLQkJCVByaW50RXJyb3IoIlBhcnNpbmcgYXJndW1lbnQgJWRcbiIsIGkpOwotCQkJUHlfREVDUkVGKGNudik7Ci0JCQlnb3RvIERvbmU7Ci0JCX0KLQkJUHlfREVDUkVGKGNudik7Ci0JCS8qIFhYWCBlcnJvciBoYW5kbGluZyEgKi8KLQkJcEFyZ3MrKzsKLQl9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjYW5ub3QgYnVpbGQgcGFyYW1ldGVyIik7CisgICAgICAgICAgICBQcmludEVycm9yKCJQYXJzaW5nIGFyZ3VtZW50ICVkXG4iLCBpKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihjbnYpOworICAgICAgICAgICAgZ290byBEb25lOworICAgICAgICB9CisgICAgICAgIFB5X0RFQ1JFRihjbnYpOworICAgICAgICAvKiBYWFggZXJyb3IgaGFuZGxpbmchICovCisgICAgICAgIHBBcmdzKys7CisgICAgfQogCiAjZGVmaW5lIENIRUNLKHdoYXQsIHgpIFwKIGlmICh4ID09IE5VTEwpIF9BZGRUcmFjZWJhY2sod2hhdCwgIl9jdHlwZXMvY2FsbGJhY2tzLmMiLCBfX0xJTkVfXyAtIDEpLCBQeUVycl9QcmludCgpCiAKLQlpZiAoZmxhZ3MgJiAoRlVOQ0ZMQUdfVVNFX0VSUk5PIHwgRlVOQ0ZMQUdfVVNFX0xBU1RFUlJPUikpIHsKLQkJZXJyb3Jfb2JqZWN0ID0gZ2V0X2Vycm9yX29iamVjdCgmc3BhY2UpOwotCQlpZiAoZXJyb3Jfb2JqZWN0ID09IE5VTEwpCi0JCQlnb3RvIERvbmU7Ci0JCWlmIChmbGFncyAmIEZVTkNGTEFHX1VTRV9FUlJOTykgewotCQkJaW50IHRlbXAgPSBzcGFjZVswXTsKLQkJCXNwYWNlWzBdID0gZXJybm87Ci0JCQllcnJubyA9IHRlbXA7Ci0JCX0KKyAgICBpZiAoZmxhZ3MgJiAoRlVOQ0ZMQUdfVVNFX0VSUk5PIHwgRlVOQ0ZMQUdfVVNFX0xBU1RFUlJPUikpIHsKKyAgICAgICAgZXJyb3Jfb2JqZWN0ID0gZ2V0X2Vycm9yX29iamVjdCgmc3BhY2UpOworICAgICAgICBpZiAoZXJyb3Jfb2JqZWN0ID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIERvbmU7CisgICAgICAgIGlmIChmbGFncyAmIEZVTkNGTEFHX1VTRV9FUlJOTykgeworICAgICAgICAgICAgaW50IHRlbXAgPSBzcGFjZVswXTsKKyAgICAgICAgICAgIHNwYWNlWzBdID0gZXJybm87CisgICAgICAgICAgICBlcnJubyA9IHRlbXA7CisgICAgICAgIH0KICNpZmRlZiBNU19XSU4zMgotCQlpZiAoZmxhZ3MgJiBGVU5DRkxBR19VU0VfTEFTVEVSUk9SKSB7Ci0JCQlpbnQgdGVtcCA9IHNwYWNlWzFdOwotCQkJc3BhY2VbMV0gPSBHZXRMYXN0RXJyb3IoKTsKLQkJCVNldExhc3RFcnJvcih0ZW1wKTsKLQkJfQorICAgICAgICBpZiAoZmxhZ3MgJiBGVU5DRkxBR19VU0VfTEFTVEVSUk9SKSB7CisgICAgICAgICAgICBpbnQgdGVtcCA9IHNwYWNlWzFdOworICAgICAgICAgICAgc3BhY2VbMV0gPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgICAgIFNldExhc3RFcnJvcih0ZW1wKTsKKyAgICAgICAgfQogI2VuZGlmCi0JfQorICAgIH0KIAotCXJlc3VsdCA9IFB5T2JqZWN0X0NhbGxPYmplY3QoY2FsbGFibGUsIGFyZ2xpc3QpOwotCUNIRUNLKCInY2FsbGluZyBjYWxsYmFjayBmdW5jdGlvbiciLCByZXN1bHQpOworICAgIHJlc3VsdCA9IFB5T2JqZWN0X0NhbGxPYmplY3QoY2FsbGFibGUsIGFyZ2xpc3QpOworICAgIENIRUNLKCInY2FsbGluZyBjYWxsYmFjayBmdW5jdGlvbiciLCByZXN1bHQpOwogCiAjaWZkZWYgTVNfV0lOMzIKLQlpZiAoZmxhZ3MgJiBGVU5DRkxBR19VU0VfTEFTVEVSUk9SKSB7Ci0JCWludCB0ZW1wID0gc3BhY2VbMV07Ci0JCXNwYWNlWzFdID0gR2V0TGFzdEVycm9yKCk7Ci0JCVNldExhc3RFcnJvcih0ZW1wKTsKLQl9CisgICAgaWYgKGZsYWdzICYgRlVOQ0ZMQUdfVVNFX0xBU1RFUlJPUikgeworICAgICAgICBpbnQgdGVtcCA9IHNwYWNlWzFdOworICAgICAgICBzcGFjZVsxXSA9IEdldExhc3RFcnJvcigpOworICAgICAgICBTZXRMYXN0RXJyb3IodGVtcCk7CisgICAgfQogI2VuZGlmCi0JaWYgKGZsYWdzICYgRlVOQ0ZMQUdfVVNFX0VSUk5PKSB7Ci0JCWludCB0ZW1wID0gc3BhY2VbMF07Ci0JCXNwYWNlWzBdID0gZXJybm87Ci0JCWVycm5vID0gdGVtcDsKLQl9Ci0JUHlfWERFQ1JFRihlcnJvcl9vYmplY3QpOworICAgIGlmIChmbGFncyAmIEZVTkNGTEFHX1VTRV9FUlJOTykgeworICAgICAgICBpbnQgdGVtcCA9IHNwYWNlWzBdOworICAgICAgICBzcGFjZVswXSA9IGVycm5vOworICAgICAgICBlcnJubyA9IHRlbXA7CisgICAgfQorICAgIFB5X1hERUNSRUYoZXJyb3Jfb2JqZWN0KTsKIAotCWlmICgocmVzdHlwZSAhPSAmZmZpX3R5cGVfdm9pZCkgJiYgcmVzdWx0KSB7Ci0JCVB5T2JqZWN0ICprZWVwOwotCQlhc3NlcnQoc2V0ZnVuYyk7CisgICAgaWYgKChyZXN0eXBlICE9ICZmZmlfdHlwZV92b2lkKSAmJiByZXN1bHQpIHsKKyAgICAgICAgUHlPYmplY3QgKmtlZXA7CisgICAgICAgIGFzc2VydChzZXRmdW5jKTsKICNpZmRlZiBXT1JEU19CSUdFTkRJQU4KLQkJLyogU2VlIHRoZSBjb3JyZXNwb25kaW5nIGNvZGUgaW4gY2FsbHByb2MuYywgYXJvdW5kIGxpbmUgOTYxICovCi0JCWlmIChyZXN0eXBlLT50eXBlICE9IEZGSV9UWVBFX0ZMT0FUICYmIHJlc3R5cGUtPnNpemUgPCBzaXplb2YoZmZpX2FyZykpCi0JCQltZW0gPSAoY2hhciAqKW1lbSArIHNpemVvZihmZmlfYXJnKSAtIHJlc3R5cGUtPnNpemU7CisgICAgICAgIC8qIFNlZSB0aGUgY29ycmVzcG9uZGluZyBjb2RlIGluIGNhbGxwcm9jLmMsIGFyb3VuZCBsaW5lIDk2MSAqLworICAgICAgICBpZiAocmVzdHlwZS0+dHlwZSAhPSBGRklfVFlQRV9GTE9BVCAmJiByZXN0eXBlLT5zaXplIDwgc2l6ZW9mKGZmaV9hcmcpKQorICAgICAgICAgICAgbWVtID0gKGNoYXIgKiltZW0gKyBzaXplb2YoZmZpX2FyZykgLSByZXN0eXBlLT5zaXplOwogI2VuZGlmCi0JCWtlZXAgPSBzZXRmdW5jKG1lbSwgcmVzdWx0LCAwKTsKLQkJQ0hFQ0soIidjb252ZXJ0aW5nIGNhbGxiYWNrIHJlc3VsdCciLCBrZWVwKTsKLQkJLyoga2VlcCBpcyBhbiBvYmplY3Qgd2UgaGF2ZSB0byBrZWVwIGFsaXZlIHNvIHRoYXQgdGhlIHJlc3VsdAotCQkgICBzdGF5cyB2YWxpZC4gIElmIHRoZXJlIGlzIG5vIHN1Y2ggb2JqZWN0LCB0aGUgc2V0ZnVuYyB3aWxsCi0JCSAgIGhhdmUgcmV0dXJuZWQgUHlfTm9uZS4KKyAgICAgICAga2VlcCA9IHNldGZ1bmMobWVtLCByZXN1bHQsIDApOworICAgICAgICBDSEVDSygiJ2NvbnZlcnRpbmcgY2FsbGJhY2sgcmVzdWx0JyIsIGtlZXApOworICAgICAgICAvKiBrZWVwIGlzIGFuIG9iamVjdCB3ZSBoYXZlIHRvIGtlZXAgYWxpdmUgc28gdGhhdCB0aGUgcmVzdWx0CisgICAgICAgICAgIHN0YXlzIHZhbGlkLiAgSWYgdGhlcmUgaXMgbm8gc3VjaCBvYmplY3QsIHRoZSBzZXRmdW5jIHdpbGwKKyAgICAgICAgICAgaGF2ZSByZXR1cm5lZCBQeV9Ob25lLgogCi0JCSAgIElmIHRoZXJlIGlzIHN1Y2ggYW4gb2JqZWN0LCB3ZSBoYXZlIG5vIGNob2ljZSB0aGFuIHRvIGtlZXAKLQkJICAgaXQgYWxpdmUgZm9yZXZlciAtIGJ1dCBhIHJlZmNvdW50IGFuZC9vciBtZW1vcnkgbGVhayB3aWxsCi0JCSAgIGJlIHRoZSByZXN1bHQuICBFWENFUFQgd2hlbiByZXN0eXBlIGlzIHB5X29iamVjdCAtIFB5dGhvbgotCQkgICBpdHNlbGYga25vd3MgaG93IHRvIG1hbmFnZSB0aGUgcmVmY291bnQgb2YgdGhlc2Ugb2JqZWN0cy4KLQkJKi8KLQkJaWYgKGtlZXAgPT0gTlVMTCkgLyogQ291bGQgbm90IGNvbnZlcnQgY2FsbGJhY2sgcmVzdWx0LiAqLwotCQkJUHlFcnJfV3JpdGVVbnJhaXNhYmxlKGNhbGxhYmxlKTsKLQkJZWxzZSBpZiAoa2VlcCA9PSBQeV9Ob25lKSAvKiBOb3RoaW5nIHRvIGtlZXAgKi8KLQkJCVB5X0RFQ1JFRihrZWVwKTsKLQkJZWxzZSBpZiAoc2V0ZnVuYyAhPSBnZXRlbnRyeSgiTyIpLT5zZXRmdW5jKSB7Ci0JCQlpZiAoLTEgPT0gUHlFcnJfV2FybihQeUV4Y19SdW50aW1lV2FybmluZywKLQkJCQkJICAgICAibWVtb3J5IGxlYWsgaW4gY2FsbGJhY2sgZnVuY3Rpb24uIikpCi0JCQkJUHlFcnJfV3JpdGVVbnJhaXNhYmxlKGNhbGxhYmxlKTsKLQkJfQotCX0KLQlQeV9YREVDUkVGKHJlc3VsdCk7CisgICAgICAgICAgIElmIHRoZXJlIGlzIHN1Y2ggYW4gb2JqZWN0LCB3ZSBoYXZlIG5vIGNob2ljZSB0aGFuIHRvIGtlZXAKKyAgICAgICAgICAgaXQgYWxpdmUgZm9yZXZlciAtIGJ1dCBhIHJlZmNvdW50IGFuZC9vciBtZW1vcnkgbGVhayB3aWxsCisgICAgICAgICAgIGJlIHRoZSByZXN1bHQuICBFWENFUFQgd2hlbiByZXN0eXBlIGlzIHB5X29iamVjdCAtIFB5dGhvbgorICAgICAgICAgICBpdHNlbGYga25vd3MgaG93IHRvIG1hbmFnZSB0aGUgcmVmY291bnQgb2YgdGhlc2Ugb2JqZWN0cy4KKyAgICAgICAgKi8KKyAgICAgICAgaWYgKGtlZXAgPT0gTlVMTCkgLyogQ291bGQgbm90IGNvbnZlcnQgY2FsbGJhY2sgcmVzdWx0LiAqLworICAgICAgICAgICAgUHlFcnJfV3JpdGVVbnJhaXNhYmxlKGNhbGxhYmxlKTsKKyAgICAgICAgZWxzZSBpZiAoa2VlcCA9PSBQeV9Ob25lKSAvKiBOb3RoaW5nIHRvIGtlZXAgKi8KKyAgICAgICAgICAgIFB5X0RFQ1JFRihrZWVwKTsKKyAgICAgICAgZWxzZSBpZiAoc2V0ZnVuYyAhPSBnZXRlbnRyeSgiTyIpLT5zZXRmdW5jKSB7CisgICAgICAgICAgICBpZiAoLTEgPT0gUHlFcnJfV2FybihQeUV4Y19SdW50aW1lV2FybmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZW1vcnkgbGVhayBpbiBjYWxsYmFjayBmdW5jdGlvbi4iKSkKKyAgICAgICAgICAgICAgICBQeUVycl9Xcml0ZVVucmFpc2FibGUoY2FsbGFibGUpOworICAgICAgICB9CisgICAgfQorICAgIFB5X1hERUNSRUYocmVzdWx0KTsKICAgRG9uZToKLQlQeV9YREVDUkVGKGFyZ2xpc3QpOworICAgIFB5X1hERUNSRUYoYXJnbGlzdCk7CiAjaWZkZWYgV0lUSF9USFJFQUQKLQlQeUdJTFN0YXRlX1JlbGVhc2Uoc3RhdGUpOworICAgIFB5R0lMU3RhdGVfUmVsZWFzZShzdGF0ZSk7CiAjZW5kaWYKIH0KIAogc3RhdGljIHZvaWQgY2xvc3VyZV9mY24oZmZpX2NpZiAqY2lmLAotCQkJdm9pZCAqcmVzcCwKLQkJCXZvaWQgKiphcmdzLAotCQkJdm9pZCAqdXNlcmRhdGEpCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpyZXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKmFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyZGF0YSkKIHsKLQlDVGh1bmtPYmplY3QgKnAgPSAoQ1RodW5rT2JqZWN0ICopdXNlcmRhdGE7CisgICAgQ1RodW5rT2JqZWN0ICpwID0gKENUaHVua09iamVjdCAqKXVzZXJkYXRhOwogCi0JX0NhbGxQeXRob25PYmplY3QocmVzcCwKLQkJCSAgcC0+ZmZpX3Jlc3R5cGUsCi0JCQkgIHAtPnNldGZ1bmMsCi0JCQkgIHAtPmNhbGxhYmxlLAotCQkJICBwLT5jb252ZXJ0ZXJzLAotCQkJICBwLT5mbGFncywKLQkJCSAgYXJncyk7CisgICAgX0NhbGxQeXRob25PYmplY3QocmVzcCwKKyAgICAgICAgICAgICAgICAgICAgICBwLT5mZmlfcmVzdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICBwLT5zZXRmdW5jLAorICAgICAgICAgICAgICAgICAgICAgIHAtPmNhbGxhYmxlLAorICAgICAgICAgICAgICAgICAgICAgIHAtPmNvbnZlcnRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgcC0+ZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgYXJncyk7CiB9CiAKIHN0YXRpYyBDVGh1bmtPYmplY3QqIENUaHVua09iamVjdF9uZXcoUHlfc3NpemVfdCBuQXJncykKIHsKLQlDVGh1bmtPYmplY3QgKnA7Ci0JaW50IGk7CisgICAgQ1RodW5rT2JqZWN0ICpwOworICAgIGludCBpOwogCi0JcCA9IFB5T2JqZWN0X0dDX05ld1ZhcihDVGh1bmtPYmplY3QsICZDVGh1bmtfVHlwZSwgbkFyZ3MpOwotCWlmIChwID09IE5VTEwpIHsKLQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIHAgPSBQeU9iamVjdF9HQ19OZXdWYXIoQ1RodW5rT2JqZWN0LCAmQ1RodW5rX1R5cGUsIG5BcmdzKTsKKyAgICBpZiAocCA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXAtPnBjbCA9IE5VTEw7Ci0JbWVtc2V0KCZwLT5jaWYsIDAsIHNpemVvZihwLT5jaWYpKTsKLQlwLT5jb252ZXJ0ZXJzID0gTlVMTDsKLQlwLT5jYWxsYWJsZSA9IE5VTEw7Ci0JcC0+c2V0ZnVuYyA9IE5VTEw7Ci0JcC0+ZmZpX3Jlc3R5cGUgPSBOVUxMOwotCQotCWZvciAoaSA9IDA7IGkgPCBuQXJncyArIDE7ICsraSkKLQkJcC0+YXR5cGVzW2ldID0gTlVMTDsKLQlQeU9iamVjdF9HQ19UcmFjaygoUHlPYmplY3QgKilwKTsKLQlyZXR1cm4gcDsKKyAgICBwLT5wY2wgPSBOVUxMOworICAgIG1lbXNldCgmcC0+Y2lmLCAwLCBzaXplb2YocC0+Y2lmKSk7CisgICAgcC0+Y29udmVydGVycyA9IE5VTEw7CisgICAgcC0+Y2FsbGFibGUgPSBOVUxMOworICAgIHAtPnNldGZ1bmMgPSBOVUxMOworICAgIHAtPmZmaV9yZXN0eXBlID0gTlVMTDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBuQXJncyArIDE7ICsraSkKKyAgICAgICAgcC0+YXR5cGVzW2ldID0gTlVMTDsKKyAgICBQeU9iamVjdF9HQ19UcmFjaygoUHlPYmplY3QgKilwKTsKKyAgICByZXR1cm4gcDsKIH0KIAogQ1RodW5rT2JqZWN0ICpBbGxvY0Z1bmN0aW9uQ2FsbGJhY2soUHlPYmplY3QgKmNhbGxhYmxlLAotCQkJCSAgICBQeU9iamVjdCAqY29udmVydGVycywKLQkJCQkgICAgUHlPYmplY3QgKnJlc3R5cGUsCi0JCQkJICAgIGludCBmbGFncykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpjb252ZXJ0ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKnJlc3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MpCiB7Ci0JaW50IHJlc3VsdDsKLQlDVGh1bmtPYmplY3QgKnA7Ci0JUHlfc3NpemVfdCBuQXJncywgaTsKLQlmZmlfYWJpIGNjOworICAgIGludCByZXN1bHQ7CisgICAgQ1RodW5rT2JqZWN0ICpwOworICAgIFB5X3NzaXplX3QgbkFyZ3MsIGk7CisgICAgZmZpX2FiaSBjYzsKIAotCW5BcmdzID0gUHlTZXF1ZW5jZV9TaXplKGNvbnZlcnRlcnMpOwotCXAgPSBDVGh1bmtPYmplY3RfbmV3KG5BcmdzKTsKLQlpZiAocCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBuQXJncyA9IFB5U2VxdWVuY2VfU2l6ZShjb252ZXJ0ZXJzKTsKKyAgICBwID0gQ1RodW5rT2JqZWN0X25ldyhuQXJncyk7CisgICAgaWYgKHAgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlhc3NlcnQoQ1RodW5rX0NoZWNrRXhhY3QocCkpOworICAgIGFzc2VydChDVGh1bmtfQ2hlY2tFeGFjdChwKSk7CiAKLQlwLT5wY2wgPSBNYWxsb2NDbG9zdXJlKCk7Ci0JaWYgKHAtPnBjbCA9PSBOVUxMKSB7Ci0JCVB5RXJyX05vTWVtb3J5KCk7Ci0JCWdvdG8gZXJyb3I7Ci0JfQorICAgIHAtPnBjbCA9IE1hbGxvY0Nsb3N1cmUoKTsKKyAgICBpZiAocC0+cGNsID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CiAKLQlwLT5mbGFncyA9IGZsYWdzOwotCWZvciAoaSA9IDA7IGkgPCBuQXJnczsgKytpKSB7Ci0JCVB5T2JqZWN0ICpjbnYgPSBQeVNlcXVlbmNlX0dldEl0ZW0oY29udmVydGVycywgaSk7Ci0JCWlmIChjbnYgPT0gTlVMTCkKLQkJCWdvdG8gZXJyb3I7Ci0JCXAtPmF0eXBlc1tpXSA9IEdldFR5cGUoY252KTsKLQkJUHlfREVDUkVGKGNudik7Ci0JfQotCXAtPmF0eXBlc1tpXSA9IE5VTEw7CisgICAgcC0+ZmxhZ3MgPSBmbGFnczsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbkFyZ3M7ICsraSkgeworICAgICAgICBQeU9iamVjdCAqY252ID0gUHlTZXF1ZW5jZV9HZXRJdGVtKGNvbnZlcnRlcnMsIGkpOworICAgICAgICBpZiAoY252ID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICBwLT5hdHlwZXNbaV0gPSBHZXRUeXBlKGNudik7CisgICAgICAgIFB5X0RFQ1JFRihjbnYpOworICAgIH0KKyAgICBwLT5hdHlwZXNbaV0gPSBOVUxMOwogCi0JUHlfSU5DUkVGKHJlc3R5cGUpOwotCXAtPnJlc3R5cGUgPSByZXN0eXBlOwotCWlmIChyZXN0eXBlID09IFB5X05vbmUpIHsKLQkJcC0+c2V0ZnVuYyA9IE5VTEw7Ci0JCXAtPmZmaV9yZXN0eXBlID0gJmZmaV90eXBlX3ZvaWQ7Ci0JfSBlbHNlIHsKLQkJU3RnRGljdE9iamVjdCAqZGljdCA9IFB5VHlwZV9zdGdkaWN0KHJlc3R5cGUpOwotCQlpZiAoZGljdCA9PSBOVUxMIHx8IGRpY3QtPnNldGZ1bmMgPT0gTlVMTCkgewotCQkgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJICAiaW52YWxpZCByZXN1bHQgdHlwZSBmb3IgY2FsbGJhY2sgZnVuY3Rpb24iKTsKLQkJICBnb3RvIGVycm9yOwotCQl9Ci0JCXAtPnNldGZ1bmMgPSBkaWN0LT5zZXRmdW5jOwotCQlwLT5mZmlfcmVzdHlwZSA9ICZkaWN0LT5mZmlfdHlwZV9wb2ludGVyOwotCX0KKyAgICBQeV9JTkNSRUYocmVzdHlwZSk7CisgICAgcC0+cmVzdHlwZSA9IHJlc3R5cGU7CisgICAgaWYgKHJlc3R5cGUgPT0gUHlfTm9uZSkgeworICAgICAgICBwLT5zZXRmdW5jID0gTlVMTDsKKyAgICAgICAgcC0+ZmZpX3Jlc3R5cGUgPSAmZmZpX3R5cGVfdm9pZDsKKyAgICB9IGVsc2UgeworICAgICAgICBTdGdEaWN0T2JqZWN0ICpkaWN0ID0gUHlUeXBlX3N0Z2RpY3QocmVzdHlwZSk7CisgICAgICAgIGlmIChkaWN0ID09IE5VTEwgfHwgZGljdC0+c2V0ZnVuYyA9PSBOVUxMKSB7CisgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImludmFsaWQgcmVzdWx0IHR5cGUgZm9yIGNhbGxiYWNrIGZ1bmN0aW9uIik7CisgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgICAgICBwLT5zZXRmdW5jID0gZGljdC0+c2V0ZnVuYzsKKyAgICAgICAgcC0+ZmZpX3Jlc3R5cGUgPSAmZGljdC0+ZmZpX3R5cGVfcG9pbnRlcjsKKyAgICB9CiAKLQljYyA9IEZGSV9ERUZBVUxUX0FCSTsKKyAgICBjYyA9IEZGSV9ERUZBVUxUX0FCSTsKICNpZiBkZWZpbmVkKE1TX1dJTjMyKSAmJiAhZGVmaW5lZChfV0lOMzJfV0NFKSAmJiAhZGVmaW5lZChNU19XSU42NCkKLQlpZiAoKGZsYWdzICYgRlVOQ0ZMQUdfQ0RFQ0wpID09IDApCi0JCWNjID0gRkZJX1NURENBTEw7CisgICAgaWYgKChmbGFncyAmIEZVTkNGTEFHX0NERUNMKSA9PSAwKQorICAgICAgICBjYyA9IEZGSV9TVERDQUxMOwogI2VuZGlmCi0JcmVzdWx0ID0gZmZpX3ByZXBfY2lmKCZwLT5jaWYsIGNjLAotCQkJICAgICAgUHlfU0FGRV9ET1dOQ0FTVChuQXJncywgUHlfc3NpemVfdCwgaW50KSwKLQkJCSAgICAgIEdldFR5cGUocmVzdHlwZSksCi0JCQkgICAgICAmcC0+YXR5cGVzWzBdKTsKLQlpZiAocmVzdWx0ICE9IEZGSV9PSykgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfUnVudGltZUVycm9yLAotCQkJICAgICAiZmZpX3ByZXBfY2lmIGZhaWxlZCB3aXRoICVkIiwgcmVzdWx0KTsKLQkJZ290byBlcnJvcjsKLQl9Ci0JcmVzdWx0ID0gZmZpX3ByZXBfY2xvc3VyZShwLT5wY2wsICZwLT5jaWYsIGNsb3N1cmVfZmNuLCBwKTsKLQlpZiAocmVzdWx0ICE9IEZGSV9PSykgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfUnVudGltZUVycm9yLAotCQkJICAgICAiZmZpX3ByZXBfY2xvc3VyZSBmYWlsZWQgd2l0aCAlZCIsIHJlc3VsdCk7Ci0JCWdvdG8gZXJyb3I7Ci0JfQorICAgIHJlc3VsdCA9IGZmaV9wcmVwX2NpZigmcC0+Y2lmLCBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfU0FGRV9ET1dOQ0FTVChuQXJncywgUHlfc3NpemVfdCwgaW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0VHlwZShyZXN0eXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnAtPmF0eXBlc1swXSk7CisgICAgaWYgKHJlc3VsdCAhPSBGRklfT0spIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1J1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJmZmlfcHJlcF9jaWYgZmFpbGVkIHdpdGggJWQiLCByZXN1bHQpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgICByZXN1bHQgPSBmZmlfcHJlcF9jbG9zdXJlKHAtPnBjbCwgJnAtPmNpZiwgY2xvc3VyZV9mY24sIHApOworICAgIGlmIChyZXN1bHQgIT0gRkZJX09LKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiZmZpX3ByZXBfY2xvc3VyZSBmYWlsZWQgd2l0aCAlZCIsIHJlc3VsdCk7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQogCi0JUHlfSU5DUkVGKGNvbnZlcnRlcnMpOwotCXAtPmNvbnZlcnRlcnMgPSBjb252ZXJ0ZXJzOwotCVB5X0lOQ1JFRihjYWxsYWJsZSk7Ci0JcC0+Y2FsbGFibGUgPSBjYWxsYWJsZTsKLQlyZXR1cm4gcDsKKyAgICBQeV9JTkNSRUYoY29udmVydGVycyk7CisgICAgcC0+Y29udmVydGVycyA9IGNvbnZlcnRlcnM7CisgICAgUHlfSU5DUkVGKGNhbGxhYmxlKTsKKyAgICBwLT5jYWxsYWJsZSA9IGNhbGxhYmxlOworICAgIHJldHVybiBwOwogCiAgIGVycm9yOgotCVB5X1hERUNSRUYocCk7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlfWERFQ1JFRihwKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogI2lmZGVmIE1TX1dJTjMyCiAKIHN0YXRpYyB2b2lkIExvYWRQeXRob24odm9pZCkKIHsKLQlpZiAoIVB5X0lzSW5pdGlhbGl6ZWQoKSkgeworICAgIGlmICghUHlfSXNJbml0aWFsaXplZCgpKSB7CiAjaWZkZWYgV0lUSF9USFJFQUQKLQkJUHlFdmFsX0luaXRUaHJlYWRzKCk7CisgICAgICAgIFB5RXZhbF9Jbml0VGhyZWFkcygpOwogI2VuZGlmCi0JCVB5X0luaXRpYWxpemUoKTsKLQl9CisgICAgICAgIFB5X0luaXRpYWxpemUoKTsKKyAgICB9CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGxvbmcgQ2FsbF9HZXRDbGFzc09iamVjdChSRUZDTFNJRCByY2xzaWQsIFJFRklJRCByaWlkLCBMUFZPSUQgKnBwdikKIHsKLQlQeU9iamVjdCAqbW9kLCAqZnVuYywgKnJlc3VsdDsKLQlsb25nIHJldHZhbDsKLQlzdGF0aWMgUHlPYmplY3QgKmNvbnRleHQ7CisgICAgUHlPYmplY3QgKm1vZCwgKmZ1bmMsICpyZXN1bHQ7CisgICAgbG9uZyByZXR2YWw7CisgICAgc3RhdGljIFB5T2JqZWN0ICpjb250ZXh0OwogCi0JaWYgKGNvbnRleHQgPT0gTlVMTCkKLQkJY29udGV4dCA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9jdHlwZXMuRGxsR2V0Q2xhc3NPYmplY3QiKTsKKyAgICBpZiAoY29udGV4dCA9PSBOVUxMKQorICAgICAgICBjb250ZXh0ID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX2N0eXBlcy5EbGxHZXRDbGFzc09iamVjdCIpOwogCi0JbW9kID0gUHlJbXBvcnRfSW1wb3J0TW9kdWxlTm9CbG9jaygiY3R5cGVzIik7Ci0JaWYgKCFtb2QpIHsKLQkJUHlFcnJfV3JpdGVVbnJhaXNhYmxlKGNvbnRleHQgPyBjb250ZXh0IDogUHlfTm9uZSk7Ci0JCS8qIFRoZXJlIGhhcyBiZWVuIGEgd2FybmluZyBiZWZvcmUgYWJvdXQgdGhpcyBhbHJlYWR5ICovCi0JCXJldHVybiBFX0ZBSUw7Ci0JfQorICAgIG1vZCA9IFB5SW1wb3J0X0ltcG9ydE1vZHVsZU5vQmxvY2soImN0eXBlcyIpOworICAgIGlmICghbW9kKSB7CisgICAgICAgIFB5RXJyX1dyaXRlVW5yYWlzYWJsZShjb250ZXh0ID8gY29udGV4dCA6IFB5X05vbmUpOworICAgICAgICAvKiBUaGVyZSBoYXMgYmVlbiBhIHdhcm5pbmcgYmVmb3JlIGFib3V0IHRoaXMgYWxyZWFkeSAqLworICAgICAgICByZXR1cm4gRV9GQUlMOworICAgIH0KIAotCWZ1bmMgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKG1vZCwgIkRsbEdldENsYXNzT2JqZWN0Iik7Ci0JUHlfREVDUkVGKG1vZCk7Ci0JaWYgKCFmdW5jKSB7Ci0JCVB5RXJyX1dyaXRlVW5yYWlzYWJsZShjb250ZXh0ID8gY29udGV4dCA6IFB5X05vbmUpOwotCQlyZXR1cm4gRV9GQUlMOwotCX0KKyAgICBmdW5jID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhtb2QsICJEbGxHZXRDbGFzc09iamVjdCIpOworICAgIFB5X0RFQ1JFRihtb2QpOworICAgIGlmICghZnVuYykgeworICAgICAgICBQeUVycl9Xcml0ZVVucmFpc2FibGUoY29udGV4dCA/IGNvbnRleHQgOiBQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIEVfRkFJTDsKKyAgICB9CiAKLQl7Ci0JCVB5T2JqZWN0ICpweV9yY2xzaWQgPSBQeUxvbmdfRnJvbVZvaWRQdHIoKHZvaWQgKilyY2xzaWQpOwotCQlQeU9iamVjdCAqcHlfcmlpZCA9IFB5TG9uZ19Gcm9tVm9pZFB0cigodm9pZCAqKXJpaWQpOwotCQlQeU9iamVjdCAqcHlfcHB2ID0gUHlMb25nX0Zyb21Wb2lkUHRyKHBwdik7Ci0JCWlmICghcHlfcmNsc2lkIHx8ICFweV9yaWlkIHx8ICFweV9wcHYpIHsKLQkJCVB5X1hERUNSRUYocHlfcmNsc2lkKTsKLQkJCVB5X1hERUNSRUYocHlfcmlpZCk7Ci0JCQlQeV9YREVDUkVGKHB5X3Bwdik7Ci0JCQlQeV9ERUNSRUYoZnVuYyk7Ci0JCQlQeUVycl9Xcml0ZVVucmFpc2FibGUoY29udGV4dCA/IGNvbnRleHQgOiBQeV9Ob25lKTsKLQkJCXJldHVybiBFX0ZBSUw7Ci0JCX0KLQkJcmVzdWx0ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhmdW5jLAotCQkJCQkJICAgICAgcHlfcmNsc2lkLAotCQkJCQkJICAgICAgcHlfcmlpZCwKLQkJCQkJCSAgICAgIHB5X3BwdiwKLQkJCQkJCSAgICAgIE5VTEwpOwotCQlQeV9ERUNSRUYocHlfcmNsc2lkKTsKLQkJUHlfREVDUkVGKHB5X3JpaWQpOwotCQlQeV9ERUNSRUYocHlfcHB2KTsKLQl9Ci0JUHlfREVDUkVGKGZ1bmMpOwotCWlmICghcmVzdWx0KSB7Ci0JCVB5RXJyX1dyaXRlVW5yYWlzYWJsZShjb250ZXh0ID8gY29udGV4dCA6IFB5X05vbmUpOwotCQlyZXR1cm4gRV9GQUlMOwotCX0KKyAgICB7CisgICAgICAgIFB5T2JqZWN0ICpweV9yY2xzaWQgPSBQeUxvbmdfRnJvbVZvaWRQdHIoKHZvaWQgKilyY2xzaWQpOworICAgICAgICBQeU9iamVjdCAqcHlfcmlpZCA9IFB5TG9uZ19Gcm9tVm9pZFB0cigodm9pZCAqKXJpaWQpOworICAgICAgICBQeU9iamVjdCAqcHlfcHB2ID0gUHlMb25nX0Zyb21Wb2lkUHRyKHBwdik7CisgICAgICAgIGlmICghcHlfcmNsc2lkIHx8ICFweV9yaWlkIHx8ICFweV9wcHYpIHsKKyAgICAgICAgICAgIFB5X1hERUNSRUYocHlfcmNsc2lkKTsKKyAgICAgICAgICAgIFB5X1hERUNSRUYocHlfcmlpZCk7CisgICAgICAgICAgICBQeV9YREVDUkVGKHB5X3Bwdik7CisgICAgICAgICAgICBQeV9ERUNSRUYoZnVuYyk7CisgICAgICAgICAgICBQeUVycl9Xcml0ZVVucmFpc2FibGUoY29udGV4dCA/IGNvbnRleHQgOiBQeV9Ob25lKTsKKyAgICAgICAgICAgIHJldHVybiBFX0ZBSUw7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhmdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB5X3JjbHNpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBweV9yaWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB5X3BwdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgUHlfREVDUkVGKHB5X3JjbHNpZCk7CisgICAgICAgIFB5X0RFQ1JFRihweV9yaWlkKTsKKyAgICAgICAgUHlfREVDUkVGKHB5X3Bwdik7CisgICAgfQorICAgIFB5X0RFQ1JFRihmdW5jKTsKKyAgICBpZiAoIXJlc3VsdCkgeworICAgICAgICBQeUVycl9Xcml0ZVVucmFpc2FibGUoY29udGV4dCA/IGNvbnRleHQgOiBQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIEVfRkFJTDsKKyAgICB9CiAKLQlyZXR2YWwgPSBQeUludF9Bc0xvbmcocmVzdWx0KTsKLQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkgewotCQlQeUVycl9Xcml0ZVVucmFpc2FibGUoY29udGV4dCA/IGNvbnRleHQgOiBQeV9Ob25lKTsKLQkJcmV0dmFsID0gRV9GQUlMOwotCX0KLQlQeV9ERUNSRUYocmVzdWx0KTsKLQlyZXR1cm4gcmV0dmFsOworICAgIHJldHZhbCA9IFB5SW50X0FzTG9uZyhyZXN1bHQpOworICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgIFB5RXJyX1dyaXRlVW5yYWlzYWJsZShjb250ZXh0ID8gY29udGV4dCA6IFB5X05vbmUpOworICAgICAgICByZXR2YWwgPSBFX0ZBSUw7CisgICAgfQorICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgIHJldHVybiByZXR2YWw7CiB9CiAKIFNUREFQSSBEbGxHZXRDbGFzc09iamVjdChSRUZDTFNJRCByY2xzaWQsCi0JCQkgUkVGSUlEIHJpaWQsCi0JCQkgTFBWT0lEICpwcHYpCisgICAgICAgICAgICAgICAgICAgICAgICAgUkVGSUlEIHJpaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgTFBWT0lEICpwcHYpCiB7Ci0JbG9uZyByZXN1bHQ7CisgICAgbG9uZyByZXN1bHQ7CiAjaWZkZWYgV0lUSF9USFJFQUQKLQlQeUdJTFN0YXRlX1NUQVRFIHN0YXRlOworICAgIFB5R0lMU3RhdGVfU1RBVEUgc3RhdGU7CiAjZW5kaWYKIAotCUxvYWRQeXRob24oKTsKKyAgICBMb2FkUHl0aG9uKCk7CiAjaWZkZWYgV0lUSF9USFJFQUQKLQlzdGF0ZSA9IFB5R0lMU3RhdGVfRW5zdXJlKCk7CisgICAgc3RhdGUgPSBQeUdJTFN0YXRlX0Vuc3VyZSgpOwogI2VuZGlmCi0JcmVzdWx0ID0gQ2FsbF9HZXRDbGFzc09iamVjdChyY2xzaWQsIHJpaWQsIHBwdik7CisgICAgcmVzdWx0ID0gQ2FsbF9HZXRDbGFzc09iamVjdChyY2xzaWQsIHJpaWQsIHBwdik7CiAjaWZkZWYgV0lUSF9USFJFQUQKLQlQeUdJTFN0YXRlX1JlbGVhc2Uoc3RhdGUpOworICAgIFB5R0lMU3RhdGVfUmVsZWFzZShzdGF0ZSk7CiAjZW5kaWYKLQlyZXR1cm4gcmVzdWx0OworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIGxvbmcgQ2FsbF9DYW5VbmxvYWROb3codm9pZCkKIHsKLQlQeU9iamVjdCAqbW9kLCAqZnVuYywgKnJlc3VsdDsKLQlsb25nIHJldHZhbDsKLQlzdGF0aWMgUHlPYmplY3QgKmNvbnRleHQ7CisgICAgUHlPYmplY3QgKm1vZCwgKmZ1bmMsICpyZXN1bHQ7CisgICAgbG9uZyByZXR2YWw7CisgICAgc3RhdGljIFB5T2JqZWN0ICpjb250ZXh0OwogCi0JaWYgKGNvbnRleHQgPT0gTlVMTCkKLQkJY29udGV4dCA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9jdHlwZXMuRGxsQ2FuVW5sb2FkTm93Iik7CisgICAgaWYgKGNvbnRleHQgPT0gTlVMTCkKKyAgICAgICAgY29udGV4dCA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9jdHlwZXMuRGxsQ2FuVW5sb2FkTm93Iik7CiAKLQltb2QgPSBQeUltcG9ydF9JbXBvcnRNb2R1bGVOb0Jsb2NrKCJjdHlwZXMiKTsKLQlpZiAoIW1vZCkgewotLyoJCU91dHB1dERlYnVnU3RyaW5nKCJDb3VsZCBub3QgaW1wb3J0IGN0eXBlcyIpOyAqLwotCQkvKiBXZSBhc3N1bWUgdGhhdCB0aGlzIGVycm9yIGNhbiBvbmx5IG9jY3VyIHdoZW4gc2h1dHRpbmcKLQkJICAgZG93biwgc28gd2Ugc2lsZW50bHkgaWdub3JlIGl0ICovCi0JCVB5RXJyX0NsZWFyKCk7Ci0JCXJldHVybiBFX0ZBSUw7Ci0JfQotCS8qIE90aGVyIGVycm9ycyBjYW5ub3QgYmUgcmFpc2VkLCBidXQgYXJlIHByaW50ZWQgdG8gc3RkZXJyICovCi0JZnVuYyA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcobW9kLCAiRGxsQ2FuVW5sb2FkTm93Iik7Ci0JUHlfREVDUkVGKG1vZCk7Ci0JaWYgKCFmdW5jKSB7Ci0JCVB5RXJyX1dyaXRlVW5yYWlzYWJsZShjb250ZXh0ID8gY29udGV4dCA6IFB5X05vbmUpOwotCQlyZXR1cm4gRV9GQUlMOwotCX0KKyAgICBtb2QgPSBQeUltcG9ydF9JbXBvcnRNb2R1bGVOb0Jsb2NrKCJjdHlwZXMiKTsKKyAgICBpZiAoIW1vZCkgeworLyogICAgICAgICAgICAgIE91dHB1dERlYnVnU3RyaW5nKCJDb3VsZCBub3QgaW1wb3J0IGN0eXBlcyIpOyAqLworICAgICAgICAvKiBXZSBhc3N1bWUgdGhhdCB0aGlzIGVycm9yIGNhbiBvbmx5IG9jY3VyIHdoZW4gc2h1dHRpbmcKKyAgICAgICAgICAgZG93biwgc28gd2Ugc2lsZW50bHkgaWdub3JlIGl0ICovCisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIHJldHVybiBFX0ZBSUw7CisgICAgfQorICAgIC8qIE90aGVyIGVycm9ycyBjYW5ub3QgYmUgcmFpc2VkLCBidXQgYXJlIHByaW50ZWQgdG8gc3RkZXJyICovCisgICAgZnVuYyA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcobW9kLCAiRGxsQ2FuVW5sb2FkTm93Iik7CisgICAgUHlfREVDUkVGKG1vZCk7CisgICAgaWYgKCFmdW5jKSB7CisgICAgICAgIFB5RXJyX1dyaXRlVW5yYWlzYWJsZShjb250ZXh0ID8gY29udGV4dCA6IFB5X05vbmUpOworICAgICAgICByZXR1cm4gRV9GQUlMOworICAgIH0KIAotCXJlc3VsdCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihmdW5jLCBOVUxMKTsKLQlQeV9ERUNSRUYoZnVuYyk7Ci0JaWYgKCFyZXN1bHQpIHsKLQkJUHlFcnJfV3JpdGVVbnJhaXNhYmxlKGNvbnRleHQgPyBjb250ZXh0IDogUHlfTm9uZSk7Ci0JCXJldHVybiBFX0ZBSUw7Ci0JfQorICAgIHJlc3VsdCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihmdW5jLCBOVUxMKTsKKyAgICBQeV9ERUNSRUYoZnVuYyk7CisgICAgaWYgKCFyZXN1bHQpIHsKKyAgICAgICAgUHlFcnJfV3JpdGVVbnJhaXNhYmxlKGNvbnRleHQgPyBjb250ZXh0IDogUHlfTm9uZSk7CisgICAgICAgIHJldHVybiBFX0ZBSUw7CisgICAgfQogCi0JcmV0dmFsID0gUHlJbnRfQXNMb25nKHJlc3VsdCk7Ci0JaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKLQkJUHlFcnJfV3JpdGVVbnJhaXNhYmxlKGNvbnRleHQgPyBjb250ZXh0IDogUHlfTm9uZSk7Ci0JCXJldHZhbCA9IEVfRkFJTDsKLQl9Ci0JUHlfREVDUkVGKHJlc3VsdCk7Ci0JcmV0dXJuIHJldHZhbDsKKyAgICByZXR2YWwgPSBQeUludF9Bc0xvbmcocmVzdWx0KTsKKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICBQeUVycl9Xcml0ZVVucmFpc2FibGUoY29udGV4dCA/IGNvbnRleHQgOiBQeV9Ob25lKTsKKyAgICAgICAgcmV0dmFsID0gRV9GQUlMOworICAgIH0KKyAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICByZXR1cm4gcmV0dmFsOwogfQogCiAvKgpAQCAtNjA3LDI2ICs2MDcsMjYgQEAKIAogU1REQVBJIERsbENhblVubG9hZE5vdyh2b2lkKQogewotCWxvbmcgcmVzdWx0OworICAgIGxvbmcgcmVzdWx0OwogI2lmZGVmIFdJVEhfVEhSRUFECi0JUHlHSUxTdGF0ZV9TVEFURSBzdGF0ZSA9IFB5R0lMU3RhdGVfRW5zdXJlKCk7CisgICAgUHlHSUxTdGF0ZV9TVEFURSBzdGF0ZSA9IFB5R0lMU3RhdGVfRW5zdXJlKCk7CiAjZW5kaWYKLQlyZXN1bHQgPSBDYWxsX0NhblVubG9hZE5vdygpOworICAgIHJlc3VsdCA9IENhbGxfQ2FuVW5sb2FkTm93KCk7CiAjaWZkZWYgV0lUSF9USFJFQUQKLQlQeUdJTFN0YXRlX1JlbGVhc2Uoc3RhdGUpOworICAgIFB5R0lMU3RhdGVfUmVsZWFzZShzdGF0ZSk7CiAjZW5kaWYKLQlyZXR1cm4gcmVzdWx0OworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKICNpZm5kZWYgUHlfTk9fRU5BQkxFX1NIQVJFRAogQk9PTCBXSU5BUEkgRGxsTWFpbihISU5TVEFOQ0UgaGluc3RETEwsIERXT1JEIGZkd1JlYXNvbiwgTFBWT0lEIGxwdlJlcykKIHsKLQlzd2l0Y2goZmR3UmVhc29uKSB7Ci0JY2FzZSBETExfUFJPQ0VTU19BVFRBQ0g6Ci0JCURpc2FibGVUaHJlYWRMaWJyYXJ5Q2FsbHMoaGluc3RETEwpOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIFRSVUU7CisgICAgc3dpdGNoKGZkd1JlYXNvbikgeworICAgIGNhc2UgRExMX1BST0NFU1NfQVRUQUNIOgorICAgICAgICBEaXNhYmxlVGhyZWFkTGlicmFyeUNhbGxzKGhpbnN0RExMKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBUUlVFOwogfQogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9jYWxscHJvYy5jIGIvTW9kdWxlcy9fY3R5cGVzL2NhbGxwcm9jLmMKaW5kZXggMGM1MWY4NC4uYzg0YjRmMyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2NhbGxwcm9jLmMKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2NhbGxwcm9jLmMKQEAgLTksOSArOSw5IEBACiAgKi8KIC8qCiAgKiBSZWxhdGVkIFdvcms6Ci0gKgktIGNhbGxkbGwJaHR0cDovL3d3dy5uaWdodG1hcmUuY29tL3NvZnR3YXJlLmh0bWwKLSAqCS0gbGliZmZpCWh0dHA6Ly9zb3VyY2V3YXJlLmN5Z251cy5jb20vbGliZmZpLwotICoJLSBmZmNhbGwgCWh0dHA6Ly9jbGlzcC5jb25zLm9yZy9+aGFpYmxlL3BhY2thZ2VzLWZmY2FsbC5odG1sCisgKiAgICAgIC0gY2FsbGRsbCAgICAgICBodHRwOi8vd3d3Lm5pZ2h0bWFyZS5jb20vc29mdHdhcmUuaHRtbAorICogICAgICAtIGxpYmZmaSAgICAgICAgaHR0cDovL3NvdXJjZXdhcmUuY3lnbnVzLmNvbS9saWJmZmkvCisgKiAgICAgIC0gZmZjYWxsICAgICAgICBodHRwOi8vY2xpc3AuY29ucy5vcmcvfmhhaWJsZS9wYWNrYWdlcy1mZmNhbGwuaHRtbAogICogICBhbmQsIG9mIGNvdXJzZSwgRG9uIEJlYXVkcnkncyBNRVNTIHBhY2thZ2UsIGJ1dCB0aGlzIGlzIG1vcmUgY3R5cGVzCiAgKiAgIHJlbGF0ZWQuCiAgKi8KQEAgLTg3LDcgKzg3LDcgQEAKICAgY3R5cGVzIG1haW50YWlucyB0aHJlYWQtbG9jYWwgc3RvcmFnZSB0aGF0IGhhcyBzcGFjZSBmb3IgdHdvIGVycm9yIG51bWJlcnM6CiAgIHByaXZhdGUgY29waWVzIG9mIHRoZSBzeXN0ZW0gJ2Vycm5vJyB2YWx1ZSBhbmQsIG9uIFdpbmRvd3MsIHRoZSBzeXN0ZW0gZXJyb3IgY29kZQogICBhY2Nlc3NlZCBieSB0aGUgR2V0TGFzdEVycm9yKCkgYW5kIFNldExhc3RFcnJvcigpIGFwaSBmdW5jdGlvbnMuCi0gIAorCiAgIEZvcmVpZ24gZnVuY3Rpb25zIGNyZWF0ZWQgd2l0aCBDRExMKC4uLiwgdXNlX2Vycm5vPVRydWUpLCB3aGVuIGNhbGxlZCwgc3dhcAogICB0aGUgc3lzdGVtICdlcnJubycgdmFsdWUgd2l0aCB0aGUgcHJpdmF0ZSBjb3B5IGp1c3QgYmVmb3JlIHRoZSBhY3R1YWwKICAgZnVuY3Rpb24gY2FsbCwgYW5kIHN3YXBwZWQgYWdhaW4gaW1tZWRpYXRlbHkgYWZ0ZXJ3YXJkcy4gIFRoZSAndXNlX2Vycm5vJwpAQCAtMTIwLDgyICsxMjAsODIgQEAKIFB5T2JqZWN0ICoKIGdldF9lcnJvcl9vYmplY3QoaW50ICoqcHNwYWNlKQogewotCVB5T2JqZWN0ICpkaWN0ID0gUHlUaHJlYWRTdGF0ZV9HZXREaWN0KCk7Ci0JUHlPYmplY3QgKmVycm9iajsKLQlzdGF0aWMgUHlPYmplY3QgKmVycm9yX29iamVjdF9uYW1lOwotCWlmIChkaWN0ID09IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKLQkJCQkiY2Fubm90IGdldCB0aHJlYWQgc3RhdGUiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChlcnJvcl9vYmplY3RfbmFtZSA9PSBOVUxMKSB7Ci0JCWVycm9yX29iamVjdF9uYW1lID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiY3R5cGVzLmVycm9yX29iamVjdCIpOwotCQlpZiAoZXJyb3Jfb2JqZWN0X25hbWUgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCX0KLQllcnJvYmogPSBQeURpY3RfR2V0SXRlbShkaWN0LCBlcnJvcl9vYmplY3RfbmFtZSk7Ci0JaWYgKGVycm9iaikKLQkJUHlfSU5DUkVGKGVycm9iaik7Ci0JZWxzZSB7Ci0JCXZvaWQgKnNwYWNlID0gUHlNZW1fTWFsbG9jKHNpemVvZihpbnQpICogMik7Ci0JCWlmIChzcGFjZSA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCW1lbXNldChzcGFjZSwgMCwgc2l6ZW9mKGludCkgKiAyKTsKLQkJZXJyb2JqID0gUHlDT2JqZWN0X0Zyb21Wb2lkUHRyKHNwYWNlLCBQeU1lbV9GcmVlKTsKLQkJaWYgKGVycm9iaiA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWlmICgtMSA9PSBQeURpY3RfU2V0SXRlbShkaWN0LCBlcnJvcl9vYmplY3RfbmFtZSwKLQkJCQkJIGVycm9iaikpIHsKLQkJCVB5X0RFQ1JFRihlcnJvYmopOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9Ci0JKnBzcGFjZSA9IChpbnQgKilQeUNPYmplY3RfQXNWb2lkUHRyKGVycm9iaik7Ci0JcmV0dXJuIGVycm9iajsKKyAgICBQeU9iamVjdCAqZGljdCA9IFB5VGhyZWFkU3RhdGVfR2V0RGljdCgpOworICAgIFB5T2JqZWN0ICplcnJvYmo7CisgICAgc3RhdGljIFB5T2JqZWN0ICplcnJvcl9vYmplY3RfbmFtZTsKKyAgICBpZiAoZGljdCA9PSAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiY2Fubm90IGdldCB0aHJlYWQgc3RhdGUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChlcnJvcl9vYmplY3RfbmFtZSA9PSBOVUxMKSB7CisgICAgICAgIGVycm9yX29iamVjdF9uYW1lID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiY3R5cGVzLmVycm9yX29iamVjdCIpOworICAgICAgICBpZiAoZXJyb3Jfb2JqZWN0X25hbWUgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBlcnJvYmogPSBQeURpY3RfR2V0SXRlbShkaWN0LCBlcnJvcl9vYmplY3RfbmFtZSk7CisgICAgaWYgKGVycm9iaikKKyAgICAgICAgUHlfSU5DUkVGKGVycm9iaik7CisgICAgZWxzZSB7CisgICAgICAgIHZvaWQgKnNwYWNlID0gUHlNZW1fTWFsbG9jKHNpemVvZihpbnQpICogMik7CisgICAgICAgIGlmIChzcGFjZSA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIG1lbXNldChzcGFjZSwgMCwgc2l6ZW9mKGludCkgKiAyKTsKKyAgICAgICAgZXJyb2JqID0gUHlDT2JqZWN0X0Zyb21Wb2lkUHRyKHNwYWNlLCBQeU1lbV9GcmVlKTsKKyAgICAgICAgaWYgKGVycm9iaiA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGlmICgtMSA9PSBQeURpY3RfU2V0SXRlbShkaWN0LCBlcnJvcl9vYmplY3RfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9iaikpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihlcnJvYmopOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgKnBzcGFjZSA9IChpbnQgKilQeUNPYmplY3RfQXNWb2lkUHRyKGVycm9iaik7CisgICAgcmV0dXJuIGVycm9iajsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGdldF9lcnJvcl9pbnRlcm5hbChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIGludCBpbmRleCkKIHsKLQlpbnQgKnNwYWNlOwotCVB5T2JqZWN0ICplcnJvYmogPSBnZXRfZXJyb3Jfb2JqZWN0KCZzcGFjZSk7Ci0JUHlPYmplY3QgKnJlc3VsdDsKKyAgICBpbnQgKnNwYWNlOworICAgIFB5T2JqZWN0ICplcnJvYmogPSBnZXRfZXJyb3Jfb2JqZWN0KCZzcGFjZSk7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKIAotCWlmIChlcnJvYmogPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JcmVzdWx0ID0gUHlJbnRfRnJvbUxvbmcoc3BhY2VbaW5kZXhdKTsKLQlQeV9ERUNSRUYoZXJyb2JqKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIGlmIChlcnJvYmogPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmVzdWx0ID0gUHlJbnRfRnJvbUxvbmcoc3BhY2VbaW5kZXhdKTsKKyAgICBQeV9ERUNSRUYoZXJyb2JqKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc2V0X2Vycm9yX2ludGVybmFsKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgaW50IGluZGV4KQogewotCWludCBuZXdfZXJybm8sIG9sZF9lcnJubzsKLQlQeU9iamVjdCAqZXJyb2JqOwotCWludCAqc3BhY2U7CisgICAgaW50IG5ld19lcnJubywgb2xkX2Vycm5vOworICAgIFB5T2JqZWN0ICplcnJvYmo7CisgICAgaW50ICpzcGFjZTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaSIsICZuZXdfZXJybm8pKQotCQlyZXR1cm4gTlVMTDsKLQllcnJvYmogPSBnZXRfZXJyb3Jfb2JqZWN0KCZzcGFjZSk7Ci0JaWYgKGVycm9iaiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlvbGRfZXJybm8gPSBzcGFjZVtpbmRleF07Ci0Jc3BhY2VbaW5kZXhdID0gbmV3X2Vycm5vOwotCVB5X0RFQ1JFRihlcnJvYmopOwotCXJldHVybiBQeUludF9Gcm9tTG9uZyhvbGRfZXJybm8pOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaSIsICZuZXdfZXJybm8pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBlcnJvYmogPSBnZXRfZXJyb3Jfb2JqZWN0KCZzcGFjZSk7CisgICAgaWYgKGVycm9iaiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBvbGRfZXJybm8gPSBzcGFjZVtpbmRleF07CisgICAgc3BhY2VbaW5kZXhdID0gbmV3X2Vycm5vOworICAgIFB5X0RFQ1JFRihlcnJvYmopOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhvbGRfZXJybm8pOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZ2V0X2Vycm5vKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gZ2V0X2Vycm9yX2ludGVybmFsKHNlbGYsIGFyZ3MsIDApOworICAgIHJldHVybiBnZXRfZXJyb3JfaW50ZXJuYWwoc2VsZiwgYXJncywgMCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZXRfZXJybm8oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBzZXRfZXJyb3JfaW50ZXJuYWwoc2VsZiwgYXJncywgMCk7CisgICAgcmV0dXJuIHNldF9lcnJvcl9pbnRlcm5hbChzZWxmLCBhcmdzLCAwKTsKIH0KIAogI2lmZGVmIE1TX1dJTjMyCkBAIC0yMDMsMjA2ICsyMDMsMjA2IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2V0X2xhc3RfZXJyb3IoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBnZXRfZXJyb3JfaW50ZXJuYWwoc2VsZiwgYXJncywgMSk7CisgICAgcmV0dXJuIGdldF9lcnJvcl9pbnRlcm5hbChzZWxmLCBhcmdzLCAxKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNldF9sYXN0X2Vycm9yKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gc2V0X2Vycm9yX2ludGVybmFsKHNlbGYsIGFyZ3MsIDEpOworICAgIHJldHVybiBzZXRfZXJyb3JfaW50ZXJuYWwoc2VsZiwgYXJncywgMSk7CiB9CiAKIFB5T2JqZWN0ICpDb21FcnJvcjsKIAogc3RhdGljIFRDSEFSICpGb3JtYXRFcnJvcihEV09SRCBjb2RlKQogewotCVRDSEFSICpscE1zZ0J1ZjsKLQlEV09SRCBuOwotCW4gPSBGb3JtYXRNZXNzYWdlKEZPUk1BVF9NRVNTQUdFX0FMTE9DQVRFX0JVRkZFUiB8IEZPUk1BVF9NRVNTQUdFX0ZST01fU1lTVEVNLAotCQkJICBOVUxMLAotCQkJICBjb2RlLAotCQkJICBNQUtFTEFOR0lEKExBTkdfTkVVVFJBTCwgU1VCTEFOR19ERUZBVUxUKSwgLyogRGVmYXVsdCBsYW5ndWFnZSAqLwotCQkJICAoTFBUU1RSKSAmbHBNc2dCdWYsCi0JCQkgIDAsCi0JCQkgIE5VTEwpOwotCWlmIChuKSB7Ci0JCXdoaWxlIChfaXN0c3BhY2UobHBNc2dCdWZbbi0xXSkpCi0JCQktLW47Ci0JCWxwTXNnQnVmW25dID0gX1QoJ1wwJyk7IC8qIHJzdHJpcCgpICovCi0JfQotCXJldHVybiBscE1zZ0J1ZjsKKyAgICBUQ0hBUiAqbHBNc2dCdWY7CisgICAgRFdPUkQgbjsKKyAgICBuID0gRm9ybWF0TWVzc2FnZShGT1JNQVRfTUVTU0FHRV9BTExPQ0FURV9CVUZGRVIgfCBGT1JNQVRfTUVTU0FHRV9GUk9NX1NZU1RFTSwKKyAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgIGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgTUFLRUxBTkdJRChMQU5HX05FVVRSQUwsIFNVQkxBTkdfREVGQVVMVCksIC8qIERlZmF1bHQgbGFuZ3VhZ2UgKi8KKyAgICAgICAgICAgICAgKExQVFNUUikgJmxwTXNnQnVmLAorICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICBOVUxMKTsKKyAgICBpZiAobikgeworICAgICAgICB3aGlsZSAoX2lzdHNwYWNlKGxwTXNnQnVmW24tMV0pKQorICAgICAgICAgICAgLS1uOworICAgICAgICBscE1zZ0J1ZltuXSA9IF9UKCdcMCcpOyAvKiByc3RyaXAoKSAqLworICAgIH0KKyAgICByZXR1cm4gbHBNc2dCdWY7CiB9CiAKICNpZm5kZWYgRE9OVF9VU0VfU0VICiB2b2lkIFNldEV4Y2VwdGlvbihEV09SRCBjb2RlLCBFWENFUFRJT05fUkVDT1JEICpwcikKIHsKLQlUQ0hBUiAqbHBNc2dCdWY7Ci0JbHBNc2dCdWYgPSBGb3JtYXRFcnJvcihjb2RlKTsKLQlpZihscE1zZ0J1ZikgewotCQlQeUVycl9TZXRGcm9tV2luZG93c0Vycihjb2RlKTsKLQkJTG9jYWxGcmVlKGxwTXNnQnVmKTsKLQl9IGVsc2UgewotCQlzd2l0Y2ggKGNvZGUpIHsKLQkJY2FzZSBFWENFUFRJT05fQUNDRVNTX1ZJT0xBVElPTjoKLQkJCS8qIFRoZSB0aHJlYWQgYXR0ZW1wdGVkIHRvIHJlYWQgZnJvbSBvciB3cml0ZQotCQkJICAgdG8gYSB2aXJ0dWFsIGFkZHJlc3MgZm9yIHdoaWNoIGl0IGRvZXMgbm90Ci0JCQkgICBoYXZlIHRoZSBhcHByb3ByaWF0ZSBhY2Nlc3MuICovCi0JCQlpZiAocHItPkV4Y2VwdGlvbkluZm9ybWF0aW9uWzBdID09IDApCi0JCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1dpbmRvd3NFcnJvciwKLQkJCQkJICAgICAiZXhjZXB0aW9uOiBhY2Nlc3MgdmlvbGF0aW9uIHJlYWRpbmcgJXAiLAotCQkJCQkgICAgIHByLT5FeGNlcHRpb25JbmZvcm1hdGlvblsxXSk7Ci0JCQllbHNlCi0JCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1dpbmRvd3NFcnJvciwKLQkJCQkJICAgICAiZXhjZXB0aW9uOiBhY2Nlc3MgdmlvbGF0aW9uIHdyaXRpbmcgJXAiLAotCQkJCQkgICAgIHByLT5FeGNlcHRpb25JbmZvcm1hdGlvblsxXSk7Ci0JCQlicmVhazsKLQkJY2FzZSBFWENFUFRJT05fQlJFQUtQT0lOVDoKLQkJCS8qIEEgYnJlYWtwb2ludCB3YXMgZW5jb3VudGVyZWQuICovCi0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfV2luZG93c0Vycm9yLAotCQkJCQkiZXhjZXB0aW9uOiBicmVha3BvaW50IGVuY291bnRlcmVkIik7Ci0JCQlicmVhazsKLQkJCQotCQljYXNlIEVYQ0VQVElPTl9EQVRBVFlQRV9NSVNBTElHTk1FTlQ6Ci0JCQkvKiBUaGUgdGhyZWFkIGF0dGVtcHRlZCB0byByZWFkIG9yIHdyaXRlIGRhdGEgdGhhdCBpcwotCQkJICAgbWlzYWxpZ25lZCBvbiBoYXJkd2FyZSB0aGF0IGRvZXMgbm90IHByb3ZpZGUKLQkJCSAgIGFsaWdubWVudC4gRm9yIGV4YW1wbGUsIDE2LWJpdCB2YWx1ZXMgbXVzdCBiZQotCQkJICAgYWxpZ25lZCBvbiAyLWJ5dGUgYm91bmRhcmllcywgMzItYml0IHZhbHVlcyBvbgotCQkJICAgNC1ieXRlIGJvdW5kYXJpZXMsIGFuZCBzbyBvbi4gKi8KLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19XaW5kb3dzRXJyb3IsCi0JCQkJCSJleGNlcHRpb246IGRhdGF0eXBlIG1pc2FsaWdubWVudCIpOwotCQkJYnJlYWs7CisgICAgVENIQVIgKmxwTXNnQnVmOworICAgIGxwTXNnQnVmID0gRm9ybWF0RXJyb3IoY29kZSk7CisgICAgaWYobHBNc2dCdWYpIHsKKyAgICAgICAgUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnIoY29kZSk7CisgICAgICAgIExvY2FsRnJlZShscE1zZ0J1Zik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3dpdGNoIChjb2RlKSB7CisgICAgICAgIGNhc2UgRVhDRVBUSU9OX0FDQ0VTU19WSU9MQVRJT046CisgICAgICAgICAgICAvKiBUaGUgdGhyZWFkIGF0dGVtcHRlZCB0byByZWFkIGZyb20gb3Igd3JpdGUKKyAgICAgICAgICAgICAgIHRvIGEgdmlydHVhbCBhZGRyZXNzIGZvciB3aGljaCBpdCBkb2VzIG5vdAorICAgICAgICAgICAgICAgaGF2ZSB0aGUgYXBwcm9wcmlhdGUgYWNjZXNzLiAqLworICAgICAgICAgICAgaWYgKHByLT5FeGNlcHRpb25JbmZvcm1hdGlvblswXSA9PSAwKQorICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19XaW5kb3dzRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleGNlcHRpb246IGFjY2VzcyB2aW9sYXRpb24gcmVhZGluZyAlcCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByLT5FeGNlcHRpb25JbmZvcm1hdGlvblsxXSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1dpbmRvd3NFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4Y2VwdGlvbjogYWNjZXNzIHZpb2xhdGlvbiB3cml0aW5nICVwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHItPkV4Y2VwdGlvbkluZm9ybWF0aW9uWzFdKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVYQ0VQVElPTl9CUkVBS1BPSU5UOgorICAgICAgICAgICAgLyogQSBicmVha3BvaW50IHdhcyBlbmNvdW50ZXJlZC4gKi8KKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19XaW5kb3dzRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4Y2VwdGlvbjogYnJlYWtwb2ludCBlbmNvdW50ZXJlZCIpOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBFWENFUFRJT05fU0lOR0xFX1NURVA6Ci0JCQkvKiBBIHRyYWNlIHRyYXAgb3Igb3RoZXIgc2luZ2xlLWluc3RydWN0aW9uIG1lY2hhbmlzbQotCQkJICAgc2lnbmFsZWQgdGhhdCBvbmUgaW5zdHJ1Y3Rpb24gaGFzIGJlZW4gZXhlY3V0ZWQuICovCi0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfV2luZG93c0Vycm9yLAotCQkJCQkiZXhjZXB0aW9uOiBzaW5nbGUgc3RlcCIpOwotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgRVhDRVBUSU9OX0RBVEFUWVBFX01JU0FMSUdOTUVOVDoKKyAgICAgICAgICAgIC8qIFRoZSB0aHJlYWQgYXR0ZW1wdGVkIHRvIHJlYWQgb3Igd3JpdGUgZGF0YSB0aGF0IGlzCisgICAgICAgICAgICAgICBtaXNhbGlnbmVkIG9uIGhhcmR3YXJlIHRoYXQgZG9lcyBub3QgcHJvdmlkZQorICAgICAgICAgICAgICAgYWxpZ25tZW50LiBGb3IgZXhhbXBsZSwgMTYtYml0IHZhbHVlcyBtdXN0IGJlCisgICAgICAgICAgICAgICBhbGlnbmVkIG9uIDItYnl0ZSBib3VuZGFyaWVzLCAzMi1iaXQgdmFsdWVzIG9uCisgICAgICAgICAgICAgICA0LWJ5dGUgYm91bmRhcmllcywgYW5kIHNvIG9uLiAqLworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1dpbmRvd3NFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhjZXB0aW9uOiBkYXRhdHlwZSBtaXNhbGlnbm1lbnQiKTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgRVhDRVBUSU9OX0FSUkFZX0JPVU5EU19FWENFRURFRDogCi0JCQkvKiBUaGUgdGhyZWFkIGF0dGVtcHRlZCB0byBhY2Nlc3MgYW4gYXJyYXkgZWxlbWVudAotCQkJICAgdGhhdCBpcyBvdXQgb2YgYm91bmRzLCBhbmQgdGhlIHVuZGVybHlpbmcgaGFyZHdhcmUKLQkJCSAgIHN1cHBvcnRzIGJvdW5kcyBjaGVja2luZy4gKi8KLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19XaW5kb3dzRXJyb3IsCi0JCQkJCSJleGNlcHRpb246IGFycmF5IGJvdW5kcyBleGNlZWRlZCIpOwotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgRVhDRVBUSU9OX1NJTkdMRV9TVEVQOgorICAgICAgICAgICAgLyogQSB0cmFjZSB0cmFwIG9yIG90aGVyIHNpbmdsZS1pbnN0cnVjdGlvbiBtZWNoYW5pc20KKyAgICAgICAgICAgICAgIHNpZ25hbGVkIHRoYXQgb25lIGluc3RydWN0aW9uIGhhcyBiZWVuIGV4ZWN1dGVkLiAqLworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1dpbmRvd3NFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhjZXB0aW9uOiBzaW5nbGUgc3RlcCIpOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBFWENFUFRJT05fRkxUX0RFTk9STUFMX09QRVJBTkQ6Ci0JCQkvKiBPbmUgb2YgdGhlIG9wZXJhbmRzIGluIGEgZmxvYXRpbmctcG9pbnQgb3BlcmF0aW9uCi0JCQkgICBpcyBkZW5vcm1hbC4gQSBkZW5vcm1hbCB2YWx1ZSBpcyBvbmUgdGhhdCBpcyB0b28KLQkJCSAgIHNtYWxsIHRvIHJlcHJlc2VudCBhcyBhIHN0YW5kYXJkIGZsb2F0aW5nLXBvaW50Ci0JCQkgICB2YWx1ZS4gKi8KLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19XaW5kb3dzRXJyb3IsCi0JCQkJCSJleGNlcHRpb246IGZsb2F0aW5nLXBvaW50IG9wZXJhbmQgZGVub3JtYWwiKTsKLQkJCWJyZWFrOworICAgICAgICBjYXNlIEVYQ0VQVElPTl9BUlJBWV9CT1VORFNfRVhDRUVERUQ6CisgICAgICAgICAgICAvKiBUaGUgdGhyZWFkIGF0dGVtcHRlZCB0byBhY2Nlc3MgYW4gYXJyYXkgZWxlbWVudAorICAgICAgICAgICAgICAgdGhhdCBpcyBvdXQgb2YgYm91bmRzLCBhbmQgdGhlIHVuZGVybHlpbmcgaGFyZHdhcmUKKyAgICAgICAgICAgICAgIHN1cHBvcnRzIGJvdW5kcyBjaGVja2luZy4gKi8KKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19XaW5kb3dzRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4Y2VwdGlvbjogYXJyYXkgYm91bmRzIGV4Y2VlZGVkIik7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIEVYQ0VQVElPTl9GTFRfRElWSURFX0JZX1pFUk86Ci0JCQkvKiBUaGUgdGhyZWFkIGF0dGVtcHRlZCB0byBkaXZpZGUgYSBmbG9hdGluZy1wb2ludAotCQkJICAgdmFsdWUgYnkgYSBmbG9hdGluZy1wb2ludCBkaXZpc29yIG9mIHplcm8uICovCi0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfV2luZG93c0Vycm9yLAotCQkJCQkiZXhjZXB0aW9uOiBmbG9hdCBkaXZpZGUgYnkgemVybyIpOwotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgRVhDRVBUSU9OX0ZMVF9ERU5PUk1BTF9PUEVSQU5EOgorICAgICAgICAgICAgLyogT25lIG9mIHRoZSBvcGVyYW5kcyBpbiBhIGZsb2F0aW5nLXBvaW50IG9wZXJhdGlvbgorICAgICAgICAgICAgICAgaXMgZGVub3JtYWwuIEEgZGVub3JtYWwgdmFsdWUgaXMgb25lIHRoYXQgaXMgdG9vCisgICAgICAgICAgICAgICBzbWFsbCB0byByZXByZXNlbnQgYXMgYSBzdGFuZGFyZCBmbG9hdGluZy1wb2ludAorICAgICAgICAgICAgICAgdmFsdWUuICovCisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfV2luZG93c0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleGNlcHRpb246IGZsb2F0aW5nLXBvaW50IG9wZXJhbmQgZGVub3JtYWwiKTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgRVhDRVBUSU9OX0ZMVF9JTkVYQUNUX1JFU1VMVDoKLQkJCS8qIFRoZSByZXN1bHQgb2YgYSBmbG9hdGluZy1wb2ludCBvcGVyYXRpb24gY2Fubm90IGJlCi0JCQkgICByZXByZXNlbnRlZCBleGFjdGx5IGFzIGEgZGVjaW1hbCBmcmFjdGlvbi4gKi8KLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19XaW5kb3dzRXJyb3IsCi0JCQkJCSJleGNlcHRpb246IGZsb2F0IGluZXhhY3QiKTsKLQkJCWJyZWFrOworICAgICAgICBjYXNlIEVYQ0VQVElPTl9GTFRfRElWSURFX0JZX1pFUk86CisgICAgICAgICAgICAvKiBUaGUgdGhyZWFkIGF0dGVtcHRlZCB0byBkaXZpZGUgYSBmbG9hdGluZy1wb2ludAorICAgICAgICAgICAgICAgdmFsdWUgYnkgYSBmbG9hdGluZy1wb2ludCBkaXZpc29yIG9mIHplcm8uICovCisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfV2luZG93c0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleGNlcHRpb246IGZsb2F0IGRpdmlkZSBieSB6ZXJvIik7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIEVYQ0VQVElPTl9GTFRfSU5WQUxJRF9PUEVSQVRJT046Ci0JCQkvKiBUaGlzIGV4Y2VwdGlvbiByZXByZXNlbnRzIGFueSBmbG9hdGluZy1wb2ludAotCQkJICAgZXhjZXB0aW9uIG5vdCBpbmNsdWRlZCBpbiB0aGlzIGxpc3QuICovCi0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfV2luZG93c0Vycm9yLAotCQkJCQkiZXhjZXB0aW9uOiBmbG9hdCBpbnZhbGlkIG9wZXJhdGlvbiIpOwotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgRVhDRVBUSU9OX0ZMVF9JTkVYQUNUX1JFU1VMVDoKKyAgICAgICAgICAgIC8qIFRoZSByZXN1bHQgb2YgYSBmbG9hdGluZy1wb2ludCBvcGVyYXRpb24gY2Fubm90IGJlCisgICAgICAgICAgICAgICByZXByZXNlbnRlZCBleGFjdGx5IGFzIGEgZGVjaW1hbCBmcmFjdGlvbi4gKi8KKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19XaW5kb3dzRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4Y2VwdGlvbjogZmxvYXQgaW5leGFjdCIpOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBFWENFUFRJT05fRkxUX09WRVJGTE9XOgotCQkJLyogVGhlIGV4cG9uZW50IG9mIGEgZmxvYXRpbmctcG9pbnQgb3BlcmF0aW9uIGlzCi0JCQkgICBncmVhdGVyIHRoYW4gdGhlIG1hZ25pdHVkZSBhbGxvd2VkIGJ5IHRoZQotCQkJICAgY29ycmVzcG9uZGluZyB0eXBlLiAqLwotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1dpbmRvd3NFcnJvciwKLQkJCQkJImV4Y2VwdGlvbjogZmxvYXQgb3ZlcmZsb3ciKTsKLQkJCWJyZWFrOworICAgICAgICBjYXNlIEVYQ0VQVElPTl9GTFRfSU5WQUxJRF9PUEVSQVRJT046CisgICAgICAgICAgICAvKiBUaGlzIGV4Y2VwdGlvbiByZXByZXNlbnRzIGFueSBmbG9hdGluZy1wb2ludAorICAgICAgICAgICAgICAgZXhjZXB0aW9uIG5vdCBpbmNsdWRlZCBpbiB0aGlzIGxpc3QuICovCisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfV2luZG93c0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleGNlcHRpb246IGZsb2F0IGludmFsaWQgb3BlcmF0aW9uIik7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIEVYQ0VQVElPTl9GTFRfU1RBQ0tfQ0hFQ0s6Ci0JCQkvKiBUaGUgc3RhY2sgb3ZlcmZsb3dlZCBvciB1bmRlcmZsb3dlZCBhcyB0aGUgcmVzdWx0Ci0JCQkgICBvZiBhIGZsb2F0aW5nLXBvaW50IG9wZXJhdGlvbi4gKi8KLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19XaW5kb3dzRXJyb3IsCi0JCQkJCSJleGNlcHRpb246IHN0YWNrIG92ZXIvdW5kZXJmbG93Iik7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBFWENFUFRJT05fRkxUX09WRVJGTE9XOgorICAgICAgICAgICAgLyogVGhlIGV4cG9uZW50IG9mIGEgZmxvYXRpbmctcG9pbnQgb3BlcmF0aW9uIGlzCisgICAgICAgICAgICAgICBncmVhdGVyIHRoYW4gdGhlIG1hZ25pdHVkZSBhbGxvd2VkIGJ5IHRoZQorICAgICAgICAgICAgICAgY29ycmVzcG9uZGluZyB0eXBlLiAqLworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1dpbmRvd3NFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhjZXB0aW9uOiBmbG9hdCBvdmVyZmxvdyIpOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBFWENFUFRJT05fU1RBQ0tfT1ZFUkZMT1c6Ci0JCQkvKiBUaGUgc3RhY2sgb3ZlcmZsb3dlZCBvciB1bmRlcmZsb3dlZCBhcyB0aGUgcmVzdWx0Ci0JCQkgICBvZiBhIGZsb2F0aW5nLXBvaW50IG9wZXJhdGlvbi4gKi8KLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19XaW5kb3dzRXJyb3IsCi0JCQkJCSJleGNlcHRpb246IHN0YWNrIG92ZXJmbG93Iik7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBFWENFUFRJT05fRkxUX1NUQUNLX0NIRUNLOgorICAgICAgICAgICAgLyogVGhlIHN0YWNrIG92ZXJmbG93ZWQgb3IgdW5kZXJmbG93ZWQgYXMgdGhlIHJlc3VsdAorICAgICAgICAgICAgICAgb2YgYSBmbG9hdGluZy1wb2ludCBvcGVyYXRpb24uICovCisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfV2luZG93c0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleGNlcHRpb246IHN0YWNrIG92ZXIvdW5kZXJmbG93Iik7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIEVYQ0VQVElPTl9GTFRfVU5ERVJGTE9XOgotCQkJLyogVGhlIGV4cG9uZW50IG9mIGEgZmxvYXRpbmctcG9pbnQgb3BlcmF0aW9uIGlzIGxlc3MKLQkJCSAgIHRoYW4gdGhlIG1hZ25pdHVkZSBhbGxvd2VkIGJ5IHRoZSBjb3JyZXNwb25kaW5nCi0JCQkgICB0eXBlLiAqLwotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1dpbmRvd3NFcnJvciwKLQkJCQkJImV4Y2VwdGlvbjogZmxvYXQgdW5kZXJmbG93Iik7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBFWENFUFRJT05fU1RBQ0tfT1ZFUkZMT1c6CisgICAgICAgICAgICAvKiBUaGUgc3RhY2sgb3ZlcmZsb3dlZCBvciB1bmRlcmZsb3dlZCBhcyB0aGUgcmVzdWx0CisgICAgICAgICAgICAgICBvZiBhIGZsb2F0aW5nLXBvaW50IG9wZXJhdGlvbi4gKi8KKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19XaW5kb3dzRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4Y2VwdGlvbjogc3RhY2sgb3ZlcmZsb3ciKTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgRVhDRVBUSU9OX0lOVF9ESVZJREVfQllfWkVSTzoKLQkJCS8qIFRoZSB0aHJlYWQgYXR0ZW1wdGVkIHRvIGRpdmlkZSBhbiBpbnRlZ2VyIHZhbHVlIGJ5Ci0JCQkgICBhbiBpbnRlZ2VyIGRpdmlzb3Igb2YgemVyby4gKi8KLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19XaW5kb3dzRXJyb3IsCi0JCQkJCSJleGNlcHRpb246IGludGVnZXIgZGl2aWRlIGJ5IHplcm8iKTsKLQkJCWJyZWFrOworICAgICAgICBjYXNlIEVYQ0VQVElPTl9GTFRfVU5ERVJGTE9XOgorICAgICAgICAgICAgLyogVGhlIGV4cG9uZW50IG9mIGEgZmxvYXRpbmctcG9pbnQgb3BlcmF0aW9uIGlzIGxlc3MKKyAgICAgICAgICAgICAgIHRoYW4gdGhlIG1hZ25pdHVkZSBhbGxvd2VkIGJ5IHRoZSBjb3JyZXNwb25kaW5nCisgICAgICAgICAgICAgICB0eXBlLiAqLworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1dpbmRvd3NFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhjZXB0aW9uOiBmbG9hdCB1bmRlcmZsb3ciKTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgRVhDRVBUSU9OX0lOVF9PVkVSRkxPVzoKLQkJCS8qIFRoZSByZXN1bHQgb2YgYW4gaW50ZWdlciBvcGVyYXRpb24gY2F1c2VkIGEgY2FycnkKLQkJCSAgIG91dCBvZiB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXQgb2YgdGhlIHJlc3VsdC4gKi8KLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19XaW5kb3dzRXJyb3IsCi0JCQkJCSJleGNlcHRpb246IGludGVnZXIgb3ZlcmZsb3ciKTsKLQkJCWJyZWFrOworICAgICAgICBjYXNlIEVYQ0VQVElPTl9JTlRfRElWSURFX0JZX1pFUk86CisgICAgICAgICAgICAvKiBUaGUgdGhyZWFkIGF0dGVtcHRlZCB0byBkaXZpZGUgYW4gaW50ZWdlciB2YWx1ZSBieQorICAgICAgICAgICAgICAgYW4gaW50ZWdlciBkaXZpc29yIG9mIHplcm8uICovCisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfV2luZG93c0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleGNlcHRpb246IGludGVnZXIgZGl2aWRlIGJ5IHplcm8iKTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgRVhDRVBUSU9OX1BSSVZfSU5TVFJVQ1RJT046Ci0JCQkvKiBUaGUgdGhyZWFkIGF0dGVtcHRlZCB0byBleGVjdXRlIGFuIGluc3RydWN0aW9uCi0JCQkgICB3aG9zZSBvcGVyYXRpb24gaXMgbm90IGFsbG93ZWQgaW4gdGhlIGN1cnJlbnQKLQkJCSAgIG1hY2hpbmUgbW9kZS4gKi8KLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19XaW5kb3dzRXJyb3IsCi0JCQkJCSJleGNlcHRpb246IHByaXZpbGVkZ2VkIGluc3RydWN0aW9uIik7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBFWENFUFRJT05fSU5UX09WRVJGTE9XOgorICAgICAgICAgICAgLyogVGhlIHJlc3VsdCBvZiBhbiBpbnRlZ2VyIG9wZXJhdGlvbiBjYXVzZWQgYSBjYXJyeQorICAgICAgICAgICAgICAgb3V0IG9mIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdCBvZiB0aGUgcmVzdWx0LiAqLworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1dpbmRvd3NFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhjZXB0aW9uOiBpbnRlZ2VyIG92ZXJmbG93Iik7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIEVYQ0VQVElPTl9OT05DT05USU5VQUJMRV9FWENFUFRJT046Ci0JCQkvKiBUaGUgdGhyZWFkIGF0dGVtcHRlZCB0byBjb250aW51ZSBleGVjdXRpb24gYWZ0ZXIgYQotCQkJICAgbm9uY29udGludWFibGUgZXhjZXB0aW9uIG9jY3VycmVkLiAqLwotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1dpbmRvd3NFcnJvciwKLQkJCQkJImV4Y2VwdGlvbjogbm9jb250aW51YWJsZSIpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlwcmludGYoImVycm9yICVkXG4iLCBjb2RlKTsKLQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19XaW5kb3dzRXJyb3IsCi0JCQkJICAgICAiZXhjZXB0aW9uIGNvZGUgMHglMDh4IiwKLQkJCQkgICAgIGNvZGUpOwotCQkJYnJlYWs7Ci0JCX0KLQl9CisgICAgICAgIGNhc2UgRVhDRVBUSU9OX1BSSVZfSU5TVFJVQ1RJT046CisgICAgICAgICAgICAvKiBUaGUgdGhyZWFkIGF0dGVtcHRlZCB0byBleGVjdXRlIGFuIGluc3RydWN0aW9uCisgICAgICAgICAgICAgICB3aG9zZSBvcGVyYXRpb24gaXMgbm90IGFsbG93ZWQgaW4gdGhlIGN1cnJlbnQKKyAgICAgICAgICAgICAgIG1hY2hpbmUgbW9kZS4gKi8KKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19XaW5kb3dzRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4Y2VwdGlvbjogcHJpdmlsZWRnZWQgaW5zdHJ1Y3Rpb24iKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgRVhDRVBUSU9OX05PTkNPTlRJTlVBQkxFX0VYQ0VQVElPTjoKKyAgICAgICAgICAgIC8qIFRoZSB0aHJlYWQgYXR0ZW1wdGVkIHRvIGNvbnRpbnVlIGV4ZWN1dGlvbiBhZnRlciBhCisgICAgICAgICAgICAgICBub25jb250aW51YWJsZSBleGNlcHRpb24gb2NjdXJyZWQuICovCisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfV2luZG93c0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleGNlcHRpb246IG5vY29udGludWFibGUiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcHJpbnRmKCJlcnJvciAlZFxuIiwgY29kZSk7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfV2luZG93c0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICJleGNlcHRpb24gY29kZSAweCUwOHgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CiB9CiAKIHN0YXRpYyBEV09SRCBIYW5kbGVFeGNlcHRpb24oRVhDRVBUSU9OX1BPSU5URVJTICpwdHJzLAotCQkJICAgICBEV09SRCAqcGR3LCBFWENFUFRJT05fUkVDT1JEICpyZWNvcmQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEICpwZHcsIEVYQ0VQVElPTl9SRUNPUkQgKnJlY29yZCkKIHsKLQkqcGR3ID0gcHRycy0+RXhjZXB0aW9uUmVjb3JkLT5FeGNlcHRpb25Db2RlOwotCSpyZWNvcmQgPSAqcHRycy0+RXhjZXB0aW9uUmVjb3JkOwotCXJldHVybiBFWENFUFRJT05fRVhFQ1VURV9IQU5ETEVSOworICAgICpwZHcgPSBwdHJzLT5FeGNlcHRpb25SZWNvcmQtPkV4Y2VwdGlvbkNvZGU7CisgICAgKnJlY29yZCA9ICpwdHJzLT5FeGNlcHRpb25SZWNvcmQ7CisgICAgcmV0dXJuIEVYQ0VQVElPTl9FWEVDVVRFX0hBTkRMRVI7CiB9CiAjZW5kaWYKIAogc3RhdGljIFB5T2JqZWN0ICoKIGNoZWNrX2hyZXN1bHQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCUhSRVNVTFQgaHI7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpIiwgJmhyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKEZBSUxFRChocikpCi0JCXJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0Vycihocik7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKGhyKTsKKyAgICBIUkVTVUxUIGhyOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaSIsICZocikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChGQUlMRUQoaHIpKQorICAgICAgICByZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnIoaHIpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhocik7CiB9CiAKICNlbmRpZgpAQCAtNDEyLDEzMiArNDEyLDEzMiBAQAogUHlDQXJnT2JqZWN0ICoKIG5ld19DQXJnT2JqZWN0KHZvaWQpCiB7Ci0JUHlDQXJnT2JqZWN0ICpwOwotCXAgPSBQeU9iamVjdF9OZXcoUHlDQXJnT2JqZWN0LCAmUHlDQXJnX1R5cGUpOwotCWlmIChwID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXAtPnBmZmlfdHlwZSA9IE5VTEw7Ci0JcC0+dGFnID0gJ1wwJzsKLQlwLT5vYmogPSBOVUxMOwotCW1lbXNldCgmcC0+dmFsdWUsIDAsIHNpemVvZihwLT52YWx1ZSkpOwotCXJldHVybiBwOworICAgIFB5Q0FyZ09iamVjdCAqcDsKKyAgICBwID0gUHlPYmplY3RfTmV3KFB5Q0FyZ09iamVjdCwgJlB5Q0FyZ19UeXBlKTsKKyAgICBpZiAocCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBwLT5wZmZpX3R5cGUgPSBOVUxMOworICAgIHAtPnRhZyA9ICdcMCc7CisgICAgcC0+b2JqID0gTlVMTDsKKyAgICBtZW1zZXQoJnAtPnZhbHVlLCAwLCBzaXplb2YocC0+dmFsdWUpKTsKKyAgICByZXR1cm4gcDsKIH0KIAogc3RhdGljIHZvaWQKIFB5Q0FyZ19kZWFsbG9jKFB5Q0FyZ09iamVjdCAqc2VsZikKIHsKLQlQeV9YREVDUkVGKHNlbGYtPm9iaik7Ci0JUHlPYmplY3RfRGVsKHNlbGYpOworICAgIFB5X1hERUNSRUYoc2VsZi0+b2JqKTsKKyAgICBQeU9iamVjdF9EZWwoc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBQeUNBcmdfcmVwcihQeUNBcmdPYmplY3QgKnNlbGYpCiB7Ci0JY2hhciBidWZmZXJbMjU2XTsKLQlzd2l0Y2goc2VsZi0+dGFnKSB7Ci0JY2FzZSAnYic6Ci0JY2FzZSAnQic6Ci0JCXNwcmludGYoYnVmZmVyLCAiPGNwYXJhbSAnJWMnICglZCk+IiwKLQkJCXNlbGYtPnRhZywgc2VsZi0+dmFsdWUuYik7Ci0JCWJyZWFrOwotCWNhc2UgJ2gnOgotCWNhc2UgJ0gnOgotCQlzcHJpbnRmKGJ1ZmZlciwgIjxjcGFyYW0gJyVjJyAoJWQpPiIsCi0JCQlzZWxmLT50YWcsIHNlbGYtPnZhbHVlLmgpOwotCQlicmVhazsKLQljYXNlICdpJzoKLQljYXNlICdJJzoKLQkJc3ByaW50ZihidWZmZXIsICI8Y3BhcmFtICclYycgKCVkKT4iLAotCQkJc2VsZi0+dGFnLCBzZWxmLT52YWx1ZS5pKTsKLQkJYnJlYWs7Ci0JY2FzZSAnbCc6Ci0JY2FzZSAnTCc6Ci0JCXNwcmludGYoYnVmZmVyLCAiPGNwYXJhbSAnJWMnICglbGQpPiIsCi0JCQlzZWxmLT50YWcsIHNlbGYtPnZhbHVlLmwpOwotCQlicmVhazsKLQkJCi0jaWZkZWYgSEFWRV9MT05HX0xPTkcKLQljYXNlICdxJzoKLQljYXNlICdRJzoKLQkJc3ByaW50ZihidWZmZXIsCi0jaWZkZWYgTVNfV0lOMzIKLQkJCSI8Y3BhcmFtICclYycgKCVJNjRkKT4iLAotI2Vsc2UKLQkJCSI8Y3BhcmFtICclYycgKCVxZCk+IiwKLSNlbmRpZgotCQkJc2VsZi0+dGFnLCBzZWxmLT52YWx1ZS5xKTsKLQkJYnJlYWs7Ci0jZW5kaWYKLQljYXNlICdkJzoKLQkJc3ByaW50ZihidWZmZXIsICI8Y3BhcmFtICclYycgKCVmKT4iLAotCQkJc2VsZi0+dGFnLCBzZWxmLT52YWx1ZS5kKTsKLQkJYnJlYWs7Ci0JY2FzZSAnZic6Ci0JCXNwcmludGYoYnVmZmVyLCAiPGNwYXJhbSAnJWMnICglZik+IiwKLQkJCXNlbGYtPnRhZywgc2VsZi0+dmFsdWUuZik7Ci0JCWJyZWFrOworICAgIGNoYXIgYnVmZmVyWzI1Nl07CisgICAgc3dpdGNoKHNlbGYtPnRhZykgeworICAgIGNhc2UgJ2InOgorICAgIGNhc2UgJ0InOgorICAgICAgICBzcHJpbnRmKGJ1ZmZlciwgIjxjcGFyYW0gJyVjJyAoJWQpPiIsCisgICAgICAgICAgICBzZWxmLT50YWcsIHNlbGYtPnZhbHVlLmIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlICdoJzoKKyAgICBjYXNlICdIJzoKKyAgICAgICAgc3ByaW50ZihidWZmZXIsICI8Y3BhcmFtICclYycgKCVkKT4iLAorICAgICAgICAgICAgc2VsZi0+dGFnLCBzZWxmLT52YWx1ZS5oKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnaSc6CisgICAgY2FzZSAnSSc6CisgICAgICAgIHNwcmludGYoYnVmZmVyLCAiPGNwYXJhbSAnJWMnICglZCk+IiwKKyAgICAgICAgICAgIHNlbGYtPnRhZywgc2VsZi0+dmFsdWUuaSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJ2wnOgorICAgIGNhc2UgJ0wnOgorICAgICAgICBzcHJpbnRmKGJ1ZmZlciwgIjxjcGFyYW0gJyVjJyAoJWxkKT4iLAorICAgICAgICAgICAgc2VsZi0+dGFnLCBzZWxmLT52YWx1ZS5sKTsKKyAgICAgICAgYnJlYWs7CiAKLQljYXNlICdjJzoKLQkJc3ByaW50ZihidWZmZXIsICI8Y3BhcmFtICclYycgKCVjKT4iLAotCQkJc2VsZi0+dGFnLCBzZWxmLT52YWx1ZS5jKTsKLQkJYnJlYWs7CisjaWZkZWYgSEFWRV9MT05HX0xPTkcKKyAgICBjYXNlICdxJzoKKyAgICBjYXNlICdRJzoKKyAgICAgICAgc3ByaW50ZihidWZmZXIsCisjaWZkZWYgTVNfV0lOMzIKKyAgICAgICAgICAgICI8Y3BhcmFtICclYycgKCVJNjRkKT4iLAorI2Vsc2UKKyAgICAgICAgICAgICI8Y3BhcmFtICclYycgKCVxZCk+IiwKKyNlbmRpZgorICAgICAgICAgICAgc2VsZi0+dGFnLCBzZWxmLT52YWx1ZS5xKTsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICBjYXNlICdkJzoKKyAgICAgICAgc3ByaW50ZihidWZmZXIsICI8Y3BhcmFtICclYycgKCVmKT4iLAorICAgICAgICAgICAgc2VsZi0+dGFnLCBzZWxmLT52YWx1ZS5kKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnZic6CisgICAgICAgIHNwcmludGYoYnVmZmVyLCAiPGNwYXJhbSAnJWMnICglZik+IiwKKyAgICAgICAgICAgIHNlbGYtPnRhZywgc2VsZi0+dmFsdWUuZik7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSAnYyc6CisgICAgICAgIHNwcmludGYoYnVmZmVyLCAiPGNwYXJhbSAnJWMnICglYyk+IiwKKyAgICAgICAgICAgIHNlbGYtPnRhZywgc2VsZi0+dmFsdWUuYyk7CisgICAgICAgIGJyZWFrOwogCiAvKiBIbSwgYXJlIHRoZXNlICd6JyBhbmQgJ1onIGNvZGVzIHVzZWZ1bCBhdCBhbGw/CiAgICBTaG91bGRuJ3QgdGhleSBiZSByZXBsYWNlZCBieSB0aGUgZnVuY3Rpb25hbGl0eSBvZiBjX3N0cmluZwogICAgYW5kIGNfd3N0cmluZyA/CiAqLwotCWNhc2UgJ3onOgotCWNhc2UgJ1onOgotCWNhc2UgJ1AnOgotCQlzcHJpbnRmKGJ1ZmZlciwgIjxjcGFyYW0gJyVjJyAoJXApPiIsCi0JCQlzZWxmLT50YWcsIHNlbGYtPnZhbHVlLnApOwotCQlicmVhazsKKyAgICBjYXNlICd6JzoKKyAgICBjYXNlICdaJzoKKyAgICBjYXNlICdQJzoKKyAgICAgICAgc3ByaW50ZihidWZmZXIsICI8Y3BhcmFtICclYycgKCVwKT4iLAorICAgICAgICAgICAgc2VsZi0+dGFnLCBzZWxmLT52YWx1ZS5wKTsKKyAgICAgICAgYnJlYWs7CiAKLQlkZWZhdWx0OgotCQlzcHJpbnRmKGJ1ZmZlciwgIjxjcGFyYW0gJyVjJyBhdCAlcD4iLAotCQkJc2VsZi0+dGFnLCBzZWxmKTsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1ZmZlcik7CisgICAgZGVmYXVsdDoKKyAgICAgICAgc3ByaW50ZihidWZmZXIsICI8Y3BhcmFtICclYycgYXQgJXA+IiwKKyAgICAgICAgICAgIHNlbGYtPnRhZywgc2VsZik7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWZmZXIpOwogfQogCiBzdGF0aWMgUHlNZW1iZXJEZWYgUHlDQXJnVHlwZV9tZW1iZXJzW10gPSB7Ci0JeyAiX29iaiIsIFRfT0JKRUNULAotCSAgb2Zmc2V0b2YoUHlDQXJnT2JqZWN0LCBvYmopLCBSRUFET05MWSwKLQkgICJ0aGUgd3JhcHBlZCBvYmplY3QiIH0sCi0JeyBOVUxMIH0sCisgICAgeyAiX29iaiIsIFRfT0JKRUNULAorICAgICAgb2Zmc2V0b2YoUHlDQXJnT2JqZWN0LCBvYmopLCBSRUFET05MWSwKKyAgICAgICJ0aGUgd3JhcHBlZCBvYmplY3QiIH0sCisgICAgeyBOVUxMIH0sCiB9OwogCiBQeVR5cGVPYmplY3QgUHlDQXJnX1R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JIkNBcmdPYmplY3QiLAotCXNpemVvZihQeUNBcmdPYmplY3QpLAotCTAsCi0JKGRlc3RydWN0b3IpUHlDQXJnX2RlYWxsb2MsCQkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9jb21wYXJlICovCi0JKHJlcHJmdW5jKVB5Q0FyZ19yZXByLAkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJCS8qIHRwX3N0ciAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQsCQkJLyogdHBfZmxhZ3MgKi8KLQkwLAkJCQkJLyogdHBfZG9jICovCi0JMCwJCQkJCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkJLyogdHBfaXRlcm5leHQgKi8KLQkwLAkJCQkJLyogdHBfbWV0aG9kcyAqLwotCVB5Q0FyZ1R5cGVfbWVtYmVycywJCQkvKiB0cF9tZW1iZXJzICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisgICAgIkNBcmdPYmplY3QiLAorICAgIHNpemVvZihQeUNBcmdPYmplY3QpLAorICAgIDAsCisgICAgKGRlc3RydWN0b3IpUHlDQXJnX2RlYWxsb2MsICAgICAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIChyZXByZnVuYylQeUNBcmdfcmVwciwgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgUHlDQXJnVHlwZV9tZW1iZXJzLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCiB9OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTU3MCwyNCArNTcwLDI0IEBACiAgKi8KIAogdW5pb24gcmVzdWx0IHsKLQljaGFyIGM7Ci0JY2hhciBiOwotCXNob3J0IGg7Ci0JaW50IGk7Ci0JbG9uZyBsOworICAgIGNoYXIgYzsKKyAgICBjaGFyIGI7CisgICAgc2hvcnQgaDsKKyAgICBpbnQgaTsKKyAgICBsb25nIGw7CiAjaWZkZWYgSEFWRV9MT05HX0xPTkcKLQlQWV9MT05HX0xPTkcgcTsKKyAgICBQWV9MT05HX0xPTkcgcTsKICNlbmRpZgotCWxvbmcgZG91YmxlIEQ7Ci0JZG91YmxlIGQ7Ci0JZmxvYXQgZjsKLQl2b2lkICpwOworICAgIGxvbmcgZG91YmxlIEQ7CisgICAgZG91YmxlIGQ7CisgICAgZmxvYXQgZjsKKyAgICB2b2lkICpwOwogfTsKIAogc3RydWN0IGFyZ3VtZW50IHsKLQlmZmlfdHlwZSAqZmZpX3R5cGU7Ci0JUHlPYmplY3QgKmtlZXA7Ci0JdW5pb24gcmVzdWx0IHZhbHVlOworICAgIGZmaV90eXBlICpmZmlfdHlwZTsKKyAgICBQeU9iamVjdCAqa2VlcDsKKyAgICB1bmlvbiByZXN1bHQgdmFsdWU7CiB9OwogCiAvKgpAQCAtNTk1LDE0MCArNTk1LDE0MCBAQAogICovCiBzdGF0aWMgaW50IENvbnZQYXJhbShQeU9iamVjdCAqb2JqLCBQeV9zc2l6ZV90IGluZGV4LCBzdHJ1Y3QgYXJndW1lbnQgKnBhKQogewotCVN0Z0RpY3RPYmplY3QgKmRpY3Q7Ci0JcGEtPmtlZXAgPSBOVUxMOyAvKiBzbyB3ZSBjYW5ub3QgZm9yZ2V0IGl0IGxhdGVyICovCisgICAgU3RnRGljdE9iamVjdCAqZGljdDsKKyAgICBwYS0+a2VlcCA9IE5VTEw7IC8qIHNvIHdlIGNhbm5vdCBmb3JnZXQgaXQgbGF0ZXIgKi8KIAotCWRpY3QgPSBQeU9iamVjdF9zdGdkaWN0KG9iaik7Ci0JaWYgKGRpY3QpIHsKLQkJUHlDQXJnT2JqZWN0ICpjYXJnOwotCQlhc3NlcnQoZGljdC0+cGFyYW1mdW5jKTsKLQkJLyogSWYgaXQgaGFzIGFuIHN0Z2RpY3QsIGl0IGlzIGEgQ0RhdGFPYmplY3QgKi8KLQkJY2FyZyA9IGRpY3QtPnBhcmFtZnVuYygoQ0RhdGFPYmplY3QgKilvYmopOwotCQlwYS0+ZmZpX3R5cGUgPSBjYXJnLT5wZmZpX3R5cGU7Ci0JCW1lbWNweSgmcGEtPnZhbHVlLCAmY2FyZy0+dmFsdWUsIHNpemVvZihwYS0+dmFsdWUpKTsKLQkJcGEtPmtlZXAgPSAoUHlPYmplY3QgKiljYXJnOwotCQlyZXR1cm4gMDsKLQl9CisgICAgZGljdCA9IFB5T2JqZWN0X3N0Z2RpY3Qob2JqKTsKKyAgICBpZiAoZGljdCkgeworICAgICAgICBQeUNBcmdPYmplY3QgKmNhcmc7CisgICAgICAgIGFzc2VydChkaWN0LT5wYXJhbWZ1bmMpOworICAgICAgICAvKiBJZiBpdCBoYXMgYW4gc3RnZGljdCwgaXQgaXMgYSBDRGF0YU9iamVjdCAqLworICAgICAgICBjYXJnID0gZGljdC0+cGFyYW1mdW5jKChDRGF0YU9iamVjdCAqKW9iaik7CisgICAgICAgIHBhLT5mZmlfdHlwZSA9IGNhcmctPnBmZmlfdHlwZTsKKyAgICAgICAgbWVtY3B5KCZwYS0+dmFsdWUsICZjYXJnLT52YWx1ZSwgc2l6ZW9mKHBhLT52YWx1ZSkpOworICAgICAgICBwYS0+a2VlcCA9IChQeU9iamVjdCAqKWNhcmc7CisgICAgICAgIHJldHVybiAwOworICAgIH0KIAotCWlmIChQeUNBcmdfQ2hlY2tFeGFjdChvYmopKSB7Ci0JCVB5Q0FyZ09iamVjdCAqY2FyZyA9IChQeUNBcmdPYmplY3QgKilvYmo7Ci0JCXBhLT5mZmlfdHlwZSA9IGNhcmctPnBmZmlfdHlwZTsKLQkJUHlfSU5DUkVGKG9iaik7Ci0JCXBhLT5rZWVwID0gb2JqOwotCQltZW1jcHkoJnBhLT52YWx1ZSwgJmNhcmctPnZhbHVlLCBzaXplb2YocGEtPnZhbHVlKSk7Ci0JCXJldHVybiAwOwotCX0KKyAgICBpZiAoUHlDQXJnX0NoZWNrRXhhY3Qob2JqKSkgeworICAgICAgICBQeUNBcmdPYmplY3QgKmNhcmcgPSAoUHlDQXJnT2JqZWN0ICopb2JqOworICAgICAgICBwYS0+ZmZpX3R5cGUgPSBjYXJnLT5wZmZpX3R5cGU7CisgICAgICAgIFB5X0lOQ1JFRihvYmopOworICAgICAgICBwYS0+a2VlcCA9IG9iajsKKyAgICAgICAgbWVtY3B5KCZwYS0+dmFsdWUsICZjYXJnLT52YWx1ZSwgc2l6ZW9mKHBhLT52YWx1ZSkpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLQkvKiBjaGVjayBmb3IgTm9uZSwgaW50ZWdlciwgc3RyaW5nIG9yIHVuaWNvZGUgYW5kIHVzZSBkaXJlY3RseSBpZiBzdWNjZXNzZnVsICovCi0JaWYgKG9iaiA9PSBQeV9Ob25lKSB7Ci0JCXBhLT5mZmlfdHlwZSA9ICZmZmlfdHlwZV9wb2ludGVyOwotCQlwYS0+dmFsdWUucCA9IE5VTEw7Ci0JCXJldHVybiAwOwotCX0KKyAgICAvKiBjaGVjayBmb3IgTm9uZSwgaW50ZWdlciwgc3RyaW5nIG9yIHVuaWNvZGUgYW5kIHVzZSBkaXJlY3RseSBpZiBzdWNjZXNzZnVsICovCisgICAgaWYgKG9iaiA9PSBQeV9Ob25lKSB7CisgICAgICAgIHBhLT5mZmlfdHlwZSA9ICZmZmlfdHlwZV9wb2ludGVyOworICAgICAgICBwYS0+dmFsdWUucCA9IE5VTEw7CisgICAgICAgIHJldHVybiAwOworICAgIH0KIAotCWlmIChQeUludF9DaGVjayhvYmopKSB7Ci0JCXBhLT5mZmlfdHlwZSA9ICZmZmlfdHlwZV9zaW50OwotCQlwYS0+dmFsdWUuaSA9IFB5SW50X0FTX0xPTkcob2JqKTsKLQkJcmV0dXJuIDA7Ci0JfQorICAgIGlmIChQeUludF9DaGVjayhvYmopKSB7CisgICAgICAgIHBhLT5mZmlfdHlwZSA9ICZmZmlfdHlwZV9zaW50OworICAgICAgICBwYS0+dmFsdWUuaSA9IFB5SW50X0FTX0xPTkcob2JqKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCi0JaWYgKFB5TG9uZ19DaGVjayhvYmopKSB7Ci0JCXBhLT5mZmlfdHlwZSA9ICZmZmlfdHlwZV9zaW50OwotCQlwYS0+dmFsdWUuaSA9IChsb25nKVB5TG9uZ19Bc1Vuc2lnbmVkTG9uZyhvYmopOwotCQlpZiAocGEtPnZhbHVlLmkgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewotCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCXBhLT52YWx1ZS5pID0gUHlMb25nX0FzTG9uZyhvYmopOwotCQkJaWYgKHBhLT52YWx1ZS5pID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpIHsKLQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJCQkJCSJsb25nIGludCB0b28gbG9uZyB0byBjb252ZXJ0Iik7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiAwOwotCX0KKyAgICBpZiAoUHlMb25nX0NoZWNrKG9iaikpIHsKKyAgICAgICAgcGEtPmZmaV90eXBlID0gJmZmaV90eXBlX3NpbnQ7CisgICAgICAgIHBhLT52YWx1ZS5pID0gKGxvbmcpUHlMb25nX0FzVW5zaWduZWRMb25nKG9iaik7CisgICAgICAgIGlmIChwYS0+dmFsdWUuaSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgcGEtPnZhbHVlLmkgPSBQeUxvbmdfQXNMb25nKG9iaik7CisgICAgICAgICAgICBpZiAocGEtPnZhbHVlLmkgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibG9uZyBpbnQgdG9vIGxvbmcgdG8gY29udmVydCIpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLQlpZiAoUHlTdHJpbmdfQ2hlY2sob2JqKSkgewotCQlwYS0+ZmZpX3R5cGUgPSAmZmZpX3R5cGVfcG9pbnRlcjsKLQkJcGEtPnZhbHVlLnAgPSBQeVN0cmluZ19BU19TVFJJTkcob2JqKTsKLQkJUHlfSU5DUkVGKG9iaik7Ci0JCXBhLT5rZWVwID0gb2JqOwotCQlyZXR1cm4gMDsKLQl9CisgICAgaWYgKFB5U3RyaW5nX0NoZWNrKG9iaikpIHsKKyAgICAgICAgcGEtPmZmaV90eXBlID0gJmZmaV90eXBlX3BvaW50ZXI7CisgICAgICAgIHBhLT52YWx1ZS5wID0gUHlTdHJpbmdfQVNfU1RSSU5HKG9iaik7CisgICAgICAgIFB5X0lOQ1JFRihvYmopOworICAgICAgICBwYS0+a2VlcCA9IG9iajsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCiAjaWZkZWYgQ1RZUEVTX1VOSUNPREUKLQlpZiAoUHlVbmljb2RlX0NoZWNrKG9iaikpIHsKKyAgICBpZiAoUHlVbmljb2RlX0NoZWNrKG9iaikpIHsKICNpZmRlZiBIQVZFX1VTQUJMRV9XQ0hBUl9UCi0JCXBhLT5mZmlfdHlwZSA9ICZmZmlfdHlwZV9wb2ludGVyOwotCQlwYS0+dmFsdWUucCA9IFB5VW5pY29kZV9BU19VTklDT0RFKG9iaik7Ci0JCVB5X0lOQ1JFRihvYmopOwotCQlwYS0+a2VlcCA9IG9iajsKLQkJcmV0dXJuIDA7CisgICAgICAgIHBhLT5mZmlfdHlwZSA9ICZmZmlfdHlwZV9wb2ludGVyOworICAgICAgICBwYS0+dmFsdWUucCA9IFB5VW5pY29kZV9BU19VTklDT0RFKG9iaik7CisgICAgICAgIFB5X0lOQ1JFRihvYmopOworICAgICAgICBwYS0+a2VlcCA9IG9iajsKKyAgICAgICAgcmV0dXJuIDA7CiAjZWxzZQotCQlpbnQgc2l6ZSA9IFB5VW5pY29kZV9HRVRfU0laRShvYmopOwotCQlwYS0+ZmZpX3R5cGUgPSAmZmZpX3R5cGVfcG9pbnRlcjsKLQkJc2l6ZSArPSAxOyAvKiB0ZXJtaW5hdGluZyBOVUwgKi8KLQkJc2l6ZSAqPSBzaXplb2Yod2NoYXJfdCk7Ci0JCXBhLT52YWx1ZS5wID0gUHlNZW1fTWFsbG9jKHNpemUpOwotCQlpZiAoIXBhLT52YWx1ZS5wKSB7Ci0JCQlQeUVycl9Ob01lbW9yeSgpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCW1lbXNldChwYS0+dmFsdWUucCwgMCwgc2l6ZSk7Ci0JCXBhLT5rZWVwID0gUHlDT2JqZWN0X0Zyb21Wb2lkUHRyKHBhLT52YWx1ZS5wLCBQeU1lbV9GcmVlKTsKLQkJaWYgKCFwYS0+a2VlcCkgewotCQkJUHlNZW1fRnJlZShwYS0+dmFsdWUucCk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJaWYgKC0xID09IFB5VW5pY29kZV9Bc1dpZGVDaGFyKChQeVVuaWNvZGVPYmplY3QgKilvYmosCi0JCQkJCSAgICAgICBwYS0+dmFsdWUucCwgUHlVbmljb2RlX0dFVF9TSVpFKG9iaikpKQotCQkJcmV0dXJuIC0xOwotCQlyZXR1cm4gMDsKKyAgICAgICAgaW50IHNpemUgPSBQeVVuaWNvZGVfR0VUX1NJWkUob2JqKTsKKyAgICAgICAgcGEtPmZmaV90eXBlID0gJmZmaV90eXBlX3BvaW50ZXI7CisgICAgICAgIHNpemUgKz0gMTsgLyogdGVybWluYXRpbmcgTlVMICovCisgICAgICAgIHNpemUgKj0gc2l6ZW9mKHdjaGFyX3QpOworICAgICAgICBwYS0+dmFsdWUucCA9IFB5TWVtX01hbGxvYyhzaXplKTsKKyAgICAgICAgaWYgKCFwYS0+dmFsdWUucCkgeworICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBtZW1zZXQocGEtPnZhbHVlLnAsIDAsIHNpemUpOworICAgICAgICBwYS0+a2VlcCA9IFB5Q09iamVjdF9Gcm9tVm9pZFB0cihwYS0+dmFsdWUucCwgUHlNZW1fRnJlZSk7CisgICAgICAgIGlmICghcGEtPmtlZXApIHsKKyAgICAgICAgICAgIFB5TWVtX0ZyZWUocGEtPnZhbHVlLnApOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGlmICgtMSA9PSBQeVVuaWNvZGVfQXNXaWRlQ2hhcigoUHlVbmljb2RlT2JqZWN0ICopb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGEtPnZhbHVlLnAsIFB5VW5pY29kZV9HRVRfU0laRShvYmopKSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgcmV0dXJuIDA7CiAjZW5kaWYKLQl9CisgICAgfQogI2VuZGlmCiAKLQl7Ci0JCVB5T2JqZWN0ICphcmc7Ci0JCWFyZyA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcob2JqLCAiX2FzX3BhcmFtZXRlcl8iKTsKLQkJLyogV2hpY2ggdHlwZXMgc2hvdWxkIHdlIGV4YWN0bHkgYWxsb3cgaGVyZT8KLQkJICAgaW50ZWdlcnMgYXJlIHJlcXVpcmVkIGZvciB1c2luZyBQeXRob24gY2xhc3NlcwotCQkgICBhcyBwYXJhbWV0ZXJzICh0aGV5IGhhdmUgdG8gZXhwb3NlIHRoZSAnX2FzX3BhcmFtZXRlcl8nCi0JCSAgIGF0dHJpYnV0ZSkKLQkJKi8KLQkJaWYgKGFyZykgewotCQkJaW50IHJlc3VsdDsKLQkJCXJlc3VsdCA9IENvbnZQYXJhbShhcmcsIGluZGV4LCBwYSk7Ci0JCQlQeV9ERUNSRUYoYXJnKTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAgIkRvbid0IGtub3cgaG93IHRvIGNvbnZlcnQgcGFyYW1ldGVyICVkIiwgCi0JCQkgICAgIFB5X1NBRkVfRE9XTkNBU1QoaW5kZXgsIFB5X3NzaXplX3QsIGludCkpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIHsKKyAgICAgICAgUHlPYmplY3QgKmFyZzsKKyAgICAgICAgYXJnID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhvYmosICJfYXNfcGFyYW1ldGVyXyIpOworICAgICAgICAvKiBXaGljaCB0eXBlcyBzaG91bGQgd2UgZXhhY3RseSBhbGxvdyBoZXJlPworICAgICAgICAgICBpbnRlZ2VycyBhcmUgcmVxdWlyZWQgZm9yIHVzaW5nIFB5dGhvbiBjbGFzc2VzCisgICAgICAgICAgIGFzIHBhcmFtZXRlcnMgKHRoZXkgaGF2ZSB0byBleHBvc2UgdGhlICdfYXNfcGFyYW1ldGVyXycKKyAgICAgICAgICAgYXR0cmlidXRlKQorICAgICAgICAqLworICAgICAgICBpZiAoYXJnKSB7CisgICAgICAgICAgICBpbnQgcmVzdWx0OworICAgICAgICAgICAgcmVzdWx0ID0gQ29udlBhcmFtKGFyZywgaW5kZXgsIHBhKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihhcmcpOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIkRvbid0IGtub3cgaG93IHRvIGNvbnZlcnQgcGFyYW1ldGVyICVkIiwKKyAgICAgICAgICAgICAgICAgICAgIFB5X1NBRkVfRE9XTkNBU1QoaW5kZXgsIFB5X3NzaXplX3QsIGludCkpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogfQogCiAKIGZmaV90eXBlICpHZXRUeXBlKFB5T2JqZWN0ICpvYmopCiB7Ci0JU3RnRGljdE9iamVjdCAqZGljdDsKLQlpZiAob2JqID09IE5VTEwpCi0JCXJldHVybiAmZmZpX3R5cGVfc2ludDsKLQlkaWN0ID0gUHlUeXBlX3N0Z2RpY3Qob2JqKTsKLQlpZiAoZGljdCA9PSBOVUxMKQotCQlyZXR1cm4gJmZmaV90eXBlX3NpbnQ7CisgICAgU3RnRGljdE9iamVjdCAqZGljdDsKKyAgICBpZiAob2JqID09IE5VTEwpCisgICAgICAgIHJldHVybiAmZmZpX3R5cGVfc2ludDsKKyAgICBkaWN0ID0gUHlUeXBlX3N0Z2RpY3Qob2JqKTsKKyAgICBpZiAoZGljdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gJmZmaV90eXBlX3NpbnQ7CiAjaWYgZGVmaW5lZChNU19XSU4zMikgJiYgIWRlZmluZWQoX1dJTjMyX1dDRSkKLQkvKiBUaGlzIGxpdHRsZSB0cmljayB3b3JrcyBjb3JyZWN0bHkgd2l0aCBNU1ZDLgotCSAgIEl0IHJldHVybnMgc21hbGwgc3RydWN0dXJlcyBpbiByZWdpc3RlcnMKLQkqLwotCWlmIChkaWN0LT5mZmlfdHlwZV9wb2ludGVyLnR5cGUgPT0gRkZJX1RZUEVfU1RSVUNUKSB7Ci0JCWlmIChkaWN0LT5mZmlfdHlwZV9wb2ludGVyLnNpemUgPD0gNCkKLQkJCXJldHVybiAmZmZpX3R5cGVfc2ludDMyOwotCQllbHNlIGlmIChkaWN0LT5mZmlfdHlwZV9wb2ludGVyLnNpemUgPD0gOCkKLQkJCXJldHVybiAmZmZpX3R5cGVfc2ludDY0OwotCX0KKyAgICAvKiBUaGlzIGxpdHRsZSB0cmljayB3b3JrcyBjb3JyZWN0bHkgd2l0aCBNU1ZDLgorICAgICAgIEl0IHJldHVybnMgc21hbGwgc3RydWN0dXJlcyBpbiByZWdpc3RlcnMKKyAgICAqLworICAgIGlmIChkaWN0LT5mZmlfdHlwZV9wb2ludGVyLnR5cGUgPT0gRkZJX1RZUEVfU1RSVUNUKSB7CisgICAgICAgIGlmIChkaWN0LT5mZmlfdHlwZV9wb2ludGVyLnNpemUgPD0gNCkKKyAgICAgICAgICAgIHJldHVybiAmZmZpX3R5cGVfc2ludDMyOworICAgICAgICBlbHNlIGlmIChkaWN0LT5mZmlfdHlwZV9wb2ludGVyLnNpemUgPD0gOCkKKyAgICAgICAgICAgIHJldHVybiAmZmZpX3R5cGVfc2ludDY0OworICAgIH0KICNlbmRpZgotCXJldHVybiAmZGljdC0+ZmZpX3R5cGVfcG9pbnRlcjsKKyAgICByZXR1cm4gJmRpY3QtPmZmaV90eXBlX3BvaW50ZXI7CiB9CiAKIApAQCAtNzM2LDcgKzczNiw3IEBACiAgKiBsaWJmZmkgdXNlczoKICAqCiAgKiBmZmlfc3RhdHVzIGZmaV9wcmVwX2NpZihmZmlfY2lmICpjaWYsIGZmaV9hYmkgYWJpLAotICoJICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBuYXJncywKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBuYXJncywKICAqICAgICAgICAgICAgICAgICAgICAgICAgIGZmaV90eXBlICpydHlwZSwKICAqICAgICAgICAgICAgICAgICAgICAgICAgIGZmaV90eXBlICoqYXR5cGVzKTsKICAqCkBAIC03NDUsMTM5ICs3NDUsMTM5IEBACiAgKiB2b2lkIGZmaV9jYWxsKGZmaV9jaWYgKmNpZiwgdm9pZCAqZm4sIHZvaWQgKnJ2YWx1ZSwgdm9pZCAqKmF2YWx1ZXMpOwogICovCiBzdGF0aWMgaW50IF9jYWxsX2Z1bmN0aW9uX3BvaW50ZXIoaW50IGZsYWdzLAotCQkJCSAgUFBST0MgcFByb2MsCi0JCQkJICB2b2lkICoqYXZhbHVlcywKLQkJCQkgIGZmaV90eXBlICoqYXR5cGVzLAotCQkJCSAgZmZpX3R5cGUgKnJlc3R5cGUsCi0JCQkJICB2b2lkICpyZXNtZW0sCi0JCQkJICBpbnQgYXJnY291bnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFBST0MgcFByb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKmF2YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmZpX3R5cGUgKiphdHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmZpX3R5cGUgKnJlc3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcmVzbWVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhcmdjb3VudCkKIHsKICNpZmRlZiBXSVRIX1RIUkVBRAotCVB5VGhyZWFkU3RhdGUgKl9zYXZlID0gTlVMTDsgLyogRm9yIFB5X0JMT0NLX1RIUkVBRFMgYW5kIFB5X1VOQkxPQ0tfVEhSRUFEUyAqLworICAgIFB5VGhyZWFkU3RhdGUgKl9zYXZlID0gTlVMTDsgLyogRm9yIFB5X0JMT0NLX1RIUkVBRFMgYW5kIFB5X1VOQkxPQ0tfVEhSRUFEUyAqLwogI2VuZGlmCi0JUHlPYmplY3QgKmVycm9yX29iamVjdCA9IE5VTEw7Ci0JaW50ICpzcGFjZTsKLQlmZmlfY2lmIGNpZjsKLQlpbnQgY2M7CisgICAgUHlPYmplY3QgKmVycm9yX29iamVjdCA9IE5VTEw7CisgICAgaW50ICpzcGFjZTsKKyAgICBmZmlfY2lmIGNpZjsKKyAgICBpbnQgY2M7CiAjaWZkZWYgTVNfV0lOMzIKLQlpbnQgZGVsdGE7CisgICAgaW50IGRlbHRhOwogI2lmbmRlZiBET05UX1VTRV9TRUgKLQlEV09SRCBkd0V4Y2VwdGlvbkNvZGUgPSAwOwotCUVYQ0VQVElPTl9SRUNPUkQgcmVjb3JkOworICAgIERXT1JEIGR3RXhjZXB0aW9uQ29kZSA9IDA7CisgICAgRVhDRVBUSU9OX1JFQ09SRCByZWNvcmQ7CiAjZW5kaWYKICNlbmRpZgotCS8qIFhYWCBjaGVjayBiZWZvcmUgaGVyZSAqLwotCWlmIChyZXN0eXBlID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKLQkJCQkiTm8gZmZpX3R5cGUgZm9yIHJlc3VsdCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCQotCWNjID0gRkZJX0RFRkFVTFRfQUJJOwotI2lmIGRlZmluZWQoTVNfV0lOMzIpICYmICFkZWZpbmVkKE1TX1dJTjY0KSAmJiAhZGVmaW5lZChfV0lOMzJfV0NFKQotCWlmICgoZmxhZ3MgJiBGVU5DRkxBR19DREVDTCkgPT0gMCkKLQkJY2MgPSBGRklfU1REQ0FMTDsKLSNlbmRpZgotCWlmIChGRklfT0sgIT0gZmZpX3ByZXBfY2lmKCZjaWYsCi0JCQkJICAgY2MsCi0JCQkJICAgYXJnY291bnQsCi0JCQkJICAgcmVzdHlwZSwKLQkJCQkgICBhdHlwZXMpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCi0JCQkJImZmaV9wcmVwX2NpZiBmYWlsZWQiKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICAvKiBYWFggY2hlY2sgYmVmb3JlIGhlcmUgKi8KKyAgICBpZiAocmVzdHlwZSA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiTm8gZmZpX3R5cGUgZm9yIHJlc3VsdCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JaWYgKGZsYWdzICYgKEZVTkNGTEFHX1VTRV9FUlJOTyB8IEZVTkNGTEFHX1VTRV9MQVNURVJST1IpKSB7Ci0JCWVycm9yX29iamVjdCA9IGdldF9lcnJvcl9vYmplY3QoJnNwYWNlKTsKLQkJaWYgKGVycm9yX29iamVjdCA9PSBOVUxMKQotCQkJcmV0dXJuIC0xOwotCX0KKyAgICBjYyA9IEZGSV9ERUZBVUxUX0FCSTsKKyNpZiBkZWZpbmVkKE1TX1dJTjMyKSAmJiAhZGVmaW5lZChNU19XSU42NCkgJiYgIWRlZmluZWQoX1dJTjMyX1dDRSkKKyAgICBpZiAoKGZsYWdzICYgRlVOQ0ZMQUdfQ0RFQ0wpID09IDApCisgICAgICAgIGNjID0gRkZJX1NURENBTEw7CisjZW5kaWYKKyAgICBpZiAoRkZJX09LICE9IGZmaV9wcmVwX2NpZigmY2lmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR5cGVzKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImZmaV9wcmVwX2NpZiBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmIChmbGFncyAmIChGVU5DRkxBR19VU0VfRVJSTk8gfCBGVU5DRkxBR19VU0VfTEFTVEVSUk9SKSkgeworICAgICAgICBlcnJvcl9vYmplY3QgPSBnZXRfZXJyb3Jfb2JqZWN0KCZzcGFjZSk7CisgICAgICAgIGlmIChlcnJvcl9vYmplY3QgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAjaWZkZWYgV0lUSF9USFJFQUQKLQlpZiAoKGZsYWdzICYgRlVOQ0ZMQUdfUFlUSE9OQVBJKSA9PSAwKQotCQlQeV9VTkJMT0NLX1RIUkVBRFMKKyAgICBpZiAoKGZsYWdzICYgRlVOQ0ZMQUdfUFlUSE9OQVBJKSA9PSAwKQorICAgICAgICBQeV9VTkJMT0NLX1RIUkVBRFMKICNlbmRpZgotCWlmIChmbGFncyAmIEZVTkNGTEFHX1VTRV9FUlJOTykgewotCQlpbnQgdGVtcCA9IHNwYWNlWzBdOwotCQlzcGFjZVswXSA9IGVycm5vOwotCQllcnJubyA9IHRlbXA7Ci0JfQorICAgIGlmIChmbGFncyAmIEZVTkNGTEFHX1VTRV9FUlJOTykgeworICAgICAgICBpbnQgdGVtcCA9IHNwYWNlWzBdOworICAgICAgICBzcGFjZVswXSA9IGVycm5vOworICAgICAgICBlcnJubyA9IHRlbXA7CisgICAgfQogI2lmZGVmIE1TX1dJTjMyCi0JaWYgKGZsYWdzICYgRlVOQ0ZMQUdfVVNFX0xBU1RFUlJPUikgewotCQlpbnQgdGVtcCA9IHNwYWNlWzFdOwotCQlzcGFjZVsxXSA9IEdldExhc3RFcnJvcigpOwotCQlTZXRMYXN0RXJyb3IodGVtcCk7Ci0JfQorICAgIGlmIChmbGFncyAmIEZVTkNGTEFHX1VTRV9MQVNURVJST1IpIHsKKyAgICAgICAgaW50IHRlbXAgPSBzcGFjZVsxXTsKKyAgICAgICAgc3BhY2VbMV0gPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgU2V0TGFzdEVycm9yKHRlbXApOworICAgIH0KICNpZm5kZWYgRE9OVF9VU0VfU0VICi0JX190cnkgeworICAgIF9fdHJ5IHsKICNlbmRpZgotCQlkZWx0YSA9CisgICAgICAgIGRlbHRhID0KICNlbmRpZgotCQkJZmZpX2NhbGwoJmNpZiwgKHZvaWQgKilwUHJvYywgcmVzbWVtLCBhdmFsdWVzKTsKKyAgICAgICAgICAgIGZmaV9jYWxsKCZjaWYsICh2b2lkICopcFByb2MsIHJlc21lbSwgYXZhbHVlcyk7CiAjaWZkZWYgTVNfV0lOMzIKICNpZm5kZWYgRE9OVF9VU0VfU0VICi0JfQotCV9fZXhjZXB0IChIYW5kbGVFeGNlcHRpb24oR2V0RXhjZXB0aW9uSW5mb3JtYXRpb24oKSwKLQkJCQkgICZkd0V4Y2VwdGlvbkNvZGUsICZyZWNvcmQpKSB7Ci0JCTsKLQl9CisgICAgfQorICAgIF9fZXhjZXB0IChIYW5kbGVFeGNlcHRpb24oR2V0RXhjZXB0aW9uSW5mb3JtYXRpb24oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkd0V4Y2VwdGlvbkNvZGUsICZyZWNvcmQpKSB7CisgICAgICAgIDsKKyAgICB9CiAjZW5kaWYKLQlpZiAoZmxhZ3MgJiBGVU5DRkxBR19VU0VfTEFTVEVSUk9SKSB7Ci0JCWludCB0ZW1wID0gc3BhY2VbMV07Ci0JCXNwYWNlWzFdID0gR2V0TGFzdEVycm9yKCk7Ci0JCVNldExhc3RFcnJvcih0ZW1wKTsKLQl9CisgICAgaWYgKGZsYWdzICYgRlVOQ0ZMQUdfVVNFX0xBU1RFUlJPUikgeworICAgICAgICBpbnQgdGVtcCA9IHNwYWNlWzFdOworICAgICAgICBzcGFjZVsxXSA9IEdldExhc3RFcnJvcigpOworICAgICAgICBTZXRMYXN0RXJyb3IodGVtcCk7CisgICAgfQogI2VuZGlmCi0JaWYgKGZsYWdzICYgRlVOQ0ZMQUdfVVNFX0VSUk5PKSB7Ci0JCWludCB0ZW1wID0gc3BhY2VbMF07Ci0JCXNwYWNlWzBdID0gZXJybm87Ci0JCWVycm5vID0gdGVtcDsKLQl9Ci0JUHlfWERFQ1JFRihlcnJvcl9vYmplY3QpOworICAgIGlmIChmbGFncyAmIEZVTkNGTEFHX1VTRV9FUlJOTykgeworICAgICAgICBpbnQgdGVtcCA9IHNwYWNlWzBdOworICAgICAgICBzcGFjZVswXSA9IGVycm5vOworICAgICAgICBlcnJubyA9IHRlbXA7CisgICAgfQorICAgIFB5X1hERUNSRUYoZXJyb3Jfb2JqZWN0KTsKICNpZmRlZiBXSVRIX1RIUkVBRAotCWlmICgoZmxhZ3MgJiBGVU5DRkxBR19QWVRIT05BUEkpID09IDApCi0JCVB5X0JMT0NLX1RIUkVBRFMKKyAgICBpZiAoKGZsYWdzICYgRlVOQ0ZMQUdfUFlUSE9OQVBJKSA9PSAwKQorICAgICAgICBQeV9CTE9DS19USFJFQURTCiAjZW5kaWYKICNpZmRlZiBNU19XSU4zMgogI2lmbmRlZiBET05UX1VTRV9TRUgKLQlpZiAoZHdFeGNlcHRpb25Db2RlKSB7Ci0JCVNldEV4Y2VwdGlvbihkd0V4Y2VwdGlvbkNvZGUsICZyZWNvcmQpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIGlmIChkd0V4Y2VwdGlvbkNvZGUpIHsKKyAgICAgICAgU2V0RXhjZXB0aW9uKGR3RXhjZXB0aW9uQ29kZSwgJnJlY29yZCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAjZW5kaWYKICNpZmRlZiBNU19XSU42NAotCWlmIChkZWx0YSAhPSAwKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19SdW50aW1lRXJyb3IsCi0JCQkgICAgICJmZmlfY2FsbCBmYWlsZWQgd2l0aCBjb2RlICVkIiwKLQkJCSAgICAgZGVsdGEpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIGlmIChkZWx0YSAhPSAwKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiZmZpX2NhbGwgZmFpbGVkIHdpdGggY29kZSAlZCIsCisgICAgICAgICAgICAgICAgICAgICBkZWx0YSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAjZWxzZQotCWlmIChkZWx0YSA8IDApIHsKLQkJaWYgKGZsYWdzICYgRlVOQ0ZMQUdfQ0RFQ0wpCi0JCQlQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkgICAgICJQcm9jZWR1cmUgY2FsbGVkIHdpdGggbm90IGVub3VnaCAiCi0JCQkJICAgICAiYXJndW1lbnRzICglZCBieXRlcyBtaXNzaW5nKSAiCi0JCQkJICAgICAib3Igd3JvbmcgY2FsbGluZyBjb252ZW50aW9uIiwKLQkJCQkgICAgIC1kZWx0YSk7Ci0JCWVsc2UKLQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSAgICAgIlByb2NlZHVyZSBwcm9iYWJseSBjYWxsZWQgd2l0aCBub3QgZW5vdWdoICIKLQkJCQkgICAgICJhcmd1bWVudHMgKCVkIGJ5dGVzIG1pc3NpbmcpIiwKLQkJCQkgICAgIC1kZWx0YSk7Ci0JCXJldHVybiAtMTsKLQl9IGVsc2UgaWYgKGRlbHRhID4gMCkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKLQkJCSAgICAgIlByb2NlZHVyZSBwcm9iYWJseSBjYWxsZWQgd2l0aCB0b28gbWFueSAiCi0JCQkgICAgICJhcmd1bWVudHMgKCVkIGJ5dGVzIGluIGV4Y2VzcykiLAotCQkJICAgICBkZWx0YSk7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgaWYgKGRlbHRhIDwgMCkgeworICAgICAgICBpZiAoZmxhZ3MgJiBGVU5DRkxBR19DREVDTCkKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICJQcm9jZWR1cmUgY2FsbGVkIHdpdGggbm90IGVub3VnaCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgImFyZ3VtZW50cyAoJWQgYnl0ZXMgbWlzc2luZykgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJvciB3cm9uZyBjYWxsaW5nIGNvbnZlbnRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgIC1kZWx0YSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICJQcm9jZWR1cmUgcHJvYmFibHkgY2FsbGVkIHdpdGggbm90IGVub3VnaCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgImFyZ3VtZW50cyAoJWQgYnl0ZXMgbWlzc2luZykiLAorICAgICAgICAgICAgICAgICAgICAgICAgIC1kZWx0YSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9IGVsc2UgaWYgKGRlbHRhID4gMCkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJQcm9jZWR1cmUgcHJvYmFibHkgY2FsbGVkIHdpdGggdG9vIG1hbnkgIgorICAgICAgICAgICAgICAgICAgICAgImFyZ3VtZW50cyAoJWQgYnl0ZXMgaW4gZXhjZXNzKSIsCisgICAgICAgICAgICAgICAgICAgICBkZWx0YSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAjZW5kaWYKICNlbmRpZgotCWlmICgoZmxhZ3MgJiBGVU5DRkxBR19QWVRIT05BUEkpICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiAtMTsKLQlyZXR1cm4gMDsKKyAgICBpZiAoKGZsYWdzICYgRlVOQ0ZMQUdfUFlUSE9OQVBJKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgcmV0dXJuIDA7CiB9CiAKIC8qCkBAIC04OTIsNDEgKzg5Miw0MSBAQAogICovCiBzdGF0aWMgUHlPYmplY3QgKkdldFJlc3VsdChQeU9iamVjdCAqcmVzdHlwZSwgdm9pZCAqcmVzdWx0LCBQeU9iamVjdCAqY2hlY2tlcikKIHsKLQlTdGdEaWN0T2JqZWN0ICpkaWN0OwotCVB5T2JqZWN0ICpyZXR2YWwsICp2OworICAgIFN0Z0RpY3RPYmplY3QgKmRpY3Q7CisgICAgUHlPYmplY3QgKnJldHZhbCwgKnY7CiAKLQlpZiAocmVzdHlwZSA9PSBOVUxMKQotCQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKihpbnQgKilyZXN1bHQpOworICAgIGlmIChyZXN0eXBlID09IE5VTEwpCisgICAgICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygqKGludCAqKXJlc3VsdCk7CiAKLQlpZiAocmVzdHlwZSA9PSBQeV9Ob25lKSB7Ci0JCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJcmV0dXJuIFB5X05vbmU7Ci0JfQorICAgIGlmIChyZXN0eXBlID09IFB5X05vbmUpIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICB9CiAKLQlkaWN0ID0gUHlUeXBlX3N0Z2RpY3QocmVzdHlwZSk7Ci0JaWYgKGRpY3QgPT0gTlVMTCkKLQkJcmV0dXJuIFB5T2JqZWN0X0NhbGxGdW5jdGlvbihyZXN0eXBlLCAiaSIsICooaW50ICopcmVzdWx0KTsKKyAgICBkaWN0ID0gUHlUeXBlX3N0Z2RpY3QocmVzdHlwZSk7CisgICAgaWYgKGRpY3QgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFB5T2JqZWN0X0NhbGxGdW5jdGlvbihyZXN0eXBlLCAiaSIsICooaW50ICopcmVzdWx0KTsKIAotCWlmIChkaWN0LT5nZXRmdW5jICYmICFJc1NpbXBsZVN1YlR5cGUocmVzdHlwZSkpIHsKLQkJcmV0dmFsID0gZGljdC0+Z2V0ZnVuYyhyZXN1bHQsIGRpY3QtPnNpemUpOwotCQkvKiBJZiByZXN0eXBlIGlzIHB5X29iamVjdCAoZGV0ZWN0ZWQgYnkgY29tcGFyaW5nIGdldGZ1bmMgd2l0aAotCQkgICBPX2dldCksIHdlIGhhdmUgdG8gY2FsbCBQeV9ERUNSRUYgYmVjYXVzZSBPX2dldCBoYXMgYWxyZWFkeQotCQkgICBjYWxsZWQgUHlfSU5DUkVGLgotCQkqLwotCQlpZiAoZGljdC0+Z2V0ZnVuYyA9PSBnZXRlbnRyeSgiTyIpLT5nZXRmdW5jKSB7Ci0JCQlQeV9ERUNSRUYocmV0dmFsKTsKLQkJfQotCX0gZWxzZQotCQlyZXR2YWwgPSBDRGF0YV9Gcm9tQmFzZU9iaihyZXN0eXBlLCBOVUxMLCAwLCByZXN1bHQpOworICAgIGlmIChkaWN0LT5nZXRmdW5jICYmICFJc1NpbXBsZVN1YlR5cGUocmVzdHlwZSkpIHsKKyAgICAgICAgcmV0dmFsID0gZGljdC0+Z2V0ZnVuYyhyZXN1bHQsIGRpY3QtPnNpemUpOworICAgICAgICAvKiBJZiByZXN0eXBlIGlzIHB5X29iamVjdCAoZGV0ZWN0ZWQgYnkgY29tcGFyaW5nIGdldGZ1bmMgd2l0aAorICAgICAgICAgICBPX2dldCksIHdlIGhhdmUgdG8gY2FsbCBQeV9ERUNSRUYgYmVjYXVzZSBPX2dldCBoYXMgYWxyZWFkeQorICAgICAgICAgICBjYWxsZWQgUHlfSU5DUkVGLgorICAgICAgICAqLworICAgICAgICBpZiAoZGljdC0+Z2V0ZnVuYyA9PSBnZXRlbnRyeSgiTyIpLT5nZXRmdW5jKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYocmV0dmFsKTsKKyAgICAgICAgfQorICAgIH0gZWxzZQorICAgICAgICByZXR2YWwgPSBDRGF0YV9Gcm9tQmFzZU9iaihyZXN0eXBlLCBOVUxMLCAwLCByZXN1bHQpOwogCi0JaWYgKCFjaGVja2VyIHx8ICFyZXR2YWwpCi0JCXJldHVybiByZXR2YWw7CisgICAgaWYgKCFjaGVja2VyIHx8ICFyZXR2YWwpCisgICAgICAgIHJldHVybiByZXR2YWw7CiAKLQl2ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhjaGVja2VyLCByZXR2YWwsIE5VTEwpOwotCWlmICh2ID09IE5VTEwpCi0JCV9BZGRUcmFjZWJhY2soIkdldFJlc3VsdCIsICJfY3R5cGVzL2NhbGxwcm9jLmMiLCBfX0xJTkVfXy0yKTsKLQlQeV9ERUNSRUYocmV0dmFsKTsKLQlyZXR1cm4gdjsKKyAgICB2ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhjaGVja2VyLCByZXR2YWwsIE5VTEwpOworICAgIGlmICh2ID09IE5VTEwpCisgICAgICAgIF9BZGRUcmFjZWJhY2soIkdldFJlc3VsdCIsICJfY3R5cGVzL2NhbGxwcm9jLmMiLCBfX0xJTkVfXy0yKTsKKyAgICBQeV9ERUNSRUYocmV0dmFsKTsKKyAgICByZXR1cm4gdjsKIH0KIAogLyoKQEAgLTkzNSw0MCArOTM1LDQwIEBACiAgKi8KIHZvaWQgRXh0ZW5kX0Vycm9yX0luZm8oUHlPYmplY3QgKmV4Y19jbGFzcywgY2hhciAqZm10LCAuLi4pCiB7Ci0JdmFfbGlzdCB2YXJnczsKLQlQeU9iamVjdCAqdHAsICp2LCAqdGIsICpzLCAqY2xzX3N0ciwgKm1zZ19zdHI7CisgICAgdmFfbGlzdCB2YXJnczsKKyAgICBQeU9iamVjdCAqdHAsICp2LCAqdGIsICpzLCAqY2xzX3N0ciwgKm1zZ19zdHI7CiAKLQl2YV9zdGFydCh2YXJncywgZm10KTsKLQlzID0gUHlTdHJpbmdfRnJvbUZvcm1hdFYoZm10LCB2YXJncyk7Ci0JdmFfZW5kKHZhcmdzKTsKLQlpZiAoIXMpCi0JCXJldHVybjsKKyAgICB2YV9zdGFydCh2YXJncywgZm10KTsKKyAgICBzID0gUHlTdHJpbmdfRnJvbUZvcm1hdFYoZm10LCB2YXJncyk7CisgICAgdmFfZW5kKHZhcmdzKTsKKyAgICBpZiAoIXMpCisgICAgICAgIHJldHVybjsKIAotCVB5RXJyX0ZldGNoKCZ0cCwgJnYsICZ0Yik7Ci0JUHlFcnJfTm9ybWFsaXplRXhjZXB0aW9uKCZ0cCwgJnYsICZ0Yik7Ci0JY2xzX3N0ciA9IFB5T2JqZWN0X1N0cih0cCk7Ci0JaWYgKGNsc19zdHIpIHsKLQkJUHlTdHJpbmdfQ29uY2F0QW5kRGVsKCZzLCBjbHNfc3RyKTsKLQkJUHlTdHJpbmdfQ29uY2F0QW5kRGVsKCZzLCBQeVN0cmluZ19Gcm9tU3RyaW5nKCI6ICIpKTsKLQkJaWYgKHMgPT0gTlVMTCkKLQkJCWdvdG8gZXJyb3I7Ci0JfSBlbHNlCi0JCVB5RXJyX0NsZWFyKCk7Ci0JbXNnX3N0ciA9IFB5T2JqZWN0X1N0cih2KTsKLQlpZiAobXNnX3N0cikKLQkJUHlTdHJpbmdfQ29uY2F0QW5kRGVsKCZzLCBtc2dfc3RyKTsKLQllbHNlIHsKLQkJUHlFcnJfQ2xlYXIoKTsKLQkJUHlTdHJpbmdfQ29uY2F0QW5kRGVsKCZzLCBQeVN0cmluZ19Gcm9tU3RyaW5nKCI/Pz8iKSk7Ci0JCWlmIChzID09IE5VTEwpCi0JCQlnb3RvIGVycm9yOwotCX0KLQlQeUVycl9TZXRPYmplY3QoZXhjX2NsYXNzLCBzKTsKKyAgICBQeUVycl9GZXRjaCgmdHAsICZ2LCAmdGIpOworICAgIFB5RXJyX05vcm1hbGl6ZUV4Y2VwdGlvbigmdHAsICZ2LCAmdGIpOworICAgIGNsc19zdHIgPSBQeU9iamVjdF9TdHIodHApOworICAgIGlmIChjbHNfc3RyKSB7CisgICAgICAgIFB5U3RyaW5nX0NvbmNhdEFuZERlbCgmcywgY2xzX3N0cik7CisgICAgICAgIFB5U3RyaW5nX0NvbmNhdEFuZERlbCgmcywgUHlTdHJpbmdfRnJvbVN0cmluZygiOiAiKSk7CisgICAgICAgIGlmIChzID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgIH0gZWxzZQorICAgICAgICBQeUVycl9DbGVhcigpOworICAgIG1zZ19zdHIgPSBQeU9iamVjdF9TdHIodik7CisgICAgaWYgKG1zZ19zdHIpCisgICAgICAgIFB5U3RyaW5nX0NvbmNhdEFuZERlbCgmcywgbXNnX3N0cik7CisgICAgZWxzZSB7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIFB5U3RyaW5nX0NvbmNhdEFuZERlbCgmcywgUHlTdHJpbmdfRnJvbVN0cmluZygiPz8/IikpOworICAgICAgICBpZiAocyA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgUHlFcnJfU2V0T2JqZWN0KGV4Y19jbGFzcywgcyk7CiBlcnJvcjoKLQlQeV9YREVDUkVGKHRwKTsKLQlQeV9YREVDUkVGKHYpOwotCVB5X1hERUNSRUYodGIpOwotCVB5X1hERUNSRUYocyk7CisgICAgUHlfWERFQ1JFRih0cCk7CisgICAgUHlfWERFQ1JFRih2KTsKKyAgICBQeV9YREVDUkVGKHRiKTsKKyAgICBQeV9YREVDUkVGKHMpOwogfQogCiAKQEAgLTk3Nyw3NyArOTc3LDc3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogR2V0Q29tRXJyb3IoSFJFU1VMVCBlcnJjb2RlLCBHVUlEICpyaWlkLCBJVW5rbm93biAqcEl1bmspCiB7Ci0JSFJFU1VMVCBocjsKLQlJU3VwcG9ydEVycm9ySW5mbyAqcHNlaSA9IE5VTEw7Ci0JSUVycm9ySW5mbyAqcGVpID0gTlVMTDsKLQlCU1RSIGRlc2NyPU5VTEwsIGhlbHBmaWxlPU5VTEwsIHNvdXJjZT1OVUxMOwotCUdVSUQgZ3VpZDsKLQlEV09SRCBoZWxwY29udGV4dD0wOwotCUxQT0xFU1RSIHByb2dpZDsKLQlQeU9iamVjdCAqb2JqOwotCVRDSEFSICp0ZXh0OworICAgIEhSRVNVTFQgaHI7CisgICAgSVN1cHBvcnRFcnJvckluZm8gKnBzZWkgPSBOVUxMOworICAgIElFcnJvckluZm8gKnBlaSA9IE5VTEw7CisgICAgQlNUUiBkZXNjcj1OVUxMLCBoZWxwZmlsZT1OVUxMLCBzb3VyY2U9TlVMTDsKKyAgICBHVUlEIGd1aWQ7CisgICAgRFdPUkQgaGVscGNvbnRleHQ9MDsKKyAgICBMUE9MRVNUUiBwcm9naWQ7CisgICAgUHlPYmplY3QgKm9iajsKKyAgICBUQ0hBUiAqdGV4dDsKIAotCS8qIFdlIGFic29sdXRlbHkgaGF2ZSB0byByZWxlYXNlIHRoZSBHSUwgZHVyaW5nIENPTSBtZXRob2QgY2FsbHMsCi0JICAgb3RoZXJ3aXNlIHdlIG1heSBnZXQgYSBkZWFkbG9jayEKLQkqLworICAgIC8qIFdlIGFic29sdXRlbHkgaGF2ZSB0byByZWxlYXNlIHRoZSBHSUwgZHVyaW5nIENPTSBtZXRob2QgY2FsbHMsCisgICAgICAgb3RoZXJ3aXNlIHdlIG1heSBnZXQgYSBkZWFkbG9jayEKKyAgICAqLwogI2lmZGVmIFdJVEhfVEhSRUFECi0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKICNlbmRpZgogCi0JaHIgPSBwSXVuay0+bHBWdGJsLT5RdWVyeUludGVyZmFjZShwSXVuaywgJklJRF9JU3VwcG9ydEVycm9ySW5mbywgKHZvaWQgKiopJnBzZWkpOwotCWlmIChGQUlMRUQoaHIpKQotCQlnb3RvIGZhaWxlZDsKKyAgICBociA9IHBJdW5rLT5scFZ0YmwtPlF1ZXJ5SW50ZXJmYWNlKHBJdW5rLCAmSUlEX0lTdXBwb3J0RXJyb3JJbmZvLCAodm9pZCAqKikmcHNlaSk7CisgICAgaWYgKEZBSUxFRChocikpCisgICAgICAgIGdvdG8gZmFpbGVkOwogCi0JaHIgPSBwc2VpLT5scFZ0YmwtPkludGVyZmFjZVN1cHBvcnRzRXJyb3JJbmZvKHBzZWksIHJpaWQpOwotCXBzZWktPmxwVnRibC0+UmVsZWFzZShwc2VpKTsKLQlpZiAoRkFJTEVEKGhyKSkKLQkJZ290byBmYWlsZWQ7CisgICAgaHIgPSBwc2VpLT5scFZ0YmwtPkludGVyZmFjZVN1cHBvcnRzRXJyb3JJbmZvKHBzZWksIHJpaWQpOworICAgIHBzZWktPmxwVnRibC0+UmVsZWFzZShwc2VpKTsKKyAgICBpZiAoRkFJTEVEKGhyKSkKKyAgICAgICAgZ290byBmYWlsZWQ7CiAKLQlociA9IEdldEVycm9ySW5mbygwLCAmcGVpKTsKLQlpZiAoaHIgIT0gU19PSykKLQkJZ290byBmYWlsZWQ7CisgICAgaHIgPSBHZXRFcnJvckluZm8oMCwgJnBlaSk7CisgICAgaWYgKGhyICE9IFNfT0spCisgICAgICAgIGdvdG8gZmFpbGVkOwogCi0JcGVpLT5scFZ0YmwtPkdldERlc2NyaXB0aW9uKHBlaSwgJmRlc2NyKTsKLQlwZWktPmxwVnRibC0+R2V0R1VJRChwZWksICZndWlkKTsKLQlwZWktPmxwVnRibC0+R2V0SGVscENvbnRleHQocGVpLCAmaGVscGNvbnRleHQpOwotCXBlaS0+bHBWdGJsLT5HZXRIZWxwRmlsZShwZWksICZoZWxwZmlsZSk7Ci0JcGVpLT5scFZ0YmwtPkdldFNvdXJjZShwZWksICZzb3VyY2UpOworICAgIHBlaS0+bHBWdGJsLT5HZXREZXNjcmlwdGlvbihwZWksICZkZXNjcik7CisgICAgcGVpLT5scFZ0YmwtPkdldEdVSUQocGVpLCAmZ3VpZCk7CisgICAgcGVpLT5scFZ0YmwtPkdldEhlbHBDb250ZXh0KHBlaSwgJmhlbHBjb250ZXh0KTsKKyAgICBwZWktPmxwVnRibC0+R2V0SGVscEZpbGUocGVpLCAmaGVscGZpbGUpOworICAgIHBlaS0+bHBWdGJsLT5HZXRTb3VyY2UocGVpLCAmc291cmNlKTsKIAotCXBlaS0+bHBWdGJsLT5SZWxlYXNlKHBlaSk7CisgICAgcGVpLT5scFZ0YmwtPlJlbGVhc2UocGVpKTsKIAogICBmYWlsZWQ6CiAjaWZkZWYgV0lUSF9USFJFQUQKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIFB5X0VORF9BTExPV19USFJFQURTCiAjZW5kaWYKIAotCXByb2dpZCA9IE5VTEw7Ci0JUHJvZ0lERnJvbUNMU0lEKCZndWlkLCAmcHJvZ2lkKTsKKyAgICBwcm9naWQgPSBOVUxMOworICAgIFByb2dJREZyb21DTFNJRCgmZ3VpZCwgJnByb2dpZCk7CiAKLQl0ZXh0ID0gRm9ybWF0RXJyb3IoZXJyY29kZSk7Ci0Jb2JqID0gUHlfQnVpbGRWYWx1ZSgKKyAgICB0ZXh0ID0gRm9ybWF0RXJyb3IoZXJyY29kZSk7CisgICAgb2JqID0gUHlfQnVpbGRWYWx1ZSgKICNpZmRlZiBfVU5JQ09ERQotCQkiaXUodXV1aXUpIiwKKyAgICAgICAgIml1KHV1dWl1KSIsCiAjZWxzZQotCQkiaXModXV1aXUpIiwKKyAgICAgICAgImlzKHV1dWl1KSIsCiAjZW5kaWYKLQkJZXJyY29kZSwKLQkJdGV4dCwKLQkJZGVzY3IsIHNvdXJjZSwgaGVscGZpbGUsIGhlbHBjb250ZXh0LAotCQlwcm9naWQpOwotCWlmIChvYmopIHsKLQkJUHlFcnJfU2V0T2JqZWN0KENvbUVycm9yLCBvYmopOwotCQlQeV9ERUNSRUYob2JqKTsKLQl9Ci0JTG9jYWxGcmVlKHRleHQpOworICAgICAgICBlcnJjb2RlLAorICAgICAgICB0ZXh0LAorICAgICAgICBkZXNjciwgc291cmNlLCBoZWxwZmlsZSwgaGVscGNvbnRleHQsCisgICAgICAgIHByb2dpZCk7CisgICAgaWYgKG9iaikgeworICAgICAgICBQeUVycl9TZXRPYmplY3QoQ29tRXJyb3IsIG9iaik7CisgICAgICAgIFB5X0RFQ1JFRihvYmopOworICAgIH0KKyAgICBMb2NhbEZyZWUodGV4dCk7CiAKLQlpZiAoZGVzY3IpCi0JCVN5c0ZyZWVTdHJpbmcoZGVzY3IpOwotCWlmIChoZWxwZmlsZSkKLQkJU3lzRnJlZVN0cmluZyhoZWxwZmlsZSk7Ci0JaWYgKHNvdXJjZSkKLQkJU3lzRnJlZVN0cmluZyhzb3VyY2UpOworICAgIGlmIChkZXNjcikKKyAgICAgICAgU3lzRnJlZVN0cmluZyhkZXNjcik7CisgICAgaWYgKGhlbHBmaWxlKQorICAgICAgICBTeXNGcmVlU3RyaW5nKGhlbHBmaWxlKTsKKyAgICBpZiAoc291cmNlKQorICAgICAgICBTeXNGcmVlU3RyaW5nKHNvdXJjZSk7CiAKLQlyZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gTlVMTDsKIH0KICNlbmRpZgogCkBAIC0xMDU5LDE1OCArMTA1OSwxNTggQEAKICAqIC0gWFhYIHZhcmlvdXMgcmVxdWlyZW1lbnRzIGZvciByZXN0eXBlLCBub3QgeWV0IGNvbGxlY3RlZAogICovCiBQeU9iamVjdCAqX0NhbGxQcm9jKFBQUk9DIHBQcm9jLAotCQkgICAgUHlPYmplY3QgKmFyZ3R1cGxlLAorICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqYXJndHVwbGUsCiAjaWZkZWYgTVNfV0lOMzIKLQkJICAgIElVbmtub3duICpwSXVuaywKLQkJICAgIEdVSUQgKmlpZCwKKyAgICAgICAgICAgICAgICAgICAgSVVua25vd24gKnBJdW5rLAorICAgICAgICAgICAgICAgICAgICBHVUlEICppaWQsCiAjZW5kaWYKLQkJICAgIGludCBmbGFncywKLQkJICAgIFB5T2JqZWN0ICphcmd0eXBlcywgLyogbWlzbGVhZGluZyBuYW1lOiBUaGlzIGlzIGEgdHVwbGUgb2YKLQkJCQkJICAgbWV0aG9kcywgbm90IHR5cGVzOiB0aGUgLmZyb21fcGFyYW0KLQkJCQkJICAgY2xhc3MgbWV0aG9kcyBvZiB0aGUgdHlwZXMgKi8KLQkJICAgIFB5T2JqZWN0ICpyZXN0eXBlLAotCQkgICAgUHlPYmplY3QgKmNoZWNrZXIpCisgICAgICAgICAgICAgICAgICAgIGludCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmFyZ3R5cGVzLCAvKiBtaXNsZWFkaW5nIG5hbWU6IFRoaXMgaXMgYSB0dXBsZSBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZHMsIG5vdCB0eXBlczogdGhlIC5mcm9tX3BhcmFtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3MgbWV0aG9kcyBvZiB0aGUgdHlwZXMgKi8KKyAgICAgICAgICAgIFB5T2JqZWN0ICpyZXN0eXBlLAorICAgICAgICAgICAgUHlPYmplY3QgKmNoZWNrZXIpCiB7Ci0JUHlfc3NpemVfdCBpLCBuLCBhcmdjb3VudCwgYXJndHlwZV9jb3VudDsKLQl2b2lkICpyZXNidWY7Ci0Jc3RydWN0IGFyZ3VtZW50ICphcmdzLCAqcGE7Ci0JZmZpX3R5cGUgKiphdHlwZXM7Ci0JZmZpX3R5cGUgKnJ0eXBlOwotCXZvaWQgKiphdmFsdWVzOwotCVB5T2JqZWN0ICpyZXR2YWwgPSBOVUxMOworICAgIFB5X3NzaXplX3QgaSwgbiwgYXJnY291bnQsIGFyZ3R5cGVfY291bnQ7CisgICAgdm9pZCAqcmVzYnVmOworICAgIHN0cnVjdCBhcmd1bWVudCAqYXJncywgKnBhOworICAgIGZmaV90eXBlICoqYXR5cGVzOworICAgIGZmaV90eXBlICpydHlwZTsKKyAgICB2b2lkICoqYXZhbHVlczsKKyAgICBQeU9iamVjdCAqcmV0dmFsID0gTlVMTDsKIAotCW4gPSBhcmdjb3VudCA9IFB5VHVwbGVfR0VUX1NJWkUoYXJndHVwbGUpOworICAgIG4gPSBhcmdjb3VudCA9IFB5VHVwbGVfR0VUX1NJWkUoYXJndHVwbGUpOwogI2lmZGVmIE1TX1dJTjMyCi0JLyogYW4gb3B0aW9uYWwgQ09NIG9iamVjdCB0aGlzIHBvaW50ZXIgKi8KLQlpZiAocEl1bmspCi0JCSsrYXJnY291bnQ7CisgICAgLyogYW4gb3B0aW9uYWwgQ09NIG9iamVjdCB0aGlzIHBvaW50ZXIgKi8KKyAgICBpZiAocEl1bmspCisgICAgICAgICsrYXJnY291bnQ7CiAjZW5kaWYKIAotCWFyZ3MgPSAoc3RydWN0IGFyZ3VtZW50ICopYWxsb2NhKHNpemVvZihzdHJ1Y3QgYXJndW1lbnQpICogYXJnY291bnQpOwotCWlmICghYXJncykgewotCQlQeUVycl9Ob01lbW9yeSgpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JbWVtc2V0KGFyZ3MsIDAsIHNpemVvZihzdHJ1Y3QgYXJndW1lbnQpICogYXJnY291bnQpOwotCWFyZ3R5cGVfY291bnQgPSBhcmd0eXBlcyA/IFB5VHVwbGVfR0VUX1NJWkUoYXJndHlwZXMpIDogMDsKKyAgICBhcmdzID0gKHN0cnVjdCBhcmd1bWVudCAqKWFsbG9jYShzaXplb2Yoc3RydWN0IGFyZ3VtZW50KSAqIGFyZ2NvdW50KTsKKyAgICBpZiAoIWFyZ3MpIHsKKyAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIG1lbXNldChhcmdzLCAwLCBzaXplb2Yoc3RydWN0IGFyZ3VtZW50KSAqIGFyZ2NvdW50KTsKKyAgICBhcmd0eXBlX2NvdW50ID0gYXJndHlwZXMgPyBQeVR1cGxlX0dFVF9TSVpFKGFyZ3R5cGVzKSA6IDA7CiAjaWZkZWYgTVNfV0lOMzIKLQlpZiAocEl1bmspIHsKLQkJYXJnc1swXS5mZmlfdHlwZSA9ICZmZmlfdHlwZV9wb2ludGVyOwotCQlhcmdzWzBdLnZhbHVlLnAgPSBwSXVuazsKLQkJcGEgPSAmYXJnc1sxXTsKLQl9IGVsc2UKKyAgICBpZiAocEl1bmspIHsKKyAgICAgICAgYXJnc1swXS5mZmlfdHlwZSA9ICZmZmlfdHlwZV9wb2ludGVyOworICAgICAgICBhcmdzWzBdLnZhbHVlLnAgPSBwSXVuazsKKyAgICAgICAgcGEgPSAmYXJnc1sxXTsKKyAgICB9IGVsc2UKICNlbmRpZgotCQlwYSA9ICZhcmdzWzBdOworICAgICAgICBwYSA9ICZhcmdzWzBdOwogCi0JLyogQ29udmVydCB0aGUgYXJndW1lbnRzICovCi0JZm9yIChpID0gMDsgaSA8IG47ICsraSwgKytwYSkgewotCQlQeU9iamVjdCAqY29udmVydGVyOwotCQlQeU9iamVjdCAqYXJnOwotCQlpbnQgZXJyOworICAgIC8qIENvbnZlcnQgdGhlIGFyZ3VtZW50cyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2ksICsrcGEpIHsKKyAgICAgICAgUHlPYmplY3QgKmNvbnZlcnRlcjsKKyAgICAgICAgUHlPYmplY3QgKmFyZzsKKyAgICAgICAgaW50IGVycjsKIAotCQlhcmcgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3R1cGxlLCBpKTsJLyogYm9ycm93ZWQgcmVmICovCi0JCS8qIEZvciBjZGVjbCBmdW5jdGlvbnMsIHdlIGFsbG93IG1vcmUgYWN0dWFsIGFyZ3VtZW50cwotCQkgICB0aGFuIHRoZSBsZW5ndGggb2YgdGhlIGFyZ3R5cGVzIHR1cGxlLgotCQkgICBUaGlzIGlzIGNoZWNrZWQgaW4gX2N0eXBlczo6Q0Z1bmNQdHJfQ2FsbAotCQkqLwotCQlpZiAoYXJndHlwZXMgJiYgYXJndHlwZV9jb3VudCA+IGkpIHsKLQkJCVB5T2JqZWN0ICp2OwotCQkJY29udmVydGVyID0gUHlUdXBsZV9HRVRfSVRFTShhcmd0eXBlcywgaSk7Ci0JCQl2ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhjb252ZXJ0ZXIsCi0JCQkJCQkJICAgYXJnLAotCQkJCQkJCSAgIE5VTEwpOwotCQkJaWYgKHYgPT0gTlVMTCkgewotCQkJCUV4dGVuZF9FcnJvcl9JbmZvKFB5RXhjX0FyZ0Vycm9yLCAiYXJndW1lbnQgJWQ6ICIsIGkrMSk7Ci0JCQkJZ290byBjbGVhbnVwOwotCQkJfQorICAgICAgICBhcmcgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3R1cGxlLCBpKTsgICAgICAgICAgICAvKiBib3Jyb3dlZCByZWYgKi8KKyAgICAgICAgLyogRm9yIGNkZWNsIGZ1bmN0aW9ucywgd2UgYWxsb3cgbW9yZSBhY3R1YWwgYXJndW1lbnRzCisgICAgICAgICAgIHRoYW4gdGhlIGxlbmd0aCBvZiB0aGUgYXJndHlwZXMgdHVwbGUuCisgICAgICAgICAgIFRoaXMgaXMgY2hlY2tlZCBpbiBfY3R5cGVzOjpDRnVuY1B0cl9DYWxsCisgICAgICAgICovCisgICAgICAgIGlmIChhcmd0eXBlcyAmJiBhcmd0eXBlX2NvdW50ID4gaSkgeworICAgICAgICAgICAgUHlPYmplY3QgKnY7CisgICAgICAgICAgICBjb252ZXJ0ZXIgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3R5cGVzLCBpKTsKKyAgICAgICAgICAgIHYgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGNvbnZlcnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgICAgIGlmICh2ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBFeHRlbmRfRXJyb3JfSW5mbyhQeUV4Y19BcmdFcnJvciwgImFyZ3VtZW50ICVkOiAiLCBpKzEpOworICAgICAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICAgICAgICAgIH0KIAotCQkJZXJyID0gQ29udlBhcmFtKHYsIGkrMSwgcGEpOwotCQkJUHlfREVDUkVGKHYpOwotCQkJaWYgKC0xID09IGVycikgewotCQkJCUV4dGVuZF9FcnJvcl9JbmZvKFB5RXhjX0FyZ0Vycm9yLCAiYXJndW1lbnQgJWQ6ICIsIGkrMSk7Ci0JCQkJZ290byBjbGVhbnVwOwotCQkJfQotCQl9IGVsc2UgewotCQkJZXJyID0gQ29udlBhcmFtKGFyZywgaSsxLCBwYSk7Ci0JCQlpZiAoLTEgPT0gZXJyKSB7Ci0JCQkJRXh0ZW5kX0Vycm9yX0luZm8oUHlFeGNfQXJnRXJyb3IsICJhcmd1bWVudCAlZDogIiwgaSsxKTsKLQkJCQlnb3RvIGNsZWFudXA7IC8qIGxlYWtpbmcgPyAqLwotCQkJfQotCQl9Ci0JfQorICAgICAgICAgICAgZXJyID0gQ29udlBhcmFtKHYsIGkrMSwgcGEpOworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgaWYgKC0xID09IGVycikgeworICAgICAgICAgICAgICAgIEV4dGVuZF9FcnJvcl9JbmZvKFB5RXhjX0FyZ0Vycm9yLCAiYXJndW1lbnQgJWQ6ICIsIGkrMSk7CisgICAgICAgICAgICAgICAgZ290byBjbGVhbnVwOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZXJyID0gQ29udlBhcmFtKGFyZywgaSsxLCBwYSk7CisgICAgICAgICAgICBpZiAoLTEgPT0gZXJyKSB7CisgICAgICAgICAgICAgICAgRXh0ZW5kX0Vycm9yX0luZm8oUHlFeGNfQXJnRXJyb3IsICJhcmd1bWVudCAlZDogIiwgaSsxKTsKKyAgICAgICAgICAgICAgICBnb3RvIGNsZWFudXA7IC8qIGxlYWtpbmcgPyAqLworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogCi0JcnR5cGUgPSBHZXRUeXBlKHJlc3R5cGUpOwotCXJlc2J1ZiA9IGFsbG9jYShtYXgocnR5cGUtPnNpemUsIHNpemVvZihmZmlfYXJnKSkpOworICAgIHJ0eXBlID0gR2V0VHlwZShyZXN0eXBlKTsKKyAgICByZXNidWYgPSBhbGxvY2EobWF4KHJ0eXBlLT5zaXplLCBzaXplb2YoZmZpX2FyZykpKTsKIAotCWF2YWx1ZXMgPSAodm9pZCAqKilhbGxvY2Eoc2l6ZW9mKHZvaWQgKikgKiBhcmdjb3VudCk7Ci0JYXR5cGVzID0gKGZmaV90eXBlICoqKWFsbG9jYShzaXplb2YoZmZpX3R5cGUgKikgKiBhcmdjb3VudCk7Ci0JaWYgKCFyZXNidWYgfHwgIWF2YWx1ZXMgfHwgIWF0eXBlcykgewotCQlQeUVycl9Ob01lbW9yeSgpOwotCQlnb3RvIGNsZWFudXA7Ci0JfQotCWZvciAoaSA9IDA7IGkgPCBhcmdjb3VudDsgKytpKSB7Ci0JCWF0eXBlc1tpXSA9IGFyZ3NbaV0uZmZpX3R5cGU7Ci0JCWlmIChhdHlwZXNbaV0tPnR5cGUgPT0gRkZJX1RZUEVfU1RSVUNUIAorICAgIGF2YWx1ZXMgPSAodm9pZCAqKilhbGxvY2Eoc2l6ZW9mKHZvaWQgKikgKiBhcmdjb3VudCk7CisgICAgYXR5cGVzID0gKGZmaV90eXBlICoqKWFsbG9jYShzaXplb2YoZmZpX3R5cGUgKikgKiBhcmdjb3VudCk7CisgICAgaWYgKCFyZXNidWYgfHwgIWF2YWx1ZXMgfHwgIWF0eXBlcykgeworICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCBhcmdjb3VudDsgKytpKSB7CisgICAgICAgIGF0eXBlc1tpXSA9IGFyZ3NbaV0uZmZpX3R5cGU7CisgICAgICAgIGlmIChhdHlwZXNbaV0tPnR5cGUgPT0gRkZJX1RZUEVfU1RSVUNUCiAjaWZkZWYgX1dJTjY0Ci0JCSAgICAmJiBhdHlwZXNbaV0tPnNpemUgPD0gc2l6ZW9mKHZvaWQgKikKKyAgICAgICAgICAgICYmIGF0eXBlc1tpXS0+c2l6ZSA8PSBzaXplb2Yodm9pZCAqKQogI2VuZGlmCi0JCSAgICApCi0JCQlhdmFsdWVzW2ldID0gKHZvaWQgKilhcmdzW2ldLnZhbHVlLnA7Ci0JCWVsc2UKLQkJCWF2YWx1ZXNbaV0gPSAodm9pZCAqKSZhcmdzW2ldLnZhbHVlOwotCX0KKyAgICAgICAgICAgICkKKyAgICAgICAgICAgIGF2YWx1ZXNbaV0gPSAodm9pZCAqKWFyZ3NbaV0udmFsdWUucDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYXZhbHVlc1tpXSA9ICh2b2lkICopJmFyZ3NbaV0udmFsdWU7CisgICAgfQogCi0JaWYgKC0xID09IF9jYWxsX2Z1bmN0aW9uX3BvaW50ZXIoZmxhZ3MsIHBQcm9jLCBhdmFsdWVzLCBhdHlwZXMsCi0JCQkJCSBydHlwZSwgcmVzYnVmLAotCQkJCQkgUHlfU0FGRV9ET1dOQ0FTVChhcmdjb3VudCwKLQkJCQkJCQkgIFB5X3NzaXplX3QsCi0JCQkJCQkJICBpbnQpKSkKLQkJZ290byBjbGVhbnVwOworICAgIGlmICgtMSA9PSBfY2FsbF9mdW5jdGlvbl9wb2ludGVyKGZsYWdzLCBwUHJvYywgYXZhbHVlcywgYXR5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ0eXBlLCByZXNidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfU0FGRV9ET1dOQ0FTVChhcmdjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQpKSkKKyAgICAgICAgZ290byBjbGVhbnVwOwogCiAjaWZkZWYgV09SRFNfQklHRU5ESUFOCi0JLyogbGliZmZpIHJldHVybnMgdGhlIHJlc3VsdCBpbiBhIGJ1ZmZlciB3aXRoIHNpemVvZihmZmlfYXJnKS4gVGhpcwotCSAgIGNhdXNlcyBwcm9ibGVtcyBvbiBiaWcgZW5kaWFuIG1hY2hpbmVzLCBzaW5jZSB0aGUgcmVzdWx0IGJ1ZmZlcgotCSAgIGFkZHJlc3MgY2Fubm90IHNpbXBseSBiZSB1c2VkIGFzIHJlc3VsdCBwb2ludGVyLCBpbnN0ZWFkIHdlIG11c3QKLQkgICBhZGp1c3QgdGhlIHBvaW50ZXIgdmFsdWU6Ci0JICovCi0JLyoKLQkgIFhYWCBJIHNob3VsZCBmaW5kIG91dCBhbmQgY2xhcmlmeSB3aHkgdGhpcyBpcyBuZWVkZWQgYXQgYWxsLAotCSAgZXNwZWNpYWxseSB3aHkgYWRqdXN0aW5nIGZvciBmZmlfdHlwZV9mbG9hdCBtdXN0IGJlIGF2b2lkZWQgb24KLQkgIDY0LWJpdCBwbGF0Zm9ybXMuCi0JICovCi0JaWYgKHJ0eXBlLT50eXBlICE9IEZGSV9UWVBFX0ZMT0FUCi0JICAgICYmIHJ0eXBlLT50eXBlICE9IEZGSV9UWVBFX1NUUlVDVAotCSAgICAmJiBydHlwZS0+c2l6ZSA8IHNpemVvZihmZmlfYXJnKSkKLQkJcmVzYnVmID0gKGNoYXIgKilyZXNidWYgKyBzaXplb2YoZmZpX2FyZykgLSBydHlwZS0+c2l6ZTsKKyAgICAvKiBsaWJmZmkgcmV0dXJucyB0aGUgcmVzdWx0IGluIGEgYnVmZmVyIHdpdGggc2l6ZW9mKGZmaV9hcmcpLiBUaGlzCisgICAgICAgY2F1c2VzIHByb2JsZW1zIG9uIGJpZyBlbmRpYW4gbWFjaGluZXMsIHNpbmNlIHRoZSByZXN1bHQgYnVmZmVyCisgICAgICAgYWRkcmVzcyBjYW5ub3Qgc2ltcGx5IGJlIHVzZWQgYXMgcmVzdWx0IHBvaW50ZXIsIGluc3RlYWQgd2UgbXVzdAorICAgICAgIGFkanVzdCB0aGUgcG9pbnRlciB2YWx1ZToKKyAgICAgKi8KKyAgICAvKgorICAgICAgWFhYIEkgc2hvdWxkIGZpbmQgb3V0IGFuZCBjbGFyaWZ5IHdoeSB0aGlzIGlzIG5lZWRlZCBhdCBhbGwsCisgICAgICBlc3BlY2lhbGx5IHdoeSBhZGp1c3RpbmcgZm9yIGZmaV90eXBlX2Zsb2F0IG11c3QgYmUgYXZvaWRlZCBvbgorICAgICAgNjQtYml0IHBsYXRmb3Jtcy4KKyAgICAgKi8KKyAgICBpZiAocnR5cGUtPnR5cGUgIT0gRkZJX1RZUEVfRkxPQVQKKyAgICAgICAgJiYgcnR5cGUtPnR5cGUgIT0gRkZJX1RZUEVfU1RSVUNUCisgICAgICAgICYmIHJ0eXBlLT5zaXplIDwgc2l6ZW9mKGZmaV9hcmcpKQorICAgICAgICByZXNidWYgPSAoY2hhciAqKXJlc2J1ZiArIHNpemVvZihmZmlfYXJnKSAtIHJ0eXBlLT5zaXplOwogI2VuZGlmCiAKICNpZmRlZiBNU19XSU4zMgotCWlmIChpaWQgJiYgcEl1bmspIHsKLQkJaWYgKCooaW50ICopcmVzYnVmICYgMHg4MDAwMDAwMCkKLQkJCXJldHZhbCA9IEdldENvbUVycm9yKCooSFJFU1VMVCAqKXJlc2J1ZiwgaWlkLCBwSXVuayk7Ci0JCWVsc2UKLQkJCXJldHZhbCA9IFB5SW50X0Zyb21Mb25nKCooaW50ICopcmVzYnVmKTsKLQl9IGVsc2UgaWYgKGZsYWdzICYgRlVOQ0ZMQUdfSFJFU1VMVCkgewotCQlpZiAoKihpbnQgKilyZXNidWYgJiAweDgwMDAwMDAwKQotCQkJcmV0dmFsID0gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnIoKihpbnQgKilyZXNidWYpOwotCQllbHNlCi0JCQlyZXR2YWwgPSBQeUludF9Gcm9tTG9uZygqKGludCAqKXJlc2J1Zik7Ci0JfSBlbHNlCisgICAgaWYgKGlpZCAmJiBwSXVuaykgeworICAgICAgICBpZiAoKihpbnQgKilyZXNidWYgJiAweDgwMDAwMDAwKQorICAgICAgICAgICAgcmV0dmFsID0gR2V0Q29tRXJyb3IoKihIUkVTVUxUICopcmVzYnVmLCBpaWQsIHBJdW5rKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dmFsID0gUHlJbnRfRnJvbUxvbmcoKihpbnQgKilyZXNidWYpOworICAgIH0gZWxzZSBpZiAoZmxhZ3MgJiBGVU5DRkxBR19IUkVTVUxUKSB7CisgICAgICAgIGlmICgqKGludCAqKXJlc2J1ZiAmIDB4ODAwMDAwMDApCisgICAgICAgICAgICByZXR2YWwgPSBQeUVycl9TZXRGcm9tV2luZG93c0VycigqKGludCAqKXJlc2J1Zik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHZhbCA9IFB5SW50X0Zyb21Mb25nKCooaW50ICopcmVzYnVmKTsKKyAgICB9IGVsc2UKICNlbmRpZgotCQlyZXR2YWwgPSBHZXRSZXN1bHQocmVzdHlwZSwgcmVzYnVmLCBjaGVja2VyKTsKKyAgICAgICAgcmV0dmFsID0gR2V0UmVzdWx0KHJlc3R5cGUsIHJlc2J1ZiwgY2hlY2tlcik7CiAgIGNsZWFudXA6Ci0JZm9yIChpID0gMDsgaSA8IGFyZ2NvdW50OyArK2kpCi0JCVB5X1hERUNSRUYoYXJnc1tpXS5rZWVwKTsKLQlyZXR1cm4gcmV0dmFsOworICAgIGZvciAoaSA9IDA7IGkgPCBhcmdjb3VudDsgKytpKQorICAgICAgICBQeV9YREVDUkVGKGFyZ3NbaV0ua2VlcCk7CisgICAgcmV0dXJuIHJldHZhbDsKIH0KIAogc3RhdGljIGludAogX3BhcnNlX3ZvaWRwKFB5T2JqZWN0ICpvYmosIHZvaWQgKiphZGRyZXNzKQogewotCSphZGRyZXNzID0gUHlMb25nX0FzVm9pZFB0cihvYmopOwotCWlmICgqYWRkcmVzcyA9PSBOVUxMKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gMTsKKyAgICAqYWRkcmVzcyA9IFB5TG9uZ19Bc1ZvaWRQdHIob2JqKTsKKyAgICBpZiAoKmFkZHJlc3MgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIDE7CiB9CiAKICNpZmRlZiBNU19XSU4zMgpAQCAtMTIzMSwyMSArMTIzMSwyMSBAQAogZ2l2ZW4sIHRoZSByZXR1cm4gdmFsdWUgb2YgYSBjYWxsIHRvIEdldExhc3RFcnJvcigpIGlzIHVzZWQuXG4iOwogc3RhdGljIFB5T2JqZWN0ICpmb3JtYXRfZXJyb3IoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICpyZXN1bHQ7Ci0JVENIQVIgKmxwTXNnQnVmOwotCURXT1JEIGNvZGUgPSAwOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifGk6Rm9ybWF0RXJyb3IiLCAmY29kZSkpCi0JCXJldHVybiBOVUxMOwotCWlmIChjb2RlID09IDApCi0JCWNvZGUgPSBHZXRMYXN0RXJyb3IoKTsKLQlscE1zZ0J1ZiA9IEZvcm1hdEVycm9yKGNvZGUpOwotCWlmIChscE1zZ0J1ZikgewotCQlyZXN1bHQgPSBQeV9CdWlsZFZhbHVlKFBZQlVJTERfVFNUUiwgbHBNc2dCdWYpOwotCQlMb2NhbEZyZWUobHBNc2dCdWYpOwotCX0gZWxzZSB7Ci0JCXJlc3VsdCA9IFB5X0J1aWxkVmFsdWUoInMiLCAiPG5vIGRlc2NyaXB0aW9uPiIpOwotCX0KLQlyZXR1cm4gcmVzdWx0OworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisgICAgVENIQVIgKmxwTXNnQnVmOworICAgIERXT1JEIGNvZGUgPSAwOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifGk6Rm9ybWF0RXJyb3IiLCAmY29kZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChjb2RlID09IDApCisgICAgICAgIGNvZGUgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICBscE1zZ0J1ZiA9IEZvcm1hdEVycm9yKGNvZGUpOworICAgIGlmIChscE1zZ0J1ZikgeworICAgICAgICByZXN1bHQgPSBQeV9CdWlsZFZhbHVlKFBZQlVJTERfVFNUUiwgbHBNc2dCdWYpOworICAgICAgICBMb2NhbEZyZWUobHBNc2dCdWYpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJlc3VsdCA9IFB5X0J1aWxkVmFsdWUoInMiLCAiPG5vIGRlc2NyaXB0aW9uPiIpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgY2hhciBsb2FkX2xpYnJhcnlfZG9jW10gPQpAQCAtMTI1Niw0MCArMTI1Niw0MCBAQAogbW9kdWxlLlxuIjsKIHN0YXRpYyBQeU9iamVjdCAqbG9hZF9saWJyYXJ5KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlUQ0hBUiAqbmFtZTsKLQlQeU9iamVjdCAqbmFtZW9iajsKLQlQeU9iamVjdCAqaWdub3JlZDsKLQlITU9EVUxFIGhNb2Q7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfE86TG9hZExpYnJhcnkiLCAmbmFtZW9iaiwgJmlnbm9yZWQpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBUQ0hBUiAqbmFtZTsKKyAgICBQeU9iamVjdCAqbmFtZW9iajsKKyAgICBQeU9iamVjdCAqaWdub3JlZDsKKyAgICBITU9EVUxFIGhNb2Q7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfE86TG9hZExpYnJhcnkiLCAmbmFtZW9iaiwgJmlnbm9yZWQpKQorICAgICAgICByZXR1cm4gTlVMTDsKICNpZmRlZiBfVU5JQ09ERQotCW5hbWUgPSBhbGxvY2EoKFB5U3RyaW5nX1NpemUobmFtZW9iaikgKyAxKSAqIHNpemVvZihXQ0hBUikpOwotCWlmICghbmFtZSkgewotCQlQeUVycl9Ob01lbW9yeSgpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgbmFtZSA9IGFsbG9jYSgoUHlTdHJpbmdfU2l6ZShuYW1lb2JqKSArIDEpICogc2l6ZW9mKFdDSEFSKSk7CisgICAgaWYgKCFuYW1lKSB7CisgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXsKLQkJaW50IHI7Ci0JCWNoYXIgKmFuYW1lID0gUHlTdHJpbmdfQXNTdHJpbmcobmFtZW9iaik7Ci0JCWlmKCFhbmFtZSkKLQkJCXJldHVybiBOVUxMOwotCQlyID0gTXVsdGlCeXRlVG9XaWRlQ2hhcihDUF9BQ1AsIDAsIGFuYW1lLCAtMSwgbmFtZSwgUHlTdHJpbmdfU2l6ZShuYW1lb2JqKSArIDEpOwotCQluYW1lW3JdID0gMDsKLQl9CisgICAgeworICAgICAgICBpbnQgcjsKKyAgICAgICAgY2hhciAqYW5hbWUgPSBQeVN0cmluZ19Bc1N0cmluZyhuYW1lb2JqKTsKKyAgICAgICAgaWYoIWFuYW1lKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHIgPSBNdWx0aUJ5dGVUb1dpZGVDaGFyKENQX0FDUCwgMCwgYW5hbWUsIC0xLCBuYW1lLCBQeVN0cmluZ19TaXplKG5hbWVvYmopICsgMSk7CisgICAgICAgIG5hbWVbcl0gPSAwOworICAgIH0KICNlbHNlCi0JbmFtZSA9IFB5U3RyaW5nX0FzU3RyaW5nKG5hbWVvYmopOwotCWlmKCFuYW1lKQotCQlyZXR1cm4gTlVMTDsKKyAgICBuYW1lID0gUHlTdHJpbmdfQXNTdHJpbmcobmFtZW9iaik7CisgICAgaWYoIW5hbWUpCisgICAgICAgIHJldHVybiBOVUxMOwogI2VuZGlmCiAKLQloTW9kID0gTG9hZExpYnJhcnkobmFtZSk7Ci0JaWYgKCFoTW9kKQotCQlyZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnIoR2V0TGFzdEVycm9yKCkpOworICAgIGhNb2QgPSBMb2FkTGlicmFyeShuYW1lKTsKKyAgICBpZiAoIWhNb2QpCisgICAgICAgIHJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0VycihHZXRMYXN0RXJyb3IoKSk7CiAjaWZkZWYgX1dJTjY0Ci0JcmV0dXJuIFB5TG9uZ19Gcm9tVm9pZFB0cihoTW9kKTsKKyAgICByZXR1cm4gUHlMb25nX0Zyb21Wb2lkUHRyKGhNb2QpOwogI2Vsc2UKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIGhNb2QpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJpIiwgaE1vZCk7CiAjZW5kaWYKIH0KIApAQCAtMTI5OSwxMyArMTI5OSwxMyBAQAogRnJlZSB0aGUgaGFuZGxlIG9mIGFuIGV4ZWN1dGFibGUgcHJldmlvdXNseSBsb2FkZWQgYnkgTG9hZExpYnJhcnkuXG4iOwogc3RhdGljIFB5T2JqZWN0ICpmcmVlX2xpYnJhcnkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXZvaWQgKmhNb2Q7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJjpGcmVlTGlicmFyeSIsICZfcGFyc2Vfdm9pZHAsICZoTW9kKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFGcmVlTGlicmFyeSgoSE1PRFVMRSloTW9kKSkKLQkJcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyKEdldExhc3RFcnJvcigpKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgdm9pZCAqaE1vZDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mOkZyZWVMaWJyYXJ5IiwgJl9wYXJzZV92b2lkcCwgJmhNb2QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIUZyZWVMaWJyYXJ5KChITU9EVUxFKWhNb2QpKQorICAgICAgICByZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnIoR2V0TGFzdEVycm9yKCkpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogb2Jzb2xldGUsIHNob3VsZCBiZSByZW1vdmVkICovCkBAIC0xMzEzLDU1ICsxMzEzLDU1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogY2FsbF9jb21tZXRob2QoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCUlVbmtub3duICpwSXVuazsKLQlpbnQgaW5kZXg7Ci0JUHlPYmplY3QgKmFyZ3VtZW50czsKLQlQUFJPQyAqbHBWdGJsOwotCVB5T2JqZWN0ICpyZXN1bHQ7Ci0JQ0RhdGFPYmplY3QgKnBjb207Ci0JUHlPYmplY3QgKmFyZ3R5cGVzID0gTlVMTDsKKyAgICBJVW5rbm93biAqcEl1bms7CisgICAgaW50IGluZGV4OworICAgIFB5T2JqZWN0ICphcmd1bWVudHM7CisgICAgUFBST0MgKmxwVnRibDsKKyAgICBQeU9iamVjdCAqcmVzdWx0OworICAgIENEYXRhT2JqZWN0ICpwY29tOworICAgIFB5T2JqZWN0ICphcmd0eXBlcyA9IE5VTEw7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywKLQkJCSAgICAgICJPaU8hfE8hIiwKLQkJCSAgICAgICZwY29tLCAmaW5kZXgsCi0JCQkgICAgICAmUHlUdXBsZV9UeXBlLCAmYXJndW1lbnRzLAotCQkJICAgICAgJlB5VHVwbGVfVHlwZSwgJmFyZ3R5cGVzKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJPaU8hfE8hIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBjb20sICZpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJlB5VHVwbGVfVHlwZSwgJmFyZ3VtZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJlB5VHVwbGVfVHlwZSwgJmFyZ3R5cGVzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoYXJndHlwZXMgJiYgKFB5VHVwbGVfR0VUX1NJWkUoYXJndW1lbnRzKSAhPSBQeVR1cGxlX0dFVF9TSVpFKGFyZ3R5cGVzKSkpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAgIk1ldGhvZCB0YWtlcyAlZCBhcmd1bWVudHMgKCVkIGdpdmVuKSIsCi0JCQkgICAgIFB5VHVwbGVfR0VUX1NJWkUoYXJndHlwZXMpLCBQeVR1cGxlX0dFVF9TSVpFKGFyZ3VtZW50cykpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKGFyZ3R5cGVzICYmIChQeVR1cGxlX0dFVF9TSVpFKGFyZ3VtZW50cykgIT0gUHlUdXBsZV9HRVRfU0laRShhcmd0eXBlcykpKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiTWV0aG9kIHRha2VzICVkIGFyZ3VtZW50cyAoJWQgZ2l2ZW4pIiwKKyAgICAgICAgICAgICAgICAgICAgIFB5VHVwbGVfR0VUX1NJWkUoYXJndHlwZXMpLCBQeVR1cGxlX0dFVF9TSVpFKGFyZ3VtZW50cykpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlpZiAoIUNEYXRhT2JqZWN0X0NoZWNrKHBjb20pIHx8IChwY29tLT5iX3NpemUgIT0gc2l6ZW9mKHZvaWQgKikpKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgICJDT00gUG9pbnRlciBleHBlY3RlZCBpbnN0ZWFkIG9mICVzIGluc3RhbmNlIiwKLQkJCSAgICAgUHlfVFlQRShwY29tKS0+dHBfbmFtZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoIUNEYXRhT2JqZWN0X0NoZWNrKHBjb20pIHx8IChwY29tLT5iX3NpemUgIT0gc2l6ZW9mKHZvaWQgKikpKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiQ09NIFBvaW50ZXIgZXhwZWN0ZWQgaW5zdGVhZCBvZiAlcyBpbnN0YW5jZSIsCisgICAgICAgICAgICAgICAgICAgICBQeV9UWVBFKHBjb20pLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaWYgKCgqKHZvaWQgKiopKHBjb20tPmJfcHRyKSkgPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkiVGhlIENPTSAndGhpcycgcG9pbnRlciBpcyBOVUxMIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoKCoodm9pZCAqKikocGNvbS0+Yl9wdHIpKSA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSBDT00gJ3RoaXMnIHBvaW50ZXIgaXMgTlVMTCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlwSXVuayA9IChJVW5rbm93biAqKSgqKHZvaWQgKiopKHBjb20tPmJfcHRyKSk7Ci0JbHBWdGJsID0gKFBQUk9DICopKHBJdW5rLT5scFZ0YmwpOworICAgIHBJdW5rID0gKElVbmtub3duICopKCoodm9pZCAqKikocGNvbS0+Yl9wdHIpKTsKKyAgICBscFZ0YmwgPSAoUFBST0MgKikocEl1bmstPmxwVnRibCk7CiAKLQlyZXN1bHQgPSAgX0NhbGxQcm9jKGxwVnRibFtpbmRleF0sCi0JCQkgICAgYXJndW1lbnRzLAorICAgIHJlc3VsdCA9ICBfQ2FsbFByb2MobHBWdGJsW2luZGV4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50cywKICNpZmRlZiBNU19XSU4zMgotCQkJICAgIHBJdW5rLAotCQkJICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICBwSXVuaywKKyAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCiAjZW5kaWYKLQkJCSAgICBGVU5DRkxBR19IUkVTVUxULCAvKiBmbGFncyAqLwotCQkJICAgIGFyZ3R5cGVzLCAvKiBzZWxmLT5hcmd0eXBlcyAqLwotCQkJICAgIE5VTEwsIC8qIHNlbGYtPnJlc3R5cGUgKi8KLQkJCSAgICBOVUxMKTsgLyogY2hlY2tlciAqLwotCXJldHVybiByZXN1bHQ7CisgICAgICAgICAgICAgICAgICAgICAgICBGVU5DRkxBR19IUkVTVUxULCAvKiBmbGFncyAqLworICAgICAgICAgICAgICAgIGFyZ3R5cGVzLCAvKiBzZWxmLT5hcmd0eXBlcyAqLworICAgICAgICAgICAgICAgIE5VTEwsIC8qIHNlbGYtPnJlc3R5cGUgKi8KKyAgICAgICAgICAgICAgICBOVUxMKTsgLyogY2hlY2tlciAqLworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBjaGFyIGNvcHlfY29tX3BvaW50ZXJfZG9jW10gPQpAQCAtMTM3MCw4OSArMTM3MCw4OSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGNvcHlfY29tX3BvaW50ZXIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICpwMSwgKnAyLCAqciA9IE5VTEw7Ci0Jc3RydWN0IGFyZ3VtZW50IGEsIGI7Ci0JSVVua25vd24gKnNyYywgKipwZHN0OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT086Q29weUNvbVBvaW50ZXIiLCAmcDEsICZwMikpCi0JCXJldHVybiBOVUxMOwotCWEua2VlcCA9IGIua2VlcCA9IE5VTEw7CisgICAgUHlPYmplY3QgKnAxLCAqcDIsICpyID0gTlVMTDsKKyAgICBzdHJ1Y3QgYXJndW1lbnQgYSwgYjsKKyAgICBJVW5rbm93biAqc3JjLCAqKnBkc3Q7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPTzpDb3B5Q29tUG9pbnRlciIsICZwMSwgJnAyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYS5rZWVwID0gYi5rZWVwID0gTlVMTDsKIAotCWlmICgtMSA9PSBDb252UGFyYW0ocDEsIDAsICZhKSB8fCAtMSA9PSBDb252UGFyYW0ocDIsIDEsICZiKSkKLQkJZ290byBkb25lOwotCXNyYyA9IChJVW5rbm93biAqKWEudmFsdWUucDsKLQlwZHN0ID0gKElVbmtub3duICoqKWIudmFsdWUucDsKKyAgICBpZiAoLTEgPT0gQ29udlBhcmFtKHAxLCAwLCAmYSkgfHwgLTEgPT0gQ29udlBhcmFtKHAyLCAxLCAmYikpCisgICAgICAgIGdvdG8gZG9uZTsKKyAgICBzcmMgPSAoSVVua25vd24gKilhLnZhbHVlLnA7CisgICAgcGRzdCA9IChJVW5rbm93biAqKiliLnZhbHVlLnA7CiAKLQlpZiAocGRzdCA9PSBOVUxMKQotCQlyID0gUHlJbnRfRnJvbUxvbmcoRV9QT0lOVEVSKTsKLQllbHNlIHsKLQkJaWYgKHNyYykKLQkJCXNyYy0+bHBWdGJsLT5BZGRSZWYoc3JjKTsKLQkJKnBkc3QgPSBzcmM7Ci0JCXIgPSBQeUludF9Gcm9tTG9uZyhTX09LKTsKLQl9CisgICAgaWYgKHBkc3QgPT0gTlVMTCkKKyAgICAgICAgciA9IFB5SW50X0Zyb21Mb25nKEVfUE9JTlRFUik7CisgICAgZWxzZSB7CisgICAgICAgIGlmIChzcmMpCisgICAgICAgICAgICBzcmMtPmxwVnRibC0+QWRkUmVmKHNyYyk7CisgICAgICAgICpwZHN0ID0gc3JjOworICAgICAgICByID0gUHlJbnRfRnJvbUxvbmcoU19PSyk7CisgICAgfQogICBkb25lOgotCVB5X1hERUNSRUYoYS5rZWVwKTsKLQlQeV9YREVDUkVGKGIua2VlcCk7Ci0JcmV0dXJuIHI7CisgICAgUHlfWERFQ1JFRihhLmtlZXApOworICAgIFB5X1hERUNSRUYoYi5rZWVwKTsKKyAgICByZXR1cm4gcjsKIH0KICNlbHNlCiAKIHN0YXRpYyBQeU9iamVjdCAqcHlfZGxfb3BlbihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqbmFtZTsKLQl2b2lkICogaGFuZGxlOwotI2lmZGVmIFJUTERfTE9DQUwJCi0JaW50IG1vZGUgPSBSVExEX05PVyB8IFJUTERfTE9DQUw7CisgICAgY2hhciAqbmFtZTsKKyAgICB2b2lkICogaGFuZGxlOworI2lmZGVmIFJUTERfTE9DQUwKKyAgICBpbnQgbW9kZSA9IFJUTERfTk9XIHwgUlRMRF9MT0NBTDsKICNlbHNlCi0JLyogY3lnd2luIGRvZXNuJ3QgZGVmaW5lIFJUTERfTE9DQUwgKi8KLQlpbnQgbW9kZSA9IFJUTERfTk9XOworICAgIC8qIGN5Z3dpbiBkb2Vzbid0IGRlZmluZSBSVExEX0xPQ0FMICovCisgICAgaW50IG1vZGUgPSBSVExEX05PVzsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAienxpOmRsb3BlbiIsICZuYW1lLCAmbW9kZSkpCi0JCXJldHVybiBOVUxMOwotCW1vZGUgfD0gUlRMRF9OT1c7Ci0JaGFuZGxlID0gY3R5cGVzX2Rsb3BlbihuYW1lLCBtb2RlKTsKLQlpZiAoIWhhbmRsZSkgewotCQljaGFyICplcnJtc2cgPSBjdHlwZXNfZGxlcnJvcigpOwotCQlpZiAoIWVycm1zZykKLQkJCWVycm1zZyA9ICJkbG9wZW4oKSBlcnJvciI7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PU0Vycm9yLAotCQkJCSAgICAgICBlcnJtc2cpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIFB5TG9uZ19Gcm9tVm9pZFB0cihoYW5kbGUpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAienxpOmRsb3BlbiIsICZuYW1lLCAmbW9kZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG1vZGUgfD0gUlRMRF9OT1c7CisgICAgaGFuZGxlID0gY3R5cGVzX2Rsb3BlbihuYW1lLCBtb2RlKTsKKyAgICBpZiAoIWhhbmRsZSkgeworICAgICAgICBjaGFyICplcnJtc2cgPSBjdHlwZXNfZGxlcnJvcigpOworICAgICAgICBpZiAoIWVycm1zZykKKyAgICAgICAgICAgIGVycm1zZyA9ICJkbG9wZW4oKSBlcnJvciI7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PU0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm1zZyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlMb25nX0Zyb21Wb2lkUHRyKGhhbmRsZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqcHlfZGxfY2xvc2UoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXZvaWQgKmhhbmRsZTsKKyAgICB2b2lkICpoYW5kbGU7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mOmRsY2xvc2UiLCAmX3BhcnNlX3ZvaWRwLCAmaGFuZGxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKGRsY2xvc2UoaGFuZGxlKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT1NFcnJvciwKLQkJCQkgICAgICAgY3R5cGVzX2RsZXJyb3IoKSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJjpkbGNsb3NlIiwgJl9wYXJzZV92b2lkcCwgJmhhbmRsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChkbGNsb3NlKGhhbmRsZSkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX09TRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R5cGVzX2RsZXJyb3IoKSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqcHlfZGxfc3ltKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpuYW1lOwotCXZvaWQgKmhhbmRsZTsKLQl2b2lkICpwdHI7CisgICAgY2hhciAqbmFtZTsKKyAgICB2b2lkICpoYW5kbGU7CisgICAgdm9pZCAqcHRyOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJnM6ZGxzeW0iLAotCQkJICAgICAgJl9wYXJzZV92b2lkcCwgJmhhbmRsZSwgJm5hbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlwdHIgPSBjdHlwZXNfZGxzeW0oKHZvaWQqKWhhbmRsZSwgbmFtZSk7Ci0JaWYgKCFwdHIpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX09TRXJyb3IsCi0JCQkJICAgICAgIGN0eXBlc19kbGVycm9yKCkpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIFB5TG9uZ19Gcm9tVm9pZFB0cihwdHIpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyZzOmRsc3ltIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJl9wYXJzZV92b2lkcCwgJmhhbmRsZSwgJm5hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBwdHIgPSBjdHlwZXNfZGxzeW0oKHZvaWQqKWhhbmRsZSwgbmFtZSk7CisgICAgaWYgKCFwdHIpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX09TRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R5cGVzX2RsZXJyb3IoKSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlMb25nX0Zyb21Wb2lkUHRyKHB0cik7CiB9CiAjZW5kaWYKIApAQCAtMTQ2NCwyNyArMTQ2NCwyNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGNhbGxfZnVuY3Rpb24oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXZvaWQgKmZ1bmM7Ci0JUHlPYmplY3QgKmFyZ3VtZW50czsKLQlQeU9iamVjdCAqcmVzdWx0OworICAgIHZvaWQgKmZ1bmM7CisgICAgUHlPYmplY3QgKmFyZ3VtZW50czsKKyAgICBQeU9iamVjdCAqcmVzdWx0OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsCi0JCQkgICAgICAiTyZPISIsCi0JCQkgICAgICAmX3BhcnNlX3ZvaWRwLCAmZnVuYywKLQkJCSAgICAgICZQeVR1cGxlX1R5cGUsICZhcmd1bWVudHMpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIk8mTyEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmX3BhcnNlX3ZvaWRwLCAmZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJlB5VHVwbGVfVHlwZSwgJmFyZ3VtZW50cykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JcmVzdWx0ID0gIF9DYWxsUHJvYygoUFBST0MpZnVuYywKLQkJCSAgICBhcmd1bWVudHMsCisgICAgcmVzdWx0ID0gIF9DYWxsUHJvYygoUFBST0MpZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50cywKICNpZmRlZiBNU19XSU4zMgotCQkJICAgIE5VTEwsCi0JCQkgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAogI2VuZGlmCi0JCQkgICAgMCwgLyogZmxhZ3MgKi8KLQkJCSAgICBOVUxMLCAvKiBzZWxmLT5hcmd0eXBlcyAqLwotCQkJICAgIE5VTEwsIC8qIHNlbGYtPnJlc3R5cGUgKi8KLQkJCSAgICBOVUxMKTsgLyogY2hlY2tlciAqLwotCXJldHVybiByZXN1bHQ7CisgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKiBmbGFncyAqLworICAgICAgICAgICAgICAgIE5VTEwsIC8qIHNlbGYtPmFyZ3R5cGVzICovCisgICAgICAgICAgICAgICAgTlVMTCwgLyogc2VsZi0+cmVzdHlwZSAqLworICAgICAgICAgICAgICAgIE5VTEwpOyAvKiBjaGVja2VyICovCisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogLyoKQEAgLTE0OTUsMjcgKzE0OTUsMjcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBjYWxsX2NkZWNsZnVuY3Rpb24oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXZvaWQgKmZ1bmM7Ci0JUHlPYmplY3QgKmFyZ3VtZW50czsKLQlQeU9iamVjdCAqcmVzdWx0OworICAgIHZvaWQgKmZ1bmM7CisgICAgUHlPYmplY3QgKmFyZ3VtZW50czsKKyAgICBQeU9iamVjdCAqcmVzdWx0OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsCi0JCQkgICAgICAiTyZPISIsCi0JCQkgICAgICAmX3BhcnNlX3ZvaWRwLCAmZnVuYywKLQkJCSAgICAgICZQeVR1cGxlX1R5cGUsICZhcmd1bWVudHMpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIk8mTyEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmX3BhcnNlX3ZvaWRwLCAmZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJlB5VHVwbGVfVHlwZSwgJmFyZ3VtZW50cykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JcmVzdWx0ID0gIF9DYWxsUHJvYygoUFBST0MpZnVuYywKLQkJCSAgICBhcmd1bWVudHMsCisgICAgcmVzdWx0ID0gIF9DYWxsUHJvYygoUFBST0MpZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50cywKICNpZmRlZiBNU19XSU4zMgotCQkJICAgIE5VTEwsCi0JCQkgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAogI2VuZGlmCi0JCQkgICAgRlVOQ0ZMQUdfQ0RFQ0wsIC8qIGZsYWdzICovCi0JCQkgICAgTlVMTCwgLyogc2VsZi0+YXJndHlwZXMgKi8KLQkJCSAgICBOVUxMLCAvKiBzZWxmLT5yZXN0eXBlICovCi0JCQkgICAgTlVMTCk7IC8qIGNoZWNrZXIgKi8KLQlyZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgICAgICAgICAgICAgRlVOQ0ZMQUdfQ0RFQ0wsIC8qIGZsYWdzICovCisgICAgICAgICAgICAgICAgTlVMTCwgLyogc2VsZi0+YXJndHlwZXMgKi8KKyAgICAgICAgICAgICAgICBOVUxMLCAvKiBzZWxmLT5yZXN0eXBlICovCisgICAgICAgICAgICAgICAgTlVMTCk7IC8qIGNoZWNrZXIgKi8KKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTE1MjksMTcgKzE1MjksMTcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzaXplb2ZfZnVuYyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm9iaikKIHsKLQlTdGdEaWN0T2JqZWN0ICpkaWN0OworICAgIFN0Z0RpY3RPYmplY3QgKmRpY3Q7CiAKLQlkaWN0ID0gUHlUeXBlX3N0Z2RpY3Qob2JqKTsKLQlpZiAoZGljdCkKLQkJcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KGRpY3QtPnNpemUpOworICAgIGRpY3QgPSBQeVR5cGVfc3RnZGljdChvYmopOworICAgIGlmIChkaWN0KQorICAgICAgICByZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QoZGljdC0+c2l6ZSk7CiAKLQlpZiAoQ0RhdGFPYmplY3RfQ2hlY2sob2JqKSkKLQkJcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KCgoQ0RhdGFPYmplY3QgKilvYmopLT5iX3NpemUpOwotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkidGhpcyB0eXBlIGhhcyBubyBzaXplIik7Ci0JcmV0dXJuIE5VTEw7CisgICAgaWYgKENEYXRhT2JqZWN0X0NoZWNrKG9iaikpCisgICAgICAgIHJldHVybiBQeUludF9Gcm9tU3NpemVfdCgoKENEYXRhT2JqZWN0ICopb2JqKS0+Yl9zaXplKTsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAidGhpcyB0eXBlIGhhcyBubyBzaXplIik7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBjaGFyIGFsaWdubWVudF9kb2NbXSA9CkBAIC0xNTUwLDE5ICsxNTUwLDE5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYWxpZ25fZnVuYyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm9iaikKIHsKLQlTdGdEaWN0T2JqZWN0ICpkaWN0OworICAgIFN0Z0RpY3RPYmplY3QgKmRpY3Q7CiAKLQlkaWN0ID0gUHlUeXBlX3N0Z2RpY3Qob2JqKTsKLQlpZiAoZGljdCkKLQkJcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KGRpY3QtPmFsaWduKTsKKyAgICBkaWN0ID0gUHlUeXBlX3N0Z2RpY3Qob2JqKTsKKyAgICBpZiAoZGljdCkKKyAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KGRpY3QtPmFsaWduKTsKIAotCWRpY3QgPSBQeU9iamVjdF9zdGdkaWN0KG9iaik7Ci0JaWYgKGRpY3QpCi0JCXJldHVybiBQeUludF9Gcm9tU3NpemVfdChkaWN0LT5hbGlnbik7CisgICAgZGljdCA9IFB5T2JqZWN0X3N0Z2RpY3Qob2JqKTsKKyAgICBpZiAoZGljdCkKKyAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KGRpY3QtPmFsaWduKTsKIAotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkibm8gYWxpZ25tZW50IGluZm8iKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAibm8gYWxpZ25tZW50IGluZm8iKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIGNoYXIgYnlyZWZfZG9jW10gPQpAQCAtMTU3NywzNiArMTU3NywzNiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGJ5cmVmKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeUNBcmdPYmplY3QgKnBhcmc7Ci0JUHlPYmplY3QgKm9iajsKLQlQeU9iamVjdCAqcHlvZmZzZXQgPSBOVUxMOwotCVB5X3NzaXplX3Qgb2Zmc2V0ID0gMDsKKyAgICBQeUNBcmdPYmplY3QgKnBhcmc7CisgICAgUHlPYmplY3QgKm9iajsKKyAgICBQeU9iamVjdCAqcHlvZmZzZXQgPSBOVUxMOworICAgIFB5X3NzaXplX3Qgb2Zmc2V0ID0gMDsKIAotCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImJ5cmVmIiwgMSwgMiwKLQkJCSAgICAgICAmb2JqLCAmcHlvZmZzZXQpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAocHlvZmZzZXQpIHsKLQkJb2Zmc2V0ID0gUHlOdW1iZXJfQXNTc2l6ZV90KHB5b2Zmc2V0LCBOVUxMKTsKLQkJaWYgKG9mZnNldCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmICghQ0RhdGFPYmplY3RfQ2hlY2sob2JqKSkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJICAgICAiYnlyZWYoKSBhcmd1bWVudCBtdXN0IGJlIGEgY3R5cGVzIGluc3RhbmNlLCBub3QgJyVzJyIsCi0JCQkgICAgIFB5X1RZUEUob2JqKS0+dHBfbmFtZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJieXJlZiIsIDEsIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2JqLCAmcHlvZmZzZXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAocHlvZmZzZXQpIHsKKyAgICAgICAgb2Zmc2V0ID0gUHlOdW1iZXJfQXNTc2l6ZV90KHB5b2Zmc2V0LCBOVUxMKTsKKyAgICAgICAgaWYgKG9mZnNldCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmICghQ0RhdGFPYmplY3RfQ2hlY2sob2JqKSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgImJ5cmVmKCkgYXJndW1lbnQgbXVzdCBiZSBhIGN0eXBlcyBpbnN0YW5jZSwgbm90ICclcyciLAorICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRShvYmopLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JcGFyZyA9IG5ld19DQXJnT2JqZWN0KCk7Ci0JaWYgKHBhcmcgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgcGFyZyA9IG5ld19DQXJnT2JqZWN0KCk7CisgICAgaWYgKHBhcmcgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlwYXJnLT50YWcgPSAnUCc7Ci0JcGFyZy0+cGZmaV90eXBlID0gJmZmaV90eXBlX3BvaW50ZXI7Ci0JUHlfSU5DUkVGKG9iaik7Ci0JcGFyZy0+b2JqID0gb2JqOwotCXBhcmctPnZhbHVlLnAgPSAoY2hhciAqKSgoQ0RhdGFPYmplY3QgKilvYmopLT5iX3B0ciArIG9mZnNldDsKLQlyZXR1cm4gKFB5T2JqZWN0ICopcGFyZzsKKyAgICBwYXJnLT50YWcgPSAnUCc7CisgICAgcGFyZy0+cGZmaV90eXBlID0gJmZmaV90eXBlX3BvaW50ZXI7CisgICAgUHlfSU5DUkVGKG9iaik7CisgICAgcGFyZy0+b2JqID0gb2JqOworICAgIHBhcmctPnZhbHVlLnAgPSAoY2hhciAqKSgoQ0RhdGFPYmplY3QgKilvYmopLT5iX3B0ciArIG9mZnNldDsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopcGFyZzsKIH0KIAogc3RhdGljIGNoYXIgYWRkcmVzc29mX2RvY1tdID0KQEAgLTE2MTYsNDQgKzE2MTYsNDQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBhZGRyZXNzb2YoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpvYmopCiB7Ci0JaWYgKENEYXRhT2JqZWN0X0NoZWNrKG9iaikpCi0JCXJldHVybiBQeUxvbmdfRnJvbVZvaWRQdHIoKChDRGF0YU9iamVjdCAqKW9iaiktPmJfcHRyKTsKLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJImludmFsaWQgdHlwZSIpOwotCXJldHVybiBOVUxMOworICAgIGlmIChDRGF0YU9iamVjdF9DaGVjayhvYmopKQorICAgICAgICByZXR1cm4gUHlMb25nX0Zyb21Wb2lkUHRyKCgoQ0RhdGFPYmplY3QgKilvYmopLT5iX3B0cik7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgImludmFsaWQgdHlwZSIpOworICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgaW50CiBjb252ZXJ0ZXIoUHlPYmplY3QgKm9iaiwgdm9pZCAqKmFkZHJlc3MpCiB7Ci0JKmFkZHJlc3MgPSBQeUxvbmdfQXNWb2lkUHRyKG9iaik7Ci0JcmV0dXJuICphZGRyZXNzICE9IE5VTEw7CisgICAgKmFkZHJlc3MgPSBQeUxvbmdfQXNWb2lkUHRyKG9iaik7CisgICAgcmV0dXJuICphZGRyZXNzICE9IE5VTEw7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBNeV9QeU9ial9Gcm9tUHRyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqb2I7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJjpQeU9ial9Gcm9tUHRyIiwgY29udmVydGVyLCAmb2IpKQotCQlyZXR1cm4gTlVMTDsKLQlQeV9JTkNSRUYob2IpOwotCXJldHVybiBvYjsKKyAgICBQeU9iamVjdCAqb2I7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJjpQeU9ial9Gcm9tUHRyIiwgY29udmVydGVyLCAmb2IpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQeV9JTkNSRUYob2IpOworICAgIHJldHVybiBvYjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIE15X1B5X0lOQ1JFRihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZykKIHsKLQlQeV9JTkNSRUYoYXJnKTsgLyogdGhhdCdzIHdoYXQgdGhpcyBmdW5jdGlvbiBpcyBmb3IgKi8KLQlQeV9JTkNSRUYoYXJnKTsgLyogdGhhdCBmb3IgcmV0dXJuaW5nIGl0ICovCi0JcmV0dXJuIGFyZzsKKyAgICBQeV9JTkNSRUYoYXJnKTsgLyogdGhhdCdzIHdoYXQgdGhpcyBmdW5jdGlvbiBpcyBmb3IgKi8KKyAgICBQeV9JTkNSRUYoYXJnKTsgLyogdGhhdCBmb3IgcmV0dXJuaW5nIGl0ICovCisgICAgcmV0dXJuIGFyZzsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIE15X1B5X0RFQ1JFRihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZykKIHsKLQlQeV9ERUNSRUYoYXJnKTsgLyogdGhhdCdzIHdoYXQgdGhpcyBmdW5jdGlvbiBpcyBmb3IgKi8KLQlQeV9JTkNSRUYoYXJnKTsgLyogdGhhdCdzIGZvciByZXR1cm5pbmcgaXQgKi8KLQlyZXR1cm4gYXJnOworICAgIFB5X0RFQ1JFRihhcmcpOyAvKiB0aGF0J3Mgd2hhdCB0aGlzIGZ1bmN0aW9uIGlzIGZvciAqLworICAgIFB5X0lOQ1JFRihhcmcpOyAvKiB0aGF0J3MgZm9yIHJldHVybmluZyBpdCAqLworICAgIHJldHVybiBhcmc7CiB9CiAKICNpZmRlZiBDVFlQRVNfVU5JQ09ERQpAQCAtMTY2NywyNDIgKzE2NjcsMjQyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogc2V0X2NvbnZlcnNpb25fbW9kZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqY29kaW5nLCAqbW9kZTsKLQlQeU9iamVjdCAqcmVzdWx0OworICAgIGNoYXIgKmNvZGluZywgKm1vZGU7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAienM6c2V0X2NvbnZlcnNpb25fbW9kZSIsICZjb2RpbmcsICZtb2RlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmVzdWx0ID0gUHlfQnVpbGRWYWx1ZSgiKHp6KSIsIGNvbnZlcnNpb25fbW9kZV9lbmNvZGluZywgY29udmVyc2lvbl9tb2RlX2Vycm9ycyk7Ci0JaWYgKGNvZGluZykgewotCQlQeU1lbV9GcmVlKGNvbnZlcnNpb25fbW9kZV9lbmNvZGluZyk7Ci0JCWNvbnZlcnNpb25fbW9kZV9lbmNvZGluZyA9IFB5TWVtX01hbGxvYyhzdHJsZW4oY29kaW5nKSArIDEpOwotCQlzdHJjcHkoY29udmVyc2lvbl9tb2RlX2VuY29kaW5nLCBjb2RpbmcpOwotCX0gZWxzZSB7Ci0JCWNvbnZlcnNpb25fbW9kZV9lbmNvZGluZyA9IE5VTEw7Ci0JfQotCVB5TWVtX0ZyZWUoY29udmVyc2lvbl9tb2RlX2Vycm9ycyk7Ci0JY29udmVyc2lvbl9tb2RlX2Vycm9ycyA9IFB5TWVtX01hbGxvYyhzdHJsZW4obW9kZSkgKyAxKTsKLQlzdHJjcHkoY29udmVyc2lvbl9tb2RlX2Vycm9ycywgbW9kZSk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInpzOnNldF9jb252ZXJzaW9uX21vZGUiLCAmY29kaW5nLCAmbW9kZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJlc3VsdCA9IFB5X0J1aWxkVmFsdWUoIih6eikiLCBjb252ZXJzaW9uX21vZGVfZW5jb2RpbmcsIGNvbnZlcnNpb25fbW9kZV9lcnJvcnMpOworICAgIGlmIChjb2RpbmcpIHsKKyAgICAgICAgUHlNZW1fRnJlZShjb252ZXJzaW9uX21vZGVfZW5jb2RpbmcpOworICAgICAgICBjb252ZXJzaW9uX21vZGVfZW5jb2RpbmcgPSBQeU1lbV9NYWxsb2Moc3RybGVuKGNvZGluZykgKyAxKTsKKyAgICAgICAgc3RyY3B5KGNvbnZlcnNpb25fbW9kZV9lbmNvZGluZywgY29kaW5nKTsKKyAgICB9IGVsc2UgeworICAgICAgICBjb252ZXJzaW9uX21vZGVfZW5jb2RpbmcgPSBOVUxMOworICAgIH0KKyAgICBQeU1lbV9GcmVlKGNvbnZlcnNpb25fbW9kZV9lcnJvcnMpOworICAgIGNvbnZlcnNpb25fbW9kZV9lcnJvcnMgPSBQeU1lbV9NYWxsb2Moc3RybGVuKG1vZGUpICsgMSk7CisgICAgc3RyY3B5KGNvbnZlcnNpb25fbW9kZV9lcnJvcnMsIG1vZGUpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAjZW5kaWYKIAogc3RhdGljIFB5T2JqZWN0ICoKIHJlc2l6ZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JQ0RhdGFPYmplY3QgKm9iajsKLQlTdGdEaWN0T2JqZWN0ICpkaWN0OwotCVB5X3NzaXplX3Qgc2l6ZTsKKyAgICBDRGF0YU9iamVjdCAqb2JqOworICAgIFN0Z0RpY3RPYmplY3QgKmRpY3Q7CisgICAgUHlfc3NpemVfdCBzaXplOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsCiAjaWYgKFBZX1ZFUlNJT05fSEVYIDwgMHgwMjA1MDAwMCkKLQkJCSAgICAgICJPaTpyZXNpemUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiT2k6cmVzaXplIiwKICNlbHNlCi0JCQkgICAgICAiT246cmVzaXplIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIk9uOnJlc2l6ZSIsCiAjZW5kaWYKLQkJCSAgICAgICZvYmosICZzaXplKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICZvYmosICZzaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlkaWN0ID0gUHlPYmplY3Rfc3RnZGljdCgoUHlPYmplY3QgKilvYmopOwotCWlmIChkaWN0ID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiZXhjZXB0ZWQgY3R5cGVzIGluc3RhbmNlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoc2l6ZSA8IGRpY3QtPnNpemUpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgZGljdCA9IFB5T2JqZWN0X3N0Z2RpY3QoKFB5T2JqZWN0ICopb2JqKTsKKyAgICBpZiAoZGljdCA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiZXhjZXB0ZWQgY3R5cGVzIGluc3RhbmNlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoc2l6ZSA8IGRpY3QtPnNpemUpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCiAjaWYgUFlfVkVSU0lPTl9IRVggPCAweDAyMDUwMDAwCi0JCQkgICAgICJtaW5pbXVtIHNpemUgaXMgJWQiLAorICAgICAgICAgICAgICAgICAgICAgIm1pbmltdW0gc2l6ZSBpcyAlZCIsCiAjZWxzZQotCQkJICAgICAibWluaW11bSBzaXplIGlzICV6ZCIsCisgICAgICAgICAgICAgICAgICAgICAibWluaW11bSBzaXplIGlzICV6ZCIsCiAjZW5kaWYKLQkJCSAgICAgZGljdC0+c2l6ZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAob2JqLT5iX25lZWRzZnJlZSA9PSAwKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAotCQkJICAgICAiTWVtb3J5IGNhbm5vdCBiZSByZXNpemVkIGJlY2F1c2UgdGhpcyBvYmplY3QgZG9lc24ndCBvd24gaXQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChzaXplIDw9IHNpemVvZihvYmotPmJfdmFsdWUpKSB7Ci0JCS8qIGludGVybmFsIGRlZmF1bHQgYnVmZmVyIGlzIGxhcmdlIGVub3VnaCAqLwotCQlvYmotPmJfc2l6ZSA9IHNpemU7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKG9iai0+Yl9zaXplIDw9IHNpemVvZihvYmotPmJfdmFsdWUpKSB7Ci0JCS8qIFdlIGFyZSBjdXJyZW50bHkgdXNpbmcgdGhlIG9iamVjdHMgZGVmYXVsdCBidWZmZXIsIGJ1dCBpdAotCQkgICBpc24ndCBsYXJnZSBlbm91Z2ggYW55IG1vcmUuICovCi0JCXZvaWQgKnB0ciA9IFB5TWVtX01hbGxvYyhzaXplKTsKLQkJaWYgKHB0ciA9PSBOVUxMKQotCQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JCW1lbXNldChwdHIsIDAsIHNpemUpOwotCQltZW1tb3ZlKHB0ciwgb2JqLT5iX3B0ciwgb2JqLT5iX3NpemUpOwotCQlvYmotPmJfcHRyID0gcHRyOwotCQlvYmotPmJfc2l6ZSA9IHNpemU7Ci0JfSBlbHNlIHsKLQkJdm9pZCAqIHB0ciA9IFB5TWVtX1JlYWxsb2Mob2JqLT5iX3B0ciwgc2l6ZSk7Ci0JCWlmIChwdHIgPT0gTlVMTCkKLQkJCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCQlvYmotPmJfcHRyID0gcHRyOwotCQlvYmotPmJfc2l6ZSA9IHNpemU7Ci0JfQorICAgICAgICAgICAgICAgICAgICAgZGljdC0+c2l6ZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAob2JqLT5iX25lZWRzZnJlZSA9PSAwKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIk1lbW9yeSBjYW5ub3QgYmUgcmVzaXplZCBiZWNhdXNlIHRoaXMgb2JqZWN0IGRvZXNuJ3Qgb3duIGl0Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoc2l6ZSA8PSBzaXplb2Yob2JqLT5iX3ZhbHVlKSkgeworICAgICAgICAvKiBpbnRlcm5hbCBkZWZhdWx0IGJ1ZmZlciBpcyBsYXJnZSBlbm91Z2ggKi8KKyAgICAgICAgb2JqLT5iX3NpemUgPSBzaXplOworICAgICAgICBnb3RvIGRvbmU7CisgICAgfQorICAgIGlmIChvYmotPmJfc2l6ZSA8PSBzaXplb2Yob2JqLT5iX3ZhbHVlKSkgeworICAgICAgICAvKiBXZSBhcmUgY3VycmVudGx5IHVzaW5nIHRoZSBvYmplY3RzIGRlZmF1bHQgYnVmZmVyLCBidXQgaXQKKyAgICAgICAgICAgaXNuJ3QgbGFyZ2UgZW5vdWdoIGFueSBtb3JlLiAqLworICAgICAgICB2b2lkICpwdHIgPSBQeU1lbV9NYWxsb2Moc2l6ZSk7CisgICAgICAgIGlmIChwdHIgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICBtZW1zZXQocHRyLCAwLCBzaXplKTsKKyAgICAgICAgbWVtbW92ZShwdHIsIG9iai0+Yl9wdHIsIG9iai0+Yl9zaXplKTsKKyAgICAgICAgb2JqLT5iX3B0ciA9IHB0cjsKKyAgICAgICAgb2JqLT5iX3NpemUgPSBzaXplOworICAgIH0gZWxzZSB7CisgICAgICAgIHZvaWQgKiBwdHIgPSBQeU1lbV9SZWFsbG9jKG9iai0+Yl9wdHIsIHNpemUpOworICAgICAgICBpZiAocHRyID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgb2JqLT5iX3B0ciA9IHB0cjsKKyAgICAgICAgb2JqLT5iX3NpemUgPSBzaXplOworICAgIH0KICAgZG9uZToKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogdW5waWNrbGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICp0eXA7Ci0JUHlPYmplY3QgKnN0YXRlOwotCVB5T2JqZWN0ICpyZXN1bHQ7Ci0JUHlPYmplY3QgKnRtcDsKKyAgICBQeU9iamVjdCAqdHlwOworICAgIFB5T2JqZWN0ICpzdGF0ZTsKKyAgICBQeU9iamVjdCAqcmVzdWx0OworICAgIFB5T2JqZWN0ICp0bXA7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9PIiwgJnR5cCwgJnN0YXRlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmVzdWx0ID0gUHlPYmplY3RfQ2FsbE1ldGhvZCh0eXAsICJfX25ld19fIiwgIk8iLCB0eXApOwotCWlmIChyZXN1bHQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JdG1wID0gUHlPYmplY3RfQ2FsbE1ldGhvZChyZXN1bHQsICJfX3NldHN0YXRlX18iLCAiTyIsIHN0YXRlKTsKLQlpZiAodG1wID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlQeV9ERUNSRUYodG1wKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT08iLCAmdHlwLCAmc3RhdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXN1bHQgPSBQeU9iamVjdF9DYWxsTWV0aG9kKHR5cCwgIl9fbmV3X18iLCAiTyIsIHR5cCk7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB0bXAgPSBQeU9iamVjdF9DYWxsTWV0aG9kKHJlc3VsdCwgIl9fc2V0c3RhdGVfXyIsICJPIiwgc3RhdGUpOworICAgIGlmICh0bXAgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5X0RFQ1JFRih0bXApOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBQT0lOVEVSKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqY2xzKQogewotCVB5T2JqZWN0ICpyZXN1bHQ7Ci0JUHlUeXBlT2JqZWN0ICp0eXA7Ci0JUHlPYmplY3QgKmtleTsKLQljaGFyICpidWY7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICBQeVR5cGVPYmplY3QgKnR5cDsKKyAgICBQeU9iamVjdCAqa2V5OworICAgIGNoYXIgKmJ1ZjsKIAotCXJlc3VsdCA9IFB5RGljdF9HZXRJdGVtKF9wb2ludGVyX3R5cGVfY2FjaGUsIGNscyk7Ci0JaWYgKHJlc3VsdCkgewotCQlQeV9JTkNSRUYocmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JaWYgKFB5U3RyaW5nX0NoZWNrRXhhY3QoY2xzKSkgewotCQlidWYgPSBhbGxvY2Eoc3RybGVuKFB5U3RyaW5nX0FTX1NUUklORyhjbHMpKSArIDMgKyAxKTsKLQkJc3ByaW50ZihidWYsICJMUF8lcyIsIFB5U3RyaW5nX0FTX1NUUklORyhjbHMpKTsKLQkJcmVzdWx0ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKChQeU9iamVjdCAqKVB5X1RZUEUoJlBvaW50ZXJfVHlwZSksCi0JCQkJCSAgICAgICAicyhPKXt9IiwKLQkJCQkJICAgICAgIGJ1ZiwKLQkJCQkJICAgICAgICZQb2ludGVyX1R5cGUpOwotCQlpZiAocmVzdWx0ID09IE5VTEwpCi0JCQlyZXR1cm4gcmVzdWx0OwotCQlrZXkgPSBQeUxvbmdfRnJvbVZvaWRQdHIocmVzdWx0KTsKLQl9IGVsc2UgaWYgKFB5VHlwZV9DaGVjayhjbHMpKSB7Ci0JCXR5cCA9IChQeVR5cGVPYmplY3QgKiljbHM7Ci0JCWJ1ZiA9IGFsbG9jYShzdHJsZW4odHlwLT50cF9uYW1lKSArIDMgKyAxKTsKLQkJc3ByaW50ZihidWYsICJMUF8lcyIsIHR5cC0+dHBfbmFtZSk7Ci0JCXJlc3VsdCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbigoUHlPYmplY3QgKilQeV9UWVBFKCZQb2ludGVyX1R5cGUpLAotCQkJCQkgICAgICAgInMoTyl7c099IiwKLQkJCQkJICAgICAgIGJ1ZiwKLQkJCQkJICAgICAgICZQb2ludGVyX1R5cGUsCi0JCQkJCSAgICAgICAiX3R5cGVfIiwgY2xzKTsKLQkJaWYgKHJlc3VsdCA9PSBOVUxMKQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJUHlfSU5DUkVGKGNscyk7Ci0JCWtleSA9IGNsczsKLQl9IGVsc2UgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAibXVzdCBiZSBhIGN0eXBlcyB0eXBlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoLTEgPT0gUHlEaWN0X1NldEl0ZW0oX3BvaW50ZXJfdHlwZV9jYWNoZSwga2V5LCByZXN1bHQpKSB7Ci0JCVB5X0RFQ1JFRihyZXN1bHQpOwotCQlQeV9ERUNSRUYoa2V5KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5X0RFQ1JFRihrZXkpOwotCXJldHVybiByZXN1bHQ7CisgICAgcmVzdWx0ID0gUHlEaWN0X0dldEl0ZW0oX3BvaW50ZXJfdHlwZV9jYWNoZSwgY2xzKTsKKyAgICBpZiAocmVzdWx0KSB7CisgICAgICAgIFB5X0lOQ1JFRihyZXN1bHQpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICBpZiAoUHlTdHJpbmdfQ2hlY2tFeGFjdChjbHMpKSB7CisgICAgICAgIGJ1ZiA9IGFsbG9jYShzdHJsZW4oUHlTdHJpbmdfQVNfU1RSSU5HKGNscykpICsgMyArIDEpOworICAgICAgICBzcHJpbnRmKGJ1ZiwgIkxQXyVzIiwgUHlTdHJpbmdfQVNfU1RSSU5HKGNscykpOworICAgICAgICByZXN1bHQgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oKFB5T2JqZWN0ICopUHlfVFlQRSgmUG9pbnRlcl9UeXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzKE8pe30iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlBvaW50ZXJfVHlwZSk7CisgICAgICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIGtleSA9IFB5TG9uZ19Gcm9tVm9pZFB0cihyZXN1bHQpOworICAgIH0gZWxzZSBpZiAoUHlUeXBlX0NoZWNrKGNscykpIHsKKyAgICAgICAgdHlwID0gKFB5VHlwZU9iamVjdCAqKWNsczsKKyAgICAgICAgYnVmID0gYWxsb2NhKHN0cmxlbih0eXAtPnRwX25hbWUpICsgMyArIDEpOworICAgICAgICBzcHJpbnRmKGJ1ZiwgIkxQXyVzIiwgdHlwLT50cF9uYW1lKTsKKyAgICAgICAgcmVzdWx0ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKChQeU9iamVjdCAqKVB5X1RZUEUoJlBvaW50ZXJfVHlwZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicyhPKXtzT30iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlBvaW50ZXJfVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfdHlwZV8iLCBjbHMpOworICAgICAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICBQeV9JTkNSRUYoY2xzKTsKKyAgICAgICAga2V5ID0gY2xzOworICAgIH0gZWxzZSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJtdXN0IGJlIGEgY3R5cGVzIHR5cGUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmICgtMSA9PSBQeURpY3RfU2V0SXRlbShfcG9pbnRlcl90eXBlX2NhY2hlLCBrZXksIHJlc3VsdCkpIHsKKyAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgIFB5X0RFQ1JFRihrZXkpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlfREVDUkVGKGtleSk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHBvaW50ZXIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmcpCiB7Ci0JUHlPYmplY3QgKnJlc3VsdDsKLQlQeU9iamVjdCAqdHlwOworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisgICAgUHlPYmplY3QgKnR5cDsKIAotCXR5cCA9IFB5RGljdF9HZXRJdGVtKF9wb2ludGVyX3R5cGVfY2FjaGUsIChQeU9iamVjdCAqKVB5X1RZUEUoYXJnKSk7Ci0JaWYgKHR5cCkKLQkJcmV0dXJuIFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3ModHlwLCBhcmcsIE5VTEwpOwotCXR5cCA9IFBPSU5URVIoTlVMTCwgKFB5T2JqZWN0ICopUHlfVFlQRShhcmcpKTsKLQlpZiAodHlwID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQlyZXN1bHQgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKHR5cCwgYXJnLCBOVUxMKTsKLQlQeV9ERUNSRUYodHlwKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIHR5cCA9IFB5RGljdF9HZXRJdGVtKF9wb2ludGVyX3R5cGVfY2FjaGUsIChQeU9iamVjdCAqKVB5X1RZUEUoYXJnKSk7CisgICAgaWYgKHR5cCkKKyAgICAgICAgcmV0dXJuIFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3ModHlwLCBhcmcsIE5VTEwpOworICAgIHR5cCA9IFBPSU5URVIoTlVMTCwgKFB5T2JqZWN0ICopUHlfVFlQRShhcmcpKTsKKyAgICBpZiAodHlwID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIHJlc3VsdCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3ModHlwLCBhcmcsIE5VTEwpOworICAgIFB5X0RFQ1JFRih0eXApOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBidWZmZXJfaW5mbyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZykKIHsKLQlTdGdEaWN0T2JqZWN0ICpkaWN0ID0gUHlUeXBlX3N0Z2RpY3QoYXJnKTsKLQlQeU9iamVjdCAqc2hhcGU7Ci0JUHlfc3NpemVfdCBpOworICAgIFN0Z0RpY3RPYmplY3QgKmRpY3QgPSBQeVR5cGVfc3RnZGljdChhcmcpOworICAgIFB5T2JqZWN0ICpzaGFwZTsKKyAgICBQeV9zc2l6ZV90IGk7CiAKLQlpZiAoZGljdCA9PSBOVUxMKQotCQlkaWN0ID0gUHlPYmplY3Rfc3RnZGljdChhcmcpOwotCWlmIChkaWN0ID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkibm90IGEgY3R5cGVzIHR5cGUgb3Igb2JqZWN0Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlzaGFwZSA9IFB5VHVwbGVfTmV3KGRpY3QtPm5kaW0pOwotCWlmIChzaGFwZSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlmb3IgKGkgPSAwOyBpIDwgKGludClkaWN0LT5uZGltOyArK2kpCi0JCVB5VHVwbGVfU0VUX0lURU0oc2hhcGUsIGksIFB5TG9uZ19Gcm9tU3NpemVfdChkaWN0LT5zaGFwZVtpXSkpOworICAgIGlmIChkaWN0ID09IE5VTEwpCisgICAgICAgIGRpY3QgPSBQeU9iamVjdF9zdGdkaWN0KGFyZyk7CisgICAgaWYgKGRpY3QgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIm5vdCBhIGN0eXBlcyB0eXBlIG9yIG9iamVjdCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgc2hhcGUgPSBQeVR1cGxlX05ldyhkaWN0LT5uZGltKTsKKyAgICBpZiAoc2hhcGUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZm9yIChpID0gMDsgaSA8IChpbnQpZGljdC0+bmRpbTsgKytpKQorICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKHNoYXBlLCBpLCBQeUxvbmdfRnJvbVNzaXplX3QoZGljdC0+c2hhcGVbaV0pKTsKIAotCWlmIChQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCVB5X0RFQ1JFRihzaGFwZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgic2lOIiwgZGljdC0+Zm9ybWF0LCBkaWN0LT5uZGltLCBzaGFwZSk7CisgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgUHlfREVDUkVGKHNoYXBlKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJzaU4iLCBkaWN0LT5mb3JtYXQsIGRpY3QtPm5kaW0sIHNoYXBlKTsKIH0KIAogUHlNZXRob2REZWYgbW9kdWxlX21ldGhvZHNbXSA9IHsKLQl7ImdldF9lcnJubyIsIGdldF9lcnJubywgTUVUSF9OT0FSR1N9LAotCXsic2V0X2Vycm5vIiwgc2V0X2Vycm5vLCBNRVRIX1ZBUkFSR1N9LAotCXsiUE9JTlRFUiIsIFBPSU5URVIsIE1FVEhfTyB9LAotCXsicG9pbnRlciIsIHBvaW50ZXIsIE1FVEhfTyB9LAotCXsiX3VucGlja2xlIiwgdW5waWNrbGUsIE1FVEhfVkFSQVJHUyB9LAotCXsiX2J1ZmZlcl9pbmZvIiwgYnVmZmVyX2luZm8sIE1FVEhfTywKLQkgIlJldHVybiBidWZmZXIgaW50ZXJmYWNlIGluZm9ybWF0aW9uIChmb3IgdGVzdGluZyBvbmx5KSJ9LAotCXsicmVzaXplIiwgcmVzaXplLCBNRVRIX1ZBUkFSR1MsICJSZXNpemUgdGhlIG1lbW9yeSBidWZmZXIgb2YgYSBjdHlwZXMgaW5zdGFuY2UifSwKKyAgICB7ImdldF9lcnJubyIsIGdldF9lcnJubywgTUVUSF9OT0FSR1N9LAorICAgIHsic2V0X2Vycm5vIiwgc2V0X2Vycm5vLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsiUE9JTlRFUiIsIFBPSU5URVIsIE1FVEhfTyB9LAorICAgIHsicG9pbnRlciIsIHBvaW50ZXIsIE1FVEhfTyB9LAorICAgIHsiX3VucGlja2xlIiwgdW5waWNrbGUsIE1FVEhfVkFSQVJHUyB9LAorICAgIHsiX2J1ZmZlcl9pbmZvIiwgYnVmZmVyX2luZm8sIE1FVEhfTywKKyAgICAgIlJldHVybiBidWZmZXIgaW50ZXJmYWNlIGluZm9ybWF0aW9uIChmb3IgdGVzdGluZyBvbmx5KSJ9LAorICAgIHsicmVzaXplIiwgcmVzaXplLCBNRVRIX1ZBUkFSR1MsICJSZXNpemUgdGhlIG1lbW9yeSBidWZmZXIgb2YgYSBjdHlwZXMgaW5zdGFuY2UifSwKICNpZmRlZiBDVFlQRVNfVU5JQ09ERQotCXsic2V0X2NvbnZlcnNpb25fbW9kZSIsIHNldF9jb252ZXJzaW9uX21vZGUsIE1FVEhfVkFSQVJHUywgc2V0X2NvbnZlcnNpb25fbW9kZV9kb2N9LAorICAgIHsic2V0X2NvbnZlcnNpb25fbW9kZSIsIHNldF9jb252ZXJzaW9uX21vZGUsIE1FVEhfVkFSQVJHUywgc2V0X2NvbnZlcnNpb25fbW9kZV9kb2N9LAogI2VuZGlmCiAjaWZkZWYgTVNfV0lOMzIKLQl7ImdldF9sYXN0X2Vycm9yIiwgZ2V0X2xhc3RfZXJyb3IsIE1FVEhfTk9BUkdTfSwKLQl7InNldF9sYXN0X2Vycm9yIiwgc2V0X2xhc3RfZXJyb3IsIE1FVEhfVkFSQVJHU30sCi0JeyJDb3B5Q29tUG9pbnRlciIsIGNvcHlfY29tX3BvaW50ZXIsIE1FVEhfVkFSQVJHUywgY29weV9jb21fcG9pbnRlcl9kb2N9LAotCXsiRm9ybWF0RXJyb3IiLCBmb3JtYXRfZXJyb3IsIE1FVEhfVkFSQVJHUywgZm9ybWF0X2Vycm9yX2RvY30sCi0JeyJMb2FkTGlicmFyeSIsIGxvYWRfbGlicmFyeSwgTUVUSF9WQVJBUkdTLCBsb2FkX2xpYnJhcnlfZG9jfSwKLQl7IkZyZWVMaWJyYXJ5IiwgZnJlZV9saWJyYXJ5LCBNRVRIX1ZBUkFSR1MsIGZyZWVfbGlicmFyeV9kb2N9LAotCXsiY2FsbF9jb21tZXRob2QiLCBjYWxsX2NvbW1ldGhvZCwgTUVUSF9WQVJBUkdTIH0sCi0JeyJfY2hlY2tfSFJFU1VMVCIsIGNoZWNrX2hyZXN1bHQsIE1FVEhfVkFSQVJHU30sCisgICAgeyJnZXRfbGFzdF9lcnJvciIsIGdldF9sYXN0X2Vycm9yLCBNRVRIX05PQVJHU30sCisgICAgeyJzZXRfbGFzdF9lcnJvciIsIHNldF9sYXN0X2Vycm9yLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsiQ29weUNvbVBvaW50ZXIiLCBjb3B5X2NvbV9wb2ludGVyLCBNRVRIX1ZBUkFSR1MsIGNvcHlfY29tX3BvaW50ZXJfZG9jfSwKKyAgICB7IkZvcm1hdEVycm9yIiwgZm9ybWF0X2Vycm9yLCBNRVRIX1ZBUkFSR1MsIGZvcm1hdF9lcnJvcl9kb2N9LAorICAgIHsiTG9hZExpYnJhcnkiLCBsb2FkX2xpYnJhcnksIE1FVEhfVkFSQVJHUywgbG9hZF9saWJyYXJ5X2RvY30sCisgICAgeyJGcmVlTGlicmFyeSIsIGZyZWVfbGlicmFyeSwgTUVUSF9WQVJBUkdTLCBmcmVlX2xpYnJhcnlfZG9jfSwKKyAgICB7ImNhbGxfY29tbWV0aG9kIiwgY2FsbF9jb21tZXRob2QsIE1FVEhfVkFSQVJHUyB9LAorICAgIHsiX2NoZWNrX0hSRVNVTFQiLCBjaGVja19ocmVzdWx0LCBNRVRIX1ZBUkFSR1N9LAogI2Vsc2UKLQl7ImRsb3BlbiIsIHB5X2RsX29wZW4sIE1FVEhfVkFSQVJHUywKLQkgImRsb3BlbihuYW1lLCBmbGFnPXtSVExEX0dMT0JBTHxSVExEX0xPQ0FMfSkgb3BlbiBhIHNoYXJlZCBsaWJyYXJ5In0sCi0JeyJkbGNsb3NlIiwgcHlfZGxfY2xvc2UsIE1FVEhfVkFSQVJHUywgImRsY2xvc2UgYSBsaWJyYXJ5In0sCi0JeyJkbHN5bSIsIHB5X2RsX3N5bSwgTUVUSF9WQVJBUkdTLCAiZmluZCBzeW1ib2wgaW4gc2hhcmVkIGxpYnJhcnkifSwKKyAgICB7ImRsb3BlbiIsIHB5X2RsX29wZW4sIE1FVEhfVkFSQVJHUywKKyAgICAgImRsb3BlbihuYW1lLCBmbGFnPXtSVExEX0dMT0JBTHxSVExEX0xPQ0FMfSkgb3BlbiBhIHNoYXJlZCBsaWJyYXJ5In0sCisgICAgeyJkbGNsb3NlIiwgcHlfZGxfY2xvc2UsIE1FVEhfVkFSQVJHUywgImRsY2xvc2UgYSBsaWJyYXJ5In0sCisgICAgeyJkbHN5bSIsIHB5X2RsX3N5bSwgTUVUSF9WQVJBUkdTLCAiZmluZCBzeW1ib2wgaW4gc2hhcmVkIGxpYnJhcnkifSwKICNlbmRpZgotCXsiYWxpZ25tZW50IiwgYWxpZ25fZnVuYywgTUVUSF9PLCBhbGlnbm1lbnRfZG9jfSwKLQl7InNpemVvZiIsIHNpemVvZl9mdW5jLCBNRVRIX08sIHNpemVvZl9kb2N9LAotCXsiYnlyZWYiLCBieXJlZiwgTUVUSF9WQVJBUkdTLCBieXJlZl9kb2N9LAotCXsiYWRkcmVzc29mIiwgYWRkcmVzc29mLCBNRVRIX08sIGFkZHJlc3NvZl9kb2N9LAotCXsiY2FsbF9mdW5jdGlvbiIsIGNhbGxfZnVuY3Rpb24sIE1FVEhfVkFSQVJHUyB9LAotCXsiY2FsbF9jZGVjbGZ1bmN0aW9uIiwgY2FsbF9jZGVjbGZ1bmN0aW9uLCBNRVRIX1ZBUkFSR1MgfSwKLQl7IlB5T2JqX0Zyb21QdHIiLCBNeV9QeU9ial9Gcm9tUHRyLCBNRVRIX1ZBUkFSR1MgfSwKLQl7IlB5X0lOQ1JFRiIsIE15X1B5X0lOQ1JFRiwgTUVUSF9PIH0sCi0JeyJQeV9ERUNSRUYiLCBNeV9QeV9ERUNSRUYsIE1FVEhfTyB9LAotCXtOVUxMLCAgICAgIE5VTEx9ICAgICAgICAvKiBTZW50aW5lbCAqLworICAgIHsiYWxpZ25tZW50IiwgYWxpZ25fZnVuYywgTUVUSF9PLCBhbGlnbm1lbnRfZG9jfSwKKyAgICB7InNpemVvZiIsIHNpemVvZl9mdW5jLCBNRVRIX08sIHNpemVvZl9kb2N9LAorICAgIHsiYnlyZWYiLCBieXJlZiwgTUVUSF9WQVJBUkdTLCBieXJlZl9kb2N9LAorICAgIHsiYWRkcmVzc29mIiwgYWRkcmVzc29mLCBNRVRIX08sIGFkZHJlc3NvZl9kb2N9LAorICAgIHsiY2FsbF9mdW5jdGlvbiIsIGNhbGxfZnVuY3Rpb24sIE1FVEhfVkFSQVJHUyB9LAorICAgIHsiY2FsbF9jZGVjbGZ1bmN0aW9uIiwgY2FsbF9jZGVjbGZ1bmN0aW9uLCBNRVRIX1ZBUkFSR1MgfSwKKyAgICB7IlB5T2JqX0Zyb21QdHIiLCBNeV9QeU9ial9Gcm9tUHRyLCBNRVRIX1ZBUkFSR1MgfSwKKyAgICB7IlB5X0lOQ1JFRiIsIE15X1B5X0lOQ1JFRiwgTUVUSF9PIH0sCisgICAgeyJQeV9ERUNSRUYiLCBNeV9QeV9ERUNSRUYsIE1FVEhfTyB9LAorICAgIHtOVUxMLCAgICAgIE5VTEx9ICAgICAgICAvKiBTZW50aW5lbCAqLwogfTsKIAogLyoKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9jZmllbGQuYyBiL01vZHVsZXMvX2N0eXBlcy9jZmllbGQuYwppbmRleCA0MDM3ZTkzLi40NjA1M2I4IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvY2ZpZWxkLmMKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2NmaWVsZC5jCkBAIC0xNyw5ICsxNyw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogQ0ZpZWxkX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlDRmllbGRPYmplY3QgKm9iajsKLQlvYmogPSAoQ0ZpZWxkT2JqZWN0ICopdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7Ci0JcmV0dXJuIChQeU9iamVjdCAqKW9iajsKKyAgICBDRmllbGRPYmplY3QgKm9iajsKKyAgICBvYmogPSAoQ0ZpZWxkT2JqZWN0ICopdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKW9iajsKIH0KIAogLyoKQEAgLTM2LDMwNSArMzYsMzA1IEBACiAgKi8KIFB5T2JqZWN0ICoKIENGaWVsZF9Gcm9tRGVzYyhQeU9iamVjdCAqZGVzYywgUHlfc3NpemVfdCBpbmRleCwKLQkJUHlfc3NpemVfdCAqcGZpZWxkX3NpemUsIGludCBiaXRzaXplLCBpbnQgKnBiaXRvZnMsCi0JCVB5X3NzaXplX3QgKnBzaXplLCBQeV9zc2l6ZV90ICpwb2Zmc2V0LCBQeV9zc2l6ZV90ICpwYWxpZ24sCi0JCWludCBwYWNrLCBpbnQgYmlnX2VuZGlhbikKKyAgICAgICAgICAgICAgICBQeV9zc2l6ZV90ICpwZmllbGRfc2l6ZSwgaW50IGJpdHNpemUsIGludCAqcGJpdG9mcywKKyAgICAgICAgICAgICAgICBQeV9zc2l6ZV90ICpwc2l6ZSwgUHlfc3NpemVfdCAqcG9mZnNldCwgUHlfc3NpemVfdCAqcGFsaWduLAorICAgICAgICAgICAgICAgIGludCBwYWNrLCBpbnQgYmlnX2VuZGlhbikKIHsKLQlDRmllbGRPYmplY3QgKnNlbGY7Ci0JUHlPYmplY3QgKnByb3RvOwotCVB5X3NzaXplX3Qgc2l6ZSwgYWxpZ24sIGxlbmd0aDsKLQlTRVRGVU5DIHNldGZ1bmMgPSBOVUxMOwotCUdFVEZVTkMgZ2V0ZnVuYyA9IE5VTEw7Ci0JU3RnRGljdE9iamVjdCAqZGljdDsKLQlpbnQgZmllbGR0eXBlOworICAgIENGaWVsZE9iamVjdCAqc2VsZjsKKyAgICBQeU9iamVjdCAqcHJvdG87CisgICAgUHlfc3NpemVfdCBzaXplLCBhbGlnbiwgbGVuZ3RoOworICAgIFNFVEZVTkMgc2V0ZnVuYyA9IE5VTEw7CisgICAgR0VURlVOQyBnZXRmdW5jID0gTlVMTDsKKyAgICBTdGdEaWN0T2JqZWN0ICpkaWN0OworICAgIGludCBmaWVsZHR5cGU7CiAjZGVmaW5lIE5PX0JJVEZJRUxEIDAKICNkZWZpbmUgTkVXX0JJVEZJRUxEIDEKICNkZWZpbmUgQ09OVF9CSVRGSUVMRCAyCiAjZGVmaW5lIEVYUEFORF9CSVRGSUVMRCAzCiAKLQlzZWxmID0gKENGaWVsZE9iamVjdCAqKVB5T2JqZWN0X0NhbGxPYmplY3QoKFB5T2JqZWN0ICopJkNGaWVsZF9UeXBlLAotCQkJCQkJICAgTlVMTCk7Ci0JaWYgKHNlbGYgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JZGljdCA9IFB5VHlwZV9zdGdkaWN0KGRlc2MpOwotCWlmICghZGljdCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJoYXMgbm8gX3N0Z2luZm9fIik7Ci0JCVB5X0RFQ1JFRihzZWxmKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChiaXRzaXplIC8qIHRoaXMgaXMgYSBiaXRmaWVsZCByZXF1ZXN0ICovCi0JICAgICYmICpwZmllbGRfc2l6ZSAvKiB3ZSBoYXZlIGEgYml0ZmllbGQgb3BlbiAqLworICAgIHNlbGYgPSAoQ0ZpZWxkT2JqZWN0ICopUHlPYmplY3RfQ2FsbE9iamVjdCgoUHlPYmplY3QgKikmQ0ZpZWxkX1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgIGlmIChzZWxmID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGRpY3QgPSBQeVR5cGVfc3RnZGljdChkZXNjKTsKKyAgICBpZiAoIWRpY3QpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJoYXMgbm8gX3N0Z2luZm9fIik7CisgICAgICAgIFB5X0RFQ1JFRihzZWxmKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChiaXRzaXplIC8qIHRoaXMgaXMgYSBiaXRmaWVsZCByZXF1ZXN0ICovCisgICAgICAgICYmICpwZmllbGRfc2l6ZSAvKiB3ZSBoYXZlIGEgYml0ZmllbGQgb3BlbiAqLwogI2lmZGVmIE1TX1dJTjMyCi0JICAgIC8qIE1TVkMsIEdDQyB3aXRoIC1tbXMtYml0ZmllbGRzICovCi0JICAgICYmIGRpY3QtPnNpemUgKiA4ID09ICpwZmllbGRfc2l6ZQorICAgICAgICAvKiBNU1ZDLCBHQ0Mgd2l0aCAtbW1zLWJpdGZpZWxkcyAqLworICAgICAgICAmJiBkaWN0LT5zaXplICogOCA9PSAqcGZpZWxkX3NpemUKICNlbHNlCi0JICAgIC8qIEdDQyAqLwotCSAgICAmJiBkaWN0LT5zaXplICogOCA8PSAqcGZpZWxkX3NpemUgCisgICAgICAgIC8qIEdDQyAqLworICAgICAgICAmJiBkaWN0LT5zaXplICogOCA8PSAqcGZpZWxkX3NpemUKICNlbmRpZgotCSAgICAmJiAoKnBiaXRvZnMgKyBiaXRzaXplKSA8PSAqcGZpZWxkX3NpemUpIHsKLQkJLyogY29udGludWUgYml0IGZpZWxkICovCi0JCWZpZWxkdHlwZSA9IENPTlRfQklURklFTEQ7CisgICAgICAgICYmICgqcGJpdG9mcyArIGJpdHNpemUpIDw9ICpwZmllbGRfc2l6ZSkgeworICAgICAgICAvKiBjb250aW51ZSBiaXQgZmllbGQgKi8KKyAgICAgICAgZmllbGR0eXBlID0gQ09OVF9CSVRGSUVMRDsKICNpZm5kZWYgTVNfV0lOMzIKLQl9IGVsc2UgaWYgKGJpdHNpemUgLyogdGhpcyBpcyBhIGJpdGZpZWxkIHJlcXVlc3QgKi8KLQkgICAgJiYgKnBmaWVsZF9zaXplIC8qIHdlIGhhdmUgYSBiaXRmaWVsZCBvcGVuICovCi0JICAgICYmIGRpY3QtPnNpemUgKiA4ID49ICpwZmllbGRfc2l6ZQotCSAgICAmJiAoKnBiaXRvZnMgKyBiaXRzaXplKSA8PSBkaWN0LT5zaXplICogOCkgewotCQkvKiBleHBhbmQgYml0IGZpZWxkICovCi0JCWZpZWxkdHlwZSA9IEVYUEFORF9CSVRGSUVMRDsKKyAgICB9IGVsc2UgaWYgKGJpdHNpemUgLyogdGhpcyBpcyBhIGJpdGZpZWxkIHJlcXVlc3QgKi8KKyAgICAgICAgJiYgKnBmaWVsZF9zaXplIC8qIHdlIGhhdmUgYSBiaXRmaWVsZCBvcGVuICovCisgICAgICAgICYmIGRpY3QtPnNpemUgKiA4ID49ICpwZmllbGRfc2l6ZQorICAgICAgICAmJiAoKnBiaXRvZnMgKyBiaXRzaXplKSA8PSBkaWN0LT5zaXplICogOCkgeworICAgICAgICAvKiBleHBhbmQgYml0IGZpZWxkICovCisgICAgICAgIGZpZWxkdHlwZSA9IEVYUEFORF9CSVRGSUVMRDsKICNlbmRpZgotCX0gZWxzZSBpZiAoYml0c2l6ZSkgewotCQkvKiBzdGFydCBuZXcgYml0ZmllbGQgKi8KLQkJZmllbGR0eXBlID0gTkVXX0JJVEZJRUxEOwotCQkqcGJpdG9mcyA9IDA7Ci0JCSpwZmllbGRfc2l6ZSA9IGRpY3QtPnNpemUgKiA4OwotCX0gZWxzZSB7Ci0JCS8qIG5vdCBhIGJpdCBmaWVsZCAqLwotCQlmaWVsZHR5cGUgPSBOT19CSVRGSUVMRDsKLQkJKnBiaXRvZnMgPSAwOwotCQkqcGZpZWxkX3NpemUgPSAwOwotCX0KKyAgICB9IGVsc2UgaWYgKGJpdHNpemUpIHsKKyAgICAgICAgLyogc3RhcnQgbmV3IGJpdGZpZWxkICovCisgICAgICAgIGZpZWxkdHlwZSA9IE5FV19CSVRGSUVMRDsKKyAgICAgICAgKnBiaXRvZnMgPSAwOworICAgICAgICAqcGZpZWxkX3NpemUgPSBkaWN0LT5zaXplICogODsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBub3QgYSBiaXQgZmllbGQgKi8KKyAgICAgICAgZmllbGR0eXBlID0gTk9fQklURklFTEQ7CisgICAgICAgICpwYml0b2ZzID0gMDsKKyAgICAgICAgKnBmaWVsZF9zaXplID0gMDsKKyAgICB9CiAKLQlzaXplID0gZGljdC0+c2l6ZTsKLQlsZW5ndGggPSBkaWN0LT5sZW5ndGg7Ci0JcHJvdG8gPSBkZXNjOworICAgIHNpemUgPSBkaWN0LT5zaXplOworICAgIGxlbmd0aCA9IGRpY3QtPmxlbmd0aDsKKyAgICBwcm90byA9IGRlc2M7CiAKLQkvKiAgRmllbGQgZGVzY3JpcHRvcnMgZm9yICdjX2NoYXIgKiBuJyBhcmUgYmUgc2NwZWNpYWwgY2FzZWQgdG8KLQkgICAgcmV0dXJuIGEgUHl0aG9uIHN0cmluZyBpbnN0ZWFkIG9mIGFuIEFycmF5IG9iamVjdCBpbnN0YW5jZS4uLgotCSovCi0JaWYgKEFycmF5VHlwZU9iamVjdF9DaGVjayhwcm90bykpIHsKLQkJU3RnRGljdE9iamVjdCAqYWRpY3QgPSBQeVR5cGVfc3RnZGljdChwcm90byk7Ci0JCVN0Z0RpY3RPYmplY3QgKmlkaWN0OwotCQlpZiAoYWRpY3QgJiYgYWRpY3QtPnByb3RvKSB7Ci0JCQlpZGljdCA9IFB5VHlwZV9zdGdkaWN0KGFkaWN0LT5wcm90byk7Ci0JCQlpZiAoIWlkaWN0KSB7Ci0JCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkJCSJoYXMgbm8gX3N0Z2luZm9fIik7Ci0JCQkJUHlfREVDUkVGKHNlbGYpOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQkJaWYgKGlkaWN0LT5nZXRmdW5jID09IGdldGVudHJ5KCJjIiktPmdldGZ1bmMpIHsKLQkJCQlzdHJ1Y3QgZmllbGRkZXNjICpmZCA9IGdldGVudHJ5KCJzIik7Ci0JCQkJZ2V0ZnVuYyA9IGZkLT5nZXRmdW5jOwotCQkJCXNldGZ1bmMgPSBmZC0+c2V0ZnVuYzsKLQkJCX0KKyAgICAvKiAgRmllbGQgZGVzY3JpcHRvcnMgZm9yICdjX2NoYXIgKiBuJyBhcmUgYmUgc2NwZWNpYWwgY2FzZWQgdG8KKyAgICAgICAgcmV0dXJuIGEgUHl0aG9uIHN0cmluZyBpbnN0ZWFkIG9mIGFuIEFycmF5IG9iamVjdCBpbnN0YW5jZS4uLgorICAgICovCisgICAgaWYgKEFycmF5VHlwZU9iamVjdF9DaGVjayhwcm90bykpIHsKKyAgICAgICAgU3RnRGljdE9iamVjdCAqYWRpY3QgPSBQeVR5cGVfc3RnZGljdChwcm90byk7CisgICAgICAgIFN0Z0RpY3RPYmplY3QgKmlkaWN0OworICAgICAgICBpZiAoYWRpY3QgJiYgYWRpY3QtPnByb3RvKSB7CisgICAgICAgICAgICBpZGljdCA9IFB5VHlwZV9zdGdkaWN0KGFkaWN0LT5wcm90byk7CisgICAgICAgICAgICBpZiAoIWlkaWN0KSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImhhcyBubyBfc3RnaW5mb18iKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoc2VsZik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaWRpY3QtPmdldGZ1bmMgPT0gZ2V0ZW50cnkoImMiKS0+Z2V0ZnVuYykgeworICAgICAgICAgICAgICAgIHN0cnVjdCBmaWVsZGRlc2MgKmZkID0gZ2V0ZW50cnkoInMiKTsKKyAgICAgICAgICAgICAgICBnZXRmdW5jID0gZmQtPmdldGZ1bmM7CisgICAgICAgICAgICAgICAgc2V0ZnVuYyA9IGZkLT5zZXRmdW5jOworICAgICAgICAgICAgfQogI2lmZGVmIENUWVBFU19VTklDT0RFCi0JCQlpZiAoaWRpY3QtPmdldGZ1bmMgPT0gZ2V0ZW50cnkoInUiKS0+Z2V0ZnVuYykgewotCQkJCXN0cnVjdCBmaWVsZGRlc2MgKmZkID0gZ2V0ZW50cnkoIlUiKTsKLQkJCQlnZXRmdW5jID0gZmQtPmdldGZ1bmM7Ci0JCQkJc2V0ZnVuYyA9IGZkLT5zZXRmdW5jOwotCQkJfQorICAgICAgICAgICAgaWYgKGlkaWN0LT5nZXRmdW5jID09IGdldGVudHJ5KCJ1IiktPmdldGZ1bmMpIHsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgZmllbGRkZXNjICpmZCA9IGdldGVudHJ5KCJVIik7CisgICAgICAgICAgICAgICAgZ2V0ZnVuYyA9IGZkLT5nZXRmdW5jOworICAgICAgICAgICAgICAgIHNldGZ1bmMgPSBmZC0+c2V0ZnVuYzsKKyAgICAgICAgICAgIH0KICNlbmRpZgotCQl9Ci0JfQorICAgICAgICB9CisgICAgfQogCi0Jc2VsZi0+c2V0ZnVuYyA9IHNldGZ1bmM7Ci0Jc2VsZi0+Z2V0ZnVuYyA9IGdldGZ1bmM7Ci0Jc2VsZi0+aW5kZXggPSBpbmRleDsKKyAgICBzZWxmLT5zZXRmdW5jID0gc2V0ZnVuYzsKKyAgICBzZWxmLT5nZXRmdW5jID0gZ2V0ZnVuYzsKKyAgICBzZWxmLT5pbmRleCA9IGluZGV4OwogCi0JUHlfSU5DUkVGKHByb3RvKTsKLQlzZWxmLT5wcm90byA9IHByb3RvOworICAgIFB5X0lOQ1JFRihwcm90byk7CisgICAgc2VsZi0+cHJvdG8gPSBwcm90bzsKIAotCXN3aXRjaCAoZmllbGR0eXBlKSB7Ci0JY2FzZSBORVdfQklURklFTEQ6Ci0JCWlmIChiaWdfZW5kaWFuKQotCQkJc2VsZi0+c2l6ZSA9IChiaXRzaXplIDw8IDE2KSArICpwZmllbGRfc2l6ZSAtICpwYml0b2ZzIC0gYml0c2l6ZTsKLQkJZWxzZQotCQkJc2VsZi0+c2l6ZSA9IChiaXRzaXplIDw8IDE2KSArICpwYml0b2ZzOwotCQkqcGJpdG9mcyA9IGJpdHNpemU7Ci0JCS8qIGZhbGwgdGhyb3VnaCAqLwotCWNhc2UgTk9fQklURklFTEQ6Ci0JCWlmIChwYWNrKQotCQkJYWxpZ24gPSBtaW4ocGFjaywgZGljdC0+YWxpZ24pOwotCQllbHNlCi0JCQlhbGlnbiA9IGRpY3QtPmFsaWduOwotCQlpZiAoYWxpZ24gJiYgKnBvZmZzZXQgJSBhbGlnbikgewotCQkJUHlfc3NpemVfdCBkZWx0YSA9IGFsaWduIC0gKCpwb2Zmc2V0ICUgYWxpZ24pOwotCQkJKnBzaXplICs9IGRlbHRhOwotCQkJKnBvZmZzZXQgKz0gZGVsdGE7Ci0JCX0KKyAgICBzd2l0Y2ggKGZpZWxkdHlwZSkgeworICAgIGNhc2UgTkVXX0JJVEZJRUxEOgorICAgICAgICBpZiAoYmlnX2VuZGlhbikKKyAgICAgICAgICAgIHNlbGYtPnNpemUgPSAoYml0c2l6ZSA8PCAxNikgKyAqcGZpZWxkX3NpemUgLSAqcGJpdG9mcyAtIGJpdHNpemU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNlbGYtPnNpemUgPSAoYml0c2l6ZSA8PCAxNikgKyAqcGJpdG9mczsKKyAgICAgICAgKnBiaXRvZnMgPSBiaXRzaXplOworICAgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KKyAgICBjYXNlIE5PX0JJVEZJRUxEOgorICAgICAgICBpZiAocGFjaykKKyAgICAgICAgICAgIGFsaWduID0gbWluKHBhY2ssIGRpY3QtPmFsaWduKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYWxpZ24gPSBkaWN0LT5hbGlnbjsKKyAgICAgICAgaWYgKGFsaWduICYmICpwb2Zmc2V0ICUgYWxpZ24pIHsKKyAgICAgICAgICAgIFB5X3NzaXplX3QgZGVsdGEgPSBhbGlnbiAtICgqcG9mZnNldCAlIGFsaWduKTsKKyAgICAgICAgICAgICpwc2l6ZSArPSBkZWx0YTsKKyAgICAgICAgICAgICpwb2Zmc2V0ICs9IGRlbHRhOworICAgICAgICB9CiAKLQkJaWYgKGJpdHNpemUgPT0gMCkKLQkJCXNlbGYtPnNpemUgPSBzaXplOwotCQkqcHNpemUgKz0gc2l6ZTsKKyAgICAgICAgaWYgKGJpdHNpemUgPT0gMCkKKyAgICAgICAgICAgIHNlbGYtPnNpemUgPSBzaXplOworICAgICAgICAqcHNpemUgKz0gc2l6ZTsKIAotCQlzZWxmLT5vZmZzZXQgPSAqcG9mZnNldDsKLQkJKnBvZmZzZXQgKz0gc2l6ZTsKKyAgICAgICAgc2VsZi0+b2Zmc2V0ID0gKnBvZmZzZXQ7CisgICAgICAgICpwb2Zmc2V0ICs9IHNpemU7CiAKLQkJKnBhbGlnbiA9IGFsaWduOwotCQlicmVhazsKKyAgICAgICAgKnBhbGlnbiA9IGFsaWduOworICAgICAgICBicmVhazsKIAotCWNhc2UgRVhQQU5EX0JJVEZJRUxEOgotCQkqcG9mZnNldCArPSBkaWN0LT5zaXplIC0gKnBmaWVsZF9zaXplLzg7Ci0JCSpwc2l6ZSArPSBkaWN0LT5zaXplIC0gKnBmaWVsZF9zaXplLzg7CisgICAgY2FzZSBFWFBBTkRfQklURklFTEQ6CisgICAgICAgICpwb2Zmc2V0ICs9IGRpY3QtPnNpemUgLSAqcGZpZWxkX3NpemUvODsKKyAgICAgICAgKnBzaXplICs9IGRpY3QtPnNpemUgLSAqcGZpZWxkX3NpemUvODsKIAotCQkqcGZpZWxkX3NpemUgPSBkaWN0LT5zaXplICogODsKKyAgICAgICAgKnBmaWVsZF9zaXplID0gZGljdC0+c2l6ZSAqIDg7CiAKLQkJaWYgKGJpZ19lbmRpYW4pCi0JCQlzZWxmLT5zaXplID0gKGJpdHNpemUgPDwgMTYpICsgKnBmaWVsZF9zaXplIC0gKnBiaXRvZnMgLSBiaXRzaXplOwotCQllbHNlCi0JCQlzZWxmLT5zaXplID0gKGJpdHNpemUgPDwgMTYpICsgKnBiaXRvZnM7CisgICAgICAgIGlmIChiaWdfZW5kaWFuKQorICAgICAgICAgICAgc2VsZi0+c2l6ZSA9IChiaXRzaXplIDw8IDE2KSArICpwZmllbGRfc2l6ZSAtICpwYml0b2ZzIC0gYml0c2l6ZTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc2VsZi0+c2l6ZSA9IChiaXRzaXplIDw8IDE2KSArICpwYml0b2ZzOwogCi0JCXNlbGYtPm9mZnNldCA9ICpwb2Zmc2V0IC0gc2l6ZTsgLyogcG9mZnNldCBpcyBhbHJlYWR5IHVwZGF0ZWQgZm9yIHRoZSBORVhUIGZpZWxkICovCi0JCSpwYml0b2ZzICs9IGJpdHNpemU7Ci0JCWJyZWFrOworICAgICAgICBzZWxmLT5vZmZzZXQgPSAqcG9mZnNldCAtIHNpemU7IC8qIHBvZmZzZXQgaXMgYWxyZWFkeSB1cGRhdGVkIGZvciB0aGUgTkVYVCBmaWVsZCAqLworICAgICAgICAqcGJpdG9mcyArPSBiaXRzaXplOworICAgICAgICBicmVhazsKIAotCWNhc2UgQ09OVF9CSVRGSUVMRDoKLQkJaWYgKGJpZ19lbmRpYW4pCi0JCQlzZWxmLT5zaXplID0gKGJpdHNpemUgPDwgMTYpICsgKnBmaWVsZF9zaXplIC0gKnBiaXRvZnMgLSBiaXRzaXplOwotCQllbHNlCi0JCQlzZWxmLT5zaXplID0gKGJpdHNpemUgPDwgMTYpICsgKnBiaXRvZnM7CisgICAgY2FzZSBDT05UX0JJVEZJRUxEOgorICAgICAgICBpZiAoYmlnX2VuZGlhbikKKyAgICAgICAgICAgIHNlbGYtPnNpemUgPSAoYml0c2l6ZSA8PCAxNikgKyAqcGZpZWxkX3NpemUgLSAqcGJpdG9mcyAtIGJpdHNpemU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNlbGYtPnNpemUgPSAoYml0c2l6ZSA8PCAxNikgKyAqcGJpdG9mczsKIAotCQlzZWxmLT5vZmZzZXQgPSAqcG9mZnNldCAtIHNpemU7IC8qIHBvZmZzZXQgaXMgYWxyZWFkeSB1cGRhdGVkIGZvciB0aGUgTkVYVCBmaWVsZCAqLwotCQkqcGJpdG9mcyArPSBiaXRzaXplOwotCQlicmVhazsKLQl9CisgICAgICAgIHNlbGYtPm9mZnNldCA9ICpwb2Zmc2V0IC0gc2l6ZTsgLyogcG9mZnNldCBpcyBhbHJlYWR5IHVwZGF0ZWQgZm9yIHRoZSBORVhUIGZpZWxkICovCisgICAgICAgICpwYml0b2ZzICs9IGJpdHNpemU7CisgICAgICAgIGJyZWFrOworICAgIH0KIAotCXJldHVybiAoUHlPYmplY3QgKilzZWxmOworICAgIHJldHVybiAoUHlPYmplY3QgKilzZWxmOwogfQogCiBzdGF0aWMgaW50CiBDRmllbGRfc2V0KENGaWVsZE9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmluc3QsIFB5T2JqZWN0ICp2YWx1ZSkKIHsKLQlDRGF0YU9iamVjdCAqZHN0OwotCWNoYXIgKnB0cjsKLQlhc3NlcnQoQ0RhdGFPYmplY3RfQ2hlY2soaW5zdCkpOwotCWRzdCA9IChDRGF0YU9iamVjdCAqKWluc3Q7Ci0JcHRyID0gZHN0LT5iX3B0ciArIHNlbGYtPm9mZnNldDsKLQlpZiAodmFsdWUgPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJjYW4ndCBkZWxldGUgYXR0cmlidXRlIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JcmV0dXJuIENEYXRhX3NldChpbnN0LCBzZWxmLT5wcm90bywgc2VsZi0+c2V0ZnVuYywgdmFsdWUsCi0JCQkgc2VsZi0+aW5kZXgsIHNlbGYtPnNpemUsIHB0cik7CisgICAgQ0RhdGFPYmplY3QgKmRzdDsKKyAgICBjaGFyICpwdHI7CisgICAgYXNzZXJ0KENEYXRhT2JqZWN0X0NoZWNrKGluc3QpKTsKKyAgICBkc3QgPSAoQ0RhdGFPYmplY3QgKilpbnN0OworICAgIHB0ciA9IGRzdC0+Yl9wdHIgKyBzZWxmLT5vZmZzZXQ7CisgICAgaWYgKHZhbHVlID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjYW4ndCBkZWxldGUgYXR0cmlidXRlIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIENEYXRhX3NldChpbnN0LCBzZWxmLT5wcm90bywgc2VsZi0+c2V0ZnVuYywgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICBzZWxmLT5pbmRleCwgc2VsZi0+c2l6ZSwgcHRyKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIENGaWVsZF9nZXQoQ0ZpZWxkT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqaW5zdCwgUHlUeXBlT2JqZWN0ICp0eXBlKQogewotCUNEYXRhT2JqZWN0ICpzcmM7Ci0JaWYgKGluc3QgPT0gTlVMTCkgewotCQlQeV9JTkNSRUYoc2VsZik7Ci0JCXJldHVybiAoUHlPYmplY3QgKilzZWxmOwotCX0KLQlhc3NlcnQoQ0RhdGFPYmplY3RfQ2hlY2soaW5zdCkpOwotCXNyYyA9IChDRGF0YU9iamVjdCAqKWluc3Q7Ci0JcmV0dXJuIENEYXRhX2dldChzZWxmLT5wcm90bywgc2VsZi0+Z2V0ZnVuYywgaW5zdCwKLQkJCSBzZWxmLT5pbmRleCwgc2VsZi0+c2l6ZSwgc3JjLT5iX3B0ciArIHNlbGYtPm9mZnNldCk7CisgICAgQ0RhdGFPYmplY3QgKnNyYzsKKyAgICBpZiAoaW5zdCA9PSBOVUxMKSB7CisgICAgICAgIFB5X0lOQ1JFRihzZWxmKTsKKyAgICAgICAgcmV0dXJuIChQeU9iamVjdCAqKXNlbGY7CisgICAgfQorICAgIGFzc2VydChDRGF0YU9iamVjdF9DaGVjayhpbnN0KSk7CisgICAgc3JjID0gKENEYXRhT2JqZWN0ICopaW5zdDsKKyAgICByZXR1cm4gQ0RhdGFfZ2V0KHNlbGYtPnByb3RvLCBzZWxmLT5nZXRmdW5jLCBpbnN0LAorICAgICAgICAgICAgICAgICAgICAgc2VsZi0+aW5kZXgsIHNlbGYtPnNpemUsIHNyYy0+Yl9wdHIgKyBzZWxmLT5vZmZzZXQpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogQ0ZpZWxkX2dldF9vZmZzZXQoUHlPYmplY3QgKnNlbGYsIHZvaWQgKmRhdGEpCiB7Ci0JcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KCgoQ0ZpZWxkT2JqZWN0ICopc2VsZiktPm9mZnNldCk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KCgoQ0ZpZWxkT2JqZWN0ICopc2VsZiktPm9mZnNldCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBDRmllbGRfZ2V0X3NpemUoUHlPYmplY3QgKnNlbGYsIHZvaWQgKmRhdGEpCiB7Ci0JcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KCgoQ0ZpZWxkT2JqZWN0ICopc2VsZiktPnNpemUpOworICAgIHJldHVybiBQeUludF9Gcm9tU3NpemVfdCgoKENGaWVsZE9iamVjdCAqKXNlbGYpLT5zaXplKTsKIH0KIAogc3RhdGljIFB5R2V0U2V0RGVmIENGaWVsZF9nZXRzZXRbXSA9IHsKLQl7ICJvZmZzZXQiLCBDRmllbGRfZ2V0X29mZnNldCwgTlVMTCwgIm9mZnNldCBpbiBieXRlcyBvZiB0aGlzIGZpZWxkIiB9LAotCXsgInNpemUiLCBDRmllbGRfZ2V0X3NpemUsIE5VTEwsICJzaXplIGluIGJ5dGVzIG9mIHRoaXMgZmllbGQiIH0sCi0JeyBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMIH0sCisgICAgeyAib2Zmc2V0IiwgQ0ZpZWxkX2dldF9vZmZzZXQsIE5VTEwsICJvZmZzZXQgaW4gYnl0ZXMgb2YgdGhpcyBmaWVsZCIgfSwKKyAgICB7ICJzaXplIiwgQ0ZpZWxkX2dldF9zaXplLCBOVUxMLCAic2l6ZSBpbiBieXRlcyBvZiB0aGlzIGZpZWxkIiB9LAorICAgIHsgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCB9LAogfTsKIAogc3RhdGljIGludAogQ0ZpZWxkX3RyYXZlcnNlKENGaWVsZE9iamVjdCAqc2VsZiwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JUHlfVklTSVQoc2VsZi0+cHJvdG8pOwotCXJldHVybiAwOworICAgIFB5X1ZJU0lUKHNlbGYtPnByb3RvKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogQ0ZpZWxkX2NsZWFyKENGaWVsZE9iamVjdCAqc2VsZikKIHsKLQlQeV9DTEVBUihzZWxmLT5wcm90byk7Ci0JcmV0dXJuIDA7CisgICAgUHlfQ0xFQVIoc2VsZi0+cHJvdG8pOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZAogQ0ZpZWxkX2RlYWxsb2MoUHlPYmplY3QgKnNlbGYpCiB7Ci0JQ0ZpZWxkX2NsZWFyKChDRmllbGRPYmplY3QgKilzZWxmKTsKLQlzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOworICAgIENGaWVsZF9jbGVhcigoQ0ZpZWxkT2JqZWN0ICopc2VsZik7CisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIENGaWVsZF9yZXByKENGaWVsZE9iamVjdCAqc2VsZikKIHsKLQlQeU9iamVjdCAqcmVzdWx0OwotCVB5X3NzaXplX3QgYml0cyA9IHNlbGYtPnNpemUgPj4gMTY7Ci0JUHlfc3NpemVfdCBzaXplID0gc2VsZi0+c2l6ZSAmIDB4RkZGRjsKLQljb25zdCBjaGFyICpuYW1lOworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisgICAgUHlfc3NpemVfdCBiaXRzID0gc2VsZi0+c2l6ZSA+PiAxNjsKKyAgICBQeV9zc2l6ZV90IHNpemUgPSBzZWxmLT5zaXplICYgMHhGRkZGOworICAgIGNvbnN0IGNoYXIgKm5hbWU7CiAKLQluYW1lID0gKChQeVR5cGVPYmplY3QgKilzZWxmLT5wcm90byktPnRwX25hbWU7CisgICAgbmFtZSA9ICgoUHlUeXBlT2JqZWN0ICopc2VsZi0+cHJvdG8pLT50cF9uYW1lOwogCi0JaWYgKGJpdHMpCi0JCXJlc3VsdCA9IFB5U3RyaW5nX0Zyb21Gb3JtYXQoCisgICAgaWYgKGJpdHMpCisgICAgICAgIHJlc3VsdCA9IFB5U3RyaW5nX0Zyb21Gb3JtYXQoCiAjaWYgKFBZX1ZFUlNJT05fSEVYIDwgMHgwMjA1MDAwMCkKLQkJCSI8RmllbGQgdHlwZT0lcywgb2ZzPSVkOiVkLCBiaXRzPSVkPiIsCisgICAgICAgICAgICAiPEZpZWxkIHR5cGU9JXMsIG9mcz0lZDolZCwgYml0cz0lZD4iLAogI2Vsc2UKLQkJCSI8RmllbGQgdHlwZT0lcywgb2ZzPSV6ZDolemQsIGJpdHM9JXpkPiIsCisgICAgICAgICAgICAiPEZpZWxkIHR5cGU9JXMsIG9mcz0lemQ6JXpkLCBiaXRzPSV6ZD4iLAogI2VuZGlmCi0JCQluYW1lLCBzZWxmLT5vZmZzZXQsIHNpemUsIGJpdHMpOwotCWVsc2UKLQkJcmVzdWx0ID0gUHlTdHJpbmdfRnJvbUZvcm1hdCgKKyAgICAgICAgICAgIG5hbWUsIHNlbGYtPm9mZnNldCwgc2l6ZSwgYml0cyk7CisgICAgZWxzZQorICAgICAgICByZXN1bHQgPSBQeVN0cmluZ19Gcm9tRm9ybWF0KAogI2lmIChQWV9WRVJTSU9OX0hFWCA8IDB4MDIwNTAwMDApCi0JCQkiPEZpZWxkIHR5cGU9JXMsIG9mcz0lZCwgc2l6ZT0lZD4iLAorICAgICAgICAgICAgIjxGaWVsZCB0eXBlPSVzLCBvZnM9JWQsIHNpemU9JWQ+IiwKICNlbHNlCi0JCQkiPEZpZWxkIHR5cGU9JXMsIG9mcz0lemQsIHNpemU9JXpkPiIsCisgICAgICAgICAgICAiPEZpZWxkIHR5cGU9JXMsIG9mcz0lemQsIHNpemU9JXpkPiIsCiAjZW5kaWYKLQkJCW5hbWUsIHNlbGYtPm9mZnNldCwgc2l6ZSk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIG5hbWUsIHNlbGYtPm9mZnNldCwgc2l6ZSk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogUHlUeXBlT2JqZWN0IENGaWVsZF9UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotCSJfY3R5cGVzLkNGaWVsZCIsCQkJCS8qIHRwX25hbWUgKi8KLQlzaXplb2YoQ0ZpZWxkT2JqZWN0KSwJCQkvKiB0cF9iYXNpY3NpemUgKi8KLQkwLAkJCQkJLyogdHBfaXRlbXNpemUgKi8KLQlDRmllbGRfZGVhbGxvYywJCQkJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfY29tcGFyZSAqLwotCShyZXByZnVuYylDRmllbGRfcmVwciwJCQkvKiB0cF9yZXByICovCi0JMCwJCQkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJCQkJCS8qIHRwX2hhc2ggKi8KLQkwLAkJCQkJLyogdHBfY2FsbCAqLwotCTAsCQkJCQkvKiB0cF9zdHIgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDLCAvKiB0cF9mbGFncyAqLwotCSJTdHJ1Y3R1cmUvVW5pb24gbWVtYmVyIiwJCS8qIHRwX2RvYyAqLwotCSh0cmF2ZXJzZXByb2MpQ0ZpZWxkX3RyYXZlcnNlLAkJLyogdHBfdHJhdmVyc2UgKi8KLQkoaW5xdWlyeSlDRmllbGRfY2xlYXIsCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaXRlciAqLwotCTAsCQkJCQkvKiB0cF9pdGVybmV4dCAqLwotCTAsCQkJCQkvKiB0cF9tZXRob2RzICovCi0JMCwJCQkJCS8qIHRwX21lbWJlcnMgKi8KLQlDRmllbGRfZ2V0c2V0LAkJCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCQkvKiB0cF9kaWN0ICovCi0JKGRlc2NyZ2V0ZnVuYylDRmllbGRfZ2V0LAkJLyogdHBfZGVzY3JfZ2V0ICovCi0JKGRlc2Nyc2V0ZnVuYylDRmllbGRfc2V0LAkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaW5pdCAqLwotCTAsCQkJCQkvKiB0cF9hbGxvYyAqLwotCUNGaWVsZF9uZXcsCQkJCS8qIHRwX25ldyAqLwotCTAsCQkJCQkvKiB0cF9mcmVlICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisgICAgIl9jdHlwZXMuQ0ZpZWxkIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICBzaXplb2YoQ0ZpZWxkT2JqZWN0KSwgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICBDRmllbGRfZGVhbGxvYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgKHJlcHJmdW5jKUNGaWVsZF9yZXByLCAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDLCAvKiB0cF9mbGFncyAqLworICAgICJTdHJ1Y3R1cmUvVW5pb24gbWVtYmVyIiwgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgKHRyYXZlcnNlcHJvYylDRmllbGRfdHJhdmVyc2UsICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIChpbnF1aXJ5KUNGaWVsZF9jbGVhciwgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICBDRmllbGRfZ2V0c2V0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIChkZXNjcmdldGZ1bmMpQ0ZpZWxkX2dldCwgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgKGRlc2Nyc2V0ZnVuYylDRmllbGRfc2V0LCAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgQ0ZpZWxkX25ldywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KIH07CiAKLQwKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCiAgIEFjY2Vzc29yIGZ1bmN0aW9ucwpAQCAtMzQ3LDE3ICszNDcsMTcgQEAKIHN0YXRpYyBpbnQKIGdldF9sb25nKFB5T2JqZWN0ICp2LCBsb25nICpwKQogewotCWxvbmcgeDsKLQlpZiAoUHlGbG9hdF9DaGVjayh2KSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJpbnQgZXhwZWN0ZWQgaW5zdGVhZCBvZiBmbG9hdCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXggPSBQeUludF9Bc1Vuc2lnbmVkTG9uZ01hc2sodik7Ci0JaWYgKHggPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIC0xOwotCSpwID0geDsKLQlyZXR1cm4gMDsKKyAgICBsb25nIHg7CisgICAgaWYgKFB5RmxvYXRfQ2hlY2sodikpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJpbnQgZXhwZWN0ZWQgaW5zdGVhZCBvZiBmbG9hdCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHggPSBQeUludF9Bc1Vuc2lnbmVkTG9uZ01hc2sodik7CisgICAgaWYgKHggPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgICpwID0geDsKKyAgICByZXR1cm4gMDsKIH0KIAogLyogU2FtZSwgYnV0IGhhbmRsaW5nIHVuc2lnbmVkIGxvbmcgKi8KQEAgLTM2NSwxNyArMzY1LDE3IEBACiBzdGF0aWMgaW50CiBnZXRfdWxvbmcoUHlPYmplY3QgKnYsIHVuc2lnbmVkIGxvbmcgKnApCiB7Ci0JdW5zaWduZWQgbG9uZyB4OwotCWlmIChQeUZsb2F0X0NoZWNrKHYpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJImludCBleHBlY3RlZCBpbnN0ZWFkIG9mIGZsb2F0Iik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JeCA9IFB5SW50X0FzVW5zaWduZWRMb25nTWFzayh2KTsKLQlpZiAoeCA9PSAodW5zaWduZWQgbG9uZyktMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gLTE7Ci0JKnAgPSB4OwotCXJldHVybiAwOworICAgIHVuc2lnbmVkIGxvbmcgeDsKKyAgICBpZiAoUHlGbG9hdF9DaGVjayh2KSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImludCBleHBlY3RlZCBpbnN0ZWFkIG9mIGZsb2F0Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgeCA9IFB5SW50X0FzVW5zaWduZWRMb25nTWFzayh2KTsKKyAgICBpZiAoeCA9PSAodW5zaWduZWQgbG9uZyktMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgKnAgPSB4OworICAgIHJldHVybiAwOwogfQogCiAjaWZkZWYgSEFWRV9MT05HX0xPTkcKQEAgLTM4NSwxNyArMzg1LDE3IEBACiBzdGF0aWMgaW50CiBnZXRfbG9uZ2xvbmcoUHlPYmplY3QgKnYsIFBZX0xPTkdfTE9ORyAqcCkKIHsKLQlQWV9MT05HX0xPTkcgeDsKLQlpZiAoUHlGbG9hdF9DaGVjayh2KSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJpbnQgZXhwZWN0ZWQgaW5zdGVhZCBvZiBmbG9hdCIpOwotIAkJcmV0dXJuIC0xOwotCX0KLQl4ID0gUHlJbnRfQXNVbnNpZ25lZExvbmdMb25nTWFzayh2KTsKLQlpZiAoeCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gLTE7Ci0JKnAgPSB4OwotCXJldHVybiAwOworICAgIFBZX0xPTkdfTE9ORyB4OworICAgIGlmIChQeUZsb2F0X0NoZWNrKHYpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiaW50IGV4cGVjdGVkIGluc3RlYWQgb2YgZmxvYXQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICB4ID0gUHlJbnRfQXNVbnNpZ25lZExvbmdMb25nTWFzayh2KTsKKyAgICBpZiAoeCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgKnAgPSB4OworICAgIHJldHVybiAwOwogfQogCiAvKiBTYW1lLCBidXQgaGFuZGxpbmcgbmF0aXZlIHVuc2lnbmVkIGxvbmcgbG9uZy4gKi8KQEAgLTQwMywxNyArNDAzLDE3IEBACiBzdGF0aWMgaW50CiBnZXRfdWxvbmdsb25nKFB5T2JqZWN0ICp2LCB1bnNpZ25lZCBQWV9MT05HX0xPTkcgKnApCiB7Ci0JdW5zaWduZWQgUFlfTE9OR19MT05HIHg7Ci0JaWYgKFB5RmxvYXRfQ2hlY2sodikpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiaW50IGV4cGVjdGVkIGluc3RlYWQgb2YgZmxvYXQiKTsKLSAJCXJldHVybiAtMTsKLSAJfQotCXggPSBQeUludF9Bc1Vuc2lnbmVkTG9uZ0xvbmdNYXNrKHYpOwotCWlmICh4ID09ICh1bnNpZ25lZCBQWV9MT05HX0xPTkcpLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIC0xOwotCSpwID0geDsKLQlyZXR1cm4gMDsKKyAgICB1bnNpZ25lZCBQWV9MT05HX0xPTkcgeDsKKyAgICBpZiAoUHlGbG9hdF9DaGVjayh2KSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImludCBleHBlY3RlZCBpbnN0ZWFkIG9mIGZsb2F0Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgeCA9IFB5SW50X0FzVW5zaWduZWRMb25nTG9uZ01hc2sodik7CisgICAgaWYgKHggPT0gKHVuc2lnbmVkIFBZX0xPTkdfTE9ORyktMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgKnAgPSB4OworICAgIHJldHVybiAwOwogfQogCiAjZW5kaWYKQEAgLTQzNiw0OSArNDM2LDQ5IEBACiAvKiBUaGlzIG1hY3JvIENIQU5HRVMgdGhlIGZpcnN0IHBhcmFtZXRlciBJTiBQTEFDRS4gRm9yIHByb3BlciBzaWduIGhhbmRsaW5nLAogICAgd2UgbXVzdCBmaXJzdCBzaGlmdCBsZWZ0LCB0aGVuIHJpZ2h0LgogKi8KLSNkZWZpbmUgR0VUX0JJVEZJRUxEKHYsIHNpemUpCQkJCQkJXAotCWlmIChOVU1fQklUUyhzaXplKSkgewkJCQkJCVwKLQkJdiA8PD0gKHNpemVvZih2KSo4IC0gTE9XX0JJVChzaXplKSAtIE5VTV9CSVRTKHNpemUpKTsJXAotCQl2ID4+PSAoc2l6ZW9mKHYpKjggLSBOVU1fQklUUyhzaXplKSk7CQkJXAotCX0KKyNkZWZpbmUgR0VUX0JJVEZJRUxEKHYsIHNpemUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoTlVNX0JJVFMoc2l6ZSkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdiA8PD0gKHNpemVvZih2KSo4IC0gTE9XX0JJVChzaXplKSAtIE5VTV9CSVRTKHNpemUpKTsgICAgICAgICAgIFwKKyAgICAgICAgdiA+Pj0gKHNpemVvZih2KSo4IC0gTlVNX0JJVFMoc2l6ZSkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CiAKIC8qIFRoaXMgbWFjcm8gUkVUVVJOUyB0aGUgZmlyc3QgcGFyYW1ldGVyIHdpdGggdGhlIGJpdCBmaWVsZCBDSEFOR0VELiAqLwotI2RlZmluZSBTRVQoeCwgdiwgc2l6ZSkJCQkJCQkJXAotCShOVU1fQklUUyhzaXplKSA/CQkJCQkJXAotCSAoICggeCAmIH4oQklUX01BU0soc2l6ZSkgPDwgTE9XX0JJVChzaXplKSkgKSB8ICggKHYgJiBCSVRfTUFTSyhzaXplKSkgPDwgTE9XX0JJVChzaXplKSApICkgXAotCSA6IHYpCisjZGVmaW5lIFNFVCh4LCB2LCBzaXplKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKE5VTV9CSVRTKHNpemUpID8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICggKCB4ICYgfihCSVRfTUFTSyhzaXplKSA8PCBMT1dfQklUKHNpemUpKSApIHwgKCAodiAmIEJJVF9NQVNLKHNpemUpKSA8PCBMT1dfQklUKHNpemUpICkgKSBcCisgICAgIDogdikKIAogLyogYnl0ZSBzd2FwcGluZyBtYWNyb3MgKi8KLSNkZWZpbmUgU1dBUF8yKHYpCQkJCVwKLQkoICggKHYgPj4gOCkgJiAweDAwRkYpIHwJCVwKLQkgICggKHYgPDwgOCkgJiAweEZGMDApICkKKyNkZWZpbmUgU1dBUF8yKHYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoICggKHYgPj4gOCkgJiAweDAwRkYpIHwgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICggKHYgPDwgOCkgJiAweEZGMDApICkKIAotI2RlZmluZSBTV0FQXzQodikJCQlcCi0JKCAoICh2ICYgMHgwMDAwMDBGRikgPDwgMjQgKSB8ICBcCi0JICAoICh2ICYgMHgwMDAwRkYwMCkgPDwgIDggKSB8ICBcCi0JICAoICh2ICYgMHgwMEZGMDAwMCkgPj4gIDggKSB8ICBcCi0JICAoICgodiA+PiAyNCkgJiAweEZGKSkgKQorI2RlZmluZSBTV0FQXzQodikgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoICggKHYgJiAweDAwMDAwMEZGKSA8PCAyNCApIHwgIFwKKyAgICAgICggKHYgJiAweDAwMDBGRjAwKSA8PCAgOCApIHwgIFwKKyAgICAgICggKHYgJiAweDAwRkYwMDAwKSA+PiAgOCApIHwgIFwKKyAgICAgICggKCh2ID4+IDI0KSAmIDB4RkYpKSApCiAKICNpZmRlZiBfTVNDX1ZFUgotI2RlZmluZSBTV0FQXzgodikJCQkJXAotCSggKCAodiAmIDB4MDAwMDAwMDAwMDAwMDBGRkwpIDw8IDU2ICkgfCAgXAotCSAgKCAodiAmIDB4MDAwMDAwMDAwMDAwRkYwMEwpIDw8IDQwICkgfCAgXAotCSAgKCAodiAmIDB4MDAwMDAwMDAwMEZGMDAwMEwpIDw8IDI0ICkgfCAgXAotCSAgKCAodiAmIDB4MDAwMDAwMDBGRjAwMDAwMEwpIDw8ICA4ICkgfCAgXAotCSAgKCAodiAmIDB4MDAwMDAwRkYwMDAwMDAwMEwpID4+ICA4ICkgfCAgXAotCSAgKCAodiAmIDB4MDAwMEZGMDAwMDAwMDAwMEwpID4+IDI0ICkgfCAgXAotCSAgKCAodiAmIDB4MDBGRjAwMDAwMDAwMDAwMEwpID4+IDQwICkgfCAgXAotCSAgKCAoKHYgPj4gNTYpICYgMHhGRikpICkKKyNkZWZpbmUgU1dBUF84KHYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoICggKHYgJiAweDAwMDAwMDAwMDAwMDAwRkZMKSA8PCA1NiApIHwgIFwKKyAgICAgICggKHYgJiAweDAwMDAwMDAwMDAwMEZGMDBMKSA8PCA0MCApIHwgIFwKKyAgICAgICggKHYgJiAweDAwMDAwMDAwMDBGRjAwMDBMKSA8PCAyNCApIHwgIFwKKyAgICAgICggKHYgJiAweDAwMDAwMDAwRkYwMDAwMDBMKSA8PCAgOCApIHwgIFwKKyAgICAgICggKHYgJiAweDAwMDAwMEZGMDAwMDAwMDBMKSA+PiAgOCApIHwgIFwKKyAgICAgICggKHYgJiAweDAwMDBGRjAwMDAwMDAwMDBMKSA+PiAyNCApIHwgIFwKKyAgICAgICggKHYgJiAweDAwRkYwMDAwMDAwMDAwMDBMKSA+PiA0MCApIHwgIFwKKyAgICAgICggKCh2ID4+IDU2KSAmIDB4RkYpKSApCiAjZWxzZQotI2RlZmluZSBTV0FQXzgodikJCQkJXAotCSggKCAodiAmIDB4MDAwMDAwMDAwMDAwMDBGRkxMKSA8PCA1NiApIHwgIFwKLQkgICggKHYgJiAweDAwMDAwMDAwMDAwMEZGMDBMTCkgPDwgNDAgKSB8ICBcCi0JICAoICh2ICYgMHgwMDAwMDAwMDAwRkYwMDAwTEwpIDw8IDI0ICkgfCAgXAotCSAgKCAodiAmIDB4MDAwMDAwMDBGRjAwMDAwMExMKSA8PCAgOCApIHwgIFwKLQkgICggKHYgJiAweDAwMDAwMEZGMDAwMDAwMDBMTCkgPj4gIDggKSB8ICBcCi0JICAoICh2ICYgMHgwMDAwRkYwMDAwMDAwMDAwTEwpID4+IDI0ICkgfCAgXAotCSAgKCAodiAmIDB4MDBGRjAwMDAwMDAwMDAwMExMKSA+PiA0MCApIHwgIFwKLQkgICggKCh2ID4+IDU2KSAmIDB4RkYpKSApCisjZGVmaW5lIFNXQVBfOCh2KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCAoICh2ICYgMHgwMDAwMDAwMDAwMDAwMEZGTEwpIDw8IDU2ICkgfCAgXAorICAgICAgKCAodiAmIDB4MDAwMDAwMDAwMDAwRkYwMExMKSA8PCA0MCApIHwgIFwKKyAgICAgICggKHYgJiAweDAwMDAwMDAwMDBGRjAwMDBMTCkgPDwgMjQgKSB8ICBcCisgICAgICAoICh2ICYgMHgwMDAwMDAwMEZGMDAwMDAwTEwpIDw8ICA4ICkgfCAgXAorICAgICAgKCAodiAmIDB4MDAwMDAwRkYwMDAwMDAwMExMKSA+PiAgOCApIHwgIFwKKyAgICAgICggKHYgJiAweDAwMDBGRjAwMDAwMDAwMDBMTCkgPj4gMjQgKSB8ICBcCisgICAgICAoICh2ICYgMHgwMEZGMDAwMDAwMDAwMDAwTEwpID4+IDQwICkgfCAgXAorICAgICAgKCAoKHYgPj4gNTYpICYgMHhGRikpICkKICNlbmRpZgogCiAjZGVmaW5lIFNXQVBfSU5UIFNXQVBfNApAQCAtNTE1LDE4NCArNTE1LDE4NCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGJfc2V0KHZvaWQgKnB0ciwgUHlPYmplY3QgKnZhbHVlLCBQeV9zc2l6ZV90IHNpemUpCiB7Ci0JbG9uZyB2YWw7Ci0JaWYgKGdldF9sb25nKHZhbHVlLCAmdmFsKSA8IDApCi0JCXJldHVybiBOVUxMOwotCSooc2lnbmVkIGNoYXIgKilwdHIgPSAoc2lnbmVkIGNoYXIpU0VUKCooc2lnbmVkIGNoYXIgKilwdHIsIChzaWduZWQgY2hhcil2YWwsIHNpemUpOwotCV9SRVQodmFsdWUpOworICAgIGxvbmcgdmFsOworICAgIGlmIChnZXRfbG9uZyh2YWx1ZSwgJnZhbCkgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAqKHNpZ25lZCBjaGFyICopcHRyID0gKHNpZ25lZCBjaGFyKVNFVCgqKHNpZ25lZCBjaGFyICopcHRyLCAoc2lnbmVkIGNoYXIpdmFsLCBzaXplKTsKKyAgICBfUkVUKHZhbHVlKTsKIH0KIAogCiBzdGF0aWMgUHlPYmplY3QgKgogYl9nZXQodm9pZCAqcHRyLCBQeV9zc2l6ZV90IHNpemUpCiB7Ci0Jc2lnbmVkIGNoYXIgdmFsID0gKihzaWduZWQgY2hhciAqKXB0cjsKLQlHRVRfQklURklFTEQodmFsLCBzaXplKTsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcodmFsKTsKKyAgICBzaWduZWQgY2hhciB2YWwgPSAqKHNpZ25lZCBjaGFyICopcHRyOworICAgIEdFVF9CSVRGSUVMRCh2YWwsIHNpemUpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyh2YWwpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogQl9zZXQodm9pZCAqcHRyLCBQeU9iamVjdCAqdmFsdWUsIFB5X3NzaXplX3Qgc2l6ZSkKIHsKLQl1bnNpZ25lZCBsb25nIHZhbDsKLQlpZiAoZ2V0X3Vsb25nKHZhbHVlLCAmdmFsKSA8IDApCi0JCXJldHVybiBOVUxMOwotCSoodW5zaWduZWQgY2hhciAqKXB0ciA9ICh1bnNpZ25lZCBjaGFyKVNFVCgqKHVuc2lnbmVkIGNoYXIqKXB0ciwKLQkJCQkJCSAgICh1bnNpZ25lZCBzaG9ydCl2YWwsIHNpemUpOwotCV9SRVQodmFsdWUpOworICAgIHVuc2lnbmVkIGxvbmcgdmFsOworICAgIGlmIChnZXRfdWxvbmcodmFsdWUsICZ2YWwpIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgKih1bnNpZ25lZCBjaGFyICopcHRyID0gKHVuc2lnbmVkIGNoYXIpU0VUKCoodW5zaWduZWQgY2hhciopcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgc2hvcnQpdmFsLCBzaXplKTsKKyAgICBfUkVUKHZhbHVlKTsKIH0KIAogCiBzdGF0aWMgUHlPYmplY3QgKgogQl9nZXQodm9pZCAqcHRyLCBQeV9zc2l6ZV90IHNpemUpCiB7Ci0JdW5zaWduZWQgY2hhciB2YWwgPSAqKHVuc2lnbmVkIGNoYXIgKilwdHI7Ci0JR0VUX0JJVEZJRUxEKHZhbCwgc2l6ZSk7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKHZhbCk7CisgICAgdW5zaWduZWQgY2hhciB2YWwgPSAqKHVuc2lnbmVkIGNoYXIgKilwdHI7CisgICAgR0VUX0JJVEZJRUxEKHZhbCwgc2l6ZSk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHZhbCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBoX3NldCh2b2lkICpwdHIsIFB5T2JqZWN0ICp2YWx1ZSwgUHlfc3NpemVfdCBzaXplKQogewotCWxvbmcgdmFsOwotCXNob3J0IHg7Ci0JaWYgKGdldF9sb25nKHZhbHVlLCAmdmFsKSA8IDApCi0JCXJldHVybiBOVUxMOwotCW1lbWNweSgmeCwgcHRyLCBzaXplb2YoeCkpOwotCXggPSBTRVQoeCwgKHNob3J0KXZhbCwgc2l6ZSk7Ci0JbWVtY3B5KHB0ciwgJngsIHNpemVvZih4KSk7Ci0JX1JFVCh2YWx1ZSk7CisgICAgbG9uZyB2YWw7CisgICAgc2hvcnQgeDsKKyAgICBpZiAoZ2V0X2xvbmcodmFsdWUsICZ2YWwpIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbWVtY3B5KCZ4LCBwdHIsIHNpemVvZih4KSk7CisgICAgeCA9IFNFVCh4LCAoc2hvcnQpdmFsLCBzaXplKTsKKyAgICBtZW1jcHkocHRyLCAmeCwgc2l6ZW9mKHgpKTsKKyAgICBfUkVUKHZhbHVlKTsKIH0KIAogCiBzdGF0aWMgUHlPYmplY3QgKgogaF9zZXRfc3codm9pZCAqcHRyLCBQeU9iamVjdCAqdmFsdWUsIFB5X3NzaXplX3Qgc2l6ZSkKIHsKLQlsb25nIHZhbDsKLQlzaG9ydCBmaWVsZDsKLQlpZiAoZ2V0X2xvbmcodmFsdWUsICZ2YWwpIDwgMCkKLQkJcmV0dXJuIE5VTEw7Ci0JbWVtY3B5KCZmaWVsZCwgcHRyLCBzaXplb2YoZmllbGQpKTsKLQlmaWVsZCA9IFNXQVBfMihmaWVsZCk7Ci0JZmllbGQgPSBTRVQoZmllbGQsIChzaG9ydCl2YWwsIHNpemUpOwotCWZpZWxkID0gU1dBUF8yKGZpZWxkKTsKLQltZW1jcHkocHRyLCAmZmllbGQsIHNpemVvZihmaWVsZCkpOwotCV9SRVQodmFsdWUpOworICAgIGxvbmcgdmFsOworICAgIHNob3J0IGZpZWxkOworICAgIGlmIChnZXRfbG9uZyh2YWx1ZSwgJnZhbCkgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBtZW1jcHkoJmZpZWxkLCBwdHIsIHNpemVvZihmaWVsZCkpOworICAgIGZpZWxkID0gU1dBUF8yKGZpZWxkKTsKKyAgICBmaWVsZCA9IFNFVChmaWVsZCwgKHNob3J0KXZhbCwgc2l6ZSk7CisgICAgZmllbGQgPSBTV0FQXzIoZmllbGQpOworICAgIG1lbWNweShwdHIsICZmaWVsZCwgc2l6ZW9mKGZpZWxkKSk7CisgICAgX1JFVCh2YWx1ZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBoX2dldCh2b2lkICpwdHIsIFB5X3NzaXplX3Qgc2l6ZSkKIHsKLQlzaG9ydCB2YWw7Ci0JbWVtY3B5KCZ2YWwsIHB0ciwgc2l6ZW9mKHZhbCkpOwotCUdFVF9CSVRGSUVMRCh2YWwsIHNpemUpOwotCXJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZyl2YWwpOworICAgIHNob3J0IHZhbDsKKyAgICBtZW1jcHkoJnZhbCwgcHRyLCBzaXplb2YodmFsKSk7CisgICAgR0VUX0JJVEZJRUxEKHZhbCwgc2l6ZSk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKXZhbCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBoX2dldF9zdyh2b2lkICpwdHIsIFB5X3NzaXplX3Qgc2l6ZSkKIHsKLQlzaG9ydCB2YWw7Ci0JbWVtY3B5KCZ2YWwsIHB0ciwgc2l6ZW9mKHZhbCkpOwotCXZhbCA9IFNXQVBfMih2YWwpOwotCUdFVF9CSVRGSUVMRCh2YWwsIHNpemUpOwotCXJldHVybiBQeUludF9Gcm9tTG9uZyh2YWwpOworICAgIHNob3J0IHZhbDsKKyAgICBtZW1jcHkoJnZhbCwgcHRyLCBzaXplb2YodmFsKSk7CisgICAgdmFsID0gU1dBUF8yKHZhbCk7CisgICAgR0VUX0JJVEZJRUxEKHZhbCwgc2l6ZSk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHZhbCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBIX3NldCh2b2lkICpwdHIsIFB5T2JqZWN0ICp2YWx1ZSwgUHlfc3NpemVfdCBzaXplKQogewotCXVuc2lnbmVkIGxvbmcgdmFsOwotCXVuc2lnbmVkIHNob3J0IHg7Ci0JaWYgKGdldF91bG9uZyh2YWx1ZSwgJnZhbCkgPCAwKQotCQlyZXR1cm4gTlVMTDsKLQltZW1jcHkoJngsIHB0ciwgc2l6ZW9mKHgpKTsKLQl4ID0gU0VUKHgsICh1bnNpZ25lZCBzaG9ydCl2YWwsIHNpemUpOwotCW1lbWNweShwdHIsICZ4LCBzaXplb2YoeCkpOwotCV9SRVQodmFsdWUpOworICAgIHVuc2lnbmVkIGxvbmcgdmFsOworICAgIHVuc2lnbmVkIHNob3J0IHg7CisgICAgaWYgKGdldF91bG9uZyh2YWx1ZSwgJnZhbCkgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBtZW1jcHkoJngsIHB0ciwgc2l6ZW9mKHgpKTsKKyAgICB4ID0gU0VUKHgsICh1bnNpZ25lZCBzaG9ydCl2YWwsIHNpemUpOworICAgIG1lbWNweShwdHIsICZ4LCBzaXplb2YoeCkpOworICAgIF9SRVQodmFsdWUpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogSF9zZXRfc3codm9pZCAqcHRyLCBQeU9iamVjdCAqdmFsdWUsIFB5X3NzaXplX3Qgc2l6ZSkKIHsKLQl1bnNpZ25lZCBsb25nIHZhbDsKLQl1bnNpZ25lZCBzaG9ydCBmaWVsZDsKLQlpZiAoZ2V0X3Vsb25nKHZhbHVlLCAmdmFsKSA8IDApCi0JCXJldHVybiBOVUxMOwotCW1lbWNweSgmZmllbGQsIHB0ciwgc2l6ZW9mKGZpZWxkKSk7Ci0JZmllbGQgPSBTV0FQXzIoZmllbGQpOwotCWZpZWxkID0gU0VUKGZpZWxkLCAodW5zaWduZWQgc2hvcnQpdmFsLCBzaXplKTsKLQlmaWVsZCA9IFNXQVBfMihmaWVsZCk7Ci0JbWVtY3B5KHB0ciwgJmZpZWxkLCBzaXplb2YoZmllbGQpKTsKLQlfUkVUKHZhbHVlKTsKKyAgICB1bnNpZ25lZCBsb25nIHZhbDsKKyAgICB1bnNpZ25lZCBzaG9ydCBmaWVsZDsKKyAgICBpZiAoZ2V0X3Vsb25nKHZhbHVlLCAmdmFsKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG1lbWNweSgmZmllbGQsIHB0ciwgc2l6ZW9mKGZpZWxkKSk7CisgICAgZmllbGQgPSBTV0FQXzIoZmllbGQpOworICAgIGZpZWxkID0gU0VUKGZpZWxkLCAodW5zaWduZWQgc2hvcnQpdmFsLCBzaXplKTsKKyAgICBmaWVsZCA9IFNXQVBfMihmaWVsZCk7CisgICAgbWVtY3B5KHB0ciwgJmZpZWxkLCBzaXplb2YoZmllbGQpKTsKKyAgICBfUkVUKHZhbHVlKTsKIH0KIAogCiBzdGF0aWMgUHlPYmplY3QgKgogSF9nZXQodm9pZCAqcHRyLCBQeV9zc2l6ZV90IHNpemUpCiB7Ci0JdW5zaWduZWQgc2hvcnQgdmFsOwotCW1lbWNweSgmdmFsLCBwdHIsIHNpemVvZih2YWwpKTsKLQlHRVRfQklURklFTEQodmFsLCBzaXplKTsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcodmFsKTsKKyAgICB1bnNpZ25lZCBzaG9ydCB2YWw7CisgICAgbWVtY3B5KCZ2YWwsIHB0ciwgc2l6ZW9mKHZhbCkpOworICAgIEdFVF9CSVRGSUVMRCh2YWwsIHNpemUpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyh2YWwpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogSF9nZXRfc3codm9pZCAqcHRyLCBQeV9zc2l6ZV90IHNpemUpCiB7Ci0JdW5zaWduZWQgc2hvcnQgdmFsOwotCW1lbWNweSgmdmFsLCBwdHIsIHNpemVvZih2YWwpKTsKLQl2YWwgPSBTV0FQXzIodmFsKTsKLQlHRVRfQklURklFTEQodmFsLCBzaXplKTsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcodmFsKTsKKyAgICB1bnNpZ25lZCBzaG9ydCB2YWw7CisgICAgbWVtY3B5KCZ2YWwsIHB0ciwgc2l6ZW9mKHZhbCkpOworICAgIHZhbCA9IFNXQVBfMih2YWwpOworICAgIEdFVF9CSVRGSUVMRCh2YWwsIHNpemUpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyh2YWwpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaV9zZXQodm9pZCAqcHRyLCBQeU9iamVjdCAqdmFsdWUsIFB5X3NzaXplX3Qgc2l6ZSkKIHsKLQlsb25nIHZhbDsKLQlpbnQgeDsKLQlpZiAoZ2V0X2xvbmcodmFsdWUsICZ2YWwpIDwgMCkKLQkJcmV0dXJuIE5VTEw7Ci0JbWVtY3B5KCZ4LCBwdHIsIHNpemVvZih4KSk7Ci0JeCA9IFNFVCh4LCAoaW50KXZhbCwgc2l6ZSk7Ci0JbWVtY3B5KHB0ciwgJngsIHNpemVvZih4KSk7Ci0JX1JFVCh2YWx1ZSk7CisgICAgbG9uZyB2YWw7CisgICAgaW50IHg7CisgICAgaWYgKGdldF9sb25nKHZhbHVlLCAmdmFsKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG1lbWNweSgmeCwgcHRyLCBzaXplb2YoeCkpOworICAgIHggPSBTRVQoeCwgKGludCl2YWwsIHNpemUpOworICAgIG1lbWNweShwdHIsICZ4LCBzaXplb2YoeCkpOworICAgIF9SRVQodmFsdWUpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaV9zZXRfc3codm9pZCAqcHRyLCBQeU9iamVjdCAqdmFsdWUsIFB5X3NzaXplX3Qgc2l6ZSkKIHsKLQlsb25nIHZhbDsKLQlpbnQgZmllbGQ7Ci0JaWYgKGdldF9sb25nKHZhbHVlLCAmdmFsKSA8IDApCi0JCXJldHVybiBOVUxMOwotCW1lbWNweSgmZmllbGQsIHB0ciwgc2l6ZW9mKGZpZWxkKSk7Ci0JZmllbGQgPSBTV0FQX0lOVChmaWVsZCk7Ci0JZmllbGQgPSBTRVQoZmllbGQsIChpbnQpdmFsLCBzaXplKTsKLQlmaWVsZCA9IFNXQVBfSU5UKGZpZWxkKTsKLQltZW1jcHkocHRyLCAmZmllbGQsIHNpemVvZihmaWVsZCkpOwotCV9SRVQodmFsdWUpOworICAgIGxvbmcgdmFsOworICAgIGludCBmaWVsZDsKKyAgICBpZiAoZ2V0X2xvbmcodmFsdWUsICZ2YWwpIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbWVtY3B5KCZmaWVsZCwgcHRyLCBzaXplb2YoZmllbGQpKTsKKyAgICBmaWVsZCA9IFNXQVBfSU5UKGZpZWxkKTsKKyAgICBmaWVsZCA9IFNFVChmaWVsZCwgKGludCl2YWwsIHNpemUpOworICAgIGZpZWxkID0gU1dBUF9JTlQoZmllbGQpOworICAgIG1lbWNweShwdHIsICZmaWVsZCwgc2l6ZW9mKGZpZWxkKSk7CisgICAgX1JFVCh2YWx1ZSk7CiB9CiAKIAogc3RhdGljIFB5T2JqZWN0ICoKIGlfZ2V0KHZvaWQgKnB0ciwgUHlfc3NpemVfdCBzaXplKQogewotCWludCB2YWw7Ci0JbWVtY3B5KCZ2YWwsIHB0ciwgc2l6ZW9mKHZhbCkpOwotCUdFVF9CSVRGSUVMRCh2YWwsIHNpemUpOwotCXJldHVybiBQeUludF9Gcm9tTG9uZyh2YWwpOworICAgIGludCB2YWw7CisgICAgbWVtY3B5KCZ2YWwsIHB0ciwgc2l6ZW9mKHZhbCkpOworICAgIEdFVF9CSVRGSUVMRCh2YWwsIHNpemUpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyh2YWwpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaV9nZXRfc3codm9pZCAqcHRyLCBQeV9zc2l6ZV90IHNpemUpCiB7Ci0JaW50IHZhbDsKLQltZW1jcHkoJnZhbCwgcHRyLCBzaXplb2YodmFsKSk7Ci0JdmFsID0gU1dBUF9JTlQodmFsKTsKLQlHRVRfQklURklFTEQodmFsLCBzaXplKTsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcodmFsKTsKKyAgICBpbnQgdmFsOworICAgIG1lbWNweSgmdmFsLCBwdHIsIHNpemVvZih2YWwpKTsKKyAgICB2YWwgPSBTV0FQX0lOVCh2YWwpOworICAgIEdFVF9CSVRGSUVMRCh2YWwsIHNpemUpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyh2YWwpOwogfQogCiAjaWZkZWYgTVNfV0lOMzIKQEAgLTcwMCwyMiArNzAwLDIyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogdkJPT0xfc2V0KHZvaWQgKnB0ciwgUHlPYmplY3QgKnZhbHVlLCBQeV9zc2l6ZV90IHNpemUpCiB7Ci0Jc3dpdGNoIChQeU9iamVjdF9Jc1RydWUodmFsdWUpKSB7Ci0JY2FzZSAtMToKLQkJcmV0dXJuIE5VTEw7Ci0JY2FzZSAwOgotCQkqKHNob3J0IGludCAqKXB0ciA9IFZBUklBTlRfRkFMU0U7Ci0JCV9SRVQodmFsdWUpOwotCWRlZmF1bHQ6Ci0JCSooc2hvcnQgaW50ICopcHRyID0gVkFSSUFOVF9UUlVFOwotCQlfUkVUKHZhbHVlKTsKLQl9CisgICAgc3dpdGNoIChQeU9iamVjdF9Jc1RydWUodmFsdWUpKSB7CisgICAgY2FzZSAtMToKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgY2FzZSAwOgorICAgICAgICAqKHNob3J0IGludCAqKXB0ciA9IFZBUklBTlRfRkFMU0U7CisgICAgICAgIF9SRVQodmFsdWUpOworICAgIGRlZmF1bHQ6CisgICAgICAgICooc2hvcnQgaW50ICopcHRyID0gVkFSSUFOVF9UUlVFOworICAgICAgICBfUkVUKHZhbHVlKTsKKyAgICB9CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB2Qk9PTF9nZXQodm9pZCAqcHRyLCBQeV9zc2l6ZV90IHNpemUpCiB7Ci0JcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygobG9uZykqKHNob3J0IGludCAqKXB0cik7CisgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygobG9uZykqKHNob3J0IGludCAqKXB0cik7CiB9CiAjZW5kaWYKIApAQCAtNzMwLDI2MCArNzMwLDI2MCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGJvb2xfc2V0KHZvaWQgKnB0ciwgUHlPYmplY3QgKnZhbHVlLCBQeV9zc2l6ZV90IHNpemUpCiB7Ci0Jc3dpdGNoIChQeU9iamVjdF9Jc1RydWUodmFsdWUpKSB7Ci0JY2FzZSAtMToKLQkJcmV0dXJuIE5VTEw7Ci0JY2FzZSAwOgotCQkqKEJPT0xfVFlQRSAqKXB0ciA9IDA7Ci0JCV9SRVQodmFsdWUpOwotCWRlZmF1bHQ6Ci0JCSooQk9PTF9UWVBFICopcHRyID0gMTsKLQkJX1JFVCh2YWx1ZSk7Ci0JfQorICAgIHN3aXRjaCAoUHlPYmplY3RfSXNUcnVlKHZhbHVlKSkgeworICAgIGNhc2UgLTE6CisgICAgICAgIHJldHVybiBOVUxMOworICAgIGNhc2UgMDoKKyAgICAgICAgKihCT09MX1RZUEUgKilwdHIgPSAwOworICAgICAgICBfUkVUKHZhbHVlKTsKKyAgICBkZWZhdWx0OgorICAgICAgICAqKEJPT0xfVFlQRSAqKXB0ciA9IDE7CisgICAgICAgIF9SRVQodmFsdWUpOworICAgIH0KIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGJvb2xfZ2V0KHZvaWQgKnB0ciwgUHlfc3NpemVfdCBzaXplKQogewotCXJldHVybiBQeUJvb2xfRnJvbUxvbmcoKGxvbmcpKihCT09MX1RZUEUgKilwdHIpOworICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoKGxvbmcpKihCT09MX1RZUEUgKilwdHIpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogSV9zZXQodm9pZCAqcHRyLCBQeU9iamVjdCAqdmFsdWUsIFB5X3NzaXplX3Qgc2l6ZSkKIHsKLQl1bnNpZ25lZCBsb25nIHZhbDsKLQl1bnNpZ25lZCBpbnQgeDsKLQlpZiAoZ2V0X3Vsb25nKHZhbHVlLCAmdmFsKSA8IDApCi0JCXJldHVybiAgTlVMTDsKLQltZW1jcHkoJngsIHB0ciwgc2l6ZW9mKHgpKTsKLQl4ID0gU0VUKHgsICh1bnNpZ25lZCBpbnQpdmFsLCBzaXplKTsKLQltZW1jcHkocHRyLCAmeCwgc2l6ZW9mKHgpKTsKLQlfUkVUKHZhbHVlKTsKKyAgICB1bnNpZ25lZCBsb25nIHZhbDsKKyAgICB1bnNpZ25lZCBpbnQgeDsKKyAgICBpZiAoZ2V0X3Vsb25nKHZhbHVlLCAmdmFsKSA8IDApCisgICAgICAgIHJldHVybiAgTlVMTDsKKyAgICBtZW1jcHkoJngsIHB0ciwgc2l6ZW9mKHgpKTsKKyAgICB4ID0gU0VUKHgsICh1bnNpZ25lZCBpbnQpdmFsLCBzaXplKTsKKyAgICBtZW1jcHkocHRyLCAmeCwgc2l6ZW9mKHgpKTsKKyAgICBfUkVUKHZhbHVlKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIElfc2V0X3N3KHZvaWQgKnB0ciwgUHlPYmplY3QgKnZhbHVlLCBQeV9zc2l6ZV90IHNpemUpCiB7Ci0JdW5zaWduZWQgbG9uZyB2YWw7Ci0JdW5zaWduZWQgaW50IGZpZWxkOwotCWlmIChnZXRfdWxvbmcodmFsdWUsICZ2YWwpIDwgMCkKLQkJcmV0dXJuICBOVUxMOwotCW1lbWNweSgmZmllbGQsIHB0ciwgc2l6ZW9mKGZpZWxkKSk7Ci0JZmllbGQgPSAodW5zaWduZWQgaW50KVNFVChmaWVsZCwgKHVuc2lnbmVkIGludCl2YWwsIHNpemUpOwotCWZpZWxkID0gU1dBUF9JTlQoZmllbGQpOwotCW1lbWNweShwdHIsICZmaWVsZCwgc2l6ZW9mKGZpZWxkKSk7Ci0JX1JFVCh2YWx1ZSk7CisgICAgdW5zaWduZWQgbG9uZyB2YWw7CisgICAgdW5zaWduZWQgaW50IGZpZWxkOworICAgIGlmIChnZXRfdWxvbmcodmFsdWUsICZ2YWwpIDwgMCkKKyAgICAgICAgcmV0dXJuICBOVUxMOworICAgIG1lbWNweSgmZmllbGQsIHB0ciwgc2l6ZW9mKGZpZWxkKSk7CisgICAgZmllbGQgPSAodW5zaWduZWQgaW50KVNFVChmaWVsZCwgKHVuc2lnbmVkIGludCl2YWwsIHNpemUpOworICAgIGZpZWxkID0gU1dBUF9JTlQoZmllbGQpOworICAgIG1lbWNweShwdHIsICZmaWVsZCwgc2l6ZW9mKGZpZWxkKSk7CisgICAgX1JFVCh2YWx1ZSk7CiB9CiAKIAogc3RhdGljIFB5T2JqZWN0ICoKIElfZ2V0KHZvaWQgKnB0ciwgUHlfc3NpemVfdCBzaXplKQogewotCXVuc2lnbmVkIGludCB2YWw7Ci0JbWVtY3B5KCZ2YWwsIHB0ciwgc2l6ZW9mKHZhbCkpOwotCUdFVF9CSVRGSUVMRCh2YWwsIHNpemUpOwotCXJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZyh2YWwpOworICAgIHVuc2lnbmVkIGludCB2YWw7CisgICAgbWVtY3B5KCZ2YWwsIHB0ciwgc2l6ZW9mKHZhbCkpOworICAgIEdFVF9CSVRGSUVMRCh2YWwsIHNpemUpOworICAgIHJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZyh2YWwpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogSV9nZXRfc3codm9pZCAqcHRyLCBQeV9zc2l6ZV90IHNpemUpCiB7Ci0JdW5zaWduZWQgaW50IHZhbDsKLQltZW1jcHkoJnZhbCwgcHRyLCBzaXplb2YodmFsKSk7Ci0JdmFsID0gU1dBUF9JTlQodmFsKTsKLQlHRVRfQklURklFTEQodmFsLCBzaXplKTsKLQlyZXR1cm4gUHlMb25nX0Zyb21VbnNpZ25lZExvbmcodmFsKTsKKyAgICB1bnNpZ25lZCBpbnQgdmFsOworICAgIG1lbWNweSgmdmFsLCBwdHIsIHNpemVvZih2YWwpKTsKKyAgICB2YWwgPSBTV0FQX0lOVCh2YWwpOworICAgIEdFVF9CSVRGSUVMRCh2YWwsIHNpemUpOworICAgIHJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZyh2YWwpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbF9zZXQodm9pZCAqcHRyLCBQeU9iamVjdCAqdmFsdWUsIFB5X3NzaXplX3Qgc2l6ZSkKIHsKLQlsb25nIHZhbDsKLQlsb25nIHg7Ci0JaWYgKGdldF9sb25nKHZhbHVlLCAmdmFsKSA8IDApCi0JCXJldHVybiBOVUxMOwotCW1lbWNweSgmeCwgcHRyLCBzaXplb2YoeCkpOwotCXggPSBTRVQoeCwgdmFsLCBzaXplKTsKLQltZW1jcHkocHRyLCAmeCwgc2l6ZW9mKHgpKTsKLQlfUkVUKHZhbHVlKTsKKyAgICBsb25nIHZhbDsKKyAgICBsb25nIHg7CisgICAgaWYgKGdldF9sb25nKHZhbHVlLCAmdmFsKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG1lbWNweSgmeCwgcHRyLCBzaXplb2YoeCkpOworICAgIHggPSBTRVQoeCwgdmFsLCBzaXplKTsKKyAgICBtZW1jcHkocHRyLCAmeCwgc2l6ZW9mKHgpKTsKKyAgICBfUkVUKHZhbHVlKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGxfc2V0X3N3KHZvaWQgKnB0ciwgUHlPYmplY3QgKnZhbHVlLCBQeV9zc2l6ZV90IHNpemUpCiB7Ci0JbG9uZyB2YWw7Ci0JbG9uZyBmaWVsZDsKLQlpZiAoZ2V0X2xvbmcodmFsdWUsICZ2YWwpIDwgMCkKLQkJcmV0dXJuIE5VTEw7Ci0JbWVtY3B5KCZmaWVsZCwgcHRyLCBzaXplb2YoZmllbGQpKTsKLQlmaWVsZCA9IFNXQVBfTE9ORyhmaWVsZCk7Ci0JZmllbGQgPSAobG9uZylTRVQoZmllbGQsIHZhbCwgc2l6ZSk7Ci0JZmllbGQgPSBTV0FQX0xPTkcoZmllbGQpOwotCW1lbWNweShwdHIsICZmaWVsZCwgc2l6ZW9mKGZpZWxkKSk7Ci0JX1JFVCh2YWx1ZSk7CisgICAgbG9uZyB2YWw7CisgICAgbG9uZyBmaWVsZDsKKyAgICBpZiAoZ2V0X2xvbmcodmFsdWUsICZ2YWwpIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbWVtY3B5KCZmaWVsZCwgcHRyLCBzaXplb2YoZmllbGQpKTsKKyAgICBmaWVsZCA9IFNXQVBfTE9ORyhmaWVsZCk7CisgICAgZmllbGQgPSAobG9uZylTRVQoZmllbGQsIHZhbCwgc2l6ZSk7CisgICAgZmllbGQgPSBTV0FQX0xPTkcoZmllbGQpOworICAgIG1lbWNweShwdHIsICZmaWVsZCwgc2l6ZW9mKGZpZWxkKSk7CisgICAgX1JFVCh2YWx1ZSk7CiB9CiAKIAogc3RhdGljIFB5T2JqZWN0ICoKIGxfZ2V0KHZvaWQgKnB0ciwgUHlfc3NpemVfdCBzaXplKQogewotCWxvbmcgdmFsOwotCW1lbWNweSgmdmFsLCBwdHIsIHNpemVvZih2YWwpKTsKLQlHRVRfQklURklFTEQodmFsLCBzaXplKTsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcodmFsKTsKKyAgICBsb25nIHZhbDsKKyAgICBtZW1jcHkoJnZhbCwgcHRyLCBzaXplb2YodmFsKSk7CisgICAgR0VUX0JJVEZJRUxEKHZhbCwgc2l6ZSk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHZhbCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBsX2dldF9zdyh2b2lkICpwdHIsIFB5X3NzaXplX3Qgc2l6ZSkKIHsKLQlsb25nIHZhbDsKLQltZW1jcHkoJnZhbCwgcHRyLCBzaXplb2YodmFsKSk7Ci0JdmFsID0gU1dBUF9MT05HKHZhbCk7Ci0JR0VUX0JJVEZJRUxEKHZhbCwgc2l6ZSk7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKHZhbCk7CisgICAgbG9uZyB2YWw7CisgICAgbWVtY3B5KCZ2YWwsIHB0ciwgc2l6ZW9mKHZhbCkpOworICAgIHZhbCA9IFNXQVBfTE9ORyh2YWwpOworICAgIEdFVF9CSVRGSUVMRCh2YWwsIHNpemUpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyh2YWwpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogTF9zZXQodm9pZCAqcHRyLCBQeU9iamVjdCAqdmFsdWUsIFB5X3NzaXplX3Qgc2l6ZSkKIHsKLQl1bnNpZ25lZCBsb25nIHZhbDsKLQl1bnNpZ25lZCBsb25nIHg7Ci0JaWYgKGdldF91bG9uZyh2YWx1ZSwgJnZhbCkgPCAwKQotCQlyZXR1cm4gIE5VTEw7Ci0JbWVtY3B5KCZ4LCBwdHIsIHNpemVvZih4KSk7Ci0JeCA9IFNFVCh4LCB2YWwsIHNpemUpOwotCW1lbWNweShwdHIsICZ4LCBzaXplb2YoeCkpOwotCV9SRVQodmFsdWUpOworICAgIHVuc2lnbmVkIGxvbmcgdmFsOworICAgIHVuc2lnbmVkIGxvbmcgeDsKKyAgICBpZiAoZ2V0X3Vsb25nKHZhbHVlLCAmdmFsKSA8IDApCisgICAgICAgIHJldHVybiAgTlVMTDsKKyAgICBtZW1jcHkoJngsIHB0ciwgc2l6ZW9mKHgpKTsKKyAgICB4ID0gU0VUKHgsIHZhbCwgc2l6ZSk7CisgICAgbWVtY3B5KHB0ciwgJngsIHNpemVvZih4KSk7CisgICAgX1JFVCh2YWx1ZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBMX3NldF9zdyh2b2lkICpwdHIsIFB5T2JqZWN0ICp2YWx1ZSwgUHlfc3NpemVfdCBzaXplKQogewotCXVuc2lnbmVkIGxvbmcgdmFsOwotCXVuc2lnbmVkIGxvbmcgZmllbGQ7Ci0JaWYgKGdldF91bG9uZyh2YWx1ZSwgJnZhbCkgPCAwKQotCQlyZXR1cm4gIE5VTEw7Ci0JbWVtY3B5KCZmaWVsZCwgcHRyLCBzaXplb2YoZmllbGQpKTsKLQlmaWVsZCA9IFNXQVBfTE9ORyhmaWVsZCk7Ci0JZmllbGQgPSAodW5zaWduZWQgbG9uZylTRVQoZmllbGQsIHZhbCwgc2l6ZSk7Ci0JZmllbGQgPSBTV0FQX0xPTkcoZmllbGQpOwotCW1lbWNweShwdHIsICZmaWVsZCwgc2l6ZW9mKGZpZWxkKSk7Ci0JX1JFVCh2YWx1ZSk7CisgICAgdW5zaWduZWQgbG9uZyB2YWw7CisgICAgdW5zaWduZWQgbG9uZyBmaWVsZDsKKyAgICBpZiAoZ2V0X3Vsb25nKHZhbHVlLCAmdmFsKSA8IDApCisgICAgICAgIHJldHVybiAgTlVMTDsKKyAgICBtZW1jcHkoJmZpZWxkLCBwdHIsIHNpemVvZihmaWVsZCkpOworICAgIGZpZWxkID0gU1dBUF9MT05HKGZpZWxkKTsKKyAgICBmaWVsZCA9ICh1bnNpZ25lZCBsb25nKVNFVChmaWVsZCwgdmFsLCBzaXplKTsKKyAgICBmaWVsZCA9IFNXQVBfTE9ORyhmaWVsZCk7CisgICAgbWVtY3B5KHB0ciwgJmZpZWxkLCBzaXplb2YoZmllbGQpKTsKKyAgICBfUkVUKHZhbHVlKTsKIH0KIAogCiBzdGF0aWMgUHlPYmplY3QgKgogTF9nZXQodm9pZCAqcHRyLCBQeV9zc2l6ZV90IHNpemUpCiB7Ci0JdW5zaWduZWQgbG9uZyB2YWw7Ci0JbWVtY3B5KCZ2YWwsIHB0ciwgc2l6ZW9mKHZhbCkpOwotCUdFVF9CSVRGSUVMRCh2YWwsIHNpemUpOwotCXJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZyh2YWwpOworICAgIHVuc2lnbmVkIGxvbmcgdmFsOworICAgIG1lbWNweSgmdmFsLCBwdHIsIHNpemVvZih2YWwpKTsKKyAgICBHRVRfQklURklFTEQodmFsLCBzaXplKTsKKyAgICByZXR1cm4gUHlMb25nX0Zyb21VbnNpZ25lZExvbmcodmFsKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIExfZ2V0X3N3KHZvaWQgKnB0ciwgUHlfc3NpemVfdCBzaXplKQogewotCXVuc2lnbmVkIGxvbmcgdmFsOwotCW1lbWNweSgmdmFsLCBwdHIsIHNpemVvZih2YWwpKTsKLQl2YWwgPSBTV0FQX0xPTkcodmFsKTsKLQlHRVRfQklURklFTEQodmFsLCBzaXplKTsKLQlyZXR1cm4gUHlMb25nX0Zyb21VbnNpZ25lZExvbmcodmFsKTsKKyAgICB1bnNpZ25lZCBsb25nIHZhbDsKKyAgICBtZW1jcHkoJnZhbCwgcHRyLCBzaXplb2YodmFsKSk7CisgICAgdmFsID0gU1dBUF9MT05HKHZhbCk7CisgICAgR0VUX0JJVEZJRUxEKHZhbCwgc2l6ZSk7CisgICAgcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKHZhbCk7CiB9CiAKICNpZmRlZiBIQVZFX0xPTkdfTE9ORwogc3RhdGljIFB5T2JqZWN0ICoKIHFfc2V0KHZvaWQgKnB0ciwgUHlPYmplY3QgKnZhbHVlLCBQeV9zc2l6ZV90IHNpemUpCiB7Ci0JUFlfTE9OR19MT05HIHZhbDsKLQlQWV9MT05HX0xPTkcgeDsKLQlpZiAoZ2V0X2xvbmdsb25nKHZhbHVlLCAmdmFsKSA8IDApCi0JCXJldHVybiBOVUxMOwotCW1lbWNweSgmeCwgcHRyLCBzaXplb2YoeCkpOwotCXggPSBTRVQoeCwgdmFsLCBzaXplKTsKLQltZW1jcHkocHRyLCAmeCwgc2l6ZW9mKHgpKTsKLQlfUkVUKHZhbHVlKTsKKyAgICBQWV9MT05HX0xPTkcgdmFsOworICAgIFBZX0xPTkdfTE9ORyB4OworICAgIGlmIChnZXRfbG9uZ2xvbmcodmFsdWUsICZ2YWwpIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbWVtY3B5KCZ4LCBwdHIsIHNpemVvZih4KSk7CisgICAgeCA9IFNFVCh4LCB2YWwsIHNpemUpOworICAgIG1lbWNweShwdHIsICZ4LCBzaXplb2YoeCkpOworICAgIF9SRVQodmFsdWUpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogcV9zZXRfc3codm9pZCAqcHRyLCBQeU9iamVjdCAqdmFsdWUsIFB5X3NzaXplX3Qgc2l6ZSkKIHsKLQlQWV9MT05HX0xPTkcgdmFsOwotCVBZX0xPTkdfTE9ORyBmaWVsZDsKLQlpZiAoZ2V0X2xvbmdsb25nKHZhbHVlLCAmdmFsKSA8IDApCi0JCXJldHVybiBOVUxMOwotCW1lbWNweSgmZmllbGQsIHB0ciwgc2l6ZW9mKGZpZWxkKSk7Ci0JZmllbGQgPSBTV0FQXzgoZmllbGQpOwotCWZpZWxkID0gKFBZX0xPTkdfTE9ORylTRVQoZmllbGQsIHZhbCwgc2l6ZSk7Ci0JZmllbGQgPSBTV0FQXzgoZmllbGQpOwotCW1lbWNweShwdHIsICZmaWVsZCwgc2l6ZW9mKGZpZWxkKSk7Ci0JX1JFVCh2YWx1ZSk7CisgICAgUFlfTE9OR19MT05HIHZhbDsKKyAgICBQWV9MT05HX0xPTkcgZmllbGQ7CisgICAgaWYgKGdldF9sb25nbG9uZyh2YWx1ZSwgJnZhbCkgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBtZW1jcHkoJmZpZWxkLCBwdHIsIHNpemVvZihmaWVsZCkpOworICAgIGZpZWxkID0gU1dBUF84KGZpZWxkKTsKKyAgICBmaWVsZCA9IChQWV9MT05HX0xPTkcpU0VUKGZpZWxkLCB2YWwsIHNpemUpOworICAgIGZpZWxkID0gU1dBUF84KGZpZWxkKTsKKyAgICBtZW1jcHkocHRyLCAmZmllbGQsIHNpemVvZihmaWVsZCkpOworICAgIF9SRVQodmFsdWUpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogcV9nZXQodm9pZCAqcHRyLCBQeV9zc2l6ZV90IHNpemUpCiB7Ci0JUFlfTE9OR19MT05HIHZhbDsKLQltZW1jcHkoJnZhbCwgcHRyLCBzaXplb2YodmFsKSk7Ci0JR0VUX0JJVEZJRUxEKHZhbCwgc2l6ZSk7Ci0JcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZ0xvbmcodmFsKTsKKyAgICBQWV9MT05HX0xPTkcgdmFsOworICAgIG1lbWNweSgmdmFsLCBwdHIsIHNpemVvZih2YWwpKTsKKyAgICBHRVRfQklURklFTEQodmFsLCBzaXplKTsKKyAgICByZXR1cm4gUHlMb25nX0Zyb21Mb25nTG9uZyh2YWwpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogcV9nZXRfc3codm9pZCAqcHRyLCBQeV9zc2l6ZV90IHNpemUpCiB7Ci0JUFlfTE9OR19MT05HIHZhbDsKLQltZW1jcHkoJnZhbCwgcHRyLCBzaXplb2YodmFsKSk7Ci0JdmFsID0gU1dBUF84KHZhbCk7Ci0JR0VUX0JJVEZJRUxEKHZhbCwgc2l6ZSk7Ci0JcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZ0xvbmcodmFsKTsKKyAgICBQWV9MT05HX0xPTkcgdmFsOworICAgIG1lbWNweSgmdmFsLCBwdHIsIHNpemVvZih2YWwpKTsKKyAgICB2YWwgPSBTV0FQXzgodmFsKTsKKyAgICBHRVRfQklURklFTEQodmFsLCBzaXplKTsKKyAgICByZXR1cm4gUHlMb25nX0Zyb21Mb25nTG9uZyh2YWwpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogUV9zZXQodm9pZCAqcHRyLCBQeU9iamVjdCAqdmFsdWUsIFB5X3NzaXplX3Qgc2l6ZSkKIHsKLQl1bnNpZ25lZCBQWV9MT05HX0xPTkcgdmFsOwotCXVuc2lnbmVkIFBZX0xPTkdfTE9ORyB4OwotCWlmIChnZXRfdWxvbmdsb25nKHZhbHVlLCAmdmFsKSA8IDApCi0JCXJldHVybiBOVUxMOwotCW1lbWNweSgmeCwgcHRyLCBzaXplb2YoeCkpOwotCXggPSBTRVQoeCwgdmFsLCBzaXplKTsKLQltZW1jcHkocHRyLCAmeCwgc2l6ZW9mKHgpKTsKLQlfUkVUKHZhbHVlKTsKKyAgICB1bnNpZ25lZCBQWV9MT05HX0xPTkcgdmFsOworICAgIHVuc2lnbmVkIFBZX0xPTkdfTE9ORyB4OworICAgIGlmIChnZXRfdWxvbmdsb25nKHZhbHVlLCAmdmFsKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG1lbWNweSgmeCwgcHRyLCBzaXplb2YoeCkpOworICAgIHggPSBTRVQoeCwgdmFsLCBzaXplKTsKKyAgICBtZW1jcHkocHRyLCAmeCwgc2l6ZW9mKHgpKTsKKyAgICBfUkVUKHZhbHVlKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFFfc2V0X3N3KHZvaWQgKnB0ciwgUHlPYmplY3QgKnZhbHVlLCBQeV9zc2l6ZV90IHNpemUpCiB7Ci0JdW5zaWduZWQgUFlfTE9OR19MT05HIHZhbDsKLQl1bnNpZ25lZCBQWV9MT05HX0xPTkcgZmllbGQ7Ci0JaWYgKGdldF91bG9uZ2xvbmcodmFsdWUsICZ2YWwpIDwgMCkKLQkJcmV0dXJuIE5VTEw7Ci0JbWVtY3B5KCZmaWVsZCwgcHRyLCBzaXplb2YoZmllbGQpKTsKLQlmaWVsZCA9IFNXQVBfOChmaWVsZCk7Ci0JZmllbGQgPSAodW5zaWduZWQgUFlfTE9OR19MT05HKVNFVChmaWVsZCwgdmFsLCBzaXplKTsKLQlmaWVsZCA9IFNXQVBfOChmaWVsZCk7Ci0JbWVtY3B5KHB0ciwgJmZpZWxkLCBzaXplb2YoZmllbGQpKTsKLQlfUkVUKHZhbHVlKTsKKyAgICB1bnNpZ25lZCBQWV9MT05HX0xPTkcgdmFsOworICAgIHVuc2lnbmVkIFBZX0xPTkdfTE9ORyBmaWVsZDsKKyAgICBpZiAoZ2V0X3Vsb25nbG9uZyh2YWx1ZSwgJnZhbCkgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBtZW1jcHkoJmZpZWxkLCBwdHIsIHNpemVvZihmaWVsZCkpOworICAgIGZpZWxkID0gU1dBUF84KGZpZWxkKTsKKyAgICBmaWVsZCA9ICh1bnNpZ25lZCBQWV9MT05HX0xPTkcpU0VUKGZpZWxkLCB2YWwsIHNpemUpOworICAgIGZpZWxkID0gU1dBUF84KGZpZWxkKTsKKyAgICBtZW1jcHkocHRyLCAmZmllbGQsIHNpemVvZihmaWVsZCkpOworICAgIF9SRVQodmFsdWUpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogUV9nZXQodm9pZCAqcHRyLCBQeV9zc2l6ZV90IHNpemUpCiB7Ci0JdW5zaWduZWQgUFlfTE9OR19MT05HIHZhbDsKLQltZW1jcHkoJnZhbCwgcHRyLCBzaXplb2YodmFsKSk7Ci0JR0VUX0JJVEZJRUxEKHZhbCwgc2l6ZSk7Ci0JcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nTG9uZyh2YWwpOworICAgIHVuc2lnbmVkIFBZX0xPTkdfTE9ORyB2YWw7CisgICAgbWVtY3B5KCZ2YWwsIHB0ciwgc2l6ZW9mKHZhbCkpOworICAgIEdFVF9CSVRGSUVMRCh2YWwsIHNpemUpOworICAgIHJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZ0xvbmcodmFsKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFFfZ2V0X3N3KHZvaWQgKnB0ciwgUHlfc3NpemVfdCBzaXplKQogewotCXVuc2lnbmVkIFBZX0xPTkdfTE9ORyB2YWw7Ci0JbWVtY3B5KCZ2YWwsIHB0ciwgc2l6ZW9mKHZhbCkpOwotCXZhbCA9IFNXQVBfOCh2YWwpOwotCUdFVF9CSVRGSUVMRCh2YWwsIHNpemUpOwotCXJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZ0xvbmcodmFsKTsKKyAgICB1bnNpZ25lZCBQWV9MT05HX0xPTkcgdmFsOworICAgIG1lbWNweSgmdmFsLCBwdHIsIHNpemVvZih2YWwpKTsKKyAgICB2YWwgPSBTV0FQXzgodmFsKTsKKyAgICBHRVRfQklURklFTEQodmFsLCBzaXplKTsKKyAgICByZXR1cm4gUHlMb25nX0Zyb21VbnNpZ25lZExvbmdMb25nKHZhbCk7CiB9CiAjZW5kaWYKIApAQCAtOTk1LDEzNiArOTk1LDEzNiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdfc2V0KHZvaWQgKnB0ciwgUHlPYmplY3QgKnZhbHVlLCBQeV9zc2l6ZV90IHNpemUpCiB7Ci0JbG9uZyBkb3VibGUgeDsKKyAgICBsb25nIGRvdWJsZSB4OwogCi0JeCA9IFB5RmxvYXRfQXNEb3VibGUodmFsdWUpOwotCWlmICh4ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAgIiBmbG9hdCBleHBlY3RlZCBpbnN0ZWFkIG9mICVzIGluc3RhbmNlIiwKLQkJCSAgICAgdmFsdWUtPm9iX3R5cGUtPnRwX25hbWUpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JbWVtY3B5KHB0ciwgJngsIHNpemVvZihsb25nIGRvdWJsZSkpOwotCV9SRVQodmFsdWUpOworICAgIHggPSBQeUZsb2F0X0FzRG91YmxlKHZhbHVlKTsKKyAgICBpZiAoeCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiIGZsb2F0IGV4cGVjdGVkIGluc3RlYWQgb2YgJXMgaW5zdGFuY2UiLAorICAgICAgICAgICAgICAgICAgICAgdmFsdWUtPm9iX3R5cGUtPnRwX25hbWUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgbWVtY3B5KHB0ciwgJngsIHNpemVvZihsb25nIGRvdWJsZSkpOworICAgIF9SRVQodmFsdWUpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZ19nZXQodm9pZCAqcHRyLCBQeV9zc2l6ZV90IHNpemUpCiB7Ci0JbG9uZyBkb3VibGUgdmFsOwotCW1lbWNweSgmdmFsLCBwdHIsIHNpemVvZihsb25nIGRvdWJsZSkpOwotCXJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUodmFsKTsKKyAgICBsb25nIGRvdWJsZSB2YWw7CisgICAgbWVtY3B5KCZ2YWwsIHB0ciwgc2l6ZW9mKGxvbmcgZG91YmxlKSk7CisgICAgcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZSh2YWwpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZF9zZXQodm9pZCAqcHRyLCBQeU9iamVjdCAqdmFsdWUsIFB5X3NzaXplX3Qgc2l6ZSkKIHsKLQlkb3VibGUgeDsKKyAgICBkb3VibGUgeDsKIAotCXggPSBQeUZsb2F0X0FzRG91YmxlKHZhbHVlKTsKLQlpZiAoeCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgICIgZmxvYXQgZXhwZWN0ZWQgaW5zdGVhZCBvZiAlcyBpbnN0YW5jZSIsCi0JCQkgICAgIHZhbHVlLT5vYl90eXBlLT50cF9uYW1lKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCW1lbWNweShwdHIsICZ4LCBzaXplb2YoZG91YmxlKSk7Ci0JX1JFVCh2YWx1ZSk7CisgICAgeCA9IFB5RmxvYXRfQXNEb3VibGUodmFsdWUpOworICAgIGlmICh4ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICIgZmxvYXQgZXhwZWN0ZWQgaW5zdGVhZCBvZiAlcyBpbnN0YW5jZSIsCisgICAgICAgICAgICAgICAgICAgICB2YWx1ZS0+b2JfdHlwZS0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBtZW1jcHkocHRyLCAmeCwgc2l6ZW9mKGRvdWJsZSkpOworICAgIF9SRVQodmFsdWUpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZF9nZXQodm9pZCAqcHRyLCBQeV9zc2l6ZV90IHNpemUpCiB7Ci0JZG91YmxlIHZhbDsKLQltZW1jcHkoJnZhbCwgcHRyLCBzaXplb2YodmFsKSk7Ci0JcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZSh2YWwpOworICAgIGRvdWJsZSB2YWw7CisgICAgbWVtY3B5KCZ2YWwsIHB0ciwgc2l6ZW9mKHZhbCkpOworICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUodmFsKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRfc2V0X3N3KHZvaWQgKnB0ciwgUHlPYmplY3QgKnZhbHVlLCBQeV9zc2l6ZV90IHNpemUpCiB7Ci0JZG91YmxlIHg7CisgICAgZG91YmxlIHg7CiAKLQl4ID0gUHlGbG9hdF9Bc0RvdWJsZSh2YWx1ZSk7Ci0JaWYgKHggPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJICAgICAiIGZsb2F0IGV4cGVjdGVkIGluc3RlYWQgb2YgJXMgaW5zdGFuY2UiLAotCQkJICAgICB2YWx1ZS0+b2JfdHlwZS0+dHBfbmFtZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICB4ID0gUHlGbG9hdF9Bc0RvdWJsZSh2YWx1ZSk7CisgICAgaWYgKHggPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIiBmbG9hdCBleHBlY3RlZCBpbnN0ZWFkIG9mICVzIGluc3RhbmNlIiwKKyAgICAgICAgICAgICAgICAgICAgIHZhbHVlLT5vYl90eXBlLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogI2lmZGVmIFdPUkRTX0JJR0VORElBTgotCWlmIChfUHlGbG9hdF9QYWNrOCh4LCAodW5zaWduZWQgY2hhciAqKXB0ciwgMSkpCi0JCXJldHVybiBOVUxMOworICAgIGlmIChfUHlGbG9hdF9QYWNrOCh4LCAodW5zaWduZWQgY2hhciAqKXB0ciwgMSkpCisgICAgICAgIHJldHVybiBOVUxMOwogI2Vsc2UKLQlpZiAoX1B5RmxvYXRfUGFjazgoeCwgKHVuc2lnbmVkIGNoYXIgKilwdHIsIDApKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoX1B5RmxvYXRfUGFjazgoeCwgKHVuc2lnbmVkIGNoYXIgKilwdHIsIDApKQorICAgICAgICByZXR1cm4gTlVMTDsKICNlbmRpZgotCV9SRVQodmFsdWUpOworICAgIF9SRVQodmFsdWUpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZF9nZXRfc3codm9pZCAqcHRyLCBQeV9zc2l6ZV90IHNpemUpCiB7CiAjaWZkZWYgV09SRFNfQklHRU5ESUFOCi0JcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShfUHlGbG9hdF9VbnBhY2s4KHB0ciwgMSkpOworICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoX1B5RmxvYXRfVW5wYWNrOChwdHIsIDEpKTsKICNlbHNlCi0JcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShfUHlGbG9hdF9VbnBhY2s4KHB0ciwgMCkpOworICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoX1B5RmxvYXRfVW5wYWNrOChwdHIsIDApKTsKICNlbmRpZgogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZl9zZXQodm9pZCAqcHRyLCBQeU9iamVjdCAqdmFsdWUsIFB5X3NzaXplX3Qgc2l6ZSkKIHsKLQlmbG9hdCB4OworICAgIGZsb2F0IHg7CiAKLQl4ID0gKGZsb2F0KVB5RmxvYXRfQXNEb3VibGUodmFsdWUpOwotCWlmICh4ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAgIiBmbG9hdCBleHBlY3RlZCBpbnN0ZWFkIG9mICVzIGluc3RhbmNlIiwKLQkJCSAgICAgdmFsdWUtPm9iX3R5cGUtPnRwX25hbWUpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JbWVtY3B5KHB0ciwgJngsIHNpemVvZih4KSk7Ci0JX1JFVCh2YWx1ZSk7CisgICAgeCA9IChmbG9hdClQeUZsb2F0X0FzRG91YmxlKHZhbHVlKTsKKyAgICBpZiAoeCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiIGZsb2F0IGV4cGVjdGVkIGluc3RlYWQgb2YgJXMgaW5zdGFuY2UiLAorICAgICAgICAgICAgICAgICAgICAgdmFsdWUtPm9iX3R5cGUtPnRwX25hbWUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgbWVtY3B5KHB0ciwgJngsIHNpemVvZih4KSk7CisgICAgX1JFVCh2YWx1ZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmX2dldCh2b2lkICpwdHIsIFB5X3NzaXplX3Qgc2l6ZSkKIHsKLQlmbG9hdCB2YWw7Ci0JbWVtY3B5KCZ2YWwsIHB0ciwgc2l6ZW9mKHZhbCkpOwotCXJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUodmFsKTsKKyAgICBmbG9hdCB2YWw7CisgICAgbWVtY3B5KCZ2YWwsIHB0ciwgc2l6ZW9mKHZhbCkpOworICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUodmFsKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZfc2V0X3N3KHZvaWQgKnB0ciwgUHlPYmplY3QgKnZhbHVlLCBQeV9zc2l6ZV90IHNpemUpCiB7Ci0JZmxvYXQgeDsKKyAgICBmbG9hdCB4OwogCi0JeCA9IChmbG9hdClQeUZsb2F0X0FzRG91YmxlKHZhbHVlKTsKLQlpZiAoeCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgICIgZmxvYXQgZXhwZWN0ZWQgaW5zdGVhZCBvZiAlcyBpbnN0YW5jZSIsCi0JCQkgICAgIHZhbHVlLT5vYl90eXBlLT50cF9uYW1lKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIHggPSAoZmxvYXQpUHlGbG9hdF9Bc0RvdWJsZSh2YWx1ZSk7CisgICAgaWYgKHggPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIiBmbG9hdCBleHBlY3RlZCBpbnN0ZWFkIG9mICVzIGluc3RhbmNlIiwKKyAgICAgICAgICAgICAgICAgICAgIHZhbHVlLT5vYl90eXBlLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogI2lmZGVmIFdPUkRTX0JJR0VORElBTgotCWlmIChfUHlGbG9hdF9QYWNrNCh4LCAodW5zaWduZWQgY2hhciAqKXB0ciwgMSkpCi0JCXJldHVybiBOVUxMOworICAgIGlmIChfUHlGbG9hdF9QYWNrNCh4LCAodW5zaWduZWQgY2hhciAqKXB0ciwgMSkpCisgICAgICAgIHJldHVybiBOVUxMOwogI2Vsc2UKLQlpZiAoX1B5RmxvYXRfUGFjazQoeCwgKHVuc2lnbmVkIGNoYXIgKilwdHIsIDApKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoX1B5RmxvYXRfUGFjazQoeCwgKHVuc2lnbmVkIGNoYXIgKilwdHIsIDApKQorICAgICAgICByZXR1cm4gTlVMTDsKICNlbmRpZgotCV9SRVQodmFsdWUpOworICAgIF9SRVQodmFsdWUpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZl9nZXRfc3codm9pZCAqcHRyLCBQeV9zc2l6ZV90IHNpemUpCiB7CiAjaWZkZWYgV09SRFNfQklHRU5ESUFOCi0JcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShfUHlGbG9hdF9VbnBhY2s0KHB0ciwgMSkpOworICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoX1B5RmxvYXRfVW5wYWNrNChwdHIsIDEpKTsKICNlbHNlCi0JcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShfUHlGbG9hdF9VbnBhY2s0KHB0ciwgMCkpOworICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoX1B5RmxvYXRfVW5wYWNrNChwdHIsIDApKTsKICNlbmRpZgogfQogCkBAIC0xMTQxLDQ1ICsxMTQxLDQ1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogT19nZXQodm9pZCAqcHRyLCBQeV9zc2l6ZV90IHNpemUpCiB7Ci0JUHlPYmplY3QgKm9iID0gKihQeU9iamVjdCAqKilwdHI7Ci0JaWYgKG9iID09IE5VTEwpIHsKLQkJaWYgKCFQeUVycl9PY2N1cnJlZCgpKQotCQkJLyogU2V0IGFuIGVycm9yIGlmIG5vdCB5ZXQgc2V0ICovCi0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkJIlB5T2JqZWN0IGlzIE5VTEwiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5X0lOQ1JFRihvYik7Ci0JcmV0dXJuIG9iOworICAgIFB5T2JqZWN0ICpvYiA9ICooUHlPYmplY3QgKiopcHRyOworICAgIGlmIChvYiA9PSBOVUxMKSB7CisgICAgICAgIGlmICghUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIC8qIFNldCBhbiBlcnJvciBpZiBub3QgeWV0IHNldCAqLworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlB5T2JqZWN0IGlzIE5VTEwiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5X0lOQ1JFRihvYik7CisgICAgcmV0dXJuIG9iOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogT19zZXQodm9pZCAqcHRyLCBQeU9iamVjdCAqdmFsdWUsIFB5X3NzaXplX3Qgc2l6ZSkKIHsKLQkvKiBIbSwgZG9lcyB0aGUgbWVtb3J5IGJsb2NrIG5lZWQgaXQncyBvd24gcmVmY291bnQgb3Igbm90PyAqLwotCSooUHlPYmplY3QgKiopcHRyID0gdmFsdWU7Ci0JUHlfSU5DUkVGKHZhbHVlKTsKLQlyZXR1cm4gdmFsdWU7CisgICAgLyogSG0sIGRvZXMgdGhlIG1lbW9yeSBibG9jayBuZWVkIGl0J3Mgb3duIHJlZmNvdW50IG9yIG5vdD8gKi8KKyAgICAqKFB5T2JqZWN0ICoqKXB0ciA9IHZhbHVlOworICAgIFB5X0lOQ1JFRih2YWx1ZSk7CisgICAgcmV0dXJuIHZhbHVlOwogfQogCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjX3NldCh2b2lkICpwdHIsIFB5T2JqZWN0ICp2YWx1ZSwgUHlfc3NpemVfdCBzaXplKQogewotCWlmICghUHlTdHJpbmdfQ2hlY2sodmFsdWUpIHx8ICgxICE9IFB5U3RyaW5nX1NpemUodmFsdWUpKSkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJICAgICAib25lIGNoYXJhY3RlciBzdHJpbmcgZXhwZWN0ZWQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCSooY2hhciAqKXB0ciA9IFB5U3RyaW5nX0FTX1NUUklORyh2YWx1ZSlbMF07Ci0JX1JFVCh2YWx1ZSk7CisgICAgaWYgKCFQeVN0cmluZ19DaGVjayh2YWx1ZSkgfHwgKDEgIT0gUHlTdHJpbmdfU2l6ZSh2YWx1ZSkpKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAib25lIGNoYXJhY3RlciBzdHJpbmcgZXhwZWN0ZWQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgICooY2hhciAqKXB0ciA9IFB5U3RyaW5nX0FTX1NUUklORyh2YWx1ZSlbMF07CisgICAgX1JFVCh2YWx1ZSk7CiB9CiAKIAogc3RhdGljIFB5T2JqZWN0ICoKIGNfZ2V0KHZvaWQgKnB0ciwgUHlfc3NpemVfdCBzaXplKQogewotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKXB0ciwgMSk7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopcHRyLCAxKTsKIH0KIAogI2lmZGVmIENUWVBFU19VTklDT0RFCkBAIC0xMTg3LDExMiArMTE4NywxMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiB1X3NldCh2b2lkICpwdHIsIFB5T2JqZWN0ICp2YWx1ZSwgUHlfc3NpemVfdCBzaXplKQogewotCVB5X3NzaXplX3QgbGVuOworICAgIFB5X3NzaXplX3QgbGVuOwogCi0JaWYgKFB5U3RyaW5nX0NoZWNrKHZhbHVlKSkgewotCQl2YWx1ZSA9IFB5VW5pY29kZV9Gcm9tRW5jb2RlZE9iamVjdCh2YWx1ZSwKLQkJCQkJCSAgICBjb252ZXJzaW9uX21vZGVfZW5jb2RpbmcsCi0JCQkJCQkgICAgY29udmVyc2lvbl9tb2RlX2Vycm9ycyk7Ci0JCWlmICghdmFsdWUpCi0JCQlyZXR1cm4gTlVMTDsKLQl9IGVsc2UgaWYgKCFQeVVuaWNvZGVfQ2hlY2sodmFsdWUpKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkJInVuaWNvZGUgc3RyaW5nIGV4cGVjdGVkIGluc3RlYWQgb2YgJXMgaW5zdGFuY2UiLAotCQkJCXZhbHVlLT5vYl90eXBlLT50cF9uYW1lKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfSBlbHNlCi0JCVB5X0lOQ1JFRih2YWx1ZSk7CisgICAgaWYgKFB5U3RyaW5nX0NoZWNrKHZhbHVlKSkgeworICAgICAgICB2YWx1ZSA9IFB5VW5pY29kZV9Gcm9tRW5jb2RlZE9iamVjdCh2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVyc2lvbl9tb2RlX2VuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJzaW9uX21vZGVfZXJyb3JzKTsKKyAgICAgICAgaWYgKCF2YWx1ZSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0gZWxzZSBpZiAoIVB5VW5pY29kZV9DaGVjayh2YWx1ZSkpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ1bmljb2RlIHN0cmluZyBleHBlY3RlZCBpbnN0ZWFkIG9mICVzIGluc3RhbmNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLT5vYl90eXBlLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfSBlbHNlCisgICAgICAgIFB5X0lOQ1JFRih2YWx1ZSk7CiAKLQlsZW4gPSBQeVVuaWNvZGVfR0VUX1NJWkUodmFsdWUpOwotCWlmIChsZW4gIT0gMSkgewotCQlQeV9ERUNSRUYodmFsdWUpOwotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJvbmUgY2hhcmFjdGVyIHVuaWNvZGUgc3RyaW5nIGV4cGVjdGVkIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBsZW4gPSBQeVVuaWNvZGVfR0VUX1NJWkUodmFsdWUpOworICAgIGlmIChsZW4gIT0gMSkgeworICAgICAgICBQeV9ERUNSRUYodmFsdWUpOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIm9uZSBjaGFyYWN0ZXIgdW5pY29kZSBzdHJpbmcgZXhwZWN0ZWQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JKih3Y2hhcl90ICopcHRyID0gUHlVbmljb2RlX0FTX1VOSUNPREUodmFsdWUpWzBdOwotCVB5X0RFQ1JFRih2YWx1ZSk7CisgICAgKih3Y2hhcl90ICopcHRyID0gUHlVbmljb2RlX0FTX1VOSUNPREUodmFsdWUpWzBdOworICAgIFB5X0RFQ1JFRih2YWx1ZSk7CiAKLQlfUkVUKHZhbHVlKTsKKyAgICBfUkVUKHZhbHVlKTsKIH0KIAogCiBzdGF0aWMgUHlPYmplY3QgKgogdV9nZXQodm9pZCAqcHRyLCBQeV9zc2l6ZV90IHNpemUpCiB7Ci0JcmV0dXJuIFB5VW5pY29kZV9Gcm9tV2lkZUNoYXIoKHdjaGFyX3QgKilwdHIsIDEpOworICAgIHJldHVybiBQeVVuaWNvZGVfRnJvbVdpZGVDaGFyKCh3Y2hhcl90ICopcHRyLCAxKTsKIH0KIAogLyogVSAtIGEgdW5pY29kZSBzdHJpbmcgKi8KIHN0YXRpYyBQeU9iamVjdCAqCiBVX2dldCh2b2lkICpwdHIsIFB5X3NzaXplX3Qgc2l6ZSkKIHsKLQlQeU9iamVjdCAqcmVzdWx0OwotCVB5X3NzaXplX3QgbGVuOwotCVB5X1VOSUNPREUgKnA7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICBQeV9zc2l6ZV90IGxlbjsKKyAgICBQeV9VTklDT0RFICpwOwogCi0Jc2l6ZSAvPSBzaXplb2Yod2NoYXJfdCk7IC8qIHdlIGNvdW50IGNoYXJhY3RlciB1bml0cyBoZXJlLCBub3QgYnl0ZXMgKi8KKyAgICBzaXplIC89IHNpemVvZih3Y2hhcl90KTsgLyogd2UgY291bnQgY2hhcmFjdGVyIHVuaXRzIGhlcmUsIG5vdCBieXRlcyAqLwogCi0JcmVzdWx0ID0gUHlVbmljb2RlX0Zyb21XaWRlQ2hhcigod2NoYXJfdCAqKXB0ciwgc2l6ZSk7Ci0JaWYgKCFyZXN1bHQpCi0JCXJldHVybiBOVUxMOwotCS8qIFdlIG5lZWQgJ3Jlc3VsdCcgdG8gYmUgYWJsZSB0byBjb3VudCB0aGUgY2hhcmFjdGVycyB3aXRoIHdjc2xlbiwKLQkgICBzaW5jZSBwdHIgbWF5IG5vdCBiZSBOVUwgdGVybWluYXRlZC4gIElmIHRoZSBsZW5ndGggaXMgc21hbGxlciAoaWYKLQkgICBpdCB3YXMgYWN0dWFsbHkgTlVMIHRlcm1pbmF0ZWQsIHdlIGNvbnN0cnVjdCBhIG5ldyBvbmUgYW5kIHRocm93Ci0JICAgYXdheSB0aGUgcmVzdWx0LgotCSovCi0JLyogY2hvcCBvZmYgYXQgdGhlIGZpcnN0IE5VTCBjaGFyYWN0ZXIsIGlmIGFueS4gKi8KLQlwID0gUHlVbmljb2RlX0FTX1VOSUNPREUocmVzdWx0KTsKLQlmb3IgKGxlbiA9IDA7IGxlbiA8IHNpemU7ICsrbGVuKQotCQlpZiAoIXBbbGVuXSkKLQkJCWJyZWFrOworICAgIHJlc3VsdCA9IFB5VW5pY29kZV9Gcm9tV2lkZUNoYXIoKHdjaGFyX3QgKilwdHIsIHNpemUpOworICAgIGlmICghcmVzdWx0KQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAvKiBXZSBuZWVkICdyZXN1bHQnIHRvIGJlIGFibGUgdG8gY291bnQgdGhlIGNoYXJhY3RlcnMgd2l0aCB3Y3NsZW4sCisgICAgICAgc2luY2UgcHRyIG1heSBub3QgYmUgTlVMIHRlcm1pbmF0ZWQuICBJZiB0aGUgbGVuZ3RoIGlzIHNtYWxsZXIgKGlmCisgICAgICAgaXQgd2FzIGFjdHVhbGx5IE5VTCB0ZXJtaW5hdGVkLCB3ZSBjb25zdHJ1Y3QgYSBuZXcgb25lIGFuZCB0aHJvdworICAgICAgIGF3YXkgdGhlIHJlc3VsdC4KKyAgICAqLworICAgIC8qIGNob3Agb2ZmIGF0IHRoZSBmaXJzdCBOVUwgY2hhcmFjdGVyLCBpZiBhbnkuICovCisgICAgcCA9IFB5VW5pY29kZV9BU19VTklDT0RFKHJlc3VsdCk7CisgICAgZm9yIChsZW4gPSAwOyBsZW4gPCBzaXplOyArK2xlbikKKyAgICAgICAgaWYgKCFwW2xlbl0pCisgICAgICAgICAgICBicmVhazsKIAotCWlmIChsZW4gPCBzaXplKSB7Ci0JCVB5T2JqZWN0ICpvYiA9IFB5VW5pY29kZV9Gcm9tV2lkZUNoYXIoKHdjaGFyX3QgKilwdHIsIGxlbik7Ci0JCVB5X0RFQ1JFRihyZXN1bHQpOwotCQlyZXR1cm4gb2I7Ci0JfQotCXJldHVybiByZXN1bHQ7CisgICAgaWYgKGxlbiA8IHNpemUpIHsKKyAgICAgICAgUHlPYmplY3QgKm9iID0gUHlVbmljb2RlX0Zyb21XaWRlQ2hhcigod2NoYXJfdCAqKXB0ciwgbGVuKTsKKyAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgIHJldHVybiBvYjsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFVfc2V0KHZvaWQgKnB0ciwgUHlPYmplY3QgKnZhbHVlLCBQeV9zc2l6ZV90IGxlbmd0aCkKIHsKLQlQeV9zc2l6ZV90IHNpemU7CisgICAgUHlfc3NpemVfdCBzaXplOwogCi0JLyogSXQncyBlYXNpZXIgdG8gY2FsY3VsYXRlIGluIGNoYXJhY3RlcnMgdGhhbiBpbiBieXRlcyAqLwotCWxlbmd0aCAvPSBzaXplb2Yod2NoYXJfdCk7CisgICAgLyogSXQncyBlYXNpZXIgdG8gY2FsY3VsYXRlIGluIGNoYXJhY3RlcnMgdGhhbiBpbiBieXRlcyAqLworICAgIGxlbmd0aCAvPSBzaXplb2Yod2NoYXJfdCk7CiAKLQlpZiAoUHlTdHJpbmdfQ2hlY2sodmFsdWUpKSB7Ci0JCXZhbHVlID0gUHlVbmljb2RlX0Zyb21FbmNvZGVkT2JqZWN0KHZhbHVlLAotCQkJCQkJICAgIGNvbnZlcnNpb25fbW9kZV9lbmNvZGluZywKLQkJCQkJCSAgICBjb252ZXJzaW9uX21vZGVfZXJyb3JzKTsKLQkJaWYgKCF2YWx1ZSkKLQkJCXJldHVybiBOVUxMOwotCX0gZWxzZSBpZiAoIVB5VW5pY29kZV9DaGVjayh2YWx1ZSkpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCQkidW5pY29kZSBzdHJpbmcgZXhwZWN0ZWQgaW5zdGVhZCBvZiAlcyBpbnN0YW5jZSIsCi0JCQkJdmFsdWUtPm9iX3R5cGUtPnRwX25hbWUpOwotCQlyZXR1cm4gTlVMTDsKLQl9IGVsc2UKLQkJUHlfSU5DUkVGKHZhbHVlKTsKLQlzaXplID0gUHlVbmljb2RlX0dFVF9TSVpFKHZhbHVlKTsKLQlpZiAoc2l6ZSA+IGxlbmd0aCkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICBpZiAoUHlTdHJpbmdfQ2hlY2sodmFsdWUpKSB7CisgICAgICAgIHZhbHVlID0gUHlVbmljb2RlX0Zyb21FbmNvZGVkT2JqZWN0KHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJzaW9uX21vZGVfZW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnNpb25fbW9kZV9lcnJvcnMpOworICAgICAgICBpZiAoIXZhbHVlKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfSBlbHNlIGlmICghUHlVbmljb2RlX0NoZWNrKHZhbHVlKSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInVuaWNvZGUgc3RyaW5nIGV4cGVjdGVkIGluc3RlYWQgb2YgJXMgaW5zdGFuY2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUtPm9iX3R5cGUtPnRwX25hbWUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9IGVsc2UKKyAgICAgICAgUHlfSU5DUkVGKHZhbHVlKTsKKyAgICBzaXplID0gUHlVbmljb2RlX0dFVF9TSVpFKHZhbHVlKTsKKyAgICBpZiAoc2l6ZSA+IGxlbmd0aCkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKICNpZiAoUFlfVkVSU0lPTl9IRVggPCAweDAyMDUwMDAwKQotCQkJICAgICAic3RyaW5nIHRvbyBsb25nICglZCwgbWF4aW11bSBsZW5ndGggJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICJzdHJpbmcgdG9vIGxvbmcgKCVkLCBtYXhpbXVtIGxlbmd0aCAlZCkiLAogI2Vsc2UKLQkJCSAgICAgInN0cmluZyB0b28gbG9uZyAoJXpkLCBtYXhpbXVtIGxlbmd0aCAlemQpIiwKKyAgICAgICAgICAgICAgICAgICAgICJzdHJpbmcgdG9vIGxvbmcgKCV6ZCwgbWF4aW11bSBsZW5ndGggJXpkKSIsCiAjZW5kaWYKLQkJCSAgICAgc2l6ZSwgbGVuZ3RoKTsKLQkJUHlfREVDUkVGKHZhbHVlKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfSBlbHNlIGlmIChzaXplIDwgbGVuZ3RoLTEpCi0JCS8qIGNvcHkgdGVybWluYXRpbmcgTlVMIGNoYXJhY3RlciBpZiB0aGVyZSBpcyBzcGFjZSAqLwotCQlzaXplICs9IDE7Ci0JUHlVbmljb2RlX0FzV2lkZUNoYXIoKFB5VW5pY29kZU9iamVjdCAqKXZhbHVlLCAod2NoYXJfdCAqKXB0ciwgc2l6ZSk7Ci0JcmV0dXJuIHZhbHVlOworICAgICAgICAgICAgICAgICAgICAgc2l6ZSwgbGVuZ3RoKTsKKyAgICAgICAgUHlfREVDUkVGKHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfSBlbHNlIGlmIChzaXplIDwgbGVuZ3RoLTEpCisgICAgICAgIC8qIGNvcHkgdGVybWluYXRpbmcgTlVMIGNoYXJhY3RlciBpZiB0aGVyZSBpcyBzcGFjZSAqLworICAgICAgICBzaXplICs9IDE7CisgICAgUHlVbmljb2RlX0FzV2lkZUNoYXIoKFB5VW5pY29kZU9iamVjdCAqKXZhbHVlLCAod2NoYXJfdCAqKXB0ciwgc2l6ZSk7CisgICAgcmV0dXJuIHZhbHVlOwogfQogCiAjZW5kaWYKQEAgLTEzMDAsMjAxICsxMzAwLDIwMSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNfZ2V0KHZvaWQgKnB0ciwgUHlfc3NpemVfdCBzaXplKQogewotCVB5T2JqZWN0ICpyZXN1bHQ7Ci0Jc2l6ZV90IHNsZW47CisgICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICBzaXplX3Qgc2xlbjsKIAotCXJlc3VsdCA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoKGNoYXIgKilwdHIpOwotCWlmICghcmVzdWx0KQotCQlyZXR1cm4gTlVMTDsKLQkvKiBjaG9wIG9mZiBhdCB0aGUgZmlyc3QgTlVMIGNoYXJhY3RlciwgaWYgYW55LgotCSAqIE9uIGVycm9yLCByZXN1bHQgd2lsbCBiZSBkZWFsbG9jYXRlZCBhbmQgc2V0IHRvIE5VTEwuCi0JICovCi0Jc2xlbiA9IHN0cmxlbihQeVN0cmluZ19BU19TVFJJTkcocmVzdWx0KSk7Ci0Jc2l6ZSA9IG1pbihzaXplLCAoUHlfc3NpemVfdClzbGVuKTsKLQlpZiAocmVzdWx0LT5vYl9yZWZjbnQgPT0gMSkgewotCQkvKiBzaG9ydGVuIHRoZSByZXN1bHQgKi8KLQkJX1B5U3RyaW5nX1Jlc2l6ZSgmcmVzdWx0LCBzaXplKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9IGVsc2UKLQkJLyogY2Fubm90IHNob3J0ZW4gdGhlIHJlc3VsdCAqLwotCQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocHRyLCBzaXplKTsKKyAgICByZXN1bHQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKChjaGFyICopcHRyKTsKKyAgICBpZiAoIXJlc3VsdCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgLyogY2hvcCBvZmYgYXQgdGhlIGZpcnN0IE5VTCBjaGFyYWN0ZXIsIGlmIGFueS4KKyAgICAgKiBPbiBlcnJvciwgcmVzdWx0IHdpbGwgYmUgZGVhbGxvY2F0ZWQgYW5kIHNldCB0byBOVUxMLgorICAgICAqLworICAgIHNsZW4gPSBzdHJsZW4oUHlTdHJpbmdfQVNfU1RSSU5HKHJlc3VsdCkpOworICAgIHNpemUgPSBtaW4oc2l6ZSwgKFB5X3NzaXplX3Qpc2xlbik7CisgICAgaWYgKHJlc3VsdC0+b2JfcmVmY250ID09IDEpIHsKKyAgICAgICAgLyogc2hvcnRlbiB0aGUgcmVzdWx0ICovCisgICAgICAgIF9QeVN0cmluZ19SZXNpemUoJnJlc3VsdCwgc2l6ZSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfSBlbHNlCisgICAgICAgIC8qIGNhbm5vdCBzaG9ydGVuIHRoZSByZXN1bHQgKi8KKyAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHB0ciwgc2l6ZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzX3NldCh2b2lkICpwdHIsIFB5T2JqZWN0ICp2YWx1ZSwgUHlfc3NpemVfdCBsZW5ndGgpCiB7Ci0JY2hhciAqZGF0YTsKLQlQeV9zc2l6ZV90IHNpemU7CisgICAgY2hhciAqZGF0YTsKKyAgICBQeV9zc2l6ZV90IHNpemU7CiAKLQlkYXRhID0gUHlTdHJpbmdfQXNTdHJpbmcodmFsdWUpOwotCWlmICghZGF0YSkKLQkJcmV0dXJuIE5VTEw7Ci0Jc2l6ZSA9IHN0cmxlbihkYXRhKTsKLQlpZiAoc2l6ZSA8IGxlbmd0aCkgewotCQkvKiBUaGlzIHdpbGwgY29weSB0aGUgbGVhZGluZyBOVUwgY2hhcmFjdGVyCi0JCSAqIGlmIHRoZXJlIGlzIHNwYWNlIGZvciBpdC4KLQkJICovCi0JCSsrc2l6ZTsKLQl9IGVsc2UgaWYgKHNpemUgPiBsZW5ndGgpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgZGF0YSA9IFB5U3RyaW5nX0FzU3RyaW5nKHZhbHVlKTsKKyAgICBpZiAoIWRhdGEpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHNpemUgPSBzdHJsZW4oZGF0YSk7CisgICAgaWYgKHNpemUgPCBsZW5ndGgpIHsKKyAgICAgICAgLyogVGhpcyB3aWxsIGNvcHkgdGhlIGxlYWRpbmcgTlVMIGNoYXJhY3RlcgorICAgICAgICAgKiBpZiB0aGVyZSBpcyBzcGFjZSBmb3IgaXQuCisgICAgICAgICAqLworICAgICAgICArK3NpemU7CisgICAgfSBlbHNlIGlmIChzaXplID4gbGVuZ3RoKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAogI2lmIChQWV9WRVJTSU9OX0hFWCA8IDB4MDIwNTAwMDApCi0JCQkgICAgICJzdHJpbmcgdG9vIGxvbmcgKCVkLCBtYXhpbXVtIGxlbmd0aCAlZCkiLAorICAgICAgICAgICAgICAgICAgICAgInN0cmluZyB0b28gbG9uZyAoJWQsIG1heGltdW0gbGVuZ3RoICVkKSIsCiAjZWxzZQotCQkJICAgICAic3RyaW5nIHRvbyBsb25nICglemQsIG1heGltdW0gbGVuZ3RoICV6ZCkiLAorICAgICAgICAgICAgICAgICAgICAgInN0cmluZyB0b28gbG9uZyAoJXpkLCBtYXhpbXVtIGxlbmd0aCAlemQpIiwKICNlbmRpZgotCQkJICAgICBzaXplLCBsZW5ndGgpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JLyogQWxzbyBjb3B5IHRoZSB0ZXJtaW5hdGluZyBOVUwgY2hhcmFjdGVyIGlmIHRoZXJlIGlzIHNwYWNlICovCi0JbWVtY3B5KChjaGFyICopcHRyLCBkYXRhLCBzaXplKTsKLQlfUkVUKHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgIHNpemUsIGxlbmd0aCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICAvKiBBbHNvIGNvcHkgdGhlIHRlcm1pbmF0aW5nIE5VTCBjaGFyYWN0ZXIgaWYgdGhlcmUgaXMgc3BhY2UgKi8KKyAgICBtZW1jcHkoKGNoYXIgKilwdHIsIGRhdGEsIHNpemUpOworICAgIF9SRVQodmFsdWUpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogel9zZXQodm9pZCAqcHRyLCBQeU9iamVjdCAqdmFsdWUsIFB5X3NzaXplX3Qgc2l6ZSkKIHsKLQlpZiAodmFsdWUgPT0gUHlfTm9uZSkgewotCQkqKGNoYXIgKiopcHRyID0gTlVMTDsKLQkJUHlfSU5DUkVGKHZhbHVlKTsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQlpZiAoUHlTdHJpbmdfQ2hlY2sodmFsdWUpKSB7Ci0JCSooY2hhciAqKilwdHIgPSBQeVN0cmluZ19BU19TVFJJTkcodmFsdWUpOwotCQlQeV9JTkNSRUYodmFsdWUpOwotCQlyZXR1cm4gdmFsdWU7Ci0JfSBlbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2sodmFsdWUpKSB7Ci0JCVB5T2JqZWN0ICpzdHIgPSBQeVVuaWNvZGVfQXNFbmNvZGVkU3RyaW5nKHZhbHVlLAotCQkJCQkJCSAgY29udmVyc2lvbl9tb2RlX2VuY29kaW5nLAotCQkJCQkJCSAgY29udmVyc2lvbl9tb2RlX2Vycm9ycyk7Ci0JCWlmIChzdHIgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQkqKGNoYXIgKiopcHRyID0gUHlTdHJpbmdfQVNfU1RSSU5HKHN0cik7Ci0JCXJldHVybiBzdHI7Ci0JfSBlbHNlIGlmIChQeUludF9DaGVjayh2YWx1ZSkgfHwgUHlMb25nX0NoZWNrKHZhbHVlKSkgeworICAgIGlmICh2YWx1ZSA9PSBQeV9Ob25lKSB7CisgICAgICAgICooY2hhciAqKilwdHIgPSBOVUxMOworICAgICAgICBQeV9JTkNSRUYodmFsdWUpOworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorICAgIGlmIChQeVN0cmluZ19DaGVjayh2YWx1ZSkpIHsKKyAgICAgICAgKihjaGFyICoqKXB0ciA9IFB5U3RyaW5nX0FTX1NUUklORyh2YWx1ZSk7CisgICAgICAgIFB5X0lOQ1JFRih2YWx1ZSk7CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9IGVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayh2YWx1ZSkpIHsKKyAgICAgICAgUHlPYmplY3QgKnN0ciA9IFB5VW5pY29kZV9Bc0VuY29kZWRTdHJpbmcodmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnNpb25fbW9kZV9lbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVyc2lvbl9tb2RlX2Vycm9ycyk7CisgICAgICAgIGlmIChzdHIgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAqKGNoYXIgKiopcHRyID0gUHlTdHJpbmdfQVNfU1RSSU5HKHN0cik7CisgICAgICAgIHJldHVybiBzdHI7CisgICAgfSBlbHNlIGlmIChQeUludF9DaGVjayh2YWx1ZSkgfHwgUHlMb25nX0NoZWNrKHZhbHVlKSkgewogI2lmIFNJWkVPRl9WT0lEX1AgPT0gU0laRU9GX0xPTkdfTE9ORwotCQkqKGNoYXIgKiopcHRyID0gKGNoYXIgKilQeUludF9Bc1Vuc2lnbmVkTG9uZ0xvbmdNYXNrKHZhbHVlKTsKKyAgICAgICAgKihjaGFyICoqKXB0ciA9IChjaGFyICopUHlJbnRfQXNVbnNpZ25lZExvbmdMb25nTWFzayh2YWx1ZSk7CiAjZWxzZQotCQkqKGNoYXIgKiopcHRyID0gKGNoYXIgKilQeUludF9Bc1Vuc2lnbmVkTG9uZ01hc2sodmFsdWUpOworICAgICAgICAqKGNoYXIgKiopcHRyID0gKGNoYXIgKilQeUludF9Bc1Vuc2lnbmVkTG9uZ01hc2sodmFsdWUpOwogI2VuZGlmCi0JCV9SRVQodmFsdWUpOwotCX0KLQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkgICAgICJzdHJpbmcgb3IgaW50ZWdlciBhZGRyZXNzIGV4cGVjdGVkIGluc3RlYWQgb2YgJXMgaW5zdGFuY2UiLAotCQkgICAgIHZhbHVlLT5vYl90eXBlLT50cF9uYW1lKTsKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgX1JFVCh2YWx1ZSk7CisgICAgfQorICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICJzdHJpbmcgb3IgaW50ZWdlciBhZGRyZXNzIGV4cGVjdGVkIGluc3RlYWQgb2YgJXMgaW5zdGFuY2UiLAorICAgICAgICAgICAgICAgICB2YWx1ZS0+b2JfdHlwZS0+dHBfbmFtZSk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB6X2dldCh2b2lkICpwdHIsIFB5X3NzaXplX3Qgc2l6ZSkKIHsKLQkvKiBYWFggV2hhdCBhYm91dCBpbnZhbGlkIHBvaW50ZXJzID8/PyAqLwotCWlmICgqKHZvaWQgKiopcHRyKSB7CisgICAgLyogWFhYIFdoYXQgYWJvdXQgaW52YWxpZCBwb2ludGVycyA/Pz8gKi8KKyAgICBpZiAoKih2b2lkICoqKXB0cikgewogI2lmIGRlZmluZWQoTVNfV0lOMzIpICYmICFkZWZpbmVkKF9XSU4zMl9XQ0UpCi0JCWlmIChJc0JhZFN0cmluZ1B0ckEoKihjaGFyICoqKXB0ciwgLTEpKSB7Ci0JCQlQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkgICAgICJpbnZhbGlkIHN0cmluZyBwb2ludGVyICVwIiwKLQkJCQkgICAgICooY2hhciAqKilwdHIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KKyAgICAgICAgaWYgKElzQmFkU3RyaW5nUHRyQSgqKGNoYXIgKiopcHRyLCAtMSkpIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIHN0cmluZyBwb2ludGVyICVwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqKGNoYXIgKiopcHRyKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CiAjZW5kaWYKLQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoKihjaGFyICoqKXB0cik7Ci0JfSBlbHNlIHsKLQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQlyZXR1cm4gUHlfTm9uZTsKLQl9CisgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKCooY2hhciAqKilwdHIpOworICAgIH0gZWxzZSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgfQogfQogCiAjaWZkZWYgQ1RZUEVTX1VOSUNPREUKIHN0YXRpYyBQeU9iamVjdCAqCiBaX3NldCh2b2lkICpwdHIsIFB5T2JqZWN0ICp2YWx1ZSwgUHlfc3NpemVfdCBzaXplKQogewotCWlmICh2YWx1ZSA9PSBQeV9Ob25lKSB7Ci0JCSood2NoYXJfdCAqKilwdHIgPSBOVUxMOwotCQlQeV9JTkNSRUYodmFsdWUpOwotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCWlmIChQeVN0cmluZ19DaGVjayh2YWx1ZSkpIHsKLQkJdmFsdWUgPSBQeVVuaWNvZGVfRnJvbUVuY29kZWRPYmplY3QodmFsdWUsCi0JCQkJCQkgICAgY29udmVyc2lvbl9tb2RlX2VuY29kaW5nLAotCQkJCQkJICAgIGNvbnZlcnNpb25fbW9kZV9lcnJvcnMpOwotCQlpZiAoIXZhbHVlKQotCQkJcmV0dXJuIE5VTEw7Ci0JfSBlbHNlIGlmIChQeUludF9DaGVjayh2YWx1ZSkgfHwgUHlMb25nX0NoZWNrKHZhbHVlKSkgeworICAgIGlmICh2YWx1ZSA9PSBQeV9Ob25lKSB7CisgICAgICAgICood2NoYXJfdCAqKilwdHIgPSBOVUxMOworICAgICAgICBQeV9JTkNSRUYodmFsdWUpOworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorICAgIGlmIChQeVN0cmluZ19DaGVjayh2YWx1ZSkpIHsKKyAgICAgICAgdmFsdWUgPSBQeVVuaWNvZGVfRnJvbUVuY29kZWRPYmplY3QodmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnNpb25fbW9kZV9lbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVyc2lvbl9tb2RlX2Vycm9ycyk7CisgICAgICAgIGlmICghdmFsdWUpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9IGVsc2UgaWYgKFB5SW50X0NoZWNrKHZhbHVlKSB8fCBQeUxvbmdfQ2hlY2sodmFsdWUpKSB7CiAjaWYgU0laRU9GX1ZPSURfUCA9PSBTSVpFT0ZfTE9OR19MT05HCi0JCSood2NoYXJfdCAqKilwdHIgPSAod2NoYXJfdCAqKVB5SW50X0FzVW5zaWduZWRMb25nTG9uZ01hc2sodmFsdWUpOworICAgICAgICAqKHdjaGFyX3QgKiopcHRyID0gKHdjaGFyX3QgKilQeUludF9Bc1Vuc2lnbmVkTG9uZ0xvbmdNYXNrKHZhbHVlKTsKICNlbHNlCi0JCSood2NoYXJfdCAqKilwdHIgPSAod2NoYXJfdCAqKVB5SW50X0FzVW5zaWduZWRMb25nTWFzayh2YWx1ZSk7CisgICAgICAgICood2NoYXJfdCAqKilwdHIgPSAod2NoYXJfdCAqKVB5SW50X0FzVW5zaWduZWRMb25nTWFzayh2YWx1ZSk7CiAjZW5kaWYKLQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQlyZXR1cm4gUHlfTm9uZTsKLQl9IGVsc2UgaWYgKCFQeVVuaWNvZGVfQ2hlY2sodmFsdWUpKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgICJ1bmljb2RlIHN0cmluZyBvciBpbnRlZ2VyIGFkZHJlc3MgZXhwZWN0ZWQgaW5zdGVhZCBvZiAlcyBpbnN0YW5jZSIsCi0JCQkgICAgIHZhbHVlLT5vYl90eXBlLT50cF9uYW1lKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfSBlbHNlCi0JCVB5X0lOQ1JFRih2YWx1ZSk7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgfSBlbHNlIGlmICghUHlVbmljb2RlX0NoZWNrKHZhbHVlKSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgInVuaWNvZGUgc3RyaW5nIG9yIGludGVnZXIgYWRkcmVzcyBleHBlY3RlZCBpbnN0ZWFkIG9mICVzIGluc3RhbmNlIiwKKyAgICAgICAgICAgICAgICAgICAgIHZhbHVlLT5vYl90eXBlLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfSBlbHNlCisgICAgICAgIFB5X0lOQ1JFRih2YWx1ZSk7CiAjaWZkZWYgSEFWRV9VU0FCTEVfV0NIQVJfVAotCS8qIEhBVkVfVVNBQkxFX1dDSEFSX1QgbWVhbnMgdGhhdCBQeV9VTklDT0RFIGFuZCB3Y2hhcl90IGlzIHRoZSBzYW1lCi0JICAgdHlwZS4gIFNvIHdlIGNhbiBjb3B5IGRpcmVjdGx5LiAgSG0sIGFyZSB1bmljb2RlIG9iamVjdHMgYWx3YXlzIE5VTAotCSAgIHRlcm1pbmF0ZWQgaW4gUHl0aG9uLCBpbnRlcm5hbGx5PwotCSAqLwotCSood2NoYXJfdCAqKilwdHIgPSBQeVVuaWNvZGVfQVNfVU5JQ09ERSh2YWx1ZSk7Ci0JcmV0dXJuIHZhbHVlOworICAgIC8qIEhBVkVfVVNBQkxFX1dDSEFSX1QgbWVhbnMgdGhhdCBQeV9VTklDT0RFIGFuZCB3Y2hhcl90IGlzIHRoZSBzYW1lCisgICAgICAgdHlwZS4gIFNvIHdlIGNhbiBjb3B5IGRpcmVjdGx5LiAgSG0sIGFyZSB1bmljb2RlIG9iamVjdHMgYWx3YXlzIE5VTAorICAgICAgIHRlcm1pbmF0ZWQgaW4gUHl0aG9uLCBpbnRlcm5hbGx5PworICAgICAqLworICAgICood2NoYXJfdCAqKilwdHIgPSBQeVVuaWNvZGVfQVNfVU5JQ09ERSh2YWx1ZSk7CisgICAgcmV0dXJuIHZhbHVlOwogI2Vsc2UKLQl7Ci0JCS8qIFdlIG11c3QgY3JlYXRlIGEgd2NoYXJfdCogYnVmZmVyIGZyb20gdGhlIHVuaWNvZGUgb2JqZWN0LAotCQkgICBhbmQga2VlcCBpdCBhbGl2ZSAqLwotCQlQeU9iamVjdCAqa2VlcDsKLQkJd2NoYXJfdCAqYnVmZmVyOworICAgIHsKKyAgICAgICAgLyogV2UgbXVzdCBjcmVhdGUgYSB3Y2hhcl90KiBidWZmZXIgZnJvbSB0aGUgdW5pY29kZSBvYmplY3QsCisgICAgICAgICAgIGFuZCBrZWVwIGl0IGFsaXZlICovCisgICAgICAgIFB5T2JqZWN0ICprZWVwOworICAgICAgICB3Y2hhcl90ICpidWZmZXI7CiAKLQkJaW50IHNpemUgPSBQeVVuaWNvZGVfR0VUX1NJWkUodmFsdWUpOwotCQlzaXplICs9IDE7IC8qIHRlcm1pbmF0aW5nIE5VTCAqLwotCQlzaXplICo9IHNpemVvZih3Y2hhcl90KTsKLQkJYnVmZmVyID0gKHdjaGFyX3QgKilQeU1lbV9NYWxsb2Moc2l6ZSk7Ci0JCWlmICghYnVmZmVyKSB7Ci0JCQlQeV9ERUNSRUYodmFsdWUpOwotCQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JCX0KLQkJbWVtc2V0KGJ1ZmZlciwgMCwgc2l6ZSk7Ci0JCWtlZXAgPSBQeUNPYmplY3RfRnJvbVZvaWRQdHIoYnVmZmVyLCBQeU1lbV9GcmVlKTsKLQkJaWYgKCFrZWVwKSB7Ci0JCQlQeV9ERUNSRUYodmFsdWUpOwotCQkJUHlNZW1fRnJlZShidWZmZXIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJKih3Y2hhcl90ICoqKXB0ciA9ICh3Y2hhcl90ICopYnVmZmVyOwotCQlpZiAoLTEgPT0gUHlVbmljb2RlX0FzV2lkZUNoYXIoKFB5VW5pY29kZU9iamVjdCAqKXZhbHVlLAotCQkJCQkgICAgICAgYnVmZmVyLCBQeVVuaWNvZGVfR0VUX1NJWkUodmFsdWUpKSkgewotCQkJUHlfREVDUkVGKHZhbHVlKTsKLQkJCVB5X0RFQ1JFRihrZWVwKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCVB5X0RFQ1JFRih2YWx1ZSk7Ci0JCXJldHVybiBrZWVwOwotCX0KKyAgICAgICAgaW50IHNpemUgPSBQeVVuaWNvZGVfR0VUX1NJWkUodmFsdWUpOworICAgICAgICBzaXplICs9IDE7IC8qIHRlcm1pbmF0aW5nIE5VTCAqLworICAgICAgICBzaXplICo9IHNpemVvZih3Y2hhcl90KTsKKyAgICAgICAgYnVmZmVyID0gKHdjaGFyX3QgKilQeU1lbV9NYWxsb2Moc2l6ZSk7CisgICAgICAgIGlmICghYnVmZmVyKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYodmFsdWUpOworICAgICAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIH0KKyAgICAgICAgbWVtc2V0KGJ1ZmZlciwgMCwgc2l6ZSk7CisgICAgICAgIGtlZXAgPSBQeUNPYmplY3RfRnJvbVZvaWRQdHIoYnVmZmVyLCBQeU1lbV9GcmVlKTsKKyAgICAgICAgaWYgKCFrZWVwKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYodmFsdWUpOworICAgICAgICAgICAgUHlNZW1fRnJlZShidWZmZXIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgKih3Y2hhcl90ICoqKXB0ciA9ICh3Y2hhcl90ICopYnVmZmVyOworICAgICAgICBpZiAoLTEgPT0gUHlVbmljb2RlX0FzV2lkZUNoYXIoKFB5VW5pY29kZU9iamVjdCAqKXZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLCBQeVVuaWNvZGVfR0VUX1NJWkUodmFsdWUpKSkgeworICAgICAgICAgICAgUHlfREVDUkVGKHZhbHVlKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihrZWVwKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIFB5X0RFQ1JFRih2YWx1ZSk7CisgICAgICAgIHJldHVybiBrZWVwOworICAgIH0KICNlbmRpZgogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogWl9nZXQodm9pZCAqcHRyLCBQeV9zc2l6ZV90IHNpemUpCiB7Ci0Jd2NoYXJfdCAqcDsKLQlwID0gKih3Y2hhcl90ICoqKXB0cjsKLQlpZiAocCkgeworICAgIHdjaGFyX3QgKnA7CisgICAgcCA9ICood2NoYXJfdCAqKilwdHI7CisgICAgaWYgKHApIHsKICNpZiBkZWZpbmVkKE1TX1dJTjMyKSAmJiAhZGVmaW5lZChfV0lOMzJfV0NFKQotCQlpZiAoSXNCYWRTdHJpbmdQdHJXKCood2NoYXJfdCAqKilwdHIsIC0xKSkgewotCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJICAgICAiaW52YWxpZCBzdHJpbmcgcG9pbnRlciAlcCIsCi0JCQkJICAgICAqKHdjaGFyX3QgKiopcHRyKTsKLQkJCXJldHVybiBOVUxMOwotCQl9CisgICAgICAgIGlmIChJc0JhZFN0cmluZ1B0clcoKih3Y2hhcl90ICoqKXB0ciwgLTEpKSB7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCBzdHJpbmcgcG9pbnRlciAlcCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgKih3Y2hhcl90ICoqKXB0cik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQogI2VuZGlmCi0JCXJldHVybiBQeVVuaWNvZGVfRnJvbVdpZGVDaGFyKHAsIHdjc2xlbihwKSk7Ci0JfSBlbHNlIHsKLQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQlyZXR1cm4gUHlfTm9uZTsKLQl9CisgICAgICAgIHJldHVybiBQeVVuaWNvZGVfRnJvbVdpZGVDaGFyKHAsIHdjc2xlbihwKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICB9CiB9CiAjZW5kaWYKIApAQCAtMTUwMiwxNjYgKzE1MDIsMTY2IEBACiBzdGF0aWMgUHlPYmplY3QgKgogQlNUUl9zZXQodm9pZCAqcHRyLCBQeU9iamVjdCAqdmFsdWUsIFB5X3NzaXplX3Qgc2l6ZSkKIHsKLQlCU1RSIGJzdHI7CisgICAgQlNUUiBic3RyOwogCi0JLyogY29udmVydCB2YWx1ZSBpbnRvIGEgUHlVbmljb2RlT2JqZWN0IG9yIE5VTEwgKi8KLQlpZiAoUHlfTm9uZSA9PSB2YWx1ZSkgewotCQl2YWx1ZSA9IE5VTEw7Ci0JfSBlbHNlIGlmIChQeVN0cmluZ19DaGVjayh2YWx1ZSkpIHsKLQkJdmFsdWUgPSBQeVVuaWNvZGVfRnJvbUVuY29kZWRPYmplY3QodmFsdWUsCi0JCQkJCQkgICAgY29udmVyc2lvbl9tb2RlX2VuY29kaW5nLAotCQkJCQkJICAgIGNvbnZlcnNpb25fbW9kZV9lcnJvcnMpOwotCQlpZiAoIXZhbHVlKQotCQkJcmV0dXJuIE5VTEw7Ci0JfSBlbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2sodmFsdWUpKSB7Ci0JCVB5X0lOQ1JFRih2YWx1ZSk7IC8qIGZvciB0aGUgZGVzY3JlZiBiZWxvdyAqLwotCX0gZWxzZSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkJInVuaWNvZGUgc3RyaW5nIGV4cGVjdGVkIGluc3RlYWQgb2YgJXMgaW5zdGFuY2UiLAotCQkJCXZhbHVlLT5vYl90eXBlLT50cF9uYW1lKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIC8qIGNvbnZlcnQgdmFsdWUgaW50byBhIFB5VW5pY29kZU9iamVjdCBvciBOVUxMICovCisgICAgaWYgKFB5X05vbmUgPT0gdmFsdWUpIHsKKyAgICAgICAgdmFsdWUgPSBOVUxMOworICAgIH0gZWxzZSBpZiAoUHlTdHJpbmdfQ2hlY2sodmFsdWUpKSB7CisgICAgICAgIHZhbHVlID0gUHlVbmljb2RlX0Zyb21FbmNvZGVkT2JqZWN0KHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJzaW9uX21vZGVfZW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnNpb25fbW9kZV9lcnJvcnMpOworICAgICAgICBpZiAoIXZhbHVlKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfSBlbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2sodmFsdWUpKSB7CisgICAgICAgIFB5X0lOQ1JFRih2YWx1ZSk7IC8qIGZvciB0aGUgZGVzY3JlZiBiZWxvdyAqLworICAgIH0gZWxzZSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAidW5pY29kZSBzdHJpbmcgZXhwZWN0ZWQgaW5zdGVhZCBvZiAlcyBpbnN0YW5jZSIsCisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS0+b2JfdHlwZS0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCS8qIGNyZWF0ZSBhIEJTVFIgZnJvbSB2YWx1ZSAqLwotCWlmICh2YWx1ZSkgewotCQlQeV9zc2l6ZV90IHNpemUgPSBQeVVuaWNvZGVfR0VUX1NJWkUodmFsdWUpOwotCQlpZiAoKHVuc2lnbmVkKSBzaXplICE9IHNpemUpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiU3RyaW5nIHRvbyBsb25nIGZvciBCU1RSIik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlic3RyID0gU3lzQWxsb2NTdHJpbmdMZW4oUHlVbmljb2RlX0FTX1VOSUNPREUodmFsdWUpLAotCQkJCQkgKHVuc2lnbmVkKXNpemUpOwotCQlQeV9ERUNSRUYodmFsdWUpOwotCX0gZWxzZQotCQlic3RyID0gTlVMTDsKKyAgICAvKiBjcmVhdGUgYSBCU1RSIGZyb20gdmFsdWUgKi8KKyAgICBpZiAodmFsdWUpIHsKKyAgICAgICAgUHlfc3NpemVfdCBzaXplID0gUHlVbmljb2RlX0dFVF9TSVpFKHZhbHVlKTsKKyAgICAgICAgaWYgKCh1bnNpZ25lZCkgc2l6ZSAhPSBzaXplKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIlN0cmluZyB0b28gbG9uZyBmb3IgQlNUUiIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgYnN0ciA9IFN5c0FsbG9jU3RyaW5nTGVuKFB5VW5pY29kZV9BU19VTklDT0RFKHZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZClzaXplKTsKKyAgICAgICAgUHlfREVDUkVGKHZhbHVlKTsKKyAgICB9IGVsc2UKKyAgICAgICAgYnN0ciA9IE5VTEw7CiAKLQkvKiBmcmVlIHRoZSBwcmV2aW91cyBjb250ZW50cywgaWYgYW55ICovCi0JaWYgKCooQlNUUiAqKXB0cikKLQkJU3lzRnJlZVN0cmluZygqKEJTVFIgKilwdHIpOwotCQotCS8qIGFuZCBzdG9yZSBpdCAqLwotCSooQlNUUiAqKXB0ciA9IGJzdHI7CisgICAgLyogZnJlZSB0aGUgcHJldmlvdXMgY29udGVudHMsIGlmIGFueSAqLworICAgIGlmICgqKEJTVFIgKilwdHIpCisgICAgICAgIFN5c0ZyZWVTdHJpbmcoKihCU1RSICopcHRyKTsKIAotCS8qIFdlIGRvbid0IG5lZWQgdG8ga2VlcCBhbnkgb3RoZXIgb2JqZWN0ICovCi0JX1JFVCh2YWx1ZSk7CisgICAgLyogYW5kIHN0b3JlIGl0ICovCisgICAgKihCU1RSICopcHRyID0gYnN0cjsKKworICAgIC8qIFdlIGRvbid0IG5lZWQgdG8ga2VlcCBhbnkgb3RoZXIgb2JqZWN0ICovCisgICAgX1JFVCh2YWx1ZSk7CiB9CiAKIAogc3RhdGljIFB5T2JqZWN0ICoKIEJTVFJfZ2V0KHZvaWQgKnB0ciwgUHlfc3NpemVfdCBzaXplKQogewotCUJTVFIgcDsKLQlwID0gKihCU1RSICopcHRyOwotCWlmIChwKQotCQlyZXR1cm4gUHlVbmljb2RlX0Zyb21XaWRlQ2hhcihwLCBTeXNTdHJpbmdMZW4ocCkpOwotCWVsc2UgewotCQkvKiBIbSwgaXQgc2VlbXMgTlVMTCBwb2ludGVyIGFuZCB6ZXJvIGxlbmd0aCBzdHJpbmcgYXJlIHRoZQotCQkgICBzYW1lIGluIEJTVFIsIHNlZSBEb24gQm94LCBwIDgxCi0JCSovCi0JCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJcmV0dXJuIFB5X05vbmU7Ci0JfQorICAgIEJTVFIgcDsKKyAgICBwID0gKihCU1RSICopcHRyOworICAgIGlmIChwKQorICAgICAgICByZXR1cm4gUHlVbmljb2RlX0Zyb21XaWRlQ2hhcihwLCBTeXNTdHJpbmdMZW4ocCkpOworICAgIGVsc2UgeworICAgICAgICAvKiBIbSwgaXQgc2VlbXMgTlVMTCBwb2ludGVyIGFuZCB6ZXJvIGxlbmd0aCBzdHJpbmcgYXJlIHRoZQorICAgICAgICAgICBzYW1lIGluIEJTVFIsIHNlZSBEb24gQm94LCBwIDgxCisgICAgICAgICovCisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgfQogfQogI2VuZGlmCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBQX3NldCh2b2lkICpwdHIsIFB5T2JqZWN0ICp2YWx1ZSwgUHlfc3NpemVfdCBzaXplKQogewotCXZvaWQgKnY7Ci0JaWYgKHZhbHVlID09IFB5X05vbmUpIHsKLQkJKih2b2lkICoqKXB0ciA9IE5VTEw7Ci0JCV9SRVQodmFsdWUpOwotCX0KKyAgICB2b2lkICp2OworICAgIGlmICh2YWx1ZSA9PSBQeV9Ob25lKSB7CisgICAgICAgICoodm9pZCAqKilwdHIgPSBOVUxMOworICAgICAgICBfUkVUKHZhbHVlKTsKKyAgICB9CiAKLQlpZiAoIVB5SW50X0NoZWNrKHZhbHVlKSAmJiAhUHlMb25nX0NoZWNrKHZhbHVlKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJjYW5ub3QgYmUgY29udmVydGVkIHRvIHBvaW50ZXIiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICghUHlJbnRfQ2hlY2sodmFsdWUpICYmICFQeUxvbmdfQ2hlY2sodmFsdWUpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiY2Fubm90IGJlIGNvbnZlcnRlZCB0byBwb2ludGVyIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAogI2lmIFNJWkVPRl9WT0lEX1AgPD0gU0laRU9GX0xPTkcKLQl2ID0gKHZvaWQgKilQeUludF9Bc1Vuc2lnbmVkTG9uZ01hc2sodmFsdWUpOworICAgIHYgPSAodm9pZCAqKVB5SW50X0FzVW5zaWduZWRMb25nTWFzayh2YWx1ZSk7CiAjZWxzZQogI2lmbmRlZiBIQVZFX0xPTkdfTE9ORwogIyAgIGVycm9yICJQeUxvbmdfQXNWb2lkUHRyOiBzaXplb2Yodm9pZCopID4gc2l6ZW9mKGxvbmcpLCBidXQgbm8gbG9uZyBsb25nIgogI2VsaWYgU0laRU9GX0xPTkdfTE9ORyA8IFNJWkVPRl9WT0lEX1AKICMgICBlcnJvciAiUHlMb25nX0FzVm9pZFB0cjogc2l6ZW9mKFBZX0xPTkdfTE9ORykgPCBzaXplb2Yodm9pZCopIgogI2VuZGlmCi0JdiA9ICh2b2lkICopUHlJbnRfQXNVbnNpZ25lZExvbmdMb25nTWFzayh2YWx1ZSk7CisgICAgdiA9ICh2b2lkICopUHlJbnRfQXNVbnNpZ25lZExvbmdMb25nTWFzayh2YWx1ZSk7CiAjZW5kaWYKIAotCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkqKHZvaWQgKiopcHRyID0gdjsKLQlfUkVUKHZhbHVlKTsKKyAgICAqKHZvaWQgKiopcHRyID0gdjsKKyAgICBfUkVUKHZhbHVlKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFBfZ2V0KHZvaWQgKnB0ciwgUHlfc3NpemVfdCBzaXplKQogewotCWlmICgqKHZvaWQgKiopcHRyID09IE5VTEwpIHsKLQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQlyZXR1cm4gUHlfTm9uZTsKLQl9Ci0JcmV0dXJuIFB5TG9uZ19Gcm9tVm9pZFB0cigqKHZvaWQgKiopcHRyKTsKKyAgICBpZiAoKih2b2lkICoqKXB0ciA9PSBOVUxMKSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgfQorICAgIHJldHVybiBQeUxvbmdfRnJvbVZvaWRQdHIoKih2b2lkICoqKXB0cik7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZmllbGRkZXNjIGZvcm1hdHRhYmxlW10gPSB7Ci0JeyAncycsIHNfc2V0LCBzX2dldCwgJmZmaV90eXBlX3BvaW50ZXJ9LAotCXsgJ2InLCBiX3NldCwgYl9nZXQsICZmZmlfdHlwZV9zY2hhcn0sCi0JeyAnQicsIEJfc2V0LCBCX2dldCwgJmZmaV90eXBlX3VjaGFyfSwKLQl7ICdjJywgY19zZXQsIGNfZ2V0LCAmZmZpX3R5cGVfc2NoYXJ9LAotCXsgJ2QnLCBkX3NldCwgZF9nZXQsICZmZmlfdHlwZV9kb3VibGUsIGRfc2V0X3N3LCBkX2dldF9zd30sCi0JeyAnZycsIGdfc2V0LCBnX2dldCwgJmZmaV90eXBlX2xvbmdkb3VibGV9LAotCXsgJ2YnLCBmX3NldCwgZl9nZXQsICZmZmlfdHlwZV9mbG9hdCwgZl9zZXRfc3csIGZfZ2V0X3N3fSwKLQl7ICdoJywgaF9zZXQsIGhfZ2V0LCAmZmZpX3R5cGVfc3Nob3J0LCBoX3NldF9zdywgaF9nZXRfc3d9LAotCXsgJ0gnLCBIX3NldCwgSF9nZXQsICZmZmlfdHlwZV91c2hvcnQsIEhfc2V0X3N3LCBIX2dldF9zd30sCi0JeyAnaScsIGlfc2V0LCBpX2dldCwgJmZmaV90eXBlX3NpbnQsIGlfc2V0X3N3LCBpX2dldF9zd30sCi0JeyAnSScsIElfc2V0LCBJX2dldCwgJmZmaV90eXBlX3VpbnQsIElfc2V0X3N3LCBJX2dldF9zd30sCisgICAgeyAncycsIHNfc2V0LCBzX2dldCwgJmZmaV90eXBlX3BvaW50ZXJ9LAorICAgIHsgJ2InLCBiX3NldCwgYl9nZXQsICZmZmlfdHlwZV9zY2hhcn0sCisgICAgeyAnQicsIEJfc2V0LCBCX2dldCwgJmZmaV90eXBlX3VjaGFyfSwKKyAgICB7ICdjJywgY19zZXQsIGNfZ2V0LCAmZmZpX3R5cGVfc2NoYXJ9LAorICAgIHsgJ2QnLCBkX3NldCwgZF9nZXQsICZmZmlfdHlwZV9kb3VibGUsIGRfc2V0X3N3LCBkX2dldF9zd30sCisgICAgeyAnZycsIGdfc2V0LCBnX2dldCwgJmZmaV90eXBlX2xvbmdkb3VibGV9LAorICAgIHsgJ2YnLCBmX3NldCwgZl9nZXQsICZmZmlfdHlwZV9mbG9hdCwgZl9zZXRfc3csIGZfZ2V0X3N3fSwKKyAgICB7ICdoJywgaF9zZXQsIGhfZ2V0LCAmZmZpX3R5cGVfc3Nob3J0LCBoX3NldF9zdywgaF9nZXRfc3d9LAorICAgIHsgJ0gnLCBIX3NldCwgSF9nZXQsICZmZmlfdHlwZV91c2hvcnQsIEhfc2V0X3N3LCBIX2dldF9zd30sCisgICAgeyAnaScsIGlfc2V0LCBpX2dldCwgJmZmaV90eXBlX3NpbnQsIGlfc2V0X3N3LCBpX2dldF9zd30sCisgICAgeyAnSScsIElfc2V0LCBJX2dldCwgJmZmaV90eXBlX3VpbnQsIElfc2V0X3N3LCBJX2dldF9zd30sCiAvKiBYWFggSG0sIHNpemVvZihpbnQpID09IHNpemVvZihsb25nKSBkb2Vzbid0IGhvbGQgb24gZXZlcnkgcGxhdGZvcm0gKi8KIC8qIEFzIHNvb24gYXMgd2UgY2FuIGdldCByaWQgb2YgdGhlIHR5cGUgY29kZXMsIHRoaXMgaXMgbm8gbG9uZ2VyIGEgcHJvYmxlbSAqLwogI2lmIFNJWkVPRl9MT05HID09IDQKLQl7ICdsJywgbF9zZXQsIGxfZ2V0LCAmZmZpX3R5cGVfc2ludDMyLCBsX3NldF9zdywgbF9nZXRfc3d9LAotCXsgJ0wnLCBMX3NldCwgTF9nZXQsICZmZmlfdHlwZV91aW50MzIsIExfc2V0X3N3LCBMX2dldF9zd30sCisgICAgeyAnbCcsIGxfc2V0LCBsX2dldCwgJmZmaV90eXBlX3NpbnQzMiwgbF9zZXRfc3csIGxfZ2V0X3N3fSwKKyAgICB7ICdMJywgTF9zZXQsIExfZ2V0LCAmZmZpX3R5cGVfdWludDMyLCBMX3NldF9zdywgTF9nZXRfc3d9LAogI2VsaWYgU0laRU9GX0xPTkcgPT0gOAotCXsgJ2wnLCBsX3NldCwgbF9nZXQsICZmZmlfdHlwZV9zaW50NjQsIGxfc2V0X3N3LCBsX2dldF9zd30sCi0JeyAnTCcsIExfc2V0LCBMX2dldCwgJmZmaV90eXBlX3VpbnQ2NCwgTF9zZXRfc3csIExfZ2V0X3N3fSwKKyAgICB7ICdsJywgbF9zZXQsIGxfZ2V0LCAmZmZpX3R5cGVfc2ludDY0LCBsX3NldF9zdywgbF9nZXRfc3d9LAorICAgIHsgJ0wnLCBMX3NldCwgTF9nZXQsICZmZmlfdHlwZV91aW50NjQsIExfc2V0X3N3LCBMX2dldF9zd30sCiAjZWxzZQogIyBlcnJvcgogI2VuZGlmCiAjaWZkZWYgSEFWRV9MT05HX0xPTkcKICNpZiBTSVpFT0ZfTE9OR19MT05HID09IDgKLQl7ICdxJywgcV9zZXQsIHFfZ2V0LCAmZmZpX3R5cGVfc2ludDY0LCBxX3NldF9zdywgcV9nZXRfc3d9LAotCXsgJ1EnLCBRX3NldCwgUV9nZXQsICZmZmlfdHlwZV91aW50NjQsIFFfc2V0X3N3LCBRX2dldF9zd30sCisgICAgeyAncScsIHFfc2V0LCBxX2dldCwgJmZmaV90eXBlX3NpbnQ2NCwgcV9zZXRfc3csIHFfZ2V0X3N3fSwKKyAgICB7ICdRJywgUV9zZXQsIFFfZ2V0LCAmZmZpX3R5cGVfdWludDY0LCBRX3NldF9zdywgUV9nZXRfc3d9LAogI2Vsc2UKICMgZXJyb3IKICNlbmRpZgogI2VuZGlmCi0JeyAnUCcsIFBfc2V0LCBQX2dldCwgJmZmaV90eXBlX3BvaW50ZXJ9LAotCXsgJ3onLCB6X3NldCwgel9nZXQsICZmZmlfdHlwZV9wb2ludGVyfSwKKyAgICB7ICdQJywgUF9zZXQsIFBfZ2V0LCAmZmZpX3R5cGVfcG9pbnRlcn0sCisgICAgeyAneicsIHpfc2V0LCB6X2dldCwgJmZmaV90eXBlX3BvaW50ZXJ9LAogI2lmZGVmIENUWVBFU19VTklDT0RFCi0JeyAndScsIHVfc2V0LCB1X2dldCwgTlVMTH0sIC8qIGZmaV90eXBlIHNldCBsYXRlciAqLwotCXsgJ1UnLCBVX3NldCwgVV9nZXQsICZmZmlfdHlwZV9wb2ludGVyfSwKLQl7ICdaJywgWl9zZXQsIFpfZ2V0LCAmZmZpX3R5cGVfcG9pbnRlcn0sCisgICAgeyAndScsIHVfc2V0LCB1X2dldCwgTlVMTH0sIC8qIGZmaV90eXBlIHNldCBsYXRlciAqLworICAgIHsgJ1UnLCBVX3NldCwgVV9nZXQsICZmZmlfdHlwZV9wb2ludGVyfSwKKyAgICB7ICdaJywgWl9zZXQsIFpfZ2V0LCAmZmZpX3R5cGVfcG9pbnRlcn0sCiAjZW5kaWYKICNpZmRlZiBNU19XSU4zMgotCXsgJ1gnLCBCU1RSX3NldCwgQlNUUl9nZXQsICZmZmlfdHlwZV9wb2ludGVyfSwKLQl7ICd2JywgdkJPT0xfc2V0LCB2Qk9PTF9nZXQsICZmZmlfdHlwZV9zc2hvcnR9LAorICAgIHsgJ1gnLCBCU1RSX3NldCwgQlNUUl9nZXQsICZmZmlfdHlwZV9wb2ludGVyfSwKKyAgICB7ICd2JywgdkJPT0xfc2V0LCB2Qk9PTF9nZXQsICZmZmlfdHlwZV9zc2hvcnR9LAogI2VuZGlmCiAjaWYgU0laRU9GX19CT09MID09IDEKLQl7ICc/JywgYm9vbF9zZXQsIGJvb2xfZ2V0LCAmZmZpX3R5cGVfdWNoYXJ9LCAvKiBBbHNvIGZhbGxiYWNrIGZvciBubyBuYXRpdmUgX0Jvb2wgc3VwcG9ydCAqLworICAgIHsgJz8nLCBib29sX3NldCwgYm9vbF9nZXQsICZmZmlfdHlwZV91Y2hhcn0sIC8qIEFsc28gZmFsbGJhY2sgZm9yIG5vIG5hdGl2ZSBfQm9vbCBzdXBwb3J0ICovCiAjZWxpZiBTSVpFT0ZfX0JPT0wgPT0gU0laRU9GX1NIT1JUCi0JeyAnPycsIGJvb2xfc2V0LCBib29sX2dldCwgJmZmaV90eXBlX3VzaG9ydH0sCisgICAgeyAnPycsIGJvb2xfc2V0LCBib29sX2dldCwgJmZmaV90eXBlX3VzaG9ydH0sCiAjZWxpZiBTSVpFT0ZfX0JPT0wgPT0gU0laRU9GX0lOVAotCXsgJz8nLCBib29sX3NldCwgYm9vbF9nZXQsICZmZmlfdHlwZV91aW50LCBJX3NldF9zdywgSV9nZXRfc3d9LAorICAgIHsgJz8nLCBib29sX3NldCwgYm9vbF9nZXQsICZmZmlfdHlwZV91aW50LCBJX3NldF9zdywgSV9nZXRfc3d9LAogI2VsaWYgU0laRU9GX19CT09MID09IFNJWkVPRl9MT05HCi0JeyAnPycsIGJvb2xfc2V0LCBib29sX2dldCwgJmZmaV90eXBlX3Vsb25nLCBMX3NldF9zdywgTF9nZXRfc3d9LAorICAgIHsgJz8nLCBib29sX3NldCwgYm9vbF9nZXQsICZmZmlfdHlwZV91bG9uZywgTF9zZXRfc3csIExfZ2V0X3N3fSwKICNlbGlmIFNJWkVPRl9fQk9PTCA9PSBTSVpFT0ZfTE9OR19MT05HCi0JeyAnPycsIGJvb2xfc2V0LCBib29sX2dldCwgJmZmaV90eXBlX3Vsb25nLCBRX3NldF9zdywgUV9nZXRfc3d9LAorICAgIHsgJz8nLCBib29sX3NldCwgYm9vbF9nZXQsICZmZmlfdHlwZV91bG9uZywgUV9zZXRfc3csIFFfZ2V0X3N3fSwKICNlbmRpZiAvKiBTSVpFT0ZfX0JPT0wgKi8KLQl7ICdPJywgT19zZXQsIE9fZ2V0LCAmZmZpX3R5cGVfcG9pbnRlcn0sCi0JeyAwLCBOVUxMLCBOVUxMLCBOVUxMfSwKKyAgICB7ICdPJywgT19zZXQsIE9fZ2V0LCAmZmZpX3R5cGVfcG9pbnRlcn0sCisgICAgeyAwLCBOVUxMLCBOVUxMLCBOVUxMfSwKIH07CiAKIC8qCkBAIC0xNjcyLDI2ICsxNjcyLDI2IEBACiBzdHJ1Y3QgZmllbGRkZXNjICoKIGdldGVudHJ5KGNoYXIgKmZtdCkKIHsKLQlzdGF0aWMgaW50IGluaXRpYWxpemVkID0gMDsKLQlzdHJ1Y3QgZmllbGRkZXNjICp0YWJsZSA9IGZvcm1hdHRhYmxlOworICAgIHN0YXRpYyBpbnQgaW5pdGlhbGl6ZWQgPSAwOworICAgIHN0cnVjdCBmaWVsZGRlc2MgKnRhYmxlID0gZm9ybWF0dGFibGU7CiAKLQlpZiAoIWluaXRpYWxpemVkKSB7Ci0JCWluaXRpYWxpemVkID0gMTsKKyAgICBpZiAoIWluaXRpYWxpemVkKSB7CisgICAgICAgIGluaXRpYWxpemVkID0gMTsKICNpZmRlZiBDVFlQRVNfVU5JQ09ERQotCQlpZiAoc2l6ZW9mKHdjaGFyX3QpID09IHNpemVvZihzaG9ydCkpCi0JCQlnZXRlbnRyeSgidSIpLT5wZmZpX3R5cGUgPSAmZmZpX3R5cGVfc3Nob3J0OwotCQllbHNlIGlmIChzaXplb2Yod2NoYXJfdCkgPT0gc2l6ZW9mKGludCkpCi0JCQlnZXRlbnRyeSgidSIpLT5wZmZpX3R5cGUgPSAmZmZpX3R5cGVfc2ludDsKLQkJZWxzZSBpZiAoc2l6ZW9mKHdjaGFyX3QpID09IHNpemVvZihsb25nKSkKLQkJCWdldGVudHJ5KCJ1IiktPnBmZmlfdHlwZSA9ICZmZmlfdHlwZV9zbG9uZzsKKyAgICAgICAgaWYgKHNpemVvZih3Y2hhcl90KSA9PSBzaXplb2Yoc2hvcnQpKQorICAgICAgICAgICAgZ2V0ZW50cnkoInUiKS0+cGZmaV90eXBlID0gJmZmaV90eXBlX3NzaG9ydDsKKyAgICAgICAgZWxzZSBpZiAoc2l6ZW9mKHdjaGFyX3QpID09IHNpemVvZihpbnQpKQorICAgICAgICAgICAgZ2V0ZW50cnkoInUiKS0+cGZmaV90eXBlID0gJmZmaV90eXBlX3NpbnQ7CisgICAgICAgIGVsc2UgaWYgKHNpemVvZih3Y2hhcl90KSA9PSBzaXplb2YobG9uZykpCisgICAgICAgICAgICBnZXRlbnRyeSgidSIpLT5wZmZpX3R5cGUgPSAmZmZpX3R5cGVfc2xvbmc7CiAjZW5kaWYKLQl9CisgICAgfQogCi0JZm9yICg7IHRhYmxlLT5jb2RlOyArK3RhYmxlKSB7Ci0JCWlmICh0YWJsZS0+Y29kZSA9PSBmbXRbMF0pCi0JCQlyZXR1cm4gdGFibGU7Ci0JfQotCXJldHVybiBOVUxMOworICAgIGZvciAoOyB0YWJsZS0+Y29kZTsgKyt0YWJsZSkgeworICAgICAgICBpZiAodGFibGUtPmNvZGUgPT0gZm10WzBdKQorICAgICAgICAgICAgcmV0dXJuIHRhYmxlOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKIH0KIAogdHlwZWRlZiBzdHJ1Y3QgeyBjaGFyIGM7IGNoYXIgeDsgfSBzX2NoYXI7CkBAIC0xNzM1LDEwICsxNzM1LDEwIEBACiAvKiBmcm9tIGZmaS5oOgogdHlwZWRlZiBzdHJ1Y3QgX2ZmaV90eXBlCiB7Ci0Jc2l6ZV90IHNpemU7Ci0JdW5zaWduZWQgc2hvcnQgYWxpZ25tZW50OwotCXVuc2lnbmVkIHNob3J0IHR5cGU7Ci0Jc3RydWN0IF9mZmlfdHlwZSAqKmVsZW1lbnRzOworICAgIHNpemVfdCBzaXplOworICAgIHVuc2lnbmVkIHNob3J0IGFsaWdubWVudDsKKyAgICB1bnNpZ25lZCBzaG9ydCB0eXBlOworICAgIHN0cnVjdCBfZmZpX3R5cGUgKiplbGVtZW50czsKIH0gZmZpX3R5cGU7CiAqLwogCkBAIC0xNzY1LDcgKzE3NjUsNyBAQAogI2VuZGlmCiAgIC8qIFRoaXMgaXMgYWxyZWFkeSBkZWZpbmVkIG9uIE9TWCAqLwogZmZpX3R5cGUgZmZpX3R5cGVfbG9uZ2RvdWJsZSA9IHsgc2l6ZW9mKGxvbmcgZG91YmxlKSwgTE9OR0RPVUJMRV9BTElHTiwKLQkJCQkgRkZJX1RZUEVfTE9OR0RPVUJMRSB9OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZJX1RZUEVfTE9OR0RPVUJMRSB9OwogCiBmZmlfdHlwZSBmZmlfdHlwZV9wb2ludGVyID0geyBzaXplb2Yodm9pZCAqKSwgVk9JRF9QX0FMSUdOLCBGRklfVFlQRV9QT0lOVEVSIH07CiAKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9jdHlwZXMuaCBiL01vZHVsZXMvX2N0eXBlcy9jdHlwZXMuaAppbmRleCA2ZGU5YTgxLi4zN2Y0NzBkIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvY3R5cGVzLmgKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2N0eXBlcy5oCkBAIC0yNCw3ICsyNCw3IEBACiAjaWYgKFBZX1ZFUlNJT05fSEVYIDwgMHgwMjA2MDAwMCkKICNkZWZpbmUgUHlfVFlQRShvYikgKCgoUHlPYmplY3QqKShvYikpLT5vYl90eXBlKQogI2RlZmluZSBQeVZhck9iamVjdF9IRUFEX0lOSVQodHlwZSwgc2l6ZSkgXAotCVB5T2JqZWN0X0hFQURfSU5JVCh0eXBlKSBzaXplLAorICAgIFB5T2JqZWN0X0hFQURfSU5JVCh0eXBlKSBzaXplLAogI2RlZmluZSBQeUltcG9ydF9JbXBvcnRNb2R1bGVOb0Jsb2NrIFB5SW1wb3J0X0ltcG9ydE1vZHVsZQogI2RlZmluZSBQeUxvbmdfRnJvbVNzaXplX3QgUHlJbnRfRnJvbUxvbmcKICNkZWZpbmUgUHlfVFBGTEFHU19IQVZFX05FV0JVRkZFUiAwCkBAIC02MiwxNiArNjIsMTYgQEAKIGRpZmZpY3VsdCBpbiB0aGUgcHJlc2VuY2Ugb2YgQ0Z1bmNQdHJPYmplY3QuICBNYXliZSBsYXRlci4KICovCiB1bmlvbiB2YWx1ZSB7Ci0JCWNoYXIgY1sxNl07Ci0JCXNob3J0IHM7Ci0JCWludCBpOwotCQlsb25nIGw7Ci0JCWZsb2F0IGY7Ci0JCWRvdWJsZSBkOworICAgICAgICAgICAgICAgIGNoYXIgY1sxNl07CisgICAgICAgICAgICAgICAgc2hvcnQgczsKKyAgICAgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgICAgICBsb25nIGw7CisgICAgICAgICAgICAgICAgZmxvYXQgZjsKKyAgICAgICAgICAgICAgICBkb3VibGUgZDsKICNpZmRlZiBIQVZFX0xPTkdfTE9ORwotCQlQWV9MT05HX0xPTkcgbGw7CisgICAgICAgICAgICAgICAgUFlfTE9OR19MT05HIGxsOwogI2VuZGlmCi0JCWxvbmcgZG91YmxlIEQ7CisgICAgICAgICAgICAgICAgbG9uZyBkb3VibGUgRDsKIH07CiAKIC8qCkBAIC04MSw2NyArODEsNjcgQEAKICovCiAKIHN0cnVjdCB0YWdDRGF0YU9iamVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCWNoYXIgKmJfcHRyOwkJLyogcG9pbnRlciB0byBtZW1vcnkgYmxvY2sgKi8KLQlpbnQgIGJfbmVlZHNmcmVlOwkvKiBuZWVkIF93ZV8gZnJlZSB0aGUgbWVtb3J5PyAqLwotCUNEYXRhT2JqZWN0ICpiX2Jhc2U7CS8qIHBvaW50ZXIgdG8gYmFzZSBvYmplY3Qgb3IgTlVMTCAqLwotCVB5X3NzaXplX3QgYl9zaXplOwkvKiBzaXplIG9mIG1lbW9yeSBibG9jayBpbiBieXRlcyAqLwotCVB5X3NzaXplX3QgYl9sZW5ndGg7CS8qIG51bWJlciBvZiByZWZlcmVuY2VzIHdlIG5lZWQgKi8KLQlQeV9zc2l6ZV90IGJfaW5kZXg7CS8qIGluZGV4IG9mIHRoaXMgb2JqZWN0IGludG8gYmFzZSdzCi0JCQkJICAgYl9vYmplY3QgbGlzdCAqLwotCVB5T2JqZWN0ICpiX29iamVjdHM7CS8qIGRpY3Rpb25hcnkgb2YgcmVmZXJlbmNlcyB3ZSBuZWVkIHRvIGtlZXAsIG9yIFB5X05vbmUgKi8KLQl1bmlvbiB2YWx1ZSBiX3ZhbHVlOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBjaGFyICpiX3B0cjsgICAgICAgICAgICAgICAgLyogcG9pbnRlciB0byBtZW1vcnkgYmxvY2sgKi8KKyAgICBpbnQgIGJfbmVlZHNmcmVlOyAgICAgICAgICAgLyogbmVlZCBfd2VfIGZyZWUgdGhlIG1lbW9yeT8gKi8KKyAgICBDRGF0YU9iamVjdCAqYl9iYXNlOyAgICAgICAgLyogcG9pbnRlciB0byBiYXNlIG9iamVjdCBvciBOVUxMICovCisgICAgUHlfc3NpemVfdCBiX3NpemU7ICAgICAgICAgIC8qIHNpemUgb2YgbWVtb3J5IGJsb2NrIGluIGJ5dGVzICovCisgICAgUHlfc3NpemVfdCBiX2xlbmd0aDsgICAgICAgIC8qIG51bWJlciBvZiByZWZlcmVuY2VzIHdlIG5lZWQgKi8KKyAgICBQeV9zc2l6ZV90IGJfaW5kZXg7ICAgICAgICAgLyogaW5kZXggb2YgdGhpcyBvYmplY3QgaW50byBiYXNlJ3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiX29iamVjdCBsaXN0ICovCisgICAgUHlPYmplY3QgKmJfb2JqZWN0czsgICAgICAgIC8qIGRpY3Rpb25hcnkgb2YgcmVmZXJlbmNlcyB3ZSBuZWVkIHRvIGtlZXAsIG9yIFB5X05vbmUgKi8KKyAgICB1bmlvbiB2YWx1ZSBiX3ZhbHVlOwogfTsKIAogdHlwZWRlZiBzdHJ1Y3QgewotCVB5T2JqZWN0X1ZBUl9IRUFECi0JZmZpX2Nsb3N1cmUgKnBjbDsgLyogdGhlIEMgY2FsbGFibGUgKi8KLQlmZmlfY2lmIGNpZjsKLQlpbnQgZmxhZ3M7Ci0JUHlPYmplY3QgKmNvbnZlcnRlcnM7Ci0JUHlPYmplY3QgKmNhbGxhYmxlOwotCVB5T2JqZWN0ICpyZXN0eXBlOwotCVNFVEZVTkMgc2V0ZnVuYzsKLQlmZmlfdHlwZSAqZmZpX3Jlc3R5cGU7Ci0JZmZpX3R5cGUgKmF0eXBlc1sxXTsKKyAgICBQeU9iamVjdF9WQVJfSEVBRAorICAgIGZmaV9jbG9zdXJlICpwY2w7IC8qIHRoZSBDIGNhbGxhYmxlICovCisgICAgZmZpX2NpZiBjaWY7CisgICAgaW50IGZsYWdzOworICAgIFB5T2JqZWN0ICpjb252ZXJ0ZXJzOworICAgIFB5T2JqZWN0ICpjYWxsYWJsZTsKKyAgICBQeU9iamVjdCAqcmVzdHlwZTsKKyAgICBTRVRGVU5DIHNldGZ1bmM7CisgICAgZmZpX3R5cGUgKmZmaV9yZXN0eXBlOworICAgIGZmaV90eXBlICphdHlwZXNbMV07CiB9IENUaHVua09iamVjdDsKIGV4dGVybiBQeVR5cGVPYmplY3QgQ1RodW5rX1R5cGU7Ci0jZGVmaW5lIENUaHVua19DaGVja0V4YWN0KHYpCSAgICAoKHYpLT5vYl90eXBlID09ICZDVGh1bmtfVHlwZSkKKyNkZWZpbmUgQ1RodW5rX0NoZWNrRXhhY3QodikgICAgICAgICgodiktPm9iX3R5cGUgPT0gJkNUaHVua19UeXBlKQogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JLyogRmlyc3QgcGFydCBpZGVudGljYWwgdG8gdGFnQ0RhdGFPYmplY3QgKi8KLQlQeU9iamVjdF9IRUFECi0JY2hhciAqYl9wdHI7CQkvKiBwb2ludGVyIHRvIG1lbW9yeSBibG9jayAqLwotCWludCAgYl9uZWVkc2ZyZWU7CS8qIG5lZWQgX3dlXyBmcmVlIHRoZSBtZW1vcnk/ICovCi0JQ0RhdGFPYmplY3QgKmJfYmFzZTsJLyogcG9pbnRlciB0byBiYXNlIG9iamVjdCBvciBOVUxMICovCi0JUHlfc3NpemVfdCBiX3NpemU7CS8qIHNpemUgb2YgbWVtb3J5IGJsb2NrIGluIGJ5dGVzICovCi0JUHlfc3NpemVfdCBiX2xlbmd0aDsJLyogbnVtYmVyIG9mIHJlZmVyZW5jZXMgd2UgbmVlZCAqLwotCVB5X3NzaXplX3QgYl9pbmRleDsJLyogaW5kZXggb2YgdGhpcyBvYmplY3QgaW50byBiYXNlJ3MKLQkJCQkgICBiX29iamVjdCBsaXN0ICovCi0JUHlPYmplY3QgKmJfb2JqZWN0czsJLyogbGlzdCBvZiByZWZlcmVuY2VzIHdlIG5lZWQgdG8ga2VlcCAqLwotCXVuaW9uIHZhbHVlIGJfdmFsdWU7Ci0JLyogZW5kIG9mIHRhZ0NEYXRhT2JqZWN0LCBhZGRpdGlvbmFsIGZpZWxkcyBmb2xsb3cgKi8KKyAgICAvKiBGaXJzdCBwYXJ0IGlkZW50aWNhbCB0byB0YWdDRGF0YU9iamVjdCAqLworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBjaGFyICpiX3B0cjsgICAgICAgICAgICAgICAgLyogcG9pbnRlciB0byBtZW1vcnkgYmxvY2sgKi8KKyAgICBpbnQgIGJfbmVlZHNmcmVlOyAgICAgICAgICAgLyogbmVlZCBfd2VfIGZyZWUgdGhlIG1lbW9yeT8gKi8KKyAgICBDRGF0YU9iamVjdCAqYl9iYXNlOyAgICAgICAgLyogcG9pbnRlciB0byBiYXNlIG9iamVjdCBvciBOVUxMICovCisgICAgUHlfc3NpemVfdCBiX3NpemU7ICAgICAgICAgIC8qIHNpemUgb2YgbWVtb3J5IGJsb2NrIGluIGJ5dGVzICovCisgICAgUHlfc3NpemVfdCBiX2xlbmd0aDsgICAgICAgIC8qIG51bWJlciBvZiByZWZlcmVuY2VzIHdlIG5lZWQgKi8KKyAgICBQeV9zc2l6ZV90IGJfaW5kZXg7ICAgICAgICAgLyogaW5kZXggb2YgdGhpcyBvYmplY3QgaW50byBiYXNlJ3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiX29iamVjdCBsaXN0ICovCisgICAgUHlPYmplY3QgKmJfb2JqZWN0czsgICAgICAgIC8qIGxpc3Qgb2YgcmVmZXJlbmNlcyB3ZSBuZWVkIHRvIGtlZXAgKi8KKyAgICB1bmlvbiB2YWx1ZSBiX3ZhbHVlOworICAgIC8qIGVuZCBvZiB0YWdDRGF0YU9iamVjdCwgYWRkaXRpb25hbCBmaWVsZHMgZm9sbG93ICovCiAKLQlDVGh1bmtPYmplY3QgKnRodW5rOwotCVB5T2JqZWN0ICpjYWxsYWJsZTsKKyAgICBDVGh1bmtPYmplY3QgKnRodW5rOworICAgIFB5T2JqZWN0ICpjYWxsYWJsZTsKIAotCS8qIFRoZXNlIHR3byBmaWVsZHMgd2lsbCBvdmVycmlkZSB0aGUgb25lcyBpbiB0aGUgdHlwZSdzIHN0Z2RpY3QgaWYKLQkgICB0aGV5IGFyZSBzZXQgKi8KLQlQeU9iamVjdCAqY29udmVydGVyczsKLQlQeU9iamVjdCAqYXJndHlwZXM7Ci0JUHlPYmplY3QgKnJlc3R5cGU7Ci0JUHlPYmplY3QgKmNoZWNrZXI7Ci0JUHlPYmplY3QgKmVycmNoZWNrOworICAgIC8qIFRoZXNlIHR3byBmaWVsZHMgd2lsbCBvdmVycmlkZSB0aGUgb25lcyBpbiB0aGUgdHlwZSdzIHN0Z2RpY3QgaWYKKyAgICAgICB0aGV5IGFyZSBzZXQgKi8KKyAgICBQeU9iamVjdCAqY29udmVydGVyczsKKyAgICBQeU9iamVjdCAqYXJndHlwZXM7CisgICAgUHlPYmplY3QgKnJlc3R5cGU7CisgICAgUHlPYmplY3QgKmNoZWNrZXI7CisgICAgUHlPYmplY3QgKmVycmNoZWNrOwogI2lmZGVmIE1TX1dJTjMyCi0JaW50IGluZGV4OwotCUdVSUQgKmlpZDsKKyAgICBpbnQgaW5kZXg7CisgICAgR1VJRCAqaWlkOwogI2VuZGlmCi0JUHlPYmplY3QgKnBhcmFtZmxhZ3M7CisgICAgUHlPYmplY3QgKnBhcmFtZmxhZ3M7CiB9IENGdW5jUHRyT2JqZWN0OwogCiBleHRlcm4gUHlUeXBlT2JqZWN0IFN0Z0RpY3RfVHlwZTsKLSNkZWZpbmUgU3RnRGljdF9DaGVja0V4YWN0KHYpCSAgICAoKHYpLT5vYl90eXBlID09ICZTdGdEaWN0X1R5cGUpCi0jZGVmaW5lIFN0Z0RpY3RfQ2hlY2sodikJICAgIFB5T2JqZWN0X1R5cGVDaGVjayh2LCAmU3RnRGljdF9UeXBlKQorI2RlZmluZSBTdGdEaWN0X0NoZWNrRXhhY3QodikgICAgICAgKCh2KS0+b2JfdHlwZSA9PSAmU3RnRGljdF9UeXBlKQorI2RlZmluZSBTdGdEaWN0X0NoZWNrKHYpICAgICAgICAgICAgUHlPYmplY3RfVHlwZUNoZWNrKHYsICZTdGdEaWN0X1R5cGUpCiAKIGV4dGVybiBpbnQgU3RydWN0VW5pb25UeXBlX3VwZGF0ZV9zdGdkaWN0KFB5T2JqZWN0ICpmaWVsZHMsIFB5T2JqZWN0ICp0eXBlLCBpbnQgaXNTdHJ1Y3QpOwogZXh0ZXJuIGludCBQeVR5cGVfc3RnaW5mbyhQeVR5cGVPYmplY3QgKnNlbGYsIFB5X3NzaXplX3QgKnBzaXplLCBQeV9zc2l6ZV90ICpwYWxpZ24sIFB5X3NzaXplX3QgKnBsZW5ndGgpOwpAQCAtMTUwLDEyICsxNTAsMTIgQEAKIAogCiBleHRlcm4gUHlUeXBlT2JqZWN0IENEYXRhX1R5cGU7Ci0jZGVmaW5lIENEYXRhT2JqZWN0X0NoZWNrRXhhY3QodikJKCh2KS0+b2JfdHlwZSA9PSAmQ0RhdGFfVHlwZSkKLSNkZWZpbmUgQ0RhdGFPYmplY3RfQ2hlY2sodikJCVB5T2JqZWN0X1R5cGVDaGVjayh2LCAmQ0RhdGFfVHlwZSkKKyNkZWZpbmUgQ0RhdGFPYmplY3RfQ2hlY2tFeGFjdCh2KSAgICAgICAoKHYpLT5vYl90eXBlID09ICZDRGF0YV9UeXBlKQorI2RlZmluZSBDRGF0YU9iamVjdF9DaGVjayh2KSAgICAgICAgICAgIFB5T2JqZWN0X1R5cGVDaGVjayh2LCAmQ0RhdGFfVHlwZSkKIAogZXh0ZXJuIFB5VHlwZU9iamVjdCBTaW1wbGVUeXBlX1R5cGU7Ci0jZGVmaW5lIFNpbXBsZVR5cGVPYmplY3RfQ2hlY2tFeGFjdCh2KQkoKHYpLT5vYl90eXBlID09ICZTaW1wbGVUeXBlX1R5cGUpCi0jZGVmaW5lIFNpbXBsZVR5cGVPYmplY3RfQ2hlY2sodikJUHlPYmplY3RfVHlwZUNoZWNrKHYsICZTaW1wbGVUeXBlX1R5cGUpCisjZGVmaW5lIFNpbXBsZVR5cGVPYmplY3RfQ2hlY2tFeGFjdCh2KSAgKCh2KS0+b2JfdHlwZSA9PSAmU2ltcGxlVHlwZV9UeXBlKQorI2RlZmluZSBTaW1wbGVUeXBlT2JqZWN0X0NoZWNrKHYpICAgICAgIFB5T2JqZWN0X1R5cGVDaGVjayh2LCAmU2ltcGxlVHlwZV9UeXBlKQogCiBleHRlcm4gUHlUeXBlT2JqZWN0IENGaWVsZF9UeXBlOwogZXh0ZXJuIHN0cnVjdCBmaWVsZGRlc2MgKmdldGVudHJ5KGNoYXIgKmZtdCk7CkBAIC0xNjMsOSArMTYzLDkgQEAKIAogZXh0ZXJuIFB5T2JqZWN0ICoKIENGaWVsZF9Gcm9tRGVzYyhQeU9iamVjdCAqZGVzYywgUHlfc3NpemVfdCBpbmRleCwKLQkJUHlfc3NpemVfdCAqcGZpZWxkX3NpemUsIGludCBiaXRzaXplLCBpbnQgKnBiaXRvZnMsCi0JCVB5X3NzaXplX3QgKnBzaXplLCBQeV9zc2l6ZV90ICpwb2Zmc2V0LCBQeV9zc2l6ZV90ICpwYWxpZ24sCi0JCWludCBwYWNrLCBpbnQgaXNfYmlnX2VuZGlhbik7CisgICAgICAgICAgICAgICAgUHlfc3NpemVfdCAqcGZpZWxkX3NpemUsIGludCBiaXRzaXplLCBpbnQgKnBiaXRvZnMsCisgICAgICAgICAgICAgICAgUHlfc3NpemVfdCAqcHNpemUsIFB5X3NzaXplX3QgKnBvZmZzZXQsIFB5X3NzaXplX3QgKnBhbGlnbiwKKyAgICAgICAgICAgICAgICBpbnQgcGFjaywgaW50IGlzX2JpZ19lbmRpYW4pOwogCiBleHRlcm4gUHlPYmplY3QgKkNEYXRhX0F0QWRkcmVzcyhQeU9iamVjdCAqdHlwZSwgdm9pZCAqYnVmKTsKIGV4dGVybiBQeU9iamVjdCAqQ0RhdGFfRnJvbUJ5dGVzKFB5T2JqZWN0ICp0eXBlLCBjaGFyICpkYXRhLCBQeV9zc2l6ZV90IGxlbmd0aCk7CkBAIC0xNzgsMTMgKzE3OCwxMyBAQAogZXh0ZXJuIFB5VHlwZU9iamVjdCBDRnVuY1B0clR5cGVfVHlwZTsKIGV4dGVybiBQeVR5cGVPYmplY3QgU3RydWN0VHlwZV9UeXBlOwogCi0jZGVmaW5lIEFycmF5VHlwZU9iamVjdF9DaGVjayh2KQlQeU9iamVjdF9UeXBlQ2hlY2sodiwgJkFycmF5VHlwZV9UeXBlKQotI2RlZmluZSBBcnJheU9iamVjdF9DaGVjayh2KQkJUHlPYmplY3RfVHlwZUNoZWNrKHYsICZBcnJheV9UeXBlKQotI2RlZmluZSBQb2ludGVyT2JqZWN0X0NoZWNrKHYpCQlQeU9iamVjdF9UeXBlQ2hlY2sodiwgJlBvaW50ZXJfVHlwZSkKLSNkZWZpbmUgUG9pbnRlclR5cGVPYmplY3RfQ2hlY2sodikJUHlPYmplY3RfVHlwZUNoZWNrKHYsICZQb2ludGVyVHlwZV9UeXBlKQotI2RlZmluZSBDRnVuY1B0ck9iamVjdF9DaGVjayh2KQkJUHlPYmplY3RfVHlwZUNoZWNrKHYsICZDRnVuY1B0cl9UeXBlKQotI2RlZmluZSBDRnVuY1B0clR5cGVPYmplY3RfQ2hlY2sodikJUHlPYmplY3RfVHlwZUNoZWNrKHYsICZDRnVuY1B0clR5cGVfVHlwZSkKLSNkZWZpbmUgU3RydWN0VHlwZU9iamVjdF9DaGVjayh2KQlQeU9iamVjdF9UeXBlQ2hlY2sodiwgJlN0cnVjdFR5cGVfVHlwZSkKKyNkZWZpbmUgQXJyYXlUeXBlT2JqZWN0X0NoZWNrKHYpICAgICAgICBQeU9iamVjdF9UeXBlQ2hlY2sodiwgJkFycmF5VHlwZV9UeXBlKQorI2RlZmluZSBBcnJheU9iamVjdF9DaGVjayh2KSAgICAgICAgICAgIFB5T2JqZWN0X1R5cGVDaGVjayh2LCAmQXJyYXlfVHlwZSkKKyNkZWZpbmUgUG9pbnRlck9iamVjdF9DaGVjayh2KSAgICAgICAgICBQeU9iamVjdF9UeXBlQ2hlY2sodiwgJlBvaW50ZXJfVHlwZSkKKyNkZWZpbmUgUG9pbnRlclR5cGVPYmplY3RfQ2hlY2sodikgICAgICBQeU9iamVjdF9UeXBlQ2hlY2sodiwgJlBvaW50ZXJUeXBlX1R5cGUpCisjZGVmaW5lIENGdW5jUHRyT2JqZWN0X0NoZWNrKHYpICAgICAgICAgUHlPYmplY3RfVHlwZUNoZWNrKHYsICZDRnVuY1B0cl9UeXBlKQorI2RlZmluZSBDRnVuY1B0clR5cGVPYmplY3RfQ2hlY2sodikgICAgIFB5T2JqZWN0X1R5cGVDaGVjayh2LCAmQ0Z1bmNQdHJUeXBlX1R5cGUpCisjZGVmaW5lIFN0cnVjdFR5cGVPYmplY3RfQ2hlY2sodikgICAgICAgUHlPYmplY3RfVHlwZUNoZWNrKHYsICZTdHJ1Y3RUeXBlX1R5cGUpCiAKIGV4dGVybiBQeU9iamVjdCAqCiBDcmVhdGVBcnJheVR5cGUoUHlPYmplY3QgKml0ZW10eXBlLCBQeV9zc2l6ZV90IGxlbmd0aCk7CkBAIC0xOTIsMzUgKzE5MiwzNSBAQAogZXh0ZXJuIFB5TWV0aG9kRGVmIG1vZHVsZV9tZXRob2RzW107CiAKIGV4dGVybiBDVGh1bmtPYmplY3QgKkFsbG9jRnVuY3Rpb25DYWxsYmFjayhQeU9iamVjdCAqY2FsbGFibGUsCi0JCQkJCSAgIFB5T2JqZWN0ICpjb252ZXJ0ZXJzLAotCQkJCQkgICBQeU9iamVjdCAqcmVzdHlwZSwKLQkJCQkJICAgaW50IGZsYWdzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqY29udmVydGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqcmVzdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MpOwogLyogYSB0YWJsZSBlbnRyeSBkZXNjcmliaW5nIGEgcHJlZGVmaW5lZCBjdHlwZXMgdHlwZSAqLwogc3RydWN0IGZpZWxkZGVzYyB7Ci0JY2hhciBjb2RlOwotCVNFVEZVTkMgc2V0ZnVuYzsKLQlHRVRGVU5DIGdldGZ1bmM7Ci0JZmZpX3R5cGUgKnBmZmlfdHlwZTsgLyogYWx3YXlzIHN0YXRpY2FsbHkgYWxsb2NhdGVkICovCi0JU0VURlVOQyBzZXRmdW5jX3N3YXBwZWQ7Ci0JR0VURlVOQyBnZXRmdW5jX3N3YXBwZWQ7CisgICAgY2hhciBjb2RlOworICAgIFNFVEZVTkMgc2V0ZnVuYzsKKyAgICBHRVRGVU5DIGdldGZ1bmM7CisgICAgZmZpX3R5cGUgKnBmZmlfdHlwZTsgLyogYWx3YXlzIHN0YXRpY2FsbHkgYWxsb2NhdGVkICovCisgICAgU0VURlVOQyBzZXRmdW5jX3N3YXBwZWQ7CisgICAgR0VURlVOQyBnZXRmdW5jX3N3YXBwZWQ7CiB9OwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCVB5X3NzaXplX3Qgb2Zmc2V0OwotCVB5X3NzaXplX3Qgc2l6ZTsKLQlQeV9zc2l6ZV90IGluZGV4OwkJLyogSW5kZXggaW50byBDRGF0YU9iamVjdCdzCi0JCQkJCSAgIG9iamVjdCBhcnJheSAqLwotCVB5T2JqZWN0ICpwcm90bzsJCS8qIGEgdHlwZSBvciBOVUxMICovCi0JR0VURlVOQyBnZXRmdW5jOwkJLyogZ2V0dGVyIGZ1bmN0aW9uIGlmIHByb3RvIGlzIE5VTEwgKi8KLQlTRVRGVU5DIHNldGZ1bmM7CQkvKiBzZXR0ZXIgZnVuY3Rpb24gaWYgcHJvdG8gaXMgTlVMTCAqLwotCWludCBhbm9ueW1vdXM7CisgICAgUHlPYmplY3RfSEVBRAorICAgIFB5X3NzaXplX3Qgb2Zmc2V0OworICAgIFB5X3NzaXplX3Qgc2l6ZTsKKyAgICBQeV9zc2l6ZV90IGluZGV4OyAgICAgICAgICAgICAgICAgICAvKiBJbmRleCBpbnRvIENEYXRhT2JqZWN0J3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdCBhcnJheSAqLworICAgIFB5T2JqZWN0ICpwcm90bzsgICAgICAgICAgICAgICAgICAgIC8qIGEgdHlwZSBvciBOVUxMICovCisgICAgR0VURlVOQyBnZXRmdW5jOyAgICAgICAgICAgICAgICAgICAgLyogZ2V0dGVyIGZ1bmN0aW9uIGlmIHByb3RvIGlzIE5VTEwgKi8KKyAgICBTRVRGVU5DIHNldGZ1bmM7ICAgICAgICAgICAgICAgICAgICAvKiBzZXR0ZXIgZnVuY3Rpb24gaWYgcHJvdG8gaXMgTlVMTCAqLworICAgIGludCBhbm9ueW1vdXM7CiB9IENGaWVsZE9iamVjdDsKIAogLyogQSBzdWJjbGFzcyBvZiBQeURpY3RPYmplY3QsIHVzZWQgYXMgdGhlIGluc3RhbmNlIGRpY3Rpb25hcnkgb2YgY3R5cGVzCiAgICBtZXRhdHlwZXMgKi8KIHR5cGVkZWYgc3RydWN0IHsKLQlQeURpY3RPYmplY3QgZGljdDsJLyogZmlyc3QgcGFydCBpZGVudGljYWwgdG8gUHlEaWN0T2JqZWN0ICovCisgICAgUHlEaWN0T2JqZWN0IGRpY3Q7ICAgICAgICAgIC8qIGZpcnN0IHBhcnQgaWRlbnRpY2FsIHRvIFB5RGljdE9iamVjdCAqLwogLyogVGhlIHNpemUgYW5kIGFsaWduIGZpZWxkcyBhcmUgdW5uZWVkZWQsIHRoZXkgYXJlIGluIGZmaV90eXBlIGFzIHdlbGwuICBBcwogICAgYW4gZXhwZXJpbWVudCBzaG93cywgaXQncyB0cml2aWFsIHRvIGdldCByaWQgb2YgdGhlbSwgdGhlIG9ubHkgdGhpbmcgdG8KICAgIHJlbWVtYmVyIGlzIHRoYXQgaW4gQXJyYXlUeXBlX25ldyB0aGUgZmZpX3R5cGUgZmllbGRzIG11c3QgYmUgZmlsbGVkIGluIC0KQEAgLTIyOSwyOCArMjI5LDI4IEBACiAgICB0b28gbXVjaCByaXNrIHRvIGNoYW5nZSB0aGF0IG5vdywgYW5kIHRoZXJlIGFyZSBvdGhlciBmaWVsZHMgd2hpY2ggZG9lbid0CiAgICBiZWxvbmcgaW50byB0aGlzIHN0cnVjdHVyZSBhbnl3YXkuICBNYXliZSBpbiBjdHlwZXMgMi4wLi4uIChjdHlwZXMgMjAwMD8pCiAqLwotCVB5X3NzaXplX3Qgc2l6ZTsJLyogbnVtYmVyIG9mIGJ5dGVzICovCi0JUHlfc3NpemVfdCBhbGlnbjsJLyogYWxpZ25tZW50IHJlcXVpcmVtZW50cyAqLwotCVB5X3NzaXplX3QgbGVuZ3RoOwkvKiBudW1iZXIgb2YgZmllbGRzICovCi0JZmZpX3R5cGUgZmZpX3R5cGVfcG9pbnRlcjsKLQlQeU9iamVjdCAqcHJvdG87CS8qIE9ubHkgZm9yIFBvaW50ZXIvQXJyYXlPYmplY3QgKi8KLQlTRVRGVU5DIHNldGZ1bmM7CS8qIE9ubHkgZm9yIHNpbXBsZSBvYmplY3RzICovCi0JR0VURlVOQyBnZXRmdW5jOwkvKiBPbmx5IGZvciBzaW1wbGUgb2JqZWN0cyAqLwotCVBBUkFNRlVOQyBwYXJhbWZ1bmM7CisgICAgUHlfc3NpemVfdCBzaXplOyAgICAgICAgICAgIC8qIG51bWJlciBvZiBieXRlcyAqLworICAgIFB5X3NzaXplX3QgYWxpZ247ICAgICAgICAgICAvKiBhbGlnbm1lbnQgcmVxdWlyZW1lbnRzICovCisgICAgUHlfc3NpemVfdCBsZW5ndGg7ICAgICAgICAgIC8qIG51bWJlciBvZiBmaWVsZHMgKi8KKyAgICBmZmlfdHlwZSBmZmlfdHlwZV9wb2ludGVyOworICAgIFB5T2JqZWN0ICpwcm90bzsgICAgICAgICAgICAvKiBPbmx5IGZvciBQb2ludGVyL0FycmF5T2JqZWN0ICovCisgICAgU0VURlVOQyBzZXRmdW5jOyAgICAgICAgICAgIC8qIE9ubHkgZm9yIHNpbXBsZSBvYmplY3RzICovCisgICAgR0VURlVOQyBnZXRmdW5jOyAgICAgICAgICAgIC8qIE9ubHkgZm9yIHNpbXBsZSBvYmplY3RzICovCisgICAgUEFSQU1GVU5DIHBhcmFtZnVuYzsKIAotCS8qIEZvbGxvd2luZyBmaWVsZHMgb25seSB1c2VkIGJ5IENGdW5jUHRyVHlwZV9UeXBlIGluc3RhbmNlcyAqLwotCVB5T2JqZWN0ICphcmd0eXBlczsJLyogdHVwbGUgb2YgQ0RhdGFPYmplY3RzICovCi0JUHlPYmplY3QgKmNvbnZlcnRlcnM7CS8qIHR1cGxlKFt0LmZyb21fcGFyYW0gZm9yIHQgaW4gYXJndHlwZXNdKSAqLwotCVB5T2JqZWN0ICpyZXN0eXBlOwkvKiBDRGF0YU9iamVjdCBvciBOVUxMICovCi0JUHlPYmplY3QgKmNoZWNrZXI7Ci0JaW50IGZsYWdzOwkJLyogY2FsbGluZyBjb252ZW50aW9uIGFuZCBzdWNoICovCisgICAgLyogRm9sbG93aW5nIGZpZWxkcyBvbmx5IHVzZWQgYnkgQ0Z1bmNQdHJUeXBlX1R5cGUgaW5zdGFuY2VzICovCisgICAgUHlPYmplY3QgKmFyZ3R5cGVzOyAgICAgICAgIC8qIHR1cGxlIG9mIENEYXRhT2JqZWN0cyAqLworICAgIFB5T2JqZWN0ICpjb252ZXJ0ZXJzOyAgICAgICAvKiB0dXBsZShbdC5mcm9tX3BhcmFtIGZvciB0IGluIGFyZ3R5cGVzXSkgKi8KKyAgICBQeU9iamVjdCAqcmVzdHlwZTsgICAgICAgICAgLyogQ0RhdGFPYmplY3Qgb3IgTlVMTCAqLworICAgIFB5T2JqZWN0ICpjaGVja2VyOworICAgIGludCBmbGFnczsgICAgICAgICAgICAgICAgICAvKiBjYWxsaW5nIGNvbnZlbnRpb24gYW5kIHN1Y2ggKi8KIAotCS8qIHBlcDMxMTggZmllbGRzLCBwb2ludGVycyBuZWVlZCBQeU1lbV9GcmVlICovCi0JY2hhciAqZm9ybWF0OwotCWludCBuZGltOwotCVB5X3NzaXplX3QgKnNoYXBlOwotLyoJUHlfc3NpemVfdCAqc3RyaWRlczsJKi8gLyogdW51c2VkIGluIGN0eXBlcyAqLwotLyoJUHlfc3NpemVfdCAqc3Vib2Zmc2V0czsJKi8gLyogdW51c2VkIGluIGN0eXBlcyAqLworICAgIC8qIHBlcDMxMTggZmllbGRzLCBwb2ludGVycyBuZWVlZCBQeU1lbV9GcmVlICovCisgICAgY2hhciAqZm9ybWF0OworICAgIGludCBuZGltOworICAgIFB5X3NzaXplX3QgKnNoYXBlOworLyogICAgICBQeV9zc2l6ZV90ICpzdHJpZGVzOyAgICAqLyAvKiB1bnVzZWQgaW4gY3R5cGVzICovCisvKiAgICAgIFB5X3NzaXplX3QgKnN1Ym9mZnNldHM7ICovIC8qIHVudXNlZCBpbiBjdHlwZXMgKi8KIAogfSBTdGdEaWN0T2JqZWN0OwogCkBAIC0zMDUsMTYgKzMwNSwxNiBAQAogdHlwZWRlZiBpbnQoKiBQUFJPQykodm9pZCk7CiAKIFB5T2JqZWN0ICpfQ2FsbFByb2MoUFBST0MgcFByb2MsCi0JCSAgICBQeU9iamVjdCAqYXJndW1lbnRzLAorICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqYXJndW1lbnRzLAogI2lmZGVmIE1TX1dJTjMyCi0JCSAgICBJVW5rbm93biAqcElVbmssCi0JCSAgICBHVUlEICppaWQsCisgICAgICAgICAgICAgICAgICAgIElVbmtub3duICpwSVVuaywKKyAgICAgICAgICAgICAgICAgICAgR1VJRCAqaWlkLAogI2VuZGlmCi0JCSAgICBpbnQgZmxhZ3MsCi0JCSAgICBQeU9iamVjdCAqYXJndHlwZXMsCi0JCSAgICBQeU9iamVjdCAqcmVzdHlwZSwKLQkJICAgIFB5T2JqZWN0ICpjaGVja2VyKTsKLSAKKyAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqYXJndHlwZXMsCisgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpyZXN0eXBlLAorICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqY2hlY2tlcik7CisKIAogI2RlZmluZSBGVU5DRkxBR19TVERDQUxMIDB4MAogI2RlZmluZSBGVU5DRkxBR19DREVDTCAgIDB4MQpAQCAtMzI5LDQ1ICszMjksNDUgQEAKICNkZWZpbmUgRElDVEZMQUdfRklOQUwgMHgxMDAwCiAKIHN0cnVjdCB0YWdQeUNBcmdPYmplY3QgewotCVB5T2JqZWN0X0hFQUQKLQlmZmlfdHlwZSAqcGZmaV90eXBlOwotCWNoYXIgdGFnOwotCXVuaW9uIHsKLQkJY2hhciBjOwotCQljaGFyIGI7Ci0JCXNob3J0IGg7Ci0JCWludCBpOwotCQlsb25nIGw7CisgICAgUHlPYmplY3RfSEVBRAorICAgIGZmaV90eXBlICpwZmZpX3R5cGU7CisgICAgY2hhciB0YWc7CisgICAgdW5pb24geworICAgICAgICBjaGFyIGM7CisgICAgICAgIGNoYXIgYjsKKyAgICAgICAgc2hvcnQgaDsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGxvbmcgbDsKICNpZmRlZiBIQVZFX0xPTkdfTE9ORwotCQlQWV9MT05HX0xPTkcgcTsKKyAgICAgICAgUFlfTE9OR19MT05HIHE7CiAjZW5kaWYKLQkJbG9uZyBkb3VibGUgRDsKLQkJZG91YmxlIGQ7Ci0JCWZsb2F0IGY7Ci0JCXZvaWQgKnA7Ci0JfSB2YWx1ZTsKLQlQeU9iamVjdCAqb2JqOwotCVB5X3NzaXplX3Qgc2l6ZTsgLyogZm9yIHRoZSAnVicgdGFnICovCisgICAgICAgIGxvbmcgZG91YmxlIEQ7CisgICAgICAgIGRvdWJsZSBkOworICAgICAgICBmbG9hdCBmOworICAgICAgICB2b2lkICpwOworICAgIH0gdmFsdWU7CisgICAgUHlPYmplY3QgKm9iajsKKyAgICBQeV9zc2l6ZV90IHNpemU7IC8qIGZvciB0aGUgJ1YnIHRhZyAqLwogfTsKIAogZXh0ZXJuIFB5VHlwZU9iamVjdCBQeUNBcmdfVHlwZTsKLSNkZWZpbmUgUHlDQXJnX0NoZWNrRXhhY3QodikJICAgICgodiktPm9iX3R5cGUgPT0gJlB5Q0FyZ19UeXBlKQorI2RlZmluZSBQeUNBcmdfQ2hlY2tFeGFjdCh2KSAgICAgICAgKCh2KS0+b2JfdHlwZSA9PSAmUHlDQXJnX1R5cGUpCiBleHRlcm4gUHlDQXJnT2JqZWN0ICpuZXdfQ0FyZ09iamVjdCh2b2lkKTsKIAogZXh0ZXJuIFB5T2JqZWN0ICoKIENEYXRhX2dldChQeU9iamVjdCAqdHlwZSwgR0VURlVOQyBnZXRmdW5jLCBQeU9iamVjdCAqc3JjLAotCSAgUHlfc3NpemVfdCBpbmRleCwgUHlfc3NpemVfdCBzaXplLCBjaGFyICpwdHIpOworICAgICAgICAgIFB5X3NzaXplX3QgaW5kZXgsIFB5X3NzaXplX3Qgc2l6ZSwgY2hhciAqcHRyKTsKIAogZXh0ZXJuIGludAogQ0RhdGFfc2V0KFB5T2JqZWN0ICpkc3QsIFB5T2JqZWN0ICp0eXBlLCBTRVRGVU5DIHNldGZ1bmMsIFB5T2JqZWN0ICp2YWx1ZSwKLQkgIFB5X3NzaXplX3QgaW5kZXgsIFB5X3NzaXplX3Qgc2l6ZSwgY2hhciAqcHRyKTsKKyAgICAgICAgICBQeV9zc2l6ZV90IGluZGV4LCBQeV9zc2l6ZV90IHNpemUsIGNoYXIgKnB0cik7CiAKIGV4dGVybiB2b2lkIEV4dGVuZF9FcnJvcl9JbmZvKFB5T2JqZWN0ICpleGNfY2xhc3MsIGNoYXIgKmZtdCwgLi4uKTsKIAogc3RydWN0IGJhc2VzcGVjIHsKLQlDRGF0YU9iamVjdCAqYmFzZTsKLQlQeV9zc2l6ZV90IGluZGV4OwotCWNoYXIgKmFkcjsKKyAgICBDRGF0YU9iamVjdCAqYmFzZTsKKyAgICBQeV9zc2l6ZV90IGluZGV4OworICAgIGNoYXIgKmFkcjsKIH07CiAKIGV4dGVybiBjaGFyIGJhc2VzcGVjX3N0cmluZ1tdOwpAQCAtMzgzLDE0ICszODMsMTQgQEAKIC8qIFB5dGhvbiAyLjQgbWFjcm9zLCB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSBpbiBQeXRob24gMi4zICovCiAKICNpZm5kZWYgUHlfQ0xFQVIKLSNkZWZpbmUgUHlfQ0xFQVIob3ApCQkJCVwKLSAgICAgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJXAotICAgICAgICAgICAgICAgIGlmIChvcCkgewkJCVwKLSAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICp0bXAgPSAoUHlPYmplY3QgKikob3ApOwlcCi0gICAgICAgICAgICAgICAgICAgICAgICAob3ApID0gTlVMTDsJCVwKLSAgICAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih0bXApOwkJXAotICAgICAgICAgICAgICAgIH0JCQkJXAotICAgICAgICB9IHdoaWxlICgwKQorI2RlZmluZSBQeV9DTEVBUihvcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAob3ApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgUHlPYmplY3QgKnRtcCA9IChQeU9iamVjdCAqKShvcCk7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIChvcCkgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIFB5X0RFQ1JFRih0bXApOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlICgwKQogI2VuZGlmCiAKICNpZm5kZWYgUHlfVklTSVQKQEAgLTM5OSwxNCArMzk5LDE0IEBACiAgKiAidmlzaXQiIGFuZCAiYXJnIi4gIFRoaXMgaXMgaW50ZW5kZWQgdG8ga2VlcCB0cF90cmF2ZXJzZSBmdW5jdGlvbnMKICAqIGxvb2tpbmcgYXMgbXVjaCBhbGlrZSBhcyBwb3NzaWJsZS4KICAqLwotI2RlZmluZSBQeV9WSVNJVChvcCkJCQkJCVwKLSAgICAgICAgZG8geyAJCQkJCQlcCi0gICAgICAgICAgICAgICAgaWYgKG9wKSB7CQkJCVwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCB2cmV0ID0gdmlzaXQoKG9wKSwgYXJnKTsJXAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZyZXQpCQkJXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdnJldDsJCVwKLSAgICAgICAgICAgICAgICB9CQkJCQlcCi0gICAgICAgIH0gd2hpbGUgKDApCisjZGVmaW5lIFB5X1ZJU0lUKG9wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAob3ApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpbnQgdnJldCA9IHZpc2l0KChvcCksIGFyZyk7ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmICh2cmV0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHJldHVybiB2cmV0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlICgwKQogI2VuZGlmCiAKIC8qIFB5dGhvbidzIFB5VW5pY29kZV8qV2lkZUNoYXIgZnVuY3Rpb25zIGFyZSBicm9rZW4gLi4uICovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvZGFyd2luL2RsZmNuX3NpbXBsZS5jIGIvTW9kdWxlcy9fY3R5cGVzL2Rhcndpbi9kbGZjbl9zaW1wbGUuYwppbmRleCA0YjU1MzIzLi4yYjI5M2JiIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvZGFyd2luL2RsZmNuX3NpbXBsZS5jCisrKyBiL01vZHVsZXMvX2N0eXBlcy9kYXJ3aW4vZGxmY25fc2ltcGxlLmMKQEAgLTgxLDE2NyArODEsMTY3IEBACiAvKiBTZXQgYW5kIGdldCB0aGUgZXJyb3Igc3RyaW5nIGZvciB1c2UgYnkgZGxlcnJvciAqLwogc3RhdGljIGNvbnN0IGNoYXIgKmVycm9yKGludCBzZXRnZXQsIGNvbnN0IGNoYXIgKnN0ciwgLi4uKQogewotCXN0YXRpYyBjaGFyIGVycnN0cltFUlJfU1RSX0xFTl07Ci0Jc3RhdGljIGludCBlcnJfZmlsbGVkID0gMDsKLQljb25zdCBjaGFyICpyZXR2YWw7Ci0JdmFfbGlzdCBhcmc7Ci0JaWYgKHNldGdldCA9PSAwKQotCXsKLQkJdmFfc3RhcnQoYXJnLCBzdHIpOwotCQlzdHJuY3B5KGVycnN0ciwgImRsY29tcGF0OiAiLCBFUlJfU1RSX0xFTik7Ci0JCXZzbnByaW50ZihlcnJzdHIgKyAxMCwgRVJSX1NUUl9MRU4gLSAxMCwgc3RyLCBhcmcpOwotCQl2YV9lbmQoYXJnKTsKLQkJZXJyX2ZpbGxlZCA9IDE7Ci0JCXJldHZhbCA9IE5VTEw7Ci0JfQotCWVsc2UKLQl7Ci0JCWlmICghZXJyX2ZpbGxlZCkKLQkJCXJldHZhbCA9IE5VTEw7Ci0JCWVsc2UKLQkJCXJldHZhbCA9IGVycnN0cjsKLQkJZXJyX2ZpbGxlZCA9IDA7Ci0JfQotCXJldHVybiByZXR2YWw7CisgICAgc3RhdGljIGNoYXIgZXJyc3RyW0VSUl9TVFJfTEVOXTsKKyAgICBzdGF0aWMgaW50IGVycl9maWxsZWQgPSAwOworICAgIGNvbnN0IGNoYXIgKnJldHZhbDsKKyAgICB2YV9saXN0IGFyZzsKKyAgICBpZiAoc2V0Z2V0ID09IDApCisgICAgeworICAgICAgICB2YV9zdGFydChhcmcsIHN0cik7CisgICAgICAgIHN0cm5jcHkoZXJyc3RyLCAiZGxjb21wYXQ6ICIsIEVSUl9TVFJfTEVOKTsKKyAgICAgICAgdnNucHJpbnRmKGVycnN0ciArIDEwLCBFUlJfU1RSX0xFTiAtIDEwLCBzdHIsIGFyZyk7CisgICAgICAgIHZhX2VuZChhcmcpOworICAgICAgICBlcnJfZmlsbGVkID0gMTsKKyAgICAgICAgcmV0dmFsID0gTlVMTDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgKCFlcnJfZmlsbGVkKQorICAgICAgICAgICAgcmV0dmFsID0gTlVMTDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dmFsID0gZXJyc3RyOworICAgICAgICBlcnJfZmlsbGVkID0gMDsKKyAgICB9CisgICAgcmV0dXJuIHJldHZhbDsKIH0KIAogLyogZGFyd2luX2Rsb3BlbiAqLwogc3RhdGljIHZvaWQgKmRhcndpbl9kbG9wZW4oY29uc3QgY2hhciAqcGF0aCwgaW50IG1vZGUpCiB7Ci0Jdm9pZCAqbW9kdWxlID0gMDsKLQlOU09iamVjdEZpbGVJbWFnZSBvZmkgPSAwOwotCU5TT2JqZWN0RmlsZUltYWdlUmV0dXJuQ29kZSBvZmlyYzsKKyAgICB2b2lkICptb2R1bGUgPSAwOworICAgIE5TT2JqZWN0RmlsZUltYWdlIG9maSA9IDA7CisgICAgTlNPYmplY3RGaWxlSW1hZ2VSZXR1cm5Db2RlIG9maXJjOwogCi0JLyogSWYgd2UgZ290IG5vIHBhdGgsIHRoZSBhcHAgd2FudHMgdGhlIGdsb2JhbCBuYW1lc3BhY2UsIHVzZSAtMSBhcyB0aGUgbWFya2VyCi0JICAgaW4gdGhpcyBjYXNlICovCi0JaWYgKCFwYXRoKQotCQlyZXR1cm4gKHZvaWQgKiktMTsKKyAgICAvKiBJZiB3ZSBnb3Qgbm8gcGF0aCwgdGhlIGFwcCB3YW50cyB0aGUgZ2xvYmFsIG5hbWVzcGFjZSwgdXNlIC0xIGFzIHRoZSBtYXJrZXIKKyAgICAgICBpbiB0aGlzIGNhc2UgKi8KKyAgICBpZiAoIXBhdGgpCisgICAgICAgIHJldHVybiAodm9pZCAqKS0xOwogCi0JLyogQ3JlYXRlIHRoZSBvYmplY3QgZmlsZSBpbWFnZSwgd29ya3MgZm9yIHRoaW5ncyBsaW5rZWQgd2l0aCB0aGUgLWJ1bmRsZSBhcmcgdG8gbGQgKi8KLQlvZmlyYyA9IE5TQ3JlYXRlT2JqZWN0RmlsZUltYWdlRnJvbUZpbGUocGF0aCwgJm9maSk7Ci0Jc3dpdGNoIChvZmlyYykKLQl7Ci0JCWNhc2UgTlNPYmplY3RGaWxlSW1hZ2VTdWNjZXNzOgotCQkJLyogSXQgd2FzIG9rYXksIHNvIHVzZSBOU0xpbmtNb2R1bGUgdG8gbGluayBpbiB0aGUgaW1hZ2UgKi8KLQkJCW1vZHVsZSA9IE5TTGlua01vZHVsZShvZmksIHBhdGgsCi0JCQkJCQkJCSAgTlNMSU5LTU9EVUxFX09QVElPTl9SRVRVUk5fT05fRVJST1IKLQkJCQkJCQkJICB8IChtb2RlICYgUlRMRF9HTE9CQUwpID8gMCA6IE5TTElOS01PRFVMRV9PUFRJT05fUFJJVkFURQotCQkJCQkJCQkgIHwgKG1vZGUgJiBSVExEX0xBWlkpID8gMCA6IE5TTElOS01PRFVMRV9PUFRJT05fQklORE5PVyk7Ci0JCQlOU0Rlc3Ryb3lPYmplY3RGaWxlSW1hZ2Uob2ZpKTsKLQkJCWJyZWFrOwotCQljYXNlIE5TT2JqZWN0RmlsZUltYWdlSW5hcHByb3ByaWF0ZUZpbGU6Ci0JCQkvKiBJdCBtYXkgaGF2ZSBiZWVuIGEgZHluYW1pYyBsaWJyYXJ5IHJhdGhlciB0aGFuIGEgYnVuZGxlLCB0cnkgdG8gbG9hZCBpdCAqLwotCQkJbW9kdWxlID0gKHZvaWQgKilOU0FkZEltYWdlKHBhdGgsIE5TQURESU1BR0VfT1BUSU9OX1JFVFVSTl9PTl9FUlJPUik7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCS8qIEdvZCBrbm93cyB3aGF0IHdlIGdvdCAqLwotCQkJZXJyb3IoMCwgIkNhbiBub3Qgb3BlbiBcIiVzXCIiLCBwYXRoKTsKLQkJCXJldHVybiAwOwotCX0KLQlpZiAoIW1vZHVsZSkKLQkJZXJyb3IoMCwgIkNhbiBub3Qgb3BlbiBcIiVzXCIiLCBwYXRoKTsKLQlyZXR1cm4gbW9kdWxlOworICAgIC8qIENyZWF0ZSB0aGUgb2JqZWN0IGZpbGUgaW1hZ2UsIHdvcmtzIGZvciB0aGluZ3MgbGlua2VkIHdpdGggdGhlIC1idW5kbGUgYXJnIHRvIGxkICovCisgICAgb2ZpcmMgPSBOU0NyZWF0ZU9iamVjdEZpbGVJbWFnZUZyb21GaWxlKHBhdGgsICZvZmkpOworICAgIHN3aXRjaCAob2ZpcmMpCisgICAgeworICAgICAgICBjYXNlIE5TT2JqZWN0RmlsZUltYWdlU3VjY2VzczoKKyAgICAgICAgICAgIC8qIEl0IHdhcyBva2F5LCBzbyB1c2UgTlNMaW5rTW9kdWxlIHRvIGxpbmsgaW4gdGhlIGltYWdlICovCisgICAgICAgICAgICBtb2R1bGUgPSBOU0xpbmtNb2R1bGUob2ZpLCBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNMSU5LTU9EVUxFX09QVElPTl9SRVRVUk5fT05fRVJST1IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKG1vZGUgJiBSVExEX0dMT0JBTCkgPyAwIDogTlNMSU5LTU9EVUxFX09QVElPTl9QUklWQVRFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IChtb2RlICYgUlRMRF9MQVpZKSA/IDAgOiBOU0xJTktNT0RVTEVfT1BUSU9OX0JJTkROT1cpOworICAgICAgICAgICAgTlNEZXN0cm95T2JqZWN0RmlsZUltYWdlKG9maSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBOU09iamVjdEZpbGVJbWFnZUluYXBwcm9wcmlhdGVGaWxlOgorICAgICAgICAgICAgLyogSXQgbWF5IGhhdmUgYmVlbiBhIGR5bmFtaWMgbGlicmFyeSByYXRoZXIgdGhhbiBhIGJ1bmRsZSwgdHJ5IHRvIGxvYWQgaXQgKi8KKyAgICAgICAgICAgIG1vZHVsZSA9ICh2b2lkICopTlNBZGRJbWFnZShwYXRoLCBOU0FERElNQUdFX09QVElPTl9SRVRVUk5fT05fRVJST1IpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAvKiBHb2Qga25vd3Mgd2hhdCB3ZSBnb3QgKi8KKyAgICAgICAgICAgIGVycm9yKDAsICJDYW4gbm90IG9wZW4gXCIlc1wiIiwgcGF0aCk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKCFtb2R1bGUpCisgICAgICAgIGVycm9yKDAsICJDYW4gbm90IG9wZW4gXCIlc1wiIiwgcGF0aCk7CisgICAgcmV0dXJuIG1vZHVsZTsKIAogfQogCiAvKiBkbHN5bUludGVybiBpcyB1c2VkIGJ5IGRsc3ltIHRvIGZpbmQgdGhlIHN5bWJvbCAqLwogc3RhdGljIHZvaWQgKmRsc3ltSW50ZXJuKHZvaWQgKmhhbmRsZSwgY29uc3QgY2hhciAqc3ltYm9sKQogewotCU5TU3ltYm9sIG5zc3ltID0gMDsKLQkvKiBJZiB0aGUgaGFuZGxlIGlzIC0xLCBpZiBpcyB0aGUgYXBwIGdsb2JhbCBjb250ZXh0ICovCi0JaWYgKGhhbmRsZSA9PSAodm9pZCAqKS0xKQotCXsKLQkJLyogR2xvYmFsIGNvbnRleHQsIHVzZSBOU0xvb2t1cEFuZEJpbmRTeW1ib2wgKi8KLQkJaWYgKE5TSXNTeW1ib2xOYW1lRGVmaW5lZChzeW1ib2wpKQotCQl7Ci0JCQluc3N5bSA9IE5TTG9va3VwQW5kQmluZFN5bWJvbChzeW1ib2wpOwotCQl9CisgICAgTlNTeW1ib2wgbnNzeW0gPSAwOworICAgIC8qIElmIHRoZSBoYW5kbGUgaXMgLTEsIGlmIGlzIHRoZSBhcHAgZ2xvYmFsIGNvbnRleHQgKi8KKyAgICBpZiAoaGFuZGxlID09ICh2b2lkICopLTEpCisgICAgeworICAgICAgICAvKiBHbG9iYWwgY29udGV4dCwgdXNlIE5TTG9va3VwQW5kQmluZFN5bWJvbCAqLworICAgICAgICBpZiAoTlNJc1N5bWJvbE5hbWVEZWZpbmVkKHN5bWJvbCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG5zc3ltID0gTlNMb29rdXBBbmRCaW5kU3ltYm9sKHN5bWJvbCk7CisgICAgICAgIH0KIAotCX0KLQkvKiBOb3cgc2VlIGlmIHRoZSBoYW5kbGUgaXMgYSBzdHJ1Y2ggbWFjaF9oZWFkZXIqIG9yIG5vdCwgdXNlIE5TTG9va3VwU3ltYm9sIGluIGltYWdlCi0JICAgZm9yIGxpYnJhcmllcywgYW5kIE5TTG9va3VwU3ltYm9sSW5Nb2R1bGUgZm9yIGJ1bmRsZXMgKi8KLQllbHNlCi0JewotCQkvKiBDaGVjayBmb3IgYm90aCBwb3NzaWJsZSBtYWdpYyBudW1iZXJzIGRlcGVuZGluZyBvbiB4ODYvcHBjIGJ5dGUgb3JkZXIgKi8KLQkJaWYgKCgoKHN0cnVjdCBtYWNoX2hlYWRlciAqKWhhbmRsZSktPm1hZ2ljID09IE1IX01BR0lDKSB8fAotCQkJKCgoc3RydWN0IG1hY2hfaGVhZGVyICopaGFuZGxlKS0+bWFnaWMgPT0gTUhfQ0lHQU0pKQotCQl7Ci0JCQlpZiAoTlNJc1N5bWJvbE5hbWVEZWZpbmVkSW5JbWFnZSgoc3RydWN0IG1hY2hfaGVhZGVyICopaGFuZGxlLCBzeW1ib2wpKQotCQkJewotCQkJCW5zc3ltID0gTlNMb29rdXBTeW1ib2xJbkltYWdlKChzdHJ1Y3QgbWFjaF9oZWFkZXIgKiloYW5kbGUsCi0JCQkJCQkJCQkJCSAgc3ltYm9sLAotCQkJCQkJCQkJCQkgIE5TTE9PS1VQU1lNQk9MSU5JTUFHRV9PUFRJT05fQklORAotCQkJCQkJCQkJCQkgIHwgTlNMT09LVVBTWU1CT0xJTklNQUdFX09QVElPTl9SRVRVUk5fT05fRVJST1IpOwotCQkJfQorICAgIH0KKyAgICAvKiBOb3cgc2VlIGlmIHRoZSBoYW5kbGUgaXMgYSBzdHJ1Y2ggbWFjaF9oZWFkZXIqIG9yIG5vdCwgdXNlIE5TTG9va3VwU3ltYm9sIGluIGltYWdlCisgICAgICAgZm9yIGxpYnJhcmllcywgYW5kIE5TTG9va3VwU3ltYm9sSW5Nb2R1bGUgZm9yIGJ1bmRsZXMgKi8KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBDaGVjayBmb3IgYm90aCBwb3NzaWJsZSBtYWdpYyBudW1iZXJzIGRlcGVuZGluZyBvbiB4ODYvcHBjIGJ5dGUgb3JkZXIgKi8KKyAgICAgICAgaWYgKCgoKHN0cnVjdCBtYWNoX2hlYWRlciAqKWhhbmRsZSktPm1hZ2ljID09IE1IX01BR0lDKSB8fAorICAgICAgICAgICAgKCgoc3RydWN0IG1hY2hfaGVhZGVyICopaGFuZGxlKS0+bWFnaWMgPT0gTUhfQ0lHQU0pKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoTlNJc1N5bWJvbE5hbWVEZWZpbmVkSW5JbWFnZSgoc3RydWN0IG1hY2hfaGVhZGVyICopaGFuZGxlLCBzeW1ib2wpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG5zc3ltID0gTlNMb29rdXBTeW1ib2xJbkltYWdlKChzdHJ1Y3QgbWFjaF9oZWFkZXIgKiloYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bWJvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNMT09LVVBTWU1CT0xJTklNQUdFX09QVElPTl9CSU5ECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTlNMT09LVVBTWU1CT0xJTklNQUdFX09QVElPTl9SRVRVUk5fT05fRVJST1IpOworICAgICAgICAgICAgfQogCi0JCX0KLQkJZWxzZQotCQl7Ci0JCQluc3N5bSA9IE5TTG9va3VwU3ltYm9sSW5Nb2R1bGUoaGFuZGxlLCBzeW1ib2wpOwotCQl9Ci0JfQotCWlmICghbnNzeW0pCi0JewotCQllcnJvcigwLCAiU3ltYm9sIFwiJXNcIiBOb3QgZm91bmQiLCBzeW1ib2wpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIE5TQWRkcmVzc09mU3ltYm9sKG5zc3ltKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIG5zc3ltID0gTlNMb29rdXBTeW1ib2xJbk1vZHVsZShoYW5kbGUsIHN5bWJvbCk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCFuc3N5bSkKKyAgICB7CisgICAgICAgIGVycm9yKDAsICJTeW1ib2wgXCIlc1wiIE5vdCBmb3VuZCIsIHN5bWJvbCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gTlNBZGRyZXNzT2ZTeW1ib2wobnNzeW0pOwogfQogCiBzdGF0aWMgY29uc3QgY2hhciAqZGFyd2luX2RsZXJyb3Iodm9pZCkKIHsKLQlyZXR1cm4gZXJyb3IoMSwgKGNoYXIgKilOVUxMKTsKKyAgICByZXR1cm4gZXJyb3IoMSwgKGNoYXIgKilOVUxMKTsKIH0KIAogc3RhdGljIGludCBkYXJ3aW5fZGxjbG9zZSh2b2lkICpoYW5kbGUpCiB7Ci0JaWYgKCgoKHN0cnVjdCBtYWNoX2hlYWRlciAqKWhhbmRsZSktPm1hZ2ljID09IE1IX01BR0lDKSB8fAotCQkoKChzdHJ1Y3QgbWFjaF9oZWFkZXIgKiloYW5kbGUpLT5tYWdpYyA9PSBNSF9DSUdBTSkpCi0JewotCQllcnJvcigwLCAiQ2FuJ3QgcmVtb3ZlIGR5bmFtaWMgbGlicmFyaWVzIG9uIGRhcndpbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKCFOU1VuTGlua01vZHVsZShoYW5kbGUsIDApKQotCXsKLQkJZXJyb3IoMCwgInVuYWJsZSB0byB1bmxpbmsgbW9kdWxlICVzIiwgTlNOYW1lT2ZNb2R1bGUoaGFuZGxlKSk7Ci0JCXJldHVybiAxOwotCX0KLQlyZXR1cm4gMDsKKyAgICBpZiAoKCgoc3RydWN0IG1hY2hfaGVhZGVyICopaGFuZGxlKS0+bWFnaWMgPT0gTUhfTUFHSUMpIHx8CisgICAgICAgICgoKHN0cnVjdCBtYWNoX2hlYWRlciAqKWhhbmRsZSktPm1hZ2ljID09IE1IX0NJR0FNKSkKKyAgICB7CisgICAgICAgIGVycm9yKDAsICJDYW4ndCByZW1vdmUgZHluYW1pYyBsaWJyYXJpZXMgb24gZGFyd2luIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoIU5TVW5MaW5rTW9kdWxlKGhhbmRsZSwgMCkpCisgICAgeworICAgICAgICBlcnJvcigwLCAidW5hYmxlIHRvIHVubGluayBtb2R1bGUgJXMiLCBOU05hbWVPZk1vZHVsZShoYW5kbGUpKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHJldHVybiAwOwogfQogCiAKIC8qIGRsc3ltLCBwcmVwZW5kIHRoZSB1bmRlcnNjb3JlIGFuZCBjYWxsIGRsc3ltSW50ZXJuICovCiBzdGF0aWMgdm9pZCAqZGFyd2luX2Rsc3ltKHZvaWQgKmhhbmRsZSwgY29uc3QgY2hhciAqc3ltYm9sKQogewotCXN0YXRpYyBjaGFyIHVuZGVyc3ltWzI1N107CS8qIFNhdmVzIGNhbGxzIHRvIG1hbGxvYygzKSAqLwotCWludCBzeW1fbGVuID0gc3RybGVuKHN5bWJvbCk7Ci0Jdm9pZCAqdmFsdWUgPSBOVUxMOwotCWNoYXIgKm1hbGxvY19zeW0gPSBOVUxMOworICAgIHN0YXRpYyBjaGFyIHVuZGVyc3ltWzI1N107ICAgICAgICAgIC8qIFNhdmVzIGNhbGxzIHRvIG1hbGxvYygzKSAqLworICAgIGludCBzeW1fbGVuID0gc3RybGVuKHN5bWJvbCk7CisgICAgdm9pZCAqdmFsdWUgPSBOVUxMOworICAgIGNoYXIgKm1hbGxvY19zeW0gPSBOVUxMOwogCi0JaWYgKHN5bV9sZW4gPCAyNTYpCi0JewotCQlzbnByaW50Zih1bmRlcnN5bSwgMjU2LCAiXyVzIiwgc3ltYm9sKTsKLQkJdmFsdWUgPSBkbHN5bUludGVybihoYW5kbGUsIHVuZGVyc3ltKTsKLQl9Ci0JZWxzZQotCXsKLQkJbWFsbG9jX3N5bSA9IG1hbGxvYyhzeW1fbGVuICsgMik7Ci0JCWlmIChtYWxsb2Nfc3ltKQotCQl7Ci0JCQlzcHJpbnRmKG1hbGxvY19zeW0sICJfJXMiLCBzeW1ib2wpOwotCQkJdmFsdWUgPSBkbHN5bUludGVybihoYW5kbGUsIG1hbGxvY19zeW0pOwotCQkJZnJlZShtYWxsb2Nfc3ltKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCWVycm9yKDAsICJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5Iik7Ci0JCX0KLQl9Ci0JcmV0dXJuIHZhbHVlOworICAgIGlmIChzeW1fbGVuIDwgMjU2KQorICAgIHsKKyAgICAgICAgc25wcmludGYodW5kZXJzeW0sIDI1NiwgIl8lcyIsIHN5bWJvbCk7CisgICAgICAgIHZhbHVlID0gZGxzeW1JbnRlcm4oaGFuZGxlLCB1bmRlcnN5bSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIG1hbGxvY19zeW0gPSBtYWxsb2Moc3ltX2xlbiArIDIpOworICAgICAgICBpZiAobWFsbG9jX3N5bSkKKyAgICAgICAgeworICAgICAgICAgICAgc3ByaW50ZihtYWxsb2Nfc3ltLCAiXyVzIiwgc3ltYm9sKTsKKyAgICAgICAgICAgIHZhbHVlID0gZGxzeW1JbnRlcm4oaGFuZGxlLCBtYWxsb2Nfc3ltKTsKKyAgICAgICAgICAgIGZyZWUobWFsbG9jX3N5bSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBlcnJvcigwLCAiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSIpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB2YWx1ZTsKIH0KIAogc3RhdGljIGludCBkYXJ3aW5fZGxhZGRyKGNvbnN0IHZvaWQgKmhhbmRsZSwgRGxfaW5mbyAqaW5mbykgewotCXJldHVybiAwOworICAgIHJldHVybiAwOwogfQogI2VuZGlmIC8qIE1BQ19PU19YX1ZFUlNJT05fTUlOX1JFUVVJUkVEIDwgTUFDX09TX1hfVkVSU0lPTl8xMF8zICovCiAKQEAgLTI1MiwyMSArMjUyLDIxIEBACiBzdGF0aWMKICNlbmRpZgogdm9pZCBjdHlwZXNfZGxmY25faW5pdCh2b2lkKSB7Ci0JaWYgKGRsb3BlbiAhPSBOVUxMKSB7Ci0JCWN0eXBlc19kbHN5bSA9IGRsc3ltOwotCQljdHlwZXNfZGxvcGVuID0gZGxvcGVuOwotCQljdHlwZXNfZGxlcnJvciA9IGRsZXJyb3I7Ci0JCWN0eXBlc19kbGNsb3NlID0gZGxjbG9zZTsKLQkJY3R5cGVzX2RsYWRkciA9IGRsYWRkcjsKLQl9IGVsc2UgeworICAgIGlmIChkbG9wZW4gIT0gTlVMTCkgeworICAgICAgICBjdHlwZXNfZGxzeW0gPSBkbHN5bTsKKyAgICAgICAgY3R5cGVzX2Rsb3BlbiA9IGRsb3BlbjsKKyAgICAgICAgY3R5cGVzX2RsZXJyb3IgPSBkbGVycm9yOworICAgICAgICBjdHlwZXNfZGxjbG9zZSA9IGRsY2xvc2U7CisgICAgICAgIGN0eXBlc19kbGFkZHIgPSBkbGFkZHI7CisgICAgfSBlbHNlIHsKICNpZiBNQUNfT1NfWF9WRVJTSU9OX01JTl9SRVFVSVJFRCA8IE1BQ19PU19YX1ZFUlNJT05fMTBfMwotCQljdHlwZXNfZGxzeW0gPSBkYXJ3aW5fZGxzeW07Ci0JCWN0eXBlc19kbG9wZW4gPSBkYXJ3aW5fZGxvcGVuOwotCQljdHlwZXNfZGxlcnJvciA9IGRhcndpbl9kbGVycm9yOwotCQljdHlwZXNfZGxjbG9zZSA9IGRhcndpbl9kbGNsb3NlOwotCQljdHlwZXNfZGxhZGRyID0gZGFyd2luX2RsYWRkcjsKKyAgICAgICAgY3R5cGVzX2Rsc3ltID0gZGFyd2luX2Rsc3ltOworICAgICAgICBjdHlwZXNfZGxvcGVuID0gZGFyd2luX2Rsb3BlbjsKKyAgICAgICAgY3R5cGVzX2RsZXJyb3IgPSBkYXJ3aW5fZGxlcnJvcjsKKyAgICAgICAgY3R5cGVzX2RsY2xvc2UgPSBkYXJ3aW5fZGxjbG9zZTsKKyAgICAgICAgY3R5cGVzX2RsYWRkciA9IGRhcndpbl9kbGFkZHI7CiAjZW5kaWYgLyogTUFDX09TX1hfVkVSU0lPTl9NSU5fUkVRVUlSRUQgPCBNQUNfT1NfWF9WRVJTSU9OXzEwXzMgKi8KLQl9CisgICAgfQogfQogCiAjZW5kaWYgLyogQ1RZUEVTX0RBUldJTl9ETEZDTiAqLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL21hbGxvY19jbG9zdXJlLmMgYi9Nb2R1bGVzL19jdHlwZXMvbWFsbG9jX2Nsb3N1cmUuYwppbmRleCAxMDU5MzVlLi5jNTBkNTNlIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbWFsbG9jX2Nsb3N1cmUuYworKysgYi9Nb2R1bGVzL19jdHlwZXMvbWFsbG9jX2Nsb3N1cmUuYwpAQCAtMjcsOCArMjcsOCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiB1bmlvbiBfdGFnSVRFTSB7Ci0JZmZpX2Nsb3N1cmUgY2xvc3VyZTsKLQl1bmlvbiBfdGFnSVRFTSAqbmV4dDsKKyAgICBmZmlfY2xvc3VyZSBjbG9zdXJlOworICAgIHVuaW9uIF90YWdJVEVNICpuZXh0OwogfSBJVEVNOwogCiBzdGF0aWMgSVRFTSAqZnJlZV9saXN0OwpAQCAtMzYsNTggKzM2LDU4IEBACiAKIHN0YXRpYyB2b2lkIG1vcmVfY29yZSh2b2lkKQogewotCUlURU0gKml0ZW07Ci0JaW50IGNvdW50LCBpOworICAgIElURU0gKml0ZW07CisgICAgaW50IGNvdW50LCBpOwogCiAvKiBkZXRlcm1pbmUgdGhlIHBhZ2VzaXplICovCiAjaWZkZWYgTVNfV0lOMzIKLQlpZiAoIV9wYWdlc2l6ZSkgewotCQlTWVNURU1fSU5GTyBzeXN0ZW1pbmZvOwotCQlHZXRTeXN0ZW1JbmZvKCZzeXN0ZW1pbmZvKTsKLQkJX3BhZ2VzaXplID0gc3lzdGVtaW5mby5kd1BhZ2VTaXplOwotCX0KKyAgICBpZiAoIV9wYWdlc2l6ZSkgeworICAgICAgICBTWVNURU1fSU5GTyBzeXN0ZW1pbmZvOworICAgICAgICBHZXRTeXN0ZW1JbmZvKCZzeXN0ZW1pbmZvKTsKKyAgICAgICAgX3BhZ2VzaXplID0gc3lzdGVtaW5mby5kd1BhZ2VTaXplOworICAgIH0KICNlbHNlCi0JaWYgKCFfcGFnZXNpemUpIHsKKyAgICBpZiAoIV9wYWdlc2l6ZSkgewogI2lmZGVmIF9TQ19QQUdFU0laRQotCQlfcGFnZXNpemUgPSBzeXNjb25mKF9TQ19QQUdFU0laRSk7CisgICAgICAgIF9wYWdlc2l6ZSA9IHN5c2NvbmYoX1NDX1BBR0VTSVpFKTsKICNlbHNlCi0JCV9wYWdlc2l6ZSA9IGdldHBhZ2VzaXplKCk7CisgICAgICAgIF9wYWdlc2l6ZSA9IGdldHBhZ2VzaXplKCk7CiAjZW5kaWYKLQl9CisgICAgfQogI2VuZGlmCiAKLQkvKiBjYWxjdWxhdGUgdGhlIG51bWJlciBvZiBub2RlcyB0byBhbGxvY2F0ZSAqLwotCWNvdW50ID0gQkxPQ0tTSVpFIC8gc2l6ZW9mKElURU0pOworICAgIC8qIGNhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIG5vZGVzIHRvIGFsbG9jYXRlICovCisgICAgY291bnQgPSBCTE9DS1NJWkUgLyBzaXplb2YoSVRFTSk7CiAKLQkvKiBhbGxvY2F0ZSBhIG1lbW9yeSBibG9jayAqLworICAgIC8qIGFsbG9jYXRlIGEgbWVtb3J5IGJsb2NrICovCiAjaWZkZWYgTVNfV0lOMzIKLQlpdGVtID0gKElURU0gKilWaXJ0dWFsQWxsb2MoTlVMTCwKLQkJCQkJICAgICAgIGNvdW50ICogc2l6ZW9mKElURU0pLAotCQkJCQkgICAgICAgTUVNX0NPTU1JVCwKLQkJCQkJICAgICAgIFBBR0VfRVhFQ1VURV9SRUFEV1JJVEUpOwotCWlmIChpdGVtID09IE5VTEwpCi0JCXJldHVybjsKKyAgICBpdGVtID0gKElURU0gKilWaXJ0dWFsQWxsb2MoTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCAqIHNpemVvZihJVEVNKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRU1fQ09NTUlULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBR0VfRVhFQ1VURV9SRUFEV1JJVEUpOworICAgIGlmIChpdGVtID09IE5VTEwpCisgICAgICAgIHJldHVybjsKICNlbHNlCi0JaXRlbSA9IChJVEVNICopbW1hcChOVUxMLAotCQkJICAgIGNvdW50ICogc2l6ZW9mKElURU0pLAotCQkJICAgIFBST1RfUkVBRCB8IFBST1RfV1JJVEUgfCBQUk9UX0VYRUMsCi0JCQkgICAgTUFQX1BSSVZBVEUgfCBNQVBfQU5PTllNT1VTLAotCQkJICAgIC0xLAotCQkJICAgIDApOwotCWlmIChpdGVtID09ICh2b2lkICopTUFQX0ZBSUxFRCkKLQkJcmV0dXJuOworICAgIGl0ZW0gPSAoSVRFTSAqKW1tYXAoTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ICogc2l6ZW9mKElURU0pLAorICAgICAgICAgICAgICAgICAgICAgICAgUFJPVF9SRUFEIHwgUFJPVF9XUklURSB8IFBST1RfRVhFQywKKyAgICAgICAgICAgICAgICAgICAgICAgIE1BUF9QUklWQVRFIHwgTUFQX0FOT05ZTU9VUywKKyAgICAgICAgICAgICAgICAgICAgICAgIC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgaWYgKGl0ZW0gPT0gKHZvaWQgKilNQVBfRkFJTEVEKQorICAgICAgICByZXR1cm47CiAjZW5kaWYKIAogI2lmZGVmIE1BTExPQ19DTE9TVVJFX0RFQlVHCi0JcHJpbnRmKCJibG9jayBhdCAlcCBhbGxvY2F0ZWQgKCVkIGJ5dGVzKSwgJWQgSVRFTXNcbiIsCi0JICAgICAgIGl0ZW0sIGNvdW50ICogc2l6ZW9mKElURU0pLCBjb3VudCk7CisgICAgcHJpbnRmKCJibG9jayBhdCAlcCBhbGxvY2F0ZWQgKCVkIGJ5dGVzKSwgJWQgSVRFTXNcbiIsCisgICAgICAgICAgIGl0ZW0sIGNvdW50ICogc2l6ZW9mKElURU0pLCBjb3VudCk7CiAjZW5kaWYKLQkvKiBwdXQgdGhlbSBpbnRvIHRoZSBmcmVlIGxpc3QgKi8KLQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewotCQlpdGVtLT5uZXh0ID0gZnJlZV9saXN0OwotCQlmcmVlX2xpc3QgPSBpdGVtOwotCQkrK2l0ZW07Ci0JfQorICAgIC8qIHB1dCB0aGVtIGludG8gdGhlIGZyZWUgbGlzdCAqLworICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CisgICAgICAgIGl0ZW0tPm5leHQgPSBmcmVlX2xpc3Q7CisgICAgICAgIGZyZWVfbGlzdCA9IGl0ZW07CisgICAgICAgICsraXRlbTsKKyAgICB9CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC05NSwyMCArOTUsMjAgQEAKIC8qIHB1dCB0aGUgaXRlbSBiYWNrIGludG8gdGhlIGZyZWUgbGlzdCAqLwogdm9pZCBGcmVlQ2xvc3VyZSh2b2lkICpwKQogewotCUlURU0gKml0ZW0gPSAoSVRFTSAqKXA7Ci0JaXRlbS0+bmV4dCA9IGZyZWVfbGlzdDsKLQlmcmVlX2xpc3QgPSBpdGVtOworICAgIElURU0gKml0ZW0gPSAoSVRFTSAqKXA7CisgICAgaXRlbS0+bmV4dCA9IGZyZWVfbGlzdDsKKyAgICBmcmVlX2xpc3QgPSBpdGVtOwogfQogCiAvKiByZXR1cm4gb25lIGl0ZW0gZnJvbSB0aGUgZnJlZSBsaXN0LCBhbGxvY2F0aW5nIG1vcmUgaWYgbmVlZGVkICovCiB2b2lkICpNYWxsb2NDbG9zdXJlKHZvaWQpCiB7Ci0JSVRFTSAqaXRlbTsKLQlpZiAoIWZyZWVfbGlzdCkKLQkJbW9yZV9jb3JlKCk7Ci0JaWYgKCFmcmVlX2xpc3QpCi0JCXJldHVybiBOVUxMOwotCWl0ZW0gPSBmcmVlX2xpc3Q7Ci0JZnJlZV9saXN0ID0gaXRlbS0+bmV4dDsKLQlyZXR1cm4gaXRlbTsKKyAgICBJVEVNICppdGVtOworICAgIGlmICghZnJlZV9saXN0KQorICAgICAgICBtb3JlX2NvcmUoKTsKKyAgICBpZiAoIWZyZWVfbGlzdCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaXRlbSA9IGZyZWVfbGlzdDsKKyAgICBmcmVlX2xpc3QgPSBpdGVtLT5uZXh0OworICAgIHJldHVybiBpdGVtOwogfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL3N0Z2RpY3QuYyBiL01vZHVsZXMvX2N0eXBlcy9zdGdkaWN0LmMKaW5kZXggZGFiZjlmMS4uOGFlMDliZiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL3N0Z2RpY3QuYworKysgYi9Nb2R1bGVzL19jdHlwZXMvc3RnZGljdC5jCkBAIC0yMywxNDUgKzIzLDE0NSBAQAogc3RhdGljIGludAogU3RnRGljdF9pbml0KFN0Z0RpY3RPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlpZiAoUHlEaWN0X1R5cGUudHBfaW5pdCgoUHlPYmplY3QgKilzZWxmLCBhcmdzLCBrd2RzKSA8IDApCi0JCXJldHVybiAtMTsKLQlzZWxmLT5mb3JtYXQgPSBOVUxMOwotCXNlbGYtPm5kaW0gPSAwOwotCXNlbGYtPnNoYXBlID0gTlVMTDsKLQlyZXR1cm4gMDsKKyAgICBpZiAoUHlEaWN0X1R5cGUudHBfaW5pdCgoUHlPYmplY3QgKilzZWxmLCBhcmdzLCBrd2RzKSA8IDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICBzZWxmLT5mb3JtYXQgPSBOVUxMOworICAgIHNlbGYtPm5kaW0gPSAwOworICAgIHNlbGYtPnNoYXBlID0gTlVMTDsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogU3RnRGljdF9jbGVhcihTdGdEaWN0T2JqZWN0ICpzZWxmKQogewotCVB5X0NMRUFSKHNlbGYtPnByb3RvKTsKLQlQeV9DTEVBUihzZWxmLT5hcmd0eXBlcyk7Ci0JUHlfQ0xFQVIoc2VsZi0+Y29udmVydGVycyk7Ci0JUHlfQ0xFQVIoc2VsZi0+cmVzdHlwZSk7Ci0JUHlfQ0xFQVIoc2VsZi0+Y2hlY2tlcik7Ci0JcmV0dXJuIDA7CisgICAgUHlfQ0xFQVIoc2VsZi0+cHJvdG8pOworICAgIFB5X0NMRUFSKHNlbGYtPmFyZ3R5cGVzKTsKKyAgICBQeV9DTEVBUihzZWxmLT5jb252ZXJ0ZXJzKTsKKyAgICBQeV9DTEVBUihzZWxmLT5yZXN0eXBlKTsKKyAgICBQeV9DTEVBUihzZWxmLT5jaGVja2VyKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQKIFN0Z0RpY3RfZGVhbGxvYyhTdGdEaWN0T2JqZWN0ICpzZWxmKQogewotCVN0Z0RpY3RfY2xlYXIoc2VsZik7Ci0JUHlNZW1fRnJlZShzZWxmLT5mb3JtYXQpOwotCVB5TWVtX0ZyZWUoc2VsZi0+c2hhcGUpOwotCVB5TWVtX0ZyZWUoc2VsZi0+ZmZpX3R5cGVfcG9pbnRlci5lbGVtZW50cyk7Ci0JUHlEaWN0X1R5cGUudHBfZGVhbGxvYygoUHlPYmplY3QgKilzZWxmKTsKKyAgICBTdGdEaWN0X2NsZWFyKHNlbGYpOworICAgIFB5TWVtX0ZyZWUoc2VsZi0+Zm9ybWF0KTsKKyAgICBQeU1lbV9GcmVlKHNlbGYtPnNoYXBlKTsKKyAgICBQeU1lbV9GcmVlKHNlbGYtPmZmaV90eXBlX3BvaW50ZXIuZWxlbWVudHMpOworICAgIFB5RGljdF9UeXBlLnRwX2RlYWxsb2MoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIGludAogU3RnRGljdF9jbG9uZShTdGdEaWN0T2JqZWN0ICpkc3QsIFN0Z0RpY3RPYmplY3QgKnNyYykKIHsKLQljaGFyICpkLCAqczsKLQlQeV9zc2l6ZV90IHNpemU7CisgICAgY2hhciAqZCwgKnM7CisgICAgUHlfc3NpemVfdCBzaXplOwogCi0JU3RnRGljdF9jbGVhcihkc3QpOwotCVB5TWVtX0ZyZWUoZHN0LT5mZmlfdHlwZV9wb2ludGVyLmVsZW1lbnRzKTsKLQlQeU1lbV9GcmVlKGRzdC0+Zm9ybWF0KTsKLQlkc3QtPmZvcm1hdCA9IE5VTEw7Ci0JUHlNZW1fRnJlZShkc3QtPnNoYXBlKTsKLQlkc3QtPnNoYXBlID0gTlVMTDsKLQlkc3QtPmZmaV90eXBlX3BvaW50ZXIuZWxlbWVudHMgPSBOVUxMOworICAgIFN0Z0RpY3RfY2xlYXIoZHN0KTsKKyAgICBQeU1lbV9GcmVlKGRzdC0+ZmZpX3R5cGVfcG9pbnRlci5lbGVtZW50cyk7CisgICAgUHlNZW1fRnJlZShkc3QtPmZvcm1hdCk7CisgICAgZHN0LT5mb3JtYXQgPSBOVUxMOworICAgIFB5TWVtX0ZyZWUoZHN0LT5zaGFwZSk7CisgICAgZHN0LT5zaGFwZSA9IE5VTEw7CisgICAgZHN0LT5mZmlfdHlwZV9wb2ludGVyLmVsZW1lbnRzID0gTlVMTDsKIAotCWQgPSAoY2hhciAqKWRzdDsKLQlzID0gKGNoYXIgKilzcmM7Ci0JbWVtY3B5KGQgKyBzaXplb2YoUHlEaWN0T2JqZWN0KSwKLQkgICAgICAgcyArIHNpemVvZihQeURpY3RPYmplY3QpLAotCSAgICAgICBzaXplb2YoU3RnRGljdE9iamVjdCkgLSBzaXplb2YoUHlEaWN0T2JqZWN0KSk7CisgICAgZCA9IChjaGFyICopZHN0OworICAgIHMgPSAoY2hhciAqKXNyYzsKKyAgICBtZW1jcHkoZCArIHNpemVvZihQeURpY3RPYmplY3QpLAorICAgICAgICAgICBzICsgc2l6ZW9mKFB5RGljdE9iamVjdCksCisgICAgICAgICAgIHNpemVvZihTdGdEaWN0T2JqZWN0KSAtIHNpemVvZihQeURpY3RPYmplY3QpKTsKIAotCVB5X1hJTkNSRUYoZHN0LT5wcm90byk7Ci0JUHlfWElOQ1JFRihkc3QtPmFyZ3R5cGVzKTsKLQlQeV9YSU5DUkVGKGRzdC0+Y29udmVydGVycyk7Ci0JUHlfWElOQ1JFRihkc3QtPnJlc3R5cGUpOwotCVB5X1hJTkNSRUYoZHN0LT5jaGVja2VyKTsKKyAgICBQeV9YSU5DUkVGKGRzdC0+cHJvdG8pOworICAgIFB5X1hJTkNSRUYoZHN0LT5hcmd0eXBlcyk7CisgICAgUHlfWElOQ1JFRihkc3QtPmNvbnZlcnRlcnMpOworICAgIFB5X1hJTkNSRUYoZHN0LT5yZXN0eXBlKTsKKyAgICBQeV9YSU5DUkVGKGRzdC0+Y2hlY2tlcik7CiAKLQlpZiAoc3JjLT5mb3JtYXQpIHsKLQkJZHN0LT5mb3JtYXQgPSBQeU1lbV9NYWxsb2Moc3RybGVuKHNyYy0+Zm9ybWF0KSArIDEpOwotCQlpZiAoZHN0LT5mb3JtYXQgPT0gTlVMTCkKLQkJCXJldHVybiAtMTsKLQkJc3RyY3B5KGRzdC0+Zm9ybWF0LCBzcmMtPmZvcm1hdCk7Ci0JfQotCWlmIChzcmMtPnNoYXBlKSB7Ci0JCWRzdC0+c2hhcGUgPSBQeU1lbV9NYWxsb2Moc2l6ZW9mKFB5X3NzaXplX3QpICogc3JjLT5uZGltKTsKLQkJaWYgKGRzdC0+c2hhcGUgPT0gTlVMTCkKLQkJCXJldHVybiAtMTsKLQkJbWVtY3B5KGRzdC0+c2hhcGUsIHNyYy0+c2hhcGUsCi0JCSAgICAgICBzaXplb2YoUHlfc3NpemVfdCkgKiBzcmMtPm5kaW0pOwotCX0KKyAgICBpZiAoc3JjLT5mb3JtYXQpIHsKKyAgICAgICAgZHN0LT5mb3JtYXQgPSBQeU1lbV9NYWxsb2Moc3RybGVuKHNyYy0+Zm9ybWF0KSArIDEpOworICAgICAgICBpZiAoZHN0LT5mb3JtYXQgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgc3RyY3B5KGRzdC0+Zm9ybWF0LCBzcmMtPmZvcm1hdCk7CisgICAgfQorICAgIGlmIChzcmMtPnNoYXBlKSB7CisgICAgICAgIGRzdC0+c2hhcGUgPSBQeU1lbV9NYWxsb2Moc2l6ZW9mKFB5X3NzaXplX3QpICogc3JjLT5uZGltKTsKKyAgICAgICAgaWYgKGRzdC0+c2hhcGUgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgbWVtY3B5KGRzdC0+c2hhcGUsIHNyYy0+c2hhcGUsCisgICAgICAgICAgICAgICBzaXplb2YoUHlfc3NpemVfdCkgKiBzcmMtPm5kaW0pOworICAgIH0KIAotCWlmIChzcmMtPmZmaV90eXBlX3BvaW50ZXIuZWxlbWVudHMgPT0gTlVMTCkKLQkJcmV0dXJuIDA7Ci0Jc2l6ZSA9IHNpemVvZihmZmlfdHlwZSAqKSAqIChzcmMtPmxlbmd0aCArIDEpOwotCWRzdC0+ZmZpX3R5cGVfcG9pbnRlci5lbGVtZW50cyA9IFB5TWVtX01hbGxvYyhzaXplKTsKLQlpZiAoZHN0LT5mZmlfdHlwZV9wb2ludGVyLmVsZW1lbnRzID09IE5VTEwpIHsKLQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJcmV0dXJuIC0xOwotCX0KLQltZW1jcHkoZHN0LT5mZmlfdHlwZV9wb2ludGVyLmVsZW1lbnRzLAotCSAgICAgICBzcmMtPmZmaV90eXBlX3BvaW50ZXIuZWxlbWVudHMsCi0JICAgICAgIHNpemUpOwotCXJldHVybiAwOworICAgIGlmIChzcmMtPmZmaV90eXBlX3BvaW50ZXIuZWxlbWVudHMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgc2l6ZSA9IHNpemVvZihmZmlfdHlwZSAqKSAqIChzcmMtPmxlbmd0aCArIDEpOworICAgIGRzdC0+ZmZpX3R5cGVfcG9pbnRlci5lbGVtZW50cyA9IFB5TWVtX01hbGxvYyhzaXplKTsKKyAgICBpZiAoZHN0LT5mZmlfdHlwZV9wb2ludGVyLmVsZW1lbnRzID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBtZW1jcHkoZHN0LT5mZmlfdHlwZV9wb2ludGVyLmVsZW1lbnRzLAorICAgICAgICAgICBzcmMtPmZmaV90eXBlX3BvaW50ZXIuZWxlbWVudHMsCisgICAgICAgICAgIHNpemUpOworICAgIHJldHVybiAwOwogfQogCiBQeVR5cGVPYmplY3QgU3RnRGljdF9UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotCSJTdGdEaWN0IiwKLQlzaXplb2YoU3RnRGljdE9iamVjdCksCi0JMCwKLQkoZGVzdHJ1Y3RvcilTdGdEaWN0X2RlYWxsb2MsCQkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9jb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJCS8qIHRwX3N0ciAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCTAsCQkJCQkvKiB0cF9kb2MgKi8KLQkwLAkJCQkJLyogdHBfdHJhdmVyc2UgKi8KLQkwLAkJCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaXRlciAqLwotCTAsCQkJCQkvKiB0cF9pdGVybmV4dCAqLwotCTAsCQkJCQkvKiB0cF9tZXRob2RzICovCi0JMCwJCQkJCS8qIHRwX21lbWJlcnMgKi8KLQkwLAkJCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQkoaW5pdHByb2MpU3RnRGljdF9pbml0LAkJCS8qIHRwX2luaXQgKi8KLQkwLAkJCQkJLyogdHBfYWxsb2MgKi8KLQkwLAkJCQkJLyogdHBfbmV3ICovCi0JMCwJCQkJCS8qIHRwX2ZyZWUgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAiU3RnRGljdCIsCisgICAgc2l6ZW9mKFN0Z0RpY3RPYmplY3QpLAorICAgIDAsCisgICAgKGRlc3RydWN0b3IpU3RnRGljdF9kZWFsbG9jLCAgICAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIChpbml0cHJvYylTdGdEaWN0X2luaXQsICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKIAogLyogTWF5IHJldHVybiBOVUxMLCBidXQgZG9lcyBub3Qgc2V0IGFuIGV4Y2VwdGlvbiEgKi8KIFN0Z0RpY3RPYmplY3QgKgogUHlUeXBlX3N0Z2RpY3QoUHlPYmplY3QgKm9iaikKIHsKLQlQeVR5cGVPYmplY3QgKnR5cGU7CisgICAgUHlUeXBlT2JqZWN0ICp0eXBlOwogCi0JaWYgKCFQeVR5cGVfQ2hlY2sob2JqKSkKLQkJcmV0dXJuIE5VTEw7Ci0JdHlwZSA9IChQeVR5cGVPYmplY3QgKilvYmo7Ci0JaWYgKCFQeVR5cGVfSGFzRmVhdHVyZSh0eXBlLCBQeV9UUEZMQUdTX0hBVkVfQ0xBU1MpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIXR5cGUtPnRwX2RpY3QgfHwgIVN0Z0RpY3RfQ2hlY2tFeGFjdCh0eXBlLT50cF9kaWN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIChTdGdEaWN0T2JqZWN0ICopdHlwZS0+dHBfZGljdDsKKyAgICBpZiAoIVB5VHlwZV9DaGVjayhvYmopKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB0eXBlID0gKFB5VHlwZU9iamVjdCAqKW9iajsKKyAgICBpZiAoIVB5VHlwZV9IYXNGZWF0dXJlKHR5cGUsIFB5X1RQRkxBR1NfSEFWRV9DTEFTUykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghdHlwZS0+dHBfZGljdCB8fCAhU3RnRGljdF9DaGVja0V4YWN0KHR5cGUtPnRwX2RpY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gKFN0Z0RpY3RPYmplY3QgKil0eXBlLT50cF9kaWN0OwogfQogCiAvKiBNYXkgcmV0dXJuIE5VTEwsIGJ1dCBkb2VzIG5vdCBzZXQgYW4gZXhjZXB0aW9uISAqLwpAQCAtMTcyLDEyICsxNzIsMTIgQEAKIFN0Z0RpY3RPYmplY3QgKgogUHlPYmplY3Rfc3RnZGljdChQeU9iamVjdCAqc2VsZikKIHsKLQlQeVR5cGVPYmplY3QgKnR5cGUgPSBzZWxmLT5vYl90eXBlOwotCWlmICghUHlUeXBlX0hhc0ZlYXR1cmUodHlwZSwgUHlfVFBGTEFHU19IQVZFX0NMQVNTKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCF0eXBlLT50cF9kaWN0IHx8ICFTdGdEaWN0X0NoZWNrRXhhY3QodHlwZS0+dHBfZGljdCkpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiAoU3RnRGljdE9iamVjdCAqKXR5cGUtPnRwX2RpY3Q7CisgICAgUHlUeXBlT2JqZWN0ICp0eXBlID0gc2VsZi0+b2JfdHlwZTsKKyAgICBpZiAoIVB5VHlwZV9IYXNGZWF0dXJlKHR5cGUsIFB5X1RQRkxBR1NfSEFWRV9DTEFTUykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghdHlwZS0+dHBfZGljdCB8fCAhU3RnRGljdF9DaGVja0V4YWN0KHR5cGUtPnRwX2RpY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gKFN0Z0RpY3RPYmplY3QgKil0eXBlLT50cF9kaWN0OwogfQogCiAvKiBkZXNjciBpcyB0aGUgZGVzY3JpcHRvciBmb3IgYSBmaWVsZCBtYXJrZWQgYXMgYW5vbnltb3VzLiAgR2V0IGFsbCB0aGUKQEAgLTE4Niw3OCArMTg2LDc4IEBACiAgKi8KIHN0YXRpYyBpbnQKIE1ha2VGaWVsZHMoUHlPYmplY3QgKnR5cGUsIENGaWVsZE9iamVjdCAqZGVzY3IsCi0JICAgUHlfc3NpemVfdCBpbmRleCwgUHlfc3NpemVfdCBvZmZzZXQpCisgICAgICAgICAgIFB5X3NzaXplX3QgaW5kZXgsIFB5X3NzaXplX3Qgb2Zmc2V0KQogewotCVB5X3NzaXplX3QgaTsKLQlQeU9iamVjdCAqZmllbGRzOwotCVB5T2JqZWN0ICpmaWVsZGxpc3Q7CisgICAgUHlfc3NpemVfdCBpOworICAgIFB5T2JqZWN0ICpmaWVsZHM7CisgICAgUHlPYmplY3QgKmZpZWxkbGlzdDsKIAotCWZpZWxkcyA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoZGVzY3ItPnByb3RvLCAiX2ZpZWxkc18iKTsKLQlpZiAoZmllbGRzID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQlmaWVsZGxpc3QgPSBQeVNlcXVlbmNlX0Zhc3QoZmllbGRzLCAiX2ZpZWxkc18gbXVzdCBiZSBhIHNlcXVlbmNlIik7Ci0JUHlfREVDUkVGKGZpZWxkcyk7Ci0JaWYgKGZpZWxkbGlzdCA9PSBOVUxMKQotCQlyZXR1cm4gLTE7CisgICAgZmllbGRzID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhkZXNjci0+cHJvdG8sICJfZmllbGRzXyIpOworICAgIGlmIChmaWVsZHMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGZpZWxkbGlzdCA9IFB5U2VxdWVuY2VfRmFzdChmaWVsZHMsICJfZmllbGRzXyBtdXN0IGJlIGEgc2VxdWVuY2UiKTsKKyAgICBQeV9ERUNSRUYoZmllbGRzKTsKKyAgICBpZiAoZmllbGRsaXN0ID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKIAotCWZvciAoaSA9IDA7IGkgPCBQeVNlcXVlbmNlX0Zhc3RfR0VUX1NJWkUoZmllbGRsaXN0KTsgKytpKSB7Ci0JCVB5T2JqZWN0ICpwYWlyID0gUHlTZXF1ZW5jZV9GYXN0X0dFVF9JVEVNKGZpZWxkbGlzdCwgaSk7IC8qIGJvcnJvd2VkICovCi0JCVB5T2JqZWN0ICpmbmFtZSwgKmZ0eXBlLCAqYml0czsKLQkJQ0ZpZWxkT2JqZWN0ICpmZGVzY3I7Ci0JCUNGaWVsZE9iamVjdCAqbmV3X2Rlc2NyOwotCQkvKiBDb252ZXJ0IHRvIFB5QXJnX1VucGFja1R1cGxlLi4uICovCi0JCWlmICghUHlBcmdfUGFyc2VUdXBsZShwYWlyLCAiT098TyIsICZmbmFtZSwgJmZ0eXBlLCAmYml0cykpIHsKLQkJCVB5X0RFQ1JFRihmaWVsZGxpc3QpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWZkZXNjciA9IChDRmllbGRPYmplY3QgKilQeU9iamVjdF9HZXRBdHRyKGRlc2NyLT5wcm90bywgZm5hbWUpOwotCQlpZiAoZmRlc2NyID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRihmaWVsZGxpc3QpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWlmIChQeV9UWVBFKGZkZXNjcikgIT0gJkNGaWVsZF9UeXBlKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAidW5leHBlY3RlZCB0eXBlIik7Ci0JCQlQeV9ERUNSRUYoZmRlc2NyKTsKLQkJCVB5X0RFQ1JFRihmaWVsZGxpc3QpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWlmIChmZGVzY3ItPmFub255bW91cykgewotCQkJaW50IHJjID0gTWFrZUZpZWxkcyh0eXBlLCBmZGVzY3IsCi0JCQkJCSAgICBpbmRleCArIGZkZXNjci0+aW5kZXgsCi0JCQkJCSAgICBvZmZzZXQgKyBmZGVzY3ItPm9mZnNldCk7Ci0JCQlQeV9ERUNSRUYoZmRlc2NyKTsKLQkJCWlmIChyYyA9PSAtMSkgewotCQkJCVB5X0RFQ1JFRihmaWVsZGxpc3QpOwotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJCWNvbnRpbnVlOwotCQl9Ci0gCQluZXdfZGVzY3IgPSAoQ0ZpZWxkT2JqZWN0ICopUHlPYmplY3RfQ2FsbE9iamVjdCgoUHlPYmplY3QgKikmQ0ZpZWxkX1R5cGUsIE5VTEwpOwotCQlpZiAobmV3X2Rlc2NyID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRihmZGVzY3IpOwotCQkJUHlfREVDUkVGKGZpZWxkbGlzdCk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJYXNzZXJ0KFB5X1RZUEUobmV3X2Rlc2NyKSA9PSAmQ0ZpZWxkX1R5cGUpOwotIAkJbmV3X2Rlc2NyLT5zaXplID0gZmRlc2NyLT5zaXplOwotIAkJbmV3X2Rlc2NyLT5vZmZzZXQgPSBmZGVzY3ItPm9mZnNldCArIG9mZnNldDsKLSAJCW5ld19kZXNjci0+aW5kZXggPSBmZGVzY3ItPmluZGV4ICsgaW5kZXg7Ci0gCQluZXdfZGVzY3ItPnByb3RvID0gZmRlc2NyLT5wcm90bzsKLSAJCVB5X1hJTkNSRUYobmV3X2Rlc2NyLT5wcm90byk7Ci0gCQluZXdfZGVzY3ItPmdldGZ1bmMgPSBmZGVzY3ItPmdldGZ1bmM7Ci0gCQluZXdfZGVzY3ItPnNldGZ1bmMgPSBmZGVzY3ItPnNldGZ1bmM7CisgICAgZm9yIChpID0gMDsgaSA8IFB5U2VxdWVuY2VfRmFzdF9HRVRfU0laRShmaWVsZGxpc3QpOyArK2kpIHsKKyAgICAgICAgUHlPYmplY3QgKnBhaXIgPSBQeVNlcXVlbmNlX0Zhc3RfR0VUX0lURU0oZmllbGRsaXN0LCBpKTsgLyogYm9ycm93ZWQgKi8KKyAgICAgICAgUHlPYmplY3QgKmZuYW1lLCAqZnR5cGUsICpiaXRzOworICAgICAgICBDRmllbGRPYmplY3QgKmZkZXNjcjsKKyAgICAgICAgQ0ZpZWxkT2JqZWN0ICpuZXdfZGVzY3I7CisgICAgICAgIC8qIENvbnZlcnQgdG8gUHlBcmdfVW5wYWNrVHVwbGUuLi4gKi8KKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKHBhaXIsICJPT3xPIiwgJmZuYW1lLCAmZnR5cGUsICZiaXRzKSkgeworICAgICAgICAgICAgUHlfREVDUkVGKGZpZWxkbGlzdCk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgZmRlc2NyID0gKENGaWVsZE9iamVjdCAqKVB5T2JqZWN0X0dldEF0dHIoZGVzY3ItPnByb3RvLCBmbmFtZSk7CisgICAgICAgIGlmIChmZGVzY3IgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKGZpZWxkbGlzdCk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKFB5X1RZUEUoZmRlc2NyKSAhPSAmQ0ZpZWxkX1R5cGUpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJ1bmV4cGVjdGVkIHR5cGUiKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihmZGVzY3IpOworICAgICAgICAgICAgUHlfREVDUkVGKGZpZWxkbGlzdCk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZkZXNjci0+YW5vbnltb3VzKSB7CisgICAgICAgICAgICBpbnQgcmMgPSBNYWtlRmllbGRzKHR5cGUsIGZkZXNjciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggKyBmZGVzY3ItPmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKyBmZGVzY3ItPm9mZnNldCk7CisgICAgICAgICAgICBQeV9ERUNSRUYoZmRlc2NyKTsKKyAgICAgICAgICAgIGlmIChyYyA9PSAtMSkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihmaWVsZGxpc3QpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIG5ld19kZXNjciA9IChDRmllbGRPYmplY3QgKilQeU9iamVjdF9DYWxsT2JqZWN0KChQeU9iamVjdCAqKSZDRmllbGRfVHlwZSwgTlVMTCk7CisgICAgICAgIGlmIChuZXdfZGVzY3IgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKGZkZXNjcik7CisgICAgICAgICAgICBQeV9ERUNSRUYoZmllbGRsaXN0KTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnQoUHlfVFlQRShuZXdfZGVzY3IpID09ICZDRmllbGRfVHlwZSk7CisgICAgICAgIG5ld19kZXNjci0+c2l6ZSA9IGZkZXNjci0+c2l6ZTsKKyAgICAgICAgbmV3X2Rlc2NyLT5vZmZzZXQgPSBmZGVzY3ItPm9mZnNldCArIG9mZnNldDsKKyAgICAgICAgbmV3X2Rlc2NyLT5pbmRleCA9IGZkZXNjci0+aW5kZXggKyBpbmRleDsKKyAgICAgICAgbmV3X2Rlc2NyLT5wcm90byA9IGZkZXNjci0+cHJvdG87CisgICAgICAgIFB5X1hJTkNSRUYobmV3X2Rlc2NyLT5wcm90byk7CisgICAgICAgIG5ld19kZXNjci0+Z2V0ZnVuYyA9IGZkZXNjci0+Z2V0ZnVuYzsKKyAgICAgICAgbmV3X2Rlc2NyLT5zZXRmdW5jID0gZmRlc2NyLT5zZXRmdW5jOwogCi0gIAkJUHlfREVDUkVGKGZkZXNjcik7Ci0JCQotCQlpZiAoLTEgPT0gUHlPYmplY3RfU2V0QXR0cih0eXBlLCBmbmFtZSwgKFB5T2JqZWN0ICopbmV3X2Rlc2NyKSkgewotCQkJUHlfREVDUkVGKGZpZWxkbGlzdCk7Ci0JCQlQeV9ERUNSRUYobmV3X2Rlc2NyKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlQeV9ERUNSRUYobmV3X2Rlc2NyKTsKLQl9Ci0JUHlfREVDUkVGKGZpZWxkbGlzdCk7Ci0JcmV0dXJuIDA7CisgICAgICAgIFB5X0RFQ1JFRihmZGVzY3IpOworCisgICAgICAgIGlmICgtMSA9PSBQeU9iamVjdF9TZXRBdHRyKHR5cGUsIGZuYW1lLCAoUHlPYmplY3QgKiluZXdfZGVzY3IpKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoZmllbGRsaXN0KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihuZXdfZGVzY3IpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIFB5X0RFQ1JFRihuZXdfZGVzY3IpOworICAgIH0KKyAgICBQeV9ERUNSRUYoZmllbGRsaXN0KTsKKyAgICByZXR1cm4gMDsKIH0KIAogLyogSXRlcmF0ZSBvdmVyIHRoZSBuYW1lcyBpbiB0aGUgdHlwZSdzIF9hbm9ueW1vdXNfIGF0dHJpYnV0ZSwgaWYgcHJlc2VudCwKQEAgLTI2NSw0MyArMjY1LDQzIEBACiBzdGF0aWMgaW50CiBNYWtlQW5vbkZpZWxkcyhQeU9iamVjdCAqdHlwZSkKIHsKLQlQeU9iamVjdCAqYW5vbjsKLQlQeU9iamVjdCAqYW5vbl9uYW1lczsKLQlQeV9zc2l6ZV90IGk7CisgICAgUHlPYmplY3QgKmFub247CisgICAgUHlPYmplY3QgKmFub25fbmFtZXM7CisgICAgUHlfc3NpemVfdCBpOwogCi0JYW5vbiA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcodHlwZSwgIl9hbm9ueW1vdXNfIik7Ci0JaWYgKGFub24gPT0gTlVMTCkgewotCQlQeUVycl9DbGVhcigpOwotCQlyZXR1cm4gMDsKLQl9Ci0JYW5vbl9uYW1lcyA9IFB5U2VxdWVuY2VfRmFzdChhbm9uLCAiX2Fub255bW91c18gbXVzdCBiZSBhIHNlcXVlbmNlIik7Ci0JUHlfREVDUkVGKGFub24pOwotCWlmIChhbm9uX25hbWVzID09IE5VTEwpCi0JCXJldHVybiAtMTsKKyAgICBhbm9uID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyh0eXBlLCAiX2Fub255bW91c18iKTsKKyAgICBpZiAoYW5vbiA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBhbm9uX25hbWVzID0gUHlTZXF1ZW5jZV9GYXN0KGFub24sICJfYW5vbnltb3VzXyBtdXN0IGJlIGEgc2VxdWVuY2UiKTsKKyAgICBQeV9ERUNSRUYoYW5vbik7CisgICAgaWYgKGFub25fbmFtZXMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0JZm9yIChpID0gMDsgaSA8IFB5U2VxdWVuY2VfRmFzdF9HRVRfU0laRShhbm9uX25hbWVzKTsgKytpKSB7Ci0JCVB5T2JqZWN0ICpmbmFtZSA9IFB5U2VxdWVuY2VfRmFzdF9HRVRfSVRFTShhbm9uX25hbWVzLCBpKTsgLyogYm9ycm93ZWQgKi8KLQkJQ0ZpZWxkT2JqZWN0ICpkZXNjciA9IChDRmllbGRPYmplY3QgKilQeU9iamVjdF9HZXRBdHRyKHR5cGUsIGZuYW1lKTsKLQkJaWYgKGRlc2NyID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRihhbm9uX25hbWVzKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlhc3NlcnQoUHlfVFlQRShkZXNjcikgPT0gJkNGaWVsZF9UeXBlKTsKLQkJZGVzY3ItPmFub255bW91cyA9IDE7CisgICAgZm9yIChpID0gMDsgaSA8IFB5U2VxdWVuY2VfRmFzdF9HRVRfU0laRShhbm9uX25hbWVzKTsgKytpKSB7CisgICAgICAgIFB5T2JqZWN0ICpmbmFtZSA9IFB5U2VxdWVuY2VfRmFzdF9HRVRfSVRFTShhbm9uX25hbWVzLCBpKTsgLyogYm9ycm93ZWQgKi8KKyAgICAgICAgQ0ZpZWxkT2JqZWN0ICpkZXNjciA9IChDRmllbGRPYmplY3QgKilQeU9iamVjdF9HZXRBdHRyKHR5cGUsIGZuYW1lKTsKKyAgICAgICAgaWYgKGRlc2NyID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihhbm9uX25hbWVzKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnQoUHlfVFlQRShkZXNjcikgPT0gJkNGaWVsZF9UeXBlKTsKKyAgICAgICAgZGVzY3ItPmFub255bW91cyA9IDE7CiAKLQkJLyogZGVzY3IgaXMgaW4gdGhlIGZpZWxkIGRlc2NyaXB0b3IuICovCi0JCWlmICgtMSA9PSBNYWtlRmllbGRzKHR5cGUsIChDRmllbGRPYmplY3QgKilkZXNjciwKLQkJCQkgICAgICgoQ0ZpZWxkT2JqZWN0ICopZGVzY3IpLT5pbmRleCwKLQkJCQkgICAgICgoQ0ZpZWxkT2JqZWN0ICopZGVzY3IpLT5vZmZzZXQpKSB7Ci0JCQlQeV9ERUNSRUYoZGVzY3IpOwotCQkJUHlfREVDUkVGKGFub25fbmFtZXMpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCVB5X0RFQ1JFRihkZXNjcik7Ci0JfQorICAgICAgICAvKiBkZXNjciBpcyBpbiB0aGUgZmllbGQgZGVzY3JpcHRvci4gKi8KKyAgICAgICAgaWYgKC0xID09IE1ha2VGaWVsZHModHlwZSwgKENGaWVsZE9iamVjdCAqKWRlc2NyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENGaWVsZE9iamVjdCAqKWRlc2NyKS0+aW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ0ZpZWxkT2JqZWN0ICopZGVzY3IpLT5vZmZzZXQpKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoZGVzY3IpOworICAgICAgICAgICAgUHlfREVDUkVGKGFub25fbmFtZXMpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIFB5X0RFQ1JFRihkZXNjcik7CisgICAgfQogCi0JUHlfREVDUkVGKGFub25fbmFtZXMpOwotCXJldHVybiAwOworICAgIFB5X0RFQ1JFRihhbm9uX25hbWVzKTsKKyAgICByZXR1cm4gMDsKIH0KIAogLyoKQEAgLTMxMSwyNjUgKzMxMSwyNjUgQEAKIGludAogU3RydWN0VW5pb25UeXBlX3VwZGF0ZV9zdGdkaWN0KFB5T2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqZmllbGRzLCBpbnQgaXNTdHJ1Y3QpCiB7Ci0JU3RnRGljdE9iamVjdCAqc3RnZGljdCwgKmJhc2VkaWN0OwotCVB5X3NzaXplX3QgbGVuLCBvZmZzZXQsIHNpemUsIGFsaWduLCBpOwotCVB5X3NzaXplX3QgdW5pb25fc2l6ZSwgdG90YWxfYWxpZ247Ci0JUHlfc3NpemVfdCBmaWVsZF9zaXplID0gMDsKLQlpbnQgYml0b2ZzOwotCVB5T2JqZWN0ICppc1BhY2tlZDsKLQlpbnQgcGFjayA9IDA7Ci0JUHlfc3NpemVfdCBmZmlfb2ZzOwotCWludCBiaWdfZW5kaWFuOworICAgIFN0Z0RpY3RPYmplY3QgKnN0Z2RpY3QsICpiYXNlZGljdDsKKyAgICBQeV9zc2l6ZV90IGxlbiwgb2Zmc2V0LCBzaXplLCBhbGlnbiwgaTsKKyAgICBQeV9zc2l6ZV90IHVuaW9uX3NpemUsIHRvdGFsX2FsaWduOworICAgIFB5X3NzaXplX3QgZmllbGRfc2l6ZSA9IDA7CisgICAgaW50IGJpdG9mczsKKyAgICBQeU9iamVjdCAqaXNQYWNrZWQ7CisgICAgaW50IHBhY2sgPSAwOworICAgIFB5X3NzaXplX3QgZmZpX29mczsKKyAgICBpbnQgYmlnX2VuZGlhbjsKIAotCS8qIEhBQ0sgQWxlcnQ6IEkgY2Fubm90IGJlIGJvdGhlcmVkIHRvIGZpeCBjdHlwZXMuY29tLCBzbyB0aGVyZSBoYXMgdG8KLQkgICBiZSBhIHdheSB0byB1c2UgdGhlIG9sZCwgYnJva2VuIHNlbWF0aWNzOiBfZmllbGRzXyBhcmUgbm90IGV4dGVuZGVkCi0JICAgYnV0IHJlcGxhY2VkIGluIHN1YmNsYXNzZXMuCi0JICAgCi0JICAgWFhYIFJlbW92ZSB0aGlzIGluIGN0eXBlcyAxLjAhCi0JKi8KLQlpbnQgdXNlX2Jyb2tlbl9vbGRfY3R5cGVzX3NlbWFudGljczsKKyAgICAvKiBIQUNLIEFsZXJ0OiBJIGNhbm5vdCBiZSBib3RoZXJlZCB0byBmaXggY3R5cGVzLmNvbSwgc28gdGhlcmUgaGFzIHRvCisgICAgICAgYmUgYSB3YXkgdG8gdXNlIHRoZSBvbGQsIGJyb2tlbiBzZW1hdGljczogX2ZpZWxkc18gYXJlIG5vdCBleHRlbmRlZAorICAgICAgIGJ1dCByZXBsYWNlZCBpbiBzdWJjbGFzc2VzLgogCi0JaWYgKGZpZWxkcyA9PSBOVUxMKQotCQlyZXR1cm4gMDsKKyAgICAgICBYWFggUmVtb3ZlIHRoaXMgaW4gY3R5cGVzIDEuMCEKKyAgICAqLworICAgIGludCB1c2VfYnJva2VuX29sZF9jdHlwZXNfc2VtYW50aWNzOworCisgICAgaWYgKGZpZWxkcyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gMDsKIAogI2lmZGVmIFdPUkRTX0JJR0VORElBTgotCWJpZ19lbmRpYW4gPSBQeU9iamVjdF9IYXNBdHRyU3RyaW5nKHR5cGUsICJfc3dhcHBlZGJ5dGVzXyIpID8gMCA6IDE7CisgICAgYmlnX2VuZGlhbiA9IFB5T2JqZWN0X0hhc0F0dHJTdHJpbmcodHlwZSwgIl9zd2FwcGVkYnl0ZXNfIikgPyAwIDogMTsKICNlbHNlCi0JYmlnX2VuZGlhbiA9IFB5T2JqZWN0X0hhc0F0dHJTdHJpbmcodHlwZSwgIl9zd2FwcGVkYnl0ZXNfIikgPyAxIDogMDsKKyAgICBiaWdfZW5kaWFuID0gUHlPYmplY3RfSGFzQXR0clN0cmluZyh0eXBlLCAiX3N3YXBwZWRieXRlc18iKSA/IDEgOiAwOwogI2VuZGlmCiAKLQl1c2VfYnJva2VuX29sZF9jdHlwZXNfc2VtYW50aWNzID0gXAotCQlQeU9iamVjdF9IYXNBdHRyU3RyaW5nKHR5cGUsICJfdXNlX2Jyb2tlbl9vbGRfY3R5cGVzX3N0cnVjdHVyZV9zZW1hbnRpY3NfIik7CisgICAgdXNlX2Jyb2tlbl9vbGRfY3R5cGVzX3NlbWFudGljcyA9IFwKKyAgICAgICAgUHlPYmplY3RfSGFzQXR0clN0cmluZyh0eXBlLCAiX3VzZV9icm9rZW5fb2xkX2N0eXBlc19zdHJ1Y3R1cmVfc2VtYW50aWNzXyIpOwogCi0JaXNQYWNrZWQgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHR5cGUsICJfcGFja18iKTsKLQlpZiAoaXNQYWNrZWQpIHsKLQkJcGFjayA9IFB5SW50X0FzTG9uZyhpc1BhY2tlZCk7Ci0JCWlmIChwYWNrIDwgMCB8fCBQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCQlQeV9YREVDUkVGKGlzUGFja2VkKTsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCQkiX3BhY2tfIG11c3QgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlciIpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCVB5X0RFQ1JFRihpc1BhY2tlZCk7Ci0JfSBlbHNlCi0JCVB5RXJyX0NsZWFyKCk7CisgICAgaXNQYWNrZWQgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHR5cGUsICJfcGFja18iKTsKKyAgICBpZiAoaXNQYWNrZWQpIHsKKyAgICAgICAgcGFjayA9IFB5SW50X0FzTG9uZyhpc1BhY2tlZCk7CisgICAgICAgIGlmIChwYWNrIDwgMCB8fCBQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgICAgICBQeV9YREVDUkVGKGlzUGFja2VkKTsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfcGFja18gbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgUHlfREVDUkVGKGlzUGFja2VkKTsKKyAgICB9IGVsc2UKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKIAotCWxlbiA9IFB5U2VxdWVuY2VfTGVuZ3RoKGZpZWxkcyk7Ci0JaWYgKGxlbiA9PSAtMSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSInX2ZpZWxkc18nIG11c3QgYmUgYSBzZXF1ZW5jZSBvZiBwYWlycyIpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIGxlbiA9IFB5U2VxdWVuY2VfTGVuZ3RoKGZpZWxkcyk7CisgICAgaWYgKGxlbiA9PSAtMSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIidfZmllbGRzXycgbXVzdCBiZSBhIHNlcXVlbmNlIG9mIHBhaXJzIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQlzdGdkaWN0ID0gUHlUeXBlX3N0Z2RpY3QodHlwZSk7Ci0JaWYgKCFzdGdkaWN0KQotCQlyZXR1cm4gLTE7Ci0JLyogSWYgdGhpcyBzdHJ1Y3R1cmUvdW5pb24gaXMgYWxyZWFkeSBtYXJrZWQgZmluYWwgd2UgY2Fubm90IGFzc2lnbgotCSAgIF9maWVsZHNfIGFueW1vcmUuICovCisgICAgc3RnZGljdCA9IFB5VHlwZV9zdGdkaWN0KHR5cGUpOworICAgIGlmICghc3RnZGljdCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIC8qIElmIHRoaXMgc3RydWN0dXJlL3VuaW9uIGlzIGFscmVhZHkgbWFya2VkIGZpbmFsIHdlIGNhbm5vdCBhc3NpZ24KKyAgICAgICBfZmllbGRzXyBhbnltb3JlLiAqLwogCi0JaWYgKHN0Z2RpY3QtPmZsYWdzICYgRElDVEZMQUdfRklOQUwpIHsvKiBpcyBmaW5hbCA/ICovCi0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19BdHRyaWJ1dGVFcnJvciwKLQkJCQkiX2ZpZWxkc18gaXMgZmluYWwiKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICBpZiAoc3RnZGljdC0+ZmxhZ3MgJiBESUNURkxBR19GSU5BTCkgey8qIGlzIGZpbmFsID8gKi8KKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0F0dHJpYnV0ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIl9maWVsZHNfIGlzIGZpbmFsIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQlpZiAoc3RnZGljdC0+Zm9ybWF0KSB7Ci0JCVB5TWVtX0ZyZWUoc3RnZGljdC0+Zm9ybWF0KTsKLQkJc3RnZGljdC0+Zm9ybWF0ID0gTlVMTDsKLQl9CisgICAgaWYgKHN0Z2RpY3QtPmZvcm1hdCkgeworICAgICAgICBQeU1lbV9GcmVlKHN0Z2RpY3QtPmZvcm1hdCk7CisgICAgICAgIHN0Z2RpY3QtPmZvcm1hdCA9IE5VTEw7CisgICAgfQogCi0JaWYgKHN0Z2RpY3QtPmZmaV90eXBlX3BvaW50ZXIuZWxlbWVudHMpCi0JCVB5TWVtX0ZyZWUoc3RnZGljdC0+ZmZpX3R5cGVfcG9pbnRlci5lbGVtZW50cyk7CisgICAgaWYgKHN0Z2RpY3QtPmZmaV90eXBlX3BvaW50ZXIuZWxlbWVudHMpCisgICAgICAgIFB5TWVtX0ZyZWUoc3RnZGljdC0+ZmZpX3R5cGVfcG9pbnRlci5lbGVtZW50cyk7CiAKLQliYXNlZGljdCA9IFB5VHlwZV9zdGdkaWN0KChQeU9iamVjdCAqKSgoUHlUeXBlT2JqZWN0ICopdHlwZSktPnRwX2Jhc2UpOwotCWlmIChiYXNlZGljdCAmJiAhdXNlX2Jyb2tlbl9vbGRfY3R5cGVzX3NlbWFudGljcykgewotCQlzaXplID0gb2Zmc2V0ID0gYmFzZWRpY3QtPnNpemU7Ci0JCWFsaWduID0gYmFzZWRpY3QtPmFsaWduOwotCQl1bmlvbl9zaXplID0gMDsKLQkJdG90YWxfYWxpZ24gPSBhbGlnbiA/IGFsaWduIDogMTsKLQkJc3RnZGljdC0+ZmZpX3R5cGVfcG9pbnRlci50eXBlID0gRkZJX1RZUEVfU1RSVUNUOwotCQlzdGdkaWN0LT5mZmlfdHlwZV9wb2ludGVyLmVsZW1lbnRzID0gUHlNZW1fTWFsbG9jKHNpemVvZihmZmlfdHlwZSAqKSAqIChiYXNlZGljdC0+bGVuZ3RoICsgbGVuICsgMSkpOwotCQlpZiAoc3RnZGljdC0+ZmZpX3R5cGVfcG9pbnRlci5lbGVtZW50cyA9PSBOVUxMKSB7Ci0JCQlQeUVycl9Ob01lbW9yeSgpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCW1lbXNldChzdGdkaWN0LT5mZmlfdHlwZV9wb2ludGVyLmVsZW1lbnRzLCAwLAotCQkgICAgICAgc2l6ZW9mKGZmaV90eXBlICopICogKGJhc2VkaWN0LT5sZW5ndGggKyBsZW4gKyAxKSk7Ci0JCW1lbWNweShzdGdkaWN0LT5mZmlfdHlwZV9wb2ludGVyLmVsZW1lbnRzLAotCQkgICAgICAgYmFzZWRpY3QtPmZmaV90eXBlX3BvaW50ZXIuZWxlbWVudHMsCi0JCSAgICAgICBzaXplb2YoZmZpX3R5cGUgKikgKiAoYmFzZWRpY3QtPmxlbmd0aCkpOwotCQlmZmlfb2ZzID0gYmFzZWRpY3QtPmxlbmd0aDsKLQl9IGVsc2UgewotCQlvZmZzZXQgPSAwOwotCQlzaXplID0gMDsKLQkJYWxpZ24gPSAwOwotCQl1bmlvbl9zaXplID0gMDsKLQkJdG90YWxfYWxpZ24gPSAxOwotCQlzdGdkaWN0LT5mZmlfdHlwZV9wb2ludGVyLnR5cGUgPSBGRklfVFlQRV9TVFJVQ1Q7Ci0JCXN0Z2RpY3QtPmZmaV90eXBlX3BvaW50ZXIuZWxlbWVudHMgPSBQeU1lbV9NYWxsb2Moc2l6ZW9mKGZmaV90eXBlICopICogKGxlbiArIDEpKTsKLQkJaWYgKHN0Z2RpY3QtPmZmaV90eXBlX3BvaW50ZXIuZWxlbWVudHMgPT0gTlVMTCkgewotCQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQltZW1zZXQoc3RnZGljdC0+ZmZpX3R5cGVfcG9pbnRlci5lbGVtZW50cywgMCwKLQkJICAgICAgIHNpemVvZihmZmlfdHlwZSAqKSAqIChsZW4gKyAxKSk7Ci0JCWZmaV9vZnMgPSAwOwotCX0KKyAgICBiYXNlZGljdCA9IFB5VHlwZV9zdGdkaWN0KChQeU9iamVjdCAqKSgoUHlUeXBlT2JqZWN0ICopdHlwZSktPnRwX2Jhc2UpOworICAgIGlmIChiYXNlZGljdCAmJiAhdXNlX2Jyb2tlbl9vbGRfY3R5cGVzX3NlbWFudGljcykgeworICAgICAgICBzaXplID0gb2Zmc2V0ID0gYmFzZWRpY3QtPnNpemU7CisgICAgICAgIGFsaWduID0gYmFzZWRpY3QtPmFsaWduOworICAgICAgICB1bmlvbl9zaXplID0gMDsKKyAgICAgICAgdG90YWxfYWxpZ24gPSBhbGlnbiA/IGFsaWduIDogMTsKKyAgICAgICAgc3RnZGljdC0+ZmZpX3R5cGVfcG9pbnRlci50eXBlID0gRkZJX1RZUEVfU1RSVUNUOworICAgICAgICBzdGdkaWN0LT5mZmlfdHlwZV9wb2ludGVyLmVsZW1lbnRzID0gUHlNZW1fTWFsbG9jKHNpemVvZihmZmlfdHlwZSAqKSAqIChiYXNlZGljdC0+bGVuZ3RoICsgbGVuICsgMSkpOworICAgICAgICBpZiAoc3RnZGljdC0+ZmZpX3R5cGVfcG9pbnRlci5lbGVtZW50cyA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIG1lbXNldChzdGdkaWN0LT5mZmlfdHlwZV9wb2ludGVyLmVsZW1lbnRzLCAwLAorICAgICAgICAgICAgICAgc2l6ZW9mKGZmaV90eXBlICopICogKGJhc2VkaWN0LT5sZW5ndGggKyBsZW4gKyAxKSk7CisgICAgICAgIG1lbWNweShzdGdkaWN0LT5mZmlfdHlwZV9wb2ludGVyLmVsZW1lbnRzLAorICAgICAgICAgICAgICAgYmFzZWRpY3QtPmZmaV90eXBlX3BvaW50ZXIuZWxlbWVudHMsCisgICAgICAgICAgICAgICBzaXplb2YoZmZpX3R5cGUgKikgKiAoYmFzZWRpY3QtPmxlbmd0aCkpOworICAgICAgICBmZmlfb2ZzID0gYmFzZWRpY3QtPmxlbmd0aDsKKyAgICB9IGVsc2UgeworICAgICAgICBvZmZzZXQgPSAwOworICAgICAgICBzaXplID0gMDsKKyAgICAgICAgYWxpZ24gPSAwOworICAgICAgICB1bmlvbl9zaXplID0gMDsKKyAgICAgICAgdG90YWxfYWxpZ24gPSAxOworICAgICAgICBzdGdkaWN0LT5mZmlfdHlwZV9wb2ludGVyLnR5cGUgPSBGRklfVFlQRV9TVFJVQ1Q7CisgICAgICAgIHN0Z2RpY3QtPmZmaV90eXBlX3BvaW50ZXIuZWxlbWVudHMgPSBQeU1lbV9NYWxsb2Moc2l6ZW9mKGZmaV90eXBlICopICogKGxlbiArIDEpKTsKKyAgICAgICAgaWYgKHN0Z2RpY3QtPmZmaV90eXBlX3BvaW50ZXIuZWxlbWVudHMgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBtZW1zZXQoc3RnZGljdC0+ZmZpX3R5cGVfcG9pbnRlci5lbGVtZW50cywgMCwKKyAgICAgICAgICAgICAgIHNpemVvZihmZmlfdHlwZSAqKSAqIChsZW4gKyAxKSk7CisgICAgICAgIGZmaV9vZnMgPSAwOworICAgIH0KIAotCWFzc2VydChzdGdkaWN0LT5mb3JtYXQgPT0gTlVMTCk7Ci0JaWYgKGlzU3RydWN0ICYmICFpc1BhY2tlZCkgewotCQlzdGdkaWN0LT5mb3JtYXQgPSBhbGxvY19mb3JtYXRfc3RyaW5nKE5VTEwsICJUeyIpOwotCX0gZWxzZSB7Ci0JCS8qIFBFUDMxMTggZG9lc24ndCBzdXBwb3J0IHVuaW9uLCBvciBwYWNrZWQgc3RydWN0dXJlcyAod2VsbCwKLQkJICAgb25seSBzdGFuZGFyZCBwYWNraW5nLCBidXQgd2UgZG9udCBzdXBwb3J0IHRoZSBwZXAgZm9yCi0JCSAgIHRoYXQpLiBVc2UgJ0InIGZvciBieXRlcy4gKi8KLQkJc3RnZGljdC0+Zm9ybWF0ID0gYWxsb2NfZm9ybWF0X3N0cmluZyhOVUxMLCAiQiIpOwotCX0KKyAgICBhc3NlcnQoc3RnZGljdC0+Zm9ybWF0ID09IE5VTEwpOworICAgIGlmIChpc1N0cnVjdCAmJiAhaXNQYWNrZWQpIHsKKyAgICAgICAgc3RnZGljdC0+Zm9ybWF0ID0gYWxsb2NfZm9ybWF0X3N0cmluZyhOVUxMLCAiVHsiKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBQRVAzMTE4IGRvZXNuJ3Qgc3VwcG9ydCB1bmlvbiwgb3IgcGFja2VkIHN0cnVjdHVyZXMgKHdlbGwsCisgICAgICAgICAgIG9ubHkgc3RhbmRhcmQgcGFja2luZywgYnV0IHdlIGRvbnQgc3VwcG9ydCB0aGUgcGVwIGZvcgorICAgICAgICAgICB0aGF0KS4gVXNlICdCJyBmb3IgYnl0ZXMuICovCisgICAgICAgIHN0Z2RpY3QtPmZvcm1hdCA9IGFsbG9jX2Zvcm1hdF9zdHJpbmcoTlVMTCwgIkIiKTsKKyAgICB9CiAKICNkZWZpbmUgcmVhbGRpY3QgKChQeU9iamVjdCAqKSZzdGdkaWN0LT5kaWN0KQotCWZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkgewotCQlQeU9iamVjdCAqbmFtZSA9IE5VTEwsICpkZXNjID0gTlVMTDsKLQkJUHlPYmplY3QgKnBhaXIgPSBQeVNlcXVlbmNlX0dldEl0ZW0oZmllbGRzLCBpKTsKLQkJUHlPYmplY3QgKnByb3A7Ci0JCVN0Z0RpY3RPYmplY3QgKmRpY3Q7Ci0JCWludCBiaXRzaXplID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKKyAgICAgICAgUHlPYmplY3QgKm5hbWUgPSBOVUxMLCAqZGVzYyA9IE5VTEw7CisgICAgICAgIFB5T2JqZWN0ICpwYWlyID0gUHlTZXF1ZW5jZV9HZXRJdGVtKGZpZWxkcywgaSk7CisgICAgICAgIFB5T2JqZWN0ICpwcm9wOworICAgICAgICBTdGdEaWN0T2JqZWN0ICpkaWN0OworICAgICAgICBpbnQgYml0c2l6ZSA9IDA7CiAKLQkJaWYgKCFwYWlyIHx8ICFQeUFyZ19QYXJzZVR1cGxlKHBhaXIsICJPT3xpIiwgJm5hbWUsICZkZXNjLCAmYml0c2l6ZSkpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19BdHRyaWJ1dGVFcnJvciwKLQkJCQkJIidfZmllbGRzXycgbXVzdCBiZSBhIHNlcXVlbmNlIG9mIHBhaXJzIik7Ci0JCQlQeV9YREVDUkVGKHBhaXIpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWRpY3QgPSBQeVR5cGVfc3RnZGljdChkZXNjKTsKLQkJaWYgKGRpY3QgPT0gTlVMTCkgewotCQkJUHlfREVDUkVGKHBhaXIpOwotCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgaWYgKCFwYWlyIHx8ICFQeUFyZ19QYXJzZVR1cGxlKHBhaXIsICJPT3xpIiwgJm5hbWUsICZkZXNjLCAmYml0c2l6ZSkpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19BdHRyaWJ1dGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJ19maWVsZHNfJyBtdXN0IGJlIGEgc2VxdWVuY2Ugb2YgcGFpcnMiKTsKKyAgICAgICAgICAgIFB5X1hERUNSRUYocGFpcik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgZGljdCA9IFB5VHlwZV9zdGdkaWN0KGRlc2MpOworICAgICAgICBpZiAoZGljdCA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYocGFpcik7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAogI2lmIChQWV9WRVJTSU9OX0hFWCA8IDB4MDIwNTAwMDApCi0JCQkJICAgICAic2Vjb25kIGl0ZW0gaW4gX2ZpZWxkc18gdHVwbGUgKGluZGV4ICVkKSBtdXN0IGJlIGEgQyB0eXBlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAic2Vjb25kIGl0ZW0gaW4gX2ZpZWxkc18gdHVwbGUgKGluZGV4ICVkKSBtdXN0IGJlIGEgQyB0eXBlIiwKICNlbHNlCi0JCQkJICAgICAic2Vjb25kIGl0ZW0gaW4gX2ZpZWxkc18gdHVwbGUgKGluZGV4ICV6ZCkgbXVzdCBiZSBhIEMgdHlwZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgInNlY29uZCBpdGVtIGluIF9maWVsZHNfIHR1cGxlIChpbmRleCAlemQpIG11c3QgYmUgYSBDIHR5cGUiLAogI2VuZGlmCi0JCQkJICAgICBpKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlzdGdkaWN0LT5mZmlfdHlwZV9wb2ludGVyLmVsZW1lbnRzW2ZmaV9vZnMgKyBpXSA9ICZkaWN0LT5mZmlfdHlwZV9wb2ludGVyOwotCQlpZiAoZGljdC0+ZmxhZ3MgJiAoVFlQRUZMQUdfSVNQT0lOVEVSIHwgVFlQRUZMQUdfSEFTUE9JTlRFUikpCi0JCQlzdGdkaWN0LT5mbGFncyB8PSBUWVBFRkxBR19IQVNQT0lOVEVSOwotCQlkaWN0LT5mbGFncyB8PSBESUNURkxBR19GSU5BTDsgLyogbWFyayBmaWVsZCB0eXBlIGZpbmFsICovCi0JCWlmIChQeVR1cGxlX1NpemUocGFpcikgPT0gMykgeyAvKiBiaXRzIHNwZWNpZmllZCAqLwotCQkJc3dpdGNoKGRpY3QtPmZmaV90eXBlX3BvaW50ZXIudHlwZSkgewotCQkJY2FzZSBGRklfVFlQRV9VSU5UODoKLQkJCWNhc2UgRkZJX1RZUEVfVUlOVDE2OgotCQkJY2FzZSBGRklfVFlQRV9VSU5UMzI6Ci0JCQljYXNlIEZGSV9UWVBFX1NJTlQ2NDoKLQkJCWNhc2UgRkZJX1RZUEVfVUlOVDY0OgotCQkJCWJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgIGkpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIHN0Z2RpY3QtPmZmaV90eXBlX3BvaW50ZXIuZWxlbWVudHNbZmZpX29mcyArIGldID0gJmRpY3QtPmZmaV90eXBlX3BvaW50ZXI7CisgICAgICAgIGlmIChkaWN0LT5mbGFncyAmIChUWVBFRkxBR19JU1BPSU5URVIgfCBUWVBFRkxBR19IQVNQT0lOVEVSKSkKKyAgICAgICAgICAgIHN0Z2RpY3QtPmZsYWdzIHw9IFRZUEVGTEFHX0hBU1BPSU5URVI7CisgICAgICAgIGRpY3QtPmZsYWdzIHw9IERJQ1RGTEFHX0ZJTkFMOyAvKiBtYXJrIGZpZWxkIHR5cGUgZmluYWwgKi8KKyAgICAgICAgaWYgKFB5VHVwbGVfU2l6ZShwYWlyKSA9PSAzKSB7IC8qIGJpdHMgc3BlY2lmaWVkICovCisgICAgICAgICAgICBzd2l0Y2goZGljdC0+ZmZpX3R5cGVfcG9pbnRlci50eXBlKSB7CisgICAgICAgICAgICBjYXNlIEZGSV9UWVBFX1VJTlQ4OgorICAgICAgICAgICAgY2FzZSBGRklfVFlQRV9VSU5UMTY6CisgICAgICAgICAgICBjYXNlIEZGSV9UWVBFX1VJTlQzMjoKKyAgICAgICAgICAgIGNhc2UgRkZJX1RZUEVfU0lOVDY0OgorICAgICAgICAgICAgY2FzZSBGRklfVFlQRV9VSU5UNjQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CiAKLQkJCWNhc2UgRkZJX1RZUEVfU0lOVDg6Ci0JCQljYXNlIEZGSV9UWVBFX1NJTlQxNjoKLQkJCWNhc2UgRkZJX1RZUEVfU0lOVDMyOgotCQkJCWlmIChkaWN0LT5nZXRmdW5jICE9IGdldGVudHJ5KCJjIiktPmdldGZ1bmMKKyAgICAgICAgICAgIGNhc2UgRkZJX1RZUEVfU0lOVDg6CisgICAgICAgICAgICBjYXNlIEZGSV9UWVBFX1NJTlQxNjoKKyAgICAgICAgICAgIGNhc2UgRkZJX1RZUEVfU0lOVDMyOgorICAgICAgICAgICAgICAgIGlmIChkaWN0LT5nZXRmdW5jICE9IGdldGVudHJ5KCJjIiktPmdldGZ1bmMKICNpZmRlZiBDVFlQRVNfVU5JQ09ERQotCQkJCSAgICAmJiBkaWN0LT5nZXRmdW5jICE9IGdldGVudHJ5KCJ1IiktPmdldGZ1bmMKKyAgICAgICAgICAgICAgICAgICAgJiYgZGljdC0+Z2V0ZnVuYyAhPSBnZXRlbnRyeSgidSIpLT5nZXRmdW5jCiAjZW5kaWYKLQkJCQkJKQotCQkJCQlicmVhazsKLQkJCQkvKiBlbHNlIGZhbGwgdGhyb3VnaCAqLwotCQkJZGVmYXVsdDoKLQkJCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJCQkgICAgICJiaXQgZmllbGRzIG5vdCBhbGxvd2VkIGZvciB0eXBlICVzIiwKLQkJCQkJICAgICAoKFB5VHlwZU9iamVjdCAqKWRlc2MpLT50cF9uYW1lKTsKLQkJCQlQeV9ERUNSRUYocGFpcik7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQkJaWYgKGJpdHNpemUgPD0gMCB8fCBiaXRzaXplID4gZGljdC0+c2l6ZSAqIDgpIHsKLQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkJCSJudW1iZXIgb2YgYml0cyBpbnZhbGlkIGZvciBiaXQgZmllbGQiKTsKLQkJCQlQeV9ERUNSRUYocGFpcik7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9IGVsc2UKLQkJCWJpdHNpemUgPSAwOwotCQlpZiAoaXNTdHJ1Y3QgJiYgIWlzUGFja2VkKSB7Ci0JCQljaGFyICpmaWVsZGZtdCA9IGRpY3QtPmZvcm1hdCA/IGRpY3QtPmZvcm1hdCA6ICJCIjsKLQkJCWNoYXIgKmZpZWxkbmFtZSA9IFB5U3RyaW5nX0FzU3RyaW5nKG5hbWUpOwotCQkJY2hhciAqcHRyOwotCQkJUHlfc3NpemVfdCBsZW4gPSBzdHJsZW4oZmllbGRuYW1lKSArIHN0cmxlbihmaWVsZGZtdCk7Ci0JCQljaGFyICpidWYgPSBhbGxvY2EobGVuICsgMiArIDEpOworICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIC8qIGVsc2UgZmFsbCB0aHJvdWdoICovCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiaXQgZmllbGRzIG5vdCBhbGxvd2VkIGZvciB0eXBlICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQeVR5cGVPYmplY3QgKilkZXNjKS0+dHBfbmFtZSk7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHBhaXIpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChiaXRzaXplIDw9IDAgfHwgYml0c2l6ZSA+IGRpY3QtPnNpemUgKiA4KSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJudW1iZXIgb2YgYml0cyBpbnZhbGlkIGZvciBiaXQgZmllbGQiKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYocGFpcik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGJpdHNpemUgPSAwOworICAgICAgICBpZiAoaXNTdHJ1Y3QgJiYgIWlzUGFja2VkKSB7CisgICAgICAgICAgICBjaGFyICpmaWVsZGZtdCA9IGRpY3QtPmZvcm1hdCA/IGRpY3QtPmZvcm1hdCA6ICJCIjsKKyAgICAgICAgICAgIGNoYXIgKmZpZWxkbmFtZSA9IFB5U3RyaW5nX0FzU3RyaW5nKG5hbWUpOworICAgICAgICAgICAgY2hhciAqcHRyOworICAgICAgICAgICAgUHlfc3NpemVfdCBsZW4gPSBzdHJsZW4oZmllbGRuYW1lKSArIHN0cmxlbihmaWVsZGZtdCk7CisgICAgICAgICAgICBjaGFyICpidWYgPSBhbGxvY2EobGVuICsgMiArIDEpOwogCi0JCQlzcHJpbnRmKGJ1ZiwgIiVzOiVzOiIsIGZpZWxkZm10LCBmaWVsZG5hbWUpOworICAgICAgICAgICAgc3ByaW50ZihidWYsICIlczolczoiLCBmaWVsZGZtdCwgZmllbGRuYW1lKTsKIAotCQkJcHRyID0gc3RnZGljdC0+Zm9ybWF0OwotCQkJc3RnZGljdC0+Zm9ybWF0ID0gYWxsb2NfZm9ybWF0X3N0cmluZyhzdGdkaWN0LT5mb3JtYXQsIGJ1Zik7Ci0JCQlQeU1lbV9GcmVlKHB0cik7CisgICAgICAgICAgICBwdHIgPSBzdGdkaWN0LT5mb3JtYXQ7CisgICAgICAgICAgICBzdGdkaWN0LT5mb3JtYXQgPSBhbGxvY19mb3JtYXRfc3RyaW5nKHN0Z2RpY3QtPmZvcm1hdCwgYnVmKTsKKyAgICAgICAgICAgIFB5TWVtX0ZyZWUocHRyKTsKIAotCQkJaWYgKHN0Z2RpY3QtPmZvcm1hdCA9PSBOVUxMKSB7Ci0JCQkJUHlfREVDUkVGKHBhaXIpOwotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoaXNTdHJ1Y3QpIHsKLQkJCXByb3AgPSBDRmllbGRfRnJvbURlc2MoZGVzYywgaSwKLQkJCQkJICAgICAgICZmaWVsZF9zaXplLCBiaXRzaXplLCAmYml0b2ZzLAotCQkJCQkgICAgICAgJnNpemUsICZvZmZzZXQsICZhbGlnbiwKLQkJCQkJICAgICAgIHBhY2ssIGJpZ19lbmRpYW4pOwotCQl9IGVsc2UgLyogdW5pb24gKi8gewotCQkJc2l6ZSA9IDA7Ci0JCQlvZmZzZXQgPSAwOwotCQkJYWxpZ24gPSAwOwotCQkJcHJvcCA9IENGaWVsZF9Gcm9tRGVzYyhkZXNjLCBpLAotCQkJCQkgICAgICAgJmZpZWxkX3NpemUsIGJpdHNpemUsICZiaXRvZnMsCi0JCQkJCSAgICAgICAmc2l6ZSwgJm9mZnNldCwgJmFsaWduLAotCQkJCQkgICAgICAgcGFjaywgYmlnX2VuZGlhbik7Ci0JCQl1bmlvbl9zaXplID0gbWF4KHNpemUsIHVuaW9uX3NpemUpOwotCQl9Ci0JCXRvdGFsX2FsaWduID0gbWF4KGFsaWduLCB0b3RhbF9hbGlnbik7CisgICAgICAgICAgICBpZiAoc3RnZGljdC0+Zm9ybWF0ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYocGFpcik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChpc1N0cnVjdCkgeworICAgICAgICAgICAgcHJvcCA9IENGaWVsZF9Gcm9tRGVzYyhkZXNjLCBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfc2l6ZSwgYml0c2l6ZSwgJmJpdG9mcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUsICZvZmZzZXQsICZhbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFjaywgYmlnX2VuZGlhbik7CisgICAgICAgIH0gZWxzZSAvKiB1bmlvbiAqLyB7CisgICAgICAgICAgICBzaXplID0gMDsKKyAgICAgICAgICAgIG9mZnNldCA9IDA7CisgICAgICAgICAgICBhbGlnbiA9IDA7CisgICAgICAgICAgICBwcm9wID0gQ0ZpZWxkX0Zyb21EZXNjKGRlc2MsIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9zaXplLCBiaXRzaXplLCAmYml0b2ZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSwgJm9mZnNldCwgJmFsaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrLCBiaWdfZW5kaWFuKTsKKyAgICAgICAgICAgIHVuaW9uX3NpemUgPSBtYXgoc2l6ZSwgdW5pb25fc2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgdG90YWxfYWxpZ24gPSBtYXgoYWxpZ24sIHRvdGFsX2FsaWduKTsKIAotCQlpZiAoIXByb3ApIHsKLQkJCVB5X0RFQ1JFRihwYWlyKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlpZiAoLTEgPT0gUHlPYmplY3RfU2V0QXR0cih0eXBlLCBuYW1lLCBwcm9wKSkgewotCQkJUHlfREVDUkVGKHByb3ApOwotCQkJUHlfREVDUkVGKHBhaXIpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCVB5X0RFQ1JFRihwYWlyKTsKLQkJUHlfREVDUkVGKHByb3ApOwotCX0KKyAgICAgICAgaWYgKCFwcm9wKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYocGFpcik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKC0xID09IFB5T2JqZWN0X1NldEF0dHIodHlwZSwgbmFtZSwgcHJvcCkpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihwcm9wKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihwYWlyKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBQeV9ERUNSRUYocGFpcik7CisgICAgICAgIFB5X0RFQ1JFRihwcm9wKTsKKyAgICB9CiAjdW5kZWYgcmVhbGRpY3QKIAotCWlmIChpc1N0cnVjdCAmJiAhaXNQYWNrZWQpIHsKLQkJY2hhciAqcHRyID0gc3RnZGljdC0+Zm9ybWF0OwotCQlzdGdkaWN0LT5mb3JtYXQgPSBhbGxvY19mb3JtYXRfc3RyaW5nKHN0Z2RpY3QtPmZvcm1hdCwgIn0iKTsKLQkJUHlNZW1fRnJlZShwdHIpOwotCQlpZiAoc3RnZGljdC0+Zm9ybWF0ID09IE5VTEwpCi0JCQlyZXR1cm4gLTE7Ci0JfQorICAgIGlmIChpc1N0cnVjdCAmJiAhaXNQYWNrZWQpIHsKKyAgICAgICAgY2hhciAqcHRyID0gc3RnZGljdC0+Zm9ybWF0OworICAgICAgICBzdGdkaWN0LT5mb3JtYXQgPSBhbGxvY19mb3JtYXRfc3RyaW5nKHN0Z2RpY3QtPmZvcm1hdCwgIn0iKTsKKyAgICAgICAgUHlNZW1fRnJlZShwdHIpOworICAgICAgICBpZiAoc3RnZGljdC0+Zm9ybWF0ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JaWYgKCFpc1N0cnVjdCkKLQkJc2l6ZSA9IHVuaW9uX3NpemU7CisgICAgaWYgKCFpc1N0cnVjdCkKKyAgICAgICAgc2l6ZSA9IHVuaW9uX3NpemU7CiAKLQkvKiBBZGp1c3QgdGhlIHNpemUgYWNjb3JkaW5nIHRvIHRoZSBhbGlnbm1lbnQgcmVxdWlyZW1lbnRzICovCi0Jc2l6ZSA9ICgoc2l6ZSArIHRvdGFsX2FsaWduIC0gMSkgLyB0b3RhbF9hbGlnbikgKiB0b3RhbF9hbGlnbjsKKyAgICAvKiBBZGp1c3QgdGhlIHNpemUgYWNjb3JkaW5nIHRvIHRoZSBhbGlnbm1lbnQgcmVxdWlyZW1lbnRzICovCisgICAgc2l6ZSA9ICgoc2l6ZSArIHRvdGFsX2FsaWduIC0gMSkgLyB0b3RhbF9hbGlnbikgKiB0b3RhbF9hbGlnbjsKIAotCXN0Z2RpY3QtPmZmaV90eXBlX3BvaW50ZXIuYWxpZ25tZW50ID0gUHlfU0FGRV9ET1dOQ0FTVCh0b3RhbF9hbGlnbiwKLQkJCQkJCQkgICAgICAgUHlfc3NpemVfdCwKLQkJCQkJCQkgICAgICAgdW5zaWduZWQgc2hvcnQpOwotCXN0Z2RpY3QtPmZmaV90eXBlX3BvaW50ZXIuc2l6ZSA9IHNpemU7CisgICAgc3RnZGljdC0+ZmZpX3R5cGVfcG9pbnRlci5hbGlnbm1lbnQgPSBQeV9TQUZFX0RPV05DQVNUKHRvdGFsX2FsaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCk7CisgICAgc3RnZGljdC0+ZmZpX3R5cGVfcG9pbnRlci5zaXplID0gc2l6ZTsKIAotCXN0Z2RpY3QtPnNpemUgPSBzaXplOwotCXN0Z2RpY3QtPmFsaWduID0gdG90YWxfYWxpZ247Ci0Jc3RnZGljdC0+bGVuZ3RoID0gbGVuOwkvKiBBREQgZmZpX29mcz8gKi8KKyAgICBzdGdkaWN0LT5zaXplID0gc2l6ZTsKKyAgICBzdGdkaWN0LT5hbGlnbiA9IHRvdGFsX2FsaWduOworICAgIHN0Z2RpY3QtPmxlbmd0aCA9IGxlbjsgICAgICAvKiBBREQgZmZpX29mcz8gKi8KIAotCS8qIFdlIGRpZCBjaGVjayB0aGF0IHRoaXMgZmxhZyB3YXMgTk9UIHNldCBhYm92ZSwgaXQgbXVzdCBub3QKLQkgICBoYXZlIGJlZW4gc2V0IHVudGlsIG5vdy4gKi8KLQlpZiAoc3RnZGljdC0+ZmxhZ3MgJiBESUNURkxBR19GSU5BTCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfQXR0cmlidXRlRXJyb3IsCi0JCQkJIlN0cnVjdHVyZSBvciB1bmlvbiBjYW5ub3QgY29udGFpbiBpdHNlbGYiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlzdGdkaWN0LT5mbGFncyB8PSBESUNURkxBR19GSU5BTDsKKyAgICAvKiBXZSBkaWQgY2hlY2sgdGhhdCB0aGlzIGZsYWcgd2FzIE5PVCBzZXQgYWJvdmUsIGl0IG11c3Qgbm90CisgICAgICAgaGF2ZSBiZWVuIHNldCB1bnRpbCBub3cuICovCisgICAgaWYgKHN0Z2RpY3QtPmZsYWdzICYgRElDVEZMQUdfRklOQUwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0F0dHJpYnV0ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIlN0cnVjdHVyZSBvciB1bmlvbiBjYW5ub3QgY29udGFpbiBpdHNlbGYiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBzdGdkaWN0LT5mbGFncyB8PSBESUNURkxBR19GSU5BTDsKIAotCXJldHVybiBNYWtlQW5vbkZpZWxkcyh0eXBlKTsKKyAgICByZXR1cm4gTWFrZUFub25GaWVsZHModHlwZSk7CiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdXJzZXNfcGFuZWwuYyBiL01vZHVsZXMvX2N1cnNlc19wYW5lbC5jCmluZGV4IDc0ZTZiZmEuLjA0YTBhMjggMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N1cnNlc19wYW5lbC5jCisrKyBiL01vZHVsZXMvX2N1cnNlc19wYW5lbC5jCkBAIC0yMiw3ICsyMiw3IEBACiAvKiBVdGlsaXR5IEZ1bmN0aW9ucyAqLwogCiAvKgotICogQ2hlY2sgdGhlIHJldHVybiBjb2RlIGZyb20gYSBjdXJzZXMgZnVuY3Rpb24gYW5kIHJldHVybiBOb25lIAorICogQ2hlY2sgdGhlIHJldHVybiBjb2RlIGZyb20gYSBjdXJzZXMgZnVuY3Rpb24gYW5kIHJldHVybiBOb25lCiAgKiBvciByYWlzZSBhbiBleGNlcHRpb24gYXMgYXBwcm9wcmlhdGUuCiAgKi8KIApAQCAtMzAsMTUgKzMwLDE1IEBACiBQeUN1cnNlc0NoZWNrRVJSKGludCBjb2RlLCBjaGFyICpmbmFtZSkKIHsKICAgICBpZiAoY29kZSAhPSBFUlIpIHsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7CiAgICAgfSBlbHNlIHsKLQlpZiAoZm5hbWUgPT0gTlVMTCkgewotCSAgICBQeUVycl9TZXRTdHJpbmcoUHlDdXJzZXNFcnJvciwgY2F0Y2hhbGxfRVJSKTsKLQl9IGVsc2UgewotCSAgICBQeUVycl9Gb3JtYXQoUHlDdXJzZXNFcnJvciwgIiVzKCkgcmV0dXJuZWQgRVJSIiwgZm5hbWUpOwotCX0KLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKGZuYW1lID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUN1cnNlc0Vycm9yLCBjYXRjaGFsbF9FUlIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5Q3Vyc2VzRXJyb3IsICIlcygpIHJldHVybmVkIEVSUiIsIGZuYW1lKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiB9CiAKQEAgLTUxLDEyICs1MSwxMiBAQAogdHlwZWRlZiBzdHJ1Y3QgewogICAgIFB5T2JqZWN0X0hFQUQKICAgICBQQU5FTCAqcGFuOwotICAgIFB5Q3Vyc2VzV2luZG93T2JqZWN0ICp3bzsJLyogZm9yIHJlZmVyZW5jZSBjb3VudHMgKi8KKyAgICBQeUN1cnNlc1dpbmRvd09iamVjdCAqd287ICAgLyogZm9yIHJlZmVyZW5jZSBjb3VudHMgKi8KIH0gUHlDdXJzZXNQYW5lbE9iamVjdDsKIAogUHlUeXBlT2JqZWN0IFB5Q3Vyc2VzUGFuZWxfVHlwZTsKIAotI2RlZmluZSBQeUN1cnNlc1BhbmVsX0NoZWNrKHYpCSAoUHlfVFlQRSh2KSA9PSAmUHlDdXJzZXNQYW5lbF9UeXBlKQorI2RlZmluZSBQeUN1cnNlc1BhbmVsX0NoZWNrKHYpICAgKFB5X1RZUEUodikgPT0gJlB5Q3Vyc2VzUGFuZWxfVHlwZSkKIAogLyogU29tZSBoZWxwZXIgZnVuY3Rpb25zLiBUaGUgcHJvYmxlbSBpcyB0aGF0IHRoZXJlJ3MgYWx3YXlzIGEgd2luZG93CiAgICBhc3NvY2lhdGVkIHdpdGggYSBwYW5lbC4gVG8gZW5zdXJlIHRoYXQgUHl0aG9uJ3MgR0MgZG9lc24ndCBwdWxsCkBAIC04OCwxMCArODgsMTAgQEAKIGluc2VydF9sb3AoUHlDdXJzZXNQYW5lbE9iamVjdCAqcG8pCiB7CiAgICAgbGlzdF9vZl9wYW5lbHMgKm5ldzsKLSAgICAKKwogICAgIGlmICgobmV3ID0gKGxpc3Rfb2ZfcGFuZWxzICopbWFsbG9jKHNpemVvZihsaXN0X29mX3BhbmVscykpKSA9PSBOVUxMKSB7Ci0JUHlFcnJfTm9NZW1vcnkoKTsKLQlyZXR1cm4gLTE7CisgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAgICAgbmV3LT5wbyA9IHBvOwogICAgIG5ldy0+bmV4dCA9IGxvcDsKQEAgLTEwNywxNyArMTA3LDE3IEBACiAKICAgICB0ZW1wID0gbG9wOwogICAgIGlmICh0ZW1wLT5wbyA9PSBwbykgewotCWxvcCA9IHRlbXAtPm5leHQ7Ci0JZnJlZSh0ZW1wKTsKLQlyZXR1cm47CisgICAgICAgIGxvcCA9IHRlbXAtPm5leHQ7CisgICAgICAgIGZyZWUodGVtcCk7CisgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgd2hpbGUgKHRlbXAtPm5leHQgPT0gTlVMTCB8fCB0ZW1wLT5uZXh0LT5wbyAhPSBwbykgewotCWlmICh0ZW1wLT5uZXh0ID09IE5VTEwpIHsKLQkgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKLQkJCSAgICAicmVtb3ZlX2xvcDogY2FuJ3QgZmluZCBQYW5lbCBPYmplY3QiKTsKLQkgICAgcmV0dXJuOwotCX0KLQl0ZW1wID0gdGVtcC0+bmV4dDsKKyAgICAgICAgaWYgKHRlbXAtPm5leHQgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVtb3ZlX2xvcDogY2FuJ3QgZmluZCBQYW5lbCBPYmplY3QiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB0ZW1wID0gdGVtcC0+bmV4dDsKICAgICB9CiAgICAgbiA9IHRlbXAtPm5leHQtPm5leHQ7CiAgICAgZnJlZSh0ZW1wLT5uZXh0KTsKQEAgLTEzMSw3ICsxMzEsNyBAQAogewogICAgIGxpc3Rfb2ZfcGFuZWxzICp0ZW1wOwogICAgIGZvciAodGVtcCA9IGxvcDsgdGVtcC0+cG8tPnBhbiAhPSBwYW47IHRlbXAgPSB0ZW1wLT5uZXh0KQotCWlmICh0ZW1wLT5uZXh0ID09IE5VTEwpIHJldHVybiBOVUxMOwkvKiBub3QgZm91bmQhPyAqLworICAgICAgICBpZiAodGVtcC0+bmV4dCA9PSBOVUxMKSByZXR1cm4gTlVMTDsgICAgLyogbm90IGZvdW5kIT8gKi8KICAgICByZXR1cm4gdGVtcC0+cG87CiB9CiAKQEAgLTE3OSw5ICsxNzksOSBAQAogICAgIGlmIChwbyA9PSBOVUxMKSByZXR1cm4gTlVMTDsKICAgICBwby0+cGFuID0gcGFuOwogICAgIGlmIChpbnNlcnRfbG9wKHBvKSA8IDApIHsKLQlwby0+d28gPSBOVUxMOwotCVB5X0RFQ1JFRihwbyk7Ci0JcmV0dXJuIE5VTEw7CisgICAgICAgIHBvLT53byA9IE5VTEw7CisgICAgICAgIFB5X0RFQ1JFRihwbyk7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICBwby0+d28gPSB3bzsKICAgICBQeV9JTkNSRUYod28pOwpAQCAtMTkzLDggKzE5Myw4IEBACiB7CiAgICAgKHZvaWQpZGVsX3BhbmVsKHBvLT5wYW4pOwogICAgIGlmIChwby0+d28gIT0gTlVMTCkgewotCVB5X0RFQ1JFRihwby0+d28pOwotCXJlbW92ZV9sb3AocG8pOworICAgICAgICBQeV9ERUNSRUYocG8tPndvKTsKKyAgICAgICAgcmVtb3ZlX2xvcChwbyk7CiAgICAgfQogICAgIFB5T2JqZWN0X0RFTChwbyk7CiB9CkBAIC0yMDYsMTkgKzIwNiwxOSBAQAogewogICAgIFBBTkVMICpwYW47CiAgICAgUHlDdXJzZXNQYW5lbE9iamVjdCAqcG87Ci0gICAgCisKICAgICBwYW4gPSBwYW5lbF9hYm92ZShzZWxmLT5wYW4pOwogCi0gICAgaWYgKHBhbiA9PSBOVUxMKSB7CQkvKiB2YWxpZCBvdXRwdXQsIGl0IG1lYW5zIHRoZSBjYWxsaW5nIHBhbmVsCi0JCQkJICAgaXMgb24gdG9wIG9mIHRoZSBzdGFjayAqLwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAocGFuID09IE5VTEwpIHsgICAgICAgICAgLyogdmFsaWQgb3V0cHV0LCBpdCBtZWFucyB0aGUgY2FsbGluZyBwYW5lbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBvbiB0b3Agb2YgdGhlIHN0YWNrICovCisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7CiAgICAgfQogICAgIHBvID0gZmluZF9wbyhwYW4pOwogICAgIGlmIChwbyA9PSBOVUxMKSB7Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKLQkJCSJwYW5lbF9hYm92ZTogY2FuJ3QgZmluZCBQYW5lbCBPYmplY3QiKTsKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJwYW5lbF9hYm92ZTogY2FuJ3QgZmluZCBQYW5lbCBPYmplY3QiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogICAgIFB5X0lOQ1JFRihwbyk7CiAgICAgcmV0dXJuIChQeU9iamVjdCAqKXBvOwpAQCAtMjMxLDE5ICsyMzEsMTkgQEAKIHsKICAgICBQQU5FTCAqcGFuOwogICAgIFB5Q3Vyc2VzUGFuZWxPYmplY3QgKnBvOwotICAgIAorCiAgICAgcGFuID0gcGFuZWxfYmVsb3coc2VsZi0+cGFuKTsKLSAgICAKLSAgICBpZiAocGFuID09IE5VTEwpIHsJCS8qIHZhbGlkIG91dHB1dCwgaXQgbWVhbnMgdGhlIGNhbGxpbmcgcGFuZWwKLQkJCQkgICBpcyBvbiB0aGUgYm90dG9tIG9mIHRoZSBzdGFjayAqLwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKworICAgIGlmIChwYW4gPT0gTlVMTCkgeyAgICAgICAgICAvKiB2YWxpZCBvdXRwdXQsIGl0IG1lYW5zIHRoZSBjYWxsaW5nIHBhbmVsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIG9uIHRoZSBib3R0b20gb2YgdGhlIHN0YWNrICovCisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7CiAgICAgfQogICAgIHBvID0gZmluZF9wbyhwYW4pOwogICAgIGlmIChwbyA9PSBOVUxMKSB7Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKLQkJCSJwYW5lbF9iZWxvdzogY2FuJ3QgZmluZCBQYW5lbCBPYmplY3QiKTsKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJwYW5lbF9iZWxvdzogY2FuJ3QgZmluZCBQYW5lbCBPYmplY3QiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogICAgIFB5X0lOQ1JFRihwbyk7CiAgICAgcmV0dXJuIChQeU9iamVjdCAqKXBvOwpAQCAtMjYyLDI2ICsyNjIsMjYgQEAKICAgICBQeUN1cnNlc1BhbmVsT2JqZWN0ICpwbzsKICAgICBQeUN1cnNlc1dpbmRvd09iamVjdCAqdGVtcDsKICAgICBpbnQgcnRuOwotICAgIAorCiAgICAgaWYgKFB5VHVwbGVfU2l6ZShhcmdzKSAhPSAxKSB7Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgInJlcGxhY2UgcmVxdWlyZXMgb25lIGFyZ3VtZW50Iik7Ci0JcmV0dXJuIE5VTEw7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJyZXBsYWNlIHJlcXVpcmVzIG9uZSBhcmd1bWVudCIpOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPITt3aW5kb3cgb2JqZWN0IiwKLQkJCSAgJlB5Q3Vyc2VzV2luZG93X1R5cGUsICZ0ZW1wKSkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJlB5Q3Vyc2VzV2luZG93X1R5cGUsICZ0ZW1wKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICBwbyA9IGZpbmRfcG8oc2VsZi0+cGFuKTsKICAgICBpZiAocG8gPT0gTlVMTCkgewotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCi0JCQkicmVwbGFjZV9wYW5lbDogY2FuJ3QgZmluZCBQYW5lbCBPYmplY3QiKTsKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJyZXBsYWNlX3BhbmVsOiBjYW4ndCBmaW5kIFBhbmVsIE9iamVjdCIpOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKICAgICBydG4gPSByZXBsYWNlX3BhbmVsKHNlbGYtPnBhbiwgdGVtcC0+d2luKTsKICAgICBpZiAocnRuID09IEVSUikgewotCVB5RXJyX1NldFN0cmluZyhQeUN1cnNlc0Vycm9yLCAicmVwbGFjZV9wYW5lbCgpIHJldHVybmVkIEVSUiIpOwotCXJldHVybiBOVUxMOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlDdXJzZXNFcnJvciwgInJlcGxhY2VfcGFuZWwoKSByZXR1cm5lZCBFUlIiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogICAgIFB5X0RFQ1JFRihwby0+d28pOwogICAgIHBvLT53byA9IHRlbXA7CkBAIC0zMDIsMTEgKzMwMiwxMSBAQAogUHlDdXJzZXNQYW5lbF91c2VycHRyKFB5Q3Vyc2VzUGFuZWxPYmplY3QgKnNlbGYpCiB7CiAgICAgUHlPYmplY3QgKm9iajsKLSAgICBQeUN1cnNlc0luaXRpYWxpc2VkOyAKKyAgICBQeUN1cnNlc0luaXRpYWxpc2VkOwogICAgIG9iaiA9IChQeU9iamVjdCAqKSBwYW5lbF91c2VycHRyKHNlbGYtPnBhbik7CiAgICAgaWYgKG9iaiA9PSBOVUxMKSB7Ci0JUHlFcnJfU2V0U3RyaW5nKFB5Q3Vyc2VzRXJyb3IsICJubyB1c2VycHRyIHNldCIpOwotCXJldHVybiBOVUxMOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlDdXJzZXNFcnJvciwgIm5vIHVzZXJwdHIgc2V0Iik7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAogICAgIFB5X0lOQ1JFRihvYmopOwpAQCAtMzI5LDcgKzMyOSw3IEBACiAgICAgeyJ0b3AiLCAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pUHlDdXJzZXNQYW5lbF90b3BfcGFuZWwsIE1FVEhfTk9BUkdTfSwKICAgICB7InVzZXJwdHIiLCAgICAgICAgIChQeUNGdW5jdGlvbilQeUN1cnNlc1BhbmVsX3VzZXJwdHIsIE1FVEhfTk9BUkdTfSwKICAgICB7IndpbmRvdyIsICAgICAgICAgIChQeUNGdW5jdGlvbilQeUN1cnNlc1BhbmVsX3dpbmRvdywgTUVUSF9OT0FSR1N9LAotICAgIHtOVUxMLAkJTlVMTH0gICAvKiBzZW50aW5lbCAqLworICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0gICAvKiBzZW50aW5lbCAqLwogfTsKIAogc3RhdGljIFB5T2JqZWN0ICoKQEAgLTM0MiwyMCArMzQyLDIwIEBACiAKIFB5VHlwZU9iamVjdCBQeUN1cnNlc1BhbmVsX1R5cGUgPSB7CiAgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0gICAgIl9jdXJzZXNfcGFuZWwuY3Vyc2VzIHBhbmVsIiwJLyp0cF9uYW1lKi8KLSAgICBzaXplb2YoUHlDdXJzZXNQYW5lbE9iamVjdCksCS8qdHBfYmFzaWNzaXplKi8KLSAgICAwLAkJCS8qdHBfaXRlbXNpemUqLworICAgICJfY3Vyc2VzX3BhbmVsLmN1cnNlcyBwYW5lbCIsICAgICAgIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKFB5Q3Vyc2VzUGFuZWxPYmplY3QpLCAgICAgICAgLyp0cF9iYXNpY3NpemUqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9pdGVtc2l6ZSovCiAgICAgLyogbWV0aG9kcyAqLwogICAgIChkZXN0cnVjdG9yKVB5Q3Vyc2VzUGFuZWxfRGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KLSAgICAwLAkJCS8qdHBfcHJpbnQqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9wcmludCovCiAgICAgKGdldGF0dHJmdW5jKVB5Q3Vyc2VzUGFuZWxfR2V0QXR0ciwgLyp0cF9nZXRhdHRyKi8KICAgICAoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KLSAgICAwLAkJCS8qdHBfY29tcGFyZSovCi0gICAgMCwJCQkvKnRwX3JlcHIqLwotICAgIDAsCQkJLyp0cF9hc19udW1iZXIqLwotICAgIDAsCQkJLyp0cF9hc19zZXF1ZW5jZSovCi0gICAgMCwJCQkvKnRwX2FzX21hcHBpbmcqLwotICAgIDAsCQkJLyp0cF9oYXNoKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfY29tcGFyZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX3JlcHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9hc19udW1iZXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9hc19zZXF1ZW5jZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX2FzX21hcHBpbmcqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9oYXNoKi8KIH07CiAKIC8qIFdyYXBwZXIgZm9yIHBhbmVsX2Fib3ZlKE5VTEwpLiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGJvdHRvbQpAQCAtMzcyLDE2ICszNzIsMTYgQEAKIAogICAgIHBhbiA9IHBhbmVsX2Fib3ZlKE5VTEwpOwogCi0gICAgaWYgKHBhbiA9PSBOVUxMKSB7CQkvKiB2YWxpZCBvdXRwdXQsIGl0IG1lYW5zCi0JCQkJICAgdGhlcmUncyBubyBwYW5lbCBhdCBhbGwgKi8gIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAocGFuID09IE5VTEwpIHsgICAgICAgICAgLyogdmFsaWQgb3V0cHV0LCBpdCBtZWFucworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVyZSdzIG5vIHBhbmVsIGF0IGFsbCAqLworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIHJldHVybiBQeV9Ob25lOwogICAgIH0KICAgICBwbyA9IGZpbmRfcG8ocGFuKTsKICAgICBpZiAocG8gPT0gTlVMTCkgewotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCi0JCQkicGFuZWxfYWJvdmU6IGNhbid0IGZpbmQgUGFuZWwgT2JqZWN0Iik7Ci0JcmV0dXJuIE5VTEw7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAicGFuZWxfYWJvdmU6IGNhbid0IGZpbmQgUGFuZWwgT2JqZWN0Iik7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICBQeV9JTkNSRUYocG8pOwogICAgIHJldHVybiAoUHlPYmplY3QgKilwbzsKQEAgLTM5Nyw4ICszOTcsOCBAQAogICAgICAgICByZXR1cm4gTlVMTDsKICAgICBwYW4gPSBuZXdfcGFuZWwod2luLT53aW4pOwogICAgIGlmIChwYW4gPT0gTlVMTCkgewotCVB5RXJyX1NldFN0cmluZyhQeUN1cnNlc0Vycm9yLCBjYXRjaGFsbF9OVUxMKTsKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5Q3Vyc2VzRXJyb3IsIGNhdGNoYWxsX05VTEwpOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAgICAgcmV0dXJuIChQeU9iamVjdCAqKVB5Q3Vyc2VzUGFuZWxfTmV3KHBhbiwgd2luKTsKIH0KQEAgLTQxMywyOCArNDEzLDI4IEBACiB7CiAgICAgUEFORUwgKnBhbjsKICAgICBQeUN1cnNlc1BhbmVsT2JqZWN0ICpwbzsKLSAgICAKKwogICAgIFB5Q3Vyc2VzSW5pdGlhbGlzZWQ7CiAKICAgICBwYW4gPSBwYW5lbF9iZWxvdyhOVUxMKTsKIAotICAgIGlmIChwYW4gPT0gTlVMTCkgewkJLyogdmFsaWQgb3V0cHV0LCBpdCBtZWFucwotCQkJCSAgIHRoZXJlJ3Mgbm8gcGFuZWwgYXQgYWxsICovCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGlmIChwYW4gPT0gTlVMTCkgeyAgICAgICAgICAvKiB2YWxpZCBvdXRwdXQsIGl0IG1lYW5zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZXJlJ3Mgbm8gcGFuZWwgYXQgYWxsICovCisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7CiAgICAgfQogICAgIHBvID0gZmluZF9wbyhwYW4pOwogICAgIGlmIChwbyA9PSBOVUxMKSB7Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKLQkJCSJwYW5lbF9iZWxvdzogY2FuJ3QgZmluZCBQYW5lbCBPYmplY3QiKTsKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJwYW5lbF9iZWxvdzogY2FuJ3QgZmluZCBQYW5lbCBPYmplY3QiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogICAgIFB5X0lOQ1JFRihwbyk7CiAgICAgcmV0dXJuIChQeU9iamVjdCAqKXBvOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlB5Q3Vyc2VzX3VwZGF0ZV9wYW5lbHMoUHlPYmplY3QgKnNlbGYpCi17IAorewogICAgIFB5Q3Vyc2VzSW5pdGlhbGlzZWQ7CiAgICAgdXBkYXRlX3BhbmVscygpOwogICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKQEAgLTQ0OSw3ICs0NDksNyBAQAogICAgIHsibmV3X3BhbmVsIiwgICAgICAgICAgIChQeUNGdW5jdGlvbilQeUN1cnNlc19uZXdfcGFuZWwsICAgICBNRVRIX1ZBUkFSR1N9LAogICAgIHsidG9wX3BhbmVsIiwgICAgICAgICAgIChQeUNGdW5jdGlvbilQeUN1cnNlc190b3BfcGFuZWwsICAgICBNRVRIX05PQVJHU30sCiAgICAgeyJ1cGRhdGVfcGFuZWxzIiwgICAgICAgKFB5Q0Z1bmN0aW9uKVB5Q3Vyc2VzX3VwZGF0ZV9wYW5lbHMsIE1FVEhfTk9BUkdTfSwKLSAgICB7TlVMTCwJCU5VTEx9CQkvKiBzZW50aW5lbCAqLworICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiAvKiBJbml0aWFsaXphdGlvbiBmdW5jdGlvbiBmb3IgdGhlIG1vZHVsZSAqLwpAQCAtNDY3LDcgKzQ2Nyw3IEBACiAgICAgLyogQ3JlYXRlIHRoZSBtb2R1bGUgYW5kIGFkZCB0aGUgZnVuY3Rpb25zICovCiAgICAgbSA9IFB5X0luaXRNb2R1bGUoIl9jdXJzZXNfcGFuZWwiLCBQeUN1cnNlc19tZXRob2RzKTsKICAgICBpZiAobSA9PSBOVUxMKQotICAgIAlyZXR1cm47CisgICAgICAgIHJldHVybjsKICAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKIAogICAgIC8qIEZvciBleGNlcHRpb24gX2N1cnNlc19wYW5lbC5lcnJvciAqLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fZnVuY3Rvb2xzbW9kdWxlLmMgYi9Nb2R1bGVzL19mdW5jdG9vbHNtb2R1bGUuYwppbmRleCA1ZGZiYzE1Li4zZTBlMDc3IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19mdW5jdG9vbHNtb2R1bGUuYworKysgYi9Nb2R1bGVzL19mdW5jdG9vbHNtb2R1bGUuYwpAQCAtMiw3ICsyLDcgQEAKICNpbmNsdWRlICJQeXRob24uaCIKICNpbmNsdWRlICJzdHJ1Y3RtZW1iZXIuaCIKIAotLyogX2Z1bmN0b29scyBtb2R1bGUgd3JpdHRlbiBhbmQgbWFpbnRhaW5lZCAKKy8qIF9mdW5jdG9vbHMgbW9kdWxlIHdyaXR0ZW4gYW5kIG1haW50YWluZWQKICAgIGJ5IEh5ZS1TaGlrIENoYW5nIDxwZXJreUBGcmVlQlNELm9yZz4KICAgIHdpdGggYWRhcHRhdGlvbnMgYnkgUmF5bW9uZCBIZXR0aW5nZXIgPHB5dGhvbkByY24uY29tPgogICAgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1LCAyMDA2IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgpAQCAtMTQsNjQgKzE0LDY0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZnVuY3Rvb2xzX3JlZHVjZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKnNlcSwgKmZ1bmMsICpyZXN1bHQgPSBOVUxMLCAqaXQ7CisgICAgUHlPYmplY3QgKnNlcSwgKmZ1bmMsICpyZXN1bHQgPSBOVUxMLCAqaXQ7CiAKLQlpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJyZWR1Y2UiLCAyLCAzLCAmZnVuYywgJnNlcSwgJnJlc3VsdCkpCi0JCXJldHVybiBOVUxMOwotCWlmIChyZXN1bHQgIT0gTlVMTCkKLQkJUHlfSU5DUkVGKHJlc3VsdCk7CisgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAicmVkdWNlIiwgMiwgMywgJmZ1bmMsICZzZXEsICZyZXN1bHQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAocmVzdWx0ICE9IE5VTEwpCisgICAgICAgIFB5X0lOQ1JFRihyZXN1bHQpOwogCi0JaXQgPSBQeU9iamVjdF9HZXRJdGVyKHNlcSk7Ci0JaWYgKGl0ID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJICAgICJyZWR1Y2UoKSBhcmcgMiBtdXN0IHN1cHBvcnQgaXRlcmF0aW9uIik7Ci0JCVB5X1hERUNSRUYocmVzdWx0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGl0ID0gUHlPYmplY3RfR2V0SXRlcihzZXEpOworICAgIGlmIChpdCA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAicmVkdWNlKCkgYXJnIDIgbXVzdCBzdXBwb3J0IGl0ZXJhdGlvbiIpOworICAgICAgICBQeV9YREVDUkVGKHJlc3VsdCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWlmICgoYXJncyA9IFB5VHVwbGVfTmV3KDIpKSA9PSBOVUxMKQotCQlnb3RvIEZhaWw7CisgICAgaWYgKChhcmdzID0gUHlUdXBsZV9OZXcoMikpID09IE5VTEwpCisgICAgICAgIGdvdG8gRmFpbDsKIAotCWZvciAoOzspIHsKLQkJUHlPYmplY3QgKm9wMjsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIFB5T2JqZWN0ICpvcDI7CiAKLQkJaWYgKGFyZ3MtPm9iX3JlZmNudCA+IDEpIHsKLQkJCVB5X0RFQ1JFRihhcmdzKTsKLQkJCWlmICgoYXJncyA9IFB5VHVwbGVfTmV3KDIpKSA9PSBOVUxMKQotCQkJCWdvdG8gRmFpbDsKLQkJfQorICAgICAgICBpZiAoYXJncy0+b2JfcmVmY250ID4gMSkgeworICAgICAgICAgICAgUHlfREVDUkVGKGFyZ3MpOworICAgICAgICAgICAgaWYgKChhcmdzID0gUHlUdXBsZV9OZXcoMikpID09IE5VTEwpCisgICAgICAgICAgICAgICAgZ290byBGYWlsOworICAgICAgICB9CiAKLQkJb3AyID0gUHlJdGVyX05leHQoaXQpOwotCQlpZiAob3AyID09IE5VTEwpIHsKLQkJCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQkJCWdvdG8gRmFpbDsKLSAJCQlicmVhazsKLQkJfQorICAgICAgICBvcDIgPSBQeUl0ZXJfTmV4dChpdCk7CisgICAgICAgIGlmIChvcDIgPT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICAgICAgZ290byBGYWlsOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KIAotCQlpZiAocmVzdWx0ID09IE5VTEwpCi0JCQlyZXN1bHQgPSBvcDI7Ci0JCWVsc2UgewotCQkJUHlUdXBsZV9TZXRJdGVtKGFyZ3MsIDAsIHJlc3VsdCk7Ci0JCQlQeVR1cGxlX1NldEl0ZW0oYXJncywgMSwgb3AyKTsKLQkJCWlmICgocmVzdWx0ID0gUHlFdmFsX0NhbGxPYmplY3QoZnVuYywgYXJncykpID09IE5VTEwpCi0JCQkJZ290byBGYWlsOwotCQl9Ci0JfQorICAgICAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgICAgICByZXN1bHQgPSBvcDI7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgUHlUdXBsZV9TZXRJdGVtKGFyZ3MsIDAsIHJlc3VsdCk7CisgICAgICAgICAgICBQeVR1cGxlX1NldEl0ZW0oYXJncywgMSwgb3AyKTsKKyAgICAgICAgICAgIGlmICgocmVzdWx0ID0gUHlFdmFsX0NhbGxPYmplY3QoZnVuYywgYXJncykpID09IE5VTEwpCisgICAgICAgICAgICAgICAgZ290byBGYWlsOworICAgICAgICB9CisgICAgfQogCi0JUHlfREVDUkVGKGFyZ3MpOworICAgIFB5X0RFQ1JFRihhcmdzKTsKIAotCWlmIChyZXN1bHQgPT0gTlVMTCkKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICJyZWR1Y2UoKSBvZiBlbXB0eSBzZXF1ZW5jZSB3aXRoIG5vIGluaXRpYWwgdmFsdWUiKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgInJlZHVjZSgpIG9mIGVtcHR5IHNlcXVlbmNlIHdpdGggbm8gaW5pdGlhbCB2YWx1ZSIpOwogCi0JUHlfREVDUkVGKGl0KTsKLQlyZXR1cm4gcmVzdWx0OworICAgIFB5X0RFQ1JFRihpdCk7CisgICAgcmV0dXJuIHJlc3VsdDsKIAogRmFpbDoKLQlQeV9YREVDUkVGKGFyZ3MpOwotCVB5X1hERUNSRUYocmVzdWx0KTsKLQlQeV9ERUNSRUYoaXQpOwotCXJldHVybiBOVUxMOworICAgIFB5X1hERUNSRUYoYXJncyk7CisgICAgUHlfWERFQ1JFRihyZXN1bHQpOworICAgIFB5X0RFQ1JFRihpdCk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIFB5RG9jX1NUUlZBUihyZWR1Y2VfZG9jLApAQCAtOTAsMTIgKzkwLDEyIEBACiAvKiBwYXJ0aWFsIG9iamVjdCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCVB5T2JqZWN0ICpmbjsKLQlQeU9iamVjdCAqYXJnczsKLQlQeU9iamVjdCAqa3c7Ci0JUHlPYmplY3QgKmRpY3Q7Ci0JUHlPYmplY3QgKndlYWtyZWZsaXN0OyAvKiBMaXN0IG9mIHdlYWsgcmVmZXJlbmNlcyAqLworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBQeU9iamVjdCAqZm47CisgICAgUHlPYmplY3QgKmFyZ3M7CisgICAgUHlPYmplY3QgKmt3OworICAgIFB5T2JqZWN0ICpkaWN0OworICAgIFB5T2JqZWN0ICp3ZWFrcmVmbGlzdDsgLyogTGlzdCBvZiB3ZWFrIHJlZmVyZW5jZXMgKi8KIH0gcGFydGlhbG9iamVjdDsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBwYXJ0aWFsX3R5cGU7CkBAIC0xMDMsMjE5ICsxMDMsMjE5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogcGFydGlhbF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3KQogewotCVB5T2JqZWN0ICpmdW5jOwotCXBhcnRpYWxvYmplY3QgKnB0bzsKKyAgICBQeU9iamVjdCAqZnVuYzsKKyAgICBwYXJ0aWFsb2JqZWN0ICpwdG87CiAKLQlpZiAoUHlUdXBsZV9HRVRfU0laRShhcmdzKSA8IDEpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkidHlwZSAncGFydGlhbCcgdGFrZXMgYXQgbGVhc3Qgb25lIGFyZ3VtZW50Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoUHlUdXBsZV9HRVRfU0laRShhcmdzKSA8IDEpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlICdwYXJ0aWFsJyB0YWtlcyBhdCBsZWFzdCBvbmUgYXJndW1lbnQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JZnVuYyA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgMCk7Ci0JaWYgKCFQeUNhbGxhYmxlX0NoZWNrKGZ1bmMpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJInRoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIGNhbGxhYmxlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBmdW5jID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCAwKTsKKyAgICBpZiAoIVB5Q2FsbGFibGVfQ2hlY2soZnVuYykpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0aGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBjYWxsYWJsZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQkvKiBjcmVhdGUgcGFydGlhbG9iamVjdCBzdHJ1Y3R1cmUgKi8KLQlwdG8gPSAocGFydGlhbG9iamVjdCAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOwotCWlmIChwdG8gPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgLyogY3JlYXRlIHBhcnRpYWxvYmplY3Qgc3RydWN0dXJlICovCisgICAgcHRvID0gKHBhcnRpYWxvYmplY3QgKil0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKKyAgICBpZiAocHRvID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JcHRvLT5mbiA9IGZ1bmM7Ci0JUHlfSU5DUkVGKGZ1bmMpOwotCXB0by0+YXJncyA9IFB5VHVwbGVfR2V0U2xpY2UoYXJncywgMSwgUFlfU1NJWkVfVF9NQVgpOwotCWlmIChwdG8tPmFyZ3MgPT0gTlVMTCkgewotCQlwdG8tPmt3ID0gTlVMTDsKLQkJUHlfREVDUkVGKHB0byk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoa3cgIT0gTlVMTCkgewotCQlwdG8tPmt3ID0gUHlEaWN0X0NvcHkoa3cpOwotCQlpZiAocHRvLT5rdyA9PSBOVUxMKSB7Ci0JCQlQeV9ERUNSRUYocHRvKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfSBlbHNlIHsKLQkJcHRvLT5rdyA9IFB5X05vbmU7Ci0JCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQl9CisgICAgcHRvLT5mbiA9IGZ1bmM7CisgICAgUHlfSU5DUkVGKGZ1bmMpOworICAgIHB0by0+YXJncyA9IFB5VHVwbGVfR2V0U2xpY2UoYXJncywgMSwgUFlfU1NJWkVfVF9NQVgpOworICAgIGlmIChwdG8tPmFyZ3MgPT0gTlVMTCkgeworICAgICAgICBwdG8tPmt3ID0gTlVMTDsKKyAgICAgICAgUHlfREVDUkVGKHB0byk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoa3cgIT0gTlVMTCkgeworICAgICAgICBwdG8tPmt3ID0gUHlEaWN0X0NvcHkoa3cpOworICAgICAgICBpZiAocHRvLT5rdyA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYocHRvKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHRvLT5rdyA9IFB5X05vbmU7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICB9CiAKLQlwdG8tPndlYWtyZWZsaXN0ID0gTlVMTDsKLQlwdG8tPmRpY3QgPSBOVUxMOworICAgIHB0by0+d2Vha3JlZmxpc3QgPSBOVUxMOworICAgIHB0by0+ZGljdCA9IE5VTEw7CiAKLQlyZXR1cm4gKFB5T2JqZWN0ICopcHRvOworICAgIHJldHVybiAoUHlPYmplY3QgKilwdG87CiB9CiAKIHN0YXRpYyB2b2lkCiBwYXJ0aWFsX2RlYWxsb2MocGFydGlhbG9iamVjdCAqcHRvKQogewotCVB5T2JqZWN0X0dDX1VuVHJhY2socHRvKTsKLQlpZiAocHRvLT53ZWFrcmVmbGlzdCAhPSBOVUxMKQotCQlQeU9iamVjdF9DbGVhcldlYWtSZWZzKChQeU9iamVjdCAqKSBwdG8pOwotCVB5X1hERUNSRUYocHRvLT5mbik7Ci0JUHlfWERFQ1JFRihwdG8tPmFyZ3MpOwotCVB5X1hERUNSRUYocHRvLT5rdyk7Ci0JUHlfWERFQ1JFRihwdG8tPmRpY3QpOwotCVB5X1RZUEUocHRvKS0+dHBfZnJlZShwdG8pOworICAgIFB5T2JqZWN0X0dDX1VuVHJhY2socHRvKTsKKyAgICBpZiAocHRvLT53ZWFrcmVmbGlzdCAhPSBOVUxMKQorICAgICAgICBQeU9iamVjdF9DbGVhcldlYWtSZWZzKChQeU9iamVjdCAqKSBwdG8pOworICAgIFB5X1hERUNSRUYocHRvLT5mbik7CisgICAgUHlfWERFQ1JFRihwdG8tPmFyZ3MpOworICAgIFB5X1hERUNSRUYocHRvLT5rdyk7CisgICAgUHlfWERFQ1JFRihwdG8tPmRpY3QpOworICAgIFB5X1RZUEUocHRvKS0+dHBfZnJlZShwdG8pOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogcGFydGlhbF9jYWxsKHBhcnRpYWxvYmplY3QgKnB0bywgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprdykKIHsKLQlQeU9iamVjdCAqcmV0OwotCVB5T2JqZWN0ICphcmdhcHBsID0gTlVMTCwgKmt3YXBwbCA9IE5VTEw7CisgICAgUHlPYmplY3QgKnJldDsKKyAgICBQeU9iamVjdCAqYXJnYXBwbCA9IE5VTEwsICprd2FwcGwgPSBOVUxMOwogCi0JYXNzZXJ0IChQeUNhbGxhYmxlX0NoZWNrKHB0by0+Zm4pKTsKLQlhc3NlcnQgKFB5VHVwbGVfQ2hlY2socHRvLT5hcmdzKSk7Ci0JYXNzZXJ0IChwdG8tPmt3ID09IFB5X05vbmUgIHx8ICBQeURpY3RfQ2hlY2socHRvLT5rdykpOworICAgIGFzc2VydCAoUHlDYWxsYWJsZV9DaGVjayhwdG8tPmZuKSk7CisgICAgYXNzZXJ0IChQeVR1cGxlX0NoZWNrKHB0by0+YXJncykpOworICAgIGFzc2VydCAocHRvLT5rdyA9PSBQeV9Ob25lICB8fCAgUHlEaWN0X0NoZWNrKHB0by0+a3cpKTsKIAotCWlmIChQeVR1cGxlX0dFVF9TSVpFKHB0by0+YXJncykgPT0gMCkgewotCQlhcmdhcHBsID0gYXJnczsKLQkJUHlfSU5DUkVGKGFyZ3MpOwotCX0gZWxzZSBpZiAoUHlUdXBsZV9HRVRfU0laRShhcmdzKSA9PSAwKSB7Ci0JCWFyZ2FwcGwgPSBwdG8tPmFyZ3M7Ci0JCVB5X0lOQ1JFRihwdG8tPmFyZ3MpOwotCX0gZWxzZSB7Ci0JCWFyZ2FwcGwgPSBQeVNlcXVlbmNlX0NvbmNhdChwdG8tPmFyZ3MsIGFyZ3MpOwotCQlpZiAoYXJnYXBwbCA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChQeVR1cGxlX0dFVF9TSVpFKHB0by0+YXJncykgPT0gMCkgeworICAgICAgICBhcmdhcHBsID0gYXJnczsKKyAgICAgICAgUHlfSU5DUkVGKGFyZ3MpOworICAgIH0gZWxzZSBpZiAoUHlUdXBsZV9HRVRfU0laRShhcmdzKSA9PSAwKSB7CisgICAgICAgIGFyZ2FwcGwgPSBwdG8tPmFyZ3M7CisgICAgICAgIFB5X0lOQ1JFRihwdG8tPmFyZ3MpOworICAgIH0gZWxzZSB7CisgICAgICAgIGFyZ2FwcGwgPSBQeVNlcXVlbmNlX0NvbmNhdChwdG8tPmFyZ3MsIGFyZ3MpOworICAgICAgICBpZiAoYXJnYXBwbCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaWYgKHB0by0+a3cgPT0gUHlfTm9uZSkgewotCQlrd2FwcGwgPSBrdzsKLQkJUHlfWElOQ1JFRihrdyk7Ci0JfSBlbHNlIHsKLQkJa3dhcHBsID0gUHlEaWN0X0NvcHkocHRvLT5rdyk7Ci0JCWlmIChrd2FwcGwgPT0gTlVMTCkgewotCQkJUHlfREVDUkVGKGFyZ2FwcGwpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJaWYgKGt3ICE9IE5VTEwpIHsKLQkJCWlmIChQeURpY3RfTWVyZ2Uoa3dhcHBsLCBrdywgMSkgIT0gMCkgewotCQkJCVB5X0RFQ1JFRihhcmdhcHBsKTsKLQkJCQlQeV9ERUNSRUYoa3dhcHBsKTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJfQotCX0KKyAgICBpZiAocHRvLT5rdyA9PSBQeV9Ob25lKSB7CisgICAgICAgIGt3YXBwbCA9IGt3OworICAgICAgICBQeV9YSU5DUkVGKGt3KTsKKyAgICB9IGVsc2UgeworICAgICAgICBrd2FwcGwgPSBQeURpY3RfQ29weShwdG8tPmt3KTsKKyAgICAgICAgaWYgKGt3YXBwbCA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoYXJnYXBwbCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoa3cgIT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKFB5RGljdF9NZXJnZShrd2FwcGwsIGt3LCAxKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGFyZ2FwcGwpOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihrd2FwcGwpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogCi0JcmV0ID0gUHlPYmplY3RfQ2FsbChwdG8tPmZuLCBhcmdhcHBsLCBrd2FwcGwpOwotCVB5X0RFQ1JFRihhcmdhcHBsKTsKLQlQeV9YREVDUkVGKGt3YXBwbCk7Ci0JcmV0dXJuIHJldDsKKyAgICByZXQgPSBQeU9iamVjdF9DYWxsKHB0by0+Zm4sIGFyZ2FwcGwsIGt3YXBwbCk7CisgICAgUHlfREVDUkVGKGFyZ2FwcGwpOworICAgIFB5X1hERUNSRUYoa3dhcHBsKTsKKyAgICByZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50CiBwYXJ0aWFsX3RyYXZlcnNlKHBhcnRpYWxvYmplY3QgKnB0bywgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JUHlfVklTSVQocHRvLT5mbik7Ci0JUHlfVklTSVQocHRvLT5hcmdzKTsKLQlQeV9WSVNJVChwdG8tPmt3KTsKLQlQeV9WSVNJVChwdG8tPmRpY3QpOwotCXJldHVybiAwOworICAgIFB5X1ZJU0lUKHB0by0+Zm4pOworICAgIFB5X1ZJU0lUKHB0by0+YXJncyk7CisgICAgUHlfVklTSVQocHRvLT5rdyk7CisgICAgUHlfVklTSVQocHRvLT5kaWN0KTsKKyAgICByZXR1cm4gMDsKIH0KIAogUHlEb2NfU1RSVkFSKHBhcnRpYWxfZG9jLAogInBhcnRpYWwoZnVuYywgKmFyZ3MsICoqa2V5d29yZHMpIC0gbmV3IGZ1bmN0aW9uIHdpdGggcGFydGlhbCBhcHBsaWNhdGlvblxuXAotCW9mIHRoZSBnaXZlbiBhcmd1bWVudHMgYW5kIGtleXdvcmRzLlxuIik7CisgICAgb2YgdGhlIGdpdmVuIGFyZ3VtZW50cyBhbmQga2V5d29yZHMuXG4iKTsKIAogI2RlZmluZSBPRkYoeCkgb2Zmc2V0b2YocGFydGlhbG9iamVjdCwgeCkKIHN0YXRpYyBQeU1lbWJlckRlZiBwYXJ0aWFsX21lbWJlcmxpc3RbXSA9IHsKLQl7ImZ1bmMiLAlUX09CSkVDVCwJT0ZGKGZuKSwJUkVBRE9OTFksCi0JICJmdW5jdGlvbiBvYmplY3QgdG8gdXNlIGluIGZ1dHVyZSBwYXJ0aWFsIGNhbGxzIn0sCi0JeyJhcmdzIiwJVF9PQkpFQ1QsCU9GRihhcmdzKSwJUkVBRE9OTFksCi0JICJ0dXBsZSBvZiBhcmd1bWVudHMgdG8gZnV0dXJlIHBhcnRpYWwgY2FsbHMifSwKLQl7ImtleXdvcmRzIiwJVF9PQkpFQ1QsCU9GRihrdyksCVJFQURPTkxZLAotCSAiZGljdGlvbmFyeSBvZiBrZXl3b3JkIGFyZ3VtZW50cyB0byBmdXR1cmUgcGFydGlhbCBjYWxscyJ9LAotCXtOVUxMfSAgLyogU2VudGluZWwgKi8KKyAgICB7ImZ1bmMiLCAgICAgICAgICAgIFRfT0JKRUNULCAgICAgICBPRkYoZm4pLCAgICAgICAgUkVBRE9OTFksCisgICAgICJmdW5jdGlvbiBvYmplY3QgdG8gdXNlIGluIGZ1dHVyZSBwYXJ0aWFsIGNhbGxzIn0sCisgICAgeyJhcmdzIiwgICAgICAgICAgICBUX09CSkVDVCwgICAgICAgT0ZGKGFyZ3MpLCAgICAgIFJFQURPTkxZLAorICAgICAidHVwbGUgb2YgYXJndW1lbnRzIHRvIGZ1dHVyZSBwYXJ0aWFsIGNhbGxzIn0sCisgICAgeyJrZXl3b3JkcyIsICAgICAgICBUX09CSkVDVCwgICAgICAgT0ZGKGt3KSwgICAgICAgIFJFQURPTkxZLAorICAgICAiZGljdGlvbmFyeSBvZiBrZXl3b3JkIGFyZ3VtZW50cyB0byBmdXR1cmUgcGFydGlhbCBjYWxscyJ9LAorICAgIHtOVUxMfSAgLyogU2VudGluZWwgKi8KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBwYXJ0aWFsX2dldF9kaWN0KHBhcnRpYWxvYmplY3QgKnB0bykKIHsKLQlpZiAocHRvLT5kaWN0ID09IE5VTEwpIHsKLQkJcHRvLT5kaWN0ID0gUHlEaWN0X05ldygpOwotCQlpZiAocHRvLT5kaWN0ID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0JUHlfSU5DUkVGKHB0by0+ZGljdCk7Ci0JcmV0dXJuIHB0by0+ZGljdDsKKyAgICBpZiAocHRvLT5kaWN0ID09IE5VTEwpIHsKKyAgICAgICAgcHRvLT5kaWN0ID0gUHlEaWN0X05ldygpOworICAgICAgICBpZiAocHRvLT5kaWN0ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlfSU5DUkVGKHB0by0+ZGljdCk7CisgICAgcmV0dXJuIHB0by0+ZGljdDsKIH0KIAogc3RhdGljIGludAogcGFydGlhbF9zZXRfZGljdChwYXJ0aWFsb2JqZWN0ICpwdG8sIFB5T2JqZWN0ICp2YWx1ZSkKIHsKLQlQeU9iamVjdCAqdG1wOworICAgIFB5T2JqZWN0ICp0bXA7CiAKLQkvKiBJdCBpcyBpbGxlZ2FsIHRvIGRlbCBwLl9fZGljdF9fICovCi0JaWYgKHZhbHVlID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiYSBwYXJ0aWFsIG9iamVjdCdzIGRpY3Rpb25hcnkgbWF5IG5vdCBiZSBkZWxldGVkIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JLyogQ2FuIG9ubHkgc2V0IF9fZGljdF9fIHRvIGEgZGljdGlvbmFyeSAqLwotCWlmICghUHlEaWN0X0NoZWNrKHZhbHVlKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJzZXR0aW5nIHBhcnRpYWwgb2JqZWN0J3MgZGljdGlvbmFyeSB0byBhIG5vbi1kaWN0Iik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JdG1wID0gcHRvLT5kaWN0OwotCVB5X0lOQ1JFRih2YWx1ZSk7Ci0JcHRvLT5kaWN0ID0gdmFsdWU7Ci0JUHlfWERFQ1JFRih0bXApOwotCXJldHVybiAwOworICAgIC8qIEl0IGlzIGlsbGVnYWwgdG8gZGVsIHAuX19kaWN0X18gKi8KKyAgICBpZiAodmFsdWUgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImEgcGFydGlhbCBvYmplY3QncyBkaWN0aW9uYXJ5IG1heSBub3QgYmUgZGVsZXRlZCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIC8qIENhbiBvbmx5IHNldCBfX2RpY3RfXyB0byBhIGRpY3Rpb25hcnkgKi8KKyAgICBpZiAoIVB5RGljdF9DaGVjayh2YWx1ZSkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJzZXR0aW5nIHBhcnRpYWwgb2JqZWN0J3MgZGljdGlvbmFyeSB0byBhIG5vbi1kaWN0Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgdG1wID0gcHRvLT5kaWN0OworICAgIFB5X0lOQ1JFRih2YWx1ZSk7CisgICAgcHRvLT5kaWN0ID0gdmFsdWU7CisgICAgUHlfWERFQ1JFRih0bXApOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlHZXRTZXREZWYgcGFydGlhbF9nZXRzZXRsaXN0W10gPSB7Ci0JeyJfX2RpY3RfXyIsIChnZXR0ZXIpcGFydGlhbF9nZXRfZGljdCwgKHNldHRlcilwYXJ0aWFsX3NldF9kaWN0fSwKLQl7TlVMTH0gLyogU2VudGluZWwgKi8KKyAgICB7Il9fZGljdF9fIiwgKGdldHRlcilwYXJ0aWFsX2dldF9kaWN0LCAoc2V0dGVyKXBhcnRpYWxfc2V0X2RpY3R9LAorICAgIHtOVUxMfSAvKiBTZW50aW5lbCAqLwogfTsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBwYXJ0aWFsX3R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JImZ1bmN0b29scy5wYXJ0aWFsIiwJCS8qIHRwX25hbWUgKi8KLQlzaXplb2YocGFydGlhbG9iamVjdCksCQkvKiB0cF9iYXNpY3NpemUgKi8KLQkwLAkJCQkvKiB0cF9pdGVtc2l6ZSAqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcilwYXJ0aWFsX2RlYWxsb2MsCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJLyogdHBfY29tcGFyZSAqLwotCTAsCQkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkvKiB0cF9oYXNoICovCi0JKHRlcm5hcnlmdW5jKXBhcnRpYWxfY2FsbCwJLyogdHBfY2FsbCAqLwotCTAsCQkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkvKiB0cF9nZXRhdHRybyAqLwotCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLAkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQyB8Ci0JCVB5X1RQRkxBR1NfQkFTRVRZUEUgfCBQeV9UUEZMQUdTX0hBVkVfV0VBS1JFRlMsCS8qIHRwX2ZsYWdzICovCi0JcGFydGlhbF9kb2MsCQkJLyogdHBfZG9jICovCi0JKHRyYXZlcnNlcHJvYylwYXJ0aWFsX3RyYXZlcnNlLAkvKiB0cF90cmF2ZXJzZSAqLwotCTAsCQkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQlvZmZzZXRvZihwYXJ0aWFsb2JqZWN0LCB3ZWFrcmVmbGlzdCksCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JMCwJCQkJLyogdHBfaXRlciAqLwotCTAsCQkJCS8qIHRwX2l0ZXJuZXh0ICovCi0JMCwJCQkJLyogdHBfbWV0aG9kcyAqLwotCXBhcnRpYWxfbWVtYmVybGlzdCwJCS8qIHRwX21lbWJlcnMgKi8KLQlwYXJ0aWFsX2dldHNldGxpc3QsCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCW9mZnNldG9mKHBhcnRpYWxvYmplY3QsIGRpY3QpLAkvKiB0cF9kaWN0b2Zmc2V0ICovCi0JMCwJCQkJLyogdHBfaW5pdCAqLwotCTAsCQkJCS8qIHRwX2FsbG9jICovCi0JcGFydGlhbF9uZXcsCQkJLyogdHBfbmV3ICovCi0JUHlPYmplY3RfR0NfRGVsLAkJLyogdHBfZnJlZSAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQorICAgICJmdW5jdG9vbHMucGFydGlhbCIsICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICBzaXplb2YocGFydGlhbG9iamVjdCksICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcilwYXJ0aWFsX2RlYWxsb2MsICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgICh0ZXJuYXJ5ZnVuYylwYXJ0aWFsX2NhbGwsICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDIHwKKyAgICAgICAgUHlfVFBGTEFHU19CQVNFVFlQRSB8IFB5X1RQRkxBR1NfSEFWRV9XRUFLUkVGUywgICAgICAgICAvKiB0cF9mbGFncyAqLworICAgIHBhcnRpYWxfZG9jLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2MpcGFydGlhbF90cmF2ZXJzZSwgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIG9mZnNldG9mKHBhcnRpYWxvYmplY3QsIHdlYWtyZWZsaXN0KSwgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgcGFydGlhbF9tZW1iZXJsaXN0LCAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIHBhcnRpYWxfZ2V0c2V0bGlzdCwgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgb2Zmc2V0b2YocGFydGlhbG9iamVjdCwgZGljdCksICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIHBhcnRpYWxfbmV3LCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworICAgIFB5T2JqZWN0X0dDX0RlbCwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KIH07CiAKIApAQCAtMzI1LDMxICszMjUsMzEgQEAKICJUb29scyB0aGF0IG9wZXJhdGUgb24gZnVuY3Rpb25zLiIpOwogCiBzdGF0aWMgUHlNZXRob2REZWYgbW9kdWxlX21ldGhvZHNbXSA9IHsKLSAJeyJyZWR1Y2UiLAlmdW5jdG9vbHNfcmVkdWNlLCAgICAgTUVUSF9WQVJBUkdTLCByZWR1Y2VfZG9jfSwKLSAJe05VTEwsCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7InJlZHVjZSIsICAgICAgICAgIGZ1bmN0b29sc19yZWR1Y2UsICAgICBNRVRIX1ZBUkFSR1MsIHJlZHVjZV9kb2N9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiBQeU1PRElOSVRfRlVOQwogaW5pdF9mdW5jdG9vbHModm9pZCkKIHsKLQlpbnQgaTsKLQlQeU9iamVjdCAqbTsKLQljaGFyICpuYW1lOwotCVB5VHlwZU9iamVjdCAqdHlwZWxpc3RbXSA9IHsKLQkJJnBhcnRpYWxfdHlwZSwKLQkJTlVMTAotCX07CisgICAgaW50IGk7CisgICAgUHlPYmplY3QgKm07CisgICAgY2hhciAqbmFtZTsKKyAgICBQeVR5cGVPYmplY3QgKnR5cGVsaXN0W10gPSB7CisgICAgICAgICZwYXJ0aWFsX3R5cGUsCisgICAgICAgIE5VTEwKKyAgICB9OwogCi0JbSA9IFB5X0luaXRNb2R1bGUzKCJfZnVuY3Rvb2xzIiwgbW9kdWxlX21ldGhvZHMsIG1vZHVsZV9kb2MpOwotCWlmIChtID09IE5VTEwpCi0JCXJldHVybjsKKyAgICBtID0gUHlfSW5pdE1vZHVsZTMoIl9mdW5jdG9vbHMiLCBtb2R1bGVfbWV0aG9kcywgbW9kdWxlX2RvYyk7CisgICAgaWYgKG0gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOwogCi0JZm9yIChpPTAgOyB0eXBlbGlzdFtpXSAhPSBOVUxMIDsgaSsrKSB7Ci0JCWlmIChQeVR5cGVfUmVhZHkodHlwZWxpc3RbaV0pIDwgMCkKLQkJCXJldHVybjsKLQkJbmFtZSA9IHN0cmNocih0eXBlbGlzdFtpXS0+dHBfbmFtZSwgJy4nKTsKLQkJYXNzZXJ0IChuYW1lICE9IE5VTEwpOwotCQlQeV9JTkNSRUYodHlwZWxpc3RbaV0pOwotCQlQeU1vZHVsZV9BZGRPYmplY3QobSwgbmFtZSsxLCAoUHlPYmplY3QgKil0eXBlbGlzdFtpXSk7Ci0JfQorICAgIGZvciAoaT0wIDsgdHlwZWxpc3RbaV0gIT0gTlVMTCA7IGkrKykgeworICAgICAgICBpZiAoUHlUeXBlX1JlYWR5KHR5cGVsaXN0W2ldKSA8IDApCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIG5hbWUgPSBzdHJjaHIodHlwZWxpc3RbaV0tPnRwX25hbWUsICcuJyk7CisgICAgICAgIGFzc2VydCAobmFtZSAhPSBOVUxMKTsKKyAgICAgICAgUHlfSU5DUkVGKHR5cGVsaXN0W2ldKTsKKyAgICAgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sIG5hbWUrMSwgKFB5T2JqZWN0ICopdHlwZWxpc3RbaV0pOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvX2hlYXBxbW9kdWxlLmMgYi9Nb2R1bGVzL19oZWFwcW1vZHVsZS5jCmluZGV4IDRmZDBkZDUuLmY3MDVlYzEgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2hlYXBxbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9faGVhcHFtb2R1bGUuYwpAQCAtMSw0ICsxLDQgQEAKLS8qIERyb3AgaW4gcmVwbGFjZW1lbnQgZm9yIGhlYXBxLnB5IAorLyogRHJvcCBpbiByZXBsYWNlbWVudCBmb3IgaGVhcHEucHkKIAogQyBpbXBsZW1lbnRhdGlvbiBkZXJpdmVkIGRpcmVjdGx5IGZyb20gaGVhcHEucHkgaW4gUHkyLjMKIHdoaWNoIHdhcyB3cml0dGVuIGJ5IEtldmluIE8nQ29ubm9yLCBhdWdtZW50ZWQgYnkgVGltIFBldGVycywKQEAgLTE2LDEyOCArMTYsMTI4IEBACiBzdGF0aWMgaW50CiBjbXBfbHQoUHlPYmplY3QgKngsIFB5T2JqZWN0ICp5KQogewotCWludCBjbXA7Ci0Jc3RhdGljIFB5T2JqZWN0ICpsdCA9IE5VTEw7CisgICAgaW50IGNtcDsKKyAgICBzdGF0aWMgUHlPYmplY3QgKmx0ID0gTlVMTDsKIAotCWlmIChsdCA9PSBOVUxMKSB7Ci0JCWx0ID0gUHlTdHJpbmdfRnJvbVN0cmluZygiX19sdF9fIik7Ci0JCWlmIChsdCA9PSBOVUxMKQotCQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoUHlPYmplY3RfSGFzQXR0cih4LCBsdCkpCi0JCXJldHVybiBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woeCwgeSwgUHlfTFQpOwotCWNtcCA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbCh5LCB4LCBQeV9MRSk7Ci0JaWYgKGNtcCAhPSAtMSkKLQkJY21wID0gMSAtIGNtcDsKLQlyZXR1cm4gY21wOworICAgIGlmIChsdCA9PSBOVUxMKSB7CisgICAgICAgIGx0ID0gUHlTdHJpbmdfRnJvbVN0cmluZygiX19sdF9fIik7CisgICAgICAgIGlmIChsdCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoUHlPYmplY3RfSGFzQXR0cih4LCBsdCkpCisgICAgICAgIHJldHVybiBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woeCwgeSwgUHlfTFQpOworICAgIGNtcCA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbCh5LCB4LCBQeV9MRSk7CisgICAgaWYgKGNtcCAhPSAtMSkKKyAgICAgICAgY21wID0gMSAtIGNtcDsKKyAgICByZXR1cm4gY21wOwogfQogCiBzdGF0aWMgaW50CiBfc2lmdGRvd24oUHlMaXN0T2JqZWN0ICpoZWFwLCBQeV9zc2l6ZV90IHN0YXJ0cG9zLCBQeV9zc2l6ZV90IHBvcykKIHsKLQlQeU9iamVjdCAqbmV3aXRlbSwgKnBhcmVudDsKLQlpbnQgY21wOwotCVB5X3NzaXplX3QgcGFyZW50cG9zOworICAgIFB5T2JqZWN0ICpuZXdpdGVtLCAqcGFyZW50OworICAgIGludCBjbXA7CisgICAgUHlfc3NpemVfdCBwYXJlbnRwb3M7CiAKLQlhc3NlcnQoUHlMaXN0X0NoZWNrKGhlYXApKTsKLQlpZiAocG9zID49IFB5TGlzdF9HRVRfU0laRShoZWFwKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwgImluZGV4IG91dCBvZiByYW5nZSIpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIGFzc2VydChQeUxpc3RfQ2hlY2soaGVhcCkpOworICAgIGlmIChwb3MgPj0gUHlMaXN0X0dFVF9TSVpFKGhlYXApKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLCAiaW5kZXggb3V0IG9mIHJhbmdlIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQluZXdpdGVtID0gUHlMaXN0X0dFVF9JVEVNKGhlYXAsIHBvcyk7Ci0JUHlfSU5DUkVGKG5ld2l0ZW0pOwotCS8qIEZvbGxvdyB0aGUgcGF0aCB0byB0aGUgcm9vdCwgbW92aW5nIHBhcmVudHMgZG93biB1bnRpbCBmaW5kaW5nCi0JICAgYSBwbGFjZSBuZXdpdGVtIGZpdHMuICovCi0Jd2hpbGUgKHBvcyA+IHN0YXJ0cG9zKXsKLQkJcGFyZW50cG9zID0gKHBvcyAtIDEpID4+IDE7Ci0JCXBhcmVudCA9IFB5TGlzdF9HRVRfSVRFTShoZWFwLCBwYXJlbnRwb3MpOwotCQljbXAgPSBjbXBfbHQobmV3aXRlbSwgcGFyZW50KTsKLQkJaWYgKGNtcCA9PSAtMSkgewotCQkJUHlfREVDUkVGKG5ld2l0ZW0pOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWlmIChjbXAgPT0gMCkKLQkJCWJyZWFrOwotCQlQeV9JTkNSRUYocGFyZW50KTsKLQkJUHlfREVDUkVGKFB5TGlzdF9HRVRfSVRFTShoZWFwLCBwb3MpKTsKLQkJUHlMaXN0X1NFVF9JVEVNKGhlYXAsIHBvcywgcGFyZW50KTsKLQkJcG9zID0gcGFyZW50cG9zOwotCX0KLQlQeV9ERUNSRUYoUHlMaXN0X0dFVF9JVEVNKGhlYXAsIHBvcykpOwotCVB5TGlzdF9TRVRfSVRFTShoZWFwLCBwb3MsIG5ld2l0ZW0pOwotCXJldHVybiAwOworICAgIG5ld2l0ZW0gPSBQeUxpc3RfR0VUX0lURU0oaGVhcCwgcG9zKTsKKyAgICBQeV9JTkNSRUYobmV3aXRlbSk7CisgICAgLyogRm9sbG93IHRoZSBwYXRoIHRvIHRoZSByb290LCBtb3ZpbmcgcGFyZW50cyBkb3duIHVudGlsIGZpbmRpbmcKKyAgICAgICBhIHBsYWNlIG5ld2l0ZW0gZml0cy4gKi8KKyAgICB3aGlsZSAocG9zID4gc3RhcnRwb3MpeworICAgICAgICBwYXJlbnRwb3MgPSAocG9zIC0gMSkgPj4gMTsKKyAgICAgICAgcGFyZW50ID0gUHlMaXN0X0dFVF9JVEVNKGhlYXAsIHBhcmVudHBvcyk7CisgICAgICAgIGNtcCA9IGNtcF9sdChuZXdpdGVtLCBwYXJlbnQpOworICAgICAgICBpZiAoY21wID09IC0xKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYobmV3aXRlbSk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNtcCA9PSAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIFB5X0lOQ1JFRihwYXJlbnQpOworICAgICAgICBQeV9ERUNSRUYoUHlMaXN0X0dFVF9JVEVNKGhlYXAsIHBvcykpOworICAgICAgICBQeUxpc3RfU0VUX0lURU0oaGVhcCwgcG9zLCBwYXJlbnQpOworICAgICAgICBwb3MgPSBwYXJlbnRwb3M7CisgICAgfQorICAgIFB5X0RFQ1JFRihQeUxpc3RfR0VUX0lURU0oaGVhcCwgcG9zKSk7CisgICAgUHlMaXN0X1NFVF9JVEVNKGhlYXAsIHBvcywgbmV3aXRlbSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIF9zaWZ0dXAoUHlMaXN0T2JqZWN0ICpoZWFwLCBQeV9zc2l6ZV90IHBvcykKIHsKLQlQeV9zc2l6ZV90IHN0YXJ0cG9zLCBlbmRwb3MsIGNoaWxkcG9zLCByaWdodHBvczsKLQlpbnQgY21wOwotCVB5T2JqZWN0ICpuZXdpdGVtLCAqdG1wOworICAgIFB5X3NzaXplX3Qgc3RhcnRwb3MsIGVuZHBvcywgY2hpbGRwb3MsIHJpZ2h0cG9zOworICAgIGludCBjbXA7CisgICAgUHlPYmplY3QgKm5ld2l0ZW0sICp0bXA7CiAKLQlhc3NlcnQoUHlMaXN0X0NoZWNrKGhlYXApKTsKLQllbmRwb3MgPSBQeUxpc3RfR0VUX1NJWkUoaGVhcCk7Ci0Jc3RhcnRwb3MgPSBwb3M7Ci0JaWYgKHBvcyA+PSBlbmRwb3MpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsICJpbmRleCBvdXQgb2YgcmFuZ2UiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQluZXdpdGVtID0gUHlMaXN0X0dFVF9JVEVNKGhlYXAsIHBvcyk7Ci0JUHlfSU5DUkVGKG5ld2l0ZW0pOworICAgIGFzc2VydChQeUxpc3RfQ2hlY2soaGVhcCkpOworICAgIGVuZHBvcyA9IFB5TGlzdF9HRVRfU0laRShoZWFwKTsKKyAgICBzdGFydHBvcyA9IHBvczsKKyAgICBpZiAocG9zID49IGVuZHBvcykgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwgImluZGV4IG91dCBvZiByYW5nZSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG5ld2l0ZW0gPSBQeUxpc3RfR0VUX0lURU0oaGVhcCwgcG9zKTsKKyAgICBQeV9JTkNSRUYobmV3aXRlbSk7CiAKLQkvKiBCdWJibGUgdXAgdGhlIHNtYWxsZXIgY2hpbGQgdW50aWwgaGl0dGluZyBhIGxlYWYuICovCi0JY2hpbGRwb3MgPSAyKnBvcyArIDE7ICAgIC8qIGxlZnRtb3N0IGNoaWxkIHBvc2l0aW9uICAqLwotCXdoaWxlIChjaGlsZHBvcyA8IGVuZHBvcykgewotCQkvKiBTZXQgY2hpbGRwb3MgdG8gaW5kZXggb2Ygc21hbGxlciBjaGlsZC4gICAqLwotCQlyaWdodHBvcyA9IGNoaWxkcG9zICsgMTsKLQkJaWYgKHJpZ2h0cG9zIDwgZW5kcG9zKSB7Ci0JCQljbXAgPSBjbXBfbHQoCi0JCQkJUHlMaXN0X0dFVF9JVEVNKGhlYXAsIGNoaWxkcG9zKSwKLQkJCQlQeUxpc3RfR0VUX0lURU0oaGVhcCwgcmlnaHRwb3MpKTsKLQkJCWlmIChjbXAgPT0gLTEpIHsKLQkJCQlQeV9ERUNSRUYobmV3aXRlbSk7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQkJaWYgKGNtcCA9PSAwKQotCQkJCWNoaWxkcG9zID0gcmlnaHRwb3M7Ci0JCX0KLQkJLyogTW92ZSB0aGUgc21hbGxlciBjaGlsZCB1cC4gKi8KLQkJdG1wID0gUHlMaXN0X0dFVF9JVEVNKGhlYXAsIGNoaWxkcG9zKTsKLQkJUHlfSU5DUkVGKHRtcCk7Ci0JCVB5X0RFQ1JFRihQeUxpc3RfR0VUX0lURU0oaGVhcCwgcG9zKSk7Ci0JCVB5TGlzdF9TRVRfSVRFTShoZWFwLCBwb3MsIHRtcCk7Ci0JCXBvcyA9IGNoaWxkcG9zOwotCQljaGlsZHBvcyA9IDIqcG9zICsgMTsKLQl9CisgICAgLyogQnViYmxlIHVwIHRoZSBzbWFsbGVyIGNoaWxkIHVudGlsIGhpdHRpbmcgYSBsZWFmLiAqLworICAgIGNoaWxkcG9zID0gMipwb3MgKyAxOyAgICAvKiBsZWZ0bW9zdCBjaGlsZCBwb3NpdGlvbiAgKi8KKyAgICB3aGlsZSAoY2hpbGRwb3MgPCBlbmRwb3MpIHsKKyAgICAgICAgLyogU2V0IGNoaWxkcG9zIHRvIGluZGV4IG9mIHNtYWxsZXIgY2hpbGQuICAgKi8KKyAgICAgICAgcmlnaHRwb3MgPSBjaGlsZHBvcyArIDE7CisgICAgICAgIGlmIChyaWdodHBvcyA8IGVuZHBvcykgeworICAgICAgICAgICAgY21wID0gY21wX2x0KAorICAgICAgICAgICAgICAgIFB5TGlzdF9HRVRfSVRFTShoZWFwLCBjaGlsZHBvcyksCisgICAgICAgICAgICAgICAgUHlMaXN0X0dFVF9JVEVNKGhlYXAsIHJpZ2h0cG9zKSk7CisgICAgICAgICAgICBpZiAoY21wID09IC0xKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKG5ld2l0ZW0pOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjbXAgPT0gMCkKKyAgICAgICAgICAgICAgICBjaGlsZHBvcyA9IHJpZ2h0cG9zOworICAgICAgICB9CisgICAgICAgIC8qIE1vdmUgdGhlIHNtYWxsZXIgY2hpbGQgdXAuICovCisgICAgICAgIHRtcCA9IFB5TGlzdF9HRVRfSVRFTShoZWFwLCBjaGlsZHBvcyk7CisgICAgICAgIFB5X0lOQ1JFRih0bXApOworICAgICAgICBQeV9ERUNSRUYoUHlMaXN0X0dFVF9JVEVNKGhlYXAsIHBvcykpOworICAgICAgICBQeUxpc3RfU0VUX0lURU0oaGVhcCwgcG9zLCB0bXApOworICAgICAgICBwb3MgPSBjaGlsZHBvczsKKyAgICAgICAgY2hpbGRwb3MgPSAyKnBvcyArIDE7CisgICAgfQogCi0JLyogVGhlIGxlYWYgYXQgcG9zIGlzIGVtcHR5IG5vdy4gIFB1dCBuZXdpdGVtIHRoZXJlLCBhbmQgYW5kIGJ1YmJsZQotCSAgIGl0IHVwIHRvIGl0cyBmaW5hbCByZXN0aW5nIHBsYWNlIChieSBzaWZ0aW5nIGl0cyBwYXJlbnRzIGRvd24pLiAqLwotCVB5X0RFQ1JFRihQeUxpc3RfR0VUX0lURU0oaGVhcCwgcG9zKSk7Ci0JUHlMaXN0X1NFVF9JVEVNKGhlYXAsIHBvcywgbmV3aXRlbSk7Ci0JcmV0dXJuIF9zaWZ0ZG93bihoZWFwLCBzdGFydHBvcywgcG9zKTsKKyAgICAvKiBUaGUgbGVhZiBhdCBwb3MgaXMgZW1wdHkgbm93LiAgUHV0IG5ld2l0ZW0gdGhlcmUsIGFuZCBhbmQgYnViYmxlCisgICAgICAgaXQgdXAgdG8gaXRzIGZpbmFsIHJlc3RpbmcgcGxhY2UgKGJ5IHNpZnRpbmcgaXRzIHBhcmVudHMgZG93bikuICovCisgICAgUHlfREVDUkVGKFB5TGlzdF9HRVRfSVRFTShoZWFwLCBwb3MpKTsKKyAgICBQeUxpc3RfU0VUX0lURU0oaGVhcCwgcG9zLCBuZXdpdGVtKTsKKyAgICByZXR1cm4gX3NpZnRkb3duKGhlYXAsIHN0YXJ0cG9zLCBwb3MpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaGVhcHB1c2goUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICpoZWFwLCAqaXRlbTsKKyAgICBQeU9iamVjdCAqaGVhcCwgKml0ZW07CiAKLQlpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJoZWFwcHVzaCIsIDIsIDIsICZoZWFwLCAmaXRlbSkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImhlYXBwdXNoIiwgMiwgMiwgJmhlYXAsICZpdGVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoIVB5TGlzdF9DaGVjayhoZWFwKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiaGVhcCBhcmd1bWVudCBtdXN0IGJlIGEgbGlzdCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKCFQeUxpc3RfQ2hlY2soaGVhcCkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImhlYXAgYXJndW1lbnQgbXVzdCBiZSBhIGxpc3QiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaWYgKFB5TGlzdF9BcHBlbmQoaGVhcCwgaXRlbSkgPT0gLTEpCi0JCXJldHVybiBOVUxMOworICAgIGlmIChQeUxpc3RfQXBwZW5kKGhlYXAsIGl0ZW0pID09IC0xKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChfc2lmdGRvd24oKFB5TGlzdE9iamVjdCAqKWhlYXAsIDAsIFB5TGlzdF9HRVRfU0laRShoZWFwKS0xKSA9PSAtMSkKLQkJcmV0dXJuIE5VTEw7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGlmIChfc2lmdGRvd24oKFB5TGlzdE9iamVjdCAqKWhlYXAsIDAsIFB5TGlzdF9HRVRfU0laRShoZWFwKS0xKSA9PSAtMSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBQeURvY19TVFJWQVIoaGVhcHB1c2hfZG9jLApAQCAtMTQ2LDM1ICsxNDYsMzUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBoZWFwcG9wKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqaGVhcCkKIHsKLQlQeU9iamVjdCAqbGFzdGVsdCwgKnJldHVybml0ZW07Ci0JUHlfc3NpemVfdCBuOworICAgIFB5T2JqZWN0ICpsYXN0ZWx0LCAqcmV0dXJuaXRlbTsKKyAgICBQeV9zc2l6ZV90IG47CiAKLQlpZiAoIVB5TGlzdF9DaGVjayhoZWFwKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiaGVhcCBhcmd1bWVudCBtdXN0IGJlIGEgbGlzdCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKCFQeUxpc3RfQ2hlY2soaGVhcCkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImhlYXAgYXJndW1lbnQgbXVzdCBiZSBhIGxpc3QiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JLyogIyByYWlzZXMgYXBwcm9wcmlhdGUgSW5kZXhFcnJvciBpZiBoZWFwIGlzIGVtcHR5ICovCi0JbiA9IFB5TGlzdF9HRVRfU0laRShoZWFwKTsKLQlpZiAobiA9PSAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLCAiaW5kZXggb3V0IG9mIHJhbmdlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICAvKiAjIHJhaXNlcyBhcHByb3ByaWF0ZSBJbmRleEVycm9yIGlmIGhlYXAgaXMgZW1wdHkgKi8KKyAgICBuID0gUHlMaXN0X0dFVF9TSVpFKGhlYXApOworICAgIGlmIChuID09IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsICJpbmRleCBvdXQgb2YgcmFuZ2UiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JbGFzdGVsdCA9IFB5TGlzdF9HRVRfSVRFTShoZWFwLCBuLTEpIDsKLQlQeV9JTkNSRUYobGFzdGVsdCk7Ci0JUHlMaXN0X1NldFNsaWNlKGhlYXAsIG4tMSwgbiwgTlVMTCk7Ci0Jbi0tOworICAgIGxhc3RlbHQgPSBQeUxpc3RfR0VUX0lURU0oaGVhcCwgbi0xKSA7CisgICAgUHlfSU5DUkVGKGxhc3RlbHQpOworICAgIFB5TGlzdF9TZXRTbGljZShoZWFwLCBuLTEsIG4sIE5VTEwpOworICAgIG4tLTsKIAotCWlmICghbikgCi0JCXJldHVybiBsYXN0ZWx0OwotCXJldHVybml0ZW0gPSBQeUxpc3RfR0VUX0lURU0oaGVhcCwgMCk7Ci0JUHlMaXN0X1NFVF9JVEVNKGhlYXAsIDAsIGxhc3RlbHQpOwotCWlmIChfc2lmdHVwKChQeUxpc3RPYmplY3QgKiloZWFwLCAwKSA9PSAtMSkgewotCQlQeV9ERUNSRUYocmV0dXJuaXRlbSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gcmV0dXJuaXRlbTsKKyAgICBpZiAoIW4pCisgICAgICAgIHJldHVybiBsYXN0ZWx0OworICAgIHJldHVybml0ZW0gPSBQeUxpc3RfR0VUX0lURU0oaGVhcCwgMCk7CisgICAgUHlMaXN0X1NFVF9JVEVNKGhlYXAsIDAsIGxhc3RlbHQpOworICAgIGlmIChfc2lmdHVwKChQeUxpc3RPYmplY3QgKiloZWFwLCAwKSA9PSAtMSkgeworICAgICAgICBQeV9ERUNSRUYocmV0dXJuaXRlbSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gcmV0dXJuaXRlbTsKIH0KIAogUHlEb2NfU1RSVkFSKGhlYXBwb3BfZG9jLApAQCAtMTgzLDI5ICsxODMsMjkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBoZWFwcmVwbGFjZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKmhlYXAsICppdGVtLCAqcmV0dXJuaXRlbTsKKyAgICBQeU9iamVjdCAqaGVhcCwgKml0ZW0sICpyZXR1cm5pdGVtOwogCi0JaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiaGVhcHJlcGxhY2UiLCAyLCAyLCAmaGVhcCwgJml0ZW0pKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJoZWFwcmVwbGFjZSIsIDIsIDIsICZoZWFwLCAmaXRlbSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKCFQeUxpc3RfQ2hlY2soaGVhcCkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImhlYXAgYXJndW1lbnQgbXVzdCBiZSBhIGxpc3QiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICghUHlMaXN0X0NoZWNrKGhlYXApKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJoZWFwIGFyZ3VtZW50IG11c3QgYmUgYSBsaXN0Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWlmIChQeUxpc3RfR0VUX1NJWkUoaGVhcCkgPCAxKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLCAiaW5kZXggb3V0IG9mIHJhbmdlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoUHlMaXN0X0dFVF9TSVpFKGhlYXApIDwgMSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwgImluZGV4IG91dCBvZiByYW5nZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlyZXR1cm5pdGVtID0gUHlMaXN0X0dFVF9JVEVNKGhlYXAsIDApOwotCVB5X0lOQ1JFRihpdGVtKTsKLQlQeUxpc3RfU0VUX0lURU0oaGVhcCwgMCwgaXRlbSk7Ci0JaWYgKF9zaWZ0dXAoKFB5TGlzdE9iamVjdCAqKWhlYXAsIDApID09IC0xKSB7Ci0JCVB5X0RFQ1JFRihyZXR1cm5pdGVtKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiByZXR1cm5pdGVtOworICAgIHJldHVybml0ZW0gPSBQeUxpc3RfR0VUX0lURU0oaGVhcCwgMCk7CisgICAgUHlfSU5DUkVGKGl0ZW0pOworICAgIFB5TGlzdF9TRVRfSVRFTShoZWFwLCAwLCBpdGVtKTsKKyAgICBpZiAoX3NpZnR1cCgoUHlMaXN0T2JqZWN0ICopaGVhcCwgMCkgPT0gLTEpIHsKKyAgICAgICAgUHlfREVDUkVGKHJldHVybml0ZW0pOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIHJldHVybml0ZW07CiB9CiAKIFB5RG9jX1NUUlZBUihoZWFwcmVwbGFjZV9kb2MsCkBAIC0yMTUsNDQgKzIxNSw0NCBAQAogbW9yZSBhcHByb3ByaWF0ZSB3aGVuIHVzaW5nIGEgZml4ZWQtc2l6ZSBoZWFwLiAgTm90ZSB0aGF0IHRoZSB2YWx1ZVxuXAogcmV0dXJuZWQgbWF5IGJlIGxhcmdlciB0aGFuIGl0ZW0hICBUaGF0IGNvbnN0cmFpbnMgcmVhc29uYWJsZSB1c2VzIG9mXG5cCiB0aGlzIHJvdXRpbmUgdW5sZXNzIHdyaXR0ZW4gYXMgcGFydCBvZiBhIGNvbmRpdGlvbmFsIHJlcGxhY2VtZW50OlxuXG5cCi0gICAgICAgIGlmIGl0ZW0gPiBoZWFwWzBdOlxuXAotICAgICAgICAgICAgaXRlbSA9IGhlYXByZXBsYWNlKGhlYXAsIGl0ZW0pXG4iKTsKKyAgICBpZiBpdGVtID4gaGVhcFswXTpcblwKKyAgICAgICAgaXRlbSA9IGhlYXByZXBsYWNlKGhlYXAsIGl0ZW0pXG4iKTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIGhlYXBwdXNocG9wKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqaGVhcCwgKml0ZW0sICpyZXR1cm5pdGVtOwotCWludCBjbXA7CisgICAgUHlPYmplY3QgKmhlYXAsICppdGVtLCAqcmV0dXJuaXRlbTsKKyAgICBpbnQgY21wOwogCi0JaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiaGVhcHB1c2hwb3AiLCAyLCAyLCAmaGVhcCwgJml0ZW0pKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJoZWFwcHVzaHBvcCIsIDIsIDIsICZoZWFwLCAmaXRlbSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKCFQeUxpc3RfQ2hlY2soaGVhcCkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImhlYXAgYXJndW1lbnQgbXVzdCBiZSBhIGxpc3QiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICghUHlMaXN0X0NoZWNrKGhlYXApKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJoZWFwIGFyZ3VtZW50IG11c3QgYmUgYSBsaXN0Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWlmIChQeUxpc3RfR0VUX1NJWkUoaGVhcCkgPCAxKSB7Ci0JCVB5X0lOQ1JFRihpdGVtKTsKLQkJcmV0dXJuIGl0ZW07Ci0JfQorICAgIGlmIChQeUxpc3RfR0VUX1NJWkUoaGVhcCkgPCAxKSB7CisgICAgICAgIFB5X0lOQ1JFRihpdGVtKTsKKyAgICAgICAgcmV0dXJuIGl0ZW07CisgICAgfQogCi0JY21wID0gY21wX2x0KFB5TGlzdF9HRVRfSVRFTShoZWFwLCAwKSwgaXRlbSk7Ci0JaWYgKGNtcCA9PSAtMSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKGNtcCA9PSAwKSB7Ci0JCVB5X0lOQ1JFRihpdGVtKTsKLQkJcmV0dXJuIGl0ZW07Ci0JfQorICAgIGNtcCA9IGNtcF9sdChQeUxpc3RfR0VUX0lURU0oaGVhcCwgMCksIGl0ZW0pOworICAgIGlmIChjbXAgPT0gLTEpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChjbXAgPT0gMCkgeworICAgICAgICBQeV9JTkNSRUYoaXRlbSk7CisgICAgICAgIHJldHVybiBpdGVtOworICAgIH0KIAotCXJldHVybml0ZW0gPSBQeUxpc3RfR0VUX0lURU0oaGVhcCwgMCk7Ci0JUHlfSU5DUkVGKGl0ZW0pOwotCVB5TGlzdF9TRVRfSVRFTShoZWFwLCAwLCBpdGVtKTsKLQlpZiAoX3NpZnR1cCgoUHlMaXN0T2JqZWN0ICopaGVhcCwgMCkgPT0gLTEpIHsKLQkJUHlfREVDUkVGKHJldHVybml0ZW0pOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIHJldHVybml0ZW07CisgICAgcmV0dXJuaXRlbSA9IFB5TGlzdF9HRVRfSVRFTShoZWFwLCAwKTsKKyAgICBQeV9JTkNSRUYoaXRlbSk7CisgICAgUHlMaXN0X1NFVF9JVEVNKGhlYXAsIDAsIGl0ZW0pOworICAgIGlmIChfc2lmdHVwKChQeUxpc3RPYmplY3QgKiloZWFwLCAwKSA9PSAtMSkgeworICAgICAgICBQeV9ERUNSRUYocmV0dXJuaXRlbSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gcmV0dXJuaXRlbTsKIH0KIAogUHlEb2NfU1RSVkFSKGhlYXBwdXNocG9wX2RvYywKQEAgLTI2MywyNiArMjYzLDI2IEBACiBzdGF0aWMgUHlPYmplY3QgKgogaGVhcGlmeShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmhlYXApCiB7Ci0JUHlfc3NpemVfdCBpLCBuOworICAgIFB5X3NzaXplX3QgaSwgbjsKIAotCWlmICghUHlMaXN0X0NoZWNrKGhlYXApKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJoZWFwIGFyZ3VtZW50IG11c3QgYmUgYSBsaXN0Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoIVB5TGlzdF9DaGVjayhoZWFwKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiaGVhcCBhcmd1bWVudCBtdXN0IGJlIGEgbGlzdCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQluID0gUHlMaXN0X0dFVF9TSVpFKGhlYXApOwotCS8qIFRyYW5zZm9ybSBib3R0b20tdXAuICBUaGUgbGFyZ2VzdCBpbmRleCB0aGVyZSdzIGFueSBwb2ludCB0bwotCSAgIGxvb2tpbmcgYXQgaXMgdGhlIGxhcmdlc3Qgd2l0aCBhIGNoaWxkIGluZGV4IGluLXJhbmdlLCBzbyBtdXN0Ci0JICAgaGF2ZSAyKmkgKyAxIDwgbiwgb3IgaSA8IChuLTEpLzIuICBJZiBuIGlzIGV2ZW4gPSAyKmosIHRoaXMgaXMKLQkgICAoMipqLTEpLzIgPSBqLTEvMiBzbyBqLTEgaXMgdGhlIGxhcmdlc3QsIHdoaWNoIGlzIG4vLzIgLSAxLiAgSWYKLQkgICBuIGlzIG9kZCA9IDIqaisxLCB0aGlzIGlzICgyKmorMS0xKS8yID0gaiBzbyBqLTEgaXMgdGhlIGxhcmdlc3QsCi0JICAgYW5kIHRoYXQncyBhZ2FpbiBuLy8yLTEuCi0JKi8KLQlmb3IgKGk9bi8yLTEgOyBpPj0wIDsgaS0tKQotCQlpZihfc2lmdHVwKChQeUxpc3RPYmplY3QgKiloZWFwLCBpKSA9PSAtMSkKLQkJCXJldHVybiBOVUxMOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBuID0gUHlMaXN0X0dFVF9TSVpFKGhlYXApOworICAgIC8qIFRyYW5zZm9ybSBib3R0b20tdXAuICBUaGUgbGFyZ2VzdCBpbmRleCB0aGVyZSdzIGFueSBwb2ludCB0bworICAgICAgIGxvb2tpbmcgYXQgaXMgdGhlIGxhcmdlc3Qgd2l0aCBhIGNoaWxkIGluZGV4IGluLXJhbmdlLCBzbyBtdXN0CisgICAgICAgaGF2ZSAyKmkgKyAxIDwgbiwgb3IgaSA8IChuLTEpLzIuICBJZiBuIGlzIGV2ZW4gPSAyKmosIHRoaXMgaXMKKyAgICAgICAoMipqLTEpLzIgPSBqLTEvMiBzbyBqLTEgaXMgdGhlIGxhcmdlc3QsIHdoaWNoIGlzIG4vLzIgLSAxLiAgSWYKKyAgICAgICBuIGlzIG9kZCA9IDIqaisxLCB0aGlzIGlzICgyKmorMS0xKS8yID0gaiBzbyBqLTEgaXMgdGhlIGxhcmdlc3QsCisgICAgICAgYW5kIHRoYXQncyBhZ2FpbiBuLy8yLTEuCisgICAgKi8KKyAgICBmb3IgKGk9bi8yLTEgOyBpPj0wIDsgaS0tKQorICAgICAgICBpZihfc2lmdHVwKChQeUxpc3RPYmplY3QgKiloZWFwLCBpKSA9PSAtMSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogUHlEb2NfU1RSVkFSKGhlYXBpZnlfZG9jLApAQCAtMjkxLDc5ICsyOTEsNzkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBubGFyZ2VzdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKmhlYXA9TlVMTCwgKmVsZW0sICppdGVyYWJsZSwgKnNvbCwgKml0LCAqb2xkZWxlbTsKLQlQeV9zc2l6ZV90IGksIG47Ci0JaW50IGNtcDsKKyAgICBQeU9iamVjdCAqaGVhcD1OVUxMLCAqZWxlbSwgKml0ZXJhYmxlLCAqc29sLCAqaXQsICpvbGRlbGVtOworICAgIFB5X3NzaXplX3QgaSwgbjsKKyAgICBpbnQgY21wOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJuTzpubGFyZ2VzdCIsICZuLCAmaXRlcmFibGUpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIm5POm5sYXJnZXN0IiwgJm4sICZpdGVyYWJsZSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaXQgPSBQeU9iamVjdF9HZXRJdGVyKGl0ZXJhYmxlKTsKLQlpZiAoaXQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgaXQgPSBQeU9iamVjdF9HZXRJdGVyKGl0ZXJhYmxlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQloZWFwID0gUHlMaXN0X05ldygwKTsKLQlpZiAoaGVhcCA9PSBOVUxMKQotCQlnb3RvIGZhaWw7CisgICAgaGVhcCA9IFB5TGlzdF9OZXcoMCk7CisgICAgaWYgKGhlYXAgPT0gTlVMTCkKKyAgICAgICAgZ290byBmYWlsOwogCi0JZm9yIChpPTAgOyBpPG4gOyBpKysgKXsKLQkJZWxlbSA9IFB5SXRlcl9OZXh0KGl0KTsKLQkJaWYgKGVsZW0gPT0gTlVMTCkgewotCQkJaWYgKFB5RXJyX09jY3VycmVkKCkpCi0JCQkJZ290byBmYWlsOwotCQkJZWxzZQotCQkJCWdvdG8gc29ydGl0OwotCQl9Ci0JCWlmIChQeUxpc3RfQXBwZW5kKGhlYXAsIGVsZW0pID09IC0xKSB7Ci0JCQlQeV9ERUNSRUYoZWxlbSk7Ci0JCQlnb3RvIGZhaWw7Ci0JCX0KLQkJUHlfREVDUkVGKGVsZW0pOwotCX0KLQlpZiAoUHlMaXN0X0dFVF9TSVpFKGhlYXApID09IDApCi0JCWdvdG8gc29ydGl0OworICAgIGZvciAoaT0wIDsgaTxuIDsgaSsrICl7CisgICAgICAgIGVsZW0gPSBQeUl0ZXJfTmV4dChpdCk7CisgICAgICAgIGlmIChlbGVtID09IE5VTEwpIHsKKyAgICAgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBnb3RvIHNvcnRpdDsKKyAgICAgICAgfQorICAgICAgICBpZiAoUHlMaXN0X0FwcGVuZChoZWFwLCBlbGVtKSA9PSAtMSkgeworICAgICAgICAgICAgUHlfREVDUkVGKGVsZW0pOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgICAgIFB5X0RFQ1JFRihlbGVtKTsKKyAgICB9CisgICAgaWYgKFB5TGlzdF9HRVRfU0laRShoZWFwKSA9PSAwKQorICAgICAgICBnb3RvIHNvcnRpdDsKIAotCWZvciAoaT1uLzItMSA7IGk+PTAgOyBpLS0pCi0JCWlmKF9zaWZ0dXAoKFB5TGlzdE9iamVjdCAqKWhlYXAsIGkpID09IC0xKQotCQkJZ290byBmYWlsOworICAgIGZvciAoaT1uLzItMSA7IGk+PTAgOyBpLS0pCisgICAgICAgIGlmKF9zaWZ0dXAoKFB5TGlzdE9iamVjdCAqKWhlYXAsIGkpID09IC0xKQorICAgICAgICAgICAgZ290byBmYWlsOwogCi0Jc29sID0gUHlMaXN0X0dFVF9JVEVNKGhlYXAsIDApOwotCXdoaWxlICgxKSB7Ci0JCWVsZW0gPSBQeUl0ZXJfTmV4dChpdCk7Ci0JCWlmIChlbGVtID09IE5VTEwpIHsKLQkJCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQkJCWdvdG8gZmFpbDsKLQkJCWVsc2UKLQkJCQlnb3RvIHNvcnRpdDsKLQkJfQotCQljbXAgPSBjbXBfbHQoc29sLCBlbGVtKTsKLQkJaWYgKGNtcCA9PSAtMSkgewotCQkJUHlfREVDUkVGKGVsZW0pOwotCQkJZ290byBmYWlsOwotCQl9Ci0JCWlmIChjbXAgPT0gMCkgewotCQkJUHlfREVDUkVGKGVsZW0pOwotCQkJY29udGludWU7Ci0JCX0KLQkJb2xkZWxlbSA9IFB5TGlzdF9HRVRfSVRFTShoZWFwLCAwKTsKLQkJUHlMaXN0X1NFVF9JVEVNKGhlYXAsIDAsIGVsZW0pOwotCQlQeV9ERUNSRUYob2xkZWxlbSk7Ci0JCWlmIChfc2lmdHVwKChQeUxpc3RPYmplY3QgKiloZWFwLCAwKSA9PSAtMSkKLQkJCWdvdG8gZmFpbDsKLQkJc29sID0gUHlMaXN0X0dFVF9JVEVNKGhlYXAsIDApOwotCX0KKyAgICBzb2wgPSBQeUxpc3RfR0VUX0lURU0oaGVhcCwgMCk7CisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgZWxlbSA9IFB5SXRlcl9OZXh0KGl0KTsKKyAgICAgICAgaWYgKGVsZW0gPT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGdvdG8gc29ydGl0OworICAgICAgICB9CisgICAgICAgIGNtcCA9IGNtcF9sdChzb2wsIGVsZW0pOworICAgICAgICBpZiAoY21wID09IC0xKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoZWxlbSk7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNtcCA9PSAwKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoZWxlbSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBvbGRlbGVtID0gUHlMaXN0X0dFVF9JVEVNKGhlYXAsIDApOworICAgICAgICBQeUxpc3RfU0VUX0lURU0oaGVhcCwgMCwgZWxlbSk7CisgICAgICAgIFB5X0RFQ1JFRihvbGRlbGVtKTsKKyAgICAgICAgaWYgKF9zaWZ0dXAoKFB5TGlzdE9iamVjdCAqKWhlYXAsIDApID09IC0xKQorICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICBzb2wgPSBQeUxpc3RfR0VUX0lURU0oaGVhcCwgMCk7CisgICAgfQogc29ydGl0OgotCWlmIChQeUxpc3RfU29ydChoZWFwKSA9PSAtMSkKLQkJZ290byBmYWlsOwotCWlmIChQeUxpc3RfUmV2ZXJzZShoZWFwKSA9PSAtMSkKLQkJZ290byBmYWlsOwotCVB5X0RFQ1JFRihpdCk7Ci0JcmV0dXJuIGhlYXA7CisgICAgaWYgKFB5TGlzdF9Tb3J0KGhlYXApID09IC0xKQorICAgICAgICBnb3RvIGZhaWw7CisgICAgaWYgKFB5TGlzdF9SZXZlcnNlKGhlYXApID09IC0xKQorICAgICAgICBnb3RvIGZhaWw7CisgICAgUHlfREVDUkVGKGl0KTsKKyAgICByZXR1cm4gaGVhcDsKIAogZmFpbDoKLQlQeV9ERUNSRUYoaXQpOwotCVB5X1hERUNSRUYoaGVhcCk7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlfREVDUkVGKGl0KTsKKyAgICBQeV9YREVDUkVGKGhlYXApOworICAgIHJldHVybiBOVUxMOwogfQogCiBQeURvY19TVFJWQVIobmxhcmdlc3RfZG9jLApAQCAtMzc0LDE2NiArMzc0LDE2NiBAQAogc3RhdGljIGludAogX3NpZnRkb3dubWF4KFB5TGlzdE9iamVjdCAqaGVhcCwgUHlfc3NpemVfdCBzdGFydHBvcywgUHlfc3NpemVfdCBwb3MpCiB7Ci0JUHlPYmplY3QgKm5ld2l0ZW0sICpwYXJlbnQ7Ci0JaW50IGNtcDsKLQlQeV9zc2l6ZV90IHBhcmVudHBvczsKKyAgICBQeU9iamVjdCAqbmV3aXRlbSwgKnBhcmVudDsKKyAgICBpbnQgY21wOworICAgIFB5X3NzaXplX3QgcGFyZW50cG9zOwogCi0JYXNzZXJ0KFB5TGlzdF9DaGVjayhoZWFwKSk7Ci0JaWYgKHBvcyA+PSBQeUxpc3RfR0VUX1NJWkUoaGVhcCkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsICJpbmRleCBvdXQgb2YgcmFuZ2UiKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICBhc3NlcnQoUHlMaXN0X0NoZWNrKGhlYXApKTsKKyAgICBpZiAocG9zID49IFB5TGlzdF9HRVRfU0laRShoZWFwKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwgImluZGV4IG91dCBvZiByYW5nZSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JbmV3aXRlbSA9IFB5TGlzdF9HRVRfSVRFTShoZWFwLCBwb3MpOwotCVB5X0lOQ1JFRihuZXdpdGVtKTsKLQkvKiBGb2xsb3cgdGhlIHBhdGggdG8gdGhlIHJvb3QsIG1vdmluZyBwYXJlbnRzIGRvd24gdW50aWwgZmluZGluZwotCSAgIGEgcGxhY2UgbmV3aXRlbSBmaXRzLiAqLwotCXdoaWxlIChwb3MgPiBzdGFydHBvcyl7Ci0JCXBhcmVudHBvcyA9IChwb3MgLSAxKSA+PiAxOwotCQlwYXJlbnQgPSBQeUxpc3RfR0VUX0lURU0oaGVhcCwgcGFyZW50cG9zKTsKLQkJY21wID0gY21wX2x0KHBhcmVudCwgbmV3aXRlbSk7Ci0JCWlmIChjbXAgPT0gLTEpIHsKLQkJCVB5X0RFQ1JFRihuZXdpdGVtKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlpZiAoY21wID09IDApCi0JCQlicmVhazsKLQkJUHlfSU5DUkVGKHBhcmVudCk7Ci0JCVB5X0RFQ1JFRihQeUxpc3RfR0VUX0lURU0oaGVhcCwgcG9zKSk7Ci0JCVB5TGlzdF9TRVRfSVRFTShoZWFwLCBwb3MsIHBhcmVudCk7Ci0JCXBvcyA9IHBhcmVudHBvczsKLQl9Ci0JUHlfREVDUkVGKFB5TGlzdF9HRVRfSVRFTShoZWFwLCBwb3MpKTsKLQlQeUxpc3RfU0VUX0lURU0oaGVhcCwgcG9zLCBuZXdpdGVtKTsKLQlyZXR1cm4gMDsKKyAgICBuZXdpdGVtID0gUHlMaXN0X0dFVF9JVEVNKGhlYXAsIHBvcyk7CisgICAgUHlfSU5DUkVGKG5ld2l0ZW0pOworICAgIC8qIEZvbGxvdyB0aGUgcGF0aCB0byB0aGUgcm9vdCwgbW92aW5nIHBhcmVudHMgZG93biB1bnRpbCBmaW5kaW5nCisgICAgICAgYSBwbGFjZSBuZXdpdGVtIGZpdHMuICovCisgICAgd2hpbGUgKHBvcyA+IHN0YXJ0cG9zKXsKKyAgICAgICAgcGFyZW50cG9zID0gKHBvcyAtIDEpID4+IDE7CisgICAgICAgIHBhcmVudCA9IFB5TGlzdF9HRVRfSVRFTShoZWFwLCBwYXJlbnRwb3MpOworICAgICAgICBjbXAgPSBjbXBfbHQocGFyZW50LCBuZXdpdGVtKTsKKyAgICAgICAgaWYgKGNtcCA9PSAtMSkgeworICAgICAgICAgICAgUHlfREVDUkVGKG5ld2l0ZW0pOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGlmIChjbXAgPT0gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBQeV9JTkNSRUYocGFyZW50KTsKKyAgICAgICAgUHlfREVDUkVGKFB5TGlzdF9HRVRfSVRFTShoZWFwLCBwb3MpKTsKKyAgICAgICAgUHlMaXN0X1NFVF9JVEVNKGhlYXAsIHBvcywgcGFyZW50KTsKKyAgICAgICAgcG9zID0gcGFyZW50cG9zOworICAgIH0KKyAgICBQeV9ERUNSRUYoUHlMaXN0X0dFVF9JVEVNKGhlYXAsIHBvcykpOworICAgIFB5TGlzdF9TRVRfSVRFTShoZWFwLCBwb3MsIG5ld2l0ZW0pOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBfc2lmdHVwbWF4KFB5TGlzdE9iamVjdCAqaGVhcCwgUHlfc3NpemVfdCBwb3MpCiB7Ci0JUHlfc3NpemVfdCBzdGFydHBvcywgZW5kcG9zLCBjaGlsZHBvcywgcmlnaHRwb3M7Ci0JaW50IGNtcDsKLQlQeU9iamVjdCAqbmV3aXRlbSwgKnRtcDsKKyAgICBQeV9zc2l6ZV90IHN0YXJ0cG9zLCBlbmRwb3MsIGNoaWxkcG9zLCByaWdodHBvczsKKyAgICBpbnQgY21wOworICAgIFB5T2JqZWN0ICpuZXdpdGVtLCAqdG1wOwogCi0JYXNzZXJ0KFB5TGlzdF9DaGVjayhoZWFwKSk7Ci0JZW5kcG9zID0gUHlMaXN0X0dFVF9TSVpFKGhlYXApOwotCXN0YXJ0cG9zID0gcG9zOwotCWlmIChwb3MgPj0gZW5kcG9zKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLCAiaW5kZXggb3V0IG9mIHJhbmdlIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JbmV3aXRlbSA9IFB5TGlzdF9HRVRfSVRFTShoZWFwLCBwb3MpOwotCVB5X0lOQ1JFRihuZXdpdGVtKTsKKyAgICBhc3NlcnQoUHlMaXN0X0NoZWNrKGhlYXApKTsKKyAgICBlbmRwb3MgPSBQeUxpc3RfR0VUX1NJWkUoaGVhcCk7CisgICAgc3RhcnRwb3MgPSBwb3M7CisgICAgaWYgKHBvcyA+PSBlbmRwb3MpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsICJpbmRleCBvdXQgb2YgcmFuZ2UiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBuZXdpdGVtID0gUHlMaXN0X0dFVF9JVEVNKGhlYXAsIHBvcyk7CisgICAgUHlfSU5DUkVGKG5ld2l0ZW0pOwogCi0JLyogQnViYmxlIHVwIHRoZSBzbWFsbGVyIGNoaWxkIHVudGlsIGhpdHRpbmcgYSBsZWFmLiAqLwotCWNoaWxkcG9zID0gMipwb3MgKyAxOyAgICAvKiBsZWZ0bW9zdCBjaGlsZCBwb3NpdGlvbiAgKi8KLQl3aGlsZSAoY2hpbGRwb3MgPCBlbmRwb3MpIHsKLQkJLyogU2V0IGNoaWxkcG9zIHRvIGluZGV4IG9mIHNtYWxsZXIgY2hpbGQuICAgKi8KLQkJcmlnaHRwb3MgPSBjaGlsZHBvcyArIDE7Ci0JCWlmIChyaWdodHBvcyA8IGVuZHBvcykgewotCQkJY21wID0gY21wX2x0KAotCQkJCVB5TGlzdF9HRVRfSVRFTShoZWFwLCByaWdodHBvcyksCi0JCQkJUHlMaXN0X0dFVF9JVEVNKGhlYXAsIGNoaWxkcG9zKSk7Ci0JCQlpZiAoY21wID09IC0xKSB7Ci0JCQkJUHlfREVDUkVGKG5ld2l0ZW0pOwotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJCWlmIChjbXAgPT0gMCkKLQkJCQljaGlsZHBvcyA9IHJpZ2h0cG9zOwotCQl9Ci0JCS8qIE1vdmUgdGhlIHNtYWxsZXIgY2hpbGQgdXAuICovCi0JCXRtcCA9IFB5TGlzdF9HRVRfSVRFTShoZWFwLCBjaGlsZHBvcyk7Ci0JCVB5X0lOQ1JFRih0bXApOwotCQlQeV9ERUNSRUYoUHlMaXN0X0dFVF9JVEVNKGhlYXAsIHBvcykpOwotCQlQeUxpc3RfU0VUX0lURU0oaGVhcCwgcG9zLCB0bXApOwotCQlwb3MgPSBjaGlsZHBvczsKLQkJY2hpbGRwb3MgPSAyKnBvcyArIDE7Ci0JfQorICAgIC8qIEJ1YmJsZSB1cCB0aGUgc21hbGxlciBjaGlsZCB1bnRpbCBoaXR0aW5nIGEgbGVhZi4gKi8KKyAgICBjaGlsZHBvcyA9IDIqcG9zICsgMTsgICAgLyogbGVmdG1vc3QgY2hpbGQgcG9zaXRpb24gICovCisgICAgd2hpbGUgKGNoaWxkcG9zIDwgZW5kcG9zKSB7CisgICAgICAgIC8qIFNldCBjaGlsZHBvcyB0byBpbmRleCBvZiBzbWFsbGVyIGNoaWxkLiAgICovCisgICAgICAgIHJpZ2h0cG9zID0gY2hpbGRwb3MgKyAxOworICAgICAgICBpZiAocmlnaHRwb3MgPCBlbmRwb3MpIHsKKyAgICAgICAgICAgIGNtcCA9IGNtcF9sdCgKKyAgICAgICAgICAgICAgICBQeUxpc3RfR0VUX0lURU0oaGVhcCwgcmlnaHRwb3MpLAorICAgICAgICAgICAgICAgIFB5TGlzdF9HRVRfSVRFTShoZWFwLCBjaGlsZHBvcykpOworICAgICAgICAgICAgaWYgKGNtcCA9PSAtMSkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihuZXdpdGVtKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY21wID09IDApCisgICAgICAgICAgICAgICAgY2hpbGRwb3MgPSByaWdodHBvczsKKyAgICAgICAgfQorICAgICAgICAvKiBNb3ZlIHRoZSBzbWFsbGVyIGNoaWxkIHVwLiAqLworICAgICAgICB0bXAgPSBQeUxpc3RfR0VUX0lURU0oaGVhcCwgY2hpbGRwb3MpOworICAgICAgICBQeV9JTkNSRUYodG1wKTsKKyAgICAgICAgUHlfREVDUkVGKFB5TGlzdF9HRVRfSVRFTShoZWFwLCBwb3MpKTsKKyAgICAgICAgUHlMaXN0X1NFVF9JVEVNKGhlYXAsIHBvcywgdG1wKTsKKyAgICAgICAgcG9zID0gY2hpbGRwb3M7CisgICAgICAgIGNoaWxkcG9zID0gMipwb3MgKyAxOworICAgIH0KIAotCS8qIFRoZSBsZWFmIGF0IHBvcyBpcyBlbXB0eSBub3cuICBQdXQgbmV3aXRlbSB0aGVyZSwgYW5kIGFuZCBidWJibGUKLQkgICBpdCB1cCB0byBpdHMgZmluYWwgcmVzdGluZyBwbGFjZSAoYnkgc2lmdGluZyBpdHMgcGFyZW50cyBkb3duKS4gKi8KLQlQeV9ERUNSRUYoUHlMaXN0X0dFVF9JVEVNKGhlYXAsIHBvcykpOwotCVB5TGlzdF9TRVRfSVRFTShoZWFwLCBwb3MsIG5ld2l0ZW0pOwotCXJldHVybiBfc2lmdGRvd25tYXgoaGVhcCwgc3RhcnRwb3MsIHBvcyk7CisgICAgLyogVGhlIGxlYWYgYXQgcG9zIGlzIGVtcHR5IG5vdy4gIFB1dCBuZXdpdGVtIHRoZXJlLCBhbmQgYW5kIGJ1YmJsZQorICAgICAgIGl0IHVwIHRvIGl0cyBmaW5hbCByZXN0aW5nIHBsYWNlIChieSBzaWZ0aW5nIGl0cyBwYXJlbnRzIGRvd24pLiAqLworICAgIFB5X0RFQ1JFRihQeUxpc3RfR0VUX0lURU0oaGVhcCwgcG9zKSk7CisgICAgUHlMaXN0X1NFVF9JVEVNKGhlYXAsIHBvcywgbmV3aXRlbSk7CisgICAgcmV0dXJuIF9zaWZ0ZG93bm1heChoZWFwLCBzdGFydHBvcywgcG9zKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG5zbWFsbGVzdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKmhlYXA9TlVMTCwgKmVsZW0sICppdGVyYWJsZSwgKmxvcywgKml0LCAqb2xkZWxlbTsKLQlQeV9zc2l6ZV90IGksIG47Ci0JaW50IGNtcDsKKyAgICBQeU9iamVjdCAqaGVhcD1OVUxMLCAqZWxlbSwgKml0ZXJhYmxlLCAqbG9zLCAqaXQsICpvbGRlbGVtOworICAgIFB5X3NzaXplX3QgaSwgbjsKKyAgICBpbnQgY21wOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJuTzpuc21hbGxlc3QiLCAmbiwgJml0ZXJhYmxlKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJuTzpuc21hbGxlc3QiLCAmbiwgJml0ZXJhYmxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpdCA9IFB5T2JqZWN0X0dldEl0ZXIoaXRlcmFibGUpOwotCWlmIChpdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpdCA9IFB5T2JqZWN0X0dldEl0ZXIoaXRlcmFibGUpOworICAgIGlmIChpdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWhlYXAgPSBQeUxpc3RfTmV3KDApOwotCWlmIChoZWFwID09IE5VTEwpCi0JCWdvdG8gZmFpbDsKKyAgICBoZWFwID0gUHlMaXN0X05ldygwKTsKKyAgICBpZiAoaGVhcCA9PSBOVUxMKQorICAgICAgICBnb3RvIGZhaWw7CiAKLQlmb3IgKGk9MCA7IGk8biA7IGkrKyApewotCQllbGVtID0gUHlJdGVyX05leHQoaXQpOwotCQlpZiAoZWxlbSA9PSBOVUxMKSB7Ci0JCQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkKLQkJCQlnb3RvIGZhaWw7Ci0JCQllbHNlCi0JCQkJZ290byBzb3J0aXQ7Ci0JCX0KLQkJaWYgKFB5TGlzdF9BcHBlbmQoaGVhcCwgZWxlbSkgPT0gLTEpIHsKLQkJCVB5X0RFQ1JFRihlbGVtKTsKLQkJCWdvdG8gZmFpbDsKLQkJfQotCQlQeV9ERUNSRUYoZWxlbSk7Ci0JfQotCW4gPSBQeUxpc3RfR0VUX1NJWkUoaGVhcCk7Ci0JaWYgKG4gPT0gMCkKLQkJZ290byBzb3J0aXQ7CisgICAgZm9yIChpPTAgOyBpPG4gOyBpKysgKXsKKyAgICAgICAgZWxlbSA9IFB5SXRlcl9OZXh0KGl0KTsKKyAgICAgICAgaWYgKGVsZW0gPT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGdvdG8gc29ydGl0OworICAgICAgICB9CisgICAgICAgIGlmIChQeUxpc3RfQXBwZW5kKGhlYXAsIGVsZW0pID09IC0xKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoZWxlbSk7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICAgICAgUHlfREVDUkVGKGVsZW0pOworICAgIH0KKyAgICBuID0gUHlMaXN0X0dFVF9TSVpFKGhlYXApOworICAgIGlmIChuID09IDApCisgICAgICAgIGdvdG8gc29ydGl0OwogCi0JZm9yIChpPW4vMi0xIDsgaT49MCA7IGktLSkKLQkJaWYoX3NpZnR1cG1heCgoUHlMaXN0T2JqZWN0ICopaGVhcCwgaSkgPT0gLTEpCi0JCQlnb3RvIGZhaWw7CisgICAgZm9yIChpPW4vMi0xIDsgaT49MCA7IGktLSkKKyAgICAgICAgaWYoX3NpZnR1cG1heCgoUHlMaXN0T2JqZWN0ICopaGVhcCwgaSkgPT0gLTEpCisgICAgICAgICAgICBnb3RvIGZhaWw7CiAKLQlsb3MgPSBQeUxpc3RfR0VUX0lURU0oaGVhcCwgMCk7Ci0Jd2hpbGUgKDEpIHsKLQkJZWxlbSA9IFB5SXRlcl9OZXh0KGl0KTsKLQkJaWYgKGVsZW0gPT0gTlVMTCkgewotCQkJaWYgKFB5RXJyX09jY3VycmVkKCkpCi0JCQkJZ290byBmYWlsOwotCQkJZWxzZQotCQkJCWdvdG8gc29ydGl0OwotCQl9Ci0JCWNtcCA9IGNtcF9sdChlbGVtLCBsb3MpOwotCQlpZiAoY21wID09IC0xKSB7Ci0JCQlQeV9ERUNSRUYoZWxlbSk7Ci0JCQlnb3RvIGZhaWw7Ci0JCX0KLQkJaWYgKGNtcCA9PSAwKSB7Ci0JCQlQeV9ERUNSRUYoZWxlbSk7Ci0JCQljb250aW51ZTsKLQkJfQorICAgIGxvcyA9IFB5TGlzdF9HRVRfSVRFTShoZWFwLCAwKTsKKyAgICB3aGlsZSAoMSkgeworICAgICAgICBlbGVtID0gUHlJdGVyX05leHQoaXQpOworICAgICAgICBpZiAoZWxlbSA9PSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZ290byBzb3J0aXQ7CisgICAgICAgIH0KKyAgICAgICAgY21wID0gY21wX2x0KGVsZW0sIGxvcyk7CisgICAgICAgIGlmIChjbXAgPT0gLTEpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihlbGVtKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgICAgICBpZiAoY21wID09IDApIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihlbGVtKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CiAKLQkJb2xkZWxlbSA9IFB5TGlzdF9HRVRfSVRFTShoZWFwLCAwKTsKLQkJUHlMaXN0X1NFVF9JVEVNKGhlYXAsIDAsIGVsZW0pOwotCQlQeV9ERUNSRUYob2xkZWxlbSk7Ci0JCWlmIChfc2lmdHVwbWF4KChQeUxpc3RPYmplY3QgKiloZWFwLCAwKSA9PSAtMSkKLQkJCWdvdG8gZmFpbDsKLQkJbG9zID0gUHlMaXN0X0dFVF9JVEVNKGhlYXAsIDApOwotCX0KKyAgICAgICAgb2xkZWxlbSA9IFB5TGlzdF9HRVRfSVRFTShoZWFwLCAwKTsKKyAgICAgICAgUHlMaXN0X1NFVF9JVEVNKGhlYXAsIDAsIGVsZW0pOworICAgICAgICBQeV9ERUNSRUYob2xkZWxlbSk7CisgICAgICAgIGlmIChfc2lmdHVwbWF4KChQeUxpc3RPYmplY3QgKiloZWFwLCAwKSA9PSAtMSkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgbG9zID0gUHlMaXN0X0dFVF9JVEVNKGhlYXAsIDApOworICAgIH0KIAogc29ydGl0OgotCWlmIChQeUxpc3RfU29ydChoZWFwKSA9PSAtMSkKLQkJZ290byBmYWlsOwotCVB5X0RFQ1JFRihpdCk7Ci0JcmV0dXJuIGhlYXA7CisgICAgaWYgKFB5TGlzdF9Tb3J0KGhlYXApID09IC0xKQorICAgICAgICBnb3RvIGZhaWw7CisgICAgUHlfREVDUkVGKGl0KTsKKyAgICByZXR1cm4gaGVhcDsKIAogZmFpbDoKLQlQeV9ERUNSRUYoaXQpOwotCVB5X1hERUNSRUYoaGVhcCk7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlfREVDUkVGKGl0KTsKKyAgICBQeV9YREVDUkVGKGhlYXApOworICAgIHJldHVybiBOVUxMOwogfQogCiBQeURvY19TVFJWQVIobnNtYWxsZXN0X2RvYywKQEAgLTU0MiwyMSArNTQyLDIxIEBACiBFcXVpdmFsZW50IHRvOiAgc29ydGVkKGl0ZXJhYmxlKVs6bl1cbiIpOwogCiBzdGF0aWMgUHlNZXRob2REZWYgaGVhcHFfbWV0aG9kc1tdID0gewotCXsiaGVhcHB1c2giLAkoUHlDRnVuY3Rpb24paGVhcHB1c2gsCQkKLQkJTUVUSF9WQVJBUkdTLAloZWFwcHVzaF9kb2N9LAotCXsiaGVhcHB1c2hwb3AiLAkoUHlDRnVuY3Rpb24paGVhcHB1c2hwb3AsCQkKLQkJTUVUSF9WQVJBUkdTLAloZWFwcHVzaHBvcF9kb2N9LAotCXsiaGVhcHBvcCIsCShQeUNGdW5jdGlvbiloZWFwcG9wLAotCQlNRVRIX08sCQloZWFwcG9wX2RvY30sCi0JeyJoZWFwcmVwbGFjZSIsCShQeUNGdW5jdGlvbiloZWFwcmVwbGFjZSwKLQkJTUVUSF9WQVJBUkdTLAloZWFwcmVwbGFjZV9kb2N9LAotCXsiaGVhcGlmeSIsCShQeUNGdW5jdGlvbiloZWFwaWZ5LAotCQlNRVRIX08sCQloZWFwaWZ5X2RvY30sCi0JeyJubGFyZ2VzdCIsCShQeUNGdW5jdGlvbilubGFyZ2VzdCwKLQkJTUVUSF9WQVJBUkdTLAlubGFyZ2VzdF9kb2N9LAotCXsibnNtYWxsZXN0IiwJKFB5Q0Z1bmN0aW9uKW5zbWFsbGVzdCwKLQkJTUVUSF9WQVJBUkdTLAluc21hbGxlc3RfZG9jfSwKLQl7TlVMTCwJCU5VTEx9CQkvKiBzZW50aW5lbCAqLworICAgIHsiaGVhcHB1c2giLCAgICAgICAgKFB5Q0Z1bmN0aW9uKWhlYXBwdXNoLAorICAgICAgICBNRVRIX1ZBUkFSR1MsICAgICAgICAgICBoZWFwcHVzaF9kb2N9LAorICAgIHsiaGVhcHB1c2hwb3AiLCAgICAgKFB5Q0Z1bmN0aW9uKWhlYXBwdXNocG9wLAorICAgICAgICBNRVRIX1ZBUkFSR1MsICAgICAgICAgICBoZWFwcHVzaHBvcF9kb2N9LAorICAgIHsiaGVhcHBvcCIsICAgICAgICAgKFB5Q0Z1bmN0aW9uKWhlYXBwb3AsCisgICAgICAgIE1FVEhfTywgICAgICAgICAgICAgICAgIGhlYXBwb3BfZG9jfSwKKyAgICB7ImhlYXByZXBsYWNlIiwgICAgIChQeUNGdW5jdGlvbiloZWFwcmVwbGFjZSwKKyAgICAgICAgTUVUSF9WQVJBUkdTLCAgICAgICAgICAgaGVhcHJlcGxhY2VfZG9jfSwKKyAgICB7ImhlYXBpZnkiLCAgICAgICAgIChQeUNGdW5jdGlvbiloZWFwaWZ5LAorICAgICAgICBNRVRIX08sICAgICAgICAgICAgICAgICBoZWFwaWZ5X2RvY30sCisgICAgeyJubGFyZ2VzdCIsICAgICAgICAoUHlDRnVuY3Rpb24pbmxhcmdlc3QsCisgICAgICAgIE1FVEhfVkFSQVJHUywgICAgICAgICAgIG5sYXJnZXN0X2RvY30sCisgICAgeyJuc21hbGxlc3QiLCAgICAgICAoUHlDRnVuY3Rpb24pbnNtYWxsZXN0LAorICAgICAgICBNRVRIX1ZBUkFSR1MsICAgICAgICAgICBuc21hbGxlc3RfZG9jfSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogUHlEb2NfU1RSVkFSKG1vZHVsZV9kb2MsCkBAIC02ODcsMTEgKzY4NywxMSBAQAogUHlNT0RJTklUX0ZVTkMKIGluaXRfaGVhcHEodm9pZCkKIHsKLQlQeU9iamVjdCAqbTsKKyAgICBQeU9iamVjdCAqbTsKIAotCW0gPSBQeV9Jbml0TW9kdWxlMygiX2hlYXBxIiwgaGVhcHFfbWV0aG9kcywgbW9kdWxlX2RvYyk7Ci0JaWYgKG0gPT0gTlVMTCkKLSAgICAJCXJldHVybjsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIl9fYWJvdXRfXyIsIFB5U3RyaW5nX0Zyb21TdHJpbmcoX19hYm91dF9fKSk7CisgICAgbSA9IFB5X0luaXRNb2R1bGUzKCJfaGVhcHEiLCBoZWFwcV9tZXRob2RzLCBtb2R1bGVfZG9jKTsKKyAgICBpZiAobSA9PSBOVUxMKQorICAgICAgICByZXR1cm47CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJfX2Fib3V0X18iLCBQeVN0cmluZ19Gcm9tU3RyaW5nKF9fYWJvdXRfXykpOwogfQogCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19ob3RzaG90LmMgYi9Nb2R1bGVzL19ob3RzaG90LmMKaW5kZXggYTM2Y2Q1MC4uZGY4YTdmOSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9faG90c2hvdC5jCisrKyBiL01vZHVsZXMvX2hvdHNob3QuYwpAQCAtMjEsMTAgKzIxLDEwIEBACiAKIHR5cGVkZWYgX19pbnQ2NCBoc190aW1lOwogI2RlZmluZSBHRVRUSU1FT0ZEQVkoUF9IU19USU1FKSBcCi0JeyBMQVJHRV9JTlRFR0VSIF90ZW1wOyBcCi0JICBRdWVyeVBlcmZvcm1hbmNlQ291bnRlcigmX3RlbXApOyBcCi0JICAqKFBfSFNfVElNRSkgPSBfdGVtcC5RdWFkUGFydDsgfQotCSAgCisgICAgICAgIHsgTEFSR0VfSU5URUdFUiBfdGVtcDsgXAorICAgICAgICAgIFF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyKCZfdGVtcCk7IFwKKyAgICAgICAgICAqKFBfSFNfVElNRSkgPSBfdGVtcC5RdWFkUGFydDsgfQorCiAKICNlbHNlCiAjaWZuZGVmIEhBVkVfR0VUVElNRU9GREFZCkBAIC0yODQsNyArMjg0LDcgQEAKIAogICAgIGRvIHsKICAgICAgICAgLyogcmVhZCBieXRlICovCi0JaWYgKChjID0gZmdldGMoc2VsZi0+bG9nZnApKSA9PSBFT0YpCisgICAgICAgIGlmICgoYyA9IGZnZXRjKHNlbGYtPmxvZ2ZwKSkgPT0gRU9GKQogICAgICAgICAgICAgcmV0dXJuIEVSUl9FT0Y7CiAgICAgICAgIGFjY3VtIHw9ICgoYyAmIDB4N0YpID4+IGRpc2NhcmQpIDw8IGJpdHM7CiAgICAgICAgIGJpdHMgKz0gKDcgLSBkaXNjYXJkKTsKQEAgLTMwOCwxOSArMzA4LDE5IEBACiAgICAgaW50IGVycjsKICAgICBpbnQgY2g7CiAgICAgY2hhciAqYnVmOwotICAgIAorCiAgICAgaWYgKChlcnIgPSB1bnBhY2tfcGFja2VkX2ludChzZWxmLCAmbGVuLCAwKSkpCiAgICAgICAgIHJldHVybiBlcnI7CiAKICAgICBidWYgPSAoY2hhciAqKW1hbGxvYyhsZW4pOwogICAgIGlmICghYnVmKSB7Ci0JUHlFcnJfTm9NZW1vcnkoKTsKLQlyZXR1cm4gRVJSX0VYQ0VQVElPTjsKKyAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgcmV0dXJuIEVSUl9FWENFUFRJT047CiAgICAgfQogCiAgICAgZm9yIChpPTA7IGkgPCBsZW47IGkrKykgewogICAgICAgICBjaCA9IGZnZXRjKHNlbGYtPmxvZ2ZwKTsKLQlidWZbaV0gPSBjaDsKKyAgICAgICAgYnVmW2ldID0gY2g7CiAgICAgICAgIGlmIChjaCA9PSBFT0YpIHsKICAgICAgICAgICAgIGZyZWUoYnVmKTsKICAgICAgICAgICAgIHJldHVybiBFUlJfRU9GOwpAQCAtNDU5LDE2ICs0NTksMTYgQEAKICAgICAgICAgICAgIGVyciA9IEVSUl9FT0Y7CiAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgc2VsZi0+bGluZXRpbWluZ3MgPSBjID8gMSA6IDA7Ci0JICAgIGdvdG8gcmVzdGFydDsKLQl9CisgICAgICAgICAgICBnb3RvIHJlc3RhcnQ7CisgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBXSEFUX0ZSQU1FX1RJTUVTOgogICAgICAgICBpZiAoKGMgPSBmZ2V0YyhzZWxmLT5sb2dmcCkpID09IEVPRikKICAgICAgICAgICAgIGVyciA9IEVSUl9FT0Y7CiAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgc2VsZi0+ZnJhbWV0aW1pbmdzID0gYyA/IDEgOiAwOwotCSAgICBnb3RvIHJlc3RhcnQ7Ci0JfQorICAgICAgICAgICAgZ290byByZXN0YXJ0OworICAgICAgICB9CiAgICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6CiAgICAgICAgIGVyciA9IEVSUl9CQURfUkVDVFlQRTsKQEAgLTg3Niw3ICs4NzYsNyBAQAogICAgIGNhc2UgUHlUcmFjZV9MSU5FOiAgLyogd2Ugb25seSBnZXQgdGhlc2UgZXZlbnRzIGlmIHdlIGFza2VkIGZvciB0aGVtICovCiAgICAgICAgIGlmIChzZWxmLT5saW5ldGltaW5ncykKICAgICAgICAgICAgIHJldHVybiBwYWNrX2xpbmVub190ZGVsdGEoc2VsZiwgZnJhbWUtPmZfbGluZW5vLAotCQkJCSAgICAgIGdldF90ZGVsdGEoc2VsZikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfdGRlbHRhKHNlbGYpKTsKICAgICAgICAgZWxzZQogICAgICAgICAgICAgcmV0dXJuIHBhY2tfbGluZW5vKHNlbGYsIGZyYW1lLT5mX2xpbmVubyk7CiAKQEAgLTEyMjEsMzkgKzEyMjEsMzkgQEAKIAogc3RhdGljIFB5VHlwZU9iamVjdCBQcm9maWxlclR5cGUgPSB7CiAgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0gICAgIl9ob3RzaG90LlByb2ZpbGVyVHlwZSIsCQkvKiB0cF9uYW1lCQkqLwotICAgIChpbnQpIHNpemVvZihQcm9maWxlck9iamVjdCksCS8qIHRwX2Jhc2ljc2l6ZQkJKi8KLSAgICAwLAkJCQkJLyogdHBfaXRlbXNpemUJCSovCi0gICAgKGRlc3RydWN0b3IpcHJvZmlsZXJfZGVhbGxvYywJLyogdHBfZGVhbGxvYwkJKi8KLSAgICAwLAkJCQkJLyogdHBfcHJpbnQJCSovCi0gICAgMCwJCQkJCS8qIHRwX2dldGF0dHIJCSovCi0gICAgMCwJCQkJCS8qIHRwX3NldGF0dHIJCSovCi0gICAgMCwJCQkJCS8qIHRwX2NvbXBhcmUJCSovCi0gICAgMCwJCQkJCS8qIHRwX3JlcHIJCSovCi0gICAgMCwJCQkJCS8qIHRwX2FzX251bWJlcgkJKi8KLSAgICAwLAkJCQkJLyogdHBfYXNfc2VxdWVuY2UJKi8KLSAgICAwLAkJCQkJLyogdHBfYXNfbWFwcGluZwkqLwotICAgIDAsCQkJCQkvKiB0cF9oYXNoCQkqLwotICAgIDAsCQkJCQkvKiB0cF9jYWxsCQkqLwotICAgIDAsCQkJCQkvKiB0cF9zdHIJCSovCi0gICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCQkvKiB0cF9nZXRhdHRybwkJKi8KLSAgICAwLAkJCQkJLyogdHBfc2V0YXR0cm8JCSovCi0gICAgMCwJCQkJCS8qIHRwX2FzX2J1ZmZlcgkJKi8KLSAgICBQeV9UUEZMQUdTX0RFRkFVTFQsCQkJLyogdHBfZmxhZ3MJCSovCi0gICAgcHJvZmlsZXJfb2JqZWN0X19kb2NfXywJCS8qIHRwX2RvYwkJKi8KLSAgICAwLAkJCQkJLyogdHBfdHJhdmVyc2UJCSovCi0gICAgMCwJCQkJCS8qIHRwX2NsZWFyCQkqLwotICAgIDAsCQkJCQkvKiB0cF9yaWNoY29tcGFyZQkqLwotICAgIDAsCQkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldAkqLwotICAgIDAsCQkJCQkvKiB0cF9pdGVyCQkqLwotICAgIDAsCQkJCQkvKiB0cF9pdGVybmV4dAkJKi8KLSAgICBwcm9maWxlcl9tZXRob2RzLAkJCS8qIHRwX21ldGhvZHMJCSovCi0gICAgcHJvZmlsZXJfbWVtYmVycywJCQkvKiB0cF9tZW1iZXJzCQkqLwotICAgIHByb2ZpbGVyX2dldHNldHMsCQkJLyogdHBfZ2V0c2V0CQkqLwotICAgIDAsCQkJCQkvKiB0cF9iYXNlCQkqLwotICAgIDAsCQkJCQkvKiB0cF9kaWN0CQkqLwotICAgIDAsCQkJCQkvKiB0cF9kZXNjcl9nZXQJCSovCi0gICAgMCwJCQkJCS8qIHRwX2Rlc2NyX3NldAkJKi8KKyAgICAiX2hvdHNob3QuUHJvZmlsZXJUeXBlIiwgICAgICAgICAgICAvKiB0cF9uYW1lICAgICAgICAgICAgICAqLworICAgIChpbnQpIHNpemVvZihQcm9maWxlck9iamVjdCksICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAgICAgICAgICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgICAgICAgICAgKi8KKyAgICAoZGVzdHJ1Y3Rvcilwcm9maWxlcl9kZWFsbG9jLCAgICAgICAvKiB0cF9kZWFsbG9jICAgICAgICAgICAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICAgICAgICAgICAgICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAgICAgICAgICAgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICAgICAgICAgICAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgICAgICAgICAgICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAgICAgICAgICAgICAgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgICAgICAgICAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICAgICAgICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAgICAgICAgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICAgICAgICAgICAgICAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgICAgICAgICAgICAgICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICAgICAgICAgICAgICAgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAgICAgICAgICAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICAgICAgICAgICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICAgICAgICAgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQsICAgICAgICAgICAgICAgICAvKiB0cF9mbGFncyAgICAgICAgICAgICAqLworICAgIHByb2ZpbGVyX29iamVjdF9fZG9jX18sICAgICAgICAgICAgIC8qIHRwX2RvYyAgICAgICAgICAgICAgICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgICAgICAgICAgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAgICAgICAgICAgICAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICAgICAgICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgICAgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICAgICAgICAgICAgICAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICAgICAgICAgICovCisgICAgcHJvZmlsZXJfbWV0aG9kcywgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAgICAgICAgICAgKi8KKyAgICBwcm9maWxlcl9tZW1iZXJzLCAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICAgICAgICAgICAqLworICAgIHByb2ZpbGVyX2dldHNldHMsICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAgICAgICAgICAgICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAgICAgICAgICAgICAgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICAgICAgICAgICAgICAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAgICAgICAgICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICAgICAgICAgKi8KIH07CiAKIApAQCAtMTI3NywxNiArMTI3NywxNiBAQAogQ3JlYXRlIGEgbG9nLXJlYWRlciBmb3IgdGhlIHRpbWluZyBpbmZvcm1hdGlvbiBmaWxlLiIpOwogCiBzdGF0aWMgUHlTZXF1ZW5jZU1ldGhvZHMgbG9ncmVhZGVyX2FzX3NlcXVlbmNlID0gewotICAgIDAsCQkJCQkvKiBzcV9sZW5ndGggKi8KLSAgICAwLAkJCQkJLyogc3FfY29uY2F0ICovCi0gICAgMCwJCQkJCS8qIHNxX3JlcGVhdCAqLwotICAgIChzc2l6ZWFyZ2Z1bmMpbG9ncmVhZGVyX3NxX2l0ZW0sCS8qIHNxX2l0ZW0gKi8KLSAgICAwLAkJCQkJLyogc3Ffc2xpY2UgKi8KLSAgICAwLAkJCQkJLyogc3FfYXNzX2l0ZW0gKi8KLSAgICAwLAkJCQkJLyogc3FfYXNzX3NsaWNlICovCi0gICAgMCwJCQkJCS8qIHNxX2NvbnRhaW5zICovCi0gICAgMCwJCQkJCS8qIHNxX2lucGxhY2VfY29uY2F0ICovCi0gICAgMCwJCQkJCS8qIHNxX2lucGxhY2VfcmVwZWF0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3FfbGVuZ3RoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3FfY29uY2F0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3FfcmVwZWF0ICovCisgICAgKHNzaXplYXJnZnVuYylsb2dyZWFkZXJfc3FfaXRlbSwgICAgLyogc3FfaXRlbSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNxX3NsaWNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3FfYXNzX2l0ZW0gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzcV9hc3Nfc2xpY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzcV9jb250YWlucyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNxX2lucGxhY2VfY29uY2F0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3FfaW5wbGFjZV9yZXBlYXQgKi8KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC0xMzA1LDM5ICsxMzA1LDM5IEBACiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgTG9nUmVhZGVyVHlwZSA9IHsKICAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKLSAgICAiX2hvdHNob3QuTG9nUmVhZGVyVHlwZSIsCQkvKiB0cF9uYW1lCQkqLwotICAgIChpbnQpIHNpemVvZihMb2dSZWFkZXJPYmplY3QpLAkvKiB0cF9iYXNpY3NpemUJCSovCi0gICAgMCwJCQkJCS8qIHRwX2l0ZW1zaXplCQkqLwotICAgIChkZXN0cnVjdG9yKWxvZ3JlYWRlcl9kZWFsbG9jLAkvKiB0cF9kZWFsbG9jCQkqLwotICAgIDAsCQkJCQkvKiB0cF9wcmludAkJKi8KLSAgICAwLAkJCQkJLyogdHBfZ2V0YXR0cgkJKi8KLSAgICAwLAkJCQkJLyogdHBfc2V0YXR0cgkJKi8KLSAgICAwLAkJCQkJLyogdHBfY29tcGFyZQkJKi8KLSAgICAwLAkJCQkJLyogdHBfcmVwcgkJKi8KLSAgICAwLAkJCQkJLyogdHBfYXNfbnVtYmVyCQkqLwotICAgICZsb2dyZWFkZXJfYXNfc2VxdWVuY2UsCQkvKiB0cF9hc19zZXF1ZW5jZQkqLwotICAgIDAsCQkJCQkvKiB0cF9hc19tYXBwaW5nCSovCi0gICAgMCwJCQkJCS8qIHRwX2hhc2gJCSovCi0gICAgMCwJCQkJCS8qIHRwX2NhbGwJCSovCi0gICAgMCwJCQkJCS8qIHRwX3N0cgkJKi8KLSAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJCS8qIHRwX2dldGF0dHJvCQkqLwotICAgIDAsCQkJCQkvKiB0cF9zZXRhdHRybwkJKi8KLSAgICAwLAkJCQkJLyogdHBfYXNfYnVmZmVyCQkqLwotICAgIFB5X1RQRkxBR1NfREVGQVVMVCwJCQkvKiB0cF9mbGFncwkJKi8KLSAgICBsb2dyZWFkZXJfX2RvY19fLAkJCS8qIHRwX2RvYwkJKi8KLSAgICAwLAkJCQkJLyogdHBfdHJhdmVyc2UJCSovCi0gICAgMCwJCQkJCS8qIHRwX2NsZWFyCQkqLwotICAgIDAsCQkJCQkvKiB0cF9yaWNoY29tcGFyZQkqLwotICAgIDAsCQkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldAkqLwotICAgIFB5T2JqZWN0X1NlbGZJdGVyLAkJCS8qIHRwX2l0ZXIJCSovCi0gICAgKGl0ZXJuZXh0ZnVuYylsb2dyZWFkZXJfdHBfaXRlcm5leHQsLyogdHBfaXRlcm5leHQJCSovCi0gICAgbG9ncmVhZGVyX21ldGhvZHMsCQkJLyogdHBfbWV0aG9kcwkJKi8KLSAgICBsb2dyZWFkZXJfbWVtYmVycywJCQkvKiB0cF9tZW1iZXJzCQkqLwotICAgIGxvZ3JlYWRlcl9nZXRzZXRzLAkJCS8qIHRwX2dldHNldAkJKi8KLSAgICAwLAkJCQkJLyogdHBfYmFzZQkJKi8KLSAgICAwLAkJCQkJLyogdHBfZGljdAkJKi8KLSAgICAwLAkJCQkJLyogdHBfZGVzY3JfZ2V0CQkqLwotICAgIDAsCQkJCQkvKiB0cF9kZXNjcl9zZXQJCSovCisgICAgIl9ob3RzaG90LkxvZ1JlYWRlclR5cGUiLCAgICAgICAgICAgLyogdHBfbmFtZSAgICAgICAgICAgICAgKi8KKyAgICAoaW50KSBzaXplb2YoTG9nUmVhZGVyT2JqZWN0KSwgICAgICAvKiB0cF9iYXNpY3NpemUgICAgICAgICAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICAgICAgICAgICovCisgICAgKGRlc3RydWN0b3IpbG9ncmVhZGVyX2RlYWxsb2MsICAgICAgLyogdHBfZGVhbGxvYyAgICAgICAgICAgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAgICAgICAgICAgICAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgICAgICAgICAgICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAgICAgICAgICAgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICAgICAgICAgICAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgICAgICAgICAgICAgICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICAgICAgICAgKi8KKyAgICAmbG9ncmVhZGVyX2FzX3NlcXVlbmNlLCAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAgICAgICAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgICAgICAgICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAgICAgICAgICAgICAgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICAgICAgICAgICAgICAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAgICAgICAgICAgICAgICovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gICAgICAgICAgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAgICAgICAgICAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAgICAgICAgICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgICAgICAgICAgICAgLyogdHBfZmxhZ3MgICAgICAgICAgICAgKi8KKyAgICBsb2dyZWFkZXJfX2RvY19fLCAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgICAgICAgICAgICAgICAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICAgICAgICAgICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgICAgICAgICAgICAgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAgICAgICAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICAgICovCisgICAgUHlPYmplY3RfU2VsZkl0ZXIsICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAgICAgICAgICAgICAgKi8KKyAgICAoaXRlcm5leHRmdW5jKWxvZ3JlYWRlcl90cF9pdGVybmV4dCwvKiB0cF9pdGVybmV4dCAgICAgICAgICAqLworICAgIGxvZ3JlYWRlcl9tZXRob2RzLCAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgICAgICAgICAgICovCisgICAgbG9ncmVhZGVyX21lbWJlcnMsICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAgICAgICAgICAgKi8KKyAgICBsb2dyZWFkZXJfZ2V0c2V0cywgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgICAgICAgICAgICAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgICAgICAgICAgICAgICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAgICAgICAgICAgICAgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgICAgICAgICAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAgICAgICAgICovCiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKgpAQCAtMTQ2Myw4ICsxNDYzLDggQEAKIAogICAgIHRlbXAgPSBQeVN5c19HZXRPYmplY3QoInBhdGgiKTsKICAgICBpZiAodGVtcCA9PSBOVUxMIHx8ICFQeUxpc3RfQ2hlY2sodGVtcCkpIHsKLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAic3lzLnBhdGggbXVzdCBiZSBhIGxpc3QiKTsKLSAgICAJcmV0dXJuIC0xOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAic3lzLnBhdGggbXVzdCBiZSBhIGxpc3QiKTsKKyAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KICAgICBsZW4gPSBQeUxpc3RfR0VUX1NJWkUodGVtcCk7CiAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKSB7CkBAIC0xNTYyLDcgKzE1NjIsNyBAQAogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKLVB5RG9jX1ZBUihyZXNvbHV0aW9uX19kb2NfXykgPSAKK1B5RG9jX1ZBUihyZXNvbHV0aW9uX19kb2NfXykgPQogI2lmZGVmIE1TX1dJTkRPV1MKIFB5RG9jX1NUUigKICJyZXNvbHV0aW9uKCkgLT4gKHBlcmZvcm1hbmNlLWNvdW50ZXItdGlja3MsIHVwZGF0ZS1mcmVxdWVuY3kpXG4iCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19sb2NhbGVtb2R1bGUuYyBiL01vZHVsZXMvX2xvY2FsZW1vZHVsZS5jCmluZGV4IGJmNWQ1OGQuLjdlNDc1ZGEgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2xvY2FsZW1vZHVsZS5jCisrKyBiL01vZHVsZXMvX2xvY2FsZW1vZHVsZS5jCkBAIC0xNjUsNyArMTY1LDcgQEAKICAgICBQeU9iamVjdCAqcmVzdWx0X29iamVjdDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaXx6OnNldGxvY2FsZSIsICZjYXRlZ29yeSwgJmxvY2FsZSkpCi0gICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBOVUxMOwogCiAgICAgaWYgKGxvY2FsZSkgewogICAgICAgICAvKiBzZXQgbG9jYWxlICovCkBAIC0yNzIsNyArMjcyLDcgQEAKIHsKICNpZiAhZGVmaW5lZChIQVZFX1dDU0NPTEwpIHx8ICFkZWZpbmVkKFB5X1VTSU5HX1VOSUNPREUpCiAgICAgY2hhciAqczEsKnMyOwotICAgIAorCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzczpzdHJjb2xsIiwgJnMxLCAmczIpKQogICAgICAgICByZXR1cm4gTlVMTDsKICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoc3RyY29sbChzMSwgczIpKTsKQEAgLTI4MCw3ICsyODAsNyBAQAogICAgIFB5T2JqZWN0ICpvczEsICpvczIsICpyZXN1bHQgPSBOVUxMOwogICAgIHdjaGFyX3QgKndzMSA9IE5VTEwsICp3czIgPSBOVUxMOwogICAgIGludCByZWwxID0gMCwgcmVsMiA9IDAsIGxlbjEsIGxlbjI7Ci0gICAgCisKICAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJzdHJjb2xsIiwgMiwgMiwgJm9zMSwgJm9zMikpCiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIC8qIElmIGJvdGggYXJndW1lbnRzIGFyZSBieXRlIHN0cmluZ3MsIHVzZSBzdHJjb2xsLiAgKi8KQEAgLTMwNSw3ICszMDUsNyBAQAogICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihvczEpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0gCisgICAgICAgIH0KICAgICAgICAgcmVsMiA9IDE7CiAgICAgfQogICAgIC8qIENvbnZlcnQgdGhlIHVuaWNvZGUgc3RyaW5ncyB0byB3Y2hhcltdLiAqLwpAQCAtNDM0LDcgKzQzNCw3IEBACiAgICAgICAgIC8qIFRoaXMgbGVha3MgYW4gb2JqZWN0LiAqLwogICAgICAgICBuYW1lID0gQ0ZTdHJpbmdDb252ZXJ0RW5jb2RpbmdUb0lBTkFDaGFyU2V0TmFtZShlbmMpOwogICAgIH0KLSAgICByZXR1cm4gKGNoYXIgKilDRlN0cmluZ0dldENTdHJpbmdQdHIobmFtZSwgMCk7IAorICAgIHJldHVybiAoY2hhciAqKUNGU3RyaW5nR2V0Q1N0cmluZ1B0cihuYW1lLCAwKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0KgpAQCAtNDQ3LDkgKzQ0Nyw5IEBACiAjaWZkZWYgSEFWRV9MQU5HSU5GT19ICiAjZGVmaW5lIExBTkdJTkZPKFgpIHsjWCwgWH0KIHN0YXRpYyBzdHJ1Y3QgbGFuZ2luZm9fY29uc3RhbnR7Ci0JY2hhciogbmFtZTsKLQlpbnQgdmFsdWU7Ci19IGxhbmdpbmZvX2NvbnN0YW50c1tdID0gCisgICAgY2hhciogbmFtZTsKKyAgICBpbnQgdmFsdWU7Cit9IGxhbmdpbmZvX2NvbnN0YW50c1tdID0KIHsKICAgICAvKiBUaGVzZSBjb25zdGFudHMgc2hvdWxkIGV4aXN0IG9uIGFueSBsYW5naW5mbyBpbXBsZW1lbnRhdGlvbiAqLwogICAgIExBTkdJTkZPKERBWV8xKSwKQEAgLTU2NywxMiArNTY3LDEyIEBACiAgICAgICAgcmV0dXJucyBudW1lcmljIHZhbHVlcyBpbiB0aGUgY2hhciogcmV0dXJuIHZhbHVlLCB3aGljaCB3b3VsZAogICAgICAgIGNyYXNoIFB5U3RyaW5nX0Zyb21TdHJpbmcuICAqLwogICAgIGZvciAoaSA9IDA7IGxhbmdpbmZvX2NvbnN0YW50c1tpXS5uYW1lOyBpKyspCi0gICAgICAgIGlmIChsYW5naW5mb19jb25zdGFudHNbaV0udmFsdWUgPT0gaXRlbSkgewotICAgICAgICAgICAgLyogQ2hlY2sgTlVMTCBhcyBhIHdvcmthcm91bmQgZm9yIEdOVSBsaWJjJ3MgcmV0dXJuaW5nIE5VTEwKLSAgICAgICAgICAgICAgIGluc3RlYWQgb2YgYW4gZW1wdHkgc3RyaW5nIGZvciBubF9sYW5naW5mbyhFUkEpLiAgKi8KLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKnJlc3VsdCA9IG5sX2xhbmdpbmZvKGl0ZW0pOwotICAgICAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcocmVzdWx0ICE9IE5VTEwgPyByZXN1bHQgOiAiIik7Ci0gICAgICAgIH0KKyAgICBpZiAobGFuZ2luZm9fY29uc3RhbnRzW2ldLnZhbHVlID09IGl0ZW0pIHsKKyAgICAgICAgLyogQ2hlY2sgTlVMTCBhcyBhIHdvcmthcm91bmQgZm9yIEdOVSBsaWJjJ3MgcmV0dXJuaW5nIE5VTEwKKyAgICAgICAgICAgaW5zdGVhZCBvZiBhbiBlbXB0eSBzdHJpbmcgZm9yIG5sX2xhbmdpbmZvKEVSQSkuICAqLworICAgICAgICBjb25zdCBjaGFyICpyZXN1bHQgPSBubF9sYW5naW5mbyhpdGVtKTsKKyAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcocmVzdWx0ICE9IE5VTEwgPyByZXN1bHQgOiAiIik7CisgICAgfQogICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAidW5zdXBwb3J0ZWQgbGFuZ2luZm8gY29uc3RhbnQiKTsKICAgICByZXR1cm4gTlVMTDsKIH0KQEAgLTU4NywxMCArNTg3LDEwIEBACiBzdGF0aWMgUHlPYmplY3QqCiBQeUludGxfZ2V0dGV4dChQeU9iamVjdCogc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqaW47Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIiwgJmluKSkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoZ2V0dGV4dChpbikpOworICAgIGNoYXIgKmluOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyIsICZpbikpCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGdldHRleHQoaW4pKTsKIH0KIAogUHlEb2NfU1RSVkFSKGRnZXR0ZXh0X19kb2NfXywKQEAgLTYwMCwxMCArNjAwLDEwIEBACiBzdGF0aWMgUHlPYmplY3QqCiBQeUludGxfZGdldHRleHQoUHlPYmplY3QqIHNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKmRvbWFpbiwgKmluOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAienMiLCAmZG9tYWluLCAmaW4pKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhkZ2V0dGV4dChkb21haW4sIGluKSk7CisgICAgY2hhciAqZG9tYWluLCAqaW47CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ6cyIsICZkb21haW4sICZpbikpCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGRnZXR0ZXh0KGRvbWFpbiwgaW4pKTsKIH0KIAogUHlEb2NfU1RSVkFSKGRjZ2V0dGV4dF9fZG9jX18sCkBAIC02MTMsMTEgKzYxMywxMSBAQAogc3RhdGljIFB5T2JqZWN0KgogUHlJbnRsX2RjZ2V0dGV4dChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqZG9tYWluLCAqbXNnaWQ7Ci0JaW50IGNhdGVnb3J5OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAienNpIiwgJmRvbWFpbiwgJm1zZ2lkLCAmY2F0ZWdvcnkpKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhkY2dldHRleHQoZG9tYWluLG1zZ2lkLGNhdGVnb3J5KSk7CisgICAgY2hhciAqZG9tYWluLCAqbXNnaWQ7CisgICAgaW50IGNhdGVnb3J5OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAienNpIiwgJmRvbWFpbiwgJm1zZ2lkLCAmY2F0ZWdvcnkpKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhkY2dldHRleHQoZG9tYWluLG1zZ2lkLGNhdGVnb3J5KSk7CiB9CiAKIFB5RG9jX1NUUlZBUih0ZXh0ZG9tYWluX19kb2NfXywKQEAgLTYyNywxNSArNjI3LDE1IEBACiBzdGF0aWMgUHlPYmplY3QqCiBQeUludGxfdGV4dGRvbWFpbihQeU9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZ3MpCiB7Ci0JY2hhciAqZG9tYWluOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAieiIsICZkb21haW4pKQotCQlyZXR1cm4gMDsKLQlkb21haW4gPSB0ZXh0ZG9tYWluKGRvbWFpbik7Ci0JaWYgKCFkb21haW4pIHsKLQkJUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX09TRXJyb3IpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoZG9tYWluKTsKKyAgICBjaGFyICpkb21haW47CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ6IiwgJmRvbWFpbikpCisgICAgICAgIHJldHVybiAwOworICAgIGRvbWFpbiA9IHRleHRkb21haW4oZG9tYWluKTsKKyAgICBpZiAoIWRvbWFpbikgeworICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfT1NFcnJvcik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhkb21haW4pOwogfQogCiBQeURvY19TVFJWQVIoYmluZHRleHRkb21haW5fX2RvY19fLApAQCAtNjQ1LDE5ICs2NDUsMTkgQEAKIHN0YXRpYyBQeU9iamVjdCoKIFB5SW50bF9iaW5kdGV4dGRvbWFpbihQeU9iamVjdCogc2VsZixQeU9iamVjdCphcmdzKQogewotCWNoYXIgKmRvbWFpbiwgKmRpcm5hbWU7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzeiIsICZkb21haW4sICZkaXJuYW1lKSkKLQkJcmV0dXJuIDA7Ci0JaWYgKCFzdHJsZW4oZG9tYWluKSkgewotCQlQeUVycl9TZXRTdHJpbmcoRXJyb3IsICJkb21haW4gbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmciKTsKLQkJcmV0dXJuIDA7Ci0JfQotCWRpcm5hbWUgPSBiaW5kdGV4dGRvbWFpbihkb21haW4sIGRpcm5hbWUpOwotCWlmICghZGlybmFtZSkgewotCQlQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfT1NFcnJvcik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhkaXJuYW1lKTsKKyAgICBjaGFyICpkb21haW4sICpkaXJuYW1lOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic3oiLCAmZG9tYWluLCAmZGlybmFtZSkpCisgICAgICAgIHJldHVybiAwOworICAgIGlmICghc3RybGVuKGRvbWFpbikpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEVycm9yLCAiZG9tYWluIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBkaXJuYW1lID0gYmluZHRleHRkb21haW4oZG9tYWluLCBkaXJuYW1lKTsKKyAgICBpZiAoIWRpcm5hbWUpIHsKKyAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX09TRXJyb3IpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoZGlybmFtZSk7CiB9CiAKICNpZmRlZiBIQVZFX0JJTkRfVEVYVERPTUFJTl9DT0RFU0VUCkBAIC02NjgsMjYgKzY2OCwyNiBAQAogc3RhdGljIFB5T2JqZWN0KgogUHlJbnRsX2JpbmRfdGV4dGRvbWFpbl9jb2Rlc2V0KFB5T2JqZWN0KiBzZWxmLFB5T2JqZWN0KmFyZ3MpCiB7Ci0JY2hhciAqZG9tYWluLCpjb2Rlc2V0OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic3oiLCAmZG9tYWluLCAmY29kZXNldCkpCi0JCXJldHVybiBOVUxMOwotCWNvZGVzZXQgPSBiaW5kX3RleHRkb21haW5fY29kZXNldChkb21haW4sIGNvZGVzZXQpOwotCWlmIChjb2Rlc2V0KQotCQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhjb2Rlc2V0KTsKLQlQeV9SRVRVUk5fTk9ORTsKKyAgICBjaGFyICpkb21haW4sKmNvZGVzZXQ7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzeiIsICZkb21haW4sICZjb2Rlc2V0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgY29kZXNldCA9IGJpbmRfdGV4dGRvbWFpbl9jb2Rlc2V0KGRvbWFpbiwgY29kZXNldCk7CisgICAgaWYgKGNvZGVzZXQpCisgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGNvZGVzZXQpOworICAgIFB5X1JFVFVSTl9OT05FOwogfQogI2VuZGlmCiAKICNlbmRpZgogCiBzdGF0aWMgc3RydWN0IFB5TWV0aG9kRGVmIFB5TG9jYWxlX01ldGhvZHNbXSA9IHsKLSAgeyJzZXRsb2NhbGUiLCAoUHlDRnVuY3Rpb24pIFB5TG9jYWxlX3NldGxvY2FsZSwgCisgIHsic2V0bG9jYWxlIiwgKFB5Q0Z1bmN0aW9uKSBQeUxvY2FsZV9zZXRsb2NhbGUsCiAgICBNRVRIX1ZBUkFSR1MsIHNldGxvY2FsZV9fZG9jX199LAotICB7ImxvY2FsZWNvbnYiLCAoUHlDRnVuY3Rpb24pIFB5TG9jYWxlX2xvY2FsZWNvbnYsIAorICB7ImxvY2FsZWNvbnYiLCAoUHlDRnVuY3Rpb24pIFB5TG9jYWxlX2xvY2FsZWNvbnYsCiAgICBNRVRIX05PQVJHUywgbG9jYWxlY29udl9fZG9jX199LAotICB7InN0cmNvbGwiLCAoUHlDRnVuY3Rpb24pIFB5TG9jYWxlX3N0cmNvbGwsIAorICB7InN0cmNvbGwiLCAoUHlDRnVuY3Rpb24pIFB5TG9jYWxlX3N0cmNvbGwsCiAgICBNRVRIX1ZBUkFSR1MsIHN0cmNvbGxfX2RvY19ffSwKLSAgeyJzdHJ4ZnJtIiwgKFB5Q0Z1bmN0aW9uKSBQeUxvY2FsZV9zdHJ4ZnJtLCAKKyAgeyJzdHJ4ZnJtIiwgKFB5Q0Z1bmN0aW9uKSBQeUxvY2FsZV9zdHJ4ZnJtLAogICAgTUVUSF9WQVJBUkdTLCBzdHJ4ZnJtX19kb2NfX30sCiAjaWYgZGVmaW5lZChNU19XSU5ET1dTKSB8fCBkZWZpbmVkKF9fQVBQTEVfXykKICAgeyJfZ2V0ZGVmYXVsdGxvY2FsZSIsIChQeUNGdW5jdGlvbikgUHlMb2NhbGVfZ2V0ZGVmYXVsdGxvY2FsZSwgTUVUSF9OT0FSR1N9LApAQCAtNzExLDcgKzcxMSw3IEBACiAgIHsiYmluZF90ZXh0ZG9tYWluX2NvZGVzZXQiLChQeUNGdW5jdGlvbilQeUludGxfYmluZF90ZXh0ZG9tYWluX2NvZGVzZXQsCiAgICBNRVRIX1ZBUkFSR1MsIGJpbmRfdGV4dGRvbWFpbl9jb2Rlc2V0X19kb2NfX30sCiAjZW5kaWYKLSNlbmRpZiAgCisjZW5kaWYKICAge05VTEwsIE5VTEx9CiB9OwogCkBAIC03MjUsNyArNzI1LDcgQEAKIAogICAgIG0gPSBQeV9Jbml0TW9kdWxlKCJfbG9jYWxlIiwgUHlMb2NhbGVfTWV0aG9kcyk7CiAgICAgaWYgKG0gPT0gTlVMTCkKLSAgICAJcmV0dXJuOworICAgIHJldHVybjsKIAogICAgIGQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOwogCkBAIC03NzIsMTMgKzc3MiwxMyBAQAogCiAjaWZkZWYgSEFWRV9MQU5HSU5GT19ICiAgICAgZm9yIChpID0gMDsgbGFuZ2luZm9fY29uc3RhbnRzW2ldLm5hbWU7IGkrKykgewotCSAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCBsYW5naW5mb19jb25zdGFudHNbaV0ubmFtZSwKLQkJCQkgICAgbGFuZ2luZm9fY29uc3RhbnRzW2ldLnZhbHVlKTsKKyAgICAgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgbGFuZ2luZm9fY29uc3RhbnRzW2ldLm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbmdpbmZvX2NvbnN0YW50c1tpXS52YWx1ZSk7CiAgICAgfQogI2VuZGlmCiB9CiAKLS8qIAorLyoKIExvY2FsIHZhcmlhYmxlczoKIGMtYmFzaWMtb2Zmc2V0OiA0CiBpbmRlbnQtdGFicy1tb2RlOiBuaWwKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2xzcHJvZi5jIGIvTW9kdWxlcy9fbHNwcm9mLmMKaW5kZXggODgyMGZjZi4uMDQ5Yzk0ZCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fbHNwcm9mLmMKKysrIGIvTW9kdWxlcy9fbHNwcm9mLmMKQEAgLTE3LDE5ICsxNywxOSBAQAogc3RhdGljIFBZX0xPTkdfTE9ORwogaHBUaW1lcih2b2lkKQogewotCUxBUkdFX0lOVEVHRVIgbGk7Ci0JUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIoJmxpKTsKLQlyZXR1cm4gbGkuUXVhZFBhcnQ7CisgICAgTEFSR0VfSU5URUdFUiBsaTsKKyAgICBRdWVyeVBlcmZvcm1hbmNlQ291bnRlcigmbGkpOworICAgIHJldHVybiBsaS5RdWFkUGFydDsKIH0KIAogc3RhdGljIGRvdWJsZQogaHBUaW1lclVuaXQodm9pZCkKIHsKLQlMQVJHRV9JTlRFR0VSIGxpOwotCWlmIChRdWVyeVBlcmZvcm1hbmNlRnJlcXVlbmN5KCZsaSkpCi0JCXJldHVybiAxLjAgLyBsaS5RdWFkUGFydDsKLQllbHNlCi0JCXJldHVybiAwLjAwMDAwMTsgIC8qIHVubGlrZWx5ICovCisgICAgTEFSR0VfSU5URUdFUiBsaTsKKyAgICBpZiAoUXVlcnlQZXJmb3JtYW5jZUZyZXF1ZW5jeSgmbGkpKQorICAgICAgICByZXR1cm4gMS4wIC8gbGkuUXVhZFBhcnQ7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gMC4wMDAwMDE7ICAvKiB1bmxpa2VseSAqLwogfQogCiAjZWxzZSAgLyogIU1TX1dJTkRPV1MgKi8KQEAgLTQ4LDIyICs0OCwyMiBAQAogc3RhdGljIFBZX0xPTkdfTE9ORwogaHBUaW1lcih2b2lkKQogewotCXN0cnVjdCB0aW1ldmFsIHR2OwotCVBZX0xPTkdfTE9ORyByZXQ7CisgICAgc3RydWN0IHRpbWV2YWwgdHY7CisgICAgUFlfTE9OR19MT05HIHJldDsKICNpZmRlZiBHRVRUSU1FT0ZEQVlfTk9fVFoKLQlnZXR0aW1lb2ZkYXkoJnR2KTsKKyAgICBnZXR0aW1lb2ZkYXkoJnR2KTsKICNlbHNlCi0JZ2V0dGltZW9mZGF5KCZ0diwgKHN0cnVjdCB0aW1lem9uZSAqKU5VTEwpOworICAgIGdldHRpbWVvZmRheSgmdHYsIChzdHJ1Y3QgdGltZXpvbmUgKilOVUxMKTsKICNlbmRpZgotCXJldCA9IHR2LnR2X3NlYzsKLQlyZXQgPSByZXQgKiAxMDAwMDAwICsgdHYudHZfdXNlYzsKLQlyZXR1cm4gcmV0OworICAgIHJldCA9IHR2LnR2X3NlYzsKKyAgICByZXQgPSByZXQgKiAxMDAwMDAwICsgdHYudHZfdXNlYzsKKyAgICByZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgZG91YmxlCiBocFRpbWVyVW5pdCh2b2lkKQogewotCXJldHVybiAwLjAwMDAwMTsKKyAgICByZXR1cm4gMC4wMDAwMDE7CiB9CiAKICNlbmRpZiAgLyogTVNfV0lORE9XUyAqLwpAQCAtNzUsNDEgKzc1LDQxIEBACiAKIC8qIHJlcHJlc2VudHMgYSBmdW5jdGlvbiBjYWxsZWQgZnJvbSBhbm90aGVyIGZ1bmN0aW9uICovCiB0eXBlZGVmIHN0cnVjdCBfUHJvZmlsZXJTdWJFbnRyeSB7Ci0Jcm90YXRpbmdfbm9kZV90IGhlYWRlcjsKLQlQWV9MT05HX0xPTkcgdHQ7Ci0JUFlfTE9OR19MT05HIGl0OwotCWxvbmcgY2FsbGNvdW50OwotCWxvbmcgcmVjdXJzaXZlY2FsbGNvdW50OwotCWxvbmcgcmVjdXJzaW9uTGV2ZWw7CisgICAgcm90YXRpbmdfbm9kZV90IGhlYWRlcjsKKyAgICBQWV9MT05HX0xPTkcgdHQ7CisgICAgUFlfTE9OR19MT05HIGl0OworICAgIGxvbmcgY2FsbGNvdW50OworICAgIGxvbmcgcmVjdXJzaXZlY2FsbGNvdW50OworICAgIGxvbmcgcmVjdXJzaW9uTGV2ZWw7CiB9IFByb2ZpbGVyU3ViRW50cnk7CiAKIC8qIHJlcHJlc2VudHMgYSBmdW5jdGlvbiBvciB1c2VyIGRlZmluZWQgYmxvY2sgKi8KIHR5cGVkZWYgc3RydWN0IF9Qcm9maWxlckVudHJ5IHsKLQlyb3RhdGluZ19ub2RlX3QgaGVhZGVyOwotCVB5T2JqZWN0ICp1c2VyT2JqOyAvKiBQeUNvZGVPYmplY3QsIG9yIGEgZGVzY3JpcHRpdmUgc3RyIGZvciBidWlsdGlucyAqLwotCVBZX0xPTkdfTE9ORyB0dDsgLyogdG90YWwgdGltZSBpbiB0aGlzIGVudHJ5ICovCi0JUFlfTE9OR19MT05HIGl0OyAvKiBpbmxpbmUgdGltZSBpbiB0aGlzIGVudHJ5IChub3QgaW4gc3ViY2FsbHMpICovCi0JbG9uZyBjYWxsY291bnQ7IC8qIGhvdyBtYW55IHRpbWVzIHRoaXMgd2FzIGNhbGxlZCAqLwotCWxvbmcgcmVjdXJzaXZlY2FsbGNvdW50OyAvKiBob3cgbWFueSB0aW1lcyBjYWxsZWQgcmVjdXJzaXZlbHkgKi8KLQlsb25nIHJlY3Vyc2lvbkxldmVsOwotCXJvdGF0aW5nX25vZGVfdCAqY2FsbHM7CisgICAgcm90YXRpbmdfbm9kZV90IGhlYWRlcjsKKyAgICBQeU9iamVjdCAqdXNlck9iajsgLyogUHlDb2RlT2JqZWN0LCBvciBhIGRlc2NyaXB0aXZlIHN0ciBmb3IgYnVpbHRpbnMgKi8KKyAgICBQWV9MT05HX0xPTkcgdHQ7IC8qIHRvdGFsIHRpbWUgaW4gdGhpcyBlbnRyeSAqLworICAgIFBZX0xPTkdfTE9ORyBpdDsgLyogaW5saW5lIHRpbWUgaW4gdGhpcyBlbnRyeSAobm90IGluIHN1YmNhbGxzKSAqLworICAgIGxvbmcgY2FsbGNvdW50OyAvKiBob3cgbWFueSB0aW1lcyB0aGlzIHdhcyBjYWxsZWQgKi8KKyAgICBsb25nIHJlY3Vyc2l2ZWNhbGxjb3VudDsgLyogaG93IG1hbnkgdGltZXMgY2FsbGVkIHJlY3Vyc2l2ZWx5ICovCisgICAgbG9uZyByZWN1cnNpb25MZXZlbDsKKyAgICByb3RhdGluZ19ub2RlX3QgKmNhbGxzOwogfSBQcm9maWxlckVudHJ5OwogCiB0eXBlZGVmIHN0cnVjdCBfUHJvZmlsZXJDb250ZXh0IHsKLQlQWV9MT05HX0xPTkcgdDA7Ci0JUFlfTE9OR19MT05HIHN1YnQ7Ci0Jc3RydWN0IF9Qcm9maWxlckNvbnRleHQgKnByZXZpb3VzOwotCVByb2ZpbGVyRW50cnkgKmN0eEVudHJ5OworICAgIFBZX0xPTkdfTE9ORyB0MDsKKyAgICBQWV9MT05HX0xPTkcgc3VidDsKKyAgICBzdHJ1Y3QgX1Byb2ZpbGVyQ29udGV4dCAqcHJldmlvdXM7CisgICAgUHJvZmlsZXJFbnRyeSAqY3R4RW50cnk7CiB9IFByb2ZpbGVyQ29udGV4dDsKIAogdHlwZWRlZiBzdHJ1Y3QgewotCVB5T2JqZWN0X0hFQUQKLQlyb3RhdGluZ19ub2RlX3QgKnByb2ZpbGVyRW50cmllczsKLQlQcm9maWxlckNvbnRleHQgKmN1cnJlbnRQcm9maWxlckNvbnRleHQ7Ci0JUHJvZmlsZXJDb250ZXh0ICpmcmVlbGlzdFByb2ZpbGVyQ29udGV4dDsKLQlpbnQgZmxhZ3M7Ci0JUHlPYmplY3QgKmV4dGVybmFsVGltZXI7Ci0JZG91YmxlIGV4dGVybmFsVGltZXJVbml0OworICAgIFB5T2JqZWN0X0hFQUQKKyAgICByb3RhdGluZ19ub2RlX3QgKnByb2ZpbGVyRW50cmllczsKKyAgICBQcm9maWxlckNvbnRleHQgKmN1cnJlbnRQcm9maWxlckNvbnRleHQ7CisgICAgUHJvZmlsZXJDb250ZXh0ICpmcmVlbGlzdFByb2ZpbGVyQ29udGV4dDsKKyAgICBpbnQgZmxhZ3M7CisgICAgUHlPYmplY3QgKmV4dGVybmFsVGltZXI7CisgICAgZG91YmxlIGV4dGVybmFsVGltZXJVbml0OwogfSBQcm9maWxlck9iamVjdDsKIAogI2RlZmluZSBQT0ZfRU5BQkxFRCAgICAgMHgwMDEKQEAgLTEyOSw0MDcgKzEyOSw0MDcgQEAKIAogc3RhdGljIFBZX0xPTkdfTE9ORyBDYWxsRXh0ZXJuYWxUaW1lcihQcm9maWxlck9iamVjdCAqcE9iaikKIHsKLQlQWV9MT05HX0xPTkcgcmVzdWx0OwotCVB5T2JqZWN0ICpvID0gUHlPYmplY3RfQ2FsbChwT2JqLT5leHRlcm5hbFRpbWVyLCBlbXB0eV90dXBsZSwgTlVMTCk7Ci0JaWYgKG8gPT0gTlVMTCkgewotCQlQeUVycl9Xcml0ZVVucmFpc2FibGUocE9iai0+ZXh0ZXJuYWxUaW1lcik7Ci0JCXJldHVybiAwOwotCX0KLQlpZiAocE9iai0+ZXh0ZXJuYWxUaW1lclVuaXQgPiAwLjApIHsKLQkJLyogaW50ZXJwcmV0IHRoZSByZXN1bHQgYXMgYW4gaW50ZWdlciB0aGF0IHdpbGwgYmUgc2NhbGVkCi0JCSAgIGluIHByb2ZpbGVyX2dldHN0YXRzKCkgKi8KLQkJcmVzdWx0ID0gUHlMb25nX0FzTG9uZ0xvbmcobyk7Ci0JfQotCWVsc2UgewotCQkvKiBpbnRlcnByZXQgdGhlIHJlc3VsdCBhcyBhIGRvdWJsZSBtZWFzdXJlZCBpbiBzZWNvbmRzLgotCQkgICBBcyB0aGUgcHJvZmlsZXIgd29ya3Mgd2l0aCBQWV9MT05HX0xPTkcgaW50ZXJuYWxseQotCQkgICB3ZSBjb252ZXJ0IGl0IHRvIGEgbGFyZ2UgaW50ZWdlciAqLwotCQlkb3VibGUgdmFsID0gUHlGbG9hdF9Bc0RvdWJsZShvKTsKLQkJLyogZXJyb3IgaGFuZGxpbmcgZGVsYXllZCB0byB0aGUgY29kZSBiZWxvdyAqLwotCQlyZXN1bHQgPSAoUFlfTE9OR19MT05HKSAodmFsICogRE9VQkxFX1RJTUVSX1BSRUNJU0lPTik7Ci0JfQotCVB5X0RFQ1JFRihvKTsKLQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkgewotCQlQeUVycl9Xcml0ZVVucmFpc2FibGUocE9iai0+ZXh0ZXJuYWxUaW1lcik7Ci0JCXJldHVybiAwOwotCX0KLQlyZXR1cm4gcmVzdWx0OworICAgIFBZX0xPTkdfTE9ORyByZXN1bHQ7CisgICAgUHlPYmplY3QgKm8gPSBQeU9iamVjdF9DYWxsKHBPYmotPmV4dGVybmFsVGltZXIsIGVtcHR5X3R1cGxlLCBOVUxMKTsKKyAgICBpZiAobyA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1dyaXRlVW5yYWlzYWJsZShwT2JqLT5leHRlcm5hbFRpbWVyKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChwT2JqLT5leHRlcm5hbFRpbWVyVW5pdCA+IDAuMCkgeworICAgICAgICAvKiBpbnRlcnByZXQgdGhlIHJlc3VsdCBhcyBhbiBpbnRlZ2VyIHRoYXQgd2lsbCBiZSBzY2FsZWQKKyAgICAgICAgICAgaW4gcHJvZmlsZXJfZ2V0c3RhdHMoKSAqLworICAgICAgICByZXN1bHQgPSBQeUxvbmdfQXNMb25nTG9uZyhvKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8qIGludGVycHJldCB0aGUgcmVzdWx0IGFzIGEgZG91YmxlIG1lYXN1cmVkIGluIHNlY29uZHMuCisgICAgICAgICAgIEFzIHRoZSBwcm9maWxlciB3b3JrcyB3aXRoIFBZX0xPTkdfTE9ORyBpbnRlcm5hbGx5CisgICAgICAgICAgIHdlIGNvbnZlcnQgaXQgdG8gYSBsYXJnZSBpbnRlZ2VyICovCisgICAgICAgIGRvdWJsZSB2YWwgPSBQeUZsb2F0X0FzRG91YmxlKG8pOworICAgICAgICAvKiBlcnJvciBoYW5kbGluZyBkZWxheWVkIHRvIHRoZSBjb2RlIGJlbG93ICovCisgICAgICAgIHJlc3VsdCA9IChQWV9MT05HX0xPTkcpICh2YWwgKiBET1VCTEVfVElNRVJfUFJFQ0lTSU9OKTsKKyAgICB9CisgICAgUHlfREVDUkVGKG8pOworICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgIFB5RXJyX1dyaXRlVW5yYWlzYWJsZShwT2JqLT5leHRlcm5hbFRpbWVyKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CiB9CiAKLSNkZWZpbmUgQ0FMTF9USU1FUihwT2JqKQkoKHBPYmopLT5leHRlcm5hbFRpbWVyID8JCVwKLQkJCQkJQ2FsbEV4dGVybmFsVGltZXIocE9iaikgOglcCi0JCQkJCWhwVGltZXIoKSkKKyNkZWZpbmUgQ0FMTF9USU1FUihwT2JqKSAgICAgICAgKChwT2JqKS0+ZXh0ZXJuYWxUaW1lciA/ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsRXh0ZXJuYWxUaW1lcihwT2JqKSA6ICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBocFRpbWVyKCkpCiAKIC8qKiogUHJvZmlsZXJPYmplY3QgKioqLwogCiBzdGF0aWMgUHlPYmplY3QgKgogbm9ybWFsaXplVXNlck9iaihQeU9iamVjdCAqb2JqKQogewotCVB5Q0Z1bmN0aW9uT2JqZWN0ICpmbjsKLQlpZiAoIVB5Q0Z1bmN0aW9uX0NoZWNrKG9iaikpIHsKLQkJUHlfSU5DUkVGKG9iaik7Ci0JCXJldHVybiBvYmo7Ci0JfQotCS8qIFJlcGxhY2UgYnVpbHQtaW4gZnVuY3Rpb24gb2JqZWN0cyB3aXRoIGEgZGVzY3JpcHRpdmUgc3RyaW5nCi0JICAgYmVjYXVzZSBvZiBidWlsdC1pbiBtZXRob2RzIC0tIGtlZXBpbmcgYSByZWZlcmVuY2UgdG8KLQkgICBfX3NlbGZfXyBpcyBwcm9iYWJseSBub3QgYSBnb29kIGlkZWEuICovCi0JZm4gPSAoUHlDRnVuY3Rpb25PYmplY3QgKilvYmo7CisgICAgUHlDRnVuY3Rpb25PYmplY3QgKmZuOworICAgIGlmICghUHlDRnVuY3Rpb25fQ2hlY2sob2JqKSkgeworICAgICAgICBQeV9JTkNSRUYob2JqKTsKKyAgICAgICAgcmV0dXJuIG9iajsKKyAgICB9CisgICAgLyogUmVwbGFjZSBidWlsdC1pbiBmdW5jdGlvbiBvYmplY3RzIHdpdGggYSBkZXNjcmlwdGl2ZSBzdHJpbmcKKyAgICAgICBiZWNhdXNlIG9mIGJ1aWx0LWluIG1ldGhvZHMgLS0ga2VlcGluZyBhIHJlZmVyZW5jZSB0bworICAgICAgIF9fc2VsZl9fIGlzIHByb2JhYmx5IG5vdCBhIGdvb2QgaWRlYS4gKi8KKyAgICBmbiA9IChQeUNGdW5jdGlvbk9iamVjdCAqKW9iajsKIAotCWlmIChmbi0+bV9zZWxmID09IE5VTEwpIHsKLQkJLyogYnVpbHQtaW4gZnVuY3Rpb246IGxvb2sgdXAgdGhlIG1vZHVsZSBuYW1lICovCi0JCVB5T2JqZWN0ICptb2QgPSBmbi0+bV9tb2R1bGU7Ci0JCWNoYXIgKm1vZG5hbWU7Ci0JCWlmIChtb2QgJiYgUHlTdHJpbmdfQ2hlY2sobW9kKSkgewotCQkJbW9kbmFtZSA9IFB5U3RyaW5nX0FTX1NUUklORyhtb2QpOwotCQl9Ci0JCWVsc2UgaWYgKG1vZCAmJiBQeU1vZHVsZV9DaGVjayhtb2QpKSB7Ci0JCQltb2RuYW1lID0gUHlNb2R1bGVfR2V0TmFtZShtb2QpOwotCQkJaWYgKG1vZG5hbWUgPT0gTlVMTCkgewotCQkJCVB5RXJyX0NsZWFyKCk7Ci0JCQkJbW9kbmFtZSA9ICJfX2J1aWx0aW5fXyI7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQltb2RuYW1lID0gIl9fYnVpbHRpbl9fIjsKLQkJfQotCQlpZiAoc3RyY21wKG1vZG5hbWUsICJfX2J1aWx0aW5fXyIpICE9IDApCi0JCQlyZXR1cm4gUHlTdHJpbmdfRnJvbUZvcm1hdCgiPCVzLiVzPiIsCi0JCQkJCQkgICBtb2RuYW1lLAotCQkJCQkJICAgZm4tPm1fbWwtPm1sX25hbWUpOwotCQllbHNlCi0JCQlyZXR1cm4gUHlTdHJpbmdfRnJvbUZvcm1hdCgiPCVzPiIsCi0JCQkJCQkgICBmbi0+bV9tbC0+bWxfbmFtZSk7Ci0JfQotCWVsc2UgewotCQkvKiBidWlsdC1pbiBtZXRob2Q6IHRyeSB0byByZXR1cm4KLQkJCXJlcHIoZ2V0YXR0cih0eXBlKF9fc2VsZl9fKSwgX19uYW1lX18pKQotCQkqLwotCQlQeU9iamVjdCAqc2VsZiA9IGZuLT5tX3NlbGY7Ci0JCVB5T2JqZWN0ICpuYW1lID0gUHlTdHJpbmdfRnJvbVN0cmluZyhmbi0+bV9tbC0+bWxfbmFtZSk7Ci0JCWlmIChuYW1lICE9IE5VTEwpIHsKLQkJCVB5T2JqZWN0ICptbyA9IF9QeVR5cGVfTG9va3VwKFB5X1RZUEUoc2VsZiksIG5hbWUpOwotCQkJUHlfWElOQ1JFRihtbyk7Ci0JCQlQeV9ERUNSRUYobmFtZSk7Ci0JCQlpZiAobW8gIT0gTlVMTCkgewotCQkJCVB5T2JqZWN0ICpyZXMgPSBQeU9iamVjdF9SZXByKG1vKTsKLQkJCQlQeV9ERUNSRUYobW8pOwotCQkJCWlmIChyZXMgIT0gTlVMTCkKLQkJCQkJcmV0dXJuIHJlczsKLQkJCX0KLQkJfQotCQlQeUVycl9DbGVhcigpOwotCQlyZXR1cm4gUHlTdHJpbmdfRnJvbUZvcm1hdCgiPGJ1aWx0LWluIG1ldGhvZCAlcz4iLAotCQkJCQkgICBmbi0+bV9tbC0+bWxfbmFtZSk7Ci0JfQorICAgIGlmIChmbi0+bV9zZWxmID09IE5VTEwpIHsKKyAgICAgICAgLyogYnVpbHQtaW4gZnVuY3Rpb246IGxvb2sgdXAgdGhlIG1vZHVsZSBuYW1lICovCisgICAgICAgIFB5T2JqZWN0ICptb2QgPSBmbi0+bV9tb2R1bGU7CisgICAgICAgIGNoYXIgKm1vZG5hbWU7CisgICAgICAgIGlmIChtb2QgJiYgUHlTdHJpbmdfQ2hlY2sobW9kKSkgeworICAgICAgICAgICAgbW9kbmFtZSA9IFB5U3RyaW5nX0FTX1NUUklORyhtb2QpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKG1vZCAmJiBQeU1vZHVsZV9DaGVjayhtb2QpKSB7CisgICAgICAgICAgICBtb2RuYW1lID0gUHlNb2R1bGVfR2V0TmFtZShtb2QpOworICAgICAgICAgICAgaWYgKG1vZG5hbWUgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICAgICAgbW9kbmFtZSA9ICJfX2J1aWx0aW5fXyI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBtb2RuYW1lID0gIl9fYnVpbHRpbl9fIjsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RyY21wKG1vZG5hbWUsICJfX2J1aWx0aW5fXyIpICE9IDApCisgICAgICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbUZvcm1hdCgiPCVzLiVzPiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm4tPm1fbWwtPm1sX25hbWUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbUZvcm1hdCgiPCVzPiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbi0+bV9tbC0+bWxfbmFtZSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvKiBidWlsdC1pbiBtZXRob2Q6IHRyeSB0byByZXR1cm4KKyAgICAgICAgICAgIHJlcHIoZ2V0YXR0cih0eXBlKF9fc2VsZl9fKSwgX19uYW1lX18pKQorICAgICAgICAqLworICAgICAgICBQeU9iamVjdCAqc2VsZiA9IGZuLT5tX3NlbGY7CisgICAgICAgIFB5T2JqZWN0ICpuYW1lID0gUHlTdHJpbmdfRnJvbVN0cmluZyhmbi0+bV9tbC0+bWxfbmFtZSk7CisgICAgICAgIGlmIChuYW1lICE9IE5VTEwpIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICptbyA9IF9QeVR5cGVfTG9va3VwKFB5X1RZUEUoc2VsZiksIG5hbWUpOworICAgICAgICAgICAgUHlfWElOQ1JFRihtbyk7CisgICAgICAgICAgICBQeV9ERUNSRUYobmFtZSk7CisgICAgICAgICAgICBpZiAobW8gIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpyZXMgPSBQeU9iamVjdF9SZXByKG1vKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYobW8pOworICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbUZvcm1hdCgiPGJ1aWx0LWluIG1ldGhvZCAlcz4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbi0+bV9tbC0+bWxfbmFtZSk7CisgICAgfQogfQogCiBzdGF0aWMgUHJvZmlsZXJFbnRyeSoKIG5ld1Byb2ZpbGVyRW50cnkoUHJvZmlsZXJPYmplY3QgKnBPYmosIHZvaWQgKmtleSwgUHlPYmplY3QgKnVzZXJPYmopCiB7Ci0JUHJvZmlsZXJFbnRyeSAqc2VsZjsKLQlzZWxmID0gKFByb2ZpbGVyRW50cnkqKSBtYWxsb2Moc2l6ZW9mKFByb2ZpbGVyRW50cnkpKTsKLQlpZiAoc2VsZiA9PSBOVUxMKSB7Ci0JCXBPYmotPmZsYWdzIHw9IFBPRl9OT01FTU9SWTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXVzZXJPYmogPSBub3JtYWxpemVVc2VyT2JqKHVzZXJPYmopOwotCWlmICh1c2VyT2JqID09IE5VTEwpIHsKLQkJUHlFcnJfQ2xlYXIoKTsKLQkJZnJlZShzZWxmKTsKLQkJcE9iai0+ZmxhZ3MgfD0gUE9GX05PTUVNT1JZOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0Jc2VsZi0+aGVhZGVyLmtleSA9IGtleTsKLQlzZWxmLT51c2VyT2JqID0gdXNlck9iajsKLQlzZWxmLT50dCA9IDA7Ci0Jc2VsZi0+aXQgPSAwOwotCXNlbGYtPmNhbGxjb3VudCA9IDA7Ci0Jc2VsZi0+cmVjdXJzaXZlY2FsbGNvdW50ID0gMDsKLQlzZWxmLT5yZWN1cnNpb25MZXZlbCA9IDA7Ci0Jc2VsZi0+Y2FsbHMgPSBFTVBUWV9ST1RBVElOR19UUkVFOwotCVJvdGF0aW5nVHJlZV9BZGQoJnBPYmotPnByb2ZpbGVyRW50cmllcywgJnNlbGYtPmhlYWRlcik7Ci0JcmV0dXJuIHNlbGY7CisgICAgUHJvZmlsZXJFbnRyeSAqc2VsZjsKKyAgICBzZWxmID0gKFByb2ZpbGVyRW50cnkqKSBtYWxsb2Moc2l6ZW9mKFByb2ZpbGVyRW50cnkpKTsKKyAgICBpZiAoc2VsZiA9PSBOVUxMKSB7CisgICAgICAgIHBPYmotPmZsYWdzIHw9IFBPRl9OT01FTU9SWTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHVzZXJPYmogPSBub3JtYWxpemVVc2VyT2JqKHVzZXJPYmopOworICAgIGlmICh1c2VyT2JqID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgZnJlZShzZWxmKTsKKyAgICAgICAgcE9iai0+ZmxhZ3MgfD0gUE9GX05PTUVNT1JZOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgc2VsZi0+aGVhZGVyLmtleSA9IGtleTsKKyAgICBzZWxmLT51c2VyT2JqID0gdXNlck9iajsKKyAgICBzZWxmLT50dCA9IDA7CisgICAgc2VsZi0+aXQgPSAwOworICAgIHNlbGYtPmNhbGxjb3VudCA9IDA7CisgICAgc2VsZi0+cmVjdXJzaXZlY2FsbGNvdW50ID0gMDsKKyAgICBzZWxmLT5yZWN1cnNpb25MZXZlbCA9IDA7CisgICAgc2VsZi0+Y2FsbHMgPSBFTVBUWV9ST1RBVElOR19UUkVFOworICAgIFJvdGF0aW5nVHJlZV9BZGQoJnBPYmotPnByb2ZpbGVyRW50cmllcywgJnNlbGYtPmhlYWRlcik7CisgICAgcmV0dXJuIHNlbGY7CiB9CiAKIHN0YXRpYyBQcm9maWxlckVudHJ5KgogZ2V0RW50cnkoUHJvZmlsZXJPYmplY3QgKnBPYmosIHZvaWQgKmtleSkKIHsKLQlyZXR1cm4gKFByb2ZpbGVyRW50cnkqKSBSb3RhdGluZ1RyZWVfR2V0KCZwT2JqLT5wcm9maWxlckVudHJpZXMsIGtleSk7CisgICAgcmV0dXJuIChQcm9maWxlckVudHJ5KikgUm90YXRpbmdUcmVlX0dldCgmcE9iai0+cHJvZmlsZXJFbnRyaWVzLCBrZXkpOwogfQogCi1zdGF0aWMgUHJvZmlsZXJTdWJFbnRyeSAqIAorc3RhdGljIFByb2ZpbGVyU3ViRW50cnkgKgogZ2V0U3ViRW50cnkoUHJvZmlsZXJPYmplY3QgKnBPYmosIFByb2ZpbGVyRW50cnkgKmNhbGxlciwgUHJvZmlsZXJFbnRyeSogZW50cnkpCiB7Ci0JcmV0dXJuIChQcm9maWxlclN1YkVudHJ5KikgUm90YXRpbmdUcmVlX0dldCgmY2FsbGVyLT5jYWxscywKLQkJCQkJCSAgICAodm9pZCAqKWVudHJ5KTsKKyAgICByZXR1cm4gKFByb2ZpbGVyU3ViRW50cnkqKSBSb3RhdGluZ1RyZWVfR2V0KCZjYWxsZXItPmNhbGxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKillbnRyeSk7CiB9CiAKIHN0YXRpYyBQcm9maWxlclN1YkVudHJ5ICoKIG5ld1N1YkVudHJ5KFByb2ZpbGVyT2JqZWN0ICpwT2JqLCAgUHJvZmlsZXJFbnRyeSAqY2FsbGVyLCBQcm9maWxlckVudHJ5KiBlbnRyeSkKIHsKLQlQcm9maWxlclN1YkVudHJ5ICpzZWxmOwotCXNlbGYgPSAoUHJvZmlsZXJTdWJFbnRyeSopIG1hbGxvYyhzaXplb2YoUHJvZmlsZXJTdWJFbnRyeSkpOwotCWlmIChzZWxmID09IE5VTEwpIHsKLQkJcE9iai0+ZmxhZ3MgfD0gUE9GX05PTUVNT1JZOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0Jc2VsZi0+aGVhZGVyLmtleSA9ICh2b2lkICopZW50cnk7Ci0Jc2VsZi0+dHQgPSAwOwotCXNlbGYtPml0ID0gMDsKLQlzZWxmLT5jYWxsY291bnQgPSAwOwotCXNlbGYtPnJlY3Vyc2l2ZWNhbGxjb3VudCA9IDA7Ci0Jc2VsZi0+cmVjdXJzaW9uTGV2ZWwgPSAwOwotCVJvdGF0aW5nVHJlZV9BZGQoJmNhbGxlci0+Y2FsbHMsICZzZWxmLT5oZWFkZXIpOwotCXJldHVybiBzZWxmOworICAgIFByb2ZpbGVyU3ViRW50cnkgKnNlbGY7CisgICAgc2VsZiA9IChQcm9maWxlclN1YkVudHJ5KikgbWFsbG9jKHNpemVvZihQcm9maWxlclN1YkVudHJ5KSk7CisgICAgaWYgKHNlbGYgPT0gTlVMTCkgeworICAgICAgICBwT2JqLT5mbGFncyB8PSBQT0ZfTk9NRU1PUlk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBzZWxmLT5oZWFkZXIua2V5ID0gKHZvaWQgKillbnRyeTsKKyAgICBzZWxmLT50dCA9IDA7CisgICAgc2VsZi0+aXQgPSAwOworICAgIHNlbGYtPmNhbGxjb3VudCA9IDA7CisgICAgc2VsZi0+cmVjdXJzaXZlY2FsbGNvdW50ID0gMDsKKyAgICBzZWxmLT5yZWN1cnNpb25MZXZlbCA9IDA7CisgICAgUm90YXRpbmdUcmVlX0FkZCgmY2FsbGVyLT5jYWxscywgJnNlbGYtPmhlYWRlcik7CisgICAgcmV0dXJuIHNlbGY7CiB9CiAKIHN0YXRpYyBpbnQgZnJlZVN1YkVudHJ5KHJvdGF0aW5nX25vZGVfdCAqaGVhZGVyLCB2b2lkICphcmcpCiB7Ci0JUHJvZmlsZXJTdWJFbnRyeSAqc3ViZW50cnkgPSAoUHJvZmlsZXJTdWJFbnRyeSopIGhlYWRlcjsKLQlmcmVlKHN1YmVudHJ5KTsKLQlyZXR1cm4gMDsKKyAgICBQcm9maWxlclN1YkVudHJ5ICpzdWJlbnRyeSA9IChQcm9maWxlclN1YkVudHJ5KikgaGVhZGVyOworICAgIGZyZWUoc3ViZW50cnkpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGZyZWVFbnRyeShyb3RhdGluZ19ub2RlX3QgKmhlYWRlciwgdm9pZCAqYXJnKQogewotCVByb2ZpbGVyRW50cnkgKmVudHJ5ID0gKFByb2ZpbGVyRW50cnkqKSBoZWFkZXI7Ci0JUm90YXRpbmdUcmVlX0VudW0oZW50cnktPmNhbGxzLCBmcmVlU3ViRW50cnksIE5VTEwpOwotCVB5X0RFQ1JFRihlbnRyeS0+dXNlck9iaik7Ci0JZnJlZShlbnRyeSk7Ci0JcmV0dXJuIDA7CisgICAgUHJvZmlsZXJFbnRyeSAqZW50cnkgPSAoUHJvZmlsZXJFbnRyeSopIGhlYWRlcjsKKyAgICBSb3RhdGluZ1RyZWVfRW51bShlbnRyeS0+Y2FsbHMsIGZyZWVTdWJFbnRyeSwgTlVMTCk7CisgICAgUHlfREVDUkVGKGVudHJ5LT51c2VyT2JqKTsKKyAgICBmcmVlKGVudHJ5KTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgY2xlYXJFbnRyaWVzKFByb2ZpbGVyT2JqZWN0ICpwT2JqKQogewotCVJvdGF0aW5nVHJlZV9FbnVtKHBPYmotPnByb2ZpbGVyRW50cmllcywgZnJlZUVudHJ5LCBOVUxMKTsKLQlwT2JqLT5wcm9maWxlckVudHJpZXMgPSBFTVBUWV9ST1RBVElOR19UUkVFOwotCS8qIHJlbGVhc2UgdGhlIG1lbW9yeSBob2xkIGJ5IHRoZSBQcm9maWxlckNvbnRleHRzICovCi0JaWYgKHBPYmotPmN1cnJlbnRQcm9maWxlckNvbnRleHQpIHsKLQkJZnJlZShwT2JqLT5jdXJyZW50UHJvZmlsZXJDb250ZXh0KTsKLQkJcE9iai0+Y3VycmVudFByb2ZpbGVyQ29udGV4dCA9IE5VTEw7Ci0JfQotCXdoaWxlIChwT2JqLT5mcmVlbGlzdFByb2ZpbGVyQ29udGV4dCkgewotCQlQcm9maWxlckNvbnRleHQgKmMgPSBwT2JqLT5mcmVlbGlzdFByb2ZpbGVyQ29udGV4dDsKLQkJcE9iai0+ZnJlZWxpc3RQcm9maWxlckNvbnRleHQgPSBjLT5wcmV2aW91czsKLQkJZnJlZShjKTsKLQl9Ci0JcE9iai0+ZnJlZWxpc3RQcm9maWxlckNvbnRleHQgPSBOVUxMOworICAgIFJvdGF0aW5nVHJlZV9FbnVtKHBPYmotPnByb2ZpbGVyRW50cmllcywgZnJlZUVudHJ5LCBOVUxMKTsKKyAgICBwT2JqLT5wcm9maWxlckVudHJpZXMgPSBFTVBUWV9ST1RBVElOR19UUkVFOworICAgIC8qIHJlbGVhc2UgdGhlIG1lbW9yeSBob2xkIGJ5IHRoZSBQcm9maWxlckNvbnRleHRzICovCisgICAgaWYgKHBPYmotPmN1cnJlbnRQcm9maWxlckNvbnRleHQpIHsKKyAgICAgICAgZnJlZShwT2JqLT5jdXJyZW50UHJvZmlsZXJDb250ZXh0KTsKKyAgICAgICAgcE9iai0+Y3VycmVudFByb2ZpbGVyQ29udGV4dCA9IE5VTEw7CisgICAgfQorICAgIHdoaWxlIChwT2JqLT5mcmVlbGlzdFByb2ZpbGVyQ29udGV4dCkgeworICAgICAgICBQcm9maWxlckNvbnRleHQgKmMgPSBwT2JqLT5mcmVlbGlzdFByb2ZpbGVyQ29udGV4dDsKKyAgICAgICAgcE9iai0+ZnJlZWxpc3RQcm9maWxlckNvbnRleHQgPSBjLT5wcmV2aW91czsKKyAgICAgICAgZnJlZShjKTsKKyAgICB9CisgICAgcE9iai0+ZnJlZWxpc3RQcm9maWxlckNvbnRleHQgPSBOVUxMOwogfQogCiBzdGF0aWMgdm9pZAogaW5pdENvbnRleHQoUHJvZmlsZXJPYmplY3QgKnBPYmosIFByb2ZpbGVyQ29udGV4dCAqc2VsZiwgUHJvZmlsZXJFbnRyeSAqZW50cnkpCiB7Ci0Jc2VsZi0+Y3R4RW50cnkgPSBlbnRyeTsKLQlzZWxmLT5zdWJ0ID0gMDsKLQlzZWxmLT5wcmV2aW91cyA9IHBPYmotPmN1cnJlbnRQcm9maWxlckNvbnRleHQ7Ci0JcE9iai0+Y3VycmVudFByb2ZpbGVyQ29udGV4dCA9IHNlbGY7Ci0JKytlbnRyeS0+cmVjdXJzaW9uTGV2ZWw7Ci0JaWYgKChwT2JqLT5mbGFncyAmIFBPRl9TVUJDQUxMUykgJiYgc2VsZi0+cHJldmlvdXMpIHsKLQkJLyogZmluZCBvciBjcmVhdGUgYW4gZW50cnkgZm9yIG1lIGluIG15IGNhbGxlcidzIGVudHJ5ICovCi0JCVByb2ZpbGVyRW50cnkgKmNhbGxlciA9IHNlbGYtPnByZXZpb3VzLT5jdHhFbnRyeTsKLQkJUHJvZmlsZXJTdWJFbnRyeSAqc3ViZW50cnkgPSBnZXRTdWJFbnRyeShwT2JqLCBjYWxsZXIsIGVudHJ5KTsKLQkJaWYgKHN1YmVudHJ5ID09IE5VTEwpCi0JCQlzdWJlbnRyeSA9IG5ld1N1YkVudHJ5KHBPYmosIGNhbGxlciwgZW50cnkpOwotCQlpZiAoc3ViZW50cnkpCi0JCQkrK3N1YmVudHJ5LT5yZWN1cnNpb25MZXZlbDsKLQl9Ci0Jc2VsZi0+dDAgPSBDQUxMX1RJTUVSKHBPYmopOworICAgIHNlbGYtPmN0eEVudHJ5ID0gZW50cnk7CisgICAgc2VsZi0+c3VidCA9IDA7CisgICAgc2VsZi0+cHJldmlvdXMgPSBwT2JqLT5jdXJyZW50UHJvZmlsZXJDb250ZXh0OworICAgIHBPYmotPmN1cnJlbnRQcm9maWxlckNvbnRleHQgPSBzZWxmOworICAgICsrZW50cnktPnJlY3Vyc2lvbkxldmVsOworICAgIGlmICgocE9iai0+ZmxhZ3MgJiBQT0ZfU1VCQ0FMTFMpICYmIHNlbGYtPnByZXZpb3VzKSB7CisgICAgICAgIC8qIGZpbmQgb3IgY3JlYXRlIGFuIGVudHJ5IGZvciBtZSBpbiBteSBjYWxsZXIncyBlbnRyeSAqLworICAgICAgICBQcm9maWxlckVudHJ5ICpjYWxsZXIgPSBzZWxmLT5wcmV2aW91cy0+Y3R4RW50cnk7CisgICAgICAgIFByb2ZpbGVyU3ViRW50cnkgKnN1YmVudHJ5ID0gZ2V0U3ViRW50cnkocE9iaiwgY2FsbGVyLCBlbnRyeSk7CisgICAgICAgIGlmIChzdWJlbnRyeSA9PSBOVUxMKQorICAgICAgICAgICAgc3ViZW50cnkgPSBuZXdTdWJFbnRyeShwT2JqLCBjYWxsZXIsIGVudHJ5KTsKKyAgICAgICAgaWYgKHN1YmVudHJ5KQorICAgICAgICAgICAgKytzdWJlbnRyeS0+cmVjdXJzaW9uTGV2ZWw7CisgICAgfQorICAgIHNlbGYtPnQwID0gQ0FMTF9USU1FUihwT2JqKTsKIH0KIAogc3RhdGljIHZvaWQKIFN0b3AoUHJvZmlsZXJPYmplY3QgKnBPYmosIFByb2ZpbGVyQ29udGV4dCAqc2VsZiwgUHJvZmlsZXJFbnRyeSAqZW50cnkpCiB7Ci0JUFlfTE9OR19MT05HIHR0ID0gQ0FMTF9USU1FUihwT2JqKSAtIHNlbGYtPnQwOwotCVBZX0xPTkdfTE9ORyBpdCA9IHR0IC0gc2VsZi0+c3VidDsKLQlpZiAoc2VsZi0+cHJldmlvdXMpCi0JCXNlbGYtPnByZXZpb3VzLT5zdWJ0ICs9IHR0OwotCXBPYmotPmN1cnJlbnRQcm9maWxlckNvbnRleHQgPSBzZWxmLT5wcmV2aW91czsKLQlpZiAoLS1lbnRyeS0+cmVjdXJzaW9uTGV2ZWwgPT0gMCkKLQkJZW50cnktPnR0ICs9IHR0OwotCWVsc2UKLQkJKytlbnRyeS0+cmVjdXJzaXZlY2FsbGNvdW50OwotCWVudHJ5LT5pdCArPSBpdDsKLQllbnRyeS0+Y2FsbGNvdW50Kys7Ci0JaWYgKChwT2JqLT5mbGFncyAmIFBPRl9TVUJDQUxMUykgJiYgc2VsZi0+cHJldmlvdXMpIHsKLQkJLyogZmluZCBvciBjcmVhdGUgYW4gZW50cnkgZm9yIG1lIGluIG15IGNhbGxlcidzIGVudHJ5ICovCi0JCVByb2ZpbGVyRW50cnkgKmNhbGxlciA9IHNlbGYtPnByZXZpb3VzLT5jdHhFbnRyeTsKLQkJUHJvZmlsZXJTdWJFbnRyeSAqc3ViZW50cnkgPSBnZXRTdWJFbnRyeShwT2JqLCBjYWxsZXIsIGVudHJ5KTsKLQkJaWYgKHN1YmVudHJ5KSB7Ci0JCQlpZiAoLS1zdWJlbnRyeS0+cmVjdXJzaW9uTGV2ZWwgPT0gMCkKLQkJCQlzdWJlbnRyeS0+dHQgKz0gdHQ7Ci0JCQllbHNlCi0JCQkJKytzdWJlbnRyeS0+cmVjdXJzaXZlY2FsbGNvdW50OwotCQkJc3ViZW50cnktPml0ICs9IGl0OwotCQkJKytzdWJlbnRyeS0+Y2FsbGNvdW50OwotCQl9Ci0JfQorICAgIFBZX0xPTkdfTE9ORyB0dCA9IENBTExfVElNRVIocE9iaikgLSBzZWxmLT50MDsKKyAgICBQWV9MT05HX0xPTkcgaXQgPSB0dCAtIHNlbGYtPnN1YnQ7CisgICAgaWYgKHNlbGYtPnByZXZpb3VzKQorICAgICAgICBzZWxmLT5wcmV2aW91cy0+c3VidCArPSB0dDsKKyAgICBwT2JqLT5jdXJyZW50UHJvZmlsZXJDb250ZXh0ID0gc2VsZi0+cHJldmlvdXM7CisgICAgaWYgKC0tZW50cnktPnJlY3Vyc2lvbkxldmVsID09IDApCisgICAgICAgIGVudHJ5LT50dCArPSB0dDsKKyAgICBlbHNlCisgICAgICAgICsrZW50cnktPnJlY3Vyc2l2ZWNhbGxjb3VudDsKKyAgICBlbnRyeS0+aXQgKz0gaXQ7CisgICAgZW50cnktPmNhbGxjb3VudCsrOworICAgIGlmICgocE9iai0+ZmxhZ3MgJiBQT0ZfU1VCQ0FMTFMpICYmIHNlbGYtPnByZXZpb3VzKSB7CisgICAgICAgIC8qIGZpbmQgb3IgY3JlYXRlIGFuIGVudHJ5IGZvciBtZSBpbiBteSBjYWxsZXIncyBlbnRyeSAqLworICAgICAgICBQcm9maWxlckVudHJ5ICpjYWxsZXIgPSBzZWxmLT5wcmV2aW91cy0+Y3R4RW50cnk7CisgICAgICAgIFByb2ZpbGVyU3ViRW50cnkgKnN1YmVudHJ5ID0gZ2V0U3ViRW50cnkocE9iaiwgY2FsbGVyLCBlbnRyeSk7CisgICAgICAgIGlmIChzdWJlbnRyeSkgeworICAgICAgICAgICAgaWYgKC0tc3ViZW50cnktPnJlY3Vyc2lvbkxldmVsID09IDApCisgICAgICAgICAgICAgICAgc3ViZW50cnktPnR0ICs9IHR0OworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICsrc3ViZW50cnktPnJlY3Vyc2l2ZWNhbGxjb3VudDsKKyAgICAgICAgICAgIHN1YmVudHJ5LT5pdCArPSBpdDsKKyAgICAgICAgICAgICsrc3ViZW50cnktPmNhbGxjb3VudDsKKyAgICAgICAgfQorICAgIH0KIH0KIAogc3RhdGljIHZvaWQKIHB0cmFjZV9lbnRlcl9jYWxsKFB5T2JqZWN0ICpzZWxmLCB2b2lkICprZXksIFB5T2JqZWN0ICp1c2VyT2JqKQogewotCS8qIGVudGVyaW5nIGEgY2FsbCB0byB0aGUgZnVuY3Rpb24gaWRlbnRpZmllZCBieSAna2V5JwotCSAgICh3aGljaCBjYW4gYmUgYSBQeUNvZGVPYmplY3Qgb3IgYSBQeU1ldGhvZERlZiBwb2ludGVyKSAqLwotCVByb2ZpbGVyT2JqZWN0ICpwT2JqID0gKFByb2ZpbGVyT2JqZWN0KilzZWxmOwotCVByb2ZpbGVyRW50cnkgKnByb2ZFbnRyeTsKLQlQcm9maWxlckNvbnRleHQgKnBDb250ZXh0OworICAgIC8qIGVudGVyaW5nIGEgY2FsbCB0byB0aGUgZnVuY3Rpb24gaWRlbnRpZmllZCBieSAna2V5JworICAgICAgICh3aGljaCBjYW4gYmUgYSBQeUNvZGVPYmplY3Qgb3IgYSBQeU1ldGhvZERlZiBwb2ludGVyKSAqLworICAgIFByb2ZpbGVyT2JqZWN0ICpwT2JqID0gKFByb2ZpbGVyT2JqZWN0KilzZWxmOworICAgIFByb2ZpbGVyRW50cnkgKnByb2ZFbnRyeTsKKyAgICBQcm9maWxlckNvbnRleHQgKnBDb250ZXh0OwogCi0JLyogSW4gdGhlIGNhc2Ugb2YgZW50ZXJpbmcgYSBnZW5lcmF0b3IgZXhwcmVzc2lvbiBmcmFtZSB2aWEgYQotCSAqIHRocm93IChnZW5fc2VuZF9leCguLiwgMSkpLCB3ZSBtYXkgYWxyZWFkeSBoYXZlIGFuCi0JICogRXhjZXB0aW9uIHNldCBoZXJlLiBXZSBtdXN0IG5vdCBtZXNzIGFyb3VuZCB3aXRoIHRoaXMKLQkgKiBleGNlcHRpb24sIGFuZCBzb21lIG9mIHRoZSBjb2RlIHVuZGVyIGhlcmUgYXNzdW1lcyB0aGF0Ci0JICogUHlFcnJfKiBpcyBpdHMgb3duIHRvIG1lc3MgYXJvdW5kIHdpdGgsIHNvIHdlIGhhdmUgdG8KLQkgKiBzYXZlIGFuZCByZXN0b3JlIGFueSBjdXJyZW50IGV4Y2VwdGlvbi4gKi8KLQlQeU9iamVjdCAqbGFzdF90eXBlLCAqbGFzdF92YWx1ZSwgKmxhc3RfdGI7Ci0JUHlFcnJfRmV0Y2goJmxhc3RfdHlwZSwgJmxhc3RfdmFsdWUsICZsYXN0X3RiKTsKKyAgICAvKiBJbiB0aGUgY2FzZSBvZiBlbnRlcmluZyBhIGdlbmVyYXRvciBleHByZXNzaW9uIGZyYW1lIHZpYSBhCisgICAgICogdGhyb3cgKGdlbl9zZW5kX2V4KC4uLCAxKSksIHdlIG1heSBhbHJlYWR5IGhhdmUgYW4KKyAgICAgKiBFeGNlcHRpb24gc2V0IGhlcmUuIFdlIG11c3Qgbm90IG1lc3MgYXJvdW5kIHdpdGggdGhpcworICAgICAqIGV4Y2VwdGlvbiwgYW5kIHNvbWUgb2YgdGhlIGNvZGUgdW5kZXIgaGVyZSBhc3N1bWVzIHRoYXQKKyAgICAgKiBQeUVycl8qIGlzIGl0cyBvd24gdG8gbWVzcyBhcm91bmQgd2l0aCwgc28gd2UgaGF2ZSB0bworICAgICAqIHNhdmUgYW5kIHJlc3RvcmUgYW55IGN1cnJlbnQgZXhjZXB0aW9uLiAqLworICAgIFB5T2JqZWN0ICpsYXN0X3R5cGUsICpsYXN0X3ZhbHVlLCAqbGFzdF90YjsKKyAgICBQeUVycl9GZXRjaCgmbGFzdF90eXBlLCAmbGFzdF92YWx1ZSwgJmxhc3RfdGIpOwogCi0JcHJvZkVudHJ5ID0gZ2V0RW50cnkocE9iaiwga2V5KTsKLQlpZiAocHJvZkVudHJ5ID09IE5VTEwpIHsKLQkJcHJvZkVudHJ5ID0gbmV3UHJvZmlsZXJFbnRyeShwT2JqLCBrZXksIHVzZXJPYmopOwotCQlpZiAocHJvZkVudHJ5ID09IE5VTEwpCi0JCQlnb3RvIHJlc3RvcmVQeWVycjsKLQl9Ci0JLyogZ3JhYiBhIFByb2ZpbGVyQ29udGV4dCBvdXQgb2YgdGhlIGZyZWUgbGlzdCAqLwotCXBDb250ZXh0ID0gcE9iai0+ZnJlZWxpc3RQcm9maWxlckNvbnRleHQ7Ci0JaWYgKHBDb250ZXh0KSB7Ci0JCXBPYmotPmZyZWVsaXN0UHJvZmlsZXJDb250ZXh0ID0gcENvbnRleHQtPnByZXZpb3VzOwotCX0KLQllbHNlIHsKLQkJLyogZnJlZSBsaXN0IGV4aGF1c3RlZCwgYWxsb2NhdGUgYSBuZXcgb25lICovCi0JCXBDb250ZXh0ID0gKFByb2ZpbGVyQ29udGV4dCopCi0JCQltYWxsb2Moc2l6ZW9mKFByb2ZpbGVyQ29udGV4dCkpOwotCQlpZiAocENvbnRleHQgPT0gTlVMTCkgewotCQkJcE9iai0+ZmxhZ3MgfD0gUE9GX05PTUVNT1JZOwotCQkJZ290byByZXN0b3JlUHllcnI7Ci0JCX0KLQl9Ci0JaW5pdENvbnRleHQocE9iaiwgcENvbnRleHQsIHByb2ZFbnRyeSk7CisgICAgcHJvZkVudHJ5ID0gZ2V0RW50cnkocE9iaiwga2V5KTsKKyAgICBpZiAocHJvZkVudHJ5ID09IE5VTEwpIHsKKyAgICAgICAgcHJvZkVudHJ5ID0gbmV3UHJvZmlsZXJFbnRyeShwT2JqLCBrZXksIHVzZXJPYmopOworICAgICAgICBpZiAocHJvZkVudHJ5ID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIHJlc3RvcmVQeWVycjsKKyAgICB9CisgICAgLyogZ3JhYiBhIFByb2ZpbGVyQ29udGV4dCBvdXQgb2YgdGhlIGZyZWUgbGlzdCAqLworICAgIHBDb250ZXh0ID0gcE9iai0+ZnJlZWxpc3RQcm9maWxlckNvbnRleHQ7CisgICAgaWYgKHBDb250ZXh0KSB7CisgICAgICAgIHBPYmotPmZyZWVsaXN0UHJvZmlsZXJDb250ZXh0ID0gcENvbnRleHQtPnByZXZpb3VzOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLyogZnJlZSBsaXN0IGV4aGF1c3RlZCwgYWxsb2NhdGUgYSBuZXcgb25lICovCisgICAgICAgIHBDb250ZXh0ID0gKFByb2ZpbGVyQ29udGV4dCopCisgICAgICAgICAgICBtYWxsb2Moc2l6ZW9mKFByb2ZpbGVyQ29udGV4dCkpOworICAgICAgICBpZiAocENvbnRleHQgPT0gTlVMTCkgeworICAgICAgICAgICAgcE9iai0+ZmxhZ3MgfD0gUE9GX05PTUVNT1JZOworICAgICAgICAgICAgZ290byByZXN0b3JlUHllcnI7CisgICAgICAgIH0KKyAgICB9CisgICAgaW5pdENvbnRleHQocE9iaiwgcENvbnRleHQsIHByb2ZFbnRyeSk7CiAKIHJlc3RvcmVQeWVycjoKLQlQeUVycl9SZXN0b3JlKGxhc3RfdHlwZSwgbGFzdF92YWx1ZSwgbGFzdF90Yik7CisgICAgUHlFcnJfUmVzdG9yZShsYXN0X3R5cGUsIGxhc3RfdmFsdWUsIGxhc3RfdGIpOwogfQogCiBzdGF0aWMgdm9pZAogcHRyYWNlX2xlYXZlX2NhbGwoUHlPYmplY3QgKnNlbGYsIHZvaWQgKmtleSkKIHsKLQkvKiBsZWF2aW5nIGEgY2FsbCB0byB0aGUgZnVuY3Rpb24gaWRlbnRpZmllZCBieSAna2V5JyAqLwotCVByb2ZpbGVyT2JqZWN0ICpwT2JqID0gKFByb2ZpbGVyT2JqZWN0KilzZWxmOwotCVByb2ZpbGVyRW50cnkgKnByb2ZFbnRyeTsKLQlQcm9maWxlckNvbnRleHQgKnBDb250ZXh0OworICAgIC8qIGxlYXZpbmcgYSBjYWxsIHRvIHRoZSBmdW5jdGlvbiBpZGVudGlmaWVkIGJ5ICdrZXknICovCisgICAgUHJvZmlsZXJPYmplY3QgKnBPYmogPSAoUHJvZmlsZXJPYmplY3QqKXNlbGY7CisgICAgUHJvZmlsZXJFbnRyeSAqcHJvZkVudHJ5OworICAgIFByb2ZpbGVyQ29udGV4dCAqcENvbnRleHQ7CiAKLQlwQ29udGV4dCA9IHBPYmotPmN1cnJlbnRQcm9maWxlckNvbnRleHQ7Ci0JaWYgKHBDb250ZXh0ID09IE5VTEwpCi0JCXJldHVybjsKLQlwcm9mRW50cnkgPSBnZXRFbnRyeShwT2JqLCBrZXkpOwotCWlmIChwcm9mRW50cnkpIHsKLQkJU3RvcChwT2JqLCBwQ29udGV4dCwgcHJvZkVudHJ5KTsKLQl9Ci0JZWxzZSB7Ci0JCXBPYmotPmN1cnJlbnRQcm9maWxlckNvbnRleHQgPSBwQ29udGV4dC0+cHJldmlvdXM7Ci0JfQotCS8qIHB1dCBwQ29udGV4dCBpbnRvIHRoZSBmcmVlIGxpc3QgKi8KLQlwQ29udGV4dC0+cHJldmlvdXMgPSBwT2JqLT5mcmVlbGlzdFByb2ZpbGVyQ29udGV4dDsKLQlwT2JqLT5mcmVlbGlzdFByb2ZpbGVyQ29udGV4dCA9IHBDb250ZXh0OworICAgIHBDb250ZXh0ID0gcE9iai0+Y3VycmVudFByb2ZpbGVyQ29udGV4dDsKKyAgICBpZiAocENvbnRleHQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOworICAgIHByb2ZFbnRyeSA9IGdldEVudHJ5KHBPYmosIGtleSk7CisgICAgaWYgKHByb2ZFbnRyeSkgeworICAgICAgICBTdG9wKHBPYmosIHBDb250ZXh0LCBwcm9mRW50cnkpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcE9iai0+Y3VycmVudFByb2ZpbGVyQ29udGV4dCA9IHBDb250ZXh0LT5wcmV2aW91czsKKyAgICB9CisgICAgLyogcHV0IHBDb250ZXh0IGludG8gdGhlIGZyZWUgbGlzdCAqLworICAgIHBDb250ZXh0LT5wcmV2aW91cyA9IHBPYmotPmZyZWVsaXN0UHJvZmlsZXJDb250ZXh0OworICAgIHBPYmotPmZyZWVsaXN0UHJvZmlsZXJDb250ZXh0ID0gcENvbnRleHQ7CiB9CiAKIHN0YXRpYyBpbnQKIHByb2ZpbGVyX2NhbGxiYWNrKFB5T2JqZWN0ICpzZWxmLCBQeUZyYW1lT2JqZWN0ICpmcmFtZSwgaW50IHdoYXQsCi0JCSAgUHlPYmplY3QgKmFyZykKKyAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICphcmcpCiB7Ci0Jc3dpdGNoICh3aGF0KSB7CisgICAgc3dpdGNoICh3aGF0KSB7CiAKLQkvKiB0aGUgJ2ZyYW1lJyBvZiBhIGNhbGxlZCBmdW5jdGlvbiBpcyBhYm91dCB0byBzdGFydCBpdHMgZXhlY3V0aW9uICovCi0JY2FzZSBQeVRyYWNlX0NBTEw6Ci0JCXB0cmFjZV9lbnRlcl9jYWxsKHNlbGYsICh2b2lkICopZnJhbWUtPmZfY29kZSwKLQkJCQkgICAgICAgIChQeU9iamVjdCAqKWZyYW1lLT5mX2NvZGUpOwotCQlicmVhazsKKyAgICAvKiB0aGUgJ2ZyYW1lJyBvZiBhIGNhbGxlZCBmdW5jdGlvbiBpcyBhYm91dCB0byBzdGFydCBpdHMgZXhlY3V0aW9uICovCisgICAgY2FzZSBQeVRyYWNlX0NBTEw6CisgICAgICAgIHB0cmFjZV9lbnRlcl9jYWxsKHNlbGYsICh2b2lkICopZnJhbWUtPmZfY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFB5T2JqZWN0ICopZnJhbWUtPmZfY29kZSk7CisgICAgICAgIGJyZWFrOwogCi0JLyogdGhlICdmcmFtZScgb2YgYSBjYWxsZWQgZnVuY3Rpb24gaXMgYWJvdXQgdG8gZmluaXNoCi0JICAgKGVpdGhlciBub3JtYWxseSBvciB3aXRoIGFuIGV4Y2VwdGlvbikgKi8KLQljYXNlIFB5VHJhY2VfUkVUVVJOOgotCQlwdHJhY2VfbGVhdmVfY2FsbChzZWxmLCAodm9pZCAqKWZyYW1lLT5mX2NvZGUpOwotCQlicmVhazsKKyAgICAvKiB0aGUgJ2ZyYW1lJyBvZiBhIGNhbGxlZCBmdW5jdGlvbiBpcyBhYm91dCB0byBmaW5pc2gKKyAgICAgICAoZWl0aGVyIG5vcm1hbGx5IG9yIHdpdGggYW4gZXhjZXB0aW9uKSAqLworICAgIGNhc2UgUHlUcmFjZV9SRVRVUk46CisgICAgICAgIHB0cmFjZV9sZWF2ZV9jYWxsKHNlbGYsICh2b2lkICopZnJhbWUtPmZfY29kZSk7CisgICAgICAgIGJyZWFrOwogCi0JLyogY2FzZSBQeVRyYWNlX0VYQ0VQVElPTjoKLQkJSWYgdGhlIGV4Y2VwdGlvbiByZXN1bHRzIGluIHRoZSBmdW5jdGlvbiBleGl0aW5nLCBhCi0JCVB5VHJhY2VfUkVUVVJOIGV2ZW50IHdpbGwgYmUgZ2VuZXJhdGVkLCBzbyB3ZSBkb24ndCBuZWVkIHRvCi0JCWhhbmRsZSBpdC4gKi8KKyAgICAvKiBjYXNlIFB5VHJhY2VfRVhDRVBUSU9OOgorICAgICAgICBJZiB0aGUgZXhjZXB0aW9uIHJlc3VsdHMgaW4gdGhlIGZ1bmN0aW9uIGV4aXRpbmcsIGEKKyAgICAgICAgUHlUcmFjZV9SRVRVUk4gZXZlbnQgd2lsbCBiZSBnZW5lcmF0ZWQsIHNvIHdlIGRvbid0IG5lZWQgdG8KKyAgICAgICAgaGFuZGxlIGl0LiAqLwogCi0jaWZkZWYgUHlUcmFjZV9DX0NBTEwJLyogbm90IGRlZmluZWQgaW4gUHl0aG9uIDw9IDIuMyAqLwotCS8qIHRoZSBQeXRob24gZnVuY3Rpb24gJ2ZyYW1lJyBpcyBpc3N1aW5nIGEgY2FsbCB0byB0aGUgYnVpbHQtaW4KLQkgICBmdW5jdGlvbiAnYXJnJyAqLwotCWNhc2UgUHlUcmFjZV9DX0NBTEw6Ci0JCWlmICgoKChQcm9maWxlck9iamVjdCAqKXNlbGYpLT5mbGFncyAmIFBPRl9CVUlMVElOUykKLQkJICAgICYmIFB5Q0Z1bmN0aW9uX0NoZWNrKGFyZykpIHsKLQkJCXB0cmFjZV9lbnRlcl9jYWxsKHNlbGYsCi0JCQkJCSAgKChQeUNGdW5jdGlvbk9iamVjdCAqKWFyZyktPm1fbWwsCi0JCQkJCSAgYXJnKTsKLQkJfQotCQlicmVhazsKKyNpZmRlZiBQeVRyYWNlX0NfQ0FMTCAgIC8qIG5vdCBkZWZpbmVkIGluIFB5dGhvbiA8PSAyLjMgKi8KKyAgICAvKiB0aGUgUHl0aG9uIGZ1bmN0aW9uICdmcmFtZScgaXMgaXNzdWluZyBhIGNhbGwgdG8gdGhlIGJ1aWx0LWluCisgICAgICAgZnVuY3Rpb24gJ2FyZycgKi8KKyAgICBjYXNlIFB5VHJhY2VfQ19DQUxMOgorICAgICAgICBpZiAoKCgoUHJvZmlsZXJPYmplY3QgKilzZWxmKS0+ZmxhZ3MgJiBQT0ZfQlVJTFRJTlMpCisgICAgICAgICAgICAmJiBQeUNGdW5jdGlvbl9DaGVjayhhcmcpKSB7CisgICAgICAgICAgICBwdHJhY2VfZW50ZXJfY2FsbChzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQeUNGdW5jdGlvbk9iamVjdCAqKWFyZyktPm1fbWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOwogCi0JLyogdGhlIGNhbGwgdG8gdGhlIGJ1aWx0LWluIGZ1bmN0aW9uICdhcmcnIGlzIHJldHVybmluZyBpbnRvIGl0cwotCSAgIGNhbGxlciAnZnJhbWUnICovCi0JY2FzZSBQeVRyYWNlX0NfUkVUVVJOOgkJLyogLi4ubm9ybWFsbHkgKi8KLQljYXNlIFB5VHJhY2VfQ19FWENFUFRJT046CS8qIC4uLndpdGggYW4gZXhjZXB0aW9uIHNldCAqLwotCQlpZiAoKCgoUHJvZmlsZXJPYmplY3QgKilzZWxmKS0+ZmxhZ3MgJiBQT0ZfQlVJTFRJTlMpCi0JCSAgICAmJiBQeUNGdW5jdGlvbl9DaGVjayhhcmcpKSB7Ci0JCQlwdHJhY2VfbGVhdmVfY2FsbChzZWxmLAotCQkJCQkgICgoUHlDRnVuY3Rpb25PYmplY3QgKilhcmcpLT5tX21sKTsKLQkJfQotCQlicmVhazsKKyAgICAvKiB0aGUgY2FsbCB0byB0aGUgYnVpbHQtaW4gZnVuY3Rpb24gJ2FyZycgaXMgcmV0dXJuaW5nIGludG8gaXRzCisgICAgICAgY2FsbGVyICdmcmFtZScgKi8KKyAgICBjYXNlIFB5VHJhY2VfQ19SRVRVUk46ICAgICAgICAgICAgICAvKiAuLi5ub3JtYWxseSAqLworICAgIGNhc2UgUHlUcmFjZV9DX0VYQ0VQVElPTjogICAgICAgICAgIC8qIC4uLndpdGggYW4gZXhjZXB0aW9uIHNldCAqLworICAgICAgICBpZiAoKCgoUHJvZmlsZXJPYmplY3QgKilzZWxmKS0+ZmxhZ3MgJiBQT0ZfQlVJTFRJTlMpCisgICAgICAgICAgICAmJiBQeUNGdW5jdGlvbl9DaGVjayhhcmcpKSB7CisgICAgICAgICAgICBwdHJhY2VfbGVhdmVfY2FsbChzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQeUNGdW5jdGlvbk9iamVjdCAqKWFyZyktPm1fbWwpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOwogI2VuZGlmCiAKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0JcmV0dXJuIDA7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBwZW5kaW5nX2V4Y2VwdGlvbihQcm9maWxlck9iamVjdCAqcE9iaikKIHsKLQlpZiAocE9iai0+ZmxhZ3MgJiBQT0ZfTk9NRU1PUlkpIHsKLQkJcE9iai0+ZmxhZ3MgLT0gUE9GX05PTUVNT1JZOwotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfTWVtb3J5RXJyb3IsCi0JCQkJIm1lbW9yeSB3YXMgZXhoYXVzdGVkIHdoaWxlIHByb2ZpbGluZyIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXJldHVybiAwOworICAgIGlmIChwT2JqLT5mbGFncyAmIFBPRl9OT01FTU9SWSkgeworICAgICAgICBwT2JqLT5mbGFncyAtPSBQT0ZfTk9NRU1PUlk7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19NZW1vcnlFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJtZW1vcnkgd2FzIGV4aGF1c3RlZCB3aGlsZSBwcm9maWxpbmciKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIFB5U3RydWN0U2VxdWVuY2VfRmllbGQgcHJvZmlsZXJfZW50cnlfZmllbGRzW10gPSB7Ci0JeyJjb2RlIiwgICAgICAgICAiY29kZSBvYmplY3Qgb3IgYnVpbHQtaW4gZnVuY3Rpb24gbmFtZSJ9LAotCXsiY2FsbGNvdW50IiwgICAgImhvdyBtYW55IHRpbWVzIHRoaXMgd2FzIGNhbGxlZCJ9LAotCXsicmVjY2FsbGNvdW50IiwgImhvdyBtYW55IHRpbWVzIGNhbGxlZCByZWN1cnNpdmVseSJ9LAotCXsidG90YWx0aW1lIiwgICAgInRvdGFsIHRpbWUgaW4gdGhpcyBlbnRyeSJ9LAotCXsiaW5saW5ldGltZSIsICAgImlubGluZSB0aW1lIGluIHRoaXMgZW50cnkgKG5vdCBpbiBzdWJjYWxscykifSwKLQl7ImNhbGxzIiwgICAgICAgICJkZXRhaWxzIG9mIHRoZSBjYWxscyJ9LAotCXswfQorICAgIHsiY29kZSIsICAgICAgICAgImNvZGUgb2JqZWN0IG9yIGJ1aWx0LWluIGZ1bmN0aW9uIG5hbWUifSwKKyAgICB7ImNhbGxjb3VudCIsICAgICJob3cgbWFueSB0aW1lcyB0aGlzIHdhcyBjYWxsZWQifSwKKyAgICB7InJlY2NhbGxjb3VudCIsICJob3cgbWFueSB0aW1lcyBjYWxsZWQgcmVjdXJzaXZlbHkifSwKKyAgICB7InRvdGFsdGltZSIsICAgICJ0b3RhbCB0aW1lIGluIHRoaXMgZW50cnkifSwKKyAgICB7ImlubGluZXRpbWUiLCAgICJpbmxpbmUgdGltZSBpbiB0aGlzIGVudHJ5IChub3QgaW4gc3ViY2FsbHMpIn0sCisgICAgeyJjYWxscyIsICAgICAgICAiZGV0YWlscyBvZiB0aGUgY2FsbHMifSwKKyAgICB7MH0KIH07CiAKIHN0YXRpYyBQeVN0cnVjdFNlcXVlbmNlX0ZpZWxkIHByb2ZpbGVyX3N1YmVudHJ5X2ZpZWxkc1tdID0gewotCXsiY29kZSIsICAgICAgICAgImNhbGxlZCBjb2RlIG9iamVjdCBvciBidWlsdC1pbiBmdW5jdGlvbiBuYW1lIn0sCi0JeyJjYWxsY291bnQiLCAgICAiaG93IG1hbnkgdGltZXMgdGhpcyBpcyBjYWxsZWQifSwKLQl7InJlY2NhbGxjb3VudCIsICJob3cgbWFueSB0aW1lcyB0aGlzIGlzIGNhbGxlZCByZWN1cnNpdmVseSJ9LAotCXsidG90YWx0aW1lIiwgICAgInRvdGFsIHRpbWUgc3BlbnQgaW4gdGhpcyBjYWxsIn0sCi0JeyJpbmxpbmV0aW1lIiwgICAiaW5saW5lIHRpbWUgKG5vdCBpbiBmdXJ0aGVyIHN1YmNhbGxzKSJ9LAotCXswfQorICAgIHsiY29kZSIsICAgICAgICAgImNhbGxlZCBjb2RlIG9iamVjdCBvciBidWlsdC1pbiBmdW5jdGlvbiBuYW1lIn0sCisgICAgeyJjYWxsY291bnQiLCAgICAiaG93IG1hbnkgdGltZXMgdGhpcyBpcyBjYWxsZWQifSwKKyAgICB7InJlY2NhbGxjb3VudCIsICJob3cgbWFueSB0aW1lcyB0aGlzIGlzIGNhbGxlZCByZWN1cnNpdmVseSJ9LAorICAgIHsidG90YWx0aW1lIiwgICAgInRvdGFsIHRpbWUgc3BlbnQgaW4gdGhpcyBjYWxsIn0sCisgICAgeyJpbmxpbmV0aW1lIiwgICAiaW5saW5lIHRpbWUgKG5vdCBpbiBmdXJ0aGVyIHN1YmNhbGxzKSJ9LAorICAgIHswfQogfTsKIAogc3RhdGljIFB5U3RydWN0U2VxdWVuY2VfRGVzYyBwcm9maWxlcl9lbnRyeV9kZXNjID0gewotCSJfbHNwcm9mLnByb2ZpbGVyX2VudHJ5IiwgLyogbmFtZSAqLwotCU5VTEwsIC8qIGRvYyAqLwotCXByb2ZpbGVyX2VudHJ5X2ZpZWxkcywKLQk2CisgICAgIl9sc3Byb2YucHJvZmlsZXJfZW50cnkiLCAvKiBuYW1lICovCisgICAgTlVMTCwgLyogZG9jICovCisgICAgcHJvZmlsZXJfZW50cnlfZmllbGRzLAorICAgIDYKIH07CiAKIHN0YXRpYyBQeVN0cnVjdFNlcXVlbmNlX0Rlc2MgcHJvZmlsZXJfc3ViZW50cnlfZGVzYyA9IHsKLQkiX2xzcHJvZi5wcm9maWxlcl9zdWJlbnRyeSIsIC8qIG5hbWUgKi8KLQlOVUxMLCAvKiBkb2MgKi8KLQlwcm9maWxlcl9zdWJlbnRyeV9maWVsZHMsCi0JNQorICAgICJfbHNwcm9mLnByb2ZpbGVyX3N1YmVudHJ5IiwgLyogbmFtZSAqLworICAgIE5VTEwsIC8qIGRvYyAqLworICAgIHByb2ZpbGVyX3N1YmVudHJ5X2ZpZWxkcywKKyAgICA1CiB9OwogCiBzdGF0aWMgaW50IGluaXRpYWxpemVkOwpAQCAtNTM4LDcwICs1MzgsNzAgQEAKIAogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3QgKmxpc3Q7Ci0JUHlPYmplY3QgKnN1Ymxpc3Q7Ci0JZG91YmxlIGZhY3RvcjsKKyAgICBQeU9iamVjdCAqbGlzdDsKKyAgICBQeU9iamVjdCAqc3VibGlzdDsKKyAgICBkb3VibGUgZmFjdG9yOwogfSBzdGF0c2NvbGxlY3Rvcl90OwogCiBzdGF0aWMgaW50IHN0YXRzRm9yU3ViRW50cnkocm90YXRpbmdfbm9kZV90ICpub2RlLCB2b2lkICphcmcpCiB7Ci0JUHJvZmlsZXJTdWJFbnRyeSAqc2VudHJ5ID0gKFByb2ZpbGVyU3ViRW50cnkqKSBub2RlOwotCXN0YXRzY29sbGVjdG9yX3QgKmNvbGxlY3QgPSAoc3RhdHNjb2xsZWN0b3JfdCopIGFyZzsKLQlQcm9maWxlckVudHJ5ICplbnRyeSA9IChQcm9maWxlckVudHJ5Kikgc2VudHJ5LT5oZWFkZXIua2V5OwotCWludCBlcnI7Ci0JUHlPYmplY3QgKnNpbmZvOwotCXNpbmZvID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKChQeU9iamVjdCopICZTdGF0c1N1YkVudHJ5VHlwZSwKLQkJCQkgICAgICAiKChPbGxkZCkpIiwKLQkJCQkgICAgICBlbnRyeS0+dXNlck9iaiwKLQkJCQkgICAgICBzZW50cnktPmNhbGxjb3VudCwKLQkJCQkgICAgICBzZW50cnktPnJlY3Vyc2l2ZWNhbGxjb3VudCwKLQkJCQkgICAgICBjb2xsZWN0LT5mYWN0b3IgKiBzZW50cnktPnR0LAotCQkJCSAgICAgIGNvbGxlY3QtPmZhY3RvciAqIHNlbnRyeS0+aXQpOwotCWlmIChzaW5mbyA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0JZXJyID0gUHlMaXN0X0FwcGVuZChjb2xsZWN0LT5zdWJsaXN0LCBzaW5mbyk7Ci0JUHlfREVDUkVGKHNpbmZvKTsKLQlyZXR1cm4gZXJyOworICAgIFByb2ZpbGVyU3ViRW50cnkgKnNlbnRyeSA9IChQcm9maWxlclN1YkVudHJ5Kikgbm9kZTsKKyAgICBzdGF0c2NvbGxlY3Rvcl90ICpjb2xsZWN0ID0gKHN0YXRzY29sbGVjdG9yX3QqKSBhcmc7CisgICAgUHJvZmlsZXJFbnRyeSAqZW50cnkgPSAoUHJvZmlsZXJFbnRyeSopIHNlbnRyeS0+aGVhZGVyLmtleTsKKyAgICBpbnQgZXJyOworICAgIFB5T2JqZWN0ICpzaW5mbzsKKyAgICBzaW5mbyA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbigoUHlPYmplY3QqKSAmU3RhdHNTdWJFbnRyeVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIigoT2xsZGQpKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnktPnVzZXJPYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VudHJ5LT5jYWxsY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VudHJ5LT5yZWN1cnNpdmVjYWxsY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdC0+ZmFjdG9yICogc2VudHJ5LT50dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsZWN0LT5mYWN0b3IgKiBzZW50cnktPml0KTsKKyAgICBpZiAoc2luZm8gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGVyciA9IFB5TGlzdF9BcHBlbmQoY29sbGVjdC0+c3VibGlzdCwgc2luZm8pOworICAgIFB5X0RFQ1JFRihzaW5mbyk7CisgICAgcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIGludCBzdGF0c0ZvckVudHJ5KHJvdGF0aW5nX25vZGVfdCAqbm9kZSwgdm9pZCAqYXJnKQogewotCVByb2ZpbGVyRW50cnkgKmVudHJ5ID0gKFByb2ZpbGVyRW50cnkqKSBub2RlOwotCXN0YXRzY29sbGVjdG9yX3QgKmNvbGxlY3QgPSAoc3RhdHNjb2xsZWN0b3JfdCopIGFyZzsKLQlQeU9iamVjdCAqaW5mbzsKLQlpbnQgZXJyOwotCWlmIChlbnRyeS0+Y2FsbGNvdW50ID09IDApCi0JCXJldHVybiAwOyAgIC8qIHNraXAgKi8KKyAgICBQcm9maWxlckVudHJ5ICplbnRyeSA9IChQcm9maWxlckVudHJ5Kikgbm9kZTsKKyAgICBzdGF0c2NvbGxlY3Rvcl90ICpjb2xsZWN0ID0gKHN0YXRzY29sbGVjdG9yX3QqKSBhcmc7CisgICAgUHlPYmplY3QgKmluZm87CisgICAgaW50IGVycjsKKyAgICBpZiAoZW50cnktPmNhbGxjb3VudCA9PSAwKQorICAgICAgICByZXR1cm4gMDsgICAvKiBza2lwICovCiAKLQlpZiAoZW50cnktPmNhbGxzICE9IEVNUFRZX1JPVEFUSU5HX1RSRUUpIHsKLQkJY29sbGVjdC0+c3VibGlzdCA9IFB5TGlzdF9OZXcoMCk7Ci0JCWlmIChjb2xsZWN0LT5zdWJsaXN0ID09IE5VTEwpCi0JCQlyZXR1cm4gLTE7Ci0JCWlmIChSb3RhdGluZ1RyZWVfRW51bShlbnRyeS0+Y2FsbHMsCi0JCQkJICAgICAgc3RhdHNGb3JTdWJFbnRyeSwgY29sbGVjdCkgIT0gMCkgewotCQkJUHlfREVDUkVGKGNvbGxlY3QtPnN1Ymxpc3QpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQotCWVsc2UgewotCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCWNvbGxlY3QtPnN1Ymxpc3QgPSBQeV9Ob25lOwotCX0KKyAgICBpZiAoZW50cnktPmNhbGxzICE9IEVNUFRZX1JPVEFUSU5HX1RSRUUpIHsKKyAgICAgICAgY29sbGVjdC0+c3VibGlzdCA9IFB5TGlzdF9OZXcoMCk7CisgICAgICAgIGlmIChjb2xsZWN0LT5zdWJsaXN0ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmIChSb3RhdGluZ1RyZWVfRW51bShlbnRyeS0+Y2FsbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0c0ZvclN1YkVudHJ5LCBjb2xsZWN0KSAhPSAwKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoY29sbGVjdC0+c3VibGlzdCk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgY29sbGVjdC0+c3VibGlzdCA9IFB5X05vbmU7CisgICAgfQogCi0JaW5mbyA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbigoUHlPYmplY3QqKSAmU3RhdHNFbnRyeVR5cGUsCi0JCQkJICAgICAiKChPbGxkZE8pKSIsCi0JCQkJICAgICBlbnRyeS0+dXNlck9iaiwKLQkJCQkgICAgIGVudHJ5LT5jYWxsY291bnQsCi0JCQkJICAgICBlbnRyeS0+cmVjdXJzaXZlY2FsbGNvdW50LAotCQkJCSAgICAgY29sbGVjdC0+ZmFjdG9yICogZW50cnktPnR0LAotCQkJCSAgICAgY29sbGVjdC0+ZmFjdG9yICogZW50cnktPml0LAotCQkJCSAgICAgY29sbGVjdC0+c3VibGlzdCk7Ci0JUHlfREVDUkVGKGNvbGxlY3QtPnN1Ymxpc3QpOwotCWlmIChpbmZvID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQllcnIgPSBQeUxpc3RfQXBwZW5kKGNvbGxlY3QtPmxpc3QsIGluZm8pOwotCVB5X0RFQ1JFRihpbmZvKTsKLQlyZXR1cm4gZXJyOworICAgIGluZm8gPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oKFB5T2JqZWN0KikgJlN0YXRzRW50cnlUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIigoT2xsZGRPKSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnktPnVzZXJPYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS0+Y2FsbGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnktPnJlY3Vyc2l2ZWNhbGxjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxlY3QtPmZhY3RvciAqIGVudHJ5LT50dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxlY3QtPmZhY3RvciAqIGVudHJ5LT5pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxlY3QtPnN1Ymxpc3QpOworICAgIFB5X0RFQ1JFRihjb2xsZWN0LT5zdWJsaXN0KTsKKyAgICBpZiAoaW5mbyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAgZXJyID0gUHlMaXN0X0FwcGVuZChjb2xsZWN0LT5saXN0LCBpbmZvKTsKKyAgICBQeV9ERUNSRUYoaW5mbyk7CisgICAgcmV0dXJuIGVycjsKIH0KIAogUHlEb2NfU1RSVkFSKGdldHN0YXRzX2RvYywgIlwKQEAgLTYzMSw1MSArNjMxLDUxIEBACiBzdGF0aWMgUHlPYmplY3QqCiBwcm9maWxlcl9nZXRzdGF0cyhQcm9maWxlck9iamVjdCAqcE9iaiwgUHlPYmplY3QqIG5vYXJnKQogewotCXN0YXRzY29sbGVjdG9yX3QgY29sbGVjdDsKLQlpZiAocGVuZGluZ19leGNlcHRpb24ocE9iaikpCi0JCXJldHVybiBOVUxMOwotCWlmICghcE9iai0+ZXh0ZXJuYWxUaW1lcikKLQkJY29sbGVjdC5mYWN0b3IgPSBocFRpbWVyVW5pdCgpOwotCWVsc2UgaWYgKHBPYmotPmV4dGVybmFsVGltZXJVbml0ID4gMC4wKQotCQljb2xsZWN0LmZhY3RvciA9IHBPYmotPmV4dGVybmFsVGltZXJVbml0OwotCWVsc2UKLQkJY29sbGVjdC5mYWN0b3IgPSAxLjAgLyBET1VCTEVfVElNRVJfUFJFQ0lTSU9OOwotCWNvbGxlY3QubGlzdCA9IFB5TGlzdF9OZXcoMCk7Ci0JaWYgKGNvbGxlY3QubGlzdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoUm90YXRpbmdUcmVlX0VudW0ocE9iai0+cHJvZmlsZXJFbnRyaWVzLCBzdGF0c0ZvckVudHJ5LCAmY29sbGVjdCkKLQkgICAgIT0gMCkgewotCQlQeV9ERUNSRUYoY29sbGVjdC5saXN0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBjb2xsZWN0Lmxpc3Q7CisgICAgc3RhdHNjb2xsZWN0b3JfdCBjb2xsZWN0OworICAgIGlmIChwZW5kaW5nX2V4Y2VwdGlvbihwT2JqKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFwT2JqLT5leHRlcm5hbFRpbWVyKQorICAgICAgICBjb2xsZWN0LmZhY3RvciA9IGhwVGltZXJVbml0KCk7CisgICAgZWxzZSBpZiAocE9iai0+ZXh0ZXJuYWxUaW1lclVuaXQgPiAwLjApCisgICAgICAgIGNvbGxlY3QuZmFjdG9yID0gcE9iai0+ZXh0ZXJuYWxUaW1lclVuaXQ7CisgICAgZWxzZQorICAgICAgICBjb2xsZWN0LmZhY3RvciA9IDEuMCAvIERPVUJMRV9USU1FUl9QUkVDSVNJT047CisgICAgY29sbGVjdC5saXN0ID0gUHlMaXN0X05ldygwKTsKKyAgICBpZiAoY29sbGVjdC5saXN0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChSb3RhdGluZ1RyZWVfRW51bShwT2JqLT5wcm9maWxlckVudHJpZXMsIHN0YXRzRm9yRW50cnksICZjb2xsZWN0KQorICAgICAgICAhPSAwKSB7CisgICAgICAgIFB5X0RFQ1JFRihjb2xsZWN0Lmxpc3QpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIGNvbGxlY3QubGlzdDsKIH0KIAogc3RhdGljIGludAogc2V0U3ViY2FsbHMoUHJvZmlsZXJPYmplY3QgKnBPYmosIGludCBudmFsdWUpCiB7Ci0JaWYgKG52YWx1ZSA9PSAwKQotCQlwT2JqLT5mbGFncyAmPSB+UE9GX1NVQkNBTExTOwotCWVsc2UgaWYgKG52YWx1ZSA+IDApCi0JCXBPYmotPmZsYWdzIHw9ICBQT0ZfU1VCQ0FMTFM7Ci0JcmV0dXJuIDA7CisgICAgaWYgKG52YWx1ZSA9PSAwKQorICAgICAgICBwT2JqLT5mbGFncyAmPSB+UE9GX1NVQkNBTExTOworICAgIGVsc2UgaWYgKG52YWx1ZSA+IDApCisgICAgICAgIHBPYmotPmZsYWdzIHw9ICBQT0ZfU1VCQ0FMTFM7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIHNldEJ1aWx0aW5zKFByb2ZpbGVyT2JqZWN0ICpwT2JqLCBpbnQgbnZhbHVlKQogewotCWlmIChudmFsdWUgPT0gMCkKLQkJcE9iai0+ZmxhZ3MgJj0gflBPRl9CVUlMVElOUzsKLQllbHNlIGlmIChudmFsdWUgPiAwKSB7CisgICAgaWYgKG52YWx1ZSA9PSAwKQorICAgICAgICBwT2JqLT5mbGFncyAmPSB+UE9GX0JVSUxUSU5TOworICAgIGVsc2UgaWYgKG52YWx1ZSA+IDApIHsKICNpZm5kZWYgUHlUcmFjZV9DX0NBTEwKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJImJ1aWx0aW5zPVRydWUgcmVxdWlyZXMgUHl0aG9uID49IDIuNCIpOwotCQlyZXR1cm4gLTE7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImJ1aWx0aW5zPVRydWUgcmVxdWlyZXMgUHl0aG9uID49IDIuNCIpOworICAgICAgICByZXR1cm4gLTE7CiAjZWxzZQotCQlwT2JqLT5mbGFncyB8PSAgUE9GX0JVSUxUSU5TOworICAgICAgICBwT2JqLT5mbGFncyB8PSAgUE9GX0JVSUxUSU5TOwogI2VuZGlmCi0JfQotCXJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogUHlEb2NfU1RSVkFSKGVuYWJsZV9kb2MsICJcCkBAIC02OTEsMzMgKzY5MSwzMyBAQAogc3RhdGljIFB5T2JqZWN0KgogcHJvZmlsZXJfZW5hYmxlKFByb2ZpbGVyT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JaW50IHN1YmNhbGxzID0gLTE7Ci0gICAgICAgIGludCBidWlsdGlucyA9IC0xOwotCXN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsic3ViY2FsbHMiLCAiYnVpbHRpbnMiLCAwfTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAifGlpOmVuYWJsZSIsCi0JCQkJCSBrd2xpc3QsICZzdWJjYWxscywgJmJ1aWx0aW5zKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKHNldFN1YmNhbGxzKHNlbGYsIHN1YmNhbGxzKSA8IDAgfHwgc2V0QnVpbHRpbnMoc2VsZiwgYnVpbHRpbnMpIDwgMCkKLQkJcmV0dXJuIE5VTEw7Ci0JUHlFdmFsX1NldFByb2ZpbGUocHJvZmlsZXJfY2FsbGJhY2ssIChQeU9iamVjdCopc2VsZik7Ci0Jc2VsZi0+ZmxhZ3MgfD0gUE9GX0VOQUJMRUQ7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGludCBzdWJjYWxscyA9IC0xOworICAgIGludCBidWlsdGlucyA9IC0xOworICAgIHN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsic3ViY2FsbHMiLCAiYnVpbHRpbnMiLCAwfTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAifGlpOmVuYWJsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3dsaXN0LCAmc3ViY2FsbHMsICZidWlsdGlucykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChzZXRTdWJjYWxscyhzZWxmLCBzdWJjYWxscykgPCAwIHx8IHNldEJ1aWx0aW5zKHNlbGYsIGJ1aWx0aW5zKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5RXZhbF9TZXRQcm9maWxlKHByb2ZpbGVyX2NhbGxiYWNrLCAoUHlPYmplY3QqKXNlbGYpOworICAgIHNlbGYtPmZsYWdzIHw9IFBPRl9FTkFCTEVEOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIHZvaWQKIGZsdXNoX3VubWF0Y2hlZChQcm9maWxlck9iamVjdCAqcE9iaikKIHsKLQl3aGlsZSAocE9iai0+Y3VycmVudFByb2ZpbGVyQ29udGV4dCkgewotCQlQcm9maWxlckNvbnRleHQgKnBDb250ZXh0ID0gcE9iai0+Y3VycmVudFByb2ZpbGVyQ29udGV4dDsKLQkJUHJvZmlsZXJFbnRyeSAqcHJvZkVudHJ5PSBwQ29udGV4dC0+Y3R4RW50cnk7Ci0JCWlmIChwcm9mRW50cnkpCi0JCQlTdG9wKHBPYmosIHBDb250ZXh0LCBwcm9mRW50cnkpOwotCQllbHNlCi0JCQlwT2JqLT5jdXJyZW50UHJvZmlsZXJDb250ZXh0ID0gcENvbnRleHQtPnByZXZpb3VzOwotCQlpZiAocENvbnRleHQpCi0JCQlmcmVlKHBDb250ZXh0KTsKLQl9CisgICAgd2hpbGUgKHBPYmotPmN1cnJlbnRQcm9maWxlckNvbnRleHQpIHsKKyAgICAgICAgUHJvZmlsZXJDb250ZXh0ICpwQ29udGV4dCA9IHBPYmotPmN1cnJlbnRQcm9maWxlckNvbnRleHQ7CisgICAgICAgIFByb2ZpbGVyRW50cnkgKnByb2ZFbnRyeT0gcENvbnRleHQtPmN0eEVudHJ5OworICAgICAgICBpZiAocHJvZkVudHJ5KQorICAgICAgICAgICAgU3RvcChwT2JqLCBwQ29udGV4dCwgcHJvZkVudHJ5KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcE9iai0+Y3VycmVudFByb2ZpbGVyQ29udGV4dCA9IHBDb250ZXh0LT5wcmV2aW91czsKKyAgICAgICAgaWYgKHBDb250ZXh0KQorICAgICAgICAgICAgZnJlZShwQ29udGV4dCk7CisgICAgfQogCiB9CiAKQEAgLTczMCwxMyArNzMwLDEzIEBACiBzdGF0aWMgUHlPYmplY3QqCiBwcm9maWxlcl9kaXNhYmxlKFByb2ZpbGVyT2JqZWN0ICpzZWxmLCBQeU9iamVjdCogbm9hcmcpCiB7Ci0Jc2VsZi0+ZmxhZ3MgJj0gflBPRl9FTkFCTEVEOwotCVB5RXZhbF9TZXRQcm9maWxlKE5VTEwsIE5VTEwpOwotCWZsdXNoX3VubWF0Y2hlZChzZWxmKTsKLQlpZiAocGVuZGluZ19leGNlcHRpb24oc2VsZikpCi0JCXJldHVybiBOVUxMOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzZWxmLT5mbGFncyAmPSB+UE9GX0VOQUJMRUQ7CisgICAgUHlFdmFsX1NldFByb2ZpbGUoTlVMTCwgTlVMTCk7CisgICAgZmx1c2hfdW5tYXRjaGVkKHNlbGYpOworICAgIGlmIChwZW5kaW5nX2V4Y2VwdGlvbihzZWxmKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBQeURvY19TVFJWQVIoY2xlYXJfZG9jLCAiXApAQCAtNzQ4LDYyICs3NDgsNjIgQEAKIHN0YXRpYyBQeU9iamVjdCoKIHByb2ZpbGVyX2NsZWFyKFByb2ZpbGVyT2JqZWN0ICpwT2JqLCBQeU9iamVjdCogbm9hcmcpCiB7Ci0JY2xlYXJFbnRyaWVzKHBPYmopOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBjbGVhckVudHJpZXMocE9iaik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgdm9pZAogcHJvZmlsZXJfZGVhbGxvYyhQcm9maWxlck9iamVjdCAqb3ApCiB7Ci0JaWYgKG9wLT5mbGFncyAmIFBPRl9FTkFCTEVEKQotCQlQeUV2YWxfU2V0UHJvZmlsZShOVUxMLCBOVUxMKTsKLQlmbHVzaF91bm1hdGNoZWQob3ApOwotCWNsZWFyRW50cmllcyhvcCk7Ci0JUHlfWERFQ1JFRihvcC0+ZXh0ZXJuYWxUaW1lcik7Ci0JUHlfVFlQRShvcCktPnRwX2ZyZWUob3ApOworICAgIGlmIChvcC0+ZmxhZ3MgJiBQT0ZfRU5BQkxFRCkKKyAgICAgICAgUHlFdmFsX1NldFByb2ZpbGUoTlVMTCwgTlVMTCk7CisgICAgZmx1c2hfdW5tYXRjaGVkKG9wKTsKKyAgICBjbGVhckVudHJpZXMob3ApOworICAgIFB5X1hERUNSRUYob3AtPmV4dGVybmFsVGltZXIpOworICAgIFB5X1RZUEUob3ApLT50cF9mcmVlKG9wKTsKIH0KIAogc3RhdGljIGludAogcHJvZmlsZXJfaW5pdChQcm9maWxlck9iamVjdCAqcE9iaiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprdykKIHsKLQlQeU9iamVjdCAqbzsKLQlQeU9iamVjdCAqdGltZXIgPSBOVUxMOwotCWRvdWJsZSB0aW1ldW5pdCA9IDAuMDsKLQlpbnQgc3ViY2FsbHMgPSAxOworICAgIFB5T2JqZWN0ICpvOworICAgIFB5T2JqZWN0ICp0aW1lciA9IE5VTEw7CisgICAgZG91YmxlIHRpbWV1bml0ID0gMC4wOworICAgIGludCBzdWJjYWxscyA9IDE7CiAjaWZkZWYgUHlUcmFjZV9DX0NBTEwKLQlpbnQgYnVpbHRpbnMgPSAxOworICAgIGludCBidWlsdGlucyA9IDE7CiAjZWxzZQotCWludCBidWlsdGlucyA9IDA7CisgICAgaW50IGJ1aWx0aW5zID0gMDsKICNlbmRpZgotCXN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsidGltZXIiLCAidGltZXVuaXQiLAotCQkJCSAgICAgICAic3ViY2FsbHMiLCAiYnVpbHRpbnMiLCAwfTsKKyAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7InRpbWVyIiwgInRpbWV1bml0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN1YmNhbGxzIiwgImJ1aWx0aW5zIiwgMH07CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrdywgInxPZGlpOlByb2ZpbGVyIiwga3dsaXN0LAotCQkJCQkgJnRpbWVyLCAmdGltZXVuaXQsCi0JCQkJCSAmc3ViY2FsbHMsICZidWlsdGlucykpCi0JCXJldHVybiAtMTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrdywgInxPZGlpOlByb2ZpbGVyIiwga3dsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aW1lciwgJnRpbWV1bml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdWJjYWxscywgJmJ1aWx0aW5zKSkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0JaWYgKHNldFN1YmNhbGxzKHBPYmosIHN1YmNhbGxzKSA8IDAgfHwgc2V0QnVpbHRpbnMocE9iaiwgYnVpbHRpbnMpIDwgMCkKLQkJcmV0dXJuIC0xOwotCW8gPSBwT2JqLT5leHRlcm5hbFRpbWVyOwotCXBPYmotPmV4dGVybmFsVGltZXIgPSB0aW1lcjsKLQlQeV9YSU5DUkVGKHRpbWVyKTsKLQlQeV9YREVDUkVGKG8pOwotCXBPYmotPmV4dGVybmFsVGltZXJVbml0ID0gdGltZXVuaXQ7Ci0JcmV0dXJuIDA7CisgICAgaWYgKHNldFN1YmNhbGxzKHBPYmosIHN1YmNhbGxzKSA8IDAgfHwgc2V0QnVpbHRpbnMocE9iaiwgYnVpbHRpbnMpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIG8gPSBwT2JqLT5leHRlcm5hbFRpbWVyOworICAgIHBPYmotPmV4dGVybmFsVGltZXIgPSB0aW1lcjsKKyAgICBQeV9YSU5DUkVGKHRpbWVyKTsKKyAgICBQeV9YREVDUkVGKG8pOworICAgIHBPYmotPmV4dGVybmFsVGltZXJVbml0ID0gdGltZXVuaXQ7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBwcm9maWxlcl9tZXRob2RzW10gPSB7Ci0JeyJnZXRzdGF0cyIsICAgIChQeUNGdW5jdGlvbilwcm9maWxlcl9nZXRzdGF0cywKLQkJCU1FVEhfTk9BUkdTLAkJCWdldHN0YXRzX2RvY30sCi0JeyJlbmFibGUiLAkoUHlDRnVuY3Rpb24pcHJvZmlsZXJfZW5hYmxlLAotCQkJTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywJZW5hYmxlX2RvY30sCi0JeyJkaXNhYmxlIiwJKFB5Q0Z1bmN0aW9uKXByb2ZpbGVyX2Rpc2FibGUsCi0JCQlNRVRIX05PQVJHUywJCQlkaXNhYmxlX2RvY30sCi0JeyJjbGVhciIsCShQeUNGdW5jdGlvbilwcm9maWxlcl9jbGVhciwKLQkJCU1FVEhfTk9BUkdTLAkJCWNsZWFyX2RvY30sCi0Je05VTEwsIE5VTEx9CisgICAgeyJnZXRzdGF0cyIsICAgIChQeUNGdW5jdGlvbilwcm9maWxlcl9nZXRzdGF0cywKKyAgICAgICAgICAgICAgICAgICAgTUVUSF9OT0FSR1MsICAgICAgICAgICAgICAgICAgICAgICAgZ2V0c3RhdHNfZG9jfSwKKyAgICB7ImVuYWJsZSIsICAgICAgICAgIChQeUNGdW5jdGlvbilwcm9maWxlcl9lbmFibGUsCisgICAgICAgICAgICAgICAgICAgIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsICAgICAgIGVuYWJsZV9kb2N9LAorICAgIHsiZGlzYWJsZSIsICAgICAgICAgKFB5Q0Z1bmN0aW9uKXByb2ZpbGVyX2Rpc2FibGUsCisgICAgICAgICAgICAgICAgICAgIE1FVEhfTk9BUkdTLCAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVfZG9jfSwKKyAgICB7ImNsZWFyIiwgICAgICAgICAgIChQeUNGdW5jdGlvbilwcm9maWxlcl9jbGVhciwKKyAgICAgICAgICAgICAgICAgICAgTUVUSF9OT0FSR1MsICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJfZG9jfSwKKyAgICB7TlVMTCwgTlVMTH0KIH07CiAKIFB5RG9jX1NUUlZBUihwcm9maWxlcl9kb2MsICJcCkBAIC04MTcsNzYgKzgxNyw3NiBAQAogIik7CiAKIHN0YXRpY2hlcmUgUHlUeXBlT2JqZWN0IFB5UHJvZmlsZXJfVHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb2Jfc2l6ZSAqLwotCSJfbHNwcm9mLlByb2ZpbGVyIiwgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCi0Jc2l6ZW9mKFByb2ZpbGVyT2JqZWN0KSwgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLwotCShkZXN0cnVjdG9yKXByb2ZpbGVyX2RlYWxsb2MsICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCXByb2ZpbGVyX2RvYywgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLwotCXByb2ZpbGVyX21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KLQkoaW5pdHByb2MpcHJvZmlsZXJfaW5pdCwgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLwotCVB5VHlwZV9HZW5lcmljQWxsb2MsICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLwotCVB5VHlwZV9HZW5lcmljTmV3LCAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KLQlQeU9iamVjdF9EZWwsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvYl9zaXplICovCisgICAgIl9sc3Byb2YuUHJvZmlsZXIiLCAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICBzaXplb2YoUHJvZmlsZXJPYmplY3QpLCAgICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgKGRlc3RydWN0b3IpcHJvZmlsZXJfZGVhbGxvYywgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgcHJvZmlsZXJfZG9jLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgcHJvZmlsZXJfbWV0aG9kcywgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIChpbml0cHJvYylwcm9maWxlcl9pbml0LCAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgUHlUeXBlX0dlbmVyaWNBbGxvYywgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgUHlUeXBlX0dlbmVyaWNOZXcsICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworICAgIFB5T2JqZWN0X0RlbCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCiB9OwogCiBzdGF0aWMgUHlNZXRob2REZWYgbW9kdWxlTWV0aG9kc1tdID0gewotCXtOVUxMLCBOVUxMfQorICAgIHtOVUxMLCBOVUxMfQogfTsKIAogUHlNT0RJTklUX0ZVTkMKIGluaXRfbHNwcm9mKHZvaWQpCiB7Ci0JUHlPYmplY3QgKm1vZHVsZSwgKmQ7Ci0JbW9kdWxlID0gUHlfSW5pdE1vZHVsZTMoIl9sc3Byb2YiLCBtb2R1bGVNZXRob2RzLCAiRmFzdCBwcm9maWxlciIpOwotCWlmIChtb2R1bGUgPT0gTlVMTCkKLQkJcmV0dXJuOwotCWQgPSBQeU1vZHVsZV9HZXREaWN0KG1vZHVsZSk7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmUHlQcm9maWxlcl9UeXBlKSA8IDApCi0JCXJldHVybjsKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUHJvZmlsZXIiLCAoUHlPYmplY3QgKikmUHlQcm9maWxlcl9UeXBlKTsKKyAgICBQeU9iamVjdCAqbW9kdWxlLCAqZDsKKyAgICBtb2R1bGUgPSBQeV9Jbml0TW9kdWxlMygiX2xzcHJvZiIsIG1vZHVsZU1ldGhvZHMsICJGYXN0IHByb2ZpbGVyIik7CisgICAgaWYgKG1vZHVsZSA9PSBOVUxMKQorICAgICAgICByZXR1cm47CisgICAgZCA9IFB5TW9kdWxlX0dldERpY3QobW9kdWxlKTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZQeVByb2ZpbGVyX1R5cGUpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJQcm9maWxlciIsIChQeU9iamVjdCAqKSZQeVByb2ZpbGVyX1R5cGUpOwogCi0JaWYgKCFpbml0aWFsaXplZCkgewotCQlQeVN0cnVjdFNlcXVlbmNlX0luaXRUeXBlKCZTdGF0c0VudHJ5VHlwZSwgCi0JCQkJCSAgJnByb2ZpbGVyX2VudHJ5X2Rlc2MpOwotCQlQeVN0cnVjdFNlcXVlbmNlX0luaXRUeXBlKCZTdGF0c1N1YkVudHJ5VHlwZSwgCi0JCQkJCSAgJnByb2ZpbGVyX3N1YmVudHJ5X2Rlc2MpOwotCX0KLQlQeV9JTkNSRUYoKFB5T2JqZWN0KikgJlN0YXRzRW50cnlUeXBlKTsKLQlQeV9JTkNSRUYoKFB5T2JqZWN0KikgJlN0YXRzU3ViRW50cnlUeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobW9kdWxlLCAicHJvZmlsZXJfZW50cnkiLAotCQkJICAgKFB5T2JqZWN0KikgJlN0YXRzRW50cnlUeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobW9kdWxlLCAicHJvZmlsZXJfc3ViZW50cnkiLAotCQkJICAgKFB5T2JqZWN0KikgJlN0YXRzU3ViRW50cnlUeXBlKTsKLQllbXB0eV90dXBsZSA9IFB5VHVwbGVfTmV3KDApOwotCWluaXRpYWxpemVkID0gMTsKKyAgICBpZiAoIWluaXRpYWxpemVkKSB7CisgICAgICAgIFB5U3RydWN0U2VxdWVuY2VfSW5pdFR5cGUoJlN0YXRzRW50cnlUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcm9maWxlcl9lbnRyeV9kZXNjKTsKKyAgICAgICAgUHlTdHJ1Y3RTZXF1ZW5jZV9Jbml0VHlwZSgmU3RhdHNTdWJFbnRyeVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnByb2ZpbGVyX3N1YmVudHJ5X2Rlc2MpOworICAgIH0KKyAgICBQeV9JTkNSRUYoKFB5T2JqZWN0KikgJlN0YXRzRW50cnlUeXBlKTsKKyAgICBQeV9JTkNSRUYoKFB5T2JqZWN0KikgJlN0YXRzU3ViRW50cnlUeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobW9kdWxlLCAicHJvZmlsZXJfZW50cnkiLAorICAgICAgICAgICAgICAgICAgICAgICAoUHlPYmplY3QqKSAmU3RhdHNFbnRyeVR5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtb2R1bGUsICJwcm9maWxlcl9zdWJlbnRyeSIsCisgICAgICAgICAgICAgICAgICAgICAgIChQeU9iamVjdCopICZTdGF0c1N1YkVudHJ5VHlwZSk7CisgICAgZW1wdHlfdHVwbGUgPSBQeVR1cGxlX05ldygwKTsKKyAgICBpbml0aWFsaXplZCA9IDE7CiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19tdWx0aXByb2Nlc3NpbmcvY29ubmVjdGlvbi5oIGIvTW9kdWxlcy9fbXVsdGlwcm9jZXNzaW5nL2Nvbm5lY3Rpb24uaAppbmRleCA0NThkMWQzLi5mNmRiODUxIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19tdWx0aXByb2Nlc3NpbmcvY29ubmVjdGlvbi5oCisrKyBiL01vZHVsZXMvX211bHRpcHJvY2Vzc2luZy9jb25uZWN0aW9uLmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogRGVmaW5pdGlvbiBvZiBhIGBDb25uZWN0aW9uYCB0eXBlLiAgCisgKiBEZWZpbml0aW9uIG9mIGEgYENvbm5lY3Rpb25gIHR5cGUuCiAgKiBVc2VkIGJ5IGBzb2NrZXRfY29ubmVjdGlvbi5jYCBhbmQgYHBpcGVfY29ubmVjdGlvbi5jYC4KICAqCiAgKiBjb25uZWN0aW9uLmgKQEAgLTE5LDE0ICsxOSwxNCBAQAogCiAjZGVmaW5lIENIRUNLX1JFQURBQkxFKHNlbGYpIFwKICAgICBpZiAoIShzZWxmLT5mbGFncyAmIFJFQURBQkxFKSkgeyBcCi0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JT0Vycm9yLCAiY29ubmVjdGlvbiBpcyB3cml0ZS1vbmx5Iik7IFwKLSAgICAgICAgcmV0dXJuIE5VTEw7IFwKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSU9FcnJvciwgImNvbm5lY3Rpb24gaXMgd3JpdGUtb25seSIpOyBcCisgICAgcmV0dXJuIE5VTEw7IFwKICAgICB9CiAKICNkZWZpbmUgQ0hFQ0tfV1JJVEFCTEUoc2VsZikgXAogICAgIGlmICghKHNlbGYtPmZsYWdzICYgV1JJVEFCTEUpKSB7IFwKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0lPRXJyb3IsICJjb25uZWN0aW9uIGlzIHJlYWQtb25seSIpOyBcCi0gICAgICAgIHJldHVybiBOVUxMOyBcCisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0lPRXJyb3IsICJjb25uZWN0aW9uIGlzIHJlYWQtb25seSIpOyBcCisgICAgcmV0dXJuIE5VTEw7IFwKICAgICB9CiAKIC8qCkBAIC0zNiw1NyArMzYsNTcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBjb25uZWN0aW9uX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlDb25uZWN0aW9uT2JqZWN0ICpzZWxmOwotCUhBTkRMRSBoYW5kbGU7Ci0JQk9PTCByZWFkYWJsZSA9IFRSVUUsIHdyaXRhYmxlID0gVFJVRTsKKyAgICBDb25uZWN0aW9uT2JqZWN0ICpzZWxmOworICAgIEhBTkRMRSBoYW5kbGU7CisgICAgQk9PTCByZWFkYWJsZSA9IFRSVUUsIHdyaXRhYmxlID0gVFJVRTsKIAotCXN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsiaGFuZGxlIiwgInJlYWRhYmxlIiwgIndyaXRhYmxlIiwgTlVMTH07CisgICAgc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJoYW5kbGUiLCAicmVhZGFibGUiLCAid3JpdGFibGUiLCBOVUxMfTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsIEZfSEFORExFICJ8aWkiLCBrd2xpc3QsIAotCQkJCQkgJmhhbmRsZSwgJnJlYWRhYmxlLCAmd3JpdGFibGUpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCBGX0hBTkRMRSAifGlpIiwga3dsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoYW5kbGUsICZyZWFkYWJsZSwgJndyaXRhYmxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoaGFuZGxlID09IElOVkFMSURfSEFORExFX1ZBTFVFIHx8IChQeV9zc2l6ZV90KWhhbmRsZSA8IDApIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX0lPRXJyb3IsICJpbnZhbGlkIGhhbmRsZSAlemQiLAotCQkJICAgICAoUHlfc3NpemVfdCloYW5kbGUpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKGhhbmRsZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSB8fCAoUHlfc3NpemVfdCloYW5kbGUgPCAwKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19JT0Vycm9yLCAiaW52YWxpZCBoYW5kbGUgJXpkIiwKKyAgICAgICAgICAgICAgICAgICAgIChQeV9zc2l6ZV90KWhhbmRsZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWlmICghcmVhZGFibGUgJiYgIXdyaXRhYmxlKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAKLQkJCQkiZWl0aGVyIHJlYWRhYmxlIG9yIHdyaXRhYmxlIG11c3QgYmUgdHJ1ZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKCFyZWFkYWJsZSAmJiAhd3JpdGFibGUpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiZWl0aGVyIHJlYWRhYmxlIG9yIHdyaXRhYmxlIG11c3QgYmUgdHJ1ZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlzZWxmID0gUHlPYmplY3RfTmV3KENvbm5lY3Rpb25PYmplY3QsIHR5cGUpOwotCWlmIChzZWxmID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIHNlbGYgPSBQeU9iamVjdF9OZXcoQ29ubmVjdGlvbk9iamVjdCwgdHlwZSk7CisgICAgaWYgKHNlbGYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlzZWxmLT53ZWFrcmVmbGlzdCA9IE5VTEw7Ci0Jc2VsZi0+aGFuZGxlID0gaGFuZGxlOwotCXNlbGYtPmZsYWdzID0gMDsKKyAgICBzZWxmLT53ZWFrcmVmbGlzdCA9IE5VTEw7CisgICAgc2VsZi0+aGFuZGxlID0gaGFuZGxlOworICAgIHNlbGYtPmZsYWdzID0gMDsKIAotCWlmIChyZWFkYWJsZSkKLQkJc2VsZi0+ZmxhZ3MgfD0gUkVBREFCTEU7Ci0JaWYgKHdyaXRhYmxlKQotCQlzZWxmLT5mbGFncyB8PSBXUklUQUJMRTsKLQlhc3NlcnQoc2VsZi0+ZmxhZ3MgPj0gMSAmJiBzZWxmLT5mbGFncyA8PSAzKTsKKyAgICBpZiAocmVhZGFibGUpCisgICAgICAgIHNlbGYtPmZsYWdzIHw9IFJFQURBQkxFOworICAgIGlmICh3cml0YWJsZSkKKyAgICAgICAgc2VsZi0+ZmxhZ3MgfD0gV1JJVEFCTEU7CisgICAgYXNzZXJ0KHNlbGYtPmZsYWdzID49IDEgJiYgc2VsZi0+ZmxhZ3MgPD0gMyk7CiAKLQlyZXR1cm4gKFB5T2JqZWN0KilzZWxmOworICAgIHJldHVybiAoUHlPYmplY3QqKXNlbGY7CiB9CiAKIHN0YXRpYyB2b2lkCiBjb25uZWN0aW9uX2RlYWxsb2MoQ29ubmVjdGlvbk9iamVjdCogc2VsZikKIHsKLQlpZiAoc2VsZi0+d2Vha3JlZmxpc3QgIT0gTlVMTCkKLQkJUHlPYmplY3RfQ2xlYXJXZWFrUmVmcygoUHlPYmplY3QqKXNlbGYpOworICAgIGlmIChzZWxmLT53ZWFrcmVmbGlzdCAhPSBOVUxMKQorICAgICAgICBQeU9iamVjdF9DbGVhcldlYWtSZWZzKChQeU9iamVjdCopc2VsZik7CiAKLQlpZiAoc2VsZi0+aGFuZGxlICE9IElOVkFMSURfSEFORExFX1ZBTFVFKSB7Ci0JCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQkJQ0xPU0Uoc2VsZi0+aGFuZGxlKTsKLQkJUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQl9Ci0JUHlPYmplY3RfRGVsKHNlbGYpOworICAgIGlmIChzZWxmLT5oYW5kbGUgIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKKyAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICBDTE9TRShzZWxmLT5oYW5kbGUpOworICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIH0KKyAgICBQeU9iamVjdF9EZWwoc2VsZik7CiB9CiAKIC8qCkBAIC05NiwxNTYgKzk2LDE1NiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGNvbm5lY3Rpb25fc2VuZGJ5dGVzKENvbm5lY3Rpb25PYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKmJ1ZmZlcjsKLQlQeV9zc2l6ZV90IGxlbmd0aCwgb2Zmc2V0PTAsIHNpemU9UFlfU1NJWkVfVF9NSU47Ci0JaW50IHJlczsKKyAgICBjaGFyICpidWZmZXI7CisgICAgUHlfc3NpemVfdCBsZW5ndGgsIG9mZnNldD0wLCBzaXplPVBZX1NTSVpFX1RfTUlOOworICAgIGludCByZXM7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgRl9SQlVGRkVSICIjfCIgRl9QWV9TU0laRV9UIEZfUFlfU1NJWkVfVCwKLQkJCSAgICAgICZidWZmZXIsICZsZW5ndGgsICZvZmZzZXQsICZzaXplKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsIEZfUkJVRkZFUiAiI3wiIEZfUFlfU1NJWkVfVCBGX1BZX1NTSVpFX1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZidWZmZXIsICZsZW5ndGgsICZvZmZzZXQsICZzaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlDSEVDS19XUklUQUJMRShzZWxmKTsKKyAgICBDSEVDS19XUklUQUJMRShzZWxmKTsKIAotCWlmIChvZmZzZXQgPCAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAib2Zmc2V0IGlzIG5lZ2F0aXZlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAobGVuZ3RoIDwgb2Zmc2V0KSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiYnVmZmVyIGxlbmd0aCA8IG9mZnNldCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKG9mZnNldCA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJvZmZzZXQgaXMgbmVnYXRpdmUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChsZW5ndGggPCBvZmZzZXQpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJidWZmZXIgbGVuZ3RoIDwgb2Zmc2V0Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWlmIChzaXplID09IFBZX1NTSVpFX1RfTUlOKSB7Ci0JCXNpemUgPSBsZW5ndGggLSBvZmZzZXQ7Ci0JfSBlbHNlIHsKLQkJaWYgKHNpemUgPCAwKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgInNpemUgaXMgbmVnYXRpdmUiKTsKLQkJCXJldHVybiBOVUxMOwkJCi0JCX0KLQkJaWYgKG9mZnNldCArIHNpemUgPiBsZW5ndGgpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAKLQkJCQkJImJ1ZmZlciBsZW5ndGggPCBvZmZzZXQgKyBzaXplIik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KKyAgICBpZiAoc2l6ZSA9PSBQWV9TU0laRV9UX01JTikgeworICAgICAgICBzaXplID0gbGVuZ3RoIC0gb2Zmc2V0OworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChzaXplIDwgMCkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJzaXplIGlzIG5lZ2F0aXZlIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAob2Zmc2V0ICsgc2l6ZSA+IGxlbmd0aCkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ1ZmZlciBsZW5ndGggPCBvZmZzZXQgKyBzaXplIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KIAotCXJlcyA9IGNvbm5fc2VuZF9zdHJpbmcoc2VsZiwgYnVmZmVyICsgb2Zmc2V0LCBzaXplKTsKKyAgICByZXMgPSBjb25uX3NlbmRfc3RyaW5nKHNlbGYsIGJ1ZmZlciArIG9mZnNldCwgc2l6ZSk7CiAKLQlpZiAocmVzIDwgMCkKLQkJcmV0dXJuIG1wX1NldEVycm9yKFB5RXhjX0lPRXJyb3IsIHJlcyk7CisgICAgaWYgKHJlcyA8IDApCisgICAgICAgIHJldHVybiBtcF9TZXRFcnJvcihQeUV4Y19JT0Vycm9yLCByZXMpOwogCi0JUHlfUkVUVVJOX05PTkU7CisgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCi1jb25uZWN0aW9uX3JlY3ZieXRlcyhDb25uZWN0aW9uT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykgCitjb25uZWN0aW9uX3JlY3ZieXRlcyhDb25uZWN0aW9uT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpmcmVlbWUgPSBOVUxMOwotCVB5X3NzaXplX3QgcmVzLCBtYXhsZW5ndGggPSBQWV9TU0laRV9UX01BWDsKLQlQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKKyAgICBjaGFyICpmcmVlbWUgPSBOVUxMOworICAgIFB5X3NzaXplX3QgcmVzLCBtYXhsZW5ndGggPSBQWV9TU0laRV9UX01BWDsKKyAgICBQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifCIgRl9QWV9TU0laRV9ULCAmbWF4bGVuZ3RoKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8IiBGX1BZX1NTSVpFX1QsICZtYXhsZW5ndGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCUNIRUNLX1JFQURBQkxFKHNlbGYpOwotCQotCWlmIChtYXhsZW5ndGggPCAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAibWF4bGVuZ3RoIDwgMCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JCi0JcmVzID0gY29ubl9yZWN2X3N0cmluZyhzZWxmLCBzZWxmLT5idWZmZXIsIENPTk5FQ1RJT05fQlVGRkVSX1NJWkUsIAotCQkJICAgICAgICZmcmVlbWUsIG1heGxlbmd0aCk7Ci0JCi0JaWYgKHJlcyA8IDApIHsKLQkJaWYgKHJlcyA9PSBNUF9CQURfTUVTU0FHRV9MRU5HVEgpIHsKLQkJCWlmICgoc2VsZi0+ZmxhZ3MgJiBXUklUQUJMRSkgPT0gMCkgewotCQkJCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQkJCQlDTE9TRShzZWxmLT5oYW5kbGUpOwotCQkJCVB5X0VORF9BTExPV19USFJFQURTCi0JCQkJc2VsZi0+aGFuZGxlID0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7Ci0JCQl9IGVsc2UgewotCQkJCXNlbGYtPmZsYWdzID0gV1JJVEFCTEU7Ci0JCQl9Ci0JCX0KLQkJbXBfU2V0RXJyb3IoUHlFeGNfSU9FcnJvciwgcmVzKTsKLQl9IGVsc2UgeyAgICAKLQkJaWYgKGZyZWVtZSA9PSBOVUxMKSB7Ci0JCQlyZXN1bHQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzZWxmLT5idWZmZXIsIHJlcyk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXN1bHQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShmcmVlbWUsIHJlcyk7Ci0JCQlQeU1lbV9GcmVlKGZyZWVtZSk7Ci0JCX0KLQl9Ci0JCi0JcmV0dXJuIHJlc3VsdDsKKyAgICBDSEVDS19SRUFEQUJMRShzZWxmKTsKKworICAgIGlmIChtYXhsZW5ndGggPCAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAibWF4bGVuZ3RoIDwgMCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXMgPSBjb25uX3JlY3Zfc3RyaW5nKHNlbGYsIHNlbGYtPmJ1ZmZlciwgQ09OTkVDVElPTl9CVUZGRVJfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZmcmVlbWUsIG1heGxlbmd0aCk7CisKKyAgICBpZiAocmVzIDwgMCkgeworICAgICAgICBpZiAocmVzID09IE1QX0JBRF9NRVNTQUdFX0xFTkdUSCkgeworICAgICAgICAgICAgaWYgKChzZWxmLT5mbGFncyAmIFdSSVRBQkxFKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICAgICAgICAgIENMT1NFKHNlbGYtPmhhbmRsZSk7CisgICAgICAgICAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgICAgICAgICBzZWxmLT5oYW5kbGUgPSBJTlZBTElEX0hBTkRMRV9WQUxVRTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2VsZi0+ZmxhZ3MgPSBXUklUQUJMRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtcF9TZXRFcnJvcihQeUV4Y19JT0Vycm9yLCByZXMpOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChmcmVlbWUgPT0gTlVMTCkgeworICAgICAgICAgICAgcmVzdWx0ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoc2VsZi0+YnVmZmVyLCByZXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVzdWx0ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoZnJlZW1lLCByZXMpOworICAgICAgICAgICAgUHlNZW1fRnJlZShmcmVlbWUpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKLWNvbm5lY3Rpb25fcmVjdmJ5dGVzX2ludG8oQ29ubmVjdGlvbk9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpIAorY29ubmVjdGlvbl9yZWN2Ynl0ZXNfaW50byhDb25uZWN0aW9uT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpmcmVlbWUgPSBOVUxMLCAqYnVmZmVyID0gTlVMTDsKLQlQeV9zc2l6ZV90IHJlcywgbGVuZ3RoLCBvZmZzZXQgPSAwOwotCVB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOwotCVB5X2J1ZmZlciBwYnVmOworICAgIGNoYXIgKmZyZWVtZSA9IE5VTEwsICpidWZmZXIgPSBOVUxMOworICAgIFB5X3NzaXplX3QgcmVzLCBsZW5ndGgsIG9mZnNldCA9IDA7CisgICAgUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7CisgICAgUHlfYnVmZmVyIHBidWY7CiAKLQlDSEVDS19SRUFEQUJMRShzZWxmKTsKLQkKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIncqfCIgRl9QWV9TU0laRV9ULCAKLQkJCSAgICAgICZwYnVmLCAmb2Zmc2V0KSkKLQkJcmV0dXJuIE5VTEw7CisgICAgQ0hFQ0tfUkVBREFCTEUoc2VsZik7CiAKLQlidWZmZXIgPSBwYnVmLmJ1ZjsKLQlsZW5ndGggPSBwYnVmLmxlbjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIncqfCIgRl9QWV9TU0laRV9ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGJ1ZiwgJm9mZnNldCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKG9mZnNldCA8IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJuZWdhdGl2ZSBvZmZzZXQiKTsKLQkJZ290byBfZXJyb3I7Ci0JfSAgIAorICAgIGJ1ZmZlciA9IHBidWYuYnVmOworICAgIGxlbmd0aCA9IHBidWYubGVuOwogCi0JaWYgKG9mZnNldCA+IGxlbmd0aCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIm9mZnNldCB0b28gbGFyZ2UiKTsKLQkJZ290byBfZXJyb3I7Ci0JfQorICAgIGlmIChvZmZzZXQgPCAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAibmVnYXRpdmUgb2Zmc2V0Iik7CisgICAgICAgIGdvdG8gX2Vycm9yOworICAgIH0KIAotCXJlcyA9IGNvbm5fcmVjdl9zdHJpbmcoc2VsZiwgYnVmZmVyK29mZnNldCwgbGVuZ3RoLW9mZnNldCwgCi0JCQkgICAgICAgJmZyZWVtZSwgUFlfU1NJWkVfVF9NQVgpOworICAgIGlmIChvZmZzZXQgPiBsZW5ndGgpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJvZmZzZXQgdG9vIGxhcmdlIik7CisgICAgICAgIGdvdG8gX2Vycm9yOworICAgIH0KIAotCWlmIChyZXMgPCAwKSB7Ci0JCWlmIChyZXMgPT0gTVBfQkFEX01FU1NBR0VfTEVOR1RIKSB7Ci0JCQlpZiAoKHNlbGYtPmZsYWdzICYgV1JJVEFCTEUpID09IDApIHsKLQkJCQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JCQkJQ0xPU0Uoc2VsZi0+aGFuZGxlKTsKLQkJCQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCQkJCXNlbGYtPmhhbmRsZSA9IElOVkFMSURfSEFORExFX1ZBTFVFOwotCQkJfSBlbHNlIHsKLQkJCQlzZWxmLT5mbGFncyA9IFdSSVRBQkxFOwotCQkJfQotCQl9Ci0JCW1wX1NldEVycm9yKFB5RXhjX0lPRXJyb3IsIHJlcyk7Ci0JfSBlbHNlIHsKLQkJaWYgKGZyZWVtZSA9PSBOVUxMKSB7Ci0JCQlyZXN1bHQgPSBQeUludF9Gcm9tU3NpemVfdChyZXMpOwotCQl9IGVsc2UgewotCQkJcmVzdWx0ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKEJ1ZmZlclRvb1Nob3J0LCAKLQkJCQkJCSAgICAgICBGX1JCVUZGRVIgIiMiLCAKLQkJCQkJCSAgICAgICBmcmVlbWUsIHJlcyk7Ci0JCQlQeU1lbV9GcmVlKGZyZWVtZSk7Ci0JCQlpZiAocmVzdWx0KSB7Ci0JCQkJUHlFcnJfU2V0T2JqZWN0KEJ1ZmZlclRvb1Nob3J0LCByZXN1bHQpOwotCQkJCVB5X0RFQ1JFRihyZXN1bHQpOwotCQkJfQotCQkJZ290byBfZXJyb3I7Ci0JCX0KLQl9CisgICAgcmVzID0gY29ubl9yZWN2X3N0cmluZyhzZWxmLCBidWZmZXIrb2Zmc2V0LCBsZW5ndGgtb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZyZWVtZSwgUFlfU1NJWkVfVF9NQVgpOworCisgICAgaWYgKHJlcyA8IDApIHsKKyAgICAgICAgaWYgKHJlcyA9PSBNUF9CQURfTUVTU0FHRV9MRU5HVEgpIHsKKyAgICAgICAgICAgIGlmICgoc2VsZi0+ZmxhZ3MgJiBXUklUQUJMRSkgPT0gMCkgeworICAgICAgICAgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgICAgICAgICBDTE9TRShzZWxmLT5oYW5kbGUpOworICAgICAgICAgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgICAgICAgICAgICAgc2VsZi0+aGFuZGxlID0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNlbGYtPmZsYWdzID0gV1JJVEFCTEU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbXBfU2V0RXJyb3IoUHlFeGNfSU9FcnJvciwgcmVzKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoZnJlZW1lID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IFB5SW50X0Zyb21Tc2l6ZV90KHJlcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXN1bHQgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oQnVmZmVyVG9vU2hvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRl9SQlVGRkVSICIjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlbWUsIHJlcyk7CisgICAgICAgICAgICBQeU1lbV9GcmVlKGZyZWVtZSk7CisgICAgICAgICAgICBpZiAocmVzdWx0KSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0T2JqZWN0KEJ1ZmZlclRvb1Nob3J0LCByZXN1bHQpOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZ290byBfZXJyb3I7CisgICAgICAgIH0KKyAgICB9CiAKIF9jbGVhbnVwOgotCVB5QnVmZmVyX1JlbGVhc2UoJnBidWYpOwotCXJldHVybiByZXN1bHQ7CisgICAgUHlCdWZmZXJfUmVsZWFzZSgmcGJ1Zik7CisgICAgcmV0dXJuIHJlc3VsdDsKIAogX2Vycm9yOgotCXJlc3VsdCA9IE5VTEw7Ci0JZ290byBfY2xlYW51cDsKKyAgICByZXN1bHQgPSBOVUxMOworICAgIGdvdG8gX2NsZWFudXA7CiB9CiAKIC8qCkBAIC0yNTUsNzQgKzI1NSw3NCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGNvbm5lY3Rpb25fc2VuZF9vYmooQ29ubmVjdGlvbk9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm9iaikKIHsKLQljaGFyICpidWZmZXI7Ci0JaW50IHJlczsKLQlQeV9zc2l6ZV90IGxlbmd0aDsKLQlQeU9iamVjdCAqcGlja2xlZF9zdHJpbmcgPSBOVUxMOworICAgIGNoYXIgKmJ1ZmZlcjsKKyAgICBpbnQgcmVzOworICAgIFB5X3NzaXplX3QgbGVuZ3RoOworICAgIFB5T2JqZWN0ICpwaWNrbGVkX3N0cmluZyA9IE5VTEw7CiAKLQlDSEVDS19XUklUQUJMRShzZWxmKTsKKyAgICBDSEVDS19XUklUQUJMRShzZWxmKTsKIAotCXBpY2tsZWRfc3RyaW5nID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhwaWNrbGVfZHVtcHMsIG9iaiwgCi0JCQkJCQkgICAgICBwaWNrbGVfcHJvdG9jb2wsIE5VTEwpOwotCWlmICghcGlja2xlZF9zdHJpbmcpCi0JCWdvdG8gZmFpbHVyZTsKKyAgICBwaWNrbGVkX3N0cmluZyA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MocGlja2xlX2R1bXBzLCBvYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpY2tsZV9wcm90b2NvbCwgTlVMTCk7CisgICAgaWYgKCFwaWNrbGVkX3N0cmluZykKKyAgICAgICAgZ290byBmYWlsdXJlOwogCi0JaWYgKFB5U3RyaW5nX0FzU3RyaW5nQW5kU2l6ZShwaWNrbGVkX3N0cmluZywgJmJ1ZmZlciwgJmxlbmd0aCkgPCAwKQotCQlnb3RvIGZhaWx1cmU7CisgICAgaWYgKFB5U3RyaW5nX0FzU3RyaW5nQW5kU2l6ZShwaWNrbGVkX3N0cmluZywgJmJ1ZmZlciwgJmxlbmd0aCkgPCAwKQorICAgICAgICBnb3RvIGZhaWx1cmU7CiAKLQlyZXMgPSBjb25uX3NlbmRfc3RyaW5nKHNlbGYsIGJ1ZmZlciwgKGludClsZW5ndGgpOworICAgIHJlcyA9IGNvbm5fc2VuZF9zdHJpbmcoc2VsZiwgYnVmZmVyLCAoaW50KWxlbmd0aCk7CiAKLQlpZiAocmVzIDwgMCkgewotCQltcF9TZXRFcnJvcihQeUV4Y19JT0Vycm9yLCByZXMpOwotCQlnb3RvIGZhaWx1cmU7Ci0JfQorICAgIGlmIChyZXMgPCAwKSB7CisgICAgICAgIG1wX1NldEVycm9yKFB5RXhjX0lPRXJyb3IsIHJlcyk7CisgICAgICAgIGdvdG8gZmFpbHVyZTsKKyAgICB9CiAKLQlQeV9YREVDUkVGKHBpY2tsZWRfc3RyaW5nKTsKLQlQeV9SRVRVUk5fTk9ORTsKKyAgICBQeV9YREVDUkVGKHBpY2tsZWRfc3RyaW5nKTsKKyAgICBQeV9SRVRVUk5fTk9ORTsKIAogICBmYWlsdXJlOgotCVB5X1hERUNSRUYocGlja2xlZF9zdHJpbmcpOwotCXJldHVybiBOVUxMOworICAgIFB5X1hERUNSRUYocGlja2xlZF9zdHJpbmcpOworICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY29ubmVjdGlvbl9yZWN2X29iaihDb25uZWN0aW9uT2JqZWN0ICpzZWxmKQogewotCWNoYXIgKmZyZWVtZSA9IE5VTEw7Ci0JUHlfc3NpemVfdCByZXM7Ci0JUHlPYmplY3QgKnRlbXAgPSBOVUxMLCAqcmVzdWx0ID0gTlVMTDsKKyAgICBjaGFyICpmcmVlbWUgPSBOVUxMOworICAgIFB5X3NzaXplX3QgcmVzOworICAgIFB5T2JqZWN0ICp0ZW1wID0gTlVMTCwgKnJlc3VsdCA9IE5VTEw7CiAKLQlDSEVDS19SRUFEQUJMRShzZWxmKTsKKyAgICBDSEVDS19SRUFEQUJMRShzZWxmKTsKIAotCXJlcyA9IGNvbm5fcmVjdl9zdHJpbmcoc2VsZiwgc2VsZi0+YnVmZmVyLCBDT05ORUNUSU9OX0JVRkZFUl9TSVpFLCAKLQkJCSAgICAgICAmZnJlZW1lLCBQWV9TU0laRV9UX01BWCk7CisgICAgcmVzID0gY29ubl9yZWN2X3N0cmluZyhzZWxmLCBzZWxmLT5idWZmZXIsIENPTk5FQ1RJT05fQlVGRkVSX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmZnJlZW1lLCBQWV9TU0laRV9UX01BWCk7CiAKLQlpZiAocmVzIDwgMCkgewotCQlpZiAocmVzID09IE1QX0JBRF9NRVNTQUdFX0xFTkdUSCkgewotCQkJaWYgKChzZWxmLT5mbGFncyAmIFdSSVRBQkxFKSA9PSAwKSB7Ci0JCQkJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCQkJCUNMT1NFKHNlbGYtPmhhbmRsZSk7Ci0JCQkJUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQkJCQlzZWxmLT5oYW5kbGUgPSBJTlZBTElEX0hBTkRMRV9WQUxVRTsKLQkJCX0gZWxzZSB7Ci0JCQkJc2VsZi0+ZmxhZ3MgPSBXUklUQUJMRTsKLQkJCX0KLQkJfQotCQltcF9TZXRFcnJvcihQeUV4Y19JT0Vycm9yLCByZXMpOwotCX0gZWxzZSB7ICAgIAotCQlpZiAoZnJlZW1lID09IE5VTEwpIHsKLQkJCXRlbXAgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzZWxmLT5idWZmZXIsIHJlcyk7Ci0JCX0gZWxzZSB7Ci0JCQl0ZW1wID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoZnJlZW1lLCByZXMpOwotCQkJUHlNZW1fRnJlZShmcmVlbWUpOwotCQl9Ci0JfQorICAgIGlmIChyZXMgPCAwKSB7CisgICAgICAgIGlmIChyZXMgPT0gTVBfQkFEX01FU1NBR0VfTEVOR1RIKSB7CisgICAgICAgICAgICBpZiAoKHNlbGYtPmZsYWdzICYgV1JJVEFCTEUpID09IDApIHsKKyAgICAgICAgICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgICAgICAgICAgICAgQ0xPU0Uoc2VsZi0+aGFuZGxlKTsKKyAgICAgICAgICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgICAgICAgICAgICAgIHNlbGYtPmhhbmRsZSA9IElOVkFMSURfSEFORExFX1ZBTFVFOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzZWxmLT5mbGFncyA9IFdSSVRBQkxFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1wX1NldEVycm9yKFB5RXhjX0lPRXJyb3IsIHJlcyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGZyZWVtZSA9PSBOVUxMKSB7CisgICAgICAgICAgICB0ZW1wID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoc2VsZi0+YnVmZmVyLCByZXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGVtcCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGZyZWVtZSwgcmVzKTsKKyAgICAgICAgICAgIFB5TWVtX0ZyZWUoZnJlZW1lKTsKKyAgICAgICAgfQorICAgIH0KIAotCWlmICh0ZW1wKQotCQlyZXN1bHQgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKHBpY2tsZV9sb2FkcywgCi0JCQkJCQkgICAgICB0ZW1wLCBOVUxMKTsKLQlQeV9YREVDUkVGKHRlbXApOwotCXJldHVybiByZXN1bHQ7CisgICAgaWYgKHRlbXApCisgICAgICAgIHJlc3VsdCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MocGlja2xlX2xvYWRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAsIE5VTEwpOworICAgIFB5X1hERUNSRUYodGVtcCk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogLyoKQEAgLTMzMiw3MyArMzMyLDczIEBACiBzdGF0aWMgUHlPYmplY3QgKgogY29ubmVjdGlvbl9wb2xsKENvbm5lY3Rpb25PYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICp0aW1lb3V0X29iaiA9IE5VTEw7Ci0JZG91YmxlIHRpbWVvdXQgPSAwLjA7Ci0JaW50IHJlczsKKyAgICBQeU9iamVjdCAqdGltZW91dF9vYmogPSBOVUxMOworICAgIGRvdWJsZSB0aW1lb3V0ID0gMC4wOworICAgIGludCByZXM7CiAKLQlDSEVDS19SRUFEQUJMRShzZWxmKTsKKyAgICBDSEVDS19SRUFEQUJMRShzZWxmKTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifE8iLCAmdGltZW91dF9vYmopKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxPIiwgJnRpbWVvdXRfb2JqKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAodGltZW91dF9vYmogPT0gTlVMTCkgewotCQl0aW1lb3V0ID0gMC4wOwotCX0gZWxzZSBpZiAodGltZW91dF9vYmogPT0gUHlfTm9uZSkgewotCQl0aW1lb3V0ID0gLTEuMDsJCQkJLyogYmxvY2sgZm9yZXZlciAqLwotCX0gZWxzZSB7Ci0JCXRpbWVvdXQgPSBQeUZsb2F0X0FzRG91YmxlKHRpbWVvdXRfb2JqKTsKLQkJaWYgKFB5RXJyX09jY3VycmVkKCkpCi0JCQlyZXR1cm4gTlVMTDsKLQkJaWYgKHRpbWVvdXQgPCAwLjApCi0JCQl0aW1lb3V0ID0gMC4wOwotCX0KKyAgICBpZiAodGltZW91dF9vYmogPT0gTlVMTCkgeworICAgICAgICB0aW1lb3V0ID0gMC4wOworICAgIH0gZWxzZSBpZiAodGltZW91dF9vYmogPT0gUHlfTm9uZSkgeworICAgICAgICB0aW1lb3V0ID0gLTEuMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBibG9jayBmb3JldmVyICovCisgICAgfSBlbHNlIHsKKyAgICAgICAgdGltZW91dCA9IFB5RmxvYXRfQXNEb3VibGUodGltZW91dF9vYmopOworICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBpZiAodGltZW91dCA8IDAuMCkKKyAgICAgICAgICAgIHRpbWVvdXQgPSAwLjA7CisgICAgfQogCi0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCXJlcyA9IGNvbm5fcG9sbChzZWxmLCB0aW1lb3V0LCBfc2F2ZSk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgcmVzID0gY29ubl9wb2xsKHNlbGYsIHRpbWVvdXQsIF9zYXZlKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogCi0Jc3dpdGNoIChyZXMpIHsKLQljYXNlIFRSVUU6Ci0JCVB5X1JFVFVSTl9UUlVFOwotCWNhc2UgRkFMU0U6Ci0JCVB5X1JFVFVSTl9GQUxTRTsKLQlkZWZhdWx0OgotCQlyZXR1cm4gbXBfU2V0RXJyb3IoUHlFeGNfSU9FcnJvciwgcmVzKTsKLQl9CisgICAgc3dpdGNoIChyZXMpIHsKKyAgICBjYXNlIFRSVUU6CisgICAgICAgIFB5X1JFVFVSTl9UUlVFOworICAgIGNhc2UgRkFMU0U6CisgICAgICAgIFB5X1JFVFVSTl9GQUxTRTsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gbXBfU2V0RXJyb3IoUHlFeGNfSU9FcnJvciwgcmVzKTsKKyAgICB9CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjb25uZWN0aW9uX2ZpbGVubyhDb25uZWN0aW9uT2JqZWN0KiBzZWxmKQogewotCWlmIChzZWxmLT5oYW5kbGUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0lPRXJyb3IsICJoYW5kbGUgaXMgaW52YWxpZCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKXNlbGYtPmhhbmRsZSk7CisgICAgaWYgKHNlbGYtPmhhbmRsZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSU9FcnJvciwgImhhbmRsZSBpcyBpbnZhbGlkIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpc2VsZi0+aGFuZGxlKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNvbm5lY3Rpb25fY2xvc2UoQ29ubmVjdGlvbk9iamVjdCAqc2VsZikKIHsKLQlpZiAoc2VsZi0+aGFuZGxlICE9IElOVkFMSURfSEFORExFX1ZBTFVFKSB7Ci0JCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQkJQ0xPU0Uoc2VsZi0+aGFuZGxlKTsKLQkJUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQkJc2VsZi0+aGFuZGxlID0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7Ci0JfQorICAgIGlmIChzZWxmLT5oYW5kbGUgIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKKyAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICBDTE9TRShzZWxmLT5oYW5kbGUpOworICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgICAgICBzZWxmLT5oYW5kbGUgPSBJTlZBTElEX0hBTkRMRV9WQUxVRTsKKyAgICB9CiAKLQlQeV9SRVRVUk5fTk9ORTsKKyAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNvbm5lY3Rpb25fcmVwcihDb25uZWN0aW9uT2JqZWN0ICpzZWxmKQogewotCXN0YXRpYyBjaGFyICpjb25uX3R5cGVbXSA9IHsicmVhZC1vbmx5IiwgIndyaXRlLW9ubHkiLCAicmVhZC13cml0ZSJ9OworICAgIHN0YXRpYyBjaGFyICpjb25uX3R5cGVbXSA9IHsicmVhZC1vbmx5IiwgIndyaXRlLW9ubHkiLCAicmVhZC13cml0ZSJ9OwogCi0JYXNzZXJ0KHNlbGYtPmZsYWdzID49IDEgJiYgc2VsZi0+ZmxhZ3MgPD0gMyk7Ci0JcmV0dXJuIEZST01fRk9STUFUKCI8JXMgJXMsIGhhbmRsZSAlemQ+IiwgCi0JCQkgICBjb25uX3R5cGVbc2VsZi0+ZmxhZ3MgLSAxXSwKLQkJCSAgIENPTk5FQ1RJT05fTkFNRSwgKFB5X3NzaXplX3Qpc2VsZi0+aGFuZGxlKTsKKyAgICBhc3NlcnQoc2VsZi0+ZmxhZ3MgPj0gMSAmJiBzZWxmLT5mbGFncyA8PSAzKTsKKyAgICByZXR1cm4gRlJPTV9GT1JNQVQoIjwlcyAlcywgaGFuZGxlICV6ZD4iLAorICAgICAgICAgICAgICAgICAgICAgICBjb25uX3R5cGVbc2VsZi0+ZmxhZ3MgLSAxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgQ09OTkVDVElPTl9OQU1FLCAoUHlfc3NpemVfdClzZWxmLT5oYW5kbGUpOwogfQogCiAvKgpAQCAtNDA4LDE5ICs0MDgsMTkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBjb25uZWN0aW9uX2Nsb3NlZChDb25uZWN0aW9uT2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeUJvb2xfRnJvbUxvbmcoKGxvbmcpKHNlbGYtPmhhbmRsZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkpOworICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoKGxvbmcpKHNlbGYtPmhhbmRsZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY29ubmVjdGlvbl9yZWFkYWJsZShDb25uZWN0aW9uT2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeUJvb2xfRnJvbUxvbmcoKGxvbmcpKHNlbGYtPmZsYWdzICYgUkVBREFCTEUpKTsKKyAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKChsb25nKShzZWxmLT5mbGFncyAmIFJFQURBQkxFKSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjb25uZWN0aW9uX3dyaXRhYmxlKENvbm5lY3Rpb25PYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygobG9uZykoc2VsZi0+ZmxhZ3MgJiBXUklUQUJMRSkpOworICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoKGxvbmcpKHNlbGYtPmZsYWdzICYgV1JJVEFCTEUpKTsKIH0KIAogLyoKQEAgLTQyOCwzNyArNDI4LDM3IEBACiAgKi8KIAogc3RhdGljIFB5TWV0aG9kRGVmIGNvbm5lY3Rpb25fbWV0aG9kc1tdID0gewotCXsic2VuZF9ieXRlcyIsIChQeUNGdW5jdGlvbiljb25uZWN0aW9uX3NlbmRieXRlcywgTUVUSF9WQVJBUkdTLCAKLQkgInNlbmQgdGhlIGJ5dGUgZGF0YSBmcm9tIGEgcmVhZGFibGUgYnVmZmVyLWxpa2Ugb2JqZWN0In0sCi0JeyJyZWN2X2J5dGVzIiwgKFB5Q0Z1bmN0aW9uKWNvbm5lY3Rpb25fcmVjdmJ5dGVzLCBNRVRIX1ZBUkFSR1MsIAotCSAicmVjZWl2ZSBieXRlIGRhdGEgYXMgYSBzdHJpbmcifSwKLQl7InJlY3ZfYnl0ZXNfaW50byIsKFB5Q0Z1bmN0aW9uKWNvbm5lY3Rpb25fcmVjdmJ5dGVzX2ludG8sTUVUSF9WQVJBUkdTLAotCSAicmVjZWl2ZSBieXRlIGRhdGEgaW50byBhIHdyaXRlYWJsZSBidWZmZXItbGlrZSBvYmplY3RcbiIKLQkgInJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWFkIn0sCisgICAgeyJzZW5kX2J5dGVzIiwgKFB5Q0Z1bmN0aW9uKWNvbm5lY3Rpb25fc2VuZGJ5dGVzLCBNRVRIX1ZBUkFSR1MsCisgICAgICJzZW5kIHRoZSBieXRlIGRhdGEgZnJvbSBhIHJlYWRhYmxlIGJ1ZmZlci1saWtlIG9iamVjdCJ9LAorICAgIHsicmVjdl9ieXRlcyIsIChQeUNGdW5jdGlvbiljb25uZWN0aW9uX3JlY3ZieXRlcywgTUVUSF9WQVJBUkdTLAorICAgICAicmVjZWl2ZSBieXRlIGRhdGEgYXMgYSBzdHJpbmcifSwKKyAgICB7InJlY3ZfYnl0ZXNfaW50byIsKFB5Q0Z1bmN0aW9uKWNvbm5lY3Rpb25fcmVjdmJ5dGVzX2ludG8sTUVUSF9WQVJBUkdTLAorICAgICAicmVjZWl2ZSBieXRlIGRhdGEgaW50byBhIHdyaXRlYWJsZSBidWZmZXItbGlrZSBvYmplY3RcbiIKKyAgICAgInJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWFkIn0sCiAKLQl7InNlbmQiLCAoUHlDRnVuY3Rpb24pY29ubmVjdGlvbl9zZW5kX29iaiwgTUVUSF9PLCAKLQkgInNlbmQgYSAocGlja2xhYmxlKSBvYmplY3QifSwKLQl7InJlY3YiLCAoUHlDRnVuY3Rpb24pY29ubmVjdGlvbl9yZWN2X29iaiwgTUVUSF9OT0FSR1MsIAotCSAicmVjZWl2ZSBhIChwaWNrbGFibGUpIG9iamVjdCJ9LAorICAgIHsic2VuZCIsIChQeUNGdW5jdGlvbiljb25uZWN0aW9uX3NlbmRfb2JqLCBNRVRIX08sCisgICAgICJzZW5kIGEgKHBpY2tsYWJsZSkgb2JqZWN0In0sCisgICAgeyJyZWN2IiwgKFB5Q0Z1bmN0aW9uKWNvbm5lY3Rpb25fcmVjdl9vYmosIE1FVEhfTk9BUkdTLAorICAgICAicmVjZWl2ZSBhIChwaWNrbGFibGUpIG9iamVjdCJ9LAogCi0JeyJwb2xsIiwgKFB5Q0Z1bmN0aW9uKWNvbm5lY3Rpb25fcG9sbCwgTUVUSF9WQVJBUkdTLCAKLQkgIndoZXRoZXIgdGhlcmUgaXMgYW55IGlucHV0IGF2YWlsYWJsZSB0byBiZSByZWFkIn0sCi0JeyJmaWxlbm8iLCAoUHlDRnVuY3Rpb24pY29ubmVjdGlvbl9maWxlbm8sIE1FVEhfTk9BUkdTLAotCSAiZmlsZSBkZXNjcmlwdG9yIG9yIGhhbmRsZSBvZiB0aGUgY29ubmVjdGlvbiJ9LAotCXsiY2xvc2UiLCAoUHlDRnVuY3Rpb24pY29ubmVjdGlvbl9jbG9zZSwgTUVUSF9OT0FSR1MsCi0JICJjbG9zZSB0aGUgY29ubmVjdGlvbiJ9LAorICAgIHsicG9sbCIsIChQeUNGdW5jdGlvbiljb25uZWN0aW9uX3BvbGwsIE1FVEhfVkFSQVJHUywKKyAgICAgIndoZXRoZXIgdGhlcmUgaXMgYW55IGlucHV0IGF2YWlsYWJsZSB0byBiZSByZWFkIn0sCisgICAgeyJmaWxlbm8iLCAoUHlDRnVuY3Rpb24pY29ubmVjdGlvbl9maWxlbm8sIE1FVEhfTk9BUkdTLAorICAgICAiZmlsZSBkZXNjcmlwdG9yIG9yIGhhbmRsZSBvZiB0aGUgY29ubmVjdGlvbiJ9LAorICAgIHsiY2xvc2UiLCAoUHlDRnVuY3Rpb24pY29ubmVjdGlvbl9jbG9zZSwgTUVUSF9OT0FSR1MsCisgICAgICJjbG9zZSB0aGUgY29ubmVjdGlvbiJ9LAogCi0Je05VTEx9ICAvKiBTZW50aW5lbCAqLworICAgIHtOVUxMfSAgLyogU2VudGluZWwgKi8KIH07CiAKIHN0YXRpYyBQeUdldFNldERlZiBjb25uZWN0aW9uX2dldHNldFtdID0gewotCXsiY2xvc2VkIiwgKGdldHRlciljb25uZWN0aW9uX2Nsb3NlZCwgTlVMTCwgCi0JICJUcnVlIGlmIHRoZSBjb25uZWN0aW9uIGlzIGNsb3NlZCIsIE5VTEx9LAotCXsicmVhZGFibGUiLCAoZ2V0dGVyKWNvbm5lY3Rpb25fcmVhZGFibGUsIE5VTEwsIAotCSAiVHJ1ZSBpZiB0aGUgY29ubmVjdGlvbiBpcyByZWFkYWJsZSIsIE5VTEx9LAotCXsid3JpdGFibGUiLCAoZ2V0dGVyKWNvbm5lY3Rpb25fd3JpdGFibGUsIE5VTEwsIAotCSAiVHJ1ZSBpZiB0aGUgY29ubmVjdGlvbiBpcyB3cml0YWJsZSIsIE5VTEx9LAotCXtOVUxMfQorICAgIHsiY2xvc2VkIiwgKGdldHRlciljb25uZWN0aW9uX2Nsb3NlZCwgTlVMTCwKKyAgICAgIlRydWUgaWYgdGhlIGNvbm5lY3Rpb24gaXMgY2xvc2VkIiwgTlVMTH0sCisgICAgeyJyZWFkYWJsZSIsIChnZXR0ZXIpY29ubmVjdGlvbl9yZWFkYWJsZSwgTlVMTCwKKyAgICAgIlRydWUgaWYgdGhlIGNvbm5lY3Rpb24gaXMgcmVhZGFibGUiLCBOVUxMfSwKKyAgICB7IndyaXRhYmxlIiwgKGdldHRlciljb25uZWN0aW9uX3dyaXRhYmxlLCBOVUxMLAorICAgICAiVHJ1ZSBpZiB0aGUgY29ubmVjdGlvbiBpcyB3cml0YWJsZSIsIE5VTEx9LAorICAgIHtOVUxMfQogfTsKIAogLyoKQEAgLTQ2Niw1MCArNDY2LDUwIEBACiAgKi8KIAogUHlEb2NfU1RSVkFSKGNvbm5lY3Rpb25fZG9jLAotCSAgICAgIkNvbm5lY3Rpb24gdHlwZSB3aG9zZSBjb25zdHJ1Y3RvciBzaWduYXR1cmUgaXNcblxuIgotCSAgICAgIiAgICBDb25uZWN0aW9uKGhhbmRsZSwgcmVhZGFibGU9VHJ1ZSwgd3JpdGFibGU9VHJ1ZSkuXG5cbiIKLQkgICAgICJUaGUgY29uc3RydWN0b3IgZG9lcyAqbm90KiBkdXBsaWNhdGUgdGhlIGhhbmRsZS4iKTsKKyAgICAgICAgICAgICAiQ29ubmVjdGlvbiB0eXBlIHdob3NlIGNvbnN0cnVjdG9yIHNpZ25hdHVyZSBpc1xuXG4iCisgICAgICAgICAgICAgIiAgICBDb25uZWN0aW9uKGhhbmRsZSwgcmVhZGFibGU9VHJ1ZSwgd3JpdGFibGU9VHJ1ZSkuXG5cbiIKKyAgICAgICAgICAgICAiVGhlIGNvbnN0cnVjdG9yIGRvZXMgKm5vdCogZHVwbGljYXRlIHRoZSBoYW5kbGUuIik7CiAKIFB5VHlwZU9iamVjdCBDT05ORUNUSU9OX1RZUEUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JLyogdHBfbmFtZSAgICAgICAgICAgKi8gIl9tdWx0aXByb2Nlc3NpbmcuIiBDT05ORUNUSU9OX05BTUUsCi0JLyogdHBfYmFzaWNzaXplICAgICAgKi8gc2l6ZW9mKENvbm5lY3Rpb25PYmplY3QpLAotCS8qIHRwX2l0ZW1zaXplICAgICAgICovIDAsCi0JLyogdHBfZGVhbGxvYyAgICAgICAgKi8gKGRlc3RydWN0b3IpY29ubmVjdGlvbl9kZWFsbG9jLAotCS8qIHRwX3ByaW50ICAgICAgICAgICovIDAsCi0JLyogdHBfZ2V0YXR0ciAgICAgICAgKi8gMCwKLQkvKiB0cF9zZXRhdHRyICAgICAgICAqLyAwLAotCS8qIHRwX2NvbXBhcmUgICAgICAgICovIDAsCi0JLyogdHBfcmVwciAgICAgICAgICAgKi8gKHJlcHJmdW5jKWNvbm5lY3Rpb25fcmVwciwKLQkvKiB0cF9hc19udW1iZXIgICAgICAqLyAwLAotCS8qIHRwX2FzX3NlcXVlbmNlICAgICovIDAsCi0JLyogdHBfYXNfbWFwcGluZyAgICAgKi8gMCwKLQkvKiB0cF9oYXNoICAgICAgICAgICAqLyAwLAotCS8qIHRwX2NhbGwgICAgICAgICAgICovIDAsCi0JLyogdHBfc3RyICAgICAgICAgICAgKi8gMCwKLQkvKiB0cF9nZXRhdHRybyAgICAgICAqLyAwLAotCS8qIHRwX3NldGF0dHJvICAgICAgICovIDAsCi0JLyogdHBfYXNfYnVmZmVyICAgICAgKi8gMCwKLQkvKiB0cF9mbGFncyAgICAgICAgICAqLyBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFIHwgCi0JCQkJUHlfVFBGTEFHU19IQVZFX1dFQUtSRUZTLAotCS8qIHRwX2RvYyAgICAgICAgICAgICovIGNvbm5lY3Rpb25fZG9jLAotCS8qIHRwX3RyYXZlcnNlICAgICAgICovIDAsCi0JLyogdHBfY2xlYXIgICAgICAgICAgKi8gMCwKLQkvKiB0cF9yaWNoY29tcGFyZSAgICAqLyAwLAotCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovIG9mZnNldG9mKENvbm5lY3Rpb25PYmplY3QsIHdlYWtyZWZsaXN0KSwKLQkvKiB0cF9pdGVyICAgICAgICAgICAqLyAwLAotCS8qIHRwX2l0ZXJuZXh0ICAgICAgICovIDAsCi0JLyogdHBfbWV0aG9kcyAgICAgICAgKi8gY29ubmVjdGlvbl9tZXRob2RzLAotCS8qIHRwX21lbWJlcnMgICAgICAgICovIDAsCi0JLyogdHBfZ2V0c2V0ICAgICAgICAgKi8gY29ubmVjdGlvbl9nZXRzZXQsCi0JLyogdHBfYmFzZSAgICAgICAgICAgKi8gMCwKLQkvKiB0cF9kaWN0ICAgICAgICAgICAqLyAwLAotCS8qIHRwX2Rlc2NyX2dldCAgICAgICovIDAsCi0JLyogdHBfZGVzY3Jfc2V0ICAgICAgKi8gMCwKLQkvKiB0cF9kaWN0b2Zmc2V0ICAgICAqLyAwLAotCS8qIHRwX2luaXQgICAgICAgICAgICovIDAsCi0JLyogdHBfYWxsb2MgICAgICAgICAgKi8gMCwKLQkvKiB0cF9uZXcgICAgICAgICAgICAqLyBjb25uZWN0aW9uX25ldywKKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAvKiB0cF9uYW1lICAgICAgICAgICAqLyAiX211bHRpcHJvY2Vzc2luZy4iIENPTk5FQ1RJT05fTkFNRSwKKyAgICAvKiB0cF9iYXNpY3NpemUgICAgICAqLyBzaXplb2YoQ29ubmVjdGlvbk9iamVjdCksCisgICAgLyogdHBfaXRlbXNpemUgICAgICAgKi8gMCwKKyAgICAvKiB0cF9kZWFsbG9jICAgICAgICAqLyAoZGVzdHJ1Y3Rvciljb25uZWN0aW9uX2RlYWxsb2MsCisgICAgLyogdHBfcHJpbnQgICAgICAgICAgKi8gMCwKKyAgICAvKiB0cF9nZXRhdHRyICAgICAgICAqLyAwLAorICAgIC8qIHRwX3NldGF0dHIgICAgICAgICovIDAsCisgICAgLyogdHBfY29tcGFyZSAgICAgICAgKi8gMCwKKyAgICAvKiB0cF9yZXByICAgICAgICAgICAqLyAocmVwcmZ1bmMpY29ubmVjdGlvbl9yZXByLAorICAgIC8qIHRwX2FzX251bWJlciAgICAgICovIDAsCisgICAgLyogdHBfYXNfc2VxdWVuY2UgICAgKi8gMCwKKyAgICAvKiB0cF9hc19tYXBwaW5nICAgICAqLyAwLAorICAgIC8qIHRwX2hhc2ggICAgICAgICAgICovIDAsCisgICAgLyogdHBfY2FsbCAgICAgICAgICAgKi8gMCwKKyAgICAvKiB0cF9zdHIgICAgICAgICAgICAqLyAwLAorICAgIC8qIHRwX2dldGF0dHJvICAgICAgICovIDAsCisgICAgLyogdHBfc2V0YXR0cm8gICAgICAgKi8gMCwKKyAgICAvKiB0cF9hc19idWZmZXIgICAgICAqLyAwLAorICAgIC8qIHRwX2ZsYWdzICAgICAgICAgICovIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfQkFTRVRZUEUgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X1RQRkxBR1NfSEFWRV9XRUFLUkVGUywKKyAgICAvKiB0cF9kb2MgICAgICAgICAgICAqLyBjb25uZWN0aW9uX2RvYywKKyAgICAvKiB0cF90cmF2ZXJzZSAgICAgICAqLyAwLAorICAgIC8qIHRwX2NsZWFyICAgICAgICAgICovIDAsCisgICAgLyogdHBfcmljaGNvbXBhcmUgICAgKi8gMCwKKyAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLyBvZmZzZXRvZihDb25uZWN0aW9uT2JqZWN0LCB3ZWFrcmVmbGlzdCksCisgICAgLyogdHBfaXRlciAgICAgICAgICAgKi8gMCwKKyAgICAvKiB0cF9pdGVybmV4dCAgICAgICAqLyAwLAorICAgIC8qIHRwX21ldGhvZHMgICAgICAgICovIGNvbm5lY3Rpb25fbWV0aG9kcywKKyAgICAvKiB0cF9tZW1iZXJzICAgICAgICAqLyAwLAorICAgIC8qIHRwX2dldHNldCAgICAgICAgICovIGNvbm5lY3Rpb25fZ2V0c2V0LAorICAgIC8qIHRwX2Jhc2UgICAgICAgICAgICovIDAsCisgICAgLyogdHBfZGljdCAgICAgICAgICAgKi8gMCwKKyAgICAvKiB0cF9kZXNjcl9nZXQgICAgICAqLyAwLAorICAgIC8qIHRwX2Rlc2NyX3NldCAgICAgICovIDAsCisgICAgLyogdHBfZGljdG9mZnNldCAgICAgKi8gMCwKKyAgICAvKiB0cF9pbml0ICAgICAgICAgICAqLyAwLAorICAgIC8qIHRwX2FsbG9jICAgICAgICAgICovIDAsCisgICAgLyogdHBfbmV3ICAgICAgICAgICAgKi8gY29ubmVjdGlvbl9uZXcsCiB9OwogCiAjZW5kaWYgLyogQ09OTkVDVElPTl9IICovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19tdWx0aXByb2Nlc3NpbmcvbXVsdGlwcm9jZXNzaW5nLmMgYi9Nb2R1bGVzL19tdWx0aXByb2Nlc3NpbmcvbXVsdGlwcm9jZXNzaW5nLmMKaW5kZXggNDgwNDljNy4uZTU5Mzk1MCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fbXVsdGlwcm9jZXNzaW5nL211bHRpcHJvY2Vzc2luZy5jCisrKyBiL01vZHVsZXMvX211bHRpcHJvY2Vzc2luZy9tdWx0aXByb2Nlc3NpbmcuYwpAQCAtMjAsNDYgKzIwLDQ2IEBACiBQeU9iamVjdCAqCiBtcF9TZXRFcnJvcihQeU9iamVjdCAqVHlwZSwgaW50IG51bSkKIHsKLQlzd2l0Y2ggKG51bSkgeworICAgIHN3aXRjaCAobnVtKSB7CiAjaWZkZWYgTVNfV0lORE9XUwotCWNhc2UgTVBfU1RBTkRBUkRfRVJST1I6IAotCQlpZiAoVHlwZSA9PSBOVUxMKQotCQkJVHlwZSA9IFB5RXhjX1dpbmRvd3NFcnJvcjsKLQkJUHlFcnJfU2V0RXhjRnJvbVdpbmRvd3NFcnIoVHlwZSwgMCk7Ci0JCWJyZWFrOwotCWNhc2UgTVBfU09DS0VUX0VSUk9SOgotCQlpZiAoVHlwZSA9PSBOVUxMKQotCQkJVHlwZSA9IFB5RXhjX1dpbmRvd3NFcnJvcjsKLQkJUHlFcnJfU2V0RXhjRnJvbVdpbmRvd3NFcnIoVHlwZSwgV1NBR2V0TGFzdEVycm9yKCkpOwotCQlicmVhazsKKyAgICBjYXNlIE1QX1NUQU5EQVJEX0VSUk9SOgorICAgICAgICBpZiAoVHlwZSA9PSBOVUxMKQorICAgICAgICAgICAgVHlwZSA9IFB5RXhjX1dpbmRvd3NFcnJvcjsKKyAgICAgICAgUHlFcnJfU2V0RXhjRnJvbVdpbmRvd3NFcnIoVHlwZSwgMCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTVBfU09DS0VUX0VSUk9SOgorICAgICAgICBpZiAoVHlwZSA9PSBOVUxMKQorICAgICAgICAgICAgVHlwZSA9IFB5RXhjX1dpbmRvd3NFcnJvcjsKKyAgICAgICAgUHlFcnJfU2V0RXhjRnJvbVdpbmRvd3NFcnIoVHlwZSwgV1NBR2V0TGFzdEVycm9yKCkpOworICAgICAgICBicmVhazsKICNlbHNlIC8qICFNU19XSU5ET1dTICovCi0JY2FzZSBNUF9TVEFOREFSRF9FUlJPUjoKLQljYXNlIE1QX1NPQ0tFVF9FUlJPUjoKLQkJaWYgKFR5cGUgPT0gTlVMTCkKLQkJCVR5cGUgPSBQeUV4Y19PU0Vycm9yOwotCQlQeUVycl9TZXRGcm9tRXJybm8oVHlwZSk7Ci0JCWJyZWFrOworICAgIGNhc2UgTVBfU1RBTkRBUkRfRVJST1I6CisgICAgY2FzZSBNUF9TT0NLRVRfRVJST1I6CisgICAgICAgIGlmIChUeXBlID09IE5VTEwpCisgICAgICAgICAgICBUeXBlID0gUHlFeGNfT1NFcnJvcjsKKyAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKFR5cGUpOworICAgICAgICBicmVhazsKICNlbmRpZiAvKiAhTVNfV0lORE9XUyAqLwotCWNhc2UgTVBfTUVNT1JZX0VSUk9SOgotCQlQeUVycl9Ob01lbW9yeSgpOwotCQlicmVhazsKLQljYXNlIE1QX0VORF9PRl9GSUxFOgotCQlQeUVycl9TZXROb25lKFB5RXhjX0VPRkVycm9yKTsKLQkJYnJlYWs7Ci0JY2FzZSBNUF9FQVJMWV9FTkRfT0ZfRklMRToKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0lPRXJyb3IsCi0JCQkJImdvdCBlbmQgb2YgZmlsZSBkdXJpbmcgbWVzc2FnZSIpOwotCQlicmVhazsKLQljYXNlIE1QX0JBRF9NRVNTQUdFX0xFTkdUSDoKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0lPRXJyb3IsICJiYWQgbWVzc2FnZSBsZW5ndGgiKTsKLQkJYnJlYWs7Ci0JY2FzZSBNUF9FWENFUFRJT05fSEFTX0JFRU5fU0VUOgotCQlicmVhazsKLQlkZWZhdWx0OgotCQlQeUVycl9Gb3JtYXQoUHlFeGNfUnVudGltZUVycm9yLAotCQkJICAgICAidW5rb3duIGVycm9yIG51bWJlciAlZCIsIG51bSk7Ci0JfQotCXJldHVybiBOVUxMOworICAgIGNhc2UgTVBfTUVNT1JZX0VSUk9SOgorICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE1QX0VORF9PRl9GSUxFOgorICAgICAgICBQeUVycl9TZXROb25lKFB5RXhjX0VPRkVycm9yKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNUF9FQVJMWV9FTkRfT0ZfRklMRToKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0lPRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiZ290IGVuZCBvZiBmaWxlIGR1cmluZyBtZXNzYWdlIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTVBfQkFEX01FU1NBR0VfTEVOR1RIOgorICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSU9FcnJvciwgImJhZCBtZXNzYWdlIGxlbmd0aCIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE1QX0VYQ0VQVElPTl9IQVNfQkVFTl9TRVQ6CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAidW5rb3duIGVycm9yIG51bWJlciAlZCIsIG51bSk7CisgICAgfQorICAgIHJldHVybiBOVUxMOwogfQogCiAKQEAgLTc2LDggKzc2LDggQEAKIHN0YXRpYyBCT09MIFdJTkFQSQogUHJvY2Vzc2luZ0N0cmxIYW5kbGVyKERXT1JEIGR3Q3RybFR5cGUpCiB7Ci0JU2V0RXZlbnQoc2lnaW50X2V2ZW50KTsKLQlyZXR1cm4gRkFMU0U7CisgICAgU2V0RXZlbnQoc2lnaW50X2V2ZW50KTsKKyAgICByZXR1cm4gRkFMU0U7CiB9CiAKIC8qCkBAIC05NSw3MiArOTUsNzIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBtdWx0aXByb2Nlc3Npbmdfc2VuZGZkKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgY29ubiwgZmQsIHJlczsKLQljaGFyIGR1bW15X2NoYXI7Ci0JY2hhciBidWZbQ01TR19TUEFDRShzaXplb2YoaW50KSldOwotCXN0cnVjdCBtc2doZHIgbXNnID0gezB9OwotCXN0cnVjdCBpb3ZlYyBkdW1teV9pb3Y7Ci0Jc3RydWN0IGNtc2doZHIgKmNtc2c7CisgICAgaW50IGNvbm4sIGZkLCByZXM7CisgICAgY2hhciBkdW1teV9jaGFyOworICAgIGNoYXIgYnVmW0NNU0dfU1BBQ0Uoc2l6ZW9mKGludCkpXTsKKyAgICBzdHJ1Y3QgbXNnaGRyIG1zZyA9IHswfTsKKyAgICBzdHJ1Y3QgaW92ZWMgZHVtbXlfaW92OworICAgIHN0cnVjdCBjbXNnaGRyICpjbXNnOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpaSIsICZjb25uLCAmZmQpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpIiwgJmNvbm4sICZmZCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JZHVtbXlfaW92Lmlvdl9iYXNlID0gJmR1bW15X2NoYXI7Ci0JZHVtbXlfaW92Lmlvdl9sZW4gPSAxOwotCW1zZy5tc2dfY29udHJvbCA9IGJ1ZjsKLQltc2cubXNnX2NvbnRyb2xsZW4gPSBzaXplb2YoYnVmKTsKLQltc2cubXNnX2lvdiA9ICZkdW1teV9pb3Y7Ci0JbXNnLm1zZ19pb3ZsZW4gPSAxOwotCWNtc2cgPSBDTVNHX0ZJUlNUSERSKCZtc2cpOwotCWNtc2ctPmNtc2dfbGV2ZWwgPSBTT0xfU09DS0VUOwotCWNtc2ctPmNtc2dfdHlwZSA9IFNDTV9SSUdIVFM7Ci0JY21zZy0+Y21zZ19sZW4gPSBDTVNHX0xFTihzaXplb2YoaW50KSk7Ci0JbXNnLm1zZ19jb250cm9sbGVuID0gY21zZy0+Y21zZ19sZW47Ci0JKihpbnQqKUNNU0dfREFUQShjbXNnKSA9IGZkOworICAgIGR1bW15X2lvdi5pb3ZfYmFzZSA9ICZkdW1teV9jaGFyOworICAgIGR1bW15X2lvdi5pb3ZfbGVuID0gMTsKKyAgICBtc2cubXNnX2NvbnRyb2wgPSBidWY7CisgICAgbXNnLm1zZ19jb250cm9sbGVuID0gc2l6ZW9mKGJ1Zik7CisgICAgbXNnLm1zZ19pb3YgPSAmZHVtbXlfaW92OworICAgIG1zZy5tc2dfaW92bGVuID0gMTsKKyAgICBjbXNnID0gQ01TR19GSVJTVEhEUigmbXNnKTsKKyAgICBjbXNnLT5jbXNnX2xldmVsID0gU09MX1NPQ0tFVDsKKyAgICBjbXNnLT5jbXNnX3R5cGUgPSBTQ01fUklHSFRTOworICAgIGNtc2ctPmNtc2dfbGVuID0gQ01TR19MRU4oc2l6ZW9mKGludCkpOworICAgIG1zZy5tc2dfY29udHJvbGxlbiA9IGNtc2ctPmNtc2dfbGVuOworICAgICooaW50KilDTVNHX0RBVEEoY21zZykgPSBmZDsKIAotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlyZXMgPSBzZW5kbXNnKGNvbm4sICZtc2csIDApOwotCVB5X0VORF9BTExPV19USFJFQURTCisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIHJlcyA9IHNlbmRtc2coY29ubiwgJm1zZywgMCk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKIAotCWlmIChyZXMgPCAwKQotCQlyZXR1cm4gUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX09TRXJyb3IpOwotCVB5X1JFVFVSTl9OT05FOworICAgIGlmIChyZXMgPCAwKQorICAgICAgICByZXR1cm4gUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX09TRXJyb3IpOworICAgIFB5X1JFVFVSTl9OT05FOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbXVsdGlwcm9jZXNzaW5nX3JlY3ZmZChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IGNvbm4sIGZkLCByZXM7Ci0JY2hhciBkdW1teV9jaGFyOwotCWNoYXIgYnVmW0NNU0dfU1BBQ0Uoc2l6ZW9mKGludCkpXTsKLQlzdHJ1Y3QgbXNnaGRyIG1zZyA9IHswfTsKLQlzdHJ1Y3QgaW92ZWMgZHVtbXlfaW92OwotCXN0cnVjdCBjbXNnaGRyICpjbXNnOworICAgIGludCBjb25uLCBmZCwgcmVzOworICAgIGNoYXIgZHVtbXlfY2hhcjsKKyAgICBjaGFyIGJ1ZltDTVNHX1NQQUNFKHNpemVvZihpbnQpKV07CisgICAgc3RydWN0IG1zZ2hkciBtc2cgPSB7MH07CisgICAgc3RydWN0IGlvdmVjIGR1bW15X2lvdjsKKyAgICBzdHJ1Y3QgY21zZ2hkciAqY21zZzsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaSIsICZjb25uKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpIiwgJmNvbm4pKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWR1bW15X2lvdi5pb3ZfYmFzZSA9ICZkdW1teV9jaGFyOwotCWR1bW15X2lvdi5pb3ZfbGVuID0gMTsKLQltc2cubXNnX2NvbnRyb2wgPSBidWY7Ci0JbXNnLm1zZ19jb250cm9sbGVuID0gc2l6ZW9mKGJ1Zik7Ci0JbXNnLm1zZ19pb3YgPSAmZHVtbXlfaW92OwotCW1zZy5tc2dfaW92bGVuID0gMTsKLQljbXNnID0gQ01TR19GSVJTVEhEUigmbXNnKTsKLQljbXNnLT5jbXNnX2xldmVsID0gU09MX1NPQ0tFVDsKLQljbXNnLT5jbXNnX3R5cGUgPSBTQ01fUklHSFRTOwotCWNtc2ctPmNtc2dfbGVuID0gQ01TR19MRU4oc2l6ZW9mKGludCkpOwotCW1zZy5tc2dfY29udHJvbGxlbiA9IGNtc2ctPmNtc2dfbGVuOworICAgIGR1bW15X2lvdi5pb3ZfYmFzZSA9ICZkdW1teV9jaGFyOworICAgIGR1bW15X2lvdi5pb3ZfbGVuID0gMTsKKyAgICBtc2cubXNnX2NvbnRyb2wgPSBidWY7CisgICAgbXNnLm1zZ19jb250cm9sbGVuID0gc2l6ZW9mKGJ1Zik7CisgICAgbXNnLm1zZ19pb3YgPSAmZHVtbXlfaW92OworICAgIG1zZy5tc2dfaW92bGVuID0gMTsKKyAgICBjbXNnID0gQ01TR19GSVJTVEhEUigmbXNnKTsKKyAgICBjbXNnLT5jbXNnX2xldmVsID0gU09MX1NPQ0tFVDsKKyAgICBjbXNnLT5jbXNnX3R5cGUgPSBTQ01fUklHSFRTOworICAgIGNtc2ctPmNtc2dfbGVuID0gQ01TR19MRU4oc2l6ZW9mKGludCkpOworICAgIG1zZy5tc2dfY29udHJvbGxlbiA9IGNtc2ctPmNtc2dfbGVuOwogCi0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCXJlcyA9IHJlY3Ztc2coY29ubiwgJm1zZywgMCk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgcmVzID0gcmVjdm1zZyhjb25uLCAmbXNnLCAwKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogCi0JaWYgKHJlcyA8IDApCi0JCXJldHVybiBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfT1NFcnJvcik7CisgICAgaWYgKHJlcyA8IDApCisgICAgICAgIHJldHVybiBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfT1NFcnJvcik7CiAKLQlmZCA9ICooaW50KilDTVNHX0RBVEEoY21zZyk7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLCBmZCk7CisgICAgZmQgPSAqKGludCopQ01TR19EQVRBKGNtc2cpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJpIiwgZmQpOwogfQogCiAjZW5kaWYgLyogSEFWRV9GRF9UUkFOU0ZFUiAqLwpAQCAtMTc1LDE0ICsxNzUsMTQgQEAKIHN0YXRpYyBQeU9iamVjdCoKIG11bHRpcHJvY2Vzc2luZ19hZGRyZXNzX29mX2J1ZmZlcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm9iaikKIHsKLQl2b2lkICpidWZmZXI7Ci0JUHlfc3NpemVfdCBidWZmZXJfbGVuOworICAgIHZvaWQgKmJ1ZmZlcjsKKyAgICBQeV9zc2l6ZV90IGJ1ZmZlcl9sZW47CiAKLQlpZiAoUHlPYmplY3RfQXNXcml0ZUJ1ZmZlcihvYmosICZidWZmZXIsICZidWZmZXJfbGVuKSA8IDApCi0JCXJldHVybiBOVUxMOworICAgIGlmIChQeU9iamVjdF9Bc1dyaXRlQnVmZmVyKG9iaiwgJmJ1ZmZlciwgJmJ1ZmZlcl9sZW4pIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTiIgRl9QWV9TU0laRV9ULCAKLQkJCSAgICAgUHlMb25nX0Zyb21Wb2lkUHRyKGJ1ZmZlciksIGJ1ZmZlcl9sZW4pOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJOIiBGX1BZX1NTSVpFX1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlMb25nX0Zyb21Wb2lkUHRyKGJ1ZmZlciksIGJ1ZmZlcl9sZW4pOwogfQogCiAKQEAgLTE5MSwyMCArMTkxLDIwIEBACiAgKi8KIAogc3RhdGljIFB5TWV0aG9kRGVmIG1vZHVsZV9tZXRob2RzW10gPSB7Ci0JeyJhZGRyZXNzX29mX2J1ZmZlciIsIG11bHRpcHJvY2Vzc2luZ19hZGRyZXNzX29mX2J1ZmZlciwgTUVUSF9PLCAKLQkgImFkZHJlc3Nfb2ZfYnVmZmVyKG9iaikgLT4gaW50XG4iIAotCSAiUmV0dXJuIGFkZHJlc3Mgb2Ygb2JqIGFzc3VtaW5nIG9iaiBzdXBwb3J0cyBidWZmZXIgaW50ZWZhY2UifSwKKyAgICB7ImFkZHJlc3Nfb2ZfYnVmZmVyIiwgbXVsdGlwcm9jZXNzaW5nX2FkZHJlc3Nfb2ZfYnVmZmVyLCBNRVRIX08sCisgICAgICJhZGRyZXNzX29mX2J1ZmZlcihvYmopIC0+IGludFxuIgorICAgICAiUmV0dXJuIGFkZHJlc3Mgb2Ygb2JqIGFzc3VtaW5nIG9iaiBzdXBwb3J0cyBidWZmZXIgaW50ZWZhY2UifSwKICNpZiBIQVZFX0ZEX1RSQU5TRkVSCi0JeyJzZW5kZmQiLCBtdWx0aXByb2Nlc3Npbmdfc2VuZGZkLCBNRVRIX1ZBUkFSR1MsIAotCSAic2VuZGZkKHNvY2tmZCwgZmQpIC0+IE5vbmVcbiIKLQkgIlNlbmQgZmlsZSBkZXNjcmlwdG9yIGdpdmVuIGJ5IGZkIG92ZXIgdGhlIHVuaXggZG9tYWluIHNvY2tldFxuIgotCSAid2hvc2UgZmlsZSBkZWNyaXB0b3IgaXMgc29ja2ZkIn0sCi0JeyJyZWN2ZmQiLCBtdWx0aXByb2Nlc3NpbmdfcmVjdmZkLCBNRVRIX1ZBUkFSR1MsCi0JICJyZWN2ZmQoc29ja2ZkKSAtPiBmZFxuIgotCSAiUmVjZWl2ZSBhIGZpbGUgZGVzY3JpcHRvciBvdmVyIGEgdW5peCBkb21haW4gc29ja2V0XG4iCi0JICJ3aG9zZSBmaWxlIGRlY3JpcHRvciBpcyBzb2NrZmQifSwKKyAgICB7InNlbmRmZCIsIG11bHRpcHJvY2Vzc2luZ19zZW5kZmQsIE1FVEhfVkFSQVJHUywKKyAgICAgInNlbmRmZChzb2NrZmQsIGZkKSAtPiBOb25lXG4iCisgICAgICJTZW5kIGZpbGUgZGVzY3JpcHRvciBnaXZlbiBieSBmZCBvdmVyIHRoZSB1bml4IGRvbWFpbiBzb2NrZXRcbiIKKyAgICAgIndob3NlIGZpbGUgZGVjcmlwdG9yIGlzIHNvY2tmZCJ9LAorICAgIHsicmVjdmZkIiwgbXVsdGlwcm9jZXNzaW5nX3JlY3ZmZCwgTUVUSF9WQVJBUkdTLAorICAgICAicmVjdmZkKHNvY2tmZCkgLT4gZmRcbiIKKyAgICAgIlJlY2VpdmUgYSBmaWxlIGRlc2NyaXB0b3Igb3ZlciBhIHVuaXggZG9tYWluIHNvY2tldFxuIgorICAgICAid2hvc2UgZmlsZSBkZWNyaXB0b3IgaXMgc29ja2ZkIn0sCiAjZW5kaWYKLQl7TlVMTH0KKyAgICB7TlVMTH0KIH07CiAKIApAQCAtMjE1LDk3ICsyMTUsOTcgQEAKIFB5TU9ESU5JVF9GVU5DCiBpbml0X211bHRpcHJvY2Vzc2luZyh2b2lkKQogewotCVB5T2JqZWN0ICptb2R1bGUsICp0ZW1wLCAqdmFsdWU7CisgICAgUHlPYmplY3QgKm1vZHVsZSwgKnRlbXAsICp2YWx1ZTsKIAotCS8qIEluaXRpYWxpemUgbW9kdWxlICovCi0JbW9kdWxlID0gUHlfSW5pdE1vZHVsZSgiX211bHRpcHJvY2Vzc2luZyIsIG1vZHVsZV9tZXRob2RzKTsKLQlpZiAoIW1vZHVsZSkKLQkJcmV0dXJuOworICAgIC8qIEluaXRpYWxpemUgbW9kdWxlICovCisgICAgbW9kdWxlID0gUHlfSW5pdE1vZHVsZSgiX211bHRpcHJvY2Vzc2luZyIsIG1vZHVsZV9tZXRob2RzKTsKKyAgICBpZiAoIW1vZHVsZSkKKyAgICAgICAgcmV0dXJuOwogCi0JLyogR2V0IGNvcHkgb2Ygb2JqZWN0cyBmcm9tIHBpY2tsZSAqLwotCXRlbXAgPSBQeUltcG9ydF9JbXBvcnRNb2R1bGUoUElDS0xFX01PRFVMRSk7Ci0JaWYgKCF0ZW1wKQotCQlyZXR1cm47Ci0JcGlja2xlX2R1bXBzID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyh0ZW1wLCAiZHVtcHMiKTsKLQlwaWNrbGVfbG9hZHMgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHRlbXAsICJsb2FkcyIpOwotCXBpY2tsZV9wcm90b2NvbCA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcodGVtcCwgIkhJR0hFU1RfUFJPVE9DT0wiKTsKLQlQeV9YREVDUkVGKHRlbXApOworICAgIC8qIEdldCBjb3B5IG9mIG9iamVjdHMgZnJvbSBwaWNrbGUgKi8KKyAgICB0ZW1wID0gUHlJbXBvcnRfSW1wb3J0TW9kdWxlKFBJQ0tMRV9NT0RVTEUpOworICAgIGlmICghdGVtcCkKKyAgICAgICAgcmV0dXJuOworICAgIHBpY2tsZV9kdW1wcyA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcodGVtcCwgImR1bXBzIik7CisgICAgcGlja2xlX2xvYWRzID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyh0ZW1wLCAibG9hZHMiKTsKKyAgICBwaWNrbGVfcHJvdG9jb2wgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHRlbXAsICJISUdIRVNUX1BST1RPQ09MIik7CisgICAgUHlfWERFQ1JFRih0ZW1wKTsKIAotCS8qIEdldCBjb3B5IG9mIEJ1ZmZlclRvb1Nob3J0ICovCi0JdGVtcCA9IFB5SW1wb3J0X0ltcG9ydE1vZHVsZSgibXVsdGlwcm9jZXNzaW5nIik7Ci0JaWYgKCF0ZW1wKQotCQlyZXR1cm47Ci0JQnVmZmVyVG9vU2hvcnQgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHRlbXAsICJCdWZmZXJUb29TaG9ydCIpOwotCVB5X1hERUNSRUYodGVtcCk7CisgICAgLyogR2V0IGNvcHkgb2YgQnVmZmVyVG9vU2hvcnQgKi8KKyAgICB0ZW1wID0gUHlJbXBvcnRfSW1wb3J0TW9kdWxlKCJtdWx0aXByb2Nlc3NpbmciKTsKKyAgICBpZiAoIXRlbXApCisgICAgICAgIHJldHVybjsKKyAgICBCdWZmZXJUb29TaG9ydCA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcodGVtcCwgIkJ1ZmZlclRvb1Nob3J0Iik7CisgICAgUHlfWERFQ1JFRih0ZW1wKTsKIAotCS8qIEFkZCBjb25uZWN0aW9uIHR5cGUgdG8gbW9kdWxlICovCi0JaWYgKFB5VHlwZV9SZWFkeSgmQ29ubmVjdGlvblR5cGUpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0lOQ1JFRigmQ29ubmVjdGlvblR5cGUpOwkKLQlQeU1vZHVsZV9BZGRPYmplY3QobW9kdWxlLCAiQ29ubmVjdGlvbiIsIChQeU9iamVjdCopJkNvbm5lY3Rpb25UeXBlKTsKKyAgICAvKiBBZGQgY29ubmVjdGlvbiB0eXBlIHRvIG1vZHVsZSAqLworICAgIGlmIChQeVR5cGVfUmVhZHkoJkNvbm5lY3Rpb25UeXBlKSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9JTkNSRUYoJkNvbm5lY3Rpb25UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobW9kdWxlLCAiQ29ubmVjdGlvbiIsIChQeU9iamVjdCopJkNvbm5lY3Rpb25UeXBlKTsKIAogI2lmIGRlZmluZWQoTVNfV0lORE9XUykgfHwgSEFWRV9TRU1fT1BFTgotCS8qIEFkZCBTZW1Mb2NrIHR5cGUgdG8gbW9kdWxlICovCi0JaWYgKFB5VHlwZV9SZWFkeSgmU2VtTG9ja1R5cGUpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0lOQ1JFRigmU2VtTG9ja1R5cGUpOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKFNlbUxvY2tUeXBlLnRwX2RpY3QsICJTRU1fVkFMVUVfTUFYIiwgCi0JCQkgICAgIFB5X0J1aWxkVmFsdWUoImkiLCBTRU1fVkFMVUVfTUFYKSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG1vZHVsZSwgIlNlbUxvY2siLCAoUHlPYmplY3QqKSZTZW1Mb2NrVHlwZSk7ICAgCisgICAgLyogQWRkIFNlbUxvY2sgdHlwZSB0byBtb2R1bGUgKi8KKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZTZW1Mb2NrVHlwZSkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfSU5DUkVGKCZTZW1Mb2NrVHlwZSk7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoU2VtTG9ja1R5cGUudHBfZGljdCwgIlNFTV9WQUxVRV9NQVgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5X0J1aWxkVmFsdWUoImkiLCBTRU1fVkFMVUVfTUFYKSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG1vZHVsZSwgIlNlbUxvY2siLCAoUHlPYmplY3QqKSZTZW1Mb2NrVHlwZSk7CiAjZW5kaWYKIAogI2lmZGVmIE1TX1dJTkRPV1MKLQkvKiBBZGQgUGlwZUNvbm5lY3Rpb24gdG8gbW9kdWxlICovCi0JaWYgKFB5VHlwZV9SZWFkeSgmUGlwZUNvbm5lY3Rpb25UeXBlKSA8IDApCi0JCXJldHVybjsKLQlQeV9JTkNSRUYoJlBpcGVDb25uZWN0aW9uVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG1vZHVsZSwgIlBpcGVDb25uZWN0aW9uIiwKLQkJCSAgIChQeU9iamVjdCopJlBpcGVDb25uZWN0aW9uVHlwZSk7CisgICAgLyogQWRkIFBpcGVDb25uZWN0aW9uIHRvIG1vZHVsZSAqLworICAgIGlmIChQeVR5cGVfUmVhZHkoJlBpcGVDb25uZWN0aW9uVHlwZSkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfSU5DUkVGKCZQaXBlQ29ubmVjdGlvblR5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtb2R1bGUsICJQaXBlQ29ubmVjdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgIChQeU9iamVjdCopJlBpcGVDb25uZWN0aW9uVHlwZSk7CiAKLQkvKiBJbml0aWFsaXplIHdpbjMyIGNsYXNzIGFuZCBhZGQgdG8gbXVsdGlwcm9jZXNzaW5nICovCi0JdGVtcCA9IGNyZWF0ZV93aW4zMl9uYW1lc3BhY2UoKTsKLQlpZiAoIXRlbXApCi0JCXJldHVybjsKLQlQeU1vZHVsZV9BZGRPYmplY3QobW9kdWxlLCAid2luMzIiLCB0ZW1wKTsKKyAgICAvKiBJbml0aWFsaXplIHdpbjMyIGNsYXNzIGFuZCBhZGQgdG8gbXVsdGlwcm9jZXNzaW5nICovCisgICAgdGVtcCA9IGNyZWF0ZV93aW4zMl9uYW1lc3BhY2UoKTsKKyAgICBpZiAoIXRlbXApCisgICAgICAgIHJldHVybjsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobW9kdWxlLCAid2luMzIiLCB0ZW1wKTsKIAotCS8qIEluaXRpYWxpemUgdGhlIGV2ZW50IGhhbmRsZSB1c2VkIHRvIHNpZ25hbCBDdHJsLUMgKi8KLQlzaWdpbnRfZXZlbnQgPSBDcmVhdGVFdmVudChOVUxMLCBUUlVFLCBGQUxTRSwgTlVMTCk7Ci0JaWYgKCFzaWdpbnRfZXZlbnQpIHsKLQkJUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnIoMCk7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKCFTZXRDb25zb2xlQ3RybEhhbmRsZXIoUHJvY2Vzc2luZ0N0cmxIYW5kbGVyLCBUUlVFKSkgewotCQlQeUVycl9TZXRGcm9tV2luZG93c0VycigwKTsKLQkJcmV0dXJuOwotCX0KKyAgICAvKiBJbml0aWFsaXplIHRoZSBldmVudCBoYW5kbGUgdXNlZCB0byBzaWduYWwgQ3RybC1DICovCisgICAgc2lnaW50X2V2ZW50ID0gQ3JlYXRlRXZlbnQoTlVMTCwgVFJVRSwgRkFMU0UsIE5VTEwpOworICAgIGlmICghc2lnaW50X2V2ZW50KSB7CisgICAgICAgIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyKDApOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmICghU2V0Q29uc29sZUN0cmxIYW5kbGVyKFByb2Nlc3NpbmdDdHJsSGFuZGxlciwgVFJVRSkpIHsKKyAgICAgICAgUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnIoMCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAjZW5kaWYKIAotCS8qIEFkZCBjb25maWd1cmF0aW9uIG1hY3JvcyAqLwotCXRlbXAgPSBQeURpY3RfTmV3KCk7Ci0JaWYgKCF0ZW1wKQotCQlyZXR1cm47Ci0jZGVmaW5lIEFERF9GTEFHKG5hbWUpCQkJCQkJICBcCi0JdmFsdWUgPSBQeV9CdWlsZFZhbHVlKCJpIiwgbmFtZSk7CQkJICBcCi0JaWYgKHZhbHVlID09IE5VTEwpIHsgUHlfREVDUkVGKHRlbXApOyByZXR1cm47IH0JCSAgXAotCWlmIChQeURpY3RfU2V0SXRlbVN0cmluZyh0ZW1wLCAjbmFtZSwgdmFsdWUpIDwgMCkgewkgIFwKLQkJUHlfREVDUkVGKHRlbXApOyBQeV9ERUNSRUYodmFsdWUpOyByZXR1cm47IH0JICBcCi0JUHlfREVDUkVGKHZhbHVlKQotCQorICAgIC8qIEFkZCBjb25maWd1cmF0aW9uIG1hY3JvcyAqLworICAgIHRlbXAgPSBQeURpY3RfTmV3KCk7CisgICAgaWYgKCF0ZW1wKQorICAgICAgICByZXR1cm47CisjZGVmaW5lIEFERF9GTEFHKG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdmFsdWUgPSBQeV9CdWlsZFZhbHVlKCJpIiwgbmFtZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKHZhbHVlID09IE5VTEwpIHsgUHlfREVDUkVGKHRlbXApOyByZXR1cm47IH0gICAgICAgICAgICAgICBcCisgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKHRlbXAsICNuYW1lLCB2YWx1ZSkgPCAwKSB7ICAgICAgICAgICBcCisgICAgICAgIFB5X0RFQ1JFRih0ZW1wKTsgUHlfREVDUkVGKHZhbHVlKTsgcmV0dXJuOyB9ICAgICAgICAgICAgICBcCisgICAgUHlfREVDUkVGKHZhbHVlKQorCiAjaWZkZWYgSEFWRV9TRU1fT1BFTgotCUFERF9GTEFHKEhBVkVfU0VNX09QRU4pOworICAgIEFERF9GTEFHKEhBVkVfU0VNX09QRU4pOwogI2VuZGlmCiAjaWZkZWYgSEFWRV9TRU1fVElNRURXQUlUCi0JQUREX0ZMQUcoSEFWRV9TRU1fVElNRURXQUlUKTsKKyAgICBBRERfRkxBRyhIQVZFX1NFTV9USU1FRFdBSVQpOwogI2VuZGlmCiAjaWZkZWYgSEFWRV9GRF9UUkFOU0ZFUgotCUFERF9GTEFHKEhBVkVfRkRfVFJBTlNGRVIpOworICAgIEFERF9GTEFHKEhBVkVfRkRfVFJBTlNGRVIpOwogI2VuZGlmCiAjaWZkZWYgSEFWRV9CUk9LRU5fU0VNX0dFVFZBTFVFCi0JQUREX0ZMQUcoSEFWRV9CUk9LRU5fU0VNX0dFVFZBTFVFKTsKKyAgICBBRERfRkxBRyhIQVZFX0JST0tFTl9TRU1fR0VUVkFMVUUpOwogI2VuZGlmCiAjaWZkZWYgSEFWRV9CUk9LRU5fU0VNX1VOTElOSwotCUFERF9GTEFHKEhBVkVfQlJPS0VOX1NFTV9VTkxJTkspOworICAgIEFERF9GTEFHKEhBVkVfQlJPS0VOX1NFTV9VTkxJTkspOwogI2VuZGlmCi0JaWYgKFB5TW9kdWxlX0FkZE9iamVjdChtb2R1bGUsICJmbGFncyIsIHRlbXApIDwgMCkKLQkJcmV0dXJuOworICAgIGlmIChQeU1vZHVsZV9BZGRPYmplY3QobW9kdWxlLCAiZmxhZ3MiLCB0ZW1wKSA8IDApCisgICAgICAgIHJldHVybjsKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvX211bHRpcHJvY2Vzc2luZy9waXBlX2Nvbm5lY3Rpb24uYyBiL01vZHVsZXMvX211bHRpcHJvY2Vzc2luZy9waXBlX2Nvbm5lY3Rpb24uYwppbmRleCAyN2U3OWRkLi5lZTU4MzZmIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19tdWx0aXByb2Nlc3NpbmcvcGlwZV9jb25uZWN0aW9uLmMKKysrIGIvTW9kdWxlcy9fbXVsdGlwcm9jZXNzaW5nL3BpcGVfY29ubmVjdGlvbi5jCkBAIC0xNywxMyArMTcsMTMgQEAKIHN0YXRpYyBQeV9zc2l6ZV90CiBjb25uX3NlbmRfc3RyaW5nKENvbm5lY3Rpb25PYmplY3QgKmNvbm4sIGNoYXIgKnN0cmluZywgc2l6ZV90IGxlbmd0aCkKIHsKLQlEV09SRCBhbW91bnRfd3JpdHRlbjsKLQlCT09MIHJldDsKKyAgICBEV09SRCBhbW91bnRfd3JpdHRlbjsKKyAgICBCT09MIHJldDsKIAotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlyZXQgPSBXcml0ZUZpbGUoY29ubi0+aGFuZGxlLCBzdHJpbmcsIGxlbmd0aCwgJmFtb3VudF93cml0dGVuLCBOVUxMKTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCXJldHVybiByZXQgPyBNUF9TVUNDRVNTIDogTVBfU1RBTkRBUkRfRVJST1I7CisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIHJldCA9IFdyaXRlRmlsZShjb25uLT5oYW5kbGUsIHN0cmluZywgbGVuZ3RoLCAmYW1vdW50X3dyaXR0ZW4sIE5VTEwpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgcmV0dXJuIHJldCA/IE1QX1NVQ0NFU1MgOiBNUF9TVEFOREFSRF9FUlJPUjsKIH0KIAogLyoKQEAgLTMzLDUwICszMyw1MCBAQAogICovCiAKIHN0YXRpYyBQeV9zc2l6ZV90Ci1jb25uX3JlY3Zfc3RyaW5nKENvbm5lY3Rpb25PYmplY3QgKmNvbm4sIGNoYXIgKmJ1ZmZlciwgCi0JCSBzaXplX3QgYnVmbGVuZ3RoLCBjaGFyICoqbmV3YnVmZmVyLCBzaXplX3QgbWF4bGVuZ3RoKQorY29ubl9yZWN2X3N0cmluZyhDb25uZWN0aW9uT2JqZWN0ICpjb25uLCBjaGFyICpidWZmZXIsCisgICAgICAgICAgICAgICAgIHNpemVfdCBidWZsZW5ndGgsIGNoYXIgKipuZXdidWZmZXIsIHNpemVfdCBtYXhsZW5ndGgpCiB7Ci0JRFdPUkQgbGVmdCwgbGVuZ3RoLCBmdWxsX2xlbmd0aCwgZXJyOwotCUJPT0wgcmV0OwotCSpuZXdidWZmZXIgPSBOVUxMOworICAgIERXT1JEIGxlZnQsIGxlbmd0aCwgZnVsbF9sZW5ndGgsIGVycjsKKyAgICBCT09MIHJldDsKKyAgICAqbmV3YnVmZmVyID0gTlVMTDsKIAotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlyZXQgPSBSZWFkRmlsZShjb25uLT5oYW5kbGUsIGJ1ZmZlciwgTUlOKGJ1Zmxlbmd0aCwgbWF4bGVuZ3RoKSwgCi0JCSAgICAgICZsZW5ndGgsIE5VTEwpOwotCVB5X0VORF9BTExPV19USFJFQURTCi0JaWYgKHJldCkKLQkJcmV0dXJuIGxlbmd0aDsKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgcmV0ID0gUmVhZEZpbGUoY29ubi0+aGFuZGxlLCBidWZmZXIsIE1JTihidWZsZW5ndGgsIG1heGxlbmd0aCksCisgICAgICAgICAgICAgICAgICAmbGVuZ3RoLCBOVUxMKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIGlmIChyZXQpCisgICAgICAgIHJldHVybiBsZW5ndGg7CiAKLQllcnIgPSBHZXRMYXN0RXJyb3IoKTsKLQlpZiAoZXJyICE9IEVSUk9SX01PUkVfREFUQSkgewotCQlpZiAoZXJyID09IEVSUk9SX0JST0tFTl9QSVBFKQotCQkJcmV0dXJuIE1QX0VORF9PRl9GSUxFOwotCQlyZXR1cm4gTVBfU1RBTkRBUkRfRVJST1I7Ci0JfQorICAgIGVyciA9IEdldExhc3RFcnJvcigpOworICAgIGlmIChlcnIgIT0gRVJST1JfTU9SRV9EQVRBKSB7CisgICAgICAgIGlmIChlcnIgPT0gRVJST1JfQlJPS0VOX1BJUEUpCisgICAgICAgICAgICByZXR1cm4gTVBfRU5EX09GX0ZJTEU7CisgICAgICAgIHJldHVybiBNUF9TVEFOREFSRF9FUlJPUjsKKyAgICB9CiAKLQlpZiAoIVBlZWtOYW1lZFBpcGUoY29ubi0+aGFuZGxlLCBOVUxMLCAwLCBOVUxMLCBOVUxMLCAmbGVmdCkpCi0JCXJldHVybiBNUF9TVEFOREFSRF9FUlJPUjsKKyAgICBpZiAoIVBlZWtOYW1lZFBpcGUoY29ubi0+aGFuZGxlLCBOVUxMLCAwLCBOVUxMLCBOVUxMLCAmbGVmdCkpCisgICAgICAgIHJldHVybiBNUF9TVEFOREFSRF9FUlJPUjsKIAotCWZ1bGxfbGVuZ3RoID0gbGVuZ3RoICsgbGVmdDsKLQlpZiAoZnVsbF9sZW5ndGggPiBtYXhsZW5ndGgpCi0JCXJldHVybiBNUF9CQURfTUVTU0FHRV9MRU5HVEg7CisgICAgZnVsbF9sZW5ndGggPSBsZW5ndGggKyBsZWZ0OworICAgIGlmIChmdWxsX2xlbmd0aCA+IG1heGxlbmd0aCkKKyAgICAgICAgcmV0dXJuIE1QX0JBRF9NRVNTQUdFX0xFTkdUSDsKIAotCSpuZXdidWZmZXIgPSBQeU1lbV9NYWxsb2MoZnVsbF9sZW5ndGgpOwotCWlmICgqbmV3YnVmZmVyID09IE5VTEwpCi0JCXJldHVybiBNUF9NRU1PUllfRVJST1I7CisgICAgKm5ld2J1ZmZlciA9IFB5TWVtX01hbGxvYyhmdWxsX2xlbmd0aCk7CisgICAgaWYgKCpuZXdidWZmZXIgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE1QX01FTU9SWV9FUlJPUjsKIAotCW1lbWNweSgqbmV3YnVmZmVyLCBidWZmZXIsIGxlbmd0aCk7CisgICAgbWVtY3B5KCpuZXdidWZmZXIsIGJ1ZmZlciwgbGVuZ3RoKTsKIAotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlyZXQgPSBSZWFkRmlsZShjb25uLT5oYW5kbGUsICpuZXdidWZmZXIrbGVuZ3RoLCBsZWZ0LCAmbGVuZ3RoLCBOVUxMKTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCWlmIChyZXQpIHsKLQkJYXNzZXJ0KGxlbmd0aCA9PSBsZWZ0KTsKLQkJcmV0dXJuIGZ1bGxfbGVuZ3RoOwotCX0gZWxzZSB7Ci0JCVB5TWVtX0ZyZWUoKm5ld2J1ZmZlcik7Ci0JCXJldHVybiBNUF9TVEFOREFSRF9FUlJPUjsKLQl9CisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIHJldCA9IFJlYWRGaWxlKGNvbm4tPmhhbmRsZSwgKm5ld2J1ZmZlcitsZW5ndGgsIGxlZnQsICZsZW5ndGgsIE5VTEwpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgaWYgKHJldCkgeworICAgICAgICBhc3NlcnQobGVuZ3RoID09IGxlZnQpOworICAgICAgICByZXR1cm4gZnVsbF9sZW5ndGg7CisgICAgfSBlbHNlIHsKKyAgICAgICAgUHlNZW1fRnJlZSgqbmV3YnVmZmVyKTsKKyAgICAgICAgcmV0dXJuIE1QX1NUQU5EQVJEX0VSUk9SOworICAgIH0KIH0KIAogLyoKQEAgLTg2LDUxICs4Niw1MSBAQAogc3RhdGljIGludAogY29ubl9wb2xsKENvbm5lY3Rpb25PYmplY3QgKmNvbm4sIGRvdWJsZSB0aW1lb3V0LCBQeVRocmVhZFN0YXRlICpfc2F2ZSkKIHsKLQlEV09SRCBieXRlcywgZGVhZGxpbmUsIGRlbGF5OwotCWludCBkaWZmZXJlbmNlLCByZXM7Ci0JQk9PTCBibG9jayA9IEZBTFNFOworICAgIERXT1JEIGJ5dGVzLCBkZWFkbGluZSwgZGVsYXk7CisgICAgaW50IGRpZmZlcmVuY2UsIHJlczsKKyAgICBCT09MIGJsb2NrID0gRkFMU0U7CiAKLQlpZiAoIVBlZWtOYW1lZFBpcGUoY29ubi0+aGFuZGxlLCBOVUxMLCAwLCBOVUxMLCAmYnl0ZXMsIE5VTEwpKQotCQlyZXR1cm4gTVBfU1RBTkRBUkRfRVJST1I7CisgICAgaWYgKCFQZWVrTmFtZWRQaXBlKGNvbm4tPmhhbmRsZSwgTlVMTCwgMCwgTlVMTCwgJmJ5dGVzLCBOVUxMKSkKKyAgICAgICAgcmV0dXJuIE1QX1NUQU5EQVJEX0VSUk9SOwogCi0JaWYgKHRpbWVvdXQgPT0gMC4wKQotCQlyZXR1cm4gYnl0ZXMgPiAwOworICAgIGlmICh0aW1lb3V0ID09IDAuMCkKKyAgICAgICAgcmV0dXJuIGJ5dGVzID4gMDsKIAotCWlmICh0aW1lb3V0IDwgMC4wKQotCQlibG9jayA9IFRSVUU7Ci0JZWxzZQotCQkvKiBYWFggZG9lcyBub3QgY2hlY2sgZm9yIG92ZXJmbG93ICovCi0JCWRlYWRsaW5lID0gR2V0VGlja0NvdW50KCkgKyAoRFdPUkQpKDEwMDAgKiB0aW1lb3V0ICsgMC41KTsKKyAgICBpZiAodGltZW91dCA8IDAuMCkKKyAgICAgICAgYmxvY2sgPSBUUlVFOworICAgIGVsc2UKKyAgICAgICAgLyogWFhYIGRvZXMgbm90IGNoZWNrIGZvciBvdmVyZmxvdyAqLworICAgICAgICBkZWFkbGluZSA9IEdldFRpY2tDb3VudCgpICsgKERXT1JEKSgxMDAwICogdGltZW91dCArIDAuNSk7CiAKLQlTbGVlcCgwKTsKKyAgICBTbGVlcCgwKTsKIAotCWZvciAoZGVsYXkgPSAxIDsgOyBkZWxheSArPSAxKSB7Ci0JCWlmICghUGVla05hbWVkUGlwZShjb25uLT5oYW5kbGUsIE5VTEwsIDAsIE5VTEwsICZieXRlcywgTlVMTCkpCi0JCQlyZXR1cm4gTVBfU1RBTkRBUkRfRVJST1I7Ci0JCWVsc2UgaWYgKGJ5dGVzID4gMCkKLQkJCXJldHVybiBUUlVFOworICAgIGZvciAoZGVsYXkgPSAxIDsgOyBkZWxheSArPSAxKSB7CisgICAgICAgIGlmICghUGVla05hbWVkUGlwZShjb25uLT5oYW5kbGUsIE5VTEwsIDAsIE5VTEwsICZieXRlcywgTlVMTCkpCisgICAgICAgICAgICByZXR1cm4gTVBfU1RBTkRBUkRfRVJST1I7CisgICAgICAgIGVsc2UgaWYgKGJ5dGVzID4gMCkKKyAgICAgICAgICAgIHJldHVybiBUUlVFOwogCi0JCWlmICghYmxvY2spIHsKLQkJCWRpZmZlcmVuY2UgPSBkZWFkbGluZSAtIEdldFRpY2tDb3VudCgpOwotCQkJaWYgKGRpZmZlcmVuY2UgPCAwKQotCQkJCXJldHVybiBGQUxTRTsKLQkJCWlmICgoaW50KWRlbGF5ID4gZGlmZmVyZW5jZSkKLQkJCQlkZWxheSA9IGRpZmZlcmVuY2U7Ci0JCX0KKyAgICAgICAgaWYgKCFibG9jaykgeworICAgICAgICAgICAgZGlmZmVyZW5jZSA9IGRlYWRsaW5lIC0gR2V0VGlja0NvdW50KCk7CisgICAgICAgICAgICBpZiAoZGlmZmVyZW5jZSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgaWYgKChpbnQpZGVsYXkgPiBkaWZmZXJlbmNlKQorICAgICAgICAgICAgICAgIGRlbGF5ID0gZGlmZmVyZW5jZTsKKyAgICAgICAgfQogCi0JCWlmIChkZWxheSA+IDIwKQotCQkJZGVsYXkgPSAyMDsKKyAgICAgICAgaWYgKGRlbGF5ID4gMjApCisgICAgICAgICAgICBkZWxheSA9IDIwOwogCi0JCVNsZWVwKGRlbGF5KTsKKyAgICAgICAgU2xlZXAoZGVsYXkpOwogCi0JCS8qIGNoZWNrIGZvciBzaWduYWxzICovCi0JCVB5X0JMT0NLX1RIUkVBRFMgCi0JCXJlcyA9IFB5RXJyX0NoZWNrU2lnbmFscygpOwotCQlQeV9VTkJMT0NLX1RIUkVBRFMKKyAgICAgICAgLyogY2hlY2sgZm9yIHNpZ25hbHMgKi8KKyAgICAgICAgUHlfQkxPQ0tfVEhSRUFEUworICAgICAgICByZXMgPSBQeUVycl9DaGVja1NpZ25hbHMoKTsKKyAgICAgICAgUHlfVU5CTE9DS19USFJFQURTCiAKLQkJaWYgKHJlcykKLQkJCXJldHVybiBNUF9FWENFUFRJT05fSEFTX0JFRU5fU0VUOwotCX0KKyAgICAgICAgaWYgKHJlcykKKyAgICAgICAgICAgIHJldHVybiBNUF9FWENFUFRJT05fSEFTX0JFRU5fU0VUOworICAgIH0KIH0KIAogLyoKZGlmZiAtLWdpdCBhL01vZHVsZXMvX211bHRpcHJvY2Vzc2luZy9zZW1hcGhvcmUuYyBiL01vZHVsZXMvX211bHRpcHJvY2Vzc2luZy9zZW1hcGhvcmUuYwppbmRleCAyYzJmYjEwZi4uMjYxZTY3YyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fbXVsdGlwcm9jZXNzaW5nL3NlbWFwaG9yZS5jCisrKyBiL01vZHVsZXMvX211bHRpcHJvY2Vzc2luZy9zZW1hcGhvcmUuYwpAQCAtMTEsMTIgKzExLDEyIEBACiBlbnVtIHsgUkVDVVJTSVZFX01VVEVYLCBTRU1BUEhPUkUgfTsKIAogdHlwZWRlZiBzdHJ1Y3QgewotCVB5T2JqZWN0X0hFQUQKLQlTRU1fSEFORExFIGhhbmRsZTsKLQlsb25nIGxhc3RfdGlkOwotCWludCBjb3VudDsKLQlpbnQgbWF4dmFsdWU7Ci0JaW50IGtpbmQ7CisgICAgUHlPYmplY3RfSEVBRAorICAgIFNFTV9IQU5ETEUgaGFuZGxlOworICAgIGxvbmcgbGFzdF90aWQ7CisgICAgaW50IGNvdW50OworICAgIGludCBtYXh2YWx1ZTsKKyAgICBpbnQga2luZDsKIH0gU2VtTG9ja09iamVjdDsKIAogI2RlZmluZSBJU01JTkUobykgKG8tPmNvdW50ID4gMCAmJiBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCkgPT0gby0+bGFzdF90aWQpCkBAIC00MCwxNDggKzQwLDE0OCBAQAogc3RhdGljIGludAogX0dldFNlbWFwaG9yZVZhbHVlKEhBTkRMRSBoYW5kbGUsIGxvbmcgKnZhbHVlKQogewotCWxvbmcgcHJldmlvdXM7CisgICAgbG9uZyBwcmV2aW91czsKIAotCXN3aXRjaCAoV2FpdEZvclNpbmdsZU9iamVjdChoYW5kbGUsIDApKSB7Ci0JY2FzZSBXQUlUX09CSkVDVF8wOgotCQlpZiAoIVJlbGVhc2VTZW1hcGhvcmUoaGFuZGxlLCAxLCAmcHJldmlvdXMpKQotCQkJcmV0dXJuIE1QX1NUQU5EQVJEX0VSUk9SOwotCQkqdmFsdWUgPSBwcmV2aW91cyArIDE7Ci0JCXJldHVybiAwOwotCWNhc2UgV0FJVF9USU1FT1VUOgotCQkqdmFsdWUgPSAwOwotCQlyZXR1cm4gMDsKLQlkZWZhdWx0OgotCQlyZXR1cm4gTVBfU1RBTkRBUkRfRVJST1I7Ci0JfQorICAgIHN3aXRjaCAoV2FpdEZvclNpbmdsZU9iamVjdChoYW5kbGUsIDApKSB7CisgICAgY2FzZSBXQUlUX09CSkVDVF8wOgorICAgICAgICBpZiAoIVJlbGVhc2VTZW1hcGhvcmUoaGFuZGxlLCAxLCAmcHJldmlvdXMpKQorICAgICAgICAgICAgcmV0dXJuIE1QX1NUQU5EQVJEX0VSUk9SOworICAgICAgICAqdmFsdWUgPSBwcmV2aW91cyArIDE7CisgICAgICAgIHJldHVybiAwOworICAgIGNhc2UgV0FJVF9USU1FT1VUOgorICAgICAgICAqdmFsdWUgPSAwOworICAgICAgICByZXR1cm4gMDsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gTVBfU1RBTkRBUkRfRVJST1I7CisgICAgfQogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc2VtbG9ja19hY3F1aXJlKFNlbUxvY2tPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlpbnQgYmxvY2tpbmcgPSAxOwotCWRvdWJsZSB0aW1lb3V0OwotCVB5T2JqZWN0ICp0aW1lb3V0X29iaiA9IFB5X05vbmU7Ci0JRFdPUkQgcmVzLCBmdWxsX21zZWNzLCBtc2Vjcywgc3RhcnQsIHRpY2tzOworICAgIGludCBibG9ja2luZyA9IDE7CisgICAgZG91YmxlIHRpbWVvdXQ7CisgICAgUHlPYmplY3QgKnRpbWVvdXRfb2JqID0gUHlfTm9uZTsKKyAgICBEV09SRCByZXMsIGZ1bGxfbXNlY3MsIG1zZWNzLCBzdGFydCwgdGlja3M7CiAKLQlzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7ImJsb2NrIiwgInRpbWVvdXQiLCBOVUxMfTsKKyAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7ImJsb2NrIiwgInRpbWVvdXQiLCBOVUxMfTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJ8aU8iLCBrd2xpc3QsCi0JCQkJCSAmYmxvY2tpbmcsICZ0aW1lb3V0X29iaikpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJ8aU8iLCBrd2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJsb2NraW5nLCAmdGltZW91dF9vYmopKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCS8qIGNhbGN1bGF0ZSB0aW1lb3V0ICovCi0JaWYgKCFibG9ja2luZykgewotCQlmdWxsX21zZWNzID0gMDsKLQl9IGVsc2UgaWYgKHRpbWVvdXRfb2JqID09IFB5X05vbmUpIHsKLQkJZnVsbF9tc2VjcyA9IElORklOSVRFOwotCX0gZWxzZSB7Ci0JCXRpbWVvdXQgPSBQeUZsb2F0X0FzRG91YmxlKHRpbWVvdXRfb2JqKTsKLQkJaWYgKFB5RXJyX09jY3VycmVkKCkpCi0JCQlyZXR1cm4gTlVMTDsKLQkJdGltZW91dCAqPSAxMDAwLjA7ICAgICAgLyogY29udmVydCB0byBtaWxsaXNlY3MgKi8KLQkJaWYgKHRpbWVvdXQgPCAwLjApIHsKLQkJCXRpbWVvdXQgPSAwLjA7Ci0JCX0gZWxzZSBpZiAodGltZW91dCA+PSAwLjUgKiBJTkZJTklURSkgeyAvKiAyNSBkYXlzICovCi0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJCQkJInRpbWVvdXQgaXMgdG9vIGxhcmdlIik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlmdWxsX21zZWNzID0gKERXT1JEKSh0aW1lb3V0ICsgMC41KTsKLQl9Ci0JCi0JLyogY2hlY2sgd2hldGhlciB3ZSBhbHJlYWR5IG93biB0aGUgbG9jayAqLwotCWlmIChzZWxmLT5raW5kID09IFJFQ1VSU0lWRV9NVVRFWCAmJiBJU01JTkUoc2VsZikpIHsKLQkJKytzZWxmLT5jb3VudDsKLQkJUHlfUkVUVVJOX1RSVUU7Ci0JfQorICAgIC8qIGNhbGN1bGF0ZSB0aW1lb3V0ICovCisgICAgaWYgKCFibG9ja2luZykgeworICAgICAgICBmdWxsX21zZWNzID0gMDsKKyAgICB9IGVsc2UgaWYgKHRpbWVvdXRfb2JqID09IFB5X05vbmUpIHsKKyAgICAgICAgZnVsbF9tc2VjcyA9IElORklOSVRFOworICAgIH0gZWxzZSB7CisgICAgICAgIHRpbWVvdXQgPSBQeUZsb2F0X0FzRG91YmxlKHRpbWVvdXRfb2JqKTsKKyAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgdGltZW91dCAqPSAxMDAwLjA7ICAgICAgLyogY29udmVydCB0byBtaWxsaXNlY3MgKi8KKyAgICAgICAgaWYgKHRpbWVvdXQgPCAwLjApIHsKKyAgICAgICAgICAgIHRpbWVvdXQgPSAwLjA7CisgICAgICAgIH0gZWxzZSBpZiAodGltZW91dCA+PSAwLjUgKiBJTkZJTklURSkgeyAvKiAyNSBkYXlzICovCisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGltZW91dCBpcyB0b28gbGFyZ2UiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGZ1bGxfbXNlY3MgPSAoRFdPUkQpKHRpbWVvdXQgKyAwLjUpOworICAgIH0KIAotCS8qIGNoZWNrIHdoZXRoZXIgd2UgY2FuIGFjcXVpcmUgd2l0aG91dCBibG9ja2luZyAqLwotCWlmIChXYWl0Rm9yU2luZ2xlT2JqZWN0KHNlbGYtPmhhbmRsZSwgMCkgPT0gV0FJVF9PQkpFQ1RfMCkgewotCQlzZWxmLT5sYXN0X3RpZCA9IEdldEN1cnJlbnRUaHJlYWRJZCgpOwotCQkrK3NlbGYtPmNvdW50OwotCQlQeV9SRVRVUk5fVFJVRTsKLQl9Ci0JCi0JbXNlY3MgPSBmdWxsX21zZWNzOwotCXN0YXJ0ID0gR2V0VGlja0NvdW50KCk7CisgICAgLyogY2hlY2sgd2hldGhlciB3ZSBhbHJlYWR5IG93biB0aGUgbG9jayAqLworICAgIGlmIChzZWxmLT5raW5kID09IFJFQ1VSU0lWRV9NVVRFWCAmJiBJU01JTkUoc2VsZikpIHsKKyAgICAgICAgKytzZWxmLT5jb3VudDsKKyAgICAgICAgUHlfUkVUVVJOX1RSVUU7CisgICAgfQogCi0JZm9yICggOyA7ICkgewotCQlIQU5ETEUgaGFuZGxlc1syXSA9IHtzZWxmLT5oYW5kbGUsIHNpZ2ludF9ldmVudH07Ci0JCQotCQkvKiBkbyB0aGUgd2FpdCAqLwotCQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JCVJlc2V0RXZlbnQoc2lnaW50X2V2ZW50KTsKLQkJcmVzID0gV2FpdEZvck11bHRpcGxlT2JqZWN0cygyLCBoYW5kbGVzLCBGQUxTRSwgbXNlY3MpOwotCQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCQkKLQkJLyogaGFuZGxlIHJlc3VsdCAqLwotCQlpZiAocmVzICE9IFdBSVRfT0JKRUNUXzAgKyAxKQotCQkJYnJlYWs7Ci0JCQotCQkvKiBnb3QgU0lHSU5UIHNvIGdpdmUgc2lnbmFsIGhhbmRsZXIgYSBjaGFuY2UgdG8gcnVuICovCi0JCVNsZWVwKDEpOwotCQkKLQkJLyogaWYgdGhpcyBpcyBtYWluIHRocmVhZCBsZXQgS2V5Ym9hcmRJbnRlcnJ1cHQgYmUgcmFpc2VkICovCi0JCWlmIChQeUVycl9DaGVja1NpZ25hbHMoKSkKLQkJCXJldHVybiBOVUxMOwotCQkKLQkJLyogcmVjYWxjdWxhdGUgdGltZW91dCAqLwotCQlpZiAobXNlY3MgIT0gSU5GSU5JVEUpIHsKLQkJCXRpY2tzID0gR2V0VGlja0NvdW50KCk7Ci0JCQlpZiAoKERXT1JEKSh0aWNrcyAtIHN0YXJ0KSA+PSBmdWxsX21zZWNzKQotCQkJCVB5X1JFVFVSTl9GQUxTRTsKLQkJCW1zZWNzID0gZnVsbF9tc2VjcyAtICh0aWNrcyAtIHN0YXJ0KTsKLQkJfQotCX0KLQkKLQkvKiBoYW5kbGUgcmVzdWx0ICovCi0Jc3dpdGNoIChyZXMpIHsKLQljYXNlIFdBSVRfVElNRU9VVDoKLQkJUHlfUkVUVVJOX0ZBTFNFOwotCWNhc2UgV0FJVF9PQkpFQ1RfMDoKLQkJc2VsZi0+bGFzdF90aWQgPSBHZXRDdXJyZW50VGhyZWFkSWQoKTsKLQkJKytzZWxmLT5jb3VudDsKLQkJUHlfUkVUVVJOX1RSVUU7Ci0JY2FzZSBXQUlUX0ZBSUxFRDoKLQkJcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyKDApOwotCWRlZmF1bHQ6Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19SdW50aW1lRXJyb3IsICJXYWl0Rm9yU2luZ2xlT2JqZWN0KCkgb3IgIgotCQkJICAgICAiV2FpdEZvck11bHRpcGxlT2JqZWN0cygpIGdhdmUgdW5yZWNvZ25pemVkICIKLQkJCSAgICAgInZhbHVlICVkIiwgcmVzKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIC8qIGNoZWNrIHdoZXRoZXIgd2UgY2FuIGFjcXVpcmUgd2l0aG91dCBibG9ja2luZyAqLworICAgIGlmIChXYWl0Rm9yU2luZ2xlT2JqZWN0KHNlbGYtPmhhbmRsZSwgMCkgPT0gV0FJVF9PQkpFQ1RfMCkgeworICAgICAgICBzZWxmLT5sYXN0X3RpZCA9IEdldEN1cnJlbnRUaHJlYWRJZCgpOworICAgICAgICArK3NlbGYtPmNvdW50OworICAgICAgICBQeV9SRVRVUk5fVFJVRTsKKyAgICB9CisKKyAgICBtc2VjcyA9IGZ1bGxfbXNlY3M7CisgICAgc3RhcnQgPSBHZXRUaWNrQ291bnQoKTsKKworICAgIGZvciAoIDsgOyApIHsKKyAgICAgICAgSEFORExFIGhhbmRsZXNbMl0gPSB7c2VsZi0+aGFuZGxlLCBzaWdpbnRfZXZlbnR9OworCisgICAgICAgIC8qIGRvIHRoZSB3YWl0ICovCisgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgUmVzZXRFdmVudChzaWdpbnRfZXZlbnQpOworICAgICAgICByZXMgPSBXYWl0Rm9yTXVsdGlwbGVPYmplY3RzKDIsIGhhbmRsZXMsIEZBTFNFLCBtc2Vjcyk7CisgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisKKyAgICAgICAgLyogaGFuZGxlIHJlc3VsdCAqLworICAgICAgICBpZiAocmVzICE9IFdBSVRfT0JKRUNUXzAgKyAxKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLyogZ290IFNJR0lOVCBzbyBnaXZlIHNpZ25hbCBoYW5kbGVyIGEgY2hhbmNlIHRvIHJ1biAqLworICAgICAgICBTbGVlcCgxKTsKKworICAgICAgICAvKiBpZiB0aGlzIGlzIG1haW4gdGhyZWFkIGxldCBLZXlib2FyZEludGVycnVwdCBiZSByYWlzZWQgKi8KKyAgICAgICAgaWYgKFB5RXJyX0NoZWNrU2lnbmFscygpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICAgICAgLyogcmVjYWxjdWxhdGUgdGltZW91dCAqLworICAgICAgICBpZiAobXNlY3MgIT0gSU5GSU5JVEUpIHsKKyAgICAgICAgICAgIHRpY2tzID0gR2V0VGlja0NvdW50KCk7CisgICAgICAgICAgICBpZiAoKERXT1JEKSh0aWNrcyAtIHN0YXJ0KSA+PSBmdWxsX21zZWNzKQorICAgICAgICAgICAgICAgIFB5X1JFVFVSTl9GQUxTRTsKKyAgICAgICAgICAgIG1zZWNzID0gZnVsbF9tc2VjcyAtICh0aWNrcyAtIHN0YXJ0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGhhbmRsZSByZXN1bHQgKi8KKyAgICBzd2l0Y2ggKHJlcykgeworICAgIGNhc2UgV0FJVF9USU1FT1VUOgorICAgICAgICBQeV9SRVRVUk5fRkFMU0U7CisgICAgY2FzZSBXQUlUX09CSkVDVF8wOgorICAgICAgICBzZWxmLT5sYXN0X3RpZCA9IEdldEN1cnJlbnRUaHJlYWRJZCgpOworICAgICAgICArK3NlbGYtPmNvdW50OworICAgICAgICBQeV9SRVRVUk5fVFJVRTsKKyAgICBjYXNlIFdBSVRfRkFJTEVEOgorICAgICAgICByZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnIoMCk7CisgICAgZGVmYXVsdDoKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1J1bnRpbWVFcnJvciwgIldhaXRGb3JTaW5nbGVPYmplY3QoKSBvciAiCisgICAgICAgICAgICAgICAgICAgICAiV2FpdEZvck11bHRpcGxlT2JqZWN0cygpIGdhdmUgdW5yZWNvZ25pemVkICIKKyAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSAlZCIsIHJlcyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNlbWxvY2tfcmVsZWFzZShTZW1Mb2NrT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpZiAoc2VsZi0+a2luZCA9PSBSRUNVUlNJVkVfTVVURVgpIHsKLQkJaWYgKCFJU01JTkUoc2VsZikpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19Bc3NlcnRpb25FcnJvciwgImF0dGVtcHQgdG8gIgotCQkJCQkicmVsZWFzZSByZWN1cnNpdmUgbG9jayBub3Qgb3duZWQgIgotCQkJCQkiYnkgdGhyZWFkIik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlpZiAoc2VsZi0+Y291bnQgPiAxKSB7Ci0JCQktLXNlbGYtPmNvdW50OwotCQkJUHlfUkVUVVJOX05PTkU7Ci0JCX0KLQkJYXNzZXJ0KHNlbGYtPmNvdW50ID09IDEpOwotCX0KKyAgICBpZiAoc2VsZi0+a2luZCA9PSBSRUNVUlNJVkVfTVVURVgpIHsKKyAgICAgICAgaWYgKCFJU01JTkUoc2VsZikpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19Bc3NlcnRpb25FcnJvciwgImF0dGVtcHQgdG8gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWxlYXNlIHJlY3Vyc2l2ZSBsb2NrIG5vdCBvd25lZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ5IHRocmVhZCIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNlbGYtPmNvdW50ID4gMSkgeworICAgICAgICAgICAgLS1zZWxmLT5jb3VudDsKKyAgICAgICAgICAgIFB5X1JFVFVSTl9OT05FOworICAgICAgICB9CisgICAgICAgIGFzc2VydChzZWxmLT5jb3VudCA9PSAxKTsKKyAgICB9CiAKLQlpZiAoIVJlbGVhc2VTZW1hcGhvcmUoc2VsZi0+aGFuZGxlLCAxLCBOVUxMKSkgewotCQlpZiAoR2V0TGFzdEVycm9yKCkgPT0gRVJST1JfVE9PX01BTllfUE9TVFMpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAic2VtYXBob3JlIG9yIGxvY2sgIgotCQkJCQkicmVsZWFzZWQgdG9vIG1hbnkgdGltZXMiKTsKLQkJCXJldHVybiBOVUxMOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyKDApOwotCQl9Ci0JfQorICAgIGlmICghUmVsZWFzZVNlbWFwaG9yZShzZWxmLT5oYW5kbGUsIDEsIE5VTEwpKSB7CisgICAgICAgIGlmIChHZXRMYXN0RXJyb3IoKSA9PSBFUlJPUl9UT09fTUFOWV9QT1NUUykgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJzZW1hcGhvcmUgb3IgbG9jayAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlbGVhc2VkIHRvbyBtYW55IHRpbWVzIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0VycigwKTsKKyAgICAgICAgfQorICAgIH0KIAotCS0tc2VsZi0+Y291bnQ7Ci0JUHlfUkVUVVJOX05PTkU7CisgICAgLS1zZWxmLT5jb3VudDsKKyAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAogI2Vsc2UgLyogIU1TX1dJTkRPV1MgKi8KQEAgLTIwNyw1OSArMjA3LDU5IEBACiBpbnQKIHNlbV90aW1lZHdhaXRfc2F2ZShzZW1fdCAqc2VtLCBzdHJ1Y3QgdGltZXNwZWMgKmRlYWRsaW5lLCBQeVRocmVhZFN0YXRlICpfc2F2ZSkKIHsKLQlpbnQgcmVzOwotCXVuc2lnbmVkIGxvbmcgZGVsYXksIGRpZmZlcmVuY2U7Ci0Jc3RydWN0IHRpbWV2YWwgbm93LCB0dmRlYWRsaW5lLCB0dmRlbGF5OworICAgIGludCByZXM7CisgICAgdW5zaWduZWQgbG9uZyBkZWxheSwgZGlmZmVyZW5jZTsKKyAgICBzdHJ1Y3QgdGltZXZhbCBub3csIHR2ZGVhZGxpbmUsIHR2ZGVsYXk7CiAKLQllcnJubyA9IDA7Ci0JdHZkZWFkbGluZS50dl9zZWMgPSBkZWFkbGluZS0+dHZfc2VjOwotCXR2ZGVhZGxpbmUudHZfdXNlYyA9IGRlYWRsaW5lLT50dl9uc2VjIC8gMTAwMDsKKyAgICBlcnJubyA9IDA7CisgICAgdHZkZWFkbGluZS50dl9zZWMgPSBkZWFkbGluZS0+dHZfc2VjOworICAgIHR2ZGVhZGxpbmUudHZfdXNlYyA9IGRlYWRsaW5lLT50dl9uc2VjIC8gMTAwMDsKIAotCWZvciAoZGVsYXkgPSAwIDsgOyBkZWxheSArPSAxMDAwKSB7Ci0JCS8qIHBvbGwgKi8KLQkJaWYgKHNlbV90cnl3YWl0KHNlbSkgPT0gMCkKLQkJCXJldHVybiAwOwotCQllbHNlIGlmIChlcnJubyAhPSBFQUdBSU4pCi0JCQlyZXR1cm4gTVBfU1RBTkRBUkRfRVJST1I7CisgICAgZm9yIChkZWxheSA9IDAgOyA7IGRlbGF5ICs9IDEwMDApIHsKKyAgICAgICAgLyogcG9sbCAqLworICAgICAgICBpZiAoc2VtX3RyeXdhaXQoc2VtKSA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGVsc2UgaWYgKGVycm5vICE9IEVBR0FJTikKKyAgICAgICAgICAgIHJldHVybiBNUF9TVEFOREFSRF9FUlJPUjsKIAotCQkvKiBnZXQgY3VycmVudCB0aW1lICovCi0JCWlmIChnZXR0aW1lb2ZkYXkoJm5vdywgTlVMTCkgPCAwKQotCQkJcmV0dXJuIE1QX1NUQU5EQVJEX0VSUk9SOworICAgICAgICAvKiBnZXQgY3VycmVudCB0aW1lICovCisgICAgICAgIGlmIChnZXR0aW1lb2ZkYXkoJm5vdywgTlVMTCkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIE1QX1NUQU5EQVJEX0VSUk9SOwogCi0JCS8qIGNoZWNrIGZvciB0aW1lb3V0ICovCi0JCWlmICh0dmRlYWRsaW5lLnR2X3NlYyA8IG5vdy50dl9zZWMgfHwgCi0JCSAgICAodHZkZWFkbGluZS50dl9zZWMgPT0gbm93LnR2X3NlYyAmJiAKLQkJICAgICB0dmRlYWRsaW5lLnR2X3VzZWMgPD0gbm93LnR2X3VzZWMpKSB7Ci0JCQllcnJubyA9IEVUSU1FRE9VVDsKLQkJCXJldHVybiBNUF9TVEFOREFSRF9FUlJPUjsKLQkJfQorICAgICAgICAvKiBjaGVjayBmb3IgdGltZW91dCAqLworICAgICAgICBpZiAodHZkZWFkbGluZS50dl9zZWMgPCBub3cudHZfc2VjIHx8CisgICAgICAgICAgICAodHZkZWFkbGluZS50dl9zZWMgPT0gbm93LnR2X3NlYyAmJgorICAgICAgICAgICAgIHR2ZGVhZGxpbmUudHZfdXNlYyA8PSBub3cudHZfdXNlYykpIHsKKyAgICAgICAgICAgIGVycm5vID0gRVRJTUVET1VUOworICAgICAgICAgICAgcmV0dXJuIE1QX1NUQU5EQVJEX0VSUk9SOworICAgICAgICB9CiAKLQkJLyogY2FsY3VsYXRlIGhvdyBtdWNoIHRpbWUgaXMgbGVmdCAqLwotCQlkaWZmZXJlbmNlID0gKHR2ZGVhZGxpbmUudHZfc2VjIC0gbm93LnR2X3NlYykgKiAxMDAwMDAwICsgCi0JCQkodHZkZWFkbGluZS50dl91c2VjIC0gbm93LnR2X3VzZWMpOworICAgICAgICAvKiBjYWxjdWxhdGUgaG93IG11Y2ggdGltZSBpcyBsZWZ0ICovCisgICAgICAgIGRpZmZlcmVuY2UgPSAodHZkZWFkbGluZS50dl9zZWMgLSBub3cudHZfc2VjKSAqIDEwMDAwMDAgKworICAgICAgICAgICAgKHR2ZGVhZGxpbmUudHZfdXNlYyAtIG5vdy50dl91c2VjKTsKIAotCQkvKiBjaGVjayBkZWxheSBub3QgdG9vIGxvbmcgLS0gbWF4aW11bSBpcyAyMCBtc2VjcyAqLwotCQlpZiAoZGVsYXkgPiAyMDAwMCkKLQkJCWRlbGF5ID0gMjAwMDA7Ci0JCWlmIChkZWxheSA+IGRpZmZlcmVuY2UpCi0JCQlkZWxheSA9IGRpZmZlcmVuY2U7CisgICAgICAgIC8qIGNoZWNrIGRlbGF5IG5vdCB0b28gbG9uZyAtLSBtYXhpbXVtIGlzIDIwIG1zZWNzICovCisgICAgICAgIGlmIChkZWxheSA+IDIwMDAwKQorICAgICAgICAgICAgZGVsYXkgPSAyMDAwMDsKKyAgICAgICAgaWYgKGRlbGF5ID4gZGlmZmVyZW5jZSkKKyAgICAgICAgICAgIGRlbGF5ID0gZGlmZmVyZW5jZTsKIAotCQkvKiBzbGVlcCAqLwotCQl0dmRlbGF5LnR2X3NlYyA9IGRlbGF5IC8gMTAwMDAwMDsKLQkJdHZkZWxheS50dl91c2VjID0gZGVsYXkgJSAxMDAwMDAwOwotCQlpZiAoc2VsZWN0KDAsIE5VTEwsIE5VTEwsIE5VTEwsICZ0dmRlbGF5KSA8IDApCi0JCQlyZXR1cm4gTVBfU1RBTkRBUkRfRVJST1I7CisgICAgICAgIC8qIHNsZWVwICovCisgICAgICAgIHR2ZGVsYXkudHZfc2VjID0gZGVsYXkgLyAxMDAwMDAwOworICAgICAgICB0dmRlbGF5LnR2X3VzZWMgPSBkZWxheSAlIDEwMDAwMDA7CisgICAgICAgIGlmIChzZWxlY3QoMCwgTlVMTCwgTlVMTCwgTlVMTCwgJnR2ZGVsYXkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBNUF9TVEFOREFSRF9FUlJPUjsKIAotCQkvKiBjaGVjayBmb3Igc2lnbmFscyAqLwotCQlQeV9CTE9DS19USFJFQURTIAotCQlyZXMgPSBQeUVycl9DaGVja1NpZ25hbHMoKTsKLQkJUHlfVU5CTE9DS19USFJFQURTCisgICAgICAgIC8qIGNoZWNrIGZvciBzaWduYWxzICovCisgICAgICAgIFB5X0JMT0NLX1RIUkVBRFMKKyAgICAgICAgcmVzID0gUHlFcnJfQ2hlY2tTaWduYWxzKCk7CisgICAgICAgIFB5X1VOQkxPQ0tfVEhSRUFEUwogCi0JCWlmIChyZXMpIHsKLQkJCWVycm5vID0gRUlOVFI7Ci0JCQlyZXR1cm4gTVBfRVhDRVBUSU9OX0hBU19CRUVOX1NFVDsKLQkJfQotCX0KKyAgICAgICAgaWYgKHJlcykgeworICAgICAgICAgICAgZXJybm8gPSBFSU5UUjsKKyAgICAgICAgICAgIHJldHVybiBNUF9FWENFUFRJT05fSEFTX0JFRU5fU0VUOworICAgICAgICB9CisgICAgfQogfQogCiAjZW5kaWYgLyogIUhBVkVfU0VNX1RJTUVEV0FJVCAqLwpAQCAtMjY3LDEyOSArMjY3LDEyOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNlbWxvY2tfYWNxdWlyZShTZW1Mb2NrT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JaW50IGJsb2NraW5nID0gMSwgcmVzOwotCWRvdWJsZSB0aW1lb3V0OwotCVB5T2JqZWN0ICp0aW1lb3V0X29iaiA9IFB5X05vbmU7Ci0Jc3RydWN0IHRpbWVzcGVjIGRlYWRsaW5lID0gezB9OwotCXN0cnVjdCB0aW1ldmFsIG5vdzsKLQlsb25nIHNlYywgbnNlYzsKKyAgICBpbnQgYmxvY2tpbmcgPSAxLCByZXM7CisgICAgZG91YmxlIHRpbWVvdXQ7CisgICAgUHlPYmplY3QgKnRpbWVvdXRfb2JqID0gUHlfTm9uZTsKKyAgICBzdHJ1Y3QgdGltZXNwZWMgZGVhZGxpbmUgPSB7MH07CisgICAgc3RydWN0IHRpbWV2YWwgbm93OworICAgIGxvbmcgc2VjLCBuc2VjOwogCi0Jc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJibG9jayIsICJ0aW1lb3V0IiwgTlVMTH07CisgICAgc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJibG9jayIsICJ0aW1lb3V0IiwgTlVMTH07CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAifGlPIiwga3dsaXN0LAotCQkJCQkgJmJsb2NraW5nLCAmdGltZW91dF9vYmopKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAifGlPIiwga3dsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZibG9ja2luZywgJnRpbWVvdXRfb2JqKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoc2VsZi0+a2luZCA9PSBSRUNVUlNJVkVfTVVURVggJiYgSVNNSU5FKHNlbGYpKSB7Ci0JCSsrc2VsZi0+Y291bnQ7Ci0JCVB5X1JFVFVSTl9UUlVFOwotCX0KKyAgICBpZiAoc2VsZi0+a2luZCA9PSBSRUNVUlNJVkVfTVVURVggJiYgSVNNSU5FKHNlbGYpKSB7CisgICAgICAgICsrc2VsZi0+Y291bnQ7CisgICAgICAgIFB5X1JFVFVSTl9UUlVFOworICAgIH0KIAotCWlmICh0aW1lb3V0X29iaiAhPSBQeV9Ob25lKSB7Ci0JCXRpbWVvdXQgPSBQeUZsb2F0X0FzRG91YmxlKHRpbWVvdXRfb2JqKTsKLQkJaWYgKFB5RXJyX09jY3VycmVkKCkpCi0JCQlyZXR1cm4gTlVMTDsKLQkJaWYgKHRpbWVvdXQgPCAwLjApCi0JCQl0aW1lb3V0ID0gMC4wOworICAgIGlmICh0aW1lb3V0X29iaiAhPSBQeV9Ob25lKSB7CisgICAgICAgIHRpbWVvdXQgPSBQeUZsb2F0X0FzRG91YmxlKHRpbWVvdXRfb2JqKTsKKyAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKHRpbWVvdXQgPCAwLjApCisgICAgICAgICAgICB0aW1lb3V0ID0gMC4wOwogCi0JCWlmIChnZXR0aW1lb2ZkYXkoJm5vdywgTlVMTCkgPCAwKSB7Ci0JCQlQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfT1NFcnJvcik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlzZWMgPSAobG9uZykgdGltZW91dDsKLQkJbnNlYyA9IChsb25nKSAoMWU5ICogKHRpbWVvdXQgLSBzZWMpICsgMC41KTsKLQkJZGVhZGxpbmUudHZfc2VjID0gbm93LnR2X3NlYyArIHNlYzsKLQkJZGVhZGxpbmUudHZfbnNlYyA9IG5vdy50dl91c2VjICogMTAwMCArIG5zZWM7Ci0JCWRlYWRsaW5lLnR2X3NlYyArPSAoZGVhZGxpbmUudHZfbnNlYyAvIDEwMDAwMDAwMDApOwotCQlkZWFkbGluZS50dl9uc2VjICU9IDEwMDAwMDAwMDA7Ci0JfQorICAgICAgICBpZiAoZ2V0dGltZW9mZGF5KCZub3csIE5VTEwpIDwgMCkgeworICAgICAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX09TRXJyb3IpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgc2VjID0gKGxvbmcpIHRpbWVvdXQ7CisgICAgICAgIG5zZWMgPSAobG9uZykgKDFlOSAqICh0aW1lb3V0IC0gc2VjKSArIDAuNSk7CisgICAgICAgIGRlYWRsaW5lLnR2X3NlYyA9IG5vdy50dl9zZWMgKyBzZWM7CisgICAgICAgIGRlYWRsaW5lLnR2X25zZWMgPSBub3cudHZfdXNlYyAqIDEwMDAgKyBuc2VjOworICAgICAgICBkZWFkbGluZS50dl9zZWMgKz0gKGRlYWRsaW5lLnR2X25zZWMgLyAxMDAwMDAwMDAwKTsKKyAgICAgICAgZGVhZGxpbmUudHZfbnNlYyAlPSAxMDAwMDAwMDAwOworICAgIH0KIAotCWRvIHsKLQkJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCQlpZiAoYmxvY2tpbmcgJiYgdGltZW91dF9vYmogPT0gUHlfTm9uZSkKLQkJCXJlcyA9IHNlbV93YWl0KHNlbGYtPmhhbmRsZSk7Ci0JCWVsc2UgaWYgKCFibG9ja2luZykKLQkJCXJlcyA9IHNlbV90cnl3YWl0KHNlbGYtPmhhbmRsZSk7Ci0JCWVsc2UKLQkJCXJlcyA9IHNlbV90aW1lZHdhaXQoc2VsZi0+aGFuZGxlLCAmZGVhZGxpbmUpOwotCQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCQlpZiAocmVzID09IE1QX0VYQ0VQVElPTl9IQVNfQkVFTl9TRVQpCi0JCQlicmVhazsKLQl9IHdoaWxlIChyZXMgPCAwICYmIGVycm5vID09IEVJTlRSICYmICFQeUVycl9DaGVja1NpZ25hbHMoKSk7CisgICAgZG8geworICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgICAgIGlmIChibG9ja2luZyAmJiB0aW1lb3V0X29iaiA9PSBQeV9Ob25lKQorICAgICAgICAgICAgcmVzID0gc2VtX3dhaXQoc2VsZi0+aGFuZGxlKTsKKyAgICAgICAgZWxzZSBpZiAoIWJsb2NraW5nKQorICAgICAgICAgICAgcmVzID0gc2VtX3RyeXdhaXQoc2VsZi0+aGFuZGxlKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmVzID0gc2VtX3RpbWVkd2FpdChzZWxmLT5oYW5kbGUsICZkZWFkbGluZSk7CisgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgICAgIGlmIChyZXMgPT0gTVBfRVhDRVBUSU9OX0hBU19CRUVOX1NFVCkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0gd2hpbGUgKHJlcyA8IDAgJiYgZXJybm8gPT0gRUlOVFIgJiYgIVB5RXJyX0NoZWNrU2lnbmFscygpKTsKIAotCWlmIChyZXMgPCAwKSB7Ci0JCWlmIChlcnJubyA9PSBFQUdBSU4gfHwgZXJybm8gPT0gRVRJTUVET1VUKQotCQkJUHlfUkVUVVJOX0ZBTFNFOwotCQllbHNlIGlmIChlcnJubyA9PSBFSU5UUikKLQkJCXJldHVybiBOVUxMOwotCQllbHNlCi0JCQlyZXR1cm4gUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX09TRXJyb3IpOwotCX0KKyAgICBpZiAocmVzIDwgMCkgeworICAgICAgICBpZiAoZXJybm8gPT0gRUFHQUlOIHx8IGVycm5vID09IEVUSU1FRE9VVCkKKyAgICAgICAgICAgIFB5X1JFVFVSTl9GQUxTRTsKKyAgICAgICAgZWxzZSBpZiAoZXJybm8gPT0gRUlOVFIpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19PU0Vycm9yKTsKKyAgICB9CiAKLQkrK3NlbGYtPmNvdW50OwotCXNlbGYtPmxhc3RfdGlkID0gUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpOworICAgICsrc2VsZi0+Y291bnQ7CisgICAgc2VsZi0+bGFzdF90aWQgPSBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCk7CiAKLQlQeV9SRVRVUk5fVFJVRTsKKyAgICBQeV9SRVRVUk5fVFJVRTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNlbWxvY2tfcmVsZWFzZShTZW1Mb2NrT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpZiAoc2VsZi0+a2luZCA9PSBSRUNVUlNJVkVfTVVURVgpIHsKLQkJaWYgKCFJU01JTkUoc2VsZikpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19Bc3NlcnRpb25FcnJvciwgImF0dGVtcHQgdG8gIgotCQkJCQkicmVsZWFzZSByZWN1cnNpdmUgbG9jayBub3Qgb3duZWQgIgotCQkJCQkiYnkgdGhyZWFkIik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlpZiAoc2VsZi0+Y291bnQgPiAxKSB7Ci0JCQktLXNlbGYtPmNvdW50OwotCQkJUHlfUkVUVVJOX05PTkU7Ci0JCX0KLQkJYXNzZXJ0KHNlbGYtPmNvdW50ID09IDEpOwotCX0gZWxzZSB7CisgICAgaWYgKHNlbGYtPmtpbmQgPT0gUkVDVVJTSVZFX01VVEVYKSB7CisgICAgICAgIGlmICghSVNNSU5FKHNlbGYpKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfQXNzZXJ0aW9uRXJyb3IsICJhdHRlbXB0IHRvICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVsZWFzZSByZWN1cnNpdmUgbG9jayBub3Qgb3duZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJieSB0aHJlYWQiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGlmIChzZWxmLT5jb3VudCA+IDEpIHsKKyAgICAgICAgICAgIC0tc2VsZi0+Y291bnQ7CisgICAgICAgICAgICBQeV9SRVRVUk5fTk9ORTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnQoc2VsZi0+Y291bnQgPT0gMSk7CisgICAgfSBlbHNlIHsKICNpZiBIQVZFX0JST0tFTl9TRU1fR0VUVkFMVUUKLQkJLyogV2Ugd2lsbCBvbmx5IGNoZWNrIHByb3Blcmx5IHRoZSBtYXh2YWx1ZSA9PSAxIGNhc2UgKi8KLQkJaWYgKHNlbGYtPm1heHZhbHVlID09IDEpIHsKLQkJCS8qIG1ha2Ugc3VyZSB0aGF0IGFscmVhZHkgbG9ja2VkICovCi0JCQlpZiAoc2VtX3RyeXdhaXQoc2VsZi0+aGFuZGxlKSA8IDApIHsKLQkJCQlpZiAoZXJybm8gIT0gRUFHQUlOKSB7Ci0JCQkJCVB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19PU0Vycm9yKTsKLQkJCQkJcmV0dXJuIE5VTEw7Ci0JCQkJfQotCQkJCS8qIGl0IGlzIGFscmVhZHkgbG9ja2VkIGFzIGV4cGVjdGVkICovCi0JCQl9IGVsc2UgewotCQkJCS8qIGl0IHdhcyBub3QgbG9ja2VkIHNvIHVuZG8gd2FpdCBhbmQgcmFpc2UgICovCi0JCQkJaWYgKHNlbV9wb3N0KHNlbGYtPmhhbmRsZSkgPCAwKSB7Ci0JCQkJCVB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19PU0Vycm9yKTsKLQkJCQkJcmV0dXJuIE5VTEw7Ci0JCQkJfQotCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAic2VtYXBob3JlICIKLQkJCQkJCSJvciBsb2NrIHJlbGVhc2VkIHRvbyBtYW55ICIKLQkJCQkJCSJ0aW1lcyIpOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQl9CisgICAgICAgIC8qIFdlIHdpbGwgb25seSBjaGVjayBwcm9wZXJseSB0aGUgbWF4dmFsdWUgPT0gMSBjYXNlICovCisgICAgICAgIGlmIChzZWxmLT5tYXh2YWx1ZSA9PSAxKSB7CisgICAgICAgICAgICAvKiBtYWtlIHN1cmUgdGhhdCBhbHJlYWR5IGxvY2tlZCAqLworICAgICAgICAgICAgaWYgKHNlbV90cnl3YWl0KHNlbGYtPmhhbmRsZSkgPCAwKSB7CisgICAgICAgICAgICAgICAgaWYgKGVycm5vICE9IEVBR0FJTikgeworICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfT1NFcnJvcik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvKiBpdCBpcyBhbHJlYWR5IGxvY2tlZCBhcyBleHBlY3RlZCAqLworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBpdCB3YXMgbm90IGxvY2tlZCBzbyB1bmRvIHdhaXQgYW5kIHJhaXNlICAqLworICAgICAgICAgICAgICAgIGlmIChzZW1fcG9zdChzZWxmLT5oYW5kbGUpIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfT1NFcnJvcik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgInNlbWFwaG9yZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvciBsb2NrIHJlbGVhc2VkIHRvbyBtYW55ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpbWVzIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICNlbHNlCi0JCWludCBzdmFsOworICAgICAgICBpbnQgc3ZhbDsKIAotCQkvKiBUaGlzIGNoZWNrIGlzIG5vdCBhbiBhYnNvbHV0ZSBndWFyYW50ZWUgdGhhdCB0aGUgc2VtYXBob3JlCi0JCSAgIGRvZXMgbm90IHJpc2UgYWJvdmUgbWF4dmFsdWUuICovCi0JCWlmIChzZW1fZ2V0dmFsdWUoc2VsZi0+aGFuZGxlLCAmc3ZhbCkgPCAwKSB7Ci0JCQlyZXR1cm4gUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX09TRXJyb3IpOwotCQl9IGVsc2UgaWYgKHN2YWwgPj0gc2VsZi0+bWF4dmFsdWUpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAic2VtYXBob3JlIG9yIGxvY2sgIgotCQkJCQkicmVsZWFzZWQgdG9vIG1hbnkgdGltZXMiKTsKLQkJCXJldHVybiBOVUxMOwotCQl9CisgICAgICAgIC8qIFRoaXMgY2hlY2sgaXMgbm90IGFuIGFic29sdXRlIGd1YXJhbnRlZSB0aGF0IHRoZSBzZW1hcGhvcmUKKyAgICAgICAgICAgZG9lcyBub3QgcmlzZSBhYm92ZSBtYXh2YWx1ZS4gKi8KKyAgICAgICAgaWYgKHNlbV9nZXR2YWx1ZShzZWxmLT5oYW5kbGUsICZzdmFsKSA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfT1NFcnJvcik7CisgICAgICAgIH0gZWxzZSBpZiAoc3ZhbCA+PSBzZWxmLT5tYXh2YWx1ZSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJzZW1hcGhvcmUgb3IgbG9jayAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlbGVhc2VkIHRvbyBtYW55IHRpbWVzIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQogI2VuZGlmCi0JfQorICAgIH0KIAotCWlmIChzZW1fcG9zdChzZWxmLT5oYW5kbGUpIDwgMCkKLQkJcmV0dXJuIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19PU0Vycm9yKTsKKyAgICBpZiAoc2VtX3Bvc3Qoc2VsZi0+aGFuZGxlKSA8IDApCisgICAgICAgIHJldHVybiBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfT1NFcnJvcik7CiAKLQktLXNlbGYtPmNvdW50OwotCVB5X1JFVFVSTl9OT05FOworICAgIC0tc2VsZi0+Y291bnQ7CisgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKICNlbmRpZiAvKiAhTVNfV0lORE9XUyAqLwpAQCAtNDAxLDExMSArNDAxLDExMSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIG5ld3NlbWxvY2tvYmplY3QoUHlUeXBlT2JqZWN0ICp0eXBlLCBTRU1fSEFORExFIGhhbmRsZSwgaW50IGtpbmQsIGludCBtYXh2YWx1ZSkKIHsKLQlTZW1Mb2NrT2JqZWN0ICpzZWxmOworICAgIFNlbUxvY2tPYmplY3QgKnNlbGY7CiAKLQlzZWxmID0gUHlPYmplY3RfTmV3KFNlbUxvY2tPYmplY3QsIHR5cGUpOwotCWlmICghc2VsZikKLQkJcmV0dXJuIE5VTEw7Ci0Jc2VsZi0+aGFuZGxlID0gaGFuZGxlOwotCXNlbGYtPmtpbmQgPSBraW5kOwotCXNlbGYtPmNvdW50ID0gMDsKLQlzZWxmLT5sYXN0X3RpZCA9IDA7Ci0Jc2VsZi0+bWF4dmFsdWUgPSBtYXh2YWx1ZTsKLQlyZXR1cm4gKFB5T2JqZWN0KilzZWxmOworICAgIHNlbGYgPSBQeU9iamVjdF9OZXcoU2VtTG9ja09iamVjdCwgdHlwZSk7CisgICAgaWYgKCFzZWxmKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBzZWxmLT5oYW5kbGUgPSBoYW5kbGU7CisgICAgc2VsZi0+a2luZCA9IGtpbmQ7CisgICAgc2VsZi0+Y291bnQgPSAwOworICAgIHNlbGYtPmxhc3RfdGlkID0gMDsKKyAgICBzZWxmLT5tYXh2YWx1ZSA9IG1heHZhbHVlOworICAgIHJldHVybiAoUHlPYmplY3QqKXNlbGY7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZW1sb2NrX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQljaGFyIGJ1ZmZlclsyNTZdOwotCVNFTV9IQU5ETEUgaGFuZGxlID0gU0VNX0ZBSUxFRDsKLQlpbnQga2luZCwgbWF4dmFsdWUsIHZhbHVlOwotCVB5T2JqZWN0ICpyZXN1bHQ7Ci0Jc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJraW5kIiwgInZhbHVlIiwgIm1heHZhbHVlIiwgTlVMTH07Ci0Jc3RhdGljIGludCBjb3VudGVyID0gMDsKKyAgICBjaGFyIGJ1ZmZlclsyNTZdOworICAgIFNFTV9IQU5ETEUgaGFuZGxlID0gU0VNX0ZBSUxFRDsKKyAgICBpbnQga2luZCwgbWF4dmFsdWUsIHZhbHVlOworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisgICAgc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJraW5kIiwgInZhbHVlIiwgIm1heHZhbHVlIiwgTlVMTH07CisgICAgc3RhdGljIGludCBjb3VudGVyID0gMDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJpaWkiLCBrd2xpc3QsIAotCQkJCQkgJmtpbmQsICZ2YWx1ZSwgJm1heHZhbHVlKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgImlpaSIsIGt3bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma2luZCwgJnZhbHVlLCAmbWF4dmFsdWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChraW5kICE9IFJFQ1VSU0lWRV9NVVRFWCAmJiBraW5kICE9IFNFTUFQSE9SRSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgInVucmVjb2duaXplZCBraW5kIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoa2luZCAhPSBSRUNVUlNJVkVfTVVURVggJiYga2luZCAhPSBTRU1BUEhPUkUpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJ1bnJlY29nbml6ZWQga2luZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlQeU9TX3NucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICIvbXAlZC0lZCIsIGdldHBpZCgpLCBjb3VudGVyKyspOworICAgIFB5T1Nfc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgIi9tcCVkLSVkIiwgZ2V0cGlkKCksIGNvdW50ZXIrKyk7CiAKLQlTRU1fQ0xFQVJfRVJST1IoKTsKLQloYW5kbGUgPSBTRU1fQ1JFQVRFKGJ1ZmZlciwgdmFsdWUsIG1heHZhbHVlKTsKLQkvKiBPbiBXaW5kb3dzIHdlIHNob3VsZCBmYWlsIGlmIEdldExhc3RFcnJvcigpPT1FUlJPUl9BTFJFQURZX0VYSVNUUyAqLwotCWlmIChoYW5kbGUgPT0gU0VNX0ZBSUxFRCB8fCBTRU1fR0VUX0xBU1RfRVJST1IoKSAhPSAwKQotCQlnb3RvIGZhaWx1cmU7CisgICAgU0VNX0NMRUFSX0VSUk9SKCk7CisgICAgaGFuZGxlID0gU0VNX0NSRUFURShidWZmZXIsIHZhbHVlLCBtYXh2YWx1ZSk7CisgICAgLyogT24gV2luZG93cyB3ZSBzaG91bGQgZmFpbCBpZiBHZXRMYXN0RXJyb3IoKT09RVJST1JfQUxSRUFEWV9FWElTVFMgKi8KKyAgICBpZiAoaGFuZGxlID09IFNFTV9GQUlMRUQgfHwgU0VNX0dFVF9MQVNUX0VSUk9SKCkgIT0gMCkKKyAgICAgICAgZ290byBmYWlsdXJlOwogCi0JaWYgKFNFTV9VTkxJTksoYnVmZmVyKSA8IDApCi0JCWdvdG8gZmFpbHVyZTsKKyAgICBpZiAoU0VNX1VOTElOSyhidWZmZXIpIDwgMCkKKyAgICAgICAgZ290byBmYWlsdXJlOwogCi0JcmVzdWx0ID0gbmV3c2VtbG9ja29iamVjdCh0eXBlLCBoYW5kbGUsIGtpbmQsIG1heHZhbHVlKTsKLQlpZiAoIXJlc3VsdCkKLQkJZ290byBmYWlsdXJlOworICAgIHJlc3VsdCA9IG5ld3NlbWxvY2tvYmplY3QodHlwZSwgaGFuZGxlLCBraW5kLCBtYXh2YWx1ZSk7CisgICAgaWYgKCFyZXN1bHQpCisgICAgICAgIGdvdG8gZmFpbHVyZTsKIAotCXJldHVybiByZXN1bHQ7CisgICAgcmV0dXJuIHJlc3VsdDsKIAogICBmYWlsdXJlOgotCWlmIChoYW5kbGUgIT0gU0VNX0ZBSUxFRCkKLQkJU0VNX0NMT1NFKGhhbmRsZSk7Ci0JbXBfU2V0RXJyb3IoTlVMTCwgTVBfU1RBTkRBUkRfRVJST1IpOwotCXJldHVybiBOVUxMOworICAgIGlmIChoYW5kbGUgIT0gU0VNX0ZBSUxFRCkKKyAgICAgICAgU0VNX0NMT1NFKGhhbmRsZSk7CisgICAgbXBfU2V0RXJyb3IoTlVMTCwgTVBfU1RBTkRBUkRfRVJST1IpOworICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc2VtbG9ja19yZWJ1aWxkKFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JU0VNX0hBTkRMRSBoYW5kbGU7Ci0JaW50IGtpbmQsIG1heHZhbHVlOworICAgIFNFTV9IQU5ETEUgaGFuZGxlOworICAgIGludCBraW5kLCBtYXh2YWx1ZTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCBGX1NFTV9IQU5ETEUgImlpIiwgCi0JCQkgICAgICAmaGFuZGxlLCAma2luZCwgJm1heHZhbHVlKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsIEZfU0VNX0hBTkRMRSAiaWkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaGFuZGxlLCAma2luZCwgJm1heHZhbHVlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlyZXR1cm4gbmV3c2VtbG9ja29iamVjdCh0eXBlLCBoYW5kbGUsIGtpbmQsIG1heHZhbHVlKTsKKyAgICByZXR1cm4gbmV3c2VtbG9ja29iamVjdCh0eXBlLCBoYW5kbGUsIGtpbmQsIG1heHZhbHVlKTsKIH0KIAogc3RhdGljIHZvaWQKIHNlbWxvY2tfZGVhbGxvYyhTZW1Mb2NrT2JqZWN0KiBzZWxmKQogewotCWlmIChzZWxmLT5oYW5kbGUgIT0gU0VNX0ZBSUxFRCkKLQkJU0VNX0NMT1NFKHNlbGYtPmhhbmRsZSk7Ci0JUHlPYmplY3RfRGVsKHNlbGYpOworICAgIGlmIChzZWxmLT5oYW5kbGUgIT0gU0VNX0ZBSUxFRCkKKyAgICAgICAgU0VNX0NMT1NFKHNlbGYtPmhhbmRsZSk7CisgICAgUHlPYmplY3RfRGVsKHNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc2VtbG9ja19jb3VudChTZW1Mb2NrT2JqZWN0ICpzZWxmKQogewotCXJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZylzZWxmLT5jb3VudCk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKXNlbGYtPmNvdW50KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNlbWxvY2tfaXNtaW5lKFNlbUxvY2tPYmplY3QgKnNlbGYpCiB7Ci0JLyogb25seSBtYWtlcyBzZW5zZSBmb3IgYSBsb2NrICovCi0JcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZyhJU01JTkUoc2VsZikpOworICAgIC8qIG9ubHkgbWFrZXMgc2Vuc2UgZm9yIGEgbG9jayAqLworICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoSVNNSU5FKHNlbGYpKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNlbWxvY2tfZ2V0dmFsdWUoU2VtTG9ja09iamVjdCAqc2VsZikKIHsKICNpZiBIQVZFX0JST0tFTl9TRU1fR0VUVkFMVUUKLQlQeUVycl9TZXROb25lKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IpOwotCXJldHVybiBOVUxMOworICAgIFB5RXJyX1NldE5vbmUoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvcik7CisgICAgcmV0dXJuIE5VTEw7CiAjZWxzZQotCWludCBzdmFsOwotCWlmIChTRU1fR0VUVkFMVUUoc2VsZi0+aGFuZGxlLCAmc3ZhbCkgPCAwKQotCQlyZXR1cm4gbXBfU2V0RXJyb3IoTlVMTCwgTVBfU1RBTkRBUkRfRVJST1IpOwotCS8qIHNvbWUgcG9zaXggaW1wbGVtZW50YXRpb25zIHVzZSBuZWdhdGl2ZSBudW1iZXJzIHRvIGluZGljYXRlIAotCSAgIHRoZSBudW1iZXIgb2Ygd2FpdGluZyB0aHJlYWRzICovCi0JaWYgKHN2YWwgPCAwKQotCQlzdmFsID0gMDsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpc3ZhbCk7CisgICAgaW50IHN2YWw7CisgICAgaWYgKFNFTV9HRVRWQUxVRShzZWxmLT5oYW5kbGUsICZzdmFsKSA8IDApCisgICAgICAgIHJldHVybiBtcF9TZXRFcnJvcihOVUxMLCBNUF9TVEFOREFSRF9FUlJPUik7CisgICAgLyogc29tZSBwb3NpeCBpbXBsZW1lbnRhdGlvbnMgdXNlIG5lZ2F0aXZlIG51bWJlcnMgdG8gaW5kaWNhdGUKKyAgICAgICB0aGUgbnVtYmVyIG9mIHdhaXRpbmcgdGhyZWFkcyAqLworICAgIGlmIChzdmFsIDwgMCkKKyAgICAgICAgc3ZhbCA9IDA7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKXN2YWwpOwogI2VuZGlmCiB9CiAKQEAgLTUxMywyOCArNTEzLDI4IEBACiBzZW1sb2NrX2lzemVybyhTZW1Mb2NrT2JqZWN0ICpzZWxmKQogewogI2lmIEhBVkVfQlJPS0VOX1NFTV9HRVRWQUxVRQotCWlmIChzZW1fdHJ5d2FpdChzZWxmLT5oYW5kbGUpIDwgMCkgewotCQlpZiAoZXJybm8gPT0gRUFHQUlOKQotCQkJUHlfUkVUVVJOX1RSVUU7Ci0JCXJldHVybiBtcF9TZXRFcnJvcihOVUxMLCBNUF9TVEFOREFSRF9FUlJPUik7Ci0JfSBlbHNlIHsKLQkJaWYgKHNlbV9wb3N0KHNlbGYtPmhhbmRsZSkgPCAwKQotCQkJcmV0dXJuIG1wX1NldEVycm9yKE5VTEwsIE1QX1NUQU5EQVJEX0VSUk9SKTsKLQkJUHlfUkVUVVJOX0ZBTFNFOwotCX0KKyAgICBpZiAoc2VtX3RyeXdhaXQoc2VsZi0+aGFuZGxlKSA8IDApIHsKKyAgICAgICAgaWYgKGVycm5vID09IEVBR0FJTikKKyAgICAgICAgICAgIFB5X1JFVFVSTl9UUlVFOworICAgICAgICByZXR1cm4gbXBfU2V0RXJyb3IoTlVMTCwgTVBfU1RBTkRBUkRfRVJST1IpOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChzZW1fcG9zdChzZWxmLT5oYW5kbGUpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBtcF9TZXRFcnJvcihOVUxMLCBNUF9TVEFOREFSRF9FUlJPUik7CisgICAgICAgIFB5X1JFVFVSTl9GQUxTRTsKKyAgICB9CiAjZWxzZQotCWludCBzdmFsOwotCWlmIChTRU1fR0VUVkFMVUUoc2VsZi0+aGFuZGxlLCAmc3ZhbCkgPCAwKQotCQlyZXR1cm4gbXBfU2V0RXJyb3IoTlVMTCwgTVBfU1RBTkRBUkRfRVJST1IpOwotCXJldHVybiBQeUJvb2xfRnJvbUxvbmcoKGxvbmcpc3ZhbCA9PSAwKTsKKyAgICBpbnQgc3ZhbDsKKyAgICBpZiAoU0VNX0dFVFZBTFVFKHNlbGYtPmhhbmRsZSwgJnN2YWwpIDwgMCkKKyAgICAgICAgcmV0dXJuIG1wX1NldEVycm9yKE5VTEwsIE1QX1NUQU5EQVJEX0VSUk9SKTsKKyAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKChsb25nKXN2YWwgPT0gMCk7CiAjZW5kaWYKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNlbWxvY2tfYWZ0ZXJmb3JrKFNlbUxvY2tPYmplY3QgKnNlbGYpCiB7Ci0Jc2VsZi0+Y291bnQgPSAwOwotCVB5X1JFVFVSTl9OT05FOworICAgIHNlbGYtPmNvdW50ID0gMDsKKyAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAogLyoKQEAgLTU0MiwyNyArNTQyLDI3IEBACiAgKi8KIAogc3RhdGljIFB5TWV0aG9kRGVmIHNlbWxvY2tfbWV0aG9kc1tdID0gewotCXsiYWNxdWlyZSIsIChQeUNGdW5jdGlvbilzZW1sb2NrX2FjcXVpcmUsIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsCi0JICJhY3F1aXJlIHRoZSBzZW1hcGhvcmUvbG9jayJ9LAotCXsicmVsZWFzZSIsIChQeUNGdW5jdGlvbilzZW1sb2NrX3JlbGVhc2UsIE1FVEhfTk9BUkdTLCAKLQkgInJlbGVhc2UgdGhlIHNlbWFwaG9yZS9sb2NrIn0sCisgICAgeyJhY3F1aXJlIiwgKFB5Q0Z1bmN0aW9uKXNlbWxvY2tfYWNxdWlyZSwgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywKKyAgICAgImFjcXVpcmUgdGhlIHNlbWFwaG9yZS9sb2NrIn0sCisgICAgeyJyZWxlYXNlIiwgKFB5Q0Z1bmN0aW9uKXNlbWxvY2tfcmVsZWFzZSwgTUVUSF9OT0FSR1MsCisgICAgICJyZWxlYXNlIHRoZSBzZW1hcGhvcmUvbG9jayJ9LAogICAgIHsiX19lbnRlcl9fIiwgKFB5Q0Z1bmN0aW9uKXNlbWxvY2tfYWNxdWlyZSwgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywKLQkgImVudGVyIHRoZSBzZW1hcGhvcmUvbG9jayJ9LAotCXsiX19leGl0X18iLCAoUHlDRnVuY3Rpb24pc2VtbG9ja19yZWxlYXNlLCBNRVRIX1ZBUkFSR1MsIAotCSAiZXhpdCB0aGUgc2VtYXBob3JlL2xvY2sifSwKLQl7Il9jb3VudCIsIChQeUNGdW5jdGlvbilzZW1sb2NrX2NvdW50LCBNRVRIX05PQVJHUywgCi0JICJudW0gb2YgYGFjcXVpcmUoKWBzIG1pbnVzIG51bSBvZiBgcmVsZWFzZSgpYHMgZm9yIHRoaXMgcHJvY2VzcyJ9LAotCXsiX2lzX21pbmUiLCAoUHlDRnVuY3Rpb24pc2VtbG9ja19pc21pbmUsIE1FVEhfTk9BUkdTLCAKLQkgIndoZXRoZXIgdGhlIGxvY2sgaXMgb3duZWQgYnkgdGhpcyB0aHJlYWQifSwKLQl7Il9nZXRfdmFsdWUiLCAoUHlDRnVuY3Rpb24pc2VtbG9ja19nZXR2YWx1ZSwgTUVUSF9OT0FSR1MsIAotCSAiZ2V0IHRoZSB2YWx1ZSBvZiB0aGUgc2VtYXBob3JlIn0sIAotCXsiX2lzX3plcm8iLCAoUHlDRnVuY3Rpb24pc2VtbG9ja19pc3plcm8sIE1FVEhfTk9BUkdTLCAKLQkgInJldHVybnMgd2hldGhlciBzZW1hcGhvcmUgaGFzIHZhbHVlIHplcm8ifSwgCi0JeyJfcmVidWlsZCIsIChQeUNGdW5jdGlvbilzZW1sb2NrX3JlYnVpbGQsIE1FVEhfVkFSQVJHUyB8IE1FVEhfQ0xBU1MsIAotCSAiIn0sIAotCXsiX2FmdGVyX2ZvcmsiLCAoUHlDRnVuY3Rpb24pc2VtbG9ja19hZnRlcmZvcmssIE1FVEhfTk9BUkdTLAotCSAicmV6ZXJvIHRoZSBuZXQgYWNxdWlzaXRpb24gY291bnQgYWZ0ZXIgZm9yaygpIn0sCi0Je05VTEx9CisgICAgICJlbnRlciB0aGUgc2VtYXBob3JlL2xvY2sifSwKKyAgICB7Il9fZXhpdF9fIiwgKFB5Q0Z1bmN0aW9uKXNlbWxvY2tfcmVsZWFzZSwgTUVUSF9WQVJBUkdTLAorICAgICAiZXhpdCB0aGUgc2VtYXBob3JlL2xvY2sifSwKKyAgICB7Il9jb3VudCIsIChQeUNGdW5jdGlvbilzZW1sb2NrX2NvdW50LCBNRVRIX05PQVJHUywKKyAgICAgIm51bSBvZiBgYWNxdWlyZSgpYHMgbWludXMgbnVtIG9mIGByZWxlYXNlKClgcyBmb3IgdGhpcyBwcm9jZXNzIn0sCisgICAgeyJfaXNfbWluZSIsIChQeUNGdW5jdGlvbilzZW1sb2NrX2lzbWluZSwgTUVUSF9OT0FSR1MsCisgICAgICJ3aGV0aGVyIHRoZSBsb2NrIGlzIG93bmVkIGJ5IHRoaXMgdGhyZWFkIn0sCisgICAgeyJfZ2V0X3ZhbHVlIiwgKFB5Q0Z1bmN0aW9uKXNlbWxvY2tfZ2V0dmFsdWUsIE1FVEhfTk9BUkdTLAorICAgICAiZ2V0IHRoZSB2YWx1ZSBvZiB0aGUgc2VtYXBob3JlIn0sCisgICAgeyJfaXNfemVybyIsIChQeUNGdW5jdGlvbilzZW1sb2NrX2lzemVybywgTUVUSF9OT0FSR1MsCisgICAgICJyZXR1cm5zIHdoZXRoZXIgc2VtYXBob3JlIGhhcyB2YWx1ZSB6ZXJvIn0sCisgICAgeyJfcmVidWlsZCIsIChQeUNGdW5jdGlvbilzZW1sb2NrX3JlYnVpbGQsIE1FVEhfVkFSQVJHUyB8IE1FVEhfQ0xBU1MsCisgICAgICIifSwKKyAgICB7Il9hZnRlcl9mb3JrIiwgKFB5Q0Z1bmN0aW9uKXNlbWxvY2tfYWZ0ZXJmb3JrLCBNRVRIX05PQVJHUywKKyAgICAgInJlemVybyB0aGUgbmV0IGFjcXVpc2l0aW9uIGNvdW50IGFmdGVyIGZvcmsoKSJ9LAorICAgIHtOVUxMfQogfTsKIAogLyoKQEAgLTU3MCwxMyArNTcwLDEzIEBACiAgKi8KIAogc3RhdGljIFB5TWVtYmVyRGVmIHNlbWxvY2tfbWVtYmVyc1tdID0gewotCXsiaGFuZGxlIiwgVF9TRU1fSEFORExFLCBvZmZzZXRvZihTZW1Mb2NrT2JqZWN0LCBoYW5kbGUpLCBSRUFET05MWSwgCi0JICIifSwKLQl7ImtpbmQiLCBUX0lOVCwgb2Zmc2V0b2YoU2VtTG9ja09iamVjdCwga2luZCksIFJFQURPTkxZLCAKLQkgIiJ9LAotCXsibWF4dmFsdWUiLCBUX0lOVCwgb2Zmc2V0b2YoU2VtTG9ja09iamVjdCwgbWF4dmFsdWUpLCBSRUFET05MWSwgCi0JICIifSwKLQl7TlVMTH0KKyAgICB7ImhhbmRsZSIsIFRfU0VNX0hBTkRMRSwgb2Zmc2V0b2YoU2VtTG9ja09iamVjdCwgaGFuZGxlKSwgUkVBRE9OTFksCisgICAgICIifSwKKyAgICB7ImtpbmQiLCBUX0lOVCwgb2Zmc2V0b2YoU2VtTG9ja09iamVjdCwga2luZCksIFJFQURPTkxZLAorICAgICAiIn0sCisgICAgeyJtYXh2YWx1ZSIsIFRfSU5ULCBvZmZzZXRvZihTZW1Mb2NrT2JqZWN0LCBtYXh2YWx1ZSksIFJFQURPTkxZLAorICAgICAiIn0sCisgICAge05VTEx9CiB9OwogCiAvKgpAQCAtNTg0LDQyICs1ODQsNDIgQEAKICAqLwogCiBQeVR5cGVPYmplY3QgU2VtTG9ja1R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JLyogdHBfbmFtZSAgICAgICAgICAgKi8gIl9tdWx0aXByb2Nlc3NpbmcuU2VtTG9jayIsCi0JLyogdHBfYmFzaWNzaXplICAgICAgKi8gc2l6ZW9mKFNlbUxvY2tPYmplY3QpLAotCS8qIHRwX2l0ZW1zaXplICAgICAgICovIDAsCi0JLyogdHBfZGVhbGxvYyAgICAgICAgKi8gKGRlc3RydWN0b3Ipc2VtbG9ja19kZWFsbG9jLAotCS8qIHRwX3ByaW50ICAgICAgICAgICovIDAsCi0JLyogdHBfZ2V0YXR0ciAgICAgICAgKi8gMCwKLQkvKiB0cF9zZXRhdHRyICAgICAgICAqLyAwLAotCS8qIHRwX2NvbXBhcmUgICAgICAgICovIDAsCi0JLyogdHBfcmVwciAgICAgICAgICAgKi8gMCwKLQkvKiB0cF9hc19udW1iZXIgICAgICAqLyAwLAotCS8qIHRwX2FzX3NlcXVlbmNlICAgICovIDAsCi0JLyogdHBfYXNfbWFwcGluZyAgICAgKi8gMCwKLQkvKiB0cF9oYXNoICAgICAgICAgICAqLyAwLAotCS8qIHRwX2NhbGwgICAgICAgICAgICovIDAsCi0JLyogdHBfc3RyICAgICAgICAgICAgKi8gMCwKLQkvKiB0cF9nZXRhdHRybyAgICAgICAqLyAwLAotCS8qIHRwX3NldGF0dHJvICAgICAgICovIDAsCi0JLyogdHBfYXNfYnVmZmVyICAgICAgKi8gMCwKLQkvKiB0cF9mbGFncyAgICAgICAgICAqLyBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFLAotCS8qIHRwX2RvYyAgICAgICAgICAgICovICJTZW1hcGhvcmUvTXV0ZXggdHlwZSIsCi0JLyogdHBfdHJhdmVyc2UgICAgICAgKi8gMCwKLQkvKiB0cF9jbGVhciAgICAgICAgICAqLyAwLAotCS8qIHRwX3JpY2hjb21wYXJlICAgICovIDAsCi0JLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8gMCwKLQkvKiB0cF9pdGVyICAgICAgICAgICAqLyAwLAotCS8qIHRwX2l0ZXJuZXh0ICAgICAgICovIDAsCi0JLyogdHBfbWV0aG9kcyAgICAgICAgKi8gc2VtbG9ja19tZXRob2RzLAotCS8qIHRwX21lbWJlcnMgICAgICAgICovIHNlbWxvY2tfbWVtYmVycywKLQkvKiB0cF9nZXRzZXQgICAgICAgICAqLyAwLAotCS8qIHRwX2Jhc2UgICAgICAgICAgICovIDAsCi0JLyogdHBfZGljdCAgICAgICAgICAgKi8gMCwKLQkvKiB0cF9kZXNjcl9nZXQgICAgICAqLyAwLAotCS8qIHRwX2Rlc2NyX3NldCAgICAgICovIDAsCi0JLyogdHBfZGljdG9mZnNldCAgICAgKi8gMCwKLQkvKiB0cF9pbml0ICAgICAgICAgICAqLyAwLAotCS8qIHRwX2FsbG9jICAgICAgICAgICovIDAsCi0JLyogdHBfbmV3ICAgICAgICAgICAgKi8gc2VtbG9ja19uZXcsCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisgICAgLyogdHBfbmFtZSAgICAgICAgICAgKi8gIl9tdWx0aXByb2Nlc3NpbmcuU2VtTG9jayIsCisgICAgLyogdHBfYmFzaWNzaXplICAgICAgKi8gc2l6ZW9mKFNlbUxvY2tPYmplY3QpLAorICAgIC8qIHRwX2l0ZW1zaXplICAgICAgICovIDAsCisgICAgLyogdHBfZGVhbGxvYyAgICAgICAgKi8gKGRlc3RydWN0b3Ipc2VtbG9ja19kZWFsbG9jLAorICAgIC8qIHRwX3ByaW50ICAgICAgICAgICovIDAsCisgICAgLyogdHBfZ2V0YXR0ciAgICAgICAgKi8gMCwKKyAgICAvKiB0cF9zZXRhdHRyICAgICAgICAqLyAwLAorICAgIC8qIHRwX2NvbXBhcmUgICAgICAgICovIDAsCisgICAgLyogdHBfcmVwciAgICAgICAgICAgKi8gMCwKKyAgICAvKiB0cF9hc19udW1iZXIgICAgICAqLyAwLAorICAgIC8qIHRwX2FzX3NlcXVlbmNlICAgICovIDAsCisgICAgLyogdHBfYXNfbWFwcGluZyAgICAgKi8gMCwKKyAgICAvKiB0cF9oYXNoICAgICAgICAgICAqLyAwLAorICAgIC8qIHRwX2NhbGwgICAgICAgICAgICovIDAsCisgICAgLyogdHBfc3RyICAgICAgICAgICAgKi8gMCwKKyAgICAvKiB0cF9nZXRhdHRybyAgICAgICAqLyAwLAorICAgIC8qIHRwX3NldGF0dHJvICAgICAgICovIDAsCisgICAgLyogdHBfYXNfYnVmZmVyICAgICAgKi8gMCwKKyAgICAvKiB0cF9mbGFncyAgICAgICAgICAqLyBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFLAorICAgIC8qIHRwX2RvYyAgICAgICAgICAgICovICJTZW1hcGhvcmUvTXV0ZXggdHlwZSIsCisgICAgLyogdHBfdHJhdmVyc2UgICAgICAgKi8gMCwKKyAgICAvKiB0cF9jbGVhciAgICAgICAgICAqLyAwLAorICAgIC8qIHRwX3JpY2hjb21wYXJlICAgICovIDAsCisgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8gMCwKKyAgICAvKiB0cF9pdGVyICAgICAgICAgICAqLyAwLAorICAgIC8qIHRwX2l0ZXJuZXh0ICAgICAgICovIDAsCisgICAgLyogdHBfbWV0aG9kcyAgICAgICAgKi8gc2VtbG9ja19tZXRob2RzLAorICAgIC8qIHRwX21lbWJlcnMgICAgICAgICovIHNlbWxvY2tfbWVtYmVycywKKyAgICAvKiB0cF9nZXRzZXQgICAgICAgICAqLyAwLAorICAgIC8qIHRwX2Jhc2UgICAgICAgICAgICovIDAsCisgICAgLyogdHBfZGljdCAgICAgICAgICAgKi8gMCwKKyAgICAvKiB0cF9kZXNjcl9nZXQgICAgICAqLyAwLAorICAgIC8qIHRwX2Rlc2NyX3NldCAgICAgICovIDAsCisgICAgLyogdHBfZGljdG9mZnNldCAgICAgKi8gMCwKKyAgICAvKiB0cF9pbml0ICAgICAgICAgICAqLyAwLAorICAgIC8qIHRwX2FsbG9jICAgICAgICAgICovIDAsCisgICAgLyogdHBfbmV3ICAgICAgICAgICAgKi8gc2VtbG9ja19uZXcsCiB9OwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fbXVsdGlwcm9jZXNzaW5nL3NvY2tldF9jb25uZWN0aW9uLmMgYi9Nb2R1bGVzL19tdWx0aXByb2Nlc3Npbmcvc29ja2V0X2Nvbm5lY3Rpb24uYwppbmRleCBhZDQwMDViLi43ZWJmMzM4IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19tdWx0aXByb2Nlc3Npbmcvc29ja2V0X2Nvbm5lY3Rpb24uYworKysgYi9Nb2R1bGVzL19tdWx0aXByb2Nlc3Npbmcvc29ja2V0X2Nvbm5lY3Rpb24uYwpAQCAtMjUsNDUgKzI1LDQ1IEBACiBzdGF0aWMgUHlfc3NpemVfdAogX2Nvbm5fc2VuZGFsbChIQU5ETEUgaCwgY2hhciAqc3RyaW5nLCBzaXplX3QgbGVuZ3RoKQogewotCWNoYXIgKnAgPSBzdHJpbmc7Ci0JUHlfc3NpemVfdCByZXM7CisgICAgY2hhciAqcCA9IHN0cmluZzsKKyAgICBQeV9zc2l6ZV90IHJlczsKIAotCXdoaWxlIChsZW5ndGggPiAwKSB7Ci0JCXJlcyA9IFdSSVRFKGgsIHAsIGxlbmd0aCk7Ci0JCWlmIChyZXMgPCAwKQotCQkJcmV0dXJuIE1QX1NPQ0tFVF9FUlJPUjsKLQkJbGVuZ3RoIC09IHJlczsKLQkJcCArPSByZXM7Ci0JfQorICAgIHdoaWxlIChsZW5ndGggPiAwKSB7CisgICAgICAgIHJlcyA9IFdSSVRFKGgsIHAsIGxlbmd0aCk7CisgICAgICAgIGlmIChyZXMgPCAwKQorICAgICAgICAgICAgcmV0dXJuIE1QX1NPQ0tFVF9FUlJPUjsKKyAgICAgICAgbGVuZ3RoIC09IHJlczsKKyAgICAgICAgcCArPSByZXM7CisgICAgfQogCi0JcmV0dXJuIE1QX1NVQ0NFU1M7CisgICAgcmV0dXJuIE1QX1NVQ0NFU1M7CiB9CiAKIC8qCi0gKiBSZWNlaXZlIHN0cmluZyBvZiBleGFjdCBsZW5ndGggZnJvbSBmaWxlIGRlc2NyaXB0b3IgCisgKiBSZWNlaXZlIHN0cmluZyBvZiBleGFjdCBsZW5ndGggZnJvbSBmaWxlIGRlc2NyaXB0b3IKICAqLwogCiBzdGF0aWMgUHlfc3NpemVfdAogX2Nvbm5fcmVjdmFsbChIQU5ETEUgaCwgY2hhciAqYnVmZmVyLCBzaXplX3QgbGVuZ3RoKQogewotCXNpemVfdCByZW1haW5pbmcgPSBsZW5ndGg7Ci0JUHlfc3NpemVfdCB0ZW1wOwotCWNoYXIgKnAgPSBidWZmZXI7CisgICAgc2l6ZV90IHJlbWFpbmluZyA9IGxlbmd0aDsKKyAgICBQeV9zc2l6ZV90IHRlbXA7CisgICAgY2hhciAqcCA9IGJ1ZmZlcjsKIAotCXdoaWxlIChyZW1haW5pbmcgPiAwKSB7Ci0JCXRlbXAgPSBSRUFEKGgsIHAsIHJlbWFpbmluZyk7Ci0JCWlmICh0ZW1wIDw9IDApIHsKLQkJCWlmICh0ZW1wID09IDApCi0JCQkJcmV0dXJuIHJlbWFpbmluZyA9PSBsZW5ndGggPyAKLQkJCQkJTVBfRU5EX09GX0ZJTEUgOiBNUF9FQVJMWV9FTkRfT0ZfRklMRTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gdGVtcDsKLQkJfQotCQlyZW1haW5pbmcgLT0gdGVtcDsKLQkJcCArPSB0ZW1wOwotCX0KKyAgICB3aGlsZSAocmVtYWluaW5nID4gMCkgeworICAgICAgICB0ZW1wID0gUkVBRChoLCBwLCByZW1haW5pbmcpOworICAgICAgICBpZiAodGVtcCA8PSAwKSB7CisgICAgICAgICAgICBpZiAodGVtcCA9PSAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZW1haW5pbmcgPT0gbGVuZ3RoID8KKyAgICAgICAgICAgICAgICAgICAgTVBfRU5EX09GX0ZJTEUgOiBNUF9FQVJMWV9FTkRfT0ZfRklMRTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gdGVtcDsKKyAgICAgICAgfQorICAgICAgICByZW1haW5pbmcgLT0gdGVtcDsKKyAgICAgICAgcCArPSB0ZW1wOworICAgIH0KIAotCXJldHVybiBNUF9TVUNDRVNTOworICAgIHJldHVybiBNUF9TVUNDRVNTOwogfQogCiAvKgpAQCAtNzMsMzggKzczLDM4IEBACiBzdGF0aWMgUHlfc3NpemVfdAogY29ubl9zZW5kX3N0cmluZyhDb25uZWN0aW9uT2JqZWN0ICpjb25uLCBjaGFyICpzdHJpbmcsIHNpemVfdCBsZW5ndGgpCiB7Ci0JUHlfc3NpemVfdCByZXM7Ci0JLyogVGhlICJoZWFkZXIiIG9mIHRoZSBtZXNzYWdlIGlzIGEgMzIgYml0IHVuc2lnbmVkIG51bWJlciAoaW4KLQkgICBuZXR3b3JrIG9yZGVyKSB3aGljaCBzcGVjaWZpZXMgdGhlIGxlbmd0aCBvZiB0aGUgImJvZHkiLiAgSWYKLQkgICB0aGUgbWVzc2FnZSBpcyBzaG9ydGVyIHRoYW4gYWJvdXQgMTZrYiB0aGVuIGl0IGlzIHF1aWNrZXIgdG8KLQkgICBjb21iaW5lIHRoZSAiaGVhZGVyIiBhbmQgdGhlICJib2R5IiBvZiB0aGUgbWVzc2FnZSBhbmQgc2VuZAotCSAgIHRoZW0gYXQgb25jZS4gKi8KLQlpZiAobGVuZ3RoIDwgKDE2KjEwMjQpKSB7Ci0JCWNoYXIgKm1lc3NhZ2U7CisgICAgUHlfc3NpemVfdCByZXM7CisgICAgLyogVGhlICJoZWFkZXIiIG9mIHRoZSBtZXNzYWdlIGlzIGEgMzIgYml0IHVuc2lnbmVkIG51bWJlciAoaW4KKyAgICAgICBuZXR3b3JrIG9yZGVyKSB3aGljaCBzcGVjaWZpZXMgdGhlIGxlbmd0aCBvZiB0aGUgImJvZHkiLiAgSWYKKyAgICAgICB0aGUgbWVzc2FnZSBpcyBzaG9ydGVyIHRoYW4gYWJvdXQgMTZrYiB0aGVuIGl0IGlzIHF1aWNrZXIgdG8KKyAgICAgICBjb21iaW5lIHRoZSAiaGVhZGVyIiBhbmQgdGhlICJib2R5IiBvZiB0aGUgbWVzc2FnZSBhbmQgc2VuZAorICAgICAgIHRoZW0gYXQgb25jZS4gKi8KKyAgICBpZiAobGVuZ3RoIDwgKDE2KjEwMjQpKSB7CisgICAgICAgIGNoYXIgKm1lc3NhZ2U7CiAKLQkJbWVzc2FnZSA9IFB5TWVtX01hbGxvYyhsZW5ndGgrNCk7Ci0JCWlmIChtZXNzYWdlID09IE5VTEwpCi0JCQlyZXR1cm4gTVBfTUVNT1JZX0VSUk9SOworICAgICAgICBtZXNzYWdlID0gUHlNZW1fTWFsbG9jKGxlbmd0aCs0KTsKKyAgICAgICAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBNUF9NRU1PUllfRVJST1I7CiAKLQkJKihVSU5UMzIqKW1lc3NhZ2UgPSBodG9ubCgoVUlOVDMyKWxlbmd0aCk7ICAgICAKLQkJbWVtY3B5KG1lc3NhZ2UrNCwgc3RyaW5nLCBsZW5ndGgpOwotCQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JCXJlcyA9IF9jb25uX3NlbmRhbGwoY29ubi0+aGFuZGxlLCBtZXNzYWdlLCBsZW5ndGgrNCk7Ci0JCVB5X0VORF9BTExPV19USFJFQURTCi0JCVB5TWVtX0ZyZWUobWVzc2FnZSk7Ci0JfSBlbHNlIHsKLQkJVUlOVDMyIGxlbmJ1ZmY7CisgICAgICAgICooVUlOVDMyKiltZXNzYWdlID0gaHRvbmwoKFVJTlQzMilsZW5ndGgpOworICAgICAgICBtZW1jcHkobWVzc2FnZSs0LCBzdHJpbmcsIGxlbmd0aCk7CisgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgcmVzID0gX2Nvbm5fc2VuZGFsbChjb25uLT5oYW5kbGUsIG1lc3NhZ2UsIGxlbmd0aCs0KTsKKyAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgUHlNZW1fRnJlZShtZXNzYWdlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBVSU5UMzIgbGVuYnVmZjsKIAotCQlpZiAobGVuZ3RoID4gTUFYX01FU1NBR0VfTEVOR1RIKQotCQkJcmV0dXJuIE1QX0JBRF9NRVNTQUdFX0xFTkdUSDsKKyAgICAgICAgaWYgKGxlbmd0aCA+IE1BWF9NRVNTQUdFX0xFTkdUSCkKKyAgICAgICAgICAgIHJldHVybiBNUF9CQURfTUVTU0FHRV9MRU5HVEg7CiAKLQkJbGVuYnVmZiA9IGh0b25sKChVSU5UMzIpbGVuZ3RoKTsKLQkJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCQlyZXMgPSBfY29ubl9zZW5kYWxsKGNvbm4tPmhhbmRsZSwgKGNoYXIqKSZsZW5idWZmLCA0KSB8fCAKLQkJCV9jb25uX3NlbmRhbGwoY29ubi0+aGFuZGxlLCBzdHJpbmcsIGxlbmd0aCk7Ci0JCVB5X0VORF9BTExPV19USFJFQURTCi0JfQotCXJldHVybiByZXM7CisgICAgICAgIGxlbmJ1ZmYgPSBodG9ubCgoVUlOVDMyKWxlbmd0aCk7CisgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgcmVzID0gX2Nvbm5fc2VuZGFsbChjb25uLT5oYW5kbGUsIChjaGFyKikmbGVuYnVmZiwgNCkgfHwKKyAgICAgICAgICAgIF9jb25uX3NlbmRhbGwoY29ubi0+aGFuZGxlLCBzdHJpbmcsIGxlbmd0aCk7CisgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgfQorICAgIHJldHVybiByZXM7CiB9CiAKIC8qCkBAIC0xMTQsMzggKzExNCwzOCBAQAogICovCiAKIHN0YXRpYyBQeV9zc2l6ZV90Ci1jb25uX3JlY3Zfc3RyaW5nKENvbm5lY3Rpb25PYmplY3QgKmNvbm4sIGNoYXIgKmJ1ZmZlciwgCi0JCSBzaXplX3QgYnVmbGVuZ3RoLCBjaGFyICoqbmV3YnVmZmVyLCBzaXplX3QgbWF4bGVuZ3RoKQorY29ubl9yZWN2X3N0cmluZyhDb25uZWN0aW9uT2JqZWN0ICpjb25uLCBjaGFyICpidWZmZXIsCisgICAgICAgICAgICAgICAgIHNpemVfdCBidWZsZW5ndGgsIGNoYXIgKipuZXdidWZmZXIsIHNpemVfdCBtYXhsZW5ndGgpCiB7Ci0JaW50IHJlczsKLQlVSU5UMzIgdWxlbmd0aDsKKyAgICBpbnQgcmVzOworICAgIFVJTlQzMiB1bGVuZ3RoOwogCi0JKm5ld2J1ZmZlciA9IE5VTEw7CisgICAgKm5ld2J1ZmZlciA9IE5VTEw7CiAKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JcmVzID0gX2Nvbm5fcmVjdmFsbChjb25uLT5oYW5kbGUsIChjaGFyKikmdWxlbmd0aCwgNCk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQlpZiAocmVzIDwgMCkKLQkJcmV0dXJuIHJlczsKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgcmVzID0gX2Nvbm5fcmVjdmFsbChjb25uLT5oYW5kbGUsIChjaGFyKikmdWxlbmd0aCwgNCk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBpZiAocmVzIDwgMCkKKyAgICAgICAgcmV0dXJuIHJlczsKIAotCXVsZW5ndGggPSBudG9obCh1bGVuZ3RoKTsKLQlpZiAodWxlbmd0aCA+IG1heGxlbmd0aCkKLQkJcmV0dXJuIE1QX0JBRF9NRVNTQUdFX0xFTkdUSDsKKyAgICB1bGVuZ3RoID0gbnRvaGwodWxlbmd0aCk7CisgICAgaWYgKHVsZW5ndGggPiBtYXhsZW5ndGgpCisgICAgICAgIHJldHVybiBNUF9CQURfTUVTU0FHRV9MRU5HVEg7CiAKLQlpZiAodWxlbmd0aCA8PSBidWZsZW5ndGgpIHsKLQkJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCQlyZXMgPSBfY29ubl9yZWN2YWxsKGNvbm4tPmhhbmRsZSwgYnVmZmVyLCAoc2l6ZV90KXVsZW5ndGgpOwotCQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCQlyZXR1cm4gcmVzIDwgMCA/IHJlcyA6IHVsZW5ndGg7Ci0JfSBlbHNlIHsKLQkJKm5ld2J1ZmZlciA9IFB5TWVtX01hbGxvYygoc2l6ZV90KXVsZW5ndGgpOwotCQlpZiAoKm5ld2J1ZmZlciA9PSBOVUxMKQotCQkJcmV0dXJuIE1QX01FTU9SWV9FUlJPUjsKLQkJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCQlyZXMgPSBfY29ubl9yZWN2YWxsKGNvbm4tPmhhbmRsZSwgKm5ld2J1ZmZlciwgKHNpemVfdCl1bGVuZ3RoKTsKLQkJUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQkJcmV0dXJuIHJlcyA8IDAgPyAoUHlfc3NpemVfdClyZXMgOiAoUHlfc3NpemVfdCl1bGVuZ3RoOwotCX0KKyAgICBpZiAodWxlbmd0aCA8PSBidWZsZW5ndGgpIHsKKyAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICByZXMgPSBfY29ubl9yZWN2YWxsKGNvbm4tPmhhbmRsZSwgYnVmZmVyLCAoc2l6ZV90KXVsZW5ndGgpOworICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgICAgICByZXR1cm4gcmVzIDwgMCA/IHJlcyA6IHVsZW5ndGg7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKm5ld2J1ZmZlciA9IFB5TWVtX01hbGxvYygoc2l6ZV90KXVsZW5ndGgpOworICAgICAgICBpZiAoKm5ld2J1ZmZlciA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE1QX01FTU9SWV9FUlJPUjsKKyAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICByZXMgPSBfY29ubl9yZWN2YWxsKGNvbm4tPmhhbmRsZSwgKm5ld2J1ZmZlciwgKHNpemVfdCl1bGVuZ3RoKTsKKyAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgcmV0dXJuIHJlcyA8IDAgPyAoUHlfc3NpemVfdClyZXMgOiAoUHlfc3NpemVfdCl1bGVuZ3RoOworICAgIH0KIH0KIAogLyoKQEAgLTE1NSw0MSArMTU1LDQxIEBACiBzdGF0aWMgaW50CiBjb25uX3BvbGwoQ29ubmVjdGlvbk9iamVjdCAqY29ubiwgZG91YmxlIHRpbWVvdXQsIFB5VGhyZWFkU3RhdGUgKl9zYXZlKQogewotCWludCByZXM7Ci0JZmRfc2V0IHJmZHM7CisgICAgaW50IHJlczsKKyAgICBmZF9zZXQgcmZkczsKIAotCS8qCi0JICogVmVyaWZ5IHRoZSBoYW5kbGUsIGlzc3VlIDMzMjEuIE5vdCByZXF1aXJlZCBmb3Igd2luZG93cy4KLQkgKi8gCi0JI2lmbmRlZiBNU19XSU5ET1dTCi0JCWlmICgoKGludCljb25uLT5oYW5kbGUpIDwgMCB8fCAoKGludCljb25uLT5oYW5kbGUpID49IEZEX1NFVFNJWkUpIHsKLQkJCVB5X0JMT0NLX1RIUkVBRFMKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JT0Vycm9yLCAiaGFuZGxlIG91dCBvZiByYW5nZSBpbiBzZWxlY3QoKSIpOwotCQkJUHlfVU5CTE9DS19USFJFQURTCi0JCQlyZXR1cm4gTVBfRVhDRVBUSU9OX0hBU19CRUVOX1NFVDsKLQkJfQotCSNlbmRpZgorICAgIC8qCisgICAgICogVmVyaWZ5IHRoZSBoYW5kbGUsIGlzc3VlIDMzMjEuIE5vdCByZXF1aXJlZCBmb3Igd2luZG93cy4KKyAgICAgKi8KKyAgICAjaWZuZGVmIE1TX1dJTkRPV1MKKyAgICAgICAgaWYgKCgoaW50KWNvbm4tPmhhbmRsZSkgPCAwIHx8ICgoaW50KWNvbm4tPmhhbmRsZSkgPj0gRkRfU0VUU0laRSkgeworICAgICAgICAgICAgUHlfQkxPQ0tfVEhSRUFEUworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0lPRXJyb3IsICJoYW5kbGUgb3V0IG9mIHJhbmdlIGluIHNlbGVjdCgpIik7CisgICAgICAgICAgICBQeV9VTkJMT0NLX1RIUkVBRFMKKyAgICAgICAgICAgIHJldHVybiBNUF9FWENFUFRJT05fSEFTX0JFRU5fU0VUOworICAgICAgICB9CisgICAgI2VuZGlmCiAKLQlGRF9aRVJPKCZyZmRzKTsKLQlGRF9TRVQoKFNPQ0tFVCljb25uLT5oYW5kbGUsICZyZmRzKTsKKyAgICBGRF9aRVJPKCZyZmRzKTsKKyAgICBGRF9TRVQoKFNPQ0tFVCljb25uLT5oYW5kbGUsICZyZmRzKTsKIAotCWlmICh0aW1lb3V0IDwgMC4wKSB7Ci0JCXJlcyA9IHNlbGVjdCgoaW50KWNvbm4tPmhhbmRsZSsxLCAmcmZkcywgTlVMTCwgTlVMTCwgTlVMTCk7Ci0JfSBlbHNlIHsKLQkJc3RydWN0IHRpbWV2YWwgdHY7Ci0JCXR2LnR2X3NlYyA9IChsb25nKXRpbWVvdXQ7Ci0JCXR2LnR2X3VzZWMgPSAobG9uZykoKHRpbWVvdXQgLSB0di50dl9zZWMpICogMWU2ICsgMC41KTsKLQkJcmVzID0gc2VsZWN0KChpbnQpY29ubi0+aGFuZGxlKzEsICZyZmRzLCBOVUxMLCBOVUxMLCAmdHYpOwotCX0KKyAgICBpZiAodGltZW91dCA8IDAuMCkgeworICAgICAgICByZXMgPSBzZWxlY3QoKGludCljb25uLT5oYW5kbGUrMSwgJnJmZHMsIE5VTEwsIE5VTEwsIE5VTEwpOworICAgIH0gZWxzZSB7CisgICAgICAgIHN0cnVjdCB0aW1ldmFsIHR2OworICAgICAgICB0di50dl9zZWMgPSAobG9uZyl0aW1lb3V0OworICAgICAgICB0di50dl91c2VjID0gKGxvbmcpKCh0aW1lb3V0IC0gdHYudHZfc2VjKSAqIDFlNiArIDAuNSk7CisgICAgICAgIHJlcyA9IHNlbGVjdCgoaW50KWNvbm4tPmhhbmRsZSsxLCAmcmZkcywgTlVMTCwgTlVMTCwgJnR2KTsKKyAgICB9CiAKLQlpZiAocmVzIDwgMCkgewotCQlyZXR1cm4gTVBfU09DS0VUX0VSUk9SOwotCX0gZWxzZSBpZiAoRkRfSVNTRVQoY29ubi0+aGFuZGxlLCAmcmZkcykpIHsKLQkJcmV0dXJuIFRSVUU7Ci0JfSBlbHNlIHsKLQkJYXNzZXJ0KHJlcyA9PSAwKTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KKyAgICBpZiAocmVzIDwgMCkgeworICAgICAgICByZXR1cm4gTVBfU09DS0VUX0VSUk9SOworICAgIH0gZWxzZSBpZiAoRkRfSVNTRVQoY29ubi0+aGFuZGxlLCAmcmZkcykpIHsKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXNzZXJ0KHJlcyA9PSAwKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KIH0KIAogLyoKZGlmZiAtLWdpdCBhL01vZHVsZXMvX211bHRpcHJvY2Vzc2luZy93aW4zMl9mdW5jdGlvbnMuYyBiL01vZHVsZXMvX211bHRpcHJvY2Vzc2luZy93aW4zMl9mdW5jdGlvbnMuYwppbmRleCA1NDljMTUxLi4xNjY2YWE5IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19tdWx0aXByb2Nlc3Npbmcvd2luMzJfZnVuY3Rpb25zLmMKKysrIGIvTW9kdWxlcy9fbXVsdGlwcm9jZXNzaW5nL3dpbjMyX2Z1bmN0aW9ucy5jCkBAIC0xOSwyNDggKzE5LDI0OCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHdpbjMyX0Nsb3NlSGFuZGxlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlIQU5ETEUgaE9iamVjdDsKLQlCT09MIHN1Y2Nlc3M7CisgICAgSEFORExFIGhPYmplY3Q7CisgICAgQk9PTCBzdWNjZXNzOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsIEZfSEFORExFLCAmaE9iamVjdCkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCBGX0hBTkRMRSwgJmhPYmplY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlzdWNjZXNzID0gQ2xvc2VIYW5kbGUoaE9iamVjdCk7IAotCVB5X0VORF9BTExPV19USFJFQURTCisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIHN1Y2Nlc3MgPSBDbG9zZUhhbmRsZShoT2JqZWN0KTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogCi0JaWYgKCFzdWNjZXNzKQotCQlyZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnIoMCk7CisgICAgaWYgKCFzdWNjZXNzKQorICAgICAgICByZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnIoMCk7CiAKLQlQeV9SRVRVUk5fTk9ORTsKKyAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHdpbjMyX0Nvbm5lY3ROYW1lZFBpcGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCUhBTkRMRSBoTmFtZWRQaXBlOwotCUxQT1ZFUkxBUFBFRCBscE92ZXJsYXBwZWQ7Ci0JQk9PTCBzdWNjZXNzOworICAgIEhBTkRMRSBoTmFtZWRQaXBlOworICAgIExQT1ZFUkxBUFBFRCBscE92ZXJsYXBwZWQ7CisgICAgQk9PTCBzdWNjZXNzOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsIEZfSEFORExFIEZfUE9JTlRFUiwgCi0JCQkgICAgICAmaE5hbWVkUGlwZSwgJmxwT3ZlcmxhcHBlZCkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCBGX0hBTkRMRSBGX1BPSU5URVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZoTmFtZWRQaXBlLCAmbHBPdmVybGFwcGVkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0Jc3VjY2VzcyA9IENvbm5lY3ROYW1lZFBpcGUoaE5hbWVkUGlwZSwgbHBPdmVybGFwcGVkKTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICBzdWNjZXNzID0gQ29ubmVjdE5hbWVkUGlwZShoTmFtZWRQaXBlLCBscE92ZXJsYXBwZWQpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCiAKLQlpZiAoIXN1Y2Nlc3MpCi0JCXJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0VycigwKTsKKyAgICBpZiAoIXN1Y2Nlc3MpCisgICAgICAgIHJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0VycigwKTsKIAotCVB5X1JFVFVSTl9OT05FOworICAgIFB5X1JFVFVSTl9OT05FOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogd2luMzJfQ3JlYXRlRmlsZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JTFBDVFNUUiBscEZpbGVOYW1lOwotCURXT1JEIGR3RGVzaXJlZEFjY2VzczsKLQlEV09SRCBkd1NoYXJlTW9kZTsKLQlMUFNFQ1VSSVRZX0FUVFJJQlVURVMgbHBTZWN1cml0eUF0dHJpYnV0ZXM7Ci0JRFdPUkQgZHdDcmVhdGlvbkRpc3Bvc2l0aW9uOwotCURXT1JEIGR3RmxhZ3NBbmRBdHRyaWJ1dGVzOwotCUhBTkRMRSBoVGVtcGxhdGVGaWxlOwotCUhBTkRMRSBoYW5kbGU7CisgICAgTFBDVFNUUiBscEZpbGVOYW1lOworICAgIERXT1JEIGR3RGVzaXJlZEFjY2VzczsKKyAgICBEV09SRCBkd1NoYXJlTW9kZTsKKyAgICBMUFNFQ1VSSVRZX0FUVFJJQlVURVMgbHBTZWN1cml0eUF0dHJpYnV0ZXM7CisgICAgRFdPUkQgZHdDcmVhdGlvbkRpc3Bvc2l0aW9uOworICAgIERXT1JEIGR3RmxhZ3NBbmRBdHRyaWJ1dGVzOworICAgIEhBTkRMRSBoVGVtcGxhdGVGaWxlOworICAgIEhBTkRMRSBoYW5kbGU7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMiIEZfRFdPUkQgRl9EV09SRCBGX1BPSU5URVIgCi0JCQkgICAgICBGX0RXT1JEIEZfRFdPUkQgRl9IQU5ETEUsCi0JCQkgICAgICAmbHBGaWxlTmFtZSwgJmR3RGVzaXJlZEFjY2VzcywgJmR3U2hhcmVNb2RlLCAKLQkJCSAgICAgICZscFNlY3VyaXR5QXR0cmlidXRlcywgJmR3Q3JlYXRpb25EaXNwb3NpdGlvbiwgCi0JCQkgICAgICAmZHdGbGFnc0FuZEF0dHJpYnV0ZXMsICZoVGVtcGxhdGVGaWxlKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIiBGX0RXT1JEIEZfRFdPUkQgRl9QT0lOVEVSCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZfRFdPUkQgRl9EV09SRCBGX0hBTkRMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmxwRmlsZU5hbWUsICZkd0Rlc2lyZWRBY2Nlc3MsICZkd1NoYXJlTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmxwU2VjdXJpdHlBdHRyaWJ1dGVzLCAmZHdDcmVhdGlvbkRpc3Bvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZHdGbGFnc0FuZEF0dHJpYnV0ZXMsICZoVGVtcGxhdGVGaWxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JaGFuZGxlID0gQ3JlYXRlRmlsZShscEZpbGVOYW1lLCBkd0Rlc2lyZWRBY2Nlc3MsIAotCQkJICAgIGR3U2hhcmVNb2RlLCBscFNlY3VyaXR5QXR0cmlidXRlcywgCi0JCQkgICAgZHdDcmVhdGlvbkRpc3Bvc2l0aW9uLCAKLQkJCSAgICBkd0ZsYWdzQW5kQXR0cmlidXRlcywgaFRlbXBsYXRlRmlsZSk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgaGFuZGxlID0gQ3JlYXRlRmlsZShscEZpbGVOYW1lLCBkd0Rlc2lyZWRBY2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICBkd1NoYXJlTW9kZSwgbHBTZWN1cml0eUF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBkd0NyZWF0aW9uRGlzcG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBkd0ZsYWdzQW5kQXR0cmlidXRlcywgaFRlbXBsYXRlRmlsZSk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKIAotCWlmIChoYW5kbGUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpCi0JCXJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0VycigwKTsKKyAgICBpZiAoaGFuZGxlID09IElOVkFMSURfSEFORExFX1ZBTFVFKQorICAgICAgICByZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnIoMCk7CiAKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZShGX0hBTkRMRSwgaGFuZGxlKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZShGX0hBTkRMRSwgaGFuZGxlKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHdpbjMyX0NyZWF0ZU5hbWVkUGlwZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JTFBDVFNUUiBscE5hbWU7Ci0JRFdPUkQgZHdPcGVuTW9kZTsKLQlEV09SRCBkd1BpcGVNb2RlOwotCURXT1JEIG5NYXhJbnN0YW5jZXM7Ci0JRFdPUkQgbk91dEJ1ZmZlclNpemU7Ci0JRFdPUkQgbkluQnVmZmVyU2l6ZTsKLQlEV09SRCBuRGVmYXVsdFRpbWVPdXQ7Ci0JTFBTRUNVUklUWV9BVFRSSUJVVEVTIGxwU2VjdXJpdHlBdHRyaWJ1dGVzOwotCUhBTkRMRSBoYW5kbGU7CisgICAgTFBDVFNUUiBscE5hbWU7CisgICAgRFdPUkQgZHdPcGVuTW9kZTsKKyAgICBEV09SRCBkd1BpcGVNb2RlOworICAgIERXT1JEIG5NYXhJbnN0YW5jZXM7CisgICAgRFdPUkQgbk91dEJ1ZmZlclNpemU7CisgICAgRFdPUkQgbkluQnVmZmVyU2l6ZTsKKyAgICBEV09SRCBuRGVmYXVsdFRpbWVPdXQ7CisgICAgTFBTRUNVUklUWV9BVFRSSUJVVEVTIGxwU2VjdXJpdHlBdHRyaWJ1dGVzOworICAgIEhBTkRMRSBoYW5kbGU7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMiIEZfRFdPUkQgRl9EV09SRCBGX0RXT1JEIAotCQkJICAgICAgRl9EV09SRCBGX0RXT1JEIEZfRFdPUkQgRl9QT0lOVEVSLAotCQkJICAgICAgJmxwTmFtZSwgJmR3T3Blbk1vZGUsICZkd1BpcGVNb2RlLCAKLQkJCSAgICAgICZuTWF4SW5zdGFuY2VzLCAmbk91dEJ1ZmZlclNpemUsIAotCQkJICAgICAgJm5JbkJ1ZmZlclNpemUsICZuRGVmYXVsdFRpbWVPdXQsCi0JCQkgICAgICAmbHBTZWN1cml0eUF0dHJpYnV0ZXMpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMiIEZfRFdPUkQgRl9EV09SRCBGX0RXT1JECisgICAgICAgICAgICAgICAgICAgICAgICAgIEZfRFdPUkQgRl9EV09SRCBGX0RXT1JEIEZfUE9JTlRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmxwTmFtZSwgJmR3T3Blbk1vZGUsICZkd1BpcGVNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbk1heEluc3RhbmNlcywgJm5PdXRCdWZmZXJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbkluQnVmZmVyU2l6ZSwgJm5EZWZhdWx0VGltZU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmxwU2VjdXJpdHlBdHRyaWJ1dGVzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JaGFuZGxlID0gQ3JlYXRlTmFtZWRQaXBlKGxwTmFtZSwgZHdPcGVuTW9kZSwgZHdQaXBlTW9kZSwgCi0JCQkJIG5NYXhJbnN0YW5jZXMsIG5PdXRCdWZmZXJTaXplLCAKLQkJCQkgbkluQnVmZmVyU2l6ZSwgbkRlZmF1bHRUaW1lT3V0LAotCQkJCSBscFNlY3VyaXR5QXR0cmlidXRlcyk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgaGFuZGxlID0gQ3JlYXRlTmFtZWRQaXBlKGxwTmFtZSwgZHdPcGVuTW9kZSwgZHdQaXBlTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbk1heEluc3RhbmNlcywgbk91dEJ1ZmZlclNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5JbkJ1ZmZlclNpemUsIG5EZWZhdWx0VGltZU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBTZWN1cml0eUF0dHJpYnV0ZXMpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCiAKLQlpZiAoaGFuZGxlID09IElOVkFMSURfSEFORExFX1ZBTFVFKQotCQlyZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnIoMCk7CisgICAgaWYgKGhhbmRsZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkKKyAgICAgICAgcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyKDApOwogCi0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoRl9IQU5ETEUsIGhhbmRsZSk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoRl9IQU5ETEUsIGhhbmRsZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB3aW4zMl9FeGl0UHJvY2VzcyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JVUlOVCB1RXhpdENvZGU7CisgICAgVUlOVCB1RXhpdENvZGU7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIkkiLCAmdUV4aXRDb2RlKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJJIiwgJnVFeGl0Q29kZSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JI2lmIGRlZmluZWQoUHlfREVCVUcpCi0JCVNldEVycm9yTW9kZShTRU1fRkFJTENSSVRJQ0FMRVJST1JTfFNFTV9OT0FMSUdOTUVOVEZBVUxURVhDRVBUfFNFTV9OT0dQRkFVTFRFUlJPUkJPWHxTRU1fTk9PUEVORklMRUVSUk9SQk9YKTsKLQkJX0NydFNldFJlcG9ydE1vZGUoX0NSVF9BU1NFUlQsIF9DUlREQkdfTU9ERV9ERUJVRyk7Ci0JI2VuZGlmCisgICAgI2lmIGRlZmluZWQoUHlfREVCVUcpCisgICAgICAgIFNldEVycm9yTW9kZShTRU1fRkFJTENSSVRJQ0FMRVJST1JTfFNFTV9OT0FMSUdOTUVOVEZBVUxURVhDRVBUfFNFTV9OT0dQRkFVTFRFUlJPUkJPWHxTRU1fTk9PUEVORklMRUVSUk9SQk9YKTsKKyAgICAgICAgX0NydFNldFJlcG9ydE1vZGUoX0NSVF9BU1NFUlQsIF9DUlREQkdfTU9ERV9ERUJVRyk7CisgICAgI2VuZGlmCiAKIAotCUV4aXRQcm9jZXNzKHVFeGl0Q29kZSk7CisgICAgRXhpdFByb2Nlc3ModUV4aXRDb2RlKTsKIAotCXJldHVybiBOVUxMOworICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogd2luMzJfR2V0TGFzdEVycm9yKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZShGX0RXT1JELCBHZXRMYXN0RXJyb3IoKSk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoRl9EV09SRCwgR2V0TGFzdEVycm9yKCkpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogd2luMzJfT3BlblByb2Nlc3MoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCURXT1JEIGR3RGVzaXJlZEFjY2VzczsKLQlCT09MIGJJbmhlcml0SGFuZGxlOwotCURXT1JEIGR3UHJvY2Vzc0lkOwotCUhBTkRMRSBoYW5kbGU7CisgICAgRFdPUkQgZHdEZXNpcmVkQWNjZXNzOworICAgIEJPT0wgYkluaGVyaXRIYW5kbGU7CisgICAgRFdPUkQgZHdQcm9jZXNzSWQ7CisgICAgSEFORExFIGhhbmRsZTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCBGX0RXT1JEICJpIiBGX0RXT1JELCAKLQkJCSAgICAgICZkd0Rlc2lyZWRBY2Nlc3MsICZiSW5oZXJpdEhhbmRsZSwgJmR3UHJvY2Vzc0lkKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsIEZfRFdPUkQgImkiIEZfRFdPUkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkd0Rlc2lyZWRBY2Nlc3MsICZiSW5oZXJpdEhhbmRsZSwgJmR3UHJvY2Vzc0lkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQloYW5kbGUgPSBPcGVuUHJvY2Vzcyhkd0Rlc2lyZWRBY2Nlc3MsIGJJbmhlcml0SGFuZGxlLCBkd1Byb2Nlc3NJZCk7ICAgIAotCWlmIChoYW5kbGUgPT0gTlVMTCkKLQkJcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyKDApOworICAgIGhhbmRsZSA9IE9wZW5Qcm9jZXNzKGR3RGVzaXJlZEFjY2VzcywgYkluaGVyaXRIYW5kbGUsIGR3UHJvY2Vzc0lkKTsKKyAgICBpZiAoaGFuZGxlID09IE5VTEwpCisgICAgICAgIHJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0VycigwKTsKIAotCXJldHVybiBQeV9CdWlsZFZhbHVlKEZfSEFORExFLCBoYW5kbGUpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKEZfSEFORExFLCBoYW5kbGUpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogd2luMzJfU2V0TmFtZWRQaXBlSGFuZGxlU3RhdGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCUhBTkRMRSBoTmFtZWRQaXBlOwotCVB5T2JqZWN0ICpvQXJnc1szXTsKLQlEV09SRCBkd0FyZ3NbM10sICpwQXJnc1szXSA9IHtOVUxMLCBOVUxMLCBOVUxMfTsKLQlpbnQgaTsKKyAgICBIQU5ETEUgaE5hbWVkUGlwZTsKKyAgICBQeU9iamVjdCAqb0FyZ3NbM107CisgICAgRFdPUkQgZHdBcmdzWzNdLCAqcEFyZ3NbM10gPSB7TlVMTCwgTlVMTCwgTlVMTH07CisgICAgaW50IGk7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgRl9IQU5ETEUgIk9PTyIsIAotCQkJICAgICAgJmhOYW1lZFBpcGUsICZvQXJnc1swXSwgJm9BcmdzWzFdLCAmb0FyZ3NbMl0pKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgRl9IQU5ETEUgIk9PTyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZoTmFtZWRQaXBlLCAmb0FyZ3NbMF0sICZvQXJnc1sxXSwgJm9BcmdzWzJdKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlQeUVycl9DbGVhcigpOworICAgIFB5RXJyX0NsZWFyKCk7CiAKLQlmb3IgKGkgPSAwIDsgaSA8IDMgOyBpKyspIHsKLQkJaWYgKG9BcmdzW2ldICE9IFB5X05vbmUpIHsKLQkJCWR3QXJnc1tpXSA9IFB5SW50X0FzVW5zaWduZWRMb25nTWFzayhvQXJnc1tpXSk7Ci0JCQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCXBBcmdzW2ldID0gJmR3QXJnc1tpXTsKLQkJfQotCX0KKyAgICBmb3IgKGkgPSAwIDsgaSA8IDMgOyBpKyspIHsKKyAgICAgICAgaWYgKG9BcmdzW2ldICE9IFB5X05vbmUpIHsKKyAgICAgICAgICAgIGR3QXJnc1tpXSA9IFB5SW50X0FzVW5zaWduZWRMb25nTWFzayhvQXJnc1tpXSk7CisgICAgICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIHBBcmdzW2ldID0gJmR3QXJnc1tpXTsKKyAgICAgICAgfQorICAgIH0KIAotCWlmICghU2V0TmFtZWRQaXBlSGFuZGxlU3RhdGUoaE5hbWVkUGlwZSwgcEFyZ3NbMF0sIHBBcmdzWzFdLCBwQXJnc1syXSkpCi0JCXJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0VycigwKTsKKyAgICBpZiAoIVNldE5hbWVkUGlwZUhhbmRsZVN0YXRlKGhOYW1lZFBpcGUsIHBBcmdzWzBdLCBwQXJnc1sxXSwgcEFyZ3NbMl0pKQorICAgICAgICByZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnIoMCk7CiAKLQlQeV9SRVRVUk5fTk9ORTsKKyAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHdpbjMyX1dhaXROYW1lZFBpcGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCUxQQ1RTVFIgbHBOYW1lZFBpcGVOYW1lOwotCURXT1JEIG5UaW1lT3V0OwotCUJPT0wgc3VjY2VzczsKKyAgICBMUENUU1RSIGxwTmFtZWRQaXBlTmFtZTsKKyAgICBEV09SRCBuVGltZU91dDsKKyAgICBCT09MIHN1Y2Nlc3M7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMiIEZfRFdPUkQsICZscE5hbWVkUGlwZU5hbWUsICZuVGltZU91dCkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyIgRl9EV09SRCwgJmxwTmFtZWRQaXBlTmFtZSwgJm5UaW1lT3V0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0Jc3VjY2VzcyA9IFdhaXROYW1lZFBpcGUobHBOYW1lZFBpcGVOYW1lLCBuVGltZU91dCk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgc3VjY2VzcyA9IFdhaXROYW1lZFBpcGUobHBOYW1lZFBpcGVOYW1lLCBuVGltZU91dCk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKIAotCWlmICghc3VjY2VzcykKLQkJcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyKDApOworICAgIGlmICghc3VjY2VzcykKKyAgICAgICAgcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyKDApOwogCi0JUHlfUkVUVVJOX05PTkU7CisgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiB3aW4zMl9tZXRob2RzW10gPSB7Ci0JV0lOMzJfRlVOQ1RJT04oQ2xvc2VIYW5kbGUpLAotCVdJTjMyX0ZVTkNUSU9OKEdldExhc3RFcnJvciksCi0JV0lOMzJfRlVOQ1RJT04oT3BlblByb2Nlc3MpLAotCVdJTjMyX0ZVTkNUSU9OKEV4aXRQcm9jZXNzKSwKLQlXSU4zMl9GVU5DVElPTihDb25uZWN0TmFtZWRQaXBlKSwKLQlXSU4zMl9GVU5DVElPTihDcmVhdGVGaWxlKSwKLQlXSU4zMl9GVU5DVElPTihDcmVhdGVOYW1lZFBpcGUpLAotCVdJTjMyX0ZVTkNUSU9OKFNldE5hbWVkUGlwZUhhbmRsZVN0YXRlKSwKLQlXSU4zMl9GVU5DVElPTihXYWl0TmFtZWRQaXBlKSwKLQl7TlVMTH0KKyAgICBXSU4zMl9GVU5DVElPTihDbG9zZUhhbmRsZSksCisgICAgV0lOMzJfRlVOQ1RJT04oR2V0TGFzdEVycm9yKSwKKyAgICBXSU4zMl9GVU5DVElPTihPcGVuUHJvY2VzcyksCisgICAgV0lOMzJfRlVOQ1RJT04oRXhpdFByb2Nlc3MpLAorICAgIFdJTjMyX0ZVTkNUSU9OKENvbm5lY3ROYW1lZFBpcGUpLAorICAgIFdJTjMyX0ZVTkNUSU9OKENyZWF0ZUZpbGUpLAorICAgIFdJTjMyX0ZVTkNUSU9OKENyZWF0ZU5hbWVkUGlwZSksCisgICAgV0lOMzJfRlVOQ1RJT04oU2V0TmFtZWRQaXBlSGFuZGxlU3RhdGUpLAorICAgIFdJTjMyX0ZVTkNUSU9OKFdhaXROYW1lZFBpcGUpLAorICAgIHtOVUxMfQogfTsKIAogCiBQeVR5cGVPYmplY3QgV2luMzJUeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQorICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQogfTsKIAogCiBQeU9iamVjdCAqCiBjcmVhdGVfd2luMzJfbmFtZXNwYWNlKHZvaWQpCiB7Ci0JV2luMzJUeXBlLnRwX25hbWUgPSAiX211bHRpcHJvY2Vzc2luZy53aW4zMiI7Ci0JV2luMzJUeXBlLnRwX21ldGhvZHMgPSB3aW4zMl9tZXRob2RzOwotCWlmIChQeVR5cGVfUmVhZHkoJldpbjMyVHlwZSkgPCAwKQotCQlyZXR1cm4gTlVMTDsKLQlQeV9JTkNSRUYoJldpbjMyVHlwZSk7CisgICAgV2luMzJUeXBlLnRwX25hbWUgPSAiX211bHRpcHJvY2Vzc2luZy53aW4zMiI7CisgICAgV2luMzJUeXBlLnRwX21ldGhvZHMgPSB3aW4zMl9tZXRob2RzOworICAgIGlmIChQeVR5cGVfUmVhZHkoJldpbjMyVHlwZSkgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQeV9JTkNSRUYoJldpbjMyVHlwZSk7CiAKLQlXSU4zMl9DT05TVEFOVChGX0RXT1JELCBFUlJPUl9BTFJFQURZX0VYSVNUUyk7Ci0JV0lOMzJfQ09OU1RBTlQoRl9EV09SRCwgRVJST1JfUElQRV9CVVNZKTsKLQlXSU4zMl9DT05TVEFOVChGX0RXT1JELCBFUlJPUl9QSVBFX0NPTk5FQ1RFRCk7Ci0JV0lOMzJfQ09OU1RBTlQoRl9EV09SRCwgRVJST1JfU0VNX1RJTUVPVVQpOwotCVdJTjMyX0NPTlNUQU5UKEZfRFdPUkQsIEdFTkVSSUNfUkVBRCk7Ci0JV0lOMzJfQ09OU1RBTlQoRl9EV09SRCwgR0VORVJJQ19XUklURSk7Ci0JV0lOMzJfQ09OU1RBTlQoRl9EV09SRCwgSU5GSU5JVEUpOwotCVdJTjMyX0NPTlNUQU5UKEZfRFdPUkQsIE5NUFdBSVRfV0FJVF9GT1JFVkVSKTsKLQlXSU4zMl9DT05TVEFOVChGX0RXT1JELCBPUEVOX0VYSVNUSU5HKTsKLQlXSU4zMl9DT05TVEFOVChGX0RXT1JELCBQSVBFX0FDQ0VTU19EVVBMRVgpOwotCVdJTjMyX0NPTlNUQU5UKEZfRFdPUkQsIFBJUEVfQUNDRVNTX0lOQk9VTkQpOwotCVdJTjMyX0NPTlNUQU5UKEZfRFdPUkQsIFBJUEVfUkVBRE1PREVfTUVTU0FHRSk7Ci0JV0lOMzJfQ09OU1RBTlQoRl9EV09SRCwgUElQRV9UWVBFX01FU1NBR0UpOwotCVdJTjMyX0NPTlNUQU5UKEZfRFdPUkQsIFBJUEVfVU5MSU1JVEVEX0lOU1RBTkNFUyk7Ci0JV0lOMzJfQ09OU1RBTlQoRl9EV09SRCwgUElQRV9XQUlUKTsKLQlXSU4zMl9DT05TVEFOVChGX0RXT1JELCBQUk9DRVNTX0FMTF9BQ0NFU1MpOworICAgIFdJTjMyX0NPTlNUQU5UKEZfRFdPUkQsIEVSUk9SX0FMUkVBRFlfRVhJU1RTKTsKKyAgICBXSU4zMl9DT05TVEFOVChGX0RXT1JELCBFUlJPUl9QSVBFX0JVU1kpOworICAgIFdJTjMyX0NPTlNUQU5UKEZfRFdPUkQsIEVSUk9SX1BJUEVfQ09OTkVDVEVEKTsKKyAgICBXSU4zMl9DT05TVEFOVChGX0RXT1JELCBFUlJPUl9TRU1fVElNRU9VVCk7CisgICAgV0lOMzJfQ09OU1RBTlQoRl9EV09SRCwgR0VORVJJQ19SRUFEKTsKKyAgICBXSU4zMl9DT05TVEFOVChGX0RXT1JELCBHRU5FUklDX1dSSVRFKTsKKyAgICBXSU4zMl9DT05TVEFOVChGX0RXT1JELCBJTkZJTklURSk7CisgICAgV0lOMzJfQ09OU1RBTlQoRl9EV09SRCwgTk1QV0FJVF9XQUlUX0ZPUkVWRVIpOworICAgIFdJTjMyX0NPTlNUQU5UKEZfRFdPUkQsIE9QRU5fRVhJU1RJTkcpOworICAgIFdJTjMyX0NPTlNUQU5UKEZfRFdPUkQsIFBJUEVfQUNDRVNTX0RVUExFWCk7CisgICAgV0lOMzJfQ09OU1RBTlQoRl9EV09SRCwgUElQRV9BQ0NFU1NfSU5CT1VORCk7CisgICAgV0lOMzJfQ09OU1RBTlQoRl9EV09SRCwgUElQRV9SRUFETU9ERV9NRVNTQUdFKTsKKyAgICBXSU4zMl9DT05TVEFOVChGX0RXT1JELCBQSVBFX1RZUEVfTUVTU0FHRSk7CisgICAgV0lOMzJfQ09OU1RBTlQoRl9EV09SRCwgUElQRV9VTkxJTUlURURfSU5TVEFOQ0VTKTsKKyAgICBXSU4zMl9DT05TVEFOVChGX0RXT1JELCBQSVBFX1dBSVQpOworICAgIFdJTjMyX0NPTlNUQU5UKEZfRFdPUkQsIFBST0NFU1NfQUxMX0FDQ0VTUyk7CiAKLQlXSU4zMl9DT05TVEFOVCgiaSIsIE5VTEwpOworICAgIFdJTjMyX0NPTlNUQU5UKCJpIiwgTlVMTCk7CiAKLQlyZXR1cm4gKFB5T2JqZWN0KikmV2luMzJUeXBlOworICAgIHJldHVybiAoUHlPYmplY3QqKSZXaW4zMlR5cGU7CiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19yYW5kb21tb2R1bGUuYyBiL01vZHVsZXMvX3JhbmRvbW1vZHVsZS5jCmluZGV4IGI0NWYyNDMuLjJkODFkYWYgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX3JhbmRvbW1vZHVsZS5jCisrKyBiL01vZHVsZXMvX3JhbmRvbW1vZHVsZS5jCkBAIC0yLDIzICsyLDIzIEBACiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgVGhlIGNvZGUgaW4gdGhpcyBtb2R1bGUgd2FzIGJhc2VkIG9uIGEgZG93bmxvYWQgZnJvbToKLQkgIGh0dHA6Ly93d3cubWF0aC5rZWlvLmFjLmpwL35tYXR1bW90by9NVDIwMDIvZW10MTk5Mzdhci5odG1sCisgICAgICBodHRwOi8vd3d3Lm1hdGgua2Vpby5hYy5qcC9+bWF0dW1vdG8vTVQyMDAyL2VtdDE5OTM3YXIuaHRtbAogCiAgICBJdCB3YXMgbW9kaWZpZWQgaW4gMjAwMiBieSBSYXltb25kIEhldHRpbmdlciBhcyBmb2xsb3dzOgogCi0JKiB0aGUgcHJpbmNpcGFsIGNvbXB1dGF0aW9uYWwgbGluZXMgdW50b3VjaGVkIGV4Y2VwdCBmb3IgdGFiYmluZy4KKyAgICAqIHRoZSBwcmluY2lwYWwgY29tcHV0YXRpb25hbCBsaW5lcyB1bnRvdWNoZWQgZXhjZXB0IGZvciB0YWJiaW5nLgogCi0JKiByZW5hbWVkIGdlbnJhbmRfcmVzNTMoKSB0byByYW5kb21fcmFuZG9tKCkgYW5kIHdyYXBwZWQKLQkgIGluIHB5dGhvbiBjYWxsaW5nL3JldHVybiBjb2RlLgorICAgICogcmVuYW1lZCBnZW5yYW5kX3JlczUzKCkgdG8gcmFuZG9tX3JhbmRvbSgpIGFuZCB3cmFwcGVkCisgICAgICBpbiBweXRob24gY2FsbGluZy9yZXR1cm4gY29kZS4KIAotCSogZ2VucmFuZF9pbnQzMigpIGFuZCB0aGUgaGVscGVyIGZ1bmN0aW9ucywgaW5pdF9nZW5yYW5kKCkKLQkgIGFuZCBpbml0X2J5X2FycmF5KCksIHdlcmUgZGVjbGFyZWQgc3RhdGljLCB3cmFwcGVkIGluCi0JICBQeXRob24gY2FsbGluZy9yZXR1cm4gY29kZS4gIGFsc28sIHRoZWlyIGdsb2JhbCBkYXRhCi0JICByZWZlcmVuY2VzIHdlcmUgcmVwbGFjZWQgd2l0aCBzdHJ1Y3R1cmUgcmVmZXJlbmNlcy4KKyAgICAqIGdlbnJhbmRfaW50MzIoKSBhbmQgdGhlIGhlbHBlciBmdW5jdGlvbnMsIGluaXRfZ2VucmFuZCgpCisgICAgICBhbmQgaW5pdF9ieV9hcnJheSgpLCB3ZXJlIGRlY2xhcmVkIHN0YXRpYywgd3JhcHBlZCBpbgorICAgICAgUHl0aG9uIGNhbGxpbmcvcmV0dXJuIGNvZGUuICBhbHNvLCB0aGVpciBnbG9iYWwgZGF0YQorICAgICAgcmVmZXJlbmNlcyB3ZXJlIHJlcGxhY2VkIHdpdGggc3RydWN0dXJlIHJlZmVyZW5jZXMuCiAKLQkqIHVudXNlZCBmdW5jdGlvbnMgZnJvbSB0aGUgb3JpZ2luYWwgd2VyZSBkZWxldGVkLgotCSAgbmV3LCBvcmlnaW5hbCBDIHB5dGhvbiBjb2RlIHdhcyBhZGRlZCB0byBpbXBsZW1lbnQgdGhlCi0JICBSYW5kb20oKSBpbnRlcmZhY2UuCisgICAgKiB1bnVzZWQgZnVuY3Rpb25zIGZyb20gdGhlIG9yaWdpbmFsIHdlcmUgZGVsZXRlZC4KKyAgICAgIG5ldywgb3JpZ2luYWwgQyBweXRob24gY29kZSB3YXMgYWRkZWQgdG8gaW1wbGVtZW50IHRoZQorICAgICAgUmFuZG9tKCkgaW50ZXJmYWNlLgogCiAgICBUaGUgZm9sbG93aW5nIGFyZSB0aGUgdmVyYmF0aW0gY29tbWVudHMgZnJvbSB0aGUgb3JpZ2luYWwgY29kZToKIApAQCAtMzYsMTUgKzM2LDE1IEBACiAgICBhcmUgbWV0OgogCiAgICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0Jbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KIAogICAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotCW5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLQlkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgogCiAgICAgIDMuIFRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKLQlwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4KLQlwZXJtaXNzaW9uLgorICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbgorICAgIHBlcm1pc3Npb24uCiAKICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCkBAIC02NywyNCArNjcsMjQgQEAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKICNpbmNsdWRlICJQeXRob24uaCIKLSNpbmNsdWRlIDx0aW1lLmg+CQkvKiBmb3Igc2VlZGluZyB0byBjdXJyZW50IHRpbWUgKi8KKyNpbmNsdWRlIDx0aW1lLmg+ICAgICAgICAgICAgICAgLyogZm9yIHNlZWRpbmcgdG8gY3VycmVudCB0aW1lICovCiAKIC8qIFBlcmlvZCBwYXJhbWV0ZXJzIC0tIFRoZXNlIGFyZSBhbGwgbWFnaWMuICBEb24ndCBjaGFuZ2UuICovCiAjZGVmaW5lIE4gNjI0CiAjZGVmaW5lIE0gMzk3Ci0jZGVmaW5lIE1BVFJJWF9BIDB4OTkwOGIwZGZVTAkvKiBjb25zdGFudCB2ZWN0b3IgYSAqLworI2RlZmluZSBNQVRSSVhfQSAweDk5MDhiMGRmVUwgICAvKiBjb25zdGFudCB2ZWN0b3IgYSAqLwogI2RlZmluZSBVUFBFUl9NQVNLIDB4ODAwMDAwMDBVTCAvKiBtb3N0IHNpZ25pZmljYW50IHctciBiaXRzICovCiAjZGVmaW5lIExPV0VSX01BU0sgMHg3ZmZmZmZmZlVMIC8qIGxlYXN0IHNpZ25pZmljYW50IHIgYml0cyAqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCXVuc2lnbmVkIGxvbmcgc3RhdGVbTl07Ci0JaW50IGluZGV4OworICAgIFB5T2JqZWN0X0hFQUQKKyAgICB1bnNpZ25lZCBsb25nIHN0YXRlW05dOworICAgIGludCBpbmRleDsKIH0gUmFuZG9tT2JqZWN0OwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IFJhbmRvbV9UeXBlOwogCi0jZGVmaW5lIFJhbmRvbU9iamVjdF9DaGVjayh2KQkgICAoUHlfVFlQRSh2KSA9PSAmUmFuZG9tX1R5cGUpCisjZGVmaW5lIFJhbmRvbU9iamVjdF9DaGVjayh2KSAgICAgIChQeV9UWVBFKHYpID09ICZSYW5kb21fVHlwZSkKIAogCiAvKiBSYW5kb20gbWV0aG9kcyAqLwpAQCAtOTQsMjggKzk0LDI4IEBACiBzdGF0aWMgdW5zaWduZWQgbG9uZwogZ2VucmFuZF9pbnQzMihSYW5kb21PYmplY3QgKnNlbGYpCiB7Ci0JdW5zaWduZWQgbG9uZyB5OwotCXN0YXRpYyB1bnNpZ25lZCBsb25nIG1hZzAxWzJdPXsweDBVTCwgTUFUUklYX0F9OwotCS8qIG1hZzAxW3hdID0geCAqIE1BVFJJWF9BICBmb3IgeD0wLDEgKi8KLQl1bnNpZ25lZCBsb25nICptdDsKKyAgICB1bnNpZ25lZCBsb25nIHk7CisgICAgc3RhdGljIHVuc2lnbmVkIGxvbmcgbWFnMDFbMl09ezB4MFVMLCBNQVRSSVhfQX07CisgICAgLyogbWFnMDFbeF0gPSB4ICogTUFUUklYX0EgIGZvciB4PTAsMSAqLworICAgIHVuc2lnbmVkIGxvbmcgKm10OwogCi0JbXQgPSBzZWxmLT5zdGF0ZTsKLQlpZiAoc2VsZi0+aW5kZXggPj0gTikgeyAvKiBnZW5lcmF0ZSBOIHdvcmRzIGF0IG9uZSB0aW1lICovCi0JCWludCBrazsKKyAgICBtdCA9IHNlbGYtPnN0YXRlOworICAgIGlmIChzZWxmLT5pbmRleCA+PSBOKSB7IC8qIGdlbmVyYXRlIE4gd29yZHMgYXQgb25lIHRpbWUgKi8KKyAgICAgICAgaW50IGtrOwogCi0JCWZvciAoa2s9MDtrazxOLU07a2srKykgewotCQkJeSA9IChtdFtra10mVVBQRVJfTUFTSyl8KG10W2trKzFdJkxPV0VSX01BU0spOwotCQkJbXRba2tdID0gbXRba2srTV0gXiAoeSA+PiAxKSBeIG1hZzAxW3kgJiAweDFVTF07Ci0JCX0KLQkJZm9yICg7a2s8Ti0xO2trKyspIHsKLQkJCXkgPSAobXRba2tdJlVQUEVSX01BU0spfChtdFtraysxXSZMT1dFUl9NQVNLKTsKLQkJCW10W2trXSA9IG10W2trKyhNLU4pXSBeICh5ID4+IDEpIF4gbWFnMDFbeSAmIDB4MVVMXTsKLQkJfQotCQl5ID0gKG10W04tMV0mVVBQRVJfTUFTSyl8KG10WzBdJkxPV0VSX01BU0spOwotCQltdFtOLTFdID0gbXRbTS0xXSBeICh5ID4+IDEpIF4gbWFnMDFbeSAmIDB4MVVMXTsKKyAgICAgICAgZm9yIChraz0wO2trPE4tTTtraysrKSB7CisgICAgICAgICAgICB5ID0gKG10W2trXSZVUFBFUl9NQVNLKXwobXRba2srMV0mTE9XRVJfTUFTSyk7CisgICAgICAgICAgICBtdFtra10gPSBtdFtraytNXSBeICh5ID4+IDEpIF4gbWFnMDFbeSAmIDB4MVVMXTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKDtrazxOLTE7a2srKykgeworICAgICAgICAgICAgeSA9IChtdFtra10mVVBQRVJfTUFTSyl8KG10W2trKzFdJkxPV0VSX01BU0spOworICAgICAgICAgICAgbXRba2tdID0gbXRba2srKE0tTildIF4gKHkgPj4gMSkgXiBtYWcwMVt5ICYgMHgxVUxdOworICAgICAgICB9CisgICAgICAgIHkgPSAobXRbTi0xXSZVUFBFUl9NQVNLKXwobXRbMF0mTE9XRVJfTUFTSyk7CisgICAgICAgIG10W04tMV0gPSBtdFtNLTFdIF4gKHkgPj4gMSkgXiBtYWcwMVt5ICYgMHgxVUxdOwogCi0JCXNlbGYtPmluZGV4ID0gMDsKLQl9CisgICAgICAgIHNlbGYtPmluZGV4ID0gMDsKKyAgICB9CiAKICAgICB5ID0gbXRbc2VsZi0+aW5kZXgrK107CiAgICAgeSBePSAoeSA+PiAxMSk7CkBAIC0xMzcsMzEgKzEzNywzMSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHJhbmRvbV9yYW5kb20oUmFuZG9tT2JqZWN0ICpzZWxmKQogewotCXVuc2lnbmVkIGxvbmcgYT1nZW5yYW5kX2ludDMyKHNlbGYpPj41LCBiPWdlbnJhbmRfaW50MzIoc2VsZik+PjY7Ci0gICAgCXJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoKGEqNjcxMDg4NjQuMCtiKSooMS4wLzkwMDcxOTkyNTQ3NDA5OTIuMCkpOworICAgIHVuc2lnbmVkIGxvbmcgYT1nZW5yYW5kX2ludDMyKHNlbGYpPj41LCBiPWdlbnJhbmRfaW50MzIoc2VsZik+PjY7CisgICAgcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZSgoYSo2NzEwODg2NC4wK2IpKigxLjAvOTAwNzE5OTI1NDc0MDk5Mi4wKSk7CiB9CiAKIC8qIGluaXRpYWxpemVzIG10W05dIHdpdGggYSBzZWVkICovCiBzdGF0aWMgdm9pZAogaW5pdF9nZW5yYW5kKFJhbmRvbU9iamVjdCAqc2VsZiwgdW5zaWduZWQgbG9uZyBzKQogewotCWludCBtdGk7Ci0JdW5zaWduZWQgbG9uZyAqbXQ7CisgICAgaW50IG10aTsKKyAgICB1bnNpZ25lZCBsb25nICptdDsKIAotCW10ID0gc2VsZi0+c3RhdGU7Ci0JbXRbMF09IHMgJiAweGZmZmZmZmZmVUw7Ci0JZm9yIChtdGk9MTsgbXRpPE47IG10aSsrKSB7Ci0JCW10W210aV0gPQotCQkoMTgxMjQzMzI1M1VMICogKG10W210aS0xXSBeIChtdFttdGktMV0gPj4gMzApKSArIG10aSk7Ci0JCS8qIFNlZSBLbnV0aCBUQU9DUCBWb2wyLiAzcmQgRWQuIFAuMTA2IGZvciBtdWx0aXBsaWVyLiAqLwotCQkvKiBJbiB0aGUgcHJldmlvdXMgdmVyc2lvbnMsIE1TQnMgb2YgdGhlIHNlZWQgYWZmZWN0ICAgKi8KLQkJLyogb25seSBNU0JzIG9mIHRoZSBhcnJheSBtdFtdLiAJCSAgICAgICAqLwotCQkvKiAyMDAyLzAxLzA5IG1vZGlmaWVkIGJ5IE1ha290byBNYXRzdW1vdG8JICAgICAgICovCi0JCW10W210aV0gJj0gMHhmZmZmZmZmZlVMOwotCQkvKiBmb3IgPjMyIGJpdCBtYWNoaW5lcyAqLwotCX0KLQlzZWxmLT5pbmRleCA9IG10aTsKLQlyZXR1cm47CisgICAgbXQgPSBzZWxmLT5zdGF0ZTsKKyAgICBtdFswXT0gcyAmIDB4ZmZmZmZmZmZVTDsKKyAgICBmb3IgKG10aT0xOyBtdGk8TjsgbXRpKyspIHsKKyAgICAgICAgbXRbbXRpXSA9CisgICAgICAgICgxODEyNDMzMjUzVUwgKiAobXRbbXRpLTFdIF4gKG10W210aS0xXSA+PiAzMCkpICsgbXRpKTsKKyAgICAgICAgLyogU2VlIEtudXRoIFRBT0NQIFZvbDIuIDNyZCBFZC4gUC4xMDYgZm9yIG11bHRpcGxpZXIuICovCisgICAgICAgIC8qIEluIHRoZSBwcmV2aW91cyB2ZXJzaW9ucywgTVNCcyBvZiB0aGUgc2VlZCBhZmZlY3QgICAqLworICAgICAgICAvKiBvbmx5IE1TQnMgb2YgdGhlIGFycmF5IG10W10uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAvKiAyMDAyLzAxLzA5IG1vZGlmaWVkIGJ5IE1ha290byBNYXRzdW1vdG8gICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICBtdFttdGldICY9IDB4ZmZmZmZmZmZVTDsKKyAgICAgICAgLyogZm9yID4zMiBiaXQgbWFjaGluZXMgKi8KKyAgICB9CisgICAgc2VsZi0+aW5kZXggPSBtdGk7CisgICAgcmV0dXJuOwogfQogCiAvKiBpbml0aWFsaXplIGJ5IGFuIGFycmF5IHdpdGggYXJyYXktbGVuZ3RoICovCkBAIC0xNzAsMjggKzE3MCwyOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGluaXRfYnlfYXJyYXkoUmFuZG9tT2JqZWN0ICpzZWxmLCB1bnNpZ25lZCBsb25nIGluaXRfa2V5W10sIHVuc2lnbmVkIGxvbmcga2V5X2xlbmd0aCkKIHsKLQl1bnNpZ25lZCBpbnQgaSwgaiwgazsJLyogd2FzIHNpZ25lZCBpbiB0aGUgb3JpZ2luYWwgY29kZS4gUkRIIDEyLzE2LzIwMDIgKi8KLQl1bnNpZ25lZCBsb25nICptdDsKKyAgICB1bnNpZ25lZCBpbnQgaSwgaiwgazsgICAgICAgLyogd2FzIHNpZ25lZCBpbiB0aGUgb3JpZ2luYWwgY29kZS4gUkRIIDEyLzE2LzIwMDIgKi8KKyAgICB1bnNpZ25lZCBsb25nICptdDsKIAotCW10ID0gc2VsZi0+c3RhdGU7Ci0JaW5pdF9nZW5yYW5kKHNlbGYsIDE5NjUwMjE4VUwpOwotCWk9MTsgaj0wOwotCWsgPSAoTj5rZXlfbGVuZ3RoID8gTiA6IGtleV9sZW5ndGgpOwotCWZvciAoOyBrOyBrLS0pIHsKLQkJbXRbaV0gPSAobXRbaV0gXiAoKG10W2ktMV0gXiAobXRbaS0xXSA+PiAzMCkpICogMTY2NDUyNVVMKSkKLQkJCSArIGluaXRfa2V5W2pdICsgajsgLyogbm9uIGxpbmVhciAqLwotCQltdFtpXSAmPSAweGZmZmZmZmZmVUw7IC8qIGZvciBXT1JEU0laRSA+IDMyIG1hY2hpbmVzICovCi0JCWkrKzsgaisrOwotCQlpZiAoaT49TikgeyBtdFswXSA9IG10W04tMV07IGk9MTsgfQotCQlpZiAoaj49a2V5X2xlbmd0aCkgaj0wOwotCX0KLQlmb3IgKGs9Ti0xOyBrOyBrLS0pIHsKLQkJbXRbaV0gPSAobXRbaV0gXiAoKG10W2ktMV0gXiAobXRbaS0xXSA+PiAzMCkpICogMTU2NjA4Mzk0MVVMKSkKLQkJCSAtIGk7IC8qIG5vbiBsaW5lYXIgKi8KLQkJbXRbaV0gJj0gMHhmZmZmZmZmZlVMOyAvKiBmb3IgV09SRFNJWkUgPiAzMiBtYWNoaW5lcyAqLwotCQlpKys7Ci0JCWlmIChpPj1OKSB7IG10WzBdID0gbXRbTi0xXTsgaT0xOyB9Ci0JfQorICAgIG10ID0gc2VsZi0+c3RhdGU7CisgICAgaW5pdF9nZW5yYW5kKHNlbGYsIDE5NjUwMjE4VUwpOworICAgIGk9MTsgaj0wOworICAgIGsgPSAoTj5rZXlfbGVuZ3RoID8gTiA6IGtleV9sZW5ndGgpOworICAgIGZvciAoOyBrOyBrLS0pIHsKKyAgICAgICAgbXRbaV0gPSAobXRbaV0gXiAoKG10W2ktMV0gXiAobXRbaS0xXSA+PiAzMCkpICogMTY2NDUyNVVMKSkKKyAgICAgICAgICAgICAgICAgKyBpbml0X2tleVtqXSArIGo7IC8qIG5vbiBsaW5lYXIgKi8KKyAgICAgICAgbXRbaV0gJj0gMHhmZmZmZmZmZlVMOyAvKiBmb3IgV09SRFNJWkUgPiAzMiBtYWNoaW5lcyAqLworICAgICAgICBpKys7IGorKzsKKyAgICAgICAgaWYgKGk+PU4pIHsgbXRbMF0gPSBtdFtOLTFdOyBpPTE7IH0KKyAgICAgICAgaWYgKGo+PWtleV9sZW5ndGgpIGo9MDsKKyAgICB9CisgICAgZm9yIChrPU4tMTsgazsgay0tKSB7CisgICAgICAgIG10W2ldID0gKG10W2ldIF4gKChtdFtpLTFdIF4gKG10W2ktMV0gPj4gMzApKSAqIDE1NjYwODM5NDFVTCkpCisgICAgICAgICAgICAgICAgIC0gaTsgLyogbm9uIGxpbmVhciAqLworICAgICAgICBtdFtpXSAmPSAweGZmZmZmZmZmVUw7IC8qIGZvciBXT1JEU0laRSA+IDMyIG1hY2hpbmVzICovCisgICAgICAgIGkrKzsKKyAgICAgICAgaWYgKGk+PU4pIHsgbXRbMF0gPSBtdFtOLTFdOyBpPTE7IH0KKyAgICB9CiAKICAgICBtdFswXSA9IDB4ODAwMDAwMDBVTDsgLyogTVNCIGlzIDE7IGFzc3VyaW5nIG5vbi16ZXJvIGluaXRpYWwgYXJyYXkgKi8KICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CkBAIC0yMDYsMTY3ICsyMDYsMTY3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogcmFuZG9tX3NlZWQoUmFuZG9tT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsJLyogZ3VpbHR5IHVudGlsIHByb3ZlZCBpbm5vY2VudCAqLwotCVB5T2JqZWN0ICptYXNrbG93ZXIgPSBOVUxMOwotCVB5T2JqZWN0ICp0aGlydHl0d28gPSBOVUxMOwotCVB5T2JqZWN0ICpuID0gTlVMTDsKLQl1bnNpZ25lZCBsb25nICprZXkgPSBOVUxMOwotCXVuc2lnbmVkIGxvbmcga2V5bWF4OwkJLyogIyBvZiBhbGxvY2F0ZWQgc2xvdHMgaW4ga2V5ICovCi0JdW5zaWduZWQgbG9uZyBrZXl1c2VkOwkJLyogIyBvZiB1c2VkIHNsb3RzIGluIGtleSAqLwotCWludCBlcnI7CisgICAgUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7ICAgICAgICAgICAgLyogZ3VpbHR5IHVudGlsIHByb3ZlZCBpbm5vY2VudCAqLworICAgIFB5T2JqZWN0ICptYXNrbG93ZXIgPSBOVUxMOworICAgIFB5T2JqZWN0ICp0aGlydHl0d28gPSBOVUxMOworICAgIFB5T2JqZWN0ICpuID0gTlVMTDsKKyAgICB1bnNpZ25lZCBsb25nICprZXkgPSBOVUxMOworICAgIHVuc2lnbmVkIGxvbmcga2V5bWF4OyAgICAgICAgICAgICAgIC8qICMgb2YgYWxsb2NhdGVkIHNsb3RzIGluIGtleSAqLworICAgIHVuc2lnbmVkIGxvbmcga2V5dXNlZDsgICAgICAgICAgICAgIC8qICMgb2YgdXNlZCBzbG90cyBpbiBrZXkgKi8KKyAgICBpbnQgZXJyOwogCi0JUHlPYmplY3QgKmFyZyA9IE5VTEw7CisgICAgUHlPYmplY3QgKmFyZyA9IE5VTEw7CiAKLQlpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJzZWVkIiwgMCwgMSwgJmFyZykpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInNlZWQiLCAwLCAxLCAmYXJnKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoYXJnID09IE5VTEwgfHwgYXJnID09IFB5X05vbmUpIHsKLQkJdGltZV90IG5vdzsKKyAgICBpZiAoYXJnID09IE5VTEwgfHwgYXJnID09IFB5X05vbmUpIHsKKyAgICAgICAgdGltZV90IG5vdzsKIAotCQl0aW1lKCZub3cpOwotCQlpbml0X2dlbnJhbmQoc2VsZiwgKHVuc2lnbmVkIGxvbmcpbm93KTsKLQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQlyZXR1cm4gUHlfTm9uZTsKLQl9Ci0JLyogSWYgdGhlIGFyZyBpcyBhbiBpbnQgb3IgbG9uZywgdXNlIGl0cyBhYnNvbHV0ZSB2YWx1ZTsgZWxzZSB1c2UKLQkgKiB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgaXRzIGhhc2ggY29kZS4KLQkgKi8KLQlpZiAoUHlJbnRfQ2hlY2soYXJnKSB8fCBQeUxvbmdfQ2hlY2soYXJnKSkKLQkJbiA9IFB5TnVtYmVyX0Fic29sdXRlKGFyZyk7Ci0JZWxzZSB7Ci0JCWxvbmcgaGFzaCA9IFB5T2JqZWN0X0hhc2goYXJnKTsKLQkJaWYgKGhhc2ggPT0gLTEpCi0JCQlnb3RvIERvbmU7Ci0JCW4gPSBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZygodW5zaWduZWQgbG9uZyloYXNoKTsKLQl9Ci0JaWYgKG4gPT0gTlVMTCkKLQkJZ290byBEb25lOworICAgICAgICB0aW1lKCZub3cpOworICAgICAgICBpbml0X2dlbnJhbmQoc2VsZiwgKHVuc2lnbmVkIGxvbmcpbm93KTsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICB9CisgICAgLyogSWYgdGhlIGFyZyBpcyBhbiBpbnQgb3IgbG9uZywgdXNlIGl0cyBhYnNvbHV0ZSB2YWx1ZTsgZWxzZSB1c2UKKyAgICAgKiB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgaXRzIGhhc2ggY29kZS4KKyAgICAgKi8KKyAgICBpZiAoUHlJbnRfQ2hlY2soYXJnKSB8fCBQeUxvbmdfQ2hlY2soYXJnKSkKKyAgICAgICAgbiA9IFB5TnVtYmVyX0Fic29sdXRlKGFyZyk7CisgICAgZWxzZSB7CisgICAgICAgIGxvbmcgaGFzaCA9IFB5T2JqZWN0X0hhc2goYXJnKTsKKyAgICAgICAgaWYgKGhhc2ggPT0gLTEpCisgICAgICAgICAgICBnb3RvIERvbmU7CisgICAgICAgIG4gPSBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZygodW5zaWduZWQgbG9uZyloYXNoKTsKKyAgICB9CisgICAgaWYgKG4gPT0gTlVMTCkKKyAgICAgICAgZ290byBEb25lOwogCi0JLyogTm93IHNwbGl0IG4gaW50byAzMi1iaXQgY2h1bmtzLCBmcm9tIHRoZSByaWdodC4gIEVhY2ggcGllY2UgaXMKLQkgKiBzdG9yZWQgaW50byBrZXksIHdoaWNoIGhhcyBhIGNhcGFjaXR5IG9mIGtleW1heCBjaHVua3MsIG9mIHdoaWNoCi0JICoga2V5dXNlZCBhcmUgZmlsbGVkLiAgQWxhcywgdGhlIHJlcGVhdGVkIHNoaWZ0aW5nIG1ha2VzIHRoaXMgYQotCSAqIHF1YWRyYXRpYy10aW1lIGFsZ29yaXRobTsgd2UnZCByZWFsbHkgbGlrZSB0byB1c2UKLQkgKiBfUHlMb25nX0FzQnl0ZUFycmF5IGhlcmUsIGJ1dCB0aGVuIHdlJ2QgaGF2ZSB0byBicmVhayBpbnRvIHRoZQotCSAqIGxvbmcgcmVwcmVzZW50YXRpb24gdG8gZmlndXJlIG91dCBob3cgYmlnIGFuIGFycmF5IHdhcyBuZWVkZWQKLQkgKiBpbiBhZHZhbmNlLgotCSAqLwotCWtleW1heCA9IDg7IAkvKiBhcmJpdHJhcnk7IGdyb3dzIGxhdGVyIGlmIG5lZWRlZCAqLwotCWtleXVzZWQgPSAwOwotCWtleSA9ICh1bnNpZ25lZCBsb25nICopUHlNZW1fTWFsbG9jKGtleW1heCAqIHNpemVvZigqa2V5KSk7Ci0JaWYgKGtleSA9PSBOVUxMKQotCQlnb3RvIERvbmU7CisgICAgLyogTm93IHNwbGl0IG4gaW50byAzMi1iaXQgY2h1bmtzLCBmcm9tIHRoZSByaWdodC4gIEVhY2ggcGllY2UgaXMKKyAgICAgKiBzdG9yZWQgaW50byBrZXksIHdoaWNoIGhhcyBhIGNhcGFjaXR5IG9mIGtleW1heCBjaHVua3MsIG9mIHdoaWNoCisgICAgICoga2V5dXNlZCBhcmUgZmlsbGVkLiAgQWxhcywgdGhlIHJlcGVhdGVkIHNoaWZ0aW5nIG1ha2VzIHRoaXMgYQorICAgICAqIHF1YWRyYXRpYy10aW1lIGFsZ29yaXRobTsgd2UnZCByZWFsbHkgbGlrZSB0byB1c2UKKyAgICAgKiBfUHlMb25nX0FzQnl0ZUFycmF5IGhlcmUsIGJ1dCB0aGVuIHdlJ2QgaGF2ZSB0byBicmVhayBpbnRvIHRoZQorICAgICAqIGxvbmcgcmVwcmVzZW50YXRpb24gdG8gZmlndXJlIG91dCBob3cgYmlnIGFuIGFycmF5IHdhcyBuZWVkZWQKKyAgICAgKiBpbiBhZHZhbmNlLgorICAgICAqLworICAgIGtleW1heCA9IDg7ICAgICAgICAgLyogYXJiaXRyYXJ5OyBncm93cyBsYXRlciBpZiBuZWVkZWQgKi8KKyAgICBrZXl1c2VkID0gMDsKKyAgICBrZXkgPSAodW5zaWduZWQgbG9uZyAqKVB5TWVtX01hbGxvYyhrZXltYXggKiBzaXplb2YoKmtleSkpOworICAgIGlmIChrZXkgPT0gTlVMTCkKKyAgICAgICAgZ290byBEb25lOwogCi0JbWFza2xvd2VyID0gUHlMb25nX0Zyb21VbnNpZ25lZExvbmcoMHhmZmZmZmZmZlUpOwotCWlmIChtYXNrbG93ZXIgPT0gTlVMTCkKLQkJZ290byBEb25lOwotCXRoaXJ0eXR3byA9IFB5SW50X0Zyb21Mb25nKDMyTCk7Ci0JaWYgKHRoaXJ0eXR3byA9PSBOVUxMKQotCQlnb3RvIERvbmU7Ci0Jd2hpbGUgKChlcnI9UHlPYmplY3RfSXNUcnVlKG4pKSkgewotCQlQeU9iamVjdCAqbmV3bjsKLQkJUHlPYmplY3QgKnB5Y2h1bms7Ci0JCXVuc2lnbmVkIGxvbmcgY2h1bms7CisgICAgbWFza2xvd2VyID0gUHlMb25nX0Zyb21VbnNpZ25lZExvbmcoMHhmZmZmZmZmZlUpOworICAgIGlmIChtYXNrbG93ZXIgPT0gTlVMTCkKKyAgICAgICAgZ290byBEb25lOworICAgIHRoaXJ0eXR3byA9IFB5SW50X0Zyb21Mb25nKDMyTCk7CisgICAgaWYgKHRoaXJ0eXR3byA9PSBOVUxMKQorICAgICAgICBnb3RvIERvbmU7CisgICAgd2hpbGUgKChlcnI9UHlPYmplY3RfSXNUcnVlKG4pKSkgeworICAgICAgICBQeU9iamVjdCAqbmV3bjsKKyAgICAgICAgUHlPYmplY3QgKnB5Y2h1bms7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgY2h1bms7CiAKLQkJaWYgKGVyciA9PSAtMSkKLQkJCWdvdG8gRG9uZTsKLQkJcHljaHVuayA9IFB5TnVtYmVyX0FuZChuLCBtYXNrbG93ZXIpOwotCQlpZiAocHljaHVuayA9PSBOVUxMKQotCQkJZ290byBEb25lOwotCQljaHVuayA9IFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZyhweWNodW5rKTsKLQkJUHlfREVDUkVGKHB5Y2h1bmspOwotCQlpZiAoY2h1bmsgPT0gKHVuc2lnbmVkIGxvbmcpLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJCWdvdG8gRG9uZTsKLQkJbmV3biA9IFB5TnVtYmVyX1JzaGlmdChuLCB0aGlydHl0d28pOwotCQlpZiAobmV3biA9PSBOVUxMKQotCQkJZ290byBEb25lOwotCQlQeV9ERUNSRUYobik7Ci0JCW4gPSBuZXduOwotCQlpZiAoa2V5dXNlZCA+PSBrZXltYXgpIHsKLQkJCXVuc2lnbmVkIGxvbmcgYmlnZ2VyID0ga2V5bWF4IDw8IDE7Ci0JCQlpZiAoKGJpZ2dlciA+PiAxKSAhPSBrZXltYXgpIHsKLQkJCQlQeUVycl9Ob01lbW9yeSgpOwotCQkJCWdvdG8gRG9uZTsKLQkJCX0KLQkJCWtleSA9ICh1bnNpZ25lZCBsb25nICopUHlNZW1fUmVhbGxvYyhrZXksCi0JCQkJCQliaWdnZXIgKiBzaXplb2YoKmtleSkpOwotCQkJaWYgKGtleSA9PSBOVUxMKQotCQkJCWdvdG8gRG9uZTsKLQkJCWtleW1heCA9IGJpZ2dlcjsKLQkJfQotCQlhc3NlcnQoa2V5dXNlZCA8IGtleW1heCk7Ci0JCWtleVtrZXl1c2VkKytdID0gY2h1bms7Ci0JfQorICAgICAgICBpZiAoZXJyID09IC0xKQorICAgICAgICAgICAgZ290byBEb25lOworICAgICAgICBweWNodW5rID0gUHlOdW1iZXJfQW5kKG4sIG1hc2tsb3dlcik7CisgICAgICAgIGlmIChweWNodW5rID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIERvbmU7CisgICAgICAgIGNodW5rID0gUHlMb25nX0FzVW5zaWduZWRMb25nKHB5Y2h1bmspOworICAgICAgICBQeV9ERUNSRUYocHljaHVuayk7CisgICAgICAgIGlmIChjaHVuayA9PSAodW5zaWduZWQgbG9uZyktMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgZ290byBEb25lOworICAgICAgICBuZXduID0gUHlOdW1iZXJfUnNoaWZ0KG4sIHRoaXJ0eXR3byk7CisgICAgICAgIGlmIChuZXduID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIERvbmU7CisgICAgICAgIFB5X0RFQ1JFRihuKTsKKyAgICAgICAgbiA9IG5ld247CisgICAgICAgIGlmIChrZXl1c2VkID49IGtleW1heCkgeworICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBiaWdnZXIgPSBrZXltYXggPDwgMTsKKyAgICAgICAgICAgIGlmICgoYmlnZ2VyID4+IDEpICE9IGtleW1heCkgeworICAgICAgICAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgICAgICAgICAgZ290byBEb25lOworICAgICAgICAgICAgfQorICAgICAgICAgICAga2V5ID0gKHVuc2lnbmVkIGxvbmcgKilQeU1lbV9SZWFsbG9jKGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZ2dlciAqIHNpemVvZigqa2V5KSk7CisgICAgICAgICAgICBpZiAoa2V5ID09IE5VTEwpCisgICAgICAgICAgICAgICAgZ290byBEb25lOworICAgICAgICAgICAga2V5bWF4ID0gYmlnZ2VyOworICAgICAgICB9CisgICAgICAgIGFzc2VydChrZXl1c2VkIDwga2V5bWF4KTsKKyAgICAgICAga2V5W2tleXVzZWQrK10gPSBjaHVuazsKKyAgICB9CiAKLQlpZiAoa2V5dXNlZCA9PSAwKQotCQlrZXlba2V5dXNlZCsrXSA9IDBVTDsKLQlyZXN1bHQgPSBpbml0X2J5X2FycmF5KHNlbGYsIGtleSwga2V5dXNlZCk7CisgICAgaWYgKGtleXVzZWQgPT0gMCkKKyAgICAgICAga2V5W2tleXVzZWQrK10gPSAwVUw7CisgICAgcmVzdWx0ID0gaW5pdF9ieV9hcnJheShzZWxmLCBrZXksIGtleXVzZWQpOwogRG9uZToKLQlQeV9YREVDUkVGKG1hc2tsb3dlcik7Ci0JUHlfWERFQ1JFRih0aGlydHl0d28pOwotCVB5X1hERUNSRUYobik7Ci0JUHlNZW1fRnJlZShrZXkpOwotCXJldHVybiByZXN1bHQ7CisgICAgUHlfWERFQ1JFRihtYXNrbG93ZXIpOworICAgIFB5X1hERUNSRUYodGhpcnR5dHdvKTsKKyAgICBQeV9YREVDUkVGKG4pOworICAgIFB5TWVtX0ZyZWUoa2V5KTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogcmFuZG9tX2dldHN0YXRlKFJhbmRvbU9iamVjdCAqc2VsZikKIHsKLQlQeU9iamVjdCAqc3RhdGU7Ci0JUHlPYmplY3QgKmVsZW1lbnQ7Ci0JaW50IGk7CisgICAgUHlPYmplY3QgKnN0YXRlOworICAgIFB5T2JqZWN0ICplbGVtZW50OworICAgIGludCBpOwogCi0Jc3RhdGUgPSBQeVR1cGxlX05ldyhOKzEpOwotCWlmIChzdGF0ZSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlmb3IgKGk9MDsgaTxOIDsgaSsrKSB7Ci0JCWVsZW1lbnQgPSBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZyhzZWxmLT5zdGF0ZVtpXSk7Ci0JCWlmIChlbGVtZW50ID09IE5VTEwpCi0JCQlnb3RvIEZhaWw7Ci0JCVB5VHVwbGVfU0VUX0lURU0oc3RhdGUsIGksIGVsZW1lbnQpOwotCX0KLQllbGVtZW50ID0gUHlMb25nX0Zyb21Mb25nKChsb25nKShzZWxmLT5pbmRleCkpOwotCWlmIChlbGVtZW50ID09IE5VTEwpCi0JCWdvdG8gRmFpbDsKLQlQeVR1cGxlX1NFVF9JVEVNKHN0YXRlLCBpLCBlbGVtZW50KTsKLQlyZXR1cm4gc3RhdGU7CisgICAgc3RhdGUgPSBQeVR1cGxlX05ldyhOKzEpOworICAgIGlmIChzdGF0ZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBmb3IgKGk9MDsgaTxOIDsgaSsrKSB7CisgICAgICAgIGVsZW1lbnQgPSBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZyhzZWxmLT5zdGF0ZVtpXSk7CisgICAgICAgIGlmIChlbGVtZW50ID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIEZhaWw7CisgICAgICAgIFB5VHVwbGVfU0VUX0lURU0oc3RhdGUsIGksIGVsZW1lbnQpOworICAgIH0KKyAgICBlbGVtZW50ID0gUHlMb25nX0Zyb21Mb25nKChsb25nKShzZWxmLT5pbmRleCkpOworICAgIGlmIChlbGVtZW50ID09IE5VTEwpCisgICAgICAgIGdvdG8gRmFpbDsKKyAgICBQeVR1cGxlX1NFVF9JVEVNKHN0YXRlLCBpLCBlbGVtZW50KTsKKyAgICByZXR1cm4gc3RhdGU7CiAKIEZhaWw6Ci0JUHlfREVDUkVGKHN0YXRlKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeV9ERUNSRUYoc3RhdGUpOworICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogcmFuZG9tX3NldHN0YXRlKFJhbmRvbU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnN0YXRlKQogewotCWludCBpOwotCXVuc2lnbmVkIGxvbmcgZWxlbWVudDsKLQlsb25nIGluZGV4OworICAgIGludCBpOworICAgIHVuc2lnbmVkIGxvbmcgZWxlbWVudDsKKyAgICBsb25nIGluZGV4OwogCi0JaWYgKCFQeVR1cGxlX0NoZWNrKHN0YXRlKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJInN0YXRlIHZlY3RvciBtdXN0IGJlIGEgdHVwbGUiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChQeVR1cGxlX1NpemUoc3RhdGUpICE9IE4rMSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCSJzdGF0ZSB2ZWN0b3IgaXMgdGhlIHdyb25nIHNpemUiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICghUHlUdXBsZV9DaGVjayhzdGF0ZSkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICJzdGF0ZSB2ZWN0b3IgbXVzdCBiZSBhIHR1cGxlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoUHlUdXBsZV9TaXplKHN0YXRlKSAhPSBOKzEpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAic3RhdGUgdmVjdG9yIGlzIHRoZSB3cm9uZyBzaXplIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWZvciAoaT0wOyBpPE4gOyBpKyspIHsKLQkJZWxlbWVudCA9IFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZyhQeVR1cGxlX0dFVF9JVEVNKHN0YXRlLCBpKSk7Ci0JCWlmIChlbGVtZW50ID09ICh1bnNpZ25lZCBsb25nKS0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCQlyZXR1cm4gTlVMTDsKLQkJc2VsZi0+c3RhdGVbaV0gPSBlbGVtZW50ICYgMHhmZmZmZmZmZlVMOyAvKiBNYWtlIHN1cmUgd2UgZ2V0IHNhbmUgc3RhdGUgKi8KLQl9CisgICAgZm9yIChpPTA7IGk8TiA7IGkrKykgeworICAgICAgICBlbGVtZW50ID0gUHlMb25nX0FzVW5zaWduZWRMb25nKFB5VHVwbGVfR0VUX0lURU0oc3RhdGUsIGkpKTsKKyAgICAgICAgaWYgKGVsZW1lbnQgPT0gKHVuc2lnbmVkIGxvbmcpLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBzZWxmLT5zdGF0ZVtpXSA9IGVsZW1lbnQgJiAweGZmZmZmZmZmVUw7IC8qIE1ha2Ugc3VyZSB3ZSBnZXQgc2FuZSBzdGF0ZSAqLworICAgIH0KIAotCWluZGV4ID0gUHlMb25nX0FzTG9uZyhQeVR1cGxlX0dFVF9JVEVNKHN0YXRlLCBpKSk7Ci0JaWYgKGluZGV4ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiBOVUxMOwotCXNlbGYtPmluZGV4ID0gKGludClpbmRleDsKKyAgICBpbmRleCA9IFB5TG9uZ19Bc0xvbmcoUHlUdXBsZV9HRVRfSVRFTShzdGF0ZSwgaSkpOworICAgIGlmIChpbmRleCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBzZWxmLT5pbmRleCA9IChpbnQpaW5kZXg7CiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKgpAQCAtMzg5LDcgKzM4OSw3IEBACiBoYXZlIGNoYW5naW5nIChncm93aW5nKSB2YWx1ZXMgYXMgd2VsbCBhcyBzaHVmZmxlZCBwb3NpdGlvbnMuCiAKIEZpbmFsbHksIHRoZSBzZWxmLT5pbmRleCB2YWx1ZSBpcyBzZXQgdG8gTiBzbyB0aGF0IHRoZSBnZW5lcmF0b3IgaXRzZWxmCi1raWNrcyBpbiBvbiB0aGUgbmV4dCBjYWxsIHRvIHJhbmRvbSgpLglUaGlzIGFzc3VyZXMgdGhhdCBhbGwgcmVzdWx0cwora2lja3MgaW4gb24gdGhlIG5leHQgY2FsbCB0byByYW5kb20oKS4gIFRoaXMgYXNzdXJlcyB0aGF0IGFsbCByZXN1bHRzCiBoYXZlIGJlZW4gdGhyb3VnaCB0aGUgZ2VuZXJhdG9yIGFuZCBkbyBub3QganVzdCByZWZsZWN0IGFsdGVyYXRpb25zIHRvCiB0aGUgdW5kZXJseWluZyBzdGF0ZS4KICovCkBAIC0zOTcsMTY5ICszOTcsMTY5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogcmFuZG9tX2p1bXBhaGVhZChSYW5kb21PYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpuKQogewotCWxvbmcgaSwgajsKLQlQeU9iamVjdCAqaW9iajsKLQlQeU9iamVjdCAqcmVtb2JqOwotCXVuc2lnbmVkIGxvbmcgKm10LCB0bXA7CisgICAgbG9uZyBpLCBqOworICAgIFB5T2JqZWN0ICppb2JqOworICAgIFB5T2JqZWN0ICpyZW1vYmo7CisgICAgdW5zaWduZWQgbG9uZyAqbXQsIHRtcDsKIAotCWlmICghUHlJbnRfQ2hlY2sobikgJiYgIVB5TG9uZ19DaGVjayhuKSkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAianVtcGFoZWFkIHJlcXVpcmVzIGFuICIKLQkJCSAgICAgImludGVnZXIsIG5vdCAnJXMnIiwKLQkJCSAgICAgUHlfVFlQRShuKS0+dHBfbmFtZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoIVB5SW50X0NoZWNrKG4pICYmICFQeUxvbmdfQ2hlY2sobikpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgImp1bXBhaGVhZCByZXF1aXJlcyBhbiAiCisgICAgICAgICAgICAgICAgICAgICAiaW50ZWdlciwgbm90ICclcyciLAorICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRShuKS0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCW10ID0gc2VsZi0+c3RhdGU7Ci0JZm9yIChpID0gTi0xOyBpID4gMTsgaS0tKSB7Ci0JCWlvYmogPSBQeUludF9Gcm9tTG9uZyhpKTsKLQkJaWYgKGlvYmogPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQlyZW1vYmogPSBQeU51bWJlcl9SZW1haW5kZXIobiwgaW9iaik7Ci0JCVB5X0RFQ1JFRihpb2JqKTsKLQkJaWYgKHJlbW9iaiA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWogPSBQeUludF9Bc0xvbmcocmVtb2JqKTsKLQkJUHlfREVDUkVGKHJlbW9iaik7Ci0JCWlmIChqID09IC0xTCAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIE5VTEw7Ci0JCXRtcCA9IG10W2ldOwotCQltdFtpXSA9IG10W2pdOwotCQltdFtqXSA9IHRtcDsKLQl9CisgICAgbXQgPSBzZWxmLT5zdGF0ZTsKKyAgICBmb3IgKGkgPSBOLTE7IGkgPiAxOyBpLS0pIHsKKyAgICAgICAgaW9iaiA9IFB5SW50X0Zyb21Mb25nKGkpOworICAgICAgICBpZiAoaW9iaiA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHJlbW9iaiA9IFB5TnVtYmVyX1JlbWFpbmRlcihuLCBpb2JqKTsKKyAgICAgICAgUHlfREVDUkVGKGlvYmopOworICAgICAgICBpZiAocmVtb2JqID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgaiA9IFB5SW50X0FzTG9uZyhyZW1vYmopOworICAgICAgICBQeV9ERUNSRUYocmVtb2JqKTsKKyAgICAgICAgaWYgKGogPT0gLTFMICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgdG1wID0gbXRbaV07CisgICAgICAgIG10W2ldID0gbXRbal07CisgICAgICAgIG10W2pdID0gdG1wOworICAgIH0KIAotCWZvciAoaSA9IDA7IGkgPCBOOyBpKyspCi0JCW10W2ldICs9IGkrMTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgTjsgaSsrKQorICAgICAgICBtdFtpXSArPSBpKzE7CiAKLQlzZWxmLT5pbmRleCA9IE47Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNlbGYtPmluZGV4ID0gTjsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiByYW5kb21fZ2V0cmFuZGJpdHMoUmFuZG9tT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgaywgaSwgYnl0ZXM7Ci0JdW5zaWduZWQgbG9uZyByOwotCXVuc2lnbmVkIGNoYXIgKmJ5dGVhcnJheTsKLQlQeU9iamVjdCAqcmVzdWx0OworICAgIGludCBrLCBpLCBieXRlczsKKyAgICB1bnNpZ25lZCBsb25nIHI7CisgICAgdW5zaWduZWQgY2hhciAqYnl0ZWFycmF5OworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6Z2V0cmFuZGJpdHMiLCAmaykpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpnZXRyYW5kYml0cyIsICZrKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoayA8PSAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJudW1iZXIgb2YgYml0cyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoayA8PSAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIm51bWJlciBvZiBiaXRzIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JYnl0ZXMgPSAoKGsgLSAxKSAvIDMyICsgMSkgKiA0OwotCWJ5dGVhcnJheSA9ICh1bnNpZ25lZCBjaGFyICopUHlNZW1fTWFsbG9jKGJ5dGVzKTsKLQlpZiAoYnl0ZWFycmF5ID09IE5VTEwpIHsKLQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGJ5dGVzID0gKChrIC0gMSkgLyAzMiArIDEpICogNDsKKyAgICBieXRlYXJyYXkgPSAodW5zaWduZWQgY2hhciAqKVB5TWVtX01hbGxvYyhieXRlcyk7CisgICAgaWYgKGJ5dGVhcnJheSA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCS8qIEZpbGwtb3V0IHdob2xlIHdvcmRzLCBieXRlLWJ5LWJ5dGUgdG8gYXZvaWQgZW5kaWFubmVzcyBpc3N1ZXMgKi8KLQlmb3IgKGk9MCA7IGk8Ynl0ZXMgOyBpKz00LCBrLT0zMikgewotCQlyID0gZ2VucmFuZF9pbnQzMihzZWxmKTsKLQkJaWYgKGsgPCAzMikKLQkJCXIgPj49ICgzMiAtIGspOwotCQlieXRlYXJyYXlbaSswXSA9ICh1bnNpZ25lZCBjaGFyKXI7Ci0JCWJ5dGVhcnJheVtpKzFdID0gKHVuc2lnbmVkIGNoYXIpKHIgPj4gOCk7Ci0JCWJ5dGVhcnJheVtpKzJdID0gKHVuc2lnbmVkIGNoYXIpKHIgPj4gMTYpOwotCQlieXRlYXJyYXlbaSszXSA9ICh1bnNpZ25lZCBjaGFyKShyID4+IDI0KTsKLQl9CisgICAgLyogRmlsbC1vdXQgd2hvbGUgd29yZHMsIGJ5dGUtYnktYnl0ZSB0byBhdm9pZCBlbmRpYW5uZXNzIGlzc3VlcyAqLworICAgIGZvciAoaT0wIDsgaTxieXRlcyA7IGkrPTQsIGstPTMyKSB7CisgICAgICAgIHIgPSBnZW5yYW5kX2ludDMyKHNlbGYpOworICAgICAgICBpZiAoayA8IDMyKQorICAgICAgICAgICAgciA+Pj0gKDMyIC0gayk7CisgICAgICAgIGJ5dGVhcnJheVtpKzBdID0gKHVuc2lnbmVkIGNoYXIpcjsKKyAgICAgICAgYnl0ZWFycmF5W2krMV0gPSAodW5zaWduZWQgY2hhcikociA+PiA4KTsKKyAgICAgICAgYnl0ZWFycmF5W2krMl0gPSAodW5zaWduZWQgY2hhcikociA+PiAxNik7CisgICAgICAgIGJ5dGVhcnJheVtpKzNdID0gKHVuc2lnbmVkIGNoYXIpKHIgPj4gMjQpOworICAgIH0KIAotCS8qIGxpdHRsZSBlbmRpYW4gb3JkZXIgdG8gbWF0Y2ggYnl0ZWFycmF5IGFzc2lnbm1lbnQgb3JkZXIgKi8KLQlyZXN1bHQgPSBfUHlMb25nX0Zyb21CeXRlQXJyYXkoYnl0ZWFycmF5LCBieXRlcywgMSwgMCk7Ci0JUHlNZW1fRnJlZShieXRlYXJyYXkpOwotCXJldHVybiByZXN1bHQ7CisgICAgLyogbGl0dGxlIGVuZGlhbiBvcmRlciB0byBtYXRjaCBieXRlYXJyYXkgYXNzaWdubWVudCBvcmRlciAqLworICAgIHJlc3VsdCA9IF9QeUxvbmdfRnJvbUJ5dGVBcnJheShieXRlYXJyYXksIGJ5dGVzLCAxLCAwKTsKKyAgICBQeU1lbV9GcmVlKGJ5dGVhcnJheSk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHJhbmRvbV9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JUmFuZG9tT2JqZWN0ICpzZWxmOwotCVB5T2JqZWN0ICp0bXA7CisgICAgUmFuZG9tT2JqZWN0ICpzZWxmOworICAgIFB5T2JqZWN0ICp0bXA7CiAKLQlpZiAodHlwZSA9PSAmUmFuZG9tX1R5cGUgJiYgIV9QeUFyZ19Ob0tleXdvcmRzKCJSYW5kb20oKSIsIGt3ZHMpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAodHlwZSA9PSAmUmFuZG9tX1R5cGUgJiYgIV9QeUFyZ19Ob0tleXdvcmRzKCJSYW5kb20oKSIsIGt3ZHMpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXNlbGYgPSAoUmFuZG9tT2JqZWN0ICopdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7Ci0JaWYgKHNlbGYgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JdG1wID0gcmFuZG9tX3NlZWQoc2VsZiwgYXJncyk7Ci0JaWYgKHRtcCA9PSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRihzZWxmKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5X0RFQ1JFRih0bXApOwotCXJldHVybiAoUHlPYmplY3QgKilzZWxmOworICAgIHNlbGYgPSAoUmFuZG9tT2JqZWN0ICopdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7CisgICAgaWYgKHNlbGYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgdG1wID0gcmFuZG9tX3NlZWQoc2VsZiwgYXJncyk7CisgICAgaWYgKHRtcCA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihzZWxmKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5X0RFQ1JFRih0bXApOworICAgIHJldHVybiAoUHlPYmplY3QgKilzZWxmOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgcmFuZG9tX21ldGhvZHNbXSA9IHsKLQl7InJhbmRvbSIsCShQeUNGdW5jdGlvbilyYW5kb21fcmFuZG9tLCAgTUVUSF9OT0FSR1MsCi0JCVB5RG9jX1NUUigicmFuZG9tKCkgLT4geCBpbiB0aGUgaW50ZXJ2YWwgWzAsIDEpLiIpfSwKLQl7InNlZWQiLAkoUHlDRnVuY3Rpb24pcmFuZG9tX3NlZWQsICBNRVRIX1ZBUkFSR1MsCi0JCVB5RG9jX1NUUigic2VlZChbbl0pIC0+IE5vbmUuICBEZWZhdWx0cyB0byBjdXJyZW50IHRpbWUuIil9LAotCXsiZ2V0c3RhdGUiLAkoUHlDRnVuY3Rpb24pcmFuZG9tX2dldHN0YXRlLCAgTUVUSF9OT0FSR1MsCi0JCVB5RG9jX1NUUigiZ2V0c3RhdGUoKSAtPiB0dXBsZSBjb250YWluaW5nIHRoZSBjdXJyZW50IHN0YXRlLiIpfSwKLQl7InNldHN0YXRlIiwJICAoUHlDRnVuY3Rpb24pcmFuZG9tX3NldHN0YXRlLCAgTUVUSF9PLAotCQlQeURvY19TVFIoInNldHN0YXRlKHN0YXRlKSAtPiBOb25lLiAgUmVzdG9yZXMgZ2VuZXJhdG9yIHN0YXRlLiIpfSwKLQl7Imp1bXBhaGVhZCIsCShQeUNGdW5jdGlvbilyYW5kb21fanVtcGFoZWFkLAlNRVRIX08sCi0JCVB5RG9jX1NUUigianVtcGFoZWFkKGludCkgLT4gTm9uZS4gIENyZWF0ZSBuZXcgc3RhdGUgZnJvbSAiCi0JCQkgICJleGlzdGluZyBzdGF0ZSBhbmQgaW50ZWdlci4iKX0sCi0JeyJnZXRyYW5kYml0cyIsCShQeUNGdW5jdGlvbilyYW5kb21fZ2V0cmFuZGJpdHMsICBNRVRIX1ZBUkFSR1MsCi0JCVB5RG9jX1NUUigiZ2V0cmFuZGJpdHMoaykgLT4geC4gIEdlbmVyYXRlcyBhIGxvbmcgaW50IHdpdGggIgotCQkJICAiayByYW5kb20gYml0cy4iKX0sCi0Je05VTEwsCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7InJhbmRvbSIsICAgICAgICAgIChQeUNGdW5jdGlvbilyYW5kb21fcmFuZG9tLCAgTUVUSF9OT0FSR1MsCisgICAgICAgIFB5RG9jX1NUUigicmFuZG9tKCkgLT4geCBpbiB0aGUgaW50ZXJ2YWwgWzAsIDEpLiIpfSwKKyAgICB7InNlZWQiLCAgICAgICAgICAgIChQeUNGdW5jdGlvbilyYW5kb21fc2VlZCwgIE1FVEhfVkFSQVJHUywKKyAgICAgICAgUHlEb2NfU1RSKCJzZWVkKFtuXSkgLT4gTm9uZS4gIERlZmF1bHRzIHRvIGN1cnJlbnQgdGltZS4iKX0sCisgICAgeyJnZXRzdGF0ZSIsICAgICAgICAoUHlDRnVuY3Rpb24pcmFuZG9tX2dldHN0YXRlLCAgTUVUSF9OT0FSR1MsCisgICAgICAgIFB5RG9jX1NUUigiZ2V0c3RhdGUoKSAtPiB0dXBsZSBjb250YWluaW5nIHRoZSBjdXJyZW50IHN0YXRlLiIpfSwKKyAgICB7InNldHN0YXRlIiwgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXJhbmRvbV9zZXRzdGF0ZSwgIE1FVEhfTywKKyAgICAgICAgUHlEb2NfU1RSKCJzZXRzdGF0ZShzdGF0ZSkgLT4gTm9uZS4gIFJlc3RvcmVzIGdlbmVyYXRvciBzdGF0ZS4iKX0sCisgICAgeyJqdW1wYWhlYWQiLCAgICAgICAoUHlDRnVuY3Rpb24pcmFuZG9tX2p1bXBhaGVhZCwgIE1FVEhfTywKKyAgICAgICAgUHlEb2NfU1RSKCJqdW1wYWhlYWQoaW50KSAtPiBOb25lLiAgQ3JlYXRlIG5ldyBzdGF0ZSBmcm9tICIKKyAgICAgICAgICAgICAgICAgICJleGlzdGluZyBzdGF0ZSBhbmQgaW50ZWdlci4iKX0sCisgICAgeyJnZXRyYW5kYml0cyIsICAgICAoUHlDRnVuY3Rpb24pcmFuZG9tX2dldHJhbmRiaXRzLCAgTUVUSF9WQVJBUkdTLAorICAgICAgICBQeURvY19TVFIoImdldHJhbmRiaXRzKGspIC0+IHguICBHZW5lcmF0ZXMgYSBsb25nIGludCB3aXRoICIKKyAgICAgICAgICAgICAgICAgICJrIHJhbmRvbSBiaXRzLiIpfSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogUHlEb2NfU1RSVkFSKHJhbmRvbV9kb2MsCiAiUmFuZG9tKCkgLT4gY3JlYXRlIGEgcmFuZG9tIG51bWJlciBnZW5lcmF0b3Igd2l0aCBpdHMgb3duIGludGVybmFsIHN0YXRlLiIpOwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IFJhbmRvbV9UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotCSJfcmFuZG9tLlJhbmRvbSIsCQkvKnRwX25hbWUqLwotCXNpemVvZihSYW5kb21PYmplY3QpLAkJLyp0cF9iYXNpY3NpemUqLwotCTAsCQkJCS8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkwLAkJCQkvKnRwX2RlYWxsb2MqLwotCTAsCQkJCS8qdHBfcHJpbnQqLwotCTAsCQkJCS8qdHBfZ2V0YXR0ciovCi0JMCwJCQkJLyp0cF9zZXRhdHRyKi8KLQkwLAkJCQkvKnRwX2NvbXBhcmUqLwotCTAsCQkJCS8qdHBfcmVwciovCi0JMCwJCQkJLyp0cF9hc19udW1iZXIqLwotCTAsCQkJCS8qdHBfYXNfc2VxdWVuY2UqLwotCTAsCQkJCS8qdHBfYXNfbWFwcGluZyovCi0JMCwJCQkJLyp0cF9oYXNoKi8KLQkwLAkJCQkvKnRwX2NhbGwqLwotCTAsCQkJCS8qdHBfc3RyKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJLyp0cF9nZXRhdHRybyovCi0JMCwJCQkJLyp0cF9zZXRhdHRybyovCi0JMCwJCQkJLyp0cF9hc19idWZmZXIqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfQkFTRVRZUEUsCS8qdHBfZmxhZ3MqLwotCXJhbmRvbV9kb2MsCQkJLyp0cF9kb2MqLwotCTAsCQkJCS8qdHBfdHJhdmVyc2UqLwotCTAsCQkJCS8qdHBfY2xlYXIqLwotCTAsCQkJCS8qdHBfcmljaGNvbXBhcmUqLwotCTAsCQkJCS8qdHBfd2Vha2xpc3RvZmZzZXQqLwotCTAsCQkJCS8qdHBfaXRlciovCi0JMCwJCQkJLyp0cF9pdGVybmV4dCovCi0JcmFuZG9tX21ldGhvZHMsIAkJLyp0cF9tZXRob2RzKi8KLQkwLAkJCQkvKnRwX21lbWJlcnMqLwotCTAsCQkJCS8qdHBfZ2V0c2V0Ki8KLQkwLAkJCQkvKnRwX2Jhc2UqLwotCTAsCQkJCS8qdHBfZGljdCovCi0JMCwJCQkJLyp0cF9kZXNjcl9nZXQqLwotCTAsCQkJCS8qdHBfZGVzY3Jfc2V0Ki8KLQkwLAkJCQkvKnRwX2RpY3RvZmZzZXQqLwotCTAsCQkJCS8qdHBfaW5pdCovCi0JMCwJCQkJLyp0cF9hbGxvYyovCi0JcmFuZG9tX25ldywJCQkvKnRwX25ldyovCi0JX1B5T2JqZWN0X0RlbCwJCQkvKnRwX2ZyZWUqLwotCTAsCQkJCS8qdHBfaXNfZ2MqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQorICAgICJfcmFuZG9tLlJhbmRvbSIsICAgICAgICAgICAgICAgICAgIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKFJhbmRvbU9iamVjdCksICAgICAgICAgICAgICAgLyp0cF9iYXNpY3NpemUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2RlYWxsb2MqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcHJpbnQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0YXR0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NvbXBhcmUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmVwciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19udW1iZXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfc2VxdWVuY2UqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbWFwcGluZyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9oYXNoKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NhbGwqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc3RyKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAvKnRwX2dldGF0dHJvKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHJvKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19CQVNFVFlQRSwgICAgICAgICAgIC8qdHBfZmxhZ3MqLworICAgIHJhbmRvbV9kb2MsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZG9jKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3RyYXZlcnNlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NsZWFyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3JpY2hjb21wYXJlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlcm5leHQqLworICAgIHJhbmRvbV9tZXRob2RzLCAgICAgICAgICAgICAgICAgICAgIC8qdHBfbWV0aG9kcyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9tZW1iZXJzKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldHNldCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9iYXNlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2RpY3QqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2luaXQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYWxsb2MqLworICAgIHJhbmRvbV9uZXcsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfbmV3Ki8KKyAgICBfUHlPYmplY3RfRGVsLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2ZyZWUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXNfZ2MqLwogfTsKIAogUHlEb2NfU1RSVkFSKG1vZHVsZV9kb2MsCkBAIC01NjgsMTMgKzU2OCwxMyBAQAogUHlNT0RJTklUX0ZVTkMKIGluaXRfcmFuZG9tKHZvaWQpCiB7Ci0JUHlPYmplY3QgKm07CisgICAgUHlPYmplY3QgKm07CiAKLQlpZiAoUHlUeXBlX1JlYWR5KCZSYW5kb21fVHlwZSkgPCAwKQotCQlyZXR1cm47Ci0JbSA9IFB5X0luaXRNb2R1bGUzKCJfcmFuZG9tIiwgTlVMTCwgbW9kdWxlX2RvYyk7Ci0JaWYgKG0gPT0gTlVMTCkKLQkJcmV0dXJuOwotCVB5X0lOQ1JFRigmUmFuZG9tX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiUmFuZG9tIiwgKFB5T2JqZWN0ICopJlJhbmRvbV9UeXBlKTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZSYW5kb21fVHlwZSkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgbSA9IFB5X0luaXRNb2R1bGUzKCJfcmFuZG9tIiwgTlVMTCwgbW9kdWxlX2RvYyk7CisgICAgaWYgKG0gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0lOQ1JFRigmUmFuZG9tX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiUmFuZG9tIiwgKFB5T2JqZWN0ICopJlJhbmRvbV9UeXBlKTsKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvX3N0cnVjdC5jIGIvTW9kdWxlcy9fc3RydWN0LmMKaW5kZXggZDkyNGNhZC4uNmQyNDUyYiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fc3RydWN0LmMKKysrIGIvTW9kdWxlcy9fc3RydWN0LmMKQEAgLTQ0LDMwICs0NCwzMCBAQAogCiAvKiBUaGUgdHJhbnNsYXRpb24gZnVuY3Rpb24gZm9yIGVhY2ggZm9ybWF0IGNoYXJhY3RlciBpcyB0YWJsZSBkcml2ZW4gKi8KIHR5cGVkZWYgc3RydWN0IF9mb3JtYXRkZWYgewotCWNoYXIgZm9ybWF0OwotCVB5X3NzaXplX3Qgc2l6ZTsKLQlQeV9zc2l6ZV90IGFsaWdubWVudDsKLQlQeU9iamVjdCogKCp1bnBhY2spKGNvbnN0IGNoYXIgKiwKLQkJCSAgICBjb25zdCBzdHJ1Y3QgX2Zvcm1hdGRlZiAqKTsKLQlpbnQgKCpwYWNrKShjaGFyICosIFB5T2JqZWN0ICosCi0JCSAgICBjb25zdCBzdHJ1Y3QgX2Zvcm1hdGRlZiAqKTsKKyAgICBjaGFyIGZvcm1hdDsKKyAgICBQeV9zc2l6ZV90IHNpemU7CisgICAgUHlfc3NpemVfdCBhbGlnbm1lbnQ7CisgICAgUHlPYmplY3QqICgqdW5wYWNrKShjb25zdCBjaGFyICosCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgX2Zvcm1hdGRlZiAqKTsKKyAgICBpbnQgKCpwYWNrKShjaGFyICosIFB5T2JqZWN0ICosCisgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IF9mb3JtYXRkZWYgKik7CiB9IGZvcm1hdGRlZjsKIAogdHlwZWRlZiBzdHJ1Y3QgX2Zvcm1hdGNvZGUgewotCWNvbnN0IHN0cnVjdCBfZm9ybWF0ZGVmICpmbXRkZWY7Ci0JUHlfc3NpemVfdCBvZmZzZXQ7Ci0JUHlfc3NpemVfdCBzaXplOworICAgIGNvbnN0IHN0cnVjdCBfZm9ybWF0ZGVmICpmbXRkZWY7CisgICAgUHlfc3NpemVfdCBvZmZzZXQ7CisgICAgUHlfc3NpemVfdCBzaXplOwogfSBmb3JtYXRjb2RlOwogCiAvKiBTdHJ1Y3Qgb2JqZWN0IGludGVyZmFjZSAqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCVB5X3NzaXplX3Qgc19zaXplOwotCVB5X3NzaXplX3Qgc19sZW47Ci0JZm9ybWF0Y29kZSAqc19jb2RlczsKLQlQeU9iamVjdCAqc19mb3JtYXQ7Ci0JUHlPYmplY3QgKndlYWtyZWZsaXN0OyAvKiBMaXN0IG9mIHdlYWsgcmVmZXJlbmNlcyAqLworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBQeV9zc2l6ZV90IHNfc2l6ZTsKKyAgICBQeV9zc2l6ZV90IHNfbGVuOworICAgIGZvcm1hdGNvZGUgKnNfY29kZXM7CisgICAgUHlPYmplY3QgKnNfZm9ybWF0OworICAgIFB5T2JqZWN0ICp3ZWFrcmVmbGlzdDsgLyogTGlzdCBvZiB3ZWFrIHJlZmVyZW5jZXMgKi8KIH0gUHlTdHJ1Y3RPYmplY3Q7CiAKIApAQCAtMTI0LDI3ICsxMjQsMjcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZXRfcHlsb25nKFB5T2JqZWN0ICp2KQogewotCVB5TnVtYmVyTWV0aG9kcyAqbTsKKyAgICBQeU51bWJlck1ldGhvZHMgKm07CiAKLQlhc3NlcnQodiAhPSBOVUxMKTsKLQlpZiAoUHlJbnRfQ2hlY2sodikpCi0JCXJldHVybiBQeUxvbmdfRnJvbUxvbmcoUHlJbnRfQVNfTE9ORyh2KSk7Ci0JaWYgKFB5TG9uZ19DaGVjayh2KSkgewotCQlQeV9JTkNSRUYodik7Ci0JCXJldHVybiB2OwotCX0KLQltID0gUHlfVFlQRSh2KS0+dHBfYXNfbnVtYmVyOwotCWlmIChtICE9IE5VTEwgJiYgbS0+bmJfbG9uZyAhPSBOVUxMKSB7Ci0JCXYgPSBtLT5uYl9sb25nKHYpOwotCQlpZiAodiA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWlmIChQeUxvbmdfQ2hlY2sodikpCi0JCQlyZXR1cm4gdjsKLQkJUHlfREVDUkVGKHYpOwotCX0KLQlQeUVycl9TZXRTdHJpbmcoU3RydWN0RXJyb3IsCi0JCQkiY2Fubm90IGNvbnZlcnQgYXJndW1lbnQgdG8gbG9uZyIpOwotCXJldHVybiBOVUxMOworICAgIGFzc2VydCh2ICE9IE5VTEwpOworICAgIGlmIChQeUludF9DaGVjayh2KSkKKyAgICAgICAgcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZyhQeUludF9BU19MT05HKHYpKTsKKyAgICBpZiAoUHlMb25nX0NoZWNrKHYpKSB7CisgICAgICAgIFB5X0lOQ1JFRih2KTsKKyAgICAgICAgcmV0dXJuIHY7CisgICAgfQorICAgIG0gPSBQeV9UWVBFKHYpLT50cF9hc19udW1iZXI7CisgICAgaWYgKG0gIT0gTlVMTCAmJiBtLT5uYl9sb25nICE9IE5VTEwpIHsKKyAgICAgICAgdiA9IG0tPm5iX2xvbmcodik7CisgICAgICAgIGlmICh2ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKFB5TG9uZ19DaGVjayh2KSkKKyAgICAgICAgICAgIHJldHVybiB2OworICAgICAgICBQeV9ERUNSRUYodik7CisgICAgfQorICAgIFB5RXJyX1NldFN0cmluZyhTdHJ1Y3RFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgImNhbm5vdCBjb252ZXJ0IGFyZ3VtZW50IHRvIGxvbmciKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogLyogSGVscGVyIHJvdXRpbmUgdG8gZ2V0IGEgUHl0aG9uIGludGVnZXIgYW5kIHJhaXNlIHRoZSBhcHByb3ByaWF0ZSBlcnJvcgpAQCAtMTUzLDMwICsxNTMsMzAgQEAKIHN0YXRpYyBpbnQKIGdldF9sb25nKFB5T2JqZWN0ICp2LCBsb25nICpwKQogewotCWxvbmcgeCA9IFB5SW50X0FzTG9uZyh2KTsKLQlpZiAoeCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgbG9uZyB4ID0gUHlJbnRfQXNMb25nKHYpOworICAgIGlmICh4ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpIHsKICNpZmRlZiBQWV9TVFJVQ1RfRkxPQVRfQ09FUkNFCi0JCWlmIChQeUZsb2F0X0NoZWNrKHYpKSB7Ci0JCQlQeU9iamVjdCAqbzsKLQkJCWludCByZXM7Ci0JCQlQeUVycl9DbGVhcigpOwotCQkJaWYgKFB5RXJyX1dhcm5FeChQeUV4Y19EZXByZWNhdGlvbldhcm5pbmcsIEZMT0FUX0NPRVJDRSwgMSkgPCAwKQotCQkJCXJldHVybiAtMTsKLQkJCW8gPSBQeU51bWJlcl9JbnQodik7Ci0JCQlpZiAobyA9PSBOVUxMKQotCQkJCXJldHVybiAtMTsKLQkJCXJlcyA9IGdldF9sb25nKG8sIHApOwotCQkJUHlfREVDUkVGKG8pOwotCQkJcmV0dXJuIHJlczsKLQkJfQorICAgICAgICBpZiAoUHlGbG9hdF9DaGVjayh2KSkgeworICAgICAgICAgICAgUHlPYmplY3QgKm87CisgICAgICAgICAgICBpbnQgcmVzOworICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgIGlmIChQeUVycl9XYXJuRXgoUHlFeGNfRGVwcmVjYXRpb25XYXJuaW5nLCBGTE9BVF9DT0VSQ0UsIDEpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBvID0gUHlOdW1iZXJfSW50KHYpOworICAgICAgICAgICAgaWYgKG8gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICByZXMgPSBnZXRfbG9uZyhvLCBwKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihvKTsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KICNlbmRpZgotCQlpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19UeXBlRXJyb3IpKQotCQkJUHlFcnJfU2V0U3RyaW5nKFN0cnVjdEVycm9yLAotCQkJCQkicmVxdWlyZWQgYXJndW1lbnQgaXMgbm90IGFuIGludGVnZXIiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQkqcCA9IHg7Ci0JcmV0dXJuIDA7CisgICAgICAgIGlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1R5cGVFcnJvcikpCisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoU3RydWN0RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlcXVpcmVkIGFyZ3VtZW50IGlzIG5vdCBhbiBpbnRlZ2VyIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgKnAgPSB4OworICAgIHJldHVybiAwOwogfQogCiAKQEAgLTE4NywyMSArMTg3LDIxIEBACiBzdGF0aWMgaW50CiBnZXRfdWxvbmcoUHlPYmplY3QgKnYsIHVuc2lnbmVkIGxvbmcgKnApCiB7Ci0JaWYgKFB5TG9uZ19DaGVjayh2KSkgewotCQl1bnNpZ25lZCBsb25nIHggPSBQeUxvbmdfQXNVbnNpZ25lZExvbmcodik7Ci0JCWlmICh4ID09ICh1bnNpZ25lZCBsb25nKSgtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJCXJldHVybiAtMTsKLQkJKnAgPSB4OwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKGdldF9sb25nKHYsIChsb25nICopcCkgPCAwKQotCQlyZXR1cm4gLTE7Ci0JaWYgKCgobG9uZykqcCkgPCAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhTdHJ1Y3RFcnJvciwKLQkJCQkidW5zaWduZWQgYXJndW1lbnQgaXMgPCAwIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JcmV0dXJuIDA7CisgICAgaWYgKFB5TG9uZ19DaGVjayh2KSkgeworICAgICAgICB1bnNpZ25lZCBsb25nIHggPSBQeUxvbmdfQXNVbnNpZ25lZExvbmcodik7CisgICAgICAgIGlmICh4ID09ICh1bnNpZ25lZCBsb25nKSgtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgKnAgPSB4OworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKGdldF9sb25nKHYsIChsb25nICopcCkgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKCgobG9uZykqcCkgPCAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhTdHJ1Y3RFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ1bnNpZ25lZCBhcmd1bWVudCBpcyA8IDAiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogI2VuZGlmIC8qIFBZX1NUUlVDVF9PVkVSRkxPV19NQVNLSU5HICovCkBAIC0yMTMsMTggKzIxMywxOCBAQAogc3RhdGljIGludAogZ2V0X2xvbmdsb25nKFB5T2JqZWN0ICp2LCBQWV9MT05HX0xPTkcgKnApCiB7Ci0JUFlfTE9OR19MT05HIHg7CisgICAgUFlfTE9OR19MT05HIHg7CiAKLQl2ID0gZ2V0X3B5bG9uZyh2KTsKLQlpZiAodiA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0JYXNzZXJ0KFB5TG9uZ19DaGVjayh2KSk7Ci0JeCA9IFB5TG9uZ19Bc0xvbmdMb25nKHYpOwotCVB5X0RFQ1JFRih2KTsKLQlpZiAoeCA9PSAoUFlfTE9OR19MT05HKS0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiAtMTsKLQkqcCA9IHg7Ci0JcmV0dXJuIDA7CisgICAgdiA9IGdldF9weWxvbmcodik7CisgICAgaWYgKHYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGFzc2VydChQeUxvbmdfQ2hlY2sodikpOworICAgIHggPSBQeUxvbmdfQXNMb25nTG9uZyh2KTsKKyAgICBQeV9ERUNSRUYodik7CisgICAgaWYgKHggPT0gKFBZX0xPTkdfTE9ORyktMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgKnAgPSB4OworICAgIHJldHVybiAwOwogfQogCiAvKiBTYW1lLCBidXQgaGFuZGxpbmcgbmF0aXZlIHVuc2lnbmVkIGxvbmcgbG9uZy4gKi8KQEAgLTIzMiwxOCArMjMyLDE4IEBACiBzdGF0aWMgaW50CiBnZXRfdWxvbmdsb25nKFB5T2JqZWN0ICp2LCB1bnNpZ25lZCBQWV9MT05HX0xPTkcgKnApCiB7Ci0JdW5zaWduZWQgUFlfTE9OR19MT05HIHg7CisgICAgdW5zaWduZWQgUFlfTE9OR19MT05HIHg7CiAKLQl2ID0gZ2V0X3B5bG9uZyh2KTsKLQlpZiAodiA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0JYXNzZXJ0KFB5TG9uZ19DaGVjayh2KSk7Ci0JeCA9IFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ0xvbmcodik7Ci0JUHlfREVDUkVGKHYpOwotCWlmICh4ID09ICh1bnNpZ25lZCBQWV9MT05HX0xPTkcpLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIC0xOwotCSpwID0geDsKLQlyZXR1cm4gMDsKKyAgICB2ID0gZ2V0X3B5bG9uZyh2KTsKKyAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAgYXNzZXJ0KFB5TG9uZ19DaGVjayh2KSk7CisgICAgeCA9IFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ0xvbmcodik7CisgICAgUHlfREVDUkVGKHYpOworICAgIGlmICh4ID09ICh1bnNpZ25lZCBQWV9MT05HX0xPTkcpLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgICpwID0geDsKKyAgICByZXR1cm4gMDsKIH0KIAogI2VuZGlmCkBAIC0yNTgsODkgKzI1OCw4OSBAQAogc3RhdGljIGludAogZ2V0X3dyYXBwZWRfbG9uZyhQeU9iamVjdCAqdiwgbG9uZyAqcCkKIHsKLQlpZiAoZ2V0X2xvbmcodiwgcCkgPCAwKSB7Ci0JCWlmIChQeUxvbmdfQ2hlY2sodikgJiYKLQkJICAgIFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfT3ZlcmZsb3dFcnJvcikpIHsKLQkJCVB5T2JqZWN0ICp3cmFwcGVkOwotCQkJbG9uZyB4OwotCQkJUHlFcnJfQ2xlYXIoKTsKKyAgICBpZiAoZ2V0X2xvbmcodiwgcCkgPCAwKSB7CisgICAgICAgIGlmIChQeUxvbmdfQ2hlY2sodikgJiYKKyAgICAgICAgICAgIFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfT3ZlcmZsb3dFcnJvcikpIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICp3cmFwcGVkOworICAgICAgICAgICAgbG9uZyB4OworICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKICNpZmRlZiBQWV9TVFJVQ1RfRkxPQVRfQ09FUkNFCi0JCQlpZiAoUHlGbG9hdF9DaGVjayh2KSkgewotCQkJCVB5T2JqZWN0ICpvOwotCQkJCWludCByZXM7Ci0JCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCQlpZiAoUHlFcnJfV2FybkV4KFB5RXhjX0RlcHJlY2F0aW9uV2FybmluZywgRkxPQVRfQ09FUkNFLCAxKSA8IDApCi0JCQkJCXJldHVybiAtMTsKLQkJCQlvID0gUHlOdW1iZXJfSW50KHYpOwotCQkJCWlmIChvID09IE5VTEwpCi0JCQkJCXJldHVybiAtMTsKLQkJCQlyZXMgPSBnZXRfd3JhcHBlZF9sb25nKG8sIHApOwotCQkJCVB5X0RFQ1JFRihvKTsKLQkJCQlyZXR1cm4gcmVzOwotCQkJfQorICAgICAgICAgICAgaWYgKFB5RmxvYXRfQ2hlY2sodikpIHsKKyAgICAgICAgICAgICAgICBQeU9iamVjdCAqbzsKKyAgICAgICAgICAgICAgICBpbnQgcmVzOworICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICAgICAgaWYgKFB5RXJyX1dhcm5FeChQeUV4Y19EZXByZWNhdGlvbldhcm5pbmcsIEZMT0FUX0NPRVJDRSwgMSkgPCAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgbyA9IFB5TnVtYmVyX0ludCh2KTsKKyAgICAgICAgICAgICAgICBpZiAobyA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgcmVzID0gZ2V0X3dyYXBwZWRfbG9uZyhvLCBwKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYobyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgICAgIH0KICNlbmRpZgotCQkJaWYgKFB5RXJyX1dhcm5FeChQeUV4Y19EZXByZWNhdGlvbldhcm5pbmcsIElOVF9PVkVSRkxPVywgMSkgPCAwKQotCQkJCXJldHVybiAtMTsKLQkJCXdyYXBwZWQgPSBQeU51bWJlcl9BbmQodiwgcHlsb25nX3Vsb25nX21hc2spOwotCQkJaWYgKHdyYXBwZWQgPT0gTlVMTCkKLQkJCQlyZXR1cm4gLTE7Ci0JCQl4ID0gKGxvbmcpUHlMb25nX0FzVW5zaWduZWRMb25nKHdyYXBwZWQpOwotCQkJUHlfREVDUkVGKHdyYXBwZWQpOwotCQkJaWYgKHggPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJCQlyZXR1cm4gLTE7Ci0JCQkqcCA9IHg7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9Ci0JcmV0dXJuIDA7CisgICAgICAgICAgICBpZiAoUHlFcnJfV2FybkV4KFB5RXhjX0RlcHJlY2F0aW9uV2FybmluZywgSU5UX09WRVJGTE9XLCAxKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgd3JhcHBlZCA9IFB5TnVtYmVyX0FuZCh2LCBweWxvbmdfdWxvbmdfbWFzayk7CisgICAgICAgICAgICBpZiAod3JhcHBlZCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIHggPSAobG9uZylQeUxvbmdfQXNVbnNpZ25lZExvbmcod3JhcHBlZCk7CisgICAgICAgICAgICBQeV9ERUNSRUYod3JhcHBlZCk7CisgICAgICAgICAgICBpZiAoeCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICpwID0geDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogZ2V0X3dyYXBwZWRfdWxvbmcoUHlPYmplY3QgKnYsIHVuc2lnbmVkIGxvbmcgKnApCiB7Ci0JbG9uZyB4ID0gKGxvbmcpUHlMb25nX0FzVW5zaWduZWRMb25nKHYpOwotCWlmICh4ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpIHsKLQkJUHlPYmplY3QgKndyYXBwZWQ7Ci0JCVB5RXJyX0NsZWFyKCk7CisgICAgbG9uZyB4ID0gKGxvbmcpUHlMb25nX0FzVW5zaWduZWRMb25nKHYpOworICAgIGlmICh4ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgUHlPYmplY3QgKndyYXBwZWQ7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CiAjaWZkZWYgUFlfU1RSVUNUX0ZMT0FUX0NPRVJDRQotCQlpZiAoUHlGbG9hdF9DaGVjayh2KSkgewotCQkJUHlPYmplY3QgKm87Ci0JCQlpbnQgcmVzOwotCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCWlmIChQeUVycl9XYXJuRXgoUHlFeGNfRGVwcmVjYXRpb25XYXJuaW5nLCBGTE9BVF9DT0VSQ0UsIDEpIDwgMCkKLQkJCQlyZXR1cm4gLTE7Ci0JCQlvID0gUHlOdW1iZXJfSW50KHYpOwotCQkJaWYgKG8gPT0gTlVMTCkKLQkJCQlyZXR1cm4gLTE7Ci0JCQlyZXMgPSBnZXRfd3JhcHBlZF91bG9uZyhvLCBwKTsKLQkJCVB5X0RFQ1JFRihvKTsKLQkJCXJldHVybiByZXM7Ci0JCX0KKyAgICAgICAgaWYgKFB5RmxvYXRfQ2hlY2sodikpIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpvOworICAgICAgICAgICAgaW50IHJlczsKKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICBpZiAoUHlFcnJfV2FybkV4KFB5RXhjX0RlcHJlY2F0aW9uV2FybmluZywgRkxPQVRfQ09FUkNFLCAxKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgbyA9IFB5TnVtYmVyX0ludCh2KTsKKyAgICAgICAgICAgIGlmIChvID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgcmVzID0gZ2V0X3dyYXBwZWRfdWxvbmcobywgcCk7CisgICAgICAgICAgICBQeV9ERUNSRUYobyk7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CiAjZW5kaWYKLQkJd3JhcHBlZCA9IFB5TnVtYmVyX0FuZCh2LCBweWxvbmdfdWxvbmdfbWFzayk7Ci0JCWlmICh3cmFwcGVkID09IE5VTEwpCi0JCQlyZXR1cm4gLTE7Ci0JCWlmIChQeUVycl9XYXJuRXgoUHlFeGNfRGVwcmVjYXRpb25XYXJuaW5nLCBJTlRfT1ZFUkZMT1csIDEpIDwgMCkgewotCQkJUHlfREVDUkVGKHdyYXBwZWQpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCXggPSAobG9uZylQeUxvbmdfQXNVbnNpZ25lZExvbmcod3JhcHBlZCk7Ci0JCVB5X0RFQ1JFRih3cmFwcGVkKTsKLQkJaWYgKHggPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJCXJldHVybiAtMTsKLQl9Ci0JKnAgPSAodW5zaWduZWQgbG9uZyl4OwotCXJldHVybiAwOworICAgICAgICB3cmFwcGVkID0gUHlOdW1iZXJfQW5kKHYsIHB5bG9uZ191bG9uZ19tYXNrKTsKKyAgICAgICAgaWYgKHdyYXBwZWQgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaWYgKFB5RXJyX1dhcm5FeChQeUV4Y19EZXByZWNhdGlvbldhcm5pbmcsIElOVF9PVkVSRkxPVywgMSkgPCAwKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYod3JhcHBlZCk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgeCA9IChsb25nKVB5TG9uZ19Bc1Vuc2lnbmVkTG9uZyh3cmFwcGVkKTsKKyAgICAgICAgUHlfREVDUkVGKHdyYXBwZWQpOworICAgICAgICBpZiAoeCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICAqcCA9ICh1bnNpZ25lZCBsb25nKXg7CisgICAgcmV0dXJuIDA7CiB9CiAKICNkZWZpbmUgUkFOR0VfRVJST1IoeCwgZiwgZmxhZywgbWFzaykgXAotCWRvIHsgXAotCQlpZiAoX3JhbmdlX2Vycm9yKGYsIGZsYWcpIDwgMCkgXAotCQkJcmV0dXJuIC0xOyBcCi0JCWVsc2UgXAotCQkJKHgpICY9IChtYXNrKTsgXAotCX0gd2hpbGUgKDApCisgICAgZG8geyBcCisgICAgICAgIGlmIChfcmFuZ2VfZXJyb3IoZiwgZmxhZykgPCAwKSBcCisgICAgICAgICAgICByZXR1cm4gLTE7IFwKKyAgICAgICAgZWxzZSBcCisgICAgICAgICAgICAoeCkgJj0gKG1hc2spOyBcCisgICAgfSB3aGlsZSAoMCkKIAogI2Vsc2UKIApAQCAtMzU0LDc2ICszNTQsNzYgQEAKIAogc3RhdGljIFB5T2JqZWN0ICoKIHVucGFja19mbG9hdChjb25zdCBjaGFyICpwLCAgLyogc3RhcnQgb2YgNC1ieXRlIHN0cmluZyAqLwotICAgICAgICAgICAgIGludCBsZSkJICAgICAvKiB0cnVlIGZvciBsaXR0bGUtZW5kaWFuLCBmYWxzZSBmb3IgYmlnLWVuZGlhbiAqLworICAgICAgICAgaW50IGxlKSAgICAgICAgICAgICAvKiB0cnVlIGZvciBsaXR0bGUtZW5kaWFuLCBmYWxzZSBmb3IgYmlnLWVuZGlhbiAqLwogewotCWRvdWJsZSB4OworICAgIGRvdWJsZSB4OwogCi0JeCA9IF9QeUZsb2F0X1VucGFjazQoKHVuc2lnbmVkIGNoYXIgKilwLCBsZSk7Ci0JaWYgKHggPT0gLTEuMCAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKHgpOworICAgIHggPSBfUHlGbG9hdF9VbnBhY2s0KCh1bnNpZ25lZCBjaGFyICopcCwgbGUpOworICAgIGlmICh4ID09IC0xLjAgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZSh4KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHVucGFja19kb3VibGUoY29uc3QgY2hhciAqcCwgIC8qIHN0YXJ0IG9mIDgtYnl0ZSBzdHJpbmcgKi8KLSAgICAgICAgICAgICAgaW50IGxlKSAgICAgICAgIC8qIHRydWUgZm9yIGxpdHRsZS1lbmRpYW4sIGZhbHNlIGZvciBiaWctZW5kaWFuICovCisgICAgICAgICAgaW50IGxlKSAgICAgICAgIC8qIHRydWUgZm9yIGxpdHRsZS1lbmRpYW4sIGZhbHNlIGZvciBiaWctZW5kaWFuICovCiB7Ci0JZG91YmxlIHg7CisgICAgZG91YmxlIHg7CiAKLQl4ID0gX1B5RmxvYXRfVW5wYWNrOCgodW5zaWduZWQgY2hhciAqKXAsIGxlKTsKLQlpZiAoeCA9PSAtMS4wICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoeCk7CisgICAgeCA9IF9QeUZsb2F0X1VucGFjazgoKHVuc2lnbmVkIGNoYXIgKilwLCBsZSk7CisgICAgaWYgKHggPT0gLTEuMCAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKHgpOwogfQogCiAvKiBIZWxwZXIgdG8gZm9ybWF0IHRoZSByYW5nZSBlcnJvciBleGNlcHRpb25zICovCiBzdGF0aWMgaW50CiBfcmFuZ2VfZXJyb3IoY29uc3QgZm9ybWF0ZGVmICpmLCBpbnQgaXNfdW5zaWduZWQpCiB7Ci0JLyogdWxhcmdlc3QgaXMgdGhlIGxhcmdlc3QgdW5zaWduZWQgdmFsdWUgd2l0aCBmLT5zaXplIGJ5dGVzLgotCSAqIE5vdGUgdGhhdCB0aGUgc2ltcGxlcjoKLQkgKiAgICAgKChzaXplX3QpMSA8PCAoZi0+c2l6ZSAqIDgpKSAtIDEKLQkgKiBkb2Vzbid0IHdvcmsgd2hlbiBmLT5zaXplID09IHNpemVvZihzaXplX3QpIGJlY2F1c2UgQyBkb2Vzbid0Ci0JICogZGVmaW5lIHdoYXQgaGFwcGVucyB3aGVuIGEgbGVmdCBzaGlmdCBjb3VudCBpcyA+PSB0aGUgbnVtYmVyIG9mCi0JICogYml0cyBpbiB0aGUgaW50ZWdlciBiZWluZyBzaGlmdGVkOyBlLmcuLCBvbiBzb21lIGJveGVzIGl0IGRvZXNuJ3QKLQkgKiBzaGlmdCBhdCBhbGwgd2hlbiB0aGV5J3JlIGVxdWFsLgotCSAqLwotCWNvbnN0IHNpemVfdCB1bGFyZ2VzdCA9IChzaXplX3QpLTEgPj4gKChTSVpFT0ZfU0laRV9UIC0gZi0+c2l6ZSkqOCk7Ci0JYXNzZXJ0KGYtPnNpemUgPj0gMSAmJiBmLT5zaXplIDw9IFNJWkVPRl9TSVpFX1QpOwotCWlmIChpc191bnNpZ25lZCkKLQkJUHlFcnJfRm9ybWF0KFN0cnVjdEVycm9yLAotCQkJIiclYycgZm9ybWF0IHJlcXVpcmVzIDAgPD0gbnVtYmVyIDw9ICV6dSIsCi0JCQlmLT5mb3JtYXQsCi0JCQl1bGFyZ2VzdCk7Ci0JZWxzZSB7Ci0JCWNvbnN0IFB5X3NzaXplX3QgbGFyZ2VzdCA9IChQeV9zc2l6ZV90KSh1bGFyZ2VzdCA+PiAxKTsKLQkJUHlFcnJfRm9ybWF0KFN0cnVjdEVycm9yLAotCQkJIiclYycgZm9ybWF0IHJlcXVpcmVzICV6ZCA8PSBudW1iZXIgPD0gJXpkIiwKLQkJCWYtPmZvcm1hdCwKLQkJCX4gbGFyZ2VzdCwKLQkJCWxhcmdlc3QpOwotCX0KKyAgICAvKiB1bGFyZ2VzdCBpcyB0aGUgbGFyZ2VzdCB1bnNpZ25lZCB2YWx1ZSB3aXRoIGYtPnNpemUgYnl0ZXMuCisgICAgICogTm90ZSB0aGF0IHRoZSBzaW1wbGVyOgorICAgICAqICAgICAoKHNpemVfdCkxIDw8IChmLT5zaXplICogOCkpIC0gMQorICAgICAqIGRvZXNuJ3Qgd29yayB3aGVuIGYtPnNpemUgPT0gc2l6ZW9mKHNpemVfdCkgYmVjYXVzZSBDIGRvZXNuJ3QKKyAgICAgKiBkZWZpbmUgd2hhdCBoYXBwZW5zIHdoZW4gYSBsZWZ0IHNoaWZ0IGNvdW50IGlzID49IHRoZSBudW1iZXIgb2YKKyAgICAgKiBiaXRzIGluIHRoZSBpbnRlZ2VyIGJlaW5nIHNoaWZ0ZWQ7IGUuZy4sIG9uIHNvbWUgYm94ZXMgaXQgZG9lc24ndAorICAgICAqIHNoaWZ0IGF0IGFsbCB3aGVuIHRoZXkncmUgZXF1YWwuCisgICAgICovCisgICAgY29uc3Qgc2l6ZV90IHVsYXJnZXN0ID0gKHNpemVfdCktMSA+PiAoKFNJWkVPRl9TSVpFX1QgLSBmLT5zaXplKSo4KTsKKyAgICBhc3NlcnQoZi0+c2l6ZSA+PSAxICYmIGYtPnNpemUgPD0gU0laRU9GX1NJWkVfVCk7CisgICAgaWYgKGlzX3Vuc2lnbmVkKQorICAgICAgICBQeUVycl9Gb3JtYXQoU3RydWN0RXJyb3IsCisgICAgICAgICAgICAiJyVjJyBmb3JtYXQgcmVxdWlyZXMgMCA8PSBudW1iZXIgPD0gJXp1IiwKKyAgICAgICAgICAgIGYtPmZvcm1hdCwKKyAgICAgICAgICAgIHVsYXJnZXN0KTsKKyAgICBlbHNlIHsKKyAgICAgICAgY29uc3QgUHlfc3NpemVfdCBsYXJnZXN0ID0gKFB5X3NzaXplX3QpKHVsYXJnZXN0ID4+IDEpOworICAgICAgICBQeUVycl9Gb3JtYXQoU3RydWN0RXJyb3IsCisgICAgICAgICAgICAiJyVjJyBmb3JtYXQgcmVxdWlyZXMgJXpkIDw9IG51bWJlciA8PSAlemQiLAorICAgICAgICAgICAgZi0+Zm9ybWF0LAorICAgICAgICAgICAgfiBsYXJnZXN0LAorICAgICAgICAgICAgbGFyZ2VzdCk7CisgICAgfQogI2lmZGVmIFBZX1NUUlVDVF9PVkVSRkxPV19NQVNLSU5HCi0JewotCQlQeU9iamVjdCAqcHR5cGUsICpwdmFsdWUsICpwdHJhY2ViYWNrOwotCQlQeU9iamVjdCAqbXNnOwotCQlpbnQgcnZhbDsKLQkJUHlFcnJfRmV0Y2goJnB0eXBlLCAmcHZhbHVlLCAmcHRyYWNlYmFjayk7Ci0JCWFzc2VydChwdmFsdWUgIT0gTlVMTCk7Ci0JCW1zZyA9IFB5T2JqZWN0X1N0cihwdmFsdWUpOwotCQlQeV9YREVDUkVGKHB0eXBlKTsKLQkJUHlfWERFQ1JFRihwdmFsdWUpOwotCQlQeV9YREVDUkVGKHB0cmFjZWJhY2spOwotCQlpZiAobXNnID09IE5VTEwpCi0JCQlyZXR1cm4gLTE7Ci0JCXJ2YWwgPSBQeUVycl9XYXJuRXgoUHlFeGNfRGVwcmVjYXRpb25XYXJuaW5nLAotCQkJCSAgICBQeVN0cmluZ19BU19TVFJJTkcobXNnKSwgMSk7Ci0JCVB5X0RFQ1JFRihtc2cpOwotCQlpZiAocnZhbCA9PSAwKQotCQkJcmV0dXJuIDA7Ci0JfQorICAgIHsKKyAgICAgICAgUHlPYmplY3QgKnB0eXBlLCAqcHZhbHVlLCAqcHRyYWNlYmFjazsKKyAgICAgICAgUHlPYmplY3QgKm1zZzsKKyAgICAgICAgaW50IHJ2YWw7CisgICAgICAgIFB5RXJyX0ZldGNoKCZwdHlwZSwgJnB2YWx1ZSwgJnB0cmFjZWJhY2spOworICAgICAgICBhc3NlcnQocHZhbHVlICE9IE5VTEwpOworICAgICAgICBtc2cgPSBQeU9iamVjdF9TdHIocHZhbHVlKTsKKyAgICAgICAgUHlfWERFQ1JFRihwdHlwZSk7CisgICAgICAgIFB5X1hERUNSRUYocHZhbHVlKTsKKyAgICAgICAgUHlfWERFQ1JFRihwdHJhY2ViYWNrKTsKKyAgICAgICAgaWYgKG1zZyA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBydmFsID0gUHlFcnJfV2FybkV4KFB5RXhjX0RlcHJlY2F0aW9uV2FybmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcobXNnKSwgMSk7CisgICAgICAgIFB5X0RFQ1JFRihtc2cpOworICAgICAgICBpZiAocnZhbCA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQogI2VuZGlmCi0JcmV0dXJuIC0xOworICAgIHJldHVybiAtMTsKIH0KIAogCkBAIC00NTAsNzUgKzQ1MCw3NSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIG51X2NoYXIoY29uc3QgY2hhciAqcCwgY29uc3QgZm9ybWF0ZGVmICpmKQogewotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShwLCAxKTsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocCwgMSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBudV9ieXRlKGNvbnN0IGNoYXIgKnAsIGNvbnN0IGZvcm1hdGRlZiAqZikKIHsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpICooc2lnbmVkIGNoYXIgKilwKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpICooc2lnbmVkIGNoYXIgKilwKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG51X3VieXRlKGNvbnN0IGNoYXIgKnAsIGNvbnN0IGZvcm1hdGRlZiAqZikKIHsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpICoodW5zaWduZWQgY2hhciAqKXApOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZykgKih1bnNpZ25lZCBjaGFyICopcCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBudV9zaG9ydChjb25zdCBjaGFyICpwLCBjb25zdCBmb3JtYXRkZWYgKmYpCiB7Ci0Jc2hvcnQgeDsKLQltZW1jcHkoKGNoYXIgKikmeCwgcCwgc2l6ZW9mIHgpOwotCXJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZyl4KTsKKyAgICBzaG9ydCB4OworICAgIG1lbWNweSgoY2hhciAqKSZ4LCBwLCBzaXplb2YgeCk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKXgpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbnVfdXNob3J0KGNvbnN0IGNoYXIgKnAsIGNvbnN0IGZvcm1hdGRlZiAqZikKIHsKLQl1bnNpZ25lZCBzaG9ydCB4OwotCW1lbWNweSgoY2hhciAqKSZ4LCBwLCBzaXplb2YgeCk7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKXgpOworICAgIHVuc2lnbmVkIHNob3J0IHg7CisgICAgbWVtY3B5KChjaGFyICopJngsIHAsIHNpemVvZiB4KTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpeCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBudV9pbnQoY29uc3QgY2hhciAqcCwgY29uc3QgZm9ybWF0ZGVmICpmKQogewotCWludCB4OwotCW1lbWNweSgoY2hhciAqKSZ4LCBwLCBzaXplb2YgeCk7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKXgpOworICAgIGludCB4OworICAgIG1lbWNweSgoY2hhciAqKSZ4LCBwLCBzaXplb2YgeCk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKXgpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbnVfdWludChjb25zdCBjaGFyICpwLCBjb25zdCBmb3JtYXRkZWYgKmYpCiB7Ci0JdW5zaWduZWQgaW50IHg7Ci0JbWVtY3B5KChjaGFyICopJngsIHAsIHNpemVvZiB4KTsKKyAgICB1bnNpZ25lZCBpbnQgeDsKKyAgICBtZW1jcHkoKGNoYXIgKikmeCwgcCwgc2l6ZW9mIHgpOwogI2lmIChTSVpFT0ZfTE9ORyA+IFNJWkVPRl9JTlQpCi0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKXgpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZyl4KTsKICNlbHNlCi0JaWYgKHggPD0gKCh1bnNpZ25lZCBpbnQpTE9OR19NQVgpKQotCQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpeCk7Ci0JcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKCh1bnNpZ25lZCBsb25nKXgpOworICAgIGlmICh4IDw9ICgodW5zaWduZWQgaW50KUxPTkdfTUFYKSkKKyAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKXgpOworICAgIHJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZygodW5zaWduZWQgbG9uZyl4KTsKICNlbmRpZgogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbnVfbG9uZyhjb25zdCBjaGFyICpwLCBjb25zdCBmb3JtYXRkZWYgKmYpCiB7Ci0JbG9uZyB4OwotCW1lbWNweSgoY2hhciAqKSZ4LCBwLCBzaXplb2YgeCk7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKHgpOworICAgIGxvbmcgeDsKKyAgICBtZW1jcHkoKGNoYXIgKikmeCwgcCwgc2l6ZW9mIHgpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyh4KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG51X3Vsb25nKGNvbnN0IGNoYXIgKnAsIGNvbnN0IGZvcm1hdGRlZiAqZikKIHsKLQl1bnNpZ25lZCBsb25nIHg7Ci0JbWVtY3B5KChjaGFyICopJngsIHAsIHNpemVvZiB4KTsKLQlpZiAoeCA8PSBMT05HX01BWCkKLQkJcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKXgpOwotCXJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZyh4KTsKKyAgICB1bnNpZ25lZCBsb25nIHg7CisgICAgbWVtY3B5KChjaGFyICopJngsIHAsIHNpemVvZiB4KTsKKyAgICBpZiAoeCA8PSBMT05HX01BWCkKKyAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKXgpOworICAgIHJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZyh4KTsKIH0KIAogLyogTmF0aXZlIG1vZGUgZG9lc24ndCBzdXBwb3J0IHEgb3IgUSB1bmxlc3MgdGhlIHBsYXRmb3JtIEMgc3VwcG9ydHMKQEAgLTUyOSwyMSArNTI5LDIxIEBACiBzdGF0aWMgUHlPYmplY3QgKgogbnVfbG9uZ2xvbmcoY29uc3QgY2hhciAqcCwgY29uc3QgZm9ybWF0ZGVmICpmKQogewotCVBZX0xPTkdfTE9ORyB4OwotCW1lbWNweSgoY2hhciAqKSZ4LCBwLCBzaXplb2YgeCk7Ci0JaWYgKHggPj0gTE9OR19NSU4gJiYgeCA8PSBMT05HX01BWCkKLQkJcmV0dXJuIFB5SW50X0Zyb21Mb25nKFB5X1NBRkVfRE9XTkNBU1QoeCwgUFlfTE9OR19MT05HLCBsb25nKSk7Ci0JcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZ0xvbmcoeCk7CisgICAgUFlfTE9OR19MT05HIHg7CisgICAgbWVtY3B5KChjaGFyICopJngsIHAsIHNpemVvZiB4KTsKKyAgICBpZiAoeCA+PSBMT05HX01JTiAmJiB4IDw9IExPTkdfTUFYKQorICAgICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoUHlfU0FGRV9ET1dOQ0FTVCh4LCBQWV9MT05HX0xPTkcsIGxvbmcpKTsKKyAgICByZXR1cm4gUHlMb25nX0Zyb21Mb25nTG9uZyh4KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG51X3Vsb25nbG9uZyhjb25zdCBjaGFyICpwLCBjb25zdCBmb3JtYXRkZWYgKmYpCiB7Ci0JdW5zaWduZWQgUFlfTE9OR19MT05HIHg7Ci0JbWVtY3B5KChjaGFyICopJngsIHAsIHNpemVvZiB4KTsKLQlpZiAoeCA8PSBMT05HX01BWCkKLQkJcmV0dXJuIFB5SW50X0Zyb21Mb25nKFB5X1NBRkVfRE9XTkNBU1QoeCwgdW5zaWduZWQgUFlfTE9OR19MT05HLCBsb25nKSk7Ci0JcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nTG9uZyh4KTsKKyAgICB1bnNpZ25lZCBQWV9MT05HX0xPTkcgeDsKKyAgICBtZW1jcHkoKGNoYXIgKikmeCwgcCwgc2l6ZW9mIHgpOworICAgIGlmICh4IDw9IExPTkdfTUFYKQorICAgICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoUHlfU0FGRV9ET1dOQ0FTVCh4LCB1bnNpZ25lZCBQWV9MT05HX0xPTkcsIGxvbmcpKTsKKyAgICByZXR1cm4gUHlMb25nX0Zyb21VbnNpZ25lZExvbmdMb25nKHgpOwogfQogCiAjZW5kaWYKQEAgLTU1MSwxNjMgKzU1MSwxNjMgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBudV9ib29sKGNvbnN0IGNoYXIgKnAsIGNvbnN0IGZvcm1hdGRlZiAqZikKIHsKLQlCT09MX1RZUEUgeDsKLQltZW1jcHkoKGNoYXIgKikmeCwgcCwgc2l6ZW9mIHgpOwotCXJldHVybiBQeUJvb2xfRnJvbUxvbmcoeCAhPSAwKTsKKyAgICBCT09MX1RZUEUgeDsKKyAgICBtZW1jcHkoKGNoYXIgKikmeCwgcCwgc2l6ZW9mIHgpOworICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoeCAhPSAwKTsKIH0KIAogCiBzdGF0aWMgUHlPYmplY3QgKgogbnVfZmxvYXQoY29uc3QgY2hhciAqcCwgY29uc3QgZm9ybWF0ZGVmICpmKQogewotCWZsb2F0IHg7Ci0JbWVtY3B5KChjaGFyICopJngsIHAsIHNpemVvZiB4KTsKLQlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKChkb3VibGUpeCk7CisgICAgZmxvYXQgeDsKKyAgICBtZW1jcHkoKGNoYXIgKikmeCwgcCwgc2l6ZW9mIHgpOworICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoKGRvdWJsZSl4KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG51X2RvdWJsZShjb25zdCBjaGFyICpwLCBjb25zdCBmb3JtYXRkZWYgKmYpCiB7Ci0JZG91YmxlIHg7Ci0JbWVtY3B5KChjaGFyICopJngsIHAsIHNpemVvZiB4KTsKLQlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKHgpOworICAgIGRvdWJsZSB4OworICAgIG1lbWNweSgoY2hhciAqKSZ4LCBwLCBzaXplb2YgeCk7CisgICAgcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZSh4KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG51X3ZvaWRfcChjb25zdCBjaGFyICpwLCBjb25zdCBmb3JtYXRkZWYgKmYpCiB7Ci0Jdm9pZCAqeDsKLQltZW1jcHkoKGNoYXIgKikmeCwgcCwgc2l6ZW9mIHgpOwotCXJldHVybiBQeUxvbmdfRnJvbVZvaWRQdHIoeCk7CisgICAgdm9pZCAqeDsKKyAgICBtZW1jcHkoKGNoYXIgKikmeCwgcCwgc2l6ZW9mIHgpOworICAgIHJldHVybiBQeUxvbmdfRnJvbVZvaWRQdHIoeCk7CiB9CiAKIHN0YXRpYyBpbnQKIG5wX2J5dGUoY2hhciAqcCwgUHlPYmplY3QgKnYsIGNvbnN0IGZvcm1hdGRlZiAqZikKIHsKLQlsb25nIHg7Ci0JaWYgKGdldF9sb25nKHYsICZ4KSA8IDApCi0JCXJldHVybiAtMTsKLQlpZiAoeCA8IC0xMjggfHwgeCA+IDEyNyl7Ci0JCVB5RXJyX1NldFN0cmluZyhTdHJ1Y3RFcnJvciwKLQkJCQkiYnl0ZSBmb3JtYXQgcmVxdWlyZXMgLTEyOCA8PSBudW1iZXIgPD0gMTI3Iik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JKnAgPSAoY2hhcil4OwotCXJldHVybiAwOworICAgIGxvbmcgeDsKKyAgICBpZiAoZ2V0X2xvbmcodiwgJngpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmICh4IDwgLTEyOCB8fCB4ID4gMTI3KXsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFN0cnVjdEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImJ5dGUgZm9ybWF0IHJlcXVpcmVzIC0xMjggPD0gbnVtYmVyIDw9IDEyNyIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgICpwID0gKGNoYXIpeDsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogbnBfdWJ5dGUoY2hhciAqcCwgUHlPYmplY3QgKnYsIGNvbnN0IGZvcm1hdGRlZiAqZikKIHsKLQlsb25nIHg7Ci0JaWYgKGdldF9sb25nKHYsICZ4KSA8IDApCi0JCXJldHVybiAtMTsKLQlpZiAoeCA8IDAgfHwgeCA+IDI1NSl7Ci0JCVB5RXJyX1NldFN0cmluZyhTdHJ1Y3RFcnJvciwKLQkJCQkidWJ5dGUgZm9ybWF0IHJlcXVpcmVzIDAgPD0gbnVtYmVyIDw9IDI1NSIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCSpwID0gKGNoYXIpeDsKLQlyZXR1cm4gMDsKKyAgICBsb25nIHg7CisgICAgaWYgKGdldF9sb25nKHYsICZ4KSA8IDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAoeCA8IDAgfHwgeCA+IDI1NSl7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhTdHJ1Y3RFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ1Ynl0ZSBmb3JtYXQgcmVxdWlyZXMgMCA8PSBudW1iZXIgPD0gMjU1Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgKnAgPSAoY2hhcil4OworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBucF9jaGFyKGNoYXIgKnAsIFB5T2JqZWN0ICp2LCBjb25zdCBmb3JtYXRkZWYgKmYpCiB7Ci0JaWYgKCFQeVN0cmluZ19DaGVjayh2KSB8fCBQeVN0cmluZ19TaXplKHYpICE9IDEpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFN0cnVjdEVycm9yLAotCQkJCSJjaGFyIGZvcm1hdCByZXF1aXJlIHN0cmluZyBvZiBsZW5ndGggMSIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCSpwID0gKlB5U3RyaW5nX0FzU3RyaW5nKHYpOwotCXJldHVybiAwOworICAgIGlmICghUHlTdHJpbmdfQ2hlY2sodikgfHwgUHlTdHJpbmdfU2l6ZSh2KSAhPSAxKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhTdHJ1Y3RFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjaGFyIGZvcm1hdCByZXF1aXJlIHN0cmluZyBvZiBsZW5ndGggMSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgICpwID0gKlB5U3RyaW5nX0FzU3RyaW5nKHYpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBucF9zaG9ydChjaGFyICpwLCBQeU9iamVjdCAqdiwgY29uc3QgZm9ybWF0ZGVmICpmKQogewotCWxvbmcgeDsKLQlzaG9ydCB5OwotCWlmIChnZXRfbG9uZyh2LCAmeCkgPCAwKQotCQlyZXR1cm4gLTE7Ci0JaWYgKHggPCBTSFJUX01JTiB8fCB4ID4gU0hSVF9NQVgpewotCQlQeUVycl9TZXRTdHJpbmcoU3RydWN0RXJyb3IsCi0JCQkJInNob3J0IGZvcm1hdCByZXF1aXJlcyAiIFNUUklOR0lGWShTSFJUX01JTikKLQkJCQkiIDw9IG51bWJlciA8PSAiIFNUUklOR0lGWShTSFJUX01BWCkpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXkgPSAoc2hvcnQpeDsKLQltZW1jcHkocCwgKGNoYXIgKikmeSwgc2l6ZW9mIHkpOwotCXJldHVybiAwOworICAgIGxvbmcgeDsKKyAgICBzaG9ydCB5OworICAgIGlmIChnZXRfbG9uZyh2LCAmeCkgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKHggPCBTSFJUX01JTiB8fCB4ID4gU0hSVF9NQVgpeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoU3RydWN0RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAic2hvcnQgZm9ybWF0IHJlcXVpcmVzICIgU1RSSU5HSUZZKFNIUlRfTUlOKQorICAgICAgICAgICAgICAgICAgICAgICAgIiA8PSBudW1iZXIgPD0gIiBTVFJJTkdJRlkoU0hSVF9NQVgpKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICB5ID0gKHNob3J0KXg7CisgICAgbWVtY3B5KHAsIChjaGFyICopJnksIHNpemVvZiB5KTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogbnBfdXNob3J0KGNoYXIgKnAsIFB5T2JqZWN0ICp2LCBjb25zdCBmb3JtYXRkZWYgKmYpCiB7Ci0JbG9uZyB4OwotCXVuc2lnbmVkIHNob3J0IHk7Ci0JaWYgKGdldF9sb25nKHYsICZ4KSA8IDApCi0JCXJldHVybiAtMTsKLQlpZiAoeCA8IDAgfHwgeCA+IFVTSFJUX01BWCl7Ci0JCVB5RXJyX1NldFN0cmluZyhTdHJ1Y3RFcnJvciwKLQkJCQkidXNob3J0IGZvcm1hdCByZXF1aXJlcyAwIDw9IG51bWJlciA8PSAiIFNUUklOR0lGWShVU0hSVF9NQVgpKTsKLQkJcmV0dXJuIC0xOwotCX0KLQl5ID0gKHVuc2lnbmVkIHNob3J0KXg7Ci0JbWVtY3B5KHAsIChjaGFyICopJnksIHNpemVvZiB5KTsKLQlyZXR1cm4gMDsKKyAgICBsb25nIHg7CisgICAgdW5zaWduZWQgc2hvcnQgeTsKKyAgICBpZiAoZ2V0X2xvbmcodiwgJngpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmICh4IDwgMCB8fCB4ID4gVVNIUlRfTUFYKXsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFN0cnVjdEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInVzaG9ydCBmb3JtYXQgcmVxdWlyZXMgMCA8PSBudW1iZXIgPD0gIiBTVFJJTkdJRlkoVVNIUlRfTUFYKSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgeSA9ICh1bnNpZ25lZCBzaG9ydCl4OworICAgIG1lbWNweShwLCAoY2hhciAqKSZ5LCBzaXplb2YgeSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIG5wX2ludChjaGFyICpwLCBQeU9iamVjdCAqdiwgY29uc3QgZm9ybWF0ZGVmICpmKQogewotCWxvbmcgeDsKLQlpbnQgeTsKLQlpZiAoZ2V0X2xvbmcodiwgJngpIDwgMCkKLQkJcmV0dXJuIC0xOworICAgIGxvbmcgeDsKKyAgICBpbnQgeTsKKyAgICBpZiAoZ2V0X2xvbmcodiwgJngpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOwogI2lmIChTSVpFT0ZfTE9ORyA+IFNJWkVPRl9JTlQpCi0JaWYgKCh4IDwgKChsb25nKUlOVF9NSU4pKSB8fCAoeCA+ICgobG9uZylJTlRfTUFYKSkpCi0JCVJBTkdFX0VSUk9SKHgsIGYsIDAsIC0xKTsKKyAgICBpZiAoKHggPCAoKGxvbmcpSU5UX01JTikpIHx8ICh4ID4gKChsb25nKUlOVF9NQVgpKSkKKyAgICAgICAgUkFOR0VfRVJST1IoeCwgZiwgMCwgLTEpOwogI2VuZGlmCi0JeSA9IChpbnQpeDsKLQltZW1jcHkocCwgKGNoYXIgKikmeSwgc2l6ZW9mIHkpOwotCXJldHVybiAwOworICAgIHkgPSAoaW50KXg7CisgICAgbWVtY3B5KHAsIChjaGFyICopJnksIHNpemVvZiB5KTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogbnBfdWludChjaGFyICpwLCBQeU9iamVjdCAqdiwgY29uc3QgZm9ybWF0ZGVmICpmKQogewotCXVuc2lnbmVkIGxvbmcgeDsKLQl1bnNpZ25lZCBpbnQgeTsKLQlpZiAoZ2V0X3dyYXBwZWRfdWxvbmcodiwgJngpIDwgMCkKLQkJcmV0dXJuIC0xOwotCXkgPSAodW5zaWduZWQgaW50KXg7CisgICAgdW5zaWduZWQgbG9uZyB4OworICAgIHVuc2lnbmVkIGludCB5OworICAgIGlmIChnZXRfd3JhcHBlZF91bG9uZyh2LCAmeCkgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisgICAgeSA9ICh1bnNpZ25lZCBpbnQpeDsKICNpZiAoU0laRU9GX0xPTkcgPiBTSVpFT0ZfSU5UKQotCWlmICh4ID4gKCh1bnNpZ25lZCBsb25nKVVJTlRfTUFYKSkKLQkJUkFOR0VfRVJST1IoeSwgZiwgMSwgLTEpOworICAgIGlmICh4ID4gKCh1bnNpZ25lZCBsb25nKVVJTlRfTUFYKSkKKyAgICAgICAgUkFOR0VfRVJST1IoeSwgZiwgMSwgLTEpOwogI2VuZGlmCi0JbWVtY3B5KHAsIChjaGFyICopJnksIHNpemVvZiB5KTsKLQlyZXR1cm4gMDsKKyAgICBtZW1jcHkocCwgKGNoYXIgKikmeSwgc2l6ZW9mIHkpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBucF9sb25nKGNoYXIgKnAsIFB5T2JqZWN0ICp2LCBjb25zdCBmb3JtYXRkZWYgKmYpCiB7Ci0JbG9uZyB4OwotCWlmIChnZXRfbG9uZyh2LCAmeCkgPCAwKQotCQlyZXR1cm4gLTE7Ci0JbWVtY3B5KHAsIChjaGFyICopJngsIHNpemVvZiB4KTsKLQlyZXR1cm4gMDsKKyAgICBsb25nIHg7CisgICAgaWYgKGdldF9sb25nKHYsICZ4KSA8IDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICBtZW1jcHkocCwgKGNoYXIgKikmeCwgc2l6ZW9mIHgpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBucF91bG9uZyhjaGFyICpwLCBQeU9iamVjdCAqdiwgY29uc3QgZm9ybWF0ZGVmICpmKQogewotCXVuc2lnbmVkIGxvbmcgeDsKLQlpZiAoZ2V0X3dyYXBwZWRfdWxvbmcodiwgJngpIDwgMCkKLQkJcmV0dXJuIC0xOwotCW1lbWNweShwLCAoY2hhciAqKSZ4LCBzaXplb2YgeCk7Ci0JcmV0dXJuIDA7CisgICAgdW5zaWduZWQgbG9uZyB4OworICAgIGlmIChnZXRfd3JhcHBlZF91bG9uZyh2LCAmeCkgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisgICAgbWVtY3B5KHAsIChjaGFyICopJngsIHNpemVvZiB4KTsKKyAgICByZXR1cm4gMDsKIH0KIAogI2lmZGVmIEhBVkVfTE9OR19MT05HCkBAIC03MTUsMjEgKzcxNSwyMSBAQAogc3RhdGljIGludAogbnBfbG9uZ2xvbmcoY2hhciAqcCwgUHlPYmplY3QgKnYsIGNvbnN0IGZvcm1hdGRlZiAqZikKIHsKLQlQWV9MT05HX0xPTkcgeDsKLQlpZiAoZ2V0X2xvbmdsb25nKHYsICZ4KSA8IDApCi0JCXJldHVybiAtMTsKLQltZW1jcHkocCwgKGNoYXIgKikmeCwgc2l6ZW9mIHgpOwotCXJldHVybiAwOworICAgIFBZX0xPTkdfTE9ORyB4OworICAgIGlmIChnZXRfbG9uZ2xvbmcodiwgJngpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIG1lbWNweShwLCAoY2hhciAqKSZ4LCBzaXplb2YgeCk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIG5wX3Vsb25nbG9uZyhjaGFyICpwLCBQeU9iamVjdCAqdiwgY29uc3QgZm9ybWF0ZGVmICpmKQogewotCXVuc2lnbmVkIFBZX0xPTkdfTE9ORyB4OwotCWlmIChnZXRfdWxvbmdsb25nKHYsICZ4KSA8IDApCi0JCXJldHVybiAtMTsKLQltZW1jcHkocCwgKGNoYXIgKikmeCwgc2l6ZW9mIHgpOwotCXJldHVybiAwOworICAgIHVuc2lnbmVkIFBZX0xPTkdfTE9ORyB4OworICAgIGlmIChnZXRfdWxvbmdsb25nKHYsICZ4KSA8IDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICBtZW1jcHkocCwgKGNoYXIgKikmeCwgc2l6ZW9mIHgpOworICAgIHJldHVybiAwOwogfQogI2VuZGlmCiAKQEAgLTczNyw3NyArNzM3LDc3IEBACiBzdGF0aWMgaW50CiBucF9ib29sKGNoYXIgKnAsIFB5T2JqZWN0ICp2LCBjb25zdCBmb3JtYXRkZWYgKmYpCiB7Ci0JQk9PTF9UWVBFIHk7IAotCXkgPSBQeU9iamVjdF9Jc1RydWUodik7Ci0JbWVtY3B5KHAsIChjaGFyICopJnksIHNpemVvZiB5KTsKLQlyZXR1cm4gMDsKKyAgICBCT09MX1RZUEUgeTsKKyAgICB5ID0gUHlPYmplY3RfSXNUcnVlKHYpOworICAgIG1lbWNweShwLCAoY2hhciAqKSZ5LCBzaXplb2YgeSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIG5wX2Zsb2F0KGNoYXIgKnAsIFB5T2JqZWN0ICp2LCBjb25zdCBmb3JtYXRkZWYgKmYpCiB7Ci0JZmxvYXQgeCA9IChmbG9hdClQeUZsb2F0X0FzRG91YmxlKHYpOwotCWlmICh4ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFN0cnVjdEVycm9yLAotCQkJCSJyZXF1aXJlZCBhcmd1bWVudCBpcyBub3QgYSBmbG9hdCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCW1lbWNweShwLCAoY2hhciAqKSZ4LCBzaXplb2YgeCk7Ci0JcmV0dXJuIDA7CisgICAgZmxvYXQgeCA9IChmbG9hdClQeUZsb2F0X0FzRG91YmxlKHYpOworICAgIGlmICh4ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFN0cnVjdEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInJlcXVpcmVkIGFyZ3VtZW50IGlzIG5vdCBhIGZsb2F0Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbWVtY3B5KHAsIChjaGFyICopJngsIHNpemVvZiB4KTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogbnBfZG91YmxlKGNoYXIgKnAsIFB5T2JqZWN0ICp2LCBjb25zdCBmb3JtYXRkZWYgKmYpCiB7Ci0JZG91YmxlIHggPSBQeUZsb2F0X0FzRG91YmxlKHYpOwotCWlmICh4ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFN0cnVjdEVycm9yLAotCQkJCSJyZXF1aXJlZCBhcmd1bWVudCBpcyBub3QgYSBmbG9hdCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCW1lbWNweShwLCAoY2hhciAqKSZ4LCBzaXplb2YoZG91YmxlKSk7Ci0JcmV0dXJuIDA7CisgICAgZG91YmxlIHggPSBQeUZsb2F0X0FzRG91YmxlKHYpOworICAgIGlmICh4ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFN0cnVjdEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInJlcXVpcmVkIGFyZ3VtZW50IGlzIG5vdCBhIGZsb2F0Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbWVtY3B5KHAsIChjaGFyICopJngsIHNpemVvZihkb3VibGUpKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogbnBfdm9pZF9wKGNoYXIgKnAsIFB5T2JqZWN0ICp2LCBjb25zdCBmb3JtYXRkZWYgKmYpCiB7Ci0Jdm9pZCAqeDsKKyAgICB2b2lkICp4OwogCi0JdiA9IGdldF9weWxvbmcodik7Ci0JaWYgKHYgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCWFzc2VydChQeUxvbmdfQ2hlY2sodikpOwotCXggPSBQeUxvbmdfQXNWb2lkUHRyKHYpOwotCVB5X0RFQ1JFRih2KTsKLQlpZiAoeCA9PSBOVUxMICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiAtMTsKLQltZW1jcHkocCwgKGNoYXIgKikmeCwgc2l6ZW9mIHgpOwotCXJldHVybiAwOworICAgIHYgPSBnZXRfcHlsb25nKHYpOworICAgIGlmICh2ID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBhc3NlcnQoUHlMb25nX0NoZWNrKHYpKTsKKyAgICB4ID0gUHlMb25nX0FzVm9pZFB0cih2KTsKKyAgICBQeV9ERUNSRUYodik7CisgICAgaWYgKHggPT0gTlVMTCAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgbWVtY3B5KHAsIChjaGFyICopJngsIHNpemVvZiB4KTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGZvcm1hdGRlZiBuYXRpdmVfdGFibGVbXSA9IHsKLQl7J3gnLAlzaXplb2YoY2hhciksCTAsCQlOVUxMfSwKLQl7J2InLAlzaXplb2YoY2hhciksCTAsCQludV9ieXRlLAlucF9ieXRlfSwKLQl7J0InLAlzaXplb2YoY2hhciksCTAsCQludV91Ynl0ZSwJbnBfdWJ5dGV9LAotCXsnYycsCXNpemVvZihjaGFyKSwJMCwJCW51X2NoYXIsCW5wX2NoYXJ9LAotCXsncycsCXNpemVvZihjaGFyKSwJMCwJCU5VTEx9LAotCXsncCcsCXNpemVvZihjaGFyKSwJMCwJCU5VTEx9LAotCXsnaCcsCXNpemVvZihzaG9ydCksCVNIT1JUX0FMSUdOLAludV9zaG9ydCwJbnBfc2hvcnR9LAotCXsnSCcsCXNpemVvZihzaG9ydCksCVNIT1JUX0FMSUdOLAludV91c2hvcnQsCW5wX3VzaG9ydH0sCi0JeydpJywJc2l6ZW9mKGludCksCUlOVF9BTElHTiwJbnVfaW50LAkJbnBfaW50fSwKLQl7J0knLAlzaXplb2YoaW50KSwJSU5UX0FMSUdOLAludV91aW50LAlucF91aW50fSwKLQl7J2wnLAlzaXplb2YobG9uZyksCUxPTkdfQUxJR04sCW51X2xvbmcsCW5wX2xvbmd9LAotCXsnTCcsCXNpemVvZihsb25nKSwJTE9OR19BTElHTiwJbnVfdWxvbmcsCW5wX3Vsb25nfSwKKyAgICB7J3gnLCAgICAgICBzaXplb2YoY2hhciksICAgMCwgICAgICAgICAgICAgIE5VTEx9LAorICAgIHsnYicsICAgICAgIHNpemVvZihjaGFyKSwgICAwLCAgICAgICAgICAgICAgbnVfYnl0ZSwgICAgICAgIG5wX2J5dGV9LAorICAgIHsnQicsICAgICAgIHNpemVvZihjaGFyKSwgICAwLCAgICAgICAgICAgICAgbnVfdWJ5dGUsICAgICAgIG5wX3VieXRlfSwKKyAgICB7J2MnLCAgICAgICBzaXplb2YoY2hhciksICAgMCwgICAgICAgICAgICAgIG51X2NoYXIsICAgICAgICBucF9jaGFyfSwKKyAgICB7J3MnLCAgICAgICBzaXplb2YoY2hhciksICAgMCwgICAgICAgICAgICAgIE5VTEx9LAorICAgIHsncCcsICAgICAgIHNpemVvZihjaGFyKSwgICAwLCAgICAgICAgICAgICAgTlVMTH0sCisgICAgeydoJywgICAgICAgc2l6ZW9mKHNob3J0KSwgIFNIT1JUX0FMSUdOLCAgICBudV9zaG9ydCwgICAgICAgbnBfc2hvcnR9LAorICAgIHsnSCcsICAgICAgIHNpemVvZihzaG9ydCksICBTSE9SVF9BTElHTiwgICAgbnVfdXNob3J0LCAgICAgIG5wX3VzaG9ydH0sCisgICAgeydpJywgICAgICAgc2l6ZW9mKGludCksICAgIElOVF9BTElHTiwgICAgICBudV9pbnQsICAgICAgICAgbnBfaW50fSwKKyAgICB7J0knLCAgICAgICBzaXplb2YoaW50KSwgICAgSU5UX0FMSUdOLCAgICAgIG51X3VpbnQsICAgICAgICBucF91aW50fSwKKyAgICB7J2wnLCAgICAgICBzaXplb2YobG9uZyksICAgTE9OR19BTElHTiwgICAgIG51X2xvbmcsICAgICAgICBucF9sb25nfSwKKyAgICB7J0wnLCAgICAgICBzaXplb2YobG9uZyksICAgTE9OR19BTElHTiwgICAgIG51X3Vsb25nLCAgICAgICBucF91bG9uZ30sCiAjaWZkZWYgSEFWRV9MT05HX0xPTkcKLQl7J3EnLAlzaXplb2YoUFlfTE9OR19MT05HKSwgTE9OR19MT05HX0FMSUdOLCBudV9sb25nbG9uZywgbnBfbG9uZ2xvbmd9LAotCXsnUScsCXNpemVvZihQWV9MT05HX0xPTkcpLCBMT05HX0xPTkdfQUxJR04sIG51X3Vsb25nbG9uZyxucF91bG9uZ2xvbmd9LAorICAgIHsncScsICAgICAgIHNpemVvZihQWV9MT05HX0xPTkcpLCBMT05HX0xPTkdfQUxJR04sIG51X2xvbmdsb25nLCBucF9sb25nbG9uZ30sCisgICAgeydRJywgICAgICAgc2l6ZW9mKFBZX0xPTkdfTE9ORyksIExPTkdfTE9OR19BTElHTiwgbnVfdWxvbmdsb25nLG5wX3Vsb25nbG9uZ30sCiAjZW5kaWYKLQl7Jz8nLAlzaXplb2YoQk9PTF9UWVBFKSwJQk9PTF9BTElHTiwJbnVfYm9vbCwJbnBfYm9vbH0sCi0JeydmJywJc2l6ZW9mKGZsb2F0KSwJRkxPQVRfQUxJR04sCW51X2Zsb2F0LAlucF9mbG9hdH0sCi0JeydkJywJc2l6ZW9mKGRvdWJsZSksCURPVUJMRV9BTElHTiwJbnVfZG91YmxlLAlucF9kb3VibGV9LAotCXsnUCcsCXNpemVvZih2b2lkICopLAlWT0lEX1BfQUxJR04sCW51X3ZvaWRfcCwJbnBfdm9pZF9wfSwKLQl7MH0KKyAgICB7Jz8nLCAgICAgICBzaXplb2YoQk9PTF9UWVBFKSwgICAgICBCT09MX0FMSUdOLCAgICAgbnVfYm9vbCwgICAgICAgIG5wX2Jvb2x9LAorICAgIHsnZicsICAgICAgIHNpemVvZihmbG9hdCksICBGTE9BVF9BTElHTiwgICAgbnVfZmxvYXQsICAgICAgIG5wX2Zsb2F0fSwKKyAgICB7J2QnLCAgICAgICBzaXplb2YoZG91YmxlKSwgRE9VQkxFX0FMSUdOLCAgIG51X2RvdWJsZSwgICAgICBucF9kb3VibGV9LAorICAgIHsnUCcsICAgICAgIHNpemVvZih2b2lkICopLCBWT0lEX1BfQUxJR04sICAgbnVfdm9pZF9wLCAgICAgIG5wX3ZvaWRfcH0sCisgICAgezB9CiB9OwogCiAvKiBCaWctZW5kaWFuIHJvdXRpbmVzLiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTgxNSw1MyArODE1LDUzIEBACiBzdGF0aWMgUHlPYmplY3QgKgogYnVfaW50KGNvbnN0IGNoYXIgKnAsIGNvbnN0IGZvcm1hdGRlZiAqZikKIHsKLQlsb25nIHggPSAwOwotCVB5X3NzaXplX3QgaSA9IGYtPnNpemU7Ci0JY29uc3QgdW5zaWduZWQgY2hhciAqYnl0ZXMgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKXA7Ci0JZG8gewotCQl4ID0gKHg8PDgpIHwgKmJ5dGVzKys7Ci0JfSB3aGlsZSAoLS1pID4gMCk7Ci0JLyogRXh0ZW5kIHRoZSBzaWduIGJpdC4gKi8KLQlpZiAoU0laRU9GX0xPTkcgPiBmLT5zaXplKQotCQl4IHw9IC0oeCAmICgxTCA8PCAoKDggKiBmLT5zaXplKSAtIDEpKSk7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKHgpOworICAgIGxvbmcgeCA9IDA7CisgICAgUHlfc3NpemVfdCBpID0gZi0+c2l6ZTsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpieXRlcyA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopcDsKKyAgICBkbyB7CisgICAgICAgIHggPSAoeDw8OCkgfCAqYnl0ZXMrKzsKKyAgICB9IHdoaWxlICgtLWkgPiAwKTsKKyAgICAvKiBFeHRlbmQgdGhlIHNpZ24gYml0LiAqLworICAgIGlmIChTSVpFT0ZfTE9ORyA+IGYtPnNpemUpCisgICAgICAgIHggfD0gLSh4ICYgKDFMIDw8ICgoOCAqIGYtPnNpemUpIC0gMSkpKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoeCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBidV91aW50KGNvbnN0IGNoYXIgKnAsIGNvbnN0IGZvcm1hdGRlZiAqZikKIHsKLQl1bnNpZ25lZCBsb25nIHggPSAwOwotCVB5X3NzaXplX3QgaSA9IGYtPnNpemU7Ci0JY29uc3QgdW5zaWduZWQgY2hhciAqYnl0ZXMgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKXA7Ci0JZG8gewotCQl4ID0gKHg8PDgpIHwgKmJ5dGVzKys7Ci0JfSB3aGlsZSAoLS1pID4gMCk7Ci0JaWYgKHggPD0gTE9OR19NQVgpCi0JCXJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZyl4KTsKLQlyZXR1cm4gUHlMb25nX0Zyb21VbnNpZ25lZExvbmcoeCk7CisgICAgdW5zaWduZWQgbG9uZyB4ID0gMDsKKyAgICBQeV9zc2l6ZV90IGkgPSBmLT5zaXplOworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ5dGVzID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilwOworICAgIGRvIHsKKyAgICAgICAgeCA9ICh4PDw4KSB8ICpieXRlcysrOworICAgIH0gd2hpbGUgKC0taSA+IDApOworICAgIGlmICh4IDw9IExPTkdfTUFYKQorICAgICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpeCk7CisgICAgcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKHgpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYnVfbG9uZ2xvbmcoY29uc3QgY2hhciAqcCwgY29uc3QgZm9ybWF0ZGVmICpmKQogewogI2lmZGVmIEhBVkVfTE9OR19MT05HCi0JUFlfTE9OR19MT05HIHggPSAwOwotCVB5X3NzaXplX3QgaSA9IGYtPnNpemU7Ci0JY29uc3QgdW5zaWduZWQgY2hhciAqYnl0ZXMgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKXA7Ci0JZG8gewotCQl4ID0gKHg8PDgpIHwgKmJ5dGVzKys7Ci0JfSB3aGlsZSAoLS1pID4gMCk7Ci0JLyogRXh0ZW5kIHRoZSBzaWduIGJpdC4gKi8KLQlpZiAoU0laRU9GX0xPTkdfTE9ORyA+IGYtPnNpemUpCi0JCXggfD0gLSh4ICYgKChQWV9MT05HX0xPTkcpMSA8PCAoKDggKiBmLT5zaXplKSAtIDEpKSk7Ci0JaWYgKHggPj0gTE9OR19NSU4gJiYgeCA8PSBMT05HX01BWCkKLQkJcmV0dXJuIFB5SW50X0Zyb21Mb25nKFB5X1NBRkVfRE9XTkNBU1QoeCwgUFlfTE9OR19MT05HLCBsb25nKSk7Ci0JcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZ0xvbmcoeCk7CisgICAgUFlfTE9OR19MT05HIHggPSAwOworICAgIFB5X3NzaXplX3QgaSA9IGYtPnNpemU7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYnl0ZXMgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKXA7CisgICAgZG8geworICAgICAgICB4ID0gKHg8PDgpIHwgKmJ5dGVzKys7CisgICAgfSB3aGlsZSAoLS1pID4gMCk7CisgICAgLyogRXh0ZW5kIHRoZSBzaWduIGJpdC4gKi8KKyAgICBpZiAoU0laRU9GX0xPTkdfTE9ORyA+IGYtPnNpemUpCisgICAgICAgIHggfD0gLSh4ICYgKChQWV9MT05HX0xPTkcpMSA8PCAoKDggKiBmLT5zaXplKSAtIDEpKSk7CisgICAgaWYgKHggPj0gTE9OR19NSU4gJiYgeCA8PSBMT05HX01BWCkKKyAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKFB5X1NBRkVfRE9XTkNBU1QoeCwgUFlfTE9OR19MT05HLCBsb25nKSk7CisgICAgcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZ0xvbmcoeCk7CiAjZWxzZQotCXJldHVybiBfUHlMb25nX0Zyb21CeXRlQXJyYXkoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilwLAotCQkJCSAgICAgIDgsCi0JCQkJICAgICAgMCwgLyogbGl0dGxlLWVuZGlhbiAqLwotCQkJCSAgICAgIDEgIC8qIHNpZ25lZCAqLyk7CisgICAgcmV0dXJuIF9QeUxvbmdfRnJvbUJ5dGVBcnJheSgoY29uc3QgdW5zaWduZWQgY2hhciAqKXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKiBsaXR0bGUtZW5kaWFuICovCisgICAgICAgICAgICAgICAgICAgICAgMSAgLyogc2lnbmVkICovKTsKICNlbmRpZgogfQogCkBAIC04NjksMTgxICs4NjksMTgxIEBACiBidV91bG9uZ2xvbmcoY29uc3QgY2hhciAqcCwgY29uc3QgZm9ybWF0ZGVmICpmKQogewogI2lmZGVmIEhBVkVfTE9OR19MT05HCi0JdW5zaWduZWQgUFlfTE9OR19MT05HIHggPSAwOwotCVB5X3NzaXplX3QgaSA9IGYtPnNpemU7Ci0JY29uc3QgdW5zaWduZWQgY2hhciAqYnl0ZXMgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKXA7Ci0JZG8gewotCQl4ID0gKHg8PDgpIHwgKmJ5dGVzKys7Ci0JfSB3aGlsZSAoLS1pID4gMCk7Ci0JaWYgKHggPD0gTE9OR19NQVgpCi0JCXJldHVybiBQeUludF9Gcm9tTG9uZyhQeV9TQUZFX0RPV05DQVNUKHgsIHVuc2lnbmVkIFBZX0xPTkdfTE9ORywgbG9uZykpOwotCXJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZ0xvbmcoeCk7CisgICAgdW5zaWduZWQgUFlfTE9OR19MT05HIHggPSAwOworICAgIFB5X3NzaXplX3QgaSA9IGYtPnNpemU7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYnl0ZXMgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKXA7CisgICAgZG8geworICAgICAgICB4ID0gKHg8PDgpIHwgKmJ5dGVzKys7CisgICAgfSB3aGlsZSAoLS1pID4gMCk7CisgICAgaWYgKHggPD0gTE9OR19NQVgpCisgICAgICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhQeV9TQUZFX0RPV05DQVNUKHgsIHVuc2lnbmVkIFBZX0xPTkdfTE9ORywgbG9uZykpOworICAgIHJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZ0xvbmcoeCk7CiAjZWxzZQotCXJldHVybiBfUHlMb25nX0Zyb21CeXRlQXJyYXkoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilwLAotCQkJCSAgICAgIDgsCi0JCQkJICAgICAgMCwgLyogbGl0dGxlLWVuZGlhbiAqLwotCQkJCSAgICAgIDAgIC8qIHNpZ25lZCAqLyk7CisgICAgcmV0dXJuIF9QeUxvbmdfRnJvbUJ5dGVBcnJheSgoY29uc3QgdW5zaWduZWQgY2hhciAqKXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKiBsaXR0bGUtZW5kaWFuICovCisgICAgICAgICAgICAgICAgICAgICAgMCAgLyogc2lnbmVkICovKTsKICNlbmRpZgogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYnVfZmxvYXQoY29uc3QgY2hhciAqcCwgY29uc3QgZm9ybWF0ZGVmICpmKQogewotCXJldHVybiB1bnBhY2tfZmxvYXQocCwgMCk7CisgICAgcmV0dXJuIHVucGFja19mbG9hdChwLCAwKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGJ1X2RvdWJsZShjb25zdCBjaGFyICpwLCBjb25zdCBmb3JtYXRkZWYgKmYpCiB7Ci0JcmV0dXJuIHVucGFja19kb3VibGUocCwgMCk7CisgICAgcmV0dXJuIHVucGFja19kb3VibGUocCwgMCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBidV9ib29sKGNvbnN0IGNoYXIgKnAsIGNvbnN0IGZvcm1hdGRlZiAqZikKIHsKLQljaGFyIHg7Ci0JbWVtY3B5KChjaGFyICopJngsIHAsIHNpemVvZiB4KTsKLQlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKHggIT0gMCk7CisgICAgY2hhciB4OworICAgIG1lbWNweSgoY2hhciAqKSZ4LCBwLCBzaXplb2YgeCk7CisgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZyh4ICE9IDApOwogfQogCiBzdGF0aWMgaW50CiBicF9pbnQoY2hhciAqcCwgUHlPYmplY3QgKnYsIGNvbnN0IGZvcm1hdGRlZiAqZikKIHsKLQlsb25nIHg7Ci0JUHlfc3NpemVfdCBpOwotCWlmIChnZXRfd3JhcHBlZF9sb25nKHYsICZ4KSA8IDApCi0JCXJldHVybiAtMTsKLQlpID0gZi0+c2l6ZTsKLQlpZiAoaSAhPSBTSVpFT0ZfTE9ORykgewotCQlpZiAoKGkgPT0gMikgJiYgKHggPCAtMzI3NjggfHwgeCA+IDMyNzY3KSkKLQkJCVJBTkdFX0VSUk9SKHgsIGYsIDAsIDB4ZmZmZkwpOworICAgIGxvbmcgeDsKKyAgICBQeV9zc2l6ZV90IGk7CisgICAgaWYgKGdldF93cmFwcGVkX2xvbmcodiwgJngpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGkgPSBmLT5zaXplOworICAgIGlmIChpICE9IFNJWkVPRl9MT05HKSB7CisgICAgICAgIGlmICgoaSA9PSAyKSAmJiAoeCA8IC0zMjc2OCB8fCB4ID4gMzI3NjcpKQorICAgICAgICAgICAgUkFOR0VfRVJST1IoeCwgZiwgMCwgMHhmZmZmTCk7CiAjaWYgKFNJWkVPRl9MT05HICE9IDQpCi0JCWVsc2UgaWYgKChpID09IDQpICYmICh4IDwgLTIxNDc0ODM2NDhMIHx8IHggPiAyMTQ3NDgzNjQ3TCkpCi0JCQlSQU5HRV9FUlJPUih4LCBmLCAwLCAweGZmZmZmZmZmTCk7CisgICAgICAgIGVsc2UgaWYgKChpID09IDQpICYmICh4IDwgLTIxNDc0ODM2NDhMIHx8IHggPiAyMTQ3NDgzNjQ3TCkpCisgICAgICAgICAgICBSQU5HRV9FUlJPUih4LCBmLCAwLCAweGZmZmZmZmZmTCk7CiAjZW5kaWYKICNpZmRlZiBQWV9TVFJVQ1RfT1ZFUkZMT1dfTUFTS0lORwotCQllbHNlIGlmICgoaSA9PSAxKSAmJiAoeCA8IC0xMjggfHwgeCA+IDEyNykpCi0JCQlSQU5HRV9FUlJPUih4LCBmLCAwLCAweGZmTCk7CisgICAgICAgIGVsc2UgaWYgKChpID09IDEpICYmICh4IDwgLTEyOCB8fCB4ID4gMTI3KSkKKyAgICAgICAgICAgIFJBTkdFX0VSUk9SKHgsIGYsIDAsIDB4ZmZMKTsKICNlbmRpZgotCX0KLQlkbyB7Ci0JCXBbLS1pXSA9IChjaGFyKXg7Ci0JCXggPj49IDg7Ci0JfSB3aGlsZSAoaSA+IDApOwotCXJldHVybiAwOworICAgIH0KKyAgICBkbyB7CisgICAgICAgIHBbLS1pXSA9IChjaGFyKXg7CisgICAgICAgIHggPj49IDg7CisgICAgfSB3aGlsZSAoaSA+IDApOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBicF91aW50KGNoYXIgKnAsIFB5T2JqZWN0ICp2LCBjb25zdCBmb3JtYXRkZWYgKmYpCiB7Ci0JdW5zaWduZWQgbG9uZyB4OwotCVB5X3NzaXplX3QgaTsKLQlpZiAoZ2V0X3dyYXBwZWRfdWxvbmcodiwgJngpIDwgMCkKLQkJcmV0dXJuIC0xOwotCWkgPSBmLT5zaXplOwotCWlmIChpICE9IFNJWkVPRl9MT05HKSB7Ci0JCXVuc2lnbmVkIGxvbmcgbWF4aW50ID0gMTsKLQkJbWF4aW50IDw8PSAodW5zaWduZWQgbG9uZykoaSAqIDgpOwotCQlpZiAoeCA+PSBtYXhpbnQpCi0JCQlSQU5HRV9FUlJPUih4LCBmLCAxLCBtYXhpbnQgLSAxKTsKLQl9Ci0JZG8gewotCQlwWy0taV0gPSAoY2hhcil4OwotCQl4ID4+PSA4OwotCX0gd2hpbGUgKGkgPiAwKTsKLQlyZXR1cm4gMDsKKyAgICB1bnNpZ25lZCBsb25nIHg7CisgICAgUHlfc3NpemVfdCBpOworICAgIGlmIChnZXRfd3JhcHBlZF91bG9uZyh2LCAmeCkgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaSA9IGYtPnNpemU7CisgICAgaWYgKGkgIT0gU0laRU9GX0xPTkcpIHsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBtYXhpbnQgPSAxOworICAgICAgICBtYXhpbnQgPDw9ICh1bnNpZ25lZCBsb25nKShpICogOCk7CisgICAgICAgIGlmICh4ID49IG1heGludCkKKyAgICAgICAgICAgIFJBTkdFX0VSUk9SKHgsIGYsIDEsIG1heGludCAtIDEpOworICAgIH0KKyAgICBkbyB7CisgICAgICAgIHBbLS1pXSA9IChjaGFyKXg7CisgICAgICAgIHggPj49IDg7CisgICAgfSB3aGlsZSAoaSA+IDApOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBicF9sb25nbG9uZyhjaGFyICpwLCBQeU9iamVjdCAqdiwgY29uc3QgZm9ybWF0ZGVmICpmKQogewotCWludCByZXM7Ci0JdiA9IGdldF9weWxvbmcodik7Ci0JaWYgKHYgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCXJlcyA9IF9QeUxvbmdfQXNCeXRlQXJyYXkoKFB5TG9uZ09iamVjdCAqKXYsCi0JCQkgICAJICAodW5zaWduZWQgY2hhciAqKXAsCi0JCQkJICA4LAotCQkJCSAgMCwgLyogbGl0dGxlX2VuZGlhbiAqLwotCQkJCSAgMSAgLyogc2lnbmVkICovKTsKLQlQeV9ERUNSRUYodik7Ci0JcmV0dXJuIHJlczsKKyAgICBpbnQgcmVzOworICAgIHYgPSBnZXRfcHlsb25nKHYpOworICAgIGlmICh2ID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKyAgICByZXMgPSBfUHlMb25nX0FzQnl0ZUFycmF5KChQeUxvbmdPYmplY3QgKil2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIgKilwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qIGxpdHRsZV9lbmRpYW4gKi8KKyAgICAgICAgICAgICAgICAgIDEgIC8qIHNpZ25lZCAqLyk7CisgICAgUHlfREVDUkVGKHYpOworICAgIHJldHVybiByZXM7CiB9CiAKIHN0YXRpYyBpbnQKIGJwX3Vsb25nbG9uZyhjaGFyICpwLCBQeU9iamVjdCAqdiwgY29uc3QgZm9ybWF0ZGVmICpmKQogewotCWludCByZXM7Ci0JdiA9IGdldF9weWxvbmcodik7Ci0JaWYgKHYgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCXJlcyA9IF9QeUxvbmdfQXNCeXRlQXJyYXkoKFB5TG9uZ09iamVjdCAqKXYsCi0JCQkgICAJICAodW5zaWduZWQgY2hhciAqKXAsCi0JCQkJICA4LAotCQkJCSAgMCwgLyogbGl0dGxlX2VuZGlhbiAqLwotCQkJCSAgMCAgLyogc2lnbmVkICovKTsKLQlQeV9ERUNSRUYodik7Ci0JcmV0dXJuIHJlczsKKyAgICBpbnQgcmVzOworICAgIHYgPSBnZXRfcHlsb25nKHYpOworICAgIGlmICh2ID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKyAgICByZXMgPSBfUHlMb25nX0FzQnl0ZUFycmF5KChQeUxvbmdPYmplY3QgKil2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIgKilwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qIGxpdHRsZV9lbmRpYW4gKi8KKyAgICAgICAgICAgICAgICAgIDAgIC8qIHNpZ25lZCAqLyk7CisgICAgUHlfREVDUkVGKHYpOworICAgIHJldHVybiByZXM7CiB9CiAKIHN0YXRpYyBpbnQKIGJwX2Zsb2F0KGNoYXIgKnAsIFB5T2JqZWN0ICp2LCBjb25zdCBmb3JtYXRkZWYgKmYpCiB7Ci0JZG91YmxlIHggPSBQeUZsb2F0X0FzRG91YmxlKHYpOwotCWlmICh4ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFN0cnVjdEVycm9yLAotCQkJCSJyZXF1aXJlZCBhcmd1bWVudCBpcyBub3QgYSBmbG9hdCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXJldHVybiBfUHlGbG9hdF9QYWNrNCh4LCAodW5zaWduZWQgY2hhciAqKXAsIDApOworICAgIGRvdWJsZSB4ID0gUHlGbG9hdF9Bc0RvdWJsZSh2KTsKKyAgICBpZiAoeCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhTdHJ1Y3RFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJyZXF1aXJlZCBhcmd1bWVudCBpcyBub3QgYSBmbG9hdCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiBfUHlGbG9hdF9QYWNrNCh4LCAodW5zaWduZWQgY2hhciAqKXAsIDApOwogfQogCiBzdGF0aWMgaW50CiBicF9kb3VibGUoY2hhciAqcCwgUHlPYmplY3QgKnYsIGNvbnN0IGZvcm1hdGRlZiAqZikKIHsKLQlkb3VibGUgeCA9IFB5RmxvYXRfQXNEb3VibGUodik7Ci0JaWYgKHggPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewotCQlQeUVycl9TZXRTdHJpbmcoU3RydWN0RXJyb3IsCi0JCQkJInJlcXVpcmVkIGFyZ3VtZW50IGlzIG5vdCBhIGZsb2F0Iik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JcmV0dXJuIF9QeUZsb2F0X1BhY2s4KHgsICh1bnNpZ25lZCBjaGFyICopcCwgMCk7CisgICAgZG91YmxlIHggPSBQeUZsb2F0X0FzRG91YmxlKHYpOworICAgIGlmICh4ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFN0cnVjdEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInJlcXVpcmVkIGFyZ3VtZW50IGlzIG5vdCBhIGZsb2F0Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIF9QeUZsb2F0X1BhY2s4KHgsICh1bnNpZ25lZCBjaGFyICopcCwgMCk7CiB9CiAKIHN0YXRpYyBpbnQKIGJwX2Jvb2woY2hhciAqcCwgUHlPYmplY3QgKnYsIGNvbnN0IGZvcm1hdGRlZiAqZikKIHsKLQljaGFyIHk7IAotCXkgPSBQeU9iamVjdF9Jc1RydWUodik7Ci0JbWVtY3B5KHAsIChjaGFyICopJnksIHNpemVvZiB5KTsKLQlyZXR1cm4gMDsKKyAgICBjaGFyIHk7CisgICAgeSA9IFB5T2JqZWN0X0lzVHJ1ZSh2KTsKKyAgICBtZW1jcHkocCwgKGNoYXIgKikmeSwgc2l6ZW9mIHkpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgZm9ybWF0ZGVmIGJpZ2VuZGlhbl90YWJsZVtdID0gewotCXsneCcsCTEsCQkwLAkJTlVMTH0sCisgICAgeyd4JywgICAgICAgMSwgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICBOVUxMfSwKICNpZmRlZiBQWV9TVFJVQ1RfT1ZFUkZMT1dfTUFTS0lORwotCS8qIE5hdGl2ZSBwYWNrZXJzIGRvIHJhbmdlIGNoZWNraW5nIHdpdGhvdXQgb3ZlcmZsb3cgbWFza2luZy4gKi8KLQl7J2InLAkxLAkJMCwJCW51X2J5dGUsCWJwX2ludH0sCi0JeydCJywJMSwJCTAsCQludV91Ynl0ZSwJYnBfdWludH0sCisgICAgLyogTmF0aXZlIHBhY2tlcnMgZG8gcmFuZ2UgY2hlY2tpbmcgd2l0aG91dCBvdmVyZmxvdyBtYXNraW5nLiAqLworICAgIHsnYicsICAgICAgIDEsICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgbnVfYnl0ZSwgICAgICAgIGJwX2ludH0sCisgICAgeydCJywgICAgICAgMSwgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICBudV91Ynl0ZSwgICAgICAgYnBfdWludH0sCiAjZWxzZQotCXsnYicsCTEsCQkwLAkJbnVfYnl0ZSwJbnBfYnl0ZX0sCi0JeydCJywJMSwJCTAsCQludV91Ynl0ZSwJbnBfdWJ5dGV9LAorICAgIHsnYicsICAgICAgIDEsICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgbnVfYnl0ZSwgICAgICAgIG5wX2J5dGV9LAorICAgIHsnQicsICAgICAgIDEsICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgbnVfdWJ5dGUsICAgICAgIG5wX3VieXRlfSwKICNlbmRpZgotCXsnYycsCTEsCQkwLAkJbnVfY2hhciwJbnBfY2hhcn0sCi0JeydzJywJMSwJCTAsCQlOVUxMfSwKLQl7J3AnLAkxLAkJMCwJCU5VTEx9LAotCXsnaCcsCTIsCQkwLAkJYnVfaW50LAkJYnBfaW50fSwKLQl7J0gnLAkyLAkJMCwJCWJ1X3VpbnQsCWJwX3VpbnR9LAotCXsnaScsCTQsCQkwLAkJYnVfaW50LAkJYnBfaW50fSwKLQl7J0knLAk0LAkJMCwJCWJ1X3VpbnQsCWJwX3VpbnR9LAotCXsnbCcsCTQsCQkwLAkJYnVfaW50LAkJYnBfaW50fSwKLQl7J0wnLAk0LAkJMCwJCWJ1X3VpbnQsCWJwX3VpbnR9LAotCXsncScsCTgsCQkwLAkJYnVfbG9uZ2xvbmcsCWJwX2xvbmdsb25nfSwKLQl7J1EnLAk4LAkJMCwJCWJ1X3Vsb25nbG9uZywJYnBfdWxvbmdsb25nfSwKLQl7Jz8nLAkxLAkJMCwJCWJ1X2Jvb2wsCWJwX2Jvb2x9LAotCXsnZicsCTQsCQkwLAkJYnVfZmxvYXQsCWJwX2Zsb2F0fSwKLQl7J2QnLAk4LAkJMCwJCWJ1X2RvdWJsZSwJYnBfZG91YmxlfSwKLQl7MH0KKyAgICB7J2MnLCAgICAgICAxLCAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgIG51X2NoYXIsICAgICAgICBucF9jaGFyfSwKKyAgICB7J3MnLCAgICAgICAxLCAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgIE5VTEx9LAorICAgIHsncCcsICAgICAgIDEsICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgTlVMTH0sCisgICAgeydoJywgICAgICAgMiwgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICBidV9pbnQsICAgICAgICAgYnBfaW50fSwKKyAgICB7J0gnLCAgICAgICAyLCAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgIGJ1X3VpbnQsICAgICAgICBicF91aW50fSwKKyAgICB7J2knLCAgICAgICA0LCAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgIGJ1X2ludCwgICAgICAgICBicF9pbnR9LAorICAgIHsnSScsICAgICAgIDQsICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgYnVfdWludCwgICAgICAgIGJwX3VpbnR9LAorICAgIHsnbCcsICAgICAgIDQsICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgYnVfaW50LCAgICAgICAgIGJwX2ludH0sCisgICAgeydMJywgICAgICAgNCwgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICBidV91aW50LCAgICAgICAgYnBfdWludH0sCisgICAgeydxJywgICAgICAgOCwgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICBidV9sb25nbG9uZywgICAgYnBfbG9uZ2xvbmd9LAorICAgIHsnUScsICAgICAgIDgsICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgYnVfdWxvbmdsb25nLCAgIGJwX3Vsb25nbG9uZ30sCisgICAgeyc/JywgICAgICAgMSwgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICBidV9ib29sLCAgICAgICAgYnBfYm9vbH0sCisgICAgeydmJywgICAgICAgNCwgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICBidV9mbG9hdCwgICAgICAgYnBfZmxvYXR9LAorICAgIHsnZCcsICAgICAgIDgsICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgYnVfZG91YmxlLCAgICAgIGJwX2RvdWJsZX0sCisgICAgezB9CiB9OwogCiAvKiBMaXR0bGUtZW5kaWFuIHJvdXRpbmVzLiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTEwNTEsNTMgKzEwNTEsNTMgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBsdV9pbnQoY29uc3QgY2hhciAqcCwgY29uc3QgZm9ybWF0ZGVmICpmKQogewotCWxvbmcgeCA9IDA7Ci0JUHlfc3NpemVfdCBpID0gZi0+c2l6ZTsKLQljb25zdCB1bnNpZ25lZCBjaGFyICpieXRlcyA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopcDsKLQlkbyB7Ci0JCXggPSAoeDw8OCkgfCBieXRlc1stLWldOwotCX0gd2hpbGUgKGkgPiAwKTsKLQkvKiBFeHRlbmQgdGhlIHNpZ24gYml0LiAqLwotCWlmIChTSVpFT0ZfTE9ORyA+IGYtPnNpemUpCi0JCXggfD0gLSh4ICYgKDFMIDw8ICgoOCAqIGYtPnNpemUpIC0gMSkpKTsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoeCk7CisgICAgbG9uZyB4ID0gMDsKKyAgICBQeV9zc2l6ZV90IGkgPSBmLT5zaXplOworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ5dGVzID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilwOworICAgIGRvIHsKKyAgICAgICAgeCA9ICh4PDw4KSB8IGJ5dGVzWy0taV07CisgICAgfSB3aGlsZSAoaSA+IDApOworICAgIC8qIEV4dGVuZCB0aGUgc2lnbiBiaXQuICovCisgICAgaWYgKFNJWkVPRl9MT05HID4gZi0+c2l6ZSkKKyAgICAgICAgeCB8PSAtKHggJiAoMUwgPDwgKCg4ICogZi0+c2l6ZSkgLSAxKSkpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyh4KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGx1X3VpbnQoY29uc3QgY2hhciAqcCwgY29uc3QgZm9ybWF0ZGVmICpmKQogewotCXVuc2lnbmVkIGxvbmcgeCA9IDA7Ci0JUHlfc3NpemVfdCBpID0gZi0+c2l6ZTsKLQljb25zdCB1bnNpZ25lZCBjaGFyICpieXRlcyA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopcDsKLQlkbyB7Ci0JCXggPSAoeDw8OCkgfCBieXRlc1stLWldOwotCX0gd2hpbGUgKGkgPiAwKTsKLQlpZiAoeCA8PSBMT05HX01BWCkKLQkJcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKXgpOwotCXJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZygobG9uZyl4KTsKKyAgICB1bnNpZ25lZCBsb25nIHggPSAwOworICAgIFB5X3NzaXplX3QgaSA9IGYtPnNpemU7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYnl0ZXMgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKXA7CisgICAgZG8geworICAgICAgICB4ID0gKHg8PDgpIHwgYnl0ZXNbLS1pXTsKKyAgICB9IHdoaWxlIChpID4gMCk7CisgICAgaWYgKHggPD0gTE9OR19NQVgpCisgICAgICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZyl4KTsKKyAgICByZXR1cm4gUHlMb25nX0Zyb21VbnNpZ25lZExvbmcoKGxvbmcpeCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBsdV9sb25nbG9uZyhjb25zdCBjaGFyICpwLCBjb25zdCBmb3JtYXRkZWYgKmYpCiB7CiAjaWZkZWYgSEFWRV9MT05HX0xPTkcKLQlQWV9MT05HX0xPTkcgeCA9IDA7Ci0JUHlfc3NpemVfdCBpID0gZi0+c2l6ZTsKLQljb25zdCB1bnNpZ25lZCBjaGFyICpieXRlcyA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopcDsKLQlkbyB7Ci0JCXggPSAoeDw8OCkgfCBieXRlc1stLWldOwotCX0gd2hpbGUgKGkgPiAwKTsKLQkvKiBFeHRlbmQgdGhlIHNpZ24gYml0LiAqLwotCWlmIChTSVpFT0ZfTE9OR19MT05HID4gZi0+c2l6ZSkKLQkJeCB8PSAtKHggJiAoKFBZX0xPTkdfTE9ORykxIDw8ICgoOCAqIGYtPnNpemUpIC0gMSkpKTsKLQlpZiAoeCA+PSBMT05HX01JTiAmJiB4IDw9IExPTkdfTUFYKQotCQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoUHlfU0FGRV9ET1dOQ0FTVCh4LCBQWV9MT05HX0xPTkcsIGxvbmcpKTsKLQlyZXR1cm4gUHlMb25nX0Zyb21Mb25nTG9uZyh4KTsKKyAgICBQWV9MT05HX0xPTkcgeCA9IDA7CisgICAgUHlfc3NpemVfdCBpID0gZi0+c2l6ZTsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpieXRlcyA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopcDsKKyAgICBkbyB7CisgICAgICAgIHggPSAoeDw8OCkgfCBieXRlc1stLWldOworICAgIH0gd2hpbGUgKGkgPiAwKTsKKyAgICAvKiBFeHRlbmQgdGhlIHNpZ24gYml0LiAqLworICAgIGlmIChTSVpFT0ZfTE9OR19MT05HID4gZi0+c2l6ZSkKKyAgICAgICAgeCB8PSAtKHggJiAoKFBZX0xPTkdfTE9ORykxIDw8ICgoOCAqIGYtPnNpemUpIC0gMSkpKTsKKyAgICBpZiAoeCA+PSBMT05HX01JTiAmJiB4IDw9IExPTkdfTUFYKQorICAgICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoUHlfU0FGRV9ET1dOQ0FTVCh4LCBQWV9MT05HX0xPTkcsIGxvbmcpKTsKKyAgICByZXR1cm4gUHlMb25nX0Zyb21Mb25nTG9uZyh4KTsKICNlbHNlCi0JcmV0dXJuIF9QeUxvbmdfRnJvbUJ5dGVBcnJheSgoY29uc3QgdW5zaWduZWQgY2hhciAqKXAsCi0JCQkJICAgICAgOCwKLQkJCQkgICAgICAxLCAvKiBsaXR0bGUtZW5kaWFuICovCi0JCQkJICAgICAgMSAgLyogc2lnbmVkICovKTsKKyAgICByZXR1cm4gX1B5TG9uZ19Gcm9tQnl0ZUFycmF5KChjb25zdCB1bnNpZ25lZCBjaGFyICopcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIC8qIGxpdHRsZS1lbmRpYW4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAxICAvKiBzaWduZWQgKi8pOwogI2VuZGlmCiB9CiAKQEAgLTExMDUsMTkyICsxMTA1LDE5MiBAQAogbHVfdWxvbmdsb25nKGNvbnN0IGNoYXIgKnAsIGNvbnN0IGZvcm1hdGRlZiAqZikKIHsKICNpZmRlZiBIQVZFX0xPTkdfTE9ORwotCXVuc2lnbmVkIFBZX0xPTkdfTE9ORyB4ID0gMDsKLQlQeV9zc2l6ZV90IGkgPSBmLT5zaXplOwotCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ5dGVzID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilwOwotCWRvIHsKLQkJeCA9ICh4PDw4KSB8IGJ5dGVzWy0taV07Ci0JfSB3aGlsZSAoaSA+IDApOwotCWlmICh4IDw9IExPTkdfTUFYKQotCQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoUHlfU0FGRV9ET1dOQ0FTVCh4LCB1bnNpZ25lZCBQWV9MT05HX0xPTkcsIGxvbmcpKTsKLQlyZXR1cm4gUHlMb25nX0Zyb21VbnNpZ25lZExvbmdMb25nKHgpOworICAgIHVuc2lnbmVkIFBZX0xPTkdfTE9ORyB4ID0gMDsKKyAgICBQeV9zc2l6ZV90IGkgPSBmLT5zaXplOworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ5dGVzID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilwOworICAgIGRvIHsKKyAgICAgICAgeCA9ICh4PDw4KSB8IGJ5dGVzWy0taV07CisgICAgfSB3aGlsZSAoaSA+IDApOworICAgIGlmICh4IDw9IExPTkdfTUFYKQorICAgICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoUHlfU0FGRV9ET1dOQ0FTVCh4LCB1bnNpZ25lZCBQWV9MT05HX0xPTkcsIGxvbmcpKTsKKyAgICByZXR1cm4gUHlMb25nX0Zyb21VbnNpZ25lZExvbmdMb25nKHgpOwogI2Vsc2UKLQlyZXR1cm4gX1B5TG9uZ19Gcm9tQnl0ZUFycmF5KChjb25zdCB1bnNpZ25lZCBjaGFyICopcCwKLQkJCQkgICAgICA4LAotCQkJCSAgICAgIDEsIC8qIGxpdHRsZS1lbmRpYW4gKi8KLQkJCQkgICAgICAwICAvKiBzaWduZWQgKi8pOworICAgIHJldHVybiBfUHlMb25nX0Zyb21CeXRlQXJyYXkoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgLyogbGl0dGxlLWVuZGlhbiAqLworICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIHNpZ25lZCAqLyk7CiAjZW5kaWYKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGx1X2Zsb2F0KGNvbnN0IGNoYXIgKnAsIGNvbnN0IGZvcm1hdGRlZiAqZikKIHsKLQlyZXR1cm4gdW5wYWNrX2Zsb2F0KHAsIDEpOworICAgIHJldHVybiB1bnBhY2tfZmxvYXQocCwgMSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBsdV9kb3VibGUoY29uc3QgY2hhciAqcCwgY29uc3QgZm9ybWF0ZGVmICpmKQogewotCXJldHVybiB1bnBhY2tfZG91YmxlKHAsIDEpOworICAgIHJldHVybiB1bnBhY2tfZG91YmxlKHAsIDEpOwogfQogCiBzdGF0aWMgaW50CiBscF9pbnQoY2hhciAqcCwgUHlPYmplY3QgKnYsIGNvbnN0IGZvcm1hdGRlZiAqZikKIHsKLQlsb25nIHg7Ci0JUHlfc3NpemVfdCBpOwotCWlmIChnZXRfd3JhcHBlZF9sb25nKHYsICZ4KSA8IDApCi0JCXJldHVybiAtMTsKLQlpID0gZi0+c2l6ZTsKLQlpZiAoaSAhPSBTSVpFT0ZfTE9ORykgewotCQlpZiAoKGkgPT0gMikgJiYgKHggPCAtMzI3NjggfHwgeCA+IDMyNzY3KSkKLQkJCVJBTkdFX0VSUk9SKHgsIGYsIDAsIDB4ZmZmZkwpOworICAgIGxvbmcgeDsKKyAgICBQeV9zc2l6ZV90IGk7CisgICAgaWYgKGdldF93cmFwcGVkX2xvbmcodiwgJngpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGkgPSBmLT5zaXplOworICAgIGlmIChpICE9IFNJWkVPRl9MT05HKSB7CisgICAgICAgIGlmICgoaSA9PSAyKSAmJiAoeCA8IC0zMjc2OCB8fCB4ID4gMzI3NjcpKQorICAgICAgICAgICAgUkFOR0VfRVJST1IoeCwgZiwgMCwgMHhmZmZmTCk7CiAjaWYgKFNJWkVPRl9MT05HICE9IDQpCi0JCWVsc2UgaWYgKChpID09IDQpICYmICh4IDwgLTIxNDc0ODM2NDhMIHx8IHggPiAyMTQ3NDgzNjQ3TCkpCi0JCQlSQU5HRV9FUlJPUih4LCBmLCAwLCAweGZmZmZmZmZmTCk7CisgICAgICAgIGVsc2UgaWYgKChpID09IDQpICYmICh4IDwgLTIxNDc0ODM2NDhMIHx8IHggPiAyMTQ3NDgzNjQ3TCkpCisgICAgICAgICAgICBSQU5HRV9FUlJPUih4LCBmLCAwLCAweGZmZmZmZmZmTCk7CiAjZW5kaWYKICNpZmRlZiBQWV9TVFJVQ1RfT1ZFUkZMT1dfTUFTS0lORwotCQllbHNlIGlmICgoaSA9PSAxKSAmJiAoeCA8IC0xMjggfHwgeCA+IDEyNykpCi0JCQlSQU5HRV9FUlJPUih4LCBmLCAwLCAweGZmTCk7CisgICAgICAgIGVsc2UgaWYgKChpID09IDEpICYmICh4IDwgLTEyOCB8fCB4ID4gMTI3KSkKKyAgICAgICAgICAgIFJBTkdFX0VSUk9SKHgsIGYsIDAsIDB4ZmZMKTsKICNlbmRpZgotCX0KLQlkbyB7Ci0JCSpwKysgPSAoY2hhcil4OwotCQl4ID4+PSA4OwotCX0gd2hpbGUgKC0taSA+IDApOwotCXJldHVybiAwOworICAgIH0KKyAgICBkbyB7CisgICAgICAgICpwKysgPSAoY2hhcil4OworICAgICAgICB4ID4+PSA4OworICAgIH0gd2hpbGUgKC0taSA+IDApOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBscF91aW50KGNoYXIgKnAsIFB5T2JqZWN0ICp2LCBjb25zdCBmb3JtYXRkZWYgKmYpCiB7Ci0JdW5zaWduZWQgbG9uZyB4OwotCVB5X3NzaXplX3QgaTsKLQlpZiAoZ2V0X3dyYXBwZWRfdWxvbmcodiwgJngpIDwgMCkKLQkJcmV0dXJuIC0xOwotCWkgPSBmLT5zaXplOwotCWlmIChpICE9IFNJWkVPRl9MT05HKSB7Ci0JCXVuc2lnbmVkIGxvbmcgbWF4aW50ID0gMTsKLQkJbWF4aW50IDw8PSAodW5zaWduZWQgbG9uZykoaSAqIDgpOwotCQlpZiAoeCA+PSBtYXhpbnQpCi0JCQlSQU5HRV9FUlJPUih4LCBmLCAxLCBtYXhpbnQgLSAxKTsKLQl9Ci0JZG8gewotCQkqcCsrID0gKGNoYXIpeDsKLQkJeCA+Pj0gODsKLQl9IHdoaWxlICgtLWkgPiAwKTsKLQlyZXR1cm4gMDsKKyAgICB1bnNpZ25lZCBsb25nIHg7CisgICAgUHlfc3NpemVfdCBpOworICAgIGlmIChnZXRfd3JhcHBlZF91bG9uZyh2LCAmeCkgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaSA9IGYtPnNpemU7CisgICAgaWYgKGkgIT0gU0laRU9GX0xPTkcpIHsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBtYXhpbnQgPSAxOworICAgICAgICBtYXhpbnQgPDw9ICh1bnNpZ25lZCBsb25nKShpICogOCk7CisgICAgICAgIGlmICh4ID49IG1heGludCkKKyAgICAgICAgICAgIFJBTkdFX0VSUk9SKHgsIGYsIDEsIG1heGludCAtIDEpOworICAgIH0KKyAgICBkbyB7CisgICAgICAgICpwKysgPSAoY2hhcil4OworICAgICAgICB4ID4+PSA4OworICAgIH0gd2hpbGUgKC0taSA+IDApOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBscF9sb25nbG9uZyhjaGFyICpwLCBQeU9iamVjdCAqdiwgY29uc3QgZm9ybWF0ZGVmICpmKQogewotCWludCByZXM7Ci0JdiA9IGdldF9weWxvbmcodik7Ci0JaWYgKHYgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCXJlcyA9IF9QeUxvbmdfQXNCeXRlQXJyYXkoKFB5TG9uZ09iamVjdCopdiwKLQkJCSAgIAkgICh1bnNpZ25lZCBjaGFyICopcCwKLQkJCQkgIDgsCi0JCQkJICAxLCAvKiBsaXR0bGVfZW5kaWFuICovCi0JCQkJICAxICAvKiBzaWduZWQgKi8pOwotCVB5X0RFQ1JFRih2KTsKLQlyZXR1cm4gcmVzOworICAgIGludCByZXM7CisgICAgdiA9IGdldF9weWxvbmcodik7CisgICAgaWYgKHYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHJlcyA9IF9QeUxvbmdfQXNCeXRlQXJyYXkoKFB5TG9uZ09iamVjdCopdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyICopcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCAvKiBsaXR0bGVfZW5kaWFuICovCisgICAgICAgICAgICAgICAgICAxICAvKiBzaWduZWQgKi8pOworICAgIFB5X0RFQ1JFRih2KTsKKyAgICByZXR1cm4gcmVzOwogfQogCiBzdGF0aWMgaW50CiBscF91bG9uZ2xvbmcoY2hhciAqcCwgUHlPYmplY3QgKnYsIGNvbnN0IGZvcm1hdGRlZiAqZikKIHsKLQlpbnQgcmVzOwotCXYgPSBnZXRfcHlsb25nKHYpOwotCWlmICh2ID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQlyZXMgPSBfUHlMb25nX0FzQnl0ZUFycmF5KChQeUxvbmdPYmplY3QqKXYsCi0JCQkgICAJICAodW5zaWduZWQgY2hhciAqKXAsCi0JCQkJICA4LAotCQkJCSAgMSwgLyogbGl0dGxlX2VuZGlhbiAqLwotCQkJCSAgMCAgLyogc2lnbmVkICovKTsKLQlQeV9ERUNSRUYodik7Ci0JcmV0dXJuIHJlczsKKyAgICBpbnQgcmVzOworICAgIHYgPSBnZXRfcHlsb25nKHYpOworICAgIGlmICh2ID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKyAgICByZXMgPSBfUHlMb25nX0FzQnl0ZUFycmF5KChQeUxvbmdPYmplY3QqKXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhciAqKXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgLyogbGl0dGxlX2VuZGlhbiAqLworICAgICAgICAgICAgICAgICAgMCAgLyogc2lnbmVkICovKTsKKyAgICBQeV9ERUNSRUYodik7CisgICAgcmV0dXJuIHJlczsKIH0KIAogc3RhdGljIGludAogbHBfZmxvYXQoY2hhciAqcCwgUHlPYmplY3QgKnYsIGNvbnN0IGZvcm1hdGRlZiAqZikKIHsKLQlkb3VibGUgeCA9IFB5RmxvYXRfQXNEb3VibGUodik7Ci0JaWYgKHggPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewotCQlQeUVycl9TZXRTdHJpbmcoU3RydWN0RXJyb3IsCi0JCQkJInJlcXVpcmVkIGFyZ3VtZW50IGlzIG5vdCBhIGZsb2F0Iik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JcmV0dXJuIF9QeUZsb2F0X1BhY2s0KHgsICh1bnNpZ25lZCBjaGFyICopcCwgMSk7CisgICAgZG91YmxlIHggPSBQeUZsb2F0X0FzRG91YmxlKHYpOworICAgIGlmICh4ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFN0cnVjdEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInJlcXVpcmVkIGFyZ3VtZW50IGlzIG5vdCBhIGZsb2F0Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIF9QeUZsb2F0X1BhY2s0KHgsICh1bnNpZ25lZCBjaGFyICopcCwgMSk7CiB9CiAKIHN0YXRpYyBpbnQKIGxwX2RvdWJsZShjaGFyICpwLCBQeU9iamVjdCAqdiwgY29uc3QgZm9ybWF0ZGVmICpmKQogewotCWRvdWJsZSB4ID0gUHlGbG9hdF9Bc0RvdWJsZSh2KTsKLQlpZiAoeCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhTdHJ1Y3RFcnJvciwKLQkJCQkicmVxdWlyZWQgYXJndW1lbnQgaXMgbm90IGEgZmxvYXQiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlyZXR1cm4gX1B5RmxvYXRfUGFjazgoeCwgKHVuc2lnbmVkIGNoYXIgKilwLCAxKTsKKyAgICBkb3VibGUgeCA9IFB5RmxvYXRfQXNEb3VibGUodik7CisgICAgaWYgKHggPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoU3RydWN0RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAicmVxdWlyZWQgYXJndW1lbnQgaXMgbm90IGEgZmxvYXQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gX1B5RmxvYXRfUGFjazgoeCwgKHVuc2lnbmVkIGNoYXIgKilwLCAxKTsKIH0KIAogc3RhdGljIGZvcm1hdGRlZiBsaWxlbmRpYW5fdGFibGVbXSA9IHsKLQl7J3gnLAkxLAkJMCwJCU5VTEx9LAorICAgIHsneCcsICAgICAgIDEsICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgTlVMTH0sCiAjaWZkZWYgUFlfU1RSVUNUX09WRVJGTE9XX01BU0tJTkcKLQkvKiBOYXRpdmUgcGFja2VycyBkbyByYW5nZSBjaGVja2luZyB3aXRob3V0IG92ZXJmbG93IG1hc2tpbmcuICovCi0JeydiJywJMSwJCTAsCQludV9ieXRlLAlscF9pbnR9LAotCXsnQicsCTEsCQkwLAkJbnVfdWJ5dGUsCWxwX3VpbnR9LAorICAgIC8qIE5hdGl2ZSBwYWNrZXJzIGRvIHJhbmdlIGNoZWNraW5nIHdpdGhvdXQgb3ZlcmZsb3cgbWFza2luZy4gKi8KKyAgICB7J2InLCAgICAgICAxLCAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgIG51X2J5dGUsICAgICAgICBscF9pbnR9LAorICAgIHsnQicsICAgICAgIDEsICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgbnVfdWJ5dGUsICAgICAgIGxwX3VpbnR9LAogI2Vsc2UKLQl7J2InLAkxLAkJMCwJCW51X2J5dGUsCW5wX2J5dGV9LAotCXsnQicsCTEsCQkwLAkJbnVfdWJ5dGUsCW5wX3VieXRlfSwKKyAgICB7J2InLCAgICAgICAxLCAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgIG51X2J5dGUsICAgICAgICBucF9ieXRlfSwKKyAgICB7J0InLCAgICAgICAxLCAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgIG51X3VieXRlLCAgICAgICBucF91Ynl0ZX0sCiAjZW5kaWYKLQl7J2MnLAkxLAkJMCwJCW51X2NoYXIsCW5wX2NoYXJ9LAotCXsncycsCTEsCQkwLAkJTlVMTH0sCi0JeydwJywJMSwJCTAsCQlOVUxMfSwKLQl7J2gnLAkyLAkJMCwJCWx1X2ludCwJCWxwX2ludH0sCi0JeydIJywJMiwJCTAsCQlsdV91aW50LAlscF91aW50fSwKLQl7J2knLAk0LAkJMCwJCWx1X2ludCwJCWxwX2ludH0sCi0JeydJJywJNCwJCTAsCQlsdV91aW50LAlscF91aW50fSwKLQl7J2wnLAk0LAkJMCwJCWx1X2ludCwJCWxwX2ludH0sCi0JeydMJywJNCwJCTAsCQlsdV91aW50LAlscF91aW50fSwKLQl7J3EnLAk4LAkJMCwJCWx1X2xvbmdsb25nLAlscF9sb25nbG9uZ30sCi0JeydRJywJOCwJCTAsCQlsdV91bG9uZ2xvbmcsCWxwX3Vsb25nbG9uZ30sCi0Jeyc/JywJMSwJCTAsCQlidV9ib29sLAlicF9ib29sfSwgLyogU3RkIHJlcCBub3QgZW5kaWFuIGRlcCwKLQkJYnV0IHBvdGVudGlhbGx5IGRpZmZlcmVudCBmcm9tIG5hdGl2ZSByZXAgLS0gcmV1c2UgYnhfYm9vbCBmdW5jcy4gKi8KLQl7J2YnLAk0LAkJMCwJCWx1X2Zsb2F0LAlscF9mbG9hdH0sCi0JeydkJywJOCwJCTAsCQlsdV9kb3VibGUsCWxwX2RvdWJsZX0sCi0JezB9CisgICAgeydjJywgICAgICAgMSwgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICBudV9jaGFyLCAgICAgICAgbnBfY2hhcn0sCisgICAgeydzJywgICAgICAgMSwgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICBOVUxMfSwKKyAgICB7J3AnLCAgICAgICAxLCAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgIE5VTEx9LAorICAgIHsnaCcsICAgICAgIDIsICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgbHVfaW50LCAgICAgICAgIGxwX2ludH0sCisgICAgeydIJywgICAgICAgMiwgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICBsdV91aW50LCAgICAgICAgbHBfdWludH0sCisgICAgeydpJywgICAgICAgNCwgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICBsdV9pbnQsICAgICAgICAgbHBfaW50fSwKKyAgICB7J0knLCAgICAgICA0LCAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgIGx1X3VpbnQsICAgICAgICBscF91aW50fSwKKyAgICB7J2wnLCAgICAgICA0LCAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgIGx1X2ludCwgICAgICAgICBscF9pbnR9LAorICAgIHsnTCcsICAgICAgIDQsICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgbHVfdWludCwgICAgICAgIGxwX3VpbnR9LAorICAgIHsncScsICAgICAgIDgsICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgbHVfbG9uZ2xvbmcsICAgIGxwX2xvbmdsb25nfSwKKyAgICB7J1EnLCAgICAgICA4LCAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgIGx1X3Vsb25nbG9uZywgICBscF91bG9uZ2xvbmd9LAorICAgIHsnPycsICAgICAgIDEsICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgYnVfYm9vbCwgICAgICAgIGJwX2Jvb2x9LCAvKiBTdGQgcmVwIG5vdCBlbmRpYW4gZGVwLAorICAgICAgICBidXQgcG90ZW50aWFsbHkgZGlmZmVyZW50IGZyb20gbmF0aXZlIHJlcCAtLSByZXVzZSBieF9ib29sIGZ1bmNzLiAqLworICAgIHsnZicsICAgICAgIDQsICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgbHVfZmxvYXQsICAgICAgIGxwX2Zsb2F0fSwKKyAgICB7J2QnLCAgICAgICA4LCAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgIGx1X2RvdWJsZSwgICAgICBscF9kb3VibGV9LAorICAgIHswfQogfTsKIAogCiBzdGF0aWMgY29uc3QgZm9ybWF0ZGVmICoKIHdoaWNodGFibGUoY2hhciAqKnBmbXQpCiB7Ci0JY29uc3QgY2hhciAqZm10ID0gKCpwZm10KSsrOyAvKiBNYXkgYmUgYmFja2VkIG91dCBvZiBsYXRlciAqLwotCXN3aXRjaCAoKmZtdCkgewotCWNhc2UgJzwnOgotCQlyZXR1cm4gbGlsZW5kaWFuX3RhYmxlOwotCWNhc2UgJz4nOgotCWNhc2UgJyEnOiAvKiBOZXR3b3JrIGJ5dGUgb3JkZXIgaXMgYmlnLWVuZGlhbiAqLwotCQlyZXR1cm4gYmlnZW5kaWFuX3RhYmxlOwotCWNhc2UgJz0nOiB7IC8qIEhvc3QgYnl0ZSBvcmRlciAtLSBkaWZmZXJlbnQgZnJvbSBuYXRpdmUgaW4gYWxpZ21lbnQhICovCi0JCWludCBuID0gMTsKLQkJY2hhciAqcCA9IChjaGFyICopICZuOwotCQlpZiAoKnAgPT0gMSkKLQkJCXJldHVybiBsaWxlbmRpYW5fdGFibGU7Ci0JCWVsc2UKLQkJCXJldHVybiBiaWdlbmRpYW5fdGFibGU7Ci0JfQotCWRlZmF1bHQ6Ci0JCS0tKnBmbXQ7IC8qIEJhY2sgb3V0IG9mIHBvaW50ZXIgaW5jcmVtZW50ICovCi0JCS8qIEZhbGwgdGhyb3VnaCAqLwotCWNhc2UgJ0AnOgotCQlyZXR1cm4gbmF0aXZlX3RhYmxlOwotCX0KKyAgICBjb25zdCBjaGFyICpmbXQgPSAoKnBmbXQpKys7IC8qIE1heSBiZSBiYWNrZWQgb3V0IG9mIGxhdGVyICovCisgICAgc3dpdGNoICgqZm10KSB7CisgICAgY2FzZSAnPCc6CisgICAgICAgIHJldHVybiBsaWxlbmRpYW5fdGFibGU7CisgICAgY2FzZSAnPic6CisgICAgY2FzZSAnISc6IC8qIE5ldHdvcmsgYnl0ZSBvcmRlciBpcyBiaWctZW5kaWFuICovCisgICAgICAgIHJldHVybiBiaWdlbmRpYW5fdGFibGU7CisgICAgY2FzZSAnPSc6IHsgLyogSG9zdCBieXRlIG9yZGVyIC0tIGRpZmZlcmVudCBmcm9tIG5hdGl2ZSBpbiBhbGlnbWVudCEgKi8KKyAgICAgICAgaW50IG4gPSAxOworICAgICAgICBjaGFyICpwID0gKGNoYXIgKikgJm47CisgICAgICAgIGlmICgqcCA9PSAxKQorICAgICAgICAgICAgcmV0dXJuIGxpbGVuZGlhbl90YWJsZTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIGJpZ2VuZGlhbl90YWJsZTsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgICAgLS0qcGZtdDsgLyogQmFjayBvdXQgb2YgcG9pbnRlciBpbmNyZW1lbnQgKi8KKyAgICAgICAgLyogRmFsbCB0aHJvdWdoICovCisgICAgY2FzZSAnQCc6CisgICAgICAgIHJldHVybiBuYXRpdmVfdGFibGU7CisgICAgfQogfQogCiAKQEAgLTEyOTksMTMgKzEyOTksMTMgQEAKIHN0YXRpYyBjb25zdCBmb3JtYXRkZWYgKgogZ2V0ZW50cnkoaW50IGMsIGNvbnN0IGZvcm1hdGRlZiAqZikKIHsKLQlmb3IgKDsgZi0+Zm9ybWF0ICE9ICdcMCc7IGYrKykgewotCQlpZiAoZi0+Zm9ybWF0ID09IGMpIHsKLQkJCXJldHVybiBmOwotCQl9Ci0JfQotCVB5RXJyX1NldFN0cmluZyhTdHJ1Y3RFcnJvciwgImJhZCBjaGFyIGluIHN0cnVjdCBmb3JtYXQiKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBmb3IgKDsgZi0+Zm9ybWF0ICE9ICdcMCc7IGYrKykgeworICAgICAgICBpZiAoZi0+Zm9ybWF0ID09IGMpIHsKKyAgICAgICAgICAgIHJldHVybiBmOworICAgICAgICB9CisgICAgfQorICAgIFB5RXJyX1NldFN0cmluZyhTdHJ1Y3RFcnJvciwgImJhZCBjaGFyIGluIHN0cnVjdCBmb3JtYXQiKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogCkBAIC0xMzE0LDE0ICsxMzE0LDE0IEBACiBzdGF0aWMgaW50CiBhbGlnbihQeV9zc2l6ZV90IHNpemUsIGNoYXIgYywgY29uc3QgZm9ybWF0ZGVmICplKQogewotCWlmIChlLT5mb3JtYXQgPT0gYykgewotCQlpZiAoZS0+YWxpZ25tZW50KSB7Ci0JCQlzaXplID0gKChzaXplICsgZS0+YWxpZ25tZW50IC0gMSkKLQkJCQkvIGUtPmFsaWdubWVudCkKLQkJCQkqIGUtPmFsaWdubWVudDsKLQkJfQotCX0KLQlyZXR1cm4gc2l6ZTsKKyAgICBpZiAoZS0+Zm9ybWF0ID09IGMpIHsKKyAgICAgICAgaWYgKGUtPmFsaWdubWVudCkgeworICAgICAgICAgICAgc2l6ZSA9ICgoc2l6ZSArIGUtPmFsaWdubWVudCAtIDEpCisgICAgICAgICAgICAgICAgLyBlLT5hbGlnbm1lbnQpCisgICAgICAgICAgICAgICAgKiBlLT5hbGlnbm1lbnQ7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNpemU7CiB9CiAKIApAQCAtMTMzMCwyMDcgKzEzMzAsMjA3IEBACiBzdGF0aWMgaW50CiBwcmVwYXJlX3MoUHlTdHJ1Y3RPYmplY3QgKnNlbGYpCiB7Ci0JY29uc3QgZm9ybWF0ZGVmICpmOwotCWNvbnN0IGZvcm1hdGRlZiAqZTsKLQlmb3JtYXRjb2RlICpjb2RlczsKKyAgICBjb25zdCBmb3JtYXRkZWYgKmY7CisgICAgY29uc3QgZm9ybWF0ZGVmICplOworICAgIGZvcm1hdGNvZGUgKmNvZGVzOwogCi0JY29uc3QgY2hhciAqczsKLQljb25zdCBjaGFyICpmbXQ7Ci0JY2hhciBjOwotCVB5X3NzaXplX3Qgc2l6ZSwgbGVuLCBudW0sIGl0ZW1zaXplLCB4OworICAgIGNvbnN0IGNoYXIgKnM7CisgICAgY29uc3QgY2hhciAqZm10OworICAgIGNoYXIgYzsKKyAgICBQeV9zc2l6ZV90IHNpemUsIGxlbiwgbnVtLCBpdGVtc2l6ZSwgeDsKIAotCWZtdCA9IFB5U3RyaW5nX0FTX1NUUklORyhzZWxmLT5zX2Zvcm1hdCk7CisgICAgZm10ID0gUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYtPnNfZm9ybWF0KTsKIAotCWYgPSB3aGljaHRhYmxlKChjaGFyICoqKSZmbXQpOworICAgIGYgPSB3aGljaHRhYmxlKChjaGFyICoqKSZmbXQpOwogCi0JcyA9IGZtdDsKLQlzaXplID0gMDsKLQlsZW4gPSAwOwotCXdoaWxlICgoYyA9ICpzKyspICE9ICdcMCcpIHsKLQkJaWYgKGlzc3BhY2UoUHlfQ0hBUk1BU0soYykpKQotCQkJY29udGludWU7Ci0JCWlmICgnMCcgPD0gYyAmJiBjIDw9ICc5JykgewotCQkJbnVtID0gYyAtICcwJzsKLQkJCXdoaWxlICgnMCcgPD0gKGMgPSAqcysrKSAmJiBjIDw9ICc5JykgewotCQkJCXggPSBudW0qMTAgKyAoYyAtICcwJyk7Ci0JCQkJaWYgKHgvMTAgIT0gbnVtKSB7Ci0JCQkJCVB5RXJyX1NldFN0cmluZygKLQkJCQkJCVN0cnVjdEVycm9yLAotCQkJCQkJIm92ZXJmbG93IGluIGl0ZW0gY291bnQiKTsKLQkJCQkJcmV0dXJuIC0xOwotCQkJCX0KLQkJCQludW0gPSB4OwotCQkJfQotCQkJaWYgKGMgPT0gJ1wwJykKLQkJCQlicmVhazsKLQkJfQotCQllbHNlCi0JCQludW0gPSAxOworICAgIHMgPSBmbXQ7CisgICAgc2l6ZSA9IDA7CisgICAgbGVuID0gMDsKKyAgICB3aGlsZSAoKGMgPSAqcysrKSAhPSAnXDAnKSB7CisgICAgICAgIGlmIChpc3NwYWNlKFB5X0NIQVJNQVNLKGMpKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoJzAnIDw9IGMgJiYgYyA8PSAnOScpIHsKKyAgICAgICAgICAgIG51bSA9IGMgLSAnMCc7CisgICAgICAgICAgICB3aGlsZSAoJzAnIDw9IChjID0gKnMrKykgJiYgYyA8PSAnOScpIHsKKyAgICAgICAgICAgICAgICB4ID0gbnVtKjEwICsgKGMgLSAnMCcpOworICAgICAgICAgICAgICAgIGlmICh4LzEwICE9IG51bSkgeworICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJ1Y3RFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJvdmVyZmxvdyBpbiBpdGVtIGNvdW50Iik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbnVtID0geDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjID09ICdcMCcpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbnVtID0gMTsKIAotCQllID0gZ2V0ZW50cnkoYywgZik7Ci0JCWlmIChlID09IE5VTEwpCi0JCQlyZXR1cm4gLTE7CisgICAgICAgIGUgPSBnZXRlbnRyeShjLCBmKTsKKyAgICAgICAgaWYgKGUgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKIAotCQlzd2l0Y2ggKGMpIHsKLQkJCWNhc2UgJ3MnOiAvKiBmYWxsIHRocm91Z2ggKi8KLQkJCWNhc2UgJ3AnOiBsZW4rKzsgYnJlYWs7Ci0JCQljYXNlICd4JzogYnJlYWs7Ci0JCQlkZWZhdWx0OiBsZW4gKz0gbnVtOyBicmVhazsKLQkJfQorICAgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgICAgICAgIGNhc2UgJ3MnOiAvKiBmYWxsIHRocm91Z2ggKi8KKyAgICAgICAgICAgIGNhc2UgJ3AnOiBsZW4rKzsgYnJlYWs7CisgICAgICAgICAgICBjYXNlICd4JzogYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OiBsZW4gKz0gbnVtOyBicmVhazsKKyAgICAgICAgfQogCi0JCWl0ZW1zaXplID0gZS0+c2l6ZTsKLQkJc2l6ZSA9IGFsaWduKHNpemUsIGMsIGUpOwotCQl4ID0gbnVtICogaXRlbXNpemU7Ci0JCXNpemUgKz0geDsKLQkJaWYgKHgvaXRlbXNpemUgIT0gbnVtIHx8IHNpemUgPCAwKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoU3RydWN0RXJyb3IsCi0JCQkJCSJ0b3RhbCBzdHJ1Y3Qgc2l6ZSB0b28gbG9uZyIpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQorICAgICAgICBpdGVtc2l6ZSA9IGUtPnNpemU7CisgICAgICAgIHNpemUgPSBhbGlnbihzaXplLCBjLCBlKTsKKyAgICAgICAgeCA9IG51bSAqIGl0ZW1zaXplOworICAgICAgICBzaXplICs9IHg7CisgICAgICAgIGlmICh4L2l0ZW1zaXplICE9IG51bSB8fCBzaXplIDwgMCkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFN0cnVjdEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0b3RhbCBzdHJ1Y3Qgc2l6ZSB0b28gbG9uZyIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQogCi0JLyogY2hlY2sgZm9yIG92ZXJmbG93ICovCi0JaWYgKChsZW4gKyAxKSA+IChQWV9TU0laRV9UX01BWCAvIHNpemVvZihmb3JtYXRjb2RlKSkpIHsKLQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICAvKiBjaGVjayBmb3Igb3ZlcmZsb3cgKi8KKyAgICBpZiAoKGxlbiArIDEpID4gKFBZX1NTSVpFX1RfTUFYIC8gc2l6ZW9mKGZvcm1hdGNvZGUpKSkgeworICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0Jc2VsZi0+c19zaXplID0gc2l6ZTsKLQlzZWxmLT5zX2xlbiA9IGxlbjsKLQljb2RlcyA9IFB5TWVtX01BTExPQygobGVuICsgMSkgKiBzaXplb2YoZm9ybWF0Y29kZSkpOwotCWlmIChjb2RlcyA9PSBOVUxMKSB7Ci0JCVB5RXJyX05vTWVtb3J5KCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0Jc2VsZi0+c19jb2RlcyA9IGNvZGVzOworICAgIHNlbGYtPnNfc2l6ZSA9IHNpemU7CisgICAgc2VsZi0+c19sZW4gPSBsZW47CisgICAgY29kZXMgPSBQeU1lbV9NQUxMT0MoKGxlbiArIDEpICogc2l6ZW9mKGZvcm1hdGNvZGUpKTsKKyAgICBpZiAoY29kZXMgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHNlbGYtPnNfY29kZXMgPSBjb2RlczsKIAotCXMgPSBmbXQ7Ci0Jc2l6ZSA9IDA7Ci0Jd2hpbGUgKChjID0gKnMrKykgIT0gJ1wwJykgewotCQlpZiAoaXNzcGFjZShQeV9DSEFSTUFTSyhjKSkpCi0JCQljb250aW51ZTsKLQkJaWYgKCcwJyA8PSBjICYmIGMgPD0gJzknKSB7Ci0JCQludW0gPSBjIC0gJzAnOwotCQkJd2hpbGUgKCcwJyA8PSAoYyA9ICpzKyspICYmIGMgPD0gJzknKQotCQkJCW51bSA9IG51bSoxMCArIChjIC0gJzAnKTsKLQkJCWlmIChjID09ICdcMCcpCi0JCQkJYnJlYWs7Ci0JCX0KLQkJZWxzZQotCQkJbnVtID0gMTsKKyAgICBzID0gZm10OworICAgIHNpemUgPSAwOworICAgIHdoaWxlICgoYyA9ICpzKyspICE9ICdcMCcpIHsKKyAgICAgICAgaWYgKGlzc3BhY2UoUHlfQ0hBUk1BU0soYykpKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmICgnMCcgPD0gYyAmJiBjIDw9ICc5JykgeworICAgICAgICAgICAgbnVtID0gYyAtICcwJzsKKyAgICAgICAgICAgIHdoaWxlICgnMCcgPD0gKGMgPSAqcysrKSAmJiBjIDw9ICc5JykKKyAgICAgICAgICAgICAgICBudW0gPSBudW0qMTAgKyAoYyAtICcwJyk7CisgICAgICAgICAgICBpZiAoYyA9PSAnXDAnKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG51bSA9IDE7CiAKLQkJZSA9IGdldGVudHJ5KGMsIGYpOworICAgICAgICBlID0gZ2V0ZW50cnkoYywgZik7CiAKLQkJc2l6ZSA9IGFsaWduKHNpemUsIGMsIGUpOwotCQlpZiAoYyA9PSAncycgfHwgYyA9PSAncCcpIHsKLQkJCWNvZGVzLT5vZmZzZXQgPSBzaXplOwotCQkJY29kZXMtPnNpemUgPSBudW07Ci0JCQljb2Rlcy0+Zm10ZGVmID0gZTsKLQkJCWNvZGVzKys7Ci0JCQlzaXplICs9IG51bTsKLQkJfSBlbHNlIGlmIChjID09ICd4JykgewotCQkJc2l6ZSArPSBudW07Ci0JCX0gZWxzZSB7Ci0JCQl3aGlsZSAoLS1udW0gPj0gMCkgewotCQkJCWNvZGVzLT5vZmZzZXQgPSBzaXplOwotCQkJCWNvZGVzLT5zaXplID0gZS0+c2l6ZTsKLQkJCQljb2Rlcy0+Zm10ZGVmID0gZTsKLQkJCQljb2RlcysrOwotCQkJCXNpemUgKz0gZS0+c2l6ZTsKLQkJCX0KLQkJfQotCX0KLQljb2Rlcy0+Zm10ZGVmID0gTlVMTDsKLQljb2Rlcy0+b2Zmc2V0ID0gc2l6ZTsKLQljb2Rlcy0+c2l6ZSA9IDA7CisgICAgICAgIHNpemUgPSBhbGlnbihzaXplLCBjLCBlKTsKKyAgICAgICAgaWYgKGMgPT0gJ3MnIHx8IGMgPT0gJ3AnKSB7CisgICAgICAgICAgICBjb2Rlcy0+b2Zmc2V0ID0gc2l6ZTsKKyAgICAgICAgICAgIGNvZGVzLT5zaXplID0gbnVtOworICAgICAgICAgICAgY29kZXMtPmZtdGRlZiA9IGU7CisgICAgICAgICAgICBjb2RlcysrOworICAgICAgICAgICAgc2l6ZSArPSBudW07CisgICAgICAgIH0gZWxzZSBpZiAoYyA9PSAneCcpIHsKKyAgICAgICAgICAgIHNpemUgKz0gbnVtOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgd2hpbGUgKC0tbnVtID49IDApIHsKKyAgICAgICAgICAgICAgICBjb2Rlcy0+b2Zmc2V0ID0gc2l6ZTsKKyAgICAgICAgICAgICAgICBjb2Rlcy0+c2l6ZSA9IGUtPnNpemU7CisgICAgICAgICAgICAgICAgY29kZXMtPmZtdGRlZiA9IGU7CisgICAgICAgICAgICAgICAgY29kZXMrKzsKKyAgICAgICAgICAgICAgICBzaXplICs9IGUtPnNpemU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgY29kZXMtPmZtdGRlZiA9IE5VTEw7CisgICAgY29kZXMtPm9mZnNldCA9IHNpemU7CisgICAgY29kZXMtPnNpemUgPSAwOwogCi0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlQeU9iamVjdCAqc2VsZjsKKyAgICBQeU9iamVjdCAqc2VsZjsKIAotCWFzc2VydCh0eXBlICE9IE5VTEwgJiYgdHlwZS0+dHBfYWxsb2MgIT0gTlVMTCk7CisgICAgYXNzZXJ0KHR5cGUgIT0gTlVMTCAmJiB0eXBlLT50cF9hbGxvYyAhPSBOVUxMKTsKIAotCXNlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKLQlpZiAoc2VsZiAhPSBOVUxMKSB7Ci0JCVB5U3RydWN0T2JqZWN0ICpzID0gKFB5U3RydWN0T2JqZWN0KilzZWxmOwotCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCXMtPnNfZm9ybWF0ID0gUHlfTm9uZTsKLQkJcy0+c19jb2RlcyA9IE5VTEw7Ci0JCXMtPnNfc2l6ZSA9IC0xOwotCQlzLT5zX2xlbiA9IC0xOwotCX0KLQlyZXR1cm4gc2VsZjsKKyAgICBzZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7CisgICAgaWYgKHNlbGYgIT0gTlVMTCkgeworICAgICAgICBQeVN0cnVjdE9iamVjdCAqcyA9IChQeVN0cnVjdE9iamVjdCopc2VsZjsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICBzLT5zX2Zvcm1hdCA9IFB5X05vbmU7CisgICAgICAgIHMtPnNfY29kZXMgPSBOVUxMOworICAgICAgICBzLT5zX3NpemUgPSAtMTsKKyAgICAgICAgcy0+c19sZW4gPSAtMTsKKyAgICB9CisgICAgcmV0dXJuIHNlbGY7CiB9CiAKIHN0YXRpYyBpbnQKIHNfaW5pdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCVB5U3RydWN0T2JqZWN0ICpzb3NlbGYgPSAoUHlTdHJ1Y3RPYmplY3QgKilzZWxmOwotCVB5T2JqZWN0ICpvX2Zvcm1hdCA9IE5VTEw7Ci0JaW50IHJldCA9IDA7Ci0Jc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJmb3JtYXQiLCAwfTsKKyAgICBQeVN0cnVjdE9iamVjdCAqc29zZWxmID0gKFB5U3RydWN0T2JqZWN0ICopc2VsZjsKKyAgICBQeU9iamVjdCAqb19mb3JtYXQgPSBOVUxMOworICAgIGludCByZXQgPSAwOworICAgIHN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsiZm9ybWF0IiwgMH07CiAKLQlhc3NlcnQoUHlTdHJ1Y3RfQ2hlY2soc2VsZikpOworICAgIGFzc2VydChQeVN0cnVjdF9DaGVjayhzZWxmKSk7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAiUzpTdHJ1Y3QiLCBrd2xpc3QsCi0JCQkJCSAmb19mb3JtYXQpKQotCQlyZXR1cm4gLTE7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgIlM6U3RydWN0Iiwga3dsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvX2Zvcm1hdCkpCisgICAgICAgIHJldHVybiAtMTsKIAotCVB5X0lOQ1JFRihvX2Zvcm1hdCk7Ci0JUHlfQ0xFQVIoc29zZWxmLT5zX2Zvcm1hdCk7Ci0Jc29zZWxmLT5zX2Zvcm1hdCA9IG9fZm9ybWF0OworICAgIFB5X0lOQ1JFRihvX2Zvcm1hdCk7CisgICAgUHlfQ0xFQVIoc29zZWxmLT5zX2Zvcm1hdCk7CisgICAgc29zZWxmLT5zX2Zvcm1hdCA9IG9fZm9ybWF0OwogCi0JcmV0ID0gcHJlcGFyZV9zKHNvc2VsZik7Ci0JcmV0dXJuIHJldDsKKyAgICByZXQgPSBwcmVwYXJlX3Moc29zZWxmKTsKKyAgICByZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdm9pZAogc19kZWFsbG9jKFB5U3RydWN0T2JqZWN0ICpzKQogewotCWlmIChzLT53ZWFrcmVmbGlzdCAhPSBOVUxMKQotCQlQeU9iamVjdF9DbGVhcldlYWtSZWZzKChQeU9iamVjdCAqKXMpOwotCWlmIChzLT5zX2NvZGVzICE9IE5VTEwpIHsKLQkJUHlNZW1fRlJFRShzLT5zX2NvZGVzKTsKLQl9Ci0JUHlfWERFQ1JFRihzLT5zX2Zvcm1hdCk7Ci0JUHlfVFlQRShzKS0+dHBfZnJlZSgoUHlPYmplY3QgKilzKTsKKyAgICBpZiAocy0+d2Vha3JlZmxpc3QgIT0gTlVMTCkKKyAgICAgICAgUHlPYmplY3RfQ2xlYXJXZWFrUmVmcygoUHlPYmplY3QgKilzKTsKKyAgICBpZiAocy0+c19jb2RlcyAhPSBOVUxMKSB7CisgICAgICAgIFB5TWVtX0ZSRUUocy0+c19jb2Rlcyk7CisgICAgfQorICAgIFB5X1hERUNSRUYocy0+c19mb3JtYXQpOworICAgIFB5X1RZUEUocyktPnRwX2ZyZWUoKFB5T2JqZWN0ICopcyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzX3VucGFja19pbnRlcm5hbChQeVN0cnVjdE9iamVjdCAqc29zZWxmLCBjaGFyICpzdGFydGZyb20pIHsKLQlmb3JtYXRjb2RlICpjb2RlOwotCVB5X3NzaXplX3QgaSA9IDA7Ci0JUHlPYmplY3QgKnJlc3VsdCA9IFB5VHVwbGVfTmV3KHNvc2VsZi0+c19sZW4pOwotCWlmIChyZXN1bHQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgZm9ybWF0Y29kZSAqY29kZTsKKyAgICBQeV9zc2l6ZV90IGkgPSAwOworICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBQeVR1cGxlX05ldyhzb3NlbGYtPnNfbGVuKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JZm9yIChjb2RlID0gc29zZWxmLT5zX2NvZGVzOyBjb2RlLT5mbXRkZWYgIT0gTlVMTDsgY29kZSsrKSB7Ci0JCVB5T2JqZWN0ICp2OwotCQljb25zdCBmb3JtYXRkZWYgKmUgPSBjb2RlLT5mbXRkZWY7Ci0JCWNvbnN0IGNoYXIgKnJlcyA9IHN0YXJ0ZnJvbSArIGNvZGUtPm9mZnNldDsKLQkJaWYgKGUtPmZvcm1hdCA9PSAncycpIHsKLQkJCXYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShyZXMsIGNvZGUtPnNpemUpOwotCQl9IGVsc2UgaWYgKGUtPmZvcm1hdCA9PSAncCcpIHsKLQkJCVB5X3NzaXplX3QgbiA9ICoodW5zaWduZWQgY2hhciopcmVzOwotCQkJaWYgKG4gPj0gY29kZS0+c2l6ZSkKLQkJCQluID0gY29kZS0+c2l6ZSAtIDE7Ci0JCQl2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocmVzICsgMSwgbik7Ci0JCX0gZWxzZSB7Ci0JCQl2ID0gZS0+dW5wYWNrKHJlcywgZSk7Ci0JCX0KLQkJaWYgKHYgPT0gTlVMTCkKLQkJCWdvdG8gZmFpbDsKLQkJUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIGkrKywgdik7Ci0JfQorICAgIGZvciAoY29kZSA9IHNvc2VsZi0+c19jb2RlczsgY29kZS0+Zm10ZGVmICE9IE5VTEw7IGNvZGUrKykgeworICAgICAgICBQeU9iamVjdCAqdjsKKyAgICAgICAgY29uc3QgZm9ybWF0ZGVmICplID0gY29kZS0+Zm10ZGVmOworICAgICAgICBjb25zdCBjaGFyICpyZXMgPSBzdGFydGZyb20gKyBjb2RlLT5vZmZzZXQ7CisgICAgICAgIGlmIChlLT5mb3JtYXQgPT0gJ3MnKSB7CisgICAgICAgICAgICB2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocmVzLCBjb2RlLT5zaXplKTsKKyAgICAgICAgfSBlbHNlIGlmIChlLT5mb3JtYXQgPT0gJ3AnKSB7CisgICAgICAgICAgICBQeV9zc2l6ZV90IG4gPSAqKHVuc2lnbmVkIGNoYXIqKXJlczsKKyAgICAgICAgICAgIGlmIChuID49IGNvZGUtPnNpemUpCisgICAgICAgICAgICAgICAgbiA9IGNvZGUtPnNpemUgLSAxOworICAgICAgICAgICAgdiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHJlcyArIDEsIG4pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdiA9IGUtPnVucGFjayhyZXMsIGUpOworICAgICAgICB9CisgICAgICAgIGlmICh2ID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIFB5VHVwbGVfU0VUX0lURU0ocmVzdWx0LCBpKyssIHYpOworICAgIH0KIAotCXJldHVybiByZXN1bHQ7CisgICAgcmV0dXJuIHJlc3VsdDsKIGZhaWw6Ci0JUHlfREVDUkVGKHJlc3VsdCk7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIApAQCAtMTU0NCwzNSArMTU0NCwzNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNfdW5wYWNrKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqaW5wdXRzdHIpCiB7Ci0JY2hhciAqc3RhcnQ7Ci0JUHlfc3NpemVfdCBsZW47Ci0JUHlPYmplY3QgKmFyZ3M9TlVMTCwgKnJlc3VsdDsKLQlQeVN0cnVjdE9iamVjdCAqc29zZWxmID0gKFB5U3RydWN0T2JqZWN0ICopc2VsZjsKLQlhc3NlcnQoUHlTdHJ1Y3RfQ2hlY2soc2VsZikpOwotCWFzc2VydChzb3NlbGYtPnNfY29kZXMgIT0gTlVMTCk7Ci0JaWYgKGlucHV0c3RyID09IE5VTEwpCi0JCWdvdG8gZmFpbDsKLQlpZiAoUHlTdHJpbmdfQ2hlY2soaW5wdXRzdHIpICYmCi0JCVB5U3RyaW5nX0dFVF9TSVpFKGlucHV0c3RyKSA9PSBzb3NlbGYtPnNfc2l6ZSkgewotCQkJcmV0dXJuIHNfdW5wYWNrX2ludGVybmFsKHNvc2VsZiwgUHlTdHJpbmdfQVNfU1RSSU5HKGlucHV0c3RyKSk7Ci0JfQotCWFyZ3MgPSBQeVR1cGxlX1BhY2soMSwgaW5wdXRzdHIpOwotCWlmIChhcmdzID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyM6dW5wYWNrIiwgJnN0YXJ0LCAmbGVuKSkKLQkJZ290byBmYWlsOwotCWlmIChzb3NlbGYtPnNfc2l6ZSAhPSBsZW4pCi0JCWdvdG8gZmFpbDsKLQlyZXN1bHQgPSBzX3VucGFja19pbnRlcm5hbChzb3NlbGYsIHN0YXJ0KTsKLQlQeV9ERUNSRUYoYXJncyk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBjaGFyICpzdGFydDsKKyAgICBQeV9zc2l6ZV90IGxlbjsKKyAgICBQeU9iamVjdCAqYXJncz1OVUxMLCAqcmVzdWx0OworICAgIFB5U3RydWN0T2JqZWN0ICpzb3NlbGYgPSAoUHlTdHJ1Y3RPYmplY3QgKilzZWxmOworICAgIGFzc2VydChQeVN0cnVjdF9DaGVjayhzZWxmKSk7CisgICAgYXNzZXJ0KHNvc2VsZi0+c19jb2RlcyAhPSBOVUxMKTsKKyAgICBpZiAoaW5wdXRzdHIgPT0gTlVMTCkKKyAgICAgICAgZ290byBmYWlsOworICAgIGlmIChQeVN0cmluZ19DaGVjayhpbnB1dHN0cikgJiYKKyAgICAgICAgUHlTdHJpbmdfR0VUX1NJWkUoaW5wdXRzdHIpID09IHNvc2VsZi0+c19zaXplKSB7CisgICAgICAgICAgICByZXR1cm4gc191bnBhY2tfaW50ZXJuYWwoc29zZWxmLCBQeVN0cmluZ19BU19TVFJJTkcoaW5wdXRzdHIpKTsKKyAgICB9CisgICAgYXJncyA9IFB5VHVwbGVfUGFjaygxLCBpbnB1dHN0cik7CisgICAgaWYgKGFyZ3MgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIzp1bnBhY2siLCAmc3RhcnQsICZsZW4pKQorICAgICAgICBnb3RvIGZhaWw7CisgICAgaWYgKHNvc2VsZi0+c19zaXplICE9IGxlbikKKyAgICAgICAgZ290byBmYWlsOworICAgIHJlc3VsdCA9IHNfdW5wYWNrX2ludGVybmFsKHNvc2VsZiwgc3RhcnQpOworICAgIFB5X0RFQ1JFRihhcmdzKTsKKyAgICByZXR1cm4gcmVzdWx0OwogCiBmYWlsOgotCVB5X1hERUNSRUYoYXJncyk7Ci0JUHlFcnJfRm9ybWF0KFN0cnVjdEVycm9yLAotCQkidW5wYWNrIHJlcXVpcmVzIGEgc3RyaW5nIGFyZ3VtZW50IG9mIGxlbmd0aCAlemQiLAotCQlzb3NlbGYtPnNfc2l6ZSk7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlfWERFQ1JFRihhcmdzKTsKKyAgICBQeUVycl9Gb3JtYXQoU3RydWN0RXJyb3IsCisgICAgICAgICJ1bnBhY2sgcmVxdWlyZXMgYSBzdHJpbmcgYXJndW1lbnQgb2YgbGVuZ3RoICV6ZCIsCisgICAgICAgIHNvc2VsZi0+c19zaXplKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogUHlEb2NfU1RSVkFSKHNfdW5wYWNrX2Zyb21fX2RvY19fLApAQCAtMTU4NiwzOCArMTU4NiwzOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNfdW5wYWNrX2Zyb20oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7ImJ1ZmZlciIsICJvZmZzZXQiLCAwfTsKKyAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7ImJ1ZmZlciIsICJvZmZzZXQiLCAwfTsKICNpZiAoUFlfVkVSU0lPTl9IRVggPCAweDAyMDUwMDAwKQotCXN0YXRpYyBjaGFyICpmbXQgPSAieiN8aTp1bnBhY2tfZnJvbSI7CisgICAgc3RhdGljIGNoYXIgKmZtdCA9ICJ6I3xpOnVucGFja19mcm9tIjsKICNlbHNlCi0Jc3RhdGljIGNoYXIgKmZtdCA9ICJ6I3xuOnVucGFja19mcm9tIjsKKyAgICBzdGF0aWMgY2hhciAqZm10ID0gInojfG46dW5wYWNrX2Zyb20iOwogI2VuZGlmCi0JUHlfc3NpemVfdCBidWZmZXJfbGVuID0gMCwgb2Zmc2V0ID0gMDsKLQljaGFyICpidWZmZXIgPSBOVUxMOwotCVB5U3RydWN0T2JqZWN0ICpzb3NlbGYgPSAoUHlTdHJ1Y3RPYmplY3QgKilzZWxmOwotCWFzc2VydChQeVN0cnVjdF9DaGVjayhzZWxmKSk7Ci0JYXNzZXJ0KHNvc2VsZi0+c19jb2RlcyAhPSBOVUxMKTsKKyAgICBQeV9zc2l6ZV90IGJ1ZmZlcl9sZW4gPSAwLCBvZmZzZXQgPSAwOworICAgIGNoYXIgKmJ1ZmZlciA9IE5VTEw7CisgICAgUHlTdHJ1Y3RPYmplY3QgKnNvc2VsZiA9IChQeVN0cnVjdE9iamVjdCAqKXNlbGY7CisgICAgYXNzZXJ0KFB5U3RydWN0X0NoZWNrKHNlbGYpKTsKKyAgICBhc3NlcnQoc29zZWxmLT5zX2NvZGVzICE9IE5VTEwpOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgZm10LCBrd2xpc3QsCi0JCQkJCSAmYnVmZmVyLCAmYnVmZmVyX2xlbiwgJm9mZnNldCkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsIGZtdCwga3dsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZidWZmZXIsICZidWZmZXJfbGVuLCAmb2Zmc2V0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoYnVmZmVyID09IE5VTEwpIHsKLQkJUHlFcnJfRm9ybWF0KFN0cnVjdEVycm9yLAotCQkJInVucGFja19mcm9tIHJlcXVpcmVzIGEgYnVmZmVyIGFyZ3VtZW50Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoYnVmZmVyID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFN0cnVjdEVycm9yLAorICAgICAgICAgICAgInVucGFja19mcm9tIHJlcXVpcmVzIGEgYnVmZmVyIGFyZ3VtZW50Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWlmIChvZmZzZXQgPCAwKQotCQlvZmZzZXQgKz0gYnVmZmVyX2xlbjsKKyAgICBpZiAob2Zmc2V0IDwgMCkKKyAgICAgICAgb2Zmc2V0ICs9IGJ1ZmZlcl9sZW47CiAKLQlpZiAob2Zmc2V0IDwgMCB8fCAoYnVmZmVyX2xlbiAtIG9mZnNldCkgPCBzb3NlbGYtPnNfc2l6ZSkgewotCQlQeUVycl9Gb3JtYXQoU3RydWN0RXJyb3IsCi0JCQkidW5wYWNrX2Zyb20gcmVxdWlyZXMgYSBidWZmZXIgb2YgYXQgbGVhc3QgJXpkIGJ5dGVzIiwKLQkJCXNvc2VsZi0+c19zaXplKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBzX3VucGFja19pbnRlcm5hbChzb3NlbGYsIGJ1ZmZlciArIG9mZnNldCk7CisgICAgaWYgKG9mZnNldCA8IDAgfHwgKGJ1ZmZlcl9sZW4gLSBvZmZzZXQpIDwgc29zZWxmLT5zX3NpemUpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFN0cnVjdEVycm9yLAorICAgICAgICAgICAgInVucGFja19mcm9tIHJlcXVpcmVzIGEgYnVmZmVyIG9mIGF0IGxlYXN0ICV6ZCBieXRlcyIsCisgICAgICAgICAgICBzb3NlbGYtPnNfc2l6ZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gc191bnBhY2tfaW50ZXJuYWwoc29zZWxmLCBidWZmZXIgKyBvZmZzZXQpOwogfQogCiAKQEAgLTE2MzQsNTUgKzE2MzQsNTUgQEAKIHN0YXRpYyBpbnQKIHNfcGFja19pbnRlcm5hbChQeVN0cnVjdE9iamVjdCAqc29zZWxmLCBQeU9iamVjdCAqYXJncywgaW50IG9mZnNldCwgY2hhciogYnVmKQogewotCWZvcm1hdGNvZGUgKmNvZGU7Ci0JLyogWFhYKG5ub3J3aXR6KTogd2h5IGRvZXMgaSBuZWVkIHRvIGJlIGEgbG9jYWw/ICBjYW4gd2UgdXNlCi0JICAgdGhlIG9mZnNldCBwYXJhbWV0ZXIgb3IgZG8gd2UgbmVlZCB0aGUgd2lkZXIgd2lkdGg/ICovCi0JUHlfc3NpemVfdCBpOworICAgIGZvcm1hdGNvZGUgKmNvZGU7CisgICAgLyogWFhYKG5ub3J3aXR6KTogd2h5IGRvZXMgaSBuZWVkIHRvIGJlIGEgbG9jYWw/ICBjYW4gd2UgdXNlCisgICAgICAgdGhlIG9mZnNldCBwYXJhbWV0ZXIgb3IgZG8gd2UgbmVlZCB0aGUgd2lkZXIgd2lkdGg/ICovCisgICAgUHlfc3NpemVfdCBpOwogCi0JbWVtc2V0KGJ1ZiwgJ1wwJywgc29zZWxmLT5zX3NpemUpOwotCWkgPSBvZmZzZXQ7Ci0JZm9yIChjb2RlID0gc29zZWxmLT5zX2NvZGVzOyBjb2RlLT5mbXRkZWYgIT0gTlVMTDsgY29kZSsrKSB7Ci0JCVB5X3NzaXplX3QgbjsKLQkJUHlPYmplY3QgKnYgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIGkrKyk7Ci0JCWNvbnN0IGZvcm1hdGRlZiAqZSA9IGNvZGUtPmZtdGRlZjsKLQkJY2hhciAqcmVzID0gYnVmICsgY29kZS0+b2Zmc2V0OwotCQlpZiAoZS0+Zm9ybWF0ID09ICdzJykgewotCQkJaWYgKCFQeVN0cmluZ19DaGVjayh2KSkgewotCQkJCVB5RXJyX1NldFN0cmluZyhTdHJ1Y3RFcnJvciwKLQkJCQkJCSJhcmd1bWVudCBmb3IgJ3MnIG11c3QgYmUgYSBzdHJpbmciKTsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCQluID0gUHlTdHJpbmdfR0VUX1NJWkUodik7Ci0JCQlpZiAobiA+IGNvZGUtPnNpemUpCi0JCQkJbiA9IGNvZGUtPnNpemU7Ci0JCQlpZiAobiA+IDApCi0JCQkJbWVtY3B5KHJlcywgUHlTdHJpbmdfQVNfU1RSSU5HKHYpLCBuKTsKLQkJfSBlbHNlIGlmIChlLT5mb3JtYXQgPT0gJ3AnKSB7Ci0JCQlpZiAoIVB5U3RyaW5nX0NoZWNrKHYpKSB7Ci0JCQkJUHlFcnJfU2V0U3RyaW5nKFN0cnVjdEVycm9yLAotCQkJCQkJImFyZ3VtZW50IGZvciAncCcgbXVzdCBiZSBhIHN0cmluZyIpOwotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJCW4gPSBQeVN0cmluZ19HRVRfU0laRSh2KTsKLQkJCWlmIChuID4gKGNvZGUtPnNpemUgLSAxKSkKLQkJCQluID0gY29kZS0+c2l6ZSAtIDE7Ci0JCQlpZiAobiA+IDApCi0JCQkJbWVtY3B5KHJlcyArIDEsIFB5U3RyaW5nX0FTX1NUUklORyh2KSwgbik7Ci0JCQlpZiAobiA+IDI1NSkKLQkJCQluID0gMjU1OwotCQkJKnJlcyA9IFB5X1NBRkVfRE9XTkNBU1QobiwgUHlfc3NpemVfdCwgdW5zaWduZWQgY2hhcik7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZS0+cGFjayhyZXMsIHYsIGUpIDwgMCkgewotCQkJCWlmIChQeUxvbmdfQ2hlY2sodikgJiYgUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19PdmVyZmxvd0Vycm9yKSkKLQkJCQkJUHlFcnJfU2V0U3RyaW5nKFN0cnVjdEVycm9yLAotCQkJCQkJCSJsb25nIHRvbyBsYXJnZSB0byBjb252ZXJ0IHRvIGludCIpOwotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfQotCX0KKyAgICBtZW1zZXQoYnVmLCAnXDAnLCBzb3NlbGYtPnNfc2l6ZSk7CisgICAgaSA9IG9mZnNldDsKKyAgICBmb3IgKGNvZGUgPSBzb3NlbGYtPnNfY29kZXM7IGNvZGUtPmZtdGRlZiAhPSBOVUxMOyBjb2RlKyspIHsKKyAgICAgICAgUHlfc3NpemVfdCBuOworICAgICAgICBQeU9iamVjdCAqdiA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgaSsrKTsKKyAgICAgICAgY29uc3QgZm9ybWF0ZGVmICplID0gY29kZS0+Zm10ZGVmOworICAgICAgICBjaGFyICpyZXMgPSBidWYgKyBjb2RlLT5vZmZzZXQ7CisgICAgICAgIGlmIChlLT5mb3JtYXQgPT0gJ3MnKSB7CisgICAgICAgICAgICBpZiAoIVB5U3RyaW5nX0NoZWNrKHYpKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFN0cnVjdEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXJndW1lbnQgZm9yICdzJyBtdXN0IGJlIGEgc3RyaW5nIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHYpOworICAgICAgICAgICAgaWYgKG4gPiBjb2RlLT5zaXplKQorICAgICAgICAgICAgICAgIG4gPSBjb2RlLT5zaXplOworICAgICAgICAgICAgaWYgKG4gPiAwKQorICAgICAgICAgICAgICAgIG1lbWNweShyZXMsIFB5U3RyaW5nX0FTX1NUUklORyh2KSwgbik7CisgICAgICAgIH0gZWxzZSBpZiAoZS0+Zm9ybWF0ID09ICdwJykgeworICAgICAgICAgICAgaWYgKCFQeVN0cmluZ19DaGVjayh2KSkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhTdHJ1Y3RFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFyZ3VtZW50IGZvciAncCcgbXVzdCBiZSBhIHN0cmluZyIpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG4gPSBQeVN0cmluZ19HRVRfU0laRSh2KTsKKyAgICAgICAgICAgIGlmIChuID4gKGNvZGUtPnNpemUgLSAxKSkKKyAgICAgICAgICAgICAgICBuID0gY29kZS0+c2l6ZSAtIDE7CisgICAgICAgICAgICBpZiAobiA+IDApCisgICAgICAgICAgICAgICAgbWVtY3B5KHJlcyArIDEsIFB5U3RyaW5nX0FTX1NUUklORyh2KSwgbik7CisgICAgICAgICAgICBpZiAobiA+IDI1NSkKKyAgICAgICAgICAgICAgICBuID0gMjU1OworICAgICAgICAgICAgKnJlcyA9IFB5X1NBRkVfRE9XTkNBU1QobiwgUHlfc3NpemVfdCwgdW5zaWduZWQgY2hhcik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoZS0+cGFjayhyZXMsIHYsIGUpIDwgMCkgeworICAgICAgICAgICAgICAgIGlmIChQeUxvbmdfQ2hlY2sodikgJiYgUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19PdmVyZmxvd0Vycm9yKSkKKyAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFN0cnVjdEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxvbmcgdG9vIGxhcmdlIHRvIGNvbnZlcnQgdG8gaW50Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogCi0JLyogU3VjY2VzcyAqLwotCXJldHVybiAwOworICAgIC8qIFN1Y2Nlc3MgKi8KKyAgICByZXR1cm4gMDsKIH0KIAogCkBAIC0xNjk1LDMyICsxNjk1LDMyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogc19wYWNrKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeVN0cnVjdE9iamVjdCAqc29zZWxmOwotCVB5T2JqZWN0ICpyZXN1bHQ7CisgICAgUHlTdHJ1Y3RPYmplY3QgKnNvc2VsZjsKKyAgICBQeU9iamVjdCAqcmVzdWx0OwogCi0JLyogVmFsaWRhdGUgYXJndW1lbnRzLiAqLwotCXNvc2VsZiA9IChQeVN0cnVjdE9iamVjdCAqKXNlbGY7Ci0JYXNzZXJ0KFB5U3RydWN0X0NoZWNrKHNlbGYpKTsKLQlhc3NlcnQoc29zZWxmLT5zX2NvZGVzICE9IE5VTEwpOwotCWlmIChQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpICE9IHNvc2VsZi0+c19sZW4pCi0JewotCQlQeUVycl9Gb3JtYXQoU3RydWN0RXJyb3IsCi0JCQkicGFjayByZXF1aXJlcyBleGFjdGx5ICV6ZCBhcmd1bWVudHMiLCBzb3NlbGYtPnNfbGVuKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIC8qIFZhbGlkYXRlIGFyZ3VtZW50cy4gKi8KKyAgICBzb3NlbGYgPSAoUHlTdHJ1Y3RPYmplY3QgKilzZWxmOworICAgIGFzc2VydChQeVN0cnVjdF9DaGVjayhzZWxmKSk7CisgICAgYXNzZXJ0KHNvc2VsZi0+c19jb2RlcyAhPSBOVUxMKTsKKyAgICBpZiAoUHlUdXBsZV9HRVRfU0laRShhcmdzKSAhPSBzb3NlbGYtPnNfbGVuKQorICAgIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFN0cnVjdEVycm9yLAorICAgICAgICAgICAgInBhY2sgcmVxdWlyZXMgZXhhY3RseSAlemQgYXJndW1lbnRzIiwgc29zZWxmLT5zX2xlbik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCS8qIEFsbG9jYXRlIGEgbmV3IHN0cmluZyAqLwotCXJlc3VsdCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopTlVMTCwgc29zZWxmLT5zX3NpemUpOwotCWlmIChyZXN1bHQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgLyogQWxsb2NhdGUgYSBuZXcgc3RyaW5nICovCisgICAgcmVzdWx0ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilOVUxMLCBzb3NlbGYtPnNfc2l6ZSk7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCS8qIENhbGwgdGhlIGd1dHMgKi8KLQlpZiAoIHNfcGFja19pbnRlcm5hbChzb3NlbGYsIGFyZ3MsIDAsIFB5U3RyaW5nX0FTX1NUUklORyhyZXN1bHQpKSAhPSAwICkgewotCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIC8qIENhbGwgdGhlIGd1dHMgKi8KKyAgICBpZiAoIHNfcGFja19pbnRlcm5hbChzb3NlbGYsIGFyZ3MsIDAsIFB5U3RyaW5nX0FTX1NUUklORyhyZXN1bHQpKSAhPSAwICkgeworICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JcmV0dXJuIHJlc3VsdDsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBQeURvY19TVFJWQVIoc19wYWNrX2ludG9fX2RvY19fLApAQCAtMTczNCw1OSArMTczNCw1OSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNfcGFja19pbnRvKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeVN0cnVjdE9iamVjdCAqc29zZWxmOwotCWNoYXIgKmJ1ZmZlcjsKLQlQeV9zc2l6ZV90IGJ1ZmZlcl9sZW4sIG9mZnNldDsKKyAgICBQeVN0cnVjdE9iamVjdCAqc29zZWxmOworICAgIGNoYXIgKmJ1ZmZlcjsKKyAgICBQeV9zc2l6ZV90IGJ1ZmZlcl9sZW4sIG9mZnNldDsKIAotCS8qIFZhbGlkYXRlIGFyZ3VtZW50cy4gICsxIGlzIGZvciB0aGUgZmlyc3QgYXJnIGFzIGJ1ZmZlci4gKi8KLQlzb3NlbGYgPSAoUHlTdHJ1Y3RPYmplY3QgKilzZWxmOwotCWFzc2VydChQeVN0cnVjdF9DaGVjayhzZWxmKSk7Ci0JYXNzZXJ0KHNvc2VsZi0+c19jb2RlcyAhPSBOVUxMKTsKLQlpZiAoUHlUdXBsZV9HRVRfU0laRShhcmdzKSAhPSAoc29zZWxmLT5zX2xlbiArIDIpKQotCXsKLQkJUHlFcnJfRm9ybWF0KFN0cnVjdEVycm9yLAotCQkJICAgICAicGFja19pbnRvIHJlcXVpcmVzIGV4YWN0bHkgJXpkIGFyZ3VtZW50cyIsCi0JCQkgICAgIChzb3NlbGYtPnNfbGVuICsgMikpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgLyogVmFsaWRhdGUgYXJndW1lbnRzLiAgKzEgaXMgZm9yIHRoZSBmaXJzdCBhcmcgYXMgYnVmZmVyLiAqLworICAgIHNvc2VsZiA9IChQeVN0cnVjdE9iamVjdCAqKXNlbGY7CisgICAgYXNzZXJ0KFB5U3RydWN0X0NoZWNrKHNlbGYpKTsKKyAgICBhc3NlcnQoc29zZWxmLT5zX2NvZGVzICE9IE5VTEwpOworICAgIGlmIChQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpICE9IChzb3NlbGYtPnNfbGVuICsgMikpCisgICAgeworICAgICAgICBQeUVycl9Gb3JtYXQoU3RydWN0RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAicGFja19pbnRvIHJlcXVpcmVzIGV4YWN0bHkgJXpkIGFyZ3VtZW50cyIsCisgICAgICAgICAgICAgICAgICAgICAoc29zZWxmLT5zX2xlbiArIDIpKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JLyogRXh0cmFjdCBhIHdyaXRhYmxlIG1lbW9yeSBidWZmZXIgZnJvbSB0aGUgZmlyc3QgYXJndW1lbnQgKi8KLQlpZiAoIFB5T2JqZWN0X0FzV3JpdGVCdWZmZXIoUHlUdXBsZV9HRVRfSVRFTShhcmdzLCAwKSwKLQkJCQkJCQkJKHZvaWQqKikmYnVmZmVyLCAmYnVmZmVyX2xlbikgPT0gLTEgKSB7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlhc3NlcnQoIGJ1ZmZlcl9sZW4gPj0gMCApOworICAgIC8qIEV4dHJhY3QgYSB3cml0YWJsZSBtZW1vcnkgYnVmZmVyIGZyb20gdGhlIGZpcnN0IGFyZ3VtZW50ICovCisgICAgaWYgKCBQeU9iamVjdF9Bc1dyaXRlQnVmZmVyKFB5VHVwbGVfR0VUX0lURU0oYXJncywgMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCoqKSZidWZmZXIsICZidWZmZXJfbGVuKSA9PSAtMSApIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGFzc2VydCggYnVmZmVyX2xlbiA+PSAwICk7CiAKLQkvKiBFeHRyYWN0IHRoZSBvZmZzZXQgZnJvbSB0aGUgZmlyc3QgYXJndW1lbnQgKi8KLQlvZmZzZXQgPSBQeUludF9Bc1NzaXplX3QoUHlUdXBsZV9HRVRfSVRFTShhcmdzLCAxKSk7Ci0JaWYgKG9mZnNldCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gTlVMTDsKKyAgICAvKiBFeHRyYWN0IHRoZSBvZmZzZXQgZnJvbSB0aGUgZmlyc3QgYXJndW1lbnQgKi8KKyAgICBvZmZzZXQgPSBQeUludF9Bc1NzaXplX3QoUHlUdXBsZV9HRVRfSVRFTShhcmdzLCAxKSk7CisgICAgaWYgKG9mZnNldCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCS8qIFN1cHBvcnQgbmVnYXRpdmUgb2Zmc2V0cy4gKi8KLQlpZiAob2Zmc2V0IDwgMCkKLQkJb2Zmc2V0ICs9IGJ1ZmZlcl9sZW47CisgICAgLyogU3VwcG9ydCBuZWdhdGl2ZSBvZmZzZXRzLiAqLworICAgIGlmIChvZmZzZXQgPCAwKQorICAgICAgICBvZmZzZXQgKz0gYnVmZmVyX2xlbjsKIAotCS8qIENoZWNrIGJvdW5kYXJpZXMgKi8KLQlpZiAob2Zmc2V0IDwgMCB8fCAoYnVmZmVyX2xlbiAtIG9mZnNldCkgPCBzb3NlbGYtPnNfc2l6ZSkgewotCQlQeUVycl9Gb3JtYXQoU3RydWN0RXJyb3IsCi0JCQkgICAgICJwYWNrX2ludG8gcmVxdWlyZXMgYSBidWZmZXIgb2YgYXQgbGVhc3QgJXpkIGJ5dGVzIiwKLQkJCSAgICAgc29zZWxmLT5zX3NpemUpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgLyogQ2hlY2sgYm91bmRhcmllcyAqLworICAgIGlmIChvZmZzZXQgPCAwIHx8IChidWZmZXJfbGVuIC0gb2Zmc2V0KSA8IHNvc2VsZi0+c19zaXplKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChTdHJ1Y3RFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJwYWNrX2ludG8gcmVxdWlyZXMgYSBidWZmZXIgb2YgYXQgbGVhc3QgJXpkIGJ5dGVzIiwKKyAgICAgICAgICAgICAgICAgICAgIHNvc2VsZi0+c19zaXplKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JLyogQ2FsbCB0aGUgZ3V0cyAqLwotCWlmICggc19wYWNrX2ludGVybmFsKHNvc2VsZiwgYXJncywgMiwgYnVmZmVyICsgb2Zmc2V0KSAhPSAwICkgewotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgLyogQ2FsbCB0aGUgZ3V0cyAqLworICAgIGlmICggc19wYWNrX2ludGVybmFsKHNvc2VsZiwgYXJncywgMiwgYnVmZmVyICsgb2Zmc2V0KSAhPSAwICkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlQeV9SRVRVUk5fTk9ORTsKKyAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNfZ2V0X2Zvcm1hdChQeVN0cnVjdE9iamVjdCAqc2VsZiwgdm9pZCAqdW51c2VkKQogewotCVB5X0lOQ1JFRihzZWxmLT5zX2Zvcm1hdCk7Ci0JcmV0dXJuIHNlbGYtPnNfZm9ybWF0OworICAgIFB5X0lOQ1JFRihzZWxmLT5zX2Zvcm1hdCk7CisgICAgcmV0dXJuIHNlbGYtPnNfZm9ybWF0OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgpAQCAtMTc5OCwxMiArMTc5OCwxMiBAQAogLyogTGlzdCBvZiBmdW5jdGlvbnMgKi8KIAogc3RhdGljIHN0cnVjdCBQeU1ldGhvZERlZiBzX21ldGhvZHNbXSA9IHsKLQl7InBhY2siLAlzX3BhY2ssCQlNRVRIX1ZBUkFSR1MsIHNfcGFja19fZG9jX199LAotCXsicGFja19pbnRvIiwJc19wYWNrX2ludG8sCU1FVEhfVkFSQVJHUywgc19wYWNrX2ludG9fX2RvY19ffSwKLQl7InVucGFjayIsCXNfdW5wYWNrLCAgICAgICBNRVRIX08sIHNfdW5wYWNrX19kb2NfX30sCi0JeyJ1bnBhY2tfZnJvbSIsCShQeUNGdW5jdGlvbilzX3VucGFja19mcm9tLCBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywKLQkJCXNfdW5wYWNrX2Zyb21fX2RvY19ffSwKLQl7TlVMTCwJIE5VTEx9CQkvKiBzZW50aW5lbCAqLworICAgIHsicGFjayIsICAgICAgICAgICAgc19wYWNrLCAgICAgICAgIE1FVEhfVkFSQVJHUywgc19wYWNrX19kb2NfX30sCisgICAgeyJwYWNrX2ludG8iLCAgICAgICBzX3BhY2tfaW50bywgICAgTUVUSF9WQVJBUkdTLCBzX3BhY2tfaW50b19fZG9jX199LAorICAgIHsidW5wYWNrIiwgICAgICAgICAgc191bnBhY2ssICAgICAgIE1FVEhfTywgc191bnBhY2tfX2RvY19ffSwKKyAgICB7InVucGFja19mcm9tIiwgICAgIChQeUNGdW5jdGlvbilzX3VucGFja19mcm9tLCBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywKKyAgICAgICAgICAgICAgICAgICAgc191bnBhY2tfZnJvbV9fZG9jX199LAorICAgIHtOVUxMLCAgICAgICBOVUxMfSAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogUHlEb2NfU1RSVkFSKHNfX2RvY19fLCAiQ29tcGlsZWQgc3RydWN0IG9iamVjdCIpOwpAQCAtMTgxMSw1MiArMTgxMSw1MiBAQAogI2RlZmluZSBPRkYoeCkgb2Zmc2V0b2YoUHlTdHJ1Y3RPYmplY3QsIHgpCiAKIHN0YXRpYyBQeUdldFNldERlZiBzX2dldHNldGxpc3RbXSA9IHsKLQl7ImZvcm1hdCIsIChnZXR0ZXIpc19nZXRfZm9ybWF0LCAoc2V0dGVyKU5VTEwsICJzdHJ1Y3QgZm9ybWF0IHN0cmluZyIsIE5VTEx9LAotCXsic2l6ZSIsIChnZXR0ZXIpc19nZXRfc2l6ZSwgKHNldHRlcilOVUxMLCAic3RydWN0IHNpemUgaW4gYnl0ZXMiLCBOVUxMfSwKLQl7TlVMTH0gLyogc2VudGluZWwgKi8KKyAgICB7ImZvcm1hdCIsIChnZXR0ZXIpc19nZXRfZm9ybWF0LCAoc2V0dGVyKU5VTEwsICJzdHJ1Y3QgZm9ybWF0IHN0cmluZyIsIE5VTEx9LAorICAgIHsic2l6ZSIsIChnZXR0ZXIpc19nZXRfc2l6ZSwgKHNldHRlcilOVUxMLCAic3RydWN0IHNpemUgaW4gYnl0ZXMiLCBOVUxMfSwKKyAgICB7TlVMTH0gLyogc2VudGluZWwgKi8KIH07CiAKIHN0YXRpYwogUHlUeXBlT2JqZWN0IFB5U3RydWN0VHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKLQkiU3RydWN0IiwKLQlzaXplb2YoUHlTdHJ1Y3RPYmplY3QpLAotCTAsCi0JKGRlc3RydWN0b3Ipc19kZWFsbG9jLAkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9jb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkvKiB0cF9nZXRhdHRybyAqLwotCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLAkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFIHwgUHlfVFBGTEFHU19IQVZFX1dFQUtSRUZTLC8qIHRwX2ZsYWdzICovCi0Jc19fZG9jX18sCQkJLyogdHBfZG9jICovCi0JMCwJCQkJCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0Jb2Zmc2V0b2YoUHlTdHJ1Y3RPYmplY3QsIHdlYWtyZWZsaXN0KSwJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaXRlciAqLwotCTAsCQkJCQkvKiB0cF9pdGVybmV4dCAqLwotCXNfbWV0aG9kcywJCQkvKiB0cF9tZXRob2RzICovCi0JTlVMTCwJCQkJLyogdHBfbWVtYmVycyAqLwotCXNfZ2V0c2V0bGlzdCwJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJCS8qIHRwX2RpY3QgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCi0Jc19pbml0LAkJCQkvKiB0cF9pbml0ICovCi0JUHlUeXBlX0dlbmVyaWNBbGxvYywvKiB0cF9hbGxvYyAqLwotCXNfbmV3LAkJCQkvKiB0cF9uZXcgKi8KLQlQeU9iamVjdF9EZWwsCQkvKiB0cF9mcmVlICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisgICAgIlN0cnVjdCIsCisgICAgc2l6ZW9mKFB5U3RydWN0T2JqZWN0KSwKKyAgICAwLAorICAgIChkZXN0cnVjdG9yKXNfZGVhbGxvYywgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19CQVNFVFlQRSB8IFB5X1RQRkxBR1NfSEFWRV9XRUFLUkVGUywvKiB0cF9mbGFncyAqLworICAgIHNfX2RvY19fLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIG9mZnNldG9mKFB5U3RydWN0T2JqZWN0LCB3ZWFrcmVmbGlzdCksICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgc19tZXRob2RzLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICBzX2dldHNldGxpc3QsICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIHNfaW5pdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICBQeVR5cGVfR2VuZXJpY0FsbG9jLC8qIHRwX2FsbG9jICovCisgICAgc19uZXcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgUHlPYmplY3RfRGVsLCAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KIH07CiAKIApAQCAtMTg2OCwyOSArMTg2OCwyOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGNhY2hlX3N0cnVjdChQeU9iamVjdCAqZm10KQogewotCVB5T2JqZWN0ICogc19vYmplY3Q7CisgICAgUHlPYmplY3QgKiBzX29iamVjdDsKIAotCWlmIChjYWNoZSA9PSBOVUxMKSB7Ci0JCWNhY2hlID0gUHlEaWN0X05ldygpOwotCQlpZiAoY2FjaGUgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoY2FjaGUgPT0gTlVMTCkgeworICAgICAgICBjYWNoZSA9IFB5RGljdF9OZXcoKTsKKyAgICAgICAgaWYgKGNhY2hlID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlzX29iamVjdCA9IFB5RGljdF9HZXRJdGVtKGNhY2hlLCBmbXQpOwotCWlmIChzX29iamVjdCAhPSBOVUxMKSB7Ci0JCVB5X0lOQ1JFRihzX29iamVjdCk7Ci0JCXJldHVybiBzX29iamVjdDsKLQl9CisgICAgc19vYmplY3QgPSBQeURpY3RfR2V0SXRlbShjYWNoZSwgZm10KTsKKyAgICBpZiAoc19vYmplY3QgIT0gTlVMTCkgeworICAgICAgICBQeV9JTkNSRUYoc19vYmplY3QpOworICAgICAgICByZXR1cm4gc19vYmplY3Q7CisgICAgfQogCi0Jc19vYmplY3QgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKChQeU9iamVjdCAqKSgmUHlTdHJ1Y3RUeXBlKSwgZm10LCBOVUxMKTsKLQlpZiAoc19vYmplY3QgIT0gTlVMTCkgewotCQlpZiAoUHlEaWN0X1NpemUoY2FjaGUpID49IE1BWENBQ0hFKQotCQkJUHlEaWN0X0NsZWFyKGNhY2hlKTsKLQkJLyogQXR0ZW1wdCB0byBjYWNoZSB0aGUgcmVzdWx0ICovCi0JCWlmIChQeURpY3RfU2V0SXRlbShjYWNoZSwgZm10LCBzX29iamVjdCkgPT0gLTEpCi0JCQlQeUVycl9DbGVhcigpOwotCX0KLQlyZXR1cm4gc19vYmplY3Q7CisgICAgc19vYmplY3QgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKChQeU9iamVjdCAqKSgmUHlTdHJ1Y3RUeXBlKSwgZm10LCBOVUxMKTsKKyAgICBpZiAoc19vYmplY3QgIT0gTlVMTCkgeworICAgICAgICBpZiAoUHlEaWN0X1NpemUoY2FjaGUpID49IE1BWENBQ0hFKQorICAgICAgICAgICAgUHlEaWN0X0NsZWFyKGNhY2hlKTsKKyAgICAgICAgLyogQXR0ZW1wdCB0byBjYWNoZSB0aGUgcmVzdWx0ICovCisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbShjYWNoZSwgZm10LCBzX29iamVjdCkgPT0gLTEpCisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgIH0KKyAgICByZXR1cm4gc19vYmplY3Q7CiB9CiAKIFB5RG9jX1NUUlZBUihjbGVhcmNhY2hlX2RvYywKQEAgLTE4OTksOCArMTg5OSw4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogY2xlYXJjYWNoZShQeU9iamVjdCAqc2VsZikKIHsKLQlQeV9DTEVBUihjYWNoZSk7Ci0JUHlfUkVUVVJOX05PTkU7CisgICAgUHlfQ0xFQVIoY2FjaGUpOworICAgIFB5X1JFVFVSTl9OT05FOwogfQogCiBQeURvY19TVFJWQVIoY2FsY3NpemVfZG9jLApAQCAtMTkwOSwxMyArMTkwOSwxMyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGNhbGNzaXplKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqZm10KQogewotCVB5X3NzaXplX3QgbjsKLQlQeU9iamVjdCAqc19vYmplY3QgPSBjYWNoZV9zdHJ1Y3QoZm10KTsKLQlpZiAoc19vYmplY3QgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JbiA9ICgoUHlTdHJ1Y3RPYmplY3QgKilzX29iamVjdCktPnNfc2l6ZTsKLQlQeV9ERUNSRUYoc19vYmplY3QpOwotICAgIAlyZXR1cm4gUHlJbnRfRnJvbVNzaXplX3Qobik7CisgICAgUHlfc3NpemVfdCBuOworICAgIFB5T2JqZWN0ICpzX29iamVjdCA9IGNhY2hlX3N0cnVjdChmbXQpOworICAgIGlmIChzX29iamVjdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBuID0gKChQeVN0cnVjdE9iamVjdCAqKXNfb2JqZWN0KS0+c19zaXplOworICAgIFB5X0RFQ1JFRihzX29iamVjdCk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KG4pOwogfQogCiBQeURvY19TVFJWQVIocGFja19kb2MsCkBAIC0xOTI0LDI3ICsxOTI0LDI3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogcGFjayhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKnNfb2JqZWN0LCAqZm10LCAqbmV3YXJncywgKnJlc3VsdDsKLQlQeV9zc2l6ZV90IG4gPSBQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpOworICAgIFB5T2JqZWN0ICpzX29iamVjdCwgKmZtdCwgKm5ld2FyZ3MsICpyZXN1bHQ7CisgICAgUHlfc3NpemVfdCBuID0gUHlUdXBsZV9HRVRfU0laRShhcmdzKTsKIAotCWlmIChuID09IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIm1pc3NpbmcgZm9ybWF0IGFyZ3VtZW50Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlmbXQgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDApOwotCW5ld2FyZ3MgPSBQeVR1cGxlX0dldFNsaWNlKGFyZ3MsIDEsIG4pOwotCWlmIChuZXdhcmdzID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIGlmIChuID09IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIm1pc3NpbmcgZm9ybWF0IGFyZ3VtZW50Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBmbXQgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDApOworICAgIG5ld2FyZ3MgPSBQeVR1cGxlX0dldFNsaWNlKGFyZ3MsIDEsIG4pOworICAgIGlmIChuZXdhcmdzID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0Jc19vYmplY3QgPSBjYWNoZV9zdHJ1Y3QoZm10KTsKLQlpZiAoc19vYmplY3QgPT0gTlVMTCkgewotCQlQeV9ERUNSRUYobmV3YXJncyk7Ci0JCXJldHVybiBOVUxMOwotCX0KLSAgICAJcmVzdWx0ID0gc19wYWNrKHNfb2JqZWN0LCBuZXdhcmdzKTsKLQlQeV9ERUNSRUYobmV3YXJncyk7Ci0JUHlfREVDUkVGKHNfb2JqZWN0KTsKLQlyZXR1cm4gcmVzdWx0OworICAgIHNfb2JqZWN0ID0gY2FjaGVfc3RydWN0KGZtdCk7CisgICAgaWYgKHNfb2JqZWN0ID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKG5ld2FyZ3MpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmVzdWx0ID0gc19wYWNrKHNfb2JqZWN0LCBuZXdhcmdzKTsKKyAgICBQeV9ERUNSRUYobmV3YXJncyk7CisgICAgUHlfREVDUkVGKHNfb2JqZWN0KTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBQeURvY19TVFJWQVIocGFja19pbnRvX2RvYywKQEAgLTE5NTQsMjcgKzE5NTQsMjcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBwYWNrX2ludG8oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICpzX29iamVjdCwgKmZtdCwgKm5ld2FyZ3MsICpyZXN1bHQ7Ci0JUHlfc3NpemVfdCBuID0gUHlUdXBsZV9HRVRfU0laRShhcmdzKTsKKyAgICBQeU9iamVjdCAqc19vYmplY3QsICpmbXQsICpuZXdhcmdzLCAqcmVzdWx0OworICAgIFB5X3NzaXplX3QgbiA9IFB5VHVwbGVfR0VUX1NJWkUoYXJncyk7CiAKLQlpZiAobiA9PSAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJtaXNzaW5nIGZvcm1hdCBhcmd1bWVudCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZm10ID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCAwKTsKLQluZXdhcmdzID0gUHlUdXBsZV9HZXRTbGljZShhcmdzLCAxLCBuKTsKLQlpZiAobmV3YXJncyA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAobiA9PSAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJtaXNzaW5nIGZvcm1hdCBhcmd1bWVudCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZm10ID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCAwKTsKKyAgICBuZXdhcmdzID0gUHlUdXBsZV9HZXRTbGljZShhcmdzLCAxLCBuKTsKKyAgICBpZiAobmV3YXJncyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXNfb2JqZWN0ID0gY2FjaGVfc3RydWN0KGZtdCk7Ci0JaWYgKHNfb2JqZWN0ID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKG5ld2FyZ3MpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0gICAgCXJlc3VsdCA9IHNfcGFja19pbnRvKHNfb2JqZWN0LCBuZXdhcmdzKTsKLQlQeV9ERUNSRUYobmV3YXJncyk7Ci0JUHlfREVDUkVGKHNfb2JqZWN0KTsKLQlyZXR1cm4gcmVzdWx0OworICAgIHNfb2JqZWN0ID0gY2FjaGVfc3RydWN0KGZtdCk7CisgICAgaWYgKHNfb2JqZWN0ID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKG5ld2FyZ3MpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmVzdWx0ID0gc19wYWNrX2ludG8oc19vYmplY3QsIG5ld2FyZ3MpOworICAgIFB5X0RFQ1JFRihuZXdhcmdzKTsKKyAgICBQeV9ERUNSRUYoc19vYmplY3QpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIFB5RG9jX1NUUlZBUih1bnBhY2tfZG9jLApAQCAtMTk4NCwxNyArMTk4NCwxNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHVucGFjayhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKnNfb2JqZWN0LCAqZm10LCAqaW5wdXRzdHIsICpyZXN1bHQ7CisgICAgUHlPYmplY3QgKnNfb2JqZWN0LCAqZm10LCAqaW5wdXRzdHIsICpyZXN1bHQ7CiAKLQlpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJ1bnBhY2siLCAyLCAyLCAmZm10LCAmaW5wdXRzdHIpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJ1bnBhY2siLCAyLCAyLCAmZm10LCAmaW5wdXRzdHIpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXNfb2JqZWN0ID0gY2FjaGVfc3RydWN0KGZtdCk7Ci0JaWYgKHNfb2JqZWN0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotICAgIAlyZXN1bHQgPSBzX3VucGFjayhzX29iamVjdCwgaW5wdXRzdHIpOwotCVB5X0RFQ1JFRihzX29iamVjdCk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBzX29iamVjdCA9IGNhY2hlX3N0cnVjdChmbXQpOworICAgIGlmIChzX29iamVjdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXN1bHQgPSBzX3VucGFjayhzX29iamVjdCwgaW5wdXRzdHIpOworICAgIFB5X0RFQ1JFRihzX29iamVjdCk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogUHlEb2NfU1RSVkFSKHVucGFja19mcm9tX2RvYywKQEAgLTIwMDQsMzggKzIwMDQsMzggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiB1bnBhY2tfZnJvbShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCVB5T2JqZWN0ICpzX29iamVjdCwgKmZtdCwgKm5ld2FyZ3MsICpyZXN1bHQ7Ci0JUHlfc3NpemVfdCBuID0gUHlUdXBsZV9HRVRfU0laRShhcmdzKTsKKyAgICBQeU9iamVjdCAqc19vYmplY3QsICpmbXQsICpuZXdhcmdzLCAqcmVzdWx0OworICAgIFB5X3NzaXplX3QgbiA9IFB5VHVwbGVfR0VUX1NJWkUoYXJncyk7CiAKLQlpZiAobiA9PSAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJtaXNzaW5nIGZvcm1hdCBhcmd1bWVudCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZm10ID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCAwKTsKLQluZXdhcmdzID0gUHlUdXBsZV9HZXRTbGljZShhcmdzLCAxLCBuKTsKLQlpZiAobmV3YXJncyA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAobiA9PSAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJtaXNzaW5nIGZvcm1hdCBhcmd1bWVudCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZm10ID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCAwKTsKKyAgICBuZXdhcmdzID0gUHlUdXBsZV9HZXRTbGljZShhcmdzLCAxLCBuKTsKKyAgICBpZiAobmV3YXJncyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXNfb2JqZWN0ID0gY2FjaGVfc3RydWN0KGZtdCk7Ci0JaWYgKHNfb2JqZWN0ID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKG5ld2FyZ3MpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0gICAgCXJlc3VsdCA9IHNfdW5wYWNrX2Zyb20oc19vYmplY3QsIG5ld2FyZ3MsIGt3ZHMpOwotCVB5X0RFQ1JFRihuZXdhcmdzKTsKLQlQeV9ERUNSRUYoc19vYmplY3QpOwotCXJldHVybiByZXN1bHQ7CisgICAgc19vYmplY3QgPSBjYWNoZV9zdHJ1Y3QoZm10KTsKKyAgICBpZiAoc19vYmplY3QgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYobmV3YXJncyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXN1bHQgPSBzX3VucGFja19mcm9tKHNfb2JqZWN0LCBuZXdhcmdzLCBrd2RzKTsKKyAgICBQeV9ERUNSRUYobmV3YXJncyk7CisgICAgUHlfREVDUkVGKHNfb2JqZWN0KTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgc3RydWN0IFB5TWV0aG9kRGVmIG1vZHVsZV9mdW5jdGlvbnNbXSA9IHsKLQl7Il9jbGVhcmNhY2hlIiwJKFB5Q0Z1bmN0aW9uKWNsZWFyY2FjaGUsCU1FVEhfTk9BUkdTLCAJY2xlYXJjYWNoZV9kb2N9LAotCXsiY2FsY3NpemUiLAljYWxjc2l6ZSwJTUVUSF9PLCAJY2FsY3NpemVfZG9jfSwKLQl7InBhY2siLAlwYWNrLAkJTUVUSF9WQVJBUkdTLCAJcGFja19kb2N9LAotCXsicGFja19pbnRvIiwJcGFja19pbnRvLAlNRVRIX1ZBUkFSR1MsIAlwYWNrX2ludG9fZG9jfSwKLQl7InVucGFjayIsCXVucGFjaywgICAgICAgCU1FVEhfVkFSQVJHUywgCXVucGFja19kb2N9LAotCXsidW5wYWNrX2Zyb20iLAkoUHlDRnVuY3Rpb24pdW5wYWNrX2Zyb20sIAkKLQkJCU1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLCAJdW5wYWNrX2Zyb21fZG9jfSwKLQl7TlVMTCwJIE5VTEx9CQkvKiBzZW50aW5lbCAqLworICAgIHsiX2NsZWFyY2FjaGUiLCAgICAgKFB5Q0Z1bmN0aW9uKWNsZWFyY2FjaGUsICAgICAgICBNRVRIX05PQVJHUywgICAgY2xlYXJjYWNoZV9kb2N9LAorICAgIHsiY2FsY3NpemUiLCAgICAgICAgY2FsY3NpemUsICAgICAgIE1FVEhfTywgICAgICAgICBjYWxjc2l6ZV9kb2N9LAorICAgIHsicGFjayIsICAgICAgICAgICAgcGFjaywgICAgICAgICAgIE1FVEhfVkFSQVJHUywgICBwYWNrX2RvY30sCisgICAgeyJwYWNrX2ludG8iLCAgICAgICBwYWNrX2ludG8sICAgICAgTUVUSF9WQVJBUkdTLCAgIHBhY2tfaW50b19kb2N9LAorICAgIHsidW5wYWNrIiwgICAgICAgICAgdW5wYWNrLCAgICAgICAgIE1FVEhfVkFSQVJHUywgICB1bnBhY2tfZG9jfSwKKyAgICB7InVucGFja19mcm9tIiwgICAgIChQeUNGdW5jdGlvbil1bnBhY2tfZnJvbSwKKyAgICAgICAgICAgICAgICAgICAgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsICAgICAgICAgdW5wYWNrX2Zyb21fZG9jfSwKKyAgICB7TlVMTCwgICAgICAgTlVMTH0gICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIApAQCAtMjA3MywxMDEgKzIwNzMsMTAxIEBACiBQeU1PRElOSVRfRlVOQwogaW5pdF9zdHJ1Y3Qodm9pZCkKIHsKLQlQeU9iamVjdCAqdmVyLCAqbTsKKyAgICBQeU9iamVjdCAqdmVyLCAqbTsKIAotCXZlciA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIjAuMiIpOwotCWlmICh2ZXIgPT0gTlVMTCkKLQkJcmV0dXJuOworICAgIHZlciA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIjAuMiIpOworICAgIGlmICh2ZXIgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOwogCi0JbSA9IFB5X0luaXRNb2R1bGUzKCJfc3RydWN0IiwgbW9kdWxlX2Z1bmN0aW9ucywgbW9kdWxlX2RvYyk7Ci0JaWYgKG0gPT0gTlVMTCkKLQkJcmV0dXJuOworICAgIG0gPSBQeV9Jbml0TW9kdWxlMygiX3N0cnVjdCIsIG1vZHVsZV9mdW5jdGlvbnMsIG1vZHVsZV9kb2MpOworICAgIGlmIChtID09IE5VTEwpCisgICAgICAgIHJldHVybjsKIAotCVB5X1RZUEUoJlB5U3RydWN0VHlwZSkgPSAmUHlUeXBlX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmUHlTdHJ1Y3RUeXBlKSA8IDApCi0JCXJldHVybjsKKyAgICBQeV9UWVBFKCZQeVN0cnVjdFR5cGUpID0gJlB5VHlwZV9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJlB5U3RydWN0VHlwZSkgPCAwKQorICAgICAgICByZXR1cm47CiAKICNpZmRlZiBQWV9TVFJVQ1RfT1ZFUkZMT1dfTUFTS0lORwotCWlmIChweWludF96ZXJvID09IE5VTEwpIHsKLQkJcHlpbnRfemVybyA9IFB5SW50X0Zyb21Mb25nKDApOwotCQlpZiAocHlpbnRfemVybyA9PSBOVUxMKQotCQkJcmV0dXJuOwotCX0KLQlpZiAocHlsb25nX3Vsb25nX21hc2sgPT0gTlVMTCkgeworICAgIGlmIChweWludF96ZXJvID09IE5VTEwpIHsKKyAgICAgICAgcHlpbnRfemVybyA9IFB5SW50X0Zyb21Mb25nKDApOworICAgICAgICBpZiAocHlpbnRfemVybyA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAocHlsb25nX3Vsb25nX21hc2sgPT0gTlVMTCkgewogI2lmIChTSVpFT0ZfTE9ORyA9PSA0KQotCQlweWxvbmdfdWxvbmdfbWFzayA9IFB5TG9uZ19Gcm9tU3RyaW5nKCJGRkZGRkZGRiIsIE5VTEwsIDE2KTsKKyAgICAgICAgcHlsb25nX3Vsb25nX21hc2sgPSBQeUxvbmdfRnJvbVN0cmluZygiRkZGRkZGRkYiLCBOVUxMLCAxNik7CiAjZWxzZQotCQlweWxvbmdfdWxvbmdfbWFzayA9IFB5TG9uZ19Gcm9tU3RyaW5nKCJGRkZGRkZGRkZGRkZGRkZGIiwgTlVMTCwgMTYpOworICAgICAgICBweWxvbmdfdWxvbmdfbWFzayA9IFB5TG9uZ19Gcm9tU3RyaW5nKCJGRkZGRkZGRkZGRkZGRkZGIiwgTlVMTCwgMTYpOwogI2VuZGlmCi0JCWlmIChweWxvbmdfdWxvbmdfbWFzayA9PSBOVUxMKQotCQkJcmV0dXJuOwotCX0KKyAgICAgICAgaWYgKHB5bG9uZ191bG9uZ19tYXNrID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm47CisgICAgfQogCiAjZWxzZQotCS8qIFRoaXMgc3BlZWQgdHJpY2sgY2FuJ3QgYmUgdXNlZCB1bnRpbCBvdmVyZmxvdyBtYXNraW5nIGdvZXMgYXdheSwgYmVjYXVzZQotCSAgIG5hdGl2ZSBlbmRpYW4gYWx3YXlzIHJhaXNlcyBleGNlcHRpb25zIGluc3RlYWQgb2Ygb3ZlcmZsb3cgbWFza2luZy4gKi8KKyAgICAvKiBUaGlzIHNwZWVkIHRyaWNrIGNhbid0IGJlIHVzZWQgdW50aWwgb3ZlcmZsb3cgbWFza2luZyBnb2VzIGF3YXksIGJlY2F1c2UKKyAgICAgICBuYXRpdmUgZW5kaWFuIGFsd2F5cyByYWlzZXMgZXhjZXB0aW9ucyBpbnN0ZWFkIG9mIG92ZXJmbG93IG1hc2tpbmcuICovCiAKLQkvKiBDaGVjayBlbmRpYW4gYW5kIHN3YXAgaW4gZmFzdGVyIGZ1bmN0aW9ucyAqLwotCXsKLQkJaW50IG9uZSA9IDE7Ci0JCWZvcm1hdGRlZiAqbmF0aXZlID0gbmF0aXZlX3RhYmxlOwotCQlmb3JtYXRkZWYgKm90aGVyLCAqcHRyOwotCQlpZiAoKGludCkqKHVuc2lnbmVkIGNoYXIqKSZvbmUpCi0JCQlvdGhlciA9IGxpbGVuZGlhbl90YWJsZTsKLQkJZWxzZQotCQkJb3RoZXIgPSBiaWdlbmRpYW5fdGFibGU7Ci0JCS8qIFNjYW4gdGhyb3VnaCB0aGUgbmF0aXZlIHRhYmxlLCBmaW5kIGEgbWF0Y2hpbmcKLQkJICAgZW50cnkgaW4gdGhlIGVuZGlhbiB0YWJsZSBhbmQgc3dhcCBpbiB0aGUKLQkJICAgbmF0aXZlIGltcGxlbWVudGF0aW9ucyB3aGVuZXZlciBwb3NzaWJsZQotCQkgICAoNjQtYml0IHBsYXRmb3JtcyBtYXkgbm90IGhhdmUgInN0YW5kYXJkIiBzaXplcykgKi8KLQkJd2hpbGUgKG5hdGl2ZS0+Zm9ybWF0ICE9ICdcMCcgJiYgb3RoZXItPmZvcm1hdCAhPSAnXDAnKSB7Ci0JCQlwdHIgPSBvdGhlcjsKLQkJCXdoaWxlIChwdHItPmZvcm1hdCAhPSAnXDAnKSB7Ci0JCQkJaWYgKHB0ci0+Zm9ybWF0ID09IG5hdGl2ZS0+Zm9ybWF0KSB7Ci0JCQkJCS8qIE1hdGNoIGZhc3RlciB3aGVuIGZvcm1hdHMgYXJlCi0JCQkJCSAgIGxpc3RlZCBpbiB0aGUgc2FtZSBvcmRlciAqLwotCQkJCQlpZiAocHRyID09IG90aGVyKQotCQkJCQkJb3RoZXIrKzsKLQkJCQkJLyogT25seSB1c2UgdGhlIHRyaWNrIGlmIHRoZQotCQkJCQkgICBzaXplIG1hdGNoZXMgKi8KLQkJCQkJaWYgKHB0ci0+c2l6ZSAhPSBuYXRpdmUtPnNpemUpCi0JCQkJCQlicmVhazsKLQkJCQkJLyogU2tpcCBmbG9hdCBhbmQgZG91YmxlLCBjb3VsZCBiZQotCQkJCQkgICAidW5rbm93biIgZmxvYXQgZm9ybWF0ICovCi0JCQkJCWlmIChwdHItPmZvcm1hdCA9PSAnZCcgfHwgcHRyLT5mb3JtYXQgPT0gJ2YnKQotCQkJCQkJYnJlYWs7Ci0JCQkJCXB0ci0+cGFjayA9IG5hdGl2ZS0+cGFjazsKLQkJCQkJcHRyLT51bnBhY2sgPSBuYXRpdmUtPnVucGFjazsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCXB0cisrOwotCQkJfQotCQkJbmF0aXZlKys7Ci0JCX0KLQl9CisgICAgLyogQ2hlY2sgZW5kaWFuIGFuZCBzd2FwIGluIGZhc3RlciBmdW5jdGlvbnMgKi8KKyAgICB7CisgICAgICAgIGludCBvbmUgPSAxOworICAgICAgICBmb3JtYXRkZWYgKm5hdGl2ZSA9IG5hdGl2ZV90YWJsZTsKKyAgICAgICAgZm9ybWF0ZGVmICpvdGhlciwgKnB0cjsKKyAgICAgICAgaWYgKChpbnQpKih1bnNpZ25lZCBjaGFyKikmb25lKQorICAgICAgICAgICAgb3RoZXIgPSBsaWxlbmRpYW5fdGFibGU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG90aGVyID0gYmlnZW5kaWFuX3RhYmxlOworICAgICAgICAvKiBTY2FuIHRocm91Z2ggdGhlIG5hdGl2ZSB0YWJsZSwgZmluZCBhIG1hdGNoaW5nCisgICAgICAgICAgIGVudHJ5IGluIHRoZSBlbmRpYW4gdGFibGUgYW5kIHN3YXAgaW4gdGhlCisgICAgICAgICAgIG5hdGl2ZSBpbXBsZW1lbnRhdGlvbnMgd2hlbmV2ZXIgcG9zc2libGUKKyAgICAgICAgICAgKDY0LWJpdCBwbGF0Zm9ybXMgbWF5IG5vdCBoYXZlICJzdGFuZGFyZCIgc2l6ZXMpICovCisgICAgICAgIHdoaWxlIChuYXRpdmUtPmZvcm1hdCAhPSAnXDAnICYmIG90aGVyLT5mb3JtYXQgIT0gJ1wwJykgeworICAgICAgICAgICAgcHRyID0gb3RoZXI7CisgICAgICAgICAgICB3aGlsZSAocHRyLT5mb3JtYXQgIT0gJ1wwJykgeworICAgICAgICAgICAgICAgIGlmIChwdHItPmZvcm1hdCA9PSBuYXRpdmUtPmZvcm1hdCkgeworICAgICAgICAgICAgICAgICAgICAvKiBNYXRjaCBmYXN0ZXIgd2hlbiBmb3JtYXRzIGFyZQorICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZWQgaW4gdGhlIHNhbWUgb3JkZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKHB0ciA9PSBvdGhlcikKKyAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyKys7CisgICAgICAgICAgICAgICAgICAgIC8qIE9ubHkgdXNlIHRoZSB0cmljayBpZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSBtYXRjaGVzICovCisgICAgICAgICAgICAgICAgICAgIGlmIChwdHItPnNpemUgIT0gbmF0aXZlLT5zaXplKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIC8qIFNraXAgZmxvYXQgYW5kIGRvdWJsZSwgY291bGQgYmUKKyAgICAgICAgICAgICAgICAgICAgICAgInVua25vd24iIGZsb2F0IGZvcm1hdCAqLworICAgICAgICAgICAgICAgICAgICBpZiAocHRyLT5mb3JtYXQgPT0gJ2QnIHx8IHB0ci0+Zm9ybWF0ID09ICdmJykKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBwdHItPnBhY2sgPSBuYXRpdmUtPnBhY2s7CisgICAgICAgICAgICAgICAgICAgIHB0ci0+dW5wYWNrID0gbmF0aXZlLT51bnBhY2s7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwdHIrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5hdGl2ZSsrOworICAgICAgICB9CisgICAgfQogI2VuZGlmCiAKLQkvKiBBZGQgc29tZSBzeW1ib2xpYyBjb25zdGFudHMgdG8gdGhlIG1vZHVsZSAqLwotCWlmIChTdHJ1Y3RFcnJvciA9PSBOVUxMKSB7Ci0JCVN0cnVjdEVycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJzdHJ1Y3QuZXJyb3IiLCBOVUxMLCBOVUxMKTsKLQkJaWYgKFN0cnVjdEVycm9yID09IE5VTEwpCi0JCQlyZXR1cm47Ci0JfQorICAgIC8qIEFkZCBzb21lIHN5bWJvbGljIGNvbnN0YW50cyB0byB0aGUgbW9kdWxlICovCisgICAgaWYgKFN0cnVjdEVycm9yID09IE5VTEwpIHsKKyAgICAgICAgU3RydWN0RXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oInN0cnVjdC5lcnJvciIsIE5VTEwsIE5VTEwpOworICAgICAgICBpZiAoU3RydWN0RXJyb3IgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICB9CiAKLQlQeV9JTkNSRUYoU3RydWN0RXJyb3IpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiZXJyb3IiLCBTdHJ1Y3RFcnJvcik7CisgICAgUHlfSU5DUkVGKFN0cnVjdEVycm9yKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgImVycm9yIiwgU3RydWN0RXJyb3IpOwogCi0JUHlfSU5DUkVGKChQeU9iamVjdCopJlB5U3RydWN0VHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJTdHJ1Y3QiLCAoUHlPYmplY3QqKSZQeVN0cnVjdFR5cGUpOworICAgIFB5X0lOQ1JFRigoUHlPYmplY3QqKSZQeVN0cnVjdFR5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiU3RydWN0IiwgKFB5T2JqZWN0KikmUHlTdHJ1Y3RUeXBlKTsKIAotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiX192ZXJzaW9uX18iLCB2ZXIpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiX192ZXJzaW9uX18iLCB2ZXIpOwogCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIl9QWV9TVFJVQ1RfUkFOR0VfQ0hFQ0tJTkciLCAxKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiX1BZX1NUUlVDVF9SQU5HRV9DSEVDS0lORyIsIDEpOwogI2lmZGVmIFBZX1NUUlVDVF9PVkVSRkxPV19NQVNLSU5HCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIl9QWV9TVFJVQ1RfT1ZFUkZMT1dfTUFTS0lORyIsIDEpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJfUFlfU1RSVUNUX09WRVJGTE9XX01BU0tJTkciLCAxKTsKICNlbmRpZgogI2lmZGVmIFBZX1NUUlVDVF9GTE9BVF9DT0VSQ0UKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiX1BZX1NUUlVDVF9GTE9BVF9DT0VSQ0UiLCAxKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiX1BZX1NUUlVDVF9GTE9BVF9DT0VSQ0UiLCAxKTsKICNlbmRpZgogCiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL190ZXN0Y2FwaW1vZHVsZS5jIGIvTW9kdWxlcy9fdGVzdGNhcGltb2R1bGUuYwppbmRleCAwOTk2MTQ1Li5lZTVhZTQ4IDEwMDY0NAotLS0gYS9Nb2R1bGVzL190ZXN0Y2FwaW1vZHVsZS5jCisrKyBiL01vZHVsZXMvX3Rlc3RjYXBpbW9kdWxlLmMKQEAgLTEyLDIyICsxMiwyMiBAQAogI2lmZGVmIFdJVEhfVEhSRUFECiAjaW5jbHVkZSAicHl0aHJlYWQuaCIKICNlbmRpZiAvKiBXSVRIX1RIUkVBRCAqLwotc3RhdGljIFB5T2JqZWN0ICpUZXN0RXJyb3I7CS8qIHNldCB0byBleGNlcHRpb24gb2JqZWN0IGluIGluaXQgKi8KK3N0YXRpYyBQeU9iamVjdCAqVGVzdEVycm9yOyAgICAgLyogc2V0IHRvIGV4Y2VwdGlvbiBvYmplY3QgaW4gaW5pdCAqLwogCiAvKiBSYWlzZSBUZXN0RXJyb3Igd2l0aCB0ZXN0X25hbWUgKyAiOiAiICsgbXNnLCBhbmQgcmV0dXJuIE5VTEwuICovCiAKIHN0YXRpYyBQeU9iamVjdCAqCiByYWlzZVRlc3RFcnJvcihjb25zdCBjaGFyKiB0ZXN0X25hbWUsIGNvbnN0IGNoYXIqIG1zZykKIHsKLQljaGFyIGJ1ZlsyMDQ4XTsKKyAgICBjaGFyIGJ1ZlsyMDQ4XTsKIAotCWlmIChzdHJsZW4odGVzdF9uYW1lKSArIHN0cmxlbihtc2cpID4gc2l6ZW9mKGJ1ZikgLSA1MCkKLQkJUHlFcnJfU2V0U3RyaW5nKFRlc3RFcnJvciwgImludGVybmFsIGVycm9yIG1zZyB0b28gbGFyZ2UiKTsKLQllbHNlIHsKLQkJUHlPU19zbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJXM6ICVzIiwgdGVzdF9uYW1lLCBtc2cpOwotCQlQeUVycl9TZXRTdHJpbmcoVGVzdEVycm9yLCBidWYpOwotCX0KLQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoc3RybGVuKHRlc3RfbmFtZSkgKyBzdHJsZW4obXNnKSA+IHNpemVvZihidWYpIC0gNTApCisgICAgICAgIFB5RXJyX1NldFN0cmluZyhUZXN0RXJyb3IsICJpbnRlcm5hbCBlcnJvciBtc2cgdG9vIGxhcmdlIik7CisgICAgZWxzZSB7CisgICAgICAgIFB5T1Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiVzOiAlcyIsIHRlc3RfbmFtZSwgbXNnKTsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFRlc3RFcnJvciwgYnVmKTsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIC8qIFRlc3QgI2RlZmluZXMgZnJvbSBweWNvbmZpZy5oIChwYXJ0aWN1bGFybHkgdGhlIFNJWkVPRl8qIGRlZmluZXMpLgpAQCAtMzgsMTM4ICszOCwxMzggQEAKICovCiBzdGF0aWMgUHlPYmplY3QqCiBzaXplb2ZfZXJyb3IoY29uc3QgY2hhciogZmF0bmFtZSwgY29uc3QgY2hhciogdHlwbmFtZSwKLSAgICAgICAgaW50IGV4cGVjdGVkLCBpbnQgZ290KQorICAgIGludCBleHBlY3RlZCwgaW50IGdvdCkKIHsKLQljaGFyIGJ1ZlsxMDI0XTsKLQlQeU9TX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksCi0JCSIlLjIwMHMgI2RlZmluZSA9PSAlZCBidXQgc2l6ZW9mKCUuMjAwcykgPT0gJWQiLAotCQlmYXRuYW1lLCBleHBlY3RlZCwgdHlwbmFtZSwgZ290KTsKLQlQeUVycl9TZXRTdHJpbmcoVGVzdEVycm9yLCBidWYpOwotCXJldHVybiAoUHlPYmplY3QqKU5VTEw7CisgICAgY2hhciBidWZbMTAyNF07CisgICAgUHlPU19zbnByaW50ZihidWYsIHNpemVvZihidWYpLAorICAgICAgICAiJS4yMDBzICNkZWZpbmUgPT0gJWQgYnV0IHNpemVvZiglLjIwMHMpID09ICVkIiwKKyAgICAgICAgZmF0bmFtZSwgZXhwZWN0ZWQsIHR5cG5hbWUsIGdvdCk7CisgICAgUHlFcnJfU2V0U3RyaW5nKFRlc3RFcnJvciwgYnVmKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0KilOVUxMOwogfQogCiBzdGF0aWMgUHlPYmplY3QqCiB0ZXN0X2NvbmZpZyhQeU9iamVjdCAqc2VsZikKIHsKICNkZWZpbmUgQ0hFQ0tfU0laRU9GKEZBVE5BTUUsIFRZUEUpIFwKLQkgICAgaWYgKEZBVE5BTUUgIT0gc2l6ZW9mKFRZUEUpKSBcCi0gICAgCSAgICAJcmV0dXJuIHNpemVvZl9lcnJvcigjRkFUTkFNRSwgI1RZUEUsIEZBVE5BTUUsIHNpemVvZihUWVBFKSkKKyAgICAgICAgICAgIGlmIChGQVROQU1FICE9IHNpemVvZihUWVBFKSkgXAorICAgICAgICAgICAgICAgIHJldHVybiBzaXplb2ZfZXJyb3IoI0ZBVE5BTUUsICNUWVBFLCBGQVROQU1FLCBzaXplb2YoVFlQRSkpCiAKLQlDSEVDS19TSVpFT0YoU0laRU9GX1NIT1JULCBzaG9ydCk7Ci0JQ0hFQ0tfU0laRU9GKFNJWkVPRl9JTlQsIGludCk7Ci0JQ0hFQ0tfU0laRU9GKFNJWkVPRl9MT05HLCBsb25nKTsKLQlDSEVDS19TSVpFT0YoU0laRU9GX1ZPSURfUCwgdm9pZCopOwotCUNIRUNLX1NJWkVPRihTSVpFT0ZfVElNRV9ULCB0aW1lX3QpOworICAgIENIRUNLX1NJWkVPRihTSVpFT0ZfU0hPUlQsIHNob3J0KTsKKyAgICBDSEVDS19TSVpFT0YoU0laRU9GX0lOVCwgaW50KTsKKyAgICBDSEVDS19TSVpFT0YoU0laRU9GX0xPTkcsIGxvbmcpOworICAgIENIRUNLX1NJWkVPRihTSVpFT0ZfVk9JRF9QLCB2b2lkKik7CisgICAgQ0hFQ0tfU0laRU9GKFNJWkVPRl9USU1FX1QsIHRpbWVfdCk7CiAjaWZkZWYgSEFWRV9MT05HX0xPTkcKLQlDSEVDS19TSVpFT0YoU0laRU9GX0xPTkdfTE9ORywgUFlfTE9OR19MT05HKTsKKyAgICBDSEVDS19TSVpFT0YoU0laRU9GX0xPTkdfTE9ORywgUFlfTE9OR19MT05HKTsKICNlbmRpZgogCiAjdW5kZWYgQ0hFQ0tfU0laRU9GCiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QqCiB0ZXN0X2xpc3RfYXBpKFB5T2JqZWN0ICpzZWxmKQogewotCVB5T2JqZWN0KiBsaXN0OwotCWludCBpOworICAgIFB5T2JqZWN0KiBsaXN0OworICAgIGludCBpOwogCi0JLyogU0YgYnVnIDEzMjAwODogIFB5TGlzdF9SZXZlcnNlIHNlZ2ZhdWx0cyAqLworICAgIC8qIFNGIGJ1ZyAxMzIwMDg6ICBQeUxpc3RfUmV2ZXJzZSBzZWdmYXVsdHMgKi8KICNkZWZpbmUgTkxJU1QgMzAKLQlsaXN0ID0gUHlMaXN0X05ldyhOTElTVCk7Ci0JaWYgKGxpc3QgPT0gKFB5T2JqZWN0KilOVUxMKQotCQlyZXR1cm4gKFB5T2JqZWN0KilOVUxMOwotCS8qIGxpc3QgPSByYW5nZShOTElTVCkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgTkxJU1Q7ICsraSkgewotCQlQeU9iamVjdCogYW5pbnQgPSBQeUludF9Gcm9tTG9uZyhpKTsKLQkJaWYgKGFuaW50ID09IChQeU9iamVjdCopTlVMTCkgewotCQkJUHlfREVDUkVGKGxpc3QpOwotCQkJcmV0dXJuIChQeU9iamVjdCopTlVMTDsKLQkJfQotCQlQeUxpc3RfU0VUX0lURU0obGlzdCwgaSwgYW5pbnQpOwotCX0KLQkvKiBsaXN0LnJldmVyc2UoKSwgdmlhIFB5TGlzdF9SZXZlcnNlKCkgKi8KLQlpID0gUHlMaXN0X1JldmVyc2UobGlzdCk7ICAgLyogc2hvdWxkIG5vdCBibG93IHVwISAqLwotCWlmIChpICE9IDApIHsKLQkJUHlfREVDUkVGKGxpc3QpOwotCQlyZXR1cm4gKFB5T2JqZWN0KilOVUxMOwotCX0KLQkvKiBDaGVjayB0aGF0IGxpc3QgPT0gcmFuZ2UoMjksIC0xLCAtMSkgbm93ICovCi0JZm9yIChpID0gMDsgaSA8IE5MSVNUOyArK2kpIHsKLQkJUHlPYmplY3QqIGFuaW50ID0gUHlMaXN0X0dFVF9JVEVNKGxpc3QsIGkpOwotCQlpZiAoUHlJbnRfQVNfTE9ORyhhbmludCkgIT0gTkxJU1QtMS1pKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoVGVzdEVycm9yLAotCQkJICAgICAgICAgICAgICAgICJ0ZXN0X2xpc3RfYXBpOiByZXZlcnNlIHNjcmV3ZWQgdXAiKTsKLQkJCVB5X0RFQ1JFRihsaXN0KTsKLQkJCXJldHVybiAoUHlPYmplY3QqKU5VTEw7Ci0JCX0KLQl9Ci0JUHlfREVDUkVGKGxpc3QpOworICAgIGxpc3QgPSBQeUxpc3RfTmV3KE5MSVNUKTsKKyAgICBpZiAobGlzdCA9PSAoUHlPYmplY3QqKU5VTEwpCisgICAgICAgIHJldHVybiAoUHlPYmplY3QqKU5VTEw7CisgICAgLyogbGlzdCA9IHJhbmdlKE5MSVNUKSAqLworICAgIGZvciAoaSA9IDA7IGkgPCBOTElTVDsgKytpKSB7CisgICAgICAgIFB5T2JqZWN0KiBhbmludCA9IFB5SW50X0Zyb21Mb25nKGkpOworICAgICAgICBpZiAoYW5pbnQgPT0gKFB5T2JqZWN0KilOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYobGlzdCk7CisgICAgICAgICAgICByZXR1cm4gKFB5T2JqZWN0KilOVUxMOworICAgICAgICB9CisgICAgICAgIFB5TGlzdF9TRVRfSVRFTShsaXN0LCBpLCBhbmludCk7CisgICAgfQorICAgIC8qIGxpc3QucmV2ZXJzZSgpLCB2aWEgUHlMaXN0X1JldmVyc2UoKSAqLworICAgIGkgPSBQeUxpc3RfUmV2ZXJzZShsaXN0KTsgICAvKiBzaG91bGQgbm90IGJsb3cgdXAhICovCisgICAgaWYgKGkgIT0gMCkgeworICAgICAgICBQeV9ERUNSRUYobGlzdCk7CisgICAgICAgIHJldHVybiAoUHlPYmplY3QqKU5VTEw7CisgICAgfQorICAgIC8qIENoZWNrIHRoYXQgbGlzdCA9PSByYW5nZSgyOSwgLTEsIC0xKSBub3cgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgTkxJU1Q7ICsraSkgeworICAgICAgICBQeU9iamVjdCogYW5pbnQgPSBQeUxpc3RfR0VUX0lURU0obGlzdCwgaSk7CisgICAgICAgIGlmIChQeUludF9BU19MT05HKGFuaW50KSAhPSBOTElTVC0xLWkpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhUZXN0RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRlc3RfbGlzdF9hcGk6IHJldmVyc2Ugc2NyZXdlZCB1cCIpOworICAgICAgICAgICAgUHlfREVDUkVGKGxpc3QpOworICAgICAgICAgICAgcmV0dXJuIChQeU9iamVjdCopTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgICBQeV9ERUNSRUYobGlzdCk7CiAjdW5kZWYgTkxJU1QKIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBpbnQKIHRlc3RfZGljdF9pbm5lcihpbnQgY291bnQpCiB7Ci0JUHlfc3NpemVfdCBwb3MgPSAwLCBpdGVyYXRpb25zID0gMDsKLQlpbnQgaTsKLQlQeU9iamVjdCAqZGljdCA9IFB5RGljdF9OZXcoKTsKLQlQeU9iamVjdCAqdiwgKms7CisgICAgUHlfc3NpemVfdCBwb3MgPSAwLCBpdGVyYXRpb25zID0gMDsKKyAgICBpbnQgaTsKKyAgICBQeU9iamVjdCAqZGljdCA9IFB5RGljdF9OZXcoKTsKKyAgICBQeU9iamVjdCAqdiwgKms7CiAKLQlpZiAoZGljdCA9PSBOVUxMKQotCQlyZXR1cm4gLTE7CisgICAgaWYgKGRpY3QgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0JZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJdiA9IFB5SW50X0Zyb21Mb25nKGkpOwotCQlQeURpY3RfU2V0SXRlbShkaWN0LCB2LCB2KTsKLQkJUHlfREVDUkVGKHYpOwotCX0KKyAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICB2ID0gUHlJbnRfRnJvbUxvbmcoaSk7CisgICAgICAgIFB5RGljdF9TZXRJdGVtKGRpY3QsIHYsIHYpOworICAgICAgICBQeV9ERUNSRUYodik7CisgICAgfQogCi0Jd2hpbGUgKFB5RGljdF9OZXh0KGRpY3QsICZwb3MsICZrLCAmdikpIHsKLQkJUHlPYmplY3QgKm87Ci0JCWl0ZXJhdGlvbnMrKzsKKyAgICB3aGlsZSAoUHlEaWN0X05leHQoZGljdCwgJnBvcywgJmssICZ2KSkgeworICAgICAgICBQeU9iamVjdCAqbzsKKyAgICAgICAgaXRlcmF0aW9ucysrOwogCi0JCWkgPSBQeUludF9BU19MT05HKHYpICsgMTsKLQkJbyA9IFB5SW50X0Zyb21Mb25nKGkpOwotCQlpZiAobyA9PSBOVUxMKQotCQkJcmV0dXJuIC0xOwotCQlpZiAoUHlEaWN0X1NldEl0ZW0oZGljdCwgaywgbykgPCAwKSB7Ci0JCQlQeV9ERUNSRUYobyk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJUHlfREVDUkVGKG8pOwotCX0KKyAgICAgICAgaSA9IFB5SW50X0FTX0xPTkcodikgKyAxOworICAgICAgICBvID0gUHlJbnRfRnJvbUxvbmcoaSk7CisgICAgICAgIGlmIChvID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbShkaWN0LCBrLCBvKSA8IDApIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihvKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBQeV9ERUNSRUYobyk7CisgICAgfQogCi0JUHlfREVDUkVGKGRpY3QpOworICAgIFB5X0RFQ1JFRihkaWN0KTsKIAotCWlmIChpdGVyYXRpb25zICE9IGNvdW50KSB7Ci0JCVB5RXJyX1NldFN0cmluZygKLQkJCVRlc3RFcnJvciwKLQkJCSJ0ZXN0X2RpY3RfaXRlcmF0aW9uOiBkaWN0IGl0ZXJhdGlvbiB3ZW50IHdyb25nICIpOwotCQlyZXR1cm4gLTE7Ci0JfSBlbHNlIHsKLQkJcmV0dXJuIDA7Ci0JfQorICAgIGlmIChpdGVyYXRpb25zICE9IGNvdW50KSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZygKKyAgICAgICAgICAgIFRlc3RFcnJvciwKKyAgICAgICAgICAgICJ0ZXN0X2RpY3RfaXRlcmF0aW9uOiBkaWN0IGl0ZXJhdGlvbiB3ZW50IHdyb25nICIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogfQogCiBzdGF0aWMgUHlPYmplY3QqCiB0ZXN0X2RpY3RfaXRlcmF0aW9uKFB5T2JqZWN0KiBzZWxmKQogewotCWludCBpOworICAgIGludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IDIwMDsgaSsrKSB7Ci0JCWlmICh0ZXN0X2RpY3RfaW5uZXIoaSkgPCAwKSB7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KKyAgICBmb3IgKGkgPSAwOyBpIDwgMjAwOyBpKyspIHsKKyAgICAgICAgaWYgKHRlc3RfZGljdF9pbm5lcihpKSA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogCkBAIC0xNzcsMTA4ICsxNzcsMTA4IEBACiAgKiAgIFB5VHlwZV9SZWFkeSBpZiBpdCBoYXNuJ3QgYWxyZWFkeSBiZWVuIGNhbGxlZAogICovCiBzdGF0aWMgUHlUeXBlT2JqZWN0IF9IYXNoSW5oZXJpdGFuY2VUZXN0ZXJfVHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKLQkwLAkJCS8qIE51bWJlciBvZiBpdGVtcyBmb3IgdmFyb2JqZWN0ICovCi0JImhhc2hpbmhlcml0YW5jZXRlc3RlciIsCS8qIE5hbWUgb2YgdGhpcyB0eXBlICovCi0Jc2l6ZW9mKFB5T2JqZWN0KSwJLyogQmFzaWMgb2JqZWN0IHNpemUgKi8KLQkwLAkJCS8qIEl0ZW0gc2l6ZSBmb3IgdmFyb2JqZWN0ICovCi0JKGRlc3RydWN0b3IpUHlPYmplY3RfRGVsLCAvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJLyogdHBfY29tcGFyZSAqLwotCTAsCQkJLyogdHBfcmVwciAqLwotCTAsCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJLyogdHBfY2FsbCAqLwotCTAsCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCwJLyogdHBfZmxhZ3MgKi8KLQkwLAkJCS8qIHRwX2RvYyAqLwotCTAsCQkJLyogdHBfdHJhdmVyc2UgKi8KLQkwLAkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQkwLAkJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCS8qIHRwX2l0ZXJuZXh0ICovCi0JMCwJCQkvKiB0cF9tZXRob2RzICovCi0JMCwJCQkvKiB0cF9tZW1iZXJzICovCi0JMCwJCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCS8qIHRwX2RpY3QgKi8KLQkwLAkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCi0JMCwJCQkvKiB0cF9pbml0ICovCi0JMCwJCQkvKiB0cF9hbGxvYyAqLwotCVB5VHlwZV9HZW5lcmljTmV3LAkJLyogdHBfbmV3ICovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBpdGVtcyBmb3IgdmFyb2JqZWN0ICovCisgICAgImhhc2hpbmhlcml0YW5jZXRlc3RlciIsICAgICAgICAgICAgLyogTmFtZSBvZiB0aGlzIHR5cGUgKi8KKyAgICBzaXplb2YoUHlPYmplY3QpLCAgICAgICAgICAgLyogQmFzaWMgb2JqZWN0IHNpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSXRlbSBzaXplIGZvciB2YXJvYmplY3QgKi8KKyAgICAoZGVzdHJ1Y3RvcilQeU9iamVjdF9EZWwsIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQsICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBQeVR5cGVfR2VuZXJpY05ldywgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KIH07CiAKIHN0YXRpYyBQeU9iamVjdCoKIHRlc3RfbGF6eV9oYXNoX2luaGVyaXRhbmNlKFB5T2JqZWN0KiBzZWxmKQogewotCVB5VHlwZU9iamVjdCAqdHlwZTsKLQlQeU9iamVjdCAqb2JqOwotCWxvbmcgaGFzaDsKKyAgICBQeVR5cGVPYmplY3QgKnR5cGU7CisgICAgUHlPYmplY3QgKm9iajsKKyAgICBsb25nIGhhc2g7CiAKLQl0eXBlID0gJl9IYXNoSW5oZXJpdGFuY2VUZXN0ZXJfVHlwZTsKKyAgICB0eXBlID0gJl9IYXNoSW5oZXJpdGFuY2VUZXN0ZXJfVHlwZTsKIAotCWlmICh0eXBlLT50cF9kaWN0ICE9IE5VTEwpCi0JCS8qIFRoZSB0eXBlIGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQuIFRoaXMgcHJvYmFibHkgbWVhbnMKLQkJICAgLVIgaXMgYmVpbmcgdXNlZC4gKi8KLQkJUHlfUkVUVVJOX05PTkU7CisgICAgaWYgKHR5cGUtPnRwX2RpY3QgIT0gTlVMTCkKKyAgICAgICAgLyogVGhlIHR5cGUgaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZC4gVGhpcyBwcm9iYWJseSBtZWFucworICAgICAgICAgICAtUiBpcyBiZWluZyB1c2VkLiAqLworICAgICAgICBQeV9SRVRVUk5fTk9ORTsKIAogCi0Jb2JqID0gUHlPYmplY3RfTmV3KFB5T2JqZWN0LCB0eXBlKTsKLQlpZiAob2JqID09IE5VTEwpIHsKLQkJUHlFcnJfQ2xlYXIoKTsKLQkJUHlFcnJfU2V0U3RyaW5nKAotCQkJVGVzdEVycm9yLAotCQkJInRlc3RfbGF6eV9oYXNoX2luaGVyaXRhbmNlOiBmYWlsZWQgdG8gY3JlYXRlIG9iamVjdCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgb2JqID0gUHlPYmplY3RfTmV3KFB5T2JqZWN0LCB0eXBlKTsKKyAgICBpZiAob2JqID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKAorICAgICAgICAgICAgVGVzdEVycm9yLAorICAgICAgICAgICAgInRlc3RfbGF6eV9oYXNoX2luaGVyaXRhbmNlOiBmYWlsZWQgdG8gY3JlYXRlIG9iamVjdCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlpZiAodHlwZS0+dHBfZGljdCAhPSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZygKLQkJCVRlc3RFcnJvciwKLQkJCSJ0ZXN0X2xhenlfaGFzaF9pbmhlcml0YW5jZTogdHlwZSBpbml0aWFsaXNlZCB0b28gc29vbiIpOwotCQlQeV9ERUNSRUYob2JqKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICh0eXBlLT50cF9kaWN0ICE9IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKAorICAgICAgICAgICAgVGVzdEVycm9yLAorICAgICAgICAgICAgInRlc3RfbGF6eV9oYXNoX2luaGVyaXRhbmNlOiB0eXBlIGluaXRpYWxpc2VkIHRvbyBzb29uIik7CisgICAgICAgIFB5X0RFQ1JFRihvYmopOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQloYXNoID0gUHlPYmplY3RfSGFzaChvYmopOwotCWlmICgoaGFzaCA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewotCQlQeUVycl9DbGVhcigpOwotCQlQeUVycl9TZXRTdHJpbmcoCi0JCQlUZXN0RXJyb3IsCi0JCQkidGVzdF9sYXp5X2hhc2hfaW5oZXJpdGFuY2U6IGNvdWxkIG5vdCBoYXNoIG9iamVjdCIpOwotCQlQeV9ERUNSRUYob2JqKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGhhc2ggPSBQeU9iamVjdF9IYXNoKG9iaik7CisgICAgaWYgKChoYXNoID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIFB5RXJyX1NldFN0cmluZygKKyAgICAgICAgICAgIFRlc3RFcnJvciwKKyAgICAgICAgICAgICJ0ZXN0X2xhenlfaGFzaF9pbmhlcml0YW5jZTogY291bGQgbm90IGhhc2ggb2JqZWN0Iik7CisgICAgICAgIFB5X0RFQ1JFRihvYmopOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlpZiAodHlwZS0+dHBfZGljdCA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZygKLQkJCVRlc3RFcnJvciwKLQkJCSJ0ZXN0X2xhenlfaGFzaF9pbmhlcml0YW5jZTogdHlwZSBub3QgaW5pdGlhbGlzZWQgYnkgaGFzaCgpIik7Ci0JCVB5X0RFQ1JFRihvYmopOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKHR5cGUtPnRwX2RpY3QgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoCisgICAgICAgICAgICBUZXN0RXJyb3IsCisgICAgICAgICAgICAidGVzdF9sYXp5X2hhc2hfaW5oZXJpdGFuY2U6IHR5cGUgbm90IGluaXRpYWxpc2VkIGJ5IGhhc2goKSIpOworICAgICAgICBQeV9ERUNSRUYob2JqKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaWYgKHR5cGUtPnRwX2hhc2ggIT0gUHlUeXBlX1R5cGUudHBfaGFzaCkgewotCQlQeUVycl9TZXRTdHJpbmcoCi0JCQlUZXN0RXJyb3IsCi0JCQkidGVzdF9sYXp5X2hhc2hfaW5oZXJpdGFuY2U6IHVuZXhwZWN0ZWQgaGFzaCBmdW5jdGlvbiIpOwotCQlQeV9ERUNSRUYob2JqKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICh0eXBlLT50cF9oYXNoICE9IFB5VHlwZV9UeXBlLnRwX2hhc2gpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKAorICAgICAgICAgICAgVGVzdEVycm9yLAorICAgICAgICAgICAgInRlc3RfbGF6eV9oYXNoX2luaGVyaXRhbmNlOiB1bmV4cGVjdGVkIGhhc2ggZnVuY3Rpb24iKTsKKyAgICAgICAgUHlfREVDUkVGKG9iaik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCVB5X0RFQ1JFRihvYmopOworICAgIFB5X0RFQ1JFRihvYmopOwogCi0JUHlfUkVUVVJOX05PTkU7CisgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKIApAQCAtMzAyLDIyICszMDIsMjIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiByYWlzZV90ZXN0X2xvbmdfZXJyb3IoY29uc3QgY2hhciogbXNnKQogewotCXJldHVybiByYWlzZVRlc3RFcnJvcigidGVzdF9sb25nX2FwaSIsIG1zZyk7CisgICAgcmV0dXJuIHJhaXNlVGVzdEVycm9yKCJ0ZXN0X2xvbmdfYXBpIiwgbXNnKTsKIH0KIAotI2RlZmluZSBURVNUTkFNRQl0ZXN0X2xvbmdfYXBpX2lubmVyCi0jZGVmaW5lIFRZUEVOQU1FCWxvbmcKLSNkZWZpbmUgRl9TX1RPX1BZCVB5TG9uZ19Gcm9tTG9uZwotI2RlZmluZSBGX1BZX1RPX1MJUHlMb25nX0FzTG9uZwotI2RlZmluZSBGX1VfVE9fUFkJUHlMb25nX0Zyb21VbnNpZ25lZExvbmcKLSNkZWZpbmUgRl9QWV9UT19VCVB5TG9uZ19Bc1Vuc2lnbmVkTG9uZworI2RlZmluZSBURVNUTkFNRSAgICAgICAgdGVzdF9sb25nX2FwaV9pbm5lcgorI2RlZmluZSBUWVBFTkFNRSAgICAgICAgbG9uZworI2RlZmluZSBGX1NfVE9fUFkgICAgICAgUHlMb25nX0Zyb21Mb25nCisjZGVmaW5lIEZfUFlfVE9fUyAgICAgICBQeUxvbmdfQXNMb25nCisjZGVmaW5lIEZfVV9UT19QWSAgICAgICBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZworI2RlZmluZSBGX1BZX1RPX1UgICAgICAgUHlMb25nX0FzVW5zaWduZWRMb25nCiAKICNpbmNsdWRlICJ0ZXN0Y2FwaV9sb25nLmgiCiAKIHN0YXRpYyBQeU9iamVjdCAqCiB0ZXN0X2xvbmdfYXBpKFB5T2JqZWN0KiBzZWxmKQogewotCXJldHVybiBURVNUTkFNRShyYWlzZV90ZXN0X2xvbmdfZXJyb3IpOworICAgIHJldHVybiBURVNUTkFNRShyYWlzZV90ZXN0X2xvbmdfZXJyb3IpOwogfQogCiAjdW5kZWYgVEVTVE5BTUUKQEAgLTMzMiwyMiArMzMyLDIyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogcmFpc2VfdGVzdF9sb25nbG9uZ19lcnJvcihjb25zdCBjaGFyKiBtc2cpCiB7Ci0JcmV0dXJuIHJhaXNlVGVzdEVycm9yKCJ0ZXN0X2xvbmdsb25nX2FwaSIsIG1zZyk7CisgICAgcmV0dXJuIHJhaXNlVGVzdEVycm9yKCJ0ZXN0X2xvbmdsb25nX2FwaSIsIG1zZyk7CiB9CiAKLSNkZWZpbmUgVEVTVE5BTUUJdGVzdF9sb25nbG9uZ19hcGlfaW5uZXIKLSNkZWZpbmUgVFlQRU5BTUUJUFlfTE9OR19MT05HCi0jZGVmaW5lIEZfU19UT19QWQlQeUxvbmdfRnJvbUxvbmdMb25nCi0jZGVmaW5lIEZfUFlfVE9fUwlQeUxvbmdfQXNMb25nTG9uZwotI2RlZmluZSBGX1VfVE9fUFkJUHlMb25nX0Zyb21VbnNpZ25lZExvbmdMb25nCi0jZGVmaW5lIEZfUFlfVE9fVQlQeUxvbmdfQXNVbnNpZ25lZExvbmdMb25nCisjZGVmaW5lIFRFU1ROQU1FICAgICAgICB0ZXN0X2xvbmdsb25nX2FwaV9pbm5lcgorI2RlZmluZSBUWVBFTkFNRSAgICAgICAgUFlfTE9OR19MT05HCisjZGVmaW5lIEZfU19UT19QWSAgICAgICBQeUxvbmdfRnJvbUxvbmdMb25nCisjZGVmaW5lIEZfUFlfVE9fUyAgICAgICBQeUxvbmdfQXNMb25nTG9uZworI2RlZmluZSBGX1VfVE9fUFkgICAgICAgUHlMb25nX0Zyb21VbnNpZ25lZExvbmdMb25nCisjZGVmaW5lIEZfUFlfVE9fVSAgICAgICBQeUxvbmdfQXNVbnNpZ25lZExvbmdMb25nCiAKICNpbmNsdWRlICJ0ZXN0Y2FwaV9sb25nLmgiCiAKIHN0YXRpYyBQeU9iamVjdCAqCiB0ZXN0X2xvbmdsb25nX2FwaShQeU9iamVjdCogc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIFRFU1ROQU1FKHJhaXNlX3Rlc3RfbG9uZ2xvbmdfZXJyb3IpOworICAgIHJldHVybiBURVNUTkFNRShyYWlzZV90ZXN0X2xvbmdsb25nX2Vycm9yKTsKIH0KIAogI3VuZGVmIFRFU1ROQU1FCkBAIC0zNjQsNzEgKzM2NCw3MSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHRlc3RfTF9jb2RlKFB5T2JqZWN0ICpzZWxmKQogewotCVB5T2JqZWN0ICp0dXBsZSwgKm51bTsKLQlQWV9MT05HX0xPTkcgdmFsdWU7CisgICAgUHlPYmplY3QgKnR1cGxlLCAqbnVtOworICAgIFBZX0xPTkdfTE9ORyB2YWx1ZTsKIAotICAgICAgICB0dXBsZSA9IFB5VHVwbGVfTmV3KDEpOwotICAgICAgICBpZiAodHVwbGUgPT0gTlVMTCkKLSAgICAgICAgCXJldHVybiBOVUxMOworICAgIHR1cGxlID0gUHlUdXBsZV9OZXcoMSk7CisgICAgaWYgKHR1cGxlID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0gICAgICAgIG51bSA9IFB5TG9uZ19Gcm9tTG9uZyg0Mik7Ci0gICAgICAgIGlmIChudW0gPT0gTlVMTCkKLSAgICAgICAgCXJldHVybiBOVUxMOworICAgIG51bSA9IFB5TG9uZ19Gcm9tTG9uZyg0Mik7CisgICAgaWYgKG51bSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKHR1cGxlLCAwLCBudW0pOworICAgIFB5VHVwbGVfU0VUX0lURU0odHVwbGUsIDAsIG51bSk7CiAKLSAgICAgICAgdmFsdWUgPSAtMTsKLSAgICAgICAgaWYgKFB5QXJnX1BhcnNlVHVwbGUodHVwbGUsICJMOnRlc3RfTF9jb2RlIiwgJnZhbHVlKSA8IDApCi0gICAgICAgIAlyZXR1cm4gTlVMTDsKLSAgICAgICAgaWYgKHZhbHVlICE9IDQyKQotICAgICAgICAJcmV0dXJuIHJhaXNlVGVzdEVycm9yKCJ0ZXN0X0xfY29kZSIsCi0JCQkiTCBjb2RlIHJldHVybmVkIHdyb25nIHZhbHVlIGZvciBsb25nIDQyIik7CisgICAgdmFsdWUgPSAtMTsKKyAgICBpZiAoUHlBcmdfUGFyc2VUdXBsZSh0dXBsZSwgIkw6dGVzdF9MX2NvZGUiLCAmdmFsdWUpIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKHZhbHVlICE9IDQyKQorICAgICAgICByZXR1cm4gcmFpc2VUZXN0RXJyb3IoInRlc3RfTF9jb2RlIiwKKyAgICAgICAgICAgICJMIGNvZGUgcmV0dXJuZWQgd3JvbmcgdmFsdWUgZm9yIGxvbmcgNDIiKTsKIAotCVB5X0RFQ1JFRihudW0pOwotICAgICAgICBudW0gPSBQeUludF9Gcm9tTG9uZyg0Mik7Ci0gICAgICAgIGlmIChudW0gPT0gTlVMTCkKLSAgICAgICAgCXJldHVybiBOVUxMOworICAgIFB5X0RFQ1JFRihudW0pOworICAgIG51bSA9IFB5SW50X0Zyb21Mb25nKDQyKTsKKyAgICBpZiAobnVtID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0gICAgICAgIFB5VHVwbGVfU0VUX0lURU0odHVwbGUsIDAsIG51bSk7CisgICAgUHlUdXBsZV9TRVRfSVRFTSh0dXBsZSwgMCwgbnVtKTsKIAotCXZhbHVlID0gLTE7Ci0gICAgICAgIGlmIChQeUFyZ19QYXJzZVR1cGxlKHR1cGxlLCAiTDp0ZXN0X0xfY29kZSIsICZ2YWx1ZSkgPCAwKQotICAgICAgICAJcmV0dXJuIE5VTEw7Ci0gICAgICAgIGlmICh2YWx1ZSAhPSA0MikKLSAgICAgICAgCXJldHVybiByYWlzZVRlc3RFcnJvcigidGVzdF9MX2NvZGUiLAotCQkJIkwgY29kZSByZXR1cm5lZCB3cm9uZyB2YWx1ZSBmb3IgaW50IDQyIik7CisgICAgdmFsdWUgPSAtMTsKKyAgICBpZiAoUHlBcmdfUGFyc2VUdXBsZSh0dXBsZSwgIkw6dGVzdF9MX2NvZGUiLCAmdmFsdWUpIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKHZhbHVlICE9IDQyKQorICAgICAgICByZXR1cm4gcmFpc2VUZXN0RXJyb3IoInRlc3RfTF9jb2RlIiwKKyAgICAgICAgICAgICJMIGNvZGUgcmV0dXJuZWQgd3JvbmcgdmFsdWUgZm9yIGludCA0MiIpOwogCi0JUHlfREVDUkVGKHR1cGxlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfREVDUkVGKHR1cGxlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKLSNlbmRpZgkvKiBpZmRlZiBIQVZFX0xPTkdfTE9ORyAqLworI2VuZGlmICAvKiBpZmRlZiBIQVZFX0xPTkdfTE9ORyAqLwogCiAvKiBUZXN0IHR1cGxlIGFyZ3VtZW50IHByb2Nlc3NpbmcgKi8KIHN0YXRpYyBQeU9iamVjdCAqCiBnZXRhcmdzX3R1cGxlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgYSwgYiwgYzsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImkoaWkpIiwgJmEsICZiLCAmYykpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJpaWkiLCBhLCBiLCBjKTsKKyAgICBpbnQgYSwgYiwgYzsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImkoaWkpIiwgJmEsICZiLCAmYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJpaWkiLCBhLCBiLCBjKTsKIH0KIAogLyogdGVzdCBQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMgKi8KIHN0YXRpYyBQeU9iamVjdCAqZ2V0YXJnc19rZXl3b3JkcyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7Ci0Jc3RhdGljIGNoYXIgKmtleXdvcmRzW10gPSB7ImFyZzEiLCJhcmcyIiwiYXJnMyIsImFyZzQiLCJhcmc1IiwgTlVMTH07Ci0Jc3RhdGljIGNoYXIgKmZtdD0iKGlpKWl8KGkoaWkpKShpaWkpaSI7Ci0JaW50IGludF9hcmdzWzEwXT17LTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTF9OworICAgIHN0YXRpYyBjaGFyICprZXl3b3Jkc1tdID0geyJhcmcxIiwiYXJnMiIsImFyZzMiLCJhcmc0IiwiYXJnNSIsIE5VTEx9OworICAgIHN0YXRpYyBjaGFyICpmbXQ9IihpaSlpfChpKGlpKSkoaWlpKWkiOworICAgIGludCBpbnRfYXJnc1sxMF09ey0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xfTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgZm10LCBrZXl3b3JkcywKLQkJJmludF9hcmdzWzBdLCAmaW50X2FyZ3NbMV0sICZpbnRfYXJnc1syXSwgJmludF9hcmdzWzNdLCAmaW50X2FyZ3NbNF0sCi0JCSZpbnRfYXJnc1s1XSwgJmludF9hcmdzWzZdLCAmaW50X2FyZ3NbN10sICZpbnRfYXJnc1s4XSwgJmludF9hcmdzWzldKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImlpaWlpaWlpaWkiLAotCQlpbnRfYXJnc1swXSwgaW50X2FyZ3NbMV0sIGludF9hcmdzWzJdLCBpbnRfYXJnc1szXSwgaW50X2FyZ3NbNF0sCi0JCWludF9hcmdzWzVdLCBpbnRfYXJnc1s2XSwgaW50X2FyZ3NbN10sIGludF9hcmdzWzhdLCBpbnRfYXJnc1s5XSk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCBmbXQsIGtleXdvcmRzLAorICAgICAgICAmaW50X2FyZ3NbMF0sICZpbnRfYXJnc1sxXSwgJmludF9hcmdzWzJdLCAmaW50X2FyZ3NbM10sICZpbnRfYXJnc1s0XSwKKyAgICAgICAgJmludF9hcmdzWzVdLCAmaW50X2FyZ3NbNl0sICZpbnRfYXJnc1s3XSwgJmludF9hcmdzWzhdLCAmaW50X2FyZ3NbOV0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaWlpaWlpaWlpaSIsCisgICAgICAgIGludF9hcmdzWzBdLCBpbnRfYXJnc1sxXSwgaW50X2FyZ3NbMl0sIGludF9hcmdzWzNdLCBpbnRfYXJnc1s0XSwKKyAgICAgICAgaW50X2FyZ3NbNV0sIGludF9hcmdzWzZdLCBpbnRfYXJnc1s3XSwgaW50X2FyZ3NbOF0sIGludF9hcmdzWzldKTsKIH0KIAogLyogRnVuY3Rpb25zIHRvIGNhbGwgUHlBcmdfUGFyc2VUdXBsZSB3aXRoIGludGVnZXIgZm9ybWF0IGNvZGVzLApAQCAtNDM3LDkyICs0MzcsOTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZXRhcmdzX2IoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXVuc2lnbmVkIGNoYXIgdmFsdWU7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJiIiwgJnZhbHVlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKCh1bnNpZ25lZCBsb25nKXZhbHVlKTsKKyAgICB1bnNpZ25lZCBjaGFyIHZhbHVlOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiYiIsICZ2YWx1ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZygodW5zaWduZWQgbG9uZyl2YWx1ZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZXRhcmdzX0IoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXVuc2lnbmVkIGNoYXIgdmFsdWU7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJCIiwgJnZhbHVlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKCh1bnNpZ25lZCBsb25nKXZhbHVlKTsKKyAgICB1bnNpZ25lZCBjaGFyIHZhbHVlOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiQiIsICZ2YWx1ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZygodW5zaWduZWQgbG9uZyl2YWx1ZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZXRhcmdzX0goUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXVuc2lnbmVkIHNob3J0IHZhbHVlOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiSCIsICZ2YWx1ZSkpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZygodW5zaWduZWQgbG9uZyl2YWx1ZSk7CisgICAgdW5zaWduZWQgc2hvcnQgdmFsdWU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJIIiwgJnZhbHVlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKCh1bnNpZ25lZCBsb25nKXZhbHVlKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGdldGFyZ3NfSShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JdW5zaWduZWQgaW50IHZhbHVlOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiSSIsICZ2YWx1ZSkpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZygodW5zaWduZWQgbG9uZyl2YWx1ZSk7CisgICAgdW5zaWduZWQgaW50IHZhbHVlOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiSSIsICZ2YWx1ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZygodW5zaWduZWQgbG9uZyl2YWx1ZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZXRhcmdzX2soUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXVuc2lnbmVkIGxvbmcgdmFsdWU7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJrIiwgJnZhbHVlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKHZhbHVlKTsKKyAgICB1bnNpZ25lZCBsb25nIHZhbHVlOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiayIsICZ2YWx1ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZyh2YWx1ZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZXRhcmdzX2koUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCB2YWx1ZTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImkiLCAmdmFsdWUpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gUHlMb25nX0Zyb21Mb25nKChsb25nKXZhbHVlKTsKKyAgICBpbnQgdmFsdWU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpIiwgJnZhbHVlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZygobG9uZyl2YWx1ZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZXRhcmdzX2woUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgdmFsdWU7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsIiwgJnZhbHVlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZyh2YWx1ZSk7CisgICAgbG9uZyB2YWx1ZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImwiLCAmdmFsdWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gUHlMb25nX0Zyb21Mb25nKHZhbHVlKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGdldGFyZ3NfbihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlfc3NpemVfdCB2YWx1ZTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIm4iLCAmdmFsdWUpKQotCXJldHVybiBOVUxMOwotCXJldHVybiBQeUludF9Gcm9tU3NpemVfdCh2YWx1ZSk7CisgICAgUHlfc3NpemVfdCB2YWx1ZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIm4iLCAmdmFsdWUpKQorICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeUludF9Gcm9tU3NpemVfdCh2YWx1ZSk7CiB9CiAKICNpZmRlZiBIQVZFX0xPTkdfTE9ORwogc3RhdGljIFB5T2JqZWN0ICoKIGdldGFyZ3NfTChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUFlfTE9OR19MT05HIHZhbHVlOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTCIsICZ2YWx1ZSkpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBQeUxvbmdfRnJvbUxvbmdMb25nKHZhbHVlKTsKKyAgICBQWV9MT05HX0xPTkcgdmFsdWU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJMIiwgJnZhbHVlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZ0xvbmcodmFsdWUpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZ2V0YXJnc19LKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQl1bnNpZ25lZCBQWV9MT05HX0xPTkcgdmFsdWU7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJLIiwgJnZhbHVlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nTG9uZyh2YWx1ZSk7CisgICAgdW5zaWduZWQgUFlfTE9OR19MT05HIHZhbHVlOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiSyIsICZ2YWx1ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZ0xvbmcodmFsdWUpOwogfQogI2VuZGlmCiAKQEAgLTUzMSw1NCArNTMxLDU0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogdGVzdF9rX2NvZGUoUHlPYmplY3QgKnNlbGYpCiB7Ci0JUHlPYmplY3QgKnR1cGxlLCAqbnVtOwotCXVuc2lnbmVkIGxvbmcgdmFsdWU7CisgICAgUHlPYmplY3QgKnR1cGxlLCAqbnVtOworICAgIHVuc2lnbmVkIGxvbmcgdmFsdWU7CiAKLSAgICAgICAgdHVwbGUgPSBQeVR1cGxlX05ldygxKTsKLSAgICAgICAgaWYgKHR1cGxlID09IE5VTEwpCi0gICAgICAgIAlyZXR1cm4gTlVMTDsKKyAgICB0dXBsZSA9IFB5VHVwbGVfTmV3KDEpOworICAgIGlmICh0dXBsZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCS8qIGEgbnVtYmVyIGxhcmdlciB0aGFuIFVMT05HX01BWCBldmVuIG9uIDY0LWJpdCBwbGF0Zm9ybXMgKi8KLSAgICAgICAgbnVtID0gUHlMb25nX0Zyb21TdHJpbmcoIkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRiIsIE5VTEwsIDE2KTsKLSAgICAgICAgaWYgKG51bSA9PSBOVUxMKQotICAgICAgICAJcmV0dXJuIE5VTEw7CisgICAgLyogYSBudW1iZXIgbGFyZ2VyIHRoYW4gVUxPTkdfTUFYIGV2ZW4gb24gNjQtYml0IHBsYXRmb3JtcyAqLworICAgIG51bSA9IFB5TG9uZ19Gcm9tU3RyaW5nKCJGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkYiLCBOVUxMLCAxNik7CisgICAgaWYgKG51bSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXZhbHVlID0gUHlJbnRfQXNVbnNpZ25lZExvbmdNYXNrKG51bSk7Ci0JaWYgKHZhbHVlICE9IFVMT05HX01BWCkKLSAgICAgICAgCXJldHVybiByYWlzZVRlc3RFcnJvcigidGVzdF9rX2NvZGUiLAotCSAgICAiUHlJbnRfQXNVbnNpZ25lZExvbmdNYXNrKCkgcmV0dXJuZWQgd3JvbmcgdmFsdWUgZm9yIGxvbmcgMHhGRkYuLi5GRkYiKTsKKyAgICB2YWx1ZSA9IFB5SW50X0FzVW5zaWduZWRMb25nTWFzayhudW0pOworICAgIGlmICh2YWx1ZSAhPSBVTE9OR19NQVgpCisgICAgICAgIHJldHVybiByYWlzZVRlc3RFcnJvcigidGVzdF9rX2NvZGUiLAorICAgICAgICAiUHlJbnRfQXNVbnNpZ25lZExvbmdNYXNrKCkgcmV0dXJuZWQgd3JvbmcgdmFsdWUgZm9yIGxvbmcgMHhGRkYuLi5GRkYiKTsKIAotICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKHR1cGxlLCAwLCBudW0pOworICAgIFB5VHVwbGVfU0VUX0lURU0odHVwbGUsIDAsIG51bSk7CiAKLSAgICAgICAgdmFsdWUgPSAwOwotICAgICAgICBpZiAoUHlBcmdfUGFyc2VUdXBsZSh0dXBsZSwgIms6dGVzdF9rX2NvZGUiLCAmdmFsdWUpIDwgMCkKLSAgICAgICAgCXJldHVybiBOVUxMOwotICAgICAgICBpZiAodmFsdWUgIT0gVUxPTkdfTUFYKQotICAgICAgICAJcmV0dXJuIHJhaXNlVGVzdEVycm9yKCJ0ZXN0X2tfY29kZSIsCi0JCQkiayBjb2RlIHJldHVybmVkIHdyb25nIHZhbHVlIGZvciBsb25nIDB4RkZGLi4uRkZGIik7CisgICAgdmFsdWUgPSAwOworICAgIGlmIChQeUFyZ19QYXJzZVR1cGxlKHR1cGxlLCAiazp0ZXN0X2tfY29kZSIsICZ2YWx1ZSkgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAodmFsdWUgIT0gVUxPTkdfTUFYKQorICAgICAgICByZXR1cm4gcmFpc2VUZXN0RXJyb3IoInRlc3Rfa19jb2RlIiwKKyAgICAgICAgICAgICJrIGNvZGUgcmV0dXJuZWQgd3JvbmcgdmFsdWUgZm9yIGxvbmcgMHhGRkYuLi5GRkYiKTsKIAotCVB5X0RFQ1JFRihudW0pOwotICAgICAgICBudW0gPSBQeUxvbmdfRnJvbVN0cmluZygiLUZGRkZGRkZGMDAwMDAwMDAwMDAwMDAwMDQyIiwgTlVMTCwgMTYpOwotICAgICAgICBpZiAobnVtID09IE5VTEwpCi0gICAgICAgIAlyZXR1cm4gTlVMTDsKKyAgICBQeV9ERUNSRUYobnVtKTsKKyAgICBudW0gPSBQeUxvbmdfRnJvbVN0cmluZygiLUZGRkZGRkZGMDAwMDAwMDAwMDAwMDAwMDQyIiwgTlVMTCwgMTYpOworICAgIGlmIChudW0gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQl2YWx1ZSA9IFB5SW50X0FzVW5zaWduZWRMb25nTWFzayhudW0pOwotCWlmICh2YWx1ZSAhPSAodW5zaWduZWQgbG9uZyktMHg0MikKLSAgICAgICAgCXJldHVybiByYWlzZVRlc3RFcnJvcigidGVzdF9rX2NvZGUiLAotCSAgICAiUHlJbnRfQXNVbnNpZ25lZExvbmdNYXNrKCkgcmV0dXJuZWQgd3JvbmcgdmFsdWUgZm9yIGxvbmcgMHhGRkYuLi5GRkYiKTsKKyAgICB2YWx1ZSA9IFB5SW50X0FzVW5zaWduZWRMb25nTWFzayhudW0pOworICAgIGlmICh2YWx1ZSAhPSAodW5zaWduZWQgbG9uZyktMHg0MikKKyAgICAgICAgcmV0dXJuIHJhaXNlVGVzdEVycm9yKCJ0ZXN0X2tfY29kZSIsCisgICAgICAgICJQeUludF9Bc1Vuc2lnbmVkTG9uZ01hc2soKSByZXR1cm5lZCB3cm9uZyB2YWx1ZSBmb3IgbG9uZyAweEZGRi4uLkZGRiIpOwogCi0gICAgICAgIFB5VHVwbGVfU0VUX0lURU0odHVwbGUsIDAsIG51bSk7CisgICAgUHlUdXBsZV9TRVRfSVRFTSh0dXBsZSwgMCwgbnVtKTsKIAotCXZhbHVlID0gMDsKLSAgICAgICAgaWYgKFB5QXJnX1BhcnNlVHVwbGUodHVwbGUsICJrOnRlc3Rfa19jb2RlIiwgJnZhbHVlKSA8IDApCi0gICAgICAgIAlyZXR1cm4gTlVMTDsKLSAgICAgICAgaWYgKHZhbHVlICE9ICh1bnNpZ25lZCBsb25nKS0weDQyKQotICAgICAgICAJcmV0dXJuIHJhaXNlVGVzdEVycm9yKCJ0ZXN0X2tfY29kZSIsCi0JCQkiayBjb2RlIHJldHVybmVkIHdyb25nIHZhbHVlIGZvciBsb25nIC0weEZGRi4uMDAwMDQyIik7CisgICAgdmFsdWUgPSAwOworICAgIGlmIChQeUFyZ19QYXJzZVR1cGxlKHR1cGxlLCAiazp0ZXN0X2tfY29kZSIsICZ2YWx1ZSkgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAodmFsdWUgIT0gKHVuc2lnbmVkIGxvbmcpLTB4NDIpCisgICAgICAgIHJldHVybiByYWlzZVRlc3RFcnJvcigidGVzdF9rX2NvZGUiLAorICAgICAgICAgICAgImsgY29kZSByZXR1cm5lZCB3cm9uZyB2YWx1ZSBmb3IgbG9uZyAtMHhGRkYuLjAwMDA0MiIpOwogCi0JUHlfREVDUkVGKHR1cGxlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfREVDUkVGKHR1cGxlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCkBAIC01OTEsODggKzU5MSw4OCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHRlc3RfdV9jb2RlKFB5T2JqZWN0ICpzZWxmKQogewotCVB5T2JqZWN0ICp0dXBsZSwgKm9iajsKLQlQeV9VTklDT0RFICp2YWx1ZTsKLQlpbnQgbGVuOworICAgIFB5T2JqZWN0ICp0dXBsZSwgKm9iajsKKyAgICBQeV9VTklDT0RFICp2YWx1ZTsKKyAgICBpbnQgbGVuOwogCi0JLyogaXNzdWU0MTIyOiBVbmRlZmluZWQgcmVmZXJlbmNlIHRvIF9QeV9hc2NpaV93aGl0ZXNwYWNlIG9uIFdpbmRvd3MgKi8KLQkvKiBKdXN0IHVzZSB0aGUgbWFjcm8gYW5kIGNoZWNrIHRoYXQgaXQgY29tcGlsZXMgKi8KLQl4ID0gUHlfVU5JQ09ERV9JU1NQQUNFKDI1KTsKKyAgICAvKiBpc3N1ZTQxMjI6IFVuZGVmaW5lZCByZWZlcmVuY2UgdG8gX1B5X2FzY2lpX3doaXRlc3BhY2Ugb24gV2luZG93cyAqLworICAgIC8qIEp1c3QgdXNlIHRoZSBtYWNybyBhbmQgY2hlY2sgdGhhdCBpdCBjb21waWxlcyAqLworICAgIHggPSBQeV9VTklDT0RFX0lTU1BBQ0UoMjUpOwogCi0gICAgICAgIHR1cGxlID0gUHlUdXBsZV9OZXcoMSk7Ci0gICAgICAgIGlmICh0dXBsZSA9PSBOVUxMKQotICAgICAgICAJcmV0dXJuIE5VTEw7CisgICAgdHVwbGUgPSBQeVR1cGxlX05ldygxKTsKKyAgICBpZiAodHVwbGUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLSAgICAgICAgb2JqID0gUHlVbmljb2RlX0RlY29kZSgidGVzdCIsIHN0cmxlbigidGVzdCIpLAotCQkJICAgICAgICJhc2NpaSIsIE5VTEwpOwotICAgICAgICBpZiAob2JqID09IE5VTEwpCi0gICAgICAgIAlyZXR1cm4gTlVMTDsKKyAgICBvYmogPSBQeVVuaWNvZGVfRGVjb2RlKCJ0ZXN0Iiwgc3RybGVuKCJ0ZXN0IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXNjaWkiLCBOVUxMKTsKKyAgICBpZiAob2JqID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0gICAgICAgIFB5VHVwbGVfU0VUX0lURU0odHVwbGUsIDAsIG9iaik7CisgICAgUHlUdXBsZV9TRVRfSVRFTSh0dXBsZSwgMCwgb2JqKTsKIAotICAgICAgICB2YWx1ZSA9IDA7Ci0gICAgICAgIGlmIChQeUFyZ19QYXJzZVR1cGxlKHR1cGxlLCAidTp0ZXN0X3VfY29kZSIsICZ2YWx1ZSkgPCAwKQotICAgICAgICAJcmV0dXJuIE5VTEw7Ci0gICAgICAgIGlmICh2YWx1ZSAhPSBQeVVuaWNvZGVfQVNfVU5JQ09ERShvYmopKQotICAgICAgICAJcmV0dXJuIHJhaXNlVGVzdEVycm9yKCJ0ZXN0X3VfY29kZSIsCi0JCQkidSBjb2RlIHJldHVybmVkIHdyb25nIHZhbHVlIGZvciB1J3Rlc3QnIik7Ci0gICAgICAgIHZhbHVlID0gMDsKLSAgICAgICAgaWYgKFB5QXJnX1BhcnNlVHVwbGUodHVwbGUsICJ1Izp0ZXN0X3VfY29kZSIsICZ2YWx1ZSwgJmxlbikgPCAwKQotICAgICAgICAJcmV0dXJuIE5VTEw7Ci0gICAgICAgIGlmICh2YWx1ZSAhPSBQeVVuaWNvZGVfQVNfVU5JQ09ERShvYmopIHx8Ci0JICAgIGxlbiAhPSBQeVVuaWNvZGVfR0VUX1NJWkUob2JqKSkKLSAgICAgICAgCXJldHVybiByYWlzZVRlc3RFcnJvcigidGVzdF91X2NvZGUiLAotCQkJInUjIGNvZGUgcmV0dXJuZWQgd3JvbmcgdmFsdWVzIGZvciB1J3Rlc3QnIik7CisgICAgdmFsdWUgPSAwOworICAgIGlmIChQeUFyZ19QYXJzZVR1cGxlKHR1cGxlLCAidTp0ZXN0X3VfY29kZSIsICZ2YWx1ZSkgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAodmFsdWUgIT0gUHlVbmljb2RlX0FTX1VOSUNPREUob2JqKSkKKyAgICAgICAgcmV0dXJuIHJhaXNlVGVzdEVycm9yKCJ0ZXN0X3VfY29kZSIsCisgICAgICAgICAgICAidSBjb2RlIHJldHVybmVkIHdyb25nIHZhbHVlIGZvciB1J3Rlc3QnIik7CisgICAgdmFsdWUgPSAwOworICAgIGlmIChQeUFyZ19QYXJzZVR1cGxlKHR1cGxlLCAidSM6dGVzdF91X2NvZGUiLCAmdmFsdWUsICZsZW4pIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKHZhbHVlICE9IFB5VW5pY29kZV9BU19VTklDT0RFKG9iaikgfHwKKyAgICAgICAgbGVuICE9IFB5VW5pY29kZV9HRVRfU0laRShvYmopKQorICAgICAgICByZXR1cm4gcmFpc2VUZXN0RXJyb3IoInRlc3RfdV9jb2RlIiwKKyAgICAgICAgICAgICJ1IyBjb2RlIHJldHVybmVkIHdyb25nIHZhbHVlcyBmb3IgdSd0ZXN0JyIpOwogCi0JUHlfREVDUkVGKHR1cGxlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfREVDUkVGKHR1cGxlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB0ZXN0X2VtcHR5X2FyZ3BhcnNlKFB5T2JqZWN0ICpzZWxmKQogewotCS8qIFRlc3QgdGhhdCBmb3JtYXRzIGNhbiBiZWdpbiB3aXRoICd8Jy4gU2VlIGlzc3VlICM0NzIwLiAqLwotCVB5T2JqZWN0ICp0dXBsZSwgKmRpY3QgPSBOVUxMOwotCXN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHtOVUxMfTsKLQlpbnQgcmVzdWx0OwotCXR1cGxlID0gUHlUdXBsZV9OZXcoMCk7Ci0JaWYgKCF0dXBsZSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKChyZXN1bHQgPSBQeUFyZ19QYXJzZVR1cGxlKHR1cGxlLCAifDp0ZXN0X2VtcHR5X2FyZ3BhcnNlIikpIDwgMCkKLQkJZ290byBkb25lOwotCWRpY3QgPSBQeURpY3RfTmV3KCk7Ci0JaWYgKCFkaWN0KQotCQlnb3RvIGRvbmU7Ci0JcmVzdWx0ID0gUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKHR1cGxlLCBkaWN0LCAifDp0ZXN0X2VtcHR5X2FyZ3BhcnNlIiwga3dsaXN0KTsKKyAgICAvKiBUZXN0IHRoYXQgZm9ybWF0cyBjYW4gYmVnaW4gd2l0aCAnfCcuIFNlZSBpc3N1ZSAjNDcyMC4gKi8KKyAgICBQeU9iamVjdCAqdHVwbGUsICpkaWN0ID0gTlVMTDsKKyAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7TlVMTH07CisgICAgaW50IHJlc3VsdDsKKyAgICB0dXBsZSA9IFB5VHVwbGVfTmV3KDApOworICAgIGlmICghdHVwbGUpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICgocmVzdWx0ID0gUHlBcmdfUGFyc2VUdXBsZSh0dXBsZSwgInw6dGVzdF9lbXB0eV9hcmdwYXJzZSIpKSA8IDApCisgICAgICAgIGdvdG8gZG9uZTsKKyAgICBkaWN0ID0gUHlEaWN0X05ldygpOworICAgIGlmICghZGljdCkKKyAgICAgICAgZ290byBkb25lOworICAgIHJlc3VsdCA9IFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkcyh0dXBsZSwgZGljdCwgInw6dGVzdF9lbXB0eV9hcmdwYXJzZSIsIGt3bGlzdCk7CiAgIGRvbmU6Ci0JUHlfREVDUkVGKHR1cGxlKTsKLQlQeV9YREVDUkVGKGRpY3QpOwotCWlmIChyZXN1bHQgPCAwKQotCQlyZXR1cm4gTlVMTDsKLQllbHNlIHsKLQkJUHlfUkVUVVJOX05PTkU7Ci0JfQorICAgIFB5X0RFQ1JFRih0dXBsZSk7CisgICAgUHlfWERFQ1JFRihkaWN0KTsKKyAgICBpZiAocmVzdWx0IDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZWxzZSB7CisgICAgICAgIFB5X1JFVFVSTl9OT05FOworICAgIH0KIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNvZGVjX2luY3JlbWVudGFsZW5jb2RlcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY29uc3QgY2hhciAqZW5jb2RpbmcsICplcnJvcnMgPSBOVUxMOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic3xzOnRlc3RfaW5jcmVtZW50YWxlbmNvZGVyIiwKLQkJCSAgICAgICZlbmNvZGluZywgJmVycm9ycykpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBQeUNvZGVjX0luY3JlbWVudGFsRW5jb2RlcihlbmNvZGluZywgZXJyb3JzKTsKKyAgICBjb25zdCBjaGFyICplbmNvZGluZywgKmVycm9ycyA9IE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzfHM6dGVzdF9pbmNyZW1lbnRhbGVuY29kZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5jb2RpbmcsICZlcnJvcnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gUHlDb2RlY19JbmNyZW1lbnRhbEVuY29kZXIoZW5jb2RpbmcsIGVycm9ycyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjb2RlY19pbmNyZW1lbnRhbGRlY29kZXIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNvbnN0IGNoYXIgKmVuY29kaW5nLCAqZXJyb3JzID0gTlVMTDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInN8czp0ZXN0X2luY3JlbWVudGFsZGVjb2RlciIsCi0JCQkgICAgICAmZW5jb2RpbmcsICZlcnJvcnMpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gUHlDb2RlY19JbmNyZW1lbnRhbERlY29kZXIoZW5jb2RpbmcsIGVycm9ycyk7CisgICAgY29uc3QgY2hhciAqZW5jb2RpbmcsICplcnJvcnMgPSBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic3xzOnRlc3RfaW5jcmVtZW50YWxkZWNvZGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmVuY29kaW5nLCAmZXJyb3JzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFB5Q29kZWNfSW5jcmVtZW50YWxEZWNvZGVyKGVuY29kaW5nLCBlcnJvcnMpOwogfQogCiAjZW5kaWYKQEAgLTY4MSw0MiArNjgxLDQyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogdGVzdF9sb25nX251bWJpdHMoUHlPYmplY3QgKnNlbGYpCiB7Ci0Jc3RydWN0IHRyaXBsZSB7Ci0JCWxvbmcgaW5wdXQ7Ci0JCXNpemVfdCBuYml0czsKLQkJaW50IHNpZ247Ci0JfSB0ZXN0Y2FzZXNbXSA9IHt7MCwgMCwgMH0sCi0JCQkgezFMLCAxLCAxfSwKLQkJCSB7LTFMLCAxLCAtMX0sCi0JCQkgezJMLCAyLCAxfSwKLQkJCSB7LTJMLCAyLCAtMX0sCi0JCQkgezNMLCAyLCAxfSwKLQkJCSB7LTNMLCAyLCAtMX0sCi0JCQkgezRMLCAzLCAxfSwKLQkJCSB7LTRMLCAzLCAtMX0sCi0JCQkgezB4N2ZmZkwsIDE1LCAxfSwJLyogb25lIFB5dGhvbiBsb25nIGRpZ2l0ICovCi0JCQkgey0weDdmZmZMLCAxNSwgLTF9LAotCQkJIHsweGZmZmZMLCAxNiwgMX0sCi0JCQkgey0weGZmZmZMLCAxNiwgLTF9LAotCQkJIHsweGZmZmZmZmZMLCAyOCwgMX0sCi0JCQkgey0weGZmZmZmZmZMLCAyOCwgLTF9fTsKLQlpbnQgaTsKKyAgICBzdHJ1Y3QgdHJpcGxlIHsKKyAgICAgICAgbG9uZyBpbnB1dDsKKyAgICAgICAgc2l6ZV90IG5iaXRzOworICAgICAgICBpbnQgc2lnbjsKKyAgICB9IHRlc3RjYXNlc1tdID0ge3swLCAwLCAwfSwKKyAgICAgICAgICAgICAgICAgICAgIHsxTCwgMSwgMX0sCisgICAgICAgICAgICAgICAgICAgICB7LTFMLCAxLCAtMX0sCisgICAgICAgICAgICAgICAgICAgICB7MkwsIDIsIDF9LAorICAgICAgICAgICAgICAgICAgICAgey0yTCwgMiwgLTF9LAorICAgICAgICAgICAgICAgICAgICAgezNMLCAyLCAxfSwKKyAgICAgICAgICAgICAgICAgICAgIHstM0wsIDIsIC0xfSwKKyAgICAgICAgICAgICAgICAgICAgIHs0TCwgMywgMX0sCisgICAgICAgICAgICAgICAgICAgICB7LTRMLCAzLCAtMX0sCisgICAgICAgICAgICAgICAgICAgICB7MHg3ZmZmTCwgMTUsIDF9LCAgICAgICAgICAvKiBvbmUgUHl0aG9uIGxvbmcgZGlnaXQgKi8KKyAgICAgICAgICAgICB7LTB4N2ZmZkwsIDE1LCAtMX0sCisgICAgICAgICAgICAgezB4ZmZmZkwsIDE2LCAxfSwKKyAgICAgICAgICAgICB7LTB4ZmZmZkwsIDE2LCAtMX0sCisgICAgICAgICAgICAgezB4ZmZmZmZmZkwsIDI4LCAxfSwKKyAgICAgICAgICAgICB7LTB4ZmZmZmZmZkwsIDI4LCAtMX19OworICAgIGludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IHNpemVvZih0ZXN0Y2FzZXMpIC8gc2l6ZW9mKHN0cnVjdCB0cmlwbGUpOyArK2kpIHsKLQkJUHlPYmplY3QgKnBsb25nID0gUHlMb25nX0Zyb21Mb25nKHRlc3RjYXNlc1tpXS5pbnB1dCk7Ci0JCXNpemVfdCBuYml0cyA9IF9QeUxvbmdfTnVtQml0cyhwbG9uZyk7Ci0JCWludCBzaWduID0gX1B5TG9uZ19TaWduKHBsb25nKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHRlc3RjYXNlcykgLyBzaXplb2Yoc3RydWN0IHRyaXBsZSk7ICsraSkgeworICAgICAgICBQeU9iamVjdCAqcGxvbmcgPSBQeUxvbmdfRnJvbUxvbmcodGVzdGNhc2VzW2ldLmlucHV0KTsKKyAgICAgICAgc2l6ZV90IG5iaXRzID0gX1B5TG9uZ19OdW1CaXRzKHBsb25nKTsKKyAgICAgICAgaW50IHNpZ24gPSBfUHlMb25nX1NpZ24ocGxvbmcpOwogCi0JCVB5X0RFQ1JFRihwbG9uZyk7Ci0JCWlmIChuYml0cyAhPSB0ZXN0Y2FzZXNbaV0ubmJpdHMpCi0JCQlyZXR1cm4gcmFpc2VUZXN0RXJyb3IoInRlc3RfbG9uZ19udW1iaXRzIiwKLQkJCQkJIndyb25nIHJlc3VsdCBmb3IgX1B5TG9uZ19OdW1CaXRzIik7Ci0JCWlmIChzaWduICE9IHRlc3RjYXNlc1tpXS5zaWduKQotCQkJcmV0dXJuIHJhaXNlVGVzdEVycm9yKCJ0ZXN0X2xvbmdfbnVtYml0cyIsCi0JCQkJCSJ3cm9uZyByZXN1bHQgZm9yIF9QeUxvbmdfU2lnbiIpOwotCX0KLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgICAgIFB5X0RFQ1JFRihwbG9uZyk7CisgICAgICAgIGlmIChuYml0cyAhPSB0ZXN0Y2FzZXNbaV0ubmJpdHMpCisgICAgICAgICAgICByZXR1cm4gcmFpc2VUZXN0RXJyb3IoInRlc3RfbG9uZ19udW1iaXRzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAid3JvbmcgcmVzdWx0IGZvciBfUHlMb25nX051bUJpdHMiKTsKKyAgICAgICAgaWYgKHNpZ24gIT0gdGVzdGNhc2VzW2ldLnNpZ24pCisgICAgICAgICAgICByZXR1cm4gcmFpc2VUZXN0RXJyb3IoInRlc3RfbG9uZ19udW1iaXRzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAid3JvbmcgcmVzdWx0IGZvciBfUHlMb25nX1NpZ24iKTsKKyAgICB9CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiBFeGFtcGxlIHBhc3NpbmcgTlVMTHMgdG8gUHlPYmplY3RfU3RyKE5VTEwpIGFuZCBQeU9iamVjdF9Vbmljb2RlKE5VTEwpLiAqLwpAQCAtNzI0LDQyICs3MjQsNDIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiB0ZXN0X251bGxfc3RyaW5ncyhQeU9iamVjdCAqc2VsZikKIHsKLQlQeU9iamVjdCAqbzEgPSBQeU9iamVjdF9TdHIoTlVMTCksICpvMiA9IFB5T2JqZWN0X1VuaWNvZGUoTlVMTCk7Ci0JUHlPYmplY3QgKnR1cGxlID0gUHlUdXBsZV9QYWNrKDIsIG8xLCBvMik7Ci0JUHlfWERFQ1JFRihvMSk7Ci0JUHlfWERFQ1JFRihvMik7Ci0JcmV0dXJuIHR1cGxlOworICAgIFB5T2JqZWN0ICpvMSA9IFB5T2JqZWN0X1N0cihOVUxMKSwgKm8yID0gUHlPYmplY3RfVW5pY29kZShOVUxMKTsKKyAgICBQeU9iamVjdCAqdHVwbGUgPSBQeVR1cGxlX1BhY2soMiwgbzEsIG8yKTsKKyAgICBQeV9YREVDUkVGKG8xKTsKKyAgICBQeV9YREVDUkVGKG8yKTsKKyAgICByZXR1cm4gdHVwbGU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiByYWlzZV9leGNlcHRpb24oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICpleGM7Ci0JUHlPYmplY3QgKmV4Y19hcmdzLCAqdjsKLQlpbnQgbnVtX2FyZ3MsIGk7CisgICAgUHlPYmplY3QgKmV4YzsKKyAgICBQeU9iamVjdCAqZXhjX2FyZ3MsICp2OworICAgIGludCBudW1fYXJncywgaTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT2k6cmFpc2VfZXhjZXB0aW9uIiwKLQkJCSAgICAgICZleGMsICZudW1fYXJncykpCi0JCXJldHVybiBOVUxMOwotCWlmICghUHlFeGNlcHRpb25DbGFzc19DaGVjayhleGMpKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICJhbiBleGNlcHRpb24gY2xhc3MgaXMgcmVxdWlyZWQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT2k6cmFpc2VfZXhjZXB0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmV4YywgJm51bV9hcmdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUV4Y2VwdGlvbkNsYXNzX0NoZWNrKGV4YykpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgImFuIGV4Y2VwdGlvbiBjbGFzcyBpcyByZXF1aXJlZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlleGNfYXJncyA9IFB5VHVwbGVfTmV3KG51bV9hcmdzKTsKLQlpZiAoZXhjX2FyZ3MgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JZm9yIChpID0gMDsgaSA8IG51bV9hcmdzOyArK2kpIHsKLQkJdiA9IFB5SW50X0Zyb21Mb25nKGkpOwotCQlpZiAodiA9PSBOVUxMKSB7Ci0JCQlQeV9ERUNSRUYoZXhjX2FyZ3MpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJUHlUdXBsZV9TRVRfSVRFTShleGNfYXJncywgaSwgdik7Ci0JfQotCVB5RXJyX1NldE9iamVjdChleGMsIGV4Y19hcmdzKTsKLQlQeV9ERUNSRUYoZXhjX2FyZ3MpOwotCXJldHVybiBOVUxMOworICAgIGV4Y19hcmdzID0gUHlUdXBsZV9OZXcobnVtX2FyZ3MpOworICAgIGlmIChleGNfYXJncyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX2FyZ3M7ICsraSkgeworICAgICAgICB2ID0gUHlJbnRfRnJvbUxvbmcoaSk7CisgICAgICAgIGlmICh2ID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihleGNfYXJncyk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKGV4Y19hcmdzLCBpLCB2KTsKKyAgICB9CisgICAgUHlFcnJfU2V0T2JqZWN0KGV4YywgZXhjX2FyZ3MpOworICAgIFB5X0RFQ1JFRihleGNfYXJncyk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKICNpZmRlZiBXSVRIX1RIUkVBRApAQCAtNzc2LDE0ICs3NzYsMTQgQEAKIHN0YXRpYyBpbnQKIF9tYWtlX2NhbGwodm9pZCAqY2FsbGFibGUpCiB7Ci0JUHlPYmplY3QgKnJjOwotCWludCBzdWNjZXNzOwotCVB5R0lMU3RhdGVfU1RBVEUgcyA9IFB5R0lMU3RhdGVfRW5zdXJlKCk7Ci0JcmMgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oKFB5T2JqZWN0ICopY2FsbGFibGUsICIiKTsKLQlzdWNjZXNzID0gKHJjICE9IE5VTEwpOwotCVB5X1hERUNSRUYocmMpOwotCVB5R0lMU3RhdGVfUmVsZWFzZShzKTsKLQlyZXR1cm4gc3VjY2VzczsKKyAgICBQeU9iamVjdCAqcmM7CisgICAgaW50IHN1Y2Nlc3M7CisgICAgUHlHSUxTdGF0ZV9TVEFURSBzID0gUHlHSUxTdGF0ZV9FbnN1cmUoKTsKKyAgICByYyA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbigoUHlPYmplY3QgKiljYWxsYWJsZSwgIiIpOworICAgIHN1Y2Nlc3MgPSAocmMgIT0gTlVMTCk7CisgICAgUHlfWERFQ1JFRihyYyk7CisgICAgUHlHSUxTdGF0ZV9SZWxlYXNlKHMpOworICAgIHJldHVybiBzdWNjZXNzOwogfQogCiAvKiBTYW1lIHRoaW5nLCBidXQgcmVsZWFzZXMgYHRocmVhZF9kb25lYCB3aGVuIGl0IHJldHVybnMuICBUaGlzIHZhcmlhbnQKQEAgLTc5Miw1OSArNzkyLDU5IEBACiBzdGF0aWMgdm9pZAogX21ha2VfY2FsbF9mcm9tX3RocmVhZCh2b2lkICpjYWxsYWJsZSkKIHsKLQlfbWFrZV9jYWxsKGNhbGxhYmxlKTsKLQlQeVRocmVhZF9yZWxlYXNlX2xvY2sodGhyZWFkX2RvbmUpOworICAgIF9tYWtlX2NhbGwoY2FsbGFibGUpOworICAgIFB5VGhyZWFkX3JlbGVhc2VfbG9jayh0aHJlYWRfZG9uZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB0ZXN0X3RocmVhZF9zdGF0ZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKmZuOwotCWludCBzdWNjZXNzID0gMTsKKyAgICBQeU9iamVjdCAqZm47CisgICAgaW50IHN1Y2Nlc3MgPSAxOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPOnRlc3RfdGhyZWFkX3N0YXRlIiwgJmZuKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPOnRlc3RfdGhyZWFkX3N0YXRlIiwgJmZuKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoIVB5Q2FsbGFibGVfQ2hlY2soZm4pKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICInJXMnIG9iamVjdCBpcyBub3QgY2FsbGFibGUiLAotCQkJZm4tPm9iX3R5cGUtPnRwX25hbWUpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKCFQeUNhbGxhYmxlX0NoZWNrKGZuKSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAiJyVzJyBvYmplY3QgaXMgbm90IGNhbGxhYmxlIiwKKyAgICAgICAgICAgIGZuLT5vYl90eXBlLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JLyogRW5zdXJlIFB5dGhvbiBpcyBzZXQgdXAgZm9yIHRocmVhZGluZyAqLwotCVB5RXZhbF9Jbml0VGhyZWFkcygpOwotCXRocmVhZF9kb25lID0gUHlUaHJlYWRfYWxsb2NhdGVfbG9jaygpOwotCWlmICh0aHJlYWRfZG9uZSA9PSBOVUxMKQotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQlQeVRocmVhZF9hY3F1aXJlX2xvY2sodGhyZWFkX2RvbmUsIDEpOworICAgIC8qIEVuc3VyZSBQeXRob24gaXMgc2V0IHVwIGZvciB0aHJlYWRpbmcgKi8KKyAgICBQeUV2YWxfSW5pdFRocmVhZHMoKTsKKyAgICB0aHJlYWRfZG9uZSA9IFB5VGhyZWFkX2FsbG9jYXRlX2xvY2soKTsKKyAgICBpZiAodGhyZWFkX2RvbmUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgUHlUaHJlYWRfYWNxdWlyZV9sb2NrKHRocmVhZF9kb25lLCAxKTsKIAotCS8qIFN0YXJ0IGEgbmV3IHRocmVhZCB3aXRoIG91ciBjYWxsYmFjay4gKi8KLQlQeVRocmVhZF9zdGFydF9uZXdfdGhyZWFkKF9tYWtlX2NhbGxfZnJvbV90aHJlYWQsIGZuKTsKLQkvKiBNYWtlIHRoZSBjYWxsYmFjayB3aXRoIHRoZSB0aHJlYWQgbG9jayBoZWxkIGJ5IHRoaXMgdGhyZWFkICovCi0Jc3VjY2VzcyAmPSBfbWFrZV9jYWxsKGZuKTsKLQkvKiBEbyBpdCBhbGwgYWdhaW4sIGJ1dCB0aGlzIHRpbWUgd2l0aCB0aGUgdGhyZWFkLWxvY2sgcmVsZWFzZWQgKi8KLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0Jc3VjY2VzcyAmPSBfbWFrZV9jYWxsKGZuKTsKLQlQeVRocmVhZF9hY3F1aXJlX2xvY2sodGhyZWFkX2RvbmUsIDEpOyAgLyogd2FpdCBmb3IgdGhyZWFkIHRvIGZpbmlzaCAqLwotCVB5X0VORF9BTExPV19USFJFQURTCisgICAgLyogU3RhcnQgYSBuZXcgdGhyZWFkIHdpdGggb3VyIGNhbGxiYWNrLiAqLworICAgIFB5VGhyZWFkX3N0YXJ0X25ld190aHJlYWQoX21ha2VfY2FsbF9mcm9tX3RocmVhZCwgZm4pOworICAgIC8qIE1ha2UgdGhlIGNhbGxiYWNrIHdpdGggdGhlIHRocmVhZCBsb2NrIGhlbGQgYnkgdGhpcyB0aHJlYWQgKi8KKyAgICBzdWNjZXNzICY9IF9tYWtlX2NhbGwoZm4pOworICAgIC8qIERvIGl0IGFsbCBhZ2FpbiwgYnV0IHRoaXMgdGltZSB3aXRoIHRoZSB0aHJlYWQtbG9jayByZWxlYXNlZCAqLworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICBzdWNjZXNzICY9IF9tYWtlX2NhbGwoZm4pOworICAgIFB5VGhyZWFkX2FjcXVpcmVfbG9jayh0aHJlYWRfZG9uZSwgMSk7ICAvKiB3YWl0IGZvciB0aHJlYWQgdG8gZmluaXNoICovCisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKIAotCS8qIEFuZCBvbmNlIG1vcmUgd2l0aCBhbmQgd2l0aG91dCBhIHRocmVhZAotCSAgIFhYWCAtIHNob3VsZCB1c2UgYSBsb2NrIGFuZCB3b3JrIG91dCBleGFjdGx5IHdoYXQgd2UgYXJlIHRyeWluZwotCSAgIHRvIHRlc3QgPHdpbms+Ci0JKi8KLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JUHlUaHJlYWRfc3RhcnRfbmV3X3RocmVhZChfbWFrZV9jYWxsX2Zyb21fdGhyZWFkLCBmbik7Ci0Jc3VjY2VzcyAmPSBfbWFrZV9jYWxsKGZuKTsKLQlQeVRocmVhZF9hY3F1aXJlX2xvY2sodGhyZWFkX2RvbmUsIDEpOyAgLyogd2FpdCBmb3IgdGhyZWFkIHRvIGZpbmlzaCAqLwotCVB5X0VORF9BTExPV19USFJFQURTCisgICAgLyogQW5kIG9uY2UgbW9yZSB3aXRoIGFuZCB3aXRob3V0IGEgdGhyZWFkCisgICAgICAgWFhYIC0gc2hvdWxkIHVzZSBhIGxvY2sgYW5kIHdvcmsgb3V0IGV4YWN0bHkgd2hhdCB3ZSBhcmUgdHJ5aW5nCisgICAgICAgdG8gdGVzdCA8d2luaz4KKyAgICAqLworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICBQeVRocmVhZF9zdGFydF9uZXdfdGhyZWFkKF9tYWtlX2NhbGxfZnJvbV90aHJlYWQsIGZuKTsKKyAgICBzdWNjZXNzICY9IF9tYWtlX2NhbGwoZm4pOworICAgIFB5VGhyZWFkX2FjcXVpcmVfbG9jayh0aHJlYWRfZG9uZSwgMSk7ICAvKiB3YWl0IGZvciB0aHJlYWQgdG8gZmluaXNoICovCisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKIAotCS8qIFJlbGVhc2UgbG9jayB3ZSBhY3F1aXJlZCBhYm92ZS4gIFRoaXMgaXMgcmVxdWlyZWQgb24gSFAtVVguICovCi0JUHlUaHJlYWRfcmVsZWFzZV9sb2NrKHRocmVhZF9kb25lKTsKKyAgICAvKiBSZWxlYXNlIGxvY2sgd2UgYWNxdWlyZWQgYWJvdmUuICBUaGlzIGlzIHJlcXVpcmVkIG9uIEhQLVVYLiAqLworICAgIFB5VGhyZWFkX3JlbGVhc2VfbG9jayh0aHJlYWRfZG9uZSk7CiAKLQlQeVRocmVhZF9mcmVlX2xvY2sodGhyZWFkX2RvbmUpOwotCWlmICghc3VjY2VzcykKLQkJcmV0dXJuIE5VTEw7Ci0JUHlfUkVUVVJOX05PTkU7CisgICAgUHlUaHJlYWRfZnJlZV9sb2NrKHRocmVhZF9kb25lKTsKKyAgICBpZiAoIXN1Y2Nlc3MpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5X1JFVFVSTl9OT05FOwogfQogI2VuZGlmCiAKQEAgLTg1MiwzNCArODUyLDM0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogdGVzdF9zdHJpbmdfZnJvbV9mb3JtYXQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICpyZXN1bHQ7Ci0JY2hhciAqbXNnOworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisgICAgY2hhciAqbXNnOwogCi0jZGVmaW5lIENIRUNLXzFfRk9STUFUKEZPUk1BVCwgVFlQRSkgCQkJXAotCXJlc3VsdCA9IFB5U3RyaW5nX0Zyb21Gb3JtYXQoRk9STUFULCAoVFlQRSkxKTsJXAotCWlmIChyZXN1bHQgPT0gTlVMTCkJCQkJXAotCQlyZXR1cm4gTlVMTDsJCQkJXAotCWlmIChzdHJjbXAoUHlTdHJpbmdfQXNTdHJpbmcocmVzdWx0KSwgIjEiKSkgewlcCi0JCW1zZyA9IEZPUk1BVCAiIGZhaWxlZCBhdCAxIjsJCVwKLQkJZ290byBGYWlsOwkJCQlcCi0JfQkJCQkJCVwKLQlQeV9ERUNSRUYocmVzdWx0KQorI2RlZmluZSBDSEVDS18xX0ZPUk1BVChGT1JNQVQsIFRZUEUpICAgICAgICAgICAgICAgICAgICBcCisgICAgcmVzdWx0ID0gUHlTdHJpbmdfRnJvbUZvcm1hdChGT1JNQVQsIChUWVBFKTEpOyAgICAgIFwKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXR1cm4gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKHN0cmNtcChQeVN0cmluZ19Bc1N0cmluZyhyZXN1bHQpLCAiMSIpKSB7ICAgICAgIFwKKyAgICAgICAgbXNnID0gRk9STUFUICIgZmFpbGVkIGF0IDEiOyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBnb3RvIEZhaWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBQeV9ERUNSRUYocmVzdWx0KQogCi0JQ0hFQ0tfMV9GT1JNQVQoIiVkIiwgaW50KTsKLQlDSEVDS18xX0ZPUk1BVCgiJWxkIiwgbG9uZyk7Ci0JLyogVGhlIHogd2lkdGggbW9kaWZpZXIgd2FzIGFkZGVkIGluIFB5dGhvbiAyLjUuICovCi0JQ0hFQ0tfMV9GT1JNQVQoIiV6ZCIsIFB5X3NzaXplX3QpOworICAgIENIRUNLXzFfRk9STUFUKCIlZCIsIGludCk7CisgICAgQ0hFQ0tfMV9GT1JNQVQoIiVsZCIsIGxvbmcpOworICAgIC8qIFRoZSB6IHdpZHRoIG1vZGlmaWVyIHdhcyBhZGRlZCBpbiBQeXRob24gMi41LiAqLworICAgIENIRUNLXzFfRk9STUFUKCIlemQiLCBQeV9zc2l6ZV90KTsKIAotCS8qIFRoZSB1IHR5cGUgY29kZSB3YXMgYWRkZWQgaW4gUHl0aG9uIDIuNS4gKi8KLQlDSEVDS18xX0ZPUk1BVCgiJXUiLCB1bnNpZ25lZCBpbnQpOwotCUNIRUNLXzFfRk9STUFUKCIlbHUiLCB1bnNpZ25lZCBsb25nKTsKLQlDSEVDS18xX0ZPUk1BVCgiJXp1Iiwgc2l6ZV90KTsKKyAgICAvKiBUaGUgdSB0eXBlIGNvZGUgd2FzIGFkZGVkIGluIFB5dGhvbiAyLjUuICovCisgICAgQ0hFQ0tfMV9GT1JNQVQoIiV1IiwgdW5zaWduZWQgaW50KTsKKyAgICBDSEVDS18xX0ZPUk1BVCgiJWx1IiwgdW5zaWduZWQgbG9uZyk7CisgICAgQ0hFQ0tfMV9GT1JNQVQoIiV6dSIsIHNpemVfdCk7CiAKLQlQeV9SRVRVUk5fTk9ORTsKKyAgICBQeV9SRVRVUk5fTk9ORTsKIAogIEZhaWw6Ci0gCVB5X1hERUNSRUYocmVzdWx0KTsKLQlyZXR1cm4gcmFpc2VUZXN0RXJyb3IoInRlc3Rfc3RyaW5nX2Zyb21fZm9ybWF0IiwgbXNnKTsKKyAgICBQeV9YREVDUkVGKHJlc3VsdCk7CisgICAgcmV0dXJuIHJhaXNlVGVzdEVycm9yKCJ0ZXN0X3N0cmluZ19mcm9tX2Zvcm1hdCIsIG1zZyk7CiAKICN1bmRlZiBDSEVDS18xX0ZPUk1BVAogfQpAQCAtODg4LDI2NyArODg4LDI2NyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHRlc3Rfd2l0aF9kb2NzdHJpbmcoUHlPYmplY3QgKnNlbGYpCiB7Ci0JUHlfUkVUVVJOX05PTkU7CisgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKIC8qIFRvIHRlc3QgdGhlIGZvcm1hdCBvZiB0cmFjZWJhY2tzIGFzIHByaW50ZWQgb3V0LiAqLwogc3RhdGljIFB5T2JqZWN0ICoKIHRyYWNlYmFja19wcmludChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKmZpbGU7Ci0JUHlPYmplY3QgKnRyYWNlYmFjazsKLQlpbnQgcmVzdWx0OwotCQotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT086dHJhY2ViYWNrX3ByaW50IiwKLQkJCQkmdHJhY2ViYWNrLCAmZmlsZSkpCi0JCXJldHVybiBOVUxMOwotCQkKLQlyZXN1bHQgPSBQeVRyYWNlQmFja19QcmludCh0cmFjZWJhY2ssIGZpbGUpOwotCWlmIChyZXN1bHQgPCAwKQotCQlyZXR1cm4gTlVMTDsKLQlQeV9SRVRVUk5fTk9ORTsKKyAgICBQeU9iamVjdCAqZmlsZTsKKyAgICBQeU9iamVjdCAqdHJhY2ViYWNrOworICAgIGludCByZXN1bHQ7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9POnRyYWNlYmFja19wcmludCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRyYWNlYmFjaywgJmZpbGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIHJlc3VsdCA9IFB5VHJhY2VCYWNrX1ByaW50KHRyYWNlYmFjaywgZmlsZSk7CisgICAgaWYgKHJlc3VsdCA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5X1JFVFVSTl9OT05FOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgVGVzdE1ldGhvZHNbXSA9IHsKLQl7InJhaXNlX2V4Y2VwdGlvbiIsCXJhaXNlX2V4Y2VwdGlvbiwJCSBNRVRIX1ZBUkFSR1N9LAotCXsidGVzdF9jb25maWciLAkJKFB5Q0Z1bmN0aW9uKXRlc3RfY29uZmlnLAkgTUVUSF9OT0FSR1N9LAotCXsidGVzdF9saXN0X2FwaSIsCShQeUNGdW5jdGlvbil0ZXN0X2xpc3RfYXBpLAkgTUVUSF9OT0FSR1N9LAotCXsidGVzdF9kaWN0X2l0ZXJhdGlvbiIsCShQeUNGdW5jdGlvbil0ZXN0X2RpY3RfaXRlcmF0aW9uLE1FVEhfTk9BUkdTfSwKLQl7InRlc3RfbGF6eV9oYXNoX2luaGVyaXRhbmNlIiwJKFB5Q0Z1bmN0aW9uKXRlc3RfbGF6eV9oYXNoX2luaGVyaXRhbmNlLE1FVEhfTk9BUkdTfSwKLQl7InRlc3RfbG9uZ19hcGkiLAkoUHlDRnVuY3Rpb24pdGVzdF9sb25nX2FwaSwJIE1FVEhfTk9BUkdTfSwKLQl7InRlc3RfbG9uZ19udW1iaXRzIiwJKFB5Q0Z1bmN0aW9uKXRlc3RfbG9uZ19udW1iaXRzLAkgTUVUSF9OT0FSR1N9LAotCXsidGVzdF9rX2NvZGUiLAkJKFB5Q0Z1bmN0aW9uKXRlc3Rfa19jb2RlLAkgTUVUSF9OT0FSR1N9LAotCXsidGVzdF9lbXB0eV9hcmdwYXJzZSIsIChQeUNGdW5jdGlvbil0ZXN0X2VtcHR5X2FyZ3BhcnNlLE1FVEhfTk9BUkdTfSwKLQl7InRlc3RfbnVsbF9zdHJpbmdzIiwJKFB5Q0Z1bmN0aW9uKXRlc3RfbnVsbF9zdHJpbmdzLAkgTUVUSF9OT0FSR1N9LAotCXsidGVzdF9zdHJpbmdfZnJvbV9mb3JtYXQiLCAoUHlDRnVuY3Rpb24pdGVzdF9zdHJpbmdfZnJvbV9mb3JtYXQsIE1FVEhfTk9BUkdTfSwKLQl7InRlc3Rfd2l0aF9kb2NzdHJpbmciLCAoUHlDRnVuY3Rpb24pdGVzdF93aXRoX2RvY3N0cmluZywgTUVUSF9OT0FSR1MsCi0JIFB5RG9jX1NUUigiVGhpcyBpcyBhIHByZXR0eSBub3JtYWwgZG9jc3RyaW5nLiIpfSwKKyAgICB7InJhaXNlX2V4Y2VwdGlvbiIsICAgICAgICAgcmFpc2VfZXhjZXB0aW9uLCAgICAgICAgICAgICAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7InRlc3RfY29uZmlnIiwgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXRlc3RfY29uZmlnLCAgICAgICAgTUVUSF9OT0FSR1N9LAorICAgIHsidGVzdF9saXN0X2FwaSIsICAgICAgICAgICAoUHlDRnVuY3Rpb24pdGVzdF9saXN0X2FwaSwgICAgICBNRVRIX05PQVJHU30sCisgICAgeyJ0ZXN0X2RpY3RfaXRlcmF0aW9uIiwgICAgIChQeUNGdW5jdGlvbil0ZXN0X2RpY3RfaXRlcmF0aW9uLE1FVEhfTk9BUkdTfSwKKyAgICB7InRlc3RfbGF6eV9oYXNoX2luaGVyaXRhbmNlIiwgICAgICAoUHlDRnVuY3Rpb24pdGVzdF9sYXp5X2hhc2hfaW5oZXJpdGFuY2UsTUVUSF9OT0FSR1N9LAorICAgIHsidGVzdF9sb25nX2FwaSIsICAgICAgICAgICAoUHlDRnVuY3Rpb24pdGVzdF9sb25nX2FwaSwgICAgICBNRVRIX05PQVJHU30sCisgICAgeyJ0ZXN0X2xvbmdfbnVtYml0cyIsICAgICAgIChQeUNGdW5jdGlvbil0ZXN0X2xvbmdfbnVtYml0cywgIE1FVEhfTk9BUkdTfSwKKyAgICB7InRlc3Rfa19jb2RlIiwgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXRlc3Rfa19jb2RlLCAgICAgICAgTUVUSF9OT0FSR1N9LAorICAgIHsidGVzdF9lbXB0eV9hcmdwYXJzZSIsIChQeUNGdW5jdGlvbil0ZXN0X2VtcHR5X2FyZ3BhcnNlLE1FVEhfTk9BUkdTfSwKKyAgICB7InRlc3RfbnVsbF9zdHJpbmdzIiwgICAgICAgKFB5Q0Z1bmN0aW9uKXRlc3RfbnVsbF9zdHJpbmdzLCAgTUVUSF9OT0FSR1N9LAorICAgIHsidGVzdF9zdHJpbmdfZnJvbV9mb3JtYXQiLCAoUHlDRnVuY3Rpb24pdGVzdF9zdHJpbmdfZnJvbV9mb3JtYXQsIE1FVEhfTk9BUkdTfSwKKyAgICB7InRlc3Rfd2l0aF9kb2NzdHJpbmciLCAoUHlDRnVuY3Rpb24pdGVzdF93aXRoX2RvY3N0cmluZywgTUVUSF9OT0FSR1MsCisgICAgIFB5RG9jX1NUUigiVGhpcyBpcyBhIHByZXR0eSBub3JtYWwgZG9jc3RyaW5nLiIpfSwKIAotCXsiZ2V0YXJnc190dXBsZSIsCWdldGFyZ3NfdHVwbGUsCQkJIE1FVEhfVkFSQVJHU30sCi0JeyJnZXRhcmdzX2tleXdvcmRzIiwgKFB5Q0Z1bmN0aW9uKWdldGFyZ3Nfa2V5d29yZHMsIAotCSAgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFN9LAotCXsiZ2V0YXJnc19iIiwJCWdldGFyZ3NfYiwJCQkgTUVUSF9WQVJBUkdTfSwKLQl7ImdldGFyZ3NfQiIsCQlnZXRhcmdzX0IsCQkJIE1FVEhfVkFSQVJHU30sCi0JeyJnZXRhcmdzX0giLAkJZ2V0YXJnc19ILAkJCSBNRVRIX1ZBUkFSR1N9LAotCXsiZ2V0YXJnc19JIiwJCWdldGFyZ3NfSSwJCQkgTUVUSF9WQVJBUkdTfSwKLQl7ImdldGFyZ3NfayIsCQlnZXRhcmdzX2ssCQkJIE1FVEhfVkFSQVJHU30sCi0JeyJnZXRhcmdzX2kiLAkJZ2V0YXJnc19pLAkJCSBNRVRIX1ZBUkFSR1N9LAotCXsiZ2V0YXJnc19sIiwJCWdldGFyZ3NfbCwJCQkgTUVUSF9WQVJBUkdTfSwKLQl7ImdldGFyZ3NfbiIsCQlnZXRhcmdzX24sIAkJCSBNRVRIX1ZBUkFSR1N9LAorICAgIHsiZ2V0YXJnc190dXBsZSIsICAgICAgICAgICBnZXRhcmdzX3R1cGxlLCAgICAgICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsiZ2V0YXJnc19rZXl3b3JkcyIsIChQeUNGdW5jdGlvbilnZXRhcmdzX2tleXdvcmRzLAorICAgICAgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFN9LAorICAgIHsiZ2V0YXJnc19iIiwgICAgICAgICAgICAgICBnZXRhcmdzX2IsICAgICAgICAgICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsiZ2V0YXJnc19CIiwgICAgICAgICAgICAgICBnZXRhcmdzX0IsICAgICAgICAgICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsiZ2V0YXJnc19IIiwgICAgICAgICAgICAgICBnZXRhcmdzX0gsICAgICAgICAgICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsiZ2V0YXJnc19JIiwgICAgICAgICAgICAgICBnZXRhcmdzX0ksICAgICAgICAgICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsiZ2V0YXJnc19rIiwgICAgICAgICAgICAgICBnZXRhcmdzX2ssICAgICAgICAgICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsiZ2V0YXJnc19pIiwgICAgICAgICAgICAgICBnZXRhcmdzX2ksICAgICAgICAgICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsiZ2V0YXJnc19sIiwgICAgICAgICAgICAgICBnZXRhcmdzX2wsICAgICAgICAgICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsiZ2V0YXJnc19uIiwgICAgICAgICAgICAgICBnZXRhcmdzX24sICAgICAgICAgICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1N9LAogI2lmZGVmIEhBVkVfTE9OR19MT05HCi0JeyJnZXRhcmdzX0wiLAkJZ2V0YXJnc19MLAkJCSBNRVRIX1ZBUkFSR1N9LAotCXsiZ2V0YXJnc19LIiwJCWdldGFyZ3NfSywJCQkgTUVUSF9WQVJBUkdTfSwKLQl7InRlc3RfbG9uZ2xvbmdfYXBpIiwJdGVzdF9sb25nbG9uZ19hcGksCQkgTUVUSF9OT0FSR1N9LAotCXsidGVzdF9MX2NvZGUiLAkJKFB5Q0Z1bmN0aW9uKXRlc3RfTF9jb2RlLAkgTUVUSF9OT0FSR1N9LAotCXsiY29kZWNfaW5jcmVtZW50YWxlbmNvZGVyIiwKLQkgKFB5Q0Z1bmN0aW9uKWNvZGVjX2luY3JlbWVudGFsZW5jb2RlciwJIE1FVEhfVkFSQVJHU30sCi0JeyJjb2RlY19pbmNyZW1lbnRhbGRlY29kZXIiLAotCSAoUHlDRnVuY3Rpb24pY29kZWNfaW5jcmVtZW50YWxkZWNvZGVyLAkgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImdldGFyZ3NfTCIsICAgICAgICAgICAgICAgZ2V0YXJnc19MLCAgICAgICAgICAgICAgICAgICAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImdldGFyZ3NfSyIsICAgICAgICAgICAgICAgZ2V0YXJnc19LLCAgICAgICAgICAgICAgICAgICAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7InRlc3RfbG9uZ2xvbmdfYXBpIiwgICAgICAgdGVzdF9sb25nbG9uZ19hcGksICAgICAgICAgICAgICAgTUVUSF9OT0FSR1N9LAorICAgIHsidGVzdF9MX2NvZGUiLCAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pdGVzdF9MX2NvZGUsICAgICAgICBNRVRIX05PQVJHU30sCisgICAgeyJjb2RlY19pbmNyZW1lbnRhbGVuY29kZXIiLAorICAgICAoUHlDRnVuY3Rpb24pY29kZWNfaW5jcmVtZW50YWxlbmNvZGVyLCAgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJjb2RlY19pbmNyZW1lbnRhbGRlY29kZXIiLAorICAgICAoUHlDRnVuY3Rpb24pY29kZWNfaW5jcmVtZW50YWxkZWNvZGVyLCAgICAgIE1FVEhfVkFSQVJHU30sCiAjZW5kaWYKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JeyJ0ZXN0X3VfY29kZSIsCQkoUHlDRnVuY3Rpb24pdGVzdF91X2NvZGUsCSBNRVRIX05PQVJHU30sCisgICAgeyJ0ZXN0X3VfY29kZSIsICAgICAgICAgICAgIChQeUNGdW5jdGlvbil0ZXN0X3VfY29kZSwgICAgICAgIE1FVEhfTk9BUkdTfSwKICNlbmRpZgogI2lmZGVmIFdJVEhfVEhSRUFECi0JeyJfdGVzdF90aHJlYWRfc3RhdGUiLCAgdGVzdF90aHJlYWRfc3RhdGUsIAkJIE1FVEhfVkFSQVJHU30sCisgICAgeyJfdGVzdF90aHJlYWRfc3RhdGUiLCAgdGVzdF90aHJlYWRfc3RhdGUsICAgICAgICAgICAgICAgICAgIE1FVEhfVkFSQVJHU30sCiAjZW5kaWYKLQl7InRyYWNlYmFja19wcmludCIsIHRyYWNlYmFja19wcmludCwgCSAgICAgICAgIE1FVEhfVkFSQVJHU30sCi0Je05VTEwsIE5VTEx9IC8qIHNlbnRpbmVsICovCisgICAgeyJ0cmFjZWJhY2tfcHJpbnQiLCB0cmFjZWJhY2tfcHJpbnQsICAgICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHtOVUxMLCBOVUxMfSAvKiBzZW50aW5lbCAqLwogfTsKIAogI2RlZmluZSBBZGRTeW0oZCwgbiwgZiwgdikge1B5T2JqZWN0ICpvID0gZih2KTsgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgbiwgbyk7IFB5X0RFQ1JFRihvKTt9CiAKIHR5cGVkZWYgc3RydWN0IHsKLQljaGFyIGJvb2xfbWVtYmVyOwotCWNoYXIgYnl0ZV9tZW1iZXI7Ci0JdW5zaWduZWQgY2hhciB1Ynl0ZV9tZW1iZXI7Ci0Jc2hvcnQgc2hvcnRfbWVtYmVyOwotCXVuc2lnbmVkIHNob3J0IHVzaG9ydF9tZW1iZXI7Ci0JaW50IGludF9tZW1iZXI7Ci0JdW5zaWduZWQgaW50IHVpbnRfbWVtYmVyOwotCWxvbmcgbG9uZ19tZW1iZXI7Ci0JdW5zaWduZWQgbG9uZyB1bG9uZ19tZW1iZXI7Ci0JZmxvYXQgZmxvYXRfbWVtYmVyOwotCWRvdWJsZSBkb3VibGVfbWVtYmVyOwotCWNoYXIgaW5wbGFjZV9tZW1iZXJbNl07CisgICAgY2hhciBib29sX21lbWJlcjsKKyAgICBjaGFyIGJ5dGVfbWVtYmVyOworICAgIHVuc2lnbmVkIGNoYXIgdWJ5dGVfbWVtYmVyOworICAgIHNob3J0IHNob3J0X21lbWJlcjsKKyAgICB1bnNpZ25lZCBzaG9ydCB1c2hvcnRfbWVtYmVyOworICAgIGludCBpbnRfbWVtYmVyOworICAgIHVuc2lnbmVkIGludCB1aW50X21lbWJlcjsKKyAgICBsb25nIGxvbmdfbWVtYmVyOworICAgIHVuc2lnbmVkIGxvbmcgdWxvbmdfbWVtYmVyOworICAgIGZsb2F0IGZsb2F0X21lbWJlcjsKKyAgICBkb3VibGUgZG91YmxlX21lbWJlcjsKKyAgICBjaGFyIGlucGxhY2VfbWVtYmVyWzZdOwogI2lmZGVmIEhBVkVfTE9OR19MT05HCi0JUFlfTE9OR19MT05HIGxvbmdsb25nX21lbWJlcjsKLQl1bnNpZ25lZCBQWV9MT05HX0xPTkcgdWxvbmdsb25nX21lbWJlcjsKKyAgICBQWV9MT05HX0xPTkcgbG9uZ2xvbmdfbWVtYmVyOworICAgIHVuc2lnbmVkIFBZX0xPTkdfTE9ORyB1bG9uZ2xvbmdfbWVtYmVyOwogI2VuZGlmCiB9IGFsbF9zdHJ1Y3RtZW1iZXJzOwogCiB0eXBlZGVmIHN0cnVjdCB7CiAgICAgUHlPYmplY3RfSEVBRAotCWFsbF9zdHJ1Y3RtZW1iZXJzIHN0cnVjdG1lbWJlcnM7CisgICAgYWxsX3N0cnVjdG1lbWJlcnMgc3RydWN0bWVtYmVyczsKIH0gdGVzdF9zdHJ1Y3RtZW1iZXJzOwogCiBzdGF0aWMgc3RydWN0IFB5TWVtYmVyRGVmIHRlc3RfbWVtYmVyc1tdID0gewotCXsiVF9CT09MIiwgVF9CT09MLCBvZmZzZXRvZih0ZXN0X3N0cnVjdG1lbWJlcnMsIHN0cnVjdG1lbWJlcnMuYm9vbF9tZW1iZXIpLCAwLCBOVUxMfSwKLQl7IlRfQllURSIsIFRfQllURSwgb2Zmc2V0b2YodGVzdF9zdHJ1Y3RtZW1iZXJzLCBzdHJ1Y3RtZW1iZXJzLmJ5dGVfbWVtYmVyKSwgMCwgTlVMTH0sCi0JeyJUX1VCWVRFIiwgVF9VQllURSwgb2Zmc2V0b2YodGVzdF9zdHJ1Y3RtZW1iZXJzLCBzdHJ1Y3RtZW1iZXJzLnVieXRlX21lbWJlciksIDAsIE5VTEx9LAotCXsiVF9TSE9SVCIsIFRfU0hPUlQsIG9mZnNldG9mKHRlc3Rfc3RydWN0bWVtYmVycywgc3RydWN0bWVtYmVycy5zaG9ydF9tZW1iZXIpLCAwLCBOVUxMfSwKLQl7IlRfVVNIT1JUIiwgVF9VU0hPUlQsIG9mZnNldG9mKHRlc3Rfc3RydWN0bWVtYmVycywgc3RydWN0bWVtYmVycy51c2hvcnRfbWVtYmVyKSwgMCwgTlVMTH0sCi0JeyJUX0lOVCIsIFRfSU5ULCBvZmZzZXRvZih0ZXN0X3N0cnVjdG1lbWJlcnMsIHN0cnVjdG1lbWJlcnMuaW50X21lbWJlciksIDAsIE5VTEx9LAotCXsiVF9VSU5UIiwgVF9VSU5ULCBvZmZzZXRvZih0ZXN0X3N0cnVjdG1lbWJlcnMsIHN0cnVjdG1lbWJlcnMudWludF9tZW1iZXIpLCAwLCBOVUxMfSwKLQl7IlRfTE9ORyIsIFRfTE9ORywgb2Zmc2V0b2YodGVzdF9zdHJ1Y3RtZW1iZXJzLCBzdHJ1Y3RtZW1iZXJzLmxvbmdfbWVtYmVyKSwgMCwgTlVMTH0sCi0JeyJUX1VMT05HIiwgVF9VTE9ORywgb2Zmc2V0b2YodGVzdF9zdHJ1Y3RtZW1iZXJzLCBzdHJ1Y3RtZW1iZXJzLnVsb25nX21lbWJlciksIDAsIE5VTEx9LAotCXsiVF9GTE9BVCIsIFRfRkxPQVQsIG9mZnNldG9mKHRlc3Rfc3RydWN0bWVtYmVycywgc3RydWN0bWVtYmVycy5mbG9hdF9tZW1iZXIpLCAwLCBOVUxMfSwKLQl7IlRfRE9VQkxFIiwgVF9ET1VCTEUsIG9mZnNldG9mKHRlc3Rfc3RydWN0bWVtYmVycywgc3RydWN0bWVtYmVycy5kb3VibGVfbWVtYmVyKSwgMCwgTlVMTH0sCi0JeyJUX1NUUklOR19JTlBMQUNFIiwgVF9TVFJJTkdfSU5QTEFDRSwgb2Zmc2V0b2YodGVzdF9zdHJ1Y3RtZW1iZXJzLCBzdHJ1Y3RtZW1iZXJzLmlucGxhY2VfbWVtYmVyKSwgMCwgTlVMTH0sCisgICAgeyJUX0JPT0wiLCBUX0JPT0wsIG9mZnNldG9mKHRlc3Rfc3RydWN0bWVtYmVycywgc3RydWN0bWVtYmVycy5ib29sX21lbWJlciksIDAsIE5VTEx9LAorICAgIHsiVF9CWVRFIiwgVF9CWVRFLCBvZmZzZXRvZih0ZXN0X3N0cnVjdG1lbWJlcnMsIHN0cnVjdG1lbWJlcnMuYnl0ZV9tZW1iZXIpLCAwLCBOVUxMfSwKKyAgICB7IlRfVUJZVEUiLCBUX1VCWVRFLCBvZmZzZXRvZih0ZXN0X3N0cnVjdG1lbWJlcnMsIHN0cnVjdG1lbWJlcnMudWJ5dGVfbWVtYmVyKSwgMCwgTlVMTH0sCisgICAgeyJUX1NIT1JUIiwgVF9TSE9SVCwgb2Zmc2V0b2YodGVzdF9zdHJ1Y3RtZW1iZXJzLCBzdHJ1Y3RtZW1iZXJzLnNob3J0X21lbWJlciksIDAsIE5VTEx9LAorICAgIHsiVF9VU0hPUlQiLCBUX1VTSE9SVCwgb2Zmc2V0b2YodGVzdF9zdHJ1Y3RtZW1iZXJzLCBzdHJ1Y3RtZW1iZXJzLnVzaG9ydF9tZW1iZXIpLCAwLCBOVUxMfSwKKyAgICB7IlRfSU5UIiwgVF9JTlQsIG9mZnNldG9mKHRlc3Rfc3RydWN0bWVtYmVycywgc3RydWN0bWVtYmVycy5pbnRfbWVtYmVyKSwgMCwgTlVMTH0sCisgICAgeyJUX1VJTlQiLCBUX1VJTlQsIG9mZnNldG9mKHRlc3Rfc3RydWN0bWVtYmVycywgc3RydWN0bWVtYmVycy51aW50X21lbWJlciksIDAsIE5VTEx9LAorICAgIHsiVF9MT05HIiwgVF9MT05HLCBvZmZzZXRvZih0ZXN0X3N0cnVjdG1lbWJlcnMsIHN0cnVjdG1lbWJlcnMubG9uZ19tZW1iZXIpLCAwLCBOVUxMfSwKKyAgICB7IlRfVUxPTkciLCBUX1VMT05HLCBvZmZzZXRvZih0ZXN0X3N0cnVjdG1lbWJlcnMsIHN0cnVjdG1lbWJlcnMudWxvbmdfbWVtYmVyKSwgMCwgTlVMTH0sCisgICAgeyJUX0ZMT0FUIiwgVF9GTE9BVCwgb2Zmc2V0b2YodGVzdF9zdHJ1Y3RtZW1iZXJzLCBzdHJ1Y3RtZW1iZXJzLmZsb2F0X21lbWJlciksIDAsIE5VTEx9LAorICAgIHsiVF9ET1VCTEUiLCBUX0RPVUJMRSwgb2Zmc2V0b2YodGVzdF9zdHJ1Y3RtZW1iZXJzLCBzdHJ1Y3RtZW1iZXJzLmRvdWJsZV9tZW1iZXIpLCAwLCBOVUxMfSwKKyAgICB7IlRfU1RSSU5HX0lOUExBQ0UiLCBUX1NUUklOR19JTlBMQUNFLCBvZmZzZXRvZih0ZXN0X3N0cnVjdG1lbWJlcnMsIHN0cnVjdG1lbWJlcnMuaW5wbGFjZV9tZW1iZXIpLCAwLCBOVUxMfSwKICNpZmRlZiBIQVZFX0xPTkdfTE9ORwotCXsiVF9MT05HTE9ORyIsIFRfTE9OR0xPTkcsIG9mZnNldG9mKHRlc3Rfc3RydWN0bWVtYmVycywgc3RydWN0bWVtYmVycy5sb25nbG9uZ19tZW1iZXIpLCAwLCBOVUxMfSwKLQl7IlRfVUxPTkdMT05HIiwgVF9VTE9OR0xPTkcsIG9mZnNldG9mKHRlc3Rfc3RydWN0bWVtYmVycywgc3RydWN0bWVtYmVycy51bG9uZ2xvbmdfbWVtYmVyKSwgMCwgTlVMTH0sCisgICAgeyJUX0xPTkdMT05HIiwgVF9MT05HTE9ORywgb2Zmc2V0b2YodGVzdF9zdHJ1Y3RtZW1iZXJzLCBzdHJ1Y3RtZW1iZXJzLmxvbmdsb25nX21lbWJlciksIDAsIE5VTEx9LAorICAgIHsiVF9VTE9OR0xPTkciLCBUX1VMT05HTE9ORywgb2Zmc2V0b2YodGVzdF9zdHJ1Y3RtZW1iZXJzLCBzdHJ1Y3RtZW1iZXJzLnVsb25nbG9uZ19tZW1iZXIpLCAwLCBOVUxMfSwKICNlbmRpZgotCXtOVUxMfQorICAgIHtOVUxMfQogfTsKIAogCiBzdGF0aWMgUHlPYmplY3QgKgogdGVzdF9zdHJ1Y3RtZW1iZXJzX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewotCXN0YXRpYyBjaGFyICprZXl3b3Jkc1tdID0gewotCQkiVF9CT09MIiwgIlRfQllURSIsICJUX1VCWVRFIiwgIlRfU0hPUlQiLCAiVF9VU0hPUlQiLAotCQkiVF9JTlQiLCAiVF9VSU5UIiwgIlRfTE9ORyIsICJUX1VMT05HIiwKLQkJIlRfRkxPQVQiLCAiVF9ET1VCTEUiLCAiVF9TVFJJTkdfSU5QTEFDRSIsCi0jaWZkZWYgSEFWRV9MT05HX0xPTkcJCi0JCSJUX0xPTkdMT05HIiwgIlRfVUxPTkdMT05HIiwKLSNlbmRpZgotCQlOVUxMfTsKLQlzdGF0aWMgY2hhciAqZm10ID0gInxiYkJoSGlJbGtmZHMjIgorICAgIHN0YXRpYyBjaGFyICprZXl3b3Jkc1tdID0geworICAgICAgICAiVF9CT09MIiwgIlRfQllURSIsICJUX1VCWVRFIiwgIlRfU0hPUlQiLCAiVF9VU0hPUlQiLAorICAgICAgICAiVF9JTlQiLCAiVF9VSU5UIiwgIlRfTE9ORyIsICJUX1VMT05HIiwKKyAgICAgICAgIlRfRkxPQVQiLCAiVF9ET1VCTEUiLCAiVF9TVFJJTkdfSU5QTEFDRSIsCiAjaWZkZWYgSEFWRV9MT05HX0xPTkcKLQkJIkxLIgorICAgICAgICAiVF9MT05HTE9ORyIsICJUX1VMT05HTE9ORyIsCiAjZW5kaWYKLQkJOwotCXRlc3Rfc3RydWN0bWVtYmVycyAqb2I7Ci0JY29uc3QgY2hhciAqcyA9IE5VTEw7Ci0JUHlfc3NpemVfdCBzdHJpbmdfbGVuID0gMDsKLQlvYiA9IFB5T2JqZWN0X05ldyh0ZXN0X3N0cnVjdG1lbWJlcnMsIHR5cGUpOwotCWlmIChvYiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQltZW1zZXQoJm9iLT5zdHJ1Y3RtZW1iZXJzLCAwLCBzaXplb2YoYWxsX3N0cnVjdG1lbWJlcnMpKTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsIGZtdCwga2V5d29yZHMsCi0JCQkJCSAmb2ItPnN0cnVjdG1lbWJlcnMuYm9vbF9tZW1iZXIsCi0JCQkJCSAmb2ItPnN0cnVjdG1lbWJlcnMuYnl0ZV9tZW1iZXIsCi0JCQkJCSAmb2ItPnN0cnVjdG1lbWJlcnMudWJ5dGVfbWVtYmVyLAotCQkJCQkgJm9iLT5zdHJ1Y3RtZW1iZXJzLnNob3J0X21lbWJlciwKLQkJCQkJICZvYi0+c3RydWN0bWVtYmVycy51c2hvcnRfbWVtYmVyLAotCQkJCQkgJm9iLT5zdHJ1Y3RtZW1iZXJzLmludF9tZW1iZXIsCi0JCQkJCSAmb2ItPnN0cnVjdG1lbWJlcnMudWludF9tZW1iZXIsCi0JCQkJCSAmb2ItPnN0cnVjdG1lbWJlcnMubG9uZ19tZW1iZXIsCi0JCQkJCSAmb2ItPnN0cnVjdG1lbWJlcnMudWxvbmdfbWVtYmVyLAotCQkJCQkgJm9iLT5zdHJ1Y3RtZW1iZXJzLmZsb2F0X21lbWJlciwKLQkJCQkJICZvYi0+c3RydWN0bWVtYmVycy5kb3VibGVfbWVtYmVyLAotCQkJCQkgJnMsICZzdHJpbmdfbGVuCisgICAgICAgIE5VTEx9OworICAgIHN0YXRpYyBjaGFyICpmbXQgPSAifGJiQmhIaUlsa2ZkcyMiCiAjaWZkZWYgSEFWRV9MT05HX0xPTkcKLQkJCQkJICwgJm9iLT5zdHJ1Y3RtZW1iZXJzLmxvbmdsb25nX21lbWJlciwKLQkJCQkJICZvYi0+c3RydWN0bWVtYmVycy51bG9uZ2xvbmdfbWVtYmVyCisgICAgICAgICJMSyIKICNlbmRpZgotCQkpKSB7Ci0JCVB5X0RFQ1JFRihvYik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAocyAhPSBOVUxMKSB7Ci0JCWlmIChzdHJpbmdfbGVuID4gNSkgewotCQkJUHlfREVDUkVGKG9iKTsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAic3RyaW5nIHRvbyBsb25nIik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlzdHJjcHkob2ItPnN0cnVjdG1lbWJlcnMuaW5wbGFjZV9tZW1iZXIsIHMpOwotCX0KLQllbHNlIHsKLQkJc3RyY3B5KG9iLT5zdHJ1Y3RtZW1iZXJzLmlucGxhY2VfbWVtYmVyLCAiIik7Ci0JfQotCXJldHVybiAoUHlPYmplY3QgKilvYjsKKyAgICAgICAgOworICAgIHRlc3Rfc3RydWN0bWVtYmVycyAqb2I7CisgICAgY29uc3QgY2hhciAqcyA9IE5VTEw7CisgICAgUHlfc3NpemVfdCBzdHJpbmdfbGVuID0gMDsKKyAgICBvYiA9IFB5T2JqZWN0X05ldyh0ZXN0X3N0cnVjdG1lbWJlcnMsIHR5cGUpOworICAgIGlmIChvYiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBtZW1zZXQoJm9iLT5zdHJ1Y3RtZW1iZXJzLCAwLCBzaXplb2YoYWxsX3N0cnVjdG1lbWJlcnMpKTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsIGZtdCwga2V5d29yZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9iLT5zdHJ1Y3RtZW1iZXJzLmJvb2xfbWVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvYi0+c3RydWN0bWVtYmVycy5ieXRlX21lbWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2ItPnN0cnVjdG1lbWJlcnMudWJ5dGVfbWVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvYi0+c3RydWN0bWVtYmVycy5zaG9ydF9tZW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9iLT5zdHJ1Y3RtZW1iZXJzLnVzaG9ydF9tZW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9iLT5zdHJ1Y3RtZW1iZXJzLmludF9tZW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9iLT5zdHJ1Y3RtZW1iZXJzLnVpbnRfbWVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvYi0+c3RydWN0bWVtYmVycy5sb25nX21lbWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2ItPnN0cnVjdG1lbWJlcnMudWxvbmdfbWVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvYi0+c3RydWN0bWVtYmVycy5mbG9hdF9tZW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9iLT5zdHJ1Y3RtZW1iZXJzLmRvdWJsZV9tZW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnMsICZzdHJpbmdfbGVuCisjaWZkZWYgSEFWRV9MT05HX0xPTkcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICZvYi0+c3RydWN0bWVtYmVycy5sb25nbG9uZ19tZW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9iLT5zdHJ1Y3RtZW1iZXJzLnVsb25nbG9uZ19tZW1iZXIKKyNlbmRpZgorICAgICAgICApKSB7CisgICAgICAgIFB5X0RFQ1JFRihvYik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAocyAhPSBOVUxMKSB7CisgICAgICAgIGlmIChzdHJpbmdfbGVuID4gNSkgeworICAgICAgICAgICAgUHlfREVDUkVGKG9iKTsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAic3RyaW5nIHRvbyBsb25nIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBzdHJjcHkob2ItPnN0cnVjdG1lbWJlcnMuaW5wbGFjZV9tZW1iZXIsIHMpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgc3RyY3B5KG9iLT5zdHJ1Y3RtZW1iZXJzLmlucGxhY2VfbWVtYmVyLCAiIik7CisgICAgfQorICAgIHJldHVybiAoUHlPYmplY3QgKilvYjsKIH0KIAogc3RhdGljIHZvaWQKIHRlc3Rfc3RydWN0bWVtYmVyc19mcmVlKFB5T2JqZWN0ICpvYikKIHsKLQlQeU9iamVjdF9GUkVFKG9iKTsKKyAgICBQeU9iamVjdF9GUkVFKG9iKTsKIH0KIAogc3RhdGljIFB5VHlwZU9iamVjdCB0ZXN0X3N0cnVjdG1lbWJlcnNUeXBlID0gewogICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotCSJ0ZXN0X3N0cnVjdG1lbWJlcnNUeXBlIiwKLQlzaXplb2YodGVzdF9zdHJ1Y3RtZW1iZXJzKSwJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJLyogdHBfaXRlbXNpemUgKi8KLQl0ZXN0X3N0cnVjdG1lbWJlcnNfZnJlZSwJLyogZGVzdHJ1Y3RvciB0cF9kZWFsbG9jICovCi0JMCwJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkwLAkJCQkvKiB0cF9yZXByICovCi0JMCwJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkvKiB0cF9zdHIgKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJLyogdHBfZ2V0YXR0cm8gKi8KLQlQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQkwLAkJCQkvKiB0cF9mbGFncyAqLwotCSJUeXBlIGNvbnRhaW5pbmcgYWxsIHN0cnVjdG1lbWJlciB0eXBlcyIsCi0JMCwJCQkJLyogdHJhdmVyc2Vwcm9jIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JMCwJCQkJLyogdHBfaXRlciAqLwotCTAsCQkJCS8qIHRwX2l0ZXJuZXh0ICovCi0JMCwJCQkJLyogdHBfbWV0aG9kcyAqLwotCXRlc3RfbWVtYmVycywJCQkvKiB0cF9tZW1iZXJzICovCi0JMCwKLQkwLAotCTAsCi0JMCwKLQkwLAotCTAsCi0JMCwKLQkwLAotCXRlc3Rfc3RydWN0bWVtYmVyc19uZXcsCSAgICAgICAJLyogdHBfbmV3ICovCisgICAgInRlc3Rfc3RydWN0bWVtYmVyc1R5cGUiLAorICAgIHNpemVvZih0ZXN0X3N0cnVjdG1lbWJlcnMpLCAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgdGVzdF9zdHJ1Y3RtZW1iZXJzX2ZyZWUsICAgICAgICAgICAgLyogZGVzdHJ1Y3RvciB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICAiVHlwZSBjb250YWluaW5nIGFsbCBzdHJ1Y3RtZW1iZXIgdHlwZXMiLAorICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRyYXZlcnNlcHJvYyB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICB0ZXN0X21lbWJlcnMsICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwKKyAgICAwLAorICAgIDAsCisgICAgMCwKKyAgICAwLAorICAgIDAsCisgICAgMCwKKyAgICAwLAorICAgIHRlc3Rfc3RydWN0bWVtYmVyc19uZXcsICAgICAgICAgICAgIC8qIHRwX25ldyAqLwogfTsKIAogCiBQeU1PRElOSVRfRlVOQwogaW5pdF90ZXN0Y2FwaSh2b2lkKQogewotCVB5T2JqZWN0ICptOworICAgIFB5T2JqZWN0ICptOwogCi0JbSA9IFB5X0luaXRNb2R1bGUoIl90ZXN0Y2FwaSIsIFRlc3RNZXRob2RzKTsKLQlpZiAobSA9PSBOVUxMKQotCQlyZXR1cm47CisgICAgbSA9IFB5X0luaXRNb2R1bGUoIl90ZXN0Y2FwaSIsIFRlc3RNZXRob2RzKTsKKyAgICBpZiAobSA9PSBOVUxMKQorICAgICAgICByZXR1cm47CiAKLQlQeV9UWVBFKCZfSGFzaEluaGVyaXRhbmNlVGVzdGVyX1R5cGUpPSZQeVR5cGVfVHlwZTsKKyAgICBQeV9UWVBFKCZfSGFzaEluaGVyaXRhbmNlVGVzdGVyX1R5cGUpPSZQeVR5cGVfVHlwZTsKIAotCVB5X1RZUEUoJnRlc3Rfc3RydWN0bWVtYmVyc1R5cGUpPSZQeVR5cGVfVHlwZTsKLQlQeV9JTkNSRUYoJnRlc3Rfc3RydWN0bWVtYmVyc1R5cGUpOwotCS8qIGRvbid0IHVzZSBhIG5hbWUgc3RhcnRpbmcgd2l0aCAidGVzdCIsIHNpbmNlIHdlIGRvbid0IHdhbnQKLQkgICB0ZXN0X2NhcGkgdG8gYXV0b21hdGljYWxseSBjYWxsIHRoaXMgKi8KLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIl90ZXN0X3N0cnVjdG1lbWJlcnNUeXBlIiwgKFB5T2JqZWN0ICopJnRlc3Rfc3RydWN0bWVtYmVyc1R5cGUpOworICAgIFB5X1RZUEUoJnRlc3Rfc3RydWN0bWVtYmVyc1R5cGUpPSZQeVR5cGVfVHlwZTsKKyAgICBQeV9JTkNSRUYoJnRlc3Rfc3RydWN0bWVtYmVyc1R5cGUpOworICAgIC8qIGRvbid0IHVzZSBhIG5hbWUgc3RhcnRpbmcgd2l0aCAidGVzdCIsIHNpbmNlIHdlIGRvbid0IHdhbnQKKyAgICAgICB0ZXN0X2NhcGkgdG8gYXV0b21hdGljYWxseSBjYWxsIHRoaXMgKi8KKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIl90ZXN0X3N0cnVjdG1lbWJlcnNUeXBlIiwgKFB5T2JqZWN0ICopJnRlc3Rfc3RydWN0bWVtYmVyc1R5cGUpOwogCi0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJDSEFSX01BWCIsIFB5SW50X0Zyb21Mb25nKENIQVJfTUFYKSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJDSEFSX01JTiIsIFB5SW50X0Zyb21Mb25nKENIQVJfTUlOKSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJVQ0hBUl9NQVgiLCBQeUludF9Gcm9tTG9uZyhVQ0hBUl9NQVgpKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIlNIUlRfTUFYIiwgUHlJbnRfRnJvbUxvbmcoU0hSVF9NQVgpKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIlNIUlRfTUlOIiwgUHlJbnRfRnJvbUxvbmcoU0hSVF9NSU4pKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIlVTSFJUX01BWCIsIFB5SW50X0Zyb21Mb25nKFVTSFJUX01BWCkpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiSU5UX01BWCIsICBQeUxvbmdfRnJvbUxvbmcoSU5UX01BWCkpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiSU5UX01JTiIsICBQeUxvbmdfRnJvbUxvbmcoSU5UX01JTikpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiVUlOVF9NQVgiLCAgUHlMb25nX0Zyb21VbnNpZ25lZExvbmcoVUlOVF9NQVgpKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkxPTkdfTUFYIiwgUHlJbnRfRnJvbUxvbmcoTE9OR19NQVgpKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkxPTkdfTUlOIiwgUHlJbnRfRnJvbUxvbmcoTE9OR19NSU4pKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIlVMT05HX01BWCIsIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKFVMT05HX01BWCkpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiRkxUX01BWCIsIFB5RmxvYXRfRnJvbURvdWJsZShGTFRfTUFYKSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJGTFRfTUlOIiwgUHlGbG9hdF9Gcm9tRG91YmxlKEZMVF9NSU4pKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkRCTF9NQVgiLCBQeUZsb2F0X0Zyb21Eb3VibGUoREJMX01BWCkpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiREJMX01JTiIsIFB5RmxvYXRfRnJvbURvdWJsZShEQkxfTUlOKSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJMTE9OR19NQVgiLCBQeUxvbmdfRnJvbUxvbmdMb25nKFBZX0xMT05HX01BWCkpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiTExPTkdfTUlOIiwgUHlMb25nX0Zyb21Mb25nTG9uZyhQWV9MTE9OR19NSU4pKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIlVMTE9OR19NQVgiLCBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZ0xvbmcoUFlfVUxMT05HX01BWCkpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiUFlfU1NJWkVfVF9NQVgiLCBQeUludF9Gcm9tU3NpemVfdChQWV9TU0laRV9UX01BWCkpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiUFlfU1NJWkVfVF9NSU4iLCBQeUludF9Gcm9tU3NpemVfdChQWV9TU0laRV9UX01JTikpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiU0laRU9GX1BZR0NfSEVBRCIsIFB5SW50X0Zyb21Tc2l6ZV90KHNpemVvZihQeUdDX0hlYWQpKSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJDSEFSX01BWCIsIFB5SW50X0Zyb21Mb25nKENIQVJfTUFYKSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJDSEFSX01JTiIsIFB5SW50X0Zyb21Mb25nKENIQVJfTUlOKSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJVQ0hBUl9NQVgiLCBQeUludF9Gcm9tTG9uZyhVQ0hBUl9NQVgpKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIlNIUlRfTUFYIiwgUHlJbnRfRnJvbUxvbmcoU0hSVF9NQVgpKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIlNIUlRfTUlOIiwgUHlJbnRfRnJvbUxvbmcoU0hSVF9NSU4pKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIlVTSFJUX01BWCIsIFB5SW50X0Zyb21Mb25nKFVTSFJUX01BWCkpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiSU5UX01BWCIsICBQeUxvbmdfRnJvbUxvbmcoSU5UX01BWCkpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiSU5UX01JTiIsICBQeUxvbmdfRnJvbUxvbmcoSU5UX01JTikpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiVUlOVF9NQVgiLCAgUHlMb25nX0Zyb21VbnNpZ25lZExvbmcoVUlOVF9NQVgpKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkxPTkdfTUFYIiwgUHlJbnRfRnJvbUxvbmcoTE9OR19NQVgpKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkxPTkdfTUlOIiwgUHlJbnRfRnJvbUxvbmcoTE9OR19NSU4pKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIlVMT05HX01BWCIsIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKFVMT05HX01BWCkpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiRkxUX01BWCIsIFB5RmxvYXRfRnJvbURvdWJsZShGTFRfTUFYKSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJGTFRfTUlOIiwgUHlGbG9hdF9Gcm9tRG91YmxlKEZMVF9NSU4pKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkRCTF9NQVgiLCBQeUZsb2F0X0Zyb21Eb3VibGUoREJMX01BWCkpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiREJMX01JTiIsIFB5RmxvYXRfRnJvbURvdWJsZShEQkxfTUlOKSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJMTE9OR19NQVgiLCBQeUxvbmdfRnJvbUxvbmdMb25nKFBZX0xMT05HX01BWCkpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiTExPTkdfTUlOIiwgUHlMb25nX0Zyb21Mb25nTG9uZyhQWV9MTE9OR19NSU4pKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIlVMTE9OR19NQVgiLCBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZ0xvbmcoUFlfVUxMT05HX01BWCkpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiUFlfU1NJWkVfVF9NQVgiLCBQeUludF9Gcm9tU3NpemVfdChQWV9TU0laRV9UX01BWCkpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiUFlfU1NJWkVfVF9NSU4iLCBQeUludF9Gcm9tU3NpemVfdChQWV9TU0laRV9UX01JTikpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiU0laRU9GX1BZR0NfSEVBRCIsIFB5SW50X0Zyb21Tc2l6ZV90KHNpemVvZihQeUdDX0hlYWQpKSk7CiAKLQlUZXN0RXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oIl90ZXN0Y2FwaS5lcnJvciIsIE5VTEwsIE5VTEwpOwotCVB5X0lOQ1JFRihUZXN0RXJyb3IpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiZXJyb3IiLCBUZXN0RXJyb3IpOworICAgIFRlc3RFcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbigiX3Rlc3RjYXBpLmVycm9yIiwgTlVMTCwgTlVMTCk7CisgICAgUHlfSU5DUkVGKFRlc3RFcnJvcik7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJlcnJvciIsIFRlc3RFcnJvcik7CiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL190a2ludGVyLmMgYi9Nb2R1bGVzL190a2ludGVyLmMKaW5kZXggODM1MDFiZi4uYjg5MjliNiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fdGtpbnRlci5jCisrKyBiL01vZHVsZXMvX3RraW50ZXIuYwpAQCAtOSw5ICs5LDkgQEAKIAogLyogVENML1RLIFZFUlNJT04gSU5GTzoKIAotCU9ubHkgVGNsL1RrIDguMiBhbmQgbGF0ZXIgYXJlIHN1cHBvcnRlZC4gIE9sZGVyIHZlcnNpb25zIGFyZSBub3QKLQlzdXBwb3J0ZWQuICAoVXNlIFB5dGhvbiAyLjIgaWYgeW91IGNhbm5vdCB1cGdyYWRlIHlvdXIgVGNsL1RrCi0JbGlicmFyaWVzLikKKyAgICBPbmx5IFRjbC9UayA4LjIgYW5kIGxhdGVyIGFyZSBzdXBwb3J0ZWQuICBPbGRlciB2ZXJzaW9ucyBhcmUgbm90CisgICAgc3VwcG9ydGVkLiAgKFVzZSBQeXRob24gMi4yIGlmIHlvdSBjYW5ub3QgdXBncmFkZSB5b3VyIFRjbC9UaworICAgIGxpYnJhcmllcy4pCiAqLwogCiAvKiBYWFggRnVydGhlciBzcGVlZC11cCBpZGVhcywgaW52b2x2aW5nIFRjbCA4LjAgZmVhdHVyZXM6CkBAIC04Myw4ICs4Myw4IEBACiAvKiBVbmljb2RlIGNvbnZlcnNpb24gYXNzdW1lcyB0aGF0IFRjbF9VbmlDaGFyIGlzIHR3byBieXRlcy4KICAgIFdlIGNhbm5vdCB0ZXN0IHRoaXMgZGlyZWN0bHksIHNvIHdlIHRlc3QgVVRGLTggc2l6ZSBpbnN0ZWFkLAogICAgZXhwZWN0aW5nIHRoYXQgVENMX1VURl9NQVggaXMgY2hhbmdlZCBpZiBUY2wgZXZlciBzdXBwb3J0cwotICAgZWl0aGVyIFVURi0xNiBvciBVQ1MtNC4gIAotICAgUmVkaGF0IDggc2V0cyBUQ0xfVVRGX01BWCB0byA2LCBhbmQgdXNlcyB3Y2hhcl90IGZvciAKKyAgIGVpdGhlciBVVEYtMTYgb3IgVUNTLTQuCisgICBSZWRoYXQgOCBzZXRzIFRDTF9VVEZfTUFYIHRvIDYsIGFuZCB1c2VzIHdjaGFyX3QgZm9yCiAgICBUY2xfVW5pY2hhci4gVGhpcyBpcyBhbHNvIG9rIGFzIGxvbmcgYXMgUHl0aG9uIHVzZXMgVUNTLTQsCiAgICBhcyB3ZWxsLgogKi8KQEAgLTE5NywzMiArMTk3LDMyIEBACiAjZW5kaWYKIAogI2RlZmluZSBFTlRFUl9UQ0wgXAotCXsgUHlUaHJlYWRTdGF0ZSAqdHN0YXRlID0gUHlUaHJlYWRTdGF0ZV9HZXQoKTsgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUyBcCi0JICAgIGlmKHRjbF9sb2NrKVB5VGhyZWFkX2FjcXVpcmVfbG9jayh0Y2xfbG9jaywgMSk7IHRjbF90c3RhdGUgPSB0c3RhdGU7CisgICAgeyBQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dldCgpOyBQeV9CRUdJTl9BTExPV19USFJFQURTIFwKKyAgICAgICAgaWYodGNsX2xvY2spUHlUaHJlYWRfYWNxdWlyZV9sb2NrKHRjbF9sb2NrLCAxKTsgdGNsX3RzdGF0ZSA9IHRzdGF0ZTsKIAogI2RlZmluZSBMRUFWRV9UQ0wgXAogICAgIHRjbF90c3RhdGUgPSBOVUxMOyBpZih0Y2xfbG9jaylQeVRocmVhZF9yZWxlYXNlX2xvY2sodGNsX2xvY2spOyBQeV9FTkRfQUxMT1dfVEhSRUFEU30KIAogI2RlZmluZSBFTlRFUl9PVkVSTEFQIFwKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIFB5X0VORF9BTExPV19USFJFQURTCiAKICNkZWZpbmUgTEVBVkVfT1ZFUkxBUF9UQ0wgXAotCXRjbF90c3RhdGUgPSBOVUxMOyBpZih0Y2xfbG9jaylQeVRocmVhZF9yZWxlYXNlX2xvY2sodGNsX2xvY2spOyB9CisgICAgdGNsX3RzdGF0ZSA9IE5VTEw7IGlmKHRjbF9sb2NrKVB5VGhyZWFkX3JlbGVhc2VfbG9jayh0Y2xfbG9jayk7IH0KIAogI2RlZmluZSBFTlRFUl9QWVRIT04gXAotCXsgUHlUaHJlYWRTdGF0ZSAqdHN0YXRlID0gdGNsX3RzdGF0ZTsgdGNsX3RzdGF0ZSA9IE5VTEw7IFwKLQkgICAgaWYodGNsX2xvY2spUHlUaHJlYWRfcmVsZWFzZV9sb2NrKHRjbF9sb2NrKTsgUHlFdmFsX1Jlc3RvcmVUaHJlYWQoKHRzdGF0ZSkpOyB9CisgICAgeyBQeVRocmVhZFN0YXRlICp0c3RhdGUgPSB0Y2xfdHN0YXRlOyB0Y2xfdHN0YXRlID0gTlVMTDsgXAorICAgICAgICBpZih0Y2xfbG9jaylQeVRocmVhZF9yZWxlYXNlX2xvY2sodGNsX2xvY2spOyBQeUV2YWxfUmVzdG9yZVRocmVhZCgodHN0YXRlKSk7IH0KIAogI2RlZmluZSBMRUFWRV9QWVRIT04gXAotCXsgUHlUaHJlYWRTdGF0ZSAqdHN0YXRlID0gUHlFdmFsX1NhdmVUaHJlYWQoKTsgXAotCSAgICBpZih0Y2xfbG9jaylQeVRocmVhZF9hY3F1aXJlX2xvY2sodGNsX2xvY2ssIDEpOyB0Y2xfdHN0YXRlID0gdHN0YXRlOyB9CisgICAgeyBQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeUV2YWxfU2F2ZVRocmVhZCgpOyBcCisgICAgICAgIGlmKHRjbF9sb2NrKVB5VGhyZWFkX2FjcXVpcmVfbG9jayh0Y2xfbG9jaywgMSk7IHRjbF90c3RhdGUgPSB0c3RhdGU7IH0KIAogI2RlZmluZSBDSEVDS19UQ0xfQVBQQVJUTUVOVCBcCi0JaWYgKCgoVGthcHBPYmplY3QgKilzZWxmKS0+dGhyZWFkZWQgJiYgXAotCSAgICAoKFRrYXBwT2JqZWN0ICopc2VsZiktPnRocmVhZF9pZCAhPSBUY2xfR2V0Q3VycmVudFRocmVhZCgpKSB7IFwKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgIkNhbGxpbmcgVGNsIGZyb20gZGlmZmVyZW50IGFwcGFydG1lbnQiKTsgXAotCQlyZXR1cm4gMDsgXAotCX0KKyAgICBpZiAoKChUa2FwcE9iamVjdCAqKXNlbGYpLT50aHJlYWRlZCAmJiBcCisgICAgICAgICgoVGthcHBPYmplY3QgKilzZWxmKS0+dGhyZWFkX2lkICE9IFRjbF9HZXRDdXJyZW50VGhyZWFkKCkpIHsgXAorICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAiQ2FsbGluZyBUY2wgZnJvbSBkaWZmZXJlbnQgYXBwYXJ0bWVudCIpOyBcCisgICAgICAgIHJldHVybiAwOyBcCisgICAgfQogCiAjZWxzZQogCkBAIC0yNDUsMjEgKzI0NSwyMSBAQAogc3RhdGljIFB5VHlwZU9iamVjdCBUa2FwcF9UeXBlOwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCVRjbF9JbnRlcnAgKmludGVycDsKLQlpbnQgd2FudG9iamVjdHM7Ci0JaW50IHRocmVhZGVkOyAvKiBUcnVlIGlmIHRjbF9wbGF0Zm9ybVt0aHJlYWRlZF0gKi8KLQlUY2xfVGhyZWFkSWQgdGhyZWFkX2lkOwotCWludCBkaXNwYXRjaGluZzsKLQkvKiBXZSBjYW5ub3QgaW5jbHVkZSB0Y2xJbnQuaCwgYXMgdGhpcyBpcyBpbnRlcm5hbC4KLQkgICBTbyB3ZSBjYWNoZSBpbnRlcmVzdGluZyB0eXBlcyBoZXJlLiAqLwotCVRjbF9PYmpUeXBlICpCb29sZWFuVHlwZTsKLQlUY2xfT2JqVHlwZSAqQnl0ZUFycmF5VHlwZTsKLQlUY2xfT2JqVHlwZSAqRG91YmxlVHlwZTsKLQlUY2xfT2JqVHlwZSAqSW50VHlwZTsKLQlUY2xfT2JqVHlwZSAqTGlzdFR5cGU7Ci0JVGNsX09ialR5cGUgKlByb2NCb2R5VHlwZTsKLQlUY2xfT2JqVHlwZSAqU3RyaW5nVHlwZTsKKyAgICBQeU9iamVjdF9IRUFECisgICAgVGNsX0ludGVycCAqaW50ZXJwOworICAgIGludCB3YW50b2JqZWN0czsKKyAgICBpbnQgdGhyZWFkZWQ7IC8qIFRydWUgaWYgdGNsX3BsYXRmb3JtW3RocmVhZGVkXSAqLworICAgIFRjbF9UaHJlYWRJZCB0aHJlYWRfaWQ7CisgICAgaW50IGRpc3BhdGNoaW5nOworICAgIC8qIFdlIGNhbm5vdCBpbmNsdWRlIHRjbEludC5oLCBhcyB0aGlzIGlzIGludGVybmFsLgorICAgICAgIFNvIHdlIGNhY2hlIGludGVyZXN0aW5nIHR5cGVzIGhlcmUuICovCisgICAgVGNsX09ialR5cGUgKkJvb2xlYW5UeXBlOworICAgIFRjbF9PYmpUeXBlICpCeXRlQXJyYXlUeXBlOworICAgIFRjbF9PYmpUeXBlICpEb3VibGVUeXBlOworICAgIFRjbF9PYmpUeXBlICpJbnRUeXBlOworICAgIFRjbF9PYmpUeXBlICpMaXN0VHlwZTsKKyAgICBUY2xfT2JqVHlwZSAqUHJvY0JvZHlUeXBlOworICAgIFRjbF9PYmpUeXBlICpTdHJpbmdUeXBlOwogfSBUa2FwcE9iamVjdDsKIAogI2RlZmluZSBUa2FwcF9DaGVjayh2KSAoUHlfVFlQRSh2KSA9PSAmVGthcHBfVHlwZSkKQEAgLTI3MCw3ICsyNzAsNyBAQAogKHZvaWQgKikgdiwgUHlfUkVGQ05UKHYpKSkKIAogCi0MCisKIC8qKioqIEVycm9yIEhhbmRsaW5nICoqKiovCiAKIHN0YXRpYyBQeU9iamVjdCAqVGtpbnRlcl9UY2xFcnJvcjsKQEAgLTI4MSwxNiArMjgxLDE2IEBACiBzdGF0aWMgUHlPYmplY3QgKnRyYkluQ21kOwogCiAKLQwKKwogc3RhdGljIFB5T2JqZWN0ICoKIFRraW50ZXJfRXJyb3IoUHlPYmplY3QgKnYpCiB7Ci0JUHlFcnJfU2V0U3RyaW5nKFRraW50ZXJfVGNsRXJyb3IsIFRrYXBwX1Jlc3VsdCh2KSk7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlFcnJfU2V0U3RyaW5nKFRraW50ZXJfVGNsRXJyb3IsIFRrYXBwX1Jlc3VsdCh2KSk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIAotDAorCiAvKioqKiBVdGlscyAqKioqLwogCiBzdGF0aWMgaW50IFRraW50ZXJfYnVzeXdhaXRpbnRlcnZhbCA9IDIwOwpAQCAtMzAzLDExICszMDMsMTEgQEAKIHN0YXRpYyB2b2lkCiBTbGVlcChpbnQgbWlsbGkpCiB7Ci0JLyogWFhYIFRvbyBiYWQgaWYgeW91IGRvbid0IGhhdmUgc2VsZWN0KCkuICovCi0Jc3RydWN0IHRpbWV2YWwgdDsKLQl0LnR2X3NlYyA9IG1pbGxpLzEwMDA7Ci0JdC50dl91c2VjID0gKG1pbGxpJTEwMDApICogMTAwMDsKLQlzZWxlY3QoMCwgKGZkX3NldCAqKTAsIChmZF9zZXQgKikwLCAoZmRfc2V0ICopMCwgJnQpOworICAgIC8qIFhYWCBUb28gYmFkIGlmIHlvdSBkb24ndCBoYXZlIHNlbGVjdCgpLiAqLworICAgIHN0cnVjdCB0aW1ldmFsIHQ7CisgICAgdC50dl9zZWMgPSBtaWxsaS8xMDAwOworICAgIHQudHZfdXNlYyA9IChtaWxsaSUxMDAwKSAqIDEwMDA7CisgICAgc2VsZWN0KDAsIChmZF9zZXQgKikwLCAoZmRfc2V0ICopMCwgKGZkX3NldCAqKTAsICZ0KTsKIH0KICNlbmRpZiAvKiBNU19XSU5ET1dTICovCiAKQEAgLTMxNiwxNzQgKzMxNiwxNzQgQEAKIHN0YXRpYyBpbnQKIFdhaXRGb3JNYWlubG9vcChUa2FwcE9iamVjdCogc2VsZikKIHsKLQlpbnQgaTsKLQlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgewotCQlpZiAoc2VsZi0+ZGlzcGF0Y2hpbmcpCi0JCQlyZXR1cm4gMTsKLQkJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCQlTbGVlcCgxMDApOwotCQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCX0KLQlpZiAoc2VsZi0+ZGlzcGF0Y2hpbmcpCi0JCXJldHVybiAxOwotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJtYWluIHRocmVhZCBpcyBub3QgaW4gbWFpbiBsb29wIik7Ci0JcmV0dXJuIDA7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKKyAgICAgICAgaWYgKHNlbGYtPmRpc3BhdGNoaW5nKQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgU2xlZXAoMTAwKTsKKyAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICB9CisgICAgaWYgKHNlbGYtPmRpc3BhdGNoaW5nKQorICAgICAgICByZXR1cm4gMTsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAibWFpbiB0aHJlYWQgaXMgbm90IGluIG1haW4gbG9vcCIpOworICAgIHJldHVybiAwOwogfQogI2VuZGlmIC8qIFdJVEhfVEhSRUFEICovCiAKLQwKKwogc3RhdGljIGNoYXIgKgogQXNTdHJpbmcoUHlPYmplY3QgKnZhbHVlLCBQeU9iamVjdCAqdG1wKQogewotCWlmIChQeVN0cmluZ19DaGVjayh2YWx1ZSkpCi0JCXJldHVybiBQeVN0cmluZ19Bc1N0cmluZyh2YWx1ZSk7CisgICAgaWYgKFB5U3RyaW5nX0NoZWNrKHZhbHVlKSkKKyAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0FzU3RyaW5nKHZhbHVlKTsKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrKHZhbHVlKSkgewotCQlQeU9iamVjdCAqdiA9IFB5VW5pY29kZV9Bc1VURjhTdHJpbmcodmFsdWUpOwotCQlpZiAodiA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWlmIChQeUxpc3RfQXBwZW5kKHRtcCwgdikgIT0gMCkgewotCQkJUHlfREVDUkVGKHYpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJUHlfREVDUkVGKHYpOwotCQlyZXR1cm4gUHlTdHJpbmdfQXNTdHJpbmcodik7Ci0JfQorICAgIGVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayh2YWx1ZSkpIHsKKyAgICAgICAgUHlPYmplY3QgKnYgPSBQeVVuaWNvZGVfQXNVVEY4U3RyaW5nKHZhbHVlKTsKKyAgICAgICAgaWYgKHYgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBpZiAoUHlMaXN0X0FwcGVuZCh0bXAsIHYpICE9IDApIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0FzU3RyaW5nKHYpOworICAgIH0KICNlbmRpZgotCWVsc2UgewotCQlQeU9iamVjdCAqdiA9IFB5T2JqZWN0X1N0cih2YWx1ZSk7Ci0JCWlmICh2ID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQkJaWYgKFB5TGlzdF9BcHBlbmQodG1wLCB2KSAhPSAwKSB7Ci0JCQlQeV9ERUNSRUYodik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlQeV9ERUNSRUYodik7Ci0JCXJldHVybiBQeVN0cmluZ19Bc1N0cmluZyh2KTsKLQl9CisgICAgZWxzZSB7CisgICAgICAgIFB5T2JqZWN0ICp2ID0gUHlPYmplY3RfU3RyKHZhbHVlKTsKKyAgICAgICAgaWYgKHYgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBpZiAoUHlMaXN0X0FwcGVuZCh0bXAsIHYpICE9IDApIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0FzU3RyaW5nKHYpOworICAgIH0KIH0KIAogCi0MCisKICNkZWZpbmUgQVJHU1ogNjQKIAogc3RhdGljIGNoYXIgKgogTWVyZ2UoUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKnRtcCA9IE5VTEw7Ci0JY2hhciAqYXJndlN0b3JlW0FSR1NaXTsKLQljaGFyICoqYXJndiA9IE5VTEw7Ci0JaW50IGZ2U3RvcmVbQVJHU1pdOwotCWludCAqZnYgPSBOVUxMOwotCWludCBhcmdjID0gMCwgZnZjID0gMCwgaTsKLQljaGFyICpyZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICp0bXAgPSBOVUxMOworICAgIGNoYXIgKmFyZ3ZTdG9yZVtBUkdTWl07CisgICAgY2hhciAqKmFyZ3YgPSBOVUxMOworICAgIGludCBmdlN0b3JlW0FSR1NaXTsKKyAgICBpbnQgKmZ2ID0gTlVMTDsKKyAgICBpbnQgYXJnYyA9IDAsIGZ2YyA9IDAsIGk7CisgICAgY2hhciAqcmVzID0gTlVMTDsKIAotCWlmICghKHRtcCA9IFB5TGlzdF9OZXcoMCkpKQotCSAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoISh0bXAgPSBQeUxpc3RfTmV3KDApKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlhcmd2ID0gYXJndlN0b3JlOwotCWZ2ID0gZnZTdG9yZTsKKyAgICBhcmd2ID0gYXJndlN0b3JlOworICAgIGZ2ID0gZnZTdG9yZTsKIAotCWlmIChhcmdzID09IE5VTEwpCi0JCWFyZ2MgPSAwOworICAgIGlmIChhcmdzID09IE5VTEwpCisgICAgICAgIGFyZ2MgPSAwOwogCi0JZWxzZSBpZiAoIVB5VHVwbGVfQ2hlY2soYXJncykpIHsKLQkJYXJnYyA9IDE7Ci0JCWZ2WzBdID0gMDsKLQkJaWYgKCEoYXJndlswXSA9IEFzU3RyaW5nKGFyZ3MsIHRtcCkpKQotCQkJZ290byBmaW5hbGx5OwotCX0KLQllbHNlIHsKLQkJYXJnYyA9IFB5VHVwbGVfU2l6ZShhcmdzKTsKKyAgICBlbHNlIGlmICghUHlUdXBsZV9DaGVjayhhcmdzKSkgeworICAgICAgICBhcmdjID0gMTsKKyAgICAgICAgZnZbMF0gPSAwOworICAgICAgICBpZiAoIShhcmd2WzBdID0gQXNTdHJpbmcoYXJncywgdG1wKSkpCisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBhcmdjID0gUHlUdXBsZV9TaXplKGFyZ3MpOwogCi0JCWlmIChhcmdjID4gQVJHU1opIHsKLQkJCWFyZ3YgPSAoY2hhciAqKilja2FsbG9jKGFyZ2MgKiBzaXplb2YoY2hhciAqKSk7Ci0JCQlmdiA9IChpbnQgKilja2FsbG9jKGFyZ2MgKiBzaXplb2YoaW50KSk7Ci0JCQlpZiAoYXJndiA9PSBOVUxMIHx8IGZ2ID09IE5VTEwpIHsKLQkJCQlQeUVycl9Ob01lbW9yeSgpOwotCQkJCWdvdG8gZmluYWxseTsKLQkJCX0KLQkJfQorICAgICAgICBpZiAoYXJnYyA+IEFSR1NaKSB7CisgICAgICAgICAgICBhcmd2ID0gKGNoYXIgKiopY2thbGxvYyhhcmdjICogc2l6ZW9mKGNoYXIgKikpOworICAgICAgICAgICAgZnYgPSAoaW50ICopY2thbGxvYyhhcmdjICogc2l6ZW9mKGludCkpOworICAgICAgICAgICAgaWYgKGFyZ3YgPT0gTlVMTCB8fCBmdiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQlmb3IgKGkgPSAwOyBpIDwgYXJnYzsgaSsrKSB7Ci0JCQlQeU9iamVjdCAqdiA9IFB5VHVwbGVfR2V0SXRlbShhcmdzLCBpKTsKLQkJCWlmIChQeVR1cGxlX0NoZWNrKHYpKSB7Ci0JCQkJZnZbaV0gPSAxOwotCQkJCWlmICghKGFyZ3ZbaV0gPSBNZXJnZSh2KSkpCi0JCQkJCWdvdG8gZmluYWxseTsKLQkJCQlmdmMrKzsKLQkJCX0KLQkJCWVsc2UgaWYgKHYgPT0gUHlfTm9uZSkgewotCQkJCWFyZ2MgPSBpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZnZbaV0gPSAwOwotCQkJCWlmICghKGFyZ3ZbaV0gPSBBc1N0cmluZyh2LCB0bXApKSkKLQkJCQkJZ290byBmaW5hbGx5OwotCQkJCWZ2YysrOwotCQkJfQotCQl9Ci0JfQotCXJlcyA9IFRjbF9NZXJnZShhcmdjLCBhcmd2KTsKLQlpZiAocmVzID09IE5VTEwpCi0JCVB5RXJyX1NldFN0cmluZyhUa2ludGVyX1RjbEVycm9yLCAibWVyZ2UgZmFpbGVkIik7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhcmdjOyBpKyspIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICp2ID0gUHlUdXBsZV9HZXRJdGVtKGFyZ3MsIGkpOworICAgICAgICAgICAgaWYgKFB5VHVwbGVfQ2hlY2sodikpIHsKKyAgICAgICAgICAgICAgICBmdltpXSA9IDE7CisgICAgICAgICAgICAgICAgaWYgKCEoYXJndltpXSA9IE1lcmdlKHYpKSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBmaW5hbGx5OworICAgICAgICAgICAgICAgIGZ2YysrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAodiA9PSBQeV9Ob25lKSB7CisgICAgICAgICAgICAgICAgYXJnYyA9IGk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBmdltpXSA9IDA7CisgICAgICAgICAgICAgICAgaWYgKCEoYXJndltpXSA9IEFzU3RyaW5nKHYsIHRtcCkpKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgICAgICAgICAgICAgZnZjKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmVzID0gVGNsX01lcmdlKGFyZ2MsIGFyZ3YpOworICAgIGlmIChyZXMgPT0gTlVMTCkKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFRraW50ZXJfVGNsRXJyb3IsICJtZXJnZSBmYWlsZWQiKTsKIAogICBmaW5hbGx5OgotCWZvciAoaSA9IDA7IGkgPCBmdmM7IGkrKykKLQkJaWYgKGZ2W2ldKSB7Ci0JCQlja2ZyZWUoYXJndltpXSk7Ci0JCX0KLQlpZiAoYXJndiAhPSBhcmd2U3RvcmUpCi0JCWNrZnJlZShGUkVFQ0FTVCBhcmd2KTsKLQlpZiAoZnYgIT0gZnZTdG9yZSkKLQkJY2tmcmVlKEZSRUVDQVNUIGZ2KTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgZnZjOyBpKyspCisgICAgICAgIGlmIChmdltpXSkgeworICAgICAgICAgICAgY2tmcmVlKGFyZ3ZbaV0pOworICAgICAgICB9CisgICAgaWYgKGFyZ3YgIT0gYXJndlN0b3JlKQorICAgICAgICBja2ZyZWUoRlJFRUNBU1QgYXJndik7CisgICAgaWYgKGZ2ICE9IGZ2U3RvcmUpCisgICAgICAgIGNrZnJlZShGUkVFQ0FTVCBmdik7CiAKLQlQeV9ERUNSRUYodG1wKTsKLQlyZXR1cm4gcmVzOworICAgIFB5X0RFQ1JFRih0bXApOworICAgIHJldHVybiByZXM7CiB9CiAKIAotDAorCiBzdGF0aWMgUHlPYmplY3QgKgogU3BsaXQoY2hhciAqbGlzdCkKIHsKLQlpbnQgYXJnYzsKLQljaGFyICoqYXJndjsKLQlQeU9iamVjdCAqdjsKKyAgICBpbnQgYXJnYzsKKyAgICBjaGFyICoqYXJndjsKKyAgICBQeU9iamVjdCAqdjsKIAotCWlmIChsaXN0ID09IE5VTEwpIHsKLQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQlyZXR1cm4gUHlfTm9uZTsKLQl9CisgICAgaWYgKGxpc3QgPT0gTlVMTCkgeworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIHJldHVybiBQeV9Ob25lOworICAgIH0KIAotCWlmIChUY2xfU3BsaXRMaXN0KChUY2xfSW50ZXJwICopTlVMTCwgbGlzdCwgJmFyZ2MsICZhcmd2KSAhPSBUQ0xfT0spIHsKLQkJLyogTm90IGEgbGlzdC4KLQkJICogQ291bGQgYmUgYSBxdW90ZWQgc3RyaW5nIGNvbnRhaW5pbmcgZnVubmllcywgZS5nLiB7In0uCi0JCSAqIFJldHVybiB0aGUgc3RyaW5nIGl0c2VsZi4KLQkJICovCi0JCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGxpc3QpOwotCX0KKyAgICBpZiAoVGNsX1NwbGl0TGlzdCgoVGNsX0ludGVycCAqKU5VTEwsIGxpc3QsICZhcmdjLCAmYXJndikgIT0gVENMX09LKSB7CisgICAgICAgIC8qIE5vdCBhIGxpc3QuCisgICAgICAgICAqIENvdWxkIGJlIGEgcXVvdGVkIHN0cmluZyBjb250YWluaW5nIGZ1bm5pZXMsIGUuZy4geyJ9LgorICAgICAgICAgKiBSZXR1cm4gdGhlIHN0cmluZyBpdHNlbGYuCisgICAgICAgICAqLworICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhsaXN0KTsKKyAgICB9CiAKLQlpZiAoYXJnYyA9PSAwKQotCQl2ID0gUHlTdHJpbmdfRnJvbVN0cmluZygiIik7Ci0JZWxzZSBpZiAoYXJnYyA9PSAxKQotCQl2ID0gUHlTdHJpbmdfRnJvbVN0cmluZyhhcmd2WzBdKTsKLQllbHNlIGlmICgodiA9IFB5VHVwbGVfTmV3KGFyZ2MpKSAhPSBOVUxMKSB7Ci0JCWludCBpOwotCQlQeU9iamVjdCAqdzsKKyAgICBpZiAoYXJnYyA9PSAwKQorICAgICAgICB2ID0gUHlTdHJpbmdfRnJvbVN0cmluZygiIik7CisgICAgZWxzZSBpZiAoYXJnYyA9PSAxKQorICAgICAgICB2ID0gUHlTdHJpbmdfRnJvbVN0cmluZyhhcmd2WzBdKTsKKyAgICBlbHNlIGlmICgodiA9IFB5VHVwbGVfTmV3KGFyZ2MpKSAhPSBOVUxMKSB7CisgICAgICAgIGludCBpOworICAgICAgICBQeU9iamVjdCAqdzsKIAotCQlmb3IgKGkgPSAwOyBpIDwgYXJnYzsgaSsrKSB7Ci0JCQlpZiAoKHcgPSBTcGxpdChhcmd2W2ldKSkgPT0gTlVMTCkgewotCQkJCVB5X0RFQ1JFRih2KTsKLQkJCQl2ID0gTlVMTDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCVB5VHVwbGVfU2V0SXRlbSh2LCBpLCB3KTsKLQkJfQotCX0KLQlUY2xfRnJlZShGUkVFQ0FTVCBhcmd2KTsKLQlyZXR1cm4gdjsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGFyZ2M7IGkrKykgeworICAgICAgICAgICAgaWYgKCh3ID0gU3BsaXQoYXJndltpXSkpID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICAgICAgdiA9IE5VTEw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQeVR1cGxlX1NldEl0ZW0odiwgaSwgdyk7CisgICAgICAgIH0KKyAgICB9CisgICAgVGNsX0ZyZWUoRlJFRUNBU1QgYXJndik7CisgICAgcmV0dXJuIHY7CiB9CiAKIC8qIEluIHNvbWUgY2FzZXMsIFRjbCB3aWxsIHN0aWxsIHJldHVybiBzdHJpbmdzIHRoYXQgYXJlIHN1cHBvc2VkIHRvIGJlCkBAIC00OTMsODkgKzQ5Myw4OSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIFNwbGl0T2JqKFB5T2JqZWN0ICphcmcpCiB7Ci0JaWYgKFB5VHVwbGVfQ2hlY2soYXJnKSkgewotCQlpbnQgaSwgc2l6ZTsKLQkJUHlPYmplY3QgKmVsZW0sICpuZXdlbGVtLCAqcmVzdWx0OworICAgIGlmIChQeVR1cGxlX0NoZWNrKGFyZykpIHsKKyAgICAgICAgaW50IGksIHNpemU7CisgICAgICAgIFB5T2JqZWN0ICplbGVtLCAqbmV3ZWxlbSwgKnJlc3VsdDsKIAotCQlzaXplID0gUHlUdXBsZV9TaXplKGFyZyk7Ci0JCXJlc3VsdCA9IE5VTEw7Ci0JCS8qIFJlY3Vyc2l2ZWx5IGludm9rZSBTcGxpdE9iaiBmb3IgYWxsIHR1cGxlIGl0ZW1zLgotCQkgICBJZiB0aGlzIGRvZXMgbm90IHJldHVybiBhIG5ldyBvYmplY3QsIG5vIGFjdGlvbiBpcwotCQkgICBuZWVkZWQuICovCi0JCWZvcihpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJZWxlbSA9IFB5VHVwbGVfR2V0SXRlbShhcmcsIGkpOwotCQkJbmV3ZWxlbSA9IFNwbGl0T2JqKGVsZW0pOwotCQkJaWYgKCFuZXdlbGVtKSB7Ci0JCQkJUHlfWERFQ1JFRihyZXN1bHQpOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQkJaWYgKCFyZXN1bHQpIHsKLQkJCQlpbnQgazsKLQkJCQlpZiAobmV3ZWxlbSA9PSBlbGVtKSB7Ci0JCQkJCVB5X0RFQ1JFRihuZXdlbGVtKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCXJlc3VsdCA9IFB5VHVwbGVfTmV3KHNpemUpOwotCQkJCWlmICghcmVzdWx0KQotCQkJCQlyZXR1cm4gTlVMTDsKLQkJCQlmb3IoayA9IDA7IGsgPCBpOyBrKyspIHsKLQkJCQkJZWxlbSA9IFB5VHVwbGVfR2V0SXRlbShhcmcsIGspOwotCQkJCQlQeV9JTkNSRUYoZWxlbSk7Ci0JCQkJCVB5VHVwbGVfU2V0SXRlbShyZXN1bHQsIGssIGVsZW0pOwotCQkJCX0KLQkJCX0KLQkJCVB5VHVwbGVfU2V0SXRlbShyZXN1bHQsIGksIG5ld2VsZW0pOwotCQl9Ci0JCWlmIChyZXN1bHQpCi0JCQlyZXR1cm4gcmVzdWx0OwotCQkvKiBGYWxsIHRocm91Z2gsIHJldHVybmluZyBhcmcuICovCi0JfQotCWVsc2UgaWYgKFB5U3RyaW5nX0NoZWNrKGFyZykpIHsKLQkJaW50IGFyZ2M7Ci0JCWNoYXIgKiphcmd2OwotCQljaGFyICpsaXN0ID0gUHlTdHJpbmdfQXNTdHJpbmcoYXJnKTsKKyAgICAgICAgc2l6ZSA9IFB5VHVwbGVfU2l6ZShhcmcpOworICAgICAgICByZXN1bHQgPSBOVUxMOworICAgICAgICAvKiBSZWN1cnNpdmVseSBpbnZva2UgU3BsaXRPYmogZm9yIGFsbCB0dXBsZSBpdGVtcy4KKyAgICAgICAgICAgSWYgdGhpcyBkb2VzIG5vdCByZXR1cm4gYSBuZXcgb2JqZWN0LCBubyBhY3Rpb24gaXMKKyAgICAgICAgICAgbmVlZGVkLiAqLworICAgICAgICBmb3IoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgIGVsZW0gPSBQeVR1cGxlX0dldEl0ZW0oYXJnLCBpKTsKKyAgICAgICAgICAgIG5ld2VsZW0gPSBTcGxpdE9iaihlbGVtKTsKKyAgICAgICAgICAgIGlmICghbmV3ZWxlbSkgeworICAgICAgICAgICAgICAgIFB5X1hERUNSRUYocmVzdWx0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghcmVzdWx0KSB7CisgICAgICAgICAgICAgICAgaW50IGs7CisgICAgICAgICAgICAgICAgaWYgKG5ld2VsZW0gPT0gZWxlbSkgeworICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYobmV3ZWxlbSk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXN1bHQgPSBQeVR1cGxlX05ldyhzaXplKTsKKyAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgZm9yKGsgPSAwOyBrIDwgaTsgaysrKSB7CisgICAgICAgICAgICAgICAgICAgIGVsZW0gPSBQeVR1cGxlX0dldEl0ZW0oYXJnLCBrKTsKKyAgICAgICAgICAgICAgICAgICAgUHlfSU5DUkVGKGVsZW0pOworICAgICAgICAgICAgICAgICAgICBQeVR1cGxlX1NldEl0ZW0ocmVzdWx0LCBrLCBlbGVtKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQeVR1cGxlX1NldEl0ZW0ocmVzdWx0LCBpLCBuZXdlbGVtKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmVzdWx0KQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgLyogRmFsbCB0aHJvdWdoLCByZXR1cm5pbmcgYXJnLiAqLworICAgIH0KKyAgICBlbHNlIGlmIChQeVN0cmluZ19DaGVjayhhcmcpKSB7CisgICAgICAgIGludCBhcmdjOworICAgICAgICBjaGFyICoqYXJndjsKKyAgICAgICAgY2hhciAqbGlzdCA9IFB5U3RyaW5nX0FzU3RyaW5nKGFyZyk7CiAKLQkJaWYgKFRjbF9TcGxpdExpc3QoKFRjbF9JbnRlcnAgKilOVUxMLCBsaXN0LCAmYXJnYywgJmFyZ3YpICE9IFRDTF9PSykgewotCQkJUHlfSU5DUkVGKGFyZyk7Ci0JCQlyZXR1cm4gYXJnOwotCQl9Ci0JCVRjbF9GcmVlKEZSRUVDQVNUIGFyZ3YpOwotCQlpZiAoYXJnYyA+IDEpCi0JCQlyZXR1cm4gU3BsaXQoUHlTdHJpbmdfQXNTdHJpbmcoYXJnKSk7Ci0JCS8qIEZhbGwgdGhyb3VnaCwgcmV0dXJuaW5nIGFyZy4gKi8KLQl9Ci0JUHlfSU5DUkVGKGFyZyk7Ci0JcmV0dXJuIGFyZzsKKyAgICAgICAgaWYgKFRjbF9TcGxpdExpc3QoKFRjbF9JbnRlcnAgKilOVUxMLCBsaXN0LCAmYXJnYywgJmFyZ3YpICE9IFRDTF9PSykgeworICAgICAgICAgICAgUHlfSU5DUkVGKGFyZyk7CisgICAgICAgICAgICByZXR1cm4gYXJnOworICAgICAgICB9CisgICAgICAgIFRjbF9GcmVlKEZSRUVDQVNUIGFyZ3YpOworICAgICAgICBpZiAoYXJnYyA+IDEpCisgICAgICAgICAgICByZXR1cm4gU3BsaXQoUHlTdHJpbmdfQXNTdHJpbmcoYXJnKSk7CisgICAgICAgIC8qIEZhbGwgdGhyb3VnaCwgcmV0dXJuaW5nIGFyZy4gKi8KKyAgICB9CisgICAgUHlfSU5DUkVGKGFyZyk7CisgICAgcmV0dXJuIGFyZzsKIH0KIAotDAorCiAvKioqKiBUa2FwcCBPYmplY3QgKioqKi8KIAogI2lmbmRlZiBXSVRIX0FQUElOSVQKIGludAogVGNsX0FwcEluaXQoVGNsX0ludGVycCAqaW50ZXJwKQogewotCVRrX1dpbmRvdyBtYWluOwotCWNvbnN0IGNoYXIgKiBfdGtpbnRlcl9za2lwX3RrX2luaXQ7CisgICAgVGtfV2luZG93IG1haW47CisgICAgY29uc3QgY2hhciAqIF90a2ludGVyX3NraXBfdGtfaW5pdDsKIAotCWlmIChUY2xfSW5pdChpbnRlcnApID09IFRDTF9FUlJPUikgewotCQlQeVN5c19Xcml0ZVN0ZGVycigiVGNsX0luaXQgZXJyb3I6ICVzXG4iLCBUY2xfR2V0U3RyaW5nUmVzdWx0KGludGVycCkpOwotCQlyZXR1cm4gVENMX0VSUk9SOwotCX0KLQlfdGtpbnRlcl9za2lwX3RrX2luaXQgPQlUY2xfR2V0VmFyKGludGVycCwgIl90a2ludGVyX3NraXBfdGtfaW5pdCIsIFRDTF9HTE9CQUxfT05MWSk7Ci0JaWYgKF90a2ludGVyX3NraXBfdGtfaW5pdCA9PSBOVUxMIHx8IHN0cmNtcChfdGtpbnRlcl9za2lwX3RrX2luaXQsICIxIikJIT0gMCkgewotCQltYWluID0gVGtfTWFpbldpbmRvdyhpbnRlcnApOwotCQlpZiAoVGtfSW5pdChpbnRlcnApID09IFRDTF9FUlJPUikgewotCQkJUHlTeXNfV3JpdGVTdGRlcnIoIlRrX0luaXQgZXJyb3I6ICVzXG4iLCBUY2xfR2V0U3RyaW5nUmVzdWx0KGludGVycCkpOwotCQkJcmV0dXJuIFRDTF9FUlJPUjsKLQkJfQotCX0KLQlyZXR1cm4gVENMX09LOworICAgIGlmIChUY2xfSW5pdChpbnRlcnApID09IFRDTF9FUlJPUikgeworICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigiVGNsX0luaXQgZXJyb3I6ICVzXG4iLCBUY2xfR2V0U3RyaW5nUmVzdWx0KGludGVycCkpOworICAgICAgICByZXR1cm4gVENMX0VSUk9SOworICAgIH0KKyAgICBfdGtpbnRlcl9za2lwX3RrX2luaXQgPSAgICAgVGNsX0dldFZhcihpbnRlcnAsICJfdGtpbnRlcl9za2lwX3RrX2luaXQiLCBUQ0xfR0xPQkFMX09OTFkpOworICAgIGlmIChfdGtpbnRlcl9za2lwX3RrX2luaXQgPT0gTlVMTCB8fCBzdHJjbXAoX3RraW50ZXJfc2tpcF90a19pbml0LCAiMSIpICAgICAhPSAwKSB7CisgICAgICAgIG1haW4gPSBUa19NYWluV2luZG93KGludGVycCk7CisgICAgICAgIGlmIChUa19Jbml0KGludGVycCkgPT0gVENMX0VSUk9SKSB7CisgICAgICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigiVGtfSW5pdCBlcnJvcjogJXNcbiIsIFRjbF9HZXRTdHJpbmdSZXN1bHQoaW50ZXJwKSk7CisgICAgICAgICAgICByZXR1cm4gVENMX0VSUk9SOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBUQ0xfT0s7CiB9CiAjZW5kaWYgLyogIVdJVEhfQVBQSU5JVCAqLwogCiAKLQwKKwogCiAvKiBJbml0aWFsaXplIHRoZSBUayBhcHBsaWNhdGlvbjsgc2VlIHRoZSBgbWFpbicgZnVuY3Rpb24gaW4KICAqIGB0a01haW4uYycuCkBAIC01ODYsMjE0ICs1ODYsMjE0IEBACiAKIHN0YXRpYyBUa2FwcE9iamVjdCAqCiBUa2FwcF9OZXcoY2hhciAqc2NyZWVuTmFtZSwgY2hhciAqYmFzZU5hbWUsIGNoYXIgKmNsYXNzTmFtZSwKLQkgIGludCBpbnRlcmFjdGl2ZSwgaW50IHdhbnRvYmplY3RzLCBpbnQJd2FudFRrLCBpbnQgc3luYywgY2hhciAqdXNlKQorICAgICAgICAgIGludCBpbnRlcmFjdGl2ZSwgaW50IHdhbnRvYmplY3RzLCBpbnQgd2FudFRrLCBpbnQgc3luYywgY2hhciAqdXNlKQogewotCVRrYXBwT2JqZWN0ICp2OwotCWNoYXIgKmFyZ3YwOworICAgIFRrYXBwT2JqZWN0ICp2OworICAgIGNoYXIgKmFyZ3YwOwogCi0JdiA9IFB5T2JqZWN0X05ldyhUa2FwcE9iamVjdCwgJlRrYXBwX1R5cGUpOwotCWlmICh2ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIHYgPSBQeU9iamVjdF9OZXcoVGthcHBPYmplY3QsICZUa2FwcF9UeXBlKTsKKyAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXYtPmludGVycCA9IFRjbF9DcmVhdGVJbnRlcnAoKTsKLQl2LT53YW50b2JqZWN0cyA9IHdhbnRvYmplY3RzOwotCXYtPnRocmVhZGVkID0gVGNsX0dldFZhcjJFeCh2LT5pbnRlcnAsICJ0Y2xfcGxhdGZvcm0iLCAidGhyZWFkZWQiLAotCQkJCSAgICBUQ0xfR0xPQkFMX09OTFkpICE9IE5VTEw7Ci0Jdi0+dGhyZWFkX2lkID0gVGNsX0dldEN1cnJlbnRUaHJlYWQoKTsKLQl2LT5kaXNwYXRjaGluZyA9IDA7CisgICAgdi0+aW50ZXJwID0gVGNsX0NyZWF0ZUludGVycCgpOworICAgIHYtPndhbnRvYmplY3RzID0gd2FudG9iamVjdHM7CisgICAgdi0+dGhyZWFkZWQgPSBUY2xfR2V0VmFyMkV4KHYtPmludGVycCwgInRjbF9wbGF0Zm9ybSIsICJ0aHJlYWRlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRDTF9HTE9CQUxfT05MWSkgIT0gTlVMTDsKKyAgICB2LT50aHJlYWRfaWQgPSBUY2xfR2V0Q3VycmVudFRocmVhZCgpOworICAgIHYtPmRpc3BhdGNoaW5nID0gMDsKIAogI2lmbmRlZiBUQ0xfVEhSRUFEUwotCWlmICh2LT50aHJlYWRlZCkgewotCSAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAiVGNsIGlzIHRocmVhZGVkIGJ1dCBfdGtpbnRlciBpcyBub3QiKTsKLQkgICAgUHlfREVDUkVGKHYpOwotCSAgICByZXR1cm4gMDsKLQl9CisgICAgaWYgKHYtPnRocmVhZGVkKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJUY2wgaXMgdGhyZWFkZWQgYnV0IF90a2ludGVyIGlzIG5vdCIpOworICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KICNlbmRpZgogI2lmZGVmIFdJVEhfVEhSRUFECi0JaWYgKHYtPnRocmVhZGVkICYmIHRjbF9sb2NrKSB7Ci0JICAgIC8qIElmIFRjbCBpcyB0aHJlYWRlZCwgd2UgZG9uJ3QgbmVlZCB0aGUgbG9jay4gKi8KLQkgICAgUHlUaHJlYWRfZnJlZV9sb2NrKHRjbF9sb2NrKTsKLQkgICAgdGNsX2xvY2sgPSBOVUxMOwotCX0KKyAgICBpZiAodi0+dGhyZWFkZWQgJiYgdGNsX2xvY2spIHsKKyAgICAgICAgLyogSWYgVGNsIGlzIHRocmVhZGVkLCB3ZSBkb24ndCBuZWVkIHRoZSBsb2NrLiAqLworICAgICAgICBQeVRocmVhZF9mcmVlX2xvY2sodGNsX2xvY2spOworICAgICAgICB0Y2xfbG9jayA9IE5VTEw7CisgICAgfQogI2VuZGlmCiAKLQl2LT5Cb29sZWFuVHlwZSA9IFRjbF9HZXRPYmpUeXBlKCJib29sZWFuIik7Ci0Jdi0+Qnl0ZUFycmF5VHlwZSA9IFRjbF9HZXRPYmpUeXBlKCJieXRlYXJyYXkiKTsKLQl2LT5Eb3VibGVUeXBlID0gVGNsX0dldE9ialR5cGUoImRvdWJsZSIpOwotCXYtPkludFR5cGUgPSBUY2xfR2V0T2JqVHlwZSgiaW50Iik7Ci0Jdi0+TGlzdFR5cGUgPSBUY2xfR2V0T2JqVHlwZSgibGlzdCIpOwotCXYtPlByb2NCb2R5VHlwZSA9IFRjbF9HZXRPYmpUeXBlKCJwcm9jYm9keSIpOwotCXYtPlN0cmluZ1R5cGUgPSBUY2xfR2V0T2JqVHlwZSgic3RyaW5nIik7CisgICAgdi0+Qm9vbGVhblR5cGUgPSBUY2xfR2V0T2JqVHlwZSgiYm9vbGVhbiIpOworICAgIHYtPkJ5dGVBcnJheVR5cGUgPSBUY2xfR2V0T2JqVHlwZSgiYnl0ZWFycmF5Iik7CisgICAgdi0+RG91YmxlVHlwZSA9IFRjbF9HZXRPYmpUeXBlKCJkb3VibGUiKTsKKyAgICB2LT5JbnRUeXBlID0gVGNsX0dldE9ialR5cGUoImludCIpOworICAgIHYtPkxpc3RUeXBlID0gVGNsX0dldE9ialR5cGUoImxpc3QiKTsKKyAgICB2LT5Qcm9jQm9keVR5cGUgPSBUY2xfR2V0T2JqVHlwZSgicHJvY2JvZHkiKTsKKyAgICB2LT5TdHJpbmdUeXBlID0gVGNsX0dldE9ialR5cGUoInN0cmluZyIpOwogCi0JLyogRGVsZXRlIHRoZSAnZXhpdCcgY29tbWFuZCwgd2hpY2ggY2FuIHNjcmV3IHRoaW5ncyB1cCAqLwotCVRjbF9EZWxldGVDb21tYW5kKHYtPmludGVycCwgImV4aXQiKTsKKyAgICAvKiBEZWxldGUgdGhlICdleGl0JyBjb21tYW5kLCB3aGljaCBjYW4gc2NyZXcgdGhpbmdzIHVwICovCisgICAgVGNsX0RlbGV0ZUNvbW1hbmQodi0+aW50ZXJwLCAiZXhpdCIpOwogCi0JaWYgKHNjcmVlbk5hbWUgIT0gTlVMTCkKLQkJVGNsX1NldFZhcjIodi0+aW50ZXJwLCAiZW52IiwgIkRJU1BMQVkiLAotCQkJICAgIHNjcmVlbk5hbWUsIFRDTF9HTE9CQUxfT05MWSk7CisgICAgaWYgKHNjcmVlbk5hbWUgIT0gTlVMTCkKKyAgICAgICAgVGNsX1NldFZhcjIodi0+aW50ZXJwLCAiZW52IiwgIkRJU1BMQVkiLAorICAgICAgICAgICAgICAgICAgICBzY3JlZW5OYW1lLCBUQ0xfR0xPQkFMX09OTFkpOwogCi0JaWYgKGludGVyYWN0aXZlKQotCQlUY2xfU2V0VmFyKHYtPmludGVycCwgInRjbF9pbnRlcmFjdGl2ZSIsICIxIiwgVENMX0dMT0JBTF9PTkxZKTsKLQllbHNlCi0JCVRjbF9TZXRWYXIodi0+aW50ZXJwLCAidGNsX2ludGVyYWN0aXZlIiwgIjAiLCBUQ0xfR0xPQkFMX09OTFkpOworICAgIGlmIChpbnRlcmFjdGl2ZSkKKyAgICAgICAgVGNsX1NldFZhcih2LT5pbnRlcnAsICJ0Y2xfaW50ZXJhY3RpdmUiLCAiMSIsIFRDTF9HTE9CQUxfT05MWSk7CisgICAgZWxzZQorICAgICAgICBUY2xfU2V0VmFyKHYtPmludGVycCwgInRjbF9pbnRlcmFjdGl2ZSIsICIwIiwgVENMX0dMT0JBTF9PTkxZKTsKIAotCS8qIFRoaXMgaXMgdXNlZCB0byBnZXQgdGhlIGFwcGxpY2F0aW9uIGNsYXNzIGZvciBUayA0LjEgYW5kIHVwICovCi0JYXJndjAgPSAoY2hhciopY2thbGxvYyhzdHJsZW4oY2xhc3NOYW1lKSArIDEpOwotCWlmICghYXJndjApIHsKLQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJUHlfREVDUkVGKHYpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgLyogVGhpcyBpcyB1c2VkIHRvIGdldCB0aGUgYXBwbGljYXRpb24gY2xhc3MgZm9yIFRrIDQuMSBhbmQgdXAgKi8KKyAgICBhcmd2MCA9IChjaGFyKilja2FsbG9jKHN0cmxlbihjbGFzc05hbWUpICsgMSk7CisgICAgaWYgKCFhcmd2MCkgeworICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXN0cmNweShhcmd2MCwgY2xhc3NOYW1lKTsKLQlpZiAoaXN1cHBlcihQeV9DSEFSTUFTSyhhcmd2MFswXSkpKQotCQlhcmd2MFswXSA9IHRvbG93ZXIoUHlfQ0hBUk1BU0soYXJndjBbMF0pKTsKLQlUY2xfU2V0VmFyKHYtPmludGVycCwgImFyZ3YwIiwgYXJndjAsIFRDTF9HTE9CQUxfT05MWSk7Ci0JY2tmcmVlKGFyZ3YwKTsKKyAgICBzdHJjcHkoYXJndjAsIGNsYXNzTmFtZSk7CisgICAgaWYgKGlzdXBwZXIoUHlfQ0hBUk1BU0soYXJndjBbMF0pKSkKKyAgICAgICAgYXJndjBbMF0gPSB0b2xvd2VyKFB5X0NIQVJNQVNLKGFyZ3YwWzBdKSk7CisgICAgVGNsX1NldFZhcih2LT5pbnRlcnAsICJhcmd2MCIsIGFyZ3YwLCBUQ0xfR0xPQkFMX09OTFkpOworICAgIGNrZnJlZShhcmd2MCk7CiAKLQlpZiAoISB3YW50VGspIHsKLQkgICAgVGNsX1NldFZhcih2LT5pbnRlcnAsICJfdGtpbnRlcl9za2lwX3RrX2luaXQiLCAiMSIsCVRDTF9HTE9CQUxfT05MWSk7Ci0JfQorICAgIGlmICghIHdhbnRUaykgeworICAgICAgICBUY2xfU2V0VmFyKHYtPmludGVycCwgIl90a2ludGVyX3NraXBfdGtfaW5pdCIsICIxIiwgICAgIFRDTF9HTE9CQUxfT05MWSk7CisgICAgfQogCi0JLyogc29tZSBpbml0aWFsIGFyZ3VtZW50cyBuZWVkIHRvIGJlIGluIGFyZ3YgKi8KLQlpZiAoc3luYyB8fCB1c2UpIHsKLQkJY2hhciAqYXJnczsKLQkJaW50IGxlbiA9IDA7CisgICAgLyogc29tZSBpbml0aWFsIGFyZ3VtZW50cyBuZWVkIHRvIGJlIGluIGFyZ3YgKi8KKyAgICBpZiAoc3luYyB8fCB1c2UpIHsKKyAgICAgICAgY2hhciAqYXJnczsKKyAgICAgICAgaW50IGxlbiA9IDA7CiAKLQkJaWYgKHN5bmMpCi0JCQlsZW4gKz0gc2l6ZW9mICItc3luYyI7Ci0JCWlmICh1c2UpCi0JCQlsZW4gKz0gc3RybGVuKHVzZSkgKyBzaXplb2YgIi11c2UgIjsKKyAgICAgICAgaWYgKHN5bmMpCisgICAgICAgICAgICBsZW4gKz0gc2l6ZW9mICItc3luYyI7CisgICAgICAgIGlmICh1c2UpCisgICAgICAgICAgICBsZW4gKz0gc3RybGVuKHVzZSkgKyBzaXplb2YgIi11c2UgIjsKIAotCQlhcmdzID0gKGNoYXIqKWNrYWxsb2MobGVuKTsKLQkJaWYgKCFhcmdzKSB7Ci0JCQlQeUVycl9Ob01lbW9yeSgpOwotCQkJUHlfREVDUkVGKHYpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KKyAgICAgICAgYXJncyA9IChjaGFyKilja2FsbG9jKGxlbik7CisgICAgICAgIGlmICghYXJncykgeworICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CiAKLQkJYXJnc1swXSA9ICdcMCc7Ci0JCWlmIChzeW5jKQotCQkJc3RyY2F0KGFyZ3MsICItc3luYyIpOwotCQlpZiAodXNlKSB7Ci0JCQlpZiAoc3luYykKLQkJCQlzdHJjYXQoYXJncywgIiAiKTsKLQkJCXN0cmNhdChhcmdzLCAiLXVzZSAiKTsKLQkJCXN0cmNhdChhcmdzLCB1c2UpOwotCQl9CisgICAgICAgIGFyZ3NbMF0gPSAnXDAnOworICAgICAgICBpZiAoc3luYykKKyAgICAgICAgICAgIHN0cmNhdChhcmdzLCAiLXN5bmMiKTsKKyAgICAgICAgaWYgKHVzZSkgeworICAgICAgICAgICAgaWYgKHN5bmMpCisgICAgICAgICAgICAgICAgc3RyY2F0KGFyZ3MsICIgIik7CisgICAgICAgICAgICBzdHJjYXQoYXJncywgIi11c2UgIik7CisgICAgICAgICAgICBzdHJjYXQoYXJncywgdXNlKTsKKyAgICAgICAgfQogCi0JCVRjbF9TZXRWYXIodi0+aW50ZXJwLCAiYXJndiIsIGFyZ3MsIFRDTF9HTE9CQUxfT05MWSk7Ci0JCWNrZnJlZShhcmdzKTsKLQl9CisgICAgICAgIFRjbF9TZXRWYXIodi0+aW50ZXJwLCAiYXJndiIsIGFyZ3MsIFRDTF9HTE9CQUxfT05MWSk7CisgICAgICAgIGNrZnJlZShhcmdzKTsKKyAgICB9CiAKLQlpZiAoVGNsX0FwcEluaXQodi0+aW50ZXJwKSAhPSBUQ0xfT0spIHsKLQkJUHlPYmplY3QgKnJlc3VsdCA9IFRraW50ZXJfRXJyb3IoKFB5T2JqZWN0ICopdik7Ci0JCVB5X0RFQ1JFRigoUHlPYmplY3QgKil2KTsKLQkJcmV0dXJuIChUa2FwcE9iamVjdCAqKXJlc3VsdDsKLQl9CisgICAgaWYgKFRjbF9BcHBJbml0KHYtPmludGVycCkgIT0gVENMX09LKSB7CisgICAgICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBUa2ludGVyX0Vycm9yKChQeU9iamVjdCAqKXYpOworICAgICAgICBQeV9ERUNSRUYoKFB5T2JqZWN0ICopdik7CisgICAgICAgIHJldHVybiAoVGthcHBPYmplY3QgKilyZXN1bHQ7CisgICAgfQogCi0JRW5hYmxlRXZlbnRIb29rKCk7CisgICAgRW5hYmxlRXZlbnRIb29rKCk7CiAKLQlyZXR1cm4gdjsKKyAgICByZXR1cm4gdjsKIH0KIAogCiBzdGF0aWMgdm9pZAogVGthcHBfVGhyZWFkU2VuZChUa2FwcE9iamVjdCAqc2VsZiwgVGNsX0V2ZW50ICpldiwKLQkJIFRjbF9Db25kaXRpb24gKmNvbmQsIFRjbF9NdXRleCAqbXV0ZXgpCisgICAgICAgICAgICAgICAgIFRjbF9Db25kaXRpb24gKmNvbmQsIFRjbF9NdXRleCAqbXV0ZXgpCiB7Ci0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUzsKLQlUY2xfTXV0ZXhMb2NrKG11dGV4KTsKLQlUY2xfVGhyZWFkUXVldWVFdmVudChzZWxmLT50aHJlYWRfaWQsIGV2LCBUQ0xfUVVFVUVfVEFJTCk7Ci0JVGNsX1RocmVhZEFsZXJ0KHNlbGYtPnRocmVhZF9pZCk7Ci0JVGNsX0NvbmRpdGlvbldhaXQoY29uZCwgbXV0ZXgsIE5VTEwpOwotCVRjbF9NdXRleFVubG9jayhtdXRleCk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTOworICAgIFRjbF9NdXRleExvY2sobXV0ZXgpOworICAgIFRjbF9UaHJlYWRRdWV1ZUV2ZW50KHNlbGYtPnRocmVhZF9pZCwgZXYsIFRDTF9RVUVVRV9UQUlMKTsKKyAgICBUY2xfVGhyZWFkQWxlcnQoc2VsZi0+dGhyZWFkX2lkKTsKKyAgICBUY2xfQ29uZGl0aW9uV2FpdChjb25kLCBtdXRleCwgTlVMTCk7CisgICAgVGNsX011dGV4VW5sb2NrKG11dGV4KTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogfQogCi0MCisKIC8qKiBUY2wgRXZhbCAqKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewotCVB5T2JqZWN0X0hFQUQKLQlUY2xfT2JqICp2YWx1ZTsKLQlQeU9iamVjdCAqc3RyaW5nOyAvKiBUaGlzIGNhbm5vdCBjYXVzZSBjeWNsZXMuICovCisgICAgUHlPYmplY3RfSEVBRAorICAgIFRjbF9PYmogKnZhbHVlOworICAgIFB5T2JqZWN0ICpzdHJpbmc7IC8qIFRoaXMgY2Fubm90IGNhdXNlIGN5Y2xlcy4gKi8KIH0gUHlUY2xPYmplY3Q7CiAKIHN0YXRpY2ZvcndhcmQgUHlUeXBlT2JqZWN0IFB5VGNsT2JqZWN0X1R5cGU7Ci0jZGVmaW5lIFB5VGNsT2JqZWN0X0NoZWNrKHYpCSgodiktPm9iX3R5cGUgPT0gJlB5VGNsT2JqZWN0X1R5cGUpCisjZGVmaW5lIFB5VGNsT2JqZWN0X0NoZWNrKHYpICAgICgodiktPm9iX3R5cGUgPT0gJlB5VGNsT2JqZWN0X1R5cGUpCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBuZXdQeVRjbE9iamVjdChUY2xfT2JqICphcmcpCiB7Ci0JUHlUY2xPYmplY3QgKnNlbGY7Ci0Jc2VsZiA9IFB5T2JqZWN0X05ldyhQeVRjbE9iamVjdCwgJlB5VGNsT2JqZWN0X1R5cGUpOwotCWlmIChzZWxmID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCVRjbF9JbmNyUmVmQ291bnQoYXJnKTsKLQlzZWxmLT52YWx1ZSA9IGFyZzsKLQlzZWxmLT5zdHJpbmcgPSBOVUxMOwotCXJldHVybiAoUHlPYmplY3QqKXNlbGY7CisgICAgUHlUY2xPYmplY3QgKnNlbGY7CisgICAgc2VsZiA9IFB5T2JqZWN0X05ldyhQeVRjbE9iamVjdCwgJlB5VGNsT2JqZWN0X1R5cGUpOworICAgIGlmIChzZWxmID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFRjbF9JbmNyUmVmQ291bnQoYXJnKTsKKyAgICBzZWxmLT52YWx1ZSA9IGFyZzsKKyAgICBzZWxmLT5zdHJpbmcgPSBOVUxMOworICAgIHJldHVybiAoUHlPYmplY3QqKXNlbGY7CiB9CiAKIHN0YXRpYyB2b2lkCiBQeVRjbE9iamVjdF9kZWFsbG9jKFB5VGNsT2JqZWN0ICpzZWxmKQogewotCVRjbF9EZWNyUmVmQ291bnQoc2VsZi0+dmFsdWUpOwotCVB5X1hERUNSRUYoc2VsZi0+c3RyaW5nKTsKLQlQeU9iamVjdF9EZWwoc2VsZik7CisgICAgVGNsX0RlY3JSZWZDb3VudChzZWxmLT52YWx1ZSk7CisgICAgUHlfWERFQ1JFRihzZWxmLT5zdHJpbmcpOworICAgIFB5T2JqZWN0X0RlbChzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFB5VGNsT2JqZWN0X3N0cihQeVRjbE9iamVjdCAqc2VsZikKIHsKLQlpZiAoc2VsZi0+c3RyaW5nICYmIFB5U3RyaW5nX0NoZWNrKHNlbGYtPnN0cmluZykpIHsKLQkJUHlfSU5DUkVGKHNlbGYtPnN0cmluZyk7Ci0JCXJldHVybiBzZWxmLT5zdHJpbmc7Ci0JfQotCS8qIFhYWCBDb3VsZCBjYWNoZSB2YWx1ZSBpZiBpdCBpcyBhbiBBU0NJSSBzdHJpbmcuICovCi0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoVGNsX0dldFN0cmluZyhzZWxmLT52YWx1ZSkpOworICAgIGlmIChzZWxmLT5zdHJpbmcgJiYgUHlTdHJpbmdfQ2hlY2soc2VsZi0+c3RyaW5nKSkgeworICAgICAgICBQeV9JTkNSRUYoc2VsZi0+c3RyaW5nKTsKKyAgICAgICAgcmV0dXJuIHNlbGYtPnN0cmluZzsKKyAgICB9CisgICAgLyogWFhYIENvdWxkIGNhY2hlIHZhbHVlIGlmIGl0IGlzIGFuIEFTQ0lJIHN0cmluZy4gKi8KKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhUY2xfR2V0U3RyaW5nKHNlbGYtPnZhbHVlKSk7CiB9CiAKIHN0YXRpYyBjaGFyKgogUHlUY2xPYmplY3RfVGNsU3RyaW5nKFB5T2JqZWN0ICpzZWxmKQogewotCXJldHVybiBUY2xfR2V0U3RyaW5nKCgoUHlUY2xPYmplY3QqKXNlbGYpLT52YWx1ZSk7CisgICAgcmV0dXJuIFRjbF9HZXRTdHJpbmcoKChQeVRjbE9iamVjdCopc2VsZiktPnZhbHVlKTsKIH0KIAogLyogTGlrZSBfc3RyLCBidXQgY3JlYXRlIFVuaWNvZGUgaWYgbmVjZXNzYXJ5LiAqLwotUHlEb2NfU1RSVkFSKFB5VGNsT2JqZWN0X3N0cmluZ19fZG9jX18sIAorUHlEb2NfU1RSVkFSKFB5VGNsT2JqZWN0X3N0cmluZ19fZG9jX18sCiAidGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdCwgZWl0aGVyIGFzIHN0cmluZyBvciBVbmljb2RlIik7CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBQeVRjbE9iamVjdF9zdHJpbmcoUHlUY2xPYmplY3QgKnNlbGYsIHZvaWQgKmlnbm9yZWQpCiB7Ci0JY2hhciAqczsKLQlpbnQgaSwgbGVuOwotCWlmICghc2VsZi0+c3RyaW5nKSB7Ci0JCXMgPSBUY2xfR2V0U3RyaW5nRnJvbU9iaihzZWxmLT52YWx1ZSwgJmxlbik7Ci0JCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKLQkJCWlmIChzW2ldICYgMHg4MCkKLQkJCQlicmVhazsKKyAgICBjaGFyICpzOworICAgIGludCBpLCBsZW47CisgICAgaWYgKCFzZWxmLT5zdHJpbmcpIHsKKyAgICAgICAgcyA9IFRjbF9HZXRTdHJpbmdGcm9tT2JqKHNlbGYtPnZhbHVlLCAmbGVuKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorICAgICAgICAgICAgaWYgKHNbaV0gJiAweDgwKQorICAgICAgICAgICAgICAgIGJyZWFrOwogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQkJaWYgKGkgPT0gbGVuKQotCQkJLyogSXQgaXMgYW4gQVNDSUkgc3RyaW5nLiAqLwotCQkJc2VsZi0+c3RyaW5nID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocywgbGVuKTsKLQkJZWxzZSB7Ci0JCQlzZWxmLT5zdHJpbmcgPSBQeVVuaWNvZGVfRGVjb2RlVVRGOChzLCBsZW4sICJzdHJpY3QiKTsKLQkJCWlmICghc2VsZi0+c3RyaW5nKSB7Ci0JCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCQlzZWxmLT5zdHJpbmcgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzLCBsZW4pOwotCQkJfQotCQl9CisgICAgICAgIGlmIChpID09IGxlbikKKyAgICAgICAgICAgIC8qIEl0IGlzIGFuIEFTQ0lJIHN0cmluZy4gKi8KKyAgICAgICAgICAgIHNlbGYtPnN0cmluZyA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHMsIGxlbik7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgc2VsZi0+c3RyaW5nID0gUHlVbmljb2RlX0RlY29kZVVURjgocywgbGVuLCAic3RyaWN0Iik7CisgICAgICAgICAgICBpZiAoIXNlbGYtPnN0cmluZykgeworICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICAgICAgc2VsZi0+c3RyaW5nID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocywgbGVuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogI2Vsc2UKLQkJc2VsZi0+c3RyaW5nID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocywgbGVuKTsKKyAgICAgICAgc2VsZi0+c3RyaW5nID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocywgbGVuKTsKICNlbmRpZgotCQlpZiAoIXNlbGYtPnN0cmluZykKLQkJCXJldHVybiBOVUxMOwotCX0KLQlQeV9JTkNSRUYoc2VsZi0+c3RyaW5nKTsKLQlyZXR1cm4gc2VsZi0+c3RyaW5nOworICAgICAgICBpZiAoIXNlbGYtPnN0cmluZykKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeV9JTkNSRUYoc2VsZi0+c3RyaW5nKTsKKyAgICByZXR1cm4gc2VsZi0+c3RyaW5nOwogfQogCiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQpAQCAtODAyLDM2ICs4MDIsMzYgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBQeVRjbE9iamVjdF91bmljb2RlKFB5VGNsT2JqZWN0ICpzZWxmLCB2b2lkICppZ25vcmVkKQogewotCWNoYXIgKnM7Ci0JaW50IGxlbjsKLQlpZiAoc2VsZi0+c3RyaW5nICYmIFB5VW5pY29kZV9DaGVjayhzZWxmLT5zdHJpbmcpKSB7Ci0JCVB5X0lOQ1JFRihzZWxmLT5zdHJpbmcpOwotCQlyZXR1cm4gc2VsZi0+c3RyaW5nOwotCX0KLQkvKiBYWFggQ291bGQgY2hhY2hlIHJlc3VsdCBpZiBpdCBpcyBub24tQVNDSUkuICovCi0JcyA9IFRjbF9HZXRTdHJpbmdGcm9tT2JqKHNlbGYtPnZhbHVlLCAmbGVuKTsKLQlyZXR1cm4gUHlVbmljb2RlX0RlY29kZVVURjgocywgbGVuLCAic3RyaWN0Iik7CisgICAgY2hhciAqczsKKyAgICBpbnQgbGVuOworICAgIGlmIChzZWxmLT5zdHJpbmcgJiYgUHlVbmljb2RlX0NoZWNrKHNlbGYtPnN0cmluZykpIHsKKyAgICAgICAgUHlfSU5DUkVGKHNlbGYtPnN0cmluZyk7CisgICAgICAgIHJldHVybiBzZWxmLT5zdHJpbmc7CisgICAgfQorICAgIC8qIFhYWCBDb3VsZCBjaGFjaGUgcmVzdWx0IGlmIGl0IGlzIG5vbi1BU0NJSS4gKi8KKyAgICBzID0gVGNsX0dldFN0cmluZ0Zyb21PYmooc2VsZi0+dmFsdWUsICZsZW4pOworICAgIHJldHVybiBQeVVuaWNvZGVfRGVjb2RlVVRGOChzLCBsZW4sICJzdHJpY3QiKTsKIH0KICNlbmRpZgogCiBzdGF0aWMgUHlPYmplY3QgKgogUHlUY2xPYmplY3RfcmVwcihQeVRjbE9iamVjdCAqc2VsZikKIHsKLQljaGFyIGJ1Zls1MF07Ci0JUHlPU19zbnByaW50ZihidWYsIDUwLCAiPCVzIG9iamVjdCBhdCAlcD4iLAotCQkgICAgICBzZWxmLT52YWx1ZS0+dHlwZVB0ci0+bmFtZSwgc2VsZi0+dmFsdWUpOwotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CisgICAgY2hhciBidWZbNTBdOworICAgIFB5T1Nfc25wcmludGYoYnVmLCA1MCwgIjwlcyBvYmplY3QgYXQgJXA+IiwKKyAgICAgICAgICAgICAgICAgIHNlbGYtPnZhbHVlLT50eXBlUHRyLT5uYW1lLCBzZWxmLT52YWx1ZSk7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmKTsKIH0KIAogc3RhdGljIGludAogUHlUY2xPYmplY3RfY21wKFB5VGNsT2JqZWN0ICpzZWxmLCBQeVRjbE9iamVjdCAqb3RoZXIpCiB7Ci0JaW50IHJlczsKLQlyZXMgPSBzdHJjbXAoVGNsX0dldFN0cmluZyhzZWxmLT52YWx1ZSksCi0JCSAgICAgVGNsX0dldFN0cmluZyhvdGhlci0+dmFsdWUpKTsKLQlpZiAocmVzIDwgMCkgcmV0dXJuIC0xOwotCWlmIChyZXMgPiAwKSByZXR1cm4gMTsKLQlyZXR1cm4gMDsKKyAgICBpbnQgcmVzOworICAgIHJlcyA9IHN0cmNtcChUY2xfR2V0U3RyaW5nKHNlbGYtPnZhbHVlKSwKKyAgICAgICAgICAgICAgICAgVGNsX0dldFN0cmluZyhvdGhlci0+dmFsdWUpKTsKKyAgICBpZiAocmVzIDwgMCkgcmV0dXJuIC0xOworICAgIGlmIChyZXMgPiAwKSByZXR1cm4gMTsKKyAgICByZXR1cm4gMDsKIH0KIAogUHlEb2NfU1RSVkFSKGdldF90eXBlbmFtZV9fZG9jX18sICJuYW1lIG9mIHRoZSBUY2wgdHlwZSIpOwpAQCAtODM5LDI2NCArODM5LDI2NCBAQAogc3RhdGljIFB5T2JqZWN0KgogZ2V0X3R5cGVuYW1lKFB5VGNsT2JqZWN0KiBvYmosIHZvaWQqIGlnbm9yZWQpCiB7Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcob2JqLT52YWx1ZS0+dHlwZVB0ci0+bmFtZSk7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcob2JqLT52YWx1ZS0+dHlwZVB0ci0+bmFtZSk7CiB9CiAKIAogc3RhdGljIFB5R2V0U2V0RGVmIFB5VGNsT2JqZWN0X2dldHNldGxpc3RbXSA9IHsKLQl7InR5cGVuYW1lIiwgKGdldHRlcilnZXRfdHlwZW5hbWUsIE5VTEwsIGdldF90eXBlbmFtZV9fZG9jX199LAotCXsic3RyaW5nIiwgKGdldHRlcilQeVRjbE9iamVjdF9zdHJpbmcsIE5VTEwsIAotCSBQeVRjbE9iamVjdF9zdHJpbmdfX2RvY19ffSwKLQl7MH0sCisgICAgeyJ0eXBlbmFtZSIsIChnZXR0ZXIpZ2V0X3R5cGVuYW1lLCBOVUxMLCBnZXRfdHlwZW5hbWVfX2RvY19ffSwKKyAgICB7InN0cmluZyIsIChnZXR0ZXIpUHlUY2xPYmplY3Rfc3RyaW5nLCBOVUxMLAorICAgICBQeVRjbE9iamVjdF9zdHJpbmdfX2RvY19ffSwKKyAgICB7MH0sCiB9OwogCiBzdGF0aWMgUHlNZXRob2REZWYgUHlUY2xPYmplY3RfbWV0aG9kc1tdID0gewogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQl7Il9fdW5pY29kZV9fIiwJKFB5Q0Z1bmN0aW9uKVB5VGNsT2JqZWN0X3VuaWNvZGUsIE1FVEhfTk9BUkdTLAotCVB5VGNsT2JqZWN0X3VuaWNvZGVfX2RvY19ffSwKKyAgICB7Il9fdW5pY29kZV9fIiwgICAgIChQeUNGdW5jdGlvbilQeVRjbE9iamVjdF91bmljb2RlLCBNRVRIX05PQVJHUywKKyAgICBQeVRjbE9iamVjdF91bmljb2RlX19kb2NfX30sCiAjZW5kaWYKLQl7MH0KKyAgICB7MH0KIH07CiAKIHN0YXRpY2hlcmUgUHlUeXBlT2JqZWN0IFB5VGNsT2JqZWN0X1R5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCi0JMCwJCQkvKm9iX3NpemUqLwotCSJfdGtpbnRlci5UY2xfT2JqIiwJCS8qdHBfbmFtZSovCi0Jc2l6ZW9mKFB5VGNsT2JqZWN0KSwJLyp0cF9iYXNpY3NpemUqLwotCTAsCQkJLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKVB5VGNsT2JqZWN0X2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCi0JMCwJCQkvKnRwX3ByaW50Ki8KLQkwLAkJCS8qdHBfZ2V0YXR0ciovCi0JMCwJCQkvKnRwX3NldGF0dHIqLwotCShjbXBmdW5jKVB5VGNsT2JqZWN0X2NtcCwJLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpUHlUY2xPYmplY3RfcmVwciwJLyp0cF9yZXByKi8KLQkwLAkJCS8qdHBfYXNfbnVtYmVyKi8KLQkwLAkJCS8qdHBfYXNfc2VxdWVuY2UqLwotCTAsCQkJLyp0cF9hc19tYXBwaW5nKi8KLQkwLAkJCS8qdHBfaGFzaCovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY2FsbCovCi0gICAgICAgIChyZXByZnVuYylQeVRjbE9iamVjdF9zdHIsICAgICAgICAvKnRwX3N0ciovCi0gICAgICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLC8qdHBfZ2V0YXR0cm8qLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHJvKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19idWZmZXIqLwotICAgICAgICBQeV9UUEZMQUdTX0RFRkFVTFQsICAgICAvKnRwX2ZsYWdzKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kb2MqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3RyYXZlcnNlKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jbGVhciovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmljaGNvbXBhcmUqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVyKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVybmV4dCovCi0gICAgICAgIFB5VGNsT2JqZWN0X21ldGhvZHMsICAgIC8qdHBfbWV0aG9kcyovCi0gICAgICAgIDAsCQkJLyp0cF9tZW1iZXJzKi8KLSAgICAgICAgUHlUY2xPYmplY3RfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2Jhc2UqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2RpY3QqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2Rlc2NyX2dldCovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGVzY3Jfc2V0Ki8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kaWN0b2Zmc2V0Ki8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pbml0Ki8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hbGxvYyovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfbmV3Ki8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9mcmVlKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pc19nYyovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb2Jfc2l6ZSovCisgICAgIl90a2ludGVyLlRjbF9PYmoiLCAgICAgICAgICAgICAgICAgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoUHlUY2xPYmplY3QpLCAgICAgICAgLyp0cF9iYXNpY3NpemUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpUHlUY2xPYmplY3RfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9wcmludCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0YXR0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc2V0YXR0ciovCisgICAgKGNtcGZ1bmMpUHlUY2xPYmplY3RfY21wLCAgICAgICAgICAgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpUHlUY2xPYmplY3RfcmVwciwgICAgICAgICAvKnRwX3JlcHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX251bWJlciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfc2VxdWVuY2UqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX21hcHBpbmcqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2hhc2gqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY2FsbCovCisgICAgKHJlcHJmdW5jKVB5VGNsT2JqZWN0X3N0ciwgICAgICAgIC8qdHBfc3RyKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwvKnRwX2dldGF0dHJvKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHJvKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgLyp0cF9mbGFncyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kb2MqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfdHJhdmVyc2UqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY2xlYXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVybmV4dCovCisgICAgUHlUY2xPYmplY3RfbWV0aG9kcywgICAgLyp0cF9tZXRob2RzKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9tZW1iZXJzKi8KKyAgICBQeVRjbE9iamVjdF9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9iYXNlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2RpY3QqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2luaXQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYWxsb2MqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfbmV3Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2ZyZWUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXNfZ2MqLwogfTsKIAogc3RhdGljIFRjbF9PYmoqCiBBc09iaihQeU9iamVjdCAqdmFsdWUpCiB7Ci0JVGNsX09iaiAqcmVzdWx0OworICAgIFRjbF9PYmogKnJlc3VsdDsKIAotCWlmIChQeVN0cmluZ19DaGVjayh2YWx1ZSkpCi0JCXJldHVybiBUY2xfTmV3U3RyaW5nT2JqKFB5U3RyaW5nX0FTX1NUUklORyh2YWx1ZSksCi0JCQkJCVB5U3RyaW5nX0dFVF9TSVpFKHZhbHVlKSk7Ci0JZWxzZSBpZiAoUHlCb29sX0NoZWNrKHZhbHVlKSkKLQkJcmV0dXJuIFRjbF9OZXdCb29sZWFuT2JqKFB5T2JqZWN0X0lzVHJ1ZSh2YWx1ZSkpOwotCWVsc2UgaWYgKFB5SW50X0NoZWNrKHZhbHVlKSkKLQkJcmV0dXJuIFRjbF9OZXdMb25nT2JqKFB5SW50X0FTX0xPTkcodmFsdWUpKTsKLQllbHNlIGlmIChQeUZsb2F0X0NoZWNrKHZhbHVlKSkKLQkJcmV0dXJuIFRjbF9OZXdEb3VibGVPYmooUHlGbG9hdF9BU19ET1VCTEUodmFsdWUpKTsKLQllbHNlIGlmIChQeVR1cGxlX0NoZWNrKHZhbHVlKSkgewotCQlUY2xfT2JqICoqYXJndiA9IChUY2xfT2JqKiopCi0JCQlja2FsbG9jKFB5VHVwbGVfU2l6ZSh2YWx1ZSkqc2l6ZW9mKFRjbF9PYmoqKSk7Ci0JCWludCBpOwotCQlpZighYXJndikKLQkJICByZXR1cm4gMDsKLQkJZm9yKGk9MDtpPFB5VHVwbGVfU2l6ZSh2YWx1ZSk7aSsrKQotCQkgIGFyZ3ZbaV0gPSBBc09iaihQeVR1cGxlX0dldEl0ZW0odmFsdWUsaSkpOwotCQlyZXN1bHQgPSBUY2xfTmV3TGlzdE9iaihQeVR1cGxlX1NpemUodmFsdWUpLCBhcmd2KTsKLQkJY2tmcmVlKEZSRUVDQVNUIGFyZ3YpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KKyAgICBpZiAoUHlTdHJpbmdfQ2hlY2sodmFsdWUpKQorICAgICAgICByZXR1cm4gVGNsX05ld1N0cmluZ09iaihQeVN0cmluZ19BU19TVFJJTkcodmFsdWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19HRVRfU0laRSh2YWx1ZSkpOworICAgIGVsc2UgaWYgKFB5Qm9vbF9DaGVjayh2YWx1ZSkpCisgICAgICAgIHJldHVybiBUY2xfTmV3Qm9vbGVhbk9iaihQeU9iamVjdF9Jc1RydWUodmFsdWUpKTsKKyAgICBlbHNlIGlmIChQeUludF9DaGVjayh2YWx1ZSkpCisgICAgICAgIHJldHVybiBUY2xfTmV3TG9uZ09iaihQeUludF9BU19MT05HKHZhbHVlKSk7CisgICAgZWxzZSBpZiAoUHlGbG9hdF9DaGVjayh2YWx1ZSkpCisgICAgICAgIHJldHVybiBUY2xfTmV3RG91YmxlT2JqKFB5RmxvYXRfQVNfRE9VQkxFKHZhbHVlKSk7CisgICAgZWxzZSBpZiAoUHlUdXBsZV9DaGVjayh2YWx1ZSkpIHsKKyAgICAgICAgVGNsX09iaiAqKmFyZ3YgPSAoVGNsX09iaioqKQorICAgICAgICAgICAgY2thbGxvYyhQeVR1cGxlX1NpemUodmFsdWUpKnNpemVvZihUY2xfT2JqKikpOworICAgICAgICBpbnQgaTsKKyAgICAgICAgaWYoIWFyZ3YpCisgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGZvcihpPTA7aTxQeVR1cGxlX1NpemUodmFsdWUpO2krKykKKyAgICAgICAgICBhcmd2W2ldID0gQXNPYmooUHlUdXBsZV9HZXRJdGVtKHZhbHVlLGkpKTsKKyAgICAgICAgcmVzdWx0ID0gVGNsX05ld0xpc3RPYmooUHlUdXBsZV9TaXplKHZhbHVlKSwgYXJndik7CisgICAgICAgIGNrZnJlZShGUkVFQ0FTVCBhcmd2KTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCWVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayh2YWx1ZSkpIHsKLQkJUHlfVU5JQ09ERSAqaW5idWYgPSBQeVVuaWNvZGVfQVNfVU5JQ09ERSh2YWx1ZSk7Ci0JCVB5X3NzaXplX3Qgc2l6ZSA9IFB5VW5pY29kZV9HRVRfU0laRSh2YWx1ZSk7Ci0JCS8qIFRoaXMgI2lmZGVmIGFzc3VtZXMgdGhhdCBUY2wgdXNlcyBVQ1MtMi4KLQkJICAgU2VlIFRDTF9VVEZfTUFYIHRlc3QgYWJvdmUuICovCisgICAgZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrKHZhbHVlKSkgeworICAgICAgICBQeV9VTklDT0RFICppbmJ1ZiA9IFB5VW5pY29kZV9BU19VTklDT0RFKHZhbHVlKTsKKyAgICAgICAgUHlfc3NpemVfdCBzaXplID0gUHlVbmljb2RlX0dFVF9TSVpFKHZhbHVlKTsKKyAgICAgICAgLyogVGhpcyAjaWZkZWYgYXNzdW1lcyB0aGF0IFRjbCB1c2VzIFVDUy0yLgorICAgICAgICAgICBTZWUgVENMX1VURl9NQVggdGVzdCBhYm92ZS4gKi8KICNpZiBkZWZpbmVkKFB5X1VOSUNPREVfV0lERSkgJiYgVENMX1VURl9NQVggPT0gMwotCQlUY2xfVW5pQ2hhciAqb3V0YnVmID0gTlVMTDsKLQkJUHlfc3NpemVfdCBpOwotCQlzaXplX3QgYWxsb2NzaXplID0gKChzaXplX3Qpc2l6ZSkgKiBzaXplb2YoVGNsX1VuaUNoYXIpOwotCQlpZiAoYWxsb2NzaXplID49IHNpemUpCi0JCQlvdXRidWYgPSAoVGNsX1VuaUNoYXIqKWNrYWxsb2MoYWxsb2NzaXplKTsKLQkJLyogRWxzZSBvdmVyZmxvdyBvY2N1cnJlZCwgYW5kIHdlIHRha2UgdGhlIG5leHQgZXhpdCAqLwotCQlpZiAoIW91dGJ1ZikgewotCQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWlmIChpbmJ1ZltpXSA+PSAweDEwMDAwKSB7Ci0JCQkJLyogVGNsIGRvZXNuJ3QgZG8gVVRGLTE2LCB5ZXQuICovCi0JCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJCQkidW5zdXBwb3J0ZWQgY2hhcmFjdGVyIik7Ci0JCQkJY2tmcmVlKEZSRUVDQVNUIG91dGJ1Zik7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCQlvdXRidWZbaV0gPSBpbmJ1ZltpXTsKLQkJfQotCQlyZXN1bHQgPSBUY2xfTmV3VW5pY29kZU9iaihvdXRidWYsIHNpemUpOwotCQlja2ZyZWUoRlJFRUNBU1Qgb3V0YnVmKTsKLQkJcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgVGNsX1VuaUNoYXIgKm91dGJ1ZiA9IE5VTEw7CisgICAgICAgIFB5X3NzaXplX3QgaTsKKyAgICAgICAgc2l6ZV90IGFsbG9jc2l6ZSA9ICgoc2l6ZV90KXNpemUpICogc2l6ZW9mKFRjbF9VbmlDaGFyKTsKKyAgICAgICAgaWYgKGFsbG9jc2l6ZSA+PSBzaXplKQorICAgICAgICAgICAgb3V0YnVmID0gKFRjbF9VbmlDaGFyKilja2FsbG9jKGFsbG9jc2l6ZSk7CisgICAgICAgIC8qIEVsc2Ugb3ZlcmZsb3cgb2NjdXJyZWQsIGFuZCB3ZSB0YWtlIHRoZSBuZXh0IGV4aXQgKi8KKyAgICAgICAgaWYgKCFvdXRidWYpIHsKKyAgICAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBpZiAoaW5idWZbaV0gPj0gMHgxMDAwMCkgeworICAgICAgICAgICAgICAgIC8qIFRjbCBkb2Vzbid0IGRvIFVURi0xNiwgeWV0LiAqLworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5zdXBwb3J0ZWQgY2hhcmFjdGVyIik7CisgICAgICAgICAgICAgICAgY2tmcmVlKEZSRUVDQVNUIG91dGJ1Zik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXRidWZbaV0gPSBpbmJ1ZltpXTsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQgPSBUY2xfTmV3VW5pY29kZU9iaihvdXRidWYsIHNpemUpOworICAgICAgICBja2ZyZWUoRlJFRUNBU1Qgb3V0YnVmKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKICNlbHNlCi0JCXJldHVybiBUY2xfTmV3VW5pY29kZU9iaihpbmJ1Ziwgc2l6ZSk7CisgICAgICAgIHJldHVybiBUY2xfTmV3VW5pY29kZU9iaihpbmJ1Ziwgc2l6ZSk7CiAjZW5kaWYKIAotCX0KKyAgICB9CiAjZW5kaWYKLQllbHNlIGlmKFB5VGNsT2JqZWN0X0NoZWNrKHZhbHVlKSkgewotCQlUY2xfT2JqICp2ID0gKChQeVRjbE9iamVjdCopdmFsdWUpLT52YWx1ZTsKLQkJVGNsX0luY3JSZWZDb3VudCh2KTsKLQkJcmV0dXJuIHY7Ci0JfSAKLQllbHNlIHsKLQkJUHlPYmplY3QgKnYgPSBQeU9iamVjdF9TdHIodmFsdWUpOwotCQlpZiAoIXYpCi0JCQlyZXR1cm4gMDsKLQkJcmVzdWx0ID0gQXNPYmoodik7Ci0JCVB5X0RFQ1JFRih2KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9CisgICAgZWxzZSBpZihQeVRjbE9iamVjdF9DaGVjayh2YWx1ZSkpIHsKKyAgICAgICAgVGNsX09iaiAqdiA9ICgoUHlUY2xPYmplY3QqKXZhbHVlKS0+dmFsdWU7CisgICAgICAgIFRjbF9JbmNyUmVmQ291bnQodik7CisgICAgICAgIHJldHVybiB2OworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgUHlPYmplY3QgKnYgPSBQeU9iamVjdF9TdHIodmFsdWUpOworICAgICAgICBpZiAoIXYpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgcmVzdWx0ID0gQXNPYmoodik7CisgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CiB9CiAKIHN0YXRpYyBQeU9iamVjdCoKIEZyb21PYmooUHlPYmplY3QqIHRrYXBwLCBUY2xfT2JqICp2YWx1ZSkKIHsKLQlQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKLQlUa2FwcE9iamVjdCAqYXBwID0gKFRrYXBwT2JqZWN0Kil0a2FwcDsKKyAgICBQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKKyAgICBUa2FwcE9iamVjdCAqYXBwID0gKFRrYXBwT2JqZWN0Kil0a2FwcDsKIAotCWlmICh2YWx1ZS0+dHlwZVB0ciA9PSBOVUxMKSB7Ci0JCS8qIElmIHRoZSByZXN1bHQgY29udGFpbnMgYW55IGJ5dGVzIHdpdGggdGhlIHRvcCBiaXQgc2V0LAotCQkgICBpdCdzIFVURi04IGFuZCB3ZSBzaG91bGQgZGVjb2RlIGl0IHRvIFVuaWNvZGUgKi8KKyAgICBpZiAodmFsdWUtPnR5cGVQdHIgPT0gTlVMTCkgeworICAgICAgICAvKiBJZiB0aGUgcmVzdWx0IGNvbnRhaW5zIGFueSBieXRlcyB3aXRoIHRoZSB0b3AgYml0IHNldCwKKyAgICAgICAgICAgaXQncyBVVEYtOCBhbmQgd2Ugc2hvdWxkIGRlY29kZSBpdCB0byBVbmljb2RlICovCiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCQlpbnQgaTsKLQkJY2hhciAqcyA9IHZhbHVlLT5ieXRlczsKLQkJaW50IGxlbiA9IHZhbHVlLT5sZW5ndGg7Ci0JCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJaWYgKHZhbHVlLT5ieXRlc1tpXSAmIDB4ODApCi0JCQkJYnJlYWs7Ci0JCX0KKyAgICAgICAgaW50IGk7CisgICAgICAgIGNoYXIgKnMgPSB2YWx1ZS0+Ynl0ZXM7CisgICAgICAgIGludCBsZW4gPSB2YWx1ZS0+bGVuZ3RoOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgICAgIGlmICh2YWx1ZS0+Ynl0ZXNbaV0gJiAweDgwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CiAKLQkJaWYgKGkgPT0gdmFsdWUtPmxlbmd0aCkKLQkJCXJlc3VsdCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHMsIGxlbik7Ci0JCWVsc2UgewotCQkJLyogQ29udmVydCBVVEYtOCB0byBVbmljb2RlIHN0cmluZyAqLwotCQkJcmVzdWx0ID0gUHlVbmljb2RlX0RlY29kZVVURjgocywgbGVuLCAic3RyaWN0Iik7Ci0JCQlpZiAocmVzdWx0ID09IE5VTEwpIHsKLQkJCQlQeUVycl9DbGVhcigpOwotCQkJCXJlc3VsdCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHMsIGxlbik7Ci0JCQl9Ci0JCX0KKyAgICAgICAgaWYgKGkgPT0gdmFsdWUtPmxlbmd0aCkKKyAgICAgICAgICAgIHJlc3VsdCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHMsIGxlbik7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLyogQ29udmVydCBVVEYtOCB0byBVbmljb2RlIHN0cmluZyAqLworICAgICAgICAgICAgcmVzdWx0ID0gUHlVbmljb2RlX0RlY29kZVVURjgocywgbGVuLCAic3RyaWN0Iik7CisgICAgICAgICAgICBpZiAocmVzdWx0ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHMsIGxlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICNlbHNlCi0JCXJlc3VsdCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHZhbHVlLT5ieXRlcywgdmFsdWUtPmxlbmd0aCk7CisgICAgICAgIHJlc3VsdCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHZhbHVlLT5ieXRlcywgdmFsdWUtPmxlbmd0aCk7CiAjZW5kaWYKLQkJcmV0dXJuIHJlc3VsdDsKLQl9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQogCi0JaWYgKHZhbHVlLT50eXBlUHRyID09IGFwcC0+Qm9vbGVhblR5cGUpIHsKLQkJcmVzdWx0ID0gdmFsdWUtPmludGVybmFsUmVwLmxvbmdWYWx1ZSA/IFB5X1RydWUgOiBQeV9GYWxzZTsKLQkJUHlfSU5DUkVGKHJlc3VsdCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQorICAgIGlmICh2YWx1ZS0+dHlwZVB0ciA9PSBhcHAtPkJvb2xlYW5UeXBlKSB7CisgICAgICAgIHJlc3VsdCA9IHZhbHVlLT5pbnRlcm5hbFJlcC5sb25nVmFsdWUgPyBQeV9UcnVlIDogUHlfRmFsc2U7CisgICAgICAgIFB5X0lOQ1JFRihyZXN1bHQpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KIAotCWlmICh2YWx1ZS0+dHlwZVB0ciA9PSBhcHAtPkJ5dGVBcnJheVR5cGUpIHsKLQkJaW50IHNpemU7Ci0JCWNoYXIgKmRhdGEgPSAoY2hhciopVGNsX0dldEJ5dGVBcnJheUZyb21PYmoodmFsdWUsICZzaXplKTsKLQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGRhdGEsIHNpemUpOwotCX0KKyAgICBpZiAodmFsdWUtPnR5cGVQdHIgPT0gYXBwLT5CeXRlQXJyYXlUeXBlKSB7CisgICAgICAgIGludCBzaXplOworICAgICAgICBjaGFyICpkYXRhID0gKGNoYXIqKVRjbF9HZXRCeXRlQXJyYXlGcm9tT2JqKHZhbHVlLCAmc2l6ZSk7CisgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShkYXRhLCBzaXplKTsKKyAgICB9CiAKLQlpZiAodmFsdWUtPnR5cGVQdHIgPT0gYXBwLT5Eb3VibGVUeXBlKSB7Ci0JCXJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUodmFsdWUtPmludGVybmFsUmVwLmRvdWJsZVZhbHVlKTsKLQl9CisgICAgaWYgKHZhbHVlLT50eXBlUHRyID09IGFwcC0+RG91YmxlVHlwZSkgeworICAgICAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKHZhbHVlLT5pbnRlcm5hbFJlcC5kb3VibGVWYWx1ZSk7CisgICAgfQogCi0JaWYgKHZhbHVlLT50eXBlUHRyID09IGFwcC0+SW50VHlwZSkgewotCQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcodmFsdWUtPmludGVybmFsUmVwLmxvbmdWYWx1ZSk7Ci0JfQorICAgIGlmICh2YWx1ZS0+dHlwZVB0ciA9PSBhcHAtPkludFR5cGUpIHsKKyAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHZhbHVlLT5pbnRlcm5hbFJlcC5sb25nVmFsdWUpOworICAgIH0KIAotCWlmICh2YWx1ZS0+dHlwZVB0ciA9PSBhcHAtPkxpc3RUeXBlKSB7Ci0JCWludCBzaXplOwotCQlpbnQgaSwgc3RhdHVzOwotCQlQeU9iamVjdCAqZWxlbTsKLQkJVGNsX09iaiAqdGNsX2VsZW07CisgICAgaWYgKHZhbHVlLT50eXBlUHRyID09IGFwcC0+TGlzdFR5cGUpIHsKKyAgICAgICAgaW50IHNpemU7CisgICAgICAgIGludCBpLCBzdGF0dXM7CisgICAgICAgIFB5T2JqZWN0ICplbGVtOworICAgICAgICBUY2xfT2JqICp0Y2xfZWxlbTsKIAotCQlzdGF0dXMgPSBUY2xfTGlzdE9iakxlbmd0aChUa2FwcF9JbnRlcnAodGthcHApLCB2YWx1ZSwgJnNpemUpOwotCQlpZiAoc3RhdHVzID09IFRDTF9FUlJPUikKLQkJCXJldHVybiBUa2ludGVyX0Vycm9yKHRrYXBwKTsKLQkJcmVzdWx0ID0gUHlUdXBsZV9OZXcoc2l6ZSk7Ci0JCWlmICghcmVzdWx0KQotCQkJcmV0dXJuIE5VTEw7Ci0JCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCXN0YXR1cyA9IFRjbF9MaXN0T2JqSW5kZXgoVGthcHBfSW50ZXJwKHRrYXBwKSwKLQkJCQkJCSAgdmFsdWUsIGksICZ0Y2xfZWxlbSk7Ci0JCQlpZiAoc3RhdHVzID09IFRDTF9FUlJPUikgewotCQkJCVB5X0RFQ1JFRihyZXN1bHQpOwotCQkJCXJldHVybiBUa2ludGVyX0Vycm9yKHRrYXBwKTsKLQkJCX0KLQkJCWVsZW0gPSBGcm9tT2JqKHRrYXBwLCB0Y2xfZWxlbSk7Ci0JCQlpZiAoIWVsZW0pIHsKLQkJCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJCVB5VHVwbGVfU2V0SXRlbShyZXN1bHQsIGksIGVsZW0pOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQorICAgICAgICBzdGF0dXMgPSBUY2xfTGlzdE9iakxlbmd0aChUa2FwcF9JbnRlcnAodGthcHApLCB2YWx1ZSwgJnNpemUpOworICAgICAgICBpZiAoc3RhdHVzID09IFRDTF9FUlJPUikKKyAgICAgICAgICAgIHJldHVybiBUa2ludGVyX0Vycm9yKHRrYXBwKTsKKyAgICAgICAgcmVzdWx0ID0gUHlUdXBsZV9OZXcoc2l6ZSk7CisgICAgICAgIGlmICghcmVzdWx0KQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IFRjbF9MaXN0T2JqSW5kZXgoVGthcHBfSW50ZXJwKHRrYXBwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsIGksICZ0Y2xfZWxlbSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IFRDTF9FUlJPUikgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICAgICAgICAgIHJldHVybiBUa2ludGVyX0Vycm9yKHRrYXBwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsZW0gPSBGcm9tT2JqKHRrYXBwLCB0Y2xfZWxlbSk7CisgICAgICAgICAgICBpZiAoIWVsZW0pIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5VHVwbGVfU2V0SXRlbShyZXN1bHQsIGksIGVsZW0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQogCi0JaWYgKHZhbHVlLT50eXBlUHRyID09IGFwcC0+UHJvY0JvZHlUeXBlKSB7Ci0JICAvKiBmYWxsIHRocm91Z2g6IHJldHVybiB0Y2wgb2JqZWN0LiAqLwotCX0KKyAgICBpZiAodmFsdWUtPnR5cGVQdHIgPT0gYXBwLT5Qcm9jQm9keVR5cGUpIHsKKyAgICAgIC8qIGZhbGwgdGhyb3VnaDogcmV0dXJuIHRjbCBvYmplY3QuICovCisgICAgfQogCi0JaWYgKHZhbHVlLT50eXBlUHRyID09IGFwcC0+U3RyaW5nVHlwZSkgeworICAgIGlmICh2YWx1ZS0+dHlwZVB0ciA9PSBhcHAtPlN0cmluZ1R5cGUpIHsKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCiAjaWYgZGVmaW5lZChQeV9VTklDT0RFX1dJREUpICYmIFRDTF9VVEZfTUFYPT0zCi0JCVB5T2JqZWN0ICpyZXN1bHQ7Ci0JCWludCBzaXplOwotCQlUY2xfVW5pQ2hhciAqaW5wdXQ7Ci0JCVB5X1VOSUNPREUgKm91dHB1dDsKKyAgICAgICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICAgICAgaW50IHNpemU7CisgICAgICAgIFRjbF9VbmlDaGFyICppbnB1dDsKKyAgICAgICAgUHlfVU5JQ09ERSAqb3V0cHV0OwogCi0JCXNpemUgPSBUY2xfR2V0Q2hhckxlbmd0aCh2YWx1ZSk7Ci0JCXJlc3VsdCA9IFB5VW5pY29kZV9Gcm9tVW5pY29kZShOVUxMLCBzaXplKTsKLQkJaWYgKCFyZXN1bHQpCi0JCQlyZXR1cm4gTlVMTDsKLQkJaW5wdXQgPSBUY2xfR2V0VW5pY29kZSh2YWx1ZSk7Ci0JCW91dHB1dCA9IFB5VW5pY29kZV9BU19VTklDT0RFKHJlc3VsdCk7Ci0JCXdoaWxlIChzaXplLS0pCi0JCQkqb3V0cHV0KysgPSAqaW5wdXQrKzsKLQkJcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgc2l6ZSA9IFRjbF9HZXRDaGFyTGVuZ3RoKHZhbHVlKTsKKyAgICAgICAgcmVzdWx0ID0gUHlVbmljb2RlX0Zyb21Vbmljb2RlKE5VTEwsIHNpemUpOworICAgICAgICBpZiAoIXJlc3VsdCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBpbnB1dCA9IFRjbF9HZXRVbmljb2RlKHZhbHVlKTsKKyAgICAgICAgb3V0cHV0ID0gUHlVbmljb2RlX0FTX1VOSUNPREUocmVzdWx0KTsKKyAgICAgICAgd2hpbGUgKHNpemUtLSkKKyAgICAgICAgICAgICpvdXRwdXQrKyA9ICppbnB1dCsrOworICAgICAgICByZXR1cm4gcmVzdWx0OwogI2Vsc2UKLQkJcmV0dXJuIFB5VW5pY29kZV9Gcm9tVW5pY29kZShUY2xfR2V0VW5pY29kZSh2YWx1ZSksCi0JCQkJCSAgICAgVGNsX0dldENoYXJMZW5ndGgodmFsdWUpKTsKKyAgICAgICAgcmV0dXJuIFB5VW5pY29kZV9Gcm9tVW5pY29kZShUY2xfR2V0VW5pY29kZSh2YWx1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGNsX0dldENoYXJMZW5ndGgodmFsdWUpKTsKICNlbmRpZgogI2Vsc2UKLQkJaW50IHNpemU7Ci0JCWNoYXIgKmM7Ci0JCWMgPSBUY2xfR2V0U3RyaW5nRnJvbU9iaih2YWx1ZSwgJnNpemUpOwotCQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoYywgc2l6ZSk7CisgICAgICAgIGludCBzaXplOworICAgICAgICBjaGFyICpjOworICAgICAgICBjID0gVGNsX0dldFN0cmluZ0Zyb21PYmoodmFsdWUsICZzaXplKTsKKyAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGMsIHNpemUpOwogI2VuZGlmCi0JfQorICAgIH0KIAotCXJldHVybiBuZXdQeVRjbE9iamVjdCh2YWx1ZSk7CisgICAgcmV0dXJuIG5ld1B5VGNsT2JqZWN0KHZhbHVlKTsKIH0KIAogLyogVGhpcyBtdXRleCBzeW5jaHJvbml6ZXMgaW50ZXItdGhyZWFkIGNvbW1hbmQgY2FsbHMuICovCkBAIC0xMTA0LDIzICsxMTA0LDIzIEBACiBUQ0xfREVDTEFSRV9NVVRFWChjYWxsX211dGV4KQogCiB0eXBlZGVmIHN0cnVjdCBUa2FwcF9DYWxsRXZlbnQgewotCVRjbF9FdmVudCBldjsJICAgICAvKiBNdXN0IGJlIGZpcnN0ICovCi0JVGthcHBPYmplY3QgKnNlbGY7Ci0JUHlPYmplY3QgKmFyZ3M7Ci0JaW50IGZsYWdzOwotCVB5T2JqZWN0ICoqcmVzOwotCVB5T2JqZWN0ICoqZXhjX3R5cGUsICoqZXhjX3ZhbHVlLCAqKmV4Y190YjsKLQlUY2xfQ29uZGl0aW9uIGRvbmU7CisgICAgVGNsX0V2ZW50IGV2OyAgICAgICAgICAgIC8qIE11c3QgYmUgZmlyc3QgKi8KKyAgICBUa2FwcE9iamVjdCAqc2VsZjsKKyAgICBQeU9iamVjdCAqYXJnczsKKyAgICBpbnQgZmxhZ3M7CisgICAgUHlPYmplY3QgKipyZXM7CisgICAgUHlPYmplY3QgKipleGNfdHlwZSwgKipleGNfdmFsdWUsICoqZXhjX3RiOworICAgIFRjbF9Db25kaXRpb24gZG9uZTsKIH0gVGthcHBfQ2FsbEV2ZW50OwogCiB2b2lkCiBUa2FwcF9DYWxsRGVhbGxvY0FyZ3MoVGNsX09iaioqIG9ianYsIFRjbF9PYmoqKiBvYmpTdG9yZSwgaW50IG9iamMpCiB7Ci0JaW50IGk7Ci0JZm9yIChpID0gMDsgaSA8IG9iamM7IGkrKykKLQkJVGNsX0RlY3JSZWZDb3VudChvYmp2W2ldKTsKLQlpZiAob2JqdiAhPSBvYmpTdG9yZSkKLQkJY2tmcmVlKEZSRUVDQVNUIG9ianYpOworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBvYmpjOyBpKyspCisgICAgICAgIFRjbF9EZWNyUmVmQ291bnQob2JqdltpXSk7CisgICAgaWYgKG9ianYgIT0gb2JqU3RvcmUpCisgICAgICAgIGNrZnJlZShGUkVFQ0FTVCBvYmp2KTsKIH0KIAogLyogQ29udmVydCBQeXRob24gb2JqZWN0cyB0byBUY2wgb2JqZWN0cy4gVGhpcyBtdXN0IGhhcHBlbiBpbiB0aGUKQEAgLTExMjksNTEgKzExMjksNTEgQEAKIHN0YXRpYyBUY2xfT2JqKioKIFRrYXBwX0NhbGxBcmdzKFB5T2JqZWN0ICphcmdzLCBUY2xfT2JqKiogb2JqU3RvcmUsIGludCAqcG9iamMpCiB7Ci0JVGNsX09iaiAqKm9ianYgPSBvYmpTdG9yZTsKLQlpbnQgb2JqYyA9IDAsIGk7Ci0JaWYgKGFyZ3MgPT0gTlVMTCkKLQkJLyogZG8gbm90aGluZyAqLzsKKyAgICBUY2xfT2JqICoqb2JqdiA9IG9ialN0b3JlOworICAgIGludCBvYmpjID0gMCwgaTsKKyAgICBpZiAoYXJncyA9PSBOVUxMKQorICAgICAgICAvKiBkbyBub3RoaW5nICovOwogCi0JZWxzZSBpZiAoIVB5VHVwbGVfQ2hlY2soYXJncykpIHsKLQkJb2JqdlswXSA9IEFzT2JqKGFyZ3MpOwotCQlpZiAob2JqdlswXSA9PSAwKQotCQkJZ290byBmaW5hbGx5OwotCQlvYmpjID0gMTsKLQkJVGNsX0luY3JSZWZDb3VudChvYmp2WzBdKTsKLQl9Ci0JZWxzZSB7Ci0JCW9iamMgPSBQeVR1cGxlX1NpemUoYXJncyk7CisgICAgZWxzZSBpZiAoIVB5VHVwbGVfQ2hlY2soYXJncykpIHsKKyAgICAgICAgb2JqdlswXSA9IEFzT2JqKGFyZ3MpOworICAgICAgICBpZiAob2JqdlswXSA9PSAwKQorICAgICAgICAgICAgZ290byBmaW5hbGx5OworICAgICAgICBvYmpjID0gMTsKKyAgICAgICAgVGNsX0luY3JSZWZDb3VudChvYmp2WzBdKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIG9iamMgPSBQeVR1cGxlX1NpemUoYXJncyk7CiAKLQkJaWYgKG9iamMgPiBBUkdTWikgewotCQkJb2JqdiA9IChUY2xfT2JqICoqKWNrYWxsb2Mob2JqYyAqIHNpemVvZihjaGFyICopKTsKLQkJCWlmIChvYmp2ID09IE5VTEwpIHsKLQkJCQlQeUVycl9Ob01lbW9yeSgpOwotCQkJCW9iamMgPSAwOwotCQkJCWdvdG8gZmluYWxseTsKLQkJCX0KLQkJfQorICAgICAgICBpZiAob2JqYyA+IEFSR1NaKSB7CisgICAgICAgICAgICBvYmp2ID0gKFRjbF9PYmogKiopY2thbGxvYyhvYmpjICogc2l6ZW9mKGNoYXIgKikpOworICAgICAgICAgICAgaWYgKG9ianYgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgICAgICAgICAgb2JqYyA9IDA7CisgICAgICAgICAgICAgICAgZ290byBmaW5hbGx5OworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJZm9yIChpID0gMDsgaSA8IG9iamM7IGkrKykgewotCQkJUHlPYmplY3QgKnYgPSBQeVR1cGxlX0dldEl0ZW0oYXJncywgaSk7Ci0JCQlpZiAodiA9PSBQeV9Ob25lKSB7Ci0JCQkJb2JqYyA9IGk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlvYmp2W2ldID0gQXNPYmoodik7Ci0JCQlpZiAoIW9ianZbaV0pIHsKLQkJCQkvKiBSZXNldCBvYmpjLCBzbyBpdCBhdHRlbXB0cyB0byBjbGVhcgotCQkJCSAgIG9iamVjdHMgb25seSB1cCB0byBpLiAqLwotCQkJCW9iamMgPSBpOwotCQkJCWdvdG8gZmluYWxseTsKLQkJCX0KLQkJCVRjbF9JbmNyUmVmQ291bnQob2JqdltpXSk7Ci0JCX0KLQl9Ci0JKnBvYmpjID0gb2JqYzsKLQlyZXR1cm4gb2JqdjsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG9iamM7IGkrKykgeworICAgICAgICAgICAgUHlPYmplY3QgKnYgPSBQeVR1cGxlX0dldEl0ZW0oYXJncywgaSk7CisgICAgICAgICAgICBpZiAodiA9PSBQeV9Ob25lKSB7CisgICAgICAgICAgICAgICAgb2JqYyA9IGk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvYmp2W2ldID0gQXNPYmoodik7CisgICAgICAgICAgICBpZiAoIW9ianZbaV0pIHsKKyAgICAgICAgICAgICAgICAvKiBSZXNldCBvYmpjLCBzbyBpdCBhdHRlbXB0cyB0byBjbGVhcgorICAgICAgICAgICAgICAgICAgIG9iamVjdHMgb25seSB1cCB0byBpLiAqLworICAgICAgICAgICAgICAgIG9iamMgPSBpOworICAgICAgICAgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFRjbF9JbmNyUmVmQ291bnQob2JqdltpXSk7CisgICAgICAgIH0KKyAgICB9CisgICAgKnBvYmpjID0gb2JqYzsKKyAgICByZXR1cm4gb2JqdjsKIGZpbmFsbHk6Ci0JVGthcHBfQ2FsbERlYWxsb2NBcmdzKG9ianYsIG9ialN0b3JlLCBvYmpjKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBUa2FwcF9DYWxsRGVhbGxvY0FyZ3Mob2Jqdiwgb2JqU3RvcmUsIG9iamMpOworICAgIHJldHVybiBOVUxMOwogfQogCiAvKiBDb252ZXJ0IHRoZSByZXN1bHRzIG9mIGEgY29tbWFuZCBjYWxsIGludG8gYSBQeXRob24gb2JqZWN0cy4gKi8KQEAgLTExODEsNDUgKzExODEsNDUgQEAKIHN0YXRpYyBQeU9iamVjdCoKIFRrYXBwX0NhbGxSZXN1bHQoVGthcHBPYmplY3QgKnNlbGYpCiB7Ci0JUHlPYmplY3QgKnJlcyA9IE5VTEw7Ci0JaWYoc2VsZi0+d2FudG9iamVjdHMpIHsKLQkJVGNsX09iaiAqdmFsdWUgPSBUY2xfR2V0T2JqUmVzdWx0KHNlbGYtPmludGVycCk7Ci0JCS8qIE5vdCBzdXJlIHdoZXRoZXIgdGhlIEluY3JSZWYgaXMgbmVjZXNzYXJ5LCBidXQgc29tZXRoaW5nCi0JCSAgIG1heSBvdmVyd3JpdGUgdGhlIGludGVycHJldGVyIHJlc3VsdCB3aGlsZSB3ZSBhcmUKLQkJICAgY29udmVydGluZyBpdC4gKi8KLQkJVGNsX0luY3JSZWZDb3VudCh2YWx1ZSk7Ci0JCXJlcyA9IEZyb21PYmooKFB5T2JqZWN0KilzZWxmLCB2YWx1ZSk7Ci0JCVRjbF9EZWNyUmVmQ291bnQodmFsdWUpOwotCX0gZWxzZSB7Ci0JCWNvbnN0IGNoYXIgKnMgPSBUY2xfR2V0U3RyaW5nUmVzdWx0KHNlbGYtPmludGVycCk7Ci0JCWNvbnN0IGNoYXIgKnAgPSBzOworICAgIFB5T2JqZWN0ICpyZXMgPSBOVUxMOworICAgIGlmKHNlbGYtPndhbnRvYmplY3RzKSB7CisgICAgICAgIFRjbF9PYmogKnZhbHVlID0gVGNsX0dldE9ialJlc3VsdChzZWxmLT5pbnRlcnApOworICAgICAgICAvKiBOb3Qgc3VyZSB3aGV0aGVyIHRoZSBJbmNyUmVmIGlzIG5lY2Vzc2FyeSwgYnV0IHNvbWV0aGluZworICAgICAgICAgICBtYXkgb3ZlcndyaXRlIHRoZSBpbnRlcnByZXRlciByZXN1bHQgd2hpbGUgd2UgYXJlCisgICAgICAgICAgIGNvbnZlcnRpbmcgaXQuICovCisgICAgICAgIFRjbF9JbmNyUmVmQ291bnQodmFsdWUpOworICAgICAgICByZXMgPSBGcm9tT2JqKChQeU9iamVjdCopc2VsZiwgdmFsdWUpOworICAgICAgICBUY2xfRGVjclJlZkNvdW50KHZhbHVlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBjb25zdCBjaGFyICpzID0gVGNsX0dldFN0cmluZ1Jlc3VsdChzZWxmLT5pbnRlcnApOworICAgICAgICBjb25zdCBjaGFyICpwID0gczsKIAotCQkvKiBJZiB0aGUgcmVzdWx0IGNvbnRhaW5zIGFueSBieXRlcyB3aXRoIHRoZSB0b3AgYml0IHNldCwKLQkJICAgaXQncyBVVEYtOCBhbmQgd2Ugc2hvdWxkIGRlY29kZSBpdCB0byBVbmljb2RlICovCisgICAgICAgIC8qIElmIHRoZSByZXN1bHQgY29udGFpbnMgYW55IGJ5dGVzIHdpdGggdGhlIHRvcCBiaXQgc2V0LAorICAgICAgICAgICBpdCdzIFVURi04IGFuZCB3ZSBzaG91bGQgZGVjb2RlIGl0IHRvIFVuaWNvZGUgKi8KICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JCXdoaWxlICgqcCAhPSAnXDAnKSB7Ci0JCQlpZiAoKnAgJiAweDgwKQotCQkJCWJyZWFrOwotCQkJcCsrOwotCQl9CisgICAgICAgIHdoaWxlICgqcCAhPSAnXDAnKSB7CisgICAgICAgICAgICBpZiAoKnAgJiAweDgwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgcCsrOworICAgICAgICB9CiAKLQkJaWYgKCpwID09ICdcMCcpCi0JCQlyZXMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzLCAoaW50KShwLXMpKTsKLQkJZWxzZSB7Ci0JCQkvKiBDb252ZXJ0IFVURi04IHRvIFVuaWNvZGUgc3RyaW5nICovCi0JCQlwID0gc3RyY2hyKHAsICdcMCcpOwotCQkJcmVzID0gUHlVbmljb2RlX0RlY29kZVVURjgocywgKGludCkocC1zKSwgInN0cmljdCIpOwotCQkJaWYgKHJlcyA9PSBOVUxMKSB7Ci0JCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCQlyZXMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzLCAoaW50KShwLXMpKTsKLQkJCX0KLQkJfQorICAgICAgICBpZiAoKnAgPT0gJ1wwJykKKyAgICAgICAgICAgIHJlcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHMsIChpbnQpKHAtcykpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8qIENvbnZlcnQgVVRGLTggdG8gVW5pY29kZSBzdHJpbmcgKi8KKyAgICAgICAgICAgIHAgPSBzdHJjaHIocCwgJ1wwJyk7CisgICAgICAgICAgICByZXMgPSBQeVVuaWNvZGVfRGVjb2RlVVRGOChzLCAoaW50KShwLXMpLCAic3RyaWN0Iik7CisgICAgICAgICAgICBpZiAocmVzID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgICAgIHJlcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHMsIChpbnQpKHAtcykpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAjZWxzZQotCQlwID0gc3RyY2hyKHAsICdcMCcpOwotCQlyZXMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzLCAoaW50KShwLXMpKTsKKyAgICAgICAgcCA9IHN0cmNocihwLCAnXDAnKTsKKyAgICAgICAgcmVzID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocywgKGludCkocC1zKSk7CiAjZW5kaWYKLQl9Ci0JcmV0dXJuIHJlczsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKIH0KIAogLyogVGthcHBfQ2FsbFByb2MgaXMgdGhlIGV2ZW50IHByb2NlZHVyZSB0aGF0IGlzIGV4ZWN1dGVkIGluIHRoZSBjb250ZXh0IG9mCkBAIC0xMjI5LDQxICsxMjI5LDQxIEBACiBzdGF0aWMgaW50CiBUa2FwcF9DYWxsUHJvYyhUa2FwcF9DYWxsRXZlbnQgKmUsIGludCBmbGFncykKIHsKLQlUY2xfT2JqICpvYmpTdG9yZVtBUkdTWl07Ci0JVGNsX09iaiAqKm9ianY7Ci0JaW50IG9iamM7Ci0JaW50IGk7Ci0JRU5URVJfUFlUSE9OCi0Jb2JqdiA9IFRrYXBwX0NhbGxBcmdzKGUtPmFyZ3MsIG9ialN0b3JlLCAmb2JqYyk7Ci0JaWYgKCFvYmp2KSB7Ci0JCVB5RXJyX0ZldGNoKGUtPmV4Y190eXBlLCBlLT5leGNfdmFsdWUsIGUtPmV4Y190Yik7Ci0JCSooZS0+cmVzKSA9IE5VTEw7Ci0JfQotCUxFQVZFX1BZVEhPTgotCWlmICghb2JqdikKLQkJZ290byBkb25lOwotCWkgPSBUY2xfRXZhbE9ianYoZS0+c2VsZi0+aW50ZXJwLCBvYmpjLCBvYmp2LCBlLT5mbGFncyk7Ci0JRU5URVJfUFlUSE9OCi0JaWYgKGkgPT0gVENMX0VSUk9SKSB7Ci0JCSooZS0+cmVzKSA9IE5VTEw7Ci0JCSooZS0+ZXhjX3R5cGUpID0gTlVMTDsKLQkJKihlLT5leGNfdGIpID0gTlVMTDsKLQkJKihlLT5leGNfdmFsdWUpID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKAotCQkJVGtpbnRlcl9UY2xFcnJvciwgInMiLAotCQkJVGNsX0dldFN0cmluZ1Jlc3VsdChlLT5zZWxmLT5pbnRlcnApKTsKLQl9Ci0JZWxzZSB7Ci0JCSooZS0+cmVzKSA9IFRrYXBwX0NhbGxSZXN1bHQoZS0+c2VsZik7Ci0JfQotCUxFQVZFX1BZVEhPTgorICAgIFRjbF9PYmogKm9ialN0b3JlW0FSR1NaXTsKKyAgICBUY2xfT2JqICoqb2JqdjsKKyAgICBpbnQgb2JqYzsKKyAgICBpbnQgaTsKKyAgICBFTlRFUl9QWVRIT04KKyAgICBvYmp2ID0gVGthcHBfQ2FsbEFyZ3MoZS0+YXJncywgb2JqU3RvcmUsICZvYmpjKTsKKyAgICBpZiAoIW9ianYpIHsKKyAgICAgICAgUHlFcnJfRmV0Y2goZS0+ZXhjX3R5cGUsIGUtPmV4Y192YWx1ZSwgZS0+ZXhjX3RiKTsKKyAgICAgICAgKihlLT5yZXMpID0gTlVMTDsKKyAgICB9CisgICAgTEVBVkVfUFlUSE9OCisgICAgaWYgKCFvYmp2KQorICAgICAgICBnb3RvIGRvbmU7CisgICAgaSA9IFRjbF9FdmFsT2JqdihlLT5zZWxmLT5pbnRlcnAsIG9iamMsIG9ianYsIGUtPmZsYWdzKTsKKyAgICBFTlRFUl9QWVRIT04KKyAgICBpZiAoaSA9PSBUQ0xfRVJST1IpIHsKKyAgICAgICAgKihlLT5yZXMpID0gTlVMTDsKKyAgICAgICAgKihlLT5leGNfdHlwZSkgPSBOVUxMOworICAgICAgICAqKGUtPmV4Y190YikgPSBOVUxMOworICAgICAgICAqKGUtPmV4Y192YWx1ZSkgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oCisgICAgICAgICAgICBUa2ludGVyX1RjbEVycm9yLCAicyIsCisgICAgICAgICAgICBUY2xfR2V0U3RyaW5nUmVzdWx0KGUtPnNlbGYtPmludGVycCkpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgKihlLT5yZXMpID0gVGthcHBfQ2FsbFJlc3VsdChlLT5zZWxmKTsKKyAgICB9CisgICAgTEVBVkVfUFlUSE9OCiAKLQlUa2FwcF9DYWxsRGVhbGxvY0FyZ3Mob2Jqdiwgb2JqU3RvcmUsIG9iamMpOworICAgIFRrYXBwX0NhbGxEZWFsbG9jQXJncyhvYmp2LCBvYmpTdG9yZSwgb2JqYyk7CiBkb25lOgotCS8qIFdha2UgdXAgY2FsbGluZyB0aHJlYWQuICovCi0JVGNsX011dGV4TG9jaygmY2FsbF9tdXRleCk7Ci0JVGNsX0NvbmRpdGlvbk5vdGlmeSgmZS0+ZG9uZSk7Ci0JVGNsX011dGV4VW5sb2NrKCZjYWxsX211dGV4KTsKLQlyZXR1cm4gMTsKKyAgICAvKiBXYWtlIHVwIGNhbGxpbmcgdGhyZWFkLiAqLworICAgIFRjbF9NdXRleExvY2soJmNhbGxfbXV0ZXgpOworICAgIFRjbF9Db25kaXRpb25Ob3RpZnkoJmUtPmRvbmUpOworICAgIFRjbF9NdXRleFVubG9jaygmY2FsbF9tdXRleCk7CisgICAgcmV0dXJuIDE7CiB9CiAKIC8qIFRoaXMgaXMgdGhlIG1haW4gZW50cnkgcG9pbnQgZm9yIGNhbGxpbmcgYSBUY2wgY29tbWFuZC4KQEAgLTEyODEsNzExICsxMjgxLDcxMSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIFRrYXBwX0NhbGwoUHlPYmplY3QgKnNlbGZwdHIsIFB5T2JqZWN0ICphcmdzKQogewotCVRjbF9PYmogKm9ialN0b3JlW0FSR1NaXTsKLQlUY2xfT2JqICoqb2JqdiA9IE5VTEw7Ci0JaW50IG9iamMsIGk7Ci0JUHlPYmplY3QgKnJlcyA9IE5VTEw7Ci0JVGthcHBPYmplY3QgKnNlbGYgPSAoVGthcHBPYmplY3QqKXNlbGZwdHI7Ci0JaW50IGZsYWdzID0gVENMX0VWQUxfRElSRUNUIHwgVENMX0VWQUxfR0xPQkFMOworICAgIFRjbF9PYmogKm9ialN0b3JlW0FSR1NaXTsKKyAgICBUY2xfT2JqICoqb2JqdiA9IE5VTEw7CisgICAgaW50IG9iamMsIGk7CisgICAgUHlPYmplY3QgKnJlcyA9IE5VTEw7CisgICAgVGthcHBPYmplY3QgKnNlbGYgPSAoVGthcHBPYmplY3QqKXNlbGZwdHI7CisgICAgaW50IGZsYWdzID0gVENMX0VWQUxfRElSRUNUIHwgVENMX0VWQUxfR0xPQkFMOwogCi0JLyogSWYgYXJncyBpcyBhIHNpbmdsZSB0dXBsZSwgcmVwbGFjZSB3aXRoIGNvbnRlbnRzIG9mIHR1cGxlICovCi0JaWYgKDEgPT0gUHlUdXBsZV9TaXplKGFyZ3MpKXsKLQkJUHlPYmplY3QqIGl0ZW0gPSBQeVR1cGxlX0dldEl0ZW0oYXJncywgMCk7Ci0JCWlmIChQeVR1cGxlX0NoZWNrKGl0ZW0pKQotCQkJYXJncyA9IGl0ZW07Ci0JfQorICAgIC8qIElmIGFyZ3MgaXMgYSBzaW5nbGUgdHVwbGUsIHJlcGxhY2Ugd2l0aCBjb250ZW50cyBvZiB0dXBsZSAqLworICAgIGlmICgxID09IFB5VHVwbGVfU2l6ZShhcmdzKSl7CisgICAgICAgIFB5T2JqZWN0KiBpdGVtID0gUHlUdXBsZV9HZXRJdGVtKGFyZ3MsIDApOworICAgICAgICBpZiAoUHlUdXBsZV9DaGVjayhpdGVtKSkKKyAgICAgICAgICAgIGFyZ3MgPSBpdGVtOworICAgIH0KICNpZmRlZiBXSVRIX1RIUkVBRAotCWlmIChzZWxmLT50aHJlYWRlZCAmJiBzZWxmLT50aHJlYWRfaWQgIT0gVGNsX0dldEN1cnJlbnRUaHJlYWQoKSkgewotCQkvKiBXZSBjYW5ub3QgY2FsbCB0aGUgY29tbWFuZCBkaXJlY3RseS4gSW5zdGVhZCwgd2UgbXVzdAotCQkgICBtYXJzaGFsIHRoZSBwYXJhbWV0ZXJzIHRvIHRoZSBpbnRlcnByZXRlciB0aHJlYWQuICovCi0JCVRrYXBwX0NhbGxFdmVudCAqZXY7Ci0JCVB5T2JqZWN0ICpleGNfdHlwZSwgKmV4Y192YWx1ZSwgKmV4Y190YjsKLQkJaWYgKCFXYWl0Rm9yTWFpbmxvb3Aoc2VsZikpCi0JCQlyZXR1cm4gTlVMTDsKLQkJZXYgPSAoVGthcHBfQ2FsbEV2ZW50Kilja2FsbG9jKHNpemVvZihUa2FwcF9DYWxsRXZlbnQpKTsKLQkJZXYtPmV2LnByb2MgPSAoVGNsX0V2ZW50UHJvYyopVGthcHBfQ2FsbFByb2M7Ci0JCWV2LT5zZWxmID0gc2VsZjsKLQkJZXYtPmFyZ3MgPSBhcmdzOwotCQlldi0+cmVzID0gJnJlczsKLQkJZXYtPmV4Y190eXBlID0gJmV4Y190eXBlOwotCQlldi0+ZXhjX3ZhbHVlID0gJmV4Y192YWx1ZTsKLQkJZXYtPmV4Y190YiA9ICZleGNfdGI7Ci0JCWV2LT5kb25lID0gKFRjbF9Db25kaXRpb24pMDsKKyAgICBpZiAoc2VsZi0+dGhyZWFkZWQgJiYgc2VsZi0+dGhyZWFkX2lkICE9IFRjbF9HZXRDdXJyZW50VGhyZWFkKCkpIHsKKyAgICAgICAgLyogV2UgY2Fubm90IGNhbGwgdGhlIGNvbW1hbmQgZGlyZWN0bHkuIEluc3RlYWQsIHdlIG11c3QKKyAgICAgICAgICAgbWFyc2hhbCB0aGUgcGFyYW1ldGVycyB0byB0aGUgaW50ZXJwcmV0ZXIgdGhyZWFkLiAqLworICAgICAgICBUa2FwcF9DYWxsRXZlbnQgKmV2OworICAgICAgICBQeU9iamVjdCAqZXhjX3R5cGUsICpleGNfdmFsdWUsICpleGNfdGI7CisgICAgICAgIGlmICghV2FpdEZvck1haW5sb29wKHNlbGYpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGV2ID0gKFRrYXBwX0NhbGxFdmVudCopY2thbGxvYyhzaXplb2YoVGthcHBfQ2FsbEV2ZW50KSk7CisgICAgICAgIGV2LT5ldi5wcm9jID0gKFRjbF9FdmVudFByb2MqKVRrYXBwX0NhbGxQcm9jOworICAgICAgICBldi0+c2VsZiA9IHNlbGY7CisgICAgICAgIGV2LT5hcmdzID0gYXJnczsKKyAgICAgICAgZXYtPnJlcyA9ICZyZXM7CisgICAgICAgIGV2LT5leGNfdHlwZSA9ICZleGNfdHlwZTsKKyAgICAgICAgZXYtPmV4Y192YWx1ZSA9ICZleGNfdmFsdWU7CisgICAgICAgIGV2LT5leGNfdGIgPSAmZXhjX3RiOworICAgICAgICBldi0+ZG9uZSA9IChUY2xfQ29uZGl0aW9uKTA7CiAKLQkJVGthcHBfVGhyZWFkU2VuZChzZWxmLCAoVGNsX0V2ZW50KilldiwgJmV2LT5kb25lLCAmY2FsbF9tdXRleCk7CisgICAgICAgIFRrYXBwX1RocmVhZFNlbmQoc2VsZiwgKFRjbF9FdmVudCopZXYsICZldi0+ZG9uZSwgJmNhbGxfbXV0ZXgpOwogCi0JCWlmIChyZXMgPT0gTlVMTCkgewotCQkJaWYgKGV4Y190eXBlKQotCQkJCVB5RXJyX1Jlc3RvcmUoZXhjX3R5cGUsIGV4Y192YWx1ZSwgZXhjX3RiKTsKLQkJCWVsc2UKLQkJCQlQeUVycl9TZXRPYmplY3QoVGtpbnRlcl9UY2xFcnJvciwgZXhjX3ZhbHVlKTsKLQkJfQotCX0KLQllbHNlIAorICAgICAgICBpZiAocmVzID09IE5VTEwpIHsKKyAgICAgICAgICAgIGlmIChleGNfdHlwZSkKKyAgICAgICAgICAgICAgICBQeUVycl9SZXN0b3JlKGV4Y190eXBlLCBleGNfdmFsdWUsIGV4Y190Yik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgUHlFcnJfU2V0T2JqZWN0KFRraW50ZXJfVGNsRXJyb3IsIGV4Y192YWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQogI2VuZGlmCi0JeworICAgIHsKIAotCQlvYmp2ID0gVGthcHBfQ2FsbEFyZ3MoYXJncywgb2JqU3RvcmUsICZvYmpjKTsKLQkJaWYgKCFvYmp2KQotCQkJcmV0dXJuIE5VTEw7CisgICAgICAgIG9ianYgPSBUa2FwcF9DYWxsQXJncyhhcmdzLCBvYmpTdG9yZSwgJm9iamMpOworICAgICAgICBpZiAoIW9ianYpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKIAotCQlFTlRFUl9UQ0wKKyAgICAgICAgRU5URVJfVENMCiAKLQkJaSA9IFRjbF9FdmFsT2JqdihzZWxmLT5pbnRlcnAsIG9iamMsIG9ianYsIGZsYWdzKTsKKyAgICAgICAgaSA9IFRjbF9FdmFsT2JqdihzZWxmLT5pbnRlcnAsIG9iamMsIG9ianYsIGZsYWdzKTsKIAotCQlFTlRFUl9PVkVSTEFQCisgICAgICAgIEVOVEVSX09WRVJMQVAKIAotCQlpZiAoaSA9PSBUQ0xfRVJST1IpCi0JCQlUa2ludGVyX0Vycm9yKHNlbGZwdHIpOwotCQllbHNlCi0JCQlyZXMgPSBUa2FwcF9DYWxsUmVzdWx0KHNlbGYpOworICAgICAgICBpZiAoaSA9PSBUQ0xfRVJST1IpCisgICAgICAgICAgICBUa2ludGVyX0Vycm9yKHNlbGZwdHIpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXMgPSBUa2FwcF9DYWxsUmVzdWx0KHNlbGYpOwogCi0JCUxFQVZFX09WRVJMQVBfVENMCisgICAgICAgIExFQVZFX09WRVJMQVBfVENMCiAKLQkJVGthcHBfQ2FsbERlYWxsb2NBcmdzKG9ianYsIG9ialN0b3JlLCBvYmpjKTsKLQl9Ci0JcmV0dXJuIHJlczsKKyAgICAgICAgVGthcHBfQ2FsbERlYWxsb2NBcmdzKG9ianYsIG9ialN0b3JlLCBvYmpjKTsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKIH0KIAogCiBzdGF0aWMgUHlPYmplY3QgKgogVGthcHBfR2xvYmFsQ2FsbChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JLyogQ291bGQgZG8gdGhlIHNhbWUgaGVyZSBhcyBmb3IgVGthcHBfQ2FsbCgpLCBidXQgdGhpcyBpcyBub3QgdXNlZAotCSAgIG11Y2gsIHNvIEkgY2FuJ3QgYmUgYm90aGVyZWQuICBVbmZvcnR1bmF0ZWx5IFRjbCBkb2Vzbid0IGV4cG9ydCBhCi0JICAgd2F5IGZvciB0aGUgdXNlciB0byBkbyB3aGF0IGFsbCBpdHMgR2xvYmFsKiB2YXJpYW50cyBkbyAoc2F2ZSBhbmQKLQkgICByZXNldCB0aGUgc2NvcGUgcG9pbnRlciwgY2FsbCB0aGUgbG9jYWwgdmVyc2lvbiwgcmVzdG9yZSB0aGUgc2F2ZWQKLQkgICBzY29wZSBwb2ludGVyKS4gKi8KKyAgICAvKiBDb3VsZCBkbyB0aGUgc2FtZSBoZXJlIGFzIGZvciBUa2FwcF9DYWxsKCksIGJ1dCB0aGlzIGlzIG5vdCB1c2VkCisgICAgICAgbXVjaCwgc28gSSBjYW4ndCBiZSBib3RoZXJlZC4gIFVuZm9ydHVuYXRlbHkgVGNsIGRvZXNuJ3QgZXhwb3J0IGEKKyAgICAgICB3YXkgZm9yIHRoZSB1c2VyIHRvIGRvIHdoYXQgYWxsIGl0cyBHbG9iYWwqIHZhcmlhbnRzIGRvIChzYXZlIGFuZAorICAgICAgIHJlc2V0IHRoZSBzY29wZSBwb2ludGVyLCBjYWxsIHRoZSBsb2NhbCB2ZXJzaW9uLCByZXN0b3JlIHRoZSBzYXZlZAorICAgICAgIHNjb3BlIHBvaW50ZXIpLiAqLwogCi0JY2hhciAqY21kOwotCVB5T2JqZWN0ICpyZXMgPSBOVUxMOworICAgIGNoYXIgKmNtZDsKKyAgICBQeU9iamVjdCAqcmVzID0gTlVMTDsKIAotCUNIRUNLX1RDTF9BUFBBUlRNRU5UOworICAgIENIRUNLX1RDTF9BUFBBUlRNRU5UOwogCi0JY21kICA9IE1lcmdlKGFyZ3MpOwotCWlmIChjbWQpIHsKLQkJaW50IGVycjsKLQkJRU5URVJfVENMCi0JCWVyciA9IFRjbF9HbG9iYWxFdmFsKFRrYXBwX0ludGVycChzZWxmKSwgY21kKTsKLQkJRU5URVJfT1ZFUkxBUAotCQlpZiAoZXJyID09IFRDTF9FUlJPUikKLQkJCXJlcyA9IFRraW50ZXJfRXJyb3Ioc2VsZik7Ci0JCWVsc2UKLQkJCXJlcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoVGthcHBfUmVzdWx0KHNlbGYpKTsKLQkJTEVBVkVfT1ZFUkxBUF9UQ0wKLQkJY2tmcmVlKGNtZCk7Ci0JfQorICAgIGNtZCAgPSBNZXJnZShhcmdzKTsKKyAgICBpZiAoY21kKSB7CisgICAgICAgIGludCBlcnI7CisgICAgICAgIEVOVEVSX1RDTAorICAgICAgICBlcnIgPSBUY2xfR2xvYmFsRXZhbChUa2FwcF9JbnRlcnAoc2VsZiksIGNtZCk7CisgICAgICAgIEVOVEVSX09WRVJMQVAKKyAgICAgICAgaWYgKGVyciA9PSBUQ0xfRVJST1IpCisgICAgICAgICAgICByZXMgPSBUa2ludGVyX0Vycm9yKHNlbGYpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKFRrYXBwX1Jlc3VsdChzZWxmKSk7CisgICAgICAgIExFQVZFX09WRVJMQVBfVENMCisgICAgICAgIGNrZnJlZShjbWQpOworICAgIH0KIAotCXJldHVybiByZXM7CisgICAgcmV0dXJuIHJlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFRrYXBwX0V2YWwoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKnNjcmlwdDsKLQlQeU9iamVjdCAqcmVzID0gTlVMTDsKLQlpbnQgZXJyOworICAgIGNoYXIgKnNjcmlwdDsKKyAgICBQeU9iamVjdCAqcmVzID0gTlVMTDsKKyAgICBpbnQgZXJyOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOmV2YWwiLCAmc2NyaXB0KSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOmV2YWwiLCAmc2NyaXB0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlDSEVDS19UQ0xfQVBQQVJUTUVOVDsKKyAgICBDSEVDS19UQ0xfQVBQQVJUTUVOVDsKIAotCUVOVEVSX1RDTAotCWVyciA9IFRjbF9FdmFsKFRrYXBwX0ludGVycChzZWxmKSwgc2NyaXB0KTsKLQlFTlRFUl9PVkVSTEFQCi0JaWYgKGVyciA9PSBUQ0xfRVJST1IpCi0JCXJlcyA9IFRraW50ZXJfRXJyb3Ioc2VsZik7Ci0JZWxzZQotCQlyZXMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKFRrYXBwX1Jlc3VsdChzZWxmKSk7Ci0JTEVBVkVfT1ZFUkxBUF9UQ0wKLQlyZXR1cm4gcmVzOworICAgIEVOVEVSX1RDTAorICAgIGVyciA9IFRjbF9FdmFsKFRrYXBwX0ludGVycChzZWxmKSwgc2NyaXB0KTsKKyAgICBFTlRFUl9PVkVSTEFQCisgICAgaWYgKGVyciA9PSBUQ0xfRVJST1IpCisgICAgICAgIHJlcyA9IFRraW50ZXJfRXJyb3Ioc2VsZik7CisgICAgZWxzZQorICAgICAgICByZXMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKFRrYXBwX1Jlc3VsdChzZWxmKSk7CisgICAgTEVBVkVfT1ZFUkxBUF9UQ0wKKyAgICByZXR1cm4gcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogVGthcHBfR2xvYmFsRXZhbChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqc2NyaXB0OwotCVB5T2JqZWN0ICpyZXMgPSBOVUxMOwotCWludCBlcnI7CisgICAgY2hhciAqc2NyaXB0OworICAgIFB5T2JqZWN0ICpyZXMgPSBOVUxMOworICAgIGludCBlcnI7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6Z2xvYmFsZXZhbCIsICZzY3JpcHQpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6Z2xvYmFsZXZhbCIsICZzY3JpcHQpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCUNIRUNLX1RDTF9BUFBBUlRNRU5UOworICAgIENIRUNLX1RDTF9BUFBBUlRNRU5UOwogCi0JRU5URVJfVENMCi0JZXJyID0gVGNsX0dsb2JhbEV2YWwoVGthcHBfSW50ZXJwKHNlbGYpLCBzY3JpcHQpOwotCUVOVEVSX09WRVJMQVAKLQlpZiAoZXJyID09IFRDTF9FUlJPUikKLQkJcmVzID0gVGtpbnRlcl9FcnJvcihzZWxmKTsKLQllbHNlCi0JCXJlcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoVGthcHBfUmVzdWx0KHNlbGYpKTsKLQlMRUFWRV9PVkVSTEFQX1RDTAotCXJldHVybiByZXM7CisgICAgRU5URVJfVENMCisgICAgZXJyID0gVGNsX0dsb2JhbEV2YWwoVGthcHBfSW50ZXJwKHNlbGYpLCBzY3JpcHQpOworICAgIEVOVEVSX09WRVJMQVAKKyAgICBpZiAoZXJyID09IFRDTF9FUlJPUikKKyAgICAgICAgcmVzID0gVGtpbnRlcl9FcnJvcihzZWxmKTsKKyAgICBlbHNlCisgICAgICAgIHJlcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoVGthcHBfUmVzdWx0KHNlbGYpKTsKKyAgICBMRUFWRV9PVkVSTEFQX1RDTAorICAgIHJldHVybiByZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBUa2FwcF9FdmFsRmlsZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqZmlsZU5hbWU7Ci0JUHlPYmplY3QgKnJlcyA9IE5VTEw7Ci0JaW50IGVycjsKKyAgICBjaGFyICpmaWxlTmFtZTsKKyAgICBQeU9iamVjdCAqcmVzID0gTlVMTDsKKyAgICBpbnQgZXJyOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOmV2YWxmaWxlIiwgJmZpbGVOYW1lKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOmV2YWxmaWxlIiwgJmZpbGVOYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlDSEVDS19UQ0xfQVBQQVJUTUVOVDsKKyAgICBDSEVDS19UQ0xfQVBQQVJUTUVOVDsKIAotCUVOVEVSX1RDTAotCWVyciA9IFRjbF9FdmFsRmlsZShUa2FwcF9JbnRlcnAoc2VsZiksIGZpbGVOYW1lKTsKLQlFTlRFUl9PVkVSTEFQCi0JaWYgKGVyciA9PSBUQ0xfRVJST1IpCi0JCXJlcyA9IFRraW50ZXJfRXJyb3Ioc2VsZik7CisgICAgRU5URVJfVENMCisgICAgZXJyID0gVGNsX0V2YWxGaWxlKFRrYXBwX0ludGVycChzZWxmKSwgZmlsZU5hbWUpOworICAgIEVOVEVSX09WRVJMQVAKKyAgICBpZiAoZXJyID09IFRDTF9FUlJPUikKKyAgICAgICAgcmVzID0gVGtpbnRlcl9FcnJvcihzZWxmKTsKIAotCWVsc2UKLQkJcmVzID0gUHlTdHJpbmdfRnJvbVN0cmluZyhUa2FwcF9SZXN1bHQoc2VsZikpOwotCUxFQVZFX09WRVJMQVBfVENMCi0JcmV0dXJuIHJlczsKKyAgICBlbHNlCisgICAgICAgIHJlcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoVGthcHBfUmVzdWx0KHNlbGYpKTsKKyAgICBMRUFWRV9PVkVSTEFQX1RDTAorICAgIHJldHVybiByZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBUa2FwcF9SZWNvcmQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKnNjcmlwdDsKLQlQeU9iamVjdCAqcmVzID0gTlVMTDsKLQlpbnQgZXJyOworICAgIGNoYXIgKnNjcmlwdDsKKyAgICBQeU9iamVjdCAqcmVzID0gTlVMTDsKKyAgICBpbnQgZXJyOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIiwgJnNjcmlwdCkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyIsICZzY3JpcHQpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCUNIRUNLX1RDTF9BUFBBUlRNRU5UOworICAgIENIRUNLX1RDTF9BUFBBUlRNRU5UOwogCi0JRU5URVJfVENMCi0JZXJyID0gVGNsX1JlY29yZEFuZEV2YWwoVGthcHBfSW50ZXJwKHNlbGYpLCBzY3JpcHQsIFRDTF9OT19FVkFMKTsKLQlFTlRFUl9PVkVSTEFQCi0JaWYgKGVyciA9PSBUQ0xfRVJST1IpCi0JCXJlcyA9IFRraW50ZXJfRXJyb3Ioc2VsZik7Ci0JZWxzZQotCQlyZXMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKFRrYXBwX1Jlc3VsdChzZWxmKSk7Ci0JTEVBVkVfT1ZFUkxBUF9UQ0wKLQlyZXR1cm4gcmVzOworICAgIEVOVEVSX1RDTAorICAgIGVyciA9IFRjbF9SZWNvcmRBbmRFdmFsKFRrYXBwX0ludGVycChzZWxmKSwgc2NyaXB0LCBUQ0xfTk9fRVZBTCk7CisgICAgRU5URVJfT1ZFUkxBUAorICAgIGlmIChlcnIgPT0gVENMX0VSUk9SKQorICAgICAgICByZXMgPSBUa2ludGVyX0Vycm9yKHNlbGYpOworICAgIGVsc2UKKyAgICAgICAgcmVzID0gUHlTdHJpbmdfRnJvbVN0cmluZyhUa2FwcF9SZXN1bHQoc2VsZikpOworICAgIExFQVZFX09WRVJMQVBfVENMCisgICAgcmV0dXJuIHJlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFRrYXBwX0FkZEVycm9ySW5mbyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqbXNnOworICAgIGNoYXIgKm1zZzsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczphZGRlcnJvcmluZm8iLCAmbXNnKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0hFQ0tfVENMX0FQUEFSVE1FTlQ7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOmFkZGVycm9yaW5mbyIsICZtc2cpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDSEVDS19UQ0xfQVBQQVJUTUVOVDsKIAotCUVOVEVSX1RDTAotCVRjbF9BZGRFcnJvckluZm8oVGthcHBfSW50ZXJwKHNlbGYpLCBtc2cpOwotCUxFQVZFX1RDTAorICAgIEVOVEVSX1RDTAorICAgIFRjbF9BZGRFcnJvckluZm8oVGthcHBfSW50ZXJwKHNlbGYpLCBtc2cpOworICAgIExFQVZFX1RDTAogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogCi0MCisKIC8qKiBUY2wgVmFyaWFibGUgKiovCiAKIFRDTF9ERUNMQVJFX01VVEVYKHZhcl9tdXRleCkKIAogdHlwZWRlZiBQeU9iamVjdCogKCpFdmVudEZ1bmMpKFB5T2JqZWN0KiwgUHlPYmplY3QgKmFyZ3MsIGludCBmbGFncyk7CiB0eXBlZGVmIHN0cnVjdCBWYXJFdmVudCB7Ci0JVGNsX0V2ZW50IGV2OyAvKiBtdXN0IGJlIGZpcnN0ICovCi0JUHlPYmplY3QgKnNlbGY7Ci0JUHlPYmplY3QgKmFyZ3M7Ci0JaW50IGZsYWdzOwotCUV2ZW50RnVuYyBmdW5jOwotCVB5T2JqZWN0ICoqcmVzOwotCVB5T2JqZWN0ICoqZXhjX3R5cGU7Ci0JUHlPYmplY3QgKipleGNfdmFsOwotCVRjbF9Db25kaXRpb24gY29uZDsKKyAgICBUY2xfRXZlbnQgZXY7IC8qIG11c3QgYmUgZmlyc3QgKi8KKyAgICBQeU9iamVjdCAqc2VsZjsKKyAgICBQeU9iamVjdCAqYXJnczsKKyAgICBpbnQgZmxhZ3M7CisgICAgRXZlbnRGdW5jIGZ1bmM7CisgICAgUHlPYmplY3QgKipyZXM7CisgICAgUHlPYmplY3QgKipleGNfdHlwZTsKKyAgICBQeU9iamVjdCAqKmV4Y192YWw7CisgICAgVGNsX0NvbmRpdGlvbiBjb25kOwogfSBWYXJFdmVudDsKIAogc3RhdGljIGludAogdmFybmFtZV9jb252ZXJ0ZXIoUHlPYmplY3QgKmluLCB2b2lkICpfb3V0KQogewotCWNoYXIgKipvdXQgPSAoY2hhcioqKV9vdXQ7Ci0JaWYgKFB5U3RyaW5nX0NoZWNrKGluKSkgewotCQkqb3V0ID0gUHlTdHJpbmdfQXNTdHJpbmcoaW4pOwotCQlyZXR1cm4gMTsKLQl9Ci0JaWYgKFB5VGNsT2JqZWN0X0NoZWNrKGluKSkgewotCQkqb3V0ID0gUHlUY2xPYmplY3RfVGNsU3RyaW5nKGluKTsKLQkJcmV0dXJuIDE7Ci0JfQotCS8qIFhYWDogU2hvdWxkIGdpdmUgZGlhZ25vc3RpY3MuICovCi0JcmV0dXJuIDA7Ci19CQorICAgIGNoYXIgKipvdXQgPSAoY2hhcioqKV9vdXQ7CisgICAgaWYgKFB5U3RyaW5nX0NoZWNrKGluKSkgeworICAgICAgICAqb3V0ID0gUHlTdHJpbmdfQXNTdHJpbmcoaW4pOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgaWYgKFB5VGNsT2JqZWN0X0NoZWNrKGluKSkgeworICAgICAgICAqb3V0ID0gUHlUY2xPYmplY3RfVGNsU3RyaW5nKGluKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIC8qIFhYWDogU2hvdWxkIGdpdmUgZGlhZ25vc3RpY3MuICovCisgICAgcmV0dXJuIDA7Cit9CiAKIHN0YXRpYyB2b2lkCiB2YXJfcGVyZm9ybShWYXJFdmVudCAqZXYpCiB7Ci0JKihldi0+cmVzKSA9IGV2LT5mdW5jKGV2LT5zZWxmLCBldi0+YXJncywgZXYtPmZsYWdzKTsKLQlpZiAoISooZXYtPnJlcykpIHsKLQkJUHlPYmplY3QgKmV4YywgKnZhbCwgKnRiOwotCQlQeUVycl9GZXRjaCgmZXhjLCAmdmFsLCAmdGIpOwotCQlQeUVycl9Ob3JtYWxpemVFeGNlcHRpb24oJmV4YywgJnZhbCwgJnRiKTsKLQkJKihldi0+ZXhjX3R5cGUpID0gZXhjOwotCQkqKGV2LT5leGNfdmFsKSA9IHZhbDsKLQkJUHlfREVDUkVGKHRiKTsKLQl9Ci0JCQorICAgICooZXYtPnJlcykgPSBldi0+ZnVuYyhldi0+c2VsZiwgZXYtPmFyZ3MsIGV2LT5mbGFncyk7CisgICAgaWYgKCEqKGV2LT5yZXMpKSB7CisgICAgICAgIFB5T2JqZWN0ICpleGMsICp2YWwsICp0YjsKKyAgICAgICAgUHlFcnJfRmV0Y2goJmV4YywgJnZhbCwgJnRiKTsKKyAgICAgICAgUHlFcnJfTm9ybWFsaXplRXhjZXB0aW9uKCZleGMsICZ2YWwsICZ0Yik7CisgICAgICAgICooZXYtPmV4Y190eXBlKSA9IGV4YzsKKyAgICAgICAgKihldi0+ZXhjX3ZhbCkgPSB2YWw7CisgICAgICAgIFB5X0RFQ1JFRih0Yik7CisgICAgfQorCiB9CiAKIHN0YXRpYyBpbnQKIHZhcl9wcm9jKFZhckV2ZW50KiBldiwgaW50IGZsYWdzKQogewotCUVOVEVSX1BZVEhPTgotICAgICAgICB2YXJfcGVyZm9ybShldik7Ci0JVGNsX011dGV4TG9jaygmdmFyX211dGV4KTsKLQlUY2xfQ29uZGl0aW9uTm90aWZ5KCZldi0+Y29uZCk7Ci0JVGNsX011dGV4VW5sb2NrKCZ2YXJfbXV0ZXgpOwotCUxFQVZFX1BZVEhPTgotCXJldHVybiAxOworICAgIEVOVEVSX1BZVEhPTgorICAgIHZhcl9wZXJmb3JtKGV2KTsKKyAgICBUY2xfTXV0ZXhMb2NrKCZ2YXJfbXV0ZXgpOworICAgIFRjbF9Db25kaXRpb25Ob3RpZnkoJmV2LT5jb25kKTsKKyAgICBUY2xfTXV0ZXhVbmxvY2soJnZhcl9tdXRleCk7CisgICAgTEVBVkVfUFlUSE9OCisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCoKIHZhcl9pbnZva2UoRXZlbnRGdW5jIGZ1bmMsIFB5T2JqZWN0ICpzZWxmcHRyLCBQeU9iamVjdCAqYXJncywgaW50IGZsYWdzKQogewotCVRrYXBwT2JqZWN0ICpzZWxmID0gKFRrYXBwT2JqZWN0KilzZWxmcHRyOworICAgIFRrYXBwT2JqZWN0ICpzZWxmID0gKFRrYXBwT2JqZWN0KilzZWxmcHRyOwogI2lmZGVmIFdJVEhfVEhSRUFECi0JaWYgKHNlbGYtPnRocmVhZGVkICYmIHNlbGYtPnRocmVhZF9pZCAhPSBUY2xfR2V0Q3VycmVudFRocmVhZCgpKSB7Ci0JCVRrYXBwT2JqZWN0ICpzZWxmID0gKFRrYXBwT2JqZWN0KilzZWxmcHRyOwotCQlWYXJFdmVudCAqZXY7Ci0JCVB5T2JqZWN0ICpyZXMsICpleGNfdHlwZSwgKmV4Y192YWw7Ci0JCQotCQkvKiBUaGUgY3VycmVudCB0aHJlYWQgaXMgbm90IHRoZSBpbnRlcnByZXRlciB0aHJlYWQuICBNYXJzaGFsCi0JCSAgIHRoZSBjYWxsIHRvIHRoZSBpbnRlcnByZXRlciB0aHJlYWQsIHRoZW4gd2FpdCBmb3IKLQkJICAgY29tcGxldGlvbi4gKi8KLQkJaWYgKCFXYWl0Rm9yTWFpbmxvb3Aoc2VsZikpCi0JCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoc2VsZi0+dGhyZWFkZWQgJiYgc2VsZi0+dGhyZWFkX2lkICE9IFRjbF9HZXRDdXJyZW50VGhyZWFkKCkpIHsKKyAgICAgICAgVGthcHBPYmplY3QgKnNlbGYgPSAoVGthcHBPYmplY3QqKXNlbGZwdHI7CisgICAgICAgIFZhckV2ZW50ICpldjsKKyAgICAgICAgUHlPYmplY3QgKnJlcywgKmV4Y190eXBlLCAqZXhjX3ZhbDsKIAotCQlldiA9IChWYXJFdmVudCopY2thbGxvYyhzaXplb2YoVmFyRXZlbnQpKTsKKyAgICAgICAgLyogVGhlIGN1cnJlbnQgdGhyZWFkIGlzIG5vdCB0aGUgaW50ZXJwcmV0ZXIgdGhyZWFkLiAgTWFyc2hhbAorICAgICAgICAgICB0aGUgY2FsbCB0byB0aGUgaW50ZXJwcmV0ZXIgdGhyZWFkLCB0aGVuIHdhaXQgZm9yCisgICAgICAgICAgIGNvbXBsZXRpb24uICovCisgICAgICAgIGlmICghV2FpdEZvck1haW5sb29wKHNlbGYpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkJZXYtPnNlbGYgPSBzZWxmcHRyOwotCQlldi0+YXJncyA9IGFyZ3M7Ci0JCWV2LT5mbGFncyA9IGZsYWdzOwotCQlldi0+ZnVuYyA9IGZ1bmM7Ci0JCWV2LT5yZXMgPSAmcmVzOwotCQlldi0+ZXhjX3R5cGUgPSAmZXhjX3R5cGU7Ci0JCWV2LT5leGNfdmFsID0gJmV4Y192YWw7Ci0JCWV2LT5jb25kID0gTlVMTDsKLQkJZXYtPmV2LnByb2MgPSAoVGNsX0V2ZW50UHJvYyopdmFyX3Byb2M7Ci0JCVRrYXBwX1RocmVhZFNlbmQoc2VsZiwgKFRjbF9FdmVudCopZXYsICZldi0+Y29uZCwgJnZhcl9tdXRleCk7Ci0JCWlmICghcmVzKSB7Ci0JCQlQeUVycl9TZXRPYmplY3QoZXhjX3R5cGUsIGV4Y192YWwpOwotCQkJUHlfREVDUkVGKGV4Y190eXBlKTsKLQkJCVB5X0RFQ1JFRihleGNfdmFsKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCXJldHVybiByZXM7Ci0JfQorICAgICAgICBldiA9IChWYXJFdmVudCopY2thbGxvYyhzaXplb2YoVmFyRXZlbnQpKTsKKworICAgICAgICBldi0+c2VsZiA9IHNlbGZwdHI7CisgICAgICAgIGV2LT5hcmdzID0gYXJnczsKKyAgICAgICAgZXYtPmZsYWdzID0gZmxhZ3M7CisgICAgICAgIGV2LT5mdW5jID0gZnVuYzsKKyAgICAgICAgZXYtPnJlcyA9ICZyZXM7CisgICAgICAgIGV2LT5leGNfdHlwZSA9ICZleGNfdHlwZTsKKyAgICAgICAgZXYtPmV4Y192YWwgPSAmZXhjX3ZhbDsKKyAgICAgICAgZXYtPmNvbmQgPSBOVUxMOworICAgICAgICBldi0+ZXYucHJvYyA9IChUY2xfRXZlbnRQcm9jKil2YXJfcHJvYzsKKyAgICAgICAgVGthcHBfVGhyZWFkU2VuZChzZWxmLCAoVGNsX0V2ZW50KilldiwgJmV2LT5jb25kLCAmdmFyX211dGV4KTsKKyAgICAgICAgaWYgKCFyZXMpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldE9iamVjdChleGNfdHlwZSwgZXhjX3ZhbCk7CisgICAgICAgICAgICBQeV9ERUNSRUYoZXhjX3R5cGUpOworICAgICAgICAgICAgUHlfREVDUkVGKGV4Y192YWwpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CiAjZW5kaWYKLSAgICAgICAgLyogVGNsIGlzIG5vdCB0aHJlYWRlZCwgb3IgdGhpcyBpcyB0aGUgaW50ZXJwcmV0ZXIgdGhyZWFkLiAqLwotCXJldHVybiBmdW5jKHNlbGZwdHIsIGFyZ3MsIGZsYWdzKTsKKyAgICAvKiBUY2wgaXMgbm90IHRocmVhZGVkLCBvciB0aGlzIGlzIHRoZSBpbnRlcnByZXRlciB0aHJlYWQuICovCisgICAgcmV0dXJuIGZ1bmMoc2VsZnB0ciwgYXJncywgZmxhZ3MpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogU2V0VmFyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgaW50IGZsYWdzKQogewotCWNoYXIgKm5hbWUxLCAqbmFtZTI7Ci0JUHlPYmplY3QgKm5ld1ZhbHVlOwotCVB5T2JqZWN0ICpyZXMgPSBOVUxMOwotCVRjbF9PYmogKm5ld3ZhbCwgKm9rOworICAgIGNoYXIgKm5hbWUxLCAqbmFtZTI7CisgICAgUHlPYmplY3QgKm5ld1ZhbHVlOworICAgIFB5T2JqZWN0ICpyZXMgPSBOVUxMOworICAgIFRjbF9PYmogKm5ld3ZhbCwgKm9rOwogCi0JaWYgKFB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mTzpzZXR2YXIiLCAKLQkJCSAgICAgdmFybmFtZV9jb252ZXJ0ZXIsICZuYW1lMSwgJm5ld1ZhbHVlKSkgewotCQkvKiBYWFggQWNxdWlyZSB0Y2wgbG9jaz8/PyAqLwotCQluZXd2YWwgPSBBc09iaihuZXdWYWx1ZSk7Ci0JCWlmIChuZXd2YWwgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQlFTlRFUl9UQ0wKLQkJb2sgPSBUY2xfU2V0VmFyMkV4KFRrYXBwX0ludGVycChzZWxmKSwgbmFtZTEsIE5VTEwsIAotCQkJCSAgIG5ld3ZhbCwgZmxhZ3MpOwotCQlFTlRFUl9PVkVSTEFQCi0JCWlmICghb2spCi0JCQlUa2ludGVyX0Vycm9yKHNlbGYpOwotCQllbHNlIHsKLQkJCXJlcyA9IFB5X05vbmU7Ci0JCQlQeV9JTkNSRUYocmVzKTsKLQkJfQotCQlMRUFWRV9PVkVSTEFQX1RDTAotCX0KLQllbHNlIHsKLQkJUHlFcnJfQ2xlYXIoKTsKLQkJaWYgKFB5QXJnX1BhcnNlVHVwbGUoYXJncywgInNzTzpzZXR2YXIiLAotCQkJCSAgICAgJm5hbWUxLCAmbmFtZTIsICZuZXdWYWx1ZSkpIHsKLQkJCS8qIFhYWCBtdXN0IGhvbGQgdGNsIGxvY2sgYWxyZWFkeT8/PyAqLwotCQkJbmV3dmFsID0gQXNPYmoobmV3VmFsdWUpOwotCQkJRU5URVJfVENMCi0JCQlvayA9IFRjbF9TZXRWYXIyRXgoVGthcHBfSW50ZXJwKHNlbGYpLCBuYW1lMSwgbmFtZTIsIG5ld3ZhbCwgZmxhZ3MpOwotCQkJRU5URVJfT1ZFUkxBUAotCQkJaWYgKCFvaykKLQkJCQlUa2ludGVyX0Vycm9yKHNlbGYpOwotCQkJZWxzZSB7Ci0JCQkJcmVzID0gUHlfTm9uZTsKLQkJCQlQeV9JTkNSRUYocmVzKTsKLQkJCX0KLQkJCUxFQVZFX09WRVJMQVBfVENMCi0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KLQlyZXR1cm4gcmVzOworICAgIGlmIChQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJk86c2V0dmFyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2YXJuYW1lX2NvbnZlcnRlciwgJm5hbWUxLCAmbmV3VmFsdWUpKSB7CisgICAgICAgIC8qIFhYWCBBY3F1aXJlIHRjbCBsb2NrPz8/ICovCisgICAgICAgIG5ld3ZhbCA9IEFzT2JqKG5ld1ZhbHVlKTsKKyAgICAgICAgaWYgKG5ld3ZhbCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIEVOVEVSX1RDTAorICAgICAgICBvayA9IFRjbF9TZXRWYXIyRXgoVGthcHBfSW50ZXJwKHNlbGYpLCBuYW1lMSwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld3ZhbCwgZmxhZ3MpOworICAgICAgICBFTlRFUl9PVkVSTEFQCisgICAgICAgIGlmICghb2spCisgICAgICAgICAgICBUa2ludGVyX0Vycm9yKHNlbGYpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHJlcyA9IFB5X05vbmU7CisgICAgICAgICAgICBQeV9JTkNSRUYocmVzKTsKKyAgICAgICAgfQorICAgICAgICBMRUFWRV9PVkVSTEFQX1RDTAorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgaWYgKFB5QXJnX1BhcnNlVHVwbGUoYXJncywgInNzTzpzZXR2YXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmFtZTEsICZuYW1lMiwgJm5ld1ZhbHVlKSkgeworICAgICAgICAgICAgLyogWFhYIG11c3QgaG9sZCB0Y2wgbG9jayBhbHJlYWR5Pz8/ICovCisgICAgICAgICAgICBuZXd2YWwgPSBBc09iaihuZXdWYWx1ZSk7CisgICAgICAgICAgICBFTlRFUl9UQ0wKKyAgICAgICAgICAgIG9rID0gVGNsX1NldFZhcjJFeChUa2FwcF9JbnRlcnAoc2VsZiksIG5hbWUxLCBuYW1lMiwgbmV3dmFsLCBmbGFncyk7CisgICAgICAgICAgICBFTlRFUl9PVkVSTEFQCisgICAgICAgICAgICBpZiAoIW9rKQorICAgICAgICAgICAgICAgIFRraW50ZXJfRXJyb3Ioc2VsZik7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXMgPSBQeV9Ob25lOworICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihyZXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTEVBVkVfT1ZFUkxBUF9UQ0wKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBUa2FwcF9TZXRWYXIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiB2YXJfaW52b2tlKFNldFZhciwgc2VsZiwgYXJncywgVENMX0xFQVZFX0VSUl9NU0cpOworICAgIHJldHVybiB2YXJfaW52b2tlKFNldFZhciwgc2VsZiwgYXJncywgVENMX0xFQVZFX0VSUl9NU0cpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogVGthcHBfR2xvYmFsU2V0VmFyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gdmFyX2ludm9rZShTZXRWYXIsIHNlbGYsIGFyZ3MsIFRDTF9MRUFWRV9FUlJfTVNHIHwgVENMX0dMT0JBTF9PTkxZKTsKKyAgICByZXR1cm4gdmFyX2ludm9rZShTZXRWYXIsIHNlbGYsIGFyZ3MsIFRDTF9MRUFWRV9FUlJfTVNHIHwgVENMX0dMT0JBTF9PTkxZKTsKIH0KIAogCi0MCisKIHN0YXRpYyBQeU9iamVjdCAqCiBHZXRWYXIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBpbnQgZmxhZ3MpCiB7Ci0JY2hhciAqbmFtZTEsICpuYW1lMj1OVUxMOwotCVB5T2JqZWN0ICpyZXMgPSBOVUxMOwotCVRjbF9PYmogKnRyZXM7CisgICAgY2hhciAqbmFtZTEsICpuYW1lMj1OVUxMOworICAgIFB5T2JqZWN0ICpyZXMgPSBOVUxMOworICAgIFRjbF9PYmogKnRyZXM7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mfHM6Z2V0dmFyIiwgCi0JCQkgICAgICB2YXJuYW1lX2NvbnZlcnRlciwgJm5hbWUxLCAmbmFtZTIpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mfHM6Z2V0dmFyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdmFybmFtZV9jb252ZXJ0ZXIsICZuYW1lMSwgJm5hbWUyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlFTlRFUl9UQ0wKLQl0cmVzID0gVGNsX0dldFZhcjJFeChUa2FwcF9JbnRlcnAoc2VsZiksIG5hbWUxLCBuYW1lMiwgZmxhZ3MpOwotCUVOVEVSX09WRVJMQVAKLQlpZiAodHJlcyA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhUa2ludGVyX1RjbEVycm9yLCBUY2xfR2V0U3RyaW5nUmVzdWx0KFRrYXBwX0ludGVycChzZWxmKSkpOwotCX0gZWxzZSB7Ci0JCWlmICgoKFRrYXBwT2JqZWN0KilzZWxmKS0+d2FudG9iamVjdHMpIHsKLQkJCXJlcyA9IEZyb21PYmooc2VsZiwgdHJlcyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKFRjbF9HZXRTdHJpbmcodHJlcykpOwotCQl9Ci0JfQotCUxFQVZFX09WRVJMQVBfVENMCi0JcmV0dXJuIHJlczsKKyAgICBFTlRFUl9UQ0wKKyAgICB0cmVzID0gVGNsX0dldFZhcjJFeChUa2FwcF9JbnRlcnAoc2VsZiksIG5hbWUxLCBuYW1lMiwgZmxhZ3MpOworICAgIEVOVEVSX09WRVJMQVAKKyAgICBpZiAodHJlcyA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhUa2ludGVyX1RjbEVycm9yLCBUY2xfR2V0U3RyaW5nUmVzdWx0KFRrYXBwX0ludGVycChzZWxmKSkpOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmICgoKFRrYXBwT2JqZWN0KilzZWxmKS0+d2FudG9iamVjdHMpIHsKKyAgICAgICAgICAgIHJlcyA9IEZyb21PYmooc2VsZiwgdHJlcyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICByZXMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKFRjbF9HZXRTdHJpbmcodHJlcykpOworICAgICAgICB9CisgICAgfQorICAgIExFQVZFX09WRVJMQVBfVENMCisgICAgcmV0dXJuIHJlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFRrYXBwX0dldFZhcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIHZhcl9pbnZva2UoR2V0VmFyLCBzZWxmLCBhcmdzLCBUQ0xfTEVBVkVfRVJSX01TRyk7CisgICAgcmV0dXJuIHZhcl9pbnZva2UoR2V0VmFyLCBzZWxmLCBhcmdzLCBUQ0xfTEVBVkVfRVJSX01TRyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBUa2FwcF9HbG9iYWxHZXRWYXIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiB2YXJfaW52b2tlKEdldFZhciwgc2VsZiwgYXJncywgVENMX0xFQVZFX0VSUl9NU0cgfCBUQ0xfR0xPQkFMX09OTFkpOworICAgIHJldHVybiB2YXJfaW52b2tlKEdldFZhciwgc2VsZiwgYXJncywgVENMX0xFQVZFX0VSUl9NU0cgfCBUQ0xfR0xPQkFMX09OTFkpOwogfQogCiAKLQwKKwogc3RhdGljIFB5T2JqZWN0ICoKIFVuc2V0VmFyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgaW50IGZsYWdzKQogewotCWNoYXIgKm5hbWUxLCAqbmFtZTI9TlVMTDsKLQlpbnQgY29kZTsKLQlQeU9iamVjdCAqcmVzID0gTlVMTDsKKyAgICBjaGFyICpuYW1lMSwgKm5hbWUyPU5VTEw7CisgICAgaW50IGNvZGU7CisgICAgUHlPYmplY3QgKnJlcyA9IE5VTEw7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInN8czp1bnNldHZhciIsICZuYW1lMSwgJm5hbWUyKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzfHM6dW5zZXR2YXIiLCAmbmFtZTEsICZuYW1lMikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JRU5URVJfVENMCi0JY29kZSA9IFRjbF9VbnNldFZhcjIoVGthcHBfSW50ZXJwKHNlbGYpLCBuYW1lMSwgbmFtZTIsIGZsYWdzKTsKLQlFTlRFUl9PVkVSTEFQCi0JaWYgKGNvZGUgPT0gVENMX0VSUk9SKQotCQlyZXMgPSBUa2ludGVyX0Vycm9yKHNlbGYpOwotCWVsc2UgewotCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCXJlcyA9IFB5X05vbmU7Ci0JfQotCUxFQVZFX09WRVJMQVBfVENMCi0JcmV0dXJuIHJlczsKKyAgICBFTlRFUl9UQ0wKKyAgICBjb2RlID0gVGNsX1Vuc2V0VmFyMihUa2FwcF9JbnRlcnAoc2VsZiksIG5hbWUxLCBuYW1lMiwgZmxhZ3MpOworICAgIEVOVEVSX09WRVJMQVAKKyAgICBpZiAoY29kZSA9PSBUQ0xfRVJST1IpCisgICAgICAgIHJlcyA9IFRraW50ZXJfRXJyb3Ioc2VsZik7CisgICAgZWxzZSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmVzID0gUHlfTm9uZTsKKyAgICB9CisgICAgTEVBVkVfT1ZFUkxBUF9UQ0wKKyAgICByZXR1cm4gcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogVGthcHBfVW5zZXRWYXIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiB2YXJfaW52b2tlKFVuc2V0VmFyLCBzZWxmLCBhcmdzLCBUQ0xfTEVBVkVfRVJSX01TRyk7CisgICAgcmV0dXJuIHZhcl9pbnZva2UoVW5zZXRWYXIsIHNlbGYsIGFyZ3MsIFRDTF9MRUFWRV9FUlJfTVNHKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFRrYXBwX0dsb2JhbFVuc2V0VmFyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gdmFyX2ludm9rZShVbnNldFZhciwgc2VsZiwgYXJncywgVENMX0xFQVZFX0VSUl9NU0cgfCBUQ0xfR0xPQkFMX09OTFkpOworICAgIHJldHVybiB2YXJfaW52b2tlKFVuc2V0VmFyLCBzZWxmLCBhcmdzLCBUQ0xfTEVBVkVfRVJSX01TRyB8IFRDTF9HTE9CQUxfT05MWSk7CiB9CiAKIAotDAorCiAvKiogVGNsIHRvIFB5dGhvbiAqKi8KIAogc3RhdGljIFB5T2JqZWN0ICoKIFRrYXBwX0dldEludChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqczsKLQlpbnQgdjsKKyAgICBjaGFyICpzOworICAgIGludCB2OwogCi0JaWYgKFB5VHVwbGVfU2l6ZShhcmdzKSA9PSAxKSB7Ci0JCVB5T2JqZWN0KiBvID0gUHlUdXBsZV9HZXRJdGVtKGFyZ3MsIDApOwotCQlpZiAoUHlJbnRfQ2hlY2sobykpIHsKLQkJCVB5X0lOQ1JFRihvKTsKLQkJCXJldHVybiBvOwotCQl9Ci0JfQotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczpnZXRpbnQiLCAmcykpCi0JCXJldHVybiBOVUxMOwotCWlmIChUY2xfR2V0SW50KFRrYXBwX0ludGVycChzZWxmKSwgcywgJnYpID09IFRDTF9FUlJPUikKLQkJcmV0dXJuIFRraW50ZXJfRXJyb3Ioc2VsZik7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLCB2KTsKKyAgICBpZiAoUHlUdXBsZV9TaXplKGFyZ3MpID09IDEpIHsKKyAgICAgICAgUHlPYmplY3QqIG8gPSBQeVR1cGxlX0dldEl0ZW0oYXJncywgMCk7CisgICAgICAgIGlmIChQeUludF9DaGVjayhvKSkgeworICAgICAgICAgICAgUHlfSU5DUkVGKG8pOworICAgICAgICAgICAgcmV0dXJuIG87CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOmdldGludCIsICZzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKFRjbF9HZXRJbnQoVGthcHBfSW50ZXJwKHNlbGYpLCBzLCAmdikgPT0gVENMX0VSUk9SKQorICAgICAgICByZXR1cm4gVGtpbnRlcl9FcnJvcihzZWxmKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIHYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogVGthcHBfR2V0RG91YmxlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpzOwotCWRvdWJsZSB2OworICAgIGNoYXIgKnM7CisgICAgZG91YmxlIHY7CiAKLQlpZiAoUHlUdXBsZV9TaXplKGFyZ3MpID09IDEpIHsKLQkJUHlPYmplY3QgKm8gPSBQeVR1cGxlX0dldEl0ZW0oYXJncywgMCk7Ci0JCWlmIChQeUZsb2F0X0NoZWNrKG8pKSB7Ci0JCQlQeV9JTkNSRUYobyk7Ci0JCQlyZXR1cm4gbzsKLQkJfQotCX0KLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6Z2V0ZG91YmxlIiwgJnMpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoVGNsX0dldERvdWJsZShUa2FwcF9JbnRlcnAoc2VsZiksIHMsICZ2KSA9PSBUQ0xfRVJST1IpCi0JCXJldHVybiBUa2ludGVyX0Vycm9yKHNlbGYpOwotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJkIiwgdik7CisgICAgaWYgKFB5VHVwbGVfU2l6ZShhcmdzKSA9PSAxKSB7CisgICAgICAgIFB5T2JqZWN0ICpvID0gUHlUdXBsZV9HZXRJdGVtKGFyZ3MsIDApOworICAgICAgICBpZiAoUHlGbG9hdF9DaGVjayhvKSkgeworICAgICAgICAgICAgUHlfSU5DUkVGKG8pOworICAgICAgICAgICAgcmV0dXJuIG87CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOmdldGRvdWJsZSIsICZzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKFRjbF9HZXREb3VibGUoVGthcHBfSW50ZXJwKHNlbGYpLCBzLCAmdikgPT0gVENMX0VSUk9SKQorICAgICAgICByZXR1cm4gVGtpbnRlcl9FcnJvcihzZWxmKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiZCIsIHYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogVGthcHBfR2V0Qm9vbGVhbihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqczsKLQlpbnQgdjsKKyAgICBjaGFyICpzOworICAgIGludCB2OwogCi0JaWYgKFB5VHVwbGVfU2l6ZShhcmdzKSA9PSAxKSB7Ci0JCVB5T2JqZWN0ICpvID0gUHlUdXBsZV9HZXRJdGVtKGFyZ3MsIDApOwotCQlpZiAoUHlJbnRfQ2hlY2sobykpIHsKLQkJCVB5X0lOQ1JFRihvKTsKLQkJCXJldHVybiBvOwotCQl9Ci0JfQotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczpnZXRib29sZWFuIiwgJnMpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoVGNsX0dldEJvb2xlYW4oVGthcHBfSW50ZXJwKHNlbGYpLCBzLCAmdikgPT0gVENMX0VSUk9SKQotCQlyZXR1cm4gVGtpbnRlcl9FcnJvcihzZWxmKTsKLQlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKHYpOworICAgIGlmIChQeVR1cGxlX1NpemUoYXJncykgPT0gMSkgeworICAgICAgICBQeU9iamVjdCAqbyA9IFB5VHVwbGVfR2V0SXRlbShhcmdzLCAwKTsKKyAgICAgICAgaWYgKFB5SW50X0NoZWNrKG8pKSB7CisgICAgICAgICAgICBQeV9JTkNSRUYobyk7CisgICAgICAgICAgICByZXR1cm4gbzsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6Z2V0Ym9vbGVhbiIsICZzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKFRjbF9HZXRCb29sZWFuKFRrYXBwX0ludGVycChzZWxmKSwgcywgJnYpID09IFRDTF9FUlJPUikKKyAgICAgICAgcmV0dXJuIFRraW50ZXJfRXJyb3Ioc2VsZik7CisgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZyh2KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFRrYXBwX0V4cHJTdHJpbmcoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKnM7Ci0JUHlPYmplY3QgKnJlcyA9IE5VTEw7Ci0JaW50IHJldHZhbDsKKyAgICBjaGFyICpzOworICAgIFB5T2JqZWN0ICpyZXMgPSBOVUxMOworICAgIGludCByZXR2YWw7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6ZXhwcnN0cmluZyIsICZzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JCi0JQ0hFQ0tfVENMX0FQUEFSVE1FTlQ7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOmV4cHJzdHJpbmciLCAmcykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JRU5URVJfVENMCi0JcmV0dmFsID0gVGNsX0V4cHJTdHJpbmcoVGthcHBfSW50ZXJwKHNlbGYpLCBzKTsKLQlFTlRFUl9PVkVSTEFQCi0JaWYgKHJldHZhbCA9PSBUQ0xfRVJST1IpCi0JCXJlcyA9IFRraW50ZXJfRXJyb3Ioc2VsZik7Ci0JZWxzZQotCQlyZXMgPSBQeV9CdWlsZFZhbHVlKCJzIiwgVGthcHBfUmVzdWx0KHNlbGYpKTsKLQlMRUFWRV9PVkVSTEFQX1RDTAotCXJldHVybiByZXM7CisgICAgQ0hFQ0tfVENMX0FQUEFSVE1FTlQ7CisKKyAgICBFTlRFUl9UQ0wKKyAgICByZXR2YWwgPSBUY2xfRXhwclN0cmluZyhUa2FwcF9JbnRlcnAoc2VsZiksIHMpOworICAgIEVOVEVSX09WRVJMQVAKKyAgICBpZiAocmV0dmFsID09IFRDTF9FUlJPUikKKyAgICAgICAgcmVzID0gVGtpbnRlcl9FcnJvcihzZWxmKTsKKyAgICBlbHNlCisgICAgICAgIHJlcyA9IFB5X0J1aWxkVmFsdWUoInMiLCBUa2FwcF9SZXN1bHQoc2VsZikpOworICAgIExFQVZFX09WRVJMQVBfVENMCisgICAgcmV0dXJuIHJlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFRrYXBwX0V4cHJMb25nKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpzOwotCVB5T2JqZWN0ICpyZXMgPSBOVUxMOwotCWludCByZXR2YWw7Ci0JbG9uZyB2OworICAgIGNoYXIgKnM7CisgICAgUHlPYmplY3QgKnJlcyA9IE5VTEw7CisgICAgaW50IHJldHZhbDsKKyAgICBsb25nIHY7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6ZXhwcmxvbmciLCAmcykpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczpleHBybG9uZyIsICZzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlDSEVDS19UQ0xfQVBQQVJUTUVOVDsKKyAgICBDSEVDS19UQ0xfQVBQQVJUTUVOVDsKIAotCUVOVEVSX1RDTAotCXJldHZhbCA9IFRjbF9FeHByTG9uZyhUa2FwcF9JbnRlcnAoc2VsZiksIHMsICZ2KTsKLQlFTlRFUl9PVkVSTEFQCi0JaWYgKHJldHZhbCA9PSBUQ0xfRVJST1IpCi0JCXJlcyA9IFRraW50ZXJfRXJyb3Ioc2VsZik7Ci0JZWxzZQotCQlyZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwgdik7Ci0JTEVBVkVfT1ZFUkxBUF9UQ0wKLQlyZXR1cm4gcmVzOworICAgIEVOVEVSX1RDTAorICAgIHJldHZhbCA9IFRjbF9FeHByTG9uZyhUa2FwcF9JbnRlcnAoc2VsZiksIHMsICZ2KTsKKyAgICBFTlRFUl9PVkVSTEFQCisgICAgaWYgKHJldHZhbCA9PSBUQ0xfRVJST1IpCisgICAgICAgIHJlcyA9IFRraW50ZXJfRXJyb3Ioc2VsZik7CisgICAgZWxzZQorICAgICAgICByZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwgdik7CisgICAgTEVBVkVfT1ZFUkxBUF9UQ0wKKyAgICByZXR1cm4gcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogVGthcHBfRXhwckRvdWJsZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqczsKLQlQeU9iamVjdCAqcmVzID0gTlVMTDsKLQlkb3VibGUgdjsKLQlpbnQgcmV0dmFsOworICAgIGNoYXIgKnM7CisgICAgUHlPYmplY3QgKnJlcyA9IE5VTEw7CisgICAgZG91YmxlIHY7CisgICAgaW50IHJldHZhbDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczpleHByZG91YmxlIiwgJnMpKQotCQlyZXR1cm4gTlVMTDsKLQlDSEVDS19UQ0xfQVBQQVJUTUVOVDsKLQlQeUZQRV9TVEFSVF9QUk9URUNUKCJUa2FwcF9FeHByRG91YmxlIiwgcmV0dXJuIDApCi0JRU5URVJfVENMCi0JcmV0dmFsID0gVGNsX0V4cHJEb3VibGUoVGthcHBfSW50ZXJwKHNlbGYpLCBzLCAmdik7Ci0JRU5URVJfT1ZFUkxBUAotCVB5RlBFX0VORF9QUk9URUNUKHJldHZhbCkKLQlpZiAocmV0dmFsID09IFRDTF9FUlJPUikKLQkJcmVzID0gVGtpbnRlcl9FcnJvcihzZWxmKTsKLQllbHNlCi0JCXJlcyA9IFB5X0J1aWxkVmFsdWUoImQiLCB2KTsKLQlMRUFWRV9PVkVSTEFQX1RDTAotCXJldHVybiByZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOmV4cHJkb3VibGUiLCAmcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENIRUNLX1RDTF9BUFBBUlRNRU5UOworICAgIFB5RlBFX1NUQVJUX1BST1RFQ1QoIlRrYXBwX0V4cHJEb3VibGUiLCByZXR1cm4gMCkKKyAgICBFTlRFUl9UQ0wKKyAgICByZXR2YWwgPSBUY2xfRXhwckRvdWJsZShUa2FwcF9JbnRlcnAoc2VsZiksIHMsICZ2KTsKKyAgICBFTlRFUl9PVkVSTEFQCisgICAgUHlGUEVfRU5EX1BST1RFQ1QocmV0dmFsKQorICAgIGlmIChyZXR2YWwgPT0gVENMX0VSUk9SKQorICAgICAgICByZXMgPSBUa2ludGVyX0Vycm9yKHNlbGYpOworICAgIGVsc2UKKyAgICAgICAgcmVzID0gUHlfQnVpbGRWYWx1ZSgiZCIsIHYpOworICAgIExFQVZFX09WRVJMQVBfVENMCisgICAgcmV0dXJuIHJlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFRrYXBwX0V4cHJCb29sZWFuKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpzOwotCVB5T2JqZWN0ICpyZXMgPSBOVUxMOwotCWludCByZXR2YWw7Ci0JaW50IHY7CisgICAgY2hhciAqczsKKyAgICBQeU9iamVjdCAqcmVzID0gTlVMTDsKKyAgICBpbnQgcmV0dmFsOworICAgIGludCB2OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOmV4cHJib29sZWFuIiwgJnMpKQotCQlyZXR1cm4gTlVMTDsKLQlDSEVDS19UQ0xfQVBQQVJUTUVOVDsKLQlFTlRFUl9UQ0wKLQlyZXR2YWwgPSBUY2xfRXhwckJvb2xlYW4oVGthcHBfSW50ZXJwKHNlbGYpLCBzLCAmdik7Ci0JRU5URVJfT1ZFUkxBUAotCWlmIChyZXR2YWwgPT0gVENMX0VSUk9SKQotCQlyZXMgPSBUa2ludGVyX0Vycm9yKHNlbGYpOwotCWVsc2UKLQkJcmVzID0gUHlfQnVpbGRWYWx1ZSgiaSIsIHYpOwotCUxFQVZFX09WRVJMQVBfVENMCi0JcmV0dXJuIHJlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6ZXhwcmJvb2xlYW4iLCAmcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENIRUNLX1RDTF9BUFBBUlRNRU5UOworICAgIEVOVEVSX1RDTAorICAgIHJldHZhbCA9IFRjbF9FeHByQm9vbGVhbihUa2FwcF9JbnRlcnAoc2VsZiksIHMsICZ2KTsKKyAgICBFTlRFUl9PVkVSTEFQCisgICAgaWYgKHJldHZhbCA9PSBUQ0xfRVJST1IpCisgICAgICAgIHJlcyA9IFRraW50ZXJfRXJyb3Ioc2VsZik7CisgICAgZWxzZQorICAgICAgICByZXMgPSBQeV9CdWlsZFZhbHVlKCJpIiwgdik7CisgICAgTEVBVkVfT1ZFUkxBUF9UQ0wKKyAgICByZXR1cm4gcmVzOwogfQogCiAKLQwKKwogc3RhdGljIFB5T2JqZWN0ICoKIFRrYXBwX1NwbGl0TGlzdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqbGlzdDsKLQlpbnQgYXJnYzsKLQljaGFyICoqYXJndjsKLQlQeU9iamVjdCAqdjsKLQlpbnQgaTsKKyAgICBjaGFyICpsaXN0OworICAgIGludCBhcmdjOworICAgIGNoYXIgKiphcmd2OworICAgIFB5T2JqZWN0ICp2OworICAgIGludCBpOwogCi0JaWYgKFB5VHVwbGVfU2l6ZShhcmdzKSA9PSAxKSB7Ci0JCXYgPSBQeVR1cGxlX0dldEl0ZW0oYXJncywgMCk7Ci0JCWlmIChQeVR1cGxlX0NoZWNrKHYpKSB7Ci0JCQlQeV9JTkNSRUYodik7Ci0JCQlyZXR1cm4gdjsKLQkJfQotCX0KLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImV0OnNwbGl0bGlzdCIsICJ1dGYtOCIsICZsaXN0KSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKFB5VHVwbGVfU2l6ZShhcmdzKSA9PSAxKSB7CisgICAgICAgIHYgPSBQeVR1cGxlX0dldEl0ZW0oYXJncywgMCk7CisgICAgICAgIGlmIChQeVR1cGxlX0NoZWNrKHYpKSB7CisgICAgICAgICAgICBQeV9JTkNSRUYodik7CisgICAgICAgICAgICByZXR1cm4gdjsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImV0OnNwbGl0bGlzdCIsICJ1dGYtOCIsICZsaXN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoVGNsX1NwbGl0TGlzdChUa2FwcF9JbnRlcnAoc2VsZiksIGxpc3QsIAotCQkJICAmYXJnYywgJmFyZ3YpID09IFRDTF9FUlJPUikgIHsKLQkJUHlNZW1fRnJlZShsaXN0KTsKLQkJcmV0dXJuIFRraW50ZXJfRXJyb3Ioc2VsZik7Ci0JfQorICAgIGlmIChUY2xfU3BsaXRMaXN0KFRrYXBwX0ludGVycChzZWxmKSwgbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAmYXJnYywgJmFyZ3YpID09IFRDTF9FUlJPUikgIHsKKyAgICAgICAgUHlNZW1fRnJlZShsaXN0KTsKKyAgICAgICAgcmV0dXJuIFRraW50ZXJfRXJyb3Ioc2VsZik7CisgICAgfQogCi0JaWYgKCEodiA9IFB5VHVwbGVfTmV3KGFyZ2MpKSkKLQkJZ290byBmaW5hbGx5OworICAgIGlmICghKHYgPSBQeVR1cGxlX05ldyhhcmdjKSkpCisgICAgICAgIGdvdG8gZmluYWxseTsKIAotCWZvciAoaSA9IDA7IGkgPCBhcmdjOyBpKyspIHsKLQkJUHlPYmplY3QgKnMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGFyZ3ZbaV0pOwotCQlpZiAoIXMgfHwgUHlUdXBsZV9TZXRJdGVtKHYsIGksIHMpKSB7Ci0JCQlQeV9ERUNSRUYodik7Ci0JCQl2ID0gTlVMTDsKLQkJCWdvdG8gZmluYWxseTsKLQkJfQotCX0KKyAgICBmb3IgKGkgPSAwOyBpIDwgYXJnYzsgaSsrKSB7CisgICAgICAgIFB5T2JqZWN0ICpzID0gUHlTdHJpbmdfRnJvbVN0cmluZyhhcmd2W2ldKTsKKyAgICAgICAgaWYgKCFzIHx8IFB5VHVwbGVfU2V0SXRlbSh2LCBpLCBzKSkgeworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgdiA9IE5VTEw7CisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgICAgIH0KKyAgICB9CiAKICAgZmluYWxseToKLQlja2ZyZWUoRlJFRUNBU1QgYXJndik7Ci0JUHlNZW1fRnJlZShsaXN0KTsKLQlyZXR1cm4gdjsKKyAgICBja2ZyZWUoRlJFRUNBU1QgYXJndik7CisgICAgUHlNZW1fRnJlZShsaXN0KTsKKyAgICByZXR1cm4gdjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFRrYXBwX1NwbGl0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqdjsKLQljaGFyICpsaXN0OworICAgIFB5T2JqZWN0ICp2OworICAgIGNoYXIgKmxpc3Q7CiAKLQlpZiAoUHlUdXBsZV9TaXplKGFyZ3MpID09IDEpIHsKLQkJUHlPYmplY3QqIG8gPSBQeVR1cGxlX0dldEl0ZW0oYXJncywgMCk7Ci0JCWlmIChQeVR1cGxlX0NoZWNrKG8pKSB7Ci0JCQlvID0gU3BsaXRPYmoobyk7Ci0JCQlyZXR1cm4gbzsKLQkJfQotCX0KLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImV0OnNwbGl0IiwgInV0Zi04IiwgJmxpc3QpKQotCQlyZXR1cm4gTlVMTDsKLQl2ID0gU3BsaXQobGlzdCk7Ci0JUHlNZW1fRnJlZShsaXN0KTsKLQlyZXR1cm4gdjsKKyAgICBpZiAoUHlUdXBsZV9TaXplKGFyZ3MpID09IDEpIHsKKyAgICAgICAgUHlPYmplY3QqIG8gPSBQeVR1cGxlX0dldEl0ZW0oYXJncywgMCk7CisgICAgICAgIGlmIChQeVR1cGxlX0NoZWNrKG8pKSB7CisgICAgICAgICAgICBvID0gU3BsaXRPYmoobyk7CisgICAgICAgICAgICByZXR1cm4gbzsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImV0OnNwbGl0IiwgInV0Zi04IiwgJmxpc3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB2ID0gU3BsaXQobGlzdCk7CisgICAgUHlNZW1fRnJlZShsaXN0KTsKKyAgICByZXR1cm4gdjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFRrYXBwX01lcmdlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpzID0gTWVyZ2UoYXJncyk7Ci0JUHlPYmplY3QgKnJlcyA9IE5VTEw7CisgICAgY2hhciAqcyA9IE1lcmdlKGFyZ3MpOworICAgIFB5T2JqZWN0ICpyZXMgPSBOVUxMOwogCi0JaWYgKHMpIHsKLQkJcmVzID0gUHlTdHJpbmdfRnJvbVN0cmluZyhzKTsKLQkJY2tmcmVlKHMpOwotCX0KKyAgICBpZiAocykgeworICAgICAgICByZXMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKHMpOworICAgICAgICBja2ZyZWUocyk7CisgICAgfQogCi0JcmV0dXJuIHJlczsKKyAgICByZXR1cm4gcmVzOwogfQogCiAKLQwKKwogLyoqIFRjbCBDb21tYW5kICoqLwogCiAvKiBDbGllbnQgZGF0YSBzdHJ1Y3QgKi8KIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdCAqc2VsZjsKLQlQeU9iamVjdCAqZnVuYzsKKyAgICBQeU9iamVjdCAqc2VsZjsKKyAgICBQeU9iamVjdCAqZnVuYzsKIH0gUHl0aG9uQ21kX0NsaWVudERhdGE7CiAKIHN0YXRpYyBpbnQKIFB5dGhvbkNtZF9FcnJvcihUY2xfSW50ZXJwICppbnRlcnApCiB7Ci0JZXJyb3JJbkNtZCA9IDE7Ci0JUHlFcnJfRmV0Y2goJmV4Y0luQ21kLCAmdmFsSW5DbWQsICZ0cmJJbkNtZCk7Ci0JTEVBVkVfUFlUSE9OCi0JcmV0dXJuIFRDTF9FUlJPUjsKKyAgICBlcnJvckluQ21kID0gMTsKKyAgICBQeUVycl9GZXRjaCgmZXhjSW5DbWQsICZ2YWxJbkNtZCwgJnRyYkluQ21kKTsKKyAgICBMRUFWRV9QWVRIT04KKyAgICByZXR1cm4gVENMX0VSUk9SOwogfQogCiAvKiBUaGlzIGlzIHRoZSBUY2wgY29tbWFuZCB0aGF0IGFjdHMgYXMgYSB3cmFwcGVyIGZvciBQeXRob24KQEAgLTE5OTQsMTk5ICsxOTk0LDE5OSBAQAogc3RhdGljIGludAogUHl0aG9uQ21kKENsaWVudERhdGEgY2xpZW50RGF0YSwgVGNsX0ludGVycCAqaW50ZXJwLCBpbnQgYXJnYywgY2hhciAqYXJndltdKQogewotCVB5dGhvbkNtZF9DbGllbnREYXRhICpkYXRhID0gKFB5dGhvbkNtZF9DbGllbnREYXRhICopY2xpZW50RGF0YTsKLQlQeU9iamVjdCAqc2VsZiwgKmZ1bmMsICphcmcsICpyZXM7Ci0JaW50IGksIHJ2OwotCVRjbF9PYmogKm9ial9yZXM7CisgICAgUHl0aG9uQ21kX0NsaWVudERhdGEgKmRhdGEgPSAoUHl0aG9uQ21kX0NsaWVudERhdGEgKiljbGllbnREYXRhOworICAgIFB5T2JqZWN0ICpzZWxmLCAqZnVuYywgKmFyZywgKnJlczsKKyAgICBpbnQgaSwgcnY7CisgICAgVGNsX09iaiAqb2JqX3JlczsKIAotCUVOVEVSX1BZVEhPTgorICAgIEVOVEVSX1BZVEhPTgogCi0JLyogVEJEOiBubyBlcnJvciBjaGVja2luZyBoZXJlIHNpbmNlIHdlIGtub3csIHZpYSB0aGUKLQkgKiBUa2FwcF9DcmVhdGVDb21tYW5kKCkgdGhhdCB0aGUgY2xpZW50IGRhdGEgaXMgYSB0d28tdHVwbGUKLQkgKi8KLQlzZWxmID0gZGF0YS0+c2VsZjsKLQlmdW5jID0gZGF0YS0+ZnVuYzsKKyAgICAvKiBUQkQ6IG5vIGVycm9yIGNoZWNraW5nIGhlcmUgc2luY2Ugd2Uga25vdywgdmlhIHRoZQorICAgICAqIFRrYXBwX0NyZWF0ZUNvbW1hbmQoKSB0aGF0IHRoZSBjbGllbnQgZGF0YSBpcyBhIHR3by10dXBsZQorICAgICAqLworICAgIHNlbGYgPSBkYXRhLT5zZWxmOworICAgIGZ1bmMgPSBkYXRhLT5mdW5jOwogCi0JLyogQ3JlYXRlIGFyZ3VtZW50IGxpc3QgKGFyZ3YxLCAuLi4sIGFyZ3ZOKSAqLwotCWlmICghKGFyZyA9IFB5VHVwbGVfTmV3KGFyZ2MgLSAxKSkpCi0JCXJldHVybiBQeXRob25DbWRfRXJyb3IoaW50ZXJwKTsKKyAgICAvKiBDcmVhdGUgYXJndW1lbnQgbGlzdCAoYXJndjEsIC4uLiwgYXJndk4pICovCisgICAgaWYgKCEoYXJnID0gUHlUdXBsZV9OZXcoYXJnYyAtIDEpKSkKKyAgICAgICAgcmV0dXJuIFB5dGhvbkNtZF9FcnJvcihpbnRlcnApOwogCi0JZm9yIChpID0gMDsgaSA8IChhcmdjIC0gMSk7IGkrKykgewotCQlQeU9iamVjdCAqcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoYXJndltpICsgMV0pOwotCQlpZiAoIXMgfHwgUHlUdXBsZV9TZXRJdGVtKGFyZywgaSwgcykpIHsKLQkJCVB5X0RFQ1JFRihhcmcpOwotCQkJcmV0dXJuIFB5dGhvbkNtZF9FcnJvcihpbnRlcnApOwotCQl9Ci0JfQotCXJlcyA9IFB5RXZhbF9DYWxsT2JqZWN0KGZ1bmMsIGFyZyk7Ci0JUHlfREVDUkVGKGFyZyk7CisgICAgZm9yIChpID0gMDsgaSA8IChhcmdjIC0gMSk7IGkrKykgeworICAgICAgICBQeU9iamVjdCAqcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoYXJndltpICsgMV0pOworICAgICAgICBpZiAoIXMgfHwgUHlUdXBsZV9TZXRJdGVtKGFyZywgaSwgcykpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihhcmcpOworICAgICAgICAgICAgcmV0dXJuIFB5dGhvbkNtZF9FcnJvcihpbnRlcnApOworICAgICAgICB9CisgICAgfQorICAgIHJlcyA9IFB5RXZhbF9DYWxsT2JqZWN0KGZ1bmMsIGFyZyk7CisgICAgUHlfREVDUkVGKGFyZyk7CiAKLQlpZiAocmVzID09IE5VTEwpCi0JCXJldHVybiBQeXRob25DbWRfRXJyb3IoaW50ZXJwKTsKKyAgICBpZiAocmVzID09IE5VTEwpCisgICAgICAgIHJldHVybiBQeXRob25DbWRfRXJyb3IoaW50ZXJwKTsKIAotCW9ial9yZXMgPSBBc09iaihyZXMpOwotCWlmIChvYmpfcmVzID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKHJlcyk7Ci0JCXJldHVybiBQeXRob25DbWRfRXJyb3IoaW50ZXJwKTsKLQl9Ci0JZWxzZSB7Ci0JCVRjbF9TZXRPYmpSZXN1bHQoaW50ZXJwLCBvYmpfcmVzKTsKLQkJcnYgPSBUQ0xfT0s7Ci0JfQorICAgIG9ial9yZXMgPSBBc09iaihyZXMpOworICAgIGlmIChvYmpfcmVzID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKHJlcyk7CisgICAgICAgIHJldHVybiBQeXRob25DbWRfRXJyb3IoaW50ZXJwKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFRjbF9TZXRPYmpSZXN1bHQoaW50ZXJwLCBvYmpfcmVzKTsKKyAgICAgICAgcnYgPSBUQ0xfT0s7CisgICAgfQogCi0JUHlfREVDUkVGKHJlcyk7CisgICAgUHlfREVDUkVGKHJlcyk7CiAKLQlMRUFWRV9QWVRIT04KKyAgICBMRUFWRV9QWVRIT04KIAotCXJldHVybiBydjsKKyAgICByZXR1cm4gcnY7CiB9CiAKIHN0YXRpYyB2b2lkCiBQeXRob25DbWREZWxldGUoQ2xpZW50RGF0YSBjbGllbnREYXRhKQogewotCVB5dGhvbkNtZF9DbGllbnREYXRhICpkYXRhID0gKFB5dGhvbkNtZF9DbGllbnREYXRhICopY2xpZW50RGF0YTsKKyAgICBQeXRob25DbWRfQ2xpZW50RGF0YSAqZGF0YSA9IChQeXRob25DbWRfQ2xpZW50RGF0YSAqKWNsaWVudERhdGE7CiAKLQlFTlRFUl9QWVRIT04KLQlQeV9YREVDUkVGKGRhdGEtPnNlbGYpOwotCVB5X1hERUNSRUYoZGF0YS0+ZnVuYyk7Ci0JUHlNZW1fREVMKGRhdGEpOwotCUxFQVZFX1BZVEhPTgorICAgIEVOVEVSX1BZVEhPTgorICAgIFB5X1hERUNSRUYoZGF0YS0+c2VsZik7CisgICAgUHlfWERFQ1JFRihkYXRhLT5mdW5jKTsKKyAgICBQeU1lbV9ERUwoZGF0YSk7CisgICAgTEVBVkVfUFlUSE9OCiB9CiAKIAotDAorCiAKIFRDTF9ERUNMQVJFX01VVEVYKGNvbW1hbmRfbXV0ZXgpCiAKIHR5cGVkZWYgc3RydWN0IENvbW1hbmRFdmVudHsKLQlUY2xfRXZlbnQgZXY7Ci0JVGNsX0ludGVycCogaW50ZXJwOwotCWNoYXIgKm5hbWU7Ci0JaW50IGNyZWF0ZTsKLQlpbnQgKnN0YXR1czsKLQlDbGllbnREYXRhICpkYXRhOwotCVRjbF9Db25kaXRpb24gZG9uZTsKKyAgICBUY2xfRXZlbnQgZXY7CisgICAgVGNsX0ludGVycCogaW50ZXJwOworICAgIGNoYXIgKm5hbWU7CisgICAgaW50IGNyZWF0ZTsKKyAgICBpbnQgKnN0YXR1czsKKyAgICBDbGllbnREYXRhICpkYXRhOworICAgIFRjbF9Db25kaXRpb24gZG9uZTsKIH0gQ29tbWFuZEV2ZW50OwogCiBzdGF0aWMgaW50CiBUa2FwcF9Db21tYW5kUHJvYyhDb21tYW5kRXZlbnQgKmV2LCBpbnQgZmxhZ3MpCiB7Ci0JaWYgKGV2LT5jcmVhdGUpCi0JCSpldi0+c3RhdHVzID0gVGNsX0NyZWF0ZUNvbW1hbmQoCi0JCQlldi0+aW50ZXJwLCBldi0+bmFtZSwgUHl0aG9uQ21kLAotCQkJZXYtPmRhdGEsIFB5dGhvbkNtZERlbGV0ZSkgPT0gTlVMTDsKLQllbHNlCi0JCSpldi0+c3RhdHVzID0gVGNsX0RlbGV0ZUNvbW1hbmQoZXYtPmludGVycCwgZXYtPm5hbWUpOwotCVRjbF9NdXRleExvY2soJmNvbW1hbmRfbXV0ZXgpOwotCVRjbF9Db25kaXRpb25Ob3RpZnkoJmV2LT5kb25lKTsKLQlUY2xfTXV0ZXhVbmxvY2soJmNvbW1hbmRfbXV0ZXgpOwotCXJldHVybiAxOworICAgIGlmIChldi0+Y3JlYXRlKQorICAgICAgICAqZXYtPnN0YXR1cyA9IFRjbF9DcmVhdGVDb21tYW5kKAorICAgICAgICAgICAgZXYtPmludGVycCwgZXYtPm5hbWUsIFB5dGhvbkNtZCwKKyAgICAgICAgICAgIGV2LT5kYXRhLCBQeXRob25DbWREZWxldGUpID09IE5VTEw7CisgICAgZWxzZQorICAgICAgICAqZXYtPnN0YXR1cyA9IFRjbF9EZWxldGVDb21tYW5kKGV2LT5pbnRlcnAsIGV2LT5uYW1lKTsKKyAgICBUY2xfTXV0ZXhMb2NrKCZjb21tYW5kX211dGV4KTsKKyAgICBUY2xfQ29uZGl0aW9uTm90aWZ5KCZldi0+ZG9uZSk7CisgICAgVGNsX011dGV4VW5sb2NrKCZjb21tYW5kX211dGV4KTsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFRrYXBwX0NyZWF0ZUNvbW1hbmQoUHlPYmplY3QgKnNlbGZwdHIsIFB5T2JqZWN0ICphcmdzKQogewotCVRrYXBwT2JqZWN0ICpzZWxmID0gKFRrYXBwT2JqZWN0KilzZWxmcHRyOwotCVB5dGhvbkNtZF9DbGllbnREYXRhICpkYXRhOwotCWNoYXIgKmNtZE5hbWU7Ci0JUHlPYmplY3QgKmZ1bmM7Ci0JaW50IGVycjsKKyAgICBUa2FwcE9iamVjdCAqc2VsZiA9IChUa2FwcE9iamVjdCopc2VsZnB0cjsKKyAgICBQeXRob25DbWRfQ2xpZW50RGF0YSAqZGF0YTsKKyAgICBjaGFyICpjbWROYW1lOworICAgIFB5T2JqZWN0ICpmdW5jOworICAgIGludCBlcnI7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInNPOmNyZWF0ZWNvbW1hbmQiLCAmY21kTmFtZSwgJmZ1bmMpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIVB5Q2FsbGFibGVfQ2hlY2soZnVuYykpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImNvbW1hbmQgbm90IGNhbGxhYmxlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInNPOmNyZWF0ZWNvbW1hbmQiLCAmY21kTmFtZSwgJmZ1bmMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5Q2FsbGFibGVfQ2hlY2soZnVuYykpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImNvbW1hbmQgbm90IGNhbGxhYmxlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAogI2lmZGVmIFdJVEhfVEhSRUFECi0JaWYgKHNlbGYtPnRocmVhZGVkICYmIHNlbGYtPnRocmVhZF9pZCAhPSBUY2xfR2V0Q3VycmVudFRocmVhZCgpICYmCi0JICAgICFXYWl0Rm9yTWFpbmxvb3Aoc2VsZikpCi0JCXJldHVybiBOVUxMOworICAgIGlmIChzZWxmLT50aHJlYWRlZCAmJiBzZWxmLT50aHJlYWRfaWQgIT0gVGNsX0dldEN1cnJlbnRUaHJlYWQoKSAmJgorICAgICAgICAhV2FpdEZvck1haW5sb29wKHNlbGYpKQorICAgICAgICByZXR1cm4gTlVMTDsKICNlbmRpZgogCi0JZGF0YSA9IFB5TWVtX05FVyhQeXRob25DbWRfQ2xpZW50RGF0YSwgMSk7Ci0JaWYgKCFkYXRhKQotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQlQeV9JTkNSRUYoc2VsZik7Ci0JUHlfSU5DUkVGKGZ1bmMpOwotCWRhdGEtPnNlbGYgPSBzZWxmcHRyOwotCWRhdGEtPmZ1bmMgPSBmdW5jOwotCQotCWlmIChzZWxmLT50aHJlYWRlZCAmJiBzZWxmLT50aHJlYWRfaWQgIT0gVGNsX0dldEN1cnJlbnRUaHJlYWQoKSkgewotCQlDb21tYW5kRXZlbnQgKmV2ID0gKENvbW1hbmRFdmVudCopY2thbGxvYyhzaXplb2YoQ29tbWFuZEV2ZW50KSk7Ci0JCWV2LT5ldi5wcm9jID0gKFRjbF9FdmVudFByb2MqKVRrYXBwX0NvbW1hbmRQcm9jOwotCQlldi0+aW50ZXJwID0gc2VsZi0+aW50ZXJwOwotCQlldi0+Y3JlYXRlID0gMTsKLQkJZXYtPm5hbWUgPSBjbWROYW1lOwotCQlldi0+ZGF0YSA9IChDbGllbnREYXRhKWRhdGE7Ci0JCWV2LT5zdGF0dXMgPSAmZXJyOwotCQlldi0+ZG9uZSA9IE5VTEw7Ci0JCVRrYXBwX1RocmVhZFNlbmQoc2VsZiwgKFRjbF9FdmVudCopZXYsICZldi0+ZG9uZSwgJmNvbW1hbmRfbXV0ZXgpOwotCX0KLQllbHNlIHsKLQkJRU5URVJfVENMCi0JCWVyciA9IFRjbF9DcmVhdGVDb21tYW5kKAotCQkJVGthcHBfSW50ZXJwKHNlbGYpLCBjbWROYW1lLCBQeXRob25DbWQsCi0JCQkoQ2xpZW50RGF0YSlkYXRhLCBQeXRob25DbWREZWxldGUpID09IE5VTEw7Ci0JCUxFQVZFX1RDTAotCX0KLQlpZiAoZXJyKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhUa2ludGVyX1RjbEVycm9yLCAiY2FuJ3QgY3JlYXRlIFRjbCBjb21tYW5kIik7Ci0JCVB5TWVtX0RFTChkYXRhKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGRhdGEgPSBQeU1lbV9ORVcoUHl0aG9uQ21kX0NsaWVudERhdGEsIDEpOworICAgIGlmICghZGF0YSkKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgUHlfSU5DUkVGKHNlbGYpOworICAgIFB5X0lOQ1JFRihmdW5jKTsKKyAgICBkYXRhLT5zZWxmID0gc2VsZnB0cjsKKyAgICBkYXRhLT5mdW5jID0gZnVuYzsKIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAoc2VsZi0+dGhyZWFkZWQgJiYgc2VsZi0+dGhyZWFkX2lkICE9IFRjbF9HZXRDdXJyZW50VGhyZWFkKCkpIHsKKyAgICAgICAgQ29tbWFuZEV2ZW50ICpldiA9IChDb21tYW5kRXZlbnQqKWNrYWxsb2Moc2l6ZW9mKENvbW1hbmRFdmVudCkpOworICAgICAgICBldi0+ZXYucHJvYyA9IChUY2xfRXZlbnRQcm9jKilUa2FwcF9Db21tYW5kUHJvYzsKKyAgICAgICAgZXYtPmludGVycCA9IHNlbGYtPmludGVycDsKKyAgICAgICAgZXYtPmNyZWF0ZSA9IDE7CisgICAgICAgIGV2LT5uYW1lID0gY21kTmFtZTsKKyAgICAgICAgZXYtPmRhdGEgPSAoQ2xpZW50RGF0YSlkYXRhOworICAgICAgICBldi0+c3RhdHVzID0gJmVycjsKKyAgICAgICAgZXYtPmRvbmUgPSBOVUxMOworICAgICAgICBUa2FwcF9UaHJlYWRTZW5kKHNlbGYsIChUY2xfRXZlbnQqKWV2LCAmZXYtPmRvbmUsICZjb21tYW5kX211dGV4KTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIEVOVEVSX1RDTAorICAgICAgICBlcnIgPSBUY2xfQ3JlYXRlQ29tbWFuZCgKKyAgICAgICAgICAgIFRrYXBwX0ludGVycChzZWxmKSwgY21kTmFtZSwgUHl0aG9uQ21kLAorICAgICAgICAgICAgKENsaWVudERhdGEpZGF0YSwgUHl0aG9uQ21kRGVsZXRlKSA9PSBOVUxMOworICAgICAgICBMRUFWRV9UQ0wKKyAgICB9CisgICAgaWYgKGVycikgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoVGtpbnRlcl9UY2xFcnJvciwgImNhbid0IGNyZWF0ZSBUY2wgY29tbWFuZCIpOworICAgICAgICBQeU1lbV9ERUwoZGF0YSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogCi0MCisKIHN0YXRpYyBQeU9iamVjdCAqCiBUa2FwcF9EZWxldGVDb21tYW5kKFB5T2JqZWN0ICpzZWxmcHRyLCBQeU9iamVjdCAqYXJncykKIHsKLQlUa2FwcE9iamVjdCAqc2VsZiA9IChUa2FwcE9iamVjdCopc2VsZnB0cjsKLQljaGFyICpjbWROYW1lOwotCWludCBlcnI7CisgICAgVGthcHBPYmplY3QgKnNlbGYgPSAoVGthcHBPYmplY3QqKXNlbGZwdHI7CisgICAgY2hhciAqY21kTmFtZTsKKyAgICBpbnQgZXJyOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOmRlbGV0ZWNvbW1hbmQiLCAmY21kTmFtZSkpCi0JCXJldHVybiBOVUxMOwotCWlmIChzZWxmLT50aHJlYWRlZCAmJiBzZWxmLT50aHJlYWRfaWQgIT0gVGNsX0dldEN1cnJlbnRUaHJlYWQoKSkgewotCQlDb21tYW5kRXZlbnQgKmV2OwotCQlldiA9IChDb21tYW5kRXZlbnQqKWNrYWxsb2Moc2l6ZW9mKENvbW1hbmRFdmVudCkpOwotCQlldi0+ZXYucHJvYyA9IChUY2xfRXZlbnRQcm9jKilUa2FwcF9Db21tYW5kUHJvYzsKLQkJZXYtPmludGVycCA9IHNlbGYtPmludGVycDsKLQkJZXYtPmNyZWF0ZSA9IDA7Ci0JCWV2LT5uYW1lID0gY21kTmFtZTsKLQkJZXYtPnN0YXR1cyA9ICZlcnI7Ci0JCWV2LT5kb25lID0gTlVMTDsKLQkJVGthcHBfVGhyZWFkU2VuZChzZWxmLCAoVGNsX0V2ZW50KilldiwgJmV2LT5kb25lLCAKLQkJCQkgJmNvbW1hbmRfbXV0ZXgpOwotCX0KLQllbHNlIHsKLQkJRU5URVJfVENMCi0JCWVyciA9IFRjbF9EZWxldGVDb21tYW5kKHNlbGYtPmludGVycCwgY21kTmFtZSk7Ci0JCUxFQVZFX1RDTAotCX0KLQlpZiAoZXJyID09IC0xKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhUa2ludGVyX1RjbEVycm9yLCAiY2FuJ3QgZGVsZXRlIFRjbCBjb21tYW5kIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOmRlbGV0ZWNvbW1hbmQiLCAmY21kTmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChzZWxmLT50aHJlYWRlZCAmJiBzZWxmLT50aHJlYWRfaWQgIT0gVGNsX0dldEN1cnJlbnRUaHJlYWQoKSkgeworICAgICAgICBDb21tYW5kRXZlbnQgKmV2OworICAgICAgICBldiA9IChDb21tYW5kRXZlbnQqKWNrYWxsb2Moc2l6ZW9mKENvbW1hbmRFdmVudCkpOworICAgICAgICBldi0+ZXYucHJvYyA9IChUY2xfRXZlbnRQcm9jKilUa2FwcF9Db21tYW5kUHJvYzsKKyAgICAgICAgZXYtPmludGVycCA9IHNlbGYtPmludGVycDsKKyAgICAgICAgZXYtPmNyZWF0ZSA9IDA7CisgICAgICAgIGV2LT5uYW1lID0gY21kTmFtZTsKKyAgICAgICAgZXYtPnN0YXR1cyA9ICZlcnI7CisgICAgICAgIGV2LT5kb25lID0gTlVMTDsKKyAgICAgICAgVGthcHBfVGhyZWFkU2VuZChzZWxmLCAoVGNsX0V2ZW50KilldiwgJmV2LT5kb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICZjb21tYW5kX211dGV4KTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIEVOVEVSX1RDTAorICAgICAgICBlcnIgPSBUY2xfRGVsZXRlQ29tbWFuZChzZWxmLT5pbnRlcnAsIGNtZE5hbWUpOworICAgICAgICBMRUFWRV9UQ0wKKyAgICB9CisgICAgaWYgKGVyciA9PSAtMSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoVGtpbnRlcl9UY2xFcnJvciwgImNhbid0IGRlbGV0ZSBUY2wgY29tbWFuZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAKLQwKKwogI2lmZGVmIEhBVkVfQ1JFQVRFRklMRUhBTkRMRVIKIC8qKiBGaWxlIEhhbmRsZXIgKiovCiAKIHR5cGVkZWYgc3RydWN0IF9maGNkYXRhIHsKLQlQeU9iamVjdCAqZnVuYzsKLQlQeU9iamVjdCAqZmlsZTsKLQlpbnQgaWQ7Ci0Jc3RydWN0IF9maGNkYXRhICpuZXh0OworICAgIFB5T2JqZWN0ICpmdW5jOworICAgIFB5T2JqZWN0ICpmaWxlOworICAgIGludCBpZDsKKyAgICBzdHJ1Y3QgX2ZoY2RhdGEgKm5leHQ7CiB9IEZpbGVIYW5kbGVyX0NsaWVudERhdGE7CiAKIHN0YXRpYyBGaWxlSGFuZGxlcl9DbGllbnREYXRhICpIZWFkRkhDRDsKQEAgLTIxOTQsNzQ3ICsyMTk0LDc0NyBAQAogc3RhdGljIEZpbGVIYW5kbGVyX0NsaWVudERhdGEgKgogTmV3RkhDRChQeU9iamVjdCAqZnVuYywgUHlPYmplY3QgKmZpbGUsIGludCBpZCkKIHsKLQlGaWxlSGFuZGxlcl9DbGllbnREYXRhICpwOwotCXAgPSBQeU1lbV9ORVcoRmlsZUhhbmRsZXJfQ2xpZW50RGF0YSwgMSk7Ci0JaWYgKHAgIT0gTlVMTCkgewotCQlQeV9YSU5DUkVGKGZ1bmMpOwotCQlQeV9YSU5DUkVGKGZpbGUpOwotCQlwLT5mdW5jID0gZnVuYzsKLQkJcC0+ZmlsZSA9IGZpbGU7Ci0JCXAtPmlkID0gaWQ7Ci0JCXAtPm5leHQgPSBIZWFkRkhDRDsKLQkJSGVhZEZIQ0QgPSBwOwotCX0KLQlyZXR1cm4gcDsKKyAgICBGaWxlSGFuZGxlcl9DbGllbnREYXRhICpwOworICAgIHAgPSBQeU1lbV9ORVcoRmlsZUhhbmRsZXJfQ2xpZW50RGF0YSwgMSk7CisgICAgaWYgKHAgIT0gTlVMTCkgeworICAgICAgICBQeV9YSU5DUkVGKGZ1bmMpOworICAgICAgICBQeV9YSU5DUkVGKGZpbGUpOworICAgICAgICBwLT5mdW5jID0gZnVuYzsKKyAgICAgICAgcC0+ZmlsZSA9IGZpbGU7CisgICAgICAgIHAtPmlkID0gaWQ7CisgICAgICAgIHAtPm5leHQgPSBIZWFkRkhDRDsKKyAgICAgICAgSGVhZEZIQ0QgPSBwOworICAgIH0KKyAgICByZXR1cm4gcDsKIH0KIAogc3RhdGljIHZvaWQKIERlbGV0ZUZIQ0QoaW50IGlkKQogewotCUZpbGVIYW5kbGVyX0NsaWVudERhdGEgKnAsICoqcHA7CisgICAgRmlsZUhhbmRsZXJfQ2xpZW50RGF0YSAqcCwgKipwcDsKIAotCXBwID0gJkhlYWRGSENEOwotCXdoaWxlICgocCA9ICpwcCkgIT0gTlVMTCkgewotCQlpZiAocC0+aWQgPT0gaWQpIHsKLQkJCSpwcCA9IHAtPm5leHQ7Ci0JCQlQeV9YREVDUkVGKHAtPmZ1bmMpOwotCQkJUHlfWERFQ1JFRihwLT5maWxlKTsKLQkJCVB5TWVtX0RFTChwKTsKLQkJfQotCQllbHNlCi0JCQlwcCA9ICZwLT5uZXh0OwotCX0KKyAgICBwcCA9ICZIZWFkRkhDRDsKKyAgICB3aGlsZSAoKHAgPSAqcHApICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKHAtPmlkID09IGlkKSB7CisgICAgICAgICAgICAqcHAgPSBwLT5uZXh0OworICAgICAgICAgICAgUHlfWERFQ1JFRihwLT5mdW5jKTsKKyAgICAgICAgICAgIFB5X1hERUNSRUYocC0+ZmlsZSk7CisgICAgICAgICAgICBQeU1lbV9ERUwocCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcHAgPSAmcC0+bmV4dDsKKyAgICB9CiB9CiAKIHN0YXRpYyB2b2lkCiBGaWxlSGFuZGxlcihDbGllbnREYXRhIGNsaWVudERhdGEsIGludCBtYXNrKQogewotCUZpbGVIYW5kbGVyX0NsaWVudERhdGEgKmRhdGEgPSAoRmlsZUhhbmRsZXJfQ2xpZW50RGF0YSAqKWNsaWVudERhdGE7Ci0JUHlPYmplY3QgKmZ1bmMsICpmaWxlLCAqYXJnLCAqcmVzOworICAgIEZpbGVIYW5kbGVyX0NsaWVudERhdGEgKmRhdGEgPSAoRmlsZUhhbmRsZXJfQ2xpZW50RGF0YSAqKWNsaWVudERhdGE7CisgICAgUHlPYmplY3QgKmZ1bmMsICpmaWxlLCAqYXJnLCAqcmVzOwogCi0JRU5URVJfUFlUSE9OCi0JZnVuYyA9IGRhdGEtPmZ1bmM7Ci0JZmlsZSA9IGRhdGEtPmZpbGU7CisgICAgRU5URVJfUFlUSE9OCisgICAgZnVuYyA9IGRhdGEtPmZ1bmM7CisgICAgZmlsZSA9IGRhdGEtPmZpbGU7CiAKLQlhcmcgPSBQeV9CdWlsZFZhbHVlKCIoT2kpIiwgZmlsZSwgKGxvbmcpIG1hc2spOwotCXJlcyA9IFB5RXZhbF9DYWxsT2JqZWN0KGZ1bmMsIGFyZyk7Ci0JUHlfREVDUkVGKGFyZyk7CisgICAgYXJnID0gUHlfQnVpbGRWYWx1ZSgiKE9pKSIsIGZpbGUsIChsb25nKSBtYXNrKTsKKyAgICByZXMgPSBQeUV2YWxfQ2FsbE9iamVjdChmdW5jLCBhcmcpOworICAgIFB5X0RFQ1JFRihhcmcpOwogCi0JaWYgKHJlcyA9PSBOVUxMKSB7Ci0JCWVycm9ySW5DbWQgPSAxOwotCQlQeUVycl9GZXRjaCgmZXhjSW5DbWQsICZ2YWxJbkNtZCwgJnRyYkluQ21kKTsKLQl9Ci0JUHlfWERFQ1JFRihyZXMpOwotCUxFQVZFX1BZVEhPTgorICAgIGlmIChyZXMgPT0gTlVMTCkgeworICAgICAgICBlcnJvckluQ21kID0gMTsKKyAgICAgICAgUHlFcnJfRmV0Y2goJmV4Y0luQ21kLCAmdmFsSW5DbWQsICZ0cmJJbkNtZCk7CisgICAgfQorICAgIFB5X1hERUNSRUYocmVzKTsKKyAgICBMRUFWRV9QWVRIT04KIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFRrYXBwX0NyZWF0ZUZpbGVIYW5kbGVyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKICAgICAgLyogYXJncyBpcyAoZmlsZSwgbWFzaywgZnVuYykgKi8KIHsKLQlGaWxlSGFuZGxlcl9DbGllbnREYXRhICpkYXRhOwotCVB5T2JqZWN0ICpmaWxlLCAqZnVuYzsKLQlpbnQgbWFzaywgdGZpbGU7CisgICAgRmlsZUhhbmRsZXJfQ2xpZW50RGF0YSAqZGF0YTsKKyAgICBQeU9iamVjdCAqZmlsZSwgKmZ1bmM7CisgICAgaW50IG1hc2ssIHRmaWxlOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPaU86Y3JlYXRlZmlsZWhhbmRsZXIiLAotCQkJICAgICAgJmZpbGUsICZtYXNrLCAmZnVuYykpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT2lPOmNyZWF0ZWZpbGVoYW5kbGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpbGUsICZtYXNrLCAmZnVuYykpCisgICAgICAgIHJldHVybiBOVUxMOwogCiAjaWZkZWYgV0lUSF9USFJFQUQKLQlpZiAoIXNlbGYgJiYgIXRjbF9sb2NrKSB7Ci0JCS8qIFdlIGRvbid0IGhhdmUgdGhlIFRjbCBsb2NrIHNpbmNlIFRjbCBpcyB0aHJlYWRlZC4gKi8KLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKLQkJCQkiX3RraW50ZXIuY3JlYXRlZmlsZWhhbmRsZXIgbm90IHN1cHBvcnRlZCAiCi0JCQkJImZvciB0aHJlYWRlZCBUY2wiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICghc2VsZiAmJiAhdGNsX2xvY2spIHsKKyAgICAgICAgLyogV2UgZG9uJ3QgaGF2ZSB0aGUgVGNsIGxvY2sgc2luY2UgVGNsIGlzIHRocmVhZGVkLiAqLworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIl90a2ludGVyLmNyZWF0ZWZpbGVoYW5kbGVyIG5vdCBzdXBwb3J0ZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgImZvciB0aHJlYWRlZCBUY2wiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogI2VuZGlmCiAKLQlpZiAoc2VsZikgewotCQlDSEVDS19UQ0xfQVBQQVJUTUVOVDsKLQl9CisgICAgaWYgKHNlbGYpIHsKKyAgICAgICAgQ0hFQ0tfVENMX0FQUEFSVE1FTlQ7CisgICAgfQogCi0JdGZpbGUgPSBQeU9iamVjdF9Bc0ZpbGVEZXNjcmlwdG9yKGZpbGUpOwotCWlmICh0ZmlsZSA8IDApCi0JCXJldHVybiBOVUxMOwotCWlmICghUHlDYWxsYWJsZV9DaGVjayhmdW5jKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYmFkIGFyZ3VtZW50IGxpc3QiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIHRmaWxlID0gUHlPYmplY3RfQXNGaWxlRGVzY3JpcHRvcihmaWxlKTsKKyAgICBpZiAodGZpbGUgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5Q2FsbGFibGVfQ2hlY2soZnVuYykpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImJhZCBhcmd1bWVudCBsaXN0Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWRhdGEgPSBOZXdGSENEKGZ1bmMsIGZpbGUsIHRmaWxlKTsKLQlpZiAoZGF0YSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBkYXRhID0gTmV3RkhDRChmdW5jLCBmaWxlLCB0ZmlsZSk7CisgICAgaWYgKGRhdGEgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkvKiBPdWdodCB0byBjaGVjayBmb3IgbnVsbCBUY2xfRmlsZSBvYmplY3QuLi4gKi8KLQlFTlRFUl9UQ0wKLQlUY2xfQ3JlYXRlRmlsZUhhbmRsZXIodGZpbGUsIG1hc2ssIEZpbGVIYW5kbGVyLCAoQ2xpZW50RGF0YSkgZGF0YSk7Ci0JTEVBVkVfVENMCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIC8qIE91Z2h0IHRvIGNoZWNrIGZvciBudWxsIFRjbF9GaWxlIG9iamVjdC4uLiAqLworICAgIEVOVEVSX1RDTAorICAgIFRjbF9DcmVhdGVGaWxlSGFuZGxlcih0ZmlsZSwgbWFzaywgRmlsZUhhbmRsZXIsIChDbGllbnREYXRhKSBkYXRhKTsKKyAgICBMRUFWRV9UQ0wKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBUa2FwcF9EZWxldGVGaWxlSGFuZGxlcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKmZpbGU7Ci0JaW50IHRmaWxlOworICAgIFB5T2JqZWN0ICpmaWxlOworICAgIGludCB0ZmlsZTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTzpkZWxldGVmaWxlaGFuZGxlciIsICZmaWxlKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPOmRlbGV0ZWZpbGVoYW5kbGVyIiwgJmZpbGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAogI2lmZGVmIFdJVEhfVEhSRUFECi0JaWYgKCFzZWxmICYmICF0Y2xfbG9jaykgewotCQkvKiBXZSBkb24ndCBoYXZlIHRoZSBUY2wgbG9jayBzaW5jZSBUY2wgaXMgdGhyZWFkZWQuICovCi0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCi0JCQkJIl90a2ludGVyLmRlbGV0ZWZpbGVoYW5kbGVyIG5vdCBzdXBwb3J0ZWQgIgotCQkJCSJmb3IgdGhyZWFkZWQgVGNsIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoIXNlbGYgJiYgIXRjbF9sb2NrKSB7CisgICAgICAgIC8qIFdlIGRvbid0IGhhdmUgdGhlIFRjbCBsb2NrIHNpbmNlIFRjbCBpcyB0aHJlYWRlZC4gKi8KKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJfdGtpbnRlci5kZWxldGVmaWxlaGFuZGxlciBub3Qgc3VwcG9ydGVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJmb3IgdGhyZWFkZWQgVGNsIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KICNlbmRpZgogCi0JaWYgKHNlbGYpIHsKLQkJQ0hFQ0tfVENMX0FQUEFSVE1FTlQ7Ci0JfQorICAgIGlmIChzZWxmKSB7CisgICAgICAgIENIRUNLX1RDTF9BUFBBUlRNRU5UOworICAgIH0KIAotCXRmaWxlID0gUHlPYmplY3RfQXNGaWxlRGVzY3JpcHRvcihmaWxlKTsKLQlpZiAodGZpbGUgPCAwKQotCQlyZXR1cm4gTlVMTDsKKyAgICB0ZmlsZSA9IFB5T2JqZWN0X0FzRmlsZURlc2NyaXB0b3IoZmlsZSk7CisgICAgaWYgKHRmaWxlIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlEZWxldGVGSENEKHRmaWxlKTsKKyAgICBEZWxldGVGSENEKHRmaWxlKTsKIAotCS8qIE91Z2h0IHRvIGNoZWNrIGZvciBudWxsIFRjbF9GaWxlIG9iamVjdC4uLiAqLwotCUVOVEVSX1RDTAotCVRjbF9EZWxldGVGaWxlSGFuZGxlcih0ZmlsZSk7Ci0JTEVBVkVfVENMCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIC8qIE91Z2h0IHRvIGNoZWNrIGZvciBudWxsIFRjbF9GaWxlIG9iamVjdC4uLiAqLworICAgIEVOVEVSX1RDTAorICAgIFRjbF9EZWxldGVGaWxlSGFuZGxlcih0ZmlsZSk7CisgICAgTEVBVkVfVENMCisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogI2VuZGlmIC8qIEhBVkVfQ1JFQVRFRklMRUhBTkRMRVIgKi8KIAotDAorCiAvKioqKiBUa3R0IE9iamVjdCAodGltZXIgdG9rZW4pICoqKiovCiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgVGt0dF9UeXBlOwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCVRjbF9UaW1lclRva2VuIHRva2VuOwotCVB5T2JqZWN0ICpmdW5jOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBUY2xfVGltZXJUb2tlbiB0b2tlbjsKKyAgICBQeU9iamVjdCAqZnVuYzsKIH0gVGt0dE9iamVjdDsKIAogc3RhdGljIFB5T2JqZWN0ICoKIFRrdHRfRGVsZXRlVGltZXJIYW5kbGVyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlUa3R0T2JqZWN0ICp2ID0gKFRrdHRPYmplY3QgKilzZWxmOwotCVB5T2JqZWN0ICpmdW5jID0gdi0+ZnVuYzsKKyAgICBUa3R0T2JqZWN0ICp2ID0gKFRrdHRPYmplY3QgKilzZWxmOworICAgIFB5T2JqZWN0ICpmdW5jID0gdi0+ZnVuYzsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOmRlbGV0ZXRpbWVyaGFuZGxlciIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAodi0+dG9rZW4gIT0gTlVMTCkgewotCQlUY2xfRGVsZXRlVGltZXJIYW5kbGVyKHYtPnRva2VuKTsKLQkJdi0+dG9rZW4gPSBOVUxMOwotCX0KLQlpZiAoZnVuYyAhPSBOVUxMKSB7Ci0JCXYtPmZ1bmMgPSBOVUxMOwotCQlQeV9ERUNSRUYoZnVuYyk7Ci0JCVB5X0RFQ1JFRih2KTsgLyogU2VlIFRrdHRfTmV3KCkgKi8KLQl9Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOmRlbGV0ZXRpbWVyaGFuZGxlciIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAodi0+dG9rZW4gIT0gTlVMTCkgeworICAgICAgICBUY2xfRGVsZXRlVGltZXJIYW5kbGVyKHYtPnRva2VuKTsKKyAgICAgICAgdi0+dG9rZW4gPSBOVUxMOworICAgIH0KKyAgICBpZiAoZnVuYyAhPSBOVUxMKSB7CisgICAgICAgIHYtPmZ1bmMgPSBOVUxMOworICAgICAgICBQeV9ERUNSRUYoZnVuYyk7CisgICAgICAgIFB5X0RFQ1JFRih2KTsgLyogU2VlIFRrdHRfTmV3KCkgKi8KKyAgICB9CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgVGt0dF9tZXRob2RzW10gPQogewotCXsiZGVsZXRldGltZXJoYW5kbGVyIiwgVGt0dF9EZWxldGVUaW1lckhhbmRsZXIsIE1FVEhfVkFSQVJHU30sCi0Je05VTEwsIE5VTEx9CisgICAgeyJkZWxldGV0aW1lcmhhbmRsZXIiLCBUa3R0X0RlbGV0ZVRpbWVySGFuZGxlciwgTUVUSF9WQVJBUkdTfSwKKyAgICB7TlVMTCwgTlVMTH0KIH07CiAKIHN0YXRpYyBUa3R0T2JqZWN0ICoKIFRrdHRfTmV3KFB5T2JqZWN0ICpmdW5jKQogewotCVRrdHRPYmplY3QgKnY7Ci0gIAotCXYgPSBQeU9iamVjdF9OZXcoVGt0dE9iamVjdCwgJlRrdHRfVHlwZSk7Ci0JaWYgKHYgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgVGt0dE9iamVjdCAqdjsKIAotCVB5X0lOQ1JFRihmdW5jKTsKLQl2LT50b2tlbiA9IE5VTEw7Ci0Jdi0+ZnVuYyA9IGZ1bmM7CisgICAgdiA9IFB5T2JqZWN0X05ldyhUa3R0T2JqZWN0LCAmVGt0dF9UeXBlKTsKKyAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCS8qIEV4dHJhIHJlZmVyZW5jZSwgZGVsZXRlZCB3aGVuIGNhbGxlZCBvciB3aGVuIGhhbmRsZXIgaXMgZGVsZXRlZCAqLwotCVB5X0lOQ1JFRih2KTsKLQlyZXR1cm4gdjsKKyAgICBQeV9JTkNSRUYoZnVuYyk7CisgICAgdi0+dG9rZW4gPSBOVUxMOworICAgIHYtPmZ1bmMgPSBmdW5jOworCisgICAgLyogRXh0cmEgcmVmZXJlbmNlLCBkZWxldGVkIHdoZW4gY2FsbGVkIG9yIHdoZW4gaGFuZGxlciBpcyBkZWxldGVkICovCisgICAgUHlfSU5DUkVGKHYpOworICAgIHJldHVybiB2OwogfQogCiBzdGF0aWMgdm9pZAogVGt0dF9EZWFsbG9jKFB5T2JqZWN0ICpzZWxmKQogewotCVRrdHRPYmplY3QgKnYgPSAoVGt0dE9iamVjdCAqKXNlbGY7Ci0JUHlPYmplY3QgKmZ1bmMgPSB2LT5mdW5jOworICAgIFRrdHRPYmplY3QgKnYgPSAoVGt0dE9iamVjdCAqKXNlbGY7CisgICAgUHlPYmplY3QgKmZ1bmMgPSB2LT5mdW5jOwogCi0JUHlfWERFQ1JFRihmdW5jKTsKKyAgICBQeV9YREVDUkVGKGZ1bmMpOwogCi0JUHlPYmplY3RfRGVsKHNlbGYpOworICAgIFB5T2JqZWN0X0RlbChzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFRrdHRfUmVwcihQeU9iamVjdCAqc2VsZikKIHsKLQlUa3R0T2JqZWN0ICp2ID0gKFRrdHRPYmplY3QgKilzZWxmOwotCWNoYXIgYnVmWzEwMF07CisgICAgVGt0dE9iamVjdCAqdiA9IChUa3R0T2JqZWN0ICopc2VsZjsKKyAgICBjaGFyIGJ1ZlsxMDBdOwogCi0JUHlPU19zbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiPHRrdGltZXJ0b2tlbiBhdCAlcCVzPiIsIHYsCi0JICAgICAgICAgICAgICAgIHYtPmZ1bmMgPT0gTlVMTCA/ICIsIGhhbmRsZXIgZGVsZXRlZCIgOiAiIik7Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmKTsKKyAgICBQeU9TX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICI8dGt0aW1lcnRva2VuIGF0ICVwJXM+IiwgdiwKKyAgICAgICAgICAgICAgICAgICAgdi0+ZnVuYyA9PSBOVUxMID8gIiwgaGFuZGxlciBkZWxldGVkIiA6ICIiKTsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogVGt0dF9HZXRBdHRyKFB5T2JqZWN0ICpzZWxmLCBjaGFyICpuYW1lKQogewotCXJldHVybiBQeV9GaW5kTWV0aG9kKFRrdHRfbWV0aG9kcywgc2VsZiwgbmFtZSk7CisgICAgcmV0dXJuIFB5X0ZpbmRNZXRob2QoVGt0dF9tZXRob2RzLCBzZWxmLCBuYW1lKTsKIH0KIAogc3RhdGljIFB5VHlwZU9iamVjdCBUa3R0X1R5cGUgPQogewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotCSJ0a3RpbWVydG9rZW4iLAkJCSAgICAgLyp0cF9uYW1lICovCi0Jc2l6ZW9mKFRrdHRPYmplY3QpLAkJICAgICAvKnRwX2Jhc2ljc2l6ZSAqLwotCTAsCQkJCSAgICAgLyp0cF9pdGVtc2l6ZSAqLwotCVRrdHRfRGVhbGxvYywJCQkgICAgIC8qdHBfZGVhbGxvYyAqLwotCTAsCQkJCSAgICAgLyp0cF9wcmludCAqLwotCVRrdHRfR2V0QXR0ciwJCQkgICAgIC8qdHBfZ2V0YXR0ciAqLwotCTAsCQkJCSAgICAgLyp0cF9zZXRhdHRyICovCi0JMCwJCQkJICAgICAvKnRwX2NvbXBhcmUgKi8KLQlUa3R0X1JlcHIsCQkJICAgICAvKnRwX3JlcHIgKi8KLQkwLAkJCQkgICAgIC8qdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJICAgICAvKnRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJICAgICAvKnRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkgICAgIC8qdHBfaGFzaCAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQorICAgICJ0a3RpbWVydG9rZW4iLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9uYW1lICovCisgICAgc2l6ZW9mKFRrdHRPYmplY3QpLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVtc2l6ZSAqLworICAgIFRrdHRfRGVhbGxvYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3ByaW50ICovCisgICAgVGt0dF9HZXRBdHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jb21wYXJlICovCisgICAgVGt0dF9SZXByLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaGFzaCAqLwogfTsKIAogCi0MCisKIC8qKiBUaW1lciBIYW5kbGVyICoqLwogCiBzdGF0aWMgdm9pZAogVGltZXJIYW5kbGVyKENsaWVudERhdGEgY2xpZW50RGF0YSkKIHsKLQlUa3R0T2JqZWN0ICp2ID0gKFRrdHRPYmplY3QgKiljbGllbnREYXRhOwotCVB5T2JqZWN0ICpmdW5jID0gdi0+ZnVuYzsKLQlQeU9iamVjdCAqcmVzOworICAgIFRrdHRPYmplY3QgKnYgPSAoVGt0dE9iamVjdCAqKWNsaWVudERhdGE7CisgICAgUHlPYmplY3QgKmZ1bmMgPSB2LT5mdW5jOworICAgIFB5T2JqZWN0ICpyZXM7CiAKLQlpZiAoZnVuYyA9PSBOVUxMKQotCQlyZXR1cm47CisgICAgaWYgKGZ1bmMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOwogCi0Jdi0+ZnVuYyA9IE5VTEw7CisgICAgdi0+ZnVuYyA9IE5VTEw7CiAKLQlFTlRFUl9QWVRIT04KKyAgICBFTlRFUl9QWVRIT04KIAotCXJlcyAgPSBQeUV2YWxfQ2FsbE9iamVjdChmdW5jLCBOVUxMKTsKLQlQeV9ERUNSRUYoZnVuYyk7Ci0JUHlfREVDUkVGKHYpOyAvKiBTZWUgVGt0dF9OZXcoKSAqLworICAgIHJlcyAgPSBQeUV2YWxfQ2FsbE9iamVjdChmdW5jLCBOVUxMKTsKKyAgICBQeV9ERUNSRUYoZnVuYyk7CisgICAgUHlfREVDUkVGKHYpOyAvKiBTZWUgVGt0dF9OZXcoKSAqLwogCi0JaWYgKHJlcyA9PSBOVUxMKSB7Ci0JCWVycm9ySW5DbWQgPSAxOwotCQlQeUVycl9GZXRjaCgmZXhjSW5DbWQsICZ2YWxJbkNtZCwgJnRyYkluQ21kKTsKLQl9Ci0JZWxzZQotCQlQeV9ERUNSRUYocmVzKTsKKyAgICBpZiAocmVzID09IE5VTEwpIHsKKyAgICAgICAgZXJyb3JJbkNtZCA9IDE7CisgICAgICAgIFB5RXJyX0ZldGNoKCZleGNJbkNtZCwgJnZhbEluQ21kLCAmdHJiSW5DbWQpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIFB5X0RFQ1JFRihyZXMpOwogCi0JTEVBVkVfUFlUSE9OCisgICAgTEVBVkVfUFlUSE9OCiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBUa2FwcF9DcmVhdGVUaW1lckhhbmRsZXIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBtaWxsaXNlY29uZHM7Ci0JUHlPYmplY3QgKmZ1bmM7Ci0JVGt0dE9iamVjdCAqdjsKKyAgICBpbnQgbWlsbGlzZWNvbmRzOworICAgIFB5T2JqZWN0ICpmdW5jOworICAgIFRrdHRPYmplY3QgKnY7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlPOmNyZWF0ZXRpbWVyaGFuZGxlciIsCi0JCQkgICAgICAmbWlsbGlzZWNvbmRzLCAmZnVuYykpCi0JCXJldHVybiBOVUxMOwotCWlmICghUHlDYWxsYWJsZV9DaGVjayhmdW5jKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYmFkIGFyZ3VtZW50IGxpc3QiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaU86Y3JlYXRldGltZXJoYW5kbGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1pbGxpc2Vjb25kcywgJmZ1bmMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5Q2FsbGFibGVfQ2hlY2soZnVuYykpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImJhZCBhcmd1bWVudCBsaXN0Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAogI2lmZGVmIFdJVEhfVEhSRUFECi0JaWYgKCFzZWxmICYmICF0Y2xfbG9jaykgewotCQkvKiBXZSBkb24ndCBoYXZlIHRoZSBUY2wgbG9jayBzaW5jZSBUY2wgaXMgdGhyZWFkZWQuICovCi0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCi0JCQkJIl90a2ludGVyLmNyZWF0ZXRpbWVyaGFuZGxlciBub3Qgc3VwcG9ydGVkICIKLQkJCQkiZm9yIHRocmVhZGVkIFRjbCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKCFzZWxmICYmICF0Y2xfbG9jaykgeworICAgICAgICAvKiBXZSBkb24ndCBoYXZlIHRoZSBUY2wgbG9jayBzaW5jZSBUY2wgaXMgdGhyZWFkZWQuICovCisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiX3RraW50ZXIuY3JlYXRldGltZXJoYW5kbGVyIG5vdCBzdXBwb3J0ZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgImZvciB0aHJlYWRlZCBUY2wiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogI2VuZGlmCiAKLQlpZiAoc2VsZikgewotCQlDSEVDS19UQ0xfQVBQQVJUTUVOVDsKLQl9CisgICAgaWYgKHNlbGYpIHsKKyAgICAgICAgQ0hFQ0tfVENMX0FQUEFSVE1FTlQ7CisgICAgfQogCi0JdiA9IFRrdHRfTmV3KGZ1bmMpOwotCWlmICh2KSB7Ci0JCXYtPnRva2VuID0gVGNsX0NyZWF0ZVRpbWVySGFuZGxlcihtaWxsaXNlY29uZHMsIFRpbWVySGFuZGxlciwKLQkJCQkJCSAgKENsaWVudERhdGEpdik7Ci0JfQorICAgIHYgPSBUa3R0X05ldyhmdW5jKTsKKyAgICBpZiAodikgeworICAgICAgICB2LT50b2tlbiA9IFRjbF9DcmVhdGVUaW1lckhhbmRsZXIobWlsbGlzZWNvbmRzLCBUaW1lckhhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ2xpZW50RGF0YSl2KTsKKyAgICB9CiAKLQlyZXR1cm4gKFB5T2JqZWN0ICopIHY7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKSB2OwogfQogCi0MCisKIC8qKiBFdmVudCBMb29wICoqLwogCiBzdGF0aWMgUHlPYmplY3QgKgogVGthcHBfTWFpbkxvb3AoUHlPYmplY3QgKnNlbGZwdHIsIFB5T2JqZWN0ICphcmdzKQogewotCWludCB0aHJlc2hvbGQgPSAwOwotCVRrYXBwT2JqZWN0ICpzZWxmID0gKFRrYXBwT2JqZWN0KilzZWxmcHRyOworICAgIGludCB0aHJlc2hvbGQgPSAwOworICAgIFRrYXBwT2JqZWN0ICpzZWxmID0gKFRrYXBwT2JqZWN0KilzZWxmcHRyOwogI2lmZGVmIFdJVEhfVEhSRUFECi0JUHlUaHJlYWRTdGF0ZSAqdHN0YXRlID0gUHlUaHJlYWRTdGF0ZV9HZXQoKTsKKyAgICBQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dldCgpOwogI2VuZGlmCiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxpOm1haW5sb29wIiwgJnRocmVzaG9sZCkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifGk6bWFpbmxvb3AiLCAmdGhyZXNob2xkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKICNpZmRlZiBXSVRIX1RIUkVBRAotCWlmICghc2VsZiAmJiAhdGNsX2xvY2spIHsKLQkJLyogV2UgZG9uJ3QgaGF2ZSB0aGUgVGNsIGxvY2sgc2luY2UgVGNsIGlzIHRocmVhZGVkLiAqLwotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAotCQkJCSJfdGtpbnRlci5tYWlubG9vcCBub3Qgc3VwcG9ydGVkICIKLQkJCQkiZm9yIHRocmVhZGVkIFRjbCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKCFzZWxmICYmICF0Y2xfbG9jaykgeworICAgICAgICAvKiBXZSBkb24ndCBoYXZlIHRoZSBUY2wgbG9jayBzaW5jZSBUY2wgaXMgdGhyZWFkZWQuICovCisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiX3RraW50ZXIubWFpbmxvb3Agbm90IHN1cHBvcnRlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAiZm9yIHRocmVhZGVkIFRjbCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAjZW5kaWYKIAotCWlmIChzZWxmKSB7Ci0JCUNIRUNLX1RDTF9BUFBBUlRNRU5UOwotCQlzZWxmLT5kaXNwYXRjaGluZyA9IDE7Ci0JfQorICAgIGlmIChzZWxmKSB7CisgICAgICAgIENIRUNLX1RDTF9BUFBBUlRNRU5UOworICAgICAgICBzZWxmLT5kaXNwYXRjaGluZyA9IDE7CisgICAgfQogCi0JcXVpdE1haW5Mb29wID0gMDsKLQl3aGlsZSAoVGtfR2V0TnVtTWFpbldpbmRvd3MoKSA+IHRocmVzaG9sZCAmJgotCSAgICAgICAhcXVpdE1haW5Mb29wICYmCi0JICAgICAgICFlcnJvckluQ21kKQotCXsKLQkJaW50IHJlc3VsdDsKKyAgICBxdWl0TWFpbkxvb3AgPSAwOworICAgIHdoaWxlIChUa19HZXROdW1NYWluV2luZG93cygpID4gdGhyZXNob2xkICYmCisgICAgICAgICAgICFxdWl0TWFpbkxvb3AgJiYKKyAgICAgICAgICAgIWVycm9ySW5DbWQpCisgICAgeworICAgICAgICBpbnQgcmVzdWx0OwogCiAjaWZkZWYgV0lUSF9USFJFQUQKLQkJaWYgKHNlbGYgJiYgc2VsZi0+dGhyZWFkZWQpIHsKLQkJCS8qIEFsbG93IG90aGVyIFB5dGhvbiB0aHJlYWRzIHRvIHJ1bi4gKi8KLQkJCUVOVEVSX1RDTAotCQkJcmVzdWx0ID0gVGNsX0RvT25lRXZlbnQoMCk7Ci0JCQlMRUFWRV9UQ0wKLQkJfQotCQllbHNlIHsKLQkJCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQkJCWlmKHRjbF9sb2NrKVB5VGhyZWFkX2FjcXVpcmVfbG9jayh0Y2xfbG9jaywgMSk7Ci0JCQl0Y2xfdHN0YXRlID0gdHN0YXRlOwotCQkJcmVzdWx0ID0gVGNsX0RvT25lRXZlbnQoVENMX0RPTlRfV0FJVCk7Ci0JCQl0Y2xfdHN0YXRlID0gTlVMTDsKLQkJCWlmKHRjbF9sb2NrKVB5VGhyZWFkX3JlbGVhc2VfbG9jayh0Y2xfbG9jayk7Ci0JCQlpZiAocmVzdWx0ID09IDApCi0JCQkJU2xlZXAoVGtpbnRlcl9idXN5d2FpdGludGVydmFsKTsKLQkJCVB5X0VORF9BTExPV19USFJFQURTCi0JCX0KKyAgICAgICAgaWYgKHNlbGYgJiYgc2VsZi0+dGhyZWFkZWQpIHsKKyAgICAgICAgICAgIC8qIEFsbG93IG90aGVyIFB5dGhvbiB0aHJlYWRzIHRvIHJ1bi4gKi8KKyAgICAgICAgICAgIEVOVEVSX1RDTAorICAgICAgICAgICAgcmVzdWx0ID0gVGNsX0RvT25lRXZlbnQoMCk7CisgICAgICAgICAgICBMRUFWRV9UQ0wKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgICAgIGlmKHRjbF9sb2NrKVB5VGhyZWFkX2FjcXVpcmVfbG9jayh0Y2xfbG9jaywgMSk7CisgICAgICAgICAgICB0Y2xfdHN0YXRlID0gdHN0YXRlOworICAgICAgICAgICAgcmVzdWx0ID0gVGNsX0RvT25lRXZlbnQoVENMX0RPTlRfV0FJVCk7CisgICAgICAgICAgICB0Y2xfdHN0YXRlID0gTlVMTDsKKyAgICAgICAgICAgIGlmKHRjbF9sb2NrKVB5VGhyZWFkX3JlbGVhc2VfbG9jayh0Y2xfbG9jayk7CisgICAgICAgICAgICBpZiAocmVzdWx0ID09IDApCisgICAgICAgICAgICAgICAgU2xlZXAoVGtpbnRlcl9idXN5d2FpdGludGVydmFsKTsKKyAgICAgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgICAgIH0KICNlbHNlCi0JCXJlc3VsdCA9IFRjbF9Eb09uZUV2ZW50KDApOworICAgICAgICByZXN1bHQgPSBUY2xfRG9PbmVFdmVudCgwKTsKICNlbmRpZgogCi0JCWlmIChQeUVycl9DaGVja1NpZ25hbHMoKSAhPSAwKSB7Ci0JCQlpZiAoc2VsZikKLQkJCQlzZWxmLT5kaXNwYXRjaGluZyA9IDA7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlpZiAocmVzdWx0IDwgMCkKLQkJCWJyZWFrOwotCX0KLQlpZiAoc2VsZikKLQkJc2VsZi0+ZGlzcGF0Y2hpbmcgPSAwOwotCXF1aXRNYWluTG9vcCA9IDA7CisgICAgICAgIGlmIChQeUVycl9DaGVja1NpZ25hbHMoKSAhPSAwKSB7CisgICAgICAgICAgICBpZiAoc2VsZikKKyAgICAgICAgICAgICAgICBzZWxmLT5kaXNwYXRjaGluZyA9IDA7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAocmVzdWx0IDwgMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoc2VsZikKKyAgICAgICAgc2VsZi0+ZGlzcGF0Y2hpbmcgPSAwOworICAgIHF1aXRNYWluTG9vcCA9IDA7CiAKLQlpZiAoZXJyb3JJbkNtZCkgewotCQllcnJvckluQ21kID0gMDsKLQkJUHlFcnJfUmVzdG9yZShleGNJbkNtZCwgdmFsSW5DbWQsIHRyYkluQ21kKTsKLQkJZXhjSW5DbWQgPSB2YWxJbkNtZCA9IHRyYkluQ21kID0gTlVMTDsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAoZXJyb3JJbkNtZCkgeworICAgICAgICBlcnJvckluQ21kID0gMDsKKyAgICAgICAgUHlFcnJfUmVzdG9yZShleGNJbkNtZCwgdmFsSW5DbWQsIHRyYkluQ21kKTsKKyAgICAgICAgZXhjSW5DbWQgPSB2YWxJbkNtZCA9IHRyYkluQ21kID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFRrYXBwX0RvT25lRXZlbnQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBmbGFncyA9IDA7Ci0JaW50IHJ2OworICAgIGludCBmbGFncyA9IDA7CisgICAgaW50IHJ2OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8aTpkb29uZWV2ZW50IiwgJmZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8aTpkb29uZWV2ZW50IiwgJmZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlFTlRFUl9UQ0wKLQlydiA9IFRjbF9Eb09uZUV2ZW50KGZsYWdzKTsKLQlMRUFWRV9UQ0wKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIHJ2KTsKKyAgICBFTlRFUl9UQ0wKKyAgICBydiA9IFRjbF9Eb09uZUV2ZW50KGZsYWdzKTsKKyAgICBMRUFWRV9UQ0wKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIHJ2KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFRrYXBwX1F1aXQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6cXVpdCIpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpxdWl0IikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JcXVpdE1haW5Mb29wID0gMTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgcXVpdE1haW5Mb29wID0gMTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBUa2FwcF9JbnRlcnBBZGRyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOmludGVycGFkZHIiKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6aW50ZXJwYWRkciIpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZylUa2FwcF9JbnRlcnAoc2VsZikpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZylUa2FwcF9JbnRlcnAoc2VsZikpOwogfQogCi1zdGF0aWMgUHlPYmplY3QJKgorc3RhdGljIFB5T2JqZWN0ICoKIFRrYXBwX1RrSW5pdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc3RhdGljIGludCBoYXNfZmFpbGVkOwotCVRjbF9JbnRlcnAgKmludGVycCA9IFRrYXBwX0ludGVycChzZWxmKTsKLQlUa19XaW5kb3cgbWFpbl93aW5kb3c7Ci0JY29uc3QgY2hhciAqIF90a19leGlzdHMgPSBOVUxMOwotCWludCBlcnI7Ci0JbWFpbl93aW5kb3cgPSBUa19NYWluV2luZG93KGludGVycCk7CisgICAgc3RhdGljIGludCBoYXNfZmFpbGVkOworICAgIFRjbF9JbnRlcnAgKmludGVycCA9IFRrYXBwX0ludGVycChzZWxmKTsKKyAgICBUa19XaW5kb3cgbWFpbl93aW5kb3c7CisgICAgY29uc3QgY2hhciAqIF90a19leGlzdHMgPSBOVUxMOworICAgIGludCBlcnI7CisgICAgbWFpbl93aW5kb3cgPSBUa19NYWluV2luZG93KGludGVycCk7CiAKLQkvKiBJbiBhbGwgY3VycmVudCB2ZXJzaW9ucyBvZiBUayAoaW5jbHVkaW5nIDguNC4xMyksIFRrX0luaXQKLQkgICBkZWFkbG9ja3Mgb24gdGhlIHNlY29uZCBjYWxsIHdoZW4gdGhlIGZpcnN0IGNhbGwgZmFpbGVkLgotCSAgIFRvIGF2b2lkIHRoZSBkZWFkbG9jaywgd2UganVzdCByZWZ1c2UgdGhlIHNlY29uZCBjYWxsIHRocm91Z2gKLQkgICBhIHN0YXRpYyB2YXJpYWJsZS4gKi8KLQlpZiAoaGFzX2ZhaWxlZCkgewotCQlQeUVycl9TZXRTdHJpbmcoVGtpbnRlcl9UY2xFcnJvciwgCi0JCQkJIkNhbGxpbmcgVGtfSW5pdCBhZ2FpbiBhZnRlciBhIHByZXZpb3VzIGNhbGwgZmFpbGVkIG1pZ2h0IGRlYWRsb2NrIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQkgICAKLQkvKiBXZSB3YW50IHRvIGd1YXJkIGFnYWluc3QgY2FsbGluZyBUa19Jbml0KCkgbXVsdGlwbGUgdGltZXMgKi8KLQlDSEVDS19UQ0xfQVBQQVJUTUVOVDsKLQlFTlRFUl9UQ0wKLQllcnIgPSBUY2xfRXZhbChUa2FwcF9JbnRlcnAoc2VsZiksICJpbmZvIGV4aXN0cwl0a192ZXJzaW9uIik7Ci0JRU5URVJfT1ZFUkxBUAotCWlmIChlcnIgPT0gVENMX0VSUk9SKSB7Ci0JCS8qIFRoaXMgc2V0cyBhbiBleGNlcHRpb24sIGJ1dCB3ZSBjYW5ub3QgcmV0dXJuIHJpZ2h0Ci0JCSAgIGF3YXkgYmVjYXVzZSB3ZSBuZWVkIHRvIGV4aXQgdGhlIG92ZXJsYXAgZmlyc3QuICovCi0JCVRraW50ZXJfRXJyb3Ioc2VsZik7Ci0JfSBlbHNlIHsKLQkJX3RrX2V4aXN0cyA9IFRrYXBwX1Jlc3VsdChzZWxmKTsKLQl9Ci0JTEVBVkVfT1ZFUkxBUF9UQ0wKLQlpZiAoZXJyID09IFRDTF9FUlJPUikgewotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKF90a19leGlzdHMgPT0gTlVMTCB8fCBzdHJjbXAoX3RrX2V4aXN0cywgIjEiKSAhPSAwKQl7Ci0JCWlmIChUa19Jbml0KGludGVycCkJPT0gVENMX0VSUk9SKSB7Ci0JCSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFRraW50ZXJfVGNsRXJyb3IsIFRjbF9HZXRTdHJpbmdSZXN1bHQoVGthcHBfSW50ZXJwKHNlbGYpKSk7Ci0JCQloYXNfZmFpbGVkID0gMTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICAvKiBJbiBhbGwgY3VycmVudCB2ZXJzaW9ucyBvZiBUayAoaW5jbHVkaW5nIDguNC4xMyksIFRrX0luaXQKKyAgICAgICBkZWFkbG9ja3Mgb24gdGhlIHNlY29uZCBjYWxsIHdoZW4gdGhlIGZpcnN0IGNhbGwgZmFpbGVkLgorICAgICAgIFRvIGF2b2lkIHRoZSBkZWFkbG9jaywgd2UganVzdCByZWZ1c2UgdGhlIHNlY29uZCBjYWxsIHRocm91Z2gKKyAgICAgICBhIHN0YXRpYyB2YXJpYWJsZS4gKi8KKyAgICBpZiAoaGFzX2ZhaWxlZCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoVGtpbnRlcl9UY2xFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJDYWxsaW5nIFRrX0luaXQgYWdhaW4gYWZ0ZXIgYSBwcmV2aW91cyBjYWxsIGZhaWxlZCBtaWdodCBkZWFkbG9jayIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAvKiBXZSB3YW50IHRvIGd1YXJkIGFnYWluc3QgY2FsbGluZyBUa19Jbml0KCkgbXVsdGlwbGUgdGltZXMgKi8KKyAgICBDSEVDS19UQ0xfQVBQQVJUTUVOVDsKKyAgICBFTlRFUl9UQ0wKKyAgICBlcnIgPSBUY2xfRXZhbChUa2FwcF9JbnRlcnAoc2VsZiksICJpbmZvIGV4aXN0cyAgICAgdGtfdmVyc2lvbiIpOworICAgIEVOVEVSX09WRVJMQVAKKyAgICBpZiAoZXJyID09IFRDTF9FUlJPUikgeworICAgICAgICAvKiBUaGlzIHNldHMgYW4gZXhjZXB0aW9uLCBidXQgd2UgY2Fubm90IHJldHVybiByaWdodAorICAgICAgICAgICBhd2F5IGJlY2F1c2Ugd2UgbmVlZCB0byBleGl0IHRoZSBvdmVybGFwIGZpcnN0LiAqLworICAgICAgICBUa2ludGVyX0Vycm9yKHNlbGYpOworICAgIH0gZWxzZSB7CisgICAgICAgIF90a19leGlzdHMgPSBUa2FwcF9SZXN1bHQoc2VsZik7CisgICAgfQorICAgIExFQVZFX09WRVJMQVBfVENMCisgICAgaWYgKGVyciA9PSBUQ0xfRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChfdGtfZXhpc3RzID09IE5VTEwgfHwgc3RyY21wKF90a19leGlzdHMsICIxIikgIT0gMCkgICAgIHsKKyAgICAgICAgaWYgKFRrX0luaXQoaW50ZXJwKSAgICAgICAgICAgICA9PSBUQ0xfRVJST1IpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhUa2ludGVyX1RjbEVycm9yLCBUY2xfR2V0U3RyaW5nUmVzdWx0KFRrYXBwX0ludGVycChzZWxmKSkpOworICAgICAgICAgICAgaGFzX2ZhaWxlZCA9IDE7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBUa2FwcF9XYW50T2JqZWN0cyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7CiAKLQlpbnQgd2FudG9iamVjdHMgPSAtMTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxpOndhbnRvYmplY3RzIiwgJndhbnRvYmplY3RzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKHdhbnRvYmplY3RzID09IC0xKQotCQlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKCgoVGthcHBPYmplY3QqKXNlbGYpLT53YW50b2JqZWN0cyk7Ci0JKChUa2FwcE9iamVjdCopc2VsZiktPndhbnRvYmplY3RzID0gd2FudG9iamVjdHM7CisgICAgaW50IHdhbnRvYmplY3RzID0gLTE7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8aTp3YW50b2JqZWN0cyIsICZ3YW50b2JqZWN0cykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICh3YW50b2JqZWN0cyA9PSAtMSkKKyAgICAgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygoKFRrYXBwT2JqZWN0KilzZWxmKS0+d2FudG9iamVjdHMpOworICAgICgoVGthcHBPYmplY3QqKXNlbGYpLT53YW50b2JqZWN0cyA9IHdhbnRvYmplY3RzOwogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFRrYXBwX1dpbGxEaXNwYXRjaChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7CiAKLQkoKFRrYXBwT2JqZWN0KilzZWxmKS0+ZGlzcGF0Y2hpbmcgPSAxOworICAgICgoVGthcHBPYmplY3QqKXNlbGYpLT5kaXNwYXRjaGluZyA9IDE7CiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCi0MCisKIC8qKioqIFRrYXBwIE1ldGhvZCBMaXN0ICoqKiovCiAKIHN0YXRpYyBQeU1ldGhvZERlZiBUa2FwcF9tZXRob2RzW10gPQogewotCXsid2lsbGRpc3BhdGNoIiwgICAgICAgVGthcHBfV2lsbERpc3BhdGNoLCBNRVRIX05PQVJHU30sCi0JeyJ3YW50b2JqZWN0cyIsCSAgICAgICBUa2FwcF9XYW50T2JqZWN0cywgTUVUSF9WQVJBUkdTfSwKLQl7ImNhbGwiLCAJICAgICAgIFRrYXBwX0NhbGwsIE1FVEhfVkFSQVJHU30sCi0JeyJnbG9iYWxjYWxsIiwgCSAgICAgICBUa2FwcF9HbG9iYWxDYWxsLCBNRVRIX1ZBUkFSR1N9LAotCXsiZXZhbCIsIAkgICAgICAgVGthcHBfRXZhbCwgTUVUSF9WQVJBUkdTfSwKLQl7Imdsb2JhbGV2YWwiLCAJICAgICAgIFRrYXBwX0dsb2JhbEV2YWwsIE1FVEhfVkFSQVJHU30sCi0JeyJldmFsZmlsZSIsIAkgICAgICAgVGthcHBfRXZhbEZpbGUsIE1FVEhfVkFSQVJHU30sCi0JeyJyZWNvcmQiLCAJICAgICAgIFRrYXBwX1JlY29yZCwgTUVUSF9WQVJBUkdTfSwKLQl7ImFkZGVycm9yaW5mbyIsICAgICAgIFRrYXBwX0FkZEVycm9ySW5mbywgTUVUSF9WQVJBUkdTfSwKLQl7InNldHZhciIsIAkgICAgICAgVGthcHBfU2V0VmFyLCBNRVRIX1ZBUkFSR1N9LAotCXsiZ2xvYmFsc2V0dmFyIiwgICAgICAgVGthcHBfR2xvYmFsU2V0VmFyLCBNRVRIX1ZBUkFSR1N9LAotCXsiZ2V0dmFyIiwgCSAgICAgICBUa2FwcF9HZXRWYXIsIE1FVEhfVkFSQVJHU30sCi0JeyJnbG9iYWxnZXR2YXIiLCAgICAgICBUa2FwcF9HbG9iYWxHZXRWYXIsIE1FVEhfVkFSQVJHU30sCi0JeyJ1bnNldHZhciIsIAkgICAgICAgVGthcHBfVW5zZXRWYXIsIE1FVEhfVkFSQVJHU30sCi0JeyJnbG9iYWx1bnNldHZhciIsICAgICBUa2FwcF9HbG9iYWxVbnNldFZhciwgTUVUSF9WQVJBUkdTfSwKLQl7ImdldGludCIsIAkgICAgICAgVGthcHBfR2V0SW50LCBNRVRIX1ZBUkFSR1N9LAotCXsiZ2V0ZG91YmxlIiwgCSAgICAgICBUa2FwcF9HZXREb3VibGUsIE1FVEhfVkFSQVJHU30sCi0JeyJnZXRib29sZWFuIiwgCSAgICAgICBUa2FwcF9HZXRCb29sZWFuLCBNRVRIX1ZBUkFSR1N9LAotCXsiZXhwcnN0cmluZyIsIAkgICAgICAgVGthcHBfRXhwclN0cmluZywgTUVUSF9WQVJBUkdTfSwKLQl7ImV4cHJsb25nIiwgCSAgICAgICBUa2FwcF9FeHByTG9uZywgTUVUSF9WQVJBUkdTfSwKLQl7ImV4cHJkb3VibGUiLCAJICAgICAgIFRrYXBwX0V4cHJEb3VibGUsIE1FVEhfVkFSQVJHU30sCi0JeyJleHByYm9vbGVhbiIsICAgICAgICBUa2FwcF9FeHByQm9vbGVhbiwgTUVUSF9WQVJBUkdTfSwKLQl7InNwbGl0bGlzdCIsIAkgICAgICAgVGthcHBfU3BsaXRMaXN0LCBNRVRIX1ZBUkFSR1N9LAotCXsic3BsaXQiLCAJICAgICAgIFRrYXBwX1NwbGl0LCBNRVRIX1ZBUkFSR1N9LAotCXsibWVyZ2UiLCAJICAgICAgIFRrYXBwX01lcmdlLCBNRVRIX1ZBUkFSR1N9LAotCXsiY3JlYXRlY29tbWFuZCIsICAgICAgVGthcHBfQ3JlYXRlQ29tbWFuZCwgTUVUSF9WQVJBUkdTfSwKLQl7ImRlbGV0ZWNvbW1hbmQiLCAgICAgIFRrYXBwX0RlbGV0ZUNvbW1hbmQsIE1FVEhfVkFSQVJHU30sCisgICAgeyJ3aWxsZGlzcGF0Y2giLCAgICAgICBUa2FwcF9XaWxsRGlzcGF0Y2gsIE1FVEhfTk9BUkdTfSwKKyAgICB7IndhbnRvYmplY3RzIiwgICAgICAgICAgICBUa2FwcF9XYW50T2JqZWN0cywgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImNhbGwiLCAgICAgICAgICAgICAgICAgICBUa2FwcF9DYWxsLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsiZ2xvYmFsY2FsbCIsICAgICAgICAgICAgIFRrYXBwX0dsb2JhbENhbGwsIE1FVEhfVkFSQVJHU30sCisgICAgeyJldmFsIiwgICAgICAgICAgICAgICAgICAgVGthcHBfRXZhbCwgTUVUSF9WQVJBUkdTfSwKKyAgICB7Imdsb2JhbGV2YWwiLCAgICAgICAgICAgICBUa2FwcF9HbG9iYWxFdmFsLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsiZXZhbGZpbGUiLCAgICAgICAgICAgICAgIFRrYXBwX0V2YWxGaWxlLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsicmVjb3JkIiwgICAgICAgICAgICAgICAgIFRrYXBwX1JlY29yZCwgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImFkZGVycm9yaW5mbyIsICAgICAgIFRrYXBwX0FkZEVycm9ySW5mbywgTUVUSF9WQVJBUkdTfSwKKyAgICB7InNldHZhciIsICAgICAgICAgICAgICAgICBUa2FwcF9TZXRWYXIsIE1FVEhfVkFSQVJHU30sCisgICAgeyJnbG9iYWxzZXR2YXIiLCAgICAgICBUa2FwcF9HbG9iYWxTZXRWYXIsIE1FVEhfVkFSQVJHU30sCisgICAgeyJnZXR2YXIiLCAgICAgICAgICAgICAgICAgVGthcHBfR2V0VmFyLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsiZ2xvYmFsZ2V0dmFyIiwgICAgICAgVGthcHBfR2xvYmFsR2V0VmFyLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsidW5zZXR2YXIiLCAgICAgICAgICAgICAgIFRrYXBwX1Vuc2V0VmFyLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsiZ2xvYmFsdW5zZXR2YXIiLCAgICAgVGthcHBfR2xvYmFsVW5zZXRWYXIsIE1FVEhfVkFSQVJHU30sCisgICAgeyJnZXRpbnQiLCAgICAgICAgICAgICAgICAgVGthcHBfR2V0SW50LCBNRVRIX1ZBUkFSR1N9LAorICAgIHsiZ2V0ZG91YmxlIiwgICAgICAgICAgICAgIFRrYXBwX0dldERvdWJsZSwgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImdldGJvb2xlYW4iLCAgICAgICAgICAgICBUa2FwcF9HZXRCb29sZWFuLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsiZXhwcnN0cmluZyIsICAgICAgICAgICAgIFRrYXBwX0V4cHJTdHJpbmcsIE1FVEhfVkFSQVJHU30sCisgICAgeyJleHBybG9uZyIsICAgICAgICAgICAgICAgVGthcHBfRXhwckxvbmcsIE1FVEhfVkFSQVJHU30sCisgICAgeyJleHByZG91YmxlIiwgICAgICAgICAgICAgVGthcHBfRXhwckRvdWJsZSwgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImV4cHJib29sZWFuIiwgICAgICAgIFRrYXBwX0V4cHJCb29sZWFuLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsic3BsaXRsaXN0IiwgICAgICAgICAgICAgIFRrYXBwX1NwbGl0TGlzdCwgTUVUSF9WQVJBUkdTfSwKKyAgICB7InNwbGl0IiwgICAgICAgICAgICAgICAgICBUa2FwcF9TcGxpdCwgTUVUSF9WQVJBUkdTfSwKKyAgICB7Im1lcmdlIiwgICAgICAgICAgICAgICAgICBUa2FwcF9NZXJnZSwgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImNyZWF0ZWNvbW1hbmQiLCAgICAgIFRrYXBwX0NyZWF0ZUNvbW1hbmQsIE1FVEhfVkFSQVJHU30sCisgICAgeyJkZWxldGVjb21tYW5kIiwgICAgICBUa2FwcF9EZWxldGVDb21tYW5kLCBNRVRIX1ZBUkFSR1N9LAogI2lmZGVmIEhBVkVfQ1JFQVRFRklMRUhBTkRMRVIKLQl7ImNyZWF0ZWZpbGVoYW5kbGVyIiwgIFRrYXBwX0NyZWF0ZUZpbGVIYW5kbGVyLCBNRVRIX1ZBUkFSR1N9LAotCXsiZGVsZXRlZmlsZWhhbmRsZXIiLCAgVGthcHBfRGVsZXRlRmlsZUhhbmRsZXIsIE1FVEhfVkFSQVJHU30sCisgICAgeyJjcmVhdGVmaWxlaGFuZGxlciIsICBUa2FwcF9DcmVhdGVGaWxlSGFuZGxlciwgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImRlbGV0ZWZpbGVoYW5kbGVyIiwgIFRrYXBwX0RlbGV0ZUZpbGVIYW5kbGVyLCBNRVRIX1ZBUkFSR1N9LAogI2VuZGlmCi0JeyJjcmVhdGV0aW1lcmhhbmRsZXIiLCBUa2FwcF9DcmVhdGVUaW1lckhhbmRsZXIsIE1FVEhfVkFSQVJHU30sCi0JeyJtYWlubG9vcCIsIAkgICAgICAgVGthcHBfTWFpbkxvb3AsIE1FVEhfVkFSQVJHU30sCi0JeyJkb29uZWV2ZW50IiwgCSAgICAgICBUa2FwcF9Eb09uZUV2ZW50LCBNRVRIX1ZBUkFSR1N9LAotCXsicXVpdCIsIAkgICAgICAgVGthcHBfUXVpdCwgTUVUSF9WQVJBUkdTfSwKLQl7ImludGVycGFkZHIiLCAgICAgICAgIFRrYXBwX0ludGVycEFkZHIsIE1FVEhfVkFSQVJHU30sCi0JeyJsb2FkdGsiLAkgICAgICAgVGthcHBfVGtJbml0LCBNRVRIX05PQVJHU30sCi0Je05VTEwsIAkJICAgICAgIE5VTEx9CisgICAgeyJjcmVhdGV0aW1lcmhhbmRsZXIiLCBUa2FwcF9DcmVhdGVUaW1lckhhbmRsZXIsIE1FVEhfVkFSQVJHU30sCisgICAgeyJtYWlubG9vcCIsICAgICAgICAgICAgICAgVGthcHBfTWFpbkxvb3AsIE1FVEhfVkFSQVJHU30sCisgICAgeyJkb29uZWV2ZW50IiwgICAgICAgICAgICAgVGthcHBfRG9PbmVFdmVudCwgTUVUSF9WQVJBUkdTfSwKKyAgICB7InF1aXQiLCAgICAgICAgICAgICAgICAgICBUa2FwcF9RdWl0LCBNRVRIX1ZBUkFSR1N9LAorICAgIHsiaW50ZXJwYWRkciIsICAgICAgICAgVGthcHBfSW50ZXJwQWRkciwgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImxvYWR0ayIsICAgICAgICAgICAgICAgICBUa2FwcF9Ua0luaXQsIE1FVEhfTk9BUkdTfSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgICAgICAgICBOVUxMfQogfTsKIAogCi0MCisKIC8qKioqIFRrYXBwIFR5cGUgTWV0aG9kcyAqKioqLwogCiBzdGF0aWMgdm9pZAogVGthcHBfRGVhbGxvYyhQeU9iamVjdCAqc2VsZikKIHsKLQkvKkNIRUNLX1RDTF9BUFBBUlRNRU5UOyovCi0JRU5URVJfVENMCi0JVGNsX0RlbGV0ZUludGVycChUa2FwcF9JbnRlcnAoc2VsZikpOwotCUxFQVZFX1RDTAotCVB5T2JqZWN0X0RlbChzZWxmKTsKLQlEaXNhYmxlRXZlbnRIb29rKCk7CisgICAgLypDSEVDS19UQ0xfQVBQQVJUTUVOVDsqLworICAgIEVOVEVSX1RDTAorICAgIFRjbF9EZWxldGVJbnRlcnAoVGthcHBfSW50ZXJwKHNlbGYpKTsKKyAgICBMRUFWRV9UQ0wKKyAgICBQeU9iamVjdF9EZWwoc2VsZik7CisgICAgRGlzYWJsZUV2ZW50SG9vaygpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogVGthcHBfR2V0QXR0cihQeU9iamVjdCAqc2VsZiwgY2hhciAqbmFtZSkKIHsKLQlyZXR1cm4gUHlfRmluZE1ldGhvZChUa2FwcF9tZXRob2RzLCBzZWxmLCBuYW1lKTsKKyAgICByZXR1cm4gUHlfRmluZE1ldGhvZChUa2FwcF9tZXRob2RzLCBzZWxmLCBuYW1lKTsKIH0KIAogc3RhdGljIFB5VHlwZU9iamVjdCBUa2FwcF9UeXBlID0KIHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKLQkidGthcHAiLAkJCSAgICAgLyp0cF9uYW1lICovCi0Jc2l6ZW9mKFRrYXBwT2JqZWN0KSwJCSAgICAgLyp0cF9iYXNpY3NpemUgKi8KLQkwLAkJCQkgICAgIC8qdHBfaXRlbXNpemUgKi8KLQlUa2FwcF9EZWFsbG9jLAkJCSAgICAgLyp0cF9kZWFsbG9jICovCi0JMCwJCQkJICAgICAvKnRwX3ByaW50ICovCi0JVGthcHBfR2V0QXR0ciwJCQkgICAgIC8qdHBfZ2V0YXR0ciAqLwotCTAsCQkJCSAgICAgLyp0cF9zZXRhdHRyICovCi0JMCwJCQkJICAgICAvKnRwX2NvbXBhcmUgKi8KLQkwLAkJCQkgICAgIC8qdHBfcmVwciAqLwotCTAsCQkJCSAgICAgLyp0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkgICAgIC8qdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkgICAgIC8qdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCSAgICAgLyp0cF9oYXNoICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisgICAgInRrYXBwIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX25hbWUgKi8KKyAgICBzaXplb2YoVGthcHBPYmplY3QpLCAgICAgICAgICAgICAgICAgICAgIC8qdHBfYmFzaWNzaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZW1zaXplICovCisgICAgVGthcHBfRGVhbGxvYywgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcHJpbnQgKi8KKyAgICBUa2FwcF9HZXRBdHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9oYXNoICovCiB9OwogCiAKLQwKKwogLyoqKiogVGtpbnRlciBNb2R1bGUgKioqKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewotCVB5T2JqZWN0KiB0dXBsZTsKLQlpbnQgc2l6ZTsgLyogY3VycmVudCBzaXplICovCi0JaW50IG1heHNpemU7IC8qIGFsbG9jYXRlZCBzaXplICovCisgICAgUHlPYmplY3QqIHR1cGxlOworICAgIGludCBzaXplOyAvKiBjdXJyZW50IHNpemUgKi8KKyAgICBpbnQgbWF4c2l6ZTsgLyogYWxsb2NhdGVkIHNpemUgKi8KIH0gRmxhdHRlbkNvbnRleHQ7CiAKIHN0YXRpYyBpbnQKIF9idW1wKEZsYXR0ZW5Db250ZXh0KiBjb250ZXh0LCBpbnQgc2l6ZSkKIHsKLQkvKiBleHBhbmQgdHVwbGUgdG8gaG9sZCAoYXQgbGVhc3QpIHNpemUgbmV3IGl0ZW1zLgotCSAgIHJldHVybiB0cnVlIGlmIHN1Y2Nlc3NmdWwsIGZhbHNlIGlmIGFuIGV4Y2VwdGlvbiB3YXMgcmFpc2VkICovCisgICAgLyogZXhwYW5kIHR1cGxlIHRvIGhvbGQgKGF0IGxlYXN0KSBzaXplIG5ldyBpdGVtcy4KKyAgICAgICByZXR1cm4gdHJ1ZSBpZiBzdWNjZXNzZnVsLCBmYWxzZSBpZiBhbiBleGNlcHRpb24gd2FzIHJhaXNlZCAqLwogCi0JaW50IG1heHNpemUgPSBjb250ZXh0LT5tYXhzaXplICogMjsKKyAgICBpbnQgbWF4c2l6ZSA9IGNvbnRleHQtPm1heHNpemUgKiAyOwogCi0JaWYgKG1heHNpemUgPCBjb250ZXh0LT5zaXplICsgc2l6ZSkKLQkJbWF4c2l6ZSA9IGNvbnRleHQtPnNpemUgKyBzaXplOworICAgIGlmIChtYXhzaXplIDwgY29udGV4dC0+c2l6ZSArIHNpemUpCisgICAgICAgIG1heHNpemUgPSBjb250ZXh0LT5zaXplICsgc2l6ZTsKIAotCWNvbnRleHQtPm1heHNpemUgPSBtYXhzaXplOworICAgIGNvbnRleHQtPm1heHNpemUgPSBtYXhzaXplOwogCi0JcmV0dXJuIF9QeVR1cGxlX1Jlc2l6ZSgmY29udGV4dC0+dHVwbGUsIG1heHNpemUpID49IDA7CisgICAgcmV0dXJuIF9QeVR1cGxlX1Jlc2l6ZSgmY29udGV4dC0+dHVwbGUsIG1heHNpemUpID49IDA7CiB9CiAKIHN0YXRpYyBpbnQKIF9mbGF0dGVuMShGbGF0dGVuQ29udGV4dCogY29udGV4dCwgUHlPYmplY3QqIGl0ZW0sIGludCBkZXB0aCkKIHsKLQkvKiBhZGQgdHVwbGUgb3IgbGlzdCB0byBhcmd1bWVudCB0dXBsZSAocmVjdXJzaXZlbHkpICovCisgICAgLyogYWRkIHR1cGxlIG9yIGxpc3QgdG8gYXJndW1lbnQgdHVwbGUgKHJlY3Vyc2l2ZWx5KSAqLwogCi0JaW50IGksIHNpemU7CisgICAgaW50IGksIHNpemU7CiAKLQlpZiAoZGVwdGggPiAxMDAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJuZXN0aW5nIHRvbyBkZWVwIGluIF9mbGF0dGVuIik7Ci0JCXJldHVybiAwOwotCX0gZWxzZSBpZiAoUHlMaXN0X0NoZWNrKGl0ZW0pKSB7Ci0JCXNpemUgPSBQeUxpc3RfR0VUX1NJWkUoaXRlbSk7Ci0JCS8qIHByZWFsbG9jYXRlIChhc3N1bWUgbm8gbmVzdGluZykgKi8KLQkJaWYgKGNvbnRleHQtPnNpemUgKyBzaXplID4gY29udGV4dC0+bWF4c2l6ZSAmJgotCQkgICAgIV9idW1wKGNvbnRleHQsIHNpemUpKQotCQkJcmV0dXJuIDA7Ci0JCS8qIGNvcHkgaXRlbXMgdG8gb3V0cHV0IHR1cGxlICovCi0JCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCVB5T2JqZWN0ICpvID0gUHlMaXN0X0dFVF9JVEVNKGl0ZW0sIGkpOwotCQkJaWYgKFB5TGlzdF9DaGVjayhvKSB8fCBQeVR1cGxlX0NoZWNrKG8pKSB7Ci0JCQkJaWYgKCFfZmxhdHRlbjEoY29udGV4dCwgbywgZGVwdGggKyAxKSkKLQkJCQkJcmV0dXJuIDA7Ci0JCQl9IGVsc2UgaWYgKG8gIT0gUHlfTm9uZSkgewotCQkJCWlmIChjb250ZXh0LT5zaXplICsgMSA+IGNvbnRleHQtPm1heHNpemUgJiYKLQkJCQkgICAgIV9idW1wKGNvbnRleHQsIDEpKQotCQkJCQlyZXR1cm4gMDsKLQkJCQlQeV9JTkNSRUYobyk7Ci0JCQkJUHlUdXBsZV9TRVRfSVRFTShjb250ZXh0LT50dXBsZSwKLQkJCQkJCSBjb250ZXh0LT5zaXplKyssIG8pOwotCQkJfQotCQl9Ci0JfSBlbHNlIGlmIChQeVR1cGxlX0NoZWNrKGl0ZW0pKSB7Ci0JCS8qIHNhbWUsIGZvciB0dXBsZXMgKi8KLQkJc2l6ZSA9IFB5VHVwbGVfR0VUX1NJWkUoaXRlbSk7Ci0JCWlmIChjb250ZXh0LT5zaXplICsgc2l6ZSA+IGNvbnRleHQtPm1heHNpemUgJiYKLQkJICAgICFfYnVtcChjb250ZXh0LCBzaXplKSkKLQkJCXJldHVybiAwOwotCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlQeU9iamVjdCAqbyA9IFB5VHVwbGVfR0VUX0lURU0oaXRlbSwgaSk7Ci0JCQlpZiAoUHlMaXN0X0NoZWNrKG8pIHx8IFB5VHVwbGVfQ2hlY2sobykpIHsKLQkJCQlpZiAoIV9mbGF0dGVuMShjb250ZXh0LCBvLCBkZXB0aCArIDEpKQotCQkJCQlyZXR1cm4gMDsKLQkJCX0gZWxzZSBpZiAobyAhPSBQeV9Ob25lKSB7Ci0JCQkJaWYgKGNvbnRleHQtPnNpemUgKyAxID4gY29udGV4dC0+bWF4c2l6ZSAmJgotCQkJCSAgICAhX2J1bXAoY29udGV4dCwgMSkpCi0JCQkJCXJldHVybiAwOwotCQkJCVB5X0lOQ1JFRihvKTsKLQkJCQlQeVR1cGxlX1NFVF9JVEVNKGNvbnRleHQtPnR1cGxlLAotCQkJCQkJIGNvbnRleHQtPnNpemUrKywgbyk7Ci0JCQl9Ci0JCX0KLQl9IGVsc2UgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYXJndW1lbnQgbXVzdCBiZSBzZXF1ZW5jZSIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIDE7CisgICAgaWYgKGRlcHRoID4gMTAwMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJuZXN0aW5nIHRvbyBkZWVwIGluIF9mbGF0dGVuIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0gZWxzZSBpZiAoUHlMaXN0X0NoZWNrKGl0ZW0pKSB7CisgICAgICAgIHNpemUgPSBQeUxpc3RfR0VUX1NJWkUoaXRlbSk7CisgICAgICAgIC8qIHByZWFsbG9jYXRlIChhc3N1bWUgbm8gbmVzdGluZykgKi8KKyAgICAgICAgaWYgKGNvbnRleHQtPnNpemUgKyBzaXplID4gY29udGV4dC0+bWF4c2l6ZSAmJgorICAgICAgICAgICAgIV9idW1wKGNvbnRleHQsIHNpemUpKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIC8qIGNvcHkgaXRlbXMgdG8gb3V0cHV0IHR1cGxlICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpvID0gUHlMaXN0X0dFVF9JVEVNKGl0ZW0sIGkpOworICAgICAgICAgICAgaWYgKFB5TGlzdF9DaGVjayhvKSB8fCBQeVR1cGxlX0NoZWNrKG8pKSB7CisgICAgICAgICAgICAgICAgaWYgKCFfZmxhdHRlbjEoY29udGV4dCwgbywgZGVwdGggKyAxKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG8gIT0gUHlfTm9uZSkgeworICAgICAgICAgICAgICAgIGlmIChjb250ZXh0LT5zaXplICsgMSA+IGNvbnRleHQtPm1heHNpemUgJiYKKyAgICAgICAgICAgICAgICAgICAgIV9idW1wKGNvbnRleHQsIDEpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICBQeV9JTkNSRUYobyk7CisgICAgICAgICAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShjb250ZXh0LT50dXBsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQtPnNpemUrKywgbyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKFB5VHVwbGVfQ2hlY2soaXRlbSkpIHsKKyAgICAgICAgLyogc2FtZSwgZm9yIHR1cGxlcyAqLworICAgICAgICBzaXplID0gUHlUdXBsZV9HRVRfU0laRShpdGVtKTsKKyAgICAgICAgaWYgKGNvbnRleHQtPnNpemUgKyBzaXplID4gY29udGV4dC0+bWF4c2l6ZSAmJgorICAgICAgICAgICAgIV9idW1wKGNvbnRleHQsIHNpemUpKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpvID0gUHlUdXBsZV9HRVRfSVRFTShpdGVtLCBpKTsKKyAgICAgICAgICAgIGlmIChQeUxpc3RfQ2hlY2sobykgfHwgUHlUdXBsZV9DaGVjayhvKSkgeworICAgICAgICAgICAgICAgIGlmICghX2ZsYXR0ZW4xKGNvbnRleHQsIG8sIGRlcHRoICsgMSkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfSBlbHNlIGlmIChvICE9IFB5X05vbmUpIHsKKyAgICAgICAgICAgICAgICBpZiAoY29udGV4dC0+c2l6ZSArIDEgPiBjb250ZXh0LT5tYXhzaXplICYmCisgICAgICAgICAgICAgICAgICAgICFfYnVtcChjb250ZXh0LCAxKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgUHlfSU5DUkVGKG8pOworICAgICAgICAgICAgICAgIFB5VHVwbGVfU0VUX0lURU0oY29udGV4dC0+dHVwbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT5zaXplKyssIG8pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImFyZ3VtZW50IG11c3QgYmUgc2VxdWVuY2UiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogVGtpbnRlcl9GbGF0dGVuKFB5T2JqZWN0KiBzZWxmLCBQeU9iamVjdCogYXJncykKIHsKLQlGbGF0dGVuQ29udGV4dCBjb250ZXh0OwotCVB5T2JqZWN0KiBpdGVtOworICAgIEZsYXR0ZW5Db250ZXh0IGNvbnRleHQ7CisgICAgUHlPYmplY3QqIGl0ZW07CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk86X2ZsYXR0ZW4iLCAmaXRlbSkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTzpfZmxhdHRlbiIsICZpdGVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQljb250ZXh0Lm1heHNpemUgPSBQeVNlcXVlbmNlX1NpemUoaXRlbSk7Ci0JaWYgKGNvbnRleHQubWF4c2l6ZSA8PSAwKQotCQlyZXR1cm4gUHlUdXBsZV9OZXcoMCk7Ci0JCi0JY29udGV4dC50dXBsZSA9IFB5VHVwbGVfTmV3KGNvbnRleHQubWF4c2l6ZSk7Ci0JaWYgKCFjb250ZXh0LnR1cGxlKQotCQlyZXR1cm4gTlVMTDsKLQkKLQljb250ZXh0LnNpemUgPSAwOworICAgIGNvbnRleHQubWF4c2l6ZSA9IFB5U2VxdWVuY2VfU2l6ZShpdGVtKTsKKyAgICBpZiAoY29udGV4dC5tYXhzaXplIDw9IDApCisgICAgICAgIHJldHVybiBQeVR1cGxlX05ldygwKTsKIAotCWlmICghX2ZsYXR0ZW4xKCZjb250ZXh0LCBpdGVtLDApKQotCQlyZXR1cm4gTlVMTDsKKyAgICBjb250ZXh0LnR1cGxlID0gUHlUdXBsZV9OZXcoY29udGV4dC5tYXhzaXplKTsKKyAgICBpZiAoIWNvbnRleHQudHVwbGUpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKF9QeVR1cGxlX1Jlc2l6ZSgmY29udGV4dC50dXBsZSwgY29udGV4dC5zaXplKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgY29udGV4dC5zaXplID0gMDsKIAotCXJldHVybiBjb250ZXh0LnR1cGxlOworICAgIGlmICghX2ZsYXR0ZW4xKCZjb250ZXh0LCBpdGVtLDApKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGlmIChfUHlUdXBsZV9SZXNpemUoJmNvbnRleHQudHVwbGUsIGNvbnRleHQuc2l6ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgcmV0dXJuIGNvbnRleHQudHVwbGU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBUa2ludGVyX0NyZWF0ZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqc2NyZWVuTmFtZSA9IE5VTEw7Ci0JY2hhciAqYmFzZU5hbWUgPSBOVUxMOwotCWNoYXIgKmNsYXNzTmFtZSA9IE5VTEw7Ci0JaW50IGludGVyYWN0aXZlID0gMDsKLQlpbnQgd2FudG9iamVjdHMgPSAwOwotCWludCB3YW50VGsgPSAxOwkvKiBJZiBmYWxzZSwgdGhlbiBUa19Jbml0KCkgZG9lc24ndCBnZXQJY2FsbGVkICovCi0JaW50IHN5bmMgPSAwOyAvKiBwYXNzIC1zeW5jIHRvIHdpc2ggKi8KLQljaGFyICp1c2UgPSBOVUxMOyAvKiBwYXNzIC11c2UgdG8gd2lzaCAqLworICAgIGNoYXIgKnNjcmVlbk5hbWUgPSBOVUxMOworICAgIGNoYXIgKmJhc2VOYW1lID0gTlVMTDsKKyAgICBjaGFyICpjbGFzc05hbWUgPSBOVUxMOworICAgIGludCBpbnRlcmFjdGl2ZSA9IDA7CisgICAgaW50IHdhbnRvYmplY3RzID0gMDsKKyAgICBpbnQgd2FudFRrID0gMTsgICAgIC8qIElmIGZhbHNlLCB0aGVuIFRrX0luaXQoKSBkb2Vzbid0IGdldCBjYWxsZWQgKi8KKyAgICBpbnQgc3luYyA9IDA7IC8qIHBhc3MgLXN5bmMgdG8gd2lzaCAqLworICAgIGNoYXIgKnVzZSA9IE5VTEw7IC8qIHBhc3MgLXVzZSB0byB3aXNoICovCiAKLQliYXNlTmFtZSA9IHN0cnJjaHIoUHlfR2V0UHJvZ3JhbU5hbWUoKSwgJy8nKTsKLQlpZiAoYmFzZU5hbWUgIT0gTlVMTCkKLQkJYmFzZU5hbWUrKzsKLQllbHNlCi0JCWJhc2VOYW1lID0gUHlfR2V0UHJvZ3JhbU5hbWUoKTsKLQljbGFzc05hbWUgPSAiVGsiOwotICAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInx6c3NpaWlpejpjcmVhdGUiLAotCQkJICAgICAgJnNjcmVlbk5hbWUsICZiYXNlTmFtZSwgJmNsYXNzTmFtZSwKLQkJCSAgICAgICZpbnRlcmFjdGl2ZSwgJndhbnRvYmplY3RzLCAmd2FudFRrLAotCQkJICAgICAgJnN5bmMsICZ1c2UpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBiYXNlTmFtZSA9IHN0cnJjaHIoUHlfR2V0UHJvZ3JhbU5hbWUoKSwgJy8nKTsKKyAgICBpZiAoYmFzZU5hbWUgIT0gTlVMTCkKKyAgICAgICAgYmFzZU5hbWUrKzsKKyAgICBlbHNlCisgICAgICAgIGJhc2VOYW1lID0gUHlfR2V0UHJvZ3JhbU5hbWUoKTsKKyAgICBjbGFzc05hbWUgPSAiVGsiOwogCi0JcmV0dXJuIChQeU9iamVjdCAqKSBUa2FwcF9OZXcoc2NyZWVuTmFtZSwgYmFzZU5hbWUsIGNsYXNzTmFtZSwgCi0JCQkJICAgICAgaW50ZXJhY3RpdmUsIHdhbnRvYmplY3RzLAl3YW50VGssCi0JCQkJICAgICAgc3luYywgdXNlKTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInx6c3NpaWlpejpjcmVhdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2NyZWVuTmFtZSwgJmJhc2VOYW1lLCAmY2xhc3NOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW50ZXJhY3RpdmUsICZ3YW50b2JqZWN0cywgJndhbnRUaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnN5bmMsICZ1c2UpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIHJldHVybiAoUHlPYmplY3QgKikgVGthcHBfTmV3KHNjcmVlbk5hbWUsIGJhc2VOYW1lLCBjbGFzc05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJhY3RpdmUsIHdhbnRvYmplY3RzLCAgICAgd2FudFRrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bmMsIHVzZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBUa2ludGVyX3NldGJ1c3l3YWl0aW50ZXJ2YWwoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBuZXdfdmFsOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpzZXRidXN5d2FpdGludGVydmFsIiwgJm5ld192YWwpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAobmV3X3ZhbCA8IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJImJ1c3l3YWl0aW50ZXJ2YWwgbXVzdCBiZSA+PSAwIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlUa2ludGVyX2J1c3l3YWl0aW50ZXJ2YWwgPSBuZXdfdmFsOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpbnQgbmV3X3ZhbDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6c2V0YnVzeXdhaXRpbnRlcnZhbCIsICZuZXdfdmFsKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKG5ld192YWwgPCAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImJ1c3l3YWl0aW50ZXJ2YWwgbXVzdCBiZSA+PSAwIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBUa2ludGVyX2J1c3l3YWl0aW50ZXJ2YWwgPSBuZXdfdmFsOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIGNoYXIgc2V0YnVzeXdhaXRpbnRlcnZhbF9kb2NbXSA9CkBAIC0yOTQ4LDcgKzI5NDgsNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIFRraW50ZXJfZ2V0YnVzeXdhaXRpbnRlcnZhbChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0gICAgICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhUa2ludGVyX2J1c3l3YWl0aW50ZXJ2YWwpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhUa2ludGVyX2J1c3l3YWl0aW50ZXJ2YWwpOwogfQogCiBzdGF0aWMgY2hhciBnZXRidXN5d2FpdGludGVydmFsX2RvY1tdID0KQEAgLTI5NTksMjEgKzI5NTksMjEgQEAKIAogc3RhdGljIFB5TWV0aG9kRGVmIG1vZHVsZU1ldGhvZHNbXSA9CiB7Ci0JeyJfZmxhdHRlbiIsICAgICAgICAgICBUa2ludGVyX0ZsYXR0ZW4sIE1FVEhfVkFSQVJHU30sCi0JeyJjcmVhdGUiLCAgICAgICAgICAgICBUa2ludGVyX0NyZWF0ZSwgTUVUSF9WQVJBUkdTfSwKKyAgICB7Il9mbGF0dGVuIiwgICAgICAgICAgIFRraW50ZXJfRmxhdHRlbiwgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImNyZWF0ZSIsICAgICAgICAgICAgIFRraW50ZXJfQ3JlYXRlLCBNRVRIX1ZBUkFSR1N9LAogI2lmZGVmIEhBVkVfQ1JFQVRFRklMRUhBTkRMRVIKLQl7ImNyZWF0ZWZpbGVoYW5kbGVyIiwgIFRrYXBwX0NyZWF0ZUZpbGVIYW5kbGVyLCBNRVRIX1ZBUkFSR1N9LAotCXsiZGVsZXRlZmlsZWhhbmRsZXIiLCAgVGthcHBfRGVsZXRlRmlsZUhhbmRsZXIsIE1FVEhfVkFSQVJHU30sCisgICAgeyJjcmVhdGVmaWxlaGFuZGxlciIsICBUa2FwcF9DcmVhdGVGaWxlSGFuZGxlciwgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImRlbGV0ZWZpbGVoYW5kbGVyIiwgIFRrYXBwX0RlbGV0ZUZpbGVIYW5kbGVyLCBNRVRIX1ZBUkFSR1N9LAogI2VuZGlmCi0JeyJjcmVhdGV0aW1lcmhhbmRsZXIiLCBUa2FwcF9DcmVhdGVUaW1lckhhbmRsZXIsIE1FVEhfVkFSQVJHU30sCi0JeyJtYWlubG9vcCIsICAgICAgICAgICBUa2FwcF9NYWluTG9vcCwgTUVUSF9WQVJBUkdTfSwKLQl7ImRvb25lZXZlbnQiLCAgICAgICAgIFRrYXBwX0RvT25lRXZlbnQsIE1FVEhfVkFSQVJHU30sCi0JeyJxdWl0IiwgICAgICAgICAgICAgICBUa2FwcF9RdWl0LCBNRVRIX1ZBUkFSR1N9LAotCXsic2V0YnVzeXdhaXRpbnRlcnZhbCIsVGtpbnRlcl9zZXRidXN5d2FpdGludGVydmFsLCBNRVRIX1ZBUkFSR1MsCi0JICAgICAgICAgICAgICAgICAgICAgICBzZXRidXN5d2FpdGludGVydmFsX2RvY30sCi0JeyJnZXRidXN5d2FpdGludGVydmFsIiwoUHlDRnVuY3Rpb24pVGtpbnRlcl9nZXRidXN5d2FpdGludGVydmFsLAotCSAgICAgICAgICAgICAgICAgICAgICAgTUVUSF9OT0FSR1MsIGdldGJ1c3l3YWl0aW50ZXJ2YWxfZG9jfSwKLQl7TlVMTCwgICAgICAgICAgICAgICAgIE5VTEx9CisgICAgeyJjcmVhdGV0aW1lcmhhbmRsZXIiLCBUa2FwcF9DcmVhdGVUaW1lckhhbmRsZXIsIE1FVEhfVkFSQVJHU30sCisgICAgeyJtYWlubG9vcCIsICAgICAgICAgICBUa2FwcF9NYWluTG9vcCwgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImRvb25lZXZlbnQiLCAgICAgICAgIFRrYXBwX0RvT25lRXZlbnQsIE1FVEhfVkFSQVJHU30sCisgICAgeyJxdWl0IiwgICAgICAgICAgICAgICBUa2FwcF9RdWl0LCBNRVRIX1ZBUkFSR1N9LAorICAgIHsic2V0YnVzeXdhaXRpbnRlcnZhbCIsVGtpbnRlcl9zZXRidXN5d2FpdGludGVydmFsLCBNRVRIX1ZBUkFSR1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRidXN5d2FpdGludGVydmFsX2RvY30sCisgICAgeyJnZXRidXN5d2FpdGludGVydmFsIiwoUHlDRnVuY3Rpb24pVGtpbnRlcl9nZXRidXN5d2FpdGludGVydmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVUSF9OT0FSR1MsIGdldGJ1c3l3YWl0aW50ZXJ2YWxfZG9jfSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgICAgIE5VTEx9CiB9OwogCiAjaWZkZWYgV0FJVF9GT1JfU1RESU4KQEAgLTI5ODQsNyArMjk4NCw3IEBACiBzdGF0aWMgdm9pZAogTXlGaWxlUHJvYyh2b2lkICpjbGllbnREYXRhLCBpbnQgbWFzaykKIHsKLQlzdGRpbl9yZWFkeSA9IDE7CisgICAgc3RkaW5fcmVhZHkgPSAxOwogfQogI2VuZGlmCiAKQEAgLTI5OTYsNTcgKzI5OTYsNTcgQEAKIEV2ZW50SG9vayh2b2lkKQogewogI2lmbmRlZiBNU19XSU5ET1dTCi0JaW50IHRmaWxlOworICAgIGludCB0ZmlsZTsKICNlbmRpZgogI2lmZGVmIFdJVEhfVEhSRUFECi0JUHlFdmFsX1Jlc3RvcmVUaHJlYWQoZXZlbnRfdHN0YXRlKTsKKyAgICBQeUV2YWxfUmVzdG9yZVRocmVhZChldmVudF90c3RhdGUpOwogI2VuZGlmCi0Jc3RkaW5fcmVhZHkgPSAwOwotCWVycm9ySW5DbWQgPSAwOworICAgIHN0ZGluX3JlYWR5ID0gMDsKKyAgICBlcnJvckluQ21kID0gMDsKICNpZm5kZWYgTVNfV0lORE9XUwotCXRmaWxlID0gZmlsZW5vKHN0ZGluKTsKLQlUY2xfQ3JlYXRlRmlsZUhhbmRsZXIodGZpbGUsIFRDTF9SRUFEQUJMRSwgTXlGaWxlUHJvYywgTlVMTCk7CisgICAgdGZpbGUgPSBmaWxlbm8oc3RkaW4pOworICAgIFRjbF9DcmVhdGVGaWxlSGFuZGxlcih0ZmlsZSwgVENMX1JFQURBQkxFLCBNeUZpbGVQcm9jLCBOVUxMKTsKICNlbmRpZgotCXdoaWxlICghZXJyb3JJbkNtZCAmJiAhc3RkaW5fcmVhZHkpIHsKLQkJaW50IHJlc3VsdDsKKyAgICB3aGlsZSAoIWVycm9ySW5DbWQgJiYgIXN0ZGluX3JlYWR5KSB7CisgICAgICAgIGludCByZXN1bHQ7CiAjaWZkZWYgTVNfV0lORE9XUwotCQlpZiAoX2tiaGl0KCkpIHsKLQkJCXN0ZGluX3JlYWR5ID0gMTsKLQkJCWJyZWFrOwotCQl9CisgICAgICAgIGlmIChfa2JoaXQoKSkgeworICAgICAgICAgICAgc3RkaW5fcmVhZHkgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KICNlbmRpZgogI2lmIGRlZmluZWQoV0lUSF9USFJFQUQpIHx8IGRlZmluZWQoTVNfV0lORE9XUykKLQkJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCQlpZih0Y2xfbG9jaylQeVRocmVhZF9hY3F1aXJlX2xvY2sodGNsX2xvY2ssIDEpOwotCQl0Y2xfdHN0YXRlID0gZXZlbnRfdHN0YXRlOworICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgICAgIGlmKHRjbF9sb2NrKVB5VGhyZWFkX2FjcXVpcmVfbG9jayh0Y2xfbG9jaywgMSk7CisgICAgICAgIHRjbF90c3RhdGUgPSBldmVudF90c3RhdGU7CiAKLQkJcmVzdWx0ID0gVGNsX0RvT25lRXZlbnQoVENMX0RPTlRfV0FJVCk7CisgICAgICAgIHJlc3VsdCA9IFRjbF9Eb09uZUV2ZW50KFRDTF9ET05UX1dBSVQpOwogCi0JCXRjbF90c3RhdGUgPSBOVUxMOwotCQlpZih0Y2xfbG9jaylQeVRocmVhZF9yZWxlYXNlX2xvY2sodGNsX2xvY2spOwotCQlpZiAocmVzdWx0ID09IDApCi0JCQlTbGVlcChUa2ludGVyX2J1c3l3YWl0aW50ZXJ2YWwpOwotCQlQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgICAgICB0Y2xfdHN0YXRlID0gTlVMTDsKKyAgICAgICAgaWYodGNsX2xvY2spUHlUaHJlYWRfcmVsZWFzZV9sb2NrKHRjbF9sb2NrKTsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSAwKQorICAgICAgICAgICAgU2xlZXAoVGtpbnRlcl9idXN5d2FpdGludGVydmFsKTsKKyAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKICNlbHNlCi0JCXJlc3VsdCA9IFRjbF9Eb09uZUV2ZW50KDApOworICAgICAgICByZXN1bHQgPSBUY2xfRG9PbmVFdmVudCgwKTsKICNlbmRpZgogCi0JCWlmIChyZXN1bHQgPCAwKQotCQkJYnJlYWs7Ci0JfQorICAgICAgICBpZiAocmVzdWx0IDwgMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KICNpZm5kZWYgTVNfV0lORE9XUwotCVRjbF9EZWxldGVGaWxlSGFuZGxlcih0ZmlsZSk7CisgICAgVGNsX0RlbGV0ZUZpbGVIYW5kbGVyKHRmaWxlKTsKICNlbmRpZgotCWlmIChlcnJvckluQ21kKSB7Ci0JCWVycm9ySW5DbWQgPSAwOwotCQlQeUVycl9SZXN0b3JlKGV4Y0luQ21kLCB2YWxJbkNtZCwgdHJiSW5DbWQpOwotCQlleGNJbkNtZCA9IHZhbEluQ21kID0gdHJiSW5DbWQgPSBOVUxMOwotCQlQeUVycl9QcmludCgpOwotCX0KKyAgICBpZiAoZXJyb3JJbkNtZCkgeworICAgICAgICBlcnJvckluQ21kID0gMDsKKyAgICAgICAgUHlFcnJfUmVzdG9yZShleGNJbkNtZCwgdmFsSW5DbWQsIHRyYkluQ21kKTsKKyAgICAgICAgZXhjSW5DbWQgPSB2YWxJbkNtZCA9IHRyYkluQ21kID0gTlVMTDsKKyAgICAgICAgUHlFcnJfUHJpbnQoKTsKKyAgICB9CiAjaWZkZWYgV0lUSF9USFJFQUQKLQlQeUV2YWxfU2F2ZVRocmVhZCgpOworICAgIFB5RXZhbF9TYXZlVGhyZWFkKCk7CiAjZW5kaWYKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKIH0KIAogI2VuZGlmCkBAIC0zMDU1LDEyICszMDU1LDEyIEBACiBFbmFibGVFdmVudEhvb2sodm9pZCkKIHsKICNpZmRlZiBXQUlUX0ZPUl9TVERJTgotCWlmIChQeU9TX0lucHV0SG9vayA9PSBOVUxMKSB7CisgICAgaWYgKFB5T1NfSW5wdXRIb29rID09IE5VTEwpIHsKICNpZmRlZiBXSVRIX1RIUkVBRAotCQlldmVudF90c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dldCgpOworICAgICAgICBldmVudF90c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dldCgpOwogI2VuZGlmCi0JCVB5T1NfSW5wdXRIb29rID0gRXZlbnRIb29rOwotCX0KKyAgICAgICAgUHlPU19JbnB1dEhvb2sgPSBFdmVudEhvb2s7CisgICAgfQogI2VuZGlmCiB9CiAKQEAgLTMwNjgsOSArMzA2OCw5IEBACiBEaXNhYmxlRXZlbnRIb29rKHZvaWQpCiB7CiAjaWZkZWYgV0FJVF9GT1JfU1RESU4KLQlpZiAoVGtfR2V0TnVtTWFpbldpbmRvd3MoKSA9PSAwICYmIFB5T1NfSW5wdXRIb29rID09IEV2ZW50SG9vaykgewotCQlQeU9TX0lucHV0SG9vayA9IE5VTEw7Ci0JfQorICAgIGlmIChUa19HZXROdW1NYWluV2luZG93cygpID09IDAgJiYgUHlPU19JbnB1dEhvb2sgPT0gRXZlbnRIb29rKSB7CisgICAgICAgIFB5T1NfSW5wdXRIb29rID0gTlVMTDsKKyAgICB9CiAjZW5kaWYKIH0KIApAQCAtMzA3OSw4OSArMzA3OSw4OSBAQAogc3RhdGljIHZvaWQKIGluc19sb25nKFB5T2JqZWN0ICpkLCBjaGFyICpuYW1lLCBsb25nIHZhbCkKIHsKLQlQeU9iamVjdCAqdiA9IFB5SW50X0Zyb21Mb25nKHZhbCk7Ci0JaWYgKHYpIHsKLQkJUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgbmFtZSwgdik7Ci0JCVB5X0RFQ1JFRih2KTsKLQl9CisgICAgUHlPYmplY3QgKnYgPSBQeUludF9Gcm9tTG9uZyh2YWwpOworICAgIGlmICh2KSB7CisgICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsIG5hbWUsIHYpOworICAgICAgICBQeV9ERUNSRUYodik7CisgICAgfQogfQogc3RhdGljIHZvaWQKIGluc19zdHJpbmcoUHlPYmplY3QgKmQsIGNoYXIgKm5hbWUsIGNoYXIgKnZhbCkKIHsKLQlQeU9iamVjdCAqdiA9IFB5U3RyaW5nX0Zyb21TdHJpbmcodmFsKTsKLQlpZiAodikgewotCQlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCBuYW1lLCB2KTsKLQkJUHlfREVDUkVGKHYpOwotCX0KKyAgICBQeU9iamVjdCAqdiA9IFB5U3RyaW5nX0Zyb21TdHJpbmcodmFsKTsKKyAgICBpZiAodikgeworICAgICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCBuYW1lLCB2KTsKKyAgICAgICAgUHlfREVDUkVGKHYpOworICAgIH0KIH0KIAogCiBQeU1PRElOSVRfRlVOQwogaW5pdF90a2ludGVyKHZvaWQpCiB7Ci0JUHlPYmplY3QgKm0sICpkOworICAgIFB5T2JqZWN0ICptLCAqZDsKIAotCVB5X1RZUEUoJlRrYXBwX1R5cGUpID0gJlB5VHlwZV9UeXBlOworICAgIFB5X1RZUEUoJlRrYXBwX1R5cGUpID0gJlB5VHlwZV9UeXBlOwogCiAjaWZkZWYgV0lUSF9USFJFQUQKLQl0Y2xfbG9jayA9IFB5VGhyZWFkX2FsbG9jYXRlX2xvY2soKTsKKyAgICB0Y2xfbG9jayA9IFB5VGhyZWFkX2FsbG9jYXRlX2xvY2soKTsKICNlbmRpZgogCi0JbSA9IFB5X0luaXRNb2R1bGUoIl90a2ludGVyIiwgbW9kdWxlTWV0aG9kcyk7Ci0JaWYgKG0gPT0gTlVMTCkKLQkJcmV0dXJuOworICAgIG0gPSBQeV9Jbml0TW9kdWxlKCJfdGtpbnRlciIsIG1vZHVsZU1ldGhvZHMpOworICAgIGlmIChtID09IE5VTEwpCisgICAgICAgIHJldHVybjsKIAotCWQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOwotCVRraW50ZXJfVGNsRXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oIl90a2ludGVyLlRjbEVycm9yIiwgTlVMTCwgTlVMTCk7Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlRjbEVycm9yIiwgVGtpbnRlcl9UY2xFcnJvcik7CisgICAgZCA9IFB5TW9kdWxlX0dldERpY3QobSk7CisgICAgVGtpbnRlcl9UY2xFcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbigiX3RraW50ZXIuVGNsRXJyb3IiLCBOVUxMLCBOVUxMKTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiVGNsRXJyb3IiLCBUa2ludGVyX1RjbEVycm9yKTsKIAotCWluc19sb25nKGQsICJSRUFEQUJMRSIsIFRDTF9SRUFEQUJMRSk7Ci0JaW5zX2xvbmcoZCwgIldSSVRBQkxFIiwgVENMX1dSSVRBQkxFKTsKLQlpbnNfbG9uZyhkLCAiRVhDRVBUSU9OIiwgVENMX0VYQ0VQVElPTik7Ci0JaW5zX2xvbmcoZCwgIldJTkRPV19FVkVOVFMiLCBUQ0xfV0lORE9XX0VWRU5UUyk7Ci0JaW5zX2xvbmcoZCwgIkZJTEVfRVZFTlRTIiwgVENMX0ZJTEVfRVZFTlRTKTsKLQlpbnNfbG9uZyhkLCAiVElNRVJfRVZFTlRTIiwgVENMX1RJTUVSX0VWRU5UUyk7Ci0JaW5zX2xvbmcoZCwgIklETEVfRVZFTlRTIiwgVENMX0lETEVfRVZFTlRTKTsKLQlpbnNfbG9uZyhkLCAiQUxMX0VWRU5UUyIsIFRDTF9BTExfRVZFTlRTKTsKLQlpbnNfbG9uZyhkLCAiRE9OVF9XQUlUIiwgVENMX0RPTlRfV0FJVCk7Ci0JaW5zX3N0cmluZyhkLCAiVEtfVkVSU0lPTiIsIFRLX1ZFUlNJT04pOwotCWluc19zdHJpbmcoZCwgIlRDTF9WRVJTSU9OIiwgVENMX1ZFUlNJT04pOworICAgIGluc19sb25nKGQsICJSRUFEQUJMRSIsIFRDTF9SRUFEQUJMRSk7CisgICAgaW5zX2xvbmcoZCwgIldSSVRBQkxFIiwgVENMX1dSSVRBQkxFKTsKKyAgICBpbnNfbG9uZyhkLCAiRVhDRVBUSU9OIiwgVENMX0VYQ0VQVElPTik7CisgICAgaW5zX2xvbmcoZCwgIldJTkRPV19FVkVOVFMiLCBUQ0xfV0lORE9XX0VWRU5UUyk7CisgICAgaW5zX2xvbmcoZCwgIkZJTEVfRVZFTlRTIiwgVENMX0ZJTEVfRVZFTlRTKTsKKyAgICBpbnNfbG9uZyhkLCAiVElNRVJfRVZFTlRTIiwgVENMX1RJTUVSX0VWRU5UUyk7CisgICAgaW5zX2xvbmcoZCwgIklETEVfRVZFTlRTIiwgVENMX0lETEVfRVZFTlRTKTsKKyAgICBpbnNfbG9uZyhkLCAiQUxMX0VWRU5UUyIsIFRDTF9BTExfRVZFTlRTKTsKKyAgICBpbnNfbG9uZyhkLCAiRE9OVF9XQUlUIiwgVENMX0RPTlRfV0FJVCk7CisgICAgaW5zX3N0cmluZyhkLCAiVEtfVkVSU0lPTiIsIFRLX1ZFUlNJT04pOworICAgIGluc19zdHJpbmcoZCwgIlRDTF9WRVJTSU9OIiwgVENMX1ZFUlNJT04pOwogCi0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlRrYXBwVHlwZSIsIChQeU9iamVjdCAqKSZUa2FwcF9UeXBlKTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiVGthcHBUeXBlIiwgKFB5T2JqZWN0ICopJlRrYXBwX1R5cGUpOwogCi0JUHlfVFlQRSgmVGt0dF9UeXBlKSA9ICZQeVR5cGVfVHlwZTsKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiVGt0dFR5cGUiLCAoUHlPYmplY3QgKikmVGt0dF9UeXBlKTsKKyAgICBQeV9UWVBFKCZUa3R0X1R5cGUpID0gJlB5VHlwZV9UeXBlOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJUa3R0VHlwZSIsIChQeU9iamVjdCAqKSZUa3R0X1R5cGUpOwogCi0JUHlfVFlQRSgmUHlUY2xPYmplY3RfVHlwZSkgPSAmUHlUeXBlX1R5cGU7Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlRjbF9PYmoiLCAoUHlPYmplY3QgKikmUHlUY2xPYmplY3RfVHlwZSk7CisgICAgUHlfVFlQRSgmUHlUY2xPYmplY3RfVHlwZSkgPSAmUHlUeXBlX1R5cGU7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlRjbF9PYmoiLCAoUHlPYmplY3QgKikmUHlUY2xPYmplY3RfVHlwZSk7CiAKICNpZmRlZiBUS19BUVVBCi0JLyogVGtfTWFjT1NYU2V0dXBUa05vdGlmaWVyIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBUY2wncyBzdWJzeXN0ZW1zCi0JICogc3RhcnQgd2FraW5nIHVwLiAgTm90ZSB0aGF0IFRjbF9GaW5kRXhlY3V0YWJsZSB3aWxsIGRvIHRoaXMsIHRoaXMKLQkgKiBjb2RlIG11c3QgYmUgYWJvdmUgaXQhIFRoZSBvcmlnaW5hbCB3YXJuaW5nIGZyb20KLQkgKiB0a01hY09TWEFwcEluaXQuYyBpcyBjb3BpZWQgYmVsb3cuCi0JICoKLQkgKiBOQiAtIFlvdSBoYXZlIHRvIHN3YXAgaW4gdGhlIFRrIE5vdGlmaWVyIEJFRk9SRSB5b3Ugc3RhcnQgdXAgdGhlCi0JICogVGNsIGludGVycHJldGVyIGZvciBub3cuICBJdCBwcm9iYWJseSBzaG91bGQgd29yayB0byBkbyB0aGlzCi0JICogaW4gdGhlIG90aGVyIG9yZGVyLCBidXQgZm9yIG5vdyBpdCBkb2Vzbid0IHNlZW0gdG8uCi0JICoKLQkgKi8KLQlUa19NYWNPU1hTZXR1cFRrTm90aWZpZXIoKTsKKyAgICAvKiBUa19NYWNPU1hTZXR1cFRrTm90aWZpZXIgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIFRjbCdzIHN1YnN5c3RlbXMKKyAgICAgKiBzdGFydCB3YWtpbmcgdXAuICBOb3RlIHRoYXQgVGNsX0ZpbmRFeGVjdXRhYmxlIHdpbGwgZG8gdGhpcywgdGhpcworICAgICAqIGNvZGUgbXVzdCBiZSBhYm92ZSBpdCEgVGhlIG9yaWdpbmFsIHdhcm5pbmcgZnJvbQorICAgICAqIHRrTWFjT1NYQXBwSW5pdC5jIGlzIGNvcGllZCBiZWxvdy4KKyAgICAgKgorICAgICAqIE5CIC0gWW91IGhhdmUgdG8gc3dhcCBpbiB0aGUgVGsgTm90aWZpZXIgQkVGT1JFIHlvdSBzdGFydCB1cCB0aGUKKyAgICAgKiBUY2wgaW50ZXJwcmV0ZXIgZm9yIG5vdy4gIEl0IHByb2JhYmx5IHNob3VsZCB3b3JrIHRvIGRvIHRoaXMKKyAgICAgKiBpbiB0aGUgb3RoZXIgb3JkZXIsIGJ1dCBmb3Igbm93IGl0IGRvZXNuJ3Qgc2VlbSB0by4KKyAgICAgKgorICAgICAqLworICAgIFRrX01hY09TWFNldHVwVGtOb3RpZmllcigpOwogI2VuZGlmCiAKIAotCS8qIFRoaXMgaGVscHMgdGhlIGR5bmFtaWMgbG9hZGVyOyBpbiBVbmljb2RlIGF3YXJlIFRjbCB2ZXJzaW9ucwotCSAgIGl0IGFsc28gaGVscHMgVGNsIGZpbmQgaXRzIGVuY29kaW5ncy4gKi8KLQlUY2xfRmluZEV4ZWN1dGFibGUoUHlfR2V0UHJvZ3JhbU5hbWUoKSk7CisgICAgLyogVGhpcyBoZWxwcyB0aGUgZHluYW1pYyBsb2FkZXI7IGluIFVuaWNvZGUgYXdhcmUgVGNsIHZlcnNpb25zCisgICAgICAgaXQgYWxzbyBoZWxwcyBUY2wgZmluZCBpdHMgZW5jb2RpbmdzLiAqLworICAgIFRjbF9GaW5kRXhlY3V0YWJsZShQeV9HZXRQcm9ncmFtTmFtZSgpKTsKIAotCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm47CisgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybjsKIAogI2lmIDAKLQkvKiBUaGlzIHdhcyBub3QgYSBnb29kIGlkZWE7IHRocm91Z2ggPERlc3Ryb3k+IGJpbmRpbmdzLAotCSAgIFRjbF9GaW5hbGl6ZSgpIG1heSBpbnZva2UgUHl0aG9uIGNvZGUgYnV0IGF0IHRoYXQgcG9pbnQgdGhlCi0JICAgaW50ZXJwcmV0ZXIgYW5kIHRocmVhZCBzdGF0ZSBoYXZlIGFscmVhZHkgYmVlbiBkZXN0cm95ZWQhICovCi0JUHlfQXRFeGl0KFRjbF9GaW5hbGl6ZSk7CisgICAgLyogVGhpcyB3YXMgbm90IGEgZ29vZCBpZGVhOyB0aHJvdWdoIDxEZXN0cm95PiBiaW5kaW5ncywKKyAgICAgICBUY2xfRmluYWxpemUoKSBtYXkgaW52b2tlIFB5dGhvbiBjb2RlIGJ1dCBhdCB0aGF0IHBvaW50IHRoZQorICAgICAgIGludGVycHJldGVyIGFuZCB0aHJlYWQgc3RhdGUgaGF2ZSBhbHJlYWR5IGJlZW4gZGVzdHJveWVkISAqLworICAgIFB5X0F0RXhpdChUY2xfRmluYWxpemUpOwogI2VuZGlmCiAKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvYWRkcmluZm8uaCBiL01vZHVsZXMvYWRkcmluZm8uaAppbmRleCA2ZjY3YTJlLi42NzBiMTczIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2FkZHJpbmZvLmgKKysrIGIvTW9kdWxlcy9hZGRyaW5mby5oCkBAIC0xLDcgKzEsNyBAQAogLyoKICAqIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgYW5kIDE5OTkgV0lERSBQcm9qZWN0LgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIAorICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCiAgKiBhcmUgbWV0OgpAQCAtMTMsNyArMTMsNyBAQAogICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgcHJvamVjdCBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKICAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQogICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKiAKKyAqCiAgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBQUk9KRUNUIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAogICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCiAgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQpAQCAtNTUsMjAgKzU1LDIwIEBACiAjZGVmaW5lIGdldGFkZHJpbmZvIGZha2VfZ2V0YWRkcmluZm8KICNlbmRpZiAvKiBFQUlfQUREUkZBTUlMWSAqLwogCi0jZGVmaW5lCUVBSV9BRERSRkFNSUxZCSAxCS8qIGFkZHJlc3MgZmFtaWx5IGZvciBob3N0bmFtZSBub3Qgc3VwcG9ydGVkICovCi0jZGVmaW5lCUVBSV9BR0FJTgkgMgkvKiB0ZW1wb3JhcnkgZmFpbHVyZSBpbiBuYW1lIHJlc29sdXRpb24gKi8KLSNkZWZpbmUJRUFJX0JBREZMQUdTCSAzCS8qIGludmFsaWQgdmFsdWUgZm9yIGFpX2ZsYWdzICovCi0jZGVmaW5lCUVBSV9GQUlMCSA0CS8qIG5vbi1yZWNvdmVyYWJsZSBmYWlsdXJlIGluIG5hbWUgcmVzb2x1dGlvbiAqLwotI2RlZmluZQlFQUlfRkFNSUxZCSA1CS8qIGFpX2ZhbWlseSBub3Qgc3VwcG9ydGVkICovCi0jZGVmaW5lCUVBSV9NRU1PUlkJIDYJLyogbWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZSAqLwotI2RlZmluZQlFQUlfTk9EQVRBCSA3CS8qIG5vIGFkZHJlc3MgYXNzb2NpYXRlZCB3aXRoIGhvc3RuYW1lICovCi0jZGVmaW5lCUVBSV9OT05BTUUJIDgJLyogaG9zdG5hbWUgbm9yIHNlcnZuYW1lIHByb3ZpZGVkLCBvciBub3Qga25vd24gKi8KLSNkZWZpbmUJRUFJX1NFUlZJQ0UJIDkJLyogc2Vydm5hbWUgbm90IHN1cHBvcnRlZCBmb3IgYWlfc29ja3R5cGUgKi8KLSNkZWZpbmUJRUFJX1NPQ0tUWVBFCTEwCS8qIGFpX3NvY2t0eXBlIG5vdCBzdXBwb3J0ZWQgKi8KLSNkZWZpbmUJRUFJX1NZU1RFTQkxMQkvKiBzeXN0ZW0gZXJyb3IgcmV0dXJuZWQgaW4gZXJybm8gKi8KLSNkZWZpbmUgRUFJX0JBREhJTlRTCTEyCi0jZGVmaW5lIEVBSV9QUk9UT0NPTAkxMwotI2RlZmluZSBFQUlfTUFYCQkxNAorI2RlZmluZSBFQUlfQUREUkZBTUlMWSAgIDEgICAgICAvKiBhZGRyZXNzIGZhbWlseSBmb3IgaG9zdG5hbWUgbm90IHN1cHBvcnRlZCAqLworI2RlZmluZSBFQUlfQUdBSU4gICAgICAgIDIgICAgICAvKiB0ZW1wb3JhcnkgZmFpbHVyZSBpbiBuYW1lIHJlc29sdXRpb24gKi8KKyNkZWZpbmUgRUFJX0JBREZMQUdTICAgICAzICAgICAgLyogaW52YWxpZCB2YWx1ZSBmb3IgYWlfZmxhZ3MgKi8KKyNkZWZpbmUgRUFJX0ZBSUwgICAgICAgICA0ICAgICAgLyogbm9uLXJlY292ZXJhYmxlIGZhaWx1cmUgaW4gbmFtZSByZXNvbHV0aW9uICovCisjZGVmaW5lIEVBSV9GQU1JTFkgICAgICAgNSAgICAgIC8qIGFpX2ZhbWlseSBub3Qgc3VwcG9ydGVkICovCisjZGVmaW5lIEVBSV9NRU1PUlkgICAgICAgNiAgICAgIC8qIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUgKi8KKyNkZWZpbmUgRUFJX05PREFUQSAgICAgICA3ICAgICAgLyogbm8gYWRkcmVzcyBhc3NvY2lhdGVkIHdpdGggaG9zdG5hbWUgKi8KKyNkZWZpbmUgRUFJX05PTkFNRSAgICAgICA4ICAgICAgLyogaG9zdG5hbWUgbm9yIHNlcnZuYW1lIHByb3ZpZGVkLCBvciBub3Qga25vd24gKi8KKyNkZWZpbmUgRUFJX1NFUlZJQ0UgICAgICA5ICAgICAgLyogc2Vydm5hbWUgbm90IHN1cHBvcnRlZCBmb3IgYWlfc29ja3R5cGUgKi8KKyNkZWZpbmUgRUFJX1NPQ0tUWVBFICAgIDEwICAgICAgLyogYWlfc29ja3R5cGUgbm90IHN1cHBvcnRlZCAqLworI2RlZmluZSBFQUlfU1lTVEVNICAgICAgMTEgICAgICAvKiBzeXN0ZW0gZXJyb3IgcmV0dXJuZWQgaW4gZXJybm8gKi8KKyNkZWZpbmUgRUFJX0JBREhJTlRTICAgIDEyCisjZGVmaW5lIEVBSV9QUk9UT0NPTCAgICAxMworI2RlZmluZSBFQUlfTUFYICAgICAgICAgMTQKIAogLyoKICAqIEZsYWcgdmFsdWVzIGZvciBnZXRhZGRyaW5mbygpCkBAIC04NSwxOCArODUsMTggQEAKICN1bmRlZiBBSV9ERUZBVUxUCiAjZW5kaWYgLyogQUlfUEFTU0lWRSAqLwogCi0jZGVmaW5lCUFJX1BBU1NJVkUJMHgwMDAwMDAwMSAvKiBnZXQgYWRkcmVzcyB0byB1c2UgYmluZCgpICovCi0jZGVmaW5lCUFJX0NBTk9OTkFNRQkweDAwMDAwMDAyIC8qIGZpbGwgYWlfY2Fub25uYW1lICovCi0jZGVmaW5lCUFJX05VTUVSSUNIT1NUCTB4MDAwMDAwMDQgLyogcHJldmVudCBuYW1lIHJlc29sdXRpb24gKi8KKyNkZWZpbmUgQUlfUEFTU0lWRSAgICAgIDB4MDAwMDAwMDEgLyogZ2V0IGFkZHJlc3MgdG8gdXNlIGJpbmQoKSAqLworI2RlZmluZSBBSV9DQU5PTk5BTUUgICAgMHgwMDAwMDAwMiAvKiBmaWxsIGFpX2Nhbm9ubmFtZSAqLworI2RlZmluZSBBSV9OVU1FUklDSE9TVCAgMHgwMDAwMDAwNCAvKiBwcmV2ZW50IG5hbWUgcmVzb2x1dGlvbiAqLwogLyogdmFsaWQgZmxhZ3MgZm9yIGFkZHJpbmZvICovCi0jZGVmaW5lCUFJX01BU0sJCShBSV9QQVNTSVZFIHwgQUlfQ0FOT05OQU1FIHwgQUlfTlVNRVJJQ0hPU1QpCisjZGVmaW5lIEFJX01BU0sgICAgICAgICAoQUlfUEFTU0lWRSB8IEFJX0NBTk9OTkFNRSB8IEFJX05VTUVSSUNIT1NUKQogCi0jZGVmaW5lCUFJX0FMTAkJMHgwMDAwMDEwMCAvKiBJUHY2IGFuZCBJUHY0LW1hcHBlZCAod2l0aCBBSV9WNE1BUFBFRCkgKi8KLSNkZWZpbmUJQUlfVjRNQVBQRURfQ0ZHCTB4MDAwMDAyMDAgLyogYWNjZXB0IElQdjQtbWFwcGVkIGlmIGtlcm5lbCBzdXBwb3J0cyAqLwotI2RlZmluZQlBSV9BRERSQ09ORklHCTB4MDAwMDA0MDAgLyogb25seSBpZiBhbnkgYWRkcmVzcyBpcyBhc3NpZ25lZCAqLwotI2RlZmluZQlBSV9WNE1BUFBFRAkweDAwMDAwODAwIC8qIGFjY2VwdCBJUHY0LW1hcHBlZCBJUHY2IGFkZHJlc3MgKi8KKyNkZWZpbmUgQUlfQUxMICAgICAgICAgIDB4MDAwMDAxMDAgLyogSVB2NiBhbmQgSVB2NC1tYXBwZWQgKHdpdGggQUlfVjRNQVBQRUQpICovCisjZGVmaW5lIEFJX1Y0TUFQUEVEX0NGRyAweDAwMDAwMjAwIC8qIGFjY2VwdCBJUHY0LW1hcHBlZCBpZiBrZXJuZWwgc3VwcG9ydHMgKi8KKyNkZWZpbmUgQUlfQUREUkNPTkZJRyAgIDB4MDAwMDA0MDAgLyogb25seSBpZiBhbnkgYWRkcmVzcyBpcyBhc3NpZ25lZCAqLworI2RlZmluZSBBSV9WNE1BUFBFRCAgICAgMHgwMDAwMDgwMCAvKiBhY2NlcHQgSVB2NC1tYXBwZWQgSVB2NiBhZGRyZXNzICovCiAvKiBzcGVjaWFsIHJlY29tbWVuZGVkIGZsYWdzIGZvciBnZXRpcG5vZGVieW5hbWUgKi8KLSNkZWZpbmUJQUlfREVGQVVMVAkoQUlfVjRNQVBQRURfQ0ZHIHwgQUlfQUREUkNPTkZJRykKKyNkZWZpbmUgQUlfREVGQVVMVCAgICAgIChBSV9WNE1BUFBFRF9DRkcgfCBBSV9BRERSQ09ORklHKQogCiAjZW5kaWYgLyogIUhBVkVfR0VUQUREUklORk8gKi8KIApAQCAtMTA2LDMzICsxMDYsMzMgQEAKICAqIENvbnN0YW50cyBmb3IgZ2V0bmFtZWluZm8oKQogICovCiAjaWZuZGVmIE5JX01BWEhPU1QKLSNkZWZpbmUJTklfTUFYSE9TVAkxMDI1Ci0jZGVmaW5lCU5JX01BWFNFUlYJMzIKKyNkZWZpbmUgTklfTUFYSE9TVCAgICAgIDEwMjUKKyNkZWZpbmUgTklfTUFYU0VSViAgICAgIDMyCiAjZW5kaWYgLyogIU5JX01BWEhPU1QgKi8KIAogLyoKICAqIEZsYWcgdmFsdWVzIGZvciBnZXRuYW1laW5mbygpCiAgKi8KICNpZm5kZWYgTklfTk9GUUROCi0jZGVmaW5lCU5JX05PRlFETgkweDAwMDAwMDAxCi0jZGVmaW5lCU5JX05VTUVSSUNIT1NUCTB4MDAwMDAwMDIKLSNkZWZpbmUJTklfTkFNRVJFUUQJMHgwMDAwMDAwNAotI2RlZmluZQlOSV9OVU1FUklDU0VSVgkweDAwMDAwMDA4Ci0jZGVmaW5lCU5JX0RHUkFNCTB4MDAwMDAwMTAKKyNkZWZpbmUgTklfTk9GUUROICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgTklfTlVNRVJJQ0hPU1QgIDB4MDAwMDAwMDIKKyNkZWZpbmUgTklfTkFNRVJFUUQgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgTklfTlVNRVJJQ1NFUlYgIDB4MDAwMDAwMDgKKyNkZWZpbmUgTklfREdSQU0gICAgICAgIDB4MDAwMDAwMTAKICNlbmRpZiAvKiAhTklfTk9GUUROICovCiAKICNlbmRpZiAvKiAhSEFWRV9HRVROQU1FSU5GTyAqLwogCiAjaWZuZGVmIEhBVkVfQUREUklORk8KIHN0cnVjdCBhZGRyaW5mbyB7Ci0JaW50CWFpX2ZsYWdzOwkvKiBBSV9QQVNTSVZFLCBBSV9DQU5PTk5BTUUgKi8KLQlpbnQJYWlfZmFtaWx5OwkvKiBQRl94eHggKi8KLQlpbnQJYWlfc29ja3R5cGU7CS8qIFNPQ0tfeHh4ICovCi0JaW50CWFpX3Byb3RvY29sOwkvKiAwIG9yIElQUFJPVE9feHh4IGZvciBJUHY0IGFuZCBJUHY2ICovCi0Jc2l6ZV90CWFpX2FkZHJsZW47CS8qIGxlbmd0aCBvZiBhaV9hZGRyICovCi0JY2hhcgkqYWlfY2Fub25uYW1lOwkvKiBjYW5vbmljYWwgbmFtZSBmb3IgaG9zdG5hbWUgKi8KLQlzdHJ1Y3Qgc29ja2FkZHIgKmFpX2FkZHI7CS8qIGJpbmFyeSBhZGRyZXNzICovCi0Jc3RydWN0IGFkZHJpbmZvICphaV9uZXh0OwkvKiBuZXh0IHN0cnVjdHVyZSBpbiBsaW5rZWQgbGlzdCAqLworICAgIGludCAgICAgICAgIGFpX2ZsYWdzOyAgICAgICAvKiBBSV9QQVNTSVZFLCBBSV9DQU5PTk5BTUUgKi8KKyAgICBpbnQgICAgICAgICBhaV9mYW1pbHk7ICAgICAgLyogUEZfeHh4ICovCisgICAgaW50ICAgICAgICAgYWlfc29ja3R5cGU7ICAgIC8qIFNPQ0tfeHh4ICovCisgICAgaW50ICAgICAgICAgYWlfcHJvdG9jb2w7ICAgIC8qIDAgb3IgSVBQUk9UT194eHggZm9yIElQdjQgYW5kIElQdjYgKi8KKyAgICBzaXplX3QgICAgICBhaV9hZGRybGVuOyAgICAgLyogbGVuZ3RoIG9mIGFpX2FkZHIgKi8KKyAgICBjaGFyICAgICAgICAqYWlfY2Fub25uYW1lOyAgLyogY2Fub25pY2FsIG5hbWUgZm9yIGhvc3RuYW1lICovCisgICAgc3RydWN0IHNvY2thZGRyICphaV9hZGRyOyAgICAgICAgICAgLyogYmluYXJ5IGFkZHJlc3MgKi8KKyAgICBzdHJ1Y3QgYWRkcmluZm8gKmFpX25leHQ7ICAgICAgICAgICAvKiBuZXh0IHN0cnVjdHVyZSBpbiBsaW5rZWQgbGlzdCAqLwogfTsKICNlbmRpZiAvKiAhSEFWRV9BRERSSU5GTyAqLwogCkBAIC0xNDAsMzAgKzE0MCwzMCBAQAogLyoKICAqIFJGQyAyNTUzOiBwcm90b2NvbC1pbmRlcGVuZGVudCBwbGFjZWhvbGRlciBmb3Igc29ja2V0IGFkZHJlc3NlcwogICovCi0jZGVmaW5lIF9TU19NQVhTSVpFCTEyOAorI2RlZmluZSBfU1NfTUFYU0laRSAgICAgMTI4CiAjaWZkZWYgSEFWRV9MT05HX0xPTkcKLSNkZWZpbmUgX1NTX0FMSUdOU0laRQkoc2l6ZW9mKFBZX0xPTkdfTE9ORykpCisjZGVmaW5lIF9TU19BTElHTlNJWkUgICAoc2l6ZW9mKFBZX0xPTkdfTE9ORykpCiAjZWxzZQotI2RlZmluZSBfU1NfQUxJR05TSVpFCShzaXplb2YoZG91YmxlKSkKKyNkZWZpbmUgX1NTX0FMSUdOU0laRSAgIChzaXplb2YoZG91YmxlKSkKICNlbmRpZiAvKiBIQVZFX0xPTkdfTE9ORyAqLwotI2RlZmluZSBfU1NfUEFEMVNJWkUJKF9TU19BTElHTlNJWkUgLSBzaXplb2YodV9jaGFyKSAqIDIpCi0jZGVmaW5lIF9TU19QQUQyU0laRQkoX1NTX01BWFNJWkUgLSBzaXplb2YodV9jaGFyKSAqIDIgLSBcCi0JCQkJX1NTX1BBRDFTSVpFIC0gX1NTX0FMSUdOU0laRSkKKyNkZWZpbmUgX1NTX1BBRDFTSVpFICAgIChfU1NfQUxJR05TSVpFIC0gc2l6ZW9mKHVfY2hhcikgKiAyKQorI2RlZmluZSBfU1NfUEFEMlNJWkUgICAgKF9TU19NQVhTSVpFIC0gc2l6ZW9mKHVfY2hhcikgKiAyIC0gXAorICAgICAgICAgICAgICAgIF9TU19QQUQxU0laRSAtIF9TU19BTElHTlNJWkUpCiAKIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIHsKICNpZmRlZiBIQVZFX1NPQ0tBRERSX1NBX0xFTgotCXVuc2lnbmVkIGNoYXIgc3NfbGVuOwkJLyogYWRkcmVzcyBsZW5ndGggKi8KLQl1bnNpZ25lZCBjaGFyIHNzX2ZhbWlseTsJLyogYWRkcmVzcyBmYW1pbHkgKi8KKyAgICB1bnNpZ25lZCBjaGFyIHNzX2xlbjsgICAgICAgICAgICAgICAvKiBhZGRyZXNzIGxlbmd0aCAqLworICAgIHVuc2lnbmVkIGNoYXIgc3NfZmFtaWx5OyAgICAgICAgICAgIC8qIGFkZHJlc3MgZmFtaWx5ICovCiAjZWxzZQotCXVuc2lnbmVkIHNob3J0IHNzX2ZhbWlseTsJLyogYWRkcmVzcyBmYW1pbHkgKi8KKyAgICB1bnNpZ25lZCBzaG9ydCBzc19mYW1pbHk7ICAgICAgICAgICAvKiBhZGRyZXNzIGZhbWlseSAqLwogI2VuZGlmIC8qIEhBVkVfU09DS0FERFJfU0FfTEVOICovCi0JY2hhcglfX3NzX3BhZDFbX1NTX1BBRDFTSVpFXTsKKyAgICBjaGFyICAgICAgICBfX3NzX3BhZDFbX1NTX1BBRDFTSVpFXTsKICNpZmRlZiBIQVZFX0xPTkdfTE9ORwotCVBZX0xPTkdfTE9ORyBfX3NzX2FsaWduOwkvKiBmb3JjZSBkZXNpcmVkIHN0cnVjdHVyZSBzdG9yYWdlIGFsaWdubWVudCAqLworICAgIFBZX0xPTkdfTE9ORyBfX3NzX2FsaWduOyAgICAgICAgICAgIC8qIGZvcmNlIGRlc2lyZWQgc3RydWN0dXJlIHN0b3JhZ2UgYWxpZ25tZW50ICovCiAjZWxzZQotCWRvdWJsZSBfX3NzX2FsaWduOwkvKiBmb3JjZSBkZXNpcmVkIHN0cnVjdHVyZSBzdG9yYWdlIGFsaWdubWVudCAqLworICAgIGRvdWJsZSBfX3NzX2FsaWduOyAgICAgICAgICAvKiBmb3JjZSBkZXNpcmVkIHN0cnVjdHVyZSBzdG9yYWdlIGFsaWdubWVudCAqLwogI2VuZGlmIC8qIEhBVkVfTE9OR19MT05HICovCi0JY2hhcglfX3NzX3BhZDJbX1NTX1BBRDJTSVpFXTsKKyAgICBjaGFyICAgICAgICBfX3NzX3BhZDJbX1NTX1BBRDJTSVpFXTsKIH07CiAjZW5kaWYgLyogIUhBVkVfU09DS0FERFJfU1RPUkFHRSAqLwogCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2FsbW9kdWxlLmMgYi9Nb2R1bGVzL2FsbW9kdWxlLmMKaW5kZXggOTNmMjZiZC4uNjkxMTc1ZSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9hbG1vZHVsZS5jCisrKyBiL01vZHVsZXMvYWxtb2R1bGUuYwpAQCAtMSw1ICsxLDUgQEAKIAotI2RlZmluZSBPTERfSU5URVJGQUNFCQkvKiBkZWZpbmUgZm9yIHByZS1Jcml4IDYgaW50ZXJmYWNlICovCisjZGVmaW5lIE9MRF9JTlRFUkZBQ0UgICAgICAgICAgIC8qIGRlZmluZSBmb3IgcHJlLUlyaXggNiBpbnRlcmZhY2UgKi8KIAogI2luY2x1ZGUgIlB5dGhvbi5oIgogI2luY2x1ZGUgInN0cmluZ29iamVjdC5oIgpAQCAtMTksOSArMTksOSBAQAogLyogRGVjbGFyYXRpb25zIGZvciBvYmplY3RzIG9mIHR5cGUgcG9ydCAqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCS8qIFhYWFggQWRkIHlvdXIgb3duIHN0dWZmIGhlcmUgKi8KLQlBTHBvcnQgcG9ydDsKKyAgICBQeU9iamVjdF9IRUFECisgICAgLyogWFhYWCBBZGQgeW91ciBvd24gc3R1ZmYgaGVyZSAqLworICAgIEFMcG9ydCBwb3J0OwogfSBhbHBvYmplY3Q7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgQWxwdHlwZTsKQEAgLTMzLDkgKzMzLDkgQEAKIC8qIERlY2xhcmF0aW9ucyBmb3Igb2JqZWN0cyBvZiB0eXBlIGNvbmZpZyAqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCS8qIFhYWFggQWRkIHlvdXIgb3duIHN0dWZmIGhlcmUgKi8KLQlBTGNvbmZpZyBjb25maWc7CisgICAgUHlPYmplY3RfSEVBRAorICAgIC8qIFhYWFggQWRkIHlvdXIgb3duIHN0dWZmIGhlcmUgKi8KKyAgICBBTGNvbmZpZyBjb25maWc7CiB9IGFsY29iamVjdDsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBBbGN0eXBlOwpAQCAtNDQsMTk5ICs0NCwxOTkgQEAKIHN0YXRpYyB2b2lkCiBFcnJvckhhbmRsZXIobG9uZyBjb2RlLCBjb25zdCBjaGFyICpmbXQsIC4uLikKIHsKLQl2YV9saXN0IGFyZ3M7Ci0JY2hhciBidWZbMTI4XTsKKyAgICB2YV9saXN0IGFyZ3M7CisgICAgY2hhciBidWZbMTI4XTsKIAotCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7Ci0JdnNwcmludGYoYnVmLCBmbXQsIGFyZ3MpOwotCXZhX2VuZChhcmdzKTsKLQlQeUVycl9TZXRTdHJpbmcoRXJyb3JPYmplY3QsIGJ1Zik7CisgICAgdmFfc3RhcnQoYXJncywgZm10KTsKKyAgICB2c3ByaW50ZihidWYsIGZtdCwgYXJncyk7CisgICAgdmFfZW5kKGFyZ3MpOworICAgIFB5RXJyX1NldFN0cmluZyhFcnJvck9iamVjdCwgYnVmKTsKIH0KIAotI2lmZGVmIEFMX05PX0VMRU0JCS8qIElSSVggNiAqLworI2lmZGVmIEFMX05PX0VMRU0gICAgICAgICAgICAgICAvKiBJUklYIDYgKi8KIAogc3RhdGljIFB5T2JqZWN0ICoKIHBhcmFtMnB5dGhvbihpbnQgcmVzb3VyY2UsIGludCBwYXJhbSwgQUx2YWx1ZSB2YWx1ZSwgQUxwYXJhbUluZm8gKnBpbmZvKQogewotCUFMcGFyYW1JbmZvIGluZm87CisgICAgQUxwYXJhbUluZm8gaW5mbzsKIAotCWlmIChwaW5mbyA9PSBOVUxMKSB7Ci0JCXBpbmZvID0gJmluZm87Ci0JCWlmIChhbEdldFBhcmFtSW5mbyhyZXNvdXJjZSwgcGFyYW0sICZpbmZvKSA8IDApCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0Jc3dpdGNoIChwaW5mby0+ZWxlbWVudFR5cGUpIHsKLQljYXNlIEFMX1BUUl9FTEVNOgotCQkvKiBYWFhYIGRvbid0IGtub3cgaG93IHRvIGhhbmRsZSB0aGlzICovCi0JY2FzZSBBTF9OT19FTEVNOgotCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCXJldHVybiBQeV9Ob25lOwotCWNhc2UgQUxfSU5UMzJfRUxFTToKLQljYXNlIEFMX1JFU09VUkNFX0VMRU06Ci0JY2FzZSBBTF9FTlVNX0VMRU06Ci0JCXJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZykgdmFsdWUuaSk7Ci0JY2FzZSBBTF9JTlQ2NF9FTEVNOgotCQlyZXR1cm4gUHlMb25nX0Zyb21Mb25nTG9uZyh2YWx1ZS5sbCk7Ci0JY2FzZSBBTF9GSVhFRF9FTEVNOgotCQlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKGFsRml4ZWRUb0RvdWJsZSh2YWx1ZS5sbCkpOwotCWNhc2UgQUxfQ0hBUl9FTEVNOgotCQlpZiAodmFsdWUucHRyID09IE5VTEwpIHsKLQkJCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJCXJldHVybiBQeV9Ob25lOwotCQl9Ci0JCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKChjaGFyICopIHZhbHVlLnB0cik7Ci0JZGVmYXVsdDoKLQkJUHlFcnJfU2V0U3RyaW5nKEVycm9yT2JqZWN0LCAidW5rbm93biBlbGVtZW50IHR5cGUiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChwaW5mbyA9PSBOVUxMKSB7CisgICAgICAgIHBpbmZvID0gJmluZm87CisgICAgICAgIGlmIChhbEdldFBhcmFtSW5mbyhyZXNvdXJjZSwgcGFyYW0sICZpbmZvKSA8IDApCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgc3dpdGNoIChwaW5mby0+ZWxlbWVudFR5cGUpIHsKKyAgICBjYXNlIEFMX1BUUl9FTEVNOgorICAgICAgICAvKiBYWFhYIGRvbid0IGtub3cgaG93IHRvIGhhbmRsZSB0aGlzICovCisgICAgY2FzZSBBTF9OT19FTEVNOgorICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIHJldHVybiBQeV9Ob25lOworICAgIGNhc2UgQUxfSU5UMzJfRUxFTToKKyAgICBjYXNlIEFMX1JFU09VUkNFX0VMRU06CisgICAgY2FzZSBBTF9FTlVNX0VMRU06CisgICAgICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZykgdmFsdWUuaSk7CisgICAgY2FzZSBBTF9JTlQ2NF9FTEVNOgorICAgICAgICByZXR1cm4gUHlMb25nX0Zyb21Mb25nTG9uZyh2YWx1ZS5sbCk7CisgICAgY2FzZSBBTF9GSVhFRF9FTEVNOgorICAgICAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKGFsRml4ZWRUb0RvdWJsZSh2YWx1ZS5sbCkpOworICAgIGNhc2UgQUxfQ0hBUl9FTEVNOgorICAgICAgICBpZiAodmFsdWUucHRyID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgICAgIHJldHVybiBQeV9Ob25lOworICAgICAgICB9CisgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKChjaGFyICopIHZhbHVlLnB0cik7CisgICAgZGVmYXVsdDoKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEVycm9yT2JqZWN0LCAidW5rbm93biBlbGVtZW50IHR5cGUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogfQogCiBzdGF0aWMgaW50CiBweXRob24yZWxlbShQeU9iamVjdCAqaXRlbSwgdm9pZCAqcHRyLCBpbnQgZWxlbWVudFR5cGUpCiB7Ci0Jc3dpdGNoIChlbGVtZW50VHlwZSkgewotCWNhc2UgQUxfSU5UMzJfRUxFTToKLQljYXNlIEFMX1JFU09VUkNFX0VMRU06Ci0JY2FzZSBBTF9FTlVNX0VMRU06Ci0JCWlmICghUHlJbnRfQ2hlY2soaXRlbSkpIHsKLQkJCVB5RXJyX0JhZEFyZ3VtZW50KCk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJKigoaW50ICopIHB0cikgPSBQeUludF9Bc0xvbmcoaXRlbSk7Ci0JCWJyZWFrOwotCWNhc2UgQUxfSU5UNjRfRUxFTToKLQkJaWYgKFB5SW50X0NoZWNrKGl0ZW0pKQotCQkJKigobG9uZyBsb25nICopIHB0cikgPSBQeUludF9Bc0xvbmcoaXRlbSk7Ci0JCWVsc2UgaWYgKFB5TG9uZ19DaGVjayhpdGVtKSkKLQkJCSooKGxvbmcgbG9uZyAqKSBwdHIpID0gUHlMb25nX0FzTG9uZ0xvbmcoaXRlbSk7Ci0JCWVsc2UgewotCQkJUHlFcnJfQmFkQXJndW1lbnQoKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlicmVhazsKLQljYXNlIEFMX0ZJWEVEX0VMRU06Ci0JCWlmIChQeUludF9DaGVjayhpdGVtKSkKLQkJCSooKGxvbmcgbG9uZyAqKSBwdHIpID0gYWxEb3VibGVUb0ZpeGVkKChkb3VibGUpIFB5SW50X0FzTG9uZyhpdGVtKSk7Ci0JCWVsc2UgaWYgKFB5RmxvYXRfQ2hlY2soaXRlbSkpCi0JCQkqKChsb25nIGxvbmcgKikgcHRyKSA9IGFsRG91YmxlVG9GaXhlZChQeUZsb2F0X0FzRG91YmxlKGl0ZW0pKTsKLQkJZWxzZSB7Ci0JCQlQeUVycl9CYWRBcmd1bWVudCgpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCVB5RXJyX1NldFN0cmluZyhFcnJvck9iamVjdCwgInVua25vd24gZWxlbWVudCB0eXBlIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JcmV0dXJuIDA7CisgICAgc3dpdGNoIChlbGVtZW50VHlwZSkgeworICAgIGNhc2UgQUxfSU5UMzJfRUxFTToKKyAgICBjYXNlIEFMX1JFU09VUkNFX0VMRU06CisgICAgY2FzZSBBTF9FTlVNX0VMRU06CisgICAgICAgIGlmICghUHlJbnRfQ2hlY2soaXRlbSkpIHsKKyAgICAgICAgICAgIFB5RXJyX0JhZEFyZ3VtZW50KCk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgKigoaW50ICopIHB0cikgPSBQeUludF9Bc0xvbmcoaXRlbSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQUxfSU5UNjRfRUxFTToKKyAgICAgICAgaWYgKFB5SW50X0NoZWNrKGl0ZW0pKQorICAgICAgICAgICAgKigobG9uZyBsb25nICopIHB0cikgPSBQeUludF9Bc0xvbmcoaXRlbSk7CisgICAgICAgIGVsc2UgaWYgKFB5TG9uZ19DaGVjayhpdGVtKSkKKyAgICAgICAgICAgICooKGxvbmcgbG9uZyAqKSBwdHIpID0gUHlMb25nX0FzTG9uZ0xvbmcoaXRlbSk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgUHlFcnJfQmFkQXJndW1lbnQoKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEFMX0ZJWEVEX0VMRU06CisgICAgICAgIGlmIChQeUludF9DaGVjayhpdGVtKSkKKyAgICAgICAgICAgICooKGxvbmcgbG9uZyAqKSBwdHIpID0gYWxEb3VibGVUb0ZpeGVkKChkb3VibGUpIFB5SW50X0FzTG9uZyhpdGVtKSk7CisgICAgICAgIGVsc2UgaWYgKFB5RmxvYXRfQ2hlY2soaXRlbSkpCisgICAgICAgICAgICAqKChsb25nIGxvbmcgKikgcHRyKSA9IGFsRG91YmxlVG9GaXhlZChQeUZsb2F0X0FzRG91YmxlKGl0ZW0pKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBQeUVycl9CYWRBcmd1bWVudCgpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhFcnJvck9iamVjdCwgInVua25vd24gZWxlbWVudCB0eXBlIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIHB5dGhvbjJwYXJhbShpbnQgcmVzb3VyY2UsIEFMcHYgKnBhcmFtLCBQeU9iamVjdCAqdmFsdWUsIEFMcGFyYW1JbmZvICpwaW5mbykKIHsKLQlBTHBhcmFtSW5mbyBpbmZvOwotCWludCBpLCBzdGVwc2l6ZTsKLQlQeU9iamVjdCAqaXRlbTsKKyAgICBBTHBhcmFtSW5mbyBpbmZvOworICAgIGludCBpLCBzdGVwc2l6ZTsKKyAgICBQeU9iamVjdCAqaXRlbTsKIAotCWlmIChwaW5mbyA9PSBOVUxMKSB7Ci0JCXBpbmZvID0gJmluZm87Ci0JCWlmIChhbEdldFBhcmFtSW5mbyhyZXNvdXJjZSwgcGFyYW0tPnBhcmFtLCAmaW5mbykgPCAwKQotCQkJcmV0dXJuIC0xOwotCX0KLQlzd2l0Y2ggKHBpbmZvLT52YWx1ZVR5cGUpIHsKLQljYXNlIEFMX1NUUklOR19WQUw6Ci0JCWlmIChwaW5mby0+ZWxlbWVudFR5cGUgIT0gQUxfQ0hBUl9FTEVNKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoRXJyb3JPYmplY3QsICJ1bmtub3duIGVsZW1lbnQgdHlwZSIpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWlmICghUHlTdHJpbmdfQ2hlY2sodmFsdWUpKSB7Ci0JCQlQeUVycl9CYWRBcmd1bWVudCgpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCXBhcmFtLT52YWx1ZS5wdHIgPSBQeVN0cmluZ19BU19TVFJJTkcodmFsdWUpOwotCQlwYXJhbS0+c2l6ZUluID0gUHlTdHJpbmdfR0VUX1NJWkUodmFsdWUpKzE7IC8qYWNjb3VudCBmb3IgTlVMKi8KLQkJYnJlYWs7Ci0JY2FzZSBBTF9TRVRfVkFMOgotCWNhc2UgQUxfVkVDVE9SX1ZBTDoKLQkJaWYgKCFQeUxpc3RfQ2hlY2sodmFsdWUpICYmICFQeVR1cGxlX0NoZWNrKHZhbHVlKSkgewotCQkJUHlFcnJfQmFkQXJndW1lbnQoKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlzd2l0Y2ggKHBpbmZvLT5lbGVtZW50VHlwZSkgewotCQljYXNlIEFMX0lOVDMyX0VMRU06Ci0JCWNhc2UgQUxfUkVTT1VSQ0VfRUxFTToKLQkJY2FzZSBBTF9FTlVNX0VMRU06Ci0JCQlwYXJhbS0+c2l6ZUluID0gUHlTZXF1ZW5jZV9TaXplKHZhbHVlKTsKLQkJCXBhcmFtLT52YWx1ZS5wdHIgPSBQeU1lbV9ORVcoaW50LCBwYXJhbS0+c2l6ZUluKTsKLQkJCXN0ZXBzaXplID0gc2l6ZW9mKGludCk7Ci0JCQlicmVhazsKLQkJY2FzZSBBTF9JTlQ2NF9FTEVNOgotCQljYXNlIEFMX0ZJWEVEX0VMRU06Ci0JCQlwYXJhbS0+c2l6ZUluID0gUHlTZXF1ZW5jZV9TaXplKHZhbHVlKTsKLQkJCXBhcmFtLT52YWx1ZS5wdHIgPSBQeU1lbV9ORVcobG9uZyBsb25nLCBwYXJhbS0+c2l6ZUluKTsKLQkJCXN0ZXBzaXplID0gc2l6ZW9mKGxvbmcgbG9uZyk7Ci0JCQlicmVhazsKLQkJfQotCQlmb3IgKGkgPSAwOyBpIDwgcGFyYW0tPnNpemVJbjsgaSsrKSB7Ci0JCQlpdGVtID0gUHlTZXF1ZW5jZV9HZXRJdGVtKHZhbHVlLCBpKTsKLQkJCWlmIChweXRob24yZWxlbShpdGVtLCAodm9pZCAqKSAoKGNoYXIgKikgcGFyYW0tPnZhbHVlLnB0ciArIGkqc3RlcHNpemUpLCBwaW5mby0+ZWxlbWVudFR5cGUpIDwgMCkgewotCQkJCVB5TWVtX0RFTChwYXJhbS0+dmFsdWUucHRyKTsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBBTF9TQ0FMQVJfVkFMOgotCQlzd2l0Y2ggKHBpbmZvLT5lbGVtZW50VHlwZSkgewotCQljYXNlIEFMX0lOVDMyX0VMRU06Ci0JCWNhc2UgQUxfUkVTT1VSQ0VfRUxFTToKLQkJY2FzZSBBTF9FTlVNX0VMRU06Ci0JCQlyZXR1cm4gcHl0aG9uMmVsZW0odmFsdWUsICh2b2lkICopICZwYXJhbS0+dmFsdWUuaSwKLQkJCQkJICAgcGluZm8tPmVsZW1lbnRUeXBlKTsKLQkJY2FzZSBBTF9JTlQ2NF9FTEVNOgotCQljYXNlIEFMX0ZJWEVEX0VMRU06Ci0JCQlyZXR1cm4gcHl0aG9uMmVsZW0odmFsdWUsICh2b2lkICopICZwYXJhbS0+dmFsdWUubGwsCi0JCQkJCSAgIHBpbmZvLT5lbGVtZW50VHlwZSk7Ci0JCWRlZmF1bHQ6Ci0JCQlQeUVycl9TZXRTdHJpbmcoRXJyb3JPYmplY3QsICJ1bmtub3duIGVsZW1lbnQgdHlwZSIpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQotCXJldHVybiAwOworICAgIGlmIChwaW5mbyA9PSBOVUxMKSB7CisgICAgICAgIHBpbmZvID0gJmluZm87CisgICAgICAgIGlmIChhbEdldFBhcmFtSW5mbyhyZXNvdXJjZSwgcGFyYW0tPnBhcmFtLCAmaW5mbykgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBzd2l0Y2ggKHBpbmZvLT52YWx1ZVR5cGUpIHsKKyAgICBjYXNlIEFMX1NUUklOR19WQUw6CisgICAgICAgIGlmIChwaW5mby0+ZWxlbWVudFR5cGUgIT0gQUxfQ0hBUl9FTEVNKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoRXJyb3JPYmplY3QsICJ1bmtub3duIGVsZW1lbnQgdHlwZSIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGlmICghUHlTdHJpbmdfQ2hlY2sodmFsdWUpKSB7CisgICAgICAgICAgICBQeUVycl9CYWRBcmd1bWVudCgpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIHBhcmFtLT52YWx1ZS5wdHIgPSBQeVN0cmluZ19BU19TVFJJTkcodmFsdWUpOworICAgICAgICBwYXJhbS0+c2l6ZUluID0gUHlTdHJpbmdfR0VUX1NJWkUodmFsdWUpKzE7IC8qYWNjb3VudCBmb3IgTlVMKi8KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBTF9TRVRfVkFMOgorICAgIGNhc2UgQUxfVkVDVE9SX1ZBTDoKKyAgICAgICAgaWYgKCFQeUxpc3RfQ2hlY2sodmFsdWUpICYmICFQeVR1cGxlX0NoZWNrKHZhbHVlKSkgeworICAgICAgICAgICAgUHlFcnJfQmFkQXJndW1lbnQoKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKHBpbmZvLT5lbGVtZW50VHlwZSkgeworICAgICAgICBjYXNlIEFMX0lOVDMyX0VMRU06CisgICAgICAgIGNhc2UgQUxfUkVTT1VSQ0VfRUxFTToKKyAgICAgICAgY2FzZSBBTF9FTlVNX0VMRU06CisgICAgICAgICAgICBwYXJhbS0+c2l6ZUluID0gUHlTZXF1ZW5jZV9TaXplKHZhbHVlKTsKKyAgICAgICAgICAgIHBhcmFtLT52YWx1ZS5wdHIgPSBQeU1lbV9ORVcoaW50LCBwYXJhbS0+c2l6ZUluKTsKKyAgICAgICAgICAgIHN0ZXBzaXplID0gc2l6ZW9mKGludCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBTF9JTlQ2NF9FTEVNOgorICAgICAgICBjYXNlIEFMX0ZJWEVEX0VMRU06CisgICAgICAgICAgICBwYXJhbS0+c2l6ZUluID0gUHlTZXF1ZW5jZV9TaXplKHZhbHVlKTsKKyAgICAgICAgICAgIHBhcmFtLT52YWx1ZS5wdHIgPSBQeU1lbV9ORVcobG9uZyBsb25nLCBwYXJhbS0+c2l6ZUluKTsKKyAgICAgICAgICAgIHN0ZXBzaXplID0gc2l6ZW9mKGxvbmcgbG9uZyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcGFyYW0tPnNpemVJbjsgaSsrKSB7CisgICAgICAgICAgICBpdGVtID0gUHlTZXF1ZW5jZV9HZXRJdGVtKHZhbHVlLCBpKTsKKyAgICAgICAgICAgIGlmIChweXRob24yZWxlbShpdGVtLCAodm9pZCAqKSAoKGNoYXIgKikgcGFyYW0tPnZhbHVlLnB0ciArIGkqc3RlcHNpemUpLCBwaW5mby0+ZWxlbWVudFR5cGUpIDwgMCkgeworICAgICAgICAgICAgICAgIFB5TWVtX0RFTChwYXJhbS0+dmFsdWUucHRyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBTF9TQ0FMQVJfVkFMOgorICAgICAgICBzd2l0Y2ggKHBpbmZvLT5lbGVtZW50VHlwZSkgeworICAgICAgICBjYXNlIEFMX0lOVDMyX0VMRU06CisgICAgICAgIGNhc2UgQUxfUkVTT1VSQ0VfRUxFTToKKyAgICAgICAgY2FzZSBBTF9FTlVNX0VMRU06CisgICAgICAgICAgICByZXR1cm4gcHl0aG9uMmVsZW0odmFsdWUsICh2b2lkICopICZwYXJhbS0+dmFsdWUuaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaW5mby0+ZWxlbWVudFR5cGUpOworICAgICAgICBjYXNlIEFMX0lOVDY0X0VMRU06CisgICAgICAgIGNhc2UgQUxfRklYRURfRUxFTToKKyAgICAgICAgICAgIHJldHVybiBweXRob24yZWxlbSh2YWx1ZSwgKHZvaWQgKikgJnBhcmFtLT52YWx1ZS5sbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaW5mby0+ZWxlbWVudFR5cGUpOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEVycm9yT2JqZWN0LCAidW5rbm93biBlbGVtZW50IHR5cGUiKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogcHl0aG9uMnBhcmFtcyhpbnQgcmVzb3VyY2UxLCBpbnQgcmVzb3VyY2UyLCBQeU9iamVjdCAqbGlzdCwgQUxwdiAqKnB2c3AsIEFMcGFyYW1JbmZvICoqcGluZm9wKQogewotCVB5T2JqZWN0ICppdGVtOwotCUFMcHYgKnB2czsKLQlBTHBhcmFtSW5mbyAqcGluZm87Ci0JaW50IG5wdnMsIGk7CisgICAgUHlPYmplY3QgKml0ZW07CisgICAgQUxwdiAqcHZzOworICAgIEFMcGFyYW1JbmZvICpwaW5mbzsKKyAgICBpbnQgbnB2cywgaTsKIAotCW5wdnMgPSBQeUxpc3RfU2l6ZShsaXN0KTsKLQlwdnMgPSBQeU1lbV9ORVcoQUxwdiwgbnB2cyk7Ci0JcGluZm8gPSBQeU1lbV9ORVcoQUxwYXJhbUluZm8sIG5wdnMpOwotCWZvciAoaSA9IDA7IGkgPCBucHZzOyBpKyspIHsKLQkJaXRlbSA9IFB5TGlzdF9HZXRJdGVtKGxpc3QsIGkpOwotCQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoaXRlbSwgImlPIiwgJnB2c1tpXS5wYXJhbSwgJml0ZW0pKQotCQkJZ290byBlcnJvcjsKLQkJaWYgKGFsR2V0UGFyYW1JbmZvKHJlc291cmNlMSwgcHZzW2ldLnBhcmFtLCAmcGluZm9baV0pIDwgMCAmJgotCQkgICAgYWxHZXRQYXJhbUluZm8ocmVzb3VyY2UyLCBwdnNbaV0ucGFyYW0sICZwaW5mb1tpXSkgPCAwKQotCQkJZ290byBlcnJvcjsKLQkJaWYgKHB5dGhvbjJwYXJhbShyZXNvdXJjZTEsICZwdnNbaV0sIGl0ZW0sICZwaW5mb1tpXSkgPCAwKQotCQkJZ290byBlcnJvcjsKLQl9CisgICAgbnB2cyA9IFB5TGlzdF9TaXplKGxpc3QpOworICAgIHB2cyA9IFB5TWVtX05FVyhBTHB2LCBucHZzKTsKKyAgICBwaW5mbyA9IFB5TWVtX05FVyhBTHBhcmFtSW5mbywgbnB2cyk7CisgICAgZm9yIChpID0gMDsgaSA8IG5wdnM7IGkrKykgeworICAgICAgICBpdGVtID0gUHlMaXN0X0dldEl0ZW0obGlzdCwgaSk7CisgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShpdGVtLCAiaU8iLCAmcHZzW2ldLnBhcmFtLCAmaXRlbSkpCisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICBpZiAoYWxHZXRQYXJhbUluZm8ocmVzb3VyY2UxLCBwdnNbaV0ucGFyYW0sICZwaW5mb1tpXSkgPCAwICYmCisgICAgICAgICAgICBhbEdldFBhcmFtSW5mbyhyZXNvdXJjZTIsIHB2c1tpXS5wYXJhbSwgJnBpbmZvW2ldKSA8IDApCisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICBpZiAocHl0aG9uMnBhcmFtKHJlc291cmNlMSwgJnB2c1tpXSwgaXRlbSwgJnBpbmZvW2ldKSA8IDApCisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgIH0KIAotCSpwdnNwID0gcHZzOwotCSpwaW5mb3AgPSBwaW5mbzsKLQlyZXR1cm4gbnB2czsKKyAgICAqcHZzcCA9IHB2czsKKyAgICAqcGluZm9wID0gcGluZm87CisgICAgcmV0dXJuIG5wdnM7CiAKICAgZXJyb3I6Ci0JLyogWFhYWCB3ZSBzaG91bGQgY2xlYW4gdXAgZXZlcnl0aGluZyAqLwotCWlmIChwdnMpCi0JCVB5TWVtX0RFTChwdnMpOwotCWlmIChwaW5mbykKLQkJUHlNZW1fREVMKHBpbmZvKTsKLQlyZXR1cm4gLTE7CisgICAgLyogWFhYWCB3ZSBzaG91bGQgY2xlYW4gdXAgZXZlcnl0aGluZyAqLworICAgIGlmIChwdnMpCisgICAgICAgIFB5TWVtX0RFTChwdnMpOworICAgIGlmIChwaW5mbykKKyAgICAgICAgUHlNZW1fREVMKHBpbmZvKTsKKyAgICByZXR1cm4gLTE7CiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0yNDUsMzAgKzI0NSwzMCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIFNldENvbmZpZyhhbGNvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBpbnQgKCpmdW5jKShBTGNvbmZpZywgaW50KSkKIHsKLQlpbnQgcGFyOworICAgIGludCBwYXI7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6U2V0Q29uZmlnIiwgJnBhcikpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpTZXRDb25maWciLCAmcGFyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoKCpmdW5jKShzZWxmLT5jb25maWcsIHBhcikgPT0gLTEpCi0JCXJldHVybiBOVUxMOworICAgIGlmICgoKmZ1bmMpKHNlbGYtPmNvbmZpZywgcGFyKSA9PSAtMSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogR2V0Q29uZmlnKGFsY29iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIGludCAoKmZ1bmMpKEFMY29uZmlnKSkKLXsJCi0JaW50IHBhcjsKK3sKKyAgICBpbnQgcGFyOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6R2V0Q29uZmlnIikpCi0JCXJldHVybiBOVUxMOwotCQotCWlmICgocGFyID0gKCpmdW5jKShzZWxmLT5jb25maWcpKSA9PSAtMSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6R2V0Q29uZmlnIikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKSBwYXIpOworICAgIGlmICgocGFyID0gKCpmdW5jKShzZWxmLT5jb25maWcpKSA9PSAtMSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIHBhcik7CiB9CiAKIFB5RG9jX1NUUlZBUihhbGNfU2V0V2lkdGhfX2RvY19fLApAQCAtMjc3LDcgKzI3Nyw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYWxjX1NldFdpZHRoKGFsY29iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIFNldENvbmZpZyhzZWxmLCBhcmdzLCBhbFNldFdpZHRoKTsKKyAgICByZXR1cm4gU2V0Q29uZmlnKHNlbGYsIGFyZ3MsIGFsU2V0V2lkdGgpOwogfQogCiAKQEAgLTI4Nyw3ICsyODcsNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGFsY19HZXRXaWR0aChhbGNvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBHZXRDb25maWcoc2VsZiwgYXJncywgYWxHZXRXaWR0aCk7CisgICAgcmV0dXJuIEdldENvbmZpZyhzZWxmLCBhcmdzLCBhbEdldFdpZHRoKTsKIH0KIAogCkBAIC0yOTgsNyArMjk4LDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBhbGNfU2V0U2FtcEZtdChhbGNvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBTZXRDb25maWcoc2VsZiwgYXJncywgYWxTZXRTYW1wRm10KTsKKyAgICByZXR1cm4gU2V0Q29uZmlnKHNlbGYsIGFyZ3MsIGFsU2V0U2FtcEZtdCk7CiB9CiAKIApAQCAtMzA5LDcgKzMwOSw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYWxjX0dldFNhbXBGbXQoYWxjb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gR2V0Q29uZmlnKHNlbGYsIGFyZ3MsIGFsR2V0U2FtcEZtdCk7CisgICAgcmV0dXJuIEdldENvbmZpZyhzZWxmLCBhcmdzLCBhbEdldFNhbXBGbXQpOwogfQogCiAKQEAgLTMxOSw3ICszMTksNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGFsY19TZXRDaGFubmVscyhhbGNvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBTZXRDb25maWcoc2VsZiwgYXJncywgYWxTZXRDaGFubmVscyk7CisgICAgcmV0dXJuIFNldENvbmZpZyhzZWxmLCBhcmdzLCBhbFNldENoYW5uZWxzKTsKIH0KIAogCkBAIC0zMjksNyArMzI5LDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBhbGNfR2V0Q2hhbm5lbHMoYWxjb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gR2V0Q29uZmlnKHNlbGYsIGFyZ3MsIGFsR2V0Q2hhbm5lbHMpOworICAgIHJldHVybiBHZXRDb25maWcoc2VsZiwgYXJncywgYWxHZXRDaGFubmVscyk7CiB9CiAKIApAQCAtMzM5LDE0ICszMzksMTQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBhbGNfU2V0RmxvYXRNYXgoYWxjb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlkb3VibGUgbWF4aW11bV92YWx1ZTsKKyAgICBkb3VibGUgbWF4aW11bV92YWx1ZTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiZDpTZXRGbG9hdE1heCIsICZtYXhpbXVtX3ZhbHVlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKGFsU2V0RmxvYXRNYXgoc2VsZi0+Y29uZmlnLCBtYXhpbXVtX3ZhbHVlKSA8IDApCi0JCXJldHVybiBOVUxMOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImQ6U2V0RmxvYXRNYXgiLCAmbWF4aW11bV92YWx1ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChhbFNldEZsb2F0TWF4KHNlbGYtPmNvbmZpZywgbWF4aW11bV92YWx1ZSkgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIApAQCAtMzU2LDEzICszNTYsMTMgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBhbGNfR2V0RmxvYXRNYXgoYWxjb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlkb3VibGUgbWF4aW11bV92YWx1ZTsKKyAgICBkb3VibGUgbWF4aW11bV92YWx1ZTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOkdldEZsb2F0TWF4IikpCi0JCXJldHVybiBOVUxMOwotCWlmICgobWF4aW11bV92YWx1ZSA9IGFsR2V0RmxvYXRNYXgoc2VsZi0+Y29uZmlnKSkgPT0gMCkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShtYXhpbXVtX3ZhbHVlKTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpHZXRGbG9hdE1heCIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoKG1heGltdW1fdmFsdWUgPSBhbEdldEZsb2F0TWF4KHNlbGYtPmNvbmZpZykpID09IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUobWF4aW11bV92YWx1ZSk7CiB9CiAKIApAQCAtMzcyLDcgKzM3Miw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYWxjX1NldERldmljZShhbGNvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBTZXRDb25maWcoc2VsZiwgYXJncywgYWxTZXREZXZpY2UpOworICAgIHJldHVybiBTZXRDb25maWcoc2VsZiwgYXJncywgYWxTZXREZXZpY2UpOwogfQogCiAKQEAgLTM4Miw3ICszODIsNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGFsY19HZXREZXZpY2UoYWxjb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gR2V0Q29uZmlnKHNlbGYsIGFyZ3MsIGFsR2V0RGV2aWNlKTsKKyAgICByZXR1cm4gR2V0Q29uZmlnKHNlbGYsIGFyZ3MsIGFsR2V0RGV2aWNlKTsKIH0KIAogCkBAIC0zOTIsNyArMzkyLDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBhbGNfU2V0UXVldWVTaXplKGFsY29iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIFNldENvbmZpZyhzZWxmLCBhcmdzLCBhbFNldFF1ZXVlU2l6ZSk7CisgICAgcmV0dXJuIFNldENvbmZpZyhzZWxmLCBhcmdzLCBhbFNldFF1ZXVlU2l6ZSk7CiB9CiAKIApAQCAtNDAyLDcgKzQwMiw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYWxjX0dldFF1ZXVlU2l6ZShhbGNvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBHZXRDb25maWcoc2VsZiwgYXJncywgYWxHZXRRdWV1ZVNpemUpOworICAgIHJldHVybiBHZXRDb25maWcoc2VsZiwgYXJncywgYWxHZXRRdWV1ZVNpemUpOwogfQogCiAjZW5kaWYgLyogQUxfTk9fRUxFTSAqLwpAQCAtNDEwLDY2ICs0MTAsNjYgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZXRjb25maWcoYWxjb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgaW50ICgqZnVuYykoQUxjb25maWcsIGxvbmcpKQogewotCWxvbmcgcGFyOworICAgIGxvbmcgcGFyOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsOlNldENvbmZpZyIsICZwYXIpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImw6U2V0Q29uZmlnIiwgJnBhcikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKCgqZnVuYykoc2VsZi0+Y29uZmlnLCBwYXIpID09IC0xKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoKCpmdW5jKShzZWxmLT5jb25maWcsIHBhcikgPT0gLTEpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGdldGNvbmZpZyhhbGNvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBsb25nICgqZnVuYykoQUxjb25maWcpKQotewkKLQlsb25nIHBhcjsKK3sKKyAgICBsb25nIHBhcjsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOkdldENvbmZpZyIpKQotCQlyZXR1cm4gTlVMTDsKLQkKLQlpZiAoKHBhciA9ICgqZnVuYykoc2VsZi0+Y29uZmlnKSkgPT0gLTEpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOkdldENvbmZpZyIpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZykgcGFyKTsKKyAgICBpZiAoKHBhciA9ICgqZnVuYykoc2VsZi0+Y29uZmlnKSkgPT0gLTEpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKSBwYXIpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYWxjX3NldHF1ZXVlc2l6ZSAoYWxjb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gc2V0Y29uZmlnKHNlbGYsIGFyZ3MsIEFMc2V0cXVldWVzaXplKTsKKyAgICByZXR1cm4gc2V0Y29uZmlnKHNlbGYsIGFyZ3MsIEFMc2V0cXVldWVzaXplKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGFsY19nZXRxdWV1ZXNpemUgKGFsY29iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGdldGNvbmZpZyhzZWxmLCBhcmdzLCBBTGdldHF1ZXVlc2l6ZSk7CisgICAgcmV0dXJuIGdldGNvbmZpZyhzZWxmLCBhcmdzLCBBTGdldHF1ZXVlc2l6ZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhbGNfc2V0d2lkdGggKGFsY29iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIHNldGNvbmZpZyhzZWxmLCBhcmdzLCBBTHNldHdpZHRoKTsKKyAgICByZXR1cm4gc2V0Y29uZmlnKHNlbGYsIGFyZ3MsIEFMc2V0d2lkdGgpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYWxjX2dldHdpZHRoIChhbGNvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBnZXRjb25maWcoc2VsZiwgYXJncywgQUxnZXR3aWR0aCk7CQorICAgIHJldHVybiBnZXRjb25maWcoc2VsZiwgYXJncywgQUxnZXR3aWR0aCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhbGNfZ2V0Y2hhbm5lbHMgKGFsY29iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGdldGNvbmZpZyhzZWxmLCBhcmdzLCBBTGdldGNoYW5uZWxzKTsJCisgICAgcmV0dXJuIGdldGNvbmZpZyhzZWxmLCBhcmdzLCBBTGdldGNoYW5uZWxzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGFsY19zZXRjaGFubmVscyAoYWxjb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gc2V0Y29uZmlnKHNlbGYsIGFyZ3MsIEFMc2V0Y2hhbm5lbHMpOworICAgIHJldHVybiBzZXRjb25maWcoc2VsZiwgYXJncywgQUxzZXRjaGFubmVscyk7CiB9CiAKICNpZmRlZiBBTF80MDUKQEAgLTQ3Nyw3MCArNDc3LDcwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogYWxjX2dldHNhbXBmbXQgKGFsY29iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGdldGNvbmZpZyhzZWxmLCBhcmdzLCBBTGdldHNhbXBmbXQpOwkKKyAgICByZXR1cm4gZ2V0Y29uZmlnKHNlbGYsIGFyZ3MsIEFMZ2V0c2FtcGZtdCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhbGNfc2V0c2FtcGZtdCAoYWxjb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gc2V0Y29uZmlnKHNlbGYsIGFyZ3MsIEFMc2V0c2FtcGZtdCk7CisgICAgcmV0dXJuIHNldGNvbmZpZyhzZWxmLCBhcmdzLCBBTHNldHNhbXBmbXQpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYWxjX2dldGZsb2F0bWF4KGFsY29iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZG91YmxlIGFyZzsKKyAgICBkb3VibGUgYXJnOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6R2V0RmxvYXRNYXgiKSkKLQkJcmV0dXJuIDA7Ci0JaWYgKChhcmcgPSBBTGdldGZsb2F0bWF4KHNlbGYtPmNvbmZpZykpID09IDApCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoYXJnKTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpHZXRGbG9hdE1heCIpKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoKGFyZyA9IEFMZ2V0ZmxvYXRtYXgoc2VsZi0+Y29uZmlnKSkgPT0gMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShhcmcpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYWxjX3NldGZsb2F0bWF4KGFsY29iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZG91YmxlIGFyZzsKKyAgICBkb3VibGUgYXJnOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJkOlNldEZsb2F0TWF4IiwgJmFyZykpCi0JCXJldHVybiAwOwotCWlmIChBTHNldGZsb2F0bWF4KHNlbGYtPmNvbmZpZywgYXJnKSA9PSAtMSkKLQkJcmV0dXJuIE5VTEw7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiZDpTZXRGbG9hdE1heCIsICZhcmcpKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoQUxzZXRmbG9hdG1heChzZWxmLT5jb25maWcsIGFyZykgPT0gLTEpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KICNlbmRpZiAvKiBBTF80MDUgKi8KLQkKKwogc3RhdGljIHN0cnVjdCBQeU1ldGhvZERlZiBhbGNfbWV0aG9kc1tdID0gewotI2lmZGVmIEFMX05PX0VMRU0JCS8qIElSSVggNiAqLwotCXsiU2V0V2lkdGgiLAkoUHlDRnVuY3Rpb24pYWxjX1NldFdpZHRoLAlNRVRIX1ZBUkFSR1MsCWFsY19TZXRXaWR0aF9fZG9jX199LAotCXsiR2V0V2lkdGgiLAkoUHlDRnVuY3Rpb24pYWxjX0dldFdpZHRoLAlNRVRIX1ZBUkFSR1MsCWFsY19HZXRXaWR0aF9fZG9jX199LAotCXsiU2V0U2FtcEZtdCIsCShQeUNGdW5jdGlvbilhbGNfU2V0U2FtcEZtdCwJTUVUSF9WQVJBUkdTLAlhbGNfU2V0U2FtcEZtdF9fZG9jX199LAotCXsiR2V0U2FtcEZtdCIsCShQeUNGdW5jdGlvbilhbGNfR2V0U2FtcEZtdCwJTUVUSF9WQVJBUkdTLAlhbGNfR2V0U2FtcEZtdF9fZG9jX199LAotCXsiU2V0Q2hhbm5lbHMiLAkoUHlDRnVuY3Rpb24pYWxjX1NldENoYW5uZWxzLAlNRVRIX1ZBUkFSR1MsCWFsY19TZXRDaGFubmVsc19fZG9jX199LAotCXsiR2V0Q2hhbm5lbHMiLAkoUHlDRnVuY3Rpb24pYWxjX0dldENoYW5uZWxzLAlNRVRIX1ZBUkFSR1MsCWFsY19HZXRDaGFubmVsc19fZG9jX199LAotCXsiU2V0RmxvYXRNYXgiLAkoUHlDRnVuY3Rpb24pYWxjX1NldEZsb2F0TWF4LAlNRVRIX1ZBUkFSR1MsCWFsY19TZXRGbG9hdE1heF9fZG9jX199LAotCXsiR2V0RmxvYXRNYXgiLAkoUHlDRnVuY3Rpb24pYWxjX0dldEZsb2F0TWF4LAlNRVRIX1ZBUkFSR1MsCWFsY19HZXRGbG9hdE1heF9fZG9jX199LAotCXsiU2V0RGV2aWNlIiwJKFB5Q0Z1bmN0aW9uKWFsY19TZXREZXZpY2UsCU1FVEhfVkFSQVJHUywJYWxjX1NldERldmljZV9fZG9jX199LAotCXsiR2V0RGV2aWNlIiwJKFB5Q0Z1bmN0aW9uKWFsY19HZXREZXZpY2UsCU1FVEhfVkFSQVJHUywJYWxjX0dldERldmljZV9fZG9jX199LAotCXsiU2V0UXVldWVTaXplIiwJKFB5Q0Z1bmN0aW9uKWFsY19TZXRRdWV1ZVNpemUsCU1FVEhfVkFSQVJHUywJYWxjX1NldFF1ZXVlU2l6ZV9fZG9jX199LAotCXsiR2V0UXVldWVTaXplIiwJKFB5Q0Z1bmN0aW9uKWFsY19HZXRRdWV1ZVNpemUsCU1FVEhfVkFSQVJHUywJYWxjX0dldFF1ZXVlU2l6ZV9fZG9jX199LAorI2lmZGVmIEFMX05PX0VMRU0gICAgICAgICAgICAgICAvKiBJUklYIDYgKi8KKyAgICB7IlNldFdpZHRoIiwgICAgICAgIChQeUNGdW5jdGlvbilhbGNfU2V0V2lkdGgsICAgICAgTUVUSF9WQVJBUkdTLCAgIGFsY19TZXRXaWR0aF9fZG9jX199LAorICAgIHsiR2V0V2lkdGgiLCAgICAgICAgKFB5Q0Z1bmN0aW9uKWFsY19HZXRXaWR0aCwgICAgICBNRVRIX1ZBUkFSR1MsICAgYWxjX0dldFdpZHRoX19kb2NfX30sCisgICAgeyJTZXRTYW1wRm10IiwgICAgICAoUHlDRnVuY3Rpb24pYWxjX1NldFNhbXBGbXQsICAgIE1FVEhfVkFSQVJHUywgICBhbGNfU2V0U2FtcEZtdF9fZG9jX199LAorICAgIHsiR2V0U2FtcEZtdCIsICAgICAgKFB5Q0Z1bmN0aW9uKWFsY19HZXRTYW1wRm10LCAgICBNRVRIX1ZBUkFSR1MsICAgYWxjX0dldFNhbXBGbXRfX2RvY19ffSwKKyAgICB7IlNldENoYW5uZWxzIiwgICAgIChQeUNGdW5jdGlvbilhbGNfU2V0Q2hhbm5lbHMsICAgTUVUSF9WQVJBUkdTLCAgIGFsY19TZXRDaGFubmVsc19fZG9jX199LAorICAgIHsiR2V0Q2hhbm5lbHMiLCAgICAgKFB5Q0Z1bmN0aW9uKWFsY19HZXRDaGFubmVscywgICBNRVRIX1ZBUkFSR1MsICAgYWxjX0dldENoYW5uZWxzX19kb2NfX30sCisgICAgeyJTZXRGbG9hdE1heCIsICAgICAoUHlDRnVuY3Rpb24pYWxjX1NldEZsb2F0TWF4LCAgIE1FVEhfVkFSQVJHUywgICBhbGNfU2V0RmxvYXRNYXhfX2RvY19ffSwKKyAgICB7IkdldEZsb2F0TWF4IiwgICAgIChQeUNGdW5jdGlvbilhbGNfR2V0RmxvYXRNYXgsICAgTUVUSF9WQVJBUkdTLCAgIGFsY19HZXRGbG9hdE1heF9fZG9jX199LAorICAgIHsiU2V0RGV2aWNlIiwgICAgICAgKFB5Q0Z1bmN0aW9uKWFsY19TZXREZXZpY2UsICAgICBNRVRIX1ZBUkFSR1MsICAgYWxjX1NldERldmljZV9fZG9jX199LAorICAgIHsiR2V0RGV2aWNlIiwgICAgICAgKFB5Q0Z1bmN0aW9uKWFsY19HZXREZXZpY2UsICAgICBNRVRIX1ZBUkFSR1MsICAgYWxjX0dldERldmljZV9fZG9jX199LAorICAgIHsiU2V0UXVldWVTaXplIiwgICAgICAgICAgICAoUHlDRnVuY3Rpb24pYWxjX1NldFF1ZXVlU2l6ZSwgIE1FVEhfVkFSQVJHUywgICBhbGNfU2V0UXVldWVTaXplX19kb2NfX30sCisgICAgeyJHZXRRdWV1ZVNpemUiLCAgICAgICAgICAgIChQeUNGdW5jdGlvbilhbGNfR2V0UXVldWVTaXplLCAgTUVUSF9WQVJBUkdTLCAgIGFsY19HZXRRdWV1ZVNpemVfX2RvY19ffSwKICNlbmRpZiAvKiBBTF9OT19FTEVNICovCi0JeyJnZXRxdWV1ZXNpemUiLAkoUHlDRnVuY3Rpb24pYWxjX2dldHF1ZXVlc2l6ZSwJTUVUSF9WQVJBUkdTfSwKLQl7InNldHF1ZXVlc2l6ZSIsCShQeUNGdW5jdGlvbilhbGNfc2V0cXVldWVzaXplLAlNRVRIX1ZBUkFSR1N9LAotCXsiZ2V0d2lkdGgiLAkJKFB5Q0Z1bmN0aW9uKWFsY19nZXR3aWR0aCwJTUVUSF9WQVJBUkdTfSwKLQl7InNldHdpZHRoIiwJCShQeUNGdW5jdGlvbilhbGNfc2V0d2lkdGgsCU1FVEhfVkFSQVJHU30sCi0JeyJnZXRjaGFubmVscyIsCQkoUHlDRnVuY3Rpb24pYWxjX2dldGNoYW5uZWxzLAlNRVRIX1ZBUkFSR1N9LAotCXsic2V0Y2hhbm5lbHMiLAkJKFB5Q0Z1bmN0aW9uKWFsY19zZXRjaGFubmVscywJTUVUSF9WQVJBUkdTfSwKKyAgICB7ImdldHF1ZXVlc2l6ZSIsICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWFsY19nZXRxdWV1ZXNpemUsICBNRVRIX1ZBUkFSR1N9LAorICAgIHsic2V0cXVldWVzaXplIiwgICAgICAgICAgICAoUHlDRnVuY3Rpb24pYWxjX3NldHF1ZXVlc2l6ZSwgIE1FVEhfVkFSQVJHU30sCisgICAgeyJnZXR3aWR0aCIsICAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilhbGNfZ2V0d2lkdGgsICAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7InNldHdpZHRoIiwgICAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWFsY19zZXR3aWR0aCwgICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsiZ2V0Y2hhbm5lbHMiLCAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pYWxjX2dldGNoYW5uZWxzLCAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJzZXRjaGFubmVscyIsICAgICAgICAgICAgIChQeUNGdW5jdGlvbilhbGNfc2V0Y2hhbm5lbHMsICAgTUVUSF9WQVJBUkdTfSwKICNpZmRlZiBBTF80MDUKLQl7ImdldHNhbXBmbXQiLAkJKFB5Q0Z1bmN0aW9uKWFsY19nZXRzYW1wZm10LAlNRVRIX1ZBUkFSR1N9LAotCXsic2V0c2FtcGZtdCIsCQkoUHlDRnVuY3Rpb24pYWxjX3NldHNhbXBmbXQsCU1FVEhfVkFSQVJHU30sCi0JeyJnZXRmbG9hdG1heCIsCQkoUHlDRnVuY3Rpb24pYWxjX2dldGZsb2F0bWF4LAlNRVRIX1ZBUkFSR1N9LAotCXsic2V0ZmxvYXRtYXgiLAkJKFB5Q0Z1bmN0aW9uKWFsY19zZXRmbG9hdG1heCwJTUVUSF9WQVJBUkdTfSwKKyAgICB7ImdldHNhbXBmbXQiLCAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWFsY19nZXRzYW1wZm10LCAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsic2V0c2FtcGZtdCIsICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pYWxjX3NldHNhbXBmbXQsICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJnZXRmbG9hdG1heCIsICAgICAgICAgICAgIChQeUNGdW5jdGlvbilhbGNfZ2V0ZmxvYXRtYXgsICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7InNldGZsb2F0bWF4IiwgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWFsY19zZXRmbG9hdG1heCwgICBNRVRIX1ZBUkFSR1N9LAogI2VuZGlmIC8qIEFMXzQwNSAqLwogCi0Je05VTEwsCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogLyogLS0tLS0tLS0tLSAqLwpAQCAtNTQ5LDY3ICs1NDksNjcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBuZXdhbGNvYmplY3QoQUxjb25maWcgY29uZmlnKQogewotCWFsY29iamVjdCAqc2VsZjsKLQkKLQlzZWxmID0gUHlPYmplY3RfTmV3KGFsY29iamVjdCwgJkFsY3R5cGUpOwotCWlmIChzZWxmID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCS8qIFhYWFggQWRkIHlvdXIgb3duIGluaXRpYWxpemVycyBoZXJlICovCi0Jc2VsZi0+Y29uZmlnID0gY29uZmlnOwotCXJldHVybiAoUHlPYmplY3QgKikgc2VsZjsKKyAgICBhbGNvYmplY3QgKnNlbGY7CisKKyAgICBzZWxmID0gUHlPYmplY3RfTmV3KGFsY29iamVjdCwgJkFsY3R5cGUpOworICAgIGlmIChzZWxmID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIC8qIFhYWFggQWRkIHlvdXIgb3duIGluaXRpYWxpemVycyBoZXJlICovCisgICAgc2VsZi0+Y29uZmlnID0gY29uZmlnOworICAgIHJldHVybiAoUHlPYmplY3QgKikgc2VsZjsKIH0KIAogCiBzdGF0aWMgdm9pZAogYWxjX2RlYWxsb2MoYWxjb2JqZWN0ICpzZWxmKQogewotCS8qIFhYWFggQWRkIHlvdXIgb3duIGNsZWFudXAgY29kZSBoZXJlICovCi0jaWZkZWYgQUxfTk9fRUxFTQkJLyogSVJJWCA2ICovCi0JKHZvaWQpIGFsRnJlZUNvbmZpZyhzZWxmLT5jb25maWcpOwkvKiBpZ25vcmUgZXJyb3JzICovCisgICAgLyogWFhYWCBBZGQgeW91ciBvd24gY2xlYW51cCBjb2RlIGhlcmUgKi8KKyNpZmRlZiBBTF9OT19FTEVNICAgICAgICAgICAgICAgLyogSVJJWCA2ICovCisgICAgKHZvaWQpIGFsRnJlZUNvbmZpZyhzZWxmLT5jb25maWcpOyAgICAgICAgICAvKiBpZ25vcmUgZXJyb3JzICovCiAjZWxzZQotCSh2b2lkKSBBTGZyZWVjb25maWcoc2VsZi0+Y29uZmlnKTsJLyogaWdub3JlIGVycm9ycyAqLworICAgICh2b2lkKSBBTGZyZWVjb25maWcoc2VsZi0+Y29uZmlnKTsgICAgICAgICAgLyogaWdub3JlIGVycm9ycyAqLwogI2VuZGlmCi0JUHlPYmplY3RfRGVsKHNlbGYpOworICAgIFB5T2JqZWN0X0RlbChzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGFsY19nZXRhdHRyKGFsY29iamVjdCAqc2VsZiwgY2hhciAqbmFtZSkKIHsKLQkvKiBYWFhYIEFkZCB5b3VyIG93biBnZXRhdHRyIGNvZGUgaGVyZSAqLwotCXJldHVybiBQeV9GaW5kTWV0aG9kKGFsY19tZXRob2RzLCAoUHlPYmplY3QgKilzZWxmLCBuYW1lKTsKKyAgICAvKiBYWFhYIEFkZCB5b3VyIG93biBnZXRhdHRyIGNvZGUgaGVyZSAqLworICAgIHJldHVybiBQeV9GaW5kTWV0aG9kKGFsY19tZXRob2RzLCAoUHlPYmplY3QgKilzZWxmLCBuYW1lKTsKIH0KIAogUHlEb2NfU1RSVkFSKEFsY3R5cGVfX2RvY19fLCAiIik7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgQWxjdHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlKQotCTAsCQkJCS8qb2Jfc2l6ZSovCi0JImFsLmNvbmZpZyIsCQkJLyp0cF9uYW1lKi8KLQlzaXplb2YoYWxjb2JqZWN0KSwJCS8qdHBfYmFzaWNzaXplKi8KLQkwLAkJCQkvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpYWxjX2RlYWxsb2MsCS8qdHBfZGVhbGxvYyovCi0JKHByaW50ZnVuYykwLAkJLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKWFsY19nZXRhdHRyLAkvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYykwLAkvKnRwX3NldGF0dHIqLwotCShjbXBmdW5jKTAsCQkvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYykwLAkJLyp0cF9yZXByKi8KLQkwLAkJCS8qdHBfYXNfbnVtYmVyKi8KLQkwLAkJLyp0cF9hc19zZXF1ZW5jZSovCi0JMCwJCS8qdHBfYXNfbWFwcGluZyovCi0JKGhhc2hmdW5jKTAsCQkvKnRwX2hhc2gqLwotCSh0ZXJuYXJ5ZnVuYykwLAkJLyp0cF9jYWxsKi8KLQkocmVwcmZ1bmMpMCwJCS8qdHBfc3RyKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlKQorICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb2Jfc2l6ZSovCisgICAgImFsLmNvbmZpZyIsICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoYWxjb2JqZWN0KSwgICAgICAgICAgICAgICAgICAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKWFsY19kZWFsbG9jLCAgICAgICAgICAgIC8qdHBfZGVhbGxvYyovCisgICAgKHByaW50ZnVuYykwLCAgICAgICAgICAgICAgIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYylhbGNfZ2V0YXR0ciwgICAgICAgICAgIC8qdHBfZ2V0YXR0ciovCisgICAgKHNldGF0dHJmdW5jKTAsICAgICAvKnRwX3NldGF0dHIqLworICAgIChjbXBmdW5jKTAsICAgICAgICAgICAgICAgICAvKnRwX2NvbXBhcmUqLworICAgIChyZXByZnVuYykwLCAgICAgICAgICAgICAgICAvKnRwX3JlcHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX251bWJlciovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX2FzX3NlcXVlbmNlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbWFwcGluZyovCisgICAgKGhhc2hmdW5jKTAsICAgICAgICAgICAgICAgIC8qdHBfaGFzaCovCisgICAgKHRlcm5hcnlmdW5jKTAsICAgICAgICAgICAgIC8qdHBfY2FsbCovCisgICAgKHJlcHJmdW5jKTAsICAgICAgICAgICAgICAgIC8qdHBfc3RyKi8KIAotCS8qIFNwYWNlIGZvciBmdXR1cmUgZXhwYW5zaW9uICovCi0JMEwsMEwsMEwsMEwsCi0JQWxjdHlwZV9fZG9jX18gLyogRG9jdW1lbnRhdGlvbiBzdHJpbmcgKi8KKyAgICAvKiBTcGFjZSBmb3IgZnV0dXJlIGV4cGFuc2lvbiAqLworICAgIDBMLDBMLDBMLDBMLAorICAgIEFsY3R5cGVfX2RvY19fIC8qIERvY3VtZW50YXRpb24gc3RyaW5nICovCiB9OwogCiAvKiBFbmQgb2YgY29kZSBmb3IgY29uZmlnIG9iamVjdHMgKi8KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotI2lmZGVmIEFMX05PX0VMRU0JCS8qIElSSVggNiAqLworI2lmZGVmIEFMX05PX0VMRU0gICAgICAgICAgICAgICAvKiBJUklYIDYgKi8KIAogUHlEb2NfU1RSVkFSKGFscF9TZXRDb25maWdfX2RvY19fLAogImFsU2V0Q29uZmlnOiBzZXQgdGhlIEFMY29uZmlnIG9mIGFuIGF1ZGlvIEFMcG9ydC4iKTsKQEAgLTYxNywxMyArNjE3LDEzIEBACiBzdGF0aWMgUHlPYmplY3QgKgogYWxwX1NldENvbmZpZyhhbHBvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWFsY29iamVjdCAqY29uZmlnOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyE6U2V0Q29uZmlnIiwgJkFsY3R5cGUsICZjb25maWcpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoYWxTZXRDb25maWcoc2VsZi0+cG9ydCwgY29uZmlnLT5jb25maWcpIDwgMCkKLQkJcmV0dXJuIE5VTEw7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGFsY29iamVjdCAqY29uZmlnOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyE6U2V0Q29uZmlnIiwgJkFsY3R5cGUsICZjb25maWcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoYWxTZXRDb25maWcoc2VsZi0+cG9ydCwgY29uZmlnLT5jb25maWcpIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAKQEAgLTYzMywxMiArNjMzLDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogYWxwX0dldENvbmZpZyhhbHBvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCUFMY29uZmlnIGNvbmZpZzsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpHZXRDb25maWciKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKChjb25maWcgPSBhbEdldENvbmZpZyhzZWxmLT5wb3J0KSkgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIG5ld2FsY29iamVjdChjb25maWcpOworICAgIEFMY29uZmlnIGNvbmZpZzsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpHZXRDb25maWciKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKChjb25maWcgPSBhbEdldENvbmZpZyhzZWxmLT5wb3J0KSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIG5ld2FsY29iamVjdChjb25maWcpOwogfQogCiAKQEAgLTY0OCwxMyArNjQ4LDEzIEBACiBzdGF0aWMgUHlPYmplY3QgKgogYWxwX0dldFJlc291cmNlKGFscG9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IHJlc291cmNlOworICAgIGludCByZXNvdXJjZTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOkdldFJlc291cmNlIikpCi0JCXJldHVybiBOVUxMOwotCWlmICgocmVzb3VyY2UgPSBhbEdldFJlc291cmNlKHNlbGYtPnBvcnQpKSA9PSAwKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIHJlc291cmNlKTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpHZXRSZXNvdXJjZSIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoKHJlc291cmNlID0gYWxHZXRSZXNvdXJjZShzZWxmLT5wb3J0KSkgPT0gMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKSByZXNvdXJjZSk7CiB9CiAKIApAQCAtNjY0LDE1ICs2NjQsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBhbHBfR2V0RkQoYWxwb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgZmQ7CisgICAgaW50IGZkOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6R2V0RkQiKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6R2V0RkQiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoKGZkID0gYWxHZXRGRChzZWxmLT5wb3J0KSkgPCAwKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoKGZkID0gYWxHZXRGRChzZWxmLT5wb3J0KSkgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZykgZmQpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZykgZmQpOwogfQogCiAKQEAgLTY4MywxMyArNjgzLDEzIEBACiBzdGF0aWMgUHlPYmplY3QgKgogYWxwX0dldEZpbGxlZChhbHBvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBmaWxsZWQ7CisgICAgaW50IGZpbGxlZDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOkdldEZpbGxlZCIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoKGZpbGxlZCA9IGFsR2V0RmlsbGVkKHNlbGYtPnBvcnQpKSA8IDApCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZykgZmlsbGVkKTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpHZXRGaWxsZWQiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKChmaWxsZWQgPSBhbEdldEZpbGxlZChzZWxmLT5wb3J0KSkgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIGZpbGxlZCk7CiB9CiAKIApAQCAtNzAwLDEzICs3MDAsMTMgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBhbHBfR2V0RmlsbGFibGUoYWxwb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgZmlsbGFibGU7CisgICAgaW50IGZpbGxhYmxlOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6R2V0RmlsbGFibGUiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKChmaWxsYWJsZSA9IGFsR2V0RmlsbGFibGUoc2VsZi0+cG9ydCkpIDwgMCkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKSBmaWxsYWJsZSk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6R2V0RmlsbGFibGUiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKChmaWxsYWJsZSA9IGFsR2V0RmlsbGFibGUoc2VsZi0+cG9ydCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKSBmaWxsYWJsZSk7CiB9CiAKIApAQCAtNzE2LDY0ICs3MTYsNjQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBhbHBfUmVhZEZyYW1lcyhhbHBvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBmcmFtZWNvdW50OwotCVB5T2JqZWN0ICp2OwotCWludCBzaXplOwotCWludCBjaDsKLQlBTGNvbmZpZyBjOworICAgIGludCBmcmFtZWNvdW50OworICAgIFB5T2JqZWN0ICp2OworICAgIGludCBzaXplOworICAgIGludCBjaDsKKyAgICBBTGNvbmZpZyBjOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOlJlYWRGcmFtZXMiLCAmZnJhbWVjb3VudCkpCi0JCXJldHVybiBOVUxMOwotCWlmIChmcmFtZWNvdW50IDwgMCkgewotCQlQeUVycl9TZXRTdHJpbmcoRXJyb3JPYmplY3QsICJuZWdhdGl2ZSBmcmFtZWNvdW50Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQljID0gYWxHZXRDb25maWcoc2VsZi0+cG9ydCk7Ci0Jc3dpdGNoIChhbEdldFNhbXBGbXQoYykpIHsKLQljYXNlIEFMX1NBTVBGTVRfVFdPU0NPTVA6Ci0JCXN3aXRjaCAoYWxHZXRXaWR0aChjKSkgewotCQljYXNlIEFMX1NBTVBMRV84OgotCQkJc2l6ZSA9IDE7Ci0JCQlicmVhazsKLQkJY2FzZSBBTF9TQU1QTEVfMTY6Ci0JCQlzaXplID0gMjsKLQkJCWJyZWFrOwotCQljYXNlIEFMX1NBTVBMRV8yNDoKLQkJCXNpemUgPSA0OwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlQeUVycl9TZXRTdHJpbmcoRXJyb3JPYmplY3QsICJjYW4ndCBkZXRlcm1pbmUgd2lkdGgiKTsKLQkJCWFsRnJlZUNvbmZpZyhjKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgQUxfU0FNUEZNVF9GTE9BVDoKLQkJc2l6ZSA9IDQ7Ci0JCWJyZWFrOwotCWNhc2UgQUxfU0FNUEZNVF9ET1VCTEU6Ci0JCXNpemUgPSA4OwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlQeUVycl9TZXRTdHJpbmcoRXJyb3JPYmplY3QsICJjYW4ndCBkZXRlcm1pbmUgZm9ybWF0Iik7Ci0JCWFsRnJlZUNvbmZpZyhjKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWNoID0gYWxHZXRDaGFubmVscyhjKTsKLQlhbEZyZWVDb25maWcoYyk7Ci0JaWYgKGNoIDwgMCkgewotCQlQeUVycl9TZXRTdHJpbmcoRXJyb3JPYmplY3QsICJjYW4ndCBkZXRlcm1pbmUgIyBvZiBjaGFubmVscyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0Jc2l6ZSAqPSBjaDsKLQl2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKikgTlVMTCwgc2l6ZSAqIGZyYW1lY291bnQpOwotCWlmICh2ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpSZWFkRnJhbWVzIiwgJmZyYW1lY291bnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoZnJhbWVjb3VudCA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEVycm9yT2JqZWN0LCAibmVnYXRpdmUgZnJhbWVjb3VudCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgYyA9IGFsR2V0Q29uZmlnKHNlbGYtPnBvcnQpOworICAgIHN3aXRjaCAoYWxHZXRTYW1wRm10KGMpKSB7CisgICAgY2FzZSBBTF9TQU1QRk1UX1RXT1NDT01QOgorICAgICAgICBzd2l0Y2ggKGFsR2V0V2lkdGgoYykpIHsKKyAgICAgICAgY2FzZSBBTF9TQU1QTEVfODoKKyAgICAgICAgICAgIHNpemUgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQUxfU0FNUExFXzE2OgorICAgICAgICAgICAgc2l6ZSA9IDI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBTF9TQU1QTEVfMjQ6CisgICAgICAgICAgICBzaXplID0gNDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEVycm9yT2JqZWN0LCAiY2FuJ3QgZGV0ZXJtaW5lIHdpZHRoIik7CisgICAgICAgICAgICBhbEZyZWVDb25maWcoYyk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEFMX1NBTVBGTVRfRkxPQVQ6CisgICAgICAgIHNpemUgPSA0OworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFMX1NBTVBGTVRfRE9VQkxFOgorICAgICAgICBzaXplID0gODsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEVycm9yT2JqZWN0LCAiY2FuJ3QgZGV0ZXJtaW5lIGZvcm1hdCIpOworICAgICAgICBhbEZyZWVDb25maWcoYyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBjaCA9IGFsR2V0Q2hhbm5lbHMoYyk7CisgICAgYWxGcmVlQ29uZmlnKGMpOworICAgIGlmIChjaCA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEVycm9yT2JqZWN0LCAiY2FuJ3QgZGV0ZXJtaW5lICMgb2YgY2hhbm5lbHMiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHNpemUgKj0gY2g7CisgICAgdiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopIE5VTEwsIHNpemUgKiBmcmFtZWNvdW50KTsKKyAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlhbFJlYWRGcmFtZXMoc2VsZi0+cG9ydCwgKHZvaWQgKikgUHlTdHJpbmdfQVNfU1RSSU5HKHYpLCBmcmFtZWNvdW50KTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICBhbFJlYWRGcmFtZXMoc2VsZi0+cG9ydCwgKHZvaWQgKikgUHlTdHJpbmdfQVNfU1RSSU5HKHYpLCBmcmFtZWNvdW50KTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogCi0JcmV0dXJuIHY7CisgICAgcmV0dXJuIHY7CiB9CiAKIApAQCAtNzgzLDE5ICs3ODMsMTkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBhbHBfRGlzY2FyZEZyYW1lcyhhbHBvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBmcmFtZWNvdW50OworICAgIGludCBmcmFtZWNvdW50OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOkRpc2NhcmRGcmFtZXMiLCAmZnJhbWVjb3VudCkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpEaXNjYXJkRnJhbWVzIiwgJmZyYW1lY291bnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlmcmFtZWNvdW50ID0gYWxEaXNjYXJkRnJhbWVzKHNlbGYtPnBvcnQsIGZyYW1lY291bnQpOwotCVB5X0VORF9BTExPV19USFJFQURTCisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIGZyYW1lY291bnQgPSBhbERpc2NhcmRGcmFtZXMoc2VsZi0+cG9ydCwgZnJhbWVjb3VudCk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKIAotCWlmIChmcmFtZWNvdW50IDwgMCkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKGZyYW1lY291bnQgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZykgZnJhbWVjb3VudCk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKSBmcmFtZWNvdW50KTsKIH0KIAogCkBAIC04MDUsMjIgKzgwNSwyMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGFscF9aZXJvRnJhbWVzKGFscG9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IGZyYW1lY291bnQ7CisgICAgaW50IGZyYW1lY291bnQ7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6WmVyb0ZyYW1lcyIsICZmcmFtZWNvdW50KSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOlplcm9GcmFtZXMiLCAmZnJhbWVjb3VudCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKGZyYW1lY291bnQgPCAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhFcnJvck9iamVjdCwgIm5lZ2F0aXZlIGZyYW1lY291bnQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChmcmFtZWNvdW50IDwgMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoRXJyb3JPYmplY3QsICJuZWdhdGl2ZSBmcmFtZWNvdW50Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlhbFplcm9GcmFtZXMoc2VsZi0+cG9ydCwgZnJhbWVjb3VudCk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgYWxaZXJvRnJhbWVzKHNlbGYtPnBvcnQsIGZyYW1lY291bnQpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAKQEAgLTgzMCwxNiArODMwLDE2IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYWxwX1NldEZpbGxQb2ludChhbHBvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBmaWxscG9pbnQ7CisgICAgaW50IGZpbGxwb2ludDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpTZXRGaWxsUG9pbnQiLCAmZmlsbHBvaW50KSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOlNldEZpbGxQb2ludCIsICZmaWxscG9pbnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChhbFNldEZpbGxQb2ludChzZWxmLT5wb3J0LCBmaWxscG9pbnQpIDwgMCkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKGFsU2V0RmlsbFBvaW50KHNlbGYtPnBvcnQsIGZpbGxwb2ludCkgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIApAQCAtODQ5LDE1ICs4NDksMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBhbHBfR2V0RmlsbFBvaW50KGFscG9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IGZpbGxwb2ludDsKKyAgICBpbnQgZmlsbHBvaW50OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6R2V0RmlsbFBvaW50IikpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOkdldEZpbGxQb2ludCIpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmICgoZmlsbHBvaW50ID0gYWxHZXRGaWxsUG9pbnQoc2VsZi0+cG9ydCkpIDwgMCkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKChmaWxscG9pbnQgPSBhbEdldEZpbGxQb2ludChzZWxmLT5wb3J0KSkgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZykgZmlsbHBvaW50KTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIGZpbGxwb2ludCk7CiB9CiAKIApAQCAtODY4LDE1ICs4NjgsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBhbHBfR2V0RnJhbWVOdW1iZXIoYWxwb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzdGFtcF90IGZudW07CisgICAgc3RhbXBfdCBmbnVtOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6R2V0RnJhbWVOdW1iZXIiKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6R2V0RnJhbWVOdW1iZXIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoYWxHZXRGcmFtZU51bWJlcihzZWxmLT5wb3J0LCAmZm51bSkgPCAwKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoYWxHZXRGcmFtZU51bWJlcihzZWxmLT5wb3J0LCAmZm51bSkgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXJldHVybiBQeUxvbmdfRnJvbUxvbmdMb25nKChsb25nIGxvbmcpIGZudW0pOworICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmdMb25nKChsb25nIGxvbmcpIGZudW0pOwogfQogCiAKQEAgLTg4NywyNCArODg3LDI0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYWxwX0dldEZyYW1lVGltZShhbHBvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXN0YW1wX3QgZm51bSwgdGltZTsKLQlQeU9iamVjdCAqcmV0LCAqdjAsICp2MTsKKyAgICBzdGFtcF90IGZudW0sIHRpbWU7CisgICAgUHlPYmplY3QgKnJldCwgKnYwLCAqdjE7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpHZXRGcmFtZVRpbWUiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKGFsR2V0RnJhbWVUaW1lKHNlbGYtPnBvcnQsICZmbnVtLCAmdGltZSkgPCAwKQotCQlyZXR1cm4gTlVMTDsKLQl2MCA9IFB5TG9uZ19Gcm9tTG9uZ0xvbmcoKGxvbmcgbG9uZykgZm51bSk7Ci0JdjEgPSBQeUxvbmdfRnJvbUxvbmdMb25nKChsb25nIGxvbmcpIHRpbWUpOwotCWlmIChQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCVB5X1hERUNSRUYodjApOwotCQlQeV9YREVDUkVGKHYxKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldCA9IFB5VHVwbGVfUGFjaygyLCB2MCwgdjEpOwotCVB5X0RFQ1JFRih2MCk7Ci0JUHlfREVDUkVGKHYxKTsKLQlyZXR1cm4gcmV0OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOkdldEZyYW1lVGltZSIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoYWxHZXRGcmFtZVRpbWUoc2VsZi0+cG9ydCwgJmZudW0sICZ0aW1lKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHYwID0gUHlMb25nX0Zyb21Mb25nTG9uZygobG9uZyBsb25nKSBmbnVtKTsKKyAgICB2MSA9IFB5TG9uZ19Gcm9tTG9uZ0xvbmcoKGxvbmcgbG9uZykgdGltZSk7CisgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgUHlfWERFQ1JFRih2MCk7CisgICAgICAgIFB5X1hERUNSRUYodjEpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0ID0gUHlUdXBsZV9QYWNrKDIsIHYwLCB2MSk7CisgICAgUHlfREVDUkVGKHYwKTsKKyAgICBQeV9ERUNSRUYodjEpOworICAgIHJldHVybiByZXQ7CiB9CiAKIApAQCAtOTE0LDYyICs5MTQsNjIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBhbHBfV3JpdGVGcmFtZXMoYWxwb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpzYW1wbGVzOwotCWludCBsZW5ndGg7Ci0JaW50IHNpemUsIGNoOwotCUFMY29uZmlnIGM7CisgICAgY2hhciAqc2FtcGxlczsKKyAgICBpbnQgbGVuZ3RoOworICAgIGludCBzaXplLCBjaDsKKyAgICBBTGNvbmZpZyBjOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIzpXcml0ZUZyYW1lcyIsICZzYW1wbGVzLCAmbGVuZ3RoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JYyA9IGFsR2V0Q29uZmlnKHNlbGYtPnBvcnQpOwotCXN3aXRjaCAoYWxHZXRTYW1wRm10KGMpKSB7Ci0JY2FzZSBBTF9TQU1QRk1UX1RXT1NDT01QOgotCQlzd2l0Y2ggKGFsR2V0V2lkdGgoYykpIHsKLQkJY2FzZSBBTF9TQU1QTEVfODoKLQkJCXNpemUgPSAxOwotCQkJYnJlYWs7Ci0JCWNhc2UgQUxfU0FNUExFXzE2OgotCQkJc2l6ZSA9IDI7Ci0JCQlicmVhazsKLQkJY2FzZSBBTF9TQU1QTEVfMjQ6Ci0JCQlzaXplID0gNDsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJUHlFcnJfU2V0U3RyaW5nKEVycm9yT2JqZWN0LCAiY2FuJ3QgZGV0ZXJtaW5lIHdpZHRoIik7Ci0JCQlhbEZyZWVDb25maWcoYyk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlicmVhazsKLQljYXNlIEFMX1NBTVBGTVRfRkxPQVQ6Ci0JCXNpemUgPSA0OwotCQlicmVhazsKLQljYXNlIEFMX1NBTVBGTVRfRE9VQkxFOgotCQlzaXplID0gODsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJUHlFcnJfU2V0U3RyaW5nKEVycm9yT2JqZWN0LCAiY2FuJ3QgZGV0ZXJtaW5lIGZvcm1hdCIpOwotCQlhbEZyZWVDb25maWcoYyk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQljaCA9IGFsR2V0Q2hhbm5lbHMoYyk7Ci0JYWxGcmVlQ29uZmlnKGMpOwotCWlmIChjaCA8IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKEVycm9yT2JqZWN0LCAiY2FuJ3QgZGV0ZXJtaW5lICMgb2YgY2hhbm5lbHMiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXNpemUgKj0gY2g7Ci0JaWYgKGxlbmd0aCAlIHNpemUgIT0gMCkgewotCQlQeUVycl9TZXRTdHJpbmcoRXJyb3JPYmplY3QsCi0JCQkJImJ1ZmZlciBsZW5ndGggbm90IHdob2xlIG51bWJlciBvZiBmcmFtZXMiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyM6V3JpdGVGcmFtZXMiLCAmc2FtcGxlcywgJmxlbmd0aCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGMgPSBhbEdldENvbmZpZyhzZWxmLT5wb3J0KTsKKyAgICBzd2l0Y2ggKGFsR2V0U2FtcEZtdChjKSkgeworICAgIGNhc2UgQUxfU0FNUEZNVF9UV09TQ09NUDoKKyAgICAgICAgc3dpdGNoIChhbEdldFdpZHRoKGMpKSB7CisgICAgICAgIGNhc2UgQUxfU0FNUExFXzg6CisgICAgICAgICAgICBzaXplID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFMX1NBTVBMRV8xNjoKKyAgICAgICAgICAgIHNpemUgPSAyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQUxfU0FNUExFXzI0OgorICAgICAgICAgICAgc2l6ZSA9IDQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhFcnJvck9iamVjdCwgImNhbid0IGRldGVybWluZSB3aWR0aCIpOworICAgICAgICAgICAgYWxGcmVlQ29uZmlnKGMpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBTF9TQU1QRk1UX0ZMT0FUOgorICAgICAgICBzaXplID0gNDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBTF9TQU1QRk1UX0RPVUJMRToKKyAgICAgICAgc2l6ZSA9IDg7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhFcnJvck9iamVjdCwgImNhbid0IGRldGVybWluZSBmb3JtYXQiKTsKKyAgICAgICAgYWxGcmVlQ29uZmlnKGMpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgY2ggPSBhbEdldENoYW5uZWxzKGMpOworICAgIGFsRnJlZUNvbmZpZyhjKTsKKyAgICBpZiAoY2ggPCAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhFcnJvck9iamVjdCwgImNhbid0IGRldGVybWluZSAjIG9mIGNoYW5uZWxzIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBzaXplICo9IGNoOworICAgIGlmIChsZW5ndGggJSBzaXplICE9IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEVycm9yT2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgImJ1ZmZlciBsZW5ndGggbm90IHdob2xlIG51bWJlciBvZiBmcmFtZXMiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCWFsV3JpdGVGcmFtZXMoc2VsZi0+cG9ydCwgKHZvaWQgKikgc2FtcGxlcywgbGVuZ3RoIC8gc2l6ZSk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgYWxXcml0ZUZyYW1lcyhzZWxmLT5wb3J0LCAodm9pZCAqKSBzYW1wbGVzLCBsZW5ndGggLyBzaXplKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogCkBAIC05NzgsMTMgKzk3OCwxMyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGFscF9DbG9zZVBvcnQoYWxwb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpDbG9zZVBvcnQiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKGFsQ2xvc2VQb3J0KHNlbGYtPnBvcnQpIDwgMCkKLQkJcmV0dXJuIE5VTEw7Ci0Jc2VsZi0+cG9ydCA9IE5VTEw7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOkNsb3NlUG9ydCIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoYWxDbG9zZVBvcnQoc2VsZi0+cG9ydCkgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBzZWxmLT5wb3J0ID0gTlVMTDsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKICNlbmRpZiAvKiBBTF9OT19FTEVNICovCkBAIC05OTMsMjU3ICs5OTMsMjU3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYWxwX2Nsb3NlcG9ydChhbHBvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOkNsb3NlUG9ydCIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoQUxjbG9zZXBvcnQoc2VsZi0+cG9ydCkgPCAwKQotCQlyZXR1cm4gTlVMTDsKLQlzZWxmLT5wb3J0ID0gTlVMTDsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6Q2xvc2VQb3J0IikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChBTGNsb3NlcG9ydChzZWxmLT5wb3J0KSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHNlbGYtPnBvcnQgPSBOVUxMOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGFscF9nZXRmZChhbHBvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBmZDsKKyAgICBpbnQgZmQ7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpHZXRGRCIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoKGZkID0gQUxnZXRmZChzZWxmLT4gcG9ydCkpID09IC0xKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoZmQpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOkdldEZEIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICgoZmQgPSBBTGdldGZkKHNlbGYtPiBwb3J0KSkgPT0gLTEpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhmZCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhbHBfZ2V0ZmlsbGVkKGFscG9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBjb3VudDsKKyAgICBsb25nIGNvdW50OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6R2V0RmlsbGVkIikpCi0JCXJldHVybiBOVUxMOwotCWlmICgoY291bnQgPSBBTGdldGZpbGxlZChzZWxmLT4gcG9ydCkpID09IC0xKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoY291bnQpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOkdldEZpbGxlZCIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoKGNvdW50ID0gQUxnZXRmaWxsZWQoc2VsZi0+IHBvcnQpKSA9PSAtMSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKGNvdW50KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGFscF9nZXRmaWxsYWJsZShhbHBvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgY291bnQ7CisgICAgbG9uZyBjb3VudDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOkdldEZpbGxhYmxlIikpCi0JCXJldHVybiBOVUxMOwotCWlmICgoY291bnQgPSBBTGdldGZpbGxhYmxlKHNlbGYtPiBwb3J0KSkgPT0gLTEpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBQeUludF9Gcm9tTG9uZyAoY291bnQpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOkdldEZpbGxhYmxlIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICgoY291bnQgPSBBTGdldGZpbGxhYmxlKHNlbGYtPiBwb3J0KSkgPT0gLTEpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyAoY291bnQpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYWxwX3JlYWRzYW1wcyhhbHBvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgY291bnQ7Ci0JUHlPYmplY3QgKnY7Ci0JQUxjb25maWcgYzsKLQlpbnQgd2lkdGg7Ci0JaW50IHJldDsKKyAgICBsb25nIGNvdW50OworICAgIFB5T2JqZWN0ICp2OworICAgIEFMY29uZmlnIGM7CisgICAgaW50IHdpZHRoOworICAgIGludCByZXQ7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImw6cmVhZHNhbXBzIiwgJmNvdW50KSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsOnJlYWRzYW1wcyIsICZjb3VudCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKGNvdW50IDw9IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKEVycm9yT2JqZWN0LCAiYWwucmVhZHNhbXBzIDogYXJnIDw9IDAiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChjb3VudCA8PSAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhFcnJvck9iamVjdCwgImFsLnJlYWRzYW1wcyA6IGFyZyA8PSAwIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWMgPSBBTGdldGNvbmZpZyhzZWxmLT5wb3J0KTsKKyAgICBjID0gQUxnZXRjb25maWcoc2VsZi0+cG9ydCk7CiAjaWZkZWYgQUxfNDA1Ci0Jd2lkdGggPSBBTGdldHNhbXBmbXQoYyk7Ci0JaWYgKHdpZHRoID09IEFMX1NBTVBGTVRfRkxPQVQpCi0JCXdpZHRoID0gc2l6ZW9mKGZsb2F0KTsKLQllbHNlIGlmICh3aWR0aCA9PSBBTF9TQU1QRk1UX0RPVUJMRSkKLQkJd2lkdGggPSBzaXplb2YoZG91YmxlKTsKLQllbHNlCi0JCXdpZHRoID0gQUxnZXR3aWR0aChjKTsKKyAgICB3aWR0aCA9IEFMZ2V0c2FtcGZtdChjKTsKKyAgICBpZiAod2lkdGggPT0gQUxfU0FNUEZNVF9GTE9BVCkKKyAgICAgICAgd2lkdGggPSBzaXplb2YoZmxvYXQpOworICAgIGVsc2UgaWYgKHdpZHRoID09IEFMX1NBTVBGTVRfRE9VQkxFKQorICAgICAgICB3aWR0aCA9IHNpemVvZihkb3VibGUpOworICAgIGVsc2UKKyAgICAgICAgd2lkdGggPSBBTGdldHdpZHRoKGMpOwogI2Vsc2UKLQl3aWR0aCA9IEFMZ2V0d2lkdGgoYyk7CisgICAgd2lkdGggPSBBTGdldHdpZHRoKGMpOwogI2VuZGlmIC8qIEFMXzQwNSAqLwotCUFMZnJlZWNvbmZpZyhjKTsKLQl2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilOVUxMLCB3aWR0aCAqIGNvdW50KTsKLQlpZiAodiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBBTGZyZWVjb25maWcoYyk7CisgICAgdiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopTlVMTCwgd2lkdGggKiBjb3VudCk7CisgICAgaWYgKHYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JcmV0ID0gQUxyZWFkc2FtcHMoc2VsZi0+cG9ydCwgKHZvaWQgKikgUHlTdHJpbmdfQXNTdHJpbmcodiksIGNvdW50KTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCWlmIChyZXQgPT0gLTEpIHsKLQkJUHlfREVDUkVGKHYpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIHJldCA9IEFMcmVhZHNhbXBzKHNlbGYtPnBvcnQsICh2b2lkICopIFB5U3RyaW5nX0FzU3RyaW5nKHYpLCBjb3VudCk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBpZiAocmV0ID09IC0xKSB7CisgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JcmV0dXJuICh2KTsKKyAgICByZXR1cm4gKHYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYWxwX3dyaXRlc2FtcHMoYWxwb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpidWY7Ci0JaW50IHNpemUsIHdpZHRoOwotCUFMY29uZmlnIGM7Ci0JaW50IHJldDsKKyAgICBjaGFyICpidWY7CisgICAgaW50IHNpemUsIHdpZHRoOworICAgIEFMY29uZmlnIGM7CisgICAgaW50IHJldDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyM6d3JpdGVzYW1wcyIsICZidWYsICZzaXplKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIzp3cml0ZXNhbXBzIiwgJmJ1ZiwgJnNpemUpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWMgPSBBTGdldGNvbmZpZyhzZWxmLT5wb3J0KTsKKyAgICBjID0gQUxnZXRjb25maWcoc2VsZi0+cG9ydCk7CiAjaWZkZWYgQUxfNDA1Ci0Jd2lkdGggPSBBTGdldHNhbXBmbXQoYyk7Ci0JaWYgKHdpZHRoID09IEFMX1NBTVBGTVRfRkxPQVQpCi0JCXdpZHRoID0gc2l6ZW9mKGZsb2F0KTsKLQllbHNlIGlmICh3aWR0aCA9PSBBTF9TQU1QRk1UX0RPVUJMRSkKLQkJd2lkdGggPSBzaXplb2YoZG91YmxlKTsKLQllbHNlCi0JCXdpZHRoID0gQUxnZXR3aWR0aChjKTsKKyAgICB3aWR0aCA9IEFMZ2V0c2FtcGZtdChjKTsKKyAgICBpZiAod2lkdGggPT0gQUxfU0FNUEZNVF9GTE9BVCkKKyAgICAgICAgd2lkdGggPSBzaXplb2YoZmxvYXQpOworICAgIGVsc2UgaWYgKHdpZHRoID09IEFMX1NBTVBGTVRfRE9VQkxFKQorICAgICAgICB3aWR0aCA9IHNpemVvZihkb3VibGUpOworICAgIGVsc2UKKyAgICAgICAgd2lkdGggPSBBTGdldHdpZHRoKGMpOwogI2Vsc2UKLQl3aWR0aCA9IEFMZ2V0d2lkdGgoYyk7CisgICAgd2lkdGggPSBBTGdldHdpZHRoKGMpOwogI2VuZGlmIC8qIEFMXzQwNSAqLwotCUFMZnJlZWNvbmZpZyhjKTsKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JcmV0ID0gQUx3cml0ZXNhbXBzIChzZWxmLT5wb3J0LCAodm9pZCAqKSBidWYsIChsb25nKSBzaXplIC8gd2lkdGgpOwotCVB5X0VORF9BTExPV19USFJFQURTCi0JaWYgKHJldCA9PSAtMSkKLQkJcmV0dXJuIE5VTEw7CisgICAgQUxmcmVlY29uZmlnKGMpOworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICByZXQgPSBBTHdyaXRlc2FtcHMgKHNlbGYtPnBvcnQsICh2b2lkICopIGJ1ZiwgKGxvbmcpIHNpemUgLyB3aWR0aCk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBpZiAocmV0ID09IC0xKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhbHBfZ2V0ZmlsbHBvaW50KGFscG9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBjb3VudDsKKyAgICBsb25nIGNvdW50OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6R2V0RmlsbFBvaW50IikpCi0JCXJldHVybiBOVUxMOwotCWlmICgoY291bnQgPSBBTGdldGZpbGxwb2ludChzZWxmLT5wb3J0KSkgPT0gLTEpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBQeUludF9Gcm9tTG9uZyhjb3VudCk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6R2V0RmlsbFBvaW50IikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICgoY291bnQgPSBBTGdldGZpbGxwb2ludChzZWxmLT5wb3J0KSkgPT0gLTEpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhjb3VudCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhbHBfc2V0ZmlsbHBvaW50KGFscG9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBjb3VudDsKKyAgICBsb25nIGNvdW50OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsOlNldEZpbGxQb2ludCIsICZjb3VudCkpCi0JCXJldHVybiBOVUxMOwotCWlmIChBTHNldGZpbGxwb2ludChzZWxmLT5wb3J0LCBjb3VudCkgPT0gLTEpCi0JCXJldHVybiBOVUxMOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImw6U2V0RmlsbFBvaW50IiwgJmNvdW50KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKEFMc2V0ZmlsbHBvaW50KHNlbGYtPnBvcnQsIGNvdW50KSA9PSAtMSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYWxwX3NldGNvbmZpZyhhbHBvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWFsY29iamVjdCAqY29uZmlnOworICAgIGFsY29iamVjdCAqY29uZmlnOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPITpTZXRDb25maWciLCAmQWxjdHlwZSwgJmNvbmZpZykpCi0JCXJldHVybiBOVUxMOwotCWlmIChBTHNldGNvbmZpZyhzZWxmLT5wb3J0LCBjb25maWctPmNvbmZpZykgPT0gLTEpCi0JCXJldHVybiBOVUxMOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8hOlNldENvbmZpZyIsICZBbGN0eXBlLCAmY29uZmlnKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKEFMc2V0Y29uZmlnKHNlbGYtPnBvcnQsIGNvbmZpZy0+Y29uZmlnKSA9PSAtMSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYWxwX2dldGNvbmZpZyhhbHBvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCUFMY29uZmlnIGNvbmZpZzsKKyAgICBBTGNvbmZpZyBjb25maWc7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpHZXRDb25maWciKSkKLQkJcmV0dXJuIE5VTEw7Ci0JY29uZmlnID0gQUxnZXRjb25maWcoc2VsZi0+cG9ydCk7Ci0JaWYgKGNvbmZpZyA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gbmV3YWxjb2JqZWN0KGNvbmZpZyk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6R2V0Q29uZmlnIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGNvbmZpZyA9IEFMZ2V0Y29uZmlnKHNlbGYtPnBvcnQpOworICAgIGlmIChjb25maWcgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIG5ld2FsY29iamVjdChjb25maWcpOwogfQogCiAjaWZkZWYgQUxfNDA1CiBzdGF0aWMgUHlPYmplY3QgKgogYWxwX2dldHN0YXR1cyhhbHBvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICpsaXN0LCAqdjsKLQlsb25nICpQVmJ1ZmZlcjsKLQlsb25nIGxlbmd0aDsKLQlpbnQgaTsKLQkKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8hIiwgJlB5TGlzdF9UeXBlLCAmbGlzdCkpCi0JCXJldHVybiBOVUxMOwotCWxlbmd0aCA9IFB5TGlzdF9TaXplKGxpc3QpOwotCVBWYnVmZmVyID0gUHlNZW1fTkVXKGxvbmcsIGxlbmd0aCk7Ci0JaWYgKFBWYnVmZmVyID09IE5VTEwpCi0JCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCWZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQl2ID0gUHlMaXN0X0dldEl0ZW0obGlzdCwgaSk7Ci0JCWlmICghUHlJbnRfQ2hlY2sodikpIHsKLQkJCVB5TWVtX0RFTChQVmJ1ZmZlcik7Ci0JCQlQeUVycl9CYWRBcmd1bWVudCgpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJUFZidWZmZXJbaV0gPSBQeUludF9Bc0xvbmcodik7Ci0JfQorICAgIFB5T2JqZWN0ICpsaXN0LCAqdjsKKyAgICBsb25nICpQVmJ1ZmZlcjsKKyAgICBsb25nIGxlbmd0aDsKKyAgICBpbnQgaTsKIAotCWlmIChBTGdldHN0YXR1cyhzZWxmLT5wb3J0LCBQVmJ1ZmZlciwgbGVuZ3RoKSA9PSAtMSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPISIsICZQeUxpc3RfVHlwZSwgJmxpc3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBsZW5ndGggPSBQeUxpc3RfU2l6ZShsaXN0KTsKKyAgICBQVmJ1ZmZlciA9IFB5TWVtX05FVyhsb25nLCBsZW5ndGgpOworICAgIGlmIChQVmJ1ZmZlciA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICAgICAgdiA9IFB5TGlzdF9HZXRJdGVtKGxpc3QsIGkpOworICAgICAgICBpZiAoIVB5SW50X0NoZWNrKHYpKSB7CisgICAgICAgICAgICBQeU1lbV9ERUwoUFZidWZmZXIpOworICAgICAgICAgICAgUHlFcnJfQmFkQXJndW1lbnQoKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIFBWYnVmZmVyW2ldID0gUHlJbnRfQXNMb25nKHYpOworICAgIH0KIAotCWZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKLQkJUHlMaXN0X1NldEl0ZW0obGlzdCwgaSwgUHlJbnRfRnJvbUxvbmcoUFZidWZmZXJbaV0pKTsKKyAgICBpZiAoQUxnZXRzdGF0dXMoc2VsZi0+cG9ydCwgUFZidWZmZXIsIGxlbmd0aCkgPT0gLTEpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JUHlNZW1fREVMKFBWYnVmZmVyKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCisgICAgICAgIFB5TGlzdF9TZXRJdGVtKGxpc3QsIGksIFB5SW50X0Zyb21Mb25nKFBWYnVmZmVyW2ldKSk7CiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlNZW1fREVMKFBWYnVmZmVyKTsKKworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KICNlbmRpZiAvKiBBTF80MDUgKi8KIAogI2VuZGlmIC8qIE9MRF9JTlRFUkZBQ0UgKi8KIAogc3RhdGljIHN0cnVjdCBQeU1ldGhvZERlZiBhbHBfbWV0aG9kc1tdID0gewotI2lmZGVmIEFMX05PX0VMRU0JCS8qIElSSVggNiAqLwotCXsiU2V0Q29uZmlnIiwJKFB5Q0Z1bmN0aW9uKWFscF9TZXRDb25maWcsCU1FVEhfVkFSQVJHUywJYWxwX1NldENvbmZpZ19fZG9jX199LAotCXsiR2V0Q29uZmlnIiwJKFB5Q0Z1bmN0aW9uKWFscF9HZXRDb25maWcsCU1FVEhfVkFSQVJHUywJYWxwX0dldENvbmZpZ19fZG9jX199LAotCXsiR2V0UmVzb3VyY2UiLAkoUHlDRnVuY3Rpb24pYWxwX0dldFJlc291cmNlLAlNRVRIX1ZBUkFSR1MsCWFscF9HZXRSZXNvdXJjZV9fZG9jX199LAotCXsiR2V0RkQiLAkoUHlDRnVuY3Rpb24pYWxwX0dldEZELAlNRVRIX1ZBUkFSR1MsCWFscF9HZXRGRF9fZG9jX199LAotCXsiR2V0RmlsbGVkIiwJKFB5Q0Z1bmN0aW9uKWFscF9HZXRGaWxsZWQsCU1FVEhfVkFSQVJHUywJYWxwX0dldEZpbGxlZF9fZG9jX199LAotCXsiR2V0RmlsbGFibGUiLAkoUHlDRnVuY3Rpb24pYWxwX0dldEZpbGxhYmxlLAlNRVRIX1ZBUkFSR1MsCWFscF9HZXRGaWxsYWJsZV9fZG9jX199LAotCXsiUmVhZEZyYW1lcyIsCShQeUNGdW5jdGlvbilhbHBfUmVhZEZyYW1lcywJTUVUSF9WQVJBUkdTLAlhbHBfUmVhZEZyYW1lc19fZG9jX199LAotCXsiRGlzY2FyZEZyYW1lcyIsCShQeUNGdW5jdGlvbilhbHBfRGlzY2FyZEZyYW1lcywJTUVUSF9WQVJBUkdTLAlhbHBfRGlzY2FyZEZyYW1lc19fZG9jX199LAotCXsiWmVyb0ZyYW1lcyIsCShQeUNGdW5jdGlvbilhbHBfWmVyb0ZyYW1lcywJTUVUSF9WQVJBUkdTLAlhbHBfWmVyb0ZyYW1lc19fZG9jX199LAotCXsiU2V0RmlsbFBvaW50IiwJKFB5Q0Z1bmN0aW9uKWFscF9TZXRGaWxsUG9pbnQsCU1FVEhfVkFSQVJHUywJYWxwX1NldEZpbGxQb2ludF9fZG9jX199LAotCXsiR2V0RmlsbFBvaW50IiwJKFB5Q0Z1bmN0aW9uKWFscF9HZXRGaWxsUG9pbnQsCU1FVEhfVkFSQVJHUywJYWxwX0dldEZpbGxQb2ludF9fZG9jX199LAotCXsiR2V0RnJhbWVOdW1iZXIiLAkoUHlDRnVuY3Rpb24pYWxwX0dldEZyYW1lTnVtYmVyLAlNRVRIX1ZBUkFSR1MsCWFscF9HZXRGcmFtZU51bWJlcl9fZG9jX199LAotCXsiR2V0RnJhbWVUaW1lIiwJKFB5Q0Z1bmN0aW9uKWFscF9HZXRGcmFtZVRpbWUsCU1FVEhfVkFSQVJHUywJYWxwX0dldEZyYW1lVGltZV9fZG9jX199LAotCXsiV3JpdGVGcmFtZXMiLAkoUHlDRnVuY3Rpb24pYWxwX1dyaXRlRnJhbWVzLAlNRVRIX1ZBUkFSR1MsCWFscF9Xcml0ZUZyYW1lc19fZG9jX199LAotCXsiQ2xvc2VQb3J0IiwJKFB5Q0Z1bmN0aW9uKWFscF9DbG9zZVBvcnQsCU1FVEhfVkFSQVJHUywJYWxwX0Nsb3NlUG9ydF9fZG9jX199LAorI2lmZGVmIEFMX05PX0VMRU0gICAgICAgICAgICAgICAvKiBJUklYIDYgKi8KKyAgICB7IlNldENvbmZpZyIsICAgICAgIChQeUNGdW5jdGlvbilhbHBfU2V0Q29uZmlnLCAgICAgTUVUSF9WQVJBUkdTLCAgIGFscF9TZXRDb25maWdfX2RvY19ffSwKKyAgICB7IkdldENvbmZpZyIsICAgICAgIChQeUNGdW5jdGlvbilhbHBfR2V0Q29uZmlnLCAgICAgTUVUSF9WQVJBUkdTLCAgIGFscF9HZXRDb25maWdfX2RvY19ffSwKKyAgICB7IkdldFJlc291cmNlIiwgICAgIChQeUNGdW5jdGlvbilhbHBfR2V0UmVzb3VyY2UsICAgTUVUSF9WQVJBUkdTLCAgIGFscF9HZXRSZXNvdXJjZV9fZG9jX199LAorICAgIHsiR2V0RkQiLCAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWFscF9HZXRGRCwgTUVUSF9WQVJBUkdTLCAgIGFscF9HZXRGRF9fZG9jX199LAorICAgIHsiR2V0RmlsbGVkIiwgICAgICAgKFB5Q0Z1bmN0aW9uKWFscF9HZXRGaWxsZWQsICAgICBNRVRIX1ZBUkFSR1MsICAgYWxwX0dldEZpbGxlZF9fZG9jX199LAorICAgIHsiR2V0RmlsbGFibGUiLCAgICAgKFB5Q0Z1bmN0aW9uKWFscF9HZXRGaWxsYWJsZSwgICBNRVRIX1ZBUkFSR1MsICAgYWxwX0dldEZpbGxhYmxlX19kb2NfX30sCisgICAgeyJSZWFkRnJhbWVzIiwgICAgICAoUHlDRnVuY3Rpb24pYWxwX1JlYWRGcmFtZXMsICAgIE1FVEhfVkFSQVJHUywgICBhbHBfUmVhZEZyYW1lc19fZG9jX199LAorICAgIHsiRGlzY2FyZEZyYW1lcyIsICAgICAgICAgICAoUHlDRnVuY3Rpb24pYWxwX0Rpc2NhcmRGcmFtZXMsIE1FVEhfVkFSQVJHUywgICBhbHBfRGlzY2FyZEZyYW1lc19fZG9jX199LAorICAgIHsiWmVyb0ZyYW1lcyIsICAgICAgKFB5Q0Z1bmN0aW9uKWFscF9aZXJvRnJhbWVzLCAgICBNRVRIX1ZBUkFSR1MsICAgYWxwX1plcm9GcmFtZXNfX2RvY19ffSwKKyAgICB7IlNldEZpbGxQb2ludCIsICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWFscF9TZXRGaWxsUG9pbnQsICBNRVRIX1ZBUkFSR1MsICAgYWxwX1NldEZpbGxQb2ludF9fZG9jX199LAorICAgIHsiR2V0RmlsbFBvaW50IiwgICAgICAgICAgICAoUHlDRnVuY3Rpb24pYWxwX0dldEZpbGxQb2ludCwgIE1FVEhfVkFSQVJHUywgICBhbHBfR2V0RmlsbFBvaW50X19kb2NfX30sCisgICAgeyJHZXRGcmFtZU51bWJlciIsICAgICAgICAgIChQeUNGdW5jdGlvbilhbHBfR2V0RnJhbWVOdW1iZXIsICAgICAgICBNRVRIX1ZBUkFSR1MsICAgYWxwX0dldEZyYW1lTnVtYmVyX19kb2NfX30sCisgICAgeyJHZXRGcmFtZVRpbWUiLCAgICAgICAgICAgIChQeUNGdW5jdGlvbilhbHBfR2V0RnJhbWVUaW1lLCAgTUVUSF9WQVJBUkdTLCAgIGFscF9HZXRGcmFtZVRpbWVfX2RvY19ffSwKKyAgICB7IldyaXRlRnJhbWVzIiwgICAgIChQeUNGdW5jdGlvbilhbHBfV3JpdGVGcmFtZXMsICAgTUVUSF9WQVJBUkdTLCAgIGFscF9Xcml0ZUZyYW1lc19fZG9jX199LAorICAgIHsiQ2xvc2VQb3J0IiwgICAgICAgKFB5Q0Z1bmN0aW9uKWFscF9DbG9zZVBvcnQsICAgICBNRVRIX1ZBUkFSR1MsICAgYWxwX0Nsb3NlUG9ydF9fZG9jX199LAogI2VuZGlmIC8qIEFMX05PX0VMRU0gKi8KICNpZmRlZiBPTERfSU5URVJGQUNFCi0JeyJjbG9zZXBvcnQiLAkJKFB5Q0Z1bmN0aW9uKWFscF9jbG9zZXBvcnQsCU1FVEhfVkFSQVJHU30sCi0JeyJnZXRmZCIsCQkoUHlDRnVuY3Rpb24pYWxwX2dldGZkLAlNRVRIX1ZBUkFSR1N9LAotICAgICAgICB7ImZpbGVubyIsCQkoUHlDRnVuY3Rpb24pYWxwX2dldGZkLAlNRVRIX1ZBUkFSR1N9LAotCXsiZ2V0ZmlsbGVkIiwJCShQeUNGdW5jdGlvbilhbHBfZ2V0ZmlsbGVkLAlNRVRIX1ZBUkFSR1N9LAotCXsiZ2V0ZmlsbGFibGUiLAkJKFB5Q0Z1bmN0aW9uKWFscF9nZXRmaWxsYWJsZSwJTUVUSF9WQVJBUkdTfSwKLQl7InJlYWRzYW1wcyIsCQkoUHlDRnVuY3Rpb24pYWxwX3JlYWRzYW1wcywJTUVUSF9WQVJBUkdTfSwKLQl7IndyaXRlc2FtcHMiLAkJKFB5Q0Z1bmN0aW9uKWFscF93cml0ZXNhbXBzLAlNRVRIX1ZBUkFSR1N9LAotCXsic2V0ZmlsbHBvaW50IiwJKFB5Q0Z1bmN0aW9uKWFscF9zZXRmaWxscG9pbnQsCU1FVEhfVkFSQVJHU30sCi0JeyJnZXRmaWxscG9pbnQiLAkoUHlDRnVuY3Rpb24pYWxwX2dldGZpbGxwb2ludCwJTUVUSF9WQVJBUkdTfSwKLQl7InNldGNvbmZpZyIsCQkoUHlDRnVuY3Rpb24pYWxwX3NldGNvbmZpZywJTUVUSF9WQVJBUkdTfSwKLQl7ImdldGNvbmZpZyIsCQkoUHlDRnVuY3Rpb24pYWxwX2dldGNvbmZpZywJTUVUSF9WQVJBUkdTfSwKKyAgICB7ImNsb3NlcG9ydCIsICAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWFscF9jbG9zZXBvcnQsICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsiZ2V0ZmQiLCAgICAgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pYWxwX2dldGZkLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsiZmlsZW5vIiwgICAgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pYWxwX2dldGZkLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsiZ2V0ZmlsbGVkIiwgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pYWxwX2dldGZpbGxlZCwgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJnZXRmaWxsYWJsZSIsICAgICAgICAgICAgIChQeUNGdW5jdGlvbilhbHBfZ2V0ZmlsbGFibGUsICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7InJlYWRzYW1wcyIsICAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWFscF9yZWFkc2FtcHMsICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsid3JpdGVzYW1wcyIsICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pYWxwX3dyaXRlc2FtcHMsICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJzZXRmaWxscG9pbnQiLCAgICAgICAgICAgIChQeUNGdW5jdGlvbilhbHBfc2V0ZmlsbHBvaW50LCAgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImdldGZpbGxwb2ludCIsICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWFscF9nZXRmaWxscG9pbnQsICBNRVRIX1ZBUkFSR1N9LAorICAgIHsic2V0Y29uZmlnIiwgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pYWxwX3NldGNvbmZpZywgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJnZXRjb25maWciLCAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilhbHBfZ2V0Y29uZmlnLCAgICAgTUVUSF9WQVJBUkdTfSwKICNpZmRlZiBBTF80MDUKLQl7ImdldHN0YXR1cyIsCQkoUHlDRnVuY3Rpb24pYWxwX2dldHN0YXR1cywJTUVUSF9WQVJBUkdTfSwKLSNlbmRpZiAvKiBBTF80MDUgKi8JICAgIAorICAgIHsiZ2V0c3RhdHVzIiwgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pYWxwX2dldHN0YXR1cywgICAgIE1FVEhfVkFSQVJHU30sCisjZW5kaWYgLyogQUxfNDA1ICovCiAjZW5kaWYgLyogT0xEX0lOVEVSRkFDRSAqLwotIAotCXtOVUxMLAkJTlVMTH0JCS8qIHNlbnRpbmVsICovCisKKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogLyogLS0tLS0tLS0tLSAqLwpAQCAtMTI1Miw3NCArMTI1Miw3NCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIG5ld2FscG9iamVjdChBTHBvcnQgcG9ydCkKIHsKLQlhbHBvYmplY3QgKnNlbGY7Ci0JCi0Jc2VsZiA9IFB5T2JqZWN0X05ldyhhbHBvYmplY3QsICZBbHB0eXBlKTsKLQlpZiAoc2VsZiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQkvKiBYWFhYIEFkZCB5b3VyIG93biBpbml0aWFsaXplcnMgaGVyZSAqLwotCXNlbGYtPnBvcnQgPSBwb3J0OwotCXJldHVybiAoUHlPYmplY3QgKikgc2VsZjsKKyAgICBhbHBvYmplY3QgKnNlbGY7CisKKyAgICBzZWxmID0gUHlPYmplY3RfTmV3KGFscG9iamVjdCwgJkFscHR5cGUpOworICAgIGlmIChzZWxmID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIC8qIFhYWFggQWRkIHlvdXIgb3duIGluaXRpYWxpemVycyBoZXJlICovCisgICAgc2VsZi0+cG9ydCA9IHBvcnQ7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKSBzZWxmOwogfQogCiAKIHN0YXRpYyB2b2lkCiBhbHBfZGVhbGxvYyhhbHBvYmplY3QgKnNlbGYpCiB7Ci0JLyogWFhYWCBBZGQgeW91ciBvd24gY2xlYW51cCBjb2RlIGhlcmUgKi8KLQlpZiAoc2VsZi0+cG9ydCkgewotI2lmZGVmIEFMX05PX0VMRU0JCS8qIElSSVggNiAqLwotCQlhbENsb3NlUG9ydChzZWxmLT5wb3J0KTsKKyAgICAvKiBYWFhYIEFkZCB5b3VyIG93biBjbGVhbnVwIGNvZGUgaGVyZSAqLworICAgIGlmIChzZWxmLT5wb3J0KSB7CisjaWZkZWYgQUxfTk9fRUxFTSAgICAgICAgICAgICAgIC8qIElSSVggNiAqLworICAgICAgICBhbENsb3NlUG9ydChzZWxmLT5wb3J0KTsKICNlbHNlCi0JCUFMY2xvc2Vwb3J0KHNlbGYtPnBvcnQpOworICAgICAgICBBTGNsb3NlcG9ydChzZWxmLT5wb3J0KTsKICNlbmRpZgotCX0KLQlQeU9iamVjdF9EZWwoc2VsZik7CisgICAgfQorICAgIFB5T2JqZWN0X0RlbChzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGFscF9nZXRhdHRyKGFscG9iamVjdCAqc2VsZiwgY2hhciAqbmFtZSkKIHsKLQkvKiBYWFhYIEFkZCB5b3VyIG93biBnZXRhdHRyIGNvZGUgaGVyZSAqLwotCWlmIChzZWxmLT5wb3J0ID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKEVycm9yT2JqZWN0LCAicG9ydCBhbHJlYWR5IGNsb3NlZCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIFB5X0ZpbmRNZXRob2QoYWxwX21ldGhvZHMsIChQeU9iamVjdCAqKXNlbGYsIG5hbWUpOworICAgIC8qIFhYWFggQWRkIHlvdXIgb3duIGdldGF0dHIgY29kZSBoZXJlICovCisgICAgaWYgKHNlbGYtPnBvcnQgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoRXJyb3JPYmplY3QsICJwb3J0IGFscmVhZHkgY2xvc2VkIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlfRmluZE1ldGhvZChhbHBfbWV0aG9kcywgKFB5T2JqZWN0ICopc2VsZiwgbmFtZSk7CiB9CiAKIFB5RG9jX1NUUlZBUihBbHB0eXBlX19kb2NfXywgIiIpOwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IEFscHR5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSkKLQkwLAkJCQkvKm9iX3NpemUqLwotCSJhbC5wb3J0IiwJCQkvKnRwX25hbWUqLwotCXNpemVvZihhbHBvYmplY3QpLAkJLyp0cF9iYXNpY3NpemUqLwotCTAsCQkJCS8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcilhbHBfZGVhbGxvYywJLyp0cF9kZWFsbG9jKi8KLQkocHJpbnRmdW5jKTAsCQkvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpYWxwX2dldGF0dHIsCS8qdHBfZ2V0YXR0ciovCi0JKHNldGF0dHJmdW5jKTAsCS8qdHBfc2V0YXR0ciovCi0JKGNtcGZ1bmMpMCwJCS8qdHBfY29tcGFyZSovCi0JKHJlcHJmdW5jKTAsCQkvKnRwX3JlcHIqLwotCTAsCQkJLyp0cF9hc19udW1iZXIqLwotCTAsCQkvKnRwX2FzX3NlcXVlbmNlKi8KLQkwLAkJLyp0cF9hc19tYXBwaW5nKi8KLQkoaGFzaGZ1bmMpMCwJCS8qdHBfaGFzaCovCi0JKHRlcm5hcnlmdW5jKTAsCQkvKnRwX2NhbGwqLwotCShyZXByZnVuYykwLAkJLyp0cF9zdHIqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUpCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypvYl9zaXplKi8KKyAgICAiYWwucG9ydCIsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX25hbWUqLworICAgIHNpemVvZihhbHBvYmplY3QpLCAgICAgICAgICAgICAgICAgIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpYWxwX2RlYWxsb2MsICAgICAgICAgICAgLyp0cF9kZWFsbG9jKi8KKyAgICAocHJpbnRmdW5jKTAsICAgICAgICAgICAgICAgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKWFscF9nZXRhdHRyLCAgICAgICAgICAgLyp0cF9nZXRhdHRyKi8KKyAgICAoc2V0YXR0cmZ1bmMpMCwgICAgIC8qdHBfc2V0YXR0ciovCisgICAgKGNtcGZ1bmMpMCwgICAgICAgICAgICAgICAgIC8qdHBfY29tcGFyZSovCisgICAgKHJlcHJmdW5jKTAsICAgICAgICAgICAgICAgIC8qdHBfcmVwciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbnVtYmVyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfYXNfc2VxdWVuY2UqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9hc19tYXBwaW5nKi8KKyAgICAoaGFzaGZ1bmMpMCwgICAgICAgICAgICAgICAgLyp0cF9oYXNoKi8KKyAgICAodGVybmFyeWZ1bmMpMCwgICAgICAgICAgICAgLyp0cF9jYWxsKi8KKyAgICAocmVwcmZ1bmMpMCwgICAgICAgICAgICAgICAgLyp0cF9zdHIqLwogCi0JLyogU3BhY2UgZm9yIGZ1dHVyZSBleHBhbnNpb24gKi8KLQkwTCwwTCwwTCwwTCwKLQlBbHB0eXBlX19kb2NfXyAvKiBEb2N1bWVudGF0aW9uIHN0cmluZyAqLworICAgIC8qIFNwYWNlIGZvciBmdXR1cmUgZXhwYW5zaW9uICovCisgICAgMEwsMEwsMEwsMEwsCisgICAgQWxwdHlwZV9fZG9jX18gLyogRG9jdW1lbnRhdGlvbiBzdHJpbmcgKi8KIH07CiAKIC8qIEVuZCBvZiBjb2RlIGZvciBwb3J0IG9iamVjdHMgKi8KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKIAotI2lmZGVmIEFMX05PX0VMRU0JCS8qIElSSVggNiAqLworI2lmZGVmIEFMX05PX0VMRU0gICAgICAgICAgICAgICAvKiBJUklYIDYgKi8KIAogUHlEb2NfU1RSVkFSKGFsX05ld0NvbmZpZ19fZG9jX18sCiAiYWxOZXdDb25maWc6IGNyZWF0ZSBhbmQgaW5pdGlhbGl6ZSBhbiBhdWRpbyBBTGNvbmZpZyBzdHJ1Y3R1cmUuIik7CkBAIC0xMzI3LDEzICsxMzI3LDEzIEBACiBzdGF0aWMgUHlPYmplY3QgKgogYWxfTmV3Q29uZmlnKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlBTGNvbmZpZyBjb25maWc7CisgICAgQUxjb25maWcgY29uZmlnOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6TmV3Q29uZmlnIikpCi0JCXJldHVybiBOVUxMOwotCWlmICgoY29uZmlnID0gYWxOZXdDb25maWcoKSkgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIG5ld2FsY29iamVjdChjb25maWcpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOk5ld0NvbmZpZyIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoKGNvbmZpZyA9IGFsTmV3Q29uZmlnKCkpID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBuZXdhbGNvYmplY3QoY29uZmlnKTsKIH0KIAogUHlEb2NfU1RSVkFSKGFsX09wZW5Qb3J0X19kb2NfXywKQEAgLTEzNDIsMTUgKzEzNDIsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBhbF9PcGVuUG9ydChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JQUxwb3J0IHBvcnQ7Ci0JY2hhciAqbmFtZSwgKmRpcjsKLQlhbGNvYmplY3QgKmNvbmZpZyA9IE5VTEw7CisgICAgQUxwb3J0IHBvcnQ7CisgICAgY2hhciAqbmFtZSwgKmRpcjsKKyAgICBhbGNvYmplY3QgKmNvbmZpZyA9IE5VTEw7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInNzfE8hOk9wZW5Qb3J0IiwgJm5hbWUsICZkaXIsICZBbGN0eXBlLCAmY29uZmlnKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKChwb3J0ID0gYWxPcGVuUG9ydChuYW1lLCBkaXIsIGNvbmZpZyA/IGNvbmZpZy0+Y29uZmlnIDogTlVMTCkpID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBuZXdhbHBvYmplY3QocG9ydCk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzc3xPITpPcGVuUG9ydCIsICZuYW1lLCAmZGlyLCAmQWxjdHlwZSwgJmNvbmZpZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICgocG9ydCA9IGFsT3BlblBvcnQobmFtZSwgZGlyLCBjb25maWcgPyBjb25maWctPmNvbmZpZyA6IE5VTEwpKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gbmV3YWxwb2JqZWN0KHBvcnQpOwogfQogCiBQeURvY19TVFJWQVIoYWxfQ29ubmVjdF9fZG9jX18sCkBAIC0xMzU5LDM3ICsxMzU5LDM3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYWxfQ29ubmVjdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IHNvdXJjZSwgZGVzdCwgbnByb3BzID0gMCwgaWQsIGk7Ci0JQUxwdiAqcHJvcHMgPSBOVUxMOwotCUFMcGFyYW1JbmZvICpwcm9waW5mbyA9IE5VTEw7Ci0JUHlPYmplY3QgKnByb3BvYmogPSBOVUxMOworICAgIGludCBzb3VyY2UsIGRlc3QsIG5wcm9wcyA9IDAsIGlkLCBpOworICAgIEFMcHYgKnByb3BzID0gTlVMTDsKKyAgICBBTHBhcmFtSW5mbyAqcHJvcGluZm8gPSBOVUxMOworICAgIFB5T2JqZWN0ICpwcm9wb2JqID0gTlVMTDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaWl8TyE6Q29ubmVjdCIsICZzb3VyY2UsICZkZXN0LCAmUHlMaXN0X1R5cGUsICZwcm9wb2JqKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKHByb3BvYmogIT0gTlVMTCkgewotCQlucHJvcHMgPSBweXRob24ycGFyYW1zKHNvdXJjZSwgZGVzdCwgcHJvcG9iaiwgJnByb3BzLCAmcHJvcGluZm8pOwotCQlpZiAobnByb3BzIDwgMCkKLQkJCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpfE8hOkNvbm5lY3QiLCAmc291cmNlLCAmZGVzdCwgJlB5TGlzdF9UeXBlLCAmcHJvcG9iaikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChwcm9wb2JqICE9IE5VTEwpIHsKKyAgICAgICAgbnByb3BzID0gcHl0aG9uMnBhcmFtcyhzb3VyY2UsIGRlc3QsIHByb3BvYmosICZwcm9wcywgJnByb3BpbmZvKTsKKyAgICAgICAgaWYgKG5wcm9wcyA8IDApCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlpZCA9IGFsQ29ubmVjdChzb3VyY2UsIGRlc3QsIHByb3BzLCBucHJvcHMpOworICAgIGlkID0gYWxDb25uZWN0KHNvdXJjZSwgZGVzdCwgcHJvcHMsIG5wcm9wcyk7CiAKLQlpZiAocHJvcHMpIHsKLQkJZm9yIChpID0gMDsgaSA8IG5wcm9wczsgaSsrKSB7Ci0JCQlzd2l0Y2ggKHByb3BpbmZvW2ldLnZhbHVlVHlwZSkgewotCQkJY2FzZSBBTF9TRVRfVkFMOgotCQkJY2FzZSBBTF9WRUNUT1JfVkFMOgotCQkJCVB5TWVtX0RFTChwcm9wc1tpXS52YWx1ZS5wdHIpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCVB5TWVtX0RFTChwcm9wcyk7Ci0JCVB5TWVtX0RFTChwcm9waW5mbyk7Ci0JfQorICAgIGlmIChwcm9wcykgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnByb3BzOyBpKyspIHsKKyAgICAgICAgICAgIHN3aXRjaCAocHJvcGluZm9baV0udmFsdWVUeXBlKSB7CisgICAgICAgICAgICBjYXNlIEFMX1NFVF9WQUw6CisgICAgICAgICAgICBjYXNlIEFMX1ZFQ1RPUl9WQUw6CisgICAgICAgICAgICAgICAgUHlNZW1fREVMKHByb3BzW2ldLnZhbHVlLnB0cik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgUHlNZW1fREVMKHByb3BzKTsKKyAgICAgICAgUHlNZW1fREVMKHByb3BpbmZvKTsKKyAgICB9CiAKLQlpZiAoaWQgPCAwKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIGlkKTsKKyAgICBpZiAoaWQgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIGlkKTsKIH0KIAogUHlEb2NfU1RSVkFSKGFsX0Rpc2Nvbm5lY3RfX2RvY19fLApAQCAtMTM5OCwxNCArMTM5OCwxNCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGFsX0Rpc2Nvbm5lY3QoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCByZXM7CisgICAgaW50IHJlczsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpEaXNjb25uZWN0IiwgJnJlcykpCi0JCXJldHVybiBOVUxMOwotCWlmIChhbERpc2Nvbm5lY3QocmVzKSA8IDApCi0JCXJldHVybiBOVUxMOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6RGlzY29ubmVjdCIsICZyZXMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoYWxEaXNjb25uZWN0KHJlcykgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIFB5RG9jX1NUUlZBUihhbF9HZXRQYXJhbXNfX2RvY19fLApAQCAtMTQxNCwxNDMgKzE0MTQsMTQzIEBACiBzdGF0aWMgUHlPYmplY3QgKgogYWxfR2V0UGFyYW1zKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgcmVzb3VyY2U7Ci0JUHlPYmplY3QgKnB2c2xpc3QsICppdGVtID0gTlVMTCwgKnYgPSBOVUxMOwotCUFMcHYgKnB2czsKLQlpbnQgaSwgaiwgbnB2czsKLQlBTHBhcmFtSW5mbyAqcGluZm87CisgICAgaW50IHJlc291cmNlOworICAgIFB5T2JqZWN0ICpwdnNsaXN0LCAqaXRlbSA9IE5VTEwsICp2ID0gTlVMTDsKKyAgICBBTHB2ICpwdnM7CisgICAgaW50IGksIGosIG5wdnM7CisgICAgQUxwYXJhbUluZm8gKnBpbmZvOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpTyE6R2V0UGFyYW1zIiwgJnJlc291cmNlLCAmUHlMaXN0X1R5cGUsICZwdnNsaXN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JbnB2cyA9IFB5TGlzdF9TaXplKHB2c2xpc3QpOwotCXB2cyA9IFB5TWVtX05FVyhBTHB2LCBucHZzKTsKLQlwaW5mbyA9IFB5TWVtX05FVyhBTHBhcmFtSW5mbywgbnB2cyk7Ci0JZm9yIChpID0gMDsgaSA8IG5wdnM7IGkrKykgewotCQlpdGVtID0gUHlMaXN0X0dldEl0ZW0ocHZzbGlzdCwgaSk7Ci0JCWlmICghUHlJbnRfQ2hlY2soaXRlbSkpIHsKLQkJCWl0ZW0gPSBOVUxMOwotCQkJUHlFcnJfU2V0U3RyaW5nKEVycm9yT2JqZWN0LCAibGlzdCBvZiBpbnRlZ2VycyBleHBlY3RlZCIpOwotCQkJZ290byBlcnJvcjsKLQkJfQotCQlwdnNbaV0ucGFyYW0gPSAoaW50KSBQeUludF9Bc0xvbmcoaXRlbSk7Ci0JCWl0ZW0gPSBOVUxMOwkvKiBub3QgbmVlZGVkIGFueW1vcmUgKi8KLQkJaWYgKGFsR2V0UGFyYW1JbmZvKHJlc291cmNlLCBwdnNbaV0ucGFyYW0sICZwaW5mb1tpXSkgPCAwKQotCQkJZ290byBlcnJvcjsKLQkJc3dpdGNoIChwaW5mb1tpXS52YWx1ZVR5cGUpIHsKLQkJY2FzZSBBTF9OT19WQUw6Ci0JCQlicmVhazsKLQkJY2FzZSBBTF9NQVRSSVhfVkFMOgotCQkJcGluZm9baV0ubWF4RWxlbXMgKj0gcGluZm9baV0ubWF4RWxlbXMyOwotCQkJLyogZmFsbCB0aHJvdWdoICovCi0JCWNhc2UgQUxfU1RSSU5HX1ZBTDoKLQkJY2FzZSBBTF9TRVRfVkFMOgotCQljYXNlIEFMX1ZFQ1RPUl9WQUw6Ci0JCQlzd2l0Y2ggKHBpbmZvW2ldLmVsZW1lbnRUeXBlKSB7Ci0JCQljYXNlIEFMX0lOVDMyX0VMRU06Ci0JCQljYXNlIEFMX1JFU09VUkNFX0VMRU06Ci0JCQljYXNlIEFMX0VOVU1fRUxFTToKLQkJCQlwdnNbaV0udmFsdWUucHRyID0gUHlNZW1fTkVXKGludCwgcGluZm9baV0ubWF4RWxlbXMpOwotCQkJCXB2c1tpXS5zaXplSW4gPSBwaW5mb1tpXS5tYXhFbGVtczsKLQkJCQlicmVhazsKLQkJCWNhc2UgQUxfSU5UNjRfRUxFTToKLQkJCWNhc2UgQUxfRklYRURfRUxFTToKLQkJCQlwdnNbaV0udmFsdWUucHRyID0gUHlNZW1fTkVXKGxvbmcgbG9uZywgcGluZm9baV0ubWF4RWxlbXMpOwotCQkJCXB2c1tpXS5zaXplSW4gPSBwaW5mb1tpXS5tYXhFbGVtczsKLQkJCQlicmVhazsKLQkJCWNhc2UgQUxfQ0hBUl9FTEVNOgotCQkJCXB2c1tpXS52YWx1ZS5wdHIgPSBQeU1lbV9ORVcoY2hhciwgMzIpOwotCQkJCXB2c1tpXS5zaXplSW4gPSAzMjsKLQkJCQlicmVhazsKLQkJCWNhc2UgQUxfTk9fRUxFTToKLQkJCWNhc2UgQUxfUFRSX0VMRU06Ci0JCQlkZWZhdWx0OgotCQkJCVB5RXJyX1NldFN0cmluZyhFcnJvck9iamVjdCwgImludGVybmFsIGVycm9yIik7Ci0JCQkJZ290byBlcnJvcjsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIEFMX1NDQUxBUl9WQUw6Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCVB5RXJyX1NldFN0cmluZyhFcnJvck9iamVjdCwgImludGVybmFsIGVycm9yIik7Ci0JCQlnb3RvIGVycm9yOwotCQl9Ci0JCWlmIChwaW5mb1tpXS52YWx1ZVR5cGUgPT0gQUxfTUFUUklYX1ZBTCkgewotCQkJcGluZm9baV0ubWF4RWxlbXMgLz0gcGluZm9baV0ubWF4RWxlbXMyOwotCQkJcHZzW2ldLnNpemVJbiAvPSBwaW5mb1tpXS5tYXhFbGVtczI7Ci0JCQlwdnNbaV0uc2l6ZTJJbiA9IHBpbmZvW2ldLm1heEVsZW1zMjsKLQkJfQotCX0KLQlpZiAoYWxHZXRQYXJhbXMocmVzb3VyY2UsIHB2cywgbnB2cykgPCAwKQotCQlnb3RvIGVycm9yOwotCWlmICghKHYgPSBQeUxpc3RfTmV3KG5wdnMpKSkKLQkJZ290byBlcnJvcjsKLQlmb3IgKGkgPSAwOyBpIDwgbnB2czsgaSsrKSB7Ci0JCWlmIChwdnNbaV0uc2l6ZU91dCA8IDApIHsKLQkJCWNoYXIgYnVmWzMyXTsKLQkJCVB5T1Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwKLQkJCQkgICAgICAicHJvYmxlbSB3aXRoIHBhcmFtICVkIiwgaSk7Ci0JCQlQeUVycl9TZXRTdHJpbmcoRXJyb3JPYmplY3QsIGJ1Zik7Ci0JCQlnb3RvIGVycm9yOwotCQl9Ci0JCXN3aXRjaCAocGluZm9baV0udmFsdWVUeXBlKSB7Ci0JCWNhc2UgQUxfTk9fVkFMOgotCQkJaXRlbSA9IFB5X05vbmU7Ci0JCQlQeV9JTkNSRUYoaXRlbSk7Ci0JCQlicmVhazsKLQkJY2FzZSBBTF9TVFJJTkdfVkFMOgotCQkJaXRlbSA9IFB5U3RyaW5nX0Zyb21TdHJpbmcocHZzW2ldLnZhbHVlLnB0cik7Ci0JCQlQeU1lbV9ERUwocHZzW2ldLnZhbHVlLnB0cik7Ci0JCQlicmVhazsKLQkJY2FzZSBBTF9NQVRSSVhfVkFMOgotCQkJLyogWFhYWCB0aGlzIGlzIG5vdCByaWdodCAqLwotCQkJcHZzW2ldLnNpemVPdXQgKj0gcHZzW2ldLnNpemUyT3V0OwotCQkJLyogZmFsbCB0aHJvdWdoICovCi0JCWNhc2UgQUxfU0VUX1ZBTDoKLQkJY2FzZSBBTF9WRUNUT1JfVkFMOgotCQkJaXRlbSA9IFB5TGlzdF9OZXcocHZzW2ldLnNpemVPdXQpOwotCQkJZm9yIChqID0gMDsgaiA8IHB2c1tpXS5zaXplT3V0OyBqKyspIHsKLQkJCQlzd2l0Y2ggKHBpbmZvW2ldLmVsZW1lbnRUeXBlKSB7Ci0JCQkJY2FzZSBBTF9JTlQzMl9FTEVNOgotCQkJCWNhc2UgQUxfUkVTT1VSQ0VfRUxFTToKLQkJCQljYXNlIEFMX0VOVU1fRUxFTToKLQkJCQkJUHlMaXN0X1NldEl0ZW0oaXRlbSwgaiwgUHlJbnRfRnJvbUxvbmcoKGxvbmcpICgoaW50ICopIHB2c1tpXS52YWx1ZS5wdHIpW2pdKSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQUxfSU5UNjRfRUxFTToKLQkJCQkJUHlMaXN0X1NldEl0ZW0oaXRlbSwgaiwgUHlMb25nX0Zyb21Mb25nTG9uZygoKGxvbmcgbG9uZyAqKSBwdnNbaV0udmFsdWUucHRyKVtqXSkpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEFMX0ZJWEVEX0VMRU06Ci0JCQkJCVB5TGlzdF9TZXRJdGVtKGl0ZW0sIGosIFB5RmxvYXRfRnJvbURvdWJsZShhbEZpeGVkVG9Eb3VibGUoKChsb25nIGxvbmcgKikgcHZzW2ldLnZhbHVlLnB0cilbal0pKSk7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCVB5RXJyX1NldFN0cmluZyhFcnJvck9iamVjdCwgImludGVybmFsIGVycm9yIik7Ci0JCQkJCWdvdG8gZXJyb3I7Ci0JCQkJfQotCQkJfQotCQkJUHlNZW1fREVMKHB2c1tpXS52YWx1ZS5wdHIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQUxfU0NBTEFSX1ZBTDoKLQkJCWl0ZW0gPSBwYXJhbTJweXRob24ocmVzb3VyY2UsIHB2c1tpXS5wYXJhbSwgcHZzW2ldLnZhbHVlLCAmcGluZm9baV0pOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKFB5RXJyX09jY3VycmVkKCkgfHwKLQkJICAgIFB5TGlzdF9TZXRJdGVtKHYsIGksIFB5X0J1aWxkVmFsdWUoIihpTykiLCBwdnNbaV0ucGFyYW0sCi0JCQkJCQkgICAgICAgaXRlbSkpIDwgMCB8fAotCQkgICAgUHlFcnJfT2NjdXJyZWQoKSkKLQkJCWdvdG8gZXJyb3I7Ci0JCVB5X0RFQ1JFRihpdGVtKTsKLQl9Ci0JUHlNZW1fREVMKHB2cyk7Ci0JUHlNZW1fREVMKHBpbmZvKTsKLQlyZXR1cm4gdjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlPITpHZXRQYXJhbXMiLCAmcmVzb3VyY2UsICZQeUxpc3RfVHlwZSwgJnB2c2xpc3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBucHZzID0gUHlMaXN0X1NpemUocHZzbGlzdCk7CisgICAgcHZzID0gUHlNZW1fTkVXKEFMcHYsIG5wdnMpOworICAgIHBpbmZvID0gUHlNZW1fTkVXKEFMcGFyYW1JbmZvLCBucHZzKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnB2czsgaSsrKSB7CisgICAgICAgIGl0ZW0gPSBQeUxpc3RfR2V0SXRlbShwdnNsaXN0LCBpKTsKKyAgICAgICAgaWYgKCFQeUludF9DaGVjayhpdGVtKSkgeworICAgICAgICAgICAgaXRlbSA9IE5VTEw7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoRXJyb3JPYmplY3QsICJsaXN0IG9mIGludGVnZXJzIGV4cGVjdGVkIik7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgICAgIHB2c1tpXS5wYXJhbSA9IChpbnQpIFB5SW50X0FzTG9uZyhpdGVtKTsKKyAgICAgICAgaXRlbSA9IE5VTEw7ICAgICAgICAgICAgLyogbm90IG5lZWRlZCBhbnltb3JlICovCisgICAgICAgIGlmIChhbEdldFBhcmFtSW5mbyhyZXNvdXJjZSwgcHZzW2ldLnBhcmFtLCAmcGluZm9baV0pIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIHN3aXRjaCAocGluZm9baV0udmFsdWVUeXBlKSB7CisgICAgICAgIGNhc2UgQUxfTk9fVkFMOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQUxfTUFUUklYX1ZBTDoKKyAgICAgICAgICAgIHBpbmZvW2ldLm1heEVsZW1zICo9IHBpbmZvW2ldLm1heEVsZW1zMjsKKyAgICAgICAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLworICAgICAgICBjYXNlIEFMX1NUUklOR19WQUw6CisgICAgICAgIGNhc2UgQUxfU0VUX1ZBTDoKKyAgICAgICAgY2FzZSBBTF9WRUNUT1JfVkFMOgorICAgICAgICAgICAgc3dpdGNoIChwaW5mb1tpXS5lbGVtZW50VHlwZSkgeworICAgICAgICAgICAgY2FzZSBBTF9JTlQzMl9FTEVNOgorICAgICAgICAgICAgY2FzZSBBTF9SRVNPVVJDRV9FTEVNOgorICAgICAgICAgICAgY2FzZSBBTF9FTlVNX0VMRU06CisgICAgICAgICAgICAgICAgcHZzW2ldLnZhbHVlLnB0ciA9IFB5TWVtX05FVyhpbnQsIHBpbmZvW2ldLm1heEVsZW1zKTsKKyAgICAgICAgICAgICAgICBwdnNbaV0uc2l6ZUluID0gcGluZm9baV0ubWF4RWxlbXM7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFMX0lOVDY0X0VMRU06CisgICAgICAgICAgICBjYXNlIEFMX0ZJWEVEX0VMRU06CisgICAgICAgICAgICAgICAgcHZzW2ldLnZhbHVlLnB0ciA9IFB5TWVtX05FVyhsb25nIGxvbmcsIHBpbmZvW2ldLm1heEVsZW1zKTsKKyAgICAgICAgICAgICAgICBwdnNbaV0uc2l6ZUluID0gcGluZm9baV0ubWF4RWxlbXM7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFMX0NIQVJfRUxFTToKKyAgICAgICAgICAgICAgICBwdnNbaV0udmFsdWUucHRyID0gUHlNZW1fTkVXKGNoYXIsIDMyKTsKKyAgICAgICAgICAgICAgICBwdnNbaV0uc2l6ZUluID0gMzI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFMX05PX0VMRU06CisgICAgICAgICAgICBjYXNlIEFMX1BUUl9FTEVNOgorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoRXJyb3JPYmplY3QsICJpbnRlcm5hbCBlcnJvciIpOworICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBTF9TQ0FMQVJfVkFMOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoRXJyb3JPYmplY3QsICJpbnRlcm5hbCBlcnJvciIpOworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgICAgICBpZiAocGluZm9baV0udmFsdWVUeXBlID09IEFMX01BVFJJWF9WQUwpIHsKKyAgICAgICAgICAgIHBpbmZvW2ldLm1heEVsZW1zIC89IHBpbmZvW2ldLm1heEVsZW1zMjsKKyAgICAgICAgICAgIHB2c1tpXS5zaXplSW4gLz0gcGluZm9baV0ubWF4RWxlbXMyOworICAgICAgICAgICAgcHZzW2ldLnNpemUySW4gPSBwaW5mb1tpXS5tYXhFbGVtczI7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGFsR2V0UGFyYW1zKHJlc291cmNlLCBwdnMsIG5wdnMpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBpZiAoISh2ID0gUHlMaXN0X05ldyhucHZzKSkpCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgZm9yIChpID0gMDsgaSA8IG5wdnM7IGkrKykgeworICAgICAgICBpZiAocHZzW2ldLnNpemVPdXQgPCAwKSB7CisgICAgICAgICAgICBjaGFyIGJ1ZlszMl07CisgICAgICAgICAgICBQeU9TX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJwcm9ibGVtIHdpdGggcGFyYW0gJWQiLCBpKTsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhFcnJvck9iamVjdCwgYnVmKTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChwaW5mb1tpXS52YWx1ZVR5cGUpIHsKKyAgICAgICAgY2FzZSBBTF9OT19WQUw6CisgICAgICAgICAgICBpdGVtID0gUHlfTm9uZTsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihpdGVtKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFMX1NUUklOR19WQUw6CisgICAgICAgICAgICBpdGVtID0gUHlTdHJpbmdfRnJvbVN0cmluZyhwdnNbaV0udmFsdWUucHRyKTsKKyAgICAgICAgICAgIFB5TWVtX0RFTChwdnNbaV0udmFsdWUucHRyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFMX01BVFJJWF9WQUw6CisgICAgICAgICAgICAvKiBYWFhYIHRoaXMgaXMgbm90IHJpZ2h0ICovCisgICAgICAgICAgICBwdnNbaV0uc2l6ZU91dCAqPSBwdnNbaV0uc2l6ZTJPdXQ7CisgICAgICAgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KKyAgICAgICAgY2FzZSBBTF9TRVRfVkFMOgorICAgICAgICBjYXNlIEFMX1ZFQ1RPUl9WQUw6CisgICAgICAgICAgICBpdGVtID0gUHlMaXN0X05ldyhwdnNbaV0uc2l6ZU91dCk7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgcHZzW2ldLnNpemVPdXQ7IGorKykgeworICAgICAgICAgICAgICAgIHN3aXRjaCAocGluZm9baV0uZWxlbWVudFR5cGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIEFMX0lOVDMyX0VMRU06CisgICAgICAgICAgICAgICAgY2FzZSBBTF9SRVNPVVJDRV9FTEVNOgorICAgICAgICAgICAgICAgIGNhc2UgQUxfRU5VTV9FTEVNOgorICAgICAgICAgICAgICAgICAgICBQeUxpc3RfU2V0SXRlbShpdGVtLCBqLCBQeUludF9Gcm9tTG9uZygobG9uZykgKChpbnQgKikgcHZzW2ldLnZhbHVlLnB0cilbal0pKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBBTF9JTlQ2NF9FTEVNOgorICAgICAgICAgICAgICAgICAgICBQeUxpc3RfU2V0SXRlbShpdGVtLCBqLCBQeUxvbmdfRnJvbUxvbmdMb25nKCgobG9uZyBsb25nICopIHB2c1tpXS52YWx1ZS5wdHIpW2pdKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQUxfRklYRURfRUxFTToKKyAgICAgICAgICAgICAgICAgICAgUHlMaXN0X1NldEl0ZW0oaXRlbSwgaiwgUHlGbG9hdF9Gcm9tRG91YmxlKGFsRml4ZWRUb0RvdWJsZSgoKGxvbmcgbG9uZyAqKSBwdnNbaV0udmFsdWUucHRyKVtqXSkpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEVycm9yT2JqZWN0LCAiaW50ZXJuYWwgZXJyb3IiKTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQeU1lbV9ERUwocHZzW2ldLnZhbHVlLnB0cik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBTF9TQ0FMQVJfVkFMOgorICAgICAgICAgICAgaXRlbSA9IHBhcmFtMnB5dGhvbihyZXNvdXJjZSwgcHZzW2ldLnBhcmFtLCBwdnNbaV0udmFsdWUsICZwaW5mb1tpXSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSB8fAorICAgICAgICAgICAgUHlMaXN0X1NldEl0ZW0odiwgaSwgUHlfQnVpbGRWYWx1ZSgiKGlPKSIsIHB2c1tpXS5wYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSkpIDwgMCB8fAorICAgICAgICAgICAgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICB9CisgICAgUHlNZW1fREVMKHB2cyk7CisgICAgUHlNZW1fREVMKHBpbmZvKTsKKyAgICByZXR1cm4gdjsKIAogICBlcnJvcjoKLQlQeV9YREVDUkVGKHYpOwotCVB5X1hERUNSRUYoaXRlbSk7Ci0JaWYgKHB2cykKLQkJUHlNZW1fREVMKHB2cyk7Ci0JaWYgKHBpbmZvKQotCQlQeU1lbV9ERUwocGluZm8pOwotCXJldHVybiBOVUxMOworICAgIFB5X1hERUNSRUYodik7CisgICAgUHlfWERFQ1JFRihpdGVtKTsKKyAgICBpZiAocHZzKQorICAgICAgICBQeU1lbV9ERUwocHZzKTsKKyAgICBpZiAocGluZm8pCisgICAgICAgIFB5TWVtX0RFTChwaW5mbyk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIFB5RG9jX1NUUlZBUihhbF9TZXRQYXJhbXNfX2RvY19fLApAQCAtMTU1OSw0MyArMTU1OSw0MyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGFsX1NldFBhcmFtcyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IHJlc291cmNlOwotCVB5T2JqZWN0ICpwdnNsaXN0OwotCUFMcHYgKnB2czsKLQlBTHBhcmFtSW5mbyAqcGluZm87Ci0JaW50IG5wdnMsIGk7CisgICAgaW50IHJlc291cmNlOworICAgIFB5T2JqZWN0ICpwdnNsaXN0OworICAgIEFMcHYgKnB2czsKKyAgICBBTHBhcmFtSW5mbyAqcGluZm87CisgICAgaW50IG5wdnMsIGk7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlPITpTZXRQYXJhbXMiLCAmcmVzb3VyY2UsICZQeUxpc3RfVHlwZSwgJnB2c2xpc3QpKQotCQlyZXR1cm4gTlVMTDsKLQlucHZzID0gcHl0aG9uMnBhcmFtcyhyZXNvdXJjZSwgLTEsIHB2c2xpc3QsICZwdnMsICZwaW5mbyk7Ci0JaWYgKG5wdnMgPCAwKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlPITpTZXRQYXJhbXMiLCAmcmVzb3VyY2UsICZQeUxpc3RfVHlwZSwgJnB2c2xpc3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBucHZzID0gcHl0aG9uMnBhcmFtcyhyZXNvdXJjZSwgLTEsIHB2c2xpc3QsICZwdnMsICZwaW5mbyk7CisgICAgaWYgKG5wdnMgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChhbFNldFBhcmFtcyhyZXNvdXJjZSwgcHZzLCBucHZzKSA8IDApCi0JCWdvdG8gZXJyb3I7CisgICAgaWYgKGFsU2V0UGFyYW1zKHJlc291cmNlLCBwdnMsIG5wdnMpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKIAotCS8qIGNsZWFudXAgKi8KLQlmb3IgKGkgPSAwOyBpIDwgbnB2czsgaSsrKSB7Ci0JCXN3aXRjaCAocGluZm9baV0udmFsdWVUeXBlKSB7Ci0JCWNhc2UgQUxfU0VUX1ZBTDoKLQkJY2FzZSBBTF9WRUNUT1JfVkFMOgotCQkJUHlNZW1fREVMKHB2c1tpXS52YWx1ZS5wdHIpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JUHlNZW1fREVMKHB2cyk7Ci0JUHlNZW1fREVMKHBpbmZvKTsKKyAgICAvKiBjbGVhbnVwICovCisgICAgZm9yIChpID0gMDsgaSA8IG5wdnM7IGkrKykgeworICAgICAgICBzd2l0Y2ggKHBpbmZvW2ldLnZhbHVlVHlwZSkgeworICAgICAgICBjYXNlIEFMX1NFVF9WQUw6CisgICAgICAgIGNhc2UgQUxfVkVDVE9SX1ZBTDoKKyAgICAgICAgICAgIFB5TWVtX0RFTChwdnNbaV0udmFsdWUucHRyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIFB5TWVtX0RFTChwdnMpOworICAgIFB5TWVtX0RFTChwaW5mbyk7CiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogCiAgIGVycm9yOgotCS8qIFhYWFggd2Ugc2hvdWxkIGNsZWFuIHVwIGV2ZXJ5dGhpbmcgKi8KLQlpZiAocHZzKQotCQlQeU1lbV9ERUwocHZzKTsKLQlpZiAocGluZm8pCi0JCVB5TWVtX0RFTChwaW5mbyk7Ci0JcmV0dXJuIE5VTEw7CisgICAgLyogWFhYWCB3ZSBzaG91bGQgY2xlYW4gdXAgZXZlcnl0aGluZyAqLworICAgIGlmIChwdnMpCisgICAgICAgIFB5TWVtX0RFTChwdnMpOworICAgIGlmIChwaW5mbykKKyAgICAgICAgUHlNZW1fREVMKHBpbmZvKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogUHlEb2NfU1RSVkFSKGFsX1F1ZXJ5VmFsdWVzX19kb2NfXywKQEAgLTE2MDQsNzkgKzE2MDQsNzkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBhbF9RdWVyeVZhbHVlcyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IHJlc291cmNlLCBwYXJhbTsKLQlBTHZhbHVlICpyZXR1cm5fc2V0ID0gTlVMTDsKLQlpbnQgc2V0c2l6ZSA9IDMyLCBxdWFsc2l6ZSA9IDAsIG52YWxzLCBpOwotCUFMcHYgKnF1YWxzID0gTlVMTDsKLQlBTHBhcmFtSW5mbyBwaW5mbzsKLQlBTHBhcmFtSW5mbyAqcXVhbGluZm8gPSBOVUxMOwotCVB5T2JqZWN0ICpxdWFsb2JqID0gTlVMTDsKLQlQeU9iamVjdCAqcmVzID0gTlVMTCwgKml0ZW07CisgICAgaW50IHJlc291cmNlLCBwYXJhbTsKKyAgICBBTHZhbHVlICpyZXR1cm5fc2V0ID0gTlVMTDsKKyAgICBpbnQgc2V0c2l6ZSA9IDMyLCBxdWFsc2l6ZSA9IDAsIG52YWxzLCBpOworICAgIEFMcHYgKnF1YWxzID0gTlVMTDsKKyAgICBBTHBhcmFtSW5mbyBwaW5mbzsKKyAgICBBTHBhcmFtSW5mbyAqcXVhbGluZm8gPSBOVUxMOworICAgIFB5T2JqZWN0ICpxdWFsb2JqID0gTlVMTDsKKyAgICBQeU9iamVjdCAqcmVzID0gTlVMTCwgKml0ZW07CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpfE8hOlF1ZXJ5VmFsdWVzIiwgJnJlc291cmNlLCAmcGFyYW0sCi0JCQkgICAgICAmUHlMaXN0X1R5cGUsICZxdWFsb2JqKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKHF1YWxvYmogIT0gTlVMTCkgewotCQlxdWFsc2l6ZSA9IHB5dGhvbjJwYXJhbXMocmVzb3VyY2UsIHBhcmFtLCBxdWFsb2JqLCAmcXVhbHMsICZxdWFsaW5mbyk7Ci0JCWlmIChxdWFsc2l6ZSA8IDApCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0Jc2V0c2l6ZSA9IDMyOwotCXJldHVybl9zZXQgPSBQeU1lbV9ORVcoQUx2YWx1ZSwgc2V0c2l6ZSk7Ci0JaWYgKHJldHVybl9zZXQgPT0gTlVMTCkgewotCQlQeUVycl9Ob01lbW9yeSgpOwotCQlnb3RvIGNsZWFudXA7Ci0JfQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaWl8TyE6UXVlcnlWYWx1ZXMiLCAmcmVzb3VyY2UsICZwYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJlB5TGlzdF9UeXBlLCAmcXVhbG9iaikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChxdWFsb2JqICE9IE5VTEwpIHsKKyAgICAgICAgcXVhbHNpemUgPSBweXRob24ycGFyYW1zKHJlc291cmNlLCBwYXJhbSwgcXVhbG9iaiwgJnF1YWxzLCAmcXVhbGluZm8pOworICAgICAgICBpZiAocXVhbHNpemUgPCAwKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHNldHNpemUgPSAzMjsKKyAgICByZXR1cm5fc2V0ID0gUHlNZW1fTkVXKEFMdmFsdWUsIHNldHNpemUpOworICAgIGlmIChyZXR1cm5fc2V0ID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgZ290byBjbGVhbnVwOworICAgIH0KIAogICByZXRyeToKLQludmFscyA9IGFsUXVlcnlWYWx1ZXMocmVzb3VyY2UsIHBhcmFtLCByZXR1cm5fc2V0LCBzZXRzaXplLCBxdWFscywgcXVhbHNpemUpOwotCWlmIChudmFscyA8IDApCi0JCWdvdG8gY2xlYW51cDsKLQlpZiAobnZhbHMgPiBzZXRzaXplKSB7Ci0JCUFMdmFsdWUgKm9sZF9yZXR1cm5fc2V0ID0gcmV0dXJuX3NldDsKLQkJc2V0c2l6ZSA9IG52YWxzOwotCQlQeU1lbV9SRVNJWkUocmV0dXJuX3NldCwgQUx2YWx1ZSwgc2V0c2l6ZSk7Ci0JCWlmIChyZXR1cm5fc2V0ID09IE5VTEwpIHsKLQkJCXJldHVybl9zZXQgPSBvbGRfcmV0dXJuX3NldDsKLQkJCVB5RXJyX05vTWVtb3J5KCk7Ci0JCQlnb3RvIGNsZWFudXA7Ci0JCX0KLQkJZ290byByZXRyeTsKLQl9CisgICAgbnZhbHMgPSBhbFF1ZXJ5VmFsdWVzKHJlc291cmNlLCBwYXJhbSwgcmV0dXJuX3NldCwgc2V0c2l6ZSwgcXVhbHMsIHF1YWxzaXplKTsKKyAgICBpZiAobnZhbHMgPCAwKQorICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgaWYgKG52YWxzID4gc2V0c2l6ZSkgeworICAgICAgICBBTHZhbHVlICpvbGRfcmV0dXJuX3NldCA9IHJldHVybl9zZXQ7CisgICAgICAgIHNldHNpemUgPSBudmFsczsKKyAgICAgICAgUHlNZW1fUkVTSVpFKHJldHVybl9zZXQsIEFMdmFsdWUsIHNldHNpemUpOworICAgICAgICBpZiAocmV0dXJuX3NldCA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm5fc2V0ID0gb2xkX3JldHVybl9zZXQ7CisgICAgICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICAgICAgZ290byBjbGVhbnVwOworICAgICAgICB9CisgICAgICAgIGdvdG8gcmV0cnk7CisgICAgfQogCi0JaWYgKGFsR2V0UGFyYW1JbmZvKHJlc291cmNlLCBwYXJhbSwgJnBpbmZvKSA8IDApCi0JCWdvdG8gY2xlYW51cDsKKyAgICBpZiAoYWxHZXRQYXJhbUluZm8ocmVzb3VyY2UsIHBhcmFtLCAmcGluZm8pIDwgMCkKKyAgICAgICAgZ290byBjbGVhbnVwOwogCi0JcmVzID0gUHlMaXN0X05ldyhudmFscyk7Ci0JaWYgKHJlcyA9PSBOVUxMKQotCQlnb3RvIGNsZWFudXA7Ci0JZm9yIChpID0gMDsgaSA8IG52YWxzOyBpKyspIHsKLQkJaXRlbSA9IHBhcmFtMnB5dGhvbihyZXNvdXJjZSwgcGFyYW0sIHJldHVybl9zZXRbaV0sICZwaW5mbyk7Ci0JCWlmIChpdGVtID09IE5VTEwgfHwKLQkJICAgIFB5TGlzdF9TZXRJdGVtKHJlcywgaSwgaXRlbSkgPCAwKSB7Ci0JCQlQeV9ERUNSRUYocmVzKTsKLQkJCXJlcyA9IE5VTEw7Ci0JCQlnb3RvIGNsZWFudXA7Ci0JCX0KLQl9CisgICAgcmVzID0gUHlMaXN0X05ldyhudmFscyk7CisgICAgaWYgKHJlcyA9PSBOVUxMKQorICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgZm9yIChpID0gMDsgaSA8IG52YWxzOyBpKyspIHsKKyAgICAgICAgaXRlbSA9IHBhcmFtMnB5dGhvbihyZXNvdXJjZSwgcGFyYW0sIHJldHVybl9zZXRbaV0sICZwaW5mbyk7CisgICAgICAgIGlmIChpdGVtID09IE5VTEwgfHwKKyAgICAgICAgICAgIFB5TGlzdF9TZXRJdGVtKHJlcywgaSwgaXRlbSkgPCAwKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYocmVzKTsKKyAgICAgICAgICAgIHJlcyA9IE5VTEw7CisgICAgICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgICAgIH0KKyAgICB9CiAKICAgY2xlYW51cDoKLQlpZiAocmV0dXJuX3NldCkKLQkJUHlNZW1fREVMKHJldHVybl9zZXQpOwotCWlmIChxdWFscykgewotCQlmb3IgKGkgPSAwOyBpIDwgcXVhbHNpemU7IGkrKykgewotCQkJc3dpdGNoIChxdWFsaW5mb1tpXS52YWx1ZVR5cGUpIHsKLQkJCWNhc2UgQUxfU0VUX1ZBTDoKLQkJCWNhc2UgQUxfVkVDVE9SX1ZBTDoKLQkJCQlQeU1lbV9ERUwocXVhbHNbaV0udmFsdWUucHRyKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlQeU1lbV9ERUwocXVhbHMpOwotCQlQeU1lbV9ERUwocXVhbGluZm8pOwotCX0KKyAgICBpZiAocmV0dXJuX3NldCkKKyAgICAgICAgUHlNZW1fREVMKHJldHVybl9zZXQpOworICAgIGlmIChxdWFscykgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcXVhbHNpemU7IGkrKykgeworICAgICAgICAgICAgc3dpdGNoIChxdWFsaW5mb1tpXS52YWx1ZVR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgQUxfU0VUX1ZBTDoKKyAgICAgICAgICAgIGNhc2UgQUxfVkVDVE9SX1ZBTDoKKyAgICAgICAgICAgICAgICBQeU1lbV9ERUwocXVhbHNbaV0udmFsdWUucHRyKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBQeU1lbV9ERUwocXVhbHMpOworICAgICAgICBQeU1lbV9ERUwocXVhbGluZm8pOworICAgIH0KIAotCXJldHVybiByZXM7CisgICAgcmV0dXJuIHJlczsKIH0KIAogUHlEb2NfU1RSVkFSKGFsX0dldFBhcmFtSW5mb19fZG9jX18sCkBAIC0xNjg2LDgxICsxNjg2LDgxIEBACiBzdGF0aWMgUHlPYmplY3QgKgogYWxfR2V0UGFyYW1JbmZvKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgcmVzLCBwYXJhbTsKLQlBTHBhcmFtSW5mbyBwaW5mbzsKLQlQeU9iamVjdCAqdiwgKml0ZW07CisgICAgaW50IHJlcywgcGFyYW07CisgICAgQUxwYXJhbUluZm8gcGluZm87CisgICAgUHlPYmplY3QgKnYsICppdGVtOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpaTpHZXRQYXJhbUluZm8iLCAmcmVzLCAmcGFyYW0pKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoYWxHZXRQYXJhbUluZm8ocmVzLCBwYXJhbSwgJnBpbmZvKSA8IDApCi0JCXJldHVybiBOVUxMOwotCXYgPSBQeURpY3RfTmV3KCk7Ci0JaWYgKCF2KSByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpOkdldFBhcmFtSW5mbyIsICZyZXMsICZwYXJhbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChhbEdldFBhcmFtSW5mbyhyZXMsIHBhcmFtLCAmcGluZm8pIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgdiA9IFB5RGljdF9OZXcoKTsKKyAgICBpZiAoIXYpIHJldHVybiBOVUxMOwogCi0JaXRlbSA9IFB5SW50X0Zyb21Mb25nKChsb25nKSBwaW5mby5yZXNvdXJjZSk7Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcodiwgInJlc291cmNlIiwgaXRlbSk7Ci0JUHlfREVDUkVGKGl0ZW0pOworICAgIGl0ZW0gPSBQeUludF9Gcm9tTG9uZygobG9uZykgcGluZm8ucmVzb3VyY2UpOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKHYsICJyZXNvdXJjZSIsIGl0ZW0pOworICAgIFB5X0RFQ1JFRihpdGVtKTsKIAotCWl0ZW0gPSBQeUludF9Gcm9tTG9uZygobG9uZykgcGluZm8ucGFyYW0pOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKHYsICJwYXJhbSIsIGl0ZW0pOwotCVB5X0RFQ1JFRihpdGVtKTsKKyAgICBpdGVtID0gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIHBpbmZvLnBhcmFtKTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyh2LCAicGFyYW0iLCBpdGVtKTsKKyAgICBQeV9ERUNSRUYoaXRlbSk7CiAKLQlpdGVtID0gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIHBpbmZvLnZhbHVlVHlwZSk7Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcodiwgInZhbHVlVHlwZSIsIGl0ZW0pOwotCVB5X0RFQ1JFRihpdGVtKTsKKyAgICBpdGVtID0gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIHBpbmZvLnZhbHVlVHlwZSk7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcodiwgInZhbHVlVHlwZSIsIGl0ZW0pOworICAgIFB5X0RFQ1JFRihpdGVtKTsKIAotCWlmIChwaW5mby52YWx1ZVR5cGUgIT0gQUxfTk9fVkFMICYmIHBpbmZvLnZhbHVlVHlwZSAhPSBBTF9TQ0FMQVJfVkFMKSB7Ci0JCS8qIG11bHRpcGxlIHZhbHVlcyAqLwotCQlpdGVtID0gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIHBpbmZvLm1heEVsZW1zKTsKLQkJUHlEaWN0X1NldEl0ZW1TdHJpbmcodiwgIm1heEVsZW1zIiwgaXRlbSk7Ci0JCVB5X0RFQ1JFRihpdGVtKTsKKyAgICBpZiAocGluZm8udmFsdWVUeXBlICE9IEFMX05PX1ZBTCAmJiBwaW5mby52YWx1ZVR5cGUgIT0gQUxfU0NBTEFSX1ZBTCkgeworICAgICAgICAvKiBtdWx0aXBsZSB2YWx1ZXMgKi8KKyAgICAgICAgaXRlbSA9IFB5SW50X0Zyb21Mb25nKChsb25nKSBwaW5mby5tYXhFbGVtcyk7CisgICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKHYsICJtYXhFbGVtcyIsIGl0ZW0pOworICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CiAKLQkJaWYgKHBpbmZvLnZhbHVlVHlwZSA9PSBBTF9NQVRSSVhfVkFMKSB7Ci0JCQkvKiAyIGRpbWVuc2lvbmFsICovCi0JCQlpdGVtID0gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIHBpbmZvLm1heEVsZW1zMik7Ci0JCQlQeURpY3RfU2V0SXRlbVN0cmluZyh2LCAibWF4RWxlbXMyIiwgaXRlbSk7Ci0JCQlQeV9ERUNSRUYoaXRlbSk7Ci0JCX0KLQl9CisgICAgICAgIGlmIChwaW5mby52YWx1ZVR5cGUgPT0gQUxfTUFUUklYX1ZBTCkgeworICAgICAgICAgICAgLyogMiBkaW1lbnNpb25hbCAqLworICAgICAgICAgICAgaXRlbSA9IFB5SW50X0Zyb21Mb25nKChsb25nKSBwaW5mby5tYXhFbGVtczIpOworICAgICAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcodiwgIm1heEVsZW1zMiIsIGl0ZW0pOworICAgICAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgICAgICB9CisgICAgfQogCi0JaXRlbSA9IFB5SW50X0Zyb21Mb25nKChsb25nKSBwaW5mby5lbGVtZW50VHlwZSk7Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcodiwgImVsZW1lbnRUeXBlIiwgaXRlbSk7Ci0JUHlfREVDUkVGKGl0ZW0pOworICAgIGl0ZW0gPSBQeUludF9Gcm9tTG9uZygobG9uZykgcGluZm8uZWxlbWVudFR5cGUpOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKHYsICJlbGVtZW50VHlwZSIsIGl0ZW0pOworICAgIFB5X0RFQ1JFRihpdGVtKTsKIAotCWl0ZW0gPSBQeVN0cmluZ19Gcm9tU3RyaW5nKHBpbmZvLm5hbWUpOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKHYsICJuYW1lIiwgaXRlbSk7Ci0JUHlfREVDUkVGKGl0ZW0pOworICAgIGl0ZW0gPSBQeVN0cmluZ19Gcm9tU3RyaW5nKHBpbmZvLm5hbWUpOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKHYsICJuYW1lIiwgaXRlbSk7CisgICAgUHlfREVDUkVGKGl0ZW0pOwogCi0JaXRlbSA9IHBhcmFtMnB5dGhvbihyZXMsIHBhcmFtLCBwaW5mby5pbml0aWFsLCAmcGluZm8pOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKHYsICJpbml0aWFsIiwgaXRlbSk7Ci0JUHlfREVDUkVGKGl0ZW0pOworICAgIGl0ZW0gPSBwYXJhbTJweXRob24ocmVzLCBwYXJhbSwgcGluZm8uaW5pdGlhbCwgJnBpbmZvKTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyh2LCAiaW5pdGlhbCIsIGl0ZW0pOworICAgIFB5X0RFQ1JFRihpdGVtKTsKIAotCWlmIChwaW5mby5lbGVtZW50VHlwZSAhPSBBTF9FTlVNX0VMRU0gJiYKLQkgICAgcGluZm8uZWxlbWVudFR5cGUgIT0gQUxfUkVTT1VSQ0VfRUxFTSAmJgotCSAgICBwaW5mby5lbGVtZW50VHlwZSAhPSBBTF9DSEFSX0VMRU0pIHsKLQkJLyogcmFuZ2UgcGFyYW0gKi8KLQkJaXRlbSA9IHBhcmFtMnB5dGhvbihyZXMsIHBhcmFtLCBwaW5mby5taW4sICZwaW5mbyk7Ci0JCVB5RGljdF9TZXRJdGVtU3RyaW5nKHYsICJtaW4iLCBpdGVtKTsKLQkJUHlfREVDUkVGKGl0ZW0pOworICAgIGlmIChwaW5mby5lbGVtZW50VHlwZSAhPSBBTF9FTlVNX0VMRU0gJiYKKyAgICAgICAgcGluZm8uZWxlbWVudFR5cGUgIT0gQUxfUkVTT1VSQ0VfRUxFTSAmJgorICAgICAgICBwaW5mby5lbGVtZW50VHlwZSAhPSBBTF9DSEFSX0VMRU0pIHsKKyAgICAgICAgLyogcmFuZ2UgcGFyYW0gKi8KKyAgICAgICAgaXRlbSA9IHBhcmFtMnB5dGhvbihyZXMsIHBhcmFtLCBwaW5mby5taW4sICZwaW5mbyk7CisgICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKHYsICJtaW4iLCBpdGVtKTsKKyAgICAgICAgUHlfREVDUkVGKGl0ZW0pOwogCi0JCWl0ZW0gPSBwYXJhbTJweXRob24ocmVzLCBwYXJhbSwgcGluZm8ubWF4LCAmcGluZm8pOwotCQlQeURpY3RfU2V0SXRlbVN0cmluZyh2LCAibWF4IiwgaXRlbSk7Ci0JCVB5X0RFQ1JFRihpdGVtKTsKKyAgICAgICAgaXRlbSA9IHBhcmFtMnB5dGhvbihyZXMsIHBhcmFtLCBwaW5mby5tYXgsICZwaW5mbyk7CisgICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKHYsICJtYXgiLCBpdGVtKTsKKyAgICAgICAgUHlfREVDUkVGKGl0ZW0pOwogCi0JCWl0ZW0gPSBwYXJhbTJweXRob24ocmVzLCBwYXJhbSwgcGluZm8ubWluRGVsdGEsICZwaW5mbyk7Ci0JCVB5RGljdF9TZXRJdGVtU3RyaW5nKHYsICJtaW5EZWx0YSIsIGl0ZW0pOwotCQlQeV9ERUNSRUYoaXRlbSk7CisgICAgICAgIGl0ZW0gPSBwYXJhbTJweXRob24ocmVzLCBwYXJhbSwgcGluZm8ubWluRGVsdGEsICZwaW5mbyk7CisgICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKHYsICJtaW5EZWx0YSIsIGl0ZW0pOworICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CiAKLQkJaXRlbSA9IHBhcmFtMnB5dGhvbihyZXMsIHBhcmFtLCBwaW5mby5tYXhEZWx0YSwgJnBpbmZvKTsKLQkJUHlEaWN0X1NldEl0ZW1TdHJpbmcodiwgIm1heERlbHRhIiwgaXRlbSk7Ci0JCVB5X0RFQ1JFRihpdGVtKTsKKyAgICAgICAgaXRlbSA9IHBhcmFtMnB5dGhvbihyZXMsIHBhcmFtLCBwaW5mby5tYXhEZWx0YSwgJnBpbmZvKTsKKyAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcodiwgIm1heERlbHRhIiwgaXRlbSk7CisgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKIAotCQlpdGVtID0gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIHBpbmZvLnNwZWNpYWxWYWxzKTsKLQkJUHlEaWN0X1NldEl0ZW1TdHJpbmcodiwgInNwZWNpYWxWYWxzIiwgaXRlbSk7Ci0JCVB5X0RFQ1JFRihpdGVtKTsKLQl9CisgICAgICAgIGl0ZW0gPSBQeUludF9Gcm9tTG9uZygobG9uZykgcGluZm8uc3BlY2lhbFZhbHMpOworICAgICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyh2LCAic3BlY2lhbFZhbHMiLCBpdGVtKTsKKyAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgIH0KIAotCXJldHVybiB2OworICAgIHJldHVybiB2OwogfQogCiBQeURvY19TVFJWQVIoYWxfR2V0UmVzb3VyY2VCeU5hbWVfX2RvY19fLApAQCAtMTc2OSwxNCArMTc2OSwxNCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGFsX0dldFJlc291cmNlQnlOYW1lKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgcmVzLCBzdGFydF9yZXMsIHR5cGU7Ci0JY2hhciAqbmFtZTsKKyAgICBpbnQgcmVzLCBzdGFydF9yZXMsIHR5cGU7CisgICAgY2hhciAqbmFtZTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaXNpOkdldFJlc291cmNlQnlOYW1lIiwgJnN0YXJ0X3JlcywgJm5hbWUsICZ0eXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKChyZXMgPSBhbEdldFJlc291cmNlQnlOYW1lKHN0YXJ0X3JlcywgbmFtZSwgdHlwZSkpID09IDApCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZykgcmVzKTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlzaTpHZXRSZXNvdXJjZUJ5TmFtZSIsICZzdGFydF9yZXMsICZuYW1lLCAmdHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICgocmVzID0gYWxHZXRSZXNvdXJjZUJ5TmFtZShzdGFydF9yZXMsIG5hbWUsIHR5cGUpKSA9PSAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIHJlcyk7CiB9CiAKIFB5RG9jX1NUUlZBUihhbF9Jc1N1YnR5cGVfX2RvY19fLApAQCAtMTc4NSwxMSArMTc4NSwxMSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGFsX0lzU3VidHlwZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IHR5cGUsIHN1YnR5cGU7CisgICAgaW50IHR5cGUsIHN1YnR5cGU7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpOklzU3VidHlwZSIsICZ0eXBlLCAmc3VidHlwZSkpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZykgYWxJc1N1YnR5cGUodHlwZSwgc3VidHlwZSkpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaWk6SXNTdWJ0eXBlIiwgJnR5cGUsICZzdWJ0eXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKSBhbElzU3VidHlwZSh0eXBlLCBzdWJ0eXBlKSk7CiB9CiAKIFB5RG9jX1NUUlZBUihhbF9TZXRFcnJvckhhbmRsZXJfX2RvY19fLCAiIik7CkBAIC0xNzk4LDEwICsxNzk4LDEwIEBACiBhbF9TZXRFcnJvckhhbmRsZXIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6U2V0RXJyb3JIYW5kbGVyIikpCi0JCXJldHVybiBOVUxMOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpTZXRFcnJvckhhbmRsZXIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAjZW5kaWYgLyogQUxfTk9fRUxFTSAqLwpAQCAtMTgxMSwxNDQgKzE4MTEsMTQ0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYWxfb3BlbnBvcnQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKm5hbWUsICpkaXI7Ci0JQUxwb3J0IHBvcnQ7Ci0JYWxjb2JqZWN0ICpjb25maWcgPSBOVUxMOworICAgIGNoYXIgKm5hbWUsICpkaXI7CisgICAgQUxwb3J0IHBvcnQ7CisgICAgYWxjb2JqZWN0ICpjb25maWcgPSBOVUxMOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzc3xPITpPcGVuUG9ydCIsICZuYW1lLCAmZGlyLCAmQWxjdHlwZSwgJmNvbmZpZykpCi0JCXJldHVybiBOVUxMOwotCWlmICgocG9ydCA9IEFMb3BlbnBvcnQobmFtZSwgZGlyLCBjb25maWcgPyBjb25maWctPmNvbmZpZyA6IE5VTEwpKSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gbmV3YWxwb2JqZWN0KHBvcnQpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic3N8TyE6T3BlblBvcnQiLCAmbmFtZSwgJmRpciwgJkFsY3R5cGUsICZjb25maWcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoKHBvcnQgPSBBTG9wZW5wb3J0KG5hbWUsIGRpciwgY29uZmlnID8gY29uZmlnLT5jb25maWcgOiBOVUxMKSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIG5ld2FscG9iamVjdChwb3J0KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGFsX25ld2NvbmZpZyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JQUxjb25maWcgY29uZmlnOworICAgIEFMY29uZmlnIGNvbmZpZzsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOk5ld0NvbmZpZyIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoKGNvbmZpZyA9IEFMbmV3Y29uZmlnICgpKSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gbmV3YWxjb2JqZWN0KGNvbmZpZyk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6TmV3Q29uZmlnIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICgoY29uZmlnID0gQUxuZXdjb25maWcgKCkpID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBuZXdhbGNvYmplY3QoY29uZmlnKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGFsX3F1ZXJ5cGFyYW1zKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGRldmljZTsKLQlsb25nIGxlbmd0aDsKLQlsb25nICpQVmJ1ZmZlcjsKLQlsb25nIFBWZHVtbXlbMl07Ci0JUHlPYmplY3QgKnYgPSBOVUxMOwotCWludCBpOworICAgIGxvbmcgZGV2aWNlOworICAgIGxvbmcgbGVuZ3RoOworICAgIGxvbmcgKlBWYnVmZmVyOworICAgIGxvbmcgUFZkdW1teVsyXTsKKyAgICBQeU9iamVjdCAqdiA9IE5VTEw7CisgICAgaW50IGk7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImw6cXVlcnlwYXJhbXMiLCAmZGV2aWNlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKChsZW5ndGggPSBBTHF1ZXJ5cGFyYW1zKGRldmljZSwgUFZkdW1teSwgMkwpKSA9PSAtMSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKChQVmJ1ZmZlciA9IFB5TWVtX05FVyhsb25nLCBsZW5ndGgpKSA9PSBOVUxMKQotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQlpZiAoQUxxdWVyeXBhcmFtcyhkZXZpY2UsIFBWYnVmZmVyLCBsZW5ndGgpID49IDAgJiYKLQkgICAgKHYgPSBQeUxpc3RfTmV3KChpbnQpbGVuZ3RoKSkgIT0gTlVMTCkgewotCQlmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCi0JCQlQeUxpc3RfU2V0SXRlbSh2LCBpLCBQeUludF9Gcm9tTG9uZyhQVmJ1ZmZlcltpXSkpOwotCX0KLQlQeU1lbV9ERUwoUFZidWZmZXIpOwotCXJldHVybiB2OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibDpxdWVyeXBhcmFtcyIsICZkZXZpY2UpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoKGxlbmd0aCA9IEFMcXVlcnlwYXJhbXMoZGV2aWNlLCBQVmR1bW15LCAyTCkpID09IC0xKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoKFBWYnVmZmVyID0gUHlNZW1fTkVXKGxvbmcsIGxlbmd0aCkpID09IE5VTEwpCisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIGlmIChBTHF1ZXJ5cGFyYW1zKGRldmljZSwgUFZidWZmZXIsIGxlbmd0aCkgPj0gMCAmJgorICAgICAgICAodiA9IFB5TGlzdF9OZXcoKGludClsZW5ndGgpKSAhPSBOVUxMKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKKyAgICAgICAgICAgIFB5TGlzdF9TZXRJdGVtKHYsIGksIFB5SW50X0Zyb21Mb25nKFBWYnVmZmVyW2ldKSk7CisgICAgfQorICAgIFB5TWVtX0RFTChQVmJ1ZmZlcik7CisgICAgcmV0dXJuIHY7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkb1BhcmFtcyhQeU9iamVjdCAqYXJncywgaW50ICgqZnVuYykobG9uZywgbG9uZyAqLCBsb25nKSwgaW50IG1vZGlmaWVkKQogewotCWxvbmcgZGV2aWNlOwotCVB5T2JqZWN0ICpsaXN0LCAqdjsKLQlsb25nICpQVmJ1ZmZlcjsKLQlsb25nIGxlbmd0aDsKLQlpbnQgaTsKLQkKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImxPISIsICZkZXZpY2UsICZQeUxpc3RfVHlwZSwgJmxpc3QpKQotCQlyZXR1cm4gTlVMTDsKLQlsZW5ndGggPSBQeUxpc3RfU2l6ZShsaXN0KTsKLQlQVmJ1ZmZlciA9IFB5TWVtX05FVyhsb25nLCBsZW5ndGgpOwotCWlmIChQVmJ1ZmZlciA9PSBOVUxMKQotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQlmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJdiA9IFB5TGlzdF9HZXRJdGVtKGxpc3QsIGkpOwotCQlpZiAoIVB5SW50X0NoZWNrKHYpKSB7Ci0JCQlQeU1lbV9ERUwoUFZidWZmZXIpOwotCQkJUHlFcnJfQmFkQXJndW1lbnQoKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCVBWYnVmZmVyW2ldID0gUHlJbnRfQXNMb25nKHYpOwotCX0KKyAgICBsb25nIGRldmljZTsKKyAgICBQeU9iamVjdCAqbGlzdCwgKnY7CisgICAgbG9uZyAqUFZidWZmZXI7CisgICAgbG9uZyBsZW5ndGg7CisgICAgaW50IGk7CiAKLQlpZiAoKCpmdW5jKShkZXZpY2UsIFBWYnVmZmVyLCBsZW5ndGgpID09IC0xKSB7Ci0JCVB5TWVtX0RFTChQVmJ1ZmZlcik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImxPISIsICZkZXZpY2UsICZQeUxpc3RfVHlwZSwgJmxpc3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBsZW5ndGggPSBQeUxpc3RfU2l6ZShsaXN0KTsKKyAgICBQVmJ1ZmZlciA9IFB5TWVtX05FVyhsb25nLCBsZW5ndGgpOworICAgIGlmIChQVmJ1ZmZlciA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICAgICAgdiA9IFB5TGlzdF9HZXRJdGVtKGxpc3QsIGkpOworICAgICAgICBpZiAoIVB5SW50X0NoZWNrKHYpKSB7CisgICAgICAgICAgICBQeU1lbV9ERUwoUFZidWZmZXIpOworICAgICAgICAgICAgUHlFcnJfQmFkQXJndW1lbnQoKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIFBWYnVmZmVyW2ldID0gUHlJbnRfQXNMb25nKHYpOworICAgIH0KIAotCWlmIChtb2RpZmllZCkgewotCQlmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCi0JCQlQeUxpc3RfU2V0SXRlbShsaXN0LCBpLCBQeUludF9Gcm9tTG9uZyhQVmJ1ZmZlcltpXSkpOwotCX0KKyAgICBpZiAoKCpmdW5jKShkZXZpY2UsIFBWYnVmZmVyLCBsZW5ndGgpID09IC0xKSB7CisgICAgICAgIFB5TWVtX0RFTChQVmJ1ZmZlcik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCVB5TWVtX0RFTChQVmJ1ZmZlcik7CisgICAgaWYgKG1vZGlmaWVkKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKKyAgICAgICAgICAgIFB5TGlzdF9TZXRJdGVtKGxpc3QsIGksIFB5SW50X0Zyb21Mb25nKFBWYnVmZmVyW2ldKSk7CisgICAgfQogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5TWVtX0RFTChQVmJ1ZmZlcik7CisKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhbF9nZXRwYXJhbXMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBkb1BhcmFtcyhhcmdzLCBBTGdldHBhcmFtcywgMSk7CisgICAgcmV0dXJuIGRvUGFyYW1zKGFyZ3MsIEFMZ2V0cGFyYW1zLCAxKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGFsX3NldHBhcmFtcyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGRvUGFyYW1zKGFyZ3MsIEFMc2V0cGFyYW1zLCAwKTsKKyAgICByZXR1cm4gZG9QYXJhbXMoYXJncywgQUxzZXRwYXJhbXMsIDApOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYWxfZ2V0bmFtZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBkZXZpY2UsIGRlc2NyaXB0b3I7Ci0JY2hhciAqbmFtZTsKKyAgICBsb25nIGRldmljZSwgZGVzY3JpcHRvcjsKKyAgICBjaGFyICpuYW1lOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsbDpnZXRuYW1lIiwgJmRldmljZSwgJmRlc2NyaXB0b3IpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoKG5hbWUgPSBBTGdldG5hbWUoZGV2aWNlLCBkZXNjcmlwdG9yKSkgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcobmFtZSk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsbDpnZXRuYW1lIiwgJmRldmljZSwgJmRlc2NyaXB0b3IpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoKG5hbWUgPSBBTGdldG5hbWUoZGV2aWNlLCBkZXNjcmlwdG9yKSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcobmFtZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhbF9nZXRkZWZhdWx0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGRldmljZSwgZGVzY3JpcHRvciwgdmFsdWU7CisgICAgbG9uZyBkZXZpY2UsIGRlc2NyaXB0b3IsIHZhbHVlOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsbDpnZXRkZWZhdWx0IiwgJmRldmljZSwgJmRlc2NyaXB0b3IpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoKHZhbHVlID0gQUxnZXRkZWZhdWx0KGRldmljZSwgZGVzY3JpcHRvcikpID09IC0xKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gUHlMb25nX0Zyb21Mb25nKHZhbHVlKTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImxsOmdldGRlZmF1bHQiLCAmZGV2aWNlLCAmZGVzY3JpcHRvcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICgodmFsdWUgPSBBTGdldGRlZmF1bHQoZGV2aWNlLCBkZXNjcmlwdG9yKSkgPT0gLTEpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmcodmFsdWUpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYWxfZ2V0bWlubWF4KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGRldmljZSwgZGVzY3JpcHRvciwgbWluLCBtYXg7CisgICAgbG9uZyBkZXZpY2UsIGRlc2NyaXB0b3IsIG1pbiwgbWF4OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsbDpnZXRtaW5tYXgiLCAmZGV2aWNlLCAmZGVzY3JpcHRvcikpCi0JCXJldHVybiBOVUxMOwotCW1pbiA9IC0xOwotCW1heCA9IC0xOwotCWlmIChBTGdldG1pbm1heChkZXZpY2UsIGRlc2NyaXB0b3IsICZtaW4sICZtYXgpID09IC0xKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgibGwiLCBtaW4sIG1heCk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsbDpnZXRtaW5tYXgiLCAmZGV2aWNlLCAmZGVzY3JpcHRvcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG1pbiA9IC0xOworICAgIG1heCA9IC0xOworICAgIGlmIChBTGdldG1pbm1heChkZXZpY2UsIGRlc2NyaXB0b3IsICZtaW4sICZtYXgpID09IC0xKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgibGwiLCBtaW4sIG1heCk7CiB9CiAKICNlbmRpZiAvKiBPTERfSU5URVJGQUNFICovCkBAIC0xOTU2LDM0ICsxOTU2LDM0IEBACiAvKiBMaXN0IG9mIG1ldGhvZHMgZGVmaW5lZCBpbiB0aGUgbW9kdWxlICovCiAKIHN0YXRpYyBzdHJ1Y3QgUHlNZXRob2REZWYgYWxfbWV0aG9kc1tdID0gewotI2lmZGVmIEFMX05PX0VMRU0JCS8qIElSSVggNiAqLwotCXsiTmV3Q29uZmlnIiwJKFB5Q0Z1bmN0aW9uKWFsX05ld0NvbmZpZywJTUVUSF9WQVJBUkdTLAlhbF9OZXdDb25maWdfX2RvY19ffSwKLQl7Ik9wZW5Qb3J0IiwJKFB5Q0Z1bmN0aW9uKWFsX09wZW5Qb3J0LAlNRVRIX1ZBUkFSR1MsCWFsX09wZW5Qb3J0X19kb2NfX30sCi0JeyJDb25uZWN0IiwJKFB5Q0Z1bmN0aW9uKWFsX0Nvbm5lY3QsCU1FVEhfVkFSQVJHUywJYWxfQ29ubmVjdF9fZG9jX199LAotCXsiRGlzY29ubmVjdCIsCShQeUNGdW5jdGlvbilhbF9EaXNjb25uZWN0LAlNRVRIX1ZBUkFSR1MsCWFsX0Rpc2Nvbm5lY3RfX2RvY19ffSwKLQl7IkdldFBhcmFtcyIsCShQeUNGdW5jdGlvbilhbF9HZXRQYXJhbXMsCU1FVEhfVkFSQVJHUywJYWxfR2V0UGFyYW1zX19kb2NfX30sCi0JeyJTZXRQYXJhbXMiLAkoUHlDRnVuY3Rpb24pYWxfU2V0UGFyYW1zLAlNRVRIX1ZBUkFSR1MsCWFsX1NldFBhcmFtc19fZG9jX199LAotCXsiUXVlcnlWYWx1ZXMiLAkoUHlDRnVuY3Rpb24pYWxfUXVlcnlWYWx1ZXMsCU1FVEhfVkFSQVJHUywJYWxfUXVlcnlWYWx1ZXNfX2RvY19ffSwKLQl7IkdldFBhcmFtSW5mbyIsCShQeUNGdW5jdGlvbilhbF9HZXRQYXJhbUluZm8sCU1FVEhfVkFSQVJHUywJYWxfR2V0UGFyYW1JbmZvX19kb2NfX30sCi0JeyJHZXRSZXNvdXJjZUJ5TmFtZSIsCShQeUNGdW5jdGlvbilhbF9HZXRSZXNvdXJjZUJ5TmFtZSwJTUVUSF9WQVJBUkdTLAlhbF9HZXRSZXNvdXJjZUJ5TmFtZV9fZG9jX199LAotCXsiSXNTdWJ0eXBlIiwJKFB5Q0Z1bmN0aW9uKWFsX0lzU3VidHlwZSwJTUVUSF9WQVJBUkdTLAlhbF9Jc1N1YnR5cGVfX2RvY19ffSwKKyNpZmRlZiBBTF9OT19FTEVNICAgICAgICAgICAgICAgLyogSVJJWCA2ICovCisgICAgeyJOZXdDb25maWciLCAgICAgICAoUHlDRnVuY3Rpb24pYWxfTmV3Q29uZmlnLCAgICAgIE1FVEhfVkFSQVJHUywgICBhbF9OZXdDb25maWdfX2RvY19ffSwKKyAgICB7Ik9wZW5Qb3J0IiwgICAgICAgIChQeUNGdW5jdGlvbilhbF9PcGVuUG9ydCwgICAgICAgTUVUSF9WQVJBUkdTLCAgIGFsX09wZW5Qb3J0X19kb2NfX30sCisgICAgeyJDb25uZWN0IiwgICAgICAgICAoUHlDRnVuY3Rpb24pYWxfQ29ubmVjdCwgICAgICAgIE1FVEhfVkFSQVJHUywgICBhbF9Db25uZWN0X19kb2NfX30sCisgICAgeyJEaXNjb25uZWN0IiwgICAgICAoUHlDRnVuY3Rpb24pYWxfRGlzY29ubmVjdCwgICAgIE1FVEhfVkFSQVJHUywgICBhbF9EaXNjb25uZWN0X19kb2NfX30sCisgICAgeyJHZXRQYXJhbXMiLCAgICAgICAoUHlDRnVuY3Rpb24pYWxfR2V0UGFyYW1zLCAgICAgIE1FVEhfVkFSQVJHUywgICBhbF9HZXRQYXJhbXNfX2RvY19ffSwKKyAgICB7IlNldFBhcmFtcyIsICAgICAgIChQeUNGdW5jdGlvbilhbF9TZXRQYXJhbXMsICAgICAgTUVUSF9WQVJBUkdTLCAgIGFsX1NldFBhcmFtc19fZG9jX199LAorICAgIHsiUXVlcnlWYWx1ZXMiLCAgICAgKFB5Q0Z1bmN0aW9uKWFsX1F1ZXJ5VmFsdWVzLCAgICBNRVRIX1ZBUkFSR1MsICAgYWxfUXVlcnlWYWx1ZXNfX2RvY19ffSwKKyAgICB7IkdldFBhcmFtSW5mbyIsICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWFsX0dldFBhcmFtSW5mbywgICBNRVRIX1ZBUkFSR1MsICAgYWxfR2V0UGFyYW1JbmZvX19kb2NfX30sCisgICAgeyJHZXRSZXNvdXJjZUJ5TmFtZSIsICAgICAgIChQeUNGdW5jdGlvbilhbF9HZXRSZXNvdXJjZUJ5TmFtZSwgICAgICBNRVRIX1ZBUkFSR1MsICAgYWxfR2V0UmVzb3VyY2VCeU5hbWVfX2RvY19ffSwKKyAgICB7IklzU3VidHlwZSIsICAgICAgIChQeUNGdW5jdGlvbilhbF9Jc1N1YnR5cGUsICAgICAgTUVUSF9WQVJBUkdTLCAgIGFsX0lzU3VidHlwZV9fZG9jX199LAogI2lmIDAKLQkvKiB0aGlzIG9uZSBub3Qgc3VwcG9ydGVkICovCi0JeyJTZXRFcnJvckhhbmRsZXIiLAkoUHlDRnVuY3Rpb24pYWxfU2V0RXJyb3JIYW5kbGVyLAlNRVRIX1ZBUkFSR1MsCWFsX1NldEVycm9ySGFuZGxlcl9fZG9jX199LAorICAgIC8qIHRoaXMgb25lIG5vdCBzdXBwb3J0ZWQgKi8KKyAgICB7IlNldEVycm9ySGFuZGxlciIsICAgICAgICAgKFB5Q0Z1bmN0aW9uKWFsX1NldEVycm9ySGFuZGxlciwgICAgICAgIE1FVEhfVkFSQVJHUywgICBhbF9TZXRFcnJvckhhbmRsZXJfX2RvY19ffSwKICNlbmRpZgogI2VuZGlmIC8qIEFMX05PX0VMRU0gKi8KICNpZmRlZiBPTERfSU5URVJGQUNFCi0JeyJvcGVucG9ydCIsCQkoUHlDRnVuY3Rpb24pYWxfb3BlbnBvcnQsCU1FVEhfVkFSQVJHU30sCi0JeyJuZXdjb25maWciLAkJKFB5Q0Z1bmN0aW9uKWFsX25ld2NvbmZpZywJTUVUSF9WQVJBUkdTfSwKLQl7InF1ZXJ5cGFyYW1zIiwJCShQeUNGdW5jdGlvbilhbF9xdWVyeXBhcmFtcywJTUVUSF9WQVJBUkdTfSwKLQl7ImdldHBhcmFtcyIsCQkoUHlDRnVuY3Rpb24pYWxfZ2V0cGFyYW1zLAlNRVRIX1ZBUkFSR1N9LAotCXsic2V0cGFyYW1zIiwJCShQeUNGdW5jdGlvbilhbF9zZXRwYXJhbXMsCU1FVEhfVkFSQVJHU30sCi0JeyJnZXRuYW1lIiwJCShQeUNGdW5jdGlvbilhbF9nZXRuYW1lLAlNRVRIX1ZBUkFSR1N9LAotCXsiZ2V0ZGVmYXVsdCIsCQkoUHlDRnVuY3Rpb24pYWxfZ2V0ZGVmYXVsdCwJTUVUSF9WQVJBUkdTfSwKLQl7ImdldG1pbm1heCIsCQkoUHlDRnVuY3Rpb24pYWxfZ2V0bWlubWF4LAlNRVRIX1ZBUkFSR1N9LAorICAgIHsib3BlbnBvcnQiLCAgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pYWxfb3BlbnBvcnQsICAgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJuZXdjb25maWciLCAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilhbF9uZXdjb25maWcsICAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7InF1ZXJ5cGFyYW1zIiwgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWFsX3F1ZXJ5cGFyYW1zLCAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsiZ2V0cGFyYW1zIiwgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pYWxfZ2V0cGFyYW1zLCAgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJzZXRwYXJhbXMiLCAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilhbF9zZXRwYXJhbXMsICAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImdldG5hbWUiLCAgICAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWFsX2dldG5hbWUsICAgICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsiZ2V0ZGVmYXVsdCIsICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pYWxfZ2V0ZGVmYXVsdCwgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJnZXRtaW5tYXgiLCAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilhbF9nZXRtaW5tYXgsICAgICAgTUVUSF9WQVJBUkdTfSwKICNlbmRpZiAvKiBPTERfSU5URVJGQUNFICovCiAKLQl7TlVMTCwJIChQeUNGdW5jdGlvbilOVUxMLCAwLCBOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7TlVMTCwgICAgICAgKFB5Q0Z1bmN0aW9uKU5VTEwsIDAsIE5VTEx9ICAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIApAQCAtMTk5NCwxMjM5ICsxOTk0LDEyMzkgQEAKIHZvaWQKIGluaXRhbCh2b2lkKQogewotCVB5T2JqZWN0ICptLCAqZCwgKng7CisgICAgUHlPYmplY3QgKm0sICpkLCAqeDsKIAotCWlmIChQeUVycl9XYXJuUHkzaygidGhlIGFsIG1vZHVsZSBoYXMgYmVlbiByZW1vdmVkIGluICIKLQkgICAgICAgICAgICAgICAgICAgIlB5dGhvbiAzLjAiLCAyKSA8IDApCi0JICAgIHJldHVybjsJCisgICAgaWYgKFB5RXJyX1dhcm5QeTNrKCJ0aGUgYWwgbW9kdWxlIGhhcyBiZWVuIHJlbW92ZWQgaW4gIgorICAgICAgICAgICAgICAgICAgICAgICAiUHl0aG9uIDMuMCIsIDIpIDwgMCkKKyAgICAgICAgcmV0dXJuOwogCi0JLyogQ3JlYXRlIHRoZSBtb2R1bGUgYW5kIGFkZCB0aGUgZnVuY3Rpb25zICovCi0JbSA9IFB5X0luaXRNb2R1bGU0KCJhbCIsIGFsX21ldGhvZHMsCi0JCWFsX21vZHVsZV9kb2N1bWVudGF0aW9uLAotCQkoUHlPYmplY3QqKU5VTEwsUFlUSE9OX0FQSV9WRVJTSU9OKTsKLQlpZiAobSA9PSBOVUxMKQotCQlyZXR1cm47CisgICAgLyogQ3JlYXRlIHRoZSBtb2R1bGUgYW5kIGFkZCB0aGUgZnVuY3Rpb25zICovCisgICAgbSA9IFB5X0luaXRNb2R1bGU0KCJhbCIsIGFsX21ldGhvZHMsCisgICAgICAgIGFsX21vZHVsZV9kb2N1bWVudGF0aW9uLAorICAgICAgICAoUHlPYmplY3QqKU5VTEwsUFlUSE9OX0FQSV9WRVJTSU9OKTsKKyAgICBpZiAobSA9PSBOVUxMKQorICAgICAgICByZXR1cm47CiAKLQkvKiBBZGQgc29tZSBzeW1ib2xpYyBjb25zdGFudHMgdG8gdGhlIG1vZHVsZSAqLwotCWQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOwotCUVycm9yT2JqZWN0ID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJhbC5lcnJvciIsIE5VTEwsIE5VTEwpOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJlcnJvciIsIEVycm9yT2JqZWN0KTsKKyAgICAvKiBBZGQgc29tZSBzeW1ib2xpYyBjb25zdGFudHMgdG8gdGhlIG1vZHVsZSAqLworICAgIGQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOworICAgIEVycm9yT2JqZWN0ID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJhbC5lcnJvciIsIE5VTEwsIE5VTEwpOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJlcnJvciIsIEVycm9yT2JqZWN0KTsKIAotCS8qIFhYWFggQWRkIGNvbnN0YW50cyBoZXJlICovCisgICAgLyogWFhYWCBBZGQgY29uc3RhbnRzIGhlcmUgKi8KICNpZmRlZiBBTF80Q0hBTk5FTAotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMXzRDSEFOTkVMKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJGT1VSQ0hBTk5FTCIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfNENIQU5ORUwpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkZPVVJDSEFOTkVMIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX0FEQVRfSUZfVFlQRQotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0FEQVRfSUZfVFlQRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQURBVF9JRl9UWVBFIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9BREFUX0lGX1RZUEUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkFEQVRfSUZfVFlQRSIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9BREFUX01DTEtfVFlQRQotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0FEQVRfTUNMS19UWVBFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJBREFUX01DTEtfVFlQRSIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfQURBVF9NQ0xLX1RZUEUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkFEQVRfTUNMS19UWVBFIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX0FFU19JRl9UWVBFCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfQUVTX0lGX1RZUEUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkFFU19JRl9UWVBFIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9BRVNfSUZfVFlQRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQUVTX0lGX1RZUEUiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfQUVTX01DTEtfVFlQRQotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0FFU19NQ0xLX1RZUEUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkFFU19NQ0xLX1RZUEUiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0FFU19NQ0xLX1RZUEUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkFFU19NQ0xLX1RZUEUiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfQU5BTE9HX0lGX1RZUEUKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9BTkFMT0dfSUZfVFlQRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQU5BTE9HX0lGX1RZUEUiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0FOQUxPR19JRl9UWVBFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJBTkFMT0dfSUZfVFlQRSIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9BU1NPQ0lBVEUKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9BU1NPQ0lBVEUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkFTU09DSUFURSIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfQVNTT0NJQVRFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJBU1NPQ0lBVEUiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfQkFEX0JVRkZFUl9OVUxMCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfQkFEX0JVRkZFUl9OVUxMKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfQlVGRkVSX05VTEwiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0JBRF9CVUZGRVJfTlVMTCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX0JVRkZFUl9OVUxMIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX0JBRF9CVUZGRVJMRU5HVEgKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9CQURfQlVGRkVSTEVOR1RIKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfQlVGRkVSTEVOR1RIIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9CQURfQlVGRkVSTEVOR1RIKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfQlVGRkVSTEVOR1RIIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX0JBRF9CVUZGRVJMRU5HVEhfTkVHCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfQkFEX0JVRkZFUkxFTkdUSF9ORUcpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9CVUZGRVJMRU5HVEhfTkVHIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9CQURfQlVGRkVSTEVOR1RIX05FRyk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX0JVRkZFUkxFTkdUSF9ORUciLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfQkFEX0JVRkZFUkxFTkdUSF9PREQKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9CQURfQlVGRkVSTEVOR1RIX09ERCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX0JVRkZFUkxFTkdUSF9PREQiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0JBRF9CVUZGRVJMRU5HVEhfT0REKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfQlVGRkVSTEVOR1RIX09ERCIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9CQURfQ0hBTk5FTFMKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9CQURfQ0hBTk5FTFMpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9DSEFOTkVMUyIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfQkFEX0NIQU5ORUxTKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfQ0hBTk5FTFMiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfQkFEX0NPTkZJRwotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0JBRF9DT05GSUcpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9DT05GSUciLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0JBRF9DT05GSUcpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9DT05GSUciLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfQkFEX0NPVU5UX05FRwotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0JBRF9DT1VOVF9ORUcpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9DT1VOVF9ORUciLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0JBRF9DT1VOVF9ORUcpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9DT1VOVF9ORUciLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfQkFEX0RFVklDRQotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0JBRF9ERVZJQ0UpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9ERVZJQ0UiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0JBRF9ERVZJQ0UpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9ERVZJQ0UiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfQkFEX0RFVklDRV9BQ0NFU1MKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9CQURfREVWSUNFX0FDQ0VTUyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX0RFVklDRV9BQ0NFU1MiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0JBRF9ERVZJQ0VfQUNDRVNTKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfREVWSUNFX0FDQ0VTUyIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9CQURfRElSRUNUSU9OCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfQkFEX0RJUkVDVElPTik7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX0RJUkVDVElPTiIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfQkFEX0RJUkVDVElPTik7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX0RJUkVDVElPTiIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9CQURfRklMTFBPSU5UCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfQkFEX0ZJTExQT0lOVCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX0ZJTExQT0lOVCIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfQkFEX0ZJTExQT0lOVCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX0ZJTExQT0lOVCIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9CQURfRkxPQVRNQVgKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9CQURfRkxPQVRNQVgpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9GTE9BVE1BWCIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfQkFEX0ZMT0FUTUFYKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfRkxPQVRNQVgiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfQkFEX0lMTEVHQUxfU1RBVEUKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9CQURfSUxMRUdBTF9TVEFURSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX0lMTEVHQUxfU1RBVEUiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0JBRF9JTExFR0FMX1NUQVRFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfSUxMRUdBTF9TVEFURSIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9CQURfTk9fUE9SVFMKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9CQURfTk9fUE9SVFMpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9OT19QT1JUUyIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfQkFEX05PX1BPUlRTKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfTk9fUE9SVFMiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfQkFEX05PVF9GT1VORAotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0JBRF9OT1RfRk9VTkQpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9OT1RfRk9VTkQiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0JBRF9OT1RfRk9VTkQpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9OT1RfRk9VTkQiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfQkFEX05PVF9JTVBMRU1FTlRFRAotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0JBRF9OT1RfSU1QTEVNRU5URUQpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9OT1RfSU1QTEVNRU5URUQiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0JBRF9OT1RfSU1QTEVNRU5URUQpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9OT1RfSU1QTEVNRU5URUQiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfQkFEX09VVF9PRl9NRU0KLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9CQURfT1VUX09GX01FTSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX09VVF9PRl9NRU0iLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0JBRF9PVVRfT0ZfTUVNKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfT1VUX09GX01FTSIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9CQURfUEFSQU0KLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9CQURfUEFSQU0pOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9QQVJBTSIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfQkFEX1BBUkFNKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfUEFSQU0iLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfQkFEX1BFUk1JU1NJT05TCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfQkFEX1BFUk1JU1NJT05TKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfUEVSTUlTU0lPTlMiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0JBRF9QRVJNSVNTSU9OUyk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX1BFUk1JU1NJT05TIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX0JBRF9QT1JUCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfQkFEX1BPUlQpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9QT1JUIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9CQURfUE9SVCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX1BPUlQiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfQkFEX1BPUlRTVFlMRQotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0JBRF9QT1JUU1RZTEUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9QT1JUU1RZTEUiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0JBRF9QT1JUU1RZTEUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9QT1JUU1RZTEUiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfQkFEX1BWQlVGRkVSCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfQkFEX1BWQlVGRkVSKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfUFZCVUZGRVIiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0JBRF9QVkJVRkZFUik7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX1BWQlVGRkVSIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX0JBRF9RU0laRQotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0JBRF9RU0laRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX1FTSVpFIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9CQURfUVNJWkUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9RU0laRSIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9CQURfUkFURQotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0JBRF9SQVRFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfUkFURSIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfQkFEX1JBVEUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9SQVRFIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX0JBRF9SRVNPVVJDRQotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0JBRF9SRVNPVVJDRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX1JFU09VUkNFIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9CQURfUkVTT1VSQ0UpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9SRVNPVVJDRSIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9CQURfU0FNUEZNVAotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0JBRF9TQU1QRk1UKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfU0FNUEZNVCIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfQkFEX1NBTVBGTVQpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9TQU1QRk1UIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX0JBRF9UUkFOU0ZFUl9TSVpFCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfQkFEX1RSQU5TRkVSX1NJWkUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9UUkFOU0ZFUl9TSVpFIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9CQURfVFJBTlNGRVJfU0laRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX1RSQU5TRkVSX1NJWkUiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfQkFEX1dJRFRICi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfQkFEX1dJRFRIKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfV0lEVEgiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0JBRF9XSURUSCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX1dJRFRIIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX0NIQU5ORUxfTU9ERQotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0NIQU5ORUxfTU9ERSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQ0hBTk5FTF9NT0RFIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9DSEFOTkVMX01PREUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkNIQU5ORUxfTU9ERSIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9DSEFOTkVMUwotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0NIQU5ORUxTKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJDSEFOTkVMUyIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfQ0hBTk5FTFMpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkNIQU5ORUxTIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX0NIQVJfRUxFTQotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0NIQVJfRUxFTSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQ0hBUl9FTEVNIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9DSEFSX0VMRU0pOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkNIQVJfRUxFTSIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9DTE9DS19HRU4KLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9DTE9DS19HRU4pOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkNMT0NLX0dFTiIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfQ0xPQ0tfR0VOKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJDTE9DS19HRU4iLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfQ0xPQ0tHRU5fVFlQRQotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0NMT0NLR0VOX1RZUEUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkNMT0NLR0VOX1RZUEUiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0NMT0NLR0VOX1RZUEUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkNMT0NLR0VOX1RZUEUiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfQ09OTkVDVAotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0NPTk5FQ1QpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkNPTk5FQ1QiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0NPTk5FQ1QpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkNPTk5FQ1QiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfQ09OTkVDVElPTl9UWVBFCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfQ09OTkVDVElPTl9UWVBFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJDT05ORUNUSU9OX1RZUEUiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0NPTk5FQ1RJT05fVFlQRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQ09OTkVDVElPTl9UWVBFIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX0NPTk5FQ1RJT05TCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfQ09OTkVDVElPTlMpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkNPTk5FQ1RJT05TIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9DT05ORUNUSU9OUyk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQ09OTkVDVElPTlMiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfQ1JZU1RBTF9NQ0xLX1RZUEUKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9DUllTVEFMX01DTEtfVFlQRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQ1JZU1RBTF9NQ0xLX1RZUEUiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0NSWVNUQUxfTUNMS19UWVBFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJDUllTVEFMX01DTEtfVFlQRSIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9ERUZBVUxUX0RFVklDRQotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0RFRkFVTFRfREVWSUNFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJERUZBVUxUX0RFVklDRSIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfREVGQVVMVF9ERVZJQ0UpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkRFRkFVTFRfREVWSUNFIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX0RFRkFVTFRfSU5QVVQKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9ERUZBVUxUX0lOUFVUKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJERUZBVUxUX0lOUFVUIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9ERUZBVUxUX0lOUFVUKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJERUZBVUxUX0lOUFVUIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX0RFRkFVTFRfT1VUUFVUCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfREVGQVVMVF9PVVRQVVQpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkRFRkFVTFRfT1VUUFVUIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9ERUZBVUxUX09VVFBVVCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiREVGQVVMVF9PVVRQVVQiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfREVTVAotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0RFU1QpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkRFU1QiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0RFU1QpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkRFU1QiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfREVWSUNFX1RZUEUKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9ERVZJQ0VfVFlQRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiREVWSUNFX1RZUEUiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0RFVklDRV9UWVBFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJERVZJQ0VfVFlQRSIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9ERVZJQ0VTCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfREVWSUNFUyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiREVWSUNFUyIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfREVWSUNFUyk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiREVWSUNFUyIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9ESUdJVEFMX0lGX1RZUEUKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9ESUdJVEFMX0lGX1RZUEUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkRJR0lUQUxfSUZfVFlQRSIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfRElHSVRBTF9JRl9UWVBFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJESUdJVEFMX0lGX1RZUEUiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfRElHSVRBTF9JTlBVVF9SQVRFCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfRElHSVRBTF9JTlBVVF9SQVRFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJESUdJVEFMX0lOUFVUX1JBVEUiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0RJR0lUQUxfSU5QVVRfUkFURSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRElHSVRBTF9JTlBVVF9SQVRFIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX0RJU0NPTk5FQ1QKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9ESVNDT05ORUNUKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJESVNDT05ORUNUIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9ESVNDT05ORUNUKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJESVNDT05ORUNUIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX0VOVU1fRUxFTQotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0VOVU1fRUxFTSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRU5VTV9FTEVNIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9FTlVNX0VMRU0pOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVOVU1fRUxFTSIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9FTlVNX1ZBTFVFCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfRU5VTV9WQUxVRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRU5VTV9WQUxVRSIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfRU5VTV9WQUxVRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRU5VTV9WQUxVRSIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9FUlJPUl9JTlBVVF9PVkVSRkxPVwotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0VSUk9SX0lOUFVUX09WRVJGTE9XKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFUlJPUl9JTlBVVF9PVkVSRkxPVyIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfRVJST1JfSU5QVVRfT1ZFUkZMT1cpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVSUk9SX0lOUFVUX09WRVJGTE9XIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX0VSUk9SX0xFTkdUSAotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0VSUk9SX0xFTkdUSCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRVJST1JfTEVOR1RIIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9FUlJPUl9MRU5HVEgpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVSUk9SX0xFTkdUSCIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9FUlJPUl9MT0NBVElPTl9MU1AKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9FUlJPUl9MT0NBVElPTl9MU1ApOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVSUk9SX0xPQ0FUSU9OX0xTUCIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfRVJST1JfTE9DQVRJT05fTFNQKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFUlJPUl9MT0NBVElPTl9MU1AiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfRVJST1JfTE9DQVRJT05fTVNQCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfRVJST1JfTE9DQVRJT05fTVNQKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFUlJPUl9MT0NBVElPTl9NU1AiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0VSUk9SX0xPQ0FUSU9OX01TUCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRVJST1JfTE9DQVRJT05fTVNQIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX0VSUk9SX05VTUJFUgotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0VSUk9SX05VTUJFUik7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRVJST1JfTlVNQkVSIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9FUlJPUl9OVU1CRVIpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVSUk9SX05VTUJFUiIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9FUlJPUl9PVVRQVVRfVU5ERVJGTE9XCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfRVJST1JfT1VUUFVUX1VOREVSRkxPVyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRVJST1JfT1VUUFVUX1VOREVSRkxPVyIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfRVJST1JfT1VUUFVUX1VOREVSRkxPVyk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRVJST1JfT1VUUFVUX1VOREVSRkxPVyIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9FUlJPUl9UWVBFCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfRVJST1JfVFlQRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRVJST1JfVFlQRSIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfRVJST1JfVFlQRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRVJST1JfVFlQRSIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9GSVhFRF9FTEVNCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfRklYRURfRUxFTSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRklYRURfRUxFTSIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfRklYRURfRUxFTSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRklYRURfRUxFTSIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9GSVhFRF9NQ0xLX1RZUEUKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9GSVhFRF9NQ0xLX1RZUEUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkZJWEVEX01DTEtfVFlQRSIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfRklYRURfTUNMS19UWVBFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJGSVhFRF9NQ0xLX1RZUEUiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfR0FJTgotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0dBSU4pOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkdBSU4iLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0dBSU4pOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkdBSU4iLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfR0FJTl9SRUYKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9HQUlOX1JFRik7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiR0FJTl9SRUYiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0dBSU5fUkVGKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJHQUlOX1JFRiIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9IUkJfVFlQRQotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0hSQl9UWVBFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJIUkJfVFlQRSIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfSFJCX1RZUEUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkhSQl9UWVBFIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX0lOUFVUX0NPVU5UCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfSU5QVVRfQ09VTlQpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIklOUFVUX0NPVU5UIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9JTlBVVF9DT1VOVCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSU5QVVRfQ09VTlQiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfSU5QVVRfREVWSUNFX1RZUEUKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9JTlBVVF9ERVZJQ0VfVFlQRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSU5QVVRfREVWSUNFX1RZUEUiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0lOUFVUX0RFVklDRV9UWVBFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJJTlBVVF9ERVZJQ0VfVFlQRSIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9JTlBVVF9ESUdJVEFMCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfSU5QVVRfRElHSVRBTCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSU5QVVRfRElHSVRBTCIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfSU5QVVRfRElHSVRBTCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSU5QVVRfRElHSVRBTCIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9JTlBVVF9IUkJfVFlQRQotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0lOUFVUX0hSQl9UWVBFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJJTlBVVF9IUkJfVFlQRSIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfSU5QVVRfSFJCX1RZUEUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIklOUFVUX0hSQl9UWVBFIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX0lOUFVUX0xJTkUKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9JTlBVVF9MSU5FKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJJTlBVVF9MSU5FIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9JTlBVVF9MSU5FKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJJTlBVVF9MSU5FIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX0lOUFVUX01JQwotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0lOUFVUX01JQyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSU5QVVRfTUlDIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9JTlBVVF9NSUMpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIklOUFVUX01JQyIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9JTlBVVF9QT1JUX1RZUEUKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9JTlBVVF9QT1JUX1RZUEUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIklOUFVUX1BPUlRfVFlQRSIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfSU5QVVRfUE9SVF9UWVBFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJJTlBVVF9QT1JUX1RZUEUiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfSU5QVVRfUkFURQotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0lOUFVUX1JBVEUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIklOUFVUX1JBVEUiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0lOUFVUX1JBVEUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIklOUFVUX1JBVEUiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfSU5QVVRfU09VUkNFCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfSU5QVVRfU09VUkNFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJJTlBVVF9TT1VSQ0UiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0lOUFVUX1NPVVJDRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSU5QVVRfU09VUkNFIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX0lOVDMyX0VMRU0KLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9JTlQzMl9FTEVNKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJJTlQzMl9FTEVNIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9JTlQzMl9FTEVNKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJJTlQzMl9FTEVNIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX0lOVDY0X0VMRU0KLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9JTlQ2NF9FTEVNKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJJTlQ2NF9FTEVNIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9JTlQ2NF9FTEVNKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJJTlQ2NF9FTEVNIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX0lOVEVSRkFDRQotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0lOVEVSRkFDRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSU5URVJGQUNFIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9JTlRFUkZBQ0UpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIklOVEVSRkFDRSIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9JTlRFUkZBQ0VfVFlQRQotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0lOVEVSRkFDRV9UWVBFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJJTlRFUkZBQ0VfVFlQRSIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfSU5URVJGQUNFX1RZUEUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIklOVEVSRkFDRV9UWVBFIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX0lOVkFMSURfUEFSQU0KLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9JTlZBTElEX1BBUkFNKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJJTlZBTElEX1BBUkFNIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9JTlZBTElEX1BBUkFNKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJJTlZBTElEX1BBUkFNIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX0lOVkFMSURfVkFMVUUKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9JTlZBTElEX1ZBTFVFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJJTlZBTElEX1ZBTFVFIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9JTlZBTElEX1ZBTFVFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJJTlZBTElEX1ZBTFVFIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX0pJVFRFUgotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0pJVFRFUik7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSklUVEVSIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9KSVRURVIpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkpJVFRFUiIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9MQUJFTAotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0xBQkVMKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJMQUJFTCIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfTEFCRUwpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkxBQkVMIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX0xFRlRfSU5QVVRfQVRURU4KLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9MRUZUX0lOUFVUX0FUVEVOKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJMRUZUX0lOUFVUX0FUVEVOIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9MRUZUX0lOUFVUX0FUVEVOKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJMRUZUX0lOUFVUX0FUVEVOIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX0xFRlRfTU9OSVRPUl9BVFRFTgotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0xFRlRfTU9OSVRPUl9BVFRFTik7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTEVGVF9NT05JVE9SX0FUVEVOIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9MRUZUX01PTklUT1JfQVRURU4pOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkxFRlRfTU9OSVRPUl9BVFRFTiIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9MRUZUX1NQRUFLRVJfR0FJTgotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0xFRlRfU1BFQUtFUl9HQUlOKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJMRUZUX1NQRUFLRVJfR0FJTiIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfTEVGVF9TUEVBS0VSX0dBSU4pOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkxFRlRfU1BFQUtFUl9HQUlOIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX0xFRlQxX0lOUFVUX0FUVEVOCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfTEVGVDFfSU5QVVRfQVRURU4pOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkxFRlQxX0lOUFVUX0FUVEVOIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9MRUZUMV9JTlBVVF9BVFRFTik7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTEVGVDFfSU5QVVRfQVRURU4iLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfTEVGVDJfSU5QVVRfQVRURU4KLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9MRUZUMl9JTlBVVF9BVFRFTik7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTEVGVDJfSU5QVVRfQVRURU4iLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0xFRlQyX0lOUFVUX0FUVEVOKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJMRUZUMl9JTlBVVF9BVFRFTiIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9MSU5FX0lGX1RZUEUKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9MSU5FX0lGX1RZUEUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkxJTkVfSUZfVFlQRSIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfTElORV9JRl9UWVBFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJMSU5FX0lGX1RZUEUiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfTE9DS0VECi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfTE9DS0VEKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJMT0NLRUQiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0xPQ0tFRCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTE9DS0VEIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX01BU1RFUl9DTE9DSwotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX01BU1RFUl9DTE9DSyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTUFTVEVSX0NMT0NLIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9NQVNURVJfQ0xPQ0spOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1BU1RFUl9DTE9DSyIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9NQVRSSVhfVkFMCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfTUFUUklYX1ZBTCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTUFUUklYX1ZBTCIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfTUFUUklYX1ZBTCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTUFUUklYX1ZBTCIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9NQVhfRVJST1IKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9NQVhfRVJST1IpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1BWF9FUlJPUiIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfTUFYX0VSUk9SKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNQVhfRVJST1IiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfTUFYX0VWRU5UX1BBUkFNCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfTUFYX0VWRU5UX1BBUkFNKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNQVhfRVZFTlRfUEFSQU0iLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX01BWF9FVkVOVF9QQVJBTSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTUFYX0VWRU5UX1BBUkFNIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX01BWF9QQlVGU0laRQotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX01BWF9QQlVGU0laRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTUFYX1BCVUZTSVpFIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9NQVhfUEJVRlNJWkUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1BWF9QQlVGU0laRSIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9NQVhfUE9SVFMKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9NQVhfUE9SVFMpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1BWF9QT1JUUyIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfTUFYX1BPUlRTKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNQVhfUE9SVFMiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfTUFYX1JFU09VUkNFX0lECi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfTUFYX1JFU09VUkNFX0lEKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNQVhfUkVTT1VSQ0VfSUQiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX01BWF9SRVNPVVJDRV9JRCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTUFYX1JFU09VUkNFX0lEIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX01BWF9TRVRTSVpFCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfTUFYX1NFVFNJWkUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1BWF9TRVRTSVpFIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9NQVhfU0VUU0laRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTUFYX1NFVFNJWkUiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfTUFYX1NUUkxFTgotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX01BWF9TVFJMRU4pOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1BWF9TVFJMRU4iLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX01BWF9TVFJMRU4pOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1BWF9TVFJMRU4iLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfTUNMS19UWVBFCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfTUNMS19UWVBFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNQ0xLX1RZUEUiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX01DTEtfVFlQRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTUNMS19UWVBFIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX01JQ19JRl9UWVBFCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfTUlDX0lGX1RZUEUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1JQ19JRl9UWVBFIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9NSUNfSUZfVFlQRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTUlDX0lGX1RZUEUiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfTU9OSVRPUl9DVEwKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9NT05JVE9SX0NUTCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTU9OSVRPUl9DVEwiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX01PTklUT1JfQ1RMKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNT05JVE9SX0NUTCIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9NT05JVE9SX09GRgotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX01PTklUT1JfT0ZGKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNT05JVE9SX09GRiIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfTU9OSVRPUl9PRkYpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1PTklUT1JfT0ZGIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX01PTklUT1JfT04KLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9NT05JVE9SX09OKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNT05JVE9SX09OIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9NT05JVE9SX09OKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNT05JVE9SX09OIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX01PTk8KLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9NT05PKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNT05PIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9NT05PKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNT05PIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX01VVEUKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9NVVRFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNVVRFIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9NVVRFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNVVRFIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX05BTUUKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9OQU1FKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJOQU1FIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9OQU1FKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJOQU1FIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX05FR19JTkZJTklUWQotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX05FR19JTkZJTklUWSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTkVHX0lORklOSVRZIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9ORUdfSU5GSU5JVFkpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk5FR19JTkZJTklUWSIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9ORUdfSU5GSU5JVFlfQklUCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfTkVHX0lORklOSVRZX0JJVCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTkVHX0lORklOSVRZX0JJVCIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfTkVHX0lORklOSVRZX0JJVCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTkVHX0lORklOSVRZX0JJVCIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9OT19DSEFOR0UKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9OT19DSEFOR0UpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk5PX0NIQU5HRSIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfTk9fQ0hBTkdFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJOT19DSEFOR0UiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfTk9fQ0hBTkdFX0JJVAotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX05PX0NIQU5HRV9CSVQpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk5PX0NIQU5HRV9CSVQiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX05PX0NIQU5HRV9CSVQpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk5PX0NIQU5HRV9CSVQiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfTk9fRUxFTQotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX05PX0VMRU0pOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk5PX0VMRU0iLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX05PX0VMRU0pOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk5PX0VMRU0iLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfTk9fRVJST1JTCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfTk9fRVJST1JTKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJOT19FUlJPUlMiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX05PX0VSUk9SUyk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTk9fRVJST1JTIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX05PX09QCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfTk9fT1ApOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk5PX09QIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9OT19PUCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTk9fT1AiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfTk9fVkFMCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfTk9fVkFMKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJOT19WQUwiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX05PX1ZBTCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTk9fVkFMIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX05VTExfSU5URVJGQUNFCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfTlVMTF9JTlRFUkZBQ0UpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk5VTExfSU5URVJGQUNFIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9OVUxMX0lOVEVSRkFDRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTlVMTF9JTlRFUkZBQ0UiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfTlVMTF9SRVNPVVJDRQotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX05VTExfUkVTT1VSQ0UpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk5VTExfUkVTT1VSQ0UiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX05VTExfUkVTT1VSQ0UpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk5VTExfUkVTT1VSQ0UiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfT1BUSUNBTF9JRl9UWVBFCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfT1BUSUNBTF9JRl9UWVBFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJPUFRJQ0FMX0lGX1RZUEUiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX09QVElDQUxfSUZfVFlQRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiT1BUSUNBTF9JRl9UWVBFIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX09VVFBVVF9DT1VOVAotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX09VVFBVVF9DT1VOVCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiT1VUUFVUX0NPVU5UIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9PVVRQVVRfQ09VTlQpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk9VVFBVVF9DT1VOVCIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9PVVRQVVRfREVWSUNFX1RZUEUKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9PVVRQVVRfREVWSUNFX1RZUEUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk9VVFBVVF9ERVZJQ0VfVFlQRSIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfT1VUUFVUX0RFVklDRV9UWVBFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJPVVRQVVRfREVWSUNFX1RZUEUiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfT1VUUFVUX0hSQl9UWVBFCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfT1VUUFVUX0hSQl9UWVBFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJPVVRQVVRfSFJCX1RZUEUiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX09VVFBVVF9IUkJfVFlQRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiT1VUUFVUX0hSQl9UWVBFIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX09VVFBVVF9QT1JUX1RZUEUKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9PVVRQVVRfUE9SVF9UWVBFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJPVVRQVVRfUE9SVF9UWVBFIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9PVVRQVVRfUE9SVF9UWVBFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJPVVRQVVRfUE9SVF9UWVBFIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX09VVFBVVF9SQVRFCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfT1VUUFVUX1JBVEUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk9VVFBVVF9SQVRFIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9PVVRQVVRfUkFURSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiT1VUUFVUX1JBVEUiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfUEFSQU1fQklUCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfUEFSQU1fQklUKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJQQVJBTV9CSVQiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1BBUkFNX0JJVCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUEFSQU1fQklUIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX1BBUkFNUwotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1BBUkFNUyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUEFSQU1TIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9QQVJBTVMpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlBBUkFNUyIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9QT1JUX0NPVU5UCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfUE9SVF9DT1VOVCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUE9SVF9DT1VOVCIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfUE9SVF9DT1VOVCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUE9SVF9DT1VOVCIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9QT1JUX1RZUEUKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9QT1JUX1RZUEUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlBPUlRfVFlQRSIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfUE9SVF9UWVBFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJQT1JUX1RZUEUiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfUE9SVFMKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9QT1JUUyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUE9SVFMiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1BPUlRTKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJQT1JUUyIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9QT1JUU1RZTEVfRElSRUNUCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfUE9SVFNUWUxFX0RJUkVDVCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUE9SVFNUWUxFX0RJUkVDVCIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfUE9SVFNUWUxFX0RJUkVDVCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUE9SVFNUWUxFX0RJUkVDVCIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9QT1JUU1RZTEVfU0VSSUFMCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfUE9SVFNUWUxFX1NFUklBTCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUE9SVFNUWUxFX1NFUklBTCIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfUE9SVFNUWUxFX1NFUklBTCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUE9SVFNUWUxFX1NFUklBTCIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9QUklOVF9FUlJPUlMKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9QUklOVF9FUlJPUlMpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlBSSU5UX0VSUk9SUyIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfUFJJTlRfRVJST1JTKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJQUklOVF9FUlJPUlMiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfUFRSX0VMRU0KLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9QVFJfRUxFTSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUFRSX0VMRU0iLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1BUUl9FTEVNKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJQVFJfRUxFTSIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9SQU5HRV9WQUxVRQotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1JBTkdFX1ZBTFVFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSQU5HRV9WQUxVRSIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfUkFOR0VfVkFMVUUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJBTkdFX1ZBTFVFIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX1JBVEUKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9SQVRFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSQVRFIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9SQVRFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSQVRFIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX1JBVEVfMTEwMjUKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9SQVRFXzExMDI1KTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSQVRFXzExMDI1IiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9SQVRFXzExMDI1KTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSQVRFXzExMDI1IiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX1JBVEVfMTYwMDAKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9SQVRFXzE2MDAwKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSQVRFXzE2MDAwIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9SQVRFXzE2MDAwKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSQVRFXzE2MDAwIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX1JBVEVfMjIwNTAKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9SQVRFXzIyMDUwKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSQVRFXzIyMDUwIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9SQVRFXzIyMDUwKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSQVRFXzIyMDUwIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX1JBVEVfMzIwMDAKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9SQVRFXzMyMDAwKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSQVRFXzMyMDAwIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9SQVRFXzMyMDAwKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSQVRFXzMyMDAwIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX1JBVEVfNDQxMDAKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9SQVRFXzQ0MTAwKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSQVRFXzQ0MTAwIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9SQVRFXzQ0MTAwKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSQVRFXzQ0MTAwIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX1JBVEVfNDgwMDAKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9SQVRFXzQ4MDAwKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSQVRFXzQ4MDAwIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9SQVRFXzQ4MDAwKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSQVRFXzQ4MDAwIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX1JBVEVfODAwMAotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1JBVEVfODAwMCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUkFURV84MDAwIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9SQVRFXzgwMDApOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJBVEVfODAwMCIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9SQVRFX0FFU18xCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfUkFURV9BRVNfMSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUkFURV9BRVNfMSIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfUkFURV9BRVNfMSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUkFURV9BRVNfMSIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9SQVRFX0FFU18xcwotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1JBVEVfQUVTXzFzKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSQVRFX0FFU18xcyIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfUkFURV9BRVNfMXMpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJBVEVfQUVTXzFzIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX1JBVEVfQUVTXzIKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9SQVRFX0FFU18yKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSQVRFX0FFU18yIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9SQVRFX0FFU18yKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSQVRFX0FFU18yIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX1JBVEVfQUVTXzMKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9SQVRFX0FFU18zKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSQVRFX0FFU18zIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9SQVRFX0FFU18zKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSQVRFX0FFU18zIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX1JBVEVfQUVTXzQKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9SQVRFX0FFU180KTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSQVRFX0FFU180IiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9SQVRFX0FFU180KTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSQVRFX0FFU180IiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX1JBVEVfQUVTXzYKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9SQVRFX0FFU182KTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSQVRFX0FFU182IiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9SQVRFX0FFU182KTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSQVRFX0FFU182IiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX1JBVEVfRlJBQ1RJT05fRAotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1JBVEVfRlJBQ1RJT05fRCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUkFURV9GUkFDVElPTl9EIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9SQVRFX0ZSQUNUSU9OX0QpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJBVEVfRlJBQ1RJT05fRCIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9SQVRFX0ZSQUNUSU9OX04KLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9SQVRFX0ZSQUNUSU9OX04pOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJBVEVfRlJBQ1RJT05fTiIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfUkFURV9GUkFDVElPTl9OKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSQVRFX0ZSQUNUSU9OX04iLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfUkFURV9JTlBVVFJBVEUKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9SQVRFX0lOUFVUUkFURSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUkFURV9JTlBVVFJBVEUiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1JBVEVfSU5QVVRSQVRFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSQVRFX0lOUFVUUkFURSIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9SQVRFX05PX0RJR0lUQUxfSU5QVVQKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9SQVRFX05PX0RJR0lUQUxfSU5QVVQpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJBVEVfTk9fRElHSVRBTF9JTlBVVCIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfUkFURV9OT19ESUdJVEFMX0lOUFVUKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSQVRFX05PX0RJR0lUQUxfSU5QVVQiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfUkFURV9VTkFDUVVJUkVECi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfUkFURV9VTkFDUVVJUkVEKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSQVRFX1VOQUNRVUlSRUQiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1JBVEVfVU5BQ1FVSVJFRCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUkFURV9VTkFDUVVJUkVEIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX1JBVEVfVU5ERUZJTkVECi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfUkFURV9VTkRFRklORUQpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJBVEVfVU5ERUZJTkVEIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9SQVRFX1VOREVGSU5FRCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUkFURV9VTkRFRklORUQiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfUkVGXzBEQlYKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9SRUZfMERCVik7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUkVGXzBEQlYiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1JFRl8wREJWKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSRUZfMERCViIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9SRUZfTk9ORQotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1JFRl9OT05FKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSRUZfTk9ORSIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfUkVGX05PTkUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJFRl9OT05FIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX1JFU0VSVkVEMV9UWVBFCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfUkVTRVJWRUQxX1RZUEUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJFU0VSVkVEMV9UWVBFIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9SRVNFUlZFRDFfVFlQRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUkVTRVJWRUQxX1RZUEUiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfUkVTRVJWRUQyX1RZUEUKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9SRVNFUlZFRDJfVFlQRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUkVTRVJWRUQyX1RZUEUiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1JFU0VSVkVEMl9UWVBFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSRVNFUlZFRDJfVFlQRSIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9SRVNFUlZFRDNfVFlQRQotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1JFU0VSVkVEM19UWVBFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSRVNFUlZFRDNfVFlQRSIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfUkVTRVJWRUQzX1RZUEUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJFU0VSVkVEM19UWVBFIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX1JFU0VSVkVENF9UWVBFCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfUkVTRVJWRUQ0X1RZUEUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJFU0VSVkVENF9UWVBFIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9SRVNFUlZFRDRfVFlQRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUkVTRVJWRUQ0X1RZUEUiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfUkVTT1VSQ0UKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9SRVNPVVJDRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUkVTT1VSQ0UiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1JFU09VUkNFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSRVNPVVJDRSIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9SRVNPVVJDRV9FTEVNCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfUkVTT1VSQ0VfRUxFTSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUkVTT1VSQ0VfRUxFTSIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfUkVTT1VSQ0VfRUxFTSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUkVTT1VSQ0VfRUxFTSIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9SRVNPVVJDRV9UWVBFCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfUkVTT1VSQ0VfVFlQRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUkVTT1VSQ0VfVFlQRSIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfUkVTT1VSQ0VfVFlQRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUkVTT1VSQ0VfVFlQRSIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9SSUdIVF9JTlBVVF9BVFRFTgotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1JJR0hUX0lOUFVUX0FUVEVOKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSSUdIVF9JTlBVVF9BVFRFTiIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfUklHSFRfSU5QVVRfQVRURU4pOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJJR0hUX0lOUFVUX0FUVEVOIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX1JJR0hUX01PTklUT1JfQVRURU4KLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9SSUdIVF9NT05JVE9SX0FUVEVOKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSSUdIVF9NT05JVE9SX0FUVEVOIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9SSUdIVF9NT05JVE9SX0FUVEVOKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSSUdIVF9NT05JVE9SX0FUVEVOIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX1JJR0hUX1NQRUFLRVJfR0FJTgotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1JJR0hUX1NQRUFLRVJfR0FJTik7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUklHSFRfU1BFQUtFUl9HQUlOIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9SSUdIVF9TUEVBS0VSX0dBSU4pOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJJR0hUX1NQRUFLRVJfR0FJTiIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9SSUdIVDFfSU5QVVRfQVRURU4KLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9SSUdIVDFfSU5QVVRfQVRURU4pOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJJR0hUMV9JTlBVVF9BVFRFTiIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfUklHSFQxX0lOUFVUX0FUVEVOKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSSUdIVDFfSU5QVVRfQVRURU4iLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfUklHSFQyX0lOUFVUX0FUVEVOCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfUklHSFQyX0lOUFVUX0FUVEVOKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSSUdIVDJfSU5QVVRfQVRURU4iLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1JJR0hUMl9JTlBVVF9BVFRFTik7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUklHSFQyX0lOUFVUX0FUVEVOIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX1NBTVBGTVRfRE9VQkxFCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfU0FNUEZNVF9ET1VCTEUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNBTVBGTVRfRE9VQkxFIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9TQU1QRk1UX0RPVUJMRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0FNUEZNVF9ET1VCTEUiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfU0FNUEZNVF9GTE9BVAotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1NBTVBGTVRfRkxPQVQpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNBTVBGTVRfRkxPQVQiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1NBTVBGTVRfRkxPQVQpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNBTVBGTVRfRkxPQVQiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfU0FNUEZNVF9UV09TQ09NUAotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1NBTVBGTVRfVFdPU0NPTVApOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNBTVBGTVRfVFdPU0NPTVAiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1NBTVBGTVRfVFdPU0NPTVApOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNBTVBGTVRfVFdPU0NPTVAiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfU0FNUExFXzE2Ci0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfU0FNUExFXzE2KTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTQU1QTEVfMTYiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1NBTVBMRV8xNik7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0FNUExFXzE2IiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX1NBTVBMRV8yNAotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1NBTVBMRV8yNCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0FNUExFXzI0IiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9TQU1QTEVfMjQpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNBTVBMRV8yNCIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9TQU1QTEVfOAotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1NBTVBMRV84KTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTQU1QTEVfOCIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfU0FNUExFXzgpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNBTVBMRV84IiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX1NDQUxBUl9WQUwKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9TQ0FMQVJfVkFMKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTQ0FMQVJfVkFMIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9TQ0FMQVJfVkFMKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTQ0FMQVJfVkFMIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX1NFVF9WQUwKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9TRVRfVkFMKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTRVRfVkFMIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9TRVRfVkFMKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTRVRfVkFMIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX1NIT1JUX05BTUUKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9TSE9SVF9OQU1FKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSE9SVF9OQU1FIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9TSE9SVF9OQU1FKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSE9SVF9OQU1FIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX1NNUFRFMjcyTV9JRl9UWVBFCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfU01QVEUyNzJNX0lGX1RZUEUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNNUFRFMjcyTV9JRl9UWVBFIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9TTVBURTI3Mk1fSUZfVFlQRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU01QVEUyNzJNX0lGX1RZUEUiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfU09VUkNFCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfU09VUkNFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTT1VSQ0UiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1NPVVJDRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU09VUkNFIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX1NQRUFLRVJfSUZfVFlQRQotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1NQRUFLRVJfSUZfVFlQRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU1BFQUtFUl9JRl9UWVBFIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9TUEVBS0VSX0lGX1RZUEUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNQRUFLRVJfSUZfVFlQRSIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9TUEVBS0VSX01VVEVfQ1RMCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfU1BFQUtFUl9NVVRFX0NUTCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU1BFQUtFUl9NVVRFX0NUTCIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfU1BFQUtFUl9NVVRFX0NUTCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU1BFQUtFUl9NVVRFX0NUTCIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9TUEVBS0VSX01VVEVfT0ZGCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfU1BFQUtFUl9NVVRFX09GRik7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU1BFQUtFUl9NVVRFX09GRiIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfU1BFQUtFUl9NVVRFX09GRik7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU1BFQUtFUl9NVVRFX09GRiIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9TUEVBS0VSX01VVEVfT04KLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9TUEVBS0VSX01VVEVfT04pOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNQRUFLRVJfTVVURV9PTiIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfU1BFQUtFUl9NVVRFX09OKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTUEVBS0VSX01VVEVfT04iLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfU1BFQUtFUl9QTFVTX0xJTkVfSUZfVFlQRQotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1NQRUFLRVJfUExVU19MSU5FX0lGX1RZUEUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNQRUFLRVJfUExVU19MSU5FX0lGX1RZUEUiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1NQRUFLRVJfUExVU19MSU5FX0lGX1RZUEUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNQRUFLRVJfUExVU19MSU5FX0lGX1RZUEUiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfU1RFUkVPCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfU1RFUkVPKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTVEVSRU8iLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1NURVJFTyk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU1RFUkVPIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX1NUUklOR19WQUwKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9TVFJJTkdfVkFMKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTVFJJTkdfVkFMIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9TVFJJTkdfVkFMKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTVFJJTkdfVkFMIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX1NVQlNZU1RFTQotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1NVQlNZU1RFTSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU1VCU1lTVEVNIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9TVUJTWVNURU0pOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNVQlNZU1RFTSIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9TVUJTWVNURU1fVFlQRQotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1NVQlNZU1RFTV9UWVBFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTVUJTWVNURU1fVFlQRSIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfU1VCU1lTVEVNX1RZUEUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNVQlNZU1RFTV9UWVBFIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX1NZTkNfSU5QVVRfVE9fQUVTCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfU1lOQ19JTlBVVF9UT19BRVMpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNZTkNfSU5QVVRfVE9fQUVTIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9TWU5DX0lOUFVUX1RPX0FFUyk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU1lOQ19JTlBVVF9UT19BRVMiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfU1lOQ19PVVRQVVRfVE9fQUVTCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfU1lOQ19PVVRQVVRfVE9fQUVTKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTWU5DX09VVFBVVF9UT19BRVMiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1NZTkNfT1VUUFVUX1RPX0FFUyk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU1lOQ19PVVRQVVRfVE9fQUVTIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX1NZU1RFTQotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1NZU1RFTSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU1lTVEVNIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9TWVNURU0pOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNZU1RFTSIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9TWVNURU1fVFlQRQotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1NZU1RFTV9UWVBFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTWVNURU1fVFlQRSIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfU1lTVEVNX1RZUEUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNZU1RFTV9UWVBFIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX1RFU1RfSUZfVFlQRQotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1RFU1RfSUZfVFlQRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiVEVTVF9JRl9UWVBFIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9URVNUX0lGX1RZUEUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlRFU1RfSUZfVFlQRSIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9UWVBFCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfVFlQRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiVFlQRSIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfVFlQRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiVFlQRSIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9UWVBFX0JJVAotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1RZUEVfQklUKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJUWVBFX0JJVCIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfVFlQRV9CSVQpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlRZUEVfQklUIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX1VOVVNFRF9DT1VOVAotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1VOVVNFRF9DT1VOVCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiVU5VU0VEX0NPVU5UIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9VTlVTRURfQ09VTlQpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlVOVVNFRF9DT1VOVCIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9VTlVTRURfUE9SVFMKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9VTlVTRURfUE9SVFMpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlVOVVNFRF9QT1JUUyIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfVU5VU0VEX1BPUlRTKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJVTlVTRURfUE9SVFMiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfVkFSSUFCTEVfTUNMS19UWVBFCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfVkFSSUFCTEVfTUNMS19UWVBFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJWQVJJQUJMRV9NQ0xLX1RZUEUiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1ZBUklBQkxFX01DTEtfVFlQRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiVkFSSUFCTEVfTUNMS19UWVBFIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX1ZFQ1RPUl9WQUwKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9WRUNUT1JfVkFMKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJWRUNUT1JfVkFMIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9WRUNUT1JfVkFMKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJWRUNUT1JfVkFMIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX1ZJREVPX01DTEtfVFlQRQotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1ZJREVPX01DTEtfVFlQRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiVklERU9fTUNMS19UWVBFIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9WSURFT19NQ0xLX1RZUEUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlZJREVPX01DTEtfVFlQRSIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9XT1JEU0laRQotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1dPUkRTSVpFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJXT1JEU0laRSIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfV09SRFNJWkUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIldPUkRTSVpFIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogCi0jaWZkZWYgQUxfTk9fRUxFTQkJLyogSVJJWCA2ICovCi0JKHZvaWQpIGFsU2V0RXJyb3JIYW5kbGVyKEVycm9ySGFuZGxlcik7CisjaWZkZWYgQUxfTk9fRUxFTSAgICAgICAgICAgICAgIC8qIElSSVggNiAqLworICAgICh2b2lkKSBhbFNldEVycm9ySGFuZGxlcihFcnJvckhhbmRsZXIpOwogI2VuZGlmIC8qIEFMX05PX0VMRU0gKi8KICNpZmRlZiBPTERfSU5URVJGQUNFCi0JKHZvaWQpIEFMc2V0ZXJyb3JoYW5kbGVyKEVycm9ySGFuZGxlcik7CisgICAgKHZvaWQpIEFMc2V0ZXJyb3JoYW5kbGVyKEVycm9ySGFuZGxlcik7CiAjZW5kaWYgLyogT0xEX0lOVEVSRkFDRSAqLwotCQorCiAgIGVycm9yOgotCXJldHVybjsKKyAgICByZXR1cm47CiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL2FycmF5bW9kdWxlLmMgYi9Nb2R1bGVzL2FycmF5bW9kdWxlLmMKaW5kZXggZTExYTU5OC4uYjU3MWZlOCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9hcnJheW1vZHVsZS5jCisrKyBiL01vZHVsZXMvYXJyYXltb2R1bGUuYwpAQCAtMTEsNyArMTEsNyBAQAogI2luY2x1ZGUgPHN0ZGRlZi5oPgogI2Vsc2UgLyogIVNURENfSEVBREVSUyAqLwogI2lmZGVmIEhBVkVfU1lTX1RZUEVTX0gKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4JCS8qIEZvciBzaXplX3QgKi8KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4gICAgICAgICAgLyogRm9yIHNpemVfdCAqLwogI2VuZGlmIC8qIEhBVkVfU1lTX1RZUEVTX0ggKi8KICNlbmRpZiAvKiAhU1REQ19IRUFERVJTICovCiAKQEAgLTIyLDE4ICsyMiwxOCBAQAogICogZnVuY3Rpb25zIGFyZW4ndCB2aXNpYmxlIHlldC4KICAqLwogc3RydWN0IGFycmF5ZGVzY3IgewotCWludCB0eXBlY29kZTsKLQlpbnQgaXRlbXNpemU7Ci0JUHlPYmplY3QgKiAoKmdldGl0ZW0pKHN0cnVjdCBhcnJheW9iamVjdCAqLCBQeV9zc2l6ZV90KTsKLQlpbnQgKCpzZXRpdGVtKShzdHJ1Y3QgYXJyYXlvYmplY3QgKiwgUHlfc3NpemVfdCwgUHlPYmplY3QgKik7CisgICAgaW50IHR5cGVjb2RlOworICAgIGludCBpdGVtc2l6ZTsKKyAgICBQeU9iamVjdCAqICgqZ2V0aXRlbSkoc3RydWN0IGFycmF5b2JqZWN0ICosIFB5X3NzaXplX3QpOworICAgIGludCAoKnNldGl0ZW0pKHN0cnVjdCBhcnJheW9iamVjdCAqLCBQeV9zc2l6ZV90LCBQeU9iamVjdCAqKTsKIH07CiAKIHR5cGVkZWYgc3RydWN0IGFycmF5b2JqZWN0IHsKLQlQeU9iamVjdF9WQVJfSEVBRAotCWNoYXIgKm9iX2l0ZW07Ci0JUHlfc3NpemVfdCBhbGxvY2F0ZWQ7Ci0Jc3RydWN0IGFycmF5ZGVzY3IgKm9iX2Rlc2NyOwotCVB5T2JqZWN0ICp3ZWFrcmVmbGlzdDsgLyogTGlzdCBvZiB3ZWFrIHJlZmVyZW5jZXMgKi8KKyAgICBQeU9iamVjdF9WQVJfSEVBRAorICAgIGNoYXIgKm9iX2l0ZW07CisgICAgUHlfc3NpemVfdCBhbGxvY2F0ZWQ7CisgICAgc3RydWN0IGFycmF5ZGVzY3IgKm9iX2Rlc2NyOworICAgIFB5T2JqZWN0ICp3ZWFrcmVmbGlzdDsgLyogTGlzdCBvZiB3ZWFrIHJlZmVyZW5jZXMgKi8KIH0gYXJyYXlvYmplY3Q7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgQXJyYXl0eXBlOwpAQCAtNDQsNDkgKzQ0LDQ5IEBACiBzdGF0aWMgaW50CiBhcnJheV9yZXNpemUoYXJyYXlvYmplY3QgKnNlbGYsIFB5X3NzaXplX3QgbmV3c2l6ZSkKIHsKLQljaGFyICppdGVtczsKLQlzaXplX3QgX25ld19zaXplOworICAgIGNoYXIgKml0ZW1zOworICAgIHNpemVfdCBfbmV3X3NpemU7CiAKLQkvKiBCeXBhc3MgcmVhbGxvYygpIHdoZW4gYSBwcmV2aW91cyBvdmVyYWxsb2NhdGlvbiBpcyBsYXJnZSBlbm91Z2gKLQkgICB0byBhY2NvbW1vZGF0ZSB0aGUgbmV3c2l6ZS4gIElmIHRoZSBuZXdzaXplIGlzIDE2IHNtYWxsZXIgdGhhbiB0aGUKLQkgICBjdXJyZW50IHNpemUsIHRoZW4gcHJvY2VlZCB3aXRoIHRoZSByZWFsbG9jKCkgdG8gc2hyaW5rIHRoZSBsaXN0LgotCSovCisgICAgLyogQnlwYXNzIHJlYWxsb2MoKSB3aGVuIGEgcHJldmlvdXMgb3ZlcmFsbG9jYXRpb24gaXMgbGFyZ2UgZW5vdWdoCisgICAgICAgdG8gYWNjb21tb2RhdGUgdGhlIG5ld3NpemUuICBJZiB0aGUgbmV3c2l6ZSBpcyAxNiBzbWFsbGVyIHRoYW4gdGhlCisgICAgICAgY3VycmVudCBzaXplLCB0aGVuIHByb2NlZWQgd2l0aCB0aGUgcmVhbGxvYygpIHRvIHNocmluayB0aGUgbGlzdC4KKyAgICAqLwogCi0JaWYgKHNlbGYtPmFsbG9jYXRlZCA+PSBuZXdzaXplICYmCi0JICAgIFB5X1NJWkUoc2VsZikgPCBuZXdzaXplICsgMTYgJiYKLQkgICAgc2VsZi0+b2JfaXRlbSAhPSBOVUxMKSB7Ci0JCVB5X1NJWkUoc2VsZikgPSBuZXdzaXplOwotCQlyZXR1cm4gMDsKLQl9CisgICAgaWYgKHNlbGYtPmFsbG9jYXRlZCA+PSBuZXdzaXplICYmCisgICAgICAgIFB5X1NJWkUoc2VsZikgPCBuZXdzaXplICsgMTYgJiYKKyAgICAgICAgc2VsZi0+b2JfaXRlbSAhPSBOVUxMKSB7CisgICAgICAgIFB5X1NJWkUoc2VsZikgPSBuZXdzaXplOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLQkvKiBUaGlzIG92ZXItYWxsb2NhdGVzIHByb3BvcnRpb25hbCB0byB0aGUgYXJyYXkgc2l6ZSwgbWFraW5nIHJvb20KLQkgKiBmb3IgYWRkaXRpb25hbCBncm93dGguICBUaGUgb3Zlci1hbGxvY2F0aW9uIGlzIG1pbGQsIGJ1dCBpcwotCSAqIGVub3VnaCB0byBnaXZlIGxpbmVhci10aW1lIGFtb3J0aXplZCBiZWhhdmlvciBvdmVyIGEgbG9uZwotCSAqIHNlcXVlbmNlIG9mIGFwcGVuZHMoKSBpbiB0aGUgcHJlc2VuY2Ugb2YgYSBwb29ybHktcGVyZm9ybWluZwotCSAqIHN5c3RlbSByZWFsbG9jKCkuCi0JICogVGhlIGdyb3d0aCBwYXR0ZXJuIGlzOiAgMCwgNCwgOCwgMTYsIDI1LCAzNCwgNDYsIDU2LCA2NywgNzksIC4uLgotCSAqIE5vdGUsIHRoZSBwYXR0ZXJuIHN0YXJ0cyBvdXQgdGhlIHNhbWUgYXMgZm9yIGxpc3RzIGJ1dCB0aGVuCi0JICogZ3Jvd3MgYXQgYSBzbWFsbGVyIHJhdGUgc28gdGhhdCBsYXJnZXIgYXJyYXlzIG9ubHkgb3ZlcmFsbG9jYXRlCi0JICogYnkgYWJvdXQgMS8xNnRoIC0tIHRoaXMgaXMgZG9uZSBiZWNhdXNlIGFycmF5cyBhcmUgcHJlc3VtZWQgdG8gYmUgbW9yZQotCSAqIG1lbW9yeSBjcml0aWNhbC4KLQkgKi8KKyAgICAvKiBUaGlzIG92ZXItYWxsb2NhdGVzIHByb3BvcnRpb25hbCB0byB0aGUgYXJyYXkgc2l6ZSwgbWFraW5nIHJvb20KKyAgICAgKiBmb3IgYWRkaXRpb25hbCBncm93dGguICBUaGUgb3Zlci1hbGxvY2F0aW9uIGlzIG1pbGQsIGJ1dCBpcworICAgICAqIGVub3VnaCB0byBnaXZlIGxpbmVhci10aW1lIGFtb3J0aXplZCBiZWhhdmlvciBvdmVyIGEgbG9uZworICAgICAqIHNlcXVlbmNlIG9mIGFwcGVuZHMoKSBpbiB0aGUgcHJlc2VuY2Ugb2YgYSBwb29ybHktcGVyZm9ybWluZworICAgICAqIHN5c3RlbSByZWFsbG9jKCkuCisgICAgICogVGhlIGdyb3d0aCBwYXR0ZXJuIGlzOiAgMCwgNCwgOCwgMTYsIDI1LCAzNCwgNDYsIDU2LCA2NywgNzksIC4uLgorICAgICAqIE5vdGUsIHRoZSBwYXR0ZXJuIHN0YXJ0cyBvdXQgdGhlIHNhbWUgYXMgZm9yIGxpc3RzIGJ1dCB0aGVuCisgICAgICogZ3Jvd3MgYXQgYSBzbWFsbGVyIHJhdGUgc28gdGhhdCBsYXJnZXIgYXJyYXlzIG9ubHkgb3ZlcmFsbG9jYXRlCisgICAgICogYnkgYWJvdXQgMS8xNnRoIC0tIHRoaXMgaXMgZG9uZSBiZWNhdXNlIGFycmF5cyBhcmUgcHJlc3VtZWQgdG8gYmUgbW9yZQorICAgICAqIG1lbW9yeSBjcml0aWNhbC4KKyAgICAgKi8KIAotCV9uZXdfc2l6ZSA9IChuZXdzaXplID4+IDQpICsgKFB5X1NJWkUoc2VsZikgPCA4ID8gMyA6IDcpICsgbmV3c2l6ZTsKLQlpdGVtcyA9IHNlbGYtPm9iX2l0ZW07Ci0JLyogWFhYIFRoZSBmb2xsb3dpbmcgbXVsdGlwbGljYXRpb24gYW5kIGRpdmlzaW9uIGRvZXMgbm90IG9wdGltaXplIGF3YXkgCi0JICAgbGlrZSBpdCBkb2VzIGZvciBsaXN0cyBzaW5jZSB0aGUgc2l6ZSBpcyBub3Qga25vd24gYXQgY29tcGlsZSB0aW1lICovCi0JaWYgKF9uZXdfc2l6ZSA8PSAoKH4oc2l6ZV90KTApIC8gc2VsZi0+b2JfZGVzY3ItPml0ZW1zaXplKSkKLQkJUHlNZW1fUkVTSVpFKGl0ZW1zLCBjaGFyLCAoX25ld19zaXplICogc2VsZi0+b2JfZGVzY3ItPml0ZW1zaXplKSk7Ci0JZWxzZQotCQlpdGVtcyA9IE5VTEw7Ci0JaWYgKGl0ZW1zID09IE5VTEwpIHsKLQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlzZWxmLT5vYl9pdGVtID0gaXRlbXM7Ci0JUHlfU0laRShzZWxmKSA9IG5ld3NpemU7Ci0Jc2VsZi0+YWxsb2NhdGVkID0gX25ld19zaXplOwotCXJldHVybiAwOworICAgIF9uZXdfc2l6ZSA9IChuZXdzaXplID4+IDQpICsgKFB5X1NJWkUoc2VsZikgPCA4ID8gMyA6IDcpICsgbmV3c2l6ZTsKKyAgICBpdGVtcyA9IHNlbGYtPm9iX2l0ZW07CisgICAgLyogWFhYIFRoZSBmb2xsb3dpbmcgbXVsdGlwbGljYXRpb24gYW5kIGRpdmlzaW9uIGRvZXMgbm90IG9wdGltaXplIGF3YXkKKyAgICAgICBsaWtlIGl0IGRvZXMgZm9yIGxpc3RzIHNpbmNlIHRoZSBzaXplIGlzIG5vdCBrbm93biBhdCBjb21waWxlIHRpbWUgKi8KKyAgICBpZiAoX25ld19zaXplIDw9ICgofihzaXplX3QpMCkgLyBzZWxmLT5vYl9kZXNjci0+aXRlbXNpemUpKQorICAgICAgICBQeU1lbV9SRVNJWkUoaXRlbXMsIGNoYXIsIChfbmV3X3NpemUgKiBzZWxmLT5vYl9kZXNjci0+aXRlbXNpemUpKTsKKyAgICBlbHNlCisgICAgICAgIGl0ZW1zID0gTlVMTDsKKyAgICBpZiAoaXRlbXMgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHNlbGYtPm9iX2l0ZW0gPSBpdGVtczsKKyAgICBQeV9TSVpFKHNlbGYpID0gbmV3c2l6ZTsKKyAgICBzZWxmLT5hbGxvY2F0ZWQgPSBfbmV3X3NpemU7CisgICAgcmV0dXJuIDA7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xMDQsMzA4ICsxMDQsMzA4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogY19nZXRpdGVtKGFycmF5b2JqZWN0ICphcCwgUHlfc3NpemVfdCBpKQogewotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgmKChjaGFyICopYXAtPm9iX2l0ZW0pW2ldLCAxKTsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoJigoY2hhciAqKWFwLT5vYl9pdGVtKVtpXSwgMSk7CiB9CiAKIHN0YXRpYyBpbnQKIGNfc2V0aXRlbShhcnJheW9iamVjdCAqYXAsIFB5X3NzaXplX3QgaSwgUHlPYmplY3QgKnYpCiB7Ci0JY2hhciB4OwotCWlmICghUHlBcmdfUGFyc2UodiwgImM7YXJyYXkgaXRlbSBtdXN0IGJlIGNoYXIiLCAmeCkpCi0JCXJldHVybiAtMTsKLQlpZiAoaSA+PSAwKQotCQkoKGNoYXIgKilhcC0+b2JfaXRlbSlbaV0gPSB4OwotCXJldHVybiAwOworICAgIGNoYXIgeDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlKHYsICJjO2FycmF5IGl0ZW0gbXVzdCBiZSBjaGFyIiwgJngpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKGkgPj0gMCkKKyAgICAgICAgKChjaGFyICopYXAtPm9iX2l0ZW0pW2ldID0geDsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGJfZ2V0aXRlbShhcnJheW9iamVjdCAqYXAsIFB5X3NzaXplX3QgaSkKIHsKLQlsb25nIHggPSAoKGNoYXIgKilhcC0+b2JfaXRlbSlbaV07Ci0JaWYgKHggPj0gMTI4KQotCQl4IC09IDI1NjsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoeCk7CisgICAgbG9uZyB4ID0gKChjaGFyICopYXAtPm9iX2l0ZW0pW2ldOworICAgIGlmICh4ID49IDEyOCkKKyAgICAgICAgeCAtPSAyNTY7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHgpOwogfQogCiBzdGF0aWMgaW50CiBiX3NldGl0ZW0oYXJyYXlvYmplY3QgKmFwLCBQeV9zc2l6ZV90IGksIFB5T2JqZWN0ICp2KQogewotCXNob3J0IHg7Ci0JLyogUHlBcmdfUGFyc2UncyAnYicgZm9ybWF0dGVyIGlzIGZvciBhbiB1bnNpZ25lZCBjaGFyLCB0aGVyZWZvcmUKLQkgICBtdXN0IHVzZSB0aGUgbmV4dCBzaXplIHVwIHRoYXQgaXMgc2lnbmVkICgnaCcpIGFuZCBtYW51YWxseSBkbwotCSAgIHRoZSBvdmVyZmxvdyBjaGVja2luZyAqLwotCWlmICghUHlBcmdfUGFyc2UodiwgImg7YXJyYXkgaXRlbSBtdXN0IGJlIGludGVnZXIiLCAmeCkpCi0JCXJldHVybiAtMTsKLQllbHNlIGlmICh4IDwgLTEyOCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJCSJzaWduZWQgY2hhciBpcyBsZXNzIHRoYW4gbWluaW11bSIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWVsc2UgaWYgKHggPiAxMjcpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0JCQkic2lnbmVkIGNoYXIgaXMgZ3JlYXRlciB0aGFuIG1heGltdW0iKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoaSA+PSAwKQotCQkoKGNoYXIgKilhcC0+b2JfaXRlbSlbaV0gPSAoY2hhcil4OwotCXJldHVybiAwOworICAgIHNob3J0IHg7CisgICAgLyogUHlBcmdfUGFyc2UncyAnYicgZm9ybWF0dGVyIGlzIGZvciBhbiB1bnNpZ25lZCBjaGFyLCB0aGVyZWZvcmUKKyAgICAgICBtdXN0IHVzZSB0aGUgbmV4dCBzaXplIHVwIHRoYXQgaXMgc2lnbmVkICgnaCcpIGFuZCBtYW51YWxseSBkbworICAgICAgIHRoZSBvdmVyZmxvdyBjaGVja2luZyAqLworICAgIGlmICghUHlBcmdfUGFyc2UodiwgImg7YXJyYXkgaXRlbSBtdXN0IGJlIGludGVnZXIiLCAmeCkpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBlbHNlIGlmICh4IDwgLTEyOCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICJzaWduZWQgY2hhciBpcyBsZXNzIHRoYW4gbWluaW11bSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGVsc2UgaWYgKHggPiAxMjcpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAic2lnbmVkIGNoYXIgaXMgZ3JlYXRlciB0aGFuIG1heGltdW0iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoaSA+PSAwKQorICAgICAgICAoKGNoYXIgKilhcC0+b2JfaXRlbSlbaV0gPSAoY2hhcil4OworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogQkJfZ2V0aXRlbShhcnJheW9iamVjdCAqYXAsIFB5X3NzaXplX3QgaSkKIHsKLQlsb25nIHggPSAoKHVuc2lnbmVkIGNoYXIgKilhcC0+b2JfaXRlbSlbaV07Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKHgpOworICAgIGxvbmcgeCA9ICgodW5zaWduZWQgY2hhciAqKWFwLT5vYl9pdGVtKVtpXTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoeCk7CiB9CiAKIHN0YXRpYyBpbnQKIEJCX3NldGl0ZW0oYXJyYXlvYmplY3QgKmFwLCBQeV9zc2l6ZV90IGksIFB5T2JqZWN0ICp2KQogewotCXVuc2lnbmVkIGNoYXIgeDsKLQkvKiAnQicgPT0gdW5zaWduZWQgY2hhciwgbWFwcyB0byBQeUFyZ19QYXJzZSdzICdiJyBmb3JtYXR0ZXIgKi8KLQlpZiAoIVB5QXJnX1BhcnNlKHYsICJiO2FycmF5IGl0ZW0gbXVzdCBiZSBpbnRlZ2VyIiwgJngpKQotCQlyZXR1cm4gLTE7Ci0JaWYgKGkgPj0gMCkKLQkJKChjaGFyICopYXAtPm9iX2l0ZW0pW2ldID0geDsKLQlyZXR1cm4gMDsKKyAgICB1bnNpZ25lZCBjaGFyIHg7CisgICAgLyogJ0InID09IHVuc2lnbmVkIGNoYXIsIG1hcHMgdG8gUHlBcmdfUGFyc2UncyAnYicgZm9ybWF0dGVyICovCisgICAgaWYgKCFQeUFyZ19QYXJzZSh2LCAiYjthcnJheSBpdGVtIG11c3QgYmUgaW50ZWdlciIsICZ4KSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmIChpID49IDApCisgICAgICAgICgoY2hhciAqKWFwLT5vYl9pdGVtKVtpXSA9IHg7CisgICAgcmV0dXJuIDA7CiB9CiAKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCiBzdGF0aWMgUHlPYmplY3QgKgogdV9nZXRpdGVtKGFycmF5b2JqZWN0ICphcCwgUHlfc3NpemVfdCBpKQogewotCXJldHVybiBQeVVuaWNvZGVfRnJvbVVuaWNvZGUoJigoUHlfVU5JQ09ERSAqKSBhcC0+b2JfaXRlbSlbaV0sIDEpOworICAgIHJldHVybiBQeVVuaWNvZGVfRnJvbVVuaWNvZGUoJigoUHlfVU5JQ09ERSAqKSBhcC0+b2JfaXRlbSlbaV0sIDEpOwogfQogCiBzdGF0aWMgaW50CiB1X3NldGl0ZW0oYXJyYXlvYmplY3QgKmFwLCBQeV9zc2l6ZV90IGksIFB5T2JqZWN0ICp2KQogewotCVB5X1VOSUNPREUgKnA7Ci0JUHlfc3NpemVfdCBsZW47CisgICAgUHlfVU5JQ09ERSAqcDsKKyAgICBQeV9zc2l6ZV90IGxlbjsKIAotCWlmICghUHlBcmdfUGFyc2UodiwgInUjO2FycmF5IGl0ZW0gbXVzdCBiZSB1bmljb2RlIGNoYXJhY3RlciIsICZwLCAmbGVuKSkKLQkJcmV0dXJuIC0xOwotCWlmIChsZW4gIT0gMSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJhcnJheSBpdGVtIG11c3QgYmUgdW5pY29kZSBjaGFyYWN0ZXIiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoaSA+PSAwKQotCQkoKFB5X1VOSUNPREUgKilhcC0+b2JfaXRlbSlbaV0gPSBwWzBdOwotCXJldHVybiAwOworICAgIGlmICghUHlBcmdfUGFyc2UodiwgInUjO2FycmF5IGl0ZW0gbXVzdCBiZSB1bmljb2RlIGNoYXJhY3RlciIsICZwLCAmbGVuKSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmIChsZW4gIT0gMSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImFycmF5IGl0ZW0gbXVzdCBiZSB1bmljb2RlIGNoYXJhY3RlciIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChpID49IDApCisgICAgICAgICgoUHlfVU5JQ09ERSAqKWFwLT5vYl9pdGVtKVtpXSA9IHBbMF07CisgICAgcmV0dXJuIDA7CiB9CiAjZW5kaWYKIAogc3RhdGljIFB5T2JqZWN0ICoKIGhfZ2V0aXRlbShhcnJheW9iamVjdCAqYXAsIFB5X3NzaXplX3QgaSkKIHsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpICgoc2hvcnQgKilhcC0+b2JfaXRlbSlbaV0pOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZykgKChzaG9ydCAqKWFwLT5vYl9pdGVtKVtpXSk7CiB9CiAKIHN0YXRpYyBpbnQKIGhfc2V0aXRlbShhcnJheW9iamVjdCAqYXAsIFB5X3NzaXplX3QgaSwgUHlPYmplY3QgKnYpCiB7Ci0Jc2hvcnQgeDsKLQkvKiAnaCcgPT0gc2lnbmVkIHNob3J0LCBtYXBzIHRvIFB5QXJnX1BhcnNlJ3MgJ2gnIGZvcm1hdHRlciAqLwotCWlmICghUHlBcmdfUGFyc2UodiwgImg7YXJyYXkgaXRlbSBtdXN0IGJlIGludGVnZXIiLCAmeCkpCi0JCXJldHVybiAtMTsKLQlpZiAoaSA+PSAwKQotCQkgICAgICgoc2hvcnQgKilhcC0+b2JfaXRlbSlbaV0gPSB4OwotCXJldHVybiAwOworICAgIHNob3J0IHg7CisgICAgLyogJ2gnID09IHNpZ25lZCBzaG9ydCwgbWFwcyB0byBQeUFyZ19QYXJzZSdzICdoJyBmb3JtYXR0ZXIgKi8KKyAgICBpZiAoIVB5QXJnX1BhcnNlKHYsICJoO2FycmF5IGl0ZW0gbXVzdCBiZSBpbnRlZ2VyIiwgJngpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKGkgPj0gMCkKKyAgICAgICAgICAgICAgICAgKChzaG9ydCAqKWFwLT5vYl9pdGVtKVtpXSA9IHg7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBISF9nZXRpdGVtKGFycmF5b2JqZWN0ICphcCwgUHlfc3NpemVfdCBpKQogewotCXJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZykgKCh1bnNpZ25lZCBzaG9ydCAqKWFwLT5vYl9pdGVtKVtpXSk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKSAoKHVuc2lnbmVkIHNob3J0ICopYXAtPm9iX2l0ZW0pW2ldKTsKIH0KIAogc3RhdGljIGludAogSEhfc2V0aXRlbShhcnJheW9iamVjdCAqYXAsIFB5X3NzaXplX3QgaSwgUHlPYmplY3QgKnYpCiB7Ci0JaW50IHg7Ci0JLyogUHlBcmdfUGFyc2UncyAnaCcgZm9ybWF0dGVyIGlzIGZvciBhIHNpZ25lZCBzaG9ydCwgdGhlcmVmb3JlCi0JICAgbXVzdCB1c2UgdGhlIG5leHQgc2l6ZSB1cCBhbmQgbWFudWFsbHkgZG8gdGhlIG92ZXJmbG93IGNoZWNraW5nICovCi0JaWYgKCFQeUFyZ19QYXJzZSh2LCAiaTthcnJheSBpdGVtIG11c3QgYmUgaW50ZWdlciIsICZ4KSkKLQkJcmV0dXJuIC0xOwotCWVsc2UgaWYgKHggPCAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJInVuc2lnbmVkIHNob3J0IGlzIGxlc3MgdGhhbiBtaW5pbXVtIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JZWxzZSBpZiAoeCA+IFVTSFJUX01BWCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJCSJ1bnNpZ25lZCBzaG9ydCBpcyBncmVhdGVyIHRoYW4gbWF4aW11bSIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmIChpID49IDApCi0JCSgoc2hvcnQgKilhcC0+b2JfaXRlbSlbaV0gPSAoc2hvcnQpeDsKLQlyZXR1cm4gMDsKKyAgICBpbnQgeDsKKyAgICAvKiBQeUFyZ19QYXJzZSdzICdoJyBmb3JtYXR0ZXIgaXMgZm9yIGEgc2lnbmVkIHNob3J0LCB0aGVyZWZvcmUKKyAgICAgICBtdXN0IHVzZSB0aGUgbmV4dCBzaXplIHVwIGFuZCBtYW51YWxseSBkbyB0aGUgb3ZlcmZsb3cgY2hlY2tpbmcgKi8KKyAgICBpZiAoIVB5QXJnX1BhcnNlKHYsICJpO2FycmF5IGl0ZW0gbXVzdCBiZSBpbnRlZ2VyIiwgJngpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgZWxzZSBpZiAoeCA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAidW5zaWduZWQgc2hvcnQgaXMgbGVzcyB0aGFuIG1pbmltdW0iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBlbHNlIGlmICh4ID4gVVNIUlRfTUFYKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgInVuc2lnbmVkIHNob3J0IGlzIGdyZWF0ZXIgdGhhbiBtYXhpbXVtIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKGkgPj0gMCkKKyAgICAgICAgKChzaG9ydCAqKWFwLT5vYl9pdGVtKVtpXSA9IChzaG9ydCl4OworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaV9nZXRpdGVtKGFycmF5b2JqZWN0ICphcCwgUHlfc3NpemVfdCBpKQogewotCXJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZykgKChpbnQgKilhcC0+b2JfaXRlbSlbaV0pOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZykgKChpbnQgKilhcC0+b2JfaXRlbSlbaV0pOwogfQogCiBzdGF0aWMgaW50CiBpX3NldGl0ZW0oYXJyYXlvYmplY3QgKmFwLCBQeV9zc2l6ZV90IGksIFB5T2JqZWN0ICp2KQogewotCWludCB4OwotCS8qICdpJyA9PSBzaWduZWQgaW50LCBtYXBzIHRvIFB5QXJnX1BhcnNlJ3MgJ2knIGZvcm1hdHRlciAqLwotCWlmICghUHlBcmdfUGFyc2UodiwgImk7YXJyYXkgaXRlbSBtdXN0IGJlIGludGVnZXIiLCAmeCkpCi0JCXJldHVybiAtMTsKLQlpZiAoaSA+PSAwKQotCQkgICAgICgoaW50ICopYXAtPm9iX2l0ZW0pW2ldID0geDsKLQlyZXR1cm4gMDsKKyAgICBpbnQgeDsKKyAgICAvKiAnaScgPT0gc2lnbmVkIGludCwgbWFwcyB0byBQeUFyZ19QYXJzZSdzICdpJyBmb3JtYXR0ZXIgKi8KKyAgICBpZiAoIVB5QXJnX1BhcnNlKHYsICJpO2FycmF5IGl0ZW0gbXVzdCBiZSBpbnRlZ2VyIiwgJngpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKGkgPj0gMCkKKyAgICAgICAgICAgICAgICAgKChpbnQgKilhcC0+b2JfaXRlbSlbaV0gPSB4OworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogSUlfZ2V0aXRlbShhcnJheW9iamVjdCAqYXAsIFB5X3NzaXplX3QgaSkKIHsKLQlyZXR1cm4gUHlMb25nX0Zyb21VbnNpZ25lZExvbmcoCi0JCSh1bnNpZ25lZCBsb25nKSAoKHVuc2lnbmVkIGludCAqKWFwLT5vYl9pdGVtKVtpXSk7CisgICAgcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKAorICAgICAgICAodW5zaWduZWQgbG9uZykgKCh1bnNpZ25lZCBpbnQgKilhcC0+b2JfaXRlbSlbaV0pOwogfQogCiBzdGF0aWMgaW50CiBJSV9zZXRpdGVtKGFycmF5b2JqZWN0ICphcCwgUHlfc3NpemVfdCBpLCBQeU9iamVjdCAqdikKIHsKLQl1bnNpZ25lZCBsb25nIHg7Ci0JaWYgKFB5TG9uZ19DaGVjayh2KSkgewotCQl4ID0gUHlMb25nX0FzVW5zaWduZWRMb25nKHYpOwotCQlpZiAoeCA9PSAodW5zaWduZWQgbG9uZykgLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJCXJldHVybiAtMTsKLQl9Ci0JZWxzZSB7Ci0JCWxvbmcgeTsKLQkJaWYgKCFQeUFyZ19QYXJzZSh2LCAibDthcnJheSBpdGVtIG11c3QgYmUgaW50ZWdlciIsICZ5KSkKLQkJCXJldHVybiAtMTsKLQkJaWYgKHkgPCAwKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJCQkidW5zaWduZWQgaW50IGlzIGxlc3MgdGhhbiBtaW5pbXVtIik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJeCA9ICh1bnNpZ25lZCBsb25nKXk7CisgICAgdW5zaWduZWQgbG9uZyB4OworICAgIGlmIChQeUxvbmdfQ2hlY2sodikpIHsKKyAgICAgICAgeCA9IFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZyh2KTsKKyAgICAgICAgaWYgKHggPT0gKHVuc2lnbmVkIGxvbmcpIC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBsb25nIHk7CisgICAgICAgIGlmICghUHlBcmdfUGFyc2UodiwgImw7YXJyYXkgaXRlbSBtdXN0IGJlIGludGVnZXIiLCAmeSkpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmICh5IDwgMCkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgInVuc2lnbmVkIGludCBpcyBsZXNzIHRoYW4gbWluaW11bSIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIHggPSAodW5zaWduZWQgbG9uZyl5OwogCi0JfQotCWlmICh4ID4gVUlOVF9NQVgpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0JCQkidW5zaWduZWQgaW50IGlzIGdyZWF0ZXIgdGhhbiBtYXhpbXVtIik7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgfQorICAgIGlmICh4ID4gVUlOVF9NQVgpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAidW5zaWduZWQgaW50IGlzIGdyZWF0ZXIgdGhhbiBtYXhpbXVtIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQlpZiAoaSA+PSAwKQotCQkoKHVuc2lnbmVkIGludCAqKWFwLT5vYl9pdGVtKVtpXSA9ICh1bnNpZ25lZCBpbnQpeDsKLQlyZXR1cm4gMDsKKyAgICBpZiAoaSA+PSAwKQorICAgICAgICAoKHVuc2lnbmVkIGludCAqKWFwLT5vYl9pdGVtKVtpXSA9ICh1bnNpZ25lZCBpbnQpeDsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGxfZ2V0aXRlbShhcnJheW9iamVjdCAqYXAsIFB5X3NzaXplX3QgaSkKIHsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKChsb25nICopYXAtPm9iX2l0ZW0pW2ldKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKChsb25nICopYXAtPm9iX2l0ZW0pW2ldKTsKIH0KIAogc3RhdGljIGludAogbF9zZXRpdGVtKGFycmF5b2JqZWN0ICphcCwgUHlfc3NpemVfdCBpLCBQeU9iamVjdCAqdikKIHsKLQlsb25nIHg7Ci0JaWYgKCFQeUFyZ19QYXJzZSh2LCAibDthcnJheSBpdGVtIG11c3QgYmUgaW50ZWdlciIsICZ4KSkKLQkJcmV0dXJuIC0xOwotCWlmIChpID49IDApCi0JCSAgICAgKChsb25nICopYXAtPm9iX2l0ZW0pW2ldID0geDsKLQlyZXR1cm4gMDsKKyAgICBsb25nIHg7CisgICAgaWYgKCFQeUFyZ19QYXJzZSh2LCAibDthcnJheSBpdGVtIG11c3QgYmUgaW50ZWdlciIsICZ4KSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmIChpID49IDApCisgICAgICAgICAgICAgICAgICgobG9uZyAqKWFwLT5vYl9pdGVtKVtpXSA9IHg7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBMTF9nZXRpdGVtKGFycmF5b2JqZWN0ICphcCwgUHlfc3NpemVfdCBpKQogewotCXJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZygoKHVuc2lnbmVkIGxvbmcgKilhcC0+b2JfaXRlbSlbaV0pOworICAgIHJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZygoKHVuc2lnbmVkIGxvbmcgKilhcC0+b2JfaXRlbSlbaV0pOwogfQogCiBzdGF0aWMgaW50CiBMTF9zZXRpdGVtKGFycmF5b2JqZWN0ICphcCwgUHlfc3NpemVfdCBpLCBQeU9iamVjdCAqdikKIHsKLQl1bnNpZ25lZCBsb25nIHg7Ci0JaWYgKFB5TG9uZ19DaGVjayh2KSkgewotCQl4ID0gUHlMb25nX0FzVW5zaWduZWRMb25nKHYpOwotCQlpZiAoeCA9PSAodW5zaWduZWQgbG9uZykgLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJCXJldHVybiAtMTsKLQl9Ci0JZWxzZSB7Ci0JCWxvbmcgeTsKLQkJaWYgKCFQeUFyZ19QYXJzZSh2LCAibDthcnJheSBpdGVtIG11c3QgYmUgaW50ZWdlciIsICZ5KSkKLQkJCXJldHVybiAtMTsKLQkJaWYgKHkgPCAwKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJCQkidW5zaWduZWQgbG9uZyBpcyBsZXNzIHRoYW4gbWluaW11bSIpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCXggPSAodW5zaWduZWQgbG9uZyl5OworICAgIHVuc2lnbmVkIGxvbmcgeDsKKyAgICBpZiAoUHlMb25nX0NoZWNrKHYpKSB7CisgICAgICAgIHggPSBQeUxvbmdfQXNVbnNpZ25lZExvbmcodik7CisgICAgICAgIGlmICh4ID09ICh1bnNpZ25lZCBsb25nKSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgbG9uZyB5OworICAgICAgICBpZiAoIVB5QXJnX1BhcnNlKHYsICJsO2FycmF5IGl0ZW0gbXVzdCBiZSBpbnRlZ2VyIiwgJnkpKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBpZiAoeSA8IDApIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICJ1bnNpZ25lZCBsb25nIGlzIGxlc3MgdGhhbiBtaW5pbXVtIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgeCA9ICh1bnNpZ25lZCBsb25nKXk7CiAKLQl9Ci0JaWYgKHggPiBVTE9OR19NQVgpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0JCQkidW5zaWduZWQgbG9uZyBpcyBncmVhdGVyIHRoYW4gbWF4aW11bSIpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIH0KKyAgICBpZiAoeCA+IFVMT05HX01BWCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICJ1bnNpZ25lZCBsb25nIGlzIGdyZWF0ZXIgdGhhbiBtYXhpbXVtIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQlpZiAoaSA+PSAwKQotCQkoKHVuc2lnbmVkIGxvbmcgKilhcC0+b2JfaXRlbSlbaV0gPSB4OwotCXJldHVybiAwOworICAgIGlmIChpID49IDApCisgICAgICAgICgodW5zaWduZWQgbG9uZyAqKWFwLT5vYl9pdGVtKVtpXSA9IHg7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmX2dldGl0ZW0oYXJyYXlvYmplY3QgKmFwLCBQeV9zc2l6ZV90IGkpCiB7Ci0JcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZSgoZG91YmxlKSAoKGZsb2F0ICopYXAtPm9iX2l0ZW0pW2ldKTsKKyAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKChkb3VibGUpICgoZmxvYXQgKilhcC0+b2JfaXRlbSlbaV0pOwogfQogCiBzdGF0aWMgaW50CiBmX3NldGl0ZW0oYXJyYXlvYmplY3QgKmFwLCBQeV9zc2l6ZV90IGksIFB5T2JqZWN0ICp2KQogewotCWZsb2F0IHg7Ci0JaWYgKCFQeUFyZ19QYXJzZSh2LCAiZjthcnJheSBpdGVtIG11c3QgYmUgZmxvYXQiLCAmeCkpCi0JCXJldHVybiAtMTsKLQlpZiAoaSA+PSAwKQotCQkgICAgICgoZmxvYXQgKilhcC0+b2JfaXRlbSlbaV0gPSB4OwotCXJldHVybiAwOworICAgIGZsb2F0IHg7CisgICAgaWYgKCFQeUFyZ19QYXJzZSh2LCAiZjthcnJheSBpdGVtIG11c3QgYmUgZmxvYXQiLCAmeCkpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAoaSA+PSAwKQorICAgICAgICAgICAgICAgICAoKGZsb2F0ICopYXAtPm9iX2l0ZW0pW2ldID0geDsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRfZ2V0aXRlbShhcnJheW9iamVjdCAqYXAsIFB5X3NzaXplX3QgaSkKIHsKLQlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKCgoZG91YmxlICopYXAtPm9iX2l0ZW0pW2ldKTsKKyAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKCgoZG91YmxlICopYXAtPm9iX2l0ZW0pW2ldKTsKIH0KIAogc3RhdGljIGludAogZF9zZXRpdGVtKGFycmF5b2JqZWN0ICphcCwgUHlfc3NpemVfdCBpLCBQeU9iamVjdCAqdikKIHsKLQlkb3VibGUgeDsKLQlpZiAoIVB5QXJnX1BhcnNlKHYsICJkO2FycmF5IGl0ZW0gbXVzdCBiZSBmbG9hdCIsICZ4KSkKLQkJcmV0dXJuIC0xOwotCWlmIChpID49IDApCi0JCSAgICAgKChkb3VibGUgKilhcC0+b2JfaXRlbSlbaV0gPSB4OwotCXJldHVybiAwOworICAgIGRvdWJsZSB4OworICAgIGlmICghUHlBcmdfUGFyc2UodiwgImQ7YXJyYXkgaXRlbSBtdXN0IGJlIGZsb2F0IiwgJngpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKGkgPj0gMCkKKyAgICAgICAgICAgICAgICAgKChkb3VibGUgKilhcC0+b2JfaXRlbSlbaV0gPSB4OworICAgIHJldHVybiAwOwogfQogCiAvKiBEZXNjcmlwdGlvbiBvZiB0eXBlcyAqLwogc3RhdGljIHN0cnVjdCBhcnJheWRlc2NyIGRlc2NyaXB0b3JzW10gPSB7Ci0JeydjJywgc2l6ZW9mKGNoYXIpLCBjX2dldGl0ZW0sIGNfc2V0aXRlbX0sCi0JeydiJywgc2l6ZW9mKGNoYXIpLCBiX2dldGl0ZW0sIGJfc2V0aXRlbX0sCi0JeydCJywgc2l6ZW9mKGNoYXIpLCBCQl9nZXRpdGVtLCBCQl9zZXRpdGVtfSwKKyAgICB7J2MnLCBzaXplb2YoY2hhciksIGNfZ2V0aXRlbSwgY19zZXRpdGVtfSwKKyAgICB7J2InLCBzaXplb2YoY2hhciksIGJfZ2V0aXRlbSwgYl9zZXRpdGVtfSwKKyAgICB7J0InLCBzaXplb2YoY2hhciksIEJCX2dldGl0ZW0sIEJCX3NldGl0ZW19LAogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQl7J3UnLCBzaXplb2YoUHlfVU5JQ09ERSksIHVfZ2V0aXRlbSwgdV9zZXRpdGVtfSwKKyAgICB7J3UnLCBzaXplb2YoUHlfVU5JQ09ERSksIHVfZ2V0aXRlbSwgdV9zZXRpdGVtfSwKICNlbmRpZgotCXsnaCcsIHNpemVvZihzaG9ydCksIGhfZ2V0aXRlbSwgaF9zZXRpdGVtfSwKLQl7J0gnLCBzaXplb2Yoc2hvcnQpLCBISF9nZXRpdGVtLCBISF9zZXRpdGVtfSwKLQl7J2knLCBzaXplb2YoaW50KSwgaV9nZXRpdGVtLCBpX3NldGl0ZW19LAotCXsnSScsIHNpemVvZihpbnQpLCBJSV9nZXRpdGVtLCBJSV9zZXRpdGVtfSwKLQl7J2wnLCBzaXplb2YobG9uZyksIGxfZ2V0aXRlbSwgbF9zZXRpdGVtfSwKLQl7J0wnLCBzaXplb2YobG9uZyksIExMX2dldGl0ZW0sIExMX3NldGl0ZW19LAotCXsnZicsIHNpemVvZihmbG9hdCksIGZfZ2V0aXRlbSwgZl9zZXRpdGVtfSwKLQl7J2QnLCBzaXplb2YoZG91YmxlKSwgZF9nZXRpdGVtLCBkX3NldGl0ZW19LAotCXsnXDAnLCAwLCAwLCAwfSAvKiBTZW50aW5lbCAqLworICAgIHsnaCcsIHNpemVvZihzaG9ydCksIGhfZ2V0aXRlbSwgaF9zZXRpdGVtfSwKKyAgICB7J0gnLCBzaXplb2Yoc2hvcnQpLCBISF9nZXRpdGVtLCBISF9zZXRpdGVtfSwKKyAgICB7J2knLCBzaXplb2YoaW50KSwgaV9nZXRpdGVtLCBpX3NldGl0ZW19LAorICAgIHsnSScsIHNpemVvZihpbnQpLCBJSV9nZXRpdGVtLCBJSV9zZXRpdGVtfSwKKyAgICB7J2wnLCBzaXplb2YobG9uZyksIGxfZ2V0aXRlbSwgbF9zZXRpdGVtfSwKKyAgICB7J0wnLCBzaXplb2YobG9uZyksIExMX2dldGl0ZW0sIExMX3NldGl0ZW19LAorICAgIHsnZicsIHNpemVvZihmbG9hdCksIGZfZ2V0aXRlbSwgZl9zZXRpdGVtfSwKKyAgICB7J2QnLCBzaXplb2YoZG91YmxlKSwgZF9nZXRpdGVtLCBkX3NldGl0ZW19LAorICAgIHsnXDAnLCAwLCAwLCAwfSAvKiBTZW50aW5lbCAqLwogfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTQxNSw3OCArNDE1LDc4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogbmV3YXJyYXlvYmplY3QoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeV9zc2l6ZV90IHNpemUsIHN0cnVjdCBhcnJheWRlc2NyICpkZXNjcikKIHsKLQlhcnJheW9iamVjdCAqb3A7Ci0Jc2l6ZV90IG5ieXRlczsKKyAgICBhcnJheW9iamVjdCAqb3A7CisgICAgc2l6ZV90IG5ieXRlczsKIAotCWlmIChzaXplIDwgMCkgewotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChzaXplIDwgMCkgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JbmJ5dGVzID0gc2l6ZSAqIGRlc2NyLT5pdGVtc2l6ZTsKLQkvKiBDaGVjayBmb3Igb3ZlcmZsb3cgKi8KLQlpZiAobmJ5dGVzIC8gZGVzY3ItPml0ZW1zaXplICE9IChzaXplX3Qpc2l6ZSkgewotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQl9Ci0Jb3AgPSAoYXJyYXlvYmplY3QgKikgdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7Ci0JaWYgKG9wID09IE5VTEwpIHsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCW9wLT5vYl9kZXNjciA9IGRlc2NyOwotCW9wLT5hbGxvY2F0ZWQgPSBzaXplOwotCW9wLT53ZWFrcmVmbGlzdCA9IE5VTEw7Ci0JUHlfU0laRShvcCkgPSBzaXplOwotCWlmIChzaXplIDw9IDApIHsKLQkJb3AtPm9iX2l0ZW0gPSBOVUxMOwotCX0KLQllbHNlIHsKLQkJb3AtPm9iX2l0ZW0gPSBQeU1lbV9ORVcoY2hhciwgbmJ5dGVzKTsKLQkJaWYgKG9wLT5vYl9pdGVtID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRihvcCk7Ci0JCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQkJfQotCX0KLQlyZXR1cm4gKFB5T2JqZWN0ICopIG9wOworICAgIG5ieXRlcyA9IHNpemUgKiBkZXNjci0+aXRlbXNpemU7CisgICAgLyogQ2hlY2sgZm9yIG92ZXJmbG93ICovCisgICAgaWYgKG5ieXRlcyAvIGRlc2NyLT5pdGVtc2l6ZSAhPSAoc2l6ZV90KXNpemUpIHsKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgfQorICAgIG9wID0gKGFycmF5b2JqZWN0ICopIHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOworICAgIGlmIChvcCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBvcC0+b2JfZGVzY3IgPSBkZXNjcjsKKyAgICBvcC0+YWxsb2NhdGVkID0gc2l6ZTsKKyAgICBvcC0+d2Vha3JlZmxpc3QgPSBOVUxMOworICAgIFB5X1NJWkUob3ApID0gc2l6ZTsKKyAgICBpZiAoc2l6ZSA8PSAwKSB7CisgICAgICAgIG9wLT5vYl9pdGVtID0gTlVMTDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIG9wLT5vYl9pdGVtID0gUHlNZW1fTkVXKGNoYXIsIG5ieXRlcyk7CisgICAgICAgIGlmIChvcC0+b2JfaXRlbSA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYob3ApOworICAgICAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIChQeU9iamVjdCAqKSBvcDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGdldGFycmF5aXRlbShQeU9iamVjdCAqb3AsIFB5X3NzaXplX3QgaSkKIHsKLQlyZWdpc3RlciBhcnJheW9iamVjdCAqYXA7Ci0JYXNzZXJ0KGFycmF5X0NoZWNrKG9wKSk7Ci0JYXAgPSAoYXJyYXlvYmplY3QgKilvcDsKLQlhc3NlcnQoaT49MCAmJiBpPFB5X1NJWkUoYXApKTsKLQlyZXR1cm4gKCphcC0+b2JfZGVzY3ItPmdldGl0ZW0pKGFwLCBpKTsKKyAgICByZWdpc3RlciBhcnJheW9iamVjdCAqYXA7CisgICAgYXNzZXJ0KGFycmF5X0NoZWNrKG9wKSk7CisgICAgYXAgPSAoYXJyYXlvYmplY3QgKilvcDsKKyAgICBhc3NlcnQoaT49MCAmJiBpPFB5X1NJWkUoYXApKTsKKyAgICByZXR1cm4gKCphcC0+b2JfZGVzY3ItPmdldGl0ZW0pKGFwLCBpKTsKIH0KIAogc3RhdGljIGludAogaW5zMShhcnJheW9iamVjdCAqc2VsZiwgUHlfc3NpemVfdCB3aGVyZSwgUHlPYmplY3QgKnYpCiB7Ci0JY2hhciAqaXRlbXM7Ci0JUHlfc3NpemVfdCBuID0gUHlfU0laRShzZWxmKTsKLQlpZiAodiA9PSBOVUxMKSB7Ci0JCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmICgoKnNlbGYtPm9iX2Rlc2NyLT5zZXRpdGVtKShzZWxmLCAtMSwgdikgPCAwKQotCQlyZXR1cm4gLTE7CisgICAgY2hhciAqaXRlbXM7CisgICAgUHlfc3NpemVfdCBuID0gUHlfU0laRShzZWxmKTsKKyAgICBpZiAodiA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICgoKnNlbGYtPm9iX2Rlc2NyLT5zZXRpdGVtKShzZWxmLCAtMSwgdikgPCAwKQorICAgICAgICByZXR1cm4gLTE7CiAKLQlpZiAoYXJyYXlfcmVzaXplKHNlbGYsIG4rMSkgPT0gLTEpCi0JCXJldHVybiAtMTsKLQlpdGVtcyA9IHNlbGYtPm9iX2l0ZW07Ci0JaWYgKHdoZXJlIDwgMCkgewotCQl3aGVyZSArPSBuOwotCQlpZiAod2hlcmUgPCAwKQotCQkJd2hlcmUgPSAwOwotCX0KLQlpZiAod2hlcmUgPiBuKQotCQl3aGVyZSA9IG47Ci0JLyogYXBwZW5kcyBkb24ndCBuZWVkIHRvIGNhbGwgbWVtbW92ZSgpICovCi0JaWYgKHdoZXJlICE9IG4pCi0JCW1lbW1vdmUoaXRlbXMgKyAod2hlcmUrMSkqc2VsZi0+b2JfZGVzY3ItPml0ZW1zaXplLAotCQkJaXRlbXMgKyB3aGVyZSpzZWxmLT5vYl9kZXNjci0+aXRlbXNpemUsCi0JCQkobi13aGVyZSkqc2VsZi0+b2JfZGVzY3ItPml0ZW1zaXplKTsKLQlyZXR1cm4gKCpzZWxmLT5vYl9kZXNjci0+c2V0aXRlbSkoc2VsZiwgd2hlcmUsIHYpOworICAgIGlmIChhcnJheV9yZXNpemUoc2VsZiwgbisxKSA9PSAtMSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGl0ZW1zID0gc2VsZi0+b2JfaXRlbTsKKyAgICBpZiAod2hlcmUgPCAwKSB7CisgICAgICAgIHdoZXJlICs9IG47CisgICAgICAgIGlmICh3aGVyZSA8IDApCisgICAgICAgICAgICB3aGVyZSA9IDA7CisgICAgfQorICAgIGlmICh3aGVyZSA+IG4pCisgICAgICAgIHdoZXJlID0gbjsKKyAgICAvKiBhcHBlbmRzIGRvbid0IG5lZWQgdG8gY2FsbCBtZW1tb3ZlKCkgKi8KKyAgICBpZiAod2hlcmUgIT0gbikKKyAgICAgICAgbWVtbW92ZShpdGVtcyArICh3aGVyZSsxKSpzZWxmLT5vYl9kZXNjci0+aXRlbXNpemUsCisgICAgICAgICAgICBpdGVtcyArIHdoZXJlKnNlbGYtPm9iX2Rlc2NyLT5pdGVtc2l6ZSwKKyAgICAgICAgICAgIChuLXdoZXJlKSpzZWxmLT5vYl9kZXNjci0+aXRlbXNpemUpOworICAgIHJldHVybiAoKnNlbGYtPm9iX2Rlc2NyLT5zZXRpdGVtKShzZWxmLCB3aGVyZSwgdik7CiB9CiAKIC8qIE1ldGhvZHMgKi8KQEAgLTQ5NCwxNDEgKzQ5NCwxNDEgQEAKIHN0YXRpYyB2b2lkCiBhcnJheV9kZWFsbG9jKGFycmF5b2JqZWN0ICpvcCkKIHsKLQlpZiAob3AtPndlYWtyZWZsaXN0ICE9IE5VTEwpCi0JCVB5T2JqZWN0X0NsZWFyV2Vha1JlZnMoKFB5T2JqZWN0ICopIG9wKTsKLQlpZiAob3AtPm9iX2l0ZW0gIT0gTlVMTCkKLQkJUHlNZW1fREVMKG9wLT5vYl9pdGVtKTsKLQlQeV9UWVBFKG9wKS0+dHBfZnJlZSgoUHlPYmplY3QgKilvcCk7CisgICAgaWYgKG9wLT53ZWFrcmVmbGlzdCAhPSBOVUxMKQorICAgICAgICBQeU9iamVjdF9DbGVhcldlYWtSZWZzKChQeU9iamVjdCAqKSBvcCk7CisgICAgaWYgKG9wLT5vYl9pdGVtICE9IE5VTEwpCisgICAgICAgIFB5TWVtX0RFTChvcC0+b2JfaXRlbSk7CisgICAgUHlfVFlQRShvcCktPnRwX2ZyZWUoKFB5T2JqZWN0ICopb3ApOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYXJyYXlfcmljaGNvbXBhcmUoUHlPYmplY3QgKnYsIFB5T2JqZWN0ICp3LCBpbnQgb3ApCiB7Ci0JYXJyYXlvYmplY3QgKnZhLCAqd2E7Ci0JUHlPYmplY3QgKnZpID0gTlVMTDsKLQlQeU9iamVjdCAqd2kgPSBOVUxMOwotCVB5X3NzaXplX3QgaSwgazsKLQlQeU9iamVjdCAqcmVzOworICAgIGFycmF5b2JqZWN0ICp2YSwgKndhOworICAgIFB5T2JqZWN0ICp2aSA9IE5VTEw7CisgICAgUHlPYmplY3QgKndpID0gTlVMTDsKKyAgICBQeV9zc2l6ZV90IGksIGs7CisgICAgUHlPYmplY3QgKnJlczsKIAotCWlmICghYXJyYXlfQ2hlY2sodikgfHwgIWFycmF5X0NoZWNrKHcpKSB7Ci0JCVB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7Ci0JCXJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKLQl9CisgICAgaWYgKCFhcnJheV9DaGVjayh2KSB8fCAhYXJyYXlfQ2hlY2sodykpIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKKyAgICAgICAgcmV0dXJuIFB5X05vdEltcGxlbWVudGVkOworICAgIH0KIAotCXZhID0gKGFycmF5b2JqZWN0ICopdjsKLQl3YSA9IChhcnJheW9iamVjdCAqKXc7CisgICAgdmEgPSAoYXJyYXlvYmplY3QgKil2OworICAgIHdhID0gKGFycmF5b2JqZWN0ICopdzsKIAotCWlmIChQeV9TSVpFKHZhKSAhPSBQeV9TSVpFKHdhKSAmJiAob3AgPT0gUHlfRVEgfHwgb3AgPT0gUHlfTkUpKSB7Ci0JCS8qIFNob3J0Y3V0OiBpZiB0aGUgbGVuZ3RocyBkaWZmZXIsIHRoZSBhcnJheXMgZGlmZmVyICovCi0JCWlmIChvcCA9PSBQeV9FUSkKLQkJCXJlcyA9IFB5X0ZhbHNlOwotCQllbHNlCi0JCQlyZXMgPSBQeV9UcnVlOwotCQlQeV9JTkNSRUYocmVzKTsKLQkJcmV0dXJuIHJlczsKLQl9CisgICAgaWYgKFB5X1NJWkUodmEpICE9IFB5X1NJWkUod2EpICYmIChvcCA9PSBQeV9FUSB8fCBvcCA9PSBQeV9ORSkpIHsKKyAgICAgICAgLyogU2hvcnRjdXQ6IGlmIHRoZSBsZW5ndGhzIGRpZmZlciwgdGhlIGFycmF5cyBkaWZmZXIgKi8KKyAgICAgICAgaWYgKG9wID09IFB5X0VRKQorICAgICAgICAgICAgcmVzID0gUHlfRmFsc2U7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJlcyA9IFB5X1RydWU7CisgICAgICAgIFB5X0lOQ1JFRihyZXMpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KIAotCS8qIFNlYXJjaCBmb3IgdGhlIGZpcnN0IGluZGV4IHdoZXJlIGl0ZW1zIGFyZSBkaWZmZXJlbnQgKi8KLQlrID0gMTsKLQlmb3IgKGkgPSAwOyBpIDwgUHlfU0laRSh2YSkgJiYgaSA8IFB5X1NJWkUod2EpOyBpKyspIHsKLQkJdmkgPSBnZXRhcnJheWl0ZW0odiwgaSk7Ci0JCXdpID0gZ2V0YXJyYXlpdGVtKHcsIGkpOwotCQlpZiAodmkgPT0gTlVMTCB8fCB3aSA9PSBOVUxMKSB7Ci0JCQlQeV9YREVDUkVGKHZpKTsKLQkJCVB5X1hERUNSRUYod2kpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJayA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbCh2aSwgd2ksIFB5X0VRKTsKLQkJaWYgKGsgPT0gMCkKLQkJCWJyZWFrOyAvKiBLZWVwaW5nIHZpIGFuZCB3aSBhbGl2ZSEgKi8KLQkJUHlfREVDUkVGKHZpKTsKLQkJUHlfREVDUkVGKHdpKTsKLQkJaWYgKGsgPCAwKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIC8qIFNlYXJjaCBmb3IgdGhlIGZpcnN0IGluZGV4IHdoZXJlIGl0ZW1zIGFyZSBkaWZmZXJlbnQgKi8KKyAgICBrID0gMTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgUHlfU0laRSh2YSkgJiYgaSA8IFB5X1NJWkUod2EpOyBpKyspIHsKKyAgICAgICAgdmkgPSBnZXRhcnJheWl0ZW0odiwgaSk7CisgICAgICAgIHdpID0gZ2V0YXJyYXlpdGVtKHcsIGkpOworICAgICAgICBpZiAodmkgPT0gTlVMTCB8fCB3aSA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9YREVDUkVGKHZpKTsKKyAgICAgICAgICAgIFB5X1hERUNSRUYod2kpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgayA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbCh2aSwgd2ksIFB5X0VRKTsKKyAgICAgICAgaWYgKGsgPT0gMCkKKyAgICAgICAgICAgIGJyZWFrOyAvKiBLZWVwaW5nIHZpIGFuZCB3aSBhbGl2ZSEgKi8KKyAgICAgICAgUHlfREVDUkVGKHZpKTsKKyAgICAgICAgUHlfREVDUkVGKHdpKTsKKyAgICAgICAgaWYgKGsgPCAwKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaWYgKGspIHsKLQkJLyogTm8gbW9yZSBpdGVtcyB0byBjb21wYXJlIC0tIGNvbXBhcmUgc2l6ZXMgKi8KLQkJUHlfc3NpemVfdCB2cyA9IFB5X1NJWkUodmEpOwotCQlQeV9zc2l6ZV90IHdzID0gUHlfU0laRSh3YSk7Ci0JCWludCBjbXA7Ci0JCXN3aXRjaCAob3ApIHsKLQkJY2FzZSBQeV9MVDogY21wID0gdnMgPCAgd3M7IGJyZWFrOwotCQljYXNlIFB5X0xFOiBjbXAgPSB2cyA8PSB3czsgYnJlYWs7Ci0JCWNhc2UgUHlfRVE6IGNtcCA9IHZzID09IHdzOyBicmVhazsKLQkJY2FzZSBQeV9ORTogY21wID0gdnMgIT0gd3M7IGJyZWFrOwotCQljYXNlIFB5X0dUOiBjbXAgPSB2cyA+ICB3czsgYnJlYWs7Ci0JCWNhc2UgUHlfR0U6IGNtcCA9IHZzID49IHdzOyBicmVhazsKLQkJZGVmYXVsdDogcmV0dXJuIE5VTEw7IC8qIGNhbm5vdCBoYXBwZW4gKi8KLQkJfQotCQlpZiAoY21wKQotCQkJcmVzID0gUHlfVHJ1ZTsKLQkJZWxzZQotCQkJcmVzID0gUHlfRmFsc2U7Ci0JCVB5X0lOQ1JFRihyZXMpOwotCQlyZXR1cm4gcmVzOwotCX0KKyAgICBpZiAoaykgeworICAgICAgICAvKiBObyBtb3JlIGl0ZW1zIHRvIGNvbXBhcmUgLS0gY29tcGFyZSBzaXplcyAqLworICAgICAgICBQeV9zc2l6ZV90IHZzID0gUHlfU0laRSh2YSk7CisgICAgICAgIFB5X3NzaXplX3Qgd3MgPSBQeV9TSVpFKHdhKTsKKyAgICAgICAgaW50IGNtcDsKKyAgICAgICAgc3dpdGNoIChvcCkgeworICAgICAgICBjYXNlIFB5X0xUOiBjbXAgPSB2cyA8ICB3czsgYnJlYWs7CisgICAgICAgIGNhc2UgUHlfTEU6IGNtcCA9IHZzIDw9IHdzOyBicmVhazsKKyAgICAgICAgY2FzZSBQeV9FUTogY21wID0gdnMgPT0gd3M7IGJyZWFrOworICAgICAgICBjYXNlIFB5X05FOiBjbXAgPSB2cyAhPSB3czsgYnJlYWs7CisgICAgICAgIGNhc2UgUHlfR1Q6IGNtcCA9IHZzID4gIHdzOyBicmVhazsKKyAgICAgICAgY2FzZSBQeV9HRTogY21wID0gdnMgPj0gd3M7IGJyZWFrOworICAgICAgICBkZWZhdWx0OiByZXR1cm4gTlVMTDsgLyogY2Fubm90IGhhcHBlbiAqLworICAgICAgICB9CisgICAgICAgIGlmIChjbXApCisgICAgICAgICAgICByZXMgPSBQeV9UcnVlOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXMgPSBQeV9GYWxzZTsKKyAgICAgICAgUHlfSU5DUkVGKHJlcyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQogCi0JLyogV2UgaGF2ZSBhbiBpdGVtIHRoYXQgZGlmZmVycy4gIEZpcnN0LCBzaG9ydGN1dHMgZm9yIEVRL05FICovCi0JaWYgKG9wID09IFB5X0VRKSB7Ci0JCVB5X0lOQ1JFRihQeV9GYWxzZSk7Ci0JCXJlcyA9IFB5X0ZhbHNlOwotCX0KLQllbHNlIGlmIChvcCA9PSBQeV9ORSkgewotCQlQeV9JTkNSRUYoUHlfVHJ1ZSk7Ci0JCXJlcyA9IFB5X1RydWU7Ci0JfQotCWVsc2UgewotCQkvKiBDb21wYXJlIHRoZSBmaW5hbCBpdGVtIGFnYWluIHVzaW5nIHRoZSBwcm9wZXIgb3BlcmF0b3IgKi8KLQkJcmVzID0gUHlPYmplY3RfUmljaENvbXBhcmUodmksIHdpLCBvcCk7Ci0JfQotCVB5X0RFQ1JFRih2aSk7Ci0JUHlfREVDUkVGKHdpKTsKLQlyZXR1cm4gcmVzOworICAgIC8qIFdlIGhhdmUgYW4gaXRlbSB0aGF0IGRpZmZlcnMuICBGaXJzdCwgc2hvcnRjdXRzIGZvciBFUS9ORSAqLworICAgIGlmIChvcCA9PSBQeV9FUSkgeworICAgICAgICBQeV9JTkNSRUYoUHlfRmFsc2UpOworICAgICAgICByZXMgPSBQeV9GYWxzZTsKKyAgICB9CisgICAgZWxzZSBpZiAob3AgPT0gUHlfTkUpIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X1RydWUpOworICAgICAgICByZXMgPSBQeV9UcnVlOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLyogQ29tcGFyZSB0aGUgZmluYWwgaXRlbSBhZ2FpbiB1c2luZyB0aGUgcHJvcGVyIG9wZXJhdG9yICovCisgICAgICAgIHJlcyA9IFB5T2JqZWN0X1JpY2hDb21wYXJlKHZpLCB3aSwgb3ApOworICAgIH0KKyAgICBQeV9ERUNSRUYodmkpOworICAgIFB5X0RFQ1JFRih3aSk7CisgICAgcmV0dXJuIHJlczsKIH0KIAogc3RhdGljIFB5X3NzaXplX3QKIGFycmF5X2xlbmd0aChhcnJheW9iamVjdCAqYSkKIHsKLQlyZXR1cm4gUHlfU0laRShhKTsKKyAgICByZXR1cm4gUHlfU0laRShhKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGFycmF5X2l0ZW0oYXJyYXlvYmplY3QgKmEsIFB5X3NzaXplX3QgaSkKIHsKLQlpZiAoaSA8IDAgfHwgaSA+PSBQeV9TSVpFKGEpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLCAiYXJyYXkgaW5kZXggb3V0IG9mIHJhbmdlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gZ2V0YXJyYXlpdGVtKChQeU9iamVjdCAqKWEsIGkpOworICAgIGlmIChpIDwgMCB8fCBpID49IFB5X1NJWkUoYSkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsICJhcnJheSBpbmRleCBvdXQgb2YgcmFuZ2UiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBnZXRhcnJheWl0ZW0oKFB5T2JqZWN0ICopYSwgaSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhcnJheV9zbGljZShhcnJheW9iamVjdCAqYSwgUHlfc3NpemVfdCBpbG93LCBQeV9zc2l6ZV90IGloaWdoKQogewotCWFycmF5b2JqZWN0ICpucDsKLQlpZiAoaWxvdyA8IDApCi0JCWlsb3cgPSAwOwotCWVsc2UgaWYgKGlsb3cgPiBQeV9TSVpFKGEpKQotCQlpbG93ID0gUHlfU0laRShhKTsKLQlpZiAoaWhpZ2ggPCAwKQotCQlpaGlnaCA9IDA7Ci0JaWYgKGloaWdoIDwgaWxvdykKLQkJaWhpZ2ggPSBpbG93OwotCWVsc2UgaWYgKGloaWdoID4gUHlfU0laRShhKSkKLQkJaWhpZ2ggPSBQeV9TSVpFKGEpOwotCW5wID0gKGFycmF5b2JqZWN0ICopIG5ld2FycmF5b2JqZWN0KCZBcnJheXR5cGUsIGloaWdoIC0gaWxvdywgYS0+b2JfZGVzY3IpOwotCWlmIChucCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQltZW1jcHkobnAtPm9iX2l0ZW0sIGEtPm9iX2l0ZW0gKyBpbG93ICogYS0+b2JfZGVzY3ItPml0ZW1zaXplLAotCSAgICAgICAoaWhpZ2gtaWxvdykgKiBhLT5vYl9kZXNjci0+aXRlbXNpemUpOwotCXJldHVybiAoUHlPYmplY3QgKilucDsKKyAgICBhcnJheW9iamVjdCAqbnA7CisgICAgaWYgKGlsb3cgPCAwKQorICAgICAgICBpbG93ID0gMDsKKyAgICBlbHNlIGlmIChpbG93ID4gUHlfU0laRShhKSkKKyAgICAgICAgaWxvdyA9IFB5X1NJWkUoYSk7CisgICAgaWYgKGloaWdoIDwgMCkKKyAgICAgICAgaWhpZ2ggPSAwOworICAgIGlmIChpaGlnaCA8IGlsb3cpCisgICAgICAgIGloaWdoID0gaWxvdzsKKyAgICBlbHNlIGlmIChpaGlnaCA+IFB5X1NJWkUoYSkpCisgICAgICAgIGloaWdoID0gUHlfU0laRShhKTsKKyAgICBucCA9IChhcnJheW9iamVjdCAqKSBuZXdhcnJheW9iamVjdCgmQXJyYXl0eXBlLCBpaGlnaCAtIGlsb3csIGEtPm9iX2Rlc2NyKTsKKyAgICBpZiAobnAgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbWVtY3B5KG5wLT5vYl9pdGVtLCBhLT5vYl9pdGVtICsgaWxvdyAqIGEtPm9iX2Rlc2NyLT5pdGVtc2l6ZSwKKyAgICAgICAgICAgKGloaWdoLWlsb3cpICogYS0+b2JfZGVzY3ItPml0ZW1zaXplKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopbnA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhcnJheV9jb3B5KGFycmF5b2JqZWN0ICphLCBQeU9iamVjdCAqdW51c2VkKQogewotCXJldHVybiBhcnJheV9zbGljZShhLCAwLCBQeV9TSVpFKGEpKTsKKyAgICByZXR1cm4gYXJyYXlfc2xpY2UoYSwgMCwgUHlfU0laRShhKSk7CiB9CiAKIFB5RG9jX1NUUlZBUihjb3B5X2RvYywKQEAgLTYzOSwyOTcgKzYzOSwyOTcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBhcnJheV9jb25jYXQoYXJyYXlvYmplY3QgKmEsIFB5T2JqZWN0ICpiYikKIHsKLQlQeV9zc2l6ZV90IHNpemU7Ci0JYXJyYXlvYmplY3QgKm5wOwotCWlmICghYXJyYXlfQ2hlY2soYmIpKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCSAgICAgImNhbiBvbmx5IGFwcGVuZCBhcnJheSAobm90IFwiJS4yMDBzXCIpIHRvIGFycmF5IiwKLQkJCSAgICAgUHlfVFlQRShiYiktPnRwX25hbWUpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgUHlfc3NpemVfdCBzaXplOworICAgIGFycmF5b2JqZWN0ICpucDsKKyAgICBpZiAoIWFycmF5X0NoZWNrKGJiKSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICJjYW4gb25seSBhcHBlbmQgYXJyYXkgKG5vdCBcIiUuMjAwc1wiKSB0byBhcnJheSIsCisgICAgICAgICAgICAgICAgIFB5X1RZUEUoYmIpLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogI2RlZmluZSBiICgoYXJyYXlvYmplY3QgKiliYikKLQlpZiAoYS0+b2JfZGVzY3IgIT0gYi0+b2JfZGVzY3IpIHsKLQkJUHlFcnJfQmFkQXJndW1lbnQoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChQeV9TSVpFKGEpID4gUFlfU1NJWkVfVF9NQVggLSBQeV9TSVpFKGIpKSB7Ci0JCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCX0KLQlzaXplID0gUHlfU0laRShhKSArIFB5X1NJWkUoYik7Ci0JbnAgPSAoYXJyYXlvYmplY3QgKikgbmV3YXJyYXlvYmplY3QoJkFycmF5dHlwZSwgc2l6ZSwgYS0+b2JfZGVzY3IpOwotCWlmIChucCA9PSBOVUxMKSB7Ci0JCXJldHVybiBOVUxMOwotCX0KLQltZW1jcHkobnAtPm9iX2l0ZW0sIGEtPm9iX2l0ZW0sIFB5X1NJWkUoYSkqYS0+b2JfZGVzY3ItPml0ZW1zaXplKTsKLQltZW1jcHkobnAtPm9iX2l0ZW0gKyBQeV9TSVpFKGEpKmEtPm9iX2Rlc2NyLT5pdGVtc2l6ZSwKLQkgICAgICAgYi0+b2JfaXRlbSwgUHlfU0laRShiKSpiLT5vYl9kZXNjci0+aXRlbXNpemUpOwotCXJldHVybiAoUHlPYmplY3QgKilucDsKKyAgICBpZiAoYS0+b2JfZGVzY3IgIT0gYi0+b2JfZGVzY3IpIHsKKyAgICAgICAgUHlFcnJfQmFkQXJndW1lbnQoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChQeV9TSVpFKGEpID4gUFlfU1NJWkVfVF9NQVggLSBQeV9TSVpFKGIpKSB7CisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIH0KKyAgICBzaXplID0gUHlfU0laRShhKSArIFB5X1NJWkUoYik7CisgICAgbnAgPSAoYXJyYXlvYmplY3QgKikgbmV3YXJyYXlvYmplY3QoJkFycmF5dHlwZSwgc2l6ZSwgYS0+b2JfZGVzY3IpOworICAgIGlmIChucCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBtZW1jcHkobnAtPm9iX2l0ZW0sIGEtPm9iX2l0ZW0sIFB5X1NJWkUoYSkqYS0+b2JfZGVzY3ItPml0ZW1zaXplKTsKKyAgICBtZW1jcHkobnAtPm9iX2l0ZW0gKyBQeV9TSVpFKGEpKmEtPm9iX2Rlc2NyLT5pdGVtc2l6ZSwKKyAgICAgICAgICAgYi0+b2JfaXRlbSwgUHlfU0laRShiKSpiLT5vYl9kZXNjci0+aXRlbXNpemUpOworICAgIHJldHVybiAoUHlPYmplY3QgKilucDsKICN1bmRlZiBiCiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhcnJheV9yZXBlYXQoYXJyYXlvYmplY3QgKmEsIFB5X3NzaXplX3QgbikKIHsKLQlQeV9zc2l6ZV90IGk7Ci0JUHlfc3NpemVfdCBzaXplOwotCWFycmF5b2JqZWN0ICpucDsKLQljaGFyICpwOwotCVB5X3NzaXplX3QgbmJ5dGVzOwotCWlmIChuIDwgMCkKLQkJbiA9IDA7Ci0JaWYgKChQeV9TSVpFKGEpICE9IDApICYmIChuID4gUFlfU1NJWkVfVF9NQVggLyBQeV9TSVpFKGEpKSkgewotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQl9Ci0Jc2l6ZSA9IFB5X1NJWkUoYSkgKiBuOwotCW5wID0gKGFycmF5b2JqZWN0ICopIG5ld2FycmF5b2JqZWN0KCZBcnJheXR5cGUsIHNpemUsIGEtPm9iX2Rlc2NyKTsKLQlpZiAobnAgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JcCA9IG5wLT5vYl9pdGVtOwotCW5ieXRlcyA9IFB5X1NJWkUoYSkgKiBhLT5vYl9kZXNjci0+aXRlbXNpemU7Ci0JZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQltZW1jcHkocCwgYS0+b2JfaXRlbSwgbmJ5dGVzKTsKLQkJcCArPSBuYnl0ZXM7Ci0JfQotCXJldHVybiAoUHlPYmplY3QgKikgbnA7CisgICAgUHlfc3NpemVfdCBpOworICAgIFB5X3NzaXplX3Qgc2l6ZTsKKyAgICBhcnJheW9iamVjdCAqbnA7CisgICAgY2hhciAqcDsKKyAgICBQeV9zc2l6ZV90IG5ieXRlczsKKyAgICBpZiAobiA8IDApCisgICAgICAgIG4gPSAwOworICAgIGlmICgoUHlfU0laRShhKSAhPSAwKSAmJiAobiA+IFBZX1NTSVpFX1RfTUFYIC8gUHlfU0laRShhKSkpIHsKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgfQorICAgIHNpemUgPSBQeV9TSVpFKGEpICogbjsKKyAgICBucCA9IChhcnJheW9iamVjdCAqKSBuZXdhcnJheW9iamVjdCgmQXJyYXl0eXBlLCBzaXplLCBhLT5vYl9kZXNjcik7CisgICAgaWYgKG5wID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHAgPSBucC0+b2JfaXRlbTsKKyAgICBuYnl0ZXMgPSBQeV9TSVpFKGEpICogYS0+b2JfZGVzY3ItPml0ZW1zaXplOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgbWVtY3B5KHAsIGEtPm9iX2l0ZW0sIG5ieXRlcyk7CisgICAgICAgIHAgKz0gbmJ5dGVzOworICAgIH0KKyAgICByZXR1cm4gKFB5T2JqZWN0ICopIG5wOwogfQogCiBzdGF0aWMgaW50CiBhcnJheV9hc3Nfc2xpY2UoYXJyYXlvYmplY3QgKmEsIFB5X3NzaXplX3QgaWxvdywgUHlfc3NpemVfdCBpaGlnaCwgUHlPYmplY3QgKnYpCiB7Ci0JY2hhciAqaXRlbTsKLQlQeV9zc2l6ZV90IG47IC8qIFNpemUgb2YgcmVwbGFjZW1lbnQgYXJyYXkgKi8KLQlQeV9zc2l6ZV90IGQ7IC8qIENoYW5nZSBpbiBzaXplICovCisgICAgY2hhciAqaXRlbTsKKyAgICBQeV9zc2l6ZV90IG47IC8qIFNpemUgb2YgcmVwbGFjZW1lbnQgYXJyYXkgKi8KKyAgICBQeV9zc2l6ZV90IGQ7IC8qIENoYW5nZSBpbiBzaXplICovCiAjZGVmaW5lIGIgKChhcnJheW9iamVjdCAqKXYpCi0JaWYgKHYgPT0gTlVMTCkKLQkJbiA9IDA7Ci0JZWxzZSBpZiAoYXJyYXlfQ2hlY2sodikpIHsKLQkJbiA9IFB5X1NJWkUoYik7Ci0JCWlmIChhID09IGIpIHsKLQkJCS8qIFNwZWNpYWwgY2FzZSAiYVtpOmpdID0gYSIgLS0gY29weSBiIGZpcnN0ICovCi0JCQlpbnQgcmV0OwotCQkJdiA9IGFycmF5X3NsaWNlKGIsIDAsIG4pOwotCQkJaWYgKCF2KQotCQkJCXJldHVybiAtMTsKLQkJCXJldCA9IGFycmF5X2Fzc19zbGljZShhLCBpbG93LCBpaGlnaCwgdik7Ci0JCQlQeV9ERUNSRUYodik7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0JCWlmIChiLT5vYl9kZXNjciAhPSBhLT5vYl9kZXNjcikgewotCQkJUHlFcnJfQmFkQXJndW1lbnQoKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCX0KLQllbHNlIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkgICAgICJjYW4gb25seSBhc3NpZ24gYXJyYXkgKG5vdCBcIiUuMjAwc1wiKSB0byBhcnJheSBzbGljZSIsCi0JCQkgICAgIFB5X1RZUEUodiktPnRwX25hbWUpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmIChpbG93IDwgMCkKLQkJaWxvdyA9IDA7Ci0JZWxzZSBpZiAoaWxvdyA+IFB5X1NJWkUoYSkpCi0JCWlsb3cgPSBQeV9TSVpFKGEpOwotCWlmIChpaGlnaCA8IDApCi0JCWloaWdoID0gMDsKLQlpZiAoaWhpZ2ggPCBpbG93KQotCQlpaGlnaCA9IGlsb3c7Ci0JZWxzZSBpZiAoaWhpZ2ggPiBQeV9TSVpFKGEpKQotCQlpaGlnaCA9IFB5X1NJWkUoYSk7Ci0JaXRlbSA9IGEtPm9iX2l0ZW07Ci0JZCA9IG4gLSAoaWhpZ2gtaWxvdyk7Ci0JaWYgKGQgPCAwKSB7IC8qIERlbGV0ZSAtZCBpdGVtcyAqLwotCQltZW1tb3ZlKGl0ZW0gKyAoaWhpZ2grZCkqYS0+b2JfZGVzY3ItPml0ZW1zaXplLAotCQkJaXRlbSArIGloaWdoKmEtPm9iX2Rlc2NyLT5pdGVtc2l6ZSwKLQkJCShQeV9TSVpFKGEpLWloaWdoKSphLT5vYl9kZXNjci0+aXRlbXNpemUpOwotCQlQeV9TSVpFKGEpICs9IGQ7Ci0JCVB5TWVtX1JFU0laRShpdGVtLCBjaGFyLCBQeV9TSVpFKGEpKmEtPm9iX2Rlc2NyLT5pdGVtc2l6ZSk7Ci0JCQkJCQkvKiBDYW4ndCBmYWlsICovCi0JCWEtPm9iX2l0ZW0gPSBpdGVtOwotCQlhLT5hbGxvY2F0ZWQgPSBQeV9TSVpFKGEpOwotCX0KLQllbHNlIGlmIChkID4gMCkgeyAvKiBJbnNlcnQgZCBpdGVtcyAqLwotCQlQeU1lbV9SRVNJWkUoaXRlbSwgY2hhciwKLQkJCSAgICAgKFB5X1NJWkUoYSkgKyBkKSphLT5vYl9kZXNjci0+aXRlbXNpemUpOwotCQlpZiAoaXRlbSA9PSBOVUxMKSB7Ci0JCQlQeUVycl9Ob01lbW9yeSgpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCW1lbW1vdmUoaXRlbSArIChpaGlnaCtkKSphLT5vYl9kZXNjci0+aXRlbXNpemUsCi0JCQlpdGVtICsgaWhpZ2gqYS0+b2JfZGVzY3ItPml0ZW1zaXplLAotCQkJKFB5X1NJWkUoYSktaWhpZ2gpKmEtPm9iX2Rlc2NyLT5pdGVtc2l6ZSk7Ci0JCWEtPm9iX2l0ZW0gPSBpdGVtOwotCQlQeV9TSVpFKGEpICs9IGQ7Ci0JCWEtPmFsbG9jYXRlZCA9IFB5X1NJWkUoYSk7Ci0JfQotCWlmIChuID4gMCkKLQkJbWVtY3B5KGl0ZW0gKyBpbG93KmEtPm9iX2Rlc2NyLT5pdGVtc2l6ZSwgYi0+b2JfaXRlbSwKLQkJICAgICAgIG4qYi0+b2JfZGVzY3ItPml0ZW1zaXplKTsKLQlyZXR1cm4gMDsKKyAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICBuID0gMDsKKyAgICBlbHNlIGlmIChhcnJheV9DaGVjayh2KSkgeworICAgICAgICBuID0gUHlfU0laRShiKTsKKyAgICAgICAgaWYgKGEgPT0gYikgeworICAgICAgICAgICAgLyogU3BlY2lhbCBjYXNlICJhW2k6al0gPSBhIiAtLSBjb3B5IGIgZmlyc3QgKi8KKyAgICAgICAgICAgIGludCByZXQ7CisgICAgICAgICAgICB2ID0gYXJyYXlfc2xpY2UoYiwgMCwgbik7CisgICAgICAgICAgICBpZiAoIXYpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgcmV0ID0gYXJyYXlfYXNzX3NsaWNlKGEsIGlsb3csIGloaWdoLCB2KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGItPm9iX2Rlc2NyICE9IGEtPm9iX2Rlc2NyKSB7CisgICAgICAgICAgICBQeUVycl9CYWRBcmd1bWVudCgpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgImNhbiBvbmx5IGFzc2lnbiBhcnJheSAobm90IFwiJS4yMDBzXCIpIHRvIGFycmF5IHNsaWNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeV9UWVBFKHYpLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoaWxvdyA8IDApCisgICAgICAgIGlsb3cgPSAwOworICAgIGVsc2UgaWYgKGlsb3cgPiBQeV9TSVpFKGEpKQorICAgICAgICBpbG93ID0gUHlfU0laRShhKTsKKyAgICBpZiAoaWhpZ2ggPCAwKQorICAgICAgICBpaGlnaCA9IDA7CisgICAgaWYgKGloaWdoIDwgaWxvdykKKyAgICAgICAgaWhpZ2ggPSBpbG93OworICAgIGVsc2UgaWYgKGloaWdoID4gUHlfU0laRShhKSkKKyAgICAgICAgaWhpZ2ggPSBQeV9TSVpFKGEpOworICAgIGl0ZW0gPSBhLT5vYl9pdGVtOworICAgIGQgPSBuIC0gKGloaWdoLWlsb3cpOworICAgIGlmIChkIDwgMCkgeyAvKiBEZWxldGUgLWQgaXRlbXMgKi8KKyAgICAgICAgbWVtbW92ZShpdGVtICsgKGloaWdoK2QpKmEtPm9iX2Rlc2NyLT5pdGVtc2l6ZSwKKyAgICAgICAgICAgIGl0ZW0gKyBpaGlnaCphLT5vYl9kZXNjci0+aXRlbXNpemUsCisgICAgICAgICAgICAoUHlfU0laRShhKS1paGlnaCkqYS0+b2JfZGVzY3ItPml0ZW1zaXplKTsKKyAgICAgICAgUHlfU0laRShhKSArPSBkOworICAgICAgICBQeU1lbV9SRVNJWkUoaXRlbSwgY2hhciwgUHlfU0laRShhKSphLT5vYl9kZXNjci0+aXRlbXNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENhbid0IGZhaWwgKi8KKyAgICAgICAgYS0+b2JfaXRlbSA9IGl0ZW07CisgICAgICAgIGEtPmFsbG9jYXRlZCA9IFB5X1NJWkUoYSk7CisgICAgfQorICAgIGVsc2UgaWYgKGQgPiAwKSB7IC8qIEluc2VydCBkIGl0ZW1zICovCisgICAgICAgIFB5TWVtX1JFU0laRShpdGVtLCBjaGFyLAorICAgICAgICAgICAgICAgICAgICAgKFB5X1NJWkUoYSkgKyBkKSphLT5vYl9kZXNjci0+aXRlbXNpemUpOworICAgICAgICBpZiAoaXRlbSA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIG1lbW1vdmUoaXRlbSArIChpaGlnaCtkKSphLT5vYl9kZXNjci0+aXRlbXNpemUsCisgICAgICAgICAgICBpdGVtICsgaWhpZ2gqYS0+b2JfZGVzY3ItPml0ZW1zaXplLAorICAgICAgICAgICAgKFB5X1NJWkUoYSktaWhpZ2gpKmEtPm9iX2Rlc2NyLT5pdGVtc2l6ZSk7CisgICAgICAgIGEtPm9iX2l0ZW0gPSBpdGVtOworICAgICAgICBQeV9TSVpFKGEpICs9IGQ7CisgICAgICAgIGEtPmFsbG9jYXRlZCA9IFB5X1NJWkUoYSk7CisgICAgfQorICAgIGlmIChuID4gMCkKKyAgICAgICAgbWVtY3B5KGl0ZW0gKyBpbG93KmEtPm9iX2Rlc2NyLT5pdGVtc2l6ZSwgYi0+b2JfaXRlbSwKKyAgICAgICAgICAgICAgIG4qYi0+b2JfZGVzY3ItPml0ZW1zaXplKTsKKyAgICByZXR1cm4gMDsKICN1bmRlZiBiCiB9CiAKIHN0YXRpYyBpbnQKIGFycmF5X2Fzc19pdGVtKGFycmF5b2JqZWN0ICphLCBQeV9zc2l6ZV90IGksIFB5T2JqZWN0ICp2KQogewotCWlmIChpIDwgMCB8fCBpID49IFB5X1NJWkUoYSkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsCi0JCQkgICAgICAgICAiYXJyYXkgYXNzaWdubWVudCBpbmRleCBvdXQgb2YgcmFuZ2UiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAodiA9PSBOVUxMKQotCQlyZXR1cm4gYXJyYXlfYXNzX3NsaWNlKGEsIGksIGkrMSwgdik7Ci0JcmV0dXJuICgqYS0+b2JfZGVzY3ItPnNldGl0ZW0pKGEsIGksIHYpOworICAgIGlmIChpIDwgMCB8fCBpID49IFB5X1NJWkUoYSkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgImFycmF5IGFzc2lnbm1lbnQgaW5kZXggb3V0IG9mIHJhbmdlIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKHYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIGFycmF5X2Fzc19zbGljZShhLCBpLCBpKzEsIHYpOworICAgIHJldHVybiAoKmEtPm9iX2Rlc2NyLT5zZXRpdGVtKShhLCBpLCB2KTsKIH0KIAogc3RhdGljIGludAogc2V0YXJyYXlpdGVtKFB5T2JqZWN0ICphLCBQeV9zc2l6ZV90IGksIFB5T2JqZWN0ICp2KQogewotCWFzc2VydChhcnJheV9DaGVjayhhKSk7Ci0JcmV0dXJuIGFycmF5X2Fzc19pdGVtKChhcnJheW9iamVjdCAqKWEsIGksIHYpOworICAgIGFzc2VydChhcnJheV9DaGVjayhhKSk7CisgICAgcmV0dXJuIGFycmF5X2Fzc19pdGVtKChhcnJheW9iamVjdCAqKWEsIGksIHYpOwogfQogCiBzdGF0aWMgaW50CiBhcnJheV9pdGVyX2V4dGVuZChhcnJheW9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmJiKQogewotCVB5T2JqZWN0ICppdCwgKnY7CisgICAgUHlPYmplY3QgKml0LCAqdjsKIAotCWl0ID0gUHlPYmplY3RfR2V0SXRlcihiYik7Ci0JaWYgKGl0ID09IE5VTEwpCi0JCXJldHVybiAtMTsKKyAgICBpdCA9IFB5T2JqZWN0X0dldEl0ZXIoYmIpOworICAgIGlmIChpdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CiAKLQl3aGlsZSAoKHYgPSBQeUl0ZXJfTmV4dChpdCkpICE9IE5VTEwpIHsKLQkJaWYgKGluczEoc2VsZiwgKGludCkgUHlfU0laRShzZWxmKSwgdikgIT0gMCkgewotCQkJUHlfREVDUkVGKHYpOwotCQkJUHlfREVDUkVGKGl0KTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlQeV9ERUNSRUYodik7Ci0JfQotCVB5X0RFQ1JFRihpdCk7Ci0JaWYgKFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiAtMTsKLQlyZXR1cm4gMDsKKyAgICB3aGlsZSAoKHYgPSBQeUl0ZXJfTmV4dChpdCkpICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKGluczEoc2VsZiwgKGludCkgUHlfU0laRShzZWxmKSwgdikgIT0gMCkgeworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgUHlfREVDUkVGKGl0KTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBQeV9ERUNSRUYodik7CisgICAgfQorICAgIFB5X0RFQ1JFRihpdCk7CisgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiAtMTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogYXJyYXlfZG9fZXh0ZW5kKGFycmF5b2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYmIpCiB7Ci0JUHlfc3NpemVfdCBzaXplOwotCWNoYXIgKm9sZF9pdGVtOworICAgIFB5X3NzaXplX3Qgc2l6ZTsKKyAgICBjaGFyICpvbGRfaXRlbTsKIAotCWlmICghYXJyYXlfQ2hlY2soYmIpKQotCQlyZXR1cm4gYXJyYXlfaXRlcl9leHRlbmQoc2VsZiwgYmIpOworICAgIGlmICghYXJyYXlfQ2hlY2soYmIpKQorICAgICAgICByZXR1cm4gYXJyYXlfaXRlcl9leHRlbmQoc2VsZiwgYmIpOwogI2RlZmluZSBiICgoYXJyYXlvYmplY3QgKiliYikKLQlpZiAoc2VsZi0+b2JfZGVzY3IgIT0gYi0+b2JfZGVzY3IpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAgImNhbiBvbmx5IGV4dGVuZCB3aXRoIGFycmF5IG9mIHNhbWUga2luZCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmICgoUHlfU0laRShzZWxmKSA+IFBZX1NTSVpFX1RfTUFYIC0gUHlfU0laRShiKSkgfHwKLQkJKChQeV9TSVpFKHNlbGYpICsgUHlfU0laRShiKSkgPiBQWV9TU0laRV9UX01BWCAvIHNlbGYtPm9iX2Rlc2NyLT5pdGVtc2l6ZSkpIHsKLQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlzaXplID0gUHlfU0laRShzZWxmKSArIFB5X1NJWkUoYik7Ci0Jb2xkX2l0ZW0gPSBzZWxmLT5vYl9pdGVtOwotICAgICAgICBQeU1lbV9SRVNJWkUoc2VsZi0+b2JfaXRlbSwgY2hhciwgc2l6ZSpzZWxmLT5vYl9kZXNjci0+aXRlbXNpemUpOwotICAgICAgICBpZiAoc2VsZi0+b2JfaXRlbSA9PSBOVUxMKSB7Ci0JCXNlbGYtPm9iX2l0ZW0gPSBvbGRfaXRlbTsKLQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJcmV0dXJuIC0xOwotICAgICAgICB9Ci0JbWVtY3B5KHNlbGYtPm9iX2l0ZW0gKyBQeV9TSVpFKHNlbGYpKnNlbGYtPm9iX2Rlc2NyLT5pdGVtc2l6ZSwKLSAgICAgICAgICAgICAgIGItPm9iX2l0ZW0sIFB5X1NJWkUoYikqYi0+b2JfZGVzY3ItPml0ZW1zaXplKTsKLQlQeV9TSVpFKHNlbGYpID0gc2l6ZTsKLQlzZWxmLT5hbGxvY2F0ZWQgPSBzaXplOworICAgIGlmIChzZWxmLT5vYl9kZXNjciAhPSBiLT5vYl9kZXNjcikgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgImNhbiBvbmx5IGV4dGVuZCB3aXRoIGFycmF5IG9mIHNhbWUga2luZCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICgoUHlfU0laRShzZWxmKSA+IFBZX1NTSVpFX1RfTUFYIC0gUHlfU0laRShiKSkgfHwKKyAgICAgICAgKChQeV9TSVpFKHNlbGYpICsgUHlfU0laRShiKSkgPiBQWV9TU0laRV9UX01BWCAvIHNlbGYtPm9iX2Rlc2NyLT5pdGVtc2l6ZSkpIHsKKyAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBzaXplID0gUHlfU0laRShzZWxmKSArIFB5X1NJWkUoYik7CisgICAgb2xkX2l0ZW0gPSBzZWxmLT5vYl9pdGVtOworICAgIFB5TWVtX1JFU0laRShzZWxmLT5vYl9pdGVtLCBjaGFyLCBzaXplKnNlbGYtPm9iX2Rlc2NyLT5pdGVtc2l6ZSk7CisgICAgaWYgKHNlbGYtPm9iX2l0ZW0gPT0gTlVMTCkgeworICAgICAgICBzZWxmLT5vYl9pdGVtID0gb2xkX2l0ZW07CisgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbWVtY3B5KHNlbGYtPm9iX2l0ZW0gKyBQeV9TSVpFKHNlbGYpKnNlbGYtPm9iX2Rlc2NyLT5pdGVtc2l6ZSwKKyAgICAgICAgICAgYi0+b2JfaXRlbSwgUHlfU0laRShiKSpiLT5vYl9kZXNjci0+aXRlbXNpemUpOworICAgIFB5X1NJWkUoc2VsZikgPSBzaXplOworICAgIHNlbGYtPmFsbG9jYXRlZCA9IHNpemU7CiAKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKICN1bmRlZiBiCiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhcnJheV9pbnBsYWNlX2NvbmNhdChhcnJheW9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmJiKQogewotCWlmICghYXJyYXlfQ2hlY2soYmIpKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkiY2FuIG9ubHkgZXh0ZW5kIGFycmF5IHdpdGggYXJyYXkgKG5vdCBcIiUuMjAwc1wiKSIsCi0JCQlQeV9UWVBFKGJiKS0+dHBfbmFtZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoYXJyYXlfZG9fZXh0ZW5kKHNlbGYsIGJiKSA9PSAtMSkKLQkJcmV0dXJuIE5VTEw7Ci0JUHlfSU5DUkVGKHNlbGYpOwotCXJldHVybiAoUHlPYmplY3QgKilzZWxmOworICAgIGlmICghYXJyYXlfQ2hlY2soYmIpKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAiY2FuIG9ubHkgZXh0ZW5kIGFycmF5IHdpdGggYXJyYXkgKG5vdCBcIiUuMjAwc1wiKSIsCisgICAgICAgICAgICBQeV9UWVBFKGJiKS0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoYXJyYXlfZG9fZXh0ZW5kKHNlbGYsIGJiKSA9PSAtMSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfSU5DUkVGKHNlbGYpOworICAgIHJldHVybiAoUHlPYmplY3QgKilzZWxmOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYXJyYXlfaW5wbGFjZV9yZXBlYXQoYXJyYXlvYmplY3QgKnNlbGYsIFB5X3NzaXplX3QgbikKIHsKLQljaGFyICppdGVtcywgKnA7Ci0JUHlfc3NpemVfdCBzaXplLCBpOworICAgIGNoYXIgKml0ZW1zLCAqcDsKKyAgICBQeV9zc2l6ZV90IHNpemUsIGk7CiAKLQlpZiAoUHlfU0laRShzZWxmKSA+IDApIHsKLQkJaWYgKG4gPCAwKQotCQkJbiA9IDA7Ci0JCWl0ZW1zID0gc2VsZi0+b2JfaXRlbTsKLQkJaWYgKChzZWxmLT5vYl9kZXNjci0+aXRlbXNpemUgIT0gMCkgJiYgCi0JCQkoUHlfU0laRShzZWxmKSA+IFBZX1NTSVpFX1RfTUFYIC8gc2VsZi0+b2JfZGVzY3ItPml0ZW1zaXplKSkgewotCQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JCX0KLQkJc2l6ZSA9IFB5X1NJWkUoc2VsZikgKiBzZWxmLT5vYl9kZXNjci0+aXRlbXNpemU7Ci0JCWlmIChuID09IDApIHsKLQkJCVB5TWVtX0ZSRUUoaXRlbXMpOwotCQkJc2VsZi0+b2JfaXRlbSA9IE5VTEw7Ci0JCQlQeV9TSVpFKHNlbGYpID0gMDsKLQkJCXNlbGYtPmFsbG9jYXRlZCA9IDA7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoc2l6ZSA+IFBZX1NTSVpFX1RfTUFYIC8gbikgewotCQkJCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCQkJfQotCQkJUHlNZW1fUkVTSVpFKGl0ZW1zLCBjaGFyLCBuICogc2l6ZSk7Ci0JCQlpZiAoaXRlbXMgPT0gTlVMTCkKLQkJCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQkJCXAgPSBpdGVtczsKLQkJCWZvciAoaSA9IDE7IGkgPCBuOyBpKyspIHsKLQkJCQlwICs9IHNpemU7Ci0JCQkJbWVtY3B5KHAsIGl0ZW1zLCBzaXplKTsKLQkJCX0KLQkJCXNlbGYtPm9iX2l0ZW0gPSBpdGVtczsKLQkJCVB5X1NJWkUoc2VsZikgKj0gbjsKLQkJCXNlbGYtPmFsbG9jYXRlZCA9IFB5X1NJWkUoc2VsZik7Ci0JCX0KLQl9Ci0JUHlfSU5DUkVGKHNlbGYpOwotCXJldHVybiAoUHlPYmplY3QgKilzZWxmOworICAgIGlmIChQeV9TSVpFKHNlbGYpID4gMCkgeworICAgICAgICBpZiAobiA8IDApCisgICAgICAgICAgICBuID0gMDsKKyAgICAgICAgaXRlbXMgPSBzZWxmLT5vYl9pdGVtOworICAgICAgICBpZiAoKHNlbGYtPm9iX2Rlc2NyLT5pdGVtc2l6ZSAhPSAwKSAmJgorICAgICAgICAgICAgKFB5X1NJWkUoc2VsZikgPiBQWV9TU0laRV9UX01BWCAvIHNlbGYtPm9iX2Rlc2NyLT5pdGVtc2l6ZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICB9CisgICAgICAgIHNpemUgPSBQeV9TSVpFKHNlbGYpICogc2VsZi0+b2JfZGVzY3ItPml0ZW1zaXplOworICAgICAgICBpZiAobiA9PSAwKSB7CisgICAgICAgICAgICBQeU1lbV9GUkVFKGl0ZW1zKTsKKyAgICAgICAgICAgIHNlbGYtPm9iX2l0ZW0gPSBOVUxMOworICAgICAgICAgICAgUHlfU0laRShzZWxmKSA9IDA7CisgICAgICAgICAgICBzZWxmLT5hbGxvY2F0ZWQgPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKHNpemUgPiBQWV9TU0laRV9UX01BWCAvIG4pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5TWVtX1JFU0laRShpdGVtcywgY2hhciwgbiAqIHNpemUpOworICAgICAgICAgICAgaWYgKGl0ZW1zID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgICAgICBwID0gaXRlbXM7CisgICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgcCArPSBzaXplOworICAgICAgICAgICAgICAgIG1lbWNweShwLCBpdGVtcywgc2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZWxmLT5vYl9pdGVtID0gaXRlbXM7CisgICAgICAgICAgICBQeV9TSVpFKHNlbGYpICo9IG47CisgICAgICAgICAgICBzZWxmLT5hbGxvY2F0ZWQgPSBQeV9TSVpFKHNlbGYpOworICAgICAgICB9CisgICAgfQorICAgIFB5X0lOQ1JFRihzZWxmKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKIH0KIAogCiBzdGF0aWMgUHlPYmplY3QgKgogaW5zKGFycmF5b2JqZWN0ICpzZWxmLCBQeV9zc2l6ZV90IHdoZXJlLCBQeU9iamVjdCAqdikKIHsKLQlpZiAoaW5zMShzZWxmLCB3aGVyZSwgdikgIT0gMCkKLQkJcmV0dXJuIE5VTEw7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGlmIChpbnMxKHNlbGYsIHdoZXJlLCB2KSAhPSAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhcnJheV9jb3VudChhcnJheW9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnYpCiB7Ci0JUHlfc3NpemVfdCBjb3VudCA9IDA7Ci0JUHlfc3NpemVfdCBpOworICAgIFB5X3NzaXplX3QgY291bnQgPSAwOworICAgIFB5X3NzaXplX3QgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBQeV9TSVpFKHNlbGYpOyBpKyspIHsKLQkJUHlPYmplY3QgKnNlbGZpID0gZ2V0YXJyYXlpdGVtKChQeU9iamVjdCAqKXNlbGYsIGkpOwotCQlpbnQgY21wID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKHNlbGZpLCB2LCBQeV9FUSk7Ci0JCVB5X0RFQ1JFRihzZWxmaSk7Ci0JCWlmIChjbXAgPiAwKQotCQkJY291bnQrKzsKLQkJZWxzZSBpZiAoY21wIDwgMCkKLQkJCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QoY291bnQpOworICAgIGZvciAoaSA9IDA7IGkgPCBQeV9TSVpFKHNlbGYpOyBpKyspIHsKKyAgICAgICAgUHlPYmplY3QgKnNlbGZpID0gZ2V0YXJyYXlpdGVtKChQeU9iamVjdCAqKXNlbGYsIGkpOworICAgICAgICBpbnQgY21wID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKHNlbGZpLCB2LCBQeV9FUSk7CisgICAgICAgIFB5X0RFQ1JFRihzZWxmaSk7CisgICAgICAgIGlmIChjbXAgPiAwKQorICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgZWxzZSBpZiAoY21wIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QoY291bnQpOwogfQogCiBQeURvY19TVFJWQVIoY291bnRfZG9jLApAQCAtOTQwLDIwICs5NDAsMjAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBhcnJheV9pbmRleChhcnJheW9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnYpCiB7Ci0JUHlfc3NpemVfdCBpOworICAgIFB5X3NzaXplX3QgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBQeV9TSVpFKHNlbGYpOyBpKyspIHsKLQkJUHlPYmplY3QgKnNlbGZpID0gZ2V0YXJyYXlpdGVtKChQeU9iamVjdCAqKXNlbGYsIGkpOwotCQlpbnQgY21wID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKHNlbGZpLCB2LCBQeV9FUSk7Ci0JCVB5X0RFQ1JFRihzZWxmaSk7Ci0JCWlmIChjbXAgPiAwKSB7Ci0JCQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpaSk7Ci0JCX0KLQkJZWxzZSBpZiAoY21wIDwgMCkKLQkJCXJldHVybiBOVUxMOwotCX0KLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImFycmF5LmluZGV4KHgpOiB4IG5vdCBpbiBsaXN0Iik7Ci0JcmV0dXJuIE5VTEw7CisgICAgZm9yIChpID0gMDsgaSA8IFB5X1NJWkUoc2VsZik7IGkrKykgeworICAgICAgICBQeU9iamVjdCAqc2VsZmkgPSBnZXRhcnJheWl0ZW0oKFB5T2JqZWN0ICopc2VsZiwgaSk7CisgICAgICAgIGludCBjbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woc2VsZmksIHYsIFB5X0VRKTsKKyAgICAgICAgUHlfREVDUkVGKHNlbGZpKTsKKyAgICAgICAgaWYgKGNtcCA+IDApIHsKKyAgICAgICAgICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZylpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChjbXAgPCAwKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiYXJyYXkuaW5kZXgoeCk6IHggbm90IGluIGxpc3QiKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogUHlEb2NfU1RSVkFSKGluZGV4X2RvYywKQEAgLTk2NCwzOCArOTY0LDM4IEBACiBzdGF0aWMgaW50CiBhcnJheV9jb250YWlucyhhcnJheW9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnYpCiB7Ci0JUHlfc3NpemVfdCBpOwotCWludCBjbXA7CisgICAgUHlfc3NpemVfdCBpOworICAgIGludCBjbXA7CiAKLQlmb3IgKGkgPSAwLCBjbXAgPSAwIDsgY21wID09IDAgJiYgaSA8IFB5X1NJWkUoc2VsZik7IGkrKykgewotCQlQeU9iamVjdCAqc2VsZmkgPSBnZXRhcnJheWl0ZW0oKFB5T2JqZWN0ICopc2VsZiwgaSk7Ci0JCWNtcCA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChzZWxmaSwgdiwgUHlfRVEpOwotCQlQeV9ERUNSRUYoc2VsZmkpOwotCX0KLQlyZXR1cm4gY21wOworICAgIGZvciAoaSA9IDAsIGNtcCA9IDAgOyBjbXAgPT0gMCAmJiBpIDwgUHlfU0laRShzZWxmKTsgaSsrKSB7CisgICAgICAgIFB5T2JqZWN0ICpzZWxmaSA9IGdldGFycmF5aXRlbSgoUHlPYmplY3QgKilzZWxmLCBpKTsKKyAgICAgICAgY21wID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKHNlbGZpLCB2LCBQeV9FUSk7CisgICAgICAgIFB5X0RFQ1JFRihzZWxmaSk7CisgICAgfQorICAgIHJldHVybiBjbXA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhcnJheV9yZW1vdmUoYXJyYXlvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp2KQogewotCWludCBpOworICAgIGludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IFB5X1NJWkUoc2VsZik7IGkrKykgewotCQlQeU9iamVjdCAqc2VsZmkgPSBnZXRhcnJheWl0ZW0oKFB5T2JqZWN0ICopc2VsZixpKTsKLQkJaW50IGNtcCA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChzZWxmaSwgdiwgUHlfRVEpOwotCQlQeV9ERUNSRUYoc2VsZmkpOwotCQlpZiAoY21wID4gMCkgewotCQkJaWYgKGFycmF5X2Fzc19zbGljZShzZWxmLCBpLCBpKzEsCi0JCQkJCSAgIChQeU9iamVjdCAqKU5VTEwpICE9IDApCi0JCQkJcmV0dXJuIE5VTEw7Ci0JCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCQlyZXR1cm4gUHlfTm9uZTsKLQkJfQotCQllbHNlIGlmIChjbXAgPCAwKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiYXJyYXkucmVtb3ZlKHgpOiB4IG5vdCBpbiBsaXN0Iik7Ci0JcmV0dXJuIE5VTEw7CisgICAgZm9yIChpID0gMDsgaSA8IFB5X1NJWkUoc2VsZik7IGkrKykgeworICAgICAgICBQeU9iamVjdCAqc2VsZmkgPSBnZXRhcnJheWl0ZW0oKFB5T2JqZWN0ICopc2VsZixpKTsKKyAgICAgICAgaW50IGNtcCA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChzZWxmaSwgdiwgUHlfRVEpOworICAgICAgICBQeV9ERUNSRUYoc2VsZmkpOworICAgICAgICBpZiAoY21wID4gMCkgeworICAgICAgICAgICAgaWYgKGFycmF5X2Fzc19zbGljZShzZWxmLCBpLCBpKzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFB5T2JqZWN0ICopTlVMTCkgIT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgICAgIHJldHVybiBQeV9Ob25lOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGNtcCA8IDApCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJhcnJheS5yZW1vdmUoeCk6IHggbm90IGluIGxpc3QiKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogUHlEb2NfU1RSVkFSKHJlbW92ZV9kb2MsCkBAIC0xMDA2LDI3ICsxMDA2LDI3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYXJyYXlfcG9wKGFycmF5b2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeV9zc2l6ZV90IGkgPSAtMTsKLQlQeU9iamVjdCAqdjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxuOnBvcCIsICZpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKFB5X1NJWkUoc2VsZikgPT0gMCkgewotCQkvKiBTcGVjaWFsLWNhc2UgbW9zdCBjb21tb24gZmFpbHVyZSBjYXVzZSAqLwotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwgInBvcCBmcm9tIGVtcHR5IGFycmF5Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoaSA8IDApCi0JCWkgKz0gUHlfU0laRShzZWxmKTsKLQlpZiAoaSA8IDAgfHwgaSA+PSBQeV9TSVpFKHNlbGYpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLCAicG9wIGluZGV4IG91dCBvZiByYW5nZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JdiA9IGdldGFycmF5aXRlbSgoUHlPYmplY3QgKilzZWxmLGkpOwotCWlmIChhcnJheV9hc3Nfc2xpY2Uoc2VsZiwgaSwgaSsxLCAoUHlPYmplY3QgKilOVUxMKSAhPSAwKSB7Ci0JCVB5X0RFQ1JFRih2KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiB2OworICAgIFB5X3NzaXplX3QgaSA9IC0xOworICAgIFB5T2JqZWN0ICp2OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifG46cG9wIiwgJmkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoUHlfU0laRShzZWxmKSA9PSAwKSB7CisgICAgICAgIC8qIFNwZWNpYWwtY2FzZSBtb3N0IGNvbW1vbiBmYWlsdXJlIGNhdXNlICovCisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLCAicG9wIGZyb20gZW1wdHkgYXJyYXkiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChpIDwgMCkKKyAgICAgICAgaSArPSBQeV9TSVpFKHNlbGYpOworICAgIGlmIChpIDwgMCB8fCBpID49IFB5X1NJWkUoc2VsZikpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsICJwb3AgaW5kZXggb3V0IG9mIHJhbmdlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICB2ID0gZ2V0YXJyYXlpdGVtKChQeU9iamVjdCAqKXNlbGYsaSk7CisgICAgaWYgKGFycmF5X2Fzc19zbGljZShzZWxmLCBpLCBpKzEsIChQeU9iamVjdCAqKU5VTEwpICE9IDApIHsKKyAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIHY7CiB9CiAKIFB5RG9jX1NUUlZBUihwb3BfZG9jLApAQCAtMTAzNywxMCArMTAzNywxMCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGFycmF5X2V4dGVuZChhcnJheW9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmJiKQogewotCWlmIChhcnJheV9kb19leHRlbmQoc2VsZiwgYmIpID09IC0xKQotCQlyZXR1cm4gTlVMTDsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKGFycmF5X2RvX2V4dGVuZChzZWxmLCBiYikgPT0gLTEpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogUHlEb2NfU1RSVkFSKGV4dGVuZF9kb2MsCkBAIC0xMDUxLDExICsxMDUxLDExIEBACiBzdGF0aWMgUHlPYmplY3QgKgogYXJyYXlfaW5zZXJ0KGFycmF5b2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeV9zc2l6ZV90IGk7Ci0JUHlPYmplY3QgKnY7Ci0gICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibk86aW5zZXJ0IiwgJmksICZ2KSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIGlucyhzZWxmLCBpLCB2KTsKKyAgICBQeV9zc2l6ZV90IGk7CisgICAgUHlPYmplY3QgKnY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJuTzppbnNlcnQiLCAmaSwgJnYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gaW5zKHNlbGYsIGksIHYpOwogfQogCiBQeURvY19TVFJWQVIoaW5zZXJ0X2RvYywKQEAgLTEwNjcsMTUgKzEwNjcsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBhcnJheV9idWZmZXJfaW5mbyhhcnJheW9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnVudXNlZCkKIHsKLQlQeU9iamVjdCogcmV0dmFsID0gTlVMTDsKLQlyZXR2YWwgPSBQeVR1cGxlX05ldygyKTsKLQlpZiAoIXJldHZhbCkKLQkJcmV0dXJuIE5VTEw7CisgICAgUHlPYmplY3QqIHJldHZhbCA9IE5VTEw7CisgICAgcmV0dmFsID0gUHlUdXBsZV9OZXcoMik7CisgICAgaWYgKCFyZXR2YWwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JUHlUdXBsZV9TRVRfSVRFTShyZXR2YWwsIDAsIFB5TG9uZ19Gcm9tVm9pZFB0cihzZWxmLT5vYl9pdGVtKSk7Ci0JUHlUdXBsZV9TRVRfSVRFTShyZXR2YWwsIDEsIFB5SW50X0Zyb21Mb25nKChsb25nKShQeV9TSVpFKHNlbGYpKSkpOworICAgIFB5VHVwbGVfU0VUX0lURU0ocmV0dmFsLCAwLCBQeUxvbmdfRnJvbVZvaWRQdHIoc2VsZi0+b2JfaXRlbSkpOworICAgIFB5VHVwbGVfU0VUX0lURU0ocmV0dmFsLCAxLCBQeUludF9Gcm9tTG9uZygobG9uZykoUHlfU0laRShzZWxmKSkpKTsKIAotCXJldHVybiByZXR2YWw7CisgICAgcmV0dXJuIHJldHZhbDsKIH0KIAogUHlEb2NfU1RSVkFSKGJ1ZmZlcl9pbmZvX2RvYywKQEAgLTEwOTAsNyArMTA5MCw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYXJyYXlfYXBwZW5kKGFycmF5b2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdikKIHsKLQlyZXR1cm4gaW5zKHNlbGYsIChpbnQpIFB5X1NJWkUoc2VsZiksIHYpOworICAgIHJldHVybiBpbnMoc2VsZiwgKGludCkgUHlfU0laRShzZWxmKSwgdik7CiB9CiAKIFB5RG9jX1NUUlZBUihhcHBlbmRfZG9jLApAQCAtMTEwMiw1MiArMTEwMiw1MiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGFycmF5X2J5dGVzd2FwKGFycmF5b2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdW51c2VkKQogewotCWNoYXIgKnA7Ci0JUHlfc3NpemVfdCBpOworICAgIGNoYXIgKnA7CisgICAgUHlfc3NpemVfdCBpOwogCi0Jc3dpdGNoIChzZWxmLT5vYl9kZXNjci0+aXRlbXNpemUpIHsKLQljYXNlIDE6Ci0JCWJyZWFrOwotCWNhc2UgMjoKLQkJZm9yIChwID0gc2VsZi0+b2JfaXRlbSwgaSA9IFB5X1NJWkUoc2VsZik7IC0taSA+PSAwOyBwICs9IDIpIHsKLQkJCWNoYXIgcDAgPSBwWzBdOwotCQkJcFswXSA9IHBbMV07Ci0JCQlwWzFdID0gcDA7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSA0OgotCQlmb3IgKHAgPSBzZWxmLT5vYl9pdGVtLCBpID0gUHlfU0laRShzZWxmKTsgLS1pID49IDA7IHAgKz0gNCkgewotCQkJY2hhciBwMCA9IHBbMF07Ci0JCQljaGFyIHAxID0gcFsxXTsKLQkJCXBbMF0gPSBwWzNdOwotCQkJcFsxXSA9IHBbMl07Ci0JCQlwWzJdID0gcDE7Ci0JCQlwWzNdID0gcDA7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSA4OgotCQlmb3IgKHAgPSBzZWxmLT5vYl9pdGVtLCBpID0gUHlfU0laRShzZWxmKTsgLS1pID49IDA7IHAgKz0gOCkgewotCQkJY2hhciBwMCA9IHBbMF07Ci0JCQljaGFyIHAxID0gcFsxXTsKLQkJCWNoYXIgcDIgPSBwWzJdOwotCQkJY2hhciBwMyA9IHBbM107Ci0JCQlwWzBdID0gcFs3XTsKLQkJCXBbMV0gPSBwWzZdOwotCQkJcFsyXSA9IHBbNV07Ci0JCQlwWzNdID0gcFs0XTsKLQkJCXBbNF0gPSBwMzsKLQkJCXBbNV0gPSBwMjsKLQkJCXBbNl0gPSBwMTsKLQkJCXBbN10gPSBwMDsKLQkJfQotCQlicmVhazsKLQlkZWZhdWx0OgotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAotCQkJICAgImRvbid0IGtub3cgaG93IHRvIGJ5dGVzd2FwIHRoaXMgYXJyYXkgdHlwZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHN3aXRjaCAoc2VsZi0+b2JfZGVzY3ItPml0ZW1zaXplKSB7CisgICAgY2FzZSAxOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICAgIGZvciAocCA9IHNlbGYtPm9iX2l0ZW0sIGkgPSBQeV9TSVpFKHNlbGYpOyAtLWkgPj0gMDsgcCArPSAyKSB7CisgICAgICAgICAgICBjaGFyIHAwID0gcFswXTsKKyAgICAgICAgICAgIHBbMF0gPSBwWzFdOworICAgICAgICAgICAgcFsxXSA9IHAwOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNDoKKyAgICAgICAgZm9yIChwID0gc2VsZi0+b2JfaXRlbSwgaSA9IFB5X1NJWkUoc2VsZik7IC0taSA+PSAwOyBwICs9IDQpIHsKKyAgICAgICAgICAgIGNoYXIgcDAgPSBwWzBdOworICAgICAgICAgICAgY2hhciBwMSA9IHBbMV07CisgICAgICAgICAgICBwWzBdID0gcFszXTsKKyAgICAgICAgICAgIHBbMV0gPSBwWzJdOworICAgICAgICAgICAgcFsyXSA9IHAxOworICAgICAgICAgICAgcFszXSA9IHAwOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgODoKKyAgICAgICAgZm9yIChwID0gc2VsZi0+b2JfaXRlbSwgaSA9IFB5X1NJWkUoc2VsZik7IC0taSA+PSAwOyBwICs9IDgpIHsKKyAgICAgICAgICAgIGNoYXIgcDAgPSBwWzBdOworICAgICAgICAgICAgY2hhciBwMSA9IHBbMV07CisgICAgICAgICAgICBjaGFyIHAyID0gcFsyXTsKKyAgICAgICAgICAgIGNoYXIgcDMgPSBwWzNdOworICAgICAgICAgICAgcFswXSA9IHBbN107CisgICAgICAgICAgICBwWzFdID0gcFs2XTsKKyAgICAgICAgICAgIHBbMl0gPSBwWzVdOworICAgICAgICAgICAgcFszXSA9IHBbNF07CisgICAgICAgICAgICBwWzRdID0gcDM7CisgICAgICAgICAgICBwWzVdID0gcDI7CisgICAgICAgICAgICBwWzZdID0gcDE7CisgICAgICAgICAgICBwWzddID0gcDA7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAiZG9uJ3Qga25vdyBob3cgdG8gYnl0ZXN3YXAgdGhpcyBhcnJheSB0eXBlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIFB5RG9jX1NUUlZBUihieXRlc3dhcF9kb2MsCkBAIC0xMTU5LDMzICsxMTU5LDMzIEBACiBzdGF0aWMgUHlPYmplY3QgKgogYXJyYXlfcmVkdWNlKGFycmF5b2JqZWN0ICphcnJheSkKIHsKLQlQeU9iamVjdCAqZGljdCwgKnJlc3VsdDsKKyAgICBQeU9iamVjdCAqZGljdCwgKnJlc3VsdDsKIAotCWRpY3QgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKChQeU9iamVjdCAqKWFycmF5LCAiX19kaWN0X18iKTsKLQlpZiAoZGljdCA9PSBOVUxMKSB7Ci0JCVB5RXJyX0NsZWFyKCk7Ci0JCWRpY3QgPSBQeV9Ob25lOwotCQlQeV9JTkNSRUYoZGljdCk7Ci0JfQotCWlmIChQeV9TSVpFKGFycmF5KSA+IDApIHsKLQkJaWYgKGFycmF5LT5vYl9kZXNjci0+aXRlbXNpemUgCi0JCQkJPiBQWV9TU0laRV9UX01BWCAvIGFycmF5LT5vYl9zaXplKSB7Ci0JCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQkJfQotCQlyZXN1bHQgPSBQeV9CdWlsZFZhbHVlKCJPKGNzIylPIiwgCi0JCQlQeV9UWVBFKGFycmF5KSwgCi0JCQlhcnJheS0+b2JfZGVzY3ItPnR5cGVjb2RlLAotCQkJYXJyYXktPm9iX2l0ZW0sCi0JCQlQeV9TSVpFKGFycmF5KSAqIGFycmF5LT5vYl9kZXNjci0+aXRlbXNpemUsCi0JCQlkaWN0KTsKLQl9IGVsc2UgewotCQlyZXN1bHQgPSBQeV9CdWlsZFZhbHVlKCJPKGMpTyIsIAotCQkJUHlfVFlQRShhcnJheSksIAotCQkJYXJyYXktPm9iX2Rlc2NyLT50eXBlY29kZSwKLQkJCWRpY3QpOwotCX0KLQlQeV9ERUNSRUYoZGljdCk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBkaWN0ID0gUHlPYmplY3RfR2V0QXR0clN0cmluZygoUHlPYmplY3QgKilhcnJheSwgIl9fZGljdF9fIik7CisgICAgaWYgKGRpY3QgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBkaWN0ID0gUHlfTm9uZTsKKyAgICAgICAgUHlfSU5DUkVGKGRpY3QpOworICAgIH0KKyAgICBpZiAoUHlfU0laRShhcnJheSkgPiAwKSB7CisgICAgICAgIGlmIChhcnJheS0+b2JfZGVzY3ItPml0ZW1zaXplCisgICAgICAgICAgICAgICAgICAgICAgICA+IFBZX1NTSVpFX1RfTUFYIC8gYXJyYXktPm9iX3NpemUpIHsKKyAgICAgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICB9CisgICAgICAgIHJlc3VsdCA9IFB5X0J1aWxkVmFsdWUoIk8oY3MjKU8iLAorICAgICAgICAgICAgUHlfVFlQRShhcnJheSksCisgICAgICAgICAgICBhcnJheS0+b2JfZGVzY3ItPnR5cGVjb2RlLAorICAgICAgICAgICAgYXJyYXktPm9iX2l0ZW0sCisgICAgICAgICAgICBQeV9TSVpFKGFycmF5KSAqIGFycmF5LT5vYl9kZXNjci0+aXRlbXNpemUsCisgICAgICAgICAgICBkaWN0KTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXN1bHQgPSBQeV9CdWlsZFZhbHVlKCJPKGMpTyIsCisgICAgICAgICAgICBQeV9UWVBFKGFycmF5KSwKKyAgICAgICAgICAgIGFycmF5LT5vYl9kZXNjci0+dHlwZWNvZGUsCisgICAgICAgICAgICBkaWN0KTsKKyAgICB9CisgICAgUHlfREVDUkVGKGRpY3QpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIFB5RG9jX1NUUlZBUihhcnJheV9kb2MsICJSZXR1cm4gc3RhdGUgaW5mb3JtYXRpb24gZm9yIHBpY2tsaW5nLiIpOwpAQCAtMTE5MywyOCArMTE5MywyOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGFycmF5X3JldmVyc2UoYXJyYXlvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp1bnVzZWQpCiB7Ci0JcmVnaXN0ZXIgUHlfc3NpemVfdCBpdGVtc2l6ZSA9IHNlbGYtPm9iX2Rlc2NyLT5pdGVtc2l6ZTsKLQlyZWdpc3RlciBjaGFyICpwLCAqcTsKLQkvKiBsaXR0bGUgYnVmZmVyIHRvIGhvbGQgaXRlbXMgd2hpbGUgc3dhcHBpbmcgKi8KLQljaGFyIHRtcFsyNTZdOwkvKiA4IGlzIHByb2JhYmx5IGVub3VnaCAtLSBidXQgd2h5IHNraW1wICovCi0JYXNzZXJ0KChzaXplX3QpaXRlbXNpemUgPD0gc2l6ZW9mKHRtcCkpOworICAgIHJlZ2lzdGVyIFB5X3NzaXplX3QgaXRlbXNpemUgPSBzZWxmLT5vYl9kZXNjci0+aXRlbXNpemU7CisgICAgcmVnaXN0ZXIgY2hhciAqcCwgKnE7CisgICAgLyogbGl0dGxlIGJ1ZmZlciB0byBob2xkIGl0ZW1zIHdoaWxlIHN3YXBwaW5nICovCisgICAgY2hhciB0bXBbMjU2XTsgICAgICAvKiA4IGlzIHByb2JhYmx5IGVub3VnaCAtLSBidXQgd2h5IHNraW1wICovCisgICAgYXNzZXJ0KChzaXplX3QpaXRlbXNpemUgPD0gc2l6ZW9mKHRtcCkpOwogCi0JaWYgKFB5X1NJWkUoc2VsZikgPiAxKSB7Ci0JCWZvciAocCA9IHNlbGYtPm9iX2l0ZW0sCi0JCSAgICAgcSA9IHNlbGYtPm9iX2l0ZW0gKyAoUHlfU0laRShzZWxmKSAtIDEpKml0ZW1zaXplOwotCQkgICAgIHAgPCBxOwotCQkgICAgIHAgKz0gaXRlbXNpemUsIHEgLT0gaXRlbXNpemUpIHsKLQkJCS8qIG1lbW9yeSBhcmVhcyBndWFyYW50ZWVkIGRpc2pvaW50LCBzbyBtZW1jcHkKLQkJCSAqIGlzIHNhZmUgKCYgbWVtbW92ZSBtYXkgYmUgc2xvd2VyKS4KLQkJCSAqLwotCQkJbWVtY3B5KHRtcCwgcCwgaXRlbXNpemUpOwotCQkJbWVtY3B5KHAsIHEsIGl0ZW1zaXplKTsKLQkJCW1lbWNweShxLCB0bXAsIGl0ZW1zaXplKTsKLQkJfQotCX0KKyAgICBpZiAoUHlfU0laRShzZWxmKSA+IDEpIHsKKyAgICAgICAgZm9yIChwID0gc2VsZi0+b2JfaXRlbSwKKyAgICAgICAgICAgICBxID0gc2VsZi0+b2JfaXRlbSArIChQeV9TSVpFKHNlbGYpIC0gMSkqaXRlbXNpemU7CisgICAgICAgICAgICAgcCA8IHE7CisgICAgICAgICAgICAgcCArPSBpdGVtc2l6ZSwgcSAtPSBpdGVtc2l6ZSkgeworICAgICAgICAgICAgLyogbWVtb3J5IGFyZWFzIGd1YXJhbnRlZWQgZGlzam9pbnQsIHNvIG1lbWNweQorICAgICAgICAgICAgICogaXMgc2FmZSAoJiBtZW1tb3ZlIG1heSBiZSBzbG93ZXIpLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBtZW1jcHkodG1wLCBwLCBpdGVtc2l6ZSk7CisgICAgICAgICAgICBtZW1jcHkocCwgcSwgaXRlbXNpemUpOworICAgICAgICAgICAgbWVtY3B5KHEsIHRtcCwgaXRlbXNpemUpOworICAgICAgICB9CisgICAgfQogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogUHlEb2NfU1RSVkFSKHJldmVyc2VfZG9jLApAQCAtMTIyNSw1MCArMTIyNSw1MCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGFycmF5X2Zyb21maWxlKGFycmF5b2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqZjsKLQlQeV9zc2l6ZV90IG47Ci0JRklMRSAqZnA7Ci0gICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT246ZnJvbWZpbGUiLCAmZiwgJm4pKQotCQlyZXR1cm4gTlVMTDsKLQlmcCA9IFB5RmlsZV9Bc0ZpbGUoZik7Ci0JaWYgKGZwID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImFyZzEgbXVzdCBiZSBvcGVuIGZpbGUiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChuID4gMCkgewotCQljaGFyICppdGVtID0gc2VsZi0+b2JfaXRlbTsKLQkJUHlfc3NpemVfdCBpdGVtc2l6ZSA9IHNlbGYtPm9iX2Rlc2NyLT5pdGVtc2l6ZTsKLQkJc2l6ZV90IG5yZWFkOwotCQlQeV9zc2l6ZV90IG5ld2xlbmd0aDsKLQkJc2l6ZV90IG5ld2J5dGVzOwotCQkvKiBCZSBjYXJlZnVsIGhlcmUgYWJvdXQgb3ZlcmZsb3cgKi8KLQkJaWYgKChuZXdsZW5ndGggPSBQeV9TSVpFKHNlbGYpICsgbikgPD0gMCB8fAotCQkgICAgKG5ld2J5dGVzID0gbmV3bGVuZ3RoICogaXRlbXNpemUpIC8gaXRlbXNpemUgIT0KLQkJICAgIChzaXplX3QpbmV3bGVuZ3RoKQotCQkJZ290byBub21lbTsKLQkJUHlNZW1fUkVTSVpFKGl0ZW0sIGNoYXIsIG5ld2J5dGVzKTsKLQkJaWYgKGl0ZW0gPT0gTlVMTCkgewotCQkgIG5vbWVtOgotCQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCXNlbGYtPm9iX2l0ZW0gPSBpdGVtOwotCQlQeV9TSVpFKHNlbGYpICs9IG47Ci0JCXNlbGYtPmFsbG9jYXRlZCA9IFB5X1NJWkUoc2VsZik7Ci0JCW5yZWFkID0gZnJlYWQoaXRlbSArIChQeV9TSVpFKHNlbGYpIC0gbikgKiBpdGVtc2l6ZSwKLQkJCSAgICAgIGl0ZW1zaXplLCBuLCBmcCk7Ci0JCWlmIChucmVhZCA8IChzaXplX3QpbikgewotCQkgIFB5X1NJWkUoc2VsZikgLT0gKG4gLSBucmVhZCk7Ci0JCQlQeU1lbV9SRVNJWkUoaXRlbSwgY2hhciwgUHlfU0laRShzZWxmKSppdGVtc2l6ZSk7Ci0JCQlzZWxmLT5vYl9pdGVtID0gaXRlbTsKLQkJCXNlbGYtPmFsbG9jYXRlZCA9IFB5X1NJWkUoc2VsZik7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfRU9GRXJyb3IsCi0JCQkJICAgICAgICAgIm5vdCBlbm91Z2ggaXRlbXMgaW4gZmlsZSIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5T2JqZWN0ICpmOworICAgIFB5X3NzaXplX3QgbjsKKyAgICBGSUxFICpmcDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9uOmZyb21maWxlIiwgJmYsICZuKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZnAgPSBQeUZpbGVfQXNGaWxlKGYpOworICAgIGlmIChmcCA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJhcmcxIG11c3QgYmUgb3BlbiBmaWxlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAobiA+IDApIHsKKyAgICAgICAgY2hhciAqaXRlbSA9IHNlbGYtPm9iX2l0ZW07CisgICAgICAgIFB5X3NzaXplX3QgaXRlbXNpemUgPSBzZWxmLT5vYl9kZXNjci0+aXRlbXNpemU7CisgICAgICAgIHNpemVfdCBucmVhZDsKKyAgICAgICAgUHlfc3NpemVfdCBuZXdsZW5ndGg7CisgICAgICAgIHNpemVfdCBuZXdieXRlczsKKyAgICAgICAgLyogQmUgY2FyZWZ1bCBoZXJlIGFib3V0IG92ZXJmbG93ICovCisgICAgICAgIGlmICgobmV3bGVuZ3RoID0gUHlfU0laRShzZWxmKSArIG4pIDw9IDAgfHwKKyAgICAgICAgICAgIChuZXdieXRlcyA9IG5ld2xlbmd0aCAqIGl0ZW1zaXplKSAvIGl0ZW1zaXplICE9CisgICAgICAgICAgICAoc2l6ZV90KW5ld2xlbmd0aCkKKyAgICAgICAgICAgIGdvdG8gbm9tZW07CisgICAgICAgIFB5TWVtX1JFU0laRShpdGVtLCBjaGFyLCBuZXdieXRlcyk7CisgICAgICAgIGlmIChpdGVtID09IE5VTEwpIHsKKyAgICAgICAgICBub21lbToKKyAgICAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBzZWxmLT5vYl9pdGVtID0gaXRlbTsKKyAgICAgICAgUHlfU0laRShzZWxmKSArPSBuOworICAgICAgICBzZWxmLT5hbGxvY2F0ZWQgPSBQeV9TSVpFKHNlbGYpOworICAgICAgICBucmVhZCA9IGZyZWFkKGl0ZW0gKyAoUHlfU0laRShzZWxmKSAtIG4pICogaXRlbXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgaXRlbXNpemUsIG4sIGZwKTsKKyAgICAgICAgaWYgKG5yZWFkIDwgKHNpemVfdCluKSB7CisgICAgICAgICAgUHlfU0laRShzZWxmKSAtPSAobiAtIG5yZWFkKTsKKyAgICAgICAgICAgIFB5TWVtX1JFU0laRShpdGVtLCBjaGFyLCBQeV9TSVpFKHNlbGYpKml0ZW1zaXplKTsKKyAgICAgICAgICAgIHNlbGYtPm9iX2l0ZW0gPSBpdGVtOworICAgICAgICAgICAgc2VsZi0+YWxsb2NhdGVkID0gUHlfU0laRShzZWxmKTsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19FT0ZFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vdCBlbm91Z2ggaXRlbXMgaW4gZmlsZSIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBQeURvY19TVFJWQVIoZnJvbWZpbGVfZG9jLApAQCAtMTI4MSwzMyArMTI4MSwzMyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGFycmF5X2Zyb21maWxlX2FzX3JlYWQoYXJyYXlvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWlmIChQeUVycl9XYXJuUHkzaygiYXJyYXkucmVhZCgpIG5vdCBzdXBwb3J0ZWQgaW4gMy54OyAiCi0JCQkgICAidXNlIGFycmF5LmZyb21maWxlKCkiLCAxKSA8IDApCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBhcnJheV9mcm9tZmlsZShzZWxmLCBhcmdzKTsKKyAgICBpZiAoUHlFcnJfV2FyblB5M2soImFycmF5LnJlYWQoKSBub3Qgc3VwcG9ydGVkIGluIDMueDsgIgorICAgICAgICAgICAgICAgICAgICAgICAidXNlIGFycmF5LmZyb21maWxlKCkiLCAxKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBhcnJheV9mcm9tZmlsZShzZWxmLCBhcmdzKTsKIH0KIAogCiBzdGF0aWMgUHlPYmplY3QgKgogYXJyYXlfdG9maWxlKGFycmF5b2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqZikKIHsKLQlGSUxFICpmcDsKKyAgICBGSUxFICpmcDsKIAotCWZwID0gUHlGaWxlX0FzRmlsZShmKTsKLQlpZiAoZnAgPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYXJnIG11c3QgYmUgb3BlbiBmaWxlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoc2VsZi0+b2Jfc2l6ZSA+IDApIHsKLQkJaWYgKGZ3cml0ZShzZWxmLT5vYl9pdGVtLCBzZWxmLT5vYl9kZXNjci0+aXRlbXNpemUsCi0JCQkgICBzZWxmLT5vYl9zaXplLCBmcCkgIT0gKHNpemVfdClzZWxmLT5vYl9zaXplKSB7Ci0JCQlQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7Ci0JCQljbGVhcmVycihmcCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZnAgPSBQeUZpbGVfQXNGaWxlKGYpOworICAgIGlmIChmcCA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJhcmcgbXVzdCBiZSBvcGVuIGZpbGUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChzZWxmLT5vYl9zaXplID4gMCkgeworICAgICAgICBpZiAoZndyaXRlKHNlbGYtPm9iX2l0ZW0sIHNlbGYtPm9iX2Rlc2NyLT5pdGVtc2l6ZSwKKyAgICAgICAgICAgICAgICAgICBzZWxmLT5vYl9zaXplLCBmcCkgIT0gKHNpemVfdClzZWxmLT5vYl9zaXplKSB7CisgICAgICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7CisgICAgICAgICAgICBjbGVhcmVycihmcCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIFB5RG9jX1NUUlZBUih0b2ZpbGVfZG9jLApAQCAtMTMyMCw1MyArMTMyMCw1MyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGFycmF5X3RvZmlsZV9hc193cml0ZShhcnJheW9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmYpCiB7Ci0JaWYgKFB5RXJyX1dhcm5QeTNrKCJhcnJheS53cml0ZSgpIG5vdCBzdXBwb3J0ZWQgaW4gMy54OyAiCi0JCQkgICAidXNlIGFycmF5LnRvZmlsZSgpIiwgMSkgPCAwKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gYXJyYXlfdG9maWxlKHNlbGYsIGYpOworICAgIGlmIChQeUVycl9XYXJuUHkzaygiYXJyYXkud3JpdGUoKSBub3Qgc3VwcG9ydGVkIGluIDMueDsgIgorICAgICAgICAgICAgICAgICAgICAgICAidXNlIGFycmF5LnRvZmlsZSgpIiwgMSkgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gYXJyYXlfdG9maWxlKHNlbGYsIGYpOwogfQogCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhcnJheV9mcm9tbGlzdChhcnJheW9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmxpc3QpCiB7Ci0JUHlfc3NpemVfdCBuOwotCVB5X3NzaXplX3QgaXRlbXNpemUgPSBzZWxmLT5vYl9kZXNjci0+aXRlbXNpemU7CisgICAgUHlfc3NpemVfdCBuOworICAgIFB5X3NzaXplX3QgaXRlbXNpemUgPSBzZWxmLT5vYl9kZXNjci0+aXRlbXNpemU7CiAKLQlpZiAoIVB5TGlzdF9DaGVjayhsaXN0KSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYXJnIG11c3QgYmUgbGlzdCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JbiA9IFB5TGlzdF9TaXplKGxpc3QpOwotCWlmIChuID4gMCkgewotCQljaGFyICppdGVtID0gc2VsZi0+b2JfaXRlbTsKLQkJUHlfc3NpemVfdCBpOwotCQlQeU1lbV9SRVNJWkUoaXRlbSwgY2hhciwgKFB5X1NJWkUoc2VsZikgKyBuKSAqIGl0ZW1zaXplKTsKLQkJaWYgKGl0ZW0gPT0gTlVMTCkgewotCQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCXNlbGYtPm9iX2l0ZW0gPSBpdGVtOwotCQlQeV9TSVpFKHNlbGYpICs9IG47Ci0JCXNlbGYtPmFsbG9jYXRlZCA9IFB5X1NJWkUoc2VsZik7Ci0JCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJCVB5T2JqZWN0ICp2ID0gUHlMaXN0X0dldEl0ZW0obGlzdCwgaSk7Ci0JCQlpZiAoKCpzZWxmLT5vYl9kZXNjci0+c2V0aXRlbSkoc2VsZiwKLQkJCQkJUHlfU0laRShzZWxmKSAtIG4gKyBpLCB2KSAhPSAwKSB7Ci0JCQkJUHlfU0laRShzZWxmKSAtPSBuOwotCQkJCWlmIChpdGVtc2l6ZSAmJiAoc2VsZi0+b2Jfc2l6ZSA+IFBZX1NTSVpFX1RfTUFYIC8gaXRlbXNpemUpKSB7Ci0JCQkJCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCQkJCX0KLQkJCQlQeU1lbV9SRVNJWkUoaXRlbSwgY2hhciwKLQkJCQkJICAgICAgICAgIFB5X1NJWkUoc2VsZikgKiBpdGVtc2l6ZSk7Ci0JCQkJc2VsZi0+b2JfaXRlbSA9IGl0ZW07Ci0JCQkJc2VsZi0+YWxsb2NhdGVkID0gUHlfU0laRShzZWxmKTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJfQotCX0KLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKCFQeUxpc3RfQ2hlY2sobGlzdCkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImFyZyBtdXN0IGJlIGxpc3QiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIG4gPSBQeUxpc3RfU2l6ZShsaXN0KTsKKyAgICBpZiAobiA+IDApIHsKKyAgICAgICAgY2hhciAqaXRlbSA9IHNlbGYtPm9iX2l0ZW07CisgICAgICAgIFB5X3NzaXplX3QgaTsKKyAgICAgICAgUHlNZW1fUkVTSVpFKGl0ZW0sIGNoYXIsIChQeV9TSVpFKHNlbGYpICsgbikgKiBpdGVtc2l6ZSk7CisgICAgICAgIGlmIChpdGVtID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBzZWxmLT5vYl9pdGVtID0gaXRlbTsKKyAgICAgICAgUHlfU0laRShzZWxmKSArPSBuOworICAgICAgICBzZWxmLT5hbGxvY2F0ZWQgPSBQeV9TSVpFKHNlbGYpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgICAgICBQeU9iamVjdCAqdiA9IFB5TGlzdF9HZXRJdGVtKGxpc3QsIGkpOworICAgICAgICAgICAgaWYgKCgqc2VsZi0+b2JfZGVzY3ItPnNldGl0ZW0pKHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfU0laRShzZWxmKSAtIG4gKyBpLCB2KSAhPSAwKSB7CisgICAgICAgICAgICAgICAgUHlfU0laRShzZWxmKSAtPSBuOworICAgICAgICAgICAgICAgIGlmIChpdGVtc2l6ZSAmJiAoc2VsZi0+b2Jfc2l6ZSA+IFBZX1NTSVpFX1RfTUFYIC8gaXRlbXNpemUpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBQeU1lbV9SRVNJWkUoaXRlbSwgY2hhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9TSVpFKHNlbGYpICogaXRlbXNpemUpOworICAgICAgICAgICAgICAgIHNlbGYtPm9iX2l0ZW0gPSBpdGVtOworICAgICAgICAgICAgICAgIHNlbGYtPmFsbG9jYXRlZCA9IFB5X1NJWkUoc2VsZik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBQeURvY19TVFJWQVIoZnJvbWxpc3RfZG9jLApAQCAtMTM3OCwyMCArMTM3OCwyMCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGFycmF5X3RvbGlzdChhcnJheW9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnVudXNlZCkKIHsKLQlQeU9iamVjdCAqbGlzdCA9IFB5TGlzdF9OZXcoUHlfU0laRShzZWxmKSk7Ci0JUHlfc3NpemVfdCBpOworICAgIFB5T2JqZWN0ICpsaXN0ID0gUHlMaXN0X05ldyhQeV9TSVpFKHNlbGYpKTsKKyAgICBQeV9zc2l6ZV90IGk7CiAKLQlpZiAobGlzdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlmb3IgKGkgPSAwOyBpIDwgUHlfU0laRShzZWxmKTsgaSsrKSB7Ci0JCVB5T2JqZWN0ICp2ID0gZ2V0YXJyYXlpdGVtKChQeU9iamVjdCAqKXNlbGYsIGkpOwotCQlpZiAodiA9PSBOVUxMKSB7Ci0JCQlQeV9ERUNSRUYobGlzdCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlQeUxpc3RfU2V0SXRlbShsaXN0LCBpLCB2KTsKLQl9Ci0JcmV0dXJuIGxpc3Q7CisgICAgaWYgKGxpc3QgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZm9yIChpID0gMDsgaSA8IFB5X1NJWkUoc2VsZik7IGkrKykgeworICAgICAgICBQeU9iamVjdCAqdiA9IGdldGFycmF5aXRlbSgoUHlPYmplY3QgKilzZWxmLCBpKTsKKyAgICAgICAgaWYgKHYgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKGxpc3QpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgUHlMaXN0X1NldEl0ZW0obGlzdCwgaSwgdik7CisgICAgfQorICAgIHJldHVybiBsaXN0OwogfQogCiBQeURvY19TVFJWQVIodG9saXN0X2RvYywKQEAgLTE0MDMsMzYgKzE0MDMsMzYgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBhcnJheV9mcm9tc3RyaW5nKGFycmF5b2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpzdHI7Ci0JUHlfc3NpemVfdCBuOwotCWludCBpdGVtc2l6ZSA9IHNlbGYtPm9iX2Rlc2NyLT5pdGVtc2l6ZTsKLSAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIzpmcm9tc3RyaW5nIiwgJnN0ciwgJm4pKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAobiAlIGl0ZW1zaXplICE9IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkgICAic3RyaW5nIGxlbmd0aCBub3QgYSBtdWx0aXBsZSBvZiBpdGVtIHNpemUiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCW4gPSBuIC8gaXRlbXNpemU7Ci0JaWYgKG4gPiAwKSB7Ci0JCWNoYXIgKml0ZW0gPSBzZWxmLT5vYl9pdGVtOwotCQlpZiAoKG4gPiBQWV9TU0laRV9UX01BWCAtIFB5X1NJWkUoc2VsZikpIHx8Ci0JCQkoKFB5X1NJWkUoc2VsZikgKyBuKSA+IFBZX1NTSVpFX1RfTUFYIC8gaXRlbXNpemUpKSB7Ci0JCQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JCX0KLQkJUHlNZW1fUkVTSVpFKGl0ZW0sIGNoYXIsIChQeV9TSVpFKHNlbGYpICsgbikgKiBpdGVtc2l6ZSk7Ci0JCWlmIChpdGVtID09IE5VTEwpIHsKLQkJCVB5RXJyX05vTWVtb3J5KCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlzZWxmLT5vYl9pdGVtID0gaXRlbTsKLQkJUHlfU0laRShzZWxmKSArPSBuOwotCQlzZWxmLT5hbGxvY2F0ZWQgPSBQeV9TSVpFKHNlbGYpOwotCQltZW1jcHkoaXRlbSArIChQeV9TSVpFKHNlbGYpIC0gbikgKiBpdGVtc2l6ZSwKLQkJICAgICAgIHN0ciwgaXRlbXNpemUqbik7Ci0JfQotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBjaGFyICpzdHI7CisgICAgUHlfc3NpemVfdCBuOworICAgIGludCBpdGVtc2l6ZSA9IHNlbGYtPm9iX2Rlc2NyLT5pdGVtc2l6ZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjOmZyb21zdHJpbmciLCAmc3RyLCAmbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChuICUgaXRlbXNpemUgIT0gMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAic3RyaW5nIGxlbmd0aCBub3QgYSBtdWx0aXBsZSBvZiBpdGVtIHNpemUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIG4gPSBuIC8gaXRlbXNpemU7CisgICAgaWYgKG4gPiAwKSB7CisgICAgICAgIGNoYXIgKml0ZW0gPSBzZWxmLT5vYl9pdGVtOworICAgICAgICBpZiAoKG4gPiBQWV9TU0laRV9UX01BWCAtIFB5X1NJWkUoc2VsZikpIHx8CisgICAgICAgICAgICAoKFB5X1NJWkUoc2VsZikgKyBuKSA+IFBZX1NTSVpFX1RfTUFYIC8gaXRlbXNpemUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIH0KKyAgICAgICAgUHlNZW1fUkVTSVpFKGl0ZW0sIGNoYXIsIChQeV9TSVpFKHNlbGYpICsgbikgKiBpdGVtc2l6ZSk7CisgICAgICAgIGlmIChpdGVtID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBzZWxmLT5vYl9pdGVtID0gaXRlbTsKKyAgICAgICAgUHlfU0laRShzZWxmKSArPSBuOworICAgICAgICBzZWxmLT5hbGxvY2F0ZWQgPSBQeV9TSVpFKHNlbGYpOworICAgICAgICBtZW1jcHkoaXRlbSArIChQeV9TSVpFKHNlbGYpIC0gbikgKiBpdGVtc2l6ZSwKKyAgICAgICAgICAgICAgIHN0ciwgaXRlbXNpemUqbik7CisgICAgfQorICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogUHlEb2NfU1RSVkFSKGZyb21zdHJpbmdfZG9jLApAQCAtMTQ0NSwxMiArMTQ0NSwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGFycmF5X3Rvc3RyaW5nKGFycmF5b2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdW51c2VkKQogewotCWlmIChzZWxmLT5vYl9zaXplIDw9IFBZX1NTSVpFX1RfTUFYIC8gc2VsZi0+b2JfZGVzY3ItPml0ZW1zaXplKSB7Ci0JCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzZWxmLT5vYl9pdGVtLAotCQkJCSAgICBQeV9TSVpFKHNlbGYpICogc2VsZi0+b2JfZGVzY3ItPml0ZW1zaXplKTsKLQl9IGVsc2UgewotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQl9CisgICAgaWYgKHNlbGYtPm9iX3NpemUgPD0gUFlfU1NJWkVfVF9NQVggLyBzZWxmLT5vYl9kZXNjci0+aXRlbXNpemUpIHsKKyAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHNlbGYtPm9iX2l0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfU0laRShzZWxmKSAqIHNlbGYtPm9iX2Rlc2NyLT5pdGVtc2l6ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgfQogfQogCiBQeURvY19TVFJWQVIodG9zdHJpbmdfZG9jLApAQCAtMTQ2NSwzNiArMTQ2NSwzNiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGFycmF5X2Zyb211bmljb2RlKGFycmF5b2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeV9VTklDT0RFICp1c3RyOwotCVB5X3NzaXplX3QgbjsKKyAgICBQeV9VTklDT0RFICp1c3RyOworICAgIFB5X3NzaXplX3QgbjsKIAotICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInUjOmZyb211bmljb2RlIiwgJnVzdHIsICZuKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKHNlbGYtPm9iX2Rlc2NyLT50eXBlY29kZSAhPSAndScpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkiZnJvbXVuaWNvZGUoKSBtYXkgb25seSBiZSBjYWxsZWQgb24gIgotCQkJInR5cGUgJ3UnIGFycmF5cyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKG4gPiAwKSB7Ci0JCVB5X1VOSUNPREUgKml0ZW0gPSAoUHlfVU5JQ09ERSAqKSBzZWxmLT5vYl9pdGVtOwotCQlpZiAoUHlfU0laRShzZWxmKSA+IFBZX1NTSVpFX1RfTUFYIC0gbikgewotCQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JCX0KLQkJUHlNZW1fUkVTSVpFKGl0ZW0sIFB5X1VOSUNPREUsIFB5X1NJWkUoc2VsZikgKyBuKTsKLQkJaWYgKGl0ZW0gPT0gTlVMTCkgewotCQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCXNlbGYtPm9iX2l0ZW0gPSAoY2hhciAqKSBpdGVtOwotCQlQeV9TSVpFKHNlbGYpICs9IG47Ci0JCXNlbGYtPmFsbG9jYXRlZCA9IFB5X1NJWkUoc2VsZik7Ci0JCW1lbWNweShpdGVtICsgUHlfU0laRShzZWxmKSAtIG4sCi0JCSAgICAgICB1c3RyLCBuICogc2l6ZW9mKFB5X1VOSUNPREUpKTsKLQl9CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ1Izpmcm9tdW5pY29kZSIsICZ1c3RyLCAmbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChzZWxmLT5vYl9kZXNjci0+dHlwZWNvZGUgIT0gJ3UnKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgImZyb211bmljb2RlKCkgbWF5IG9ubHkgYmUgY2FsbGVkIG9uICIKKyAgICAgICAgICAgICJ0eXBlICd1JyBhcnJheXMiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChuID4gMCkgeworICAgICAgICBQeV9VTklDT0RFICppdGVtID0gKFB5X1VOSUNPREUgKikgc2VsZi0+b2JfaXRlbTsKKyAgICAgICAgaWYgKFB5X1NJWkUoc2VsZikgPiBQWV9TU0laRV9UX01BWCAtIG4pIHsKKyAgICAgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICB9CisgICAgICAgIFB5TWVtX1JFU0laRShpdGVtLCBQeV9VTklDT0RFLCBQeV9TSVpFKHNlbGYpICsgbik7CisgICAgICAgIGlmIChpdGVtID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBzZWxmLT5vYl9pdGVtID0gKGNoYXIgKikgaXRlbTsKKyAgICAgICAgUHlfU0laRShzZWxmKSArPSBuOworICAgICAgICBzZWxmLT5hbGxvY2F0ZWQgPSBQeV9TSVpFKHNlbGYpOworICAgICAgICBtZW1jcHkoaXRlbSArIFB5X1NJWkUoc2VsZikgLSBuLAorICAgICAgICAgICAgICAgdXN0ciwgbiAqIHNpemVvZihQeV9VTklDT0RFKSk7CisgICAgfQogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogUHlEb2NfU1RSVkFSKGZyb211bmljb2RlX2RvYywKQEAgLTE1MDksMTIgKzE1MDksMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBhcnJheV90b3VuaWNvZGUoYXJyYXlvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp1bnVzZWQpCiB7Ci0JaWYgKHNlbGYtPm9iX2Rlc2NyLT50eXBlY29kZSAhPSAndScpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkidG91bmljb2RlKCkgbWF5IG9ubHkgYmUgY2FsbGVkIG9uIHR5cGUgJ3UnIGFycmF5cyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIFB5VW5pY29kZV9Gcm9tVW5pY29kZSgoUHlfVU5JQ09ERSAqKSBzZWxmLT5vYl9pdGVtLCBQeV9TSVpFKHNlbGYpKTsKKyAgICBpZiAoc2VsZi0+b2JfZGVzY3ItPnR5cGVjb2RlICE9ICd1JykgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICJ0b3VuaWNvZGUoKSBtYXkgb25seSBiZSBjYWxsZWQgb24gdHlwZSAndScgYXJyYXlzIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlVbmljb2RlX0Zyb21Vbmljb2RlKChQeV9VTklDT0RFICopIHNlbGYtPm9iX2l0ZW0sIFB5X1NJWkUoc2VsZikpOwogfQogCiBQeURvY19TVFJWQVIodG91bmljb2RlX2RvYywKQEAgLTE1MzEsMzIxICsxNTMxLDMyMSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGFycmF5X2dldF90eXBlY29kZShhcnJheW9iamVjdCAqYSwgdm9pZCAqY2xvc3VyZSkKIHsKLQljaGFyIHRjID0gYS0+b2JfZGVzY3ItPnR5cGVjb2RlOwotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgmdGMsIDEpOworICAgIGNoYXIgdGMgPSBhLT5vYl9kZXNjci0+dHlwZWNvZGU7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKCZ0YywgMSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhcnJheV9nZXRfaXRlbXNpemUoYXJyYXlvYmplY3QgKmEsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKWEtPm9iX2Rlc2NyLT5pdGVtc2l6ZSk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKWEtPm9iX2Rlc2NyLT5pdGVtc2l6ZSk7CiB9CiAKIHN0YXRpYyBQeUdldFNldERlZiBhcnJheV9nZXRzZXRzIFtdID0gewotCXsidHlwZWNvZGUiLCAoZ2V0dGVyKSBhcnJheV9nZXRfdHlwZWNvZGUsIE5VTEwsCi0JICJ0aGUgdHlwZWNvZGUgY2hhcmFjdGVyIHVzZWQgdG8gY3JlYXRlIHRoZSBhcnJheSJ9LAotCXsiaXRlbXNpemUiLCAoZ2V0dGVyKSBhcnJheV9nZXRfaXRlbXNpemUsIE5VTEwsCi0JICJ0aGUgc2l6ZSwgaW4gYnl0ZXMsIG9mIG9uZSBhcnJheSBpdGVtIn0sCi0Je05VTEx9CisgICAgeyJ0eXBlY29kZSIsIChnZXR0ZXIpIGFycmF5X2dldF90eXBlY29kZSwgTlVMTCwKKyAgICAgInRoZSB0eXBlY29kZSBjaGFyYWN0ZXIgdXNlZCB0byBjcmVhdGUgdGhlIGFycmF5In0sCisgICAgeyJpdGVtc2l6ZSIsIChnZXR0ZXIpIGFycmF5X2dldF9pdGVtc2l6ZSwgTlVMTCwKKyAgICAgInRoZSBzaXplLCBpbiBieXRlcywgb2Ygb25lIGFycmF5IGl0ZW0ifSwKKyAgICB7TlVMTH0KIH07CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBhcnJheV9tZXRob2RzW10gPSB7Ci0JeyJhcHBlbmQiLAkoUHlDRnVuY3Rpb24pYXJyYXlfYXBwZW5kLAlNRVRIX08sCi0JIGFwcGVuZF9kb2N9LAotCXsiYnVmZmVyX2luZm8iLCAoUHlDRnVuY3Rpb24pYXJyYXlfYnVmZmVyX2luZm8sIE1FVEhfTk9BUkdTLAotCSBidWZmZXJfaW5mb19kb2N9LAotCXsiYnl0ZXN3YXAiLAkoUHlDRnVuY3Rpb24pYXJyYXlfYnl0ZXN3YXAsCU1FVEhfTk9BUkdTLAotCSBieXRlc3dhcF9kb2N9LAotCXsiX19jb3B5X18iLAkoUHlDRnVuY3Rpb24pYXJyYXlfY29weSwJTUVUSF9OT0FSR1MsCi0JIGNvcHlfZG9jfSwKLQl7ImNvdW50IiwJKFB5Q0Z1bmN0aW9uKWFycmF5X2NvdW50LAlNRVRIX08sCi0JIGNvdW50X2RvY30sCi0JeyJfX2RlZXBjb3B5X18iLChQeUNGdW5jdGlvbilhcnJheV9jb3B5LAlNRVRIX08sCi0JIGNvcHlfZG9jfSwKLQl7ImV4dGVuZCIsICAgICAgKFB5Q0Z1bmN0aW9uKWFycmF5X2V4dGVuZCwJTUVUSF9PLAotCSBleHRlbmRfZG9jfSwKLQl7ImZyb21maWxlIiwJKFB5Q0Z1bmN0aW9uKWFycmF5X2Zyb21maWxlLAlNRVRIX1ZBUkFSR1MsCi0JIGZyb21maWxlX2RvY30sCi0JeyJmcm9tbGlzdCIsCShQeUNGdW5jdGlvbilhcnJheV9mcm9tbGlzdCwJTUVUSF9PLAotCSBmcm9tbGlzdF9kb2N9LAotCXsiZnJvbXN0cmluZyIsCShQeUNGdW5jdGlvbilhcnJheV9mcm9tc3RyaW5nLAlNRVRIX1ZBUkFSR1MsCi0JIGZyb21zdHJpbmdfZG9jfSwKKyAgICB7ImFwcGVuZCIsICAgICAgICAgIChQeUNGdW5jdGlvbilhcnJheV9hcHBlbmQsICAgICAgTUVUSF9PLAorICAgICBhcHBlbmRfZG9jfSwKKyAgICB7ImJ1ZmZlcl9pbmZvIiwgKFB5Q0Z1bmN0aW9uKWFycmF5X2J1ZmZlcl9pbmZvLCBNRVRIX05PQVJHUywKKyAgICAgYnVmZmVyX2luZm9fZG9jfSwKKyAgICB7ImJ5dGVzd2FwIiwgICAgICAgIChQeUNGdW5jdGlvbilhcnJheV9ieXRlc3dhcCwgICAgTUVUSF9OT0FSR1MsCisgICAgIGJ5dGVzd2FwX2RvY30sCisgICAgeyJfX2NvcHlfXyIsICAgICAgICAoUHlDRnVuY3Rpb24pYXJyYXlfY29weSwgICAgICAgIE1FVEhfTk9BUkdTLAorICAgICBjb3B5X2RvY30sCisgICAgeyJjb3VudCIsICAgICAgICAgICAoUHlDRnVuY3Rpb24pYXJyYXlfY291bnQsICAgICAgIE1FVEhfTywKKyAgICAgY291bnRfZG9jfSwKKyAgICB7Il9fZGVlcGNvcHlfXyIsKFB5Q0Z1bmN0aW9uKWFycmF5X2NvcHksICAgICAgICAgICAgTUVUSF9PLAorICAgICBjb3B5X2RvY30sCisgICAgeyJleHRlbmQiLCAgICAgIChQeUNGdW5jdGlvbilhcnJheV9leHRlbmQsICAgICAgICAgIE1FVEhfTywKKyAgICAgZXh0ZW5kX2RvY30sCisgICAgeyJmcm9tZmlsZSIsICAgICAgICAoUHlDRnVuY3Rpb24pYXJyYXlfZnJvbWZpbGUsICAgIE1FVEhfVkFSQVJHUywKKyAgICAgZnJvbWZpbGVfZG9jfSwKKyAgICB7ImZyb21saXN0IiwgICAgICAgIChQeUNGdW5jdGlvbilhcnJheV9mcm9tbGlzdCwgICAgTUVUSF9PLAorICAgICBmcm9tbGlzdF9kb2N9LAorICAgIHsiZnJvbXN0cmluZyIsICAgICAgKFB5Q0Z1bmN0aW9uKWFycmF5X2Zyb21zdHJpbmcsICBNRVRIX1ZBUkFSR1MsCisgICAgIGZyb21zdHJpbmdfZG9jfSwKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JeyJmcm9tdW5pY29kZSIsCShQeUNGdW5jdGlvbilhcnJheV9mcm9tdW5pY29kZSwJTUVUSF9WQVJBUkdTLAotCSBmcm9tdW5pY29kZV9kb2N9LAorICAgIHsiZnJvbXVuaWNvZGUiLCAgICAgKFB5Q0Z1bmN0aW9uKWFycmF5X2Zyb211bmljb2RlLCBNRVRIX1ZBUkFSR1MsCisgICAgIGZyb211bmljb2RlX2RvY30sCiAjZW5kaWYKLQl7ImluZGV4IiwJKFB5Q0Z1bmN0aW9uKWFycmF5X2luZGV4LAlNRVRIX08sCi0JIGluZGV4X2RvY30sCi0JeyJpbnNlcnQiLAkoUHlDRnVuY3Rpb24pYXJyYXlfaW5zZXJ0LAlNRVRIX1ZBUkFSR1MsCi0JIGluc2VydF9kb2N9LAotCXsicG9wIiwJCShQeUNGdW5jdGlvbilhcnJheV9wb3AsCQlNRVRIX1ZBUkFSR1MsCi0JIHBvcF9kb2N9LAotCXsicmVhZCIsCShQeUNGdW5jdGlvbilhcnJheV9mcm9tZmlsZV9hc19yZWFkLAlNRVRIX1ZBUkFSR1MsCi0JIGZyb21maWxlX2RvY30sCi0JeyJfX3JlZHVjZV9fIiwJKFB5Q0Z1bmN0aW9uKWFycmF5X3JlZHVjZSwJTUVUSF9OT0FSR1MsCi0JIGFycmF5X2RvY30sCi0JeyJyZW1vdmUiLAkoUHlDRnVuY3Rpb24pYXJyYXlfcmVtb3ZlLAlNRVRIX08sCi0JIHJlbW92ZV9kb2N9LAotCXsicmV2ZXJzZSIsCShQeUNGdW5jdGlvbilhcnJheV9yZXZlcnNlLAlNRVRIX05PQVJHUywKLQkgcmV2ZXJzZV9kb2N9LAotLyoJeyJzb3J0IiwJKFB5Q0Z1bmN0aW9uKWFycmF5X3NvcnQsCU1FVEhfVkFSQVJHUywKLQlzb3J0X2RvY30sKi8KLQl7InRvZmlsZSIsCShQeUNGdW5jdGlvbilhcnJheV90b2ZpbGUsCU1FVEhfTywKLQkgdG9maWxlX2RvY30sCi0JeyJ0b2xpc3QiLAkoUHlDRnVuY3Rpb24pYXJyYXlfdG9saXN0LAlNRVRIX05PQVJHUywKLQkgdG9saXN0X2RvY30sCi0JeyJ0b3N0cmluZyIsCShQeUNGdW5jdGlvbilhcnJheV90b3N0cmluZywJTUVUSF9OT0FSR1MsCi0JIHRvc3RyaW5nX2RvY30sCisgICAgeyJpbmRleCIsICAgICAgICAgICAoUHlDRnVuY3Rpb24pYXJyYXlfaW5kZXgsICAgICAgIE1FVEhfTywKKyAgICAgaW5kZXhfZG9jfSwKKyAgICB7Imluc2VydCIsICAgICAgICAgIChQeUNGdW5jdGlvbilhcnJheV9pbnNlcnQsICAgICAgTUVUSF9WQVJBUkdTLAorICAgICBpbnNlcnRfZG9jfSwKKyAgICB7InBvcCIsICAgICAgICAgICAgIChQeUNGdW5jdGlvbilhcnJheV9wb3AsICAgICAgICAgTUVUSF9WQVJBUkdTLAorICAgICBwb3BfZG9jfSwKKyAgICB7InJlYWQiLCAgICAgICAgICAgIChQeUNGdW5jdGlvbilhcnJheV9mcm9tZmlsZV9hc19yZWFkLCAgICBNRVRIX1ZBUkFSR1MsCisgICAgIGZyb21maWxlX2RvY30sCisgICAgeyJfX3JlZHVjZV9fIiwgICAgICAoUHlDRnVuY3Rpb24pYXJyYXlfcmVkdWNlLCAgICAgIE1FVEhfTk9BUkdTLAorICAgICBhcnJheV9kb2N9LAorICAgIHsicmVtb3ZlIiwgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWFycmF5X3JlbW92ZSwgICAgICBNRVRIX08sCisgICAgIHJlbW92ZV9kb2N9LAorICAgIHsicmV2ZXJzZSIsICAgICAgICAgKFB5Q0Z1bmN0aW9uKWFycmF5X3JldmVyc2UsICAgICBNRVRIX05PQVJHUywKKyAgICAgcmV2ZXJzZV9kb2N9LAorLyogICAgICB7InNvcnQiLCAgICAgICAgKFB5Q0Z1bmN0aW9uKWFycmF5X3NvcnQsICAgICAgICBNRVRIX1ZBUkFSR1MsCisgICAgc29ydF9kb2N9LCovCisgICAgeyJ0b2ZpbGUiLCAgICAgICAgICAoUHlDRnVuY3Rpb24pYXJyYXlfdG9maWxlLCAgICAgIE1FVEhfTywKKyAgICAgdG9maWxlX2RvY30sCisgICAgeyJ0b2xpc3QiLCAgICAgICAgICAoUHlDRnVuY3Rpb24pYXJyYXlfdG9saXN0LCAgICAgIE1FVEhfTk9BUkdTLAorICAgICB0b2xpc3RfZG9jfSwKKyAgICB7InRvc3RyaW5nIiwgICAgICAgIChQeUNGdW5jdGlvbilhcnJheV90b3N0cmluZywgICAgTUVUSF9OT0FSR1MsCisgICAgIHRvc3RyaW5nX2RvY30sCiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCXsidG91bmljb2RlIiwgICAoUHlDRnVuY3Rpb24pYXJyYXlfdG91bmljb2RlLAlNRVRIX05PQVJHUywKLQkgdG91bmljb2RlX2RvY30sCisgICAgeyJ0b3VuaWNvZGUiLCAgIChQeUNGdW5jdGlvbilhcnJheV90b3VuaWNvZGUsICAgICAgIE1FVEhfTk9BUkdTLAorICAgICB0b3VuaWNvZGVfZG9jfSwKICNlbmRpZgotCXsid3JpdGUiLAkoUHlDRnVuY3Rpb24pYXJyYXlfdG9maWxlX2FzX3dyaXRlLAlNRVRIX08sCi0JIHRvZmlsZV9kb2N9LAotCXtOVUxMLAkJTlVMTH0JCS8qIHNlbnRpbmVsICovCisgICAgeyJ3cml0ZSIsICAgICAgICAgICAoUHlDRnVuY3Rpb24pYXJyYXlfdG9maWxlX2FzX3dyaXRlLCAgICAgTUVUSF9PLAorICAgICB0b2ZpbGVfZG9jfSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIGFycmF5X3JlcHIoYXJyYXlvYmplY3QgKmEpCiB7Ci0JY2hhciBidWZbMjU2XSwgdHlwZWNvZGU7Ci0JUHlPYmplY3QgKnMsICp0LCAqdiA9IE5VTEw7Ci0JUHlfc3NpemVfdCBsZW47CisgICAgY2hhciBidWZbMjU2XSwgdHlwZWNvZGU7CisgICAgUHlPYmplY3QgKnMsICp0LCAqdiA9IE5VTEw7CisgICAgUHlfc3NpemVfdCBsZW47CiAKLQlsZW4gPSBQeV9TSVpFKGEpOwotCXR5cGVjb2RlID0gYS0+b2JfZGVzY3ItPnR5cGVjb2RlOwotCWlmIChsZW4gPT0gMCkgewotCQlQeU9TX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJhcnJheSgnJWMnKSIsIHR5cGVjb2RlKTsKLQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmKTsKLQl9Ci0JCQotCWlmICh0eXBlY29kZSA9PSAnYycpCi0JCXYgPSBhcnJheV90b3N0cmluZyhhLCBOVUxMKTsKKyAgICBsZW4gPSBQeV9TSVpFKGEpOworICAgIHR5cGVjb2RlID0gYS0+b2JfZGVzY3ItPnR5cGVjb2RlOworICAgIGlmIChsZW4gPT0gMCkgeworICAgICAgICBQeU9TX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJhcnJheSgnJWMnKSIsIHR5cGVjb2RlKTsKKyAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmKTsKKyAgICB9CisKKyAgICBpZiAodHlwZWNvZGUgPT0gJ2MnKQorICAgICAgICB2ID0gYXJyYXlfdG9zdHJpbmcoYSwgTlVMTCk7CiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCWVsc2UgaWYgKHR5cGVjb2RlID09ICd1JykKLQkJdiA9IGFycmF5X3RvdW5pY29kZShhLCBOVUxMKTsKKyAgICBlbHNlIGlmICh0eXBlY29kZSA9PSAndScpCisgICAgICAgIHYgPSBhcnJheV90b3VuaWNvZGUoYSwgTlVMTCk7CiAjZW5kaWYKLQllbHNlCi0JCXYgPSBhcnJheV90b2xpc3QoYSwgTlVMTCk7Ci0JdCA9IFB5T2JqZWN0X1JlcHIodik7Ci0JUHlfWERFQ1JFRih2KTsKKyAgICBlbHNlCisgICAgICAgIHYgPSBhcnJheV90b2xpc3QoYSwgTlVMTCk7CisgICAgdCA9IFB5T2JqZWN0X1JlcHIodik7CisgICAgUHlfWERFQ1JFRih2KTsKIAotCVB5T1Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgImFycmF5KCclYycsICIsIHR5cGVjb2RlKTsKLQlzID0gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOwotCVB5U3RyaW5nX0NvbmNhdEFuZERlbCgmcywgdCk7Ci0JUHlTdHJpbmdfQ29uY2F0QW5kRGVsKCZzLCBQeVN0cmluZ19Gcm9tU3RyaW5nKCIpIikpOwotCXJldHVybiBzOworICAgIFB5T1Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgImFycmF5KCclYycsICIsIHR5cGVjb2RlKTsKKyAgICBzID0gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOworICAgIFB5U3RyaW5nX0NvbmNhdEFuZERlbCgmcywgdCk7CisgICAgUHlTdHJpbmdfQ29uY2F0QW5kRGVsKCZzLCBQeVN0cmluZ19Gcm9tU3RyaW5nKCIpIikpOworICAgIHJldHVybiBzOwogfQogCiBzdGF0aWMgUHlPYmplY3QqCiBhcnJheV9zdWJzY3IoYXJyYXlvYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBpdGVtKQogewotCWlmIChQeUluZGV4X0NoZWNrKGl0ZW0pKSB7Ci0JCVB5X3NzaXplX3QgaSA9IFB5TnVtYmVyX0FzU3NpemVfdChpdGVtLCBQeUV4Y19JbmRleEVycm9yKTsKLQkJaWYgKGk9PS0xICYmIFB5RXJyX09jY3VycmVkKCkpIHsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWlmIChpIDwgMCkKLQkJCWkgKz0gUHlfU0laRShzZWxmKTsKLQkJcmV0dXJuIGFycmF5X2l0ZW0oc2VsZiwgaSk7Ci0JfQotCWVsc2UgaWYgKFB5U2xpY2VfQ2hlY2soaXRlbSkpIHsKLQkJUHlfc3NpemVfdCBzdGFydCwgc3RvcCwgc3RlcCwgc2xpY2VsZW5ndGgsIGN1ciwgaTsKLQkJUHlPYmplY3QqIHJlc3VsdDsKLQkJYXJyYXlvYmplY3QqIGFyOwotCQlpbnQgaXRlbXNpemUgPSBzZWxmLT5vYl9kZXNjci0+aXRlbXNpemU7CisgICAgaWYgKFB5SW5kZXhfQ2hlY2soaXRlbSkpIHsKKyAgICAgICAgUHlfc3NpemVfdCBpID0gUHlOdW1iZXJfQXNTc2l6ZV90KGl0ZW0sIFB5RXhjX0luZGV4RXJyb3IpOworICAgICAgICBpZiAoaT09LTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGkgPCAwKQorICAgICAgICAgICAgaSArPSBQeV9TSVpFKHNlbGYpOworICAgICAgICByZXR1cm4gYXJyYXlfaXRlbShzZWxmLCBpKTsKKyAgICB9CisgICAgZWxzZSBpZiAoUHlTbGljZV9DaGVjayhpdGVtKSkgeworICAgICAgICBQeV9zc2l6ZV90IHN0YXJ0LCBzdG9wLCBzdGVwLCBzbGljZWxlbmd0aCwgY3VyLCBpOworICAgICAgICBQeU9iamVjdCogcmVzdWx0OworICAgICAgICBhcnJheW9iamVjdCogYXI7CisgICAgICAgIGludCBpdGVtc2l6ZSA9IHNlbGYtPm9iX2Rlc2NyLT5pdGVtc2l6ZTsKIAotCQlpZiAoUHlTbGljZV9HZXRJbmRpY2VzRXgoKFB5U2xpY2VPYmplY3QqKWl0ZW0sIFB5X1NJWkUoc2VsZiksCi0JCQkJICZzdGFydCwgJnN0b3AsICZzdGVwLCAmc2xpY2VsZW5ndGgpIDwgMCkgewotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KKyAgICAgICAgaWYgKFB5U2xpY2VfR2V0SW5kaWNlc0V4KChQeVNsaWNlT2JqZWN0KilpdGVtLCBQeV9TSVpFKHNlbGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICZzdGFydCwgJnN0b3AsICZzdGVwLCAmc2xpY2VsZW5ndGgpIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KIAotCQlpZiAoc2xpY2VsZW5ndGggPD0gMCkgewotCQkJcmV0dXJuIG5ld2FycmF5b2JqZWN0KCZBcnJheXR5cGUsIDAsIHNlbGYtPm9iX2Rlc2NyKTsKLQkJfQotCQllbHNlIGlmIChzdGVwID09IDEpIHsKLQkJCVB5T2JqZWN0ICpyZXN1bHQgPSBuZXdhcnJheW9iamVjdCgmQXJyYXl0eXBlLAotCQkJCQkJc2xpY2VsZW5ndGgsIHNlbGYtPm9iX2Rlc2NyKTsKLQkJCWlmIChyZXN1bHQgPT0gTlVMTCkKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCW1lbWNweSgoKGFycmF5b2JqZWN0ICopcmVzdWx0KS0+b2JfaXRlbSwKLQkJCSAgICAgICBzZWxmLT5vYl9pdGVtICsgc3RhcnQgKiBpdGVtc2l6ZSwKLQkJCSAgICAgICBzbGljZWxlbmd0aCAqIGl0ZW1zaXplKTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXN1bHQgPSBuZXdhcnJheW9iamVjdCgmQXJyYXl0eXBlLCBzbGljZWxlbmd0aCwgc2VsZi0+b2JfZGVzY3IpOwotCQkJaWYgKCFyZXN1bHQpIHJldHVybiBOVUxMOworICAgICAgICBpZiAoc2xpY2VsZW5ndGggPD0gMCkgeworICAgICAgICAgICAgcmV0dXJuIG5ld2FycmF5b2JqZWN0KCZBcnJheXR5cGUsIDAsIHNlbGYtPm9iX2Rlc2NyKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChzdGVwID09IDEpIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBuZXdhcnJheW9iamVjdCgmQXJyYXl0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xpY2VsZW5ndGgsIHNlbGYtPm9iX2Rlc2NyKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIG1lbWNweSgoKGFycmF5b2JqZWN0ICopcmVzdWx0KS0+b2JfaXRlbSwKKyAgICAgICAgICAgICAgICAgICBzZWxmLT5vYl9pdGVtICsgc3RhcnQgKiBpdGVtc2l6ZSwKKyAgICAgICAgICAgICAgICAgICBzbGljZWxlbmd0aCAqIGl0ZW1zaXplKTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICByZXN1bHQgPSBuZXdhcnJheW9iamVjdCgmQXJyYXl0eXBlLCBzbGljZWxlbmd0aCwgc2VsZi0+b2JfZGVzY3IpOworICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBOVUxMOwogCi0JCQlhciA9IChhcnJheW9iamVjdCopcmVzdWx0OworICAgICAgICAgICAgYXIgPSAoYXJyYXlvYmplY3QqKXJlc3VsdDsKIAotCQkJZm9yIChjdXIgPSBzdGFydCwgaSA9IDA7IGkgPCBzbGljZWxlbmd0aDsgCi0JCQkgICAgIGN1ciArPSBzdGVwLCBpKyspIHsKLQkJCQltZW1jcHkoYXItPm9iX2l0ZW0gKyBpKml0ZW1zaXplLAotCQkJCSAgICAgICBzZWxmLT5vYl9pdGVtICsgY3VyKml0ZW1zaXplLAotCQkJCSAgICAgICBpdGVtc2l6ZSk7Ci0JCQl9Ci0JCQkKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0JCQotCX0KLQllbHNlIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgCi0JCQkJImFycmF5IGluZGljZXMgbXVzdCBiZSBpbnRlZ2VycyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgICAgICAgICBmb3IgKGN1ciA9IHN0YXJ0LCBpID0gMDsgaSA8IHNsaWNlbGVuZ3RoOworICAgICAgICAgICAgICAgICBjdXIgKz0gc3RlcCwgaSsrKSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KGFyLT5vYl9pdGVtICsgaSppdGVtc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+b2JfaXRlbSArIGN1cippdGVtc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgaXRlbXNpemUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImFycmF5IGluZGljZXMgbXVzdCBiZSBpbnRlZ2VycyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiB9CiAKIHN0YXRpYyBpbnQKIGFycmF5X2Fzc19zdWJzY3IoYXJyYXlvYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBpdGVtLCBQeU9iamVjdCogdmFsdWUpCiB7Ci0JUHlfc3NpemVfdCBzdGFydCwgc3RvcCwgc3RlcCwgc2xpY2VsZW5ndGgsIG5lZWRlZDsKLQlhcnJheW9iamVjdCogb3RoZXI7Ci0JaW50IGl0ZW1zaXplOworICAgIFB5X3NzaXplX3Qgc3RhcnQsIHN0b3AsIHN0ZXAsIHNsaWNlbGVuZ3RoLCBuZWVkZWQ7CisgICAgYXJyYXlvYmplY3QqIG90aGVyOworICAgIGludCBpdGVtc2l6ZTsKIAotCWlmIChQeUluZGV4X0NoZWNrKGl0ZW0pKSB7Ci0JCVB5X3NzaXplX3QgaSA9IFB5TnVtYmVyX0FzU3NpemVfdChpdGVtLCBQeUV4Y19JbmRleEVycm9yKTsKLQkJCi0JCWlmIChpID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCQlyZXR1cm4gLTE7Ci0JCWlmIChpIDwgMCkKLQkJCWkgKz0gUHlfU0laRShzZWxmKTsKLQkJaWYgKGkgPCAwIHx8IGkgPj0gUHlfU0laRShzZWxmKSkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsCi0JCQkJImFycmF5IGFzc2lnbm1lbnQgaW5kZXggb3V0IG9mIHJhbmdlIik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJaWYgKHZhbHVlID09IE5VTEwpIHsKLQkJCS8qIEZhbGwgdGhyb3VnaCB0byBzbGljZSBhc3NpZ25tZW50ICovCi0JCQlzdGFydCA9IGk7Ci0JCQlzdG9wID0gaSArIDE7Ci0JCQlzdGVwID0gMTsKLQkJCXNsaWNlbGVuZ3RoID0gMTsKLQkJfQotCQllbHNlCi0JCQlyZXR1cm4gKCpzZWxmLT5vYl9kZXNjci0+c2V0aXRlbSkoc2VsZiwgaSwgdmFsdWUpOwotCX0KLQllbHNlIGlmIChQeVNsaWNlX0NoZWNrKGl0ZW0pKSB7Ci0JCWlmIChQeVNsaWNlX0dldEluZGljZXNFeCgoUHlTbGljZU9iamVjdCAqKWl0ZW0sCi0JCQkJCSBQeV9TSVpFKHNlbGYpLCAmc3RhcnQsICZzdG9wLAotCQkJCQkgJnN0ZXAsICZzbGljZWxlbmd0aCkgPCAwKSB7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9Ci0JZWxzZSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJImFycmF5IGluZGljZXMgbXVzdCBiZSBpbnRlZ2VyIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKHZhbHVlID09IE5VTEwpIHsKLQkJb3RoZXIgPSBOVUxMOwotCQluZWVkZWQgPSAwOwotCX0KLQllbHNlIGlmIChhcnJheV9DaGVjayh2YWx1ZSkpIHsKLQkJb3RoZXIgPSAoYXJyYXlvYmplY3QgKil2YWx1ZTsKLQkJbmVlZGVkID0gUHlfU0laRShvdGhlcik7Ci0JCWlmIChzZWxmID09IG90aGVyKSB7Ci0JCQkvKiBTcGVjaWFsIGNhc2UgInNlbGZbaTpqXSA9IHNlbGYiIC0tIGNvcHkgc2VsZiBmaXJzdCAqLwotCQkJaW50IHJldDsKLQkJCXZhbHVlID0gYXJyYXlfc2xpY2Uob3RoZXIsIDAsIG5lZWRlZCk7Ci0JCQlpZiAodmFsdWUgPT0gTlVMTCkKLQkJCQlyZXR1cm4gLTE7Ci0JCQlyZXQgPSBhcnJheV9hc3Nfc3Vic2NyKHNlbGYsIGl0ZW0sIHZhbHVlKTsKLQkJCVB5X0RFQ1JFRih2YWx1ZSk7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0JCWlmIChvdGhlci0+b2JfZGVzY3IgIT0gc2VsZi0+b2JfZGVzY3IpIHsKLQkJCVB5RXJyX0JhZEFyZ3VtZW50KCk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9Ci0JZWxzZSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JICAgICAiY2FuIG9ubHkgYXNzaWduIGFycmF5IChub3QgXCIlLjIwMHNcIikgdG8gYXJyYXkgc2xpY2UiLAotCQkJICAgICBQeV9UWVBFKHZhbHVlKS0+dHBfbmFtZSk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaXRlbXNpemUgPSBzZWxmLT5vYl9kZXNjci0+aXRlbXNpemU7Ci0JLyogZm9yICdhWzI6MV0gPSAuLi4nLCB0aGUgaW5zZXJ0aW9uIHBvaW50IGlzICdzdGFydCcsIG5vdCAnc3RvcCcgKi8KLQlpZiAoKHN0ZXAgPiAwICYmIHN0b3AgPCBzdGFydCkgfHwKLQkgICAgKHN0ZXAgPCAwICYmIHN0b3AgPiBzdGFydCkpCi0JCXN0b3AgPSBzdGFydDsKLQlpZiAoc3RlcCA9PSAxKSB7Ci0JCWlmIChzbGljZWxlbmd0aCA+IG5lZWRlZCkgewotCQkJbWVtbW92ZShzZWxmLT5vYl9pdGVtICsgKHN0YXJ0ICsgbmVlZGVkKSAqIGl0ZW1zaXplLAotCQkJCXNlbGYtPm9iX2l0ZW0gKyBzdG9wICogaXRlbXNpemUsCi0JCQkJKFB5X1NJWkUoc2VsZikgLSBzdG9wKSAqIGl0ZW1zaXplKTsKLQkJCWlmIChhcnJheV9yZXNpemUoc2VsZiwgUHlfU0laRShzZWxmKSArCi0JCQkJCSBuZWVkZWQgLSBzbGljZWxlbmd0aCkgPCAwKQotCQkJCXJldHVybiAtMTsKLQkJfQotCQllbHNlIGlmIChzbGljZWxlbmd0aCA8IG5lZWRlZCkgewotCQkJaWYgKGFycmF5X3Jlc2l6ZShzZWxmLCBQeV9TSVpFKHNlbGYpICsKLQkJCQkJIG5lZWRlZCAtIHNsaWNlbGVuZ3RoKSA8IDApCi0JCQkJcmV0dXJuIC0xOwotCQkJbWVtbW92ZShzZWxmLT5vYl9pdGVtICsgKHN0YXJ0ICsgbmVlZGVkKSAqIGl0ZW1zaXplLAotCQkJCXNlbGYtPm9iX2l0ZW0gKyBzdG9wICogaXRlbXNpemUsCi0JCQkJKFB5X1NJWkUoc2VsZikgLSBzdGFydCAtIG5lZWRlZCkgKiBpdGVtc2l6ZSk7Ci0JCX0KLQkJaWYgKG5lZWRlZCA+IDApCi0JCQltZW1jcHkoc2VsZi0+b2JfaXRlbSArIHN0YXJ0ICogaXRlbXNpemUsCi0JCQkgICAgICAgb3RoZXItPm9iX2l0ZW0sIG5lZWRlZCAqIGl0ZW1zaXplKTsKLQkJcmV0dXJuIDA7Ci0JfQotCWVsc2UgaWYgKG5lZWRlZCA9PSAwKSB7Ci0JCS8qIERlbGV0ZSBzbGljZSAqLwotCQlzaXplX3QgY3VyOwotCQlQeV9zc2l6ZV90IGk7CisgICAgaWYgKFB5SW5kZXhfQ2hlY2soaXRlbSkpIHsKKyAgICAgICAgUHlfc3NpemVfdCBpID0gUHlOdW1iZXJfQXNTc2l6ZV90KGl0ZW0sIFB5RXhjX0luZGV4RXJyb3IpOwogCi0JCWlmIChzdGVwIDwgMCkgewotCQkJc3RvcCA9IHN0YXJ0ICsgMTsKLQkJCXN0YXJ0ID0gc3RvcCArIHN0ZXAgKiAoc2xpY2VsZW5ndGggLSAxKSAtIDE7Ci0JCQlzdGVwID0gLXN0ZXA7Ci0JCX0KLQkJZm9yIChjdXIgPSBzdGFydCwgaSA9IDA7IGkgPCBzbGljZWxlbmd0aDsKLQkJICAgICBjdXIgKz0gc3RlcCwgaSsrKSB7Ci0JCQlQeV9zc2l6ZV90IGxpbSA9IHN0ZXAgLSAxOworICAgICAgICBpZiAoaSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBpZiAoaSA8IDApCisgICAgICAgICAgICBpICs9IFB5X1NJWkUoc2VsZik7CisgICAgICAgIGlmIChpIDwgMCB8fCBpID49IFB5X1NJWkUoc2VsZikpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLAorICAgICAgICAgICAgICAgICJhcnJheSBhc3NpZ25tZW50IGluZGV4IG91dCBvZiByYW5nZSIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGlmICh2YWx1ZSA9PSBOVUxMKSB7CisgICAgICAgICAgICAvKiBGYWxsIHRocm91Z2ggdG8gc2xpY2UgYXNzaWdubWVudCAqLworICAgICAgICAgICAgc3RhcnQgPSBpOworICAgICAgICAgICAgc3RvcCA9IGkgKyAxOworICAgICAgICAgICAgc3RlcCA9IDE7CisgICAgICAgICAgICBzbGljZWxlbmd0aCA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuICgqc2VsZi0+b2JfZGVzY3ItPnNldGl0ZW0pKHNlbGYsIGksIHZhbHVlKTsKKyAgICB9CisgICAgZWxzZSBpZiAoUHlTbGljZV9DaGVjayhpdGVtKSkgeworICAgICAgICBpZiAoUHlTbGljZV9HZXRJbmRpY2VzRXgoKFB5U2xpY2VPYmplY3QgKilpdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfU0laRShzZWxmKSwgJnN0YXJ0LCAmc3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGVwLCAmc2xpY2VsZW5ndGgpIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImFycmF5IGluZGljZXMgbXVzdCBiZSBpbnRlZ2VyIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKHZhbHVlID09IE5VTEwpIHsKKyAgICAgICAgb3RoZXIgPSBOVUxMOworICAgICAgICBuZWVkZWQgPSAwOworICAgIH0KKyAgICBlbHNlIGlmIChhcnJheV9DaGVjayh2YWx1ZSkpIHsKKyAgICAgICAgb3RoZXIgPSAoYXJyYXlvYmplY3QgKil2YWx1ZTsKKyAgICAgICAgbmVlZGVkID0gUHlfU0laRShvdGhlcik7CisgICAgICAgIGlmIChzZWxmID09IG90aGVyKSB7CisgICAgICAgICAgICAvKiBTcGVjaWFsIGNhc2UgInNlbGZbaTpqXSA9IHNlbGYiIC0tIGNvcHkgc2VsZiBmaXJzdCAqLworICAgICAgICAgICAgaW50IHJldDsKKyAgICAgICAgICAgIHZhbHVlID0gYXJyYXlfc2xpY2Uob3RoZXIsIDAsIG5lZWRlZCk7CisgICAgICAgICAgICBpZiAodmFsdWUgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICByZXQgPSBhcnJheV9hc3Nfc3Vic2NyKHNlbGYsIGl0ZW0sIHZhbHVlKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih2YWx1ZSk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgICAgIGlmIChvdGhlci0+b2JfZGVzY3IgIT0gc2VsZi0+b2JfZGVzY3IpIHsKKyAgICAgICAgICAgIFB5RXJyX0JhZEFyZ3VtZW50KCk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAiY2FuIG9ubHkgYXNzaWduIGFycmF5IChub3QgXCIlLjIwMHNcIikgdG8gYXJyYXkgc2xpY2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5X1RZUEUodmFsdWUpLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpdGVtc2l6ZSA9IHNlbGYtPm9iX2Rlc2NyLT5pdGVtc2l6ZTsKKyAgICAvKiBmb3IgJ2FbMjoxXSA9IC4uLicsIHRoZSBpbnNlcnRpb24gcG9pbnQgaXMgJ3N0YXJ0Jywgbm90ICdzdG9wJyAqLworICAgIGlmICgoc3RlcCA+IDAgJiYgc3RvcCA8IHN0YXJ0KSB8fAorICAgICAgICAoc3RlcCA8IDAgJiYgc3RvcCA+IHN0YXJ0KSkKKyAgICAgICAgc3RvcCA9IHN0YXJ0OworICAgIGlmIChzdGVwID09IDEpIHsKKyAgICAgICAgaWYgKHNsaWNlbGVuZ3RoID4gbmVlZGVkKSB7CisgICAgICAgICAgICBtZW1tb3ZlKHNlbGYtPm9iX2l0ZW0gKyAoc3RhcnQgKyBuZWVkZWQpICogaXRlbXNpemUsCisgICAgICAgICAgICAgICAgc2VsZi0+b2JfaXRlbSArIHN0b3AgKiBpdGVtc2l6ZSwKKyAgICAgICAgICAgICAgICAoUHlfU0laRShzZWxmKSAtIHN0b3ApICogaXRlbXNpemUpOworICAgICAgICAgICAgaWYgKGFycmF5X3Jlc2l6ZShzZWxmLCBQeV9TSVpFKHNlbGYpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZGVkIC0gc2xpY2VsZW5ndGgpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoc2xpY2VsZW5ndGggPCBuZWVkZWQpIHsKKyAgICAgICAgICAgIGlmIChhcnJheV9yZXNpemUoc2VsZiwgUHlfU0laRShzZWxmKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCAtIHNsaWNlbGVuZ3RoKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgbWVtbW92ZShzZWxmLT5vYl9pdGVtICsgKHN0YXJ0ICsgbmVlZGVkKSAqIGl0ZW1zaXplLAorICAgICAgICAgICAgICAgIHNlbGYtPm9iX2l0ZW0gKyBzdG9wICogaXRlbXNpemUsCisgICAgICAgICAgICAgICAgKFB5X1NJWkUoc2VsZikgLSBzdGFydCAtIG5lZWRlZCkgKiBpdGVtc2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5lZWRlZCA+IDApCisgICAgICAgICAgICBtZW1jcHkoc2VsZi0+b2JfaXRlbSArIHN0YXJ0ICogaXRlbXNpemUsCisgICAgICAgICAgICAgICAgICAgb3RoZXItPm9iX2l0ZW0sIG5lZWRlZCAqIGl0ZW1zaXplKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGVsc2UgaWYgKG5lZWRlZCA9PSAwKSB7CisgICAgICAgIC8qIERlbGV0ZSBzbGljZSAqLworICAgICAgICBzaXplX3QgY3VyOworICAgICAgICBQeV9zc2l6ZV90IGk7CiAKLQkJCWlmIChjdXIgKyBzdGVwID49IChzaXplX3QpUHlfU0laRShzZWxmKSkKLQkJCQlsaW0gPSBQeV9TSVpFKHNlbGYpIC0gY3VyIC0gMTsKLQkJCW1lbW1vdmUoc2VsZi0+b2JfaXRlbSArIChjdXIgLSBpKSAqIGl0ZW1zaXplLAotCQkJCXNlbGYtPm9iX2l0ZW0gKyAoY3VyICsgMSkgKiBpdGVtc2l6ZSwKLQkJCQlsaW0gKiBpdGVtc2l6ZSk7Ci0JCX0KLQkJY3VyID0gc3RhcnQgKyBzbGljZWxlbmd0aCAqIHN0ZXA7Ci0JCWlmIChjdXIgPCAoc2l6ZV90KVB5X1NJWkUoc2VsZikpIHsKLQkJCW1lbW1vdmUoc2VsZi0+b2JfaXRlbSArIChjdXItc2xpY2VsZW5ndGgpICogaXRlbXNpemUsCi0JCQkJc2VsZi0+b2JfaXRlbSArIGN1ciAqIGl0ZW1zaXplLAotCQkJCShQeV9TSVpFKHNlbGYpIC0gY3VyKSAqIGl0ZW1zaXplKTsKLQkJfQotCQlpZiAoYXJyYXlfcmVzaXplKHNlbGYsIFB5X1NJWkUoc2VsZikgLSBzbGljZWxlbmd0aCkgPCAwKQotCQkJcmV0dXJuIC0xOwotCQlyZXR1cm4gMDsKLQl9Ci0JZWxzZSB7Ci0JCVB5X3NzaXplX3QgY3VyLCBpOworICAgICAgICBpZiAoc3RlcCA8IDApIHsKKyAgICAgICAgICAgIHN0b3AgPSBzdGFydCArIDE7CisgICAgICAgICAgICBzdGFydCA9IHN0b3AgKyBzdGVwICogKHNsaWNlbGVuZ3RoIC0gMSkgLSAxOworICAgICAgICAgICAgc3RlcCA9IC1zdGVwOworICAgICAgICB9CisgICAgICAgIGZvciAoY3VyID0gc3RhcnQsIGkgPSAwOyBpIDwgc2xpY2VsZW5ndGg7CisgICAgICAgICAgICAgY3VyICs9IHN0ZXAsIGkrKykgeworICAgICAgICAgICAgUHlfc3NpemVfdCBsaW0gPSBzdGVwIC0gMTsKIAotCQlpZiAobmVlZGVkICE9IHNsaWNlbGVuZ3RoKSB7Ci0JCQlQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkiYXR0ZW1wdCB0byBhc3NpZ24gYXJyYXkgb2Ygc2l6ZSAlemQgIgotCQkJCSJ0byBleHRlbmRlZCBzbGljZSBvZiBzaXplICV6ZCIsCi0JCQkJbmVlZGVkLCBzbGljZWxlbmd0aCk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJZm9yIChjdXIgPSBzdGFydCwgaSA9IDA7IGkgPCBzbGljZWxlbmd0aDsKLQkJICAgICBjdXIgKz0gc3RlcCwgaSsrKSB7Ci0JCQltZW1jcHkoc2VsZi0+b2JfaXRlbSArIGN1ciAqIGl0ZW1zaXplLAotCQkJICAgICAgIG90aGVyLT5vYl9pdGVtICsgaSAqIGl0ZW1zaXplLAotCQkJICAgICAgIGl0ZW1zaXplKTsKLQkJfQotCQlyZXR1cm4gMDsKLQl9CisgICAgICAgICAgICBpZiAoY3VyICsgc3RlcCA+PSAoc2l6ZV90KVB5X1NJWkUoc2VsZikpCisgICAgICAgICAgICAgICAgbGltID0gUHlfU0laRShzZWxmKSAtIGN1ciAtIDE7CisgICAgICAgICAgICBtZW1tb3ZlKHNlbGYtPm9iX2l0ZW0gKyAoY3VyIC0gaSkgKiBpdGVtc2l6ZSwKKyAgICAgICAgICAgICAgICBzZWxmLT5vYl9pdGVtICsgKGN1ciArIDEpICogaXRlbXNpemUsCisgICAgICAgICAgICAgICAgbGltICogaXRlbXNpemUpOworICAgICAgICB9CisgICAgICAgIGN1ciA9IHN0YXJ0ICsgc2xpY2VsZW5ndGggKiBzdGVwOworICAgICAgICBpZiAoY3VyIDwgKHNpemVfdClQeV9TSVpFKHNlbGYpKSB7CisgICAgICAgICAgICBtZW1tb3ZlKHNlbGYtPm9iX2l0ZW0gKyAoY3VyLXNsaWNlbGVuZ3RoKSAqIGl0ZW1zaXplLAorICAgICAgICAgICAgICAgIHNlbGYtPm9iX2l0ZW0gKyBjdXIgKiBpdGVtc2l6ZSwKKyAgICAgICAgICAgICAgICAoUHlfU0laRShzZWxmKSAtIGN1cikgKiBpdGVtc2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGFycmF5X3Jlc2l6ZShzZWxmLCBQeV9TSVpFKHNlbGYpIC0gc2xpY2VsZW5ndGgpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeV9zc2l6ZV90IGN1ciwgaTsKKworICAgICAgICBpZiAobmVlZGVkICE9IHNsaWNlbGVuZ3RoKSB7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAiYXR0ZW1wdCB0byBhc3NpZ24gYXJyYXkgb2Ygc2l6ZSAlemQgIgorICAgICAgICAgICAgICAgICJ0byBleHRlbmRlZCBzbGljZSBvZiBzaXplICV6ZCIsCisgICAgICAgICAgICAgICAgbmVlZGVkLCBzbGljZWxlbmd0aCk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChjdXIgPSBzdGFydCwgaSA9IDA7IGkgPCBzbGljZWxlbmd0aDsKKyAgICAgICAgICAgICBjdXIgKz0gc3RlcCwgaSsrKSB7CisgICAgICAgICAgICBtZW1jcHkoc2VsZi0+b2JfaXRlbSArIGN1ciAqIGl0ZW1zaXplLAorICAgICAgICAgICAgICAgICAgIG90aGVyLT5vYl9pdGVtICsgaSAqIGl0ZW1zaXplLAorICAgICAgICAgICAgICAgICAgIGl0ZW1zaXplKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CiB9CiAKIHN0YXRpYyBQeU1hcHBpbmdNZXRob2RzIGFycmF5X2FzX21hcHBpbmcgPSB7Ci0JKGxlbmZ1bmMpYXJyYXlfbGVuZ3RoLAotCShiaW5hcnlmdW5jKWFycmF5X3N1YnNjciwKLQkob2Jqb2JqYXJncHJvYylhcnJheV9hc3Nfc3Vic2NyCisgICAgKGxlbmZ1bmMpYXJyYXlfbGVuZ3RoLAorICAgIChiaW5hcnlmdW5jKWFycmF5X3N1YnNjciwKKyAgICAob2Jqb2JqYXJncHJvYylhcnJheV9hc3Nfc3Vic2NyCiB9OwogCiBzdGF0aWMgY29uc3Qgdm9pZCAqZW1wdHlidWYgPSAiIjsKQEAgLTE4NTMsMTY0ICsxODUzLDE2NCBAQAogc3RhdGljIFB5X3NzaXplX3QKIGFycmF5X2J1ZmZlcl9nZXRyZWFkYnVmKGFycmF5b2JqZWN0ICpzZWxmLCBQeV9zc2l6ZV90IGluZGV4LCBjb25zdCB2b2lkICoqcHRyKQogewotCWlmICggaW5kZXggIT0gMCApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAotCQkJCSJBY2Nlc3Npbmcgbm9uLWV4aXN0ZW50IGFycmF5IHNlZ21lbnQiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQkqcHRyID0gKHZvaWQgKilzZWxmLT5vYl9pdGVtOwotCWlmICgqcHRyID09IE5VTEwpCi0JCSpwdHIgPSBlbXB0eWJ1ZjsKLQlyZXR1cm4gUHlfU0laRShzZWxmKSpzZWxmLT5vYl9kZXNjci0+aXRlbXNpemU7CisgICAgaWYgKCBpbmRleCAhPSAwICkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiQWNjZXNzaW5nIG5vbi1leGlzdGVudCBhcnJheSBzZWdtZW50Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgKnB0ciA9ICh2b2lkICopc2VsZi0+b2JfaXRlbTsKKyAgICBpZiAoKnB0ciA9PSBOVUxMKQorICAgICAgICAqcHRyID0gZW1wdHlidWY7CisgICAgcmV0dXJuIFB5X1NJWkUoc2VsZikqc2VsZi0+b2JfZGVzY3ItPml0ZW1zaXplOwogfQogCiBzdGF0aWMgUHlfc3NpemVfdAogYXJyYXlfYnVmZmVyX2dldHdyaXRlYnVmKGFycmF5b2JqZWN0ICpzZWxmLCBQeV9zc2l6ZV90IGluZGV4LCBjb25zdCB2b2lkICoqcHRyKQogewotCWlmICggaW5kZXggIT0gMCApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAotCQkJCSJBY2Nlc3Npbmcgbm9uLWV4aXN0ZW50IGFycmF5IHNlZ21lbnQiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQkqcHRyID0gKHZvaWQgKilzZWxmLT5vYl9pdGVtOwotCWlmICgqcHRyID09IE5VTEwpCi0JCSpwdHIgPSBlbXB0eWJ1ZjsKLQlyZXR1cm4gUHlfU0laRShzZWxmKSpzZWxmLT5vYl9kZXNjci0+aXRlbXNpemU7CisgICAgaWYgKCBpbmRleCAhPSAwICkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiQWNjZXNzaW5nIG5vbi1leGlzdGVudCBhcnJheSBzZWdtZW50Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgKnB0ciA9ICh2b2lkICopc2VsZi0+b2JfaXRlbTsKKyAgICBpZiAoKnB0ciA9PSBOVUxMKQorICAgICAgICAqcHRyID0gZW1wdHlidWY7CisgICAgcmV0dXJuIFB5X1NJWkUoc2VsZikqc2VsZi0+b2JfZGVzY3ItPml0ZW1zaXplOwogfQogCiBzdGF0aWMgUHlfc3NpemVfdAogYXJyYXlfYnVmZmVyX2dldHNlZ2NvdW50KGFycmF5b2JqZWN0ICpzZWxmLCBQeV9zc2l6ZV90ICpsZW5wKQogewotCWlmICggbGVucCApCi0JCSpsZW5wID0gUHlfU0laRShzZWxmKSpzZWxmLT5vYl9kZXNjci0+aXRlbXNpemU7Ci0JcmV0dXJuIDE7CisgICAgaWYgKCBsZW5wICkKKyAgICAgICAgKmxlbnAgPSBQeV9TSVpFKHNlbGYpKnNlbGYtPm9iX2Rlc2NyLT5pdGVtc2l6ZTsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIFB5U2VxdWVuY2VNZXRob2RzIGFycmF5X2FzX3NlcXVlbmNlID0gewotCShsZW5mdW5jKWFycmF5X2xlbmd0aCwJCSAgICAgICAgLypzcV9sZW5ndGgqLwotCShiaW5hcnlmdW5jKWFycmF5X2NvbmNhdCwgICAgICAgICAgICAgICAvKnNxX2NvbmNhdCovCi0JKHNzaXplYXJnZnVuYylhcnJheV9yZXBlYXQsCQkvKnNxX3JlcGVhdCovCi0JKHNzaXplYXJnZnVuYylhcnJheV9pdGVtLAkJICAgICAgICAvKnNxX2l0ZW0qLwotCShzc2l6ZXNzaXplYXJnZnVuYylhcnJheV9zbGljZSwJCS8qc3Ffc2xpY2UqLwotCShzc2l6ZW9iamFyZ3Byb2MpYXJyYXlfYXNzX2l0ZW0sCQkvKnNxX2Fzc19pdGVtKi8KLQkoc3NpemVzc2l6ZW9iamFyZ3Byb2MpYXJyYXlfYXNzX3NsaWNlLAkvKnNxX2Fzc19zbGljZSovCi0JKG9iam9ianByb2MpYXJyYXlfY29udGFpbnMsCQkvKnNxX2NvbnRhaW5zKi8KLQkoYmluYXJ5ZnVuYylhcnJheV9pbnBsYWNlX2NvbmNhdCwJLypzcV9pbnBsYWNlX2NvbmNhdCovCi0JKHNzaXplYXJnZnVuYylhcnJheV9pbnBsYWNlX3JlcGVhdAkvKnNxX2lucGxhY2VfcmVwZWF0Ki8KKyAgICAobGVuZnVuYylhcnJheV9sZW5ndGgsICAgICAgICAgICAgICAgICAgICAgIC8qc3FfbGVuZ3RoKi8KKyAgICAoYmluYXJ5ZnVuYylhcnJheV9jb25jYXQsICAgICAgICAgICAgICAgLypzcV9jb25jYXQqLworICAgIChzc2l6ZWFyZ2Z1bmMpYXJyYXlfcmVwZWF0LCAgICAgICAgICAgICAgICAgLypzcV9yZXBlYXQqLworICAgIChzc2l6ZWFyZ2Z1bmMpYXJyYXlfaXRlbSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnNxX2l0ZW0qLworICAgIChzc2l6ZXNzaXplYXJnZnVuYylhcnJheV9zbGljZSwgICAgICAgICAgICAgLypzcV9zbGljZSovCisgICAgKHNzaXplb2JqYXJncHJvYylhcnJheV9hc3NfaXRlbSwgICAgICAgICAgICAgICAgICAgIC8qc3FfYXNzX2l0ZW0qLworICAgIChzc2l6ZXNzaXplb2JqYXJncHJvYylhcnJheV9hc3Nfc2xpY2UsICAgICAgLypzcV9hc3Nfc2xpY2UqLworICAgIChvYmpvYmpwcm9jKWFycmF5X2NvbnRhaW5zLCAgICAgICAgICAgICAgICAgLypzcV9jb250YWlucyovCisgICAgKGJpbmFyeWZ1bmMpYXJyYXlfaW5wbGFjZV9jb25jYXQsICAgICAgICAgICAvKnNxX2lucGxhY2VfY29uY2F0Ki8KKyAgICAoc3NpemVhcmdmdW5jKWFycmF5X2lucGxhY2VfcmVwZWF0ICAgICAgICAgIC8qc3FfaW5wbGFjZV9yZXBlYXQqLwogfTsKIAogc3RhdGljIFB5QnVmZmVyUHJvY3MgYXJyYXlfYXNfYnVmZmVyID0gewotCShyZWFkYnVmZmVycHJvYylhcnJheV9idWZmZXJfZ2V0cmVhZGJ1ZiwKLQkod3JpdGVidWZmZXJwcm9jKWFycmF5X2J1ZmZlcl9nZXR3cml0ZWJ1ZiwKLQkoc2VnY291bnRwcm9jKWFycmF5X2J1ZmZlcl9nZXRzZWdjb3VudCwKLQlOVUxMLAorICAgIChyZWFkYnVmZmVycHJvYylhcnJheV9idWZmZXJfZ2V0cmVhZGJ1ZiwKKyAgICAod3JpdGVidWZmZXJwcm9jKWFycmF5X2J1ZmZlcl9nZXR3cml0ZWJ1ZiwKKyAgICAoc2VnY291bnRwcm9jKWFycmF5X2J1ZmZlcl9nZXRzZWdjb3VudCwKKyAgICBOVUxMLAogfTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIGFycmF5X25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQljaGFyIGM7Ci0JUHlPYmplY3QgKmluaXRpYWwgPSBOVUxMLCAqaXQgPSBOVUxMOwotCXN0cnVjdCBhcnJheWRlc2NyICpkZXNjcjsKLQkKLQlpZiAodHlwZSA9PSAmQXJyYXl0eXBlICYmICFfUHlBcmdfTm9LZXl3b3JkcygiYXJyYXkuYXJyYXkoKSIsIGt3ZHMpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBjaGFyIGM7CisgICAgUHlPYmplY3QgKmluaXRpYWwgPSBOVUxMLCAqaXQgPSBOVUxMOworICAgIHN0cnVjdCBhcnJheWRlc2NyICpkZXNjcjsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiY3xPOmFycmF5IiwgJmMsICZpbml0aWFsKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKHR5cGUgPT0gJkFycmF5dHlwZSAmJiAhX1B5QXJnX05vS2V5d29yZHMoImFycmF5LmFycmF5KCkiLCBrd2RzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoIShpbml0aWFsID09IE5VTEwgfHwgUHlMaXN0X0NoZWNrKGluaXRpYWwpCi0JICAgICAgfHwgUHlTdHJpbmdfQ2hlY2soaW5pdGlhbCkgfHwgUHlUdXBsZV9DaGVjayhpbml0aWFsKQotCSAgICAgIHx8IChjID09ICd1JyAmJiBQeVVuaWNvZGVfQ2hlY2soaW5pdGlhbCkpKSkgewotCQlpdCA9IFB5T2JqZWN0X0dldEl0ZXIoaW5pdGlhbCk7Ci0JCWlmIChpdCA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCS8qIFdlIHNldCBpbml0aWFsIHRvIE5VTEwgc28gdGhhdCB0aGUgc3Vic2VxdWVudCBjb2RlCi0JCSAgIHdpbGwgY3JlYXRlIGFuIGVtcHR5IGFycmF5IG9mIHRoZSBhcHByb3ByaWF0ZSB0eXBlCi0JCSAgIGFuZCBhZnRlcndhcmRzIHdlIGNhbiB1c2UgYXJyYXlfaXRlcl9leHRlbmQgdG8gcG9wdWxhdGUKLQkJICAgdGhlIGFycmF5LgotCQkqLwotCQlpbml0aWFsID0gTlVMTDsKLQl9Ci0JZm9yIChkZXNjciA9IGRlc2NyaXB0b3JzOyBkZXNjci0+dHlwZWNvZGUgIT0gJ1wwJzsgZGVzY3IrKykgewotCQlpZiAoZGVzY3ItPnR5cGVjb2RlID09IGMpIHsKLQkJCVB5T2JqZWN0ICphOwotCQkJUHlfc3NpemVfdCBsZW47CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJjfE86YXJyYXkiLCAmYywgJmluaXRpYWwpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCQkJaWYgKGluaXRpYWwgPT0gTlVMTCB8fCAhKFB5TGlzdF9DaGVjayhpbml0aWFsKSAKLQkJCQl8fCBQeVR1cGxlX0NoZWNrKGluaXRpYWwpKSkKLQkJCQlsZW4gPSAwOwotCQkJZWxzZQotCQkJCWxlbiA9IFB5U2VxdWVuY2VfU2l6ZShpbml0aWFsKTsKKyAgICBpZiAoIShpbml0aWFsID09IE5VTEwgfHwgUHlMaXN0X0NoZWNrKGluaXRpYWwpCisgICAgICAgICAgfHwgUHlTdHJpbmdfQ2hlY2soaW5pdGlhbCkgfHwgUHlUdXBsZV9DaGVjayhpbml0aWFsKQorICAgICAgICAgIHx8IChjID09ICd1JyAmJiBQeVVuaWNvZGVfQ2hlY2soaW5pdGlhbCkpKSkgeworICAgICAgICBpdCA9IFB5T2JqZWN0X0dldEl0ZXIoaW5pdGlhbCk7CisgICAgICAgIGlmIChpdCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIC8qIFdlIHNldCBpbml0aWFsIHRvIE5VTEwgc28gdGhhdCB0aGUgc3Vic2VxdWVudCBjb2RlCisgICAgICAgICAgIHdpbGwgY3JlYXRlIGFuIGVtcHR5IGFycmF5IG9mIHRoZSBhcHByb3ByaWF0ZSB0eXBlCisgICAgICAgICAgIGFuZCBhZnRlcndhcmRzIHdlIGNhbiB1c2UgYXJyYXlfaXRlcl9leHRlbmQgdG8gcG9wdWxhdGUKKyAgICAgICAgICAgdGhlIGFycmF5LgorICAgICAgICAqLworICAgICAgICBpbml0aWFsID0gTlVMTDsKKyAgICB9CisgICAgZm9yIChkZXNjciA9IGRlc2NyaXB0b3JzOyBkZXNjci0+dHlwZWNvZGUgIT0gJ1wwJzsgZGVzY3IrKykgeworICAgICAgICBpZiAoZGVzY3ItPnR5cGVjb2RlID09IGMpIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICphOworICAgICAgICAgICAgUHlfc3NpemVfdCBsZW47CiAKLQkJCWEgPSBuZXdhcnJheW9iamVjdCh0eXBlLCBsZW4sIGRlc2NyKTsKLQkJCWlmIChhID09IE5VTEwpCi0JCQkJcmV0dXJuIE5VTEw7CisgICAgICAgICAgICBpZiAoaW5pdGlhbCA9PSBOVUxMIHx8ICEoUHlMaXN0X0NoZWNrKGluaXRpYWwpCisgICAgICAgICAgICAgICAgfHwgUHlUdXBsZV9DaGVjayhpbml0aWFsKSkpCisgICAgICAgICAgICAgICAgbGVuID0gMDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBsZW4gPSBQeVNlcXVlbmNlX1NpemUoaW5pdGlhbCk7CiAKLQkJCWlmIChsZW4gPiAwKSB7Ci0JCQkJUHlfc3NpemVfdCBpOwotCQkJCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJCQlQeU9iamVjdCAqdiA9Ci0JCQkJCSAgICAgICAgUHlTZXF1ZW5jZV9HZXRJdGVtKGluaXRpYWwsIGkpOwotCQkJCQlpZiAodiA9PSBOVUxMKSB7Ci0JCQkJCQlQeV9ERUNSRUYoYSk7Ci0JCQkJCQlyZXR1cm4gTlVMTDsKLQkJCQkJfQotCQkJCQlpZiAoc2V0YXJyYXlpdGVtKGEsIGksIHYpICE9IDApIHsKLQkJCQkJCVB5X0RFQ1JFRih2KTsKLQkJCQkJCVB5X0RFQ1JFRihhKTsKLQkJCQkJCXJldHVybiBOVUxMOwotCQkJCQl9Ci0JCQkJCVB5X0RFQ1JFRih2KTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGluaXRpYWwgIT0gTlVMTCAmJiBQeVN0cmluZ19DaGVjayhpbml0aWFsKSkgewotCQkJCVB5T2JqZWN0ICp0X2luaXRpYWwsICp2OwotCQkJCXRfaW5pdGlhbCA9IFB5VHVwbGVfUGFjaygxLCBpbml0aWFsKTsKLQkJCQlpZiAodF9pbml0aWFsID09IE5VTEwpIHsKLQkJCQkJUHlfREVDUkVGKGEpOwotCQkJCQlyZXR1cm4gTlVMTDsKLQkJCQl9Ci0JCQkJdiA9IGFycmF5X2Zyb21zdHJpbmcoKGFycmF5b2JqZWN0ICopYSwKLQkJCQkJCQkgdF9pbml0aWFsKTsKLQkJCQlQeV9ERUNSRUYodF9pbml0aWFsKTsKLQkJCQlpZiAodiA9PSBOVUxMKSB7Ci0JCQkJCVB5X0RFQ1JFRihhKTsKLQkJCQkJcmV0dXJuIE5VTEw7Ci0JCQkJfQotCQkJCVB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgIGEgPSBuZXdhcnJheW9iamVjdCh0eXBlLCBsZW4sIGRlc2NyKTsKKyAgICAgICAgICAgIGlmIChhID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICAgICAgICAgIGlmIChsZW4gPiAwKSB7CisgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBpOworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqdiA9CisgICAgICAgICAgICAgICAgICAgICAgICBQeVNlcXVlbmNlX0dldEl0ZW0oaW5pdGlhbCwgaSk7CisgICAgICAgICAgICAgICAgICAgIGlmICh2ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChzZXRhcnJheWl0ZW0oYSwgaSwgdikgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGEpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5pdGlhbCAhPSBOVUxMICYmIFB5U3RyaW5nX0NoZWNrKGluaXRpYWwpKSB7CisgICAgICAgICAgICAgICAgUHlPYmplY3QgKnRfaW5pdGlhbCwgKnY7CisgICAgICAgICAgICAgICAgdF9pbml0aWFsID0gUHlUdXBsZV9QYWNrKDEsIGluaXRpYWwpOworICAgICAgICAgICAgICAgIGlmICh0X2luaXRpYWwgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoYSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB2ID0gYXJyYXlfZnJvbXN0cmluZygoYXJyYXlvYmplY3QgKilhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2luaXRpYWwpOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih0X2luaXRpYWwpOworICAgICAgICAgICAgICAgIGlmICh2ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGEpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHYpOwogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQkJCX0gZWxzZSBpZiAoaW5pdGlhbCAhPSBOVUxMICYmIFB5VW5pY29kZV9DaGVjayhpbml0aWFsKSkgIHsKLQkJCQlQeV9zc2l6ZV90IG4gPSBQeVVuaWNvZGVfR0VUX0RBVEFfU0laRShpbml0aWFsKTsKLQkJCQlpZiAobiA+IDApIHsKLQkJCQkJYXJyYXlvYmplY3QgKnNlbGYgPSAoYXJyYXlvYmplY3QgKilhOwotCQkJCQljaGFyICppdGVtID0gc2VsZi0+b2JfaXRlbTsKLQkJCQkJaXRlbSA9IChjaGFyICopUHlNZW1fUmVhbGxvYyhpdGVtLCBuKTsKLQkJCQkJaWYgKGl0ZW0gPT0gTlVMTCkgewotCQkJCQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJCQkJCVB5X0RFQ1JFRihhKTsKLQkJCQkJCXJldHVybiBOVUxMOwotCQkJCQl9Ci0JCQkJCXNlbGYtPm9iX2l0ZW0gPSBpdGVtOwotCQkJCQlQeV9TSVpFKHNlbGYpID0gbiAvIHNpemVvZihQeV9VTklDT0RFKTsKLQkJCQkJbWVtY3B5KGl0ZW0sIFB5VW5pY29kZV9BU19EQVRBKGluaXRpYWwpLCBuKTsKLQkJCQkJc2VsZi0+YWxsb2NhdGVkID0gUHlfU0laRShzZWxmKTsKLQkJCQl9CisgICAgICAgICAgICB9IGVsc2UgaWYgKGluaXRpYWwgIT0gTlVMTCAmJiBQeVVuaWNvZGVfQ2hlY2soaW5pdGlhbCkpICB7CisgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBuID0gUHlVbmljb2RlX0dFVF9EQVRBX1NJWkUoaW5pdGlhbCk7CisgICAgICAgICAgICAgICAgaWYgKG4gPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGFycmF5b2JqZWN0ICpzZWxmID0gKGFycmF5b2JqZWN0ICopYTsKKyAgICAgICAgICAgICAgICAgICAgY2hhciAqaXRlbSA9IHNlbGYtPm9iX2l0ZW07CisgICAgICAgICAgICAgICAgICAgIGl0ZW0gPSAoY2hhciAqKVB5TWVtX1JlYWxsb2MoaXRlbSwgbik7CisgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoYSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzZWxmLT5vYl9pdGVtID0gaXRlbTsKKyAgICAgICAgICAgICAgICAgICAgUHlfU0laRShzZWxmKSA9IG4gLyBzaXplb2YoUHlfVU5JQ09ERSk7CisgICAgICAgICAgICAgICAgICAgIG1lbWNweShpdGVtLCBQeVVuaWNvZGVfQVNfREFUQShpbml0aWFsKSwgbik7CisgICAgICAgICAgICAgICAgICAgIHNlbGYtPmFsbG9jYXRlZCA9IFB5X1NJWkUoc2VsZik7CisgICAgICAgICAgICAgICAgfQogI2VuZGlmCi0JCQl9Ci0JCQlpZiAoaXQgIT0gTlVMTCkgewotCQkJCWlmIChhcnJheV9pdGVyX2V4dGVuZCgoYXJyYXlvYmplY3QgKilhLCBpdCkgPT0gLTEpIHsKLQkJCQkJUHlfREVDUkVGKGl0KTsKLQkJCQkJUHlfREVDUkVGKGEpOwotCQkJCQlyZXR1cm4gTlVMTDsKLQkJCQl9Ci0JCQkJUHlfREVDUkVGKGl0KTsKLQkJCX0KLQkJCXJldHVybiBhOwotCQl9Ci0JfQotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkiYmFkIHR5cGVjb2RlIChtdXN0IGJlIGMsIGIsIEIsIHUsIGgsIEgsIGksIEksIGwsIEwsIGYgb3IgZCkiKTsKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpdCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaWYgKGFycmF5X2l0ZXJfZXh0ZW5kKChhcnJheW9iamVjdCAqKWEsIGl0KSA9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoaXQpOworICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoYSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoaXQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGE7CisgICAgICAgIH0KKyAgICB9CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICJiYWQgdHlwZWNvZGUgKG11c3QgYmUgYywgYiwgQiwgdSwgaCwgSCwgaSwgSSwgbCwgTCwgZiBvciBkKSIpOworICAgIHJldHVybiBOVUxMOwogfQogCiAKQEAgLTIwODEsNTUgKzIwODEsNTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqYXJyYXlfaXRlcihhcnJheW9iamVjdCAqYW8pOwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IEFycmF5dHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKLQkiYXJyYXkuYXJyYXkiLAotCXNpemVvZihhcnJheW9iamVjdCksCi0JMCwKLQkoZGVzdHJ1Y3RvcilhcnJheV9kZWFsbG9jLAkJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfY29tcGFyZSAqLwotCShyZXByZnVuYylhcnJheV9yZXByLAkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkJLyogdHBfYXNfbnVtYmVyKi8KLQkmYXJyYXlfYXNfc2VxdWVuY2UsCQkJLyogdHBfYXNfc2VxdWVuY2UqLwotCSZhcnJheV9hc19tYXBwaW5nLAkJCS8qIHRwX2FzX21hcHBpbmcqLwotCTAsIAkJCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkmYXJyYXlfYXNfYnVmZmVyLAkJCS8qIHRwX2FzX2J1ZmZlciovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19CQVNFVFlQRSB8IFB5X1RQRkxBR1NfSEFWRV9XRUFLUkVGUywgIC8qIHRwX2ZsYWdzICovCi0JYXJyYXl0eXBlX2RvYywJCQkJLyogdHBfZG9jICovCi0gCTAsCQkJCQkvKiB0cF90cmF2ZXJzZSAqLwotCTAsCQkJCQkvKiB0cF9jbGVhciAqLwotCWFycmF5X3JpY2hjb21wYXJlLAkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0Jb2Zmc2V0b2YoYXJyYXlvYmplY3QsIHdlYWtyZWZsaXN0KSwJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQkoZ2V0aXRlcmZ1bmMpYXJyYXlfaXRlciwJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkJLyogdHBfaXRlcm5leHQgKi8KLQlhcnJheV9tZXRob2RzLAkJCQkvKiB0cF9tZXRob2RzICovCi0JMCwJCQkJCS8qIHRwX21lbWJlcnMgKi8KLQlhcnJheV9nZXRzZXRzLAkJCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCQkvKiB0cF9kaWN0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KLQkwLAkJCQkJLyogdHBfZGljdG9mZnNldCAqLwotCTAsCQkJCQkvKiB0cF9pbml0ICovCi0JUHlUeXBlX0dlbmVyaWNBbGxvYywJCQkvKiB0cF9hbGxvYyAqLwotCWFycmF5X25ldywJCQkJLyogdHBfbmV3ICovCi0JUHlPYmplY3RfRGVsLAkJCQkvKiB0cF9mcmVlICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisgICAgImFycmF5LmFycmF5IiwKKyAgICBzaXplb2YoYXJyYXlvYmplY3QpLAorICAgIDAsCisgICAgKGRlc3RydWN0b3IpYXJyYXlfZGVhbGxvYywgICAgICAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIChyZXByZnVuYylhcnJheV9yZXByLCAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyKi8KKyAgICAmYXJyYXlfYXNfc2VxdWVuY2UsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlKi8KKyAgICAmYXJyYXlfYXNfbWFwcGluZywgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAmYXJyYXlfYXNfYnVmZmVyLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19CQVNFVFlQRSB8IFB5X1RQRkxBR1NfSEFWRV9XRUFLUkVGUywgIC8qIHRwX2ZsYWdzICovCisgICAgYXJyYXl0eXBlX2RvYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIGFycmF5X3JpY2hjb21wYXJlLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICBvZmZzZXRvZihhcnJheW9iamVjdCwgd2Vha3JlZmxpc3QpLCAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgKGdldGl0ZXJmdW5jKWFycmF5X2l0ZXIsICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIGFycmF5X21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIGFycmF5X2dldHNldHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIFB5VHlwZV9HZW5lcmljQWxsb2MsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBhcnJheV9uZXcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworICAgIFB5T2JqZWN0X0RlbCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKiogQXJyYXkgSXRlcmF0b3IgKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JUHlfc3NpemVfdAkJCWluZGV4OwotCWFycmF5b2JqZWN0CQkqYW87Ci0JUHlPYmplY3QJCSogKCpnZXRpdGVtKShzdHJ1Y3QgYXJyYXlvYmplY3QgKiwgUHlfc3NpemVfdCk7CisgICAgUHlPYmplY3RfSEVBRAorICAgIFB5X3NzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4OworICAgIGFycmF5b2JqZWN0ICAgICAgICAgICAgICAgICAqYW87CisgICAgUHlPYmplY3QgICAgICAgICAgICAgICAgICAgICogKCpnZXRpdGVtKShzdHJ1Y3QgYXJyYXlvYmplY3QgKiwgUHlfc3NpemVfdCk7CiB9IGFycmF5aXRlcm9iamVjdDsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBQeUFycmF5SXRlcl9UeXBlOwpAQCAtMjEzOSw3OSArMjEzOSw3OSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGFycmF5X2l0ZXIoYXJyYXlvYmplY3QgKmFvKQogewotCWFycmF5aXRlcm9iamVjdCAqaXQ7CisgICAgYXJyYXlpdGVyb2JqZWN0ICppdDsKIAotCWlmICghYXJyYXlfQ2hlY2soYW8pKSB7Ci0JCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKCFhcnJheV9DaGVjayhhbykpIHsKKyAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWl0ID0gUHlPYmplY3RfR0NfTmV3KGFycmF5aXRlcm9iamVjdCwgJlB5QXJyYXlJdGVyX1R5cGUpOwotCWlmIChpdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpdCA9IFB5T2JqZWN0X0dDX05ldyhhcnJheWl0ZXJvYmplY3QsICZQeUFycmF5SXRlcl9UeXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlQeV9JTkNSRUYoYW8pOwotCWl0LT5hbyA9IGFvOwotCWl0LT5pbmRleCA9IDA7Ci0JaXQtPmdldGl0ZW0gPSBhby0+b2JfZGVzY3ItPmdldGl0ZW07Ci0JUHlPYmplY3RfR0NfVHJhY2soaXQpOwotCXJldHVybiAoUHlPYmplY3QgKilpdDsKKyAgICBQeV9JTkNSRUYoYW8pOworICAgIGl0LT5hbyA9IGFvOworICAgIGl0LT5pbmRleCA9IDA7CisgICAgaXQtPmdldGl0ZW0gPSBhby0+b2JfZGVzY3ItPmdldGl0ZW07CisgICAgUHlPYmplY3RfR0NfVHJhY2soaXQpOworICAgIHJldHVybiAoUHlPYmplY3QgKilpdDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGFycmF5aXRlcl9uZXh0KGFycmF5aXRlcm9iamVjdCAqaXQpCiB7Ci0JYXNzZXJ0KFB5QXJyYXlJdGVyX0NoZWNrKGl0KSk7Ci0JaWYgKGl0LT5pbmRleCA8IFB5X1NJWkUoaXQtPmFvKSkKLQkJcmV0dXJuICgqaXQtPmdldGl0ZW0pKGl0LT5hbywgaXQtPmluZGV4KyspOwotCXJldHVybiBOVUxMOworICAgIGFzc2VydChQeUFycmF5SXRlcl9DaGVjayhpdCkpOworICAgIGlmIChpdC0+aW5kZXggPCBQeV9TSVpFKGl0LT5hbykpCisgICAgICAgIHJldHVybiAoKml0LT5nZXRpdGVtKShpdC0+YW8sIGl0LT5pbmRleCsrKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIHZvaWQKIGFycmF5aXRlcl9kZWFsbG9jKGFycmF5aXRlcm9iamVjdCAqaXQpCiB7Ci0JUHlPYmplY3RfR0NfVW5UcmFjayhpdCk7Ci0JUHlfWERFQ1JFRihpdC0+YW8pOwotCVB5T2JqZWN0X0dDX0RlbChpdCk7CisgICAgUHlPYmplY3RfR0NfVW5UcmFjayhpdCk7CisgICAgUHlfWERFQ1JFRihpdC0+YW8pOworICAgIFB5T2JqZWN0X0dDX0RlbChpdCk7CiB9CiAKIHN0YXRpYyBpbnQKIGFycmF5aXRlcl90cmF2ZXJzZShhcnJheWl0ZXJvYmplY3QgKml0LCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlQeV9WSVNJVChpdC0+YW8pOwotCXJldHVybiAwOworICAgIFB5X1ZJU0lUKGl0LT5hbyk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgUHlBcnJheUl0ZXJfVHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKLQkiYXJyYXlpdGVyYXRvciIsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLwotCXNpemVvZihhcnJheWl0ZXJvYmplY3QpLCAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpYXJyYXlpdGVyX2RlYWxsb2MsCQkvKiB0cF9kZWFsbG9jICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsLyogdHBfZmxhZ3MgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCi0JKHRyYXZlcnNlcHJvYylhcnJheWl0ZXJfdHJhdmVyc2UsCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJCS8qIHRwX2NsZWFyICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JUHlPYmplY3RfU2VsZkl0ZXIsCQkJLyogdHBfaXRlciAqLwotCShpdGVybmV4dGZ1bmMpYXJyYXlpdGVyX25leHQsCQkvKiB0cF9pdGVybmV4dCAqLwotCTAsCQkJCQkvKiB0cF9tZXRob2RzICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisgICAgImFycmF5aXRlcmF0b3IiLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICBzaXplb2YoYXJyYXlpdGVyb2JqZWN0KSwgICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKWFycmF5aXRlcl9kZWFsbG9jLCAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDLC8qIHRwX2ZsYWdzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2MpYXJyYXlpdGVyX3RyYXZlcnNlLCAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgUHlPYmplY3RfU2VsZkl0ZXIsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgKGl0ZXJuZXh0ZnVuYylhcnJheWl0ZXJfbmV4dCwgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLwogfTsKIAogCkBAIC0yMjI2LDE3ICsyMjI2LDE3IEBACiBQeU1PRElOSVRfRlVOQwogaW5pdGFycmF5KHZvaWQpCiB7Ci0JUHlPYmplY3QgKm07CisgICAgUHlPYmplY3QgKm07CiAKLQlBcnJheXR5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKLQlQeUFycmF5SXRlcl9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7Ci0JbSA9IFB5X0luaXRNb2R1bGUzKCJhcnJheSIsIGFfbWV0aG9kcywgbW9kdWxlX2RvYyk7Ci0JaWYgKG0gPT0gTlVMTCkKLQkJcmV0dXJuOworICAgIEFycmF5dHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOworICAgIFB5QXJyYXlJdGVyX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBtID0gUHlfSW5pdE1vZHVsZTMoImFycmF5IiwgYV9tZXRob2RzLCBtb2R1bGVfZG9jKTsKKyAgICBpZiAobSA9PSBOVUxMKQorICAgICAgICByZXR1cm47CiAKLSAgICAgICAgUHlfSU5DUkVGKChQeU9iamVjdCAqKSZBcnJheXR5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiQXJyYXlUeXBlIiwgKFB5T2JqZWN0ICopJkFycmF5dHlwZSk7Ci0gICAgICAgIFB5X0lOQ1JFRigoUHlPYmplY3QgKikmQXJyYXl0eXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgImFycmF5IiwgKFB5T2JqZWN0ICopJkFycmF5dHlwZSk7Ci0JLyogTm8gbmVlZCB0byBjaGVjayB0aGUgZXJyb3IgaGVyZSwgdGhlIGNhbGxlciB3aWxsIGRvIHRoYXQgKi8KKyAgICBQeV9JTkNSRUYoKFB5T2JqZWN0ICopJkFycmF5dHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJBcnJheVR5cGUiLCAoUHlPYmplY3QgKikmQXJyYXl0eXBlKTsKKyAgICBQeV9JTkNSRUYoKFB5T2JqZWN0ICopJkFycmF5dHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJhcnJheSIsIChQeU9iamVjdCAqKSZBcnJheXR5cGUpOworICAgIC8qIE5vIG5lZWQgdG8gY2hlY2sgdGhlIGVycm9yIGhlcmUsIHRoZSBjYWxsZXIgd2lsbCBkbyB0aGF0ICovCiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL2F1ZGlvb3AuYyBiL01vZHVsZXMvYXVkaW9vcC5jCmluZGV4IDc2N2NhZTYuLmUxZjgyODQgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvYXVkaW9vcC5jCisrKyBiL01vZHVsZXMvYXVkaW9vcC5jCkBAIC01MywxMyArNTMsMTMgQEAKIHN0YXRpYyBQeUludDE2CiBzZWFyY2goUHlJbnQxNiB2YWwsIFB5SW50MTYgKnRhYmxlLCBpbnQgc2l6ZSkKIHsKLSAgICAgICAgaW50IGk7CisgICAgaW50IGk7CiAKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgICAgIGlmICh2YWwgPD0gKnRhYmxlKyspCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAoc2l6ZSk7CisgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICBpZiAodmFsIDw9ICp0YWJsZSsrKQorICAgICAgICAgICAgcmV0dXJuIChpKTsKKyAgICB9CisgICAgcmV0dXJuIChzaXplKTsKIH0KICNkZWZpbmUgc3RfdWxhdzJsaW5lYXIxNih1YykgKF9zdF91bGF3MmxpbmVhcjE2W3VjXSkKICNkZWZpbmUgc3RfYWxhdzJsaW5lYXIxNih1YykgKF9zdF9hbGF3MmxpbmVhcjE2W3VjXSkKQEAgLTgzLDcgKzgzLDcgQEAKICAgICAgIC0yMjgsICAgIC0yMTIsICAgIC0xOTYsICAgIC0xODAsICAgIC0xNjQsICAgIC0xNDgsICAgIC0xMzIsCiAgICAgICAtMTIwLCAgICAtMTEyLCAgICAtMTA0LCAgICAgLTk2LCAgICAgLTg4LCAgICAgLTgwLCAgICAgLTcyLAogICAgICAgIC02NCwgICAgIC01NiwgICAgIC00OCwgICAgIC00MCwgICAgIC0zMiwgICAgIC0yNCwgICAgIC0xNiwKLSAgICAgICAgLTgsICAgICAgIDAsICAgMzIxMjQsICAgMzExMDAsICAgMzAwNzYsICAgMjkwNTIsICAgMjgwMjgsCisgICAgLTgsICAgICAgIDAsICAgMzIxMjQsICAgMzExMDAsICAgMzAwNzYsICAgMjkwNTIsICAgMjgwMjgsCiAgICAgIDI3MDA0LCAgIDI1OTgwLCAgIDI0OTU2LCAgIDIzOTMyLCAgIDIyOTA4LCAgIDIxODg0LCAgIDIwODYwLAogICAgICAxOTgzNiwgICAxODgxMiwgICAxNzc4OCwgICAxNjc2NCwgICAxNTk5NiwgICAxNTQ4NCwgICAxNDk3MiwKICAgICAgMTQ0NjAsICAgMTM5NDgsICAgMTM0MzYsICAgMTI5MjQsICAgMTI0MTIsICAgMTE5MDAsICAgMTEzODgsCkBAIC0xMDAsOCArMTAwLDggQEAKICAgICAgICAzNzIsICAgICAzNTYsICAgICAzNDAsICAgICAzMjQsICAgICAzMDgsICAgICAyOTIsICAgICAyNzYsCiAgICAgICAgMjYwLCAgICAgMjQ0LCAgICAgMjI4LCAgICAgMjEyLCAgICAgMTk2LCAgICAgMTgwLCAgICAgMTY0LAogICAgICAgIDE0OCwgICAgIDEzMiwgICAgIDEyMCwgICAgIDExMiwgICAgIDEwNCwgICAgICA5NiwgICAgICA4OCwKLSAgICAgICAgODAsICAgICAgNzIsICAgICAgNjQsICAgICAgNTYsICAgICAgNDgsICAgICAgNDAsICAgICAgMzIsCi0gICAgICAgIDI0LCAgICAgIDE2LCAgICAgICA4LCAgICAgICAwCisgICAgODAsICAgICAgNzIsICAgICAgNjQsICAgICAgNTYsICAgICAgNDgsICAgICAgNDAsICAgICAgMzIsCisgICAgMjQsICAgICAgMTYsICAgICAgIDgsICAgICAgIDAKIH07CiAKIC8qCkBAIC0xMzcsMzkgKzEzNywzOSBAQAogICogSm9obiBXaWxleSAmIFNvbnMsIHBwcyA5OC0xMTEgYW5kIDQ3Mi00NzYuCiAgKi8KIHN0YXRpYyB1bnNpZ25lZCBjaGFyCi1zdF8xNGxpbmVhcjJ1bGF3KFB5SW50MTYgcGNtX3ZhbCkJLyogMidzIGNvbXBsZW1lbnQgKDE0LWJpdCByYW5nZSkgKi8KK3N0XzE0bGluZWFyMnVsYXcoUHlJbnQxNiBwY21fdmFsKSAgICAgICAvKiAyJ3MgY29tcGxlbWVudCAoMTQtYml0IHJhbmdlKSAqLwogewotICAgICAgICBQeUludDE2ICAgICAgICAgbWFzazsKLSAgICAgICAgUHlJbnQxNiAgICAgICAgIHNlZzsKLSAgICAgICAgdW5zaWduZWQgY2hhciAgIHV2YWw7CisgICAgUHlJbnQxNiAgICAgICAgIG1hc2s7CisgICAgUHlJbnQxNiAgICAgICAgIHNlZzsKKyAgICB1bnNpZ25lZCBjaGFyICAgdXZhbDsKIAotICAgICAgICAvKiBUaGUgb3JpZ2luYWwgc294IGNvZGUgZG9lcyB0aGlzIGluIHRoZSBjYWxsaW5nIGZ1bmN0aW9uLCBub3QgaGVyZSAqLwotICAgICAgICBwY21fdmFsID0gcGNtX3ZhbCA+PiAyOworICAgIC8qIFRoZSBvcmlnaW5hbCBzb3ggY29kZSBkb2VzIHRoaXMgaW4gdGhlIGNhbGxpbmcgZnVuY3Rpb24sIG5vdCBoZXJlICovCisgICAgcGNtX3ZhbCA9IHBjbV92YWwgPj4gMjsKIAotICAgICAgICAvKiB1LWxhdyBpbnZlcnRzIGFsbCBiaXRzICovCi0gICAgICAgIC8qIEdldCB0aGUgc2lnbiBhbmQgdGhlIG1hZ25pdHVkZSBvZiB0aGUgdmFsdWUuICovCi0gICAgICAgIGlmIChwY21fdmFsIDwgMCkgewotICAgICAgICAgICAgICAgIHBjbV92YWwgPSAtcGNtX3ZhbDsKLSAgICAgICAgICAgICAgICBtYXNrID0gMHg3RjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtYXNrID0gMHhGRjsKLSAgICAgICAgfQotICAgICAgICBpZiAoIHBjbV92YWwgPiBDTElQICkgcGNtX3ZhbCA9IENMSVA7ICAgICAgICAgICAvKiBjbGlwIHRoZSBtYWduaXR1ZGUgKi8KLSAgICAgICAgcGNtX3ZhbCArPSAoQklBUyA+PiAyKTsKKyAgICAvKiB1LWxhdyBpbnZlcnRzIGFsbCBiaXRzICovCisgICAgLyogR2V0IHRoZSBzaWduIGFuZCB0aGUgbWFnbml0dWRlIG9mIHRoZSB2YWx1ZS4gKi8KKyAgICBpZiAocGNtX3ZhbCA8IDApIHsKKyAgICAgICAgcGNtX3ZhbCA9IC1wY21fdmFsOworICAgICAgICBtYXNrID0gMHg3RjsKKyAgICB9IGVsc2UgeworICAgICAgICBtYXNrID0gMHhGRjsKKyAgICB9CisgICAgaWYgKCBwY21fdmFsID4gQ0xJUCApIHBjbV92YWwgPSBDTElQOyAgICAgICAgICAgLyogY2xpcCB0aGUgbWFnbml0dWRlICovCisgICAgcGNtX3ZhbCArPSAoQklBUyA+PiAyKTsKIAotICAgICAgICAvKiBDb252ZXJ0IHRoZSBzY2FsZWQgbWFnbml0dWRlIHRvIHNlZ21lbnQgbnVtYmVyLiAqLwotICAgICAgICBzZWcgPSBzZWFyY2gocGNtX3ZhbCwgc2VnX3VlbmQsIDgpOworICAgIC8qIENvbnZlcnQgdGhlIHNjYWxlZCBtYWduaXR1ZGUgdG8gc2VnbWVudCBudW1iZXIuICovCisgICAgc2VnID0gc2VhcmNoKHBjbV92YWwsIHNlZ191ZW5kLCA4KTsKIAotICAgICAgICAvKgotICAgICAgICAgKiBDb21iaW5lIHRoZSBzaWduLCBzZWdtZW50LCBxdWFudGl6YXRpb24gYml0czsKLSAgICAgICAgICogYW5kIGNvbXBsZW1lbnQgdGhlIGNvZGUgd29yZC4KLSAgICAgICAgICovCi0gICAgICAgIGlmIChzZWcgPj0gOCkgICAgICAgICAgIC8qIG91dCBvZiByYW5nZSwgcmV0dXJuIG1heGltdW0gdmFsdWUuICovCi0gICAgICAgICAgICAgICAgcmV0dXJuICh1bnNpZ25lZCBjaGFyKSAoMHg3RiBeIG1hc2spOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICB1dmFsID0gKHVuc2lnbmVkIGNoYXIpIChzZWcgPDwgNCkgfCAoKHBjbV92YWwgPj4gKHNlZyArIDEpKSAmIDB4Rik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICh1dmFsIF4gbWFzayk7Ci0gICAgICAgIH0KKyAgICAvKgorICAgICAqIENvbWJpbmUgdGhlIHNpZ24sIHNlZ21lbnQsIHF1YW50aXphdGlvbiBiaXRzOworICAgICAqIGFuZCBjb21wbGVtZW50IHRoZSBjb2RlIHdvcmQuCisgICAgICovCisgICAgaWYgKHNlZyA+PSA4KSAgICAgICAgICAgLyogb3V0IG9mIHJhbmdlLCByZXR1cm4gbWF4aW11bSB2YWx1ZS4gKi8KKyAgICAgICAgcmV0dXJuICh1bnNpZ25lZCBjaGFyKSAoMHg3RiBeIG1hc2spOworICAgIGVsc2UgeworICAgICAgICB1dmFsID0gKHVuc2lnbmVkIGNoYXIpIChzZWcgPDwgNCkgfCAoKHBjbV92YWwgPj4gKHNlZyArIDEpKSAmIDB4Rik7CisgICAgICAgIHJldHVybiAodXZhbCBeIG1hc2spOworICAgIH0KIAogfQogCkBAIC0yMzQsNTkgKzIzNCw1OSBAQAogICogSm9obiBXaWxleSAmIFNvbnMsIHBwcyA5OC0xMTEgYW5kIDQ3Mi00NzYuCiAgKi8KIHN0YXRpYyB1bnNpZ25lZCBjaGFyCi1zdF9saW5lYXIyYWxhdyhQeUludDE2IHBjbV92YWwpCS8qIDIncyBjb21wbGVtZW50ICgxMy1iaXQgcmFuZ2UpICovCitzdF9saW5lYXIyYWxhdyhQeUludDE2IHBjbV92YWwpIC8qIDIncyBjb21wbGVtZW50ICgxMy1iaXQgcmFuZ2UpICovCiB7Ci0gICAgICAgIFB5SW50MTYgICAgICAgICBtYXNrOwotICAgICAgICBzaG9ydCAgICAgICAgICAgc2VnOwotICAgICAgICB1bnNpZ25lZCBjaGFyICAgYXZhbDsKKyAgICBQeUludDE2ICAgICAgICAgbWFzazsKKyAgICBzaG9ydCAgICAgICAgICAgc2VnOworICAgIHVuc2lnbmVkIGNoYXIgICBhdmFsOwogCi0gICAgICAgIC8qIFRoZSBvcmlnaW5hbCBzb3ggY29kZSBkb2VzIHRoaXMgaW4gdGhlIGNhbGxpbmcgZnVuY3Rpb24sIG5vdCBoZXJlICovCi0gICAgICAgIHBjbV92YWwgPSBwY21fdmFsID4+IDM7CisgICAgLyogVGhlIG9yaWdpbmFsIHNveCBjb2RlIGRvZXMgdGhpcyBpbiB0aGUgY2FsbGluZyBmdW5jdGlvbiwgbm90IGhlcmUgKi8KKyAgICBwY21fdmFsID0gcGNtX3ZhbCA+PiAzOwogCi0gICAgICAgIC8qIEEtbGF3IHVzaW5nIGV2ZW4gYml0IGludmVyc2lvbiAqLwotICAgICAgICBpZiAocGNtX3ZhbCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgbWFzayA9IDB4RDU7ICAgICAgICAgICAgLyogc2lnbiAoN3RoKSBiaXQgPSAxICovCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbWFzayA9IDB4NTU7ICAgICAgICAgICAgLyogc2lnbiBiaXQgPSAwICovCi0gICAgICAgICAgICAgICAgcGNtX3ZhbCA9IC1wY21fdmFsIC0gMTsKLSAgICAgICAgfQorICAgIC8qIEEtbGF3IHVzaW5nIGV2ZW4gYml0IGludmVyc2lvbiAqLworICAgIGlmIChwY21fdmFsID49IDApIHsKKyAgICAgICAgbWFzayA9IDB4RDU7ICAgICAgICAgICAgLyogc2lnbiAoN3RoKSBiaXQgPSAxICovCisgICAgfSBlbHNlIHsKKyAgICAgICAgbWFzayA9IDB4NTU7ICAgICAgICAgICAgLyogc2lnbiBiaXQgPSAwICovCisgICAgICAgIHBjbV92YWwgPSAtcGNtX3ZhbCAtIDE7CisgICAgfQogCi0gICAgICAgIC8qIENvbnZlcnQgdGhlIHNjYWxlZCBtYWduaXR1ZGUgdG8gc2VnbWVudCBudW1iZXIuICovCi0gICAgICAgIHNlZyA9IHNlYXJjaChwY21fdmFsLCBzZWdfYWVuZCwgOCk7CisgICAgLyogQ29udmVydCB0aGUgc2NhbGVkIG1hZ25pdHVkZSB0byBzZWdtZW50IG51bWJlci4gKi8KKyAgICBzZWcgPSBzZWFyY2gocGNtX3ZhbCwgc2VnX2FlbmQsIDgpOwogCi0gICAgICAgIC8qIENvbWJpbmUgdGhlIHNpZ24sIHNlZ21lbnQsIGFuZCBxdWFudGl6YXRpb24gYml0cy4gKi8KKyAgICAvKiBDb21iaW5lIHRoZSBzaWduLCBzZWdtZW50LCBhbmQgcXVhbnRpemF0aW9uIGJpdHMuICovCiAKLSAgICAgICAgaWYgKHNlZyA+PSA4KSAgICAgICAgICAgLyogb3V0IG9mIHJhbmdlLCByZXR1cm4gbWF4aW11bSB2YWx1ZS4gKi8KLSAgICAgICAgICAgICAgICByZXR1cm4gKHVuc2lnbmVkIGNoYXIpICgweDdGIF4gbWFzayk7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGF2YWwgPSAodW5zaWduZWQgY2hhcikgc2VnIDw8IFNFR19TSElGVDsKLSAgICAgICAgICAgICAgICBpZiAoc2VnIDwgMikKLSAgICAgICAgICAgICAgICAgICAgICAgIGF2YWwgfD0gKHBjbV92YWwgPj4gMSkgJiBRVUFOVF9NQVNLOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIGF2YWwgfD0gKHBjbV92YWwgPj4gc2VnKSAmIFFVQU5UX01BU0s7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChhdmFsIF4gbWFzayk7Ci0gICAgICAgIH0KKyAgICBpZiAoc2VnID49IDgpICAgICAgICAgICAvKiBvdXQgb2YgcmFuZ2UsIHJldHVybiBtYXhpbXVtIHZhbHVlLiAqLworICAgICAgICByZXR1cm4gKHVuc2lnbmVkIGNoYXIpICgweDdGIF4gbWFzayk7CisgICAgZWxzZSB7CisgICAgICAgIGF2YWwgPSAodW5zaWduZWQgY2hhcikgc2VnIDw8IFNFR19TSElGVDsKKyAgICAgICAgaWYgKHNlZyA8IDIpCisgICAgICAgICAgICBhdmFsIHw9IChwY21fdmFsID4+IDEpICYgUVVBTlRfTUFTSzsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYXZhbCB8PSAocGNtX3ZhbCA+PiBzZWcpICYgUVVBTlRfTUFTSzsKKyAgICAgICAgcmV0dXJuIChhdmFsIF4gbWFzayk7CisgICAgfQogfQogLyogRW5kIG9mIGNvZGUgdGFrZW4gZnJvbSBzb3ggKi8KIAogLyogSW50ZWwgQURQQ00gc3RlcCB2YXJpYXRpb24gdGFibGUgKi8KIHN0YXRpYyBpbnQgaW5kZXhUYWJsZVsxNl0gPSB7Ci0gICAgICAgIC0xLCAtMSwgLTEsIC0xLCAyLCA0LCA2LCA4LAotICAgICAgICAtMSwgLTEsIC0xLCAtMSwgMiwgNCwgNiwgOCwKKyAgICAtMSwgLTEsIC0xLCAtMSwgMiwgNCwgNiwgOCwKKyAgICAtMSwgLTEsIC0xLCAtMSwgMiwgNCwgNiwgOCwKIH07CiAKIHN0YXRpYyBpbnQgc3RlcHNpemVUYWJsZVs4OV0gPSB7Ci0gICAgICAgIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTYsIDE3LAotICAgICAgICAxOSwgMjEsIDIzLCAyNSwgMjgsIDMxLCAzNCwgMzcsIDQxLCA0NSwKLSAgICAgICAgNTAsIDU1LCA2MCwgNjYsIDczLCA4MCwgODgsIDk3LCAxMDcsIDExOCwKLSAgICAgICAgMTMwLCAxNDMsIDE1NywgMTczLCAxOTAsIDIwOSwgMjMwLCAyNTMsIDI3OSwgMzA3LAotICAgICAgICAzMzcsIDM3MSwgNDA4LCA0NDksIDQ5NCwgNTQ0LCA1OTgsIDY1OCwgNzI0LCA3OTYsCi0gICAgICAgIDg3NiwgOTYzLCAxMDYwLCAxMTY2LCAxMjgyLCAxNDExLCAxNTUyLCAxNzA3LCAxODc4LCAyMDY2LAotICAgICAgICAyMjcyLCAyNDk5LCAyNzQ5LCAzMDI0LCAzMzI3LCAzNjYwLCA0MDI2LCA0NDI4LCA0ODcxLCA1MzU4LAotICAgICAgICA1ODk0LCA2NDg0LCA3MTMyLCA3ODQ1LCA4NjMwLCA5NDkzLCAxMDQ0MiwgMTE0ODcsIDEyNjM1LCAxMzg5OSwKLSAgICAgICAgMTUyODksIDE2ODE4LCAxODUwMCwgMjAzNTAsIDIyMzg1LCAyNDYyMywgMjcwODYsIDI5Nzk0LCAzMjc2NworICAgIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTYsIDE3LAorICAgIDE5LCAyMSwgMjMsIDI1LCAyOCwgMzEsIDM0LCAzNywgNDEsIDQ1LAorICAgIDUwLCA1NSwgNjAsIDY2LCA3MywgODAsIDg4LCA5NywgMTA3LCAxMTgsCisgICAgMTMwLCAxNDMsIDE1NywgMTczLCAxOTAsIDIwOSwgMjMwLCAyNTMsIDI3OSwgMzA3LAorICAgIDMzNywgMzcxLCA0MDgsIDQ0OSwgNDk0LCA1NDQsIDU5OCwgNjU4LCA3MjQsIDc5NiwKKyAgICA4NzYsIDk2MywgMTA2MCwgMTE2NiwgMTI4MiwgMTQxMSwgMTU1MiwgMTcwNywgMTg3OCwgMjA2NiwKKyAgICAyMjcyLCAyNDk5LCAyNzQ5LCAzMDI0LCAzMzI3LCAzNjYwLCA0MDI2LCA0NDI4LCA0ODcxLCA1MzU4LAorICAgIDU4OTQsIDY0ODQsIDcxMzIsIDc4NDUsIDg2MzAsIDk0OTMsIDEwNDQyLCAxMTQ4NywgMTI2MzUsIDEzODk5LAorICAgIDE1Mjg5LCAxNjgxOCwgMTg1MDAsIDIwMzUwLCAyMjM4NSwgMjQ2MjMsIDI3MDg2LCAyOTc5NCwgMzI3NjcKIH07Ci0gICAgCisKICNkZWZpbmUgQ0hBUlAoY3AsIGkpICgoc2lnbmVkIGNoYXIgKikoY3AraSkpCiAjZGVmaW5lIFNIT1JUUChjcCwgaSkgKChzaG9ydCAqKShjcCtpKSkKICNkZWZpbmUgTE9OR1AoY3AsIGkpICgoUHlfSW50MzIgKikoY3AraSkpCkBAIC0yOTgsMTM3ICsyOTgsMTM3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYXVkaW9vcF9nZXRzYW1wbGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotICAgICAgICBzaWduZWQgY2hhciAqY3A7Ci0gICAgICAgIGludCBsZW4sIHNpemUsIHZhbCA9IDA7Ci0gICAgICAgIGludCBpOworICAgIHNpZ25lZCBjaGFyICpjcDsKKyAgICBpbnQgbGVuLCBzaXplLCB2YWwgPSAwOworICAgIGludCBpOwogCi0gICAgICAgIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjaWk6Z2V0c2FtcGxlIiwgJmNwLCAmbGVuLCAmc2l6ZSwgJmkpICkKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgaWYgKCBzaXplICE9IDEgJiYgc2l6ZSAhPSAyICYmIHNpemUgIT0gNCApIHsKLSAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCBpIDwgMCB8fCBpID49IGxlbi9zaXplICkgewotICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJJbmRleCBvdXQgb2YgcmFuZ2UiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgdmFsID0gKGludCkqQ0hBUlAoY3AsIGkpOwotICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgdmFsID0gKGludCkqU0hPUlRQKGNwLCBpKjIpOwotICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgdmFsID0gKGludCkqTE9OR1AoY3AsIGkqNCk7Ci0gICAgICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyh2YWwpOworICAgIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjaWk6Z2V0c2FtcGxlIiwgJmNwLCAmbGVuLCAmc2l6ZSwgJmkpICkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKCBzaXplICE9IDEgJiYgc2l6ZSAhPSAyICYmIHNpemUgIT0gNCApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKCBpIDwgMCB8fCBpID49IGxlbi9zaXplICkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiSW5kZXggb3V0IG9mIHJhbmdlIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoIHNpemUgPT0gMSApICAgICAgdmFsID0gKGludCkqQ0hBUlAoY3AsIGkpOworICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSB2YWwgPSAoaW50KSpTSE9SVFAoY3AsIGkqMik7CisgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbCA9IChpbnQpKkxPTkdQKGNwLCBpKjQpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyh2YWwpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYXVkaW9vcF9tYXgoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotICAgICAgICBzaWduZWQgY2hhciAqY3A7Ci0gICAgICAgIGludCBsZW4sIHNpemUsIHZhbCA9IDA7Ci0gICAgICAgIGludCBpOwotICAgICAgICBpbnQgbWF4ID0gMDsKKyAgICBzaWduZWQgY2hhciAqY3A7CisgICAgaW50IGxlbiwgc2l6ZSwgdmFsID0gMDsKKyAgICBpbnQgaTsKKyAgICBpbnQgbWF4ID0gMDsKIAotICAgICAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI2k6bWF4IiwgJmNwLCAmbGVuLCAmc2l6ZSkgKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICBpZiAoIHNpemUgIT0gMSAmJiBzaXplICE9IDIgJiYgc2l6ZSAhPSA0ICkgewotICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJTaXplIHNob3VsZCBiZSAxLCAyIG9yIDQiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBmb3IgKCBpPTA7IGk8bGVuOyBpKz0gc2l6ZSkgewotICAgICAgICAgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICB2YWwgPSAoaW50KSpDSEFSUChjcCwgaSk7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbCA9IChpbnQpKlNIT1JUUChjcCwgaSk7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbCA9IChpbnQpKkxPTkdQKGNwLCBpKTsKLSAgICAgICAgICAgICAgICBpZiAoIHZhbCA8IDAgKSB2YWwgPSAoLXZhbCk7Ci0gICAgICAgICAgICAgICAgaWYgKCB2YWwgPiBtYXggKSBtYXggPSB2YWw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKG1heCk7CisgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyNpOm1heCIsICZjcCwgJmxlbiwgJnNpemUpICkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKCBzaXplICE9IDEgJiYgc2l6ZSAhPSAyICYmIHNpemUgIT0gNCApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZm9yICggaT0wOyBpPGxlbjsgaSs9IHNpemUpIHsKKyAgICAgICAgaWYgKCBzaXplID09IDEgKSAgICAgIHZhbCA9IChpbnQpKkNIQVJQKGNwLCBpKTsKKyAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbCA9IChpbnQpKlNIT1JUUChjcCwgaSk7CisgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSB2YWwgPSAoaW50KSpMT05HUChjcCwgaSk7CisgICAgICAgIGlmICggdmFsIDwgMCApIHZhbCA9ICgtdmFsKTsKKyAgICAgICAgaWYgKCB2YWwgPiBtYXggKSBtYXggPSB2YWw7CisgICAgfQorICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhtYXgpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYXVkaW9vcF9taW5tYXgoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotICAgICAgICBzaWduZWQgY2hhciAqY3A7Ci0gICAgICAgIGludCBsZW4sIHNpemUsIHZhbCA9IDA7Ci0gICAgICAgIGludCBpOwotICAgICAgICBpbnQgbWluID0gMHg3ZmZmZmZmZiwgbWF4ID0gLTB4N2ZmZmZmZmY7CisgICAgc2lnbmVkIGNoYXIgKmNwOworICAgIGludCBsZW4sIHNpemUsIHZhbCA9IDA7CisgICAgaW50IGk7CisgICAgaW50IG1pbiA9IDB4N2ZmZmZmZmYsIG1heCA9IC0weDdmZmZmZmZmOwogCi0gICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyNpOm1pbm1heCIsICZjcCwgJmxlbiwgJnNpemUpKQotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICBpZiAoc2l6ZSAhPSAxICYmIHNpemUgIT0gMiAmJiBzaXplICE9IDQpIHsKLSAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSArPSBzaXplKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNpemUgPT0gMSkgdmFsID0gKGludCkgKkNIQVJQKGNwLCBpKTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChzaXplID09IDIpIHZhbCA9IChpbnQpICpTSE9SVFAoY3AsIGkpOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNpemUgPT0gNCkgdmFsID0gKGludCkgKkxPTkdQKGNwLCBpKTsKLSAgICAgICAgICAgICAgICBpZiAodmFsID4gbWF4KSBtYXggPSB2YWw7Ci0gICAgICAgICAgICAgICAgaWYgKHZhbCA8IG1pbikgbWluID0gdmFsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIoaWkpIiwgbWluLCBtYXgpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyNpOm1pbm1heCIsICZjcCwgJmxlbiwgJnNpemUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoc2l6ZSAhPSAxICYmIHNpemUgIT0gMiAmJiBzaXplICE9IDQpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSArPSBzaXplKSB7CisgICAgICAgIGlmIChzaXplID09IDEpIHZhbCA9IChpbnQpICpDSEFSUChjcCwgaSk7CisgICAgICAgIGVsc2UgaWYgKHNpemUgPT0gMikgdmFsID0gKGludCkgKlNIT1JUUChjcCwgaSk7CisgICAgICAgIGVsc2UgaWYgKHNpemUgPT0gNCkgdmFsID0gKGludCkgKkxPTkdQKGNwLCBpKTsKKyAgICAgICAgaWYgKHZhbCA+IG1heCkgbWF4ID0gdmFsOworICAgICAgICBpZiAodmFsIDwgbWluKSBtaW4gPSB2YWw7CisgICAgfQorICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIoaWkpIiwgbWluLCBtYXgpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYXVkaW9vcF9hdmcoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotICAgICAgICBzaWduZWQgY2hhciAqY3A7Ci0gICAgICAgIGludCBsZW4sIHNpemUsIHZhbCA9IDA7Ci0gICAgICAgIGludCBpOwotICAgICAgICBkb3VibGUgYXZnID0gMC4wOworICAgIHNpZ25lZCBjaGFyICpjcDsKKyAgICBpbnQgbGVuLCBzaXplLCB2YWwgPSAwOworICAgIGludCBpOworICAgIGRvdWJsZSBhdmcgPSAwLjA7CiAKLSAgICAgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyNpOmF2ZyIsICZjcCwgJmxlbiwgJnNpemUpICkKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgaWYgKCBzaXplICE9IDEgJiYgc2l6ZSAhPSAyICYmIHNpemUgIT0gNCApIHsKLSAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yICggaT0wOyBpPGxlbjsgaSs9IHNpemUpIHsKLSAgICAgICAgICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgdmFsID0gKGludCkqQ0hBUlAoY3AsIGkpOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSB2YWwgPSAoaW50KSpTSE9SVFAoY3AsIGkpOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSB2YWwgPSAoaW50KSpMT05HUChjcCwgaSk7Ci0gICAgICAgICAgICAgICAgYXZnICs9IHZhbDsKLSAgICAgICAgfQotICAgICAgICBpZiAoIGxlbiA9PSAwICkKLSAgICAgICAgICAgICAgICB2YWwgPSAwOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgdmFsID0gKGludCkoYXZnIC8gKGRvdWJsZSkobGVuL3NpemUpKTsKLSAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHZhbCk7CisgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyNpOmF2ZyIsICZjcCwgJmxlbiwgJnNpemUpICkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKCBzaXplICE9IDEgJiYgc2l6ZSAhPSAyICYmIHNpemUgIT0gNCApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZm9yICggaT0wOyBpPGxlbjsgaSs9IHNpemUpIHsKKyAgICAgICAgaWYgKCBzaXplID09IDEgKSAgICAgIHZhbCA9IChpbnQpKkNIQVJQKGNwLCBpKTsKKyAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbCA9IChpbnQpKlNIT1JUUChjcCwgaSk7CisgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSB2YWwgPSAoaW50KSpMT05HUChjcCwgaSk7CisgICAgICAgIGF2ZyArPSB2YWw7CisgICAgfQorICAgIGlmICggbGVuID09IDAgKQorICAgICAgICB2YWwgPSAwOworICAgIGVsc2UKKyAgICAgICAgdmFsID0gKGludCkoYXZnIC8gKGRvdWJsZSkobGVuL3NpemUpKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcodmFsKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGF1ZGlvb3Bfcm1zKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLSAgICAgICAgc2lnbmVkIGNoYXIgKmNwOwotICAgICAgICBpbnQgbGVuLCBzaXplLCB2YWwgPSAwOwotICAgICAgICBpbnQgaTsKLSAgICAgICAgZG91YmxlIHN1bV9zcXVhcmVzID0gMC4wOworICAgIHNpZ25lZCBjaGFyICpjcDsKKyAgICBpbnQgbGVuLCBzaXplLCB2YWwgPSAwOworICAgIGludCBpOworICAgIGRvdWJsZSBzdW1fc3F1YXJlcyA9IDAuMDsKIAotICAgICAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI2k6cm1zIiwgJmNwLCAmbGVuLCAmc2l6ZSkgKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICBpZiAoIHNpemUgIT0gMSAmJiBzaXplICE9IDIgJiYgc2l6ZSAhPSA0ICkgewotICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJTaXplIHNob3VsZCBiZSAxLCAyIG9yIDQiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBmb3IgKCBpPTA7IGk8bGVuOyBpKz0gc2l6ZSkgewotICAgICAgICAgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICB2YWwgPSAoaW50KSpDSEFSUChjcCwgaSk7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbCA9IChpbnQpKlNIT1JUUChjcCwgaSk7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbCA9IChpbnQpKkxPTkdQKGNwLCBpKTsKLSAgICAgICAgICAgICAgICBzdW1fc3F1YXJlcyArPSAoZG91YmxlKXZhbCooZG91YmxlKXZhbDsKLSAgICAgICAgfQotICAgICAgICBpZiAoIGxlbiA9PSAwICkKLSAgICAgICAgICAgICAgICB2YWwgPSAwOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgdmFsID0gKGludClzcXJ0KHN1bV9zcXVhcmVzIC8gKGRvdWJsZSkobGVuL3NpemUpKTsKLSAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHZhbCk7CisgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyNpOnJtcyIsICZjcCwgJmxlbiwgJnNpemUpICkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKCBzaXplICE9IDEgJiYgc2l6ZSAhPSAyICYmIHNpemUgIT0gNCApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZm9yICggaT0wOyBpPGxlbjsgaSs9IHNpemUpIHsKKyAgICAgICAgaWYgKCBzaXplID09IDEgKSAgICAgIHZhbCA9IChpbnQpKkNIQVJQKGNwLCBpKTsKKyAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbCA9IChpbnQpKlNIT1JUUChjcCwgaSk7CisgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSB2YWwgPSAoaW50KSpMT05HUChjcCwgaSk7CisgICAgICAgIHN1bV9zcXVhcmVzICs9IChkb3VibGUpdmFsKihkb3VibGUpdmFsOworICAgIH0KKyAgICBpZiAoIGxlbiA9PSAwICkKKyAgICAgICAgdmFsID0gMDsKKyAgICBlbHNlCisgICAgICAgIHZhbCA9IChpbnQpc3FydChzdW1fc3F1YXJlcyAvIChkb3VibGUpKGxlbi9zaXplKSk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHZhbCk7CiB9CiAKIHN0YXRpYyBkb3VibGUgX3N1bTIoc2hvcnQgKmEsIHNob3J0ICpiLCBpbnQgbGVuKQogewotICAgICAgICBpbnQgaTsKLSAgICAgICAgZG91YmxlIHN1bSA9IDAuMDsKKyAgICBpbnQgaTsKKyAgICBkb3VibGUgc3VtID0gMC4wOwogCi0gICAgICAgIGZvciggaT0wOyBpPGxlbjsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgc3VtID0gc3VtICsgKGRvdWJsZSlhW2ldKihkb3VibGUpYltpXTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3VtOworICAgIGZvciggaT0wOyBpPGxlbjsgaSsrKSB7CisgICAgICAgIHN1bSA9IHN1bSArIChkb3VibGUpYVtpXSooZG91YmxlKWJbaV07CisgICAgfQorICAgIHJldHVybiBzdW07CiB9CiAKIC8qCkBAIC00NjYsNjAgKzQ2Niw2MCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGF1ZGlvb3BfZmluZGZpdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0gICAgICAgIHNob3J0ICpjcDEsICpjcDI7Ci0gICAgICAgIGludCBsZW4xLCBsZW4yOwotICAgICAgICBpbnQgaiwgYmVzdF9qOwotICAgICAgICBkb3VibGUgYWpfbTEsIGFqX2xtMTsKLSAgICAgICAgZG91YmxlIHN1bV9yaV8yLCBzdW1fYWlqXzIsIHN1bV9haWpfcmksIHJlc3VsdCwgYmVzdF9yZXN1bHQsIGZhY3RvcjsKKyAgICBzaG9ydCAqY3AxLCAqY3AyOworICAgIGludCBsZW4xLCBsZW4yOworICAgIGludCBqLCBiZXN0X2o7CisgICAgZG91YmxlIGFqX20xLCBhal9sbTE7CisgICAgZG91YmxlIHN1bV9yaV8yLCBzdW1fYWlqXzIsIHN1bV9haWpfcmksIHJlc3VsdCwgYmVzdF9yZXN1bHQsIGZhY3RvcjsKIAotCS8qIFBhc3NpbmcgYSBzaG9ydCoqIGZvciBhbiAncycgYXJndW1lbnQgaXMgY29ycmVjdCBvbmx5Ci0JICAgaWYgdGhlIHN0cmluZyBjb250ZW50cyBpcyBhbGlnbmVkIGZvciBpbnRlcnByZXRhdGlvbgotCSAgIGFzIHNob3J0W10uIER1ZSB0byB0aGUgZGVmaW5pdGlvbiBvZiBQeVN0cmluZ09iamVjdCwKLQkgICB0aGlzIGlzIGN1cnJlbnRseSAoUHl0aG9uIDIuNikgdGhlIGNhc2UuICovCi0gICAgICAgIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjcyM6ZmluZGZpdCIsCi0JICAgICAgICAgICAgICAgICAgICAgICAoY2hhcioqKSZjcDEsICZsZW4xLCAoY2hhcioqKSZjcDIsICZsZW4yKSApCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIGlmICggbGVuMSAmIDEgfHwgbGVuMiAmIDEgKSB7Ci0gICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlN0cmluZ3Mgc2hvdWxkIGJlIGV2ZW4tc2l6ZWQiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBsZW4xID4+PSAxOwotICAgICAgICBsZW4yID4+PSAxOwotICAgIAotICAgICAgICBpZiAoIGxlbjEgPCBsZW4yICkgewotICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJGaXJzdCBzYW1wbGUgc2hvdWxkIGJlIGxvbmdlciIpOwotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIHN1bV9yaV8yID0gX3N1bTIoY3AyLCBjcDIsIGxlbjIpOwotICAgICAgICBzdW1fYWlqXzIgPSBfc3VtMihjcDEsIGNwMSwgbGVuMik7Ci0gICAgICAgIHN1bV9haWpfcmkgPSBfc3VtMihjcDEsIGNwMiwgbGVuMik7CisgICAgLyogUGFzc2luZyBhIHNob3J0KiogZm9yIGFuICdzJyBhcmd1bWVudCBpcyBjb3JyZWN0IG9ubHkKKyAgICAgICBpZiB0aGUgc3RyaW5nIGNvbnRlbnRzIGlzIGFsaWduZWQgZm9yIGludGVycHJldGF0aW9uCisgICAgICAgYXMgc2hvcnRbXS4gRHVlIHRvIHRoZSBkZWZpbml0aW9uIG9mIFB5U3RyaW5nT2JqZWN0LAorICAgICAgIHRoaXMgaXMgY3VycmVudGx5IChQeXRob24gMi42KSB0aGUgY2FzZS4gKi8KKyAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI3MjOmZpbmRmaXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIqKikmY3AxLCAmbGVuMSwgKGNoYXIqKikmY3AyLCAmbGVuMikgKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoIGxlbjEgJiAxIHx8IGxlbjIgJiAxICkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU3RyaW5ncyBzaG91bGQgYmUgZXZlbi1zaXplZCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgbGVuMSA+Pj0gMTsKKyAgICBsZW4yID4+PSAxOwogCi0gICAgICAgIHJlc3VsdCA9IChzdW1fcmlfMipzdW1fYWlqXzIgLSBzdW1fYWlqX3JpKnN1bV9haWpfcmkpIC8gc3VtX2Fpal8yOworICAgIGlmICggbGVuMSA8IGxlbjIgKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJGaXJzdCBzYW1wbGUgc2hvdWxkIGJlIGxvbmdlciIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgc3VtX3JpXzIgPSBfc3VtMihjcDIsIGNwMiwgbGVuMik7CisgICAgc3VtX2Fpal8yID0gX3N1bTIoY3AxLCBjcDEsIGxlbjIpOworICAgIHN1bV9haWpfcmkgPSBfc3VtMihjcDEsIGNwMiwgbGVuMik7CiAKLSAgICAgICAgYmVzdF9yZXN1bHQgPSByZXN1bHQ7Ci0gICAgICAgIGJlc3RfaiA9IDA7Ci0gICAgICAgIGogPSAwOworICAgIHJlc3VsdCA9IChzdW1fcmlfMipzdW1fYWlqXzIgLSBzdW1fYWlqX3JpKnN1bV9haWpfcmkpIC8gc3VtX2Fpal8yOwogCi0gICAgICAgIGZvciAoIGo9MTsgajw9bGVuMS1sZW4yOyBqKyspIHsKLSAgICAgICAgICAgICAgICBhal9tMSA9IChkb3VibGUpY3AxW2otMV07Ci0gICAgICAgICAgICAgICAgYWpfbG0xID0gKGRvdWJsZSljcDFbaitsZW4yLTFdOworICAgIGJlc3RfcmVzdWx0ID0gcmVzdWx0OworICAgIGJlc3RfaiA9IDA7CisgICAgaiA9IDA7CiAKLSAgICAgICAgICAgICAgICBzdW1fYWlqXzIgPSBzdW1fYWlqXzIgKyBhal9sbTEqYWpfbG0xIC0gYWpfbTEqYWpfbTE7Ci0gICAgICAgICAgICAgICAgc3VtX2Fpal9yaSA9IF9zdW0yKGNwMStqLCBjcDIsIGxlbjIpOworICAgIGZvciAoIGo9MTsgajw9bGVuMS1sZW4yOyBqKyspIHsKKyAgICAgICAgYWpfbTEgPSAoZG91YmxlKWNwMVtqLTFdOworICAgICAgICBhal9sbTEgPSAoZG91YmxlKWNwMVtqK2xlbjItMV07CiAKLSAgICAgICAgICAgICAgICByZXN1bHQgPSAoc3VtX3JpXzIqc3VtX2Fpal8yIC0gc3VtX2Fpal9yaSpzdW1fYWlqX3JpKQotICAgICAgICAgICAgICAgICAgICAgICAgLyBzdW1fYWlqXzI7CisgICAgICAgIHN1bV9haWpfMiA9IHN1bV9haWpfMiArIGFqX2xtMSphal9sbTEgLSBhal9tMSphal9tMTsKKyAgICAgICAgc3VtX2Fpal9yaSA9IF9zdW0yKGNwMStqLCBjcDIsIGxlbjIpOwogCi0gICAgICAgICAgICAgICAgaWYgKCByZXN1bHQgPCBiZXN0X3Jlc3VsdCApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RfcmVzdWx0ID0gcmVzdWx0OwotICAgICAgICAgICAgICAgICAgICAgICAgYmVzdF9qID0gajsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIAorICAgICAgICByZXN1bHQgPSAoc3VtX3JpXzIqc3VtX2Fpal8yIC0gc3VtX2Fpal9yaSpzdW1fYWlqX3JpKQorICAgICAgICAgICAgLyBzdW1fYWlqXzI7CisKKyAgICAgICAgaWYgKCByZXN1bHQgPCBiZXN0X3Jlc3VsdCApIHsKKyAgICAgICAgICAgIGJlc3RfcmVzdWx0ID0gcmVzdWx0OworICAgICAgICAgICAgYmVzdF9qID0gajsKICAgICAgICAgfQogCi0gICAgICAgIGZhY3RvciA9IF9zdW0yKGNwMStiZXN0X2osIGNwMiwgbGVuMikgLyBzdW1fcmlfMjsKLSAgICAKLSAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihpZikiLCBiZXN0X2osIGZhY3Rvcik7CisgICAgfQorCisgICAgZmFjdG9yID0gX3N1bTIoY3AxK2Jlc3RfaiwgY3AyLCBsZW4yKSAvIHN1bV9yaV8yOworCisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihpZikiLCBiZXN0X2osIGZhY3Rvcik7CiB9CiAKIC8qCkBAIC01MjksMjggKzUyOSwyOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGF1ZGlvb3BfZmluZGZhY3RvcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0gICAgICAgIHNob3J0ICpjcDEsICpjcDI7Ci0gICAgICAgIGludCBsZW4xLCBsZW4yOwotICAgICAgICBkb3VibGUgc3VtX3JpXzIsIHN1bV9haWpfcmksIHJlc3VsdDsKKyAgICBzaG9ydCAqY3AxLCAqY3AyOworICAgIGludCBsZW4xLCBsZW4yOworICAgIGRvdWJsZSBzdW1fcmlfMiwgc3VtX2Fpal9yaSwgcmVzdWx0OwogCi0gICAgICAgIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjcyM6ZmluZGZhY3RvciIsCi0JICAgICAgICAgICAgICAgICAgICAgICAoY2hhcioqKSZjcDEsICZsZW4xLCAoY2hhcioqKSZjcDIsICZsZW4yKSApCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIGlmICggbGVuMSAmIDEgfHwgbGVuMiAmIDEgKSB7Ci0gICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlN0cmluZ3Mgc2hvdWxkIGJlIGV2ZW4tc2l6ZWQiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBpZiAoIGxlbjEgIT0gbGVuMiApIHsKLSAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2FtcGxlcyBzaG91bGQgYmUgc2FtZSBzaXplIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgbGVuMiA+Pj0gMTsKLSAgICAgICAgc3VtX3JpXzIgPSBfc3VtMihjcDIsIGNwMiwgbGVuMik7Ci0gICAgICAgIHN1bV9haWpfcmkgPSBfc3VtMihjcDEsIGNwMiwgbGVuMik7CisgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyNzIzpmaW5kZmFjdG9yIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyKiopJmNwMSwgJmxlbjEsIChjaGFyKiopJmNwMiwgJmxlbjIpICkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKCBsZW4xICYgMSB8fCBsZW4yICYgMSApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlN0cmluZ3Mgc2hvdWxkIGJlIGV2ZW4tc2l6ZWQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmICggbGVuMSAhPSBsZW4yICkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2FtcGxlcyBzaG91bGQgYmUgc2FtZSBzaXplIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBsZW4yID4+PSAxOworICAgIHN1bV9yaV8yID0gX3N1bTIoY3AyLCBjcDIsIGxlbjIpOworICAgIHN1bV9haWpfcmkgPSBfc3VtMihjcDEsIGNwMiwgbGVuMik7CiAKLSAgICAgICAgcmVzdWx0ID0gc3VtX2Fpal9yaSAvIHN1bV9yaV8yOworICAgIHJlc3VsdCA9IHN1bV9haWpfcmkgLyBzdW1fcmlfMjsKIAotICAgICAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKHJlc3VsdCk7CisgICAgcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShyZXN1bHQpOwogfQogCiAvKgpAQCAtNTYwLDEwOTYgKzU2MCwxMDk2IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYXVkaW9vcF9maW5kbWF4KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLSAgICAgICAgc2hvcnQgKmNwMTsKLSAgICAgICAgaW50IGxlbjEsIGxlbjI7Ci0gICAgICAgIGludCBqLCBiZXN0X2o7Ci0gICAgICAgIGRvdWJsZSBhal9tMSwgYWpfbG0xOwotICAgICAgICBkb3VibGUgcmVzdWx0LCBiZXN0X3Jlc3VsdDsKKyAgICBzaG9ydCAqY3AxOworICAgIGludCBsZW4xLCBsZW4yOworICAgIGludCBqLCBiZXN0X2o7CisgICAgZG91YmxlIGFqX20xLCBhal9sbTE7CisgICAgZG91YmxlIHJlc3VsdCwgYmVzdF9yZXN1bHQ7CiAKLSAgICAgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyNpOmZpbmRtYXgiLCAKLQkJCSAgICAgICAoY2hhcioqKSZjcDEsICZsZW4xLCAmbGVuMikgKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICBpZiAoIGxlbjEgJiAxICkgewotICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJTdHJpbmdzIHNob3VsZCBiZSBldmVuLXNpemVkIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgbGVuMSA+Pj0gMTsKLSAgICAKLSAgICAgICAgaWYgKCBsZW4yIDwgMCB8fCBsZW4xIDwgbGVuMiApIHsKLSAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiSW5wdXQgc2FtcGxlIHNob3VsZCBiZSBsb25nZXIiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI2k6ZmluZG1heCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhcioqKSZjcDEsICZsZW4xLCAmbGVuMikgKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoIGxlbjEgJiAxICkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU3RyaW5ncyBzaG91bGQgYmUgZXZlbi1zaXplZCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgbGVuMSA+Pj0gMTsKKworICAgIGlmICggbGVuMiA8IDAgfHwgbGVuMSA8IGxlbjIgKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJJbnB1dCBzYW1wbGUgc2hvdWxkIGJlIGxvbmdlciIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICByZXN1bHQgPSBfc3VtMihjcDEsIGNwMSwgbGVuMik7CisKKyAgICBiZXN0X3Jlc3VsdCA9IHJlc3VsdDsKKyAgICBiZXN0X2ogPSAwOworICAgIGogPSAwOworCisgICAgZm9yICggaj0xOyBqPD1sZW4xLWxlbjI7IGorKykgeworICAgICAgICBhal9tMSA9IChkb3VibGUpY3AxW2otMV07CisgICAgICAgIGFqX2xtMSA9IChkb3VibGUpY3AxW2orbGVuMi0xXTsKKworICAgICAgICByZXN1bHQgPSByZXN1bHQgKyBhal9sbTEqYWpfbG0xIC0gYWpfbTEqYWpfbTE7CisKKyAgICAgICAgaWYgKCByZXN1bHQgPiBiZXN0X3Jlc3VsdCApIHsKKyAgICAgICAgICAgIGJlc3RfcmVzdWx0ID0gcmVzdWx0OworICAgICAgICAgICAgYmVzdF9qID0gajsKICAgICAgICAgfQogCi0gICAgICAgIHJlc3VsdCA9IF9zdW0yKGNwMSwgY3AxLCBsZW4yKTsKKyAgICB9CiAKLSAgICAgICAgYmVzdF9yZXN1bHQgPSByZXN1bHQ7Ci0gICAgICAgIGJlc3RfaiA9IDA7Ci0gICAgICAgIGogPSAwOwotCi0gICAgICAgIGZvciAoIGo9MTsgajw9bGVuMS1sZW4yOyBqKyspIHsKLSAgICAgICAgICAgICAgICBhal9tMSA9IChkb3VibGUpY3AxW2otMV07Ci0gICAgICAgICAgICAgICAgYWpfbG0xID0gKGRvdWJsZSljcDFbaitsZW4yLTFdOwotCi0gICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgYWpfbG0xKmFqX2xtMSAtIGFqX20xKmFqX20xOwotCi0gICAgICAgICAgICAgICAgaWYgKCByZXN1bHQgPiBiZXN0X3Jlc3VsdCApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RfcmVzdWx0ID0gcmVzdWx0OwotICAgICAgICAgICAgICAgICAgICAgICAgYmVzdF9qID0gajsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKGJlc3Rfaik7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKGJlc3Rfaik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhdWRpb29wX2F2Z3BwKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLSAgICAgICAgc2lnbmVkIGNoYXIgKmNwOwotICAgICAgICBpbnQgbGVuLCBzaXplLCB2YWwgPSAwLCBwcmV2dmFsID0gMCwgcHJldmV4dHJlbWV2YWxpZCA9IDAsCi0gICAgICAgICAgICAgICAgcHJldmV4dHJlbWUgPSAwOwotICAgICAgICBpbnQgaTsKLSAgICAgICAgZG91YmxlIGF2ZyA9IDAuMDsKLSAgICAgICAgaW50IGRpZmYsIHByZXZkaWZmLCBleHRyZW1lZGlmZiwgbmV4dHJlbWUgPSAwOworICAgIHNpZ25lZCBjaGFyICpjcDsKKyAgICBpbnQgbGVuLCBzaXplLCB2YWwgPSAwLCBwcmV2dmFsID0gMCwgcHJldmV4dHJlbWV2YWxpZCA9IDAsCisgICAgICAgIHByZXZleHRyZW1lID0gMDsKKyAgICBpbnQgaTsKKyAgICBkb3VibGUgYXZnID0gMC4wOworICAgIGludCBkaWZmLCBwcmV2ZGlmZiwgZXh0cmVtZWRpZmYsIG5leHRyZW1lID0gMDsKIAotICAgICAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI2k6YXZncHAiLCAmY3AsICZsZW4sICZzaXplKSApCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIGlmICggc2l6ZSAhPSAxICYmIHNpemUgIT0gMiAmJiBzaXplICE9IDQgKSB7Ci0gICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOwotICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjaTphdmdwcCIsICZjcCwgJmxlbiwgJnNpemUpICkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKCBzaXplICE9IDEgJiYgc2l6ZSAhPSAyICYmIHNpemUgIT0gNCApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgLyogQ29tcHV0ZSBmaXJzdCBkZWx0YSB2YWx1ZSBhaGVhZC4gQWxzbyBhdXRvbWF0aWNhbGx5IG1ha2VzIHVzCisgICAgKiogc2tpcCB0aGUgZmlyc3QgZXh0cmVtZSB2YWx1ZQorICAgICovCisgICAgaWYgKCBzaXplID09IDEgKSAgICAgIHByZXZ2YWwgPSAoaW50KSpDSEFSUChjcCwgMCk7CisgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApIHByZXZ2YWwgPSAoaW50KSpTSE9SVFAoY3AsIDApOworICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSBwcmV2dmFsID0gKGludCkqTE9OR1AoY3AsIDApOworICAgIGlmICggc2l6ZSA9PSAxICkgICAgICB2YWwgPSAoaW50KSpDSEFSUChjcCwgc2l6ZSk7CisgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbCA9IChpbnQpKlNIT1JUUChjcCwgc2l6ZSk7CisgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbCA9IChpbnQpKkxPTkdQKGNwLCBzaXplKTsKKyAgICBwcmV2ZGlmZiA9IHZhbCAtIHByZXZ2YWw7CisKKyAgICBmb3IgKCBpPXNpemU7IGk8bGVuOyBpKz0gc2l6ZSkgeworICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgdmFsID0gKGludCkqQ0hBUlAoY3AsIGkpOworICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgdmFsID0gKGludCkqU0hPUlRQKGNwLCBpKTsKKyAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbCA9IChpbnQpKkxPTkdQKGNwLCBpKTsKKyAgICAgICAgZGlmZiA9IHZhbCAtIHByZXZ2YWw7CisgICAgICAgIGlmICggZGlmZipwcmV2ZGlmZiA8IDAgKSB7CisgICAgICAgICAgICAvKiBEZXJpdmF0aXZlIGNoYW5nZWQgc2lnbi4gQ29tcHV0ZSBkaWZmZXJlbmNlIHRvIGxhc3QKKyAgICAgICAgICAgICoqIGV4dHJlbWUgdmFsdWUgYW5kIHJlbWVtYmVyLgorICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmICggcHJldmV4dHJlbWV2YWxpZCApIHsKKyAgICAgICAgICAgICAgICBleHRyZW1lZGlmZiA9IHByZXZ2YWwgLSBwcmV2ZXh0cmVtZTsKKyAgICAgICAgICAgICAgICBpZiAoIGV4dHJlbWVkaWZmIDwgMCApCisgICAgICAgICAgICAgICAgICAgIGV4dHJlbWVkaWZmID0gLWV4dHJlbWVkaWZmOworICAgICAgICAgICAgICAgIGF2ZyArPSBleHRyZW1lZGlmZjsKKyAgICAgICAgICAgICAgICBuZXh0cmVtZSsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJldmV4dHJlbWV2YWxpZCA9IDE7CisgICAgICAgICAgICBwcmV2ZXh0cmVtZSA9IHByZXZ2YWw7CiAgICAgICAgIH0KLSAgICAgICAgLyogQ29tcHV0ZSBmaXJzdCBkZWx0YSB2YWx1ZSBhaGVhZC4gQWxzbyBhdXRvbWF0aWNhbGx5IG1ha2VzIHVzCi0gICAgICAgICoqIHNraXAgdGhlIGZpcnN0IGV4dHJlbWUgdmFsdWUKLSAgICAgICAgKi8KLSAgICAgICAgaWYgKCBzaXplID09IDEgKSAgICAgIHByZXZ2YWwgPSAoaW50KSpDSEFSUChjcCwgMCk7Ci0gICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSBwcmV2dmFsID0gKGludCkqU0hPUlRQKGNwLCAwKTsKLSAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApIHByZXZ2YWwgPSAoaW50KSpMT05HUChjcCwgMCk7Ci0gICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICB2YWwgPSAoaW50KSpDSEFSUChjcCwgc2l6ZSk7Ci0gICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSB2YWwgPSAoaW50KSpTSE9SVFAoY3AsIHNpemUpOwotICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgdmFsID0gKGludCkqTE9OR1AoY3AsIHNpemUpOwotICAgICAgICBwcmV2ZGlmZiA9IHZhbCAtIHByZXZ2YWw7Ci0gICAgCi0gICAgICAgIGZvciAoIGk9c2l6ZTsgaTxsZW47IGkrPSBzaXplKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCBzaXplID09IDEgKSAgICAgIHZhbCA9IChpbnQpKkNIQVJQKGNwLCBpKTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgdmFsID0gKGludCkqU0hPUlRQKGNwLCBpKTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgdmFsID0gKGludCkqTE9OR1AoY3AsIGkpOwotICAgICAgICAgICAgICAgIGRpZmYgPSB2YWwgLSBwcmV2dmFsOwotICAgICAgICAgICAgICAgIGlmICggZGlmZipwcmV2ZGlmZiA8IDAgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXJpdmF0aXZlIGNoYW5nZWQgc2lnbi4gQ29tcHV0ZSBkaWZmZXJlbmNlIHRvIGxhc3QKLSAgICAgICAgICAgICAgICAgICAgICAgICoqIGV4dHJlbWUgdmFsdWUgYW5kIHJlbWVtYmVyLgotICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcHJldmV4dHJlbWV2YWxpZCApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmVtZWRpZmYgPSBwcmV2dmFsIC0gcHJldmV4dHJlbWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggZXh0cmVtZWRpZmYgPCAwICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyZW1lZGlmZiA9IC1leHRyZW1lZGlmZjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZnICs9IGV4dHJlbWVkaWZmOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0cmVtZSsrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcHJldmV4dHJlbWV2YWxpZCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmV2ZXh0cmVtZSA9IHByZXZ2YWw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHByZXZ2YWwgPSB2YWw7Ci0gICAgICAgICAgICAgICAgaWYgKCBkaWZmICE9IDAgKQotICAgICAgICAgICAgICAgICAgICAgICAgcHJldmRpZmYgPSBkaWZmOyAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgaWYgKCBuZXh0cmVtZSA9PSAwICkKLSAgICAgICAgICAgICAgICB2YWwgPSAwOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgdmFsID0gKGludCkoYXZnIC8gKGRvdWJsZSluZXh0cmVtZSk7Ci0gICAgICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyh2YWwpOworICAgICAgICBwcmV2dmFsID0gdmFsOworICAgICAgICBpZiAoIGRpZmYgIT0gMCApCisgICAgICAgICAgICBwcmV2ZGlmZiA9IGRpZmY7CisgICAgfQorICAgIGlmICggbmV4dHJlbWUgPT0gMCApCisgICAgICAgIHZhbCA9IDA7CisgICAgZWxzZQorICAgICAgICB2YWwgPSAoaW50KShhdmcgLyAoZG91YmxlKW5leHRyZW1lKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcodmFsKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGF1ZGlvb3BfbWF4cHAoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotICAgICAgICBzaWduZWQgY2hhciAqY3A7Ci0gICAgICAgIGludCBsZW4sIHNpemUsIHZhbCA9IDAsIHByZXZ2YWwgPSAwLCBwcmV2ZXh0cmVtZXZhbGlkID0gMCwKLSAgICAgICAgICAgICAgICBwcmV2ZXh0cmVtZSA9IDA7Ci0gICAgICAgIGludCBpOwotICAgICAgICBpbnQgbWF4ID0gMDsKLSAgICAgICAgaW50IGRpZmYsIHByZXZkaWZmLCBleHRyZW1lZGlmZjsKKyAgICBzaWduZWQgY2hhciAqY3A7CisgICAgaW50IGxlbiwgc2l6ZSwgdmFsID0gMCwgcHJldnZhbCA9IDAsIHByZXZleHRyZW1ldmFsaWQgPSAwLAorICAgICAgICBwcmV2ZXh0cmVtZSA9IDA7CisgICAgaW50IGk7CisgICAgaW50IG1heCA9IDA7CisgICAgaW50IGRpZmYsIHByZXZkaWZmLCBleHRyZW1lZGlmZjsKIAotICAgICAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI2k6bWF4cHAiLCAmY3AsICZsZW4sICZzaXplKSApCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIGlmICggc2l6ZSAhPSAxICYmIHNpemUgIT0gMiAmJiBzaXplICE9IDQgKSB7Ci0gICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOwotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIC8qIENvbXB1dGUgZmlyc3QgZGVsdGEgdmFsdWUgYWhlYWQuIEFsc28gYXV0b21hdGljYWxseSBtYWtlcyB1cwotICAgICAgICAqKiBza2lwIHRoZSBmaXJzdCBleHRyZW1lIHZhbHVlCi0gICAgICAgICovCi0gICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICBwcmV2dmFsID0gKGludCkqQ0hBUlAoY3AsIDApOwotICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgcHJldnZhbCA9IChpbnQpKlNIT1JUUChjcCwgMCk7Ci0gICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSBwcmV2dmFsID0gKGludCkqTE9OR1AoY3AsIDApOwotICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgdmFsID0gKGludCkqQ0hBUlAoY3AsIHNpemUpOwotICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgdmFsID0gKGludCkqU0hPUlRQKGNwLCBzaXplKTsKLSAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbCA9IChpbnQpKkxPTkdQKGNwLCBzaXplKTsKLSAgICAgICAgcHJldmRpZmYgPSB2YWwgLSBwcmV2dmFsOworICAgIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjaTptYXhwcCIsICZjcCwgJmxlbiwgJnNpemUpICkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKCBzaXplICE9IDEgJiYgc2l6ZSAhPSAyICYmIHNpemUgIT0gNCApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgLyogQ29tcHV0ZSBmaXJzdCBkZWx0YSB2YWx1ZSBhaGVhZC4gQWxzbyBhdXRvbWF0aWNhbGx5IG1ha2VzIHVzCisgICAgKiogc2tpcCB0aGUgZmlyc3QgZXh0cmVtZSB2YWx1ZQorICAgICovCisgICAgaWYgKCBzaXplID09IDEgKSAgICAgIHByZXZ2YWwgPSAoaW50KSpDSEFSUChjcCwgMCk7CisgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApIHByZXZ2YWwgPSAoaW50KSpTSE9SVFAoY3AsIDApOworICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSBwcmV2dmFsID0gKGludCkqTE9OR1AoY3AsIDApOworICAgIGlmICggc2l6ZSA9PSAxICkgICAgICB2YWwgPSAoaW50KSpDSEFSUChjcCwgc2l6ZSk7CisgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbCA9IChpbnQpKlNIT1JUUChjcCwgc2l6ZSk7CisgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbCA9IChpbnQpKkxPTkdQKGNwLCBzaXplKTsKKyAgICBwcmV2ZGlmZiA9IHZhbCAtIHByZXZ2YWw7CiAKLSAgICAgICAgZm9yICggaT1zaXplOyBpPGxlbjsgaSs9IHNpemUpIHsKLSAgICAgICAgICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgdmFsID0gKGludCkqQ0hBUlAoY3AsIGkpOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSB2YWwgPSAoaW50KSpTSE9SVFAoY3AsIGkpOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSB2YWwgPSAoaW50KSpMT05HUChjcCwgaSk7Ci0gICAgICAgICAgICAgICAgZGlmZiA9IHZhbCAtIHByZXZ2YWw7Ci0gICAgICAgICAgICAgICAgaWYgKCBkaWZmKnByZXZkaWZmIDwgMCApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlcml2YXRpdmUgY2hhbmdlZCBzaWduLiBDb21wdXRlIGRpZmZlcmVuY2UgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICoqIGxhc3QgZXh0cmVtZSB2YWx1ZSBhbmQgcmVtZW1iZXIuCi0gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwcmV2ZXh0cmVtZXZhbGlkICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyZW1lZGlmZiA9IHByZXZ2YWwgLSBwcmV2ZXh0cmVtZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBleHRyZW1lZGlmZiA8IDAgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJlbWVkaWZmID0gLWV4dHJlbWVkaWZmOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGV4dHJlbWVkaWZmID4gbWF4ICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXggPSBleHRyZW1lZGlmZjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHByZXZleHRyZW1ldmFsaWQgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgcHJldmV4dHJlbWUgPSBwcmV2dmFsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwcmV2dmFsID0gdmFsOwotICAgICAgICAgICAgICAgIGlmICggZGlmZiAhPSAwICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZXZkaWZmID0gZGlmZjsKKyAgICBmb3IgKCBpPXNpemU7IGk8bGVuOyBpKz0gc2l6ZSkgeworICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgdmFsID0gKGludCkqQ0hBUlAoY3AsIGkpOworICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgdmFsID0gKGludCkqU0hPUlRQKGNwLCBpKTsKKyAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbCA9IChpbnQpKkxPTkdQKGNwLCBpKTsKKyAgICAgICAgZGlmZiA9IHZhbCAtIHByZXZ2YWw7CisgICAgICAgIGlmICggZGlmZipwcmV2ZGlmZiA8IDAgKSB7CisgICAgICAgICAgICAvKiBEZXJpdmF0aXZlIGNoYW5nZWQgc2lnbi4gQ29tcHV0ZSBkaWZmZXJlbmNlIHRvCisgICAgICAgICAgICAqKiBsYXN0IGV4dHJlbWUgdmFsdWUgYW5kIHJlbWVtYmVyLgorICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmICggcHJldmV4dHJlbWV2YWxpZCApIHsKKyAgICAgICAgICAgICAgICBleHRyZW1lZGlmZiA9IHByZXZ2YWwgLSBwcmV2ZXh0cmVtZTsKKyAgICAgICAgICAgICAgICBpZiAoIGV4dHJlbWVkaWZmIDwgMCApCisgICAgICAgICAgICAgICAgICAgIGV4dHJlbWVkaWZmID0gLWV4dHJlbWVkaWZmOworICAgICAgICAgICAgICAgIGlmICggZXh0cmVtZWRpZmYgPiBtYXggKQorICAgICAgICAgICAgICAgICAgICBtYXggPSBleHRyZW1lZGlmZjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByZXZleHRyZW1ldmFsaWQgPSAxOworICAgICAgICAgICAgcHJldmV4dHJlbWUgPSBwcmV2dmFsOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhtYXgpOworICAgICAgICBwcmV2dmFsID0gdmFsOworICAgICAgICBpZiAoIGRpZmYgIT0gMCApCisgICAgICAgICAgICBwcmV2ZGlmZiA9IGRpZmY7CisgICAgfQorICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhtYXgpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYXVkaW9vcF9jcm9zcyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0gICAgICAgIHNpZ25lZCBjaGFyICpjcDsKLSAgICAgICAgaW50IGxlbiwgc2l6ZSwgdmFsID0gMDsKLSAgICAgICAgaW50IGk7Ci0gICAgICAgIGludCBwcmV2dmFsLCBuY3Jvc3M7CisgICAgc2lnbmVkIGNoYXIgKmNwOworICAgIGludCBsZW4sIHNpemUsIHZhbCA9IDA7CisgICAgaW50IGk7CisgICAgaW50IHByZXZ2YWwsIG5jcm9zczsKIAotICAgICAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI2k6Y3Jvc3MiLCAmY3AsICZsZW4sICZzaXplKSApCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIGlmICggc2l6ZSAhPSAxICYmIHNpemUgIT0gMiAmJiBzaXplICE9IDQgKSB7Ci0gICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOwotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIG5jcm9zcyA9IC0xOwotICAgICAgICBwcmV2dmFsID0gMTc7IC8qIEFueXRoaW5nIDw+IDAsMSAqLwotICAgICAgICBmb3IgKCBpPTA7IGk8bGVuOyBpKz0gc2l6ZSkgewotICAgICAgICAgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICB2YWwgPSAoKGludCkqQ0hBUlAoY3AsIGkpKSA+PiA3OwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSB2YWwgPSAoKGludCkqU0hPUlRQKGNwLCBpKSkgPj4gMTU7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbCA9ICgoaW50KSpMT05HUChjcCwgaSkpID4+IDMxOwotICAgICAgICAgICAgICAgIHZhbCA9IHZhbCAmIDE7Ci0gICAgICAgICAgICAgICAgaWYgKCB2YWwgIT0gcHJldnZhbCApIG5jcm9zcysrOwotICAgICAgICAgICAgICAgIHByZXZ2YWwgPSB2YWw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKG5jcm9zcyk7CisgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyNpOmNyb3NzIiwgJmNwLCAmbGVuLCAmc2l6ZSkgKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoIHNpemUgIT0gMSAmJiBzaXplICE9IDIgJiYgc2l6ZSAhPSA0ICkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBuY3Jvc3MgPSAtMTsKKyAgICBwcmV2dmFsID0gMTc7IC8qIEFueXRoaW5nIDw+IDAsMSAqLworICAgIGZvciAoIGk9MDsgaTxsZW47IGkrPSBzaXplKSB7CisgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICB2YWwgPSAoKGludCkqQ0hBUlAoY3AsIGkpKSA+PiA3OworICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgdmFsID0gKChpbnQpKlNIT1JUUChjcCwgaSkpID4+IDE1OworICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgdmFsID0gKChpbnQpKkxPTkdQKGNwLCBpKSkgPj4gMzE7CisgICAgICAgIHZhbCA9IHZhbCAmIDE7CisgICAgICAgIGlmICggdmFsICE9IHByZXZ2YWwgKSBuY3Jvc3MrKzsKKyAgICAgICAgcHJldnZhbCA9IHZhbDsKKyAgICB9CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKG5jcm9zcyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhdWRpb29wX211bChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0gICAgICAgIHNpZ25lZCBjaGFyICpjcCwgKm5jcDsKLSAgICAgICAgaW50IGxlbiwgc2l6ZSwgdmFsID0gMDsKLSAgICAgICAgZG91YmxlIGZhY3RvciwgZnZhbCwgbWF4dmFsOwotICAgICAgICBQeU9iamVjdCAqcnY7Ci0gICAgICAgIGludCBpOworICAgIHNpZ25lZCBjaGFyICpjcCwgKm5jcDsKKyAgICBpbnQgbGVuLCBzaXplLCB2YWwgPSAwOworICAgIGRvdWJsZSBmYWN0b3IsIGZ2YWwsIG1heHZhbDsKKyAgICBQeU9iamVjdCAqcnY7CisgICAgaW50IGk7CiAKLSAgICAgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyNpZDptdWwiLCAmY3AsICZsZW4sICZzaXplLCAmZmFjdG9yICkgKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgIAotICAgICAgICBpZiAoIHNpemUgPT0gMSApIG1heHZhbCA9IChkb3VibGUpIDB4N2Y7Ci0gICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSBtYXh2YWwgPSAoZG91YmxlKSAweDdmZmY7Ci0gICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSBtYXh2YWwgPSAoZG91YmxlKSAweDdmZmZmZmZmOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAKLSAgICAgICAgcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBsZW4pOwotICAgICAgICBpZiAoIHJ2ID09IDAgKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICBuY3AgPSAoc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhydik7Ci0gICAgCi0gICAgCi0gICAgICAgIGZvciAoIGk9MDsgaSA8IGxlbjsgaSArPSBzaXplICkgewotICAgICAgICAgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICB2YWwgPSAoaW50KSpDSEFSUChjcCwgaSk7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbCA9IChpbnQpKlNIT1JUUChjcCwgaSk7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbCA9IChpbnQpKkxPTkdQKGNwLCBpKTsKLSAgICAgICAgICAgICAgICBmdmFsID0gKGRvdWJsZSl2YWwqZmFjdG9yOwotICAgICAgICAgICAgICAgIGlmICggZnZhbCA+IG1heHZhbCApIGZ2YWwgPSBtYXh2YWw7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIGZ2YWwgPCAtbWF4dmFsICkgZnZhbCA9IC1tYXh2YWw7Ci0gICAgICAgICAgICAgICAgdmFsID0gKGludClmdmFsOwotICAgICAgICAgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICAqQ0hBUlAobmNwLCBpKSA9IChzaWduZWQgY2hhcil2YWw7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApICpTSE9SVFAobmNwLCBpKSA9IChzaG9ydCl2YWw7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApICpMT05HUChuY3AsIGkpID0gKFB5X0ludDMyKXZhbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcnY7CisgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyNpZDptdWwiLCAmY3AsICZsZW4sICZzaXplLCAmZmFjdG9yICkgKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmICggc2l6ZSA9PSAxICkgbWF4dmFsID0gKGRvdWJsZSkgMHg3ZjsKKyAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgbWF4dmFsID0gKGRvdWJsZSkgMHg3ZmZmOworICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSBtYXh2YWwgPSAoZG91YmxlKSAweDdmZmZmZmZmOworICAgIGVsc2UgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHJ2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbGVuKTsKKyAgICBpZiAoIHJ2ID09IDAgKQorICAgICAgICByZXR1cm4gMDsKKyAgICBuY3AgPSAoc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhydik7CisKKworICAgIGZvciAoIGk9MDsgaSA8IGxlbjsgaSArPSBzaXplICkgeworICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgdmFsID0gKGludCkqQ0hBUlAoY3AsIGkpOworICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgdmFsID0gKGludCkqU0hPUlRQKGNwLCBpKTsKKyAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbCA9IChpbnQpKkxPTkdQKGNwLCBpKTsKKyAgICAgICAgZnZhbCA9IChkb3VibGUpdmFsKmZhY3RvcjsKKyAgICAgICAgaWYgKCBmdmFsID4gbWF4dmFsICkgZnZhbCA9IG1heHZhbDsKKyAgICAgICAgZWxzZSBpZiAoIGZ2YWwgPCAtbWF4dmFsICkgZnZhbCA9IC1tYXh2YWw7CisgICAgICAgIHZhbCA9IChpbnQpZnZhbDsKKyAgICAgICAgaWYgKCBzaXplID09IDEgKSAgICAgICpDSEFSUChuY3AsIGkpID0gKHNpZ25lZCBjaGFyKXZhbDsKKyAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApICpTSE9SVFAobmNwLCBpKSA9IChzaG9ydCl2YWw7CisgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSAqTE9OR1AobmNwLCBpKSA9IChQeV9JbnQzMil2YWw7CisgICAgfQorICAgIHJldHVybiBydjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGF1ZGlvb3BfdG9tb25vKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLSAgICAgICAgc2lnbmVkIGNoYXIgKmNwLCAqbmNwOwotICAgICAgICBpbnQgbGVuLCBzaXplLCB2YWwxID0gMCwgdmFsMiA9IDA7Ci0gICAgICAgIGRvdWJsZSBmYWMxLCBmYWMyLCBmdmFsLCBtYXh2YWw7Ci0gICAgICAgIFB5T2JqZWN0ICpydjsKLSAgICAgICAgaW50IGk7CisgICAgc2lnbmVkIGNoYXIgKmNwLCAqbmNwOworICAgIGludCBsZW4sIHNpemUsIHZhbDEgPSAwLCB2YWwyID0gMDsKKyAgICBkb3VibGUgZmFjMSwgZmFjMiwgZnZhbCwgbWF4dmFsOworICAgIFB5T2JqZWN0ICpydjsKKyAgICBpbnQgaTsKIAotICAgICAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI2lkZDp0b21vbm8iLAotCSAgICAgICAgICAgICAgICAgICAgICAgJmNwLCAmbGVuLCAmc2l6ZSwgJmZhYzEsICZmYWMyICkgKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgIAotICAgICAgICBpZiAoIHNpemUgPT0gMSApIG1heHZhbCA9IChkb3VibGUpIDB4N2Y7Ci0gICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSBtYXh2YWwgPSAoZG91YmxlKSAweDdmZmY7Ci0gICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSBtYXh2YWwgPSAoZG91YmxlKSAweDdmZmZmZmZmOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAKLSAgICAgICAgcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBsZW4vMik7Ci0gICAgICAgIGlmICggcnYgPT0gMCApCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIG5jcCA9IChzaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKLSAgICAKLSAgICAKLSAgICAgICAgZm9yICggaT0wOyBpIDwgbGVuOyBpICs9IHNpemUqMiApIHsKLSAgICAgICAgICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgdmFsMSA9IChpbnQpKkNIQVJQKGNwLCBpKTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgdmFsMSA9IChpbnQpKlNIT1JUUChjcCwgaSk7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbDEgPSAoaW50KSpMT05HUChjcCwgaSk7Ci0gICAgICAgICAgICAgICAgaWYgKCBzaXplID09IDEgKSAgICAgIHZhbDIgPSAoaW50KSpDSEFSUChjcCwgaSsxKTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgdmFsMiA9IChpbnQpKlNIT1JUUChjcCwgaSsyKTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgdmFsMiA9IChpbnQpKkxPTkdQKGNwLCBpKzQpOwotICAgICAgICAgICAgICAgIGZ2YWwgPSAoZG91YmxlKXZhbDEqZmFjMSArIChkb3VibGUpdmFsMipmYWMyOwotICAgICAgICAgICAgICAgIGlmICggZnZhbCA+IG1heHZhbCApIGZ2YWwgPSBtYXh2YWw7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIGZ2YWwgPCAtbWF4dmFsICkgZnZhbCA9IC1tYXh2YWw7Ci0gICAgICAgICAgICAgICAgdmFsMSA9IChpbnQpZnZhbDsKLSAgICAgICAgICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgKkNIQVJQKG5jcCwgaS8yKSA9IChzaWduZWQgY2hhcil2YWwxOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSAqU0hPUlRQKG5jcCwgaS8yKSA9IChzaG9ydCl2YWwxOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSAqTE9OR1AobmNwLCBpLzIpPSAoUHlfSW50MzIpdmFsMTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcnY7CisgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyNpZGQ6dG9tb25vIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZjcCwgJmxlbiwgJnNpemUsICZmYWMxLCAmZmFjMiApICkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAoIHNpemUgPT0gMSApIG1heHZhbCA9IChkb3VibGUpIDB4N2Y7CisgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApIG1heHZhbCA9IChkb3VibGUpIDB4N2ZmZjsKKyAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgbWF4dmFsID0gKGRvdWJsZSkgMHg3ZmZmZmZmZjsKKyAgICBlbHNlIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGxlbi8yKTsKKyAgICBpZiAoIHJ2ID09IDAgKQorICAgICAgICByZXR1cm4gMDsKKyAgICBuY3AgPSAoc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhydik7CisKKworICAgIGZvciAoIGk9MDsgaSA8IGxlbjsgaSArPSBzaXplKjIgKSB7CisgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICB2YWwxID0gKGludCkqQ0hBUlAoY3AsIGkpOworICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgdmFsMSA9IChpbnQpKlNIT1JUUChjcCwgaSk7CisgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSB2YWwxID0gKGludCkqTE9OR1AoY3AsIGkpOworICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgdmFsMiA9IChpbnQpKkNIQVJQKGNwLCBpKzEpOworICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgdmFsMiA9IChpbnQpKlNIT1JUUChjcCwgaSsyKTsKKyAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbDIgPSAoaW50KSpMT05HUChjcCwgaSs0KTsKKyAgICAgICAgZnZhbCA9IChkb3VibGUpdmFsMSpmYWMxICsgKGRvdWJsZSl2YWwyKmZhYzI7CisgICAgICAgIGlmICggZnZhbCA+IG1heHZhbCApIGZ2YWwgPSBtYXh2YWw7CisgICAgICAgIGVsc2UgaWYgKCBmdmFsIDwgLW1heHZhbCApIGZ2YWwgPSAtbWF4dmFsOworICAgICAgICB2YWwxID0gKGludClmdmFsOworICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgKkNIQVJQKG5jcCwgaS8yKSA9IChzaWduZWQgY2hhcil2YWwxOworICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgKlNIT1JUUChuY3AsIGkvMikgPSAoc2hvcnQpdmFsMTsKKyAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApICpMT05HUChuY3AsIGkvMik9IChQeV9JbnQzMil2YWwxOworICAgIH0KKyAgICByZXR1cm4gcnY7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhdWRpb29wX3Rvc3RlcmVvKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLSAgICAgICAgc2lnbmVkIGNoYXIgKmNwLCAqbmNwOwotICAgICAgICBpbnQgbGVuLCBuZXdfbGVuLCBzaXplLCB2YWwxLCB2YWwyLCB2YWwgPSAwOwotICAgICAgICBkb3VibGUgZmFjMSwgZmFjMiwgZnZhbCwgbWF4dmFsOwotICAgICAgICBQeU9iamVjdCAqcnY7Ci0gICAgICAgIGludCBpOworICAgIHNpZ25lZCBjaGFyICpjcCwgKm5jcDsKKyAgICBpbnQgbGVuLCBuZXdfbGVuLCBzaXplLCB2YWwxLCB2YWwyLCB2YWwgPSAwOworICAgIGRvdWJsZSBmYWMxLCBmYWMyLCBmdmFsLCBtYXh2YWw7CisgICAgUHlPYmplY3QgKnJ2OworICAgIGludCBpOwogCi0gICAgICAgIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjaWRkOnRvc3RlcmVvIiwKLQkgICAgICAgICAgICAgICAgICAgICAgICZjcCwgJmxlbiwgJnNpemUsICZmYWMxLCAmZmFjMiApICkKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAKLSAgICAgICAgaWYgKCBzaXplID09IDEgKSBtYXh2YWwgPSAoZG91YmxlKSAweDdmOwotICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgbWF4dmFsID0gKGRvdWJsZSkgMHg3ZmZmOwotICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgbWF4dmFsID0gKGRvdWJsZSkgMHg3ZmZmZmZmZjsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOwotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgCi0gICAgICAgIG5ld19sZW4gPSBsZW4qMjsKLSAgICAgICAgaWYgKG5ld19sZW4gPCAwKSB7Ci0gICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX01lbW9yeUVycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm90IGVub3VnaCBtZW1vcnkgZm9yIG91dHB1dCBidWZmZXIiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQorICAgIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjaWRkOnRvc3RlcmVvIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZjcCwgJmxlbiwgJnNpemUsICZmYWMxLCAmZmFjMiApICkKKyAgICAgICAgcmV0dXJuIDA7CiAKLSAgICAgICAgcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBuZXdfbGVuKTsKLSAgICAgICAgaWYgKCBydiA9PSAwICkKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgbmNwID0gKHNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpOwotICAgIAotICAgIAotICAgICAgICBmb3IgKCBpPTA7IGkgPCBsZW47IGkgKz0gc2l6ZSApIHsKLSAgICAgICAgICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgdmFsID0gKGludCkqQ0hBUlAoY3AsIGkpOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSB2YWwgPSAoaW50KSpTSE9SVFAoY3AsIGkpOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSB2YWwgPSAoaW50KSpMT05HUChjcCwgaSk7CisgICAgaWYgKCBzaXplID09IDEgKSBtYXh2YWwgPSAoZG91YmxlKSAweDdmOworICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSBtYXh2YWwgPSAoZG91YmxlKSAweDdmZmY7CisgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApIG1heHZhbCA9IChkb3VibGUpIDB4N2ZmZmZmZmY7CisgICAgZWxzZSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJTaXplIHNob3VsZCBiZSAxLCAyIG9yIDQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCi0gICAgICAgICAgICAgICAgZnZhbCA9IChkb3VibGUpdmFsKmZhYzE7Ci0gICAgICAgICAgICAgICAgaWYgKCBmdmFsID4gbWF4dmFsICkgZnZhbCA9IG1heHZhbDsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICggZnZhbCA8IC1tYXh2YWwgKSBmdmFsID0gLW1heHZhbDsKLSAgICAgICAgICAgICAgICB2YWwxID0gKGludClmdmFsOworICAgIG5ld19sZW4gPSBsZW4qMjsKKyAgICBpZiAobmV3X2xlbiA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX01lbW9yeUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIm5vdCBlbm91Z2ggbWVtb3J5IGZvciBvdXRwdXQgYnVmZmVyIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KIAotICAgICAgICAgICAgICAgIGZ2YWwgPSAoZG91YmxlKXZhbCpmYWMyOwotICAgICAgICAgICAgICAgIGlmICggZnZhbCA+IG1heHZhbCApIGZ2YWwgPSBtYXh2YWw7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIGZ2YWwgPCAtbWF4dmFsICkgZnZhbCA9IC1tYXh2YWw7Ci0gICAgICAgICAgICAgICAgdmFsMiA9IChpbnQpZnZhbDsKKyAgICBydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIG5ld19sZW4pOworICAgIGlmICggcnYgPT0gMCApCisgICAgICAgIHJldHVybiAwOworICAgIG5jcCA9IChzaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKIAotICAgICAgICAgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICAqQ0hBUlAobmNwLCBpKjIpID0gKHNpZ25lZCBjaGFyKXZhbDE7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApICpTSE9SVFAobmNwLCBpKjIpID0gKHNob3J0KXZhbDE7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApICpMT05HUChuY3AsIGkqMikgPSAoUHlfSW50MzIpdmFsMTsKIAotICAgICAgICAgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICAqQ0hBUlAobmNwLCBpKjIrMSkgPSAoc2lnbmVkIGNoYXIpdmFsMjsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgKlNIT1JUUChuY3AsIGkqMisyKSA9IChzaG9ydCl2YWwyOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSAqTE9OR1AobmNwLCBpKjIrNCkgPSAoUHlfSW50MzIpdmFsMjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcnY7CisgICAgZm9yICggaT0wOyBpIDwgbGVuOyBpICs9IHNpemUgKSB7CisgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICB2YWwgPSAoaW50KSpDSEFSUChjcCwgaSk7CisgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSB2YWwgPSAoaW50KSpTSE9SVFAoY3AsIGkpOworICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgdmFsID0gKGludCkqTE9OR1AoY3AsIGkpOworCisgICAgICAgIGZ2YWwgPSAoZG91YmxlKXZhbCpmYWMxOworICAgICAgICBpZiAoIGZ2YWwgPiBtYXh2YWwgKSBmdmFsID0gbWF4dmFsOworICAgICAgICBlbHNlIGlmICggZnZhbCA8IC1tYXh2YWwgKSBmdmFsID0gLW1heHZhbDsKKyAgICAgICAgdmFsMSA9IChpbnQpZnZhbDsKKworICAgICAgICBmdmFsID0gKGRvdWJsZSl2YWwqZmFjMjsKKyAgICAgICAgaWYgKCBmdmFsID4gbWF4dmFsICkgZnZhbCA9IG1heHZhbDsKKyAgICAgICAgZWxzZSBpZiAoIGZ2YWwgPCAtbWF4dmFsICkgZnZhbCA9IC1tYXh2YWw7CisgICAgICAgIHZhbDIgPSAoaW50KWZ2YWw7CisKKyAgICAgICAgaWYgKCBzaXplID09IDEgKSAgICAgICpDSEFSUChuY3AsIGkqMikgPSAoc2lnbmVkIGNoYXIpdmFsMTsKKyAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApICpTSE9SVFAobmNwLCBpKjIpID0gKHNob3J0KXZhbDE7CisgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSAqTE9OR1AobmNwLCBpKjIpID0gKFB5X0ludDMyKXZhbDE7CisKKyAgICAgICAgaWYgKCBzaXplID09IDEgKSAgICAgICpDSEFSUChuY3AsIGkqMisxKSA9IChzaWduZWQgY2hhcil2YWwyOworICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgKlNIT1JUUChuY3AsIGkqMisyKSA9IChzaG9ydCl2YWwyOworICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgKkxPTkdQKG5jcCwgaSoyKzQpID0gKFB5X0ludDMyKXZhbDI7CisgICAgfQorICAgIHJldHVybiBydjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGF1ZGlvb3BfYWRkKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLSAgICAgICAgc2lnbmVkIGNoYXIgKmNwMSwgKmNwMiwgKm5jcDsKLSAgICAgICAgaW50IGxlbjEsIGxlbjIsIHNpemUsIHZhbDEgPSAwLCB2YWwyID0gMCwgbWF4dmFsLCBuZXd2YWw7Ci0gICAgICAgIFB5T2JqZWN0ICpydjsKLSAgICAgICAgaW50IGk7CisgICAgc2lnbmVkIGNoYXIgKmNwMSwgKmNwMiwgKm5jcDsKKyAgICBpbnQgbGVuMSwgbGVuMiwgc2l6ZSwgdmFsMSA9IDAsIHZhbDIgPSAwLCBtYXh2YWwsIG5ld3ZhbDsKKyAgICBQeU9iamVjdCAqcnY7CisgICAgaW50IGk7CiAKLSAgICAgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyNzI2k6YWRkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJmNwMSwgJmxlbjEsICZjcDIsICZsZW4yLCAmc2l6ZSApICkKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI3MjaTphZGQiLAorICAgICAgICAgICAgICAgICAgICAgICZjcDEsICZsZW4xLCAmY3AyLCAmbGVuMiwgJnNpemUgKSApCisgICAgICAgIHJldHVybiAwOwogCi0gICAgICAgIGlmICggbGVuMSAhPSBsZW4yICkgewotICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJMZW5ndGhzIHNob3VsZCBiZSB0aGUgc2FtZSIpOwotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgCi0gICAgICAgIGlmICggc2l6ZSA9PSAxICkgbWF4dmFsID0gMHg3ZjsKLSAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApIG1heHZhbCA9IDB4N2ZmZjsKLSAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApIG1heHZhbCA9IDB4N2ZmZmZmZmY7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJTaXplIHNob3VsZCBiZSAxLCAyIG9yIDQiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQorICAgIGlmICggbGVuMSAhPSBsZW4yICkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiTGVuZ3RocyBzaG91bGQgYmUgdGhlIHNhbWUiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCi0gICAgICAgIHJ2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbGVuMSk7Ci0gICAgICAgIGlmICggcnYgPT0gMCApCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIG5jcCA9IChzaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKKyAgICBpZiAoIHNpemUgPT0gMSApIG1heHZhbCA9IDB4N2Y7CisgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApIG1heHZhbCA9IDB4N2ZmZjsKKyAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgbWF4dmFsID0gMHg3ZmZmZmZmZjsKKyAgICBlbHNlIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLSAgICAgICAgZm9yICggaT0wOyBpIDwgbGVuMTsgaSArPSBzaXplICkgewotICAgICAgICAgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICB2YWwxID0gKGludCkqQ0hBUlAoY3AxLCBpKTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgdmFsMSA9IChpbnQpKlNIT1JUUChjcDEsIGkpOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSB2YWwxID0gKGludCkqTE9OR1AoY3AxLCBpKTsKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKCBzaXplID09IDEgKSAgICAgIHZhbDIgPSAoaW50KSpDSEFSUChjcDIsIGkpOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSB2YWwyID0gKGludCkqU0hPUlRQKGNwMiwgaSk7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbDIgPSAoaW50KSpMT05HUChjcDIsIGkpOworICAgIHJ2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbGVuMSk7CisgICAgaWYgKCBydiA9PSAwICkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgbmNwID0gKHNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpOwogCi0gICAgICAgICAgICAgICAgbmV3dmFsID0gdmFsMSArIHZhbDI7Ci0gICAgICAgICAgICAgICAgLyogdHJ1bmNhdGUgaW4gY2FzZSBvZiBvdmVyZmxvdyAqLwotICAgICAgICAgICAgICAgIGlmIChuZXd2YWwgPiBtYXh2YWwpIG5ld3ZhbCA9IG1heHZhbDsKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChuZXd2YWwgPCAtbWF4dmFsKSBuZXd2YWwgPSAtbWF4dmFsOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNpemUgPT0gNCAmJiAobmV3dmFsXnZhbDEpIDwgMCAmJiAobmV3dmFsXnZhbDIpIDwgMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ld3ZhbCA9IHZhbDEgPiAwID8gbWF4dmFsIDogLSBtYXh2YWw7CisgICAgZm9yICggaT0wOyBpIDwgbGVuMTsgaSArPSBzaXplICkgeworICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgdmFsMSA9IChpbnQpKkNIQVJQKGNwMSwgaSk7CisgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSB2YWwxID0gKGludCkqU0hPUlRQKGNwMSwgaSk7CisgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSB2YWwxID0gKGludCkqTE9OR1AoY3AxLCBpKTsKIAotICAgICAgICAgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICAqQ0hBUlAobmNwLCBpKSA9IChzaWduZWQgY2hhciluZXd2YWw7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApICpTSE9SVFAobmNwLCBpKSA9IChzaG9ydCluZXd2YWw7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApICpMT05HUChuY3AsIGkpID0gKFB5X0ludDMyKW5ld3ZhbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcnY7CisgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICB2YWwyID0gKGludCkqQ0hBUlAoY3AyLCBpKTsKKyAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbDIgPSAoaW50KSpTSE9SVFAoY3AyLCBpKTsKKyAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbDIgPSAoaW50KSpMT05HUChjcDIsIGkpOworCisgICAgICAgIG5ld3ZhbCA9IHZhbDEgKyB2YWwyOworICAgICAgICAvKiB0cnVuY2F0ZSBpbiBjYXNlIG9mIG92ZXJmbG93ICovCisgICAgICAgIGlmIChuZXd2YWwgPiBtYXh2YWwpIG5ld3ZhbCA9IG1heHZhbDsKKyAgICAgICAgZWxzZSBpZiAobmV3dmFsIDwgLW1heHZhbCkgbmV3dmFsID0gLW1heHZhbDsKKyAgICAgICAgZWxzZSBpZiAoc2l6ZSA9PSA0ICYmIChuZXd2YWxedmFsMSkgPCAwICYmIChuZXd2YWxedmFsMikgPCAwKQorICAgICAgICAgICAgbmV3dmFsID0gdmFsMSA+IDAgPyBtYXh2YWwgOiAtIG1heHZhbDsKKworICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgKkNIQVJQKG5jcCwgaSkgPSAoc2lnbmVkIGNoYXIpbmV3dmFsOworICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgKlNIT1JUUChuY3AsIGkpID0gKHNob3J0KW5ld3ZhbDsKKyAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApICpMT05HUChuY3AsIGkpID0gKFB5X0ludDMyKW5ld3ZhbDsKKyAgICB9CisgICAgcmV0dXJuIHJ2OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYXVkaW9vcF9iaWFzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLSAgICAgICAgc2lnbmVkIGNoYXIgKmNwLCAqbmNwOwotICAgICAgICBpbnQgbGVuLCBzaXplLCB2YWwgPSAwOwotICAgICAgICBQeU9iamVjdCAqcnY7Ci0gICAgICAgIGludCBpOwotICAgICAgICBpbnQgYmlhczsKKyAgICBzaWduZWQgY2hhciAqY3AsICpuY3A7CisgICAgaW50IGxlbiwgc2l6ZSwgdmFsID0gMDsKKyAgICBQeU9iamVjdCAqcnY7CisgICAgaW50IGk7CisgICAgaW50IGJpYXM7CiAKLSAgICAgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyNpaTpiaWFzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJmNwLCAmbGVuLCAmc2l6ZSAsICZiaWFzKSApCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyNpaTpiaWFzIiwKKyAgICAgICAgICAgICAgICAgICAgICAmY3AsICZsZW4sICZzaXplICwgJmJpYXMpICkKKyAgICAgICAgcmV0dXJuIDA7CiAKLSAgICAgICAgaWYgKCBzaXplICE9IDEgJiYgc2l6ZSAhPSAyICYmIHNpemUgIT0gNCkgewotICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJTaXplIHNob3VsZCBiZSAxLCAyIG9yIDQiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgIAotICAgICAgICBydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGxlbik7Ci0gICAgICAgIGlmICggcnYgPT0gMCApCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIG5jcCA9IChzaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKLSAgICAKLSAgICAKLSAgICAgICAgZm9yICggaT0wOyBpIDwgbGVuOyBpICs9IHNpemUgKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCBzaXplID09IDEgKSAgICAgIHZhbCA9IChpbnQpKkNIQVJQKGNwLCBpKTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgdmFsID0gKGludCkqU0hPUlRQKGNwLCBpKTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgdmFsID0gKGludCkqTE9OR1AoY3AsIGkpOwotICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgKkNIQVJQKG5jcCwgaSkgPSAoc2lnbmVkIGNoYXIpKHZhbCtiaWFzKTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgKlNIT1JUUChuY3AsIGkpID0gKHNob3J0KSh2YWwrYmlhcyk7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApICpMT05HUChuY3AsIGkpID0gKFB5X0ludDMyKSh2YWwrYmlhcyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJ2OworICAgIGlmICggc2l6ZSAhPSAxICYmIHNpemUgIT0gMiAmJiBzaXplICE9IDQpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGxlbik7CisgICAgaWYgKCBydiA9PSAwICkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgbmNwID0gKHNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpOworCisKKyAgICBmb3IgKCBpPTA7IGkgPCBsZW47IGkgKz0gc2l6ZSApIHsKKyAgICAgICAgaWYgKCBzaXplID09IDEgKSAgICAgIHZhbCA9IChpbnQpKkNIQVJQKGNwLCBpKTsKKyAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbCA9IChpbnQpKlNIT1JUUChjcCwgaSk7CisgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSB2YWwgPSAoaW50KSpMT05HUChjcCwgaSk7CisKKyAgICAgICAgaWYgKCBzaXplID09IDEgKSAgICAgICpDSEFSUChuY3AsIGkpID0gKHNpZ25lZCBjaGFyKSh2YWwrYmlhcyk7CisgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSAqU0hPUlRQKG5jcCwgaSkgPSAoc2hvcnQpKHZhbCtiaWFzKTsKKyAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApICpMT05HUChuY3AsIGkpID0gKFB5X0ludDMyKSh2YWwrYmlhcyk7CisgICAgfQorICAgIHJldHVybiBydjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGF1ZGlvb3BfcmV2ZXJzZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0gICAgICAgIHNpZ25lZCBjaGFyICpjcDsKLSAgICAgICAgdW5zaWduZWQgY2hhciAqbmNwOwotICAgICAgICBpbnQgbGVuLCBzaXplLCB2YWwgPSAwOwotICAgICAgICBQeU9iamVjdCAqcnY7Ci0gICAgICAgIGludCBpLCBqOworICAgIHNpZ25lZCBjaGFyICpjcDsKKyAgICB1bnNpZ25lZCBjaGFyICpuY3A7CisgICAgaW50IGxlbiwgc2l6ZSwgdmFsID0gMDsKKyAgICBQeU9iamVjdCAqcnY7CisgICAgaW50IGksIGo7CiAKLSAgICAgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyNpOnJldmVyc2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAmY3AsICZsZW4sICZzaXplKSApCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyNpOnJldmVyc2UiLAorICAgICAgICAgICAgICAgICAgICAgICZjcCwgJmxlbiwgJnNpemUpICkKKyAgICAgICAgcmV0dXJuIDA7CiAKLSAgICAgICAgaWYgKCBzaXplICE9IDEgJiYgc2l6ZSAhPSAyICYmIHNpemUgIT0gNCApIHsKLSAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAKLSAgICAgICAgcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBsZW4pOwotICAgICAgICBpZiAoIHJ2ID09IDAgKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICBuY3AgPSAodW5zaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKLSAgICAKLSAgICAgICAgZm9yICggaT0wOyBpIDwgbGVuOyBpICs9IHNpemUgKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCBzaXplID09IDEgKSAgICAgIHZhbCA9ICgoaW50KSpDSEFSUChjcCwgaSkpIDw8IDg7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbCA9IChpbnQpKlNIT1JUUChjcCwgaSk7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbCA9ICgoaW50KSpMT05HUChjcCwgaSkpID4+IDE2OworICAgIGlmICggc2l6ZSAhPSAxICYmIHNpemUgIT0gMiAmJiBzaXplICE9IDQgKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJTaXplIHNob3VsZCBiZSAxLCAyIG9yIDQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCi0gICAgICAgICAgICAgICAgaiA9IGxlbiAtIGkgLSBzaXplOwotICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgKkNIQVJQKG5jcCwgaikgPSAoc2lnbmVkIGNoYXIpKHZhbCA+PiA4KTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgKlNIT1JUUChuY3AsIGopID0gKHNob3J0KSh2YWwpOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSAqTE9OR1AobmNwLCBqKSA9IChQeV9JbnQzMikodmFsPDwxNik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJ2OworICAgIHJ2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbGVuKTsKKyAgICBpZiAoIHJ2ID09IDAgKQorICAgICAgICByZXR1cm4gMDsKKyAgICBuY3AgPSAodW5zaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKKworICAgIGZvciAoIGk9MDsgaSA8IGxlbjsgaSArPSBzaXplICkgeworICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgdmFsID0gKChpbnQpKkNIQVJQKGNwLCBpKSkgPDwgODsKKyAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbCA9IChpbnQpKlNIT1JUUChjcCwgaSk7CisgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSB2YWwgPSAoKGludCkqTE9OR1AoY3AsIGkpKSA+PiAxNjsKKworICAgICAgICBqID0gbGVuIC0gaSAtIHNpemU7CisKKyAgICAgICAgaWYgKCBzaXplID09IDEgKSAgICAgICpDSEFSUChuY3AsIGopID0gKHNpZ25lZCBjaGFyKSh2YWwgPj4gOCk7CisgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSAqU0hPUlRQKG5jcCwgaikgPSAoc2hvcnQpKHZhbCk7CisgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSAqTE9OR1AobmNwLCBqKSA9IChQeV9JbnQzMikodmFsPDwxNik7CisgICAgfQorICAgIHJldHVybiBydjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGF1ZGlvb3BfbGluMmxpbihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0gICAgICAgIHNpZ25lZCBjaGFyICpjcDsKLSAgICAgICAgdW5zaWduZWQgY2hhciAqbmNwOwotICAgICAgICBpbnQgbGVuLCBuZXdfbGVuLCBzaXplLCBzaXplMiwgdmFsID0gMDsKLSAgICAgICAgUHlPYmplY3QgKnJ2OwotICAgICAgICBpbnQgaSwgajsKKyAgICBzaWduZWQgY2hhciAqY3A7CisgICAgdW5zaWduZWQgY2hhciAqbmNwOworICAgIGludCBsZW4sIG5ld19sZW4sIHNpemUsIHNpemUyLCB2YWwgPSAwOworICAgIFB5T2JqZWN0ICpydjsKKyAgICBpbnQgaSwgajsKIAotICAgICAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI2lpOmxpbjJsaW4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAmY3AsICZsZW4sICZzaXplLCAmc2l6ZTIpICkKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI2lpOmxpbjJsaW4iLAorICAgICAgICAgICAgICAgICAgICAgICZjcCwgJmxlbiwgJnNpemUsICZzaXplMikgKQorICAgICAgICByZXR1cm4gMDsKIAotICAgICAgICBpZiAoIChzaXplICE9IDEgJiYgc2l6ZSAhPSAyICYmIHNpemUgIT0gNCkgfHwKLSAgICAgICAgICAgICAoc2l6ZTIgIT0gMSAmJiBzaXplMiAhPSAyICYmIHNpemUyICE9IDQpKSB7Ci0gICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOwotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgCi0gICAgICAgIG5ld19sZW4gPSAobGVuL3NpemUpKnNpemUyOwotICAgICAgICBpZiAobmV3X2xlbiA8IDApIHsKLSAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTWVtb3J5RXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJub3QgZW5vdWdoIG1lbW9yeSBmb3Igb3V0cHV0IGJ1ZmZlciIpOwotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIHJ2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbmV3X2xlbik7Ci0gICAgICAgIGlmICggcnYgPT0gMCApCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIG5jcCA9ICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpOwotICAgIAotICAgICAgICBmb3IgKCBpPTAsIGo9MDsgaSA8IGxlbjsgaSArPSBzaXplLCBqICs9IHNpemUyICkgewotICAgICAgICAgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICB2YWwgPSAoKGludCkqQ0hBUlAoY3AsIGkpKSA8PCA4OwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSB2YWwgPSAoaW50KSpTSE9SVFAoY3AsIGkpOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSB2YWwgPSAoKGludCkqTE9OR1AoY3AsIGkpKSA+PiAxNjsKKyAgICBpZiAoIChzaXplICE9IDEgJiYgc2l6ZSAhPSAyICYmIHNpemUgIT0gNCkgfHwKKyAgICAgICAgIChzaXplMiAhPSAxICYmIHNpemUyICE9IDIgJiYgc2l6ZTIgIT0gNCkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLSAgICAgICAgICAgICAgICBpZiAoIHNpemUyID09IDEgKSAgKkNIQVJQKG5jcCwgaikgPSAoc2lnbmVkIGNoYXIpKHZhbCA+PiA4KTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZTIgPT0gMiApICpTSE9SVFAobmNwLCBqKSA9IChzaG9ydCkodmFsKTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZTIgPT0gNCApICpMT05HUChuY3AsIGopID0gKFB5X0ludDMyKSh2YWw8PDE2KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcnY7CisgICAgbmV3X2xlbiA9IChsZW4vc2l6ZSkqc2l6ZTI7CisgICAgaWYgKG5ld19sZW4gPCAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19NZW1vcnlFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJub3QgZW5vdWdoIG1lbW9yeSBmb3Igb3V0cHV0IGJ1ZmZlciIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBuZXdfbGVuKTsKKyAgICBpZiAoIHJ2ID09IDAgKQorICAgICAgICByZXR1cm4gMDsKKyAgICBuY3AgPSAodW5zaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKKworICAgIGZvciAoIGk9MCwgaj0wOyBpIDwgbGVuOyBpICs9IHNpemUsIGogKz0gc2l6ZTIgKSB7CisgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICB2YWwgPSAoKGludCkqQ0hBUlAoY3AsIGkpKSA8PCA4OworICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgdmFsID0gKGludCkqU0hPUlRQKGNwLCBpKTsKKyAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbCA9ICgoaW50KSpMT05HUChjcCwgaSkpID4+IDE2OworCisgICAgICAgIGlmICggc2l6ZTIgPT0gMSApICAqQ0hBUlAobmNwLCBqKSA9IChzaWduZWQgY2hhcikodmFsID4+IDgpOworICAgICAgICBlbHNlIGlmICggc2l6ZTIgPT0gMiApICpTSE9SVFAobmNwLCBqKSA9IChzaG9ydCkodmFsKTsKKyAgICAgICAgZWxzZSBpZiAoIHNpemUyID09IDQgKSAqTE9OR1AobmNwLCBqKSA9IChQeV9JbnQzMikodmFsPDwxNik7CisgICAgfQorICAgIHJldHVybiBydjsKIH0KIAogc3RhdGljIGludAogZ2NkKGludCBhLCBpbnQgYikKIHsKLSAgICAgICAgd2hpbGUgKGIgPiAwKSB7Ci0gICAgICAgICAgICAgICAgaW50IHRtcCA9IGEgJSBiOwotICAgICAgICAgICAgICAgIGEgPSBiOwotICAgICAgICAgICAgICAgIGIgPSB0bXA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGE7CisgICAgd2hpbGUgKGIgPiAwKSB7CisgICAgICAgIGludCB0bXAgPSBhICUgYjsKKyAgICAgICAgYSA9IGI7CisgICAgICAgIGIgPSB0bXA7CisgICAgfQorICAgIHJldHVybiBhOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYXVkaW9vcF9yYXRlY3YoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotICAgICAgICBjaGFyICpjcCwgKm5jcDsKLSAgICAgICAgaW50IGxlbiwgc2l6ZSwgbmNoYW5uZWxzLCBpbnJhdGUsIG91dHJhdGUsIHdlaWdodEEsIHdlaWdodEI7Ci0gICAgICAgIGludCBjaGFuLCBkLCAqcHJldl9pLCAqY3VyX2ksIGN1cl9vOwotICAgICAgICBQeU9iamVjdCAqc3RhdGUsICpzYW1wcywgKnN0ciwgKnJ2ID0gTlVMTDsKLSAgICAgICAgaW50IGJ5dGVzX3Blcl9mcmFtZTsKLSAgICAgICAgc2l6ZV90IGFsbG9jX3NpemU7CisgICAgY2hhciAqY3AsICpuY3A7CisgICAgaW50IGxlbiwgc2l6ZSwgbmNoYW5uZWxzLCBpbnJhdGUsIG91dHJhdGUsIHdlaWdodEEsIHdlaWdodEI7CisgICAgaW50IGNoYW4sIGQsICpwcmV2X2ksICpjdXJfaSwgY3VyX287CisgICAgUHlPYmplY3QgKnN0YXRlLCAqc2FtcHMsICpzdHIsICpydiA9IE5VTEw7CisgICAgaW50IGJ5dGVzX3Blcl9mcmFtZTsKKyAgICBzaXplX3QgYWxsb2Nfc2l6ZTsKIAotICAgICAgICB3ZWlnaHRBID0gMTsKLSAgICAgICAgd2VpZ2h0QiA9IDA7Ci0gICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyNpaWlpT3xpaTpyYXRlY3YiLCAmY3AsICZsZW4sICZzaXplLAotCSAgICAgICAgICAgICAgICAgICAgICAmbmNoYW5uZWxzLCAmaW5yYXRlLCAmb3V0cmF0ZSwgJnN0YXRlLAotCQkJICAgICAgJndlaWdodEEsICZ3ZWlnaHRCKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgaWYgKHNpemUgIT0gMSAmJiBzaXplICE9IDIgJiYgc2l6ZSAhPSA0KSB7Ci0gICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIGlmIChuY2hhbm5lbHMgPCAxKSB7Ci0gICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIiMgb2YgY2hhbm5lbHMgc2hvdWxkIGJlID49IDEiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBieXRlc19wZXJfZnJhbWUgPSBzaXplICogbmNoYW5uZWxzOwotICAgICAgICBpZiAoYnl0ZXNfcGVyX2ZyYW1lIC8gbmNoYW5uZWxzICE9IHNpemUpIHsKLSAgICAgICAgICAgICAgICAvKiBUaGlzIG92ZXJmbG93IHRlc3QgaXMgcmlnb3JvdXNseSBjb3JyZWN0IGJlY2F1c2UKLSAgICAgICAgICAgICAgICAgICBib3RoIG11bHRpcGxpY2FuZHMgYXJlID49IDEuICBVc2UgdGhlIGFyZ3VtZW50IG5hbWVzCi0gICAgICAgICAgICAgICAgICAgZnJvbSB0aGUgZG9jcyBmb3IgdGhlIGVycm9yIG1zZy4gKi8KLSAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndpZHRoICogbmNoYW5uZWxzIHRvbyBiaWcgZm9yIGEgQyBpbnQiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBpZiAod2VpZ2h0QSA8IDEgfHwgd2VpZ2h0QiA8IDApIHsKLSAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgIndlaWdodEEgc2hvdWxkIGJlID49IDEsIHdlaWdodEIgc2hvdWxkIGJlID49IDAiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBpZiAobGVuICUgYnl0ZXNfcGVyX2ZyYW1lICE9IDApIHsKLSAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAibm90IGEgd2hvbGUgbnVtYmVyIG9mIGZyYW1lcyIpOwotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbnJhdGUgPD0gMCB8fCBvdXRyYXRlIDw9IDApIHsKLSAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAic2FtcGxpbmcgcmF0ZSBub3QgPiAwIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgLyogZGl2aWRlIGlucmF0ZSBhbmQgb3V0cmF0ZSBieSB0aGVpciBncmVhdGVzdCBjb21tb24gZGl2aXNvciAqLwotICAgICAgICBkID0gZ2NkKGlucmF0ZSwgb3V0cmF0ZSk7Ci0gICAgICAgIGlucmF0ZSAvPSBkOwotICAgICAgICBvdXRyYXRlIC89IGQ7CisgICAgd2VpZ2h0QSA9IDE7CisgICAgd2VpZ2h0QiA9IDA7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI2lpaWlPfGlpOnJhdGVjdiIsICZjcCwgJmxlbiwgJnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZuY2hhbm5lbHMsICZpbnJhdGUsICZvdXRyYXRlLCAmc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ3ZWlnaHRBLCAmd2VpZ2h0QikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChzaXplICE9IDEgJiYgc2l6ZSAhPSAyICYmIHNpemUgIT0gNCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAobmNoYW5uZWxzIDwgMSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiIyBvZiBjaGFubmVscyBzaG91bGQgYmUgPj0gMSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgYnl0ZXNfcGVyX2ZyYW1lID0gc2l6ZSAqIG5jaGFubmVsczsKKyAgICBpZiAoYnl0ZXNfcGVyX2ZyYW1lIC8gbmNoYW5uZWxzICE9IHNpemUpIHsKKyAgICAgICAgLyogVGhpcyBvdmVyZmxvdyB0ZXN0IGlzIHJpZ29yb3VzbHkgY29ycmVjdCBiZWNhdXNlCisgICAgICAgICAgIGJvdGggbXVsdGlwbGljYW5kcyBhcmUgPj0gMS4gIFVzZSB0aGUgYXJndW1lbnQgbmFtZXMKKyAgICAgICAgICAgZnJvbSB0aGUgZG9jcyBmb3IgdGhlIGVycm9yIG1zZy4gKi8KKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAid2lkdGggKiBuY2hhbm5lbHMgdG9vIGJpZyBmb3IgYSBDIGludCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKHdlaWdodEEgPCAxIHx8IHdlaWdodEIgPCAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsCisgICAgICAgICAgICAid2VpZ2h0QSBzaG91bGQgYmUgPj0gMSwgd2VpZ2h0QiBzaG91bGQgYmUgPj0gMCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKGxlbiAlIGJ5dGVzX3Blcl9mcmFtZSAhPSAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJub3QgYSB3aG9sZSBudW1iZXIgb2YgZnJhbWVzIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoaW5yYXRlIDw9IDAgfHwgb3V0cmF0ZSA8PSAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJzYW1wbGluZyByYXRlIG5vdCA+IDAiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIC8qIGRpdmlkZSBpbnJhdGUgYW5kIG91dHJhdGUgYnkgdGhlaXIgZ3JlYXRlc3QgY29tbW9uIGRpdmlzb3IgKi8KKyAgICBkID0gZ2NkKGlucmF0ZSwgb3V0cmF0ZSk7CisgICAgaW5yYXRlIC89IGQ7CisgICAgb3V0cmF0ZSAvPSBkOwogCi0gICAgICAgIGFsbG9jX3NpemUgPSBzaXplb2YoaW50KSAqICh1bnNpZ25lZCluY2hhbm5lbHM7Ci0gICAgICAgIGlmIChhbGxvY19zaXplIDwgbmNoYW5uZWxzKSB7Ci0gICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX01lbW9yeUVycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm90IGVub3VnaCBtZW1vcnkgZm9yIG91dHB1dCBidWZmZXIiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICBhbGxvY19zaXplID0gc2l6ZW9mKGludCkgKiAodW5zaWduZWQpbmNoYW5uZWxzOworICAgIGlmIChhbGxvY19zaXplIDwgbmNoYW5uZWxzKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19NZW1vcnlFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJub3QgZW5vdWdoIG1lbW9yeSBmb3Igb3V0cHV0IGJ1ZmZlciIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcHJldl9pID0gKGludCAqKSBtYWxsb2MoYWxsb2Nfc2l6ZSk7CisgICAgY3VyX2kgPSAoaW50ICopIG1hbGxvYyhhbGxvY19zaXplKTsKKyAgICBpZiAocHJldl9pID09IE5VTEwgfHwgY3VyX2kgPT0gTlVMTCkgeworICAgICAgICAodm9pZCkgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgZ290byBleGl0OworICAgIH0KKworICAgIGxlbiAvPSBieXRlc19wZXJfZnJhbWU7IC8qICMgb2YgZnJhbWVzICovCisKKyAgICBpZiAoc3RhdGUgPT0gUHlfTm9uZSkgeworICAgICAgICBkID0gLW91dHJhdGU7CisgICAgICAgIGZvciAoY2hhbiA9IDA7IGNoYW4gPCBuY2hhbm5lbHM7IGNoYW4rKykKKyAgICAgICAgICAgIHByZXZfaVtjaGFuXSA9IGN1cl9pW2NoYW5dID0gMDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJpTyE7YXVkaW9vcC5yYXRlY3Y6IGlsbGVnYWwgc3RhdGUgYXJndW1lbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgJmQsICZQeVR1cGxlX1R5cGUsICZzYW1wcykpCisgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgIGlmIChQeVR1cGxlX1NpemUoc2FtcHMpICE9IG5jaGFubmVscykgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaWxsZWdhbCBzdGF0ZSBhcmd1bWVudCIpOworICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICB9Ci0gICAgICAgIHByZXZfaSA9IChpbnQgKikgbWFsbG9jKGFsbG9jX3NpemUpOwotICAgICAgICBjdXJfaSA9IChpbnQgKikgbWFsbG9jKGFsbG9jX3NpemUpOwotICAgICAgICBpZiAocHJldl9pID09IE5VTEwgfHwgY3VyX2kgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICh2b2lkKSBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICBmb3IgKGNoYW4gPSAwOyBjaGFuIDwgbmNoYW5uZWxzOyBjaGFuKyspIHsKKyAgICAgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShQeVR1cGxlX0dldEl0ZW0oc2FtcHMsIGNoYW4pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpaTpyYXRlY3YiLCAmcHJldl9pW2NoYW5dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3VyX2lbY2hhbl0pKQogICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICAgICAgfQorICAgIH0KIAotICAgICAgICBsZW4gLz0gYnl0ZXNfcGVyX2ZyYW1lOyAvKiAjIG9mIGZyYW1lcyAqLworICAgIC8qIHN0ciA8LSBTcGFjZSBmb3IgdGhlIG91dHB1dCBidWZmZXIuICovCisgICAgeworICAgICAgICAvKiBUaGVyZSBhcmUgbGVuIGlucHV0IGZyYW1lcywgc28gd2UgbmVlZCAobWF0aGVtYXRpY2FsbHkpCisgICAgICAgICAgIGNlaWxpbmcobGVuKm91dHJhdGUvaW5yYXRlKSBvdXRwdXQgZnJhbWVzLCBhbmQgZWFjaCBmcmFtZQorICAgICAgICAgICByZXF1aXJlcyBieXRlc19wZXJfZnJhbWUgYnl0ZXMuICBDb21wdXRpbmcgdGhpcworICAgICAgICAgICB3aXRob3V0IHNwdXJpb3VzIG92ZXJmbG93IGlzIHRoZSBjaGFsbGVuZ2U7IHdlIGNhbgorICAgICAgICAgICBzZXR0bGUgZm9yIGEgcmVhc29uYWJsZSB1cHBlciBib3VuZCwgdGhvdWdoLiAqLworICAgICAgICBpbnQgY2VpbGluZzsgICAvKiB0aGUgbnVtYmVyIG9mIG91dHB1dCBmcmFtZXMgKi8KKyAgICAgICAgaW50IG5ieXRlczsgICAgLyogdGhlIG51bWJlciBvZiBvdXRwdXQgYnl0ZXMgbmVlZGVkICovCisgICAgICAgIGludCBxID0gbGVuIC8gaW5yYXRlOworICAgICAgICAvKiBOb3cgbGVuID0gcSAqIGlucmF0ZSArIHIgZXhhY3RseSAod2l0aCByID0gbGVuICUgaW5yYXRlKSwKKyAgICAgICAgICAgYW5kIHRoaXMgaXMgbGVzcyB0aGFuIHEgKiBpbnJhdGUgKyBpbnJhdGUgPSAocSsxKSppbnJhdGUuCisgICAgICAgICAgIFNvIGEgcmVhc29uYWJsZSB1cHBlciBib3VuZCBvbiBsZW4qb3V0cmF0ZS9pbnJhdGUgaXMKKyAgICAgICAgICAgKChxKzEpKmlucmF0ZSkqb3V0cmF0ZS9pbnJhdGUgPQorICAgICAgICAgICAocSsxKSpvdXRyYXRlLgorICAgICAgICAqLworICAgICAgICBjZWlsaW5nID0gKHErMSkgKiBvdXRyYXRlOworICAgICAgICBuYnl0ZXMgPSBjZWlsaW5nICogYnl0ZXNfcGVyX2ZyYW1lOworICAgICAgICAvKiBTZWUgd2hldGhlciBhbnl0aGluZyBvdmVyZmxvd2VkOyBpZiBub3QsIGdldCB0aGUgc3BhY2UuICovCisgICAgICAgIGlmIChxKzEgPCAwIHx8CisgICAgICAgICAgICBjZWlsaW5nIC8gb3V0cmF0ZSAhPSBxKzEgfHwKKyAgICAgICAgICAgIG5ieXRlcyAvIGJ5dGVzX3Blcl9mcmFtZSAhPSBjZWlsaW5nKQorICAgICAgICAgICAgc3RyID0gTlVMTDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc3RyID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbmJ5dGVzKTsKIAotICAgICAgICBpZiAoc3RhdGUgPT0gUHlfTm9uZSkgewotICAgICAgICAgICAgICAgIGQgPSAtb3V0cmF0ZTsKKyAgICAgICAgaWYgKHN0ciA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTWVtb3J5RXJyb3IsCisgICAgICAgICAgICAgICAgIm5vdCBlbm91Z2ggbWVtb3J5IGZvciBvdXRwdXQgYnVmZmVyIik7CisgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgIH0KKyAgICB9CisgICAgbmNwID0gUHlTdHJpbmdfQXNTdHJpbmcoc3RyKTsKKworICAgIGZvciAoOzspIHsKKyAgICAgICAgd2hpbGUgKGQgPCAwKSB7CisgICAgICAgICAgICBpZiAobGVuID09IDApIHsKKyAgICAgICAgICAgICAgICBzYW1wcyA9IFB5VHVwbGVfTmV3KG5jaGFubmVscyk7CisgICAgICAgICAgICAgICAgaWYgKHNhbXBzID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICAgICAgICAgICAgICBmb3IgKGNoYW4gPSAwOyBjaGFuIDwgbmNoYW5uZWxzOyBjaGFuKyspCi0gICAgICAgICAgICAgICAgICAgICAgICBwcmV2X2lbY2hhbl0gPSBjdXJfaVtjaGFuXSA9IDA7CisgICAgICAgICAgICAgICAgICAgIFB5VHVwbGVfU2V0SXRlbShzYW1wcywgY2hhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5X0J1aWxkVmFsdWUoIihpaSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2X2lbY2hhbl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cl9pW2NoYW5dKSk7CisgICAgICAgICAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgICAgICAgICAvKiBXZSBoYXZlIGNoZWNrZWQgYmVmb3JlIHRoYXQgdGhlIGxlbmd0aAorICAgICAgICAgICAgICAgICAqIG9mIHRoZSBzdHJpbmcgZml0cyBpbnRvIGludC4gKi8KKyAgICAgICAgICAgICAgICBsZW4gPSAoaW50KShuY3AgLSBQeVN0cmluZ19Bc1N0cmluZyhzdHIpKTsKKyAgICAgICAgICAgICAgICBpZiAobGVuID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLypkb24ndCB3YW50IHRvIHJlc2l6ZSB0byB6ZXJvIGxlbmd0aCovCisgICAgICAgICAgICAgICAgICAgIHJ2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoIiIsIDApOworICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoc3RyKTsKKyAgICAgICAgICAgICAgICAgICAgc3RyID0gcnY7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChfUHlTdHJpbmdfUmVzaXplKCZzdHIsIGxlbikgPCAwKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgICAgICAgICAgcnYgPSBQeV9CdWlsZFZhbHVlKCIoTyhpTykpIiwgc3RyLCBkLCBzYW1wcyk7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHNhbXBzKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoc3RyKTsKKyAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7IC8qIHJldHVybiBydiAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChjaGFuID0gMDsgY2hhbiA8IG5jaGFubmVsczsgY2hhbisrKSB7CisgICAgICAgICAgICAgICAgcHJldl9pW2NoYW5dID0gY3VyX2lbY2hhbl07CisgICAgICAgICAgICAgICAgaWYgKHNpemUgPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgY3VyX2lbY2hhbl0gPSAoKGludCkqQ0hBUlAoY3AsIDApKSA8PCA4OworICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNpemUgPT0gMikKKyAgICAgICAgICAgICAgICAgICAgY3VyX2lbY2hhbl0gPSAoaW50KSpTSE9SVFAoY3AsIDApOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNpemUgPT0gNCkKKyAgICAgICAgICAgICAgICAgICAgY3VyX2lbY2hhbl0gPSAoKGludCkqTE9OR1AoY3AsIDApKSA+PiAxNjsKKyAgICAgICAgICAgICAgICBjcCArPSBzaXplOworICAgICAgICAgICAgICAgIC8qIGltcGxlbWVudHMgYSBzaW1wbGUgZGlnaXRhbCBmaWx0ZXIgKi8KKyAgICAgICAgICAgICAgICBjdXJfaVtjaGFuXSA9CisgICAgICAgICAgICAgICAgICAgICh3ZWlnaHRBICogY3VyX2lbY2hhbl0gKworICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0QiAqIHByZXZfaVtjaGFuXSkgLworICAgICAgICAgICAgICAgICAgICAod2VpZ2h0QSArIHdlaWdodEIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGVuLS07CisgICAgICAgICAgICBkICs9IG91dHJhdGU7CiAgICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKHN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaU8hO2F1ZGlvb3AucmF0ZWN2OiBpbGxlZ2FsIHN0YXRlIGFyZ3VtZW50IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmQsICZQeVR1cGxlX1R5cGUsICZzYW1wcykpCi0gICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7Ci0gICAgICAgICAgICAgICAgaWYgKFB5VHVwbGVfU2l6ZShzYW1wcykgIT0gbmNoYW5uZWxzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbGxlZ2FsIHN0YXRlIGFyZ3VtZW50Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZvciAoY2hhbiA9IDA7IGNoYW4gPCBuY2hhbm5lbHM7IGNoYW4rKykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKFB5VHVwbGVfR2V0SXRlbShzYW1wcywgY2hhbiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlpOnJhdGVjdiIsICZwcmV2X2lbY2hhbl0sIAotCQkJCQkgICAgICAgICAgICAgICAgICAgJmN1cl9pW2NoYW5dKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKGQgPj0gMCkgeworICAgICAgICAgICAgZm9yIChjaGFuID0gMDsgY2hhbiA8IG5jaGFubmVsczsgY2hhbisrKSB7CisgICAgICAgICAgICAgICAgY3VyX28gPSAocHJldl9pW2NoYW5dICogZCArCisgICAgICAgICAgICAgICAgICAgICAgICAgY3VyX2lbY2hhbl0gKiAob3V0cmF0ZSAtIGQpKSAvCisgICAgICAgICAgICAgICAgICAgIG91dHJhdGU7CisgICAgICAgICAgICAgICAgaWYgKHNpemUgPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgKkNIQVJQKG5jcCwgMCkgPSAoc2lnbmVkIGNoYXIpKGN1cl9vID4+IDgpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNpemUgPT0gMikKKyAgICAgICAgICAgICAgICAgICAgKlNIT1JUUChuY3AsIDApID0gKHNob3J0KShjdXJfbyk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoc2l6ZSA9PSA0KQorICAgICAgICAgICAgICAgICAgICAqTE9OR1AobmNwLCAwKSA9IChQeV9JbnQzMikoY3VyX288PDE2KTsKKyAgICAgICAgICAgICAgICBuY3AgKz0gc2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGQgLT0gaW5yYXRlOwogICAgICAgICB9Ci0KLSAgICAgICAgLyogc3RyIDwtIFNwYWNlIGZvciB0aGUgb3V0cHV0IGJ1ZmZlci4gKi8KLSAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIFRoZXJlIGFyZSBsZW4gaW5wdXQgZnJhbWVzLCBzbyB3ZSBuZWVkIChtYXRoZW1hdGljYWxseSkKLSAgICAgICAgICAgICAgICAgICBjZWlsaW5nKGxlbipvdXRyYXRlL2lucmF0ZSkgb3V0cHV0IGZyYW1lcywgYW5kIGVhY2ggZnJhbWUKLSAgICAgICAgICAgICAgICAgICByZXF1aXJlcyBieXRlc19wZXJfZnJhbWUgYnl0ZXMuICBDb21wdXRpbmcgdGhpcwotICAgICAgICAgICAgICAgICAgIHdpdGhvdXQgc3B1cmlvdXMgb3ZlcmZsb3cgaXMgdGhlIGNoYWxsZW5nZTsgd2UgY2FuCi0gICAgICAgICAgICAgICAgICAgc2V0dGxlIGZvciBhIHJlYXNvbmFibGUgdXBwZXIgYm91bmQsIHRob3VnaC4gKi8KLSAgICAgICAgICAgICAgICBpbnQgY2VpbGluZzsgICAvKiB0aGUgbnVtYmVyIG9mIG91dHB1dCBmcmFtZXMgKi8KLSAgICAgICAgICAgICAgICBpbnQgbmJ5dGVzOyAgICAvKiB0aGUgbnVtYmVyIG9mIG91dHB1dCBieXRlcyBuZWVkZWQgKi8KLSAgICAgICAgICAgICAgICBpbnQgcSA9IGxlbiAvIGlucmF0ZTsKLSAgICAgICAgICAgICAgICAvKiBOb3cgbGVuID0gcSAqIGlucmF0ZSArIHIgZXhhY3RseSAod2l0aCByID0gbGVuICUgaW5yYXRlKSwKLSAgICAgICAgICAgICAgICAgICBhbmQgdGhpcyBpcyBsZXNzIHRoYW4gcSAqIGlucmF0ZSArIGlucmF0ZSA9IChxKzEpKmlucmF0ZS4KLSAgICAgICAgICAgICAgICAgICBTbyBhIHJlYXNvbmFibGUgdXBwZXIgYm91bmQgb24gbGVuKm91dHJhdGUvaW5yYXRlIGlzCi0gICAgICAgICAgICAgICAgICAgKChxKzEpKmlucmF0ZSkqb3V0cmF0ZS9pbnJhdGUgPQotICAgICAgICAgICAgICAgICAgIChxKzEpKm91dHJhdGUuCi0gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBjZWlsaW5nID0gKHErMSkgKiBvdXRyYXRlOwotICAgICAgICAgICAgICAgIG5ieXRlcyA9IGNlaWxpbmcgKiBieXRlc19wZXJfZnJhbWU7Ci0gICAgICAgICAgICAgICAgLyogU2VlIHdoZXRoZXIgYW55dGhpbmcgb3ZlcmZsb3dlZDsgaWYgbm90LCBnZXQgdGhlIHNwYWNlLiAqLwotICAgICAgICAgICAgICAgIGlmIChxKzEgPCAwIHx8Ci0gICAgICAgICAgICAgICAgICAgIGNlaWxpbmcgLyBvdXRyYXRlICE9IHErMSB8fAotICAgICAgICAgICAgICAgICAgICBuYnl0ZXMgLyBieXRlc19wZXJfZnJhbWUgIT0gY2VpbGluZykKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0ciA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgc3RyID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbmJ5dGVzKTsKLQotICAgICAgICAgICAgICAgIGlmIChzdHIgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX01lbW9yeUVycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm90IGVub3VnaCBtZW1vcnkgZm9yIG91dHB1dCBidWZmZXIiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbmNwID0gUHlTdHJpbmdfQXNTdHJpbmcoc3RyKTsKLQotICAgICAgICBmb3IgKDs7KSB7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGQgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGVuID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcHMgPSBQeVR1cGxlX05ldyhuY2hhbm5lbHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2FtcHMgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY2hhbiA9IDA7IGNoYW4gPCBuY2hhbm5lbHM7IGNoYW4rKykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVR1cGxlX1NldEl0ZW0oc2FtcHMsIGNoYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9CdWlsZFZhbHVlKCIoaWkpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldl9pW2NoYW5dLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJfaVtjaGFuXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdlIGhhdmUgY2hlY2tlZCBiZWZvcmUgdGhhdCB0aGUgbGVuZ3RoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG9mIHRoZSBzdHJpbmcgZml0cyBpbnRvIGludC4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gKGludCkobmNwIC0gUHlTdHJpbmdfQXNTdHJpbmcoc3RyKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZW4gPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qZG9uJ3Qgd2FudCB0byByZXNpemUgdG8gemVybyBsZW5ndGgqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoIiIsIDApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihzdHIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciA9IHJ2OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKF9QeVN0cmluZ19SZXNpemUoJnN0ciwgbGVuKSA8IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydiA9IFB5X0J1aWxkVmFsdWUoIihPKGlPKSkiLCBzdHIsIGQsIHNhbXBzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHNhbXBzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHN0cik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsgLyogcmV0dXJuIHJ2ICovCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNoYW4gPSAwOyBjaGFuIDwgbmNoYW5uZWxzOyBjaGFuKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldl9pW2NoYW5dID0gY3VyX2lbY2hhbl07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaXplID09IDEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJfaVtjaGFuXSA9ICgoaW50KSpDSEFSUChjcCwgMCkpIDw8IDg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNpemUgPT0gMikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cl9pW2NoYW5dID0gKGludCkqU0hPUlRQKGNwLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc2l6ZSA9PSA0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyX2lbY2hhbl0gPSAoKGludCkqTE9OR1AoY3AsIDApKSA+PiAxNjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3AgKz0gc2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW1wbGVtZW50cyBhIHNpbXBsZSBkaWdpdGFsIGZpbHRlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJfaVtjaGFuXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdlaWdodEEgKiBjdXJfaVtjaGFuXSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodEIgKiBwcmV2X2lbY2hhbl0pIC8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2VpZ2h0QSArIHdlaWdodEIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbGVuLS07Ci0gICAgICAgICAgICAgICAgICAgICAgICBkICs9IG91dHJhdGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHdoaWxlIChkID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY2hhbiA9IDA7IGNoYW4gPCBuY2hhbm5lbHM7IGNoYW4rKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJfbyA9IChwcmV2X2lbY2hhbl0gKiBkICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyX2lbY2hhbl0gKiAob3V0cmF0ZSAtIGQpKSAvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNpemUgPT0gMSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpDSEFSUChuY3AsIDApID0gKHNpZ25lZCBjaGFyKShjdXJfbyA+PiA4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc2l6ZSA9PSAyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlNIT1JUUChuY3AsIDApID0gKHNob3J0KShjdXJfbyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNpemUgPT0gNCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpMT05HUChuY3AsIDApID0gKFB5X0ludDMyKShjdXJfbzw8MTYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY3AgKz0gc2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGQgLT0gaW5yYXRlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgIH0KICAgZXhpdDoKLSAgICAgICAgaWYgKHByZXZfaSAhPSBOVUxMKQotICAgICAgICAgICAgICAgIGZyZWUocHJldl9pKTsKLSAgICAgICAgaWYgKGN1cl9pICE9IE5VTEwpCi0gICAgICAgICAgICAgICAgZnJlZShjdXJfaSk7Ci0gICAgICAgIHJldHVybiBydjsKKyAgICBpZiAocHJldl9pICE9IE5VTEwpCisgICAgICAgIGZyZWUocHJldl9pKTsKKyAgICBpZiAoY3VyX2kgIT0gTlVMTCkKKyAgICAgICAgZnJlZShjdXJfaSk7CisgICAgcmV0dXJuIHJ2OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYXVkaW9vcF9saW4ydWxhdyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0gICAgICAgIHNpZ25lZCBjaGFyICpjcDsKLSAgICAgICAgdW5zaWduZWQgY2hhciAqbmNwOwotICAgICAgICBpbnQgbGVuLCBzaXplLCB2YWwgPSAwOwotICAgICAgICBQeU9iamVjdCAqcnY7Ci0gICAgICAgIGludCBpOworICAgIHNpZ25lZCBjaGFyICpjcDsKKyAgICB1bnNpZ25lZCBjaGFyICpuY3A7CisgICAgaW50IGxlbiwgc2l6ZSwgdmFsID0gMDsKKyAgICBQeU9iamVjdCAqcnY7CisgICAgaW50IGk7CiAKLSAgICAgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyNpOmxpbjJ1bGF3IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3AsICZsZW4sICZzaXplKSApCi0gICAgICAgICAgICAgICAgcmV0dXJuIDAgOworICAgIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjaTpsaW4ydWxhdyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3AsICZsZW4sICZzaXplKSApCisgICAgICAgIHJldHVybiAwIDsKIAotICAgICAgICBpZiAoIHNpemUgIT0gMSAmJiBzaXplICE9IDIgJiYgc2l6ZSAhPSA0KSB7Ci0gICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOwotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgCi0gICAgICAgIHJ2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbGVuL3NpemUpOwotICAgICAgICBpZiAoIHJ2ID09IDAgKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICBuY3AgPSAodW5zaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKLSAgICAKLSAgICAgICAgZm9yICggaT0wOyBpIDwgbGVuOyBpICs9IHNpemUgKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCBzaXplID09IDEgKSAgICAgIHZhbCA9ICgoaW50KSpDSEFSUChjcCwgaSkpIDw8IDg7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbCA9IChpbnQpKlNIT1JUUChjcCwgaSk7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbCA9ICgoaW50KSpMT05HUChjcCwgaSkpID4+IDE2OworICAgIGlmICggc2l6ZSAhPSAxICYmIHNpemUgIT0gMiAmJiBzaXplICE9IDQpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLSAgICAgICAgICAgICAgICAqbmNwKysgPSBzdF8xNGxpbmVhcjJ1bGF3KHZhbCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJ2OworICAgIHJ2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbGVuL3NpemUpOworICAgIGlmICggcnYgPT0gMCApCisgICAgICAgIHJldHVybiAwOworICAgIG5jcCA9ICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpOworCisgICAgZm9yICggaT0wOyBpIDwgbGVuOyBpICs9IHNpemUgKSB7CisgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICB2YWwgPSAoKGludCkqQ0hBUlAoY3AsIGkpKSA8PCA4OworICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgdmFsID0gKGludCkqU0hPUlRQKGNwLCBpKTsKKyAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbCA9ICgoaW50KSpMT05HUChjcCwgaSkpID4+IDE2OworCisgICAgICAgICpuY3ArKyA9IHN0XzE0bGluZWFyMnVsYXcodmFsKTsKKyAgICB9CisgICAgcmV0dXJuIHJ2OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYXVkaW9vcF91bGF3MmxpbihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgKmNwOwotICAgICAgICB1bnNpZ25lZCBjaGFyIGN2YWw7Ci0gICAgICAgIHNpZ25lZCBjaGFyICpuY3A7Ci0gICAgICAgIGludCBsZW4sIG5ld19sZW4sIHNpemUsIHZhbDsKLSAgICAgICAgUHlPYmplY3QgKnJ2OwotICAgICAgICBpbnQgaTsKKyAgICB1bnNpZ25lZCBjaGFyICpjcDsKKyAgICB1bnNpZ25lZCBjaGFyIGN2YWw7CisgICAgc2lnbmVkIGNoYXIgKm5jcDsKKyAgICBpbnQgbGVuLCBuZXdfbGVuLCBzaXplLCB2YWw7CisgICAgUHlPYmplY3QgKnJ2OworICAgIGludCBpOwogCi0gICAgICAgIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjaTp1bGF3MmxpbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNwLCAmbGVuLCAmc2l6ZSkgKQotICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjaTp1bGF3MmxpbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3AsICZsZW4sICZzaXplKSApCisgICAgICAgIHJldHVybiAwOwogCi0gICAgICAgIGlmICggc2l6ZSAhPSAxICYmIHNpemUgIT0gMiAmJiBzaXplICE9IDQpIHsKLSAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAKLSAgICAgICAgbmV3X2xlbiA9IGxlbipzaXplOwotICAgICAgICBpZiAobmV3X2xlbiA8IDApIHsKLSAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTWVtb3J5RXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJub3QgZW5vdWdoIG1lbW9yeSBmb3Igb3V0cHV0IGJ1ZmZlciIpOwotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIHJ2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbmV3X2xlbik7Ci0gICAgICAgIGlmICggcnYgPT0gMCApCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIG5jcCA9IChzaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKLSAgICAKLSAgICAgICAgZm9yICggaT0wOyBpIDwgbmV3X2xlbjsgaSArPSBzaXplICkgewotICAgICAgICAgICAgICAgIGN2YWwgPSAqY3ArKzsKLSAgICAgICAgICAgICAgICB2YWwgPSBzdF91bGF3MmxpbmVhcjE2KGN2YWwpOwotICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgKkNIQVJQKG5jcCwgaSkgPSAoc2lnbmVkIGNoYXIpKHZhbCA+PiA4KTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgKlNIT1JUUChuY3AsIGkpID0gKHNob3J0KSh2YWwpOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSAqTE9OR1AobmNwLCBpKSA9IChQeV9JbnQzMikodmFsPDwxNik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJ2OworICAgIGlmICggc2l6ZSAhPSAxICYmIHNpemUgIT0gMiAmJiBzaXplICE9IDQpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBuZXdfbGVuID0gbGVuKnNpemU7CisgICAgaWYgKG5ld19sZW4gPCAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19NZW1vcnlFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJub3QgZW5vdWdoIG1lbW9yeSBmb3Igb3V0cHV0IGJ1ZmZlciIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBuZXdfbGVuKTsKKyAgICBpZiAoIHJ2ID09IDAgKQorICAgICAgICByZXR1cm4gMDsKKyAgICBuY3AgPSAoc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhydik7CisKKyAgICBmb3IgKCBpPTA7IGkgPCBuZXdfbGVuOyBpICs9IHNpemUgKSB7CisgICAgICAgIGN2YWwgPSAqY3ArKzsKKyAgICAgICAgdmFsID0gc3RfdWxhdzJsaW5lYXIxNihjdmFsKTsKKworICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgKkNIQVJQKG5jcCwgaSkgPSAoc2lnbmVkIGNoYXIpKHZhbCA+PiA4KTsKKyAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApICpTSE9SVFAobmNwLCBpKSA9IChzaG9ydCkodmFsKTsKKyAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApICpMT05HUChuY3AsIGkpID0gKFB5X0ludDMyKSh2YWw8PDE2KTsKKyAgICB9CisgICAgcmV0dXJuIHJ2OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYXVkaW9vcF9saW4yYWxhdyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0gICAgICAgIHNpZ25lZCBjaGFyICpjcDsKLSAgICAgICAgdW5zaWduZWQgY2hhciAqbmNwOwotICAgICAgICBpbnQgbGVuLCBzaXplLCB2YWwgPSAwOwotICAgICAgICBQeU9iamVjdCAqcnY7Ci0gICAgICAgIGludCBpOworICAgIHNpZ25lZCBjaGFyICpjcDsKKyAgICB1bnNpZ25lZCBjaGFyICpuY3A7CisgICAgaW50IGxlbiwgc2l6ZSwgdmFsID0gMDsKKyAgICBQeU9iamVjdCAqcnY7CisgICAgaW50IGk7CiAKLSAgICAgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyNpOmxpbjJhbGF3IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3AsICZsZW4sICZzaXplKSApCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyNpOmxpbjJhbGF3IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZjcCwgJmxlbiwgJnNpemUpICkKKyAgICAgICAgcmV0dXJuIDA7CiAKLSAgICAgICAgaWYgKCBzaXplICE9IDEgJiYgc2l6ZSAhPSAyICYmIHNpemUgIT0gNCkgewotICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJTaXplIHNob3VsZCBiZSAxLCAyIG9yIDQiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgIAotICAgICAgICBydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGxlbi9zaXplKTsKLSAgICAgICAgaWYgKCBydiA9PSAwICkKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgbmNwID0gKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhydik7Ci0gICAgCi0gICAgICAgIGZvciAoIGk9MDsgaSA8IGxlbjsgaSArPSBzaXplICkgewotICAgICAgICAgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICB2YWwgPSAoKGludCkqQ0hBUlAoY3AsIGkpKSA8PCA4OwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSB2YWwgPSAoaW50KSpTSE9SVFAoY3AsIGkpOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSB2YWwgPSAoKGludCkqTE9OR1AoY3AsIGkpKSA+PiAxNjsKKyAgICBpZiAoIHNpemUgIT0gMSAmJiBzaXplICE9IDIgJiYgc2l6ZSAhPSA0KSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJTaXplIHNob3VsZCBiZSAxLCAyIG9yIDQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCi0gICAgICAgICAgICAgICAgKm5jcCsrID0gc3RfbGluZWFyMmFsYXcodmFsKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcnY7CisgICAgcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBsZW4vc2l6ZSk7CisgICAgaWYgKCBydiA9PSAwICkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgbmNwID0gKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhydik7CisKKyAgICBmb3IgKCBpPTA7IGkgPCBsZW47IGkgKz0gc2l6ZSApIHsKKyAgICAgICAgaWYgKCBzaXplID09IDEgKSAgICAgIHZhbCA9ICgoaW50KSpDSEFSUChjcCwgaSkpIDw8IDg7CisgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSB2YWwgPSAoaW50KSpTSE9SVFAoY3AsIGkpOworICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgdmFsID0gKChpbnQpKkxPTkdQKGNwLCBpKSkgPj4gMTY7CisKKyAgICAgICAgKm5jcCsrID0gc3RfbGluZWFyMmFsYXcodmFsKTsKKyAgICB9CisgICAgcmV0dXJuIHJ2OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYXVkaW9vcF9hbGF3MmxpbihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgKmNwOwotICAgICAgICB1bnNpZ25lZCBjaGFyIGN2YWw7Ci0gICAgICAgIHNpZ25lZCBjaGFyICpuY3A7Ci0gICAgICAgIGludCBsZW4sIG5ld19sZW4sIHNpemUsIHZhbDsKLSAgICAgICAgUHlPYmplY3QgKnJ2OwotICAgICAgICBpbnQgaTsKKyAgICB1bnNpZ25lZCBjaGFyICpjcDsKKyAgICB1bnNpZ25lZCBjaGFyIGN2YWw7CisgICAgc2lnbmVkIGNoYXIgKm5jcDsKKyAgICBpbnQgbGVuLCBuZXdfbGVuLCBzaXplLCB2YWw7CisgICAgUHlPYmplY3QgKnJ2OworICAgIGludCBpOwogCi0gICAgICAgIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjaTphbGF3MmxpbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNwLCAmbGVuLCAmc2l6ZSkgKQotICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjaTphbGF3MmxpbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3AsICZsZW4sICZzaXplKSApCisgICAgICAgIHJldHVybiAwOwogCi0gICAgICAgIGlmICggc2l6ZSAhPSAxICYmIHNpemUgIT0gMiAmJiBzaXplICE9IDQpIHsKLSAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAKLSAgICAgICAgbmV3X2xlbiA9IGxlbipzaXplOwotICAgICAgICBpZiAobmV3X2xlbiA8IDApIHsKLSAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTWVtb3J5RXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJub3QgZW5vdWdoIG1lbW9yeSBmb3Igb3V0cHV0IGJ1ZmZlciIpOwotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIHJ2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbmV3X2xlbik7Ci0gICAgICAgIGlmICggcnYgPT0gMCApCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIG5jcCA9IChzaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKLSAgICAKLSAgICAgICAgZm9yICggaT0wOyBpIDwgbmV3X2xlbjsgaSArPSBzaXplICkgewotICAgICAgICAgICAgICAgIGN2YWwgPSAqY3ArKzsKLSAgICAgICAgICAgICAgICB2YWwgPSBzdF9hbGF3MmxpbmVhcjE2KGN2YWwpOwotICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgKkNIQVJQKG5jcCwgaSkgPSAoc2lnbmVkIGNoYXIpKHZhbCA+PiA4KTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgKlNIT1JUUChuY3AsIGkpID0gKHNob3J0KSh2YWwpOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSAqTE9OR1AobmNwLCBpKSA9IChQeV9JbnQzMikodmFsPDwxNik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJ2OworICAgIGlmICggc2l6ZSAhPSAxICYmIHNpemUgIT0gMiAmJiBzaXplICE9IDQpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBuZXdfbGVuID0gbGVuKnNpemU7CisgICAgaWYgKG5ld19sZW4gPCAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19NZW1vcnlFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJub3QgZW5vdWdoIG1lbW9yeSBmb3Igb3V0cHV0IGJ1ZmZlciIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBuZXdfbGVuKTsKKyAgICBpZiAoIHJ2ID09IDAgKQorICAgICAgICByZXR1cm4gMDsKKyAgICBuY3AgPSAoc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhydik7CisKKyAgICBmb3IgKCBpPTA7IGkgPCBuZXdfbGVuOyBpICs9IHNpemUgKSB7CisgICAgICAgIGN2YWwgPSAqY3ArKzsKKyAgICAgICAgdmFsID0gc3RfYWxhdzJsaW5lYXIxNihjdmFsKTsKKworICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgKkNIQVJQKG5jcCwgaSkgPSAoc2lnbmVkIGNoYXIpKHZhbCA+PiA4KTsKKyAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApICpTSE9SVFAobmNwLCBpKSA9IChzaG9ydCkodmFsKTsKKyAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApICpMT05HUChuY3AsIGkpID0gKFB5X0ludDMyKSh2YWw8PDE2KTsKKyAgICB9CisgICAgcmV0dXJuIHJ2OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYXVkaW9vcF9saW4yYWRwY20oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotICAgICAgICBzaWduZWQgY2hhciAqY3A7Ci0gICAgICAgIHNpZ25lZCBjaGFyICpuY3A7Ci0gICAgICAgIGludCBsZW4sIHNpemUsIHZhbCA9IDAsIHN0ZXAsIHZhbHByZWQsIGRlbHRhLAotICAgICAgICAgICAgICAgIGluZGV4LCBzaWduLCB2cGRpZmYsIGRpZmY7Ci0gICAgICAgIFB5T2JqZWN0ICpydiwgKnN0YXRlLCAqc3RyOwotICAgICAgICBpbnQgaSwgb3V0cHV0YnVmZmVyID0gMCwgYnVmZmVyc3RlcDsKKyAgICBzaWduZWQgY2hhciAqY3A7CisgICAgc2lnbmVkIGNoYXIgKm5jcDsKKyAgICBpbnQgbGVuLCBzaXplLCB2YWwgPSAwLCBzdGVwLCB2YWxwcmVkLCBkZWx0YSwKKyAgICAgICAgaW5kZXgsIHNpZ24sIHZwZGlmZiwgZGlmZjsKKyAgICBQeU9iamVjdCAqcnYsICpzdGF0ZSwgKnN0cjsKKyAgICBpbnQgaSwgb3V0cHV0YnVmZmVyID0gMCwgYnVmZmVyc3RlcDsKIAotICAgICAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI2lPOmxpbjJhZHBjbSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNwLCAmbGVuLCAmc2l6ZSwgJnN0YXRlKSApCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgCisgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyNpTzpsaW4yYWRwY20iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNwLCAmbGVuLCAmc2l6ZSwgJnN0YXRlKSApCisgICAgICAgIHJldHVybiAwOwogCi0gICAgICAgIGlmICggc2l6ZSAhPSAxICYmIHNpemUgIT0gMiAmJiBzaXplICE9IDQpIHsKLSAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAoIHNpemUgIT0gMSAmJiBzaXplICE9IDIgJiYgc2l6ZSAhPSA0KSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJTaXplIHNob3VsZCBiZSAxLCAyIG9yIDQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgc3RyID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbGVuLyhzaXplKjIpKTsKKyAgICBpZiAoIHN0ciA9PSAwICkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgbmNwID0gKHNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcoc3RyKTsKKworICAgIC8qIERlY29kZSBzdGF0ZSwgc2hvdWxkIGhhdmUgKHZhbHVlLCBzdGVwKSAqLworICAgIGlmICggc3RhdGUgPT0gUHlfTm9uZSApIHsKKyAgICAgICAgLyogRmlyc3QgdGltZSwgaXQgc2VlbXMuIFNldCBkZWZhdWx0cyAqLworICAgICAgICB2YWxwcmVkID0gMDsKKyAgICAgICAgc3RlcCA9IDc7CisgICAgICAgIGluZGV4ID0gMDsKKyAgICB9IGVsc2UgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShzdGF0ZSwgImlpIiwgJnZhbHByZWQsICZpbmRleCkgKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHN0ZXAgPSBzdGVwc2l6ZVRhYmxlW2luZGV4XTsKKyAgICBidWZmZXJzdGVwID0gMTsKKworICAgIGZvciAoIGk9MDsgaSA8IGxlbjsgaSArPSBzaXplICkgeworICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgdmFsID0gKChpbnQpKkNIQVJQKGNwLCBpKSkgPDwgODsKKyAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbCA9IChpbnQpKlNIT1JUUChjcCwgaSk7CisgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSB2YWwgPSAoKGludCkqTE9OR1AoY3AsIGkpKSA+PiAxNjsKKworICAgICAgICAvKiBTdGVwIDEgLSBjb21wdXRlIGRpZmZlcmVuY2Ugd2l0aCBwcmV2aW91cyB2YWx1ZSAqLworICAgICAgICBkaWZmID0gdmFsIC0gdmFscHJlZDsKKyAgICAgICAgc2lnbiA9IChkaWZmIDwgMCkgPyA4IDogMDsKKyAgICAgICAgaWYgKCBzaWduICkgZGlmZiA9ICgtZGlmZik7CisKKyAgICAgICAgLyogU3RlcCAyIC0gRGl2aWRlIGFuZCBjbGFtcCAqLworICAgICAgICAvKiBOb3RlOgorICAgICAgICAqKiBUaGlzIGNvZGUgKmFwcHJveGltYXRlbHkqIGNvbXB1dGVzOgorICAgICAgICAqKiAgICBkZWx0YSA9IGRpZmYqNC9zdGVwOworICAgICAgICAqKiAgICB2cGRpZmYgPSAoZGVsdGErMC41KSpzdGVwLzQ7CisgICAgICAgICoqIGJ1dCBpbiBzaGlmdCBzdGVwIGJpdHMgYXJlIGRyb3BwZWQuIFRoZSBuZXQgcmVzdWx0IG9mIHRoaXMKKyAgICAgICAgKiogaXMgdGhhdCBldmVuIGlmIHlvdSBoYXZlIGZhc3QgbXVsL2RpdiBoYXJkd2FyZSB5b3UgY2Fubm90CisgICAgICAgICoqIHB1dCBpdCB0byBnb29kIHVzZSBzaW5jZSB0aGUgZml4dXAgd291bGQgYmUgdG9vIGV4cGVuc2l2ZS4KKyAgICAgICAgKi8KKyAgICAgICAgZGVsdGEgPSAwOworICAgICAgICB2cGRpZmYgPSAoc3RlcCA+PiAzKTsKKworICAgICAgICBpZiAoIGRpZmYgPj0gc3RlcCApIHsKKyAgICAgICAgICAgIGRlbHRhID0gNDsKKyAgICAgICAgICAgIGRpZmYgLT0gc3RlcDsKKyAgICAgICAgICAgIHZwZGlmZiArPSBzdGVwOwogICAgICAgICB9Ci0gICAgCi0gICAgICAgIHN0ciA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGxlbi8oc2l6ZSoyKSk7Ci0gICAgICAgIGlmICggc3RyID09IDAgKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICBuY3AgPSAoc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhzdHIpOworICAgICAgICBzdGVwID4+PSAxOworICAgICAgICBpZiAoIGRpZmYgPj0gc3RlcCAgKSB7CisgICAgICAgICAgICBkZWx0YSB8PSAyOworICAgICAgICAgICAgZGlmZiAtPSBzdGVwOworICAgICAgICAgICAgdnBkaWZmICs9IHN0ZXA7CisgICAgICAgIH0KKyAgICAgICAgc3RlcCA+Pj0gMTsKKyAgICAgICAgaWYgKCBkaWZmID49IHN0ZXAgKSB7CisgICAgICAgICAgICBkZWx0YSB8PSAxOworICAgICAgICAgICAgdnBkaWZmICs9IHN0ZXA7CisgICAgICAgIH0KIAotICAgICAgICAvKiBEZWNvZGUgc3RhdGUsIHNob3VsZCBoYXZlICh2YWx1ZSwgc3RlcCkgKi8KLSAgICAgICAgaWYgKCBzdGF0ZSA9PSBQeV9Ob25lICkgewotICAgICAgICAgICAgICAgIC8qIEZpcnN0IHRpbWUsIGl0IHNlZW1zLiBTZXQgZGVmYXVsdHMgKi8KLSAgICAgICAgICAgICAgICB2YWxwcmVkID0gMDsKLSAgICAgICAgICAgICAgICBzdGVwID0gNzsKLSAgICAgICAgICAgICAgICBpbmRleCA9IDA7Ci0gICAgICAgIH0gZWxzZSBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKHN0YXRlLCAiaWkiLCAmdmFscHJlZCwgJmluZGV4KSApCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIC8qIFN0ZXAgMyAtIFVwZGF0ZSBwcmV2aW91cyB2YWx1ZSAqLworICAgICAgICBpZiAoIHNpZ24gKQorICAgICAgICAgICAgdmFscHJlZCAtPSB2cGRpZmY7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHZhbHByZWQgKz0gdnBkaWZmOwogCisgICAgICAgIC8qIFN0ZXAgNCAtIENsYW1wIHByZXZpb3VzIHZhbHVlIHRvIDE2IGJpdHMgKi8KKyAgICAgICAgaWYgKCB2YWxwcmVkID4gMzI3NjcgKQorICAgICAgICAgICAgdmFscHJlZCA9IDMyNzY3OworICAgICAgICBlbHNlIGlmICggdmFscHJlZCA8IC0zMjc2OCApCisgICAgICAgICAgICB2YWxwcmVkID0gLTMyNzY4OworCisgICAgICAgIC8qIFN0ZXAgNSAtIEFzc2VtYmxlIHZhbHVlLCB1cGRhdGUgaW5kZXggYW5kIHN0ZXAgdmFsdWVzICovCisgICAgICAgIGRlbHRhIHw9IHNpZ247CisKKyAgICAgICAgaW5kZXggKz0gaW5kZXhUYWJsZVtkZWx0YV07CisgICAgICAgIGlmICggaW5kZXggPCAwICkgaW5kZXggPSAwOworICAgICAgICBpZiAoIGluZGV4ID4gODggKSBpbmRleCA9IDg4OwogICAgICAgICBzdGVwID0gc3RlcHNpemVUYWJsZVtpbmRleF07Ci0gICAgICAgIGJ1ZmZlcnN0ZXAgPSAxOwogCi0gICAgICAgIGZvciAoIGk9MDsgaSA8IGxlbjsgaSArPSBzaXplICkgewotICAgICAgICAgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICB2YWwgPSAoKGludCkqQ0hBUlAoY3AsIGkpKSA8PCA4OwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSB2YWwgPSAoaW50KSpTSE9SVFAoY3AsIGkpOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSB2YWwgPSAoKGludCkqTE9OR1AoY3AsIGkpKSA+PiAxNjsKLQotICAgICAgICAgICAgICAgIC8qIFN0ZXAgMSAtIGNvbXB1dGUgZGlmZmVyZW5jZSB3aXRoIHByZXZpb3VzIHZhbHVlICovCi0gICAgICAgICAgICAgICAgZGlmZiA9IHZhbCAtIHZhbHByZWQ7Ci0gICAgICAgICAgICAgICAgc2lnbiA9IChkaWZmIDwgMCkgPyA4IDogMDsKLSAgICAgICAgICAgICAgICBpZiAoIHNpZ24gKSBkaWZmID0gKC1kaWZmKTsKLQotICAgICAgICAgICAgICAgIC8qIFN0ZXAgMiAtIERpdmlkZSBhbmQgY2xhbXAgKi8KLSAgICAgICAgICAgICAgICAvKiBOb3RlOgotICAgICAgICAgICAgICAgICoqIFRoaXMgY29kZSAqYXBwcm94aW1hdGVseSogY29tcHV0ZXM6Ci0gICAgICAgICAgICAgICAgKiogICAgZGVsdGEgPSBkaWZmKjQvc3RlcDsKLSAgICAgICAgICAgICAgICAqKiAgICB2cGRpZmYgPSAoZGVsdGErMC41KSpzdGVwLzQ7Ci0gICAgICAgICAgICAgICAgKiogYnV0IGluIHNoaWZ0IHN0ZXAgYml0cyBhcmUgZHJvcHBlZC4gVGhlIG5ldCByZXN1bHQgb2YgdGhpcwotICAgICAgICAgICAgICAgICoqIGlzIHRoYXQgZXZlbiBpZiB5b3UgaGF2ZSBmYXN0IG11bC9kaXYgaGFyZHdhcmUgeW91IGNhbm5vdAotICAgICAgICAgICAgICAgICoqIHB1dCBpdCB0byBnb29kIHVzZSBzaW5jZSB0aGUgZml4dXAgd291bGQgYmUgdG9vIGV4cGVuc2l2ZS4KLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGRlbHRhID0gMDsKLSAgICAgICAgICAgICAgICB2cGRpZmYgPSAoc3RlcCA+PiAzKTsKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKCBkaWZmID49IHN0ZXAgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWx0YSA9IDQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkaWZmIC09IHN0ZXA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2cGRpZmYgKz0gc3RlcDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc3RlcCA+Pj0gMTsKLSAgICAgICAgICAgICAgICBpZiAoIGRpZmYgPj0gc3RlcCAgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWx0YSB8PSAyOwotICAgICAgICAgICAgICAgICAgICAgICAgZGlmZiAtPSBzdGVwOwotICAgICAgICAgICAgICAgICAgICAgICAgdnBkaWZmICs9IHN0ZXA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHN0ZXAgPj49IDE7Ci0gICAgICAgICAgICAgICAgaWYgKCBkaWZmID49IHN0ZXAgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWx0YSB8PSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgdnBkaWZmICs9IHN0ZXA7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyogU3RlcCAzIC0gVXBkYXRlIHByZXZpb3VzIHZhbHVlICovCi0gICAgICAgICAgICAgICAgaWYgKCBzaWduICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHByZWQgLT0gdnBkaWZmOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHByZWQgKz0gdnBkaWZmOwotCi0gICAgICAgICAgICAgICAgLyogU3RlcCA0IC0gQ2xhbXAgcHJldmlvdXMgdmFsdWUgdG8gMTYgYml0cyAqLwotICAgICAgICAgICAgICAgIGlmICggdmFscHJlZCA+IDMyNzY3ICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHByZWQgPSAzMjc2NzsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICggdmFscHJlZCA8IC0zMjc2OCApCi0gICAgICAgICAgICAgICAgICAgICAgICB2YWxwcmVkID0gLTMyNzY4OwotCi0gICAgICAgICAgICAgICAgLyogU3RlcCA1IC0gQXNzZW1ibGUgdmFsdWUsIHVwZGF0ZSBpbmRleCBhbmQgc3RlcCB2YWx1ZXMgKi8KLSAgICAgICAgICAgICAgICBkZWx0YSB8PSBzaWduOwotICAgICAgICAKLSAgICAgICAgICAgICAgICBpbmRleCArPSBpbmRleFRhYmxlW2RlbHRhXTsKLSAgICAgICAgICAgICAgICBpZiAoIGluZGV4IDwgMCApIGluZGV4ID0gMDsKLSAgICAgICAgICAgICAgICBpZiAoIGluZGV4ID4gODggKSBpbmRleCA9IDg4OwotICAgICAgICAgICAgICAgIHN0ZXAgPSBzdGVwc2l6ZVRhYmxlW2luZGV4XTsKLQotICAgICAgICAgICAgICAgIC8qIFN0ZXAgNiAtIE91dHB1dCB2YWx1ZSAqLwotICAgICAgICAgICAgICAgIGlmICggYnVmZmVyc3RlcCApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dGJ1ZmZlciA9IChkZWx0YSA8PCA0KSAmIDB4ZjA7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICpuY3ArKyA9IChkZWx0YSAmIDB4MGYpIHwgb3V0cHV0YnVmZmVyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBidWZmZXJzdGVwID0gIWJ1ZmZlcnN0ZXA7CisgICAgICAgIC8qIFN0ZXAgNiAtIE91dHB1dCB2YWx1ZSAqLworICAgICAgICBpZiAoIGJ1ZmZlcnN0ZXAgKSB7CisgICAgICAgICAgICBvdXRwdXRidWZmZXIgPSAoZGVsdGEgPDwgNCkgJiAweGYwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKm5jcCsrID0gKGRlbHRhICYgMHgwZikgfCBvdXRwdXRidWZmZXI7CiAgICAgICAgIH0KLSAgICAgICAgcnYgPSBQeV9CdWlsZFZhbHVlKCIoTyhpaSkpIiwgc3RyLCB2YWxwcmVkLCBpbmRleCk7Ci0gICAgICAgIFB5X0RFQ1JFRihzdHIpOwotICAgICAgICByZXR1cm4gcnY7CisgICAgICAgIGJ1ZmZlcnN0ZXAgPSAhYnVmZmVyc3RlcDsKKyAgICB9CisgICAgcnYgPSBQeV9CdWlsZFZhbHVlKCIoTyhpaSkpIiwgc3RyLCB2YWxwcmVkLCBpbmRleCk7CisgICAgUHlfREVDUkVGKHN0cik7CisgICAgcmV0dXJuIHJ2OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYXVkaW9vcF9hZHBjbTJsaW4oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotICAgICAgICBzaWduZWQgY2hhciAqY3A7Ci0gICAgICAgIHNpZ25lZCBjaGFyICpuY3A7Ci0gICAgICAgIGludCBsZW4sIG5ld19sZW4sIHNpemUsIHZhbHByZWQsIHN0ZXAsIGRlbHRhLCBpbmRleCwgc2lnbiwgdnBkaWZmOwotICAgICAgICBQeU9iamVjdCAqcnYsICpzdHIsICpzdGF0ZTsKLSAgICAgICAgaW50IGksIGlucHV0YnVmZmVyID0gMCwgYnVmZmVyc3RlcDsKKyAgICBzaWduZWQgY2hhciAqY3A7CisgICAgc2lnbmVkIGNoYXIgKm5jcDsKKyAgICBpbnQgbGVuLCBuZXdfbGVuLCBzaXplLCB2YWxwcmVkLCBzdGVwLCBkZWx0YSwgaW5kZXgsIHNpZ24sIHZwZGlmZjsKKyAgICBQeU9iamVjdCAqcnYsICpzdHIsICpzdGF0ZTsKKyAgICBpbnQgaSwgaW5wdXRidWZmZXIgPSAwLCBidWZmZXJzdGVwOwogCi0gICAgICAgIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjaU86YWRwY20ybGluIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3AsICZsZW4sICZzaXplLCAmc3RhdGUpICkKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI2lPOmFkcGNtMmxpbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3AsICZsZW4sICZzaXplLCAmc3RhdGUpICkKKyAgICAgICAgcmV0dXJuIDA7CiAKLSAgICAgICAgaWYgKCBzaXplICE9IDEgJiYgc2l6ZSAhPSAyICYmIHNpemUgIT0gNCkgewotICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJTaXplIHNob3VsZCBiZSAxLCAyIG9yIDQiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoIHNpemUgIT0gMSAmJiBzaXplICE9IDIgJiYgc2l6ZSAhPSA0KSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJTaXplIHNob3VsZCBiZSAxLCAyIG9yIDQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyogRGVjb2RlIHN0YXRlLCBzaG91bGQgaGF2ZSAodmFsdWUsIHN0ZXApICovCisgICAgaWYgKCBzdGF0ZSA9PSBQeV9Ob25lICkgeworICAgICAgICAvKiBGaXJzdCB0aW1lLCBpdCBzZWVtcy4gU2V0IGRlZmF1bHRzICovCisgICAgICAgIHZhbHByZWQgPSAwOworICAgICAgICBzdGVwID0gNzsKKyAgICAgICAgaW5kZXggPSAwOworICAgIH0gZWxzZSBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKHN0YXRlLCAiaWkiLCAmdmFscHJlZCwgJmluZGV4KSApCisgICAgICAgIHJldHVybiAwOworCisgICAgbmV3X2xlbiA9IGxlbipzaXplKjI7CisgICAgaWYgKG5ld19sZW4gPCAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19NZW1vcnlFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJub3QgZW5vdWdoIG1lbW9yeSBmb3Igb3V0cHV0IGJ1ZmZlciIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgc3RyID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbmV3X2xlbik7CisgICAgaWYgKCBzdHIgPT0gMCApCisgICAgICAgIHJldHVybiAwOworICAgIG5jcCA9IChzaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHN0cik7CisKKyAgICBzdGVwID0gc3RlcHNpemVUYWJsZVtpbmRleF07CisgICAgYnVmZmVyc3RlcCA9IDA7CisKKyAgICBmb3IgKCBpPTA7IGkgPCBuZXdfbGVuOyBpICs9IHNpemUgKSB7CisgICAgICAgIC8qIFN0ZXAgMSAtIGdldCB0aGUgZGVsdGEgdmFsdWUgYW5kIGNvbXB1dGUgbmV4dCBpbmRleCAqLworICAgICAgICBpZiAoIGJ1ZmZlcnN0ZXAgKSB7CisgICAgICAgICAgICBkZWx0YSA9IGlucHV0YnVmZmVyICYgMHhmOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW5wdXRidWZmZXIgPSAqY3ArKzsKKyAgICAgICAgICAgIGRlbHRhID0gKGlucHV0YnVmZmVyID4+IDQpICYgMHhmOwogICAgICAgICB9Ci0gICAgCi0gICAgICAgIC8qIERlY29kZSBzdGF0ZSwgc2hvdWxkIGhhdmUgKHZhbHVlLCBzdGVwKSAqLwotICAgICAgICBpZiAoIHN0YXRlID09IFB5X05vbmUgKSB7Ci0gICAgICAgICAgICAgICAgLyogRmlyc3QgdGltZSwgaXQgc2VlbXMuIFNldCBkZWZhdWx0cyAqLwotICAgICAgICAgICAgICAgIHZhbHByZWQgPSAwOwotICAgICAgICAgICAgICAgIHN0ZXAgPSA3OwotICAgICAgICAgICAgICAgIGluZGV4ID0gMDsKLSAgICAgICAgfSBlbHNlIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoc3RhdGUsICJpaSIsICZ2YWxwcmVkLCAmaW5kZXgpICkKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAKLSAgICAgICAgbmV3X2xlbiA9IGxlbipzaXplKjI7Ci0gICAgICAgIGlmIChuZXdfbGVuIDwgMCkgewotICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19NZW1vcnlFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vdCBlbm91Z2ggbWVtb3J5IGZvciBvdXRwdXQgYnVmZmVyIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgc3RyID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbmV3X2xlbik7Ci0gICAgICAgIGlmICggc3RyID09IDAgKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICBuY3AgPSAoc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhzdHIpOwogCisgICAgICAgIGJ1ZmZlcnN0ZXAgPSAhYnVmZmVyc3RlcDsKKworICAgICAgICAvKiBTdGVwIDIgLSBGaW5kIG5ldyBpbmRleCB2YWx1ZSAoZm9yIGxhdGVyKSAqLworICAgICAgICBpbmRleCArPSBpbmRleFRhYmxlW2RlbHRhXTsKKyAgICAgICAgaWYgKCBpbmRleCA8IDAgKSBpbmRleCA9IDA7CisgICAgICAgIGlmICggaW5kZXggPiA4OCApIGluZGV4ID0gODg7CisKKyAgICAgICAgLyogU3RlcCAzIC0gU2VwYXJhdGUgc2lnbiBhbmQgbWFnbml0dWRlICovCisgICAgICAgIHNpZ24gPSBkZWx0YSAmIDg7CisgICAgICAgIGRlbHRhID0gZGVsdGEgJiA3OworCisgICAgICAgIC8qIFN0ZXAgNCAtIENvbXB1dGUgZGlmZmVyZW5jZSBhbmQgbmV3IHByZWRpY3RlZCB2YWx1ZSAqLworICAgICAgICAvKgorICAgICAgICAqKiBDb21wdXRlcyAndnBkaWZmID0gKGRlbHRhKzAuNSkqc3RlcC80JywgYnV0IHNlZSBjb21tZW50CisgICAgICAgICoqIGluIGFkcGNtX2NvZGVyLgorICAgICAgICAqLworICAgICAgICB2cGRpZmYgPSBzdGVwID4+IDM7CisgICAgICAgIGlmICggZGVsdGEgJiA0ICkgdnBkaWZmICs9IHN0ZXA7CisgICAgICAgIGlmICggZGVsdGEgJiAyICkgdnBkaWZmICs9IHN0ZXA+PjE7CisgICAgICAgIGlmICggZGVsdGEgJiAxICkgdnBkaWZmICs9IHN0ZXA+PjI7CisKKyAgICAgICAgaWYgKCBzaWduICkKKyAgICAgICAgICAgIHZhbHByZWQgLT0gdnBkaWZmOworICAgICAgICBlbHNlCisgICAgICAgICAgICB2YWxwcmVkICs9IHZwZGlmZjsKKworICAgICAgICAvKiBTdGVwIDUgLSBjbGFtcCBvdXRwdXQgdmFsdWUgKi8KKyAgICAgICAgaWYgKCB2YWxwcmVkID4gMzI3NjcgKQorICAgICAgICAgICAgdmFscHJlZCA9IDMyNzY3OworICAgICAgICBlbHNlIGlmICggdmFscHJlZCA8IC0zMjc2OCApCisgICAgICAgICAgICB2YWxwcmVkID0gLTMyNzY4OworCisgICAgICAgIC8qIFN0ZXAgNiAtIFVwZGF0ZSBzdGVwIHZhbHVlICovCiAgICAgICAgIHN0ZXAgPSBzdGVwc2l6ZVRhYmxlW2luZGV4XTsKLSAgICAgICAgYnVmZmVyc3RlcCA9IDA7Ci0gICAgCi0gICAgICAgIGZvciAoIGk9MDsgaSA8IG5ld19sZW47IGkgKz0gc2l6ZSApIHsKLSAgICAgICAgICAgICAgICAvKiBTdGVwIDEgLSBnZXQgdGhlIGRlbHRhIHZhbHVlIGFuZCBjb21wdXRlIG5leHQgaW5kZXggKi8KLSAgICAgICAgICAgICAgICBpZiAoIGJ1ZmZlcnN0ZXAgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWx0YSA9IGlucHV0YnVmZmVyICYgMHhmOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dGJ1ZmZlciA9ICpjcCsrOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGEgPSAoaW5wdXRidWZmZXIgPj4gNCkgJiAweGY7Ci0gICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgYnVmZmVyc3RlcCA9ICFidWZmZXJzdGVwOworICAgICAgICAvKiBTdGVwIDYgLSBPdXRwdXQgdmFsdWUgKi8KKyAgICAgICAgaWYgKCBzaXplID09IDEgKSAqQ0hBUlAobmNwLCBpKSA9IChzaWduZWQgY2hhcikodmFscHJlZCA+PiA4KTsKKyAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApICpTSE9SVFAobmNwLCBpKSA9IChzaG9ydCkodmFscHJlZCk7CisgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSAqTE9OR1AobmNwLCBpKSA9IChQeV9JbnQzMikodmFscHJlZDw8MTYpOworICAgIH0KIAotICAgICAgICAgICAgICAgIC8qIFN0ZXAgMiAtIEZpbmQgbmV3IGluZGV4IHZhbHVlIChmb3IgbGF0ZXIpICovCi0gICAgICAgICAgICAgICAgaW5kZXggKz0gaW5kZXhUYWJsZVtkZWx0YV07Ci0gICAgICAgICAgICAgICAgaWYgKCBpbmRleCA8IDAgKSBpbmRleCA9IDA7Ci0gICAgICAgICAgICAgICAgaWYgKCBpbmRleCA+IDg4ICkgaW5kZXggPSA4ODsKLQotICAgICAgICAgICAgICAgIC8qIFN0ZXAgMyAtIFNlcGFyYXRlIHNpZ24gYW5kIG1hZ25pdHVkZSAqLwotICAgICAgICAgICAgICAgIHNpZ24gPSBkZWx0YSAmIDg7Ci0gICAgICAgICAgICAgICAgZGVsdGEgPSBkZWx0YSAmIDc7Ci0KLSAgICAgICAgICAgICAgICAvKiBTdGVwIDQgLSBDb21wdXRlIGRpZmZlcmVuY2UgYW5kIG5ldyBwcmVkaWN0ZWQgdmFsdWUgKi8KLSAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICoqIENvbXB1dGVzICd2cGRpZmYgPSAoZGVsdGErMC41KSpzdGVwLzQnLCBidXQgc2VlIGNvbW1lbnQKLSAgICAgICAgICAgICAgICAqKiBpbiBhZHBjbV9jb2Rlci4KLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIHZwZGlmZiA9IHN0ZXAgPj4gMzsKLSAgICAgICAgICAgICAgICBpZiAoIGRlbHRhICYgNCApIHZwZGlmZiArPSBzdGVwOwotICAgICAgICAgICAgICAgIGlmICggZGVsdGEgJiAyICkgdnBkaWZmICs9IHN0ZXA+PjE7Ci0gICAgICAgICAgICAgICAgaWYgKCBkZWx0YSAmIDEgKSB2cGRpZmYgKz0gc3RlcD4+MjsKLQotICAgICAgICAgICAgICAgIGlmICggc2lnbiApCi0gICAgICAgICAgICAgICAgICAgICAgICB2YWxwcmVkIC09IHZwZGlmZjsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB2YWxwcmVkICs9IHZwZGlmZjsKLQotICAgICAgICAgICAgICAgIC8qIFN0ZXAgNSAtIGNsYW1wIG91dHB1dCB2YWx1ZSAqLwotICAgICAgICAgICAgICAgIGlmICggdmFscHJlZCA+IDMyNzY3ICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHByZWQgPSAzMjc2NzsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICggdmFscHJlZCA8IC0zMjc2OCApCi0gICAgICAgICAgICAgICAgICAgICAgICB2YWxwcmVkID0gLTMyNzY4OwotCi0gICAgICAgICAgICAgICAgLyogU3RlcCA2IC0gVXBkYXRlIHN0ZXAgdmFsdWUgKi8KLSAgICAgICAgICAgICAgICBzdGVwID0gc3RlcHNpemVUYWJsZVtpbmRleF07Ci0KLSAgICAgICAgICAgICAgICAvKiBTdGVwIDYgLSBPdXRwdXQgdmFsdWUgKi8KLSAgICAgICAgICAgICAgICBpZiAoIHNpemUgPT0gMSApICpDSEFSUChuY3AsIGkpID0gKHNpZ25lZCBjaGFyKSh2YWxwcmVkID4+IDgpOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSAqU0hPUlRQKG5jcCwgaSkgPSAoc2hvcnQpKHZhbHByZWQpOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSAqTE9OR1AobmNwLCBpKSA9IChQeV9JbnQzMikodmFscHJlZDw8MTYpOwotICAgICAgICB9Ci0KLSAgICAgICAgcnYgPSBQeV9CdWlsZFZhbHVlKCIoTyhpaSkpIiwgc3RyLCB2YWxwcmVkLCBpbmRleCk7Ci0gICAgICAgIFB5X0RFQ1JFRihzdHIpOwotICAgICAgICByZXR1cm4gcnY7CisgICAgcnYgPSBQeV9CdWlsZFZhbHVlKCIoTyhpaSkpIiwgc3RyLCB2YWxwcmVkLCBpbmRleCk7CisgICAgUHlfREVDUkVGKHN0cik7CisgICAgcmV0dXJuIHJ2OwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgYXVkaW9vcF9tZXRob2RzW10gPSB7Ci0gICAgICAgIHsgIm1heCIsIGF1ZGlvb3BfbWF4LCBNRVRIX1ZBUkFSR1MgfSwKLSAgICAgICAgeyAibWlubWF4IiwgYXVkaW9vcF9taW5tYXgsIE1FVEhfVkFSQVJHUyB9LAotICAgICAgICB7ICJhdmciLCBhdWRpb29wX2F2ZywgTUVUSF9WQVJBUkdTIH0sCi0gICAgICAgIHsgIm1heHBwIiwgYXVkaW9vcF9tYXhwcCwgTUVUSF9WQVJBUkdTIH0sCi0gICAgICAgIHsgImF2Z3BwIiwgYXVkaW9vcF9hdmdwcCwgTUVUSF9WQVJBUkdTIH0sCi0gICAgICAgIHsgInJtcyIsIGF1ZGlvb3Bfcm1zLCBNRVRIX1ZBUkFSR1MgfSwKLSAgICAgICAgeyAiZmluZGZpdCIsIGF1ZGlvb3BfZmluZGZpdCwgTUVUSF9WQVJBUkdTIH0sCi0gICAgICAgIHsgImZpbmRtYXgiLCBhdWRpb29wX2ZpbmRtYXgsIE1FVEhfVkFSQVJHUyB9LAotICAgICAgICB7ICJmaW5kZmFjdG9yIiwgYXVkaW9vcF9maW5kZmFjdG9yLCBNRVRIX1ZBUkFSR1MgfSwKLSAgICAgICAgeyAiY3Jvc3MiLCBhdWRpb29wX2Nyb3NzLCBNRVRIX1ZBUkFSR1MgfSwKLSAgICAgICAgeyAibXVsIiwgYXVkaW9vcF9tdWwsIE1FVEhfVkFSQVJHUyB9LAotICAgICAgICB7ICJhZGQiLCBhdWRpb29wX2FkZCwgTUVUSF9WQVJBUkdTIH0sCi0gICAgICAgIHsgImJpYXMiLCBhdWRpb29wX2JpYXMsIE1FVEhfVkFSQVJHUyB9LAotICAgICAgICB7ICJ1bGF3MmxpbiIsIGF1ZGlvb3BfdWxhdzJsaW4sIE1FVEhfVkFSQVJHUyB9LAotICAgICAgICB7ICJsaW4ydWxhdyIsIGF1ZGlvb3BfbGluMnVsYXcsIE1FVEhfVkFSQVJHUyB9LAotICAgICAgICB7ICJhbGF3MmxpbiIsIGF1ZGlvb3BfYWxhdzJsaW4sIE1FVEhfVkFSQVJHUyB9LAotICAgICAgICB7ICJsaW4yYWxhdyIsIGF1ZGlvb3BfbGluMmFsYXcsIE1FVEhfVkFSQVJHUyB9LAotICAgICAgICB7ICJsaW4ybGluIiwgYXVkaW9vcF9saW4ybGluLCBNRVRIX1ZBUkFSR1MgfSwKLSAgICAgICAgeyAiYWRwY20ybGluIiwgYXVkaW9vcF9hZHBjbTJsaW4sIE1FVEhfVkFSQVJHUyB9LAotICAgICAgICB7ICJsaW4yYWRwY20iLCBhdWRpb29wX2xpbjJhZHBjbSwgTUVUSF9WQVJBUkdTIH0sCi0gICAgICAgIHsgInRvbW9ubyIsIGF1ZGlvb3BfdG9tb25vLCBNRVRIX1ZBUkFSR1MgfSwKLSAgICAgICAgeyAidG9zdGVyZW8iLCBhdWRpb29wX3Rvc3RlcmVvLCBNRVRIX1ZBUkFSR1MgfSwKLSAgICAgICAgeyAiZ2V0c2FtcGxlIiwgYXVkaW9vcF9nZXRzYW1wbGUsIE1FVEhfVkFSQVJHUyB9LAotICAgICAgICB7ICJyZXZlcnNlIiwgYXVkaW9vcF9yZXZlcnNlLCBNRVRIX1ZBUkFSR1MgfSwKLSAgICAgICAgeyAicmF0ZWN2IiwgYXVkaW9vcF9yYXRlY3YsIE1FVEhfVkFSQVJHUyB9LAotICAgICAgICB7IDAsICAgICAgICAgIDAgfQorICAgIHsgIm1heCIsIGF1ZGlvb3BfbWF4LCBNRVRIX1ZBUkFSR1MgfSwKKyAgICB7ICJtaW5tYXgiLCBhdWRpb29wX21pbm1heCwgTUVUSF9WQVJBUkdTIH0sCisgICAgeyAiYXZnIiwgYXVkaW9vcF9hdmcsIE1FVEhfVkFSQVJHUyB9LAorICAgIHsgIm1heHBwIiwgYXVkaW9vcF9tYXhwcCwgTUVUSF9WQVJBUkdTIH0sCisgICAgeyAiYXZncHAiLCBhdWRpb29wX2F2Z3BwLCBNRVRIX1ZBUkFSR1MgfSwKKyAgICB7ICJybXMiLCBhdWRpb29wX3JtcywgTUVUSF9WQVJBUkdTIH0sCisgICAgeyAiZmluZGZpdCIsIGF1ZGlvb3BfZmluZGZpdCwgTUVUSF9WQVJBUkdTIH0sCisgICAgeyAiZmluZG1heCIsIGF1ZGlvb3BfZmluZG1heCwgTUVUSF9WQVJBUkdTIH0sCisgICAgeyAiZmluZGZhY3RvciIsIGF1ZGlvb3BfZmluZGZhY3RvciwgTUVUSF9WQVJBUkdTIH0sCisgICAgeyAiY3Jvc3MiLCBhdWRpb29wX2Nyb3NzLCBNRVRIX1ZBUkFSR1MgfSwKKyAgICB7ICJtdWwiLCBhdWRpb29wX211bCwgTUVUSF9WQVJBUkdTIH0sCisgICAgeyAiYWRkIiwgYXVkaW9vcF9hZGQsIE1FVEhfVkFSQVJHUyB9LAorICAgIHsgImJpYXMiLCBhdWRpb29wX2JpYXMsIE1FVEhfVkFSQVJHUyB9LAorICAgIHsgInVsYXcybGluIiwgYXVkaW9vcF91bGF3MmxpbiwgTUVUSF9WQVJBUkdTIH0sCisgICAgeyAibGluMnVsYXciLCBhdWRpb29wX2xpbjJ1bGF3LCBNRVRIX1ZBUkFSR1MgfSwKKyAgICB7ICJhbGF3MmxpbiIsIGF1ZGlvb3BfYWxhdzJsaW4sIE1FVEhfVkFSQVJHUyB9LAorICAgIHsgImxpbjJhbGF3IiwgYXVkaW9vcF9saW4yYWxhdywgTUVUSF9WQVJBUkdTIH0sCisgICAgeyAibGluMmxpbiIsIGF1ZGlvb3BfbGluMmxpbiwgTUVUSF9WQVJBUkdTIH0sCisgICAgeyAiYWRwY20ybGluIiwgYXVkaW9vcF9hZHBjbTJsaW4sIE1FVEhfVkFSQVJHUyB9LAorICAgIHsgImxpbjJhZHBjbSIsIGF1ZGlvb3BfbGluMmFkcGNtLCBNRVRIX1ZBUkFSR1MgfSwKKyAgICB7ICJ0b21vbm8iLCBhdWRpb29wX3RvbW9ubywgTUVUSF9WQVJBUkdTIH0sCisgICAgeyAidG9zdGVyZW8iLCBhdWRpb29wX3Rvc3RlcmVvLCBNRVRIX1ZBUkFSR1MgfSwKKyAgICB7ICJnZXRzYW1wbGUiLCBhdWRpb29wX2dldHNhbXBsZSwgTUVUSF9WQVJBUkdTIH0sCisgICAgeyAicmV2ZXJzZSIsIGF1ZGlvb3BfcmV2ZXJzZSwgTUVUSF9WQVJBUkdTIH0sCisgICAgeyAicmF0ZWN2IiwgYXVkaW9vcF9yYXRlY3YsIE1FVEhfVkFSQVJHUyB9LAorICAgIHsgMCwgICAgICAgICAgMCB9CiB9OwogCiBQeU1PRElOSVRfRlVOQwogaW5pdGF1ZGlvb3Aodm9pZCkKIHsKLSAgICAgICAgUHlPYmplY3QgKm0sICpkOwotICAgICAgICBtID0gUHlfSW5pdE1vZHVsZSgiYXVkaW9vcCIsIGF1ZGlvb3BfbWV0aG9kcyk7Ci0gICAgICAgIGlmIChtID09IE5VTEwpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLSAgICAgICAgaWYgKGQgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIEF1ZGlvb3BFcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbigiYXVkaW9vcC5lcnJvciIsIE5VTEwsIE5VTEwpOwotICAgICAgICBpZiAoQXVkaW9vcEVycm9yICE9IE5VTEwpCi0gICAgICAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwiZXJyb3IiLEF1ZGlvb3BFcnJvcik7CisgICAgUHlPYmplY3QgKm0sICpkOworICAgIG0gPSBQeV9Jbml0TW9kdWxlKCJhdWRpb29wIiwgYXVkaW9vcF9tZXRob2RzKTsKKyAgICBpZiAobSA9PSBOVUxMKQorICAgICAgICByZXR1cm47CisgICAgZCA9IFB5TW9kdWxlX0dldERpY3QobSk7CisgICAgaWYgKGQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOworICAgIEF1ZGlvb3BFcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbigiYXVkaW9vcC5lcnJvciIsIE5VTEwsIE5VTEwpOworICAgIGlmIChBdWRpb29wRXJyb3IgIT0gTlVMTCkKKyAgICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsImVycm9yIixBdWRpb29wRXJyb3IpOwogfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9iaW5hc2NpaS5jIGIvTW9kdWxlcy9iaW5hc2NpaS5jCmluZGV4IDY1NDcxYTYuLmQ5ODU3NzMgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvYmluYXNjaWkuYworKysgYi9Nb2R1bGVzL2JpbmFzY2lpLmMKQEAgLTMsNDAgKzMsNDAgQEAKICoqCiAqKiBUaGlzIG1vZHVsZSBjdXJyZW50bHkgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBlbmNvZGluZ3M6CiAqKiB1dWVuY29kZToKLSoqICAgICAJZWFjaCBsaW5lIGVuY29kZXMgNDUgYnl0ZXMgKGV4Y2VwdCBwb3NzaWJseSB0aGUgbGFzdCkKLSoqCUZpcnN0IGNoYXIgZW5jb2RlcyAoYmluYXJ5KSBsZW5ndGgsIHJlc3QgZGF0YQotKioJZWFjaCBjaGFyIGVuY29kZXMgNiBiaXRzLCBhcyBmb2xsb3dzOgotKioJYmluYXJ5OiAwMTIzNDU2NyBhYmNkZWZnaCBpamtsbW5vcAotKioJYXNjaWk6ICAwMTIzNDUgNjdhYmNkIGVmZ2hpaiBrbG1ub3AKLSoqCUFTQ0lJIGVuY29kaW5nIG1ldGhvZCBpcyAiZXhjZXNzLXNwYWNlIjogMDAwMDAwIGlzIGVuY29kZWQgYXMgJyAnLCBldGMuCi0qKglzaG9ydCBiaW5hcnkgZGF0YSBpcyB6ZXJvLWV4dGVuZGVkIChzbyB0aGUgYml0cyBhcmUgYWx3YXlzIGluIHRoZQotKioJcmlnaHQgcGxhY2UpLCB0aGlzIGRvZXMgKm5vdCogcmVmbGVjdCBpbiB0aGUgbGVuZ3RoLgorKiogICAgICBlYWNoIGxpbmUgZW5jb2RlcyA0NSBieXRlcyAoZXhjZXB0IHBvc3NpYmx5IHRoZSBsYXN0KQorKiogICAgICBGaXJzdCBjaGFyIGVuY29kZXMgKGJpbmFyeSkgbGVuZ3RoLCByZXN0IGRhdGEKKyoqICAgICAgZWFjaCBjaGFyIGVuY29kZXMgNiBiaXRzLCBhcyBmb2xsb3dzOgorKiogICAgICBiaW5hcnk6IDAxMjM0NTY3IGFiY2RlZmdoIGlqa2xtbm9wCisqKiAgICAgIGFzY2lpOiAgMDEyMzQ1IDY3YWJjZCBlZmdoaWoga2xtbm9wCisqKiAgICAgIEFTQ0lJIGVuY29kaW5nIG1ldGhvZCBpcyAiZXhjZXNzLXNwYWNlIjogMDAwMDAwIGlzIGVuY29kZWQgYXMgJyAnLCBldGMuCisqKiAgICAgIHNob3J0IGJpbmFyeSBkYXRhIGlzIHplcm8tZXh0ZW5kZWQgKHNvIHRoZSBiaXRzIGFyZSBhbHdheXMgaW4gdGhlCisqKiAgICAgIHJpZ2h0IHBsYWNlKSwgdGhpcyBkb2VzICpub3QqIHJlZmxlY3QgaW4gdGhlIGxlbmd0aC4KICoqIGJhc2U2NDoKICoqICAgICAgTGluZSBicmVha3MgYXJlIGluc2lnbmlmaWNhbnQsIGJ1dCBsaW5lcyBhcmUgYXQgbW9zdCA3NiBjaGFycwogKiogICAgICBlYWNoIGNoYXIgZW5jb2RlcyA2IGJpdHMsIGluIHNpbWlsYXIgb3JkZXIgYXMgdXVjb2RlL2hxeC4gRW5jb2RpbmcKICoqICAgICAgaXMgZG9uZSB2aWEgYSB0YWJsZS4KICoqICAgICAgU2hvcnQgYmluYXJ5IGRhdGEgaXMgZmlsbGVkIChpbiBBU0NJSSkgd2l0aCAnPScuCiAqKiBocXg6Ci0qKglGaWxlIHN0YXJ0cyB3aXRoIGludHJvZHVjdG9yeSB0ZXh0LCByZWFsIGRhdGEgc3RhcnRzIGFuZCBlbmRzCi0qKgl3aXRoIGNvbG9ucy4KLSoqCURhdGEgY29uc2lzdHMgb2YgdGhyZWUgc2ltaWxhciBwYXJ0czogaW5mbywgZGF0YWZvcmssIHJlc291cmNlZm9yay4KLSoqCUVhY2ggcGFydCBpcyBwcm90ZWN0ZWQgKGF0IHRoZSBlbmQpIHdpdGggYSAxNi1iaXQgY3JjCi0qKglUaGUgYmluYXJ5IGRhdGEgaXMgcnVuLWxlbmd0aCBlbmNvZGVkLCBhbmQgdGhlbiBhc2NpaS1maWVkOgotKioJYmluYXJ5OiAwMTIzNDU2NyBhYmNkZWZnaCBpamtsbW5vcAotKioJYXNjaWk6ICAwMTIzNDUgNjdhYmNkIGVmZ2hpaiBrbG1ub3AKLSoqCUFTQ0lJIGVuY29kaW5nIGlzIHRhYmxlLWRyaXZlbiwgc2VlIHRoZSBjb2RlLgotKioJU2hvcnQgYmluYXJ5IGRhdGEgcmVzdWx0cyBpbiB0aGUgcnVudCBhc2NpaS1ieXRlIGJlaW5nIG91dHB1dCB3aXRoCi0qKgl0aGUgYml0cyBpbiB0aGUgcmlnaHQgcGxhY2UuCisqKiAgICAgIEZpbGUgc3RhcnRzIHdpdGggaW50cm9kdWN0b3J5IHRleHQsIHJlYWwgZGF0YSBzdGFydHMgYW5kIGVuZHMKKyoqICAgICAgd2l0aCBjb2xvbnMuCisqKiAgICAgIERhdGEgY29uc2lzdHMgb2YgdGhyZWUgc2ltaWxhciBwYXJ0czogaW5mbywgZGF0YWZvcmssIHJlc291cmNlZm9yay4KKyoqICAgICAgRWFjaCBwYXJ0IGlzIHByb3RlY3RlZCAoYXQgdGhlIGVuZCkgd2l0aCBhIDE2LWJpdCBjcmMKKyoqICAgICAgVGhlIGJpbmFyeSBkYXRhIGlzIHJ1bi1sZW5ndGggZW5jb2RlZCwgYW5kIHRoZW4gYXNjaWktZmllZDoKKyoqICAgICAgYmluYXJ5OiAwMTIzNDU2NyBhYmNkZWZnaCBpamtsbW5vcAorKiogICAgICBhc2NpaTogIDAxMjM0NSA2N2FiY2QgZWZnaGlqIGtsbW5vcAorKiogICAgICBBU0NJSSBlbmNvZGluZyBpcyB0YWJsZS1kcml2ZW4sIHNlZSB0aGUgY29kZS4KKyoqICAgICAgU2hvcnQgYmluYXJ5IGRhdGEgcmVzdWx0cyBpbiB0aGUgcnVudCBhc2NpaS1ieXRlIGJlaW5nIG91dHB1dCB3aXRoCisqKiAgICAgIHRoZSBiaXRzIGluIHRoZSByaWdodCBwbGFjZS4KICoqCiAqKiBXaGlsZSBJIHdhcyByZWFkaW5nIGRvemVucyBvZiBwcm9ncmFtcyB0aGF0IGVuY29kZSBvciBkZWNvZGUgdGhlIGZvcm1hdHMKICoqIGhlcmUgKGRvY3VtZW50YXRpb24/IGhpaGk6LSkgSSBoYXZlIGZvcm11bGF0ZWQgSmFuc2VuJ3MgT2JzZXJ2YXRpb246CiAqKgotKioJUHJvZ3JhbXMgdGhhdCBlbmNvZGUgYmluYXJ5IGRhdGEgaW4gQVNDSUkgYXJlIHdyaXR0ZW4gaW4KLSoqCXN1Y2ggYSBzdHlsZSB0aGF0IHRoZXkgYXJlIGFzIHVucmVhZGFibGUgYXMgcG9zc2libGUuIERldmljZXMgdXNlZAotKioJaW5jbHVkZSB1bm5lY2Vzc2FyeSBnbG9iYWwgdmFyaWFibGVzLCBidXJ5aW5nIGltcG9ydGFudCB0YWJsZXMKLSoqCWluIHVucmVsYXRlZCBzb3VyY2VmaWxlcywgcHV0dGluZyBmdW5jdGlvbnMgaW4gaW5jbHVkZSBmaWxlcywKLSoqCXVzaW5nIHNlZW1pbmdseS1kZXNjcmlwdGl2ZSB2YXJpYWJsZSBuYW1lcyBmb3IgZGlmZmVyZW50IHB1cnBvc2VzLAotKioJY2FsbHMgdG8gZW1wdHkgc3Vicm91dGluZXMgYW5kIGEgaG9zdCBvZiBvdGhlcnMuCisqKiAgICAgIFByb2dyYW1zIHRoYXQgZW5jb2RlIGJpbmFyeSBkYXRhIGluIEFTQ0lJIGFyZSB3cml0dGVuIGluCisqKiAgICAgIHN1Y2ggYSBzdHlsZSB0aGF0IHRoZXkgYXJlIGFzIHVucmVhZGFibGUgYXMgcG9zc2libGUuIERldmljZXMgdXNlZAorKiogICAgICBpbmNsdWRlIHVubmVjZXNzYXJ5IGdsb2JhbCB2YXJpYWJsZXMsIGJ1cnlpbmcgaW1wb3J0YW50IHRhYmxlcworKiogICAgICBpbiB1bnJlbGF0ZWQgc291cmNlZmlsZXMsIHB1dHRpbmcgZnVuY3Rpb25zIGluIGluY2x1ZGUgZmlsZXMsCisqKiAgICAgIHVzaW5nIHNlZW1pbmdseS1kZXNjcmlwdGl2ZSB2YXJpYWJsZSBuYW1lcyBmb3IgZGlmZmVyZW50IHB1cnBvc2VzLAorKiogICAgICBjYWxscyB0byBlbXB0eSBzdWJyb3V0aW5lcyBhbmQgYSBob3N0IG9mIG90aGVycy4KICoqCiAqKiBJIGhhdmUgYXR0ZW1wdGVkIHRvIGJyZWFrIHdpdGggdGhpcyB0cmFkaXRpb24sIGJ1dCBJIGd1ZXNzIHRoYXQgdGhhdAogKiogZG9lcyBtYWtlIHRoZSBwZXJmb3JtYW5jZSBzdWItb3B0aW1hbC4gT2ggd2VsbCwgdG9vIGJhZC4uLgpAQCAtNzUsNjcgKzc1LDY3IEBACiAKIHN0YXRpYyB1bnNpZ25lZCBjaGFyIHRhYmxlX2EyYl9ocXhbMjU2XSA9IHsKIC8qICAgICAgIF5AICAgIF5BICAgIF5CICAgIF5DICAgIF5EICAgIF5FICAgIF5GICAgIF5HICAgKi8KLS8qIDAqLwlGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLAorLyogMCovICBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLAogLyogICAgICAgXGIgICAgXHQgICAgXG4gICAgXksgICAgXkwgICAgXHIgICAgXk4gICAgXk8gICAqLwotLyogMSovCUZBSUwsIEZBSUwsIFNLSVAsIEZBSUwsIEZBSUwsIFNLSVAsIEZBSUwsIEZBSUwsCisvKiAxKi8gIEZBSUwsIEZBSUwsIFNLSVAsIEZBSUwsIEZBSUwsIFNLSVAsIEZBSUwsIEZBSUwsCiAvKiAgICAgICBeUCAgICBeUSAgICBeUiAgICBeUyAgICBeVCAgICBeVSAgICBeViAgICBeVyAgICovCi0vKiAyKi8JRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwKKy8qIDIqLyAgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwKIC8qICAgICAgIF5YICAgIF5ZICAgIF5aICAgIF5bICAgIF5cICAgIF5dICAgIF5eICAgIF5fICAgKi8KLS8qIDMqLwlGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLAorLyogMyovICBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLAogLyogICAgICAgICAgICAgICEgICAgICIgICAgICMgICAgICQgICAgICUgICAgICYgICAgICcgICAqLwotLyogNCovCUZBSUwsIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsCisvKiA0Ki8gIEZBSUwsIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsCiAvKiAgICAgICAgKCAgICAgKSAgICAgKiAgICAgKyAgICAgLCAgICAgLSAgICAgLiAgICAgLyAgICovCi0vKiA1Ki8JMHgwNywgMHgwOCwgMHgwOSwgMHgwQSwgMHgwQiwgMHgwQywgRkFJTCwgRkFJTCwKKy8qIDUqLyAgMHgwNywgMHgwOCwgMHgwOSwgMHgwQSwgMHgwQiwgMHgwQywgRkFJTCwgRkFJTCwKIC8qICAgICAgICAwICAgICAxICAgICAyICAgICAzICAgICA0ICAgICA1ICAgICA2ICAgICA3ICAgKi8KLS8qIDYqLwkweDBELCAweDBFLCAweDBGLCAweDEwLCAweDExLCAweDEyLCAweDEzLCBGQUlMLAorLyogNiovICAweDBELCAweDBFLCAweDBGLCAweDEwLCAweDExLCAweDEyLCAweDEzLCBGQUlMLAogLyogICAgICAgIDggICAgIDkgICAgIDogICAgIDsgICAgIDwgICAgID0gICAgID4gICAgID8gICAqLwotLyogNyovCTB4MTQsIDB4MTUsIERPTkUsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsCisvKiA3Ki8gIDB4MTQsIDB4MTUsIERPTkUsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsCiAvKiAgICAgICAgQCAgICAgQSAgICAgQiAgICAgQyAgICAgRCAgICAgRSAgICAgRiAgICAgRyAgICovCi0vKiA4Ki8JMHgxNiwgMHgxNywgMHgxOCwgMHgxOSwgMHgxQSwgMHgxQiwgMHgxQywgMHgxRCwKKy8qIDgqLyAgMHgxNiwgMHgxNywgMHgxOCwgMHgxOSwgMHgxQSwgMHgxQiwgMHgxQywgMHgxRCwKIC8qICAgICAgICBIICAgICBJICAgICBKICAgICBLICAgICBMICAgICBNICAgICBOICAgICBPICAgKi8KLS8qIDkqLwkweDFFLCAweDFGLCAweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LCBGQUlMLAorLyogOSovICAweDFFLCAweDFGLCAweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LCBGQUlMLAogLyogICAgICAgIFAgICAgIFEgICAgIFIgICAgIFMgICAgIFQgICAgIFUgICAgIFYgICAgIFcgICAqLwotLyoxMCovCTB4MjUsIDB4MjYsIDB4MjcsIDB4MjgsIDB4MjksIDB4MkEsIDB4MkIsIEZBSUwsCisvKjEwKi8gIDB4MjUsIDB4MjYsIDB4MjcsIDB4MjgsIDB4MjksIDB4MkEsIDB4MkIsIEZBSUwsCiAvKiAgICAgICAgWCAgICAgWSAgICAgWiAgICAgWyAgICAgXCAgICAgXSAgICAgXiAgICAgXyAgICovCi0vKjExKi8JMHgyQywgMHgyRCwgMHgyRSwgMHgyRiwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwKKy8qMTEqLyAgMHgyQywgMHgyRCwgMHgyRSwgMHgyRiwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwKIC8qICAgICAgICBgICAgICBhICAgICBiICAgICBjICAgICBkICAgICBlICAgICBmICAgICBnICAgKi8KLS8qMTIqLwkweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCBGQUlMLAorLyoxMiovICAweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCBGQUlMLAogLyogICAgICAgIGggICAgIGkgICAgIGogICAgIGsgICAgIGwgICAgIG0gICAgIG4gICAgIG8gICAqLwotLyoxMyovCTB4MzcsIDB4MzgsIDB4MzksIDB4M0EsIDB4M0IsIDB4M0MsIEZBSUwsIEZBSUwsCisvKjEzKi8gIDB4MzcsIDB4MzgsIDB4MzksIDB4M0EsIDB4M0IsIDB4M0MsIEZBSUwsIEZBSUwsCiAvKiAgICAgICAgcCAgICAgcSAgICAgciAgICAgcyAgICAgdCAgICAgdSAgICAgdiAgICAgdyAgICovCi0vKjE0Ki8JMHgzRCwgMHgzRSwgMHgzRiwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwKKy8qMTQqLyAgMHgzRCwgMHgzRSwgMHgzRiwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwKIC8qICAgICAgICB4ICAgICB5ICAgICB6ICAgICB7ICAgICB8ICAgICB9ICAgICB+ICAgIF4/ICAgKi8KLS8qMTUqLwlGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLAotLyoxNiovCUZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsCi0JRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwKLQlGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLAotCUZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsCi0JRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwKLQlGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLAotCUZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsCi0JRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwKLQlGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLAotCUZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsCi0JRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwKLQlGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLAotCUZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsCi0JRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwKLQlGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLAotCUZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsCisvKjE1Ki8gIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsCisvKjE2Ki8gIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsCisgICAgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwKKyAgICBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLAorICAgIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsCisgICAgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwKKyAgICBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLAorICAgIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsCisgICAgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwKKyAgICBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLAorICAgIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsCisgICAgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwKKyAgICBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLAorICAgIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsCisgICAgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwKKyAgICBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLAorICAgIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsCiB9OwogCiBzdGF0aWMgdW5zaWduZWQgY2hhciB0YWJsZV9iMmFfaHF4W10gPQogIiFcIiMkJSYnKCkqKywtMDEyMzQ1Njg5QEFCQ0RFRkdISUpLTE1OUFFSU1RVVlhZWltgYWJjZGVmaGlqa2xtcHFyIjsKIAogc3RhdGljIGNoYXIgdGFibGVfYTJiX2Jhc2U2NFtdID0gewotCS0xLC0xLC0xLC0xLCAtMSwtMSwtMSwtMSwgLTEsLTEsLTEsLTEsIC0xLC0xLC0xLC0xLAotCS0xLC0xLC0xLC0xLCAtMSwtMSwtMSwtMSwgLTEsLTEsLTEsLTEsIC0xLC0xLC0xLC0xLAotCS0xLC0xLC0xLC0xLCAtMSwtMSwtMSwtMSwgLTEsLTEsLTEsNjIsIC0xLC0xLC0xLDYzLAotCTUyLDUzLDU0LDU1LCA1Niw1Nyw1OCw1OSwgNjAsNjEsLTEsLTEsIC0xLCAwLC0xLC0xLCAvKiBOb3RlIFBBRC0+MCAqLwotCS0xLCAwLCAxLCAyLCAgMywgNCwgNSwgNiwgIDcsIDgsIDksMTAsIDExLDEyLDEzLDE0LAotCTE1LDE2LDE3LDE4LCAxOSwyMCwyMSwyMiwgMjMsMjQsMjUsLTEsIC0xLC0xLC0xLC0xLAotCS0xLDI2LDI3LDI4LCAyOSwzMCwzMSwzMiwgMzMsMzQsMzUsMzYsIDM3LDM4LDM5LDQwLAotCTQxLDQyLDQzLDQ0LCA0NSw0Niw0Nyw0OCwgNDksNTAsNTEsLTEsIC0xLC0xLC0xLC0xCisgICAgLTEsLTEsLTEsLTEsIC0xLC0xLC0xLC0xLCAtMSwtMSwtMSwtMSwgLTEsLTEsLTEsLTEsCisgICAgLTEsLTEsLTEsLTEsIC0xLC0xLC0xLC0xLCAtMSwtMSwtMSwtMSwgLTEsLTEsLTEsLTEsCisgICAgLTEsLTEsLTEsLTEsIC0xLC0xLC0xLC0xLCAtMSwtMSwtMSw2MiwgLTEsLTEsLTEsNjMsCisgICAgNTIsNTMsNTQsNTUsIDU2LDU3LDU4LDU5LCA2MCw2MSwtMSwtMSwgLTEsIDAsLTEsLTEsIC8qIE5vdGUgUEFELT4wICovCisgICAgLTEsIDAsIDEsIDIsICAzLCA0LCA1LCA2LCAgNywgOCwgOSwxMCwgMTEsMTIsMTMsMTQsCisgICAgMTUsMTYsMTcsMTgsIDE5LDIwLDIxLDIyLCAyMywyNCwyNSwtMSwgLTEsLTEsLTEsLTEsCisgICAgLTEsMjYsMjcsMjgsIDI5LDMwLDMxLDMyLCAzMywzNCwzNSwzNiwgMzcsMzgsMzksNDAsCisgICAgNDEsNDIsNDMsNDQsIDQ1LDQ2LDQ3LDQ4LCA0OSw1MCw1MSwtMSwgLTEsLTEsLTEsLTEKIH07CiAKICNkZWZpbmUgQkFTRTY0X1BBRCAnPScKQEAgLTE0OSwzOCArMTQ5LDM4IEBACiAKIAogc3RhdGljIHVuc2lnbmVkIHNob3J0IGNyY3RhYl9ocXhbMjU2XSA9IHsKLQkweDAwMDAsIDB4MTAyMSwgMHgyMDQyLCAweDMwNjMsIDB4NDA4NCwgMHg1MGE1LCAweDYwYzYsIDB4NzBlNywKLQkweDgxMDgsIDB4OTEyOSwgMHhhMTRhLCAweGIxNmIsIDB4YzE4YywgMHhkMWFkLCAweGUxY2UsIDB4ZjFlZiwKLQkweDEyMzEsIDB4MDIxMCwgMHgzMjczLCAweDIyNTIsIDB4NTJiNSwgMHg0Mjk0LCAweDcyZjcsIDB4NjJkNiwKLQkweDkzMzksIDB4ODMxOCwgMHhiMzdiLCAweGEzNWEsIDB4ZDNiZCwgMHhjMzljLCAweGYzZmYsIDB4ZTNkZSwKLQkweDI0NjIsIDB4MzQ0MywgMHgwNDIwLCAweDE0MDEsIDB4NjRlNiwgMHg3NGM3LCAweDQ0YTQsIDB4NTQ4NSwKLQkweGE1NmEsIDB4YjU0YiwgMHg4NTI4LCAweDk1MDksIDB4ZTVlZSwgMHhmNWNmLCAweGM1YWMsIDB4ZDU4ZCwKLQkweDM2NTMsIDB4MjY3MiwgMHgxNjExLCAweDA2MzAsIDB4NzZkNywgMHg2NmY2LCAweDU2OTUsIDB4NDZiNCwKLQkweGI3NWIsIDB4YTc3YSwgMHg5NzE5LCAweDg3MzgsIDB4ZjdkZiwgMHhlN2ZlLCAweGQ3OWQsIDB4YzdiYywKLQkweDQ4YzQsIDB4NThlNSwgMHg2ODg2LCAweDc4YTcsIDB4MDg0MCwgMHgxODYxLCAweDI4MDIsIDB4MzgyMywKLQkweGM5Y2MsIDB4ZDllZCwgMHhlOThlLCAweGY5YWYsIDB4ODk0OCwgMHg5OTY5LCAweGE5MGEsIDB4YjkyYiwKLQkweDVhZjUsIDB4NGFkNCwgMHg3YWI3LCAweDZhOTYsIDB4MWE3MSwgMHgwYTUwLCAweDNhMzMsIDB4MmExMiwKLQkweGRiZmQsIDB4Y2JkYywgMHhmYmJmLCAweGViOWUsIDB4OWI3OSwgMHg4YjU4LCAweGJiM2IsIDB4YWIxYSwKLQkweDZjYTYsIDB4N2M4NywgMHg0Y2U0LCAweDVjYzUsIDB4MmMyMiwgMHgzYzAzLCAweDBjNjAsIDB4MWM0MSwKLQkweGVkYWUsIDB4ZmQ4ZiwgMHhjZGVjLCAweGRkY2QsIDB4YWQyYSwgMHhiZDBiLCAweDhkNjgsIDB4OWQ0OSwKLQkweDdlOTcsIDB4NmViNiwgMHg1ZWQ1LCAweDRlZjQsIDB4M2UxMywgMHgyZTMyLCAweDFlNTEsIDB4MGU3MCwKLQkweGZmOWYsIDB4ZWZiZSwgMHhkZmRkLCAweGNmZmMsIDB4YmYxYiwgMHhhZjNhLCAweDlmNTksIDB4OGY3OCwKLQkweDkxODgsIDB4ODFhOSwgMHhiMWNhLCAweGExZWIsIDB4ZDEwYywgMHhjMTJkLCAweGYxNGUsIDB4ZTE2ZiwKLQkweDEwODAsIDB4MDBhMSwgMHgzMGMyLCAweDIwZTMsIDB4NTAwNCwgMHg0MDI1LCAweDcwNDYsIDB4NjA2NywKLQkweDgzYjksIDB4OTM5OCwgMHhhM2ZiLCAweGIzZGEsIDB4YzMzZCwgMHhkMzFjLCAweGUzN2YsIDB4ZjM1ZSwKLQkweDAyYjEsIDB4MTI5MCwgMHgyMmYzLCAweDMyZDIsIDB4NDIzNSwgMHg1MjE0LCAweDYyNzcsIDB4NzI1NiwKLQkweGI1ZWEsIDB4YTVjYiwgMHg5NWE4LCAweDg1ODksIDB4ZjU2ZSwgMHhlNTRmLCAweGQ1MmMsIDB4YzUwZCwKLQkweDM0ZTIsIDB4MjRjMywgMHgxNGEwLCAweDA0ODEsIDB4NzQ2NiwgMHg2NDQ3LCAweDU0MjQsIDB4NDQwNSwKLQkweGE3ZGIsIDB4YjdmYSwgMHg4Nzk5LCAweDk3YjgsIDB4ZTc1ZiwgMHhmNzdlLCAweGM3MWQsIDB4ZDczYywKLQkweDI2ZDMsIDB4MzZmMiwgMHgwNjkxLCAweDE2YjAsIDB4NjY1NywgMHg3Njc2LCAweDQ2MTUsIDB4NTYzNCwKLQkweGQ5NGMsIDB4Yzk2ZCwgMHhmOTBlLCAweGU5MmYsIDB4OTljOCwgMHg4OWU5LCAweGI5OGEsIDB4YTlhYiwKLQkweDU4NDQsIDB4NDg2NSwgMHg3ODA2LCAweDY4MjcsIDB4MThjMCwgMHgwOGUxLCAweDM4ODIsIDB4MjhhMywKLQkweGNiN2QsIDB4ZGI1YywgMHhlYjNmLCAweGZiMWUsIDB4OGJmOSwgMHg5YmQ4LCAweGFiYmIsIDB4YmI5YSwKLQkweDRhNzUsIDB4NWE1NCwgMHg2YTM3LCAweDdhMTYsIDB4MGFmMSwgMHgxYWQwLCAweDJhYjMsIDB4M2E5MiwKLQkweGZkMmUsIDB4ZWQwZiwgMHhkZDZjLCAweGNkNGQsIDB4YmRhYSwgMHhhZDhiLCAweDlkZTgsIDB4OGRjOSwKLQkweDdjMjYsIDB4NmMwNywgMHg1YzY0LCAweDRjNDUsIDB4M2NhMiwgMHgyYzgzLCAweDFjZTAsIDB4MGNjMSwKLQkweGVmMWYsIDB4ZmYzZSwgMHhjZjVkLCAweGRmN2MsIDB4YWY5YiwgMHhiZmJhLCAweDhmZDksIDB4OWZmOCwKLQkweDZlMTcsIDB4N2UzNiwgMHg0ZTU1LCAweDVlNzQsIDB4MmU5MywgMHgzZWIyLCAweDBlZDEsIDB4MWVmMCwKKyAgICAweDAwMDAsIDB4MTAyMSwgMHgyMDQyLCAweDMwNjMsIDB4NDA4NCwgMHg1MGE1LCAweDYwYzYsIDB4NzBlNywKKyAgICAweDgxMDgsIDB4OTEyOSwgMHhhMTRhLCAweGIxNmIsIDB4YzE4YywgMHhkMWFkLCAweGUxY2UsIDB4ZjFlZiwKKyAgICAweDEyMzEsIDB4MDIxMCwgMHgzMjczLCAweDIyNTIsIDB4NTJiNSwgMHg0Mjk0LCAweDcyZjcsIDB4NjJkNiwKKyAgICAweDkzMzksIDB4ODMxOCwgMHhiMzdiLCAweGEzNWEsIDB4ZDNiZCwgMHhjMzljLCAweGYzZmYsIDB4ZTNkZSwKKyAgICAweDI0NjIsIDB4MzQ0MywgMHgwNDIwLCAweDE0MDEsIDB4NjRlNiwgMHg3NGM3LCAweDQ0YTQsIDB4NTQ4NSwKKyAgICAweGE1NmEsIDB4YjU0YiwgMHg4NTI4LCAweDk1MDksIDB4ZTVlZSwgMHhmNWNmLCAweGM1YWMsIDB4ZDU4ZCwKKyAgICAweDM2NTMsIDB4MjY3MiwgMHgxNjExLCAweDA2MzAsIDB4NzZkNywgMHg2NmY2LCAweDU2OTUsIDB4NDZiNCwKKyAgICAweGI3NWIsIDB4YTc3YSwgMHg5NzE5LCAweDg3MzgsIDB4ZjdkZiwgMHhlN2ZlLCAweGQ3OWQsIDB4YzdiYywKKyAgICAweDQ4YzQsIDB4NThlNSwgMHg2ODg2LCAweDc4YTcsIDB4MDg0MCwgMHgxODYxLCAweDI4MDIsIDB4MzgyMywKKyAgICAweGM5Y2MsIDB4ZDllZCwgMHhlOThlLCAweGY5YWYsIDB4ODk0OCwgMHg5OTY5LCAweGE5MGEsIDB4YjkyYiwKKyAgICAweDVhZjUsIDB4NGFkNCwgMHg3YWI3LCAweDZhOTYsIDB4MWE3MSwgMHgwYTUwLCAweDNhMzMsIDB4MmExMiwKKyAgICAweGRiZmQsIDB4Y2JkYywgMHhmYmJmLCAweGViOWUsIDB4OWI3OSwgMHg4YjU4LCAweGJiM2IsIDB4YWIxYSwKKyAgICAweDZjYTYsIDB4N2M4NywgMHg0Y2U0LCAweDVjYzUsIDB4MmMyMiwgMHgzYzAzLCAweDBjNjAsIDB4MWM0MSwKKyAgICAweGVkYWUsIDB4ZmQ4ZiwgMHhjZGVjLCAweGRkY2QsIDB4YWQyYSwgMHhiZDBiLCAweDhkNjgsIDB4OWQ0OSwKKyAgICAweDdlOTcsIDB4NmViNiwgMHg1ZWQ1LCAweDRlZjQsIDB4M2UxMywgMHgyZTMyLCAweDFlNTEsIDB4MGU3MCwKKyAgICAweGZmOWYsIDB4ZWZiZSwgMHhkZmRkLCAweGNmZmMsIDB4YmYxYiwgMHhhZjNhLCAweDlmNTksIDB4OGY3OCwKKyAgICAweDkxODgsIDB4ODFhOSwgMHhiMWNhLCAweGExZWIsIDB4ZDEwYywgMHhjMTJkLCAweGYxNGUsIDB4ZTE2ZiwKKyAgICAweDEwODAsIDB4MDBhMSwgMHgzMGMyLCAweDIwZTMsIDB4NTAwNCwgMHg0MDI1LCAweDcwNDYsIDB4NjA2NywKKyAgICAweDgzYjksIDB4OTM5OCwgMHhhM2ZiLCAweGIzZGEsIDB4YzMzZCwgMHhkMzFjLCAweGUzN2YsIDB4ZjM1ZSwKKyAgICAweDAyYjEsIDB4MTI5MCwgMHgyMmYzLCAweDMyZDIsIDB4NDIzNSwgMHg1MjE0LCAweDYyNzcsIDB4NzI1NiwKKyAgICAweGI1ZWEsIDB4YTVjYiwgMHg5NWE4LCAweDg1ODksIDB4ZjU2ZSwgMHhlNTRmLCAweGQ1MmMsIDB4YzUwZCwKKyAgICAweDM0ZTIsIDB4MjRjMywgMHgxNGEwLCAweDA0ODEsIDB4NzQ2NiwgMHg2NDQ3LCAweDU0MjQsIDB4NDQwNSwKKyAgICAweGE3ZGIsIDB4YjdmYSwgMHg4Nzk5LCAweDk3YjgsIDB4ZTc1ZiwgMHhmNzdlLCAweGM3MWQsIDB4ZDczYywKKyAgICAweDI2ZDMsIDB4MzZmMiwgMHgwNjkxLCAweDE2YjAsIDB4NjY1NywgMHg3Njc2LCAweDQ2MTUsIDB4NTYzNCwKKyAgICAweGQ5NGMsIDB4Yzk2ZCwgMHhmOTBlLCAweGU5MmYsIDB4OTljOCwgMHg4OWU5LCAweGI5OGEsIDB4YTlhYiwKKyAgICAweDU4NDQsIDB4NDg2NSwgMHg3ODA2LCAweDY4MjcsIDB4MThjMCwgMHgwOGUxLCAweDM4ODIsIDB4MjhhMywKKyAgICAweGNiN2QsIDB4ZGI1YywgMHhlYjNmLCAweGZiMWUsIDB4OGJmOSwgMHg5YmQ4LCAweGFiYmIsIDB4YmI5YSwKKyAgICAweDRhNzUsIDB4NWE1NCwgMHg2YTM3LCAweDdhMTYsIDB4MGFmMSwgMHgxYWQwLCAweDJhYjMsIDB4M2E5MiwKKyAgICAweGZkMmUsIDB4ZWQwZiwgMHhkZDZjLCAweGNkNGQsIDB4YmRhYSwgMHhhZDhiLCAweDlkZTgsIDB4OGRjOSwKKyAgICAweDdjMjYsIDB4NmMwNywgMHg1YzY0LCAweDRjNDUsIDB4M2NhMiwgMHgyYzgzLCAweDFjZTAsIDB4MGNjMSwKKyAgICAweGVmMWYsIDB4ZmYzZSwgMHhjZjVkLCAweGRmN2MsIDB4YWY5YiwgMHhiZmJhLCAweDhmZDksIDB4OWZmOCwKKyAgICAweDZlMTcsIDB4N2UzNiwgMHg0ZTU1LCAweDVlNzQsIDB4MmU5MywgMHgzZWIyLCAweDBlZDEsIDB4MWVmMCwKIH07CiAKIFB5RG9jX1NUUlZBUihkb2NfYTJiX3V1LCAiKGFzY2lpKSAtPiBiaW4uIERlY29kZSBhIGxpbmUgb2YgdXVlbmNvZGVkIGRhdGEiKTsKQEAgLTE4OCw3NyArMTg4LDc3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYmluYXNjaWlfYTJiX3V1KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQl1bnNpZ25lZCBjaGFyICphc2NpaV9kYXRhLCAqYmluX2RhdGE7Ci0JaW50IGxlZnRiaXRzID0gMDsKLQl1bnNpZ25lZCBjaGFyIHRoaXNfY2g7Ci0JdW5zaWduZWQgaW50IGxlZnRjaGFyID0gMDsKLQlQeU9iamVjdCAqcnY7Ci0JUHlfc3NpemVfdCBhc2NpaV9sZW4sIGJpbl9sZW47CisgICAgdW5zaWduZWQgY2hhciAqYXNjaWlfZGF0YSwgKmJpbl9kYXRhOworICAgIGludCBsZWZ0Yml0cyA9IDA7CisgICAgdW5zaWduZWQgY2hhciB0aGlzX2NoOworICAgIHVuc2lnbmVkIGludCBsZWZ0Y2hhciA9IDA7CisgICAgUHlPYmplY3QgKnJ2OworICAgIFB5X3NzaXplX3QgYXNjaWlfbGVuLCBiaW5fbGVuOwogCi0JaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAidCM6YTJiX3V1IiwgJmFzY2lpX2RhdGEsICZhc2NpaV9sZW4pICkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAidCM6YTJiX3V1IiwgJmFzY2lpX2RhdGEsICZhc2NpaV9sZW4pICkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlhc3NlcnQoYXNjaWlfbGVuID49IDApOworICAgIGFzc2VydChhc2NpaV9sZW4gPj0gMCk7CiAKLQkvKiBGaXJzdCBieXRlOiBiaW5hcnkgZGF0YSBsZW5ndGggKGluIGJ5dGVzKSAqLwotCWJpbl9sZW4gPSAoKmFzY2lpX2RhdGErKyAtICcgJykgJiAwNzc7Ci0JYXNjaWlfbGVuLS07CisgICAgLyogRmlyc3QgYnl0ZTogYmluYXJ5IGRhdGEgbGVuZ3RoIChpbiBieXRlcykgKi8KKyAgICBiaW5fbGVuID0gKCphc2NpaV9kYXRhKysgLSAnICcpICYgMDc3OworICAgIGFzY2lpX2xlbi0tOwogCi0JLyogQWxsb2NhdGUgdGhlIGJ1ZmZlciAqLwotCWlmICggKHJ2PVB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGJpbl9sZW4pKSA9PSBOVUxMICkKLQkJcmV0dXJuIE5VTEw7Ci0JYmluX2RhdGEgPSAodW5zaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKKyAgICAvKiBBbGxvY2F0ZSB0aGUgYnVmZmVyICovCisgICAgaWYgKCAocnY9UHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgYmluX2xlbikpID09IE5VTEwgKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBiaW5fZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpOwogCi0JZm9yKCA7IGJpbl9sZW4gPiAwIDsgYXNjaWlfbGVuLS0sIGFzY2lpX2RhdGErKyApIHsKLQkJLyogWFhYIGlzIGl0IHJlYWxseSBiZXN0IHRvIGFkZCBOVUxzIGlmIHRoZXJlJ3Mgbm8gbW9yZSBkYXRhICovCi0JCXRoaXNfY2ggPSAoYXNjaWlfbGVuID4gMCkgPyAqYXNjaWlfZGF0YSA6IDA7Ci0JCWlmICggdGhpc19jaCA9PSAnXG4nIHx8IHRoaXNfY2ggPT0gJ1xyJyB8fCBhc2NpaV9sZW4gPD0gMCkgewotCQkJLyoKLQkJCSoqIFdoaXRlc3BhY2UuIEFzc3VtZSBzb21lIHNwYWNlcyBnb3QgZWF0ZW4gYXQKLQkJCSoqIGVuZC1vZi1saW5lLiAoV2UgY2hlY2sgdGhpcyBsYXRlcikKLQkJCSovCi0JCQl0aGlzX2NoID0gMDsKLQkgICAgICAgIH0gZWxzZSB7Ci0JCQkvKiBDaGVjayB0aGUgY2hhcmFjdGVyIGZvciBsZWdhbGl0eQotCQkJKiogVGhlIDY0IGluIHN0ZWFkIG9mIHRoZSBleHBlY3RlZCA2MyBpcyBiZWNhdXNlCi0JCQkqKiB0aGVyZSBhcmUgYSBmZXcgdXVlbmNvZGVzIG91dCB0aGVyZSB0aGF0IHVzZQotCQkJKiogJ2AnIGFzIHplcm8gaW5zdGVhZCBvZiBzcGFjZS4KLQkJCSovCi0JCQlpZiAoIHRoaXNfY2ggPCAnICcgfHwgdGhpc19jaCA+ICgnICcgKyA2NCkpIHsKLQkJCQlQeUVycl9TZXRTdHJpbmcoRXJyb3IsICJJbGxlZ2FsIGNoYXIiKTsKLQkJCQlQeV9ERUNSRUYocnYpOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQkJdGhpc19jaCA9ICh0aGlzX2NoIC0gJyAnKSAmIDA3NzsKLQkJfQotCQkvKgotCQkqKiBTaGlmdCBpdCBpbiBvbiB0aGUgbG93IGVuZCwgYW5kIHNlZSBpZiB0aGVyZSdzCi0JCSoqIGEgYnl0ZSByZWFkeSBmb3Igb3V0cHV0LgotCQkqLwotCQlsZWZ0Y2hhciA9IChsZWZ0Y2hhciA8PCA2KSB8ICh0aGlzX2NoKTsKLQkJbGVmdGJpdHMgKz0gNjsKLQkJaWYgKCBsZWZ0Yml0cyA+PSA4ICkgewotCQkJbGVmdGJpdHMgLT0gODsKLQkJCSpiaW5fZGF0YSsrID0gKGxlZnRjaGFyID4+IGxlZnRiaXRzKSAmIDB4ZmY7Ci0JCQlsZWZ0Y2hhciAmPSAoKDEgPDwgbGVmdGJpdHMpIC0gMSk7Ci0JCQliaW5fbGVuLS07Ci0JCX0KLQl9Ci0JLyoKLQkqKiBGaW5hbGx5LCBjaGVjayB0aGF0IGlmIHRoZXJlJ3MgYW55dGhpbmcgbGVmdCBvbiB0aGUgbGluZQotCSoqIHRoYXQgaXQncyB3aGl0ZXNwYWNlIG9ubHkuCi0JKi8KLQl3aGlsZSggYXNjaWlfbGVuLS0gPiAwICkgewotCQl0aGlzX2NoID0gKmFzY2lpX2RhdGErKzsKLQkJLyogRXh0cmEgJ2AnIG1heSBiZSB3cml0dGVuIGFzIHBhZGRpbmcgaW4gc29tZSBjYXNlcyAqLwotCQlpZiAoIHRoaXNfY2ggIT0gJyAnICYmIHRoaXNfY2ggIT0gJyAnKzY0ICYmCi0JCSAgICAgdGhpc19jaCAhPSAnXG4nICYmIHRoaXNfY2ggIT0gJ1xyJyApIHsKLQkJCVB5RXJyX1NldFN0cmluZyhFcnJvciwgIlRyYWlsaW5nIGdhcmJhZ2UiKTsKLQkJCVB5X0RFQ1JFRihydik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KLQlyZXR1cm4gcnY7CisgICAgZm9yKCA7IGJpbl9sZW4gPiAwIDsgYXNjaWlfbGVuLS0sIGFzY2lpX2RhdGErKyApIHsKKyAgICAgICAgLyogWFhYIGlzIGl0IHJlYWxseSBiZXN0IHRvIGFkZCBOVUxzIGlmIHRoZXJlJ3Mgbm8gbW9yZSBkYXRhICovCisgICAgICAgIHRoaXNfY2ggPSAoYXNjaWlfbGVuID4gMCkgPyAqYXNjaWlfZGF0YSA6IDA7CisgICAgICAgIGlmICggdGhpc19jaCA9PSAnXG4nIHx8IHRoaXNfY2ggPT0gJ1xyJyB8fCBhc2NpaV9sZW4gPD0gMCkgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICoqIFdoaXRlc3BhY2UuIEFzc3VtZSBzb21lIHNwYWNlcyBnb3QgZWF0ZW4gYXQKKyAgICAgICAgICAgICoqIGVuZC1vZi1saW5lLiAoV2UgY2hlY2sgdGhpcyBsYXRlcikKKyAgICAgICAgICAgICovCisgICAgICAgICAgICB0aGlzX2NoID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIENoZWNrIHRoZSBjaGFyYWN0ZXIgZm9yIGxlZ2FsaXR5CisgICAgICAgICAgICAqKiBUaGUgNjQgaW4gc3RlYWQgb2YgdGhlIGV4cGVjdGVkIDYzIGlzIGJlY2F1c2UKKyAgICAgICAgICAgICoqIHRoZXJlIGFyZSBhIGZldyB1dWVuY29kZXMgb3V0IHRoZXJlIHRoYXQgdXNlCisgICAgICAgICAgICAqKiAnYCcgYXMgemVybyBpbnN0ZWFkIG9mIHNwYWNlLgorICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmICggdGhpc19jaCA8ICcgJyB8fCB0aGlzX2NoID4gKCcgJyArIDY0KSkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhFcnJvciwgIklsbGVnYWwgY2hhciIpOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihydik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aGlzX2NoID0gKHRoaXNfY2ggLSAnICcpICYgMDc3OworICAgICAgICB9CisgICAgICAgIC8qCisgICAgICAgICoqIFNoaWZ0IGl0IGluIG9uIHRoZSBsb3cgZW5kLCBhbmQgc2VlIGlmIHRoZXJlJ3MKKyAgICAgICAgKiogYSBieXRlIHJlYWR5IGZvciBvdXRwdXQuCisgICAgICAgICovCisgICAgICAgIGxlZnRjaGFyID0gKGxlZnRjaGFyIDw8IDYpIHwgKHRoaXNfY2gpOworICAgICAgICBsZWZ0Yml0cyArPSA2OworICAgICAgICBpZiAoIGxlZnRiaXRzID49IDggKSB7CisgICAgICAgICAgICBsZWZ0Yml0cyAtPSA4OworICAgICAgICAgICAgKmJpbl9kYXRhKysgPSAobGVmdGNoYXIgPj4gbGVmdGJpdHMpICYgMHhmZjsKKyAgICAgICAgICAgIGxlZnRjaGFyICY9ICgoMSA8PCBsZWZ0Yml0cykgLSAxKTsKKyAgICAgICAgICAgIGJpbl9sZW4tLTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKgorICAgICoqIEZpbmFsbHksIGNoZWNrIHRoYXQgaWYgdGhlcmUncyBhbnl0aGluZyBsZWZ0IG9uIHRoZSBsaW5lCisgICAgKiogdGhhdCBpdCdzIHdoaXRlc3BhY2Ugb25seS4KKyAgICAqLworICAgIHdoaWxlKCBhc2NpaV9sZW4tLSA+IDAgKSB7CisgICAgICAgIHRoaXNfY2ggPSAqYXNjaWlfZGF0YSsrOworICAgICAgICAvKiBFeHRyYSAnYCcgbWF5IGJlIHdyaXR0ZW4gYXMgcGFkZGluZyBpbiBzb21lIGNhc2VzICovCisgICAgICAgIGlmICggdGhpc19jaCAhPSAnICcgJiYgdGhpc19jaCAhPSAnICcrNjQgJiYKKyAgICAgICAgICAgICB0aGlzX2NoICE9ICdcbicgJiYgdGhpc19jaCAhPSAnXHInICkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEVycm9yLCAiVHJhaWxpbmcgZ2FyYmFnZSIpOworICAgICAgICAgICAgUHlfREVDUkVGKHJ2KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBydjsKIH0KIAogUHlEb2NfU1RSVkFSKGRvY19iMmFfdXUsICIoYmluKSAtPiBhc2NpaS4gVXVlbmNvZGUgbGluZSBvZiBkYXRhIik7CkBAIC0yNjYsNzUgKzI2Niw3NSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGJpbmFzY2lpX2IyYV91dShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JdW5zaWduZWQgY2hhciAqYXNjaWlfZGF0YSwgKmJpbl9kYXRhOwotCWludCBsZWZ0Yml0cyA9IDA7Ci0JdW5zaWduZWQgY2hhciB0aGlzX2NoOwotCXVuc2lnbmVkIGludCBsZWZ0Y2hhciA9IDA7Ci0JUHlPYmplY3QgKnJ2OwotCVB5X3NzaXplX3QgYmluX2xlbjsKKyAgICB1bnNpZ25lZCBjaGFyICphc2NpaV9kYXRhLCAqYmluX2RhdGE7CisgICAgaW50IGxlZnRiaXRzID0gMDsKKyAgICB1bnNpZ25lZCBjaGFyIHRoaXNfY2g7CisgICAgdW5zaWduZWQgaW50IGxlZnRjaGFyID0gMDsKKyAgICBQeU9iamVjdCAqcnY7CisgICAgUHlfc3NpemVfdCBiaW5fbGVuOwogCi0JaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyM6YjJhX3V1IiwgJmJpbl9kYXRhLCAmYmluX2xlbikgKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIGJpbl9sZW4gPiA0NSApIHsKLQkJLyogVGhlIDQ1IGlzIGEgbGltaXQgdGhhdCBhcHBlYXJzIGluIGFsbCB1dWVuY29kZSdzICovCi0JCVB5RXJyX1NldFN0cmluZyhFcnJvciwgIkF0IG1vc3QgNDUgYnl0ZXMgYXQgb25jZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyM6YjJhX3V1IiwgJmJpbl9kYXRhLCAmYmluX2xlbikgKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIGJpbl9sZW4gPiA0NSApIHsKKyAgICAgICAgLyogVGhlIDQ1IGlzIGEgbGltaXQgdGhhdCBhcHBlYXJzIGluIGFsbCB1dWVuY29kZSdzICovCisgICAgICAgIFB5RXJyX1NldFN0cmluZyhFcnJvciwgIkF0IG1vc3QgNDUgYnl0ZXMgYXQgb25jZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQkvKiBXZSdyZSBsYXp5IGFuZCBhbGxvY2F0ZSB0byBtdWNoIChmaXhlZCB1cCBsYXRlcikgKi8KLQlpZiAoIChydj1QeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCAyICsgKGJpbl9sZW4rMikvMyo0KSkgPT0gTlVMTCApCi0JCXJldHVybiBOVUxMOwotCWFzY2lpX2RhdGEgPSAodW5zaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKKyAgICAvKiBXZSdyZSBsYXp5IGFuZCBhbGxvY2F0ZSB0byBtdWNoIChmaXhlZCB1cCBsYXRlcikgKi8KKyAgICBpZiAoIChydj1QeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCAyICsgKGJpbl9sZW4rMikvMyo0KSkgPT0gTlVMTCApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGFzY2lpX2RhdGEgPSAodW5zaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKIAotCS8qIFN0b3JlIHRoZSBsZW5ndGggKi8KLQkqYXNjaWlfZGF0YSsrID0gJyAnICsgKGJpbl9sZW4gJiAwNzcpOworICAgIC8qIFN0b3JlIHRoZSBsZW5ndGggKi8KKyAgICAqYXNjaWlfZGF0YSsrID0gJyAnICsgKGJpbl9sZW4gJiAwNzcpOwogCi0JZm9yKCA7IGJpbl9sZW4gPiAwIHx8IGxlZnRiaXRzICE9IDAgOyBiaW5fbGVuLS0sIGJpbl9kYXRhKysgKSB7Ci0JCS8qIFNoaWZ0IHRoZSBkYXRhIChvciBwYWRkaW5nKSBpbnRvIG91ciBidWZmZXIgKi8KLQkJaWYgKCBiaW5fbGVuID4gMCApCS8qIERhdGEgKi8KLQkJCWxlZnRjaGFyID0gKGxlZnRjaGFyIDw8IDgpIHwgKmJpbl9kYXRhOwotCQllbHNlCQkJLyogUGFkZGluZyAqLwotCQkJbGVmdGNoYXIgPDw9IDg7Ci0JCWxlZnRiaXRzICs9IDg7CisgICAgZm9yKCA7IGJpbl9sZW4gPiAwIHx8IGxlZnRiaXRzICE9IDAgOyBiaW5fbGVuLS0sIGJpbl9kYXRhKysgKSB7CisgICAgICAgIC8qIFNoaWZ0IHRoZSBkYXRhIChvciBwYWRkaW5nKSBpbnRvIG91ciBidWZmZXIgKi8KKyAgICAgICAgaWYgKCBiaW5fbGVuID4gMCApICAgICAgICAgICAgICAvKiBEYXRhICovCisgICAgICAgICAgICBsZWZ0Y2hhciA9IChsZWZ0Y2hhciA8PCA4KSB8ICpiaW5fZGF0YTsKKyAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQYWRkaW5nICovCisgICAgICAgICAgICBsZWZ0Y2hhciA8PD0gODsKKyAgICAgICAgbGVmdGJpdHMgKz0gODsKIAotCQkvKiBTZWUgaWYgdGhlcmUgYXJlIDYtYml0IGdyb3VwcyByZWFkeSAqLwotCQl3aGlsZSAoIGxlZnRiaXRzID49IDYgKSB7Ci0JCQl0aGlzX2NoID0gKGxlZnRjaGFyID4+IChsZWZ0Yml0cy02KSkgJiAweDNmOwotCQkJbGVmdGJpdHMgLT0gNjsKLQkJCSphc2NpaV9kYXRhKysgPSB0aGlzX2NoICsgJyAnOwotCQl9Ci0JfQotCSphc2NpaV9kYXRhKysgPSAnXG4nOwkvKiBBcHBlbmQgYSBjb3VydGVzeSBuZXdsaW5lICovCisgICAgICAgIC8qIFNlZSBpZiB0aGVyZSBhcmUgNi1iaXQgZ3JvdXBzIHJlYWR5ICovCisgICAgICAgIHdoaWxlICggbGVmdGJpdHMgPj0gNiApIHsKKyAgICAgICAgICAgIHRoaXNfY2ggPSAobGVmdGNoYXIgPj4gKGxlZnRiaXRzLTYpKSAmIDB4M2Y7CisgICAgICAgICAgICBsZWZ0Yml0cyAtPSA2OworICAgICAgICAgICAgKmFzY2lpX2RhdGErKyA9IHRoaXNfY2ggKyAnICc7CisgICAgICAgIH0KKyAgICB9CisgICAgKmFzY2lpX2RhdGErKyA9ICdcbic7ICAgICAgIC8qIEFwcGVuZCBhIGNvdXJ0ZXN5IG5ld2xpbmUgKi8KIAotCV9QeVN0cmluZ19SZXNpemUoJnJ2LCAoYXNjaWlfZGF0YSAtCi0JCQkgICAgICAgKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhydikpKTsKLQlyZXR1cm4gcnY7CisgICAgX1B5U3RyaW5nX1Jlc2l6ZSgmcnYsIChhc2NpaV9kYXRhIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpKSk7CisgICAgcmV0dXJuIHJ2OwogfQogCiAKIHN0YXRpYyBpbnQKIGJpbmFzY2lpX2ZpbmRfdmFsaWQodW5zaWduZWQgY2hhciAqcywgUHlfc3NpemVfdCBzbGVuLCBpbnQgbnVtKQogewotCS8qIEZpbmRzICYgcmV0dXJucyB0aGUgKG51bSsxKXRoCi0JKiogdmFsaWQgY2hhcmFjdGVyIGZvciBiYXNlNjQsIG9yIC0xIGlmIG5vbmUuCi0JKi8KKyAgICAvKiBGaW5kcyAmIHJldHVybnMgdGhlIChudW0rMSl0aAorICAgICoqIHZhbGlkIGNoYXJhY3RlciBmb3IgYmFzZTY0LCBvciAtMSBpZiBub25lLgorICAgICovCiAKLQlpbnQgcmV0ID0gLTE7Ci0JdW5zaWduZWQgY2hhciBjLCBiNjR2YWw7CisgICAgaW50IHJldCA9IC0xOworICAgIHVuc2lnbmVkIGNoYXIgYywgYjY0dmFsOwogCi0Jd2hpbGUgKChzbGVuID4gMCkgJiYgKHJldCA9PSAtMSkpIHsKLQkJYyA9ICpzOwotCQliNjR2YWwgPSB0YWJsZV9hMmJfYmFzZTY0W2MgJiAweDdmXTsKLQkJaWYgKCAoKGMgPD0gMHg3ZikgJiYgKGI2NHZhbCAhPSAodW5zaWduZWQgY2hhciktMSkpICkgewotCQkJaWYgKG51bSA9PSAwKQotCQkJCXJldCA9ICpzOwotCQkJbnVtLS07Ci0JCX0KKyAgICB3aGlsZSAoKHNsZW4gPiAwKSAmJiAocmV0ID09IC0xKSkgeworICAgICAgICBjID0gKnM7CisgICAgICAgIGI2NHZhbCA9IHRhYmxlX2EyYl9iYXNlNjRbYyAmIDB4N2ZdOworICAgICAgICBpZiAoICgoYyA8PSAweDdmKSAmJiAoYjY0dmFsICE9ICh1bnNpZ25lZCBjaGFyKS0xKSkgKSB7CisgICAgICAgICAgICBpZiAobnVtID09IDApCisgICAgICAgICAgICAgICAgcmV0ID0gKnM7CisgICAgICAgICAgICBudW0tLTsKKyAgICAgICAgfQogCi0JCXMrKzsKLQkJc2xlbi0tOwotCX0KLQlyZXR1cm4gcmV0OworICAgICAgICBzKys7CisgICAgICAgIHNsZW4tLTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKIH0KIAogUHlEb2NfU1RSVkFSKGRvY19hMmJfYmFzZTY0LCAiKGFzY2lpKSAtPiBiaW4uIERlY29kZSBhIGxpbmUgb2YgYmFzZTY0IGRhdGEiKTsKQEAgLTM0Miw5NSArMzQyLDk1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYmluYXNjaWlfYTJiX2Jhc2U2NChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JdW5zaWduZWQgY2hhciAqYXNjaWlfZGF0YSwgKmJpbl9kYXRhOwotCWludCBsZWZ0Yml0cyA9IDA7Ci0JdW5zaWduZWQgY2hhciB0aGlzX2NoOwotCXVuc2lnbmVkIGludCBsZWZ0Y2hhciA9IDA7Ci0JUHlPYmplY3QgKnJ2OwotCVB5X3NzaXplX3QgYXNjaWlfbGVuLCBiaW5fbGVuOwotCWludCBxdWFkX3BvcyA9IDA7CisgICAgdW5zaWduZWQgY2hhciAqYXNjaWlfZGF0YSwgKmJpbl9kYXRhOworICAgIGludCBsZWZ0Yml0cyA9IDA7CisgICAgdW5zaWduZWQgY2hhciB0aGlzX2NoOworICAgIHVuc2lnbmVkIGludCBsZWZ0Y2hhciA9IDA7CisgICAgUHlPYmplY3QgKnJ2OworICAgIFB5X3NzaXplX3QgYXNjaWlfbGVuLCBiaW5fbGVuOworICAgIGludCBxdWFkX3BvcyA9IDA7CiAKLQlpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ0IzphMmJfYmFzZTY0IiwgJmFzY2lpX2RhdGEsICZhc2NpaV9sZW4pICkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAidCM6YTJiX2Jhc2U2NCIsICZhc2NpaV9kYXRhLCAmYXNjaWlfbGVuKSApCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JYXNzZXJ0KGFzY2lpX2xlbiA+PSAwKTsKKyAgICBhc3NlcnQoYXNjaWlfbGVuID49IDApOwogCi0JaWYgKGFzY2lpX2xlbiA+IFBZX1NTSVpFX1RfTUFYIC0gMykKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgaWYgKGFzY2lpX2xlbiA+IFBZX1NTSVpFX1RfTUFYIC0gMykKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CiAKLQliaW5fbGVuID0gKChhc2NpaV9sZW4rMykvNCkqMzsgLyogVXBwZXIgYm91bmQsIGNvcnJlY3RlZCBsYXRlciAqLworICAgIGJpbl9sZW4gPSAoKGFzY2lpX2xlbiszKS80KSozOyAvKiBVcHBlciBib3VuZCwgY29ycmVjdGVkIGxhdGVyICovCiAKLQkvKiBBbGxvY2F0ZSB0aGUgYnVmZmVyICovCi0JaWYgKCAocnY9UHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgYmluX2xlbikpID09IE5VTEwgKQotCQlyZXR1cm4gTlVMTDsKLQliaW5fZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpOwotCWJpbl9sZW4gPSAwOworICAgIC8qIEFsbG9jYXRlIHRoZSBidWZmZXIgKi8KKyAgICBpZiAoIChydj1QeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBiaW5fbGVuKSkgPT0gTlVMTCApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGJpbl9kYXRhID0gKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhydik7CisgICAgYmluX2xlbiA9IDA7CiAKLQlmb3IoIDsgYXNjaWlfbGVuID4gMDsgYXNjaWlfbGVuLS0sIGFzY2lpX2RhdGErKykgewotCQl0aGlzX2NoID0gKmFzY2lpX2RhdGE7CisgICAgZm9yKCA7IGFzY2lpX2xlbiA+IDA7IGFzY2lpX2xlbi0tLCBhc2NpaV9kYXRhKyspIHsKKyAgICAgICAgdGhpc19jaCA9ICphc2NpaV9kYXRhOwogCi0JCWlmICh0aGlzX2NoID4gMHg3ZiB8fAotCQkgICAgdGhpc19jaCA9PSAnXHInIHx8IHRoaXNfY2ggPT0gJ1xuJyB8fCB0aGlzX2NoID09ICcgJykKLQkJCWNvbnRpbnVlOworICAgICAgICBpZiAodGhpc19jaCA+IDB4N2YgfHwKKyAgICAgICAgICAgIHRoaXNfY2ggPT0gJ1xyJyB8fCB0aGlzX2NoID09ICdcbicgfHwgdGhpc19jaCA9PSAnICcpCisgICAgICAgICAgICBjb250aW51ZTsKIAotCQkvKiBDaGVjayBmb3IgcGFkIHNlcXVlbmNlcyBhbmQgaWdub3JlCi0JCSoqIHRoZSBpbnZhbGlkIG9uZXMuCi0JCSovCi0JCWlmICh0aGlzX2NoID09IEJBU0U2NF9QQUQpIHsKLQkJCWlmICggKHF1YWRfcG9zIDwgMikgfHwKLQkJCSAgICAgKChxdWFkX3BvcyA9PSAyKSAmJgotCQkJICAgICAgKGJpbmFzY2lpX2ZpbmRfdmFsaWQoYXNjaWlfZGF0YSwgYXNjaWlfbGVuLCAxKQotCQkJICAgICAgICE9IEJBU0U2NF9QQUQpKSApCi0JCQl7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvKiBBIHBhZCBzZXF1ZW5jZSBtZWFucyBubyBtb3JlIGlucHV0LgotCQkJCSoqIFdlJ3ZlIGFscmVhZHkgaW50ZXJwcmV0ZWQgdGhlIGRhdGEKLQkJCQkqKiBmcm9tIHRoZSBxdWFkIGF0IHRoaXMgcG9pbnQuCi0JCQkJKi8KLQkJCQlsZWZ0Yml0cyA9IDA7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KKyAgICAgICAgLyogQ2hlY2sgZm9yIHBhZCBzZXF1ZW5jZXMgYW5kIGlnbm9yZQorICAgICAgICAqKiB0aGUgaW52YWxpZCBvbmVzLgorICAgICAgICAqLworICAgICAgICBpZiAodGhpc19jaCA9PSBCQVNFNjRfUEFEKSB7CisgICAgICAgICAgICBpZiAoIChxdWFkX3BvcyA8IDIpIHx8CisgICAgICAgICAgICAgICAgICgocXVhZF9wb3MgPT0gMikgJiYKKyAgICAgICAgICAgICAgICAgIChiaW5hc2NpaV9maW5kX3ZhbGlkKGFzY2lpX2RhdGEsIGFzY2lpX2xlbiwgMSkKKyAgICAgICAgICAgICAgICAgICAhPSBCQVNFNjRfUEFEKSkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgLyogQSBwYWQgc2VxdWVuY2UgbWVhbnMgbm8gbW9yZSBpbnB1dC4KKyAgICAgICAgICAgICAgICAqKiBXZSd2ZSBhbHJlYWR5IGludGVycHJldGVkIHRoZSBkYXRhCisgICAgICAgICAgICAgICAgKiogZnJvbSB0aGUgcXVhZCBhdCB0aGlzIHBvaW50LgorICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgbGVmdGJpdHMgPSAwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJdGhpc19jaCA9IHRhYmxlX2EyYl9iYXNlNjRbKmFzY2lpX2RhdGFdOwotCQlpZiAoIHRoaXNfY2ggPT0gKHVuc2lnbmVkIGNoYXIpIC0xICkKLQkJCWNvbnRpbnVlOworICAgICAgICB0aGlzX2NoID0gdGFibGVfYTJiX2Jhc2U2NFsqYXNjaWlfZGF0YV07CisgICAgICAgIGlmICggdGhpc19jaCA9PSAodW5zaWduZWQgY2hhcikgLTEgKQorICAgICAgICAgICAgY29udGludWU7CiAKLQkJLyoKLQkJKiogU2hpZnQgaXQgaW4gb24gdGhlIGxvdyBlbmQsIGFuZCBzZWUgaWYgdGhlcmUncwotCQkqKiBhIGJ5dGUgcmVhZHkgZm9yIG91dHB1dC4KLQkJKi8KLQkJcXVhZF9wb3MgPSAocXVhZF9wb3MgKyAxKSAmIDB4MDM7Ci0JCWxlZnRjaGFyID0gKGxlZnRjaGFyIDw8IDYpIHwgKHRoaXNfY2gpOwotCQlsZWZ0Yml0cyArPSA2OworICAgICAgICAvKgorICAgICAgICAqKiBTaGlmdCBpdCBpbiBvbiB0aGUgbG93IGVuZCwgYW5kIHNlZSBpZiB0aGVyZSdzCisgICAgICAgICoqIGEgYnl0ZSByZWFkeSBmb3Igb3V0cHV0LgorICAgICAgICAqLworICAgICAgICBxdWFkX3BvcyA9IChxdWFkX3BvcyArIDEpICYgMHgwMzsKKyAgICAgICAgbGVmdGNoYXIgPSAobGVmdGNoYXIgPDwgNikgfCAodGhpc19jaCk7CisgICAgICAgIGxlZnRiaXRzICs9IDY7CiAKLQkJaWYgKCBsZWZ0Yml0cyA+PSA4ICkgewotCQkJbGVmdGJpdHMgLT0gODsKLQkJCSpiaW5fZGF0YSsrID0gKGxlZnRjaGFyID4+IGxlZnRiaXRzKSAmIDB4ZmY7Ci0JCQliaW5fbGVuKys7Ci0JCQlsZWZ0Y2hhciAmPSAoKDEgPDwgbGVmdGJpdHMpIC0gMSk7Ci0JCX0KLSAJfQorICAgICAgICBpZiAoIGxlZnRiaXRzID49IDggKSB7CisgICAgICAgICAgICBsZWZ0Yml0cyAtPSA4OworICAgICAgICAgICAgKmJpbl9kYXRhKysgPSAobGVmdGNoYXIgPj4gbGVmdGJpdHMpICYgMHhmZjsKKyAgICAgICAgICAgIGJpbl9sZW4rKzsKKyAgICAgICAgICAgIGxlZnRjaGFyICY9ICgoMSA8PCBsZWZ0Yml0cykgLSAxKTsKKyAgICAgICAgfQorICAgIH0KIAotCWlmIChsZWZ0Yml0cyAhPSAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhFcnJvciwgIkluY29ycmVjdCBwYWRkaW5nIik7Ci0JCVB5X0RFQ1JFRihydik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAobGVmdGJpdHMgIT0gMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoRXJyb3IsICJJbmNvcnJlY3QgcGFkZGluZyIpOworICAgICAgICBQeV9ERUNSRUYocnYpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQkvKiBBbmQgc2V0IHN0cmluZyBzaXplIGNvcnJlY3RseS4gSWYgdGhlIHJlc3VsdCBzdHJpbmcgaXMgZW1wdHkKLQkqKiAoYmVjYXVzZSB0aGUgaW5wdXQgd2FzIGFsbCBpbnZhbGlkKSByZXR1cm4gdGhlIHNoYXJlZCBlbXB0eQotCSoqIHN0cmluZyBpbnN0ZWFkOyBfUHlTdHJpbmdfUmVzaXplKCkgd29uJ3QgZG8gdGhpcyBmb3IgdXMuCi0JKi8KLQlpZiAoYmluX2xlbiA+IDApCi0JCV9QeVN0cmluZ19SZXNpemUoJnJ2LCBiaW5fbGVuKTsKLQllbHNlIHsKLQkJUHlfREVDUkVGKHJ2KTsKLQkJcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCIiKTsKLQl9Ci0JcmV0dXJuIHJ2OworICAgIC8qIEFuZCBzZXQgc3RyaW5nIHNpemUgY29ycmVjdGx5LiBJZiB0aGUgcmVzdWx0IHN0cmluZyBpcyBlbXB0eQorICAgICoqIChiZWNhdXNlIHRoZSBpbnB1dCB3YXMgYWxsIGludmFsaWQpIHJldHVybiB0aGUgc2hhcmVkIGVtcHR5CisgICAgKiogc3RyaW5nIGluc3RlYWQ7IF9QeVN0cmluZ19SZXNpemUoKSB3b24ndCBkbyB0aGlzIGZvciB1cy4KKyAgICAqLworICAgIGlmIChiaW5fbGVuID4gMCkKKyAgICAgICAgX1B5U3RyaW5nX1Jlc2l6ZSgmcnYsIGJpbl9sZW4pOworICAgIGVsc2UgeworICAgICAgICBQeV9ERUNSRUYocnYpOworICAgICAgICBydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIiIpOworICAgIH0KKyAgICByZXR1cm4gcnY7CiB9CiAKIFB5RG9jX1NUUlZBUihkb2NfYjJhX2Jhc2U2NCwgIihiaW4pIC0+IGFzY2lpLiBCYXNlNjQtY29kZSBsaW5lIG9mIGRhdGEiKTsKQEAgLTQzOCw1NSArNDM4LDU1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYmluYXNjaWlfYjJhX2Jhc2U2NChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JdW5zaWduZWQgY2hhciAqYXNjaWlfZGF0YSwgKmJpbl9kYXRhOwotCWludCBsZWZ0Yml0cyA9IDA7Ci0JdW5zaWduZWQgY2hhciB0aGlzX2NoOwotCXVuc2lnbmVkIGludCBsZWZ0Y2hhciA9IDA7Ci0JUHlPYmplY3QgKnJ2OwotCVB5X3NzaXplX3QgYmluX2xlbjsKKyAgICB1bnNpZ25lZCBjaGFyICphc2NpaV9kYXRhLCAqYmluX2RhdGE7CisgICAgaW50IGxlZnRiaXRzID0gMDsKKyAgICB1bnNpZ25lZCBjaGFyIHRoaXNfY2g7CisgICAgdW5zaWduZWQgaW50IGxlZnRjaGFyID0gMDsKKyAgICBQeU9iamVjdCAqcnY7CisgICAgUHlfc3NpemVfdCBiaW5fbGVuOwogCi0JaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyM6YjJhX2Jhc2U2NCIsICZiaW5fZGF0YSwgJmJpbl9sZW4pICkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyM6YjJhX2Jhc2U2NCIsICZiaW5fZGF0YSwgJmJpbl9sZW4pICkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlhc3NlcnQoYmluX2xlbiA+PSAwKTsKKyAgICBhc3NlcnQoYmluX2xlbiA+PSAwKTsKIAotCWlmICggYmluX2xlbiA+IEJBU0U2NF9NQVhCSU4gKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhFcnJvciwgIlRvbyBtdWNoIGRhdGEgZm9yIGJhc2U2NCBsaW5lIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoIGJpbl9sZW4gPiBCQVNFNjRfTUFYQklOICkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoRXJyb3IsICJUb28gbXVjaCBkYXRhIGZvciBiYXNlNjQgbGluZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQkvKiBXZSdyZSBsYXp5IGFuZCBhbGxvY2F0ZSB0b28gbXVjaCAoZml4ZWQgdXAgbGF0ZXIpLgotCSAgICIrMyIgbGVhdmVzIHJvb20gZm9yIHVwIHRvIHR3byBwYWQgY2hhcmFjdGVycyBhbmQgYSB0cmFpbGluZwotCSAgIG5ld2xpbmUuICBOb3RlIHRoYXQgJ2InIGdldHMgZW5jb2RlZCBhcyAnWWc9PVxuJyAoMSBpbiwgNSBvdXQpLiAqLwotCWlmICggKHJ2PVB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGJpbl9sZW4qMiArIDMpKSA9PSBOVUxMICkKLQkJcmV0dXJuIE5VTEw7Ci0JYXNjaWlfZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpOworICAgIC8qIFdlJ3JlIGxhenkgYW5kIGFsbG9jYXRlIHRvbyBtdWNoIChmaXhlZCB1cCBsYXRlcikuCisgICAgICAgIiszIiBsZWF2ZXMgcm9vbSBmb3IgdXAgdG8gdHdvIHBhZCBjaGFyYWN0ZXJzIGFuZCBhIHRyYWlsaW5nCisgICAgICAgbmV3bGluZS4gIE5vdGUgdGhhdCAnYicgZ2V0cyBlbmNvZGVkIGFzICdZZz09XG4nICgxIGluLCA1IG91dCkuICovCisgICAgaWYgKCAocnY9UHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgYmluX2xlbioyICsgMykpID09IE5VTEwgKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBhc2NpaV9kYXRhID0gKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhydik7CiAKLQlmb3IoIDsgYmluX2xlbiA+IDAgOyBiaW5fbGVuLS0sIGJpbl9kYXRhKysgKSB7Ci0JCS8qIFNoaWZ0IHRoZSBkYXRhIGludG8gb3VyIGJ1ZmZlciAqLwotCQlsZWZ0Y2hhciA9IChsZWZ0Y2hhciA8PCA4KSB8ICpiaW5fZGF0YTsKLQkJbGVmdGJpdHMgKz0gODsKKyAgICBmb3IoIDsgYmluX2xlbiA+IDAgOyBiaW5fbGVuLS0sIGJpbl9kYXRhKysgKSB7CisgICAgICAgIC8qIFNoaWZ0IHRoZSBkYXRhIGludG8gb3VyIGJ1ZmZlciAqLworICAgICAgICBsZWZ0Y2hhciA9IChsZWZ0Y2hhciA8PCA4KSB8ICpiaW5fZGF0YTsKKyAgICAgICAgbGVmdGJpdHMgKz0gODsKIAotCQkvKiBTZWUgaWYgdGhlcmUgYXJlIDYtYml0IGdyb3VwcyByZWFkeSAqLwotCQl3aGlsZSAoIGxlZnRiaXRzID49IDYgKSB7Ci0JCQl0aGlzX2NoID0gKGxlZnRjaGFyID4+IChsZWZ0Yml0cy02KSkgJiAweDNmOwotCQkJbGVmdGJpdHMgLT0gNjsKLQkJCSphc2NpaV9kYXRhKysgPSB0YWJsZV9iMmFfYmFzZTY0W3RoaXNfY2hdOwotCQl9Ci0JfQotCWlmICggbGVmdGJpdHMgPT0gMiApIHsKLQkJKmFzY2lpX2RhdGErKyA9IHRhYmxlX2IyYV9iYXNlNjRbKGxlZnRjaGFyJjMpIDw8IDRdOwotCQkqYXNjaWlfZGF0YSsrID0gQkFTRTY0X1BBRDsKLQkJKmFzY2lpX2RhdGErKyA9IEJBU0U2NF9QQUQ7Ci0JfSBlbHNlIGlmICggbGVmdGJpdHMgPT0gNCApIHsKLQkJKmFzY2lpX2RhdGErKyA9IHRhYmxlX2IyYV9iYXNlNjRbKGxlZnRjaGFyJjB4ZikgPDwgMl07Ci0JCSphc2NpaV9kYXRhKysgPSBCQVNFNjRfUEFEOwotCX0KLQkqYXNjaWlfZGF0YSsrID0gJ1xuJzsJLyogQXBwZW5kIGEgY291cnRlc3kgbmV3bGluZSAqLworICAgICAgICAvKiBTZWUgaWYgdGhlcmUgYXJlIDYtYml0IGdyb3VwcyByZWFkeSAqLworICAgICAgICB3aGlsZSAoIGxlZnRiaXRzID49IDYgKSB7CisgICAgICAgICAgICB0aGlzX2NoID0gKGxlZnRjaGFyID4+IChsZWZ0Yml0cy02KSkgJiAweDNmOworICAgICAgICAgICAgbGVmdGJpdHMgLT0gNjsKKyAgICAgICAgICAgICphc2NpaV9kYXRhKysgPSB0YWJsZV9iMmFfYmFzZTY0W3RoaXNfY2hdOworICAgICAgICB9CisgICAgfQorICAgIGlmICggbGVmdGJpdHMgPT0gMiApIHsKKyAgICAgICAgKmFzY2lpX2RhdGErKyA9IHRhYmxlX2IyYV9iYXNlNjRbKGxlZnRjaGFyJjMpIDw8IDRdOworICAgICAgICAqYXNjaWlfZGF0YSsrID0gQkFTRTY0X1BBRDsKKyAgICAgICAgKmFzY2lpX2RhdGErKyA9IEJBU0U2NF9QQUQ7CisgICAgfSBlbHNlIGlmICggbGVmdGJpdHMgPT0gNCApIHsKKyAgICAgICAgKmFzY2lpX2RhdGErKyA9IHRhYmxlX2IyYV9iYXNlNjRbKGxlZnRjaGFyJjB4ZikgPDwgMl07CisgICAgICAgICphc2NpaV9kYXRhKysgPSBCQVNFNjRfUEFEOworICAgIH0KKyAgICAqYXNjaWlfZGF0YSsrID0gJ1xuJzsgICAgICAgLyogQXBwZW5kIGEgY291cnRlc3kgbmV3bGluZSAqLwogCi0JX1B5U3RyaW5nX1Jlc2l6ZSgmcnYsIChhc2NpaV9kYXRhIC0KLQkJCSAgICAgICAodW5zaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KSkpOwotCXJldHVybiBydjsKKyAgICBfUHlTdHJpbmdfUmVzaXplKCZydiwgKGFzY2lpX2RhdGEgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhydikpKTsKKyAgICByZXR1cm4gcnY7CiB9CiAKIFB5RG9jX1NUUlZBUihkb2NfYTJiX2hxeCwgImFzY2lpIC0+IGJpbiwgZG9uZS4gRGVjb2RlIC5ocXggY29kaW5nIik7CkBAIC00OTQsNzAgKzQ5NCw3MCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGJpbmFzY2lpX2EyYl9ocXgoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXVuc2lnbmVkIGNoYXIgKmFzY2lpX2RhdGEsICpiaW5fZGF0YTsKLQlpbnQgbGVmdGJpdHMgPSAwOwotCXVuc2lnbmVkIGNoYXIgdGhpc19jaDsKLQl1bnNpZ25lZCBpbnQgbGVmdGNoYXIgPSAwOwotCVB5T2JqZWN0ICpydjsKLQlQeV9zc2l6ZV90IGxlbjsKLQlpbnQgZG9uZSA9IDA7CisgICAgdW5zaWduZWQgY2hhciAqYXNjaWlfZGF0YSwgKmJpbl9kYXRhOworICAgIGludCBsZWZ0Yml0cyA9IDA7CisgICAgdW5zaWduZWQgY2hhciB0aGlzX2NoOworICAgIHVuc2lnbmVkIGludCBsZWZ0Y2hhciA9IDA7CisgICAgUHlPYmplY3QgKnJ2OworICAgIFB5X3NzaXplX3QgbGVuOworICAgIGludCBkb25lID0gMDsKIAotCWlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInQjOmEyYl9ocXgiLCAmYXNjaWlfZGF0YSwgJmxlbikgKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ0IzphMmJfaHF4IiwgJmFzY2lpX2RhdGEsICZsZW4pICkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlhc3NlcnQobGVuID49IDApOworICAgIGFzc2VydChsZW4gPj0gMCk7CiAKLQlpZiAobGVuID4gUFlfU1NJWkVfVF9NQVggLSAyKQotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICBpZiAobGVuID4gUFlfU1NJWkVfVF9NQVggLSAyKQorICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKIAotCS8qIEFsbG9jYXRlIGEgc3RyaW5nIHRoYXQgaXMgdG9vIGJpZyAoZml4ZWQgbGF0ZXIpIAotCSAgIEFkZCB0d28gdG8gdGhlIGluaXRpYWwgbGVuZ3RoIHRvIHByZXZlbnQgaW50ZXJuaW5nIHdoaWNoCi0JICAgd291bGQgcHJlY2x1ZGUgc3Vic2VxdWVudCByZXNpemluZy4gICovCi0JaWYgKCAocnY9UHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbGVuKzIpKSA9PSBOVUxMICkKLQkJcmV0dXJuIE5VTEw7Ci0JYmluX2RhdGEgPSAodW5zaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKKyAgICAvKiBBbGxvY2F0ZSBhIHN0cmluZyB0aGF0IGlzIHRvbyBiaWcgKGZpeGVkIGxhdGVyKQorICAgICAgIEFkZCB0d28gdG8gdGhlIGluaXRpYWwgbGVuZ3RoIHRvIHByZXZlbnQgaW50ZXJuaW5nIHdoaWNoCisgICAgICAgd291bGQgcHJlY2x1ZGUgc3Vic2VxdWVudCByZXNpemluZy4gICovCisgICAgaWYgKCAocnY9UHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbGVuKzIpKSA9PSBOVUxMICkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYmluX2RhdGEgPSAodW5zaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKIAotCWZvciggOyBsZW4gPiAwIDsgbGVuLS0sIGFzY2lpX2RhdGErKyApIHsKLQkJLyogR2V0IHRoZSBieXRlIGFuZCBsb29rIGl0IHVwICovCi0JCXRoaXNfY2ggPSB0YWJsZV9hMmJfaHF4Wyphc2NpaV9kYXRhXTsKLQkJaWYgKCB0aGlzX2NoID09IFNLSVAgKQotCQkJY29udGludWU7Ci0JCWlmICggdGhpc19jaCA9PSBGQUlMICkgewotCQkJUHlFcnJfU2V0U3RyaW5nKEVycm9yLCAiSWxsZWdhbCBjaGFyIik7Ci0JCQlQeV9ERUNSRUYocnYpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJaWYgKCB0aGlzX2NoID09IERPTkUgKSB7Ci0JCQkvKiBUaGUgdGVybWluYXRpbmcgY29sb24gKi8KLQkJCWRvbmUgPSAxOwotCQkJYnJlYWs7Ci0JCX0KKyAgICBmb3IoIDsgbGVuID4gMCA7IGxlbi0tLCBhc2NpaV9kYXRhKysgKSB7CisgICAgICAgIC8qIEdldCB0aGUgYnl0ZSBhbmQgbG9vayBpdCB1cCAqLworICAgICAgICB0aGlzX2NoID0gdGFibGVfYTJiX2hxeFsqYXNjaWlfZGF0YV07CisgICAgICAgIGlmICggdGhpc19jaCA9PSBTS0lQICkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoIHRoaXNfY2ggPT0gRkFJTCApIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhFcnJvciwgIklsbGVnYWwgY2hhciIpOworICAgICAgICAgICAgUHlfREVDUkVGKHJ2KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGlmICggdGhpc19jaCA9PSBET05FICkgeworICAgICAgICAgICAgLyogVGhlIHRlcm1pbmF0aW5nIGNvbG9uICovCisgICAgICAgICAgICBkb25lID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CiAKLQkJLyogU2hpZnQgaXQgaW50byB0aGUgYnVmZmVyIGFuZCBzZWUgaWYgYW55IGJ5dGVzIGFyZSByZWFkeSAqLwotCQlsZWZ0Y2hhciA9IChsZWZ0Y2hhciA8PCA2KSB8ICh0aGlzX2NoKTsKLQkJbGVmdGJpdHMgKz0gNjsKLQkJaWYgKCBsZWZ0Yml0cyA+PSA4ICkgewotCQkJbGVmdGJpdHMgLT0gODsKLQkJCSpiaW5fZGF0YSsrID0gKGxlZnRjaGFyID4+IGxlZnRiaXRzKSAmIDB4ZmY7Ci0JCQlsZWZ0Y2hhciAmPSAoKDEgPDwgbGVmdGJpdHMpIC0gMSk7Ci0JCX0KLQl9CisgICAgICAgIC8qIFNoaWZ0IGl0IGludG8gdGhlIGJ1ZmZlciBhbmQgc2VlIGlmIGFueSBieXRlcyBhcmUgcmVhZHkgKi8KKyAgICAgICAgbGVmdGNoYXIgPSAobGVmdGNoYXIgPDwgNikgfCAodGhpc19jaCk7CisgICAgICAgIGxlZnRiaXRzICs9IDY7CisgICAgICAgIGlmICggbGVmdGJpdHMgPj0gOCApIHsKKyAgICAgICAgICAgIGxlZnRiaXRzIC09IDg7CisgICAgICAgICAgICAqYmluX2RhdGErKyA9IChsZWZ0Y2hhciA+PiBsZWZ0Yml0cykgJiAweGZmOworICAgICAgICAgICAgbGVmdGNoYXIgJj0gKCgxIDw8IGxlZnRiaXRzKSAtIDEpOworICAgICAgICB9CisgICAgfQogCi0JaWYgKCBsZWZ0Yml0cyAmJiAhZG9uZSApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKEluY29tcGxldGUsCi0JCQkJIlN0cmluZyBoYXMgaW5jb21wbGV0ZSBudW1iZXIgb2YgYnl0ZXMiKTsKLQkJUHlfREVDUkVGKHJ2KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCV9QeVN0cmluZ19SZXNpemUoCi0JCSZydiwgKGJpbl9kYXRhIC0gKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhydikpKTsKLQlpZiAocnYpIHsKLQkJUHlPYmplY3QgKnJydiA9IFB5X0J1aWxkVmFsdWUoIk9pIiwgcnYsIGRvbmUpOwotCQlQeV9ERUNSRUYocnYpOwotCQlyZXR1cm4gcnJ2OwotCX0KKyAgICBpZiAoIGxlZnRiaXRzICYmICFkb25lICkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoSW5jb21wbGV0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJTdHJpbmcgaGFzIGluY29tcGxldGUgbnVtYmVyIG9mIGJ5dGVzIik7CisgICAgICAgIFB5X0RFQ1JFRihydik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBfUHlTdHJpbmdfUmVzaXplKAorICAgICAgICAmcnYsIChiaW5fZGF0YSAtICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpKSk7CisgICAgaWYgKHJ2KSB7CisgICAgICAgIFB5T2JqZWN0ICpycnYgPSBQeV9CdWlsZFZhbHVlKCJPaSIsIHJ2LCBkb25lKTsKKyAgICAgICAgUHlfREVDUkVGKHJ2KTsKKyAgICAgICAgcmV0dXJuIHJydjsKKyAgICB9CiAKLQlyZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogUHlEb2NfU1RSVkFSKGRvY19ybGVjb2RlX2hxeCwgIkJpbmhleCBSTEUtY29kZSBiaW5hcnkgZGF0YSIpOwpAQCAtNTY1LDUxICs1NjUsNTEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBiaW5hc2NpaV9ybGVjb2RlX2hxeChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JdW5zaWduZWQgY2hhciAqaW5fZGF0YSwgKm91dF9kYXRhOwotCVB5T2JqZWN0ICpydjsKLQl1bnNpZ25lZCBjaGFyIGNoOwotCVB5X3NzaXplX3QgaW4sIGluZW5kLCBsZW47CisgICAgdW5zaWduZWQgY2hhciAqaW5fZGF0YSwgKm91dF9kYXRhOworICAgIFB5T2JqZWN0ICpydjsKKyAgICB1bnNpZ25lZCBjaGFyIGNoOworICAgIFB5X3NzaXplX3QgaW4sIGluZW5kLCBsZW47CiAKLQlpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIzpybGVjb2RlX2hxeCIsICZpbl9kYXRhLCAmbGVuKSApCi0JCXJldHVybiBOVUxMOworICAgIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjOnJsZWNvZGVfaHF4IiwgJmluX2RhdGEsICZsZW4pICkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlhc3NlcnQobGVuID49IDApOworICAgIGFzc2VydChsZW4gPj0gMCk7CiAKLQlpZiAobGVuID4gUFlfU1NJWkVfVF9NQVggLyAyIC0gMikKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgaWYgKGxlbiA+IFBZX1NTSVpFX1RfTUFYIC8gMiAtIDIpCisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOwogCi0JLyogV29yc3QgY2FzZTogb3V0cHV0IGlzIHR3aWNlIGFzIGJpZyBhcyBpbnB1dCAoZml4ZWQgbGF0ZXIpICovCi0JaWYgKCAocnY9UHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbGVuKjIrMikpID09IE5VTEwgKQotCQlyZXR1cm4gTlVMTDsKLQlvdXRfZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpOworICAgIC8qIFdvcnN0IGNhc2U6IG91dHB1dCBpcyB0d2ljZSBhcyBiaWcgYXMgaW5wdXQgKGZpeGVkIGxhdGVyKSAqLworICAgIGlmICggKHJ2PVB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGxlbioyKzIpKSA9PSBOVUxMICkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgb3V0X2RhdGEgPSAodW5zaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKIAotCWZvciggaW49MDsgaW48bGVuOyBpbisrKSB7Ci0JCWNoID0gaW5fZGF0YVtpbl07Ci0JCWlmICggY2ggPT0gUlVOQ0hBUiApIHsKLQkJCS8qIFJVTkNIQVIuIEVzY2FwZSBpdC4gKi8KLQkJCSpvdXRfZGF0YSsrID0gUlVOQ0hBUjsKLQkJCSpvdXRfZGF0YSsrID0gMDsKLQkJfSBlbHNlIHsKLQkJCS8qIENoZWNrIGhvdyBtYW55IGZvbGxvd2luZyBhcmUgdGhlIHNhbWUgKi8KLQkJCWZvcihpbmVuZD1pbisxOwotCQkJICAgIGluZW5kPGxlbiAmJiBpbl9kYXRhW2luZW5kXSA9PSBjaCAmJgotCQkJCSAgICBpbmVuZCA8IGluKzI1NTsKLQkJCSAgICBpbmVuZCsrKSA7Ci0JCQlpZiAoIGluZW5kIC0gaW4gPiAzICkgewotCQkJCS8qIE1vcmUgdGhhbiAzIGluIGEgcm93LiBPdXRwdXQgUkxFLiAqLwotCQkJCSpvdXRfZGF0YSsrID0gY2g7Ci0JCQkJKm91dF9kYXRhKysgPSBSVU5DSEFSOwotCQkJCSpvdXRfZGF0YSsrID0gaW5lbmQtaW47Ci0JCQkJaW4gPSBpbmVuZC0xOwotCQkJfSBlbHNlIHsKLQkJCQkvKiBMZXNzIHRoYW4gMy4gT3V0cHV0IHRoZSBieXRlIGl0c2VsZiAqLwotCQkJCSpvdXRfZGF0YSsrID0gY2g7Ci0JCQl9Ci0JCX0KLQl9Ci0JX1B5U3RyaW5nX1Jlc2l6ZSgmcnYsIChvdXRfZGF0YSAtCi0JCQkgICAgICAgKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhydikpKTsKLQlyZXR1cm4gcnY7CisgICAgZm9yKCBpbj0wOyBpbjxsZW47IGluKyspIHsKKyAgICAgICAgY2ggPSBpbl9kYXRhW2luXTsKKyAgICAgICAgaWYgKCBjaCA9PSBSVU5DSEFSICkgeworICAgICAgICAgICAgLyogUlVOQ0hBUi4gRXNjYXBlIGl0LiAqLworICAgICAgICAgICAgKm91dF9kYXRhKysgPSBSVU5DSEFSOworICAgICAgICAgICAgKm91dF9kYXRhKysgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogQ2hlY2sgaG93IG1hbnkgZm9sbG93aW5nIGFyZSB0aGUgc2FtZSAqLworICAgICAgICAgICAgZm9yKGluZW5kPWluKzE7CisgICAgICAgICAgICAgICAgaW5lbmQ8bGVuICYmIGluX2RhdGFbaW5lbmRdID09IGNoICYmCisgICAgICAgICAgICAgICAgICAgIGluZW5kIDwgaW4rMjU1OworICAgICAgICAgICAgICAgIGluZW5kKyspIDsKKyAgICAgICAgICAgIGlmICggaW5lbmQgLSBpbiA+IDMgKSB7CisgICAgICAgICAgICAgICAgLyogTW9yZSB0aGFuIDMgaW4gYSByb3cuIE91dHB1dCBSTEUuICovCisgICAgICAgICAgICAgICAgKm91dF9kYXRhKysgPSBjaDsKKyAgICAgICAgICAgICAgICAqb3V0X2RhdGErKyA9IFJVTkNIQVI7CisgICAgICAgICAgICAgICAgKm91dF9kYXRhKysgPSBpbmVuZC1pbjsKKyAgICAgICAgICAgICAgICBpbiA9IGluZW5kLTE7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8qIExlc3MgdGhhbiAzLiBPdXRwdXQgdGhlIGJ5dGUgaXRzZWxmICovCisgICAgICAgICAgICAgICAgKm91dF9kYXRhKysgPSBjaDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBfUHlTdHJpbmdfUmVzaXplKCZydiwgKG91dF9kYXRhIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpKSk7CisgICAgcmV0dXJuIHJ2OwogfQogCiBQeURvY19TVFJWQVIoZG9jX2IyYV9ocXgsICJFbmNvZGUgLmhxeCBkYXRhIik7CkBAIC02MTcsNDQgKzYxNyw0NCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGJpbmFzY2lpX2IyYV9ocXgoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXVuc2lnbmVkIGNoYXIgKmFzY2lpX2RhdGEsICpiaW5fZGF0YTsKLQlpbnQgbGVmdGJpdHMgPSAwOwotCXVuc2lnbmVkIGNoYXIgdGhpc19jaDsKLQl1bnNpZ25lZCBpbnQgbGVmdGNoYXIgPSAwOwotCVB5T2JqZWN0ICpydjsKLQlQeV9zc2l6ZV90IGxlbjsKKyAgICB1bnNpZ25lZCBjaGFyICphc2NpaV9kYXRhLCAqYmluX2RhdGE7CisgICAgaW50IGxlZnRiaXRzID0gMDsKKyAgICB1bnNpZ25lZCBjaGFyIHRoaXNfY2g7CisgICAgdW5zaWduZWQgaW50IGxlZnRjaGFyID0gMDsKKyAgICBQeU9iamVjdCAqcnY7CisgICAgUHlfc3NpemVfdCBsZW47CiAKLQlpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIzpiMmFfaHF4IiwgJmJpbl9kYXRhLCAmbGVuKSApCi0JCXJldHVybiBOVUxMOworICAgIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjOmIyYV9ocXgiLCAmYmluX2RhdGEsICZsZW4pICkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlhc3NlcnQobGVuID49IDApOworICAgIGFzc2VydChsZW4gPj0gMCk7CiAKLQlpZiAobGVuID4gUFlfU1NJWkVfVF9NQVggLyAyIC0gMikKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgaWYgKGxlbiA+IFBZX1NTSVpFX1RfTUFYIC8gMiAtIDIpCisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOwogCi0JLyogQWxsb2NhdGUgYSBidWZmZXIgdGhhdCBpcyBhdCBsZWFzdCBsYXJnZSBlbm91Z2ggKi8KLQlpZiAoIChydj1QeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBsZW4qMisyKSkgPT0gTlVMTCApCi0JCXJldHVybiBOVUxMOwotCWFzY2lpX2RhdGEgPSAodW5zaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKKyAgICAvKiBBbGxvY2F0ZSBhIGJ1ZmZlciB0aGF0IGlzIGF0IGxlYXN0IGxhcmdlIGVub3VnaCAqLworICAgIGlmICggKHJ2PVB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGxlbioyKzIpKSA9PSBOVUxMICkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYXNjaWlfZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpOwogCi0JZm9yKCA7IGxlbiA+IDAgOyBsZW4tLSwgYmluX2RhdGErKyApIHsKLQkJLyogU2hpZnQgaW50byBvdXIgYnVmZmVyLCBhbmQgb3V0cHV0IGFueSA2Yml0cyByZWFkeSAqLwotCQlsZWZ0Y2hhciA9IChsZWZ0Y2hhciA8PCA4KSB8ICpiaW5fZGF0YTsKLQkJbGVmdGJpdHMgKz0gODsKLQkJd2hpbGUgKCBsZWZ0Yml0cyA+PSA2ICkgewotCQkJdGhpc19jaCA9IChsZWZ0Y2hhciA+PiAobGVmdGJpdHMtNikpICYgMHgzZjsKLQkJCWxlZnRiaXRzIC09IDY7Ci0JCQkqYXNjaWlfZGF0YSsrID0gdGFibGVfYjJhX2hxeFt0aGlzX2NoXTsKLQkJfQotCX0KLQkvKiBPdXRwdXQgYSBwb3NzaWJsZSBydW50IGJ5dGUgKi8KLQlpZiAoIGxlZnRiaXRzICkgewotCQlsZWZ0Y2hhciA8PD0gKDYtbGVmdGJpdHMpOwotCQkqYXNjaWlfZGF0YSsrID0gdGFibGVfYjJhX2hxeFtsZWZ0Y2hhciAmIDB4M2ZdOwotCX0KLQlfUHlTdHJpbmdfUmVzaXplKCZydiwgKGFzY2lpX2RhdGEgLQotCQkJICAgICAgICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpKSk7Ci0JcmV0dXJuIHJ2OworICAgIGZvciggOyBsZW4gPiAwIDsgbGVuLS0sIGJpbl9kYXRhKysgKSB7CisgICAgICAgIC8qIFNoaWZ0IGludG8gb3VyIGJ1ZmZlciwgYW5kIG91dHB1dCBhbnkgNmJpdHMgcmVhZHkgKi8KKyAgICAgICAgbGVmdGNoYXIgPSAobGVmdGNoYXIgPDwgOCkgfCAqYmluX2RhdGE7CisgICAgICAgIGxlZnRiaXRzICs9IDg7CisgICAgICAgIHdoaWxlICggbGVmdGJpdHMgPj0gNiApIHsKKyAgICAgICAgICAgIHRoaXNfY2ggPSAobGVmdGNoYXIgPj4gKGxlZnRiaXRzLTYpKSAmIDB4M2Y7CisgICAgICAgICAgICBsZWZ0Yml0cyAtPSA2OworICAgICAgICAgICAgKmFzY2lpX2RhdGErKyA9IHRhYmxlX2IyYV9ocXhbdGhpc19jaF07CisgICAgICAgIH0KKyAgICB9CisgICAgLyogT3V0cHV0IGEgcG9zc2libGUgcnVudCBieXRlICovCisgICAgaWYgKCBsZWZ0Yml0cyApIHsKKyAgICAgICAgbGVmdGNoYXIgPDw9ICg2LWxlZnRiaXRzKTsKKyAgICAgICAgKmFzY2lpX2RhdGErKyA9IHRhYmxlX2IyYV9ocXhbbGVmdGNoYXIgJiAweDNmXTsKKyAgICB9CisgICAgX1B5U3RyaW5nX1Jlc2l6ZSgmcnYsIChhc2NpaV9kYXRhIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpKSk7CisgICAgcmV0dXJuIHJ2OwogfQogCiBQeURvY19TVFJWQVIoZG9jX3JsZWRlY29kZV9ocXgsICJEZWNvZGUgaGV4YmluIFJMRS1jb2RlZCBzdHJpbmciKTsKQEAgLTY2MiwxMDAgKzY2MiwxMDAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBiaW5hc2NpaV9ybGVkZWNvZGVfaHF4KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQl1bnNpZ25lZCBjaGFyICppbl9kYXRhLCAqb3V0X2RhdGE7Ci0JdW5zaWduZWQgY2hhciBpbl9ieXRlLCBpbl9yZXBlYXQ7Ci0JUHlPYmplY3QgKnJ2OwotCVB5X3NzaXplX3QgaW5fbGVuLCBvdXRfbGVuLCBvdXRfbGVuX2xlZnQ7CisgICAgdW5zaWduZWQgY2hhciAqaW5fZGF0YSwgKm91dF9kYXRhOworICAgIHVuc2lnbmVkIGNoYXIgaW5fYnl0ZSwgaW5fcmVwZWF0OworICAgIFB5T2JqZWN0ICpydjsKKyAgICBQeV9zc2l6ZV90IGluX2xlbiwgb3V0X2xlbiwgb3V0X2xlbl9sZWZ0OwogCi0JaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyM6cmxlZGVjb2RlX2hxeCIsICZpbl9kYXRhLCAmaW5fbGVuKSApCi0JCXJldHVybiBOVUxMOworICAgIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjOnJsZWRlY29kZV9ocXgiLCAmaW5fZGF0YSwgJmluX2xlbikgKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWFzc2VydChpbl9sZW4gPj0gMCk7CisgICAgYXNzZXJ0KGluX2xlbiA+PSAwKTsKIAotCS8qIEVtcHR5IHN0cmluZyBpcyBhIHNwZWNpYWwgY2FzZSAqLwotCWlmICggaW5fbGVuID09IDAgKQotCQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZygiIik7CisgICAgLyogRW1wdHkgc3RyaW5nIGlzIGEgc3BlY2lhbCBjYXNlICovCisgICAgaWYgKCBpbl9sZW4gPT0gMCApCisgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKCIiKTsKICAgICBlbHNlIGlmIChpbl9sZW4gPiBQWV9TU0laRV9UX01BWCAvIDIpCi0gICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOwogCi0JLyogQWxsb2NhdGUgYSBidWZmZXIgb2YgcmVhc29uYWJsZSBzaXplLiBSZXNpemVkIHdoZW4gbmVlZGVkICovCi0Jb3V0X2xlbiA9IGluX2xlbioyOwotCWlmICggKHJ2PVB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIG91dF9sZW4pKSA9PSBOVUxMICkKLQkJcmV0dXJuIE5VTEw7Ci0Jb3V0X2xlbl9sZWZ0ID0gb3V0X2xlbjsKLQlvdXRfZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpOworICAgIC8qIEFsbG9jYXRlIGEgYnVmZmVyIG9mIHJlYXNvbmFibGUgc2l6ZS4gUmVzaXplZCB3aGVuIG5lZWRlZCAqLworICAgIG91dF9sZW4gPSBpbl9sZW4qMjsKKyAgICBpZiAoIChydj1QeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBvdXRfbGVuKSkgPT0gTlVMTCApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG91dF9sZW5fbGVmdCA9IG91dF9sZW47CisgICAgb3V0X2RhdGEgPSAodW5zaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKIAotCS8qCi0JKiogV2UgbmVlZCB0d28gbWFjcm9zIGhlcmUgdG8gZ2V0L3B1dCBieXRlcyBhbmQgaGFuZGxlCi0JKiogZW5kLW9mLWJ1ZmZlciBmb3IgaW5wdXQgYW5kIG91dHB1dCBzdHJpbmdzLgotCSovCisgICAgLyoKKyAgICAqKiBXZSBuZWVkIHR3byBtYWNyb3MgaGVyZSB0byBnZXQvcHV0IGJ5dGVzIGFuZCBoYW5kbGUKKyAgICAqKiBlbmQtb2YtYnVmZmVyIGZvciBpbnB1dCBhbmQgb3V0cHV0IHN0cmluZ3MuCisgICAgKi8KICNkZWZpbmUgSU5CWVRFKGIpIFwKLQlkbyB7IFwKLQkgICAgICAgICBpZiAoIC0taW5fbGVuIDwgMCApIHsgXAotCQkJICAgUHlFcnJfU2V0U3RyaW5nKEluY29tcGxldGUsICIiKTsgXAotCQkJICAgUHlfREVDUkVGKHJ2KTsgXAotCQkJICAgcmV0dXJuIE5VTEw7IFwKLQkJIH0gXAotCQkgYiA9ICppbl9kYXRhKys7IFwKLQl9IHdoaWxlKDApCisgICAgZG8geyBcCisgICAgICAgICAgICAgaWYgKCAtLWluX2xlbiA8IDAgKSB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEluY29tcGxldGUsICIiKTsgXAorICAgICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYocnYpOyBcCisgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOyBcCisgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICAgYiA9ICppbl9kYXRhKys7IFwKKyAgICB9IHdoaWxlKDApCiAKICNkZWZpbmUgT1VUQllURShiKSBcCi0JZG8geyBcCi0JCSBpZiAoIC0tb3V0X2xlbl9sZWZ0IDwgMCApIHsgXAotCQkJICBpZiAoIG91dF9sZW4gPiBQWV9TU0laRV9UX01BWCAvIDIpIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOyBcCi0JCQkgIF9QeVN0cmluZ19SZXNpemUoJnJ2LCAyKm91dF9sZW4pOyBcCi0JCQkgIGlmICggcnYgPT0gTlVMTCApIHJldHVybiBOVUxMOyBcCi0JCQkgIG91dF9kYXRhID0gKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhydikgXAotCQkJCQkJCQkgKyBvdXRfbGVuOyBcCi0JCQkgIG91dF9sZW5fbGVmdCA9IG91dF9sZW4tMTsgXAotCQkJICBvdXRfbGVuID0gb3V0X2xlbiAqIDI7IFwKLQkJIH0gXAotCQkgKm91dF9kYXRhKysgPSBiOyBcCi0JfSB3aGlsZSgwKQorICAgIGRvIHsgXAorICAgICAgICAgICAgIGlmICggLS1vdXRfbGVuX2xlZnQgPCAwICkgeyBcCisgICAgICAgICAgICAgICAgICAgICAgaWYgKCBvdXRfbGVuID4gUFlfU1NJWkVfVF9NQVggLyAyKSByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsgXAorICAgICAgICAgICAgICAgICAgICAgIF9QeVN0cmluZ19SZXNpemUoJnJ2LCAyKm91dF9sZW4pOyBcCisgICAgICAgICAgICAgICAgICAgICAgaWYgKCBydiA9PSBOVUxMICkgcmV0dXJuIE5VTEw7IFwKKyAgICAgICAgICAgICAgICAgICAgICBvdXRfZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG91dF9sZW47IFwKKyAgICAgICAgICAgICAgICAgICAgICBvdXRfbGVuX2xlZnQgPSBvdXRfbGVuLTE7IFwKKyAgICAgICAgICAgICAgICAgICAgICBvdXRfbGVuID0gb3V0X2xlbiAqIDI7IFwKKyAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICAqb3V0X2RhdGErKyA9IGI7IFwKKyAgICB9IHdoaWxlKDApCiAKLQkJLyoKLQkJKiogSGFuZGxlIGZpcnN0IGJ5dGUgc2VwYXJhdGVseSAoc2luY2Ugd2UgaGF2ZSB0byBnZXQgYW5ncnkKLQkJKiogaW4gY2FzZSBvZiBhbiBvcnBoYW5lZCBSTEUgY29kZSkuCi0JCSovCi0JCUlOQllURShpbl9ieXRlKTsKKyAgICAgICAgLyoKKyAgICAgICAgKiogSGFuZGxlIGZpcnN0IGJ5dGUgc2VwYXJhdGVseSAoc2luY2Ugd2UgaGF2ZSB0byBnZXQgYW5ncnkKKyAgICAgICAgKiogaW4gY2FzZSBvZiBhbiBvcnBoYW5lZCBSTEUgY29kZSkuCisgICAgICAgICovCisgICAgICAgIElOQllURShpbl9ieXRlKTsKIAotCWlmIChpbl9ieXRlID09IFJVTkNIQVIpIHsKLQkJSU5CWVRFKGluX3JlcGVhdCk7Ci0JCWlmIChpbl9yZXBlYXQgIT0gMCkgewotCQkJLyogTm90ZSBFcnJvciwgbm90IEluY29tcGxldGUgKHdoaWNoIGlzIGF0IHRoZSBlbmQKLQkJCSoqIG9mIHRoZSBzdHJpbmcgb25seSkuIFRoaXMgaXMgYSBwcm9ncmFtbWVyIGVycm9yLgotCQkJKi8KLQkJCVB5RXJyX1NldFN0cmluZyhFcnJvciwgIk9ycGhhbmVkIFJMRSBjb2RlIGF0IHN0YXJ0Iik7Ci0JCQlQeV9ERUNSRUYocnYpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJT1VUQllURShSVU5DSEFSKTsKLQl9IGVsc2UgewotCQlPVVRCWVRFKGluX2J5dGUpOwotCX0KKyAgICBpZiAoaW5fYnl0ZSA9PSBSVU5DSEFSKSB7CisgICAgICAgIElOQllURShpbl9yZXBlYXQpOworICAgICAgICBpZiAoaW5fcmVwZWF0ICE9IDApIHsKKyAgICAgICAgICAgIC8qIE5vdGUgRXJyb3IsIG5vdCBJbmNvbXBsZXRlICh3aGljaCBpcyBhdCB0aGUgZW5kCisgICAgICAgICAgICAqKiBvZiB0aGUgc3RyaW5nIG9ubHkpLiBUaGlzIGlzIGEgcHJvZ3JhbW1lciBlcnJvci4KKyAgICAgICAgICAgICovCisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoRXJyb3IsICJPcnBoYW5lZCBSTEUgY29kZSBhdCBzdGFydCIpOworICAgICAgICAgICAgUHlfREVDUkVGKHJ2KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIE9VVEJZVEUoUlVOQ0hBUik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgT1VUQllURShpbl9ieXRlKTsKKyAgICB9CiAKLQl3aGlsZSggaW5fbGVuID4gMCApIHsKLQkJSU5CWVRFKGluX2J5dGUpOworICAgIHdoaWxlKCBpbl9sZW4gPiAwICkgeworICAgICAgICBJTkJZVEUoaW5fYnl0ZSk7CiAKLQkJaWYgKGluX2J5dGUgPT0gUlVOQ0hBUikgewotCQkJSU5CWVRFKGluX3JlcGVhdCk7Ci0JCQlpZiAoIGluX3JlcGVhdCA9PSAwICkgewotCQkJCS8qIEp1c3QgYW4gZXNjYXBlZCBSVU5DSEFSIHZhbHVlICovCi0JCQkJT1VUQllURShSVU5DSEFSKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLyogUGljayB1cCB2YWx1ZSBhbmQgb3V0cHV0IGEgc2VxdWVuY2Ugb2YgaXQgKi8KLQkJCQlpbl9ieXRlID0gb3V0X2RhdGFbLTFdOwotCQkJCXdoaWxlICggLS1pbl9yZXBlYXQgPiAwICkKLQkJCQkJT1VUQllURShpbl9ieXRlKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCS8qIE5vcm1hbCBieXRlICovCi0JCQlPVVRCWVRFKGluX2J5dGUpOwotCQl9Ci0JfQotCV9QeVN0cmluZ19SZXNpemUoJnJ2LCAob3V0X2RhdGEgLQotCQkJICAgICAgICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpKSk7Ci0JcmV0dXJuIHJ2OworICAgICAgICBpZiAoaW5fYnl0ZSA9PSBSVU5DSEFSKSB7CisgICAgICAgICAgICBJTkJZVEUoaW5fcmVwZWF0KTsKKyAgICAgICAgICAgIGlmICggaW5fcmVwZWF0ID09IDAgKSB7CisgICAgICAgICAgICAgICAgLyogSnVzdCBhbiBlc2NhcGVkIFJVTkNIQVIgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICBPVVRCWVRFKFJVTkNIQVIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBQaWNrIHVwIHZhbHVlIGFuZCBvdXRwdXQgYSBzZXF1ZW5jZSBvZiBpdCAqLworICAgICAgICAgICAgICAgIGluX2J5dGUgPSBvdXRfZGF0YVstMV07CisgICAgICAgICAgICAgICAgd2hpbGUgKCAtLWluX3JlcGVhdCA+IDAgKQorICAgICAgICAgICAgICAgICAgICBPVVRCWVRFKGluX2J5dGUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogTm9ybWFsIGJ5dGUgKi8KKyAgICAgICAgICAgIE9VVEJZVEUoaW5fYnl0ZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgX1B5U3RyaW5nX1Jlc2l6ZSgmcnYsIChvdXRfZGF0YSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KSkpOworICAgIHJldHVybiBydjsKIH0KIAogUHlEb2NfU1RSVkFSKGRvY19jcmNfaHF4LApAQCAtNzY0LDE4ICs3NjQsMTggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBiaW5hc2NpaV9jcmNfaHF4KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQl1bnNpZ25lZCBjaGFyICpiaW5fZGF0YTsKLQl1bnNpZ25lZCBpbnQgY3JjOwotCVB5X3NzaXplX3QgbGVuOworICAgIHVuc2lnbmVkIGNoYXIgKmJpbl9kYXRhOworICAgIHVuc2lnbmVkIGludCBjcmM7CisgICAgUHlfc3NpemVfdCBsZW47CiAKLQlpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI2k6Y3JjX2hxeCIsICZiaW5fZGF0YSwgJmxlbiwgJmNyYykgKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI2k6Y3JjX2hxeCIsICZiaW5fZGF0YSwgJmxlbiwgJmNyYykgKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXdoaWxlKGxlbi0tID4gMCkgewotCQljcmM9KChjcmM8PDgpJjB4ZmYwMCleY3JjdGFiX2hxeFsoKGNyYz4+OCkmMHhmZileKmJpbl9kYXRhKytdOwotCX0KKyAgICB3aGlsZShsZW4tLSA+IDApIHsKKyAgICAgICAgY3JjPSgoY3JjPDw4KSYweGZmMDApXmNyY3RhYl9ocXhbKChjcmM+PjgpJjB4ZmYpXipiaW5fZGF0YSsrXTsKKyAgICB9CiAKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIGNyYyk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLCBjcmMpOwogfQogCiBQeURvY19TVFJWQVIoZG9jX2NyYzMyLApAQCAtNzkyLDcgKzc5Miw3IEBACiAgICAgaW50IHNpZ25lZF92YWw7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjfEk6Y3JjMzIiLCAmYnVmLCAmbGVuLCAmY3JjMzJ2YWwpKQotCXJldHVybiBOVUxMOworICAgIHJldHVybiBOVUxMOwogICAgIC8qIEluIFB5dGhvbiAyLnggd2UgcmV0dXJuIGEgc2lnbmVkIGludGVnZXIgcmVnYXJkbGVzcyBvZiBuYXRpdmUgcGxhdGZvcm0KICAgICAgKiBsb25nIHNpemUgKHRoZSAzMmJpdCB1bnNpZ25lZCBsb25nIGlzIHRyZWF0ZWQgYXMgMzItYml0IHNpZ25lZCBhbmQgc2lnbgogICAgICAqIGV4dGVuZGVkIGludG8gYSA2NC1iaXQgbG9uZyBpbnNpZGUgdGhlIGludGVnZXIgb2JqZWN0KS4gIDMuMCBkb2VzIHRoZQpAQCAtOTIyLDIxICs5MjIsMjEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBiaW5hc2NpaV9jcmMzMihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7IC8qIEJ5IEppbSBBaGxzdHJvbTsgQWxsIHJpZ2h0cyB0cmFuc2ZlcnJlZCB0byBDTlJJICovCi0JdW5zaWduZWQgY2hhciAqYmluX2RhdGE7Ci0JdW5zaWduZWQgaW50IGNyYyA9IDBVOwkvKiBpbml0aWFsIHZhbHVlIG9mIENSQyAqLwotCVB5X3NzaXplX3QgbGVuOwotCWludCByZXN1bHQ7CisgICAgdW5zaWduZWQgY2hhciAqYmluX2RhdGE7CisgICAgdW5zaWduZWQgaW50IGNyYyA9IDBVOyAgICAgIC8qIGluaXRpYWwgdmFsdWUgb2YgQ1JDICovCisgICAgUHlfc3NpemVfdCBsZW47CisgICAgaW50IHJlc3VsdDsKIAotCWlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjfEk6Y3JjMzIiLCAmYmluX2RhdGEsICZsZW4sICZjcmMpICkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyN8STpjcmMzMiIsICZiaW5fZGF0YSwgJmxlbiwgJmNyYykgKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWNyYyA9IH4gY3JjOwotCXdoaWxlIChsZW4tLSA+IDApCi0JCWNyYyA9IGNyY18zMl90YWJbKGNyYyBeICpiaW5fZGF0YSsrKSAmIDB4ZmZVXSBeIChjcmMgPj4gOCk7Ci0JCS8qIE5vdGU6ICAoY3JjID4+IDgpIE1VU1QgemVybyBmaWxsIG9uIGxlZnQgKi8KKyAgICBjcmMgPSB+IGNyYzsKKyAgICB3aGlsZSAobGVuLS0gPiAwKQorICAgICAgICBjcmMgPSBjcmNfMzJfdGFiWyhjcmMgXiAqYmluX2RhdGErKykgJiAweGZmVV0gXiAoY3JjID4+IDgpOworICAgICAgICAvKiBOb3RlOiAgKGNyYyA+PiA4KSBNVVNUIHplcm8gZmlsbCBvbiBsZWZ0ICovCiAKLQlyZXN1bHQgPSAoaW50KShjcmMgXiAweEZGRkZGRkZGVSk7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKHJlc3VsdCk7CisgICAgcmVzdWx0ID0gKGludCkoY3JjIF4gMHhGRkZGRkZGRlUpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhyZXN1bHQpOwogfQogI2VuZGlmICAvKiBVU0VfWkxJQl9DUkMzMiAqLwogCkBAIC05NDQsNDEgKzk0NCw0MSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGJpbmFzY2lpX2hleGxpZnkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIqIGFyZ2J1ZjsKLQlQeV9zc2l6ZV90IGFyZ2xlbjsKLQlQeU9iamVjdCAqcmV0dmFsOwotCWNoYXIqIHJldGJ1ZjsKLQlQeV9zc2l6ZV90IGksIGo7CisgICAgY2hhciogYXJnYnVmOworICAgIFB5X3NzaXplX3QgYXJnbGVuOworICAgIFB5T2JqZWN0ICpyZXR2YWw7CisgICAgY2hhciogcmV0YnVmOworICAgIFB5X3NzaXplX3QgaSwgajsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyM6YjJhX2hleCIsICZhcmdidWYsICZhcmdsZW4pKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjOmIyYV9oZXgiLCAmYXJnYnVmLCAmYXJnbGVuKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlhc3NlcnQoYXJnbGVuID49IDApOwotCWlmIChhcmdsZW4gPiBQWV9TU0laRV9UX01BWCAvIDIpCi0JCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIGFzc2VydChhcmdsZW4gPj0gMCk7CisgICAgaWYgKGFyZ2xlbiA+IFBZX1NTSVpFX1RfTUFYIC8gMikKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CiAKLQlyZXR2YWwgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBhcmdsZW4qMik7Ci0JaWYgKCFyZXR2YWwpCi0JCXJldHVybiBOVUxMOwotCXJldGJ1ZiA9IFB5U3RyaW5nX0FzU3RyaW5nKHJldHZhbCk7Ci0JaWYgKCFyZXRidWYpCi0JCWdvdG8gZmluYWxseTsKKyAgICByZXR2YWwgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBhcmdsZW4qMik7CisgICAgaWYgKCFyZXR2YWwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldGJ1ZiA9IFB5U3RyaW5nX0FzU3RyaW5nKHJldHZhbCk7CisgICAgaWYgKCFyZXRidWYpCisgICAgICAgIGdvdG8gZmluYWxseTsKIAotCS8qIG1ha2UgaGV4IHZlcnNpb24gb2Ygc3RyaW5nLCB0YWtlbiBmcm9tIHNoYW1vZHVsZS5jICovCi0JZm9yIChpPWo9MDsgaSA8IGFyZ2xlbjsgaSsrKSB7Ci0JCWNoYXIgYzsKLQkJYyA9IChhcmdidWZbaV0gPj4gNCkgJiAweGY7Ci0JCWMgPSAoYz45KSA/IGMrJ2EnLTEwIDogYyArICcwJzsKLQkJcmV0YnVmW2orK10gPSBjOwotCQljID0gYXJnYnVmW2ldICYgMHhmOwotCQljID0gKGM+OSkgPyBjKydhJy0xMCA6IGMgKyAnMCc7Ci0JCXJldGJ1ZltqKytdID0gYzsKLQl9Ci0JcmV0dXJuIHJldHZhbDsKKyAgICAvKiBtYWtlIGhleCB2ZXJzaW9uIG9mIHN0cmluZywgdGFrZW4gZnJvbSBzaGFtb2R1bGUuYyAqLworICAgIGZvciAoaT1qPTA7IGkgPCBhcmdsZW47IGkrKykgeworICAgICAgICBjaGFyIGM7CisgICAgICAgIGMgPSAoYXJnYnVmW2ldID4+IDQpICYgMHhmOworICAgICAgICBjID0gKGM+OSkgPyBjKydhJy0xMCA6IGMgKyAnMCc7CisgICAgICAgIHJldGJ1ZltqKytdID0gYzsKKyAgICAgICAgYyA9IGFyZ2J1ZltpXSAmIDB4ZjsKKyAgICAgICAgYyA9IChjPjkpID8gYysnYSctMTAgOiBjICsgJzAnOworICAgICAgICByZXRidWZbaisrXSA9IGM7CisgICAgfQorICAgIHJldHVybiByZXR2YWw7CiAKICAgZmluYWxseToKLQlQeV9ERUNSRUYocmV0dmFsKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeV9ERUNSRUYocmV0dmFsKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogUHlEb2NfU1RSVkFSKGRvY19oZXhsaWZ5LApAQCAtOTkwLDYzICs5OTAsNjMgQEAKIHN0YXRpYyBpbnQKIHRvX2ludChpbnQgYykKIHsKLQlpZiAoaXNkaWdpdChjKSkKLQkJcmV0dXJuIGMgLSAnMCc7Ci0JZWxzZSB7Ci0JCWlmIChpc3VwcGVyKGMpKQotCQkJYyA9IHRvbG93ZXIoYyk7Ci0JCWlmIChjID49ICdhJyAmJiBjIDw9ICdmJykKLQkJCXJldHVybiBjIC0gJ2EnICsgMTA7Ci0JfQotCXJldHVybiAtMTsKKyAgICBpZiAoaXNkaWdpdChjKSkKKyAgICAgICAgcmV0dXJuIGMgLSAnMCc7CisgICAgZWxzZSB7CisgICAgICAgIGlmIChpc3VwcGVyKGMpKQorICAgICAgICAgICAgYyA9IHRvbG93ZXIoYyk7CisgICAgICAgIGlmIChjID49ICdhJyAmJiBjIDw9ICdmJykKKyAgICAgICAgICAgIHJldHVybiBjIC0gJ2EnICsgMTA7CisgICAgfQorICAgIHJldHVybiAtMTsKIH0KIAogCiBzdGF0aWMgUHlPYmplY3QgKgogYmluYXNjaWlfdW5oZXhsaWZ5KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyKiBhcmdidWY7Ci0JUHlfc3NpemVfdCBhcmdsZW47Ci0JUHlPYmplY3QgKnJldHZhbDsKLQljaGFyKiByZXRidWY7Ci0JUHlfc3NpemVfdCBpLCBqOworICAgIGNoYXIqIGFyZ2J1ZjsKKyAgICBQeV9zc2l6ZV90IGFyZ2xlbjsKKyAgICBQeU9iamVjdCAqcmV0dmFsOworICAgIGNoYXIqIHJldGJ1ZjsKKyAgICBQeV9zc2l6ZV90IGksIGo7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjOmEyYl9oZXgiLCAmYXJnYnVmLCAmYXJnbGVuKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIzphMmJfaGV4IiwgJmFyZ2J1ZiwgJmFyZ2xlbikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JYXNzZXJ0KGFyZ2xlbiA+PSAwKTsKKyAgICBhc3NlcnQoYXJnbGVuID49IDApOwogCi0JLyogWFhYIFdoYXQgc2hvdWxkIHdlIGRvIGFib3V0IHN0cmluZ3Mgd2l0aCBhbiBvZGQgbGVuZ3RoPyAgU2hvdWxkCi0JICogd2UgYWRkIGFuIGltcGxpY2l0IGxlYWRpbmcgemVybywgb3IgYSB0cmFpbGluZyB6ZXJvPyAgRm9yIG5vdywKLQkgKiByYWlzZSBhbiBleGNlcHRpb24uCi0JICovCi0JaWYgKGFyZ2xlbiAlIDIpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIk9kZC1sZW5ndGggc3RyaW5nIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICAvKiBYWFggV2hhdCBzaG91bGQgd2UgZG8gYWJvdXQgc3RyaW5ncyB3aXRoIGFuIG9kZCBsZW5ndGg/ICBTaG91bGQKKyAgICAgKiB3ZSBhZGQgYW4gaW1wbGljaXQgbGVhZGluZyB6ZXJvLCBvciBhIHRyYWlsaW5nIHplcm8/ICBGb3Igbm93LAorICAgICAqIHJhaXNlIGFuIGV4Y2VwdGlvbi4KKyAgICAgKi8KKyAgICBpZiAoYXJnbGVuICUgMikgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiT2RkLWxlbmd0aCBzdHJpbmciKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JcmV0dmFsID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgKGFyZ2xlbi8yKSk7Ci0JaWYgKCFyZXR2YWwpCi0JCXJldHVybiBOVUxMOwotCXJldGJ1ZiA9IFB5U3RyaW5nX0FzU3RyaW5nKHJldHZhbCk7Ci0JaWYgKCFyZXRidWYpCi0JCWdvdG8gZmluYWxseTsKKyAgICByZXR2YWwgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCAoYXJnbGVuLzIpKTsKKyAgICBpZiAoIXJldHZhbCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0YnVmID0gUHlTdHJpbmdfQXNTdHJpbmcocmV0dmFsKTsKKyAgICBpZiAoIXJldGJ1ZikKKyAgICAgICAgZ290byBmaW5hbGx5OwogCi0JZm9yIChpPWo9MDsgaSA8IGFyZ2xlbjsgaSArPSAyKSB7Ci0JCWludCB0b3AgPSB0b19pbnQoUHlfQ0hBUk1BU0soYXJnYnVmW2ldKSk7Ci0JCWludCBib3QgPSB0b19pbnQoUHlfQ0hBUk1BU0soYXJnYnVmW2krMV0pKTsKLQkJaWYgKHRvcCA9PSAtMSB8fCBib3QgPT0gLTEpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJCSJOb24taGV4YWRlY2ltYWwgZGlnaXQgZm91bmQiKTsKLQkJCWdvdG8gZmluYWxseTsKLQkJfQotCQlyZXRidWZbaisrXSA9ICh0b3AgPDwgNCkgKyBib3Q7Ci0JfQotCXJldHVybiByZXR2YWw7CisgICAgZm9yIChpPWo9MDsgaSA8IGFyZ2xlbjsgaSArPSAyKSB7CisgICAgICAgIGludCB0b3AgPSB0b19pbnQoUHlfQ0hBUk1BU0soYXJnYnVmW2ldKSk7CisgICAgICAgIGludCBib3QgPSB0b19pbnQoUHlfQ0hBUk1BU0soYXJnYnVmW2krMV0pKTsKKyAgICAgICAgaWYgKHRvcCA9PSAtMSB8fCBib3QgPT0gLTEpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vbi1oZXhhZGVjaW1hbCBkaWdpdCBmb3VuZCIpOworICAgICAgICAgICAgZ290byBmaW5hbGx5OworICAgICAgICB9CisgICAgICAgIHJldGJ1ZltqKytdID0gKHRvcCA8PCA0KSArIGJvdDsKKyAgICB9CisgICAgcmV0dXJuIHJldHZhbDsKIAogICBmaW5hbGx5OgotCVB5X0RFQ1JFRihyZXR2YWwpOwotCXJldHVybiBOVUxMOworICAgIFB5X0RFQ1JFRihyZXR2YWwpOworICAgIHJldHVybiBOVUxMOwogfQogCiBQeURvY19TVFJWQVIoZG9jX3VuaGV4bGlmeSwKQEAgLTEwNzUsOTAgKzEwNzUsOTAgQEAKIHN0YXRpYyBQeU9iamVjdCoKIGJpbmFzY2lpX2EyYl9xcChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7Ci0JUHlfc3NpemVfdCBpbiwgb3V0OwotCWNoYXIgY2g7Ci0JdW5zaWduZWQgY2hhciAqZGF0YSwgKm9kYXRhOwotCVB5X3NzaXplX3QgZGF0YWxlbiA9IDA7Ci0JUHlPYmplY3QgKnJ2OwotCXN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsiZGF0YSIsICJoZWFkZXIiLCBOVUxMfTsKLQlpbnQgaGVhZGVyID0gMDsKKyAgICBQeV9zc2l6ZV90IGluLCBvdXQ7CisgICAgY2hhciBjaDsKKyAgICB1bnNpZ25lZCBjaGFyICpkYXRhLCAqb2RhdGE7CisgICAgUHlfc3NpemVfdCBkYXRhbGVuID0gMDsKKyAgICBQeU9iamVjdCAqcnY7CisgICAgc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJkYXRhIiwgImhlYWRlciIsIE5VTEx9OworICAgIGludCBoZWFkZXIgPSAwOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAicyN8aSIsIGt3bGlzdCwgJmRhdGEsCi0JICAgICAgJmRhdGFsZW4sICZoZWFkZXIpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJzI3xpIiwga3dsaXN0LCAmZGF0YSwKKyAgICAgICAgICAmZGF0YWxlbiwgJmhlYWRlcikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JLyogV2UgYWxsb2NhdGUgdGhlIG91dHB1dCBzYW1lIHNpemUgYXMgaW5wdXQsIHRoaXMgaXMgb3ZlcmtpbGwuCi0JICogVGhlIHByZXZpb3VzIGltcGxlbWVudGF0aW9uIHVzZWQgY2FsbG9jKCkgc28gd2UnbGwgemVybyBvdXQgdGhlCi0JICogbWVtb3J5IGhlcmUgdG9vLCBzaW5jZSBQeU1lbV9NYWxsb2MoKSBkb2VzIG5vdCBndWFyYW50ZWUgdGhhdC4KLQkgKi8KLQlvZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIFB5TWVtX01hbGxvYyhkYXRhbGVuKTsKLQlpZiAob2RhdGEgPT0gTlVMTCkgewotCQlQeUVycl9Ob01lbW9yeSgpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JbWVtc2V0KG9kYXRhLCAwLCBkYXRhbGVuKTsKKyAgICAvKiBXZSBhbGxvY2F0ZSB0aGUgb3V0cHV0IHNhbWUgc2l6ZSBhcyBpbnB1dCwgdGhpcyBpcyBvdmVya2lsbC4KKyAgICAgKiBUaGUgcHJldmlvdXMgaW1wbGVtZW50YXRpb24gdXNlZCBjYWxsb2MoKSBzbyB3ZSdsbCB6ZXJvIG91dCB0aGUKKyAgICAgKiBtZW1vcnkgaGVyZSB0b28sIHNpbmNlIFB5TWVtX01hbGxvYygpIGRvZXMgbm90IGd1YXJhbnRlZSB0aGF0LgorICAgICAqLworICAgIG9kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgUHlNZW1fTWFsbG9jKGRhdGFsZW4pOworICAgIGlmIChvZGF0YSA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBtZW1zZXQob2RhdGEsIDAsIGRhdGFsZW4pOwogCi0JaW4gPSBvdXQgPSAwOwotCXdoaWxlIChpbiA8IGRhdGFsZW4pIHsKLQkJaWYgKGRhdGFbaW5dID09ICc9JykgewotCQkJaW4rKzsKLQkJCWlmIChpbiA+PSBkYXRhbGVuKSBicmVhazsKLQkJCS8qIFNvZnQgbGluZSBicmVha3MgKi8KLQkJCWlmICgoZGF0YVtpbl0gPT0gJ1xuJykgfHwgKGRhdGFbaW5dID09ICdccicpKSB7Ci0JCQkJaWYgKGRhdGFbaW5dICE9ICdcbicpIHsKLQkJCQkJd2hpbGUgKGluIDwgZGF0YWxlbiAmJiBkYXRhW2luXSAhPSAnXG4nKSBpbisrOwotCQkJCX0KLQkJCQlpZiAoaW4gPCBkYXRhbGVuKSBpbisrOwotCQkJfQotCQkJZWxzZSBpZiAoZGF0YVtpbl0gPT0gJz0nKSB7Ci0JCQkJLyogYnJva2VuIGNhc2UgZnJvbSBicm9rZW4gcHl0aG9uIHFwICovCi0JCQkJb2RhdGFbb3V0KytdID0gJz0nOwotCQkJCWluKys7Ci0JCQl9Ci0JCQllbHNlIGlmICgoKGRhdGFbaW5dID49ICdBJyAmJiBkYXRhW2luXSA8PSAnRicpIHx8Ci0JCQkgICAgICAgICAgKGRhdGFbaW5dID49ICdhJyAmJiBkYXRhW2luXSA8PSAnZicpIHx8Ci0JCQkJICAoZGF0YVtpbl0gPj0gJzAnICYmIGRhdGFbaW5dIDw9ICc5JykpICYmCi0JCQkgICAgICAgICAoKGRhdGFbaW4rMV0gPj0gJ0EnICYmIGRhdGFbaW4rMV0gPD0gJ0YnKSB8fAotCQkJCSAgKGRhdGFbaW4rMV0gPj0gJ2EnICYmIGRhdGFbaW4rMV0gPD0gJ2YnKSB8fAotCQkJCSAgKGRhdGFbaW4rMV0gPj0gJzAnICYmIGRhdGFbaW4rMV0gPD0gJzknKSkpIHsKLQkJCQkvKiBoZXh2YWwgKi8KLQkJCQljaCA9IGhleHZhbChkYXRhW2luXSkgPDwgNDsKLQkJCQlpbisrOwotCQkJCWNoIHw9IGhleHZhbChkYXRhW2luXSk7Ci0JCQkJaW4rKzsKLQkJCQlvZGF0YVtvdXQrK10gPSBjaDsKLQkJCX0KLQkJCWVsc2UgewotCQkJICBvZGF0YVtvdXQrK10gPSAnPSc7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoaGVhZGVyICYmIGRhdGFbaW5dID09ICdfJykgewotCQkJb2RhdGFbb3V0KytdID0gJyAnOwotCQkJaW4rKzsKLQkJfQotCQllbHNlIHsKLQkJCW9kYXRhW291dF0gPSBkYXRhW2luXTsKLQkJCWluKys7Ci0JCQlvdXQrKzsKLQkJfQotCX0KLQlpZiAoKHJ2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilvZGF0YSwgb3V0KSkgPT0gTlVMTCkgewotCQlQeU1lbV9GcmVlKG9kYXRhKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5TWVtX0ZyZWUob2RhdGEpOwotCXJldHVybiBydjsKKyAgICBpbiA9IG91dCA9IDA7CisgICAgd2hpbGUgKGluIDwgZGF0YWxlbikgeworICAgICAgICBpZiAoZGF0YVtpbl0gPT0gJz0nKSB7CisgICAgICAgICAgICBpbisrOworICAgICAgICAgICAgaWYgKGluID49IGRhdGFsZW4pIGJyZWFrOworICAgICAgICAgICAgLyogU29mdCBsaW5lIGJyZWFrcyAqLworICAgICAgICAgICAgaWYgKChkYXRhW2luXSA9PSAnXG4nKSB8fCAoZGF0YVtpbl0gPT0gJ1xyJykpIHsKKyAgICAgICAgICAgICAgICBpZiAoZGF0YVtpbl0gIT0gJ1xuJykgeworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaW4gPCBkYXRhbGVuICYmIGRhdGFbaW5dICE9ICdcbicpIGluKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChpbiA8IGRhdGFsZW4pIGluKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChkYXRhW2luXSA9PSAnPScpIHsKKyAgICAgICAgICAgICAgICAvKiBicm9rZW4gY2FzZSBmcm9tIGJyb2tlbiBweXRob24gcXAgKi8KKyAgICAgICAgICAgICAgICBvZGF0YVtvdXQrK10gPSAnPSc7CisgICAgICAgICAgICAgICAgaW4rKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCgoZGF0YVtpbl0gPj0gJ0EnICYmIGRhdGFbaW5dIDw9ICdGJykgfHwKKyAgICAgICAgICAgICAgICAgICAgICAoZGF0YVtpbl0gPj0gJ2EnICYmIGRhdGFbaW5dIDw9ICdmJykgfHwKKyAgICAgICAgICAgICAgICAgICAgICAoZGF0YVtpbl0gPj0gJzAnICYmIGRhdGFbaW5dIDw9ICc5JykpICYmCisgICAgICAgICAgICAgICAgICAgICAoKGRhdGFbaW4rMV0gPj0gJ0EnICYmIGRhdGFbaW4rMV0gPD0gJ0YnKSB8fAorICAgICAgICAgICAgICAgICAgICAgIChkYXRhW2luKzFdID49ICdhJyAmJiBkYXRhW2luKzFdIDw9ICdmJykgfHwKKyAgICAgICAgICAgICAgICAgICAgICAoZGF0YVtpbisxXSA+PSAnMCcgJiYgZGF0YVtpbisxXSA8PSAnOScpKSkgeworICAgICAgICAgICAgICAgIC8qIGhleHZhbCAqLworICAgICAgICAgICAgICAgIGNoID0gaGV4dmFsKGRhdGFbaW5dKSA8PCA0OworICAgICAgICAgICAgICAgIGluKys7CisgICAgICAgICAgICAgICAgY2ggfD0gaGV4dmFsKGRhdGFbaW5dKTsKKyAgICAgICAgICAgICAgICBpbisrOworICAgICAgICAgICAgICAgIG9kYXRhW291dCsrXSA9IGNoOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgIG9kYXRhW291dCsrXSA9ICc9JzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChoZWFkZXIgJiYgZGF0YVtpbl0gPT0gJ18nKSB7CisgICAgICAgICAgICBvZGF0YVtvdXQrK10gPSAnICc7CisgICAgICAgICAgICBpbisrOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgb2RhdGFbb3V0XSA9IGRhdGFbaW5dOworICAgICAgICAgICAgaW4rKzsKKyAgICAgICAgICAgIG91dCsrOworICAgICAgICB9CisgICAgfQorICAgIGlmICgocnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKW9kYXRhLCBvdXQpKSA9PSBOVUxMKSB7CisgICAgICAgIFB5TWVtX0ZyZWUob2RhdGEpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlNZW1fRnJlZShvZGF0YSk7CisgICAgcmV0dXJuIHJ2OwogfQogCiBzdGF0aWMgaW50CiB0b19oZXggKHVuc2lnbmVkIGNoYXIgY2gsIHVuc2lnbmVkIGNoYXIgKnMpCiB7Ci0JdW5zaWduZWQgaW50IHV2YWx1ZSA9IGNoOworICAgIHVuc2lnbmVkIGludCB1dmFsdWUgPSBjaDsKIAotCXNbMV0gPSAiMDEyMzQ1Njc4OUFCQ0RFRiJbdXZhbHVlICUgMTZdOwotCXV2YWx1ZSA9ICh1dmFsdWUgLyAxNik7Ci0Jc1swXSA9ICIwMTIzNDU2Nzg5QUJDREVGIlt1dmFsdWUgJSAxNl07Ci0JcmV0dXJuIDA7CisgICAgc1sxXSA9ICIwMTIzNDU2Nzg5QUJDREVGIlt1dmFsdWUgJSAxNl07CisgICAgdXZhbHVlID0gKHV2YWx1ZSAvIDE2KTsKKyAgICBzWzBdID0gIjAxMjM0NTY3ODlBQkNERUYiW3V2YWx1ZSAlIDE2XTsKKyAgICByZXR1cm4gMDsKIH0KIAogUHlEb2NfU1RSVkFSKGRvY19iMmFfcXAsCkBAIC0xMTc1LDIwNCArMTE3NSwyMDQgQEAKIHN0YXRpYyBQeU9iamVjdCoKIGJpbmFzY2lpX2IyYV9xcCAoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewotCVB5X3NzaXplX3QgaW4sIG91dDsKLQl1bnNpZ25lZCBjaGFyICpkYXRhLCAqb2RhdGE7Ci0JUHlfc3NpemVfdCBkYXRhbGVuID0gMCwgb2RhdGFsZW4gPSAwOwotCVB5T2JqZWN0ICpydjsKLQl1bnNpZ25lZCBpbnQgbGluZWxlbiA9IDA7Ci0Jc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJkYXRhIiwgInF1b3RldGFicyIsICJpc3RleHQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImhlYWRlciIsIE5VTEx9OwotCWludCBpc3RleHQgPSAxOwotCWludCBxdW90ZXRhYnMgPSAwOwotCWludCBoZWFkZXIgPSAwOwotCXVuc2lnbmVkIGNoYXIgY2g7Ci0JaW50IGNybGYgPSAwOwotCXVuc2lnbmVkIGNoYXIgKnA7CisgICAgUHlfc3NpemVfdCBpbiwgb3V0OworICAgIHVuc2lnbmVkIGNoYXIgKmRhdGEsICpvZGF0YTsKKyAgICBQeV9zc2l6ZV90IGRhdGFsZW4gPSAwLCBvZGF0YWxlbiA9IDA7CisgICAgUHlPYmplY3QgKnJ2OworICAgIHVuc2lnbmVkIGludCBsaW5lbGVuID0gMDsKKyAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7ImRhdGEiLCAicXVvdGV0YWJzIiwgImlzdGV4dCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJoZWFkZXIiLCBOVUxMfTsKKyAgICBpbnQgaXN0ZXh0ID0gMTsKKyAgICBpbnQgcXVvdGV0YWJzID0gMDsKKyAgICBpbnQgaGVhZGVyID0gMDsKKyAgICB1bnNpZ25lZCBjaGFyIGNoOworICAgIGludCBjcmxmID0gMDsKKyAgICB1bnNpZ25lZCBjaGFyICpwOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAicyN8aWlpIiwga3dsaXN0LCAmZGF0YSwKLQkgICAgICAmZGF0YWxlbiwgJnF1b3RldGFicywgJmlzdGV4dCwgJmhlYWRlcikpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInMjfGlpaSIsIGt3bGlzdCwgJmRhdGEsCisgICAgICAgICAgJmRhdGFsZW4sICZxdW90ZXRhYnMsICZpc3RleHQsICZoZWFkZXIpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCS8qIFNlZSBpZiB0aGlzIHN0cmluZyBpcyB1c2luZyBDUkxGIGxpbmUgZW5kcyAqLwotCS8qIFhYWDogdGhpcyBmdW5jdGlvbiBoYXMgdGhlIHNpZGUgZWZmZWN0IG9mIGNvbnZlcnRpbmcgYWxsIG9mCi0JICogdGhlIGVuZCBvZiBsaW5lcyB0byBiZSB0aGUgc2FtZSBkZXBlbmRpbmcgb24gdGhpcyBkZXRlY3Rpb24KLQkgKiBoZXJlICovCi0JcCA9ICh1bnNpZ25lZCBjaGFyICopIG1lbWNocihkYXRhLCAnXG4nLCBkYXRhbGVuKTsKLQlpZiAoKHAgIT0gTlVMTCkgJiYgKHAgPiBkYXRhKSAmJiAoKihwLTEpID09ICdccicpKQotCQljcmxmID0gMTsKKyAgICAvKiBTZWUgaWYgdGhpcyBzdHJpbmcgaXMgdXNpbmcgQ1JMRiBsaW5lIGVuZHMgKi8KKyAgICAvKiBYWFg6IHRoaXMgZnVuY3Rpb24gaGFzIHRoZSBzaWRlIGVmZmVjdCBvZiBjb252ZXJ0aW5nIGFsbCBvZgorICAgICAqIHRoZSBlbmQgb2YgbGluZXMgdG8gYmUgdGhlIHNhbWUgZGVwZW5kaW5nIG9uIHRoaXMgZGV0ZWN0aW9uCisgICAgICogaGVyZSAqLworICAgIHAgPSAodW5zaWduZWQgY2hhciAqKSBtZW1jaHIoZGF0YSwgJ1xuJywgZGF0YWxlbik7CisgICAgaWYgKChwICE9IE5VTEwpICYmIChwID4gZGF0YSkgJiYgKCoocC0xKSA9PSAnXHInKSkKKyAgICAgICAgY3JsZiA9IDE7CiAKLQkvKiBGaXJzdCwgc2NhbiB0byBzZWUgaG93IG1hbnkgY2hhcmFjdGVycyBuZWVkIHRvIGJlIGVuY29kZWQgKi8KLQlpbiA9IDA7Ci0Jd2hpbGUgKGluIDwgZGF0YWxlbikgewotCQlpZiAoKGRhdGFbaW5dID4gMTI2KSB8fAotCQkgICAgKGRhdGFbaW5dID09ICc9JykgfHwKLQkJICAgIChoZWFkZXIgJiYgZGF0YVtpbl0gPT0gJ18nKSB8fAotCQkgICAgKChkYXRhW2luXSA9PSAnLicpICYmIChsaW5lbGVuID09IDApICYmCi0JCSAgICAgKGRhdGFbaW4rMV0gPT0gJ1xuJyB8fCBkYXRhW2luKzFdID09ICdccicgfHwgZGF0YVtpbisxXSA9PSAwKSkgfHwKLQkJICAgICghaXN0ZXh0ICYmICgoZGF0YVtpbl0gPT0gJ1xyJykgfHwgKGRhdGFbaW5dID09ICdcbicpKSkgfHwKLQkJICAgICgoZGF0YVtpbl0gPT0gJ1x0JyB8fCBkYXRhW2luXSA9PSAnICcpICYmIChpbiArIDEgPT0gZGF0YWxlbikpIHx8Ci0JCSAgICAoKGRhdGFbaW5dIDwgMzMpICYmCi0JCSAgICAgKGRhdGFbaW5dICE9ICdccicpICYmIChkYXRhW2luXSAhPSAnXG4nKSAmJgotCQkgICAgIChxdW90ZXRhYnMgfHwKLQkJICAgICAJKCFxdW90ZXRhYnMgJiYgKChkYXRhW2luXSAhPSAnXHQnKSAmJiAoZGF0YVtpbl0gIT0gJyAnKSkpKSkpCi0JCXsKLQkJCWlmICgobGluZWxlbiArIDMpID49IE1BWExJTkVTSVpFKSB7Ci0JCQkJbGluZWxlbiA9IDA7Ci0JCQkJaWYgKGNybGYpCi0JCQkJCW9kYXRhbGVuICs9IDM7Ci0JCQkJZWxzZQotCQkJCQlvZGF0YWxlbiArPSAyOwotCQkJfQotCQkJbGluZWxlbiArPSAzOwotCQkJb2RhdGFsZW4gKz0gMzsKLQkJCWluKys7Ci0JCX0KLQkJZWxzZSB7Ci0JCSAgCWlmIChpc3RleHQgJiYKLQkJCSAgICAoKGRhdGFbaW5dID09ICdcbicpIHx8Ci0JCQkgICAgICgoaW4rMSA8IGRhdGFsZW4pICYmIChkYXRhW2luXSA9PSAnXHInKSAmJgotCQkJICAgICAoZGF0YVtpbisxXSA9PSAnXG4nKSkpKQotCQkJewotCQkJICAJbGluZWxlbiA9IDA7Ci0JCQkJLyogUHJvdGVjdCBhZ2FpbnN0IHdoaXRlc3BhY2Ugb24gZW5kIG9mIGxpbmUgKi8KLQkJCQlpZiAoaW4gJiYgKChkYXRhW2luLTFdID09ICcgJykgfHwgKGRhdGFbaW4tMV0gPT0gJ1x0JykpKQotCQkJCQlvZGF0YWxlbiArPSAyOwotCQkJCWlmIChjcmxmKQotCQkJCQlvZGF0YWxlbiArPSAyOwotCQkJCWVsc2UKLQkJCQkJb2RhdGFsZW4gKz0gMTsKLQkJCQlpZiAoZGF0YVtpbl0gPT0gJ1xyJykKLQkJCQkJaW4gKz0gMjsKLQkJCQllbHNlCi0JCQkJCWluKys7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAoKGluICsgMSAhPSBkYXRhbGVuKSAmJgotCQkJCSAgICAoZGF0YVtpbisxXSAhPSAnXG4nKSAmJgotCQkJCSAgICAobGluZWxlbiArIDEpID49IE1BWExJTkVTSVpFKSB7Ci0JCQkJCWxpbmVsZW4gPSAwOwotCQkJCQlpZiAoY3JsZikKLQkJCQkJCW9kYXRhbGVuICs9IDM7Ci0JCQkJCWVsc2UKLQkJCQkJCW9kYXRhbGVuICs9IDI7Ci0JCQkJfQotCQkJCWxpbmVsZW4rKzsKLQkJCQlvZGF0YWxlbisrOwotCQkJCWluKys7Ci0JCQl9Ci0JCX0KLQl9CisgICAgLyogRmlyc3QsIHNjYW4gdG8gc2VlIGhvdyBtYW55IGNoYXJhY3RlcnMgbmVlZCB0byBiZSBlbmNvZGVkICovCisgICAgaW4gPSAwOworICAgIHdoaWxlIChpbiA8IGRhdGFsZW4pIHsKKyAgICAgICAgaWYgKChkYXRhW2luXSA+IDEyNikgfHwKKyAgICAgICAgICAgIChkYXRhW2luXSA9PSAnPScpIHx8CisgICAgICAgICAgICAoaGVhZGVyICYmIGRhdGFbaW5dID09ICdfJykgfHwKKyAgICAgICAgICAgICgoZGF0YVtpbl0gPT0gJy4nKSAmJiAobGluZWxlbiA9PSAwKSAmJgorICAgICAgICAgICAgIChkYXRhW2luKzFdID09ICdcbicgfHwgZGF0YVtpbisxXSA9PSAnXHInIHx8IGRhdGFbaW4rMV0gPT0gMCkpIHx8CisgICAgICAgICAgICAoIWlzdGV4dCAmJiAoKGRhdGFbaW5dID09ICdccicpIHx8IChkYXRhW2luXSA9PSAnXG4nKSkpIHx8CisgICAgICAgICAgICAoKGRhdGFbaW5dID09ICdcdCcgfHwgZGF0YVtpbl0gPT0gJyAnKSAmJiAoaW4gKyAxID09IGRhdGFsZW4pKSB8fAorICAgICAgICAgICAgKChkYXRhW2luXSA8IDMzKSAmJgorICAgICAgICAgICAgIChkYXRhW2luXSAhPSAnXHInKSAmJiAoZGF0YVtpbl0gIT0gJ1xuJykgJiYKKyAgICAgICAgICAgICAocXVvdGV0YWJzIHx8CisgICAgICAgICAgICAoIXF1b3RldGFicyAmJiAoKGRhdGFbaW5dICE9ICdcdCcpICYmIChkYXRhW2luXSAhPSAnICcpKSkpKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKChsaW5lbGVuICsgMykgPj0gTUFYTElORVNJWkUpIHsKKyAgICAgICAgICAgICAgICBsaW5lbGVuID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoY3JsZikKKyAgICAgICAgICAgICAgICAgICAgb2RhdGFsZW4gKz0gMzsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIG9kYXRhbGVuICs9IDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsaW5lbGVuICs9IDM7CisgICAgICAgICAgICBvZGF0YWxlbiArPSAzOworICAgICAgICAgICAgaW4rKzsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmIChpc3RleHQgJiYKKyAgICAgICAgICAgICAgICAoKGRhdGFbaW5dID09ICdcbicpIHx8CisgICAgICAgICAgICAgICAgICgoaW4rMSA8IGRhdGFsZW4pICYmIChkYXRhW2luXSA9PSAnXHInKSAmJgorICAgICAgICAgICAgICAgICAoZGF0YVtpbisxXSA9PSAnXG4nKSkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxpbmVsZW4gPSAwOworICAgICAgICAgICAgICAgIC8qIFByb3RlY3QgYWdhaW5zdCB3aGl0ZXNwYWNlIG9uIGVuZCBvZiBsaW5lICovCisgICAgICAgICAgICAgICAgaWYgKGluICYmICgoZGF0YVtpbi0xXSA9PSAnICcpIHx8IChkYXRhW2luLTFdID09ICdcdCcpKSkKKyAgICAgICAgICAgICAgICAgICAgb2RhdGFsZW4gKz0gMjsKKyAgICAgICAgICAgICAgICBpZiAoY3JsZikKKyAgICAgICAgICAgICAgICAgICAgb2RhdGFsZW4gKz0gMjsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIG9kYXRhbGVuICs9IDE7CisgICAgICAgICAgICAgICAgaWYgKGRhdGFbaW5dID09ICdccicpCisgICAgICAgICAgICAgICAgICAgIGluICs9IDI7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBpbisrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKChpbiArIDEgIT0gZGF0YWxlbikgJiYKKyAgICAgICAgICAgICAgICAgICAgKGRhdGFbaW4rMV0gIT0gJ1xuJykgJiYKKyAgICAgICAgICAgICAgICAgICAgKGxpbmVsZW4gKyAxKSA+PSBNQVhMSU5FU0laRSkgeworICAgICAgICAgICAgICAgICAgICBsaW5lbGVuID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNybGYpCisgICAgICAgICAgICAgICAgICAgICAgICBvZGF0YWxlbiArPSAzOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBvZGF0YWxlbiArPSAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsaW5lbGVuKys7CisgICAgICAgICAgICAgICAgb2RhdGFsZW4rKzsKKyAgICAgICAgICAgICAgICBpbisrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogCi0JLyogV2UgYWxsb2NhdGUgdGhlIG91dHB1dCBzYW1lIHNpemUgYXMgaW5wdXQsIHRoaXMgaXMgb3ZlcmtpbGwuCi0JICogVGhlIHByZXZpb3VzIGltcGxlbWVudGF0aW9uIHVzZWQgY2FsbG9jKCkgc28gd2UnbGwgemVybyBvdXQgdGhlCi0JICogbWVtb3J5IGhlcmUgdG9vLCBzaW5jZSBQeU1lbV9NYWxsb2MoKSBkb2VzIG5vdCBndWFyYW50ZWUgdGhhdC4KLQkgKi8KLQlvZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIFB5TWVtX01hbGxvYyhvZGF0YWxlbik7Ci0JaWYgKG9kYXRhID09IE5VTEwpIHsKLQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCW1lbXNldChvZGF0YSwgMCwgb2RhdGFsZW4pOworICAgIC8qIFdlIGFsbG9jYXRlIHRoZSBvdXRwdXQgc2FtZSBzaXplIGFzIGlucHV0LCB0aGlzIGlzIG92ZXJraWxsLgorICAgICAqIFRoZSBwcmV2aW91cyBpbXBsZW1lbnRhdGlvbiB1c2VkIGNhbGxvYygpIHNvIHdlJ2xsIHplcm8gb3V0IHRoZQorICAgICAqIG1lbW9yeSBoZXJlIHRvbywgc2luY2UgUHlNZW1fTWFsbG9jKCkgZG9lcyBub3QgZ3VhcmFudGVlIHRoYXQuCisgICAgICovCisgICAgb2RhdGEgPSAodW5zaWduZWQgY2hhciAqKSBQeU1lbV9NYWxsb2Mob2RhdGFsZW4pOworICAgIGlmIChvZGF0YSA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBtZW1zZXQob2RhdGEsIDAsIG9kYXRhbGVuKTsKIAotCWluID0gb3V0ID0gbGluZWxlbiA9IDA7Ci0Jd2hpbGUgKGluIDwgZGF0YWxlbikgewotCQlpZiAoKGRhdGFbaW5dID4gMTI2KSB8fAotCQkgICAgKGRhdGFbaW5dID09ICc9JykgfHwKLQkJICAgIChoZWFkZXIgJiYgZGF0YVtpbl0gPT0gJ18nKSB8fAotCQkgICAgKChkYXRhW2luXSA9PSAnLicpICYmIChsaW5lbGVuID09IDApICYmCi0JCSAgICAgKGRhdGFbaW4rMV0gPT0gJ1xuJyB8fCBkYXRhW2luKzFdID09ICdccicgfHwgZGF0YVtpbisxXSA9PSAwKSkgfHwKLQkJICAgICghaXN0ZXh0ICYmICgoZGF0YVtpbl0gPT0gJ1xyJykgfHwgKGRhdGFbaW5dID09ICdcbicpKSkgfHwKLQkJICAgICgoZGF0YVtpbl0gPT0gJ1x0JyB8fCBkYXRhW2luXSA9PSAnICcpICYmIChpbiArIDEgPT0gZGF0YWxlbikpIHx8Ci0JCSAgICAoKGRhdGFbaW5dIDwgMzMpICYmCi0JCSAgICAgKGRhdGFbaW5dICE9ICdccicpICYmIChkYXRhW2luXSAhPSAnXG4nKSAmJgotCQkgICAgIChxdW90ZXRhYnMgfHwKLQkJICAgICAJKCFxdW90ZXRhYnMgJiYgKChkYXRhW2luXSAhPSAnXHQnKSAmJiAoZGF0YVtpbl0gIT0gJyAnKSkpKSkpCi0JCXsKLQkJCWlmICgobGluZWxlbiArIDMgKT49IE1BWExJTkVTSVpFKSB7Ci0JCQkJb2RhdGFbb3V0KytdID0gJz0nOwotCQkJCWlmIChjcmxmKSBvZGF0YVtvdXQrK10gPSAnXHInOwotCQkJCW9kYXRhW291dCsrXSA9ICdcbic7Ci0JCQkJbGluZWxlbiA9IDA7Ci0JCQl9Ci0JCQlvZGF0YVtvdXQrK10gPSAnPSc7Ci0JCQl0b19oZXgoZGF0YVtpbl0sICZvZGF0YVtvdXRdKTsKLQkJCW91dCArPSAyOwotCQkJaW4rKzsKLQkJCWxpbmVsZW4gKz0gMzsKLQkJfQotCQllbHNlIHsKLQkJICAJaWYgKGlzdGV4dCAmJgotCQkJICAgICgoZGF0YVtpbl0gPT0gJ1xuJykgfHwKLQkJCSAgICAgKChpbisxIDwgZGF0YWxlbikgJiYgKGRhdGFbaW5dID09ICdccicpICYmCi0JCQkgICAgIChkYXRhW2luKzFdID09ICdcbicpKSkpCi0JCQl7Ci0JCQkgIAlsaW5lbGVuID0gMDsKLQkJCQkvKiBQcm90ZWN0IGFnYWluc3Qgd2hpdGVzcGFjZSBvbiBlbmQgb2YgbGluZSAqLwotCQkJCWlmIChvdXQgJiYgKChvZGF0YVtvdXQtMV0gPT0gJyAnKSB8fCAob2RhdGFbb3V0LTFdID09ICdcdCcpKSkgewotCQkJCQljaCA9IG9kYXRhW291dC0xXTsKLQkJCQkJb2RhdGFbb3V0LTFdID0gJz0nOwotCQkJCQl0b19oZXgoY2gsICZvZGF0YVtvdXRdKTsKLQkJCQkJb3V0ICs9IDI7Ci0JCQkJfQorICAgIGluID0gb3V0ID0gbGluZWxlbiA9IDA7CisgICAgd2hpbGUgKGluIDwgZGF0YWxlbikgeworICAgICAgICBpZiAoKGRhdGFbaW5dID4gMTI2KSB8fAorICAgICAgICAgICAgKGRhdGFbaW5dID09ICc9JykgfHwKKyAgICAgICAgICAgIChoZWFkZXIgJiYgZGF0YVtpbl0gPT0gJ18nKSB8fAorICAgICAgICAgICAgKChkYXRhW2luXSA9PSAnLicpICYmIChsaW5lbGVuID09IDApICYmCisgICAgICAgICAgICAgKGRhdGFbaW4rMV0gPT0gJ1xuJyB8fCBkYXRhW2luKzFdID09ICdccicgfHwgZGF0YVtpbisxXSA9PSAwKSkgfHwKKyAgICAgICAgICAgICghaXN0ZXh0ICYmICgoZGF0YVtpbl0gPT0gJ1xyJykgfHwgKGRhdGFbaW5dID09ICdcbicpKSkgfHwKKyAgICAgICAgICAgICgoZGF0YVtpbl0gPT0gJ1x0JyB8fCBkYXRhW2luXSA9PSAnICcpICYmIChpbiArIDEgPT0gZGF0YWxlbikpIHx8CisgICAgICAgICAgICAoKGRhdGFbaW5dIDwgMzMpICYmCisgICAgICAgICAgICAgKGRhdGFbaW5dICE9ICdccicpICYmIChkYXRhW2luXSAhPSAnXG4nKSAmJgorICAgICAgICAgICAgIChxdW90ZXRhYnMgfHwKKyAgICAgICAgICAgICghcXVvdGV0YWJzICYmICgoZGF0YVtpbl0gIT0gJ1x0JykgJiYgKGRhdGFbaW5dICE9ICcgJykpKSkpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKGxpbmVsZW4gKyAzICk+PSBNQVhMSU5FU0laRSkgeworICAgICAgICAgICAgICAgIG9kYXRhW291dCsrXSA9ICc9JzsKKyAgICAgICAgICAgICAgICBpZiAoY3JsZikgb2RhdGFbb3V0KytdID0gJ1xyJzsKKyAgICAgICAgICAgICAgICBvZGF0YVtvdXQrK10gPSAnXG4nOworICAgICAgICAgICAgICAgIGxpbmVsZW4gPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb2RhdGFbb3V0KytdID0gJz0nOworICAgICAgICAgICAgdG9faGV4KGRhdGFbaW5dLCAmb2RhdGFbb3V0XSk7CisgICAgICAgICAgICBvdXQgKz0gMjsKKyAgICAgICAgICAgIGluKys7CisgICAgICAgICAgICBsaW5lbGVuICs9IDM7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAoaXN0ZXh0ICYmCisgICAgICAgICAgICAgICAgKChkYXRhW2luXSA9PSAnXG4nKSB8fAorICAgICAgICAgICAgICAgICAoKGluKzEgPCBkYXRhbGVuKSAmJiAoZGF0YVtpbl0gPT0gJ1xyJykgJiYKKyAgICAgICAgICAgICAgICAgKGRhdGFbaW4rMV0gPT0gJ1xuJykpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsaW5lbGVuID0gMDsKKyAgICAgICAgICAgICAgICAvKiBQcm90ZWN0IGFnYWluc3Qgd2hpdGVzcGFjZSBvbiBlbmQgb2YgbGluZSAqLworICAgICAgICAgICAgICAgIGlmIChvdXQgJiYgKChvZGF0YVtvdXQtMV0gPT0gJyAnKSB8fCAob2RhdGFbb3V0LTFdID09ICdcdCcpKSkgeworICAgICAgICAgICAgICAgICAgICBjaCA9IG9kYXRhW291dC0xXTsKKyAgICAgICAgICAgICAgICAgICAgb2RhdGFbb3V0LTFdID0gJz0nOworICAgICAgICAgICAgICAgICAgICB0b19oZXgoY2gsICZvZGF0YVtvdXRdKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0ICs9IDI7CisgICAgICAgICAgICAgICAgfQogCi0JCQkJaWYgKGNybGYpIG9kYXRhW291dCsrXSA9ICdccic7Ci0JCQkJb2RhdGFbb3V0KytdID0gJ1xuJzsKLQkJCQlpZiAoZGF0YVtpbl0gPT0gJ1xyJykKLQkJCQkJaW4gKz0gMjsKLQkJCQllbHNlCi0JCQkJCWluKys7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAoKGluICsgMSAhPSBkYXRhbGVuKSAmJgotCQkJCSAgICAoZGF0YVtpbisxXSAhPSAnXG4nKSAmJgotCQkJCSAgICAobGluZWxlbiArIDEpID49IE1BWExJTkVTSVpFKSB7Ci0JCQkJCW9kYXRhW291dCsrXSA9ICc9JzsKLQkJCQkJaWYgKGNybGYpIG9kYXRhW291dCsrXSA9ICdccic7Ci0JCQkJCW9kYXRhW291dCsrXSA9ICdcbic7Ci0JCQkJCWxpbmVsZW4gPSAwOwotCQkJCX0KLQkJCQlsaW5lbGVuKys7Ci0JCQkJaWYgKGhlYWRlciAmJiBkYXRhW2luXSA9PSAnICcpIHsKLQkJCQkJb2RhdGFbb3V0KytdID0gJ18nOwotCQkJCQlpbisrOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJb2RhdGFbb3V0KytdID0gZGF0YVtpbisrXTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JaWYgKChydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopb2RhdGEsIG91dCkpID09IE5VTEwpIHsKLQkJUHlNZW1fRnJlZShvZGF0YSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlQeU1lbV9GcmVlKG9kYXRhKTsKLQlyZXR1cm4gcnY7CisgICAgICAgICAgICAgICAgaWYgKGNybGYpIG9kYXRhW291dCsrXSA9ICdccic7CisgICAgICAgICAgICAgICAgb2RhdGFbb3V0KytdID0gJ1xuJzsKKyAgICAgICAgICAgICAgICBpZiAoZGF0YVtpbl0gPT0gJ1xyJykKKyAgICAgICAgICAgICAgICAgICAgaW4gKz0gMjsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGluKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoKGluICsgMSAhPSBkYXRhbGVuKSAmJgorICAgICAgICAgICAgICAgICAgICAoZGF0YVtpbisxXSAhPSAnXG4nKSAmJgorICAgICAgICAgICAgICAgICAgICAobGluZWxlbiArIDEpID49IE1BWExJTkVTSVpFKSB7CisgICAgICAgICAgICAgICAgICAgIG9kYXRhW291dCsrXSA9ICc9JzsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNybGYpIG9kYXRhW291dCsrXSA9ICdccic7CisgICAgICAgICAgICAgICAgICAgIG9kYXRhW291dCsrXSA9ICdcbic7CisgICAgICAgICAgICAgICAgICAgIGxpbmVsZW4gPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsaW5lbGVuKys7CisgICAgICAgICAgICAgICAgaWYgKGhlYWRlciAmJiBkYXRhW2luXSA9PSAnICcpIHsKKyAgICAgICAgICAgICAgICAgICAgb2RhdGFbb3V0KytdID0gJ18nOworICAgICAgICAgICAgICAgICAgICBpbisrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgb2RhdGFbb3V0KytdID0gZGF0YVtpbisrXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKChydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopb2RhdGEsIG91dCkpID09IE5VTEwpIHsKKyAgICAgICAgUHlNZW1fRnJlZShvZGF0YSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeU1lbV9GcmVlKG9kYXRhKTsKKyAgICByZXR1cm4gcnY7CiB9CiAKIC8qIExpc3Qgb2YgZnVuY3Rpb25zIGRlZmluZWQgaW4gdGhlIG1vZHVsZSAqLwogCiBzdGF0aWMgc3RydWN0IFB5TWV0aG9kRGVmIGJpbmFzY2lpX21vZHVsZV9tZXRob2RzW10gPSB7Ci0JeyJhMmJfdXUiLCAgICAgYmluYXNjaWlfYTJiX3V1LCAgICAgTUVUSF9WQVJBUkdTLCBkb2NfYTJiX3V1fSwKLQl7ImIyYV91dSIsICAgICBiaW5hc2NpaV9iMmFfdXUsICAgICBNRVRIX1ZBUkFSR1MsIGRvY19iMmFfdXV9LAotCXsiYTJiX2Jhc2U2NCIsIGJpbmFzY2lpX2EyYl9iYXNlNjQsIE1FVEhfVkFSQVJHUywgZG9jX2EyYl9iYXNlNjR9LAotCXsiYjJhX2Jhc2U2NCIsIGJpbmFzY2lpX2IyYV9iYXNlNjQsIE1FVEhfVkFSQVJHUywgZG9jX2IyYV9iYXNlNjR9LAotCXsiYTJiX2hxeCIsICAgIGJpbmFzY2lpX2EyYl9ocXgsICAgIE1FVEhfVkFSQVJHUywgZG9jX2EyYl9ocXh9LAotCXsiYjJhX2hxeCIsICAgIGJpbmFzY2lpX2IyYV9ocXgsICAgIE1FVEhfVkFSQVJHUywgZG9jX2IyYV9ocXh9LAotCXsiYjJhX2hleCIsICAgIGJpbmFzY2lpX2hleGxpZnksICAgIE1FVEhfVkFSQVJHUywgZG9jX2hleGxpZnl9LAotCXsiYTJiX2hleCIsICAgIGJpbmFzY2lpX3VuaGV4bGlmeSwgIE1FVEhfVkFSQVJHUywgZG9jX3VuaGV4bGlmeX0sCi0JeyJoZXhsaWZ5IiwgICAgYmluYXNjaWlfaGV4bGlmeSwgICAgTUVUSF9WQVJBUkdTLCBkb2NfaGV4bGlmeX0sCi0JeyJ1bmhleGxpZnkiLCAgYmluYXNjaWlfdW5oZXhsaWZ5LCAgTUVUSF9WQVJBUkdTLCBkb2NfdW5oZXhsaWZ5fSwKLQl7InJsZWNvZGVfaHF4IiwgICBiaW5hc2NpaV9ybGVjb2RlX2hxeCwgTUVUSF9WQVJBUkdTLCBkb2NfcmxlY29kZV9ocXh9LAotCXsicmxlZGVjb2RlX2hxeCIsIGJpbmFzY2lpX3JsZWRlY29kZV9ocXgsIE1FVEhfVkFSQVJHUywKLQkgZG9jX3JsZWRlY29kZV9ocXh9LAotCXsiY3JjX2hxeCIsICAgIGJpbmFzY2lpX2NyY19ocXgsICAgIE1FVEhfVkFSQVJHUywgZG9jX2NyY19ocXh9LAotCXsiY3JjMzIiLCAgICAgIGJpbmFzY2lpX2NyYzMyLCAgICAgIE1FVEhfVkFSQVJHUywgZG9jX2NyYzMyfSwKLQl7ImEyYl9xcCIsIChQeUNGdW5jdGlvbiliaW5hc2NpaV9hMmJfcXAsIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsCi0JICBkb2NfYTJiX3FwfSwKLQl7ImIyYV9xcCIsIChQeUNGdW5jdGlvbiliaW5hc2NpaV9iMmFfcXAsIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsCi0gICAgICAgICAgZG9jX2IyYV9xcH0sCi0Je05VTEwsIE5VTEx9CQkJICAgICAvKiBzZW50aW5lbCAqLworICAgIHsiYTJiX3V1IiwgICAgIGJpbmFzY2lpX2EyYl91dSwgICAgIE1FVEhfVkFSQVJHUywgZG9jX2EyYl91dX0sCisgICAgeyJiMmFfdXUiLCAgICAgYmluYXNjaWlfYjJhX3V1LCAgICAgTUVUSF9WQVJBUkdTLCBkb2NfYjJhX3V1fSwKKyAgICB7ImEyYl9iYXNlNjQiLCBiaW5hc2NpaV9hMmJfYmFzZTY0LCBNRVRIX1ZBUkFSR1MsIGRvY19hMmJfYmFzZTY0fSwKKyAgICB7ImIyYV9iYXNlNjQiLCBiaW5hc2NpaV9iMmFfYmFzZTY0LCBNRVRIX1ZBUkFSR1MsIGRvY19iMmFfYmFzZTY0fSwKKyAgICB7ImEyYl9ocXgiLCAgICBiaW5hc2NpaV9hMmJfaHF4LCAgICBNRVRIX1ZBUkFSR1MsIGRvY19hMmJfaHF4fSwKKyAgICB7ImIyYV9ocXgiLCAgICBiaW5hc2NpaV9iMmFfaHF4LCAgICBNRVRIX1ZBUkFSR1MsIGRvY19iMmFfaHF4fSwKKyAgICB7ImIyYV9oZXgiLCAgICBiaW5hc2NpaV9oZXhsaWZ5LCAgICBNRVRIX1ZBUkFSR1MsIGRvY19oZXhsaWZ5fSwKKyAgICB7ImEyYl9oZXgiLCAgICBiaW5hc2NpaV91bmhleGxpZnksICBNRVRIX1ZBUkFSR1MsIGRvY191bmhleGxpZnl9LAorICAgIHsiaGV4bGlmeSIsICAgIGJpbmFzY2lpX2hleGxpZnksICAgIE1FVEhfVkFSQVJHUywgZG9jX2hleGxpZnl9LAorICAgIHsidW5oZXhsaWZ5IiwgIGJpbmFzY2lpX3VuaGV4bGlmeSwgIE1FVEhfVkFSQVJHUywgZG9jX3VuaGV4bGlmeX0sCisgICAgeyJybGVjb2RlX2hxeCIsICAgYmluYXNjaWlfcmxlY29kZV9ocXgsIE1FVEhfVkFSQVJHUywgZG9jX3JsZWNvZGVfaHF4fSwKKyAgICB7InJsZWRlY29kZV9ocXgiLCBiaW5hc2NpaV9ybGVkZWNvZGVfaHF4LCBNRVRIX1ZBUkFSR1MsCisgICAgIGRvY19ybGVkZWNvZGVfaHF4fSwKKyAgICB7ImNyY19ocXgiLCAgICBiaW5hc2NpaV9jcmNfaHF4LCAgICBNRVRIX1ZBUkFSR1MsIGRvY19jcmNfaHF4fSwKKyAgICB7ImNyYzMyIiwgICAgICBiaW5hc2NpaV9jcmMzMiwgICAgICBNRVRIX1ZBUkFSR1MsIGRvY19jcmMzMn0sCisgICAgeyJhMmJfcXAiLCAoUHlDRnVuY3Rpb24pYmluYXNjaWlfYTJiX3FwLCBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLAorICAgICAgZG9jX2EyYl9xcH0sCisgICAgeyJiMmFfcXAiLCAoUHlDRnVuY3Rpb24pYmluYXNjaWlfYjJhX3FwLCBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLAorICAgICAgZG9jX2IyYV9xcH0sCisgICAge05VTEwsIE5VTEx9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogCkBAIC0xMzgyLDIwICsxMzgyLDIwIEBACiBQeU1PRElOSVRfRlVOQwogaW5pdGJpbmFzY2lpKHZvaWQpCiB7Ci0JUHlPYmplY3QgKm0sICpkLCAqeDsKKyAgICBQeU9iamVjdCAqbSwgKmQsICp4OwogCi0JLyogQ3JlYXRlIHRoZSBtb2R1bGUgYW5kIGFkZCB0aGUgZnVuY3Rpb25zICovCi0JbSA9IFB5X0luaXRNb2R1bGUoImJpbmFzY2lpIiwgYmluYXNjaWlfbW9kdWxlX21ldGhvZHMpOwotCWlmIChtID09IE5VTEwpCi0JCXJldHVybjsKKyAgICAvKiBDcmVhdGUgdGhlIG1vZHVsZSBhbmQgYWRkIHRoZSBmdW5jdGlvbnMgKi8KKyAgICBtID0gUHlfSW5pdE1vZHVsZSgiYmluYXNjaWkiLCBiaW5hc2NpaV9tb2R1bGVfbWV0aG9kcyk7CisgICAgaWYgKG0gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOwogCi0JZCA9IFB5TW9kdWxlX0dldERpY3QobSk7Ci0JeCA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoZG9jX2JpbmFzY2lpKTsKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiX19kb2NfXyIsIHgpOwotCVB5X1hERUNSRUYoeCk7CisgICAgZCA9IFB5TW9kdWxlX0dldERpY3QobSk7CisgICAgeCA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoZG9jX2JpbmFzY2lpKTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiX19kb2NfXyIsIHgpOworICAgIFB5X1hERUNSRUYoeCk7CiAKLQlFcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbigiYmluYXNjaWkuRXJyb3IiLCBOVUxMLCBOVUxMKTsKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRXJyb3IiLCBFcnJvcik7Ci0JSW5jb21wbGV0ZSA9IFB5RXJyX05ld0V4Y2VwdGlvbigiYmluYXNjaWkuSW5jb21wbGV0ZSIsIE5VTEwsIE5VTEwpOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJJbmNvbXBsZXRlIiwgSW5jb21wbGV0ZSk7CisgICAgRXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oImJpbmFzY2lpLkVycm9yIiwgTlVMTCwgTlVMTCk7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVycm9yIiwgRXJyb3IpOworICAgIEluY29tcGxldGUgPSBQeUVycl9OZXdFeGNlcHRpb24oImJpbmFzY2lpLkluY29tcGxldGUiLCBOVUxMLCBOVUxMKTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSW5jb21wbGV0ZSIsIEluY29tcGxldGUpOwogfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9ic2RkYm1vZHVsZS5jIGIvTW9kdWxlcy9ic2RkYm1vZHVsZS5jCmluZGV4IDA5NzI4ODIuLjVmZDRmYjEgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvYnNkZGJtb2R1bGUuYworKysgYi9Nb2R1bGVzL2JzZGRibW9kdWxlLmMKQEAgLTMwLDEyICszMCwxMiBAQAogICAgKGl0IG1lc3NlcyB1cCB0aGUgaW5mbyByZXF1aXJlZCBpbiB0aGUgU2V0dXAgZmlsZSkgKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewotCVB5T2JqZWN0X0hFQUQKLQlEQiAqZGlfYnNkZGI7Ci0JaW50IGRpX3NpemU7CS8qIC0xIG1lYW5zIHJlY29tcHV0ZSAqLwotCWludCBkaV90eXBlOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBEQiAqZGlfYnNkZGI7CisgICAgaW50IGRpX3NpemU7ICAgICAgICAvKiAtMSBtZWFucyByZWNvbXB1dGUgKi8KKyAgICBpbnQgZGlfdHlwZTsKICNpZmRlZiBXSVRIX1RIUkVBRAotCVB5VGhyZWFkX3R5cGVfbG9jayBkaV9sb2NrOworICAgIFB5VGhyZWFkX3R5cGVfbG9jayBkaV9sb2NrOwogI2VuZGlmCiB9IGJzZGRib2JqZWN0OwogCkBAIC00NCw4MTkgKzQ0LDgxOSBAQAogI2RlZmluZSBpc19ic2RkYm9iamVjdCh2KSAoKHYpLT5vYl90eXBlID09ICZCc2RkYnR5cGUpCiAjZGVmaW5lIGNoZWNrX2JzZGRib2JqZWN0X29wZW4odiwgcikgaWYgKCh2KS0+ZGlfYnNkZGIgPT0gTlVMTCkgXAogICAgICAgICAgICAgICAgeyBQeUVycl9TZXRTdHJpbmcoQnNkZGJFcnJvciwgXAotCQkJCSAiQlNEREIgb2JqZWN0IGhhcyBhbHJlYWR5IGJlZW4gY2xvc2VkIik7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCU0REQiBvYmplY3QgaGFzIGFscmVhZHkgYmVlbiBjbG9zZWQiKTsgXAogICAgICAgICAgICAgICAgICByZXR1cm4gcjsgfQogCiBzdGF0aWMgUHlPYmplY3QgKkJzZGRiRXJyb3I7CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBuZXdkYmhhc2hvYmplY3QoY2hhciAqZmlsZSwgaW50IGZsYWdzLCBpbnQgbW9kZSwKLQkJaW50IGJzaXplLCBpbnQgZmZhY3RvciwgaW50IG5lbGVtLCBpbnQgY2FjaGVzaXplLAotCQlpbnQgaGFzaCwgaW50IGxvcmRlcikKKyAgICAgICAgICAgICAgICBpbnQgYnNpemUsIGludCBmZmFjdG9yLCBpbnQgbmVsZW0sIGludCBjYWNoZXNpemUsCisgICAgICAgICAgICAgICAgaW50IGhhc2gsIGludCBsb3JkZXIpCiB7Ci0JYnNkZGJvYmplY3QgKmRwOwotCUhBU0hJTkZPIGluZm87CisgICAgYnNkZGJvYmplY3QgKmRwOworICAgIEhBU0hJTkZPIGluZm87CiAKLQlpZiAoKGRwID0gUHlPYmplY3RfTmV3KGJzZGRib2JqZWN0LCAmQnNkZGJ0eXBlKSkgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKChkcCA9IFB5T2JqZWN0X05ldyhic2RkYm9iamVjdCwgJkJzZGRidHlwZSkpID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaW5mby5ic2l6ZSA9IGJzaXplOwotCWluZm8uZmZhY3RvciA9IGZmYWN0b3I7Ci0JaW5mby5uZWxlbSA9IG5lbGVtOwotCWluZm8uY2FjaGVzaXplID0gY2FjaGVzaXplOwotCWluZm8uaGFzaCA9IE5VTEw7IC8qIFhYWCBzaG91bGQgZGVyaXZlIGZyb20gaGFzaCBhcmd1bWVudCAqLwotCWluZm8ubG9yZGVyID0gbG9yZGVyOworICAgIGluZm8uYnNpemUgPSBic2l6ZTsKKyAgICBpbmZvLmZmYWN0b3IgPSBmZmFjdG9yOworICAgIGluZm8ubmVsZW0gPSBuZWxlbTsKKyAgICBpbmZvLmNhY2hlc2l6ZSA9IGNhY2hlc2l6ZTsKKyAgICBpbmZvLmhhc2ggPSBOVUxMOyAvKiBYWFggc2hvdWxkIGRlcml2ZSBmcm9tIGhhc2ggYXJndW1lbnQgKi8KKyAgICBpbmZvLmxvcmRlciA9IGxvcmRlcjsKIAogI2lmZGVmIE9fQklOQVJZCi0JZmxhZ3MgfD0gT19CSU5BUlk7CisgICAgZmxhZ3MgfD0gT19CSU5BUlk7CiAjZW5kaWYKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JZHAtPmRpX2JzZGRiID0gZGJvcGVuKGZpbGUsIGZsYWdzLCBtb2RlLCBEQl9IQVNILCAmaW5mbyk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQlpZiAoZHAtPmRpX2JzZGRiID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0RnJvbUVycm5vKEJzZGRiRXJyb3IpOworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICBkcC0+ZGlfYnNkZGIgPSBkYm9wZW4oZmlsZSwgZmxhZ3MsIG1vZGUsIERCX0hBU0gsICZpbmZvKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIGlmIChkcC0+ZGlfYnNkZGIgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oQnNkZGJFcnJvcik7CiAjaWZkZWYgV0lUSF9USFJFQUQKLQkJZHAtPmRpX2xvY2sgPSBOVUxMOworICAgICAgICBkcC0+ZGlfbG9jayA9IE5VTEw7CiAjZW5kaWYKLQkJUHlfREVDUkVGKGRwKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgICAgICBQeV9ERUNSRUYoZHApOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlkcC0+ZGlfc2l6ZSA9IC0xOwotCWRwLT5kaV90eXBlID0gREJfSEFTSDsKKyAgICBkcC0+ZGlfc2l6ZSA9IC0xOworICAgIGRwLT5kaV90eXBlID0gREJfSEFTSDsKIAogI2lmZGVmIFdJVEhfVEhSRUFECi0JZHAtPmRpX2xvY2sgPSBQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKCk7Ci0JaWYgKGRwLT5kaV9sb2NrID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKEJzZGRiRXJyb3IsICJjYW4ndCBhbGxvY2F0ZSBsb2NrIik7Ci0JCVB5X0RFQ1JFRihkcCk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBkcC0+ZGlfbG9jayA9IFB5VGhyZWFkX2FsbG9jYXRlX2xvY2soKTsKKyAgICBpZiAoZHAtPmRpX2xvY2sgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoQnNkZGJFcnJvciwgImNhbid0IGFsbG9jYXRlIGxvY2siKTsKKyAgICAgICAgUHlfREVDUkVGKGRwKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogI2VuZGlmCiAKLQlyZXR1cm4gKFB5T2JqZWN0ICopZHA7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWRwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbmV3ZGJidG9iamVjdChjaGFyICpmaWxlLCBpbnQgZmxhZ3MsIGludCBtb2RlLAotCSAgICAgIGludCBidGZsYWdzLCBpbnQgY2FjaGVzaXplLCBpbnQgbWF4a2V5cGFnZSwKLQkgICAgICBpbnQgbWlua2V5cGFnZSwgaW50IHBzaXplLCBpbnQgbG9yZGVyKQorICAgICAgICAgICAgICBpbnQgYnRmbGFncywgaW50IGNhY2hlc2l6ZSwgaW50IG1heGtleXBhZ2UsCisgICAgICAgICAgICAgIGludCBtaW5rZXlwYWdlLCBpbnQgcHNpemUsIGludCBsb3JkZXIpCiB7Ci0JYnNkZGJvYmplY3QgKmRwOwotCUJUUkVFSU5GTyBpbmZvOworICAgIGJzZGRib2JqZWN0ICpkcDsKKyAgICBCVFJFRUlORk8gaW5mbzsKIAotCWlmICgoZHAgPSBQeU9iamVjdF9OZXcoYnNkZGJvYmplY3QsICZCc2RkYnR5cGUpKSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoKGRwID0gUHlPYmplY3RfTmV3KGJzZGRib2JqZWN0LCAmQnNkZGJ0eXBlKSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpbmZvLmZsYWdzID0gYnRmbGFnczsKLQlpbmZvLmNhY2hlc2l6ZSA9IGNhY2hlc2l6ZTsKLQlpbmZvLm1heGtleXBhZ2UgPSBtYXhrZXlwYWdlOwotCWluZm8ubWlua2V5cGFnZSA9IG1pbmtleXBhZ2U7Ci0JaW5mby5wc2l6ZSA9IHBzaXplOwotCWluZm8ubG9yZGVyID0gbG9yZGVyOwotCWluZm8uY29tcGFyZSA9IDA7IC8qIFVzZSBkZWZhdWx0IGNvbXBhcmlzb24gZnVuY3Rpb25zLCBmb3Igbm93Li4qLwotCWluZm8ucHJlZml4ID0gMDsKKyAgICBpbmZvLmZsYWdzID0gYnRmbGFnczsKKyAgICBpbmZvLmNhY2hlc2l6ZSA9IGNhY2hlc2l6ZTsKKyAgICBpbmZvLm1heGtleXBhZ2UgPSBtYXhrZXlwYWdlOworICAgIGluZm8ubWlua2V5cGFnZSA9IG1pbmtleXBhZ2U7CisgICAgaW5mby5wc2l6ZSA9IHBzaXplOworICAgIGluZm8ubG9yZGVyID0gbG9yZGVyOworICAgIGluZm8uY29tcGFyZSA9IDA7IC8qIFVzZSBkZWZhdWx0IGNvbXBhcmlzb24gZnVuY3Rpb25zLCBmb3Igbm93Li4qLworICAgIGluZm8ucHJlZml4ID0gMDsKIAogI2lmZGVmIE9fQklOQVJZCi0JZmxhZ3MgfD0gT19CSU5BUlk7CisgICAgZmxhZ3MgfD0gT19CSU5BUlk7CiAjZW5kaWYKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JZHAtPmRpX2JzZGRiID0gZGJvcGVuKGZpbGUsIGZsYWdzLCBtb2RlLCBEQl9CVFJFRSwgJmluZm8pOwotCVB5X0VORF9BTExPV19USFJFQURTCi0JaWYgKGRwLT5kaV9ic2RkYiA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldEZyb21FcnJubyhCc2RkYkVycm9yKTsKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgZHAtPmRpX2JzZGRiID0gZGJvcGVuKGZpbGUsIGZsYWdzLCBtb2RlLCBEQl9CVFJFRSwgJmluZm8pOworICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgaWYgKGRwLT5kaV9ic2RkYiA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhCc2RkYkVycm9yKTsKICNpZmRlZiBXSVRIX1RIUkVBRAotCQlkcC0+ZGlfbG9jayA9IE5VTEw7CisgICAgICAgIGRwLT5kaV9sb2NrID0gTlVMTDsKICNlbmRpZgotCQlQeV9ERUNSRUYoZHApOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgICAgIFB5X0RFQ1JFRihkcCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWRwLT5kaV9zaXplID0gLTE7Ci0JZHAtPmRpX3R5cGUgPSBEQl9CVFJFRTsKKyAgICBkcC0+ZGlfc2l6ZSA9IC0xOworICAgIGRwLT5kaV90eXBlID0gREJfQlRSRUU7CiAKICNpZmRlZiBXSVRIX1RIUkVBRAotCWRwLT5kaV9sb2NrID0gUHlUaHJlYWRfYWxsb2NhdGVfbG9jaygpOwotCWlmIChkcC0+ZGlfbG9jayA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhCc2RkYkVycm9yLCAiY2FuJ3QgYWxsb2NhdGUgbG9jayIpOwotCQlQeV9ERUNSRUYoZHApOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgZHAtPmRpX2xvY2sgPSBQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKCk7CisgICAgaWYgKGRwLT5kaV9sb2NrID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEJzZGRiRXJyb3IsICJjYW4ndCBhbGxvY2F0ZSBsb2NrIik7CisgICAgICAgIFB5X0RFQ1JFRihkcCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KICNlbmRpZgogCi0JcmV0dXJuIChQeU9iamVjdCAqKWRwOworICAgIHJldHVybiAoUHlPYmplY3QgKilkcDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG5ld2Ricm5vYmplY3QoY2hhciAqZmlsZSwgaW50IGZsYWdzLCBpbnQgbW9kZSwKLQkgICAgICBpbnQgcm5mbGFncywgaW50IGNhY2hlc2l6ZSwgaW50IHBzaXplLCBpbnQgbG9yZGVyLAotCSAgICAgIHNpemVfdCByZWNsZW4sIHVfY2hhciBidmFsLCBjaGFyICpiZm5hbWUpCisgICAgICAgICAgICAgIGludCBybmZsYWdzLCBpbnQgY2FjaGVzaXplLCBpbnQgcHNpemUsIGludCBsb3JkZXIsCisgICAgICAgICAgICAgIHNpemVfdCByZWNsZW4sIHVfY2hhciBidmFsLCBjaGFyICpiZm5hbWUpCiB7Ci0JYnNkZGJvYmplY3QgKmRwOwotCVJFQ05PSU5GTyBpbmZvOwotCWludCBmZDsKKyAgICBic2RkYm9iamVjdCAqZHA7CisgICAgUkVDTk9JTkZPIGluZm87CisgICAgaW50IGZkOwogCi0JaWYgKChkcCA9IFB5T2JqZWN0X05ldyhic2RkYm9iamVjdCwgJkJzZGRidHlwZSkpID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIGlmICgoZHAgPSBQeU9iamVjdF9OZXcoYnNkZGJvYmplY3QsICZCc2RkYnR5cGUpKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWluZm8uZmxhZ3MgPSBybmZsYWdzOwotCWluZm8uY2FjaGVzaXplID0gY2FjaGVzaXplOwotCWluZm8ucHNpemUgPSBwc2l6ZTsKLQlpbmZvLmxvcmRlciA9IGxvcmRlcjsKLQlpbmZvLnJlY2xlbiA9IHJlY2xlbjsKLQlpbmZvLmJ2YWwgPSBidmFsOwotCWluZm8uYmZuYW1lID0gYmZuYW1lOworICAgIGluZm8uZmxhZ3MgPSBybmZsYWdzOworICAgIGluZm8uY2FjaGVzaXplID0gY2FjaGVzaXplOworICAgIGluZm8ucHNpemUgPSBwc2l6ZTsKKyAgICBpbmZvLmxvcmRlciA9IGxvcmRlcjsKKyAgICBpbmZvLnJlY2xlbiA9IHJlY2xlbjsKKyAgICBpbmZvLmJ2YWwgPSBidmFsOworICAgIGluZm8uYmZuYW1lID0gYmZuYW1lOwogCiAjaWZkZWYgT19CSU5BUlkKLQlmbGFncyB8PSBPX0JJTkFSWTsKKyAgICBmbGFncyB8PSBPX0JJTkFSWTsKICNlbmRpZgotCS8qIFRoaXMgaXMgYSBoYWNrIHRvIGF2b2lkIGEgZGJvcGVuKCkgYnVnIHRoYXQgaGFwcGVucyB3aGVuCi0JICogaXQgZmFpbHMuICovCi0JZmQgPSBvcGVuKGZpbGUsIGZsYWdzKTsKLQlpZiAoZmQgPT0gLTEpIHsKLQkJZHAtPmRpX2JzZGRiID0gTlVMTDsKLQl9Ci0JZWxzZSB7Ci0JCWNsb3NlKGZkKTsKLQkJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCQlkcC0+ZGlfYnNkZGIgPSBkYm9wZW4oZmlsZSwgZmxhZ3MsIG1vZGUsIERCX1JFQ05PLCAmaW5mbyk7Ci0JCVB5X0VORF9BTExPV19USFJFQURTCi0JfQotCWlmIChkcC0+ZGlfYnNkZGIgPT0gTlVMTCkgewotCQlQeUVycl9TZXRGcm9tRXJybm8oQnNkZGJFcnJvcik7CisgICAgLyogVGhpcyBpcyBhIGhhY2sgdG8gYXZvaWQgYSBkYm9wZW4oKSBidWcgdGhhdCBoYXBwZW5zIHdoZW4KKyAgICAgKiBpdCBmYWlscy4gKi8KKyAgICBmZCA9IG9wZW4oZmlsZSwgZmxhZ3MpOworICAgIGlmIChmZCA9PSAtMSkgeworICAgICAgICBkcC0+ZGlfYnNkZGIgPSBOVUxMOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgY2xvc2UoZmQpOworICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgICAgIGRwLT5kaV9ic2RkYiA9IGRib3BlbihmaWxlLCBmbGFncywgbW9kZSwgREJfUkVDTk8sICZpbmZvKTsKKyAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICB9CisgICAgaWYgKGRwLT5kaV9ic2RkYiA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhCc2RkYkVycm9yKTsKICNpZmRlZiBXSVRIX1RIUkVBRAotCQlkcC0+ZGlfbG9jayA9IE5VTEw7CisgICAgICAgIGRwLT5kaV9sb2NrID0gTlVMTDsKICNlbmRpZgotCQlQeV9ERUNSRUYoZHApOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgICAgIFB5X0RFQ1JFRihkcCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWRwLT5kaV9zaXplID0gLTE7Ci0JZHAtPmRpX3R5cGUgPSBEQl9SRUNOTzsKKyAgICBkcC0+ZGlfc2l6ZSA9IC0xOworICAgIGRwLT5kaV90eXBlID0gREJfUkVDTk87CiAKICNpZmRlZiBXSVRIX1RIUkVBRAotCWRwLT5kaV9sb2NrID0gUHlUaHJlYWRfYWxsb2NhdGVfbG9jaygpOwotCWlmIChkcC0+ZGlfbG9jayA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhCc2RkYkVycm9yLCAiY2FuJ3QgYWxsb2NhdGUgbG9jayIpOwotCQlQeV9ERUNSRUYoZHApOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgZHAtPmRpX2xvY2sgPSBQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKCk7CisgICAgaWYgKGRwLT5kaV9sb2NrID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEJzZGRiRXJyb3IsICJjYW4ndCBhbGxvY2F0ZSBsb2NrIik7CisgICAgICAgIFB5X0RFQ1JFRihkcCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KICNlbmRpZgogCi0JcmV0dXJuIChQeU9iamVjdCAqKWRwOworICAgIHJldHVybiAoUHlPYmplY3QgKilkcDsKIH0KIAogc3RhdGljIHZvaWQKIGJzZGRiX2RlYWxsb2MoYnNkZGJvYmplY3QgKmRwKQogewogI2lmZGVmIFdJVEhfVEhSRUFECi0JaWYgKGRwLT5kaV9sb2NrKSB7Ci0JCVB5VGhyZWFkX2FjcXVpcmVfbG9jayhkcC0+ZGlfbG9jaywgMCk7Ci0JCVB5VGhyZWFkX3JlbGVhc2VfbG9jayhkcC0+ZGlfbG9jayk7Ci0JCVB5VGhyZWFkX2ZyZWVfbG9jayhkcC0+ZGlfbG9jayk7Ci0JCWRwLT5kaV9sb2NrID0gTlVMTDsKLQl9CisgICAgaWYgKGRwLT5kaV9sb2NrKSB7CisgICAgICAgIFB5VGhyZWFkX2FjcXVpcmVfbG9jayhkcC0+ZGlfbG9jaywgMCk7CisgICAgICAgIFB5VGhyZWFkX3JlbGVhc2VfbG9jayhkcC0+ZGlfbG9jayk7CisgICAgICAgIFB5VGhyZWFkX2ZyZWVfbG9jayhkcC0+ZGlfbG9jayk7CisgICAgICAgIGRwLT5kaV9sb2NrID0gTlVMTDsKKyAgICB9CiAjZW5kaWYKLQlpZiAoZHAtPmRpX2JzZGRiICE9IE5VTEwpIHsKLQkJaW50IHN0YXR1czsKLQkJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCQlzdGF0dXMgPSAoZHAtPmRpX2JzZGRiLT5jbG9zZSkoZHAtPmRpX2JzZGRiKTsKLQkJUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQkJaWYgKHN0YXR1cyAhPSAwKQotCQkJZnByaW50ZihzdGRlcnIsCi0JCQkJIlB5dGhvbiBic2RkYjogY2xvc2UgZXJybm8gJWQgaW4gZGVhbGxvY1xuIiwKLQkJCQllcnJubyk7Ci0JfQotCVB5T2JqZWN0X0RlbChkcCk7CisgICAgaWYgKGRwLT5kaV9ic2RkYiAhPSBOVUxMKSB7CisgICAgICAgIGludCBzdGF0dXM7CisgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgc3RhdHVzID0gKGRwLT5kaV9ic2RkYi0+Y2xvc2UpKGRwLT5kaV9ic2RkYik7CisgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgICAgIGlmIChzdGF0dXMgIT0gMCkKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgICAgICJQeXRob24gYnNkZGI6IGNsb3NlIGVycm5vICVkIGluIGRlYWxsb2NcbiIsCisgICAgICAgICAgICAgICAgZXJybm8pOworICAgIH0KKyAgICBQeU9iamVjdF9EZWwoZHApOwogfQogCiAjaWZkZWYgV0lUSF9USFJFQUQKICNkZWZpbmUgQlNEREJfQkdOX1NBVkUoX2RwKSBcCi0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUyBQeVRocmVhZF9hY3F1aXJlX2xvY2soX2RwLT5kaV9sb2NrLDEpOworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMgUHlUaHJlYWRfYWNxdWlyZV9sb2NrKF9kcC0+ZGlfbG9jaywxKTsKICNkZWZpbmUgQlNEREJfRU5EX1NBVkUoX2RwKSBcCi0JUHlUaHJlYWRfcmVsZWFzZV9sb2NrKF9kcC0+ZGlfbG9jayk7IFB5X0VORF9BTExPV19USFJFQURTCisgICAgUHlUaHJlYWRfcmVsZWFzZV9sb2NrKF9kcC0+ZGlfbG9jayk7IFB5X0VORF9BTExPV19USFJFQURTCiAjZWxzZQotI2RlZmluZSBCU0REQl9CR05fU0FWRShfZHApIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMgCisjZGVmaW5lIEJTRERCX0JHTl9TQVZFKF9kcCkgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwogI2RlZmluZSBCU0REQl9FTkRfU0FWRShfZHApIFB5X0VORF9BTExPV19USFJFQURTCiAjZW5kaWYKIAogc3RhdGljIFB5X3NzaXplX3QKIGJzZGRiX2xlbmd0aChic2RkYm9iamVjdCAqZHApCiB7Ci0JY2hlY2tfYnNkZGJvYmplY3Rfb3BlbihkcCwgLTEpOwotCWlmIChkcC0+ZGlfc2l6ZSA8IDApIHsKLQkJREJUIGtyZWMsIGRyZWM7Ci0JCWludCBzdGF0dXM7Ci0JCWludCBzaXplID0gMDsKLQkJQlNEREJfQkdOX1NBVkUoZHApCi0JCWZvciAoc3RhdHVzID0gKGRwLT5kaV9ic2RkYi0+c2VxKShkcC0+ZGlfYnNkZGIsCi0JCQkJCQkgICZrcmVjLCAmZHJlYyxSX0ZJUlNUKTsKLQkJICAgICBzdGF0dXMgPT0gMDsKLQkJICAgICBzdGF0dXMgPSAoZHAtPmRpX2JzZGRiLT5zZXEpKGRwLT5kaV9ic2RkYiwKLQkJCQkJCSAgJmtyZWMsICZkcmVjLCBSX05FWFQpKQotCQkJc2l6ZSsrOwotCQlCU0REQl9FTkRfU0FWRShkcCkKLQkJaWYgKHN0YXR1cyA8IDApIHsKLQkJCVB5RXJyX1NldEZyb21FcnJubyhCc2RkYkVycm9yKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlkcC0+ZGlfc2l6ZSA9IHNpemU7Ci0JfQotCXJldHVybiBkcC0+ZGlfc2l6ZTsKKyAgICBjaGVja19ic2RkYm9iamVjdF9vcGVuKGRwLCAtMSk7CisgICAgaWYgKGRwLT5kaV9zaXplIDwgMCkgeworICAgICAgICBEQlQga3JlYywgZHJlYzsKKyAgICAgICAgaW50IHN0YXR1czsKKyAgICAgICAgaW50IHNpemUgPSAwOworICAgICAgICBCU0REQl9CR05fU0FWRShkcCkKKyAgICAgICAgZm9yIChzdGF0dXMgPSAoZHAtPmRpX2JzZGRiLT5zZXEpKGRwLT5kaV9ic2RkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrcmVjLCAmZHJlYyxSX0ZJUlNUKTsKKyAgICAgICAgICAgICBzdGF0dXMgPT0gMDsKKyAgICAgICAgICAgICBzdGF0dXMgPSAoZHAtPmRpX2JzZGRiLT5zZXEpKGRwLT5kaV9ic2RkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrcmVjLCAmZHJlYywgUl9ORVhUKSkKKyAgICAgICAgICAgIHNpemUrKzsKKyAgICAgICAgQlNEREJfRU5EX1NBVkUoZHApCisgICAgICAgIGlmIChzdGF0dXMgPCAwKSB7CisgICAgICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oQnNkZGJFcnJvcik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgZHAtPmRpX3NpemUgPSBzaXplOworICAgIH0KKyAgICByZXR1cm4gZHAtPmRpX3NpemU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBic2RkYl9zdWJzY3JpcHQoYnNkZGJvYmplY3QgKmRwLCBQeU9iamVjdCAqa2V5KQogewotCWludCBzdGF0dXM7Ci0JREJUIGtyZWMsIGRyZWM7Ci0JY2hhciAqZGF0YSxidWZbNDA5Nl07Ci0JaW50IHNpemU7Ci0JUHlPYmplY3QgKnJlc3VsdDsKLQlyZWNub190IHJlY25vOwotCQotCWlmIChkcC0+ZGlfdHlwZSA9PSBEQl9SRUNOTykgewotCQlpZiAoIVB5QXJnX1BhcnNlKGtleSwgImkiLCAmcmVjbm8pKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCQkia2V5IHR5cGUgbXVzdCBiZSBpbnRlZ2VyIik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlrcmVjLmRhdGEgPSAmcmVjbm87Ci0JCWtyZWMuc2l6ZSA9IHNpemVvZihyZWNubyk7Ci0JfQotCWVsc2UgewotCQlpZiAoIVB5QXJnX1BhcnNlKGtleSwgInMjIiwgJmRhdGEsICZzaXplKSkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkJImtleSB0eXBlIG11c3QgYmUgc3RyaW5nIik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlrcmVjLmRhdGEgPSBkYXRhOwotCQlrcmVjLnNpemUgPSBzaXplOwotCX0KLSAgICAgICAgY2hlY2tfYnNkZGJvYmplY3Rfb3BlbihkcCwgTlVMTCk7CisgICAgaW50IHN0YXR1czsKKyAgICBEQlQga3JlYywgZHJlYzsKKyAgICBjaGFyICpkYXRhLGJ1Zls0MDk2XTsKKyAgICBpbnQgc2l6ZTsKKyAgICBQeU9iamVjdCAqcmVzdWx0OworICAgIHJlY25vX3QgcmVjbm87CiAKLQlCU0REQl9CR05fU0FWRShkcCkKLQlzdGF0dXMgPSAoZHAtPmRpX2JzZGRiLT5nZXQpKGRwLT5kaV9ic2RkYiwgJmtyZWMsICZkcmVjLCAwKTsKLQlpZiAoc3RhdHVzID09IDApIHsKLQkJaWYgKGRyZWMuc2l6ZSA+IHNpemVvZihidWYpKSBkYXRhID0gbWFsbG9jKGRyZWMuc2l6ZSk7Ci0JCWVsc2UgZGF0YSA9IGJ1ZjsKLQkJaWYgKGRhdGEhPU5VTEwpIG1lbWNweShkYXRhLGRyZWMuZGF0YSxkcmVjLnNpemUpOwotCX0KLQlCU0REQl9FTkRfU0FWRShkcCkKLQlpZiAoZGF0YT09TlVMTCkgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JaWYgKHN0YXR1cyAhPSAwKSB7Ci0JCWlmIChzdGF0dXMgPCAwKQotCQkJUHlFcnJfU2V0RnJvbUVycm5vKEJzZGRiRXJyb3IpOwotCQllbHNlCi0JCQlQeUVycl9TZXRPYmplY3QoUHlFeGNfS2V5RXJyb3IsIGtleSk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoZHAtPmRpX3R5cGUgPT0gREJfUkVDTk8pIHsKKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZShrZXksICJpIiwgJnJlY25vKSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAia2V5IHR5cGUgbXVzdCBiZSBpbnRlZ2VyIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBrcmVjLmRhdGEgPSAmcmVjbm87CisgICAgICAgIGtyZWMuc2l6ZSA9IHNpemVvZihyZWNubyk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZiAoIVB5QXJnX1BhcnNlKGtleSwgInMjIiwgJmRhdGEsICZzaXplKSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAia2V5IHR5cGUgbXVzdCBiZSBzdHJpbmciKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGtyZWMuZGF0YSA9IGRhdGE7CisgICAgICAgIGtyZWMuc2l6ZSA9IHNpemU7CisgICAgfQorICAgIGNoZWNrX2JzZGRib2JqZWN0X29wZW4oZHAsIE5VTEwpOwogCi0JcmVzdWx0ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoZGF0YSwgKGludClkcmVjLnNpemUpOwotCWlmIChkYXRhICE9IGJ1ZikgZnJlZShkYXRhKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIEJTRERCX0JHTl9TQVZFKGRwKQorICAgIHN0YXR1cyA9IChkcC0+ZGlfYnNkZGItPmdldCkoZHAtPmRpX2JzZGRiLCAma3JlYywgJmRyZWMsIDApOworICAgIGlmIChzdGF0dXMgPT0gMCkgeworICAgICAgICBpZiAoZHJlYy5zaXplID4gc2l6ZW9mKGJ1ZikpIGRhdGEgPSBtYWxsb2MoZHJlYy5zaXplKTsKKyAgICAgICAgZWxzZSBkYXRhID0gYnVmOworICAgICAgICBpZiAoZGF0YSE9TlVMTCkgbWVtY3B5KGRhdGEsZHJlYy5kYXRhLGRyZWMuc2l6ZSk7CisgICAgfQorICAgIEJTRERCX0VORF9TQVZFKGRwKQorICAgIGlmIChkYXRhPT1OVUxMKSByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICBpZiAoc3RhdHVzICE9IDApIHsKKyAgICAgICAgaWYgKHN0YXR1cyA8IDApCisgICAgICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oQnNkZGJFcnJvcik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIFB5RXJyX1NldE9iamVjdChQeUV4Y19LZXlFcnJvciwga2V5KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmVzdWx0ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoZGF0YSwgKGludClkcmVjLnNpemUpOworICAgIGlmIChkYXRhICE9IGJ1ZikgZnJlZShkYXRhKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgaW50CiBic2RkYl9hc3Nfc3ViKGJzZGRib2JqZWN0ICpkcCwgUHlPYmplY3QgKmtleSwgUHlPYmplY3QgKnZhbHVlKQogewotCWludCBzdGF0dXM7Ci0JREJUIGtyZWMsIGRyZWM7Ci0JY2hhciAqZGF0YTsKLQlpbnQgc2l6ZTsKLQlyZWNub190IHJlY25vOworICAgIGludCBzdGF0dXM7CisgICAgREJUIGtyZWMsIGRyZWM7CisgICAgY2hhciAqZGF0YTsKKyAgICBpbnQgc2l6ZTsKKyAgICByZWNub190IHJlY25vOwogCi0JaWYgKGRwLT5kaV90eXBlID09IERCX1JFQ05PKSB7Ci0JCWlmICghUHlBcmdfUGFyc2Uoa2V5LCAiaSIsICZyZWNubykpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJCSJic2RkYiBrZXkgdHlwZSBtdXN0IGJlIGludGVnZXIiKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlrcmVjLmRhdGEgPSAmcmVjbm87Ci0JCWtyZWMuc2l6ZSA9IHNpemVvZihyZWNubyk7Ci0JfQotCWVsc2UgewotCQlpZiAoIVB5QXJnX1BhcnNlKGtleSwgInMjIiwgJmRhdGEsICZzaXplKSkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkJImJzZGRiIGtleSB0eXBlIG11c3QgYmUgc3RyaW5nIik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJa3JlYy5kYXRhID0gZGF0YTsKLQkJa3JlYy5zaXplID0gc2l6ZTsKLQl9Ci0JY2hlY2tfYnNkZGJvYmplY3Rfb3BlbihkcCwgLTEpOwotCWRwLT5kaV9zaXplID0gLTE7Ci0JaWYgKHZhbHVlID09IE5VTEwpIHsKLQkJQlNEREJfQkdOX1NBVkUoZHApCi0JCXN0YXR1cyA9IChkcC0+ZGlfYnNkZGItPmRlbCkoZHAtPmRpX2JzZGRiLCAma3JlYywgMCk7Ci0JCUJTRERCX0VORF9TQVZFKGRwKQotCX0KLQllbHNlIHsKLQkJaWYgKCFQeUFyZ19QYXJzZSh2YWx1ZSwgInMjIiwgJmRhdGEsICZzaXplKSkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkJImJzZGRiIHZhbHVlIHR5cGUgbXVzdCBiZSBzdHJpbmciKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlkcmVjLmRhdGEgPSBkYXRhOwotCQlkcmVjLnNpemUgPSBzaXplOwotCQlCU0REQl9CR05fU0FWRShkcCkKLQkJc3RhdHVzID0gKGRwLT5kaV9ic2RkYi0+cHV0KShkcC0+ZGlfYnNkZGIsICZrcmVjLCAmZHJlYywgMCk7Ci0JCUJTRERCX0VORF9TQVZFKGRwKQotCX0KLQlpZiAoc3RhdHVzICE9IDApIHsKLQkJaWYgKHN0YXR1cyA8IDApCi0JCQlQeUVycl9TZXRGcm9tRXJybm8oQnNkZGJFcnJvcik7Ci0JCWVsc2UKLQkJCVB5RXJyX1NldE9iamVjdChQeUV4Y19LZXlFcnJvciwga2V5KTsKLQkJcmV0dXJuIC0xOwotCX0KLQlyZXR1cm4gMDsKKyAgICBpZiAoZHAtPmRpX3R5cGUgPT0gREJfUkVDTk8pIHsKKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZShrZXksICJpIiwgJnJlY25vKSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnNkZGIga2V5IHR5cGUgbXVzdCBiZSBpbnRlZ2VyIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAga3JlYy5kYXRhID0gJnJlY25vOworICAgICAgICBrcmVjLnNpemUgPSBzaXplb2YocmVjbm8pOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZShrZXksICJzIyIsICZkYXRhLCAmc2l6ZSkpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJzZGRiIGtleSB0eXBlIG11c3QgYmUgc3RyaW5nIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAga3JlYy5kYXRhID0gZGF0YTsKKyAgICAgICAga3JlYy5zaXplID0gc2l6ZTsKKyAgICB9CisgICAgY2hlY2tfYnNkZGJvYmplY3Rfb3BlbihkcCwgLTEpOworICAgIGRwLT5kaV9zaXplID0gLTE7CisgICAgaWYgKHZhbHVlID09IE5VTEwpIHsKKyAgICAgICAgQlNEREJfQkdOX1NBVkUoZHApCisgICAgICAgIHN0YXR1cyA9IChkcC0+ZGlfYnNkZGItPmRlbCkoZHAtPmRpX2JzZGRiLCAma3JlYywgMCk7CisgICAgICAgIEJTRERCX0VORF9TQVZFKGRwKQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZSh2YWx1ZSwgInMjIiwgJmRhdGEsICZzaXplKSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnNkZGIgdmFsdWUgdHlwZSBtdXN0IGJlIHN0cmluZyIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGRyZWMuZGF0YSA9IGRhdGE7CisgICAgICAgIGRyZWMuc2l6ZSA9IHNpemU7CisgICAgICAgIEJTRERCX0JHTl9TQVZFKGRwKQorICAgICAgICBzdGF0dXMgPSAoZHAtPmRpX2JzZGRiLT5wdXQpKGRwLT5kaV9ic2RkYiwgJmtyZWMsICZkcmVjLCAwKTsKKyAgICAgICAgQlNEREJfRU5EX1NBVkUoZHApCisgICAgfQorICAgIGlmIChzdGF0dXMgIT0gMCkgeworICAgICAgICBpZiAoc3RhdHVzIDwgMCkKKyAgICAgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhCc2RkYkVycm9yKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgUHlFcnJfU2V0T2JqZWN0KFB5RXhjX0tleUVycm9yLCBrZXkpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlNYXBwaW5nTWV0aG9kcyBic2RkYl9hc19tYXBwaW5nID0gewotCShsZW5mdW5jKWJzZGRiX2xlbmd0aCwJCS8qbXBfbGVuZ3RoKi8KLQkoYmluYXJ5ZnVuYylic2RkYl9zdWJzY3JpcHQsCS8qbXBfc3Vic2NyaXB0Ki8KLQkob2Jqb2JqYXJncHJvYylic2RkYl9hc3Nfc3ViLAkvKm1wX2Fzc19zdWJzY3JpcHQqLworICAgIChsZW5mdW5jKWJzZGRiX2xlbmd0aCwgICAgICAgICAgICAgIC8qbXBfbGVuZ3RoKi8KKyAgICAoYmluYXJ5ZnVuYylic2RkYl9zdWJzY3JpcHQsICAgICAgICAvKm1wX3N1YnNjcmlwdCovCisgICAgKG9iam9iamFyZ3Byb2MpYnNkZGJfYXNzX3N1YiwgICAgICAgLyptcF9hc3Nfc3Vic2NyaXB0Ki8KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBic2RkYl9jbG9zZShic2RkYm9iamVjdCAqZHApCiB7Ci0JaWYgKGRwLT5kaV9ic2RkYiAhPSBOVUxMKSB7Ci0JCWludCBzdGF0dXM7Ci0JCUJTRERCX0JHTl9TQVZFKGRwKQotCQlzdGF0dXMgPSAoZHAtPmRpX2JzZGRiLT5jbG9zZSkoZHAtPmRpX2JzZGRiKTsKLQkJQlNEREJfRU5EX1NBVkUoZHApCi0JCWlmIChzdGF0dXMgIT0gMCkgewotCQkJZHAtPmRpX2JzZGRiID0gTlVMTDsKLQkJCVB5RXJyX1NldEZyb21FcnJubyhCc2RkYkVycm9yKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQotCWRwLT5kaV9ic2RkYiA9IE5VTEw7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGlmIChkcC0+ZGlfYnNkZGIgIT0gTlVMTCkgeworICAgICAgICBpbnQgc3RhdHVzOworICAgICAgICBCU0REQl9CR05fU0FWRShkcCkKKyAgICAgICAgc3RhdHVzID0gKGRwLT5kaV9ic2RkYi0+Y2xvc2UpKGRwLT5kaV9ic2RkYik7CisgICAgICAgIEJTRERCX0VORF9TQVZFKGRwKQorICAgICAgICBpZiAoc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgIGRwLT5kaV9ic2RkYiA9IE5VTEw7CisgICAgICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oQnNkZGJFcnJvcik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgICBkcC0+ZGlfYnNkZGIgPSBOVUxMOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGJzZGRiX2tleXMoYnNkZGJvYmplY3QgKmRwKQogewotCVB5T2JqZWN0ICpsaXN0LCAqaXRlbT1OVUxMOwotCURCVCBrcmVjLCBkcmVjOwotCWNoYXIgKmRhdGE9TlVMTCxidWZbNDA5Nl07Ci0JaW50IHN0YXR1czsKLQlpbnQgZXJyOworICAgIFB5T2JqZWN0ICpsaXN0LCAqaXRlbT1OVUxMOworICAgIERCVCBrcmVjLCBkcmVjOworICAgIGNoYXIgKmRhdGE9TlVMTCxidWZbNDA5Nl07CisgICAgaW50IHN0YXR1czsKKyAgICBpbnQgZXJyOwogCi0JY2hlY2tfYnNkZGJvYmplY3Rfb3BlbihkcCwgTlVMTCk7Ci0JbGlzdCA9IFB5TGlzdF9OZXcoMCk7Ci0JaWYgKGxpc3QgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JQlNEREJfQkdOX1NBVkUoZHApCi0Jc3RhdHVzID0gKGRwLT5kaV9ic2RkYi0+c2VxKShkcC0+ZGlfYnNkZGIsICZrcmVjLCAmZHJlYywgUl9GSVJTVCk7Ci0JaWYgKHN0YXR1cyA9PSAwKSB7Ci0JCWlmIChrcmVjLnNpemUgPiBzaXplb2YoYnVmKSkgZGF0YSA9IG1hbGxvYyhrcmVjLnNpemUpOwotCQllbHNlIGRhdGEgPSBidWY7Ci0JCWlmIChkYXRhICE9IE5VTEwpIG1lbWNweShkYXRhLGtyZWMuZGF0YSxrcmVjLnNpemUpOwotCX0KLQlCU0REQl9FTkRfU0FWRShkcCkKLQlpZiAoc3RhdHVzID09IDAgJiYgZGF0YT09TlVMTCkgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0Jd2hpbGUgKHN0YXR1cyA9PSAwKSB7Ci0JCWlmIChkcC0+ZGlfdHlwZSA9PSBEQl9SRUNOTykKLQkJCWl0ZW0gPSBQeUludF9Gcm9tTG9uZygqKChpbnQqKWRhdGEpKTsKLQkJZWxzZQotCQkJaXRlbSA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGRhdGEsCi0JCQkJCQkJICAoaW50KWtyZWMuc2l6ZSk7Ci0JCWlmIChkYXRhICE9IGJ1ZikgZnJlZShkYXRhKTsKLQkJaWYgKGl0ZW0gPT0gTlVMTCkgewotCQkJUHlfREVDUkVGKGxpc3QpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJZXJyID0gUHlMaXN0X0FwcGVuZChsaXN0LCBpdGVtKTsKLQkJUHlfREVDUkVGKGl0ZW0pOwotCQlpZiAoZXJyICE9IDApIHsKLQkJCVB5X0RFQ1JFRihsaXN0KTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCUJTRERCX0JHTl9TQVZFKGRwKQotCQlzdGF0dXMgPSAoZHAtPmRpX2JzZGRiLT5zZXEpCi0JCQkoZHAtPmRpX2JzZGRiLCAma3JlYywgJmRyZWMsIFJfTkVYVCk7Ci0JCWlmIChzdGF0dXMgPT0gMCkgewotCQkJaWYgKGtyZWMuc2l6ZSA+IHNpemVvZihidWYpKQotCQkJCWRhdGEgPSBtYWxsb2Moa3JlYy5zaXplKTsKLQkJCWVsc2UgZGF0YSA9IGJ1ZjsKLQkJCWlmIChkYXRhICE9IE5VTEwpCi0JCQkJbWVtY3B5KGRhdGEsa3JlYy5kYXRhLGtyZWMuc2l6ZSk7Ci0JCX0KLQkJQlNEREJfRU5EX1NBVkUoZHApCi0JCWlmIChkYXRhID09IE5VTEwpIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCX0KLQlpZiAoc3RhdHVzIDwgMCkgewotCQlQeUVycl9TZXRGcm9tRXJybm8oQnNkZGJFcnJvcik7Ci0JCVB5X0RFQ1JFRihsaXN0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChkcC0+ZGlfc2l6ZSA8IDApCi0JCWRwLT5kaV9zaXplID0gUHlMaXN0X1NpemUobGlzdCk7IC8qIFdlIGp1c3QgZGlkIHRoZSB3b3JrICovCi0JcmV0dXJuIGxpc3Q7CisgICAgY2hlY2tfYnNkZGJvYmplY3Rfb3BlbihkcCwgTlVMTCk7CisgICAgbGlzdCA9IFB5TGlzdF9OZXcoMCk7CisgICAgaWYgKGxpc3QgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQlNEREJfQkdOX1NBVkUoZHApCisgICAgc3RhdHVzID0gKGRwLT5kaV9ic2RkYi0+c2VxKShkcC0+ZGlfYnNkZGIsICZrcmVjLCAmZHJlYywgUl9GSVJTVCk7CisgICAgaWYgKHN0YXR1cyA9PSAwKSB7CisgICAgICAgIGlmIChrcmVjLnNpemUgPiBzaXplb2YoYnVmKSkgZGF0YSA9IG1hbGxvYyhrcmVjLnNpemUpOworICAgICAgICBlbHNlIGRhdGEgPSBidWY7CisgICAgICAgIGlmIChkYXRhICE9IE5VTEwpIG1lbWNweShkYXRhLGtyZWMuZGF0YSxrcmVjLnNpemUpOworICAgIH0KKyAgICBCU0REQl9FTkRfU0FWRShkcCkKKyAgICBpZiAoc3RhdHVzID09IDAgJiYgZGF0YT09TlVMTCkgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgd2hpbGUgKHN0YXR1cyA9PSAwKSB7CisgICAgICAgIGlmIChkcC0+ZGlfdHlwZSA9PSBEQl9SRUNOTykKKyAgICAgICAgICAgIGl0ZW0gPSBQeUludF9Gcm9tTG9uZygqKChpbnQqKWRhdGEpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaXRlbSA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludClrcmVjLnNpemUpOworICAgICAgICBpZiAoZGF0YSAhPSBidWYpIGZyZWUoZGF0YSk7CisgICAgICAgIGlmIChpdGVtID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihsaXN0KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGVyciA9IFB5TGlzdF9BcHBlbmQobGlzdCwgaXRlbSk7CisgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICAgICAgaWYgKGVyciAhPSAwKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYobGlzdCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBCU0REQl9CR05fU0FWRShkcCkKKyAgICAgICAgc3RhdHVzID0gKGRwLT5kaV9ic2RkYi0+c2VxKQorICAgICAgICAgICAgKGRwLT5kaV9ic2RkYiwgJmtyZWMsICZkcmVjLCBSX05FWFQpOworICAgICAgICBpZiAoc3RhdHVzID09IDApIHsKKyAgICAgICAgICAgIGlmIChrcmVjLnNpemUgPiBzaXplb2YoYnVmKSkKKyAgICAgICAgICAgICAgICBkYXRhID0gbWFsbG9jKGtyZWMuc2l6ZSk7CisgICAgICAgICAgICBlbHNlIGRhdGEgPSBidWY7CisgICAgICAgICAgICBpZiAoZGF0YSAhPSBOVUxMKQorICAgICAgICAgICAgICAgIG1lbWNweShkYXRhLGtyZWMuZGF0YSxrcmVjLnNpemUpOworICAgICAgICB9CisgICAgICAgIEJTRERCX0VORF9TQVZFKGRwKQorICAgICAgICBpZiAoZGF0YSA9PSBOVUxMKSByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICB9CisgICAgaWYgKHN0YXR1cyA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKEJzZGRiRXJyb3IpOworICAgICAgICBQeV9ERUNSRUYobGlzdCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoZHAtPmRpX3NpemUgPCAwKQorICAgICAgICBkcC0+ZGlfc2l6ZSA9IFB5TGlzdF9TaXplKGxpc3QpOyAvKiBXZSBqdXN0IGRpZCB0aGUgd29yayAqLworICAgIHJldHVybiBsaXN0OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYnNkZGJfaGFzX2tleShic2RkYm9iamVjdCAqZHAsIFB5T2JqZWN0ICphcmdzKQogewotCURCVCBrcmVjLCBkcmVjOwotCWludCBzdGF0dXM7Ci0JY2hhciAqZGF0YTsKLQlpbnQgc2l6ZTsKLQlyZWNub190IHJlY25vOworICAgIERCVCBrcmVjLCBkcmVjOworICAgIGludCBzdGF0dXM7CisgICAgY2hhciAqZGF0YTsKKyAgICBpbnQgc2l6ZTsKKyAgICByZWNub190IHJlY25vOwogCi0JaWYgKGRwLT5kaV90eXBlID09IERCX1JFQ05PKSB7Ci0JCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTtrZXkgdHlwZSBtdXN0IGJlIGludGVnZXIiLAotCQkJCSAgICAgICZyZWNubykpIHsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWtyZWMuZGF0YSA9ICZyZWNubzsKLQkJa3JlYy5zaXplID0gc2l6ZW9mKHJlY25vKTsKLQl9Ci0JZWxzZSB7Ci0JCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyM7a2V5IHR5cGUgbXVzdCBiZSBzdHJpbmciLAotCQkJCSAgICAgICZkYXRhLCAmc2l6ZSkpIHsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWtyZWMuZGF0YSA9IGRhdGE7Ci0JCWtyZWMuc2l6ZSA9IHNpemU7Ci0JfQotCWNoZWNrX2JzZGRib2JqZWN0X29wZW4oZHAsIE5VTEwpOworICAgIGlmIChkcC0+ZGlfdHlwZSA9PSBEQl9SRUNOTykgeworICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk7a2V5IHR5cGUgbXVzdCBiZSBpbnRlZ2VyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWNubykpIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGtyZWMuZGF0YSA9ICZyZWNubzsKKyAgICAgICAga3JlYy5zaXplID0gc2l6ZW9mKHJlY25vKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyM7a2V5IHR5cGUgbXVzdCBiZSBzdHJpbmciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGEsICZzaXplKSkgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAga3JlYy5kYXRhID0gZGF0YTsKKyAgICAgICAga3JlYy5zaXplID0gc2l6ZTsKKyAgICB9CisgICAgY2hlY2tfYnNkZGJvYmplY3Rfb3BlbihkcCwgTlVMTCk7CiAKLQlCU0REQl9CR05fU0FWRShkcCkKLQlzdGF0dXMgPSAoZHAtPmRpX2JzZGRiLT5nZXQpKGRwLT5kaV9ic2RkYiwgJmtyZWMsICZkcmVjLCAwKTsKLQlCU0REQl9FTkRfU0FWRShkcCkKLQlpZiAoc3RhdHVzIDwgMCkgewotCQlQeUVycl9TZXRGcm9tRXJybm8oQnNkZGJFcnJvcik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBCU0REQl9CR05fU0FWRShkcCkKKyAgICBzdGF0dXMgPSAoZHAtPmRpX2JzZGRiLT5nZXQpKGRwLT5kaV9ic2RkYiwgJmtyZWMsICZkcmVjLCAwKTsKKyAgICBCU0REQl9FTkRfU0FWRShkcCkKKyAgICBpZiAoc3RhdHVzIDwgMCkgeworICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oQnNkZGJFcnJvcik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXJldHVybiBQeUludF9Gcm9tTG9uZyhzdGF0dXMgPT0gMCk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHN0YXR1cyA9PSAwKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGJzZGRiX3NldF9sb2NhdGlvbihic2RkYm9iamVjdCAqZHAsIFB5T2JqZWN0ICprZXkpCiB7Ci0JaW50IHN0YXR1czsKLQlEQlQga3JlYywgZHJlYzsKLQljaGFyICpkYXRhLGJ1Zls0MDk2XTsKLQlpbnQgc2l6ZTsKLQlQeU9iamVjdCAqcmVzdWx0OwotCXJlY25vX3QgcmVjbm87CisgICAgaW50IHN0YXR1czsKKyAgICBEQlQga3JlYywgZHJlYzsKKyAgICBjaGFyICpkYXRhLGJ1Zls0MDk2XTsKKyAgICBpbnQgc2l6ZTsKKyAgICBQeU9iamVjdCAqcmVzdWx0OworICAgIHJlY25vX3QgcmVjbm87CiAKLQlpZiAoZHAtPmRpX3R5cGUgPT0gREJfUkVDTk8pIHsKLQkJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGtleSwgImk7a2V5IHR5cGUgbXVzdCBiZSBpbnRlZ2VyIiwKLQkJCQkgICAgICAmcmVjbm8pKSB7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlrcmVjLmRhdGEgPSAmcmVjbm87Ci0JCWtyZWMuc2l6ZSA9IHNpemVvZihyZWNubyk7Ci0JfQotCWVsc2UgewotCQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoa2V5LCAicyM7a2V5IHR5cGUgbXVzdCBiZSBzdHJpbmciLAotCQkJCSAgICAgICZkYXRhLCAmc2l6ZSkpIHsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWtyZWMuZGF0YSA9IGRhdGE7Ci0JCWtyZWMuc2l6ZSA9IHNpemU7Ci0JfQotCWNoZWNrX2JzZGRib2JqZWN0X29wZW4oZHAsIE5VTEwpOworICAgIGlmIChkcC0+ZGlfdHlwZSA9PSBEQl9SRUNOTykgeworICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoa2V5LCAiaTtrZXkgdHlwZSBtdXN0IGJlIGludGVnZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlY25vKSkgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAga3JlYy5kYXRhID0gJnJlY25vOworICAgICAgICBrcmVjLnNpemUgPSBzaXplb2YocmVjbm8pOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGtleSwgInMjO2tleSB0eXBlIG11c3QgYmUgc3RyaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhLCAmc2l6ZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGtyZWMuZGF0YSA9IGRhdGE7CisgICAgICAgIGtyZWMuc2l6ZSA9IHNpemU7CisgICAgfQorICAgIGNoZWNrX2JzZGRib2JqZWN0X29wZW4oZHAsIE5VTEwpOwogCi0JQlNEREJfQkdOX1NBVkUoZHApCi0Jc3RhdHVzID0gKGRwLT5kaV9ic2RkYi0+c2VxKShkcC0+ZGlfYnNkZGIsICZrcmVjLCAmZHJlYywgUl9DVVJTT1IpOwotCWlmIChzdGF0dXMgPT0gMCkgewotCQlpZiAoZHJlYy5zaXplID4gc2l6ZW9mKGJ1ZikpIGRhdGEgPSBtYWxsb2MoZHJlYy5zaXplKTsKLQkJZWxzZSBkYXRhID0gYnVmOwotCQlpZiAoZGF0YSE9TlVMTCkgbWVtY3B5KGRhdGEsZHJlYy5kYXRhLGRyZWMuc2l6ZSk7Ci0JfQotCUJTRERCX0VORF9TQVZFKGRwKQotCWlmIChkYXRhPT1OVUxMKSByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQlpZiAoc3RhdHVzICE9IDApIHsKLQkJaWYgKHN0YXR1cyA8IDApCi0JCQlQeUVycl9TZXRGcm9tRXJybm8oQnNkZGJFcnJvcik7Ci0JCWVsc2UKLQkJCVB5RXJyX1NldE9iamVjdChQeUV4Y19LZXlFcnJvciwga2V5KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIEJTRERCX0JHTl9TQVZFKGRwKQorICAgIHN0YXR1cyA9IChkcC0+ZGlfYnNkZGItPnNlcSkoZHAtPmRpX2JzZGRiLCAma3JlYywgJmRyZWMsIFJfQ1VSU09SKTsKKyAgICBpZiAoc3RhdHVzID09IDApIHsKKyAgICAgICAgaWYgKGRyZWMuc2l6ZSA+IHNpemVvZihidWYpKSBkYXRhID0gbWFsbG9jKGRyZWMuc2l6ZSk7CisgICAgICAgIGVsc2UgZGF0YSA9IGJ1ZjsKKyAgICAgICAgaWYgKGRhdGEhPU5VTEwpIG1lbWNweShkYXRhLGRyZWMuZGF0YSxkcmVjLnNpemUpOworICAgIH0KKyAgICBCU0REQl9FTkRfU0FWRShkcCkKKyAgICBpZiAoZGF0YT09TlVMTCkgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgaWYgKHN0YXR1cyAhPSAwKSB7CisgICAgICAgIGlmIChzdGF0dXMgPCAwKQorICAgICAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKEJzZGRiRXJyb3IpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBQeUVycl9TZXRPYmplY3QoUHlFeGNfS2V5RXJyb3IsIGtleSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWlmIChkcC0+ZGlfdHlwZSA9PSBEQl9SRUNOTykKLQkJcmVzdWx0ID0gUHlfQnVpbGRWYWx1ZSgiaXMjIiwgKigoaW50KilrcmVjLmRhdGEpLAotCQkJCSAgICAgICBkYXRhLCBkcmVjLnNpemUpOwotCWVsc2UKLQkJcmVzdWx0ID0gUHlfQnVpbGRWYWx1ZSgicyNzIyIsIGtyZWMuZGF0YSwga3JlYy5zaXplLAotCQkJCSAgICAgICBkYXRhLCBkcmVjLnNpemUpOwotCWlmIChkYXRhICE9IGJ1ZikgZnJlZShkYXRhKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIGlmIChkcC0+ZGlfdHlwZSA9PSBEQl9SRUNOTykKKyAgICAgICAgcmVzdWx0ID0gUHlfQnVpbGRWYWx1ZSgiaXMjIiwgKigoaW50KilrcmVjLmRhdGEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsIGRyZWMuc2l6ZSk7CisgICAgZWxzZQorICAgICAgICByZXN1bHQgPSBQeV9CdWlsZFZhbHVlKCJzI3MjIiwga3JlYy5kYXRhLCBrcmVjLnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwgZHJlYy5zaXplKTsKKyAgICBpZiAoZGF0YSAhPSBidWYpIGZyZWUoZGF0YSk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGJzZGRiX3NlcShic2RkYm9iamVjdCAqZHAsIGludCBzZXF1ZW5jZV9yZXF1ZXN0KQogewotCWludCBzdGF0dXM7Ci0JREJUIGtyZWMsIGRyZWM7Ci0JY2hhciAqa2RhdGE9TlVMTCxrYnVmWzQwOTZdOwotCWNoYXIgKmRkYXRhPU5VTEwsZGJ1Zls0MDk2XTsKLQlQeU9iamVjdCAqcmVzdWx0OworICAgIGludCBzdGF0dXM7CisgICAgREJUIGtyZWMsIGRyZWM7CisgICAgY2hhciAqa2RhdGE9TlVMTCxrYnVmWzQwOTZdOworICAgIGNoYXIgKmRkYXRhPU5VTEwsZGJ1Zls0MDk2XTsKKyAgICBQeU9iamVjdCAqcmVzdWx0OwogCi0JY2hlY2tfYnNkZGJvYmplY3Rfb3BlbihkcCwgTlVMTCk7Ci0Ja3JlYy5kYXRhID0gMDsKLQlrcmVjLnNpemUgPSAwOworICAgIGNoZWNrX2JzZGRib2JqZWN0X29wZW4oZHAsIE5VTEwpOworICAgIGtyZWMuZGF0YSA9IDA7CisgICAga3JlYy5zaXplID0gMDsKIAotCUJTRERCX0JHTl9TQVZFKGRwKQotCXN0YXR1cyA9IChkcC0+ZGlfYnNkZGItPnNlcSkoZHAtPmRpX2JzZGRiLCAma3JlYywKLQkJCQkgICAgICZkcmVjLCBzZXF1ZW5jZV9yZXF1ZXN0KTsKLQlpZiAoc3RhdHVzID09IDApIHsKLQkJaWYgKGtyZWMuc2l6ZSA+IHNpemVvZihrYnVmKSkga2RhdGEgPSBtYWxsb2Moa3JlYy5zaXplKTsKLQkJZWxzZSBrZGF0YSA9IGtidWY7Ci0JCWlmIChrZGF0YSAhPSBOVUxMKSBtZW1jcHkoa2RhdGEsa3JlYy5kYXRhLGtyZWMuc2l6ZSk7Ci0JCWlmIChkcmVjLnNpemUgPiBzaXplb2YoZGJ1ZikpIGRkYXRhID0gbWFsbG9jKGRyZWMuc2l6ZSk7Ci0JCWVsc2UgZGRhdGEgPSBkYnVmOwotCQlpZiAoZGRhdGEgIT0gTlVMTCkgbWVtY3B5KGRkYXRhLGRyZWMuZGF0YSxkcmVjLnNpemUpOwotCX0KLQlCU0REQl9FTkRfU0FWRShkcCkKLQlpZiAoc3RhdHVzID09IDApIHsKLQkJaWYgKChrZGF0YSA9PSBOVUxMKSB8fCAoZGRhdGEgPT0gTlVMTCkpIAotCQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JfQotCWVsc2UgeyAKLQkJLyogKHN0YXR1cyAhPSAwKSAqLyAgCi0JCWlmIChzdGF0dXMgPCAwKQotCQkJUHlFcnJfU2V0RnJvbUVycm5vKEJzZGRiRXJyb3IpOwotCQllbHNlCi0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfS2V5RXJyb3IsICJubyBrZXkvZGF0YSBwYWlycyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgQlNEREJfQkdOX1NBVkUoZHApCisgICAgc3RhdHVzID0gKGRwLT5kaV9ic2RkYi0+c2VxKShkcC0+ZGlfYnNkZGIsICZrcmVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRyZWMsIHNlcXVlbmNlX3JlcXVlc3QpOworICAgIGlmIChzdGF0dXMgPT0gMCkgeworICAgICAgICBpZiAoa3JlYy5zaXplID4gc2l6ZW9mKGtidWYpKSBrZGF0YSA9IG1hbGxvYyhrcmVjLnNpemUpOworICAgICAgICBlbHNlIGtkYXRhID0ga2J1ZjsKKyAgICAgICAgaWYgKGtkYXRhICE9IE5VTEwpIG1lbWNweShrZGF0YSxrcmVjLmRhdGEsa3JlYy5zaXplKTsKKyAgICAgICAgaWYgKGRyZWMuc2l6ZSA+IHNpemVvZihkYnVmKSkgZGRhdGEgPSBtYWxsb2MoZHJlYy5zaXplKTsKKyAgICAgICAgZWxzZSBkZGF0YSA9IGRidWY7CisgICAgICAgIGlmIChkZGF0YSAhPSBOVUxMKSBtZW1jcHkoZGRhdGEsZHJlYy5kYXRhLGRyZWMuc2l6ZSk7CisgICAgfQorICAgIEJTRERCX0VORF9TQVZFKGRwKQorICAgIGlmIChzdGF0dXMgPT0gMCkgeworICAgICAgICBpZiAoKGtkYXRhID09IE5VTEwpIHx8IChkZGF0YSA9PSBOVUxMKSkKKyAgICAgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLyogKHN0YXR1cyAhPSAwKSAqLworICAgICAgICBpZiAoc3RhdHVzIDwgMCkKKyAgICAgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhCc2RkYkVycm9yKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0tleUVycm9yLCAibm8ga2V5L2RhdGEgcGFpcnMiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaWYgKGRwLT5kaV90eXBlID09IERCX1JFQ05PKQotCQlyZXN1bHQgPSBQeV9CdWlsZFZhbHVlKCJpcyMiLCAqKChpbnQqKWtkYXRhKSwKLQkJCQkgICAgICAgZGRhdGEsIGRyZWMuc2l6ZSk7Ci0JZWxzZQotCQlyZXN1bHQgPSBQeV9CdWlsZFZhbHVlKCJzI3MjIiwga2RhdGEsIGtyZWMuc2l6ZSwKLQkJCQkgICAgICAgZGRhdGEsIGRyZWMuc2l6ZSk7Ci0JaWYgKGtkYXRhICE9IGtidWYpIGZyZWUoa2RhdGEpOwotCWlmIChkZGF0YSAhPSBkYnVmKSBmcmVlKGRkYXRhKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIGlmIChkcC0+ZGlfdHlwZSA9PSBEQl9SRUNOTykKKyAgICAgICAgcmVzdWx0ID0gUHlfQnVpbGRWYWx1ZSgiaXMjIiwgKigoaW50KilrZGF0YSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGRhdGEsIGRyZWMuc2l6ZSk7CisgICAgZWxzZQorICAgICAgICByZXN1bHQgPSBQeV9CdWlsZFZhbHVlKCJzI3MjIiwga2RhdGEsIGtyZWMuc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZGF0YSwgZHJlYy5zaXplKTsKKyAgICBpZiAoa2RhdGEgIT0ga2J1ZikgZnJlZShrZGF0YSk7CisgICAgaWYgKGRkYXRhICE9IGRidWYpIGZyZWUoZGRhdGEpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBic2RkYl9uZXh0KGJzZGRib2JqZWN0ICpkcCkKIHsKLQlyZXR1cm4gYnNkZGJfc2VxKGRwLCBSX05FWFQpOworICAgIHJldHVybiBic2RkYl9zZXEoZHAsIFJfTkVYVCk7CiB9CiBzdGF0aWMgUHlPYmplY3QgKgogYnNkZGJfcHJldmlvdXMoYnNkZGJvYmplY3QgKmRwKQogewotCXJldHVybiBic2RkYl9zZXEoZHAsIFJfUFJFVik7CisgICAgcmV0dXJuIGJzZGRiX3NlcShkcCwgUl9QUkVWKTsKIH0KIHN0YXRpYyBQeU9iamVjdCAqCiBic2RkYl9maXJzdChic2RkYm9iamVjdCAqZHApCiB7Ci0JcmV0dXJuIGJzZGRiX3NlcShkcCwgUl9GSVJTVCk7CisgICAgcmV0dXJuIGJzZGRiX3NlcShkcCwgUl9GSVJTVCk7CiB9CiBzdGF0aWMgUHlPYmplY3QgKgogYnNkZGJfbGFzdChic2RkYm9iamVjdCAqZHApCiB7Ci0JcmV0dXJuIGJzZGRiX3NlcShkcCwgUl9MQVNUKTsKKyAgICByZXR1cm4gYnNkZGJfc2VxKGRwLCBSX0xBU1QpOwogfQogc3RhdGljIFB5T2JqZWN0ICoKIGJzZGRiX3N5bmMoYnNkZGJvYmplY3QgKmRwKQogewotCWludCBzdGF0dXM7CisgICAgaW50IHN0YXR1czsKIAotCWNoZWNrX2JzZGRib2JqZWN0X29wZW4oZHAsIE5VTEwpOwotCUJTRERCX0JHTl9TQVZFKGRwKQotCXN0YXR1cyA9IChkcC0+ZGlfYnNkZGItPnN5bmMpKGRwLT5kaV9ic2RkYiwgMCk7Ci0JQlNEREJfRU5EX1NBVkUoZHApCi0JaWYgKHN0YXR1cyAhPSAwKSB7Ci0JCVB5RXJyX1NldEZyb21FcnJubyhCc2RkYkVycm9yKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBQeUludF9Gcm9tTG9uZyhzdGF0dXMgPSAwKTsKKyAgICBjaGVja19ic2RkYm9iamVjdF9vcGVuKGRwLCBOVUxMKTsKKyAgICBCU0REQl9CR05fU0FWRShkcCkKKyAgICBzdGF0dXMgPSAoZHAtPmRpX2JzZGRiLT5zeW5jKShkcC0+ZGlfYnNkZGIsIDApOworICAgIEJTRERCX0VORF9TQVZFKGRwKQorICAgIGlmIChzdGF0dXMgIT0gMCkgeworICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oQnNkZGJFcnJvcik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoc3RhdHVzID0gMCk7CiB9CiBzdGF0aWMgUHlNZXRob2REZWYgYnNkZGJfbWV0aG9kc1tdID0gewotCXsiY2xvc2UiLAkJKFB5Q0Z1bmN0aW9uKWJzZGRiX2Nsb3NlLCBNRVRIX05PQVJHU30sCi0JeyJrZXlzIiwJCShQeUNGdW5jdGlvbilic2RkYl9rZXlzLCBNRVRIX05PQVJHU30sCi0JeyJoYXNfa2V5IiwJCShQeUNGdW5jdGlvbilic2RkYl9oYXNfa2V5LCBNRVRIX1ZBUkFSR1N9LAotCXsic2V0X2xvY2F0aW9uIiwJKFB5Q0Z1bmN0aW9uKWJzZGRiX3NldF9sb2NhdGlvbiwgTUVUSF9WQVJBUkdTfSwKLQl7Im5leHQiLAkJKFB5Q0Z1bmN0aW9uKWJzZGRiX25leHQsIE1FVEhfTk9BUkdTfSwKLQl7InByZXZpb3VzIiwJKFB5Q0Z1bmN0aW9uKWJzZGRiX3ByZXZpb3VzLCBNRVRIX05PQVJHU30sCi0JeyJmaXJzdCIsCQkoUHlDRnVuY3Rpb24pYnNkZGJfZmlyc3QsIE1FVEhfTk9BUkdTfSwKLQl7Imxhc3QiLAkJKFB5Q0Z1bmN0aW9uKWJzZGRiX2xhc3QsIE1FVEhfTk9BUkdTfSwKLQl7InN5bmMiLAkJKFB5Q0Z1bmN0aW9uKWJzZGRiX3N5bmMsIE1FVEhfTk9BUkdTfSwKLQl7TlVMTCwJICAgICAgIAlOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7ImNsb3NlIiwgICAgICAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWJzZGRiX2Nsb3NlLCBNRVRIX05PQVJHU30sCisgICAgeyJrZXlzIiwgICAgICAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilic2RkYl9rZXlzLCBNRVRIX05PQVJHU30sCisgICAgeyJoYXNfa2V5IiwgICAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilic2RkYl9oYXNfa2V5LCBNRVRIX1ZBUkFSR1N9LAorICAgIHsic2V0X2xvY2F0aW9uIiwgICAgICAgICAgICAoUHlDRnVuY3Rpb24pYnNkZGJfc2V0X2xvY2F0aW9uLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsibmV4dCIsICAgICAgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pYnNkZGJfbmV4dCwgTUVUSF9OT0FSR1N9LAorICAgIHsicHJldmlvdXMiLCAgICAgICAgKFB5Q0Z1bmN0aW9uKWJzZGRiX3ByZXZpb3VzLCBNRVRIX05PQVJHU30sCisgICAgeyJmaXJzdCIsICAgICAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilic2RkYl9maXJzdCwgTUVUSF9OT0FSR1N9LAorICAgIHsibGFzdCIsICAgICAgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pYnNkZGJfbGFzdCwgTUVUSF9OT0FSR1N9LAorICAgIHsic3luYyIsICAgICAgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pYnNkZGJfc3luYywgTUVUSF9OT0FSR1N9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKgogYnNkZGJfZ2V0YXR0cihQeU9iamVjdCAqZHAsIGNoYXIgKm5hbWUpCiB7Ci0JcmV0dXJuIFB5X0ZpbmRNZXRob2QoYnNkZGJfbWV0aG9kcywgZHAsIG5hbWUpOworICAgIHJldHVybiBQeV9GaW5kTWV0aG9kKGJzZGRiX21ldGhvZHMsIGRwLCBuYW1lKTsKIH0KIAogc3RhdGljIFB5VHlwZU9iamVjdCBCc2RkYnR5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCi0JMCwKLQkiYnNkZGIuYnNkZGIiLAotCXNpemVvZihic2RkYm9iamVjdCksCi0JMCwKLQkoZGVzdHJ1Y3Rvcilic2RkYl9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsCQkJLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKWJzZGRiX2dldGF0dHIsIC8qdHBfZ2V0YXR0ciovCi0JMCwJCQkvKnRwX3NldGF0dHIqLwotCTAsCQkJLyp0cF9jb21wYXJlKi8KLQkwLAkJCS8qdHBfcmVwciovCi0JMCwJCQkvKnRwX2FzX251bWJlciovCi0JMCwJCQkvKnRwX2FzX3NlcXVlbmNlKi8KLQkmYnNkZGJfYXNfbWFwcGluZywJLyp0cF9hc19tYXBwaW5nKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLAorICAgICJic2RkYi5ic2RkYiIsCisgICAgc2l6ZW9mKGJzZGRib2JqZWN0KSwKKyAgICAwLAorICAgIChkZXN0cnVjdG9yKWJzZGRiX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYylic2RkYl9nZXRhdHRyLCAvKnRwX2dldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NvbXBhcmUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3JlcHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX251bWJlciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfc2VxdWVuY2UqLworICAgICZic2RkYl9hc19tYXBwaW5nLCAgICAgICAgICAvKnRwX2FzX21hcHBpbmcqLwogfTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIGJzZGhhc2hvcGVuKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpmaWxlOwotCWNoYXIgKmZsYWcgPSBOVUxMOwotCWludCBmbGFncyA9IE9fUkRPTkxZOwotCWludCBtb2RlID0gMDY2NjsKLQlpbnQgYnNpemUgPSAwOwotCWludCBmZmFjdG9yID0gMDsKLQlpbnQgbmVsZW0gPSAwOwotCWludCBjYWNoZXNpemUgPSAwOwotCWludCBoYXNoID0gMDsgLyogWFhYIGN1cnJlbnRseSBpZ25vcmVkICovCi0JaW50IGxvcmRlciA9IDA7CisgICAgY2hhciAqZmlsZTsKKyAgICBjaGFyICpmbGFnID0gTlVMTDsKKyAgICBpbnQgZmxhZ3MgPSBPX1JET05MWTsKKyAgICBpbnQgbW9kZSA9IDA2NjY7CisgICAgaW50IGJzaXplID0gMDsKKyAgICBpbnQgZmZhY3RvciA9IDA7CisgICAgaW50IG5lbGVtID0gMDsKKyAgICBpbnQgY2FjaGVzaXplID0gMDsKKyAgICBpbnQgaGFzaCA9IDA7IC8qIFhYWCBjdXJyZW50bHkgaWdub3JlZCAqLworICAgIGludCBsb3JkZXIgPSAwOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ6fHNpaWlpaWlpOmhhc2hvcGVuIiwKLQkJCSAgICAgICZmaWxlLCAmZmxhZywgJm1vZGUsCi0JCQkgICAgICAmYnNpemUsICZmZmFjdG9yLCAmbmVsZW0sICZjYWNoZXNpemUsCi0JCQkgICAgICAmaGFzaCwgJmxvcmRlcikpCi0JCXJldHVybiBOVUxMOwotCWlmIChmbGFnICE9IE5VTEwpIHsKLQkJLyogWFhYIG5lZWQgdG8gcGFzcyBPX0VYQ0wsIE9fRVhMT0NLLCBPX05PTkJMT0NLLCBPX1NITE9DSyAqLwotCQlpZiAoZmxhZ1swXSA9PSAncicpCi0JCQlmbGFncyA9IE9fUkRPTkxZOwotCQllbHNlIGlmIChmbGFnWzBdID09ICd3JykKLQkJCWZsYWdzID0gT19SRFdSOwotCQllbHNlIGlmIChmbGFnWzBdID09ICdjJykKLQkJCWZsYWdzID0gT19SRFdSfE9fQ1JFQVQ7Ci0JCWVsc2UgaWYgKGZsYWdbMF0gPT0gJ24nKQotCQkJZmxhZ3MgPSBPX1JEV1J8T19DUkVBVHxPX1RSVU5DOwotCQllbHNlIHsKLQkJCVB5RXJyX1NldFN0cmluZyhCc2RkYkVycm9yLAotCQkJCSJGbGFnIHNob3VsZCBiZWdpbiB3aXRoICdyJywgJ3cnLCAnYycgb3IgJ24nIik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlpZiAoZmxhZ1sxXSA9PSAnbCcpIHsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInp8c2lpaWlpaWk6aGFzaG9wZW4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlsZSwgJmZsYWcsICZtb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYnNpemUsICZmZmFjdG9yLCAmbmVsZW0sICZjYWNoZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZoYXNoLCAmbG9yZGVyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKGZsYWcgIT0gTlVMTCkgeworICAgICAgICAvKiBYWFggbmVlZCB0byBwYXNzIE9fRVhDTCwgT19FWExPQ0ssIE9fTk9OQkxPQ0ssIE9fU0hMT0NLICovCisgICAgICAgIGlmIChmbGFnWzBdID09ICdyJykKKyAgICAgICAgICAgIGZsYWdzID0gT19SRE9OTFk7CisgICAgICAgIGVsc2UgaWYgKGZsYWdbMF0gPT0gJ3cnKQorICAgICAgICAgICAgZmxhZ3MgPSBPX1JEV1I7CisgICAgICAgIGVsc2UgaWYgKGZsYWdbMF0gPT0gJ2MnKQorICAgICAgICAgICAgZmxhZ3MgPSBPX1JEV1J8T19DUkVBVDsKKyAgICAgICAgZWxzZSBpZiAoZmxhZ1swXSA9PSAnbicpCisgICAgICAgICAgICBmbGFncyA9IE9fUkRXUnxPX0NSRUFUfE9fVFJVTkM7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEJzZGRiRXJyb3IsCisgICAgICAgICAgICAgICAgIkZsYWcgc2hvdWxkIGJlZ2luIHdpdGggJ3InLCAndycsICdjJyBvciAnbiciKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGlmIChmbGFnWzFdID09ICdsJykgewogI2lmIGRlZmluZWQoT19FWExPQ0spICYmIGRlZmluZWQoT19TSExPQ0spCi0JCQlpZiAoZmxhZ1swXSA9PSAncicpCi0JCQkJZmxhZ3MgfD0gT19TSExPQ0s7Ci0JCQllbHNlCi0JCQkJZmxhZ3MgfD0gT19FWExPQ0s7CisgICAgICAgICAgICBpZiAoZmxhZ1swXSA9PSAncicpCisgICAgICAgICAgICAgICAgZmxhZ3MgfD0gT19TSExPQ0s7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZmxhZ3MgfD0gT19FWExPQ0s7CiAjZWxzZQotCQkJUHlFcnJfU2V0U3RyaW5nKEJzZGRiRXJyb3IsCi0JCQkJICAgICAibG9ja2luZyBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgcGxhdGZvcm0iKTsKLQkJCXJldHVybiBOVUxMOworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEJzZGRiRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgImxvY2tpbmcgbm90IHN1cHBvcnRlZCBvbiB0aGlzIHBsYXRmb3JtIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKICNlbmRpZgotCQl9Ci0JfQotCXJldHVybiBuZXdkYmhhc2hvYmplY3QoZmlsZSwgZmxhZ3MsIG1vZGUsCi0JCQkgICAgICAgYnNpemUsIGZmYWN0b3IsIG5lbGVtLCBjYWNoZXNpemUsIGhhc2gsIGxvcmRlcik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG5ld2RiaGFzaG9iamVjdChmaWxlLCBmbGFncywgbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJzaXplLCBmZmFjdG9yLCBuZWxlbSwgY2FjaGVzaXplLCBoYXNoLCBsb3JkZXIpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYnNkYnRvcGVuKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpmaWxlOwotCWNoYXIgKmZsYWcgPSBOVUxMOwotCWludCBmbGFncyA9IE9fUkRPTkxZOwotCWludCBtb2RlID0gMDY2NjsKLQlpbnQgY2FjaGVzaXplID0gMDsKLQlpbnQgbWF4a2V5cGFnZSA9IDA7Ci0JaW50IG1pbmtleXBhZ2UgPSAwOwotCWludCBidGZsYWdzID0gMDsKLQl1bnNpZ25lZCBpbnQgcHNpemUgPSAwOwotCWludCBsb3JkZXIgPSAwOworICAgIGNoYXIgKmZpbGU7CisgICAgY2hhciAqZmxhZyA9IE5VTEw7CisgICAgaW50IGZsYWdzID0gT19SRE9OTFk7CisgICAgaW50IG1vZGUgPSAwNjY2OworICAgIGludCBjYWNoZXNpemUgPSAwOworICAgIGludCBtYXhrZXlwYWdlID0gMDsKKyAgICBpbnQgbWlua2V5cGFnZSA9IDA7CisgICAgaW50IGJ0ZmxhZ3MgPSAwOworICAgIHVuc2lnbmVkIGludCBwc2l6ZSA9IDA7CisgICAgaW50IGxvcmRlciA9IDA7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInp8c2lpaWlpaWk6YnRvcGVuIiwKLQkJCSAgICAgICZmaWxlLCAmZmxhZywgJm1vZGUsCi0JCQkgICAgICAmYnRmbGFncywgJmNhY2hlc2l6ZSwgJm1heGtleXBhZ2UsICZtaW5rZXlwYWdlLAotCQkJICAgICAgJnBzaXplLCAmbG9yZGVyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKGZsYWcgIT0gTlVMTCkgewotCQkvKiBYWFggbmVlZCB0byBwYXNzIE9fRVhDTCwgT19FWExPQ0ssIE9fTk9OQkxPQ0ssIE9fU0hMT0NLICovCi0JCWlmIChmbGFnWzBdID09ICdyJykKLQkJCWZsYWdzID0gT19SRE9OTFk7Ci0JCWVsc2UgaWYgKGZsYWdbMF0gPT0gJ3cnKQotCQkJZmxhZ3MgPSBPX1JEV1I7Ci0JCWVsc2UgaWYgKGZsYWdbMF0gPT0gJ2MnKQotCQkJZmxhZ3MgPSBPX1JEV1J8T19DUkVBVDsKLQkJZWxzZSBpZiAoZmxhZ1swXSA9PSAnbicpCi0JCQlmbGFncyA9IE9fUkRXUnxPX0NSRUFUfE9fVFJVTkM7Ci0JCWVsc2UgewotCQkJUHlFcnJfU2V0U3RyaW5nKEJzZGRiRXJyb3IsCi0JCQkgICAgICAgIkZsYWcgc2hvdWxkIGJlZ2luIHdpdGggJ3InLCAndycsICdjJyBvciAnbiciKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWlmIChmbGFnWzFdID09ICdsJykgeworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAienxzaWlpaWlpaTpidG9wZW4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlsZSwgJmZsYWcsICZtb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYnRmbGFncywgJmNhY2hlc2l6ZSwgJm1heGtleXBhZ2UsICZtaW5rZXlwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcHNpemUsICZsb3JkZXIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoZmxhZyAhPSBOVUxMKSB7CisgICAgICAgIC8qIFhYWCBuZWVkIHRvIHBhc3MgT19FWENMLCBPX0VYTE9DSywgT19OT05CTE9DSywgT19TSExPQ0sgKi8KKyAgICAgICAgaWYgKGZsYWdbMF0gPT0gJ3InKQorICAgICAgICAgICAgZmxhZ3MgPSBPX1JET05MWTsKKyAgICAgICAgZWxzZSBpZiAoZmxhZ1swXSA9PSAndycpCisgICAgICAgICAgICBmbGFncyA9IE9fUkRXUjsKKyAgICAgICAgZWxzZSBpZiAoZmxhZ1swXSA9PSAnYycpCisgICAgICAgICAgICBmbGFncyA9IE9fUkRXUnxPX0NSRUFUOworICAgICAgICBlbHNlIGlmIChmbGFnWzBdID09ICduJykKKyAgICAgICAgICAgIGZsYWdzID0gT19SRFdSfE9fQ1JFQVR8T19UUlVOQzsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQnNkZGJFcnJvciwKKyAgICAgICAgICAgICAgICAgICAiRmxhZyBzaG91bGQgYmVnaW4gd2l0aCAncicsICd3JywgJ2MnIG9yICduJyIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZsYWdbMV0gPT0gJ2wnKSB7CiAjaWYgZGVmaW5lZChPX0VYTE9DSykgJiYgZGVmaW5lZChPX1NITE9DSykKLQkJCWlmIChmbGFnWzBdID09ICdyJykKLQkJCQlmbGFncyB8PSBPX1NITE9DSzsKLQkJCWVsc2UKLQkJCQlmbGFncyB8PSBPX0VYTE9DSzsKKyAgICAgICAgICAgIGlmIChmbGFnWzBdID09ICdyJykKKyAgICAgICAgICAgICAgICBmbGFncyB8PSBPX1NITE9DSzsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBmbGFncyB8PSBPX0VYTE9DSzsKICNlbHNlCi0JCQlQeUVycl9TZXRTdHJpbmcoQnNkZGJFcnJvciwKLQkJCQkgICAgImxvY2tpbmcgbm90IHN1cHBvcnRlZCBvbiB0aGlzIHBsYXRmb3JtIik7Ci0JCQlyZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhCc2RkYkVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImxvY2tpbmcgbm90IHN1cHBvcnRlZCBvbiB0aGlzIHBsYXRmb3JtIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKICNlbmRpZgotCQl9Ci0JfQotCXJldHVybiBuZXdkYmJ0b2JqZWN0KGZpbGUsIGZsYWdzLCBtb2RlLAotCQkJICAgICBidGZsYWdzLCBjYWNoZXNpemUsIG1heGtleXBhZ2UsIG1pbmtleXBhZ2UsCi0JCQkgICAgIHBzaXplLCBsb3JkZXIpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBuZXdkYmJ0b2JqZWN0KGZpbGUsIGZsYWdzLCBtb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJ0ZmxhZ3MsIGNhY2hlc2l6ZSwgbWF4a2V5cGFnZSwgbWlua2V5cGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwc2l6ZSwgbG9yZGVyKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGJzZHJub3BlbihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqZmlsZTsKLQljaGFyICpmbGFnID0gTlVMTDsKLQlpbnQgZmxhZ3MgPSBPX1JET05MWTsKLQlpbnQgbW9kZSA9IDA2NjY7Ci0JaW50IGNhY2hlc2l6ZSA9IDA7Ci0JaW50IHJuZmxhZ3MgPSAwOwotCXVuc2lnbmVkIGludCBwc2l6ZSA9IDA7Ci0JaW50IGxvcmRlciA9IDA7Ci0Jc2l6ZV90IHJlY2xlbiA9IDA7Ci0JY2hhciAgKmJ2YWwgPSAiIjsKLQljaGFyICpiZm5hbWUgPSBOVUxMOworICAgIGNoYXIgKmZpbGU7CisgICAgY2hhciAqZmxhZyA9IE5VTEw7CisgICAgaW50IGZsYWdzID0gT19SRE9OTFk7CisgICAgaW50IG1vZGUgPSAwNjY2OworICAgIGludCBjYWNoZXNpemUgPSAwOworICAgIGludCBybmZsYWdzID0gMDsKKyAgICB1bnNpZ25lZCBpbnQgcHNpemUgPSAwOworICAgIGludCBsb3JkZXIgPSAwOworICAgIHNpemVfdCByZWNsZW4gPSAwOworICAgIGNoYXIgICpidmFsID0gIiI7CisgICAgY2hhciAqYmZuYW1lID0gTlVMTDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAienxzaWlpaWlpc3M6cm5vcGVuIiwKLQkJCSAgICAgICZmaWxlLCAmZmxhZywgJm1vZGUsCi0JCQkgICAgICAmcm5mbGFncywgJmNhY2hlc2l6ZSwgJnBzaXplLCAmbG9yZGVyLAotCQkJICAgICAgJnJlY2xlbiwgJmJ2YWwsICZiZm5hbWUpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInp8c2lpaWlpaXNzOnJub3BlbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWxlLCAmZmxhZywgJm1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZybmZsYWdzLCAmY2FjaGVzaXplLCAmcHNpemUsICZsb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWNsZW4sICZidmFsLCAmYmZuYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoZmxhZyAhPSBOVUxMKSB7Ci0JCS8qIFhYWCBuZWVkIHRvIHBhc3MgT19FWENMLCBPX0VYTE9DSywgT19OT05CTE9DSywgT19TSExPQ0sgKi8KLQkJaWYgKGZsYWdbMF0gPT0gJ3InKQotCQkJZmxhZ3MgPSBPX1JET05MWTsKLQkJZWxzZSBpZiAoZmxhZ1swXSA9PSAndycpCi0JCQlmbGFncyA9IE9fUkRXUjsKLQkJZWxzZSBpZiAoZmxhZ1swXSA9PSAnYycpCi0JCQlmbGFncyA9IE9fUkRXUnxPX0NSRUFUOwotCQllbHNlIGlmIChmbGFnWzBdID09ICduJykKLQkJCWZsYWdzID0gT19SRFdSfE9fQ1JFQVR8T19UUlVOQzsKLQkJZWxzZSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoQnNkZGJFcnJvciwKLQkJCSAgICAgICAiRmxhZyBzaG91bGQgYmVnaW4gd2l0aCAncicsICd3JywgJ2MnIG9yICduJyIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJaWYgKGZsYWdbMV0gPT0gJ2wnKSB7CisgICAgaWYgKGZsYWcgIT0gTlVMTCkgeworICAgICAgICAvKiBYWFggbmVlZCB0byBwYXNzIE9fRVhDTCwgT19FWExPQ0ssIE9fTk9OQkxPQ0ssIE9fU0hMT0NLICovCisgICAgICAgIGlmIChmbGFnWzBdID09ICdyJykKKyAgICAgICAgICAgIGZsYWdzID0gT19SRE9OTFk7CisgICAgICAgIGVsc2UgaWYgKGZsYWdbMF0gPT0gJ3cnKQorICAgICAgICAgICAgZmxhZ3MgPSBPX1JEV1I7CisgICAgICAgIGVsc2UgaWYgKGZsYWdbMF0gPT0gJ2MnKQorICAgICAgICAgICAgZmxhZ3MgPSBPX1JEV1J8T19DUkVBVDsKKyAgICAgICAgZWxzZSBpZiAoZmxhZ1swXSA9PSAnbicpCisgICAgICAgICAgICBmbGFncyA9IE9fUkRXUnxPX0NSRUFUfE9fVFJVTkM7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEJzZGRiRXJyb3IsCisgICAgICAgICAgICAgICAgICAgIkZsYWcgc2hvdWxkIGJlZ2luIHdpdGggJ3InLCAndycsICdjJyBvciAnbiciKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGlmIChmbGFnWzFdID09ICdsJykgewogI2lmIGRlZmluZWQoT19FWExPQ0spICYmIGRlZmluZWQoT19TSExPQ0spCi0JCQlpZiAoZmxhZ1swXSA9PSAncicpCi0JCQkJZmxhZ3MgfD0gT19TSExPQ0s7Ci0JCQllbHNlCi0JCQkJZmxhZ3MgfD0gT19FWExPQ0s7CisgICAgICAgICAgICBpZiAoZmxhZ1swXSA9PSAncicpCisgICAgICAgICAgICAgICAgZmxhZ3MgfD0gT19TSExPQ0s7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZmxhZ3MgfD0gT19FWExPQ0s7CiAjZWxzZQotCQkJUHlFcnJfU2V0U3RyaW5nKEJzZGRiRXJyb3IsCi0JCQkJICAgICJsb2NraW5nIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBwbGF0Zm9ybSIpOwotCQkJcmV0dXJuIE5VTEw7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQnNkZGJFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJsb2NraW5nIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBwbGF0Zm9ybSIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAjZW5kaWYKLQkJfQotCQllbHNlIGlmIChmbGFnWzFdICE9ICdcMCcpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhCc2RkYkVycm9yLAotCQkJCSAgICAgICAiRmxhZyBjaGFyIDIgc2hvdWxkIGJlICdsJyBvciBhYnNlbnQiKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQotCXJldHVybiBuZXdkYnJub2JqZWN0KGZpbGUsIGZsYWdzLCBtb2RlLCBybmZsYWdzLCBjYWNoZXNpemUsCi0JCQkgICAgIHBzaXplLCBsb3JkZXIsIHJlY2xlbiwgYnZhbFswXSwgYmZuYW1lKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChmbGFnWzFdICE9ICdcMCcpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhCc2RkYkVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZsYWcgY2hhciAyIHNob3VsZCBiZSAnbCcgb3IgYWJzZW50Iik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbmV3ZGJybm9iamVjdChmaWxlLCBmbGFncywgbW9kZSwgcm5mbGFncywgY2FjaGVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBzaXplLCBsb3JkZXIsIHJlY2xlbiwgYnZhbFswXSwgYmZuYW1lKTsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIGJzZGRibW9kdWxlX21ldGhvZHNbXSA9IHsKLQl7Imhhc2hvcGVuIiwJKFB5Q0Z1bmN0aW9uKWJzZGhhc2hvcGVuLCBNRVRIX1ZBUkFSR1N9LAotCXsiYnRvcGVuIiwJKFB5Q0Z1bmN0aW9uKWJzZGJ0b3BlbiwgTUVUSF9WQVJBUkdTfSwKLQl7InJub3BlbiIsCShQeUNGdW5jdGlvbilic2Rybm9wZW4sIE1FVEhfVkFSQVJHU30sCi0JLyogc3RyaWN0bHkgZm9yIHVzZSBieSBkYmhoYXNoISEhICovCi0JeyJvcGVuIiwJKFB5Q0Z1bmN0aW9uKWJzZGhhc2hvcGVuLCBNRVRIX1ZBUkFSR1N9LAotCXswLAkJMH0sCisgICAgeyJoYXNob3BlbiIsICAgICAgICAoUHlDRnVuY3Rpb24pYnNkaGFzaG9wZW4sIE1FVEhfVkFSQVJHU30sCisgICAgeyJidG9wZW4iLCAgICAgICAgICAoUHlDRnVuY3Rpb24pYnNkYnRvcGVuLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsicm5vcGVuIiwgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWJzZHJub3BlbiwgTUVUSF9WQVJBUkdTfSwKKyAgICAvKiBzdHJpY3RseSBmb3IgdXNlIGJ5IGRiaGhhc2ghISEgKi8KKyAgICB7Im9wZW4iLCAgICAgICAgICAgIChQeUNGdW5jdGlvbilic2RoYXNob3BlbiwgTUVUSF9WQVJBUkdTfSwKKyAgICB7MCwgICAgICAgICAgICAgICAgIDB9LAogfTsKIAogUHlNT0RJTklUX0ZVTkMKIGluaXRic2RkYjE4NSh2b2lkKSB7Ci0JUHlPYmplY3QgKm0sICpkOworICAgIFB5T2JqZWN0ICptLCAqZDsKIAogICAgIGlmIChQeUVycl9XYXJuUHkzaygidGhlIGJzZGRiMTg1IG1vZHVsZSBoYXMgYmVlbiByZW1vdmVkIGluICIKICAgICAgICAgICAgICAgICAgICAgICAgIlB5dGhvbiAzLjAiLCAyKSA8IDApCi0gICAgICAgIHJldHVybjsgICAgCisgICAgcmV0dXJuOwogCi0JQnNkZGJ0eXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7Ci0JbSA9IFB5X0luaXRNb2R1bGUoImJzZGRiMTg1IiwgYnNkZGJtb2R1bGVfbWV0aG9kcyk7Ci0JaWYgKG0gPT0gTlVMTCkKLQkJcmV0dXJuOwotCWQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOwotCUJzZGRiRXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oImJzZGRiLmVycm9yIiwgTlVMTCwgTlVMTCk7Ci0JaWYgKEJzZGRiRXJyb3IgIT0gTlVMTCkKLQkJUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgImVycm9yIiwgQnNkZGJFcnJvcik7CisgICAgQnNkZGJ0eXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7CisgICAgbSA9IFB5X0luaXRNb2R1bGUoImJzZGRiMTg1IiwgYnNkZGJtb2R1bGVfbWV0aG9kcyk7CisgICAgaWYgKG0gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOworICAgIGQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOworICAgIEJzZGRiRXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oImJzZGRiLmVycm9yIiwgTlVMTCwgTlVMTCk7CisgICAgaWYgKEJzZGRiRXJyb3IgIT0gTlVMTCkKKyAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgImVycm9yIiwgQnNkZGJFcnJvcik7CiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL2J6Mm1vZHVsZS5jIGIvTW9kdWxlcy9iejJtb2R1bGUuYwppbmRleCBhNTNkMWE1Li5kY2I1ZGM2IDEwMDY0NAotLS0gYS9Nb2R1bGVzL2J6Mm1vZHVsZS5jCisrKyBiL01vZHVsZXMvYnoybW9kdWxlLmMKQEAgLTQxLDIwICs0MSwyMCBAQAogI2RlZmluZSBNT0RFX1JFQURfRU9GIDIKICNkZWZpbmUgTU9ERV9XUklURSAgICAzCiAKLSNkZWZpbmUgQloyRmlsZU9iamVjdF9DaGVjayh2KQkoUHlfVFlQRSh2KSA9PSAmQloyRmlsZV9UeXBlKQorI2RlZmluZSBCWjJGaWxlT2JqZWN0X0NoZWNrKHYpICAoUHlfVFlQRSh2KSA9PSAmQloyRmlsZV9UeXBlKQogCiAKICNpZmRlZiBCWl9DT05GSUdfRVJST1IKIAogI2lmIFNJWkVPRl9MT05HID49IDgKICNkZWZpbmUgQlpTX1RPVEFMX09VVChienMpIFwKLQkoKChsb25nKWJ6cy0+dG90YWxfb3V0X2hpMzIgPDwgMzIpICsgYnpzLT50b3RhbF9vdXRfbG8zMikKKyAgICAoKChsb25nKWJ6cy0+dG90YWxfb3V0X2hpMzIgPDwgMzIpICsgYnpzLT50b3RhbF9vdXRfbG8zMikKICNlbGlmIFNJWkVPRl9MT05HX0xPTkcgPj0gOAogI2RlZmluZSBCWlNfVE9UQUxfT1VUKGJ6cykgXAotCSgoKFBZX0xPTkdfTE9ORylienMtPnRvdGFsX291dF9oaTMyIDw8IDMyKSArIGJ6cy0+dG90YWxfb3V0X2xvMzIpCisgICAgKCgoUFlfTE9OR19MT05HKWJ6cy0+dG90YWxfb3V0X2hpMzIgPDwgMzIpICsgYnpzLT50b3RhbF9vdXRfbG8zMikKICNlbHNlCiAjZGVmaW5lIEJaU19UT1RBTF9PVVQoYnpzKSBcCi0JYnpzLT50b3RhbF9vdXRfbG8zMgorICAgIGJ6cy0+dG90YWxfb3V0X2xvMzIKICNlbmRpZgogCiAjZWxzZSAvKiAhIEJaX0NPTkZJR19FUlJPUiAqLwpAQCAtNzksMTEgKzc5LDExIEBACiAKICNpZmRlZiBXSVRIX1RIUkVBRAogI2RlZmluZSBBQ1FVSVJFX0xPQ0sob2JqKSBkbyB7IFwKLQlpZiAoIVB5VGhyZWFkX2FjcXVpcmVfbG9jayhvYmotPmxvY2ssIDApKSB7IFwKLQkJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUyBcCi0JCVB5VGhyZWFkX2FjcXVpcmVfbG9jayhvYmotPmxvY2ssIDEpOyBcCi0JCVB5X0VORF9BTExPV19USFJFQURTIFwKLQl9IH0gd2hpbGUoMCkKKyAgICBpZiAoIVB5VGhyZWFkX2FjcXVpcmVfbG9jayhvYmotPmxvY2ssIDApKSB7IFwKKyAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUyBcCisgICAgICAgIFB5VGhyZWFkX2FjcXVpcmVfbG9jayhvYmotPmxvY2ssIDEpOyBcCisgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTIFwKKyAgICB9IH0gd2hpbGUoMCkKICNkZWZpbmUgUkVMRUFTRV9MT0NLKG9iaikgUHlUaHJlYWRfcmVsZWFzZV9sb2NrKG9iai0+bG9jaykKICNlbHNlCiAjZGVmaW5lIEFDUVVJUkVfTE9DSyhvYmopCkBAIC05MSw1MyArOTEsNTMgQEAKICNlbmRpZgogCiAvKiBCaXRzIGluIGZfbmV3bGluZXR5cGVzICovCi0jZGVmaW5lIE5FV0xJTkVfVU5LTk9XTgkwCS8qIE5vIG5ld2xpbmUgc2VlbiwgeWV0ICovCi0jZGVmaW5lIE5FV0xJTkVfQ1IgMQkJLyogXHIgbmV3bGluZSBzZWVuICovCi0jZGVmaW5lIE5FV0xJTkVfTEYgMgkJLyogXG4gbmV3bGluZSBzZWVuICovCi0jZGVmaW5lIE5FV0xJTkVfQ1JMRiA0CQkvKiBcclxuIG5ld2xpbmUgc2VlbiAqLworI2RlZmluZSBORVdMSU5FX1VOS05PV04gMCAgICAgICAvKiBObyBuZXdsaW5lIHNlZW4sIHlldCAqLworI2RlZmluZSBORVdMSU5FX0NSIDEgICAgICAgICAgICAvKiBcciBuZXdsaW5lIHNlZW4gKi8KKyNkZWZpbmUgTkVXTElORV9MRiAyICAgICAgICAgICAgLyogXG4gbmV3bGluZSBzZWVuICovCisjZGVmaW5lIE5FV0xJTkVfQ1JMRiA0ICAgICAgICAgIC8qIFxyXG4gbmV3bGluZSBzZWVuICovCiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogLyogU3RydWN0dXJlIGRlZmluaXRpb25zLiAqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCVB5T2JqZWN0ICpmaWxlOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBQeU9iamVjdCAqZmlsZTsKIAotCWNoYXIqIGZfYnVmOwkJLyogQWxsb2NhdGVkIHJlYWRhaGVhZCBidWZmZXIgKi8KLQljaGFyKiBmX2J1ZmVuZDsJCS8qIFBvaW50cyBhZnRlciBsYXN0IG9jY3VwaWVkIHBvc2l0aW9uICovCi0JY2hhciogZl9idWZwdHI7CQkvKiBDdXJyZW50IGJ1ZmZlciBwb3NpdGlvbiAqLworICAgIGNoYXIqIGZfYnVmOyAgICAgICAgICAgICAgICAvKiBBbGxvY2F0ZWQgcmVhZGFoZWFkIGJ1ZmZlciAqLworICAgIGNoYXIqIGZfYnVmZW5kOyAgICAgICAgICAgICAvKiBQb2ludHMgYWZ0ZXIgbGFzdCBvY2N1cGllZCBwb3NpdGlvbiAqLworICAgIGNoYXIqIGZfYnVmcHRyOyAgICAgICAgICAgICAvKiBDdXJyZW50IGJ1ZmZlciBwb3NpdGlvbiAqLwogCi0JaW50IGZfc29mdHNwYWNlOwkvKiBGbGFnIHVzZWQgYnkgJ3ByaW50JyBjb21tYW5kICovCisgICAgaW50IGZfc29mdHNwYWNlOyAgICAgICAgICAgIC8qIEZsYWcgdXNlZCBieSAncHJpbnQnIGNvbW1hbmQgKi8KIAotCWludCBmX3VuaXZfbmV3bGluZTsJLyogSGFuZGxlIGFueSBuZXdsaW5lIGNvbnZlbnRpb24gKi8KLQlpbnQgZl9uZXdsaW5ldHlwZXM7CS8qIFR5cGVzIG9mIG5ld2xpbmVzIHNlZW4gKi8KLQlpbnQgZl9za2lwbmV4dGxmOwkvKiBTa2lwIG5leHQgXG4gKi8KKyAgICBpbnQgZl91bml2X25ld2xpbmU7ICAgICAgICAgLyogSGFuZGxlIGFueSBuZXdsaW5lIGNvbnZlbnRpb24gKi8KKyAgICBpbnQgZl9uZXdsaW5ldHlwZXM7ICAgICAgICAgLyogVHlwZXMgb2YgbmV3bGluZXMgc2VlbiAqLworICAgIGludCBmX3NraXBuZXh0bGY7ICAgICAgICAgICAvKiBTa2lwIG5leHQgXG4gKi8KIAotCUJaRklMRSAqZnA7Ci0JaW50IG1vZGU7Ci0JUHlfb2ZmX3QgcG9zOwotCVB5X29mZl90IHNpemU7CisgICAgQlpGSUxFICpmcDsKKyAgICBpbnQgbW9kZTsKKyAgICBQeV9vZmZfdCBwb3M7CisgICAgUHlfb2ZmX3Qgc2l6ZTsKICNpZmRlZiBXSVRIX1RIUkVBRAotCVB5VGhyZWFkX3R5cGVfbG9jayBsb2NrOworICAgIFB5VGhyZWFkX3R5cGVfbG9jayBsb2NrOwogI2VuZGlmCiB9IEJaMkZpbGVPYmplY3Q7CiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JYnpfc3RyZWFtIGJ6czsKLQlpbnQgcnVubmluZzsKKyAgICBQeU9iamVjdF9IRUFECisgICAgYnpfc3RyZWFtIGJ6czsKKyAgICBpbnQgcnVubmluZzsKICNpZmRlZiBXSVRIX1RIUkVBRAotCVB5VGhyZWFkX3R5cGVfbG9jayBsb2NrOworICAgIFB5VGhyZWFkX3R5cGVfbG9jayBsb2NrOwogI2VuZGlmCiB9IEJaMkNvbXBPYmplY3Q7CiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JYnpfc3RyZWFtIGJ6czsKLQlpbnQgcnVubmluZzsKLQlQeU9iamVjdCAqdW51c2VkX2RhdGE7CisgICAgUHlPYmplY3RfSEVBRAorICAgIGJ6X3N0cmVhbSBienM7CisgICAgaW50IHJ1bm5pbmc7CisgICAgUHlPYmplY3QgKnVudXNlZF9kYXRhOwogI2lmZGVmIFdJVEhfVEhSRUFECi0JUHlUaHJlYWRfdHlwZV9sb2NrIGxvY2s7CisgICAgUHlUaHJlYWRfdHlwZV9sb2NrIGxvY2s7CiAjZW5kaWYKIH0gQloyRGVjb21wT2JqZWN0OwogCkBAIC0xNDcsNTkgKzE0Nyw1OSBAQAogc3RhdGljIGludAogVXRpbF9DYXRjaEJaMkVycm9yKGludCBiemVycm9yKQogewotCWludCByZXQgPSAwOwotCXN3aXRjaChiemVycm9yKSB7Ci0JCWNhc2UgQlpfT0s6Ci0JCWNhc2UgQlpfU1RSRUFNX0VORDoKLQkJCWJyZWFrOworICAgIGludCByZXQgPSAwOworICAgIHN3aXRjaChiemVycm9yKSB7CisgICAgICAgIGNhc2UgQlpfT0s6CisgICAgICAgIGNhc2UgQlpfU1RSRUFNX0VORDoKKyAgICAgICAgICAgIGJyZWFrOwogCiAjaWZkZWYgQlpfQ09ORklHX0VSUk9SCi0JCWNhc2UgQlpfQ09ORklHX0VSUk9SOgotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAotCQkJCQkidGhlIGJ6MiBsaWJyYXJ5IHdhcyBub3QgY29tcGlsZWQgIgotCQkJCQkiY29ycmVjdGx5Iik7Ci0JCQlyZXQgPSAxOwotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgQlpfQ09ORklHX0VSUk9SOgorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGUgYnoyIGxpYnJhcnkgd2FzIG5vdCBjb21waWxlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvcnJlY3RseSIpOworICAgICAgICAgICAgcmV0ID0gMTsKKyAgICAgICAgICAgIGJyZWFrOwogI2VuZGlmCiAKLQkJY2FzZSBCWl9QQVJBTV9FUlJPUjoKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCQkidGhlIGJ6MiBsaWJyYXJ5IGhhcyByZWNlaXZlZCB3cm9uZyAiCi0JCQkJCSJwYXJhbWV0ZXJzIik7Ci0JCQlyZXQgPSAxOwotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgQlpfUEFSQU1fRVJST1I6CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhlIGJ6MiBsaWJyYXJ5IGhhcyByZWNlaXZlZCB3cm9uZyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcmFtZXRlcnMiKTsKKyAgICAgICAgICAgIHJldCA9IDE7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIEJaX01FTV9FUlJPUjoKLQkJCVB5RXJyX05vTWVtb3J5KCk7Ci0JCQlyZXQgPSAxOwotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgQlpfTUVNX0VSUk9SOgorICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgICAgIHJldCA9IDE7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIEJaX0RBVEFfRVJST1I6Ci0JCWNhc2UgQlpfREFUQV9FUlJPUl9NQUdJQzoKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JT0Vycm9yLCAiaW52YWxpZCBkYXRhIHN0cmVhbSIpOwotCQkJcmV0ID0gMTsKLQkJCWJyZWFrOworICAgICAgICBjYXNlIEJaX0RBVEFfRVJST1I6CisgICAgICAgIGNhc2UgQlpfREFUQV9FUlJPUl9NQUdJQzoKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JT0Vycm9yLCAiaW52YWxpZCBkYXRhIHN0cmVhbSIpOworICAgICAgICAgICAgcmV0ID0gMTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgQlpfSU9fRVJST1I6Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSU9FcnJvciwgInVua25vd24gSU8gZXJyb3IiKTsKLQkJCXJldCA9IDE7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBCWl9JT19FUlJPUjoKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JT0Vycm9yLCAidW5rbm93biBJTyBlcnJvciIpOworICAgICAgICAgICAgcmV0ID0gMTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgQlpfVU5FWFBFQ1RFRF9FT0Y6Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfRU9GRXJyb3IsCi0JCQkJCSJjb21wcmVzc2VkIGZpbGUgZW5kZWQgYmVmb3JlIHRoZSAiCi0JCQkJCSJsb2dpY2FsIGVuZC1vZi1zdHJlYW0gd2FzIGRldGVjdGVkIik7Ci0JCQlyZXQgPSAxOwotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgQlpfVU5FWFBFQ1RFRF9FT0Y6CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfRU9GRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbXByZXNzZWQgZmlsZSBlbmRlZCBiZWZvcmUgdGhlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibG9naWNhbCBlbmQtb2Ytc3RyZWFtIHdhcyBkZXRlY3RlZCIpOworICAgICAgICAgICAgcmV0ID0gMTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgQlpfU0VRVUVOQ0VfRVJST1I6Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAotCQkJCQkid3Jvbmcgc2VxdWVuY2Ugb2YgYnoyIGxpYnJhcnkgIgotCQkJCQkiY29tbWFuZHMgdXNlZCIpOwotCQkJcmV0ID0gMTsKLQkJCWJyZWFrOwotCX0KLQlyZXR1cm4gcmV0OworICAgICAgICBjYXNlIEJaX1NFUVVFTkNFX0VSUk9SOgorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAid3Jvbmcgc2VxdWVuY2Ugb2YgYnoyIGxpYnJhcnkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb21tYW5kcyB1c2VkIik7CisgICAgICAgICAgICByZXQgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiByZXQ7CiB9CiAKICNpZiBCVUZTSVogPCA4MTkyCkBAIC0yMTgsMjI4ICsyMTgsMjI4IEBACiBzdGF0aWMgc2l6ZV90CiBVdGlsX05ld0J1ZmZlclNpemUoc2l6ZV90IGN1cnJlbnRzaXplKQogewotCWlmIChjdXJyZW50c2l6ZSA+IFNNQUxMQ0hVTkspIHsKLQkJLyogS2VlcCBkb3VibGluZyB1bnRpbCB3ZSByZWFjaCBCSUdDSFVOSzsKLQkJICAgdGhlbiBrZWVwIGFkZGluZyBCSUdDSFVOSy4gKi8KLQkJaWYgKGN1cnJlbnRzaXplIDw9IEJJR0NIVU5LKQotCQkJcmV0dXJuIGN1cnJlbnRzaXplICsgY3VycmVudHNpemU7Ci0JCWVsc2UKLQkJCXJldHVybiBjdXJyZW50c2l6ZSArIEJJR0NIVU5LOwotCX0KLQlyZXR1cm4gY3VycmVudHNpemUgKyBTTUFMTENIVU5LOworICAgIGlmIChjdXJyZW50c2l6ZSA+IFNNQUxMQ0hVTkspIHsKKyAgICAgICAgLyogS2VlcCBkb3VibGluZyB1bnRpbCB3ZSByZWFjaCBCSUdDSFVOSzsKKyAgICAgICAgICAgdGhlbiBrZWVwIGFkZGluZyBCSUdDSFVOSy4gKi8KKyAgICAgICAgaWYgKGN1cnJlbnRzaXplIDw9IEJJR0NIVU5LKQorICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRzaXplICsgY3VycmVudHNpemU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBjdXJyZW50c2l6ZSArIEJJR0NIVU5LOworICAgIH0KKyAgICByZXR1cm4gY3VycmVudHNpemUgKyBTTUFMTENIVU5LOwogfQogCiAvKiBUaGlzIGlzIGEgaGFja2VkIHZlcnNpb24gb2YgUHl0aG9uJ3MgZmlsZW9iamVjdC5jOmdldF9saW5lKCkuICovCiBzdGF0aWMgUHlPYmplY3QgKgogVXRpbF9HZXRMaW5lKEJaMkZpbGVPYmplY3QgKmYsIGludCBuKQogewotCWNoYXIgYzsKLQljaGFyICpidWYsICplbmQ7Ci0Jc2l6ZV90IHRvdGFsX3Zfc2l6ZTsJLyogdG90YWwgIyBvZiBzbG90cyBpbiBidWZmZXIgKi8KLQlzaXplX3QgdXNlZF92X3NpemU7CS8qICMgdXNlZCBzbG90cyBpbiBidWZmZXIgKi8KLQlzaXplX3QgaW5jcmVtZW50OyAgICAgICAvKiBhbW91bnQgdG8gaW5jcmVtZW50IHRoZSBidWZmZXIgKi8KLQlQeU9iamVjdCAqdjsKLQlpbnQgYnplcnJvcjsKLQlpbnQgYnl0ZXNfcmVhZDsKLQlpbnQgbmV3bGluZXR5cGVzID0gZi0+Zl9uZXdsaW5ldHlwZXM7Ci0JaW50IHNraXBuZXh0bGYgPSBmLT5mX3NraXBuZXh0bGY7Ci0JaW50IHVuaXZfbmV3bGluZSA9IGYtPmZfdW5pdl9uZXdsaW5lOworICAgIGNoYXIgYzsKKyAgICBjaGFyICpidWYsICplbmQ7CisgICAgc2l6ZV90IHRvdGFsX3Zfc2l6ZTsgICAgICAgIC8qIHRvdGFsICMgb2Ygc2xvdHMgaW4gYnVmZmVyICovCisgICAgc2l6ZV90IHVzZWRfdl9zaXplOyAgICAgICAgIC8qICMgdXNlZCBzbG90cyBpbiBidWZmZXIgKi8KKyAgICBzaXplX3QgaW5jcmVtZW50OyAgICAgICAvKiBhbW91bnQgdG8gaW5jcmVtZW50IHRoZSBidWZmZXIgKi8KKyAgICBQeU9iamVjdCAqdjsKKyAgICBpbnQgYnplcnJvcjsKKyAgICBpbnQgYnl0ZXNfcmVhZDsKKyAgICBpbnQgbmV3bGluZXR5cGVzID0gZi0+Zl9uZXdsaW5ldHlwZXM7CisgICAgaW50IHNraXBuZXh0bGYgPSBmLT5mX3NraXBuZXh0bGY7CisgICAgaW50IHVuaXZfbmV3bGluZSA9IGYtPmZfdW5pdl9uZXdsaW5lOwogCi0JdG90YWxfdl9zaXplID0gbiA+IDAgPyBuIDogMTAwOwotCXYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKU5VTEwsIHRvdGFsX3Zfc2l6ZSk7Ci0JaWYgKHYgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgdG90YWxfdl9zaXplID0gbiA+IDAgPyBuIDogMTAwOworICAgIHYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKU5VTEwsIHRvdGFsX3Zfc2l6ZSk7CisgICAgaWYgKHYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlidWYgPSBCVUYodik7Ci0JZW5kID0gYnVmICsgdG90YWxfdl9zaXplOworICAgIGJ1ZiA9IEJVRih2KTsKKyAgICBlbmQgPSBidWYgKyB0b3RhbF92X3NpemU7CiAKLQlmb3IgKDs7KSB7Ci0JCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQkJd2hpbGUgKGJ1ZiAhPSBlbmQpIHsKLQkJCWJ5dGVzX3JlYWQgPSBCWjJfYnpSZWFkKCZiemVycm9yLCBmLT5mcCwgJmMsIDEpOwotCQkJZi0+cG9zKys7Ci0JCQlpZiAoYnl0ZXNfcmVhZCA9PSAwKSBicmVhazsKLQkJCWlmICh1bml2X25ld2xpbmUpIHsKLQkJCQlpZiAoc2tpcG5leHRsZikgewotCQkJCQlza2lwbmV4dGxmID0gMDsKLQkJCQkJaWYgKGMgPT0gJ1xuJykgewotCQkJCQkJLyogU2VlaW5nIGEgXG4gaGVyZSB3aXRoIHNraXBuZXh0bGYgdHJ1ZSBtZWFucyB3ZQotCQkJCQkJICogc2F3IGEgXHIgYmVmb3JlLgotCQkJCQkJICovCi0JCQkJCQluZXdsaW5ldHlwZXMgfD0gTkVXTElORV9DUkxGOwotCQkJCQkJaWYgKGJ6ZXJyb3IgIT0gQlpfT0spIGJyZWFrOwotCQkJCQkJYnl0ZXNfcmVhZCA9IEJaMl9ielJlYWQoJmJ6ZXJyb3IsIGYtPmZwLCAmYywgMSk7Ci0JCQkJCQlmLT5wb3MrKzsKLQkJCQkJCWlmIChieXRlc19yZWFkID09IDApIGJyZWFrOwotCQkJCQl9IGVsc2UgewotCQkJCQkJbmV3bGluZXR5cGVzIHw9IE5FV0xJTkVfQ1I7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGMgPT0gJ1xyJykgewotCQkJCQlza2lwbmV4dGxmID0gMTsKLQkJCQkJYyA9ICdcbic7Ci0JCQkJfSBlbHNlIGlmIChjID09ICdcbicpCi0JCQkJCW5ld2xpbmV0eXBlcyB8PSBORVdMSU5FX0xGOwotCQkJfQotCQkJKmJ1ZisrID0gYzsKLQkJCWlmIChiemVycm9yICE9IEJaX09LIHx8IGMgPT0gJ1xuJykgYnJlYWs7Ci0JCX0KLQkJaWYgKHVuaXZfbmV3bGluZSAmJiBiemVycm9yID09IEJaX1NUUkVBTV9FTkQgJiYgc2tpcG5leHRsZikKLQkJCW5ld2xpbmV0eXBlcyB8PSBORVdMSU5FX0NSOwotCQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCQlmLT5mX25ld2xpbmV0eXBlcyA9IG5ld2xpbmV0eXBlczsKLQkJZi0+Zl9za2lwbmV4dGxmID0gc2tpcG5leHRsZjsKLQkJaWYgKGJ6ZXJyb3IgPT0gQlpfU1RSRUFNX0VORCkgewotCQkJZi0+c2l6ZSA9IGYtPnBvczsKLQkJCWYtPm1vZGUgPSBNT0RFX1JFQURfRU9GOwotCQkJYnJlYWs7Ci0JCX0gZWxzZSBpZiAoYnplcnJvciAhPSBCWl9PSykgewotCQkJVXRpbF9DYXRjaEJaMkVycm9yKGJ6ZXJyb3IpOwotCQkJUHlfREVDUkVGKHYpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJaWYgKGMgPT0gJ1xuJykKLQkJCWJyZWFrOwotCQkvKiBNdXN0IGJlIGJlY2F1c2UgYnVmID09IGVuZCAqLwotCQlpZiAobiA+IDApCi0JCQlicmVhazsKLQkJdXNlZF92X3NpemUgPSB0b3RhbF92X3NpemU7Ci0JCWluY3JlbWVudCA9IHRvdGFsX3Zfc2l6ZSA+PiAyOyAvKiBtaWxkIGV4cG9uZW50aWFsIGdyb3d0aCAqLwotCQl0b3RhbF92X3NpemUgKz0gaW5jcmVtZW50OwotCQlpZiAodG90YWxfdl9zaXplID4gSU5UX01BWCkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0JCQkgICAgImxpbmUgaXMgbG9uZ2VyIHRoYW4gYSBQeXRob24gc3RyaW5nIGNhbiBob2xkIik7Ci0JCQlQeV9ERUNSRUYodik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmdiwgdG90YWxfdl9zaXplKSA8IDApCi0JCQlyZXR1cm4gTlVMTDsKLQkJYnVmID0gQlVGKHYpICsgdXNlZF92X3NpemU7Ci0JCWVuZCA9IEJVRih2KSArIHRvdGFsX3Zfc2l6ZTsKLQl9CisgICAgZm9yICg7OykgeworICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgICAgIHdoaWxlIChidWYgIT0gZW5kKSB7CisgICAgICAgICAgICBieXRlc19yZWFkID0gQloyX2J6UmVhZCgmYnplcnJvciwgZi0+ZnAsICZjLCAxKTsKKyAgICAgICAgICAgIGYtPnBvcysrOworICAgICAgICAgICAgaWYgKGJ5dGVzX3JlYWQgPT0gMCkgYnJlYWs7CisgICAgICAgICAgICBpZiAodW5pdl9uZXdsaW5lKSB7CisgICAgICAgICAgICAgICAgaWYgKHNraXBuZXh0bGYpIHsKKyAgICAgICAgICAgICAgICAgICAgc2tpcG5leHRsZiA9IDA7CisgICAgICAgICAgICAgICAgICAgIGlmIChjID09ICdcbicpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNlZWluZyBhIFxuIGhlcmUgd2l0aCBza2lwbmV4dGxmIHRydWUgbWVhbnMgd2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIHNhdyBhIFxyIGJlZm9yZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgbmV3bGluZXR5cGVzIHw9IE5FV0xJTkVfQ1JMRjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiemVycm9yICE9IEJaX09LKSBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzX3JlYWQgPSBCWjJfYnpSZWFkKCZiemVycm9yLCBmLT5mcCwgJmMsIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgZi0+cG9zKys7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnl0ZXNfcmVhZCA9PSAwKSBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld2xpbmV0eXBlcyB8PSBORVdMSU5FX0NSOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChjID09ICdccicpIHsKKyAgICAgICAgICAgICAgICAgICAgc2tpcG5leHRsZiA9IDE7CisgICAgICAgICAgICAgICAgICAgIGMgPSAnXG4nOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PSAnXG4nKQorICAgICAgICAgICAgICAgICAgICBuZXdsaW5ldHlwZXMgfD0gTkVXTElORV9MRjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpidWYrKyA9IGM7CisgICAgICAgICAgICBpZiAoYnplcnJvciAhPSBCWl9PSyB8fCBjID09ICdcbicpIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmICh1bml2X25ld2xpbmUgJiYgYnplcnJvciA9PSBCWl9TVFJFQU1fRU5EICYmIHNraXBuZXh0bGYpCisgICAgICAgICAgICBuZXdsaW5ldHlwZXMgfD0gTkVXTElORV9DUjsKKyAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgZi0+Zl9uZXdsaW5ldHlwZXMgPSBuZXdsaW5ldHlwZXM7CisgICAgICAgIGYtPmZfc2tpcG5leHRsZiA9IHNraXBuZXh0bGY7CisgICAgICAgIGlmIChiemVycm9yID09IEJaX1NUUkVBTV9FTkQpIHsKKyAgICAgICAgICAgIGYtPnNpemUgPSBmLT5wb3M7CisgICAgICAgICAgICBmLT5tb2RlID0gTU9ERV9SRUFEX0VPRjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgaWYgKGJ6ZXJyb3IgIT0gQlpfT0spIHsKKyAgICAgICAgICAgIFV0aWxfQ2F0Y2hCWjJFcnJvcihiemVycm9yKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGlmIChjID09ICdcbicpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgLyogTXVzdCBiZSBiZWNhdXNlIGJ1ZiA9PSBlbmQgKi8KKyAgICAgICAgaWYgKG4gPiAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIHVzZWRfdl9zaXplID0gdG90YWxfdl9zaXplOworICAgICAgICBpbmNyZW1lbnQgPSB0b3RhbF92X3NpemUgPj4gMjsgLyogbWlsZCBleHBvbmVudGlhbCBncm93dGggKi8KKyAgICAgICAgdG90YWxfdl9zaXplICs9IGluY3JlbWVudDsKKyAgICAgICAgaWYgKHRvdGFsX3Zfc2l6ZSA+IElOVF9NQVgpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICJsaW5lIGlzIGxvbmdlciB0aGFuIGEgUHl0aG9uIHN0cmluZyBjYW4gaG9sZCIpOworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKF9QeVN0cmluZ19SZXNpemUoJnYsIHRvdGFsX3Zfc2l6ZSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGJ1ZiA9IEJVRih2KSArIHVzZWRfdl9zaXplOworICAgICAgICBlbmQgPSBCVUYodikgKyB0b3RhbF92X3NpemU7CisgICAgfQogCi0JdXNlZF92X3NpemUgPSBidWYgLSBCVUYodik7Ci0JaWYgKHVzZWRfdl9zaXplICE9IHRvdGFsX3Zfc2l6ZSkKLQkJX1B5U3RyaW5nX1Jlc2l6ZSgmdiwgdXNlZF92X3NpemUpOwotCXJldHVybiB2OworICAgIHVzZWRfdl9zaXplID0gYnVmIC0gQlVGKHYpOworICAgIGlmICh1c2VkX3Zfc2l6ZSAhPSB0b3RhbF92X3NpemUpCisgICAgICAgIF9QeVN0cmluZ19SZXNpemUoJnYsIHVzZWRfdl9zaXplKTsKKyAgICByZXR1cm4gdjsKIH0KIAogLyogVGhpcyBpcyBhIGhhY2tlZCB2ZXJzaW9uIG9mIFB5dGhvbidzCiAgKiBmaWxlb2JqZWN0LmM6UHlfVW5pdmVyc2FsTmV3bGluZUZyZWFkKCkuICovCiBzaXplX3QKIFV0aWxfVW5pdk5ld2xpbmVSZWFkKGludCAqYnplcnJvciwgQlpGSUxFICpzdHJlYW0sCi0JCSAgICAgY2hhciogYnVmLCBzaXplX3QgbiwgQloyRmlsZU9iamVjdCAqZikKKyAgICAgICAgICAgICAgICAgICAgIGNoYXIqIGJ1Ziwgc2l6ZV90IG4sIEJaMkZpbGVPYmplY3QgKmYpCiB7Ci0JY2hhciAqZHN0ID0gYnVmOwotCWludCBuZXdsaW5ldHlwZXMsIHNraXBuZXh0bGY7CisgICAgY2hhciAqZHN0ID0gYnVmOworICAgIGludCBuZXdsaW5ldHlwZXMsIHNraXBuZXh0bGY7CiAKLQlhc3NlcnQoYnVmICE9IE5VTEwpOwotCWFzc2VydChzdHJlYW0gIT0gTlVMTCk7CisgICAgYXNzZXJ0KGJ1ZiAhPSBOVUxMKTsKKyAgICBhc3NlcnQoc3RyZWFtICE9IE5VTEwpOwogCi0JaWYgKCFmLT5mX3VuaXZfbmV3bGluZSkKLQkJcmV0dXJuIEJaMl9ielJlYWQoYnplcnJvciwgc3RyZWFtLCBidWYsIG4pOworICAgIGlmICghZi0+Zl91bml2X25ld2xpbmUpCisgICAgICAgIHJldHVybiBCWjJfYnpSZWFkKGJ6ZXJyb3IsIHN0cmVhbSwgYnVmLCBuKTsKIAotCW5ld2xpbmV0eXBlcyA9IGYtPmZfbmV3bGluZXR5cGVzOwotCXNraXBuZXh0bGYgPSBmLT5mX3NraXBuZXh0bGY7CisgICAgbmV3bGluZXR5cGVzID0gZi0+Zl9uZXdsaW5ldHlwZXM7CisgICAgc2tpcG5leHRsZiA9IGYtPmZfc2tpcG5leHRsZjsKIAotCS8qIEludmFyaWFudDogIG4gaXMgdGhlIG51bWJlciBvZiBieXRlcyByZW1haW5pbmcgdG8gYmUgZmlsbGVkCi0JICogaW4gdGhlIGJ1ZmZlci4KLQkgKi8KLQl3aGlsZSAobikgewotCQlzaXplX3QgbnJlYWQ7Ci0JCWludCBzaG9ydHJlYWQ7Ci0JCWNoYXIgKnNyYyA9IGRzdDsKKyAgICAvKiBJbnZhcmlhbnQ6ICBuIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVtYWluaW5nIHRvIGJlIGZpbGxlZAorICAgICAqIGluIHRoZSBidWZmZXIuCisgICAgICovCisgICAgd2hpbGUgKG4pIHsKKyAgICAgICAgc2l6ZV90IG5yZWFkOworICAgICAgICBpbnQgc2hvcnRyZWFkOworICAgICAgICBjaGFyICpzcmMgPSBkc3Q7CiAKLQkJbnJlYWQgPSBCWjJfYnpSZWFkKGJ6ZXJyb3IsIHN0cmVhbSwgZHN0LCBuKTsKLQkJYXNzZXJ0KG5yZWFkIDw9IG4pOwotCQluIC09IG5yZWFkOyAvKiBhc3N1bWluZyAxIGJ5dGUgb3V0IGZvciBlYWNoIGluOyB3aWxsIGFkanVzdCAqLwotCQlzaG9ydHJlYWQgPSBuICE9IDA7CS8qIHRydWUgaWZmIEVPRiBvciBlcnJvciAqLwotCQl3aGlsZSAobnJlYWQtLSkgewotCQkJY2hhciBjID0gKnNyYysrOwotCQkJaWYgKGMgPT0gJ1xyJykgewotCQkJCS8qIFNhdmUgYXMgTEYgYW5kIHNldCBmbGFnIHRvIHNraXAgbmV4dCBMRi4gKi8KLQkJCQkqZHN0KysgPSAnXG4nOwotCQkJCXNraXBuZXh0bGYgPSAxOwotCQkJfQotCQkJZWxzZSBpZiAoc2tpcG5leHRsZiAmJiBjID09ICdcbicpIHsKLQkJCQkvKiBTa2lwIExGLCBhbmQgcmVtZW1iZXIgd2Ugc2F3IENSIExGLiAqLwotCQkJCXNraXBuZXh0bGYgPSAwOwotCQkJCW5ld2xpbmV0eXBlcyB8PSBORVdMSU5FX0NSTEY7Ci0JCQkJKytuOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLyogTm9ybWFsIGNoYXIgdG8gYmUgc3RvcmVkIGluIGJ1ZmZlci4gIEFsc28KLQkJCQkgKiB1cGRhdGUgdGhlIG5ld2xpbmV0eXBlcyBmbGFnIGlmIGVpdGhlciB0aGlzCi0JCQkJICogaXMgYW4gTEYgb3IgdGhlIHByZXZpb3VzIGNoYXIgd2FzIGEgQ1IuCi0JCQkJICovCi0JCQkJaWYgKGMgPT0gJ1xuJykKLQkJCQkJbmV3bGluZXR5cGVzIHw9IE5FV0xJTkVfTEY7Ci0JCQkJZWxzZSBpZiAoc2tpcG5leHRsZikKLQkJCQkJbmV3bGluZXR5cGVzIHw9IE5FV0xJTkVfQ1I7Ci0JCQkJKmRzdCsrID0gYzsKLQkJCQlza2lwbmV4dGxmID0gMDsKLQkJCX0KLQkJfQotCQlpZiAoc2hvcnRyZWFkKSB7Ci0JCQkvKiBJZiB0aGlzIGlzIEVPRiwgdXBkYXRlIHR5cGUgZmxhZ3MuICovCi0JCQlpZiAoc2tpcG5leHRsZiAmJiAqYnplcnJvciA9PSBCWl9TVFJFQU1fRU5EKQotCQkJCW5ld2xpbmV0eXBlcyB8PSBORVdMSU5FX0NSOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JZi0+Zl9uZXdsaW5ldHlwZXMgPSBuZXdsaW5ldHlwZXM7Ci0JZi0+Zl9za2lwbmV4dGxmID0gc2tpcG5leHRsZjsKLQlyZXR1cm4gZHN0IC0gYnVmOworICAgICAgICBucmVhZCA9IEJaMl9ielJlYWQoYnplcnJvciwgc3RyZWFtLCBkc3QsIG4pOworICAgICAgICBhc3NlcnQobnJlYWQgPD0gbik7CisgICAgICAgIG4gLT0gbnJlYWQ7IC8qIGFzc3VtaW5nIDEgYnl0ZSBvdXQgZm9yIGVhY2ggaW47IHdpbGwgYWRqdXN0ICovCisgICAgICAgIHNob3J0cmVhZCA9IG4gIT0gMDsgICAgICAgICAgICAgLyogdHJ1ZSBpZmYgRU9GIG9yIGVycm9yICovCisgICAgICAgIHdoaWxlIChucmVhZC0tKSB7CisgICAgICAgICAgICBjaGFyIGMgPSAqc3JjKys7CisgICAgICAgICAgICBpZiAoYyA9PSAnXHInKSB7CisgICAgICAgICAgICAgICAgLyogU2F2ZSBhcyBMRiBhbmQgc2V0IGZsYWcgdG8gc2tpcCBuZXh0IExGLiAqLworICAgICAgICAgICAgICAgICpkc3QrKyA9ICdcbic7CisgICAgICAgICAgICAgICAgc2tpcG5leHRsZiA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChza2lwbmV4dGxmICYmIGMgPT0gJ1xuJykgeworICAgICAgICAgICAgICAgIC8qIFNraXAgTEYsIGFuZCByZW1lbWJlciB3ZSBzYXcgQ1IgTEYuICovCisgICAgICAgICAgICAgICAgc2tpcG5leHRsZiA9IDA7CisgICAgICAgICAgICAgICAgbmV3bGluZXR5cGVzIHw9IE5FV0xJTkVfQ1JMRjsKKyAgICAgICAgICAgICAgICArK247CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBOb3JtYWwgY2hhciB0byBiZSBzdG9yZWQgaW4gYnVmZmVyLiAgQWxzbworICAgICAgICAgICAgICAgICAqIHVwZGF0ZSB0aGUgbmV3bGluZXR5cGVzIGZsYWcgaWYgZWl0aGVyIHRoaXMKKyAgICAgICAgICAgICAgICAgKiBpcyBhbiBMRiBvciB0aGUgcHJldmlvdXMgY2hhciB3YXMgYSBDUi4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBpZiAoYyA9PSAnXG4nKQorICAgICAgICAgICAgICAgICAgICBuZXdsaW5ldHlwZXMgfD0gTkVXTElORV9MRjsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChza2lwbmV4dGxmKQorICAgICAgICAgICAgICAgICAgICBuZXdsaW5ldHlwZXMgfD0gTkVXTElORV9DUjsKKyAgICAgICAgICAgICAgICAqZHN0KysgPSBjOworICAgICAgICAgICAgICAgIHNraXBuZXh0bGYgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChzaG9ydHJlYWQpIHsKKyAgICAgICAgICAgIC8qIElmIHRoaXMgaXMgRU9GLCB1cGRhdGUgdHlwZSBmbGFncy4gKi8KKyAgICAgICAgICAgIGlmIChza2lwbmV4dGxmICYmICpiemVycm9yID09IEJaX1NUUkVBTV9FTkQpCisgICAgICAgICAgICAgICAgbmV3bGluZXR5cGVzIHw9IE5FV0xJTkVfQ1I7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBmLT5mX25ld2xpbmV0eXBlcyA9IG5ld2xpbmV0eXBlczsKKyAgICBmLT5mX3NraXBuZXh0bGYgPSBza2lwbmV4dGxmOworICAgIHJldHVybiBkc3QgLSBidWY7CiB9CiAKIC8qIFRoaXMgaXMgYSBoYWNrZWQgdmVyc2lvbiBvZiBQeXRob24ncyBmaWxlb2JqZWN0LmM6ZHJvcF9yZWFkYWhlYWQoKS4gKi8KIHN0YXRpYyB2b2lkCiBVdGlsX0Ryb3BSZWFkQWhlYWQoQloyRmlsZU9iamVjdCAqZikKIHsKLQlpZiAoZi0+Zl9idWYgIT0gTlVMTCkgewotCQlQeU1lbV9GcmVlKGYtPmZfYnVmKTsKLQkJZi0+Zl9idWYgPSBOVUxMOwotCX0KKyAgICBpZiAoZi0+Zl9idWYgIT0gTlVMTCkgeworICAgICAgICBQeU1lbV9GcmVlKGYtPmZfYnVmKTsKKyAgICAgICAgZi0+Zl9idWYgPSBOVUxMOworICAgIH0KIH0KIAogLyogVGhpcyBpcyBhIGhhY2tlZCB2ZXJzaW9uIG9mIFB5dGhvbidzIGZpbGVvYmplY3QuYzpyZWFkYWhlYWQoKS4gKi8KIHN0YXRpYyBpbnQKIFV0aWxfUmVhZEFoZWFkKEJaMkZpbGVPYmplY3QgKmYsIGludCBidWZzaXplKQogewotCWludCBjaHVua3NpemU7Ci0JaW50IGJ6ZXJyb3I7CisgICAgaW50IGNodW5rc2l6ZTsKKyAgICBpbnQgYnplcnJvcjsKIAotCWlmIChmLT5mX2J1ZiAhPSBOVUxMKSB7Ci0JCWlmKChmLT5mX2J1ZmVuZCAtIGYtPmZfYnVmcHRyKSA+PSAxKQotCQkJcmV0dXJuIDA7Ci0JCWVsc2UKLQkJCVV0aWxfRHJvcFJlYWRBaGVhZChmKTsKLQl9Ci0JaWYgKGYtPm1vZGUgPT0gTU9ERV9SRUFEX0VPRikgewotCQlmLT5mX2J1ZnB0ciA9IGYtPmZfYnVmOwotCQlmLT5mX2J1ZmVuZCA9IGYtPmZfYnVmOwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKChmLT5mX2J1ZiA9IFB5TWVtX01hbGxvYyhidWZzaXplKSkgPT0gTlVMTCkgewotCQlQeUVycl9Ob01lbW9yeSgpOwotCQlyZXR1cm4gLTE7Ci0JfQotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQljaHVua3NpemUgPSBVdGlsX1VuaXZOZXdsaW5lUmVhZCgmYnplcnJvciwgZi0+ZnAsIGYtPmZfYnVmLAotCQkJCQkgYnVmc2l6ZSwgZik7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQlmLT5wb3MgKz0gY2h1bmtzaXplOwotCWlmIChiemVycm9yID09IEJaX1NUUkVBTV9FTkQpIHsKLQkJZi0+c2l6ZSA9IGYtPnBvczsKLQkJZi0+bW9kZSA9IE1PREVfUkVBRF9FT0Y7Ci0JfSBlbHNlIGlmIChiemVycm9yICE9IEJaX09LKSB7Ci0JCVV0aWxfQ2F0Y2hCWjJFcnJvcihiemVycm9yKTsKLQkJVXRpbF9Ecm9wUmVhZEFoZWFkKGYpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWYtPmZfYnVmcHRyID0gZi0+Zl9idWY7Ci0JZi0+Zl9idWZlbmQgPSBmLT5mX2J1ZiArIGNodW5rc2l6ZTsKLQlyZXR1cm4gMDsKKyAgICBpZiAoZi0+Zl9idWYgIT0gTlVMTCkgeworICAgICAgICBpZigoZi0+Zl9idWZlbmQgLSBmLT5mX2J1ZnB0cikgPj0gMSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBlbHNlCisgICAgICAgICAgICBVdGlsX0Ryb3BSZWFkQWhlYWQoZik7CisgICAgfQorICAgIGlmIChmLT5tb2RlID09IE1PREVfUkVBRF9FT0YpIHsKKyAgICAgICAgZi0+Zl9idWZwdHIgPSBmLT5mX2J1ZjsKKyAgICAgICAgZi0+Zl9idWZlbmQgPSBmLT5mX2J1ZjsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmICgoZi0+Zl9idWYgPSBQeU1lbV9NYWxsb2MoYnVmc2l6ZSkpID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgY2h1bmtzaXplID0gVXRpbF9Vbml2TmV3bGluZVJlYWQoJmJ6ZXJyb3IsIGYtPmZwLCBmLT5mX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZzaXplLCBmKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIGYtPnBvcyArPSBjaHVua3NpemU7CisgICAgaWYgKGJ6ZXJyb3IgPT0gQlpfU1RSRUFNX0VORCkgeworICAgICAgICBmLT5zaXplID0gZi0+cG9zOworICAgICAgICBmLT5tb2RlID0gTU9ERV9SRUFEX0VPRjsKKyAgICB9IGVsc2UgaWYgKGJ6ZXJyb3IgIT0gQlpfT0spIHsKKyAgICAgICAgVXRpbF9DYXRjaEJaMkVycm9yKGJ6ZXJyb3IpOworICAgICAgICBVdGlsX0Ryb3BSZWFkQWhlYWQoZik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgZi0+Zl9idWZwdHIgPSBmLT5mX2J1ZjsKKyAgICBmLT5mX2J1ZmVuZCA9IGYtPmZfYnVmICsgY2h1bmtzaXplOworICAgIHJldHVybiAwOwogfQogCiAvKiBUaGlzIGlzIGEgaGFja2VkIHZlcnNpb24gb2YgUHl0aG9uJ3MKQEAgLTQ0Nyw0NSArNDQ3LDQ1IEBACiBzdGF0aWMgUHlTdHJpbmdPYmplY3QgKgogVXRpbF9SZWFkQWhlYWRHZXRMaW5lU2tpcChCWjJGaWxlT2JqZWN0ICpmLCBpbnQgc2tpcCwgaW50IGJ1ZnNpemUpCiB7Ci0JUHlTdHJpbmdPYmplY3QqIHM7Ci0JY2hhciAqYnVmcHRyOwotCWNoYXIgKmJ1ZjsKLQlpbnQgbGVuOworICAgIFB5U3RyaW5nT2JqZWN0KiBzOworICAgIGNoYXIgKmJ1ZnB0cjsKKyAgICBjaGFyICpidWY7CisgICAgaW50IGxlbjsKIAotCWlmIChmLT5mX2J1ZiA9PSBOVUxMKQotCQlpZiAoVXRpbF9SZWFkQWhlYWQoZiwgYnVmc2l6ZSkgPCAwKQotCQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKGYtPmZfYnVmID09IE5VTEwpCisgICAgICAgIGlmIChVdGlsX1JlYWRBaGVhZChmLCBidWZzaXplKSA8IDApCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKIAotCWxlbiA9IGYtPmZfYnVmZW5kIC0gZi0+Zl9idWZwdHI7Ci0JaWYgKGxlbiA9PSAwKQotCQlyZXR1cm4gKFB5U3RyaW5nT2JqZWN0ICopCi0JCQlQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBza2lwKTsKLQlidWZwdHIgPSBtZW1jaHIoZi0+Zl9idWZwdHIsICdcbicsIGxlbik7Ci0JaWYgKGJ1ZnB0ciAhPSBOVUxMKSB7Ci0JCWJ1ZnB0cisrOwkJCS8qIENvdW50IHRoZSAnXG4nICovCi0JCWxlbiA9IGJ1ZnB0ciAtIGYtPmZfYnVmcHRyOwotCQlzID0gKFB5U3RyaW5nT2JqZWN0ICopCi0JCQlQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBza2lwK2xlbik7Ci0JCWlmIChzID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQkJbWVtY3B5KFB5U3RyaW5nX0FTX1NUUklORyhzKStza2lwLCBmLT5mX2J1ZnB0ciwgbGVuKTsKLQkJZi0+Zl9idWZwdHIgPSBidWZwdHI7Ci0JCWlmIChidWZwdHIgPT0gZi0+Zl9idWZlbmQpCi0JCQlVdGlsX0Ryb3BSZWFkQWhlYWQoZik7Ci0JfSBlbHNlIHsKLQkJYnVmcHRyID0gZi0+Zl9idWZwdHI7Ci0JCWJ1ZiA9IGYtPmZfYnVmOwotCQlmLT5mX2J1ZiA9IE5VTEw7IAkvKiBGb3JjZSBuZXcgcmVhZGFoZWFkIGJ1ZmZlciAqLwotICAgICAgICAgICAgICAgIHMgPSBVdGlsX1JlYWRBaGVhZEdldExpbmVTa2lwKGYsIHNraXArbGVuLAotCQkJCQkgICAgICBidWZzaXplICsgKGJ1ZnNpemU+PjIpKTsKLQkJaWYgKHMgPT0gTlVMTCkgewotCQkgICAgICAgIFB5TWVtX0ZyZWUoYnVmKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCW1lbWNweShQeVN0cmluZ19BU19TVFJJTkcocykrc2tpcCwgYnVmcHRyLCBsZW4pOwotCQlQeU1lbV9GcmVlKGJ1Zik7Ci0JfQotCXJldHVybiBzOworICAgIGxlbiA9IGYtPmZfYnVmZW5kIC0gZi0+Zl9idWZwdHI7CisgICAgaWYgKGxlbiA9PSAwKQorICAgICAgICByZXR1cm4gKFB5U3RyaW5nT2JqZWN0ICopCisgICAgICAgICAgICBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBza2lwKTsKKyAgICBidWZwdHIgPSBtZW1jaHIoZi0+Zl9idWZwdHIsICdcbicsIGxlbik7CisgICAgaWYgKGJ1ZnB0ciAhPSBOVUxMKSB7CisgICAgICAgIGJ1ZnB0cisrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb3VudCB0aGUgJ1xuJyAqLworICAgICAgICBsZW4gPSBidWZwdHIgLSBmLT5mX2J1ZnB0cjsKKyAgICAgICAgcyA9IChQeVN0cmluZ09iamVjdCAqKQorICAgICAgICAgICAgUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgc2tpcCtsZW4pOworICAgICAgICBpZiAocyA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIG1lbWNweShQeVN0cmluZ19BU19TVFJJTkcocykrc2tpcCwgZi0+Zl9idWZwdHIsIGxlbik7CisgICAgICAgIGYtPmZfYnVmcHRyID0gYnVmcHRyOworICAgICAgICBpZiAoYnVmcHRyID09IGYtPmZfYnVmZW5kKQorICAgICAgICAgICAgVXRpbF9Ecm9wUmVhZEFoZWFkKGYpOworICAgIH0gZWxzZSB7CisgICAgICAgIGJ1ZnB0ciA9IGYtPmZfYnVmcHRyOworICAgICAgICBidWYgPSBmLT5mX2J1ZjsKKyAgICAgICAgZi0+Zl9idWYgPSBOVUxMOyAgICAgICAgICAgICAgICAvKiBGb3JjZSBuZXcgcmVhZGFoZWFkIGJ1ZmZlciAqLworICAgICAgICBzID0gVXRpbF9SZWFkQWhlYWRHZXRMaW5lU2tpcChmLCBza2lwK2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmc2l6ZSArIChidWZzaXplPj4yKSk7CisgICAgICAgIGlmIChzID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5TWVtX0ZyZWUoYnVmKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIG1lbWNweShQeVN0cmluZ19BU19TVFJJTkcocykrc2tpcCwgYnVmcHRyLCBsZW4pOworICAgICAgICBQeU1lbV9GcmVlKGJ1Zik7CisgICAgfQorICAgIHJldHVybiBzOwogfQogCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KQEAgLTUwMiw3OSArNTAyLDc5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogQloyRmlsZV9yZWFkKEJaMkZpbGVPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYnl0ZXNyZXF1ZXN0ZWQgPSAtMTsKLQlzaXplX3QgYnl0ZXNyZWFkLCBidWZmZXJzaXplLCBjaHVua3NpemU7Ci0JaW50IGJ6ZXJyb3I7Ci0JUHlPYmplY3QgKnJldCA9IE5VTEw7CisgICAgbG9uZyBieXRlc3JlcXVlc3RlZCA9IC0xOworICAgIHNpemVfdCBieXRlc3JlYWQsIGJ1ZmZlcnNpemUsIGNodW5rc2l6ZTsKKyAgICBpbnQgYnplcnJvcjsKKyAgICBQeU9iamVjdCAqcmV0ID0gTlVMTDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifGw6cmVhZCIsICZieXRlc3JlcXVlc3RlZCkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifGw6cmVhZCIsICZieXRlc3JlcXVlc3RlZCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JQUNRVUlSRV9MT0NLKHNlbGYpOwotCXN3aXRjaCAoc2VsZi0+bW9kZSkgewotCQljYXNlIE1PREVfUkVBRDoKLQkJCWJyZWFrOwotCQljYXNlIE1PREVfUkVBRF9FT0Y6Ci0JCQlyZXQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCIiKTsKLQkJCWdvdG8gY2xlYW51cDsKLQkJY2FzZSBNT0RFX0NMT1NFRDoKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCQkiSS9PIG9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZSIpOwotCQkJZ290byBjbGVhbnVwOwotCQlkZWZhdWx0OgotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0lPRXJyb3IsCi0JCQkJCSJmaWxlIGlzIG5vdCByZWFkeSBmb3IgcmVhZGluZyIpOwotCQkJZ290byBjbGVhbnVwOwotCX0KKyAgICBBQ1FVSVJFX0xPQ0soc2VsZik7CisgICAgc3dpdGNoIChzZWxmLT5tb2RlKSB7CisgICAgICAgIGNhc2UgTU9ERV9SRUFEOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTU9ERV9SRUFEX0VPRjoKKyAgICAgICAgICAgIHJldCA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIiIpOworICAgICAgICAgICAgZ290byBjbGVhbnVwOworICAgICAgICBjYXNlIE1PREVfQ0xPU0VEOgorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkkvTyBvcGVyYXRpb24gb24gY2xvc2VkIGZpbGUiKTsKKyAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JT0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmaWxlIGlzIG5vdCByZWFkeSBmb3IgcmVhZGluZyIpOworICAgICAgICAgICAgZ290byBjbGVhbnVwOworICAgIH0KIAotCWlmIChieXRlc3JlcXVlc3RlZCA8IDApCi0JCWJ1ZmZlcnNpemUgPSBVdGlsX05ld0J1ZmZlclNpemUoKHNpemVfdCkwKTsKLQllbHNlCi0JCWJ1ZmZlcnNpemUgPSBieXRlc3JlcXVlc3RlZDsKLQlpZiAoYnVmZmVyc2l6ZSA+IElOVF9NQVgpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0JCQkJInJlcXVlc3RlZCBudW1iZXIgb2YgYnl0ZXMgaXMgIgotCQkJCSJtb3JlIHRoYW4gYSBQeXRob24gc3RyaW5nIGNhbiBob2xkIik7Ci0JCWdvdG8gY2xlYW51cDsKLQl9Ci0JcmV0ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilOVUxMLCBidWZmZXJzaXplKTsKLQlpZiAocmV0ID09IE5VTEwpCi0JCWdvdG8gY2xlYW51cDsKLQlieXRlc3JlYWQgPSAwOworICAgIGlmIChieXRlc3JlcXVlc3RlZCA8IDApCisgICAgICAgIGJ1ZmZlcnNpemUgPSBVdGlsX05ld0J1ZmZlclNpemUoKHNpemVfdCkwKTsKKyAgICBlbHNlCisgICAgICAgIGJ1ZmZlcnNpemUgPSBieXRlc3JlcXVlc3RlZDsKKyAgICBpZiAoYnVmZmVyc2l6ZSA+IElOVF9NQVgpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAicmVxdWVzdGVkIG51bWJlciBvZiBieXRlcyBpcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAibW9yZSB0aGFuIGEgUHl0aG9uIHN0cmluZyBjYW4gaG9sZCIpOworICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgfQorICAgIHJldCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopTlVMTCwgYnVmZmVyc2l6ZSk7CisgICAgaWYgKHJldCA9PSBOVUxMKQorICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgYnl0ZXNyZWFkID0gMDsKIAotCWZvciAoOzspIHsKLQkJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCQljaHVua3NpemUgPSBVdGlsX1VuaXZOZXdsaW5lUmVhZCgmYnplcnJvciwgc2VsZi0+ZnAsCi0JCQkJCQkgQlVGKHJldCkrYnl0ZXNyZWFkLAotCQkJCQkJIGJ1ZmZlcnNpemUtYnl0ZXNyZWFkLAotCQkJCQkJIHNlbGYpOwotCQlzZWxmLT5wb3MgKz0gY2h1bmtzaXplOwotCQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCQlieXRlc3JlYWQgKz0gY2h1bmtzaXplOwotCQlpZiAoYnplcnJvciA9PSBCWl9TVFJFQU1fRU5EKSB7Ci0JCQlzZWxmLT5zaXplID0gc2VsZi0+cG9zOwotCQkJc2VsZi0+bW9kZSA9IE1PREVfUkVBRF9FT0Y7Ci0JCQlicmVhazsKLQkJfSBlbHNlIGlmIChiemVycm9yICE9IEJaX09LKSB7Ci0JCQlVdGlsX0NhdGNoQloyRXJyb3IoYnplcnJvcik7Ci0JCQlQeV9ERUNSRUYocmV0KTsKLQkJCXJldCA9IE5VTEw7Ci0JCQlnb3RvIGNsZWFudXA7Ci0JCX0KLQkJaWYgKGJ5dGVzcmVxdWVzdGVkIDwgMCkgewotCQkJYnVmZmVyc2l6ZSA9IFV0aWxfTmV3QnVmZmVyU2l6ZShidWZmZXJzaXplKTsKLQkJCWlmIChfUHlTdHJpbmdfUmVzaXplKCZyZXQsIGJ1ZmZlcnNpemUpIDwgMCkKLQkJCQlnb3RvIGNsZWFudXA7Ci0JCX0gZWxzZSB7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlpZiAoYnl0ZXNyZWFkICE9IGJ1ZmZlcnNpemUpCi0JCV9QeVN0cmluZ19SZXNpemUoJnJldCwgYnl0ZXNyZWFkKTsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgY2h1bmtzaXplID0gVXRpbF9Vbml2TmV3bGluZVJlYWQoJmJ6ZXJyb3IsIHNlbGYtPmZwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVUYocmV0KStieXRlc3JlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcnNpemUtYnl0ZXNyZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmKTsKKyAgICAgICAgc2VsZi0+cG9zICs9IGNodW5rc2l6ZTsKKyAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgYnl0ZXNyZWFkICs9IGNodW5rc2l6ZTsKKyAgICAgICAgaWYgKGJ6ZXJyb3IgPT0gQlpfU1RSRUFNX0VORCkgeworICAgICAgICAgICAgc2VsZi0+c2l6ZSA9IHNlbGYtPnBvczsKKyAgICAgICAgICAgIHNlbGYtPm1vZGUgPSBNT0RFX1JFQURfRU9GOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSBpZiAoYnplcnJvciAhPSBCWl9PSykgeworICAgICAgICAgICAgVXRpbF9DYXRjaEJaMkVycm9yKGJ6ZXJyb3IpOworICAgICAgICAgICAgUHlfREVDUkVGKHJldCk7CisgICAgICAgICAgICByZXQgPSBOVUxMOworICAgICAgICAgICAgZ290byBjbGVhbnVwOworICAgICAgICB9CisgICAgICAgIGlmIChieXRlc3JlcXVlc3RlZCA8IDApIHsKKyAgICAgICAgICAgIGJ1ZmZlcnNpemUgPSBVdGlsX05ld0J1ZmZlclNpemUoYnVmZmVyc2l6ZSk7CisgICAgICAgICAgICBpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmcmV0LCBidWZmZXJzaXplKSA8IDApCisgICAgICAgICAgICAgICAgZ290byBjbGVhbnVwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGJ5dGVzcmVhZCAhPSBidWZmZXJzaXplKQorICAgICAgICBfUHlTdHJpbmdfUmVzaXplKCZyZXQsIGJ5dGVzcmVhZCk7CiAKIGNsZWFudXA6Ci0JUkVMRUFTRV9MT0NLKHNlbGYpOwotCXJldHVybiByZXQ7CisgICAgUkVMRUFTRV9MT0NLKHNlbGYpOworICAgIHJldHVybiByZXQ7CiB9CiAKIFB5RG9jX1NUUlZBUihCWjJGaWxlX3JlYWRsaW5lX19kb2NfXywKQEAgLTU4OSwzNyArNTg5LDM3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogQloyRmlsZV9yZWFkbGluZShCWjJGaWxlT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqcmV0ID0gTlVMTDsKLQlpbnQgc2l6ZWhpbnQgPSAtMTsKKyAgICBQeU9iamVjdCAqcmV0ID0gTlVMTDsKKyAgICBpbnQgc2l6ZWhpbnQgPSAtMTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifGk6cmVhZGxpbmUiLCAmc2l6ZWhpbnQpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxpOnJlYWRsaW5lIiwgJnNpemVoaW50KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlBQ1FVSVJFX0xPQ0soc2VsZik7Ci0Jc3dpdGNoIChzZWxmLT5tb2RlKSB7Ci0JCWNhc2UgTU9ERV9SRUFEOgotCQkJYnJlYWs7Ci0JCWNhc2UgTU9ERV9SRUFEX0VPRjoKLQkJCXJldCA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIiIpOwotCQkJZ290byBjbGVhbnVwOwotCQljYXNlIE1PREVfQ0xPU0VEOgotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJCSJJL08gb3BlcmF0aW9uIG9uIGNsb3NlZCBmaWxlIik7Ci0JCQlnb3RvIGNsZWFudXA7Ci0JCWRlZmF1bHQ6Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSU9FcnJvciwKLQkJCQkJImZpbGUgaXMgbm90IHJlYWR5IGZvciByZWFkaW5nIik7Ci0JCQlnb3RvIGNsZWFudXA7Ci0JfQorICAgIEFDUVVJUkVfTE9DSyhzZWxmKTsKKyAgICBzd2l0Y2ggKHNlbGYtPm1vZGUpIHsKKyAgICAgICAgY2FzZSBNT0RFX1JFQUQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNT0RFX1JFQURfRU9GOgorICAgICAgICAgICAgcmV0ID0gUHlTdHJpbmdfRnJvbVN0cmluZygiIik7CisgICAgICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgICAgIGNhc2UgTU9ERV9DTE9TRUQ6CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSS9PIG9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZSIpOworICAgICAgICAgICAgZ290byBjbGVhbnVwOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0lPRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZpbGUgaXMgbm90IHJlYWR5IGZvciByZWFkaW5nIik7CisgICAgICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgfQogCi0JaWYgKHNpemVoaW50ID09IDApCi0JCXJldCA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIiIpOwotCWVsc2UKLQkJcmV0ID0gVXRpbF9HZXRMaW5lKHNlbGYsIChzaXplaGludCA8IDApID8gMCA6IHNpemVoaW50KTsKKyAgICBpZiAoc2l6ZWhpbnQgPT0gMCkKKyAgICAgICAgcmV0ID0gUHlTdHJpbmdfRnJvbVN0cmluZygiIik7CisgICAgZWxzZQorICAgICAgICByZXQgPSBVdGlsX0dldExpbmUoc2VsZiwgKHNpemVoaW50IDwgMCkgPyAwIDogc2l6ZWhpbnQpOwogCiBjbGVhbnVwOgotCVJFTEVBU0VfTE9DSyhzZWxmKTsKLQlyZXR1cm4gcmV0OworICAgIFJFTEVBU0VfTE9DSyhzZWxmKTsKKyAgICByZXR1cm4gcmV0OwogfQogCiBQeURvY19TVFJWQVIoQloyRmlsZV9yZWFkbGluZXNfX2RvY19fLApAQCAtNjM0LDE0OCArNjM0LDE0OCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIEJaMkZpbGVfcmVhZGxpbmVzKEJaMkZpbGVPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgc2l6ZWhpbnQgPSAwOwotCVB5T2JqZWN0ICpsaXN0ID0gTlVMTDsKLQlQeU9iamVjdCAqbGluZTsKLQljaGFyIHNtYWxsX2J1ZmZlcltTTUFMTENIVU5LXTsKLQljaGFyICpidWZmZXIgPSBzbWFsbF9idWZmZXI7Ci0Jc2l6ZV90IGJ1ZmZlcnNpemUgPSBTTUFMTENIVU5LOwotCVB5T2JqZWN0ICpiaWdfYnVmZmVyID0gTlVMTDsKLQlzaXplX3QgbmZpbGxlZCA9IDA7Ci0Jc2l6ZV90IG5yZWFkOwotCXNpemVfdCB0b3RhbHJlYWQgPSAwOwotCWNoYXIgKnAsICpxLCAqZW5kOwotCWludCBlcnI7Ci0JaW50IHNob3J0cmVhZCA9IDA7Ci0JaW50IGJ6ZXJyb3I7CisgICAgbG9uZyBzaXplaGludCA9IDA7CisgICAgUHlPYmplY3QgKmxpc3QgPSBOVUxMOworICAgIFB5T2JqZWN0ICpsaW5lOworICAgIGNoYXIgc21hbGxfYnVmZmVyW1NNQUxMQ0hVTktdOworICAgIGNoYXIgKmJ1ZmZlciA9IHNtYWxsX2J1ZmZlcjsKKyAgICBzaXplX3QgYnVmZmVyc2l6ZSA9IFNNQUxMQ0hVTks7CisgICAgUHlPYmplY3QgKmJpZ19idWZmZXIgPSBOVUxMOworICAgIHNpemVfdCBuZmlsbGVkID0gMDsKKyAgICBzaXplX3QgbnJlYWQ7CisgICAgc2l6ZV90IHRvdGFscmVhZCA9IDA7CisgICAgY2hhciAqcCwgKnEsICplbmQ7CisgICAgaW50IGVycjsKKyAgICBpbnQgc2hvcnRyZWFkID0gMDsKKyAgICBpbnQgYnplcnJvcjsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifGw6cmVhZGxpbmVzIiwgJnNpemVoaW50KSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8bDpyZWFkbGluZXMiLCAmc2l6ZWhpbnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCUFDUVVJUkVfTE9DSyhzZWxmKTsKLQlzd2l0Y2ggKHNlbGYtPm1vZGUpIHsKLQkJY2FzZSBNT0RFX1JFQUQ6Ci0JCQlicmVhazsKLQkJY2FzZSBNT0RFX1JFQURfRU9GOgotCQkJbGlzdCA9IFB5TGlzdF9OZXcoMCk7Ci0JCQlnb3RvIGNsZWFudXA7Ci0JCWNhc2UgTU9ERV9DTE9TRUQ6Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkJIkkvTyBvcGVyYXRpb24gb24gY2xvc2VkIGZpbGUiKTsKLQkJCWdvdG8gY2xlYW51cDsKLQkJZGVmYXVsdDoKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JT0Vycm9yLAotCQkJCQkiZmlsZSBpcyBub3QgcmVhZHkgZm9yIHJlYWRpbmciKTsKLQkJCWdvdG8gY2xlYW51cDsKLQl9CisgICAgQUNRVUlSRV9MT0NLKHNlbGYpOworICAgIHN3aXRjaCAoc2VsZi0+bW9kZSkgeworICAgICAgICBjYXNlIE1PREVfUkVBRDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1PREVfUkVBRF9FT0Y6CisgICAgICAgICAgICBsaXN0ID0gUHlMaXN0X05ldygwKTsKKyAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICAgICAgY2FzZSBNT0RFX0NMT1NFRDoKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJL08gb3BlcmF0aW9uIG9uIGNsb3NlZCBmaWxlIik7CisgICAgICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSU9FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmlsZSBpcyBub3QgcmVhZHkgZm9yIHJlYWRpbmciKTsKKyAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICB9CiAKLQlpZiAoKGxpc3QgPSBQeUxpc3RfTmV3KDApKSA9PSBOVUxMKQotCQlnb3RvIGNsZWFudXA7CisgICAgaWYgKChsaXN0ID0gUHlMaXN0X05ldygwKSkgPT0gTlVMTCkKKyAgICAgICAgZ290byBjbGVhbnVwOwogCi0JZm9yICg7OykgewotCQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JCW5yZWFkID0gVXRpbF9Vbml2TmV3bGluZVJlYWQoJmJ6ZXJyb3IsIHNlbGYtPmZwLAotCQkJCQkgICAgIGJ1ZmZlcituZmlsbGVkLAotCQkJCQkgICAgIGJ1ZmZlcnNpemUtbmZpbGxlZCwgc2VsZik7Ci0JCXNlbGYtPnBvcyArPSBucmVhZDsKLQkJUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQkJaWYgKGJ6ZXJyb3IgPT0gQlpfU1RSRUFNX0VORCkgewotCQkJc2VsZi0+c2l6ZSA9IHNlbGYtPnBvczsKLQkJCXNlbGYtPm1vZGUgPSBNT0RFX1JFQURfRU9GOwotCQkJaWYgKG5yZWFkID09IDApIHsKLQkJCQlzaXplaGludCA9IDA7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlzaG9ydHJlYWQgPSAxOwotCQl9IGVsc2UgaWYgKGJ6ZXJyb3IgIT0gQlpfT0spIHsKLQkJCVV0aWxfQ2F0Y2hCWjJFcnJvcihiemVycm9yKTsKLQkJICBlcnJvcjoKLQkJCVB5X0RFQ1JFRihsaXN0KTsKLQkJCWxpc3QgPSBOVUxMOwotCQkJZ290byBjbGVhbnVwOwotCQl9Ci0JCXRvdGFscmVhZCArPSBucmVhZDsKLQkJcCA9IG1lbWNocihidWZmZXIrbmZpbGxlZCwgJ1xuJywgbnJlYWQpOwotCQlpZiAoIXNob3J0cmVhZCAmJiBwID09IE5VTEwpIHsKLQkJCS8qIE5lZWQgYSBsYXJnZXIgYnVmZmVyIHRvIGZpdCB0aGlzIGxpbmUgKi8KLQkJCW5maWxsZWQgKz0gbnJlYWQ7Ci0JCQlidWZmZXJzaXplICo9IDI7Ci0JCQlpZiAoYnVmZmVyc2l6ZSA+IElOVF9NQVgpIHsKLQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJCQkibGluZSBpcyBsb25nZXIgdGhhbiBhIFB5dGhvbiBzdHJpbmcgY2FuIGhvbGQiKTsKLQkJCQlnb3RvIGVycm9yOwotCQkJfQotCQkJaWYgKGJpZ19idWZmZXIgPT0gTlVMTCkgewotCQkJCS8qIENyZWF0ZSB0aGUgYmlnIGJ1ZmZlciAqLwotCQkJCWJpZ19idWZmZXIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgKLQkJCQkJTlVMTCwgYnVmZmVyc2l6ZSk7Ci0JCQkJaWYgKGJpZ19idWZmZXIgPT0gTlVMTCkKLQkJCQkJZ290byBlcnJvcjsKLQkJCQlidWZmZXIgPSBQeVN0cmluZ19BU19TVFJJTkcoYmlnX2J1ZmZlcik7Ci0JCQkJbWVtY3B5KGJ1ZmZlciwgc21hbGxfYnVmZmVyLCBuZmlsbGVkKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8qIEdyb3cgdGhlIGJpZyBidWZmZXIgKi8KLQkJCQlfUHlTdHJpbmdfUmVzaXplKCZiaWdfYnVmZmVyLCBidWZmZXJzaXplKTsKLQkJCQlidWZmZXIgPSBQeVN0cmluZ19BU19TVFJJTkcoYmlnX2J1ZmZlcik7Ci0JCQl9Ci0JCQljb250aW51ZTsJCQkKLQkJfQotCQllbmQgPSBidWZmZXIrbmZpbGxlZCtucmVhZDsKLQkJcSA9IGJ1ZmZlcjsKLQkJd2hpbGUgKHAgIT0gTlVMTCkgewotCQkJLyogUHJvY2VzcyBjb21wbGV0ZSBsaW5lcyAqLwotCQkJcCsrOwotCQkJbGluZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHEsIHAtcSk7Ci0JCQlpZiAobGluZSA9PSBOVUxMKQotCQkJCWdvdG8gZXJyb3I7Ci0JCQllcnIgPSBQeUxpc3RfQXBwZW5kKGxpc3QsIGxpbmUpOwotCQkJUHlfREVDUkVGKGxpbmUpOwotCQkJaWYgKGVyciAhPSAwKQotCQkJCWdvdG8gZXJyb3I7Ci0JCQlxID0gcDsKLQkJCXAgPSBtZW1jaHIocSwgJ1xuJywgZW5kLXEpOwotCQl9Ci0JCS8qIE1vdmUgdGhlIHJlbWFpbmluZyBpbmNvbXBsZXRlIGxpbmUgdG8gdGhlIHN0YXJ0ICovCi0JCW5maWxsZWQgPSBlbmQtcTsKLQkJbWVtbW92ZShidWZmZXIsIHEsIG5maWxsZWQpOwotCQlpZiAoc2l6ZWhpbnQgPiAwKQotCQkJaWYgKHRvdGFscmVhZCA+PSAoc2l6ZV90KXNpemVoaW50KQotCQkJCWJyZWFrOwotCQlpZiAoc2hvcnRyZWFkKSB7Ci0JCQlzaXplaGludCA9IDA7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlpZiAobmZpbGxlZCAhPSAwKSB7Ci0JCS8qIFBhcnRpYWwgbGFzdCBsaW5lICovCi0JCWxpbmUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShidWZmZXIsIG5maWxsZWQpOwotCQlpZiAobGluZSA9PSBOVUxMKQotCQkJZ290byBlcnJvcjsKLQkJaWYgKHNpemVoaW50ID4gMCkgewotCQkJLyogTmVlZCB0byBjb21wbGV0ZSB0aGUgbGFzdCBsaW5lICovCi0JCQlQeU9iamVjdCAqcmVzdCA9IFV0aWxfR2V0TGluZShzZWxmLCAwKTsKLQkJCWlmIChyZXN0ID09IE5VTEwpIHsKLQkJCQlQeV9ERUNSRUYobGluZSk7Ci0JCQkJZ290byBlcnJvcjsKLQkJCX0KLQkJCVB5U3RyaW5nX0NvbmNhdCgmbGluZSwgcmVzdCk7Ci0JCQlQeV9ERUNSRUYocmVzdCk7Ci0JCQlpZiAobGluZSA9PSBOVUxMKQotCQkJCWdvdG8gZXJyb3I7Ci0JCX0KLQkJZXJyID0gUHlMaXN0X0FwcGVuZChsaXN0LCBsaW5lKTsKLQkJUHlfREVDUkVGKGxpbmUpOwotCQlpZiAoZXJyICE9IDApCi0JCQlnb3RvIGVycm9yOwotCX0KKyAgICBmb3IgKDs7KSB7CisgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgbnJlYWQgPSBVdGlsX1VuaXZOZXdsaW5lUmVhZCgmYnplcnJvciwgc2VsZi0+ZnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyK25maWxsZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyc2l6ZS1uZmlsbGVkLCBzZWxmKTsKKyAgICAgICAgc2VsZi0+cG9zICs9IG5yZWFkOworICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgICAgICBpZiAoYnplcnJvciA9PSBCWl9TVFJFQU1fRU5EKSB7CisgICAgICAgICAgICBzZWxmLT5zaXplID0gc2VsZi0+cG9zOworICAgICAgICAgICAgc2VsZi0+bW9kZSA9IE1PREVfUkVBRF9FT0Y7CisgICAgICAgICAgICBpZiAobnJlYWQgPT0gMCkgeworICAgICAgICAgICAgICAgIHNpemVoaW50ID0gMDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNob3J0cmVhZCA9IDE7CisgICAgICAgIH0gZWxzZSBpZiAoYnplcnJvciAhPSBCWl9PSykgeworICAgICAgICAgICAgVXRpbF9DYXRjaEJaMkVycm9yKGJ6ZXJyb3IpOworICAgICAgICAgIGVycm9yOgorICAgICAgICAgICAgUHlfREVDUkVGKGxpc3QpOworICAgICAgICAgICAgbGlzdCA9IE5VTEw7CisgICAgICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgICAgIH0KKyAgICAgICAgdG90YWxyZWFkICs9IG5yZWFkOworICAgICAgICBwID0gbWVtY2hyKGJ1ZmZlcituZmlsbGVkLCAnXG4nLCBucmVhZCk7CisgICAgICAgIGlmICghc2hvcnRyZWFkICYmIHAgPT0gTlVMTCkgeworICAgICAgICAgICAgLyogTmVlZCBhIGxhcmdlciBidWZmZXIgdG8gZml0IHRoaXMgbGluZSAqLworICAgICAgICAgICAgbmZpbGxlZCArPSBucmVhZDsKKyAgICAgICAgICAgIGJ1ZmZlcnNpemUgKj0gMjsKKyAgICAgICAgICAgIGlmIChidWZmZXJzaXplID4gSU5UX01BWCkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICJsaW5lIGlzIGxvbmdlciB0aGFuIGEgUHl0aG9uIHN0cmluZyBjYW4gaG9sZCIpOworICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYmlnX2J1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgLyogQ3JlYXRlIHRoZSBiaWcgYnVmZmVyICovCisgICAgICAgICAgICAgICAgYmlnX2J1ZmZlciA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKAorICAgICAgICAgICAgICAgICAgICBOVUxMLCBidWZmZXJzaXplKTsKKyAgICAgICAgICAgICAgICBpZiAoYmlnX2J1ZmZlciA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgIGJ1ZmZlciA9IFB5U3RyaW5nX0FTX1NUUklORyhiaWdfYnVmZmVyKTsKKyAgICAgICAgICAgICAgICBtZW1jcHkoYnVmZmVyLCBzbWFsbF9idWZmZXIsIG5maWxsZWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgLyogR3JvdyB0aGUgYmlnIGJ1ZmZlciAqLworICAgICAgICAgICAgICAgIF9QeVN0cmluZ19SZXNpemUoJmJpZ19idWZmZXIsIGJ1ZmZlcnNpemUpOworICAgICAgICAgICAgICAgIGJ1ZmZlciA9IFB5U3RyaW5nX0FTX1NUUklORyhiaWdfYnVmZmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGVuZCA9IGJ1ZmZlcituZmlsbGVkK25yZWFkOworICAgICAgICBxID0gYnVmZmVyOworICAgICAgICB3aGlsZSAocCAhPSBOVUxMKSB7CisgICAgICAgICAgICAvKiBQcm9jZXNzIGNvbXBsZXRlIGxpbmVzICovCisgICAgICAgICAgICBwKys7CisgICAgICAgICAgICBsaW5lID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocSwgcC1xKTsKKyAgICAgICAgICAgIGlmIChsaW5lID09IE5VTEwpCisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgIGVyciA9IFB5TGlzdF9BcHBlbmQobGlzdCwgbGluZSk7CisgICAgICAgICAgICBQeV9ERUNSRUYobGluZSk7CisgICAgICAgICAgICBpZiAoZXJyICE9IDApCisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgIHEgPSBwOworICAgICAgICAgICAgcCA9IG1lbWNocihxLCAnXG4nLCBlbmQtcSk7CisgICAgICAgIH0KKyAgICAgICAgLyogTW92ZSB0aGUgcmVtYWluaW5nIGluY29tcGxldGUgbGluZSB0byB0aGUgc3RhcnQgKi8KKyAgICAgICAgbmZpbGxlZCA9IGVuZC1xOworICAgICAgICBtZW1tb3ZlKGJ1ZmZlciwgcSwgbmZpbGxlZCk7CisgICAgICAgIGlmIChzaXplaGludCA+IDApCisgICAgICAgICAgICBpZiAodG90YWxyZWFkID49IChzaXplX3Qpc2l6ZWhpbnQpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmIChzaG9ydHJlYWQpIHsKKyAgICAgICAgICAgIHNpemVoaW50ID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChuZmlsbGVkICE9IDApIHsKKyAgICAgICAgLyogUGFydGlhbCBsYXN0IGxpbmUgKi8KKyAgICAgICAgbGluZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGJ1ZmZlciwgbmZpbGxlZCk7CisgICAgICAgIGlmIChsaW5lID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICBpZiAoc2l6ZWhpbnQgPiAwKSB7CisgICAgICAgICAgICAvKiBOZWVkIHRvIGNvbXBsZXRlIHRoZSBsYXN0IGxpbmUgKi8KKyAgICAgICAgICAgIFB5T2JqZWN0ICpyZXN0ID0gVXRpbF9HZXRMaW5lKHNlbGYsIDApOworICAgICAgICAgICAgaWYgKHJlc3QgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihsaW5lKTsKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlTdHJpbmdfQ29uY2F0KCZsaW5lLCByZXN0KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihyZXN0KTsKKyAgICAgICAgICAgIGlmIChsaW5lID09IE5VTEwpCisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgICAgICBlcnIgPSBQeUxpc3RfQXBwZW5kKGxpc3QsIGxpbmUpOworICAgICAgICBQeV9ERUNSRUYobGluZSk7CisgICAgICAgIGlmIChlcnIgIT0gMCkKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQogCiAgIGNsZWFudXA6Ci0JUkVMRUFTRV9MT0NLKHNlbGYpOwotCWlmIChiaWdfYnVmZmVyKSB7Ci0JCVB5X0RFQ1JFRihiaWdfYnVmZmVyKTsKLQl9Ci0JcmV0dXJuIGxpc3Q7CisgICAgUkVMRUFTRV9MT0NLKHNlbGYpOworICAgIGlmIChiaWdfYnVmZmVyKSB7CisgICAgICAgIFB5X0RFQ1JFRihiaWdfYnVmZmVyKTsKKyAgICB9CisgICAgcmV0dXJuIGxpc3Q7CiB9CiAKIFB5RG9jX1NUUlZBUihCWjJGaWxlX3hyZWFkbGluZXNfX2RvY19fLApAQCAtNzk2LDUyICs3OTYsNTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBCWjJGaWxlX3dyaXRlKEJaMkZpbGVPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICpyZXQgPSBOVUxMOwotCVB5X2J1ZmZlciBwYnVmOwotCWNoYXIgKmJ1ZjsKLQlpbnQgbGVuOwotCWludCBiemVycm9yOworICAgIFB5T2JqZWN0ICpyZXQgPSBOVUxMOworICAgIFB5X2J1ZmZlciBwYnVmOworICAgIGNoYXIgKmJ1ZjsKKyAgICBpbnQgbGVuOworICAgIGludCBiemVycm9yOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzKjp3cml0ZSIsICZwYnVmKSkKLQkJcmV0dXJuIE5VTEw7Ci0JYnVmID0gcGJ1Zi5idWY7Ci0JbGVuID0gcGJ1Zi5sZW47CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzKjp3cml0ZSIsICZwYnVmKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYnVmID0gcGJ1Zi5idWY7CisgICAgbGVuID0gcGJ1Zi5sZW47CiAKLQlBQ1FVSVJFX0xPQ0soc2VsZik7Ci0Jc3dpdGNoIChzZWxmLT5tb2RlKSB7Ci0JCWNhc2UgTU9ERV9XUklURToKLQkJCWJyZWFrOworICAgIEFDUVVJUkVfTE9DSyhzZWxmKTsKKyAgICBzd2l0Y2ggKHNlbGYtPm1vZGUpIHsKKyAgICAgICAgY2FzZSBNT0RFX1dSSVRFOgorICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBNT0RFX0NMT1NFRDoKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCQkiSS9PIG9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZSIpOwotCQkJZ290byBjbGVhbnVwOworICAgICAgICBjYXNlIE1PREVfQ0xPU0VEOgorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkkvTyBvcGVyYXRpb24gb24gY2xvc2VkIGZpbGUiKTsKKyAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKIAotCQlkZWZhdWx0OgotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0lPRXJyb3IsCi0JCQkJCSJmaWxlIGlzIG5vdCByZWFkeSBmb3Igd3JpdGluZyIpOwotCQkJZ290byBjbGVhbnVwOwotCX0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JT0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmaWxlIGlzIG5vdCByZWFkeSBmb3Igd3JpdGluZyIpOworICAgICAgICAgICAgZ290byBjbGVhbnVwOworICAgIH0KIAotCXNlbGYtPmZfc29mdHNwYWNlID0gMDsKKyAgICBzZWxmLT5mX3NvZnRzcGFjZSA9IDA7CiAKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JQloyX2J6V3JpdGUgKCZiemVycm9yLCBzZWxmLT5mcCwgYnVmLCBsZW4pOwotCXNlbGYtPnBvcyArPSBsZW47Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgQloyX2J6V3JpdGUgKCZiemVycm9yLCBzZWxmLT5mcCwgYnVmLCBsZW4pOworICAgIHNlbGYtPnBvcyArPSBsZW47CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKIAotCWlmIChiemVycm9yICE9IEJaX09LKSB7Ci0JCVV0aWxfQ2F0Y2hCWjJFcnJvcihiemVycm9yKTsKLQkJZ290byBjbGVhbnVwOwotCX0KKyAgICBpZiAoYnplcnJvciAhPSBCWl9PSykgeworICAgICAgICBVdGlsX0NhdGNoQloyRXJyb3IoYnplcnJvcik7CisgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICB9CiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0ID0gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0ID0gUHlfTm9uZTsKIAogY2xlYW51cDoKLQlQeUJ1ZmZlcl9SZWxlYXNlKCZwYnVmKTsKLQlSRUxFQVNFX0xPQ0soc2VsZik7Ci0JcmV0dXJuIHJldDsKKyAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZwYnVmKTsKKyAgICBSRUxFQVNFX0xPQ0soc2VsZik7CisgICAgcmV0dXJuIHJldDsKIH0KIAogUHlEb2NfU1RSVkFSKEJaMkZpbGVfd3JpdGVsaW5lc19fZG9jX18sCkBAIC04NTcsMTI0ICs4NTcsMTI0IEBACiBCWjJGaWxlX3dyaXRlbGluZXMoQloyRmlsZU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnNlcSkKIHsKICNkZWZpbmUgQ0hVTktTSVpFIDEwMDAKLQlQeU9iamVjdCAqbGlzdCA9IE5VTEw7Ci0JUHlPYmplY3QgKml0ZXIgPSBOVUxMOwotCVB5T2JqZWN0ICpyZXQgPSBOVUxMOwotCVB5T2JqZWN0ICpsaW5lOwotCWludCBpLCBqLCBpbmRleCwgbGVuLCBpc2xpc3Q7Ci0JaW50IGJ6ZXJyb3I7CisgICAgUHlPYmplY3QgKmxpc3QgPSBOVUxMOworICAgIFB5T2JqZWN0ICppdGVyID0gTlVMTDsKKyAgICBQeU9iamVjdCAqcmV0ID0gTlVMTDsKKyAgICBQeU9iamVjdCAqbGluZTsKKyAgICBpbnQgaSwgaiwgaW5kZXgsIGxlbiwgaXNsaXN0OworICAgIGludCBiemVycm9yOwogCi0JQUNRVUlSRV9MT0NLKHNlbGYpOwotCXN3aXRjaCAoc2VsZi0+bW9kZSkgewotCQljYXNlIE1PREVfV1JJVEU6Ci0JCQlicmVhazsKKyAgICBBQ1FVSVJFX0xPQ0soc2VsZik7CisgICAgc3dpdGNoIChzZWxmLT5tb2RlKSB7CisgICAgICAgIGNhc2UgTU9ERV9XUklURToKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgTU9ERV9DTE9TRUQ6Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkJIkkvTyBvcGVyYXRpb24gb24gY2xvc2VkIGZpbGUiKTsKLQkJCWdvdG8gZXJyb3I7CisgICAgICAgIGNhc2UgTU9ERV9DTE9TRUQ6CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSS9PIG9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZSIpOworICAgICAgICAgICAgZ290byBlcnJvcjsKIAotCQlkZWZhdWx0OgotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0lPRXJyb3IsCi0JCQkJCSJmaWxlIGlzIG5vdCByZWFkeSBmb3Igd3JpdGluZyIpOwotCQkJZ290byBlcnJvcjsKLQl9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSU9FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmlsZSBpcyBub3QgcmVhZHkgZm9yIHdyaXRpbmciKTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQogCi0JaXNsaXN0ID0gUHlMaXN0X0NoZWNrKHNlcSk7Ci0JaWYgICghaXNsaXN0KSB7Ci0JCWl0ZXIgPSBQeU9iamVjdF9HZXRJdGVyKHNlcSk7Ci0JCWlmIChpdGVyID09IE5VTEwpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJIndyaXRlbGluZXMoKSByZXF1aXJlcyBhbiBpdGVyYWJsZSBhcmd1bWVudCIpOwotCQkJZ290byBlcnJvcjsKLQkJfQotCQlsaXN0ID0gUHlMaXN0X05ldyhDSFVOS1NJWkUpOwotCQlpZiAobGlzdCA9PSBOVUxMKQotCQkJZ290byBlcnJvcjsKLQl9CisgICAgaXNsaXN0ID0gUHlMaXN0X0NoZWNrKHNlcSk7CisgICAgaWYgICghaXNsaXN0KSB7CisgICAgICAgIGl0ZXIgPSBQeU9iamVjdF9HZXRJdGVyKHNlcSk7CisgICAgICAgIGlmIChpdGVyID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgIndyaXRlbGluZXMoKSByZXF1aXJlcyBhbiBpdGVyYWJsZSBhcmd1bWVudCIpOworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgICAgICBsaXN0ID0gUHlMaXN0X05ldyhDSFVOS1NJWkUpOworICAgICAgICBpZiAobGlzdCA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CiAKLQkvKiBTdHJhdGVneTogc2x1cnAgQ0hVTktTSVpFIGxpbmVzIGludG8gYSBwcml2YXRlIGxpc3QsCi0JICAgY2hlY2tpbmcgdGhhdCB0aGV5IGFyZSBhbGwgc3RyaW5ncywgdGhlbiB3cml0ZSB0aGF0IGxpc3QKLQkgICB3aXRob3V0IGhvbGRpbmcgdGhlIGludGVycHJldGVyIGxvY2ssIHRoZW4gY29tZSBiYWNrIGZvciBtb3JlLiAqLwotCWZvciAoaW5kZXggPSAwOyA7IGluZGV4ICs9IENIVU5LU0laRSkgewotCQlpZiAoaXNsaXN0KSB7Ci0JCQlQeV9YREVDUkVGKGxpc3QpOwotCQkJbGlzdCA9IFB5TGlzdF9HZXRTbGljZShzZXEsIGluZGV4LCBpbmRleCtDSFVOS1NJWkUpOwotCQkJaWYgKGxpc3QgPT0gTlVMTCkKLQkJCQlnb3RvIGVycm9yOwotCQkJaiA9IFB5TGlzdF9HRVRfU0laRShsaXN0KTsKLQkJfQotCQllbHNlIHsKLQkJCWZvciAoaiA9IDA7IGogPCBDSFVOS1NJWkU7IGorKykgewotCQkJCWxpbmUgPSBQeUl0ZXJfTmV4dChpdGVyKTsKLQkJCQlpZiAobGluZSA9PSBOVUxMKSB7Ci0JCQkJCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQkJCQkJZ290byBlcnJvcjsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCVB5TGlzdF9TZXRJdGVtKGxpc3QsIGosIGxpbmUpOwotCQkJfQotCQl9Ci0JCWlmIChqID09IDApCi0JCQlicmVhazsKKyAgICAvKiBTdHJhdGVneTogc2x1cnAgQ0hVTktTSVpFIGxpbmVzIGludG8gYSBwcml2YXRlIGxpc3QsCisgICAgICAgY2hlY2tpbmcgdGhhdCB0aGV5IGFyZSBhbGwgc3RyaW5ncywgdGhlbiB3cml0ZSB0aGF0IGxpc3QKKyAgICAgICB3aXRob3V0IGhvbGRpbmcgdGhlIGludGVycHJldGVyIGxvY2ssIHRoZW4gY29tZSBiYWNrIGZvciBtb3JlLiAqLworICAgIGZvciAoaW5kZXggPSAwOyA7IGluZGV4ICs9IENIVU5LU0laRSkgeworICAgICAgICBpZiAoaXNsaXN0KSB7CisgICAgICAgICAgICBQeV9YREVDUkVGKGxpc3QpOworICAgICAgICAgICAgbGlzdCA9IFB5TGlzdF9HZXRTbGljZShzZXEsIGluZGV4LCBpbmRleCtDSFVOS1NJWkUpOworICAgICAgICAgICAgaWYgKGxpc3QgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgaiA9IFB5TGlzdF9HRVRfU0laRShsaXN0KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBDSFVOS1NJWkU7IGorKykgeworICAgICAgICAgICAgICAgIGxpbmUgPSBQeUl0ZXJfTmV4dChpdGVyKTsKKyAgICAgICAgICAgICAgICBpZiAobGluZSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFB5TGlzdF9TZXRJdGVtKGxpc3QsIGosIGxpbmUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChqID09IDApCisgICAgICAgICAgICBicmVhazsKIAotCQkvKiBDaGVjayB0aGF0IGFsbCBlbnRyaWVzIGFyZSBpbmRlZWQgc3RyaW5ncy4gSWYgbm90LAotCQkgICBhcHBseSB0aGUgc2FtZSBydWxlcyBhcyBmb3IgZmlsZS53cml0ZSgpIGFuZAotCQkgICBjb252ZXJ0IHRoZSByZXRzIHRvIHN0cmluZ3MuIFRoaXMgaXMgc2xvdywgYnV0Ci0JCSAgIHNlZW1zIHRvIGJlIHRoZSBvbmx5IHdheSBzaW5jZSBhbGwgY29udmVyc2lvbiBBUElzCi0JCSAgIGNvdWxkIHBvdGVudGlhbGx5IGV4ZWN1dGUgUHl0aG9uIGNvZGUuICovCi0JCWZvciAoaSA9IDA7IGkgPCBqOyBpKyspIHsKLQkJCVB5T2JqZWN0ICp2ID0gUHlMaXN0X0dFVF9JVEVNKGxpc3QsIGkpOwotCQkJaWYgKCFQeVN0cmluZ19DaGVjayh2KSkgewotCQkJICAgIAljb25zdCBjaGFyICpidWZmZXI7Ci0JCQkgICAgCVB5X3NzaXplX3QgbGVuOwotCQkJCWlmIChQeU9iamVjdF9Bc0NoYXJCdWZmZXIodiwgJmJ1ZmZlciwgJmxlbikpIHsKLQkJCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkJCQkid3JpdGVsaW5lcygpICIKLQkJCQkJCQkiYXJndW1lbnQgbXVzdCBiZSAiCi0JCQkJCQkJImEgc2VxdWVuY2Ugb2YgIgotCQkJCQkJCSJzdHJpbmdzIik7Ci0JCQkJCWdvdG8gZXJyb3I7Ci0JCQkJfQotCQkJCWxpbmUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShidWZmZXIsCi0JCQkJCQkJCSAgbGVuKTsKLQkJCQlpZiAobGluZSA9PSBOVUxMKQotCQkJCQlnb3RvIGVycm9yOwotCQkJCVB5X0RFQ1JFRih2KTsKLQkJCQlQeUxpc3RfU0VUX0lURU0obGlzdCwgaSwgbGluZSk7Ci0JCQl9Ci0JCX0KKyAgICAgICAgLyogQ2hlY2sgdGhhdCBhbGwgZW50cmllcyBhcmUgaW5kZWVkIHN0cmluZ3MuIElmIG5vdCwKKyAgICAgICAgICAgYXBwbHkgdGhlIHNhbWUgcnVsZXMgYXMgZm9yIGZpbGUud3JpdGUoKSBhbmQKKyAgICAgICAgICAgY29udmVydCB0aGUgcmV0cyB0byBzdHJpbmdzLiBUaGlzIGlzIHNsb3csIGJ1dAorICAgICAgICAgICBzZWVtcyB0byBiZSB0aGUgb25seSB3YXkgc2luY2UgYWxsIGNvbnZlcnNpb24gQVBJcworICAgICAgICAgICBjb3VsZCBwb3RlbnRpYWxseSBleGVjdXRlIFB5dGhvbiBjb2RlLiAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgajsgaSsrKSB7CisgICAgICAgICAgICBQeU9iamVjdCAqdiA9IFB5TGlzdF9HRVRfSVRFTShsaXN0LCBpKTsKKyAgICAgICAgICAgIGlmICghUHlTdHJpbmdfQ2hlY2sodikpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpidWZmZXI7CisgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBsZW47CisgICAgICAgICAgICAgICAgaWYgKFB5T2JqZWN0X0FzQ2hhckJ1ZmZlcih2LCAmYnVmZmVyLCAmbGVuKSkgeworICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndyaXRlbGluZXMoKSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXJndW1lbnQgbXVzdCBiZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYSBzZXF1ZW5jZSBvZiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RyaW5ncyIpOworICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsaW5lID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4pOworICAgICAgICAgICAgICAgIGlmIChsaW5lID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgICAgIFB5TGlzdF9TRVRfSVRFTShsaXN0LCBpLCBsaW5lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCXNlbGYtPmZfc29mdHNwYWNlID0gMDsKKyAgICAgICAgc2VsZi0+Zl9zb2Z0c3BhY2UgPSAwOwogCi0JCS8qIFNpbmNlIHdlIGFyZSByZWxlYXNpbmcgdGhlIGdsb2JhbCBsb2NrLCB0aGUKLQkJICAgZm9sbG93aW5nIGNvZGUgbWF5ICpub3QqIGV4ZWN1dGUgUHl0aG9uIGNvZGUuICovCi0JCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQkJZm9yIChpID0gMDsgaSA8IGo7IGkrKykgewotCQkgICAgCWxpbmUgPSBQeUxpc3RfR0VUX0lURU0obGlzdCwgaSk7Ci0JCQlsZW4gPSBQeVN0cmluZ19HRVRfU0laRShsaW5lKTsKLQkJCUJaMl9ieldyaXRlICgmYnplcnJvciwgc2VsZi0+ZnAsCi0JCQkJICAgICBQeVN0cmluZ19BU19TVFJJTkcobGluZSksIGxlbik7Ci0JCQlpZiAoYnplcnJvciAhPSBCWl9PSykgewotCQkJCVB5X0JMT0NLX1RIUkVBRFMKLQkJCQlVdGlsX0NhdGNoQloyRXJyb3IoYnplcnJvcik7Ci0JCQkJZ290byBlcnJvcjsKLQkJCX0KLQkJfQotCQlQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgICAgICAvKiBTaW5jZSB3ZSBhcmUgcmVsZWFzaW5nIHRoZSBnbG9iYWwgbG9jaywgdGhlCisgICAgICAgICAgIGZvbGxvd2luZyBjb2RlIG1heSAqbm90KiBleGVjdXRlIFB5dGhvbiBjb2RlLiAqLworICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBqOyBpKyspIHsKKyAgICAgICAgICAgIGxpbmUgPSBQeUxpc3RfR0VUX0lURU0obGlzdCwgaSk7CisgICAgICAgICAgICBsZW4gPSBQeVN0cmluZ19HRVRfU0laRShsaW5lKTsKKyAgICAgICAgICAgIEJaMl9ieldyaXRlICgmYnplcnJvciwgc2VsZi0+ZnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKGxpbmUpLCBsZW4pOworICAgICAgICAgICAgaWYgKGJ6ZXJyb3IgIT0gQlpfT0spIHsKKyAgICAgICAgICAgICAgICBQeV9CTE9DS19USFJFQURTCisgICAgICAgICAgICAgICAgVXRpbF9DYXRjaEJaMkVycm9yKGJ6ZXJyb3IpOworICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKIAotCQlpZiAoaiA8IENIVU5LU0laRSkKLQkJCWJyZWFrOwotCX0KKyAgICAgICAgaWYgKGogPCBDSFVOS1NJWkUpCisgICAgICAgICAgICBicmVhazsKKyAgICB9CiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0ID0gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0ID0gUHlfTm9uZTsKIAogICBlcnJvcjoKLQlSRUxFQVNFX0xPQ0soc2VsZik7Ci0JUHlfWERFQ1JFRihsaXN0KTsKLSAgCVB5X1hERUNSRUYoaXRlcik7Ci0JcmV0dXJuIHJldDsKKyAgICBSRUxFQVNFX0xPQ0soc2VsZik7CisgICAgUHlfWERFQ1JFRihsaXN0KTsKKyAgICBQeV9YREVDUkVGKGl0ZXIpOworICAgIHJldHVybiByZXQ7CiAjdW5kZWYgQ0hVTktTSVpFCiB9CiAKQEAgLTk5NCwxNDggKzk5NCwxNDggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBCWjJGaWxlX3NlZWsoQloyRmlsZU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IHdoZXJlID0gMDsKLQlQeU9iamVjdCAqb2Zmb2JqOwotCVB5X29mZl90IG9mZnNldDsKLQljaGFyIHNtYWxsX2J1ZmZlcltTTUFMTENIVU5LXTsKLQljaGFyICpidWZmZXIgPSBzbWFsbF9idWZmZXI7Ci0Jc2l6ZV90IGJ1ZmZlcnNpemUgPSBTTUFMTENIVU5LOwotCVB5X29mZl90IGJ5dGVzcmVhZCA9IDA7Ci0Jc2l6ZV90IHJlYWRzaXplOwotCWludCBjaHVua3NpemU7Ci0JaW50IGJ6ZXJyb3I7Ci0JUHlPYmplY3QgKnJldCA9IE5VTEw7CisgICAgaW50IHdoZXJlID0gMDsKKyAgICBQeU9iamVjdCAqb2Zmb2JqOworICAgIFB5X29mZl90IG9mZnNldDsKKyAgICBjaGFyIHNtYWxsX2J1ZmZlcltTTUFMTENIVU5LXTsKKyAgICBjaGFyICpidWZmZXIgPSBzbWFsbF9idWZmZXI7CisgICAgc2l6ZV90IGJ1ZmZlcnNpemUgPSBTTUFMTENIVU5LOworICAgIFB5X29mZl90IGJ5dGVzcmVhZCA9IDA7CisgICAgc2l6ZV90IHJlYWRzaXplOworICAgIGludCBjaHVua3NpemU7CisgICAgaW50IGJ6ZXJyb3I7CisgICAgUHlPYmplY3QgKnJldCA9IE5VTEw7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98aTpzZWVrIiwgJm9mZm9iaiwgJndoZXJlKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfGk6c2VlayIsICZvZmZvYmosICZ3aGVyZSkpCisgICAgICAgIHJldHVybiBOVUxMOwogI2lmICFkZWZpbmVkKEhBVkVfTEFSR0VGSUxFX1NVUFBPUlQpCi0Jb2Zmc2V0ID0gUHlJbnRfQXNMb25nKG9mZm9iaik7CisgICAgb2Zmc2V0ID0gUHlJbnRfQXNMb25nKG9mZm9iaik7CiAjZWxzZQotCW9mZnNldCA9IFB5TG9uZ19DaGVjayhvZmZvYmopID8KLQkJUHlMb25nX0FzTG9uZ0xvbmcob2Zmb2JqKSA6IFB5SW50X0FzTG9uZyhvZmZvYmopOworICAgIG9mZnNldCA9IFB5TG9uZ19DaGVjayhvZmZvYmopID8KKyAgICAgICAgUHlMb25nX0FzTG9uZ0xvbmcob2Zmb2JqKSA6IFB5SW50X0FzTG9uZyhvZmZvYmopOwogI2VuZGlmCi0JaWYgKFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiBOVUxMOworICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCUFDUVVJUkVfTE9DSyhzZWxmKTsKLQlVdGlsX0Ryb3BSZWFkQWhlYWQoc2VsZik7Ci0Jc3dpdGNoIChzZWxmLT5tb2RlKSB7Ci0JCWNhc2UgTU9ERV9SRUFEOgotCQljYXNlIE1PREVfUkVBRF9FT0Y6Ci0JCQlicmVhazsKKyAgICBBQ1FVSVJFX0xPQ0soc2VsZik7CisgICAgVXRpbF9Ecm9wUmVhZEFoZWFkKHNlbGYpOworICAgIHN3aXRjaCAoc2VsZi0+bW9kZSkgeworICAgICAgICBjYXNlIE1PREVfUkVBRDoKKyAgICAgICAgY2FzZSBNT0RFX1JFQURfRU9GOgorICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBNT0RFX0NMT1NFRDoKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCQkiSS9PIG9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZSIpOwotCQkJZ290byBjbGVhbnVwOworICAgICAgICBjYXNlIE1PREVfQ0xPU0VEOgorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkkvTyBvcGVyYXRpb24gb24gY2xvc2VkIGZpbGUiKTsKKyAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKIAotCQlkZWZhdWx0OgotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0lPRXJyb3IsCi0JCQkJCSJzZWVrIHdvcmtzIG9ubHkgd2hpbGUgcmVhZGluZyIpOwotCQkJZ290byBjbGVhbnVwOwotCX0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JT0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZWVrIHdvcmtzIG9ubHkgd2hpbGUgcmVhZGluZyIpOworICAgICAgICAgICAgZ290byBjbGVhbnVwOworICAgIH0KIAotCWlmICh3aGVyZSA9PSAyKSB7Ci0JCWlmIChzZWxmLT5zaXplID09IC0xKSB7Ci0JCQlhc3NlcnQoc2VsZi0+bW9kZSAhPSBNT0RFX1JFQURfRU9GKTsKLQkJCWZvciAoOzspIHsKLQkJCQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JCQkJY2h1bmtzaXplID0gVXRpbF9Vbml2TmV3bGluZVJlYWQoCi0JCQkJCQkmYnplcnJvciwgc2VsZi0+ZnAsCi0JCQkJCQlidWZmZXIsIGJ1ZmZlcnNpemUsCi0JCQkJCQlzZWxmKTsKLQkJCQlzZWxmLT5wb3MgKz0gY2h1bmtzaXplOwotCQkJCVB5X0VORF9BTExPV19USFJFQURTCisgICAgaWYgKHdoZXJlID09IDIpIHsKKyAgICAgICAgaWYgKHNlbGYtPnNpemUgPT0gLTEpIHsKKyAgICAgICAgICAgIGFzc2VydChzZWxmLT5tb2RlICE9IE1PREVfUkVBRF9FT0YpOworICAgICAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgICAgICAgICBjaHVua3NpemUgPSBVdGlsX1VuaXZOZXdsaW5lUmVhZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ6ZXJyb3IsIHNlbGYtPmZwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsIGJ1ZmZlcnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYpOworICAgICAgICAgICAgICAgIHNlbGYtPnBvcyArPSBjaHVua3NpemU7CisgICAgICAgICAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKIAotCQkJCWJ5dGVzcmVhZCArPSBjaHVua3NpemU7Ci0JCQkJaWYgKGJ6ZXJyb3IgPT0gQlpfU1RSRUFNX0VORCkgewotCQkJCQlicmVhazsKLQkJCQl9IGVsc2UgaWYgKGJ6ZXJyb3IgIT0gQlpfT0spIHsKLQkJCQkJVXRpbF9DYXRjaEJaMkVycm9yKGJ6ZXJyb3IpOwotCQkJCQlnb3RvIGNsZWFudXA7Ci0JCQkJfQotCQkJfQotCQkJc2VsZi0+bW9kZSA9IE1PREVfUkVBRF9FT0Y7Ci0JCQlzZWxmLT5zaXplID0gc2VsZi0+cG9zOwotCQkJYnl0ZXNyZWFkID0gMDsKLQkJfQotCQlvZmZzZXQgPSBzZWxmLT5zaXplICsgb2Zmc2V0OwotCX0gZWxzZSBpZiAod2hlcmUgPT0gMSkgewotCQlvZmZzZXQgPSBzZWxmLT5wb3MgKyBvZmZzZXQ7Ci0JfQorICAgICAgICAgICAgICAgIGJ5dGVzcmVhZCArPSBjaHVua3NpemU7CisgICAgICAgICAgICAgICAgaWYgKGJ6ZXJyb3IgPT0gQlpfU1RSRUFNX0VORCkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJ6ZXJyb3IgIT0gQlpfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgVXRpbF9DYXRjaEJaMkVycm9yKGJ6ZXJyb3IpOworICAgICAgICAgICAgICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc2VsZi0+bW9kZSA9IE1PREVfUkVBRF9FT0Y7CisgICAgICAgICAgICBzZWxmLT5zaXplID0gc2VsZi0+cG9zOworICAgICAgICAgICAgYnl0ZXNyZWFkID0gMDsKKyAgICAgICAgfQorICAgICAgICBvZmZzZXQgPSBzZWxmLT5zaXplICsgb2Zmc2V0OworICAgIH0gZWxzZSBpZiAod2hlcmUgPT0gMSkgeworICAgICAgICBvZmZzZXQgPSBzZWxmLT5wb3MgKyBvZmZzZXQ7CisgICAgfQogCi0JLyogQmVmb3JlIGdldHRpbmcgaGVyZSwgb2Zmc2V0IG11c3QgYmUgdGhlIGFic29sdXRlIHBvc2l0aW9uIHRoZSBmaWxlIAotCSAqIHBvaW50ZXIgc2hvdWxkIGJlIHNldCB0by4gKi8KKyAgICAvKiBCZWZvcmUgZ2V0dGluZyBoZXJlLCBvZmZzZXQgbXVzdCBiZSB0aGUgYWJzb2x1dGUgcG9zaXRpb24gdGhlIGZpbGUKKyAgICAgKiBwb2ludGVyIHNob3VsZCBiZSBzZXQgdG8uICovCiAKLQlpZiAob2Zmc2V0ID49IHNlbGYtPnBvcykgewotCQkvKiB3ZSBjYW4gbW92ZSBmb3J3YXJkICovCi0JCW9mZnNldCAtPSBzZWxmLT5wb3M7Ci0JfSBlbHNlIHsKLQkJLyogd2UgY2Fubm90IG1vdmUgYmFjaywgc28gcmV3aW5kIHRoZSBzdHJlYW0gKi8KLQkJQloyX2J6UmVhZENsb3NlKCZiemVycm9yLCBzZWxmLT5mcCk7Ci0JCWlmIChzZWxmLT5mcCkgewotCQkJUHlGaWxlX0RlY1VzZUNvdW50KChQeUZpbGVPYmplY3QgKilzZWxmLT5maWxlKTsKLQkJCXNlbGYtPmZwID0gTlVMTDsKLQkJfQotCQlpZiAoYnplcnJvciAhPSBCWl9PSykgewotCQkJVXRpbF9DYXRjaEJaMkVycm9yKGJ6ZXJyb3IpOwotCQkJZ290byBjbGVhbnVwOwotCQl9Ci0JCXJldCA9IFB5T2JqZWN0X0NhbGxNZXRob2Qoc2VsZi0+ZmlsZSwgInNlZWsiLCAiKGkpIiwgMCk7Ci0JCWlmICghcmV0KQotCQkJZ290byBjbGVhbnVwOwotCQlQeV9ERUNSRUYocmV0KTsKLQkJcmV0ID0gTlVMTDsKLQkJc2VsZi0+cG9zID0gMDsKLQkJc2VsZi0+ZnAgPSBCWjJfYnpSZWFkT3BlbigmYnplcnJvciwgUHlGaWxlX0FzRmlsZShzZWxmLT5maWxlKSwKLQkJCQkJICAwLCAwLCBOVUxMLCAwKTsKLQkJaWYgKHNlbGYtPmZwKQotCQkJUHlGaWxlX0luY1VzZUNvdW50KChQeUZpbGVPYmplY3QgKilzZWxmLT5maWxlKTsKLQkJaWYgKGJ6ZXJyb3IgIT0gQlpfT0spIHsKLQkJCVV0aWxfQ2F0Y2hCWjJFcnJvcihiemVycm9yKTsKLQkJCWdvdG8gY2xlYW51cDsKLQkJfQotCQlzZWxmLT5tb2RlID0gTU9ERV9SRUFEOwotCX0KKyAgICBpZiAob2Zmc2V0ID49IHNlbGYtPnBvcykgeworICAgICAgICAvKiB3ZSBjYW4gbW92ZSBmb3J3YXJkICovCisgICAgICAgIG9mZnNldCAtPSBzZWxmLT5wb3M7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogd2UgY2Fubm90IG1vdmUgYmFjaywgc28gcmV3aW5kIHRoZSBzdHJlYW0gKi8KKyAgICAgICAgQloyX2J6UmVhZENsb3NlKCZiemVycm9yLCBzZWxmLT5mcCk7CisgICAgICAgIGlmIChzZWxmLT5mcCkgeworICAgICAgICAgICAgUHlGaWxlX0RlY1VzZUNvdW50KChQeUZpbGVPYmplY3QgKilzZWxmLT5maWxlKTsKKyAgICAgICAgICAgIHNlbGYtPmZwID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoYnplcnJvciAhPSBCWl9PSykgeworICAgICAgICAgICAgVXRpbF9DYXRjaEJaMkVycm9yKGJ6ZXJyb3IpOworICAgICAgICAgICAgZ290byBjbGVhbnVwOworICAgICAgICB9CisgICAgICAgIHJldCA9IFB5T2JqZWN0X0NhbGxNZXRob2Qoc2VsZi0+ZmlsZSwgInNlZWsiLCAiKGkpIiwgMCk7CisgICAgICAgIGlmICghcmV0KQorICAgICAgICAgICAgZ290byBjbGVhbnVwOworICAgICAgICBQeV9ERUNSRUYocmV0KTsKKyAgICAgICAgcmV0ID0gTlVMTDsKKyAgICAgICAgc2VsZi0+cG9zID0gMDsKKyAgICAgICAgc2VsZi0+ZnAgPSBCWjJfYnpSZWFkT3BlbigmYnplcnJvciwgUHlGaWxlX0FzRmlsZShzZWxmLT5maWxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCBOVUxMLCAwKTsKKyAgICAgICAgaWYgKHNlbGYtPmZwKQorICAgICAgICAgICAgUHlGaWxlX0luY1VzZUNvdW50KChQeUZpbGVPYmplY3QgKilzZWxmLT5maWxlKTsKKyAgICAgICAgaWYgKGJ6ZXJyb3IgIT0gQlpfT0spIHsKKyAgICAgICAgICAgIFV0aWxfQ2F0Y2hCWjJFcnJvcihiemVycm9yKTsKKyAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICAgICAgfQorICAgICAgICBzZWxmLT5tb2RlID0gTU9ERV9SRUFEOworICAgIH0KIAotCWlmIChvZmZzZXQgPD0gMCB8fCBzZWxmLT5tb2RlID09IE1PREVfUkVBRF9FT0YpCi0JCWdvdG8gZXhpdDsKKyAgICBpZiAob2Zmc2V0IDw9IDAgfHwgc2VsZi0+bW9kZSA9PSBNT0RFX1JFQURfRU9GKQorICAgICAgICBnb3RvIGV4aXQ7CiAKLQkvKiBCZWZvcmUgZ2V0dGluZyBoZXJlLCBvZmZzZXQgbXVzdCBiZSBzZXQgdG8gdGhlIG51bWJlciBvZiBieXRlcwotCSAqIHRvIHdhbGsgZm9yd2FyZC4gKi8KLQlmb3IgKDs7KSB7Ci0JCWlmIChvZmZzZXQtYnl0ZXNyZWFkID4gYnVmZmVyc2l6ZSkKLQkJCXJlYWRzaXplID0gYnVmZmVyc2l6ZTsKLQkJZWxzZQotCQkJLyogb2Zmc2V0IG1pZ2h0IGJlIHdpZGVyIHRoYXQgcmVhZHNpemUsIGJ1dCB0aGUgcmVzdWx0Ci0JCQkgKiBvZiB0aGUgc3VidHJhY3Rpb24gaXMgYm91bmQgYnkgYnVmZmVyc2l6ZSAoc2VlIHRoZQotCQkJICogY29uZGl0aW9uIGFib3ZlKS4gYnVmZmVyc2l6ZSBpcyA4MTkyLiAqLwotCQkJcmVhZHNpemUgPSAoc2l6ZV90KShvZmZzZXQtYnl0ZXNyZWFkKTsKLQkJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCQljaHVua3NpemUgPSBVdGlsX1VuaXZOZXdsaW5lUmVhZCgmYnplcnJvciwgc2VsZi0+ZnAsCi0JCQkJCQkgYnVmZmVyLCByZWFkc2l6ZSwgc2VsZik7Ci0JCXNlbGYtPnBvcyArPSBjaHVua3NpemU7Ci0JCVB5X0VORF9BTExPV19USFJFQURTCi0JCWJ5dGVzcmVhZCArPSBjaHVua3NpemU7Ci0JCWlmIChiemVycm9yID09IEJaX1NUUkVBTV9FTkQpIHsKLQkJCXNlbGYtPnNpemUgPSBzZWxmLT5wb3M7Ci0JCQlzZWxmLT5tb2RlID0gTU9ERV9SRUFEX0VPRjsKLQkJCWJyZWFrOwotCQl9IGVsc2UgaWYgKGJ6ZXJyb3IgIT0gQlpfT0spIHsKLQkJCVV0aWxfQ2F0Y2hCWjJFcnJvcihiemVycm9yKTsKLQkJCWdvdG8gY2xlYW51cDsKLQkJfQotCQlpZiAoYnl0ZXNyZWFkID09IG9mZnNldCkKLQkJCWJyZWFrOwotCX0KKyAgICAvKiBCZWZvcmUgZ2V0dGluZyBoZXJlLCBvZmZzZXQgbXVzdCBiZSBzZXQgdG8gdGhlIG51bWJlciBvZiBieXRlcworICAgICAqIHRvIHdhbGsgZm9yd2FyZC4gKi8KKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGlmIChvZmZzZXQtYnl0ZXNyZWFkID4gYnVmZmVyc2l6ZSkKKyAgICAgICAgICAgIHJlYWRzaXplID0gYnVmZmVyc2l6ZTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgLyogb2Zmc2V0IG1pZ2h0IGJlIHdpZGVyIHRoYXQgcmVhZHNpemUsIGJ1dCB0aGUgcmVzdWx0CisgICAgICAgICAgICAgKiBvZiB0aGUgc3VidHJhY3Rpb24gaXMgYm91bmQgYnkgYnVmZmVyc2l6ZSAoc2VlIHRoZQorICAgICAgICAgICAgICogY29uZGl0aW9uIGFib3ZlKS4gYnVmZmVyc2l6ZSBpcyA4MTkyLiAqLworICAgICAgICAgICAgcmVhZHNpemUgPSAoc2l6ZV90KShvZmZzZXQtYnl0ZXNyZWFkKTsKKyAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICBjaHVua3NpemUgPSBVdGlsX1VuaXZOZXdsaW5lUmVhZCgmYnplcnJvciwgc2VsZi0+ZnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwgcmVhZHNpemUsIHNlbGYpOworICAgICAgICBzZWxmLT5wb3MgKz0gY2h1bmtzaXplOworICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgICAgICBieXRlc3JlYWQgKz0gY2h1bmtzaXplOworICAgICAgICBpZiAoYnplcnJvciA9PSBCWl9TVFJFQU1fRU5EKSB7CisgICAgICAgICAgICBzZWxmLT5zaXplID0gc2VsZi0+cG9zOworICAgICAgICAgICAgc2VsZi0+bW9kZSA9IE1PREVfUkVBRF9FT0Y7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIGlmIChiemVycm9yICE9IEJaX09LKSB7CisgICAgICAgICAgICBVdGlsX0NhdGNoQloyRXJyb3IoYnplcnJvcik7CisgICAgICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJ5dGVzcmVhZCA9PSBvZmZzZXQpCisgICAgICAgICAgICBicmVhazsKKyAgICB9CiAKIGV4aXQ6Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldCA9IFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldCA9IFB5X05vbmU7CiAKIGNsZWFudXA6Ci0JUkVMRUFTRV9MT0NLKHNlbGYpOwotCXJldHVybiByZXQ7CisgICAgUkVMRUFTRV9MT0NLKHNlbGYpOworICAgIHJldHVybiByZXQ7CiB9CiAKIFB5RG9jX1NUUlZBUihCWjJGaWxlX3RlbGxfX2RvY19fLApAQCAtMTE0NywyMiArMTE0NywyMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIEJaMkZpbGVfdGVsbChCWjJGaWxlT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqcmV0ID0gTlVMTDsKKyAgICBQeU9iamVjdCAqcmV0ID0gTlVMTDsKIAotCWlmIChzZWxmLT5tb2RlID09IE1PREVfQ0xPU0VEKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJJL08gb3BlcmF0aW9uIG9uIGNsb3NlZCBmaWxlIik7Ci0JCWdvdG8gY2xlYW51cDsKLQl9CisgICAgaWYgKHNlbGYtPm1vZGUgPT0gTU9ERV9DTE9TRUQpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiSS9PIG9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZSIpOworICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgfQogCiAjaWYgIWRlZmluZWQoSEFWRV9MQVJHRUZJTEVfU1VQUE9SVCkKLQlyZXQgPSBQeUludF9Gcm9tTG9uZyhzZWxmLT5wb3MpOworICAgIHJldCA9IFB5SW50X0Zyb21Mb25nKHNlbGYtPnBvcyk7CiAjZWxzZQotCXJldCA9IFB5TG9uZ19Gcm9tTG9uZ0xvbmcoc2VsZi0+cG9zKTsKKyAgICByZXQgPSBQeUxvbmdfRnJvbUxvbmdMb25nKHNlbGYtPnBvcyk7CiAjZW5kaWYKIAogY2xlYW51cDoKLQlyZXR1cm4gcmV0OworICAgIHJldHVybiByZXQ7CiB9CiAKIFB5RG9jX1NUUlZBUihCWjJGaWxlX2Nsb3NlX19kb2NfXywKQEAgLTExNzYsNDkgKzExNzYsNDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBCWjJGaWxlX2Nsb3NlKEJaMkZpbGVPYmplY3QgKnNlbGYpCiB7Ci0JUHlPYmplY3QgKnJldCA9IE5VTEw7Ci0JaW50IGJ6ZXJyb3IgPSBCWl9PSzsKKyAgICBQeU9iamVjdCAqcmV0ID0gTlVMTDsKKyAgICBpbnQgYnplcnJvciA9IEJaX09LOwogCi0JQUNRVUlSRV9MT0NLKHNlbGYpOwotCXN3aXRjaCAoc2VsZi0+bW9kZSkgewotCQljYXNlIE1PREVfUkVBRDoKLQkJY2FzZSBNT0RFX1JFQURfRU9GOgotCQkJQloyX2J6UmVhZENsb3NlKCZiemVycm9yLCBzZWxmLT5mcCk7Ci0JCQlicmVhazsKLQkJY2FzZSBNT0RFX1dSSVRFOgotCQkJQloyX2J6V3JpdGVDbG9zZSgmYnplcnJvciwgc2VsZi0+ZnAsCi0JCQkJCSAwLCBOVUxMLCBOVUxMKTsKLQkJCWJyZWFrOwotCX0KLQlpZiAoc2VsZi0+ZnApIHsKLQkJUHlGaWxlX0RlY1VzZUNvdW50KChQeUZpbGVPYmplY3QgKilzZWxmLT5maWxlKTsKLQkJc2VsZi0+ZnAgPSBOVUxMOwotCX0KLQlzZWxmLT5tb2RlID0gTU9ERV9DTE9TRUQ7Ci0JcmV0ID0gUHlPYmplY3RfQ2FsbE1ldGhvZChzZWxmLT5maWxlLCAiY2xvc2UiLCBOVUxMKTsKLQlpZiAoYnplcnJvciAhPSBCWl9PSykgewotCQlVdGlsX0NhdGNoQloyRXJyb3IoYnplcnJvcik7Ci0JCVB5X1hERUNSRUYocmV0KTsKLQkJcmV0ID0gTlVMTDsKLQl9CisgICAgQUNRVUlSRV9MT0NLKHNlbGYpOworICAgIHN3aXRjaCAoc2VsZi0+bW9kZSkgeworICAgICAgICBjYXNlIE1PREVfUkVBRDoKKyAgICAgICAgY2FzZSBNT0RFX1JFQURfRU9GOgorICAgICAgICAgICAgQloyX2J6UmVhZENsb3NlKCZiemVycm9yLCBzZWxmLT5mcCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNT0RFX1dSSVRFOgorICAgICAgICAgICAgQloyX2J6V3JpdGVDbG9zZSgmYnplcnJvciwgc2VsZi0+ZnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIE5VTEwsIE5VTEwpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChzZWxmLT5mcCkgeworICAgICAgICBQeUZpbGVfRGVjVXNlQ291bnQoKFB5RmlsZU9iamVjdCAqKXNlbGYtPmZpbGUpOworICAgICAgICBzZWxmLT5mcCA9IE5VTEw7CisgICAgfQorICAgIHNlbGYtPm1vZGUgPSBNT0RFX0NMT1NFRDsKKyAgICByZXQgPSBQeU9iamVjdF9DYWxsTWV0aG9kKHNlbGYtPmZpbGUsICJjbG9zZSIsIE5VTEwpOworICAgIGlmIChiemVycm9yICE9IEJaX09LKSB7CisgICAgICAgIFV0aWxfQ2F0Y2hCWjJFcnJvcihiemVycm9yKTsKKyAgICAgICAgUHlfWERFQ1JFRihyZXQpOworICAgICAgICByZXQgPSBOVUxMOworICAgIH0KIAotCVJFTEVBU0VfTE9DSyhzZWxmKTsKLQlyZXR1cm4gcmV0OworICAgIFJFTEVBU0VfTE9DSyhzZWxmKTsKKyAgICByZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkJaMkZpbGVfZ2V0aXRlcihCWjJGaWxlT2JqZWN0ICpzZWxmKTsKIAogc3RhdGljIFB5TWV0aG9kRGVmIEJaMkZpbGVfbWV0aG9kc1tdID0gewotCXsicmVhZCIsIChQeUNGdW5jdGlvbilCWjJGaWxlX3JlYWQsIE1FVEhfVkFSQVJHUywgQloyRmlsZV9yZWFkX19kb2NfX30sCi0JeyJyZWFkbGluZSIsIChQeUNGdW5jdGlvbilCWjJGaWxlX3JlYWRsaW5lLCBNRVRIX1ZBUkFSR1MsIEJaMkZpbGVfcmVhZGxpbmVfX2RvY19ffSwKLQl7InJlYWRsaW5lcyIsIChQeUNGdW5jdGlvbilCWjJGaWxlX3JlYWRsaW5lcywgTUVUSF9WQVJBUkdTLCBCWjJGaWxlX3JlYWRsaW5lc19fZG9jX199LAotCXsieHJlYWRsaW5lcyIsIChQeUNGdW5jdGlvbilCWjJGaWxlX2dldGl0ZXIsIE1FVEhfVkFSQVJHUywgQloyRmlsZV94cmVhZGxpbmVzX19kb2NfX30sCi0JeyJ3cml0ZSIsIChQeUNGdW5jdGlvbilCWjJGaWxlX3dyaXRlLCBNRVRIX1ZBUkFSR1MsIEJaMkZpbGVfd3JpdGVfX2RvY19ffSwKLQl7IndyaXRlbGluZXMiLCAoUHlDRnVuY3Rpb24pQloyRmlsZV93cml0ZWxpbmVzLCBNRVRIX08sIEJaMkZpbGVfd3JpdGVsaW5lc19fZG9jX199LAotCXsic2VlayIsIChQeUNGdW5jdGlvbilCWjJGaWxlX3NlZWssIE1FVEhfVkFSQVJHUywgQloyRmlsZV9zZWVrX19kb2NfX30sCi0JeyJ0ZWxsIiwgKFB5Q0Z1bmN0aW9uKUJaMkZpbGVfdGVsbCwgTUVUSF9OT0FSR1MsIEJaMkZpbGVfdGVsbF9fZG9jX199LAotCXsiY2xvc2UiLCAoUHlDRnVuY3Rpb24pQloyRmlsZV9jbG9zZSwgTUVUSF9OT0FSR1MsIEJaMkZpbGVfY2xvc2VfX2RvY19ffSwKLQl7TlVMTCwJCU5VTEx9CQkvKiBzZW50aW5lbCAqLworICAgIHsicmVhZCIsIChQeUNGdW5jdGlvbilCWjJGaWxlX3JlYWQsIE1FVEhfVkFSQVJHUywgQloyRmlsZV9yZWFkX19kb2NfX30sCisgICAgeyJyZWFkbGluZSIsIChQeUNGdW5jdGlvbilCWjJGaWxlX3JlYWRsaW5lLCBNRVRIX1ZBUkFSR1MsIEJaMkZpbGVfcmVhZGxpbmVfX2RvY19ffSwKKyAgICB7InJlYWRsaW5lcyIsIChQeUNGdW5jdGlvbilCWjJGaWxlX3JlYWRsaW5lcywgTUVUSF9WQVJBUkdTLCBCWjJGaWxlX3JlYWRsaW5lc19fZG9jX199LAorICAgIHsieHJlYWRsaW5lcyIsIChQeUNGdW5jdGlvbilCWjJGaWxlX2dldGl0ZXIsIE1FVEhfVkFSQVJHUywgQloyRmlsZV94cmVhZGxpbmVzX19kb2NfX30sCisgICAgeyJ3cml0ZSIsIChQeUNGdW5jdGlvbilCWjJGaWxlX3dyaXRlLCBNRVRIX1ZBUkFSR1MsIEJaMkZpbGVfd3JpdGVfX2RvY19ffSwKKyAgICB7IndyaXRlbGluZXMiLCAoUHlDRnVuY3Rpb24pQloyRmlsZV93cml0ZWxpbmVzLCBNRVRIX08sIEJaMkZpbGVfd3JpdGVsaW5lc19fZG9jX199LAorICAgIHsic2VlayIsIChQeUNGdW5jdGlvbilCWjJGaWxlX3NlZWssIE1FVEhfVkFSQVJHUywgQloyRmlsZV9zZWVrX19kb2NfX30sCisgICAgeyJ0ZWxsIiwgKFB5Q0Z1bmN0aW9uKUJaMkZpbGVfdGVsbCwgTUVUSF9OT0FSR1MsIEJaMkZpbGVfdGVsbF9fZG9jX199LAorICAgIHsiY2xvc2UiLCAoUHlDRnVuY3Rpb24pQloyRmlsZV9jbG9zZSwgTUVUSF9OT0FSR1MsIEJaMkZpbGVfY2xvc2VfX2RvY19ffSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogCkBAIC0xMjI5LDYwICsxMjI5LDYwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogQloyRmlsZV9nZXRfbmV3bGluZXMoQloyRmlsZU9iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlzd2l0Y2ggKHNlbGYtPmZfbmV3bGluZXR5cGVzKSB7Ci0JY2FzZSBORVdMSU5FX1VOS05PV046Ci0JCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJcmV0dXJuIFB5X05vbmU7Ci0JY2FzZSBORVdMSU5FX0NSOgotCQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZygiXHIiKTsKLQljYXNlIE5FV0xJTkVfTEY6Ci0JCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKCJcbiIpOwotCWNhc2UgTkVXTElORV9DUnxORVdMSU5FX0xGOgotCQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKHNzKSIsICJcciIsICJcbiIpOwotCWNhc2UgTkVXTElORV9DUkxGOgotCQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZygiXHJcbiIpOwotCWNhc2UgTkVXTElORV9DUnxORVdMSU5FX0NSTEY6Ci0JCXJldHVybiBQeV9CdWlsZFZhbHVlKCIoc3MpIiwgIlxyIiwgIlxyXG4iKTsKLQljYXNlIE5FV0xJTkVfTEZ8TkVXTElORV9DUkxGOgotCQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKHNzKSIsICJcbiIsICJcclxuIik7Ci0JY2FzZSBORVdMSU5FX0NSfE5FV0xJTkVfTEZ8TkVXTElORV9DUkxGOgotCQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKHNzcykiLCAiXHIiLCAiXG4iLCAiXHJcbiIpOwotCWRlZmF1bHQ6Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19TeXN0ZW1FcnJvciwgCi0JCQkgICAgICJVbmtub3duIG5ld2xpbmVzIHZhbHVlIDB4JXhcbiIsIAotCQkJICAgICBzZWxmLT5mX25ld2xpbmV0eXBlcyk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBzd2l0Y2ggKHNlbGYtPmZfbmV3bGluZXR5cGVzKSB7CisgICAgY2FzZSBORVdMSU5FX1VOS05PV046CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgY2FzZSBORVdMSU5FX0NSOgorICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZygiXHIiKTsKKyAgICBjYXNlIE5FV0xJTkVfTEY6CisgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKCJcbiIpOworICAgIGNhc2UgTkVXTElORV9DUnxORVdMSU5FX0xGOgorICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKHNzKSIsICJcciIsICJcbiIpOworICAgIGNhc2UgTkVXTElORV9DUkxGOgorICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZygiXHJcbiIpOworICAgIGNhc2UgTkVXTElORV9DUnxORVdMSU5FX0NSTEY6CisgICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIoc3MpIiwgIlxyIiwgIlxyXG4iKTsKKyAgICBjYXNlIE5FV0xJTkVfTEZ8TkVXTElORV9DUkxGOgorICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKHNzKSIsICJcbiIsICJcclxuIik7CisgICAgY2FzZSBORVdMSU5FX0NSfE5FV0xJTkVfTEZ8TkVXTElORV9DUkxGOgorICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKHNzcykiLCAiXHIiLCAiXG4iLCAiXHJcbiIpOworICAgIGRlZmF1bHQ6CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19TeXN0ZW1FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJVbmtub3duIG5ld2xpbmVzIHZhbHVlIDB4JXhcbiIsCisgICAgICAgICAgICAgICAgICAgICBzZWxmLT5mX25ld2xpbmV0eXBlcyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIEJaMkZpbGVfZ2V0X2Nsb3NlZChCWjJGaWxlT2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeUludF9Gcm9tTG9uZyhzZWxmLT5tb2RlID09IE1PREVfQ0xPU0VEKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoc2VsZi0+bW9kZSA9PSBNT0RFX0NMT1NFRCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBCWjJGaWxlX2dldF9tb2RlKEJaMkZpbGVPYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoc2VsZi0+ZmlsZSwgIm1vZGUiKTsKKyAgICByZXR1cm4gUHlPYmplY3RfR2V0QXR0clN0cmluZyhzZWxmLT5maWxlLCAibW9kZSIpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogQloyRmlsZV9nZXRfbmFtZShCWjJGaWxlT2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHNlbGYtPmZpbGUsICJuYW1lIik7CisgICAgcmV0dXJuIFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoc2VsZi0+ZmlsZSwgIm5hbWUiKTsKIH0KIAogc3RhdGljIFB5R2V0U2V0RGVmIEJaMkZpbGVfZ2V0c2V0W10gPSB7Ci0JeyJjbG9zZWQiLCAoZ2V0dGVyKUJaMkZpbGVfZ2V0X2Nsb3NlZCwgTlVMTCwKLQkJCSJUcnVlIGlmIHRoZSBmaWxlIGlzIGNsb3NlZCJ9LAotCXsibmV3bGluZXMiLCAoZ2V0dGVyKUJaMkZpbGVfZ2V0X25ld2xpbmVzLCBOVUxMLCAKLQkJCSJlbmQtb2YtbGluZSBjb252ZW50aW9uIHVzZWQgaW4gdGhpcyBmaWxlIn0sCi0JeyJtb2RlIiwgKGdldHRlcilCWjJGaWxlX2dldF9tb2RlLCBOVUxMLAotCQkJImZpbGUgbW9kZSAoJ3InLCAndycsIG9yICdVJykifSwKLQl7Im5hbWUiLCAoZ2V0dGVyKUJaMkZpbGVfZ2V0X25hbWUsIE5VTEwsCi0JCQkiZmlsZSBuYW1lIn0sCi0Je05VTEx9CS8qIFNlbnRpbmVsICovCisgICAgeyJjbG9zZWQiLCAoZ2V0dGVyKUJaMkZpbGVfZ2V0X2Nsb3NlZCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgIlRydWUgaWYgdGhlIGZpbGUgaXMgY2xvc2VkIn0sCisgICAgeyJuZXdsaW5lcyIsIChnZXR0ZXIpQloyRmlsZV9nZXRfbmV3bGluZXMsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICJlbmQtb2YtbGluZSBjb252ZW50aW9uIHVzZWQgaW4gdGhpcyBmaWxlIn0sCisgICAgeyJtb2RlIiwgKGdldHRlcilCWjJGaWxlX2dldF9tb2RlLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAiZmlsZSBtb2RlICgncicsICd3Jywgb3IgJ1UnKSJ9LAorICAgIHsibmFtZSIsIChnZXR0ZXIpQloyRmlsZV9nZXRfbmFtZSwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgImZpbGUgbmFtZSJ9LAorICAgIHtOVUxMfSAgICAgIC8qIFNlbnRpbmVsICovCiB9OwogCiAKQEAgLTEyOTMsOSArMTI5Myw5IEBACiAjZGVmaW5lIE9GRih4KSBvZmZzZXRvZihCWjJGaWxlT2JqZWN0LCB4KQogCiBzdGF0aWMgUHlNZW1iZXJEZWYgQloyRmlsZV9tZW1iZXJzW10gPSB7Ci0JeyJzb2Z0c3BhY2UiLAlUX0lOVCwJCU9GRihmX3NvZnRzcGFjZSksIDAsCi0JICJmbGFnIGluZGljYXRpbmcgdGhhdCBhIHNwYWNlIG5lZWRzIHRvIGJlIHByaW50ZWQ7IHVzZWQgYnkgcHJpbnQifSwKLQl7TlVMTH0JLyogU2VudGluZWwgKi8KKyAgICB7InNvZnRzcGFjZSIsICAgICAgIFRfSU5ULCAgICAgICAgICBPRkYoZl9zb2Z0c3BhY2UpLCAwLAorICAgICAiZmxhZyBpbmRpY2F0aW5nIHRoYXQgYSBzcGFjZSBuZWVkcyB0byBiZSBwcmludGVkOyB1c2VkIGJ5IHByaW50In0sCisgICAge05VTEx9ICAgICAgLyogU2VudGluZWwgKi8KIH07CiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwpAQCAtMTMwNCwxNTMgKzEzMDQsMTUzIEBACiBzdGF0aWMgaW50CiBCWjJGaWxlX2luaXQoQloyRmlsZU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7Ci0Jc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJmaWxlbmFtZSIsICJtb2RlIiwgImJ1ZmZlcmluZyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29tcHJlc3NsZXZlbCIsIDB9OwotCVB5T2JqZWN0ICpuYW1lOwotCWNoYXIgKm1vZGUgPSAiciI7Ci0JaW50IGJ1ZmZlcmluZyA9IC0xOwotCWludCBjb21wcmVzc2xldmVsID0gOTsKLQlpbnQgYnplcnJvcjsKLQlpbnQgbW9kZV9jaGFyID0gMDsKKyAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7ImZpbGVuYW1lIiwgIm1vZGUiLCAiYnVmZmVyaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbXByZXNzbGV2ZWwiLCAwfTsKKyAgICBQeU9iamVjdCAqbmFtZTsKKyAgICBjaGFyICptb2RlID0gInIiOworICAgIGludCBidWZmZXJpbmcgPSAtMTsKKyAgICBpbnQgY29tcHJlc3NsZXZlbCA9IDk7CisgICAgaW50IGJ6ZXJyb3I7CisgICAgaW50IG1vZGVfY2hhciA9IDA7CiAKLQlzZWxmLT5zaXplID0gLTE7CisgICAgc2VsZi0+c2l6ZSA9IC0xOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiT3xzaWk6QloyRmlsZSIsCi0JCQkJCSBrd2xpc3QsICZuYW1lLCAmbW9kZSwgJmJ1ZmZlcmluZywKLQkJCQkJICZjb21wcmVzc2xldmVsKSkKLQkJcmV0dXJuIC0xOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk98c2lpOkJaMkZpbGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGt3bGlzdCwgJm5hbWUsICZtb2RlLCAmYnVmZmVyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb21wcmVzc2xldmVsKSkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0JaWYgKGNvbXByZXNzbGV2ZWwgPCAxIHx8IGNvbXByZXNzbGV2ZWwgPiA5KSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJjb21wcmVzc2xldmVsIG11c3QgYmUgYmV0d2VlbiAxIGFuZCA5Iik7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgaWYgKGNvbXByZXNzbGV2ZWwgPCAxIHx8IGNvbXByZXNzbGV2ZWwgPiA5KSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImNvbXByZXNzbGV2ZWwgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDkiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCWZvciAoOzspIHsKLQkJaW50IGVycm9yID0gMDsKLQkJc3dpdGNoICgqbW9kZSkgewotCQkJY2FzZSAncic6Ci0JCQljYXNlICd3JzoKLQkJCQlpZiAobW9kZV9jaGFyKQotCQkJCQllcnJvciA9IDE7Ci0JCQkJbW9kZV9jaGFyID0gKm1vZGU7Ci0JCQkJYnJlYWs7CisgICAgZm9yICg7OykgeworICAgICAgICBpbnQgZXJyb3IgPSAwOworICAgICAgICBzd2l0Y2ggKCptb2RlKSB7CisgICAgICAgICAgICBjYXNlICdyJzoKKyAgICAgICAgICAgIGNhc2UgJ3cnOgorICAgICAgICAgICAgICAgIGlmIChtb2RlX2NoYXIpCisgICAgICAgICAgICAgICAgICAgIGVycm9yID0gMTsKKyAgICAgICAgICAgICAgICBtb2RlX2NoYXIgPSAqbW9kZTsKKyAgICAgICAgICAgICAgICBicmVhazsKIAotCQkJY2FzZSAnYic6Ci0JCQkJYnJlYWs7CisgICAgICAgICAgICBjYXNlICdiJzoKKyAgICAgICAgICAgICAgICBicmVhazsKIAotCQkJY2FzZSAnVSc6CisgICAgICAgICAgICBjYXNlICdVJzoKICNpZmRlZiBfX1ZNUwotCQkJCXNlbGYtPmZfdW5pdl9uZXdsaW5lID0gMDsKKyAgICAgICAgICAgICAgICBzZWxmLT5mX3VuaXZfbmV3bGluZSA9IDA7CiAjZWxzZQotCQkJCXNlbGYtPmZfdW5pdl9uZXdsaW5lID0gMTsKKyAgICAgICAgICAgICAgICBzZWxmLT5mX3VuaXZfbmV3bGluZSA9IDE7CiAjZW5kaWYKLQkJCQlicmVhazsKKyAgICAgICAgICAgICAgICBicmVhazsKIAotCQkJZGVmYXVsdDoKLQkJCQllcnJvciA9IDE7Ci0JCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGVycm9yKSB7Ci0JCQlQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkgICAgICJpbnZhbGlkIG1vZGUgY2hhciAlYyIsICptb2RlKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQltb2RlKys7Ci0JCWlmICgqbW9kZSA9PSAnXDAnKQotCQkJYnJlYWs7Ci0JfQorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBlcnJvciA9IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVycm9yKSB7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCBtb2RlIGNoYXIgJWMiLCAqbW9kZSk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgbW9kZSsrOworICAgICAgICBpZiAoKm1vZGUgPT0gJ1wwJykKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KIAotCWlmIChtb2RlX2NoYXIgPT0gMCkgewotCQltb2RlX2NoYXIgPSAncic7Ci0JfQorICAgIGlmIChtb2RlX2NoYXIgPT0gMCkgeworICAgICAgICBtb2RlX2NoYXIgPSAncic7CisgICAgfQogCi0JbW9kZSA9IChtb2RlX2NoYXIgPT0gJ3InKSA/ICJyYiIgOiAid2IiOworICAgIG1vZGUgPSAobW9kZV9jaGFyID09ICdyJykgPyAicmIiIDogIndiIjsKIAotCXNlbGYtPmZpbGUgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oKFB5T2JqZWN0KikmUHlGaWxlX1R5cGUsICIoT3NpKSIsCi0JCQkJCSAgIG5hbWUsIG1vZGUsIGJ1ZmZlcmluZyk7Ci0JaWYgKHNlbGYtPmZpbGUgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOworICAgIHNlbGYtPmZpbGUgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oKFB5T2JqZWN0KikmUHlGaWxlX1R5cGUsICIoT3NpKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBtb2RlLCBidWZmZXJpbmcpOworICAgIGlmIChzZWxmLT5maWxlID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKIAotCS8qIEZyb20gbm93IG9uLCB3ZSBoYXZlIHN0dWZmIHRvIGRlYWxsb2MsIHNvIGp1bXAgdG8gZXJyb3IgbGFiZWwKLQkgKiBpbnN0ZWFkIG9mIHJldHVybmluZyAqLworICAgIC8qIEZyb20gbm93IG9uLCB3ZSBoYXZlIHN0dWZmIHRvIGRlYWxsb2MsIHNvIGp1bXAgdG8gZXJyb3IgbGFiZWwKKyAgICAgKiBpbnN0ZWFkIG9mIHJldHVybmluZyAqLwogCiAjaWZkZWYgV0lUSF9USFJFQUQKLQlzZWxmLT5sb2NrID0gUHlUaHJlYWRfYWxsb2NhdGVfbG9jaygpOwotCWlmICghc2VsZi0+bG9jaykgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfTWVtb3J5RXJyb3IsICJ1bmFibGUgdG8gYWxsb2NhdGUgbG9jayIpOwotCQlnb3RvIGVycm9yOwotCX0KKyAgICBzZWxmLT5sb2NrID0gUHlUaHJlYWRfYWxsb2NhdGVfbG9jaygpOworICAgIGlmICghc2VsZi0+bG9jaykgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTWVtb3J5RXJyb3IsICJ1bmFibGUgdG8gYWxsb2NhdGUgbG9jayIpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KICNlbmRpZgogCi0JaWYgKG1vZGVfY2hhciA9PSAncicpCi0JCXNlbGYtPmZwID0gQloyX2J6UmVhZE9wZW4oJmJ6ZXJyb3IsCi0JCQkJCSAgUHlGaWxlX0FzRmlsZShzZWxmLT5maWxlKSwKLQkJCQkJICAwLCAwLCBOVUxMLCAwKTsKLQllbHNlCi0JCXNlbGYtPmZwID0gQloyX2J6V3JpdGVPcGVuKCZiemVycm9yLAotCQkJCQkgICBQeUZpbGVfQXNGaWxlKHNlbGYtPmZpbGUpLAotCQkJCQkgICBjb21wcmVzc2xldmVsLCAwLCAwKTsKKyAgICBpZiAobW9kZV9jaGFyID09ICdyJykKKyAgICAgICAgc2VsZi0+ZnAgPSBCWjJfYnpSZWFkT3BlbigmYnplcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUZpbGVfQXNGaWxlKHNlbGYtPmZpbGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIE5VTEwsIDApOworICAgIGVsc2UKKyAgICAgICAgc2VsZi0+ZnAgPSBCWjJfYnpXcml0ZU9wZW4oJmJ6ZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RmlsZV9Bc0ZpbGUoc2VsZi0+ZmlsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzbGV2ZWwsIDAsIDApOwogCi0JaWYgKGJ6ZXJyb3IgIT0gQlpfT0spIHsKLQkJVXRpbF9DYXRjaEJaMkVycm9yKGJ6ZXJyb3IpOwotCQlnb3RvIGVycm9yOwotCX0KLQlQeUZpbGVfSW5jVXNlQ291bnQoKFB5RmlsZU9iamVjdCAqKXNlbGYtPmZpbGUpOworICAgIGlmIChiemVycm9yICE9IEJaX09LKSB7CisgICAgICAgIFV0aWxfQ2F0Y2hCWjJFcnJvcihiemVycm9yKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgUHlGaWxlX0luY1VzZUNvdW50KChQeUZpbGVPYmplY3QgKilzZWxmLT5maWxlKTsKIAotCXNlbGYtPm1vZGUgPSAobW9kZV9jaGFyID09ICdyJykgPyBNT0RFX1JFQUQgOiBNT0RFX1dSSVRFOworICAgIHNlbGYtPm1vZGUgPSAobW9kZV9jaGFyID09ICdyJykgPyBNT0RFX1JFQUQgOiBNT0RFX1dSSVRFOwogCi0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiAKIGVycm9yOgotCVB5X0NMRUFSKHNlbGYtPmZpbGUpOworICAgIFB5X0NMRUFSKHNlbGYtPmZpbGUpOwogI2lmZGVmIFdJVEhfVEhSRUFECi0JaWYgKHNlbGYtPmxvY2spIHsKLQkJUHlUaHJlYWRfZnJlZV9sb2NrKHNlbGYtPmxvY2spOwotCQlzZWxmLT5sb2NrID0gTlVMTDsKLQl9CisgICAgaWYgKHNlbGYtPmxvY2spIHsKKyAgICAgICAgUHlUaHJlYWRfZnJlZV9sb2NrKHNlbGYtPmxvY2spOworICAgICAgICBzZWxmLT5sb2NrID0gTlVMTDsKKyAgICB9CiAjZW5kaWYKLQlyZXR1cm4gLTE7CisgICAgcmV0dXJuIC0xOwogfQogCiBzdGF0aWMgdm9pZAogQloyRmlsZV9kZWFsbG9jKEJaMkZpbGVPYmplY3QgKnNlbGYpCiB7Ci0JaW50IGJ6ZXJyb3I7CisgICAgaW50IGJ6ZXJyb3I7CiAjaWZkZWYgV0lUSF9USFJFQUQKLQlpZiAoc2VsZi0+bG9jaykKLQkJUHlUaHJlYWRfZnJlZV9sb2NrKHNlbGYtPmxvY2spOworICAgIGlmIChzZWxmLT5sb2NrKQorICAgICAgICBQeVRocmVhZF9mcmVlX2xvY2soc2VsZi0+bG9jayk7CiAjZW5kaWYKLQlzd2l0Y2ggKHNlbGYtPm1vZGUpIHsKLQkJY2FzZSBNT0RFX1JFQUQ6Ci0JCWNhc2UgTU9ERV9SRUFEX0VPRjoKLQkJCUJaMl9ielJlYWRDbG9zZSgmYnplcnJvciwgc2VsZi0+ZnApOwotCQkJYnJlYWs7Ci0JCWNhc2UgTU9ERV9XUklURToKLQkJCUJaMl9ieldyaXRlQ2xvc2UoJmJ6ZXJyb3IsIHNlbGYtPmZwLAotCQkJCQkgMCwgTlVMTCwgTlVMTCk7Ci0JCQlicmVhazsKLQl9Ci0JaWYgKHNlbGYtPmZwKSB7Ci0JCVB5RmlsZV9EZWNVc2VDb3VudCgoUHlGaWxlT2JqZWN0ICopc2VsZi0+ZmlsZSk7Ci0JCXNlbGYtPmZwID0gTlVMTDsKLQl9Ci0JVXRpbF9Ecm9wUmVhZEFoZWFkKHNlbGYpOwotCVB5X1hERUNSRUYoc2VsZi0+ZmlsZSk7Ci0JUHlfVFlQRShzZWxmKS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKKyAgICBzd2l0Y2ggKHNlbGYtPm1vZGUpIHsKKyAgICAgICAgY2FzZSBNT0RFX1JFQUQ6CisgICAgICAgIGNhc2UgTU9ERV9SRUFEX0VPRjoKKyAgICAgICAgICAgIEJaMl9ielJlYWRDbG9zZSgmYnplcnJvciwgc2VsZi0+ZnApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTU9ERV9XUklURToKKyAgICAgICAgICAgIEJaMl9ieldyaXRlQ2xvc2UoJmJ6ZXJyb3IsIHNlbGYtPmZwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoc2VsZi0+ZnApIHsKKyAgICAgICAgUHlGaWxlX0RlY1VzZUNvdW50KChQeUZpbGVPYmplY3QgKilzZWxmLT5maWxlKTsKKyAgICAgICAgc2VsZi0+ZnAgPSBOVUxMOworICAgIH0KKyAgICBVdGlsX0Ryb3BSZWFkQWhlYWQoc2VsZik7CisgICAgUHlfWERFQ1JFRihzZWxmLT5maWxlKTsKKyAgICBQeV9UWVBFKHNlbGYpLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOwogfQogCiAvKiBUaGlzIGlzIGEgaGFja2VkIHZlcnNpb24gb2YgUHl0aG9uJ3MgZmlsZW9iamVjdC5jOmZpbGVfZ2V0aXRlcigpLiAqLwogc3RhdGljIFB5T2JqZWN0ICoKIEJaMkZpbGVfZ2V0aXRlcihCWjJGaWxlT2JqZWN0ICpzZWxmKQogewotCWlmIChzZWxmLT5tb2RlID09IE1PREVfQ0xPU0VEKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJJL08gb3BlcmF0aW9uIG9uIGNsb3NlZCBmaWxlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlQeV9JTkNSRUYoKFB5T2JqZWN0KilzZWxmKTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKKyAgICBpZiAoc2VsZi0+bW9kZSA9PSBNT0RFX0NMT1NFRCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJJL08gb3BlcmF0aW9uIG9uIGNsb3NlZCBmaWxlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeV9JTkNSRUYoKFB5T2JqZWN0KilzZWxmKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKIH0KIAogLyogVGhpcyBpcyBhIGhhY2tlZCB2ZXJzaW9uIG9mIFB5dGhvbidzIGZpbGVvYmplY3QuYzpmaWxlX2l0ZXJuZXh0KCkuICovCkBAIC0xNDU4LDIxICsxNDU4LDIxIEBACiBzdGF0aWMgUHlPYmplY3QgKgogQloyRmlsZV9pdGVybmV4dChCWjJGaWxlT2JqZWN0ICpzZWxmKQogewotCVB5U3RyaW5nT2JqZWN0KiByZXQ7Ci0JQUNRVUlSRV9MT0NLKHNlbGYpOwotCWlmIChzZWxmLT5tb2RlID09IE1PREVfQ0xPU0VEKSB7Ci0gICAgICAgICAgICAgICAgUkVMRUFTRV9MT0NLKHNlbGYpOwotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkiSS9PIG9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0ID0gVXRpbF9SZWFkQWhlYWRHZXRMaW5lU2tpcChzZWxmLCAwLCBSRUFEQUhFQURfQlVGU0laRSk7Ci0JUkVMRUFTRV9MT0NLKHNlbGYpOwotCWlmIChyZXQgPT0gTlVMTCB8fCBQeVN0cmluZ19HRVRfU0laRShyZXQpID09IDApIHsKLQkJUHlfWERFQ1JFRihyZXQpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIChQeU9iamVjdCAqKXJldDsKKyAgICBQeVN0cmluZ09iamVjdCogcmV0OworICAgIEFDUVVJUkVfTE9DSyhzZWxmKTsKKyAgICBpZiAoc2VsZi0+bW9kZSA9PSBNT0RFX0NMT1NFRCkgeworICAgICAgICBSRUxFQVNFX0xPQ0soc2VsZik7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIkkvTyBvcGVyYXRpb24gb24gY2xvc2VkIGZpbGUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldCA9IFV0aWxfUmVhZEFoZWFkR2V0TGluZVNraXAoc2VsZiwgMCwgUkVBREFIRUFEX0JVRlNJWkUpOworICAgIFJFTEVBU0VfTE9DSyhzZWxmKTsKKyAgICBpZiAocmV0ID09IE5VTEwgfHwgUHlTdHJpbmdfR0VUX1NJWkUocmV0KSA9PSAwKSB7CisgICAgICAgIFB5X1hERUNSRUYocmV0KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiAoUHlPYmplY3QgKilyZXQ7CiB9CiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwpAQCAtMTUwMCw0NiArMTUwMCw0NiBAQAogOwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IEJaMkZpbGVfVHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKLQkiYnoyLkJaMkZpbGUiLAkJLyp0cF9uYW1lKi8KLQlzaXplb2YoQloyRmlsZU9iamVjdCksCS8qdHBfYmFzaWNzaXplKi8KLQkwLAkJCS8qdHBfaXRlbXNpemUqLwotCShkZXN0cnVjdG9yKUJaMkZpbGVfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KLQkwLAkJCS8qdHBfcHJpbnQqLwotCTAsCQkJLyp0cF9nZXRhdHRyKi8KLQkwLAkJCS8qdHBfc2V0YXR0ciovCi0JMCwJCQkvKnRwX2NvbXBhcmUqLwotCTAsCQkJLyp0cF9yZXByKi8KLQkwLAkJCS8qdHBfYXNfbnVtYmVyKi8KLQkwLAkJCS8qdHBfYXNfc2VxdWVuY2UqLwotCTAsCQkJLyp0cF9hc19tYXBwaW5nKi8KLQkwLAkJCS8qdHBfaGFzaCovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY2FsbCovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc3RyKi8KLSAgICAgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsLyp0cF9nZXRhdHRybyovCi0gICAgICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLC8qdHBfc2V0YXR0cm8qLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX2J1ZmZlciovCi0gICAgICAgIFB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKnRwX2ZsYWdzKi8KLSAgICAgICAgQloyRmlsZV9fZG9jX18sICAgICAgICAgLyp0cF9kb2MqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3RyYXZlcnNlKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jbGVhciovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmljaGNvbXBhcmUqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLSAgICAgICAgKGdldGl0ZXJmdW5jKUJaMkZpbGVfZ2V0aXRlciwgLyp0cF9pdGVyKi8KLSAgICAgICAgKGl0ZXJuZXh0ZnVuYylCWjJGaWxlX2l0ZXJuZXh0LCAvKnRwX2l0ZXJuZXh0Ki8KLSAgICAgICAgQloyRmlsZV9tZXRob2RzLCAgICAgICAgLyp0cF9tZXRob2RzKi8KLSAgICAgICAgQloyRmlsZV9tZW1iZXJzLCAgICAgICAgLyp0cF9tZW1iZXJzKi8KLSAgICAgICAgQloyRmlsZV9nZXRzZXQsICAgICAgICAgLyp0cF9nZXRzZXQqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2Jhc2UqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2RpY3QqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2Rlc2NyX2dldCovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGVzY3Jfc2V0Ki8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kaWN0b2Zmc2V0Ki8KLSAgICAgICAgKGluaXRwcm9jKUJaMkZpbGVfaW5pdCwgLyp0cF9pbml0Ki8KLSAgICAgICAgUHlUeXBlX0dlbmVyaWNBbGxvYywgICAgLyp0cF9hbGxvYyovCi0gICAgICAgIFB5VHlwZV9HZW5lcmljTmV3LCAgICAgIC8qdHBfbmV3Ki8KLSAgICAgIAlfUHlPYmplY3RfRGVsLCAgICAgICAgICAvKnRwX2ZyZWUqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2lzX2djKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAiYnoyLkJaMkZpbGUiLCAgICAgICAgICAgICAgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoQloyRmlsZU9iamVjdCksICAgICAgLyp0cF9iYXNpY3NpemUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZW1zaXplKi8KKyAgICAoZGVzdHJ1Y3RvcilCWjJGaWxlX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcHJpbnQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NvbXBhcmUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3JlcHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX251bWJlciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfc2VxdWVuY2UqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX21hcHBpbmcqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2hhc2gqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY2FsbCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zdHIqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLC8qdHBfZ2V0YXR0cm8qLworICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLC8qdHBfc2V0YXR0cm8qLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyp0cF9mbGFncyovCisgICAgQloyRmlsZV9fZG9jX18sICAgICAgICAgLyp0cF9kb2MqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfdHJhdmVyc2UqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY2xlYXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIChnZXRpdGVyZnVuYylCWjJGaWxlX2dldGl0ZXIsIC8qdHBfaXRlciovCisgICAgKGl0ZXJuZXh0ZnVuYylCWjJGaWxlX2l0ZXJuZXh0LCAvKnRwX2l0ZXJuZXh0Ki8KKyAgICBCWjJGaWxlX21ldGhvZHMsICAgICAgICAvKnRwX21ldGhvZHMqLworICAgIEJaMkZpbGVfbWVtYmVycywgICAgICAgIC8qdHBfbWVtYmVycyovCisgICAgQloyRmlsZV9nZXRzZXQsICAgICAgICAgLyp0cF9nZXRzZXQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYmFzZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kaWN0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2Rlc2NyX2dldCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kZXNjcl9zZXQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGljdG9mZnNldCovCisgICAgKGluaXRwcm9jKUJaMkZpbGVfaW5pdCwgLyp0cF9pbml0Ki8KKyAgICBQeVR5cGVfR2VuZXJpY0FsbG9jLCAgICAvKnRwX2FsbG9jKi8KKyAgICBQeVR5cGVfR2VuZXJpY05ldywgICAgICAvKnRwX25ldyovCisgICAgX1B5T2JqZWN0X0RlbCwgICAgICAgICAgLyp0cF9mcmVlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2lzX2djKi8KIH07CiAKIApAQCAtMTU1OCw3NiArMTU1OCw3NiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIEJaMkNvbXBfY29tcHJlc3MoQloyQ29tcE9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlfYnVmZmVyIHBkYXRhOwotCWNoYXIgKmRhdGE7Ci0JaW50IGRhdGFzaXplOwotCWludCBidWZzaXplID0gU01BTExDSFVOSzsKLQlQWV9MT05HX0xPTkcgdG90YWxvdXQ7Ci0JUHlPYmplY3QgKnJldCA9IE5VTEw7Ci0JYnpfc3RyZWFtICpienMgPSAmc2VsZi0+YnpzOwotCWludCBiemVycm9yOworICAgIFB5X2J1ZmZlciBwZGF0YTsKKyAgICBjaGFyICpkYXRhOworICAgIGludCBkYXRhc2l6ZTsKKyAgICBpbnQgYnVmc2l6ZSA9IFNNQUxMQ0hVTks7CisgICAgUFlfTE9OR19MT05HIHRvdGFsb3V0OworICAgIFB5T2JqZWN0ICpyZXQgPSBOVUxMOworICAgIGJ6X3N0cmVhbSAqYnpzID0gJnNlbGYtPmJ6czsKKyAgICBpbnQgYnplcnJvcjsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyo6Y29tcHJlc3MiLCAmcGRhdGEpKQotCQlyZXR1cm4gTlVMTDsKLQlkYXRhID0gcGRhdGEuYnVmOwotCWRhdGFzaXplID0gcGRhdGEubGVuOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyo6Y29tcHJlc3MiLCAmcGRhdGEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBkYXRhID0gcGRhdGEuYnVmOworICAgIGRhdGFzaXplID0gcGRhdGEubGVuOwogCi0JaWYgKGRhdGFzaXplID09IDApIHsKLQkJUHlCdWZmZXJfUmVsZWFzZSgmcGRhdGEpOwotCQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZygiIik7Ci0JfQorICAgIGlmIChkYXRhc2l6ZSA9PSAwKSB7CisgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnBkYXRhKTsKKyAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoIiIpOworICAgIH0KIAotCUFDUVVJUkVfTE9DSyhzZWxmKTsKLQlpZiAoIXNlbGYtPnJ1bm5pbmcpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJInRoaXMgb2JqZWN0IHdhcyBhbHJlYWR5IGZsdXNoZWQiKTsKLQkJZ290byBlcnJvcjsKLQl9CisgICAgQUNRVUlSRV9MT0NLKHNlbGYpOworICAgIGlmICghc2VsZi0+cnVubmluZykgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIG9iamVjdCB3YXMgYWxyZWFkeSBmbHVzaGVkIik7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQogCi0JcmV0ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgYnVmc2l6ZSk7Ci0JaWYgKCFyZXQpCi0JCWdvdG8gZXJyb3I7CisgICAgcmV0ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgYnVmc2l6ZSk7CisgICAgaWYgKCFyZXQpCisgICAgICAgIGdvdG8gZXJyb3I7CiAKLQlienMtPm5leHRfaW4gPSBkYXRhOwotCWJ6cy0+YXZhaWxfaW4gPSBkYXRhc2l6ZTsKLQlienMtPm5leHRfb3V0ID0gQlVGKHJldCk7Ci0JYnpzLT5hdmFpbF9vdXQgPSBidWZzaXplOworICAgIGJ6cy0+bmV4dF9pbiA9IGRhdGE7CisgICAgYnpzLT5hdmFpbF9pbiA9IGRhdGFzaXplOworICAgIGJ6cy0+bmV4dF9vdXQgPSBCVUYocmV0KTsKKyAgICBienMtPmF2YWlsX291dCA9IGJ1ZnNpemU7CiAKLQl0b3RhbG91dCA9IEJaU19UT1RBTF9PVVQoYnpzKTsKKyAgICB0b3RhbG91dCA9IEJaU19UT1RBTF9PVVQoYnpzKTsKIAotCWZvciAoOzspIHsKLQkJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCQliemVycm9yID0gQloyX2J6Q29tcHJlc3MoYnpzLCBCWl9SVU4pOwotCQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCQlpZiAoYnplcnJvciAhPSBCWl9SVU5fT0spIHsKLQkJCVV0aWxfQ2F0Y2hCWjJFcnJvcihiemVycm9yKTsKLQkJCWdvdG8gZXJyb3I7Ci0JCX0KLQkJaWYgKGJ6cy0+YXZhaWxfaW4gPT0gMCkKLQkJCWJyZWFrOyAvKiBubyBtb3JlIGlucHV0IGRhdGEgKi8KLQkJaWYgKGJ6cy0+YXZhaWxfb3V0ID09IDApIHsKLQkJCWJ1ZnNpemUgPSBVdGlsX05ld0J1ZmZlclNpemUoYnVmc2l6ZSk7Ci0JCQlpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmcmV0LCBidWZzaXplKSA8IDApIHsKLQkJCQlCWjJfYnpDb21wcmVzc0VuZChienMpOwotCQkJCWdvdG8gZXJyb3I7Ci0JCQl9Ci0JCQlienMtPm5leHRfb3V0ID0gQlVGKHJldCkgKyAoQlpTX1RPVEFMX09VVChienMpCi0JCQkJCQkgICAgLSB0b3RhbG91dCk7Ci0JCQlienMtPmF2YWlsX291dCA9IGJ1ZnNpemUgLSAoYnpzLT5uZXh0X291dCAtIEJVRihyZXQpKTsKLQkJfQotCX0KKyAgICBmb3IgKDs7KSB7CisgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgYnplcnJvciA9IEJaMl9iekNvbXByZXNzKGJ6cywgQlpfUlVOKTsKKyAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgaWYgKGJ6ZXJyb3IgIT0gQlpfUlVOX09LKSB7CisgICAgICAgICAgICBVdGlsX0NhdGNoQloyRXJyb3IoYnplcnJvcik7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgICAgIGlmIChienMtPmF2YWlsX2luID09IDApCisgICAgICAgICAgICBicmVhazsgLyogbm8gbW9yZSBpbnB1dCBkYXRhICovCisgICAgICAgIGlmIChienMtPmF2YWlsX291dCA9PSAwKSB7CisgICAgICAgICAgICBidWZzaXplID0gVXRpbF9OZXdCdWZmZXJTaXplKGJ1ZnNpemUpOworICAgICAgICAgICAgaWYgKF9QeVN0cmluZ19SZXNpemUoJnJldCwgYnVmc2l6ZSkgPCAwKSB7CisgICAgICAgICAgICAgICAgQloyX2J6Q29tcHJlc3NFbmQoYnpzKTsKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnpzLT5uZXh0X291dCA9IEJVRihyZXQpICsgKEJaU19UT1RBTF9PVVQoYnpzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gdG90YWxvdXQpOworICAgICAgICAgICAgYnpzLT5hdmFpbF9vdXQgPSBidWZzaXplIC0gKGJ6cy0+bmV4dF9vdXQgLSBCVUYocmV0KSk7CisgICAgICAgIH0KKyAgICB9CiAKLQlfUHlTdHJpbmdfUmVzaXplKCZyZXQsIChQeV9zc2l6ZV90KShCWlNfVE9UQUxfT1VUKGJ6cykgLSB0b3RhbG91dCkpOworICAgIF9QeVN0cmluZ19SZXNpemUoJnJldCwgKFB5X3NzaXplX3QpKEJaU19UT1RBTF9PVVQoYnpzKSAtIHRvdGFsb3V0KSk7CiAKLQlSRUxFQVNFX0xPQ0soc2VsZik7Ci0JUHlCdWZmZXJfUmVsZWFzZSgmcGRhdGEpOwotCXJldHVybiByZXQ7CisgICAgUkVMRUFTRV9MT0NLKHNlbGYpOworICAgIFB5QnVmZmVyX1JlbGVhc2UoJnBkYXRhKTsKKyAgICByZXR1cm4gcmV0OwogCiBlcnJvcjoKLQlSRUxFQVNFX0xPQ0soc2VsZik7Ci0JUHlCdWZmZXJfUmVsZWFzZSgmcGRhdGEpOwotCVB5X1hERUNSRUYocmV0KTsKLQlyZXR1cm4gTlVMTDsKKyAgICBSRUxFQVNFX0xPQ0soc2VsZik7CisgICAgUHlCdWZmZXJfUmVsZWFzZSgmcGRhdGEpOworICAgIFB5X1hERUNSRUYocmV0KTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogUHlEb2NfU1RSVkFSKEJaMkNvbXBfZmx1c2hfX2RvY19fLApAQCAtMTY0MCw2OCArMTY0MCw2OCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIEJaMkNvbXBfZmx1c2goQloyQ29tcE9iamVjdCAqc2VsZikKIHsKLQlpbnQgYnVmc2l6ZSA9IFNNQUxMQ0hVTks7Ci0JUHlPYmplY3QgKnJldCA9IE5VTEw7Ci0JYnpfc3RyZWFtICpienMgPSAmc2VsZi0+YnpzOwotCVBZX0xPTkdfTE9ORyB0b3RhbG91dDsKLQlpbnQgYnplcnJvcjsKKyAgICBpbnQgYnVmc2l6ZSA9IFNNQUxMQ0hVTks7CisgICAgUHlPYmplY3QgKnJldCA9IE5VTEw7CisgICAgYnpfc3RyZWFtICpienMgPSAmc2VsZi0+YnpzOworICAgIFBZX0xPTkdfTE9ORyB0b3RhbG91dDsKKyAgICBpbnQgYnplcnJvcjsKIAotCUFDUVVJUkVfTE9DSyhzZWxmKTsKLQlpZiAoIXNlbGYtPnJ1bm5pbmcpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJvYmplY3Qgd2FzIGFscmVhZHkgIgotCQkJCQkJICAiZmx1c2hlZCIpOwotCQlnb3RvIGVycm9yOwotCX0KLQlzZWxmLT5ydW5uaW5nID0gMDsKKyAgICBBQ1FVSVJFX0xPQ0soc2VsZik7CisgICAgaWYgKCFzZWxmLT5ydW5uaW5nKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAib2JqZWN0IHdhcyBhbHJlYWR5ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmbHVzaGVkIik7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorICAgIHNlbGYtPnJ1bm5pbmcgPSAwOwogCi0JcmV0ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgYnVmc2l6ZSk7Ci0JaWYgKCFyZXQpCi0JCWdvdG8gZXJyb3I7CisgICAgcmV0ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgYnVmc2l6ZSk7CisgICAgaWYgKCFyZXQpCisgICAgICAgIGdvdG8gZXJyb3I7CiAKLQlienMtPm5leHRfb3V0ID0gQlVGKHJldCk7Ci0JYnpzLT5hdmFpbF9vdXQgPSBidWZzaXplOworICAgIGJ6cy0+bmV4dF9vdXQgPSBCVUYocmV0KTsKKyAgICBienMtPmF2YWlsX291dCA9IGJ1ZnNpemU7CiAKLQl0b3RhbG91dCA9IEJaU19UT1RBTF9PVVQoYnpzKTsKKyAgICB0b3RhbG91dCA9IEJaU19UT1RBTF9PVVQoYnpzKTsKIAotCWZvciAoOzspIHsKLQkJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCQliemVycm9yID0gQloyX2J6Q29tcHJlc3MoYnpzLCBCWl9GSU5JU0gpOwotCQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCQlpZiAoYnplcnJvciA9PSBCWl9TVFJFQU1fRU5EKSB7Ci0JCQlicmVhazsKLQkJfSBlbHNlIGlmIChiemVycm9yICE9IEJaX0ZJTklTSF9PSykgewotCQkJVXRpbF9DYXRjaEJaMkVycm9yKGJ6ZXJyb3IpOwotCQkJZ290byBlcnJvcjsKLQkJfQotCQlpZiAoYnpzLT5hdmFpbF9vdXQgPT0gMCkgewotCQkJYnVmc2l6ZSA9IFV0aWxfTmV3QnVmZmVyU2l6ZShidWZzaXplKTsKLQkJCWlmIChfUHlTdHJpbmdfUmVzaXplKCZyZXQsIGJ1ZnNpemUpIDwgMCkKLQkJCQlnb3RvIGVycm9yOwotCQkJYnpzLT5uZXh0X291dCA9IEJVRihyZXQpOwotCQkJYnpzLT5uZXh0X291dCA9IEJVRihyZXQpICsgKEJaU19UT1RBTF9PVVQoYnpzKQotCQkJCQkJICAgIC0gdG90YWxvdXQpOwotCQkJYnpzLT5hdmFpbF9vdXQgPSBidWZzaXplIC0gKGJ6cy0+bmV4dF9vdXQgLSBCVUYocmV0KSk7Ci0JCX0KLQl9CisgICAgZm9yICg7OykgeworICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgICAgIGJ6ZXJyb3IgPSBCWjJfYnpDb21wcmVzcyhienMsIEJaX0ZJTklTSCk7CisgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgICAgIGlmIChiemVycm9yID09IEJaX1NUUkVBTV9FTkQpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgaWYgKGJ6ZXJyb3IgIT0gQlpfRklOSVNIX09LKSB7CisgICAgICAgICAgICBVdGlsX0NhdGNoQloyRXJyb3IoYnplcnJvcik7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgICAgIGlmIChienMtPmF2YWlsX291dCA9PSAwKSB7CisgICAgICAgICAgICBidWZzaXplID0gVXRpbF9OZXdCdWZmZXJTaXplKGJ1ZnNpemUpOworICAgICAgICAgICAgaWYgKF9QeVN0cmluZ19SZXNpemUoJnJldCwgYnVmc2l6ZSkgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICBienMtPm5leHRfb3V0ID0gQlVGKHJldCk7CisgICAgICAgICAgICBienMtPm5leHRfb3V0ID0gQlVGKHJldCkgKyAoQlpTX1RPVEFMX09VVChienMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSB0b3RhbG91dCk7CisgICAgICAgICAgICBienMtPmF2YWlsX291dCA9IGJ1ZnNpemUgLSAoYnpzLT5uZXh0X291dCAtIEJVRihyZXQpKTsKKyAgICAgICAgfQorICAgIH0KIAotCWlmIChienMtPmF2YWlsX291dCAhPSAwKQotCQlfUHlTdHJpbmdfUmVzaXplKCZyZXQsIChQeV9zc2l6ZV90KShCWlNfVE9UQUxfT1VUKGJ6cykgLSB0b3RhbG91dCkpOworICAgIGlmIChienMtPmF2YWlsX291dCAhPSAwKQorICAgICAgICBfUHlTdHJpbmdfUmVzaXplKCZyZXQsIChQeV9zc2l6ZV90KShCWlNfVE9UQUxfT1VUKGJ6cykgLSB0b3RhbG91dCkpOwogCi0JUkVMRUFTRV9MT0NLKHNlbGYpOwotCXJldHVybiByZXQ7CisgICAgUkVMRUFTRV9MT0NLKHNlbGYpOworICAgIHJldHVybiByZXQ7CiAKIGVycm9yOgotCVJFTEVBU0VfTE9DSyhzZWxmKTsKLQlQeV9YREVDUkVGKHJldCk7Ci0JcmV0dXJuIE5VTEw7CisgICAgUkVMRUFTRV9MT0NLKHNlbGYpOworICAgIFB5X1hERUNSRUYocmV0KTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIEJaMkNvbXBfbWV0aG9kc1tdID0gewotCXsiY29tcHJlc3MiLCAoUHlDRnVuY3Rpb24pQloyQ29tcF9jb21wcmVzcywgTUVUSF9WQVJBUkdTLAotCSBCWjJDb21wX2NvbXByZXNzX19kb2NfX30sCi0JeyJmbHVzaCIsIChQeUNGdW5jdGlvbilCWjJDb21wX2ZsdXNoLCBNRVRIX05PQVJHUywKLQkgQloyQ29tcF9mbHVzaF9fZG9jX199LAotCXtOVUxMLAkJTlVMTH0JCS8qIHNlbnRpbmVsICovCisgICAgeyJjb21wcmVzcyIsIChQeUNGdW5jdGlvbilCWjJDb21wX2NvbXByZXNzLCBNRVRIX1ZBUkFSR1MsCisgICAgIEJaMkNvbXBfY29tcHJlc3NfX2RvY19ffSwKKyAgICB7ImZsdXNoIiwgKFB5Q0Z1bmN0aW9uKUJaMkNvbXBfZmx1c2gsIE1FVEhfTk9BUkdTLAorICAgICBCWjJDb21wX2ZsdXNoX19kb2NfX30sCisgICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIApAQCAtMTcxMSw1NyArMTcxMSw1NyBAQAogc3RhdGljIGludAogQloyQ29tcF9pbml0KEJaMkNvbXBPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewotCWludCBjb21wcmVzc2xldmVsID0gOTsKLQlpbnQgYnplcnJvcjsKLQlzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7ImNvbXByZXNzbGV2ZWwiLCAwfTsKKyAgICBpbnQgY29tcHJlc3NsZXZlbCA9IDk7CisgICAgaW50IGJ6ZXJyb3I7CisgICAgc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJjb21wcmVzc2xldmVsIiwgMH07CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJ8aTpCWjJDb21wcmVzc29yIiwKLQkJCQkJIGt3bGlzdCwgJmNvbXByZXNzbGV2ZWwpKQotCQlyZXR1cm4gLTE7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAifGk6QloyQ29tcHJlc3NvciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3dsaXN0LCAmY29tcHJlc3NsZXZlbCkpCisgICAgICAgIHJldHVybiAtMTsKIAotCWlmIChjb21wcmVzc2xldmVsIDwgMSB8fCBjb21wcmVzc2xldmVsID4gOSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkiY29tcHJlc3NsZXZlbCBtdXN0IGJlIGJldHdlZW4gMSBhbmQgOSIpOwotCQlnb3RvIGVycm9yOwotCX0KKyAgICBpZiAoY29tcHJlc3NsZXZlbCA8IDEgfHwgY29tcHJlc3NsZXZlbCA+IDkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiY29tcHJlc3NsZXZlbCBtdXN0IGJlIGJldHdlZW4gMSBhbmQgOSIpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KIAogI2lmZGVmIFdJVEhfVEhSRUFECi0Jc2VsZi0+bG9jayA9IFB5VGhyZWFkX2FsbG9jYXRlX2xvY2soKTsKLQlpZiAoIXNlbGYtPmxvY2spIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX01lbW9yeUVycm9yLCAidW5hYmxlIHRvIGFsbG9jYXRlIGxvY2siKTsKLQkJZ290byBlcnJvcjsKLQl9CisgICAgc2VsZi0+bG9jayA9IFB5VGhyZWFkX2FsbG9jYXRlX2xvY2soKTsKKyAgICBpZiAoIXNlbGYtPmxvY2spIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX01lbW9yeUVycm9yLCAidW5hYmxlIHRvIGFsbG9jYXRlIGxvY2siKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CiAjZW5kaWYKIAotCW1lbXNldCgmc2VsZi0+YnpzLCAwLCBzaXplb2YoYnpfc3RyZWFtKSk7Ci0JYnplcnJvciA9IEJaMl9iekNvbXByZXNzSW5pdCgmc2VsZi0+YnpzLCBjb21wcmVzc2xldmVsLCAwLCAwKTsKLQlpZiAoYnplcnJvciAhPSBCWl9PSykgewotCQlVdGlsX0NhdGNoQloyRXJyb3IoYnplcnJvcik7Ci0JCWdvdG8gZXJyb3I7Ci0JfQorICAgIG1lbXNldCgmc2VsZi0+YnpzLCAwLCBzaXplb2YoYnpfc3RyZWFtKSk7CisgICAgYnplcnJvciA9IEJaMl9iekNvbXByZXNzSW5pdCgmc2VsZi0+YnpzLCBjb21wcmVzc2xldmVsLCAwLCAwKTsKKyAgICBpZiAoYnplcnJvciAhPSBCWl9PSykgeworICAgICAgICBVdGlsX0NhdGNoQloyRXJyb3IoYnplcnJvcik7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQogCi0Jc2VsZi0+cnVubmluZyA9IDE7CisgICAgc2VsZi0+cnVubmluZyA9IDE7CiAKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKIGVycm9yOgogI2lmZGVmIFdJVEhfVEhSRUFECi0JaWYgKHNlbGYtPmxvY2spIHsKLQkJUHlUaHJlYWRfZnJlZV9sb2NrKHNlbGYtPmxvY2spOwotCQlzZWxmLT5sb2NrID0gTlVMTDsKLQl9CisgICAgaWYgKHNlbGYtPmxvY2spIHsKKyAgICAgICAgUHlUaHJlYWRfZnJlZV9sb2NrKHNlbGYtPmxvY2spOworICAgICAgICBzZWxmLT5sb2NrID0gTlVMTDsKKyAgICB9CiAjZW5kaWYKLQlyZXR1cm4gLTE7CisgICAgcmV0dXJuIC0xOwogfQogCiBzdGF0aWMgdm9pZAogQloyQ29tcF9kZWFsbG9jKEJaMkNvbXBPYmplY3QgKnNlbGYpCiB7CiAjaWZkZWYgV0lUSF9USFJFQUQKLQlpZiAoc2VsZi0+bG9jaykKLQkJUHlUaHJlYWRfZnJlZV9sb2NrKHNlbGYtPmxvY2spOworICAgIGlmIChzZWxmLT5sb2NrKQorICAgICAgICBQeVRocmVhZF9mcmVlX2xvY2soc2VsZi0+bG9jayk7CiAjZW5kaWYKLQlCWjJfYnpDb21wcmVzc0VuZCgmc2VsZi0+YnpzKTsKLQlQeV9UWVBFKHNlbGYpLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOworICAgIEJaMl9iekNvbXByZXNzRW5kKCZzZWxmLT5ienMpOworICAgIFB5X1RZUEUoc2VsZiktPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIApAQCAtMTc3OCw0NiArMTc3OCw0NiBAQAogIik7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgQloyQ29tcF9UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotCSJiejIuQloyQ29tcHJlc3NvciIsCS8qdHBfbmFtZSovCi0Jc2l6ZW9mKEJaMkNvbXBPYmplY3QpLAkvKnRwX2Jhc2ljc2l6ZSovCi0JMCwJCQkvKnRwX2l0ZW1zaXplKi8KLQkoZGVzdHJ1Y3RvcilCWjJDb21wX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCi0JMCwJCQkvKnRwX3ByaW50Ki8KLQkwLAkJCS8qdHBfZ2V0YXR0ciovCi0JMCwJCQkvKnRwX3NldGF0dHIqLwotCTAsCQkJLyp0cF9jb21wYXJlKi8KLQkwLAkJCS8qdHBfcmVwciovCi0JMCwJCQkvKnRwX2FzX251bWJlciovCi0JMCwJCQkvKnRwX2FzX3NlcXVlbmNlKi8KLQkwLAkJCS8qdHBfYXNfbWFwcGluZyovCi0JMCwJCQkvKnRwX2hhc2gqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NhbGwqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3N0ciovCi0gICAgICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLC8qdHBfZ2V0YXR0cm8qLwotICAgICAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwvKnRwX3NldGF0dHJvKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19idWZmZXIqLwotICAgICAgICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyp0cF9mbGFncyovCi0gICAgICAgIEJaMkNvbXBfX2RvY19fLCAgICAgICAgIC8qdHBfZG9jKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF90cmF2ZXJzZSovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY2xlYXIqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3JpY2hjb21wYXJlKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF93ZWFrbGlzdG9mZnNldCovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlciovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlcm5leHQqLwotICAgICAgICBCWjJDb21wX21ldGhvZHMsICAgICAgICAvKnRwX21ldGhvZHMqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX21lbWJlcnMqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldHNldCovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYmFzZSovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGljdCovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGVzY3JfZ2V0Ki8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kZXNjcl9zZXQqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2RpY3RvZmZzZXQqLwotICAgICAgICAoaW5pdHByb2MpQloyQ29tcF9pbml0LCAvKnRwX2luaXQqLwotICAgICAgICBQeVR5cGVfR2VuZXJpY0FsbG9jLCAgICAvKnRwX2FsbG9jKi8KLSAgICAgICAgUHlUeXBlX0dlbmVyaWNOZXcsICAgICAgLyp0cF9uZXcqLwotICAgICAgCV9QeU9iamVjdF9EZWwsICAgICAgICAgIC8qdHBfZnJlZSovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXNfZ2MqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQorICAgICJiejIuQloyQ29tcHJlc3NvciIsICAgICAgICAvKnRwX25hbWUqLworICAgIHNpemVvZihCWjJDb21wT2JqZWN0KSwgICAgICAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlbXNpemUqLworICAgIChkZXN0cnVjdG9yKUJaMkNvbXBfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9wcmludCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0YXR0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc2V0YXR0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY29tcGFyZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmVwciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbnVtYmVyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19zZXF1ZW5jZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbWFwcGluZyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaGFzaCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jYWxsKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3N0ciovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsLyp0cF9nZXRhdHRybyovCisgICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsLyp0cF9zZXRhdHRybyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKnRwX2ZsYWdzKi8KKyAgICBCWjJDb21wX19kb2NfXywgICAgICAgICAvKnRwX2RvYyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF90cmF2ZXJzZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jbGVhciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZXJuZXh0Ki8KKyAgICBCWjJDb21wX21ldGhvZHMsICAgICAgICAvKnRwX21ldGhvZHMqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfbWVtYmVycyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRzZXQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYmFzZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kaWN0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2Rlc2NyX2dldCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kZXNjcl9zZXQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGljdG9mZnNldCovCisgICAgKGluaXRwcm9jKUJaMkNvbXBfaW5pdCwgLyp0cF9pbml0Ki8KKyAgICBQeVR5cGVfR2VuZXJpY0FsbG9jLCAgICAvKnRwX2FsbG9jKi8KKyAgICBQeVR5cGVfR2VuZXJpY05ldywgICAgICAvKnRwX25ldyovCisgICAgX1B5T2JqZWN0X0RlbCwgICAgICAgICAgLyp0cF9mcmVlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2lzX2djKi8KIH07CiAKIApAQCAtMTgyOCw4ICsxODI4LDggQEAKICNkZWZpbmUgT0ZGKHgpIG9mZnNldG9mKEJaMkRlY29tcE9iamVjdCwgeCkKIAogc3RhdGljIFB5TWVtYmVyRGVmIEJaMkRlY29tcF9tZW1iZXJzW10gPSB7Ci0JeyJ1bnVzZWRfZGF0YSIsIFRfT0JKRUNULCBPRkYodW51c2VkX2RhdGEpLCBST30sCi0Je05VTEx9CS8qIFNlbnRpbmVsICovCisgICAgeyJ1bnVzZWRfZGF0YSIsIFRfT0JKRUNULCBPRkYodW51c2VkX2RhdGEpLCBST30sCisgICAge05VTEx9ICAgICAgLyogU2VudGluZWwgKi8KIH07CiAKIApAQCAtMTg0OSw4OCArMTg0OSw4OCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIEJaMkRlY29tcF9kZWNvbXByZXNzKEJaMkRlY29tcE9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlfYnVmZmVyIHBkYXRhOwotCWNoYXIgKmRhdGE7Ci0JaW50IGRhdGFzaXplOwotCWludCBidWZzaXplID0gU01BTExDSFVOSzsKLQlQWV9MT05HX0xPTkcgdG90YWxvdXQ7Ci0JUHlPYmplY3QgKnJldCA9IE5VTEw7Ci0JYnpfc3RyZWFtICpienMgPSAmc2VsZi0+YnpzOwotCWludCBiemVycm9yOworICAgIFB5X2J1ZmZlciBwZGF0YTsKKyAgICBjaGFyICpkYXRhOworICAgIGludCBkYXRhc2l6ZTsKKyAgICBpbnQgYnVmc2l6ZSA9IFNNQUxMQ0hVTks7CisgICAgUFlfTE9OR19MT05HIHRvdGFsb3V0OworICAgIFB5T2JqZWN0ICpyZXQgPSBOVUxMOworICAgIGJ6X3N0cmVhbSAqYnpzID0gJnNlbGYtPmJ6czsKKyAgICBpbnQgYnplcnJvcjsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyo6ZGVjb21wcmVzcyIsICZwZGF0YSkpCi0JCXJldHVybiBOVUxMOwotCWRhdGEgPSBwZGF0YS5idWY7Ci0JZGF0YXNpemUgPSBwZGF0YS5sZW47CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzKjpkZWNvbXByZXNzIiwgJnBkYXRhKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZGF0YSA9IHBkYXRhLmJ1ZjsKKyAgICBkYXRhc2l6ZSA9IHBkYXRhLmxlbjsKIAotCUFDUVVJUkVfTE9DSyhzZWxmKTsKLQlpZiAoIXNlbGYtPnJ1bm5pbmcpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0VPRkVycm9yLCAiZW5kIG9mIHN0cmVhbSB3YXMgIgotCQkJCQkJImFscmVhZHkgZm91bmQiKTsKLQkJZ290byBlcnJvcjsKLQl9CisgICAgQUNRVUlSRV9MT0NLKHNlbGYpOworICAgIGlmICghc2VsZi0+cnVubmluZykgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfRU9GRXJyb3IsICJlbmQgb2Ygc3RyZWFtIHdhcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFscmVhZHkgZm91bmQiKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CiAKLQlyZXQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBidWZzaXplKTsKLQlpZiAoIXJldCkKLQkJZ290byBlcnJvcjsKKyAgICByZXQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBidWZzaXplKTsKKyAgICBpZiAoIXJldCkKKyAgICAgICAgZ290byBlcnJvcjsKIAotCWJ6cy0+bmV4dF9pbiA9IGRhdGE7Ci0JYnpzLT5hdmFpbF9pbiA9IGRhdGFzaXplOwotCWJ6cy0+bmV4dF9vdXQgPSBCVUYocmV0KTsKLQlienMtPmF2YWlsX291dCA9IGJ1ZnNpemU7CisgICAgYnpzLT5uZXh0X2luID0gZGF0YTsKKyAgICBienMtPmF2YWlsX2luID0gZGF0YXNpemU7CisgICAgYnpzLT5uZXh0X291dCA9IEJVRihyZXQpOworICAgIGJ6cy0+YXZhaWxfb3V0ID0gYnVmc2l6ZTsKIAotCXRvdGFsb3V0ID0gQlpTX1RPVEFMX09VVChienMpOworICAgIHRvdGFsb3V0ID0gQlpTX1RPVEFMX09VVChienMpOwogCi0JZm9yICg7OykgewotCQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JCWJ6ZXJyb3IgPSBCWjJfYnpEZWNvbXByZXNzKGJ6cyk7Ci0JCVB5X0VORF9BTExPV19USFJFQURTCi0JCWlmIChiemVycm9yID09IEJaX1NUUkVBTV9FTkQpIHsKLQkJCWlmIChienMtPmF2YWlsX2luICE9IDApIHsKLQkJCQlQeV9ERUNSRUYoc2VsZi0+dW51c2VkX2RhdGEpOwotCQkJCXNlbGYtPnVudXNlZF9kYXRhID0KLQkJCQkgICAgUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoYnpzLT5uZXh0X2luLAotCQkJCQkJCSAgICAgICBienMtPmF2YWlsX2luKTsKLQkJCX0KLQkJCXNlbGYtPnJ1bm5pbmcgPSAwOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGJ6ZXJyb3IgIT0gQlpfT0spIHsKLQkJCVV0aWxfQ2F0Y2hCWjJFcnJvcihiemVycm9yKTsKLQkJCWdvdG8gZXJyb3I7Ci0JCX0KLQkJaWYgKGJ6cy0+YXZhaWxfaW4gPT0gMCkKLQkJCWJyZWFrOyAvKiBubyBtb3JlIGlucHV0IGRhdGEgKi8KLQkJaWYgKGJ6cy0+YXZhaWxfb3V0ID09IDApIHsKLQkJCWJ1ZnNpemUgPSBVdGlsX05ld0J1ZmZlclNpemUoYnVmc2l6ZSk7Ci0JCQlpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmcmV0LCBidWZzaXplKSA8IDApIHsKLQkJCQlCWjJfYnpEZWNvbXByZXNzRW5kKGJ6cyk7Ci0JCQkJZ290byBlcnJvcjsKLQkJCX0KLQkJCWJ6cy0+bmV4dF9vdXQgPSBCVUYocmV0KTsKLQkJCWJ6cy0+bmV4dF9vdXQgPSBCVUYocmV0KSArIChCWlNfVE9UQUxfT1VUKGJ6cykKLQkJCQkJCSAgICAtIHRvdGFsb3V0KTsKLQkJCWJ6cy0+YXZhaWxfb3V0ID0gYnVmc2l6ZSAtIChienMtPm5leHRfb3V0IC0gQlVGKHJldCkpOwotCQl9Ci0JfQorICAgIGZvciAoOzspIHsKKyAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICBiemVycm9yID0gQloyX2J6RGVjb21wcmVzcyhienMpOworICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgICAgICBpZiAoYnplcnJvciA9PSBCWl9TVFJFQU1fRU5EKSB7CisgICAgICAgICAgICBpZiAoYnpzLT5hdmFpbF9pbiAhPSAwKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHNlbGYtPnVudXNlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICBzZWxmLT51bnVzZWRfZGF0YSA9CisgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGJ6cy0+bmV4dF9pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnpzLT5hdmFpbF9pbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZWxmLT5ydW5uaW5nID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChiemVycm9yICE9IEJaX09LKSB7CisgICAgICAgICAgICBVdGlsX0NhdGNoQloyRXJyb3IoYnplcnJvcik7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgICAgIGlmIChienMtPmF2YWlsX2luID09IDApCisgICAgICAgICAgICBicmVhazsgLyogbm8gbW9yZSBpbnB1dCBkYXRhICovCisgICAgICAgIGlmIChienMtPmF2YWlsX291dCA9PSAwKSB7CisgICAgICAgICAgICBidWZzaXplID0gVXRpbF9OZXdCdWZmZXJTaXplKGJ1ZnNpemUpOworICAgICAgICAgICAgaWYgKF9QeVN0cmluZ19SZXNpemUoJnJldCwgYnVmc2l6ZSkgPCAwKSB7CisgICAgICAgICAgICAgICAgQloyX2J6RGVjb21wcmVzc0VuZChienMpOworICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBienMtPm5leHRfb3V0ID0gQlVGKHJldCk7CisgICAgICAgICAgICBienMtPm5leHRfb3V0ID0gQlVGKHJldCkgKyAoQlpTX1RPVEFMX09VVChienMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSB0b3RhbG91dCk7CisgICAgICAgICAgICBienMtPmF2YWlsX291dCA9IGJ1ZnNpemUgLSAoYnpzLT5uZXh0X291dCAtIEJVRihyZXQpKTsKKyAgICAgICAgfQorICAgIH0KIAotCWlmIChienMtPmF2YWlsX291dCAhPSAwKQotCQlfUHlTdHJpbmdfUmVzaXplKCZyZXQsIChQeV9zc2l6ZV90KShCWlNfVE9UQUxfT1VUKGJ6cykgLSB0b3RhbG91dCkpOworICAgIGlmIChienMtPmF2YWlsX291dCAhPSAwKQorICAgICAgICBfUHlTdHJpbmdfUmVzaXplKCZyZXQsIChQeV9zc2l6ZV90KShCWlNfVE9UQUxfT1VUKGJ6cykgLSB0b3RhbG91dCkpOwogCi0JUkVMRUFTRV9MT0NLKHNlbGYpOwotCVB5QnVmZmVyX1JlbGVhc2UoJnBkYXRhKTsKLQlyZXR1cm4gcmV0OworICAgIFJFTEVBU0VfTE9DSyhzZWxmKTsKKyAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZwZGF0YSk7CisgICAgcmV0dXJuIHJldDsKIAogZXJyb3I6Ci0JUkVMRUFTRV9MT0NLKHNlbGYpOwotCVB5QnVmZmVyX1JlbGVhc2UoJnBkYXRhKTsKLQlQeV9YREVDUkVGKHJldCk7Ci0JcmV0dXJuIE5VTEw7CisgICAgUkVMRUFTRV9MT0NLKHNlbGYpOworICAgIFB5QnVmZmVyX1JlbGVhc2UoJnBkYXRhKTsKKyAgICBQeV9YREVDUkVGKHJldCk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBCWjJEZWNvbXBfbWV0aG9kc1tdID0gewotCXsiZGVjb21wcmVzcyIsIChQeUNGdW5jdGlvbilCWjJEZWNvbXBfZGVjb21wcmVzcywgTUVUSF9WQVJBUkdTLCBCWjJEZWNvbXBfZGVjb21wcmVzc19fZG9jX199LAotCXtOVUxMLAkJTlVMTH0JCS8qIHNlbnRpbmVsICovCisgICAgeyJkZWNvbXByZXNzIiwgKFB5Q0Z1bmN0aW9uKUJaMkRlY29tcF9kZWNvbXByZXNzLCBNRVRIX1ZBUkFSR1MsIEJaMkRlY29tcF9kZWNvbXByZXNzX19kb2NfX30sCisgICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIApAQCAtMTk0MCw1NSArMTk0MCw1NSBAQAogc3RhdGljIGludAogQloyRGVjb21wX2luaXQoQloyRGVjb21wT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKLQlpbnQgYnplcnJvcjsKKyAgICBpbnQgYnplcnJvcjsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOkJaMkRlY29tcHJlc3NvciIpKQotCQlyZXR1cm4gLTE7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6QloyRGVjb21wcmVzc29yIikpCisgICAgICAgIHJldHVybiAtMTsKIAogI2lmZGVmIFdJVEhfVEhSRUFECi0Jc2VsZi0+bG9jayA9IFB5VGhyZWFkX2FsbG9jYXRlX2xvY2soKTsKLQlpZiAoIXNlbGYtPmxvY2spIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX01lbW9yeUVycm9yLCAidW5hYmxlIHRvIGFsbG9jYXRlIGxvY2siKTsKLQkJZ290byBlcnJvcjsKLQl9CisgICAgc2VsZi0+bG9jayA9IFB5VGhyZWFkX2FsbG9jYXRlX2xvY2soKTsKKyAgICBpZiAoIXNlbGYtPmxvY2spIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX01lbW9yeUVycm9yLCAidW5hYmxlIHRvIGFsbG9jYXRlIGxvY2siKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CiAjZW5kaWYKIAotCXNlbGYtPnVudXNlZF9kYXRhID0gUHlTdHJpbmdfRnJvbVN0cmluZygiIik7Ci0JaWYgKCFzZWxmLT51bnVzZWRfZGF0YSkKLQkJZ290byBlcnJvcjsKKyAgICBzZWxmLT51bnVzZWRfZGF0YSA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIiIpOworICAgIGlmICghc2VsZi0+dW51c2VkX2RhdGEpCisgICAgICAgIGdvdG8gZXJyb3I7CiAKLQltZW1zZXQoJnNlbGYtPmJ6cywgMCwgc2l6ZW9mKGJ6X3N0cmVhbSkpOwotCWJ6ZXJyb3IgPSBCWjJfYnpEZWNvbXByZXNzSW5pdCgmc2VsZi0+YnpzLCAwLCAwKTsKLQlpZiAoYnplcnJvciAhPSBCWl9PSykgewotCQlVdGlsX0NhdGNoQloyRXJyb3IoYnplcnJvcik7Ci0JCWdvdG8gZXJyb3I7Ci0JfQorICAgIG1lbXNldCgmc2VsZi0+YnpzLCAwLCBzaXplb2YoYnpfc3RyZWFtKSk7CisgICAgYnplcnJvciA9IEJaMl9iekRlY29tcHJlc3NJbml0KCZzZWxmLT5ienMsIDAsIDApOworICAgIGlmIChiemVycm9yICE9IEJaX09LKSB7CisgICAgICAgIFV0aWxfQ2F0Y2hCWjJFcnJvcihiemVycm9yKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CiAKLQlzZWxmLT5ydW5uaW5nID0gMTsKKyAgICBzZWxmLT5ydW5uaW5nID0gMTsKIAotCXJldHVybiAwOworICAgIHJldHVybiAwOwogCiBlcnJvcjoKICNpZmRlZiBXSVRIX1RIUkVBRAotCWlmIChzZWxmLT5sb2NrKSB7Ci0JCVB5VGhyZWFkX2ZyZWVfbG9jayhzZWxmLT5sb2NrKTsKLQkJc2VsZi0+bG9jayA9IE5VTEw7Ci0JfQorICAgIGlmIChzZWxmLT5sb2NrKSB7CisgICAgICAgIFB5VGhyZWFkX2ZyZWVfbG9jayhzZWxmLT5sb2NrKTsKKyAgICAgICAgc2VsZi0+bG9jayA9IE5VTEw7CisgICAgfQogI2VuZGlmCi0JUHlfQ0xFQVIoc2VsZi0+dW51c2VkX2RhdGEpOwotCXJldHVybiAtMTsKKyAgICBQeV9DTEVBUihzZWxmLT51bnVzZWRfZGF0YSk7CisgICAgcmV0dXJuIC0xOwogfQogCiBzdGF0aWMgdm9pZAogQloyRGVjb21wX2RlYWxsb2MoQloyRGVjb21wT2JqZWN0ICpzZWxmKQogewogI2lmZGVmIFdJVEhfVEhSRUFECi0JaWYgKHNlbGYtPmxvY2spCi0JCVB5VGhyZWFkX2ZyZWVfbG9jayhzZWxmLT5sb2NrKTsKKyAgICBpZiAoc2VsZi0+bG9jaykKKyAgICAgICAgUHlUaHJlYWRfZnJlZV9sb2NrKHNlbGYtPmxvY2spOwogI2VuZGlmCi0JUHlfWERFQ1JFRihzZWxmLT51bnVzZWRfZGF0YSk7Ci0JQloyX2J6RGVjb21wcmVzc0VuZCgmc2VsZi0+YnpzKTsKLQlQeV9UWVBFKHNlbGYpLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOworICAgIFB5X1hERUNSRUYoc2VsZi0+dW51c2VkX2RhdGEpOworICAgIEJaMl9iekRlY29tcHJlc3NFbmQoJnNlbGYtPmJ6cyk7CisgICAgUHlfVFlQRShzZWxmKS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogCkBAIC0yMDA0LDQ2ICsyMDA0LDQ2IEBACiAiKTsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBCWjJEZWNvbXBfVHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKLQkiYnoyLkJaMkRlY29tcHJlc3NvciIsCS8qdHBfbmFtZSovCi0Jc2l6ZW9mKEJaMkRlY29tcE9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KLQkwLAkJCS8qdHBfaXRlbXNpemUqLwotCShkZXN0cnVjdG9yKUJaMkRlY29tcF9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsCQkJLyp0cF9wcmludCovCi0JMCwJCQkvKnRwX2dldGF0dHIqLwotCTAsCQkJLyp0cF9zZXRhdHRyKi8KLQkwLAkJCS8qdHBfY29tcGFyZSovCi0JMCwJCQkvKnRwX3JlcHIqLwotCTAsCQkJLyp0cF9hc19udW1iZXIqLwotCTAsCQkJLyp0cF9hc19zZXF1ZW5jZSovCi0JMCwJCQkvKnRwX2FzX21hcHBpbmcqLwotCTAsCQkJLyp0cF9oYXNoKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jYWxsKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zdHIqLwotICAgICAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwvKnRwX2dldGF0dHJvKi8KLSAgICAgICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsLyp0cF9zZXRhdHRybyovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfYnVmZmVyKi8KLSAgICAgICAgUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qdHBfZmxhZ3MqLwotICAgICAgICBCWjJEZWNvbXBfX2RvY19fLCAgICAgICAvKnRwX2RvYyovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfdHJhdmVyc2UqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NsZWFyKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9yaWNoY29tcGFyZSovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfd2Vha2xpc3RvZmZzZXQqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZXIqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZXJuZXh0Ki8KLSAgICAgICAgQloyRGVjb21wX21ldGhvZHMsICAgICAgLyp0cF9tZXRob2RzKi8KLSAgICAgICAgQloyRGVjb21wX21lbWJlcnMsICAgICAgLyp0cF9tZW1iZXJzKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRzZXQqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2Jhc2UqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2RpY3QqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2Rlc2NyX2dldCovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGVzY3Jfc2V0Ki8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kaWN0b2Zmc2V0Ki8KLSAgICAgICAgKGluaXRwcm9jKUJaMkRlY29tcF9pbml0LCAvKnRwX2luaXQqLwotICAgICAgICBQeVR5cGVfR2VuZXJpY0FsbG9jLCAgICAvKnRwX2FsbG9jKi8KLSAgICAgICAgUHlUeXBlX0dlbmVyaWNOZXcsICAgICAgLyp0cF9uZXcqLwotICAgICAgCV9QeU9iamVjdF9EZWwsICAgICAgICAgIC8qdHBfZnJlZSovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXNfZ2MqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQorICAgICJiejIuQloyRGVjb21wcmVzc29yIiwgICAgICAvKnRwX25hbWUqLworICAgIHNpemVvZihCWjJEZWNvbXBPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlbXNpemUqLworICAgIChkZXN0cnVjdG9yKUJaMkRlY29tcF9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3ByaW50Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jb21wYXJlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9yZXByKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19udW1iZXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX3NlcXVlbmNlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19tYXBwaW5nKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9oYXNoKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NhbGwqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc3RyKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwvKnRwX2dldGF0dHJvKi8KKyAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwvKnRwX3NldGF0dHJvKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qdHBfZmxhZ3MqLworICAgIEJaMkRlY29tcF9fZG9jX18sICAgICAgIC8qdHBfZG9jKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3RyYXZlcnNlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NsZWFyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3JpY2hjb21wYXJlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlcm5leHQqLworICAgIEJaMkRlY29tcF9tZXRob2RzLCAgICAgIC8qdHBfbWV0aG9kcyovCisgICAgQloyRGVjb21wX21lbWJlcnMsICAgICAgLyp0cF9tZW1iZXJzKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldHNldCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9iYXNlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2RpY3QqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICAoaW5pdHByb2MpQloyRGVjb21wX2luaXQsIC8qdHBfaW5pdCovCisgICAgUHlUeXBlX0dlbmVyaWNBbGxvYywgICAgLyp0cF9hbGxvYyovCisgICAgUHlUeXBlX0dlbmVyaWNOZXcsICAgICAgLyp0cF9uZXcqLworICAgIF9QeU9iamVjdF9EZWwsICAgICAgICAgIC8qdHBfZnJlZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pc19nYyovCiB9OwogCiAKQEAgLTIwNjEsODggKzIwNjEsODggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBiejJfY29tcHJlc3MoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewotCWludCBjb21wcmVzc2xldmVsPTk7Ci0JUHlfYnVmZmVyIHBkYXRhOwotCWNoYXIgKmRhdGE7Ci0JaW50IGRhdGFzaXplOwotCWludCBidWZzaXplOwotCVB5T2JqZWN0ICpyZXQgPSBOVUxMOwotCWJ6X3N0cmVhbSBfYnpzOwotCWJ6X3N0cmVhbSAqYnpzID0gJl9ienM7Ci0JaW50IGJ6ZXJyb3I7Ci0Jc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJkYXRhIiwgImNvbXByZXNzbGV2ZWwiLCAwfTsKKyAgICBpbnQgY29tcHJlc3NsZXZlbD05OworICAgIFB5X2J1ZmZlciBwZGF0YTsKKyAgICBjaGFyICpkYXRhOworICAgIGludCBkYXRhc2l6ZTsKKyAgICBpbnQgYnVmc2l6ZTsKKyAgICBQeU9iamVjdCAqcmV0ID0gTlVMTDsKKyAgICBiel9zdHJlYW0gX2J6czsKKyAgICBiel9zdHJlYW0gKmJ6cyA9ICZfYnpzOworICAgIGludCBiemVycm9yOworICAgIHN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsiZGF0YSIsICJjb21wcmVzc2xldmVsIiwgMH07CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJzKnxpIiwKLQkJCQkJIGt3bGlzdCwgJnBkYXRhLAotCQkJCQkgJmNvbXByZXNzbGV2ZWwpKQotCQlyZXR1cm4gTlVMTDsKLQlkYXRhID0gcGRhdGEuYnVmOwotCWRhdGFzaXplID0gcGRhdGEubGVuOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInMqfGkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGt3bGlzdCwgJnBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb21wcmVzc2xldmVsKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZGF0YSA9IHBkYXRhLmJ1ZjsKKyAgICBkYXRhc2l6ZSA9IHBkYXRhLmxlbjsKIAotCWlmIChjb21wcmVzc2xldmVsIDwgMSB8fCBjb21wcmVzc2xldmVsID4gOSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkiY29tcHJlc3NsZXZlbCBtdXN0IGJlIGJldHdlZW4gMSBhbmQgOSIpOwotCQlQeUJ1ZmZlcl9SZWxlYXNlKCZwZGF0YSk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoY29tcHJlc3NsZXZlbCA8IDEgfHwgY29tcHJlc3NsZXZlbCA+IDkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiY29tcHJlc3NsZXZlbCBtdXN0IGJlIGJldHdlZW4gMSBhbmQgOSIpOworICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZwZGF0YSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCS8qIENvbmZvcm1pbmcgdG8gYnoyIG1hbnVhbCwgdGhpcyBpcyBsYXJnZSBlbm91Z2ggdG8gZml0IGNvbXByZXNzZWQKLQkgKiBkYXRhIGluIG9uZSBzaG90LiBXZSB3aWxsIGNoZWNrIGl0IGxhdGVyIGFueXdheS4gKi8KLQlidWZzaXplID0gZGF0YXNpemUgKyAoZGF0YXNpemUvMTAwKzEpICsgNjAwOworICAgIC8qIENvbmZvcm1pbmcgdG8gYnoyIG1hbnVhbCwgdGhpcyBpcyBsYXJnZSBlbm91Z2ggdG8gZml0IGNvbXByZXNzZWQKKyAgICAgKiBkYXRhIGluIG9uZSBzaG90LiBXZSB3aWxsIGNoZWNrIGl0IGxhdGVyIGFueXdheS4gKi8KKyAgICBidWZzaXplID0gZGF0YXNpemUgKyAoZGF0YXNpemUvMTAwKzEpICsgNjAwOwogCi0JcmV0ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgYnVmc2l6ZSk7Ci0JaWYgKCFyZXQpIHsKLQkJUHlCdWZmZXJfUmVsZWFzZSgmcGRhdGEpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgcmV0ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgYnVmc2l6ZSk7CisgICAgaWYgKCFyZXQpIHsKKyAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmcGRhdGEpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQltZW1zZXQoYnpzLCAwLCBzaXplb2YoYnpfc3RyZWFtKSk7CisgICAgbWVtc2V0KGJ6cywgMCwgc2l6ZW9mKGJ6X3N0cmVhbSkpOwogCi0JYnpzLT5uZXh0X2luID0gZGF0YTsKLQlienMtPmF2YWlsX2luID0gZGF0YXNpemU7Ci0JYnpzLT5uZXh0X291dCA9IEJVRihyZXQpOwotCWJ6cy0+YXZhaWxfb3V0ID0gYnVmc2l6ZTsKKyAgICBienMtPm5leHRfaW4gPSBkYXRhOworICAgIGJ6cy0+YXZhaWxfaW4gPSBkYXRhc2l6ZTsKKyAgICBienMtPm5leHRfb3V0ID0gQlVGKHJldCk7CisgICAgYnpzLT5hdmFpbF9vdXQgPSBidWZzaXplOwogCi0JYnplcnJvciA9IEJaMl9iekNvbXByZXNzSW5pdChienMsIGNvbXByZXNzbGV2ZWwsIDAsIDApOwotCWlmIChiemVycm9yICE9IEJaX09LKSB7Ci0JCVV0aWxfQ2F0Y2hCWjJFcnJvcihiemVycm9yKTsKLQkJUHlCdWZmZXJfUmVsZWFzZSgmcGRhdGEpOwotCQlQeV9ERUNSRUYocmV0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGJ6ZXJyb3IgPSBCWjJfYnpDb21wcmVzc0luaXQoYnpzLCBjb21wcmVzc2xldmVsLCAwLCAwKTsKKyAgICBpZiAoYnplcnJvciAhPSBCWl9PSykgeworICAgICAgICBVdGlsX0NhdGNoQloyRXJyb3IoYnplcnJvcik7CisgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnBkYXRhKTsKKyAgICAgICAgUHlfREVDUkVGKHJldCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWZvciAoOzspIHsKLQkJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCQliemVycm9yID0gQloyX2J6Q29tcHJlc3MoYnpzLCBCWl9GSU5JU0gpOwotCQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCQlpZiAoYnplcnJvciA9PSBCWl9TVFJFQU1fRU5EKSB7Ci0JCQlicmVhazsKLQkJfSBlbHNlIGlmIChiemVycm9yICE9IEJaX0ZJTklTSF9PSykgewotCQkJQloyX2J6Q29tcHJlc3NFbmQoYnpzKTsKLQkJCVV0aWxfQ2F0Y2hCWjJFcnJvcihiemVycm9yKTsKLQkJCVB5QnVmZmVyX1JlbGVhc2UoJnBkYXRhKTsKLQkJCVB5X0RFQ1JFRihyZXQpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJaWYgKGJ6cy0+YXZhaWxfb3V0ID09IDApIHsKLQkJCWJ1ZnNpemUgPSBVdGlsX05ld0J1ZmZlclNpemUoYnVmc2l6ZSk7Ci0JCQlpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmcmV0LCBidWZzaXplKSA8IDApIHsKLQkJCQlCWjJfYnpDb21wcmVzc0VuZChienMpOwotCQkJCVB5QnVmZmVyX1JlbGVhc2UoJnBkYXRhKTsKLQkJCQlQeV9ERUNSRUYocmV0KTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJCWJ6cy0+bmV4dF9vdXQgPSBCVUYocmV0KSArIEJaU19UT1RBTF9PVVQoYnpzKTsKLQkJCWJ6cy0+YXZhaWxfb3V0ID0gYnVmc2l6ZSAtIChienMtPm5leHRfb3V0IC0gQlVGKHJldCkpOwotCQl9Ci0JfQorICAgIGZvciAoOzspIHsKKyAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICBiemVycm9yID0gQloyX2J6Q29tcHJlc3MoYnpzLCBCWl9GSU5JU0gpOworICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgICAgICBpZiAoYnplcnJvciA9PSBCWl9TVFJFQU1fRU5EKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIGlmIChiemVycm9yICE9IEJaX0ZJTklTSF9PSykgeworICAgICAgICAgICAgQloyX2J6Q29tcHJlc3NFbmQoYnpzKTsKKyAgICAgICAgICAgIFV0aWxfQ2F0Y2hCWjJFcnJvcihiemVycm9yKTsKKyAgICAgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnBkYXRhKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihyZXQpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJ6cy0+YXZhaWxfb3V0ID09IDApIHsKKyAgICAgICAgICAgIGJ1ZnNpemUgPSBVdGlsX05ld0J1ZmZlclNpemUoYnVmc2l6ZSk7CisgICAgICAgICAgICBpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmcmV0LCBidWZzaXplKSA8IDApIHsKKyAgICAgICAgICAgICAgICBCWjJfYnpDb21wcmVzc0VuZChienMpOworICAgICAgICAgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnBkYXRhKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYocmV0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ6cy0+bmV4dF9vdXQgPSBCVUYocmV0KSArIEJaU19UT1RBTF9PVVQoYnpzKTsKKyAgICAgICAgICAgIGJ6cy0+YXZhaWxfb3V0ID0gYnVmc2l6ZSAtIChienMtPm5leHRfb3V0IC0gQlVGKHJldCkpOworICAgICAgICB9CisgICAgfQogCi0JaWYgKGJ6cy0+YXZhaWxfb3V0ICE9IDApCi0JCV9QeVN0cmluZ19SZXNpemUoJnJldCwgKFB5X3NzaXplX3QpQlpTX1RPVEFMX09VVChienMpKTsKLQlCWjJfYnpDb21wcmVzc0VuZChienMpOworICAgIGlmIChienMtPmF2YWlsX291dCAhPSAwKQorICAgICAgICBfUHlTdHJpbmdfUmVzaXplKCZyZXQsIChQeV9zc2l6ZV90KUJaU19UT1RBTF9PVVQoYnpzKSk7CisgICAgQloyX2J6Q29tcHJlc3NFbmQoYnpzKTsKIAotCVB5QnVmZmVyX1JlbGVhc2UoJnBkYXRhKTsKLQlyZXR1cm4gcmV0OworICAgIFB5QnVmZmVyX1JlbGVhc2UoJnBkYXRhKTsKKyAgICByZXR1cm4gcmV0OwogfQogCiBQeURvY19TVFJWQVIoYnoyX2RlY29tcHJlc3NfX2RvY19fLApAQCAtMjE1NSw5NCArMjE1NSw5NCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGJ6Ml9kZWNvbXByZXNzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeV9idWZmZXIgcGRhdGE7Ci0JY2hhciAqZGF0YTsKLQlpbnQgZGF0YXNpemU7Ci0JaW50IGJ1ZnNpemUgPSBTTUFMTENIVU5LOwotCVB5T2JqZWN0ICpyZXQ7Ci0JYnpfc3RyZWFtIF9ienM7Ci0JYnpfc3RyZWFtICpienMgPSAmX2J6czsKLQlpbnQgYnplcnJvcjsKKyAgICBQeV9idWZmZXIgcGRhdGE7CisgICAgY2hhciAqZGF0YTsKKyAgICBpbnQgZGF0YXNpemU7CisgICAgaW50IGJ1ZnNpemUgPSBTTUFMTENIVU5LOworICAgIFB5T2JqZWN0ICpyZXQ7CisgICAgYnpfc3RyZWFtIF9ienM7CisgICAgYnpfc3RyZWFtICpienMgPSAmX2J6czsKKyAgICBpbnQgYnplcnJvcjsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyo6ZGVjb21wcmVzcyIsICZwZGF0YSkpCi0JCXJldHVybiBOVUxMOwotCWRhdGEgPSBwZGF0YS5idWY7Ci0JZGF0YXNpemUgPSBwZGF0YS5sZW47CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzKjpkZWNvbXByZXNzIiwgJnBkYXRhKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZGF0YSA9IHBkYXRhLmJ1ZjsKKyAgICBkYXRhc2l6ZSA9IHBkYXRhLmxlbjsKIAotCWlmIChkYXRhc2l6ZSA9PSAwKSB7Ci0JCVB5QnVmZmVyX1JlbGVhc2UoJnBkYXRhKTsKLQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoIiIpOwotCX0KKyAgICBpZiAoZGF0YXNpemUgPT0gMCkgeworICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZwZGF0YSk7CisgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKCIiKTsKKyAgICB9CiAKLQlyZXQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBidWZzaXplKTsKLQlpZiAoIXJldCkgewotCQlQeUJ1ZmZlcl9SZWxlYXNlKCZwZGF0YSk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICByZXQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBidWZzaXplKTsKKyAgICBpZiAoIXJldCkgeworICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZwZGF0YSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCW1lbXNldChienMsIDAsIHNpemVvZihiel9zdHJlYW0pKTsKKyAgICBtZW1zZXQoYnpzLCAwLCBzaXplb2YoYnpfc3RyZWFtKSk7CiAKLQlienMtPm5leHRfaW4gPSBkYXRhOwotCWJ6cy0+YXZhaWxfaW4gPSBkYXRhc2l6ZTsKLQlienMtPm5leHRfb3V0ID0gQlVGKHJldCk7Ci0JYnpzLT5hdmFpbF9vdXQgPSBidWZzaXplOworICAgIGJ6cy0+bmV4dF9pbiA9IGRhdGE7CisgICAgYnpzLT5hdmFpbF9pbiA9IGRhdGFzaXplOworICAgIGJ6cy0+bmV4dF9vdXQgPSBCVUYocmV0KTsKKyAgICBienMtPmF2YWlsX291dCA9IGJ1ZnNpemU7CiAKLQliemVycm9yID0gQloyX2J6RGVjb21wcmVzc0luaXQoYnpzLCAwLCAwKTsKLQlpZiAoYnplcnJvciAhPSBCWl9PSykgewotCQlVdGlsX0NhdGNoQloyRXJyb3IoYnplcnJvcik7Ci0JCVB5X0RFQ1JFRihyZXQpOwotCQlQeUJ1ZmZlcl9SZWxlYXNlKCZwZGF0YSk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBiemVycm9yID0gQloyX2J6RGVjb21wcmVzc0luaXQoYnpzLCAwLCAwKTsKKyAgICBpZiAoYnplcnJvciAhPSBCWl9PSykgeworICAgICAgICBVdGlsX0NhdGNoQloyRXJyb3IoYnplcnJvcik7CisgICAgICAgIFB5X0RFQ1JFRihyZXQpOworICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZwZGF0YSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWZvciAoOzspIHsKLQkJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCQliemVycm9yID0gQloyX2J6RGVjb21wcmVzcyhienMpOwotCQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCQlpZiAoYnplcnJvciA9PSBCWl9TVFJFQU1fRU5EKSB7Ci0JCQlicmVhazsKLQkJfSBlbHNlIGlmIChiemVycm9yICE9IEJaX09LKSB7Ci0JCQlCWjJfYnpEZWNvbXByZXNzRW5kKGJ6cyk7Ci0JCQlVdGlsX0NhdGNoQloyRXJyb3IoYnplcnJvcik7Ci0JCQlQeUJ1ZmZlcl9SZWxlYXNlKCZwZGF0YSk7Ci0JCQlQeV9ERUNSRUYocmV0KTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWlmIChienMtPmF2YWlsX2luID09IDApIHsKLQkJCUJaMl9iekRlY29tcHJlc3NFbmQoYnpzKTsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCQkiY291bGRuJ3QgZmluZCBlbmQgb2Ygc3RyZWFtIik7Ci0JCQlQeUJ1ZmZlcl9SZWxlYXNlKCZwZGF0YSk7Ci0JCQlQeV9ERUNSRUYocmV0KTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWlmIChienMtPmF2YWlsX291dCA9PSAwKSB7Ci0JCQlidWZzaXplID0gVXRpbF9OZXdCdWZmZXJTaXplKGJ1ZnNpemUpOwotCQkJaWYgKF9QeVN0cmluZ19SZXNpemUoJnJldCwgYnVmc2l6ZSkgPCAwKSB7Ci0JCQkJQloyX2J6RGVjb21wcmVzc0VuZChienMpOwotCQkJCVB5QnVmZmVyX1JlbGVhc2UoJnBkYXRhKTsKLQkJCQlQeV9ERUNSRUYocmV0KTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJCWJ6cy0+bmV4dF9vdXQgPSBCVUYocmV0KSArIEJaU19UT1RBTF9PVVQoYnpzKTsKLQkJCWJ6cy0+YXZhaWxfb3V0ID0gYnVmc2l6ZSAtIChienMtPm5leHRfb3V0IC0gQlVGKHJldCkpOwotCQl9Ci0JfQorICAgIGZvciAoOzspIHsKKyAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICBiemVycm9yID0gQloyX2J6RGVjb21wcmVzcyhienMpOworICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgICAgICBpZiAoYnplcnJvciA9PSBCWl9TVFJFQU1fRU5EKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIGlmIChiemVycm9yICE9IEJaX09LKSB7CisgICAgICAgICAgICBCWjJfYnpEZWNvbXByZXNzRW5kKGJ6cyk7CisgICAgICAgICAgICBVdGlsX0NhdGNoQloyRXJyb3IoYnplcnJvcik7CisgICAgICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZwZGF0YSk7CisgICAgICAgICAgICBQeV9ERUNSRUYocmV0KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGlmIChienMtPmF2YWlsX2luID09IDApIHsKKyAgICAgICAgICAgIEJaMl9iekRlY29tcHJlc3NFbmQoYnpzKTsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb3VsZG4ndCBmaW5kIGVuZCBvZiBzdHJlYW0iKTsKKyAgICAgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnBkYXRhKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihyZXQpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJ6cy0+YXZhaWxfb3V0ID09IDApIHsKKyAgICAgICAgICAgIGJ1ZnNpemUgPSBVdGlsX05ld0J1ZmZlclNpemUoYnVmc2l6ZSk7CisgICAgICAgICAgICBpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmcmV0LCBidWZzaXplKSA8IDApIHsKKyAgICAgICAgICAgICAgICBCWjJfYnpEZWNvbXByZXNzRW5kKGJ6cyk7CisgICAgICAgICAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmcGRhdGEpOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihyZXQpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnpzLT5uZXh0X291dCA9IEJVRihyZXQpICsgQlpTX1RPVEFMX09VVChienMpOworICAgICAgICAgICAgYnpzLT5hdmFpbF9vdXQgPSBidWZzaXplIC0gKGJ6cy0+bmV4dF9vdXQgLSBCVUYocmV0KSk7CisgICAgICAgIH0KKyAgICB9CiAKLQlpZiAoYnpzLT5hdmFpbF9vdXQgIT0gMCkKLQkJX1B5U3RyaW5nX1Jlc2l6ZSgmcmV0LCAoUHlfc3NpemVfdClCWlNfVE9UQUxfT1VUKGJ6cykpOwotCUJaMl9iekRlY29tcHJlc3NFbmQoYnpzKTsKLQlQeUJ1ZmZlcl9SZWxlYXNlKCZwZGF0YSk7CisgICAgaWYgKGJ6cy0+YXZhaWxfb3V0ICE9IDApCisgICAgICAgIF9QeVN0cmluZ19SZXNpemUoJnJldCwgKFB5X3NzaXplX3QpQlpTX1RPVEFMX09VVChienMpKTsKKyAgICBCWjJfYnpEZWNvbXByZXNzRW5kKGJ6cyk7CisgICAgUHlCdWZmZXJfUmVsZWFzZSgmcGRhdGEpOwogCi0JcmV0dXJuIHJldDsKKyAgICByZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgYnoyX21ldGhvZHNbXSA9IHsKLQl7ImNvbXByZXNzIiwgKFB5Q0Z1bmN0aW9uKSBiejJfY29tcHJlc3MsIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLAotCQliejJfY29tcHJlc3NfX2RvY19ffSwKLQl7ImRlY29tcHJlc3MiLCAoUHlDRnVuY3Rpb24pIGJ6Ml9kZWNvbXByZXNzLCBNRVRIX1ZBUkFSR1MsCi0JCWJ6Ml9kZWNvbXByZXNzX19kb2NfX30sCi0Je05VTEwsCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7ImNvbXByZXNzIiwgKFB5Q0Z1bmN0aW9uKSBiejJfY29tcHJlc3MsIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLAorICAgICAgICBiejJfY29tcHJlc3NfX2RvY19ffSwKKyAgICB7ImRlY29tcHJlc3MiLCAoUHlDRnVuY3Rpb24pIGJ6Ml9kZWNvbXByZXNzLCBNRVRIX1ZBUkFSR1MsCisgICAgICAgIGJ6Ml9kZWNvbXByZXNzX19kb2NfX30sCisgICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwpAQCAtMjI1OCwyNCArMjI1OCwyNCBAQAogUHlNT0RJTklUX0ZVTkMKIGluaXRiejIodm9pZCkKIHsKLQlQeU9iamVjdCAqbTsKKyAgICBQeU9iamVjdCAqbTsKIAotCVB5X1RZUEUoJkJaMkZpbGVfVHlwZSkgPSAmUHlUeXBlX1R5cGU7Ci0JUHlfVFlQRSgmQloyQ29tcF9UeXBlKSA9ICZQeVR5cGVfVHlwZTsKLQlQeV9UWVBFKCZCWjJEZWNvbXBfVHlwZSkgPSAmUHlUeXBlX1R5cGU7CisgICAgUHlfVFlQRSgmQloyRmlsZV9UeXBlKSA9ICZQeVR5cGVfVHlwZTsKKyAgICBQeV9UWVBFKCZCWjJDb21wX1R5cGUpID0gJlB5VHlwZV9UeXBlOworICAgIFB5X1RZUEUoJkJaMkRlY29tcF9UeXBlKSA9ICZQeVR5cGVfVHlwZTsKIAotCW0gPSBQeV9Jbml0TW9kdWxlMygiYnoyIiwgYnoyX21ldGhvZHMsIGJ6Ml9fZG9jX18pOwotCWlmIChtID09IE5VTEwpCi0JCXJldHVybjsKKyAgICBtID0gUHlfSW5pdE1vZHVsZTMoImJ6MiIsIGJ6Ml9tZXRob2RzLCBiejJfX2RvY19fKTsKKyAgICBpZiAobSA9PSBOVUxMKQorICAgICAgICByZXR1cm47CiAKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIl9fYXV0aG9yX18iLCBQeVN0cmluZ19Gcm9tU3RyaW5nKF9fYXV0aG9yX18pKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIl9fYXV0aG9yX18iLCBQeVN0cmluZ19Gcm9tU3RyaW5nKF9fYXV0aG9yX18pKTsKIAotCVB5X0lOQ1JFRigmQloyRmlsZV9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkJaMkZpbGUiLCAoUHlPYmplY3QgKikmQloyRmlsZV9UeXBlKTsKKyAgICBQeV9JTkNSRUYoJkJaMkZpbGVfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJCWjJGaWxlIiwgKFB5T2JqZWN0ICopJkJaMkZpbGVfVHlwZSk7CiAKLQlQeV9JTkNSRUYoJkJaMkNvbXBfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJCWjJDb21wcmVzc29yIiwgKFB5T2JqZWN0ICopJkJaMkNvbXBfVHlwZSk7CisgICAgUHlfSU5DUkVGKCZCWjJDb21wX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiQloyQ29tcHJlc3NvciIsIChQeU9iamVjdCAqKSZCWjJDb21wX1R5cGUpOwogCi0JUHlfSU5DUkVGKCZCWjJEZWNvbXBfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJCWjJEZWNvbXByZXNzb3IiLCAoUHlPYmplY3QgKikmQloyRGVjb21wX1R5cGUpOworICAgIFB5X0lOQ1JFRigmQloyRGVjb21wX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiQloyRGVjb21wcmVzc29yIiwgKFB5T2JqZWN0ICopJkJaMkRlY29tcF9UeXBlKTsKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvY1BpY2tsZS5jIGIvTW9kdWxlcy9jUGlja2xlLmMKaW5kZXggOTM3MzI5Yi4uZDliZmNlYiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9jUGlja2xlLmMKKysrIGIvTW9kdWxlcy9jUGlja2xlLmMKQEAgLTcyLDcgKzcyLDcgQEAKICNkZWZpbmUgU0VUSVRFTVMgICAgJ3UnCiAKIC8qIFByb3RvY29sIDIuICovCi0jZGVmaW5lIFBST1RPCSAnXHg4MCcgLyogaWRlbnRpZnkgcGlja2xlIHByb3RvY29sICovCisjZGVmaW5lIFBST1RPICAgICdceDgwJyAvKiBpZGVudGlmeSBwaWNrbGUgcHJvdG9jb2wgKi8KICNkZWZpbmUgTkVXT0JKICAgJ1x4ODEnIC8qIGJ1aWxkIG9iamVjdCBieSBhcHBseWluZyBjbHMuX19uZXdfXyB0byBhcmd0dXBsZSAqLwogI2RlZmluZSBFWFQxICAgICAnXHg4MicgLyogcHVzaCBvYmplY3QgZnJvbSBleHRlbnNpb24gcmVnaXN0cnk7IDEtYnl0ZSBpbmRleCAqLwogI2RlZmluZSBFWFQyICAgICAnXHg4MycgLyogZGl0dG8sIGJ1dCAyLWJ5dGUgaW5kZXggKi8KQEAgLTEzMSwzNyArMTMxLDM3IEBACiAgICpfX2dldHN0YXRlX19fc3RyLCAqX19zZXRzdGF0ZV9fX3N0ciwgKl9fbmFtZV9fX3N0ciwgKl9fcmVkdWNlX19fc3RyLAogICAqX19yZWR1Y2VfZXhfX19zdHIsCiAgICp3cml0ZV9zdHIsICphcHBlbmRfc3RyLAotICAqcmVhZF9zdHIsICpyZWFkbGluZV9zdHIsICpfX21haW5fX19zdHIsIAorICAqcmVhZF9zdHIsICpyZWFkbGluZV9zdHIsICpfX21haW5fX19zdHIsCiAgICpkaXNwYXRjaF90YWJsZV9zdHI7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgSW50ZXJuYWwgRGF0YSB0eXBlIGZvciBwaWNrbGUgZGF0YS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewotCVB5T2JqZWN0X0hFQUQKLQlpbnQgbGVuZ3RoOwkvKiBudW1iZXIgb2YgaW5pdGlhbCBzbG90cyBpbiBkYXRhIGN1cnJlbnRseSB1c2VkICovCi0JaW50IHNpemU7CS8qIG51bWJlciBvZiBzbG90cyBpbiBkYXRhIGFsbG9jYXRlZCAqLwotCVB5T2JqZWN0ICoqZGF0YTsKKyAgICBQeU9iamVjdF9IRUFECisgICAgaW50IGxlbmd0aDsgICAgICAgICAvKiBudW1iZXIgb2YgaW5pdGlhbCBzbG90cyBpbiBkYXRhIGN1cnJlbnRseSB1c2VkICovCisgICAgaW50IHNpemU7ICAgICAgICAgICAvKiBudW1iZXIgb2Ygc2xvdHMgaW4gZGF0YSBhbGxvY2F0ZWQgKi8KKyAgICBQeU9iamVjdCAqKmRhdGE7CiB9IFBkYXRhOwogCiBzdGF0aWMgdm9pZAogUGRhdGFfZGVhbGxvYyhQZGF0YSAqc2VsZikKIHsKLQlpbnQgaTsKLQlQeU9iamVjdCAqKnA7CisgICAgaW50IGk7CisgICAgUHlPYmplY3QgKipwOwogCi0JZm9yIChpID0gc2VsZi0+bGVuZ3RoLCBwID0gc2VsZi0+ZGF0YTsgLS1pID49IDA7IHArKykgewotCQlQeV9ERUNSRUYoKnApOwotCX0KLQlpZiAoc2VsZi0+ZGF0YSkKLQkJZnJlZShzZWxmLT5kYXRhKTsKLQlQeU9iamVjdF9EZWwoc2VsZik7CisgICAgZm9yIChpID0gc2VsZi0+bGVuZ3RoLCBwID0gc2VsZi0+ZGF0YTsgLS1pID49IDA7IHArKykgeworICAgICAgICBQeV9ERUNSRUYoKnApOworICAgIH0KKyAgICBpZiAoc2VsZi0+ZGF0YSkKKyAgICAgICAgZnJlZShzZWxmLT5kYXRhKTsKKyAgICBQeU9iamVjdF9EZWwoc2VsZik7CiB9CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgUGRhdGFUeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKSAiY1BpY2tsZS5QZGF0YSIsIHNpemVvZihQZGF0YSksIDAsCi0JKGRlc3RydWN0b3IpUGRhdGFfZGVhbGxvYywKLQkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwTCwwTCwwTCwwTCwgIiIKKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkgImNQaWNrbGUuUGRhdGEiLCBzaXplb2YoUGRhdGEpLCAwLAorICAgIChkZXN0cnVjdG9yKVBkYXRhX2RlYWxsb2MsCisgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMEwsMEwsMEwsMEwsICIiCiB9OwogCiAjZGVmaW5lIFBkYXRhX0NoZWNrKE8pIChQeV9UWVBFKE8pID09ICZQZGF0YVR5cGUpCkBAIC0xNjksMjQgKzE2OSwyNCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIFBkYXRhX05ldyh2b2lkKQogewotCVBkYXRhICpzZWxmOworICAgIFBkYXRhICpzZWxmOwogCi0JaWYgKCEoc2VsZiA9IFB5T2JqZWN0X05ldyhQZGF0YSwgJlBkYXRhVHlwZSkpKQotCQlyZXR1cm4gTlVMTDsKLQlzZWxmLT5zaXplID0gODsKLQlzZWxmLT5sZW5ndGggPSAwOwotCXNlbGYtPmRhdGEgPSBtYWxsb2Moc2VsZi0+c2l6ZSAqIHNpemVvZihQeU9iamVjdCopKTsKLQlpZiAoc2VsZi0+ZGF0YSkKLQkJcmV0dXJuIChQeU9iamVjdCopc2VsZjsKLQlQeV9ERUNSRUYoc2VsZik7Ci0JcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgaWYgKCEoc2VsZiA9IFB5T2JqZWN0X05ldyhQZGF0YSwgJlBkYXRhVHlwZSkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBzZWxmLT5zaXplID0gODsKKyAgICBzZWxmLT5sZW5ndGggPSAwOworICAgIHNlbGYtPmRhdGEgPSBtYWxsb2Moc2VsZi0+c2l6ZSAqIHNpemVvZihQeU9iamVjdCopKTsKKyAgICBpZiAoc2VsZi0+ZGF0YSkKKyAgICAgICAgcmV0dXJuIChQeU9iamVjdCopc2VsZjsKKyAgICBQeV9ERUNSRUYoc2VsZik7CisgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CiB9CiAKIHN0YXRpYyBpbnQKIHN0YWNrVW5kZXJmbG93KHZvaWQpCiB7Ci0JUHlFcnJfU2V0U3RyaW5nKFVucGlja2xpbmdFcnJvciwgInVucGlja2xpbmcgc3RhY2sgdW5kZXJmbG93Iik7Ci0JcmV0dXJuIC0xOworICAgIFB5RXJyX1NldFN0cmluZyhVbnBpY2tsaW5nRXJyb3IsICJ1bnBpY2tsaW5nIHN0YWNrIHVuZGVyZmxvdyIpOworICAgIHJldHVybiAtMTsKIH0KIAogLyogUmV0YWluIG9ubHkgdGhlIGluaXRpYWwgY2xlYXJ0byBpdGVtcy4gIElmIGNsZWFydG8gPj0gdGhlIGN1cnJlbnQKQEAgLTE5NSw2MCArMTk1LDYwIEBACiBzdGF0aWMgaW50CiBQZGF0YV9jbGVhcihQZGF0YSAqc2VsZiwgaW50IGNsZWFydG8pCiB7Ci0JaW50IGk7Ci0JUHlPYmplY3QgKipwOworICAgIGludCBpOworICAgIFB5T2JqZWN0ICoqcDsKIAotCWlmIChjbGVhcnRvIDwgMCkgcmV0dXJuIHN0YWNrVW5kZXJmbG93KCk7Ci0JaWYgKGNsZWFydG8gPj0gc2VsZi0+bGVuZ3RoKSByZXR1cm4gMDsKKyAgICBpZiAoY2xlYXJ0byA8IDApIHJldHVybiBzdGFja1VuZGVyZmxvdygpOworICAgIGlmIChjbGVhcnRvID49IHNlbGYtPmxlbmd0aCkgcmV0dXJuIDA7CiAKLQlmb3IgKGkgPSBzZWxmLT5sZW5ndGgsIHAgPSBzZWxmLT5kYXRhICsgY2xlYXJ0bzsKLQkgICAgIC0taSA+PSBjbGVhcnRvOwotCSAgICAgcCsrKSB7Ci0JCVB5X0NMRUFSKCpwKTsKLQl9Ci0Jc2VsZi0+bGVuZ3RoID0gY2xlYXJ0bzsKKyAgICBmb3IgKGkgPSBzZWxmLT5sZW5ndGgsIHAgPSBzZWxmLT5kYXRhICsgY2xlYXJ0bzsKKyAgICAgICAgIC0taSA+PSBjbGVhcnRvOworICAgICAgICAgcCsrKSB7CisgICAgICAgIFB5X0NMRUFSKCpwKTsKKyAgICB9CisgICAgc2VsZi0+bGVuZ3RoID0gY2xlYXJ0bzsKIAotCXJldHVybiAwOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBQZGF0YV9ncm93KFBkYXRhICpzZWxmKQogewotCWludCBiaWdnZXI7Ci0Jc2l6ZV90IG5ieXRlczsKLQlQeU9iamVjdCAqKnRtcDsKKyAgICBpbnQgYmlnZ2VyOworICAgIHNpemVfdCBuYnl0ZXM7CisgICAgUHlPYmplY3QgKip0bXA7CiAKLQliaWdnZXIgPSBzZWxmLT5zaXplIDw8IDE7Ci0JaWYgKGJpZ2dlciA8PSAwKQkvKiB3YXMgMCwgb3IgbmV3IHZhbHVlIG92ZXJmbG93cyAqLwotCQlnb3RvIG5vbWVtb3J5OwotCWlmICgoaW50KShzaXplX3QpYmlnZ2VyICE9IGJpZ2dlcikKLQkJZ290byBub21lbW9yeTsKLQluYnl0ZXMgPSAoc2l6ZV90KWJpZ2dlciAqIHNpemVvZihQeU9iamVjdCAqKTsKLQlpZiAobmJ5dGVzIC8gc2l6ZW9mKFB5T2JqZWN0ICopICE9IChzaXplX3QpYmlnZ2VyKQotCQlnb3RvIG5vbWVtb3J5OwotCXRtcCA9IHJlYWxsb2Moc2VsZi0+ZGF0YSwgbmJ5dGVzKTsKLQlpZiAodG1wID09IE5VTEwpCi0JCWdvdG8gbm9tZW1vcnk7Ci0Jc2VsZi0+ZGF0YSA9IHRtcDsKLQlzZWxmLT5zaXplID0gYmlnZ2VyOwotCXJldHVybiAwOworICAgIGJpZ2dlciA9IHNlbGYtPnNpemUgPDwgMTsKKyAgICBpZiAoYmlnZ2VyIDw9IDApICAgICAgICAgICAgLyogd2FzIDAsIG9yIG5ldyB2YWx1ZSBvdmVyZmxvd3MgKi8KKyAgICAgICAgZ290byBub21lbW9yeTsKKyAgICBpZiAoKGludCkoc2l6ZV90KWJpZ2dlciAhPSBiaWdnZXIpCisgICAgICAgIGdvdG8gbm9tZW1vcnk7CisgICAgbmJ5dGVzID0gKHNpemVfdCliaWdnZXIgKiBzaXplb2YoUHlPYmplY3QgKik7CisgICAgaWYgKG5ieXRlcyAvIHNpemVvZihQeU9iamVjdCAqKSAhPSAoc2l6ZV90KWJpZ2dlcikKKyAgICAgICAgZ290byBub21lbW9yeTsKKyAgICB0bXAgPSByZWFsbG9jKHNlbGYtPmRhdGEsIG5ieXRlcyk7CisgICAgaWYgKHRtcCA9PSBOVUxMKQorICAgICAgICBnb3RvIG5vbWVtb3J5OworICAgIHNlbGYtPmRhdGEgPSB0bXA7CisgICAgc2VsZi0+c2l6ZSA9IGJpZ2dlcjsKKyAgICByZXR1cm4gMDsKIAogICBub21lbW9yeToKLQlQeUVycl9Ob01lbW9yeSgpOwotCXJldHVybiAtMTsKKyAgICBQeUVycl9Ob01lbW9yeSgpOworICAgIHJldHVybiAtMTsKIH0KIAogLyogRCBpcyBhIFBkYXRhKi4gIFBvcCB0aGUgdG9wbW9zdCBlbGVtZW50IGFuZCBzdG9yZSBpdCBpbnRvIFYsIHdoaWNoCiAgKiBtdXN0IGJlIGFuIGx2YWx1ZSBob2xkaW5nIFB5T2JqZWN0Ki4gIE9uIHN0YWNrIHVuZGVyZmxvdywgVW5waWNrbGluZ0Vycm9yCiAgKiBpcyByYWlzZWQgYW5kIFYgaXMgc2V0IHRvIE5VTEwuICBEIGFuZCBWIG1heSBiZSBldmFsdWF0ZWQgc2V2ZXJhbCB0aW1lcy4KICAqLwotI2RlZmluZSBQREFUQV9QT1AoRCwgVikgewkJCQkJXAotCWlmICgoRCktPmxlbmd0aCkJCQkJCVwKLQkJKFYpID0gKEQpLT5kYXRhWy0tKChEKS0+bGVuZ3RoKV07CQlcCi0JZWxzZSB7CQkJCQkJCVwKLQkJUHlFcnJfU2V0U3RyaW5nKFVucGlja2xpbmdFcnJvciwgImJhZCBwaWNrbGUgZGF0YSIpOwlcCi0JCShWKSA9IE5VTEw7CQkJCQlcCi0JfQkJCQkJCQlcCisjZGVmaW5lIFBEQVRBX1BPUChELCBWKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICgoRCktPmxlbmd0aCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKFYpID0gKEQpLT5kYXRhWy0tKChEKS0+bGVuZ3RoKV07ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBQeUVycl9TZXRTdHJpbmcoVW5waWNrbGluZ0Vycm9yLCAiYmFkIHBpY2tsZSBkYXRhIik7ICAgICAgICAgICAgXAorICAgICAgICAoVikgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiB9CiAKIC8qIFBEQVRBX1BVU0ggYW5kIFBEQVRBX0FQUEVORCBib3RoIHB1c2ggcnZhbHVlIFB5T2JqZWN0KiBPIG9uIHRvIFBkYXRhKgpAQCAtMjYwLDU1ICsyNjAsNTUgQEAKICAqLwogCiAvKiBQdXNoIE8gb24gc3RhY2sgRCwgZ2l2aW5nIG93bmVyc2hpcCBvZiBPIHRvIHRoZSBzdGFjay4gKi8KLSNkZWZpbmUgUERBVEFfUFVTSChELCBPLCBFUikgewkJCQkJXAotCWlmICgoKFBkYXRhKikoRCkpLT5sZW5ndGggPT0gKChQZGF0YSopKEQpKS0+c2l6ZSAmJglcCi0JICAgIFBkYXRhX2dyb3coKFBkYXRhKikoRCkpIDwgMCkgewkJCVwKLQkJUHlfREVDUkVGKE8pOwkJCQkJXAotCQlyZXR1cm4gRVI7CQkJCQlcCi0JfQkJCQkJCQlcCi0JKChQZGF0YSopKEQpKS0+ZGF0YVsoKFBkYXRhKikoRCkpLT5sZW5ndGgrK10gPSAoTyk7CVwKKyNkZWZpbmUgUERBVEFfUFVTSChELCBPLCBFUikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCgoUGRhdGEqKShEKSktPmxlbmd0aCA9PSAoKFBkYXRhKikoRCkpLT5zaXplICYmICAgICAgICAgXAorICAgICAgICBQZGF0YV9ncm93KChQZGF0YSopKEQpKSA8IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgUHlfREVDUkVGKE8pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiBFUjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKFBkYXRhKikoRCkpLT5kYXRhWygoUGRhdGEqKShEKSktPmxlbmd0aCsrXSA9IChPKTsgICAgICAgICBcCiB9CiAKIC8qIFB1c2ggTyBvbiBzdGFjayBELCBwdXNoaW5nIGEgbmV3IHJlZmVyZW5jZS4gKi8KLSNkZWZpbmUgUERBVEFfQVBQRU5EKEQsIE8sIEVSKSB7CQkJCVwKLQlpZiAoKChQZGF0YSopKEQpKS0+bGVuZ3RoID09ICgoUGRhdGEqKShEKSktPnNpemUgJiYJXAotCSAgICBQZGF0YV9ncm93KChQZGF0YSopKEQpKSA8IDApCQkJXAotCQlyZXR1cm4gRVI7CQkJCQlcCi0JUHlfSU5DUkVGKE8pOwkJCQkJCVwKLQkoKFBkYXRhKikoRCkpLT5kYXRhWygoUGRhdGEqKShEKSktPmxlbmd0aCsrXSA9IChPKTsJXAorI2RlZmluZSBQREFUQV9BUFBFTkQoRCwgTywgRVIpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoKChQZGF0YSopKEQpKS0+bGVuZ3RoID09ICgoUGRhdGEqKShEKSktPnNpemUgJiYgICAgICAgICBcCisgICAgICAgIFBkYXRhX2dyb3coKFBkYXRhKikoRCkpIDwgMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXR1cm4gRVI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBQeV9JTkNSRUYoTyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKChQZGF0YSopKEQpKS0+ZGF0YVsoKFBkYXRhKikoRCkpLT5sZW5ndGgrK10gPSAoTyk7ICAgICAgICAgXAogfQogCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBQZGF0YV9wb3BUdXBsZShQZGF0YSAqc2VsZiwgaW50IHN0YXJ0KQogewotCVB5T2JqZWN0ICpyOwotCWludCBpLCBqLCBsOworICAgIFB5T2JqZWN0ICpyOworICAgIGludCBpLCBqLCBsOwogCi0JbCA9IHNlbGYtPmxlbmd0aC1zdGFydDsKLQlyID0gUHlUdXBsZV9OZXcobCk7Ci0JaWYgKHIgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JZm9yIChpID0gc3RhcnQsIGogPSAwIDsgaiA8IGw7IGkrKywgaisrKQotCQlQeVR1cGxlX1NFVF9JVEVNKHIsIGosIHNlbGYtPmRhdGFbaV0pOworICAgIGwgPSBzZWxmLT5sZW5ndGgtc3RhcnQ7CisgICAgciA9IFB5VHVwbGVfTmV3KGwpOworICAgIGlmIChyID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGZvciAoaSA9IHN0YXJ0LCBqID0gMCA7IGogPCBsOyBpKyssIGorKykKKyAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShyLCBqLCBzZWxmLT5kYXRhW2ldKTsKIAotCXNlbGYtPmxlbmd0aCA9IHN0YXJ0OwotCXJldHVybiByOworICAgIHNlbGYtPmxlbmd0aCA9IHN0YXJ0OworICAgIHJldHVybiByOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogUGRhdGFfcG9wTGlzdChQZGF0YSAqc2VsZiwgaW50IHN0YXJ0KQogewotCVB5T2JqZWN0ICpyOwotCWludCBpLCBqLCBsOworICAgIFB5T2JqZWN0ICpyOworICAgIGludCBpLCBqLCBsOwogCi0JbD1zZWxmLT5sZW5ndGgtc3RhcnQ7Ci0JaWYgKCEoIHI9UHlMaXN0X05ldyhsKSkpICByZXR1cm4gTlVMTDsKLQlmb3IgKGk9c3RhcnQsIGo9MCA7IGogPCBsOyBpKyssIGorKykKLQkJUHlMaXN0X1NFVF9JVEVNKHIsIGosIHNlbGYtPmRhdGFbaV0pOworICAgIGw9c2VsZi0+bGVuZ3RoLXN0YXJ0OworICAgIGlmICghKCByPVB5TGlzdF9OZXcobCkpKSAgcmV0dXJuIE5VTEw7CisgICAgZm9yIChpPXN0YXJ0LCBqPTAgOyBqIDwgbDsgaSsrLCBqKyspCisgICAgICAgIFB5TGlzdF9TRVRfSVRFTShyLCBqLCBzZWxmLT5kYXRhW2ldKTsKIAotCXNlbGYtPmxlbmd0aD1zdGFydDsKLQlyZXR1cm4gcjsKKyAgICBzZWxmLT5sZW5ndGg9c3RhcnQ7CisgICAgcmV0dXJuIHI7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMzMxLDI4ICszMzEsMjggQEAKICAgfQogCiB0eXBlZGVmIHN0cnVjdCBQaWNrbGVyb2JqZWN0IHsKLQlQeU9iamVjdF9IRUFECi0JRklMRSAqZnA7Ci0JUHlPYmplY3QgKndyaXRlOwotCVB5T2JqZWN0ICpmaWxlOwotCVB5T2JqZWN0ICptZW1vOwotCVB5T2JqZWN0ICphcmc7Ci0JUHlPYmplY3QgKnBlcnNfZnVuYzsKLQlQeU9iamVjdCAqaW5zdF9wZXJzX2Z1bmM7CisgICAgUHlPYmplY3RfSEVBRAorICAgIEZJTEUgKmZwOworICAgIFB5T2JqZWN0ICp3cml0ZTsKKyAgICBQeU9iamVjdCAqZmlsZTsKKyAgICBQeU9iamVjdCAqbWVtbzsKKyAgICBQeU9iamVjdCAqYXJnOworICAgIFB5T2JqZWN0ICpwZXJzX2Z1bmM7CisgICAgUHlPYmplY3QgKmluc3RfcGVyc19mdW5jOwogCi0JLyogcGlja2xlIHByb3RvY29sIG51bWJlciwgPj0gMCAqLwotCWludCBwcm90bzsKKyAgICAvKiBwaWNrbGUgcHJvdG9jb2wgbnVtYmVyLCA+PSAwICovCisgICAgaW50IHByb3RvOwogCi0JLyogYm9vbCwgdHJ1ZSBpZiBwcm90byA+IDAgKi8KLQlpbnQgYmluOworICAgIC8qIGJvb2wsIHRydWUgaWYgcHJvdG8gPiAwICovCisgICAgaW50IGJpbjsKIAotCWludCBmYXN0OyAvKiBGYXN0IG1vZGUgZG9lc24ndCBzYXZlIGluIG1lbW8sIGRvbid0IHVzZSBpZiBjaXJjIHJlZiAqLwotCWludCAoKndyaXRlX2Z1bmMpKHN0cnVjdCBQaWNrbGVyb2JqZWN0ICosIGNvbnN0IGNoYXIgKiwgUHlfc3NpemVfdCk7Ci0JY2hhciAqd3JpdGVfYnVmOwotCWludCBidWZfc2l6ZTsKLQlQeU9iamVjdCAqZGlzcGF0Y2hfdGFibGU7Ci0JaW50IGZhc3RfY29udGFpbmVyOyAvKiBjb3VudCBuZXN0ZWQgY29udGFpbmVyIGR1bXBzICovCi0JUHlPYmplY3QgKmZhc3RfbWVtbzsKKyAgICBpbnQgZmFzdDsgLyogRmFzdCBtb2RlIGRvZXNuJ3Qgc2F2ZSBpbiBtZW1vLCBkb24ndCB1c2UgaWYgY2lyYyByZWYgKi8KKyAgICBpbnQgKCp3cml0ZV9mdW5jKShzdHJ1Y3QgUGlja2xlcm9iamVjdCAqLCBjb25zdCBjaGFyICosIFB5X3NzaXplX3QpOworICAgIGNoYXIgKndyaXRlX2J1ZjsKKyAgICBpbnQgYnVmX3NpemU7CisgICAgUHlPYmplY3QgKmRpc3BhdGNoX3RhYmxlOworICAgIGludCBmYXN0X2NvbnRhaW5lcjsgLyogY291bnQgbmVzdGVkIGNvbnRhaW5lciBkdW1wcyAqLworICAgIFB5T2JqZWN0ICpmYXN0X21lbW87CiB9IFBpY2tsZXJvYmplY3Q7CiAKICNpZm5kZWYgUFlfQ1BJQ0tMRV9GQVNUX0xJTUlUCkBAIC0zNjIsMjUgKzM2MiwyNSBAQAogc3RhdGljIFB5VHlwZU9iamVjdCBQaWNrbGVydHlwZTsKIAogdHlwZWRlZiBzdHJ1Y3QgVW5waWNrbGVyb2JqZWN0IHsKLQlQeU9iamVjdF9IRUFECi0JRklMRSAqZnA7Ci0JUHlPYmplY3QgKmZpbGU7Ci0JUHlPYmplY3QgKnJlYWRsaW5lOwotCVB5T2JqZWN0ICpyZWFkOwotCVB5T2JqZWN0ICptZW1vOwotCVB5T2JqZWN0ICphcmc7Ci0JUGRhdGEgKnN0YWNrOwotCVB5T2JqZWN0ICptYXJrOwotCVB5T2JqZWN0ICpwZXJzX2Z1bmM7Ci0JUHlPYmplY3QgKmxhc3Rfc3RyaW5nOwotCWludCAqbWFya3M7Ci0JaW50IG51bV9tYXJrczsKLQlpbnQgbWFya3Nfc2l6ZTsKLQlQeV9zc2l6ZV90ICgqcmVhZF9mdW5jKShzdHJ1Y3QgVW5waWNrbGVyb2JqZWN0ICosIGNoYXIgKiosIFB5X3NzaXplX3QpOwotCVB5X3NzaXplX3QgKCpyZWFkbGluZV9mdW5jKShzdHJ1Y3QgVW5waWNrbGVyb2JqZWN0ICosIGNoYXIgKiopOwotCWludCBidWZfc2l6ZTsKLQljaGFyICpidWY7Ci0JUHlPYmplY3QgKmZpbmRfY2xhc3M7CisgICAgUHlPYmplY3RfSEVBRAorICAgIEZJTEUgKmZwOworICAgIFB5T2JqZWN0ICpmaWxlOworICAgIFB5T2JqZWN0ICpyZWFkbGluZTsKKyAgICBQeU9iamVjdCAqcmVhZDsKKyAgICBQeU9iamVjdCAqbWVtbzsKKyAgICBQeU9iamVjdCAqYXJnOworICAgIFBkYXRhICpzdGFjazsKKyAgICBQeU9iamVjdCAqbWFyazsKKyAgICBQeU9iamVjdCAqcGVyc19mdW5jOworICAgIFB5T2JqZWN0ICpsYXN0X3N0cmluZzsKKyAgICBpbnQgKm1hcmtzOworICAgIGludCBudW1fbWFya3M7CisgICAgaW50IG1hcmtzX3NpemU7CisgICAgUHlfc3NpemVfdCAoKnJlYWRfZnVuYykoc3RydWN0IFVucGlja2xlcm9iamVjdCAqLCBjaGFyICoqLCBQeV9zc2l6ZV90KTsKKyAgICBQeV9zc2l6ZV90ICgqcmVhZGxpbmVfZnVuYykoc3RydWN0IFVucGlja2xlcm9iamVjdCAqLCBjaGFyICoqKTsKKyAgICBpbnQgYnVmX3NpemU7CisgICAgY2hhciAqYnVmOworICAgIFB5T2JqZWN0ICpmaW5kX2NsYXNzOwogfSBVbnBpY2tsZXJvYmplY3Q7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgVW5waWNrbGVydHlwZTsKQEAgLTM5MywzMDYgKzM5MywzMDYgQEAKIFB5T2JqZWN0ICoKIGNQaWNrbGVfRXJyRm9ybWF0KFB5T2JqZWN0ICpFcnJUeXBlLCBjaGFyICpzdHJpbmdmb3JtYXQsIGNoYXIgKmZvcm1hdCwgLi4uKQogewotCXZhX2xpc3QgdmE7Ci0JUHlPYmplY3QgKmFyZ3M9MCwgKnJldHZhbD0wOwotCXZhX3N0YXJ0KHZhLCBmb3JtYXQpOworICAgIHZhX2xpc3QgdmE7CisgICAgUHlPYmplY3QgKmFyZ3M9MCwgKnJldHZhbD0wOworICAgIHZhX3N0YXJ0KHZhLCBmb3JtYXQpOwogCi0JaWYgKGZvcm1hdCkgYXJncyA9IFB5X1ZhQnVpbGRWYWx1ZShmb3JtYXQsIHZhKTsKLQl2YV9lbmQodmEpOwotCWlmIChmb3JtYXQgJiYgISBhcmdzKSByZXR1cm4gTlVMTDsKLQlpZiAoc3RyaW5nZm9ybWF0ICYmICEocmV0dmFsPVB5U3RyaW5nX0Zyb21TdHJpbmcoc3RyaW5nZm9ybWF0KSkpCi0JCXJldHVybiBOVUxMOworICAgIGlmIChmb3JtYXQpIGFyZ3MgPSBQeV9WYUJ1aWxkVmFsdWUoZm9ybWF0LCB2YSk7CisgICAgdmFfZW5kKHZhKTsKKyAgICBpZiAoZm9ybWF0ICYmICEgYXJncykgcmV0dXJuIE5VTEw7CisgICAgaWYgKHN0cmluZ2Zvcm1hdCAmJiAhKHJldHZhbD1QeVN0cmluZ19Gcm9tU3RyaW5nKHN0cmluZ2Zvcm1hdCkpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChyZXR2YWwpIHsKLQkJaWYgKGFyZ3MpIHsKLQkJCVB5T2JqZWN0ICp2OwotCQkJdj1QeVN0cmluZ19Gb3JtYXQocmV0dmFsLCBhcmdzKTsKLQkJCVB5X0RFQ1JFRihyZXR2YWwpOwotCQkJUHlfREVDUkVGKGFyZ3MpOwotCQkJaWYgKCEgdikgcmV0dXJuIE5VTEw7Ci0JCQlyZXR2YWw9djsKLQkJfQotCX0KLQllbHNlCi0JCWlmIChhcmdzKSByZXR2YWw9YXJnczsKLQkJZWxzZSB7Ci0JCQlQeUVycl9TZXRPYmplY3QoRXJyVHlwZSxQeV9Ob25lKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JUHlFcnJfU2V0T2JqZWN0KEVyclR5cGUscmV0dmFsKTsKLQlQeV9ERUNSRUYocmV0dmFsKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBpZiAocmV0dmFsKSB7CisgICAgICAgIGlmIChhcmdzKSB7CisgICAgICAgICAgICBQeU9iamVjdCAqdjsKKyAgICAgICAgICAgIHY9UHlTdHJpbmdfRm9ybWF0KHJldHZhbCwgYXJncyk7CisgICAgICAgICAgICBQeV9ERUNSRUYocmV0dmFsKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihhcmdzKTsKKyAgICAgICAgICAgIGlmICghIHYpIHJldHVybiBOVUxMOworICAgICAgICAgICAgcmV0dmFsPXY7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgICAgICBpZiAoYXJncykgcmV0dmFsPWFyZ3M7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgUHlFcnJfU2V0T2JqZWN0KEVyclR5cGUsUHlfTm9uZSk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIFB5RXJyX1NldE9iamVjdChFcnJUeXBlLHJldHZhbCk7CisgICAgUHlfREVDUkVGKHJldHZhbCk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBpbnQKIHdyaXRlX2ZpbGUoUGlja2xlcm9iamVjdCAqc2VsZiwgY29uc3QgY2hhciAqcywgUHlfc3NpemVfdCAgbikKIHsKLQlzaXplX3QgbmJ5dGVzd3JpdHRlbjsKKyAgICBzaXplX3QgbmJ5dGVzd3JpdHRlbjsKIAotCWlmIChzID09IE5VTEwpIHsKLQkJcmV0dXJuIDA7Ci0JfQorICAgIGlmIChzID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCi0JaWYgKG4gPiBJTlRfTUFYKSB7Ci0JCS8qIFN0cmluZyB0b28gbGFyZ2UgKi8KLQkJcmV0dXJuIC0xOwotCX0KKyAgICBpZiAobiA+IElOVF9NQVgpIHsKKyAgICAgICAgLyogU3RyaW5nIHRvbyBsYXJnZSAqLworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JUHlGaWxlX0luY1VzZUNvdW50KChQeUZpbGVPYmplY3QgKilzZWxmLT5maWxlKTsKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JbmJ5dGVzd3JpdHRlbiA9IGZ3cml0ZShzLCBzaXplb2YoY2hhciksIG4sIHNlbGYtPmZwKTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCVB5RmlsZV9EZWNVc2VDb3VudCgoUHlGaWxlT2JqZWN0ICopc2VsZi0+ZmlsZSk7Ci0JaWYgKG5ieXRlc3dyaXR0ZW4gIT0gKHNpemVfdCluKSB7Ci0JCVB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICBQeUZpbGVfSW5jVXNlQ291bnQoKFB5RmlsZU9iamVjdCAqKXNlbGYtPmZpbGUpOworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICBuYnl0ZXN3cml0dGVuID0gZndyaXRlKHMsIHNpemVvZihjaGFyKSwgbiwgc2VsZi0+ZnApOworICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgUHlGaWxlX0RlY1VzZUNvdW50KChQeUZpbGVPYmplY3QgKilzZWxmLT5maWxlKTsKKyAgICBpZiAobmJ5dGVzd3JpdHRlbiAhPSAoc2l6ZV90KW4pIHsKKyAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JcmV0dXJuIChpbnQpbjsKKyAgICByZXR1cm4gKGludCluOwogfQogCiBzdGF0aWMgaW50CiB3cml0ZV9jU3RyaW5nSU8oUGlja2xlcm9iamVjdCAqc2VsZiwgY29uc3QgY2hhciAqcywgUHlfc3NpemVfdCAgbikKIHsKLQlpZiAocyA9PSBOVUxMKSB7Ci0JCXJldHVybiAwOwotCX0KKyAgICBpZiAocyA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KIAotCWlmIChQeWNTdHJpbmdJTy0+Y3dyaXRlKChQeU9iamVjdCAqKXNlbGYtPmZpbGUsIHMsIG4pICE9IG4pIHsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICBpZiAoUHljU3RyaW5nSU8tPmN3cml0ZSgoUHlPYmplY3QgKilzZWxmLT5maWxlLCBzLCBuKSAhPSBuKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQlyZXR1cm4gKGludCluOworICAgIHJldHVybiAoaW50KW47CiB9CiAKIHN0YXRpYyBpbnQKIHdyaXRlX25vbmUoUGlja2xlcm9iamVjdCAqc2VsZiwgY29uc3QgY2hhciAqcywgUHlfc3NpemVfdCAgbikKIHsKLQlpZiAocyA9PSBOVUxMKSByZXR1cm4gMDsKLQlpZiAobiA+IElOVF9NQVgpIHJldHVybiAtMTsKLQlyZXR1cm4gKGludCluOworICAgIGlmIChzID09IE5VTEwpIHJldHVybiAwOworICAgIGlmIChuID4gSU5UX01BWCkgcmV0dXJuIC0xOworICAgIHJldHVybiAoaW50KW47CiB9CiAKIHN0YXRpYyBpbnQKIHdyaXRlX290aGVyKFBpY2tsZXJvYmplY3QgKnNlbGYsIGNvbnN0IGNoYXIgKnMsIFB5X3NzaXplX3QgIF9uKQogewotCVB5T2JqZWN0ICpweV9zdHIgPSAwLCAqanVuayA9IDA7Ci0JaW50IG47CisgICAgUHlPYmplY3QgKnB5X3N0ciA9IDAsICpqdW5rID0gMDsKKyAgICBpbnQgbjsKIAotCWlmIChfbiA+IElOVF9NQVgpCi0JCXJldHVybiAtMTsKLQluID0gKGludClfbjsKLQlpZiAocyA9PSBOVUxMKSB7Ci0JCWlmICghKCBzZWxmLT5idWZfc2l6ZSApKSAgcmV0dXJuIDA7Ci0JCXB5X3N0ciA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHNlbGYtPndyaXRlX2J1ZiwKLQkJCQkJCSAgICBzZWxmLT5idWZfc2l6ZSk7Ci0JCWlmICghcHlfc3RyKQotCQkJcmV0dXJuIC0xOwotCX0KLQllbHNlIHsKLQkJaWYgKHNlbGYtPmJ1Zl9zaXplICYmIChuICsgc2VsZi0+YnVmX3NpemUpID4gV1JJVEVfQlVGX1NJWkUpIHsKLQkJCWlmICh3cml0ZV9vdGhlcihzZWxmLCBOVUxMLCAwKSA8IDApCi0JCQkJcmV0dXJuIC0xOwotCQl9CisgICAgaWYgKF9uID4gSU5UX01BWCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIG4gPSAoaW50KV9uOworICAgIGlmIChzID09IE5VTEwpIHsKKyAgICAgICAgaWYgKCEoIHNlbGYtPmJ1Zl9zaXplICkpICByZXR1cm4gMDsKKyAgICAgICAgcHlfc3RyID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoc2VsZi0+d3JpdGVfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5idWZfc2l6ZSk7CisgICAgICAgIGlmICghcHlfc3RyKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKHNlbGYtPmJ1Zl9zaXplICYmIChuICsgc2VsZi0+YnVmX3NpemUpID4gV1JJVEVfQlVGX1NJWkUpIHsKKyAgICAgICAgICAgIGlmICh3cml0ZV9vdGhlcihzZWxmLCBOVUxMLCAwKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CiAKLQkJaWYgKG4gPiBXUklURV9CVUZfU0laRSkgewotCQkJaWYgKCEoIHB5X3N0ciA9Ci0JCQkgICAgICAgUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocywgbikpKQotCQkJCXJldHVybiAtMTsKLQkJfQotCQllbHNlIHsKLQkJCW1lbWNweShzZWxmLT53cml0ZV9idWYgKyBzZWxmLT5idWZfc2l6ZSwgcywgbik7Ci0JCQlzZWxmLT5idWZfc2l6ZSArPSBuOwotCQkJcmV0dXJuIG47Ci0JCX0KLQl9CisgICAgICAgIGlmIChuID4gV1JJVEVfQlVGX1NJWkUpIHsKKyAgICAgICAgICAgIGlmICghKCBweV9zdHIgPQorICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHMsIG4pKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBtZW1jcHkoc2VsZi0+d3JpdGVfYnVmICsgc2VsZi0+YnVmX3NpemUsIHMsIG4pOworICAgICAgICAgICAgc2VsZi0+YnVmX3NpemUgKz0gbjsKKyAgICAgICAgICAgIHJldHVybiBuOworICAgICAgICB9CisgICAgfQogCi0JaWYgKHNlbGYtPndyaXRlKSB7Ci0JCS8qIG9iamVjdCB3aXRoIHdyaXRlIG1ldGhvZCAqLwotCQlBUkdfVFVQKHNlbGYsIHB5X3N0cik7Ci0JCWlmIChzZWxmLT5hcmcpIHsKLQkJCWp1bmsgPSBQeU9iamVjdF9DYWxsKHNlbGYtPndyaXRlLCBzZWxmLT5hcmcsIE5VTEwpOwotCQkJRlJFRV9BUkdfVFVQKHNlbGYpOwotCQl9Ci0JCWlmIChqdW5rKSBQeV9ERUNSRUYoanVuayk7Ci0JCWVsc2UgcmV0dXJuIC0xOwotCX0KLQllbHNlCi0JICAgIFBEQVRBX1BVU0goc2VsZi0+ZmlsZSwgcHlfc3RyLCAtMSk7CisgICAgaWYgKHNlbGYtPndyaXRlKSB7CisgICAgICAgIC8qIG9iamVjdCB3aXRoIHdyaXRlIG1ldGhvZCAqLworICAgICAgICBBUkdfVFVQKHNlbGYsIHB5X3N0cik7CisgICAgICAgIGlmIChzZWxmLT5hcmcpIHsKKyAgICAgICAgICAgIGp1bmsgPSBQeU9iamVjdF9DYWxsKHNlbGYtPndyaXRlLCBzZWxmLT5hcmcsIE5VTEwpOworICAgICAgICAgICAgRlJFRV9BUkdfVFVQKHNlbGYpOworICAgICAgICB9CisgICAgICAgIGlmIChqdW5rKSBQeV9ERUNSRUYoanVuayk7CisgICAgICAgIGVsc2UgcmV0dXJuIC0xOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIFBEQVRBX1BVU0goc2VsZi0+ZmlsZSwgcHlfc3RyLCAtMSk7CiAKLQlzZWxmLT5idWZfc2l6ZSA9IDA7Ci0JcmV0dXJuIG47CisgICAgc2VsZi0+YnVmX3NpemUgPSAwOworICAgIHJldHVybiBuOwogfQogCiAKIHN0YXRpYyBQeV9zc2l6ZV90CiByZWFkX2ZpbGUoVW5waWNrbGVyb2JqZWN0ICpzZWxmLCBjaGFyICoqcywgUHlfc3NpemVfdCBuKQogewotCXNpemVfdCBuYnl0ZXNyZWFkOworICAgIHNpemVfdCBuYnl0ZXNyZWFkOwogCi0JaWYgKHNlbGYtPmJ1Zl9zaXplID09IDApIHsKLQkJaW50IHNpemU7CisgICAgaWYgKHNlbGYtPmJ1Zl9zaXplID09IDApIHsKKyAgICAgICAgaW50IHNpemU7CiAKLQkJc2l6ZSA9ICgobiA8IDMyKSA/IDMyIDogbik7Ci0JCWlmICghKCBzZWxmLT5idWYgPSAoY2hhciAqKW1hbGxvYyhzaXplKSkpIHsKLQkJCVB5RXJyX05vTWVtb3J5KCk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KKyAgICAgICAgc2l6ZSA9ICgobiA8IDMyKSA/IDMyIDogbik7CisgICAgICAgIGlmICghKCBzZWxmLT5idWYgPSAoY2hhciAqKW1hbGxvYyhzaXplKSkpIHsKKyAgICAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KIAotCQlzZWxmLT5idWZfc2l6ZSA9IHNpemU7Ci0JfQotCWVsc2UgaWYgKG4gPiBzZWxmLT5idWZfc2l6ZSkgewotCQljaGFyICpuZXdidWYgPSAoY2hhciAqKXJlYWxsb2Moc2VsZi0+YnVmLCBuKTsKLQkJaWYgKCFuZXdidWYpICB7Ci0JCQlQeUVycl9Ob01lbW9yeSgpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCXNlbGYtPmJ1ZiA9IG5ld2J1ZjsKLQkJc2VsZi0+YnVmX3NpemUgPSBuOwotCX0KKyAgICAgICAgc2VsZi0+YnVmX3NpemUgPSBzaXplOworICAgIH0KKyAgICBlbHNlIGlmIChuID4gc2VsZi0+YnVmX3NpemUpIHsKKyAgICAgICAgY2hhciAqbmV3YnVmID0gKGNoYXIgKilyZWFsbG9jKHNlbGYtPmJ1Ziwgbik7CisgICAgICAgIGlmICghbmV3YnVmKSAgeworICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBzZWxmLT5idWYgPSBuZXdidWY7CisgICAgICAgIHNlbGYtPmJ1Zl9zaXplID0gbjsKKyAgICB9CiAKLQlQeUZpbGVfSW5jVXNlQ291bnQoKFB5RmlsZU9iamVjdCAqKXNlbGYtPmZpbGUpOwotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQluYnl0ZXNyZWFkID0gZnJlYWQoc2VsZi0+YnVmLCBzaXplb2YoY2hhciksIG4sIHNlbGYtPmZwKTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCVB5RmlsZV9EZWNVc2VDb3VudCgoUHlGaWxlT2JqZWN0ICopc2VsZi0+ZmlsZSk7Ci0JaWYgKG5ieXRlc3JlYWQgIT0gKHNpemVfdCluKSB7Ci0JCWlmIChmZW9mKHNlbGYtPmZwKSkgewotCQkJUHlFcnJfU2V0Tm9uZShQeUV4Y19FT0ZFcnJvcik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KKyAgICBQeUZpbGVfSW5jVXNlQ291bnQoKFB5RmlsZU9iamVjdCAqKXNlbGYtPmZpbGUpOworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICBuYnl0ZXNyZWFkID0gZnJlYWQoc2VsZi0+YnVmLCBzaXplb2YoY2hhciksIG4sIHNlbGYtPmZwKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIFB5RmlsZV9EZWNVc2VDb3VudCgoUHlGaWxlT2JqZWN0ICopc2VsZi0+ZmlsZSk7CisgICAgaWYgKG5ieXRlc3JlYWQgIT0gKHNpemVfdCluKSB7CisgICAgICAgIGlmIChmZW9mKHNlbGYtPmZwKSkgeworICAgICAgICAgICAgUHlFcnJfU2V0Tm9uZShQeUV4Y19FT0ZFcnJvcik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KIAotCQlQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCSpzID0gc2VsZi0+YnVmOworICAgICpzID0gc2VsZi0+YnVmOwogCi0JcmV0dXJuIG47CisgICAgcmV0dXJuIG47CiB9CiAKIAogc3RhdGljIFB5X3NzaXplX3QKIHJlYWRsaW5lX2ZpbGUoVW5waWNrbGVyb2JqZWN0ICpzZWxmLCBjaGFyICoqcykKIHsKLQlpbnQgaTsKKyAgICBpbnQgaTsKIAotCWlmIChzZWxmLT5idWZfc2l6ZSA9PSAwKSB7Ci0JCWlmICghKCBzZWxmLT5idWYgPSAoY2hhciAqKW1hbGxvYyg0MCkpKSB7Ci0JCQlQeUVycl9Ob01lbW9yeSgpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCXNlbGYtPmJ1Zl9zaXplID0gNDA7Ci0JfQorICAgIGlmIChzZWxmLT5idWZfc2l6ZSA9PSAwKSB7CisgICAgICAgIGlmICghKCBzZWxmLT5idWYgPSAoY2hhciAqKW1hbGxvYyg0MCkpKSB7CisgICAgICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIHNlbGYtPmJ1Zl9zaXplID0gNDA7CisgICAgfQogCi0JaSA9IDA7Ci0Jd2hpbGUgKDEpIHsKLQkJaW50IGJpZ2dlcjsKLQkJY2hhciAqbmV3YnVmOwotCQlmb3IgKDsgaSA8IChzZWxmLT5idWZfc2l6ZSAtIDEpOyBpKyspIHsKLQkJCWlmIChmZW9mKHNlbGYtPmZwKSB8fAotCQkJICAgIChzZWxmLT5idWZbaV0gPSBnZXRjKHNlbGYtPmZwKSkgPT0gJ1xuJykgewotCQkJCXNlbGYtPmJ1ZltpICsgMV0gPSAnXDAnOwotCQkJCSpzID0gc2VsZi0+YnVmOwotCQkJCXJldHVybiBpICsgMTsKLQkJCX0KLQkJfQotCQliaWdnZXIgPSBzZWxmLT5idWZfc2l6ZSA8PCAxOwotCQlpZiAoYmlnZ2VyIDw9IDApIHsJLyogb3ZlcmZsb3cgKi8KLQkJCVB5RXJyX05vTWVtb3J5KCk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJbmV3YnVmID0gKGNoYXIgKilyZWFsbG9jKHNlbGYtPmJ1ZiwgYmlnZ2VyKTsKLQkJaWYgKCFuZXdidWYpICB7Ci0JCQlQeUVycl9Ob01lbW9yeSgpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCXNlbGYtPmJ1ZiA9IG5ld2J1ZjsKLQkJc2VsZi0+YnVmX3NpemUgPSBiaWdnZXI7Ci0JfQorICAgIGkgPSAwOworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGludCBiaWdnZXI7CisgICAgICAgIGNoYXIgKm5ld2J1ZjsKKyAgICAgICAgZm9yICg7IGkgPCAoc2VsZi0+YnVmX3NpemUgLSAxKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAoZmVvZihzZWxmLT5mcCkgfHwKKyAgICAgICAgICAgICAgICAoc2VsZi0+YnVmW2ldID0gZ2V0YyhzZWxmLT5mcCkpID09ICdcbicpIHsKKyAgICAgICAgICAgICAgICBzZWxmLT5idWZbaSArIDFdID0gJ1wwJzsKKyAgICAgICAgICAgICAgICAqcyA9IHNlbGYtPmJ1ZjsKKyAgICAgICAgICAgICAgICByZXR1cm4gaSArIDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYmlnZ2VyID0gc2VsZi0+YnVmX3NpemUgPDwgMTsKKyAgICAgICAgaWYgKGJpZ2dlciA8PSAwKSB7ICAgICAgICAgICAgICAvKiBvdmVyZmxvdyAqLworICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBuZXdidWYgPSAoY2hhciAqKXJlYWxsb2Moc2VsZi0+YnVmLCBiaWdnZXIpOworICAgICAgICBpZiAoIW5ld2J1ZikgIHsKKyAgICAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgc2VsZi0+YnVmID0gbmV3YnVmOworICAgICAgICBzZWxmLT5idWZfc2l6ZSA9IGJpZ2dlcjsKKyAgICB9CiB9CiAKIAogc3RhdGljIFB5X3NzaXplX3QKIHJlYWRfY1N0cmluZ0lPKFVucGlja2xlcm9iamVjdCAqc2VsZiwgY2hhciAqKnMsIFB5X3NzaXplX3QgIG4pCiB7Ci0JY2hhciAqcHRyOworICAgIGNoYXIgKnB0cjsKIAotCWlmIChQeWNTdHJpbmdJTy0+Y3JlYWQoKFB5T2JqZWN0ICopc2VsZi0+ZmlsZSwgJnB0ciwgbikgIT0gbikgewotCQlQeUVycl9TZXROb25lKFB5RXhjX0VPRkVycm9yKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICBpZiAoUHljU3RyaW5nSU8tPmNyZWFkKChQeU9iamVjdCAqKXNlbGYtPmZpbGUsICZwdHIsIG4pICE9IG4pIHsKKyAgICAgICAgUHlFcnJfU2V0Tm9uZShQeUV4Y19FT0ZFcnJvcik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQkqcyA9IHB0cjsKKyAgICAqcyA9IHB0cjsKIAotCXJldHVybiBuOworICAgIHJldHVybiBuOwogfQogCiAKIHN0YXRpYyBQeV9zc2l6ZV90CiByZWFkbGluZV9jU3RyaW5nSU8oVW5waWNrbGVyb2JqZWN0ICpzZWxmLCBjaGFyICoqcykKIHsKLQlQeV9zc2l6ZV90IG47Ci0JY2hhciAqcHRyOworICAgIFB5X3NzaXplX3QgbjsKKyAgICBjaGFyICpwdHI7CiAKLQlpZiAoKG4gPSBQeWNTdHJpbmdJTy0+Y3JlYWRsaW5lKChQeU9iamVjdCAqKXNlbGYtPmZpbGUsICZwdHIpKSA8IDApIHsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICBpZiAoKG4gPSBQeWNTdHJpbmdJTy0+Y3JlYWRsaW5lKChQeU9iamVjdCAqKXNlbGYtPmZpbGUsICZwdHIpKSA8IDApIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCSpzID0gcHRyOworICAgICpzID0gcHRyOwogCi0JcmV0dXJuIG47CisgICAgcmV0dXJuIG47CiB9CiAKIAogc3RhdGljIFB5X3NzaXplX3QKIHJlYWRfb3RoZXIoVW5waWNrbGVyb2JqZWN0ICpzZWxmLCBjaGFyICoqcywgUHlfc3NpemVfdCAgbikKIHsKLQlQeU9iamVjdCAqYnl0ZXMsICpzdHI9MDsKKyAgICBQeU9iamVjdCAqYnl0ZXMsICpzdHI9MDsKIAotCWlmICghKCBieXRlcyA9IFB5SW50X0Zyb21Tc2l6ZV90KG4pKSkgIHJldHVybiAtMTsKKyAgICBpZiAoISggYnl0ZXMgPSBQeUludF9Gcm9tU3NpemVfdChuKSkpICByZXR1cm4gLTE7CiAKLQlBUkdfVFVQKHNlbGYsIGJ5dGVzKTsKLQlpZiAoc2VsZi0+YXJnKSB7Ci0JCXN0ciA9IFB5T2JqZWN0X0NhbGwoc2VsZi0+cmVhZCwgc2VsZi0+YXJnLCBOVUxMKTsKLQkJRlJFRV9BUkdfVFVQKHNlbGYpOwotCX0KLQlpZiAoISBzdHIpIHJldHVybiAtMTsKKyAgICBBUkdfVFVQKHNlbGYsIGJ5dGVzKTsKKyAgICBpZiAoc2VsZi0+YXJnKSB7CisgICAgICAgIHN0ciA9IFB5T2JqZWN0X0NhbGwoc2VsZi0+cmVhZCwgc2VsZi0+YXJnLCBOVUxMKTsKKyAgICAgICAgRlJFRV9BUkdfVFVQKHNlbGYpOworICAgIH0KKyAgICBpZiAoISBzdHIpIHJldHVybiAtMTsKIAotCVB5X1hERUNSRUYoc2VsZi0+bGFzdF9zdHJpbmcpOwotCXNlbGYtPmxhc3Rfc3RyaW5nID0gc3RyOworICAgIFB5X1hERUNSRUYoc2VsZi0+bGFzdF9zdHJpbmcpOworICAgIHNlbGYtPmxhc3Rfc3RyaW5nID0gc3RyOwogCi0JaWYgKCEgKCpzID0gUHlTdHJpbmdfQXNTdHJpbmcoc3RyKSkpIHJldHVybiAtMTsKKyAgICBpZiAoISAoKnMgPSBQeVN0cmluZ19Bc1N0cmluZyhzdHIpKSkgcmV0dXJuIC0xOwogCi0JaWYgKFB5U3RyaW5nX0dFVF9TSVpFKHN0cikgIT0gbikgewotCQlQeUVycl9TZXROb25lKFB5RXhjX0VPRkVycm9yKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICBpZiAoUHlTdHJpbmdfR0VUX1NJWkUoc3RyKSAhPSBuKSB7CisgICAgICAgIFB5RXJyX1NldE5vbmUoUHlFeGNfRU9GRXJyb3IpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JcmV0dXJuIG47CisgICAgcmV0dXJuIG47CiB9CiAKIAogc3RhdGljIFB5X3NzaXplX3QKIHJlYWRsaW5lX290aGVyKFVucGlja2xlcm9iamVjdCAqc2VsZiwgY2hhciAqKnMpCiB7Ci0JUHlPYmplY3QgKnN0cjsKLQlQeV9zc2l6ZV90IHN0cl9zaXplOworICAgIFB5T2JqZWN0ICpzdHI7CisgICAgUHlfc3NpemVfdCBzdHJfc2l6ZTsKIAotCWlmICghKCBzdHIgPSBQeU9iamVjdF9DYWxsT2JqZWN0KHNlbGYtPnJlYWRsaW5lLCBlbXB0eV90dXBsZSkpKSAgewotCQlyZXR1cm4gLTE7Ci0JfQorICAgIGlmICghKCBzdHIgPSBQeU9iamVjdF9DYWxsT2JqZWN0KHNlbGYtPnJlYWRsaW5lLCBlbXB0eV90dXBsZSkpKSAgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JaWYgKChzdHJfc2l6ZSA9IFB5U3RyaW5nX1NpemUoc3RyKSkgPCAwKQotCQlyZXR1cm4gLTE7CisgICAgaWYgKChzdHJfc2l6ZSA9IFB5U3RyaW5nX1NpemUoc3RyKSkgPCAwKQorICAgICAgICByZXR1cm4gLTE7CiAKLQlQeV9YREVDUkVGKHNlbGYtPmxhc3Rfc3RyaW5nKTsKLQlzZWxmLT5sYXN0X3N0cmluZyA9IHN0cjsKKyAgICBQeV9YREVDUkVGKHNlbGYtPmxhc3Rfc3RyaW5nKTsKKyAgICBzZWxmLT5sYXN0X3N0cmluZyA9IHN0cjsKIAotCWlmICghICgqcyA9IFB5U3RyaW5nX0FzU3RyaW5nKHN0cikpKQotCQlyZXR1cm4gLTE7CisgICAgaWYgKCEgKCpzID0gUHlTdHJpbmdfQXNTdHJpbmcoc3RyKSkpCisgICAgICAgIHJldHVybiAtMTsKIAotCXJldHVybiBzdHJfc2l6ZTsKKyAgICByZXR1cm4gc3RyX3NpemU7CiB9CiAKIC8qIENvcHkgdGhlIGZpcnN0IG4gYnl0ZXMgZnJvbSBzIGludG8gbmV3bHkgbWFsbG9jJ2VkIG1lbW9yeSwgcGx1cyBhCkBAIC03MDIsNTY2ICs3MDIsNTY2IEBACiBzdGF0aWMgY2hhciAqCiBweXN0cm5kdXAoY29uc3QgY2hhciAqcywgaW50IG4pCiB7Ci0JY2hhciAqciA9IChjaGFyICopbWFsbG9jKG4rMSk7Ci0JaWYgKHIgPT0gTlVMTCkKLQkJcmV0dXJuIChjaGFyKilQeUVycl9Ob01lbW9yeSgpOwotCW1lbWNweShyLCBzLCBuKTsKLQlyW25dID0gMDsKLQlyZXR1cm4gcjsKKyAgICBjaGFyICpyID0gKGNoYXIgKiltYWxsb2MobisxKTsKKyAgICBpZiAociA9PSBOVUxMKQorICAgICAgICByZXR1cm4gKGNoYXIqKVB5RXJyX05vTWVtb3J5KCk7CisgICAgbWVtY3B5KHIsIHMsIG4pOworICAgIHJbbl0gPSAwOworICAgIHJldHVybiByOwogfQogCiAKIHN0YXRpYyBpbnQKIGdldChQaWNrbGVyb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqaWQpCiB7Ci0JUHlPYmplY3QgKnZhbHVlLCAqbXY7Ci0JbG9uZyBjX3ZhbHVlOwotCWNoYXIgc1szMF07Ci0Jc2l6ZV90IGxlbjsKKyAgICBQeU9iamVjdCAqdmFsdWUsICptdjsKKyAgICBsb25nIGNfdmFsdWU7CisgICAgY2hhciBzWzMwXTsKKyAgICBzaXplX3QgbGVuOwogCi0JaWYgKCEoIG12ID0gUHlEaWN0X0dldEl0ZW0oc2VsZi0+bWVtbywgaWQpKSkgIHsKLQkJUHlFcnJfU2V0T2JqZWN0KFB5RXhjX0tleUVycm9yLCBpZCk7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgaWYgKCEoIG12ID0gUHlEaWN0X0dldEl0ZW0oc2VsZi0+bWVtbywgaWQpKSkgIHsKKyAgICAgICAgUHlFcnJfU2V0T2JqZWN0KFB5RXhjX0tleUVycm9yLCBpZCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQlpZiAoISggdmFsdWUgPSBQeVR1cGxlX0dldEl0ZW0obXYsIDApKSkKLQkJcmV0dXJuIC0xOworICAgIGlmICghKCB2YWx1ZSA9IFB5VHVwbGVfR2V0SXRlbShtdiwgMCkpKQorICAgICAgICByZXR1cm4gLTE7CiAKLQlpZiAoISggUHlJbnRfQ2hlY2sodmFsdWUpKSkgIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFBpY2tsaW5nRXJyb3IsICJubyBpbnQgd2hlcmUgaW50IGV4cGVjdGVkIGluIG1lbW8iKTsKLQkJcmV0dXJuIC0xOwotCX0KLQljX3ZhbHVlID0gUHlJbnRfQVNfTE9ORygoUHlJbnRPYmplY3QqKXZhbHVlKTsKKyAgICBpZiAoISggUHlJbnRfQ2hlY2sodmFsdWUpKSkgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFBpY2tsaW5nRXJyb3IsICJubyBpbnQgd2hlcmUgaW50IGV4cGVjdGVkIGluIG1lbW8iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBjX3ZhbHVlID0gUHlJbnRfQVNfTE9ORygoUHlJbnRPYmplY3QqKXZhbHVlKTsKIAotCWlmICghc2VsZi0+YmluKSB7Ci0JCXNbMF0gPSBHRVQ7Ci0JCVB5T1Nfc25wcmludGYocyArIDEsIHNpemVvZihzKSAtIDEsICIlbGRcbiIsIGNfdmFsdWUpOwotCQlsZW4gPSBzdHJsZW4ocyk7Ci0JfQotCWVsc2UgaWYgKFBkYXRhX0NoZWNrKHNlbGYtPmZpbGUpKSB7Ci0JCWlmICh3cml0ZV9vdGhlcihzZWxmLCBOVUxMLCAwKSA8IDApIHJldHVybiAtMTsKLQkJUERBVEFfQVBQRU5EKHNlbGYtPmZpbGUsIG12LCAtMSk7Ci0JCXJldHVybiAwOwotCX0KLQllbHNlIHsKLQkJaWYgKGNfdmFsdWUgPCAyNTYpIHsKLQkJCXNbMF0gPSBCSU5HRVQ7Ci0JCQlzWzFdID0gKGludCkoY192YWx1ZSAmIDB4ZmYpOwotCQkJbGVuID0gMjsKLQkJfQotCQllbHNlIHsKLQkJCXNbMF0gPSBMT05HX0JJTkdFVDsKLQkJCXNbMV0gPSAoaW50KShjX3ZhbHVlICYgMHhmZik7Ci0JCQlzWzJdID0gKGludCkoKGNfdmFsdWUgPj4gOCkgICYgMHhmZik7Ci0JCQlzWzNdID0gKGludCkoKGNfdmFsdWUgPj4gMTYpICYgMHhmZik7Ci0JCQlzWzRdID0gKGludCkoKGNfdmFsdWUgPj4gMjQpICYgMHhmZik7Ci0JCQlsZW4gPSA1OwotCQl9Ci0JfQorICAgIGlmICghc2VsZi0+YmluKSB7CisgICAgICAgIHNbMF0gPSBHRVQ7CisgICAgICAgIFB5T1Nfc25wcmludGYocyArIDEsIHNpemVvZihzKSAtIDEsICIlbGRcbiIsIGNfdmFsdWUpOworICAgICAgICBsZW4gPSBzdHJsZW4ocyk7CisgICAgfQorICAgIGVsc2UgaWYgKFBkYXRhX0NoZWNrKHNlbGYtPmZpbGUpKSB7CisgICAgICAgIGlmICh3cml0ZV9vdGhlcihzZWxmLCBOVUxMLCAwKSA8IDApIHJldHVybiAtMTsKKyAgICAgICAgUERBVEFfQVBQRU5EKHNlbGYtPmZpbGUsIG12LCAtMSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKGNfdmFsdWUgPCAyNTYpIHsKKyAgICAgICAgICAgIHNbMF0gPSBCSU5HRVQ7CisgICAgICAgICAgICBzWzFdID0gKGludCkoY192YWx1ZSAmIDB4ZmYpOworICAgICAgICAgICAgbGVuID0gMjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHNbMF0gPSBMT05HX0JJTkdFVDsKKyAgICAgICAgICAgIHNbMV0gPSAoaW50KShjX3ZhbHVlICYgMHhmZik7CisgICAgICAgICAgICBzWzJdID0gKGludCkoKGNfdmFsdWUgPj4gOCkgICYgMHhmZik7CisgICAgICAgICAgICBzWzNdID0gKGludCkoKGNfdmFsdWUgPj4gMTYpICYgMHhmZik7CisgICAgICAgICAgICBzWzRdID0gKGludCkoKGNfdmFsdWUgPj4gMjQpICYgMHhmZik7CisgICAgICAgICAgICBsZW4gPSA1OworICAgICAgICB9CisgICAgfQogCi0JaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgcywgbGVuKSA8IDApCi0JCXJldHVybiAtMTsKKyAgICBpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCBzLCBsZW4pIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiB9CiAKIAogc3RhdGljIGludAogcHV0KFBpY2tsZXJvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpvYikKIHsKLQlpZiAoUHlfUkVGQ05UKG9iKSA8IDIgfHwgc2VsZi0+ZmFzdCkKLQkJcmV0dXJuIDA7CisgICAgaWYgKFB5X1JFRkNOVChvYikgPCAyIHx8IHNlbGYtPmZhc3QpCisgICAgICAgIHJldHVybiAwOwogCi0JcmV0dXJuIHB1dDIoc2VsZiwgb2IpOworICAgIHJldHVybiBwdXQyKHNlbGYsIG9iKTsKIH0KIAogCiBzdGF0aWMgaW50CiBwdXQyKFBpY2tsZXJvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpvYikKIHsKLQljaGFyIGNfc3RyWzMwXTsKLQlpbnQgcDsKLQlzaXplX3QgbGVuOwotCWludCByZXMgPSAtMTsKLQlQeU9iamVjdCAqcHlfb2JfaWQgPSAwLCAqbWVtb19sZW4gPSAwLCAqdCA9IDA7CisgICAgY2hhciBjX3N0clszMF07CisgICAgaW50IHA7CisgICAgc2l6ZV90IGxlbjsKKyAgICBpbnQgcmVzID0gLTE7CisgICAgUHlPYmplY3QgKnB5X29iX2lkID0gMCwgKm1lbW9fbGVuID0gMCwgKnQgPSAwOwogCi0JaWYgKHNlbGYtPmZhc3QpCi0JCXJldHVybiAwOworICAgIGlmIChzZWxmLT5mYXN0KQorICAgICAgICByZXR1cm4gMDsKIAotCWlmICgocCA9IFB5RGljdF9TaXplKHNlbGYtPm1lbW8pKSA8IDApCi0JCWdvdG8gZmluYWxseTsKKyAgICBpZiAoKHAgPSBQeURpY3RfU2l6ZShzZWxmLT5tZW1vKSkgPCAwKQorICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQkvKiBNYWtlIHN1cmUgbWVtbyBrZXlzIGFyZSBwb3NpdGl2ZSEgKi8KLQkvKiBYWFggV2h5PwotCSAqIFhYWCBBbmQgZG9lcyAicG9zaXRpdmUiIHJlYWxseSBtZWFuIG5vbi1uZWdhdGl2ZT8KLQkgKiBYWFggcGlja2xlLnB5IHN0YXJ0cyB3aXRoIFBVVCBpbmRleCAwLCBub3QgMS4gIFRoaXMgbWFrZXMgZm9yCi0JICogWFhYIGdyYXR1aXRvdXMgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgcGlja2xpbmcgbW9kdWxlcy4KLQkgKi8KLQlwKys7CisgICAgLyogTWFrZSBzdXJlIG1lbW8ga2V5cyBhcmUgcG9zaXRpdmUhICovCisgICAgLyogWFhYIFdoeT8KKyAgICAgKiBYWFggQW5kIGRvZXMgInBvc2l0aXZlIiByZWFsbHkgbWVhbiBub24tbmVnYXRpdmU/CisgICAgICogWFhYIHBpY2tsZS5weSBzdGFydHMgd2l0aCBQVVQgaW5kZXggMCwgbm90IDEuICBUaGlzIG1ha2VzIGZvcgorICAgICAqIFhYWCBncmF0dWl0b3VzIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlIHBpY2tsaW5nIG1vZHVsZXMuCisgICAgICovCisgICAgcCsrOwogCi0JaWYgKCEoIHB5X29iX2lkID0gUHlMb25nX0Zyb21Wb2lkUHRyKG9iKSkpCi0JCWdvdG8gZmluYWxseTsKKyAgICBpZiAoISggcHlfb2JfaWQgPSBQeUxvbmdfRnJvbVZvaWRQdHIob2IpKSkKKyAgICAgICAgZ290byBmaW5hbGx5OwogCi0JaWYgKCEoIG1lbW9fbGVuID0gUHlJbnRfRnJvbUxvbmcocCkpKQotCQlnb3RvIGZpbmFsbHk7CisgICAgaWYgKCEoIG1lbW9fbGVuID0gUHlJbnRfRnJvbUxvbmcocCkpKQorICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQlpZiAoISggdCA9IFB5VHVwbGVfTmV3KDIpKSkKLQkJZ290byBmaW5hbGx5OworICAgIGlmICghKCB0ID0gUHlUdXBsZV9OZXcoMikpKQorICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQlQeVR1cGxlX1NFVF9JVEVNKHQsIDAsIG1lbW9fbGVuKTsKLQlQeV9JTkNSRUYobWVtb19sZW4pOwotCVB5VHVwbGVfU0VUX0lURU0odCwgMSwgb2IpOwotCVB5X0lOQ1JFRihvYik7CisgICAgUHlUdXBsZV9TRVRfSVRFTSh0LCAwLCBtZW1vX2xlbik7CisgICAgUHlfSU5DUkVGKG1lbW9fbGVuKTsKKyAgICBQeVR1cGxlX1NFVF9JVEVNKHQsIDEsIG9iKTsKKyAgICBQeV9JTkNSRUYob2IpOwogCi0JaWYgKFB5RGljdF9TZXRJdGVtKHNlbGYtPm1lbW8sIHB5X29iX2lkLCB0KSA8IDApCi0JCWdvdG8gZmluYWxseTsKKyAgICBpZiAoUHlEaWN0X1NldEl0ZW0oc2VsZi0+bWVtbywgcHlfb2JfaWQsIHQpIDwgMCkKKyAgICAgICAgZ290byBmaW5hbGx5OwogCi0JaWYgKCFzZWxmLT5iaW4pIHsKLQkJY19zdHJbMF0gPSBQVVQ7Ci0JCVB5T1Nfc25wcmludGYoY19zdHIgKyAxLCBzaXplb2YoY19zdHIpIC0gMSwgIiVkXG4iLCBwKTsKLQkJbGVuID0gc3RybGVuKGNfc3RyKTsKLQl9Ci0JZWxzZSBpZiAoUGRhdGFfQ2hlY2soc2VsZi0+ZmlsZSkpIHsKLQkJaWYgKHdyaXRlX290aGVyKHNlbGYsIE5VTEwsIDApIDwgMCkgcmV0dXJuIC0xOwotCQlQREFUQV9BUFBFTkQoc2VsZi0+ZmlsZSwgbWVtb19sZW4sIC0xKTsKLQkJcmVzPTA7ICAgICAgICAgIC8qIEpvYiB3ZWxsIGRvbmUgOykgKi8KLQkJZ290byBmaW5hbGx5OwotCX0KLQllbHNlIHsKLQkJaWYgKHAgPj0gMjU2KSB7Ci0JCQljX3N0clswXSA9IExPTkdfQklOUFVUOwotCQkJY19zdHJbMV0gPSAoaW50KShwICYgMHhmZik7Ci0JCQljX3N0clsyXSA9IChpbnQpKChwID4+IDgpICAmIDB4ZmYpOwotCQkJY19zdHJbM10gPSAoaW50KSgocCA+PiAxNikgJiAweGZmKTsKLQkJCWNfc3RyWzRdID0gKGludCkoKHAgPj4gMjQpICYgMHhmZik7Ci0JCQlsZW4gPSA1OwotCQl9Ci0JCWVsc2UgewotCQkJY19zdHJbMF0gPSBCSU5QVVQ7Ci0JCQljX3N0clsxXSA9IHA7Ci0JCQlsZW4gPSAyOwotCQl9Ci0JfQorICAgIGlmICghc2VsZi0+YmluKSB7CisgICAgICAgIGNfc3RyWzBdID0gUFVUOworICAgICAgICBQeU9TX3NucHJpbnRmKGNfc3RyICsgMSwgc2l6ZW9mKGNfc3RyKSAtIDEsICIlZFxuIiwgcCk7CisgICAgICAgIGxlbiA9IHN0cmxlbihjX3N0cik7CisgICAgfQorICAgIGVsc2UgaWYgKFBkYXRhX0NoZWNrKHNlbGYtPmZpbGUpKSB7CisgICAgICAgIGlmICh3cml0ZV9vdGhlcihzZWxmLCBOVUxMLCAwKSA8IDApIHJldHVybiAtMTsKKyAgICAgICAgUERBVEFfQVBQRU5EKHNlbGYtPmZpbGUsIG1lbW9fbGVuLCAtMSk7CisgICAgICAgIHJlcz0wOyAgICAgICAgICAvKiBKb2Igd2VsbCBkb25lIDspICovCisgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGlmIChwID49IDI1NikgeworICAgICAgICAgICAgY19zdHJbMF0gPSBMT05HX0JJTlBVVDsKKyAgICAgICAgICAgIGNfc3RyWzFdID0gKGludCkocCAmIDB4ZmYpOworICAgICAgICAgICAgY19zdHJbMl0gPSAoaW50KSgocCA+PiA4KSAgJiAweGZmKTsKKyAgICAgICAgICAgIGNfc3RyWzNdID0gKGludCkoKHAgPj4gMTYpICYgMHhmZik7CisgICAgICAgICAgICBjX3N0cls0XSA9IChpbnQpKChwID4+IDI0KSAmIDB4ZmYpOworICAgICAgICAgICAgbGVuID0gNTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGNfc3RyWzBdID0gQklOUFVUOworICAgICAgICAgICAgY19zdHJbMV0gPSBwOworICAgICAgICAgICAgbGVuID0gMjsKKyAgICAgICAgfQorICAgIH0KIAotCWlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsIGNfc3RyLCBsZW4pIDwgMCkKLQkJZ290byBmaW5hbGx5OworICAgIGlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsIGNfc3RyLCBsZW4pIDwgMCkKKyAgICAgICAgZ290byBmaW5hbGx5OwogCi0JcmVzID0gMDsKKyAgICByZXMgPSAwOwogCiAgIGZpbmFsbHk6Ci0JUHlfWERFQ1JFRihweV9vYl9pZCk7Ci0JUHlfWERFQ1JFRihtZW1vX2xlbik7Ci0JUHlfWERFQ1JFRih0KTsKKyAgICBQeV9YREVDUkVGKHB5X29iX2lkKTsKKyAgICBQeV9YREVDUkVGKG1lbW9fbGVuKTsKKyAgICBQeV9YREVDUkVGKHQpOwogCi0JcmV0dXJuIHJlczsKKyAgICByZXR1cm4gcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogd2hpY2htb2R1bGUoUHlPYmplY3QgKmdsb2JhbCwgUHlPYmplY3QgKmdsb2JhbF9uYW1lKQogewotCVB5X3NzaXplX3QgaSwgajsKLQlQeU9iamVjdCAqbW9kdWxlID0gMCwgKm1vZHVsZXNfZGljdCA9IDAsCi0JCSpnbG9iYWxfbmFtZV9hdHRyID0gMCwgKm5hbWUgPSAwOworICAgIFB5X3NzaXplX3QgaSwgajsKKyAgICBQeU9iamVjdCAqbW9kdWxlID0gMCwgKm1vZHVsZXNfZGljdCA9IDAsCisgICAgICAgICpnbG9iYWxfbmFtZV9hdHRyID0gMCwgKm5hbWUgPSAwOwogCi0JbW9kdWxlID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhnbG9iYWwsICJfX21vZHVsZV9fIik7Ci0JaWYgKG1vZHVsZSkgCi0JCXJldHVybiBtb2R1bGU7Ci0JaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfQXR0cmlidXRlRXJyb3IpKQotCQlQeUVycl9DbGVhcigpOwotCWVsc2UKLQkJcmV0dXJuIE5VTEw7CisgICAgbW9kdWxlID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhnbG9iYWwsICJfX21vZHVsZV9fIik7CisgICAgaWYgKG1vZHVsZSkKKyAgICAgICAgcmV0dXJuIG1vZHVsZTsKKyAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19BdHRyaWJ1dGVFcnJvcikpCisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmICghKCBtb2R1bGVzX2RpY3QgPSBQeVN5c19HZXRPYmplY3QoIm1vZHVsZXMiKSkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghKCBtb2R1bGVzX2RpY3QgPSBQeVN5c19HZXRPYmplY3QoIm1vZHVsZXMiKSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaSA9IDA7Ci0Jd2hpbGUgKChqID0gUHlEaWN0X05leHQobW9kdWxlc19kaWN0LCAmaSwgJm5hbWUsICZtb2R1bGUpKSkgeworICAgIGkgPSAwOworICAgIHdoaWxlICgoaiA9IFB5RGljdF9OZXh0KG1vZHVsZXNfZGljdCwgJmksICZuYW1lLCAmbW9kdWxlKSkpIHsKIAotCQlpZiAoUHlPYmplY3RfQ29tcGFyZShuYW1lLCBfX21haW5fX19zdHIpPT0wKSBjb250aW51ZTsKKyAgICAgICAgaWYgKFB5T2JqZWN0X0NvbXBhcmUobmFtZSwgX19tYWluX19fc3RyKT09MCkgY29udGludWU7CiAKLQkJZ2xvYmFsX25hbWVfYXR0ciA9IFB5T2JqZWN0X0dldEF0dHIobW9kdWxlLCBnbG9iYWxfbmFtZSk7Ci0JCWlmICghZ2xvYmFsX25hbWVfYXR0cikgIHsKLQkJCWlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkKLQkJCQlQeUVycl9DbGVhcigpOwotCQkJZWxzZQotCQkJCXJldHVybiBOVUxMOwotCQkJY29udGludWU7Ci0JCX0KKyAgICAgICAgZ2xvYmFsX25hbWVfYXR0ciA9IFB5T2JqZWN0X0dldEF0dHIobW9kdWxlLCBnbG9iYWxfbmFtZSk7CisgICAgICAgIGlmICghZ2xvYmFsX25hbWVfYXR0cikgIHsKKyAgICAgICAgICAgIGlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkKKyAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KIAotCQlpZiAoZ2xvYmFsX25hbWVfYXR0ciAhPSBnbG9iYWwpIHsKLQkJCVB5X0RFQ1JFRihnbG9iYWxfbmFtZV9hdHRyKTsKLQkJCWNvbnRpbnVlOwotCQl9CisgICAgICAgIGlmIChnbG9iYWxfbmFtZV9hdHRyICE9IGdsb2JhbCkgeworICAgICAgICAgICAgUHlfREVDUkVGKGdsb2JhbF9uYW1lX2F0dHIpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KIAotCQlQeV9ERUNSRUYoZ2xvYmFsX25hbWVfYXR0cik7CisgICAgICAgIFB5X0RFQ1JFRihnbG9iYWxfbmFtZV9hdHRyKTsKIAotCQlicmVhazsKLQl9CisgICAgICAgIGJyZWFrOworICAgIH0KIAotCS8qIFRoZSBmb2xsb3dpbmcgaW1wbGVtZW50cyB0aGUgcnVsZSBpbiBwaWNrbGUucHkgYWRkZWQgaW4gMS41Ci0JICAgdGhhdCB1c2VkIF9fbWFpbl9fIGlmIG5vIG1vZHVsZSBpcyBmb3VuZC4gIEkgZG9uJ3QgYWN0dWFsbHkKLQkgICBsaWtlIHRoaXMgcnVsZS4gamxmCi0JKi8KLQlpZiAoIWopIHsKLQkJaj0xOwotCQluYW1lPV9fbWFpbl9fX3N0cjsKLQl9CisgICAgLyogVGhlIGZvbGxvd2luZyBpbXBsZW1lbnRzIHRoZSBydWxlIGluIHBpY2tsZS5weSBhZGRlZCBpbiAxLjUKKyAgICAgICB0aGF0IHVzZWQgX19tYWluX18gaWYgbm8gbW9kdWxlIGlzIGZvdW5kLiAgSSBkb24ndCBhY3R1YWxseQorICAgICAgIGxpa2UgdGhpcyBydWxlLiBqbGYKKyAgICAqLworICAgIGlmICghaikgeworICAgICAgICBqPTE7CisgICAgICAgIG5hbWU9X19tYWluX19fc3RyOworICAgIH0KIAotCVB5X0lOQ1JFRihuYW1lKTsKLQlyZXR1cm4gbmFtZTsKKyAgICBQeV9JTkNSRUYobmFtZSk7CisgICAgcmV0dXJuIG5hbWU7CiB9CiAKIAogc3RhdGljIGludAogZmFzdF9zYXZlX2VudGVyKFBpY2tsZXJvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpvYmopCiB7Ci0JLyogaWYgZmFzdF9jb250YWluZXIgPCAwLCB3ZSdyZSBkb2luZyBhbiBlcnJvciBleGl0LiAqLwotCWlmICgrK3NlbGYtPmZhc3RfY29udGFpbmVyID49IFBZX0NQSUNLTEVfRkFTVF9MSU1JVCkgewotCQlQeU9iamVjdCAqa2V5ID0gTlVMTDsKLQkJaWYgKHNlbGYtPmZhc3RfbWVtbyA9PSBOVUxMKSB7Ci0JCQlzZWxmLT5mYXN0X21lbW8gPSBQeURpY3RfTmV3KCk7Ci0JCQlpZiAoc2VsZi0+ZmFzdF9tZW1vID09IE5VTEwpIHsKLQkJCQlzZWxmLT5mYXN0X2NvbnRhaW5lciA9IC0xOwotCQkJCXJldHVybiAwOwotCQkJfQotCQl9Ci0JCWtleSA9IFB5TG9uZ19Gcm9tVm9pZFB0cihvYmopOwotCQlpZiAoa2V5ID09IE5VTEwpCi0JCQlyZXR1cm4gMDsKLQkJaWYgKFB5RGljdF9HZXRJdGVtKHNlbGYtPmZhc3RfbWVtbywga2V5KSkgewotCQkJUHlfREVDUkVGKGtleSk7Ci0JCQlQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkgICAgICJmYXN0IG1vZGU6IGNhbid0IHBpY2tsZSBjeWNsaWMgb2JqZWN0cyAiCi0JCQkJICAgICAiaW5jbHVkaW5nIG9iamVjdCB0eXBlICVzIGF0ICVwIiwKLQkJCQkgICAgIFB5X1RZUEUob2JqKS0+dHBfbmFtZSwgb2JqKTsKLQkJCXNlbGYtPmZhc3RfY29udGFpbmVyID0gLTE7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlpZiAoUHlEaWN0X1NldEl0ZW0oc2VsZi0+ZmFzdF9tZW1vLCBrZXksIFB5X05vbmUpIDwgMCkgewotCQkJUHlfREVDUkVGKGtleSk7Ci0JCQlzZWxmLT5mYXN0X2NvbnRhaW5lciA9IC0xOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJUHlfREVDUkVGKGtleSk7Ci0JfQotCXJldHVybiAxOworICAgIC8qIGlmIGZhc3RfY29udGFpbmVyIDwgMCwgd2UncmUgZG9pbmcgYW4gZXJyb3IgZXhpdC4gKi8KKyAgICBpZiAoKytzZWxmLT5mYXN0X2NvbnRhaW5lciA+PSBQWV9DUElDS0xFX0ZBU1RfTElNSVQpIHsKKyAgICAgICAgUHlPYmplY3QgKmtleSA9IE5VTEw7CisgICAgICAgIGlmIChzZWxmLT5mYXN0X21lbW8gPT0gTlVMTCkgeworICAgICAgICAgICAgc2VsZi0+ZmFzdF9tZW1vID0gUHlEaWN0X05ldygpOworICAgICAgICAgICAgaWYgKHNlbGYtPmZhc3RfbWVtbyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgc2VsZi0+ZmFzdF9jb250YWluZXIgPSAtMTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBrZXkgPSBQeUxvbmdfRnJvbVZvaWRQdHIob2JqKTsKKyAgICAgICAgaWYgKGtleSA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGlmIChQeURpY3RfR2V0SXRlbShzZWxmLT5mYXN0X21lbW8sIGtleSkpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihrZXkpOworICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgImZhc3QgbW9kZTogY2FuJ3QgcGlja2xlIGN5Y2xpYyBvYmplY3RzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiaW5jbHVkaW5nIG9iamVjdCB0eXBlICVzIGF0ICVwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeV9UWVBFKG9iaiktPnRwX25hbWUsIG9iaik7CisgICAgICAgICAgICBzZWxmLT5mYXN0X2NvbnRhaW5lciA9IC0xOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtKHNlbGYtPmZhc3RfbWVtbywga2V5LCBQeV9Ob25lKSA8IDApIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihrZXkpOworICAgICAgICAgICAgc2VsZi0+ZmFzdF9jb250YWluZXIgPSAtMTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIFB5X0RFQ1JFRihrZXkpOworICAgIH0KKyAgICByZXR1cm4gMTsKIH0KIAogaW50CiBmYXN0X3NhdmVfbGVhdmUoUGlja2xlcm9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm9iaikKIHsKLQlpZiAoc2VsZi0+ZmFzdF9jb250YWluZXItLSA+PSBQWV9DUElDS0xFX0ZBU1RfTElNSVQpIHsKLQkJUHlPYmplY3QgKmtleSA9IFB5TG9uZ19Gcm9tVm9pZFB0cihvYmopOwotCQlpZiAoa2V5ID09IE5VTEwpCi0JCQlyZXR1cm4gMDsKLQkJaWYgKFB5RGljdF9EZWxJdGVtKHNlbGYtPmZhc3RfbWVtbywga2V5KSA8IDApIHsKLQkJCVB5X0RFQ1JFRihrZXkpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJUHlfREVDUkVGKGtleSk7Ci0JfQotCXJldHVybiAxOworICAgIGlmIChzZWxmLT5mYXN0X2NvbnRhaW5lci0tID49IFBZX0NQSUNLTEVfRkFTVF9MSU1JVCkgeworICAgICAgICBQeU9iamVjdCAqa2V5ID0gUHlMb25nX0Zyb21Wb2lkUHRyKG9iaik7CisgICAgICAgIGlmIChrZXkgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBpZiAoUHlEaWN0X0RlbEl0ZW0oc2VsZi0+ZmFzdF9tZW1vLCBrZXkpIDwgMCkgeworICAgICAgICAgICAgUHlfREVDUkVGKGtleSk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBQeV9ERUNSRUYoa2V5KTsKKyAgICB9CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyBpbnQKIHNhdmVfbm9uZShQaWNrbGVyb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzdGF0aWMgY2hhciBub25lID0gTk9ORTsKLQlpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCAmbm9uZSwgMSkgPCAwKQotCQlyZXR1cm4gLTE7CisgICAgc3RhdGljIGNoYXIgbm9uZSA9IE5PTkU7CisgICAgaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgJm5vbmUsIDEpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIHNhdmVfYm9vbChQaWNrbGVyb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzdGF0aWMgY29uc3QgY2hhciAqYnVmWzJdID0ge0ZBTFNFLCBUUlVFfTsKLQlzdGF0aWMgY2hhciBsZW5bMl0gPSB7c2l6ZW9mKEZBTFNFKS0xLCBzaXplb2YoVFJVRSktMX07Ci0JbG9uZyBsID0gUHlJbnRfQVNfTE9ORygoUHlJbnRPYmplY3QgKilhcmdzKTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqYnVmWzJdID0ge0ZBTFNFLCBUUlVFfTsKKyAgICBzdGF0aWMgY2hhciBsZW5bMl0gPSB7c2l6ZW9mKEZBTFNFKS0xLCBzaXplb2YoVFJVRSktMX07CisgICAgbG9uZyBsID0gUHlJbnRfQVNfTE9ORygoUHlJbnRPYmplY3QgKilhcmdzKTsKIAotCWlmIChzZWxmLT5wcm90byA+PSAyKSB7Ci0JCWNoYXIgb3Bjb2RlID0gbCA/IE5FV1RSVUUgOiBORVdGQUxTRTsKLQkJaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgJm9wY29kZSwgMSkgPCAwKQotCQkJcmV0dXJuIC0xOwotCX0KLQllbHNlIGlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsIGJ1ZltsXSwgbGVuW2xdKSA8IDApCi0JCXJldHVybiAtMTsKLQlyZXR1cm4gMDsKKyAgICBpZiAoc2VsZi0+cHJvdG8gPj0gMikgeworICAgICAgICBjaGFyIG9wY29kZSA9IGwgPyBORVdUUlVFIDogTkVXRkFMU0U7CisgICAgICAgIGlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsICZvcGNvZGUsIDEpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgZWxzZSBpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCBidWZbbF0sIGxlbltsXSkgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIHNhdmVfaW50KFBpY2tsZXJvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgY19zdHJbMzJdOwotCWxvbmcgbCA9IFB5SW50X0FTX0xPTkcoKFB5SW50T2JqZWN0ICopYXJncyk7Ci0JaW50IGxlbiA9IDA7CisgICAgY2hhciBjX3N0clszMl07CisgICAgbG9uZyBsID0gUHlJbnRfQVNfTE9ORygoUHlJbnRPYmplY3QgKilhcmdzKTsKKyAgICBpbnQgbGVuID0gMDsKIAotCWlmICghc2VsZi0+YmluCisgICAgaWYgKCFzZWxmLT5iaW4KICNpZiBTSVpFT0ZfTE9ORyA+IDQKLQkgICAgfHwgbCA+ICAweDdmZmZmZmZmTAotCSAgICB8fCBsIDwgLTB4ODAwMDAwMDBMCisgICAgICAgIHx8IGwgPiAgMHg3ZmZmZmZmZkwKKyAgICAgICAgfHwgbCA8IC0weDgwMDAwMDAwTAogI2VuZGlmCi0JCSkgewotCQkvKiBUZXh0LW1vZGUgcGlja2xlLCBvciBsb25nIHRvbyBiaWcgdG8gZml0IGluIHRoZSA0LWJ5dGUKLQkJICogc2lnbmVkIEJJTklOVCBmb3JtYXQ6ICBzdG9yZSBhcyBhIHN0cmluZy4KLQkJICovCi0JCWNfc3RyWzBdID0gSU5UOwotCQlQeU9TX3NucHJpbnRmKGNfc3RyICsgMSwgc2l6ZW9mKGNfc3RyKSAtIDEsICIlbGRcbiIsIGwpOwotCQlpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCBjX3N0ciwgc3RybGVuKGNfc3RyKSkgPCAwKQotCQkJcmV0dXJuIC0xOwotCX0KLQllbHNlIHsKLQkJLyogQmluYXJ5IHBpY2tsZSBhbmQgbCBmaXRzIGluIGEgc2lnbmVkIDQtYnl0ZSBpbnQuICovCi0JCWNfc3RyWzFdID0gKGludCkoIGwgICAgICAgICYgMHhmZik7Ci0JCWNfc3RyWzJdID0gKGludCkoKGwgPj4gOCkgICYgMHhmZik7Ci0JCWNfc3RyWzNdID0gKGludCkoKGwgPj4gMTYpICYgMHhmZik7Ci0JCWNfc3RyWzRdID0gKGludCkoKGwgPj4gMjQpICYgMHhmZik7CisgICAgICAgICkgeworICAgICAgICAvKiBUZXh0LW1vZGUgcGlja2xlLCBvciBsb25nIHRvbyBiaWcgdG8gZml0IGluIHRoZSA0LWJ5dGUKKyAgICAgICAgICogc2lnbmVkIEJJTklOVCBmb3JtYXQ6ICBzdG9yZSBhcyBhIHN0cmluZy4KKyAgICAgICAgICovCisgICAgICAgIGNfc3RyWzBdID0gSU5UOworICAgICAgICBQeU9TX3NucHJpbnRmKGNfc3RyICsgMSwgc2l6ZW9mKGNfc3RyKSAtIDEsICIlbGRcbiIsIGwpOworICAgICAgICBpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCBjX3N0ciwgc3RybGVuKGNfc3RyKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLyogQmluYXJ5IHBpY2tsZSBhbmQgbCBmaXRzIGluIGEgc2lnbmVkIDQtYnl0ZSBpbnQuICovCisgICAgICAgIGNfc3RyWzFdID0gKGludCkoIGwgICAgICAgICYgMHhmZik7CisgICAgICAgIGNfc3RyWzJdID0gKGludCkoKGwgPj4gOCkgICYgMHhmZik7CisgICAgICAgIGNfc3RyWzNdID0gKGludCkoKGwgPj4gMTYpICYgMHhmZik7CisgICAgICAgIGNfc3RyWzRdID0gKGludCkoKGwgPj4gMjQpICYgMHhmZik7CiAKLQkJaWYgKChjX3N0cls0XSA9PSAwKSAmJiAoY19zdHJbM10gPT0gMCkpIHsKLQkJCWlmIChjX3N0clsyXSA9PSAwKSB7Ci0JCQkJY19zdHJbMF0gPSBCSU5JTlQxOwotCQkJCWxlbiA9IDI7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQljX3N0clswXSA9IEJJTklOVDI7Ci0JCQkJbGVuID0gMzsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWNfc3RyWzBdID0gQklOSU5UOwotCQkJbGVuID0gNTsKLQkJfQorICAgICAgICBpZiAoKGNfc3RyWzRdID09IDApICYmIChjX3N0clszXSA9PSAwKSkgeworICAgICAgICAgICAgaWYgKGNfc3RyWzJdID09IDApIHsKKyAgICAgICAgICAgICAgICBjX3N0clswXSA9IEJJTklOVDE7CisgICAgICAgICAgICAgICAgbGVuID0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGNfc3RyWzBdID0gQklOSU5UMjsKKyAgICAgICAgICAgICAgICBsZW4gPSAzOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgY19zdHJbMF0gPSBCSU5JTlQ7CisgICAgICAgICAgICBsZW4gPSA1OworICAgICAgICB9CiAKLQkJaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgY19zdHIsIGxlbikgPCAwKQotCQkJcmV0dXJuIC0xOwotCX0KKyAgICAgICAgaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgY19zdHIsIGxlbikgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCXJldHVybiAwOworICAgIHJldHVybiAwOwogfQogCiAKIHN0YXRpYyBpbnQKIHNhdmVfbG9uZyhQaWNrbGVyb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeV9zc2l6ZV90IHNpemU7Ci0JaW50IHJlcyA9IC0xOwotCVB5T2JqZWN0ICpyZXByID0gTlVMTDsKKyAgICBQeV9zc2l6ZV90IHNpemU7CisgICAgaW50IHJlcyA9IC0xOworICAgIFB5T2JqZWN0ICpyZXByID0gTlVMTDsKIAotCXN0YXRpYyBjaGFyIGwgPSBMT05HOworICAgIHN0YXRpYyBjaGFyIGwgPSBMT05HOwogCi0JaWYgKHNlbGYtPnByb3RvID49IDIpIHsKLQkJLyogTGluZWFyLXRpbWUgcGlja2xpbmcuICovCi0JCXNpemVfdCBuYml0czsKLQkJc2l6ZV90IG5ieXRlczsKLQkJdW5zaWduZWQgY2hhciAqcGRhdGE7Ci0JCWNoYXIgY19zdHJbNV07Ci0JCWludCBpOwotCQlpbnQgc2lnbiA9IF9QeUxvbmdfU2lnbihhcmdzKTsKKyAgICBpZiAoc2VsZi0+cHJvdG8gPj0gMikgeworICAgICAgICAvKiBMaW5lYXItdGltZSBwaWNrbGluZy4gKi8KKyAgICAgICAgc2l6ZV90IG5iaXRzOworICAgICAgICBzaXplX3QgbmJ5dGVzOworICAgICAgICB1bnNpZ25lZCBjaGFyICpwZGF0YTsKKyAgICAgICAgY2hhciBjX3N0cls1XTsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGludCBzaWduID0gX1B5TG9uZ19TaWduKGFyZ3MpOwogCi0JCWlmIChzaWduID09IDApIHsKLQkJCS8qIEl0J3MgMCAtLSBhbiBlbXB0eSBieXRlc3RyaW5nLiAqLwotCQkJY19zdHJbMF0gPSBMT05HMTsKLQkJCWNfc3RyWzFdID0gMDsKLQkJCWkgPSBzZWxmLT53cml0ZV9mdW5jKHNlbGYsIGNfc3RyLCAyKTsKLQkJCWlmIChpIDwgMCkgZ290byBmaW5hbGx5OwotCQkJcmVzID0gMDsKLQkJCWdvdG8gZmluYWxseTsKLQkJfQotCQluYml0cyA9IF9QeUxvbmdfTnVtQml0cyhhcmdzKTsKLQkJaWYgKG5iaXRzID09IChzaXplX3QpLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJCWdvdG8gZmluYWxseTsKLQkJLyogSG93IG1hbnkgYnl0ZXMgZG8gd2UgbmVlZD8gIFRoZXJlIGFyZSBuYml0cyA+PiAzIGZ1bGwKLQkJICogYnl0ZXMgb2YgZGF0YSwgYW5kIG5iaXRzICYgNyBsZWZ0b3ZlciBiaXRzLiAgSWYgdGhlcmUKLQkJICogYXJlIGFueSBsZWZ0b3ZlciBiaXRzLCB0aGVuIHdlIGNsZWFybHkgbmVlZCBhbm90aGVyCi0JCSAqIGJ5dGUuICBXbmF0J3Mgbm90IHNvIG9idmlvdXMgaXMgdGhhdCB3ZSAqcHJvYmFibHkqCi0JCSAqIG5lZWQgYW5vdGhlciBieXRlIGV2ZW4gaWYgdGhlcmUgYXJlbid0IGFueSBsZWZ0b3ZlcnM6Ci0JCSAqIHRoZSBtb3N0LXNpZ25pZmljYW50IGJpdCBvZiB0aGUgbW9zdC1zaWduaWZpY2FudCBieXRlCi0JCSAqIGFjdHMgbGlrZSBhIHNpZ24gYml0LCBhbmQgaXQncyB1c3VhbGx5IGdvdCBhIHNlbnNlCi0JCSAqIG9wcG9zaXRlIG9mIHRoZSBvbmUgd2UgbmVlZC4gIFRoZSBleGNlcHRpb24gaXMgbG9uZ3MKLQkJICogb2YgdGhlIGZvcm0gLSgyKiooOCpqLTEpKSBmb3IgaiA+IDAuICBTdWNoIGEgbG9uZyBpcwotCQkgKiBpdHMgb3duIDI1NidzLWNvbXBsZW1lbnQsIHNvIGhhcyB0aGUgcmlnaHQgc2lnbiBiaXQKLQkJICogZXZlbiB3aXRob3V0IHRoZSBleHRyYSBieXRlLiAgVGhhdCdzIGEgcGFpbiB0byBjaGVjawotCQkgKiBmb3IgaW4gYWR2YW5jZSwgdGhvdWdoLCBzbyB3ZSBhbHdheXMgZ3JhYiBhbiBleHRyYQotCQkgKiBieXRlIGF0IHRoZSBzdGFydCwgYW5kIGN1dCBpdCBiYWNrIGxhdGVyIGlmIHBvc3NpYmxlLgotCQkgKi8KLQkJbmJ5dGVzID0gKG5iaXRzID4+IDMpICsgMTsKLQkJaWYgKG5ieXRlcyA+IElOVF9NQVgpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLCAibG9uZyB0b28gbGFyZ2UgIgotCQkJCSJ0byBwaWNrbGUiKTsKLQkJCWdvdG8gZmluYWxseTsKLQkJfQotCQlyZXByID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgKGludCluYnl0ZXMpOwotCQlpZiAocmVwciA9PSBOVUxMKSBnb3RvIGZpbmFsbHk7Ci0JCXBkYXRhID0gKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19BU19TVFJJTkcocmVwcik7Ci0JCWkgPSBfUHlMb25nX0FzQnl0ZUFycmF5KChQeUxvbmdPYmplY3QgKilhcmdzLAotCSAJCQlwZGF0YSwgbmJ5dGVzLAotCQkJCTEgLyogbGl0dGxlIGVuZGlhbiAqLywgMSAvKiBzaWduZWQgKi8pOwotCQlpZiAoaSA8IDApIGdvdG8gZmluYWxseTsKLQkJLyogSWYgdGhlIGxvbmcgaXMgbmVnYXRpdmUsIHRoaXMgbWF5IGJlIGEgYnl0ZSBtb3JlIHRoYW4KLQkJICogbmVlZGVkLiAgVGhpcyBpcyBzbyBpZmYgdGhlIE1TQiBpcyBhbGwgcmVkdW5kYW50IHNpZ24KLQkJICogYml0cy4KLQkJICovCi0JCWlmIChzaWduIDwgMCAmJiBuYnl0ZXMgPiAxICYmIHBkYXRhW25ieXRlcyAtIDFdID09IDB4ZmYgJiYKLQkJICAgIChwZGF0YVtuYnl0ZXMgLSAyXSAmIDB4ODApICE9IDApCi0JCQktLW5ieXRlczsKKyAgICAgICAgaWYgKHNpZ24gPT0gMCkgeworICAgICAgICAgICAgLyogSXQncyAwIC0tIGFuIGVtcHR5IGJ5dGVzdHJpbmcuICovCisgICAgICAgICAgICBjX3N0clswXSA9IExPTkcxOworICAgICAgICAgICAgY19zdHJbMV0gPSAwOworICAgICAgICAgICAgaSA9IHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgY19zdHIsIDIpOworICAgICAgICAgICAgaWYgKGkgPCAwKSBnb3RvIGZpbmFsbHk7CisgICAgICAgICAgICByZXMgPSAwOworICAgICAgICAgICAgZ290byBmaW5hbGx5OworICAgICAgICB9CisgICAgICAgIG5iaXRzID0gX1B5TG9uZ19OdW1CaXRzKGFyZ3MpOworICAgICAgICBpZiAobmJpdHMgPT0gKHNpemVfdCktMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgZ290byBmaW5hbGx5OworICAgICAgICAvKiBIb3cgbWFueSBieXRlcyBkbyB3ZSBuZWVkPyAgVGhlcmUgYXJlIG5iaXRzID4+IDMgZnVsbAorICAgICAgICAgKiBieXRlcyBvZiBkYXRhLCBhbmQgbmJpdHMgJiA3IGxlZnRvdmVyIGJpdHMuICBJZiB0aGVyZQorICAgICAgICAgKiBhcmUgYW55IGxlZnRvdmVyIGJpdHMsIHRoZW4gd2UgY2xlYXJseSBuZWVkIGFub3RoZXIKKyAgICAgICAgICogYnl0ZS4gIFduYXQncyBub3Qgc28gb2J2aW91cyBpcyB0aGF0IHdlICpwcm9iYWJseSoKKyAgICAgICAgICogbmVlZCBhbm90aGVyIGJ5dGUgZXZlbiBpZiB0aGVyZSBhcmVuJ3QgYW55IGxlZnRvdmVyczoKKyAgICAgICAgICogdGhlIG1vc3Qtc2lnbmlmaWNhbnQgYml0IG9mIHRoZSBtb3N0LXNpZ25pZmljYW50IGJ5dGUKKyAgICAgICAgICogYWN0cyBsaWtlIGEgc2lnbiBiaXQsIGFuZCBpdCdzIHVzdWFsbHkgZ290IGEgc2Vuc2UKKyAgICAgICAgICogb3Bwb3NpdGUgb2YgdGhlIG9uZSB3ZSBuZWVkLiAgVGhlIGV4Y2VwdGlvbiBpcyBsb25ncworICAgICAgICAgKiBvZiB0aGUgZm9ybSAtKDIqKig4KmotMSkpIGZvciBqID4gMC4gIFN1Y2ggYSBsb25nIGlzCisgICAgICAgICAqIGl0cyBvd24gMjU2J3MtY29tcGxlbWVudCwgc28gaGFzIHRoZSByaWdodCBzaWduIGJpdAorICAgICAgICAgKiBldmVuIHdpdGhvdXQgdGhlIGV4dHJhIGJ5dGUuICBUaGF0J3MgYSBwYWluIHRvIGNoZWNrCisgICAgICAgICAqIGZvciBpbiBhZHZhbmNlLCB0aG91Z2gsIHNvIHdlIGFsd2F5cyBncmFiIGFuIGV4dHJhCisgICAgICAgICAqIGJ5dGUgYXQgdGhlIHN0YXJ0LCBhbmQgY3V0IGl0IGJhY2sgbGF0ZXIgaWYgcG9zc2libGUuCisgICAgICAgICAqLworICAgICAgICBuYnl0ZXMgPSAobmJpdHMgPj4gMykgKyAxOworICAgICAgICBpZiAobmJ5dGVzID4gSU5UX01BWCkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsICJsb25nIHRvbyBsYXJnZSAiCisgICAgICAgICAgICAgICAgInRvIHBpY2tsZSIpOworICAgICAgICAgICAgZ290byBmaW5hbGx5OworICAgICAgICB9CisgICAgICAgIHJlcHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCAoaW50KW5ieXRlcyk7CisgICAgICAgIGlmIChyZXByID09IE5VTEwpIGdvdG8gZmluYWxseTsKKyAgICAgICAgcGRhdGEgPSAodW5zaWduZWQgY2hhciAqKVB5U3RyaW5nX0FTX1NUUklORyhyZXByKTsKKyAgICAgICAgaSA9IF9QeUxvbmdfQXNCeXRlQXJyYXkoKFB5TG9uZ09iamVjdCAqKWFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICBwZGF0YSwgbmJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgMSAvKiBsaXR0bGUgZW5kaWFuICovLCAxIC8qIHNpZ25lZCAqLyk7CisgICAgICAgIGlmIChpIDwgMCkgZ290byBmaW5hbGx5OworICAgICAgICAvKiBJZiB0aGUgbG9uZyBpcyBuZWdhdGl2ZSwgdGhpcyBtYXkgYmUgYSBieXRlIG1vcmUgdGhhbgorICAgICAgICAgKiBuZWVkZWQuICBUaGlzIGlzIHNvIGlmZiB0aGUgTVNCIGlzIGFsbCByZWR1bmRhbnQgc2lnbgorICAgICAgICAgKiBiaXRzLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHNpZ24gPCAwICYmIG5ieXRlcyA+IDEgJiYgcGRhdGFbbmJ5dGVzIC0gMV0gPT0gMHhmZiAmJgorICAgICAgICAgICAgKHBkYXRhW25ieXRlcyAtIDJdICYgMHg4MCkgIT0gMCkKKyAgICAgICAgICAgIC0tbmJ5dGVzOwogCi0JCWlmIChuYnl0ZXMgPCAyNTYpIHsKLQkJCWNfc3RyWzBdID0gTE9ORzE7Ci0JCQljX3N0clsxXSA9IChjaGFyKW5ieXRlczsKLQkJCXNpemUgPSAyOwotCQl9Ci0JCWVsc2UgewotCQkJY19zdHJbMF0gPSBMT05HNDsKLQkJCXNpemUgPSAoaW50KW5ieXRlczsKLQkJCWZvciAoaSA9IDE7IGkgPCA1OyBpKyspIHsKLQkJCQljX3N0cltpXSA9IChjaGFyKShzaXplICYgMHhmZik7Ci0JCQkJc2l6ZSA+Pj0gODsKLQkJCX0KLQkJCXNpemUgPSA1OwotCQl9Ci0JCWkgPSBzZWxmLT53cml0ZV9mdW5jKHNlbGYsIGNfc3RyLCBzaXplKTsKLQkJaWYgKGkgPCAwKSBnb3RvIGZpbmFsbHk7Ci0JCWkgPSBzZWxmLT53cml0ZV9mdW5jKHNlbGYsIChjaGFyICopcGRhdGEsIChpbnQpbmJ5dGVzKTsKLQkJaWYgKGkgPCAwKSBnb3RvIGZpbmFsbHk7Ci0JCXJlcyA9IDA7Ci0JCWdvdG8gZmluYWxseTsKLQl9CisgICAgICAgIGlmIChuYnl0ZXMgPCAyNTYpIHsKKyAgICAgICAgICAgIGNfc3RyWzBdID0gTE9ORzE7CisgICAgICAgICAgICBjX3N0clsxXSA9IChjaGFyKW5ieXRlczsKKyAgICAgICAgICAgIHNpemUgPSAyOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgY19zdHJbMF0gPSBMT05HNDsKKyAgICAgICAgICAgIHNpemUgPSAoaW50KW5ieXRlczsKKyAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCA1OyBpKyspIHsKKyAgICAgICAgICAgICAgICBjX3N0cltpXSA9IChjaGFyKShzaXplICYgMHhmZik7CisgICAgICAgICAgICAgICAgc2l6ZSA+Pj0gODsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNpemUgPSA1OworICAgICAgICB9CisgICAgICAgIGkgPSBzZWxmLT53cml0ZV9mdW5jKHNlbGYsIGNfc3RyLCBzaXplKTsKKyAgICAgICAgaWYgKGkgPCAwKSBnb3RvIGZpbmFsbHk7CisgICAgICAgIGkgPSBzZWxmLT53cml0ZV9mdW5jKHNlbGYsIChjaGFyICopcGRhdGEsIChpbnQpbmJ5dGVzKTsKKyAgICAgICAgaWYgKGkgPCAwKSBnb3RvIGZpbmFsbHk7CisgICAgICAgIHJlcyA9IDA7CisgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICB9CiAKLQkvKiBwcm90byA8IDI6ICB3cml0ZSB0aGUgcmVwciBhbmQgbmV3bGluZS4gIFRoaXMgaXMgcXVhZHJhdGljLXRpbWUKLQkgKiAoaW4gdGhlIG51bWJlciBvZiBkaWdpdHMpLCBpbiBib3RoIGRpcmVjdGlvbnMuCi0JICovCi0JaWYgKCEoIHJlcHIgPSBQeU9iamVjdF9SZXByKGFyZ3MpKSkKLQkJZ290byBmaW5hbGx5OworICAgIC8qIHByb3RvIDwgMjogIHdyaXRlIHRoZSByZXByIGFuZCBuZXdsaW5lLiAgVGhpcyBpcyBxdWFkcmF0aWMtdGltZQorICAgICAqIChpbiB0aGUgbnVtYmVyIG9mIGRpZ2l0cyksIGluIGJvdGggZGlyZWN0aW9ucy4KKyAgICAgKi8KKyAgICBpZiAoISggcmVwciA9IFB5T2JqZWN0X1JlcHIoYXJncykpKQorICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQlpZiAoKHNpemUgPSBQeVN0cmluZ19TaXplKHJlcHIpKSA8IDApCi0JCWdvdG8gZmluYWxseTsKKyAgICBpZiAoKHNpemUgPSBQeVN0cmluZ19TaXplKHJlcHIpKSA8IDApCisgICAgICAgIGdvdG8gZmluYWxseTsKIAotCWlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsICZsLCAxKSA8IDApCi0JCWdvdG8gZmluYWxseTsKKyAgICBpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCAmbCwgMSkgPCAwKQorICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQlpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLAotCQkJICAgICBQeVN0cmluZ19BU19TVFJJTkcoKFB5U3RyaW5nT2JqZWN0ICopcmVwciksCi0JCQkgICAgIAkJCXNpemUpIDwgMCkKLQkJZ290byBmaW5hbGx5OworICAgIGlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKChQeVN0cmluZ09iamVjdCAqKXJlcHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplKSA8IDApCisgICAgICAgIGdvdG8gZmluYWxseTsKIAotCWlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsICJcbiIsIDEpIDwgMCkKLQkJZ290byBmaW5hbGx5OworICAgIGlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsICJcbiIsIDEpIDwgMCkKKyAgICAgICAgZ290byBmaW5hbGx5OwogCi0JcmVzID0gMDsKKyAgICByZXMgPSAwOwogCiAgIGZpbmFsbHk6Ci0JUHlfWERFQ1JFRihyZXByKTsKLQlyZXR1cm4gcmVzOworICAgIFB5X1hERUNSRUYocmVwcik7CisgICAgcmV0dXJuIHJlczsKIH0KIAogCiBzdGF0aWMgaW50CiBzYXZlX2Zsb2F0KFBpY2tsZXJvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWRvdWJsZSB4ID0gUHlGbG9hdF9BU19ET1VCTEUoKFB5RmxvYXRPYmplY3QgKilhcmdzKTsKKyAgICBkb3VibGUgeCA9IFB5RmxvYXRfQVNfRE9VQkxFKChQeUZsb2F0T2JqZWN0ICopYXJncyk7CiAKLQlpZiAoc2VsZi0+YmluKSB7Ci0JCWNoYXIgc3RyWzldOwotCQlzdHJbMF0gPSBCSU5GTE9BVDsKLQkJaWYgKF9QeUZsb2F0X1BhY2s4KHgsICh1bnNpZ25lZCBjaGFyICopJnN0clsxXSwgMCkgPCAwKQotCQkJcmV0dXJuIC0xOwotCQlpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCBzdHIsIDkpIDwgMCkKLQkJCXJldHVybiAtMTsKLQl9Ci0JZWxzZSB7Ci0JCWNoYXIgY19zdHJbMjUwXTsKLQkJY19zdHJbMF0gPSBGTE9BVDsKLQkJUHlPU19hc2NpaV9mb3JtYXRkKGNfc3RyICsgMSwgc2l6ZW9mKGNfc3RyKSAtIDIsICIlLjE3ZyIsIHgpOwotCQkvKiBFeHRlbmQgdGhlIGZvcm1hdHRlZCBzdHJpbmcgd2l0aCBhIG5ld2xpbmUgY2hhcmFjdGVyICovCi0JCXN0cmNhdChjX3N0ciwgIlxuIik7CisgICAgaWYgKHNlbGYtPmJpbikgeworICAgICAgICBjaGFyIHN0cls5XTsKKyAgICAgICAgc3RyWzBdID0gQklORkxPQVQ7CisgICAgICAgIGlmIChfUHlGbG9hdF9QYWNrOCh4LCAodW5zaWduZWQgY2hhciAqKSZzdHJbMV0sIDApIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgc3RyLCA5KSA8IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBjaGFyIGNfc3RyWzI1MF07CisgICAgICAgIGNfc3RyWzBdID0gRkxPQVQ7CisgICAgICAgIFB5T1NfYXNjaWlfZm9ybWF0ZChjX3N0ciArIDEsIHNpemVvZihjX3N0cikgLSAyLCAiJS4xN2ciLCB4KTsKKyAgICAgICAgLyogRXh0ZW5kIHRoZSBmb3JtYXR0ZWQgc3RyaW5nIHdpdGggYSBuZXdsaW5lIGNoYXJhY3RlciAqLworICAgICAgICBzdHJjYXQoY19zdHIsICJcbiIpOwogCi0JCWlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsIGNfc3RyLCBzdHJsZW4oY19zdHIpKSA8IDApCi0JCQlyZXR1cm4gLTE7Ci0JfQorICAgICAgICBpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCBjX3N0ciwgc3RybGVuKGNfc3RyKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCXJldHVybiAwOworICAgIHJldHVybiAwOwogfQogCiAKIHN0YXRpYyBpbnQKIHNhdmVfc3RyaW5nKFBpY2tsZXJvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBpbnQgZG9wdXQpCiB7Ci0JaW50IHNpemUsIGxlbjsKLQlQeU9iamVjdCAqcmVwcj0wOworICAgIGludCBzaXplLCBsZW47CisgICAgUHlPYmplY3QgKnJlcHI9MDsKIAotCWlmICgoc2l6ZSA9IFB5U3RyaW5nX1NpemUoYXJncykpIDwgMCkKLQkJcmV0dXJuIC0xOworICAgIGlmICgoc2l6ZSA9IFB5U3RyaW5nX1NpemUoYXJncykpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0JaWYgKCFzZWxmLT5iaW4pIHsKLQkJY2hhciAqcmVwcl9zdHI7CisgICAgaWYgKCFzZWxmLT5iaW4pIHsKKyAgICAgICAgY2hhciAqcmVwcl9zdHI7CiAKLQkJc3RhdGljIGNoYXIgc3RyaW5nID0gU1RSSU5HOworICAgICAgICBzdGF0aWMgY2hhciBzdHJpbmcgPSBTVFJJTkc7CiAKLQkJaWYgKCEoIHJlcHIgPSBQeU9iamVjdF9SZXByKGFyZ3MpKSkKLQkJCXJldHVybiAtMTsKKyAgICAgICAgaWYgKCEoIHJlcHIgPSBQeU9iamVjdF9SZXByKGFyZ3MpKSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKIAotCQlpZiAoKGxlbiA9IFB5U3RyaW5nX1NpemUocmVwcikpIDwgMCkKLQkJCWdvdG8gZXJyOwotCQlyZXByX3N0ciA9IFB5U3RyaW5nX0FTX1NUUklORygoUHlTdHJpbmdPYmplY3QgKilyZXByKTsKKyAgICAgICAgaWYgKChsZW4gPSBQeVN0cmluZ19TaXplKHJlcHIpKSA8IDApCisgICAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgcmVwcl9zdHIgPSBQeVN0cmluZ19BU19TVFJJTkcoKFB5U3RyaW5nT2JqZWN0ICopcmVwcik7CiAKLQkJaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgJnN0cmluZywgMSkgPCAwKQotCQkJZ290byBlcnI7CisgICAgICAgIGlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsICZzdHJpbmcsIDEpIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZXJyOwogCi0JCWlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsIHJlcHJfc3RyLCBsZW4pIDwgMCkKLQkJCWdvdG8gZXJyOworICAgICAgICBpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCByZXByX3N0ciwgbGVuKSA8IDApCisgICAgICAgICAgICBnb3RvIGVycjsKIAotCQlpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCAiXG4iLCAxKSA8IDApCi0JCQlnb3RvIGVycjsKKyAgICAgICAgaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgIlxuIiwgMSkgPCAwKQorICAgICAgICAgICAgZ290byBlcnI7CiAKLQkJUHlfWERFQ1JFRihyZXByKTsKLQl9Ci0JZWxzZSB7Ci0JCWludCBpOwotCQljaGFyIGNfc3RyWzVdOworICAgICAgICBQeV9YREVDUkVGKHJlcHIpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGNoYXIgY19zdHJbNV07CiAKLQkJaWYgKChzaXplID0gUHlTdHJpbmdfU2l6ZShhcmdzKSkgPCAwKQotCQkJcmV0dXJuIC0xOworICAgICAgICBpZiAoKHNpemUgPSBQeVN0cmluZ19TaXplKGFyZ3MpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CiAKLQkJaWYgKHNpemUgPCAyNTYpIHsKLQkJCWNfc3RyWzBdID0gU0hPUlRfQklOU1RSSU5HOwotCQkJY19zdHJbMV0gPSBzaXplOwotCQkJbGVuID0gMjsKLQkJfQotCQllbHNlIGlmIChzaXplIDw9IElOVF9NQVgpIHsKLQkJCWNfc3RyWzBdID0gQklOU1RSSU5HOwotCQkJZm9yIChpID0gMTsgaSA8IDU7IGkrKykKLQkJCQljX3N0cltpXSA9IChpbnQpKHNpemUgPj4gKChpIC0gMSkgKiA4KSk7Ci0JCQlsZW4gPSA1OwotCQl9Ci0JCWVsc2UKLQkJCXJldHVybiAtMTsgICAgLyogc3RyaW5nIHRvbyBsYXJnZSAqLworICAgICAgICBpZiAoc2l6ZSA8IDI1NikgeworICAgICAgICAgICAgY19zdHJbMF0gPSBTSE9SVF9CSU5TVFJJTkc7CisgICAgICAgICAgICBjX3N0clsxXSA9IHNpemU7CisgICAgICAgICAgICBsZW4gPSAyOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHNpemUgPD0gSU5UX01BWCkgeworICAgICAgICAgICAgY19zdHJbMF0gPSBCSU5TVFJJTkc7CisgICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgNTsgaSsrKQorICAgICAgICAgICAgICAgIGNfc3RyW2ldID0gKGludCkoc2l6ZSA+PiAoKGkgLSAxKSAqIDgpKTsKKyAgICAgICAgICAgIGxlbiA9IDU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIC0xOyAgICAvKiBzdHJpbmcgdG9vIGxhcmdlICovCiAKLQkJaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgY19zdHIsIGxlbikgPCAwKQotCQkJcmV0dXJuIC0xOworICAgICAgICBpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCBjX3N0ciwgbGVuKSA8IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CiAKLQkJaWYgKHNpemUgPiAxMjggJiYgUGRhdGFfQ2hlY2soc2VsZi0+ZmlsZSkpIHsKLQkJCWlmICh3cml0ZV9vdGhlcihzZWxmLCBOVUxMLCAwKSA8IDApIHJldHVybiAtMTsKLQkJCVBEQVRBX0FQUEVORChzZWxmLT5maWxlLCBhcmdzLCAtMSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLAotCQkJCQkgICAgIFB5U3RyaW5nX0FTX1NUUklORygKLQkJCQkJICAgICAJKFB5U3RyaW5nT2JqZWN0ICopYXJncyksCi0JCQkJCSAgICAgc2l6ZSkgPCAwKQotCQkJCXJldHVybiAtMTsKLQkJfQotCX0KKyAgICAgICAgaWYgKHNpemUgPiAxMjggJiYgUGRhdGFfQ2hlY2soc2VsZi0+ZmlsZSkpIHsKKyAgICAgICAgICAgIGlmICh3cml0ZV9vdGhlcihzZWxmLCBOVUxMLCAwKSA8IDApIHJldHVybiAtMTsKKyAgICAgICAgICAgIFBEQVRBX0FQUEVORChzZWxmLT5maWxlLCBhcmdzLCAtMSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFB5U3RyaW5nT2JqZWN0ICopYXJncyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQogCi0JaWYgKGRvcHV0KQotCQlpZiAocHV0KHNlbGYsIGFyZ3MpIDwgMCkKLQkJCXJldHVybiAtMTsKKyAgICBpZiAoZG9wdXQpCisgICAgICAgIGlmIChwdXQoc2VsZiwgYXJncykgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOwogCi0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiAKICAgZXJyOgotCVB5X1hERUNSRUYocmVwcik7Ci0JcmV0dXJuIC0xOworICAgIFB5X1hERUNSRUYocmVwcik7CisgICAgcmV0dXJuIC0xOwogfQogCiAKQEAgLTEyODMsNzEgKzEyODMsNzEgQEAKICNlbmRpZgogCiAgICAgaWYgKHNpemUgPiBQWV9TU0laRV9UX01BWCAvIGV4cGFuZHNpemUpCi0gICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOwogCiAgICAgcmVwciA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGV4cGFuZHNpemUgKiBzaXplKTsKICAgICBpZiAocmVwciA9PSBOVUxMKQotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gTlVMTDsKICAgICBpZiAoc2l6ZSA9PSAwKQotCXJldHVybiByZXByOworICAgIHJldHVybiByZXByOwogCiAgICAgcCA9IHEgPSBQeVN0cmluZ19BU19TVFJJTkcocmVwcik7CiAgICAgd2hpbGUgKHNpemUtLSA+IDApIHsKLSAgICAgICAgUHlfVU5JQ09ERSBjaCA9ICpzKys7CisgICAgUHlfVU5JQ09ERSBjaCA9ICpzKys7CiAjaWZkZWYgUHlfVU5JQ09ERV9XSURFCi0JLyogTWFwIDMyLWJpdCBjaGFyYWN0ZXJzIHRvICdcVXh4eHh4eHh4JyAqLwotCWlmIChjaCA+PSAweDEwMDAwKSB7Ci0gICAgICAgICAgICAqcCsrID0gJ1xcJzsKLSAgICAgICAgICAgICpwKysgPSAnVSc7Ci0gICAgICAgICAgICAqcCsrID0gaGV4ZGlnaXRbKGNoID4+IDI4KSAmIDB4Zl07Ci0gICAgICAgICAgICAqcCsrID0gaGV4ZGlnaXRbKGNoID4+IDI0KSAmIDB4Zl07Ci0gICAgICAgICAgICAqcCsrID0gaGV4ZGlnaXRbKGNoID4+IDIwKSAmIDB4Zl07Ci0gICAgICAgICAgICAqcCsrID0gaGV4ZGlnaXRbKGNoID4+IDE2KSAmIDB4Zl07Ci0gICAgICAgICAgICAqcCsrID0gaGV4ZGlnaXRbKGNoID4+IDEyKSAmIDB4Zl07Ci0gICAgICAgICAgICAqcCsrID0gaGV4ZGlnaXRbKGNoID4+IDgpICYgMHhmXTsKLSAgICAgICAgICAgICpwKysgPSBoZXhkaWdpdFsoY2ggPj4gNCkgJiAweGZdOwotICAgICAgICAgICAgKnArKyA9IGhleGRpZ2l0W2NoICYgMTVdOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKKyAgICAvKiBNYXAgMzItYml0IGNoYXJhY3RlcnMgdG8gJ1xVeHh4eHh4eHgnICovCisgICAgaWYgKGNoID49IDB4MTAwMDApIHsKKyAgICAgICAgKnArKyA9ICdcXCc7CisgICAgICAgICpwKysgPSAnVSc7CisgICAgICAgICpwKysgPSBoZXhkaWdpdFsoY2ggPj4gMjgpICYgMHhmXTsKKyAgICAgICAgKnArKyA9IGhleGRpZ2l0WyhjaCA+PiAyNCkgJiAweGZdOworICAgICAgICAqcCsrID0gaGV4ZGlnaXRbKGNoID4+IDIwKSAmIDB4Zl07CisgICAgICAgICpwKysgPSBoZXhkaWdpdFsoY2ggPj4gMTYpICYgMHhmXTsKKyAgICAgICAgKnArKyA9IGhleGRpZ2l0WyhjaCA+PiAxMikgJiAweGZdOworICAgICAgICAqcCsrID0gaGV4ZGlnaXRbKGNoID4+IDgpICYgMHhmXTsKKyAgICAgICAgKnArKyA9IGhleGRpZ2l0WyhjaCA+PiA0KSAmIDB4Zl07CisgICAgICAgICpwKysgPSBoZXhkaWdpdFtjaCAmIDE1XTsKKyAgICB9CisgICAgZWxzZQogI2Vsc2UKLQkvKiBNYXAgVVRGLTE2IHN1cnJvZ2F0ZSBwYWlycyB0byAnXFUwMHh4eHh4eCcgKi8KLQlpZiAoY2ggPj0gMHhEODAwICYmIGNoIDwgMHhEQzAwKSB7Ci0JICAgIFB5X1VOSUNPREUgY2gyOwotCSAgICBQeV9VQ1M0IHVjczsKKyAgICAvKiBNYXAgVVRGLTE2IHN1cnJvZ2F0ZSBwYWlycyB0byAnXFUwMHh4eHh4eCcgKi8KKyAgICBpZiAoY2ggPj0gMHhEODAwICYmIGNoIDwgMHhEQzAwKSB7CisgICAgICAgIFB5X1VOSUNPREUgY2gyOworICAgICAgICBQeV9VQ1M0IHVjczsKIAotCSAgICBjaDIgPSAqcysrOwotCSAgICBzaXplLS07Ci0JICAgIGlmIChjaDIgPj0gMHhEQzAwICYmIGNoMiA8PSAweERGRkYpIHsKLQkJdWNzID0gKCgoY2ggJiAweDAzRkYpIDw8IDEwKSB8IChjaDIgJiAweDAzRkYpKSArIDB4MDAwMTAwMDA7Ci0JCSpwKysgPSAnXFwnOwotCQkqcCsrID0gJ1UnOwotCQkqcCsrID0gaGV4ZGlnaXRbKHVjcyA+PiAyOCkgJiAweGZdOwotCQkqcCsrID0gaGV4ZGlnaXRbKHVjcyA+PiAyNCkgJiAweGZdOwotCQkqcCsrID0gaGV4ZGlnaXRbKHVjcyA+PiAyMCkgJiAweGZdOwotCQkqcCsrID0gaGV4ZGlnaXRbKHVjcyA+PiAxNikgJiAweGZdOwotCQkqcCsrID0gaGV4ZGlnaXRbKHVjcyA+PiAxMikgJiAweGZdOwotCQkqcCsrID0gaGV4ZGlnaXRbKHVjcyA+PiA4KSAmIDB4Zl07Ci0JCSpwKysgPSBoZXhkaWdpdFsodWNzID4+IDQpICYgMHhmXTsKLQkJKnArKyA9IGhleGRpZ2l0W3VjcyAmIDB4Zl07Ci0JCWNvbnRpbnVlOwotCSAgICB9Ci0JICAgIC8qIEZhbGwgdGhyb3VnaDogaXNvbGF0ZWQgc3Vycm9nYXRlcyBhcmUgY29waWVkIGFzLWlzICovCi0JICAgIHMtLTsKLQkgICAgc2l6ZSsrOwotCX0KLSNlbmRpZgotCS8qIE1hcCAxNi1iaXQgY2hhcmFjdGVycyB0byAnXHV4eHh4JyAqLwotCWlmIChjaCA+PSAyNTYgfHwgY2ggPT0gJ1xcJyB8fCBjaCA9PSAnXG4nKSB7Ci0gICAgICAgICAgICAqcCsrID0gJ1xcJzsKLSAgICAgICAgICAgICpwKysgPSAndSc7Ci0gICAgICAgICAgICAqcCsrID0gaGV4ZGlnaXRbKGNoID4+IDEyKSAmIDB4Zl07Ci0gICAgICAgICAgICAqcCsrID0gaGV4ZGlnaXRbKGNoID4+IDgpICYgMHhmXTsKLSAgICAgICAgICAgICpwKysgPSBoZXhkaWdpdFsoY2ggPj4gNCkgJiAweGZdOwotICAgICAgICAgICAgKnArKyA9IGhleGRpZ2l0W2NoICYgMTVdOworICAgICAgICBjaDIgPSAqcysrOworICAgICAgICBzaXplLS07CisgICAgICAgIGlmIChjaDIgPj0gMHhEQzAwICYmIGNoMiA8PSAweERGRkYpIHsKKyAgICAgICAgdWNzID0gKCgoY2ggJiAweDAzRkYpIDw8IDEwKSB8IChjaDIgJiAweDAzRkYpKSArIDB4MDAwMTAwMDA7CisgICAgICAgICpwKysgPSAnXFwnOworICAgICAgICAqcCsrID0gJ1UnOworICAgICAgICAqcCsrID0gaGV4ZGlnaXRbKHVjcyA+PiAyOCkgJiAweGZdOworICAgICAgICAqcCsrID0gaGV4ZGlnaXRbKHVjcyA+PiAyNCkgJiAweGZdOworICAgICAgICAqcCsrID0gaGV4ZGlnaXRbKHVjcyA+PiAyMCkgJiAweGZdOworICAgICAgICAqcCsrID0gaGV4ZGlnaXRbKHVjcyA+PiAxNikgJiAweGZdOworICAgICAgICAqcCsrID0gaGV4ZGlnaXRbKHVjcyA+PiAxMikgJiAweGZdOworICAgICAgICAqcCsrID0gaGV4ZGlnaXRbKHVjcyA+PiA4KSAmIDB4Zl07CisgICAgICAgICpwKysgPSBoZXhkaWdpdFsodWNzID4+IDQpICYgMHhmXTsKKyAgICAgICAgKnArKyA9IGhleGRpZ2l0W3VjcyAmIDB4Zl07CisgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9Ci0JLyogQ29weSBldmVyeXRoaW5nIGVsc2UgYXMtaXMgKi8KLQllbHNlCi0gICAgICAgICAgICAqcCsrID0gKGNoYXIpIGNoOworICAgICAgICAvKiBGYWxsIHRocm91Z2g6IGlzb2xhdGVkIHN1cnJvZ2F0ZXMgYXJlIGNvcGllZCBhcy1pcyAqLworICAgICAgICBzLS07CisgICAgICAgIHNpemUrKzsKKyAgICB9CisjZW5kaWYKKyAgICAvKiBNYXAgMTYtYml0IGNoYXJhY3RlcnMgdG8gJ1x1eHh4eCcgKi8KKyAgICBpZiAoY2ggPj0gMjU2IHx8IGNoID09ICdcXCcgfHwgY2ggPT0gJ1xuJykgeworICAgICAgICAqcCsrID0gJ1xcJzsKKyAgICAgICAgKnArKyA9ICd1JzsKKyAgICAgICAgKnArKyA9IGhleGRpZ2l0WyhjaCA+PiAxMikgJiAweGZdOworICAgICAgICAqcCsrID0gaGV4ZGlnaXRbKGNoID4+IDgpICYgMHhmXTsKKyAgICAgICAgKnArKyA9IGhleGRpZ2l0WyhjaCA+PiA0KSAmIDB4Zl07CisgICAgICAgICpwKysgPSBoZXhkaWdpdFtjaCAmIDE1XTsKKyAgICB9CisgICAgLyogQ29weSBldmVyeXRoaW5nIGVsc2UgYXMtaXMgKi8KKyAgICBlbHNlCisgICAgICAgICpwKysgPSAoY2hhcikgY2g7CiAgICAgfQogICAgICpwID0gJ1wwJzsKICAgICBfUHlTdHJpbmdfUmVzaXplKCZyZXByLCBwIC0gcSk7CkBAIC0xMzU3LDc5ICsxMzU3LDc5IEBACiBzdGF0aWMgaW50CiBzYXZlX3VuaWNvZGUoUGlja2xlcm9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIGludCBkb3B1dCkKIHsKLQlQeV9zc2l6ZV90IHNpemUsIGxlbjsKLQlQeU9iamVjdCAqcmVwcj0wOworICAgIFB5X3NzaXplX3Qgc2l6ZSwgbGVuOworICAgIFB5T2JqZWN0ICpyZXByPTA7CiAKLQlpZiAoIVB5VW5pY29kZV9DaGVjayhhcmdzKSkKLQkJcmV0dXJuIC0xOworICAgIGlmICghUHlVbmljb2RlX0NoZWNrKGFyZ3MpKQorICAgICAgICByZXR1cm4gLTE7CiAKLQlpZiAoIXNlbGYtPmJpbikgewotCQljaGFyICpyZXByX3N0cjsKLQkJc3RhdGljIGNoYXIgc3RyaW5nID0gVU5JQ09ERTsKKyAgICBpZiAoIXNlbGYtPmJpbikgeworICAgICAgICBjaGFyICpyZXByX3N0cjsKKyAgICAgICAgc3RhdGljIGNoYXIgc3RyaW5nID0gVU5JQ09ERTsKIAotCQlyZXByID0gbW9kaWZpZWRfRW5jb2RlUmF3VW5pY29kZUVzY2FwZSgKLQkJCVB5VW5pY29kZV9BU19VTklDT0RFKGFyZ3MpLCBQeVVuaWNvZGVfR0VUX1NJWkUoYXJncykpOwotCQlpZiAoIXJlcHIpCi0JCQlyZXR1cm4gLTE7CisgICAgICAgIHJlcHIgPSBtb2RpZmllZF9FbmNvZGVSYXdVbmljb2RlRXNjYXBlKAorICAgICAgICAgICAgUHlVbmljb2RlX0FTX1VOSUNPREUoYXJncyksIFB5VW5pY29kZV9HRVRfU0laRShhcmdzKSk7CisgICAgICAgIGlmICghcmVwcikKKyAgICAgICAgICAgIHJldHVybiAtMTsKIAotCQlpZiAoKGxlbiA9IFB5U3RyaW5nX1NpemUocmVwcikpIDwgMCkKLQkJCWdvdG8gZXJyOwotCQlyZXByX3N0ciA9IFB5U3RyaW5nX0FTX1NUUklORygoUHlTdHJpbmdPYmplY3QgKilyZXByKTsKKyAgICAgICAgaWYgKChsZW4gPSBQeVN0cmluZ19TaXplKHJlcHIpKSA8IDApCisgICAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgcmVwcl9zdHIgPSBQeVN0cmluZ19BU19TVFJJTkcoKFB5U3RyaW5nT2JqZWN0ICopcmVwcik7CiAKLQkJaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgJnN0cmluZywgMSkgPCAwKQotCQkJZ290byBlcnI7CisgICAgICAgIGlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsICZzdHJpbmcsIDEpIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZXJyOwogCi0JCWlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsIHJlcHJfc3RyLCBsZW4pIDwgMCkKLQkJCWdvdG8gZXJyOworICAgICAgICBpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCByZXByX3N0ciwgbGVuKSA8IDApCisgICAgICAgICAgICBnb3RvIGVycjsKIAotCQlpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCAiXG4iLCAxKSA8IDApCi0JCQlnb3RvIGVycjsKKyAgICAgICAgaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgIlxuIiwgMSkgPCAwKQorICAgICAgICAgICAgZ290byBlcnI7CiAKLQkJUHlfWERFQ1JFRihyZXByKTsKLQl9Ci0JZWxzZSB7Ci0JCWludCBpOwotCQljaGFyIGNfc3RyWzVdOworICAgICAgICBQeV9YREVDUkVGKHJlcHIpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGNoYXIgY19zdHJbNV07CiAKLQkJaWYgKCEoIHJlcHIgPSBQeVVuaWNvZGVfQXNVVEY4U3RyaW5nKGFyZ3MpKSkKLQkJCXJldHVybiAtMTsKKyAgICAgICAgaWYgKCEoIHJlcHIgPSBQeVVuaWNvZGVfQXNVVEY4U3RyaW5nKGFyZ3MpKSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKIAotCQlpZiAoKHNpemUgPSBQeVN0cmluZ19TaXplKHJlcHIpKSA8IDApCi0JCQlnb3RvIGVycjsKLQkJaWYgKHNpemUgPiBJTlRfTUFYKQotCQkJcmV0dXJuIC0xOyAgIC8qIHN0cmluZyB0b28gbGFyZ2UgKi8KKyAgICAgICAgaWYgKChzaXplID0gUHlTdHJpbmdfU2l6ZShyZXByKSkgPCAwKQorICAgICAgICAgICAgZ290byBlcnI7CisgICAgICAgIGlmIChzaXplID4gSU5UX01BWCkKKyAgICAgICAgICAgIHJldHVybiAtMTsgICAvKiBzdHJpbmcgdG9vIGxhcmdlICovCiAKLQkJY19zdHJbMF0gPSBCSU5VTklDT0RFOwotCQlmb3IgKGkgPSAxOyBpIDwgNTsgaSsrKQotCQkJY19zdHJbaV0gPSAoaW50KShzaXplID4+ICgoaSAtIDEpICogOCkpOwotCQlsZW4gPSA1OworICAgICAgICBjX3N0clswXSA9IEJJTlVOSUNPREU7CisgICAgICAgIGZvciAoaSA9IDE7IGkgPCA1OyBpKyspCisgICAgICAgICAgICBjX3N0cltpXSA9IChpbnQpKHNpemUgPj4gKChpIC0gMSkgKiA4KSk7CisgICAgICAgIGxlbiA9IDU7CiAKLQkJaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgY19zdHIsIGxlbikgPCAwKQotCQkJZ290byBlcnI7CisgICAgICAgIGlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsIGNfc3RyLCBsZW4pIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZXJyOwogCi0JCWlmIChzaXplID4gMTI4ICYmIFBkYXRhX0NoZWNrKHNlbGYtPmZpbGUpKSB7Ci0JCQlpZiAod3JpdGVfb3RoZXIoc2VsZiwgTlVMTCwgMCkgPCAwKQotCQkJCWdvdG8gZXJyOwotCQkJUERBVEFfQVBQRU5EKHNlbGYtPmZpbGUsIHJlcHIsIC0xKTsKLQkJfQotCQllbHNlIHsKLQkJCWlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsIFB5U3RyaW5nX0FTX1NUUklORyhyZXByKSwKLQkJCQkJICAgICBzaXplKSA8IDApCi0JCQkJZ290byBlcnI7Ci0JCX0KKyAgICAgICAgaWYgKHNpemUgPiAxMjggJiYgUGRhdGFfQ2hlY2soc2VsZi0+ZmlsZSkpIHsKKyAgICAgICAgICAgIGlmICh3cml0ZV9vdGhlcihzZWxmLCBOVUxMLCAwKSA8IDApCisgICAgICAgICAgICAgICAgZ290byBlcnI7CisgICAgICAgICAgICBQREFUQV9BUFBFTkQoc2VsZi0+ZmlsZSwgcmVwciwgLTEpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgUHlTdHJpbmdfQVNfU1RSSU5HKHJlcHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSkgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gZXJyOworICAgICAgICB9CiAKLQkJUHlfREVDUkVGKHJlcHIpOwotCX0KKyAgICAgICAgUHlfREVDUkVGKHJlcHIpOworICAgIH0KIAotCWlmIChkb3B1dCkKLQkJaWYgKHB1dChzZWxmLCBhcmdzKSA8IDApCi0JCQlyZXR1cm4gLTE7CisgICAgaWYgKGRvcHV0KQorICAgICAgICBpZiAocHV0KHNlbGYsIGFyZ3MpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKIAotCXJldHVybiAwOworICAgIHJldHVybiAwOwogCiAgIGVycjoKLQlQeV9YREVDUkVGKHJlcHIpOwotCXJldHVybiAtMTsKKyAgICBQeV9YREVDUkVGKHJlcHIpOworICAgIHJldHVybiAtMTsKIH0KICNlbmRpZgogCkBAIC0xNDM3LDIzICsxNDM3LDIzIEBACiBzdGF0aWMgaW50CiBzdG9yZV90dXBsZV9lbGVtZW50cyhQaWNrbGVyb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdCwgaW50IGxlbikKIHsKLQlpbnQgaTsKLQlpbnQgcmVzID0gLTE7CS8qIGd1aWx0eSB1bnRpbCBwcm92ZWQgaW5ub2NlbnQgKi8KKyAgICBpbnQgaTsKKyAgICBpbnQgcmVzID0gLTE7ICAgICAgIC8qIGd1aWx0eSB1bnRpbCBwcm92ZWQgaW5ub2NlbnQgKi8KIAotCWFzc2VydChQeVR1cGxlX1NpemUodCkgPT0gbGVuKTsKKyAgICBhc3NlcnQoUHlUdXBsZV9TaXplKHQpID09IGxlbik7CiAKLQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJUHlPYmplY3QgKmVsZW1lbnQgPSBQeVR1cGxlX0dFVF9JVEVNKHQsIGkpOworICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICBQeU9iamVjdCAqZWxlbWVudCA9IFB5VHVwbGVfR0VUX0lURU0odCwgaSk7CiAKLQkJaWYgKGVsZW1lbnQgPT0gTlVMTCkKLQkJCWdvdG8gZmluYWxseTsKLQkJaWYgKHNhdmUoc2VsZiwgZWxlbWVudCwgMCkgPCAwKQotCQkJZ290byBmaW5hbGx5OwotCX0KLQlyZXMgPSAwOworICAgICAgICBpZiAoZWxlbWVudCA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBmaW5hbGx5OworICAgICAgICBpZiAoc2F2ZShzZWxmLCBlbGVtZW50LCAwKSA8IDApCisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgfQorICAgIHJlcyA9IDA7CiAKICAgZmluYWxseToKLQlyZXR1cm4gcmVzOworICAgIHJldHVybiByZXM7CiB9CiAKIC8qIFR1cGxlcyBhcmUgdWJpcXVpdG91cyBpbiB0aGUgcGlja2xlIHByb3RvY29scywgc28gbWFueSB0ZWNobmlxdWVzIGFyZQpAQCAtMTQ2NSwxMDggKzE0NjUsMTA4IEBACiBzdGF0aWMgaW50CiBzYXZlX3R1cGxlKFBpY2tsZXJvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICpweV90dXBsZV9pZCA9IE5VTEw7Ci0JaW50IGxlbiwgaTsKLQlpbnQgcmVzID0gLTE7CisgICAgUHlPYmplY3QgKnB5X3R1cGxlX2lkID0gTlVMTDsKKyAgICBpbnQgbGVuLCBpOworICAgIGludCByZXMgPSAtMTsKIAotCXN0YXRpYyBjaGFyIHR1cGxlID0gVFVQTEU7Ci0Jc3RhdGljIGNoYXIgcG9wID0gUE9QOwotCXN0YXRpYyBjaGFyIHBvcF9tYXJrID0gUE9QX01BUks7Ci0Jc3RhdGljIGNoYXIgbGVuMm9wY29kZVtdID0ge0VNUFRZX1RVUExFLCBUVVBMRTEsIFRVUExFMiwgVFVQTEUzfTsKKyAgICBzdGF0aWMgY2hhciB0dXBsZSA9IFRVUExFOworICAgIHN0YXRpYyBjaGFyIHBvcCA9IFBPUDsKKyAgICBzdGF0aWMgY2hhciBwb3BfbWFyayA9IFBPUF9NQVJLOworICAgIHN0YXRpYyBjaGFyIGxlbjJvcGNvZGVbXSA9IHtFTVBUWV9UVVBMRSwgVFVQTEUxLCBUVVBMRTIsIFRVUExFM307CiAKLQlpZiAoKGxlbiA9IFB5VHVwbGVfU2l6ZShhcmdzKSkgPCAwKQotCQlnb3RvIGZpbmFsbHk7CisgICAgaWYgKChsZW4gPSBQeVR1cGxlX1NpemUoYXJncykpIDwgMCkKKyAgICAgICAgZ290byBmaW5hbGx5OwogCi0JaWYgKGxlbiA9PSAwKSB7Ci0JCWNoYXIgY19zdHJbMl07CisgICAgaWYgKGxlbiA9PSAwKSB7CisgICAgICAgIGNoYXIgY19zdHJbMl07CiAKLQkJaWYgKHNlbGYtPnByb3RvKSB7Ci0JCQljX3N0clswXSA9IEVNUFRZX1RVUExFOwotCQkJbGVuID0gMTsKLQkJfQotCQllbHNlIHsKLQkJCWNfc3RyWzBdID0gTUFSSzsKLQkJCWNfc3RyWzFdID0gVFVQTEU7Ci0JCQlsZW4gPSAyOwotCQl9Ci0JCWlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsIGNfc3RyLCBsZW4pID49IDApCi0JCQlyZXMgPSAwOwotCQkvKiBEb24ndCBtZW1vaXplIGFuIGVtcHR5IHR1cGxlLiAqLwotCQlnb3RvIGZpbmFsbHk7Ci0JfQorICAgICAgICBpZiAoc2VsZi0+cHJvdG8pIHsKKyAgICAgICAgICAgIGNfc3RyWzBdID0gRU1QVFlfVFVQTEU7CisgICAgICAgICAgICBsZW4gPSAxOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgY19zdHJbMF0gPSBNQVJLOworICAgICAgICAgICAgY19zdHJbMV0gPSBUVVBMRTsKKyAgICAgICAgICAgIGxlbiA9IDI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgY19zdHIsIGxlbikgPj0gMCkKKyAgICAgICAgICAgIHJlcyA9IDA7CisgICAgICAgIC8qIERvbid0IG1lbW9pemUgYW4gZW1wdHkgdHVwbGUuICovCisgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICB9CiAKLQkvKiBBIG5vbi1lbXB0eSB0dXBsZS4gKi8KKyAgICAvKiBBIG5vbi1lbXB0eSB0dXBsZS4gKi8KIAotCS8qIGlkKHR1cGxlKSBpc24ndCBpbiB0aGUgbWVtbyBub3cuICBJZiBpdCBzaG93cyB1cCB0aGVyZSBhZnRlcgotCSAqIHNhdmluZyB0aGUgdHVwbGUgZWxlbWVudHMsIHRoZSB0dXBsZSBtdXN0IGJlIHJlY3Vyc2l2ZSwgaW4KLQkgKiB3aGljaCBjYXNlIHdlJ2xsIHBvcCBldmVyeXRoaW5nIHdlIHB1dCBvbiB0aGUgc3RhY2ssIGFuZCBmZXRjaAotCSAqIGl0cyB2YWx1ZSBmcm9tIHRoZSBtZW1vLgotCSAqLwotCXB5X3R1cGxlX2lkID0gUHlMb25nX0Zyb21Wb2lkUHRyKGFyZ3MpOwotCWlmIChweV90dXBsZV9pZCA9PSBOVUxMKQotCQlnb3RvIGZpbmFsbHk7CisgICAgLyogaWQodHVwbGUpIGlzbid0IGluIHRoZSBtZW1vIG5vdy4gIElmIGl0IHNob3dzIHVwIHRoZXJlIGFmdGVyCisgICAgICogc2F2aW5nIHRoZSB0dXBsZSBlbGVtZW50cywgdGhlIHR1cGxlIG11c3QgYmUgcmVjdXJzaXZlLCBpbgorICAgICAqIHdoaWNoIGNhc2Ugd2UnbGwgcG9wIGV2ZXJ5dGhpbmcgd2UgcHV0IG9uIHRoZSBzdGFjaywgYW5kIGZldGNoCisgICAgICogaXRzIHZhbHVlIGZyb20gdGhlIG1lbW8uCisgICAgICovCisgICAgcHlfdHVwbGVfaWQgPSBQeUxvbmdfRnJvbVZvaWRQdHIoYXJncyk7CisgICAgaWYgKHB5X3R1cGxlX2lkID09IE5VTEwpCisgICAgICAgIGdvdG8gZmluYWxseTsKIAotCWlmIChsZW4gPD0gMyAmJiBzZWxmLT5wcm90byA+PSAyKSB7Ci0JCS8qIFVzZSBUVVBMRXsxLDIsM30gb3Bjb2Rlcy4gKi8KLQkJaWYgKHN0b3JlX3R1cGxlX2VsZW1lbnRzKHNlbGYsIGFyZ3MsIGxlbikgPCAwKQotCQkJZ290byBmaW5hbGx5OwotCQlpZiAoUHlEaWN0X0dldEl0ZW0oc2VsZi0+bWVtbywgcHlfdHVwbGVfaWQpKSB7Ci0JCQkvKiBwb3AgdGhlIGxlbiBlbGVtZW50cyAqLwotCQkJZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKQotCQkJCWlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsICZwb3AsIDEpIDwgMCkKLQkJCQkJZ290byBmaW5hbGx5OwotCQkJLyogZmV0Y2ggZnJvbSBtZW1vICovCi0JCQlpZiAoZ2V0KHNlbGYsIHB5X3R1cGxlX2lkKSA8IDApCi0JCQkJZ290byBmaW5hbGx5OwotCQkJcmVzID0gMDsKLQkJCWdvdG8gZmluYWxseTsKLQkJfQotCQkvKiBOb3QgcmVjdXJzaXZlLiAqLwotCQlpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCBsZW4yb3Bjb2RlICsgbGVuLCAxKSA8IDApCi0JCQlnb3RvIGZpbmFsbHk7Ci0JCWdvdG8gbWVtb2l6ZTsKLQl9CisgICAgaWYgKGxlbiA8PSAzICYmIHNlbGYtPnByb3RvID49IDIpIHsKKyAgICAgICAgLyogVXNlIFRVUExFezEsMiwzfSBvcGNvZGVzLiAqLworICAgICAgICBpZiAoc3RvcmVfdHVwbGVfZWxlbWVudHMoc2VsZiwgYXJncywgbGVuKSA8IDApCisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgICAgIGlmIChQeURpY3RfR2V0SXRlbShzZWxmLT5tZW1vLCBweV90dXBsZV9pZCkpIHsKKyAgICAgICAgICAgIC8qIHBvcCB0aGUgbGVuIGVsZW1lbnRzICovCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpCisgICAgICAgICAgICAgICAgaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgJnBvcCwgMSkgPCAwKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgICAgICAgICAvKiBmZXRjaCBmcm9tIG1lbW8gKi8KKyAgICAgICAgICAgIGlmIChnZXQoc2VsZiwgcHlfdHVwbGVfaWQpIDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgICAgICAgICByZXMgPSAwOworICAgICAgICAgICAgZ290byBmaW5hbGx5OworICAgICAgICB9CisgICAgICAgIC8qIE5vdCByZWN1cnNpdmUuICovCisgICAgICAgIGlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsIGxlbjJvcGNvZGUgKyBsZW4sIDEpIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICAgICAgZ290byBtZW1vaXplOworICAgIH0KIAotCS8qIHByb3RvIDwgMiBhbmQgbGVuID4gMCwgb3IgcHJvdG8gPj0gMiBhbmQgbGVuID4gMy4KLQkgKiBHZW5lcmF0ZSBNQVJLIGVsdDEgZWx0MiAuLi4gVFVQTEUKLQkgKi8KLQlpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCAmTUFSS3YsIDEpIDwgMCkKLQkJZ290byBmaW5hbGx5OworICAgIC8qIHByb3RvIDwgMiBhbmQgbGVuID4gMCwgb3IgcHJvdG8gPj0gMiBhbmQgbGVuID4gMy4KKyAgICAgKiBHZW5lcmF0ZSBNQVJLIGVsdDEgZWx0MiAuLi4gVFVQTEUKKyAgICAgKi8KKyAgICBpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCAmTUFSS3YsIDEpIDwgMCkKKyAgICAgICAgZ290byBmaW5hbGx5OwogCi0JaWYgKHN0b3JlX3R1cGxlX2VsZW1lbnRzKHNlbGYsIGFyZ3MsIGxlbikgPCAwKQotCQlnb3RvIGZpbmFsbHk7CisgICAgaWYgKHN0b3JlX3R1cGxlX2VsZW1lbnRzKHNlbGYsIGFyZ3MsIGxlbikgPCAwKQorICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQlpZiAoUHlEaWN0X0dldEl0ZW0oc2VsZi0+bWVtbywgcHlfdHVwbGVfaWQpKSB7Ci0JCS8qIHBvcCB0aGUgc3RhY2sgc3R1ZmYgd2UgcHVzaGVkICovCi0JCWlmIChzZWxmLT5iaW4pIHsKLQkJCWlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsICZwb3BfbWFyaywgMSkgPCAwKQotCQkJCWdvdG8gZmluYWxseTsKLQkJfQotCQllbHNlIHsKLQkJCS8qIE5vdGUgdGhhdCB3ZSBwb3Agb25lIG1vcmUgdGhhbiBsZW4sIHRvIHJlbW92ZQotCQkJICogdGhlIE1BUksgdG9vLgotCQkJICovCi0JCQlmb3IgKGkgPSAwOyBpIDw9IGxlbjsgaSsrKQotCQkJCWlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsICZwb3AsIDEpIDwgMCkKLQkJCQkJZ290byBmaW5hbGx5OwotCQl9Ci0JCS8qIGZldGNoIGZyb20gbWVtbyAqLwotCQlpZiAoZ2V0KHNlbGYsIHB5X3R1cGxlX2lkKSA+PSAwKQotCQkJcmVzID0gMDsKLQkJZ290byBmaW5hbGx5OwotCX0KKyAgICBpZiAoUHlEaWN0X0dldEl0ZW0oc2VsZi0+bWVtbywgcHlfdHVwbGVfaWQpKSB7CisgICAgICAgIC8qIHBvcCB0aGUgc3RhY2sgc3R1ZmYgd2UgcHVzaGVkICovCisgICAgICAgIGlmIChzZWxmLT5iaW4pIHsKKyAgICAgICAgICAgIGlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsICZwb3BfbWFyaywgMSkgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8qIE5vdGUgdGhhdCB3ZSBwb3Agb25lIG1vcmUgdGhhbiBsZW4sIHRvIHJlbW92ZQorICAgICAgICAgICAgICogdGhlIE1BUksgdG9vLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDw9IGxlbjsgaSsrKQorICAgICAgICAgICAgICAgIGlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsICZwb3AsIDEpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgZ290byBmaW5hbGx5OworICAgICAgICB9CisgICAgICAgIC8qIGZldGNoIGZyb20gbWVtbyAqLworICAgICAgICBpZiAoZ2V0KHNlbGYsIHB5X3R1cGxlX2lkKSA+PSAwKQorICAgICAgICAgICAgcmVzID0gMDsKKyAgICAgICAgZ290byBmaW5hbGx5OworICAgIH0KIAotCS8qIE5vdCByZWN1cnNpdmUuICovCi0JaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgJnR1cGxlLCAxKSA8IDApCi0JCWdvdG8gZmluYWxseTsKKyAgICAvKiBOb3QgcmVjdXJzaXZlLiAqLworICAgIGlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsICZ0dXBsZSwgMSkgPCAwKQorICAgICAgICBnb3RvIGZpbmFsbHk7CiAKICAgbWVtb2l6ZToKLQlpZiAocHV0KHNlbGYsIGFyZ3MpID49IDApCi0JCXJlcyA9IDA7CisgICAgaWYgKHB1dChzZWxmLCBhcmdzKSA+PSAwKQorICAgICAgICByZXMgPSAwOwogCiAgIGZpbmFsbHk6Ci0JUHlfWERFQ1JFRihweV90dXBsZV9pZCk7Ci0JcmV0dXJuIHJlczsKKyAgICBQeV9YREVDUkVGKHB5X3R1cGxlX2lkKTsKKyAgICByZXR1cm4gcmVzOwogfQogCiAvKiBpdGVyIGlzIGFuIGl0ZXJhdG9yIGdpdmluZyBpdGVtcywgYW5kIHdlIGJhdGNoIHVwIGNodW5rcyBvZgpAQCAtMTU3OCwxNTcgKzE1NzgsMTU3IEBACiBzdGF0aWMgaW50CiBiYXRjaF9saXN0KFBpY2tsZXJvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICppdGVyKQogewotCVB5T2JqZWN0ICpvYmogPSBOVUxMOwotCVB5T2JqZWN0ICpmaXJzdGl0ZW0gPSBOVUxMOwotCWludCBpLCBuOworICAgIFB5T2JqZWN0ICpvYmogPSBOVUxMOworICAgIFB5T2JqZWN0ICpmaXJzdGl0ZW0gPSBOVUxMOworICAgIGludCBpLCBuOwogCi0Jc3RhdGljIGNoYXIgYXBwZW5kID0gQVBQRU5EOwotCXN0YXRpYyBjaGFyIGFwcGVuZHMgPSBBUFBFTkRTOworICAgIHN0YXRpYyBjaGFyIGFwcGVuZCA9IEFQUEVORDsKKyAgICBzdGF0aWMgY2hhciBhcHBlbmRzID0gQVBQRU5EUzsKIAotCWFzc2VydChpdGVyICE9IE5VTEwpOworICAgIGFzc2VydChpdGVyICE9IE5VTEwpOwogCi0JaWYgKHNlbGYtPnByb3RvID09IDApIHsKLQkJLyogQVBQRU5EUyBpc24ndCBhdmFpbGFibGU7IGRvIG9uZSBhdCBhIHRpbWUuICovCi0JCWZvciAoOzspIHsKLQkJCW9iaiA9IFB5SXRlcl9OZXh0KGl0ZXIpOwotCQkJaWYgKG9iaiA9PSBOVUxMKSB7Ci0JCQkJaWYgKFB5RXJyX09jY3VycmVkKCkpCi0JCQkJCXJldHVybiAtMTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWkgPSBzYXZlKHNlbGYsIG9iaiwgMCk7Ci0JCQlQeV9ERUNSRUYob2JqKTsKLQkJCWlmIChpIDwgMCkKLQkJCQlyZXR1cm4gLTE7Ci0JCQlpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCAmYXBwZW5kLCAxKSA8IDApCi0JCQkJcmV0dXJuIC0xOwotCQl9Ci0JCXJldHVybiAwOwotCX0KKyAgICBpZiAoc2VsZi0+cHJvdG8gPT0gMCkgeworICAgICAgICAvKiBBUFBFTkRTIGlzbid0IGF2YWlsYWJsZTsgZG8gb25lIGF0IGEgdGltZS4gKi8KKyAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgb2JqID0gUHlJdGVyX05leHQoaXRlcik7CisgICAgICAgICAgICBpZiAob2JqID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaSA9IHNhdmUoc2VsZiwgb2JqLCAwKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihvYmopOworICAgICAgICAgICAgaWYgKGkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIGlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsICZhcHBlbmQsIDEpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCi0JLyogcHJvdG8gPiAwOiAgd3JpdGUgaW4gYmF0Y2hlcyBvZiBCQVRDSFNJWkUuICovCi0JZG8gewotCQkvKiBHZXQgZmlyc3QgaXRlbSAqLwotCQlmaXJzdGl0ZW0gPSBQeUl0ZXJfTmV4dChpdGVyKTsKLQkJaWYgKGZpcnN0aXRlbSA9PSBOVUxMKSB7Ci0JCQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkKLQkJCQlnb3RvIEJhdGNoRmFpbGVkOworICAgIC8qIHByb3RvID4gMDogIHdyaXRlIGluIGJhdGNoZXMgb2YgQkFUQ0hTSVpFLiAqLworICAgIGRvIHsKKyAgICAgICAgLyogR2V0IGZpcnN0IGl0ZW0gKi8KKyAgICAgICAgZmlyc3RpdGVtID0gUHlJdGVyX05leHQoaXRlcik7CisgICAgICAgIGlmIChmaXJzdGl0ZW0gPT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICAgICAgZ290byBCYXRjaEZhaWxlZDsKIAotCQkJLyogbm90aGluZyBtb3JlIHRvIGFkZCAqLwotCQkJYnJlYWs7Ci0JCX0KKyAgICAgICAgICAgIC8qIG5vdGhpbmcgbW9yZSB0byBhZGQgKi8KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CiAKLQkJLyogVHJ5IHRvIGdldCBhIHNlY29uZCBpdGVtICovCi0JCW9iaiA9IFB5SXRlcl9OZXh0KGl0ZXIpOwotCQlpZiAob2JqID09IE5VTEwpIHsKLQkJCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQkJCWdvdG8gQmF0Y2hGYWlsZWQ7CisgICAgICAgIC8qIFRyeSB0byBnZXQgYSBzZWNvbmQgaXRlbSAqLworICAgICAgICBvYmogPSBQeUl0ZXJfTmV4dChpdGVyKTsKKyAgICAgICAgaWYgKG9iaiA9PSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgICAgICBnb3RvIEJhdGNoRmFpbGVkOwogCi0JCQkvKiBPbmx5IG9uZSBpdGVtIHRvIHdyaXRlICovCi0JCQlpZiAoc2F2ZShzZWxmLCBmaXJzdGl0ZW0sIDApIDwgMCkKLQkJCQlnb3RvIEJhdGNoRmFpbGVkOwotCQkJaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgJmFwcGVuZCwgMSkgPCAwKQotCQkJCWdvdG8gQmF0Y2hGYWlsZWQ7Ci0JCQlQeV9DTEVBUihmaXJzdGl0ZW0pOwotCQkJYnJlYWs7Ci0JCX0KKyAgICAgICAgICAgIC8qIE9ubHkgb25lIGl0ZW0gdG8gd3JpdGUgKi8KKyAgICAgICAgICAgIGlmIChzYXZlKHNlbGYsIGZpcnN0aXRlbSwgMCkgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gQmF0Y2hGYWlsZWQ7CisgICAgICAgICAgICBpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCAmYXBwZW5kLCAxKSA8IDApCisgICAgICAgICAgICAgICAgZ290byBCYXRjaEZhaWxlZDsKKyAgICAgICAgICAgIFB5X0NMRUFSKGZpcnN0aXRlbSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogCi0JCS8qIE1vcmUgdGhhbiBvbmUgaXRlbSB0byB3cml0ZSAqLworICAgICAgICAvKiBNb3JlIHRoYW4gb25lIGl0ZW0gdG8gd3JpdGUgKi8KIAotCQkvKiBQdW1wIG91dCBNQVJLLCBpdGVtcywgQVBQRU5EUy4gKi8KLQkJaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgJk1BUkt2LCAxKSA8IDApCi0JCQlnb3RvIEJhdGNoRmFpbGVkOwotCQkKLQkJaWYgKHNhdmUoc2VsZiwgZmlyc3RpdGVtLCAwKSA8IDApCi0JCQlnb3RvIEJhdGNoRmFpbGVkOwotCQlQeV9DTEVBUihmaXJzdGl0ZW0pOwotCQluID0gMTsKLQkJCi0JCS8qIEZldGNoIGFuZCBzYXZlIHVwIHRvIEJBVENIU0laRSBpdGVtcyAqLwotCQl3aGlsZSAob2JqKSB7Ci0JCQlpZiAoc2F2ZShzZWxmLCBvYmosIDApIDwgMCkKLQkJCQlnb3RvIEJhdGNoRmFpbGVkOwotCQkJUHlfQ0xFQVIob2JqKTsKLQkJCW4gKz0gMTsKLQkJCQotCQkJaWYgKG4gPT0gQkFUQ0hTSVpFKQotCQkJCWJyZWFrOworICAgICAgICAvKiBQdW1wIG91dCBNQVJLLCBpdGVtcywgQVBQRU5EUy4gKi8KKyAgICAgICAgaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgJk1BUkt2LCAxKSA8IDApCisgICAgICAgICAgICBnb3RvIEJhdGNoRmFpbGVkOwogCi0JCQlvYmogPSBQeUl0ZXJfTmV4dChpdGVyKTsKLQkJCWlmIChvYmogPT0gTlVMTCkgewotCQkJCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQkJCQlnb3RvIEJhdGNoRmFpbGVkOwotCQkJCWJyZWFrOwotCQkJfQotCQl9CisgICAgICAgIGlmIChzYXZlKHNlbGYsIGZpcnN0aXRlbSwgMCkgPCAwKQorICAgICAgICAgICAgZ290byBCYXRjaEZhaWxlZDsKKyAgICAgICAgUHlfQ0xFQVIoZmlyc3RpdGVtKTsKKyAgICAgICAgbiA9IDE7CiAKLQkJaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgJmFwcGVuZHMsIDEpIDwgMCkKLQkJCWdvdG8gQmF0Y2hGYWlsZWQ7CisgICAgICAgIC8qIEZldGNoIGFuZCBzYXZlIHVwIHRvIEJBVENIU0laRSBpdGVtcyAqLworICAgICAgICB3aGlsZSAob2JqKSB7CisgICAgICAgICAgICBpZiAoc2F2ZShzZWxmLCBvYmosIDApIDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIEJhdGNoRmFpbGVkOworICAgICAgICAgICAgUHlfQ0xFQVIob2JqKTsKKyAgICAgICAgICAgIG4gKz0gMTsKIAotCX0gd2hpbGUgKG4gPT0gQkFUQ0hTSVpFKTsKLQlyZXR1cm4gMDsKKyAgICAgICAgICAgIGlmIChuID09IEJBVENIU0laRSkKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgb2JqID0gUHlJdGVyX05leHQoaXRlcik7CisgICAgICAgICAgICBpZiAob2JqID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBCYXRjaEZhaWxlZDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsICZhcHBlbmRzLCAxKSA8IDApCisgICAgICAgICAgICBnb3RvIEJhdGNoRmFpbGVkOworCisgICAgfSB3aGlsZSAobiA9PSBCQVRDSFNJWkUpOworICAgIHJldHVybiAwOwogCiBCYXRjaEZhaWxlZDoKLQlQeV9YREVDUkVGKGZpcnN0aXRlbSk7Ci0JUHlfWERFQ1JFRihvYmopOwotCXJldHVybiAtMTsKKyAgICBQeV9YREVDUkVGKGZpcnN0aXRlbSk7CisgICAgUHlfWERFQ1JFRihvYmopOworICAgIHJldHVybiAtMTsKIH0KIAogc3RhdGljIGludAogc2F2ZV9saXN0KFBpY2tsZXJvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCByZXMgPSAtMTsKLQljaGFyIHNbM107Ci0JaW50IGxlbjsKLQlQeU9iamVjdCAqaXRlcjsKKyAgICBpbnQgcmVzID0gLTE7CisgICAgY2hhciBzWzNdOworICAgIGludCBsZW47CisgICAgUHlPYmplY3QgKml0ZXI7CiAKLQlpZiAoc2VsZi0+ZmFzdCAmJiAhZmFzdF9zYXZlX2VudGVyKHNlbGYsIGFyZ3MpKQotCQlnb3RvIGZpbmFsbHk7CisgICAgaWYgKHNlbGYtPmZhc3QgJiYgIWZhc3Rfc2F2ZV9lbnRlcihzZWxmLCBhcmdzKSkKKyAgICAgICAgZ290byBmaW5hbGx5OwogCi0JLyogQ3JlYXRlIGFuIGVtcHR5IGxpc3QuICovCi0JaWYgKHNlbGYtPmJpbikgewotCQlzWzBdID0gRU1QVFlfTElTVDsKLQkJbGVuID0gMTsKLQl9Ci0JZWxzZSB7Ci0JCXNbMF0gPSBNQVJLOwotCQlzWzFdID0gTElTVDsKLQkJbGVuID0gMjsKLQl9CisgICAgLyogQ3JlYXRlIGFuIGVtcHR5IGxpc3QuICovCisgICAgaWYgKHNlbGYtPmJpbikgeworICAgICAgICBzWzBdID0gRU1QVFlfTElTVDsKKyAgICAgICAgbGVuID0gMTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHNbMF0gPSBNQVJLOworICAgICAgICBzWzFdID0gTElTVDsKKyAgICAgICAgbGVuID0gMjsKKyAgICB9CiAKLQlpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCBzLCBsZW4pIDwgMCkKLQkJZ290byBmaW5hbGx5OworICAgIGlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsIHMsIGxlbikgPCAwKQorICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQkvKiBHZXQgbGlzdCBsZW5ndGgsIGFuZCBib3cgb3V0IGVhcmx5IGlmIGVtcHR5LiAqLwotCWlmICgobGVuID0gUHlMaXN0X1NpemUoYXJncykpIDwgMCkKLQkJZ290byBmaW5hbGx5OworICAgIC8qIEdldCBsaXN0IGxlbmd0aCwgYW5kIGJvdyBvdXQgZWFybHkgaWYgZW1wdHkuICovCisgICAgaWYgKChsZW4gPSBQeUxpc3RfU2l6ZShhcmdzKSkgPCAwKQorICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQkvKiBNZW1vaXplLiAqLwotCWlmIChsZW4gPT0gMCkgewotCQlpZiAocHV0KHNlbGYsIGFyZ3MpID49IDApCi0JCQlyZXMgPSAwOwotCQlnb3RvIGZpbmFsbHk7Ci0JfQotCWlmIChwdXQyKHNlbGYsIGFyZ3MpIDwgMCkKLQkJZ290byBmaW5hbGx5OworICAgIC8qIE1lbW9pemUuICovCisgICAgaWYgKGxlbiA9PSAwKSB7CisgICAgICAgIGlmIChwdXQoc2VsZiwgYXJncykgPj0gMCkKKyAgICAgICAgICAgIHJlcyA9IDA7CisgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICB9CisgICAgaWYgKHB1dDIoc2VsZiwgYXJncykgPCAwKQorICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQkvKiBNYXRlcmlhbGl6ZSB0aGUgbGlzdCBlbGVtZW50cy4gKi8KLQlpdGVyID0gUHlPYmplY3RfR2V0SXRlcihhcmdzKTsKLQlpZiAoaXRlciA9PSBOVUxMKQotCQlnb3RvIGZpbmFsbHk7CisgICAgLyogTWF0ZXJpYWxpemUgdGhlIGxpc3QgZWxlbWVudHMuICovCisgICAgaXRlciA9IFB5T2JqZWN0X0dldEl0ZXIoYXJncyk7CisgICAgaWYgKGl0ZXIgPT0gTlVMTCkKKyAgICAgICAgZ290byBmaW5hbGx5OwogCi0JaWYgKFB5X0VudGVyUmVjdXJzaXZlQ2FsbCgiIHdoaWxlIHBpY2tsaW5nIGFuIG9iamVjdCIpID09IDApCi0JewotCQlyZXMgPSBiYXRjaF9saXN0KHNlbGYsIGl0ZXIpOwotCQlQeV9MZWF2ZVJlY3Vyc2l2ZUNhbGwoKTsKLQl9Ci0JUHlfREVDUkVGKGl0ZXIpOworICAgIGlmIChQeV9FbnRlclJlY3Vyc2l2ZUNhbGwoIiB3aGlsZSBwaWNrbGluZyBhbiBvYmplY3QiKSA9PSAwKQorICAgIHsKKyAgICAgICAgcmVzID0gYmF0Y2hfbGlzdChzZWxmLCBpdGVyKTsKKyAgICAgICAgUHlfTGVhdmVSZWN1cnNpdmVDYWxsKCk7CisgICAgfQorICAgIFB5X0RFQ1JFRihpdGVyKTsKIAogICBmaW5hbGx5OgotCWlmIChzZWxmLT5mYXN0ICYmICFmYXN0X3NhdmVfbGVhdmUoc2VsZiwgYXJncykpCi0JCXJlcyA9IC0xOworICAgIGlmIChzZWxmLT5mYXN0ICYmICFmYXN0X3NhdmVfbGVhdmUoc2VsZiwgYXJncykpCisgICAgICAgIHJlcyA9IC0xOwogCi0JcmV0dXJuIHJlczsKKyAgICByZXR1cm4gcmVzOwogfQogCiAKQEAgLTE3NDYsNTIzICsxNzQ2LDUyMyBAQAogc3RhdGljIGludAogYmF0Y2hfZGljdChQaWNrbGVyb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqaXRlcikKIHsKLQlQeU9iamVjdCAqcCA9IE5VTEw7Ci0JUHlPYmplY3QgKmZpcnN0aXRlbSA9IE5VTEw7Ci0JaW50IGksIG47CisgICAgUHlPYmplY3QgKnAgPSBOVUxMOworICAgIFB5T2JqZWN0ICpmaXJzdGl0ZW0gPSBOVUxMOworICAgIGludCBpLCBuOwogCi0Jc3RhdGljIGNoYXIgc2V0aXRlbSA9IFNFVElURU07Ci0Jc3RhdGljIGNoYXIgc2V0aXRlbXMgPSBTRVRJVEVNUzsKKyAgICBzdGF0aWMgY2hhciBzZXRpdGVtID0gU0VUSVRFTTsKKyAgICBzdGF0aWMgY2hhciBzZXRpdGVtcyA9IFNFVElURU1TOwogCi0JYXNzZXJ0KGl0ZXIgIT0gTlVMTCk7CisgICAgYXNzZXJ0KGl0ZXIgIT0gTlVMTCk7CiAKLQlpZiAoc2VsZi0+cHJvdG8gPT0gMCkgewotCQkvKiBTRVRJVEVNUyBpc24ndCBhdmFpbGFibGU7IGRvIG9uZSBhdCBhIHRpbWUuICovCi0JCWZvciAoOzspIHsKLQkJCXAgPSBQeUl0ZXJfTmV4dChpdGVyKTsKLQkJCWlmIChwID09IE5VTEwpIHsKLQkJCQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkKLQkJCQkJcmV0dXJuIC0xOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKCFQeVR1cGxlX0NoZWNrKHApIHx8IFB5VHVwbGVfU2l6ZShwKSAhPSAyKSB7Ci0JCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImRpY3QgaXRlbXMgIgotCQkJCQkiaXRlcmF0b3IgbXVzdCByZXR1cm4gMi10dXBsZXMiKTsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCQlpID0gc2F2ZShzZWxmLCBQeVR1cGxlX0dFVF9JVEVNKHAsIDApLCAwKTsKLQkJCWlmIChpID49IDApCi0JCQkJaSA9IHNhdmUoc2VsZiwgUHlUdXBsZV9HRVRfSVRFTShwLCAxKSwgMCk7Ci0JCQlQeV9ERUNSRUYocCk7Ci0JCQlpZiAoaSA8IDApCi0JCQkJcmV0dXJuIC0xOwotCQkJaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgJnNldGl0ZW0sIDEpIDwgMCkKLQkJCQlyZXR1cm4gLTE7Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JfQorICAgIGlmIChzZWxmLT5wcm90byA9PSAwKSB7CisgICAgICAgIC8qIFNFVElURU1TIGlzbid0IGF2YWlsYWJsZTsgZG8gb25lIGF0IGEgdGltZS4gKi8KKyAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgcCA9IFB5SXRlcl9OZXh0KGl0ZXIpOworICAgICAgICAgICAgaWYgKHAgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIVB5VHVwbGVfQ2hlY2socCkgfHwgUHlUdXBsZV9TaXplKHApICE9IDIpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiZGljdCBpdGVtcyAiCisgICAgICAgICAgICAgICAgICAgICJpdGVyYXRvciBtdXN0IHJldHVybiAyLXR1cGxlcyIpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGkgPSBzYXZlKHNlbGYsIFB5VHVwbGVfR0VUX0lURU0ocCwgMCksIDApOworICAgICAgICAgICAgaWYgKGkgPj0gMCkKKyAgICAgICAgICAgICAgICBpID0gc2F2ZShzZWxmLCBQeVR1cGxlX0dFVF9JVEVNKHAsIDEpLCAwKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihwKTsKKyAgICAgICAgICAgIGlmIChpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCAmc2V0aXRlbSwgMSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLQkvKiBwcm90byA+IDA6ICB3cml0ZSBpbiBiYXRjaGVzIG9mIEJBVENIU0laRS4gKi8KLQlkbyB7Ci0JCS8qIEdldCBmaXJzdCBpdGVtICovCi0JCWZpcnN0aXRlbSA9IFB5SXRlcl9OZXh0KGl0ZXIpOwotCQlpZiAoZmlyc3RpdGVtID09IE5VTEwpIHsKLQkJCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQkJCWdvdG8gQmF0Y2hGYWlsZWQ7CisgICAgLyogcHJvdG8gPiAwOiAgd3JpdGUgaW4gYmF0Y2hlcyBvZiBCQVRDSFNJWkUuICovCisgICAgZG8geworICAgICAgICAvKiBHZXQgZmlyc3QgaXRlbSAqLworICAgICAgICBmaXJzdGl0ZW0gPSBQeUl0ZXJfTmV4dChpdGVyKTsKKyAgICAgICAgaWYgKGZpcnN0aXRlbSA9PSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgICAgICBnb3RvIEJhdGNoRmFpbGVkOwogCi0JCQkvKiBub3RoaW5nIG1vcmUgdG8gYWRkICovCi0JCQlicmVhazsKLQkJfQotCQlpZiAoIVB5VHVwbGVfQ2hlY2soZmlyc3RpdGVtKSB8fCBQeVR1cGxlX1NpemUoZmlyc3RpdGVtKSAhPSAyKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiZGljdCBpdGVtcyAiCi0JCQkJCSJpdGVyYXRvciBtdXN0IHJldHVybiAyLXR1cGxlcyIpOwotCQkJZ290byBCYXRjaEZhaWxlZDsKLQkJfQorICAgICAgICAgICAgLyogbm90aGluZyBtb3JlIHRvIGFkZCAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFQeVR1cGxlX0NoZWNrKGZpcnN0aXRlbSkgfHwgUHlUdXBsZV9TaXplKGZpcnN0aXRlbSkgIT0gMikgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImRpY3QgaXRlbXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpdGVyYXRvciBtdXN0IHJldHVybiAyLXR1cGxlcyIpOworICAgICAgICAgICAgZ290byBCYXRjaEZhaWxlZDsKKyAgICAgICAgfQogCi0JCS8qIFRyeSB0byBnZXQgYSBzZWNvbmQgaXRlbSAqLwotCQlwID0gUHlJdGVyX05leHQoaXRlcik7Ci0JCWlmIChwID09IE5VTEwpIHsKLQkJCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQkJCWdvdG8gQmF0Y2hGYWlsZWQ7CisgICAgICAgIC8qIFRyeSB0byBnZXQgYSBzZWNvbmQgaXRlbSAqLworICAgICAgICBwID0gUHlJdGVyX05leHQoaXRlcik7CisgICAgICAgIGlmIChwID09IE5VTEwpIHsKKyAgICAgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgICAgIGdvdG8gQmF0Y2hGYWlsZWQ7CiAKLQkJCS8qIE9ubHkgb25lIGl0ZW0gdG8gd3JpdGUgKi8KLQkJCWlmIChzYXZlKHNlbGYsIFB5VHVwbGVfR0VUX0lURU0oZmlyc3RpdGVtLCAwKSwgMCkgPCAwKQotCQkJCWdvdG8gQmF0Y2hGYWlsZWQ7Ci0JCQlpZiAoc2F2ZShzZWxmLCBQeVR1cGxlX0dFVF9JVEVNKGZpcnN0aXRlbSwgMSksIDApIDwgMCkKLQkJCQlnb3RvIEJhdGNoRmFpbGVkOwotCQkJaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgJnNldGl0ZW0sIDEpIDwgMCkKLQkJCQlnb3RvIEJhdGNoRmFpbGVkOwotCQkJUHlfQ0xFQVIoZmlyc3RpdGVtKTsKLQkJCWJyZWFrOwotCQl9CisgICAgICAgICAgICAvKiBPbmx5IG9uZSBpdGVtIHRvIHdyaXRlICovCisgICAgICAgICAgICBpZiAoc2F2ZShzZWxmLCBQeVR1cGxlX0dFVF9JVEVNKGZpcnN0aXRlbSwgMCksIDApIDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIEJhdGNoRmFpbGVkOworICAgICAgICAgICAgaWYgKHNhdmUoc2VsZiwgUHlUdXBsZV9HRVRfSVRFTShmaXJzdGl0ZW0sIDEpLCAwKSA8IDApCisgICAgICAgICAgICAgICAgZ290byBCYXRjaEZhaWxlZDsKKyAgICAgICAgICAgIGlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsICZzZXRpdGVtLCAxKSA8IDApCisgICAgICAgICAgICAgICAgZ290byBCYXRjaEZhaWxlZDsKKyAgICAgICAgICAgIFB5X0NMRUFSKGZpcnN0aXRlbSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogCi0JCS8qIE1vcmUgdGhhbiBvbmUgaXRlbSB0byB3cml0ZSAqLworICAgICAgICAvKiBNb3JlIHRoYW4gb25lIGl0ZW0gdG8gd3JpdGUgKi8KIAotCQkvKiBQdW1wIG91dCBNQVJLLCBpdGVtcywgU0VUSVRFTVMuICovCi0JCWlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsICZNQVJLdiwgMSkgPCAwKQotCQkJZ290byBCYXRjaEZhaWxlZDsKKyAgICAgICAgLyogUHVtcCBvdXQgTUFSSywgaXRlbXMsIFNFVElURU1TLiAqLworICAgICAgICBpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCAmTUFSS3YsIDEpIDwgMCkKKyAgICAgICAgICAgIGdvdG8gQmF0Y2hGYWlsZWQ7CiAKLQkJaWYgKHNhdmUoc2VsZiwgUHlUdXBsZV9HRVRfSVRFTShmaXJzdGl0ZW0sIDApLCAwKSA8IDApCi0JCQlnb3RvIEJhdGNoRmFpbGVkOwotCQlpZiAoc2F2ZShzZWxmLCBQeVR1cGxlX0dFVF9JVEVNKGZpcnN0aXRlbSwgMSksIDApIDwgMCkKLQkJCWdvdG8gQmF0Y2hGYWlsZWQ7Ci0JCVB5X0NMRUFSKGZpcnN0aXRlbSk7Ci0JCW4gPSAxOworICAgICAgICBpZiAoc2F2ZShzZWxmLCBQeVR1cGxlX0dFVF9JVEVNKGZpcnN0aXRlbSwgMCksIDApIDwgMCkKKyAgICAgICAgICAgIGdvdG8gQmF0Y2hGYWlsZWQ7CisgICAgICAgIGlmIChzYXZlKHNlbGYsIFB5VHVwbGVfR0VUX0lURU0oZmlyc3RpdGVtLCAxKSwgMCkgPCAwKQorICAgICAgICAgICAgZ290byBCYXRjaEZhaWxlZDsKKyAgICAgICAgUHlfQ0xFQVIoZmlyc3RpdGVtKTsKKyAgICAgICAgbiA9IDE7CiAKLQkJLyogRmV0Y2ggYW5kIHNhdmUgdXAgdG8gQkFUQ0hTSVpFIGl0ZW1zICovCi0JCXdoaWxlIChwKSB7Ci0JCQlpZiAoIVB5VHVwbGVfQ2hlY2socCkgfHwgUHlUdXBsZV9TaXplKHApICE9IDIpIHsKLQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiZGljdCBpdGVtcyAiCi0JCQkJCSJpdGVyYXRvciBtdXN0IHJldHVybiAyLXR1cGxlcyIpOwotCQkJCWdvdG8gQmF0Y2hGYWlsZWQ7Ci0JCQl9Ci0JCQlpZiAoc2F2ZShzZWxmLCBQeVR1cGxlX0dFVF9JVEVNKHAsIDApLCAwKSA8IDApCi0JCQkJZ290byBCYXRjaEZhaWxlZDsKLQkJCWlmIChzYXZlKHNlbGYsIFB5VHVwbGVfR0VUX0lURU0ocCwgMSksIDApIDwgMCkKLQkJCQlnb3RvIEJhdGNoRmFpbGVkOwotCQkJUHlfQ0xFQVIocCk7Ci0JCQluICs9IDE7CisgICAgICAgIC8qIEZldGNoIGFuZCBzYXZlIHVwIHRvIEJBVENIU0laRSBpdGVtcyAqLworICAgICAgICB3aGlsZSAocCkgeworICAgICAgICAgICAgaWYgKCFQeVR1cGxlX0NoZWNrKHApIHx8IFB5VHVwbGVfU2l6ZShwKSAhPSAyKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImRpY3QgaXRlbXMgIgorICAgICAgICAgICAgICAgICAgICAiaXRlcmF0b3IgbXVzdCByZXR1cm4gMi10dXBsZXMiKTsKKyAgICAgICAgICAgICAgICBnb3RvIEJhdGNoRmFpbGVkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNhdmUoc2VsZiwgUHlUdXBsZV9HRVRfSVRFTShwLCAwKSwgMCkgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gQmF0Y2hGYWlsZWQ7CisgICAgICAgICAgICBpZiAoc2F2ZShzZWxmLCBQeVR1cGxlX0dFVF9JVEVNKHAsIDEpLCAwKSA8IDApCisgICAgICAgICAgICAgICAgZ290byBCYXRjaEZhaWxlZDsKKyAgICAgICAgICAgIFB5X0NMRUFSKHApOworICAgICAgICAgICAgbiArPSAxOwogCi0JCQlpZiAobiA9PSBCQVRDSFNJWkUpCi0JCQkJYnJlYWs7CisgICAgICAgICAgICBpZiAobiA9PSBCQVRDSFNJWkUpCisgICAgICAgICAgICAgICAgYnJlYWs7CiAKLQkJCXAgPSBQeUl0ZXJfTmV4dChpdGVyKTsKLQkJCWlmIChwID09IE5VTEwpIHsKLQkJCQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkKLQkJCQkJZ290byBCYXRjaEZhaWxlZDsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQorICAgICAgICAgICAgcCA9IFB5SXRlcl9OZXh0KGl0ZXIpOworICAgICAgICAgICAgaWYgKHAgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgICAgICAgICBnb3RvIEJhdGNoRmFpbGVkOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgJnNldGl0ZW1zLCAxKSA8IDApCi0JCQlnb3RvIEJhdGNoRmFpbGVkOworICAgICAgICBpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCAmc2V0aXRlbXMsIDEpIDwgMCkKKyAgICAgICAgICAgIGdvdG8gQmF0Y2hGYWlsZWQ7CiAKLQl9IHdoaWxlIChuID09IEJBVENIU0laRSk7Ci0JcmV0dXJuIDA7CisgICAgfSB3aGlsZSAobiA9PSBCQVRDSFNJWkUpOworICAgIHJldHVybiAwOwogCiBCYXRjaEZhaWxlZDoKLQlQeV9YREVDUkVGKGZpcnN0aXRlbSk7Ci0JUHlfWERFQ1JFRihwKTsKLQlyZXR1cm4gLTE7CisgICAgUHlfWERFQ1JFRihmaXJzdGl0ZW0pOworICAgIFB5X1hERUNSRUYocCk7CisgICAgcmV0dXJuIC0xOwogfQogCiBzdGF0aWMgaW50CiBzYXZlX2RpY3QoUGlja2xlcm9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IHJlcyA9IC0xOwotCWNoYXIgc1szXTsKLQlpbnQgbGVuOwotCVB5T2JqZWN0ICppdGVyOworICAgIGludCByZXMgPSAtMTsKKyAgICBjaGFyIHNbM107CisgICAgaW50IGxlbjsKKyAgICBQeU9iamVjdCAqaXRlcjsKIAotCWlmIChzZWxmLT5mYXN0ICYmICFmYXN0X3NhdmVfZW50ZXIoc2VsZiwgYXJncykpCi0JCWdvdG8gZmluYWxseTsKKyAgICBpZiAoc2VsZi0+ZmFzdCAmJiAhZmFzdF9zYXZlX2VudGVyKHNlbGYsIGFyZ3MpKQorICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQkvKiBDcmVhdGUgYW4gZW1wdHkgZGljdC4gKi8KLQlpZiAoc2VsZi0+YmluKSB7Ci0JCXNbMF0gPSBFTVBUWV9ESUNUOwotCQlsZW4gPSAxOwotCX0KLQllbHNlIHsKLQkJc1swXSA9IE1BUks7Ci0JCXNbMV0gPSBESUNUOwotCQlsZW4gPSAyOwotCX0KKyAgICAvKiBDcmVhdGUgYW4gZW1wdHkgZGljdC4gKi8KKyAgICBpZiAoc2VsZi0+YmluKSB7CisgICAgICAgIHNbMF0gPSBFTVBUWV9ESUNUOworICAgICAgICBsZW4gPSAxOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgc1swXSA9IE1BUks7CisgICAgICAgIHNbMV0gPSBESUNUOworICAgICAgICBsZW4gPSAyOworICAgIH0KIAotCWlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsIHMsIGxlbikgPCAwKQotCQlnb3RvIGZpbmFsbHk7CisgICAgaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgcywgbGVuKSA8IDApCisgICAgICAgIGdvdG8gZmluYWxseTsKIAotCS8qIEdldCBkaWN0IHNpemUsIGFuZCBib3cgb3V0IGVhcmx5IGlmIGVtcHR5LiAqLwotCWlmICgobGVuID0gUHlEaWN0X1NpemUoYXJncykpIDwgMCkKLQkJZ290byBmaW5hbGx5OworICAgIC8qIEdldCBkaWN0IHNpemUsIGFuZCBib3cgb3V0IGVhcmx5IGlmIGVtcHR5LiAqLworICAgIGlmICgobGVuID0gUHlEaWN0X1NpemUoYXJncykpIDwgMCkKKyAgICAgICAgZ290byBmaW5hbGx5OwogCi0JaWYgKGxlbiA9PSAwKSB7Ci0JCWlmIChwdXQoc2VsZiwgYXJncykgPj0gMCkKLQkJCXJlcyA9IDA7Ci0JCWdvdG8gZmluYWxseTsKLQl9Ci0JaWYgKHB1dDIoc2VsZiwgYXJncykgPCAwKQotCQlnb3RvIGZpbmFsbHk7CisgICAgaWYgKGxlbiA9PSAwKSB7CisgICAgICAgIGlmIChwdXQoc2VsZiwgYXJncykgPj0gMCkKKyAgICAgICAgICAgIHJlcyA9IDA7CisgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICB9CisgICAgaWYgKHB1dDIoc2VsZiwgYXJncykgPCAwKQorICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQkvKiBNYXRlcmlhbGl6ZSB0aGUgZGljdCBpdGVtcy4gKi8KLQlpdGVyID0gUHlPYmplY3RfQ2FsbE1ldGhvZChhcmdzLCAiaXRlcml0ZW1zIiwgIigpIik7Ci0JaWYgKGl0ZXIgPT0gTlVMTCkKLQkJZ290byBmaW5hbGx5OwotCWlmIChQeV9FbnRlclJlY3Vyc2l2ZUNhbGwoIiB3aGlsZSBwaWNrbGluZyBhbiBvYmplY3QiKSA9PSAwKQotCXsKLQkJcmVzID0gYmF0Y2hfZGljdChzZWxmLCBpdGVyKTsKLQkJUHlfTGVhdmVSZWN1cnNpdmVDYWxsKCk7Ci0JfQotCVB5X0RFQ1JFRihpdGVyKTsKKyAgICAvKiBNYXRlcmlhbGl6ZSB0aGUgZGljdCBpdGVtcy4gKi8KKyAgICBpdGVyID0gUHlPYmplY3RfQ2FsbE1ldGhvZChhcmdzLCAiaXRlcml0ZW1zIiwgIigpIik7CisgICAgaWYgKGl0ZXIgPT0gTlVMTCkKKyAgICAgICAgZ290byBmaW5hbGx5OworICAgIGlmIChQeV9FbnRlclJlY3Vyc2l2ZUNhbGwoIiB3aGlsZSBwaWNrbGluZyBhbiBvYmplY3QiKSA9PSAwKQorICAgIHsKKyAgICAgICAgcmVzID0gYmF0Y2hfZGljdChzZWxmLCBpdGVyKTsKKyAgICAgICAgUHlfTGVhdmVSZWN1cnNpdmVDYWxsKCk7CisgICAgfQorICAgIFB5X0RFQ1JFRihpdGVyKTsKIAogICBmaW5hbGx5OgotCWlmIChzZWxmLT5mYXN0ICYmICFmYXN0X3NhdmVfbGVhdmUoc2VsZiwgYXJncykpCi0JCXJlcyA9IC0xOworICAgIGlmIChzZWxmLT5mYXN0ICYmICFmYXN0X3NhdmVfbGVhdmUoc2VsZiwgYXJncykpCisgICAgICAgIHJlcyA9IC0xOwogCi0JcmV0dXJuIHJlczsKKyAgICByZXR1cm4gcmVzOwogfQogCiAKIHN0YXRpYyBpbnQKIHNhdmVfaW5zdChQaWNrbGVyb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqY2xhc3MgPSAwLCAqbW9kdWxlID0gMCwgKm5hbWUgPSAwLCAqc3RhdGUgPSAwLAotCQkqZ2V0aW5pdGFyZ3NfZnVuYyA9IDAsICpnZXRzdGF0ZV9mdW5jID0gMCwgKmNsYXNzX2FyZ3MgPSAwOwotCWNoYXIgKm1vZHVsZV9zdHIsICpuYW1lX3N0cjsKLQlpbnQgbW9kdWxlX3NpemUsIG5hbWVfc2l6ZSwgcmVzID0gLTE7CisgICAgUHlPYmplY3QgKmNsYXNzID0gMCwgKm1vZHVsZSA9IDAsICpuYW1lID0gMCwgKnN0YXRlID0gMCwKKyAgICAgICAgKmdldGluaXRhcmdzX2Z1bmMgPSAwLCAqZ2V0c3RhdGVfZnVuYyA9IDAsICpjbGFzc19hcmdzID0gMDsKKyAgICBjaGFyICptb2R1bGVfc3RyLCAqbmFtZV9zdHI7CisgICAgaW50IG1vZHVsZV9zaXplLCBuYW1lX3NpemUsIHJlcyA9IC0xOwogCi0Jc3RhdGljIGNoYXIgaW5zdCA9IElOU1QsIG9iaiA9IE9CSiwgYnVpbGQgPSBCVUlMRDsKKyAgICBzdGF0aWMgY2hhciBpbnN0ID0gSU5TVCwgb2JqID0gT0JKLCBidWlsZCA9IEJVSUxEOwogCi0JaWYgKHNlbGYtPmZhc3QgJiYgIWZhc3Rfc2F2ZV9lbnRlcihzZWxmLCBhcmdzKSkKLQkJZ290byBmaW5hbGx5OworICAgIGlmIChzZWxmLT5mYXN0ICYmICFmYXN0X3NhdmVfZW50ZXIoc2VsZiwgYXJncykpCisgICAgICAgIGdvdG8gZmluYWxseTsKIAotCWlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsICZNQVJLdiwgMSkgPCAwKQotCQlnb3RvIGZpbmFsbHk7CisgICAgaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgJk1BUkt2LCAxKSA8IDApCisgICAgICAgIGdvdG8gZmluYWxseTsKIAotCWlmICghKCBjbGFzcyA9IFB5T2JqZWN0X0dldEF0dHIoYXJncywgX19jbGFzc19fX3N0cikpKQotCQlnb3RvIGZpbmFsbHk7CisgICAgaWYgKCEoIGNsYXNzID0gUHlPYmplY3RfR2V0QXR0cihhcmdzLCBfX2NsYXNzX19fc3RyKSkpCisgICAgICAgIGdvdG8gZmluYWxseTsKIAotCWlmIChzZWxmLT5iaW4pIHsKLQkJaWYgKHNhdmUoc2VsZiwgY2xhc3MsIDApIDwgMCkKLQkJCWdvdG8gZmluYWxseTsKLQl9CisgICAgaWYgKHNlbGYtPmJpbikgeworICAgICAgICBpZiAoc2F2ZShzZWxmLCBjbGFzcywgMCkgPCAwKQorICAgICAgICAgICAgZ290byBmaW5hbGx5OworICAgIH0KIAotCWlmICgoZ2V0aW5pdGFyZ3NfZnVuYyA9IFB5T2JqZWN0X0dldEF0dHIoYXJncywgX19nZXRpbml0YXJnc19fX3N0cikpKSB7Ci0JCVB5T2JqZWN0ICplbGVtZW50ID0gMDsKLQkJaW50IGksIGxlbjsKKyAgICBpZiAoKGdldGluaXRhcmdzX2Z1bmMgPSBQeU9iamVjdF9HZXRBdHRyKGFyZ3MsIF9fZ2V0aW5pdGFyZ3NfX19zdHIpKSkgeworICAgICAgICBQeU9iamVjdCAqZWxlbWVudCA9IDA7CisgICAgICAgIGludCBpLCBsZW47CiAKLQkJaWYgKCEoIGNsYXNzX2FyZ3MgPQotCQkgICAgICAgUHlPYmplY3RfQ2FsbChnZXRpbml0YXJnc19mdW5jLCBlbXB0eV90dXBsZSwgTlVMTCkpKQotCQkJZ290byBmaW5hbGx5OworICAgICAgICBpZiAoISggY2xhc3NfYXJncyA9CisgICAgICAgICAgICAgICBQeU9iamVjdF9DYWxsKGdldGluaXRhcmdzX2Z1bmMsIGVtcHR5X3R1cGxlLCBOVUxMKSkpCisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQkJaWYgKChsZW4gPSBQeU9iamVjdF9TaXplKGNsYXNzX2FyZ3MpKSA8IDApCi0JCQlnb3RvIGZpbmFsbHk7CisgICAgICAgIGlmICgobGVuID0gUHlPYmplY3RfU2l6ZShjbGFzc19hcmdzKSkgPCAwKQorICAgICAgICAgICAgZ290byBmaW5hbGx5OwogCi0JCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJaWYgKCEoIGVsZW1lbnQgPSBQeVNlcXVlbmNlX0dldEl0ZW0oY2xhc3NfYXJncywgaSkpKQotCQkJCWdvdG8gZmluYWxseTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgICAgICBpZiAoISggZWxlbWVudCA9IFB5U2VxdWVuY2VfR2V0SXRlbShjbGFzc19hcmdzLCBpKSkpCisgICAgICAgICAgICAgICAgZ290byBmaW5hbGx5OwogCi0JCQlpZiAoc2F2ZShzZWxmLCBlbGVtZW50LCAwKSA8IDApIHsKLQkJCQlQeV9ERUNSRUYoZWxlbWVudCk7Ci0JCQkJZ290byBmaW5hbGx5OwotCQkJfQorICAgICAgICAgICAgaWYgKHNhdmUoc2VsZiwgZWxlbWVudCwgMCkgPCAwKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGVsZW1lbnQpOworICAgICAgICAgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICAgICAgICAgIH0KIAotCQkJUHlfREVDUkVGKGVsZW1lbnQpOwotCQl9Ci0JfQotCWVsc2UgewotCQlpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19BdHRyaWJ1dGVFcnJvcikpCi0JCQlQeUVycl9DbGVhcigpOwotCQllbHNlCi0JCQlnb3RvIGZpbmFsbHk7Ci0JfQorICAgICAgICAgICAgUHlfREVDUkVGKGVsZW1lbnQpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19BdHRyaWJ1dGVFcnJvcikpCisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgfQogCi0JaWYgKCFzZWxmLT5iaW4pIHsKLQkJaWYgKCEoIG5hbWUgPSAoKFB5Q2xhc3NPYmplY3QgKiljbGFzcyktPmNsX25hbWUgKSkgIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQaWNrbGluZ0Vycm9yLCAiY2xhc3MgaGFzIG5vIG5hbWUiKTsKLQkJCWdvdG8gZmluYWxseTsKLQkJfQorICAgIGlmICghc2VsZi0+YmluKSB7CisgICAgICAgIGlmICghKCBuYW1lID0gKChQeUNsYXNzT2JqZWN0ICopY2xhc3MpLT5jbF9uYW1lICkpICB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUGlja2xpbmdFcnJvciwgImNsYXNzIGhhcyBubyBuYW1lIik7CisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgICAgIH0KIAotCQlpZiAoISggbW9kdWxlID0gd2hpY2htb2R1bGUoY2xhc3MsIG5hbWUpKSkKLQkJCWdvdG8gZmluYWxseTsKKyAgICAgICAgaWYgKCEoIG1vZHVsZSA9IHdoaWNobW9kdWxlKGNsYXNzLCBuYW1lKSkpCisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CiAKIAotCQlpZiAoKG1vZHVsZV9zaXplID0gUHlTdHJpbmdfU2l6ZShtb2R1bGUpKSA8IDAgfHwKLQkJICAgIChuYW1lX3NpemUgPSBQeVN0cmluZ19TaXplKG5hbWUpKSA8IDApCi0JCQlnb3RvIGZpbmFsbHk7CisgICAgICAgIGlmICgobW9kdWxlX3NpemUgPSBQeVN0cmluZ19TaXplKG1vZHVsZSkpIDwgMCB8fAorICAgICAgICAgICAgKG5hbWVfc2l6ZSA9IFB5U3RyaW5nX1NpemUobmFtZSkpIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZmluYWxseTsKIAotCQltb2R1bGVfc3RyID0gUHlTdHJpbmdfQVNfU1RSSU5HKChQeVN0cmluZ09iamVjdCAqKW1vZHVsZSk7Ci0JCW5hbWVfc3RyICAgPSBQeVN0cmluZ19BU19TVFJJTkcoKFB5U3RyaW5nT2JqZWN0ICopbmFtZSk7CisgICAgICAgIG1vZHVsZV9zdHIgPSBQeVN0cmluZ19BU19TVFJJTkcoKFB5U3RyaW5nT2JqZWN0ICopbW9kdWxlKTsKKyAgICAgICAgbmFtZV9zdHIgICA9IFB5U3RyaW5nX0FTX1NUUklORygoUHlTdHJpbmdPYmplY3QgKiluYW1lKTsKIAotCQlpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCAmaW5zdCwgMSkgPCAwKQotCQkJZ290byBmaW5hbGx5OworICAgICAgICBpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCAmaW5zdCwgMSkgPCAwKQorICAgICAgICAgICAgZ290byBmaW5hbGx5OwogCi0JCWlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsIG1vZHVsZV9zdHIsIG1vZHVsZV9zaXplKSA8IDApCi0JCQlnb3RvIGZpbmFsbHk7CisgICAgICAgIGlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsIG1vZHVsZV9zdHIsIG1vZHVsZV9zaXplKSA8IDApCisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQkJaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgIlxuIiwgMSkgPCAwKQotCQkJZ290byBmaW5hbGx5OworICAgICAgICBpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCAiXG4iLCAxKSA8IDApCisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQkJaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgbmFtZV9zdHIsIG5hbWVfc2l6ZSkgPCAwKQotCQkJZ290byBmaW5hbGx5OworICAgICAgICBpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCBuYW1lX3N0ciwgbmFtZV9zaXplKSA8IDApCisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQkJaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgIlxuIiwgMSkgPCAwKQotCQkJZ290byBmaW5hbGx5OwotCX0KLQllbHNlIGlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsICZvYmosIDEpIDwgMCkgewotCQlnb3RvIGZpbmFsbHk7Ci0JfQorICAgICAgICBpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCAiXG4iLCAxKSA8IDApCisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgfQorICAgIGVsc2UgaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgJm9iaiwgMSkgPCAwKSB7CisgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICB9CiAKLQlpZiAoKGdldHN0YXRlX2Z1bmMgPSBQeU9iamVjdF9HZXRBdHRyKGFyZ3MsIF9fZ2V0c3RhdGVfX19zdHIpKSkgewotCQlzdGF0ZSA9IFB5T2JqZWN0X0NhbGwoZ2V0c3RhdGVfZnVuYywgZW1wdHlfdHVwbGUsIE5VTEwpOwotCQlpZiAoIXN0YXRlKQotCQkJZ290byBmaW5hbGx5OwotCX0KLQllbHNlIHsKLQkJaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfQXR0cmlidXRlRXJyb3IpKQotCQkJUHlFcnJfQ2xlYXIoKTsKLQkJZWxzZQotCQkJZ290byBmaW5hbGx5OworICAgIGlmICgoZ2V0c3RhdGVfZnVuYyA9IFB5T2JqZWN0X0dldEF0dHIoYXJncywgX19nZXRzdGF0ZV9fX3N0cikpKSB7CisgICAgICAgIHN0YXRlID0gUHlPYmplY3RfQ2FsbChnZXRzdGF0ZV9mdW5jLCBlbXB0eV90dXBsZSwgTlVMTCk7CisgICAgICAgIGlmICghc3RhdGUpCisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19BdHRyaWJ1dGVFcnJvcikpCisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQkJaWYgKCEoIHN0YXRlID0gUHlPYmplY3RfR2V0QXR0cihhcmdzLCBfX2RpY3RfX19zdHIpKSkgIHsKLQkJCWlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkKLQkJCQlQeUVycl9DbGVhcigpOwotCQkJZWxzZQotCQkJCWdvdG8gZmluYWxseTsKLQkJCXJlcyA9IDA7Ci0JCQlnb3RvIGZpbmFsbHk7Ci0JCX0KLQl9CisgICAgICAgIGlmICghKCBzdGF0ZSA9IFB5T2JqZWN0X0dldEF0dHIoYXJncywgX19kaWN0X19fc3RyKSkpICB7CisgICAgICAgICAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19BdHRyaWJ1dGVFcnJvcikpCisgICAgICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgICAgICAgICByZXMgPSAwOworICAgICAgICAgICAgZ290byBmaW5hbGx5OworICAgICAgICB9CisgICAgfQogCi0JaWYgKCFQeURpY3RfQ2hlY2soc3RhdGUpKSB7Ci0JCWlmIChwdXQyKHNlbGYsIGFyZ3MpIDwgMCkKLQkJCWdvdG8gZmluYWxseTsKLQl9Ci0JZWxzZSB7Ci0JCWlmIChwdXQoc2VsZiwgYXJncykgPCAwKQotCQkJZ290byBmaW5hbGx5OwotCX0KKyAgICBpZiAoIVB5RGljdF9DaGVjayhzdGF0ZSkpIHsKKyAgICAgICAgaWYgKHB1dDIoc2VsZiwgYXJncykgPCAwKQorICAgICAgICAgICAgZ290byBmaW5hbGx5OworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKHB1dChzZWxmLCBhcmdzKSA8IDApCisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgfQogCi0JaWYgKHNhdmUoc2VsZiwgc3RhdGUsIDApIDwgMCkKLQkJZ290byBmaW5hbGx5OworICAgIGlmIChzYXZlKHNlbGYsIHN0YXRlLCAwKSA8IDApCisgICAgICAgIGdvdG8gZmluYWxseTsKIAotCWlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsICZidWlsZCwgMSkgPCAwKQotCQlnb3RvIGZpbmFsbHk7CisgICAgaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgJmJ1aWxkLCAxKSA8IDApCisgICAgICAgIGdvdG8gZmluYWxseTsKIAotCXJlcyA9IDA7CisgICAgcmVzID0gMDsKIAogICBmaW5hbGx5OgotCWlmIChzZWxmLT5mYXN0ICYmICFmYXN0X3NhdmVfbGVhdmUoc2VsZiwgYXJncykpCi0JCXJlcyA9IC0xOworICAgIGlmIChzZWxmLT5mYXN0ICYmICFmYXN0X3NhdmVfbGVhdmUoc2VsZiwgYXJncykpCisgICAgICAgIHJlcyA9IC0xOwogCi0JUHlfWERFQ1JFRihtb2R1bGUpOwotCVB5X1hERUNSRUYoY2xhc3MpOwotCVB5X1hERUNSRUYoc3RhdGUpOwotCVB5X1hERUNSRUYoZ2V0aW5pdGFyZ3NfZnVuYyk7Ci0JUHlfWERFQ1JFRihnZXRzdGF0ZV9mdW5jKTsKLQlQeV9YREVDUkVGKGNsYXNzX2FyZ3MpOworICAgIFB5X1hERUNSRUYobW9kdWxlKTsKKyAgICBQeV9YREVDUkVGKGNsYXNzKTsKKyAgICBQeV9YREVDUkVGKHN0YXRlKTsKKyAgICBQeV9YREVDUkVGKGdldGluaXRhcmdzX2Z1bmMpOworICAgIFB5X1hERUNSRUYoZ2V0c3RhdGVfZnVuYyk7CisgICAgUHlfWERFQ1JFRihjbGFzc19hcmdzKTsKIAotCXJldHVybiByZXM7CisgICAgcmV0dXJuIHJlczsKIH0KIAogCiBzdGF0aWMgaW50CiBzYXZlX2dsb2JhbChQaWNrbGVyb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKm5hbWUpCiB7Ci0JUHlPYmplY3QgKmdsb2JhbF9uYW1lID0gMCwgKm1vZHVsZSA9IDAsICptb2QgPSAwLCAqa2xhc3MgPSAwOwotCWNoYXIgKm5hbWVfc3RyLCAqbW9kdWxlX3N0cjsKLQlpbnQgbW9kdWxlX3NpemUsIG5hbWVfc2l6ZSwgcmVzID0gLTE7CisgICAgUHlPYmplY3QgKmdsb2JhbF9uYW1lID0gMCwgKm1vZHVsZSA9IDAsICptb2QgPSAwLCAqa2xhc3MgPSAwOworICAgIGNoYXIgKm5hbWVfc3RyLCAqbW9kdWxlX3N0cjsKKyAgICBpbnQgbW9kdWxlX3NpemUsIG5hbWVfc2l6ZSwgcmVzID0gLTE7CiAKLQlzdGF0aWMgY2hhciBnbG9iYWwgPSBHTE9CQUw7CisgICAgc3RhdGljIGNoYXIgZ2xvYmFsID0gR0xPQkFMOwogCi0JaWYgKG5hbWUpIHsKLQkJZ2xvYmFsX25hbWUgPSBuYW1lOwotCQlQeV9JTkNSRUYoZ2xvYmFsX25hbWUpOwotCX0KLQllbHNlIHsKLQkJaWYgKCEoIGdsb2JhbF9uYW1lID0gUHlPYmplY3RfR2V0QXR0cihhcmdzLCBfX25hbWVfX19zdHIpKSkKLQkJCWdvdG8gZmluYWxseTsKLQl9CisgICAgaWYgKG5hbWUpIHsKKyAgICAgICAgZ2xvYmFsX25hbWUgPSBuYW1lOworICAgICAgICBQeV9JTkNSRUYoZ2xvYmFsX25hbWUpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKCEoIGdsb2JhbF9uYW1lID0gUHlPYmplY3RfR2V0QXR0cihhcmdzLCBfX25hbWVfX19zdHIpKSkKKyAgICAgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICB9CiAKLQlpZiAoISggbW9kdWxlID0gd2hpY2htb2R1bGUoYXJncywgZ2xvYmFsX25hbWUpKSkKLQkJZ290byBmaW5hbGx5OworICAgIGlmICghKCBtb2R1bGUgPSB3aGljaG1vZHVsZShhcmdzLCBnbG9iYWxfbmFtZSkpKQorICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQlpZiAoKG1vZHVsZV9zaXplID0gUHlTdHJpbmdfU2l6ZShtb2R1bGUpKSA8IDAgfHwKLQkgICAgKG5hbWVfc2l6ZSA9IFB5U3RyaW5nX1NpemUoZ2xvYmFsX25hbWUpKSA8IDApCi0JCWdvdG8gZmluYWxseTsKKyAgICBpZiAoKG1vZHVsZV9zaXplID0gUHlTdHJpbmdfU2l6ZShtb2R1bGUpKSA8IDAgfHwKKyAgICAgICAgKG5hbWVfc2l6ZSA9IFB5U3RyaW5nX1NpemUoZ2xvYmFsX25hbWUpKSA8IDApCisgICAgICAgIGdvdG8gZmluYWxseTsKIAotCW1vZHVsZV9zdHIgPSBQeVN0cmluZ19BU19TVFJJTkcoKFB5U3RyaW5nT2JqZWN0ICopbW9kdWxlKTsKLQluYW1lX3N0ciAgID0gUHlTdHJpbmdfQVNfU1RSSU5HKChQeVN0cmluZ09iamVjdCAqKWdsb2JhbF9uYW1lKTsKKyAgICBtb2R1bGVfc3RyID0gUHlTdHJpbmdfQVNfU1RSSU5HKChQeVN0cmluZ09iamVjdCAqKW1vZHVsZSk7CisgICAgbmFtZV9zdHIgICA9IFB5U3RyaW5nX0FTX1NUUklORygoUHlTdHJpbmdPYmplY3QgKilnbG9iYWxfbmFtZSk7CiAKLQkvKiBYWFggVGhpcyBjYW4gYmUgZG9pbmcgYSByZWxhdGl2ZSBpbXBvcnQuICBDbGVhcmx5IGl0IHNob3VsZG4ndCwKLQkgICBidXQgSSBkb24ndCBrbm93IGhvdyB0byBzdG9wIGl0LiA6LSggKi8KLQltb2QgPSBQeUltcG9ydF9JbXBvcnRNb2R1bGUobW9kdWxlX3N0cik7Ci0JaWYgKG1vZCA9PSBOVUxMKSB7Ci0JCWNQaWNrbGVfRXJyRm9ybWF0KFBpY2tsaW5nRXJyb3IsCi0JCQkJICAiQ2FuJ3QgcGlja2xlICVzOiBpbXBvcnQgb2YgbW9kdWxlICVzICIKLQkJCQkgICJmYWlsZWQiLAotCQkJCSAgIk9TIiwgYXJncywgbW9kdWxlKTsKLQkJZ290byBmaW5hbGx5OwotCX0KLQlrbGFzcyA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcobW9kLCBuYW1lX3N0cik7Ci0JaWYgKGtsYXNzID09IE5VTEwpIHsKLQkJY1BpY2tsZV9FcnJGb3JtYXQoUGlja2xpbmdFcnJvciwKLQkJCQkgICJDYW4ndCBwaWNrbGUgJXM6IGF0dHJpYnV0ZSBsb29rdXAgJXMuJXMgIgotCQkJCSAgImZhaWxlZCIsCi0JCQkJICAiT1NTIiwgYXJncywgbW9kdWxlLCBnbG9iYWxfbmFtZSk7Ci0JCWdvdG8gZmluYWxseTsKLQl9Ci0JaWYgKGtsYXNzICE9IGFyZ3MpIHsKLQkJUHlfREVDUkVGKGtsYXNzKTsKLQkJY1BpY2tsZV9FcnJGb3JtYXQoUGlja2xpbmdFcnJvciwKLQkJCQkgICJDYW4ndCBwaWNrbGUgJXM6IGl0J3Mgbm90IHRoZSBzYW1lIG9iamVjdCAiCi0JCQkJICAJImFzICVzLiVzIiwKLQkJCQkgICJPU1MiLCBhcmdzLCBtb2R1bGUsIGdsb2JhbF9uYW1lKTsKLQkJZ290byBmaW5hbGx5OwotCX0KLQlQeV9ERUNSRUYoa2xhc3MpOworICAgIC8qIFhYWCBUaGlzIGNhbiBiZSBkb2luZyBhIHJlbGF0aXZlIGltcG9ydC4gIENsZWFybHkgaXQgc2hvdWxkbid0LAorICAgICAgIGJ1dCBJIGRvbid0IGtub3cgaG93IHRvIHN0b3AgaXQuIDotKCAqLworICAgIG1vZCA9IFB5SW1wb3J0X0ltcG9ydE1vZHVsZShtb2R1bGVfc3RyKTsKKyAgICBpZiAobW9kID09IE5VTEwpIHsKKyAgICAgICAgY1BpY2tsZV9FcnJGb3JtYXQoUGlja2xpbmdFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkNhbid0IHBpY2tsZSAlczogaW1wb3J0IG9mIG1vZHVsZSAlcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJmYWlsZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiT1MiLCBhcmdzLCBtb2R1bGUpOworICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgfQorICAgIGtsYXNzID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhtb2QsIG5hbWVfc3RyKTsKKyAgICBpZiAoa2xhc3MgPT0gTlVMTCkgeworICAgICAgICBjUGlja2xlX0VyckZvcm1hdChQaWNrbGluZ0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2FuJ3QgcGlja2xlICVzOiBhdHRyaWJ1dGUgbG9va3VwICVzLiVzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImZhaWxlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJPU1MiLCBhcmdzLCBtb2R1bGUsIGdsb2JhbF9uYW1lKTsKKyAgICAgICAgZ290byBmaW5hbGx5OworICAgIH0KKyAgICBpZiAoa2xhc3MgIT0gYXJncykgeworICAgICAgICBQeV9ERUNSRUYoa2xhc3MpOworICAgICAgICBjUGlja2xlX0VyckZvcm1hdChQaWNrbGluZ0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2FuJ3QgcGlja2xlICVzOiBpdCdzIG5vdCB0aGUgc2FtZSBvYmplY3QgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXMgJXMuJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiT1NTIiwgYXJncywgbW9kdWxlLCBnbG9iYWxfbmFtZSk7CisgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICB9CisgICAgUHlfREVDUkVGKGtsYXNzKTsKIAotCWlmIChzZWxmLT5wcm90byA+PSAyKSB7Ci0JCS8qIFNlZSB3aGV0aGVyIHRoaXMgaXMgaW4gdGhlIGV4dGVuc2lvbiByZWdpc3RyeSwgYW5kIGlmCi0JCSAqIHNvIGdlbmVyYXRlIGFuIEVYVCBvcGNvZGUuCi0JCSAqLwotCQlQeU9iamVjdCAqcHlfY29kZTsJLyogZXh0ZW5zaW9uIGNvZGUgYXMgUHl0aG9uIG9iamVjdCAqLwotCQlsb25nIGNvZGU7CQkvKiBleHRlbnNpb24gY29kZSBhcyBDIHZhbHVlICovCi0JCWNoYXIgY19zdHJbNV07Ci0JCWludCBuOworICAgIGlmIChzZWxmLT5wcm90byA+PSAyKSB7CisgICAgICAgIC8qIFNlZSB3aGV0aGVyIHRoaXMgaXMgaW4gdGhlIGV4dGVuc2lvbiByZWdpc3RyeSwgYW5kIGlmCisgICAgICAgICAqIHNvIGdlbmVyYXRlIGFuIEVYVCBvcGNvZGUuCisgICAgICAgICAqLworICAgICAgICBQeU9iamVjdCAqcHlfY29kZTsgICAgICAgICAgICAgIC8qIGV4dGVuc2lvbiBjb2RlIGFzIFB5dGhvbiBvYmplY3QgKi8KKyAgICAgICAgbG9uZyBjb2RlOyAgICAgICAgICAgICAgICAgICAgICAvKiBleHRlbnNpb24gY29kZSBhcyBDIHZhbHVlICovCisgICAgICAgIGNoYXIgY19zdHJbNV07CisgICAgICAgIGludCBuOwogCi0JCVB5VHVwbGVfU0VUX0lURU0odHdvX3R1cGxlLCAwLCBtb2R1bGUpOwotCQlQeVR1cGxlX1NFVF9JVEVNKHR3b190dXBsZSwgMSwgZ2xvYmFsX25hbWUpOwotCQlweV9jb2RlID0gUHlEaWN0X0dldEl0ZW0oZXh0ZW5zaW9uX3JlZ2lzdHJ5LCB0d29fdHVwbGUpOwotCQlpZiAocHlfY29kZSA9PSBOVUxMKQotCQkJZ290byBnZW5fZ2xvYmFsOwkvKiBub3QgcmVnaXN0ZXJlZCAqLworICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKHR3b190dXBsZSwgMCwgbW9kdWxlKTsKKyAgICAgICAgUHlUdXBsZV9TRVRfSVRFTSh0d29fdHVwbGUsIDEsIGdsb2JhbF9uYW1lKTsKKyAgICAgICAgcHlfY29kZSA9IFB5RGljdF9HZXRJdGVtKGV4dGVuc2lvbl9yZWdpc3RyeSwgdHdvX3R1cGxlKTsKKyAgICAgICAgaWYgKHB5X2NvZGUgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gZ2VuX2dsb2JhbDsgICAgICAgICAgICAgICAgICAgIC8qIG5vdCByZWdpc3RlcmVkICovCiAKLQkJLyogVmVyaWZ5IHB5X2NvZGUgaGFzIHRoZSByaWdodCB0eXBlIGFuZCB2YWx1ZS4gKi8KLQkJaWYgKCFQeUludF9DaGVjayhweV9jb2RlKSkgewotCQkJY1BpY2tsZV9FcnJGb3JtYXQoUGlja2xpbmdFcnJvciwgIkNhbid0IHBpY2tsZSAlczogIgotCQkJCSJleHRlbnNpb24gY29kZSAlcyBpc24ndCBhbiBpbnRlZ2VyIiwKLQkJCQkiT08iLCBhcmdzLCBweV9jb2RlKTsKLQkJCWdvdG8gZmluYWxseTsKLQkJfQotCQljb2RlID0gUHlJbnRfQVNfTE9ORyhweV9jb2RlKTsKLQkJaWYgKGNvZGUgPD0gMCB8fCAgY29kZSA+IDB4N2ZmZmZmZmZMKSB7Ci0JCQljUGlja2xlX0VyckZvcm1hdChQaWNrbGluZ0Vycm9yLCAiQ2FuJ3QgcGlja2xlICVzOiAiCi0JCQkJImV4dGVuc2lvbiBjb2RlICVsZCBpcyBvdXQgb2YgcmFuZ2UiLAotCQkJCSJPbCIsIGFyZ3MsIGNvZGUpOwotCQkJZ290byBmaW5hbGx5OwotCQl9CisgICAgICAgIC8qIFZlcmlmeSBweV9jb2RlIGhhcyB0aGUgcmlnaHQgdHlwZSBhbmQgdmFsdWUuICovCisgICAgICAgIGlmICghUHlJbnRfQ2hlY2socHlfY29kZSkpIHsKKyAgICAgICAgICAgIGNQaWNrbGVfRXJyRm9ybWF0KFBpY2tsaW5nRXJyb3IsICJDYW4ndCBwaWNrbGUgJXM6ICIKKyAgICAgICAgICAgICAgICAiZXh0ZW5zaW9uIGNvZGUgJXMgaXNuJ3QgYW4gaW50ZWdlciIsCisgICAgICAgICAgICAgICAgIk9PIiwgYXJncywgcHlfY29kZSk7CisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgICAgIH0KKyAgICAgICAgY29kZSA9IFB5SW50X0FTX0xPTkcocHlfY29kZSk7CisgICAgICAgIGlmIChjb2RlIDw9IDAgfHwgIGNvZGUgPiAweDdmZmZmZmZmTCkgeworICAgICAgICAgICAgY1BpY2tsZV9FcnJGb3JtYXQoUGlja2xpbmdFcnJvciwgIkNhbid0IHBpY2tsZSAlczogIgorICAgICAgICAgICAgICAgICJleHRlbnNpb24gY29kZSAlbGQgaXMgb3V0IG9mIHJhbmdlIiwKKyAgICAgICAgICAgICAgICAiT2wiLCBhcmdzLCBjb2RlKTsKKyAgICAgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICAgICAgfQogCi0JCS8qIEdlbmVyYXRlIGFuIEVYVCBvcGNvZGUuICovCi0JCWlmIChjb2RlIDw9IDB4ZmYpIHsKLQkJCWNfc3RyWzBdID0gRVhUMTsKLQkJCWNfc3RyWzFdID0gKGNoYXIpY29kZTsKLQkJCW4gPSAyOwotCQl9Ci0JCWVsc2UgaWYgKGNvZGUgPD0gMHhmZmZmKSB7Ci0JCQljX3N0clswXSA9IEVYVDI7Ci0JCQljX3N0clsxXSA9IChjaGFyKShjb2RlICYgMHhmZik7Ci0JCQljX3N0clsyXSA9IChjaGFyKSgoY29kZSA+PiA4KSAmIDB4ZmYpOwotCQkJbiA9IDM7Ci0JCX0KLQkJZWxzZSB7Ci0JCQljX3N0clswXSA9IEVYVDQ7Ci0JCQljX3N0clsxXSA9IChjaGFyKShjb2RlICYgMHhmZik7Ci0JCQljX3N0clsyXSA9IChjaGFyKSgoY29kZSA+PiA4KSAmIDB4ZmYpOwotCQkJY19zdHJbM10gPSAoY2hhcikoKGNvZGUgPj4gMTYpICYgMHhmZik7Ci0JCQljX3N0cls0XSA9IChjaGFyKSgoY29kZSA+PiAyNCkgJiAweGZmKTsKLQkJCW4gPSA1OwotCQl9CisgICAgICAgIC8qIEdlbmVyYXRlIGFuIEVYVCBvcGNvZGUuICovCisgICAgICAgIGlmIChjb2RlIDw9IDB4ZmYpIHsKKyAgICAgICAgICAgIGNfc3RyWzBdID0gRVhUMTsKKyAgICAgICAgICAgIGNfc3RyWzFdID0gKGNoYXIpY29kZTsKKyAgICAgICAgICAgIG4gPSAyOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGNvZGUgPD0gMHhmZmZmKSB7CisgICAgICAgICAgICBjX3N0clswXSA9IEVYVDI7CisgICAgICAgICAgICBjX3N0clsxXSA9IChjaGFyKShjb2RlICYgMHhmZik7CisgICAgICAgICAgICBjX3N0clsyXSA9IChjaGFyKSgoY29kZSA+PiA4KSAmIDB4ZmYpOworICAgICAgICAgICAgbiA9IDM7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBjX3N0clswXSA9IEVYVDQ7CisgICAgICAgICAgICBjX3N0clsxXSA9IChjaGFyKShjb2RlICYgMHhmZik7CisgICAgICAgICAgICBjX3N0clsyXSA9IChjaGFyKSgoY29kZSA+PiA4KSAmIDB4ZmYpOworICAgICAgICAgICAgY19zdHJbM10gPSAoY2hhcikoKGNvZGUgPj4gMTYpICYgMHhmZik7CisgICAgICAgICAgICBjX3N0cls0XSA9IChjaGFyKSgoY29kZSA+PiAyNCkgJiAweGZmKTsKKyAgICAgICAgICAgIG4gPSA1OworICAgICAgICB9CiAKLQkJaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgY19zdHIsIG4pID49IDApCi0JCQlyZXMgPSAwOwotCQlnb3RvIGZpbmFsbHk7CS8qIGFuZCBkb24ndCBtZW1vaXplICovCi0JfQorICAgICAgICBpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCBjX3N0ciwgbikgPj0gMCkKKyAgICAgICAgICAgIHJlcyA9IDA7CisgICAgICAgIGdvdG8gZmluYWxseTsgICAgICAgICAgIC8qIGFuZCBkb24ndCBtZW1vaXplICovCisgICAgfQogCiAgIGdlbl9nbG9iYWw6Ci0JaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgJmdsb2JhbCwgMSkgPCAwKQotCQlnb3RvIGZpbmFsbHk7CisgICAgaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgJmdsb2JhbCwgMSkgPCAwKQorICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQlpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCBtb2R1bGVfc3RyLCBtb2R1bGVfc2l6ZSkgPCAwKQotCQlnb3RvIGZpbmFsbHk7CisgICAgaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgbW9kdWxlX3N0ciwgbW9kdWxlX3NpemUpIDwgMCkKKyAgICAgICAgZ290byBmaW5hbGx5OwogCi0JaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgIlxuIiwgMSkgPCAwKQotCQlnb3RvIGZpbmFsbHk7CisgICAgaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgIlxuIiwgMSkgPCAwKQorICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQlpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCBuYW1lX3N0ciwgbmFtZV9zaXplKSA8IDApCi0JCWdvdG8gZmluYWxseTsKKyAgICBpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCBuYW1lX3N0ciwgbmFtZV9zaXplKSA8IDApCisgICAgICAgIGdvdG8gZmluYWxseTsKIAotCWlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsICJcbiIsIDEpIDwgMCkKLQkJZ290byBmaW5hbGx5OworICAgIGlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsICJcbiIsIDEpIDwgMCkKKyAgICAgICAgZ290byBmaW5hbGx5OwogCi0JaWYgKHB1dChzZWxmLCBhcmdzKSA8IDApCi0JCWdvdG8gZmluYWxseTsKKyAgICBpZiAocHV0KHNlbGYsIGFyZ3MpIDwgMCkKKyAgICAgICAgZ290byBmaW5hbGx5OwogCi0JcmVzID0gMDsKKyAgICByZXMgPSAwOwogCiAgIGZpbmFsbHk6Ci0JUHlfWERFQ1JFRihtb2R1bGUpOwotCVB5X1hERUNSRUYoZ2xvYmFsX25hbWUpOwotCVB5X1hERUNSRUYobW9kKTsKKyAgICBQeV9YREVDUkVGKG1vZHVsZSk7CisgICAgUHlfWERFQ1JFRihnbG9iYWxfbmFtZSk7CisgICAgUHlfWERFQ1JFRihtb2QpOwogCi0JcmV0dXJuIHJlczsKKyAgICByZXR1cm4gcmVzOwogfQogCiBzdGF0aWMgaW50CiBzYXZlX3BlcnMoUGlja2xlcm9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICpmKQogewotCVB5T2JqZWN0ICpwaWQgPSAwOwotCWludCBzaXplLCByZXMgPSAtMTsKKyAgICBQeU9iamVjdCAqcGlkID0gMDsKKyAgICBpbnQgc2l6ZSwgcmVzID0gLTE7CiAKLQlzdGF0aWMgY2hhciBwZXJzaWQgPSBQRVJTSUQsIGJpbnBlcnNpZCA9IEJJTlBFUlNJRDsKKyAgICBzdGF0aWMgY2hhciBwZXJzaWQgPSBQRVJTSUQsIGJpbnBlcnNpZCA9IEJJTlBFUlNJRDsKIAotCVB5X0lOQ1JFRihhcmdzKTsKLQlBUkdfVFVQKHNlbGYsIGFyZ3MpOwotCWlmIChzZWxmLT5hcmcpIHsKLQkJcGlkID0gUHlPYmplY3RfQ2FsbChmLCBzZWxmLT5hcmcsIE5VTEwpOwotCQlGUkVFX0FSR19UVVAoc2VsZik7Ci0JfQotCWlmICghIHBpZCkgcmV0dXJuIC0xOworICAgIFB5X0lOQ1JFRihhcmdzKTsKKyAgICBBUkdfVFVQKHNlbGYsIGFyZ3MpOworICAgIGlmIChzZWxmLT5hcmcpIHsKKyAgICAgICAgcGlkID0gUHlPYmplY3RfQ2FsbChmLCBzZWxmLT5hcmcsIE5VTEwpOworICAgICAgICBGUkVFX0FSR19UVVAoc2VsZik7CisgICAgfQorICAgIGlmICghIHBpZCkgcmV0dXJuIC0xOwogCi0JaWYgKHBpZCAhPSBQeV9Ob25lKSB7Ci0JCWlmICghc2VsZi0+YmluKSB7Ci0JCQlpZiAoIVB5U3RyaW5nX0NoZWNrKHBpZCkpIHsKLQkJCQlQeUVycl9TZXRTdHJpbmcoUGlja2xpbmdFcnJvciwKLQkJCQkJCSJwZXJzaXN0ZW50IGlkIG11c3QgYmUgc3RyaW5nIik7Ci0JCQkJZ290byBmaW5hbGx5OwotCQkJfQorICAgIGlmIChwaWQgIT0gUHlfTm9uZSkgeworICAgICAgICBpZiAoIXNlbGYtPmJpbikgeworICAgICAgICAgICAgaWYgKCFQeVN0cmluZ19DaGVjayhwaWQpKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFBpY2tsaW5nRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwZXJzaXN0ZW50IGlkIG11c3QgYmUgc3RyaW5nIik7CisgICAgICAgICAgICAgICAgZ290byBmaW5hbGx5OworICAgICAgICAgICAgfQogCi0JCQlpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCAmcGVyc2lkLCAxKSA8IDApCi0JCQkJZ290byBmaW5hbGx5OworICAgICAgICAgICAgaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgJnBlcnNpZCwgMSkgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gZmluYWxseTsKIAotCQkJaWYgKChzaXplID0gUHlTdHJpbmdfU2l6ZShwaWQpKSA8IDApCi0JCQkJZ290byBmaW5hbGx5OworICAgICAgICAgICAgaWYgKChzaXplID0gUHlTdHJpbmdfU2l6ZShwaWQpKSA8IDApCisgICAgICAgICAgICAgICAgZ290byBmaW5hbGx5OwogCi0JCQlpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLAotCQkJCQkgICAgIFB5U3RyaW5nX0FTX1NUUklORygKLQkJCQkJICAgICAJKFB5U3RyaW5nT2JqZWN0ICopcGlkKSwKLQkJCQkJICAgICBzaXplKSA8IDApCi0JCQkJZ290byBmaW5hbGx5OworICAgICAgICAgICAgaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FTX1NUUklORygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQeVN0cmluZ09iamVjdCAqKXBpZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplKSA8IDApCisgICAgICAgICAgICAgICAgZ290byBmaW5hbGx5OwogCi0JCQlpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCAiXG4iLCAxKSA8IDApCi0JCQkJZ290byBmaW5hbGx5OworICAgICAgICAgICAgaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgIlxuIiwgMSkgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gZmluYWxseTsKIAotCQkJcmVzID0gMTsKLQkJCWdvdG8gZmluYWxseTsKLQkJfQotCQllbHNlIGlmIChzYXZlKHNlbGYsIHBpZCwgMSkgPj0gMCkgewotCQkJaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgJmJpbnBlcnNpZCwgMSkgPCAwKQotCQkJCXJlcyA9IC0xOwotCQkJZWxzZQotCQkJCXJlcyA9IDE7Ci0JCX0KKyAgICAgICAgICAgIHJlcyA9IDE7CisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoc2F2ZShzZWxmLCBwaWQsIDEpID49IDApIHsKKyAgICAgICAgICAgIGlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsICZiaW5wZXJzaWQsIDEpIDwgMCkKKyAgICAgICAgICAgICAgICByZXMgPSAtMTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXMgPSAxOworICAgICAgICB9CiAKLQkJZ290byBmaW5hbGx5OwotCX0KKyAgICAgICAgZ290byBmaW5hbGx5OworICAgIH0KIAotCXJlcyA9IDA7CisgICAgcmVzID0gMDsKIAogICBmaW5hbGx5OgotCVB5X1hERUNSRUYocGlkKTsKKyAgICBQeV9YREVDUkVGKHBpZCk7CiAKLQlyZXR1cm4gcmVzOworICAgIHJldHVybiByZXM7CiB9CiAKIC8qIFdlJ3JlIHNhdmluZyBvYiwgYW5kIGFyZ3MgaXMgdGhlIDItdGhydS01IHR1cGxlIHJldHVybmVkIGJ5IHRoZQpAQCAtMjI3MSw2MjEgKzIyNzEsNjIxIEBACiBzdGF0aWMgaW50CiBzYXZlX3JlZHVjZShQaWNrbGVyb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmZuLCBQeU9iamVjdCAqb2IpCiB7Ci0JUHlPYmplY3QgKmNhbGxhYmxlOwotCVB5T2JqZWN0ICphcmd0dXA7Ci0JUHlPYmplY3QgKnN0YXRlID0gTlVMTDsKLQlQeU9iamVjdCAqbGlzdGl0ZW1zID0gUHlfTm9uZTsKLQlQeU9iamVjdCAqZGljdGl0ZW1zID0gUHlfTm9uZTsKLQlQeV9zc2l6ZV90IHNpemU7CisgICAgUHlPYmplY3QgKmNhbGxhYmxlOworICAgIFB5T2JqZWN0ICphcmd0dXA7CisgICAgUHlPYmplY3QgKnN0YXRlID0gTlVMTDsKKyAgICBQeU9iamVjdCAqbGlzdGl0ZW1zID0gUHlfTm9uZTsKKyAgICBQeU9iamVjdCAqZGljdGl0ZW1zID0gUHlfTm9uZTsKKyAgICBQeV9zc2l6ZV90IHNpemU7CiAKLQlpbnQgdXNlX25ld29iaiA9IHNlbGYtPnByb3RvID49IDI7CisgICAgaW50IHVzZV9uZXdvYmogPSBzZWxmLT5wcm90byA+PSAyOwogCi0Jc3RhdGljIGNoYXIgcmVkdWNlID0gUkVEVUNFOwotCXN0YXRpYyBjaGFyIGJ1aWxkID0gQlVJTEQ7Ci0Jc3RhdGljIGNoYXIgbmV3b2JqID0gTkVXT0JKOworICAgIHN0YXRpYyBjaGFyIHJlZHVjZSA9IFJFRFVDRTsKKyAgICBzdGF0aWMgY2hhciBidWlsZCA9IEJVSUxEOworICAgIHN0YXRpYyBjaGFyIG5ld29iaiA9IE5FV09CSjsKIAotCXNpemUgPSBQeVR1cGxlX1NpemUoYXJncyk7Ci0JaWYgKHNpemUgPCAyIHx8IHNpemUgPiA1KSB7Ci0JCWNQaWNrbGVfRXJyRm9ybWF0KFBpY2tsaW5nRXJyb3IsICJ0dXBsZSByZXR1cm5lZCBieSAiCi0JCQkiJXMgbXVzdCBjb250YWluIDIgdGhyb3VnaCA1IGVsZW1lbnRzIiwKLQkJCSJPIiwgZm4pOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIHNpemUgPSBQeVR1cGxlX1NpemUoYXJncyk7CisgICAgaWYgKHNpemUgPCAyIHx8IHNpemUgPiA1KSB7CisgICAgICAgIGNQaWNrbGVfRXJyRm9ybWF0KFBpY2tsaW5nRXJyb3IsICJ0dXBsZSByZXR1cm5lZCBieSAiCisgICAgICAgICAgICAiJXMgbXVzdCBjb250YWluIDIgdGhyb3VnaCA1IGVsZW1lbnRzIiwKKyAgICAgICAgICAgICJPIiwgZm4pOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JaWYgKCEgUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInNhdmVfcmVkdWNlIiwgMiwgNSwKLQkJCQkmY2FsbGFibGUsCi0JCQkJJmFyZ3R1cCwKLQkJCQkmc3RhdGUsCi0JCQkJJmxpc3RpdGVtcywKLQkJCQkmZGljdGl0ZW1zKSkKLQkJcmV0dXJuIC0xOworICAgIGlmICghIFB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJzYXZlX3JlZHVjZSIsIDIsIDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNhbGxhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhcmd0dXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsaXN0aXRlbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRpY3RpdGVtcykpCisgICAgICAgIHJldHVybiAtMTsKIAotCWlmICghUHlUdXBsZV9DaGVjayhhcmd0dXApKSB7Ci0JCWNQaWNrbGVfRXJyRm9ybWF0KFBpY2tsaW5nRXJyb3IsICJTZWNvbmQgZWxlbWVudCBvZiAiCi0JCQkidHVwbGUgcmV0dXJuZWQgYnkgJXMgbXVzdCBiZSBhIHR1cGxlIiwKLQkJCSJPIiwgZm4pOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIGlmICghUHlUdXBsZV9DaGVjayhhcmd0dXApKSB7CisgICAgICAgIGNQaWNrbGVfRXJyRm9ybWF0KFBpY2tsaW5nRXJyb3IsICJTZWNvbmQgZWxlbWVudCBvZiAiCisgICAgICAgICAgICAidHVwbGUgcmV0dXJuZWQgYnkgJXMgbXVzdCBiZSBhIHR1cGxlIiwKKyAgICAgICAgICAgICJPIiwgZm4pOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JaWYgKHN0YXRlID09IFB5X05vbmUpCi0JCXN0YXRlID0gTlVMTDsKKyAgICBpZiAoc3RhdGUgPT0gUHlfTm9uZSkKKyAgICAgICAgc3RhdGUgPSBOVUxMOwogCi0JaWYgKGxpc3RpdGVtcyA9PSBQeV9Ob25lKQotCQlsaXN0aXRlbXMgPSBOVUxMOwotCWVsc2UgaWYgKCFQeUl0ZXJfQ2hlY2sobGlzdGl0ZW1zKSkgewotCQljUGlja2xlX0VyckZvcm1hdChQaWNrbGluZ0Vycm9yLCAiRm91cnRoIGVsZW1lbnQgb2YgIgotCQkJInR1cGxlIHJldHVybmVkIGJ5ICVzIG11c3QgYmUgYW4gaXRlcmF0b3IsIG5vdCAlcyIsCi0JCQkiT3MiLCBmbiwgUHlfVFlQRShsaXN0aXRlbXMpLT50cF9uYW1lKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICBpZiAobGlzdGl0ZW1zID09IFB5X05vbmUpCisgICAgICAgIGxpc3RpdGVtcyA9IE5VTEw7CisgICAgZWxzZSBpZiAoIVB5SXRlcl9DaGVjayhsaXN0aXRlbXMpKSB7CisgICAgICAgIGNQaWNrbGVfRXJyRm9ybWF0KFBpY2tsaW5nRXJyb3IsICJGb3VydGggZWxlbWVudCBvZiAiCisgICAgICAgICAgICAidHVwbGUgcmV0dXJuZWQgYnkgJXMgbXVzdCBiZSBhbiBpdGVyYXRvciwgbm90ICVzIiwKKyAgICAgICAgICAgICJPcyIsIGZuLCBQeV9UWVBFKGxpc3RpdGVtcyktPnRwX25hbWUpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JaWYgKGRpY3RpdGVtcyA9PSBQeV9Ob25lKQotCQlkaWN0aXRlbXMgPSBOVUxMOwotCWVsc2UgaWYgKCFQeUl0ZXJfQ2hlY2soZGljdGl0ZW1zKSkgewotCQljUGlja2xlX0VyckZvcm1hdChQaWNrbGluZ0Vycm9yLCAiRmlmdGggZWxlbWVudCBvZiAiCi0JCQkidHVwbGUgcmV0dXJuZWQgYnkgJXMgbXVzdCBiZSBhbiBpdGVyYXRvciwgbm90ICVzIiwKLQkJCSJPcyIsIGZuLCBQeV9UWVBFKGRpY3RpdGVtcyktPnRwX25hbWUpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIGlmIChkaWN0aXRlbXMgPT0gUHlfTm9uZSkKKyAgICAgICAgZGljdGl0ZW1zID0gTlVMTDsKKyAgICBlbHNlIGlmICghUHlJdGVyX0NoZWNrKGRpY3RpdGVtcykpIHsKKyAgICAgICAgY1BpY2tsZV9FcnJGb3JtYXQoUGlja2xpbmdFcnJvciwgIkZpZnRoIGVsZW1lbnQgb2YgIgorICAgICAgICAgICAgInR1cGxlIHJldHVybmVkIGJ5ICVzIG11c3QgYmUgYW4gaXRlcmF0b3IsIG5vdCAlcyIsCisgICAgICAgICAgICAiT3MiLCBmbiwgUHlfVFlQRShkaWN0aXRlbXMpLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotICAgICAgICAvKiBQcm90b2NvbCAyIHNwZWNpYWwgY2FzZTogaWYgY2FsbGFibGUncyBuYW1lIGlzIF9fbmV3b2JqX18sIHVzZQotICAgICAgICAgKiBORVdPQkouICBUaGlzIGNvbnN1bWVzIGEgbG90IG9mIGNvZGUuCi0gICAgICAgICAqLwotICAgICAgICBpZiAodXNlX25ld29iaikgewotICAgICAgICAJUHlPYmplY3QgKnRlbXAgPSBQeU9iamVjdF9HZXRBdHRyKGNhbGxhYmxlLCBfX25hbWVfX19zdHIpOworICAgIC8qIFByb3RvY29sIDIgc3BlY2lhbCBjYXNlOiBpZiBjYWxsYWJsZSdzIG5hbWUgaXMgX19uZXdvYmpfXywgdXNlCisgICAgICogTkVXT0JKLiAgVGhpcyBjb25zdW1lcyBhIGxvdCBvZiBjb2RlLgorICAgICAqLworICAgIGlmICh1c2VfbmV3b2JqKSB7CisgICAgICAgIFB5T2JqZWN0ICp0ZW1wID0gUHlPYmplY3RfR2V0QXR0cihjYWxsYWJsZSwgX19uYW1lX19fc3RyKTsKIAotCQlpZiAodGVtcCA9PSBOVUxMKSB7Ci0JCQlpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19BdHRyaWJ1dGVFcnJvcikpCi0JCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gLTE7Ci0JCQl1c2VfbmV3b2JqID0gMDsKLQkJfQotCQllbHNlIHsKLQkJCXVzZV9uZXdvYmogPSBQeVN0cmluZ19DaGVjayh0ZW1wKSAmJgotCQkJCSAgICAgc3RyY21wKFB5U3RyaW5nX0FTX1NUUklORyh0ZW1wKSwKLQkJCQkgICAgIAkgICAgIl9fbmV3b2JqX18iKSA9PSAwOwotCQkJUHlfREVDUkVGKHRlbXApOwotCQl9Ci0JfQotCWlmICh1c2VfbmV3b2JqKSB7Ci0JCVB5T2JqZWN0ICpjbHM7Ci0JCVB5T2JqZWN0ICpuZXdhcmd0dXA7Ci0JCWludCBuLCBpOworICAgICAgICBpZiAodGVtcCA9PSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19BdHRyaWJ1dGVFcnJvcikpCisgICAgICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB1c2VfbmV3b2JqID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHVzZV9uZXdvYmogPSBQeVN0cmluZ19DaGVjayh0ZW1wKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmNtcChQeVN0cmluZ19BU19TVFJJTkcodGVtcCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfX25ld29ial9fIikgPT0gMDsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih0ZW1wKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAodXNlX25ld29iaikgeworICAgICAgICBQeU9iamVjdCAqY2xzOworICAgICAgICBQeU9iamVjdCAqbmV3YXJndHVwOworICAgICAgICBpbnQgbiwgaTsKIAotCQkvKiBTYW5pdHkgY2hlY2tzLiAqLwotCQluID0gUHlUdXBsZV9TaXplKGFyZ3R1cCk7Ci0JCWlmIChuIDwgMSkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFBpY2tsaW5nRXJyb3IsICJfX25ld29ial9fIGFyZ2xpc3QgIgotCQkJCSJpcyBlbXB0eSIpOwotCQkJcmV0dXJuIC0xOwotCQl9CisgICAgICAgIC8qIFNhbml0eSBjaGVja3MuICovCisgICAgICAgIG4gPSBQeVR1cGxlX1NpemUoYXJndHVwKTsKKyAgICAgICAgaWYgKG4gPCAxKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUGlja2xpbmdFcnJvciwgIl9fbmV3b2JqX18gYXJnbGlzdCAiCisgICAgICAgICAgICAgICAgImlzIGVtcHR5Iik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KIAotCQljbHMgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3R1cCwgMCk7Ci0JCWlmICghIFB5T2JqZWN0X0hhc0F0dHJTdHJpbmcoY2xzLCAiX19uZXdfXyIpKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUGlja2xpbmdFcnJvciwgImFyZ3NbMF0gZnJvbSAiCi0JCQkJIl9fbmV3b2JqX18gYXJncyBoYXMgbm8gX19uZXdfXyIpOwotCQkJcmV0dXJuIC0xOwotCQl9CisgICAgICAgIGNscyA9IFB5VHVwbGVfR0VUX0lURU0oYXJndHVwLCAwKTsKKyAgICAgICAgaWYgKCEgUHlPYmplY3RfSGFzQXR0clN0cmluZyhjbHMsICJfX25ld19fIikpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQaWNrbGluZ0Vycm9yLCAiYXJnc1swXSBmcm9tICIKKyAgICAgICAgICAgICAgICAiX19uZXdvYmpfXyBhcmdzIGhhcyBubyBfX25ld19fIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KIAotCQkvKiBYWFggSG93IGNvdWxkIG9iIGJlIE5VTEw/ICovCi0JCWlmIChvYiAhPSBOVUxMKSB7Ci0JCQlQeU9iamVjdCAqb2JfZG90X2NsYXNzOworICAgICAgICAvKiBYWFggSG93IGNvdWxkIG9iIGJlIE5VTEw/ICovCisgICAgICAgIGlmIChvYiAhPSBOVUxMKSB7CisgICAgICAgICAgICBQeU9iamVjdCAqb2JfZG90X2NsYXNzOwogCi0JCQlvYl9kb3RfY2xhc3MgPSBQeU9iamVjdF9HZXRBdHRyKG9iLCBfX2NsYXNzX19fc3RyKTsKLQkJCWlmIChvYl9kb3RfY2xhc3MgPT0gTlVMTCkgewotCQkJCWlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKAotCQkJCQkgICAgUHlFeGNfQXR0cmlidXRlRXJyb3IpKQotCQkJCQlQeUVycl9DbGVhcigpOwotCQkJCWVsc2UKLQkJCQkJcmV0dXJuIC0xOwotCQkJfQotCQkJaSA9IG9iX2RvdF9jbGFzcyAhPSBjbHM7IC8qIHRydWUgaWZmIGEgcHJvYmxlbSAqLwotCQkJUHlfWERFQ1JFRihvYl9kb3RfY2xhc3MpOwotCQkJaWYgKGkpIHsKLQkJCQlQeUVycl9TZXRTdHJpbmcoUGlja2xpbmdFcnJvciwgImFyZ3NbMF0gZnJvbSAiCi0JCQkJCSJfX25ld29ial9fIGFyZ3MgaGFzIHRoZSB3cm9uZyBjbGFzcyIpOwotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfQorICAgICAgICAgICAgb2JfZG90X2NsYXNzID0gUHlPYmplY3RfR2V0QXR0cihvYiwgX19jbGFzc19fX3N0cik7CisgICAgICAgICAgICBpZiAob2JfZG90X2NsYXNzID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUV4Y19BdHRyaWJ1dGVFcnJvcikpCisgICAgICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpID0gb2JfZG90X2NsYXNzICE9IGNsczsgLyogdHJ1ZSBpZmYgYSBwcm9ibGVtICovCisgICAgICAgICAgICBQeV9YREVDUkVGKG9iX2RvdF9jbGFzcyk7CisgICAgICAgICAgICBpZiAoaSkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQaWNrbGluZ0Vycm9yLCAiYXJnc1swXSBmcm9tICIKKyAgICAgICAgICAgICAgICAgICAgIl9fbmV3b2JqX18gYXJncyBoYXMgdGhlIHdyb25nIGNsYXNzIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJLyogU2F2ZSB0aGUgY2xhc3MgYW5kIGl0cyBfX25ld19fIGFyZ3VtZW50cy4gKi8KLQkJaWYgKHNhdmUoc2VsZiwgY2xzLCAwKSA8IDApCi0JCQlyZXR1cm4gLTE7CisgICAgICAgIC8qIFNhdmUgdGhlIGNsYXNzIGFuZCBpdHMgX19uZXdfXyBhcmd1bWVudHMuICovCisgICAgICAgIGlmIChzYXZlKHNlbGYsIGNscywgMCkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOwogCi0JCW5ld2FyZ3R1cCA9IFB5VHVwbGVfTmV3KG4tMSk7ICAvKiBhcmd0dXBbMTpdICovCi0JCWlmIChuZXdhcmd0dXAgPT0gTlVMTCkKLQkJCXJldHVybiAtMTsKLQkJZm9yIChpID0gMTsgaSA8IG47ICsraSkgewotCQkJUHlPYmplY3QgKnRlbXAgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3R1cCwgaSk7Ci0JCQlQeV9JTkNSRUYodGVtcCk7Ci0JCQlQeVR1cGxlX1NFVF9JVEVNKG5ld2FyZ3R1cCwgaS0xLCB0ZW1wKTsKLQkJfQotCQlpID0gc2F2ZShzZWxmLCBuZXdhcmd0dXAsIDApOwotCQlQeV9ERUNSRUYobmV3YXJndHVwKTsKLQkJaWYgKGkgPCAwKQotCQkJcmV0dXJuIC0xOworICAgICAgICBuZXdhcmd0dXAgPSBQeVR1cGxlX05ldyhuLTEpOyAgLyogYXJndHVwWzE6XSAqLworICAgICAgICBpZiAobmV3YXJndHVwID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGZvciAoaSA9IDE7IGkgPCBuOyArK2kpIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICp0ZW1wID0gUHlUdXBsZV9HRVRfSVRFTShhcmd0dXAsIGkpOworICAgICAgICAgICAgUHlfSU5DUkVGKHRlbXApOworICAgICAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShuZXdhcmd0dXAsIGktMSwgdGVtcCk7CisgICAgICAgIH0KKyAgICAgICAgaSA9IHNhdmUoc2VsZiwgbmV3YXJndHVwLCAwKTsKKyAgICAgICAgUHlfREVDUkVGKG5ld2FyZ3R1cCk7CisgICAgICAgIGlmIChpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKIAotCQkvKiBBZGQgTkVXT0JKIG9wY29kZS4gKi8KLQkJaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgJm5ld29iaiwgMSkgPCAwKQotCQkJcmV0dXJuIC0xOwotCX0KLQllbHNlIHsKLQkJLyogTm90IHVzaW5nIE5FV09CSi4gKi8KLQkJaWYgKHNhdmUoc2VsZiwgY2FsbGFibGUsIDApIDwgMCB8fAotCQkgICAgc2F2ZShzZWxmLCBhcmd0dXAsIDApIDwgMCB8fAotCQkgICAgc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCAmcmVkdWNlLCAxKSA8IDApCi0JCQlyZXR1cm4gLTE7Ci0JfQorICAgICAgICAvKiBBZGQgTkVXT0JKIG9wY29kZS4gKi8KKyAgICAgICAgaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgJm5ld29iaiwgMSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLyogTm90IHVzaW5nIE5FV09CSi4gKi8KKyAgICAgICAgaWYgKHNhdmUoc2VsZiwgY2FsbGFibGUsIDApIDwgMCB8fAorICAgICAgICAgICAgc2F2ZShzZWxmLCBhcmd0dXAsIDApIDwgMCB8fAorICAgICAgICAgICAgc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCAmcmVkdWNlLCAxKSA8IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JLyogTWVtb2l6ZS4gKi8KLQkvKiBYWFggSG93IGNhbiBvYiBiZSBOVUxMPyAqLwotCWlmIChvYiAhPSBOVUxMKSB7Ci0JCWlmIChzdGF0ZSAmJiAhUHlEaWN0X0NoZWNrKHN0YXRlKSkgewotCQkJaWYgKHB1dDIoc2VsZiwgb2IpIDwgMCkKLQkJCQlyZXR1cm4gLTE7Ci0JCX0KLQkJZWxzZSBpZiAocHV0KHNlbGYsIG9iKSA8IDApCi0JCQkJcmV0dXJuIC0xOwotCX0KKyAgICAvKiBNZW1vaXplLiAqLworICAgIC8qIFhYWCBIb3cgY2FuIG9iIGJlIE5VTEw/ICovCisgICAgaWYgKG9iICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKHN0YXRlICYmICFQeURpY3RfQ2hlY2soc3RhdGUpKSB7CisgICAgICAgICAgICBpZiAocHV0MihzZWxmLCBvYikgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChwdXQoc2VsZiwgb2IpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKIAotICAgICAgICBpZiAobGlzdGl0ZW1zICYmIGJhdGNoX2xpc3Qoc2VsZiwgbGlzdGl0ZW1zKSA8IDApCi0gICAgICAgIAlyZXR1cm4gLTE7CisgICAgaWYgKGxpc3RpdGVtcyAmJiBiYXRjaF9saXN0KHNlbGYsIGxpc3RpdGVtcykgPCAwKQorICAgICAgICByZXR1cm4gLTE7CiAKLSAgICAgICAgaWYgKGRpY3RpdGVtcyAmJiBiYXRjaF9kaWN0KHNlbGYsIGRpY3RpdGVtcykgPCAwKQotICAgICAgICAJcmV0dXJuIC0xOworICAgIGlmIChkaWN0aXRlbXMgJiYgYmF0Y2hfZGljdChzZWxmLCBkaWN0aXRlbXMpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0JaWYgKHN0YXRlKSB7Ci0JCWlmIChzYXZlKHNlbGYsIHN0YXRlLCAwKSA8IDAgfHwKLQkJICAgIHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgJmJ1aWxkLCAxKSA8IDApCi0JCQlyZXR1cm4gLTE7Ci0JfQorICAgIGlmIChzdGF0ZSkgeworICAgICAgICBpZiAoc2F2ZShzZWxmLCBzdGF0ZSwgMCkgPCAwIHx8CisgICAgICAgICAgICBzZWxmLT53cml0ZV9mdW5jKHNlbGYsICZidWlsZCwgMSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCXJldHVybiAwOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBzYXZlKFBpY2tsZXJvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBpbnQgcGVyc19zYXZlKQogewotCVB5VHlwZU9iamVjdCAqdHlwZTsKLQlQeU9iamVjdCAqcHlfb2JfaWQgPSAwLCAqX19yZWR1Y2VfXyA9IDAsICp0ID0gMDsKLQlpbnQgcmVzID0gLTE7Ci0JaW50IHRtcDsKKyAgICBQeVR5cGVPYmplY3QgKnR5cGU7CisgICAgUHlPYmplY3QgKnB5X29iX2lkID0gMCwgKl9fcmVkdWNlX18gPSAwLCAqdCA9IDA7CisgICAgaW50IHJlcyA9IC0xOworICAgIGludCB0bXA7CiAKLQlpZiAoUHlfRW50ZXJSZWN1cnNpdmVDYWxsKCIgd2hpbGUgcGlja2xpbmcgYW4gb2JqZWN0IikpCi0JCXJldHVybiAtMTsKKyAgICBpZiAoUHlfRW50ZXJSZWN1cnNpdmVDYWxsKCIgd2hpbGUgcGlja2xpbmcgYW4gb2JqZWN0IikpCisgICAgICAgIHJldHVybiAtMTsKIAotCWlmICghcGVyc19zYXZlICYmIHNlbGYtPnBlcnNfZnVuYykgewotCQlpZiAoKHRtcCA9IHNhdmVfcGVycyhzZWxmLCBhcmdzLCBzZWxmLT5wZXJzX2Z1bmMpKSAhPSAwKSB7Ci0JCQlyZXMgPSB0bXA7Ci0JCQlnb3RvIGZpbmFsbHk7Ci0JCX0KLQl9CisgICAgaWYgKCFwZXJzX3NhdmUgJiYgc2VsZi0+cGVyc19mdW5jKSB7CisgICAgICAgIGlmICgodG1wID0gc2F2ZV9wZXJzKHNlbGYsIGFyZ3MsIHNlbGYtPnBlcnNfZnVuYykpICE9IDApIHsKKyAgICAgICAgICAgIHJlcyA9IHRtcDsKKyAgICAgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICAgICAgfQorICAgIH0KIAotCWlmIChhcmdzID09IFB5X05vbmUpIHsKLQkJcmVzID0gc2F2ZV9ub25lKHNlbGYsIGFyZ3MpOwotCQlnb3RvIGZpbmFsbHk7Ci0JfQorICAgIGlmIChhcmdzID09IFB5X05vbmUpIHsKKyAgICAgICAgcmVzID0gc2F2ZV9ub25lKHNlbGYsIGFyZ3MpOworICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgfQogCi0JdHlwZSA9IFB5X1RZUEUoYXJncyk7CisgICAgdHlwZSA9IFB5X1RZUEUoYXJncyk7CiAKLQlzd2l0Y2ggKHR5cGUtPnRwX25hbWVbMF0pIHsKLQljYXNlICdiJzoKLQkJaWYgKGFyZ3MgPT0gUHlfRmFsc2UgfHwgYXJncyA9PSBQeV9UcnVlKSB7Ci0JCQlyZXMgPSBzYXZlX2Jvb2woc2VsZiwgYXJncyk7Ci0JCQlnb3RvIGZpbmFsbHk7Ci0JCX0KLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgJ2knOgotCQlpZiAodHlwZSA9PSAmUHlJbnRfVHlwZSkgewotCQkJcmVzID0gc2F2ZV9pbnQoc2VsZiwgYXJncyk7Ci0JCQlnb3RvIGZpbmFsbHk7Ci0JCX0KLQkJYnJlYWs7CisgICAgc3dpdGNoICh0eXBlLT50cF9uYW1lWzBdKSB7CisgICAgY2FzZSAnYic6CisgICAgICAgIGlmIChhcmdzID09IFB5X0ZhbHNlIHx8IGFyZ3MgPT0gUHlfVHJ1ZSkgeworICAgICAgICAgICAgcmVzID0gc2F2ZV9ib29sKHNlbGYsIGFyZ3MpOworICAgICAgICAgICAgZ290byBmaW5hbGx5OworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJ2knOgorICAgICAgICBpZiAodHlwZSA9PSAmUHlJbnRfVHlwZSkgeworICAgICAgICAgICAgcmVzID0gc2F2ZV9pbnQoc2VsZiwgYXJncyk7CisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgY2FzZSAnbCc6Ci0JCWlmICh0eXBlID09ICZQeUxvbmdfVHlwZSkgewotCQkJcmVzID0gc2F2ZV9sb25nKHNlbGYsIGFyZ3MpOwotCQkJZ290byBmaW5hbGx5OwotCQl9Ci0JCWJyZWFrOworICAgIGNhc2UgJ2wnOgorICAgICAgICBpZiAodHlwZSA9PSAmUHlMb25nX1R5cGUpIHsKKyAgICAgICAgICAgIHJlcyA9IHNhdmVfbG9uZyhzZWxmLCBhcmdzKTsKKyAgICAgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKIAotICAgICAgICBjYXNlICdmJzoKLQkJaWYgKHR5cGUgPT0gJlB5RmxvYXRfVHlwZSkgewotCQkJcmVzID0gc2F2ZV9mbG9hdChzZWxmLCBhcmdzKTsKLQkJCWdvdG8gZmluYWxseTsKLQkJfQotCQlicmVhazsKKyAgICBjYXNlICdmJzoKKyAgICAgICAgaWYgKHR5cGUgPT0gJlB5RmxvYXRfVHlwZSkgeworICAgICAgICAgICAgcmVzID0gc2F2ZV9mbG9hdChzZWxmLCBhcmdzKTsKKyAgICAgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKIAotICAgICAgICBjYXNlICd0JzoKLQkJaWYgKHR5cGUgPT0gJlB5VHVwbGVfVHlwZSAmJiBQeVR1cGxlX1NpemUoYXJncykgPT0gMCkgewotCQkJcmVzID0gc2F2ZV90dXBsZShzZWxmLCBhcmdzKTsKLQkJCWdvdG8gZmluYWxseTsKLQkJfQotCQlicmVhazsKKyAgICBjYXNlICd0JzoKKyAgICAgICAgaWYgKHR5cGUgPT0gJlB5VHVwbGVfVHlwZSAmJiBQeVR1cGxlX1NpemUoYXJncykgPT0gMCkgeworICAgICAgICAgICAgcmVzID0gc2F2ZV90dXBsZShzZWxmLCBhcmdzKTsKKyAgICAgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKIAotICAgICAgICBjYXNlICdzJzoKLQkJaWYgKCh0eXBlID09ICZQeVN0cmluZ19UeXBlKSAmJiAoUHlTdHJpbmdfR0VUX1NJWkUoYXJncykgPCAyKSkgewotCQkJcmVzID0gc2F2ZV9zdHJpbmcoc2VsZiwgYXJncywgMCk7Ci0JCQlnb3RvIGZpbmFsbHk7Ci0JCX0KLQkJYnJlYWs7CisgICAgY2FzZSAncyc6CisgICAgICAgIGlmICgodHlwZSA9PSAmUHlTdHJpbmdfVHlwZSkgJiYgKFB5U3RyaW5nX0dFVF9TSVpFKGFyZ3MpIDwgMikpIHsKKyAgICAgICAgICAgIHJlcyA9IHNhdmVfc3RyaW5nKHNlbGYsIGFyZ3MsIDApOworICAgICAgICAgICAgZ290byBmaW5hbGx5OworICAgICAgICB9CisgICAgICAgIGJyZWFrOwogCiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotICAgICAgICBjYXNlICd1JzoKLQkJaWYgKCh0eXBlID09ICZQeVVuaWNvZGVfVHlwZSkgJiYgKFB5U3RyaW5nX0dFVF9TSVpFKGFyZ3MpIDwgMikpIHsKLQkJCXJlcyA9IHNhdmVfdW5pY29kZShzZWxmLCBhcmdzLCAwKTsKLQkJCWdvdG8gZmluYWxseTsKLQkJfQotCQlicmVhazsKKyAgICBjYXNlICd1JzoKKyAgICAgICAgaWYgKCh0eXBlID09ICZQeVVuaWNvZGVfVHlwZSkgJiYgKFB5U3RyaW5nX0dFVF9TSVpFKGFyZ3MpIDwgMikpIHsKKyAgICAgICAgICAgIHJlcyA9IHNhdmVfdW5pY29kZShzZWxmLCBhcmdzLCAwKTsKKyAgICAgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKICNlbmRpZgotCX0KKyAgICB9CiAKLQlpZiAoUHlfUkVGQ05UKGFyZ3MpID4gMSkgewotCQlpZiAoISggcHlfb2JfaWQgPSBQeUxvbmdfRnJvbVZvaWRQdHIoYXJncykpKQotCQkJZ290byBmaW5hbGx5OworICAgIGlmIChQeV9SRUZDTlQoYXJncykgPiAxKSB7CisgICAgICAgIGlmICghKCBweV9vYl9pZCA9IFB5TG9uZ19Gcm9tVm9pZFB0cihhcmdzKSkpCisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQkJaWYgKFB5RGljdF9HZXRJdGVtKHNlbGYtPm1lbW8sIHB5X29iX2lkKSkgewotCQkJaWYgKGdldChzZWxmLCBweV9vYl9pZCkgPCAwKQotCQkJCWdvdG8gZmluYWxseTsKKyAgICAgICAgaWYgKFB5RGljdF9HZXRJdGVtKHNlbGYtPm1lbW8sIHB5X29iX2lkKSkgeworICAgICAgICAgICAgaWYgKGdldChzZWxmLCBweV9vYl9pZCkgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gZmluYWxseTsKIAotCQkJcmVzID0gMDsKLQkJCWdvdG8gZmluYWxseTsKLQkJfQotCX0KKyAgICAgICAgICAgIHJlcyA9IDA7CisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgICAgIH0KKyAgICB9CiAKLQlzd2l0Y2ggKHR5cGUtPnRwX25hbWVbMF0pIHsKLSAgICAgICAgY2FzZSAncyc6Ci0JCWlmICh0eXBlID09ICZQeVN0cmluZ19UeXBlKSB7Ci0JCQlyZXMgPSBzYXZlX3N0cmluZyhzZWxmLCBhcmdzLCAxKTsKLQkJCWdvdG8gZmluYWxseTsKLQkJfQotCQlicmVhazsKKyAgICBzd2l0Y2ggKHR5cGUtPnRwX25hbWVbMF0pIHsKKyAgICBjYXNlICdzJzoKKyAgICAgICAgaWYgKHR5cGUgPT0gJlB5U3RyaW5nX1R5cGUpIHsKKyAgICAgICAgICAgIHJlcyA9IHNhdmVfc3RyaW5nKHNlbGYsIGFyZ3MsIDEpOworICAgICAgICAgICAgZ290byBmaW5hbGx5OworICAgICAgICB9CisgICAgICAgIGJyZWFrOwogCiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotICAgICAgICBjYXNlICd1JzoKLQkJaWYgKHR5cGUgPT0gJlB5VW5pY29kZV9UeXBlKSB7Ci0JCQlyZXMgPSBzYXZlX3VuaWNvZGUoc2VsZiwgYXJncywgMSk7Ci0JCQlnb3RvIGZpbmFsbHk7Ci0JCX0KLQkJYnJlYWs7CisgICAgY2FzZSAndSc6CisgICAgICAgIGlmICh0eXBlID09ICZQeVVuaWNvZGVfVHlwZSkgeworICAgICAgICAgICAgcmVzID0gc2F2ZV91bmljb2RlKHNlbGYsIGFyZ3MsIDEpOworICAgICAgICAgICAgZ290byBmaW5hbGx5OworICAgICAgICB9CisgICAgICAgIGJyZWFrOwogI2VuZGlmCiAKLSAgICAgICAgY2FzZSAndCc6Ci0JCWlmICh0eXBlID09ICZQeVR1cGxlX1R5cGUpIHsKLQkJCXJlcyA9IHNhdmVfdHVwbGUoc2VsZiwgYXJncyk7Ci0JCQlnb3RvIGZpbmFsbHk7Ci0JCX0KLQkJaWYgKHR5cGUgPT0gJlB5VHlwZV9UeXBlKSB7Ci0JCQlyZXMgPSBzYXZlX2dsb2JhbChzZWxmLCBhcmdzLCBOVUxMKTsKLQkJCWdvdG8gZmluYWxseTsKLQkJfQotCQlicmVhazsKKyAgICBjYXNlICd0JzoKKyAgICAgICAgaWYgKHR5cGUgPT0gJlB5VHVwbGVfVHlwZSkgeworICAgICAgICAgICAgcmVzID0gc2F2ZV90dXBsZShzZWxmLCBhcmdzKTsKKyAgICAgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICAgICAgfQorICAgICAgICBpZiAodHlwZSA9PSAmUHlUeXBlX1R5cGUpIHsKKyAgICAgICAgICAgIHJlcyA9IHNhdmVfZ2xvYmFsKHNlbGYsIGFyZ3MsIE5VTEwpOworICAgICAgICAgICAgZ290byBmaW5hbGx5OworICAgICAgICB9CisgICAgICAgIGJyZWFrOwogCi0gICAgICAgIGNhc2UgJ2wnOgotCQlpZiAodHlwZSA9PSAmUHlMaXN0X1R5cGUpIHsKLQkJCXJlcyA9IHNhdmVfbGlzdChzZWxmLCBhcmdzKTsKLQkJCWdvdG8gZmluYWxseTsKLQkJfQotCQlicmVhazsKKyAgICBjYXNlICdsJzoKKyAgICAgICAgaWYgKHR5cGUgPT0gJlB5TGlzdF9UeXBlKSB7CisgICAgICAgICAgICByZXMgPSBzYXZlX2xpc3Qoc2VsZiwgYXJncyk7CisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgY2FzZSAnZCc6Ci0JCWlmICh0eXBlID09ICZQeURpY3RfVHlwZSkgewotCQkJcmVzID0gc2F2ZV9kaWN0KHNlbGYsIGFyZ3MpOwotCQkJZ290byBmaW5hbGx5OwotCQl9Ci0JCWJyZWFrOworICAgIGNhc2UgJ2QnOgorICAgICAgICBpZiAodHlwZSA9PSAmUHlEaWN0X1R5cGUpIHsKKyAgICAgICAgICAgIHJlcyA9IHNhdmVfZGljdChzZWxmLCBhcmdzKTsKKyAgICAgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKIAotICAgICAgICBjYXNlICdpJzoKLQkJaWYgKHR5cGUgPT0gJlB5SW5zdGFuY2VfVHlwZSkgewotCQkJcmVzID0gc2F2ZV9pbnN0KHNlbGYsIGFyZ3MpOwotCQkJZ290byBmaW5hbGx5OwotCQl9Ci0JCWJyZWFrOworICAgIGNhc2UgJ2knOgorICAgICAgICBpZiAodHlwZSA9PSAmUHlJbnN0YW5jZV9UeXBlKSB7CisgICAgICAgICAgICByZXMgPSBzYXZlX2luc3Qoc2VsZiwgYXJncyk7CisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgY2FzZSAnYyc6Ci0JCWlmICh0eXBlID09ICZQeUNsYXNzX1R5cGUpIHsKLQkJCXJlcyA9IHNhdmVfZ2xvYmFsKHNlbGYsIGFyZ3MsIE5VTEwpOwotCQkJZ290byBmaW5hbGx5OwotCQl9Ci0JCWJyZWFrOworICAgIGNhc2UgJ2MnOgorICAgICAgICBpZiAodHlwZSA9PSAmUHlDbGFzc19UeXBlKSB7CisgICAgICAgICAgICByZXMgPSBzYXZlX2dsb2JhbChzZWxmLCBhcmdzLCBOVUxMKTsKKyAgICAgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKIAotICAgICAgICBjYXNlICdmJzoKLQkJaWYgKHR5cGUgPT0gJlB5RnVuY3Rpb25fVHlwZSkgewotCQkJcmVzID0gc2F2ZV9nbG9iYWwoc2VsZiwgYXJncywgTlVMTCk7Ci0JCQlpZiAocmVzICYmIFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUGlja2xlRXJyb3IpKSB7Ci0JCQkJLyogZmFsbCBiYWNrIHRvIHJlZHVjZSAqLwotCQkJCVB5RXJyX0NsZWFyKCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlnb3RvIGZpbmFsbHk7Ci0JCX0KLQkJYnJlYWs7CisgICAgY2FzZSAnZic6CisgICAgICAgIGlmICh0eXBlID09ICZQeUZ1bmN0aW9uX1R5cGUpIHsKKyAgICAgICAgICAgIHJlcyA9IHNhdmVfZ2xvYmFsKHNlbGYsIGFyZ3MsIE5VTEwpOworICAgICAgICAgICAgaWYgKHJlcyAmJiBQeUVycl9FeGNlcHRpb25NYXRjaGVzKFBpY2tsZUVycm9yKSkgeworICAgICAgICAgICAgICAgIC8qIGZhbGwgYmFjayB0byByZWR1Y2UgKi8KKyAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZ290byBmaW5hbGx5OworICAgICAgICB9CisgICAgICAgIGJyZWFrOwogCi0gICAgICAgIGNhc2UgJ2InOgotCQlpZiAodHlwZSA9PSAmUHlDRnVuY3Rpb25fVHlwZSkgewotCQkJcmVzID0gc2F2ZV9nbG9iYWwoc2VsZiwgYXJncywgTlVMTCk7Ci0JCQlnb3RvIGZpbmFsbHk7Ci0JCX0KLQl9CisgICAgY2FzZSAnYic6CisgICAgICAgIGlmICh0eXBlID09ICZQeUNGdW5jdGlvbl9UeXBlKSB7CisgICAgICAgICAgICByZXMgPSBzYXZlX2dsb2JhbChzZWxmLCBhcmdzLCBOVUxMKTsKKyAgICAgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICAgICAgfQorICAgIH0KIAotCWlmICghcGVyc19zYXZlICYmIHNlbGYtPmluc3RfcGVyc19mdW5jKSB7Ci0JCWlmICgodG1wID0gc2F2ZV9wZXJzKHNlbGYsIGFyZ3MsIHNlbGYtPmluc3RfcGVyc19mdW5jKSkgIT0gMCkgewotCQkJcmVzID0gdG1wOwotCQkJZ290byBmaW5hbGx5OwotCQl9Ci0JfQorICAgIGlmICghcGVyc19zYXZlICYmIHNlbGYtPmluc3RfcGVyc19mdW5jKSB7CisgICAgICAgIGlmICgodG1wID0gc2F2ZV9wZXJzKHNlbGYsIGFyZ3MsIHNlbGYtPmluc3RfcGVyc19mdW5jKSkgIT0gMCkgeworICAgICAgICAgICAgcmVzID0gdG1wOworICAgICAgICAgICAgZ290byBmaW5hbGx5OworICAgICAgICB9CisgICAgfQogCi0JaWYgKFB5VHlwZV9Jc1N1YnR5cGUodHlwZSwgJlB5VHlwZV9UeXBlKSkgewotCQlyZXMgPSBzYXZlX2dsb2JhbChzZWxmLCBhcmdzLCBOVUxMKTsKLQkJZ290byBmaW5hbGx5OwotCX0KKyAgICBpZiAoUHlUeXBlX0lzU3VidHlwZSh0eXBlLCAmUHlUeXBlX1R5cGUpKSB7CisgICAgICAgIHJlcyA9IHNhdmVfZ2xvYmFsKHNlbGYsIGFyZ3MsIE5VTEwpOworICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgfQogCi0JLyogR2V0IGEgcmVkdWN0aW9uIGNhbGxhYmxlLCBhbmQgY2FsbCBpdC4gIFRoaXMgbWF5IGNvbWUgZnJvbQotCSAqIGNvcHlfcmVnLmRpc3BhdGNoX3RhYmxlLCB0aGUgb2JqZWN0J3MgX19yZWR1Y2VfZXhfXyBtZXRob2QsCi0JICogb3IgdGhlIG9iamVjdCdzIF9fcmVkdWNlX18gbWV0aG9kLgotCSAqLwotCV9fcmVkdWNlX18gPSBQeURpY3RfR2V0SXRlbShkaXNwYXRjaF90YWJsZSwgKFB5T2JqZWN0ICopdHlwZSk7Ci0JaWYgKF9fcmVkdWNlX18gIT0gTlVMTCkgewotCQlQeV9JTkNSRUYoX19yZWR1Y2VfXyk7Ci0JCVB5X0lOQ1JFRihhcmdzKTsKLQkJQVJHX1RVUChzZWxmLCBhcmdzKTsKLQkJaWYgKHNlbGYtPmFyZykgewotCQkJdCA9IFB5T2JqZWN0X0NhbGwoX19yZWR1Y2VfXywgc2VsZi0+YXJnLCBOVUxMKTsKLQkJCUZSRUVfQVJHX1RVUChzZWxmKTsKLQkJfQotCX0KLQllbHNlIHsKLQkJLyogQ2hlY2sgZm9yIGEgX19yZWR1Y2VfZXhfXyBtZXRob2QuICovCi0JCV9fcmVkdWNlX18gPSBQeU9iamVjdF9HZXRBdHRyKGFyZ3MsIF9fcmVkdWNlX2V4X19fc3RyKTsKLQkJaWYgKF9fcmVkdWNlX18gIT0gTlVMTCkgewotCQkJdCA9IFB5SW50X0Zyb21Mb25nKHNlbGYtPnByb3RvKTsKLQkJCWlmICh0ICE9IE5VTEwpIHsKLQkJCQlBUkdfVFVQKHNlbGYsIHQpOwotCQkJCXQgPSBOVUxMOwotCQkJCWlmIChzZWxmLT5hcmcpIHsKLQkJCQkJdCA9IFB5T2JqZWN0X0NhbGwoX19yZWR1Y2VfXywKLQkJCQkJCQkgIHNlbGYtPmFyZywgTlVMTCk7Ci0JCQkJCUZSRUVfQVJHX1RVUChzZWxmKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19BdHRyaWJ1dGVFcnJvcikpCi0JCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCWVsc2UKLQkJCQlnb3RvIGZpbmFsbHk7Ci0JCQkvKiBDaGVjayBmb3IgYSBfX3JlZHVjZV9fIG1ldGhvZC4gKi8KLQkJCV9fcmVkdWNlX18gPSBQeU9iamVjdF9HZXRBdHRyKGFyZ3MsIF9fcmVkdWNlX19fc3RyKTsKLQkJCWlmIChfX3JlZHVjZV9fICE9IE5VTEwpIHsKLQkJCQl0ID0gUHlPYmplY3RfQ2FsbChfX3JlZHVjZV9fLAotCQkJCQkJICBlbXB0eV90dXBsZSwgTlVMTCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlQeUVycl9TZXRPYmplY3QoVW5waWNrbGVhYmxlRXJyb3IsIGFyZ3MpOwotCQkJCWdvdG8gZmluYWxseTsKLQkJCX0KLQkJfQotCX0KKyAgICAvKiBHZXQgYSByZWR1Y3Rpb24gY2FsbGFibGUsIGFuZCBjYWxsIGl0LiAgVGhpcyBtYXkgY29tZSBmcm9tCisgICAgICogY29weV9yZWcuZGlzcGF0Y2hfdGFibGUsIHRoZSBvYmplY3QncyBfX3JlZHVjZV9leF9fIG1ldGhvZCwKKyAgICAgKiBvciB0aGUgb2JqZWN0J3MgX19yZWR1Y2VfXyBtZXRob2QuCisgICAgICovCisgICAgX19yZWR1Y2VfXyA9IFB5RGljdF9HZXRJdGVtKGRpc3BhdGNoX3RhYmxlLCAoUHlPYmplY3QgKil0eXBlKTsKKyAgICBpZiAoX19yZWR1Y2VfXyAhPSBOVUxMKSB7CisgICAgICAgIFB5X0lOQ1JFRihfX3JlZHVjZV9fKTsKKyAgICAgICAgUHlfSU5DUkVGKGFyZ3MpOworICAgICAgICBBUkdfVFVQKHNlbGYsIGFyZ3MpOworICAgICAgICBpZiAoc2VsZi0+YXJnKSB7CisgICAgICAgICAgICB0ID0gUHlPYmplY3RfQ2FsbChfX3JlZHVjZV9fLCBzZWxmLT5hcmcsIE5VTEwpOworICAgICAgICAgICAgRlJFRV9BUkdfVFVQKHNlbGYpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvKiBDaGVjayBmb3IgYSBfX3JlZHVjZV9leF9fIG1ldGhvZC4gKi8KKyAgICAgICAgX19yZWR1Y2VfXyA9IFB5T2JqZWN0X0dldEF0dHIoYXJncywgX19yZWR1Y2VfZXhfX19zdHIpOworICAgICAgICBpZiAoX19yZWR1Y2VfXyAhPSBOVUxMKSB7CisgICAgICAgICAgICB0ID0gUHlJbnRfRnJvbUxvbmcoc2VsZi0+cHJvdG8pOworICAgICAgICAgICAgaWYgKHQgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIEFSR19UVVAoc2VsZiwgdCk7CisgICAgICAgICAgICAgICAgdCA9IE5VTEw7CisgICAgICAgICAgICAgICAgaWYgKHNlbGYtPmFyZykgeworICAgICAgICAgICAgICAgICAgICB0ID0gUHlPYmplY3RfQ2FsbChfX3JlZHVjZV9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5hcmcsIE5VTEwpOworICAgICAgICAgICAgICAgICAgICBGUkVFX0FSR19UVVAoc2VsZik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfQXR0cmlidXRlRXJyb3IpKQorICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZ290byBmaW5hbGx5OworICAgICAgICAgICAgLyogQ2hlY2sgZm9yIGEgX19yZWR1Y2VfXyBtZXRob2QuICovCisgICAgICAgICAgICBfX3JlZHVjZV9fID0gUHlPYmplY3RfR2V0QXR0cihhcmdzLCBfX3JlZHVjZV9fX3N0cik7CisgICAgICAgICAgICBpZiAoX19yZWR1Y2VfXyAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgdCA9IFB5T2JqZWN0X0NhbGwoX19yZWR1Y2VfXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXB0eV90dXBsZSwgTlVMTCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRPYmplY3QoVW5waWNrbGVhYmxlRXJyb3IsIGFyZ3MpOworICAgICAgICAgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIAotCWlmICh0ID09IE5VTEwpCi0JCWdvdG8gZmluYWxseTsKKyAgICBpZiAodCA9PSBOVUxMKQorICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQlpZiAoUHlTdHJpbmdfQ2hlY2sodCkpIHsKLQkJcmVzID0gc2F2ZV9nbG9iYWwoc2VsZiwgYXJncywgdCk7Ci0JCWdvdG8gZmluYWxseTsKLQl9CisgICAgaWYgKFB5U3RyaW5nX0NoZWNrKHQpKSB7CisgICAgICAgIHJlcyA9IHNhdmVfZ2xvYmFsKHNlbGYsIGFyZ3MsIHQpOworICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgfQogCi0JaWYgKCFQeVR1cGxlX0NoZWNrKHQpKSB7Ci0JCWNQaWNrbGVfRXJyRm9ybWF0KFBpY2tsaW5nRXJyb3IsICJWYWx1ZSByZXR1cm5lZCBieSAiCi0JCQkJIiVzIG11c3QgYmUgc3RyaW5nIG9yIHR1cGxlIiwKLQkJCQkiTyIsIF9fcmVkdWNlX18pOwotCQlnb3RvIGZpbmFsbHk7Ci0JfQorICAgIGlmICghUHlUdXBsZV9DaGVjayh0KSkgeworICAgICAgICBjUGlja2xlX0VyckZvcm1hdChQaWNrbGluZ0Vycm9yLCAiVmFsdWUgcmV0dXJuZWQgYnkgIgorICAgICAgICAgICAgICAgICAgICAgICAgIiVzIG11c3QgYmUgc3RyaW5nIG9yIHR1cGxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJPIiwgX19yZWR1Y2VfXyk7CisgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICB9CiAKLQlyZXMgPSBzYXZlX3JlZHVjZShzZWxmLCB0LCBfX3JlZHVjZV9fLCBhcmdzKTsKKyAgICByZXMgPSBzYXZlX3JlZHVjZShzZWxmLCB0LCBfX3JlZHVjZV9fLCBhcmdzKTsKIAogICBmaW5hbGx5OgotCVB5X0xlYXZlUmVjdXJzaXZlQ2FsbCgpOwotCVB5X1hERUNSRUYocHlfb2JfaWQpOwotCVB5X1hERUNSRUYoX19yZWR1Y2VfXyk7Ci0JUHlfWERFQ1JFRih0KTsKKyAgICBQeV9MZWF2ZVJlY3Vyc2l2ZUNhbGwoKTsKKyAgICBQeV9YREVDUkVGKHB5X29iX2lkKTsKKyAgICBQeV9YREVDUkVGKF9fcmVkdWNlX18pOworICAgIFB5X1hERUNSRUYodCk7CiAKLQlyZXR1cm4gcmVzOworICAgIHJldHVybiByZXM7CiB9CiAKIAogc3RhdGljIGludAogZHVtcChQaWNrbGVyb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzdGF0aWMgY2hhciBzdG9wID0gU1RPUDsKKyAgICBzdGF0aWMgY2hhciBzdG9wID0gU1RPUDsKIAotCWlmIChzZWxmLT5wcm90byA+PSAyKSB7Ci0JCWNoYXIgYnl0ZXNbMl07CisgICAgaWYgKHNlbGYtPnByb3RvID49IDIpIHsKKyAgICAgICAgY2hhciBieXRlc1syXTsKIAotCQlieXRlc1swXSA9IFBST1RPOwotCQlhc3NlcnQoc2VsZi0+cHJvdG8gPj0gMCAmJiBzZWxmLT5wcm90byA8IDI1Nik7Ci0JCWJ5dGVzWzFdID0gKGNoYXIpc2VsZi0+cHJvdG87Ci0JCWlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsIGJ5dGVzLCAyKSA8IDApCi0JCQlyZXR1cm4gLTE7Ci0JfQorICAgICAgICBieXRlc1swXSA9IFBST1RPOworICAgICAgICBhc3NlcnQoc2VsZi0+cHJvdG8gPj0gMCAmJiBzZWxmLT5wcm90byA8IDI1Nik7CisgICAgICAgIGJ5dGVzWzFdID0gKGNoYXIpc2VsZi0+cHJvdG87CisgICAgICAgIGlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsIGJ5dGVzLCAyKSA8IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JaWYgKHNhdmUoc2VsZiwgYXJncywgMCkgPCAwKQotCQlyZXR1cm4gLTE7CisgICAgaWYgKHNhdmUoc2VsZiwgYXJncywgMCkgPCAwKQorICAgICAgICByZXR1cm4gLTE7CiAKLQlpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCAmc3RvcCwgMSkgPCAwKQotCQlyZXR1cm4gLTE7CisgICAgaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgJnN0b3AsIDEpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0JaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgTlVMTCwgMCkgPCAwKQotCQlyZXR1cm4gLTE7CisgICAgaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgTlVMTCwgMCkgPCAwKQorICAgICAgICByZXR1cm4gLTE7CiAKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFBpY2tsZV9jbGVhcl9tZW1vKFBpY2tsZXJvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWlmIChzZWxmLT5tZW1vKQotCQlQeURpY3RfQ2xlYXIoc2VsZi0+bWVtbyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGlmIChzZWxmLT5tZW1vKQorICAgICAgICBQeURpY3RfQ2xlYXIoc2VsZi0+bWVtbyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogUGlja2xlX2dldHZhbHVlKFBpY2tsZXJvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBsLCBpLCByc2l6ZSwgc3NpemUsIGNsZWFyPTEsIGxtOwotCWxvbmcgaWs7Ci0JUHlPYmplY3QgKmssICpyOwotCWNoYXIgKnMsICpwLCAqaGF2ZV9nZXQ7Ci0JUGRhdGEgKmRhdGE7CisgICAgaW50IGwsIGksIHJzaXplLCBzc2l6ZSwgY2xlYXI9MSwgbG07CisgICAgbG9uZyBpazsKKyAgICBQeU9iamVjdCAqaywgKnI7CisgICAgY2hhciAqcywgKnAsICpoYXZlX2dldDsKKyAgICBQZGF0YSAqZGF0YTsKIAotCS8qIENhbiBiZSBjYWxsZWQgYnkgUHl0aG9uIGNvZGUgb3IgQyBjb2RlICovCi0JaWYgKGFyZ3MgJiYgIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxpOmdldHZhbHVlIiwgJmNsZWFyKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgLyogQ2FuIGJlIGNhbGxlZCBieSBQeXRob24gY29kZSBvciBDIGNvZGUgKi8KKyAgICBpZiAoYXJncyAmJiAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifGk6Z2V0dmFsdWUiLCAmY2xlYXIpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCS8qIENoZWNrIHRvIG1ha2Ugc3VyZSB3ZSBhcmUgYmFzZWQgb24gYSBsaXN0ICovCi0JaWYgKCEgUGRhdGFfQ2hlY2soc2VsZi0+ZmlsZSkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFBpY2tsaW5nRXJyb3IsCi0JCQkJIkF0dGVtcHQgdG8gZ2V0dmFsdWUoKSBhIG5vbi1saXN0LWJhc2VkIHBpY2tsZXIiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIC8qIENoZWNrIHRvIG1ha2Ugc3VyZSB3ZSBhcmUgYmFzZWQgb24gYSBsaXN0ICovCisgICAgaWYgKCEgUGRhdGFfQ2hlY2soc2VsZi0+ZmlsZSkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFBpY2tsaW5nRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiQXR0ZW1wdCB0byBnZXR2YWx1ZSgpIGEgbm9uLWxpc3QtYmFzZWQgcGlja2xlciIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQkvKiBmbHVzaCB3cml0ZSBidWZmZXIgKi8KLQlpZiAod3JpdGVfb3RoZXIoc2VsZiwgTlVMTCwgMCkgPCAwKSByZXR1cm4gTlVMTDsKKyAgICAvKiBmbHVzaCB3cml0ZSBidWZmZXIgKi8KKyAgICBpZiAod3JpdGVfb3RoZXIoc2VsZiwgTlVMTCwgMCkgPCAwKSByZXR1cm4gTlVMTDsKIAotCWRhdGE9KFBkYXRhKilzZWxmLT5maWxlOwotCWw9ZGF0YS0+bGVuZ3RoOworICAgIGRhdGE9KFBkYXRhKilzZWxmLT5maWxlOworICAgIGw9ZGF0YS0+bGVuZ3RoOwogCi0JLyogc2V0IHVwIGFuIGFycmF5IHRvIGhvbGQgZ2V0L3B1dCBzdGF0dXMgKi8KLQlsbSA9IFB5RGljdF9TaXplKHNlbGYtPm1lbW8pOwotCWlmIChsbSA8IDApIHJldHVybiBOVUxMOwotCWxtKys7Ci0JaGF2ZV9nZXQgPSBtYWxsb2MobG0pOwotCWlmIChoYXZlX2dldCA9PSBOVUxMKSByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQltZW1zZXQoaGF2ZV9nZXQsIDAsIGxtKTsKKyAgICAvKiBzZXQgdXAgYW4gYXJyYXkgdG8gaG9sZCBnZXQvcHV0IHN0YXR1cyAqLworICAgIGxtID0gUHlEaWN0X1NpemUoc2VsZi0+bWVtbyk7CisgICAgaWYgKGxtIDwgMCkgcmV0dXJuIE5VTEw7CisgICAgbG0rKzsKKyAgICBoYXZlX2dldCA9IG1hbGxvYyhsbSk7CisgICAgaWYgKGhhdmVfZ2V0ID09IE5VTEwpIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIG1lbXNldChoYXZlX2dldCwgMCwgbG0pOwogCi0JLyogU2NhbiBmb3IgZ2V0cy4gKi8KLQlmb3IgKHJzaXplID0gMCwgaSA9IGw7IC0taSA+PSAwOyApIHsKLQkJayA9IGRhdGEtPmRhdGFbaV07CisgICAgLyogU2NhbiBmb3IgZ2V0cy4gKi8KKyAgICBmb3IgKHJzaXplID0gMCwgaSA9IGw7IC0taSA+PSAwOyApIHsKKyAgICAgICAgayA9IGRhdGEtPmRhdGFbaV07CiAKLQkJaWYgKFB5U3RyaW5nX0NoZWNrKGspKQotCQkJcnNpemUgKz0gUHlTdHJpbmdfR0VUX1NJWkUoayk7CisgICAgICAgIGlmIChQeVN0cmluZ19DaGVjayhrKSkKKyAgICAgICAgICAgIHJzaXplICs9IFB5U3RyaW5nX0dFVF9TSVpFKGspOwogCi0JCWVsc2UgaWYgKFB5SW50X0NoZWNrKGspKSB7IC8qIHB1dCAqLwotCQkJaWsgPSBQeUludF9BU19MT05HKChQeUludE9iamVjdCopayk7Ci0JCQlpZiAoaWsgPj0gbG0gfHwgaWsgPT0gMCkgewotCQkJCVB5RXJyX1NldFN0cmluZyhQaWNrbGluZ0Vycm9yLAotCQkJCQkJIkludmFsaWQgZ2V0IGRhdGEiKTsKLQkJCQlnb3RvIGVycjsKLQkJCX0KLQkJCWlmIChoYXZlX2dldFtpa10pIC8qIHdpdGggbWF0Y2hpbmcgZ2V0ICovCi0JCQkJcnNpemUgKz0gaWsgPCAyNTYgPyAyIDogNTsKLQkJfQorICAgICAgICBlbHNlIGlmIChQeUludF9DaGVjayhrKSkgeyAvKiBwdXQgKi8KKyAgICAgICAgICAgIGlrID0gUHlJbnRfQVNfTE9ORygoUHlJbnRPYmplY3QqKWspOworICAgICAgICAgICAgaWYgKGlrID49IGxtIHx8IGlrID09IDApIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUGlja2xpbmdFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgZ2V0IGRhdGEiKTsKKyAgICAgICAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChoYXZlX2dldFtpa10pIC8qIHdpdGggbWF0Y2hpbmcgZ2V0ICovCisgICAgICAgICAgICAgICAgcnNpemUgKz0gaWsgPCAyNTYgPyAyIDogNTsKKyAgICAgICAgfQogCi0JCWVsc2UgaWYgKCEgKFB5VHVwbGVfQ2hlY2soaykgJiYKLQkJCSAgICBQeVR1cGxlX0dFVF9TSVpFKGspID09IDIgJiYKLQkJCSAgICBQeUludF9DaGVjaygoayA9IFB5VHVwbGVfR0VUX0lURU0oaywgMCkpKSkKLQkJCSkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFBpY2tsaW5nRXJyb3IsCi0JCQkJCSJVbmV4cGVjdGVkIGRhdGEgaW4gaW50ZXJuYWwgbGlzdCIpOwotCQkJZ290byBlcnI7Ci0JCX0KKyAgICAgICAgZWxzZSBpZiAoISAoUHlUdXBsZV9DaGVjayhrKSAmJgorICAgICAgICAgICAgICAgICAgICBQeVR1cGxlX0dFVF9TSVpFKGspID09IDIgJiYKKyAgICAgICAgICAgICAgICAgICAgUHlJbnRfQ2hlY2soKGsgPSBQeVR1cGxlX0dFVF9JVEVNKGssIDApKSkpCisgICAgICAgICAgICApIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQaWNrbGluZ0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmV4cGVjdGVkIGRhdGEgaW4gaW50ZXJuYWwgbGlzdCIpOworICAgICAgICAgICAgZ290byBlcnI7CisgICAgICAgIH0KIAotCQllbHNlIHsgLyogcHV0ICovCi0JCQlpayA9IFB5SW50X0FTX0xPTkcoKFB5SW50T2JqZWN0ICopayk7Ci0JCQlpZiAoaWsgPj0gbG0gfHwgaWsgPT0gMCkgewotCQkJCVB5RXJyX1NldFN0cmluZyhQaWNrbGluZ0Vycm9yLAotCQkJCQkJIkludmFsaWQgZ2V0IGRhdGEiKTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJCWhhdmVfZ2V0W2lrXSA9IDE7Ci0JCQlyc2l6ZSArPSBpayA8IDI1NiA/IDIgOiA1OwotCQl9Ci0JfQorICAgICAgICBlbHNlIHsgLyogcHV0ICovCisgICAgICAgICAgICBpayA9IFB5SW50X0FTX0xPTkcoKFB5SW50T2JqZWN0ICopayk7CisgICAgICAgICAgICBpZiAoaWsgPj0gbG0gfHwgaWsgPT0gMCkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQaWNrbGluZ0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBnZXQgZGF0YSIpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaGF2ZV9nZXRbaWtdID0gMTsKKyAgICAgICAgICAgIHJzaXplICs9IGlrIDwgMjU2ID8gMiA6IDU7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKiBOb3cgZ2VuZXJhdGUgdGhlIHJlc3VsdCAqLwotCXIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCByc2l6ZSk7Ci0JaWYgKHIgPT0gTlVMTCkgZ290byBlcnI7Ci0JcyA9IFB5U3RyaW5nX0FTX1NUUklORygoUHlTdHJpbmdPYmplY3QgKilyKTsKKyAgICAvKiBOb3cgZ2VuZXJhdGUgdGhlIHJlc3VsdCAqLworICAgIHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCByc2l6ZSk7CisgICAgaWYgKHIgPT0gTlVMTCkgZ290byBlcnI7CisgICAgcyA9IFB5U3RyaW5nX0FTX1NUUklORygoUHlTdHJpbmdPYmplY3QgKilyKTsKIAotCWZvciAoaSA9IDA7IGkgPCBsOyBpKyspIHsKLQkJayA9IGRhdGEtPmRhdGFbaV07CisgICAgZm9yIChpID0gMDsgaSA8IGw7IGkrKykgeworICAgICAgICBrID0gZGF0YS0+ZGF0YVtpXTsKIAotCQlpZiAoUHlTdHJpbmdfQ2hlY2soaykpIHsKLQkJCXNzaXplID0gUHlTdHJpbmdfR0VUX1NJWkUoayk7Ci0JCQlpZiAoc3NpemUpIHsKLQkJCQlwPVB5U3RyaW5nX0FTX1NUUklORygoUHlTdHJpbmdPYmplY3QgKilrKTsKLQkJCQl3aGlsZSAoLS1zc2l6ZSA+PSAwKQotCQkJCQkqcysrID0gKnArKzsKLQkJCX0KLQkJfQorICAgICAgICBpZiAoUHlTdHJpbmdfQ2hlY2soaykpIHsKKyAgICAgICAgICAgIHNzaXplID0gUHlTdHJpbmdfR0VUX1NJWkUoayk7CisgICAgICAgICAgICBpZiAoc3NpemUpIHsKKyAgICAgICAgICAgICAgICBwPVB5U3RyaW5nX0FTX1NUUklORygoUHlTdHJpbmdPYmplY3QgKilrKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoLS1zc2l6ZSA+PSAwKQorICAgICAgICAgICAgICAgICAgICAqcysrID0gKnArKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCWVsc2UgaWYgKFB5VHVwbGVfQ2hlY2soaykpIHsgLyogZ2V0ICovCi0JCQlpayA9IFB5SW50X0FTX0xPTkcoKFB5SW50T2JqZWN0ICopCi0JCQkJCSAgICBQeVR1cGxlX0dFVF9JVEVNKGssIDApKTsKLQkJCWlmIChpayA8IDI1NikgewotCQkJCSpzKysgPSBCSU5HRVQ7Ci0JCQkJKnMrKyA9IChpbnQpKGlrICYgMHhmZik7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkqcysrID0gTE9OR19CSU5HRVQ7Ci0JCQkJKnMrKyA9IChpbnQpKGlrICYgMHhmZik7Ci0JCQkJKnMrKyA9IChpbnQpKChpayA+PiA4KSAgJiAweGZmKTsKLQkJCQkqcysrID0gKGludCkoKGlrID4+IDE2KSAmIDB4ZmYpOwotCQkJCSpzKysgPSAoaW50KSgoaWsgPj4gMjQpICYgMHhmZik7Ci0JCQl9Ci0JCX0KKyAgICAgICAgZWxzZSBpZiAoUHlUdXBsZV9DaGVjayhrKSkgeyAvKiBnZXQgKi8KKyAgICAgICAgICAgIGlrID0gUHlJbnRfQVNfTE9ORygoUHlJbnRPYmplY3QgKikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlUdXBsZV9HRVRfSVRFTShrLCAwKSk7CisgICAgICAgICAgICBpZiAoaWsgPCAyNTYpIHsKKyAgICAgICAgICAgICAgICAqcysrID0gQklOR0VUOworICAgICAgICAgICAgICAgICpzKysgPSAoaW50KShpayAmIDB4ZmYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgKnMrKyA9IExPTkdfQklOR0VUOworICAgICAgICAgICAgICAgICpzKysgPSAoaW50KShpayAmIDB4ZmYpOworICAgICAgICAgICAgICAgICpzKysgPSAoaW50KSgoaWsgPj4gOCkgICYgMHhmZik7CisgICAgICAgICAgICAgICAgKnMrKyA9IChpbnQpKChpayA+PiAxNikgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAqcysrID0gKGludCkoKGlrID4+IDI0KSAmIDB4ZmYpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJZWxzZSB7IC8qIHB1dCAqLwotCQkJaWsgPSBQeUludF9BU19MT05HKChQeUludE9iamVjdCopayk7CisgICAgICAgIGVsc2UgeyAvKiBwdXQgKi8KKyAgICAgICAgICAgIGlrID0gUHlJbnRfQVNfTE9ORygoUHlJbnRPYmplY3QqKWspOwogCi0JCQlpZiAoaGF2ZV9nZXRbaWtdKSB7IC8qIHdpdGggbWF0Y2hpbmcgZ2V0ICovCi0JCQkJaWYgKGlrIDwgMjU2KSB7Ci0JCQkJCSpzKysgPSBCSU5QVVQ7Ci0JCQkJCSpzKysgPSAoaW50KShpayAmIDB4ZmYpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJKnMrKyA9IExPTkdfQklOUFVUOwotCQkJCQkqcysrID0gKGludCkoaWsgJiAweGZmKTsKLQkJCQkJKnMrKyA9IChpbnQpKChpayA+PiA4KSAgJiAweGZmKTsKLQkJCQkJKnMrKyA9IChpbnQpKChpayA+PiAxNikgJiAweGZmKTsKLQkJCQkJKnMrKyA9IChpbnQpKChpayA+PiAyNCkgJiAweGZmKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9CisgICAgICAgICAgICBpZiAoaGF2ZV9nZXRbaWtdKSB7IC8qIHdpdGggbWF0Y2hpbmcgZ2V0ICovCisgICAgICAgICAgICAgICAgaWYgKGlrIDwgMjU2KSB7CisgICAgICAgICAgICAgICAgICAgICpzKysgPSBCSU5QVVQ7CisgICAgICAgICAgICAgICAgICAgICpzKysgPSAoaW50KShpayAmIDB4ZmYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgKnMrKyA9IExPTkdfQklOUFVUOworICAgICAgICAgICAgICAgICAgICAqcysrID0gKGludCkoaWsgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICAgKnMrKyA9IChpbnQpKChpayA+PiA4KSAgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICAgKnMrKyA9IChpbnQpKChpayA+PiAxNikgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICAgKnMrKyA9IChpbnQpKChpayA+PiAyNCkgJiAweGZmKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAKLQlpZiAoY2xlYXIpIHsKLQkJUHlEaWN0X0NsZWFyKHNlbGYtPm1lbW8pOwotCQlQZGF0YV9jbGVhcihkYXRhLCAwKTsKLQl9CisgICAgaWYgKGNsZWFyKSB7CisgICAgICAgIFB5RGljdF9DbGVhcihzZWxmLT5tZW1vKTsKKyAgICAgICAgUGRhdGFfY2xlYXIoZGF0YSwgMCk7CisgICAgfQogCi0JZnJlZShoYXZlX2dldCk7Ci0JcmV0dXJuIHI7CisgICAgZnJlZShoYXZlX2dldCk7CisgICAgcmV0dXJuIHI7CiAgIGVycjoKLQlmcmVlKGhhdmVfZ2V0KTsKLQlyZXR1cm4gTlVMTDsKKyAgICBmcmVlKGhhdmVfZ2V0KTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFBpY2tsZXJfZHVtcChQaWNrbGVyb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqb2I7Ci0JaW50IGdldD0wOworICAgIFB5T2JqZWN0ICpvYjsKKyAgICBpbnQgZ2V0PTA7CiAKLQlpZiAoISggUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3xpOmR1bXAiLCAmb2IsICZnZXQpKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCEoIFB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98aTpkdW1wIiwgJm9iLCAmZ2V0KSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKGR1bXAoc2VsZiwgb2IpIDwgMCkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKGR1bXAoc2VsZiwgb2IpIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoZ2V0KSByZXR1cm4gUGlja2xlX2dldHZhbHVlKHNlbGYsIE5VTEwpOworICAgIGlmIChnZXQpIHJldHVybiBQaWNrbGVfZ2V0dmFsdWUoc2VsZiwgTlVMTCk7CiAKLQkvKiBYWFggV2h5IGRvZXMgZHVtcCgpIHJldHVybiBzZWxmPyAqLwotCVB5X0lOQ1JFRihzZWxmKTsKLQlyZXR1cm4gKFB5T2JqZWN0KilzZWxmOworICAgIC8qIFhYWCBXaHkgZG9lcyBkdW1wKCkgcmV0dXJuIHNlbGY/ICovCisgICAgUHlfSU5DUkVGKHNlbGYpOworICAgIHJldHVybiAoUHlPYmplY3QqKXNlbGY7CiB9CiAKIApAQCAtMjkwNSwyNTAgKzI5MDUsMjUwIEBACiBzdGF0aWMgUGlja2xlcm9iamVjdCAqCiBuZXdQaWNrbGVyb2JqZWN0KFB5T2JqZWN0ICpmaWxlLCBpbnQgcHJvdG8pCiB7Ci0JUGlja2xlcm9iamVjdCAqc2VsZjsKKyAgICBQaWNrbGVyb2JqZWN0ICpzZWxmOwogCi0JaWYgKHByb3RvIDwgMCkKLQkJcHJvdG8gPSBISUdIRVNUX1BST1RPQ09MOwotCWlmIChwcm90byA+IEhJR0hFU1RfUFJPVE9DT0wpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsICJwaWNrbGUgcHJvdG9jb2wgJWQgYXNrZWQgZm9yOyAiCi0JCQkgICAgICJ0aGUgaGlnaGVzdCBhdmFpbGFibGUgcHJvdG9jb2wgaXMgJWQiLAotCQkJICAgICBwcm90bywgSElHSEVTVF9QUk9UT0NPTCk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAocHJvdG8gPCAwKQorICAgICAgICBwcm90byA9IEhJR0hFU1RfUFJPVE9DT0w7CisgICAgaWYgKHByb3RvID4gSElHSEVTVF9QUk9UT0NPTCkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwgInBpY2tsZSBwcm90b2NvbCAlZCBhc2tlZCBmb3I7ICIKKyAgICAgICAgICAgICAgICAgICAgICJ0aGUgaGlnaGVzdCBhdmFpbGFibGUgcHJvdG9jb2wgaXMgJWQiLAorICAgICAgICAgICAgICAgICAgICAgcHJvdG8sIEhJR0hFU1RfUFJPVE9DT0wpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlzZWxmID0gUHlPYmplY3RfR0NfTmV3KFBpY2tsZXJvYmplY3QsICZQaWNrbGVydHlwZSk7Ci0JaWYgKHNlbGYgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0Jc2VsZi0+cHJvdG8gPSBwcm90bzsKLQlzZWxmLT5iaW4gPSBwcm90byA+IDA7Ci0Jc2VsZi0+ZnAgPSBOVUxMOwotCXNlbGYtPndyaXRlID0gTlVMTDsKLQlzZWxmLT5tZW1vID0gTlVMTDsKLQlzZWxmLT5hcmcgPSBOVUxMOwotCXNlbGYtPnBlcnNfZnVuYyA9IE5VTEw7Ci0Jc2VsZi0+aW5zdF9wZXJzX2Z1bmMgPSBOVUxMOwotCXNlbGYtPndyaXRlX2J1ZiA9IE5VTEw7Ci0Jc2VsZi0+ZmFzdCA9IDA7Ci0Jc2VsZi0+ZmFzdF9jb250YWluZXIgPSAwOwotCXNlbGYtPmZhc3RfbWVtbyA9IE5VTEw7Ci0Jc2VsZi0+YnVmX3NpemUgPSAwOwotCXNlbGYtPmRpc3BhdGNoX3RhYmxlID0gTlVMTDsKKyAgICBzZWxmID0gUHlPYmplY3RfR0NfTmV3KFBpY2tsZXJvYmplY3QsICZQaWNrbGVydHlwZSk7CisgICAgaWYgKHNlbGYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgc2VsZi0+cHJvdG8gPSBwcm90bzsKKyAgICBzZWxmLT5iaW4gPSBwcm90byA+IDA7CisgICAgc2VsZi0+ZnAgPSBOVUxMOworICAgIHNlbGYtPndyaXRlID0gTlVMTDsKKyAgICBzZWxmLT5tZW1vID0gTlVMTDsKKyAgICBzZWxmLT5hcmcgPSBOVUxMOworICAgIHNlbGYtPnBlcnNfZnVuYyA9IE5VTEw7CisgICAgc2VsZi0+aW5zdF9wZXJzX2Z1bmMgPSBOVUxMOworICAgIHNlbGYtPndyaXRlX2J1ZiA9IE5VTEw7CisgICAgc2VsZi0+ZmFzdCA9IDA7CisgICAgc2VsZi0+ZmFzdF9jb250YWluZXIgPSAwOworICAgIHNlbGYtPmZhc3RfbWVtbyA9IE5VTEw7CisgICAgc2VsZi0+YnVmX3NpemUgPSAwOworICAgIHNlbGYtPmRpc3BhdGNoX3RhYmxlID0gTlVMTDsKIAotCXNlbGYtPmZpbGUgPSBOVUxMOwotCWlmIChmaWxlKQotCQlQeV9JTkNSRUYoZmlsZSk7Ci0JZWxzZSB7Ci0JCWZpbGUgPSBQZGF0YV9OZXcoKTsKLQkJaWYgKGZpbGUgPT0gTlVMTCkKLQkJCWdvdG8gZXJyOwotCX0KLQlzZWxmLT5maWxlID0gZmlsZTsKKyAgICBzZWxmLT5maWxlID0gTlVMTDsKKyAgICBpZiAoZmlsZSkKKyAgICAgICAgUHlfSU5DUkVGKGZpbGUpOworICAgIGVsc2UgeworICAgICAgICBmaWxlID0gUGRhdGFfTmV3KCk7CisgICAgICAgIGlmIChmaWxlID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGVycjsKKyAgICB9CisgICAgc2VsZi0+ZmlsZSA9IGZpbGU7CiAKLQlpZiAoISggc2VsZi0+bWVtbyA9IFB5RGljdF9OZXcoKSkpCi0JCWdvdG8gZXJyOworICAgIGlmICghKCBzZWxmLT5tZW1vID0gUHlEaWN0X05ldygpKSkKKyAgICAgICAgZ290byBlcnI7CiAKLQlpZiAoUHlGaWxlX0NoZWNrKGZpbGUpKSB7Ci0JCXNlbGYtPmZwID0gUHlGaWxlX0FzRmlsZShmaWxlKTsKLQkJaWYgKHNlbGYtPmZwID09IE5VTEwpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCQkiSS9PIG9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZSIpOwotCQkJZ290byBlcnI7Ci0JCX0KLQkJc2VsZi0+d3JpdGVfZnVuYyA9IHdyaXRlX2ZpbGU7Ci0JfQotCWVsc2UgaWYgKFB5Y1N0cmluZ0lPX091dHB1dENoZWNrKGZpbGUpKSB7Ci0JCXNlbGYtPndyaXRlX2Z1bmMgPSB3cml0ZV9jU3RyaW5nSU87Ci0JfQotCWVsc2UgaWYgKGZpbGUgPT0gUHlfTm9uZSkgewotCQlzZWxmLT53cml0ZV9mdW5jID0gd3JpdGVfbm9uZTsKLQl9Ci0JZWxzZSB7Ci0JCXNlbGYtPndyaXRlX2Z1bmMgPSB3cml0ZV9vdGhlcjsKKyAgICBpZiAoUHlGaWxlX0NoZWNrKGZpbGUpKSB7CisgICAgICAgIHNlbGYtPmZwID0gUHlGaWxlX0FzRmlsZShmaWxlKTsKKyAgICAgICAgaWYgKHNlbGYtPmZwID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJL08gb3BlcmF0aW9uIG9uIGNsb3NlZCBmaWxlIik7CisgICAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgfQorICAgICAgICBzZWxmLT53cml0ZV9mdW5jID0gd3JpdGVfZmlsZTsKKyAgICB9CisgICAgZWxzZSBpZiAoUHljU3RyaW5nSU9fT3V0cHV0Q2hlY2soZmlsZSkpIHsKKyAgICAgICAgc2VsZi0+d3JpdGVfZnVuYyA9IHdyaXRlX2NTdHJpbmdJTzsKKyAgICB9CisgICAgZWxzZSBpZiAoZmlsZSA9PSBQeV9Ob25lKSB7CisgICAgICAgIHNlbGYtPndyaXRlX2Z1bmMgPSB3cml0ZV9ub25lOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgc2VsZi0+d3JpdGVfZnVuYyA9IHdyaXRlX290aGVyOwogCi0JCWlmICghIFBkYXRhX0NoZWNrKGZpbGUpKSB7Ci0JCQlzZWxmLT53cml0ZSA9IFB5T2JqZWN0X0dldEF0dHIoZmlsZSwgd3JpdGVfc3RyKTsKLQkJCWlmICghc2VsZi0+d3JpdGUpICB7Ci0JCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCQkJImFyZ3VtZW50IG11c3QgaGF2ZSAnd3JpdGUnICIKLQkJCQkJCSJhdHRyaWJ1dGUiKTsKLQkJCQlnb3RvIGVycjsKLQkJCX0KLQkJfQorICAgICAgICBpZiAoISBQZGF0YV9DaGVjayhmaWxlKSkgeworICAgICAgICAgICAgc2VsZi0+d3JpdGUgPSBQeU9iamVjdF9HZXRBdHRyKGZpbGUsIHdyaXRlX3N0cik7CisgICAgICAgICAgICBpZiAoIXNlbGYtPndyaXRlKSAgeworICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFyZ3VtZW50IG11c3QgaGF2ZSAnd3JpdGUnICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImF0dHJpYnV0ZSIpOworICAgICAgICAgICAgICAgIGdvdG8gZXJyOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJc2VsZi0+d3JpdGVfYnVmID0gKGNoYXIgKilQeU1lbV9NYWxsb2MoV1JJVEVfQlVGX1NJWkUpOwotCQlpZiAoc2VsZi0+d3JpdGVfYnVmID09IE5VTEwpIHsKLQkJCVB5RXJyX05vTWVtb3J5KCk7Ci0JCQlnb3RvIGVycjsKLQkJfQotCX0KKyAgICAgICAgc2VsZi0+d3JpdGVfYnVmID0gKGNoYXIgKilQeU1lbV9NYWxsb2MoV1JJVEVfQlVGX1NJWkUpOworICAgICAgICBpZiAoc2VsZi0+d3JpdGVfYnVmID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgfQorICAgIH0KIAotCWlmIChQeUV2YWxfR2V0UmVzdHJpY3RlZCgpKSB7Ci0JCS8qIFJlc3RyaWN0ZWQgZXhlY3V0aW9uLCBnZXQgcHJpdmF0ZSB0YWJsZXMgKi8KLQkJUHlPYmplY3QgKm0gPSBQeUltcG9ydF9JbXBvcnRNb2R1bGUoImNvcHlfcmVnIik7CisgICAgaWYgKFB5RXZhbF9HZXRSZXN0cmljdGVkKCkpIHsKKyAgICAgICAgLyogUmVzdHJpY3RlZCBleGVjdXRpb24sIGdldCBwcml2YXRlIHRhYmxlcyAqLworICAgICAgICBQeU9iamVjdCAqbSA9IFB5SW1wb3J0X0ltcG9ydE1vZHVsZSgiY29weV9yZWciKTsKIAotCQlpZiAobSA9PSBOVUxMKQotCQkJZ290byBlcnI7Ci0JCXNlbGYtPmRpc3BhdGNoX3RhYmxlID0gUHlPYmplY3RfR2V0QXR0cihtLCBkaXNwYXRjaF90YWJsZV9zdHIpOwotCQlQeV9ERUNSRUYobSk7Ci0JCWlmIChzZWxmLT5kaXNwYXRjaF90YWJsZSA9PSBOVUxMKQotCQkJZ290byBlcnI7Ci0JfQotCWVsc2UgewotCQlzZWxmLT5kaXNwYXRjaF90YWJsZSA9IGRpc3BhdGNoX3RhYmxlOwotCQlQeV9JTkNSRUYoZGlzcGF0Y2hfdGFibGUpOwotCX0KLQlQeU9iamVjdF9HQ19UcmFjayhzZWxmKTsKKyAgICAgICAgaWYgKG0gPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gZXJyOworICAgICAgICBzZWxmLT5kaXNwYXRjaF90YWJsZSA9IFB5T2JqZWN0X0dldEF0dHIobSwgZGlzcGF0Y2hfdGFibGVfc3RyKTsKKyAgICAgICAgUHlfREVDUkVGKG0pOworICAgICAgICBpZiAoc2VsZi0+ZGlzcGF0Y2hfdGFibGUgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgc2VsZi0+ZGlzcGF0Y2hfdGFibGUgPSBkaXNwYXRjaF90YWJsZTsKKyAgICAgICAgUHlfSU5DUkVGKGRpc3BhdGNoX3RhYmxlKTsKKyAgICB9CisgICAgUHlPYmplY3RfR0NfVHJhY2soc2VsZik7CiAKLQlyZXR1cm4gc2VsZjsKKyAgICByZXR1cm4gc2VsZjsKIAogICBlcnI6Ci0JUHlfREVDUkVGKHNlbGYpOwotCXJldHVybiBOVUxMOworICAgIFB5X0RFQ1JFRihzZWxmKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogCiBzdGF0aWMgUHlPYmplY3QgKgogZ2V0X1BpY2tsZXIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7ImZpbGUiLCAicHJvdG9jb2wiLCBOVUxMfTsKLQlQeU9iamVjdCAqZmlsZSA9IE5VTEw7Ci0JaW50IHByb3RvID0gMDsKKyAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7ImZpbGUiLCAicHJvdG9jb2wiLCBOVUxMfTsKKyAgICBQeU9iamVjdCAqZmlsZSA9IE5VTEw7CisgICAgaW50IHByb3RvID0gMDsKIAotCS8qIFhYWAotCSAqIFRoZSBkb2N1bWVudGVkIHNpZ25hdHVyZSBpcyBQaWNrbGVyKGZpbGUsIHByb3RvY29sPTApLCBidXQgdGhpcwotCSAqIGFjY2VwdHMgUGlja2xlcigpIGFuZCBQaWNrbGVyKGludGVnZXIpIHRvby4gIFRoZSBtZWFuaW5nIHRoZW4KLQkgKiBpcyBjbGVhciBhcyBtdWQsIHVuZG9jdW1lbnRlZCwgYW5kIG5vdCBzdXBwb3J0ZWQgYnkgcGlja2xlLnB5LgotCSAqIEknbSB0b2xkIFpvcGUgdXNlcyB0aGlzLCBidXQgSSBoYXZlbid0IHRyYWNlZCBpbnRvIHRoaXMgY29kZQotCSAqIGZhciBlbm91Z2ggdG8gZmlndXJlIG91dCB3aGF0IGl0IG1lYW5zLgotCSAqLwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifGk6UGlja2xlciIsICZwcm90bykpIHsKLQkJUHlFcnJfQ2xlYXIoKTsKLQkJcHJvdG8gPSAwOwotCQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAiT3xpOlBpY2tsZXIiLAotCQkJICAgIGt3bGlzdCwgJmZpbGUsICZwcm90bykpCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIChQeU9iamVjdCAqKW5ld1BpY2tsZXJvYmplY3QoZmlsZSwgcHJvdG8pOworICAgIC8qIFhYWAorICAgICAqIFRoZSBkb2N1bWVudGVkIHNpZ25hdHVyZSBpcyBQaWNrbGVyKGZpbGUsIHByb3RvY29sPTApLCBidXQgdGhpcworICAgICAqIGFjY2VwdHMgUGlja2xlcigpIGFuZCBQaWNrbGVyKGludGVnZXIpIHRvby4gIFRoZSBtZWFuaW5nIHRoZW4KKyAgICAgKiBpcyBjbGVhciBhcyBtdWQsIHVuZG9jdW1lbnRlZCwgYW5kIG5vdCBzdXBwb3J0ZWQgYnkgcGlja2xlLnB5LgorICAgICAqIEknbSB0b2xkIFpvcGUgdXNlcyB0aGlzLCBidXQgSSBoYXZlbid0IHRyYWNlZCBpbnRvIHRoaXMgY29kZQorICAgICAqIGZhciBlbm91Z2ggdG8gZmlndXJlIG91dCB3aGF0IGl0IG1lYW5zLgorICAgICAqLworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifGk6UGlja2xlciIsICZwcm90bykpIHsKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgcHJvdG8gPSAwOworICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAiT3xpOlBpY2tsZXIiLAorICAgICAgICAgICAgICAgICAgICBrd2xpc3QsICZmaWxlLCAmcHJvdG8pKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiAoUHlPYmplY3QgKiluZXdQaWNrbGVyb2JqZWN0KGZpbGUsIHByb3RvKTsKIH0KIAogCiBzdGF0aWMgdm9pZAogUGlja2xlcl9kZWFsbG9jKFBpY2tsZXJvYmplY3QgKnNlbGYpCiB7Ci0JUHlPYmplY3RfR0NfVW5UcmFjayhzZWxmKTsKLQlQeV9YREVDUkVGKHNlbGYtPndyaXRlKTsKLQlQeV9YREVDUkVGKHNlbGYtPm1lbW8pOwotCVB5X1hERUNSRUYoc2VsZi0+ZmFzdF9tZW1vKTsKLQlQeV9YREVDUkVGKHNlbGYtPmFyZyk7Ci0JUHlfWERFQ1JFRihzZWxmLT5maWxlKTsKLQlQeV9YREVDUkVGKHNlbGYtPnBlcnNfZnVuYyk7Ci0JUHlfWERFQ1JFRihzZWxmLT5pbnN0X3BlcnNfZnVuYyk7Ci0JUHlfWERFQ1JFRihzZWxmLT5kaXNwYXRjaF90YWJsZSk7Ci0JUHlNZW1fRnJlZShzZWxmLT53cml0ZV9idWYpOwotCVB5X1RZUEUoc2VsZiktPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CisgICAgUHlPYmplY3RfR0NfVW5UcmFjayhzZWxmKTsKKyAgICBQeV9YREVDUkVGKHNlbGYtPndyaXRlKTsKKyAgICBQeV9YREVDUkVGKHNlbGYtPm1lbW8pOworICAgIFB5X1hERUNSRUYoc2VsZi0+ZmFzdF9tZW1vKTsKKyAgICBQeV9YREVDUkVGKHNlbGYtPmFyZyk7CisgICAgUHlfWERFQ1JFRihzZWxmLT5maWxlKTsKKyAgICBQeV9YREVDUkVGKHNlbGYtPnBlcnNfZnVuYyk7CisgICAgUHlfWERFQ1JFRihzZWxmLT5pbnN0X3BlcnNfZnVuYyk7CisgICAgUHlfWERFQ1JFRihzZWxmLT5kaXNwYXRjaF90YWJsZSk7CisgICAgUHlNZW1fRnJlZShzZWxmLT53cml0ZV9idWYpOworICAgIFB5X1RZUEUoc2VsZiktPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIHN0YXRpYyBpbnQKIFBpY2tsZXJfdHJhdmVyc2UoUGlja2xlcm9iamVjdCAqc2VsZiwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JUHlfVklTSVQoc2VsZi0+d3JpdGUpOwotCVB5X1ZJU0lUKHNlbGYtPm1lbW8pOwotCVB5X1ZJU0lUKHNlbGYtPmZhc3RfbWVtbyk7Ci0JUHlfVklTSVQoc2VsZi0+YXJnKTsKLQlQeV9WSVNJVChzZWxmLT5maWxlKTsKLQlQeV9WSVNJVChzZWxmLT5wZXJzX2Z1bmMpOwotCVB5X1ZJU0lUKHNlbGYtPmluc3RfcGVyc19mdW5jKTsKLQlQeV9WSVNJVChzZWxmLT5kaXNwYXRjaF90YWJsZSk7Ci0JcmV0dXJuIDA7CisgICAgUHlfVklTSVQoc2VsZi0+d3JpdGUpOworICAgIFB5X1ZJU0lUKHNlbGYtPm1lbW8pOworICAgIFB5X1ZJU0lUKHNlbGYtPmZhc3RfbWVtbyk7CisgICAgUHlfVklTSVQoc2VsZi0+YXJnKTsKKyAgICBQeV9WSVNJVChzZWxmLT5maWxlKTsKKyAgICBQeV9WSVNJVChzZWxmLT5wZXJzX2Z1bmMpOworICAgIFB5X1ZJU0lUKHNlbGYtPmluc3RfcGVyc19mdW5jKTsKKyAgICBQeV9WSVNJVChzZWxmLT5kaXNwYXRjaF90YWJsZSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIFBpY2tsZXJfY2xlYXIoUGlja2xlcm9iamVjdCAqc2VsZikKIHsKLQlQeV9DTEVBUihzZWxmLT53cml0ZSk7Ci0JUHlfQ0xFQVIoc2VsZi0+bWVtbyk7Ci0JUHlfQ0xFQVIoc2VsZi0+ZmFzdF9tZW1vKTsKLQlQeV9DTEVBUihzZWxmLT5hcmcpOwotCVB5X0NMRUFSKHNlbGYtPmZpbGUpOwotCVB5X0NMRUFSKHNlbGYtPnBlcnNfZnVuYyk7Ci0JUHlfQ0xFQVIoc2VsZi0+aW5zdF9wZXJzX2Z1bmMpOwotCVB5X0NMRUFSKHNlbGYtPmRpc3BhdGNoX3RhYmxlKTsKLQlyZXR1cm4gMDsKKyAgICBQeV9DTEVBUihzZWxmLT53cml0ZSk7CisgICAgUHlfQ0xFQVIoc2VsZi0+bWVtbyk7CisgICAgUHlfQ0xFQVIoc2VsZi0+ZmFzdF9tZW1vKTsKKyAgICBQeV9DTEVBUihzZWxmLT5hcmcpOworICAgIFB5X0NMRUFSKHNlbGYtPmZpbGUpOworICAgIFB5X0NMRUFSKHNlbGYtPnBlcnNfZnVuYyk7CisgICAgUHlfQ0xFQVIoc2VsZi0+aW5zdF9wZXJzX2Z1bmMpOworICAgIFB5X0NMRUFSKHNlbGYtPmRpc3BhdGNoX3RhYmxlKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFBpY2tsZXJfZ2V0X3BlcnNfZnVuYyhQaWNrbGVyb2JqZWN0ICpwKQogewotCWlmIChwLT5wZXJzX2Z1bmMgPT0gTlVMTCkKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0F0dHJpYnV0ZUVycm9yLCAicGVyc2lzdGVudF9pZCIpOwotCWVsc2UKLQkJUHlfSU5DUkVGKHAtPnBlcnNfZnVuYyk7Ci0JcmV0dXJuIHAtPnBlcnNfZnVuYzsKKyAgICBpZiAocC0+cGVyc19mdW5jID09IE5VTEwpCisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19BdHRyaWJ1dGVFcnJvciwgInBlcnNpc3RlbnRfaWQiKTsKKyAgICBlbHNlCisgICAgICAgIFB5X0lOQ1JFRihwLT5wZXJzX2Z1bmMpOworICAgIHJldHVybiBwLT5wZXJzX2Z1bmM7CiB9CiAKIHN0YXRpYyBpbnQKIFBpY2tsZXJfc2V0X3BlcnNfZnVuYyhQaWNrbGVyb2JqZWN0ICpwLCBQeU9iamVjdCAqdikKIHsKLQlpZiAodiA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJImF0dHJpYnV0ZSBkZWxldGlvbiBpcyBub3Qgc3VwcG9ydGVkIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JUHlfWERFQ1JFRihwLT5wZXJzX2Z1bmMpOwotCVB5X0lOQ1JFRih2KTsKLQlwLT5wZXJzX2Z1bmMgPSB2OwotCXJldHVybiAwOworICAgIGlmICh2ID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJhdHRyaWJ1dGUgZGVsZXRpb24gaXMgbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIFB5X1hERUNSRUYocC0+cGVyc19mdW5jKTsKKyAgICBQeV9JTkNSRUYodik7CisgICAgcC0+cGVyc19mdW5jID0gdjsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogUGlja2xlcl9zZXRfaW5zdF9wZXJzX2Z1bmMoUGlja2xlcm9iamVjdCAqcCwgUHlPYmplY3QgKnYpCiB7Ci0JaWYgKHYgPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJhdHRyaWJ1dGUgZGVsZXRpb24gaXMgbm90IHN1cHBvcnRlZCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCVB5X1hERUNSRUYocC0+aW5zdF9wZXJzX2Z1bmMpOwotCVB5X0lOQ1JFRih2KTsKLQlwLT5pbnN0X3BlcnNfZnVuYyA9IHY7Ci0JcmV0dXJuIDA7CisgICAgaWYgKHYgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImF0dHJpYnV0ZSBkZWxldGlvbiBpcyBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgUHlfWERFQ1JFRihwLT5pbnN0X3BlcnNfZnVuYyk7CisgICAgUHlfSU5DUkVGKHYpOworICAgIHAtPmluc3RfcGVyc19mdW5jID0gdjsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFBpY2tsZXJfZ2V0X21lbW8oUGlja2xlcm9iamVjdCAqcCkKIHsKLQlpZiAocC0+bWVtbyA9PSBOVUxMKQotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfQXR0cmlidXRlRXJyb3IsICJtZW1vIik7Ci0JZWxzZQotCQlQeV9JTkNSRUYocC0+bWVtbyk7Ci0JcmV0dXJuIHAtPm1lbW87CisgICAgaWYgKHAtPm1lbW8gPT0gTlVMTCkKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0F0dHJpYnV0ZUVycm9yLCAibWVtbyIpOworICAgIGVsc2UKKyAgICAgICAgUHlfSU5DUkVGKHAtPm1lbW8pOworICAgIHJldHVybiBwLT5tZW1vOwogfQogCiBzdGF0aWMgaW50CiBQaWNrbGVyX3NldF9tZW1vKFBpY2tsZXJvYmplY3QgKnAsIFB5T2JqZWN0ICp2KQogewotCWlmICh2ID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiYXR0cmlidXRlIGRlbGV0aW9uIGlzIG5vdCBzdXBwb3J0ZWQiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoIVB5RGljdF9DaGVjayh2KSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAibWVtbyBtdXN0IGJlIGEgZGljdGlvbmFyeSIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCVB5X1hERUNSRUYocC0+bWVtbyk7Ci0JUHlfSU5DUkVGKHYpOwotCXAtPm1lbW8gPSB2OwotCXJldHVybiAwOworICAgIGlmICh2ID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJhdHRyaWJ1dGUgZGVsZXRpb24gaXMgbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICghUHlEaWN0X0NoZWNrKHYpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJtZW1vIG11c3QgYmUgYSBkaWN0aW9uYXJ5Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgUHlfWERFQ1JFRihwLT5tZW1vKTsKKyAgICBQeV9JTkNSRUYodik7CisgICAgcC0+bWVtbyA9IHY7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBQaWNrbGVyX2dldF9lcnJvcihQaWNrbGVyb2JqZWN0ICpwKQogewotCS8qIHdoeSBpcyB0aGlzIGFuIGF0dHJpYnV0ZSBvbiB0aGUgUGlja2xlcj8gKi8KLQlQeV9JTkNSRUYoUGlja2xpbmdFcnJvcik7Ci0JcmV0dXJuIFBpY2tsaW5nRXJyb3I7CisgICAgLyogd2h5IGlzIHRoaXMgYW4gYXR0cmlidXRlIG9uIHRoZSBQaWNrbGVyPyAqLworICAgIFB5X0lOQ1JFRihQaWNrbGluZ0Vycm9yKTsKKyAgICByZXR1cm4gUGlja2xpbmdFcnJvcjsKIH0KIAogc3RhdGljIFB5TWVtYmVyRGVmIFBpY2tsZXJfbWVtYmVyc1tdID0gewpAQCAtMzE3NCwxNDMgKzMxNzQsMTQzIEBACiAgICAgImNQaWNrbGUuUGlja2xlciIsICAgICAgICAgICAgLyp0cF9uYW1lKi8KICAgICBzaXplb2YoUGlja2xlcm9iamVjdCksICAgICAgICAgICAgICAvKnRwX2Jhc2ljc2l6ZSovCiAgICAgMCwKLSAgICAoZGVzdHJ1Y3RvcilQaWNrbGVyX2RlYWxsb2MsCS8qIHRwX2RlYWxsb2MgKi8KLSAgICAwLAkJCQkJLyogdHBfcHJpbnQgKi8KLSAgICAwLAkJCSAJCS8qIHRwX2dldGF0dHIgKi8KLSAgICAwLAkJCSAJCS8qIHRwX3NldGF0dHIgKi8KLSAgICAwLAkJCQkJLyogdHBfY29tcGFyZSAqLwotICAgIDAsCQkgCQkJLyogdHBfcmVwciAqLwotICAgIDAsCQkJCQkvKiB0cF9hc19udW1iZXIgKi8KLSAgICAwLAkJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLSAgICAwLAkJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotICAgIDAsCQkJCQkvKiB0cF9oYXNoICovCi0gICAgMCwJCQkJCS8qIHRwX2NhbGwgKi8KLSAgICAwLAkJCQkJLyogdHBfc3RyICovCi0gICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCQkvKiB0cF9nZXRhdHRybyAqLwotICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLAkJLyogdHBfc2V0YXR0cm8gKi8KLSAgICAwLAkJCQkJLyogdHBfYXNfYnVmZmVyICovCisgICAgKGRlc3RydWN0b3IpUGlja2xlcl9kZWFsbG9jLCAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLwogICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfQkFTRVRZUEUgfCBQeV9UUEZMQUdTX0hBVkVfR0MsCi0gICAgUGlja2xlcnR5cGVfX2RvY19fLAkJCS8qIHRwX2RvYyAqLwotICAgICh0cmF2ZXJzZXByb2MpUGlja2xlcl90cmF2ZXJzZSwJLyogdHBfdHJhdmVyc2UgKi8KLSAgICAoaW5xdWlyeSlQaWNrbGVyX2NsZWFyLAkJLyogdHBfY2xlYXIgKi8KLSAgICAwLAkJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLSAgICAwLAkJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLSAgICAwLAkJCQkJLyogdHBfaXRlciAqLwotICAgIDAsCQkJCQkvKiB0cF9pdGVybmV4dCAqLwotICAgIFBpY2tsZXJfbWV0aG9kcywJCQkvKiB0cF9tZXRob2RzICovCi0gICAgUGlja2xlcl9tZW1iZXJzLAkJCS8qIHRwX21lbWJlcnMgKi8KLSAgICBQaWNrbGVyX2dldHNldHMsCQkJLyogdHBfZ2V0c2V0ICovCisgICAgUGlja2xlcnR5cGVfX2RvY19fLCAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgKHRyYXZlcnNlcHJvYylQaWNrbGVyX3RyYXZlcnNlLCAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAoaW5xdWlyeSlQaWNrbGVyX2NsZWFyLCAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICBQaWNrbGVyX21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgUGlja2xlcl9tZW1iZXJzLCAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIFBpY2tsZXJfZ2V0c2V0cywgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLwogfTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIGZpbmRfY2xhc3MoUHlPYmplY3QgKnB5X21vZHVsZV9uYW1lLCBQeU9iamVjdCAqcHlfZ2xvYmFsX25hbWUsIFB5T2JqZWN0ICpmYykKIHsKLQlQeU9iamVjdCAqZ2xvYmFsID0gMCwgKm1vZHVsZTsKKyAgICBQeU9iamVjdCAqZ2xvYmFsID0gMCwgKm1vZHVsZTsKIAotCWlmIChmYykgewotCQlpZiAoZmM9PVB5X05vbmUpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhVbnBpY2tsaW5nRXJyb3IsICJHbG9iYWwgYW5kIGluc3RhbmNlICIKLQkJCQkJInBpY2tsZXMgYXJlIG5vdCBzdXBwb3J0ZWQuIik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlyZXR1cm4gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhmYywgcHlfbW9kdWxlX25hbWUsCi0JCQkJCSAgICAgICAgICAgIHB5X2dsb2JhbF9uYW1lLCBOVUxMKTsKLQl9CisgICAgaWYgKGZjKSB7CisgICAgICAgIGlmIChmYz09UHlfTm9uZSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFVucGlja2xpbmdFcnJvciwgIkdsb2JhbCBhbmQgaW5zdGFuY2UgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwaWNrbGVzIGFyZSBub3Qgc3VwcG9ydGVkLiIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoZmMsIHB5X21vZHVsZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBweV9nbG9iYWxfbmFtZSwgTlVMTCk7CisgICAgfQogCi0JbW9kdWxlID0gUHlTeXNfR2V0T2JqZWN0KCJtb2R1bGVzIik7Ci0JaWYgKG1vZHVsZSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBtb2R1bGUgPSBQeVN5c19HZXRPYmplY3QoIm1vZHVsZXMiKTsKKyAgICBpZiAobW9kdWxlID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JbW9kdWxlID0gUHlEaWN0X0dldEl0ZW0obW9kdWxlLCBweV9tb2R1bGVfbmFtZSk7Ci0JaWYgKG1vZHVsZSA9PSBOVUxMKSB7Ci0JCW1vZHVsZSA9IFB5SW1wb3J0X0ltcG9ydChweV9tb2R1bGVfbmFtZSk7Ci0JCWlmICghbW9kdWxlKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWdsb2JhbCA9IFB5T2JqZWN0X0dldEF0dHIobW9kdWxlLCBweV9nbG9iYWxfbmFtZSk7Ci0JCVB5X0RFQ1JFRihtb2R1bGUpOwotCX0KLQllbHNlCi0JCWdsb2JhbCA9IFB5T2JqZWN0X0dldEF0dHIobW9kdWxlLCBweV9nbG9iYWxfbmFtZSk7Ci0JcmV0dXJuIGdsb2JhbDsKKyAgICBtb2R1bGUgPSBQeURpY3RfR2V0SXRlbShtb2R1bGUsIHB5X21vZHVsZV9uYW1lKTsKKyAgICBpZiAobW9kdWxlID09IE5VTEwpIHsKKyAgICAgICAgbW9kdWxlID0gUHlJbXBvcnRfSW1wb3J0KHB5X21vZHVsZV9uYW1lKTsKKyAgICAgICAgaWYgKCFtb2R1bGUpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgZ2xvYmFsID0gUHlPYmplY3RfR2V0QXR0cihtb2R1bGUsIHB5X2dsb2JhbF9uYW1lKTsKKyAgICAgICAgUHlfREVDUkVGKG1vZHVsZSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgZ2xvYmFsID0gUHlPYmplY3RfR2V0QXR0cihtb2R1bGUsIHB5X2dsb2JhbF9uYW1lKTsKKyAgICByZXR1cm4gZ2xvYmFsOwogfQogCiBzdGF0aWMgaW50CiBtYXJrZXIoVW5waWNrbGVyb2JqZWN0ICpzZWxmKQogewotCWlmIChzZWxmLT5udW1fbWFya3MgPCAxKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhVbnBpY2tsaW5nRXJyb3IsICJjb3VsZCBub3QgZmluZCBNQVJLIik7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgaWYgKHNlbGYtPm51bV9tYXJrcyA8IDEpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFVucGlja2xpbmdFcnJvciwgImNvdWxkIG5vdCBmaW5kIE1BUksiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCXJldHVybiBzZWxmLT5tYXJrc1stLXNlbGYtPm51bV9tYXJrc107CisgICAgcmV0dXJuIHNlbGYtPm1hcmtzWy0tc2VsZi0+bnVtX21hcmtzXTsKIH0KIAogCiBzdGF0aWMgaW50CiBsb2FkX25vbmUoVW5waWNrbGVyb2JqZWN0ICpzZWxmKQogewotCVBEQVRBX0FQUEVORChzZWxmLT5zdGFjaywgUHlfTm9uZSwgLTEpOwotCXJldHVybiAwOworICAgIFBEQVRBX0FQUEVORChzZWxmLT5zdGFjaywgUHlfTm9uZSwgLTEpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBiYWRfcmVhZGxpbmUodm9pZCkKIHsKLQlQeUVycl9TZXRTdHJpbmcoVW5waWNrbGluZ0Vycm9yLCAicGlja2xlIGRhdGEgd2FzIHRydW5jYXRlZCIpOwotCXJldHVybiAtMTsKKyAgICBQeUVycl9TZXRTdHJpbmcoVW5waWNrbGluZ0Vycm9yLCAicGlja2xlIGRhdGEgd2FzIHRydW5jYXRlZCIpOworICAgIHJldHVybiAtMTsKIH0KIAogc3RhdGljIGludAogbG9hZF9pbnQoVW5waWNrbGVyb2JqZWN0ICpzZWxmKQogewotCVB5T2JqZWN0ICpweV9pbnQgPSAwOwotCWNoYXIgKmVuZHB0ciwgKnM7Ci0JaW50IGxlbiwgcmVzID0gLTE7Ci0JbG9uZyBsOworICAgIFB5T2JqZWN0ICpweV9pbnQgPSAwOworICAgIGNoYXIgKmVuZHB0ciwgKnM7CisgICAgaW50IGxlbiwgcmVzID0gLTE7CisgICAgbG9uZyBsOwogCi0JaWYgKChsZW4gPSBzZWxmLT5yZWFkbGluZV9mdW5jKHNlbGYsICZzKSkgPCAwKSByZXR1cm4gLTE7Ci0JaWYgKGxlbiA8IDIpIHJldHVybiBiYWRfcmVhZGxpbmUoKTsKLQlpZiAoISggcz1weXN0cm5kdXAocyxsZW4pKSkgIHJldHVybiAtMTsKKyAgICBpZiAoKGxlbiA9IHNlbGYtPnJlYWRsaW5lX2Z1bmMoc2VsZiwgJnMpKSA8IDApIHJldHVybiAtMTsKKyAgICBpZiAobGVuIDwgMikgcmV0dXJuIGJhZF9yZWFkbGluZSgpOworICAgIGlmICghKCBzPXB5c3RybmR1cChzLGxlbikpKSAgcmV0dXJuIC0xOwogCi0JZXJybm8gPSAwOwotCWwgPSBzdHJ0b2wocywgJmVuZHB0ciwgMCk7CisgICAgZXJybm8gPSAwOworICAgIGwgPSBzdHJ0b2wocywgJmVuZHB0ciwgMCk7CiAKLQlpZiAoZXJybm8gfHwgKCplbmRwdHIgIT0gJ1xuJykgfHwgKGVuZHB0clsxXSAhPSAnXDAnKSkgewotCQkvKiBIbSwgbWF5YmUgd2UndmUgZ290IHNvbWV0aGluZyBsb25nLiAgTGV0J3MgdHJ5IHJlYWRpbmcKLQkJICAgaXQgYXMgYSBQeXRob24gbG9uZyBvYmplY3QuICovCi0JCWVycm5vID0gMDsKLQkJcHlfaW50ID0gUHlMb25nX0Zyb21TdHJpbmcocywgTlVMTCwgMCk7Ci0JCWlmIChweV9pbnQgPT0gTlVMTCkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJCSJjb3VsZCBub3QgY29udmVydCBzdHJpbmcgdG8gaW50Iik7Ci0JCQlnb3RvIGZpbmFsbHk7Ci0JCX0KLQl9Ci0JZWxzZSB7Ci0JCWlmIChsZW4gPT0gMyAmJiAobCA9PSAwIHx8IGwgPT0gMSkpIHsKLQkJCWlmICghKCBweV9pbnQgPSBQeUJvb2xfRnJvbUxvbmcobCkpKSAgZ290byBmaW5hbGx5OwotCQl9Ci0JCWVsc2UgewotCQkJaWYgKCEoIHB5X2ludCA9IFB5SW50X0Zyb21Mb25nKGwpKSkgIGdvdG8gZmluYWxseTsKLQkJfQotCX0KKyAgICBpZiAoZXJybm8gfHwgKCplbmRwdHIgIT0gJ1xuJykgfHwgKGVuZHB0clsxXSAhPSAnXDAnKSkgeworICAgICAgICAvKiBIbSwgbWF5YmUgd2UndmUgZ290IHNvbWV0aGluZyBsb25nLiAgTGV0J3MgdHJ5IHJlYWRpbmcKKyAgICAgICAgICAgaXQgYXMgYSBQeXRob24gbG9uZyBvYmplY3QuICovCisgICAgICAgIGVycm5vID0gMDsKKyAgICAgICAgcHlfaW50ID0gUHlMb25nX0Zyb21TdHJpbmcocywgTlVMTCwgMCk7CisgICAgICAgIGlmIChweV9pbnQgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvdWxkIG5vdCBjb252ZXJ0IHN0cmluZyB0byBpbnQiKTsKKyAgICAgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKGxlbiA9PSAzICYmIChsID09IDAgfHwgbCA9PSAxKSkgeworICAgICAgICAgICAgaWYgKCEoIHB5X2ludCA9IFB5Qm9vbF9Gcm9tTG9uZyhsKSkpICBnb3RvIGZpbmFsbHk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAoISggcHlfaW50ID0gUHlJbnRfRnJvbUxvbmcobCkpKSAgZ290byBmaW5hbGx5OworICAgICAgICB9CisgICAgfQogCi0JZnJlZShzKTsKLQlQREFUQV9QVVNIKHNlbGYtPnN0YWNrLCBweV9pbnQsIC0xKTsKLQlyZXR1cm4gMDsKKyAgICBmcmVlKHMpOworICAgIFBEQVRBX1BVU0goc2VsZi0+c3RhY2ssIHB5X2ludCwgLTEpOworICAgIHJldHVybiAwOwogCiAgIGZpbmFsbHk6Ci0JZnJlZShzKTsKKyAgICBmcmVlKHMpOwogCi0JcmV0dXJuIHJlczsKKyAgICByZXR1cm4gcmVzOwogfQogCiBzdGF0aWMgaW50CiBsb2FkX2Jvb2woVW5waWNrbGVyb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYm9vbGVhbikKIHsKLQlhc3NlcnQoYm9vbGVhbiA9PSBQeV9UcnVlIHx8IGJvb2xlYW4gPT0gUHlfRmFsc2UpOwotCVBEQVRBX0FQUEVORChzZWxmLT5zdGFjaywgYm9vbGVhbiwgLTEpOwotCXJldHVybiAwOworICAgIGFzc2VydChib29sZWFuID09IFB5X1RydWUgfHwgYm9vbGVhbiA9PSBQeV9GYWxzZSk7CisgICAgUERBVEFfQVBQRU5EKHNlbGYtPnN0YWNrLCBib29sZWFuLCAtMSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIC8qIHMgY29udGFpbnMgeCBieXRlcyBvZiBhIGxpdHRsZS1lbmRpYW4gaW50ZWdlci4gIFJldHVybiBpdHMgdmFsdWUgYXMgYQpAQCAtMzMyMSw5OSArMzMyMSw5OSBAQAogc3RhdGljIGxvbmcKIGNhbGNfYmluaW50KGNoYXIgKnMsIGludCB4KQogewotCXVuc2lnbmVkIGNoYXIgYzsKLQlpbnQgaTsKLQlsb25nIGw7CisgICAgdW5zaWduZWQgY2hhciBjOworICAgIGludCBpOworICAgIGxvbmcgbDsKIAotCWZvciAoaSA9IDAsIGwgPSAwTDsgaSA8IHg7IGkrKykgewotCQljID0gKHVuc2lnbmVkIGNoYXIpc1tpXTsKLQkJbCB8PSAobG9uZyljIDw8IChpICogOCk7Ci0JfQorICAgIGZvciAoaSA9IDAsIGwgPSAwTDsgaSA8IHg7IGkrKykgeworICAgICAgICBjID0gKHVuc2lnbmVkIGNoYXIpc1tpXTsKKyAgICAgICAgbCB8PSAobG9uZyljIDw8IChpICogOCk7CisgICAgfQogI2lmIFNJWkVPRl9MT05HID4gNAotCS8qIFVubGlrZSBCSU5JTlQxIGFuZCBCSU5JTlQyLCBCSU5JTlQgKG1vcmUgYWNjdXJhdGVseSBCSU5JTlQ0KQotCSAqIGlzIHNpZ25lZCwgc28gb24gYSBib3ggd2l0aCBsb25ncyBiaWdnZXIgdGhhbiA0IGJ5dGVzIHdlIG5lZWQKLQkgKiB0byBleHRlbmQgYSBCSU5JTlQncyBzaWduIGJpdCB0byB0aGUgZnVsbCB3aWR0aC4KLQkgKi8KLQlpZiAoeCA9PSA0ICYmIGwgJiAoMUwgPDwgMzEpKQotCQlsIHw9ICh+MEwpIDw8IDMyOworICAgIC8qIFVubGlrZSBCSU5JTlQxIGFuZCBCSU5JTlQyLCBCSU5JTlQgKG1vcmUgYWNjdXJhdGVseSBCSU5JTlQ0KQorICAgICAqIGlzIHNpZ25lZCwgc28gb24gYSBib3ggd2l0aCBsb25ncyBiaWdnZXIgdGhhbiA0IGJ5dGVzIHdlIG5lZWQKKyAgICAgKiB0byBleHRlbmQgYSBCSU5JTlQncyBzaWduIGJpdCB0byB0aGUgZnVsbCB3aWR0aC4KKyAgICAgKi8KKyAgICBpZiAoeCA9PSA0ICYmIGwgJiAoMUwgPDwgMzEpKQorICAgICAgICBsIHw9ICh+MEwpIDw8IDMyOwogI2VuZGlmCi0JcmV0dXJuIGw7CisgICAgcmV0dXJuIGw7CiB9CiAKIAogc3RhdGljIGludAogbG9hZF9iaW5pbnR4KFVucGlja2xlcm9iamVjdCAqc2VsZiwgY2hhciAqcywgaW50ICB4KQogewotCVB5T2JqZWN0ICpweV9pbnQgPSAwOwotCWxvbmcgbDsKKyAgICBQeU9iamVjdCAqcHlfaW50ID0gMDsKKyAgICBsb25nIGw7CiAKLQlsID0gY2FsY19iaW5pbnQocywgeCk7CisgICAgbCA9IGNhbGNfYmluaW50KHMsIHgpOwogCi0JaWYgKCEoIHB5X2ludCA9IFB5SW50X0Zyb21Mb25nKGwpKSkKLQkJcmV0dXJuIC0xOworICAgIGlmICghKCBweV9pbnQgPSBQeUludF9Gcm9tTG9uZyhsKSkpCisgICAgICAgIHJldHVybiAtMTsKIAotCVBEQVRBX1BVU0goc2VsZi0+c3RhY2ssIHB5X2ludCwgLTEpOwotCXJldHVybiAwOworICAgIFBEQVRBX1BVU0goc2VsZi0+c3RhY2ssIHB5X2ludCwgLTEpOworICAgIHJldHVybiAwOwogfQogCiAKIHN0YXRpYyBpbnQKIGxvYWRfYmluaW50KFVucGlja2xlcm9iamVjdCAqc2VsZikKIHsKLQljaGFyICpzOworICAgIGNoYXIgKnM7CiAKLQlpZiAoc2VsZi0+cmVhZF9mdW5jKHNlbGYsICZzLCA0KSA8IDApCi0JCXJldHVybiAtMTsKKyAgICBpZiAoc2VsZi0+cmVhZF9mdW5jKHNlbGYsICZzLCA0KSA8IDApCisgICAgICAgIHJldHVybiAtMTsKIAotCXJldHVybiBsb2FkX2JpbmludHgoc2VsZiwgcywgNCk7CisgICAgcmV0dXJuIGxvYWRfYmluaW50eChzZWxmLCBzLCA0KTsKIH0KIAogCiBzdGF0aWMgaW50CiBsb2FkX2JpbmludDEoVW5waWNrbGVyb2JqZWN0ICpzZWxmKQogewotCWNoYXIgKnM7CisgICAgY2hhciAqczsKIAotCWlmIChzZWxmLT5yZWFkX2Z1bmMoc2VsZiwgJnMsIDEpIDwgMCkKLQkJcmV0dXJuIC0xOworICAgIGlmIChzZWxmLT5yZWFkX2Z1bmMoc2VsZiwgJnMsIDEpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0JcmV0dXJuIGxvYWRfYmluaW50eChzZWxmLCBzLCAxKTsKKyAgICByZXR1cm4gbG9hZF9iaW5pbnR4KHNlbGYsIHMsIDEpOwogfQogCiAKIHN0YXRpYyBpbnQKIGxvYWRfYmluaW50MihVbnBpY2tsZXJvYmplY3QgKnNlbGYpCiB7Ci0JY2hhciAqczsKKyAgICBjaGFyICpzOwogCi0JaWYgKHNlbGYtPnJlYWRfZnVuYyhzZWxmLCAmcywgMikgPCAwKQotCQlyZXR1cm4gLTE7CisgICAgaWYgKHNlbGYtPnJlYWRfZnVuYyhzZWxmLCAmcywgMikgPCAwKQorICAgICAgICByZXR1cm4gLTE7CiAKLQlyZXR1cm4gbG9hZF9iaW5pbnR4KHNlbGYsIHMsIDIpOworICAgIHJldHVybiBsb2FkX2JpbmludHgoc2VsZiwgcywgMik7CiB9CiAKIHN0YXRpYyBpbnQKIGxvYWRfbG9uZyhVbnBpY2tsZXJvYmplY3QgKnNlbGYpCiB7Ci0JUHlPYmplY3QgKmwgPSAwOwotCWNoYXIgKmVuZCwgKnM7Ci0JaW50IGxlbiwgcmVzID0gLTE7CisgICAgUHlPYmplY3QgKmwgPSAwOworICAgIGNoYXIgKmVuZCwgKnM7CisgICAgaW50IGxlbiwgcmVzID0gLTE7CiAKLQlpZiAoKGxlbiA9IHNlbGYtPnJlYWRsaW5lX2Z1bmMoc2VsZiwgJnMpKSA8IDApIHJldHVybiAtMTsKLQlpZiAobGVuIDwgMikgcmV0dXJuIGJhZF9yZWFkbGluZSgpOwotCWlmICghKCBzPXB5c3RybmR1cChzLGxlbikpKSAgcmV0dXJuIC0xOworICAgIGlmICgobGVuID0gc2VsZi0+cmVhZGxpbmVfZnVuYyhzZWxmLCAmcykpIDwgMCkgcmV0dXJuIC0xOworICAgIGlmIChsZW4gPCAyKSByZXR1cm4gYmFkX3JlYWRsaW5lKCk7CisgICAgaWYgKCEoIHM9cHlzdHJuZHVwKHMsbGVuKSkpICByZXR1cm4gLTE7CiAKLQlpZiAoISggbCA9IFB5TG9uZ19Gcm9tU3RyaW5nKHMsICZlbmQsIDApKSkKLQkJZ290byBmaW5hbGx5OworICAgIGlmICghKCBsID0gUHlMb25nX0Zyb21TdHJpbmcocywgJmVuZCwgMCkpKQorICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQlmcmVlKHMpOwotCVBEQVRBX1BVU0goc2VsZi0+c3RhY2ssIGwsIC0xKTsKLQlyZXR1cm4gMDsKKyAgICBmcmVlKHMpOworICAgIFBEQVRBX1BVU0goc2VsZi0+c3RhY2ssIGwsIC0xKTsKKyAgICByZXR1cm4gMDsKIAogICBmaW5hbGx5OgotCWZyZWUocyk7CisgICAgZnJlZShzKTsKIAotCXJldHVybiByZXM7CisgICAgcmV0dXJuIHJlczsKIH0KIAogLyogJ3NpemUnIGJ5dGVzIGNvbnRhaW4gdGhlICMgb2YgYnl0ZXMgb2YgbGl0dGxlLWVuZGlhbiAyNTYncy1jb21wbGVtZW50CkBAIC0zNDIyLDE4NyArMzQyMiwxODcgQEAKIHN0YXRpYyBpbnQKIGxvYWRfY291bnRlZF9sb25nKFVucGlja2xlcm9iamVjdCAqc2VsZiwgaW50IHNpemUpCiB7Ci0JUHlfc3NpemVfdCBpOwotCWNoYXIgKm5ieXRlczsKLQl1bnNpZ25lZCBjaGFyICpwZGF0YTsKLQlQeU9iamVjdCAqYWxvbmc7CisgICAgUHlfc3NpemVfdCBpOworICAgIGNoYXIgKm5ieXRlczsKKyAgICB1bnNpZ25lZCBjaGFyICpwZGF0YTsKKyAgICBQeU9iamVjdCAqYWxvbmc7CiAKLQlhc3NlcnQoc2l6ZSA9PSAxIHx8IHNpemUgPT0gNCk7Ci0JaSA9IHNlbGYtPnJlYWRfZnVuYyhzZWxmLCAmbmJ5dGVzLCBzaXplKTsKLQlpZiAoaSA8IDApIHJldHVybiAtMTsKKyAgICBhc3NlcnQoc2l6ZSA9PSAxIHx8IHNpemUgPT0gNCk7CisgICAgaSA9IHNlbGYtPnJlYWRfZnVuYyhzZWxmLCAmbmJ5dGVzLCBzaXplKTsKKyAgICBpZiAoaSA8IDApIHJldHVybiAtMTsKIAotCXNpemUgPSBjYWxjX2JpbmludChuYnl0ZXMsIHNpemUpOwotCWlmIChzaXplIDwgMCkgewotCQkvKiBDb3JydXB0IG9yIGhvc3RpbGUgcGlja2xlIC0tIHdlIG5ldmVyIHdyaXRlIG9uZSBsaWtlCi0JCSAqIHRoaXMuCi0JCSAqLwotCQlQeUVycl9TZXRTdHJpbmcoVW5waWNrbGluZ0Vycm9yLCAiTE9ORyBwaWNrbGUgaGFzIG5lZ2F0aXZlICIKLQkJCQkiYnl0ZSBjb3VudCIpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIHNpemUgPSBjYWxjX2JpbmludChuYnl0ZXMsIHNpemUpOworICAgIGlmIChzaXplIDwgMCkgeworICAgICAgICAvKiBDb3JydXB0IG9yIGhvc3RpbGUgcGlja2xlIC0tIHdlIG5ldmVyIHdyaXRlIG9uZSBsaWtlCisgICAgICAgICAqIHRoaXMuCisgICAgICAgICAqLworICAgICAgICBQeUVycl9TZXRTdHJpbmcoVW5waWNrbGluZ0Vycm9yLCAiTE9ORyBwaWNrbGUgaGFzIG5lZ2F0aXZlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJieXRlIGNvdW50Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQlpZiAoc2l6ZSA9PSAwKQotCQlhbG9uZyA9IFB5TG9uZ19Gcm9tTG9uZygwTCk7Ci0JZWxzZSB7Ci0JCS8qIFJlYWQgdGhlIHJhdyBsaXR0bGUtZW5kaWFuIGJ5dGVzICYgY29udmVydC4gKi8KLQkJaSA9IHNlbGYtPnJlYWRfZnVuYyhzZWxmLCAoY2hhciAqKikmcGRhdGEsIHNpemUpOwotCQlpZiAoaSA8IDApIHJldHVybiAtMTsKLQkJYWxvbmcgPSBfUHlMb25nX0Zyb21CeXRlQXJyYXkocGRhdGEsIChzaXplX3Qpc2l6ZSwKLQkJCQkxIC8qIGxpdHRsZSBlbmRpYW4gKi8sIDEgLyogc2lnbmVkICovKTsKLQl9Ci0JaWYgKGFsb25nID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQlQREFUQV9QVVNIKHNlbGYtPnN0YWNrLCBhbG9uZywgLTEpOwotCXJldHVybiAwOworICAgIGlmIChzaXplID09IDApCisgICAgICAgIGFsb25nID0gUHlMb25nX0Zyb21Mb25nKDBMKTsKKyAgICBlbHNlIHsKKyAgICAgICAgLyogUmVhZCB0aGUgcmF3IGxpdHRsZS1lbmRpYW4gYnl0ZXMgJiBjb252ZXJ0LiAqLworICAgICAgICBpID0gc2VsZi0+cmVhZF9mdW5jKHNlbGYsIChjaGFyICoqKSZwZGF0YSwgc2l6ZSk7CisgICAgICAgIGlmIChpIDwgMCkgcmV0dXJuIC0xOworICAgICAgICBhbG9uZyA9IF9QeUxvbmdfRnJvbUJ5dGVBcnJheShwZGF0YSwgKHNpemVfdClzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgMSAvKiBsaXR0bGUgZW5kaWFuICovLCAxIC8qIHNpZ25lZCAqLyk7CisgICAgfQorICAgIGlmIChhbG9uZyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAgUERBVEFfUFVTSChzZWxmLT5zdGFjaywgYWxvbmcsIC0xKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogbG9hZF9mbG9hdChVbnBpY2tsZXJvYmplY3QgKnNlbGYpCiB7Ci0JUHlPYmplY3QgKnB5X2Zsb2F0ID0gMDsKLQljaGFyICplbmRwdHIsICpzOwotCWludCBsZW4sIHJlcyA9IC0xOwotCWRvdWJsZSBkOworICAgIFB5T2JqZWN0ICpweV9mbG9hdCA9IDA7CisgICAgY2hhciAqZW5kcHRyLCAqczsKKyAgICBpbnQgbGVuLCByZXMgPSAtMTsKKyAgICBkb3VibGUgZDsKIAotCWlmICgobGVuID0gc2VsZi0+cmVhZGxpbmVfZnVuYyhzZWxmLCAmcykpIDwgMCkgcmV0dXJuIC0xOwotCWlmIChsZW4gPCAyKSByZXR1cm4gYmFkX3JlYWRsaW5lKCk7Ci0JaWYgKCEoIHM9cHlzdHJuZHVwKHMsbGVuKSkpICByZXR1cm4gLTE7CisgICAgaWYgKChsZW4gPSBzZWxmLT5yZWFkbGluZV9mdW5jKHNlbGYsICZzKSkgPCAwKSByZXR1cm4gLTE7CisgICAgaWYgKGxlbiA8IDIpIHJldHVybiBiYWRfcmVhZGxpbmUoKTsKKyAgICBpZiAoISggcz1weXN0cm5kdXAocyxsZW4pKSkgIHJldHVybiAtMTsKIAotCWVycm5vID0gMDsKLQlkID0gUHlPU19hc2NpaV9zdHJ0b2QocywgJmVuZHB0cik7CisgICAgZXJybm8gPSAwOworICAgIGQgPSBQeU9TX2FzY2lpX3N0cnRvZChzLCAmZW5kcHRyKTsKIAotCWlmICgoZXJybm8gPT0gRVJBTkdFICYmICEoZmFicyhkKSA8PSAxLjApKSB8fAotCSAgICAoZW5kcHRyWzBdICE9ICdcbicpIHx8IChlbmRwdHJbMV0gIT0gJ1wwJykpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJImNvdWxkIG5vdCBjb252ZXJ0IHN0cmluZyB0byBmbG9hdCIpOwotCQlnb3RvIGZpbmFsbHk7Ci0JfQorICAgIGlmICgoZXJybm8gPT0gRVJBTkdFICYmICEoZmFicyhkKSA8PSAxLjApKSB8fAorICAgICAgICAoZW5kcHRyWzBdICE9ICdcbicpIHx8IChlbmRwdHJbMV0gIT0gJ1wwJykpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiY291bGQgbm90IGNvbnZlcnQgc3RyaW5nIHRvIGZsb2F0Iik7CisgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICB9CiAKLQlpZiAoISggcHlfZmxvYXQgPSBQeUZsb2F0X0Zyb21Eb3VibGUoZCkpKQotCQlnb3RvIGZpbmFsbHk7CisgICAgaWYgKCEoIHB5X2Zsb2F0ID0gUHlGbG9hdF9Gcm9tRG91YmxlKGQpKSkKKyAgICAgICAgZ290byBmaW5hbGx5OwogCi0JZnJlZShzKTsKLQlQREFUQV9QVVNIKHNlbGYtPnN0YWNrLCBweV9mbG9hdCwgLTEpOwotCXJldHVybiAwOworICAgIGZyZWUocyk7CisgICAgUERBVEFfUFVTSChzZWxmLT5zdGFjaywgcHlfZmxvYXQsIC0xKTsKKyAgICByZXR1cm4gMDsKIAogICBmaW5hbGx5OgotCWZyZWUocyk7CisgICAgZnJlZShzKTsKIAotCXJldHVybiByZXM7CisgICAgcmV0dXJuIHJlczsKIH0KIAogc3RhdGljIGludAogbG9hZF9iaW5mbG9hdChVbnBpY2tsZXJvYmplY3QgKnNlbGYpCiB7Ci0JUHlPYmplY3QgKnB5X2Zsb2F0OwotCWRvdWJsZSB4OwotCWNoYXIgKnA7CisgICAgUHlPYmplY3QgKnB5X2Zsb2F0OworICAgIGRvdWJsZSB4OworICAgIGNoYXIgKnA7CiAKLQlpZiAoc2VsZi0+cmVhZF9mdW5jKHNlbGYsICZwLCA4KSA8IDApCi0JCXJldHVybiAtMTsKKyAgICBpZiAoc2VsZi0+cmVhZF9mdW5jKHNlbGYsICZwLCA4KSA8IDApCisgICAgICAgIHJldHVybiAtMTsKIAotCXggPSBfUHlGbG9hdF9VbnBhY2s4KCh1bnNpZ25lZCBjaGFyICopcCwgMCk7Ci0JaWYgKHggPT0gLTEuMCAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gLTE7CisgICAgeCA9IF9QeUZsb2F0X1VucGFjazgoKHVuc2lnbmVkIGNoYXIgKilwLCAwKTsKKyAgICBpZiAoeCA9PSAtMS4wICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiAtMTsKIAotCXB5X2Zsb2F0ID0gUHlGbG9hdF9Gcm9tRG91YmxlKHgpOwotCWlmIChweV9mbG9hdCA9PSBOVUxMKQotCQlyZXR1cm4gLTE7CisgICAgcHlfZmxvYXQgPSBQeUZsb2F0X0Zyb21Eb3VibGUoeCk7CisgICAgaWYgKHB5X2Zsb2F0ID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKIAotCVBEQVRBX1BVU0goc2VsZi0+c3RhY2ssIHB5X2Zsb2F0LCAtMSk7Ci0JcmV0dXJuIDA7CisgICAgUERBVEFfUFVTSChzZWxmLT5zdGFjaywgcHlfZmxvYXQsIC0xKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogbG9hZF9zdHJpbmcoVW5waWNrbGVyb2JqZWN0ICpzZWxmKQogewotCVB5T2JqZWN0ICpzdHIgPSAwOwotCWludCBsZW4sIHJlcyA9IC0xOwotCWNoYXIgKnMsICpwOworICAgIFB5T2JqZWN0ICpzdHIgPSAwOworICAgIGludCBsZW4sIHJlcyA9IC0xOworICAgIGNoYXIgKnMsICpwOwogCi0JaWYgKChsZW4gPSBzZWxmLT5yZWFkbGluZV9mdW5jKHNlbGYsICZzKSkgPCAwKSByZXR1cm4gLTE7Ci0JaWYgKGxlbiA8IDIpIHJldHVybiBiYWRfcmVhZGxpbmUoKTsKLQlpZiAoISggcz1weXN0cm5kdXAocyxsZW4pKSkgIHJldHVybiAtMTsKKyAgICBpZiAoKGxlbiA9IHNlbGYtPnJlYWRsaW5lX2Z1bmMoc2VsZiwgJnMpKSA8IDApIHJldHVybiAtMTsKKyAgICBpZiAobGVuIDwgMikgcmV0dXJuIGJhZF9yZWFkbGluZSgpOworICAgIGlmICghKCBzPXB5c3RybmR1cChzLGxlbikpKSAgcmV0dXJuIC0xOwogCiAKLQkvKiBTdHJpcCBvdXRlcm1vc3QgcXVvdGVzICovCi0Jd2hpbGUgKHNbbGVuLTFdIDw9ICcgJykKLQkJbGVuLS07Ci0JaWYoc1swXT09JyInICYmIHNbbGVuLTFdPT0nIicpewotCQlzW2xlbi0xXSA9ICdcMCc7Ci0JCXAgPSBzICsgMSA7Ci0JCWxlbiAtPSAyOwotCX0gZWxzZSBpZihzWzBdPT0nXCcnICYmIHNbbGVuLTFdPT0nXCcnKXsKLQkJc1tsZW4tMV0gPSAnXDAnOwotCQlwID0gcyArIDEgOwotCQlsZW4gLT0gMjsKLQl9IGVsc2UKLQkJZ290byBpbnNlY3VyZTsKLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogU3RyaXAgb3V0ZXJtb3N0IHF1b3RlcyAqLworICAgIHdoaWxlIChzW2xlbi0xXSA8PSAnICcpCisgICAgICAgIGxlbi0tOworICAgIGlmKHNbMF09PSciJyAmJiBzW2xlbi0xXT09JyInKXsKKyAgICAgICAgc1tsZW4tMV0gPSAnXDAnOworICAgICAgICBwID0gcyArIDEgOworICAgICAgICBsZW4gLT0gMjsKKyAgICB9IGVsc2UgaWYoc1swXT09J1wnJyAmJiBzW2xlbi0xXT09J1wnJyl7CisgICAgICAgIHNbbGVuLTFdID0gJ1wwJzsKKyAgICAgICAgcCA9IHMgKyAxIDsKKyAgICAgICAgbGVuIC09IDI7CisgICAgfSBlbHNlCisgICAgICAgIGdvdG8gaW5zZWN1cmU7CisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0Jc3RyID0gUHlTdHJpbmdfRGVjb2RlRXNjYXBlKHAsIGxlbiwgTlVMTCwgMCwgTlVMTCk7Ci0JZnJlZShzKTsKLQlpZiAoc3RyKSB7Ci0JCVBEQVRBX1BVU0goc2VsZi0+c3RhY2ssIHN0ciwgLTEpOwotCQlyZXMgPSAwOwotCX0KLQlyZXR1cm4gcmVzOworICAgIHN0ciA9IFB5U3RyaW5nX0RlY29kZUVzY2FwZShwLCBsZW4sIE5VTEwsIDAsIE5VTEwpOworICAgIGZyZWUocyk7CisgICAgaWYgKHN0cikgeworICAgICAgICBQREFUQV9QVVNIKHNlbGYtPnN0YWNrLCBzdHIsIC0xKTsKKyAgICAgICAgcmVzID0gMDsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKIAogICBpbnNlY3VyZToKLQlmcmVlKHMpOwotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCJpbnNlY3VyZSBzdHJpbmcgcGlja2xlIik7Ci0JcmV0dXJuIC0xOworICAgIGZyZWUocyk7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsImluc2VjdXJlIHN0cmluZyBwaWNrbGUiKTsKKyAgICByZXR1cm4gLTE7CiB9CiAKIAogc3RhdGljIGludAogbG9hZF9iaW5zdHJpbmcoVW5waWNrbGVyb2JqZWN0ICpzZWxmKQogewotCVB5T2JqZWN0ICpweV9zdHJpbmcgPSAwOwotCWxvbmcgbDsKLQljaGFyICpzOworICAgIFB5T2JqZWN0ICpweV9zdHJpbmcgPSAwOworICAgIGxvbmcgbDsKKyAgICBjaGFyICpzOwogCi0JaWYgKHNlbGYtPnJlYWRfZnVuYyhzZWxmLCAmcywgNCkgPCAwKSByZXR1cm4gLTE7CisgICAgaWYgKHNlbGYtPnJlYWRfZnVuYyhzZWxmLCAmcywgNCkgPCAwKSByZXR1cm4gLTE7CiAKLQlsID0gY2FsY19iaW5pbnQocywgNCk7Ci0JaWYgKGwgPCAwKSB7Ci0JCS8qIENvcnJ1cHQgb3IgaG9zdGlsZSBwaWNrbGUgLS0gd2UgbmV2ZXIgd3JpdGUgb25lIGxpa2UKLQkJICogdGhpcy4KLQkJICovCi0JCVB5RXJyX1NldFN0cmluZyhVbnBpY2tsaW5nRXJyb3IsCi0JCQkJIkJJTlNUUklORyBwaWNrbGUgaGFzIG5lZ2F0aXZlIGJ5dGUgY291bnQiKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICBsID0gY2FsY19iaW5pbnQocywgNCk7CisgICAgaWYgKGwgPCAwKSB7CisgICAgICAgIC8qIENvcnJ1cHQgb3IgaG9zdGlsZSBwaWNrbGUgLS0gd2UgbmV2ZXIgd3JpdGUgb25lIGxpa2UKKyAgICAgICAgICogdGhpcy4KKyAgICAgICAgICovCisgICAgICAgIFB5RXJyX1NldFN0cmluZyhVbnBpY2tsaW5nRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiQklOU1RSSU5HIHBpY2tsZSBoYXMgbmVnYXRpdmUgYnl0ZSBjb3VudCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JaWYgKHNlbGYtPnJlYWRfZnVuYyhzZWxmLCAmcywgbCkgPCAwKQotCQlyZXR1cm4gLTE7CisgICAgaWYgKHNlbGYtPnJlYWRfZnVuYyhzZWxmLCAmcywgbCkgPCAwKQorICAgICAgICByZXR1cm4gLTE7CiAKLQlpZiAoISggcHlfc3RyaW5nID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocywgbCkpKQotCQlyZXR1cm4gLTE7CisgICAgaWYgKCEoIHB5X3N0cmluZyA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHMsIGwpKSkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0JUERBVEFfUFVTSChzZWxmLT5zdGFjaywgcHlfc3RyaW5nLCAtMSk7Ci0JcmV0dXJuIDA7CisgICAgUERBVEFfUFVTSChzZWxmLT5zdGFjaywgcHlfc3RyaW5nLCAtMSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIAogc3RhdGljIGludAogbG9hZF9zaG9ydF9iaW5zdHJpbmcoVW5waWNrbGVyb2JqZWN0ICpzZWxmKQogewotCVB5T2JqZWN0ICpweV9zdHJpbmcgPSAwOwotCXVuc2lnbmVkIGNoYXIgbDsKLQljaGFyICpzOworICAgIFB5T2JqZWN0ICpweV9zdHJpbmcgPSAwOworICAgIHVuc2lnbmVkIGNoYXIgbDsKKyAgICBjaGFyICpzOwogCi0JaWYgKHNlbGYtPnJlYWRfZnVuYyhzZWxmLCAmcywgMSkgPCAwKQotCQlyZXR1cm4gLTE7CisgICAgaWYgKHNlbGYtPnJlYWRfZnVuYyhzZWxmLCAmcywgMSkgPCAwKQorICAgICAgICByZXR1cm4gLTE7CiAKLQlsID0gKHVuc2lnbmVkIGNoYXIpc1swXTsKKyAgICBsID0gKHVuc2lnbmVkIGNoYXIpc1swXTsKIAotCWlmIChzZWxmLT5yZWFkX2Z1bmMoc2VsZiwgJnMsIGwpIDwgMCkgcmV0dXJuIC0xOworICAgIGlmIChzZWxmLT5yZWFkX2Z1bmMoc2VsZiwgJnMsIGwpIDwgMCkgcmV0dXJuIC0xOwogCi0JaWYgKCEoIHB5X3N0cmluZyA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHMsIGwpKSkgIHJldHVybiAtMTsKKyAgICBpZiAoISggcHlfc3RyaW5nID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocywgbCkpKSAgcmV0dXJuIC0xOwogCi0JUERBVEFfUFVTSChzZWxmLT5zdGFjaywgcHlfc3RyaW5nLCAtMSk7Ci0JcmV0dXJuIDA7CisgICAgUERBVEFfUFVTSChzZWxmLT5zdGFjaywgcHlfc3RyaW5nLCAtMSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIApAQCAtMzYxMCwyMSArMzYxMCwyMSBAQAogc3RhdGljIGludAogbG9hZF91bmljb2RlKFVucGlja2xlcm9iamVjdCAqc2VsZikKIHsKLQlQeU9iamVjdCAqc3RyID0gMDsKLQlpbnQgbGVuLCByZXMgPSAtMTsKLQljaGFyICpzOworICAgIFB5T2JqZWN0ICpzdHIgPSAwOworICAgIGludCBsZW4sIHJlcyA9IC0xOworICAgIGNoYXIgKnM7CiAKLQlpZiAoKGxlbiA9IHNlbGYtPnJlYWRsaW5lX2Z1bmMoc2VsZiwgJnMpKSA8IDApIHJldHVybiAtMTsKLQlpZiAobGVuIDwgMSkgcmV0dXJuIGJhZF9yZWFkbGluZSgpOworICAgIGlmICgobGVuID0gc2VsZi0+cmVhZGxpbmVfZnVuYyhzZWxmLCAmcykpIDwgMCkgcmV0dXJuIC0xOworICAgIGlmIChsZW4gPCAxKSByZXR1cm4gYmFkX3JlYWRsaW5lKCk7CiAKLQlpZiAoISggc3RyID0gUHlVbmljb2RlX0RlY29kZVJhd1VuaWNvZGVFc2NhcGUocywgbGVuIC0gMSwgTlVMTCkpKQotCQlnb3RvIGZpbmFsbHk7CisgICAgaWYgKCEoIHN0ciA9IFB5VW5pY29kZV9EZWNvZGVSYXdVbmljb2RlRXNjYXBlKHMsIGxlbiAtIDEsIE5VTEwpKSkKKyAgICAgICAgZ290byBmaW5hbGx5OwogCi0JUERBVEFfUFVTSChzZWxmLT5zdGFjaywgc3RyLCAtMSk7Ci0JcmV0dXJuIDA7CisgICAgUERBVEFfUFVTSChzZWxmLT5zdGFjaywgc3RyLCAtMSk7CisgICAgcmV0dXJuIDA7CiAKICAgZmluYWxseToKLQlyZXR1cm4gcmVzOworICAgIHJldHVybiByZXM7CiB9CiAjZW5kaWYKIApAQCAtMzYzMywzMCArMzYzMywzMCBAQAogc3RhdGljIGludAogbG9hZF9iaW51bmljb2RlKFVucGlja2xlcm9iamVjdCAqc2VsZikKIHsKLQlQeU9iamVjdCAqdW5pY29kZTsKLQlsb25nIGw7Ci0JY2hhciAqczsKKyAgICBQeU9iamVjdCAqdW5pY29kZTsKKyAgICBsb25nIGw7CisgICAgY2hhciAqczsKIAotCWlmIChzZWxmLT5yZWFkX2Z1bmMoc2VsZiwgJnMsIDQpIDwgMCkgcmV0dXJuIC0xOworICAgIGlmIChzZWxmLT5yZWFkX2Z1bmMoc2VsZiwgJnMsIDQpIDwgMCkgcmV0dXJuIC0xOwogCi0JbCA9IGNhbGNfYmluaW50KHMsIDQpOwotCWlmIChsIDwgMCkgewotCQkvKiBDb3JydXB0IG9yIGhvc3RpbGUgcGlja2xlIC0tIHdlIG5ldmVyIHdyaXRlIG9uZSBsaWtlCi0JCSAqIHRoaXMuCi0JCSAqLwotCQlQeUVycl9TZXRTdHJpbmcoVW5waWNrbGluZ0Vycm9yLAotCQkJCSJCSU5VTklDT0RFIHBpY2tsZSBoYXMgbmVnYXRpdmUgYnl0ZSBjb3VudCIpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIGwgPSBjYWxjX2JpbmludChzLCA0KTsKKyAgICBpZiAobCA8IDApIHsKKyAgICAgICAgLyogQ29ycnVwdCBvciBob3N0aWxlIHBpY2tsZSAtLSB3ZSBuZXZlciB3cml0ZSBvbmUgbGlrZQorICAgICAgICAgKiB0aGlzLgorICAgICAgICAgKi8KKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFVucGlja2xpbmdFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJCSU5VTklDT0RFIHBpY2tsZSBoYXMgbmVnYXRpdmUgYnl0ZSBjb3VudCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JaWYgKHNlbGYtPnJlYWRfZnVuYyhzZWxmLCAmcywgbCkgPCAwKQotCQlyZXR1cm4gLTE7CisgICAgaWYgKHNlbGYtPnJlYWRfZnVuYyhzZWxmLCAmcywgbCkgPCAwKQorICAgICAgICByZXR1cm4gLTE7CiAKLQlpZiAoISggdW5pY29kZSA9IFB5VW5pY29kZV9EZWNvZGVVVEY4KHMsIGwsIE5VTEwpKSkKLQkJcmV0dXJuIC0xOworICAgIGlmICghKCB1bmljb2RlID0gUHlVbmljb2RlX0RlY29kZVVURjgocywgbCwgTlVMTCkpKQorICAgICAgICByZXR1cm4gLTE7CiAKLQlQREFUQV9QVVNIKHNlbGYtPnN0YWNrLCB1bmljb2RlLCAtMSk7Ci0JcmV0dXJuIDA7CisgICAgUERBVEFfUFVTSChzZWxmLT5zdGFjaywgdW5pY29kZSwgLTEpOworICAgIHJldHVybiAwOwogfQogI2VuZGlmCiAKQEAgLTM2NjQsNTA0ICszNjY0LDUwNCBAQAogc3RhdGljIGludAogbG9hZF90dXBsZShVbnBpY2tsZXJvYmplY3QgKnNlbGYpCiB7Ci0JUHlPYmplY3QgKnR1cDsKLQlpbnQgaTsKKyAgICBQeU9iamVjdCAqdHVwOworICAgIGludCBpOwogCi0JaWYgKChpID0gbWFya2VyKHNlbGYpKSA8IDApIHJldHVybiAtMTsKLQlpZiAoISggdHVwPVBkYXRhX3BvcFR1cGxlKHNlbGYtPnN0YWNrLCBpKSkpICByZXR1cm4gLTE7Ci0JUERBVEFfUFVTSChzZWxmLT5zdGFjaywgdHVwLCAtMSk7Ci0JcmV0dXJuIDA7CisgICAgaWYgKChpID0gbWFya2VyKHNlbGYpKSA8IDApIHJldHVybiAtMTsKKyAgICBpZiAoISggdHVwPVBkYXRhX3BvcFR1cGxlKHNlbGYtPnN0YWNrLCBpKSkpICByZXR1cm4gLTE7CisgICAgUERBVEFfUFVTSChzZWxmLT5zdGFjaywgdHVwLCAtMSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIGxvYWRfY291bnRlZF90dXBsZShVbnBpY2tsZXJvYmplY3QgKnNlbGYsIGludCBsZW4pCiB7Ci0JUHlPYmplY3QgKnR1cCA9IFB5VHVwbGVfTmV3KGxlbik7CisgICAgUHlPYmplY3QgKnR1cCA9IFB5VHVwbGVfTmV3KGxlbik7CiAKLQlpZiAodHVwID09IE5VTEwpCi0JCXJldHVybiAtMTsKKyAgICBpZiAodHVwID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKIAotCXdoaWxlICgtLWxlbiA+PSAwKSB7Ci0JCVB5T2JqZWN0ICplbGVtZW50OworICAgIHdoaWxlICgtLWxlbiA+PSAwKSB7CisgICAgICAgIFB5T2JqZWN0ICplbGVtZW50OwogCi0JCVBEQVRBX1BPUChzZWxmLT5zdGFjaywgZWxlbWVudCk7Ci0JCWlmIChlbGVtZW50ID09IE5VTEwpCi0JCQlyZXR1cm4gLTE7Ci0JCVB5VHVwbGVfU0VUX0lURU0odHVwLCBsZW4sIGVsZW1lbnQpOwotCX0KLQlQREFUQV9QVVNIKHNlbGYtPnN0YWNrLCB0dXAsIC0xKTsKLQlyZXR1cm4gMDsKKyAgICAgICAgUERBVEFfUE9QKHNlbGYtPnN0YWNrLCBlbGVtZW50KTsKKyAgICAgICAgaWYgKGVsZW1lbnQgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgUHlUdXBsZV9TRVRfSVRFTSh0dXAsIGxlbiwgZWxlbWVudCk7CisgICAgfQorICAgIFBEQVRBX1BVU0goc2VsZi0+c3RhY2ssIHR1cCwgLTEpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBsb2FkX2VtcHR5X2xpc3QoVW5waWNrbGVyb2JqZWN0ICpzZWxmKQogewotCVB5T2JqZWN0ICpsaXN0OworICAgIFB5T2JqZWN0ICpsaXN0OwogCi0JaWYgKCEoIGxpc3Q9UHlMaXN0X05ldygwKSkpICByZXR1cm4gLTE7Ci0JUERBVEFfUFVTSChzZWxmLT5zdGFjaywgbGlzdCwgLTEpOwotCXJldHVybiAwOworICAgIGlmICghKCBsaXN0PVB5TGlzdF9OZXcoMCkpKSAgcmV0dXJuIC0xOworICAgIFBEQVRBX1BVU0goc2VsZi0+c3RhY2ssIGxpc3QsIC0xKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogbG9hZF9lbXB0eV9kaWN0KFVucGlja2xlcm9iamVjdCAqc2VsZikKIHsKLQlQeU9iamVjdCAqZGljdDsKKyAgICBQeU9iamVjdCAqZGljdDsKIAotCWlmICghKCBkaWN0PVB5RGljdF9OZXcoKSkpICByZXR1cm4gLTE7Ci0JUERBVEFfUFVTSChzZWxmLT5zdGFjaywgZGljdCwgLTEpOwotCXJldHVybiAwOworICAgIGlmICghKCBkaWN0PVB5RGljdF9OZXcoKSkpICByZXR1cm4gLTE7CisgICAgUERBVEFfUFVTSChzZWxmLT5zdGFjaywgZGljdCwgLTEpOworICAgIHJldHVybiAwOwogfQogCiAKIHN0YXRpYyBpbnQKIGxvYWRfbGlzdChVbnBpY2tsZXJvYmplY3QgKnNlbGYpCiB7Ci0JUHlPYmplY3QgKmxpc3QgPSAwOwotCWludCBpOworICAgIFB5T2JqZWN0ICpsaXN0ID0gMDsKKyAgICBpbnQgaTsKIAotCWlmICgoaSA9IG1hcmtlcihzZWxmKSkgPCAwKSByZXR1cm4gLTE7Ci0JaWYgKCEoIGxpc3Q9UGRhdGFfcG9wTGlzdChzZWxmLT5zdGFjaywgaSkpKSAgcmV0dXJuIC0xOwotCVBEQVRBX1BVU0goc2VsZi0+c3RhY2ssIGxpc3QsIC0xKTsKLQlyZXR1cm4gMDsKKyAgICBpZiAoKGkgPSBtYXJrZXIoc2VsZikpIDwgMCkgcmV0dXJuIC0xOworICAgIGlmICghKCBsaXN0PVBkYXRhX3BvcExpc3Qoc2VsZi0+c3RhY2ssIGkpKSkgIHJldHVybiAtMTsKKyAgICBQREFUQV9QVVNIKHNlbGYtPnN0YWNrLCBsaXN0LCAtMSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIGxvYWRfZGljdChVbnBpY2tsZXJvYmplY3QgKnNlbGYpCiB7Ci0JUHlPYmplY3QgKmRpY3QsICprZXksICp2YWx1ZTsKLQlpbnQgaSwgaiwgazsKKyAgICBQeU9iamVjdCAqZGljdCwgKmtleSwgKnZhbHVlOworICAgIGludCBpLCBqLCBrOwogCi0JaWYgKChpID0gbWFya2VyKHNlbGYpKSA8IDApIHJldHVybiAtMTsKLQlqPXNlbGYtPnN0YWNrLT5sZW5ndGg7CisgICAgaWYgKChpID0gbWFya2VyKHNlbGYpKSA8IDApIHJldHVybiAtMTsKKyAgICBqPXNlbGYtPnN0YWNrLT5sZW5ndGg7CiAKLQlpZiAoISggZGljdCA9IFB5RGljdF9OZXcoKSkpICByZXR1cm4gLTE7CisgICAgaWYgKCEoIGRpY3QgPSBQeURpY3RfTmV3KCkpKSAgcmV0dXJuIC0xOwogCi0JZm9yIChrID0gaSsxOyBrIDwgajsgayArPSAyKSB7Ci0JCWtleSAgPXNlbGYtPnN0YWNrLT5kYXRhW2stMV07Ci0JCXZhbHVlPXNlbGYtPnN0YWNrLT5kYXRhW2sgIF07Ci0JCWlmIChQeURpY3RfU2V0SXRlbShkaWN0LCBrZXksIHZhbHVlKSA8IDApIHsKLQkJCVB5X0RFQ1JFRihkaWN0KTsKLQkJCXJldHVybiAtMTsKLQkJfQotCX0KLQlQZGF0YV9jbGVhcihzZWxmLT5zdGFjaywgaSk7Ci0JUERBVEFfUFVTSChzZWxmLT5zdGFjaywgZGljdCwgLTEpOwotCXJldHVybiAwOworICAgIGZvciAoayA9IGkrMTsgayA8IGo7IGsgKz0gMikgeworICAgICAgICBrZXkgID1zZWxmLT5zdGFjay0+ZGF0YVtrLTFdOworICAgICAgICB2YWx1ZT1zZWxmLT5zdGFjay0+ZGF0YVtrICBdOworICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW0oZGljdCwga2V5LCB2YWx1ZSkgPCAwKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoZGljdCk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisgICAgUGRhdGFfY2xlYXIoc2VsZi0+c3RhY2ssIGkpOworICAgIFBEQVRBX1BVU0goc2VsZi0+c3RhY2ssIGRpY3QsIC0xKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIEluc3RhbmNlX05ldyhQeU9iamVjdCAqY2xzLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqciA9IDA7CisgICAgUHlPYmplY3QgKnIgPSAwOwogCi0JaWYgKFB5Q2xhc3NfQ2hlY2soY2xzKSkgewotCQlpbnQgbDsKKyAgICBpZiAoUHlDbGFzc19DaGVjayhjbHMpKSB7CisgICAgICAgIGludCBsOwogCi0JCWlmICgobD1QeU9iamVjdF9TaXplKGFyZ3MpKSA8IDApIGdvdG8gZXJyOwotCQlpZiAoISggbCApKSAgewotCQkJUHlPYmplY3QgKl9fZ2V0aW5pdGFyZ3NfXzsKKyAgICAgICAgaWYgKChsPVB5T2JqZWN0X1NpemUoYXJncykpIDwgMCkgZ290byBlcnI7CisgICAgICAgIGlmICghKCBsICkpICB7CisgICAgICAgICAgICBQeU9iamVjdCAqX19nZXRpbml0YXJnc19fOwogCi0JCQlfX2dldGluaXRhcmdzX18gPSBQeU9iamVjdF9HZXRBdHRyKGNscywKLQkJCQkJCSAgIF9fZ2V0aW5pdGFyZ3NfX19zdHIpOwotCQkJaWYgKCFfX2dldGluaXRhcmdzX18pICB7Ci0JCQkJLyogV2UgaGF2ZSBhIGNsYXNzIHdpdGggbm8gX19nZXRpbml0YXJnc19fLAotCQkJCSAgIHNvIGJ5cGFzcyB1c3VhbCBjb25zdHJ1Y3Rpb24gICovCi0JCQkJUHlPYmplY3QgKmluc3Q7CisgICAgICAgICAgICBfX2dldGluaXRhcmdzX18gPSBQeU9iamVjdF9HZXRBdHRyKGNscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZ2V0aW5pdGFyZ3NfX19zdHIpOworICAgICAgICAgICAgaWYgKCFfX2dldGluaXRhcmdzX18pICB7CisgICAgICAgICAgICAgICAgLyogV2UgaGF2ZSBhIGNsYXNzIHdpdGggbm8gX19nZXRpbml0YXJnc19fLAorICAgICAgICAgICAgICAgICAgIHNvIGJ5cGFzcyB1c3VhbCBjb25zdHJ1Y3Rpb24gICovCisgICAgICAgICAgICAgICAgUHlPYmplY3QgKmluc3Q7CiAKLQkJCQlQeUVycl9DbGVhcigpOwotCQkJCWlmICghKCBpbnN0PVB5SW5zdGFuY2VfTmV3UmF3KGNscywgTlVMTCkpKQotCQkJCQlnb3RvIGVycjsKLQkJCQlyZXR1cm4gaW5zdDsKLQkJCX0KLQkJCVB5X0RFQ1JFRihfX2dldGluaXRhcmdzX18pOwotCQl9CisgICAgICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgICAgICBpZiAoISggaW5zdD1QeUluc3RhbmNlX05ld1JhdyhjbHMsIE5VTEwpKSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBlcnI7CisgICAgICAgICAgICAgICAgcmV0dXJuIGluc3Q7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQeV9ERUNSRUYoX19nZXRpbml0YXJnc19fKTsKKyAgICAgICAgfQogCi0JCWlmICgocj1QeUluc3RhbmNlX05ldyhjbHMsIGFyZ3MsIE5VTEwpKSkgcmV0dXJuIHI7Ci0JCWVsc2UgZ290byBlcnI7Ci0JfQorICAgICAgICBpZiAoKHI9UHlJbnN0YW5jZV9OZXcoY2xzLCBhcmdzLCBOVUxMKSkpIHJldHVybiByOworICAgICAgICBlbHNlIGdvdG8gZXJyOworICAgIH0KIAotCWlmICgocj1QeU9iamVjdF9DYWxsT2JqZWN0KGNscywgYXJncykpKSByZXR1cm4gcjsKKyAgICBpZiAoKHI9UHlPYmplY3RfQ2FsbE9iamVjdChjbHMsIGFyZ3MpKSkgcmV0dXJuIHI7CiAKICAgZXJyOgotCXsKLQkJUHlPYmplY3QgKnRwLCAqdiwgKnRiLCAqdG1wX3ZhbHVlOworICAgIHsKKyAgICAgICAgUHlPYmplY3QgKnRwLCAqdiwgKnRiLCAqdG1wX3ZhbHVlOwogCi0JCVB5RXJyX0ZldGNoKCZ0cCwgJnYsICZ0Yik7Ci0JCXRtcF92YWx1ZSA9IHY7Ci0JCS8qIE5VTEwgb2NjdXJzIHdoZW4gdGhlcmUgd2FzIGEgS2V5Ym9hcmRJbnRlcnJ1cHQgKi8KLQkJaWYgKHRtcF92YWx1ZSA9PSBOVUxMKQotCQkJdG1wX3ZhbHVlID0gUHlfTm9uZTsKLQkJaWYgKChyID0gUHlUdXBsZV9QYWNrKDMsIHRtcF92YWx1ZSwgY2xzLCBhcmdzKSkpIHsKLQkJCVB5X1hERUNSRUYodik7Ci0JCQl2PXI7Ci0JCX0KLQkJUHlFcnJfUmVzdG9yZSh0cCx2LHRiKTsKLQl9Ci0JcmV0dXJuIE5VTEw7CisgICAgICAgIFB5RXJyX0ZldGNoKCZ0cCwgJnYsICZ0Yik7CisgICAgICAgIHRtcF92YWx1ZSA9IHY7CisgICAgICAgIC8qIE5VTEwgb2NjdXJzIHdoZW4gdGhlcmUgd2FzIGEgS2V5Ym9hcmRJbnRlcnJ1cHQgKi8KKyAgICAgICAgaWYgKHRtcF92YWx1ZSA9PSBOVUxMKQorICAgICAgICAgICAgdG1wX3ZhbHVlID0gUHlfTm9uZTsKKyAgICAgICAgaWYgKChyID0gUHlUdXBsZV9QYWNrKDMsIHRtcF92YWx1ZSwgY2xzLCBhcmdzKSkpIHsKKyAgICAgICAgICAgIFB5X1hERUNSRUYodik7CisgICAgICAgICAgICB2PXI7CisgICAgICAgIH0KKyAgICAgICAgUHlFcnJfUmVzdG9yZSh0cCx2LHRiKTsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIAogc3RhdGljIGludAogbG9hZF9vYmooVW5waWNrbGVyb2JqZWN0ICpzZWxmKQogewotCVB5T2JqZWN0ICpjbGFzcywgKnR1cCwgKm9iaj0wOwotCWludCBpOworICAgIFB5T2JqZWN0ICpjbGFzcywgKnR1cCwgKm9iaj0wOworICAgIGludCBpOwogCi0JaWYgKChpID0gbWFya2VyKHNlbGYpKSA8IDApIHJldHVybiAtMTsKLQlpZiAoISggdHVwPVBkYXRhX3BvcFR1cGxlKHNlbGYtPnN0YWNrLCBpKzEpKSkgIHJldHVybiAtMTsKLQlQREFUQV9QT1Aoc2VsZi0+c3RhY2ssIGNsYXNzKTsKLQlpZiAoY2xhc3MpIHsKLQkJb2JqID0gSW5zdGFuY2VfTmV3KGNsYXNzLCB0dXApOwotCQlQeV9ERUNSRUYoY2xhc3MpOwotCX0KLQlQeV9ERUNSRUYodHVwKTsKKyAgICBpZiAoKGkgPSBtYXJrZXIoc2VsZikpIDwgMCkgcmV0dXJuIC0xOworICAgIGlmICghKCB0dXA9UGRhdGFfcG9wVHVwbGUoc2VsZi0+c3RhY2ssIGkrMSkpKSAgcmV0dXJuIC0xOworICAgIFBEQVRBX1BPUChzZWxmLT5zdGFjaywgY2xhc3MpOworICAgIGlmIChjbGFzcykgeworICAgICAgICBvYmogPSBJbnN0YW5jZV9OZXcoY2xhc3MsIHR1cCk7CisgICAgICAgIFB5X0RFQ1JFRihjbGFzcyk7CisgICAgfQorICAgIFB5X0RFQ1JFRih0dXApOwogCi0JaWYgKCEgb2JqKSByZXR1cm4gLTE7Ci0JUERBVEFfUFVTSChzZWxmLT5zdGFjaywgb2JqLCAtMSk7Ci0JcmV0dXJuIDA7CisgICAgaWYgKCEgb2JqKSByZXR1cm4gLTE7CisgICAgUERBVEFfUFVTSChzZWxmLT5zdGFjaywgb2JqLCAtMSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIAogc3RhdGljIGludAogbG9hZF9pbnN0KFVucGlja2xlcm9iamVjdCAqc2VsZikKIHsKLQlQeU9iamVjdCAqdHVwLCAqY2xhc3M9MCwgKm9iaj0wLCAqbW9kdWxlX25hbWUsICpjbGFzc19uYW1lOwotCWludCBpLCBsZW47Ci0JY2hhciAqczsKKyAgICBQeU9iamVjdCAqdHVwLCAqY2xhc3M9MCwgKm9iaj0wLCAqbW9kdWxlX25hbWUsICpjbGFzc19uYW1lOworICAgIGludCBpLCBsZW47CisgICAgY2hhciAqczsKIAotCWlmICgoaSA9IG1hcmtlcihzZWxmKSkgPCAwKSByZXR1cm4gLTE7CisgICAgaWYgKChpID0gbWFya2VyKHNlbGYpKSA8IDApIHJldHVybiAtMTsKIAotCWlmICgobGVuID0gc2VsZi0+cmVhZGxpbmVfZnVuYyhzZWxmLCAmcykpIDwgMCkgcmV0dXJuIC0xOwotCWlmIChsZW4gPCAyKSByZXR1cm4gYmFkX3JlYWRsaW5lKCk7Ci0JbW9kdWxlX25hbWUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzLCBsZW4gLSAxKTsKLQlpZiAoIW1vZHVsZV9uYW1lKSAgcmV0dXJuIC0xOworICAgIGlmICgobGVuID0gc2VsZi0+cmVhZGxpbmVfZnVuYyhzZWxmLCAmcykpIDwgMCkgcmV0dXJuIC0xOworICAgIGlmIChsZW4gPCAyKSByZXR1cm4gYmFkX3JlYWRsaW5lKCk7CisgICAgbW9kdWxlX25hbWUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzLCBsZW4gLSAxKTsKKyAgICBpZiAoIW1vZHVsZV9uYW1lKSAgcmV0dXJuIC0xOwogCi0JaWYgKChsZW4gPSBzZWxmLT5yZWFkbGluZV9mdW5jKHNlbGYsICZzKSkgPj0gMCkgewotCQlpZiAobGVuIDwgMikgcmV0dXJuIGJhZF9yZWFkbGluZSgpOwotCQlpZiAoKGNsYXNzX25hbWUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzLCBsZW4gLSAxKSkpIHsKLQkJCWNsYXNzID0gZmluZF9jbGFzcyhtb2R1bGVfbmFtZSwgY2xhc3NfbmFtZSwKLQkJCQkJICAgc2VsZi0+ZmluZF9jbGFzcyk7Ci0JCQlQeV9ERUNSRUYoY2xhc3NfbmFtZSk7Ci0JCX0KLQl9Ci0JUHlfREVDUkVGKG1vZHVsZV9uYW1lKTsKKyAgICBpZiAoKGxlbiA9IHNlbGYtPnJlYWRsaW5lX2Z1bmMoc2VsZiwgJnMpKSA+PSAwKSB7CisgICAgICAgIGlmIChsZW4gPCAyKSByZXR1cm4gYmFkX3JlYWRsaW5lKCk7CisgICAgICAgIGlmICgoY2xhc3NfbmFtZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHMsIGxlbiAtIDEpKSkgeworICAgICAgICAgICAgY2xhc3MgPSBmaW5kX2NsYXNzKG1vZHVsZV9uYW1lLCBjbGFzc19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPmZpbmRfY2xhc3MpOworICAgICAgICAgICAgUHlfREVDUkVGKGNsYXNzX25hbWUpOworICAgICAgICB9CisgICAgfQorICAgIFB5X0RFQ1JFRihtb2R1bGVfbmFtZSk7CiAKLQlpZiAoISBjbGFzcykgcmV0dXJuIC0xOworICAgIGlmICghIGNsYXNzKSByZXR1cm4gLTE7CiAKLQlpZiAoKHR1cD1QZGF0YV9wb3BUdXBsZShzZWxmLT5zdGFjaywgaSkpKSB7Ci0JCW9iaiA9IEluc3RhbmNlX05ldyhjbGFzcywgdHVwKTsKLQkJUHlfREVDUkVGKHR1cCk7Ci0JfQotCVB5X0RFQ1JFRihjbGFzcyk7CisgICAgaWYgKCh0dXA9UGRhdGFfcG9wVHVwbGUoc2VsZi0+c3RhY2ssIGkpKSkgeworICAgICAgICBvYmogPSBJbnN0YW5jZV9OZXcoY2xhc3MsIHR1cCk7CisgICAgICAgIFB5X0RFQ1JFRih0dXApOworICAgIH0KKyAgICBQeV9ERUNSRUYoY2xhc3MpOwogCi0JaWYgKCEgb2JqKSByZXR1cm4gLTE7CisgICAgaWYgKCEgb2JqKSByZXR1cm4gLTE7CiAKLQlQREFUQV9QVVNIKHNlbGYtPnN0YWNrLCBvYmosIC0xKTsKLQlyZXR1cm4gMDsKKyAgICBQREFUQV9QVVNIKHNlbGYtPnN0YWNrLCBvYmosIC0xKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogbG9hZF9uZXdvYmooVW5waWNrbGVyb2JqZWN0ICpzZWxmKQogewotCVB5T2JqZWN0ICphcmdzID0gTlVMTDsKLQlQeU9iamVjdCAqY2xzcmF3ID0gTlVMTDsKLQlQeVR5cGVPYmplY3QgKmNsczsJLyogY2xzcmF3IGNhc3QgdG8gaXRzIHRydWUgdHlwZSAqLwotCVB5T2JqZWN0ICpvYmo7CisgICAgUHlPYmplY3QgKmFyZ3MgPSBOVUxMOworICAgIFB5T2JqZWN0ICpjbHNyYXcgPSBOVUxMOworICAgIFB5VHlwZU9iamVjdCAqY2xzOyAgICAgICAgICAvKiBjbHNyYXcgY2FzdCB0byBpdHMgdHJ1ZSB0eXBlICovCisgICAgUHlPYmplY3QgKm9iajsKIAotCS8qIFN0YWNrIGlzIC4uLiBjbHMgYXJndHVwbGUsIGFuZCB3ZSB3YW50IHRvIGNhbGwKLQkgKiBjbHMuX19uZXdfXyhjbHMsICphcmd0dXBsZSkuCi0JICovCi0JUERBVEFfUE9QKHNlbGYtPnN0YWNrLCBhcmdzKTsKLQlpZiAoYXJncyA9PSBOVUxMKSBnb3RvIEZhaWw7Ci0JaWYgKCEgUHlUdXBsZV9DaGVjayhhcmdzKSkgewotCQlQeUVycl9TZXRTdHJpbmcoVW5waWNrbGluZ0Vycm9yLCAiTkVXT0JKIGV4cGVjdGVkIGFuIGFyZyAiCi0JCQkJCQkgInR1cGxlLiIpOwotCQlnb3RvIEZhaWw7Ci0JfQorICAgIC8qIFN0YWNrIGlzIC4uLiBjbHMgYXJndHVwbGUsIGFuZCB3ZSB3YW50IHRvIGNhbGwKKyAgICAgKiBjbHMuX19uZXdfXyhjbHMsICphcmd0dXBsZSkuCisgICAgICovCisgICAgUERBVEFfUE9QKHNlbGYtPnN0YWNrLCBhcmdzKTsKKyAgICBpZiAoYXJncyA9PSBOVUxMKSBnb3RvIEZhaWw7CisgICAgaWYgKCEgUHlUdXBsZV9DaGVjayhhcmdzKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoVW5waWNrbGluZ0Vycm9yLCAiTkVXT0JKIGV4cGVjdGVkIGFuIGFyZyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0dXBsZS4iKTsKKyAgICAgICAgZ290byBGYWlsOworICAgIH0KIAotCVBEQVRBX1BPUChzZWxmLT5zdGFjaywgY2xzcmF3KTsKLQljbHMgPSAoUHlUeXBlT2JqZWN0ICopY2xzcmF3OwotCWlmIChjbHMgPT0gTlVMTCkgZ290byBGYWlsOwotCWlmICghIFB5VHlwZV9DaGVjayhjbHMpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhVbnBpY2tsaW5nRXJyb3IsICJORVdPQkogY2xhc3MgYXJndW1lbnQgIgotCQkJCQkgCSAiaXNuJ3QgYSB0eXBlIG9iamVjdCIpOwotCQlnb3RvIEZhaWw7Ci0JfQotCWlmIChjbHMtPnRwX25ldyA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhVbnBpY2tsaW5nRXJyb3IsICJORVdPQkogY2xhc3MgYXJndW1lbnQgIgotCQkJCQkJICJoYXMgTlVMTCB0cF9uZXciKTsKLQkJZ290byBGYWlsOwotCX0KKyAgICBQREFUQV9QT1Aoc2VsZi0+c3RhY2ssIGNsc3Jhdyk7CisgICAgY2xzID0gKFB5VHlwZU9iamVjdCAqKWNsc3JhdzsKKyAgICBpZiAoY2xzID09IE5VTEwpIGdvdG8gRmFpbDsKKyAgICBpZiAoISBQeVR5cGVfQ2hlY2soY2xzKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoVW5waWNrbGluZ0Vycm9yLCAiTkVXT0JKIGNsYXNzIGFyZ3VtZW50ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlzbid0IGEgdHlwZSBvYmplY3QiKTsKKyAgICAgICAgZ290byBGYWlsOworICAgIH0KKyAgICBpZiAoY2xzLT50cF9uZXcgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoVW5waWNrbGluZ0Vycm9yLCAiTkVXT0JKIGNsYXNzIGFyZ3VtZW50ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImhhcyBOVUxMIHRwX25ldyIpOworICAgICAgICBnb3RvIEZhaWw7CisgICAgfQogCi0JLyogQ2FsbCBfX25ld19fLiAqLwotCW9iaiA9IGNscy0+dHBfbmV3KGNscywgYXJncywgTlVMTCk7Ci0JaWYgKG9iaiA9PSBOVUxMKSBnb3RvIEZhaWw7CisgICAgLyogQ2FsbCBfX25ld19fLiAqLworICAgIG9iaiA9IGNscy0+dHBfbmV3KGNscywgYXJncywgTlVMTCk7CisgICAgaWYgKG9iaiA9PSBOVUxMKSBnb3RvIEZhaWw7CiAKLSAJUHlfREVDUkVGKGFyZ3MpOwotIAlQeV9ERUNSRUYoY2xzcmF3KTsKLQlQREFUQV9QVVNIKHNlbGYtPnN0YWNrLCBvYmosIC0xKTsKLSAJcmV0dXJuIDA7CisgICAgUHlfREVDUkVGKGFyZ3MpOworICAgIFB5X0RFQ1JFRihjbHNyYXcpOworICAgIFBEQVRBX1BVU0goc2VsZi0+c3RhY2ssIG9iaiwgLTEpOworICAgIHJldHVybiAwOwogCiAgRmFpbDoKLSAJUHlfWERFQ1JFRihhcmdzKTsKLSAJUHlfWERFQ1JFRihjbHNyYXcpOwotIAlyZXR1cm4gLTE7CisgICAgUHlfWERFQ1JFRihhcmdzKTsKKyAgICBQeV9YREVDUkVGKGNsc3Jhdyk7CisgICAgcmV0dXJuIC0xOwogfQogCiBzdGF0aWMgaW50CiBsb2FkX2dsb2JhbChVbnBpY2tsZXJvYmplY3QgKnNlbGYpCiB7Ci0JUHlPYmplY3QgKmNsYXNzID0gMCwgKm1vZHVsZV9uYW1lID0gMCwgKmNsYXNzX25hbWUgPSAwOwotCWludCBsZW47Ci0JY2hhciAqczsKKyAgICBQeU9iamVjdCAqY2xhc3MgPSAwLCAqbW9kdWxlX25hbWUgPSAwLCAqY2xhc3NfbmFtZSA9IDA7CisgICAgaW50IGxlbjsKKyAgICBjaGFyICpzOwogCi0JaWYgKChsZW4gPSBzZWxmLT5yZWFkbGluZV9mdW5jKHNlbGYsICZzKSkgPCAwKSByZXR1cm4gLTE7Ci0JaWYgKGxlbiA8IDIpIHJldHVybiBiYWRfcmVhZGxpbmUoKTsKLQltb2R1bGVfbmFtZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHMsIGxlbiAtIDEpOwotCWlmICghbW9kdWxlX25hbWUpICByZXR1cm4gLTE7CisgICAgaWYgKChsZW4gPSBzZWxmLT5yZWFkbGluZV9mdW5jKHNlbGYsICZzKSkgPCAwKSByZXR1cm4gLTE7CisgICAgaWYgKGxlbiA8IDIpIHJldHVybiBiYWRfcmVhZGxpbmUoKTsKKyAgICBtb2R1bGVfbmFtZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHMsIGxlbiAtIDEpOworICAgIGlmICghbW9kdWxlX25hbWUpICByZXR1cm4gLTE7CiAKLQlpZiAoKGxlbiA9IHNlbGYtPnJlYWRsaW5lX2Z1bmMoc2VsZiwgJnMpKSA+PSAwKSB7Ci0JCWlmIChsZW4gPCAyKSB7Ci0JCQlQeV9ERUNSRUYobW9kdWxlX25hbWUpOwotCQkJcmV0dXJuIGJhZF9yZWFkbGluZSgpOwotCQl9Ci0JCWlmICgoY2xhc3NfbmFtZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHMsIGxlbiAtIDEpKSkgewotCQkJY2xhc3MgPSBmaW5kX2NsYXNzKG1vZHVsZV9uYW1lLCBjbGFzc19uYW1lLAotCQkJCQkgICBzZWxmLT5maW5kX2NsYXNzKTsKLQkJCVB5X0RFQ1JFRihjbGFzc19uYW1lKTsKLQkJfQotCX0KLQlQeV9ERUNSRUYobW9kdWxlX25hbWUpOworICAgIGlmICgobGVuID0gc2VsZi0+cmVhZGxpbmVfZnVuYyhzZWxmLCAmcykpID49IDApIHsKKyAgICAgICAgaWYgKGxlbiA8IDIpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihtb2R1bGVfbmFtZSk7CisgICAgICAgICAgICByZXR1cm4gYmFkX3JlYWRsaW5lKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChjbGFzc19uYW1lID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocywgbGVuIC0gMSkpKSB7CisgICAgICAgICAgICBjbGFzcyA9IGZpbmRfY2xhc3MobW9kdWxlX25hbWUsIGNsYXNzX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+ZmluZF9jbGFzcyk7CisgICAgICAgICAgICBQeV9ERUNSRUYoY2xhc3NfbmFtZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgUHlfREVDUkVGKG1vZHVsZV9uYW1lKTsKIAotCWlmICghIGNsYXNzKSByZXR1cm4gLTE7Ci0JUERBVEFfUFVTSChzZWxmLT5zdGFjaywgY2xhc3MsIC0xKTsKLQlyZXR1cm4gMDsKKyAgICBpZiAoISBjbGFzcykgcmV0dXJuIC0xOworICAgIFBEQVRBX1BVU0goc2VsZi0+c3RhY2ssIGNsYXNzLCAtMSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIAogc3RhdGljIGludAogbG9hZF9wZXJzaWQoVW5waWNrbGVyb2JqZWN0ICpzZWxmKQogewotCVB5T2JqZWN0ICpwaWQgPSAwOwotCWludCBsZW47Ci0JY2hhciAqczsKKyAgICBQeU9iamVjdCAqcGlkID0gMDsKKyAgICBpbnQgbGVuOworICAgIGNoYXIgKnM7CiAKLQlpZiAoc2VsZi0+cGVyc19mdW5jKSB7Ci0JCWlmICgobGVuID0gc2VsZi0+cmVhZGxpbmVfZnVuYyhzZWxmLCAmcykpIDwgMCkgcmV0dXJuIC0xOwotCQlpZiAobGVuIDwgMikgcmV0dXJuIGJhZF9yZWFkbGluZSgpOworICAgIGlmIChzZWxmLT5wZXJzX2Z1bmMpIHsKKyAgICAgICAgaWYgKChsZW4gPSBzZWxmLT5yZWFkbGluZV9mdW5jKHNlbGYsICZzKSkgPCAwKSByZXR1cm4gLTE7CisgICAgICAgIGlmIChsZW4gPCAyKSByZXR1cm4gYmFkX3JlYWRsaW5lKCk7CiAKLQkJcGlkID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocywgbGVuIC0gMSk7Ci0JCWlmICghcGlkKSAgcmV0dXJuIC0xOworICAgICAgICBwaWQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzLCBsZW4gLSAxKTsKKyAgICAgICAgaWYgKCFwaWQpICByZXR1cm4gLTE7CiAKLQkJaWYgKFB5TGlzdF9DaGVjayhzZWxmLT5wZXJzX2Z1bmMpKSB7Ci0JCQlpZiAoUHlMaXN0X0FwcGVuZChzZWxmLT5wZXJzX2Z1bmMsIHBpZCkgPCAwKSB7Ci0JCQkJUHlfREVDUkVGKHBpZCk7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJQVJHX1RVUChzZWxmLCBwaWQpOwotCQkJaWYgKHNlbGYtPmFyZykgewotCQkJCXBpZCA9IFB5T2JqZWN0X0NhbGwoc2VsZi0+cGVyc19mdW5jLCBzZWxmLT5hcmcsCi0JCQkJCQkgICAgTlVMTCk7Ci0JCQkJRlJFRV9BUkdfVFVQKHNlbGYpOwotCQkJfQotCQl9CisgICAgICAgIGlmIChQeUxpc3RfQ2hlY2soc2VsZi0+cGVyc19mdW5jKSkgeworICAgICAgICAgICAgaWYgKFB5TGlzdF9BcHBlbmQoc2VsZi0+cGVyc19mdW5jLCBwaWQpIDwgMCkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihwaWQpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIEFSR19UVVAoc2VsZiwgcGlkKTsKKyAgICAgICAgICAgIGlmIChzZWxmLT5hcmcpIHsKKyAgICAgICAgICAgICAgICBwaWQgPSBQeU9iamVjdF9DYWxsKHNlbGYtPnBlcnNfZnVuYywgc2VsZi0+YXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAgICAgICAgICAgRlJFRV9BUkdfVFVQKHNlbGYpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJaWYgKCEgcGlkKSByZXR1cm4gLTE7CisgICAgICAgIGlmICghIHBpZCkgcmV0dXJuIC0xOwogCi0JCVBEQVRBX1BVU0goc2VsZi0+c3RhY2ssIHBpZCwgLTEpOwotCQlyZXR1cm4gMDsKLQl9Ci0JZWxzZSB7Ci0JCVB5RXJyX1NldFN0cmluZyhVbnBpY2tsaW5nRXJyb3IsCi0JCQkJIkEgbG9hZCBwZXJzaXN0ZW50IGlkIGluc3RydWN0aW9uIHdhcyBlbmNvdW50ZXJlZCxcbiIKLQkJCQkiYnV0IG5vIHBlcnNpc3RlbnRfbG9hZCBmdW5jdGlvbiB3YXMgc3BlY2lmaWVkLiIpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgICAgICBQREFUQV9QVVNIKHNlbGYtPnN0YWNrLCBwaWQsIC0xKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoVW5waWNrbGluZ0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIkEgbG9hZCBwZXJzaXN0ZW50IGlkIGluc3RydWN0aW9uIHdhcyBlbmNvdW50ZXJlZCxcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJidXQgbm8gcGVyc2lzdGVudF9sb2FkIGZ1bmN0aW9uIHdhcyBzcGVjaWZpZWQuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiB9CiAKIHN0YXRpYyBpbnQKIGxvYWRfYmlucGVyc2lkKFVucGlja2xlcm9iamVjdCAqc2VsZikKIHsKLQlQeU9iamVjdCAqcGlkID0gMDsKKyAgICBQeU9iamVjdCAqcGlkID0gMDsKIAotCWlmIChzZWxmLT5wZXJzX2Z1bmMpIHsKLQkJUERBVEFfUE9QKHNlbGYtPnN0YWNrLCBwaWQpOwotCQlpZiAoISBwaWQpIHJldHVybiAtMTsKKyAgICBpZiAoc2VsZi0+cGVyc19mdW5jKSB7CisgICAgICAgIFBEQVRBX1BPUChzZWxmLT5zdGFjaywgcGlkKTsKKyAgICAgICAgaWYgKCEgcGlkKSByZXR1cm4gLTE7CiAKLQkJaWYgKFB5TGlzdF9DaGVjayhzZWxmLT5wZXJzX2Z1bmMpKSB7Ci0JCQlpZiAoUHlMaXN0X0FwcGVuZChzZWxmLT5wZXJzX2Z1bmMsIHBpZCkgPCAwKSB7Ci0JCQkJUHlfREVDUkVGKHBpZCk7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJQVJHX1RVUChzZWxmLCBwaWQpOwotCQkJaWYgKHNlbGYtPmFyZykgewotCQkJCXBpZCA9IFB5T2JqZWN0X0NhbGwoc2VsZi0+cGVyc19mdW5jLCBzZWxmLT5hcmcsCi0JCQkJCQkgICAgTlVMTCk7Ci0JCQkJRlJFRV9BUkdfVFVQKHNlbGYpOwotCQkJfQotCQkJaWYgKCEgcGlkKSByZXR1cm4gLTE7Ci0JCX0KKyAgICAgICAgaWYgKFB5TGlzdF9DaGVjayhzZWxmLT5wZXJzX2Z1bmMpKSB7CisgICAgICAgICAgICBpZiAoUHlMaXN0X0FwcGVuZChzZWxmLT5wZXJzX2Z1bmMsIHBpZCkgPCAwKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHBpZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgQVJHX1RVUChzZWxmLCBwaWQpOworICAgICAgICAgICAgaWYgKHNlbGYtPmFyZykgeworICAgICAgICAgICAgICAgIHBpZCA9IFB5T2JqZWN0X0NhbGwoc2VsZi0+cGVyc19mdW5jLCBzZWxmLT5hcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgICAgICAgICBGUkVFX0FSR19UVVAoc2VsZik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoISBwaWQpIHJldHVybiAtMTsKKyAgICAgICAgfQogCi0JCVBEQVRBX1BVU0goc2VsZi0+c3RhY2ssIHBpZCwgLTEpOwotCQlyZXR1cm4gMDsKLQl9Ci0JZWxzZSB7Ci0JCVB5RXJyX1NldFN0cmluZyhVbnBpY2tsaW5nRXJyb3IsCi0JCQkJIkEgbG9hZCBwZXJzaXN0ZW50IGlkIGluc3RydWN0aW9uIHdhcyBlbmNvdW50ZXJlZCxcbiIKLQkJCQkiYnV0IG5vIHBlcnNpc3RlbnRfbG9hZCBmdW5jdGlvbiB3YXMgc3BlY2lmaWVkLiIpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgICAgICBQREFUQV9QVVNIKHNlbGYtPnN0YWNrLCBwaWQsIC0xKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoVW5waWNrbGluZ0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIkEgbG9hZCBwZXJzaXN0ZW50IGlkIGluc3RydWN0aW9uIHdhcyBlbmNvdW50ZXJlZCxcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJidXQgbm8gcGVyc2lzdGVudF9sb2FkIGZ1bmN0aW9uIHdhcyBzcGVjaWZpZWQuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiB9CiAKIAogc3RhdGljIGludAogbG9hZF9wb3AoVW5waWNrbGVyb2JqZWN0ICpzZWxmKQogewotCWludCBsZW4gPSBzZWxmLT5zdGFjay0+bGVuZ3RoOworICAgIGludCBsZW4gPSBzZWxmLT5zdGFjay0+bGVuZ3RoOwogCi0JLyogTm90ZSB0aGF0IHdlIHNwbGl0IHRoZSAocGlja2xlLnB5KSBzdGFjayBpbnRvIHR3byBzdGFja3MsCi0JICAgYW4gb2JqZWN0IHN0YWNrIGFuZCBhIG1hcmsgc3RhY2suIFdlIGhhdmUgdG8gYmUgY2xldmVyIGFuZAotCSAgIHBvcCB0aGUgcmlnaHQgb25lLiBXZSBkbyB0aGlzIGJ5IGxvb2tpbmcgYXQgdGhlIHRvcCBvZiB0aGUKLQkgICBtYXJrIHN0YWNrIGZpcnN0LCBhbmQgb25seSBzaWduYWxsaW5nIGEgc3RhY2sgdW5kZXJmbG93IGlmCi0JICAgdGhlIG9iamVjdCBzdGFjayBpcyBlbXB0eSBhbmQgdGhlIG1hcmsgc3RhY2sgZG9lc24ndCBtYXRjaAotCSAgIG91ciBleHBlY3RhdGlvbnMuCi0JKi8KLQlpZiAoc2VsZi0+bnVtX21hcmtzID4gMCAmJiBzZWxmLT5tYXJrc1tzZWxmLT5udW1fbWFya3MgLSAxXSA9PSBsZW4pIHsKLQkJc2VsZi0+bnVtX21hcmtzLS07Ci0JfSBlbHNlIGlmIChsZW4gPiAwKSB7Ci0JCWxlbi0tOwotCQlQeV9ERUNSRUYoc2VsZi0+c3RhY2stPmRhdGFbbGVuXSk7Ci0JCXNlbGYtPnN0YWNrLT5sZW5ndGggPSBsZW47Ci0JfSBlbHNlIHsKLQkJcmV0dXJuIHN0YWNrVW5kZXJmbG93KCk7Ci0JfQotCXJldHVybiAwOworICAgIC8qIE5vdGUgdGhhdCB3ZSBzcGxpdCB0aGUgKHBpY2tsZS5weSkgc3RhY2sgaW50byB0d28gc3RhY2tzLAorICAgICAgIGFuIG9iamVjdCBzdGFjayBhbmQgYSBtYXJrIHN0YWNrLiBXZSBoYXZlIHRvIGJlIGNsZXZlciBhbmQKKyAgICAgICBwb3AgdGhlIHJpZ2h0IG9uZS4gV2UgZG8gdGhpcyBieSBsb29raW5nIGF0IHRoZSB0b3Agb2YgdGhlCisgICAgICAgbWFyayBzdGFjayBmaXJzdCwgYW5kIG9ubHkgc2lnbmFsbGluZyBhIHN0YWNrIHVuZGVyZmxvdyBpZgorICAgICAgIHRoZSBvYmplY3Qgc3RhY2sgaXMgZW1wdHkgYW5kIHRoZSBtYXJrIHN0YWNrIGRvZXNuJ3QgbWF0Y2gKKyAgICAgICBvdXIgZXhwZWN0YXRpb25zLgorICAgICovCisgICAgaWYgKHNlbGYtPm51bV9tYXJrcyA+IDAgJiYgc2VsZi0+bWFya3Nbc2VsZi0+bnVtX21hcmtzIC0gMV0gPT0gbGVuKSB7CisgICAgICAgIHNlbGYtPm51bV9tYXJrcy0tOworICAgIH0gZWxzZSBpZiAobGVuID4gMCkgeworICAgICAgICBsZW4tLTsKKyAgICAgICAgUHlfREVDUkVGKHNlbGYtPnN0YWNrLT5kYXRhW2xlbl0pOworICAgICAgICBzZWxmLT5zdGFjay0+bGVuZ3RoID0gbGVuOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBzdGFja1VuZGVyZmxvdygpOworICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogCiBzdGF0aWMgaW50CiBsb2FkX3BvcF9tYXJrKFVucGlja2xlcm9iamVjdCAqc2VsZikKIHsKLQlpbnQgaTsKKyAgICBpbnQgaTsKIAotCWlmICgoaSA9IG1hcmtlcihzZWxmKSkgPCAwKQotCQlyZXR1cm4gLTE7CisgICAgaWYgKChpID0gbWFya2VyKHNlbGYpKSA8IDApCisgICAgICAgIHJldHVybiAtMTsKIAotCVBkYXRhX2NsZWFyKHNlbGYtPnN0YWNrLCBpKTsKKyAgICBQZGF0YV9jbGVhcihzZWxmLT5zdGFjaywgaSk7CiAKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKIH0KIAogCiBzdGF0aWMgaW50CiBsb2FkX2R1cChVbnBpY2tsZXJvYmplY3QgKnNlbGYpCiB7Ci0JUHlPYmplY3QgKmxhc3Q7Ci0JaW50IGxlbjsKKyAgICBQeU9iamVjdCAqbGFzdDsKKyAgICBpbnQgbGVuOwogCi0JaWYgKChsZW4gPSBzZWxmLT5zdGFjay0+bGVuZ3RoKSA8PSAwKSByZXR1cm4gc3RhY2tVbmRlcmZsb3coKTsKLQlsYXN0PXNlbGYtPnN0YWNrLT5kYXRhW2xlbi0xXTsKLQlQeV9JTkNSRUYobGFzdCk7Ci0JUERBVEFfUFVTSChzZWxmLT5zdGFjaywgbGFzdCwgLTEpOwotCXJldHVybiAwOworICAgIGlmICgobGVuID0gc2VsZi0+c3RhY2stPmxlbmd0aCkgPD0gMCkgcmV0dXJuIHN0YWNrVW5kZXJmbG93KCk7CisgICAgbGFzdD1zZWxmLT5zdGFjay0+ZGF0YVtsZW4tMV07CisgICAgUHlfSU5DUkVGKGxhc3QpOworICAgIFBEQVRBX1BVU0goc2VsZi0+c3RhY2ssIGxhc3QsIC0xKTsKKyAgICByZXR1cm4gMDsKIH0KIAogCiBzdGF0aWMgaW50CiBsb2FkX2dldChVbnBpY2tsZXJvYmplY3QgKnNlbGYpCiB7Ci0JUHlPYmplY3QgKnB5X3N0ciA9IDAsICp2YWx1ZSA9IDA7Ci0JaW50IGxlbjsKLQljaGFyICpzOwotCWludCByYzsKKyAgICBQeU9iamVjdCAqcHlfc3RyID0gMCwgKnZhbHVlID0gMDsKKyAgICBpbnQgbGVuOworICAgIGNoYXIgKnM7CisgICAgaW50IHJjOwogCi0JaWYgKChsZW4gPSBzZWxmLT5yZWFkbGluZV9mdW5jKHNlbGYsICZzKSkgPCAwKSByZXR1cm4gLTE7Ci0JaWYgKGxlbiA8IDIpIHJldHVybiBiYWRfcmVhZGxpbmUoKTsKKyAgICBpZiAoKGxlbiA9IHNlbGYtPnJlYWRsaW5lX2Z1bmMoc2VsZiwgJnMpKSA8IDApIHJldHVybiAtMTsKKyAgICBpZiAobGVuIDwgMikgcmV0dXJuIGJhZF9yZWFkbGluZSgpOwogCi0JaWYgKCEoIHB5X3N0ciA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHMsIGxlbiAtIDEpKSkgIHJldHVybiAtMTsKKyAgICBpZiAoISggcHlfc3RyID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocywgbGVuIC0gMSkpKSAgcmV0dXJuIC0xOwogCi0JdmFsdWUgPSBQeURpY3RfR2V0SXRlbShzZWxmLT5tZW1vLCBweV9zdHIpOwotCWlmICghIHZhbHVlKSB7Ci0JCVB5RXJyX1NldE9iamVjdChCYWRQaWNrbGVHZXQsIHB5X3N0cik7Ci0JCXJjID0gLTE7Ci0JfQotCWVsc2UgewotCQlQREFUQV9BUFBFTkQoc2VsZi0+c3RhY2ssIHZhbHVlLCAtMSk7Ci0JCXJjID0gMDsKLQl9CisgICAgdmFsdWUgPSBQeURpY3RfR2V0SXRlbShzZWxmLT5tZW1vLCBweV9zdHIpOworICAgIGlmICghIHZhbHVlKSB7CisgICAgICAgIFB5RXJyX1NldE9iamVjdChCYWRQaWNrbGVHZXQsIHB5X3N0cik7CisgICAgICAgIHJjID0gLTE7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQREFUQV9BUFBFTkQoc2VsZi0+c3RhY2ssIHZhbHVlLCAtMSk7CisgICAgICAgIHJjID0gMDsKKyAgICB9CiAKLQlQeV9ERUNSRUYocHlfc3RyKTsKLQlyZXR1cm4gcmM7CisgICAgUHlfREVDUkVGKHB5X3N0cik7CisgICAgcmV0dXJuIHJjOwogfQogCiAKIHN0YXRpYyBpbnQKIGxvYWRfYmluZ2V0KFVucGlja2xlcm9iamVjdCAqc2VsZikKIHsKLQlQeU9iamVjdCAqcHlfa2V5ID0gMCwgKnZhbHVlID0gMDsKLQl1bnNpZ25lZCBjaGFyIGtleTsKLQljaGFyICpzOwotCWludCByYzsKKyAgICBQeU9iamVjdCAqcHlfa2V5ID0gMCwgKnZhbHVlID0gMDsKKyAgICB1bnNpZ25lZCBjaGFyIGtleTsKKyAgICBjaGFyICpzOworICAgIGludCByYzsKIAotCWlmIChzZWxmLT5yZWFkX2Z1bmMoc2VsZiwgJnMsIDEpIDwgMCkgcmV0dXJuIC0xOworICAgIGlmIChzZWxmLT5yZWFkX2Z1bmMoc2VsZiwgJnMsIDEpIDwgMCkgcmV0dXJuIC0xOwogCi0Ja2V5ID0gKHVuc2lnbmVkIGNoYXIpc1swXTsKLQlpZiAoISggcHlfa2V5ID0gUHlJbnRfRnJvbUxvbmcoKGxvbmcpa2V5KSkpICByZXR1cm4gLTE7CisgICAga2V5ID0gKHVuc2lnbmVkIGNoYXIpc1swXTsKKyAgICBpZiAoISggcHlfa2V5ID0gUHlJbnRfRnJvbUxvbmcoKGxvbmcpa2V5KSkpICByZXR1cm4gLTE7CiAKLQl2YWx1ZSA9IFB5RGljdF9HZXRJdGVtKHNlbGYtPm1lbW8sIHB5X2tleSk7Ci0JaWYgKCEgdmFsdWUpIHsKLQkJUHlFcnJfU2V0T2JqZWN0KEJhZFBpY2tsZUdldCwgcHlfa2V5KTsKLQkJcmMgPSAtMTsKLQl9Ci0JZWxzZSB7Ci0JCVBEQVRBX0FQUEVORChzZWxmLT5zdGFjaywgdmFsdWUsIC0xKTsKLQkJcmMgPSAwOwotCX0KKyAgICB2YWx1ZSA9IFB5RGljdF9HZXRJdGVtKHNlbGYtPm1lbW8sIHB5X2tleSk7CisgICAgaWYgKCEgdmFsdWUpIHsKKyAgICAgICAgUHlFcnJfU2V0T2JqZWN0KEJhZFBpY2tsZUdldCwgcHlfa2V5KTsKKyAgICAgICAgcmMgPSAtMTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFBEQVRBX0FQUEVORChzZWxmLT5zdGFjaywgdmFsdWUsIC0xKTsKKyAgICAgICAgcmMgPSAwOworICAgIH0KIAotCVB5X0RFQ1JFRihweV9rZXkpOwotCXJldHVybiByYzsKKyAgICBQeV9ERUNSRUYocHlfa2V5KTsKKyAgICByZXR1cm4gcmM7CiB9CiAKIAogc3RhdGljIGludAogbG9hZF9sb25nX2JpbmdldChVbnBpY2tsZXJvYmplY3QgKnNlbGYpCiB7Ci0JUHlPYmplY3QgKnB5X2tleSA9IDAsICp2YWx1ZSA9IDA7Ci0JdW5zaWduZWQgY2hhciBjOwotCWNoYXIgKnM7Ci0JbG9uZyBrZXk7Ci0JaW50IHJjOworICAgIFB5T2JqZWN0ICpweV9rZXkgPSAwLCAqdmFsdWUgPSAwOworICAgIHVuc2lnbmVkIGNoYXIgYzsKKyAgICBjaGFyICpzOworICAgIGxvbmcga2V5OworICAgIGludCByYzsKIAotCWlmIChzZWxmLT5yZWFkX2Z1bmMoc2VsZiwgJnMsIDQpIDwgMCkgcmV0dXJuIC0xOworICAgIGlmIChzZWxmLT5yZWFkX2Z1bmMoc2VsZiwgJnMsIDQpIDwgMCkgcmV0dXJuIC0xOwogCi0JYyA9ICh1bnNpZ25lZCBjaGFyKXNbMF07Ci0Ja2V5ID0gKGxvbmcpYzsKLQljID0gKHVuc2lnbmVkIGNoYXIpc1sxXTsKLQlrZXkgfD0gKGxvbmcpYyA8PCA4OwotCWMgPSAodW5zaWduZWQgY2hhcilzWzJdOwotCWtleSB8PSAobG9uZyljIDw8IDE2OwotCWMgPSAodW5zaWduZWQgY2hhcilzWzNdOwotCWtleSB8PSAobG9uZyljIDw8IDI0OworICAgIGMgPSAodW5zaWduZWQgY2hhcilzWzBdOworICAgIGtleSA9IChsb25nKWM7CisgICAgYyA9ICh1bnNpZ25lZCBjaGFyKXNbMV07CisgICAga2V5IHw9IChsb25nKWMgPDwgODsKKyAgICBjID0gKHVuc2lnbmVkIGNoYXIpc1syXTsKKyAgICBrZXkgfD0gKGxvbmcpYyA8PCAxNjsKKyAgICBjID0gKHVuc2lnbmVkIGNoYXIpc1szXTsKKyAgICBrZXkgfD0gKGxvbmcpYyA8PCAyNDsKIAotCWlmICghKCBweV9rZXkgPSBQeUludF9Gcm9tTG9uZygobG9uZylrZXkpKSkgIHJldHVybiAtMTsKKyAgICBpZiAoISggcHlfa2V5ID0gUHlJbnRfRnJvbUxvbmcoKGxvbmcpa2V5KSkpICByZXR1cm4gLTE7CiAKLQl2YWx1ZSA9IFB5RGljdF9HZXRJdGVtKHNlbGYtPm1lbW8sIHB5X2tleSk7Ci0JaWYgKCEgdmFsdWUpIHsKLQkJUHlFcnJfU2V0T2JqZWN0KEJhZFBpY2tsZUdldCwgcHlfa2V5KTsKLQkJcmMgPSAtMTsKLQl9Ci0JZWxzZSB7Ci0JCVBEQVRBX0FQUEVORChzZWxmLT5zdGFjaywgdmFsdWUsIC0xKTsKLQkJcmMgPSAwOwotCX0KKyAgICB2YWx1ZSA9IFB5RGljdF9HZXRJdGVtKHNlbGYtPm1lbW8sIHB5X2tleSk7CisgICAgaWYgKCEgdmFsdWUpIHsKKyAgICAgICAgUHlFcnJfU2V0T2JqZWN0KEJhZFBpY2tsZUdldCwgcHlfa2V5KTsKKyAgICAgICAgcmMgPSAtMTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFBEQVRBX0FQUEVORChzZWxmLT5zdGFjaywgdmFsdWUsIC0xKTsKKyAgICAgICAgcmMgPSAwOworICAgIH0KIAotCVB5X0RFQ1JFRihweV9rZXkpOwotCXJldHVybiByYzsKKyAgICBQeV9ERUNSRUYocHlfa2V5KTsKKyAgICByZXR1cm4gcmM7CiB9CiAKIC8qIFB1c2ggYW4gb2JqZWN0IGZyb20gdGhlIGV4dGVuc2lvbiByZWdpc3RyeSAoRVhUWzEyNF0pLiAgbmJ5dGVzIGlzCkBAIC00MTcwLDM5MSArNDE3MCwzOTEgQEAKIHN0YXRpYyBpbnQKIGxvYWRfZXh0ZW5zaW9uKFVucGlja2xlcm9iamVjdCAqc2VsZiwgaW50IG5ieXRlcykKIHsKLQljaGFyICpjb2RlYnl0ZXM7CS8qIHRoZSBuYnl0ZXMgYnl0ZXMgYWZ0ZXIgdGhlIG9wY29kZSAqLwotCWxvbmcgY29kZTsJCS8qIGNhbGNfYmluaW50IHJldHVybnMgbG9uZyAqLwotCVB5T2JqZWN0ICpweV9jb2RlOwkvKiBjb2RlIGFzIGEgUHl0aG9uIGludCAqLwotCVB5T2JqZWN0ICpvYmo7CQkvKiB0aGUgb2JqZWN0IHRvIHB1c2ggKi8KLQlQeU9iamVjdCAqcGFpcjsJCS8qIChtb2R1bGVfbmFtZSwgY2xhc3NfbmFtZSkgKi8KLQlQeU9iamVjdCAqbW9kdWxlX25hbWUsICpjbGFzc19uYW1lOworICAgIGNoYXIgKmNvZGVieXRlczsgICAgICAgICAgICAvKiB0aGUgbmJ5dGVzIGJ5dGVzIGFmdGVyIHRoZSBvcGNvZGUgKi8KKyAgICBsb25nIGNvZGU7ICAgICAgICAgICAgICAgICAgLyogY2FsY19iaW5pbnQgcmV0dXJucyBsb25nICovCisgICAgUHlPYmplY3QgKnB5X2NvZGU7ICAgICAgICAgIC8qIGNvZGUgYXMgYSBQeXRob24gaW50ICovCisgICAgUHlPYmplY3QgKm9iajsgICAgICAgICAgICAgIC8qIHRoZSBvYmplY3QgdG8gcHVzaCAqLworICAgIFB5T2JqZWN0ICpwYWlyOyAgICAgICAgICAgICAvKiAobW9kdWxlX25hbWUsIGNsYXNzX25hbWUpICovCisgICAgUHlPYmplY3QgKm1vZHVsZV9uYW1lLCAqY2xhc3NfbmFtZTsKIAotCWFzc2VydChuYnl0ZXMgPT0gMSB8fCBuYnl0ZXMgPT0gMiB8fCBuYnl0ZXMgPT0gNCk7Ci0JaWYgKHNlbGYtPnJlYWRfZnVuYyhzZWxmLCAmY29kZWJ5dGVzLCBuYnl0ZXMpIDwgMCkgcmV0dXJuIC0xOwotCWNvZGUgPSBjYWxjX2JpbmludChjb2RlYnl0ZXMsICBuYnl0ZXMpOwotCWlmIChjb2RlIDw9IDApIHsJCS8qIG5vdGUgdGhhdCAwIGlzIGZvcmJpZGRlbiAqLwotCQkvKiBDb3JydXB0IG9yIGhvc3RpbGUgcGlja2xlLiAqLwotCQlQeUVycl9TZXRTdHJpbmcoVW5waWNrbGluZ0Vycm9yLCAiRVhUIHNwZWNpZmllcyBjb2RlIDw9IDAiKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICBhc3NlcnQobmJ5dGVzID09IDEgfHwgbmJ5dGVzID09IDIgfHwgbmJ5dGVzID09IDQpOworICAgIGlmIChzZWxmLT5yZWFkX2Z1bmMoc2VsZiwgJmNvZGVieXRlcywgbmJ5dGVzKSA8IDApIHJldHVybiAtMTsKKyAgICBjb2RlID0gY2FsY19iaW5pbnQoY29kZWJ5dGVzLCAgbmJ5dGVzKTsKKyAgICBpZiAoY29kZSA8PSAwKSB7ICAgICAgICAgICAgICAgICAgICAvKiBub3RlIHRoYXQgMCBpcyBmb3JiaWRkZW4gKi8KKyAgICAgICAgLyogQ29ycnVwdCBvciBob3N0aWxlIHBpY2tsZS4gKi8KKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFVucGlja2xpbmdFcnJvciwgIkVYVCBzcGVjaWZpZXMgY29kZSA8PSAwIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQkvKiBMb29rIGZvciB0aGUgY29kZSBpbiB0aGUgY2FjaGUuICovCi0JcHlfY29kZSA9IFB5SW50X0Zyb21Mb25nKGNvZGUpOwotCWlmIChweV9jb2RlID09IE5VTEwpIHJldHVybiAtMTsKLQlvYmogPSBQeURpY3RfR2V0SXRlbShleHRlbnNpb25fY2FjaGUsIHB5X2NvZGUpOwotCWlmIChvYmogIT0gTlVMTCkgewotCQkvKiBCaW5nby4gKi8KLQkJUHlfREVDUkVGKHB5X2NvZGUpOwotCQlQREFUQV9BUFBFTkQoc2VsZi0+c3RhY2ssIG9iaiwgLTEpOwotCQlyZXR1cm4gMDsKLQl9CisgICAgLyogTG9vayBmb3IgdGhlIGNvZGUgaW4gdGhlIGNhY2hlLiAqLworICAgIHB5X2NvZGUgPSBQeUludF9Gcm9tTG9uZyhjb2RlKTsKKyAgICBpZiAocHlfY29kZSA9PSBOVUxMKSByZXR1cm4gLTE7CisgICAgb2JqID0gUHlEaWN0X0dldEl0ZW0oZXh0ZW5zaW9uX2NhY2hlLCBweV9jb2RlKTsKKyAgICBpZiAob2JqICE9IE5VTEwpIHsKKyAgICAgICAgLyogQmluZ28uICovCisgICAgICAgIFB5X0RFQ1JFRihweV9jb2RlKTsKKyAgICAgICAgUERBVEFfQVBQRU5EKHNlbGYtPnN0YWNrLCBvYmosIC0xKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCi0JLyogTG9vayB1cCB0aGUgKG1vZHVsZV9uYW1lLCBjbGFzc19uYW1lKSBwYWlyLiAqLwotCXBhaXIgPSBQeURpY3RfR2V0SXRlbShpbnZlcnRlZF9yZWdpc3RyeSwgcHlfY29kZSk7Ci0JaWYgKHBhaXIgPT0gTlVMTCkgewotCQlQeV9ERUNSRUYocHlfY29kZSk7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLCAidW5yZWdpc3RlcmVkIGV4dGVuc2lvbiAiCi0JCQkgICAgICJjb2RlICVsZCIsIGNvZGUpOwotCQlyZXR1cm4gLTE7Ci0JfQotCS8qIFNpbmNlIHRoZSBleHRlbnNpb24gcmVnaXN0cnkgaXMgbWFuaXB1bGFibGUgdmlhIFB5dGhvbiBjb2RlLAotCSAqIGNvbmZpcm0gdGhhdCBwYWlyIGlzIHJlYWxseSBhIDItdHVwbGUgb2Ygc3RyaW5ncy4KLQkgKi8KLQlpZiAoIVB5VHVwbGVfQ2hlY2socGFpcikgfHwgUHlUdXBsZV9TaXplKHBhaXIpICE9IDIgfHwKLQkgICAgIVB5U3RyaW5nX0NoZWNrKG1vZHVsZV9uYW1lID0gUHlUdXBsZV9HRVRfSVRFTShwYWlyLCAwKSkgfHwKLQkgICAgIVB5U3RyaW5nX0NoZWNrKGNsYXNzX25hbWUgPSBQeVR1cGxlX0dFVF9JVEVNKHBhaXIsIDEpKSkgewotCQlQeV9ERUNSRUYocHlfY29kZSk7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLCAiX2ludmVydGVkX3JlZ2lzdHJ5WyVsZF0gIgotCQkJICAgICAiaXNuJ3QgYSAyLXR1cGxlIG9mIHN0cmluZ3MiLCBjb2RlKTsKLQkJcmV0dXJuIC0xOwotCX0KLQkvKiBMb2FkIHRoZSBvYmplY3QuICovCi0Jb2JqID0gZmluZF9jbGFzcyhtb2R1bGVfbmFtZSwgY2xhc3NfbmFtZSwgc2VsZi0+ZmluZF9jbGFzcyk7Ci0JaWYgKG9iaiA9PSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRihweV9jb2RlKTsKLQkJcmV0dXJuIC0xOwotCX0KLQkvKiBDYWNoZSBjb2RlIC0+IG9iai4gKi8KLQljb2RlID0gUHlEaWN0X1NldEl0ZW0oZXh0ZW5zaW9uX2NhY2hlLCBweV9jb2RlLCBvYmopOwotCVB5X0RFQ1JFRihweV9jb2RlKTsKLQlpZiAoY29kZSA8IDApIHsKLQkJUHlfREVDUkVGKG9iaik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JUERBVEFfUFVTSChzZWxmLT5zdGFjaywgb2JqLCAtMSk7Ci0JcmV0dXJuIDA7CisgICAgLyogTG9vayB1cCB0aGUgKG1vZHVsZV9uYW1lLCBjbGFzc19uYW1lKSBwYWlyLiAqLworICAgIHBhaXIgPSBQeURpY3RfR2V0SXRlbShpbnZlcnRlZF9yZWdpc3RyeSwgcHlfY29kZSk7CisgICAgaWYgKHBhaXIgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYocHlfY29kZSk7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLCAidW5yZWdpc3RlcmVkIGV4dGVuc2lvbiAiCisgICAgICAgICAgICAgICAgICAgICAiY29kZSAlbGQiLCBjb2RlKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICAvKiBTaW5jZSB0aGUgZXh0ZW5zaW9uIHJlZ2lzdHJ5IGlzIG1hbmlwdWxhYmxlIHZpYSBQeXRob24gY29kZSwKKyAgICAgKiBjb25maXJtIHRoYXQgcGFpciBpcyByZWFsbHkgYSAyLXR1cGxlIG9mIHN0cmluZ3MuCisgICAgICovCisgICAgaWYgKCFQeVR1cGxlX0NoZWNrKHBhaXIpIHx8IFB5VHVwbGVfU2l6ZShwYWlyKSAhPSAyIHx8CisgICAgICAgICFQeVN0cmluZ19DaGVjayhtb2R1bGVfbmFtZSA9IFB5VHVwbGVfR0VUX0lURU0ocGFpciwgMCkpIHx8CisgICAgICAgICFQeVN0cmluZ19DaGVjayhjbGFzc19uYW1lID0gUHlUdXBsZV9HRVRfSVRFTShwYWlyLCAxKSkpIHsKKyAgICAgICAgUHlfREVDUkVGKHB5X2NvZGUpOworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwgIl9pbnZlcnRlZF9yZWdpc3RyeVslbGRdICIKKyAgICAgICAgICAgICAgICAgICAgICJpc24ndCBhIDItdHVwbGUgb2Ygc3RyaW5ncyIsIGNvZGUpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIC8qIExvYWQgdGhlIG9iamVjdC4gKi8KKyAgICBvYmogPSBmaW5kX2NsYXNzKG1vZHVsZV9uYW1lLCBjbGFzc19uYW1lLCBzZWxmLT5maW5kX2NsYXNzKTsKKyAgICBpZiAob2JqID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKHB5X2NvZGUpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIC8qIENhY2hlIGNvZGUgLT4gb2JqLiAqLworICAgIGNvZGUgPSBQeURpY3RfU2V0SXRlbShleHRlbnNpb25fY2FjaGUsIHB5X2NvZGUsIG9iaik7CisgICAgUHlfREVDUkVGKHB5X2NvZGUpOworICAgIGlmIChjb2RlIDwgMCkgeworICAgICAgICBQeV9ERUNSRUYob2JqKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBQREFUQV9QVVNIKHNlbGYtPnN0YWNrLCBvYmosIC0xKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogbG9hZF9wdXQoVW5waWNrbGVyb2JqZWN0ICpzZWxmKQogewotCVB5T2JqZWN0ICpweV9zdHIgPSAwLCAqdmFsdWUgPSAwOwotCWludCBsZW4sIGw7Ci0JY2hhciAqczsKKyAgICBQeU9iamVjdCAqcHlfc3RyID0gMCwgKnZhbHVlID0gMDsKKyAgICBpbnQgbGVuLCBsOworICAgIGNoYXIgKnM7CiAKLQlpZiAoKGwgPSBzZWxmLT5yZWFkbGluZV9mdW5jKHNlbGYsICZzKSkgPCAwKSByZXR1cm4gLTE7Ci0JaWYgKGwgPCAyKSByZXR1cm4gYmFkX3JlYWRsaW5lKCk7Ci0JaWYgKCEoIGxlbj1zZWxmLT5zdGFjay0+bGVuZ3RoICkpICByZXR1cm4gc3RhY2tVbmRlcmZsb3coKTsKLQlpZiAoISggcHlfc3RyID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocywgbCAtIDEpKSkgIHJldHVybiAtMTsKLQl2YWx1ZT1zZWxmLT5zdGFjay0+ZGF0YVtsZW4tMV07Ci0JbD1QeURpY3RfU2V0SXRlbShzZWxmLT5tZW1vLCBweV9zdHIsIHZhbHVlKTsKLQlQeV9ERUNSRUYocHlfc3RyKTsKLQlyZXR1cm4gbDsKKyAgICBpZiAoKGwgPSBzZWxmLT5yZWFkbGluZV9mdW5jKHNlbGYsICZzKSkgPCAwKSByZXR1cm4gLTE7CisgICAgaWYgKGwgPCAyKSByZXR1cm4gYmFkX3JlYWRsaW5lKCk7CisgICAgaWYgKCEoIGxlbj1zZWxmLT5zdGFjay0+bGVuZ3RoICkpICByZXR1cm4gc3RhY2tVbmRlcmZsb3coKTsKKyAgICBpZiAoISggcHlfc3RyID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocywgbCAtIDEpKSkgIHJldHVybiAtMTsKKyAgICB2YWx1ZT1zZWxmLT5zdGFjay0+ZGF0YVtsZW4tMV07CisgICAgbD1QeURpY3RfU2V0SXRlbShzZWxmLT5tZW1vLCBweV9zdHIsIHZhbHVlKTsKKyAgICBQeV9ERUNSRUYocHlfc3RyKTsKKyAgICByZXR1cm4gbDsKIH0KIAogCiBzdGF0aWMgaW50CiBsb2FkX2JpbnB1dChVbnBpY2tsZXJvYmplY3QgKnNlbGYpCiB7Ci0JUHlPYmplY3QgKnB5X2tleSA9IDAsICp2YWx1ZSA9IDA7Ci0JdW5zaWduZWQgY2hhciBrZXk7Ci0JY2hhciAqczsKLQlpbnQgbGVuOworICAgIFB5T2JqZWN0ICpweV9rZXkgPSAwLCAqdmFsdWUgPSAwOworICAgIHVuc2lnbmVkIGNoYXIga2V5OworICAgIGNoYXIgKnM7CisgICAgaW50IGxlbjsKIAotCWlmIChzZWxmLT5yZWFkX2Z1bmMoc2VsZiwgJnMsIDEpIDwgMCkgcmV0dXJuIC0xOwotCWlmICghKCAobGVuPXNlbGYtPnN0YWNrLT5sZW5ndGgpID4gMCApKSAgcmV0dXJuIHN0YWNrVW5kZXJmbG93KCk7CisgICAgaWYgKHNlbGYtPnJlYWRfZnVuYyhzZWxmLCAmcywgMSkgPCAwKSByZXR1cm4gLTE7CisgICAgaWYgKCEoIChsZW49c2VsZi0+c3RhY2stPmxlbmd0aCkgPiAwICkpICByZXR1cm4gc3RhY2tVbmRlcmZsb3coKTsKIAotCWtleSA9ICh1bnNpZ25lZCBjaGFyKXNbMF07CisgICAga2V5ID0gKHVuc2lnbmVkIGNoYXIpc1swXTsKIAotCWlmICghKCBweV9rZXkgPSBQeUludF9Gcm9tTG9uZygobG9uZylrZXkpKSkgIHJldHVybiAtMTsKLQl2YWx1ZT1zZWxmLT5zdGFjay0+ZGF0YVtsZW4tMV07Ci0JbGVuPVB5RGljdF9TZXRJdGVtKHNlbGYtPm1lbW8sIHB5X2tleSwgdmFsdWUpOwotCVB5X0RFQ1JFRihweV9rZXkpOwotCXJldHVybiBsZW47CisgICAgaWYgKCEoIHB5X2tleSA9IFB5SW50X0Zyb21Mb25nKChsb25nKWtleSkpKSAgcmV0dXJuIC0xOworICAgIHZhbHVlPXNlbGYtPnN0YWNrLT5kYXRhW2xlbi0xXTsKKyAgICBsZW49UHlEaWN0X1NldEl0ZW0oc2VsZi0+bWVtbywgcHlfa2V5LCB2YWx1ZSk7CisgICAgUHlfREVDUkVGKHB5X2tleSk7CisgICAgcmV0dXJuIGxlbjsKIH0KIAogCiBzdGF0aWMgaW50CiBsb2FkX2xvbmdfYmlucHV0KFVucGlja2xlcm9iamVjdCAqc2VsZikKIHsKLQlQeU9iamVjdCAqcHlfa2V5ID0gMCwgKnZhbHVlID0gMDsKLQlsb25nIGtleTsKLQl1bnNpZ25lZCBjaGFyIGM7Ci0JY2hhciAqczsKLQlpbnQgbGVuOworICAgIFB5T2JqZWN0ICpweV9rZXkgPSAwLCAqdmFsdWUgPSAwOworICAgIGxvbmcga2V5OworICAgIHVuc2lnbmVkIGNoYXIgYzsKKyAgICBjaGFyICpzOworICAgIGludCBsZW47CiAKLQlpZiAoc2VsZi0+cmVhZF9mdW5jKHNlbGYsICZzLCA0KSA8IDApIHJldHVybiAtMTsKLQlpZiAoISggbGVuPXNlbGYtPnN0YWNrLT5sZW5ndGggKSkgIHJldHVybiBzdGFja1VuZGVyZmxvdygpOworICAgIGlmIChzZWxmLT5yZWFkX2Z1bmMoc2VsZiwgJnMsIDQpIDwgMCkgcmV0dXJuIC0xOworICAgIGlmICghKCBsZW49c2VsZi0+c3RhY2stPmxlbmd0aCApKSAgcmV0dXJuIHN0YWNrVW5kZXJmbG93KCk7CiAKLQljID0gKHVuc2lnbmVkIGNoYXIpc1swXTsKLQlrZXkgPSAobG9uZyljOwotCWMgPSAodW5zaWduZWQgY2hhcilzWzFdOwotCWtleSB8PSAobG9uZyljIDw8IDg7Ci0JYyA9ICh1bnNpZ25lZCBjaGFyKXNbMl07Ci0Ja2V5IHw9IChsb25nKWMgPDwgMTY7Ci0JYyA9ICh1bnNpZ25lZCBjaGFyKXNbM107Ci0Ja2V5IHw9IChsb25nKWMgPDwgMjQ7CisgICAgYyA9ICh1bnNpZ25lZCBjaGFyKXNbMF07CisgICAga2V5ID0gKGxvbmcpYzsKKyAgICBjID0gKHVuc2lnbmVkIGNoYXIpc1sxXTsKKyAgICBrZXkgfD0gKGxvbmcpYyA8PCA4OworICAgIGMgPSAodW5zaWduZWQgY2hhcilzWzJdOworICAgIGtleSB8PSAobG9uZyljIDw8IDE2OworICAgIGMgPSAodW5zaWduZWQgY2hhcilzWzNdOworICAgIGtleSB8PSAobG9uZyljIDw8IDI0OwogCi0JaWYgKCEoIHB5X2tleSA9IFB5SW50X0Zyb21Mb25nKGtleSkpKSAgcmV0dXJuIC0xOwotCXZhbHVlPXNlbGYtPnN0YWNrLT5kYXRhW2xlbi0xXTsKLQlsZW49UHlEaWN0X1NldEl0ZW0oc2VsZi0+bWVtbywgcHlfa2V5LCB2YWx1ZSk7Ci0JUHlfREVDUkVGKHB5X2tleSk7Ci0JcmV0dXJuIGxlbjsKKyAgICBpZiAoISggcHlfa2V5ID0gUHlJbnRfRnJvbUxvbmcoa2V5KSkpICByZXR1cm4gLTE7CisgICAgdmFsdWU9c2VsZi0+c3RhY2stPmRhdGFbbGVuLTFdOworICAgIGxlbj1QeURpY3RfU2V0SXRlbShzZWxmLT5tZW1vLCBweV9rZXksIHZhbHVlKTsKKyAgICBQeV9ERUNSRUYocHlfa2V5KTsKKyAgICByZXR1cm4gbGVuOwogfQogCiAKIHN0YXRpYyBpbnQKIGRvX2FwcGVuZChVbnBpY2tsZXJvYmplY3QgKnNlbGYsIGludCAgeCkKIHsKLQlQeU9iamVjdCAqdmFsdWUgPSAwLCAqbGlzdCA9IDAsICphcHBlbmRfbWV0aG9kID0gMDsKLQlpbnQgbGVuLCBpOworICAgIFB5T2JqZWN0ICp2YWx1ZSA9IDAsICpsaXN0ID0gMCwgKmFwcGVuZF9tZXRob2QgPSAwOworICAgIGludCBsZW4sIGk7CiAKLQlsZW49c2VsZi0+c3RhY2stPmxlbmd0aDsKLQlpZiAoISggbGVuID49IHggJiYgeCA+IDAgKSkgIHJldHVybiBzdGFja1VuZGVyZmxvdygpOwotCS8qIG5vdGhpbmcgdG8gZG8gKi8KLQlpZiAobGVuPT14KSByZXR1cm4gMDsKKyAgICBsZW49c2VsZi0+c3RhY2stPmxlbmd0aDsKKyAgICBpZiAoISggbGVuID49IHggJiYgeCA+IDAgKSkgIHJldHVybiBzdGFja1VuZGVyZmxvdygpOworICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KKyAgICBpZiAobGVuPT14KSByZXR1cm4gMDsKIAotCWxpc3Q9c2VsZi0+c3RhY2stPmRhdGFbeC0xXTsKKyAgICBsaXN0PXNlbGYtPnN0YWNrLT5kYXRhW3gtMV07CiAKLQlpZiAoUHlMaXN0X0NoZWNrKGxpc3QpKSB7Ci0JCVB5T2JqZWN0ICpzbGljZTsKLQkJaW50IGxpc3RfbGVuOworICAgIGlmIChQeUxpc3RfQ2hlY2sobGlzdCkpIHsKKyAgICAgICAgUHlPYmplY3QgKnNsaWNlOworICAgICAgICBpbnQgbGlzdF9sZW47CiAKLQkJc2xpY2U9UGRhdGFfcG9wTGlzdChzZWxmLT5zdGFjaywgeCk7Ci0JCWlmICghIHNsaWNlKSByZXR1cm4gLTE7Ci0JCWxpc3RfbGVuID0gUHlMaXN0X0dFVF9TSVpFKGxpc3QpOwotCQlpPVB5TGlzdF9TZXRTbGljZShsaXN0LCBsaXN0X2xlbiwgbGlzdF9sZW4sIHNsaWNlKTsKLQkJUHlfREVDUkVGKHNsaWNlKTsKLQkJcmV0dXJuIGk7Ci0JfQotCWVsc2UgeworICAgICAgICBzbGljZT1QZGF0YV9wb3BMaXN0KHNlbGYtPnN0YWNrLCB4KTsKKyAgICAgICAgaWYgKCEgc2xpY2UpIHJldHVybiAtMTsKKyAgICAgICAgbGlzdF9sZW4gPSBQeUxpc3RfR0VUX1NJWkUobGlzdCk7CisgICAgICAgIGk9UHlMaXN0X1NldFNsaWNlKGxpc3QsIGxpc3RfbGVuLCBsaXN0X2xlbiwgc2xpY2UpOworICAgICAgICBQeV9ERUNSRUYoc2xpY2UpOworICAgICAgICByZXR1cm4gaTsKKyAgICB9CisgICAgZWxzZSB7CiAKLQkJaWYgKCEoIGFwcGVuZF9tZXRob2QgPSBQeU9iamVjdF9HZXRBdHRyKGxpc3QsIGFwcGVuZF9zdHIpKSkKLQkJCXJldHVybiAtMTsKKyAgICAgICAgaWYgKCEoIGFwcGVuZF9tZXRob2QgPSBQeU9iamVjdF9HZXRBdHRyKGxpc3QsIGFwcGVuZF9zdHIpKSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKIAotCQlmb3IgKGkgPSB4OyBpIDwgbGVuOyBpKyspIHsKLQkJCVB5T2JqZWN0ICpqdW5rOworICAgICAgICBmb3IgKGkgPSB4OyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpqdW5rOwogCi0JCQl2YWx1ZT1zZWxmLT5zdGFjay0+ZGF0YVtpXTsKLQkJCWp1bms9MDsKLQkJCUFSR19UVVAoc2VsZiwgdmFsdWUpOwotCQkJaWYgKHNlbGYtPmFyZykgewotCQkJCWp1bmsgPSBQeU9iamVjdF9DYWxsKGFwcGVuZF9tZXRob2QsIHNlbGYtPmFyZywKLQkJCQkJCSAgICAgTlVMTCk7Ci0JCQkJRlJFRV9BUkdfVFVQKHNlbGYpOwotCQkJfQotCQkJaWYgKCEganVuaykgewotCQkJCVBkYXRhX2NsZWFyKHNlbGYtPnN0YWNrLCBpKzEpOwotCQkJCXNlbGYtPnN0YWNrLT5sZW5ndGg9eDsKLQkJCQlQeV9ERUNSRUYoYXBwZW5kX21ldGhvZCk7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQkJUHlfREVDUkVGKGp1bmspOwotCQl9Ci0JCXNlbGYtPnN0YWNrLT5sZW5ndGg9eDsKLQkJUHlfREVDUkVGKGFwcGVuZF9tZXRob2QpOwotCX0KKyAgICAgICAgICAgIHZhbHVlPXNlbGYtPnN0YWNrLT5kYXRhW2ldOworICAgICAgICAgICAganVuaz0wOworICAgICAgICAgICAgQVJHX1RVUChzZWxmLCB2YWx1ZSk7CisgICAgICAgICAgICBpZiAoc2VsZi0+YXJnKSB7CisgICAgICAgICAgICAgICAganVuayA9IFB5T2JqZWN0X0NhbGwoYXBwZW5kX21ldGhvZCwgc2VsZi0+YXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICAgICAgICAgIEZSRUVfQVJHX1RVUChzZWxmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghIGp1bmspIHsKKyAgICAgICAgICAgICAgICBQZGF0YV9jbGVhcihzZWxmLT5zdGFjaywgaSsxKTsKKyAgICAgICAgICAgICAgICBzZWxmLT5zdGFjay0+bGVuZ3RoPXg7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGFwcGVuZF9tZXRob2QpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5X0RFQ1JFRihqdW5rKTsKKyAgICAgICAgfQorICAgICAgICBzZWxmLT5zdGFjay0+bGVuZ3RoPXg7CisgICAgICAgIFB5X0RFQ1JFRihhcHBlbmRfbWV0aG9kKTsKKyAgICB9CiAKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKIH0KIAogCiBzdGF0aWMgaW50CiBsb2FkX2FwcGVuZChVbnBpY2tsZXJvYmplY3QgKnNlbGYpCiB7Ci0JcmV0dXJuIGRvX2FwcGVuZChzZWxmLCBzZWxmLT5zdGFjay0+bGVuZ3RoIC0gMSk7CisgICAgcmV0dXJuIGRvX2FwcGVuZChzZWxmLCBzZWxmLT5zdGFjay0+bGVuZ3RoIC0gMSk7CiB9CiAKIAogc3RhdGljIGludAogbG9hZF9hcHBlbmRzKFVucGlja2xlcm9iamVjdCAqc2VsZikKIHsKLQlyZXR1cm4gZG9fYXBwZW5kKHNlbGYsIG1hcmtlcihzZWxmKSk7CisgICAgcmV0dXJuIGRvX2FwcGVuZChzZWxmLCBtYXJrZXIoc2VsZikpOwogfQogCiAKIHN0YXRpYyBpbnQKIGRvX3NldGl0ZW1zKFVucGlja2xlcm9iamVjdCAqc2VsZiwgaW50ICB4KQogewotCVB5T2JqZWN0ICp2YWx1ZSA9IDAsICprZXkgPSAwLCAqZGljdCA9IDA7Ci0JaW50IGxlbiwgaSwgcj0wOworICAgIFB5T2JqZWN0ICp2YWx1ZSA9IDAsICprZXkgPSAwLCAqZGljdCA9IDA7CisgICAgaW50IGxlbiwgaSwgcj0wOwogCi0JaWYgKCEoIChsZW49c2VsZi0+c3RhY2stPmxlbmd0aCkgPj0geAotCSAgICAgICAmJiB4ID4gMCApKSAgcmV0dXJuIHN0YWNrVW5kZXJmbG93KCk7CisgICAgaWYgKCEoIChsZW49c2VsZi0+c3RhY2stPmxlbmd0aCkgPj0geAorICAgICAgICAgICAmJiB4ID4gMCApKSAgcmV0dXJuIHN0YWNrVW5kZXJmbG93KCk7CiAKLQlkaWN0PXNlbGYtPnN0YWNrLT5kYXRhW3gtMV07CisgICAgZGljdD1zZWxmLT5zdGFjay0+ZGF0YVt4LTFdOwogCi0JZm9yIChpID0geCsxOyBpIDwgbGVuOyBpICs9IDIpIHsKLQkJa2V5ICA9c2VsZi0+c3RhY2stPmRhdGFbaS0xXTsKLQkJdmFsdWU9c2VsZi0+c3RhY2stPmRhdGFbaSAgXTsKLQkJaWYgKFB5T2JqZWN0X1NldEl0ZW0oZGljdCwga2V5LCB2YWx1ZSkgPCAwKSB7Ci0JCQlyPS0xOwotCQkJYnJlYWs7Ci0JCX0KLQl9CisgICAgZm9yIChpID0geCsxOyBpIDwgbGVuOyBpICs9IDIpIHsKKyAgICAgICAga2V5ICA9c2VsZi0+c3RhY2stPmRhdGFbaS0xXTsKKyAgICAgICAgdmFsdWU9c2VsZi0+c3RhY2stPmRhdGFbaSAgXTsKKyAgICAgICAgaWYgKFB5T2JqZWN0X1NldEl0ZW0oZGljdCwga2V5LCB2YWx1ZSkgPCAwKSB7CisgICAgICAgICAgICByPS0xOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CiAKLQlQZGF0YV9jbGVhcihzZWxmLT5zdGFjaywgeCk7CisgICAgUGRhdGFfY2xlYXIoc2VsZi0+c3RhY2ssIHgpOwogCi0JcmV0dXJuIHI7CisgICAgcmV0dXJuIHI7CiB9CiAKIAogc3RhdGljIGludAogbG9hZF9zZXRpdGVtKFVucGlja2xlcm9iamVjdCAqc2VsZikKIHsKLQlyZXR1cm4gZG9fc2V0aXRlbXMoc2VsZiwgc2VsZi0+c3RhY2stPmxlbmd0aCAtIDIpOworICAgIHJldHVybiBkb19zZXRpdGVtcyhzZWxmLCBzZWxmLT5zdGFjay0+bGVuZ3RoIC0gMik7CiB9CiAKIHN0YXRpYyBpbnQKIGxvYWRfc2V0aXRlbXMoVW5waWNrbGVyb2JqZWN0ICpzZWxmKQogewotCXJldHVybiBkb19zZXRpdGVtcyhzZWxmLCBtYXJrZXIoc2VsZikpOworICAgIHJldHVybiBkb19zZXRpdGVtcyhzZWxmLCBtYXJrZXIoc2VsZikpOwogfQogCiAKIHN0YXRpYyBpbnQKIGxvYWRfYnVpbGQoVW5waWNrbGVyb2JqZWN0ICpzZWxmKQogewotCVB5T2JqZWN0ICpzdGF0ZSwgKmluc3QsICpzbG90c3RhdGU7Ci0JUHlPYmplY3QgKl9fc2V0c3RhdGVfXzsKLQlQeU9iamVjdCAqZF9rZXksICpkX3ZhbHVlOwotCVB5X3NzaXplX3QgaTsKLQlpbnQgcmVzID0gLTE7CisgICAgUHlPYmplY3QgKnN0YXRlLCAqaW5zdCwgKnNsb3RzdGF0ZTsKKyAgICBQeU9iamVjdCAqX19zZXRzdGF0ZV9fOworICAgIFB5T2JqZWN0ICpkX2tleSwgKmRfdmFsdWU7CisgICAgUHlfc3NpemVfdCBpOworICAgIGludCByZXMgPSAtMTsKIAotCS8qIFN0YWNrIGlzIC4uLiBpbnN0YW5jZSwgc3RhdGUuICBXZSB3YW50IHRvIGxlYXZlIGluc3RhbmNlIGF0Ci0JICogdGhlIHN0YWNrIHRvcCwgcG9zc2libHkgbXV0YXRlZCB2aWEgaW5zdGFuY2UuX19zZXRzdGF0ZV9fKHN0YXRlKS4KLQkgKi8KLQlpZiAoc2VsZi0+c3RhY2stPmxlbmd0aCA8IDIpCi0JCXJldHVybiBzdGFja1VuZGVyZmxvdygpOwotCVBEQVRBX1BPUChzZWxmLT5zdGFjaywgc3RhdGUpOwotCWlmIChzdGF0ZSA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0JaW5zdCA9IHNlbGYtPnN0YWNrLT5kYXRhW3NlbGYtPnN0YWNrLT5sZW5ndGggLSAxXTsKKyAgICAvKiBTdGFjayBpcyAuLi4gaW5zdGFuY2UsIHN0YXRlLiAgV2Ugd2FudCB0byBsZWF2ZSBpbnN0YW5jZSBhdAorICAgICAqIHRoZSBzdGFjayB0b3AsIHBvc3NpYmx5IG11dGF0ZWQgdmlhIGluc3RhbmNlLl9fc2V0c3RhdGVfXyhzdGF0ZSkuCisgICAgICovCisgICAgaWYgKHNlbGYtPnN0YWNrLT5sZW5ndGggPCAyKQorICAgICAgICByZXR1cm4gc3RhY2tVbmRlcmZsb3coKTsKKyAgICBQREFUQV9QT1Aoc2VsZi0+c3RhY2ssIHN0YXRlKTsKKyAgICBpZiAoc3RhdGUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGluc3QgPSBzZWxmLT5zdGFjay0+ZGF0YVtzZWxmLT5zdGFjay0+bGVuZ3RoIC0gMV07CiAKLQlfX3NldHN0YXRlX18gPSBQeU9iamVjdF9HZXRBdHRyKGluc3QsIF9fc2V0c3RhdGVfX19zdHIpOwotCWlmIChfX3NldHN0YXRlX18gIT0gTlVMTCkgewotCQlQeU9iamVjdCAqanVuayA9IE5VTEw7CisgICAgX19zZXRzdGF0ZV9fID0gUHlPYmplY3RfR2V0QXR0cihpbnN0LCBfX3NldHN0YXRlX19fc3RyKTsKKyAgICBpZiAoX19zZXRzdGF0ZV9fICE9IE5VTEwpIHsKKyAgICAgICAgUHlPYmplY3QgKmp1bmsgPSBOVUxMOwogCi0JCS8qIFRoZSBleHBsaWNpdCBfX3NldHN0YXRlX18gaXMgcmVzcG9uc2libGUgZm9yIGV2ZXJ5dGhpbmcuICovCi0JCUFSR19UVVAoc2VsZiwgc3RhdGUpOwotCQlpZiAoc2VsZi0+YXJnKSB7Ci0JCQlqdW5rID0gUHlPYmplY3RfQ2FsbChfX3NldHN0YXRlX18sIHNlbGYtPmFyZywgTlVMTCk7Ci0JCQlGUkVFX0FSR19UVVAoc2VsZik7Ci0JCX0KLQkJUHlfREVDUkVGKF9fc2V0c3RhdGVfXyk7Ci0JCWlmIChqdW5rID09IE5VTEwpCi0JCQlyZXR1cm4gLTE7Ci0JCVB5X0RFQ1JFRihqdW5rKTsKLQkJcmV0dXJuIDA7Ci0JfQotCWlmICghUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19BdHRyaWJ1dGVFcnJvcikpCi0JCXJldHVybiAtMTsKLQlQeUVycl9DbGVhcigpOworICAgICAgICAvKiBUaGUgZXhwbGljaXQgX19zZXRzdGF0ZV9fIGlzIHJlc3BvbnNpYmxlIGZvciBldmVyeXRoaW5nLiAqLworICAgICAgICBBUkdfVFVQKHNlbGYsIHN0YXRlKTsKKyAgICAgICAgaWYgKHNlbGYtPmFyZykgeworICAgICAgICAgICAganVuayA9IFB5T2JqZWN0X0NhbGwoX19zZXRzdGF0ZV9fLCBzZWxmLT5hcmcsIE5VTEwpOworICAgICAgICAgICAgRlJFRV9BUkdfVFVQKHNlbGYpOworICAgICAgICB9CisgICAgICAgIFB5X0RFQ1JFRihfX3NldHN0YXRlX18pOworICAgICAgICBpZiAoanVuayA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBQeV9ERUNSRUYoanVuayk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfQXR0cmlidXRlRXJyb3IpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgUHlFcnJfQ2xlYXIoKTsKIAotCS8qIEEgZGVmYXVsdCBfX3NldHN0YXRlX18uICBGaXJzdCBzZWUgd2hldGhlciBzdGF0ZSBlbWJlZHMgYQotCSAqIHNsb3Qgc3RhdGUgZGljdCB0b28gKGEgcHJvdG8gMiBhZGRpdGlvbikuCi0JICovCi0JaWYgKFB5VHVwbGVfQ2hlY2soc3RhdGUpICYmIFB5VHVwbGVfU2l6ZShzdGF0ZSkgPT0gMikgewotCQlQeU9iamVjdCAqdGVtcCA9IHN0YXRlOwotCQlzdGF0ZSA9IFB5VHVwbGVfR0VUX0lURU0odGVtcCwgMCk7Ci0JCXNsb3RzdGF0ZSA9IFB5VHVwbGVfR0VUX0lURU0odGVtcCwgMSk7Ci0JCVB5X0lOQ1JFRihzdGF0ZSk7Ci0JCVB5X0lOQ1JFRihzbG90c3RhdGUpOwotCQlQeV9ERUNSRUYodGVtcCk7Ci0JfQotCWVsc2UKLQkJc2xvdHN0YXRlID0gTlVMTDsKKyAgICAvKiBBIGRlZmF1bHQgX19zZXRzdGF0ZV9fLiAgRmlyc3Qgc2VlIHdoZXRoZXIgc3RhdGUgZW1iZWRzIGEKKyAgICAgKiBzbG90IHN0YXRlIGRpY3QgdG9vIChhIHByb3RvIDIgYWRkaXRpb24pLgorICAgICAqLworICAgIGlmIChQeVR1cGxlX0NoZWNrKHN0YXRlKSAmJiBQeVR1cGxlX1NpemUoc3RhdGUpID09IDIpIHsKKyAgICAgICAgUHlPYmplY3QgKnRlbXAgPSBzdGF0ZTsKKyAgICAgICAgc3RhdGUgPSBQeVR1cGxlX0dFVF9JVEVNKHRlbXAsIDApOworICAgICAgICBzbG90c3RhdGUgPSBQeVR1cGxlX0dFVF9JVEVNKHRlbXAsIDEpOworICAgICAgICBQeV9JTkNSRUYoc3RhdGUpOworICAgICAgICBQeV9JTkNSRUYoc2xvdHN0YXRlKTsKKyAgICAgICAgUHlfREVDUkVGKHRlbXApOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHNsb3RzdGF0ZSA9IE5VTEw7CiAKLQkvKiBTZXQgaW5zdC5fX2RpY3RfXyBmcm9tIHRoZSBzdGF0ZSBkaWN0IChpZiBhbnkpLiAqLwotCWlmIChzdGF0ZSAhPSBQeV9Ob25lKSB7Ci0JCVB5T2JqZWN0ICpkaWN0OwotCQlpZiAoISBQeURpY3RfQ2hlY2soc3RhdGUpKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoVW5waWNrbGluZ0Vycm9yLCAic3RhdGUgaXMgbm90IGEgIgotCQkJCQkiZGljdGlvbmFyeSIpOwotCQkJZ290byBmaW5hbGx5OwotCQl9Ci0JCWRpY3QgPSBQeU9iamVjdF9HZXRBdHRyKGluc3QsIF9fZGljdF9fX3N0cik7Ci0JCWlmIChkaWN0ID09IE5VTEwpCi0JCQlnb3RvIGZpbmFsbHk7CisgICAgLyogU2V0IGluc3QuX19kaWN0X18gZnJvbSB0aGUgc3RhdGUgZGljdCAoaWYgYW55KS4gKi8KKyAgICBpZiAoc3RhdGUgIT0gUHlfTm9uZSkgeworICAgICAgICBQeU9iamVjdCAqZGljdDsKKyAgICAgICAgaWYgKCEgUHlEaWN0X0NoZWNrKHN0YXRlKSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFVucGlja2xpbmdFcnJvciwgInN0YXRlIGlzIG5vdCBhICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGljdGlvbmFyeSIpOworICAgICAgICAgICAgZ290byBmaW5hbGx5OworICAgICAgICB9CisgICAgICAgIGRpY3QgPSBQeU9iamVjdF9HZXRBdHRyKGluc3QsIF9fZGljdF9fX3N0cik7CisgICAgICAgIGlmIChkaWN0ID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQkJaSA9IDA7Ci0JCXdoaWxlIChQeURpY3RfTmV4dChzdGF0ZSwgJmksICZkX2tleSwgJmRfdmFsdWUpKSB7Ci0JCQlpZiAoUHlPYmplY3RfU2V0SXRlbShkaWN0LCBkX2tleSwgZF92YWx1ZSkgPCAwKQotCQkJCWdvdG8gZmluYWxseTsKLQkJfQotCQlQeV9ERUNSRUYoZGljdCk7Ci0JfQorICAgICAgICBpID0gMDsKKyAgICAgICAgd2hpbGUgKFB5RGljdF9OZXh0KHN0YXRlLCAmaSwgJmRfa2V5LCAmZF92YWx1ZSkpIHsKKyAgICAgICAgICAgIGlmIChQeU9iamVjdF9TZXRJdGVtKGRpY3QsIGRfa2V5LCBkX3ZhbHVlKSA8IDApCisgICAgICAgICAgICAgICAgZ290byBmaW5hbGx5OworICAgICAgICB9CisgICAgICAgIFB5X0RFQ1JFRihkaWN0KTsKKyAgICB9CiAKLQkvKiBBbHNvIHNldCBpbnN0YW5jZSBhdHRyaWJ1dGVzIGZyb20gdGhlIHNsb3RzdGF0ZSBkaWN0IChpZiBhbnkpLiAqLwotCWlmIChzbG90c3RhdGUgIT0gTlVMTCkgewotCQlpZiAoISBQeURpY3RfQ2hlY2soc2xvdHN0YXRlKSkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFVucGlja2xpbmdFcnJvciwgInNsb3Qgc3RhdGUgaXMgbm90ICIKLQkJCQkJImEgZGljdGlvbmFyeSIpOwotCQkJZ290byBmaW5hbGx5OwotCQl9Ci0JCWkgPSAwOwotCQl3aGlsZSAoUHlEaWN0X05leHQoc2xvdHN0YXRlLCAmaSwgJmRfa2V5LCAmZF92YWx1ZSkpIHsKLQkJCWlmIChQeU9iamVjdF9TZXRBdHRyKGluc3QsIGRfa2V5LCBkX3ZhbHVlKSA8IDApCi0JCQkJZ290byBmaW5hbGx5OwotCQl9Ci0JfQotCXJlcyA9IDA7CisgICAgLyogQWxzbyBzZXQgaW5zdGFuY2UgYXR0cmlidXRlcyBmcm9tIHRoZSBzbG90c3RhdGUgZGljdCAoaWYgYW55KS4gKi8KKyAgICBpZiAoc2xvdHN0YXRlICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKCEgUHlEaWN0X0NoZWNrKHNsb3RzdGF0ZSkpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhVbnBpY2tsaW5nRXJyb3IsICJzbG90IHN0YXRlIGlzIG5vdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImEgZGljdGlvbmFyeSIpOworICAgICAgICAgICAgZ290byBmaW5hbGx5OworICAgICAgICB9CisgICAgICAgIGkgPSAwOworICAgICAgICB3aGlsZSAoUHlEaWN0X05leHQoc2xvdHN0YXRlLCAmaSwgJmRfa2V5LCAmZF92YWx1ZSkpIHsKKyAgICAgICAgICAgIGlmIChQeU9iamVjdF9TZXRBdHRyKGluc3QsIGRfa2V5LCBkX3ZhbHVlKSA8IDApCisgICAgICAgICAgICAgICAgZ290byBmaW5hbGx5OworICAgICAgICB9CisgICAgfQorICAgIHJlcyA9IDA7CiAKICAgZmluYWxseToKLQlQeV9ERUNSRUYoc3RhdGUpOwotCVB5X1hERUNSRUYoc2xvdHN0YXRlKTsKLQlyZXR1cm4gcmVzOworICAgIFB5X0RFQ1JFRihzdGF0ZSk7CisgICAgUHlfWERFQ1JFRihzbG90c3RhdGUpOworICAgIHJldHVybiByZXM7CiB9CiAKIAogc3RhdGljIGludAogbG9hZF9tYXJrKFVucGlja2xlcm9iamVjdCAqc2VsZikKIHsKLQlpbnQgczsKKyAgICBpbnQgczsKIAotCS8qIE5vdGUgdGhhdCB3ZSBzcGxpdCB0aGUgKHBpY2tsZS5weSkgc3RhY2sgaW50byB0d28gc3RhY2tzLCBhbgotCSAgIG9iamVjdCBzdGFjayBhbmQgYSBtYXJrIHN0YWNrLiBIZXJlIHdlIHB1c2ggYSBtYXJrIG9udG8gdGhlCi0JICAgbWFyayBzdGFjay4KLQkqLworICAgIC8qIE5vdGUgdGhhdCB3ZSBzcGxpdCB0aGUgKHBpY2tsZS5weSkgc3RhY2sgaW50byB0d28gc3RhY2tzLCBhbgorICAgICAgIG9iamVjdCBzdGFjayBhbmQgYSBtYXJrIHN0YWNrLiBIZXJlIHdlIHB1c2ggYSBtYXJrIG9udG8gdGhlCisgICAgICAgbWFyayBzdGFjay4KKyAgICAqLwogCi0JaWYgKChzZWxmLT5udW1fbWFya3MgKyAxKSA+PSBzZWxmLT5tYXJrc19zaXplKSB7Ci0JCWludCAqbWFya3M7Ci0JCXM9c2VsZi0+bWFya3Nfc2l6ZSsyMDsKLQkJaWYgKHMgPD0gc2VsZi0+bnVtX21hcmtzKSBzPXNlbGYtPm51bV9tYXJrcyArIDE7Ci0JCWlmIChzZWxmLT5tYXJrcyA9PSBOVUxMKQotCQkJbWFya3M9KGludCAqKW1hbGxvYyhzICogc2l6ZW9mKGludCkpOwotCQllbHNlCi0JCQltYXJrcz0oaW50ICopcmVhbGxvYyhzZWxmLT5tYXJrcywKLQkJCQkJCSAgIHMgKiBzaXplb2YoaW50KSk7Ci0JCWlmICghbWFya3MpIHsKLQkJCVB5RXJyX05vTWVtb3J5KCk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJc2VsZi0+bWFya3MgPSBtYXJrczsKLQkJc2VsZi0+bWFya3Nfc2l6ZSA9IHM7Ci0JfQorICAgIGlmICgoc2VsZi0+bnVtX21hcmtzICsgMSkgPj0gc2VsZi0+bWFya3Nfc2l6ZSkgeworICAgICAgICBpbnQgKm1hcmtzOworICAgICAgICBzPXNlbGYtPm1hcmtzX3NpemUrMjA7CisgICAgICAgIGlmIChzIDw9IHNlbGYtPm51bV9tYXJrcykgcz1zZWxmLT5udW1fbWFya3MgKyAxOworICAgICAgICBpZiAoc2VsZi0+bWFya3MgPT0gTlVMTCkKKyAgICAgICAgICAgIG1hcmtzPShpbnQgKiltYWxsb2MocyAqIHNpemVvZihpbnQpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbWFya3M9KGludCAqKXJlYWxsb2Moc2VsZi0+bWFya3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzICogc2l6ZW9mKGludCkpOworICAgICAgICBpZiAoIW1hcmtzKSB7CisgICAgICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIHNlbGYtPm1hcmtzID0gbWFya3M7CisgICAgICAgIHNlbGYtPm1hcmtzX3NpemUgPSBzOworICAgIH0KIAotCXNlbGYtPm1hcmtzW3NlbGYtPm51bV9tYXJrcysrXSA9IHNlbGYtPnN0YWNrLT5sZW5ndGg7CisgICAgc2VsZi0+bWFya3Nbc2VsZi0+bnVtX21hcmtzKytdID0gc2VsZi0+c3RhY2stPmxlbmd0aDsKIAotCXJldHVybiAwOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBsb2FkX3JlZHVjZShVbnBpY2tsZXJvYmplY3QgKnNlbGYpCiB7Ci0JUHlPYmplY3QgKmNhbGxhYmxlID0gMCwgKmFyZ190dXAgPSAwLCAqb2IgPSAwOworICAgIFB5T2JqZWN0ICpjYWxsYWJsZSA9IDAsICphcmdfdHVwID0gMCwgKm9iID0gMDsKIAotCVBEQVRBX1BPUChzZWxmLT5zdGFjaywgYXJnX3R1cCk7Ci0JaWYgKCEgYXJnX3R1cCkgcmV0dXJuIC0xOwotCVBEQVRBX1BPUChzZWxmLT5zdGFjaywgY2FsbGFibGUpOwotCWlmIChjYWxsYWJsZSkgewotCQlvYiA9IEluc3RhbmNlX05ldyhjYWxsYWJsZSwgYXJnX3R1cCk7Ci0JCVB5X0RFQ1JFRihjYWxsYWJsZSk7Ci0JfQotCVB5X0RFQ1JFRihhcmdfdHVwKTsKKyAgICBQREFUQV9QT1Aoc2VsZi0+c3RhY2ssIGFyZ190dXApOworICAgIGlmICghIGFyZ190dXApIHJldHVybiAtMTsKKyAgICBQREFUQV9QT1Aoc2VsZi0+c3RhY2ssIGNhbGxhYmxlKTsKKyAgICBpZiAoY2FsbGFibGUpIHsKKyAgICAgICAgb2IgPSBJbnN0YW5jZV9OZXcoY2FsbGFibGUsIGFyZ190dXApOworICAgICAgICBQeV9ERUNSRUYoY2FsbGFibGUpOworICAgIH0KKyAgICBQeV9ERUNSRUYoYXJnX3R1cCk7CiAKLQlpZiAoISBvYikgcmV0dXJuIC0xOworICAgIGlmICghIG9iKSByZXR1cm4gLTE7CiAKLQlQREFUQV9QVVNIKHNlbGYtPnN0YWNrLCBvYiwgLTEpOwotCXJldHVybiAwOworICAgIFBEQVRBX1BVU0goc2VsZi0+c3RhY2ssIG9iLCAtMSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIC8qIEp1c3QgcmFpc2VzIGFuIGVycm9yIGlmIHdlIGRvbid0IGtub3cgdGhlIHByb3RvY29sIHNwZWNpZmllZC4gIFBST1RPCkBAIC00NTYzLDMyNyArNDU2MywzMjcgQEAKIHN0YXRpYyBpbnQKIGxvYWRfcHJvdG8oVW5waWNrbGVyb2JqZWN0ICpzZWxmKQogewotCWludCBpOwotCWNoYXIgKnByb3RvYnl0ZTsKKyAgICBpbnQgaTsKKyAgICBjaGFyICpwcm90b2J5dGU7CiAKLQlpID0gc2VsZi0+cmVhZF9mdW5jKHNlbGYsICZwcm90b2J5dGUsIDEpOwotCWlmIChpIDwgMCkKLQkJcmV0dXJuIC0xOworICAgIGkgPSBzZWxmLT5yZWFkX2Z1bmMoc2VsZiwgJnByb3RvYnl0ZSwgMSk7CisgICAgaWYgKGkgPCAwKQorICAgICAgICByZXR1cm4gLTE7CiAKLQlpID0gY2FsY19iaW5pbnQocHJvdG9ieXRlLCAxKTsKLQkvKiBObyBwb2ludCBjaGVja2luZyBmb3IgPCAwLCBzaW5jZSBjYWxjX2JpbmludCByZXR1cm5zIGFuIHVuc2lnbmVkCi0JICogaW50IHdoZW4gY2hld2luZyBvbiAxIGJ5dGUuCi0JICovCi0JYXNzZXJ0KGkgPj0gMCk7Ci0JaWYgKGkgPD0gSElHSEVTVF9QUk9UT0NPTCkKLQkJcmV0dXJuIDA7CisgICAgaSA9IGNhbGNfYmluaW50KHByb3RvYnl0ZSwgMSk7CisgICAgLyogTm8gcG9pbnQgY2hlY2tpbmcgZm9yIDwgMCwgc2luY2UgY2FsY19iaW5pbnQgcmV0dXJucyBhbiB1bnNpZ25lZAorICAgICAqIGludCB3aGVuIGNoZXdpbmcgb24gMSBieXRlLgorICAgICAqLworICAgIGFzc2VydChpID49IDApOworICAgIGlmIChpIDw9IEhJR0hFU1RfUFJPVE9DT0wpCisgICAgICAgIHJldHVybiAwOwogCi0JUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsICJ1bnN1cHBvcnRlZCBwaWNrbGUgcHJvdG9jb2w6ICVkIiwgaSk7Ci0JcmV0dXJuIC0xOworICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLCAidW5zdXBwb3J0ZWQgcGlja2xlIHByb3RvY29sOiAlZCIsIGkpOworICAgIHJldHVybiAtMTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGxvYWQoVW5waWNrbGVyb2JqZWN0ICpzZWxmKQogewotCVB5T2JqZWN0ICplcnIgPSAwLCAqdmFsID0gMDsKLQljaGFyICpzOworICAgIFB5T2JqZWN0ICplcnIgPSAwLCAqdmFsID0gMDsKKyAgICBjaGFyICpzOwogCi0Jc2VsZi0+bnVtX21hcmtzID0gMDsKLQlpZiAoc2VsZi0+c3RhY2stPmxlbmd0aCkgUGRhdGFfY2xlYXIoc2VsZi0+c3RhY2ssIDApOworICAgIHNlbGYtPm51bV9tYXJrcyA9IDA7CisgICAgaWYgKHNlbGYtPnN0YWNrLT5sZW5ndGgpIFBkYXRhX2NsZWFyKHNlbGYtPnN0YWNrLCAwKTsKIAotCXdoaWxlICgxKSB7Ci0JCWlmIChzZWxmLT5yZWFkX2Z1bmMoc2VsZiwgJnMsIDEpIDwgMCkKLQkJCWJyZWFrOworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGlmIChzZWxmLT5yZWFkX2Z1bmMoc2VsZiwgJnMsIDEpIDwgMCkKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCXN3aXRjaCAoc1swXSkgewotCQljYXNlIE5PTkU6Ci0JCQlpZiAobG9hZF9ub25lKHNlbGYpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBzd2l0Y2ggKHNbMF0pIHsKKyAgICAgICAgY2FzZSBOT05FOgorICAgICAgICAgICAgaWYgKGxvYWRfbm9uZShzZWxmKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIEJJTklOVDoKLQkJCWlmIChsb2FkX2JpbmludChzZWxmKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBCSU5JTlQ6CisgICAgICAgICAgICBpZiAobG9hZF9iaW5pbnQoc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBCSU5JTlQxOgotCQkJaWYgKGxvYWRfYmluaW50MShzZWxmKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBCSU5JTlQxOgorICAgICAgICAgICAgaWYgKGxvYWRfYmluaW50MShzZWxmKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIEJJTklOVDI6Ci0JCQlpZiAobG9hZF9iaW5pbnQyKHNlbGYpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIEJJTklOVDI6CisgICAgICAgICAgICBpZiAobG9hZF9iaW5pbnQyKHNlbGYpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgSU5UOgotCQkJaWYgKGxvYWRfaW50KHNlbGYpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIElOVDoKKyAgICAgICAgICAgIGlmIChsb2FkX2ludChzZWxmKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIExPTkc6Ci0JCQlpZiAobG9hZF9sb25nKHNlbGYpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIExPTkc6CisgICAgICAgICAgICBpZiAobG9hZF9sb25nKHNlbGYpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgTE9ORzE6Ci0JCQlpZiAobG9hZF9jb3VudGVkX2xvbmcoc2VsZiwgMSkgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgTE9ORzE6CisgICAgICAgICAgICBpZiAobG9hZF9jb3VudGVkX2xvbmcoc2VsZiwgMSkgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBMT05HNDoKLQkJCWlmIChsb2FkX2NvdW50ZWRfbG9uZyhzZWxmLCA0KSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBMT05HNDoKKyAgICAgICAgICAgIGlmIChsb2FkX2NvdW50ZWRfbG9uZyhzZWxmLCA0KSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIEZMT0FUOgotCQkJaWYgKGxvYWRfZmxvYXQoc2VsZikgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgRkxPQVQ6CisgICAgICAgICAgICBpZiAobG9hZF9mbG9hdChzZWxmKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIEJJTkZMT0FUOgotCQkJaWYgKGxvYWRfYmluZmxvYXQoc2VsZikgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgQklORkxPQVQ6CisgICAgICAgICAgICBpZiAobG9hZF9iaW5mbG9hdChzZWxmKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIEJJTlNUUklORzoKLQkJCWlmIChsb2FkX2JpbnN0cmluZyhzZWxmKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBCSU5TVFJJTkc6CisgICAgICAgICAgICBpZiAobG9hZF9iaW5zdHJpbmcoc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBTSE9SVF9CSU5TVFJJTkc6Ci0JCQlpZiAobG9hZF9zaG9ydF9iaW5zdHJpbmcoc2VsZikgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgU0hPUlRfQklOU1RSSU5HOgorICAgICAgICAgICAgaWYgKGxvYWRfc2hvcnRfYmluc3RyaW5nKHNlbGYpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgU1RSSU5HOgotCQkJaWYgKGxvYWRfc3RyaW5nKHNlbGYpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIFNUUklORzoKKyAgICAgICAgICAgIGlmIChsb2FkX3N0cmluZyhzZWxmKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQkJY2FzZSBVTklDT0RFOgotCQkJaWYgKGxvYWRfdW5pY29kZShzZWxmKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBVTklDT0RFOgorICAgICAgICAgICAgaWYgKGxvYWRfdW5pY29kZShzZWxmKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIEJJTlVOSUNPREU6Ci0JCQlpZiAobG9hZF9iaW51bmljb2RlKHNlbGYpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIEJJTlVOSUNPREU6CisgICAgICAgICAgICBpZiAobG9hZF9iaW51bmljb2RlKHNlbGYpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogI2VuZGlmCiAKLQkJY2FzZSBFTVBUWV9UVVBMRToKLQkJCWlmIChsb2FkX2NvdW50ZWRfdHVwbGUoc2VsZiwgMCkgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgRU1QVFlfVFVQTEU6CisgICAgICAgICAgICBpZiAobG9hZF9jb3VudGVkX3R1cGxlKHNlbGYsIDApIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgVFVQTEUxOgotCQkJaWYgKGxvYWRfY291bnRlZF90dXBsZShzZWxmLCAxKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBUVVBMRTE6CisgICAgICAgICAgICBpZiAobG9hZF9jb3VudGVkX3R1cGxlKHNlbGYsIDEpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgVFVQTEUyOgotCQkJaWYgKGxvYWRfY291bnRlZF90dXBsZShzZWxmLCAyKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBUVVBMRTI6CisgICAgICAgICAgICBpZiAobG9hZF9jb3VudGVkX3R1cGxlKHNlbGYsIDIpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgVFVQTEUzOgotCQkJaWYgKGxvYWRfY291bnRlZF90dXBsZShzZWxmLCAzKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBUVVBMRTM6CisgICAgICAgICAgICBpZiAobG9hZF9jb3VudGVkX3R1cGxlKHNlbGYsIDMpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgVFVQTEU6Ci0JCQlpZiAobG9hZF90dXBsZShzZWxmKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBUVVBMRToKKyAgICAgICAgICAgIGlmIChsb2FkX3R1cGxlKHNlbGYpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgRU1QVFlfTElTVDoKLQkJCWlmIChsb2FkX2VtcHR5X2xpc3Qoc2VsZikgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgRU1QVFlfTElTVDoKKyAgICAgICAgICAgIGlmIChsb2FkX2VtcHR5X2xpc3Qoc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBMSVNUOgotCQkJaWYgKGxvYWRfbGlzdChzZWxmKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBMSVNUOgorICAgICAgICAgICAgaWYgKGxvYWRfbGlzdChzZWxmKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIEVNUFRZX0RJQ1Q6Ci0JCQlpZiAobG9hZF9lbXB0eV9kaWN0KHNlbGYpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIEVNUFRZX0RJQ1Q6CisgICAgICAgICAgICBpZiAobG9hZF9lbXB0eV9kaWN0KHNlbGYpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgRElDVDoKLQkJCWlmIChsb2FkX2RpY3Qoc2VsZikgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgRElDVDoKKyAgICAgICAgICAgIGlmIChsb2FkX2RpY3Qoc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBPQko6Ci0JCQlpZiAobG9hZF9vYmooc2VsZikgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgT0JKOgorICAgICAgICAgICAgaWYgKGxvYWRfb2JqKHNlbGYpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgSU5TVDoKLQkJCWlmIChsb2FkX2luc3Qoc2VsZikgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgSU5TVDoKKyAgICAgICAgICAgIGlmIChsb2FkX2luc3Qoc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBORVdPQko6Ci0JCQlpZiAobG9hZF9uZXdvYmooc2VsZikgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgTkVXT0JKOgorICAgICAgICAgICAgaWYgKGxvYWRfbmV3b2JqKHNlbGYpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgR0xPQkFMOgotCQkJaWYgKGxvYWRfZ2xvYmFsKHNlbGYpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIEdMT0JBTDoKKyAgICAgICAgICAgIGlmIChsb2FkX2dsb2JhbChzZWxmKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIEFQUEVORDoKLQkJCWlmIChsb2FkX2FwcGVuZChzZWxmKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBBUFBFTkQ6CisgICAgICAgICAgICBpZiAobG9hZF9hcHBlbmQoc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBBUFBFTkRTOgotCQkJaWYgKGxvYWRfYXBwZW5kcyhzZWxmKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBBUFBFTkRTOgorICAgICAgICAgICAgaWYgKGxvYWRfYXBwZW5kcyhzZWxmKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIEJVSUxEOgotCQkJaWYgKGxvYWRfYnVpbGQoc2VsZikgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgQlVJTEQ6CisgICAgICAgICAgICBpZiAobG9hZF9idWlsZChzZWxmKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIERVUDoKLQkJCWlmIChsb2FkX2R1cChzZWxmKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBEVVA6CisgICAgICAgICAgICBpZiAobG9hZF9kdXAoc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBCSU5HRVQ6Ci0JCQlpZiAobG9hZF9iaW5nZXQoc2VsZikgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgQklOR0VUOgorICAgICAgICAgICAgaWYgKGxvYWRfYmluZ2V0KHNlbGYpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgTE9OR19CSU5HRVQ6Ci0JCQlpZiAobG9hZF9sb25nX2JpbmdldChzZWxmKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBMT05HX0JJTkdFVDoKKyAgICAgICAgICAgIGlmIChsb2FkX2xvbmdfYmluZ2V0KHNlbGYpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgR0VUOgotCQkJaWYgKGxvYWRfZ2V0KHNlbGYpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIEdFVDoKKyAgICAgICAgICAgIGlmIChsb2FkX2dldChzZWxmKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIEVYVDE6Ci0JCQlpZiAobG9hZF9leHRlbnNpb24oc2VsZiwgMSkgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgRVhUMToKKyAgICAgICAgICAgIGlmIChsb2FkX2V4dGVuc2lvbihzZWxmLCAxKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIEVYVDI6Ci0JCQlpZiAobG9hZF9leHRlbnNpb24oc2VsZiwgMikgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgRVhUMjoKKyAgICAgICAgICAgIGlmIChsb2FkX2V4dGVuc2lvbihzZWxmLCAyKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIEVYVDQ6Ci0JCQlpZiAobG9hZF9leHRlbnNpb24oc2VsZiwgNCkgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7Ci0JCWNhc2UgTUFSSzoKLQkJCWlmIChsb2FkX21hcmsoc2VsZikgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgRVhUNDoKKyAgICAgICAgICAgIGlmIChsb2FkX2V4dGVuc2lvbihzZWxmLCA0KSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgY2FzZSBNQVJLOgorICAgICAgICAgICAgaWYgKGxvYWRfbWFyayhzZWxmKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIEJJTlBVVDoKLQkJCWlmIChsb2FkX2JpbnB1dChzZWxmKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBCSU5QVVQ6CisgICAgICAgICAgICBpZiAobG9hZF9iaW5wdXQoc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBMT05HX0JJTlBVVDoKLQkJCWlmIChsb2FkX2xvbmdfYmlucHV0KHNlbGYpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIExPTkdfQklOUFVUOgorICAgICAgICAgICAgaWYgKGxvYWRfbG9uZ19iaW5wdXQoc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBQVVQ6Ci0JCQlpZiAobG9hZF9wdXQoc2VsZikgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgUFVUOgorICAgICAgICAgICAgaWYgKGxvYWRfcHV0KHNlbGYpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgUE9QOgotCQkJaWYgKGxvYWRfcG9wKHNlbGYpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIFBPUDoKKyAgICAgICAgICAgIGlmIChsb2FkX3BvcChzZWxmKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIFBPUF9NQVJLOgotCQkJaWYgKGxvYWRfcG9wX21hcmsoc2VsZikgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgUE9QX01BUks6CisgICAgICAgICAgICBpZiAobG9hZF9wb3BfbWFyayhzZWxmKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIFNFVElURU06Ci0JCQlpZiAobG9hZF9zZXRpdGVtKHNlbGYpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIFNFVElURU06CisgICAgICAgICAgICBpZiAobG9hZF9zZXRpdGVtKHNlbGYpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgU0VUSVRFTVM6Ci0JCQlpZiAobG9hZF9zZXRpdGVtcyhzZWxmKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBTRVRJVEVNUzoKKyAgICAgICAgICAgIGlmIChsb2FkX3NldGl0ZW1zKHNlbGYpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgU1RPUDoKLQkJCWJyZWFrOworICAgICAgICBjYXNlIFNUT1A6CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIFBFUlNJRDoKLQkJCWlmIChsb2FkX3BlcnNpZChzZWxmKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBQRVJTSUQ6CisgICAgICAgICAgICBpZiAobG9hZF9wZXJzaWQoc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBCSU5QRVJTSUQ6Ci0JCQlpZiAobG9hZF9iaW5wZXJzaWQoc2VsZikgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgQklOUEVSU0lEOgorICAgICAgICAgICAgaWYgKGxvYWRfYmlucGVyc2lkKHNlbGYpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgUkVEVUNFOgotCQkJaWYgKGxvYWRfcmVkdWNlKHNlbGYpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIFJFRFVDRToKKyAgICAgICAgICAgIGlmIChsb2FkX3JlZHVjZShzZWxmKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIFBST1RPOgotCQkJaWYgKGxvYWRfcHJvdG8oc2VsZikgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgUFJPVE86CisgICAgICAgICAgICBpZiAobG9hZF9wcm90byhzZWxmKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIE5FV1RSVUU6Ci0JCQlpZiAobG9hZF9ib29sKHNlbGYsIFB5X1RydWUpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIE5FV1RSVUU6CisgICAgICAgICAgICBpZiAobG9hZF9ib29sKHNlbGYsIFB5X1RydWUpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgTkVXRkFMU0U6Ci0JCQlpZiAobG9hZF9ib29sKHNlbGYsIFB5X0ZhbHNlKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBORVdGQUxTRToKKyAgICAgICAgICAgIGlmIChsb2FkX2Jvb2woc2VsZiwgUHlfRmFsc2UpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgJ1wwJzoKLQkJCS8qIGVuZCBvZiBmaWxlICovCi0JCQlQeUVycl9TZXROb25lKFB5RXhjX0VPRkVycm9yKTsKLQkJCWJyZWFrOworICAgICAgICBjYXNlICdcMCc6CisgICAgICAgICAgICAvKiBlbmQgb2YgZmlsZSAqLworICAgICAgICAgICAgUHlFcnJfU2V0Tm9uZShQeUV4Y19FT0ZFcnJvcik7CisgICAgICAgICAgICBicmVhazsKIAotCQlkZWZhdWx0OgotCQkJY1BpY2tsZV9FcnJGb3JtYXQoVW5waWNrbGluZ0Vycm9yLAotCQkJCQkgICJpbnZhbGlkIGxvYWQga2V5LCAnJXMnLiIsCi0JCQkJCSAgImMiLCBzWzBdKTsKLQkJCXJldHVybiBOVUxMOwotCQl9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBjUGlja2xlX0VyckZvcm1hdChVbnBpY2tsaW5nRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCBsb2FkIGtleSwgJyVzJy4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImMiLCBzWzBdKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CiAKLQkJYnJlYWs7Ci0JfQorICAgICAgICBicmVhazsKKyAgICB9CiAKLQlpZiAoKGVyciA9IFB5RXJyX09jY3VycmVkKCkpKSB7Ci0JCWlmIChlcnIgPT0gUHlFeGNfRU9GRXJyb3IpIHsKLQkJCVB5RXJyX1NldE5vbmUoUHlFeGNfRU9GRXJyb3IpOwotCQl9Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoKGVyciA9IFB5RXJyX09jY3VycmVkKCkpKSB7CisgICAgICAgIGlmIChlcnIgPT0gUHlFeGNfRU9GRXJyb3IpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldE5vbmUoUHlFeGNfRU9GRXJyb3IpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCVBEQVRBX1BPUChzZWxmLT5zdGFjaywgdmFsKTsKLQlyZXR1cm4gdmFsOworICAgIFBEQVRBX1BPUChzZWxmLT5zdGFjaywgdmFsKTsKKyAgICByZXR1cm4gdmFsOwogfQogCiAKQEAgLTQ4OTMsNjMgKzQ4OTMsNjMgQEAKIHN0YXRpYyBpbnQKIG5vbG9hZF9vYmooVW5waWNrbGVyb2JqZWN0ICpzZWxmKQogewotCWludCBpOworICAgIGludCBpOwogCi0JaWYgKChpID0gbWFya2VyKHNlbGYpKSA8IDApIHJldHVybiAtMTsKLQlyZXR1cm4gUGRhdGFfY2xlYXIoc2VsZi0+c3RhY2ssIGkrMSk7CisgICAgaWYgKChpID0gbWFya2VyKHNlbGYpKSA8IDApIHJldHVybiAtMTsKKyAgICByZXR1cm4gUGRhdGFfY2xlYXIoc2VsZi0+c3RhY2ssIGkrMSk7CiB9CiAKIAogc3RhdGljIGludAogbm9sb2FkX2luc3QoVW5waWNrbGVyb2JqZWN0ICpzZWxmKQogewotCWludCBpOwotCWNoYXIgKnM7CisgICAgaW50IGk7CisgICAgY2hhciAqczsKIAotCWlmICgoaSA9IG1hcmtlcihzZWxmKSkgPCAwKSByZXR1cm4gLTE7Ci0JUGRhdGFfY2xlYXIoc2VsZi0+c3RhY2ssIGkpOwotCWlmIChzZWxmLT5yZWFkbGluZV9mdW5jKHNlbGYsICZzKSA8IDApIHJldHVybiAtMTsKLQlpZiAoc2VsZi0+cmVhZGxpbmVfZnVuYyhzZWxmLCAmcykgPCAwKSByZXR1cm4gLTE7Ci0JUERBVEFfQVBQRU5EKHNlbGYtPnN0YWNrLCBQeV9Ob25lLCAtMSk7Ci0JcmV0dXJuIDA7CisgICAgaWYgKChpID0gbWFya2VyKHNlbGYpKSA8IDApIHJldHVybiAtMTsKKyAgICBQZGF0YV9jbGVhcihzZWxmLT5zdGFjaywgaSk7CisgICAgaWYgKHNlbGYtPnJlYWRsaW5lX2Z1bmMoc2VsZiwgJnMpIDwgMCkgcmV0dXJuIC0xOworICAgIGlmIChzZWxmLT5yZWFkbGluZV9mdW5jKHNlbGYsICZzKSA8IDApIHJldHVybiAtMTsKKyAgICBQREFUQV9BUFBFTkQoc2VsZi0+c3RhY2ssIFB5X05vbmUsIC0xKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogbm9sb2FkX25ld29iaihVbnBpY2tsZXJvYmplY3QgKnNlbGYpCiB7Ci0JUHlPYmplY3QgKm9iajsKKyAgICBQeU9iamVjdCAqb2JqOwogCi0JUERBVEFfUE9QKHNlbGYtPnN0YWNrLCBvYmopOwkvKiBwb3AgYXJndHVwbGUgKi8KLQlpZiAob2JqID09IE5VTEwpIHJldHVybiAtMTsKLQlQeV9ERUNSRUYob2JqKTsKKyAgICBQREFUQV9QT1Aoc2VsZi0+c3RhY2ssIG9iaik7ICAgICAgICAvKiBwb3AgYXJndHVwbGUgKi8KKyAgICBpZiAob2JqID09IE5VTEwpIHJldHVybiAtMTsKKyAgICBQeV9ERUNSRUYob2JqKTsKIAotCVBEQVRBX1BPUChzZWxmLT5zdGFjaywgb2JqKTsJLyogcG9wIGNscyAqLwotCWlmIChvYmogPT0gTlVMTCkgcmV0dXJuIC0xOwotCVB5X0RFQ1JFRihvYmopOworICAgIFBEQVRBX1BPUChzZWxmLT5zdGFjaywgb2JqKTsgICAgICAgIC8qIHBvcCBjbHMgKi8KKyAgICBpZiAob2JqID09IE5VTEwpIHJldHVybiAtMTsKKyAgICBQeV9ERUNSRUYob2JqKTsKIAotCVBEQVRBX0FQUEVORChzZWxmLT5zdGFjaywgUHlfTm9uZSwgLTEpOwotIAlyZXR1cm4gMDsKKyAgICBQREFUQV9BUFBFTkQoc2VsZi0+c3RhY2ssIFB5X05vbmUsIC0xKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogbm9sb2FkX2dsb2JhbChVbnBpY2tsZXJvYmplY3QgKnNlbGYpCiB7Ci0JY2hhciAqczsKKyAgICBjaGFyICpzOwogCi0JaWYgKHNlbGYtPnJlYWRsaW5lX2Z1bmMoc2VsZiwgJnMpIDwgMCkgcmV0dXJuIC0xOwotCWlmIChzZWxmLT5yZWFkbGluZV9mdW5jKHNlbGYsICZzKSA8IDApIHJldHVybiAtMTsKLQlQREFUQV9BUFBFTkQoc2VsZi0+c3RhY2ssIFB5X05vbmUsLTEpOwotCXJldHVybiAwOworICAgIGlmIChzZWxmLT5yZWFkbGluZV9mdW5jKHNlbGYsICZzKSA8IDApIHJldHVybiAtMTsKKyAgICBpZiAoc2VsZi0+cmVhZGxpbmVfZnVuYyhzZWxmLCAmcykgPCAwKSByZXR1cm4gLTE7CisgICAgUERBVEFfQVBQRU5EKHNlbGYtPnN0YWNrLCBQeV9Ob25lLC0xKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogbm9sb2FkX3JlZHVjZShVbnBpY2tsZXJvYmplY3QgKnNlbGYpCiB7CiAKLQlpZiAoc2VsZi0+c3RhY2stPmxlbmd0aCA8IDIpIHJldHVybiBzdGFja1VuZGVyZmxvdygpOwotCVBkYXRhX2NsZWFyKHNlbGYtPnN0YWNrLCBzZWxmLT5zdGFjay0+bGVuZ3RoLTIpOwotCVBEQVRBX0FQUEVORChzZWxmLT5zdGFjaywgUHlfTm9uZSwtMSk7Ci0JcmV0dXJuIDA7CisgICAgaWYgKHNlbGYtPnN0YWNrLT5sZW5ndGggPCAyKSByZXR1cm4gc3RhY2tVbmRlcmZsb3coKTsKKyAgICBQZGF0YV9jbGVhcihzZWxmLT5zdGFjaywgc2VsZi0+c3RhY2stPmxlbmd0aC0yKTsKKyAgICBQREFUQV9BUFBFTkQoc2VsZi0+c3RhY2ssIFB5X05vbmUsLTEpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CkBAIC00OTYzLDMyNSArNDk2MywzMjUgQEAKIHN0YXRpYyBpbnQKIG5vbG9hZF9leHRlbnNpb24oVW5waWNrbGVyb2JqZWN0ICpzZWxmLCBpbnQgbmJ5dGVzKQogewotCWNoYXIgKmNvZGVieXRlczsKKyAgICBjaGFyICpjb2RlYnl0ZXM7CiAKLQlhc3NlcnQobmJ5dGVzID09IDEgfHwgbmJ5dGVzID09IDIgfHwgbmJ5dGVzID09IDQpOwotCWlmIChzZWxmLT5yZWFkX2Z1bmMoc2VsZiwgJmNvZGVieXRlcywgbmJ5dGVzKSA8IDApIHJldHVybiAtMTsKLQlQREFUQV9BUFBFTkQoc2VsZi0+c3RhY2ssIFB5X05vbmUsIC0xKTsKLQlyZXR1cm4gMDsKKyAgICBhc3NlcnQobmJ5dGVzID09IDEgfHwgbmJ5dGVzID09IDIgfHwgbmJ5dGVzID09IDQpOworICAgIGlmIChzZWxmLT5yZWFkX2Z1bmMoc2VsZiwgJmNvZGVieXRlcywgbmJ5dGVzKSA8IDApIHJldHVybiAtMTsKKyAgICBQREFUQV9BUFBFTkQoc2VsZi0+c3RhY2ssIFB5X05vbmUsIC0xKTsKKyAgICByZXR1cm4gMDsKIH0KIAogCiBzdGF0aWMgUHlPYmplY3QgKgogbm9sb2FkKFVucGlja2xlcm9iamVjdCAqc2VsZikKIHsKLQlQeU9iamVjdCAqZXJyID0gMCwgKnZhbCA9IDA7Ci0JY2hhciAqczsKKyAgICBQeU9iamVjdCAqZXJyID0gMCwgKnZhbCA9IDA7CisgICAgY2hhciAqczsKIAotCXNlbGYtPm51bV9tYXJrcyA9IDA7Ci0JUGRhdGFfY2xlYXIoc2VsZi0+c3RhY2ssIDApOworICAgIHNlbGYtPm51bV9tYXJrcyA9IDA7CisgICAgUGRhdGFfY2xlYXIoc2VsZi0+c3RhY2ssIDApOwogCi0Jd2hpbGUgKDEpIHsKLQkJaWYgKHNlbGYtPnJlYWRfZnVuYyhzZWxmLCAmcywgMSkgPCAwKQotCQkJYnJlYWs7CisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgaWYgKHNlbGYtPnJlYWRfZnVuYyhzZWxmLCAmcywgMSkgPCAwKQorICAgICAgICAgICAgYnJlYWs7CiAKLQkJc3dpdGNoIChzWzBdKSB7Ci0JCWNhc2UgTk9ORToKLQkJCWlmIChsb2FkX25vbmUoc2VsZikgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIHN3aXRjaCAoc1swXSkgeworICAgICAgICBjYXNlIE5PTkU6CisgICAgICAgICAgICBpZiAobG9hZF9ub25lKHNlbGYpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgQklOSU5UOgotCQkJaWYgKGxvYWRfYmluaW50KHNlbGYpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIEJJTklOVDoKKyAgICAgICAgICAgIGlmIChsb2FkX2JpbmludChzZWxmKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIEJJTklOVDE6Ci0JCQlpZiAobG9hZF9iaW5pbnQxKHNlbGYpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIEJJTklOVDE6CisgICAgICAgICAgICBpZiAobG9hZF9iaW5pbnQxKHNlbGYpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgQklOSU5UMjoKLQkJCWlmIChsb2FkX2JpbmludDIoc2VsZikgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgQklOSU5UMjoKKyAgICAgICAgICAgIGlmIChsb2FkX2JpbmludDIoc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBJTlQ6Ci0JCQlpZiAobG9hZF9pbnQoc2VsZikgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgSU5UOgorICAgICAgICAgICAgaWYgKGxvYWRfaW50KHNlbGYpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgTE9ORzoKLQkJCWlmIChsb2FkX2xvbmcoc2VsZikgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgTE9ORzoKKyAgICAgICAgICAgIGlmIChsb2FkX2xvbmcoc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBMT05HMToKLQkJCWlmIChsb2FkX2NvdW50ZWRfbG9uZyhzZWxmLCAxKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBMT05HMToKKyAgICAgICAgICAgIGlmIChsb2FkX2NvdW50ZWRfbG9uZyhzZWxmLCAxKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIExPTkc0OgotCQkJaWYgKGxvYWRfY291bnRlZF9sb25nKHNlbGYsIDQpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIExPTkc0OgorICAgICAgICAgICAgaWYgKGxvYWRfY291bnRlZF9sb25nKHNlbGYsIDQpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgRkxPQVQ6Ci0JCQlpZiAobG9hZF9mbG9hdChzZWxmKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBGTE9BVDoKKyAgICAgICAgICAgIGlmIChsb2FkX2Zsb2F0KHNlbGYpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgQklORkxPQVQ6Ci0JCQlpZiAobG9hZF9iaW5mbG9hdChzZWxmKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBCSU5GTE9BVDoKKyAgICAgICAgICAgIGlmIChsb2FkX2JpbmZsb2F0KHNlbGYpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgQklOU1RSSU5HOgotCQkJaWYgKGxvYWRfYmluc3RyaW5nKHNlbGYpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIEJJTlNUUklORzoKKyAgICAgICAgICAgIGlmIChsb2FkX2JpbnN0cmluZyhzZWxmKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIFNIT1JUX0JJTlNUUklORzoKLQkJCWlmIChsb2FkX3Nob3J0X2JpbnN0cmluZyhzZWxmKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBTSE9SVF9CSU5TVFJJTkc6CisgICAgICAgICAgICBpZiAobG9hZF9zaG9ydF9iaW5zdHJpbmcoc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBTVFJJTkc6Ci0JCQlpZiAobG9hZF9zdHJpbmcoc2VsZikgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgU1RSSU5HOgorICAgICAgICAgICAgaWYgKGxvYWRfc3RyaW5nKHNlbGYpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCQljYXNlIFVOSUNPREU6Ci0JCQlpZiAobG9hZF91bmljb2RlKHNlbGYpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIFVOSUNPREU6CisgICAgICAgICAgICBpZiAobG9hZF91bmljb2RlKHNlbGYpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgQklOVU5JQ09ERToKLQkJCWlmIChsb2FkX2JpbnVuaWNvZGUoc2VsZikgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgQklOVU5JQ09ERToKKyAgICAgICAgICAgIGlmIChsb2FkX2JpbnVuaWNvZGUoc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAjZW5kaWYKIAotCQljYXNlIEVNUFRZX1RVUExFOgotCQkJaWYgKGxvYWRfY291bnRlZF90dXBsZShzZWxmLCAwKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBFTVBUWV9UVVBMRToKKyAgICAgICAgICAgIGlmIChsb2FkX2NvdW50ZWRfdHVwbGUoc2VsZiwgMCkgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBUVVBMRTE6Ci0JCQlpZiAobG9hZF9jb3VudGVkX3R1cGxlKHNlbGYsIDEpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIFRVUExFMToKKyAgICAgICAgICAgIGlmIChsb2FkX2NvdW50ZWRfdHVwbGUoc2VsZiwgMSkgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBUVVBMRTI6Ci0JCQlpZiAobG9hZF9jb3VudGVkX3R1cGxlKHNlbGYsIDIpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIFRVUExFMjoKKyAgICAgICAgICAgIGlmIChsb2FkX2NvdW50ZWRfdHVwbGUoc2VsZiwgMikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBUVVBMRTM6Ci0JCQlpZiAobG9hZF9jb3VudGVkX3R1cGxlKHNlbGYsIDMpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIFRVUExFMzoKKyAgICAgICAgICAgIGlmIChsb2FkX2NvdW50ZWRfdHVwbGUoc2VsZiwgMykgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBUVVBMRToKLQkJCWlmIChsb2FkX3R1cGxlKHNlbGYpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIFRVUExFOgorICAgICAgICAgICAgaWYgKGxvYWRfdHVwbGUoc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBFTVBUWV9MSVNUOgotCQkJaWYgKGxvYWRfZW1wdHlfbGlzdChzZWxmKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBFTVBUWV9MSVNUOgorICAgICAgICAgICAgaWYgKGxvYWRfZW1wdHlfbGlzdChzZWxmKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIExJU1Q6Ci0JCQlpZiAobG9hZF9saXN0KHNlbGYpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIExJU1Q6CisgICAgICAgICAgICBpZiAobG9hZF9saXN0KHNlbGYpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgRU1QVFlfRElDVDoKLQkJCWlmIChsb2FkX2VtcHR5X2RpY3Qoc2VsZikgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgRU1QVFlfRElDVDoKKyAgICAgICAgICAgIGlmIChsb2FkX2VtcHR5X2RpY3Qoc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBESUNUOgotCQkJaWYgKGxvYWRfZGljdChzZWxmKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBESUNUOgorICAgICAgICAgICAgaWYgKGxvYWRfZGljdChzZWxmKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIE9CSjoKLQkJCWlmIChub2xvYWRfb2JqKHNlbGYpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIE9CSjoKKyAgICAgICAgICAgIGlmIChub2xvYWRfb2JqKHNlbGYpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgSU5TVDoKLQkJCWlmIChub2xvYWRfaW5zdChzZWxmKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBJTlNUOgorICAgICAgICAgICAgaWYgKG5vbG9hZF9pbnN0KHNlbGYpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgTkVXT0JKOgotCQkJaWYgKG5vbG9hZF9uZXdvYmooc2VsZikgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgTkVXT0JKOgorICAgICAgICAgICAgaWYgKG5vbG9hZF9uZXdvYmooc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBHTE9CQUw6Ci0JCQlpZiAobm9sb2FkX2dsb2JhbChzZWxmKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBHTE9CQUw6CisgICAgICAgICAgICBpZiAobm9sb2FkX2dsb2JhbChzZWxmKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIEFQUEVORDoKLQkJCWlmIChsb2FkX2FwcGVuZChzZWxmKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBBUFBFTkQ6CisgICAgICAgICAgICBpZiAobG9hZF9hcHBlbmQoc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBBUFBFTkRTOgotCQkJaWYgKGxvYWRfYXBwZW5kcyhzZWxmKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBBUFBFTkRTOgorICAgICAgICAgICAgaWYgKGxvYWRfYXBwZW5kcyhzZWxmKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIEJVSUxEOgotCQkJaWYgKG5vbG9hZF9idWlsZChzZWxmKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBCVUlMRDoKKyAgICAgICAgICAgIGlmIChub2xvYWRfYnVpbGQoc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBEVVA6Ci0JCQlpZiAobG9hZF9kdXAoc2VsZikgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgRFVQOgorICAgICAgICAgICAgaWYgKGxvYWRfZHVwKHNlbGYpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgQklOR0VUOgotCQkJaWYgKGxvYWRfYmluZ2V0KHNlbGYpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIEJJTkdFVDoKKyAgICAgICAgICAgIGlmIChsb2FkX2JpbmdldChzZWxmKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIExPTkdfQklOR0VUOgotCQkJaWYgKGxvYWRfbG9uZ19iaW5nZXQoc2VsZikgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgTE9OR19CSU5HRVQ6CisgICAgICAgICAgICBpZiAobG9hZF9sb25nX2JpbmdldChzZWxmKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIEdFVDoKLQkJCWlmIChsb2FkX2dldChzZWxmKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBHRVQ6CisgICAgICAgICAgICBpZiAobG9hZF9nZXQoc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBFWFQxOgotCQkJaWYgKG5vbG9hZF9leHRlbnNpb24oc2VsZiwgMSkgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgRVhUMToKKyAgICAgICAgICAgIGlmIChub2xvYWRfZXh0ZW5zaW9uKHNlbGYsIDEpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgRVhUMjoKLQkJCWlmIChub2xvYWRfZXh0ZW5zaW9uKHNlbGYsIDIpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIEVYVDI6CisgICAgICAgICAgICBpZiAobm9sb2FkX2V4dGVuc2lvbihzZWxmLCAyKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIEVYVDQ6Ci0JCQlpZiAobm9sb2FkX2V4dGVuc2lvbihzZWxmLCA0KSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBFWFQ0OgorICAgICAgICAgICAgaWYgKG5vbG9hZF9leHRlbnNpb24oc2VsZiwgNCkgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBNQVJLOgotCQkJaWYgKGxvYWRfbWFyayhzZWxmKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBNQVJLOgorICAgICAgICAgICAgaWYgKGxvYWRfbWFyayhzZWxmKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIEJJTlBVVDoKLQkJCWlmIChsb2FkX2JpbnB1dChzZWxmKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBCSU5QVVQ6CisgICAgICAgICAgICBpZiAobG9hZF9iaW5wdXQoc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBMT05HX0JJTlBVVDoKLQkJCWlmIChsb2FkX2xvbmdfYmlucHV0KHNlbGYpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIExPTkdfQklOUFVUOgorICAgICAgICAgICAgaWYgKGxvYWRfbG9uZ19iaW5wdXQoc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBQVVQ6Ci0JCQlpZiAobG9hZF9wdXQoc2VsZikgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgUFVUOgorICAgICAgICAgICAgaWYgKGxvYWRfcHV0KHNlbGYpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgUE9QOgotCQkJaWYgKGxvYWRfcG9wKHNlbGYpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIFBPUDoKKyAgICAgICAgICAgIGlmIChsb2FkX3BvcChzZWxmKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIFBPUF9NQVJLOgotCQkJaWYgKGxvYWRfcG9wX21hcmsoc2VsZikgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgUE9QX01BUks6CisgICAgICAgICAgICBpZiAobG9hZF9wb3BfbWFyayhzZWxmKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIFNFVElURU06Ci0JCQlpZiAobG9hZF9zZXRpdGVtKHNlbGYpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIFNFVElURU06CisgICAgICAgICAgICBpZiAobG9hZF9zZXRpdGVtKHNlbGYpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgU0VUSVRFTVM6Ci0JCQlpZiAobG9hZF9zZXRpdGVtcyhzZWxmKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBTRVRJVEVNUzoKKyAgICAgICAgICAgIGlmIChsb2FkX3NldGl0ZW1zKHNlbGYpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgU1RPUDoKLQkJCWJyZWFrOworICAgICAgICBjYXNlIFNUT1A6CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIFBFUlNJRDoKLQkJCWlmIChsb2FkX3BlcnNpZChzZWxmKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBQRVJTSUQ6CisgICAgICAgICAgICBpZiAobG9hZF9wZXJzaWQoc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBCSU5QRVJTSUQ6Ci0JCQlpZiAobG9hZF9iaW5wZXJzaWQoc2VsZikgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgQklOUEVSU0lEOgorICAgICAgICAgICAgaWYgKGxvYWRfYmlucGVyc2lkKHNlbGYpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgUkVEVUNFOgotCQkJaWYgKG5vbG9hZF9yZWR1Y2Uoc2VsZikgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgUkVEVUNFOgorICAgICAgICAgICAgaWYgKG5vbG9hZF9yZWR1Y2Uoc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBQUk9UTzoKLQkJCWlmIChsb2FkX3Byb3RvKHNlbGYpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIFBST1RPOgorICAgICAgICAgICAgaWYgKGxvYWRfcHJvdG8oc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBORVdUUlVFOgotCQkJaWYgKGxvYWRfYm9vbChzZWxmLCBQeV9UcnVlKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBORVdUUlVFOgorICAgICAgICAgICAgaWYgKGxvYWRfYm9vbChzZWxmLCBQeV9UcnVlKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIE5FV0ZBTFNFOgotCQkJaWYgKGxvYWRfYm9vbChzZWxmLCBQeV9GYWxzZSkgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7Ci0JCWRlZmF1bHQ6Ci0JCQljUGlja2xlX0VyckZvcm1hdChVbnBpY2tsaW5nRXJyb3IsCi0JCQkJCSAgImludmFsaWQgbG9hZCBrZXksICclcycuIiwKLQkJCQkJICAiYyIsIHNbMF0pOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KKyAgICAgICAgY2FzZSBORVdGQUxTRToKKyAgICAgICAgICAgIGlmIChsb2FkX2Jvb2woc2VsZiwgUHlfRmFsc2UpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgY1BpY2tsZV9FcnJGb3JtYXQoVW5waWNrbGluZ0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludmFsaWQgbG9hZCBrZXksICclcycuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjIiwgc1swXSk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQogCi0JCWJyZWFrOwotCX0KKyAgICAgICAgYnJlYWs7CisgICAgfQogCi0JaWYgKChlcnIgPSBQeUVycl9PY2N1cnJlZCgpKSkgewotCQlpZiAoZXJyID09IFB5RXhjX0VPRkVycm9yKSB7Ci0JCQlQeUVycl9TZXROb25lKFB5RXhjX0VPRkVycm9yKTsKLQkJfQotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKChlcnIgPSBQeUVycl9PY2N1cnJlZCgpKSkgeworICAgICAgICBpZiAoZXJyID09IFB5RXhjX0VPRkVycm9yKSB7CisgICAgICAgICAgICBQeUVycl9TZXROb25lKFB5RXhjX0VPRkVycm9yKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlQREFUQV9QT1Aoc2VsZi0+c3RhY2ssIHZhbCk7Ci0JcmV0dXJuIHZhbDsKKyAgICBQREFUQV9QT1Aoc2VsZi0+c3RhY2ssIHZhbCk7CisgICAgcmV0dXJuIHZhbDsKIH0KIAogCiBzdGF0aWMgUHlPYmplY3QgKgogVW5waWNrbGVyX2xvYWQoVW5waWNrbGVyb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdW51c2VkKQogewotCXJldHVybiBsb2FkKHNlbGYpOworICAgIHJldHVybiBsb2FkKHNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogVW5waWNrbGVyX25vbG9hZChVbnBpY2tsZXJvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp1bnVzZWQpCiB7Ci0JcmV0dXJuIG5vbG9hZChzZWxmKTsKKyAgICByZXR1cm4gbm9sb2FkKHNlbGYpOwogfQogCiAKQEAgLTUzMDUsMTc1ICs1MzA1LDE3NSBAQAogc3RhdGljIFVucGlja2xlcm9iamVjdCAqCiBuZXdVbnBpY2tsZXJvYmplY3QoUHlPYmplY3QgKmYpCiB7Ci0JVW5waWNrbGVyb2JqZWN0ICpzZWxmOworICAgIFVucGlja2xlcm9iamVjdCAqc2VsZjsKIAotCWlmICghKCBzZWxmID0gUHlPYmplY3RfR0NfTmV3KFVucGlja2xlcm9iamVjdCwgJlVucGlja2xlcnR5cGUpKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCEoIHNlbGYgPSBQeU9iamVjdF9HQ19OZXcoVW5waWNrbGVyb2JqZWN0LCAmVW5waWNrbGVydHlwZSkpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXNlbGYtPmZpbGUgPSBOVUxMOwotCXNlbGYtPmFyZyA9IE5VTEw7Ci0Jc2VsZi0+c3RhY2sgPSAoUGRhdGEqKVBkYXRhX05ldygpOwotCXNlbGYtPnBlcnNfZnVuYyA9IE5VTEw7Ci0Jc2VsZi0+bGFzdF9zdHJpbmcgPSBOVUxMOwotCXNlbGYtPm1hcmtzID0gTlVMTDsKLQlzZWxmLT5udW1fbWFya3MgPSAwOwotCXNlbGYtPm1hcmtzX3NpemUgPSAwOwotCXNlbGYtPmJ1Zl9zaXplID0gMDsKLQlzZWxmLT5yZWFkID0gTlVMTDsKLQlzZWxmLT5yZWFkbGluZSA9IE5VTEw7Ci0Jc2VsZi0+ZmluZF9jbGFzcyA9IE5VTEw7CisgICAgc2VsZi0+ZmlsZSA9IE5VTEw7CisgICAgc2VsZi0+YXJnID0gTlVMTDsKKyAgICBzZWxmLT5zdGFjayA9IChQZGF0YSopUGRhdGFfTmV3KCk7CisgICAgc2VsZi0+cGVyc19mdW5jID0gTlVMTDsKKyAgICBzZWxmLT5sYXN0X3N0cmluZyA9IE5VTEw7CisgICAgc2VsZi0+bWFya3MgPSBOVUxMOworICAgIHNlbGYtPm51bV9tYXJrcyA9IDA7CisgICAgc2VsZi0+bWFya3Nfc2l6ZSA9IDA7CisgICAgc2VsZi0+YnVmX3NpemUgPSAwOworICAgIHNlbGYtPnJlYWQgPSBOVUxMOworICAgIHNlbGYtPnJlYWRsaW5lID0gTlVMTDsKKyAgICBzZWxmLT5maW5kX2NsYXNzID0gTlVMTDsKIAotCWlmICghKCBzZWxmLT5tZW1vID0gUHlEaWN0X05ldygpKSkKLQkJZ290byBlcnI7CisgICAgaWYgKCEoIHNlbGYtPm1lbW8gPSBQeURpY3RfTmV3KCkpKQorICAgICAgICBnb3RvIGVycjsKIAotCWlmICghc2VsZi0+c3RhY2spCi0JCWdvdG8gZXJyOworICAgIGlmICghc2VsZi0+c3RhY2spCisgICAgICAgIGdvdG8gZXJyOwogCi0JUHlfSU5DUkVGKGYpOwotCXNlbGYtPmZpbGUgPSBmOworICAgIFB5X0lOQ1JFRihmKTsKKyAgICBzZWxmLT5maWxlID0gZjsKIAotCS8qIFNldCByZWFkLCByZWFkbGluZSBiYXNlZCBvbiB0eXBlIG9mIGYgKi8KLQlpZiAoUHlGaWxlX0NoZWNrKGYpKSB7Ci0JCXNlbGYtPmZwID0gUHlGaWxlX0FzRmlsZShmKTsKLQkJaWYgKHNlbGYtPmZwID09IE5VTEwpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCQkiSS9PIG9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZSIpOwotCQkJZ290byBlcnI7Ci0JCX0KLQkJc2VsZi0+cmVhZF9mdW5jID0gcmVhZF9maWxlOwotCQlzZWxmLT5yZWFkbGluZV9mdW5jID0gcmVhZGxpbmVfZmlsZTsKLQl9Ci0JZWxzZSBpZiAoUHljU3RyaW5nSU9fSW5wdXRDaGVjayhmKSkgewotCQlzZWxmLT5mcCA9IE5VTEw7Ci0JCXNlbGYtPnJlYWRfZnVuYyA9IHJlYWRfY1N0cmluZ0lPOwotCQlzZWxmLT5yZWFkbGluZV9mdW5jID0gcmVhZGxpbmVfY1N0cmluZ0lPOwotCX0KLQllbHNlIHsKKyAgICAvKiBTZXQgcmVhZCwgcmVhZGxpbmUgYmFzZWQgb24gdHlwZSBvZiBmICovCisgICAgaWYgKFB5RmlsZV9DaGVjayhmKSkgeworICAgICAgICBzZWxmLT5mcCA9IFB5RmlsZV9Bc0ZpbGUoZik7CisgICAgICAgIGlmIChzZWxmLT5mcCA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSS9PIG9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZSIpOworICAgICAgICAgICAgZ290byBlcnI7CisgICAgICAgIH0KKyAgICAgICAgc2VsZi0+cmVhZF9mdW5jID0gcmVhZF9maWxlOworICAgICAgICBzZWxmLT5yZWFkbGluZV9mdW5jID0gcmVhZGxpbmVfZmlsZTsKKyAgICB9CisgICAgZWxzZSBpZiAoUHljU3RyaW5nSU9fSW5wdXRDaGVjayhmKSkgeworICAgICAgICBzZWxmLT5mcCA9IE5VTEw7CisgICAgICAgIHNlbGYtPnJlYWRfZnVuYyA9IHJlYWRfY1N0cmluZ0lPOworICAgICAgICBzZWxmLT5yZWFkbGluZV9mdW5jID0gcmVhZGxpbmVfY1N0cmluZ0lPOworICAgIH0KKyAgICBlbHNlIHsKIAotCQlzZWxmLT5mcCA9IE5VTEw7Ci0JCXNlbGYtPnJlYWRfZnVuYyA9IHJlYWRfb3RoZXI7Ci0JCXNlbGYtPnJlYWRsaW5lX2Z1bmMgPSByZWFkbGluZV9vdGhlcjsKKyAgICAgICAgc2VsZi0+ZnAgPSBOVUxMOworICAgICAgICBzZWxmLT5yZWFkX2Z1bmMgPSByZWFkX290aGVyOworICAgICAgICBzZWxmLT5yZWFkbGluZV9mdW5jID0gcmVhZGxpbmVfb3RoZXI7CiAKLQkJaWYgKCEoIChzZWxmLT5yZWFkbGluZSA9IFB5T2JqZWN0X0dldEF0dHIoZiwgcmVhZGxpbmVfc3RyKSkgJiYKLQkJICAgICAgIChzZWxmLT5yZWFkID0gUHlPYmplY3RfR2V0QXR0cihmLCByZWFkX3N0cikpKSkgIHsKLQkJCVB5RXJyX0NsZWFyKCk7Ci0JCQlQeUVycl9TZXRTdHJpbmcoIFB5RXhjX1R5cGVFcnJvciwKLQkJCQkJICJhcmd1bWVudCBtdXN0IGhhdmUgJ3JlYWQnIGFuZCAiCi0JCQkJCSAiJ3JlYWRsaW5lJyBhdHRyaWJ1dGVzIiApOwotCQkJZ290byBlcnI7Ci0JCX0KLQl9Ci0JUHlPYmplY3RfR0NfVHJhY2soc2VsZik7CisgICAgICAgIGlmICghKCAoc2VsZi0+cmVhZGxpbmUgPSBQeU9iamVjdF9HZXRBdHRyKGYsIHJlYWRsaW5lX3N0cikpICYmCisgICAgICAgICAgICAgICAoc2VsZi0+cmVhZCA9IFB5T2JqZWN0X0dldEF0dHIoZiwgcmVhZF9zdHIpKSkpICB7CisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKCBQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhcmd1bWVudCBtdXN0IGhhdmUgJ3JlYWQnIGFuZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIncmVhZGxpbmUnIGF0dHJpYnV0ZXMiICk7CisgICAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgfQorICAgIH0KKyAgICBQeU9iamVjdF9HQ19UcmFjayhzZWxmKTsKIAotCXJldHVybiBzZWxmOworICAgIHJldHVybiBzZWxmOwogCiAgIGVycjoKLQlQeV9ERUNSRUYoKFB5T2JqZWN0ICopc2VsZik7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlfREVDUkVGKChQeU9iamVjdCAqKXNlbGYpOworICAgIHJldHVybiBOVUxMOwogfQogCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZXRfVW5waWNrbGVyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqZmlsZSkKIHsKLQlyZXR1cm4gKFB5T2JqZWN0ICopbmV3VW5waWNrbGVyb2JqZWN0KGZpbGUpOworICAgIHJldHVybiAoUHlPYmplY3QgKiluZXdVbnBpY2tsZXJvYmplY3QoZmlsZSk7CiB9CiAKIAogc3RhdGljIHZvaWQKIFVucGlja2xlcl9kZWFsbG9jKFVucGlja2xlcm9iamVjdCAqc2VsZikKIHsKLQlQeU9iamVjdF9HQ19VblRyYWNrKChQeU9iamVjdCAqKXNlbGYpOwotCVB5X1hERUNSRUYoc2VsZi0+cmVhZGxpbmUpOwotCVB5X1hERUNSRUYoc2VsZi0+cmVhZCk7Ci0JUHlfWERFQ1JFRihzZWxmLT5maWxlKTsKLQlQeV9YREVDUkVGKHNlbGYtPm1lbW8pOwotCVB5X1hERUNSRUYoc2VsZi0+c3RhY2spOwotCVB5X1hERUNSRUYoc2VsZi0+cGVyc19mdW5jKTsKLQlQeV9YREVDUkVGKHNlbGYtPmFyZyk7Ci0JUHlfWERFQ1JFRihzZWxmLT5sYXN0X3N0cmluZyk7Ci0JUHlfWERFQ1JFRihzZWxmLT5maW5kX2NsYXNzKTsKKyAgICBQeU9iamVjdF9HQ19VblRyYWNrKChQeU9iamVjdCAqKXNlbGYpOworICAgIFB5X1hERUNSRUYoc2VsZi0+cmVhZGxpbmUpOworICAgIFB5X1hERUNSRUYoc2VsZi0+cmVhZCk7CisgICAgUHlfWERFQ1JFRihzZWxmLT5maWxlKTsKKyAgICBQeV9YREVDUkVGKHNlbGYtPm1lbW8pOworICAgIFB5X1hERUNSRUYoc2VsZi0+c3RhY2spOworICAgIFB5X1hERUNSRUYoc2VsZi0+cGVyc19mdW5jKTsKKyAgICBQeV9YREVDUkVGKHNlbGYtPmFyZyk7CisgICAgUHlfWERFQ1JFRihzZWxmLT5sYXN0X3N0cmluZyk7CisgICAgUHlfWERFQ1JFRihzZWxmLT5maW5kX2NsYXNzKTsKIAotCWlmIChzZWxmLT5tYXJrcykgewotCQlmcmVlKHNlbGYtPm1hcmtzKTsKLQl9CisgICAgaWYgKHNlbGYtPm1hcmtzKSB7CisgICAgICAgIGZyZWUoc2VsZi0+bWFya3MpOworICAgIH0KIAotCWlmIChzZWxmLT5idWZfc2l6ZSkgewotCQlmcmVlKHNlbGYtPmJ1Zik7Ci0JfQorICAgIGlmIChzZWxmLT5idWZfc2l6ZSkgeworICAgICAgICBmcmVlKHNlbGYtPmJ1Zik7CisgICAgfQogCi0JUHlfVFlQRShzZWxmKS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKKyAgICBQeV9UWVBFKHNlbGYpLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOwogfQogCiBzdGF0aWMgaW50CiBVbnBpY2tsZXJfdHJhdmVyc2UoVW5waWNrbGVyb2JqZWN0ICpzZWxmLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlQeV9WSVNJVChzZWxmLT5yZWFkbGluZSk7Ci0JUHlfVklTSVQoc2VsZi0+cmVhZCk7Ci0JUHlfVklTSVQoc2VsZi0+ZmlsZSk7Ci0JUHlfVklTSVQoc2VsZi0+bWVtbyk7Ci0JUHlfVklTSVQoc2VsZi0+c3RhY2spOwotCVB5X1ZJU0lUKHNlbGYtPnBlcnNfZnVuYyk7Ci0JUHlfVklTSVQoc2VsZi0+YXJnKTsKLQlQeV9WSVNJVChzZWxmLT5sYXN0X3N0cmluZyk7Ci0JUHlfVklTSVQoc2VsZi0+ZmluZF9jbGFzcyk7Ci0JcmV0dXJuIDA7CisgICAgUHlfVklTSVQoc2VsZi0+cmVhZGxpbmUpOworICAgIFB5X1ZJU0lUKHNlbGYtPnJlYWQpOworICAgIFB5X1ZJU0lUKHNlbGYtPmZpbGUpOworICAgIFB5X1ZJU0lUKHNlbGYtPm1lbW8pOworICAgIFB5X1ZJU0lUKHNlbGYtPnN0YWNrKTsKKyAgICBQeV9WSVNJVChzZWxmLT5wZXJzX2Z1bmMpOworICAgIFB5X1ZJU0lUKHNlbGYtPmFyZyk7CisgICAgUHlfVklTSVQoc2VsZi0+bGFzdF9zdHJpbmcpOworICAgIFB5X1ZJU0lUKHNlbGYtPmZpbmRfY2xhc3MpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBVbnBpY2tsZXJfY2xlYXIoVW5waWNrbGVyb2JqZWN0ICpzZWxmKQogewotCVB5X0NMRUFSKHNlbGYtPnJlYWRsaW5lKTsKLQlQeV9DTEVBUihzZWxmLT5yZWFkKTsKLQlQeV9DTEVBUihzZWxmLT5maWxlKTsKLQlQeV9DTEVBUihzZWxmLT5tZW1vKTsKLQlQeV9DTEVBUihzZWxmLT5zdGFjayk7Ci0JUHlfQ0xFQVIoc2VsZi0+cGVyc19mdW5jKTsKLQlQeV9DTEVBUihzZWxmLT5hcmcpOwotCVB5X0NMRUFSKHNlbGYtPmxhc3Rfc3RyaW5nKTsKLQlQeV9DTEVBUihzZWxmLT5maW5kX2NsYXNzKTsKLQlyZXR1cm4gMDsKKyAgICBQeV9DTEVBUihzZWxmLT5yZWFkbGluZSk7CisgICAgUHlfQ0xFQVIoc2VsZi0+cmVhZCk7CisgICAgUHlfQ0xFQVIoc2VsZi0+ZmlsZSk7CisgICAgUHlfQ0xFQVIoc2VsZi0+bWVtbyk7CisgICAgUHlfQ0xFQVIoc2VsZi0+c3RhY2spOworICAgIFB5X0NMRUFSKHNlbGYtPnBlcnNfZnVuYyk7CisgICAgUHlfQ0xFQVIoc2VsZi0+YXJnKTsKKyAgICBQeV9DTEVBUihzZWxmLT5sYXN0X3N0cmluZyk7CisgICAgUHlfQ0xFQVIoc2VsZi0+ZmluZF9jbGFzcyk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBVbnBpY2tsZXJfZ2V0YXR0cihVbnBpY2tsZXJvYmplY3QgKnNlbGYsIGNoYXIgKm5hbWUpCiB7Ci0JaWYgKCFzdHJjbXAobmFtZSwgInBlcnNpc3RlbnRfbG9hZCIpKSB7Ci0JCWlmICghc2VsZi0+cGVyc19mdW5jKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfQXR0cmlidXRlRXJyb3IsIG5hbWUpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KKyAgICBpZiAoIXN0cmNtcChuYW1lLCAicGVyc2lzdGVudF9sb2FkIikpIHsKKyAgICAgICAgaWYgKCFzZWxmLT5wZXJzX2Z1bmMpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19BdHRyaWJ1dGVFcnJvciwgbmFtZSk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQogCi0JCVB5X0lOQ1JFRihzZWxmLT5wZXJzX2Z1bmMpOwotCQlyZXR1cm4gc2VsZi0+cGVyc19mdW5jOwotCX0KKyAgICAgICAgUHlfSU5DUkVGKHNlbGYtPnBlcnNfZnVuYyk7CisgICAgICAgIHJldHVybiBzZWxmLT5wZXJzX2Z1bmM7CisgICAgfQogCi0JaWYgKCFzdHJjbXAobmFtZSwgImZpbmRfZ2xvYmFsIikpIHsKLQkJaWYgKCFzZWxmLT5maW5kX2NsYXNzKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfQXR0cmlidXRlRXJyb3IsIG5hbWUpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiZmluZF9nbG9iYWwiKSkgeworICAgICAgICBpZiAoIXNlbGYtPmZpbmRfY2xhc3MpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19BdHRyaWJ1dGVFcnJvciwgbmFtZSk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQogCi0JCVB5X0lOQ1JFRihzZWxmLT5maW5kX2NsYXNzKTsKLQkJcmV0dXJuIHNlbGYtPmZpbmRfY2xhc3M7Ci0JfQorICAgICAgICBQeV9JTkNSRUYoc2VsZi0+ZmluZF9jbGFzcyk7CisgICAgICAgIHJldHVybiBzZWxmLT5maW5kX2NsYXNzOworICAgIH0KIAotCWlmICghc3RyY21wKG5hbWUsICJtZW1vIikpIHsKLQkJaWYgKCFzZWxmLT5tZW1vKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfQXR0cmlidXRlRXJyb3IsIG5hbWUpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KKyAgICBpZiAoIXN0cmNtcChuYW1lLCAibWVtbyIpKSB7CisgICAgICAgIGlmICghc2VsZi0+bWVtbykgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0F0dHJpYnV0ZUVycm9yLCBuYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CiAKLQkJUHlfSU5DUkVGKHNlbGYtPm1lbW8pOwotCQlyZXR1cm4gc2VsZi0+bWVtbzsKLQl9CisgICAgICAgIFB5X0lOQ1JFRihzZWxmLT5tZW1vKTsKKyAgICAgICAgcmV0dXJuIHNlbGYtPm1lbW87CisgICAgfQogCi0JaWYgKCFzdHJjbXAobmFtZSwgIlVucGlja2xpbmdFcnJvciIpKSB7Ci0JCVB5X0lOQ1JFRihVbnBpY2tsaW5nRXJyb3IpOwotCQlyZXR1cm4gVW5waWNrbGluZ0Vycm9yOwotCX0KKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiVW5waWNrbGluZ0Vycm9yIikpIHsKKyAgICAgICAgUHlfSU5DUkVGKFVucGlja2xpbmdFcnJvcik7CisgICAgICAgIHJldHVybiBVbnBpY2tsaW5nRXJyb3I7CisgICAgfQogCi0JcmV0dXJuIFB5X0ZpbmRNZXRob2QoVW5waWNrbGVyX21ldGhvZHMsIChQeU9iamVjdCAqKXNlbGYsIG5hbWUpOworICAgIHJldHVybiBQeV9GaW5kTWV0aG9kKFVucGlja2xlcl9tZXRob2RzLCAoUHlPYmplY3QgKilzZWxmLCBuYW1lKTsKIH0KIAogCkBAIC01NDgxLDQwICs1NDgxLDQwIEBACiBVbnBpY2tsZXJfc2V0YXR0cihVbnBpY2tsZXJvYmplY3QgKnNlbGYsIGNoYXIgKm5hbWUsIFB5T2JqZWN0ICp2YWx1ZSkKIHsKIAotCWlmICghc3RyY21wKG5hbWUsICJwZXJzaXN0ZW50X2xvYWQiKSkgewotCQlQeV9YREVDUkVGKHNlbGYtPnBlcnNfZnVuYyk7Ci0JCXNlbGYtPnBlcnNfZnVuYyA9IHZhbHVlOwotCQlQeV9YSU5DUkVGKHZhbHVlKTsKLQkJcmV0dXJuIDA7Ci0JfQorICAgIGlmICghc3RyY21wKG5hbWUsICJwZXJzaXN0ZW50X2xvYWQiKSkgeworICAgICAgICBQeV9YREVDUkVGKHNlbGYtPnBlcnNfZnVuYyk7CisgICAgICAgIHNlbGYtPnBlcnNfZnVuYyA9IHZhbHVlOworICAgICAgICBQeV9YSU5DUkVGKHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCi0JaWYgKCFzdHJjbXAobmFtZSwgImZpbmRfZ2xvYmFsIikpIHsKLQkJUHlfWERFQ1JFRihzZWxmLT5maW5kX2NsYXNzKTsKLQkJc2VsZi0+ZmluZF9jbGFzcyA9IHZhbHVlOwotCQlQeV9YSU5DUkVGKHZhbHVlKTsKLQkJcmV0dXJuIDA7Ci0JfQorICAgIGlmICghc3RyY21wKG5hbWUsICJmaW5kX2dsb2JhbCIpKSB7CisgICAgICAgIFB5X1hERUNSRUYoc2VsZi0+ZmluZF9jbGFzcyk7CisgICAgICAgIHNlbGYtPmZpbmRfY2xhc3MgPSB2YWx1ZTsKKyAgICAgICAgUHlfWElOQ1JFRih2YWx1ZSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KIAotCWlmICghIHZhbHVlKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJImF0dHJpYnV0ZSBkZWxldGlvbiBpcyBub3Qgc3VwcG9ydGVkIik7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgaWYgKCEgdmFsdWUpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJhdHRyaWJ1dGUgZGVsZXRpb24gaXMgbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JaWYgKHN0cmNtcChuYW1lLCAibWVtbyIpID09IDApIHsKLQkJaWYgKCFQeURpY3RfQ2hlY2sodmFsdWUpKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCQkibWVtbyBtdXN0IGJlIGEgZGljdGlvbmFyeSIpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCVB5X1hERUNSRUYoc2VsZi0+bWVtbyk7Ci0JCXNlbGYtPm1lbW8gPSB2YWx1ZTsKLQkJUHlfSU5DUkVGKHZhbHVlKTsKLQkJcmV0dXJuIDA7Ci0JfQorICAgIGlmIChzdHJjbXAobmFtZSwgIm1lbW8iKSA9PSAwKSB7CisgICAgICAgIGlmICghUHlEaWN0X0NoZWNrKHZhbHVlKSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWVtbyBtdXN0IGJlIGEgZGljdGlvbmFyeSIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIFB5X1hERUNSRUYoc2VsZi0+bWVtbyk7CisgICAgICAgIHNlbGYtPm1lbW8gPSB2YWx1ZTsKKyAgICAgICAgUHlfSU5DUkVGKHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCi0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0F0dHJpYnV0ZUVycm9yLCBuYW1lKTsKLQlyZXR1cm4gLTE7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0F0dHJpYnV0ZUVycm9yLCBuYW1lKTsKKyAgICByZXR1cm4gLTE7CiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNTUyNSwyOCArNTUyNSwyOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGNwbV9kdW1wKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0Jc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJvYmoiLCAiZmlsZSIsICJwcm90b2NvbCIsIE5VTEx9OwotCVB5T2JqZWN0ICpvYiwgKmZpbGUsICpyZXMgPSBOVUxMOwotCVBpY2tsZXJvYmplY3QgKnBpY2tsZXIgPSAwOwotCWludCBwcm90byA9IDA7CisgICAgc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJvYmoiLCAiZmlsZSIsICJwcm90b2NvbCIsIE5VTEx9OworICAgIFB5T2JqZWN0ICpvYiwgKmZpbGUsICpyZXMgPSBOVUxMOworICAgIFBpY2tsZXJvYmplY3QgKnBpY2tsZXIgPSAwOworICAgIGludCBwcm90byA9IDA7CiAKLQlpZiAoISggUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJPT3xpIiwga3dsaXN0LAotCQkgICAmb2IsICZmaWxlLCAmcHJvdG8pKSkKLQkJZ290byBmaW5hbGx5OworICAgIGlmICghKCBQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgIk9PfGkiLCBrd2xpc3QsCisgICAgICAgICAgICAgICAmb2IsICZmaWxlLCAmcHJvdG8pKSkKKyAgICAgICAgZ290byBmaW5hbGx5OwogCi0JaWYgKCEoIHBpY2tsZXIgPSBuZXdQaWNrbGVyb2JqZWN0KGZpbGUsIHByb3RvKSkpCi0JCWdvdG8gZmluYWxseTsKKyAgICBpZiAoISggcGlja2xlciA9IG5ld1BpY2tsZXJvYmplY3QoZmlsZSwgcHJvdG8pKSkKKyAgICAgICAgZ290byBmaW5hbGx5OwogCi0JaWYgKGR1bXAocGlja2xlciwgb2IpIDwgMCkKLQkJZ290byBmaW5hbGx5OworICAgIGlmIChkdW1wKHBpY2tsZXIsIG9iKSA8IDApCisgICAgICAgIGdvdG8gZmluYWxseTsKIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXMgPSBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXMgPSBQeV9Ob25lOwogCiAgIGZpbmFsbHk6Ci0JUHlfWERFQ1JFRihwaWNrbGVyKTsKKyAgICBQeV9YREVDUkVGKHBpY2tsZXIpOwogCi0JcmV0dXJuIHJlczsKKyAgICByZXR1cm4gcmVzOwogfQogCiAKQEAgLTU1NTQsMzEgKzU1NTQsMzEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBjcG1fZHVtcHMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7Im9iaiIsICJwcm90b2NvbCIsIE5VTEx9OwotCVB5T2JqZWN0ICpvYiwgKmZpbGUgPSAwLCAqcmVzID0gTlVMTDsKLQlQaWNrbGVyb2JqZWN0ICpwaWNrbGVyID0gMDsKLQlpbnQgcHJvdG8gPSAwOworICAgIHN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsib2JqIiwgInByb3RvY29sIiwgTlVMTH07CisgICAgUHlPYmplY3QgKm9iLCAqZmlsZSA9IDAsICpyZXMgPSBOVUxMOworICAgIFBpY2tsZXJvYmplY3QgKnBpY2tsZXIgPSAwOworICAgIGludCBwcm90byA9IDA7CiAKLQlpZiAoISggUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJPfGk6ZHVtcHMiLCBrd2xpc3QsCi0JCSAgICZvYiwgJnByb3RvKSkpCi0JCWdvdG8gZmluYWxseTsKKyAgICBpZiAoISggUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJPfGk6ZHVtcHMiLCBrd2xpc3QsCisgICAgICAgICAgICAgICAmb2IsICZwcm90bykpKQorICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQlpZiAoISggZmlsZSA9IFB5Y1N0cmluZ0lPLT5OZXdPdXRwdXQoMTI4KSkpCi0JCWdvdG8gZmluYWxseTsKKyAgICBpZiAoISggZmlsZSA9IFB5Y1N0cmluZ0lPLT5OZXdPdXRwdXQoMTI4KSkpCisgICAgICAgIGdvdG8gZmluYWxseTsKIAotCWlmICghKCBwaWNrbGVyID0gbmV3UGlja2xlcm9iamVjdChmaWxlLCBwcm90bykpKQotCQlnb3RvIGZpbmFsbHk7CisgICAgaWYgKCEoIHBpY2tsZXIgPSBuZXdQaWNrbGVyb2JqZWN0KGZpbGUsIHByb3RvKSkpCisgICAgICAgIGdvdG8gZmluYWxseTsKIAotCWlmIChkdW1wKHBpY2tsZXIsIG9iKSA8IDApCi0JCWdvdG8gZmluYWxseTsKKyAgICBpZiAoZHVtcChwaWNrbGVyLCBvYikgPCAwKQorICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQlyZXMgPSBQeWNTdHJpbmdJTy0+Y2dldHZhbHVlKGZpbGUpOworICAgIHJlcyA9IFB5Y1N0cmluZ0lPLT5jZ2V0dmFsdWUoZmlsZSk7CiAKICAgZmluYWxseToKLQlQeV9YREVDUkVGKHBpY2tsZXIpOwotCVB5X1hERUNSRUYoZmlsZSk7CisgICAgUHlfWERFQ1JFRihwaWNrbGVyKTsKKyAgICBQeV9YREVDUkVGKGZpbGUpOwogCi0JcmV0dXJuIHJlczsKKyAgICByZXR1cm4gcmVzOwogfQogCiAKQEAgLTU1ODYsMTggKzU1ODYsMTggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBjcG1fbG9hZChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm9iKQogewotCVVucGlja2xlcm9iamVjdCAqdW5waWNrbGVyID0gMDsKLQlQeU9iamVjdCAqcmVzID0gTlVMTDsKKyAgICBVbnBpY2tsZXJvYmplY3QgKnVucGlja2xlciA9IDA7CisgICAgUHlPYmplY3QgKnJlcyA9IE5VTEw7CiAKLQlpZiAoISggdW5waWNrbGVyID0gbmV3VW5waWNrbGVyb2JqZWN0KG9iKSkpCi0JCWdvdG8gZmluYWxseTsKKyAgICBpZiAoISggdW5waWNrbGVyID0gbmV3VW5waWNrbGVyb2JqZWN0KG9iKSkpCisgICAgICAgIGdvdG8gZmluYWxseTsKIAotCXJlcyA9IGxvYWQodW5waWNrbGVyKTsKKyAgICByZXMgPSBsb2FkKHVucGlja2xlcik7CiAKICAgZmluYWxseToKLQlQeV9YREVDUkVGKHVucGlja2xlcik7CisgICAgUHlfWERFQ1JFRih1bnBpY2tsZXIpOwogCi0JcmV0dXJuIHJlczsKKyAgICByZXR1cm4gcmVzOwogfQogCiAKQEAgLTU2MDUsMjUgKzU2MDUsMjUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBjcG1fbG9hZHMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICpvYiwgKmZpbGUgPSAwLCAqcmVzID0gTlVMTDsKLQlVbnBpY2tsZXJvYmplY3QgKnVucGlja2xlciA9IDA7CisgICAgUHlPYmplY3QgKm9iLCAqZmlsZSA9IDAsICpyZXMgPSBOVUxMOworICAgIFVucGlja2xlcm9iamVjdCAqdW5waWNrbGVyID0gMDsKIAotCWlmICghKCBQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJTOmxvYWRzIiwgJm9iKSkpCi0JCWdvdG8gZmluYWxseTsKKyAgICBpZiAoISggUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiUzpsb2FkcyIsICZvYikpKQorICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQlpZiAoISggZmlsZSA9IFB5Y1N0cmluZ0lPLT5OZXdJbnB1dChvYikpKQotCQlnb3RvIGZpbmFsbHk7CisgICAgaWYgKCEoIGZpbGUgPSBQeWNTdHJpbmdJTy0+TmV3SW5wdXQob2IpKSkKKyAgICAgICAgZ290byBmaW5hbGx5OwogCi0JaWYgKCEoIHVucGlja2xlciA9IG5ld1VucGlja2xlcm9iamVjdChmaWxlKSkpCi0JCWdvdG8gZmluYWxseTsKKyAgICBpZiAoISggdW5waWNrbGVyID0gbmV3VW5waWNrbGVyb2JqZWN0KGZpbGUpKSkKKyAgICAgICAgZ290byBmaW5hbGx5OwogCi0JcmVzID0gbG9hZCh1bnBpY2tsZXIpOworICAgIHJlcyA9IGxvYWQodW5waWNrbGVyKTsKIAogICBmaW5hbGx5OgotCVB5X1hERUNSRUYoZmlsZSk7Ci0JUHlfWERFQ1JFRih1bnBpY2tsZXIpOworICAgIFB5X1hERUNSRUYoZmlsZSk7CisgICAgUHlfWERFQ1JFRih1bnBpY2tsZXIpOwogCi0JcmV0dXJuIHJlczsKKyAgICByZXR1cm4gcmVzOwogfQogCiAKQEAgLTU2MzIsMjggKzU2MzIsMjggQEAKIAogc3RhdGljIFB5VHlwZU9iamVjdCBVbnBpY2tsZXJ0eXBlID0gewogICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotICAgICJjUGlja2xlLlVucGlja2xlciIsIAkgICAgICAgICAvKnRwX25hbWUqLworICAgICJjUGlja2xlLlVucGlja2xlciIsICAgICAgICAgICAgICAgICAvKnRwX25hbWUqLwogICAgIHNpemVvZihVbnBpY2tsZXJvYmplY3QpLCAgICAgICAgICAgICAvKnRwX2Jhc2ljc2l6ZSovCiAgICAgMCwKLSAgICAoZGVzdHJ1Y3RvcilVbnBpY2tsZXJfZGVhbGxvYywJLyogdHBfZGVhbGxvYyAqLwotICAgIDAsCQkJCQkvKiB0cF9wcmludCAqLwotICAgIChnZXRhdHRyZnVuYylVbnBpY2tsZXJfZ2V0YXR0ciwJLyogdHBfZ2V0YXR0ciAqLwotICAgIChzZXRhdHRyZnVuYylVbnBpY2tsZXJfc2V0YXR0ciwJLyogdHBfc2V0YXR0ciAqLwotICAgIDAsCQkJCQkvKiB0cF9jb21wYXJlICovCi0gICAgMCwJCSAJCQkvKiB0cF9yZXByICovCi0gICAgMCwJCQkJCS8qIHRwX2FzX251bWJlciAqLwotICAgIDAsCQkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotICAgIDAsCQkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0gICAgMCwJCQkJCS8qIHRwX2hhc2ggKi8KLSAgICAwLAkJCQkJLyogdHBfY2FsbCAqLwotICAgIDAsCQkJCQkvKiB0cF9zdHIgKi8KLSAgICAwLAkJCQkJLyogdHBfZ2V0YXR0cm8gKi8KLSAgICAwLAkJCQkJLyogdHBfc2V0YXR0cm8gKi8KLSAgICAwLAkJCQkJLyogdHBfYXNfYnVmZmVyICovCisgICAgKGRlc3RydWN0b3IpVW5waWNrbGVyX2RlYWxsb2MsICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgKGdldGF0dHJmdW5jKVVucGlja2xlcl9nZXRhdHRyLCAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIChzZXRhdHRyZnVuYylVbnBpY2tsZXJfc2V0YXR0ciwgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLwogICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfQkFTRVRZUEUgfCBQeV9UUEZMQUdTX0hBVkVfR0MsCi0gICAgVW5waWNrbGVydHlwZV9fZG9jX18sCQkvKiB0cF9kb2MgKi8KLSAgICAodHJhdmVyc2Vwcm9jKVVucGlja2xlcl90cmF2ZXJzZSwJLyogdHBfdHJhdmVyc2UgKi8KLSAgICAoaW5xdWlyeSlVbnBpY2tsZXJfY2xlYXIsCQkvKiB0cF9jbGVhciAqLworICAgIFVucGlja2xlcnR5cGVfX2RvY19fLCAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2MpVW5waWNrbGVyX3RyYXZlcnNlLCAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgKGlucXVpcnkpVW5waWNrbGVyX2NsZWFyLCAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KIH07CiAKIHN0YXRpYyBzdHJ1Y3QgUHlNZXRob2REZWYgY1BpY2tsZV9tZXRob2RzW10gPSB7CkBAIC01NzExLDE5OCArNTcxMSwxOTggQEAKIHN0YXRpYyBpbnQKIGluaXRfc3R1ZmYoUHlPYmplY3QgKm1vZHVsZV9kaWN0KQogewotCVB5T2JqZWN0ICpjb3B5cmVnLCAqdCwgKnI7CisgICAgUHlPYmplY3QgKmNvcHlyZWcsICp0LCAqcjsKIAogI2RlZmluZSBJTklUX1NUUihTKSBpZiAoISggUyAjIyBfc3RyPVB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoI1MpKSkgIHJldHVybiAtMTsKIAotCWlmIChQeVR5cGVfUmVhZHkoJlVucGlja2xlcnR5cGUpIDwgMCkKLQkJcmV0dXJuIC0xOwotCWlmIChQeVR5cGVfUmVhZHkoJlBpY2tsZXJ0eXBlKSA8IDApCi0JCXJldHVybiAtMTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZVbnBpY2tsZXJ0eXBlKSA8IDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZQaWNrbGVydHlwZSkgPCAwKQorICAgICAgICByZXR1cm4gLTE7CiAKLQlJTklUX1NUUihfX2NsYXNzX18pOwotCUlOSVRfU1RSKF9fZ2V0aW5pdGFyZ3NfXyk7Ci0JSU5JVF9TVFIoX19kaWN0X18pOwotCUlOSVRfU1RSKF9fZ2V0c3RhdGVfXyk7Ci0JSU5JVF9TVFIoX19zZXRzdGF0ZV9fKTsKLQlJTklUX1NUUihfX25hbWVfXyk7Ci0JSU5JVF9TVFIoX19tYWluX18pOwotCUlOSVRfU1RSKF9fcmVkdWNlX18pOwotCUlOSVRfU1RSKF9fcmVkdWNlX2V4X18pOwotCUlOSVRfU1RSKHdyaXRlKTsKLQlJTklUX1NUUihhcHBlbmQpOwotCUlOSVRfU1RSKHJlYWQpOwotCUlOSVRfU1RSKHJlYWRsaW5lKTsKLQlJTklUX1NUUihkaXNwYXRjaF90YWJsZSk7CisgICAgSU5JVF9TVFIoX19jbGFzc19fKTsKKyAgICBJTklUX1NUUihfX2dldGluaXRhcmdzX18pOworICAgIElOSVRfU1RSKF9fZGljdF9fKTsKKyAgICBJTklUX1NUUihfX2dldHN0YXRlX18pOworICAgIElOSVRfU1RSKF9fc2V0c3RhdGVfXyk7CisgICAgSU5JVF9TVFIoX19uYW1lX18pOworICAgIElOSVRfU1RSKF9fbWFpbl9fKTsKKyAgICBJTklUX1NUUihfX3JlZHVjZV9fKTsKKyAgICBJTklUX1NUUihfX3JlZHVjZV9leF9fKTsKKyAgICBJTklUX1NUUih3cml0ZSk7CisgICAgSU5JVF9TVFIoYXBwZW5kKTsKKyAgICBJTklUX1NUUihyZWFkKTsKKyAgICBJTklUX1NUUihyZWFkbGluZSk7CisgICAgSU5JVF9TVFIoZGlzcGF0Y2hfdGFibGUpOwogCi0JaWYgKCEoIGNvcHlyZWcgPSBQeUltcG9ydF9JbXBvcnRNb2R1bGUoImNvcHlfcmVnIikpKQotCQlyZXR1cm4gLTE7CisgICAgaWYgKCEoIGNvcHlyZWcgPSBQeUltcG9ydF9JbXBvcnRNb2R1bGUoImNvcHlfcmVnIikpKQorICAgICAgICByZXR1cm4gLTE7CiAKLQkvKiBUaGlzIGlzIHNwZWNpYWwgYmVjYXVzZSB3ZSB3YW50IHRvIHVzZSBhIGRpZmZlcmVudAotCSAgIG9uZSBpbiByZXN0cmljdGVkIG1vZGUuICovCi0JZGlzcGF0Y2hfdGFibGUgPSBQeU9iamVjdF9HZXRBdHRyKGNvcHlyZWcsIGRpc3BhdGNoX3RhYmxlX3N0cik7Ci0JaWYgKCFkaXNwYXRjaF90YWJsZSkgcmV0dXJuIC0xOworICAgIC8qIFRoaXMgaXMgc3BlY2lhbCBiZWNhdXNlIHdlIHdhbnQgdG8gdXNlIGEgZGlmZmVyZW50CisgICAgICAgb25lIGluIHJlc3RyaWN0ZWQgbW9kZS4gKi8KKyAgICBkaXNwYXRjaF90YWJsZSA9IFB5T2JqZWN0X0dldEF0dHIoY29weXJlZywgZGlzcGF0Y2hfdGFibGVfc3RyKTsKKyAgICBpZiAoIWRpc3BhdGNoX3RhYmxlKSByZXR1cm4gLTE7CiAKLQlleHRlbnNpb25fcmVnaXN0cnkgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKGNvcHlyZWcsCi0JCQkJIl9leHRlbnNpb25fcmVnaXN0cnkiKTsKLQlpZiAoIWV4dGVuc2lvbl9yZWdpc3RyeSkgcmV0dXJuIC0xOworICAgIGV4dGVuc2lvbl9yZWdpc3RyeSA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoY29weXJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX2V4dGVuc2lvbl9yZWdpc3RyeSIpOworICAgIGlmICghZXh0ZW5zaW9uX3JlZ2lzdHJ5KSByZXR1cm4gLTE7CiAKLQlpbnZlcnRlZF9yZWdpc3RyeSA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoY29weXJlZywKLQkJCQkiX2ludmVydGVkX3JlZ2lzdHJ5Iik7Ci0JaWYgKCFpbnZlcnRlZF9yZWdpc3RyeSkgcmV0dXJuIC0xOworICAgIGludmVydGVkX3JlZ2lzdHJ5ID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhjb3B5cmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfaW52ZXJ0ZWRfcmVnaXN0cnkiKTsKKyAgICBpZiAoIWludmVydGVkX3JlZ2lzdHJ5KSByZXR1cm4gLTE7CiAKLQlleHRlbnNpb25fY2FjaGUgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKGNvcHlyZWcsCi0JCQkJIl9leHRlbnNpb25fY2FjaGUiKTsKLQlpZiAoIWV4dGVuc2lvbl9jYWNoZSkgcmV0dXJuIC0xOworICAgIGV4dGVuc2lvbl9jYWNoZSA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoY29weXJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX2V4dGVuc2lvbl9jYWNoZSIpOworICAgIGlmICghZXh0ZW5zaW9uX2NhY2hlKSByZXR1cm4gLTE7CiAKLQlQeV9ERUNSRUYoY29weXJlZyk7CisgICAgUHlfREVDUkVGKGNvcHlyZWcpOwogCi0JaWYgKCEoZW1wdHlfdHVwbGUgPSBQeVR1cGxlX05ldygwKSkpCi0JCXJldHVybiAtMTsKKyAgICBpZiAoIShlbXB0eV90dXBsZSA9IFB5VHVwbGVfTmV3KDApKSkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0JdHdvX3R1cGxlID0gUHlUdXBsZV9OZXcoMik7Ci0JaWYgKHR3b190dXBsZSA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0JLyogV2UgdXNlIHRoaXMgdGVtcCBjb250YWluZXIgd2l0aCBubyByZWdhcmQgdG8gcmVmY291bnRzLCBvciB0bwotCSAqIGtlZXBpbmcgY29udGFpbmVlcyBhbGl2ZS4gIEV4ZW1wdCBmcm9tIEdDLCBiZWNhdXNlIHdlIGRvbid0Ci0JICogd2FudCBhbnl0aGluZyBsb29raW5nIGF0IHR3b190dXBsZSgpIGJ5IG1hZ2ljLgotCSAqLwotCVB5T2JqZWN0X0dDX1VuVHJhY2sodHdvX3R1cGxlKTsKKyAgICB0d29fdHVwbGUgPSBQeVR1cGxlX05ldygyKTsKKyAgICBpZiAodHdvX3R1cGxlID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKyAgICAvKiBXZSB1c2UgdGhpcyB0ZW1wIGNvbnRhaW5lciB3aXRoIG5vIHJlZ2FyZCB0byByZWZjb3VudHMsIG9yIHRvCisgICAgICoga2VlcGluZyBjb250YWluZWVzIGFsaXZlLiAgRXhlbXB0IGZyb20gR0MsIGJlY2F1c2Ugd2UgZG9uJ3QKKyAgICAgKiB3YW50IGFueXRoaW5nIGxvb2tpbmcgYXQgdHdvX3R1cGxlKCkgYnkgbWFnaWMuCisgICAgICovCisgICAgUHlPYmplY3RfR0NfVW5UcmFjayh0d29fdHVwbGUpOwogCi0JLyogVWdoICovCi0JaWYgKCEoIHQ9UHlJbXBvcnRfSW1wb3J0TW9kdWxlKCJfX2J1aWx0aW5fXyIpKSkgIHJldHVybiAtMTsKLQlpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcobW9kdWxlX2RpY3QsICJfX2J1aWx0aW5zX18iLCB0KSA8IDApCi0JCXJldHVybiAtMTsKKyAgICAvKiBVZ2ggKi8KKyAgICBpZiAoISggdD1QeUltcG9ydF9JbXBvcnRNb2R1bGUoIl9fYnVpbHRpbl9fIikpKSAgcmV0dXJuIC0xOworICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhtb2R1bGVfZGljdCwgIl9fYnVpbHRpbnNfXyIsIHQpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0JaWYgKCEoIHQ9UHlEaWN0X05ldygpKSkgIHJldHVybiAtMTsKLQlpZiAoISggcj1QeVJ1bl9TdHJpbmcoCi0JCSAgICAgICAiZGVmIF9fc3RyX18oc2VsZik6XG4iCi0JCSAgICAgICAiICByZXR1cm4gc2VsZi5hcmdzIGFuZCAoJyVzJyAlIHNlbGYuYXJnc1swXSkgb3IgJyh3aGF0KSdcbiIsCi0JCSAgICAgICBQeV9maWxlX2lucHV0LAotCQkgICAgICAgbW9kdWxlX2RpY3QsIHQpICApKSAgcmV0dXJuIC0xOwotCVB5X0RFQ1JFRihyKTsKKyAgICBpZiAoISggdD1QeURpY3RfTmV3KCkpKSAgcmV0dXJuIC0xOworICAgIGlmICghKCByPVB5UnVuX1N0cmluZygKKyAgICAgICAgICAgICAgICAgICAiZGVmIF9fc3RyX18oc2VsZik6XG4iCisgICAgICAgICAgICAgICAgICAgIiAgcmV0dXJuIHNlbGYuYXJncyBhbmQgKCclcycgJSBzZWxmLmFyZ3NbMF0pIG9yICcod2hhdCknXG4iLAorICAgICAgICAgICAgICAgICAgIFB5X2ZpbGVfaW5wdXQsCisgICAgICAgICAgICAgICAgICAgbW9kdWxlX2RpY3QsIHQpICApKSAgcmV0dXJuIC0xOworICAgIFB5X0RFQ1JFRihyKTsKIAotCVBpY2tsZUVycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJjUGlja2xlLlBpY2tsZUVycm9yIiwgTlVMTCwgdCk7Ci0JaWYgKCFQaWNrbGVFcnJvcikKLQkJcmV0dXJuIC0xOworICAgIFBpY2tsZUVycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJjUGlja2xlLlBpY2tsZUVycm9yIiwgTlVMTCwgdCk7CisgICAgaWYgKCFQaWNrbGVFcnJvcikKKyAgICAgICAgcmV0dXJuIC0xOwogCi0JUHlfREVDUkVGKHQpOworICAgIFB5X0RFQ1JFRih0KTsKIAotCVBpY2tsaW5nRXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oImNQaWNrbGUuUGlja2xpbmdFcnJvciIsCi0JCQkJCSAgIFBpY2tsZUVycm9yLCBOVUxMKTsKLQlpZiAoIVBpY2tsaW5nRXJyb3IpCi0JCXJldHVybiAtMTsKKyAgICBQaWNrbGluZ0Vycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJjUGlja2xlLlBpY2tsaW5nRXJyb3IiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGlja2xlRXJyb3IsIE5VTEwpOworICAgIGlmICghUGlja2xpbmdFcnJvcikKKyAgICAgICAgcmV0dXJuIC0xOwogCi0JaWYgKCEoIHQ9UHlEaWN0X05ldygpKSkgIHJldHVybiAtMTsKLQlpZiAoISggcj1QeVJ1bl9TdHJpbmcoCi0JCSAgICAgICAiZGVmIF9fc3RyX18oc2VsZik6XG4iCi0JCSAgICAgICAiICBhPXNlbGYuYXJnc1xuIgotCQkgICAgICAgIiAgYT1hIGFuZCB0eXBlKGFbMF0pIG9yICcod2hhdCknXG4iCi0JCSAgICAgICAiICByZXR1cm4gJ0Nhbm5vdCBwaWNrbGUgJXMgb2JqZWN0cycgJSBhXG4iCi0JCSAgICAgICAsIFB5X2ZpbGVfaW5wdXQsCi0JCSAgICAgICBtb2R1bGVfZGljdCwgdCkgICkpICByZXR1cm4gLTE7Ci0JUHlfREVDUkVGKHIpOworICAgIGlmICghKCB0PVB5RGljdF9OZXcoKSkpICByZXR1cm4gLTE7CisgICAgaWYgKCEoIHI9UHlSdW5fU3RyaW5nKAorICAgICAgICAgICAgICAgICAgICJkZWYgX19zdHJfXyhzZWxmKTpcbiIKKyAgICAgICAgICAgICAgICAgICAiICBhPXNlbGYuYXJnc1xuIgorICAgICAgICAgICAgICAgICAgICIgIGE9YSBhbmQgdHlwZShhWzBdKSBvciAnKHdoYXQpJ1xuIgorICAgICAgICAgICAgICAgICAgICIgIHJldHVybiAnQ2Fubm90IHBpY2tsZSAlcyBvYmplY3RzJyAlIGFcbiIKKyAgICAgICAgICAgICAgICAgICAsIFB5X2ZpbGVfaW5wdXQsCisgICAgICAgICAgICAgICAgICAgbW9kdWxlX2RpY3QsIHQpICApKSAgcmV0dXJuIC0xOworICAgIFB5X0RFQ1JFRihyKTsKIAotCWlmICghKCBVbnBpY2tsZWFibGVFcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbigKLQkJICAgICAgICJjUGlja2xlLlVucGlja2xlYWJsZUVycm9yIiwgUGlja2xpbmdFcnJvciwgdCkpKQotCQlyZXR1cm4gLTE7CisgICAgaWYgKCEoIFVucGlja2xlYWJsZUVycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICJjUGlja2xlLlVucGlja2xlYWJsZUVycm9yIiwgUGlja2xpbmdFcnJvciwgdCkpKQorICAgICAgICByZXR1cm4gLTE7CiAKLQlQeV9ERUNSRUYodCk7CisgICAgUHlfREVDUkVGKHQpOwogCi0JaWYgKCEoIFVucGlja2xpbmdFcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbigiY1BpY2tsZS5VbnBpY2tsaW5nRXJyb3IiLAotCQkJCQkJICAgIFBpY2tsZUVycm9yLCBOVUxMKSkpCi0JCXJldHVybiAtMTsKKyAgICBpZiAoISggVW5waWNrbGluZ0Vycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJjUGlja2xlLlVucGlja2xpbmdFcnJvciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQaWNrbGVFcnJvciwgTlVMTCkpKQorICAgICAgICByZXR1cm4gLTE7CiAKLSAgICAgICAgaWYgKCEoIEJhZFBpY2tsZUdldCA9IFB5RXJyX05ld0V4Y2VwdGlvbigiY1BpY2tsZS5CYWRQaWNrbGVHZXQiLAotCQkJCQkJIFVucGlja2xpbmdFcnJvciwgTlVMTCkpKQotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAoISggQmFkUGlja2xlR2V0ID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJjUGlja2xlLkJhZFBpY2tsZUdldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbnBpY2tsaW5nRXJyb3IsIE5VTEwpKSkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0JaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKG1vZHVsZV9kaWN0LCAiUGlja2xlRXJyb3IiLAotCQkJCSBQaWNrbGVFcnJvcikgPCAwKQotCQlyZXR1cm4gLTE7CisgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKG1vZHVsZV9kaWN0LCAiUGlja2xlRXJyb3IiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQaWNrbGVFcnJvcikgPCAwKQorICAgICAgICByZXR1cm4gLTE7CiAKLQlpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcobW9kdWxlX2RpY3QsICJQaWNrbGluZ0Vycm9yIiwKLQkJCQkgUGlja2xpbmdFcnJvcikgPCAwKQotCQlyZXR1cm4gLTE7CisgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKG1vZHVsZV9kaWN0LCAiUGlja2xpbmdFcnJvciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBpY2tsaW5nRXJyb3IpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0JaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKG1vZHVsZV9kaWN0LCAiVW5waWNrbGluZ0Vycm9yIiwKLQkJCQkgVW5waWNrbGluZ0Vycm9yKSA8IDApCi0JCXJldHVybiAtMTsKKyAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcobW9kdWxlX2RpY3QsICJVbnBpY2tsaW5nRXJyb3IiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbnBpY2tsaW5nRXJyb3IpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0JaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKG1vZHVsZV9kaWN0LCAiVW5waWNrbGVhYmxlRXJyb3IiLAotCQkJCSBVbnBpY2tsZWFibGVFcnJvcikgPCAwKQotCQlyZXR1cm4gLTE7CisgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKG1vZHVsZV9kaWN0LCAiVW5waWNrbGVhYmxlRXJyb3IiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbnBpY2tsZWFibGVFcnJvcikgPCAwKQorICAgICAgICByZXR1cm4gLTE7CiAKLQlpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcobW9kdWxlX2RpY3QsICJCYWRQaWNrbGVHZXQiLAotCQkJCSBCYWRQaWNrbGVHZXQpIDwgMCkKLQkJcmV0dXJuIC0xOworICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhtb2R1bGVfZGljdCwgIkJhZFBpY2tsZUdldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhZFBpY2tsZUdldCkgPCAwKQorICAgICAgICByZXR1cm4gLTE7CiAKLQlQeWNTdHJpbmdfSU1QT1JUOworICAgIFB5Y1N0cmluZ19JTVBPUlQ7CiAKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKIH0KIAotI2lmbmRlZiBQeU1PRElOSVRfRlVOQwkvKiBkZWNsYXJhdGlvbnMgZm9yIERMTCBpbXBvcnQvZXhwb3J0ICovCisjaWZuZGVmIFB5TU9ESU5JVF9GVU5DICAvKiBkZWNsYXJhdGlvbnMgZm9yIERMTCBpbXBvcnQvZXhwb3J0ICovCiAjZGVmaW5lIFB5TU9ESU5JVF9GVU5DIHZvaWQKICNlbmRpZgogUHlNT0RJTklUX0ZVTkMKIGluaXRjUGlja2xlKHZvaWQpCiB7Ci0JUHlPYmplY3QgKm0sICpkLCAqZGksICp2LCAqazsKLQlQeV9zc2l6ZV90IGk7Ci0JY2hhciAqcmV2ID0gIjEuNzEiOwkvKiBYWFggd2hlbiBkb2VzIHRoaXMgY2hhbmdlPyAqLwotCVB5T2JqZWN0ICpmb3JtYXRfdmVyc2lvbjsKLQlQeU9iamVjdCAqY29tcGF0aWJsZV9mb3JtYXRzOworICAgIFB5T2JqZWN0ICptLCAqZCwgKmRpLCAqdiwgKms7CisgICAgUHlfc3NpemVfdCBpOworICAgIGNoYXIgKnJldiA9ICIxLjcxIjsgICAgICAgICAvKiBYWFggd2hlbiBkb2VzIHRoaXMgY2hhbmdlPyAqLworICAgIFB5T2JqZWN0ICpmb3JtYXRfdmVyc2lvbjsKKyAgICBQeU9iamVjdCAqY29tcGF0aWJsZV9mb3JtYXRzOwogCi0JUHlfVFlQRSgmUGlja2xlcnR5cGUpID0gJlB5VHlwZV9UeXBlOwotCVB5X1RZUEUoJlVucGlja2xlcnR5cGUpID0gJlB5VHlwZV9UeXBlOwotCVB5X1RZUEUoJlBkYXRhVHlwZSkgPSAmUHlUeXBlX1R5cGU7CisgICAgUHlfVFlQRSgmUGlja2xlcnR5cGUpID0gJlB5VHlwZV9UeXBlOworICAgIFB5X1RZUEUoJlVucGlja2xlcnR5cGUpID0gJlB5VHlwZV9UeXBlOworICAgIFB5X1RZUEUoJlBkYXRhVHlwZSkgPSAmUHlUeXBlX1R5cGU7CiAKLQkvKiBJbml0aWFsaXplIHNvbWUgcGllY2VzLiBXZSBuZWVkIHRvIGRvIHRoaXMgYmVmb3JlIG1vZHVsZSBjcmVhdGlvbiwKLQkgKiBzbyB3ZSdyZSBmb3JjZWQgdG8gdXNlIGEgdGVtcG9yYXJ5IGRpY3Rpb25hcnkuIDooCi0JICovCi0JZGkgPSBQeURpY3RfTmV3KCk7Ci0JaWYgKCFkaSkgcmV0dXJuOwotCWlmIChpbml0X3N0dWZmKGRpKSA8IDApIHJldHVybjsKKyAgICAvKiBJbml0aWFsaXplIHNvbWUgcGllY2VzLiBXZSBuZWVkIHRvIGRvIHRoaXMgYmVmb3JlIG1vZHVsZSBjcmVhdGlvbiwKKyAgICAgKiBzbyB3ZSdyZSBmb3JjZWQgdG8gdXNlIGEgdGVtcG9yYXJ5IGRpY3Rpb25hcnkuIDooCisgICAgICovCisgICAgZGkgPSBQeURpY3RfTmV3KCk7CisgICAgaWYgKCFkaSkgcmV0dXJuOworICAgIGlmIChpbml0X3N0dWZmKGRpKSA8IDApIHJldHVybjsKIAotCS8qIENyZWF0ZSB0aGUgbW9kdWxlIGFuZCBhZGQgdGhlIGZ1bmN0aW9ucyAqLwotCW0gPSBQeV9Jbml0TW9kdWxlNCgiY1BpY2tsZSIsIGNQaWNrbGVfbWV0aG9kcywKLQkJCSAgIGNQaWNrbGVfbW9kdWxlX2RvY3VtZW50YXRpb24sCi0JCQkgICAoUHlPYmplY3QqKU5VTEwsUFlUSE9OX0FQSV9WRVJTSU9OKTsKLQlpZiAobSA9PSBOVUxMKQotCQlyZXR1cm47CisgICAgLyogQ3JlYXRlIHRoZSBtb2R1bGUgYW5kIGFkZCB0aGUgZnVuY3Rpb25zICovCisgICAgbSA9IFB5X0luaXRNb2R1bGU0KCJjUGlja2xlIiwgY1BpY2tsZV9tZXRob2RzLAorICAgICAgICAgICAgICAgICAgICAgICBjUGlja2xlX21vZHVsZV9kb2N1bWVudGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAoUHlPYmplY3QqKU5VTEwsUFlUSE9OX0FQSV9WRVJTSU9OKTsKKyAgICBpZiAobSA9PSBOVUxMKQorICAgICAgICByZXR1cm47CiAKLQkvKiBBZGQgc29tZSBzeW1ib2xpYyBjb25zdGFudHMgdG8gdGhlIG1vZHVsZSAqLwotCWQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOwotCXYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKHJldik7Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIl9fdmVyc2lvbl9fIiwgdik7Ci0JUHlfWERFQ1JFRih2KTsKKyAgICAvKiBBZGQgc29tZSBzeW1ib2xpYyBjb25zdGFudHMgdG8gdGhlIG1vZHVsZSAqLworICAgIGQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOworICAgIHYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKHJldik7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIl9fdmVyc2lvbl9fIiwgdik7CisgICAgUHlfWERFQ1JFRih2KTsKIAotCS8qIENvcHkgZGF0YSBmcm9tIGRpLiBXYWFhLiAqLwotCWZvciAoaT0wOyBQeURpY3RfTmV4dChkaSwgJmksICZrLCAmdik7ICkgewotCQlpZiAoUHlPYmplY3RfU2V0SXRlbShkLCBrLCB2KSA8IDApIHsKLQkJCVB5X0RFQ1JFRihkaSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0JUHlfREVDUkVGKGRpKTsKKyAgICAvKiBDb3B5IGRhdGEgZnJvbSBkaS4gV2FhYS4gKi8KKyAgICBmb3IgKGk9MDsgUHlEaWN0X05leHQoZGksICZpLCAmaywgJnYpOyApIHsKKyAgICAgICAgaWYgKFB5T2JqZWN0X1NldEl0ZW0oZCwgaywgdikgPCAwKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoZGkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIFB5X0RFQ1JFRihkaSk7CiAKLQlpID0gUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkhJR0hFU1RfUFJPVE9DT0wiLCBISUdIRVNUX1BST1RPQ09MKTsKLQlpZiAoaSA8IDApCi0JCXJldHVybjsKKyAgICBpID0gUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkhJR0hFU1RfUFJPVE9DT0wiLCBISUdIRVNUX1BST1RPQ09MKTsKKyAgICBpZiAoaSA8IDApCisgICAgICAgIHJldHVybjsKIAotCS8qIFRoZXNlIGFyZSBwdXJlbHkgaW5mb3JtYXRpb25hbDsgbm8gY29kZSB1c2VzIHRoZW0uICovCi0JLyogRmlsZSBmb3JtYXQgdmVyc2lvbiB3ZSB3cml0ZS4gKi8KLQlmb3JtYXRfdmVyc2lvbiA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIjIuMCIpOwotCS8qIEZvcm1hdCB2ZXJzaW9ucyB3ZSBjYW4gcmVhZC4gKi8KLQljb21wYXRpYmxlX2Zvcm1hdHMgPSBQeV9CdWlsZFZhbHVlKCJbc3Nzc3NdIiwKLQkJIjEuMCIsCS8qIE9yaWdpbmFsIHByb3RvY29sIDAgKi8KLQkJIjEuMSIsCS8qIFByb3RvY29sIDAgKyBJTlNUICovCi0JCSIxLjIiLAkvKiBPcmlnaW5hbCBwcm90b2NvbCAxICovCi0JCSIxLjMiLAkvKiBQcm90b2NvbCAxICsgQklORkxPQVQgKi8KLQkJIjIuMCIpOwkvKiBPcmlnaW5hbCBwcm90b2NvbCAyICovCi0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgImZvcm1hdF92ZXJzaW9uIiwgZm9ybWF0X3ZlcnNpb24pOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJjb21wYXRpYmxlX2Zvcm1hdHMiLCBjb21wYXRpYmxlX2Zvcm1hdHMpOwotCVB5X1hERUNSRUYoZm9ybWF0X3ZlcnNpb24pOwotCVB5X1hERUNSRUYoY29tcGF0aWJsZV9mb3JtYXRzKTsKKyAgICAvKiBUaGVzZSBhcmUgcHVyZWx5IGluZm9ybWF0aW9uYWw7IG5vIGNvZGUgdXNlcyB0aGVtLiAqLworICAgIC8qIEZpbGUgZm9ybWF0IHZlcnNpb24gd2Ugd3JpdGUuICovCisgICAgZm9ybWF0X3ZlcnNpb24gPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCIyLjAiKTsKKyAgICAvKiBGb3JtYXQgdmVyc2lvbnMgd2UgY2FuIHJlYWQuICovCisgICAgY29tcGF0aWJsZV9mb3JtYXRzID0gUHlfQnVpbGRWYWx1ZSgiW3Nzc3NzXSIsCisgICAgICAgICIxLjAiLCAgICAgICAgICAvKiBPcmlnaW5hbCBwcm90b2NvbCAwICovCisgICAgICAgICIxLjEiLCAgICAgICAgICAvKiBQcm90b2NvbCAwICsgSU5TVCAqLworICAgICAgICAiMS4yIiwgICAgICAgICAgLyogT3JpZ2luYWwgcHJvdG9jb2wgMSAqLworICAgICAgICAiMS4zIiwgICAgICAgICAgLyogUHJvdG9jb2wgMSArIEJJTkZMT0FUICovCisgICAgICAgICIyLjAiKTsgICAgICAgICAvKiBPcmlnaW5hbCBwcm90b2NvbCAyICovCisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgImZvcm1hdF92ZXJzaW9uIiwgZm9ybWF0X3ZlcnNpb24pOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJjb21wYXRpYmxlX2Zvcm1hdHMiLCBjb21wYXRpYmxlX2Zvcm1hdHMpOworICAgIFB5X1hERUNSRUYoZm9ybWF0X3ZlcnNpb24pOworICAgIFB5X1hERUNSRUYoY29tcGF0aWJsZV9mb3JtYXRzKTsKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvY1N0cmluZ0lPLmMgYi9Nb2R1bGVzL2NTdHJpbmdJTy5jCmluZGV4IDIzN2Q4YzIuLjdlMzMwMzMgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvY1N0cmluZ0lPLmMKKysrIGIvTW9kdWxlcy9jU3RyaW5nSU8uYwpAQCAtMzMsNyArMzMsNyBAQAogIlxuIgogImNTdHJpbmdJTy5jLHYgMS4yOSAxOTk5LzA2LzE1IDE0OjEwOjI3IGppbSBFeHBcbiIpOwogCi0vKiBEZWNsYXJhdGlvbiBmb3IgZmlsZS1saWtlIG9iamVjdHMgdGhhdCBtYW5hZ2UgZGF0YSBhcyBzdHJpbmdzIAorLyogRGVjbGFyYXRpb24gZm9yIGZpbGUtbGlrZSBvYmplY3RzIHRoYXQgbWFuYWdlIGRhdGEgYXMgc3RyaW5ncwogCiAgICBUaGUgSU9vYmplY3QgdHlwZSBzaG91bGQgYmUgdGhvdWdoIG9mIGFzIGEgY29tbW9uIGJhc2UgdHlwZSBmb3IKICAgIElvYmplY3RzLCB3aGljaCBwcm92aWRlIGlucHV0IChyZWFkLW9ubHkpIFN0cmluZ0lPIG9iamVjdHMgYW5kCkBAIC03NywzNyArNzcsMzcgQEAKIAogc3RhdGljIGludAogSU9fX29wZW5jaGVjayhJT29iamVjdCAqc2VsZikgewotICAgICAgICBpZiAoIXNlbGYtPmJ1ZikgewotICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSS9PIG9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZSIpOwotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAxOworICAgIGlmICghc2VsZi0+YnVmKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIkkvTyBvcGVyYXRpb24gb24gY2xvc2VkIGZpbGUiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogSU9fZ2V0X2Nsb3NlZChJT29iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlQeU9iamVjdCAqcmVzdWx0ID0gUHlfRmFsc2U7CisgICAgUHlPYmplY3QgKnJlc3VsdCA9IFB5X0ZhbHNlOwogCi0JaWYgKHNlbGYtPmJ1ZiA9PSBOVUxMKQotCQlyZXN1bHQgPSBQeV9UcnVlOwotCVB5X0lOQ1JFRihyZXN1bHQpOwotCXJldHVybiByZXN1bHQ7CisgICAgaWYgKHNlbGYtPmJ1ZiA9PSBOVUxMKQorICAgICAgICByZXN1bHQgPSBQeV9UcnVlOworICAgIFB5X0lOQ1JFRihyZXN1bHQpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBQeUdldFNldERlZiBmaWxlX2dldHNldGxpc3RbXSA9IHsKLQl7ImNsb3NlZCIsIChnZXR0ZXIpSU9fZ2V0X2Nsb3NlZCwgTlVMTCwgIlRydWUgaWYgdGhlIGZpbGUgaXMgY2xvc2VkIn0sCi0JezB9LAorICAgIHsiY2xvc2VkIiwgKGdldHRlcilJT19nZXRfY2xvc2VkLCBOVUxMLCAiVHJ1ZSBpZiB0aGUgZmlsZSBpcyBjbG9zZWQifSwKKyAgICB7MH0sCiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKgogSU9fZmx1c2goSU9vYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp1bnVzZWQpIHsKIAotICAgICAgICBpZiAoIUlPX19vcGVuY2hlY2soc2VsZikpIHJldHVybiBOVUxMOworICAgIGlmICghSU9fX29wZW5jaGVjayhzZWxmKSkgcmV0dXJuIE5VTEw7CiAKLSAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwotICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIFB5RG9jX1NUUlZBUihJT19nZXR2YWxfX2RvY19fLApAQCAtMTE4LDM3ICsxMTgsMzcgQEAKIAogc3RhdGljIFB5T2JqZWN0ICoKIElPX2NnZXR2YWwoUHlPYmplY3QgKnNlbGYpIHsKLSAgICAgICAgaWYgKCFJT19fb3BlbmNoZWNrKElPT09CSkVDVChzZWxmKSkpIHJldHVybiBOVUxMOwotICAgICAgICBhc3NlcnQoSU9PT0JKRUNUKHNlbGYpLT5wb3MgPj0gMCk7Ci0gICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoKElPb2JqZWN0KilzZWxmKS0+YnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJT29iamVjdCopc2VsZiktPnBvcyk7CisgICAgaWYgKCFJT19fb3BlbmNoZWNrKElPT09CSkVDVChzZWxmKSkpIHJldHVybiBOVUxMOworICAgIGFzc2VydChJT09PQkpFQ1Qoc2VsZiktPnBvcyA+PSAwKTsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKChJT29iamVjdCopc2VsZiktPmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJT29iamVjdCopc2VsZiktPnBvcyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBJT19nZXR2YWwoSU9vYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKSB7Ci0gICAgICAgIFB5T2JqZWN0ICp1c2VfcG9zPVB5X05vbmU7Ci0gICAgICAgIFB5X3NzaXplX3QgczsKKyAgICBQeU9iamVjdCAqdXNlX3Bvcz1QeV9Ob25lOworICAgIFB5X3NzaXplX3QgczsKIAotICAgICAgICBpZiAoIUlPX19vcGVuY2hlY2soc2VsZikpIHJldHVybiBOVUxMOwotICAgICAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsImdldHZhbCIsIDAsIDEsJnVzZV9wb3MpKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoIUlPX19vcGVuY2hlY2soc2VsZikpIHJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywiZ2V0dmFsIiwgMCwgMSwmdXNlX3BvcykpIHJldHVybiBOVUxMOwogCi0gICAgICAgIGlmIChQeU9iamVjdF9Jc1RydWUodXNlX3BvcykpIHsKLSAgICAgICAgICAgICAgICAgIHM9c2VsZi0+cG9zOwotICAgICAgICAgICAgICAgICAgaWYgKHMgPiBzZWxmLT5zdHJpbmdfc2l6ZSkgcz1zZWxmLT5zdHJpbmdfc2l6ZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICBzPXNlbGYtPnN0cmluZ19zaXplOwotICAgICAgICBhc3NlcnQoc2VsZi0+cG9zID49IDApOwotICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoc2VsZi0+YnVmLCBzKTsKKyAgICBpZiAoUHlPYmplY3RfSXNUcnVlKHVzZV9wb3MpKSB7CisgICAgICAgICAgICAgIHM9c2VsZi0+cG9zOworICAgICAgICAgICAgICBpZiAocyA+IHNlbGYtPnN0cmluZ19zaXplKSBzPXNlbGYtPnN0cmluZ19zaXplOworICAgIH0KKyAgICBlbHNlCisgICAgICAgICAgICAgIHM9c2VsZi0+c3RyaW5nX3NpemU7CisgICAgYXNzZXJ0KHNlbGYtPnBvcyA+PSAwKTsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoc2VsZi0+YnVmLCBzKTsKIH0KIAogUHlEb2NfU1RSVkFSKElPX2lzYXR0eV9fZG9jX18sICJpc2F0dHkoKTogYWx3YXlzIHJldHVybnMgMCIpOwogCiBzdGF0aWMgUHlPYmplY3QgKgogSU9faXNhdHR5KElPb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdW51c2VkKSB7Ci0gICAgICAgIGlmICghSU9fX29wZW5jaGVjayhzZWxmKSkgcmV0dXJuIE5VTEw7Ci0gICAgICAgIFB5X0lOQ1JFRihQeV9GYWxzZSk7Ci0gICAgICAgIHJldHVybiBQeV9GYWxzZTsKKyAgICBpZiAoIUlPX19vcGVuY2hlY2soc2VsZikpIHJldHVybiBOVUxMOworICAgIFB5X0lOQ1JFRihQeV9GYWxzZSk7CisgICAgcmV0dXJuIFB5X0ZhbHNlOwogfQogCiBQeURvY19TVFJWQVIoSU9fcmVhZF9fZG9jX18sCkBAIC0xNTYsMTE0ICsxNTYsMTE0IEBACiAKIHN0YXRpYyBpbnQKIElPX2NyZWFkKFB5T2JqZWN0ICpzZWxmLCBjaGFyICoqb3V0cHV0LCBQeV9zc2l6ZV90ICBuKSB7Ci0gICAgICAgIFB5X3NzaXplX3QgbDsKKyAgICBQeV9zc2l6ZV90IGw7CiAKLSAgICAgICAgaWYgKCFJT19fb3BlbmNoZWNrKElPT09CSkVDVChzZWxmKSkpIHJldHVybiAtMTsKLSAgICAgICAgYXNzZXJ0KElPT09CSkVDVChzZWxmKS0+cG9zID49IDApOwotICAgICAgICBhc3NlcnQoSU9PT0JKRUNUKHNlbGYpLT5zdHJpbmdfc2l6ZSA+PSAwKTsKLSAgICAgICAgbCA9ICgoSU9vYmplY3QqKXNlbGYpLT5zdHJpbmdfc2l6ZSAtICgoSU9vYmplY3QqKXNlbGYpLT5wb3M7ICAKLSAgICAgICAgaWYgKG4gPCAwIHx8IG4gPiBsKSB7Ci0gICAgICAgICAgICAgICAgbiA9IGw7Ci0gICAgICAgICAgICAgICAgaWYgKG4gPCAwKSBuPTA7Ci0gICAgICAgIH0KKyAgICBpZiAoIUlPX19vcGVuY2hlY2soSU9PT0JKRUNUKHNlbGYpKSkgcmV0dXJuIC0xOworICAgIGFzc2VydChJT09PQkpFQ1Qoc2VsZiktPnBvcyA+PSAwKTsKKyAgICBhc3NlcnQoSU9PT0JKRUNUKHNlbGYpLT5zdHJpbmdfc2l6ZSA+PSAwKTsKKyAgICBsID0gKChJT29iamVjdCopc2VsZiktPnN0cmluZ19zaXplIC0gKChJT29iamVjdCopc2VsZiktPnBvczsKKyAgICBpZiAobiA8IDAgfHwgbiA+IGwpIHsKKyAgICAgICAgbiA9IGw7CisgICAgICAgIGlmIChuIDwgMCkgbj0wOworICAgIH0KIAotICAgICAgICAqb3V0cHV0PSgoSU9vYmplY3QqKXNlbGYpLT5idWYgKyAoKElPb2JqZWN0KilzZWxmKS0+cG9zOwotICAgICAgICAoKElPb2JqZWN0KilzZWxmKS0+cG9zICs9IG47Ci0gICAgICAgIHJldHVybiBuOworICAgICpvdXRwdXQ9KChJT29iamVjdCopc2VsZiktPmJ1ZiArICgoSU9vYmplY3QqKXNlbGYpLT5wb3M7CisgICAgKChJT29iamVjdCopc2VsZiktPnBvcyArPSBuOworICAgIHJldHVybiBuOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogSU9fcmVhZChJT29iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpIHsKLSAgICAgICAgUHlfc3NpemVfdCBuID0gLTE7Ci0gICAgICAgIGNoYXIgKm91dHB1dCA9IE5VTEw7CisgICAgUHlfc3NpemVfdCBuID0gLTE7CisgICAgY2hhciAqb3V0cHV0ID0gTlVMTDsKIAotICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxuOnJlYWQiLCAmbikpIHJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifG46cmVhZCIsICZuKSkgcmV0dXJuIE5VTEw7CiAKLSAgICAgICAgaWYgKCAobj1JT19jcmVhZCgoUHlPYmplY3QqKXNlbGYsJm91dHB1dCxuKSkgPCAwKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoIChuPUlPX2NyZWFkKChQeU9iamVjdCopc2VsZiwmb3V0cHV0LG4pKSA8IDApIHJldHVybiBOVUxMOwogCi0gICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShvdXRwdXQsIG4pOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShvdXRwdXQsIG4pOwogfQogCiBQeURvY19TVFJWQVIoSU9fcmVhZGxpbmVfX2RvY19fLCAicmVhZGxpbmUoKSAtLSBSZWFkIG9uZSBsaW5lIik7CiAKIHN0YXRpYyBpbnQKIElPX2NyZWFkbGluZShQeU9iamVjdCAqc2VsZiwgY2hhciAqKm91dHB1dCkgewotICAgICAgICBjaGFyICpuLCAqczsKLSAgICAgICAgUHlfc3NpemVfdCBsOworICAgIGNoYXIgKm4sICpzOworICAgIFB5X3NzaXplX3QgbDsKIAotICAgICAgICBpZiAoIUlPX19vcGVuY2hlY2soSU9PT0JKRUNUKHNlbGYpKSkgcmV0dXJuIC0xOworICAgIGlmICghSU9fX29wZW5jaGVjayhJT09PQkpFQ1Qoc2VsZikpKSByZXR1cm4gLTE7CiAKLSAgICAgICAgZm9yIChuID0gKChJT29iamVjdCopc2VsZiktPmJ1ZiArICgoSU9vYmplY3QqKXNlbGYpLT5wb3MsCi0gICAgICAgICAgICAgICBzID0gKChJT29iamVjdCopc2VsZiktPmJ1ZiArICgoSU9vYmplY3QqKXNlbGYpLT5zdHJpbmdfc2l6ZTsgCi0gICAgICAgICAgICAgbiA8IHMgJiYgKm4gIT0gJ1xuJzsgbisrKTsKKyAgICBmb3IgKG4gPSAoKElPb2JqZWN0KilzZWxmKS0+YnVmICsgKChJT29iamVjdCopc2VsZiktPnBvcywKKyAgICAgICAgICAgcyA9ICgoSU9vYmplY3QqKXNlbGYpLT5idWYgKyAoKElPb2JqZWN0KilzZWxmKS0+c3RyaW5nX3NpemU7CisgICAgICAgICBuIDwgcyAmJiAqbiAhPSAnXG4nOyBuKyspOwogCi0gICAgICAgIGlmIChuIDwgcykgbisrOworICAgIGlmIChuIDwgcykgbisrOwogCi0gICAgICAgICpvdXRwdXQ9KChJT29iamVjdCopc2VsZiktPmJ1ZiArICgoSU9vYmplY3QqKXNlbGYpLT5wb3M7Ci0gICAgICAgIGwgPSBuIC0gKChJT29iamVjdCopc2VsZiktPmJ1ZiAtICgoSU9vYmplY3QqKXNlbGYpLT5wb3M7CisgICAgKm91dHB1dD0oKElPb2JqZWN0KilzZWxmKS0+YnVmICsgKChJT29iamVjdCopc2VsZiktPnBvczsKKyAgICBsID0gbiAtICgoSU9vYmplY3QqKXNlbGYpLT5idWYgLSAoKElPb2JqZWN0KilzZWxmKS0+cG9zOwogCi0gICAgICAgIGFzc2VydChJT09PQkpFQ1Qoc2VsZiktPnBvcyA8PSBQWV9TU0laRV9UX01BWCAtIGwpOwotICAgICAgICBhc3NlcnQoSU9PT0JKRUNUKHNlbGYpLT5wb3MgPj0gMCk7Ci0gICAgICAgIGFzc2VydChJT09PQkpFQ1Qoc2VsZiktPnN0cmluZ19zaXplID49IDApOworICAgIGFzc2VydChJT09PQkpFQ1Qoc2VsZiktPnBvcyA8PSBQWV9TU0laRV9UX01BWCAtIGwpOworICAgIGFzc2VydChJT09PQkpFQ1Qoc2VsZiktPnBvcyA+PSAwKTsKKyAgICBhc3NlcnQoSU9PT0JKRUNUKHNlbGYpLT5zdHJpbmdfc2l6ZSA+PSAwKTsKIAotICAgICAgICAoKElPb2JqZWN0KilzZWxmKS0+cG9zICs9IGw7Ci0gICAgICAgIHJldHVybiAoaW50KWw7CisgICAgKChJT29iamVjdCopc2VsZiktPnBvcyArPSBsOworICAgIHJldHVybiAoaW50KWw7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBJT19yZWFkbGluZShJT29iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpIHsKLSAgICAgICAgaW50IG4sIG09LTE7Ci0gICAgICAgIGNoYXIgKm91dHB1dDsKKyAgICBpbnQgbiwgbT0tMTsKKyAgICBjaGFyICpvdXRwdXQ7CiAKLSAgICAgICAgaWYgKGFyZ3MpCi0gICAgICAgICAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8aTpyZWFkbGluZSIsICZtKSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKGFyZ3MpCisgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifGk6cmVhZGxpbmUiLCAmbSkpIHJldHVybiBOVUxMOwogCi0gICAgICAgIGlmKCAobj1JT19jcmVhZGxpbmUoKFB5T2JqZWN0KilzZWxmLCZvdXRwdXQpKSA8IDApIHJldHVybiBOVUxMOwotICAgICAgICBpZiAobSA+PSAwICYmIG0gPCBuKSB7Ci0gICAgICAgICAgICAgICAgbSA9IG4gLSBtOwotICAgICAgICAgICAgICAgIG4gLT0gbTsKLSAgICAgICAgICAgICAgICBzZWxmLT5wb3MgLT0gbTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnQoSU9PT0JKRUNUKHNlbGYpLT5wb3MgPj0gMCk7Ci0gICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShvdXRwdXQsIG4pOworICAgIGlmKCAobj1JT19jcmVhZGxpbmUoKFB5T2JqZWN0KilzZWxmLCZvdXRwdXQpKSA8IDApIHJldHVybiBOVUxMOworICAgIGlmIChtID49IDAgJiYgbSA8IG4pIHsKKyAgICAgICAgbSA9IG4gLSBtOworICAgICAgICBuIC09IG07CisgICAgICAgIHNlbGYtPnBvcyAtPSBtOworICAgIH0KKyAgICBhc3NlcnQoSU9PT0JKRUNUKHNlbGYpLT5wb3MgPj0gMCk7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKG91dHB1dCwgbik7CiB9CiAKIFB5RG9jX1NUUlZBUihJT19yZWFkbGluZXNfX2RvY19fLCAicmVhZGxpbmVzKCkgLS0gUmVhZCBhbGwgbGluZXMiKTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIElPX3JlYWRsaW5lcyhJT29iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpIHsKLQlpbnQgbjsKLQljaGFyICpvdXRwdXQ7Ci0JUHlPYmplY3QgKnJlc3VsdCwgKmxpbmU7Ci0gICAgICAgIGludCBoaW50ID0gMCwgbGVuZ3RoID0gMDsKLQkKLSAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8aTpyZWFkbGluZXMiLCAmaGludCkpIHJldHVybiBOVUxMOworICAgIGludCBuOworICAgIGNoYXIgKm91dHB1dDsKKyAgICBQeU9iamVjdCAqcmVzdWx0LCAqbGluZTsKKyAgICBpbnQgaGludCA9IDAsIGxlbmd0aCA9IDA7CiAKLQlyZXN1bHQgPSBQeUxpc3RfTmV3KDApOwotCWlmICghcmVzdWx0KQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxpOnJlYWRsaW5lcyIsICZoaW50KSkgcmV0dXJuIE5VTEw7CiAKLQl3aGlsZSAoMSl7Ci0JCWlmICggKG4gPSBJT19jcmVhZGxpbmUoKFB5T2JqZWN0KilzZWxmLCZvdXRwdXQpKSA8IDApCi0gICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVycjsKLQkJaWYgKG4gPT0gMCkKLQkJCWJyZWFrOwotCQlsaW5lID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUgKG91dHB1dCwgbik7Ci0JCWlmICghbGluZSkgCi0gICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVycjsKLQkJaWYgKFB5TGlzdF9BcHBlbmQgKHJlc3VsdCwgbGluZSkgPT0gLTEpIHsKLQkJCVB5X0RFQ1JFRiAobGluZSk7Ci0JCQlnb3RvIGVycjsKLQkJfQotCQlQeV9ERUNSRUYgKGxpbmUpOwotICAgICAgICAgICAgICAgIGxlbmd0aCArPSBuOwotICAgICAgICAgICAgICAgIGlmIChoaW50ID4gMCAmJiBsZW5ndGggPj0gaGludCkKLQkJCWJyZWFrOwotCX0KLQlyZXR1cm4gcmVzdWx0OwotIGVycjoKLSAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgcmVzdWx0ID0gUHlMaXN0X05ldygwKTsKKyAgICBpZiAoIXJlc3VsdCkKICAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICB3aGlsZSAoMSl7CisgICAgICAgIGlmICggKG4gPSBJT19jcmVhZGxpbmUoKFB5T2JqZWN0KilzZWxmLCZvdXRwdXQpKSA8IDApCisgICAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgaWYgKG4gPT0gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBsaW5lID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUgKG91dHB1dCwgbik7CisgICAgICAgIGlmICghbGluZSkKKyAgICAgICAgICAgIGdvdG8gZXJyOworICAgICAgICBpZiAoUHlMaXN0X0FwcGVuZCAocmVzdWx0LCBsaW5lKSA9PSAtMSkgeworICAgICAgICAgICAgUHlfREVDUkVGIChsaW5lKTsKKyAgICAgICAgICAgIGdvdG8gZXJyOworICAgICAgICB9CisgICAgICAgIFB5X0RFQ1JFRiAobGluZSk7CisgICAgICAgIGxlbmd0aCArPSBuOworICAgICAgICBpZiAoaGludCA+IDAgJiYgbGVuZ3RoID49IGhpbnQpCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKKyBlcnI6CisgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIFB5RG9jX1NUUlZBUihJT19yZXNldF9fZG9jX18sCkBAIC0yNzIsMTIgKzI3MiwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIElPX3Jlc2V0KElPb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdW51c2VkKSB7CiAKLSAgICAgICAgaWYgKCFJT19fb3BlbmNoZWNrKHNlbGYpKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoIUlPX19vcGVuY2hlY2soc2VsZikpIHJldHVybiBOVUxMOwogCi0gICAgICAgIHNlbGYtPnBvcyA9IDA7CisgICAgc2VsZi0+cG9zID0gMDsKIAotICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7Ci0gICAgICAgIHJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogUHlEb2NfU1RSVkFSKElPX3RlbGxfX2RvY19fLCAidGVsbCgpIC0tIGdldCB0aGUgY3VycmVudCBwb3NpdGlvbi4iKTsKQEAgLTI4NSwxMCArMjg1LDEwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogSU9fdGVsbChJT29iamVjdCAqc2VsZiwgUHlPYmplY3QgKnVudXNlZCkgewogCi0gICAgICAgIGlmICghSU9fX29wZW5jaGVjayhzZWxmKSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFJT19fb3BlbmNoZWNrKHNlbGYpKSByZXR1cm4gTlVMTDsKIAotICAgICAgICBhc3NlcnQoc2VsZi0+cG9zID49IDApOwotICAgICAgICByZXR1cm4gUHlJbnRfRnJvbVNzaXplX3Qoc2VsZi0+cG9zKTsKKyAgICBhc3NlcnQoc2VsZi0+cG9zID49IDApOworICAgIHJldHVybiBQeUludF9Gcm9tU3NpemVfdChzZWxmLT5wb3MpOwogfQogCiBQeURvY19TVFJWQVIoSU9fdHJ1bmNhdGVfX2RvY19fLApAQCAtMjk2LDQyICsyOTYsNDIgQEAKIAogc3RhdGljIFB5T2JqZWN0ICoKIElPX3RydW5jYXRlKElPb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykgewotICAgICAgICBQeV9zc2l6ZV90IHBvcyA9IC0xOwotCQotICAgICAgICBpZiAoIUlPX19vcGVuY2hlY2soc2VsZikpIHJldHVybiBOVUxMOwotICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxuOnRydW5jYXRlIiwgJnBvcykpIHJldHVybiBOVUxMOworICAgIFB5X3NzaXplX3QgcG9zID0gLTE7CiAKLQlpZiAoUHlUdXBsZV9TaXplKGFyZ3MpID09IDApIHsKLQkJLyogTm8gYXJndW1lbnQgcGFzc2VkLCB0cnVuY2F0ZSB0byBjdXJyZW50IHBvc2l0aW9uICovCi0JCXBvcyA9IHNlbGYtPnBvczsKLQl9CisgICAgaWYgKCFJT19fb3BlbmNoZWNrKHNlbGYpKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxuOnRydW5jYXRlIiwgJnBvcykpIHJldHVybiBOVUxMOwogCi0gICAgICAgIGlmIChwb3MgPCAwKSB7Ci0JCWVycm5vID0gRUlOVkFMOwotCQlQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoUHlUdXBsZV9TaXplKGFyZ3MpID09IDApIHsKKyAgICAgICAgLyogTm8gYXJndW1lbnQgcGFzc2VkLCB0cnVuY2F0ZSB0byBjdXJyZW50IHBvc2l0aW9uICovCisgICAgICAgIHBvcyA9IHNlbGYtPnBvczsKKyAgICB9CiAKLSAgICAgICAgaWYgKHNlbGYtPnN0cmluZ19zaXplID4gcG9zKSBzZWxmLT5zdHJpbmdfc2l6ZSA9IHBvczsKLSAgICAgICAgc2VsZi0+cG9zID0gc2VsZi0+c3RyaW5nX3NpemU7CisgICAgaWYgKHBvcyA8IDApIHsKKyAgICAgICAgZXJybm8gPSBFSU5WQUw7CisgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0gICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKLSAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKHNlbGYtPnN0cmluZ19zaXplID4gcG9zKSBzZWxmLT5zdHJpbmdfc2l6ZSA9IHBvczsKKyAgICBzZWxmLT5wb3MgPSBzZWxmLT5zdHJpbmdfc2l6ZTsKKworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIElPX2l0ZXJuZXh0KElvYmplY3QgKnNlbGYpCiB7Ci0JUHlPYmplY3QgKm5leHQ7Ci0JbmV4dCA9IElPX3JlYWRsaW5lKChJT29iamVjdCAqKXNlbGYsIE5VTEwpOwotCWlmICghbmV4dCkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFQeVN0cmluZ19HRVRfU0laRShuZXh0KSkgewotCQlQeV9ERUNSRUYobmV4dCk7Ci0JCVB5RXJyX1NldE5vbmUoUHlFeGNfU3RvcEl0ZXJhdGlvbik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gbmV4dDsKKyAgICBQeU9iamVjdCAqbmV4dDsKKyAgICBuZXh0ID0gSU9fcmVhZGxpbmUoKElPb2JqZWN0ICopc2VsZiwgTlVMTCk7CisgICAgaWYgKCFuZXh0KQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5U3RyaW5nX0dFVF9TSVpFKG5leHQpKSB7CisgICAgICAgIFB5X0RFQ1JFRihuZXh0KTsKKyAgICAgICAgUHlFcnJfU2V0Tm9uZShQeUV4Y19TdG9wSXRlcmF0aW9uKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBuZXh0OwogfQogCiAKQEAgLTM0NSw0MSArMzQ1LDQxIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqCiBPX3NlZWsoT29iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpIHsKLQlQeV9zc2l6ZV90IHBvc2l0aW9uOwotCWludCBtb2RlID0gMDsKKyAgICBQeV9zc2l6ZV90IHBvc2l0aW9uOworICAgIGludCBtb2RlID0gMDsKIAotICAgICAgICBpZiAoIUlPX19vcGVuY2hlY2soSU9PT0JKRUNUKHNlbGYpKSkgcmV0dXJuIE5VTEw7Ci0gICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibnxpOnNlZWsiLCAmcG9zaXRpb24sICZtb2RlKSkgCi0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFJT19fb3BlbmNoZWNrKElPT09CSkVDVChzZWxmKSkpIHJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibnxpOnNlZWsiLCAmcG9zaXRpb24sICZtb2RlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLSAgICAgICAgaWYgKG1vZGUgPT0gMikgewotICAgICAgICAgICAgICAgIHBvc2l0aW9uICs9IHNlbGYtPnN0cmluZ19zaXplOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG1vZGUgPT0gMSkgewotICAgICAgICAgICAgICAgIHBvc2l0aW9uICs9IHNlbGYtPnBvczsKLSAgICAgICAgfQorICAgIGlmIChtb2RlID09IDIpIHsKKyAgICAgICAgcG9zaXRpb24gKz0gc2VsZi0+c3RyaW5nX3NpemU7CisgICAgfQorICAgIGVsc2UgaWYgKG1vZGUgPT0gMSkgeworICAgICAgICBwb3NpdGlvbiArPSBzZWxmLT5wb3M7CisgICAgfQogCi0gICAgICAgIGlmIChwb3NpdGlvbiA+IHNlbGYtPmJ1Zl9zaXplKSB7Ci0gICAgICAgICAgICAgICAgICBjaGFyICpuZXdidWY7Ci0gICAgICAgICAgICAgICAgICBzZWxmLT5idWZfc2l6ZSo9MjsKLSAgICAgICAgICAgICAgICAgIGlmIChzZWxmLT5idWZfc2l6ZSA8PSBwb3NpdGlvbikgc2VsZi0+YnVmX3NpemU9cG9zaXRpb24rMTsKLQkJICBuZXdidWYgPSAoY2hhciopIHJlYWxsb2Moc2VsZi0+YnVmLHNlbGYtPmJ1Zl9zaXplKTsKLSAgICAgICAgICAgICAgICAgIGlmICghbmV3YnVmKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgZnJlZShzZWxmLT5idWYpOwotICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPmJ1ZiA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgc2VsZi0+YnVmX3NpemU9c2VsZi0+cG9zPTA7Ci0gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIHNlbGYtPmJ1ZiA9IG5ld2J1ZjsKLSAgICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHBvc2l0aW9uIDwgMCkgcG9zaXRpb249MDsKKyAgICBpZiAocG9zaXRpb24gPiBzZWxmLT5idWZfc2l6ZSkgeworICAgICAgICAgICAgICBjaGFyICpuZXdidWY7CisgICAgICAgICAgICAgIHNlbGYtPmJ1Zl9zaXplKj0yOworICAgICAgICAgICAgICBpZiAoc2VsZi0+YnVmX3NpemUgPD0gcG9zaXRpb24pIHNlbGYtPmJ1Zl9zaXplPXBvc2l0aW9uKzE7CisgICAgICAgICAgICAgIG5ld2J1ZiA9IChjaGFyKikgcmVhbGxvYyhzZWxmLT5idWYsc2VsZi0+YnVmX3NpemUpOworICAgICAgICAgICAgICBpZiAoIW5ld2J1ZikgeworICAgICAgICAgICAgICAgICAgZnJlZShzZWxmLT5idWYpOworICAgICAgICAgICAgICAgICAgc2VsZi0+YnVmID0gMDsKKyAgICAgICAgICAgICAgICAgIHNlbGYtPmJ1Zl9zaXplPXNlbGYtPnBvcz0wOworICAgICAgICAgICAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBzZWxmLT5idWYgPSBuZXdidWY7CisgICAgICB9CisgICAgZWxzZSBpZiAocG9zaXRpb24gPCAwKSBwb3NpdGlvbj0wOwogCi0gICAgICAgIHNlbGYtPnBvcz1wb3NpdGlvbjsKKyAgICBzZWxmLT5wb3M9cG9zaXRpb247CiAKLSAgICAgICAgd2hpbGUgKC0tcG9zaXRpb24gPj0gc2VsZi0+c3RyaW5nX3NpemUpIHNlbGYtPmJ1Zltwb3NpdGlvbl09MDsKKyAgICB3aGlsZSAoLS1wb3NpdGlvbiA+PSBzZWxmLT5zdHJpbmdfc2l6ZSkgc2VsZi0+YnVmW3Bvc2l0aW9uXT0wOwogCi0gICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKLSAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBQeURvY19TVFJWQVIoT193cml0ZV9fZG9jX18sCkBAIC0zODksNjcgKzM4OSw2NyBAQAogCiBzdGF0aWMgaW50CiBPX2N3cml0ZShQeU9iamVjdCAqc2VsZiwgY29uc3QgY2hhciAqYywgUHlfc3NpemVfdCAgbCkgewotICAgICAgICBQeV9zc2l6ZV90IG5ld2w7Ci0gICAgICAgIE9vYmplY3QgKm9zZWxmOwotICAgICAgICBjaGFyICpuZXdidWY7CisgICAgUHlfc3NpemVfdCBuZXdsOworICAgIE9vYmplY3QgKm9zZWxmOworICAgIGNoYXIgKm5ld2J1ZjsKIAotICAgICAgICBpZiAoIUlPX19vcGVuY2hlY2soSU9PT0JKRUNUKHNlbGYpKSkgcmV0dXJuIC0xOwotICAgICAgICBvc2VsZiA9IChPb2JqZWN0ICopc2VsZjsKKyAgICBpZiAoIUlPX19vcGVuY2hlY2soSU9PT0JKRUNUKHNlbGYpKSkgcmV0dXJuIC0xOworICAgIG9zZWxmID0gKE9vYmplY3QgKilzZWxmOwogCi0gICAgICAgIG5ld2wgPSBvc2VsZi0+cG9zK2w7Ci0gICAgICAgIGlmIChuZXdsID49IG9zZWxmLT5idWZfc2l6ZSkgewotICAgICAgICAgICAgb3NlbGYtPmJ1Zl9zaXplICo9IDI7Ci0gICAgICAgICAgICBpZiAob3NlbGYtPmJ1Zl9zaXplIDw9IG5ld2wpIHsKLQkJICAgIGFzc2VydChuZXdsICsgMSA8IElOVF9NQVgpOwotICAgICAgICAgICAgICAgICAgICBvc2VsZi0+YnVmX3NpemUgPSAoaW50KShuZXdsKzEpOwotCSAgICB9Ci0gICAgICAgICAgICBuZXdidWYgPSAoY2hhciopcmVhbGxvYyhvc2VsZi0+YnVmLCBvc2VsZi0+YnVmX3NpemUpOwotCSAgICBpZiAoIW5ld2J1ZikgewotICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTWVtb3J5RXJyb3IsIm91dCBvZiBtZW1vcnkiKTsKLSAgICAgICAgICAgICAgICAgICAgZnJlZShvc2VsZi0+YnVmKTsKLSAgICAgICAgICAgICAgICAgICAgb3NlbGYtPmJ1ZiA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIG9zZWxmLT5idWZfc2l6ZSA9IG9zZWxmLT5wb3MgPSAwOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG9zZWxmLT5idWYgPSBuZXdidWY7Ci0gICAgICAgICAgfQotCi0gICAgICAgIG1lbWNweShvc2VsZi0+YnVmK29zZWxmLT5wb3MsYyxsKTsKLQotCWFzc2VydChvc2VsZi0+cG9zICsgbCA8IElOVF9NQVgpOwotICAgICAgICBvc2VsZi0+cG9zICs9IChpbnQpbDsKLQotICAgICAgICBpZiAob3NlbGYtPnN0cmluZ19zaXplIDwgb3NlbGYtPnBvcykgewotICAgICAgICAgICAgb3NlbGYtPnN0cmluZ19zaXplID0gb3NlbGYtPnBvczsKKyAgICBuZXdsID0gb3NlbGYtPnBvcytsOworICAgIGlmIChuZXdsID49IG9zZWxmLT5idWZfc2l6ZSkgeworICAgICAgICBvc2VsZi0+YnVmX3NpemUgKj0gMjsKKyAgICAgICAgaWYgKG9zZWxmLT5idWZfc2l6ZSA8PSBuZXdsKSB7CisgICAgICAgICAgICBhc3NlcnQobmV3bCArIDEgPCBJTlRfTUFYKTsKKyAgICAgICAgICAgIG9zZWxmLT5idWZfc2l6ZSA9IChpbnQpKG5ld2wrMSk7CiAgICAgICAgIH0KKyAgICAgICAgbmV3YnVmID0gKGNoYXIqKXJlYWxsb2Mob3NlbGYtPmJ1Ziwgb3NlbGYtPmJ1Zl9zaXplKTsKKyAgICAgICAgaWYgKCFuZXdidWYpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19NZW1vcnlFcnJvciwib3V0IG9mIG1lbW9yeSIpOworICAgICAgICAgICAgZnJlZShvc2VsZi0+YnVmKTsKKyAgICAgICAgICAgIG9zZWxmLT5idWYgPSAwOworICAgICAgICAgICAgb3NlbGYtPmJ1Zl9zaXplID0gb3NlbGYtPnBvcyA9IDA7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgfQorICAgICAgICBvc2VsZi0+YnVmID0gbmV3YnVmOworICAgICAgfQogCi0gICAgICAgIHJldHVybiAoaW50KWw7CisgICAgbWVtY3B5KG9zZWxmLT5idWYrb3NlbGYtPnBvcyxjLGwpOworCisgICAgYXNzZXJ0KG9zZWxmLT5wb3MgKyBsIDwgSU5UX01BWCk7CisgICAgb3NlbGYtPnBvcyArPSAoaW50KWw7CisKKyAgICBpZiAob3NlbGYtPnN0cmluZ19zaXplIDwgb3NlbGYtPnBvcykgeworICAgICAgICBvc2VsZi0+c3RyaW5nX3NpemUgPSBvc2VsZi0+cG9zOworICAgIH0KKworICAgIHJldHVybiAoaW50KWw7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBPX3dyaXRlKE9vYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKSB7Ci0gICAgICAgIGNoYXIgKmM7Ci0gICAgICAgIGludCBsOworICAgIGNoYXIgKmM7CisgICAgaW50IGw7CiAKLSAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ0Izp3cml0ZSIsICZjLCAmbCkpIHJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAidCM6d3JpdGUiLCAmYywgJmwpKSByZXR1cm4gTlVMTDsKIAotICAgICAgICBpZiAoT19jd3JpdGUoKFB5T2JqZWN0KilzZWxmLGMsbCkgPCAwKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoT19jd3JpdGUoKFB5T2JqZWN0KilzZWxmLGMsbCkgPCAwKSByZXR1cm4gTlVMTDsKIAotICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7Ci0gICAgICAgIHJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogUHlEb2NfU1RSVkFSKE9fY2xvc2VfX2RvY19fLCAiY2xvc2UoKTogZXhwbGljaXRseSByZWxlYXNlIHJlc291cmNlcyBoZWxkLiIpOwogCiBzdGF0aWMgUHlPYmplY3QgKgogT19jbG9zZShPb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdW51c2VkKSB7Ci0gICAgICAgIGlmIChzZWxmLT5idWYgIT0gTlVMTCkgZnJlZShzZWxmLT5idWYpOwotICAgICAgICBzZWxmLT5idWYgPSBOVUxMOworICAgIGlmIChzZWxmLT5idWYgIT0gTlVMTCkgZnJlZShzZWxmLT5idWYpOworICAgIHNlbGYtPmJ1ZiA9IE5VTEw7CiAKLSAgICAgICAgc2VsZi0+cG9zID0gc2VsZi0+c3RyaW5nX3NpemUgPSBzZWxmLT5idWZfc2l6ZSA9IDA7CisgICAgc2VsZi0+cG9zID0gc2VsZi0+c3RyaW5nX3NpemUgPSBzZWxmLT5idWZfc2l6ZSA9IDA7CiAKLSAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwotICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIFB5RG9jX1NUUlZBUihPX3dyaXRlbGluZXNfX2RvY19fLApAQCAtNDU5LDMyICs0NTksMzIgQEAKICJwcm9kdWNpbmcgc3RyaW5ncy4gVGhpcyBpcyBlcXVpdmFsZW50IHRvIGNhbGxpbmcgd3JpdGUoKSBmb3IgZWFjaCBzdHJpbmcuIik7CiBzdGF0aWMgUHlPYmplY3QgKgogT193cml0ZWxpbmVzKE9vYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKSB7Ci0JUHlPYmplY3QgKml0LCAqczsKLQkKLQlpdCA9IFB5T2JqZWN0X0dldEl0ZXIoYXJncyk7Ci0JaWYgKGl0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXdoaWxlICgocyA9IFB5SXRlcl9OZXh0KGl0KSkgIT0gTlVMTCkgewotCQlQeV9zc2l6ZV90IG47Ci0JCWNoYXIgKmM7Ci0JCWlmIChQeVN0cmluZ19Bc1N0cmluZ0FuZFNpemUocywgJmMsICZuKSA9PSAtMSkgewotCQkJUHlfREVDUkVGKGl0KTsKLQkJCVB5X0RFQ1JFRihzKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWlmIChPX2N3cml0ZSgoUHlPYmplY3QgKilzZWxmLCBjLCBuKSA9PSAtMSkgewotCQkJUHlfREVDUkVGKGl0KTsKLQkJCVB5X0RFQ1JFRihzKTsKLQkJCXJldHVybiBOVUxMOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgUHlfREVDUkVGKHMpOworICAgIFB5T2JqZWN0ICppdCwgKnM7CisKKyAgICBpdCA9IFB5T2JqZWN0X0dldEl0ZXIoYXJncyk7CisgICAgaWYgKGl0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHdoaWxlICgocyA9IFB5SXRlcl9OZXh0KGl0KSkgIT0gTlVMTCkgeworICAgICAgICBQeV9zc2l6ZV90IG47CisgICAgICAgIGNoYXIgKmM7CisgICAgICAgIGlmIChQeVN0cmluZ19Bc1N0cmluZ0FuZFNpemUocywgJmMsICZuKSA9PSAtMSkgeworICAgICAgICAgICAgUHlfREVDUkVGKGl0KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihzKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGlmIChPX2N3cml0ZSgoUHlPYmplY3QgKilzZWxmLCBjLCBuKSA9PSAtMSkgeworICAgICAgICAgICAgUHlfREVDUkVGKGl0KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihzKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICB9CisgICAgICAgICAgIFB5X0RFQ1JFRihzKTsKICAgICAgICB9CiAKICAgICAgICBQeV9ERUNSRUYoaXQpOwogCiAgICAgICAgLyogU2VlIGlmIFB5SXRlcl9OZXh0IGZhaWxlZCAqLwogICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQotICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgICAgUHlfUkVUVVJOX05PTkU7CiB9CkBAIC00OTMsOTIgKzQ5Myw5MiBAQAogICB7ImZsdXNoIiwgICAgIChQeUNGdW5jdGlvbilJT19mbHVzaCwgICAgTUVUSF9OT0FSR1MsICBJT19mbHVzaF9fZG9jX199LAogICB7ImdldHZhbHVlIiwgIChQeUNGdW5jdGlvbilJT19nZXR2YWwsICAgTUVUSF9WQVJBUkdTLCBJT19nZXR2YWxfX2RvY19ffSwKICAgeyJpc2F0dHkiLCAgICAoUHlDRnVuY3Rpb24pSU9faXNhdHR5LCAgIE1FVEhfTk9BUkdTLCAgSU9faXNhdHR5X19kb2NfX30sCi0gIHsicmVhZCIsCShQeUNGdW5jdGlvbilJT19yZWFkLCAgICAgTUVUSF9WQVJBUkdTLCBJT19yZWFkX19kb2NfX30sCi0gIHsicmVhZGxpbmUiLAkoUHlDRnVuY3Rpb24pSU9fcmVhZGxpbmUsIE1FVEhfVkFSQVJHUywgSU9fcmVhZGxpbmVfX2RvY19ffSwKLSAgeyJyZWFkbGluZXMiLAkoUHlDRnVuY3Rpb24pSU9fcmVhZGxpbmVzLE1FVEhfVkFSQVJHUywgSU9fcmVhZGxpbmVzX19kb2NfX30sCi0gIHsicmVzZXQiLAkoUHlDRnVuY3Rpb24pSU9fcmVzZXQsCSAgTUVUSF9OT0FSR1MsICBJT19yZXNldF9fZG9jX199LAorICB7InJlYWQiLCAgICAgIChQeUNGdW5jdGlvbilJT19yZWFkLCAgICAgTUVUSF9WQVJBUkdTLCBJT19yZWFkX19kb2NfX30sCisgIHsicmVhZGxpbmUiLCAgKFB5Q0Z1bmN0aW9uKUlPX3JlYWRsaW5lLCBNRVRIX1ZBUkFSR1MsIElPX3JlYWRsaW5lX19kb2NfX30sCisgIHsicmVhZGxpbmVzIiwgKFB5Q0Z1bmN0aW9uKUlPX3JlYWRsaW5lcyxNRVRIX1ZBUkFSR1MsIElPX3JlYWRsaW5lc19fZG9jX199LAorICB7InJlc2V0IiwgICAgIChQeUNGdW5jdGlvbilJT19yZXNldCwgICAgTUVUSF9OT0FSR1MsICBJT19yZXNldF9fZG9jX199LAogICB7InRlbGwiLCAgICAgIChQeUNGdW5jdGlvbilJT190ZWxsLCAgICAgTUVUSF9OT0FSR1MsICBJT190ZWxsX19kb2NfX30sCiAgIHsidHJ1bmNhdGUiLCAgKFB5Q0Z1bmN0aW9uKUlPX3RydW5jYXRlLCBNRVRIX1ZBUkFSR1MsIElPX3RydW5jYXRlX19kb2NfX30sCiAKICAgLyogUmVhZC13cml0ZSBTdHJpbmdJTyBzcGVjaWZpYyAgbWV0aG9kczogKi8KICAgeyJjbG9zZSIsICAgICAgKFB5Q0Z1bmN0aW9uKU9fY2xvc2UsICAgICAgTUVUSF9OT0FSR1MsICBPX2Nsb3NlX19kb2NfX30sCiAgIHsic2VlayIsICAgICAgIChQeUNGdW5jdGlvbilPX3NlZWssICAgICAgIE1FVEhfVkFSQVJHUywgT19zZWVrX19kb2NfX30sCi0gIHsid3JpdGUiLAkgKFB5Q0Z1bmN0aW9uKU9fd3JpdGUsICAgICAgTUVUSF9WQVJBUkdTLCBPX3dyaXRlX19kb2NfX30sCi0gIHsid3JpdGVsaW5lcyIsIChQeUNGdW5jdGlvbilPX3dyaXRlbGluZXMsIE1FVEhfTywJICBPX3dyaXRlbGluZXNfX2RvY19ffSwKLSAge05VTEwsCSBOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgeyJ3cml0ZSIsICAgICAgKFB5Q0Z1bmN0aW9uKU9fd3JpdGUsICAgICAgTUVUSF9WQVJBUkdTLCBPX3dyaXRlX19kb2NfX30sCisgIHsid3JpdGVsaW5lcyIsIChQeUNGdW5jdGlvbilPX3dyaXRlbGluZXMsIE1FVEhfTywgICAgICAgT193cml0ZWxpbmVzX19kb2NfX30sCisgIHtOVUxMLCAgICAgICAgIE5VTEx9ICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiBzdGF0aWMgUHlNZW1iZXJEZWYgT19tZW1iZXJsaXN0W10gPSB7Ci0JeyJzb2Z0c3BhY2UiLAlUX0lOVCwJb2Zmc2V0b2YoT29iamVjdCwgc29mdHNwYWNlKSwJMCwKLQkgImZsYWcgaW5kaWNhdGluZyB0aGF0IGEgc3BhY2UgbmVlZHMgdG8gYmUgcHJpbnRlZDsgdXNlZCBieSBwcmludCJ9LAotCSAvKiBnZXRhdHRyKGYsICJjbG9zZWQiKSBpcyBpbXBsZW1lbnRlZCB3aXRob3V0IHRoaXMgdGFibGUgKi8KLQl7TlVMTH0gLyogU2VudGluZWwgKi8KKyAgICB7InNvZnRzcGFjZSIsICAgICAgIFRfSU5ULCAgb2Zmc2V0b2YoT29iamVjdCwgc29mdHNwYWNlKSwgICAwLAorICAgICAiZmxhZyBpbmRpY2F0aW5nIHRoYXQgYSBzcGFjZSBuZWVkcyB0byBiZSBwcmludGVkOyB1c2VkIGJ5IHByaW50In0sCisgICAgIC8qIGdldGF0dHIoZiwgImNsb3NlZCIpIGlzIGltcGxlbWVudGVkIHdpdGhvdXQgdGhpcyB0YWJsZSAqLworICAgIHtOVUxMfSAvKiBTZW50aW5lbCAqLwogfTsKIAogc3RhdGljIHZvaWQKIE9fZGVhbGxvYyhPb2JqZWN0ICpzZWxmKSB7Ci0gICAgICAgIGlmIChzZWxmLT5idWYgIT0gTlVMTCkKLSAgICAgICAgICAgICAgICBmcmVlKHNlbGYtPmJ1Zik7Ci0gICAgICAgIFB5T2JqZWN0X0RlbChzZWxmKTsKKyAgICBpZiAoc2VsZi0+YnVmICE9IE5VTEwpCisgICAgICAgIGZyZWUoc2VsZi0+YnVmKTsKKyAgICBQeU9iamVjdF9EZWwoc2VsZik7CiB9CiAKIFB5RG9jX1NUUlZBUihPdHlwZV9fZG9jX18sICJTaW1wbGUgdHlwZSBmb3Igb3V0cHV0IHRvIHN0cmluZ3MuIik7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgT3R5cGUgPSB7CiAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotICAiY1N0cmluZ0lPLlN0cmluZ08iLCAgIAkvKnRwX25hbWUqLwotICBzaXplb2YoT29iamVjdCksICAgICAgIAkvKnRwX2Jhc2ljc2l6ZSovCi0gIDAsCSAgICAgICAJCQkvKnRwX2l0ZW1zaXplKi8KKyAgImNTdHJpbmdJTy5TdHJpbmdPIiwgICAgICAgICAgLyp0cF9uYW1lKi8KKyAgc2l6ZW9mKE9vYmplY3QpLCAgICAgICAgICAgICAgLyp0cF9iYXNpY3NpemUqLworICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZW1zaXplKi8KICAgLyogbWV0aG9kcyAqLwotICAoZGVzdHJ1Y3RvcilPX2RlYWxsb2MsCS8qdHBfZGVhbGxvYyovCi0gIDAsCQkJCS8qdHBfcHJpbnQqLwotICAwLAkJIAkJLyp0cF9nZXRhdHRyICovCi0gIDAsCQkgCQkvKnRwX3NldGF0dHIgKi8KLSAgMCwJCQkJLyp0cF9jb21wYXJlKi8KLSAgMCwJCQkJLyp0cF9yZXByKi8KLSAgMCwJCQkJLyp0cF9hc19udW1iZXIqLwotICAwLAkJCQkvKnRwX2FzX3NlcXVlbmNlKi8KLSAgMCwJCQkJLyp0cF9hc19tYXBwaW5nKi8KLSAgMCwJCQkJLyp0cF9oYXNoKi8KLSAgMAksCQkJLyp0cF9jYWxsKi8KLSAgMCwJCQkJLyp0cF9zdHIqLwotICAwLAkJCQkvKnRwX2dldGF0dHJvICovCi0gIDAsCQkJCS8qdHBfc2V0YXR0cm8gKi8KLSAgMCwJCQkJLyp0cF9hc19idWZmZXIgKi8KLSAgUHlfVFBGTEFHU19ERUZBVUxULAkJLyp0cF9mbGFncyovCi0gIE90eXBlX19kb2NfXywgCQkvKnRwX2RvYyAqLwotICAwLAkJCQkvKnRwX3RyYXZlcnNlICovCi0gIDAsCQkJCS8qdHBfY2xlYXIgKi8KLSAgMCwJCQkJLyp0cF9yaWNoY29tcGFyZSAqLwotICAwLAkJCQkvKnRwX3dlYWtsaXN0b2Zmc2V0ICovCi0gIFB5T2JqZWN0X1NlbGZJdGVyLAkJLyp0cF9pdGVyICovCi0gIChpdGVybmV4dGZ1bmMpSU9faXRlcm5leHQsCS8qdHBfaXRlcm5leHQgKi8KLSAgT19tZXRob2RzLAkJCS8qdHBfbWV0aG9kcyAqLwotICBPX21lbWJlcmxpc3QsCQkJLyp0cF9tZW1iZXJzICovCi0gIGZpbGVfZ2V0c2V0bGlzdCwJCS8qdHBfZ2V0c2V0ICovCisgIChkZXN0cnVjdG9yKU9fZGVhbGxvYywgICAgICAgIC8qdHBfZGVhbGxvYyovCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcHJpbnQqLworICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHIgKi8KKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRyICovCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY29tcGFyZSovCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmVwciovCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbnVtYmVyKi8KKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19zZXF1ZW5jZSovCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbWFwcGluZyovCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaGFzaCovCisgIDAgICAgICwgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY2FsbCovCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc3RyKi8KKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRhdHRybyAqLworICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHJvICovCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfYnVmZmVyICovCisgIFB5X1RQRkxBR1NfREVGQVVMVCwgICAgICAgICAgIC8qdHBfZmxhZ3MqLworICBPdHlwZV9fZG9jX18sICAgICAgICAgICAgICAgICAvKnRwX2RvYyAqLworICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3RyYXZlcnNlICovCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY2xlYXIgKi8KKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9yaWNoY29tcGFyZSAqLworICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3dlYWtsaXN0b2Zmc2V0ICovCisgIFB5T2JqZWN0X1NlbGZJdGVyLCAgICAgICAgICAgIC8qdHBfaXRlciAqLworICAoaXRlcm5leHRmdW5jKUlPX2l0ZXJuZXh0LCAgICAvKnRwX2l0ZXJuZXh0ICovCisgIE9fbWV0aG9kcywgICAgICAgICAgICAgICAgICAgIC8qdHBfbWV0aG9kcyAqLworICBPX21lbWJlcmxpc3QsICAgICAgICAgICAgICAgICAvKnRwX21lbWJlcnMgKi8KKyAgZmlsZV9nZXRzZXRsaXN0LCAgICAgICAgICAgICAgLyp0cF9nZXRzZXQgKi8KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBuZXdPb2JqZWN0KGludCAgc2l6ZSkgewotICAgICAgICBPb2JqZWN0ICpzZWxmOworICAgIE9vYmplY3QgKnNlbGY7CiAKLSAgICAgICAgc2VsZiA9IFB5T2JqZWN0X05ldyhPb2JqZWN0LCAmT3R5cGUpOwotICAgICAgICBpZiAoc2VsZiA9PSBOVUxMKQotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICBzZWxmLT5wb3M9MDsKLSAgICAgICAgc2VsZi0+c3RyaW5nX3NpemUgPSAwOwotICAgICAgICBzZWxmLT5zb2Z0c3BhY2UgPSAwOworICAgIHNlbGYgPSBQeU9iamVjdF9OZXcoT29iamVjdCwgJk90eXBlKTsKKyAgICBpZiAoc2VsZiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBzZWxmLT5wb3M9MDsKKyAgICBzZWxmLT5zdHJpbmdfc2l6ZSA9IDA7CisgICAgc2VsZi0+c29mdHNwYWNlID0gMDsKIAotICAgICAgICBzZWxmLT5idWYgPSAoY2hhciAqKW1hbGxvYyhzaXplKTsKLQlpZiAoIXNlbGYtPmJ1ZikgewotICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX01lbW9yeUVycm9yLCJvdXQgb2YgbWVtb3J5Iik7Ci0gICAgICAgICAgICAgICAgICBzZWxmLT5idWZfc2l6ZSA9IDA7Ci0gICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoc2VsZik7Ci0gICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICB9CisgICAgc2VsZi0+YnVmID0gKGNoYXIgKiltYWxsb2Moc2l6ZSk7CisgICAgaWYgKCFzZWxmLT5idWYpIHsKKyAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX01lbW9yeUVycm9yLCJvdXQgb2YgbWVtb3J5Iik7CisgICAgICAgICAgICAgIHNlbGYtPmJ1Zl9zaXplID0gMDsKKyAgICAgICAgICAgICAgUHlfREVDUkVGKHNlbGYpOworICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgIH0KIAotICAgICAgICBzZWxmLT5idWZfc2l6ZT1zaXplOwotICAgICAgICByZXR1cm4gKFB5T2JqZWN0KilzZWxmOworICAgIHNlbGYtPmJ1Zl9zaXplPXNpemU7CisgICAgcmV0dXJuIChQeU9iamVjdCopc2VsZjsKIH0KIAogLyogRW5kIG9mIGNvZGUgZm9yIFN0cmluZ08gb2JqZWN0cyAqLwpAQCAtNTg2LDMzICs1ODYsMzMgQEAKIAogc3RhdGljIFB5T2JqZWN0ICoKIElfY2xvc2UoSW9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnVudXNlZCkgewotICAgICAgICBQeV9DTEVBUihzZWxmLT5wYnVmKTsKLSAgICAgICAgc2VsZi0+YnVmID0gTlVMTDsKKyAgICBQeV9DTEVBUihzZWxmLT5wYnVmKTsKKyAgICBzZWxmLT5idWYgPSBOVUxMOwogCi0gICAgICAgIHNlbGYtPnBvcyA9IHNlbGYtPnN0cmluZ19zaXplID0gMDsKKyAgICBzZWxmLT5wb3MgPSBzZWxmLT5zdHJpbmdfc2l6ZSA9IDA7CiAKLSAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwotICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBJX3NlZWsoSW9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpIHsKLSAgICAgICAgUHlfc3NpemVfdCBwb3NpdGlvbjsKLQlpbnQgbW9kZSA9IDA7CisgICAgUHlfc3NpemVfdCBwb3NpdGlvbjsKKyAgICBpbnQgbW9kZSA9IDA7CiAKLSAgICAgICAgaWYgKCFJT19fb3BlbmNoZWNrKElPT09CSkVDVChzZWxmKSkpIHJldHVybiBOVUxMOwotICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIm58aTpzZWVrIiwgJnBvc2l0aW9uLCAmbW9kZSkpIAotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghSU9fX29wZW5jaGVjayhJT09PQkpFQ1Qoc2VsZikpKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIm58aTpzZWVrIiwgJnBvc2l0aW9uLCAmbW9kZSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0gICAgICAgIGlmIChtb2RlID09IDIpIHBvc2l0aW9uICs9IHNlbGYtPnN0cmluZ19zaXplOwotICAgICAgICBlbHNlIGlmIChtb2RlID09IDEpIHBvc2l0aW9uICs9IHNlbGYtPnBvczsKKyAgICBpZiAobW9kZSA9PSAyKSBwb3NpdGlvbiArPSBzZWxmLT5zdHJpbmdfc2l6ZTsKKyAgICBlbHNlIGlmIChtb2RlID09IDEpIHBvc2l0aW9uICs9IHNlbGYtPnBvczsKIAotICAgICAgICBpZiAocG9zaXRpb24gPCAwKSBwb3NpdGlvbj0wOworICAgIGlmIChwb3NpdGlvbiA8IDApIHBvc2l0aW9uPTA7CiAKLSAgICAgICAgc2VsZi0+cG9zPXBvc2l0aW9uOworICAgIHNlbGYtPnBvcz1wb3NpdGlvbjsKIAotICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7Ci0gICAgICAgIHJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIHN0cnVjdCBQeU1ldGhvZERlZiBJX21ldGhvZHNbXSA9IHsKQEAgLTYyMCwxNyArNjIwLDE3IEBACiAgIHsiZmx1c2giLCAgICAgKFB5Q0Z1bmN0aW9uKUlPX2ZsdXNoLCAgICBNRVRIX05PQVJHUywgIElPX2ZsdXNoX19kb2NfX30sCiAgIHsiZ2V0dmFsdWUiLCAgKFB5Q0Z1bmN0aW9uKUlPX2dldHZhbCwgICBNRVRIX1ZBUkFSR1MsIElPX2dldHZhbF9fZG9jX199LAogICB7ImlzYXR0eSIsICAgIChQeUNGdW5jdGlvbilJT19pc2F0dHksICAgTUVUSF9OT0FSR1MsICBJT19pc2F0dHlfX2RvY19ffSwKLSAgeyJyZWFkIiwJKFB5Q0Z1bmN0aW9uKUlPX3JlYWQsICAgICBNRVRIX1ZBUkFSR1MsIElPX3JlYWRfX2RvY19ffSwKLSAgeyJyZWFkbGluZSIsCShQeUNGdW5jdGlvbilJT19yZWFkbGluZSwgTUVUSF9WQVJBUkdTLCBJT19yZWFkbGluZV9fZG9jX199LAotICB7InJlYWRsaW5lcyIsCShQeUNGdW5jdGlvbilJT19yZWFkbGluZXMsTUVUSF9WQVJBUkdTLCBJT19yZWFkbGluZXNfX2RvY19ffSwKLSAgeyJyZXNldCIsCShQeUNGdW5jdGlvbilJT19yZXNldCwJICBNRVRIX05PQVJHUywgIElPX3Jlc2V0X19kb2NfX30sCisgIHsicmVhZCIsICAgICAgKFB5Q0Z1bmN0aW9uKUlPX3JlYWQsICAgICBNRVRIX1ZBUkFSR1MsIElPX3JlYWRfX2RvY19ffSwKKyAgeyJyZWFkbGluZSIsICAoUHlDRnVuY3Rpb24pSU9fcmVhZGxpbmUsIE1FVEhfVkFSQVJHUywgSU9fcmVhZGxpbmVfX2RvY19ffSwKKyAgeyJyZWFkbGluZXMiLCAoUHlDRnVuY3Rpb24pSU9fcmVhZGxpbmVzLE1FVEhfVkFSQVJHUywgSU9fcmVhZGxpbmVzX19kb2NfX30sCisgIHsicmVzZXQiLCAgICAgKFB5Q0Z1bmN0aW9uKUlPX3Jlc2V0LCAgICBNRVRIX05PQVJHUywgIElPX3Jlc2V0X19kb2NfX30sCiAgIHsidGVsbCIsICAgICAgKFB5Q0Z1bmN0aW9uKUlPX3RlbGwsICAgICBNRVRIX05PQVJHUywgIElPX3RlbGxfX2RvY19ffSwKICAgeyJ0cnVuY2F0ZSIsICAoUHlDRnVuY3Rpb24pSU9fdHJ1bmNhdGUsIE1FVEhfVkFSQVJHUywgSU9fdHJ1bmNhdGVfX2RvY19ffSwKIAogICAvKiBSZWFkLW9ubHkgU3RyaW5nSU8gc3BlY2lmaWMgIG1ldGhvZHM6ICovCiAgIHsiY2xvc2UiLCAgICAgKFB5Q0Z1bmN0aW9uKUlfY2xvc2UsICAgIE1FVEhfTk9BUkdTLCAgT19jbG9zZV9fZG9jX199LAotICB7InNlZWsiLCAgICAgIChQeUNGdW5jdGlvbilJX3NlZWssICAgICBNRVRIX1ZBUkFSR1MsIE9fc2Vla19fZG9jX199LCAgCi0gIHtOVUxMLAlOVUxMfQorICB7InNlZWsiLCAgICAgIChQeUNGdW5jdGlvbilJX3NlZWssICAgICBNRVRIX1ZBUkFSR1MsIE9fc2Vla19fZG9jX199LAorICB7TlVMTCwgICAgICAgIE5VTEx9CiB9OwogCiBzdGF0aWMgdm9pZApAQCAtNjQ1LDM2ICs2NDUsMzYgQEAKIAogc3RhdGljIFB5VHlwZU9iamVjdCBJdHlwZSA9IHsKICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0gICJjU3RyaW5nSU8uU3RyaW5nSSIsCQkJLyp0cF9uYW1lKi8KLSAgc2l6ZW9mKElvYmplY3QpLAkJCS8qdHBfYmFzaWNzaXplKi8KLSAgMCwJCQkJCS8qdHBfaXRlbXNpemUqLworICAiY1N0cmluZ0lPLlN0cmluZ0kiLCAgICAgICAgICAgICAgICAgIC8qdHBfbmFtZSovCisgIHNpemVvZihJb2JqZWN0KSwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9iYXNpY3NpemUqLworICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlbXNpemUqLwogICAvKiBtZXRob2RzICovCi0gIChkZXN0cnVjdG9yKUlfZGVhbGxvYywJCS8qdHBfZGVhbGxvYyovCi0gIDAsCQkJCQkvKnRwX3ByaW50Ki8KLSAgMCwJCSAJCQkvKiB0cF9nZXRhdHRyICovCi0gIDAsCQkJCQkvKnRwX3NldGF0dHIqLwotICAwLAkJCQkJLyp0cF9jb21wYXJlKi8KLSAgMCwJCQkJCS8qdHBfcmVwciovCi0gIDAsCQkJCQkvKnRwX2FzX251bWJlciovCi0gIDAsCQkJCQkvKnRwX2FzX3NlcXVlbmNlKi8KLSAgMCwJCQkJCS8qdHBfYXNfbWFwcGluZyovCi0gIDAsCQkJCQkvKnRwX2hhc2gqLwotICAwLAkJCQkJLyp0cF9jYWxsKi8KLSAgMCwJCQkJCS8qdHBfc3RyKi8KLSAgMCwJCQkJCS8qIHRwX2dldGF0dHJvICovCi0gIDAsCQkJCQkvKiB0cF9zZXRhdHRybyAqLwotICAwLAkJCQkJLyogdHBfYXNfYnVmZmVyICovCi0gIFB5X1RQRkxBR1NfREVGQVVMVCwJCQkvKiB0cF9mbGFncyAqLwotICBJdHlwZV9fZG9jX18sCQkJCS8qIHRwX2RvYyAqLwotICAwLAkJCQkJLyogdHBfdHJhdmVyc2UgKi8KLSAgMCwJCQkJCS8qIHRwX2NsZWFyICovCi0gIDAsCQkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotICAwLAkJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLSAgUHlPYmplY3RfU2VsZkl0ZXIsCQkJLyogdHBfaXRlciAqLwotICAoaXRlcm5leHRmdW5jKUlPX2l0ZXJuZXh0LAkJLyogdHBfaXRlcm5leHQgKi8KLSAgSV9tZXRob2RzLAkJCQkvKiB0cF9tZXRob2RzICovCi0gIDAsCQkJCQkvKiB0cF9tZW1iZXJzICovCi0gIGZpbGVfZ2V0c2V0bGlzdCwJCQkvKiB0cF9nZXRzZXQgKi8KKyAgKGRlc3RydWN0b3IpSV9kZWFsbG9jLCAgICAgICAgICAgICAgICAvKnRwX2RlYWxsb2MqLworICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcHJpbnQqLworICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHIqLworICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY29tcGFyZSovCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9yZXByKi8KKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX251bWJlciovCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19zZXF1ZW5jZSovCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19tYXBwaW5nKi8KKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2hhc2gqLworICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY2FsbCovCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zdHIqLworICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgICAgICAgICAgICAgICAvKiB0cF9mbGFncyAqLworICBJdHlwZV9fZG9jX18sICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgIFB5T2JqZWN0X1NlbGZJdGVyLCAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAoaXRlcm5leHRmdW5jKUlPX2l0ZXJuZXh0LCAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgIElfbWV0aG9kcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgZmlsZV9nZXRzZXRsaXN0LCAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC02OTYsNyArNjk2LDcgQEAKICAgc2VsZi0+c3RyaW5nX3NpemU9c2l6ZTsKICAgc2VsZi0+cGJ1Zj1zOwogICBzZWxmLT5wb3M9MDsKLSAgCisKICAgcmV0dXJuIChQeU9iamVjdCopc2VsZjsKIH0KIApAQCAtNzIwLDkgKzcyMCw5IEBACiAvKiBMaXN0IG9mIG1ldGhvZHMgZGVmaW5lZCBpbiB0aGUgbW9kdWxlICovCiAKIHN0YXRpYyBzdHJ1Y3QgUHlNZXRob2REZWYgSU9fbWV0aG9kc1tdID0gewotICB7IlN0cmluZ0lPIiwJKFB5Q0Z1bmN0aW9uKUlPX1N0cmluZ0lPLAkKLSAgIE1FVEhfVkFSQVJHUywJSU9fU3RyaW5nSU9fX2RvY19ffSwKLSAge05VTEwsCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgeyJTdHJpbmdJTyIsICAoUHlDRnVuY3Rpb24pSU9fU3RyaW5nSU8sCisgICBNRVRIX1ZBUkFSR1MsICAgICAgICBJT19TdHJpbmdJT19fZG9jX199LAorICB7TlVMTCwgICAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiAKQEAgLTczOSw3ICs3MzksNyBAQAogICAmT3R5cGUsCiB9OwogCi0jaWZuZGVmIFB5TU9ESU5JVF9GVU5DCS8qIGRlY2xhcmF0aW9ucyBmb3IgRExMIGltcG9ydC9leHBvcnQgKi8KKyNpZm5kZWYgUHlNT0RJTklUX0ZVTkMgIC8qIGRlY2xhcmF0aW9ucyBmb3IgRExMIGltcG9ydC9leHBvcnQgKi8KICNkZWZpbmUgUHlNT0RJTklUX0ZVTkMgdm9pZAogI2VuZGlmCiBQeU1PRElOSVRfRlVOQwpAQCAtNzQ5LDIwICs3NDksMjAgQEAKIAogICAvKiBDcmVhdGUgdGhlIG1vZHVsZSBhbmQgYWRkIHRoZSBmdW5jdGlvbnMgKi8KICAgbSA9IFB5X0luaXRNb2R1bGU0KCJjU3RyaW5nSU8iLCBJT19tZXRob2RzLAotCQkgICAgIGNTdHJpbmdJT19tb2R1bGVfZG9jdW1lbnRhdGlvbiwKLQkJICAgICAoUHlPYmplY3QqKU5VTEwsUFlUSE9OX0FQSV9WRVJTSU9OKTsKKyAgICAgICAgICAgICAgICAgICAgIGNTdHJpbmdJT19tb2R1bGVfZG9jdW1lbnRhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgIChQeU9iamVjdCopTlVMTCxQWVRIT05fQVBJX1ZFUlNJT04pOwogICBpZiAobSA9PSBOVUxMKSByZXR1cm47CiAKICAgLyogQWRkIHNvbWUgc3ltYm9saWMgY29uc3RhbnRzIHRvIHRoZSBtb2R1bGUgKi8KICAgZCA9IFB5TW9kdWxlX0dldERpY3QobSk7Ci0gIAorCiAgIC8qIEV4cG9ydCBDIEFQSSAqLwogICBQeV9UWVBFKCZJdHlwZSk9JlB5VHlwZV9UeXBlOwogICBQeV9UWVBFKCZPdHlwZSk9JlB5VHlwZV9UeXBlOwogICBpZiAoUHlUeXBlX1JlYWR5KCZPdHlwZSkgPCAwKSByZXR1cm47CiAgIGlmIChQeVR5cGVfUmVhZHkoJkl0eXBlKSA8IDApIHJldHVybjsKICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwiY1N0cmluZ0lPX0NBUEkiLAotCQkgICAgICAgdiA9IFB5Q09iamVjdF9Gcm9tVm9pZFB0cigmQ0FQSSxOVUxMKSk7CisgICAgICAgICAgICAgICAgICAgICAgIHYgPSBQeUNPYmplY3RfRnJvbVZvaWRQdHIoJkNBUEksTlVMTCkpOwogICBQeV9YREVDUkVGKHYpOwogCiAgIC8qIEV4cG9ydCBUeXBlcyAqLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jZG1vZHVsZS5jIGIvTW9kdWxlcy9jZG1vZHVsZS5jCmluZGV4IGYwOWIwYTQuLjhkZmI3NjkgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvY2Rtb2R1bGUuYworKysgYi9Nb2R1bGVzL2NkbW9kdWxlLmMKQEAgLTUsNzk2ICs1LDc5NiBAQAogI2luY2x1ZGUgPGNkYXVkaW8uaD4KICNpbmNsdWRlICJQeXRob24uaCIKIAotI2RlZmluZSBOQ0FMTEJBQ0tTCTgKKyNkZWZpbmUgTkNBTExCQUNLUyAgICAgIDgKIAogdHlwZWRlZiBzdHJ1Y3QgewotCVB5T2JqZWN0X0hFQUQKLQlDRFBMQVlFUiAqb2JfY2RwbGF5ZXI7CisgICAgUHlPYmplY3RfSEVBRAorICAgIENEUExBWUVSICpvYl9jZHBsYXllcjsKIH0gY2RwbGF5ZXJvYmplY3Q7CiAKLXN0YXRpYyBQeU9iamVjdCAqQ2RFcnJvcjsJCS8qIGV4Y2VwdGlvbiBjZC5lcnJvciAqLworc3RhdGljIFB5T2JqZWN0ICpDZEVycm9yOyAgICAgICAgICAgICAgIC8qIGV4Y2VwdGlvbiBjZC5lcnJvciAqLwogCiBzdGF0aWMgUHlPYmplY3QgKgogQ0RfYWxsb3dyZW1vdmFsKGNkcGxheWVyb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjphbGxvd3JlbW92YWwiKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6YWxsb3dyZW1vdmFsIikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JQ0RhbGxvd3JlbW92YWwoc2VsZi0+b2JfY2RwbGF5ZXIpOworICAgIENEYWxsb3dyZW1vdmFsKHNlbGYtPm9iX2NkcGxheWVyKTsKIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBDRF9wcmV2ZW50cmVtb3ZhbChjZHBsYXllcm9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6cHJldmVudHJlbW92YWwiKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6cHJldmVudHJlbW92YWwiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlDRHByZXZlbnRyZW1vdmFsKHNlbGYtPm9iX2NkcGxheWVyKTsKKyAgICBDRHByZXZlbnRyZW1vdmFsKHNlbGYtPm9iX2NkcGxheWVyKTsKIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBDRF9iZXN0cmVhZHNpemUoY2RwbGF5ZXJvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOmJlc3RyZWFkc2l6ZSIpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpiZXN0cmVhZHNpemUiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIENEYmVzdHJlYWRzaXplKHNlbGYtPm9iX2NkcGxheWVyKSk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKSBDRGJlc3RyZWFkc2l6ZShzZWxmLT5vYl9jZHBsYXllcikpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogQ0RfY2xvc2UoY2RwbGF5ZXJvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOmNsb3NlIikpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOmNsb3NlIikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKCFDRGNsb3NlKHNlbGYtPm9iX2NkcGxheWVyKSkgewotCQlQeUVycl9TZXRGcm9tRXJybm8oQ2RFcnJvcik7IC8qIFhYWCAtID8/PyAqLwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0Jc2VsZi0+b2JfY2RwbGF5ZXIgPSBOVUxMOworICAgIGlmICghQ0RjbG9zZShzZWxmLT5vYl9jZHBsYXllcikpIHsKKyAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKENkRXJyb3IpOyAvKiBYWFggLSA/Pz8gKi8KKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHNlbGYtPm9iX2NkcGxheWVyID0gTlVMTDsKIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBDRF9lamVjdChjZHBsYXllcm9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JQ0RTVEFUVVMgc3RhdHVzOworICAgIENEU1RBVFVTIHN0YXR1czsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOmVqZWN0IikpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOmVqZWN0IikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKCFDRGVqZWN0KHNlbGYtPm9iX2NkcGxheWVyKSkgewotCQlpZiAoQ0RnZXRzdGF0dXMoc2VsZi0+b2JfY2RwbGF5ZXIsICZzdGF0dXMpICYmCi0JCSAgICBzdGF0dXMuc3RhdGUgPT0gQ0RfTk9ESVNDKQotCQkJUHlFcnJfU2V0U3RyaW5nKENkRXJyb3IsICJubyBkaXNjIGluIHBsYXllciIpOwotCQllbHNlCi0JCQlQeUVycl9TZXRTdHJpbmcoQ2RFcnJvciwgImVqZWN0IGZhaWxlZCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKCFDRGVqZWN0KHNlbGYtPm9iX2NkcGxheWVyKSkgeworICAgICAgICBpZiAoQ0RnZXRzdGF0dXMoc2VsZi0+b2JfY2RwbGF5ZXIsICZzdGF0dXMpICYmCisgICAgICAgICAgICBzdGF0dXMuc3RhdGUgPT0gQ0RfTk9ESVNDKQorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKENkRXJyb3IsICJubyBkaXNjIGluIHBsYXllciIpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQ2RFcnJvciwgImVqZWN0IGZhaWxlZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQotCQorCiBzdGF0aWMgUHlPYmplY3QgKgogQ0RfZ2V0c3RhdHVzKGNkcGxheWVyb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlDRFNUQVRVUyBzdGF0dXM7CisgICAgQ0RTVEFUVVMgc3RhdHVzOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6Z2V0c3RhdHVzIikpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOmdldHN0YXR1cyIpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmICghQ0RnZXRzdGF0dXMoc2VsZi0+b2JfY2RwbGF5ZXIsICZzdGF0dXMpKSB7Ci0JCVB5RXJyX1NldEZyb21FcnJubyhDZEVycm9yKTsgLyogWFhYIC0gPz8/ICovCi0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoIUNEZ2V0c3RhdHVzKHNlbGYtPm9iX2NkcGxheWVyLCAmc3RhdHVzKSkgeworICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oQ2RFcnJvcik7IC8qIFhYWCAtID8/PyAqLworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKGlpKGlpaSkoaWlpKShpaWkpaWlpaSkiLCBzdGF0dXMuc3RhdGUsCi0JCSAgICAgICBzdGF0dXMudHJhY2ssIHN0YXR1cy5taW4sIHN0YXR1cy5zZWMsIHN0YXR1cy5mcmFtZSwKLQkJICAgICAgIHN0YXR1cy5hYnNfbWluLCBzdGF0dXMuYWJzX3NlYywgc3RhdHVzLmFic19mcmFtZSwKLQkJICAgICAgIHN0YXR1cy50b3RhbF9taW4sIHN0YXR1cy50b3RhbF9zZWMsIHN0YXR1cy50b3RhbF9mcmFtZSwKLQkJICAgICAgIHN0YXR1cy5maXJzdCwgc3RhdHVzLmxhc3QsIHN0YXR1cy5zY3NpX2F1ZGlvLAotCQkgICAgICAgc3RhdHVzLmN1cl9ibG9jayk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihpaShpaWkpKGlpaSkoaWlpKWlpaWkpIiwgc3RhdHVzLnN0YXRlLAorICAgICAgICAgICAgICAgICAgIHN0YXR1cy50cmFjaywgc3RhdHVzLm1pbiwgc3RhdHVzLnNlYywgc3RhdHVzLmZyYW1lLAorICAgICAgICAgICAgICAgICAgIHN0YXR1cy5hYnNfbWluLCBzdGF0dXMuYWJzX3NlYywgc3RhdHVzLmFic19mcmFtZSwKKyAgICAgICAgICAgICAgICAgICBzdGF0dXMudG90YWxfbWluLCBzdGF0dXMudG90YWxfc2VjLCBzdGF0dXMudG90YWxfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgc3RhdHVzLmZpcnN0LCBzdGF0dXMubGFzdCwgc3RhdHVzLnNjc2lfYXVkaW8sCisgICAgICAgICAgICAgICAgICAgc3RhdHVzLmN1cl9ibG9jayk7CiB9Ci0JCisKIHN0YXRpYyBQeU9iamVjdCAqCiBDRF9nZXR0cmFja2luZm8oY2RwbGF5ZXJvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCB0cmFjazsKLQlDRFRSQUNLSU5GTyBpbmZvOwotCUNEU1RBVFVTIHN0YXR1czsKKyAgICBpbnQgdHJhY2s7CisgICAgQ0RUUkFDS0lORk8gaW5mbzsKKyAgICBDRFNUQVRVUyBzdGF0dXM7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6Z2V0dHJhY2tpbmZvIiwgJnRyYWNrKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOmdldHRyYWNraW5mbyIsICZ0cmFjaykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKCFDRGdldHRyYWNraW5mbyhzZWxmLT5vYl9jZHBsYXllciwgdHJhY2ssICZpbmZvKSkgewotCQlpZiAoQ0RnZXRzdGF0dXMoc2VsZi0+b2JfY2RwbGF5ZXIsICZzdGF0dXMpICYmCi0JCSAgICBzdGF0dXMuc3RhdGUgPT0gQ0RfTk9ESVNDKQotCQkJUHlFcnJfU2V0U3RyaW5nKENkRXJyb3IsICJubyBkaXNjIGluIHBsYXllciIpOwotCQllbHNlCi0JCQlQeUVycl9TZXRTdHJpbmcoQ2RFcnJvciwgImdldHRyYWNraW5mbyBmYWlsZWQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICghQ0RnZXR0cmFja2luZm8oc2VsZi0+b2JfY2RwbGF5ZXIsIHRyYWNrLCAmaW5mbykpIHsKKyAgICAgICAgaWYgKENEZ2V0c3RhdHVzKHNlbGYtPm9iX2NkcGxheWVyLCAmc3RhdHVzKSAmJgorICAgICAgICAgICAgc3RhdHVzLnN0YXRlID09IENEX05PRElTQykKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhDZEVycm9yLCAibm8gZGlzYyBpbiBwbGF5ZXIiKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKENkRXJyb3IsICJnZXR0cmFja2luZm8gZmFpbGVkIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXJldHVybiBQeV9CdWlsZFZhbHVlKCIoKGlpaSkoaWlpKSkiLAotCQkgICAgICAgaW5mby5zdGFydF9taW4sIGluZm8uc3RhcnRfc2VjLCBpbmZvLnN0YXJ0X2ZyYW1lLAotCQkgICAgICAgaW5mby50b3RhbF9taW4sIGluZm8udG90YWxfc2VjLCBpbmZvLnRvdGFsX2ZyYW1lKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKChpaWkpKGlpaSkpIiwKKyAgICAgICAgICAgICAgICAgICBpbmZvLnN0YXJ0X21pbiwgaW5mby5zdGFydF9zZWMsIGluZm8uc3RhcnRfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgaW5mby50b3RhbF9taW4sIGluZm8udG90YWxfc2VjLCBpbmZvLnRvdGFsX2ZyYW1lKTsKIH0KLQkKKwogc3RhdGljIFB5T2JqZWN0ICoKIENEX21zZnRvYmxvY2soY2RwbGF5ZXJvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBtaW4sIHNlYywgZnJhbWU7CisgICAgaW50IG1pbiwgc2VjLCBmcmFtZTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaWlpOm1zZnRvYmxvY2siLCAmbWluLCAmc2VjLCAmZnJhbWUpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpaTptc2Z0b2Jsb2NrIiwgJm1pbiwgJnNlYywgJmZyYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIENEbXNmdG9ibG9jayhzZWxmLT5vYl9jZHBsYXllciwKLQkJCQkJCW1pbiwgc2VjLCBmcmFtZSkpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZykgQ0Rtc2Z0b2Jsb2NrKHNlbGYtPm9iX2NkcGxheWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4sIHNlYywgZnJhbWUpKTsKIH0KLQkKKwogc3RhdGljIFB5T2JqZWN0ICoKIENEX3BsYXkoY2RwbGF5ZXJvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBzdGFydCwgcGxheTsKLQlDRFNUQVRVUyBzdGF0dXM7CisgICAgaW50IHN0YXJ0LCBwbGF5OworICAgIENEU1RBVFVTIHN0YXR1czsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaWk6cGxheSIsICZzdGFydCwgJnBsYXkpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpOnBsYXkiLCAmc3RhcnQsICZwbGF5KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoIUNEcGxheShzZWxmLT5vYl9jZHBsYXllciwgc3RhcnQsIHBsYXkpKSB7Ci0JCWlmIChDRGdldHN0YXR1cyhzZWxmLT5vYl9jZHBsYXllciwgJnN0YXR1cykgJiYKLQkJICAgIHN0YXR1cy5zdGF0ZSA9PSBDRF9OT0RJU0MpCi0JCQlQeUVycl9TZXRTdHJpbmcoQ2RFcnJvciwgIm5vIGRpc2MgaW4gcGxheWVyIik7Ci0JCWVsc2UKLQkJCVB5RXJyX1NldFN0cmluZyhDZEVycm9yLCAicGxheSBmYWlsZWQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICghQ0RwbGF5KHNlbGYtPm9iX2NkcGxheWVyLCBzdGFydCwgcGxheSkpIHsKKyAgICAgICAgaWYgKENEZ2V0c3RhdHVzKHNlbGYtPm9iX2NkcGxheWVyLCAmc3RhdHVzKSAmJgorICAgICAgICAgICAgc3RhdHVzLnN0YXRlID09IENEX05PRElTQykKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhDZEVycm9yLCAibm8gZGlzYyBpbiBwbGF5ZXIiKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKENkRXJyb3IsICJwbGF5IGZhaWxlZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQotCQorCiBzdGF0aWMgUHlPYmplY3QgKgogQ0RfcGxheWFicyhjZHBsYXllcm9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IG1pbiwgc2VjLCBmcmFtZSwgcGxheTsKLQlDRFNUQVRVUyBzdGF0dXM7CisgICAgaW50IG1pbiwgc2VjLCBmcmFtZSwgcGxheTsKKyAgICBDRFNUQVRVUyBzdGF0dXM7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpaWk6cGxheWFicyIsICZtaW4sICZzZWMsICZmcmFtZSwgJnBsYXkpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpaWk6cGxheWFicyIsICZtaW4sICZzZWMsICZmcmFtZSwgJnBsYXkpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmICghQ0RwbGF5YWJzKHNlbGYtPm9iX2NkcGxheWVyLCBtaW4sIHNlYywgZnJhbWUsIHBsYXkpKSB7Ci0JCWlmIChDRGdldHN0YXR1cyhzZWxmLT5vYl9jZHBsYXllciwgJnN0YXR1cykgJiYKLQkJICAgIHN0YXR1cy5zdGF0ZSA9PSBDRF9OT0RJU0MpCi0JCQlQeUVycl9TZXRTdHJpbmcoQ2RFcnJvciwgIm5vIGRpc2MgaW4gcGxheWVyIik7Ci0JCWVsc2UKLQkJCVB5RXJyX1NldFN0cmluZyhDZEVycm9yLCAicGxheWFicyBmYWlsZWQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICghQ0RwbGF5YWJzKHNlbGYtPm9iX2NkcGxheWVyLCBtaW4sIHNlYywgZnJhbWUsIHBsYXkpKSB7CisgICAgICAgIGlmIChDRGdldHN0YXR1cyhzZWxmLT5vYl9jZHBsYXllciwgJnN0YXR1cykgJiYKKyAgICAgICAgICAgIHN0YXR1cy5zdGF0ZSA9PSBDRF9OT0RJU0MpCisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQ2RFcnJvciwgIm5vIGRpc2MgaW4gcGxheWVyIik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhDZEVycm9yLCAicGxheWFicyBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KLQkKKwogc3RhdGljIFB5T2JqZWN0ICoKIENEX3BsYXl0cmFjayhjZHBsYXllcm9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IHN0YXJ0LCBwbGF5OwotCUNEU1RBVFVTIHN0YXR1czsKKyAgICBpbnQgc3RhcnQsIHBsYXk7CisgICAgQ0RTVEFUVVMgc3RhdHVzOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpaTpwbGF5dHJhY2siLCAmc3RhcnQsICZwbGF5KSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpaTpwbGF5dHJhY2siLCAmc3RhcnQsICZwbGF5KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoIUNEcGxheXRyYWNrKHNlbGYtPm9iX2NkcGxheWVyLCBzdGFydCwgcGxheSkpIHsKLQkJaWYgKENEZ2V0c3RhdHVzKHNlbGYtPm9iX2NkcGxheWVyLCAmc3RhdHVzKSAmJgotCQkgICAgc3RhdHVzLnN0YXRlID09IENEX05PRElTQykKLQkJCVB5RXJyX1NldFN0cmluZyhDZEVycm9yLCAibm8gZGlzYyBpbiBwbGF5ZXIiKTsKLQkJZWxzZQotCQkJUHlFcnJfU2V0U3RyaW5nKENkRXJyb3IsICJwbGF5dHJhY2sgZmFpbGVkIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoIUNEcGxheXRyYWNrKHNlbGYtPm9iX2NkcGxheWVyLCBzdGFydCwgcGxheSkpIHsKKyAgICAgICAgaWYgKENEZ2V0c3RhdHVzKHNlbGYtPm9iX2NkcGxheWVyLCAmc3RhdHVzKSAmJgorICAgICAgICAgICAgc3RhdHVzLnN0YXRlID09IENEX05PRElTQykKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhDZEVycm9yLCAibm8gZGlzYyBpbiBwbGF5ZXIiKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKENkRXJyb3IsICJwbGF5dHJhY2sgZmFpbGVkIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9Ci0JCisKIHN0YXRpYyBQeU9iamVjdCAqCiBDRF9wbGF5dHJhY2thYnMoY2RwbGF5ZXJvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCB0cmFjaywgbWluLCBzZWMsIGZyYW1lLCBwbGF5OwotCUNEU1RBVFVTIHN0YXR1czsKKyAgICBpbnQgdHJhY2ssIG1pbiwgc2VjLCBmcmFtZSwgcGxheTsKKyAgICBDRFNUQVRVUyBzdGF0dXM7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpaWlpOnBsYXl0cmFja2FicyIsICZ0cmFjaywgJm1pbiwgJnNlYywKLQkJCSAgICAgICZmcmFtZSwgJnBsYXkpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpaWlpOnBsYXl0cmFja2FicyIsICZ0cmFjaywgJm1pbiwgJnNlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZyYW1lLCAmcGxheSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKCFDRHBsYXl0cmFja2FicyhzZWxmLT5vYl9jZHBsYXllciwgdHJhY2ssIG1pbiwgc2VjLCBmcmFtZSwgcGxheSkpIHsKLQkJaWYgKENEZ2V0c3RhdHVzKHNlbGYtPm9iX2NkcGxheWVyLCAmc3RhdHVzKSAmJgotCQkgICAgc3RhdHVzLnN0YXRlID09IENEX05PRElTQykKLQkJCVB5RXJyX1NldFN0cmluZyhDZEVycm9yLCAibm8gZGlzYyBpbiBwbGF5ZXIiKTsKLQkJZWxzZQotCQkJUHlFcnJfU2V0U3RyaW5nKENkRXJyb3IsICJwbGF5dHJhY2thYnMgZmFpbGVkIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoIUNEcGxheXRyYWNrYWJzKHNlbGYtPm9iX2NkcGxheWVyLCB0cmFjaywgbWluLCBzZWMsIGZyYW1lLCBwbGF5KSkgeworICAgICAgICBpZiAoQ0RnZXRzdGF0dXMoc2VsZi0+b2JfY2RwbGF5ZXIsICZzdGF0dXMpICYmCisgICAgICAgICAgICBzdGF0dXMuc3RhdGUgPT0gQ0RfTk9ESVNDKQorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKENkRXJyb3IsICJubyBkaXNjIGluIHBsYXllciIpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQ2RFcnJvciwgInBsYXl0cmFja2FicyBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KLQkKKwogc3RhdGljIFB5T2JqZWN0ICoKIENEX3JlYWRkYShjZHBsYXllcm9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IG51bWZyYW1lcywgbjsKLQlQeU9iamVjdCAqcmVzdWx0OworICAgIGludCBudW1mcmFtZXMsIG47CisgICAgUHlPYmplY3QgKnJlc3VsdDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpyZWFkZGEiLCAmbnVtZnJhbWVzKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOnJlYWRkYSIsICZudW1mcmFtZXMpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXJlc3VsdCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIG51bWZyYW1lcyAqIHNpemVvZihDREZSQU1FKSk7Ci0JaWYgKHJlc3VsdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICByZXN1bHQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBudW1mcmFtZXMgKiBzaXplb2YoQ0RGUkFNRSkpOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQluID0gQ0RyZWFkZGEoc2VsZi0+b2JfY2RwbGF5ZXIsCi0JCSAgICAgICAoQ0RGUkFNRSAqKSBQeVN0cmluZ19Bc1N0cmluZyhyZXN1bHQpLCBudW1mcmFtZXMpOwotCWlmIChuID09IC0xKSB7Ci0JCVB5X0RFQ1JFRihyZXN1bHQpOwotCQlQeUVycl9TZXRGcm9tRXJybm8oQ2RFcnJvcik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAobiA8IG51bWZyYW1lcykKLQkJX1B5U3RyaW5nX1Jlc2l6ZSgmcmVzdWx0LCBuICogc2l6ZW9mKENERlJBTUUpKTsKKyAgICBuID0gQ0RyZWFkZGEoc2VsZi0+b2JfY2RwbGF5ZXIsCisgICAgICAgICAgICAgICAgICAgKENERlJBTUUgKikgUHlTdHJpbmdfQXNTdHJpbmcocmVzdWx0KSwgbnVtZnJhbWVzKTsKKyAgICBpZiAobiA9PSAtMSkgeworICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKENkRXJyb3IpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKG4gPCBudW1mcmFtZXMpCisgICAgICAgIF9QeVN0cmluZ19SZXNpemUoJnJlc3VsdCwgbiAqIHNpemVvZihDREZSQU1FKSk7CiAKLQlyZXR1cm4gcmVzdWx0OworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBDRF9zZWVrKGNkcGxheWVyb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgbWluLCBzZWMsIGZyYW1lOwotCWxvbmcgUHlUcnlCbG9jazsKKyAgICBpbnQgbWluLCBzZWMsIGZyYW1lOworICAgIGxvbmcgUHlUcnlCbG9jazsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaWlpOnNlZWsiLCAmbWluLCAmc2VjLCAmZnJhbWUpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpaTpzZWVrIiwgJm1pbiwgJnNlYywgJmZyYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlQeVRyeUJsb2NrID0gQ0RzZWVrKHNlbGYtPm9iX2NkcGxheWVyLCBtaW4sIHNlYywgZnJhbWUpOwotCWlmIChQeVRyeUJsb2NrID09IC0xKSB7Ci0JCVB5RXJyX1NldEZyb21FcnJubyhDZEVycm9yKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIFB5VHJ5QmxvY2sgPSBDRHNlZWsoc2VsZi0+b2JfY2RwbGF5ZXIsIG1pbiwgc2VjLCBmcmFtZSk7CisgICAgaWYgKFB5VHJ5QmxvY2sgPT0gLTEpIHsKKyAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKENkRXJyb3IpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoUHlUcnlCbG9jayk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKFB5VHJ5QmxvY2spOwogfQotCQorCiBzdGF0aWMgUHlPYmplY3QgKgogQ0Rfc2Vla3RyYWNrKGNkcGxheWVyb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgdHJhY2s7Ci0JbG9uZyBQeVRyeUJsb2NrOworICAgIGludCB0cmFjazsKKyAgICBsb25nIFB5VHJ5QmxvY2s7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6c2Vla3RyYWNrIiwgJnRyYWNrKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOnNlZWt0cmFjayIsICZ0cmFjaykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JUHlUcnlCbG9jayA9IENEc2Vla3RyYWNrKHNlbGYtPm9iX2NkcGxheWVyLCB0cmFjayk7Ci0JaWYgKFB5VHJ5QmxvY2sgPT0gLTEpIHsKLQkJUHlFcnJfU2V0RnJvbUVycm5vKENkRXJyb3IpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgUHlUcnlCbG9jayA9IENEc2Vla3RyYWNrKHNlbGYtPm9iX2NkcGxheWVyLCB0cmFjayk7CisgICAgaWYgKFB5VHJ5QmxvY2sgPT0gLTEpIHsKKyAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKENkRXJyb3IpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoUHlUcnlCbG9jayk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKFB5VHJ5QmxvY2spOwogfQotCQorCiBzdGF0aWMgUHlPYmplY3QgKgogQ0Rfc2Vla2Jsb2NrKGNkcGxheWVyb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQl1bnNpZ25lZCBsb25nIFB5VHJ5QmxvY2s7CisgICAgdW5zaWduZWQgbG9uZyBQeVRyeUJsb2NrOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsOnNlZWtibG9jayIsICZQeVRyeUJsb2NrKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsOnNlZWtibG9jayIsICZQeVRyeUJsb2NrKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlQeVRyeUJsb2NrID0gQ0RzZWVrYmxvY2soc2VsZi0+b2JfY2RwbGF5ZXIsIFB5VHJ5QmxvY2spOwotCWlmIChQeVRyeUJsb2NrID09ICh1bnNpZ25lZCBsb25nKSAtMSkgewotCQlQeUVycl9TZXRGcm9tRXJybm8oQ2RFcnJvcik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBQeVRyeUJsb2NrID0gQ0RzZWVrYmxvY2soc2VsZi0+b2JfY2RwbGF5ZXIsIFB5VHJ5QmxvY2spOworICAgIGlmIChQeVRyeUJsb2NrID09ICh1bnNpZ25lZCBsb25nKSAtMSkgeworICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oQ2RFcnJvcik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXJldHVybiBQeUludF9Gcm9tTG9uZyhQeVRyeUJsb2NrKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoUHlUcnlCbG9jayk7CiB9Ci0JCisKIHN0YXRpYyBQeU9iamVjdCAqCiBDRF9zdG9wKGNkcGxheWVyb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlDRFNUQVRVUyBzdGF0dXM7CisgICAgQ0RTVEFUVVMgc3RhdHVzOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6c3RvcCIpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpzdG9wIikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKCFDRHN0b3Aoc2VsZi0+b2JfY2RwbGF5ZXIpKSB7Ci0JCWlmIChDRGdldHN0YXR1cyhzZWxmLT5vYl9jZHBsYXllciwgJnN0YXR1cykgJiYKLQkJICAgIHN0YXR1cy5zdGF0ZSA9PSBDRF9OT0RJU0MpCi0JCQlQeUVycl9TZXRTdHJpbmcoQ2RFcnJvciwgIm5vIGRpc2MgaW4gcGxheWVyIik7Ci0JCWVsc2UKLQkJCVB5RXJyX1NldFN0cmluZyhDZEVycm9yLCAic3RvcCBmYWlsZWQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICghQ0RzdG9wKHNlbGYtPm9iX2NkcGxheWVyKSkgeworICAgICAgICBpZiAoQ0RnZXRzdGF0dXMoc2VsZi0+b2JfY2RwbGF5ZXIsICZzdGF0dXMpICYmCisgICAgICAgICAgICBzdGF0dXMuc3RhdGUgPT0gQ0RfTk9ESVNDKQorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKENkRXJyb3IsICJubyBkaXNjIGluIHBsYXllciIpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQ2RFcnJvciwgInN0b3AgZmFpbGVkIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9Ci0JCisKIHN0YXRpYyBQeU9iamVjdCAqCiBDRF90b2dnbGVwYXVzZShjZHBsYXllcm9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JQ0RTVEFUVVMgc3RhdHVzOworICAgIENEU1RBVFVTIHN0YXR1czsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOnRvZ2dsZXBhdXNlIikpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOnRvZ2dsZXBhdXNlIikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKCFDRHRvZ2dsZXBhdXNlKHNlbGYtPm9iX2NkcGxheWVyKSkgewotCQlpZiAoQ0RnZXRzdGF0dXMoc2VsZi0+b2JfY2RwbGF5ZXIsICZzdGF0dXMpICYmCi0JCSAgICBzdGF0dXMuc3RhdGUgPT0gQ0RfTk9ESVNDKQotCQkJUHlFcnJfU2V0U3RyaW5nKENkRXJyb3IsICJubyBkaXNjIGluIHBsYXllciIpOwotCQllbHNlCi0JCQlQeUVycl9TZXRTdHJpbmcoQ2RFcnJvciwgInRvZ2dsZXBhdXNlIGZhaWxlZCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKCFDRHRvZ2dsZXBhdXNlKHNlbGYtPm9iX2NkcGxheWVyKSkgeworICAgICAgICBpZiAoQ0RnZXRzdGF0dXMoc2VsZi0+b2JfY2RwbGF5ZXIsICZzdGF0dXMpICYmCisgICAgICAgICAgICBzdGF0dXMuc3RhdGUgPT0gQ0RfTk9ESVNDKQorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKENkRXJyb3IsICJubyBkaXNjIGluIHBsYXllciIpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQ2RFcnJvciwgInRvZ2dsZXBhdXNlIGZhaWxlZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQotCQorCiBzdGF0aWMgUHlNZXRob2REZWYgY2RwbGF5ZXJfbWV0aG9kc1tdID0gewotCXsiYWxsb3dyZW1vdmFsIiwJKFB5Q0Z1bmN0aW9uKUNEX2FsbG93cmVtb3ZhbCwJTUVUSF9WQVJBUkdTfSwKLQl7ImJlc3RyZWFkc2l6ZSIsCShQeUNGdW5jdGlvbilDRF9iZXN0cmVhZHNpemUsCU1FVEhfVkFSQVJHU30sCi0JeyJjbG9zZSIsCQkoUHlDRnVuY3Rpb24pQ0RfY2xvc2UsCQlNRVRIX1ZBUkFSR1N9LAotCXsiZWplY3QiLAkJKFB5Q0Z1bmN0aW9uKUNEX2VqZWN0LAkJTUVUSF9WQVJBUkdTfSwKLQl7ImdldHN0YXR1cyIsCQkoUHlDRnVuY3Rpb24pQ0RfZ2V0c3RhdHVzLAkJTUVUSF9WQVJBUkdTfSwKLQl7ImdldHRyYWNraW5mbyIsCShQeUNGdW5jdGlvbilDRF9nZXR0cmFja2luZm8sCU1FVEhfVkFSQVJHU30sCi0JeyJtc2Z0b2Jsb2NrIiwJCShQeUNGdW5jdGlvbilDRF9tc2Z0b2Jsb2NrLAkJTUVUSF9WQVJBUkdTfSwKLQl7InBsYXkiLAkJKFB5Q0Z1bmN0aW9uKUNEX3BsYXksCQlNRVRIX1ZBUkFSR1N9LAotCXsicGxheWFicyIsCQkoUHlDRnVuY3Rpb24pQ0RfcGxheWFicywJCU1FVEhfVkFSQVJHU30sCi0JeyJwbGF5dHJhY2siLAkJKFB5Q0Z1bmN0aW9uKUNEX3BsYXl0cmFjaywJCU1FVEhfVkFSQVJHU30sCi0JeyJwbGF5dHJhY2thYnMiLAkoUHlDRnVuY3Rpb24pQ0RfcGxheXRyYWNrYWJzLAlNRVRIX1ZBUkFSR1N9LAotCXsicHJldmVudHJlbW92YWwiLAkoUHlDRnVuY3Rpb24pQ0RfcHJldmVudHJlbW92YWwsCU1FVEhfVkFSQVJHU30sCi0JeyJyZWFkZGEiLAkJKFB5Q0Z1bmN0aW9uKUNEX3JlYWRkYSwJCU1FVEhfVkFSQVJHU30sCi0JeyJzZWVrIiwJCShQeUNGdW5jdGlvbilDRF9zZWVrLAkJTUVUSF9WQVJBUkdTfSwKLQl7InNlZWtibG9jayIsCQkoUHlDRnVuY3Rpb24pQ0Rfc2Vla2Jsb2NrLAkJTUVUSF9WQVJBUkdTfSwKLQl7InNlZWt0cmFjayIsCQkoUHlDRnVuY3Rpb24pQ0Rfc2Vla3RyYWNrLAkJTUVUSF9WQVJBUkdTfSwKLQl7InN0b3AiLAkJKFB5Q0Z1bmN0aW9uKUNEX3N0b3AsCQlNRVRIX1ZBUkFSR1N9LAotCXsidG9nZ2xlcGF1c2UiLAkJKFB5Q0Z1bmN0aW9uKUNEX3RvZ2dsZXBhdXNlLCAgIAlNRVRIX1ZBUkFSR1N9LAotCXtOVUxMLAkJCU5VTEx9IAkJLyogc2VudGluZWwgKi8KKyAgICB7ImFsbG93cmVtb3ZhbCIsICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKUNEX2FsbG93cmVtb3ZhbCwgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsiYmVzdHJlYWRzaXplIiwgICAgICAgICAgICAoUHlDRnVuY3Rpb24pQ0RfYmVzdHJlYWRzaXplLCAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJjbG9zZSIsICAgICAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilDRF9jbG9zZSwgICAgICAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImVqZWN0IiwgICAgICAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKUNEX2VqZWN0LCAgICAgICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsiZ2V0c3RhdHVzIiwgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pQ0RfZ2V0c3RhdHVzLCAgICAgICAgICAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImdldHRyYWNraW5mbyIsICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKUNEX2dldHRyYWNraW5mbywgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsibXNmdG9ibG9jayIsICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pQ0RfbXNmdG9ibG9jaywgICAgICAgICAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7InBsYXkiLCAgICAgICAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKUNEX3BsYXksICAgICAgICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsicGxheWFicyIsICAgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pQ0RfcGxheWFicywgICAgICAgICAgICAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7InBsYXl0cmFjayIsICAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKUNEX3BsYXl0cmFjaywgICAgICAgICAgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJwbGF5dHJhY2thYnMiLCAgICAgICAgICAgIChQeUNGdW5jdGlvbilDRF9wbGF5dHJhY2thYnMsICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7InByZXZlbnRyZW1vdmFsIiwgICAgICAgICAgKFB5Q0Z1bmN0aW9uKUNEX3ByZXZlbnRyZW1vdmFsLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsicmVhZGRhIiwgICAgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pQ0RfcmVhZGRhLCAgICAgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJzZWVrIiwgICAgICAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilDRF9zZWVrLCAgICAgICAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7InNlZWtibG9jayIsICAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKUNEX3NlZWtibG9jaywgICAgICAgICAgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJzZWVrdHJhY2siLCAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilDRF9zZWVrdHJhY2ssICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsic3RvcCIsICAgICAgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pQ0Rfc3RvcCwgICAgICAgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJ0b2dnbGVwYXVzZSIsICAgICAgICAgICAgIChQeUNGdW5jdGlvbilDRF90b2dnbGVwYXVzZSwgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiBzdGF0aWMgdm9pZAogY2RwbGF5ZXJfZGVhbGxvYyhjZHBsYXllcm9iamVjdCAqc2VsZikKIHsKLQlpZiAoc2VsZi0+b2JfY2RwbGF5ZXIgIT0gTlVMTCkKLQkJQ0RjbG9zZShzZWxmLT5vYl9jZHBsYXllcik7Ci0JUHlPYmplY3RfRGVsKHNlbGYpOworICAgIGlmIChzZWxmLT5vYl9jZHBsYXllciAhPSBOVUxMKQorICAgICAgICBDRGNsb3NlKHNlbGYtPm9iX2NkcGxheWVyKTsKKyAgICBQeU9iamVjdF9EZWwoc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjZHBsYXllcl9nZXRhdHRyKGNkcGxheWVyb2JqZWN0ICpzZWxmLCBjaGFyICpuYW1lKQogewotCWlmIChzZWxmLT5vYl9jZHBsYXllciA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJubyBwbGF5ZXIgYWN0aXZlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gUHlfRmluZE1ldGhvZChjZHBsYXllcl9tZXRob2RzLCAoUHlPYmplY3QgKilzZWxmLCBuYW1lKTsKKyAgICBpZiAoc2VsZi0+b2JfY2RwbGF5ZXIgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAibm8gcGxheWVyIGFjdGl2ZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIFB5X0ZpbmRNZXRob2QoY2RwbGF5ZXJfbWV0aG9kcywgKFB5T2JqZWN0ICopc2VsZiwgbmFtZSk7CiB9CiAKIFB5VHlwZU9iamVjdCBDZFBsYXllcnR5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSkKLQkwLAkJCS8qb2Jfc2l6ZSovCi0JImNkLmNkcGxheWVyIiwJLyp0cF9uYW1lKi8KLQlzaXplb2YoY2RwbGF5ZXJvYmplY3QpLAkvKnRwX3NpemUqLwotCTAsCQkJLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKWNkcGxheWVyX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCi0JMCwJCQkvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpY2RwbGF5ZXJfZ2V0YXR0ciwgLyp0cF9nZXRhdHRyKi8KLQkwLAkJCS8qdHBfc2V0YXR0ciovCi0JMCwJCQkvKnRwX2NvbXBhcmUqLwotCTAsCQkJLyp0cF9yZXByKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlKQorICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKm9iX3NpemUqLworICAgICJjZC5jZHBsYXllciIsICAgICAgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoY2RwbGF5ZXJvYmplY3QpLCAgICAgLyp0cF9zaXplKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKWNkcGxheWVyX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYyljZHBsYXllcl9nZXRhdHRyLCAvKnRwX2dldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NvbXBhcmUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3JlcHIqLwogfTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIG5ld2NkcGxheWVyb2JqZWN0KENEUExBWUVSICpjZHApCiB7Ci0JY2RwbGF5ZXJvYmplY3QgKnA7CisgICAgY2RwbGF5ZXJvYmplY3QgKnA7CiAKLQlwID0gUHlPYmplY3RfTmV3KGNkcGxheWVyb2JqZWN0LCAmQ2RQbGF5ZXJ0eXBlKTsKLQlpZiAocCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlwLT5vYl9jZHBsYXllciA9IGNkcDsKLQlyZXR1cm4gKFB5T2JqZWN0ICopIHA7CisgICAgcCA9IFB5T2JqZWN0X05ldyhjZHBsYXllcm9iamVjdCwgJkNkUGxheWVydHlwZSk7CisgICAgaWYgKHAgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcC0+b2JfY2RwbGF5ZXIgPSBjZHA7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKSBwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogQ0Rfb3BlbihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqZGV2LCAqZGlyZWN0aW9uOwotCUNEUExBWUVSICpjZHA7CisgICAgY2hhciAqZGV2LCAqZGlyZWN0aW9uOworICAgIENEUExBWUVSICpjZHA7CiAKLQkvKgotCSAqIFZhcmlhYmxlIG51bWJlciBvZiBhcmdzLgotCSAqIEZpcnN0IGRlZmF1bHRzIHRvICJOb25lIiwgc2Vjb25kIGRlZmF1bHRzIHRvICJyIi4KLQkgKi8KLQlkZXYgPSBOVUxMOwotCWRpcmVjdGlvbiA9ICJyIjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInx6czpvcGVuIiwgJmRldiwgJmRpcmVjdGlvbikpCi0JCXJldHVybiBOVUxMOworICAgIC8qCisgICAgICogVmFyaWFibGUgbnVtYmVyIG9mIGFyZ3MuCisgICAgICogRmlyc3QgZGVmYXVsdHMgdG8gIk5vbmUiLCBzZWNvbmQgZGVmYXVsdHMgdG8gInIiLgorICAgICAqLworICAgIGRldiA9IE5VTEw7CisgICAgZGlyZWN0aW9uID0gInIiOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifHpzOm9wZW4iLCAmZGV2LCAmZGlyZWN0aW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQljZHAgPSBDRG9wZW4oZGV2LCBkaXJlY3Rpb24pOwotCWlmIChjZHAgPT0gTlVMTCkgewotCQlQeUVycl9TZXRGcm9tRXJybm8oQ2RFcnJvcik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBjZHAgPSBDRG9wZW4oZGV2LCBkaXJlY3Rpb24pOworICAgIGlmIChjZHAgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oQ2RFcnJvcik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXJldHVybiBuZXdjZHBsYXllcm9iamVjdChjZHApOworICAgIHJldHVybiBuZXdjZHBsYXllcm9iamVjdChjZHApOwogfQogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCUNEUEFSU0VSICpvYl9jZHBhcnNlcjsKLQlzdHJ1Y3QgewotCQlQeU9iamVjdCAqb2JfY2RjYWxsYmFjazsKLQkJUHlPYmplY3QgKm9iX2NkY2FsbGJhY2thcmc7Ci0JfSBvYl9jZGNhbGxiYWNrc1tOQ0FMTEJBQ0tTXTsKKyAgICBQeU9iamVjdF9IRUFECisgICAgQ0RQQVJTRVIgKm9iX2NkcGFyc2VyOworICAgIHN0cnVjdCB7CisgICAgICAgIFB5T2JqZWN0ICpvYl9jZGNhbGxiYWNrOworICAgICAgICBQeU9iamVjdCAqb2JfY2RjYWxsYmFja2FyZzsKKyAgICB9IG9iX2NkY2FsbGJhY2tzW05DQUxMQkFDS1NdOwogfSBjZHBhcnNlcm9iamVjdDsKIAogc3RhdGljIHZvaWQKIENEX2NhbGxiYWNrKHZvaWQgKmFyZywgQ0REQVRBVFlQRVMgdHlwZSwgdm9pZCAqZGF0YSkKIHsKLQlQeU9iamVjdCAqcmVzdWx0LCAqYXJncywgKnYgPSBOVUxMOwotCWNoYXIgKnA7Ci0JaW50IGk7Ci0JY2RwYXJzZXJvYmplY3QgKnNlbGY7CisgICAgUHlPYmplY3QgKnJlc3VsdCwgKmFyZ3MsICp2ID0gTlVMTDsKKyAgICBjaGFyICpwOworICAgIGludCBpOworICAgIGNkcGFyc2Vyb2JqZWN0ICpzZWxmOwogCi0Jc2VsZiA9IChjZHBhcnNlcm9iamVjdCAqKSBhcmc7Ci0JYXJncyA9IFB5VHVwbGVfTmV3KDMpOwotCWlmIChhcmdzID09IE5VTEwpCi0JCXJldHVybjsKLQlQeV9JTkNSRUYoc2VsZi0+b2JfY2RjYWxsYmFja3NbdHlwZV0ub2JfY2RjYWxsYmFja2FyZyk7Ci0JUHlUdXBsZV9TZXRJdGVtKGFyZ3MsIDAsIHNlbGYtPm9iX2NkY2FsbGJhY2tzW3R5cGVdLm9iX2NkY2FsbGJhY2thcmcpOwotCVB5VHVwbGVfU2V0SXRlbShhcmdzLCAxLCBQeUludF9Gcm9tTG9uZygobG9uZykgdHlwZSkpOwotCXN3aXRjaCAodHlwZSkgewotCWNhc2UgY2RfYXVkaW86Ci0JCXYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShkYXRhLCBDRERBX0RBVEFTSVpFKTsKLQkJYnJlYWs7Ci0JY2FzZSBjZF9wbnVtOgotCWNhc2UgY2RfaW5kZXg6Ci0JCXYgPSBQeUludF9Gcm9tTG9uZygoKENEUFJPR05VTSAqKSBkYXRhKS0+dmFsdWUpOwotCQlicmVhazsKLQljYXNlIGNkX3B0aW1lOgotCWNhc2UgY2RfYXRpbWU6CisgICAgc2VsZiA9IChjZHBhcnNlcm9iamVjdCAqKSBhcmc7CisgICAgYXJncyA9IFB5VHVwbGVfTmV3KDMpOworICAgIGlmIChhcmdzID09IE5VTEwpCisgICAgICAgIHJldHVybjsKKyAgICBQeV9JTkNSRUYoc2VsZi0+b2JfY2RjYWxsYmFja3NbdHlwZV0ub2JfY2RjYWxsYmFja2FyZyk7CisgICAgUHlUdXBsZV9TZXRJdGVtKGFyZ3MsIDAsIHNlbGYtPm9iX2NkY2FsbGJhY2tzW3R5cGVdLm9iX2NkY2FsbGJhY2thcmcpOworICAgIFB5VHVwbGVfU2V0SXRlbShhcmdzLCAxLCBQeUludF9Gcm9tTG9uZygobG9uZykgdHlwZSkpOworICAgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgY2RfYXVkaW86CisgICAgICAgIHYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShkYXRhLCBDRERBX0RBVEFTSVpFKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBjZF9wbnVtOgorICAgIGNhc2UgY2RfaW5kZXg6CisgICAgICAgIHYgPSBQeUludF9Gcm9tTG9uZygoKENEUFJPR05VTSAqKSBkYXRhKS0+dmFsdWUpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIGNkX3B0aW1lOgorICAgIGNhc2UgY2RfYXRpbWU6CiAjZGVmaW5lIHB0ciAoKHN0cnVjdCBjZHRpbWVjb2RlICopIGRhdGEpCi0JCXYgPSBQeV9CdWlsZFZhbHVlKCIoaWlpKSIsCi0JCQkgICAgcHRyLT5taGkgKiAxMCArIHB0ci0+bWxvLAotCQkJICAgIHB0ci0+c2hpICogMTAgKyBwdHItPnNsbywKLQkJCSAgICBwdHItPmZoaSAqIDEwICsgcHRyLT5mbG8pOworICAgICAgICB2ID0gUHlfQnVpbGRWYWx1ZSgiKGlpaSkiLAorICAgICAgICAgICAgICAgICAgICBwdHItPm1oaSAqIDEwICsgcHRyLT5tbG8sCisgICAgICAgICAgICAgICAgICAgIHB0ci0+c2hpICogMTAgKyBwdHItPnNsbywKKyAgICAgICAgICAgICAgICAgICAgcHRyLT5maGkgKiAxMCArIHB0ci0+ZmxvKTsKICN1bmRlZiBwdHIKLQkJYnJlYWs7Ci0JY2FzZSBjZF9jYXRhbG9nOgotCQl2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgMTMpOwotCQlwID0gUHlTdHJpbmdfQXNTdHJpbmcodik7Ci0JCWZvciAoaSA9IDA7IGkgPCAxMzsgaSsrKQotCQkJKnArKyA9ICgoY2hhciAqKSBkYXRhKVtpXSArICcwJzsKLQkJYnJlYWs7Ci0JY2FzZSBjZF9pZGVudDoKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBjZF9jYXRhbG9nOgorICAgICAgICB2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgMTMpOworICAgICAgICBwID0gUHlTdHJpbmdfQXNTdHJpbmcodik7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxMzsgaSsrKQorICAgICAgICAgICAgKnArKyA9ICgoY2hhciAqKSBkYXRhKVtpXSArICcwJzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBjZF9pZGVudDoKICNkZWZpbmUgcHRyICgoc3RydWN0IGNkaWRlbnQgKikgZGF0YSkKLQkJdiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIDEyKTsKLQkJcCA9IFB5U3RyaW5nX0FzU3RyaW5nKHYpOwotCQlDRHNidG9hKHAsIHB0ci0+Y291bnRyeSwgMik7Ci0JCXAgKz0gMjsKLQkJQ0RzYnRvYShwLCBwdHItPm93bmVyLCAzKTsKLQkJcCArPSAzOwotCQkqcCsrID0gcHRyLT55ZWFyWzBdICsgJzAnOwotCQkqcCsrID0gcHRyLT55ZWFyWzFdICsgJzAnOwotCQkqcCsrID0gcHRyLT5zZXJpYWxbMF0gKyAnMCc7Ci0JCSpwKysgPSBwdHItPnNlcmlhbFsxXSArICcwJzsKLQkJKnArKyA9IHB0ci0+c2VyaWFsWzJdICsgJzAnOwotCQkqcCsrID0gcHRyLT5zZXJpYWxbM10gKyAnMCc7Ci0JCSpwKysgPSBwdHItPnNlcmlhbFs0XSArICcwJzsKKyAgICAgICAgdiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIDEyKTsKKyAgICAgICAgcCA9IFB5U3RyaW5nX0FzU3RyaW5nKHYpOworICAgICAgICBDRHNidG9hKHAsIHB0ci0+Y291bnRyeSwgMik7CisgICAgICAgIHAgKz0gMjsKKyAgICAgICAgQ0RzYnRvYShwLCBwdHItPm93bmVyLCAzKTsKKyAgICAgICAgcCArPSAzOworICAgICAgICAqcCsrID0gcHRyLT55ZWFyWzBdICsgJzAnOworICAgICAgICAqcCsrID0gcHRyLT55ZWFyWzFdICsgJzAnOworICAgICAgICAqcCsrID0gcHRyLT5zZXJpYWxbMF0gKyAnMCc7CisgICAgICAgICpwKysgPSBwdHItPnNlcmlhbFsxXSArICcwJzsKKyAgICAgICAgKnArKyA9IHB0ci0+c2VyaWFsWzJdICsgJzAnOworICAgICAgICAqcCsrID0gcHRyLT5zZXJpYWxbM10gKyAnMCc7CisgICAgICAgICpwKysgPSBwdHItPnNlcmlhbFs0XSArICcwJzsKICN1bmRlZiBwdHIKLQkJYnJlYWs7Ci0JY2FzZSBjZF9jb250cm9sOgotCQl2ID0gUHlJbnRfRnJvbUxvbmcoKGxvbmcpICooKHVuY2hhciAqKSBkYXRhKSk7Ci0JCWJyZWFrOwotCX0KLQlQeVR1cGxlX1NldEl0ZW0oYXJncywgMiwgdik7Ci0JaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKLQkJUHlfREVDUkVGKGFyZ3MpOwotCQlyZXR1cm47Ci0JfQotCQotCXJlc3VsdCA9IFB5RXZhbF9DYWxsT2JqZWN0KHNlbGYtPm9iX2NkY2FsbGJhY2tzW3R5cGVdLm9iX2NkY2FsbGJhY2ssCi0JCQkJICAgYXJncyk7Ci0JUHlfREVDUkVGKGFyZ3MpOwotCVB5X1hERUNSRUYocmVzdWx0KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBjZF9jb250cm9sOgorICAgICAgICB2ID0gUHlJbnRfRnJvbUxvbmcoKGxvbmcpICooKHVuY2hhciAqKSBkYXRhKSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBQeVR1cGxlX1NldEl0ZW0oYXJncywgMiwgdik7CisgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgUHlfREVDUkVGKGFyZ3MpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcmVzdWx0ID0gUHlFdmFsX0NhbGxPYmplY3Qoc2VsZi0+b2JfY2RjYWxsYmFja3NbdHlwZV0ub2JfY2RjYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzKTsKKyAgICBQeV9ERUNSRUYoYXJncyk7CisgICAgUHlfWERFQ1JFRihyZXN1bHQpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogQ0RfZGVsZXRlcGFyc2VyKGNkcGFyc2Vyb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgaTsKKyAgICBpbnQgaTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOmRlbGV0ZXBhcnNlciIpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpkZWxldGVwYXJzZXIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlDRGRlbGV0ZXBhcnNlcihzZWxmLT5vYl9jZHBhcnNlcik7Ci0Jc2VsZi0+b2JfY2RwYXJzZXIgPSBOVUxMOworICAgIENEZGVsZXRlcGFyc2VyKHNlbGYtPm9iX2NkcGFyc2VyKTsKKyAgICBzZWxmLT5vYl9jZHBhcnNlciA9IE5VTEw7CiAKLQkvKiBubyBzZW5zZSBpbiBrZWVwaW5nIHRoZSBjYWxsYmFja3MsIHNvIHJlbW92ZSB0aGVtICovCi0JZm9yIChpID0gMDsgaSA8IE5DQUxMQkFDS1M7IGkrKykgewotCQlQeV9YREVDUkVGKHNlbGYtPm9iX2NkY2FsbGJhY2tzW2ldLm9iX2NkY2FsbGJhY2spOwotCQlzZWxmLT5vYl9jZGNhbGxiYWNrc1tpXS5vYl9jZGNhbGxiYWNrID0gTlVMTDsKLQkJUHlfWERFQ1JFRihzZWxmLT5vYl9jZGNhbGxiYWNrc1tpXS5vYl9jZGNhbGxiYWNrYXJnKTsKLQkJc2VsZi0+b2JfY2RjYWxsYmFja3NbaV0ub2JfY2RjYWxsYmFja2FyZyA9IE5VTEw7Ci0JfQorICAgIC8qIG5vIHNlbnNlIGluIGtlZXBpbmcgdGhlIGNhbGxiYWNrcywgc28gcmVtb3ZlIHRoZW0gKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgTkNBTExCQUNLUzsgaSsrKSB7CisgICAgICAgIFB5X1hERUNSRUYoc2VsZi0+b2JfY2RjYWxsYmFja3NbaV0ub2JfY2RjYWxsYmFjayk7CisgICAgICAgIHNlbGYtPm9iX2NkY2FsbGJhY2tzW2ldLm9iX2NkY2FsbGJhY2sgPSBOVUxMOworICAgICAgICBQeV9YREVDUkVGKHNlbGYtPm9iX2NkY2FsbGJhY2tzW2ldLm9iX2NkY2FsbGJhY2thcmcpOworICAgICAgICBzZWxmLT5vYl9jZGNhbGxiYWNrc1tpXS5vYl9jZGNhbGxiYWNrYXJnID0gTlVMTDsKKyAgICB9CiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogQ0RfcGFyc2VmcmFtZShjZHBhcnNlcm9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqY2RmcDsKLQlpbnQgbGVuZ3RoOwotCUNERlJBTUUgKnA7CisgICAgY2hhciAqY2RmcDsKKyAgICBpbnQgbGVuZ3RoOworICAgIENERlJBTUUgKnA7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjOnBhcnNlZnJhbWUiLCAmY2RmcCwgJmxlbmd0aCkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyM6cGFyc2VmcmFtZSIsICZjZGZwLCAmbGVuZ3RoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAobGVuZ3RoICUgc2l6ZW9mKENERlJBTUUpICE9IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImJhZCBsZW5ndGgiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChsZW5ndGggJSBzaXplb2YoQ0RGUkFNRSkgIT0gMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYmFkIGxlbmd0aCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlwID0gKENERlJBTUUgKikgY2RmcDsKLQl3aGlsZSAobGVuZ3RoID4gMCkgewotCQlDRHBhcnNlZnJhbWUoc2VsZi0+b2JfY2RwYXJzZXIsIHApOwotCQlsZW5ndGggLT0gc2l6ZW9mKENERlJBTUUpOwotCQlwKys7Ci0JCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIHAgPSAoQ0RGUkFNRSAqKSBjZGZwOworICAgIHdoaWxlIChsZW5ndGggPiAwKSB7CisgICAgICAgIENEcGFyc2VmcmFtZShzZWxmLT5vYl9jZHBhcnNlciwgcCk7CisgICAgICAgIGxlbmd0aCAtPSBzaXplb2YoQ0RGUkFNRSk7CisgICAgICAgIHArKzsKKyAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogQ0RfcmVtb3ZlY2FsbGJhY2soY2RwYXJzZXJvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCB0eXBlOworICAgIGludCB0eXBlOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOnJlbW92ZWNhbGxiYWNrIiwgJnR5cGUpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6cmVtb3ZlY2FsbGJhY2siLCAmdHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKHR5cGUgPCAwIHx8IHR5cGUgPj0gTkNBTExCQUNLUykgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYmFkIHR5cGUiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICh0eXBlIDwgMCB8fCB0eXBlID49IE5DQUxMQkFDS1MpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImJhZCB0eXBlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCUNEcmVtb3ZlY2FsbGJhY2soc2VsZi0+b2JfY2RwYXJzZXIsIChDRERBVEFUWVBFUykgdHlwZSk7CisgICAgQ0RyZW1vdmVjYWxsYmFjayhzZWxmLT5vYl9jZHBhcnNlciwgKENEREFUQVRZUEVTKSB0eXBlKTsKIAotCVB5X1hERUNSRUYoc2VsZi0+b2JfY2RjYWxsYmFja3NbdHlwZV0ub2JfY2RjYWxsYmFjayk7Ci0Jc2VsZi0+b2JfY2RjYWxsYmFja3NbdHlwZV0ub2JfY2RjYWxsYmFjayA9IE5VTEw7CisgICAgUHlfWERFQ1JFRihzZWxmLT5vYl9jZGNhbGxiYWNrc1t0eXBlXS5vYl9jZGNhbGxiYWNrKTsKKyAgICBzZWxmLT5vYl9jZGNhbGxiYWNrc1t0eXBlXS5vYl9jZGNhbGxiYWNrID0gTlVMTDsKIAotCVB5X1hERUNSRUYoc2VsZi0+b2JfY2RjYWxsYmFja3NbdHlwZV0ub2JfY2RjYWxsYmFja2FyZyk7Ci0Jc2VsZi0+b2JfY2RjYWxsYmFja3NbdHlwZV0ub2JfY2RjYWxsYmFja2FyZyA9IE5VTEw7CisgICAgUHlfWERFQ1JFRihzZWxmLT5vYl9jZGNhbGxiYWNrc1t0eXBlXS5vYl9jZGNhbGxiYWNrYXJnKTsKKyAgICBzZWxmLT5vYl9jZGNhbGxiYWNrc1t0eXBlXS5vYl9jZGNhbGxiYWNrYXJnID0gTlVMTDsKIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBDRF9yZXNldHBhcnNlcihjZHBhcnNlcm9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6cmVzZXRwYXJzZXIiKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6cmVzZXRwYXJzZXIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlDRHJlc2V0cGFyc2VyKHNlbGYtPm9iX2NkcGFyc2VyKTsKKyAgICBDRHJlc2V0cGFyc2VyKHNlbGYtPm9iX2NkcGFyc2VyKTsKIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBDRF9hZGRjYWxsYmFjayhjZHBhcnNlcm9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IHR5cGU7Ci0JUHlPYmplY3QgKmZ1bmMsICpmdW5jYXJnOworICAgIGludCB0eXBlOworICAgIFB5T2JqZWN0ICpmdW5jLCAqZnVuY2FyZzsKIAotCS8qIFhYWCAtIG1vcmUgd29yayBoZXJlICovCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpT086YWRkY2FsbGJhY2siLCAmdHlwZSwgJmZ1bmMsICZmdW5jYXJnKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgLyogWFhYIC0gbW9yZSB3b3JrIGhlcmUgKi8KKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlPTzphZGRjYWxsYmFjayIsICZ0eXBlLCAmZnVuYywgJmZ1bmNhcmcpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmICh0eXBlIDwgMCB8fCB0eXBlID49IE5DQUxMQkFDS1MpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImFyZ3VtZW50IG91dCBvZiByYW5nZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKHR5cGUgPCAwIHx8IHR5cGUgPj0gTkNBTExCQUNLUykgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYXJndW1lbnQgb3V0IG9mIHJhbmdlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAogI2lmZGVmIENEc2V0Y2FsbGJhY2sKLQlDRGFkZGNhbGxiYWNrKHNlbGYtPm9iX2NkcGFyc2VyLCAoQ0REQVRBVFlQRVMpIHR5cGUsIENEX2NhbGxiYWNrLAotCQkgICAgICAodm9pZCAqKSBzZWxmKTsKKyAgICBDRGFkZGNhbGxiYWNrKHNlbGYtPm9iX2NkcGFyc2VyLCAoQ0REQVRBVFlQRVMpIHR5cGUsIENEX2NhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgKHZvaWQgKikgc2VsZik7CiAjZWxzZQotCUNEc2V0Y2FsbGJhY2soc2VsZi0+b2JfY2RwYXJzZXIsIChDRERBVEFUWVBFUykgdHlwZSwgQ0RfY2FsbGJhY2ssCi0JCSAgICAgICh2b2lkICopIHNlbGYpOworICAgIENEc2V0Y2FsbGJhY2soc2VsZi0+b2JfY2RwYXJzZXIsIChDRERBVEFUWVBFUykgdHlwZSwgQ0RfY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAodm9pZCAqKSBzZWxmKTsKICNlbmRpZgotCVB5X1hERUNSRUYoc2VsZi0+b2JfY2RjYWxsYmFja3NbdHlwZV0ub2JfY2RjYWxsYmFjayk7Ci0JUHlfSU5DUkVGKGZ1bmMpOwotCXNlbGYtPm9iX2NkY2FsbGJhY2tzW3R5cGVdLm9iX2NkY2FsbGJhY2sgPSBmdW5jOwotCVB5X1hERUNSRUYoc2VsZi0+b2JfY2RjYWxsYmFja3NbdHlwZV0ub2JfY2RjYWxsYmFja2FyZyk7Ci0JUHlfSU5DUkVGKGZ1bmNhcmcpOwotCXNlbGYtPm9iX2NkY2FsbGJhY2tzW3R5cGVdLm9iX2NkY2FsbGJhY2thcmcgPSBmdW5jYXJnOworICAgIFB5X1hERUNSRUYoc2VsZi0+b2JfY2RjYWxsYmFja3NbdHlwZV0ub2JfY2RjYWxsYmFjayk7CisgICAgUHlfSU5DUkVGKGZ1bmMpOworICAgIHNlbGYtPm9iX2NkY2FsbGJhY2tzW3R5cGVdLm9iX2NkY2FsbGJhY2sgPSBmdW5jOworICAgIFB5X1hERUNSRUYoc2VsZi0+b2JfY2RjYWxsYmFja3NbdHlwZV0ub2JfY2RjYWxsYmFja2FyZyk7CisgICAgUHlfSU5DUkVGKGZ1bmNhcmcpOworICAgIHNlbGYtPm9iX2NkY2FsbGJhY2tzW3R5cGVdLm9iX2NkY2FsbGJhY2thcmcgPSBmdW5jYXJnOwogCiAvKgotCWlmICh0eXBlID09IGNkX2F1ZGlvKSB7Ci0JCXNpZ2ZwZV9bX1VOREVSRkxdLnJlcGxzID0gX1pFUk87Ci0JCWhhbmRsZV9zaWdmcGVzKF9PTiwgX0VOX1VOREVSRkwsIE5VTEwsCi0JCSAgICAgICAgICAgICAgICAgICAgICAgIF9BQk9SVF9PTl9FUlJPUiwgTlVMTCk7Ci0JfQorICAgIGlmICh0eXBlID09IGNkX2F1ZGlvKSB7CisgICAgICAgIHNpZ2ZwZV9bX1VOREVSRkxdLnJlcGxzID0gX1pFUk87CisgICAgICAgIGhhbmRsZV9zaWdmcGVzKF9PTiwgX0VOX1VOREVSRkwsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9BQk9SVF9PTl9FUlJPUiwgTlVMTCk7CisgICAgfQogKi8KIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBjZHBhcnNlcl9tZXRob2RzW10gPSB7Ci0JeyJhZGRjYWxsYmFjayIsCQkoUHlDRnVuY3Rpb24pQ0RfYWRkY2FsbGJhY2ssICAgCU1FVEhfVkFSQVJHU30sCi0JeyJkZWxldGVwYXJzZXIiLAkoUHlDRnVuY3Rpb24pQ0RfZGVsZXRlcGFyc2VyLAlNRVRIX1ZBUkFSR1N9LAotCXsicGFyc2VmcmFtZSIsCQkoUHlDRnVuY3Rpb24pQ0RfcGFyc2VmcmFtZSwJTUVUSF9WQVJBUkdTfSwKLQl7InJlbW92ZWNhbGxiYWNrIiwJKFB5Q0Z1bmN0aW9uKUNEX3JlbW92ZWNhbGxiYWNrLAlNRVRIX1ZBUkFSR1N9LAotCXsicmVzZXRwYXJzZXIiLAkJKFB5Q0Z1bmN0aW9uKUNEX3Jlc2V0cGFyc2VyLAlNRVRIX1ZBUkFSR1N9LAotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgKi8KLQl7InNldGNhbGxiYWNrIiwJCShQeUNGdW5jdGlvbilDRF9hZGRjYWxsYmFjaywgICAJTUVUSF9WQVJBUkdTfSwKLQl7TlVMTCwJCQlOVUxMfSAJCS8qIHNlbnRpbmVsICovCisgICAgeyJhZGRjYWxsYmFjayIsICAgICAgICAgICAgIChQeUNGdW5jdGlvbilDRF9hZGRjYWxsYmFjaywgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImRlbGV0ZXBhcnNlciIsICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKUNEX2RlbGV0ZXBhcnNlciwgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsicGFyc2VmcmFtZSIsICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pQ0RfcGFyc2VmcmFtZSwgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJyZW1vdmVjYWxsYmFjayIsICAgICAgICAgIChQeUNGdW5jdGlvbilDRF9yZW1vdmVjYWxsYmFjaywgTUVUSF9WQVJBUkdTfSwKKyAgICB7InJlc2V0cGFyc2VyIiwgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKUNEX3Jlc2V0cGFyc2VyLCAgICBNRVRIX1ZBUkFSR1N9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBiYWNrd2FyZCBjb21wYXRpYmlsaXR5ICovCisgICAgeyJzZXRjYWxsYmFjayIsICAgICAgICAgICAgIChQeUNGdW5jdGlvbilDRF9hZGRjYWxsYmFjaywgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiBzdGF0aWMgdm9pZAogY2RwYXJzZXJfZGVhbGxvYyhjZHBhcnNlcm9iamVjdCAqc2VsZikKIHsKLQlpbnQgaTsKKyAgICBpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBOQ0FMTEJBQ0tTOyBpKyspIHsKLQkJUHlfWERFQ1JFRihzZWxmLT5vYl9jZGNhbGxiYWNrc1tpXS5vYl9jZGNhbGxiYWNrKTsKLQkJc2VsZi0+b2JfY2RjYWxsYmFja3NbaV0ub2JfY2RjYWxsYmFjayA9IE5VTEw7Ci0JCVB5X1hERUNSRUYoc2VsZi0+b2JfY2RjYWxsYmFja3NbaV0ub2JfY2RjYWxsYmFja2FyZyk7Ci0JCXNlbGYtPm9iX2NkY2FsbGJhY2tzW2ldLm9iX2NkY2FsbGJhY2thcmcgPSBOVUxMOwotCX0KLQlDRGRlbGV0ZXBhcnNlcihzZWxmLT5vYl9jZHBhcnNlcik7Ci0JUHlPYmplY3RfRGVsKHNlbGYpOworICAgIGZvciAoaSA9IDA7IGkgPCBOQ0FMTEJBQ0tTOyBpKyspIHsKKyAgICAgICAgUHlfWERFQ1JFRihzZWxmLT5vYl9jZGNhbGxiYWNrc1tpXS5vYl9jZGNhbGxiYWNrKTsKKyAgICAgICAgc2VsZi0+b2JfY2RjYWxsYmFja3NbaV0ub2JfY2RjYWxsYmFjayA9IE5VTEw7CisgICAgICAgIFB5X1hERUNSRUYoc2VsZi0+b2JfY2RjYWxsYmFja3NbaV0ub2JfY2RjYWxsYmFja2FyZyk7CisgICAgICAgIHNlbGYtPm9iX2NkY2FsbGJhY2tzW2ldLm9iX2NkY2FsbGJhY2thcmcgPSBOVUxMOworICAgIH0KKyAgICBDRGRlbGV0ZXBhcnNlcihzZWxmLT5vYl9jZHBhcnNlcik7CisgICAgUHlPYmplY3RfRGVsKHNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY2RwYXJzZXJfZ2V0YXR0cihjZHBhcnNlcm9iamVjdCAqc2VsZiwgY2hhciAqbmFtZSkKIHsKLQlpZiAoc2VsZi0+b2JfY2RwYXJzZXIgPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAibm8gcGFyc2VyIGFjdGl2ZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKHNlbGYtPm9iX2NkcGFyc2VyID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgIm5vIHBhcnNlciBhY3RpdmUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JcmV0dXJuIFB5X0ZpbmRNZXRob2QoY2RwYXJzZXJfbWV0aG9kcywgKFB5T2JqZWN0ICopc2VsZiwgbmFtZSk7CisgICAgcmV0dXJuIFB5X0ZpbmRNZXRob2QoY2RwYXJzZXJfbWV0aG9kcywgKFB5T2JqZWN0ICopc2VsZiwgbmFtZSk7CiB9CiAKIFB5VHlwZU9iamVjdCBDZFBhcnNlcnR5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSkKLQkwLAkJCS8qb2Jfc2l6ZSovCi0JImNkLmNkcGFyc2VyIiwJCS8qdHBfbmFtZSovCi0Jc2l6ZW9mKGNkcGFyc2Vyb2JqZWN0KSwJLyp0cF9zaXplKi8KLQkwLAkJCS8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvciljZHBhcnNlcl9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsCQkJLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKWNkcGFyc2VyX2dldGF0dHIsIC8qdHBfZ2V0YXR0ciovCi0JMCwJCQkvKnRwX3NldGF0dHIqLwotCTAsCQkJLyp0cF9jb21wYXJlKi8KLQkwLAkJCS8qdHBfcmVwciovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSkKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLypvYl9zaXplKi8KKyAgICAiY2QuY2RwYXJzZXIiLCAgICAgICAgICAgICAgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoY2RwYXJzZXJvYmplY3QpLCAgICAgLyp0cF9zaXplKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKWNkcGFyc2VyX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYyljZHBhcnNlcl9nZXRhdHRyLCAvKnRwX2dldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NvbXBhcmUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3JlcHIqLwogfTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIG5ld2NkcGFyc2Vyb2JqZWN0KENEUEFSU0VSICpjZHApCiB7Ci0JY2RwYXJzZXJvYmplY3QgKnA7Ci0JaW50IGk7CisgICAgY2RwYXJzZXJvYmplY3QgKnA7CisgICAgaW50IGk7CiAKLQlwID0gUHlPYmplY3RfTmV3KGNkcGFyc2Vyb2JqZWN0LCAmQ2RQYXJzZXJ0eXBlKTsKLQlpZiAocCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlwLT5vYl9jZHBhcnNlciA9IGNkcDsKLQlmb3IgKGkgPSAwOyBpIDwgTkNBTExCQUNLUzsgaSsrKSB7Ci0JCXAtPm9iX2NkY2FsbGJhY2tzW2ldLm9iX2NkY2FsbGJhY2sgPSBOVUxMOwotCQlwLT5vYl9jZGNhbGxiYWNrc1tpXS5vYl9jZGNhbGxiYWNrYXJnID0gTlVMTDsKLQl9Ci0JcmV0dXJuIChQeU9iamVjdCAqKSBwOworICAgIHAgPSBQeU9iamVjdF9OZXcoY2RwYXJzZXJvYmplY3QsICZDZFBhcnNlcnR5cGUpOworICAgIGlmIChwID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHAtPm9iX2NkcGFyc2VyID0gY2RwOworICAgIGZvciAoaSA9IDA7IGkgPCBOQ0FMTEJBQ0tTOyBpKyspIHsKKyAgICAgICAgcC0+b2JfY2RjYWxsYmFja3NbaV0ub2JfY2RjYWxsYmFjayA9IE5VTEw7CisgICAgICAgIHAtPm9iX2NkY2FsbGJhY2tzW2ldLm9iX2NkY2FsbGJhY2thcmcgPSBOVUxMOworICAgIH0KKyAgICByZXR1cm4gKFB5T2JqZWN0ICopIHA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBDRF9jcmVhdGVwYXJzZXIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCUNEUEFSU0VSICpjZHA7CisgICAgQ0RQQVJTRVIgKmNkcDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOmNyZWF0ZXBhcnNlciIpKQotCQlyZXR1cm4gTlVMTDsKLQljZHAgPSBDRGNyZWF0ZXBhcnNlcigpOwotCWlmIChjZHAgPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoQ2RFcnJvciwgImNyZWF0ZXBhcnNlciBmYWlsZWQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOmNyZWF0ZXBhcnNlciIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBjZHAgPSBDRGNyZWF0ZXBhcnNlcigpOworICAgIGlmIChjZHAgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoQ2RFcnJvciwgImNyZWF0ZXBhcnNlciBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JcmV0dXJuIG5ld2NkcGFyc2Vyb2JqZWN0KGNkcCk7CisgICAgcmV0dXJuIG5ld2NkcGFyc2Vyb2JqZWN0KGNkcCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBDRF9tc2Z0b2ZyYW1lKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgbWluLCBzZWMsIGZyYW1lOworICAgIGludCBtaW4sIHNlYywgZnJhbWU7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpaTptc2Z0b2ZyYW1lIiwgJm1pbiwgJnNlYywgJmZyYW1lKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpaWk6bXNmdG9mcmFtZSIsICZtaW4sICZzZWMsICZmcmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKSBDRG1zZnRvZnJhbWUobWluLCBzZWMsIGZyYW1lKSk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKSBDRG1zZnRvZnJhbWUobWluLCBzZWMsIGZyYW1lKSk7CiB9Ci0JCisKIHN0YXRpYyBQeU1ldGhvZERlZiBDRF9tZXRob2RzW10gPSB7Ci0JeyJvcGVuIiwJCShQeUNGdW5jdGlvbilDRF9vcGVuLAkJTUVUSF9WQVJBUkdTfSwKLQl7ImNyZWF0ZXBhcnNlciIsCShQeUNGdW5jdGlvbilDRF9jcmVhdGVwYXJzZXIsCU1FVEhfVkFSQVJHU30sCi0JeyJtc2Z0b2ZyYW1lIiwJCShQeUNGdW5jdGlvbilDRF9tc2Z0b2ZyYW1lLAlNRVRIX1ZBUkFSR1N9LAotCXtOVUxMLAkJTlVMTH0JLyogU2VudGluZWwgKi8KKyAgICB7Im9wZW4iLCAgICAgICAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKUNEX29wZW4sICAgICAgICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsiY3JlYXRlcGFyc2VyIiwgICAgICAgICAgICAoUHlDRnVuY3Rpb24pQ0RfY3JlYXRlcGFyc2VyLCAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJtc2Z0b2ZyYW1lIiwgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilDRF9tc2Z0b2ZyYW1lLCAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgLyogU2VudGluZWwgKi8KIH07CiAKIHZvaWQKIGluaXRjZCh2b2lkKQogewotCVB5T2JqZWN0ICptLCAqZDsKLQkKLQlpZiAoUHlFcnJfV2FyblB5M2soInRoZSBjZCBtb2R1bGUgaGFzIGJlZW4gcmVtb3ZlZCBpbiAiCi0JICAgICAgICAgICAgICAgICAgICJQeXRob24gMy4wIiwgMikgPCAwKQotCSAgICByZXR1cm47CisgICAgUHlPYmplY3QgKm0sICpkOwogCi0JbSA9IFB5X0luaXRNb2R1bGUoImNkIiwgQ0RfbWV0aG9kcyk7Ci0JaWYgKG0gPT0gTlVMTCkKLQkJcmV0dXJuOwotCWQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOworICAgIGlmIChQeUVycl9XYXJuUHkzaygidGhlIGNkIG1vZHVsZSBoYXMgYmVlbiByZW1vdmVkIGluICIKKyAgICAgICAgICAgICAgICAgICAgICAgIlB5dGhvbiAzLjAiLCAyKSA8IDApCisgICAgICAgIHJldHVybjsKIAotCUNkRXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oImNkLmVycm9yIiwgTlVMTCwgTlVMTCk7Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgImVycm9yIiwgQ2RFcnJvcik7CisgICAgbSA9IFB5X0luaXRNb2R1bGUoImNkIiwgQ0RfbWV0aG9kcyk7CisgICAgaWYgKG0gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOworICAgIGQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOwogCi0JLyogSWRlbnRpZmllcnMgZm9yIHRoZSBkaWZmZXJlbnQgdHlwZXMgb2YgY2FsbGJhY2tzIGZyb20gdGhlIHBhcnNlciAqLwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJhdWRpbyIsIFB5SW50X0Zyb21Mb25nKChsb25nKSBjZF9hdWRpbykpOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJwbnVtIiwgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIGNkX3BudW0pKTsKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiaW5kZXgiLCBQeUludF9Gcm9tTG9uZygobG9uZykgY2RfaW5kZXgpKTsKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAicHRpbWUiLCBQeUludF9Gcm9tTG9uZygobG9uZykgY2RfcHRpbWUpKTsKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiYXRpbWUiLCBQeUludF9Gcm9tTG9uZygobG9uZykgY2RfYXRpbWUpKTsKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiY2F0YWxvZyIsIFB5SW50X0Zyb21Mb25nKChsb25nKSBjZF9jYXRhbG9nKSk7Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgImlkZW50IiwgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIGNkX2lkZW50KSk7Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgImNvbnRyb2wiLCBQeUludF9Gcm9tTG9uZygobG9uZykgY2RfY29udHJvbCkpOworICAgIENkRXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oImNkLmVycm9yIiwgTlVMTCwgTlVMTCk7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgImVycm9yIiwgQ2RFcnJvcik7CiAKLQkvKiBCbG9jayBzaXplIGluZm9ybWF0aW9uIGZvciBkaWdpdGFsIGF1ZGlvIGRhdGEgKi8KLQlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiREFUQVNJWkUiLAotCQkJICAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIENEREFfREFUQVNJWkUpKTsKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkxPQ0tTSVpFIiwKLQkJCSAgIFB5SW50X0Zyb21Mb25nKChsb25nKSBDRERBX0JMT0NLU0laRSkpOworICAgIC8qIElkZW50aWZpZXJzIGZvciB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIGNhbGxiYWNrcyBmcm9tIHRoZSBwYXJzZXIgKi8KKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiYXVkaW8iLCBQeUludF9Gcm9tTG9uZygobG9uZykgY2RfYXVkaW8pKTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAicG51bSIsIFB5SW50X0Zyb21Mb25nKChsb25nKSBjZF9wbnVtKSk7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgImluZGV4IiwgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIGNkX2luZGV4KSk7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgInB0aW1lIiwgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIGNkX3B0aW1lKSk7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgImF0aW1lIiwgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIGNkX2F0aW1lKSk7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgImNhdGFsb2ciLCBQeUludF9Gcm9tTG9uZygobG9uZykgY2RfY2F0YWxvZykpOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJpZGVudCIsIFB5SW50X0Zyb21Mb25nKChsb25nKSBjZF9pZGVudCkpOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJjb250cm9sIiwgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIGNkX2NvbnRyb2wpKTsKIAotCS8qIFBvc3NpYmxlIHN0YXRlcyBmb3IgdGhlIGNkIHBsYXllciAqLwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFUlJPUiIsIFB5SW50X0Zyb21Mb25nKChsb25nKSBDRF9FUlJPUikpOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJOT0RJU0MiLCBQeUludF9Gcm9tTG9uZygobG9uZykgQ0RfTk9ESVNDKSk7Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJFQURZIiwgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIENEX1JFQURZKSk7Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlBMQVlJTkciLCBQeUludF9Gcm9tTG9uZygobG9uZykgQ0RfUExBWUlORykpOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJQQVVTRUQiLCBQeUludF9Gcm9tTG9uZygobG9uZykgQ0RfUEFVU0VEKSk7Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNUSUxMIiwgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIENEX1NUSUxMKSk7Ci0jaWZkZWYgQ0RfQ0RST00JCQkvKiBvbmx5IG5ld2VyIHZlcnNpb25zIG9mIHRoZSBsaWJyYXJ5ICovCi0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkNEUk9NIiwgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIENEX0NEUk9NKSk7CisgICAgLyogQmxvY2sgc2l6ZSBpbmZvcm1hdGlvbiBmb3IgZGlnaXRhbCBhdWRpbyBkYXRhICovCisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkRBVEFTSVpFIiwKKyAgICAgICAgICAgICAgICAgICAgICAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIENEREFfREFUQVNJWkUpKTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkxPQ0tTSVpFIiwKKyAgICAgICAgICAgICAgICAgICAgICAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIENEREFfQkxPQ0tTSVpFKSk7CisKKyAgICAvKiBQb3NzaWJsZSBzdGF0ZXMgZm9yIHRoZSBjZCBwbGF5ZXIgKi8KKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRVJST1IiLCBQeUludF9Gcm9tTG9uZygobG9uZykgQ0RfRVJST1IpKTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTk9ESVNDIiwgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIENEX05PRElTQykpOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSRUFEWSIsIFB5SW50X0Zyb21Mb25nKChsb25nKSBDRF9SRUFEWSkpOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJQTEFZSU5HIiwgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIENEX1BMQVlJTkcpKTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUEFVU0VEIiwgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIENEX1BBVVNFRCkpOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTVElMTCIsIFB5SW50X0Zyb21Mb25nKChsb25nKSBDRF9TVElMTCkpOworI2lmZGVmIENEX0NEUk9NICAgICAgICAgICAgICAgICAvKiBvbmx5IG5ld2VyIHZlcnNpb25zIG9mIHRoZSBsaWJyYXJ5ICovCisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkNEUk9NIiwgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIENEX0NEUk9NKSk7CiAjZW5kaWYKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvY2dlbnN1cHBvcnQuYyBiL01vZHVsZXMvY2dlbnN1cHBvcnQuYwppbmRleCA3ZTdkMGZmLi5hYWQ0M2EyIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2NnZW5zdXBwb3J0LmMKKysrIGIvTW9kdWxlcy9jZ2Vuc3VwcG9ydC5jCkBAIC0xMywxNTggKzEzLDE1OCBAQAogaW50CiBQeUFyZ19HZXRPYmplY3QocmVnaXN0ZXIgUHlPYmplY3QgKmFyZ3MsIGludCBuYXJncywgaW50IGksIFB5T2JqZWN0ICoqcF9hcmcpCiB7Ci0JaWYgKG5hcmdzICE9IDEpIHsKLQkJaWYgKGFyZ3MgPT0gTlVMTCB8fCAhUHlUdXBsZV9DaGVjayhhcmdzKSB8fAotCQkJCW5hcmdzICE9IFB5VHVwbGVfU2l6ZShhcmdzKSB8fAotCQkJCWkgPCAwIHx8IGkgPj0gbmFyZ3MpIHsKLQkJCXJldHVybiBQeUVycl9CYWRBcmd1bWVudCgpOwotCQl9Ci0JCWVsc2UgewotCQkJYXJncyA9IFB5VHVwbGVfR2V0SXRlbShhcmdzLCBpKTsKLQkJfQotCX0KLQlpZiAoYXJncyA9PSBOVUxMKSB7Ci0JCXJldHVybiBQeUVycl9CYWRBcmd1bWVudCgpOwotCX0KLQkqcF9hcmcgPSBhcmdzOwotCXJldHVybiAxOworICAgIGlmIChuYXJncyAhPSAxKSB7CisgICAgICAgIGlmIChhcmdzID09IE5VTEwgfHwgIVB5VHVwbGVfQ2hlY2soYXJncykgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hcmdzICE9IFB5VHVwbGVfU2l6ZShhcmdzKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgaSA8IDAgfHwgaSA+PSBuYXJncykgeworICAgICAgICAgICAgcmV0dXJuIFB5RXJyX0JhZEFyZ3VtZW50KCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBhcmdzID0gUHlUdXBsZV9HZXRJdGVtKGFyZ3MsIGkpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChhcmdzID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIFB5RXJyX0JhZEFyZ3VtZW50KCk7CisgICAgfQorICAgICpwX2FyZyA9IGFyZ3M7CisgICAgcmV0dXJuIDE7CiB9CiAKIGludAogUHlBcmdfR2V0TG9uZyhyZWdpc3RlciBQeU9iamVjdCAqYXJncywgaW50IG5hcmdzLCBpbnQgaSwgbG9uZyAqcF9hcmcpCiB7Ci0JaWYgKG5hcmdzICE9IDEpIHsKLQkJaWYgKGFyZ3MgPT0gTlVMTCB8fCAhUHlUdXBsZV9DaGVjayhhcmdzKSB8fAotCQkJCW5hcmdzICE9IFB5VHVwbGVfU2l6ZShhcmdzKSB8fAotCQkJCWkgPCAwIHx8IGkgPj0gbmFyZ3MpIHsKLQkJCXJldHVybiBQeUVycl9CYWRBcmd1bWVudCgpOwotCQl9Ci0JCWFyZ3MgPSBQeVR1cGxlX0dldEl0ZW0oYXJncywgaSk7Ci0JfQotCWlmIChhcmdzID09IE5VTEwgfHwgIVB5SW50X0NoZWNrKGFyZ3MpKSB7Ci0JCXJldHVybiBQeUVycl9CYWRBcmd1bWVudCgpOwotCX0KLQkqcF9hcmcgPSBQeUludF9Bc0xvbmcoYXJncyk7Ci0JcmV0dXJuIDE7CisgICAgaWYgKG5hcmdzICE9IDEpIHsKKyAgICAgICAgaWYgKGFyZ3MgPT0gTlVMTCB8fCAhUHlUdXBsZV9DaGVjayhhcmdzKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgbmFyZ3MgIT0gUHlUdXBsZV9TaXplKGFyZ3MpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBpIDwgMCB8fCBpID49IG5hcmdzKSB7CisgICAgICAgICAgICByZXR1cm4gUHlFcnJfQmFkQXJndW1lbnQoKTsKKyAgICAgICAgfQorICAgICAgICBhcmdzID0gUHlUdXBsZV9HZXRJdGVtKGFyZ3MsIGkpOworICAgIH0KKyAgICBpZiAoYXJncyA9PSBOVUxMIHx8ICFQeUludF9DaGVjayhhcmdzKSkgeworICAgICAgICByZXR1cm4gUHlFcnJfQmFkQXJndW1lbnQoKTsKKyAgICB9CisgICAgKnBfYXJnID0gUHlJbnRfQXNMb25nKGFyZ3MpOworICAgIHJldHVybiAxOwogfQogCiBpbnQKIFB5QXJnX0dldFNob3J0KHJlZ2lzdGVyIFB5T2JqZWN0ICphcmdzLCBpbnQgbmFyZ3MsIGludCBpLCBzaG9ydCAqcF9hcmcpCiB7Ci0JbG9uZyB4OwotCWlmICghUHlBcmdfR2V0TG9uZyhhcmdzLCBuYXJncywgaSwgJngpKQotCQlyZXR1cm4gMDsKLQkqcF9hcmcgPSAoc2hvcnQpIHg7Ci0JcmV0dXJuIDE7CisgICAgbG9uZyB4OworICAgIGlmICghUHlBcmdfR2V0TG9uZyhhcmdzLCBuYXJncywgaSwgJngpKQorICAgICAgICByZXR1cm4gMDsKKyAgICAqcF9hcmcgPSAoc2hvcnQpIHg7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyBpbnQKIGV4dHJhY3Rkb3VibGUocmVnaXN0ZXIgUHlPYmplY3QgKnYsIGRvdWJsZSAqcF9hcmcpCiB7Ci0JaWYgKHYgPT0gTlVMTCkgewotCQkvKiBGYWxsIHRocm91Z2ggdG8gZXJyb3IgcmV0dXJuIGF0IGVuZCBvZiBmdW5jdGlvbiAqLwotCX0KLQllbHNlIGlmIChQeUZsb2F0X0NoZWNrKHYpKSB7Ci0JCSpwX2FyZyA9IFB5RmxvYXRfQVNfRE9VQkxFKChQeUZsb2F0T2JqZWN0ICopdik7Ci0JCXJldHVybiAxOwotCX0KLQllbHNlIGlmIChQeUludF9DaGVjayh2KSkgewotCQkqcF9hcmcgPSBQeUludF9BU19MT05HKChQeUludE9iamVjdCAqKXYpOwotCQlyZXR1cm4gMTsKLQl9Ci0JZWxzZSBpZiAoUHlMb25nX0NoZWNrKHYpKSB7Ci0JCSpwX2FyZyA9IFB5TG9uZ19Bc0RvdWJsZSh2KTsKLQkJcmV0dXJuIDE7Ci0JfQotCXJldHVybiBQeUVycl9CYWRBcmd1bWVudCgpOworICAgIGlmICh2ID09IE5VTEwpIHsKKyAgICAgICAgLyogRmFsbCB0aHJvdWdoIHRvIGVycm9yIHJldHVybiBhdCBlbmQgb2YgZnVuY3Rpb24gKi8KKyAgICB9CisgICAgZWxzZSBpZiAoUHlGbG9hdF9DaGVjayh2KSkgeworICAgICAgICAqcF9hcmcgPSBQeUZsb2F0X0FTX0RPVUJMRSgoUHlGbG9hdE9iamVjdCAqKXYpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgZWxzZSBpZiAoUHlJbnRfQ2hlY2sodikpIHsKKyAgICAgICAgKnBfYXJnID0gUHlJbnRfQVNfTE9ORygoUHlJbnRPYmplY3QgKil2KTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGVsc2UgaWYgKFB5TG9uZ19DaGVjayh2KSkgeworICAgICAgICAqcF9hcmcgPSBQeUxvbmdfQXNEb3VibGUodik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICByZXR1cm4gUHlFcnJfQmFkQXJndW1lbnQoKTsKIH0KIAogc3RhdGljIGludAogZXh0cmFjdGZsb2F0KHJlZ2lzdGVyIFB5T2JqZWN0ICp2LCBmbG9hdCAqcF9hcmcpCiB7Ci0JaWYgKHYgPT0gTlVMTCkgewotCQkvKiBGYWxsIHRocm91Z2ggdG8gZXJyb3IgcmV0dXJuIGF0IGVuZCBvZiBmdW5jdGlvbiAqLwotCX0KLQllbHNlIGlmIChQeUZsb2F0X0NoZWNrKHYpKSB7Ci0JCSpwX2FyZyA9IChmbG9hdCkgUHlGbG9hdF9BU19ET1VCTEUoKFB5RmxvYXRPYmplY3QgKil2KTsKLQkJcmV0dXJuIDE7Ci0JfQotCWVsc2UgaWYgKFB5SW50X0NoZWNrKHYpKSB7Ci0JCSpwX2FyZyA9IChmbG9hdCkgUHlJbnRfQVNfTE9ORygoUHlJbnRPYmplY3QgKil2KTsKLQkJcmV0dXJuIDE7Ci0JfQotCWVsc2UgaWYgKFB5TG9uZ19DaGVjayh2KSkgewotCQkqcF9hcmcgPSAoZmxvYXQpIFB5TG9uZ19Bc0RvdWJsZSh2KTsKLQkJcmV0dXJuIDE7Ci0JfQotCXJldHVybiBQeUVycl9CYWRBcmd1bWVudCgpOworICAgIGlmICh2ID09IE5VTEwpIHsKKyAgICAgICAgLyogRmFsbCB0aHJvdWdoIHRvIGVycm9yIHJldHVybiBhdCBlbmQgb2YgZnVuY3Rpb24gKi8KKyAgICB9CisgICAgZWxzZSBpZiAoUHlGbG9hdF9DaGVjayh2KSkgeworICAgICAgICAqcF9hcmcgPSAoZmxvYXQpIFB5RmxvYXRfQVNfRE9VQkxFKChQeUZsb2F0T2JqZWN0ICopdik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBlbHNlIGlmIChQeUludF9DaGVjayh2KSkgeworICAgICAgICAqcF9hcmcgPSAoZmxvYXQpIFB5SW50X0FTX0xPTkcoKFB5SW50T2JqZWN0ICopdik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBlbHNlIGlmIChQeUxvbmdfQ2hlY2sodikpIHsKKyAgICAgICAgKnBfYXJnID0gKGZsb2F0KSBQeUxvbmdfQXNEb3VibGUodik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICByZXR1cm4gUHlFcnJfQmFkQXJndW1lbnQoKTsKIH0KIAogaW50CiBQeUFyZ19HZXRGbG9hdChyZWdpc3RlciBQeU9iamVjdCAqYXJncywgaW50IG5hcmdzLCBpbnQgaSwgZmxvYXQgKnBfYXJnKQogewotCVB5T2JqZWN0ICp2OwotCWZsb2F0IHg7Ci0JaWYgKCFQeUFyZ19HZXRPYmplY3QoYXJncywgbmFyZ3MsIGksICZ2KSkKLQkJcmV0dXJuIDA7Ci0JaWYgKCFleHRyYWN0ZmxvYXQodiwgJngpKQotCQlyZXR1cm4gMDsKLQkqcF9hcmcgPSB4OwotCXJldHVybiAxOworICAgIFB5T2JqZWN0ICp2OworICAgIGZsb2F0IHg7CisgICAgaWYgKCFQeUFyZ19HZXRPYmplY3QoYXJncywgbmFyZ3MsIGksICZ2KSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKCFleHRyYWN0ZmxvYXQodiwgJngpKQorICAgICAgICByZXR1cm4gMDsKKyAgICAqcF9hcmcgPSB4OworICAgIHJldHVybiAxOwogfQogCiBpbnQKIFB5QXJnX0dldFN0cmluZyhQeU9iamVjdCAqYXJncywgaW50IG5hcmdzLCBpbnQgaSwgc3RyaW5nICpwX2FyZykKIHsKLQlQeU9iamVjdCAqdjsKLQlpZiAoIVB5QXJnX0dldE9iamVjdChhcmdzLCBuYXJncywgaSwgJnYpKQotCQlyZXR1cm4gMDsKLQlpZiAoIVB5U3RyaW5nX0NoZWNrKHYpKSB7Ci0JCXJldHVybiBQeUVycl9CYWRBcmd1bWVudCgpOwotCX0KLQkqcF9hcmcgPSBQeVN0cmluZ19Bc1N0cmluZyh2KTsKLQlyZXR1cm4gMTsKKyAgICBQeU9iamVjdCAqdjsKKyAgICBpZiAoIVB5QXJnX0dldE9iamVjdChhcmdzLCBuYXJncywgaSwgJnYpKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoIVB5U3RyaW5nX0NoZWNrKHYpKSB7CisgICAgICAgIHJldHVybiBQeUVycl9CYWRBcmd1bWVudCgpOworICAgIH0KKyAgICAqcF9hcmcgPSBQeVN0cmluZ19Bc1N0cmluZyh2KTsKKyAgICByZXR1cm4gMTsKIH0KIAogaW50CiBQeUFyZ19HZXRDaGFyKFB5T2JqZWN0ICphcmdzLCBpbnQgbmFyZ3MsIGludCBpLCBjaGFyICpwX2FyZykKIHsKLQlzdHJpbmcgeDsKLQlpZiAoIVB5QXJnX0dldFN0cmluZyhhcmdzLCBuYXJncywgaSwgJngpKQotCQlyZXR1cm4gMDsKLQlpZiAoeFswXSA9PSAnXDAnIHx8IHhbMV0gIT0gJ1wwJykgewotCQkvKiBOb3QgZXhhY3RseSBvbmUgY2hhciAqLwotCQlyZXR1cm4gUHlFcnJfQmFkQXJndW1lbnQoKTsKLQl9Ci0JKnBfYXJnID0geFswXTsKLQlyZXR1cm4gMTsKKyAgICBzdHJpbmcgeDsKKyAgICBpZiAoIVB5QXJnX0dldFN0cmluZyhhcmdzLCBuYXJncywgaSwgJngpKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoeFswXSA9PSAnXDAnIHx8IHhbMV0gIT0gJ1wwJykgeworICAgICAgICAvKiBOb3QgZXhhY3RseSBvbmUgY2hhciAqLworICAgICAgICByZXR1cm4gUHlFcnJfQmFkQXJndW1lbnQoKTsKKyAgICB9CisgICAgKnBfYXJnID0geFswXTsKKyAgICByZXR1cm4gMTsKIH0KIAogaW50CiBQeUFyZ19HZXRMb25nQXJyYXlTaXplKFB5T2JqZWN0ICphcmdzLCBpbnQgbmFyZ3MsIGludCBpLCBsb25nICpwX2FyZykKIHsKLQlQeU9iamVjdCAqdjsKLQlpZiAoIVB5QXJnX0dldE9iamVjdChhcmdzLCBuYXJncywgaSwgJnYpKQotCQlyZXR1cm4gMDsKLQlpZiAoUHlUdXBsZV9DaGVjayh2KSkgewotCQkqcF9hcmcgPSBQeVR1cGxlX1NpemUodik7Ci0JCXJldHVybiAxOwotCX0KLQlpZiAoUHlMaXN0X0NoZWNrKHYpKSB7Ci0JCSpwX2FyZyA9IFB5TGlzdF9TaXplKHYpOwotCQlyZXR1cm4gMTsKLQl9Ci0JcmV0dXJuIFB5RXJyX0JhZEFyZ3VtZW50KCk7CisgICAgUHlPYmplY3QgKnY7CisgICAgaWYgKCFQeUFyZ19HZXRPYmplY3QoYXJncywgbmFyZ3MsIGksICZ2KSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKFB5VHVwbGVfQ2hlY2sodikpIHsKKyAgICAgICAgKnBfYXJnID0gUHlUdXBsZV9TaXplKHYpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgaWYgKFB5TGlzdF9DaGVjayh2KSkgeworICAgICAgICAqcF9hcmcgPSBQeUxpc3RfU2l6ZSh2KTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHJldHVybiBQeUVycl9CYWRBcmd1bWVudCgpOwogfQogCiBpbnQKIFB5QXJnX0dldFNob3J0QXJyYXlTaXplKFB5T2JqZWN0ICphcmdzLCBpbnQgbmFyZ3MsIGludCBpLCBzaG9ydCAqcF9hcmcpCiB7Ci0JbG9uZyB4OwotCWlmICghUHlBcmdfR2V0TG9uZ0FycmF5U2l6ZShhcmdzLCBuYXJncywgaSwgJngpKQotCQlyZXR1cm4gMDsKLQkqcF9hcmcgPSAoc2hvcnQpIHg7Ci0JcmV0dXJuIDE7CisgICAgbG9uZyB4OworICAgIGlmICghUHlBcmdfR2V0TG9uZ0FycmF5U2l6ZShhcmdzLCBuYXJncywgaSwgJngpKQorICAgICAgICByZXR1cm4gMDsKKyAgICAqcF9hcmcgPSAoc2hvcnQpIHg7CisgICAgcmV0dXJuIDE7CiB9CiAKIC8qIFhYWCBUaGUgZm9sbG93aW5nIGZvdXIgYXJlIHRvbyBzaW1pbGFyLiAgU2hvdWxkIHNoYXJlIG1vcmUgY29kZS4gKi8KQEAgLTE3MiwxMzkgKzE3MiwxMzkgQEAKIGludAogUHlBcmdfR2V0TG9uZ0FycmF5KFB5T2JqZWN0ICphcmdzLCBpbnQgbmFyZ3MsIGludCBpLCBpbnQgbiwgbG9uZyAqcF9hcmcpCiB7Ci0JUHlPYmplY3QgKnYsICp3OwotCWlmICghUHlBcmdfR2V0T2JqZWN0KGFyZ3MsIG5hcmdzLCBpLCAmdikpCi0JCXJldHVybiAwOwotCWlmIChQeVR1cGxlX0NoZWNrKHYpKSB7Ci0JCWlmIChQeVR1cGxlX1NpemUodikgIT0gbikgewotCQkJcmV0dXJuIFB5RXJyX0JhZEFyZ3VtZW50KCk7Ci0JCX0KLQkJZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQkJdyA9IFB5VHVwbGVfR2V0SXRlbSh2LCBpKTsKLQkJCWlmICghUHlJbnRfQ2hlY2sodykpIHsKLQkJCQlyZXR1cm4gUHlFcnJfQmFkQXJndW1lbnQoKTsKLQkJCX0KLQkJCXBfYXJnW2ldID0gUHlJbnRfQXNMb25nKHcpOwotCQl9Ci0JCXJldHVybiAxOwotCX0KLQllbHNlIGlmIChQeUxpc3RfQ2hlY2sodikpIHsKLQkJaWYgKFB5TGlzdF9TaXplKHYpICE9IG4pIHsKLQkJCXJldHVybiBQeUVycl9CYWRBcmd1bWVudCgpOwotCQl9Ci0JCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJCXcgPSBQeUxpc3RfR2V0SXRlbSh2LCBpKTsKLQkJCWlmICghUHlJbnRfQ2hlY2sodykpIHsKLQkJCQlyZXR1cm4gUHlFcnJfQmFkQXJndW1lbnQoKTsKLQkJCX0KLQkJCXBfYXJnW2ldID0gUHlJbnRfQXNMb25nKHcpOwotCQl9Ci0JCXJldHVybiAxOwotCX0KLQllbHNlIHsKLQkJcmV0dXJuIFB5RXJyX0JhZEFyZ3VtZW50KCk7Ci0JfQorICAgIFB5T2JqZWN0ICp2LCAqdzsKKyAgICBpZiAoIVB5QXJnX0dldE9iamVjdChhcmdzLCBuYXJncywgaSwgJnYpKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoUHlUdXBsZV9DaGVjayh2KSkgeworICAgICAgICBpZiAoUHlUdXBsZV9TaXplKHYpICE9IG4pIHsKKyAgICAgICAgICAgIHJldHVybiBQeUVycl9CYWRBcmd1bWVudCgpOworICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICAgIHcgPSBQeVR1cGxlX0dldEl0ZW0odiwgaSk7CisgICAgICAgICAgICBpZiAoIVB5SW50X0NoZWNrKHcpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFB5RXJyX0JhZEFyZ3VtZW50KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwX2FyZ1tpXSA9IFB5SW50X0FzTG9uZyh3KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgZWxzZSBpZiAoUHlMaXN0X0NoZWNrKHYpKSB7CisgICAgICAgIGlmIChQeUxpc3RfU2l6ZSh2KSAhPSBuKSB7CisgICAgICAgICAgICByZXR1cm4gUHlFcnJfQmFkQXJndW1lbnQoKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgICAgICB3ID0gUHlMaXN0X0dldEl0ZW0odiwgaSk7CisgICAgICAgICAgICBpZiAoIVB5SW50X0NoZWNrKHcpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFB5RXJyX0JhZEFyZ3VtZW50KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwX2FyZ1tpXSA9IFB5SW50X0FzTG9uZyh3KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJldHVybiBQeUVycl9CYWRBcmd1bWVudCgpOworICAgIH0KIH0KIAogaW50CiBQeUFyZ19HZXRTaG9ydEFycmF5KFB5T2JqZWN0ICphcmdzLCBpbnQgbmFyZ3MsIGludCBpLCBpbnQgbiwgc2hvcnQgKnBfYXJnKQogewotCVB5T2JqZWN0ICp2LCAqdzsKLQlpZiAoIVB5QXJnX0dldE9iamVjdChhcmdzLCBuYXJncywgaSwgJnYpKQotCQlyZXR1cm4gMDsKLQlpZiAoUHlUdXBsZV9DaGVjayh2KSkgewotCQlpZiAoUHlUdXBsZV9TaXplKHYpICE9IG4pIHsKLQkJCXJldHVybiBQeUVycl9CYWRBcmd1bWVudCgpOwotCQl9Ci0JCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJCXcgPSBQeVR1cGxlX0dldEl0ZW0odiwgaSk7Ci0JCQlpZiAoIVB5SW50X0NoZWNrKHcpKSB7Ci0JCQkJcmV0dXJuIFB5RXJyX0JhZEFyZ3VtZW50KCk7Ci0JCQl9Ci0JCQlwX2FyZ1tpXSA9IChzaG9ydCkgUHlJbnRfQXNMb25nKHcpOwotCQl9Ci0JCXJldHVybiAxOwotCX0KLQllbHNlIGlmIChQeUxpc3RfQ2hlY2sodikpIHsKLQkJaWYgKFB5TGlzdF9TaXplKHYpICE9IG4pIHsKLQkJCXJldHVybiBQeUVycl9CYWRBcmd1bWVudCgpOwotCQl9Ci0JCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJCXcgPSBQeUxpc3RfR2V0SXRlbSh2LCBpKTsKLQkJCWlmICghUHlJbnRfQ2hlY2sodykpIHsKLQkJCQlyZXR1cm4gUHlFcnJfQmFkQXJndW1lbnQoKTsKLQkJCX0KLQkJCXBfYXJnW2ldID0gKHNob3J0KSBQeUludF9Bc0xvbmcodyk7Ci0JCX0KLQkJcmV0dXJuIDE7Ci0JfQotCWVsc2UgewotCQlyZXR1cm4gUHlFcnJfQmFkQXJndW1lbnQoKTsKLQl9CisgICAgUHlPYmplY3QgKnYsICp3OworICAgIGlmICghUHlBcmdfR2V0T2JqZWN0KGFyZ3MsIG5hcmdzLCBpLCAmdikpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChQeVR1cGxlX0NoZWNrKHYpKSB7CisgICAgICAgIGlmIChQeVR1cGxlX1NpemUodikgIT0gbikgeworICAgICAgICAgICAgcmV0dXJuIFB5RXJyX0JhZEFyZ3VtZW50KCk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICAgICAgdyA9IFB5VHVwbGVfR2V0SXRlbSh2LCBpKTsKKyAgICAgICAgICAgIGlmICghUHlJbnRfQ2hlY2sodykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUHlFcnJfQmFkQXJndW1lbnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBfYXJnW2ldID0gKHNob3J0KSBQeUludF9Bc0xvbmcodyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGVsc2UgaWYgKFB5TGlzdF9DaGVjayh2KSkgeworICAgICAgICBpZiAoUHlMaXN0X1NpemUodikgIT0gbikgeworICAgICAgICAgICAgcmV0dXJuIFB5RXJyX0JhZEFyZ3VtZW50KCk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICAgICAgdyA9IFB5TGlzdF9HZXRJdGVtKHYsIGkpOworICAgICAgICAgICAgaWYgKCFQeUludF9DaGVjayh3KSkgeworICAgICAgICAgICAgICAgIHJldHVybiBQeUVycl9CYWRBcmd1bWVudCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcF9hcmdbaV0gPSAoc2hvcnQpIFB5SW50X0FzTG9uZyh3KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJldHVybiBQeUVycl9CYWRBcmd1bWVudCgpOworICAgIH0KIH0KIAogaW50CiBQeUFyZ19HZXREb3VibGVBcnJheShQeU9iamVjdCAqYXJncywgaW50IG5hcmdzLCBpbnQgaSwgaW50IG4sIGRvdWJsZSAqcF9hcmcpCiB7Ci0JUHlPYmplY3QgKnYsICp3OwotCWlmICghUHlBcmdfR2V0T2JqZWN0KGFyZ3MsIG5hcmdzLCBpLCAmdikpCi0JCXJldHVybiAwOwotCWlmIChQeVR1cGxlX0NoZWNrKHYpKSB7Ci0JCWlmIChQeVR1cGxlX1NpemUodikgIT0gbikgewotCQkJcmV0dXJuIFB5RXJyX0JhZEFyZ3VtZW50KCk7Ci0JCX0KLQkJZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQkJdyA9IFB5VHVwbGVfR2V0SXRlbSh2LCBpKTsKLQkJCWlmICghZXh0cmFjdGRvdWJsZSh3LCAmcF9hcmdbaV0pKQotCQkJCXJldHVybiAwOwotCQl9Ci0JCXJldHVybiAxOwotCX0KLQllbHNlIGlmIChQeUxpc3RfQ2hlY2sodikpIHsKLQkJaWYgKFB5TGlzdF9TaXplKHYpICE9IG4pIHsKLQkJCXJldHVybiBQeUVycl9CYWRBcmd1bWVudCgpOwotCQl9Ci0JCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJCXcgPSBQeUxpc3RfR2V0SXRlbSh2LCBpKTsKLQkJCWlmICghZXh0cmFjdGRvdWJsZSh3LCAmcF9hcmdbaV0pKQotCQkJCXJldHVybiAwOwotCQl9Ci0JCXJldHVybiAxOwotCX0KLQllbHNlIHsKLQkJcmV0dXJuIFB5RXJyX0JhZEFyZ3VtZW50KCk7Ci0JfQorICAgIFB5T2JqZWN0ICp2LCAqdzsKKyAgICBpZiAoIVB5QXJnX0dldE9iamVjdChhcmdzLCBuYXJncywgaSwgJnYpKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoUHlUdXBsZV9DaGVjayh2KSkgeworICAgICAgICBpZiAoUHlUdXBsZV9TaXplKHYpICE9IG4pIHsKKyAgICAgICAgICAgIHJldHVybiBQeUVycl9CYWRBcmd1bWVudCgpOworICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICAgIHcgPSBQeVR1cGxlX0dldEl0ZW0odiwgaSk7CisgICAgICAgICAgICBpZiAoIWV4dHJhY3Rkb3VibGUodywgJnBfYXJnW2ldKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgZWxzZSBpZiAoUHlMaXN0X0NoZWNrKHYpKSB7CisgICAgICAgIGlmIChQeUxpc3RfU2l6ZSh2KSAhPSBuKSB7CisgICAgICAgICAgICByZXR1cm4gUHlFcnJfQmFkQXJndW1lbnQoKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgICAgICB3ID0gUHlMaXN0X0dldEl0ZW0odiwgaSk7CisgICAgICAgICAgICBpZiAoIWV4dHJhY3Rkb3VibGUodywgJnBfYXJnW2ldKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJldHVybiBQeUVycl9CYWRBcmd1bWVudCgpOworICAgIH0KIH0KIAogaW50CiBQeUFyZ19HZXRGbG9hdEFycmF5KFB5T2JqZWN0ICphcmdzLCBpbnQgbmFyZ3MsIGludCBpLCBpbnQgbiwgZmxvYXQgKnBfYXJnKQogewotCVB5T2JqZWN0ICp2LCAqdzsKLQlpZiAoIVB5QXJnX0dldE9iamVjdChhcmdzLCBuYXJncywgaSwgJnYpKQotCQlyZXR1cm4gMDsKLQlpZiAoUHlUdXBsZV9DaGVjayh2KSkgewotCQlpZiAoUHlUdXBsZV9TaXplKHYpICE9IG4pIHsKLQkJCXJldHVybiBQeUVycl9CYWRBcmd1bWVudCgpOwotCQl9Ci0JCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJCXcgPSBQeVR1cGxlX0dldEl0ZW0odiwgaSk7Ci0JCQlpZiAoIWV4dHJhY3RmbG9hdCh3LCAmcF9hcmdbaV0pKQotCQkJCXJldHVybiAwOwotCQl9Ci0JCXJldHVybiAxOwotCX0KLQllbHNlIGlmIChQeUxpc3RfQ2hlY2sodikpIHsKLQkJaWYgKFB5TGlzdF9TaXplKHYpICE9IG4pIHsKLQkJCXJldHVybiBQeUVycl9CYWRBcmd1bWVudCgpOwotCQl9Ci0JCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJCXcgPSBQeUxpc3RfR2V0SXRlbSh2LCBpKTsKLQkJCWlmICghZXh0cmFjdGZsb2F0KHcsICZwX2FyZ1tpXSkpCi0JCQkJcmV0dXJuIDA7Ci0JCX0KLQkJcmV0dXJuIDE7Ci0JfQotCWVsc2UgewotCQlyZXR1cm4gUHlFcnJfQmFkQXJndW1lbnQoKTsKLQl9CisgICAgUHlPYmplY3QgKnYsICp3OworICAgIGlmICghUHlBcmdfR2V0T2JqZWN0KGFyZ3MsIG5hcmdzLCBpLCAmdikpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChQeVR1cGxlX0NoZWNrKHYpKSB7CisgICAgICAgIGlmIChQeVR1cGxlX1NpemUodikgIT0gbikgeworICAgICAgICAgICAgcmV0dXJuIFB5RXJyX0JhZEFyZ3VtZW50KCk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICAgICAgdyA9IFB5VHVwbGVfR2V0SXRlbSh2LCBpKTsKKyAgICAgICAgICAgIGlmICghZXh0cmFjdGZsb2F0KHcsICZwX2FyZ1tpXSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGVsc2UgaWYgKFB5TGlzdF9DaGVjayh2KSkgeworICAgICAgICBpZiAoUHlMaXN0X1NpemUodikgIT0gbikgeworICAgICAgICAgICAgcmV0dXJuIFB5RXJyX0JhZEFyZ3VtZW50KCk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICAgICAgdyA9IFB5TGlzdF9HZXRJdGVtKHYsIGkpOworICAgICAgICAgICAgaWYgKCFleHRyYWN0ZmxvYXQodywgJnBfYXJnW2ldKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJldHVybiBQeUVycl9CYWRBcmd1bWVudCgpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvY2dlbnN1cHBvcnQuaCBiL01vZHVsZXMvY2dlbnN1cHBvcnQuaAppbmRleCBiYzkwMWY2Li4yN2UxMjYxIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2NnZW5zdXBwb3J0LmgKKysrIGIvTW9kdWxlcy9jZ2Vuc3VwcG9ydC5oCkBAIC0zMCwzMyArMzAsMzMgQEAKICNkZWZpbmUgZ2V0aXN0cmluZ2FyZyBQeUFyZ19HZXRTdHJpbmcKIAogZXh0ZXJuIGludCBQeUFyZ19HZXRPYmplY3QoUHlPYmplY3QgKmFyZ3MsIGludCBuYXJncywKLQkJCSAgIGludCBpLCBQeU9iamVjdCAqKnBfYSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaSwgUHlPYmplY3QgKipwX2EpOwogZXh0ZXJuIGludCBQeUFyZ19HZXRMb25nKFB5T2JqZWN0ICphcmdzLCBpbnQgbmFyZ3MsCi0JCQkgaW50IGksIGxvbmcgKnBfYSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGksIGxvbmcgKnBfYSk7CiBleHRlcm4gaW50IFB5QXJnX0dldFNob3J0KFB5T2JqZWN0ICphcmdzLCBpbnQgbmFyZ3MsCi0JCQkgIGludCBpLCBzaG9ydCAqcF9hKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGksIHNob3J0ICpwX2EpOwogZXh0ZXJuIGludCBQeUFyZ19HZXRGbG9hdChQeU9iamVjdCAqYXJncywgaW50IG5hcmdzLAotCQkJICBpbnQgaSwgZmxvYXQgKnBfYSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpLCBmbG9hdCAqcF9hKTsKIGV4dGVybiBpbnQgUHlBcmdfR2V0U3RyaW5nKFB5T2JqZWN0ICphcmdzLCBpbnQgbmFyZ3MsCi0JCQkgICBpbnQgaSwgc3RyaW5nICpwX2EpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGksIHN0cmluZyAqcF9hKTsKIGV4dGVybiBpbnQgUHlBcmdfR2V0Q2hhcihQeU9iamVjdCAqYXJncywgaW50IG5hcmdzLAotCQkJIGludCBpLCBjaGFyICpwX2EpOworICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpLCBjaGFyICpwX2EpOwogZXh0ZXJuIGludCBQeUFyZ19HZXRMb25nQXJyYXkoUHlPYmplY3QgKmFyZ3MsIGludCBuYXJncywKLQkJCSAgICBpbnQgaSwgaW50IG4sIGxvbmcgKnBfYSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGksIGludCBuLCBsb25nICpwX2EpOwogZXh0ZXJuIGludCBQeUFyZ19HZXRTaG9ydEFycmF5KFB5T2JqZWN0ICphcmdzLCBpbnQgbmFyZ3MsCi0JCQkgICAgaW50IGksIGludCBuLCBzaG9ydCAqcF9hKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaSwgaW50IG4sIHNob3J0ICpwX2EpOwogZXh0ZXJuIGludCBQeUFyZ19HZXREb3VibGVBcnJheShQeU9iamVjdCAqYXJncywgaW50IG5hcmdzLAotCQkJCWludCBpLCBpbnQgbiwgZG91YmxlICpwX2EpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaSwgaW50IG4sIGRvdWJsZSAqcF9hKTsKIGV4dGVybiBpbnQgUHlBcmdfR2V0RmxvYXRBcnJheShQeU9iamVjdCAqYXJncywgaW50IG5hcmdzLAotCQkJICAgICAgIGludCBpLCBpbnQgbiwgZmxvYXQgKnBfYSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGksIGludCBuLCBmbG9hdCAqcF9hKTsKIGV4dGVybiBpbnQgUHlBcmdfR2V0TG9uZ0FycmF5U2l6ZShQeU9iamVjdCAqYXJncywgaW50IG5hcmdzLAotCQkJCSAgaW50IGksIGxvbmcgKnBfYSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGksIGxvbmcgKnBfYSk7CiBleHRlcm4gaW50IFB5QXJnX0dldFNob3J0QXJyYXlTaXplKFB5T2JqZWN0ICphcmdzLCBpbnQgbmFyZ3MsCi0JCQkJaW50IGksIHNob3J0ICpwX2EpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaSwgc2hvcnQgKnBfYSk7CiBleHRlcm4gaW50IFB5QXJnX0dldERvdWJsZUFycmF5U2l6ZShQeU9iamVjdCAqYXJncywgaW50IG5hcmdzLAotCQkJCSAgICBpbnQgaSwgZG91YmxlICpwX2EpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGksIGRvdWJsZSAqcF9hKTsKIGV4dGVybiBpbnQgUHlBcmdfR2V0RmxvYXRBcnJheVNpemUoUHlPYmplY3QgKmFyZ3MsIGludCBuYXJncywKLQkJCQkgICBpbnQgaSwgZmxvYXQgKnBfYSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpLCBmbG9hdCAqcF9hKTsKIAogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL2Nqa2NvZGVjcy9fY29kZWNzX2NuLmMgYi9Nb2R1bGVzL2Nqa2NvZGVjcy9fY29kZWNzX2NuLmMKaW5kZXggNDU0MmNlNi4uYWI0ZTY1OSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9jamtjb2RlY3MvX2NvZGVjc19jbi5jCisrKyBiL01vZHVsZXMvY2prY29kZWNzL19jb2RlY3NfY24uYwpAQCAtMTcsMjQgKzE3LDI0IEBACiAKIC8qIEdCSyBhbmQgR0IyMzEyIG1hcCBkaWZmZXJlbnRseSBpbiBmZXcgY29kZXBvaW50cyB0aGF0IGFyZSBsaXN0ZWQgYmVsb3c6CiAgKgotICoJCWdiMjMxMgkJCQlnYmsKLSAqIEExQTQJCVUrMzBGQiBLQVRBS0FOQSBNSURETEUgRE9UCVUrMDBCNyBNSURETEUgRE9UCi0gKiBBMUFBCQlVKzIwMTUgSE9SSVpPTlRBTCBCQVIJCVUrMjAxNCBFTSBEQVNICi0gKiBBODQ0CQl1bmRlZmluZWQJCQlVKzIwMTUgSE9SSVpPTlRBTCBCQVIKKyAqICAgICAgICAgICAgICBnYjIzMTIgICAgICAgICAgICAgICAgICAgICAgICAgIGdiaworICogQTFBNCAgICAgICAgIFUrMzBGQiBLQVRBS0FOQSBNSURETEUgRE9UICAgICAgVSswMEI3IE1JRERMRSBET1QKKyAqIEExQUEgICAgICAgICBVKzIwMTUgSE9SSVpPTlRBTCBCQVIgICAgICAgICAgIFUrMjAxNCBFTSBEQVNICisgKiBBODQ0ICAgICAgICAgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICBVKzIwMTUgSE9SSVpPTlRBTCBCQVIKICAqLwogCiAjZGVmaW5lIEdCS19ERUNPREUoZGMxLCBkYzIsIGFzc2kpIFwKLQlpZiAoKGRjMSkgPT0gMHhhMSAmJiAoZGMyKSA9PSAweGFhKSAoYXNzaSkgPSAweDIwMTQ7IFwKLQllbHNlIGlmICgoZGMxKSA9PSAweGE4ICYmIChkYzIpID09IDB4NDQpIChhc3NpKSA9IDB4MjAxNTsgXAotCWVsc2UgaWYgKChkYzEpID09IDB4YTEgJiYgKGRjMikgPT0gMHhhNCkgKGFzc2kpID0gMHgwMGI3OyBcCi0JZWxzZSBUUllNQVBfREVDKGdiMjMxMiwgYXNzaSwgZGMxIF4gMHg4MCwgZGMyIF4gMHg4MCk7IFwKLQllbHNlIFRSWU1BUF9ERUMoZ2JrZXh0LCBhc3NpLCBkYzEsIGRjMik7CisgICAgaWYgKChkYzEpID09IDB4YTEgJiYgKGRjMikgPT0gMHhhYSkgKGFzc2kpID0gMHgyMDE0OyBcCisgICAgZWxzZSBpZiAoKGRjMSkgPT0gMHhhOCAmJiAoZGMyKSA9PSAweDQ0KSAoYXNzaSkgPSAweDIwMTU7IFwKKyAgICBlbHNlIGlmICgoZGMxKSA9PSAweGExICYmIChkYzIpID09IDB4YTQpIChhc3NpKSA9IDB4MDBiNzsgXAorICAgIGVsc2UgVFJZTUFQX0RFQyhnYjIzMTIsIGFzc2ksIGRjMSBeIDB4ODAsIGRjMiBeIDB4ODApOyBcCisgICAgZWxzZSBUUllNQVBfREVDKGdia2V4dCwgYXNzaSwgZGMxLCBkYzIpOwogCiAjZGVmaW5lIEdCS19FTkNPREUoY29kZSwgYXNzaSkgXAotCWlmICgoY29kZSkgPT0gMHgyMDE0KSAoYXNzaSkgPSAweGExYWE7IFwKLQllbHNlIGlmICgoY29kZSkgPT0gMHgyMDE1KSAoYXNzaSkgPSAweGE4NDQ7IFwKLQllbHNlIGlmICgoY29kZSkgPT0gMHgwMGI3KSAoYXNzaSkgPSAweGExYTQ7IFwKLQllbHNlIGlmICgoY29kZSkgIT0gMHgzMGZiICYmIFRSWU1BUF9FTkNfQ09ORChnYmNvbW1vbiwgYXNzaSwgY29kZSkpOworICAgIGlmICgoY29kZSkgPT0gMHgyMDE0KSAoYXNzaSkgPSAweGExYWE7IFwKKyAgICBlbHNlIGlmICgoY29kZSkgPT0gMHgyMDE1KSAoYXNzaSkgPSAweGE4NDQ7IFwKKyAgICBlbHNlIGlmICgoY29kZSkgPT0gMHgwMGI3KSAoYXNzaSkgPSAweGExYTQ7IFwKKyAgICBlbHNlIGlmICgoY29kZSkgIT0gMHgzMGZiICYmIFRSWU1BUF9FTkNfQ09ORChnYmNvbW1vbiwgYXNzaSwgY29kZSkpOwogCiAvKgogICogR0IyMzEyIGNvZGVjCkBAIC00Miw1MyArNDIsNTMgQEAKIAogRU5DT0RFUihnYjIzMTIpCiB7Ci0Jd2hpbGUgKGlubGVmdCA+IDApIHsKLQkJUHlfVU5JQ09ERSBjID0gSU4xOwotCQlEQkNIQVIgY29kZTsKKyAgICB3aGlsZSAoaW5sZWZ0ID4gMCkgeworICAgICAgICBQeV9VTklDT0RFIGMgPSBJTjE7CisgICAgICAgIERCQ0hBUiBjb2RlOwogCi0JCWlmIChjIDwgMHg4MCkgewotCQkJV1JJVEUxKCh1bnNpZ25lZCBjaGFyKWMpCi0JCQlORVhUKDEsIDEpCi0JCQljb250aW51ZTsKLQkJfQotCQlVQ1M0SU5WQUxJRChjKQorICAgICAgICBpZiAoYyA8IDB4ODApIHsKKyAgICAgICAgICAgIFdSSVRFMSgodW5zaWduZWQgY2hhciljKQorICAgICAgICAgICAgTkVYVCgxLCAxKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgVUNTNElOVkFMSUQoYykKIAotCQlSRVFVSVJFX09VVEJVRigyKQotCQlUUllNQVBfRU5DKGdiY29tbW9uLCBjb2RlLCBjKTsKLQkJZWxzZSByZXR1cm4gMTsKKyAgICAgICAgUkVRVUlSRV9PVVRCVUYoMikKKyAgICAgICAgVFJZTUFQX0VOQyhnYmNvbW1vbiwgY29kZSwgYyk7CisgICAgICAgIGVsc2UgcmV0dXJuIDE7CiAKLQkJaWYgKGNvZGUgJiAweDgwMDApIC8qIE1TQiBzZXQ6IEdCSyAqLwotCQkJcmV0dXJuIDE7CisgICAgICAgIGlmIChjb2RlICYgMHg4MDAwKSAvKiBNU0Igc2V0OiBHQksgKi8KKyAgICAgICAgICAgIHJldHVybiAxOwogCi0JCU9VVDEoKGNvZGUgPj4gOCkgfCAweDgwKQotCQlPVVQyKChjb2RlICYgMHhGRikgfCAweDgwKQotCQlORVhUKDEsIDIpCi0JfQorICAgICAgICBPVVQxKChjb2RlID4+IDgpIHwgMHg4MCkKKyAgICAgICAgT1VUMigoY29kZSAmIDB4RkYpIHwgMHg4MCkKKyAgICAgICAgTkVYVCgxLCAyKQorICAgIH0KIAotCXJldHVybiAwOworICAgIHJldHVybiAwOwogfQogCiBERUNPREVSKGdiMjMxMikKIHsKLQl3aGlsZSAoaW5sZWZ0ID4gMCkgewotCQl1bnNpZ25lZCBjaGFyIGMgPSAqKmluYnVmOworICAgIHdoaWxlIChpbmxlZnQgPiAwKSB7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgYyA9ICoqaW5idWY7CiAKLQkJUkVRVUlSRV9PVVRCVUYoMSkKKyAgICAgICAgUkVRVUlSRV9PVVRCVUYoMSkKIAotCQlpZiAoYyA8IDB4ODApIHsKLQkJCU9VVDEoYykKLQkJCU5FWFQoMSwgMSkKLQkJCWNvbnRpbnVlOwotCQl9CisgICAgICAgIGlmIChjIDwgMHg4MCkgeworICAgICAgICAgICAgT1VUMShjKQorICAgICAgICAgICAgTkVYVCgxLCAxKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KIAotCQlSRVFVSVJFX0lOQlVGKDIpCi0JCVRSWU1BUF9ERUMoZ2IyMzEyLCAqKm91dGJ1ZiwgYyBeIDB4ODAsIElOMiBeIDB4ODApIHsKLQkJCU5FWFQoMiwgMSkKLQkJfQotCQllbHNlIHJldHVybiAyOwotCX0KKyAgICAgICAgUkVRVUlSRV9JTkJVRigyKQorICAgICAgICBUUllNQVBfREVDKGdiMjMxMiwgKipvdXRidWYsIGMgXiAweDgwLCBJTjIgXiAweDgwKSB7CisgICAgICAgICAgICBORVhUKDIsIDEpCisgICAgICAgIH0KKyAgICAgICAgZWxzZSByZXR1cm4gMjsKKyAgICB9CiAKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKIH0KIAogCkBAIC05OCw1NSArOTgsNTUgQEAKIAogRU5DT0RFUihnYmspCiB7Ci0Jd2hpbGUgKGlubGVmdCA+IDApIHsKLQkJUHlfVU5JQ09ERSBjID0gSU4xOwotCQlEQkNIQVIgY29kZTsKKyAgICB3aGlsZSAoaW5sZWZ0ID4gMCkgeworICAgICAgICBQeV9VTklDT0RFIGMgPSBJTjE7CisgICAgICAgIERCQ0hBUiBjb2RlOwogCi0JCWlmIChjIDwgMHg4MCkgewotCQkJV1JJVEUxKCh1bnNpZ25lZCBjaGFyKWMpCi0JCQlORVhUKDEsIDEpCi0JCQljb250aW51ZTsKLQkJfQotCQlVQ1M0SU5WQUxJRChjKQorICAgICAgICBpZiAoYyA8IDB4ODApIHsKKyAgICAgICAgICAgIFdSSVRFMSgodW5zaWduZWQgY2hhciljKQorICAgICAgICAgICAgTkVYVCgxLCAxKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgVUNTNElOVkFMSUQoYykKIAotCQlSRVFVSVJFX09VVEJVRigyKQorICAgICAgICBSRVFVSVJFX09VVEJVRigyKQogCi0JCUdCS19FTkNPREUoYywgY29kZSkKLQkJZWxzZSByZXR1cm4gMTsKKyAgICAgICAgR0JLX0VOQ09ERShjLCBjb2RlKQorICAgICAgICBlbHNlIHJldHVybiAxOwogCi0JCU9VVDEoKGNvZGUgPj4gOCkgfCAweDgwKQotCQlpZiAoY29kZSAmIDB4ODAwMCkKLQkJCU9VVDIoKGNvZGUgJiAweEZGKSkgLyogTVNCIHNldDogR0JLICovCi0JCWVsc2UKLQkJCU9VVDIoKGNvZGUgJiAweEZGKSB8IDB4ODApIC8qIE1TQiB1bnNldDogR0IyMzEyICovCi0JCU5FWFQoMSwgMikKLQl9CisgICAgICAgIE9VVDEoKGNvZGUgPj4gOCkgfCAweDgwKQorICAgICAgICBpZiAoY29kZSAmIDB4ODAwMCkKKyAgICAgICAgICAgIE9VVDIoKGNvZGUgJiAweEZGKSkgLyogTVNCIHNldDogR0JLICovCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIE9VVDIoKGNvZGUgJiAweEZGKSB8IDB4ODApIC8qIE1TQiB1bnNldDogR0IyMzEyICovCisgICAgICAgIE5FWFQoMSwgMikKKyAgICB9CiAKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKIH0KIAogREVDT0RFUihnYmspCiB7Ci0Jd2hpbGUgKGlubGVmdCA+IDApIHsKLQkJdW5zaWduZWQgY2hhciBjID0gSU4xOworICAgIHdoaWxlIChpbmxlZnQgPiAwKSB7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgYyA9IElOMTsKIAotCQlSRVFVSVJFX09VVEJVRigxKQorICAgICAgICBSRVFVSVJFX09VVEJVRigxKQogCi0JCWlmIChjIDwgMHg4MCkgewotCQkJT1VUMShjKQotCQkJTkVYVCgxLCAxKQotCQkJY29udGludWU7Ci0JCX0KKyAgICAgICAgaWYgKGMgPCAweDgwKSB7CisgICAgICAgICAgICBPVVQxKGMpCisgICAgICAgICAgICBORVhUKDEsIDEpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQogCi0JCVJFUVVJUkVfSU5CVUYoMikKKyAgICAgICAgUkVRVUlSRV9JTkJVRigyKQogCi0JCUdCS19ERUNPREUoYywgSU4yLCAqKm91dGJ1ZikKLQkJZWxzZSByZXR1cm4gMjsKKyAgICAgICAgR0JLX0RFQ09ERShjLCBJTjIsICoqb3V0YnVmKQorICAgICAgICBlbHNlIHJldHVybiAyOwogCi0JCU5FWFQoMiwgMSkKLQl9CisgICAgICAgIE5FWFQoMiwgMSkKKyAgICB9CiAKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKIH0KIAogCkBAIC0xNTYsMTUzICsxNTYsMTUzIEBACiAKIEVOQ09ERVIoZ2IxODAzMCkKIHsKLQl3aGlsZSAoaW5sZWZ0ID4gMCkgewotCQl1Y3M0X3QgYyA9IElOMTsKLQkJREJDSEFSIGNvZGU7CisgICAgd2hpbGUgKGlubGVmdCA+IDApIHsKKyAgICAgICAgdWNzNF90IGMgPSBJTjE7CisgICAgICAgIERCQ0hBUiBjb2RlOwogCi0JCWlmIChjIDwgMHg4MCkgewotCQkJV1JJVEUxKGMpCi0JCQlORVhUKDEsIDEpCi0JCQljb250aW51ZTsKLQkJfQorICAgICAgICBpZiAoYyA8IDB4ODApIHsKKyAgICAgICAgICAgIFdSSVRFMShjKQorICAgICAgICAgICAgTkVYVCgxLCAxKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KIAotCQlERUNPREVfU1VSUk9HQVRFKGMpCi0JCWlmIChjID4gMHgxMEZGRkYpCisgICAgICAgIERFQ09ERV9TVVJST0dBVEUoYykKKyAgICAgICAgaWYgKGMgPiAweDEwRkZGRikKICNpZiBQeV9VTklDT0RFX1NJWkUgPT0gMgotCQkJcmV0dXJuIDI7IC8qIHN1cnJvZ2F0ZXMgcGFpciAqLworICAgICAgICAgICAgcmV0dXJuIDI7IC8qIHN1cnJvZ2F0ZXMgcGFpciAqLwogI2Vsc2UKLQkJCXJldHVybiAxOworICAgICAgICAgICAgcmV0dXJuIDE7CiAjZW5kaWYKLQkJZWxzZSBpZiAoYyA+PSAweDEwMDAwKSB7Ci0JCQl1Y3M0X3QgdGMgPSBjIC0gMHgxMDAwMDsKKyAgICAgICAgZWxzZSBpZiAoYyA+PSAweDEwMDAwKSB7CisgICAgICAgICAgICB1Y3M0X3QgdGMgPSBjIC0gMHgxMDAwMDsKIAotCQkJUkVRVUlSRV9PVVRCVUYoNCkKKyAgICAgICAgICAgIFJFUVVJUkVfT1VUQlVGKDQpCiAKLQkJCU9VVDQoKHVuc2lnbmVkIGNoYXIpKHRjICUgMTApICsgMHgzMCkKLQkJCXRjIC89IDEwOwotCQkJT1VUMygodW5zaWduZWQgY2hhcikodGMgJSAxMjYpICsgMHg4MSkKLQkJCXRjIC89IDEyNjsKLQkJCU9VVDIoKHVuc2lnbmVkIGNoYXIpKHRjICUgMTApICsgMHgzMCkKLQkJCXRjIC89IDEwOwotCQkJT1VUMSgodW5zaWduZWQgY2hhcikodGMgKyAweDkwKSkKKyAgICAgICAgICAgIE9VVDQoKHVuc2lnbmVkIGNoYXIpKHRjICUgMTApICsgMHgzMCkKKyAgICAgICAgICAgIHRjIC89IDEwOworICAgICAgICAgICAgT1VUMygodW5zaWduZWQgY2hhcikodGMgJSAxMjYpICsgMHg4MSkKKyAgICAgICAgICAgIHRjIC89IDEyNjsKKyAgICAgICAgICAgIE9VVDIoKHVuc2lnbmVkIGNoYXIpKHRjICUgMTApICsgMHgzMCkKKyAgICAgICAgICAgIHRjIC89IDEwOworICAgICAgICAgICAgT1VUMSgodW5zaWduZWQgY2hhcikodGMgKyAweDkwKSkKIAogI2lmIFB5X1VOSUNPREVfU0laRSA9PSAyCi0JCQlORVhUKDIsIDQpIC8qIHN1cnJvZ2F0ZXMgcGFpciAqLworICAgICAgICAgICAgTkVYVCgyLCA0KSAvKiBzdXJyb2dhdGVzIHBhaXIgKi8KICNlbHNlCi0JCQlORVhUKDEsIDQpCisgICAgICAgICAgICBORVhUKDEsIDQpCiAjZW5kaWYKLQkJCWNvbnRpbnVlOwotCQl9CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQogCi0JCVJFUVVJUkVfT1VUQlVGKDIpCisgICAgICAgIFJFUVVJUkVfT1VUQlVGKDIpCiAKLQkJR0JLX0VOQ09ERShjLCBjb2RlKQotCQllbHNlIFRSWU1BUF9FTkMoZ2IxODAzMGV4dCwgY29kZSwgYyk7Ci0JCWVsc2UgewotCQkJY29uc3Qgc3RydWN0IF9nYjE4MDMwX3RvX3VuaWJtcF9yYW5nZXMgKnV0cnJhbmdlOworICAgICAgICBHQktfRU5DT0RFKGMsIGNvZGUpCisgICAgICAgIGVsc2UgVFJZTUFQX0VOQyhnYjE4MDMwZXh0LCBjb2RlLCBjKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgX2diMTgwMzBfdG9fdW5pYm1wX3JhbmdlcyAqdXRycmFuZ2U7CiAKLQkJCVJFUVVJUkVfT1VUQlVGKDQpCisgICAgICAgICAgICBSRVFVSVJFX09VVEJVRig0KQogCi0JCQlmb3IgKHV0cnJhbmdlID0gZ2IxODAzMF90b191bmlibXBfcmFuZ2VzOwotCQkJICAgICB1dHJyYW5nZS0+Zmlyc3QgIT0gMDsKLQkJCSAgICAgdXRycmFuZ2UrKykKLQkJCQlpZiAodXRycmFuZ2UtPmZpcnN0IDw9IGMgJiYKLQkJCQkgICAgYyA8PSB1dHJyYW5nZS0+bGFzdCkgewotCQkJCQlQeV9VTklDT0RFIHRjOworICAgICAgICAgICAgZm9yICh1dHJyYW5nZSA9IGdiMTgwMzBfdG9fdW5pYm1wX3JhbmdlczsKKyAgICAgICAgICAgICAgICAgdXRycmFuZ2UtPmZpcnN0ICE9IDA7CisgICAgICAgICAgICAgICAgIHV0cnJhbmdlKyspCisgICAgICAgICAgICAgICAgaWYgKHV0cnJhbmdlLT5maXJzdCA8PSBjICYmCisgICAgICAgICAgICAgICAgICAgIGMgPD0gdXRycmFuZ2UtPmxhc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgUHlfVU5JQ09ERSB0YzsKIAotCQkJCQl0YyA9IGMgLSB1dHJyYW5nZS0+Zmlyc3QgKwotCQkJCQkgICAgIHV0cnJhbmdlLT5iYXNlOworICAgICAgICAgICAgICAgICAgICB0YyA9IGMgLSB1dHJyYW5nZS0+Zmlyc3QgKworICAgICAgICAgICAgICAgICAgICAgICAgIHV0cnJhbmdlLT5iYXNlOwogCi0JCQkJCU9VVDQoKHVuc2lnbmVkIGNoYXIpKHRjICUgMTApICsgMHgzMCkKLQkJCQkJdGMgLz0gMTA7Ci0JCQkJCU9VVDMoKHVuc2lnbmVkIGNoYXIpKHRjICUgMTI2KSArIDB4ODEpCi0JCQkJCXRjIC89IDEyNjsKLQkJCQkJT1VUMigodW5zaWduZWQgY2hhcikodGMgJSAxMCkgKyAweDMwKQotCQkJCQl0YyAvPSAxMDsKLQkJCQkJT1VUMSgodW5zaWduZWQgY2hhcil0YyArIDB4ODEpCisgICAgICAgICAgICAgICAgICAgIE9VVDQoKHVuc2lnbmVkIGNoYXIpKHRjICUgMTApICsgMHgzMCkKKyAgICAgICAgICAgICAgICAgICAgdGMgLz0gMTA7CisgICAgICAgICAgICAgICAgICAgIE9VVDMoKHVuc2lnbmVkIGNoYXIpKHRjICUgMTI2KSArIDB4ODEpCisgICAgICAgICAgICAgICAgICAgIHRjIC89IDEyNjsKKyAgICAgICAgICAgICAgICAgICAgT1VUMigodW5zaWduZWQgY2hhcikodGMgJSAxMCkgKyAweDMwKQorICAgICAgICAgICAgICAgICAgICB0YyAvPSAxMDsKKyAgICAgICAgICAgICAgICAgICAgT1VUMSgodW5zaWduZWQgY2hhcil0YyArIDB4ODEpCiAKLQkJCQkJTkVYVCgxLCA0KQotCQkJCQlicmVhazsKLQkJCQl9CisgICAgICAgICAgICAgICAgICAgIE5FWFQoMSwgNCkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQogCi0JCQlpZiAodXRycmFuZ2UtPmZpcnN0ID09IDApCi0JCQkJcmV0dXJuIDE7Ci0JCQljb250aW51ZTsKLQkJfQorICAgICAgICAgICAgaWYgKHV0cnJhbmdlLT5maXJzdCA9PSAwKQorICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KIAotCQlPVVQxKChjb2RlID4+IDgpIHwgMHg4MCkKLQkJaWYgKGNvZGUgJiAweDgwMDApCi0JCQlPVVQyKChjb2RlICYgMHhGRikpIC8qIE1TQiBzZXQ6IEdCSyBvciBHQjE4MDMwZXh0ICovCi0JCWVsc2UKLQkJCU9VVDIoKGNvZGUgJiAweEZGKSB8IDB4ODApIC8qIE1TQiB1bnNldDogR0IyMzEyICovCisgICAgICAgIE9VVDEoKGNvZGUgPj4gOCkgfCAweDgwKQorICAgICAgICBpZiAoY29kZSAmIDB4ODAwMCkKKyAgICAgICAgICAgIE9VVDIoKGNvZGUgJiAweEZGKSkgLyogTVNCIHNldDogR0JLIG9yIEdCMTgwMzBleHQgKi8KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgT1VUMigoY29kZSAmIDB4RkYpIHwgMHg4MCkgLyogTVNCIHVuc2V0OiBHQjIzMTIgKi8KIAotCQlORVhUKDEsIDIpCi0JfQorICAgICAgICBORVhUKDEsIDIpCisgICAgfQogCi0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiB9CiAKIERFQ09ERVIoZ2IxODAzMCkKIHsKLQl3aGlsZSAoaW5sZWZ0ID4gMCkgewotCQl1bnNpZ25lZCBjaGFyIGMgPSBJTjEsIGMyOworICAgIHdoaWxlIChpbmxlZnQgPiAwKSB7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgYyA9IElOMSwgYzI7CiAKLQkJUkVRVUlSRV9PVVRCVUYoMSkKKyAgICAgICAgUkVRVUlSRV9PVVRCVUYoMSkKIAotCQlpZiAoYyA8IDB4ODApIHsKLQkJCU9VVDEoYykKLQkJCU5FWFQoMSwgMSkKLQkJCWNvbnRpbnVlOwotCQl9CisgICAgICAgIGlmIChjIDwgMHg4MCkgeworICAgICAgICAgICAgT1VUMShjKQorICAgICAgICAgICAgTkVYVCgxLCAxKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KIAotCQlSRVFVSVJFX0lOQlVGKDIpCisgICAgICAgIFJFUVVJUkVfSU5CVUYoMikKIAotCQljMiA9IElOMjsKLQkJaWYgKGMyID49IDB4MzAgJiYgYzIgPD0gMHgzOSkgeyAvKiA0IGJ5dGVzIHNlcSAqLwotCQkJY29uc3Qgc3RydWN0IF9nYjE4MDMwX3RvX3VuaWJtcF9yYW5nZXMgKnV0cjsKLQkJCXVuc2lnbmVkIGNoYXIgYzMsIGM0OwotCQkJdWNzNF90IGxzZXE7CisgICAgICAgIGMyID0gSU4yOworICAgICAgICBpZiAoYzIgPj0gMHgzMCAmJiBjMiA8PSAweDM5KSB7IC8qIDQgYnl0ZXMgc2VxICovCisgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgX2diMTgwMzBfdG9fdW5pYm1wX3JhbmdlcyAqdXRyOworICAgICAgICAgICAgdW5zaWduZWQgY2hhciBjMywgYzQ7CisgICAgICAgICAgICB1Y3M0X3QgbHNlcTsKIAotCQkJUkVRVUlSRV9JTkJVRig0KQotCQkJYzMgPSBJTjM7Ci0JCQljNCA9IElONDsKLQkJCWlmIChjIDwgMHg4MSB8fCBjMyA8IDB4ODEgfHwgYzQgPCAweDMwIHx8IGM0ID4gMHgzOSkKLQkJCQlyZXR1cm4gNDsKLQkJCWMgLT0gMHg4MTsgIGMyIC09IDB4MzA7Ci0JCQljMyAtPSAweDgxOyBjNCAtPSAweDMwOworICAgICAgICAgICAgUkVRVUlSRV9JTkJVRig0KQorICAgICAgICAgICAgYzMgPSBJTjM7CisgICAgICAgICAgICBjNCA9IElONDsKKyAgICAgICAgICAgIGlmIChjIDwgMHg4MSB8fCBjMyA8IDB4ODEgfHwgYzQgPCAweDMwIHx8IGM0ID4gMHgzOSkKKyAgICAgICAgICAgICAgICByZXR1cm4gNDsKKyAgICAgICAgICAgIGMgLT0gMHg4MTsgIGMyIC09IDB4MzA7CisgICAgICAgICAgICBjMyAtPSAweDgxOyBjNCAtPSAweDMwOwogCi0JCQlpZiAoYyA8IDQpIHsgLyogVSswMDgwIC0gVStGRkZGICovCi0JCQkJbHNlcSA9ICgodWNzNF90KWMgKiAxMCArIGMyKSAqIDEyNjAgKwotCQkJCQkodWNzNF90KWMzICogMTAgKyBjNDsKLQkJCQlpZiAobHNlcSA8IDM5NDIwKSB7Ci0JCQkJCWZvciAodXRyID0gZ2IxODAzMF90b191bmlibXBfcmFuZ2VzOwotCQkJCQkgICAgIGxzZXEgPj0gKHV0ciArIDEpLT5iYXNlOwotCQkJCQkgICAgIHV0cisrKSA7Ci0JCQkJCU9VVDEodXRyLT5maXJzdCAtIHV0ci0+YmFzZSArIGxzZXEpCi0JCQkJCU5FWFQoNCwgMSkKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoYyA+PSAxNSkgeyAvKiBVKzEwMDAwIC0gVSsxMEZGRkYgKi8KLQkJCQlsc2VxID0gMHgxMDAwMCArICgoKHVjczRfdCljLTE1KSAqIDEwICsgYzIpCi0JCQkJCSogMTI2MCArICh1Y3M0X3QpYzMgKiAxMCArIGM0OwotCQkJCWlmIChsc2VxIDw9IDB4MTBGRkZGKSB7Ci0JCQkJCVdSSVRFVUNTNChsc2VxKTsKLQkJCQkJTkVYVF9JTig0KQotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gNDsKLQkJfQorICAgICAgICAgICAgaWYgKGMgPCA0KSB7IC8qIFUrMDA4MCAtIFUrRkZGRiAqLworICAgICAgICAgICAgICAgIGxzZXEgPSAoKHVjczRfdCljICogMTAgKyBjMikgKiAxMjYwICsKKyAgICAgICAgICAgICAgICAgICAgKHVjczRfdCljMyAqIDEwICsgYzQ7CisgICAgICAgICAgICAgICAgaWYgKGxzZXEgPCAzOTQyMCkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKHV0ciA9IGdiMTgwMzBfdG9fdW5pYm1wX3JhbmdlczsKKyAgICAgICAgICAgICAgICAgICAgICAgICBsc2VxID49ICh1dHIgKyAxKS0+YmFzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICB1dHIrKykgOworICAgICAgICAgICAgICAgICAgICBPVVQxKHV0ci0+Zmlyc3QgLSB1dHItPmJhc2UgKyBsc2VxKQorICAgICAgICAgICAgICAgICAgICBORVhUKDQsIDEpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGMgPj0gMTUpIHsgLyogVSsxMDAwMCAtIFUrMTBGRkZGICovCisgICAgICAgICAgICAgICAgbHNlcSA9IDB4MTAwMDAgKyAoKCh1Y3M0X3QpYy0xNSkgKiAxMCArIGMyKQorICAgICAgICAgICAgICAgICAgICAqIDEyNjAgKyAodWNzNF90KWMzICogMTAgKyBjNDsKKyAgICAgICAgICAgICAgICBpZiAobHNlcSA8PSAweDEwRkZGRikgeworICAgICAgICAgICAgICAgICAgICBXUklURVVDUzQobHNlcSk7CisgICAgICAgICAgICAgICAgICAgIE5FWFRfSU4oNCkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIDQ7CisgICAgICAgIH0KIAotCQlHQktfREVDT0RFKGMsIGMyLCAqKm91dGJ1ZikKLQkJZWxzZSBUUllNQVBfREVDKGdiMTgwMzBleHQsICoqb3V0YnVmLCBjLCBjMik7Ci0JCWVsc2UgcmV0dXJuIDI7CisgICAgICAgIEdCS19ERUNPREUoYywgYzIsICoqb3V0YnVmKQorICAgICAgICBlbHNlIFRSWU1BUF9ERUMoZ2IxODAzMGV4dCwgKipvdXRidWYsIGMsIGMyKTsKKyAgICAgICAgZWxzZSByZXR1cm4gMjsKIAotCQlORVhUKDIsIDEpCi0JfQorICAgICAgICBORVhUKDIsIDEpCisgICAgfQogCi0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiB9CiAKIApAQCAtMzEyLDExOCArMzEyLDExOCBAQAogCiBFTkNPREVSX0lOSVQoaHopCiB7Ci0Jc3RhdGUtPmkgPSAwOwotCXJldHVybiAwOworICAgIHN0YXRlLT5pID0gMDsKKyAgICByZXR1cm4gMDsKIH0KIAogRU5DT0RFUl9SRVNFVChoeikKIHsKLQlpZiAoc3RhdGUtPmkgIT0gMCkgewotCQlXUklURTIoJ34nLCAnfScpCi0JCXN0YXRlLT5pID0gMDsKLQkJTkVYVF9PVVQoMikKLQl9Ci0JcmV0dXJuIDA7CisgICAgaWYgKHN0YXRlLT5pICE9IDApIHsKKyAgICAgICAgV1JJVEUyKCd+JywgJ30nKQorICAgICAgICBzdGF0ZS0+aSA9IDA7CisgICAgICAgIE5FWFRfT1VUKDIpCisgICAgfQorICAgIHJldHVybiAwOwogfQogCiBFTkNPREVSKGh6KQogewotCXdoaWxlIChpbmxlZnQgPiAwKSB7Ci0JCVB5X1VOSUNPREUgYyA9IElOMTsKLQkJREJDSEFSIGNvZGU7CisgICAgd2hpbGUgKGlubGVmdCA+IDApIHsKKyAgICAgICAgUHlfVU5JQ09ERSBjID0gSU4xOworICAgICAgICBEQkNIQVIgY29kZTsKIAotCQlpZiAoYyA8IDB4ODApIHsKLQkJCWlmIChzdGF0ZS0+aSA9PSAwKSB7Ci0JCQkJV1JJVEUxKCh1bnNpZ25lZCBjaGFyKWMpCi0JCQkJTkVYVCgxLCAxKQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJV1JJVEUzKCd+JywgJ30nLCAodW5zaWduZWQgY2hhciljKQotCQkJCU5FWFQoMSwgMykKLQkJCQlzdGF0ZS0+aSA9IDA7Ci0JCQl9Ci0JCQljb250aW51ZTsKLQkJfQorICAgICAgICBpZiAoYyA8IDB4ODApIHsKKyAgICAgICAgICAgIGlmIChzdGF0ZS0+aSA9PSAwKSB7CisgICAgICAgICAgICAgICAgV1JJVEUxKCh1bnNpZ25lZCBjaGFyKWMpCisgICAgICAgICAgICAgICAgTkVYVCgxLCAxKQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgV1JJVEUzKCd+JywgJ30nLCAodW5zaWduZWQgY2hhciljKQorICAgICAgICAgICAgICAgIE5FWFQoMSwgMykKKyAgICAgICAgICAgICAgICBzdGF0ZS0+aSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQogCi0JCVVDUzRJTlZBTElEKGMpCisgICAgICAgIFVDUzRJTlZBTElEKGMpCiAKLQkJVFJZTUFQX0VOQyhnYmNvbW1vbiwgY29kZSwgYyk7Ci0JCWVsc2UgcmV0dXJuIDE7CisgICAgICAgIFRSWU1BUF9FTkMoZ2Jjb21tb24sIGNvZGUsIGMpOworICAgICAgICBlbHNlIHJldHVybiAxOwogCi0JCWlmIChjb2RlICYgMHg4MDAwKSAvKiBNU0Igc2V0OiBHQksgKi8KLQkJCXJldHVybiAxOworICAgICAgICBpZiAoY29kZSAmIDB4ODAwMCkgLyogTVNCIHNldDogR0JLICovCisgICAgICAgICAgICByZXR1cm4gMTsKIAotCQlpZiAoc3RhdGUtPmkgPT0gMCkgewotCQkJV1JJVEU0KCd+JywgJ3snLCBjb2RlID4+IDgsIGNvZGUgJiAweGZmKQotCQkJTkVYVCgxLCA0KQotCQkJc3RhdGUtPmkgPSAxOwotCQl9Ci0JCWVsc2UgewotCQkJV1JJVEUyKGNvZGUgPj4gOCwgY29kZSAmIDB4ZmYpCi0JCQlORVhUKDEsIDIpCi0JCX0KLQl9CisgICAgICAgIGlmIChzdGF0ZS0+aSA9PSAwKSB7CisgICAgICAgICAgICBXUklURTQoJ34nLCAneycsIGNvZGUgPj4gOCwgY29kZSAmIDB4ZmYpCisgICAgICAgICAgICBORVhUKDEsIDQpCisgICAgICAgICAgICBzdGF0ZS0+aSA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBXUklURTIoY29kZSA+PiA4LCBjb2RlICYgMHhmZikKKyAgICAgICAgICAgIE5FWFQoMSwgMikKKyAgICAgICAgfQorICAgIH0KIAotCXJldHVybiAwOworICAgIHJldHVybiAwOwogfQogCiBERUNPREVSX0lOSVQoaHopCiB7Ci0Jc3RhdGUtPmkgPSAwOwotCXJldHVybiAwOworICAgIHN0YXRlLT5pID0gMDsKKyAgICByZXR1cm4gMDsKIH0KIAogREVDT0RFUl9SRVNFVChoeikKIHsKLQlzdGF0ZS0+aSA9IDA7Ci0JcmV0dXJuIDA7CisgICAgc3RhdGUtPmkgPSAwOworICAgIHJldHVybiAwOwogfQogCiBERUNPREVSKGh6KQogewotCXdoaWxlIChpbmxlZnQgPiAwKSB7Ci0JCXVuc2lnbmVkIGNoYXIgYyA9IElOMTsKKyAgICB3aGlsZSAoaW5sZWZ0ID4gMCkgeworICAgICAgICB1bnNpZ25lZCBjaGFyIGMgPSBJTjE7CiAKLQkJaWYgKGMgPT0gJ34nKSB7Ci0JCQl1bnNpZ25lZCBjaGFyIGMyID0gSU4yOworICAgICAgICBpZiAoYyA9PSAnficpIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgYzIgPSBJTjI7CiAKLQkJCVJFUVVJUkVfSU5CVUYoMikKLQkJCWlmIChjMiA9PSAnficpIHsKLQkJCQlXUklURTEoJ34nKQotCQkJCU5FWFQoMiwgMSkKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWVsc2UgaWYgKGMyID09ICd7JyAmJiBzdGF0ZS0+aSA9PSAwKQotCQkJCXN0YXRlLT5pID0gMTsgLyogc2V0IEdCICovCi0JCQllbHNlIGlmIChjMiA9PSAnfScgJiYgc3RhdGUtPmkgPT0gMSkKLQkJCQlzdGF0ZS0+aSA9IDA7IC8qIHNldCBBU0NJSSAqLwotCQkJZWxzZSBpZiAoYzIgPT0gJ1xuJykKLQkJCQk7IC8qIGxpbmUtY29udGludWF0aW9uICovCi0JCQllbHNlCi0JCQkJcmV0dXJuIDI7Ci0JCQlORVhUKDIsIDApOwotCQkJY29udGludWU7Ci0JCX0KKyAgICAgICAgICAgIFJFUVVJUkVfSU5CVUYoMikKKyAgICAgICAgICAgIGlmIChjMiA9PSAnficpIHsKKyAgICAgICAgICAgICAgICBXUklURTEoJ34nKQorICAgICAgICAgICAgICAgIE5FWFQoMiwgMSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGMyID09ICd7JyAmJiBzdGF0ZS0+aSA9PSAwKQorICAgICAgICAgICAgICAgIHN0YXRlLT5pID0gMTsgLyogc2V0IEdCICovCisgICAgICAgICAgICBlbHNlIGlmIChjMiA9PSAnfScgJiYgc3RhdGUtPmkgPT0gMSkKKyAgICAgICAgICAgICAgICBzdGF0ZS0+aSA9IDA7IC8qIHNldCBBU0NJSSAqLworICAgICAgICAgICAgZWxzZSBpZiAoYzIgPT0gJ1xuJykKKyAgICAgICAgICAgICAgICA7IC8qIGxpbmUtY29udGludWF0aW9uICovCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIDI7CisgICAgICAgICAgICBORVhUKDIsIDApOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KIAotCQlpZiAoYyAmIDB4ODApCi0JCQlyZXR1cm4gMTsKKyAgICAgICAgaWYgKGMgJiAweDgwKQorICAgICAgICAgICAgcmV0dXJuIDE7CiAKLQkJaWYgKHN0YXRlLT5pID09IDApIHsgLyogQVNDSUkgbW9kZSAqLwotCQkJV1JJVEUxKGMpCi0JCQlORVhUKDEsIDEpCi0JCX0KLQkJZWxzZSB7IC8qIEdCIG1vZGUgKi8KLQkJCVJFUVVJUkVfSU5CVUYoMikKLQkJCVJFUVVJUkVfT1VUQlVGKDEpCi0JCQlUUllNQVBfREVDKGdiMjMxMiwgKipvdXRidWYsIGMsIElOMikgewotCQkJCU5FWFQoMiwgMSkKLQkJCX0KLQkJCWVsc2UKLQkJCQlyZXR1cm4gMjsKLQkJfQotCX0KKyAgICAgICAgaWYgKHN0YXRlLT5pID09IDApIHsgLyogQVNDSUkgbW9kZSAqLworICAgICAgICAgICAgV1JJVEUxKGMpCisgICAgICAgICAgICBORVhUKDEsIDEpCisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7IC8qIEdCIG1vZGUgKi8KKyAgICAgICAgICAgIFJFUVVJUkVfSU5CVUYoMikKKyAgICAgICAgICAgIFJFUVVJUkVfT1VUQlVGKDEpCisgICAgICAgICAgICBUUllNQVBfREVDKGdiMjMxMiwgKipvdXRidWYsIGMsIElOMikgeworICAgICAgICAgICAgICAgIE5FWFQoMiwgMSkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gMjsKKyAgICAgICAgfQorICAgIH0KIAotCXJldHVybiAwOworICAgIHJldHVybiAwOwogfQogCiAKZGlmZiAtLWdpdCBhL01vZHVsZXMvY2prY29kZWNzL19jb2RlY3NfaGsuYyBiL01vZHVsZXMvY2prY29kZWNzL19jb2RlY3NfaGsuYwppbmRleCA0YmJkNjIyLi5hYWYxMDNkIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2Nqa2NvZGVjcy9fY29kZWNzX2hrLmMKKysrIGIvTW9kdWxlcy9jamtjb2RlY3MvX2NvZGVjc19oay5jCkBAIC0xOCwxMiArMTgsMTIgQEAKIAogQ09ERUNfSU5JVChiaWc1aGtzY3MpCiB7Ci0Jc3RhdGljIGludCBpbml0aWFsaXplZCA9IDA7CisgICAgc3RhdGljIGludCBpbml0aWFsaXplZCA9IDA7CiAKLQlpZiAoIWluaXRpYWxpemVkICYmIElNUE9SVF9NQVAodHcsIGJpZzUsICZiaWc1X2VuY21hcCwgJmJpZzVfZGVjbWFwKSkKLQkJcmV0dXJuIC0xOwotCWluaXRpYWxpemVkID0gMTsKLQlyZXR1cm4gMDsKKyAgICBpZiAoIWluaXRpYWxpemVkICYmIElNUE9SVF9NQVAodHcsIGJpZzUsICZiaWc1X2VuY21hcCwgJmJpZzVfZGVjbWFwKSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGluaXRpYWxpemVkID0gMTsKKyAgICByZXR1cm4gMDsKIH0KIAogLyoKQEAgLTM4LDEzNSArMzgsMTM1IEBACiAKIEVOQ09ERVIoYmlnNWhrc2NzKQogewotCXdoaWxlIChpbmxlZnQgPiAwKSB7Ci0JCXVjczRfdCBjID0gKippbmJ1ZjsKLQkJREJDSEFSIGNvZGU7Ci0JCVB5X3NzaXplX3QgaW5zaXplOworICAgIHdoaWxlIChpbmxlZnQgPiAwKSB7CisgICAgICAgIHVjczRfdCBjID0gKippbmJ1ZjsKKyAgICAgICAgREJDSEFSIGNvZGU7CisgICAgICAgIFB5X3NzaXplX3QgaW5zaXplOwogCi0JCWlmIChjIDwgMHg4MCkgewotCQkJUkVRVUlSRV9PVVRCVUYoMSkKLQkJCSoqb3V0YnVmID0gKHVuc2lnbmVkIGNoYXIpYzsKLQkJCU5FWFQoMSwgMSkKLQkJCWNvbnRpbnVlOwotCQl9CisgICAgICAgIGlmIChjIDwgMHg4MCkgeworICAgICAgICAgICAgUkVRVUlSRV9PVVRCVUYoMSkKKyAgICAgICAgICAgICoqb3V0YnVmID0gKHVuc2lnbmVkIGNoYXIpYzsKKyAgICAgICAgICAgIE5FWFQoMSwgMSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CiAKLQkJREVDT0RFX1NVUlJPR0FURShjKQotCQlpbnNpemUgPSBHRVRfSU5TSVpFKGMpOworICAgICAgICBERUNPREVfU1VSUk9HQVRFKGMpCisgICAgICAgIGluc2l6ZSA9IEdFVF9JTlNJWkUoYyk7CiAKLQkJUkVRVUlSRV9PVVRCVUYoMikKKyAgICAgICAgUkVRVUlSRV9PVVRCVUYoMikKIAotCQlpZiAoYyA8IDB4MTAwMDApIHsKLQkJCVRSWU1BUF9FTkMoYmlnNWhrc2NzX2JtcCwgY29kZSwgYykgewotCQkJCWlmIChjb2RlID09IE1VTFRJQykgewotCQkJCQlpZiAoaW5sZWZ0ID49IDIgJiYKLQkJCQkJICAgICgoYyAmIDB4ZmZkZikgPT0gMHgwMGNhKSAmJgotCQkJCQkgICAgKCgoKmluYnVmKVsxXSAmIDB4ZmZmNykgPT0gMHgwMzA0KSkgewotCQkJCQkJY29kZSA9IGJpZzVoa3Njc19wYWlyZW5jX3RhYmxlWwotCQkJCQkJCSgoYyA+PiA0KSB8Ci0JCQkJCQkJICgoKmluYnVmKVsxXSA+PiAzKSkgJiAzXTsKLQkJCQkJCWluc2l6ZSA9IDI7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoaW5sZWZ0IDwgMiAmJgotCQkJCQkJICEoZmxhZ3MgJiBNQkVOQ19GTFVTSCkpCi0JCQkJCQlyZXR1cm4gTUJFUlJfVE9PRkVXOwotCQkJCQllbHNlIHsKLQkJCQkJCWlmIChjID09IDB4Y2EpCi0JCQkJCQkJY29kZSA9IDB4ODg2NjsKLQkJCQkJCWVsc2UgLyogYyA9PSAweGVhICovCi0JCQkJCQkJY29kZSA9IDB4ODhhNzsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UgVFJZTUFQX0VOQyhiaWc1LCBjb2RlLCBjKTsKLQkJCWVsc2UgcmV0dXJuIDE7Ci0JCX0KLQkJZWxzZSBpZiAoYyA8IDB4MjAwMDApCi0JCQlyZXR1cm4gaW5zaXplOwotCQllbHNlIGlmIChjIDwgMHgzMDAwMCkgewotCQkJVFJZTUFQX0VOQyhiaWc1aGtzY3Nfbm9uYm1wLCBjb2RlLCBjICYgMHhmZmZmKTsKLQkJCWVsc2UgcmV0dXJuIGluc2l6ZTsKLQkJfQotCQllbHNlCi0JCQlyZXR1cm4gaW5zaXplOworICAgICAgICBpZiAoYyA8IDB4MTAwMDApIHsKKyAgICAgICAgICAgIFRSWU1BUF9FTkMoYmlnNWhrc2NzX2JtcCwgY29kZSwgYykgeworICAgICAgICAgICAgICAgIGlmIChjb2RlID09IE1VTFRJQykgeworICAgICAgICAgICAgICAgICAgICBpZiAoaW5sZWZ0ID49IDIgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICgoYyAmIDB4ZmZkZikgPT0gMHgwMGNhKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKCgoKmluYnVmKVsxXSAmIDB4ZmZmNykgPT0gMHgwMzA0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IGJpZzVoa3Njc19wYWlyZW5jX3RhYmxlWworICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoYyA+PiA0KSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKmluYnVmKVsxXSA+PiAzKSkgJiAzXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluc2l6ZSA9IDI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaW5sZWZ0IDwgMiAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhKGZsYWdzICYgTUJFTkNfRkxVU0gpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE1CRVJSX1RPT0ZFVzsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PSAweGNhKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSAweDg4NjY7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIC8qIGMgPT0gMHhlYSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSAweDg4YTc7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIFRSWU1BUF9FTkMoYmlnNSwgY29kZSwgYyk7CisgICAgICAgICAgICBlbHNlIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGMgPCAweDIwMDAwKQorICAgICAgICAgICAgcmV0dXJuIGluc2l6ZTsKKyAgICAgICAgZWxzZSBpZiAoYyA8IDB4MzAwMDApIHsKKyAgICAgICAgICAgIFRSWU1BUF9FTkMoYmlnNWhrc2NzX25vbmJtcCwgY29kZSwgYyAmIDB4ZmZmZik7CisgICAgICAgICAgICBlbHNlIHJldHVybiBpbnNpemU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIGluc2l6ZTsKIAotCQlPVVQxKGNvZGUgPj4gOCkKLQkJT1VUMihjb2RlICYgMHhGRikKLQkJTkVYVChpbnNpemUsIDIpCi0JfQorICAgICAgICBPVVQxKGNvZGUgPj4gOCkKKyAgICAgICAgT1VUMihjb2RlICYgMHhGRikKKyAgICAgICAgTkVYVChpbnNpemUsIDIpCisgICAgfQogCi0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiB9CiAKICNkZWZpbmUgQkgyUyhjMSwgYzIpICgoKGMxKSAtIDB4ODcpICogKDB4ZmUgLSAweDQwICsgMSkgKyAoKGMyKSAtIDB4NDApKQogCiBERUNPREVSKGJpZzVoa3NjcykKIHsKLQl3aGlsZSAoaW5sZWZ0ID4gMCkgewotCQl1bnNpZ25lZCBjaGFyIGMgPSBJTjE7Ci0JCXVjczRfdCBkZWNvZGVkOworICAgIHdoaWxlIChpbmxlZnQgPiAwKSB7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgYyA9IElOMTsKKyAgICAgICAgdWNzNF90IGRlY29kZWQ7CiAKLQkJUkVRVUlSRV9PVVRCVUYoMSkKKyAgICAgICAgUkVRVUlSRV9PVVRCVUYoMSkKIAotCQlpZiAoYyA8IDB4ODApIHsKLQkJCU9VVDEoYykKLQkJCU5FWFQoMSwgMSkKLQkJCWNvbnRpbnVlOwotCQl9CisgICAgICAgIGlmIChjIDwgMHg4MCkgeworICAgICAgICAgICAgT1VUMShjKQorICAgICAgICAgICAgTkVYVCgxLCAxKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KIAotCQlSRVFVSVJFX0lOQlVGKDIpCisgICAgICAgIFJFUVVJUkVfSU5CVUYoMikKIAotCQlpZiAoMHhjNiA8PSBjICYmIGMgPD0gMHhjOCAmJiAoYyA+PSAweGM3IHx8IElOMiA+PSAweGExKSkKLQkJCWdvdG8gaGtzY3NkZWM7CisgICAgICAgIGlmICgweGM2IDw9IGMgJiYgYyA8PSAweGM4ICYmIChjID49IDB4YzcgfHwgSU4yID49IDB4YTEpKQorICAgICAgICAgICAgZ290byBoa3Njc2RlYzsKIAotCQlUUllNQVBfREVDKGJpZzUsICoqb3V0YnVmLCBjLCBJTjIpIHsKLQkJCU5FWFQoMiwgMSkKLQkJfQotCQllbHNlCi1oa3Njc2RlYzoJVFJZTUFQX0RFQyhiaWc1aGtzY3MsIGRlY29kZWQsIGMsIElOMikgewotCQkJaW50IHMgPSBCSDJTKGMsIElOMik7Ci0JCQljb25zdCB1bnNpZ25lZCBjaGFyICpoaW50YmFzZTsKKyAgICAgICAgVFJZTUFQX0RFQyhiaWc1LCAqKm91dGJ1ZiwgYywgSU4yKSB7CisgICAgICAgICAgICBORVhUKDIsIDEpCisgICAgICAgIH0KKyAgICAgICAgZWxzZQoraGtzY3NkZWM6ICAgICAgIFRSWU1BUF9ERUMoYmlnNWhrc2NzLCBkZWNvZGVkLCBjLCBJTjIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBzID0gQkgyUyhjLCBJTjIpOworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqaGludGJhc2U7CiAKLQkJCWFzc2VydCgweDg3IDw9IGMgJiYgYyA8PSAweGZlKTsKLQkJCWFzc2VydCgweDQwIDw9IElOMiAmJiBJTjIgPD0gMHhmZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQoMHg4NyA8PSBjICYmIGMgPD0gMHhmZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQoMHg0MCA8PSBJTjIgJiYgSU4yIDw9IDB4ZmUpOwogCi0JCQlpZiAoQkgyUygweDg3LCAweDQwKSA8PSBzICYmIHMgPD0gQkgyUygweGEwLCAweGZlKSkgewotCQkJCWhpbnRiYXNlID0gYmlnNWhrc2NzX3BoaW50XzA7Ci0JCQkJcyAtPSBCSDJTKDB4ODcsIDB4NDApOwotCQkJfQotCQkJZWxzZSBpZiAoQkgyUygweGM2LDB4YTEpIDw9IHMgJiYgcyA8PSBCSDJTKDB4YzgsMHhmZSkpewotCQkJCWhpbnRiYXNlID0gYmlnNWhrc2NzX3BoaW50XzEyMTMwOwotCQkJCXMgLT0gQkgyUygweGM2LCAweGExKTsKLQkJCX0KLQkJCWVsc2UgaWYgKEJIMlMoMHhmOSwweGQ2KSA8PSBzICYmIHMgPD0gQkgyUygweGZlLDB4ZmUpKXsKLQkJCQloaW50YmFzZSA9IGJpZzVoa3Njc19waGludF8yMTkyNDsKLQkJCQlzIC09IEJIMlMoMHhmOSwgMHhkNik7Ci0JCQl9Ci0JCQllbHNlCi0JCQkJcmV0dXJuIE1CRVJSX0lOVEVSTkFMOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEJIMlMoMHg4NywgMHg0MCkgPD0gcyAmJiBzIDw9IEJIMlMoMHhhMCwgMHhmZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGludGJhc2UgPSBiaWc1aGtzY3NfcGhpbnRfMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyAtPSBCSDJTKDB4ODcsIDB4NDApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoQkgyUygweGM2LDB4YTEpIDw9IHMgJiYgcyA8PSBCSDJTKDB4YzgsMHhmZSkpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaW50YmFzZSA9IGJpZzVoa3Njc19waGludF8xMjEzMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyAtPSBCSDJTKDB4YzYsIDB4YTEpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoQkgyUygweGY5LDB4ZDYpIDw9IHMgJiYgcyA8PSBCSDJTKDB4ZmUsMHhmZSkpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaW50YmFzZSA9IGJpZzVoa3Njc19waGludF8yMTkyNDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyAtPSBCSDJTKDB4ZjksIDB4ZDYpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTUJFUlJfSU5URVJOQUw7CiAKLQkJCWlmIChoaW50YmFzZVtzID4+IDNdICYgKDEgPDwgKHMgJiA3KSkpIHsKLQkJCQlXUklURVVDUzQoZGVjb2RlZCB8IDB4MjAwMDApCi0JCQkJTkVYVF9JTigyKQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJT1VUMShkZWNvZGVkKQotCQkJCU5FWFQoMiwgMSkKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXN3aXRjaCAoKGMgPDwgOCkgfCBJTjIpIHsKLQkJCWNhc2UgMHg4ODYyOiBXUklURTIoMHgwMGNhLCAweDAzMDQpOyBicmVhazsKLQkJCWNhc2UgMHg4ODY0OiBXUklURTIoMHgwMGNhLCAweDAzMGMpOyBicmVhazsKLQkJCWNhc2UgMHg4OGEzOiBXUklURTIoMHgwMGVhLCAweDAzMDQpOyBicmVhazsKLQkJCWNhc2UgMHg4OGE1OiBXUklURTIoMHgwMGVhLCAweDAzMGMpOyBicmVhazsKLQkJCWRlZmF1bHQ6IHJldHVybiAyOwotCQkJfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhpbnRiYXNlW3MgPj4gM10gJiAoMSA8PCAocyAmIDcpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklURVVDUzQoZGVjb2RlZCB8IDB4MjAwMDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FWFRfSU4oMikKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPVVQxKGRlY29kZWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FWFQoMiwgMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKChjIDw8IDgpIHwgSU4yKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDB4ODg2MjogV1JJVEUyKDB4MDBjYSwgMHgwMzA0KTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDB4ODg2NDogV1JJVEUyKDB4MDBjYSwgMHgwMzBjKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDB4ODhhMzogV1JJVEUyKDB4MDBlYSwgMHgwMzA0KTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDB4ODhhNTogV1JJVEUyKDB4MDBlYSwgMHgwMzBjKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiByZXR1cm4gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KIAotCQkJTkVYVCgyLCAyKSAvKiBhbGwgZGVjb2RlZCBjb2RlcG9pbnRzIGFyZSBwYWlycywgYWJvdmUuICovCi0JCX0KLQl9CisgICAgICAgICAgICAgICAgICAgICAgICBORVhUKDIsIDIpIC8qIGFsbCBkZWNvZGVkIGNvZGVwb2ludHMgYXJlIHBhaXJzLCBhYm92ZS4gKi8KKyAgICAgICAgfQorICAgIH0KIAotCXJldHVybiAwOworICAgIHJldHVybiAwOwogfQogCiAKZGlmZiAtLWdpdCBhL01vZHVsZXMvY2prY29kZWNzL19jb2RlY3NfaXNvMjAyMi5jIGIvTW9kdWxlcy9jamtjb2RlY3MvX2NvZGVjc19pc28yMDIyLmMKaW5kZXggOWNlN2I3NS4uMjVjMWEzNiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9jamtjb2RlY3MvX2NvZGVjc19pc28yMDIyLmMKKysrIGIvTW9kdWxlcy9jamtjb2RlY3MvX2NvZGVjc19pc28yMDIyLmMKQEAgLTE5LDg1ICsxOSw4NSBAQAogCiAgICBzdGF0ZS0+Y1swLTNdCiAKLQkwMDAwMDAwMAotCXx8Xl5eXl58Ci0JfCstLS0tLSstLS0tICBHMC0zIENoYXJhY3RlciBTZXQKLQkrLS0tLS0tLS0tLS0gIElzIEcwLTMgZG91YmxlIGJ5dGU/CisgICAgMDAwMDAwMDAKKyAgICB8fF5eXl5efAorICAgIHwrLS0tLS0rLS0tLSAgRzAtMyBDaGFyYWN0ZXIgU2V0CisgICAgKy0tLS0tLS0tLS0tICBJcyBHMC0zIGRvdWJsZSBieXRlPwogCiAgICBzdGF0ZS0+Y1s0XQogCi0JMDAwMDAwMDAKLQkgICAgICB8fAotCSAgICAgIHwrLS0tLSAgTG9ja2VkLVNoaWZ0PwotCSAgICAgICstLS0tLSAgRVNDIFRocm91Z2hvdXQKKyAgICAwMDAwMDAwMAorICAgICAgICAgIHx8CisgICAgICAgICAgfCstLS0tICBMb2NrZWQtU2hpZnQ/CisgICAgICAgICAgKy0tLS0tICBFU0MgVGhyb3VnaG91dAogKi8KIAotI2RlZmluZSBFU0MJCQkweDFCCi0jZGVmaW5lIFNPCQkJMHgwRQotI2RlZmluZSBTSQkJCTB4MEYKLSNkZWZpbmUgTEYJCQkweDBBCisjZGVmaW5lIEVTQyAgICAgICAgICAgICAgICAgICAgIDB4MUIKKyNkZWZpbmUgU08gICAgICAgICAgICAgICAgICAgICAgMHgwRQorI2RlZmluZSBTSSAgICAgICAgICAgICAgICAgICAgICAweDBGCisjZGVmaW5lIExGICAgICAgICAgICAgICAgICAgICAgIDB4MEEKIAotI2RlZmluZSBNQVhfRVNDU0VRTEVOCQkxNgorI2RlZmluZSBNQVhfRVNDU0VRTEVOICAgICAgICAgICAxNgogCi0jZGVmaW5lIENIQVJTRVRfSVNPODg1OV8xCSdBJwotI2RlZmluZSBDSEFSU0VUX0FTQ0lJCQknQicKLSNkZWZpbmUgQ0hBUlNFVF9JU084ODU5XzcJJ0YnCi0jZGVmaW5lIENIQVJTRVRfSklTWDAyMDFfSwknSScKLSNkZWZpbmUgQ0hBUlNFVF9KSVNYMDIwMV9SCSdKJworI2RlZmluZSBDSEFSU0VUX0lTTzg4NTlfMSAgICAgICAnQScKKyNkZWZpbmUgQ0hBUlNFVF9BU0NJSSAgICAgICAgICAgJ0InCisjZGVmaW5lIENIQVJTRVRfSVNPODg1OV83ICAgICAgICdGJworI2RlZmluZSBDSEFSU0VUX0pJU1gwMjAxX0sgICAgICAnSScKKyNkZWZpbmUgQ0hBUlNFVF9KSVNYMDIwMV9SICAgICAgJ0onCiAKLSNkZWZpbmUgQ0hBUlNFVF9HQjIzMTIJCSgnQSd8Q0hBUlNFVF9EQkNTKQotI2RlZmluZSBDSEFSU0VUX0pJU1gwMjA4CSgnQid8Q0hBUlNFVF9EQkNTKQotI2RlZmluZSBDSEFSU0VUX0tTWDEwMDEJCSgnQyd8Q0hBUlNFVF9EQkNTKQotI2RlZmluZSBDSEFSU0VUX0pJU1gwMjEyCSgnRCd8Q0hBUlNFVF9EQkNTKQotI2RlZmluZSBDSEFSU0VUX0dCMjMxMl84NTY1CSgnRSd8Q0hBUlNFVF9EQkNTKQotI2RlZmluZSBDSEFSU0VUX0NOUzExNjQzXzEJKCdHJ3xDSEFSU0VUX0RCQ1MpCi0jZGVmaW5lIENIQVJTRVRfQ05TMTE2NDNfMgkoJ0gnfENIQVJTRVRfREJDUykKLSNkZWZpbmUgQ0hBUlNFVF9KSVNYMDIxM18yMDAwXzEJKCdPJ3xDSEFSU0VUX0RCQ1MpCi0jZGVmaW5lIENIQVJTRVRfSklTWDAyMTNfMgkoJ1AnfENIQVJTRVRfREJDUykKLSNkZWZpbmUgQ0hBUlNFVF9KSVNYMDIxM18yMDA0XzEJKCdRJ3xDSEFSU0VUX0RCQ1MpCi0jZGVmaW5lIENIQVJTRVRfSklTWDAyMDhfTwkoJ0AnfENIQVJTRVRfREJDUykKKyNkZWZpbmUgQ0hBUlNFVF9HQjIzMTIgICAgICAgICAgKCdBJ3xDSEFSU0VUX0RCQ1MpCisjZGVmaW5lIENIQVJTRVRfSklTWDAyMDggICAgICAgICgnQid8Q0hBUlNFVF9EQkNTKQorI2RlZmluZSBDSEFSU0VUX0tTWDEwMDEgICAgICAgICAoJ0MnfENIQVJTRVRfREJDUykKKyNkZWZpbmUgQ0hBUlNFVF9KSVNYMDIxMiAgICAgICAgKCdEJ3xDSEFSU0VUX0RCQ1MpCisjZGVmaW5lIENIQVJTRVRfR0IyMzEyXzg1NjUgICAgICgnRSd8Q0hBUlNFVF9EQkNTKQorI2RlZmluZSBDSEFSU0VUX0NOUzExNjQzXzEgICAgICAoJ0cnfENIQVJTRVRfREJDUykKKyNkZWZpbmUgQ0hBUlNFVF9DTlMxMTY0M18yICAgICAgKCdIJ3xDSEFSU0VUX0RCQ1MpCisjZGVmaW5lIENIQVJTRVRfSklTWDAyMTNfMjAwMF8xICgnTyd8Q0hBUlNFVF9EQkNTKQorI2RlZmluZSBDSEFSU0VUX0pJU1gwMjEzXzIgICAgICAoJ1AnfENIQVJTRVRfREJDUykKKyNkZWZpbmUgQ0hBUlNFVF9KSVNYMDIxM18yMDA0XzEgKCdRJ3xDSEFSU0VUX0RCQ1MpCisjZGVmaW5lIENIQVJTRVRfSklTWDAyMDhfTyAgICAgICgnQCd8Q0hBUlNFVF9EQkNTKQogCi0jZGVmaW5lIENIQVJTRVRfREJDUwkJMHg4MAotI2RlZmluZSBFU0NNQVJLKG1hcmspCQkoKG1hcmspICYgMHg3ZikKKyNkZWZpbmUgQ0hBUlNFVF9EQkNTICAgICAgICAgICAgMHg4MAorI2RlZmluZSBFU0NNQVJLKG1hcmspICAgICAgICAgICAoKG1hcmspICYgMHg3ZikKIAotI2RlZmluZSBJU19FU0NFTkQoYykJKCgoYykgPj0gJ0EnICYmIChjKSA8PSAnWicpIHx8IChjKSA9PSAnQCcpCisjZGVmaW5lIElTX0VTQ0VORChjKSAgICAoKChjKSA+PSAnQScgJiYgKGMpIDw9ICdaJykgfHwgKGMpID09ICdAJykKICNkZWZpbmUgSVNfSVNPMjAyMkVTQyhjMikgXAotCQkoKGMyKSA9PSAnKCcgfHwgKGMyKSA9PSAnKScgfHwgKGMyKSA9PSAnJCcgfHwgXAotCQkgKGMyKSA9PSAnLicgfHwgKGMyKSA9PSAnJicpCi0JLyogdGhpcyBpcyBub3QgYSBjb21wbGV0ZSBsaXN0IG9mIElTTy0yMDIyIGVzY2FwZSBzZXF1ZW5jZSBoZWFkZXJzLgotCSAqIGJ1dCwgaXQncyBlbm91Z2ggdG8gaW1wbGVtZW50IENKSyBpbnN0YW5jZXMgb2YgaXNvLTIwMjIuICovCisgICAgICAgICgoYzIpID09ICcoJyB8fCAoYzIpID09ICcpJyB8fCAoYzIpID09ICckJyB8fCBcCisgICAgICAgICAoYzIpID09ICcuJyB8fCAoYzIpID09ICcmJykKKyAgICAvKiB0aGlzIGlzIG5vdCBhIGNvbXBsZXRlIGxpc3Qgb2YgSVNPLTIwMjIgZXNjYXBlIHNlcXVlbmNlIGhlYWRlcnMuCisgICAgICogYnV0LCBpdCdzIGVub3VnaCB0byBpbXBsZW1lbnQgQ0pLIGluc3RhbmNlcyBvZiBpc28tMjAyMi4gKi8KIAotI2RlZmluZSBNQVBfVU5NQVBQQUJMRQkJMHhGRkZGCi0jZGVmaW5lIE1BUF9NVUxUSVBMRV9BVkFJTAkweEZGRkUgLyogZm9yIEpJUyBYIDAyMTMgKi8KKyNkZWZpbmUgTUFQX1VOTUFQUEFCTEUgICAgICAgICAgMHhGRkZGCisjZGVmaW5lIE1BUF9NVUxUSVBMRV9BVkFJTCAgICAgIDB4RkZGRSAvKiBmb3IgSklTIFggMDIxMyAqLwogCi0jZGVmaW5lIEZfU0hJRlRFRAkJMHgwMQotI2RlZmluZSBGX0VTQ1RIUk9VR0hPVVQJCTB4MDIKKyNkZWZpbmUgRl9TSElGVEVEICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBGX0VTQ1RIUk9VR0hPVVQgICAgICAgICAweDAyCiAKLSNkZWZpbmUgU1RBVEVfU0VURyhkbiwgdikJKChzdGF0ZSktPmNbZG5dKSA9ICh2KTsKLSNkZWZpbmUgU1RBVEVfR0VURyhkbikJCSgoc3RhdGUpLT5jW2RuXSkKKyNkZWZpbmUgU1RBVEVfU0VURyhkbiwgdikgICAgICAgKChzdGF0ZSktPmNbZG5dKSA9ICh2KTsKKyNkZWZpbmUgU1RBVEVfR0VURyhkbikgICAgICAgICAgKChzdGF0ZSktPmNbZG5dKQogCi0jZGVmaW5lIFNUQVRFX0cwCQlTVEFURV9HRVRHKDApCi0jZGVmaW5lIFNUQVRFX0cxCQlTVEFURV9HRVRHKDEpCi0jZGVmaW5lIFNUQVRFX0cyCQlTVEFURV9HRVRHKDIpCi0jZGVmaW5lIFNUQVRFX0czCQlTVEFURV9HRVRHKDMpCi0jZGVmaW5lIFNUQVRFX1NFVEcwKHYpCQlTVEFURV9TRVRHKDAsIHYpCi0jZGVmaW5lIFNUQVRFX1NFVEcxKHYpCQlTVEFURV9TRVRHKDEsIHYpCi0jZGVmaW5lIFNUQVRFX1NFVEcyKHYpCQlTVEFURV9TRVRHKDIsIHYpCi0jZGVmaW5lIFNUQVRFX1NFVEczKHYpCQlTVEFURV9TRVRHKDMsIHYpCisjZGVmaW5lIFNUQVRFX0cwICAgICAgICAgICAgICAgIFNUQVRFX0dFVEcoMCkKKyNkZWZpbmUgU1RBVEVfRzEgICAgICAgICAgICAgICAgU1RBVEVfR0VURygxKQorI2RlZmluZSBTVEFURV9HMiAgICAgICAgICAgICAgICBTVEFURV9HRVRHKDIpCisjZGVmaW5lIFNUQVRFX0czICAgICAgICAgICAgICAgIFNUQVRFX0dFVEcoMykKKyNkZWZpbmUgU1RBVEVfU0VURzAodikgICAgICAgICAgU1RBVEVfU0VURygwLCB2KQorI2RlZmluZSBTVEFURV9TRVRHMSh2KSAgICAgICAgICBTVEFURV9TRVRHKDEsIHYpCisjZGVmaW5lIFNUQVRFX1NFVEcyKHYpICAgICAgICAgIFNUQVRFX1NFVEcoMiwgdikKKyNkZWZpbmUgU1RBVEVfU0VURzModikgICAgICAgICAgU1RBVEVfU0VURygzLCB2KQogCi0jZGVmaW5lIFNUQVRFX1NFVEZMQUcoZikJKChzdGF0ZSktPmNbNF0pIHw9IChmKTsKLSNkZWZpbmUgU1RBVEVfR0VURkxBRyhmKQkoKHN0YXRlKS0+Y1s0XSAmIChmKSkKLSNkZWZpbmUgU1RBVEVfQ0xFQVJGTEFHKGYpCSgoc3RhdGUpLT5jWzRdKSAmPSB+KGYpOwotI2RlZmluZSBTVEFURV9DTEVBUkZMQUdTKCkJKChzdGF0ZSktPmNbNF0pID0gMDsKKyNkZWZpbmUgU1RBVEVfU0VURkxBRyhmKSAgICAgICAgKChzdGF0ZSktPmNbNF0pIHw9IChmKTsKKyNkZWZpbmUgU1RBVEVfR0VURkxBRyhmKSAgICAgICAgKChzdGF0ZSktPmNbNF0gJiAoZikpCisjZGVmaW5lIFNUQVRFX0NMRUFSRkxBRyhmKSAgICAgICgoc3RhdGUpLT5jWzRdKSAmPSB+KGYpOworI2RlZmluZSBTVEFURV9DTEVBUkZMQUdTKCkgICAgICAoKHN0YXRlKS0+Y1s0XSkgPSAwOwogCi0jZGVmaW5lIElTTzIwMjJfQ09ORklHCQkoKGNvbnN0IHN0cnVjdCBpc28yMDIyX2NvbmZpZyAqKWNvbmZpZykKLSNkZWZpbmUgQ09ORklHX0lTU0VUKGZsYWcpCShJU08yMDIyX0NPTkZJRy0+ZmxhZ3MgJiAoZmxhZykpCi0jZGVmaW5lIENPTkZJR19ERVNJR05BVElPTlMJKElTTzIwMjJfQ09ORklHLT5kZXNpZ25hdGlvbnMpCisjZGVmaW5lIElTTzIwMjJfQ09ORklHICAgICAgICAgICgoY29uc3Qgc3RydWN0IGlzbzIwMjJfY29uZmlnICopY29uZmlnKQorI2RlZmluZSBDT05GSUdfSVNTRVQoZmxhZykgICAgICAoSVNPMjAyMl9DT05GSUctPmZsYWdzICYgKGZsYWcpKQorI2RlZmluZSBDT05GSUdfREVTSUdOQVRJT05TICAgICAoSVNPMjAyMl9DT05GSUctPmRlc2lnbmF0aW9ucykKIAogLyogaXNvMjAyMl9jb25maWcuZmxhZ3MgKi8KLSNkZWZpbmUgTk9fU0hJRlQJCTB4MDEKLSNkZWZpbmUgVVNFX0cyCQkJMHgwMgotI2RlZmluZSBVU0VfSklTWDAyMDhfRVhUCTB4MDQKKyNkZWZpbmUgTk9fU0hJRlQgICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBVU0VfRzIgICAgICAgICAgICAgICAgICAweDAyCisjZGVmaW5lIFVTRV9KSVNYMDIwOF9FWFQgICAgICAgIDB4MDQKIAogLyotKi0gaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzIC0qLSovCiAKQEAgLTEwNiw0MzQgKzEwNiw0MzQgQEAKIHR5cGVkZWYgREJDSEFSICgqaXNvMjAyMl9lbmNvZGVfZnVuYykoY29uc3QgdWNzNF90ICpkYXRhLCBQeV9zc2l6ZV90ICpsZW5ndGgpOwogCiBzdHJ1Y3QgaXNvMjAyMl9kZXNpZ25hdGlvbiB7Ci0JdW5zaWduZWQgY2hhciBtYXJrOwotCXVuc2lnbmVkIGNoYXIgcGxhbmU7Ci0JdW5zaWduZWQgY2hhciB3aWR0aDsKLQlpc28yMDIyX2luaXRfZnVuYyBpbml0aWFsaXplcjsKLQlpc28yMDIyX2RlY29kZV9mdW5jIGRlY29kZXI7Ci0JaXNvMjAyMl9lbmNvZGVfZnVuYyBlbmNvZGVyOworICAgIHVuc2lnbmVkIGNoYXIgbWFyazsKKyAgICB1bnNpZ25lZCBjaGFyIHBsYW5lOworICAgIHVuc2lnbmVkIGNoYXIgd2lkdGg7CisgICAgaXNvMjAyMl9pbml0X2Z1bmMgaW5pdGlhbGl6ZXI7CisgICAgaXNvMjAyMl9kZWNvZGVfZnVuYyBkZWNvZGVyOworICAgIGlzbzIwMjJfZW5jb2RlX2Z1bmMgZW5jb2RlcjsKIH07CiAKIHN0cnVjdCBpc28yMDIyX2NvbmZpZyB7Ci0JaW50IGZsYWdzOwotCWNvbnN0IHN0cnVjdCBpc28yMDIyX2Rlc2lnbmF0aW9uICpkZXNpZ25hdGlvbnM7IC8qIG5vbi1hc2NpaSBkZXNpZ3MgKi8KKyAgICBpbnQgZmxhZ3M7CisgICAgY29uc3Qgc3RydWN0IGlzbzIwMjJfZGVzaWduYXRpb24gKmRlc2lnbmF0aW9uczsgLyogbm9uLWFzY2lpIGRlc2lncyAqLwogfTsKIAogLyotKi0gaXNvLTIwMjIgY29kZWMgaW1wbGVtZW50YXRpb24gLSotKi8KIAogQ09ERUNfSU5JVChpc28yMDIyKQogewotCWNvbnN0IHN0cnVjdCBpc28yMDIyX2Rlc2lnbmF0aW9uICpkZXNpZyA9IENPTkZJR19ERVNJR05BVElPTlM7Ci0JZm9yIChkZXNpZyA9IENPTkZJR19ERVNJR05BVElPTlM7IGRlc2lnLT5tYXJrOyBkZXNpZysrKQotCQlpZiAoZGVzaWctPmluaXRpYWxpemVyICE9IE5VTEwgJiYgZGVzaWctPmluaXRpYWxpemVyKCkgIT0gMCkKLQkJCXJldHVybiAtMTsKLQlyZXR1cm4gMDsKKyAgICBjb25zdCBzdHJ1Y3QgaXNvMjAyMl9kZXNpZ25hdGlvbiAqZGVzaWcgPSBDT05GSUdfREVTSUdOQVRJT05TOworICAgIGZvciAoZGVzaWcgPSBDT05GSUdfREVTSUdOQVRJT05TOyBkZXNpZy0+bWFyazsgZGVzaWcrKykKKyAgICAgICAgaWYgKGRlc2lnLT5pbml0aWFsaXplciAhPSBOVUxMICYmIGRlc2lnLT5pbml0aWFsaXplcigpICE9IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgcmV0dXJuIDA7CiB9CiAKIEVOQ09ERVJfSU5JVChpc28yMDIyKQogewotCVNUQVRFX0NMRUFSRkxBR1MoKQotCVNUQVRFX1NFVEcwKENIQVJTRVRfQVNDSUkpCi0JU1RBVEVfU0VURzEoQ0hBUlNFVF9BU0NJSSkKLQlyZXR1cm4gMDsKKyAgICBTVEFURV9DTEVBUkZMQUdTKCkKKyAgICBTVEFURV9TRVRHMChDSEFSU0VUX0FTQ0lJKQorICAgIFNUQVRFX1NFVEcxKENIQVJTRVRfQVNDSUkpCisgICAgcmV0dXJuIDA7CiB9CiAKIEVOQ09ERVJfUkVTRVQoaXNvMjAyMikKIHsKLQlpZiAoU1RBVEVfR0VURkxBRyhGX1NISUZURUQpKSB7Ci0JCVdSSVRFMShTSSkKLQkJTkVYVF9PVVQoMSkKLQkJU1RBVEVfQ0xFQVJGTEFHKEZfU0hJRlRFRCkKLQl9Ci0JaWYgKFNUQVRFX0cwICE9IENIQVJTRVRfQVNDSUkpIHsKLQkJV1JJVEUzKEVTQywgJygnLCAnQicpCi0JCU5FWFRfT1VUKDMpCi0JCVNUQVRFX1NFVEcwKENIQVJTRVRfQVNDSUkpCi0JfQotCXJldHVybiAwOworICAgIGlmIChTVEFURV9HRVRGTEFHKEZfU0hJRlRFRCkpIHsKKyAgICAgICAgV1JJVEUxKFNJKQorICAgICAgICBORVhUX09VVCgxKQorICAgICAgICBTVEFURV9DTEVBUkZMQUcoRl9TSElGVEVEKQorICAgIH0KKyAgICBpZiAoU1RBVEVfRzAgIT0gQ0hBUlNFVF9BU0NJSSkgeworICAgICAgICBXUklURTMoRVNDLCAnKCcsICdCJykKKyAgICAgICAgTkVYVF9PVVQoMykKKyAgICAgICAgU1RBVEVfU0VURzAoQ0hBUlNFVF9BU0NJSSkKKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIEVOQ09ERVIoaXNvMjAyMikKIHsKLQl3aGlsZSAoaW5sZWZ0ID4gMCkgewotCQljb25zdCBzdHJ1Y3QgaXNvMjAyMl9kZXNpZ25hdGlvbiAqZHNnOwotCQlEQkNIQVIgZW5jb2RlZDsKLQkJdWNzNF90IGMgPSAqKmluYnVmOwotCQlQeV9zc2l6ZV90IGluc2l6ZTsKKyAgICB3aGlsZSAoaW5sZWZ0ID4gMCkgeworICAgICAgICBjb25zdCBzdHJ1Y3QgaXNvMjAyMl9kZXNpZ25hdGlvbiAqZHNnOworICAgICAgICBEQkNIQVIgZW5jb2RlZDsKKyAgICAgICAgdWNzNF90IGMgPSAqKmluYnVmOworICAgICAgICBQeV9zc2l6ZV90IGluc2l6ZTsKIAotCQlpZiAoYyA8IDB4ODApIHsKLQkJCWlmIChTVEFURV9HMCAhPSBDSEFSU0VUX0FTQ0lJKSB7Ci0JCQkJV1JJVEUzKEVTQywgJygnLCAnQicpCi0JCQkJU1RBVEVfU0VURzAoQ0hBUlNFVF9BU0NJSSkKLQkJCQlORVhUX09VVCgzKQotCQkJfQotCQkJaWYgKFNUQVRFX0dFVEZMQUcoRl9TSElGVEVEKSkgewotCQkJCVdSSVRFMShTSSkKLQkJCQlTVEFURV9DTEVBUkZMQUcoRl9TSElGVEVEKQotCQkJCU5FWFRfT1VUKDEpCi0JCQl9Ci0JCQlXUklURTEoKHVuc2lnbmVkIGNoYXIpYykKLQkJCU5FWFQoMSwgMSkKLQkJCWNvbnRpbnVlOwotCQl9CisgICAgICAgIGlmIChjIDwgMHg4MCkgeworICAgICAgICAgICAgaWYgKFNUQVRFX0cwICE9IENIQVJTRVRfQVNDSUkpIHsKKyAgICAgICAgICAgICAgICBXUklURTMoRVNDLCAnKCcsICdCJykKKyAgICAgICAgICAgICAgICBTVEFURV9TRVRHMChDSEFSU0VUX0FTQ0lJKQorICAgICAgICAgICAgICAgIE5FWFRfT1VUKDMpCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoU1RBVEVfR0VURkxBRyhGX1NISUZURUQpKSB7CisgICAgICAgICAgICAgICAgV1JJVEUxKFNJKQorICAgICAgICAgICAgICAgIFNUQVRFX0NMRUFSRkxBRyhGX1NISUZURUQpCisgICAgICAgICAgICAgICAgTkVYVF9PVVQoMSkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFdSSVRFMSgodW5zaWduZWQgY2hhciljKQorICAgICAgICAgICAgTkVYVCgxLCAxKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KIAotCQlERUNPREVfU1VSUk9HQVRFKGMpCi0JCWluc2l6ZSA9IEdFVF9JTlNJWkUoYyk7CisgICAgICAgIERFQ09ERV9TVVJST0dBVEUoYykKKyAgICAgICAgaW5zaXplID0gR0VUX0lOU0laRShjKTsKIAotCQllbmNvZGVkID0gTUFQX1VOTUFQUEFCTEU7Ci0JCWZvciAoZHNnID0gQ09ORklHX0RFU0lHTkFUSU9OUzsgZHNnLT5tYXJrOyBkc2crKykgewotCQkJUHlfc3NpemVfdCBsZW5ndGggPSAxOwotCQkJZW5jb2RlZCA9IGRzZy0+ZW5jb2RlcigmYywgJmxlbmd0aCk7Ci0JCQlpZiAoZW5jb2RlZCA9PSBNQVBfTVVMVElQTEVfQVZBSUwpIHsKLQkJCQkvKiB0aGlzIGltcGxlbWVudGF0aW9uIHdvbid0IHdvcmsgZm9yIHBhaXIKLQkJCQkgKiBvZiBub24tYm1wIGNoYXJhY3RlcnMuICovCi0JCQkJaWYgKGlubGVmdCA8IDIpIHsKLQkJCQkJaWYgKCEoZmxhZ3MgJiBNQkVOQ19GTFVTSCkpCi0JCQkJCQlyZXR1cm4gTUJFUlJfVE9PRkVXOwotCQkJCQlsZW5ndGggPSAtMTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCQlsZW5ndGggPSAyOworICAgICAgICBlbmNvZGVkID0gTUFQX1VOTUFQUEFCTEU7CisgICAgICAgIGZvciAoZHNnID0gQ09ORklHX0RFU0lHTkFUSU9OUzsgZHNnLT5tYXJrOyBkc2crKykgeworICAgICAgICAgICAgUHlfc3NpemVfdCBsZW5ndGggPSAxOworICAgICAgICAgICAgZW5jb2RlZCA9IGRzZy0+ZW5jb2RlcigmYywgJmxlbmd0aCk7CisgICAgICAgICAgICBpZiAoZW5jb2RlZCA9PSBNQVBfTVVMVElQTEVfQVZBSUwpIHsKKyAgICAgICAgICAgICAgICAvKiB0aGlzIGltcGxlbWVudGF0aW9uIHdvbid0IHdvcmsgZm9yIHBhaXIKKyAgICAgICAgICAgICAgICAgKiBvZiBub24tYm1wIGNoYXJhY3RlcnMuICovCisgICAgICAgICAgICAgICAgaWYgKGlubGVmdCA8IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCEoZmxhZ3MgJiBNQkVOQ19GTFVTSCkpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTUJFUlJfVE9PRkVXOworICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSAtMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSAyOwogI2lmIFB5X1VOSUNPREVfU0laRSA9PSAyCi0JCQkJaWYgKGxlbmd0aCA9PSAyKSB7Ci0JCQkJCXVjczRfdCB1NGluWzJdOwotCQkJCQl1NGluWzBdID0gKHVjczRfdClJTjE7Ci0JCQkJCXU0aW5bMV0gPSAodWNzNF90KUlOMjsKLQkJCQkJZW5jb2RlZCA9IGRzZy0+ZW5jb2Rlcih1NGluLCAmbGVuZ3RoKTsKLQkJCQl9IGVsc2UKLQkJCQkJZW5jb2RlZCA9IGRzZy0+ZW5jb2RlcigmYywgJmxlbmd0aCk7CisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA9PSAyKSB7CisgICAgICAgICAgICAgICAgICAgIHVjczRfdCB1NGluWzJdOworICAgICAgICAgICAgICAgICAgICB1NGluWzBdID0gKHVjczRfdClJTjE7CisgICAgICAgICAgICAgICAgICAgIHU0aW5bMV0gPSAodWNzNF90KUlOMjsKKyAgICAgICAgICAgICAgICAgICAgZW5jb2RlZCA9IGRzZy0+ZW5jb2Rlcih1NGluLCAmbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgZW5jb2RlZCA9IGRzZy0+ZW5jb2RlcigmYywgJmxlbmd0aCk7CiAjZWxzZQotCQkJCWVuY29kZWQgPSBkc2ctPmVuY29kZXIoJmMsICZsZW5ndGgpOworICAgICAgICAgICAgICAgIGVuY29kZWQgPSBkc2ctPmVuY29kZXIoJmMsICZsZW5ndGgpOwogI2VuZGlmCi0JCQkJaWYgKGVuY29kZWQgIT0gTUFQX1VOTUFQUEFCTEUpIHsKLQkJCQkJaW5zaXplID0gbGVuZ3RoOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChlbmNvZGVkICE9IE1BUF9VTk1BUFBBQkxFKQotCQkJCWJyZWFrOwotCQl9CisgICAgICAgICAgICAgICAgaWYgKGVuY29kZWQgIT0gTUFQX1VOTUFQUEFCTEUpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5zaXplID0gbGVuZ3RoOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChlbmNvZGVkICE9IE1BUF9VTk1BUFBBQkxFKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CiAKLQkJaWYgKCFkc2ctPm1hcmspCi0JCQlyZXR1cm4gMTsKLQkJYXNzZXJ0KGRzZy0+d2lkdGggPT0gMSB8fCBkc2ctPndpZHRoID09IDIpOworICAgICAgICBpZiAoIWRzZy0+bWFyaykKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICBhc3NlcnQoZHNnLT53aWR0aCA9PSAxIHx8IGRzZy0+d2lkdGggPT0gMik7CiAKLQkJc3dpdGNoIChkc2ctPnBsYW5lKSB7Ci0JCWNhc2UgMDogLyogRzAgKi8KLQkJCWlmIChTVEFURV9HRVRGTEFHKEZfU0hJRlRFRCkpIHsKLQkJCQlXUklURTEoU0kpCi0JCQkJU1RBVEVfQ0xFQVJGTEFHKEZfU0hJRlRFRCkKLQkJCQlORVhUX09VVCgxKQotCQkJfQotCQkJaWYgKFNUQVRFX0cwICE9IGRzZy0+bWFyaykgewotCQkJCWlmIChkc2ctPndpZHRoID09IDEpIHsKLQkJCQkJV1JJVEUzKEVTQywgJygnLCBFU0NNQVJLKGRzZy0+bWFyaykpCi0JCQkJCVNUQVRFX1NFVEcwKGRzZy0+bWFyaykKLQkJCQkJTkVYVF9PVVQoMykKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoZHNnLT5tYXJrID09IENIQVJTRVRfSklTWDAyMDgpIHsKLQkJCQkJV1JJVEUzKEVTQywgJyQnLCBFU0NNQVJLKGRzZy0+bWFyaykpCi0JCQkJCVNUQVRFX1NFVEcwKGRzZy0+bWFyaykKLQkJCQkJTkVYVF9PVVQoMykKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCVdSSVRFNChFU0MsICckJywgJygnLAotCQkJCQkJRVNDTUFSSyhkc2ctPm1hcmspKQotCQkJCQlTVEFURV9TRVRHMChkc2ctPm1hcmspCi0JCQkJCU5FWFRfT1VUKDQpCi0JCQkJfQotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgMTogLyogRzEgKi8KLQkJCWlmIChTVEFURV9HMSAhPSBkc2ctPm1hcmspIHsKLQkJCQlpZiAoZHNnLT53aWR0aCA9PSAxKSB7Ci0JCQkJCVdSSVRFMyhFU0MsICcpJywgRVNDTUFSSyhkc2ctPm1hcmspKQotCQkJCQlTVEFURV9TRVRHMShkc2ctPm1hcmspCi0JCQkJCU5FWFRfT1VUKDMpCi0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlXUklURTQoRVNDLCAnJCcsICcpJywKLQkJCQkJCUVTQ01BUksoZHNnLT5tYXJrKSkKLQkJCQkJU1RBVEVfU0VURzEoZHNnLT5tYXJrKQotCQkJCQlORVhUX09VVCg0KQotCQkJCX0KLQkJCX0KLQkJCWlmICghU1RBVEVfR0VURkxBRyhGX1NISUZURUQpKSB7Ci0JCQkJV1JJVEUxKFNPKQotCQkJCVNUQVRFX1NFVEZMQUcoRl9TSElGVEVEKQotCQkJCU5FWFRfT1VUKDEpCi0JCQl9Ci0JCQlicmVhazsKLQkJZGVmYXVsdDogLyogRzIgYW5kIEczIGlzIG5vdCBzdXBwb3J0ZWQ6IG5vIGVuY29kaW5nIGluCi0JCQkgICogQ0pLQ29kZWNzIGFyZSB1c2luZyB0aGVtIHlldCAqLwotCQkJcmV0dXJuIE1CRVJSX0lOVEVSTkFMOwotCQl9CisgICAgICAgIHN3aXRjaCAoZHNnLT5wbGFuZSkgeworICAgICAgICBjYXNlIDA6IC8qIEcwICovCisgICAgICAgICAgICBpZiAoU1RBVEVfR0VURkxBRyhGX1NISUZURUQpKSB7CisgICAgICAgICAgICAgICAgV1JJVEUxKFNJKQorICAgICAgICAgICAgICAgIFNUQVRFX0NMRUFSRkxBRyhGX1NISUZURUQpCisgICAgICAgICAgICAgICAgTkVYVF9PVVQoMSkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChTVEFURV9HMCAhPSBkc2ctPm1hcmspIHsKKyAgICAgICAgICAgICAgICBpZiAoZHNnLT53aWR0aCA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIFdSSVRFMyhFU0MsICcoJywgRVNDTUFSSyhkc2ctPm1hcmspKQorICAgICAgICAgICAgICAgICAgICBTVEFURV9TRVRHMChkc2ctPm1hcmspCisgICAgICAgICAgICAgICAgICAgIE5FWFRfT1VUKDMpCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRzZy0+bWFyayA9PSBDSEFSU0VUX0pJU1gwMjA4KSB7CisgICAgICAgICAgICAgICAgICAgIFdSSVRFMyhFU0MsICckJywgRVNDTUFSSyhkc2ctPm1hcmspKQorICAgICAgICAgICAgICAgICAgICBTVEFURV9TRVRHMChkc2ctPm1hcmspCisgICAgICAgICAgICAgICAgICAgIE5FWFRfT1VUKDMpCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBXUklURTQoRVNDLCAnJCcsICcoJywKKyAgICAgICAgICAgICAgICAgICAgICAgIEVTQ01BUksoZHNnLT5tYXJrKSkKKyAgICAgICAgICAgICAgICAgICAgU1RBVEVfU0VURzAoZHNnLT5tYXJrKQorICAgICAgICAgICAgICAgICAgICBORVhUX09VVCg0KQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6IC8qIEcxICovCisgICAgICAgICAgICBpZiAoU1RBVEVfRzEgIT0gZHNnLT5tYXJrKSB7CisgICAgICAgICAgICAgICAgaWYgKGRzZy0+d2lkdGggPT0gMSkgeworICAgICAgICAgICAgICAgICAgICBXUklURTMoRVNDLCAnKScsIEVTQ01BUksoZHNnLT5tYXJrKSkKKyAgICAgICAgICAgICAgICAgICAgU1RBVEVfU0VURzEoZHNnLT5tYXJrKQorICAgICAgICAgICAgICAgICAgICBORVhUX09VVCgzKQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgV1JJVEU0KEVTQywgJyQnLCAnKScsCisgICAgICAgICAgICAgICAgICAgICAgICBFU0NNQVJLKGRzZy0+bWFyaykpCisgICAgICAgICAgICAgICAgICAgIFNUQVRFX1NFVEcxKGRzZy0+bWFyaykKKyAgICAgICAgICAgICAgICAgICAgTkVYVF9PVVQoNCkKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIVNUQVRFX0dFVEZMQUcoRl9TSElGVEVEKSkgeworICAgICAgICAgICAgICAgIFdSSVRFMShTTykKKyAgICAgICAgICAgICAgICBTVEFURV9TRVRGTEFHKEZfU0hJRlRFRCkKKyAgICAgICAgICAgICAgICBORVhUX09VVCgxKQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IC8qIEcyIGFuZCBHMyBpcyBub3Qgc3VwcG9ydGVkOiBubyBlbmNvZGluZyBpbgorICAgICAgICAgICAgICAgICAgKiBDSktDb2RlY3MgYXJlIHVzaW5nIHRoZW0geWV0ICovCisgICAgICAgICAgICByZXR1cm4gTUJFUlJfSU5URVJOQUw7CisgICAgICAgIH0KIAotCQlpZiAoZHNnLT53aWR0aCA9PSAxKSB7Ci0JCQlXUklURTEoKHVuc2lnbmVkIGNoYXIpZW5jb2RlZCkKLQkJCU5FWFRfT1VUKDEpCi0JCX0KLQkJZWxzZSB7Ci0JCQlXUklURTIoZW5jb2RlZCA+PiA4LCBlbmNvZGVkICYgMHhmZikKLQkJCU5FWFRfT1VUKDIpCi0JCX0KLQkJTkVYVF9JTihpbnNpemUpCi0JfQorICAgICAgICBpZiAoZHNnLT53aWR0aCA9PSAxKSB7CisgICAgICAgICAgICBXUklURTEoKHVuc2lnbmVkIGNoYXIpZW5jb2RlZCkKKyAgICAgICAgICAgIE5FWFRfT1VUKDEpCisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBXUklURTIoZW5jb2RlZCA+PiA4LCBlbmNvZGVkICYgMHhmZikKKyAgICAgICAgICAgIE5FWFRfT1VUKDIpCisgICAgICAgIH0KKyAgICAgICAgTkVYVF9JTihpbnNpemUpCisgICAgfQogCi0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiB9CiAKIERFQ09ERVJfSU5JVChpc28yMDIyKQogewotCVNUQVRFX0NMRUFSRkxBR1MoKQotCVNUQVRFX1NFVEcwKENIQVJTRVRfQVNDSUkpCi0JU1RBVEVfU0VURzEoQ0hBUlNFVF9BU0NJSSkKLQlTVEFURV9TRVRHMihDSEFSU0VUX0FTQ0lJKQotCXJldHVybiAwOworICAgIFNUQVRFX0NMRUFSRkxBR1MoKQorICAgIFNUQVRFX1NFVEcwKENIQVJTRVRfQVNDSUkpCisgICAgU1RBVEVfU0VURzEoQ0hBUlNFVF9BU0NJSSkKKyAgICBTVEFURV9TRVRHMihDSEFSU0VUX0FTQ0lJKQorICAgIHJldHVybiAwOwogfQogCiBERUNPREVSX1JFU0VUKGlzbzIwMjIpCiB7Ci0JU1RBVEVfU0VURzAoQ0hBUlNFVF9BU0NJSSkKLQlTVEFURV9DTEVBUkZMQUcoRl9TSElGVEVEKQotCXJldHVybiAwOworICAgIFNUQVRFX1NFVEcwKENIQVJTRVRfQVNDSUkpCisgICAgU1RBVEVfQ0xFQVJGTEFHKEZfU0hJRlRFRCkKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5X3NzaXplX3QKIGlzbzIwMjJwcm9jZXNzZXNjKGNvbnN0IHZvaWQgKmNvbmZpZywgTXVsdGlieXRlQ29kZWNfU3RhdGUgKnN0YXRlLAotCQkgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKippbmJ1ZiwgUHlfc3NpemVfdCAqaW5sZWZ0KQorICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqKmluYnVmLCBQeV9zc2l6ZV90ICppbmxlZnQpCiB7Ci0JdW5zaWduZWQgY2hhciBjaGFyc2V0LCBkZXNpZ25hdGlvbjsKLQlQeV9zc2l6ZV90IGksIGVzY2xlbjsKKyAgICB1bnNpZ25lZCBjaGFyIGNoYXJzZXQsIGRlc2lnbmF0aW9uOworICAgIFB5X3NzaXplX3QgaSwgZXNjbGVuOwogCi0JZm9yIChpID0gMTtpIDwgTUFYX0VTQ1NFUUxFTjtpKyspIHsKLQkJaWYgKGkgPj0gKmlubGVmdCkKLQkJCXJldHVybiBNQkVSUl9UT09GRVc7Ci0JCWlmIChJU19FU0NFTkQoKCppbmJ1ZilbaV0pKSB7Ci0JCQllc2NsZW4gPSBpICsgMTsKLQkJCWJyZWFrOwotCQl9Ci0JCWVsc2UgaWYgKENPTkZJR19JU1NFVChVU0VfSklTWDAyMDhfRVhUKSAmJiBpKzEgPCAqaW5sZWZ0ICYmCi0JCQkgKCppbmJ1ZilbaV0gPT0gJyYnICYmICgqaW5idWYpW2krMV0gPT0gJ0AnKQotCQkJaSArPSAyOwotCX0KKyAgICBmb3IgKGkgPSAxO2kgPCBNQVhfRVNDU0VRTEVOO2krKykgeworICAgICAgICBpZiAoaSA+PSAqaW5sZWZ0KQorICAgICAgICAgICAgcmV0dXJuIE1CRVJSX1RPT0ZFVzsKKyAgICAgICAgaWYgKElTX0VTQ0VORCgoKmluYnVmKVtpXSkpIHsKKyAgICAgICAgICAgIGVzY2xlbiA9IGkgKyAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoQ09ORklHX0lTU0VUKFVTRV9KSVNYMDIwOF9FWFQpICYmIGkrMSA8ICppbmxlZnQgJiYKKyAgICAgICAgICAgICAgICAgKCppbmJ1ZilbaV0gPT0gJyYnICYmICgqaW5idWYpW2krMV0gPT0gJ0AnKQorICAgICAgICAgICAgaSArPSAyOworICAgIH0KIAotCWlmIChpID49IE1BWF9FU0NTRVFMRU4pCi0JCXJldHVybiAxOyAvKiB1bnRlcm1pbmF0ZWQgZXNjYXBlIHNlcXVlbmNlICovCisgICAgaWYgKGkgPj0gTUFYX0VTQ1NFUUxFTikKKyAgICAgICAgcmV0dXJuIDE7IC8qIHVudGVybWluYXRlZCBlc2NhcGUgc2VxdWVuY2UgKi8KIAotCXN3aXRjaCAoZXNjbGVuKSB7Ci0JY2FzZSAzOgotCQlpZiAoSU4yID09ICckJykgewotCQkJY2hhcnNldCA9IElOMyB8IENIQVJTRVRfREJDUzsKLQkJCWRlc2lnbmF0aW9uID0gMDsKLQkJfQotCQllbHNlIHsKLQkJCWNoYXJzZXQgPSBJTjM7Ci0JCQlpZiAoSU4yID09ICcoJykgZGVzaWduYXRpb24gPSAwOwotCQkJZWxzZSBpZiAoSU4yID09ICcpJykgZGVzaWduYXRpb24gPSAxOwotCQkJZWxzZSBpZiAoQ09ORklHX0lTU0VUKFVTRV9HMikgJiYgSU4yID09ICcuJykKLQkJCQlkZXNpZ25hdGlvbiA9IDI7Ci0JCQllbHNlIHJldHVybiAzOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgNDoKLQkJaWYgKElOMiAhPSAnJCcpCi0JCQlyZXR1cm4gNDsKKyAgICBzd2l0Y2ggKGVzY2xlbikgeworICAgIGNhc2UgMzoKKyAgICAgICAgaWYgKElOMiA9PSAnJCcpIHsKKyAgICAgICAgICAgIGNoYXJzZXQgPSBJTjMgfCBDSEFSU0VUX0RCQ1M7CisgICAgICAgICAgICBkZXNpZ25hdGlvbiA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBjaGFyc2V0ID0gSU4zOworICAgICAgICAgICAgaWYgKElOMiA9PSAnKCcpIGRlc2lnbmF0aW9uID0gMDsKKyAgICAgICAgICAgIGVsc2UgaWYgKElOMiA9PSAnKScpIGRlc2lnbmF0aW9uID0gMTsKKyAgICAgICAgICAgIGVsc2UgaWYgKENPTkZJR19JU1NFVChVU0VfRzIpICYmIElOMiA9PSAnLicpCisgICAgICAgICAgICAgICAgZGVzaWduYXRpb24gPSAyOworICAgICAgICAgICAgZWxzZSByZXR1cm4gMzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDQ6CisgICAgICAgIGlmIChJTjIgIT0gJyQnKQorICAgICAgICAgICAgcmV0dXJuIDQ7CiAKLQkJY2hhcnNldCA9IElONCB8IENIQVJTRVRfREJDUzsKLQkJaWYgKElOMyA9PSAnKCcpIGRlc2lnbmF0aW9uID0gMDsKLQkJZWxzZSBpZiAoSU4zID09ICcpJykgZGVzaWduYXRpb24gPSAxOwotCQllbHNlIHJldHVybiA0OwotCQlicmVhazsKLQljYXNlIDY6IC8qIGRlc2lnbmF0aW9uIHdpdGggcHJlZml4ICovCi0JCWlmIChDT05GSUdfSVNTRVQoVVNFX0pJU1gwMjA4X0VYVCkgJiYKLQkJICAgICgqaW5idWYpWzNdID09IEVTQyAmJiAoKmluYnVmKVs0XSA9PSAnJCcgJiYKLQkJICAgICgqaW5idWYpWzVdID09ICdCJykgewotCQkJY2hhcnNldCA9ICdCJyB8IENIQVJTRVRfREJDUzsKLQkJCWRlc2lnbmF0aW9uID0gMDsKLQkJfQotCQllbHNlCi0JCQlyZXR1cm4gNjsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIGVzY2xlbjsKLQl9CisgICAgICAgIGNoYXJzZXQgPSBJTjQgfCBDSEFSU0VUX0RCQ1M7CisgICAgICAgIGlmIChJTjMgPT0gJygnKSBkZXNpZ25hdGlvbiA9IDA7CisgICAgICAgIGVsc2UgaWYgKElOMyA9PSAnKScpIGRlc2lnbmF0aW9uID0gMTsKKyAgICAgICAgZWxzZSByZXR1cm4gNDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA2OiAvKiBkZXNpZ25hdGlvbiB3aXRoIHByZWZpeCAqLworICAgICAgICBpZiAoQ09ORklHX0lTU0VUKFVTRV9KSVNYMDIwOF9FWFQpICYmCisgICAgICAgICAgICAoKmluYnVmKVszXSA9PSBFU0MgJiYgKCppbmJ1ZilbNF0gPT0gJyQnICYmCisgICAgICAgICAgICAoKmluYnVmKVs1XSA9PSAnQicpIHsKKyAgICAgICAgICAgIGNoYXJzZXQgPSAnQicgfCBDSEFSU0VUX0RCQ1M7CisgICAgICAgICAgICBkZXNpZ25hdGlvbiA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIDY7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBlc2NsZW47CisgICAgfQogCi0JLyogcmFpc2UgZXJyb3Igd2hlbiB0aGUgY2hhcnNldCBpcyBub3QgZGVzaWduYXRlZCBmb3IgdGhpcyBlbmNvZGluZyAqLwotCWlmIChjaGFyc2V0ICE9IENIQVJTRVRfQVNDSUkpIHsKLQkJY29uc3Qgc3RydWN0IGlzbzIwMjJfZGVzaWduYXRpb24gKmRzZzsKKyAgICAvKiByYWlzZSBlcnJvciB3aGVuIHRoZSBjaGFyc2V0IGlzIG5vdCBkZXNpZ25hdGVkIGZvciB0aGlzIGVuY29kaW5nICovCisgICAgaWYgKGNoYXJzZXQgIT0gQ0hBUlNFVF9BU0NJSSkgeworICAgICAgICBjb25zdCBzdHJ1Y3QgaXNvMjAyMl9kZXNpZ25hdGlvbiAqZHNnOwogCi0JCWZvciAoZHNnID0gQ09ORklHX0RFU0lHTkFUSU9OUzsgZHNnLT5tYXJrOyBkc2crKykKLQkJCWlmIChkc2ctPm1hcmsgPT0gY2hhcnNldCkKLQkJCQlicmVhazsKLQkJaWYgKCFkc2ctPm1hcmspCi0JCQlyZXR1cm4gZXNjbGVuOwotCX0KKyAgICAgICAgZm9yIChkc2cgPSBDT05GSUdfREVTSUdOQVRJT05TOyBkc2ctPm1hcms7IGRzZysrKQorICAgICAgICAgICAgaWYgKGRzZy0+bWFyayA9PSBjaGFyc2V0KQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBpZiAoIWRzZy0+bWFyaykKKyAgICAgICAgICAgIHJldHVybiBlc2NsZW47CisgICAgfQogCi0JU1RBVEVfU0VURyhkZXNpZ25hdGlvbiwgY2hhcnNldCkKLQkqaW5sZWZ0IC09IGVzY2xlbjsKLQkoKmluYnVmKSArPSBlc2NsZW47Ci0JcmV0dXJuIDA7CisgICAgU1RBVEVfU0VURyhkZXNpZ25hdGlvbiwgY2hhcnNldCkKKyAgICAqaW5sZWZ0IC09IGVzY2xlbjsKKyAgICAoKmluYnVmKSArPSBlc2NsZW47CisgICAgcmV0dXJuIDA7CiB9CiAKLSNkZWZpbmUgSVNPODg1OV83X0RFQ09ERShjLCBhc3NpKQkJCQkJXAotCWlmICgoYykgPCAweGEwKSAoYXNzaSkgPSAoYyk7CQkJCQlcCi0JZWxzZSBpZiAoKGMpIDwgMHhjMCAmJiAoMHgyODhmM2JjOUwgJiAoMUwgPDwgKChjKS0weGEwKSkpKQlcCi0JCShhc3NpKSA9IChjKTsJCQkJCQlcCi0JZWxzZSBpZiAoKGMpID49IDB4YjQgJiYgKGMpIDw9IDB4ZmUgJiYgKChjKSA+PSAweGQ0IHx8CQlcCi0JCSAoMHhiZmZmZmQ3N0wgJiAoMUwgPDwgKChjKS0weGI0KSkpKSkJCQlcCi0JCShhc3NpKSA9IDB4MDJkMCArIChjKTsJCQkJCVwKLQllbHNlIGlmICgoYykgPT0gMHhhMSkgKGFzc2kpID0gMHgyMDE4OwkJCQlcCi0JZWxzZSBpZiAoKGMpID09IDB4YTIpIChhc3NpKSA9IDB4MjAxOTsJCQkJXAotCWVsc2UgaWYgKChjKSA9PSAweGFmKSAoYXNzaSkgPSAweDIwMTU7CisjZGVmaW5lIElTTzg4NTlfN19ERUNPREUoYywgYXNzaSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKChjKSA8IDB4YTApIChhc3NpKSA9IChjKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZWxzZSBpZiAoKGMpIDwgMHhjMCAmJiAoMHgyODhmM2JjOUwgJiAoMUwgPDwgKChjKS0weGEwKSkpKSAgICAgICAgICBcCisgICAgICAgIChhc3NpKSA9IChjKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZWxzZSBpZiAoKGMpID49IDB4YjQgJiYgKGMpIDw9IDB4ZmUgJiYgKChjKSA+PSAweGQ0IHx8ICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgKDB4YmZmZmZkNzdMICYgKDFMIDw8ICgoYyktMHhiNCkpKSkpICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIChhc3NpKSA9IDB4MDJkMCArIChjKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZWxzZSBpZiAoKGMpID09IDB4YTEpIChhc3NpKSA9IDB4MjAxODsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZWxzZSBpZiAoKGMpID09IDB4YTIpIChhc3NpKSA9IDB4MjAxOTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZWxzZSBpZiAoKGMpID09IDB4YWYpIChhc3NpKSA9IDB4MjAxNTsKIAogc3RhdGljIFB5X3NzaXplX3QKIGlzbzIwMjJwcm9jZXNzZzIoY29uc3Qgdm9pZCAqY29uZmlnLCBNdWx0aWJ5dGVDb2RlY19TdGF0ZSAqc3RhdGUsCi0JCSBjb25zdCB1bnNpZ25lZCBjaGFyICoqaW5idWYsIFB5X3NzaXplX3QgKmlubGVmdCwKLQkJIFB5X1VOSUNPREUgKipvdXRidWYsIFB5X3NzaXplX3QgKm91dGxlZnQpCisgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKippbmJ1ZiwgUHlfc3NpemVfdCAqaW5sZWZ0LAorICAgICAgICAgICAgICAgICBQeV9VTklDT0RFICoqb3V0YnVmLCBQeV9zc2l6ZV90ICpvdXRsZWZ0KQogewotCS8qIG5vdCB3cml0dGVuIHRvIHVzZSBlbmNvZGVyLCBkZWNvZGVyIGZ1bmN0aW9ucyBiZWNhdXNlIG9ubHkgZmV3Ci0JICogZW5jb2RpbmdzIHVzZSBHMiBkZXNpZ25hdGlvbnMgaW4gQ0pLQ29kZWNzICovCi0JaWYgKFNUQVRFX0cyID09IENIQVJTRVRfSVNPODg1OV8xKSB7Ci0JCWlmIChJTjMgPCAweDgwKQotCQkJT1VUMShJTjMgKyAweDgwKQotCQllbHNlCi0JCQlyZXR1cm4gMzsKLQl9Ci0JZWxzZSBpZiAoU1RBVEVfRzIgPT0gQ0hBUlNFVF9JU084ODU5XzcpIHsKLQkJSVNPODg1OV83X0RFQ09ERShJTjMgXiAweDgwLCAqKm91dGJ1ZikKLQkJZWxzZSByZXR1cm4gMzsKLQl9Ci0JZWxzZSBpZiAoU1RBVEVfRzIgPT0gQ0hBUlNFVF9BU0NJSSkgewotCQlpZiAoSU4zICYgMHg4MCkgcmV0dXJuIDM7Ci0JCWVsc2UgKipvdXRidWYgPSBJTjM7Ci0JfQotCWVsc2UKLQkJcmV0dXJuIE1CRVJSX0lOVEVSTkFMOworICAgIC8qIG5vdCB3cml0dGVuIHRvIHVzZSBlbmNvZGVyLCBkZWNvZGVyIGZ1bmN0aW9ucyBiZWNhdXNlIG9ubHkgZmV3CisgICAgICogZW5jb2RpbmdzIHVzZSBHMiBkZXNpZ25hdGlvbnMgaW4gQ0pLQ29kZWNzICovCisgICAgaWYgKFNUQVRFX0cyID09IENIQVJTRVRfSVNPODg1OV8xKSB7CisgICAgICAgIGlmIChJTjMgPCAweDgwKQorICAgICAgICAgICAgT1VUMShJTjMgKyAweDgwKQorICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gMzsKKyAgICB9CisgICAgZWxzZSBpZiAoU1RBVEVfRzIgPT0gQ0hBUlNFVF9JU084ODU5XzcpIHsKKyAgICAgICAgSVNPODg1OV83X0RFQ09ERShJTjMgXiAweDgwLCAqKm91dGJ1ZikKKyAgICAgICAgZWxzZSByZXR1cm4gMzsKKyAgICB9CisgICAgZWxzZSBpZiAoU1RBVEVfRzIgPT0gQ0hBUlNFVF9BU0NJSSkgeworICAgICAgICBpZiAoSU4zICYgMHg4MCkgcmV0dXJuIDM7CisgICAgICAgIGVsc2UgKipvdXRidWYgPSBJTjM7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIE1CRVJSX0lOVEVSTkFMOwogCi0JKCppbmJ1ZikgKz0gMzsKLQkqaW5sZWZ0IC09IDM7Ci0JKCpvdXRidWYpICs9IDE7Ci0JKm91dGxlZnQgLT0gMTsKLQlyZXR1cm4gMDsKKyAgICAoKmluYnVmKSArPSAzOworICAgICppbmxlZnQgLT0gMzsKKyAgICAoKm91dGJ1ZikgKz0gMTsKKyAgICAqb3V0bGVmdCAtPSAxOworICAgIHJldHVybiAwOwogfQogCiBERUNPREVSKGlzbzIwMjIpCiB7Ci0JY29uc3Qgc3RydWN0IGlzbzIwMjJfZGVzaWduYXRpb24gKmRzZ2NhY2hlID0gTlVMTDsKKyAgICBjb25zdCBzdHJ1Y3QgaXNvMjAyMl9kZXNpZ25hdGlvbiAqZHNnY2FjaGUgPSBOVUxMOwogCi0Jd2hpbGUgKGlubGVmdCA+IDApIHsKLQkJdW5zaWduZWQgY2hhciBjID0gSU4xOwotCQlQeV9zc2l6ZV90IGVycjsKKyAgICB3aGlsZSAoaW5sZWZ0ID4gMCkgeworICAgICAgICB1bnNpZ25lZCBjaGFyIGMgPSBJTjE7CisgICAgICAgIFB5X3NzaXplX3QgZXJyOwogCi0JCWlmIChTVEFURV9HRVRGTEFHKEZfRVNDVEhST1VHSE9VVCkpIHsKLQkJCS8qIEVTQyB0aHJvdWdob3V0IG1vZGU6Ci0JCQkgKiBmb3Igbm9uLWlzbzIwMjIgZXNjYXBlIHNlcXVlbmNlcyAqLwotCQkJV1JJVEUxKGMpIC8qIGFzc3VtZSBhcyBJU08tODg1OS0xICovCi0JCQlORVhUKDEsIDEpCi0JCQlpZiAoSVNfRVNDRU5EKGMpKSB7Ci0JCQkJU1RBVEVfQ0xFQVJGTEFHKEZfRVNDVEhST1VHSE9VVCkKLQkJCX0KLQkJCWNvbnRpbnVlOwotCQl9CisgICAgICAgIGlmIChTVEFURV9HRVRGTEFHKEZfRVNDVEhST1VHSE9VVCkpIHsKKyAgICAgICAgICAgIC8qIEVTQyB0aHJvdWdob3V0IG1vZGU6CisgICAgICAgICAgICAgKiBmb3Igbm9uLWlzbzIwMjIgZXNjYXBlIHNlcXVlbmNlcyAqLworICAgICAgICAgICAgV1JJVEUxKGMpIC8qIGFzc3VtZSBhcyBJU08tODg1OS0xICovCisgICAgICAgICAgICBORVhUKDEsIDEpCisgICAgICAgICAgICBpZiAoSVNfRVNDRU5EKGMpKSB7CisgICAgICAgICAgICAgICAgU1RBVEVfQ0xFQVJGTEFHKEZfRVNDVEhST1VHSE9VVCkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CiAKLQkJc3dpdGNoIChjKSB7Ci0JCWNhc2UgRVNDOgotCQkJUkVRVUlSRV9JTkJVRigyKQotCQkJaWYgKElTX0lTTzIwMjJFU0MoSU4yKSkgewotCQkJCWVyciA9IGlzbzIwMjJwcm9jZXNzZXNjKGNvbmZpZywgc3RhdGUsCi0JCQkJCQkJaW5idWYsICZpbmxlZnQpOwotCQkJCWlmIChlcnIgIT0gMCkKLQkJCQkJcmV0dXJuIGVycjsKLQkJCX0KLQkJCWVsc2UgaWYgKENPTkZJR19JU1NFVChVU0VfRzIpICYmIElOMiA9PSAnTicpIHsvKiBTUzIgKi8KLQkJCQlSRVFVSVJFX0lOQlVGKDMpCi0JCQkJZXJyID0gaXNvMjAyMnByb2Nlc3NnMihjb25maWcsIHN0YXRlLAotCQkJCQlpbmJ1ZiwgJmlubGVmdCwgb3V0YnVmLCAmb3V0bGVmdCk7Ci0JCQkJaWYgKGVyciAhPSAwKQotCQkJCQlyZXR1cm4gZXJyOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJV1JJVEUxKEVTQykKLQkJCQlTVEFURV9TRVRGTEFHKEZfRVNDVEhST1VHSE9VVCkKLQkJCQlORVhUKDEsIDEpCi0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBTSToKLQkJCWlmIChDT05GSUdfSVNTRVQoTk9fU0hJRlQpKQotCQkJCWdvdG8gYnlwYXNzOwotCQkJU1RBVEVfQ0xFQVJGTEFHKEZfU0hJRlRFRCkKLQkJCU5FWFRfSU4oMSkKLQkJCWJyZWFrOwotCQljYXNlIFNPOgotCQkJaWYgKENPTkZJR19JU1NFVChOT19TSElGVCkpCi0JCQkJZ290byBieXBhc3M7Ci0JCQlTVEFURV9TRVRGTEFHKEZfU0hJRlRFRCkKLQkJCU5FWFRfSU4oMSkKLQkJCWJyZWFrOwotCQljYXNlIExGOgotCQkJU1RBVEVfQ0xFQVJGTEFHKEZfU0hJRlRFRCkKLQkJCVdSSVRFMShMRikKLQkJCU5FWFQoMSwgMSkKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJaWYgKGMgPCAweDIwKSAvKiBDMCAqLwotCQkJCWdvdG8gYnlwYXNzOwotCQkJZWxzZSBpZiAoYyA+PSAweDgwKQotCQkJCXJldHVybiAxOwotCQkJZWxzZSB7Ci0JCQkJY29uc3Qgc3RydWN0IGlzbzIwMjJfZGVzaWduYXRpb24gKmRzZzsKLQkJCQl1bnNpZ25lZCBjaGFyIGNoYXJzZXQ7Ci0JCQkJdWNzNF90IGRlY29kZWQ7CisgICAgICAgIHN3aXRjaCAoYykgeworICAgICAgICBjYXNlIEVTQzoKKyAgICAgICAgICAgIFJFUVVJUkVfSU5CVUYoMikKKyAgICAgICAgICAgIGlmIChJU19JU08yMDIyRVNDKElOMikpIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBpc28yMDIycHJvY2Vzc2VzYyhjb25maWcsIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluYnVmLCAmaW5sZWZ0KTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyICE9IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChDT05GSUdfSVNTRVQoVVNFX0cyKSAmJiBJTjIgPT0gJ04nKSB7LyogU1MyICovCisgICAgICAgICAgICAgICAgUkVRVUlSRV9JTkJVRigzKQorICAgICAgICAgICAgICAgIGVyciA9IGlzbzIwMjJwcm9jZXNzZzIoY29uZmlnLCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgaW5idWYsICZpbmxlZnQsIG91dGJ1ZiwgJm91dGxlZnQpOworICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIFdSSVRFMShFU0MpCisgICAgICAgICAgICAgICAgU1RBVEVfU0VURkxBRyhGX0VTQ1RIUk9VR0hPVVQpCisgICAgICAgICAgICAgICAgTkVYVCgxLCAxKQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU0k6CisgICAgICAgICAgICBpZiAoQ09ORklHX0lTU0VUKE5PX1NISUZUKSkKKyAgICAgICAgICAgICAgICBnb3RvIGJ5cGFzczsKKyAgICAgICAgICAgIFNUQVRFX0NMRUFSRkxBRyhGX1NISUZURUQpCisgICAgICAgICAgICBORVhUX0lOKDEpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTTzoKKyAgICAgICAgICAgIGlmIChDT05GSUdfSVNTRVQoTk9fU0hJRlQpKQorICAgICAgICAgICAgICAgIGdvdG8gYnlwYXNzOworICAgICAgICAgICAgU1RBVEVfU0VURkxBRyhGX1NISUZURUQpCisgICAgICAgICAgICBORVhUX0lOKDEpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBMRjoKKyAgICAgICAgICAgIFNUQVRFX0NMRUFSRkxBRyhGX1NISUZURUQpCisgICAgICAgICAgICBXUklURTEoTEYpCisgICAgICAgICAgICBORVhUKDEsIDEpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGlmIChjIDwgMHgyMCkgLyogQzAgKi8KKyAgICAgICAgICAgICAgICBnb3RvIGJ5cGFzczsKKyAgICAgICAgICAgIGVsc2UgaWYgKGMgPj0gMHg4MCkKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpc28yMDIyX2Rlc2lnbmF0aW9uICpkc2c7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBjaGFyc2V0OworICAgICAgICAgICAgICAgIHVjczRfdCBkZWNvZGVkOwogCi0JCQkJaWYgKFNUQVRFX0dFVEZMQUcoRl9TSElGVEVEKSkKLQkJCQkJY2hhcnNldCA9IFNUQVRFX0cxOwotCQkJCWVsc2UKLQkJCQkJY2hhcnNldCA9IFNUQVRFX0cwOworICAgICAgICAgICAgICAgIGlmIChTVEFURV9HRVRGTEFHKEZfU0hJRlRFRCkpCisgICAgICAgICAgICAgICAgICAgIGNoYXJzZXQgPSBTVEFURV9HMTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGNoYXJzZXQgPSBTVEFURV9HMDsKIAotCQkJCWlmIChjaGFyc2V0ID09IENIQVJTRVRfQVNDSUkpIHsKLWJ5cGFzczoJCQkJCVdSSVRFMShjKQotCQkJCQlORVhUKDEsIDEpCi0JCQkJCWJyZWFrOwotCQkJCX0KKyAgICAgICAgICAgICAgICBpZiAoY2hhcnNldCA9PSBDSEFSU0VUX0FTQ0lJKSB7CitieXBhc3M6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUxKGMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVYVCgxLCAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKLQkJCQlpZiAoZHNnY2FjaGUgIT0gTlVMTCAmJgotCQkJCSAgICBkc2djYWNoZS0+bWFyayA9PSBjaGFyc2V0KQotCQkJCQlkc2cgPSBkc2djYWNoZTsKLQkJCQllbHNlIHsKLQkJCQkJZm9yIChkc2cgPSBDT05GSUdfREVTSUdOQVRJT05TOwotCQkJCQkgICAgIGRzZy0+bWFyayAhPSBjaGFyc2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkc2djYWNoZSAhPSBOVUxMICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc2djYWNoZS0+bWFyayA9PSBjaGFyc2V0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzZyA9IGRzZ2NhY2hlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGRzZyA9IENPTkZJR19ERVNJR05BVElPTlM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc2ctPm1hcmsgIT0gY2hhcnNldAogI2lmZGVmIFB5X0RFQlVHCi0JCQkJCQkmJiBkc2ctPm1hcmsgIT0gJ1wwJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgZHNnLT5tYXJrICE9ICdcMCcKICNlbmRpZgotCQkJCQkgICAgIDtkc2crKykKLQkJCQkJCS8qIG5vb3AgKi87Ci0JCQkJCWFzc2VydChkc2ctPm1hcmsgIT0gJ1wwJyk7Ci0JCQkJCWRzZ2NhY2hlID0gZHNnOwotCQkJCX0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDtkc2crKykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vb3AgKi87CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KGRzZy0+bWFyayAhPSAnXDAnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc2djYWNoZSA9IGRzZzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogCi0JCQkJUkVRVUlSRV9JTkJVRihkc2ctPndpZHRoKQotCQkJCWRlY29kZWQgPSBkc2ctPmRlY29kZXIoKmluYnVmKTsKLQkJCQlpZiAoZGVjb2RlZCA9PSBNQVBfVU5NQVBQQUJMRSkKLQkJCQkJcmV0dXJuIGRzZy0+d2lkdGg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFUVVJUkVfSU5CVUYoZHNnLT53aWR0aCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlZCA9IGRzZy0+ZGVjb2RlcigqaW5idWYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVjb2RlZCA9PSBNQVBfVU5NQVBQQUJMRSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZHNnLT53aWR0aDsKIAotCQkJCWlmIChkZWNvZGVkIDwgMHgxMDAwMCkgewotCQkJCQlXUklURTEoZGVjb2RlZCkKLQkJCQkJTkVYVF9PVVQoMSkKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoZGVjb2RlZCA8IDB4MzAwMDApIHsKLQkJCQkJV1JJVEVVQ1M0KGRlY29kZWQpCi0JCQkJfQotCQkJCWVsc2UgeyAvKiBKSVMgWCAwMjEzIHBhaXJzICovCi0JCQkJCVdSSVRFMihkZWNvZGVkID4+IDE2LCBkZWNvZGVkICYgMHhmZmZmKQotCQkJCQlORVhUX09VVCgyKQotCQkJCX0KLQkJCQlORVhUX0lOKGRzZy0+d2lkdGgpCi0JCQl9Ci0JCQlicmVhazsKLQkJfQotCX0KLQlyZXR1cm4gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlY29kZWQgPCAweDEwMDAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUxKGRlY29kZWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVYVF9PVVQoMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChkZWNvZGVkIDwgMHgzMDAwMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFVUNTNChkZWNvZGVkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeyAvKiBKSVMgWCAwMjEzIHBhaXJzICovCisgICAgICAgICAgICAgICAgICAgIFdSSVRFMihkZWNvZGVkID4+IDE2LCBkZWNvZGVkICYgMHhmZmZmKQorICAgICAgICAgICAgICAgICAgICBORVhUX09VVCgyKQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBORVhUX0lOKGRzZy0+d2lkdGgpCisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogLyotKi0gbWFwcGluZyB0YWJsZSBob2xkZXJzIC0qLSovCkBAIC01NjcsNTQyICs1NjcsNTQyIEBACiBzdGF0aWMgaW50CiBrc3gxMDAxX2luaXQodm9pZCkKIHsKLQlzdGF0aWMgaW50IGluaXRpYWxpemVkID0gMDsKKyAgICBzdGF0aWMgaW50IGluaXRpYWxpemVkID0gMDsKIAotCWlmICghaW5pdGlhbGl6ZWQgJiYgKAotCQkJSU1QT1JUX01BUChrciwgY3A5NDksICZjcDk0OV9lbmNtYXAsIE5VTEwpIHx8Ci0JCQlJTVBPUlRfTUFQKGtyLCBrc3gxMDAxLCBOVUxMLCAma3N4MTAwMV9kZWNtYXApKSkKLQkJcmV0dXJuIC0xOwotCWluaXRpYWxpemVkID0gMTsKLQlyZXR1cm4gMDsKKyAgICBpZiAoIWluaXRpYWxpemVkICYmICgKKyAgICAgICAgICAgICAgICAgICAgSU1QT1JUX01BUChrciwgY3A5NDksICZjcDk0OV9lbmNtYXAsIE5VTEwpIHx8CisgICAgICAgICAgICAgICAgICAgIElNUE9SVF9NQVAoa3IsIGtzeDEwMDEsIE5VTEwsICZrc3gxMDAxX2RlY21hcCkpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaW5pdGlhbGl6ZWQgPSAxOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgdWNzNF90CiBrc3gxMDAxX2RlY29kZXIoY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSkKIHsKLQl1Y3M0X3QgdTsKLQlUUllNQVBfREVDKGtzeDEwMDEsIHUsIGRhdGFbMF0sIGRhdGFbMV0pCi0JCXJldHVybiB1OwotCWVsc2UKLQkJcmV0dXJuIE1BUF9VTk1BUFBBQkxFOworICAgIHVjczRfdCB1OworICAgIFRSWU1BUF9ERUMoa3N4MTAwMSwgdSwgZGF0YVswXSwgZGF0YVsxXSkKKyAgICAgICAgcmV0dXJuIHU7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gTUFQX1VOTUFQUEFCTEU7CiB9CiAKIHN0YXRpYyBEQkNIQVIKIGtzeDEwMDFfZW5jb2Rlcihjb25zdCB1Y3M0X3QgKmRhdGEsIFB5X3NzaXplX3QgKmxlbmd0aCkKIHsKLQlEQkNIQVIgY29kZWQ7Ci0JYXNzZXJ0KCpsZW5ndGggPT0gMSk7Ci0JaWYgKCpkYXRhIDwgMHgxMDAwMCkgewotCQlUUllNQVBfRU5DKGNwOTQ5LCBjb2RlZCwgKmRhdGEpCi0JCQlpZiAoIShjb2RlZCAmIDB4ODAwMCkpCi0JCQkJcmV0dXJuIGNvZGVkOwotCX0KLQlyZXR1cm4gTUFQX1VOTUFQUEFCTEU7CisgICAgREJDSEFSIGNvZGVkOworICAgIGFzc2VydCgqbGVuZ3RoID09IDEpOworICAgIGlmICgqZGF0YSA8IDB4MTAwMDApIHsKKyAgICAgICAgVFJZTUFQX0VOQyhjcDk0OSwgY29kZWQsICpkYXRhKQorICAgICAgICAgICAgaWYgKCEoY29kZWQgJiAweDgwMDApKQorICAgICAgICAgICAgICAgIHJldHVybiBjb2RlZDsKKyAgICB9CisgICAgcmV0dXJuIE1BUF9VTk1BUFBBQkxFOwogfQogCiBzdGF0aWMgaW50CiBqaXN4MDIwOF9pbml0KHZvaWQpCiB7Ci0Jc3RhdGljIGludCBpbml0aWFsaXplZCA9IDA7CisgICAgc3RhdGljIGludCBpbml0aWFsaXplZCA9IDA7CiAKLQlpZiAoIWluaXRpYWxpemVkICYmICgKLQkJCUlNUE9SVF9NQVAoanAsIGppc3hjb21tb24sICZqaXN4Y29tbW9uX2VuY21hcCwgTlVMTCkgfHwKLQkJCUlNUE9SVF9NQVAoanAsIGppc3gwMjA4LCBOVUxMLCAmamlzeDAyMDhfZGVjbWFwKSkpCi0JCXJldHVybiAtMTsKLQlpbml0aWFsaXplZCA9IDE7Ci0JcmV0dXJuIDA7CisgICAgaWYgKCFpbml0aWFsaXplZCAmJiAoCisgICAgICAgICAgICAgICAgICAgIElNUE9SVF9NQVAoanAsIGppc3hjb21tb24sICZqaXN4Y29tbW9uX2VuY21hcCwgTlVMTCkgfHwKKyAgICAgICAgICAgICAgICAgICAgSU1QT1JUX01BUChqcCwgamlzeDAyMDgsIE5VTEwsICZqaXN4MDIwOF9kZWNtYXApKSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGluaXRpYWxpemVkID0gMTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIHVjczRfdAogamlzeDAyMDhfZGVjb2Rlcihjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhKQogewotCXVjczRfdCB1OwotCWlmIChkYXRhWzBdID09IDB4MjEgJiYgZGF0YVsxXSA9PSAweDQwKSAvKiBGL1cgUkVWRVJTRSBTT0xJRFVTICovCi0JCXJldHVybiAweGZmM2M7Ci0JZWxzZSBUUllNQVBfREVDKGppc3gwMjA4LCB1LCBkYXRhWzBdLCBkYXRhWzFdKQotCQlyZXR1cm4gdTsKLQllbHNlCi0JCXJldHVybiBNQVBfVU5NQVBQQUJMRTsKKyAgICB1Y3M0X3QgdTsKKyAgICBpZiAoZGF0YVswXSA9PSAweDIxICYmIGRhdGFbMV0gPT0gMHg0MCkgLyogRi9XIFJFVkVSU0UgU09MSURVUyAqLworICAgICAgICByZXR1cm4gMHhmZjNjOworICAgIGVsc2UgVFJZTUFQX0RFQyhqaXN4MDIwOCwgdSwgZGF0YVswXSwgZGF0YVsxXSkKKyAgICAgICAgcmV0dXJuIHU7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gTUFQX1VOTUFQUEFCTEU7CiB9CiAKIHN0YXRpYyBEQkNIQVIKIGppc3gwMjA4X2VuY29kZXIoY29uc3QgdWNzNF90ICpkYXRhLCBQeV9zc2l6ZV90ICpsZW5ndGgpCiB7Ci0JREJDSEFSIGNvZGVkOwotCWFzc2VydCgqbGVuZ3RoID09IDEpOwotCWlmICgqZGF0YSA8IDB4MTAwMDApIHsKLQkJaWYgKCpkYXRhID09IDB4ZmYzYykgLyogRi9XIFJFVkVSU0UgU09MSURVUyAqLwotCQkJcmV0dXJuIDB4MjE0MDsKLQkJZWxzZSBUUllNQVBfRU5DKGppc3hjb21tb24sIGNvZGVkLCAqZGF0YSkgewotCQkJaWYgKCEoY29kZWQgJiAweDgwMDApKQotCQkJCXJldHVybiBjb2RlZDsKLQkJfQotCX0KLQlyZXR1cm4gTUFQX1VOTUFQUEFCTEU7CisgICAgREJDSEFSIGNvZGVkOworICAgIGFzc2VydCgqbGVuZ3RoID09IDEpOworICAgIGlmICgqZGF0YSA8IDB4MTAwMDApIHsKKyAgICAgICAgaWYgKCpkYXRhID09IDB4ZmYzYykgLyogRi9XIFJFVkVSU0UgU09MSURVUyAqLworICAgICAgICAgICAgcmV0dXJuIDB4MjE0MDsKKyAgICAgICAgZWxzZSBUUllNQVBfRU5DKGppc3hjb21tb24sIGNvZGVkLCAqZGF0YSkgeworICAgICAgICAgICAgaWYgKCEoY29kZWQgJiAweDgwMDApKQorICAgICAgICAgICAgICAgIHJldHVybiBjb2RlZDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTUFQX1VOTUFQUEFCTEU7CiB9CiAKIHN0YXRpYyBpbnQKIGppc3gwMjEyX2luaXQodm9pZCkKIHsKLQlzdGF0aWMgaW50IGluaXRpYWxpemVkID0gMDsKKyAgICBzdGF0aWMgaW50IGluaXRpYWxpemVkID0gMDsKIAotCWlmICghaW5pdGlhbGl6ZWQgJiYgKAotCQkJSU1QT1JUX01BUChqcCwgamlzeGNvbW1vbiwgJmppc3hjb21tb25fZW5jbWFwLCBOVUxMKSB8fAotCQkJSU1QT1JUX01BUChqcCwgamlzeDAyMTIsIE5VTEwsICZqaXN4MDIxMl9kZWNtYXApKSkKLQkJcmV0dXJuIC0xOwotCWluaXRpYWxpemVkID0gMTsKLQlyZXR1cm4gMDsKKyAgICBpZiAoIWluaXRpYWxpemVkICYmICgKKyAgICAgICAgICAgICAgICAgICAgSU1QT1JUX01BUChqcCwgamlzeGNvbW1vbiwgJmppc3hjb21tb25fZW5jbWFwLCBOVUxMKSB8fAorICAgICAgICAgICAgICAgICAgICBJTVBPUlRfTUFQKGpwLCBqaXN4MDIxMiwgTlVMTCwgJmppc3gwMjEyX2RlY21hcCkpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaW5pdGlhbGl6ZWQgPSAxOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgdWNzNF90CiBqaXN4MDIxMl9kZWNvZGVyKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEpCiB7Ci0JdWNzNF90IHU7Ci0JVFJZTUFQX0RFQyhqaXN4MDIxMiwgdSwgZGF0YVswXSwgZGF0YVsxXSkKLQkJcmV0dXJuIHU7Ci0JZWxzZQotCQlyZXR1cm4gTUFQX1VOTUFQUEFCTEU7CisgICAgdWNzNF90IHU7CisgICAgVFJZTUFQX0RFQyhqaXN4MDIxMiwgdSwgZGF0YVswXSwgZGF0YVsxXSkKKyAgICAgICAgcmV0dXJuIHU7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gTUFQX1VOTUFQUEFCTEU7CiB9CiAKIHN0YXRpYyBEQkNIQVIKIGppc3gwMjEyX2VuY29kZXIoY29uc3QgdWNzNF90ICpkYXRhLCBQeV9zc2l6ZV90ICpsZW5ndGgpCiB7Ci0JREJDSEFSIGNvZGVkOwotCWFzc2VydCgqbGVuZ3RoID09IDEpOwotCWlmICgqZGF0YSA8IDB4MTAwMDApIHsKLQkJVFJZTUFQX0VOQyhqaXN4Y29tbW9uLCBjb2RlZCwgKmRhdGEpIHsKLQkJCWlmIChjb2RlZCAmIDB4ODAwMCkKLQkJCQlyZXR1cm4gY29kZWQgJiAweDdmZmY7Ci0JCX0KLQl9Ci0JcmV0dXJuIE1BUF9VTk1BUFBBQkxFOworICAgIERCQ0hBUiBjb2RlZDsKKyAgICBhc3NlcnQoKmxlbmd0aCA9PSAxKTsKKyAgICBpZiAoKmRhdGEgPCAweDEwMDAwKSB7CisgICAgICAgIFRSWU1BUF9FTkMoamlzeGNvbW1vbiwgY29kZWQsICpkYXRhKSB7CisgICAgICAgICAgICBpZiAoY29kZWQgJiAweDgwMDApCisgICAgICAgICAgICAgICAgcmV0dXJuIGNvZGVkICYgMHg3ZmZmOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBNQVBfVU5NQVBQQUJMRTsKIH0KIAogc3RhdGljIGludAogamlzeDAyMTNfaW5pdCh2b2lkKQogewotCXN0YXRpYyBpbnQgaW5pdGlhbGl6ZWQgPSAwOworICAgIHN0YXRpYyBpbnQgaW5pdGlhbGl6ZWQgPSAwOwogCi0JaWYgKCFpbml0aWFsaXplZCAmJiAoCi0JCQlqaXN4MDIwOF9pbml0KCkgfHwKLQkJCUlNUE9SVF9NQVAoanAsIGppc3gwMjEzX2JtcCwKLQkJCQkgICAmamlzeDAyMTNfYm1wX2VuY21hcCwgTlVMTCkgfHwKLQkJCUlNUE9SVF9NQVAoanAsIGppc3gwMjEzXzFfYm1wLAotCQkJCSAgIE5VTEwsICZqaXN4MDIxM18xX2JtcF9kZWNtYXApIHx8Ci0JCQlJTVBPUlRfTUFQKGpwLCBqaXN4MDIxM18yX2JtcCwKLQkJCQkgICBOVUxMLCAmamlzeDAyMTNfMl9ibXBfZGVjbWFwKSB8fAotCQkJSU1QT1JUX01BUChqcCwgamlzeDAyMTNfZW1wLAotCQkJCSAgICZqaXN4MDIxM19lbXBfZW5jbWFwLCBOVUxMKSB8fAotCQkJSU1QT1JUX01BUChqcCwgamlzeDAyMTNfMV9lbXAsCi0JCQkJICAgTlVMTCwgJmppc3gwMjEzXzFfZW1wX2RlY21hcCkgfHwKLQkJCUlNUE9SVF9NQVAoanAsIGppc3gwMjEzXzJfZW1wLAotCQkJCSAgIE5VTEwsICZqaXN4MDIxM18yX2VtcF9kZWNtYXApIHx8Ci0JCQlJTVBPUlRfTUFQKGpwLCBqaXN4MDIxM19wYWlyLCAmamlzeDAyMTNfcGFpcl9lbmNtYXAsCi0JCQkJICAgJmppc3gwMjEzX3BhaXJfZGVjbWFwKSkpCi0JCXJldHVybiAtMTsKLQlpbml0aWFsaXplZCA9IDE7Ci0JcmV0dXJuIDA7CisgICAgaWYgKCFpbml0aWFsaXplZCAmJiAoCisgICAgICAgICAgICAgICAgICAgIGppc3gwMjA4X2luaXQoKSB8fAorICAgICAgICAgICAgICAgICAgICBJTVBPUlRfTUFQKGpwLCBqaXN4MDIxM19ibXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmppc3gwMjEzX2JtcF9lbmNtYXAsIE5VTEwpIHx8CisgICAgICAgICAgICAgICAgICAgIElNUE9SVF9NQVAoanAsIGppc3gwMjEzXzFfYm1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICZqaXN4MDIxM18xX2JtcF9kZWNtYXApIHx8CisgICAgICAgICAgICAgICAgICAgIElNUE9SVF9NQVAoanAsIGppc3gwMjEzXzJfYm1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICZqaXN4MDIxM18yX2JtcF9kZWNtYXApIHx8CisgICAgICAgICAgICAgICAgICAgIElNUE9SVF9NQVAoanAsIGppc3gwMjEzX2VtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmamlzeDAyMTNfZW1wX2VuY21hcCwgTlVMTCkgfHwKKyAgICAgICAgICAgICAgICAgICAgSU1QT1JUX01BUChqcCwgamlzeDAyMTNfMV9lbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgJmppc3gwMjEzXzFfZW1wX2RlY21hcCkgfHwKKyAgICAgICAgICAgICAgICAgICAgSU1QT1JUX01BUChqcCwgamlzeDAyMTNfMl9lbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgJmppc3gwMjEzXzJfZW1wX2RlY21hcCkgfHwKKyAgICAgICAgICAgICAgICAgICAgSU1QT1JUX01BUChqcCwgamlzeDAyMTNfcGFpciwgJmppc3gwMjEzX3BhaXJfZW5jbWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZqaXN4MDIxM19wYWlyX2RlY21hcCkpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaW5pdGlhbGl6ZWQgPSAxOworICAgIHJldHVybiAwOwogfQogCiAjZGVmaW5lIGNvbmZpZyAoKHZvaWQgKikyMDAwKQogc3RhdGljIHVjczRfdAogamlzeDAyMTNfMjAwMF8xX2RlY29kZXIoY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSkKIHsKLQl1Y3M0X3QgdTsKLQlFTVVMQVRFX0pJU1gwMjEzXzIwMDBfREVDT0RFX1BMQU5FMSh1LCBkYXRhWzBdLCBkYXRhWzFdKQotCWVsc2UgaWYgKGRhdGFbMF0gPT0gMHgyMSAmJiBkYXRhWzFdID09IDB4NDApIC8qIEYvVyBSRVZFUlNFIFNPTElEVVMgKi8KLQkJcmV0dXJuIDB4ZmYzYzsKLQllbHNlIFRSWU1BUF9ERUMoamlzeDAyMDgsIHUsIGRhdGFbMF0sIGRhdGFbMV0pOwotCWVsc2UgVFJZTUFQX0RFQyhqaXN4MDIxM18xX2JtcCwgdSwgZGF0YVswXSwgZGF0YVsxXSk7Ci0JZWxzZSBUUllNQVBfREVDKGppc3gwMjEzXzFfZW1wLCB1LCBkYXRhWzBdLCBkYXRhWzFdKQotCQl1IHw9IDB4MjAwMDA7Ci0JZWxzZSBUUllNQVBfREVDKGppc3gwMjEzX3BhaXIsIHUsIGRhdGFbMF0sIGRhdGFbMV0pOwotCWVsc2UKLQkJcmV0dXJuIE1BUF9VTk1BUFBBQkxFOwotCXJldHVybiB1OworICAgIHVjczRfdCB1OworICAgIEVNVUxBVEVfSklTWDAyMTNfMjAwMF9ERUNPREVfUExBTkUxKHUsIGRhdGFbMF0sIGRhdGFbMV0pCisgICAgZWxzZSBpZiAoZGF0YVswXSA9PSAweDIxICYmIGRhdGFbMV0gPT0gMHg0MCkgLyogRi9XIFJFVkVSU0UgU09MSURVUyAqLworICAgICAgICByZXR1cm4gMHhmZjNjOworICAgIGVsc2UgVFJZTUFQX0RFQyhqaXN4MDIwOCwgdSwgZGF0YVswXSwgZGF0YVsxXSk7CisgICAgZWxzZSBUUllNQVBfREVDKGppc3gwMjEzXzFfYm1wLCB1LCBkYXRhWzBdLCBkYXRhWzFdKTsKKyAgICBlbHNlIFRSWU1BUF9ERUMoamlzeDAyMTNfMV9lbXAsIHUsIGRhdGFbMF0sIGRhdGFbMV0pCisgICAgICAgIHUgfD0gMHgyMDAwMDsKKyAgICBlbHNlIFRSWU1BUF9ERUMoamlzeDAyMTNfcGFpciwgdSwgZGF0YVswXSwgZGF0YVsxXSk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gTUFQX1VOTUFQUEFCTEU7CisgICAgcmV0dXJuIHU7CiB9CiAKIHN0YXRpYyB1Y3M0X3QKIGppc3gwMjEzXzIwMDBfMl9kZWNvZGVyKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEpCiB7Ci0JdWNzNF90IHU7Ci0JRU1VTEFURV9KSVNYMDIxM18yMDAwX0RFQ09ERV9QTEFORTIodSwgZGF0YVswXSwgZGF0YVsxXSkKLQlUUllNQVBfREVDKGppc3gwMjEzXzJfYm1wLCB1LCBkYXRhWzBdLCBkYXRhWzFdKTsKLQllbHNlIFRSWU1BUF9ERUMoamlzeDAyMTNfMl9lbXAsIHUsIGRhdGFbMF0sIGRhdGFbMV0pCi0JCXUgfD0gMHgyMDAwMDsKLQllbHNlCi0JCXJldHVybiBNQVBfVU5NQVBQQUJMRTsKLQlyZXR1cm4gdTsKKyAgICB1Y3M0X3QgdTsKKyAgICBFTVVMQVRFX0pJU1gwMjEzXzIwMDBfREVDT0RFX1BMQU5FMih1LCBkYXRhWzBdLCBkYXRhWzFdKQorICAgIFRSWU1BUF9ERUMoamlzeDAyMTNfMl9ibXAsIHUsIGRhdGFbMF0sIGRhdGFbMV0pOworICAgIGVsc2UgVFJZTUFQX0RFQyhqaXN4MDIxM18yX2VtcCwgdSwgZGF0YVswXSwgZGF0YVsxXSkKKyAgICAgICAgdSB8PSAweDIwMDAwOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIE1BUF9VTk1BUFBBQkxFOworICAgIHJldHVybiB1OwogfQogI3VuZGVmIGNvbmZpZwogCiBzdGF0aWMgdWNzNF90CiBqaXN4MDIxM18yMDA0XzFfZGVjb2Rlcihjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhKQogewotCXVjczRfdCB1OwotCWlmIChkYXRhWzBdID09IDB4MjEgJiYgZGF0YVsxXSA9PSAweDQwKSAvKiBGL1cgUkVWRVJTRSBTT0xJRFVTICovCi0JCXJldHVybiAweGZmM2M7Ci0JZWxzZSBUUllNQVBfREVDKGppc3gwMjA4LCB1LCBkYXRhWzBdLCBkYXRhWzFdKTsKLQllbHNlIFRSWU1BUF9ERUMoamlzeDAyMTNfMV9ibXAsIHUsIGRhdGFbMF0sIGRhdGFbMV0pOwotCWVsc2UgVFJZTUFQX0RFQyhqaXN4MDIxM18xX2VtcCwgdSwgZGF0YVswXSwgZGF0YVsxXSkKLQkJdSB8PSAweDIwMDAwOwotCWVsc2UgVFJZTUFQX0RFQyhqaXN4MDIxM19wYWlyLCB1LCBkYXRhWzBdLCBkYXRhWzFdKTsKLQllbHNlCi0JCXJldHVybiBNQVBfVU5NQVBQQUJMRTsKLQlyZXR1cm4gdTsKKyAgICB1Y3M0X3QgdTsKKyAgICBpZiAoZGF0YVswXSA9PSAweDIxICYmIGRhdGFbMV0gPT0gMHg0MCkgLyogRi9XIFJFVkVSU0UgU09MSURVUyAqLworICAgICAgICByZXR1cm4gMHhmZjNjOworICAgIGVsc2UgVFJZTUFQX0RFQyhqaXN4MDIwOCwgdSwgZGF0YVswXSwgZGF0YVsxXSk7CisgICAgZWxzZSBUUllNQVBfREVDKGppc3gwMjEzXzFfYm1wLCB1LCBkYXRhWzBdLCBkYXRhWzFdKTsKKyAgICBlbHNlIFRSWU1BUF9ERUMoamlzeDAyMTNfMV9lbXAsIHUsIGRhdGFbMF0sIGRhdGFbMV0pCisgICAgICAgIHUgfD0gMHgyMDAwMDsKKyAgICBlbHNlIFRSWU1BUF9ERUMoamlzeDAyMTNfcGFpciwgdSwgZGF0YVswXSwgZGF0YVsxXSk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gTUFQX1VOTUFQUEFCTEU7CisgICAgcmV0dXJuIHU7CiB9CiAKIHN0YXRpYyB1Y3M0X3QKIGppc3gwMjEzXzIwMDRfMl9kZWNvZGVyKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEpCiB7Ci0JdWNzNF90IHU7Ci0JVFJZTUFQX0RFQyhqaXN4MDIxM18yX2JtcCwgdSwgZGF0YVswXSwgZGF0YVsxXSk7Ci0JZWxzZSBUUllNQVBfREVDKGppc3gwMjEzXzJfZW1wLCB1LCBkYXRhWzBdLCBkYXRhWzFdKQotCQl1IHw9IDB4MjAwMDA7Ci0JZWxzZQotCQlyZXR1cm4gTUFQX1VOTUFQUEFCTEU7Ci0JcmV0dXJuIHU7CisgICAgdWNzNF90IHU7CisgICAgVFJZTUFQX0RFQyhqaXN4MDIxM18yX2JtcCwgdSwgZGF0YVswXSwgZGF0YVsxXSk7CisgICAgZWxzZSBUUllNQVBfREVDKGppc3gwMjEzXzJfZW1wLCB1LCBkYXRhWzBdLCBkYXRhWzFdKQorICAgICAgICB1IHw9IDB4MjAwMDA7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gTUFQX1VOTUFQUEFCTEU7CisgICAgcmV0dXJuIHU7CiB9CiAKIHN0YXRpYyBEQkNIQVIKIGppc3gwMjEzX2VuY29kZXIoY29uc3QgdWNzNF90ICpkYXRhLCBQeV9zc2l6ZV90ICpsZW5ndGgsIHZvaWQgKmNvbmZpZykKIHsKLQlEQkNIQVIgY29kZWQ7CisgICAgREJDSEFSIGNvZGVkOwogCi0Jc3dpdGNoICgqbGVuZ3RoKSB7Ci0JY2FzZSAxOiAvKiBmaXJzdCBjaGFyYWN0ZXIgKi8KLQkJaWYgKCpkYXRhID49IDB4MTAwMDApIHsKLQkJCWlmICgoKmRhdGEpID4+IDE2ID09IDB4MjAwMDAgPj4gMTYpIHsKLQkJCQlFTVVMQVRFX0pJU1gwMjEzXzIwMDBfRU5DT0RFX0VNUChjb2RlZCwgKmRhdGEpCi0JCQkJZWxzZSBUUllNQVBfRU5DKGppc3gwMjEzX2VtcCwgY29kZWQsCi0JCQkJCQkoKmRhdGEpICYgMHhmZmZmKQotCQkJCQlyZXR1cm4gY29kZWQ7Ci0JCQl9Ci0JCQlyZXR1cm4gTUFQX1VOTUFQUEFCTEU7Ci0JCX0KKyAgICBzd2l0Y2ggKCpsZW5ndGgpIHsKKyAgICBjYXNlIDE6IC8qIGZpcnN0IGNoYXJhY3RlciAqLworICAgICAgICBpZiAoKmRhdGEgPj0gMHgxMDAwMCkgeworICAgICAgICAgICAgaWYgKCgqZGF0YSkgPj4gMTYgPT0gMHgyMDAwMCA+PiAxNikgeworICAgICAgICAgICAgICAgIEVNVUxBVEVfSklTWDAyMTNfMjAwMF9FTkNPREVfRU1QKGNvZGVkLCAqZGF0YSkKKyAgICAgICAgICAgICAgICBlbHNlIFRSWU1BUF9FTkMoamlzeDAyMTNfZW1wLCBjb2RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpkYXRhKSAmIDB4ZmZmZikKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvZGVkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE1BUF9VTk1BUFBBQkxFOworICAgICAgICB9CiAKLQkJRU1VTEFURV9KSVNYMDIxM18yMDAwX0VOQ09ERV9CTVAoY29kZWQsICpkYXRhKQotCQllbHNlIFRSWU1BUF9FTkMoamlzeDAyMTNfYm1wLCBjb2RlZCwgKmRhdGEpIHsKLQkJCWlmIChjb2RlZCA9PSBNVUxUSUMpCi0JCQkJcmV0dXJuIE1BUF9NVUxUSVBMRV9BVkFJTDsKLQkJfQotCQllbHNlIFRSWU1BUF9FTkMoamlzeGNvbW1vbiwgY29kZWQsICpkYXRhKSB7Ci0JCQlpZiAoY29kZWQgJiAweDgwMDApCi0JCQkJcmV0dXJuIE1BUF9VTk1BUFBBQkxFOwotCQl9Ci0JCWVsc2UKLQkJCXJldHVybiBNQVBfVU5NQVBQQUJMRTsKLQkJcmV0dXJuIGNvZGVkOwotCWNhc2UgMjogLyogc2Vjb25kIGNoYXJhY3RlciBvZiB1bmljb2RlIHBhaXIgKi8KLQkJY29kZWQgPSBmaW5kX3BhaXJlbmNtYXAoKHVjczJfdClkYXRhWzBdLCAodWNzMl90KWRhdGFbMV0sCi0JCQkJamlzeDAyMTNfcGFpcl9lbmNtYXAsIEpJU1gwMjEzX0VOQ1BBSVJTKTsKLQkJaWYgKGNvZGVkID09IERCQ0lOVikgewotCQkJKmxlbmd0aCA9IDE7Ci0JCQljb2RlZCA9IGZpbmRfcGFpcmVuY21hcCgodWNzMl90KWRhdGFbMF0sIDAsCi0JCQkJICBqaXN4MDIxM19wYWlyX2VuY21hcCwgSklTWDAyMTNfRU5DUEFJUlMpOwotCQkJaWYgKGNvZGVkID09IERCQ0lOVikKLQkJCQlyZXR1cm4gTUFQX1VOTUFQUEFCTEU7Ci0JCX0KLQkJZWxzZQotCQkJcmV0dXJuIGNvZGVkOwotCWNhc2UgLTE6IC8qIGZsdXNoIHVudGVybWluYXRlZCAqLwotCQkqbGVuZ3RoID0gMTsKLQkJY29kZWQgPSBmaW5kX3BhaXJlbmNtYXAoKHVjczJfdClkYXRhWzBdLCAwLAotCQkJCWppc3gwMjEzX3BhaXJfZW5jbWFwLCBKSVNYMDIxM19FTkNQQUlSUyk7Ci0JCWlmIChjb2RlZCA9PSBEQkNJTlYpCi0JCQlyZXR1cm4gTUFQX1VOTUFQUEFCTEU7Ci0JCWVsc2UKLQkJCXJldHVybiBjb2RlZDsKLQlkZWZhdWx0OgotCQlyZXR1cm4gTUFQX1VOTUFQUEFCTEU7Ci0JfQorICAgICAgICBFTVVMQVRFX0pJU1gwMjEzXzIwMDBfRU5DT0RFX0JNUChjb2RlZCwgKmRhdGEpCisgICAgICAgIGVsc2UgVFJZTUFQX0VOQyhqaXN4MDIxM19ibXAsIGNvZGVkLCAqZGF0YSkgeworICAgICAgICAgICAgaWYgKGNvZGVkID09IE1VTFRJQykKKyAgICAgICAgICAgICAgICByZXR1cm4gTUFQX01VTFRJUExFX0FWQUlMOworICAgICAgICB9CisgICAgICAgIGVsc2UgVFJZTUFQX0VOQyhqaXN4Y29tbW9uLCBjb2RlZCwgKmRhdGEpIHsKKyAgICAgICAgICAgIGlmIChjb2RlZCAmIDB4ODAwMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gTUFQX1VOTUFQUEFCTEU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIE1BUF9VTk1BUFBBQkxFOworICAgICAgICByZXR1cm4gY29kZWQ7CisgICAgY2FzZSAyOiAvKiBzZWNvbmQgY2hhcmFjdGVyIG9mIHVuaWNvZGUgcGFpciAqLworICAgICAgICBjb2RlZCA9IGZpbmRfcGFpcmVuY21hcCgodWNzMl90KWRhdGFbMF0sICh1Y3MyX3QpZGF0YVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGppc3gwMjEzX3BhaXJfZW5jbWFwLCBKSVNYMDIxM19FTkNQQUlSUyk7CisgICAgICAgIGlmIChjb2RlZCA9PSBEQkNJTlYpIHsKKyAgICAgICAgICAgICpsZW5ndGggPSAxOworICAgICAgICAgICAgY29kZWQgPSBmaW5kX3BhaXJlbmNtYXAoKHVjczJfdClkYXRhWzBdLCAwLAorICAgICAgICAgICAgICAgICAgICAgIGppc3gwMjEzX3BhaXJfZW5jbWFwLCBKSVNYMDIxM19FTkNQQUlSUyk7CisgICAgICAgICAgICBpZiAoY29kZWQgPT0gREJDSU5WKQorICAgICAgICAgICAgICAgIHJldHVybiBNQVBfVU5NQVBQQUJMRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gY29kZWQ7CisgICAgY2FzZSAtMTogLyogZmx1c2ggdW50ZXJtaW5hdGVkICovCisgICAgICAgICpsZW5ndGggPSAxOworICAgICAgICBjb2RlZCA9IGZpbmRfcGFpcmVuY21hcCgodWNzMl90KWRhdGFbMF0sIDAsCisgICAgICAgICAgICAgICAgICAgICAgICBqaXN4MDIxM19wYWlyX2VuY21hcCwgSklTWDAyMTNfRU5DUEFJUlMpOworICAgICAgICBpZiAoY29kZWQgPT0gREJDSU5WKQorICAgICAgICAgICAgcmV0dXJuIE1BUF9VTk1BUFBBQkxFOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gY29kZWQ7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIE1BUF9VTk1BUFBBQkxFOworICAgIH0KIH0KIAogc3RhdGljIERCQ0hBUgogamlzeDAyMTNfMjAwMF8xX2VuY29kZXIoY29uc3QgdWNzNF90ICpkYXRhLCBQeV9zc2l6ZV90ICpsZW5ndGgpCiB7Ci0JREJDSEFSIGNvZGVkID0gamlzeDAyMTNfZW5jb2RlcihkYXRhLCBsZW5ndGgsICh2b2lkICopMjAwMCk7Ci0JaWYgKGNvZGVkID09IE1BUF9VTk1BUFBBQkxFIHx8IGNvZGVkID09IE1BUF9NVUxUSVBMRV9BVkFJTCkKLQkJcmV0dXJuIGNvZGVkOwotCWVsc2UgaWYgKGNvZGVkICYgMHg4MDAwKQotCQlyZXR1cm4gTUFQX1VOTUFQUEFCTEU7Ci0JZWxzZQotCQlyZXR1cm4gY29kZWQ7CisgICAgREJDSEFSIGNvZGVkID0gamlzeDAyMTNfZW5jb2RlcihkYXRhLCBsZW5ndGgsICh2b2lkICopMjAwMCk7CisgICAgaWYgKGNvZGVkID09IE1BUF9VTk1BUFBBQkxFIHx8IGNvZGVkID09IE1BUF9NVUxUSVBMRV9BVkFJTCkKKyAgICAgICAgcmV0dXJuIGNvZGVkOworICAgIGVsc2UgaWYgKGNvZGVkICYgMHg4MDAwKQorICAgICAgICByZXR1cm4gTUFQX1VOTUFQUEFCTEU7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gY29kZWQ7CiB9CiAKIHN0YXRpYyBEQkNIQVIKIGppc3gwMjEzXzIwMDBfMV9lbmNvZGVyX3BhaXJvbmx5KGNvbnN0IHVjczRfdCAqZGF0YSwgUHlfc3NpemVfdCAqbGVuZ3RoKQogewotCURCQ0hBUiBjb2RlZDsKLQlQeV9zc2l6ZV90IGlsZW5ndGggPSAqbGVuZ3RoOworICAgIERCQ0hBUiBjb2RlZDsKKyAgICBQeV9zc2l6ZV90IGlsZW5ndGggPSAqbGVuZ3RoOwogCi0JY29kZWQgPSBqaXN4MDIxM19lbmNvZGVyKGRhdGEsIGxlbmd0aCwgKHZvaWQgKikyMDAwKTsKLQlzd2l0Y2ggKGlsZW5ndGgpIHsKLQljYXNlIDE6Ci0JCWlmIChjb2RlZCA9PSBNQVBfTVVMVElQTEVfQVZBSUwpCi0JCQlyZXR1cm4gTUFQX01VTFRJUExFX0FWQUlMOwotCQllbHNlCi0JCQlyZXR1cm4gTUFQX1VOTUFQUEFCTEU7Ci0JY2FzZSAyOgotCQlpZiAoKmxlbmd0aCAhPSAyKQotCQkJcmV0dXJuIE1BUF9VTk1BUFBBQkxFOwotCQllbHNlCi0JCQlyZXR1cm4gY29kZWQ7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIE1BUF9VTk1BUFBBQkxFOwotCX0KKyAgICBjb2RlZCA9IGppc3gwMjEzX2VuY29kZXIoZGF0YSwgbGVuZ3RoLCAodm9pZCAqKTIwMDApOworICAgIHN3aXRjaCAoaWxlbmd0aCkgeworICAgIGNhc2UgMToKKyAgICAgICAgaWYgKGNvZGVkID09IE1BUF9NVUxUSVBMRV9BVkFJTCkKKyAgICAgICAgICAgIHJldHVybiBNQVBfTVVMVElQTEVfQVZBSUw7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBNQVBfVU5NQVBQQUJMRTsKKyAgICBjYXNlIDI6CisgICAgICAgIGlmICgqbGVuZ3RoICE9IDIpCisgICAgICAgICAgICByZXR1cm4gTUFQX1VOTUFQUEFCTEU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBjb2RlZDsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gTUFQX1VOTUFQUEFCTEU7CisgICAgfQogfQogCiBzdGF0aWMgREJDSEFSCiBqaXN4MDIxM18yMDAwXzJfZW5jb2Rlcihjb25zdCB1Y3M0X3QgKmRhdGEsIFB5X3NzaXplX3QgKmxlbmd0aCkKIHsKLQlEQkNIQVIgY29kZWQgPSBqaXN4MDIxM19lbmNvZGVyKGRhdGEsIGxlbmd0aCwgKHZvaWQgKikyMDAwKTsKLQlpZiAoY29kZWQgPT0gTUFQX1VOTUFQUEFCTEUgfHwgY29kZWQgPT0gTUFQX01VTFRJUExFX0FWQUlMKQotCQlyZXR1cm4gY29kZWQ7Ci0JZWxzZSBpZiAoY29kZWQgJiAweDgwMDApCi0JCXJldHVybiBjb2RlZCAmIDB4N2ZmZjsKLQllbHNlCi0JCXJldHVybiBNQVBfVU5NQVBQQUJMRTsKKyAgICBEQkNIQVIgY29kZWQgPSBqaXN4MDIxM19lbmNvZGVyKGRhdGEsIGxlbmd0aCwgKHZvaWQgKikyMDAwKTsKKyAgICBpZiAoY29kZWQgPT0gTUFQX1VOTUFQUEFCTEUgfHwgY29kZWQgPT0gTUFQX01VTFRJUExFX0FWQUlMKQorICAgICAgICByZXR1cm4gY29kZWQ7CisgICAgZWxzZSBpZiAoY29kZWQgJiAweDgwMDApCisgICAgICAgIHJldHVybiBjb2RlZCAmIDB4N2ZmZjsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBNQVBfVU5NQVBQQUJMRTsKIH0KIAogc3RhdGljIERCQ0hBUgogamlzeDAyMTNfMjAwNF8xX2VuY29kZXIoY29uc3QgdWNzNF90ICpkYXRhLCBQeV9zc2l6ZV90ICpsZW5ndGgpCiB7Ci0JREJDSEFSIGNvZGVkID0gamlzeDAyMTNfZW5jb2RlcihkYXRhLCBsZW5ndGgsIE5VTEwpOwotCWlmIChjb2RlZCA9PSBNQVBfVU5NQVBQQUJMRSB8fCBjb2RlZCA9PSBNQVBfTVVMVElQTEVfQVZBSUwpCi0JCXJldHVybiBjb2RlZDsKLQllbHNlIGlmIChjb2RlZCAmIDB4ODAwMCkKLQkJcmV0dXJuIE1BUF9VTk1BUFBBQkxFOwotCWVsc2UKLQkJcmV0dXJuIGNvZGVkOworICAgIERCQ0hBUiBjb2RlZCA9IGppc3gwMjEzX2VuY29kZXIoZGF0YSwgbGVuZ3RoLCBOVUxMKTsKKyAgICBpZiAoY29kZWQgPT0gTUFQX1VOTUFQUEFCTEUgfHwgY29kZWQgPT0gTUFQX01VTFRJUExFX0FWQUlMKQorICAgICAgICByZXR1cm4gY29kZWQ7CisgICAgZWxzZSBpZiAoY29kZWQgJiAweDgwMDApCisgICAgICAgIHJldHVybiBNQVBfVU5NQVBQQUJMRTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBjb2RlZDsKIH0KIAogc3RhdGljIERCQ0hBUgogamlzeDAyMTNfMjAwNF8xX2VuY29kZXJfcGFpcm9ubHkoY29uc3QgdWNzNF90ICpkYXRhLCBQeV9zc2l6ZV90ICpsZW5ndGgpCiB7Ci0JREJDSEFSIGNvZGVkOwotCVB5X3NzaXplX3QgaWxlbmd0aCA9ICpsZW5ndGg7CisgICAgREJDSEFSIGNvZGVkOworICAgIFB5X3NzaXplX3QgaWxlbmd0aCA9ICpsZW5ndGg7CiAKLQljb2RlZCA9IGppc3gwMjEzX2VuY29kZXIoZGF0YSwgbGVuZ3RoLCBOVUxMKTsKLQlzd2l0Y2ggKGlsZW5ndGgpIHsKLQljYXNlIDE6Ci0JCWlmIChjb2RlZCA9PSBNQVBfTVVMVElQTEVfQVZBSUwpCi0JCQlyZXR1cm4gTUFQX01VTFRJUExFX0FWQUlMOwotCQllbHNlCi0JCQlyZXR1cm4gTUFQX1VOTUFQUEFCTEU7Ci0JY2FzZSAyOgotCQlpZiAoKmxlbmd0aCAhPSAyKQotCQkJcmV0dXJuIE1BUF9VTk1BUFBBQkxFOwotCQllbHNlCi0JCQlyZXR1cm4gY29kZWQ7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIE1BUF9VTk1BUFBBQkxFOwotCX0KKyAgICBjb2RlZCA9IGppc3gwMjEzX2VuY29kZXIoZGF0YSwgbGVuZ3RoLCBOVUxMKTsKKyAgICBzd2l0Y2ggKGlsZW5ndGgpIHsKKyAgICBjYXNlIDE6CisgICAgICAgIGlmIChjb2RlZCA9PSBNQVBfTVVMVElQTEVfQVZBSUwpCisgICAgICAgICAgICByZXR1cm4gTUFQX01VTFRJUExFX0FWQUlMOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gTUFQX1VOTUFQUEFCTEU7CisgICAgY2FzZSAyOgorICAgICAgICBpZiAoKmxlbmd0aCAhPSAyKQorICAgICAgICAgICAgcmV0dXJuIE1BUF9VTk1BUFBBQkxFOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gY29kZWQ7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIE1BUF9VTk1BUFBBQkxFOworICAgIH0KIH0KIAogc3RhdGljIERCQ0hBUgogamlzeDAyMTNfMjAwNF8yX2VuY29kZXIoY29uc3QgdWNzNF90ICpkYXRhLCBQeV9zc2l6ZV90ICpsZW5ndGgpCiB7Ci0JREJDSEFSIGNvZGVkID0gamlzeDAyMTNfZW5jb2RlcihkYXRhLCBsZW5ndGgsIE5VTEwpOwotCWlmIChjb2RlZCA9PSBNQVBfVU5NQVBQQUJMRSB8fCBjb2RlZCA9PSBNQVBfTVVMVElQTEVfQVZBSUwpCi0JCXJldHVybiBjb2RlZDsKLQllbHNlIGlmIChjb2RlZCAmIDB4ODAwMCkKLQkJcmV0dXJuIGNvZGVkICYgMHg3ZmZmOwotCWVsc2UKLQkJcmV0dXJuIE1BUF9VTk1BUFBBQkxFOworICAgIERCQ0hBUiBjb2RlZCA9IGppc3gwMjEzX2VuY29kZXIoZGF0YSwgbGVuZ3RoLCBOVUxMKTsKKyAgICBpZiAoY29kZWQgPT0gTUFQX1VOTUFQUEFCTEUgfHwgY29kZWQgPT0gTUFQX01VTFRJUExFX0FWQUlMKQorICAgICAgICByZXR1cm4gY29kZWQ7CisgICAgZWxzZSBpZiAoY29kZWQgJiAweDgwMDApCisgICAgICAgIHJldHVybiBjb2RlZCAmIDB4N2ZmZjsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBNQVBfVU5NQVBQQUJMRTsKIH0KIAogc3RhdGljIHVjczRfdAogamlzeDAyMDFfcl9kZWNvZGVyKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEpCiB7Ci0JdWNzNF90IHU7Ci0JSklTWDAyMDFfUl9ERUNPREUoKmRhdGEsIHUpCi0JZWxzZSByZXR1cm4gTUFQX1VOTUFQUEFCTEU7Ci0JcmV0dXJuIHU7CisgICAgdWNzNF90IHU7CisgICAgSklTWDAyMDFfUl9ERUNPREUoKmRhdGEsIHUpCisgICAgZWxzZSByZXR1cm4gTUFQX1VOTUFQUEFCTEU7CisgICAgcmV0dXJuIHU7CiB9CiAKIHN0YXRpYyBEQkNIQVIKIGppc3gwMjAxX3JfZW5jb2Rlcihjb25zdCB1Y3M0X3QgKmRhdGEsIFB5X3NzaXplX3QgKmxlbmd0aCkKIHsKLQlEQkNIQVIgY29kZWQ7Ci0JSklTWDAyMDFfUl9FTkNPREUoKmRhdGEsIGNvZGVkKQotCWVsc2UgcmV0dXJuIE1BUF9VTk1BUFBBQkxFOwotCXJldHVybiBjb2RlZDsKKyAgICBEQkNIQVIgY29kZWQ7CisgICAgSklTWDAyMDFfUl9FTkNPREUoKmRhdGEsIGNvZGVkKQorICAgIGVsc2UgcmV0dXJuIE1BUF9VTk1BUFBBQkxFOworICAgIHJldHVybiBjb2RlZDsKIH0KIAogc3RhdGljIHVjczRfdAogamlzeDAyMDFfa19kZWNvZGVyKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEpCiB7Ci0JdWNzNF90IHU7Ci0JSklTWDAyMDFfS19ERUNPREUoKmRhdGEgXiAweDgwLCB1KQotCWVsc2UgcmV0dXJuIE1BUF9VTk1BUFBBQkxFOwotCXJldHVybiB1OworICAgIHVjczRfdCB1OworICAgIEpJU1gwMjAxX0tfREVDT0RFKCpkYXRhIF4gMHg4MCwgdSkKKyAgICBlbHNlIHJldHVybiBNQVBfVU5NQVBQQUJMRTsKKyAgICByZXR1cm4gdTsKIH0KIAogc3RhdGljIERCQ0hBUgogamlzeDAyMDFfa19lbmNvZGVyKGNvbnN0IHVjczRfdCAqZGF0YSwgUHlfc3NpemVfdCAqbGVuZ3RoKQogewotCURCQ0hBUiBjb2RlZDsKLQlKSVNYMDIwMV9LX0VOQ09ERSgqZGF0YSwgY29kZWQpCi0JZWxzZSByZXR1cm4gTUFQX1VOTUFQUEFCTEU7Ci0JcmV0dXJuIGNvZGVkIC0gMHg4MDsKKyAgICBEQkNIQVIgY29kZWQ7CisgICAgSklTWDAyMDFfS19FTkNPREUoKmRhdGEsIGNvZGVkKQorICAgIGVsc2UgcmV0dXJuIE1BUF9VTk1BUFBBQkxFOworICAgIHJldHVybiBjb2RlZCAtIDB4ODA7CiB9CiAKIHN0YXRpYyBpbnQKIGdiMjMxMl9pbml0KHZvaWQpCiB7Ci0Jc3RhdGljIGludCBpbml0aWFsaXplZCA9IDA7CisgICAgc3RhdGljIGludCBpbml0aWFsaXplZCA9IDA7CiAKLQlpZiAoIWluaXRpYWxpemVkICYmICgKLQkJCUlNUE9SVF9NQVAoY24sIGdiY29tbW9uLCAmZ2Jjb21tb25fZW5jbWFwLCBOVUxMKSB8fAotCQkJSU1QT1JUX01BUChjbiwgZ2IyMzEyLCBOVUxMLCAmZ2IyMzEyX2RlY21hcCkpKQotCQlyZXR1cm4gLTE7Ci0JaW5pdGlhbGl6ZWQgPSAxOwotCXJldHVybiAwOworICAgIGlmICghaW5pdGlhbGl6ZWQgJiYgKAorICAgICAgICAgICAgICAgICAgICBJTVBPUlRfTUFQKGNuLCBnYmNvbW1vbiwgJmdiY29tbW9uX2VuY21hcCwgTlVMTCkgfHwKKyAgICAgICAgICAgICAgICAgICAgSU1QT1JUX01BUChjbiwgZ2IyMzEyLCBOVUxMLCAmZ2IyMzEyX2RlY21hcCkpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaW5pdGlhbGl6ZWQgPSAxOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgdWNzNF90CiBnYjIzMTJfZGVjb2Rlcihjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhKQogewotCXVjczRfdCB1OwotCVRSWU1BUF9ERUMoZ2IyMzEyLCB1LCBkYXRhWzBdLCBkYXRhWzFdKQotCQlyZXR1cm4gdTsKLQllbHNlCi0JCXJldHVybiBNQVBfVU5NQVBQQUJMRTsKKyAgICB1Y3M0X3QgdTsKKyAgICBUUllNQVBfREVDKGdiMjMxMiwgdSwgZGF0YVswXSwgZGF0YVsxXSkKKyAgICAgICAgcmV0dXJuIHU7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gTUFQX1VOTUFQUEFCTEU7CiB9CiAKIHN0YXRpYyBEQkNIQVIKIGdiMjMxMl9lbmNvZGVyKGNvbnN0IHVjczRfdCAqZGF0YSwgUHlfc3NpemVfdCAqbGVuZ3RoKQogewotCURCQ0hBUiBjb2RlZDsKLQlhc3NlcnQoKmxlbmd0aCA9PSAxKTsKLQlpZiAoKmRhdGEgPCAweDEwMDAwKSB7Ci0JCVRSWU1BUF9FTkMoZ2Jjb21tb24sIGNvZGVkLCAqZGF0YSkgewotCQkJaWYgKCEoY29kZWQgJiAweDgwMDApKQotCQkJCXJldHVybiBjb2RlZDsKLQkJfQotCX0KLQlyZXR1cm4gTUFQX1VOTUFQUEFCTEU7CisgICAgREJDSEFSIGNvZGVkOworICAgIGFzc2VydCgqbGVuZ3RoID09IDEpOworICAgIGlmICgqZGF0YSA8IDB4MTAwMDApIHsKKyAgICAgICAgVFJZTUFQX0VOQyhnYmNvbW1vbiwgY29kZWQsICpkYXRhKSB7CisgICAgICAgICAgICBpZiAoIShjb2RlZCAmIDB4ODAwMCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGNvZGVkOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBNQVBfVU5NQVBQQUJMRTsKIH0KIAogCiBzdGF0aWMgdWNzNF90CiBkdW1teV9kZWNvZGVyKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEpCiB7Ci0JcmV0dXJuIE1BUF9VTk1BUFBBQkxFOworICAgIHJldHVybiBNQVBfVU5NQVBQQUJMRTsKIH0KIAogc3RhdGljIERCQ0hBUgogZHVtbXlfZW5jb2Rlcihjb25zdCB1Y3M0X3QgKmRhdGEsIFB5X3NzaXplX3QgKmxlbmd0aCkKIHsKLQlyZXR1cm4gTUFQX1VOTUFQUEFCTEU7CisgICAgcmV0dXJuIE1BUF9VTk1BUFBBQkxFOwogfQogCiAvKi0qLSByZWdpc3RyeSB0YWJsZXMgLSotKi8KIAotI2RlZmluZSBSRUdJU1RSWV9LU1gxMDAxX0cwCXsgQ0hBUlNFVF9LU1gxMDAxLCAwLCAyLAkJXAotCQkJCSAga3N4MTAwMV9pbml0LAkJCQlcCi0JCQkJICBrc3gxMDAxX2RlY29kZXIsIGtzeDEwMDFfZW5jb2RlciB9Ci0jZGVmaW5lIFJFR0lTVFJZX0tTWDEwMDFfRzEJeyBDSEFSU0VUX0tTWDEwMDEsIDEsIDIsCQlcCi0JCQkJICBrc3gxMDAxX2luaXQsCQkJCVwKLQkJCQkgIGtzeDEwMDFfZGVjb2Rlciwga3N4MTAwMV9lbmNvZGVyIH0KLSNkZWZpbmUgUkVHSVNUUllfSklTWDAyMDFfUgl7IENIQVJTRVRfSklTWDAyMDFfUiwgMCwgMSwJCVwKLQkJCQkgIE5VTEwsCQkJCQlcCi0JCQkJICBqaXN4MDIwMV9yX2RlY29kZXIsIGppc3gwMjAxX3JfZW5jb2RlciB9Ci0jZGVmaW5lIFJFR0lTVFJZX0pJU1gwMjAxX0sJeyBDSEFSU0VUX0pJU1gwMjAxX0ssIDAsIDEsCQlcCi0JCQkJICBOVUxMLAkJCQkJXAotCQkJCSAgamlzeDAyMDFfa19kZWNvZGVyLCBqaXN4MDIwMV9rX2VuY29kZXIgfQotI2RlZmluZSBSRUdJU1RSWV9KSVNYMDIwOAl7IENIQVJTRVRfSklTWDAyMDgsIDAsIDIsCQlcCi0JCQkJICBqaXN4MDIwOF9pbml0LAkJCVwKLQkJCQkgIGppc3gwMjA4X2RlY29kZXIsIGppc3gwMjA4X2VuY29kZXIgfQotI2RlZmluZSBSRUdJU1RSWV9KSVNYMDIwOF9PCXsgQ0hBUlNFVF9KSVNYMDIwOF9PLCAwLCAyLAkJXAotCQkJCSAgamlzeDAyMDhfaW5pdCwJCQlcCi0JCQkJICBqaXN4MDIwOF9kZWNvZGVyLCBqaXN4MDIwOF9lbmNvZGVyIH0KLSNkZWZpbmUgUkVHSVNUUllfSklTWDAyMTIJeyBDSEFSU0VUX0pJU1gwMjEyLCAwLCAyLAkJXAotCQkJCSAgamlzeDAyMTJfaW5pdCwJCQlcCi0JCQkJICBqaXN4MDIxMl9kZWNvZGVyLCBqaXN4MDIxMl9lbmNvZGVyIH0KLSNkZWZpbmUgUkVHSVNUUllfSklTWDAyMTNfMjAwMF8xIHsgQ0hBUlNFVF9KSVNYMDIxM18yMDAwXzEsIDAsIDIsCVwKLQkJCQkgIGppc3gwMjEzX2luaXQsCQkJXAotCQkJCSAgamlzeDAyMTNfMjAwMF8xX2RlY29kZXIsCQlcCi0JCQkJICBqaXN4MDIxM18yMDAwXzFfZW5jb2RlciB9CisjZGVmaW5lIFJFR0lTVFJZX0tTWDEwMDFfRzAgICAgIHsgQ0hBUlNFVF9LU1gxMDAxLCAwLCAyLCAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBrc3gxMDAxX2luaXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBrc3gxMDAxX2RlY29kZXIsIGtzeDEwMDFfZW5jb2RlciB9CisjZGVmaW5lIFJFR0lTVFJZX0tTWDEwMDFfRzEgICAgIHsgQ0hBUlNFVF9LU1gxMDAxLCAxLCAyLCAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBrc3gxMDAxX2luaXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBrc3gxMDAxX2RlY29kZXIsIGtzeDEwMDFfZW5jb2RlciB9CisjZGVmaW5lIFJFR0lTVFJZX0pJU1gwMjAxX1IgICAgIHsgQ0hBUlNFVF9KSVNYMDIwMV9SLCAwLCAxLCAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBqaXN4MDIwMV9yX2RlY29kZXIsIGppc3gwMjAxX3JfZW5jb2RlciB9CisjZGVmaW5lIFJFR0lTVFJZX0pJU1gwMjAxX0sgICAgIHsgQ0hBUlNFVF9KSVNYMDIwMV9LLCAwLCAxLCAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBqaXN4MDIwMV9rX2RlY29kZXIsIGppc3gwMjAxX2tfZW5jb2RlciB9CisjZGVmaW5lIFJFR0lTVFJZX0pJU1gwMjA4ICAgICAgIHsgQ0hBUlNFVF9KSVNYMDIwOCwgMCwgMiwgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBqaXN4MDIwOF9pbml0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBqaXN4MDIwOF9kZWNvZGVyLCBqaXN4MDIwOF9lbmNvZGVyIH0KKyNkZWZpbmUgUkVHSVNUUllfSklTWDAyMDhfTyAgICAgeyBDSEFSU0VUX0pJU1gwMjA4X08sIDAsIDIsICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIGppc3gwMjA4X2luaXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIGppc3gwMjA4X2RlY29kZXIsIGppc3gwMjA4X2VuY29kZXIgfQorI2RlZmluZSBSRUdJU1RSWV9KSVNYMDIxMiAgICAgICB7IENIQVJTRVRfSklTWDAyMTIsIDAsIDIsICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgamlzeDAyMTJfaW5pdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgamlzeDAyMTJfZGVjb2RlciwgamlzeDAyMTJfZW5jb2RlciB9CisjZGVmaW5lIFJFR0lTVFJZX0pJU1gwMjEzXzIwMDBfMSB7IENIQVJTRVRfSklTWDAyMTNfMjAwMF8xLCAwLCAyLCAgICAgICBcCisgICAgICAgICAgICAgICAgICBqaXN4MDIxM19pbml0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBqaXN4MDIxM18yMDAwXzFfZGVjb2RlciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBqaXN4MDIxM18yMDAwXzFfZW5jb2RlciB9CiAjZGVmaW5lIFJFR0lTVFJZX0pJU1gwMjEzXzIwMDBfMV9QQUlST05MWSB7IENIQVJTRVRfSklTWDAyMTNfMjAwMF8xLCAwLCAyLCBcCi0JCQkJICBqaXN4MDIxM19pbml0LAkJCVwKLQkJCQkgIGppc3gwMjEzXzIwMDBfMV9kZWNvZGVyLAkJXAotCQkJCSAgamlzeDAyMTNfMjAwMF8xX2VuY29kZXJfcGFpcm9ubHkgfQotI2RlZmluZSBSRUdJU1RSWV9KSVNYMDIxM18yMDAwXzIgeyBDSEFSU0VUX0pJU1gwMjEzXzIsIDAsIDIsCQlcCi0JCQkJICBqaXN4MDIxM19pbml0LAkJCVwKLQkJCQkgIGppc3gwMjEzXzIwMDBfMl9kZWNvZGVyLAkJXAotCQkJCSAgamlzeDAyMTNfMjAwMF8yX2VuY29kZXIgfQotI2RlZmluZSBSRUdJU1RSWV9KSVNYMDIxM18yMDA0XzEgeyBDSEFSU0VUX0pJU1gwMjEzXzIwMDRfMSwgMCwgMiwJXAotCQkJCSAgamlzeDAyMTNfaW5pdCwJCQlcCi0JCQkJICBqaXN4MDIxM18yMDA0XzFfZGVjb2RlciwJCVwKLQkJCQkgIGppc3gwMjEzXzIwMDRfMV9lbmNvZGVyIH0KKyAgICAgICAgICAgICAgICAgIGppc3gwMjEzX2luaXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIGppc3gwMjEzXzIwMDBfMV9kZWNvZGVyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIGppc3gwMjEzXzIwMDBfMV9lbmNvZGVyX3BhaXJvbmx5IH0KKyNkZWZpbmUgUkVHSVNUUllfSklTWDAyMTNfMjAwMF8yIHsgQ0hBUlNFVF9KSVNYMDIxM18yLCAwLCAyLCAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIGppc3gwMjEzX2luaXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIGppc3gwMjEzXzIwMDBfMl9kZWNvZGVyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIGppc3gwMjEzXzIwMDBfMl9lbmNvZGVyIH0KKyNkZWZpbmUgUkVHSVNUUllfSklTWDAyMTNfMjAwNF8xIHsgQ0hBUlNFVF9KSVNYMDIxM18yMDA0XzEsIDAsIDIsICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIGppc3gwMjEzX2luaXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIGppc3gwMjEzXzIwMDRfMV9kZWNvZGVyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIGppc3gwMjEzXzIwMDRfMV9lbmNvZGVyIH0KICNkZWZpbmUgUkVHSVNUUllfSklTWDAyMTNfMjAwNF8xX1BBSVJPTkxZIHsgQ0hBUlNFVF9KSVNYMDIxM18yMDA0XzEsIDAsIDIsIFwKLQkJCQkgIGppc3gwMjEzX2luaXQsCQkJXAotCQkJCSAgamlzeDAyMTNfMjAwNF8xX2RlY29kZXIsCQlcCi0JCQkJICBqaXN4MDIxM18yMDA0XzFfZW5jb2Rlcl9wYWlyb25seSB9Ci0jZGVmaW5lIFJFR0lTVFJZX0pJU1gwMjEzXzIwMDRfMiB7IENIQVJTRVRfSklTWDAyMTNfMiwgMCwgMiwJCVwKLQkJCQkgIGppc3gwMjEzX2luaXQsCQkJXAotCQkJCSAgamlzeDAyMTNfMjAwNF8yX2RlY29kZXIsCQlcCi0JCQkJICBqaXN4MDIxM18yMDA0XzJfZW5jb2RlciB9Ci0jZGVmaW5lIFJFR0lTVFJZX0dCMjMxMgkJeyBDSEFSU0VUX0dCMjMxMiwgMCwgMiwJCQlcCi0JCQkJICBnYjIzMTJfaW5pdCwJCQkJXAotCQkJCSAgZ2IyMzEyX2RlY29kZXIsIGdiMjMxMl9lbmNvZGVyIH0KLSNkZWZpbmUgUkVHSVNUUllfQ05TMTE2NDNfMQl7IENIQVJTRVRfQ05TMTE2NDNfMSwgMSwgMiwJCVwKLQkJCQkgIGNuczExNjQzX2luaXQsCQkJXAotCQkJCSAgY25zMTE2NDNfMV9kZWNvZGVyLCBjbnMxMTY0M18xX2VuY29kZXIgfQotI2RlZmluZSBSRUdJU1RSWV9DTlMxMTY0M18yCXsgQ0hBUlNFVF9DTlMxMTY0M18yLCAyLCAyLAkJXAotCQkJCSAgY25zMTE2NDNfaW5pdCwJCQlcCi0JCQkJICBjbnMxMTY0M18yX2RlY29kZXIsIGNuczExNjQzXzJfZW5jb2RlciB9Ci0jZGVmaW5lIFJFR0lTVFJZX0lTTzg4NTlfMQl7IENIQVJTRVRfSVNPODg1OV8xLCAyLCAxLAkJXAotCQkJCSAgTlVMTCwgZHVtbXlfZGVjb2RlciwgZHVtbXlfZW5jb2RlciB9Ci0jZGVmaW5lIFJFR0lTVFJZX0lTTzg4NTlfNwl7IENIQVJTRVRfSVNPODg1OV83LCAyLCAxLAkJXAotCQkJCSAgTlVMTCwgZHVtbXlfZGVjb2RlciwgZHVtbXlfZW5jb2RlciB9Ci0jZGVmaW5lIFJFR0lTVFJZX1NFTlRJTkVMCXsgMCwgfQotI2RlZmluZSBDT05GSUdERUYodmFyLCBhdHRycykJCQkJCQlcCi0Jc3RhdGljIGNvbnN0IHN0cnVjdCBpc28yMDIyX2NvbmZpZyBpc28yMDIyXyMjdmFyIyNfY29uZmlnID0gewlcCi0JCWF0dHJzLCBpc28yMDIyXyMjdmFyIyNfZGVzaWduYXRpb25zCQkJXAotCX07CisgICAgICAgICAgICAgICAgICBqaXN4MDIxM19pbml0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBqaXN4MDIxM18yMDA0XzFfZGVjb2RlciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBqaXN4MDIxM18yMDA0XzFfZW5jb2Rlcl9wYWlyb25seSB9CisjZGVmaW5lIFJFR0lTVFJZX0pJU1gwMjEzXzIwMDRfMiB7IENIQVJTRVRfSklTWDAyMTNfMiwgMCwgMiwgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBqaXN4MDIxM19pbml0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBqaXN4MDIxM18yMDA0XzJfZGVjb2RlciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBqaXN4MDIxM18yMDA0XzJfZW5jb2RlciB9CisjZGVmaW5lIFJFR0lTVFJZX0dCMjMxMiAgICAgICAgIHsgQ0hBUlNFVF9HQjIzMTIsIDAsIDIsICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBnYjIzMTJfaW5pdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBnYjIzMTJfZGVjb2RlciwgZ2IyMzEyX2VuY29kZXIgfQorI2RlZmluZSBSRUdJU1RSWV9DTlMxMTY0M18xICAgICB7IENIQVJTRVRfQ05TMTE2NDNfMSwgMSwgMiwgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgY25zMTE2NDNfaW5pdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgY25zMTE2NDNfMV9kZWNvZGVyLCBjbnMxMTY0M18xX2VuY29kZXIgfQorI2RlZmluZSBSRUdJU1RSWV9DTlMxMTY0M18yICAgICB7IENIQVJTRVRfQ05TMTE2NDNfMiwgMiwgMiwgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgY25zMTE2NDNfaW5pdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgY25zMTE2NDNfMl9kZWNvZGVyLCBjbnMxMTY0M18yX2VuY29kZXIgfQorI2RlZmluZSBSRUdJU1RSWV9JU084ODU5XzEgICAgICB7IENIQVJTRVRfSVNPODg1OV8xLCAyLCAxLCAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgTlVMTCwgZHVtbXlfZGVjb2RlciwgZHVtbXlfZW5jb2RlciB9CisjZGVmaW5lIFJFR0lTVFJZX0lTTzg4NTlfNyAgICAgIHsgQ0hBUlNFVF9JU084ODU5XzcsIDIsIDEsICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBOVUxMLCBkdW1teV9kZWNvZGVyLCBkdW1teV9lbmNvZGVyIH0KKyNkZWZpbmUgUkVHSVNUUllfU0VOVElORUwgICAgICAgeyAwLCB9CisjZGVmaW5lIENPTkZJR0RFRih2YXIsIGF0dHJzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RhdGljIGNvbnN0IHN0cnVjdCBpc28yMDIyX2NvbmZpZyBpc28yMDIyXyMjdmFyIyNfY29uZmlnID0geyAgICAgICBcCisgICAgICAgIGF0dHJzLCBpc28yMDIyXyMjdmFyIyNfZGVzaWduYXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpc28yMDIyX2Rlc2lnbmF0aW9uIGlzbzIwMjJfa3JfZGVzaWduYXRpb25zW10gPSB7Ci0JUkVHSVNUUllfS1NYMTAwMV9HMSwgUkVHSVNUUllfU0VOVElORUwKKyAgICBSRUdJU1RSWV9LU1gxMDAxX0cxLCBSRUdJU1RSWV9TRU5USU5FTAogfTsKIENPTkZJR0RFRihrciwgMCkKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpc28yMDIyX2Rlc2lnbmF0aW9uIGlzbzIwMjJfanBfZGVzaWduYXRpb25zW10gPSB7Ci0JUkVHSVNUUllfSklTWDAyMDgsIFJFR0lTVFJZX0pJU1gwMjAxX1IsIFJFR0lTVFJZX0pJU1gwMjA4X08sCi0JUkVHSVNUUllfU0VOVElORUwKKyAgICBSRUdJU1RSWV9KSVNYMDIwOCwgUkVHSVNUUllfSklTWDAyMDFfUiwgUkVHSVNUUllfSklTWDAyMDhfTywKKyAgICBSRUdJU1RSWV9TRU5USU5FTAogfTsKIENPTkZJR0RFRihqcCwgTk9fU0hJRlQgfCBVU0VfSklTWDAyMDhfRVhUKQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGlzbzIwMjJfZGVzaWduYXRpb24gaXNvMjAyMl9qcF8xX2Rlc2lnbmF0aW9uc1tdID0gewotCVJFR0lTVFJZX0pJU1gwMjA4LCBSRUdJU1RSWV9KSVNYMDIxMiwgUkVHSVNUUllfSklTWDAyMDFfUiwKLQlSRUdJU1RSWV9KSVNYMDIwOF9PLCBSRUdJU1RSWV9TRU5USU5FTAorICAgIFJFR0lTVFJZX0pJU1gwMjA4LCBSRUdJU1RSWV9KSVNYMDIxMiwgUkVHSVNUUllfSklTWDAyMDFfUiwKKyAgICBSRUdJU1RSWV9KSVNYMDIwOF9PLCBSRUdJU1RSWV9TRU5USU5FTAogfTsKIENPTkZJR0RFRihqcF8xLCBOT19TSElGVCB8IFVTRV9KSVNYMDIwOF9FWFQpCiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaXNvMjAyMl9kZXNpZ25hdGlvbiBpc28yMDIyX2pwXzJfZGVzaWduYXRpb25zW10gPSB7Ci0JUkVHSVNUUllfSklTWDAyMDgsIFJFR0lTVFJZX0pJU1gwMjEyLCBSRUdJU1RSWV9LU1gxMDAxX0cwLAotCVJFR0lTVFJZX0dCMjMxMiwgUkVHSVNUUllfSklTWDAyMDFfUiwgUkVHSVNUUllfSklTWDAyMDhfTywKLQlSRUdJU1RSWV9JU084ODU5XzEsIFJFR0lTVFJZX0lTTzg4NTlfNywgUkVHSVNUUllfU0VOVElORUwKKyAgICBSRUdJU1RSWV9KSVNYMDIwOCwgUkVHSVNUUllfSklTWDAyMTIsIFJFR0lTVFJZX0tTWDEwMDFfRzAsCisgICAgUkVHSVNUUllfR0IyMzEyLCBSRUdJU1RSWV9KSVNYMDIwMV9SLCBSRUdJU1RSWV9KSVNYMDIwOF9PLAorICAgIFJFR0lTVFJZX0lTTzg4NTlfMSwgUkVHSVNUUllfSVNPODg1OV83LCBSRUdJU1RSWV9TRU5USU5FTAogfTsKIENPTkZJR0RFRihqcF8yLCBOT19TSElGVCB8IFVTRV9HMiB8IFVTRV9KSVNYMDIwOF9FWFQpCiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaXNvMjAyMl9kZXNpZ25hdGlvbiBpc28yMDIyX2pwXzIwMDRfZGVzaWduYXRpb25zW10gPSB7Ci0JUkVHSVNUUllfSklTWDAyMTNfMjAwNF8xX1BBSVJPTkxZLCBSRUdJU1RSWV9KSVNYMDIwOCwKLQlSRUdJU1RSWV9KSVNYMDIxM18yMDA0XzEsIFJFR0lTVFJZX0pJU1gwMjEzXzIwMDRfMiwgUkVHSVNUUllfU0VOVElORUwKKyAgICBSRUdJU1RSWV9KSVNYMDIxM18yMDA0XzFfUEFJUk9OTFksIFJFR0lTVFJZX0pJU1gwMjA4LAorICAgIFJFR0lTVFJZX0pJU1gwMjEzXzIwMDRfMSwgUkVHSVNUUllfSklTWDAyMTNfMjAwNF8yLCBSRUdJU1RSWV9TRU5USU5FTAogfTsKIENPTkZJR0RFRihqcF8yMDA0LCBOT19TSElGVCB8IFVTRV9KSVNYMDIwOF9FWFQpCiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaXNvMjAyMl9kZXNpZ25hdGlvbiBpc28yMDIyX2pwXzNfZGVzaWduYXRpb25zW10gPSB7Ci0JUkVHSVNUUllfSklTWDAyMTNfMjAwMF8xX1BBSVJPTkxZLCBSRUdJU1RSWV9KSVNYMDIwOCwKLQlSRUdJU1RSWV9KSVNYMDIxM18yMDAwXzEsIFJFR0lTVFJZX0pJU1gwMjEzXzIwMDBfMiwgUkVHSVNUUllfU0VOVElORUwKKyAgICBSRUdJU1RSWV9KSVNYMDIxM18yMDAwXzFfUEFJUk9OTFksIFJFR0lTVFJZX0pJU1gwMjA4LAorICAgIFJFR0lTVFJZX0pJU1gwMjEzXzIwMDBfMSwgUkVHSVNUUllfSklTWDAyMTNfMjAwMF8yLCBSRUdJU1RSWV9TRU5USU5FTAogfTsKIENPTkZJR0RFRihqcF8zLCBOT19TSElGVCB8IFVTRV9KSVNYMDIwOF9FWFQpCiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaXNvMjAyMl9kZXNpZ25hdGlvbiBpc28yMDIyX2pwX2V4dF9kZXNpZ25hdGlvbnNbXSA9IHsKLQlSRUdJU1RSWV9KSVNYMDIwOCwgUkVHSVNUUllfSklTWDAyMTIsIFJFR0lTVFJZX0pJU1gwMjAxX1IsCi0JUkVHSVNUUllfSklTWDAyMDFfSywgUkVHSVNUUllfSklTWDAyMDhfTywgUkVHSVNUUllfU0VOVElORUwKKyAgICBSRUdJU1RSWV9KSVNYMDIwOCwgUkVHSVNUUllfSklTWDAyMTIsIFJFR0lTVFJZX0pJU1gwMjAxX1IsCisgICAgUkVHSVNUUllfSklTWDAyMDFfSywgUkVHSVNUUllfSklTWDAyMDhfTywgUkVHSVNUUllfU0VOVElORUwKIH07CiBDT05GSUdERUYoanBfZXh0LCBOT19TSElGVCB8IFVTRV9KSVNYMDIwOF9FWFQpCiAKQEAgLTExMTEsMTEgKzExMTEsMTEgQEAKICAgLyogbm8gbWFwcGluZyB0YWJsZSBoZXJlICovCiBFTkRfTUFQUElOR1NfTElTVAogCi0jZGVmaW5lIElTTzIwMjJfQ09ERUModmFyaWF0aW9uKSB7CQlcCi0JImlzbzIwMjJfIiAjdmFyaWF0aW9uLAkJCVwKLQkmaXNvMjAyMl8jI3ZhcmlhdGlvbiMjX2NvbmZpZywJCVwKLQlpc28yMDIyX2NvZGVjX2luaXQsCQkJXAotCV9TVEFURUZVTF9NRVRIT0RTKGlzbzIwMjIpCQlcCisjZGVmaW5lIElTTzIwMjJfQ09ERUModmFyaWF0aW9uKSB7ICAgICAgICAgICAgICBcCisgICAgImlzbzIwMjJfIiAjdmFyaWF0aW9uLCAgICAgICAgICAgICAgICAgICAgICBcCisgICAgJmlzbzIwMjJfIyN2YXJpYXRpb24jI19jb25maWcsICAgICAgICAgICAgICBcCisgICAgaXNvMjAyMl9jb2RlY19pbml0LCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX1NUQVRFRlVMX01FVEhPRFMoaXNvMjAyMikgICAgICAgICAgICAgICAgICBcCiB9LAogCiBCRUdJTl9DT0RFQ1NfTElTVApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jamtjb2RlY3MvX2NvZGVjc19qcC5jIGIvTW9kdWxlcy9jamtjb2RlY3MvX2NvZGVjc19qcC5jCmluZGV4IGY0OWExMGIuLjkwMWQzYmUgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvY2prY29kZWNzL19jb2RlY3NfanAuYworKysgYi9Nb2R1bGVzL2Nqa2NvZGVjcy9fY29kZWNzX2pwLmMKQEAgLTE5LDEyNCArMTksMTI0IEBACiAKIEVOQ09ERVIoY3A5MzIpCiB7Ci0Jd2hpbGUgKGlubGVmdCA+IDApIHsKLQkJUHlfVU5JQ09ERSBjID0gSU4xOwotCQlEQkNIQVIgY29kZTsKLQkJdW5zaWduZWQgY2hhciBjMSwgYzI7CisgICAgd2hpbGUgKGlubGVmdCA+IDApIHsKKyAgICAgICAgUHlfVU5JQ09ERSBjID0gSU4xOworICAgICAgICBEQkNIQVIgY29kZTsKKyAgICAgICAgdW5zaWduZWQgY2hhciBjMSwgYzI7CiAKLQkJaWYgKGMgPD0gMHg4MCkgewotCQkJV1JJVEUxKCh1bnNpZ25lZCBjaGFyKWMpCi0JCQlORVhUKDEsIDEpCi0JCQljb250aW51ZTsKLQkJfQotCQllbHNlIGlmIChjID49IDB4ZmY2MSAmJiBjIDw9IDB4ZmY5ZikgewotCQkJV1JJVEUxKGMgLSAweGZlYzApCi0JCQlORVhUKDEsIDEpCi0JCQljb250aW51ZTsKLQkJfQotCQllbHNlIGlmIChjID49IDB4ZjhmMCAmJiBjIDw9IDB4ZjhmMykgewotCQkJLyogV2luZG93cyBjb21wYXRpYmlsaXR5ICovCi0JCQlSRVFVSVJFX09VVEJVRigxKQotCQkJaWYgKGMgPT0gMHhmOGYwKQotCQkJCU9VVDEoMHhhMCkKLQkJCWVsc2UKLQkJCQlPVVQxKGMgLSAweGZlZjEgKyAweGZkKQotCQkJTkVYVCgxLCAxKQotCQkJY29udGludWU7Ci0JCX0KKyAgICAgICAgaWYgKGMgPD0gMHg4MCkgeworICAgICAgICAgICAgV1JJVEUxKCh1bnNpZ25lZCBjaGFyKWMpCisgICAgICAgICAgICBORVhUKDEsIDEpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChjID49IDB4ZmY2MSAmJiBjIDw9IDB4ZmY5ZikgeworICAgICAgICAgICAgV1JJVEUxKGMgLSAweGZlYzApCisgICAgICAgICAgICBORVhUKDEsIDEpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChjID49IDB4ZjhmMCAmJiBjIDw9IDB4ZjhmMykgeworICAgICAgICAgICAgLyogV2luZG93cyBjb21wYXRpYmlsaXR5ICovCisgICAgICAgICAgICBSRVFVSVJFX09VVEJVRigxKQorICAgICAgICAgICAgaWYgKGMgPT0gMHhmOGYwKQorICAgICAgICAgICAgICAgIE9VVDEoMHhhMCkKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBPVVQxKGMgLSAweGZlZjEgKyAweGZkKQorICAgICAgICAgICAgTkVYVCgxLCAxKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KIAotCQlVQ1M0SU5WQUxJRChjKQotCQlSRVFVSVJFX09VVEJVRigyKQorICAgICAgICBVQ1M0SU5WQUxJRChjKQorICAgICAgICBSRVFVSVJFX09VVEJVRigyKQogCi0JCVRSWU1BUF9FTkMoY3A5MzJleHQsIGNvZGUsIGMpIHsKLQkJCU9VVDEoY29kZSA+PiA4KQotCQkJT1VUMihjb2RlICYgMHhmZikKLQkJfQotCQllbHNlIFRSWU1BUF9FTkMoamlzeGNvbW1vbiwgY29kZSwgYykgewotCQkJaWYgKGNvZGUgJiAweDgwMDApIC8qIE1TQiBzZXQ6IEpJUyBYIDAyMTIgKi8KLQkJCQlyZXR1cm4gMTsKKyAgICAgICAgVFJZTUFQX0VOQyhjcDkzMmV4dCwgY29kZSwgYykgeworICAgICAgICAgICAgT1VUMShjb2RlID4+IDgpCisgICAgICAgICAgICBPVVQyKGNvZGUgJiAweGZmKQorICAgICAgICB9CisgICAgICAgIGVsc2UgVFJZTUFQX0VOQyhqaXN4Y29tbW9uLCBjb2RlLCBjKSB7CisgICAgICAgICAgICBpZiAoY29kZSAmIDB4ODAwMCkgLyogTVNCIHNldDogSklTIFggMDIxMiAqLworICAgICAgICAgICAgICAgIHJldHVybiAxOwogCi0JCQkvKiBKSVMgWCAwMjA4ICovCi0JCQljMSA9IGNvZGUgPj4gODsKLQkJCWMyID0gY29kZSAmIDB4ZmY7Ci0JCQljMiA9ICgoKGMxIC0gMHgyMSkgJiAxKSA/IDB4NWUgOiAwKSArIChjMiAtIDB4MjEpOwotCQkJYzEgPSAoYzEgLSAweDIxKSA+PiAxOwotCQkJT1VUMShjMSA8IDB4MWYgPyBjMSArIDB4ODEgOiBjMSArIDB4YzEpCi0JCQlPVVQyKGMyIDwgMHgzZiA/IGMyICsgMHg0MCA6IGMyICsgMHg0MSkKLQkJfQotCQllbHNlIGlmIChjID49IDB4ZTAwMCAmJiBjIDwgMHhlNzU4KSB7Ci0JCQkvKiBVc2VyLWRlZmluZWQgYXJlYSAqLwotCQkJYzEgPSAoUHlfVU5JQ09ERSkoYyAtIDB4ZTAwMCkgLyAxODg7Ci0JCQljMiA9IChQeV9VTklDT0RFKShjIC0gMHhlMDAwKSAlIDE4ODsKLQkJCU9VVDEoYzEgKyAweGYwKQotCQkJT1VUMihjMiA8IDB4M2YgPyBjMiArIDB4NDAgOiBjMiArIDB4NDEpCi0JCX0KLQkJZWxzZQotCQkJcmV0dXJuIDE7CisgICAgICAgICAgICAvKiBKSVMgWCAwMjA4ICovCisgICAgICAgICAgICBjMSA9IGNvZGUgPj4gODsKKyAgICAgICAgICAgIGMyID0gY29kZSAmIDB4ZmY7CisgICAgICAgICAgICBjMiA9ICgoKGMxIC0gMHgyMSkgJiAxKSA/IDB4NWUgOiAwKSArIChjMiAtIDB4MjEpOworICAgICAgICAgICAgYzEgPSAoYzEgLSAweDIxKSA+PiAxOworICAgICAgICAgICAgT1VUMShjMSA8IDB4MWYgPyBjMSArIDB4ODEgOiBjMSArIDB4YzEpCisgICAgICAgICAgICBPVVQyKGMyIDwgMHgzZiA/IGMyICsgMHg0MCA6IGMyICsgMHg0MSkKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChjID49IDB4ZTAwMCAmJiBjIDwgMHhlNzU4KSB7CisgICAgICAgICAgICAvKiBVc2VyLWRlZmluZWQgYXJlYSAqLworICAgICAgICAgICAgYzEgPSAoUHlfVU5JQ09ERSkoYyAtIDB4ZTAwMCkgLyAxODg7CisgICAgICAgICAgICBjMiA9IChQeV9VTklDT0RFKShjIC0gMHhlMDAwKSAlIDE4ODsKKyAgICAgICAgICAgIE9VVDEoYzEgKyAweGYwKQorICAgICAgICAgICAgT1VUMihjMiA8IDB4M2YgPyBjMiArIDB4NDAgOiBjMiArIDB4NDEpCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIDE7CiAKLQkJTkVYVCgxLCAyKQotCX0KKyAgICAgICAgTkVYVCgxLCAyKQorICAgIH0KIAotCXJldHVybiAwOworICAgIHJldHVybiAwOwogfQogCiBERUNPREVSKGNwOTMyKQogewotCXdoaWxlIChpbmxlZnQgPiAwKSB7Ci0JCXVuc2lnbmVkIGNoYXIgYyA9IElOMSwgYzI7CisgICAgd2hpbGUgKGlubGVmdCA+IDApIHsKKyAgICAgICAgdW5zaWduZWQgY2hhciBjID0gSU4xLCBjMjsKIAotCQlSRVFVSVJFX09VVEJVRigxKQotCQlpZiAoYyA8PSAweDgwKSB7Ci0JCQlPVVQxKGMpCi0JCQlORVhUKDEsIDEpCi0JCQljb250aW51ZTsKLQkJfQotCQllbHNlIGlmIChjID49IDB4YTAgJiYgYyA8PSAweGRmKSB7Ci0JCQlpZiAoYyA9PSAweGEwKQotCQkJCU9VVDEoMHhmOGYwKSAvKiBoYWxmLXdpZHRoIGthdGFrYW5hICovCi0JCQllbHNlCi0JCQkJT1VUMSgweGZlYzAgKyBjKQotCQkJTkVYVCgxLCAxKQotCQkJY29udGludWU7Ci0JCX0KLQkJZWxzZSBpZiAoYyA+PSAweGZkLyogJiYgYyA8PSAweGZmKi8pIHsKLQkJCS8qIFdpbmRvd3MgY29tcGF0aWJpbGl0eSAqLwotCQkJT1VUMSgweGY4ZjEgLSAweGZkICsgYykKLQkJCU5FWFQoMSwgMSkKLQkJCWNvbnRpbnVlOwotCQl9CisgICAgICAgIFJFUVVJUkVfT1VUQlVGKDEpCisgICAgICAgIGlmIChjIDw9IDB4ODApIHsKKyAgICAgICAgICAgIE9VVDEoYykKKyAgICAgICAgICAgIE5FWFQoMSwgMSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGMgPj0gMHhhMCAmJiBjIDw9IDB4ZGYpIHsKKyAgICAgICAgICAgIGlmIChjID09IDB4YTApCisgICAgICAgICAgICAgICAgT1VUMSgweGY4ZjApIC8qIGhhbGYtd2lkdGgga2F0YWthbmEgKi8KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBPVVQxKDB4ZmVjMCArIGMpCisgICAgICAgICAgICBORVhUKDEsIDEpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChjID49IDB4ZmQvKiAmJiBjIDw9IDB4ZmYqLykgeworICAgICAgICAgICAgLyogV2luZG93cyBjb21wYXRpYmlsaXR5ICovCisgICAgICAgICAgICBPVVQxKDB4ZjhmMSAtIDB4ZmQgKyBjKQorICAgICAgICAgICAgTkVYVCgxLCAxKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KIAotCQlSRVFVSVJFX0lOQlVGKDIpCi0JCWMyID0gSU4yOworICAgICAgICBSRVFVSVJFX0lOQlVGKDIpCisgICAgICAgIGMyID0gSU4yOwogCi0JCVRSWU1BUF9ERUMoY3A5MzJleHQsICoqb3V0YnVmLCBjLCBjMik7Ci0JCWVsc2UgaWYgKChjID49IDB4ODEgJiYgYyA8PSAweDlmKSB8fCAoYyA+PSAweGUwICYmIGMgPD0gMHhlYSkpewotCQkJaWYgKGMyIDwgMHg0MCB8fCAoYzIgPiAweDdlICYmIGMyIDwgMHg4MCkgfHwgYzIgPiAweGZjKQotCQkJCXJldHVybiAyOworICAgICAgICBUUllNQVBfREVDKGNwOTMyZXh0LCAqKm91dGJ1ZiwgYywgYzIpOworICAgICAgICBlbHNlIGlmICgoYyA+PSAweDgxICYmIGMgPD0gMHg5ZikgfHwgKGMgPj0gMHhlMCAmJiBjIDw9IDB4ZWEpKXsKKyAgICAgICAgICAgIGlmIChjMiA8IDB4NDAgfHwgKGMyID4gMHg3ZSAmJiBjMiA8IDB4ODApIHx8IGMyID4gMHhmYykKKyAgICAgICAgICAgICAgICByZXR1cm4gMjsKIAotCQkJYyA9IChjIDwgMHhlMCA/IGMgLSAweDgxIDogYyAtIDB4YzEpOwotCQkJYzIgPSAoYzIgPCAweDgwID8gYzIgLSAweDQwIDogYzIgLSAweDQxKTsKLQkJCWMgPSAoMiAqIGMgKyAoYzIgPCAweDVlID8gMCA6IDEpICsgMHgyMSk7Ci0JCQljMiA9IChjMiA8IDB4NWUgPyBjMiA6IGMyIC0gMHg1ZSkgKyAweDIxOworICAgICAgICAgICAgYyA9IChjIDwgMHhlMCA/IGMgLSAweDgxIDogYyAtIDB4YzEpOworICAgICAgICAgICAgYzIgPSAoYzIgPCAweDgwID8gYzIgLSAweDQwIDogYzIgLSAweDQxKTsKKyAgICAgICAgICAgIGMgPSAoMiAqIGMgKyAoYzIgPCAweDVlID8gMCA6IDEpICsgMHgyMSk7CisgICAgICAgICAgICBjMiA9IChjMiA8IDB4NWUgPyBjMiA6IGMyIC0gMHg1ZSkgKyAweDIxOwogCi0JCQlUUllNQVBfREVDKGppc3gwMjA4LCAqKm91dGJ1ZiwgYywgYzIpOwotCQkJZWxzZSByZXR1cm4gMjsKLQkJfQotCQllbHNlIGlmIChjID49IDB4ZjAgJiYgYyA8PSAweGY5KSB7Ci0JCQlpZiAoKGMyID49IDB4NDAgJiYgYzIgPD0gMHg3ZSkgfHwKLQkJCSAgICAoYzIgPj0gMHg4MCAmJiBjMiA8PSAweGZjKSkKLQkJCQlPVVQxKDB4ZTAwMCArIDE4OCAqIChjIC0gMHhmMCkgKwotCQkJCSAgICAgKGMyIDwgMHg4MCA/IGMyIC0gMHg0MCA6IGMyIC0gMHg0MSkpCi0JCQllbHNlCi0JCQkJcmV0dXJuIDI7Ci0JCX0KLQkJZWxzZQotCQkJcmV0dXJuIDI7CisgICAgICAgICAgICBUUllNQVBfREVDKGppc3gwMjA4LCAqKm91dGJ1ZiwgYywgYzIpOworICAgICAgICAgICAgZWxzZSByZXR1cm4gMjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChjID49IDB4ZjAgJiYgYyA8PSAweGY5KSB7CisgICAgICAgICAgICBpZiAoKGMyID49IDB4NDAgJiYgYzIgPD0gMHg3ZSkgfHwKKyAgICAgICAgICAgICAgICAoYzIgPj0gMHg4MCAmJiBjMiA8PSAweGZjKSkKKyAgICAgICAgICAgICAgICBPVVQxKDB4ZTAwMCArIDE4OCAqIChjIC0gMHhmMCkgKworICAgICAgICAgICAgICAgICAgICAgKGMyIDwgMHg4MCA/IGMyIC0gMHg0MCA6IGMyIC0gMHg0MSkpCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIDI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIDI7CiAKLQkJTkVYVCgyLCAxKQotCX0KKyAgICAgICAgTkVYVCgyLCAxKQorICAgIH0KIAotCXJldHVybiAwOworICAgIHJldHVybiAwOwogfQogCiAKQEAgLTE0NiwxNjYgKzE0NiwxNjYgQEAKIAogRU5DT0RFUihldWNfamlzXzIwMDQpCiB7Ci0Jd2hpbGUgKGlubGVmdCA+IDApIHsKLQkJdWNzNF90IGMgPSBJTjE7Ci0JCURCQ0hBUiBjb2RlOwotCQlQeV9zc2l6ZV90IGluc2l6ZTsKKyAgICB3aGlsZSAoaW5sZWZ0ID4gMCkgeworICAgICAgICB1Y3M0X3QgYyA9IElOMTsKKyAgICAgICAgREJDSEFSIGNvZGU7CisgICAgICAgIFB5X3NzaXplX3QgaW5zaXplOwogCi0JCWlmIChjIDwgMHg4MCkgewotCQkJV1JJVEUxKGMpCi0JCQlORVhUKDEsIDEpCi0JCQljb250aW51ZTsKLQkJfQorICAgICAgICBpZiAoYyA8IDB4ODApIHsKKyAgICAgICAgICAgIFdSSVRFMShjKQorICAgICAgICAgICAgTkVYVCgxLCAxKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KIAotCQlERUNPREVfU1VSUk9HQVRFKGMpCi0JCWluc2l6ZSA9IEdFVF9JTlNJWkUoYyk7CisgICAgICAgIERFQ09ERV9TVVJST0dBVEUoYykKKyAgICAgICAgaW5zaXplID0gR0VUX0lOU0laRShjKTsKIAotCQlpZiAoYyA8PSAweEZGRkYpIHsKLQkJCUVNVUxBVEVfSklTWDAyMTNfMjAwMF9FTkNPREVfQk1QKGNvZGUsIGMpCi0JCQllbHNlIFRSWU1BUF9FTkMoamlzeDAyMTNfYm1wLCBjb2RlLCBjKSB7Ci0JCQkJaWYgKGNvZGUgPT0gTVVMVElDKSB7Ci0JCQkJCWlmIChpbmxlZnQgPCAyKSB7Ci0JCQkJCQlpZiAoZmxhZ3MgJiBNQkVOQ19GTFVTSCkgewotCQkJCQkJCWNvZGUgPSBmaW5kX3BhaXJlbmNtYXAoCi0JCQkJCQkJICAgICh1Y3MyX3QpYywgMCwKLQkJCQkJCQkgIGppc3gwMjEzX3BhaXJfZW5jbWFwLAotCQkJCQkJCSAgICBKSVNYMDIxM19FTkNQQUlSUyk7Ci0JCQkJCQkJaWYgKGNvZGUgPT0gREJDSU5WKQotCQkJCQkJCQlyZXR1cm4gMTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UKLQkJCQkJCQlyZXR1cm4gTUJFUlJfVE9PRkVXOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJY29kZSA9IGZpbmRfcGFpcmVuY21hcCgKLQkJCQkJCQkodWNzMl90KWMsICgqaW5idWYpWzFdLAotCQkJCQkJCWppc3gwMjEzX3BhaXJfZW5jbWFwLAotCQkJCQkJCUpJU1gwMjEzX0VOQ1BBSVJTKTsKLQkJCQkJCWlmIChjb2RlID09IERCQ0lOVikgewotCQkJCQkJCWNvZGUgPSBmaW5kX3BhaXJlbmNtYXAoCi0JCQkJCQkJICAgICh1Y3MyX3QpYywgMCwKLQkJCQkJCQkgIGppc3gwMjEzX3BhaXJfZW5jbWFwLAotCQkJCQkJCSAgICBKSVNYMDIxM19FTkNQQUlSUyk7Ci0JCQkJCQkJaWYgKGNvZGUgPT0gREJDSU5WKQotCQkJCQkJCQlyZXR1cm4gMTsKLQkJCQkJCX0gZWxzZQotCQkJCQkJCWluc2l6ZSA9IDI7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIFRSWU1BUF9FTkMoamlzeGNvbW1vbiwgY29kZSwgYyk7Ci0JCQllbHNlIGlmIChjID49IDB4ZmY2MSAmJiBjIDw9IDB4ZmY5ZikgewotCQkJCS8qIEpJUyBYIDAyMDEgaGFsZi13aWR0aCBrYXRha2FuYSAqLwotCQkJCVdSSVRFMigweDhlLCBjIC0gMHhmZWMwKQotCQkJCU5FWFQoMSwgMikKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWVsc2UgaWYgKGMgPT0gMHhmZjNjKQotCQkJCS8qIEYvVyBSRVZFUlNFIFNPTElEVVMgKHNlZSBOT1RFUykgKi8KLQkJCQljb2RlID0gMHgyMTQwOwotCQkJZWxzZSBpZiAoYyA9PSAweGZmNWUpCi0JCQkJLyogRi9XIFRJTERFIChzZWUgTk9URVMpICovCi0JCQkJY29kZSA9IDB4MjIzMjsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gMTsKLQkJfQotCQllbHNlIGlmIChjID4+IDE2ID09IEVNUEJBU0UgPj4gMTYpIHsKLQkJCUVNVUxBVEVfSklTWDAyMTNfMjAwMF9FTkNPREVfRU1QKGNvZGUsIGMpCi0JCQllbHNlIFRSWU1BUF9FTkMoamlzeDAyMTNfZW1wLCBjb2RlLCBjICYgMHhmZmZmKTsKLQkJCWVsc2UgcmV0dXJuIGluc2l6ZTsKLQkJfQotCQllbHNlCi0JCQlyZXR1cm4gaW5zaXplOworICAgICAgICBpZiAoYyA8PSAweEZGRkYpIHsKKyAgICAgICAgICAgIEVNVUxBVEVfSklTWDAyMTNfMjAwMF9FTkNPREVfQk1QKGNvZGUsIGMpCisgICAgICAgICAgICBlbHNlIFRSWU1BUF9FTkMoamlzeDAyMTNfYm1wLCBjb2RlLCBjKSB7CisgICAgICAgICAgICAgICAgaWYgKGNvZGUgPT0gTVVMVElDKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpbmxlZnQgPCAyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmxhZ3MgJiBNQkVOQ19GTFVTSCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBmaW5kX3BhaXJlbmNtYXAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1Y3MyX3QpYywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppc3gwMjEzX3BhaXJfZW5jbWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKSVNYMDIxM19FTkNQQUlSUyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgPT0gREJDSU5WKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTUJFUlJfVE9PRkVXOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IGZpbmRfcGFpcmVuY21hcCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWNzMl90KWMsICgqaW5idWYpWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppc3gwMjEzX3BhaXJfZW5jbWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpJU1gwMjEzX0VOQ1BBSVJTKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlID09IERCQ0lOVikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBmaW5kX3BhaXJlbmNtYXAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1Y3MyX3QpYywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppc3gwMjEzX3BhaXJfZW5jbWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKSVNYMDIxM19FTkNQQUlSUyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgPT0gREJDSU5WKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc2l6ZSA9IDI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIFRSWU1BUF9FTkMoamlzeGNvbW1vbiwgY29kZSwgYyk7CisgICAgICAgICAgICBlbHNlIGlmIChjID49IDB4ZmY2MSAmJiBjIDw9IDB4ZmY5ZikgeworICAgICAgICAgICAgICAgIC8qIEpJUyBYIDAyMDEgaGFsZi13aWR0aCBrYXRha2FuYSAqLworICAgICAgICAgICAgICAgIFdSSVRFMigweDhlLCBjIC0gMHhmZWMwKQorICAgICAgICAgICAgICAgIE5FWFQoMSwgMikKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGMgPT0gMHhmZjNjKQorICAgICAgICAgICAgICAgIC8qIEYvVyBSRVZFUlNFIFNPTElEVVMgKHNlZSBOT1RFUykgKi8KKyAgICAgICAgICAgICAgICBjb2RlID0gMHgyMTQwOworICAgICAgICAgICAgZWxzZSBpZiAoYyA9PSAweGZmNWUpCisgICAgICAgICAgICAgICAgLyogRi9XIFRJTERFIChzZWUgTk9URVMpICovCisgICAgICAgICAgICAgICAgY29kZSA9IDB4MjIzMjsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChjID4+IDE2ID09IEVNUEJBU0UgPj4gMTYpIHsKKyAgICAgICAgICAgIEVNVUxBVEVfSklTWDAyMTNfMjAwMF9FTkNPREVfRU1QKGNvZGUsIGMpCisgICAgICAgICAgICBlbHNlIFRSWU1BUF9FTkMoamlzeDAyMTNfZW1wLCBjb2RlLCBjICYgMHhmZmZmKTsKKyAgICAgICAgICAgIGVsc2UgcmV0dXJuIGluc2l6ZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gaW5zaXplOwogCi0JCWlmIChjb2RlICYgMHg4MDAwKSB7Ci0JCQkvKiBDb2Rlc2V0IDIgKi8KLQkJCVdSSVRFMygweDhmLCBjb2RlID4+IDgsIChjb2RlICYgMHhGRikgfCAweDgwKQotCQkJTkVYVChpbnNpemUsIDMpCi0JCX0gZWxzZSB7Ci0JCQkvKiBDb2Rlc2V0IDEgKi8KLQkJCVdSSVRFMigoY29kZSA+PiA4KSB8IDB4ODAsIChjb2RlICYgMHhGRikgfCAweDgwKQotCQkJTkVYVChpbnNpemUsIDIpCi0JCX0KLQl9CisgICAgICAgIGlmIChjb2RlICYgMHg4MDAwKSB7CisgICAgICAgICAgICAvKiBDb2Rlc2V0IDIgKi8KKyAgICAgICAgICAgIFdSSVRFMygweDhmLCBjb2RlID4+IDgsIChjb2RlICYgMHhGRikgfCAweDgwKQorICAgICAgICAgICAgTkVYVChpbnNpemUsIDMpCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBDb2Rlc2V0IDEgKi8KKyAgICAgICAgICAgIFdSSVRFMigoY29kZSA+PiA4KSB8IDB4ODAsIChjb2RlICYgMHhGRikgfCAweDgwKQorICAgICAgICAgICAgTkVYVChpbnNpemUsIDIpCisgICAgICAgIH0KKyAgICB9CiAKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKIH0KIAogREVDT0RFUihldWNfamlzXzIwMDQpCiB7Ci0Jd2hpbGUgKGlubGVmdCA+IDApIHsKLQkJdW5zaWduZWQgY2hhciBjID0gSU4xOwotCQl1Y3M0X3QgY29kZTsKKyAgICB3aGlsZSAoaW5sZWZ0ID4gMCkgeworICAgICAgICB1bnNpZ25lZCBjaGFyIGMgPSBJTjE7CisgICAgICAgIHVjczRfdCBjb2RlOwogCi0JCVJFUVVJUkVfT1VUQlVGKDEpCisgICAgICAgIFJFUVVJUkVfT1VUQlVGKDEpCiAKLQkJaWYgKGMgPCAweDgwKSB7Ci0JCQlPVVQxKGMpCi0JCQlORVhUKDEsIDEpCi0JCQljb250aW51ZTsKLQkJfQorICAgICAgICBpZiAoYyA8IDB4ODApIHsKKyAgICAgICAgICAgIE9VVDEoYykKKyAgICAgICAgICAgIE5FWFQoMSwgMSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CiAKLQkJaWYgKGMgPT0gMHg4ZSkgewotCQkJLyogSklTIFggMDIwMSBoYWxmLXdpZHRoIGthdGFrYW5hICovCi0JCQl1bnNpZ25lZCBjaGFyIGMyOworICAgICAgICBpZiAoYyA9PSAweDhlKSB7CisgICAgICAgICAgICAvKiBKSVMgWCAwMjAxIGhhbGYtd2lkdGgga2F0YWthbmEgKi8KKyAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgYzI7CiAKLQkJCVJFUVVJUkVfSU5CVUYoMikKLQkJCWMyID0gSU4yOwotCQkJaWYgKGMyID49IDB4YTEgJiYgYzIgPD0gMHhkZikgewotCQkJCU9VVDEoMHhmZWMwICsgYzIpCi0JCQkJTkVYVCgyLCAxKQotCQkJfQotCQkJZWxzZQotCQkJCXJldHVybiAyOwotCQl9Ci0JCWVsc2UgaWYgKGMgPT0gMHg4ZikgewotCQkJdW5zaWduZWQgY2hhciBjMiwgYzM7CisgICAgICAgICAgICBSRVFVSVJFX0lOQlVGKDIpCisgICAgICAgICAgICBjMiA9IElOMjsKKyAgICAgICAgICAgIGlmIChjMiA+PSAweGExICYmIGMyIDw9IDB4ZGYpIHsKKyAgICAgICAgICAgICAgICBPVVQxKDB4ZmVjMCArIGMyKQorICAgICAgICAgICAgICAgIE5FWFQoMiwgMSkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gMjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChjID09IDB4OGYpIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgYzIsIGMzOwogCi0JCQlSRVFVSVJFX0lOQlVGKDMpCi0JCQljMiA9IElOMiBeIDB4ODA7Ci0JCQljMyA9IElOMyBeIDB4ODA7CisgICAgICAgICAgICBSRVFVSVJFX0lOQlVGKDMpCisgICAgICAgICAgICBjMiA9IElOMiBeIDB4ODA7CisgICAgICAgICAgICBjMyA9IElOMyBeIDB4ODA7CiAKLQkJCS8qIEpJUyBYIDAyMTMgUGxhbmUgMiBvciBKSVMgWCAwMjEyIChzZWUgTk9URVMpICovCi0JCQlFTVVMQVRFX0pJU1gwMjEzXzIwMDBfREVDT0RFX1BMQU5FMigqKm91dGJ1ZiwgYzIsIGMzKQotCQkJZWxzZSBUUllNQVBfREVDKGppc3gwMjEzXzJfYm1wLCAqKm91dGJ1ZiwgYzIsIGMzKSA7Ci0JCQllbHNlIFRSWU1BUF9ERUMoamlzeDAyMTNfMl9lbXAsIGNvZGUsIGMyLCBjMykgewotCQkJCVdSSVRFVUNTNChFTVBCQVNFIHwgY29kZSkKLQkJCQlORVhUX0lOKDMpCi0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQllbHNlIFRSWU1BUF9ERUMoamlzeDAyMTIsICoqb3V0YnVmLCBjMiwgYzMpIDsKLQkJCWVsc2UgcmV0dXJuIDM7Ci0JCQlORVhUKDMsIDEpCi0JCX0KLQkJZWxzZSB7Ci0JCQl1bnNpZ25lZCBjaGFyIGMyOworICAgICAgICAgICAgLyogSklTIFggMDIxMyBQbGFuZSAyIG9yIEpJUyBYIDAyMTIgKHNlZSBOT1RFUykgKi8KKyAgICAgICAgICAgIEVNVUxBVEVfSklTWDAyMTNfMjAwMF9ERUNPREVfUExBTkUyKCoqb3V0YnVmLCBjMiwgYzMpCisgICAgICAgICAgICBlbHNlIFRSWU1BUF9ERUMoamlzeDAyMTNfMl9ibXAsICoqb3V0YnVmLCBjMiwgYzMpIDsKKyAgICAgICAgICAgIGVsc2UgVFJZTUFQX0RFQyhqaXN4MDIxM18yX2VtcCwgY29kZSwgYzIsIGMzKSB7CisgICAgICAgICAgICAgICAgV1JJVEVVQ1M0KEVNUEJBU0UgfCBjb2RlKQorICAgICAgICAgICAgICAgIE5FWFRfSU4oMykKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgVFJZTUFQX0RFQyhqaXN4MDIxMiwgKipvdXRidWYsIGMyLCBjMykgOworICAgICAgICAgICAgZWxzZSByZXR1cm4gMzsKKyAgICAgICAgICAgIE5FWFQoMywgMSkKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgYzI7CiAKLQkJCVJFUVVJUkVfSU5CVUYoMikKLQkJCWMgXj0gMHg4MDsKLQkJCWMyID0gSU4yIF4gMHg4MDsKKyAgICAgICAgICAgIFJFUVVJUkVfSU5CVUYoMikKKyAgICAgICAgICAgIGMgXj0gMHg4MDsKKyAgICAgICAgICAgIGMyID0gSU4yIF4gMHg4MDsKIAotCQkJLyogSklTIFggMDIxMyBQbGFuZSAxICovCi0JCQlFTVVMQVRFX0pJU1gwMjEzXzIwMDBfREVDT0RFX1BMQU5FMSgqKm91dGJ1ZiwgYywgYzIpCi0JCQllbHNlIGlmIChjID09IDB4MjEgJiYgYzIgPT0gMHg0MCkgKipvdXRidWYgPSAweGZmM2M7Ci0JCQllbHNlIGlmIChjID09IDB4MjIgJiYgYzIgPT0gMHgzMikgKipvdXRidWYgPSAweGZmNWU7Ci0JCQllbHNlIFRSWU1BUF9ERUMoamlzeDAyMDgsICoqb3V0YnVmLCBjLCBjMik7Ci0JCQllbHNlIFRSWU1BUF9ERUMoamlzeDAyMTNfMV9ibXAsICoqb3V0YnVmLCBjLCBjMik7Ci0JCQllbHNlIFRSWU1BUF9ERUMoamlzeDAyMTNfMV9lbXAsIGNvZGUsIGMsIGMyKSB7Ci0JCQkJV1JJVEVVQ1M0KEVNUEJBU0UgfCBjb2RlKQotCQkJCU5FWFRfSU4oMikKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWVsc2UgVFJZTUFQX0RFQyhqaXN4MDIxM19wYWlyLCBjb2RlLCBjLCBjMikgewotCQkJCVdSSVRFMihjb2RlID4+IDE2LCBjb2RlICYgMHhmZmZmKQotCQkJCU5FWFQoMiwgMikKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWVsc2UgcmV0dXJuIDI7Ci0JCQlORVhUKDIsIDEpCi0JCX0KLQl9CisgICAgICAgICAgICAvKiBKSVMgWCAwMjEzIFBsYW5lIDEgKi8KKyAgICAgICAgICAgIEVNVUxBVEVfSklTWDAyMTNfMjAwMF9ERUNPREVfUExBTkUxKCoqb3V0YnVmLCBjLCBjMikKKyAgICAgICAgICAgIGVsc2UgaWYgKGMgPT0gMHgyMSAmJiBjMiA9PSAweDQwKSAqKm91dGJ1ZiA9IDB4ZmYzYzsKKyAgICAgICAgICAgIGVsc2UgaWYgKGMgPT0gMHgyMiAmJiBjMiA9PSAweDMyKSAqKm91dGJ1ZiA9IDB4ZmY1ZTsKKyAgICAgICAgICAgIGVsc2UgVFJZTUFQX0RFQyhqaXN4MDIwOCwgKipvdXRidWYsIGMsIGMyKTsKKyAgICAgICAgICAgIGVsc2UgVFJZTUFQX0RFQyhqaXN4MDIxM18xX2JtcCwgKipvdXRidWYsIGMsIGMyKTsKKyAgICAgICAgICAgIGVsc2UgVFJZTUFQX0RFQyhqaXN4MDIxM18xX2VtcCwgY29kZSwgYywgYzIpIHsKKyAgICAgICAgICAgICAgICBXUklURVVDUzQoRU1QQkFTRSB8IGNvZGUpCisgICAgICAgICAgICAgICAgTkVYVF9JTigyKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBUUllNQVBfREVDKGppc3gwMjEzX3BhaXIsIGNvZGUsIGMsIGMyKSB7CisgICAgICAgICAgICAgICAgV1JJVEUyKGNvZGUgPj4gMTYsIGNvZGUgJiAweGZmZmYpCisgICAgICAgICAgICAgICAgTkVYVCgyLCAyKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSByZXR1cm4gMjsKKyAgICAgICAgICAgIE5FWFQoMiwgMSkKKyAgICAgICAgfQorICAgIH0KIAotCXJldHVybiAwOworICAgIHJldHVybiAwOwogfQogCiAKQEAgLTMxNSwxMTQgKzMxNSwxMTQgQEAKIAogRU5DT0RFUihldWNfanApCiB7Ci0Jd2hpbGUgKGlubGVmdCA+IDApIHsKLQkJUHlfVU5JQ09ERSBjID0gSU4xOwotCQlEQkNIQVIgY29kZTsKKyAgICB3aGlsZSAoaW5sZWZ0ID4gMCkgeworICAgICAgICBQeV9VTklDT0RFIGMgPSBJTjE7CisgICAgICAgIERCQ0hBUiBjb2RlOwogCi0JCWlmIChjIDwgMHg4MCkgewotCQkJV1JJVEUxKCh1bnNpZ25lZCBjaGFyKWMpCi0JCQlORVhUKDEsIDEpCi0JCQljb250aW51ZTsKLQkJfQorICAgICAgICBpZiAoYyA8IDB4ODApIHsKKyAgICAgICAgICAgIFdSSVRFMSgodW5zaWduZWQgY2hhciljKQorICAgICAgICAgICAgTkVYVCgxLCAxKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KIAotCQlVQ1M0SU5WQUxJRChjKQorICAgICAgICBVQ1M0SU5WQUxJRChjKQogCi0JCVRSWU1BUF9FTkMoamlzeGNvbW1vbiwgY29kZSwgYyk7Ci0JCWVsc2UgaWYgKGMgPj0gMHhmZjYxICYmIGMgPD0gMHhmZjlmKSB7Ci0JCQkvKiBKSVMgWCAwMjAxIGhhbGYtd2lkdGgga2F0YWthbmEgKi8KLQkJCVdSSVRFMigweDhlLCBjIC0gMHhmZWMwKQotCQkJTkVYVCgxLCAyKQotCQkJY29udGludWU7Ci0JCX0KKyAgICAgICAgVFJZTUFQX0VOQyhqaXN4Y29tbW9uLCBjb2RlLCBjKTsKKyAgICAgICAgZWxzZSBpZiAoYyA+PSAweGZmNjEgJiYgYyA8PSAweGZmOWYpIHsKKyAgICAgICAgICAgIC8qIEpJUyBYIDAyMDEgaGFsZi13aWR0aCBrYXRha2FuYSAqLworICAgICAgICAgICAgV1JJVEUyKDB4OGUsIGMgLSAweGZlYzApCisgICAgICAgICAgICBORVhUKDEsIDIpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQogI2lmbmRlZiBTVFJJQ1RfQlVJTEQKLQkJZWxzZSBpZiAoYyA9PSAweGZmM2MpIC8qIEZVTEwtV0lEVEggUkVWRVJTRSBTT0xJRFVTICovCi0JCQljb2RlID0gMHgyMTQwOwotCQllbHNlIGlmIChjID09IDB4YTUpIHsgLyogWUVOIFNJR04gKi8KLQkJCVdSSVRFMSgweDVjKTsKLQkJCU5FWFQoMSwgMSkKLQkJCWNvbnRpbnVlOwotCQl9IGVsc2UgaWYgKGMgPT0gMHgyMDNlKSB7IC8qIE9WRVJMSU5FICovCi0JCQlXUklURTEoMHg3ZSk7Ci0JCQlORVhUKDEsIDEpCi0JCQljb250aW51ZTsKLQkJfQorICAgICAgICBlbHNlIGlmIChjID09IDB4ZmYzYykgLyogRlVMTC1XSURUSCBSRVZFUlNFIFNPTElEVVMgKi8KKyAgICAgICAgICAgIGNvZGUgPSAweDIxNDA7CisgICAgICAgIGVsc2UgaWYgKGMgPT0gMHhhNSkgeyAvKiBZRU4gU0lHTiAqLworICAgICAgICAgICAgV1JJVEUxKDB4NWMpOworICAgICAgICAgICAgTkVYVCgxLCAxKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0gZWxzZSBpZiAoYyA9PSAweDIwM2UpIHsgLyogT1ZFUkxJTkUgKi8KKyAgICAgICAgICAgIFdSSVRFMSgweDdlKTsKKyAgICAgICAgICAgIE5FWFQoMSwgMSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CiAjZW5kaWYKLQkJZWxzZQotCQkJcmV0dXJuIDE7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiAxOwogCi0JCWlmIChjb2RlICYgMHg4MDAwKSB7Ci0JCQkvKiBKSVMgWCAwMjEyICovCi0JCQlXUklURTMoMHg4ZiwgY29kZSA+PiA4LCAoY29kZSAmIDB4RkYpIHwgMHg4MCkKLQkJCU5FWFQoMSwgMykKLQkJfSBlbHNlIHsKLQkJCS8qIEpJUyBYIDAyMDggKi8KLQkJCVdSSVRFMigoY29kZSA+PiA4KSB8IDB4ODAsIChjb2RlICYgMHhGRikgfCAweDgwKQotCQkJTkVYVCgxLCAyKQotCQl9Ci0JfQorICAgICAgICBpZiAoY29kZSAmIDB4ODAwMCkgeworICAgICAgICAgICAgLyogSklTIFggMDIxMiAqLworICAgICAgICAgICAgV1JJVEUzKDB4OGYsIGNvZGUgPj4gOCwgKGNvZGUgJiAweEZGKSB8IDB4ODApCisgICAgICAgICAgICBORVhUKDEsIDMpCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBKSVMgWCAwMjA4ICovCisgICAgICAgICAgICBXUklURTIoKGNvZGUgPj4gOCkgfCAweDgwLCAoY29kZSAmIDB4RkYpIHwgMHg4MCkKKyAgICAgICAgICAgIE5FWFQoMSwgMikKKyAgICAgICAgfQorICAgIH0KIAotCXJldHVybiAwOworICAgIHJldHVybiAwOwogfQogCiBERUNPREVSKGV1Y19qcCkKIHsKLQl3aGlsZSAoaW5sZWZ0ID4gMCkgewotCQl1bnNpZ25lZCBjaGFyIGMgPSBJTjE7CisgICAgd2hpbGUgKGlubGVmdCA+IDApIHsKKyAgICAgICAgdW5zaWduZWQgY2hhciBjID0gSU4xOwogCi0JCVJFUVVJUkVfT1VUQlVGKDEpCisgICAgICAgIFJFUVVJUkVfT1VUQlVGKDEpCiAKLQkJCWlmIChjIDwgMHg4MCkgewotCQkJCU9VVDEoYykKLQkJCQlORVhUKDEsIDEpCi0JCQkJY29udGludWU7Ci0JCQl9CisgICAgICAgICAgICBpZiAoYyA8IDB4ODApIHsKKyAgICAgICAgICAgICAgICBPVVQxKGMpCisgICAgICAgICAgICAgICAgTkVYVCgxLCAxKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQogCi0JCWlmIChjID09IDB4OGUpIHsKLQkJCS8qIEpJUyBYIDAyMDEgaGFsZi13aWR0aCBrYXRha2FuYSAqLwotCQkJdW5zaWduZWQgY2hhciBjMjsKKyAgICAgICAgaWYgKGMgPT0gMHg4ZSkgeworICAgICAgICAgICAgLyogSklTIFggMDIwMSBoYWxmLXdpZHRoIGthdGFrYW5hICovCisgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGMyOwogCi0JCQlSRVFVSVJFX0lOQlVGKDIpCi0JCQljMiA9IElOMjsKLQkJCWlmIChjMiA+PSAweGExICYmIGMyIDw9IDB4ZGYpIHsKLQkJCQlPVVQxKDB4ZmVjMCArIGMyKQotCQkJCU5FWFQoMiwgMSkKLQkJCX0KLQkJCWVsc2UKLQkJCQlyZXR1cm4gMjsKLQkJfQotCQllbHNlIGlmIChjID09IDB4OGYpIHsKLQkJCXVuc2lnbmVkIGNoYXIgYzIsIGMzOworICAgICAgICAgICAgUkVRVUlSRV9JTkJVRigyKQorICAgICAgICAgICAgYzIgPSBJTjI7CisgICAgICAgICAgICBpZiAoYzIgPj0gMHhhMSAmJiBjMiA8PSAweGRmKSB7CisgICAgICAgICAgICAgICAgT1VUMSgweGZlYzAgKyBjMikKKyAgICAgICAgICAgICAgICBORVhUKDIsIDEpCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIDI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoYyA9PSAweDhmKSB7CisgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGMyLCBjMzsKIAotCQkJUkVRVUlSRV9JTkJVRigzKQotCQkJYzIgPSBJTjI7Ci0JCQljMyA9IElOMzsKLQkJCS8qIEpJUyBYIDAyMTIgKi8KLQkJCVRSWU1BUF9ERUMoamlzeDAyMTIsICoqb3V0YnVmLCBjMiBeIDB4ODAsIGMzIF4gMHg4MCkgewotCQkJCU5FWFQoMywgMSkKLQkJCX0KLQkJCWVsc2UKLQkJCQlyZXR1cm4gMzsKLQkJfQotCQllbHNlIHsKLQkJCXVuc2lnbmVkIGNoYXIgYzI7CisgICAgICAgICAgICBSRVFVSVJFX0lOQlVGKDMpCisgICAgICAgICAgICBjMiA9IElOMjsKKyAgICAgICAgICAgIGMzID0gSU4zOworICAgICAgICAgICAgLyogSklTIFggMDIxMiAqLworICAgICAgICAgICAgVFJZTUFQX0RFQyhqaXN4MDIxMiwgKipvdXRidWYsIGMyIF4gMHg4MCwgYzMgXiAweDgwKSB7CisgICAgICAgICAgICAgICAgTkVYVCgzLCAxKQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiAzOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgdW5zaWduZWQgY2hhciBjMjsKIAotCQkJUkVRVUlSRV9JTkJVRigyKQotCQkJYzIgPSBJTjI7Ci0JCQkvKiBKSVMgWCAwMjA4ICovCisgICAgICAgICAgICBSRVFVSVJFX0lOQlVGKDIpCisgICAgICAgICAgICBjMiA9IElOMjsKKyAgICAgICAgICAgIC8qIEpJUyBYIDAyMDggKi8KICNpZm5kZWYgU1RSSUNUX0JVSUxECi0JCQlpZiAoYyA9PSAweGExICYmIGMyID09IDB4YzApCi0JCQkJLyogRlVMTC1XSURUSCBSRVZFUlNFIFNPTElEVVMgKi8KLQkJCQkqKm91dGJ1ZiA9IDB4ZmYzYzsKLQkJCWVsc2UKKyAgICAgICAgICAgIGlmIChjID09IDB4YTEgJiYgYzIgPT0gMHhjMCkKKyAgICAgICAgICAgICAgICAvKiBGVUxMLVdJRFRIIFJFVkVSU0UgU09MSURVUyAqLworICAgICAgICAgICAgICAgICoqb3V0YnVmID0gMHhmZjNjOworICAgICAgICAgICAgZWxzZQogI2VuZGlmCi0JCQkJVFJZTUFQX0RFQyhqaXN4MDIwOCwgKipvdXRidWYsCi0JCQkJCSAgIGMgXiAweDgwLCBjMiBeIDB4ODApIDsKLQkJCWVsc2UgcmV0dXJuIDI7Ci0JCQlORVhUKDIsIDEpCi0JCX0KLQl9CisgICAgICAgICAgICAgICAgVFJZTUFQX0RFQyhqaXN4MDIwOCwgKipvdXRidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjIF4gMHg4MCwgYzIgXiAweDgwKSA7CisgICAgICAgICAgICBlbHNlIHJldHVybiAyOworICAgICAgICAgICAgTkVYVCgyLCAxKQorICAgICAgICB9CisgICAgfQogCi0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiB9CiAKIApAQCAtNDMyLDEwNSArNDMyLDEwNSBAQAogCiBFTkNPREVSKHNoaWZ0X2ppcykKIHsKLQl3aGlsZSAoaW5sZWZ0ID4gMCkgewotCQlQeV9VTklDT0RFIGMgPSBJTjE7Ci0JCURCQ0hBUiBjb2RlOwotCQl1bnNpZ25lZCBjaGFyIGMxLCBjMjsKKyAgICB3aGlsZSAoaW5sZWZ0ID4gMCkgeworICAgICAgICBQeV9VTklDT0RFIGMgPSBJTjE7CisgICAgICAgIERCQ0hBUiBjb2RlOworICAgICAgICB1bnNpZ25lZCBjaGFyIGMxLCBjMjsKIAogI2lmZGVmIFNUUklDVF9CVUlMRAotCQlKSVNYMDIwMV9SX0VOQ09ERShjLCBjb2RlKQorICAgICAgICBKSVNYMDIwMV9SX0VOQ09ERShjLCBjb2RlKQogI2Vsc2UKLQkJaWYgKGMgPCAweDgwKSBjb2RlID0gYzsKLQkJZWxzZSBpZiAoYyA9PSAweDAwYTUpIGNvZGUgPSAweDVjOyAvKiBZRU4gU0lHTiAqLwotCQllbHNlIGlmIChjID09IDB4MjAzZSkgY29kZSA9IDB4N2U7IC8qIE9WRVJMSU5FICovCisgICAgICAgIGlmIChjIDwgMHg4MCkgY29kZSA9IGM7CisgICAgICAgIGVsc2UgaWYgKGMgPT0gMHgwMGE1KSBjb2RlID0gMHg1YzsgLyogWUVOIFNJR04gKi8KKyAgICAgICAgZWxzZSBpZiAoYyA9PSAweDIwM2UpIGNvZGUgPSAweDdlOyAvKiBPVkVSTElORSAqLwogI2VuZGlmCi0JCWVsc2UgSklTWDAyMDFfS19FTkNPREUoYywgY29kZSkKLQkJZWxzZSBVQ1M0SU5WQUxJRChjKQotCQllbHNlIGNvZGUgPSBOT0NIQVI7CisgICAgICAgIGVsc2UgSklTWDAyMDFfS19FTkNPREUoYywgY29kZSkKKyAgICAgICAgZWxzZSBVQ1M0SU5WQUxJRChjKQorICAgICAgICBlbHNlIGNvZGUgPSBOT0NIQVI7CiAKLQkJaWYgKGNvZGUgPCAweDgwIHx8IChjb2RlID49IDB4YTEgJiYgY29kZSA8PSAweGRmKSkgewotCQkJUkVRVUlSRV9PVVRCVUYoMSkKKyAgICAgICAgaWYgKGNvZGUgPCAweDgwIHx8IChjb2RlID49IDB4YTEgJiYgY29kZSA8PSAweGRmKSkgeworICAgICAgICAgICAgUkVRVUlSRV9PVVRCVUYoMSkKIAotCQkJT1VUMSgodW5zaWduZWQgY2hhciljb2RlKQotCQkJTkVYVCgxLCAxKQotCQkJY29udGludWU7Ci0JCX0KKyAgICAgICAgICAgIE9VVDEoKHVuc2lnbmVkIGNoYXIpY29kZSkKKyAgICAgICAgICAgIE5FWFQoMSwgMSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CiAKLQkJUkVRVUlSRV9PVVRCVUYoMikKKyAgICAgICAgUkVRVUlSRV9PVVRCVUYoMikKIAotCQlpZiAoY29kZSA9PSBOT0NIQVIpIHsKLQkJCVRSWU1BUF9FTkMoamlzeGNvbW1vbiwgY29kZSwgYyk7CisgICAgICAgIGlmIChjb2RlID09IE5PQ0hBUikgeworICAgICAgICAgICAgVFJZTUFQX0VOQyhqaXN4Y29tbW9uLCBjb2RlLCBjKTsKICNpZm5kZWYgU1RSSUNUX0JVSUxECi0JCQllbHNlIGlmIChjID09IDB4ZmYzYykKLQkJCQljb2RlID0gMHgyMTQwOyAvKiBGVUxMLVdJRFRIIFJFVkVSU0UgU09MSURVUyAqLworICAgICAgICAgICAgZWxzZSBpZiAoYyA9PSAweGZmM2MpCisgICAgICAgICAgICAgICAgY29kZSA9IDB4MjE0MDsgLyogRlVMTC1XSURUSCBSRVZFUlNFIFNPTElEVVMgKi8KICNlbmRpZgotCQkJZWxzZQotCQkJCXJldHVybiAxOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiAxOwogCi0JCQlpZiAoY29kZSAmIDB4ODAwMCkgLyogTVNCIHNldDogSklTIFggMDIxMiAqLwotCQkJCXJldHVybiAxOwotCQl9CisgICAgICAgICAgICBpZiAoY29kZSAmIDB4ODAwMCkgLyogTVNCIHNldDogSklTIFggMDIxMiAqLworICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CiAKLQkJYzEgPSBjb2RlID4+IDg7Ci0JCWMyID0gY29kZSAmIDB4ZmY7Ci0JCWMyID0gKCgoYzEgLSAweDIxKSAmIDEpID8gMHg1ZSA6IDApICsgKGMyIC0gMHgyMSk7Ci0JCWMxID0gKGMxIC0gMHgyMSkgPj4gMTsKLQkJT1VUMShjMSA8IDB4MWYgPyBjMSArIDB4ODEgOiBjMSArIDB4YzEpCi0JCU9VVDIoYzIgPCAweDNmID8gYzIgKyAweDQwIDogYzIgKyAweDQxKQotCQlORVhUKDEsIDIpCi0JfQorICAgICAgICBjMSA9IGNvZGUgPj4gODsKKyAgICAgICAgYzIgPSBjb2RlICYgMHhmZjsKKyAgICAgICAgYzIgPSAoKChjMSAtIDB4MjEpICYgMSkgPyAweDVlIDogMCkgKyAoYzIgLSAweDIxKTsKKyAgICAgICAgYzEgPSAoYzEgLSAweDIxKSA+PiAxOworICAgICAgICBPVVQxKGMxIDwgMHgxZiA/IGMxICsgMHg4MSA6IGMxICsgMHhjMSkKKyAgICAgICAgT1VUMihjMiA8IDB4M2YgPyBjMiArIDB4NDAgOiBjMiArIDB4NDEpCisgICAgICAgIE5FWFQoMSwgMikKKyAgICB9CiAKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKIH0KIAogREVDT0RFUihzaGlmdF9qaXMpCiB7Ci0Jd2hpbGUgKGlubGVmdCA+IDApIHsKLQkJdW5zaWduZWQgY2hhciBjID0gSU4xOworICAgIHdoaWxlIChpbmxlZnQgPiAwKSB7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgYyA9IElOMTsKIAotCQlSRVFVSVJFX09VVEJVRigxKQorICAgICAgICBSRVFVSVJFX09VVEJVRigxKQogCiAjaWZkZWYgU1RSSUNUX0JVSUxECi0JCUpJU1gwMjAxX1JfREVDT0RFKGMsICoqb3V0YnVmKQorICAgICAgICBKSVNYMDIwMV9SX0RFQ09ERShjLCAqKm91dGJ1ZikKICNlbHNlCi0JCWlmIChjIDwgMHg4MCkgKipvdXRidWYgPSBjOworICAgICAgICBpZiAoYyA8IDB4ODApICoqb3V0YnVmID0gYzsKICNlbmRpZgotCQllbHNlIEpJU1gwMjAxX0tfREVDT0RFKGMsICoqb3V0YnVmKQotCQllbHNlIGlmICgoYyA+PSAweDgxICYmIGMgPD0gMHg5ZikgfHwgKGMgPj0gMHhlMCAmJiBjIDw9IDB4ZWEpKXsKLQkJCXVuc2lnbmVkIGNoYXIgYzEsIGMyOworICAgICAgICBlbHNlIEpJU1gwMjAxX0tfREVDT0RFKGMsICoqb3V0YnVmKQorICAgICAgICBlbHNlIGlmICgoYyA+PSAweDgxICYmIGMgPD0gMHg5ZikgfHwgKGMgPj0gMHhlMCAmJiBjIDw9IDB4ZWEpKXsKKyAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgYzEsIGMyOwogCi0JCQlSRVFVSVJFX0lOQlVGKDIpCi0JCQljMiA9IElOMjsKLQkJCWlmIChjMiA8IDB4NDAgfHwgKGMyID4gMHg3ZSAmJiBjMiA8IDB4ODApIHx8IGMyID4gMHhmYykKLQkJCQlyZXR1cm4gMjsKKyAgICAgICAgICAgIFJFUVVJUkVfSU5CVUYoMikKKyAgICAgICAgICAgIGMyID0gSU4yOworICAgICAgICAgICAgaWYgKGMyIDwgMHg0MCB8fCAoYzIgPiAweDdlICYmIGMyIDwgMHg4MCkgfHwgYzIgPiAweGZjKQorICAgICAgICAgICAgICAgIHJldHVybiAyOwogCi0JCQljMSA9IChjIDwgMHhlMCA/IGMgLSAweDgxIDogYyAtIDB4YzEpOwotCQkJYzIgPSAoYzIgPCAweDgwID8gYzIgLSAweDQwIDogYzIgLSAweDQxKTsKLQkJCWMxID0gKDIgKiBjMSArIChjMiA8IDB4NWUgPyAwIDogMSkgKyAweDIxKTsKLQkJCWMyID0gKGMyIDwgMHg1ZSA/IGMyIDogYzIgLSAweDVlKSArIDB4MjE7CisgICAgICAgICAgICBjMSA9IChjIDwgMHhlMCA/IGMgLSAweDgxIDogYyAtIDB4YzEpOworICAgICAgICAgICAgYzIgPSAoYzIgPCAweDgwID8gYzIgLSAweDQwIDogYzIgLSAweDQxKTsKKyAgICAgICAgICAgIGMxID0gKDIgKiBjMSArIChjMiA8IDB4NWUgPyAwIDogMSkgKyAweDIxKTsKKyAgICAgICAgICAgIGMyID0gKGMyIDwgMHg1ZSA/IGMyIDogYzIgLSAweDVlKSArIDB4MjE7CiAKICNpZm5kZWYgU1RSSUNUX0JVSUxECi0JCQlpZiAoYzEgPT0gMHgyMSAmJiBjMiA9PSAweDQwKSB7Ci0JCQkJLyogRlVMTC1XSURUSCBSRVZFUlNFIFNPTElEVVMgKi8KLQkJCQlPVVQxKDB4ZmYzYykKLQkJCQlORVhUKDIsIDEpCi0JCQkJY29udGludWU7Ci0JCQl9CisgICAgICAgICAgICBpZiAoYzEgPT0gMHgyMSAmJiBjMiA9PSAweDQwKSB7CisgICAgICAgICAgICAgICAgLyogRlVMTC1XSURUSCBSRVZFUlNFIFNPTElEVVMgKi8KKyAgICAgICAgICAgICAgICBPVVQxKDB4ZmYzYykKKyAgICAgICAgICAgICAgICBORVhUKDIsIDEpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CiAjZW5kaWYKLQkJCVRSWU1BUF9ERUMoamlzeDAyMDgsICoqb3V0YnVmLCBjMSwgYzIpIHsKLQkJCQlORVhUKDIsIDEpCi0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQllbHNlCi0JCQkJcmV0dXJuIDI7Ci0JCX0KLQkJZWxzZQotCQkJcmV0dXJuIDI7CisgICAgICAgICAgICBUUllNQVBfREVDKGppc3gwMjA4LCAqKm91dGJ1ZiwgYzEsIGMyKSB7CisgICAgICAgICAgICAgICAgTkVYVCgyLCAxKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiAyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiAyOwogCi0JCU5FWFQoMSwgMSkgLyogSklTIFggMDIwMSAqLwotCX0KKyAgICAgICAgTkVYVCgxLCAxKSAvKiBKSVMgWCAwMjAxICovCisgICAgfQogCi0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiB9CiAKIApAQCAtNTQwLDE2NyArNTQwLDE2NyBAQAogCiBFTkNPREVSKHNoaWZ0X2ppc18yMDA0KQogewotCXdoaWxlIChpbmxlZnQgPiAwKSB7Ci0JCXVjczRfdCBjID0gSU4xOwotCQlEQkNIQVIgY29kZSA9IE5PQ0hBUjsKLQkJaW50IGMxLCBjMjsKLQkJUHlfc3NpemVfdCBpbnNpemU7CisgICAgd2hpbGUgKGlubGVmdCA+IDApIHsKKyAgICAgICAgdWNzNF90IGMgPSBJTjE7CisgICAgICAgIERCQ0hBUiBjb2RlID0gTk9DSEFSOworICAgICAgICBpbnQgYzEsIGMyOworICAgICAgICBQeV9zc2l6ZV90IGluc2l6ZTsKIAotCQlKSVNYMDIwMV9FTkNPREUoYywgY29kZSkKLQkJZWxzZSBERUNPREVfU1VSUk9HQVRFKGMpCisgICAgICAgIEpJU1gwMjAxX0VOQ09ERShjLCBjb2RlKQorICAgICAgICBlbHNlIERFQ09ERV9TVVJST0dBVEUoYykKIAotCQlpZiAoY29kZSA8IDB4ODAgfHwgKGNvZGUgPj0gMHhhMSAmJiBjb2RlIDw9IDB4ZGYpKSB7Ci0JCQlXUklURTEoKHVuc2lnbmVkIGNoYXIpY29kZSkKLQkJCU5FWFQoMSwgMSkKLQkJCWNvbnRpbnVlOwotCQl9CisgICAgICAgIGlmIChjb2RlIDwgMHg4MCB8fCAoY29kZSA+PSAweGExICYmIGNvZGUgPD0gMHhkZikpIHsKKyAgICAgICAgICAgIFdSSVRFMSgodW5zaWduZWQgY2hhciljb2RlKQorICAgICAgICAgICAgTkVYVCgxLCAxKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KIAotCQlSRVFVSVJFX09VVEJVRigyKQotCQlpbnNpemUgPSBHRVRfSU5TSVpFKGMpOworICAgICAgICBSRVFVSVJFX09VVEJVRigyKQorICAgICAgICBpbnNpemUgPSBHRVRfSU5TSVpFKGMpOwogCi0JCWlmIChjb2RlID09IE5PQ0hBUikgewotCQkJaWYgKGMgPD0gMHhmZmZmKSB7Ci0JCQkJRU1VTEFURV9KSVNYMDIxM18yMDAwX0VOQ09ERV9CTVAoY29kZSwgYykKLQkJCQllbHNlIFRSWU1BUF9FTkMoamlzeDAyMTNfYm1wLCBjb2RlLCBjKSB7Ci0JCQkJCWlmIChjb2RlID09IE1VTFRJQykgewotCQkJCQkJaWYgKGlubGVmdCA8IDIpIHsKLQkJCQkJCSAgICBpZiAoZmxhZ3MgJiBNQkVOQ19GTFVTSCkgewotCQkJCQkJCWNvZGUgPSBmaW5kX3BhaXJlbmNtYXAKLQkJCQkJCQkgICAgKCh1Y3MyX3QpYywgMCwKLQkJCQkJCQkgIGppc3gwMjEzX3BhaXJfZW5jbWFwLAotCQkJCQkJCSAgICBKSVNYMDIxM19FTkNQQUlSUyk7Ci0JCQkJCQkJaWYgKGNvZGUgPT0gREJDSU5WKQotCQkJCQkJCSAgICByZXR1cm4gMTsKLQkJCQkJCSAgICB9Ci0JCQkJCQkgICAgZWxzZQotCQkJCQkJCSAgICByZXR1cm4gTUJFUlJfVE9PRkVXOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkgICAgY29kZSA9IGZpbmRfcGFpcmVuY21hcCgKLQkJCQkJCQkgICAgKHVjczJfdCljLCBJTjIsCi0JCQkJCQkJICBqaXN4MDIxM19wYWlyX2VuY21hcCwKLQkJCQkJCQkgICAgSklTWDAyMTNfRU5DUEFJUlMpOwotCQkJCQkJICAgIGlmIChjb2RlID09IERCQ0lOVikgewotCQkJCQkJCWNvZGUgPSBmaW5kX3BhaXJlbmNtYXAoCi0JCQkJCQkJICAgICh1Y3MyX3QpYywgMCwKLQkJCQkJCQkgIGppc3gwMjEzX3BhaXJfZW5jbWFwLAotCQkJCQkJCSAgICBKSVNYMDIxM19FTkNQQUlSUyk7Ci0JCQkJCQkJaWYgKGNvZGUgPT0gREJDSU5WKQotCQkJCQkJCSAgICByZXR1cm4gMTsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZQotCQkJCQkJCSAgICBpbnNpemUgPSAyOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgVFJZTUFQX0VOQyhqaXN4Y29tbW9uLCBjb2RlLCBjKSB7Ci0JCQkJCS8qIGFiYW5kb24gSklTIFggMDIxMiBjb2RlcyAqLwotCQkJCQlpZiAoY29kZSAmIDB4ODAwMCkKLQkJCQkJCXJldHVybiAxOwotCQkJCX0KLQkJCQllbHNlIHJldHVybiAxOwotCQkJfQotCQkJZWxzZSBpZiAoYyA+PiAxNiA9PSBFTVBCQVNFID4+IDE2KSB7Ci0JCQkJRU1VTEFURV9KSVNYMDIxM18yMDAwX0VOQ09ERV9FTVAoY29kZSwgYykKLQkJCQllbHNlIFRSWU1BUF9FTkMoamlzeDAyMTNfZW1wLCBjb2RlLCBjJjB4ZmZmZik7Ci0JCQkJZWxzZSByZXR1cm4gaW5zaXplOwotCQkJfQotCQkJZWxzZQotCQkJCXJldHVybiBpbnNpemU7Ci0JCX0KKyAgICAgICAgaWYgKGNvZGUgPT0gTk9DSEFSKSB7CisgICAgICAgICAgICBpZiAoYyA8PSAweGZmZmYpIHsKKyAgICAgICAgICAgICAgICBFTVVMQVRFX0pJU1gwMjEzXzIwMDBfRU5DT0RFX0JNUChjb2RlLCBjKQorICAgICAgICAgICAgICAgIGVsc2UgVFJZTUFQX0VOQyhqaXN4MDIxM19ibXAsIGNvZGUsIGMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgPT0gTVVMVElDKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5sZWZ0IDwgMikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmbGFncyAmIE1CRU5DX0ZMVVNIKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IGZpbmRfcGFpcmVuY21hcAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVjczJfdCljLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamlzeDAyMTNfcGFpcl9lbmNtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpJU1gwMjEzX0VOQ1BBSVJTKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSA9PSBEQkNJTlYpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNQkVSUl9UT09GRVc7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gZmluZF9wYWlyZW5jbWFwKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWNzMl90KWMsIElOMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppc3gwMjEzX3BhaXJfZW5jbWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKSVNYMDIxM19FTkNQQUlSUyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgPT0gREJDSU5WKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IGZpbmRfcGFpcmVuY21hcCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVjczJfdCljLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamlzeDAyMTNfcGFpcl9lbmNtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpJU1gwMjEzX0VOQ1BBSVJTKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSA9PSBEQkNJTlYpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc2l6ZSA9IDI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBUUllNQVBfRU5DKGppc3hjb21tb24sIGNvZGUsIGMpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogYWJhbmRvbiBKSVMgWCAwMjEyIGNvZGVzICovCisgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlICYgMHg4MDAwKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgcmV0dXJuIDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChjID4+IDE2ID09IEVNUEJBU0UgPj4gMTYpIHsKKyAgICAgICAgICAgICAgICBFTVVMQVRFX0pJU1gwMjEzXzIwMDBfRU5DT0RFX0VNUChjb2RlLCBjKQorICAgICAgICAgICAgICAgIGVsc2UgVFJZTUFQX0VOQyhqaXN4MDIxM19lbXAsIGNvZGUsIGMmMHhmZmZmKTsKKyAgICAgICAgICAgICAgICBlbHNlIHJldHVybiBpbnNpemU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIGluc2l6ZTsKKyAgICAgICAgfQogCi0JCWMxID0gY29kZSA+PiA4OwotCQljMiA9IChjb2RlICYgMHhmZikgLSAweDIxOworICAgICAgICBjMSA9IGNvZGUgPj4gODsKKyAgICAgICAgYzIgPSAoY29kZSAmIDB4ZmYpIC0gMHgyMTsKIAotCQlpZiAoYzEgJiAweDgwKSB7IC8qIFBsYW5lIDIgKi8KLQkJCWlmIChjMSA+PSAweGVlKSBjMSAtPSAweDg3OwotCQkJZWxzZSBpZiAoYzEgPj0gMHhhYyB8fCBjMSA9PSAweGE4KSBjMSAtPSAweDQ5OwotCQkJZWxzZSBjMSAtPSAweDQzOwotCQl9Ci0JCWVsc2UgLyogUGxhbmUgMSAqLwotCQkJYzEgLT0gMHgyMTsKKyAgICAgICAgaWYgKGMxICYgMHg4MCkgeyAvKiBQbGFuZSAyICovCisgICAgICAgICAgICBpZiAoYzEgPj0gMHhlZSkgYzEgLT0gMHg4NzsKKyAgICAgICAgICAgIGVsc2UgaWYgKGMxID49IDB4YWMgfHwgYzEgPT0gMHhhOCkgYzEgLT0gMHg0OTsKKyAgICAgICAgICAgIGVsc2UgYzEgLT0gMHg0MzsKKyAgICAgICAgfQorICAgICAgICBlbHNlIC8qIFBsYW5lIDEgKi8KKyAgICAgICAgICAgIGMxIC09IDB4MjE7CiAKLQkJaWYgKGMxICYgMSkgYzIgKz0gMHg1ZTsKLQkJYzEgPj49IDE7Ci0JCU9VVDEoYzEgKyAoYzEgPCAweDFmID8gMHg4MSA6IDB4YzEpKQotCQlPVVQyKGMyICsgKGMyIDwgMHgzZiA/IDB4NDAgOiAweDQxKSkKKyAgICAgICAgaWYgKGMxICYgMSkgYzIgKz0gMHg1ZTsKKyAgICAgICAgYzEgPj49IDE7CisgICAgICAgIE9VVDEoYzEgKyAoYzEgPCAweDFmID8gMHg4MSA6IDB4YzEpKQorICAgICAgICBPVVQyKGMyICsgKGMyIDwgMHgzZiA/IDB4NDAgOiAweDQxKSkKIAotCQlORVhUKGluc2l6ZSwgMikKLQl9CisgICAgICAgIE5FWFQoaW5zaXplLCAyKQorICAgIH0KIAotCXJldHVybiAwOworICAgIHJldHVybiAwOwogfQogCiBERUNPREVSKHNoaWZ0X2ppc18yMDA0KQogewotCXdoaWxlIChpbmxlZnQgPiAwKSB7Ci0JCXVuc2lnbmVkIGNoYXIgYyA9IElOMTsKKyAgICB3aGlsZSAoaW5sZWZ0ID4gMCkgeworICAgICAgICB1bnNpZ25lZCBjaGFyIGMgPSBJTjE7CiAKLQkJUkVRVUlSRV9PVVRCVUYoMSkKLQkJSklTWDAyMDFfREVDT0RFKGMsICoqb3V0YnVmKQotCQllbHNlIGlmICgoYyA+PSAweDgxICYmIGMgPD0gMHg5ZikgfHwgKGMgPj0gMHhlMCAmJiBjIDw9IDB4ZmMpKXsKLQkJCXVuc2lnbmVkIGNoYXIgYzEsIGMyOwotCQkJdWNzNF90IGNvZGU7CisgICAgICAgIFJFUVVJUkVfT1VUQlVGKDEpCisgICAgICAgIEpJU1gwMjAxX0RFQ09ERShjLCAqKm91dGJ1ZikKKyAgICAgICAgZWxzZSBpZiAoKGMgPj0gMHg4MSAmJiBjIDw9IDB4OWYpIHx8IChjID49IDB4ZTAgJiYgYyA8PSAweGZjKSl7CisgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGMxLCBjMjsKKyAgICAgICAgICAgIHVjczRfdCBjb2RlOwogCi0JCQlSRVFVSVJFX0lOQlVGKDIpCi0JCQljMiA9IElOMjsKLQkJCWlmIChjMiA8IDB4NDAgfHwgKGMyID4gMHg3ZSAmJiBjMiA8IDB4ODApIHx8IGMyID4gMHhmYykKLQkJCQlyZXR1cm4gMjsKKyAgICAgICAgICAgIFJFUVVJUkVfSU5CVUYoMikKKyAgICAgICAgICAgIGMyID0gSU4yOworICAgICAgICAgICAgaWYgKGMyIDwgMHg0MCB8fCAoYzIgPiAweDdlICYmIGMyIDwgMHg4MCkgfHwgYzIgPiAweGZjKQorICAgICAgICAgICAgICAgIHJldHVybiAyOwogCi0JCQljMSA9IChjIDwgMHhlMCA/IGMgLSAweDgxIDogYyAtIDB4YzEpOwotCQkJYzIgPSAoYzIgPCAweDgwID8gYzIgLSAweDQwIDogYzIgLSAweDQxKTsKLQkJCWMxID0gKDIgKiBjMSArIChjMiA8IDB4NWUgPyAwIDogMSkpOwotCQkJYzIgPSAoYzIgPCAweDVlID8gYzIgOiBjMiAtIDB4NWUpICsgMHgyMTsKKyAgICAgICAgICAgIGMxID0gKGMgPCAweGUwID8gYyAtIDB4ODEgOiBjIC0gMHhjMSk7CisgICAgICAgICAgICBjMiA9IChjMiA8IDB4ODAgPyBjMiAtIDB4NDAgOiBjMiAtIDB4NDEpOworICAgICAgICAgICAgYzEgPSAoMiAqIGMxICsgKGMyIDwgMHg1ZSA/IDAgOiAxKSk7CisgICAgICAgICAgICBjMiA9IChjMiA8IDB4NWUgPyBjMiA6IGMyIC0gMHg1ZSkgKyAweDIxOwogCi0JCQlpZiAoYzEgPCAweDVlKSB7IC8qIFBsYW5lIDEgKi8KLQkJCQljMSArPSAweDIxOwotCQkJCUVNVUxBVEVfSklTWDAyMTNfMjAwMF9ERUNPREVfUExBTkUxKCoqb3V0YnVmLAotCQkJCQkJYzEsIGMyKQotCQkJCWVsc2UgVFJZTUFQX0RFQyhqaXN4MDIwOCwgKipvdXRidWYsIGMxLCBjMikgewotCQkJCQlORVhUX09VVCgxKQotCQkJCX0KLQkJCQllbHNlIFRSWU1BUF9ERUMoamlzeDAyMTNfMV9ibXAsICoqb3V0YnVmLAotCQkJCQkJYzEsIGMyKSB7Ci0JCQkJCU5FWFRfT1VUKDEpCi0JCQkJfQotCQkJCWVsc2UgVFJZTUFQX0RFQyhqaXN4MDIxM18xX2VtcCwgY29kZSwgYzEsIGMyKSB7Ci0JCQkJCVdSSVRFVUNTNChFTVBCQVNFIHwgY29kZSkKLQkJCQl9Ci0JCQkJZWxzZSBUUllNQVBfREVDKGppc3gwMjEzX3BhaXIsIGNvZGUsIGMxLCBjMikgewotCQkJCQlXUklURTIoY29kZSA+PiAxNiwgY29kZSAmIDB4ZmZmZikKLQkJCQkJTkVYVF9PVVQoMikKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCQlyZXR1cm4gMjsKLQkJCQlORVhUX0lOKDIpCi0JCQl9Ci0JCQllbHNlIHsgLyogUGxhbmUgMiAqLwotCQkJCWlmIChjMSA+PSAweDY3KSBjMSArPSAweDA3OwotCQkJCWVsc2UgaWYgKGMxID49IDB4NjMgfHwgYzEgPT0gMHg1ZikgYzEgLT0gMHgzNzsKLQkJCQllbHNlIGMxIC09IDB4M2Q7CisgICAgICAgICAgICBpZiAoYzEgPCAweDVlKSB7IC8qIFBsYW5lIDEgKi8KKyAgICAgICAgICAgICAgICBjMSArPSAweDIxOworICAgICAgICAgICAgICAgIEVNVUxBVEVfSklTWDAyMTNfMjAwMF9ERUNPREVfUExBTkUxKCoqb3V0YnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjMSwgYzIpCisgICAgICAgICAgICAgICAgZWxzZSBUUllNQVBfREVDKGppc3gwMjA4LCAqKm91dGJ1ZiwgYzEsIGMyKSB7CisgICAgICAgICAgICAgICAgICAgIE5FWFRfT1VUKDEpCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgVFJZTUFQX0RFQyhqaXN4MDIxM18xX2JtcCwgKipvdXRidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMxLCBjMikgeworICAgICAgICAgICAgICAgICAgICBORVhUX09VVCgxKQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIFRSWU1BUF9ERUMoamlzeDAyMTNfMV9lbXAsIGNvZGUsIGMxLCBjMikgeworICAgICAgICAgICAgICAgICAgICBXUklURVVDUzQoRU1QQkFTRSB8IGNvZGUpCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgVFJZTUFQX0RFQyhqaXN4MDIxM19wYWlyLCBjb2RlLCBjMSwgYzIpIHsKKyAgICAgICAgICAgICAgICAgICAgV1JJVEUyKGNvZGUgPj4gMTYsIGNvZGUgJiAweGZmZmYpCisgICAgICAgICAgICAgICAgICAgIE5FWFRfT1VUKDIpCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDI7CisgICAgICAgICAgICAgICAgTkVYVF9JTigyKQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7IC8qIFBsYW5lIDIgKi8KKyAgICAgICAgICAgICAgICBpZiAoYzEgPj0gMHg2NykgYzEgKz0gMHgwNzsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChjMSA+PSAweDYzIHx8IGMxID09IDB4NWYpIGMxIC09IDB4Mzc7CisgICAgICAgICAgICAgICAgZWxzZSBjMSAtPSAweDNkOwogCi0JCQkJRU1VTEFURV9KSVNYMDIxM18yMDAwX0RFQ09ERV9QTEFORTIoKipvdXRidWYsCi0JCQkJCQljMSwgYzIpCi0JCQkJZWxzZSBUUllNQVBfREVDKGppc3gwMjEzXzJfYm1wLCAqKm91dGJ1ZiwKLQkJCQkJCWMxLCBjMikgOwotCQkJCWVsc2UgVFJZTUFQX0RFQyhqaXN4MDIxM18yX2VtcCwgY29kZSwgYzEsIGMyKSB7Ci0JCQkJCVdSSVRFVUNTNChFTVBCQVNFIHwgY29kZSkKLQkJCQkJTkVYVF9JTigyKQotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCQlyZXR1cm4gMjsKLQkJCQlORVhUKDIsIDEpCi0JCQl9Ci0JCQljb250aW51ZTsKLQkJfQotCQllbHNlCi0JCQlyZXR1cm4gMjsKKyAgICAgICAgICAgICAgICBFTVVMQVRFX0pJU1gwMjEzXzIwMDBfREVDT0RFX1BMQU5FMigqKm91dGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYzEsIGMyKQorICAgICAgICAgICAgICAgIGVsc2UgVFJZTUFQX0RFQyhqaXN4MDIxM18yX2JtcCwgKipvdXRidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMxLCBjMikgOworICAgICAgICAgICAgICAgIGVsc2UgVFJZTUFQX0RFQyhqaXN4MDIxM18yX2VtcCwgY29kZSwgYzEsIGMyKSB7CisgICAgICAgICAgICAgICAgICAgIFdSSVRFVUNTNChFTVBCQVNFIHwgY29kZSkKKyAgICAgICAgICAgICAgICAgICAgTkVYVF9JTigyKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMjsKKyAgICAgICAgICAgICAgICBORVhUKDIsIDEpCisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gMjsKIAotCQlORVhUKDEsIDEpIC8qIEpJUyBYIDAyMDEgKi8KLQl9CisgICAgICAgIE5FWFQoMSwgMSkgLyogSklTIFggMDIwMSAqLworICAgIH0KIAotCXJldHVybiAwOworICAgIHJldHVybiAwOwogfQogCiAKZGlmZiAtLWdpdCBhL01vZHVsZXMvY2prY29kZWNzL19jb2RlY3Nfa3IuYyBiL01vZHVsZXMvY2prY29kZWNzL19jb2RlY3Nfa3IuYwppbmRleCAxNjE5NjdlLi45MjcyZTM2IDEwMDY0NAotLS0gYS9Nb2R1bGVzL2Nqa2NvZGVjcy9fY29kZWNzX2tyLmMKKysrIGIvTW9kdWxlcy9jamtjb2RlY3MvX2NvZGVjc19rci5jCkBAIC0xMSwxNTEgKzExLDE1MSBAQAogICogRVVDLUtSIGNvZGVjCiAgKi8KIAotI2RlZmluZSBFVUNLUl9KQU1PX0ZJUlNUQllURQkweEE0Ci0jZGVmaW5lIEVVQ0tSX0pBTU9fRklMTEVSCTB4RDQKKyNkZWZpbmUgRVVDS1JfSkFNT19GSVJTVEJZVEUgICAgMHhBNAorI2RlZmluZSBFVUNLUl9KQU1PX0ZJTExFUiAgICAgICAweEQ0CiAKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHUyY2drX2Nob3Nlb25nWzE5XSA9IHsKLQkweGExLCAweGEyLCAweGE0LCAweGE3LCAweGE4LCAweGE5LCAweGIxLCAweGIyLAotCTB4YjMsIDB4YjUsIDB4YjYsIDB4YjcsIDB4YjgsIDB4YjksIDB4YmEsIDB4YmIsCi0JMHhiYywgMHhiZCwgMHhiZQorICAgIDB4YTEsIDB4YTIsIDB4YTQsIDB4YTcsIDB4YTgsIDB4YTksIDB4YjEsIDB4YjIsCisgICAgMHhiMywgMHhiNSwgMHhiNiwgMHhiNywgMHhiOCwgMHhiOSwgMHhiYSwgMHhiYiwKKyAgICAweGJjLCAweGJkLCAweGJlCiB9Owogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgdTJjZ2tfanVuZ3Nlb25nWzIxXSA9IHsKLQkweGJmLCAweGMwLCAweGMxLCAweGMyLCAweGMzLCAweGM0LCAweGM1LCAweGM2LAotCTB4YzcsIDB4YzgsIDB4YzksIDB4Y2EsIDB4Y2IsIDB4Y2MsIDB4Y2QsIDB4Y2UsCi0JMHhjZiwgMHhkMCwgMHhkMSwgMHhkMiwgMHhkMworICAgIDB4YmYsIDB4YzAsIDB4YzEsIDB4YzIsIDB4YzMsIDB4YzQsIDB4YzUsIDB4YzYsCisgICAgMHhjNywgMHhjOCwgMHhjOSwgMHhjYSwgMHhjYiwgMHhjYywgMHhjZCwgMHhjZSwKKyAgICAweGNmLCAweGQwLCAweGQxLCAweGQyLCAweGQzCiB9Owogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgdTJjZ2tfam9uZ3Nlb25nWzI4XSA9IHsKLQkweGQ0LCAweGExLCAweGEyLCAweGEzLCAweGE0LCAweGE1LCAweGE2LCAweGE3LAotCTB4YTksIDB4YWEsIDB4YWIsIDB4YWMsIDB4YWQsIDB4YWUsIDB4YWYsIDB4YjAsCi0JMHhiMSwgMHhiMiwgMHhiNCwgMHhiNSwgMHhiNiwgMHhiNywgMHhiOCwgMHhiYSwKLQkweGJiLCAweGJjLCAweGJkLCAweGJlCisgICAgMHhkNCwgMHhhMSwgMHhhMiwgMHhhMywgMHhhNCwgMHhhNSwgMHhhNiwgMHhhNywKKyAgICAweGE5LCAweGFhLCAweGFiLCAweGFjLCAweGFkLCAweGFlLCAweGFmLCAweGIwLAorICAgIDB4YjEsIDB4YjIsIDB4YjQsIDB4YjUsIDB4YjYsIDB4YjcsIDB4YjgsIDB4YmEsCisgICAgMHhiYiwgMHhiYywgMHhiZCwgMHhiZQogfTsKIAogRU5DT0RFUihldWNfa3IpCiB7Ci0Jd2hpbGUgKGlubGVmdCA+IDApIHsKLQkJUHlfVU5JQ09ERSBjID0gSU4xOwotCQlEQkNIQVIgY29kZTsKKyAgICB3aGlsZSAoaW5sZWZ0ID4gMCkgeworICAgICAgICBQeV9VTklDT0RFIGMgPSBJTjE7CisgICAgICAgIERCQ0hBUiBjb2RlOwogCi0JCWlmIChjIDwgMHg4MCkgewotCQkJV1JJVEUxKCh1bnNpZ25lZCBjaGFyKWMpCi0JCQlORVhUKDEsIDEpCi0JCQljb250aW51ZTsKLQkJfQotCQlVQ1M0SU5WQUxJRChjKQorICAgICAgICBpZiAoYyA8IDB4ODApIHsKKyAgICAgICAgICAgIFdSSVRFMSgodW5zaWduZWQgY2hhciljKQorICAgICAgICAgICAgTkVYVCgxLCAxKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgVUNTNElOVkFMSUQoYykKIAotCQlSRVFVSVJFX09VVEJVRigyKQotCQlUUllNQVBfRU5DKGNwOTQ5LCBjb2RlLCBjKTsKLQkJZWxzZSByZXR1cm4gMTsKKyAgICAgICAgUkVRVUlSRV9PVVRCVUYoMikKKyAgICAgICAgVFJZTUFQX0VOQyhjcDk0OSwgY29kZSwgYyk7CisgICAgICAgIGVsc2UgcmV0dXJuIDE7CiAKLQkJaWYgKChjb2RlICYgMHg4MDAwKSA9PSAwKSB7Ci0JCQkvKiBLUyBYIDEwMDEgY29kZWQgY2hhcmFjdGVyICovCi0JCQlPVVQxKChjb2RlID4+IDgpIHwgMHg4MCkKLQkJCU9VVDIoKGNvZGUgJiAweEZGKSB8IDB4ODApCi0JCQlORVhUKDEsIDIpCi0JCX0KLQkJZWxzZSB7CS8qIE1hcHBpbmcgaXMgZm91bmQgaW4gQ1A5NDkgZXh0ZW5zaW9uLAotCQkJICogYnV0IHdlIGVuY29kZSBpdCBpbiBLUyBYIDEwMDE6MTk5OCBBbm5leCAzLAotCQkJICogbWFrZS11cCBzZXF1ZW5jZSBmb3IgRVVDLUtSLiAqLworICAgICAgICBpZiAoKGNvZGUgJiAweDgwMDApID09IDApIHsKKyAgICAgICAgICAgIC8qIEtTIFggMTAwMSBjb2RlZCBjaGFyYWN0ZXIgKi8KKyAgICAgICAgICAgIE9VVDEoKGNvZGUgPj4gOCkgfCAweDgwKQorICAgICAgICAgICAgT1VUMigoY29kZSAmIDB4RkYpIHwgMHg4MCkKKyAgICAgICAgICAgIE5FWFQoMSwgMikKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsgICAgICAgICAgLyogTWFwcGluZyBpcyBmb3VuZCBpbiBDUDk0OSBleHRlbnNpb24sCisgICAgICAgICAgICAgICAgICogYnV0IHdlIGVuY29kZSBpdCBpbiBLUyBYIDEwMDE6MTk5OCBBbm5leCAzLAorICAgICAgICAgICAgICAgICAqIG1ha2UtdXAgc2VxdWVuY2UgZm9yIEVVQy1LUi4gKi8KIAotCQkJUkVRVUlSRV9PVVRCVUYoOCkKKyAgICAgICAgICAgIFJFUVVJUkVfT1VUQlVGKDgpCiAKLQkJCS8qIHN5bGxhYmxlIGNvbXBvc2l0aW9uIHByZWNlZGVuY2UgKi8KLQkJCU9VVDEoRVVDS1JfSkFNT19GSVJTVEJZVEUpCi0JCQlPVVQyKEVVQ0tSX0pBTU9fRklMTEVSKQorICAgICAgICAgICAgLyogc3lsbGFibGUgY29tcG9zaXRpb24gcHJlY2VkZW5jZSAqLworICAgICAgICAgICAgT1VUMShFVUNLUl9KQU1PX0ZJUlNUQllURSkKKyAgICAgICAgICAgIE9VVDIoRVVDS1JfSkFNT19GSUxMRVIpCiAKLQkJCS8qIEFsbCBjb2RlcG9pbnRzIGluIENQOTQ5IGV4dGVuc2lvbiBhcmUgaW4gdW5pY29kZQotCQkJICogSGFuZ3VsIFN5bGxhYmxlIGFyZWEuICovCi0JCQlhc3NlcnQoMHhhYzAwIDw9IGMgJiYgYyA8PSAweGQ3YTMpOwotCQkJYyAtPSAweGFjMDA7CisgICAgICAgICAgICAvKiBBbGwgY29kZXBvaW50cyBpbiBDUDk0OSBleHRlbnNpb24gYXJlIGluIHVuaWNvZGUKKyAgICAgICAgICAgICAqIEhhbmd1bCBTeWxsYWJsZSBhcmVhLiAqLworICAgICAgICAgICAgYXNzZXJ0KDB4YWMwMCA8PSBjICYmIGMgPD0gMHhkN2EzKTsKKyAgICAgICAgICAgIGMgLT0gMHhhYzAwOwogCi0JCQlPVVQzKEVVQ0tSX0pBTU9fRklSU1RCWVRFKQotCQkJT1VUNCh1MmNna19jaG9zZW9uZ1tjIC8gNTg4XSkKLQkJCU5FWFRfT1VUKDQpCisgICAgICAgICAgICBPVVQzKEVVQ0tSX0pBTU9fRklSU1RCWVRFKQorICAgICAgICAgICAgT1VUNCh1MmNna19jaG9zZW9uZ1tjIC8gNTg4XSkKKyAgICAgICAgICAgIE5FWFRfT1VUKDQpCiAKLQkJCU9VVDEoRVVDS1JfSkFNT19GSVJTVEJZVEUpCi0JCQlPVVQyKHUyY2drX2p1bmdzZW9uZ1soYyAvIDI4KSAlIDIxXSkKLQkJCU9VVDMoRVVDS1JfSkFNT19GSVJTVEJZVEUpCi0JCQlPVVQ0KHUyY2drX2pvbmdzZW9uZ1tjICUgMjhdKQotCQkJTkVYVCgxLCA0KQotCQl9Ci0JfQorICAgICAgICAgICAgT1VUMShFVUNLUl9KQU1PX0ZJUlNUQllURSkKKyAgICAgICAgICAgIE9VVDIodTJjZ2tfanVuZ3Nlb25nWyhjIC8gMjgpICUgMjFdKQorICAgICAgICAgICAgT1VUMyhFVUNLUl9KQU1PX0ZJUlNUQllURSkKKyAgICAgICAgICAgIE9VVDQodTJjZ2tfam9uZ3Nlb25nW2MgJSAyOF0pCisgICAgICAgICAgICBORVhUKDEsIDQpCisgICAgICAgIH0KKyAgICB9CiAKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKIH0KIAotI2RlZmluZSBOT05FCTEyNworI2RlZmluZSBOT05FICAgIDEyNwogCiBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBjZ2sydV9jaG9zZW9uZ1tdID0geyAvKiBbQTEsIEJFXSAqLwotCSAgIDAsICAgIDEsIE5PTkUsICAgIDIsIE5PTkUsIE5PTkUsICAgIDMsICAgIDQsCi0JICAgNSwgTk9ORSwgTk9ORSwgTk9ORSwgTk9ORSwgTk9ORSwgTk9ORSwgTk9ORSwKLQkgICA2LCAgICA3LCAgICA4LCBOT05FLCAgICA5LCAgIDEwLCAgIDExLCAgIDEyLAotCSAgMTMsICAgMTQsICAgMTUsICAgMTYsICAgMTcsICAgMTgKKyAgICAgICAwLCAgICAxLCBOT05FLCAgICAyLCBOT05FLCBOT05FLCAgICAzLCAgICA0LAorICAgICAgIDUsIE5PTkUsIE5PTkUsIE5PTkUsIE5PTkUsIE5PTkUsIE5PTkUsIE5PTkUsCisgICAgICAgNiwgICAgNywgICAgOCwgTk9ORSwgICAgOSwgICAxMCwgICAxMSwgICAxMiwKKyAgICAgIDEzLCAgIDE0LCAgIDE1LCAgIDE2LCAgIDE3LCAgIDE4CiB9Owogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgY2drMnVfam9uZ3Nlb25nW10gPSB7IC8qIFtBMSwgQkVdICovCi0JICAgMSwgICAgMiwgICAgMywgICAgNCwgICAgNSwgICAgNiwgICAgNywgTk9ORSwKLQkgICA4LCAgICA5LCAgIDEwLCAgIDExLCAgIDEyLCAgIDEzLCAgIDE0LCAgIDE1LAotCSAgMTYsICAgMTcsIE5PTkUsICAgMTgsICAgMTksICAgMjAsICAgMjEsICAgMjIsCi0JTk9ORSwgICAyMywgICAyNCwgICAyNSwgICAyNiwgICAyNworICAgICAgIDEsICAgIDIsICAgIDMsICAgIDQsICAgIDUsICAgIDYsICAgIDcsIE5PTkUsCisgICAgICAgOCwgICAgOSwgICAxMCwgICAxMSwgICAxMiwgICAxMywgICAxNCwgICAxNSwKKyAgICAgIDE2LCAgIDE3LCBOT05FLCAgIDE4LCAgIDE5LCAgIDIwLCAgIDIxLCAgIDIyLAorICAgIE5PTkUsICAgMjMsICAgMjQsICAgMjUsICAgMjYsICAgMjcKIH07CiAKIERFQ09ERVIoZXVjX2tyKQogewotCXdoaWxlIChpbmxlZnQgPiAwKSB7Ci0JCXVuc2lnbmVkIGNoYXIgYyA9IElOMTsKKyAgICB3aGlsZSAoaW5sZWZ0ID4gMCkgeworICAgICAgICB1bnNpZ25lZCBjaGFyIGMgPSBJTjE7CiAKLQkJUkVRVUlSRV9PVVRCVUYoMSkKKyAgICAgICAgUkVRVUlSRV9PVVRCVUYoMSkKIAotCQlpZiAoYyA8IDB4ODApIHsKLQkJCU9VVDEoYykKLQkJCU5FWFQoMSwgMSkKLQkJCWNvbnRpbnVlOwotCQl9CisgICAgICAgIGlmIChjIDwgMHg4MCkgeworICAgICAgICAgICAgT1VUMShjKQorICAgICAgICAgICAgTkVYVCgxLCAxKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KIAotCQlSRVFVSVJFX0lOQlVGKDIpCisgICAgICAgIFJFUVVJUkVfSU5CVUYoMikKIAotCQlpZiAoYyA9PSBFVUNLUl9KQU1PX0ZJUlNUQllURSAmJgotCQkgICAgSU4yID09IEVVQ0tSX0pBTU9fRklMTEVSKSB7Ci0JCQkvKiBLUyBYIDEwMDE6MTk5OCBBbm5leCAzIG1ha2UtdXAgc2VxdWVuY2UgKi8KLQkJCURCQ0hBUiBjaG8sIGp1bmcsIGpvbmc7CisgICAgICAgIGlmIChjID09IEVVQ0tSX0pBTU9fRklSU1RCWVRFICYmCisgICAgICAgICAgICBJTjIgPT0gRVVDS1JfSkFNT19GSUxMRVIpIHsKKyAgICAgICAgICAgIC8qIEtTIFggMTAwMToxOTk4IEFubmV4IDMgbWFrZS11cCBzZXF1ZW5jZSAqLworICAgICAgICAgICAgREJDSEFSIGNobywganVuZywgam9uZzsKIAotCQkJUkVRVUlSRV9JTkJVRig4KQotCQkJaWYgKCgqaW5idWYpWzJdICE9IEVVQ0tSX0pBTU9fRklSU1RCWVRFIHx8Ci0JCQkgICAgKCppbmJ1ZilbNF0gIT0gRVVDS1JfSkFNT19GSVJTVEJZVEUgfHwKLQkJCSAgICAoKmluYnVmKVs2XSAhPSBFVUNLUl9KQU1PX0ZJUlNUQllURSkKLQkJCQlyZXR1cm4gODsKKyAgICAgICAgICAgIFJFUVVJUkVfSU5CVUYoOCkKKyAgICAgICAgICAgIGlmICgoKmluYnVmKVsyXSAhPSBFVUNLUl9KQU1PX0ZJUlNUQllURSB8fAorICAgICAgICAgICAgICAgICgqaW5idWYpWzRdICE9IEVVQ0tSX0pBTU9fRklSU1RCWVRFIHx8CisgICAgICAgICAgICAgICAgKCppbmJ1ZilbNl0gIT0gRVVDS1JfSkFNT19GSVJTVEJZVEUpCisgICAgICAgICAgICAgICAgcmV0dXJuIDg7CiAKLQkJCWMgPSAoKmluYnVmKVszXTsKLQkJCWlmICgweGExIDw9IGMgJiYgYyA8PSAweGJlKQotCQkJCWNobyA9IGNnazJ1X2Nob3Nlb25nW2MgLSAweGExXTsKLQkJCWVsc2UKLQkJCQljaG8gPSBOT05FOworICAgICAgICAgICAgYyA9ICgqaW5idWYpWzNdOworICAgICAgICAgICAgaWYgKDB4YTEgPD0gYyAmJiBjIDw9IDB4YmUpCisgICAgICAgICAgICAgICAgY2hvID0gY2drMnVfY2hvc2VvbmdbYyAtIDB4YTFdOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGNobyA9IE5PTkU7CiAKLQkJCWMgPSAoKmluYnVmKVs1XTsKLQkJCWp1bmcgPSAoMHhiZiA8PSBjICYmIGMgPD0gMHhkMykgPyBjIC0gMHhiZiA6IE5PTkU7CisgICAgICAgICAgICBjID0gKCppbmJ1ZilbNV07CisgICAgICAgICAgICBqdW5nID0gKDB4YmYgPD0gYyAmJiBjIDw9IDB4ZDMpID8gYyAtIDB4YmYgOiBOT05FOwogCi0JCQljID0gKCppbmJ1ZilbN107Ci0JCQlpZiAoYyA9PSBFVUNLUl9KQU1PX0ZJTExFUikKLQkJCQlqb25nID0gMDsKLQkJCWVsc2UgaWYgKDB4YTEgPD0gYyAmJiBjIDw9IDB4YmUpCi0JCQkJam9uZyA9IGNnazJ1X2pvbmdzZW9uZ1tjIC0gMHhhMV07Ci0JCQllbHNlCi0JCQkJam9uZyA9IE5PTkU7CisgICAgICAgICAgICBjID0gKCppbmJ1ZilbN107CisgICAgICAgICAgICBpZiAoYyA9PSBFVUNLUl9KQU1PX0ZJTExFUikKKyAgICAgICAgICAgICAgICBqb25nID0gMDsKKyAgICAgICAgICAgIGVsc2UgaWYgKDB4YTEgPD0gYyAmJiBjIDw9IDB4YmUpCisgICAgICAgICAgICAgICAgam9uZyA9IGNnazJ1X2pvbmdzZW9uZ1tjIC0gMHhhMV07CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgam9uZyA9IE5PTkU7CiAKLQkJCWlmIChjaG8gPT0gTk9ORSB8fCBqdW5nID09IE5PTkUgfHwgam9uZyA9PSBOT05FKQotCQkJCXJldHVybiA4OworICAgICAgICAgICAgaWYgKGNobyA9PSBOT05FIHx8IGp1bmcgPT0gTk9ORSB8fCBqb25nID09IE5PTkUpCisgICAgICAgICAgICAgICAgcmV0dXJuIDg7CiAKLQkJCU9VVDEoMHhhYzAwICsgY2hvKjU4OCArIGp1bmcqMjggKyBqb25nKTsKLQkJCU5FWFQoOCwgMSkKLQkJfQotCQllbHNlIFRSWU1BUF9ERUMoa3N4MTAwMSwgKipvdXRidWYsIGMgXiAweDgwLCBJTjIgXiAweDgwKSB7Ci0JCQlORVhUKDIsIDEpCi0JCX0KLQkJZWxzZQotCQkJcmV0dXJuIDI7Ci0JfQorICAgICAgICAgICAgT1VUMSgweGFjMDAgKyBjaG8qNTg4ICsganVuZyoyOCArIGpvbmcpOworICAgICAgICAgICAgTkVYVCg4LCAxKQorICAgICAgICB9CisgICAgICAgIGVsc2UgVFJZTUFQX0RFQyhrc3gxMDAxLCAqKm91dGJ1ZiwgYyBeIDB4ODAsIElOMiBeIDB4ODApIHsKKyAgICAgICAgICAgIE5FWFQoMiwgMSkKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gMjsKKyAgICB9CiAKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKIH0KICN1bmRlZiBOT05FCiAKQEAgLTE2Niw1NCArMTY2LDU0IEBACiAKIEVOQ09ERVIoY3A5NDkpCiB7Ci0Jd2hpbGUgKGlubGVmdCA+IDApIHsKLQkJUHlfVU5JQ09ERSBjID0gSU4xOwotCQlEQkNIQVIgY29kZTsKKyAgICB3aGlsZSAoaW5sZWZ0ID4gMCkgeworICAgICAgICBQeV9VTklDT0RFIGMgPSBJTjE7CisgICAgICAgIERCQ0hBUiBjb2RlOwogCi0JCWlmIChjIDwgMHg4MCkgewotCQkJV1JJVEUxKCh1bnNpZ25lZCBjaGFyKWMpCi0JCQlORVhUKDEsIDEpCi0JCQljb250aW51ZTsKLQkJfQotCQlVQ1M0SU5WQUxJRChjKQorICAgICAgICBpZiAoYyA8IDB4ODApIHsKKyAgICAgICAgICAgIFdSSVRFMSgodW5zaWduZWQgY2hhciljKQorICAgICAgICAgICAgTkVYVCgxLCAxKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgVUNTNElOVkFMSUQoYykKIAotCQlSRVFVSVJFX09VVEJVRigyKQotCQlUUllNQVBfRU5DKGNwOTQ5LCBjb2RlLCBjKTsKLQkJZWxzZSByZXR1cm4gMTsKKyAgICAgICAgUkVRVUlSRV9PVVRCVUYoMikKKyAgICAgICAgVFJZTUFQX0VOQyhjcDk0OSwgY29kZSwgYyk7CisgICAgICAgIGVsc2UgcmV0dXJuIDE7CiAKLQkJT1VUMSgoY29kZSA+PiA4KSB8IDB4ODApCi0JCWlmIChjb2RlICYgMHg4MDAwKQotCQkJT1VUMihjb2RlICYgMHhGRikgLyogTVNCIHNldDogQ1A5NDkgKi8KLQkJZWxzZQotCQkJT1VUMigoY29kZSAmIDB4RkYpIHwgMHg4MCkgLyogTVNCIHVuc2V0OiBrcyB4IDEwMDEgKi8KLQkJTkVYVCgxLCAyKQotCX0KKyAgICAgICAgT1VUMSgoY29kZSA+PiA4KSB8IDB4ODApCisgICAgICAgIGlmIChjb2RlICYgMHg4MDAwKQorICAgICAgICAgICAgT1VUMihjb2RlICYgMHhGRikgLyogTVNCIHNldDogQ1A5NDkgKi8KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgT1VUMigoY29kZSAmIDB4RkYpIHwgMHg4MCkgLyogTVNCIHVuc2V0OiBrcyB4IDEwMDEgKi8KKyAgICAgICAgTkVYVCgxLCAyKQorICAgIH0KIAotCXJldHVybiAwOworICAgIHJldHVybiAwOwogfQogCiBERUNPREVSKGNwOTQ5KQogewotCXdoaWxlIChpbmxlZnQgPiAwKSB7Ci0JCXVuc2lnbmVkIGNoYXIgYyA9IElOMTsKKyAgICB3aGlsZSAoaW5sZWZ0ID4gMCkgeworICAgICAgICB1bnNpZ25lZCBjaGFyIGMgPSBJTjE7CiAKLQkJUkVRVUlSRV9PVVRCVUYoMSkKKyAgICAgICAgUkVRVUlSRV9PVVRCVUYoMSkKIAotCQlpZiAoYyA8IDB4ODApIHsKLQkJCU9VVDEoYykKLQkJCU5FWFQoMSwgMSkKLQkJCWNvbnRpbnVlOwotCQl9CisgICAgICAgIGlmIChjIDwgMHg4MCkgeworICAgICAgICAgICAgT1VUMShjKQorICAgICAgICAgICAgTkVYVCgxLCAxKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KIAotCQlSRVFVSVJFX0lOQlVGKDIpCi0JCVRSWU1BUF9ERUMoa3N4MTAwMSwgKipvdXRidWYsIGMgXiAweDgwLCBJTjIgXiAweDgwKTsKLQkJZWxzZSBUUllNQVBfREVDKGNwOTQ5ZXh0LCAqKm91dGJ1ZiwgYywgSU4yKTsKLQkJZWxzZSByZXR1cm4gMjsKKyAgICAgICAgUkVRVUlSRV9JTkJVRigyKQorICAgICAgICBUUllNQVBfREVDKGtzeDEwMDEsICoqb3V0YnVmLCBjIF4gMHg4MCwgSU4yIF4gMHg4MCk7CisgICAgICAgIGVsc2UgVFJZTUFQX0RFQyhjcDk0OWV4dCwgKipvdXRidWYsIGMsIElOMik7CisgICAgICAgIGVsc2UgcmV0dXJuIDI7CiAKLQkJTkVYVCgyLCAxKQotCX0KKyAgICAgICAgTkVYVCgyLCAxKQorICAgIH0KIAotCXJldHVybiAwOworICAgIHJldHVybiAwOwogfQogCiAKQEAgLTI1MCw1OCArMjUwLDU4IEBACiAKIEVOQ09ERVIoam9oYWIpCiB7Ci0Jd2hpbGUgKGlubGVmdCA+IDApIHsKLQkJUHlfVU5JQ09ERSBjID0gSU4xOwotCQlEQkNIQVIgY29kZTsKKyAgICB3aGlsZSAoaW5sZWZ0ID4gMCkgeworICAgICAgICBQeV9VTklDT0RFIGMgPSBJTjE7CisgICAgICAgIERCQ0hBUiBjb2RlOwogCi0JCWlmIChjIDwgMHg4MCkgewotCQkJV1JJVEUxKCh1bnNpZ25lZCBjaGFyKWMpCi0JCQlORVhUKDEsIDEpCi0JCQljb250aW51ZTsKLQkJfQotCQlVQ1M0SU5WQUxJRChjKQorICAgICAgICBpZiAoYyA8IDB4ODApIHsKKyAgICAgICAgICAgIFdSSVRFMSgodW5zaWduZWQgY2hhciljKQorICAgICAgICAgICAgTkVYVCgxLCAxKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgVUNTNElOVkFMSUQoYykKIAotCQlSRVFVSVJFX09VVEJVRigyKQorICAgICAgICBSRVFVSVJFX09VVEJVRigyKQogCi0JCWlmIChjID49IDB4YWMwMCAmJiBjIDw9IDB4ZDdhMykgewotCQkJYyAtPSAweGFjMDA7Ci0JCQljb2RlID0gMHg4MDAwIHwKLQkJCQkodTJqb2hhYmlkeF9jaG9zZW9uZ1tjIC8gNTg4XSA8PCAxMCkgfAotCQkJCSh1MmpvaGFiaWR4X2p1bmdzZW9uZ1soYyAvIDI4KSAlIDIxXSA8PCA1KSB8Ci0JCQkJdTJqb2hhYmlkeF9qb25nc2VvbmdbYyAlIDI4XTsKLQkJfQotCQllbHNlIGlmIChjID49IDB4MzEzMSAmJiBjIDw9IDB4MzE2MykKLQkJCWNvZGUgPSB1MmpvaGFiamFtb1tjIC0gMHgzMTMxXTsKLQkJZWxzZSBUUllNQVBfRU5DKGNwOTQ5LCBjb2RlLCBjKSB7Ci0JCQl1bnNpZ25lZCBjaGFyIGMxLCBjMiwgdDI7Ci0JCQl1bnNpZ25lZCBzaG9ydCB0MTsKKyAgICAgICAgaWYgKGMgPj0gMHhhYzAwICYmIGMgPD0gMHhkN2EzKSB7CisgICAgICAgICAgICBjIC09IDB4YWMwMDsKKyAgICAgICAgICAgIGNvZGUgPSAweDgwMDAgfAorICAgICAgICAgICAgICAgICh1MmpvaGFiaWR4X2Nob3Nlb25nW2MgLyA1ODhdIDw8IDEwKSB8CisgICAgICAgICAgICAgICAgKHUyam9oYWJpZHhfanVuZ3Nlb25nWyhjIC8gMjgpICUgMjFdIDw8IDUpIHwKKyAgICAgICAgICAgICAgICB1MmpvaGFiaWR4X2pvbmdzZW9uZ1tjICUgMjhdOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGMgPj0gMHgzMTMxICYmIGMgPD0gMHgzMTYzKQorICAgICAgICAgICAgY29kZSA9IHUyam9oYWJqYW1vW2MgLSAweDMxMzFdOworICAgICAgICBlbHNlIFRSWU1BUF9FTkMoY3A5NDksIGNvZGUsIGMpIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgYzEsIGMyLCB0MjsKKyAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IHQxOwogCi0JCQlhc3NlcnQoKGNvZGUgJiAweDgwMDApID09IDApOwotCQkJYzEgPSBjb2RlID4+IDg7Ci0JCQljMiA9IGNvZGUgJiAweGZmOwotCQkJaWYgKCgoYzEgPj0gMHgyMSAmJiBjMSA8PSAweDJjKSB8fAotCQkJICAgIChjMSA+PSAweDRhICYmIGMxIDw9IDB4N2QpKSAmJgotCQkJICAgIChjMiA+PSAweDIxICYmIGMyIDw9IDB4N2UpKSB7Ci0JCQkJdDEgPSAoYzEgPCAweDRhID8gKGMxIC0gMHgyMSArIDB4MWIyKSA6Ci0JCQkJCQkgIChjMSAtIDB4MjEgKyAweDE5NykpOwotCQkJCXQyID0gKCh0MSAmIDEpID8gMHg1ZSA6IDApICsgKGMyIC0gMHgyMSk7Ci0JCQkJT1VUMSh0MSA+PiAxKQotCQkJCU9VVDIodDIgPCAweDRlID8gdDIgKyAweDMxIDogdDIgKyAweDQzKQotCQkJCU5FWFQoMSwgMikKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWVsc2UKLQkJCQlyZXR1cm4gMTsKLQkJfQotCQllbHNlCi0JCQlyZXR1cm4gMTsKKyAgICAgICAgICAgIGFzc2VydCgoY29kZSAmIDB4ODAwMCkgPT0gMCk7CisgICAgICAgICAgICBjMSA9IGNvZGUgPj4gODsKKyAgICAgICAgICAgIGMyID0gY29kZSAmIDB4ZmY7CisgICAgICAgICAgICBpZiAoKChjMSA+PSAweDIxICYmIGMxIDw9IDB4MmMpIHx8CisgICAgICAgICAgICAgICAgKGMxID49IDB4NGEgJiYgYzEgPD0gMHg3ZCkpICYmCisgICAgICAgICAgICAgICAgKGMyID49IDB4MjEgJiYgYzIgPD0gMHg3ZSkpIHsKKyAgICAgICAgICAgICAgICB0MSA9IChjMSA8IDB4NGEgPyAoYzEgLSAweDIxICsgMHgxYjIpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGMxIC0gMHgyMSArIDB4MTk3KSk7CisgICAgICAgICAgICAgICAgdDIgPSAoKHQxICYgMSkgPyAweDVlIDogMCkgKyAoYzIgLSAweDIxKTsKKyAgICAgICAgICAgICAgICBPVVQxKHQxID4+IDEpCisgICAgICAgICAgICAgICAgT1VUMih0MiA8IDB4NGUgPyB0MiArIDB4MzEgOiB0MiArIDB4NDMpCisgICAgICAgICAgICAgICAgTkVYVCgxLCAyKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiAxOwogCi0JCU9VVDEoY29kZSA+PiA4KQotCQlPVVQyKGNvZGUgJiAweGZmKQotCQlORVhUKDEsIDIpCi0JfQorICAgICAgICBPVVQxKGNvZGUgPj4gOCkKKyAgICAgICAgT1VUMihjb2RlICYgMHhmZikKKyAgICAgICAgTkVYVCgxLCAyKQorICAgIH0KIAotCXJldHVybiAwOworICAgIHJldHVybiAwOwogfQogCiAjZGVmaW5lIEZJTEwgMHhmZApAQCAtMzQ3LDkxICszNDcsOTEgQEAKIAogREVDT0RFUihqb2hhYikKIHsKLQl3aGlsZSAoaW5sZWZ0ID4gMCkgewotCQl1bnNpZ25lZCBjaGFyICAgIGMgPSBJTjEsIGMyOworICAgIHdoaWxlIChpbmxlZnQgPiAwKSB7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgICAgYyA9IElOMSwgYzI7CiAKLQkJUkVRVUlSRV9PVVRCVUYoMSkKKyAgICAgICAgUkVRVUlSRV9PVVRCVUYoMSkKIAotCQlpZiAoYyA8IDB4ODApIHsKLQkJCU9VVDEoYykKLQkJCU5FWFQoMSwgMSkKLQkJCWNvbnRpbnVlOwotCQl9CisgICAgICAgIGlmIChjIDwgMHg4MCkgeworICAgICAgICAgICAgT1VUMShjKQorICAgICAgICAgICAgTkVYVCgxLCAxKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KIAotCQlSRVFVSVJFX0lOQlVGKDIpCi0JCWMyID0gSU4yOworICAgICAgICBSRVFVSVJFX0lOQlVGKDIpCisgICAgICAgIGMyID0gSU4yOwogCi0JCWlmIChjIDwgMHhkOCkgewotCQkJLyogam9oYWIgaGFuZ3VsICovCi0JCQl1bnNpZ25lZCBjaGFyIGNfY2hvLCBjX2p1bmcsIGNfam9uZzsKLQkJCXVuc2lnbmVkIGNoYXIgaV9jaG8sIGlfanVuZywgaV9qb25nOworICAgICAgICBpZiAoYyA8IDB4ZDgpIHsKKyAgICAgICAgICAgIC8qIGpvaGFiIGhhbmd1bCAqLworICAgICAgICAgICAgdW5zaWduZWQgY2hhciBjX2NobywgY19qdW5nLCBjX2pvbmc7CisgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGlfY2hvLCBpX2p1bmcsIGlfam9uZzsKIAotCQkJY19jaG8gPSAoYyA+PiAyKSAmIDB4MWY7Ci0JCQljX2p1bmcgPSAoKGMgPDwgMykgfCBjMiA+PiA1KSAmIDB4MWY7Ci0JCQljX2pvbmcgPSBjMiAmIDB4MWY7CisgICAgICAgICAgICBjX2NobyA9IChjID4+IDIpICYgMHgxZjsKKyAgICAgICAgICAgIGNfanVuZyA9ICgoYyA8PCAzKSB8IGMyID4+IDUpICYgMHgxZjsKKyAgICAgICAgICAgIGNfam9uZyA9IGMyICYgMHgxZjsKIAotCQkJaV9jaG8gPSBqb2hhYmlkeF9jaG9zZW9uZ1tjX2Nob107Ci0JCQlpX2p1bmcgPSBqb2hhYmlkeF9qdW5nc2VvbmdbY19qdW5nXTsKLQkJCWlfam9uZyA9IGpvaGFiaWR4X2pvbmdzZW9uZ1tjX2pvbmddOworICAgICAgICAgICAgaV9jaG8gPSBqb2hhYmlkeF9jaG9zZW9uZ1tjX2Nob107CisgICAgICAgICAgICBpX2p1bmcgPSBqb2hhYmlkeF9qdW5nc2VvbmdbY19qdW5nXTsKKyAgICAgICAgICAgIGlfam9uZyA9IGpvaGFiaWR4X2pvbmdzZW9uZ1tjX2pvbmddOwogCi0JCQlpZiAoaV9jaG8gPT0gTk9ORSB8fCBpX2p1bmcgPT0gTk9ORSB8fCBpX2pvbmcgPT0gTk9ORSkKLQkJCQlyZXR1cm4gMjsKKyAgICAgICAgICAgIGlmIChpX2NobyA9PSBOT05FIHx8IGlfanVuZyA9PSBOT05FIHx8IGlfam9uZyA9PSBOT05FKQorICAgICAgICAgICAgICAgIHJldHVybiAyOwogCi0JCQkvKiB3ZSBkb24ndCB1c2UgVSsxMTAwIGhhbmd1bCBqYW1vIHlldC4gKi8KLQkJCWlmIChpX2NobyA9PSBGSUxMKSB7Ci0JCQkJaWYgKGlfanVuZyA9PSBGSUxMKSB7Ci0JCQkJCWlmIChpX2pvbmcgPT0gRklMTCkKLQkJCQkJCU9VVDEoMHgzMDAwKQotCQkJCQllbHNlCi0JCQkJCQlPVVQxKDB4MzEwMCB8Ci0JCQkJCQkgIGpvaGFiamFtb19qb25nc2VvbmdbY19qb25nXSkKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWlmIChpX2pvbmcgPT0gRklMTCkKLQkJCQkJCU9VVDEoMHgzMTAwIHwKLQkJCQkJCSAgam9oYWJqYW1vX2p1bmdzZW9uZ1tjX2p1bmddKQotCQkJCQllbHNlCi0JCQkJCQlyZXR1cm4gMjsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWlmIChpX2p1bmcgPT0gRklMTCkgewotCQkJCQlpZiAoaV9qb25nID09IEZJTEwpCi0JCQkJCQlPVVQxKDB4MzEwMCB8Ci0JCQkJCQkgIGpvaGFiamFtb19jaG9zZW9uZ1tjX2Nob10pCi0JCQkJCWVsc2UKLQkJCQkJCXJldHVybiAyOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJCU9VVDEoMHhhYzAwICsKLQkJCQkJICAgICBpX2NobyAqIDU4OCArCi0JCQkJCSAgICAgaV9qdW5nICogMjggKwotCQkJCQkgICAgIChpX2pvbmcgPT0gRklMTCA/IDAgOiBpX2pvbmcpKQotCQkJfQotCQkJTkVYVCgyLCAxKQotCQl9IGVsc2UgewotCQkJLyogS1MgWCAxMDAxIGV4Y2VwdCBoYW5ndWwgamFtb3MgYW5kIHN5bGxhYmxlcyAqLwotCQkJaWYgKGMgPT0gMHhkZiB8fCBjID4gMHhmOSB8fAotCQkJICAgIGMyIDwgMHgzMSB8fCAoYzIgPj0gMHg4MCAmJiBjMiA8IDB4OTEpIHx8Ci0JCQkgICAgKGMyICYgMHg3ZikgPT0gMHg3ZiB8fAotCQkJICAgIChjID09IDB4ZGEgJiYgKGMyID49IDB4YTEgJiYgYzIgPD0gMHhkMykpKQotCQkJCXJldHVybiAyOwotCQkJZWxzZSB7Ci0JCQkJdW5zaWduZWQgY2hhciB0MSwgdDI7CisgICAgICAgICAgICAvKiB3ZSBkb24ndCB1c2UgVSsxMTAwIGhhbmd1bCBqYW1vIHlldC4gKi8KKyAgICAgICAgICAgIGlmIChpX2NobyA9PSBGSUxMKSB7CisgICAgICAgICAgICAgICAgaWYgKGlfanVuZyA9PSBGSUxMKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpX2pvbmcgPT0gRklMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIE9VVDEoMHgzMDAwKQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBPVVQxKDB4MzEwMCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgIGpvaGFiamFtb19qb25nc2VvbmdbY19qb25nXSkKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpX2pvbmcgPT0gRklMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIE9VVDEoMHgzMTAwIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgam9oYWJqYW1vX2p1bmdzZW9uZ1tjX2p1bmddKQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChpX2p1bmcgPT0gRklMTCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoaV9qb25nID09IEZJTEwpCisgICAgICAgICAgICAgICAgICAgICAgICBPVVQxKDB4MzEwMCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgIGpvaGFiamFtb19jaG9zZW9uZ1tjX2Nob10pCisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIE9VVDEoMHhhYzAwICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBpX2NobyAqIDU4OCArCisgICAgICAgICAgICAgICAgICAgICAgICAgaV9qdW5nICogMjggKworICAgICAgICAgICAgICAgICAgICAgICAgIChpX2pvbmcgPT0gRklMTCA/IDAgOiBpX2pvbmcpKQorICAgICAgICAgICAgfQorICAgICAgICAgICAgTkVYVCgyLCAxKQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogS1MgWCAxMDAxIGV4Y2VwdCBoYW5ndWwgamFtb3MgYW5kIHN5bGxhYmxlcyAqLworICAgICAgICAgICAgaWYgKGMgPT0gMHhkZiB8fCBjID4gMHhmOSB8fAorICAgICAgICAgICAgICAgIGMyIDwgMHgzMSB8fCAoYzIgPj0gMHg4MCAmJiBjMiA8IDB4OTEpIHx8CisgICAgICAgICAgICAgICAgKGMyICYgMHg3ZikgPT0gMHg3ZiB8fAorICAgICAgICAgICAgICAgIChjID09IDB4ZGEgJiYgKGMyID49IDB4YTEgJiYgYzIgPD0gMHhkMykpKQorICAgICAgICAgICAgICAgIHJldHVybiAyOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciB0MSwgdDI7CiAKLQkJCQl0MSA9IChjIDwgMHhlMCA/IDIgKiAoYyAtIDB4ZDkpIDoKLQkJCQkJCSAyICogYyAtIDB4MTk3KTsKLQkJCQl0MiA9IChjMiA8IDB4OTEgPyBjMiAtIDB4MzEgOiBjMiAtIDB4NDMpOwotCQkJCXQxID0gdDEgKyAodDIgPCAweDVlID8gMCA6IDEpICsgMHgyMTsKLQkJCQl0MiA9ICh0MiA8IDB4NWUgPyB0MiA6IHQyIC0gMHg1ZSkgKyAweDIxOworICAgICAgICAgICAgICAgIHQxID0gKGMgPCAweGUwID8gMiAqIChjIC0gMHhkOSkgOgorICAgICAgICAgICAgICAgICAgICAgICAgIDIgKiBjIC0gMHgxOTcpOworICAgICAgICAgICAgICAgIHQyID0gKGMyIDwgMHg5MSA/IGMyIC0gMHgzMSA6IGMyIC0gMHg0Myk7CisgICAgICAgICAgICAgICAgdDEgPSB0MSArICh0MiA8IDB4NWUgPyAwIDogMSkgKyAweDIxOworICAgICAgICAgICAgICAgIHQyID0gKHQyIDwgMHg1ZSA/IHQyIDogdDIgLSAweDVlKSArIDB4MjE7CiAKLQkJCQlUUllNQVBfREVDKGtzeDEwMDEsICoqb3V0YnVmLCB0MSwgdDIpOwotCQkJCWVsc2UgcmV0dXJuIDI7Ci0JCQkJTkVYVCgyLCAxKQotCQkJfQotCQl9Ci0JfQorICAgICAgICAgICAgICAgIFRSWU1BUF9ERUMoa3N4MTAwMSwgKipvdXRidWYsIHQxLCB0Mik7CisgICAgICAgICAgICAgICAgZWxzZSByZXR1cm4gMjsKKyAgICAgICAgICAgICAgICBORVhUKDIsIDEpCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKIH0KICN1bmRlZiBOT05FCiAjdW5kZWYgRklMTApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jamtjb2RlY3MvX2NvZGVjc190dy5jIGIvTW9kdWxlcy9jamtjb2RlY3MvX2NvZGVjc190dy5jCmluZGV4IDhjY2JjYTEuLjM4Y2Y3MjMgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvY2prY29kZWNzL19jb2RlY3NfdHcuYworKysgYi9Nb2R1bGVzL2Nqa2NvZGVjcy9fY29kZWNzX3R3LmMKQEAgLTEzLDUyICsxMyw1MiBAQAogCiBFTkNPREVSKGJpZzUpCiB7Ci0Jd2hpbGUgKGlubGVmdCA+IDApIHsKLQkJUHlfVU5JQ09ERSBjID0gKippbmJ1ZjsKLQkJREJDSEFSIGNvZGU7CisgICAgd2hpbGUgKGlubGVmdCA+IDApIHsKKyAgICAgICAgUHlfVU5JQ09ERSBjID0gKippbmJ1ZjsKKyAgICAgICAgREJDSEFSIGNvZGU7CiAKLQkJaWYgKGMgPCAweDgwKSB7Ci0JCQlSRVFVSVJFX09VVEJVRigxKQotCQkJKipvdXRidWYgPSAodW5zaWduZWQgY2hhciljOwotCQkJTkVYVCgxLCAxKQotCQkJY29udGludWU7Ci0JCX0KLQkJVUNTNElOVkFMSUQoYykKKyAgICAgICAgaWYgKGMgPCAweDgwKSB7CisgICAgICAgICAgICBSRVFVSVJFX09VVEJVRigxKQorICAgICAgICAgICAgKipvdXRidWYgPSAodW5zaWduZWQgY2hhciljOworICAgICAgICAgICAgTkVYVCgxLCAxKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgVUNTNElOVkFMSUQoYykKIAotCQlSRVFVSVJFX09VVEJVRigyKQorICAgICAgICBSRVFVSVJFX09VVEJVRigyKQogCi0JCVRSWU1BUF9FTkMoYmlnNSwgY29kZSwgYyk7Ci0JCWVsc2UgcmV0dXJuIDE7CisgICAgICAgIFRSWU1BUF9FTkMoYmlnNSwgY29kZSwgYyk7CisgICAgICAgIGVsc2UgcmV0dXJuIDE7CiAKLQkJT1VUMShjb2RlID4+IDgpCi0JCU9VVDIoY29kZSAmIDB4RkYpCi0JCU5FWFQoMSwgMikKLQl9CisgICAgICAgIE9VVDEoY29kZSA+PiA4KQorICAgICAgICBPVVQyKGNvZGUgJiAweEZGKQorICAgICAgICBORVhUKDEsIDIpCisgICAgfQogCi0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiB9CiAKIERFQ09ERVIoYmlnNSkKIHsKLQl3aGlsZSAoaW5sZWZ0ID4gMCkgewotCQl1bnNpZ25lZCBjaGFyIGMgPSBJTjE7CisgICAgd2hpbGUgKGlubGVmdCA+IDApIHsKKyAgICAgICAgdW5zaWduZWQgY2hhciBjID0gSU4xOwogCi0JCVJFUVVJUkVfT1VUQlVGKDEpCisgICAgICAgIFJFUVVJUkVfT1VUQlVGKDEpCiAKLQkJaWYgKGMgPCAweDgwKSB7Ci0JCQlPVVQxKGMpCi0JCQlORVhUKDEsIDEpCi0JCQljb250aW51ZTsKLQkJfQorICAgICAgICBpZiAoYyA8IDB4ODApIHsKKyAgICAgICAgICAgIE9VVDEoYykKKyAgICAgICAgICAgIE5FWFQoMSwgMSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CiAKLQkJUkVRVUlSRV9JTkJVRigyKQotCQlUUllNQVBfREVDKGJpZzUsICoqb3V0YnVmLCBjLCBJTjIpIHsKLQkJCU5FWFQoMiwgMSkKLQkJfQotCQllbHNlIHJldHVybiAyOwotCX0KKyAgICAgICAgUkVRVUlSRV9JTkJVRigyKQorICAgICAgICBUUllNQVBfREVDKGJpZzUsICoqb3V0YnVmLCBjLCBJTjIpIHsKKyAgICAgICAgICAgIE5FWFQoMiwgMSkKKyAgICAgICAgfQorICAgICAgICBlbHNlIHJldHVybiAyOworICAgIH0KIAotCXJldHVybiAwOworICAgIHJldHVybiAwOwogfQogCiAKQEAgLTY4LDUzICs2OCw1MyBAQAogCiBFTkNPREVSKGNwOTUwKQogewotCXdoaWxlIChpbmxlZnQgPiAwKSB7Ci0JCVB5X1VOSUNPREUgYyA9IElOMTsKLQkJREJDSEFSIGNvZGU7CisgICAgd2hpbGUgKGlubGVmdCA+IDApIHsKKyAgICAgICAgUHlfVU5JQ09ERSBjID0gSU4xOworICAgICAgICBEQkNIQVIgY29kZTsKIAotCQlpZiAoYyA8IDB4ODApIHsKLQkJCVdSSVRFMSgodW5zaWduZWQgY2hhciljKQotCQkJTkVYVCgxLCAxKQotCQkJY29udGludWU7Ci0JCX0KLQkJVUNTNElOVkFMSUQoYykKKyAgICAgICAgaWYgKGMgPCAweDgwKSB7CisgICAgICAgICAgICBXUklURTEoKHVuc2lnbmVkIGNoYXIpYykKKyAgICAgICAgICAgIE5FWFQoMSwgMSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIFVDUzRJTlZBTElEKGMpCiAKLQkJUkVRVUlSRV9PVVRCVUYoMikKLQkJVFJZTUFQX0VOQyhjcDk1MGV4dCwgY29kZSwgYyk7Ci0JCWVsc2UgVFJZTUFQX0VOQyhiaWc1LCBjb2RlLCBjKTsKLQkJZWxzZSByZXR1cm4gMTsKKyAgICAgICAgUkVRVUlSRV9PVVRCVUYoMikKKyAgICAgICAgVFJZTUFQX0VOQyhjcDk1MGV4dCwgY29kZSwgYyk7CisgICAgICAgIGVsc2UgVFJZTUFQX0VOQyhiaWc1LCBjb2RlLCBjKTsKKyAgICAgICAgZWxzZSByZXR1cm4gMTsKIAotCQlPVVQxKGNvZGUgPj4gOCkKLQkJT1VUMihjb2RlICYgMHhGRikKLQkJTkVYVCgxLCAyKQotCX0KKyAgICAgICAgT1VUMShjb2RlID4+IDgpCisgICAgICAgIE9VVDIoY29kZSAmIDB4RkYpCisgICAgICAgIE5FWFQoMSwgMikKKyAgICB9CiAKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKIH0KIAogREVDT0RFUihjcDk1MCkKIHsKLQl3aGlsZSAoaW5sZWZ0ID4gMCkgewotCQl1bnNpZ25lZCBjaGFyIGMgPSBJTjE7CisgICAgd2hpbGUgKGlubGVmdCA+IDApIHsKKyAgICAgICAgdW5zaWduZWQgY2hhciBjID0gSU4xOwogCi0JCVJFUVVJUkVfT1VUQlVGKDEpCisgICAgICAgIFJFUVVJUkVfT1VUQlVGKDEpCiAKLQkJaWYgKGMgPCAweDgwKSB7Ci0JCQlPVVQxKGMpCi0JCQlORVhUKDEsIDEpCi0JCQljb250aW51ZTsKLQkJfQorICAgICAgICBpZiAoYyA8IDB4ODApIHsKKyAgICAgICAgICAgIE9VVDEoYykKKyAgICAgICAgICAgIE5FWFQoMSwgMSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CiAKLQkJUkVRVUlSRV9JTkJVRigyKQorICAgICAgICBSRVFVSVJFX0lOQlVGKDIpCiAKLQkJVFJZTUFQX0RFQyhjcDk1MGV4dCwgKipvdXRidWYsIGMsIElOMik7Ci0JCWVsc2UgVFJZTUFQX0RFQyhiaWc1LCAqKm91dGJ1ZiwgYywgSU4yKTsKLQkJZWxzZSByZXR1cm4gMjsKKyAgICAgICAgVFJZTUFQX0RFQyhjcDk1MGV4dCwgKipvdXRidWYsIGMsIElOMik7CisgICAgICAgIGVsc2UgVFJZTUFQX0RFQyhiaWc1LCAqKm91dGJ1ZiwgYywgSU4yKTsKKyAgICAgICAgZWxzZSByZXR1cm4gMjsKIAotCQlORVhUKDIsIDEpCi0JfQorICAgICAgICBORVhUKDIsIDEpCisgICAgfQogCi0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiB9CiAKIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jamtjb2RlY3MvYWxnX2ppc3gwMjAxLmggYi9Nb2R1bGVzL2Nqa2NvZGVjcy9hbGdfamlzeDAyMDEuaAppbmRleCAxZmNhMDZiLi4wYmM3ZGI1IDEwMDY0NAotLS0gYS9Nb2R1bGVzL2Nqa2NvZGVjcy9hbGdfamlzeDAyMDEuaAorKysgYi9Nb2R1bGVzL2Nqa2NvZGVjcy9hbGdfamlzeDAyMDEuaApAQCAtMSwyNCArMSwyNCBAQAotI2RlZmluZSBKSVNYMDIwMV9SX0VOQ09ERShjLCBhc3NpKQkJCVwKLQlpZiAoKGMpIDwgMHg4MCAmJiAoYykgIT0gMHg1YyAmJiAoYykgIT0gMHg3ZSkJXAotCQkoYXNzaSkgPSAoYyk7CQkJCVwKLQllbHNlIGlmICgoYykgPT0gMHgwMGE1KSAoYXNzaSkgPSAweDVjOwkJXAotCWVsc2UgaWYgKChjKSA9PSAweDIwM2UpIChhc3NpKSA9IDB4N2U7Ci0jZGVmaW5lIEpJU1gwMjAxX0tfRU5DT0RFKGMsIGFzc2kpCQkJXAotCWlmICgoYykgPj0gMHhmZjYxICYmIChjKSA8PSAweGZmOWYpCQlcCi0JCShhc3NpKSA9IChjKSAtIDB4ZmVjMDsKLSNkZWZpbmUgSklTWDAyMDFfRU5DT0RFKGMsIGFzc2kpCQkJXAotCUpJU1gwMjAxX1JfRU5DT0RFKGMsIGFzc2kpCQkJXAotCWVsc2UgSklTWDAyMDFfS19FTkNPREUoYywgYXNzaSkKKyNkZWZpbmUgSklTWDAyMDFfUl9FTkNPREUoYywgYXNzaSkgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICgoYykgPCAweDgwICYmIChjKSAhPSAweDVjICYmIChjKSAhPSAweDdlKSAgICAgICBcCisgICAgICAgIChhc3NpKSA9IChjKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNlIGlmICgoYykgPT0gMHgwMGE1KSAoYXNzaSkgPSAweDVjOyAgICAgICAgICAgICAgXAorICAgIGVsc2UgaWYgKChjKSA9PSAweDIwM2UpIChhc3NpKSA9IDB4N2U7CisjZGVmaW5lIEpJU1gwMjAxX0tfRU5DT0RFKGMsIGFzc2kpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoKGMpID49IDB4ZmY2MSAmJiAoYykgPD0gMHhmZjlmKSAgICAgICAgICAgICAgICAgXAorICAgICAgICAoYXNzaSkgPSAoYykgLSAweGZlYzA7CisjZGVmaW5lIEpJU1gwMjAxX0VOQ09ERShjLCBhc3NpKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBKSVNYMDIwMV9SX0VOQ09ERShjLCBhc3NpKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgSklTWDAyMDFfS19FTkNPREUoYywgYXNzaSkKIAotI2RlZmluZSBKSVNYMDIwMV9SX0RFQ09ERShjLCBhc3NpKQkJCVwKLQlpZiAoKGMpIDwgMHg1YykgKGFzc2kpID0gKGMpOwkJCVwKLQllbHNlIGlmICgoYykgPT0gMHg1YykgKGFzc2kpID0gMHgwMGE1OwkJXAotCWVsc2UgaWYgKChjKSA8IDB4N2UpIChhc3NpKSA9IChjKTsJCVwKLQllbHNlIGlmICgoYykgPT0gMHg3ZSkgKGFzc2kpID0gMHgyMDNlOwkJXAotCWVsc2UgaWYgKChjKSA9PSAweDdmKSAoYXNzaSkgPSAweDdmOwotI2RlZmluZSBKSVNYMDIwMV9LX0RFQ09ERShjLCBhc3NpKQkJCVwKLQlpZiAoKGMpID49IDB4YTEgJiYgKGMpIDw9IDB4ZGYpCQkJXAotCShhc3NpKSA9IDB4ZmVjMCArIChjKTsKLSNkZWZpbmUgSklTWDAyMDFfREVDT0RFKGMsIGFzc2kpCQkJXAotCUpJU1gwMjAxX1JfREVDT0RFKGMsIGFzc2kpCQkJXAotCWVsc2UgSklTWDAyMDFfS19ERUNPREUoYywgYXNzaSkKKyNkZWZpbmUgSklTWDAyMDFfUl9ERUNPREUoYywgYXNzaSkgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICgoYykgPCAweDVjKSAoYXNzaSkgPSAoYyk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZWxzZSBpZiAoKGMpID09IDB4NWMpIChhc3NpKSA9IDB4MDBhNTsgICAgICAgICAgICAgIFwKKyAgICBlbHNlIGlmICgoYykgPCAweDdlKSAoYXNzaSkgPSAoYyk7ICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgaWYgKChjKSA9PSAweDdlKSAoYXNzaSkgPSAweDIwM2U7ICAgICAgICAgICAgICBcCisgICAgZWxzZSBpZiAoKGMpID09IDB4N2YpIChhc3NpKSA9IDB4N2Y7CisjZGVmaW5lIEpJU1gwMjAxX0tfREVDT0RFKGMsIGFzc2kpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoKGMpID49IDB4YTEgJiYgKGMpIDw9IDB4ZGYpICAgICAgICAgICAgICAgICAgICAgXAorICAgIChhc3NpKSA9IDB4ZmVjMCArIChjKTsKKyNkZWZpbmUgSklTWDAyMDFfREVDT0RFKGMsIGFzc2kpICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEpJU1gwMjAxX1JfREVDT0RFKGMsIGFzc2kpICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZWxzZSBKSVNYMDIwMV9LX0RFQ09ERShjLCBhc3NpKQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jamtjb2RlY3MvY2prY29kZWNzLmggYi9Nb2R1bGVzL2Nqa2NvZGVjcy9jamtjb2RlY3MuaAppbmRleCA0MDA1YmNmLi5mYWUwYzYyIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2Nqa2NvZGVjcy9jamtjb2RlY3MuaAorKysgYi9Nb2R1bGVzL2Nqa2NvZGVjcy9jamtjb2RlY3MuaApAQCAtMTMsMTIgKzEzLDEyIEBACiAKIAogLyogYSB1bmljb2RlICJ1bmRlZmluZWQiIGNvZGVwb2ludCAqLwotI2RlZmluZSBVTklJTlYJMHhGRkZFCisjZGVmaW5lIFVOSUlOViAgMHhGRkZFCiAKIC8qIGludGVybmFsLXVzZSBEQkNTIGNvZGVwb2ludHMgd2hpY2ggYXJlbid0IHVzZWQgYnkgYW55IGNoYXJzZXRzICovCi0jZGVmaW5lIE5PQ0hBUgkweEZGRkYKLSNkZWZpbmUgTVVMVElDCTB4RkZGRQotI2RlZmluZSBEQkNJTlYJMHhGRkZECisjZGVmaW5lIE5PQ0hBUiAgMHhGRkZGCisjZGVmaW5lIE1VTFRJQyAgMHhGRkZFCisjZGVmaW5lIERCQ0lOViAgMHhGRkZECiAKIC8qIHNob3J0ZXIgbWFjcm9zIHRvIHNhdmUgc291cmNlIHNpemUgb2YgbWFwcGluZyB0YWJsZXMgKi8KICNkZWZpbmUgVSBVTklJTlYKQEAgLTI3LDk0ICsyNyw5NCBAQAogI2RlZmluZSBEIERCQ0lOVgogCiBzdHJ1Y3QgZGJjc19pbmRleCB7Ci0JY29uc3QgdWNzMl90ICptYXA7Ci0JdW5zaWduZWQgY2hhciBib3R0b20sIHRvcDsKKyAgICBjb25zdCB1Y3MyX3QgKm1hcDsKKyAgICB1bnNpZ25lZCBjaGFyIGJvdHRvbSwgdG9wOwogfTsKIHR5cGVkZWYgc3RydWN0IGRiY3NfaW5kZXggZGVjb2RlX21hcDsKIAogc3RydWN0IHdpZGVkYmNzX2luZGV4IHsKLQljb25zdCB1Y3M0X3QgKm1hcDsKLQl1bnNpZ25lZCBjaGFyIGJvdHRvbSwgdG9wOworICAgIGNvbnN0IHVjczRfdCAqbWFwOworICAgIHVuc2lnbmVkIGNoYXIgYm90dG9tLCB0b3A7CiB9OwogdHlwZWRlZiBzdHJ1Y3Qgd2lkZWRiY3NfaW5kZXggd2lkZWRlY29kZV9tYXA7CiAKIHN0cnVjdCB1bmltX2luZGV4IHsKLQljb25zdCBEQkNIQVIgKm1hcDsKLQl1bnNpZ25lZCBjaGFyIGJvdHRvbSwgdG9wOworICAgIGNvbnN0IERCQ0hBUiAqbWFwOworICAgIHVuc2lnbmVkIGNoYXIgYm90dG9tLCB0b3A7CiB9OwogdHlwZWRlZiBzdHJ1Y3QgdW5pbV9pbmRleCBlbmNvZGVfbWFwOwogCiBzdHJ1Y3QgdW5pbV9pbmRleF9ieXRlYmFzZWQgewotCWNvbnN0IHVuc2lnbmVkIGNoYXIgKm1hcDsKLQl1bnNpZ25lZCBjaGFyIGJvdHRvbSwgdG9wOworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm1hcDsKKyAgICB1bnNpZ25lZCBjaGFyIGJvdHRvbSwgdG9wOwogfTsKIAogc3RydWN0IGRiY3NfbWFwIHsKLQljb25zdCBjaGFyICpjaGFyc2V0OwotCWNvbnN0IHN0cnVjdCB1bmltX2luZGV4ICplbmNtYXA7Ci0JY29uc3Qgc3RydWN0IGRiY3NfaW5kZXggKmRlY21hcDsKKyAgICBjb25zdCBjaGFyICpjaGFyc2V0OworICAgIGNvbnN0IHN0cnVjdCB1bmltX2luZGV4ICplbmNtYXA7CisgICAgY29uc3Qgc3RydWN0IGRiY3NfaW5kZXggKmRlY21hcDsKIH07CiAKIHN0cnVjdCBwYWlyX2VuY29kZW1hcCB7Ci0JdWNzNF90IHVuaXNlcTsKLQlEQkNIQVIgY29kZTsKKyAgICB1Y3M0X3QgdW5pc2VxOworICAgIERCQ0hBUiBjb2RlOwogfTsKIAogc3RhdGljIGNvbnN0IE11bHRpYnl0ZUNvZGVjICpjb2RlY19saXN0Owogc3RhdGljIGNvbnN0IHN0cnVjdCBkYmNzX21hcCAqbWFwcGluZ19saXN0OwogCi0jZGVmaW5lIENPREVDX0lOSVQoZW5jb2RpbmcpCQkJCQkJXAotCXN0YXRpYyBpbnQgZW5jb2RpbmcjI19jb2RlY19pbml0KGNvbnN0IHZvaWQgKmNvbmZpZykKKyNkZWZpbmUgQ09ERUNfSU5JVChlbmNvZGluZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdGF0aWMgaW50IGVuY29kaW5nIyNfY29kZWNfaW5pdChjb25zdCB2b2lkICpjb25maWcpCiAKLSNkZWZpbmUgRU5DT0RFUl9JTklUKGVuY29kaW5nKQkJCQkJCVwKLQlzdGF0aWMgaW50IGVuY29kaW5nIyNfZW5jb2RlX2luaXQoCQkJCVwKLQkJTXVsdGlieXRlQ29kZWNfU3RhdGUgKnN0YXRlLCBjb25zdCB2b2lkICpjb25maWcpCi0jZGVmaW5lIEVOQ09ERVIoZW5jb2RpbmcpCQkJCQkJXAotCXN0YXRpYyBQeV9zc2l6ZV90IGVuY29kaW5nIyNfZW5jb2RlKAkJCQlcCi0JCU11bHRpYnl0ZUNvZGVjX1N0YXRlICpzdGF0ZSwgY29uc3Qgdm9pZCAqY29uZmlnLAlcCi0JCWNvbnN0IFB5X1VOSUNPREUgKippbmJ1ZiwgUHlfc3NpemVfdCBpbmxlZnQsCQlcCi0JCXVuc2lnbmVkIGNoYXIgKipvdXRidWYsIFB5X3NzaXplX3Qgb3V0bGVmdCwgaW50IGZsYWdzKQotI2RlZmluZSBFTkNPREVSX1JFU0VUKGVuY29kaW5nKQkJCQkJCVwKLQlzdGF0aWMgUHlfc3NpemVfdCBlbmNvZGluZyMjX2VuY29kZV9yZXNldCgJCQlcCi0JCU11bHRpYnl0ZUNvZGVjX1N0YXRlICpzdGF0ZSwgY29uc3Qgdm9pZCAqY29uZmlnLAlcCi0JCXVuc2lnbmVkIGNoYXIgKipvdXRidWYsIFB5X3NzaXplX3Qgb3V0bGVmdCkKKyNkZWZpbmUgRU5DT0RFUl9JTklUKGVuY29kaW5nKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdGF0aWMgaW50IGVuY29kaW5nIyNfZW5jb2RlX2luaXQoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTXVsdGlieXRlQ29kZWNfU3RhdGUgKnN0YXRlLCBjb25zdCB2b2lkICpjb25maWcpCisjZGVmaW5lIEVOQ09ERVIoZW5jb2RpbmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RhdGljIFB5X3NzaXplX3QgZW5jb2RpbmcjI19lbmNvZGUoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE11bHRpYnl0ZUNvZGVjX1N0YXRlICpzdGF0ZSwgY29uc3Qgdm9pZCAqY29uZmlnLCAgICAgICAgICAgICAgICBcCisgICAgICAgIGNvbnN0IFB5X1VOSUNPREUgKippbmJ1ZiwgUHlfc3NpemVfdCBpbmxlZnQsICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHVuc2lnbmVkIGNoYXIgKipvdXRidWYsIFB5X3NzaXplX3Qgb3V0bGVmdCwgaW50IGZsYWdzKQorI2RlZmluZSBFTkNPREVSX1JFU0VUKGVuY29kaW5nKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0YXRpYyBQeV9zc2l6ZV90IGVuY29kaW5nIyNfZW5jb2RlX3Jlc2V0KCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBNdWx0aWJ5dGVDb2RlY19TdGF0ZSAqc3RhdGUsIGNvbnN0IHZvaWQgKmNvbmZpZywgICAgICAgICAgICAgICAgXAorICAgICAgICB1bnNpZ25lZCBjaGFyICoqb3V0YnVmLCBQeV9zc2l6ZV90IG91dGxlZnQpCiAKLSNkZWZpbmUgREVDT0RFUl9JTklUKGVuY29kaW5nKQkJCQkJCVwKLQlzdGF0aWMgaW50IGVuY29kaW5nIyNfZGVjb2RlX2luaXQoCQkJCVwKLQkJTXVsdGlieXRlQ29kZWNfU3RhdGUgKnN0YXRlLCBjb25zdCB2b2lkICpjb25maWcpCi0jZGVmaW5lIERFQ09ERVIoZW5jb2RpbmcpCQkJCQkJXAotCXN0YXRpYyBQeV9zc2l6ZV90IGVuY29kaW5nIyNfZGVjb2RlKAkJCQlcCi0JCU11bHRpYnl0ZUNvZGVjX1N0YXRlICpzdGF0ZSwgY29uc3Qgdm9pZCAqY29uZmlnLAlcCi0JCWNvbnN0IHVuc2lnbmVkIGNoYXIgKippbmJ1ZiwgUHlfc3NpemVfdCBpbmxlZnQsCQlcCi0JCVB5X1VOSUNPREUgKipvdXRidWYsIFB5X3NzaXplX3Qgb3V0bGVmdCkKLSNkZWZpbmUgREVDT0RFUl9SRVNFVChlbmNvZGluZykJCQkJCQlcCi0Jc3RhdGljIFB5X3NzaXplX3QgZW5jb2RpbmcjI19kZWNvZGVfcmVzZXQoCQkJXAotCQlNdWx0aWJ5dGVDb2RlY19TdGF0ZSAqc3RhdGUsIGNvbnN0IHZvaWQgKmNvbmZpZykKKyNkZWZpbmUgREVDT0RFUl9JTklUKGVuY29kaW5nKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdGF0aWMgaW50IGVuY29kaW5nIyNfZGVjb2RlX2luaXQoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTXVsdGlieXRlQ29kZWNfU3RhdGUgKnN0YXRlLCBjb25zdCB2b2lkICpjb25maWcpCisjZGVmaW5lIERFQ09ERVIoZW5jb2RpbmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RhdGljIFB5X3NzaXplX3QgZW5jb2RpbmcjI19kZWNvZGUoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE11bHRpYnl0ZUNvZGVjX1N0YXRlICpzdGF0ZSwgY29uc3Qgdm9pZCAqY29uZmlnLCAgICAgICAgICAgICAgICBcCisgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKippbmJ1ZiwgUHlfc3NpemVfdCBpbmxlZnQsICAgICAgICAgICAgICAgICBcCisgICAgICAgIFB5X1VOSUNPREUgKipvdXRidWYsIFB5X3NzaXplX3Qgb3V0bGVmdCkKKyNkZWZpbmUgREVDT0RFUl9SRVNFVChlbmNvZGluZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdGF0aWMgUHlfc3NpemVfdCBlbmNvZGluZyMjX2RlY29kZV9yZXNldCggICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTXVsdGlieXRlQ29kZWNfU3RhdGUgKnN0YXRlLCBjb25zdCB2b2lkICpjb25maWcpCiAKICNpZiBQeV9VTklDT0RFX1NJWkUgPT0gNAotI2RlZmluZSBVQ1M0SU5WQUxJRChjb2RlKQlcCi0JaWYgKChjb2RlKSA+IDB4RkZGRikJXAotCXJldHVybiAxOworI2RlZmluZSBVQ1M0SU5WQUxJRChjb2RlKSAgICAgICBcCisgICAgaWYgKChjb2RlKSA+IDB4RkZGRikgICAgICAgIFwKKyAgICByZXR1cm4gMTsKICNlbHNlCi0jZGVmaW5lIFVDUzRJTlZBTElEKGNvZGUpCVwKLQlpZiAoMCkgOworI2RlZmluZSBVQ1M0SU5WQUxJRChjb2RlKSAgICAgICBcCisgICAgaWYgKDApIDsKICNlbmRpZgogCi0jZGVmaW5lIE5FWFRfSU4oaSkJCQkJXAotCSgqaW5idWYpICs9IChpKTsJCQlcCi0JKGlubGVmdCkgLT0gKGkpOwotI2RlZmluZSBORVhUX09VVChvKQkJCQlcCi0JKCpvdXRidWYpICs9IChvKTsJCQlcCi0JKG91dGxlZnQpIC09IChvKTsKLSNkZWZpbmUgTkVYVChpLCBvKQkJCQlcCi0JTkVYVF9JTihpKSBORVhUX09VVChvKQorI2RlZmluZSBORVhUX0lOKGkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgqaW5idWYpICs9IChpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChpbmxlZnQpIC09IChpKTsKKyNkZWZpbmUgTkVYVF9PVVQobykgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKm91dGJ1ZikgKz0gKG8pOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAob3V0bGVmdCkgLT0gKG8pOworI2RlZmluZSBORVhUKGksIG8pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE5FWFRfSU4oaSkgTkVYVF9PVVQobykKIAotI2RlZmluZSBSRVFVSVJFX0lOQlVGKG4pCQkJXAotCWlmIChpbmxlZnQgPCAobikpCQkJXAotCQlyZXR1cm4gTUJFUlJfVE9PRkVXOwotI2RlZmluZSBSRVFVSVJFX09VVEJVRihuKQkJCVwKLQlpZiAob3V0bGVmdCA8IChuKSkJCQlcCi0JCXJldHVybiBNQkVSUl9UT09TTUFMTDsKKyNkZWZpbmUgUkVRVUlSRV9JTkJVRihuKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoaW5sZWZ0IDwgKG4pKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuIE1CRVJSX1RPT0ZFVzsKKyNkZWZpbmUgUkVRVUlSRV9PVVRCVUYobikgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAob3V0bGVmdCA8IChuKSkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuIE1CRVJSX1RPT1NNQUxMOwogCiAjZGVmaW5lIElOMSAoKCppbmJ1ZilbMF0pCiAjZGVmaW5lIElOMiAoKCppbmJ1ZilbMV0pCkBAIC0xMjYsMjczICsxMjYsMjczIEBACiAjZGVmaW5lIE9VVDMoYykgKCgqb3V0YnVmKVsyXSkgPSAoYyk7CiAjZGVmaW5lIE9VVDQoYykgKCgqb3V0YnVmKVszXSkgPSAoYyk7CiAKLSNkZWZpbmUgV1JJVEUxKGMxKQkJXAotCVJFUVVJUkVfT1VUQlVGKDEpCVwKLQkoKm91dGJ1ZilbMF0gPSAoYzEpOwotI2RlZmluZSBXUklURTIoYzEsIGMyKQkJXAotCVJFUVVJUkVfT1VUQlVGKDIpCVwKLQkoKm91dGJ1ZilbMF0gPSAoYzEpOwlcCi0JKCpvdXRidWYpWzFdID0gKGMyKTsKLSNkZWZpbmUgV1JJVEUzKGMxLCBjMiwgYzMpCVwKLQlSRVFVSVJFX09VVEJVRigzKQlcCi0JKCpvdXRidWYpWzBdID0gKGMxKTsJXAotCSgqb3V0YnVmKVsxXSA9IChjMik7CVwKLQkoKm91dGJ1ZilbMl0gPSAoYzMpOwotI2RlZmluZSBXUklURTQoYzEsIGMyLCBjMywgYzQpCVwKLQlSRVFVSVJFX09VVEJVRig0KQlcCi0JKCpvdXRidWYpWzBdID0gKGMxKTsJXAotCSgqb3V0YnVmKVsxXSA9IChjMik7CVwKLQkoKm91dGJ1ZilbMl0gPSAoYzMpOwlcCi0JKCpvdXRidWYpWzNdID0gKGM0KTsKKyNkZWZpbmUgV1JJVEUxKGMxKSAgICAgICAgICAgICAgXAorICAgIFJFUVVJUkVfT1VUQlVGKDEpICAgICAgICAgICBcCisgICAgKCpvdXRidWYpWzBdID0gKGMxKTsKKyNkZWZpbmUgV1JJVEUyKGMxLCBjMikgICAgICAgICAgXAorICAgIFJFUVVJUkVfT1VUQlVGKDIpICAgICAgICAgICBcCisgICAgKCpvdXRidWYpWzBdID0gKGMxKTsgICAgICAgIFwKKyAgICAoKm91dGJ1ZilbMV0gPSAoYzIpOworI2RlZmluZSBXUklURTMoYzEsIGMyLCBjMykgICAgICBcCisgICAgUkVRVUlSRV9PVVRCVUYoMykgICAgICAgICAgIFwKKyAgICAoKm91dGJ1ZilbMF0gPSAoYzEpOyAgICAgICAgXAorICAgICgqb3V0YnVmKVsxXSA9IChjMik7ICAgICAgICBcCisgICAgKCpvdXRidWYpWzJdID0gKGMzKTsKKyNkZWZpbmUgV1JJVEU0KGMxLCBjMiwgYzMsIGM0KSAgXAorICAgIFJFUVVJUkVfT1VUQlVGKDQpICAgICAgICAgICBcCisgICAgKCpvdXRidWYpWzBdID0gKGMxKTsgICAgICAgIFwKKyAgICAoKm91dGJ1ZilbMV0gPSAoYzIpOyAgICAgICAgXAorICAgICgqb3V0YnVmKVsyXSA9IChjMyk7ICAgICAgICBcCisgICAgKCpvdXRidWYpWzNdID0gKGM0KTsKIAogI2lmIFB5X1VOSUNPREVfU0laRSA9PSAyCi0jIGRlZmluZSBXUklURVVDUzQoYykJCQkJCQlcCi0JUkVRVUlSRV9PVVRCVUYoMikJCQkJCVwKLQkoKm91dGJ1ZilbMF0gPSAweGQ4MDAgKyAoKChjKSAtIDB4MTAwMDApID4+IDEwKTsJXAotCSgqb3V0YnVmKVsxXSA9IDB4ZGMwMCArICgoKGMpIC0gMHgxMDAwMCkgJiAweDNmZik7CVwKLQlORVhUX09VVCgyKQorIyBkZWZpbmUgV1JJVEVVQ1M0KGMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBSRVFVSVJFX09VVEJVRigyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCpvdXRidWYpWzBdID0gMHhkODAwICsgKCgoYykgLSAweDEwMDAwKSA+PiAxMCk7ICAgICAgICAgICAgXAorICAgICgqb3V0YnVmKVsxXSA9IDB4ZGMwMCArICgoKGMpIC0gMHgxMDAwMCkgJiAweDNmZik7ICAgICAgICAgIFwKKyAgICBORVhUX09VVCgyKQogI2Vsc2UKLSMgZGVmaW5lIFdSSVRFVUNTNChjKQkJCQkJCVwKLQlSRVFVSVJFX09VVEJVRigxKQkJCQkJXAotCSoqb3V0YnVmID0gKFB5X1VOSUNPREUpKGMpOwkJCQlcCi0JTkVYVF9PVVQoMSkKKyMgZGVmaW5lIFdSSVRFVUNTNChjKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgUkVRVUlSRV9PVVRCVUYoMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICoqb3V0YnVmID0gKFB5X1VOSUNPREUpKGMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBORVhUX09VVCgxKQogI2VuZGlmCiAKLSNkZWZpbmUgX1RSWU1BUF9FTkMobSwgYXNzaSwgdmFsKQkJCQlcCi0JKChtKS0+bWFwICE9IE5VTEwgJiYgKHZhbCkgPj0gKG0pLT5ib3R0b20gJiYJCVwKLQkgICAgKHZhbCk8PSAobSktPnRvcCAmJiAoKGFzc2kpID0gKG0pLT5tYXBbKHZhbCkgLQlcCi0JICAgIChtKS0+Ym90dG9tXSkgIT0gTk9DSEFSKQotI2RlZmluZSBUUllNQVBfRU5DX0NPTkQoY2hhcnNldCwgYXNzaSwgdW5pKQkJCVwKLQlfVFJZTUFQX0VOQygmY2hhcnNldCMjX2VuY21hcFsodW5pKSA+PiA4XSwgYXNzaSwgKHVuaSkgJiAweGZmKQotI2RlZmluZSBUUllNQVBfRU5DKGNoYXJzZXQsIGFzc2ksIHVuaSkJCQkJXAotCWlmIFRSWU1BUF9FTkNfQ09ORChjaGFyc2V0LCBhc3NpLCB1bmkpCisjZGVmaW5lIF9UUllNQVBfRU5DKG0sIGFzc2ksIHZhbCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgobSktPm1hcCAhPSBOVUxMICYmICh2YWwpID49IChtKS0+Ym90dG9tICYmICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKHZhbCk8PSAobSktPnRvcCAmJiAoKGFzc2kpID0gKG0pLT5tYXBbKHZhbCkgLSAgICAgICAgICBcCisgICAgICAgIChtKS0+Ym90dG9tXSkgIT0gTk9DSEFSKQorI2RlZmluZSBUUllNQVBfRU5DX0NPTkQoY2hhcnNldCwgYXNzaSwgdW5pKSAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfVFJZTUFQX0VOQygmY2hhcnNldCMjX2VuY21hcFsodW5pKSA+PiA4XSwgYXNzaSwgKHVuaSkgJiAweGZmKQorI2RlZmluZSBUUllNQVBfRU5DKGNoYXJzZXQsIGFzc2ksIHVuaSkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiBUUllNQVBfRU5DX0NPTkQoY2hhcnNldCwgYXNzaSwgdW5pKQogCi0jZGVmaW5lIF9UUllNQVBfREVDKG0sIGFzc2ksIHZhbCkJCQkJXAotCSgobSktPm1hcCAhPSBOVUxMICYmICh2YWwpID49IChtKS0+Ym90dG9tICYmCQlcCi0JICAgICh2YWwpPD0gKG0pLT50b3AgJiYgKChhc3NpKSA9IChtKS0+bWFwWyh2YWwpIC0JXAotCSAgICAobSktPmJvdHRvbV0pICE9IFVOSUlOVikKLSNkZWZpbmUgVFJZTUFQX0RFQyhjaGFyc2V0LCBhc3NpLCBjMSwgYzIpCQkJXAotCWlmIF9UUllNQVBfREVDKCZjaGFyc2V0IyNfZGVjbWFwW2MxXSwgYXNzaSwgYzIpCisjZGVmaW5lIF9UUllNQVBfREVDKG0sIGFzc2ksIHZhbCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgobSktPm1hcCAhPSBOVUxMICYmICh2YWwpID49IChtKS0+Ym90dG9tICYmICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKHZhbCk8PSAobSktPnRvcCAmJiAoKGFzc2kpID0gKG0pLT5tYXBbKHZhbCkgLSAgICAgICAgICBcCisgICAgICAgIChtKS0+Ym90dG9tXSkgIT0gVU5JSU5WKQorI2RlZmluZSBUUllNQVBfREVDKGNoYXJzZXQsIGFzc2ksIGMxLCBjMikgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiBfVFJZTUFQX0RFQygmY2hhcnNldCMjX2RlY21hcFtjMV0sIGFzc2ksIGMyKQogCi0jZGVmaW5lIF9UUllNQVBfRU5DX01QTEFORShtLCBhc3NwbGFuZSwgYXNzaGksIGFzc2xvLCB2YWwpCVwKLQkoKG0pLT5tYXAgIT0gTlVMTCAmJiAodmFsKSA+PSAobSktPmJvdHRvbSAmJgkJXAotCSAgICAodmFsKTw9IChtKS0+dG9wICYmCQkJCQlcCi0JICAgICgoYXNzcGxhbmUpID0gKG0pLT5tYXBbKCh2YWwpIC0gKG0pLT5ib3R0b20pKjNdKSAhPSAwICYmIFwKLQkgICAgKCgoYXNzaGkpID0gKG0pLT5tYXBbKCh2YWwpIC0gKG0pLT5ib3R0b20pKjMgKyAxXSksIDEpICYmIFwKLQkgICAgKCgoYXNzbG8pID0gKG0pLT5tYXBbKCh2YWwpIC0gKG0pLT5ib3R0b20pKjMgKyAyXSksIDEpKQotI2RlZmluZSBUUllNQVBfRU5DX01QTEFORShjaGFyc2V0LCBhc3NwbGFuZSwgYXNzaGksIGFzc2xvLCB1bmkpCVwKLQlpZiBfVFJZTUFQX0VOQ19NUExBTkUoJmNoYXJzZXQjI19lbmNtYXBbKHVuaSkgPj4gOF0sIFwKLQkJCSAgIGFzc3BsYW5lLCBhc3NoaSwgYXNzbG8sICh1bmkpICYgMHhmZikKLSNkZWZpbmUgVFJZTUFQX0RFQ19NUExBTkUoY2hhcnNldCwgYXNzaSwgcGxhbmUsIGMxLCBjMikJCVwKLQlpZiBfVFJZTUFQX0RFQygmY2hhcnNldCMjX2RlY21hcFtwbGFuZV1bYzFdLCBhc3NpLCBjMikKKyNkZWZpbmUgX1RSWU1BUF9FTkNfTVBMQU5FKG0sIGFzc3BsYW5lLCBhc3NoaSwgYXNzbG8sIHZhbCkgICAgICBcCisgICAgKChtKS0+bWFwICE9IE5VTEwgJiYgKHZhbCkgPj0gKG0pLT5ib3R0b20gJiYgICAgICAgICAgICAgICAgXAorICAgICAgICAodmFsKTw9IChtKS0+dG9wICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKChhc3NwbGFuZSkgPSAobSktPm1hcFsoKHZhbCkgLSAobSktPmJvdHRvbSkqM10pICE9IDAgJiYgXAorICAgICAgICAoKChhc3NoaSkgPSAobSktPm1hcFsoKHZhbCkgLSAobSktPmJvdHRvbSkqMyArIDFdKSwgMSkgJiYgXAorICAgICAgICAoKChhc3NsbykgPSAobSktPm1hcFsoKHZhbCkgLSAobSktPmJvdHRvbSkqMyArIDJdKSwgMSkpCisjZGVmaW5lIFRSWU1BUF9FTkNfTVBMQU5FKGNoYXJzZXQsIGFzc3BsYW5lLCBhc3NoaSwgYXNzbG8sIHVuaSkgXAorICAgIGlmIF9UUllNQVBfRU5DX01QTEFORSgmY2hhcnNldCMjX2VuY21hcFsodW5pKSA+PiA4XSwgXAorICAgICAgICAgICAgICAgICAgICAgICBhc3NwbGFuZSwgYXNzaGksIGFzc2xvLCAodW5pKSAmIDB4ZmYpCisjZGVmaW5lIFRSWU1BUF9ERUNfTVBMQU5FKGNoYXJzZXQsIGFzc2ksIHBsYW5lLCBjMSwgYzIpICAgICAgICAgXAorICAgIGlmIF9UUllNQVBfREVDKCZjaGFyc2V0IyNfZGVjbWFwW3BsYW5lXVtjMV0sIGFzc2ksIGMyKQogCiAjaWYgUHlfVU5JQ09ERV9TSVpFID09IDIKLSNkZWZpbmUgREVDT0RFX1NVUlJPR0FURShjKQkJCQkJXAotCWlmIChjID4+IDEwID09IDB4ZDgwMCA+PiAxMCkgeyAvKiBoaWdoIHN1cnJvZ2F0ZSAqLwlcCi0JCVJFUVVJUkVfSU5CVUYoMikJCQkJXAotCQlpZiAoSU4yID4+IDEwID09IDB4ZGMwMCA+PiAxMCkgeyAvKiBsb3cgc3Vycm9nYXRlICovIFwKLQkJICAgIGMgPSAweDEwMDAwICsgKCh1Y3M0X3QpKGMgLSAweGQ4MDApIDw8IDEwKSArIFwKLQkJCSgodWNzNF90KShJTjIpIC0gMHhkYzAwKTsJCVwKLQkJfQkJCQkJCVwKLQl9Ci0jZGVmaW5lIEdFVF9JTlNJWkUoYykJKChjKSA+IDB4ZmZmZiA/IDIgOiAxKQorI2RlZmluZSBERUNPREVfU1VSUk9HQVRFKGMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoYyA+PiAxMCA9PSAweGQ4MDAgPj4gMTApIHsgLyogaGlnaCBzdXJyb2dhdGUgKi8gICAgICAgICBcCisgICAgICAgIFJFUVVJUkVfSU5CVUYoMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoSU4yID4+IDEwID09IDB4ZGMwMCA+PiAxMCkgeyAvKiBsb3cgc3Vycm9nYXRlICovIFwKKyAgICAgICAgICAgIGMgPSAweDEwMDAwICsgKCh1Y3M0X3QpKGMgLSAweGQ4MDApIDw8IDEwKSArIFwKKyAgICAgICAgICAgICgodWNzNF90KShJTjIpIC0gMHhkYzAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKyNkZWZpbmUgR0VUX0lOU0laRShjKSAgICgoYykgPiAweGZmZmYgPyAyIDogMSkKICNlbHNlCiAjZGVmaW5lIERFQ09ERV9TVVJST0dBVEUoYykgezt9Ci0jZGVmaW5lIEdFVF9JTlNJWkUoYykJMQorI2RlZmluZSBHRVRfSU5TSVpFKGMpICAgMQogI2VuZGlmCiAKICNkZWZpbmUgQkVHSU5fTUFQUElOR1NfTElTVCBzdGF0aWMgY29uc3Qgc3RydWN0IGRiY3NfbWFwIF9tYXBwaW5nX2xpc3RbXSA9IHsKICNkZWZpbmUgTUFQUElOR19FTkNPTkxZKGVuYykgeyNlbmMsICh2b2lkKillbmMjI19lbmNtYXAsIE5VTEx9LAogI2RlZmluZSBNQVBQSU5HX0RFQ09OTFkoZW5jKSB7I2VuYywgTlVMTCwgKHZvaWQqKWVuYyMjX2RlY21hcH0sCiAjZGVmaW5lIE1BUFBJTkdfRU5DREVDKGVuYykgeyNlbmMsICh2b2lkKillbmMjI19lbmNtYXAsICh2b2lkKillbmMjI19kZWNtYXB9LAotI2RlZmluZSBFTkRfTUFQUElOR1NfTElTVAkJCQlcCi0JeyIiLCBOVUxMLCBOVUxMfSB9OwkJCQlcCi0Jc3RhdGljIGNvbnN0IHN0cnVjdCBkYmNzX21hcCAqbWFwcGluZ19saXN0ID0JXAotCQkoY29uc3Qgc3RydWN0IGRiY3NfbWFwICopX21hcHBpbmdfbGlzdDsKKyNkZWZpbmUgRU5EX01BUFBJTkdTX0xJU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsiIiwgTlVMTCwgTlVMTH0gfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RhdGljIGNvbnN0IHN0cnVjdCBkYmNzX21hcCAqbWFwcGluZ19saXN0ID0gICAgICAgIFwKKyAgICAgICAgKGNvbnN0IHN0cnVjdCBkYmNzX21hcCAqKV9tYXBwaW5nX2xpc3Q7CiAKICNkZWZpbmUgQkVHSU5fQ09ERUNTX0xJU1Qgc3RhdGljIGNvbnN0IE11bHRpYnl0ZUNvZGVjIF9jb2RlY19saXN0W10gPSB7Ci0jZGVmaW5lIF9TVEFURUZVTF9NRVRIT0RTKGVuYykJCVwKLQllbmMjI19lbmNvZGUsCQkJXAotCWVuYyMjX2VuY29kZV9pbml0LAkJXAotCWVuYyMjX2VuY29kZV9yZXNldCwJCVwKLQllbmMjI19kZWNvZGUsCQkJXAotCWVuYyMjX2RlY29kZV9pbml0LAkJXAotCWVuYyMjX2RlY29kZV9yZXNldCwKLSNkZWZpbmUgX1NUQVRFTEVTU19NRVRIT0RTKGVuYykJCVwKLQllbmMjI19lbmNvZGUsIE5VTEwsIE5VTEwsCVwKLQllbmMjI19kZWNvZGUsIE5VTEwsIE5VTEwsCi0jZGVmaW5lIENPREVDX1NUQVRFRlVMKGVuYykgewkJXAotCSNlbmMsIE5VTEwsIE5VTEwsCQlcCi0JX1NUQVRFRlVMX01FVEhPRFMoZW5jKQkJXAorI2RlZmluZSBfU1RBVEVGVUxfTUVUSE9EUyhlbmMpICAgICAgICAgIFwKKyAgICBlbmMjI19lbmNvZGUsICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZW5jIyNfZW5jb2RlX2luaXQsICAgICAgICAgICAgICAgICAgXAorICAgIGVuYyMjX2VuY29kZV9yZXNldCwgICAgICAgICAgICAgICAgIFwKKyAgICBlbmMjI19kZWNvZGUsICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZW5jIyNfZGVjb2RlX2luaXQsICAgICAgICAgICAgICAgICAgXAorICAgIGVuYyMjX2RlY29kZV9yZXNldCwKKyNkZWZpbmUgX1NUQVRFTEVTU19NRVRIT0RTKGVuYykgICAgICAgICBcCisgICAgZW5jIyNfZW5jb2RlLCBOVUxMLCBOVUxMLCAgICAgICAgICAgXAorICAgIGVuYyMjX2RlY29kZSwgTlVMTCwgTlVMTCwKKyNkZWZpbmUgQ09ERUNfU1RBVEVGVUwoZW5jKSB7ICAgICAgICAgICBcCisgICAgI2VuYywgTlVMTCwgTlVMTCwgICAgICAgICAgICAgICAgICAgXAorICAgIF9TVEFURUZVTF9NRVRIT0RTKGVuYykgICAgICAgICAgICAgIFwKIH0sCi0jZGVmaW5lIENPREVDX1NUQVRFTEVTUyhlbmMpIHsJCVwKLQkjZW5jLCBOVUxMLCBOVUxMLAkJXAotCV9TVEFURUxFU1NfTUVUSE9EUyhlbmMpCQlcCisjZGVmaW5lIENPREVDX1NUQVRFTEVTUyhlbmMpIHsgICAgICAgICAgXAorICAgICNlbmMsIE5VTEwsIE5VTEwsICAgICAgICAgICAgICAgICAgIFwKKyAgICBfU1RBVEVMRVNTX01FVEhPRFMoZW5jKSAgICAgICAgICAgICBcCiB9LAotI2RlZmluZSBDT0RFQ19TVEFURUxFU1NfV0lOSVQoZW5jKSB7CVwKLQkjZW5jLCBOVUxMLAkJCVwKLQllbmMjI19jb2RlY19pbml0LAkJXAotCV9TVEFURUxFU1NfTUVUSE9EUyhlbmMpCQlcCisjZGVmaW5lIENPREVDX1NUQVRFTEVTU19XSU5JVChlbmMpIHsgICAgXAorICAgICNlbmMsIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbmMjI19jb2RlY19pbml0LCAgICAgICAgICAgICAgICAgICBcCisgICAgX1NUQVRFTEVTU19NRVRIT0RTKGVuYykgICAgICAgICAgICAgXAogfSwKLSNkZWZpbmUgRU5EX0NPREVDU19MSVNUCQkJCQlcCi0JeyIiLCBOVUxMLH0gfTsJCQkJCVwKLQlzdGF0aWMgY29uc3QgTXVsdGlieXRlQ29kZWMgKmNvZGVjX2xpc3QgPQlcCi0JCShjb25zdCBNdWx0aWJ5dGVDb2RlYyAqKV9jb2RlY19saXN0OworI2RlZmluZSBFTkRfQ09ERUNTX0xJU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyIiLCBOVUxMLH0gfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdGF0aWMgY29uc3QgTXVsdGlieXRlQ29kZWMgKmNvZGVjX2xpc3QgPSAgICAgICAgICAgXAorICAgICAgICAoY29uc3QgTXVsdGlieXRlQ29kZWMgKilfY29kZWNfbGlzdDsKIAogc3RhdGljIFB5T2JqZWN0ICoKIGdldG11bHRpYnl0ZWNvZGVjKHZvaWQpCiB7Ci0Jc3RhdGljIFB5T2JqZWN0ICpjb2Z1bmMgPSBOVUxMOworICAgIHN0YXRpYyBQeU9iamVjdCAqY29mdW5jID0gTlVMTDsKIAotCWlmIChjb2Z1bmMgPT0gTlVMTCkgewotCQlQeU9iamVjdCAqbW9kID0gUHlJbXBvcnRfSW1wb3J0TW9kdWxlTm9CbG9jaygiX211bHRpYnl0ZWNvZGVjIik7Ci0JCWlmIChtb2QgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQljb2Z1bmMgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKG1vZCwgIl9fY3JlYXRlX2NvZGVjIik7Ci0JCVB5X0RFQ1JFRihtb2QpOwotCX0KLQlyZXR1cm4gY29mdW5jOworICAgIGlmIChjb2Z1bmMgPT0gTlVMTCkgeworICAgICAgICBQeU9iamVjdCAqbW9kID0gUHlJbXBvcnRfSW1wb3J0TW9kdWxlTm9CbG9jaygiX211bHRpYnl0ZWNvZGVjIik7CisgICAgICAgIGlmIChtb2QgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBjb2Z1bmMgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKG1vZCwgIl9fY3JlYXRlX2NvZGVjIik7CisgICAgICAgIFB5X0RFQ1JFRihtb2QpOworICAgIH0KKyAgICByZXR1cm4gY29mdW5jOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZ2V0Y29kZWMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICplbmNvZGluZykKIHsKLQlQeU9iamVjdCAqY29kZWNvYmosICpyLCAqY29mdW5jOwotCWNvbnN0IE11bHRpYnl0ZUNvZGVjICpjb2RlYzsKLQljb25zdCBjaGFyICplbmM7CisgICAgUHlPYmplY3QgKmNvZGVjb2JqLCAqciwgKmNvZnVuYzsKKyAgICBjb25zdCBNdWx0aWJ5dGVDb2RlYyAqY29kZWM7CisgICAgY29uc3QgY2hhciAqZW5jOwogCi0JaWYgKCFQeVN0cmluZ19DaGVjayhlbmNvZGluZykpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiZW5jb2RpbmcgbmFtZSBtdXN0IGJlIGEgc3RyaW5nLiIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKCFQeVN0cmluZ19DaGVjayhlbmNvZGluZykpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJlbmNvZGluZyBuYW1lIG11c3QgYmUgYSBzdHJpbmcuIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWNvZnVuYyA9IGdldG11bHRpYnl0ZWNvZGVjKCk7Ci0JaWYgKGNvZnVuYyA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBjb2Z1bmMgPSBnZXRtdWx0aWJ5dGVjb2RlYygpOworICAgIGlmIChjb2Z1bmMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQllbmMgPSBQeVN0cmluZ19BU19TVFJJTkcoZW5jb2RpbmcpOwotCWZvciAoY29kZWMgPSBjb2RlY19saXN0OyBjb2RlYy0+ZW5jb2RpbmdbMF07IGNvZGVjKyspCi0JCWlmIChzdHJjbXAoY29kZWMtPmVuY29kaW5nLCBlbmMpID09IDApCi0JCQlicmVhazsKKyAgICBlbmMgPSBQeVN0cmluZ19BU19TVFJJTkcoZW5jb2RpbmcpOworICAgIGZvciAoY29kZWMgPSBjb2RlY19saXN0OyBjb2RlYy0+ZW5jb2RpbmdbMF07IGNvZGVjKyspCisgICAgICAgIGlmIChzdHJjbXAoY29kZWMtPmVuY29kaW5nLCBlbmMpID09IDApCisgICAgICAgICAgICBicmVhazsKIAotCWlmIChjb2RlYy0+ZW5jb2RpbmdbMF0gPT0gJ1wwJykgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfTG9va3VwRXJyb3IsCi0JCQkJIm5vIHN1Y2ggY29kZWMgaXMgc3VwcG9ydGVkLiIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKGNvZGVjLT5lbmNvZGluZ1swXSA9PSAnXDAnKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19Mb29rdXBFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJubyBzdWNoIGNvZGVjIGlzIHN1cHBvcnRlZC4iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JY29kZWNvYmogPSBQeUNPYmplY3RfRnJvbVZvaWRQdHIoKHZvaWQgKiljb2RlYywgTlVMTCk7Ci0JaWYgKGNvZGVjb2JqID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIGNvZGVjb2JqID0gUHlDT2JqZWN0X0Zyb21Wb2lkUHRyKCh2b2lkICopY29kZWMsIE5VTEwpOworICAgIGlmIChjb2RlY29iaiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXIgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGNvZnVuYywgY29kZWNvYmosIE5VTEwpOwotCVB5X0RFQ1JFRihjb2RlY29iaik7CisgICAgciA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoY29mdW5jLCBjb2RlY29iaiwgTlVMTCk7CisgICAgUHlfREVDUkVGKGNvZGVjb2JqKTsKIAotCXJldHVybiByOworICAgIHJldHVybiByOwogfQogCiBzdGF0aWMgc3RydWN0IFB5TWV0aG9kRGVmIF9fbWV0aG9kc1tdID0gewotCXsiZ2V0Y29kZWMiLCAoUHlDRnVuY3Rpb24pZ2V0Y29kZWMsIE1FVEhfTywgIiJ9LAotCXtOVUxMLCBOVUxMfSwKKyAgICB7ImdldGNvZGVjIiwgKFB5Q0Z1bmN0aW9uKWdldGNvZGVjLCBNRVRIX08sICIifSwKKyAgICB7TlVMTCwgTlVMTH0sCiB9OwogCiBzdGF0aWMgaW50CiByZWdpc3Rlcl9tYXBzKFB5T2JqZWN0ICptb2R1bGUpCiB7Ci0JY29uc3Qgc3RydWN0IGRiY3NfbWFwICpoOworICAgIGNvbnN0IHN0cnVjdCBkYmNzX21hcCAqaDsKIAotCWZvciAoaCA9IG1hcHBpbmdfbGlzdDsgaC0+Y2hhcnNldFswXSAhPSAnXDAnOyBoKyspIHsKLQkJY2hhciBtaG5hbWVbMjU2XSA9ICJfX21hcF8iOwotCQlpbnQgcjsKLQkJc3RyY3B5KG1obmFtZSArIHNpemVvZigiX19tYXBfIikgLSAxLCBoLT5jaGFyc2V0KTsKLQkJciA9IFB5TW9kdWxlX0FkZE9iamVjdChtb2R1bGUsIG1obmFtZSwKLQkJCQlQeUNPYmplY3RfRnJvbVZvaWRQdHIoKHZvaWQgKiloLCBOVUxMKSk7Ci0JCWlmIChyID09IC0xKQotCQkJcmV0dXJuIC0xOwotCX0KLQlyZXR1cm4gMDsKKyAgICBmb3IgKGggPSBtYXBwaW5nX2xpc3Q7IGgtPmNoYXJzZXRbMF0gIT0gJ1wwJzsgaCsrKSB7CisgICAgICAgIGNoYXIgbWhuYW1lWzI1Nl0gPSAiX19tYXBfIjsKKyAgICAgICAgaW50IHI7CisgICAgICAgIHN0cmNweShtaG5hbWUgKyBzaXplb2YoIl9fbWFwXyIpIC0gMSwgaC0+Y2hhcnNldCk7CisgICAgICAgIHIgPSBQeU1vZHVsZV9BZGRPYmplY3QobW9kdWxlLCBtaG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBQeUNPYmplY3RfRnJvbVZvaWRQdHIoKHZvaWQgKiloLCBOVUxMKSk7CisgICAgICAgIGlmIChyID09IC0xKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogI2lmZGVmIFVTSU5HX0JJTkFSWV9QQUlSX1NFQVJDSAogc3RhdGljIERCQ0hBUgogZmluZF9wYWlyZW5jbWFwKHVjczJfdCBib2R5LCB1Y3MyX3QgbW9kaWZpZXIsCi0JCWNvbnN0IHN0cnVjdCBwYWlyX2VuY29kZW1hcCAqaGF5c3RhY2ssIGludCBoYXlzdGFja3NpemUpCisgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHBhaXJfZW5jb2RlbWFwICpoYXlzdGFjaywgaW50IGhheXN0YWNrc2l6ZSkKIHsKLQlpbnQgcG9zLCBtaW4sIG1heDsKLQl1Y3M0X3QgdmFsdWUgPSBib2R5IDw8IDE2IHwgbW9kaWZpZXI7CisgICAgaW50IHBvcywgbWluLCBtYXg7CisgICAgdWNzNF90IHZhbHVlID0gYm9keSA8PCAxNiB8IG1vZGlmaWVyOwogCi0JbWluID0gMDsKLQltYXggPSBoYXlzdGFja3NpemU7CisgICAgbWluID0gMDsKKyAgICBtYXggPSBoYXlzdGFja3NpemU7CiAKLQlmb3IgKHBvcyA9IGhheXN0YWNrc2l6ZSA+PiAxOyBtaW4gIT0gbWF4OyBwb3MgPSAobWluICsgbWF4KSA+PiAxKQotCQlpZiAodmFsdWUgPCBoYXlzdGFja1twb3NdLnVuaXNlcSkgewotCQkJaWYgKG1heCA9PSBwb3MpIGJyZWFrOwotCQkJZWxzZSBtYXggPSBwb3M7Ci0JCX0KLQkJZWxzZSBpZiAodmFsdWUgPiBoYXlzdGFja1twb3NdLnVuaXNlcSkgewotCQkJaWYgKG1pbiA9PSBwb3MpIGJyZWFrOwotCQkJZWxzZSBtaW4gPSBwb3M7Ci0JCX0KLQkJZWxzZQotCQkJYnJlYWs7CisgICAgZm9yIChwb3MgPSBoYXlzdGFja3NpemUgPj4gMTsgbWluICE9IG1heDsgcG9zID0gKG1pbiArIG1heCkgPj4gMSkKKyAgICAgICAgaWYgKHZhbHVlIDwgaGF5c3RhY2tbcG9zXS51bmlzZXEpIHsKKyAgICAgICAgICAgIGlmIChtYXggPT0gcG9zKSBicmVhazsKKyAgICAgICAgICAgIGVsc2UgbWF4ID0gcG9zOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHZhbHVlID4gaGF5c3RhY2tbcG9zXS51bmlzZXEpIHsKKyAgICAgICAgICAgIGlmIChtaW4gPT0gcG9zKSBicmVhazsKKyAgICAgICAgICAgIGVsc2UgbWluID0gcG9zOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWlmICh2YWx1ZSA9PSBoYXlzdGFja1twb3NdLnVuaXNlcSkKLQkJCXJldHVybiBoYXlzdGFja1twb3NdLmNvZGU7Ci0JCWVsc2UKLQkJCXJldHVybiBEQkNJTlY7CisgICAgICAgIGlmICh2YWx1ZSA9PSBoYXlzdGFja1twb3NdLnVuaXNlcSkKKyAgICAgICAgICAgIHJldHVybiBoYXlzdGFja1twb3NdLmNvZGU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBEQkNJTlY7CiB9CiAjZW5kaWYKIAogI2lmZGVmIFVTSU5HX0lNUE9SVEVEX01BUFMKICNkZWZpbmUgSU1QT1JUX01BUChsb2NhbGUsIGNoYXJzZXQsIGVuY21hcCwgZGVjbWFwKSBcCi0JaW1wb3J0bWFwKCJfY29kZWNzXyIgI2xvY2FsZSwgIl9fbWFwXyIgI2NoYXJzZXQsIFwKLQkJICAoY29uc3Qgdm9pZCoqKWVuY21hcCwgKGNvbnN0IHZvaWQqKilkZWNtYXApCisgICAgaW1wb3J0bWFwKCJfY29kZWNzXyIgI2xvY2FsZSwgIl9fbWFwXyIgI2NoYXJzZXQsIFwKKyAgICAgICAgICAgICAgKGNvbnN0IHZvaWQqKillbmNtYXAsIChjb25zdCB2b2lkKiopZGVjbWFwKQogCiBzdGF0aWMgaW50CiBpbXBvcnRtYXAoY29uc3QgY2hhciAqbW9kbmFtZSwgY29uc3QgY2hhciAqc3ltYm9sLAotCSAgY29uc3Qgdm9pZCAqKmVuY21hcCwgY29uc3Qgdm9pZCAqKmRlY21hcCkKKyAgICAgICAgICBjb25zdCB2b2lkICoqZW5jbWFwLCBjb25zdCB2b2lkICoqZGVjbWFwKQogewotCVB5T2JqZWN0ICpvLCAqbW9kOworICAgIFB5T2JqZWN0ICpvLCAqbW9kOwogCi0JbW9kID0gUHlJbXBvcnRfSW1wb3J0TW9kdWxlKChjaGFyICopbW9kbmFtZSk7Ci0JaWYgKG1vZCA9PSBOVUxMKQotCQlyZXR1cm4gLTE7CisgICAgbW9kID0gUHlJbXBvcnRfSW1wb3J0TW9kdWxlKChjaGFyICopbW9kbmFtZSk7CisgICAgaWYgKG1vZCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CiAKLQlvID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhtb2QsIChjaGFyKilzeW1ib2wpOwotCWlmIChvID09IE5VTEwpCi0JCWdvdG8gZXJyb3JleGl0OwotCWVsc2UgaWYgKCFQeUNPYmplY3RfQ2hlY2sobykpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJIm1hcCBkYXRhIG11c3QgYmUgYSBDT2JqZWN0LiIpOwotCQlnb3RvIGVycm9yZXhpdDsKLQl9Ci0JZWxzZSB7Ci0JCXN0cnVjdCBkYmNzX21hcCAqbWFwOwotCQltYXAgPSBQeUNPYmplY3RfQXNWb2lkUHRyKG8pOwotCQlpZiAoZW5jbWFwICE9IE5VTEwpCi0JCQkqZW5jbWFwID0gbWFwLT5lbmNtYXA7Ci0JCWlmIChkZWNtYXAgIT0gTlVMTCkKLQkJCSpkZWNtYXAgPSBtYXAtPmRlY21hcDsKLQkJUHlfREVDUkVGKG8pOwotCX0KKyAgICBvID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhtb2QsIChjaGFyKilzeW1ib2wpOworICAgIGlmIChvID09IE5VTEwpCisgICAgICAgIGdvdG8gZXJyb3JleGl0OworICAgIGVsc2UgaWYgKCFQeUNPYmplY3RfQ2hlY2sobykpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAibWFwIGRhdGEgbXVzdCBiZSBhIENPYmplY3QuIik7CisgICAgICAgIGdvdG8gZXJyb3JleGl0OworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgc3RydWN0IGRiY3NfbWFwICptYXA7CisgICAgICAgIG1hcCA9IFB5Q09iamVjdF9Bc1ZvaWRQdHIobyk7CisgICAgICAgIGlmIChlbmNtYXAgIT0gTlVMTCkKKyAgICAgICAgICAgICplbmNtYXAgPSBtYXAtPmVuY21hcDsKKyAgICAgICAgaWYgKGRlY21hcCAhPSBOVUxMKQorICAgICAgICAgICAgKmRlY21hcCA9IG1hcC0+ZGVjbWFwOworICAgICAgICBQeV9ERUNSRUYobyk7CisgICAgfQogCi0JUHlfREVDUkVGKG1vZCk7Ci0JcmV0dXJuIDA7CisgICAgUHlfREVDUkVGKG1vZCk7CisgICAgcmV0dXJuIDA7CiAKIGVycm9yZXhpdDoKLQlQeV9ERUNSRUYobW9kKTsKLQlyZXR1cm4gLTE7CisgICAgUHlfREVDUkVGKG1vZCk7CisgICAgcmV0dXJuIC0xOwogfQogI2VuZGlmCiAKLSNkZWZpbmUgSV9BTV9BX01PRFVMRV9GT1IobG9jKQkJCQkJCVwKLQl2b2lkCQkJCQkJCQlcCi0JaW5pdF9jb2RlY3NfIyNsb2Modm9pZCkJCQkJCQlcCi0JewkJCQkJCQkJXAotCQlQeU9iamVjdCAqbSA9IFB5X0luaXRNb2R1bGUoIl9jb2RlY3NfIiAjbG9jLCBfX21ldGhvZHMpO1wKLQkJaWYgKG0gIT0gTlVMTCkJCQkJCQlcCi0JCQkodm9pZClyZWdpc3Rlcl9tYXBzKG0pOwkJCQlcCi0JfQorI2RlZmluZSBJX0FNX0FfTU9EVUxFX0ZPUihsb2MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGluaXRfY29kZWNzXyMjbG9jKHZvaWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBQeU9iamVjdCAqbSA9IFB5X0luaXRNb2R1bGUoIl9jb2RlY3NfIiAjbG9jLCBfX21ldGhvZHMpO1wKKyAgICAgICAgaWYgKG0gIT0gTlVMTCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICh2b2lkKXJlZ2lzdGVyX21hcHMobSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jamtjb2RlY3MvZW11X2ppc3gwMjEzXzIwMDAuaCBiL01vZHVsZXMvY2prY29kZWNzL2VtdV9qaXN4MDIxM18yMDAwLmgKaW5kZXggMjUwYzY3My4uNDIyN2ZiMiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9jamtjb2RlY3MvZW11X2ppc3gwMjEzXzIwMDAuaAorKysgYi9Nb2R1bGVzL2Nqa2NvZGVjcy9lbXVfamlzeDAyMTNfMjAwMC5oCkBAIC01LDM5ICs1LDM5IEBACiAjZGVmaW5lIEVNVUxBVEVfSklTWDAyMTNfMjAwMF9FTkNPREVfSU5WQUxJRCAxCiAjZW5kaWYKIAotI2RlZmluZSBFTVVMQVRFX0pJU1gwMjEzXzIwMDBfRU5DT0RFX0JNUChhc3NpLCBjKQkJCVwKLQlpZiAoY29uZmlnID09ICh2b2lkICopMjAwMCAmJiAoCQkJCQlcCi0JCQkoYykgPT0gMHg5QjFDIHx8IChjKSA9PSAweDRGRjEgfHwJCVwKLQkJCShjKSA9PSAweDUyNUQgfHwgKGMpID09IDB4NTQxRSB8fAkJXAotCQkJKGMpID09IDB4NTY1MyB8fCAoYykgPT0gMHg1OUY4IHx8CQlcCi0JCQkoYykgPT0gMHg1QzVCIHx8IChjKSA9PSAweDVFNzcgfHwJCVwKLQkJCShjKSA9PSAweDc2MjYgfHwgKGMpID09IDB4N0U2QikpCQlcCi0JCXJldHVybiBFTVVMQVRFX0pJU1gwMjEzXzIwMDBfRU5DT0RFX0lOVkFMSUQ7CQlcCi0JZWxzZSBpZiAoY29uZmlnID09ICh2b2lkICopMjAwMCAmJiAoYykgPT0gMHg5QjFEKQkJXAotCQkoYXNzaSkgPSAweDgwMDAgfCAweDdkM2I7CQkJCVwKKyNkZWZpbmUgRU1VTEFURV9KSVNYMDIxM18yMDAwX0VOQ09ERV9CTVAoYXNzaSwgYykgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoY29uZmlnID09ICh2b2lkICopMjAwMCAmJiAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgKGMpID09IDB4OUIxQyB8fCAoYykgPT0gMHg0RkYxIHx8ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgKGMpID09IDB4NTI1RCB8fCAoYykgPT0gMHg1NDFFIHx8ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgKGMpID09IDB4NTY1MyB8fCAoYykgPT0gMHg1OUY4IHx8ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgKGMpID09IDB4NUM1QiB8fCAoYykgPT0gMHg1RTc3IHx8ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgKGMpID09IDB4NzYyNiB8fCAoYykgPT0gMHg3RTZCKSkgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuIEVNVUxBVEVfSklTWDAyMTNfMjAwMF9FTkNPREVfSU5WQUxJRDsgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNlIGlmIChjb25maWcgPT0gKHZvaWQgKikyMDAwICYmIChjKSA9PSAweDlCMUQpICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKGFzc2kpID0gMHg4MDAwIHwgMHg3ZDNiOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIAotI2RlZmluZSBFTVVMQVRFX0pJU1gwMjEzXzIwMDBfRU5DT0RFX0VNUChhc3NpLCBjKQkJCVwKLQlpZiAoY29uZmlnID09ICh2b2lkICopMjAwMCAmJiAoYykgPT0gMHgyMEI5RikJCQlcCi0JCXJldHVybiBFTVVMQVRFX0pJU1gwMjEzXzIwMDBfRU5DT0RFX0lOVkFMSUQ7CisjZGVmaW5lIEVNVUxBVEVfSklTWDAyMTNfMjAwMF9FTkNPREVfRU1QKGFzc2ksIGMpICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGNvbmZpZyA9PSAodm9pZCAqKTIwMDAgJiYgKGMpID09IDB4MjBCOUYpICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiBFTVVMQVRFX0pJU1gwMjEzXzIwMDBfRU5DT0RFX0lOVkFMSUQ7CiAKICNpZm5kZWYgRU1VTEFURV9KSVNYMDIxM18yMDAwX0RFQ09ERV9JTlZBTElECiAjZGVmaW5lIEVNVUxBVEVfSklTWDAyMTNfMjAwMF9ERUNPREVfSU5WQUxJRCAyCiAjZW5kaWYKIAotI2RlZmluZSBFTVVMQVRFX0pJU1gwMjEzXzIwMDBfREVDT0RFX1BMQU5FMShhc3NpLCBjMSwgYzIpCQlcCi0JaWYgKGNvbmZpZyA9PSAodm9pZCAqKTIwMDAgJiYJCQkJCVwKLQkJCSgoKGMxKSA9PSAweDJFICYmIChjMikgPT0gMHgyMSkgfHwJCVwKLQkJCSAoKGMxKSA9PSAweDJGICYmIChjMikgPT0gMHg3RSkgfHwJCVwKLQkJCSAoKGMxKSA9PSAweDRGICYmIChjMikgPT0gMHg1NCkgfHwJCVwKLQkJCSAoKGMxKSA9PSAweDRGICYmIChjMikgPT0gMHg3RSkgfHwJCVwKLQkJCSAoKGMxKSA9PSAweDc0ICYmIChjMikgPT0gMHgyNykgfHwJCVwKLQkJCSAoKGMxKSA9PSAweDdFICYmIChjMikgPT0gMHg3QSkgfHwJCVwKLQkJCSAoKGMxKSA9PSAweDdFICYmIChjMikgPT0gMHg3QikgfHwJCVwKLQkJCSAoKGMxKSA9PSAweDdFICYmIChjMikgPT0gMHg3QykgfHwJCVwKLQkJCSAoKGMxKSA9PSAweDdFICYmIChjMikgPT0gMHg3RCkgfHwJCVwKLQkJCSAoKGMxKSA9PSAweDdFICYmIChjMikgPT0gMHg3RSkpKQkJXAotCQlyZXR1cm4gRU1VTEFURV9KSVNYMDIxM18yMDAwX0RFQ09ERV9JTlZBTElEOworI2RlZmluZSBFTVVMQVRFX0pJU1gwMjEzXzIwMDBfREVDT0RFX1BMQU5FMShhc3NpLCBjMSwgYzIpICAgICAgICAgICAgICAgXAorICAgIGlmIChjb25maWcgPT0gKHZvaWQgKikyMDAwICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAoKChjMSkgPT0gMHgyRSAmJiAoYzIpID09IDB4MjEpIHx8ICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgKChjMSkgPT0gMHgyRiAmJiAoYzIpID09IDB4N0UpIHx8ICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgKChjMSkgPT0gMHg0RiAmJiAoYzIpID09IDB4NTQpIHx8ICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgKChjMSkgPT0gMHg0RiAmJiAoYzIpID09IDB4N0UpIHx8ICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgKChjMSkgPT0gMHg3NCAmJiAoYzIpID09IDB4MjcpIHx8ICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgKChjMSkgPT0gMHg3RSAmJiAoYzIpID09IDB4N0EpIHx8ICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgKChjMSkgPT0gMHg3RSAmJiAoYzIpID09IDB4N0IpIHx8ICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgKChjMSkgPT0gMHg3RSAmJiAoYzIpID09IDB4N0MpIHx8ICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgKChjMSkgPT0gMHg3RSAmJiAoYzIpID09IDB4N0QpIHx8ICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgKChjMSkgPT0gMHg3RSAmJiAoYzIpID09IDB4N0UpKSkgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXR1cm4gRU1VTEFURV9KSVNYMDIxM18yMDAwX0RFQ09ERV9JTlZBTElEOwogCi0jZGVmaW5lIEVNVUxBVEVfSklTWDAyMTNfMjAwMF9ERUNPREVfUExBTkUyKGFzc2ksIGMxLCBjMikJCVwKLQlpZiAoY29uZmlnID09ICh2b2lkICopMjAwMCAmJiAoYzEpID09IDB4N0QgJiYgKGMyKSA9PSAweDNCKQlcCi0JCShhc3NpKSA9IDB4OUIxRDsKKyNkZWZpbmUgRU1VTEFURV9KSVNYMDIxM18yMDAwX0RFQ09ERV9QTEFORTIoYXNzaSwgYzEsIGMyKSAgICAgICAgICAgICAgIFwKKyAgICBpZiAoY29uZmlnID09ICh2b2lkICopMjAwMCAmJiAoYzEpID09IDB4N0QgJiYgKGMyKSA9PSAweDNCKSAgICAgICAgIFwKKyAgICAgICAgKGFzc2kpID0gMHg5QjFEOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jamtjb2RlY3MvbXVsdGlieXRlY29kZWMuYyBiL01vZHVsZXMvY2prY29kZWNzL211bHRpYnl0ZWNvZGVjLmMKaW5kZXggNWZiNWVjMC4uOTg1NmYwNCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9jamtjb2RlY3MvbXVsdGlieXRlY29kZWMuYworKysgYi9Nb2R1bGVzL2Nqa2NvZGVjcy9tdWx0aWJ5dGVjb2RlYy5jCkBAIC00NSwxNzAgKzQ1LDE3MCBAQAogc3RhdGljIGNoYXIgKnN0cmVhbWt3YXJnbGlzdFtdID0geyJzdHJlYW0iLCAiZXJyb3JzIiwgTlVMTH07CiAKIHN0YXRpYyBQeU9iamVjdCAqbXVsdGlieXRlY29kZWNfZW5jb2RlKE11bHRpYnl0ZUNvZGVjICosCi0JCU11bHRpYnl0ZUNvZGVjX1N0YXRlICosIGNvbnN0IFB5X1VOSUNPREUgKiosIFB5X3NzaXplX3QsCi0JCVB5T2JqZWN0ICosIGludCk7CisgICAgICAgICAgICAgICAgTXVsdGlieXRlQ29kZWNfU3RhdGUgKiwgY29uc3QgUHlfVU5JQ09ERSAqKiwgUHlfc3NpemVfdCwKKyAgICAgICAgICAgICAgICBQeU9iamVjdCAqLCBpbnQpOwogCi0jZGVmaW5lIE1CRU5DX1JFU0VUCU1CRU5DX01BWDw8MSAvKiByZXNldCBhZnRlciBhbiBlbmNvZGluZyBzZXNzaW9uICovCisjZGVmaW5lIE1CRU5DX1JFU0VUICAgICBNQkVOQ19NQVg8PDEgLyogcmVzZXQgYWZ0ZXIgYW4gZW5jb2Rpbmcgc2Vzc2lvbiAqLwogCiBzdGF0aWMgUHlPYmplY3QgKgogbWFrZV90dXBsZShQeU9iamVjdCAqb2JqZWN0LCBQeV9zc2l6ZV90IGxlbikKIHsKLQlQeU9iamVjdCAqdiwgKnc7CisgICAgUHlPYmplY3QgKnYsICp3OwogCi0JaWYgKG9iamVjdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAob2JqZWN0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JdiA9IFB5VHVwbGVfTmV3KDIpOwotCWlmICh2ID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKG9iamVjdCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlQeVR1cGxlX1NFVF9JVEVNKHYsIDAsIG9iamVjdCk7CisgICAgdiA9IFB5VHVwbGVfTmV3KDIpOworICAgIGlmICh2ID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKG9iamVjdCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeVR1cGxlX1NFVF9JVEVNKHYsIDAsIG9iamVjdCk7CiAKLQl3ID0gUHlJbnRfRnJvbVNzaXplX3QobGVuKTsKLQlpZiAodyA9PSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRih2KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5VHVwbGVfU0VUX0lURU0odiwgMSwgdyk7CisgICAgdyA9IFB5SW50X0Zyb21Tc2l6ZV90KGxlbik7CisgICAgaWYgKHcgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeVR1cGxlX1NFVF9JVEVNKHYsIDEsIHcpOwogCi0JcmV0dXJuIHY7CisgICAgcmV0dXJuIHY7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbnRlcm5hbF9lcnJvcl9jYWxsYmFjayhjb25zdCBjaGFyICplcnJvcnMpCiB7Ci0JaWYgKGVycm9ycyA9PSBOVUxMIHx8IHN0cmNtcChlcnJvcnMsICJzdHJpY3QiKSA9PSAwKQotCQlyZXR1cm4gRVJST1JfU1RSSUNUOwotCWVsc2UgaWYgKHN0cmNtcChlcnJvcnMsICJpZ25vcmUiKSA9PSAwKQotCQlyZXR1cm4gRVJST1JfSUdOT1JFOwotCWVsc2UgaWYgKHN0cmNtcChlcnJvcnMsICJyZXBsYWNlIikgPT0gMCkKLQkJcmV0dXJuIEVSUk9SX1JFUExBQ0U7Ci0JZWxzZQotCQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhlcnJvcnMpOworICAgIGlmIChlcnJvcnMgPT0gTlVMTCB8fCBzdHJjbXAoZXJyb3JzLCAic3RyaWN0IikgPT0gMCkKKyAgICAgICAgcmV0dXJuIEVSUk9SX1NUUklDVDsKKyAgICBlbHNlIGlmIChzdHJjbXAoZXJyb3JzLCAiaWdub3JlIikgPT0gMCkKKyAgICAgICAgcmV0dXJuIEVSUk9SX0lHTk9SRTsKKyAgICBlbHNlIGlmIChzdHJjbXAoZXJyb3JzLCAicmVwbGFjZSIpID09IDApCisgICAgICAgIHJldHVybiBFUlJPUl9SRVBMQUNFOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoZXJyb3JzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNhbGxfZXJyb3JfY2FsbGJhY2soUHlPYmplY3QgKmVycm9ycywgUHlPYmplY3QgKmV4YykKIHsKLQlQeU9iamVjdCAqYXJncywgKmNiLCAqcjsKKyAgICBQeU9iamVjdCAqYXJncywgKmNiLCAqcjsKIAotCWFzc2VydChQeVN0cmluZ19DaGVjayhlcnJvcnMpKTsKLQljYiA9IFB5Q29kZWNfTG9va3VwRXJyb3IoUHlTdHJpbmdfQVNfU1RSSU5HKGVycm9ycykpOwotCWlmIChjYiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBhc3NlcnQoUHlTdHJpbmdfQ2hlY2soZXJyb3JzKSk7CisgICAgY2IgPSBQeUNvZGVjX0xvb2t1cEVycm9yKFB5U3RyaW5nX0FTX1NUUklORyhlcnJvcnMpKTsKKyAgICBpZiAoY2IgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlhcmdzID0gUHlUdXBsZV9OZXcoMSk7Ci0JaWYgKGFyZ3MgPT0gTlVMTCkgewotCQlQeV9ERUNSRUYoY2IpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgYXJncyA9IFB5VHVwbGVfTmV3KDEpOworICAgIGlmIChhcmdzID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKGNiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JUHlUdXBsZV9TRVRfSVRFTShhcmdzLCAwLCBleGMpOwotCVB5X0lOQ1JFRihleGMpOworICAgIFB5VHVwbGVfU0VUX0lURU0oYXJncywgMCwgZXhjKTsKKyAgICBQeV9JTkNSRUYoZXhjKTsKIAotCXIgPSBQeU9iamVjdF9DYWxsT2JqZWN0KGNiLCBhcmdzKTsKLQlQeV9ERUNSRUYoYXJncyk7Ci0JUHlfREVDUkVGKGNiKTsKLQlyZXR1cm4gcjsKKyAgICByID0gUHlPYmplY3RfQ2FsbE9iamVjdChjYiwgYXJncyk7CisgICAgUHlfREVDUkVGKGFyZ3MpOworICAgIFB5X0RFQ1JFRihjYik7CisgICAgcmV0dXJuIHI7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjb2RlY2N0eF9lcnJvcnNfZ2V0KE11bHRpYnl0ZVN0YXRlZnVsQ29kZWNDb250ZXh0ICpzZWxmKQogewotCWNvbnN0IGNoYXIgKmVycm9yczsKKyAgICBjb25zdCBjaGFyICplcnJvcnM7CiAKLQlpZiAoc2VsZi0+ZXJyb3JzID09IEVSUk9SX1NUUklDVCkKLQkJZXJyb3JzID0gInN0cmljdCI7Ci0JZWxzZSBpZiAoc2VsZi0+ZXJyb3JzID09IEVSUk9SX0lHTk9SRSkKLQkJZXJyb3JzID0gImlnbm9yZSI7Ci0JZWxzZSBpZiAoc2VsZi0+ZXJyb3JzID09IEVSUk9SX1JFUExBQ0UpCi0JCWVycm9ycyA9ICJyZXBsYWNlIjsKLQllbHNlIHsKLQkJUHlfSU5DUkVGKHNlbGYtPmVycm9ycyk7Ci0JCXJldHVybiBzZWxmLT5lcnJvcnM7Ci0JfQorICAgIGlmIChzZWxmLT5lcnJvcnMgPT0gRVJST1JfU1RSSUNUKQorICAgICAgICBlcnJvcnMgPSAic3RyaWN0IjsKKyAgICBlbHNlIGlmIChzZWxmLT5lcnJvcnMgPT0gRVJST1JfSUdOT1JFKQorICAgICAgICBlcnJvcnMgPSAiaWdub3JlIjsKKyAgICBlbHNlIGlmIChzZWxmLT5lcnJvcnMgPT0gRVJST1JfUkVQTEFDRSkKKyAgICAgICAgZXJyb3JzID0gInJlcGxhY2UiOworICAgIGVsc2UgeworICAgICAgICBQeV9JTkNSRUYoc2VsZi0+ZXJyb3JzKTsKKyAgICAgICAgcmV0dXJuIHNlbGYtPmVycm9yczsKKyAgICB9CiAKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhlcnJvcnMpOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGVycm9ycyk7CiB9CiAKIHN0YXRpYyBpbnQKIGNvZGVjY3R4X2Vycm9yc19zZXQoTXVsdGlieXRlU3RhdGVmdWxDb2RlY0NvbnRleHQgKnNlbGYsIFB5T2JqZWN0ICp2YWx1ZSwKLQkJICAgIHZvaWQgKmNsb3N1cmUpCisgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNsb3N1cmUpCiB7Ci0JUHlPYmplY3QgKmNiOworICAgIFB5T2JqZWN0ICpjYjsKIAotCWlmICghUHlTdHJpbmdfQ2hlY2sodmFsdWUpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJlcnJvcnMgbXVzdCBiZSBhIHN0cmluZyIpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIGlmICghUHlTdHJpbmdfQ2hlY2sodmFsdWUpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJlcnJvcnMgbXVzdCBiZSBhIHN0cmluZyIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JY2IgPSBpbnRlcm5hbF9lcnJvcl9jYWxsYmFjayhQeVN0cmluZ19BU19TVFJJTkcodmFsdWUpKTsKLQlpZiAoY2IgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOworICAgIGNiID0gaW50ZXJuYWxfZXJyb3JfY2FsbGJhY2soUHlTdHJpbmdfQVNfU1RSSU5HKHZhbHVlKSk7CisgICAgaWYgKGNiID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKIAotCUVSUk9SX0RFQ1JFRihzZWxmLT5lcnJvcnMpOwotCXNlbGYtPmVycm9ycyA9IGNiOwotCXJldHVybiAwOworICAgIEVSUk9SX0RFQ1JFRihzZWxmLT5lcnJvcnMpOworICAgIHNlbGYtPmVycm9ycyA9IGNiOworICAgIHJldHVybiAwOwogfQogCiAvKiBUaGlzIGdldHNldCBoYW5kbGVycyBsaXN0IGlzIHVzZWQgYnkgYWxsIHRoZSBzdGF0ZWZ1bCBjb2RlYyBvYmplY3RzICovCiBzdGF0aWMgUHlHZXRTZXREZWYgY29kZWNjdHhfZ2V0c2V0c1tdID0gewotCXsiZXJyb3JzIiwJKGdldHRlciljb2RlY2N0eF9lcnJvcnNfZ2V0LAotCQkJKHNldHRlciljb2RlY2N0eF9lcnJvcnNfc2V0LAotCQkJUHlEb2NfU1RSKCJob3cgdG8gdHJlYXQgZXJyb3JzIil9LAotCXtOVUxMLH0KKyAgICB7ImVycm9ycyIsICAgICAgICAgIChnZXR0ZXIpY29kZWNjdHhfZXJyb3JzX2dldCwKKyAgICAgICAgICAgICAgICAgICAgKHNldHRlciljb2RlY2N0eF9lcnJvcnNfc2V0LAorICAgICAgICAgICAgICAgICAgICBQeURvY19TVFIoImhvdyB0byB0cmVhdCBlcnJvcnMiKX0sCisgICAge05VTEwsfQogfTsKIAogc3RhdGljIGludAogZXhwYW5kX2VuY29kZWJ1ZmZlcihNdWx0aWJ5dGVFbmNvZGVCdWZmZXIgKmJ1ZiwgUHlfc3NpemVfdCBlc2l6ZSkKIHsKLQlQeV9zc2l6ZV90IG9yZ3Bvcywgb3Jnc2l6ZSwgaW5jc2l6ZTsKKyAgICBQeV9zc2l6ZV90IG9yZ3Bvcywgb3Jnc2l6ZSwgaW5jc2l6ZTsKIAotCW9yZ3BvcyA9IChQeV9zc2l6ZV90KSgoY2hhciAqKWJ1Zi0+b3V0YnVmIC0KLQkJCQlQeVN0cmluZ19BU19TVFJJTkcoYnVmLT5vdXRvYmopKTsKLQlvcmdzaXplID0gUHlTdHJpbmdfR0VUX1NJWkUoYnVmLT5vdXRvYmopOwotCWluY3NpemUgPSAoZXNpemUgPCAob3Jnc2l6ZSA+PiAxKSA/IChvcmdzaXplID4+IDEpIHwgMSA6IGVzaXplKTsKKyAgICBvcmdwb3MgPSAoUHlfc3NpemVfdCkoKGNoYXIgKilidWYtPm91dGJ1ZiAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKGJ1Zi0+b3V0b2JqKSk7CisgICAgb3Jnc2l6ZSA9IFB5U3RyaW5nX0dFVF9TSVpFKGJ1Zi0+b3V0b2JqKTsKKyAgICBpbmNzaXplID0gKGVzaXplIDwgKG9yZ3NpemUgPj4gMSkgPyAob3Jnc2l6ZSA+PiAxKSB8IDEgOiBlc2l6ZSk7CiAKLQlpZiAob3Jnc2l6ZSA+IFBZX1NTSVpFX1RfTUFYIC0gaW5jc2l6ZSkKLQkJcmV0dXJuIC0xOworICAgIGlmIChvcmdzaXplID4gUFlfU1NJWkVfVF9NQVggLSBpbmNzaXplKQorICAgICAgICByZXR1cm4gLTE7CiAKLQlpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmYnVmLT5vdXRvYmosIG9yZ3NpemUgKyBpbmNzaXplKSA9PSAtMSkKLQkJcmV0dXJuIC0xOworICAgIGlmIChfUHlTdHJpbmdfUmVzaXplKCZidWYtPm91dG9iaiwgb3Jnc2l6ZSArIGluY3NpemUpID09IC0xKQorICAgICAgICByZXR1cm4gLTE7CiAKLQlidWYtPm91dGJ1ZiA9ICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQVNfU1RSSU5HKGJ1Zi0+b3V0b2JqKSArb3JncG9zOwotCWJ1Zi0+b3V0YnVmX2VuZCA9ICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQVNfU1RSSU5HKGJ1Zi0+b3V0b2JqKQotCQkrIFB5U3RyaW5nX0dFVF9TSVpFKGJ1Zi0+b3V0b2JqKTsKKyAgICBidWYtPm91dGJ1ZiA9ICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQVNfU1RSSU5HKGJ1Zi0+b3V0b2JqKSArb3JncG9zOworICAgIGJ1Zi0+b3V0YnVmX2VuZCA9ICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQVNfU1RSSU5HKGJ1Zi0+b3V0b2JqKQorICAgICAgICArIFB5U3RyaW5nX0dFVF9TSVpFKGJ1Zi0+b3V0b2JqKTsKIAotCXJldHVybiAwOworICAgIHJldHVybiAwOwogfQotI2RlZmluZSBSRVFVSVJFX0VOQ09ERUJVRkZFUihidWYsIHMpIHsJCQkJCVwKLQlpZiAoKHMpIDwgMSB8fCAoYnVmKS0+b3V0YnVmICsgKHMpID4gKGJ1ZiktPm91dGJ1Zl9lbmQpCQlcCi0JCWlmIChleHBhbmRfZW5jb2RlYnVmZmVyKGJ1ZiwgcykgPT0gLTEpCQkJXAotCQkJZ290byBlcnJvcmV4aXQ7CQkJCQlcCisjZGVmaW5lIFJFUVVJUkVfRU5DT0RFQlVGRkVSKGJ1ZiwgcykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKChzKSA8IDEgfHwgKGJ1ZiktPm91dGJ1ZiArIChzKSA+IChidWYpLT5vdXRidWZfZW5kKSAgICAgICAgICAgICBcCisgICAgICAgIGlmIChleHBhbmRfZW5jb2RlYnVmZmVyKGJ1ZiwgcykgPT0gLTEpICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBnb3RvIGVycm9yZXhpdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiB9CiAKIHN0YXRpYyBpbnQKIGV4cGFuZF9kZWNvZGVidWZmZXIoTXVsdGlieXRlRGVjb2RlQnVmZmVyICpidWYsIFB5X3NzaXplX3QgZXNpemUpCiB7Ci0JUHlfc3NpemVfdCBvcmdwb3MsIG9yZ3NpemU7CisgICAgUHlfc3NpemVfdCBvcmdwb3MsIG9yZ3NpemU7CiAKLQlvcmdwb3MgPSAoUHlfc3NpemVfdCkoYnVmLT5vdXRidWYgLSBQeVVuaWNvZGVfQVNfVU5JQ09ERShidWYtPm91dG9iaikpOwotCW9yZ3NpemUgPSBQeVVuaWNvZGVfR0VUX1NJWkUoYnVmLT5vdXRvYmopOwotCWlmIChQeVVuaWNvZGVfUmVzaXplKCZidWYtPm91dG9iaiwgb3Jnc2l6ZSArICgKLQkgICAgZXNpemUgPCAob3Jnc2l6ZSA+PiAxKSA/IChvcmdzaXplID4+IDEpIHwgMSA6IGVzaXplKSkgPT0gLTEpCi0JCXJldHVybiAtMTsKKyAgICBvcmdwb3MgPSAoUHlfc3NpemVfdCkoYnVmLT5vdXRidWYgLSBQeVVuaWNvZGVfQVNfVU5JQ09ERShidWYtPm91dG9iaikpOworICAgIG9yZ3NpemUgPSBQeVVuaWNvZGVfR0VUX1NJWkUoYnVmLT5vdXRvYmopOworICAgIGlmIChQeVVuaWNvZGVfUmVzaXplKCZidWYtPm91dG9iaiwgb3Jnc2l6ZSArICgKKyAgICAgICAgZXNpemUgPCAob3Jnc2l6ZSA+PiAxKSA/IChvcmdzaXplID4+IDEpIHwgMSA6IGVzaXplKSkgPT0gLTEpCisgICAgICAgIHJldHVybiAtMTsKIAotCWJ1Zi0+b3V0YnVmID0gUHlVbmljb2RlX0FTX1VOSUNPREUoYnVmLT5vdXRvYmopICsgb3JncG9zOwotCWJ1Zi0+b3V0YnVmX2VuZCA9IFB5VW5pY29kZV9BU19VTklDT0RFKGJ1Zi0+b3V0b2JqKQotCQkJICArIFB5VW5pY29kZV9HRVRfU0laRShidWYtPm91dG9iaik7CisgICAgYnVmLT5vdXRidWYgPSBQeVVuaWNvZGVfQVNfVU5JQ09ERShidWYtPm91dG9iaikgKyBvcmdwb3M7CisgICAgYnVmLT5vdXRidWZfZW5kID0gUHlVbmljb2RlX0FTX1VOSUNPREUoYnVmLT5vdXRvYmopCisgICAgICAgICAgICAgICAgICAgICAgKyBQeVVuaWNvZGVfR0VUX1NJWkUoYnVmLT5vdXRvYmopOwogCi0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiB9Ci0jZGVmaW5lIFJFUVVJUkVfREVDT0RFQlVGRkVSKGJ1ZiwgcykgewkJCQkJXAotCWlmICgocykgPCAxIHx8IChidWYpLT5vdXRidWYgKyAocykgPiAoYnVmKS0+b3V0YnVmX2VuZCkJCVwKLQkJaWYgKGV4cGFuZF9kZWNvZGVidWZmZXIoYnVmLCBzKSA9PSAtMSkJCQlcCi0JCQlnb3RvIGVycm9yZXhpdDsJCQkJCVwKKyNkZWZpbmUgUkVRVUlSRV9ERUNPREVCVUZGRVIoYnVmLCBzKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoKHMpIDwgMSB8fCAoYnVmKS0+b3V0YnVmICsgKHMpID4gKGJ1ZiktPm91dGJ1Zl9lbmQpICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKGV4cGFuZF9kZWNvZGVidWZmZXIoYnVmLCBzKSA9PSAtMSkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGdvdG8gZXJyb3JleGl0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIH0KIAogCkBAIC0yMTgsNTA1ICsyMTgsNTA1IEBACiAKIHN0YXRpYyBpbnQKIG11bHRpYnl0ZWNvZGVjX2VuY2Vycm9yKE11bHRpYnl0ZUNvZGVjICpjb2RlYywKLQkJCU11bHRpYnl0ZUNvZGVjX1N0YXRlICpzdGF0ZSwKLQkJCU11bHRpYnl0ZUVuY29kZUJ1ZmZlciAqYnVmLAotCQkJUHlPYmplY3QgKmVycm9ycywgUHlfc3NpemVfdCBlKQorICAgICAgICAgICAgICAgICAgICAgICAgTXVsdGlieXRlQ29kZWNfU3RhdGUgKnN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgTXVsdGlieXRlRW5jb2RlQnVmZmVyICpidWYsCisgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqZXJyb3JzLCBQeV9zc2l6ZV90IGUpCiB7Ci0JUHlPYmplY3QgKnJldG9iaiA9IE5VTEwsICpyZXRzdHIgPSBOVUxMLCAqdG9iajsKLQlQeV9zc2l6ZV90IHJldHN0cnNpemUsIG5ld3BvczsKLQlQeV9zc2l6ZV90IGVzaXplLCBzdGFydCwgZW5kOwotCWNvbnN0IGNoYXIgKnJlYXNvbjsKKyAgICBQeU9iamVjdCAqcmV0b2JqID0gTlVMTCwgKnJldHN0ciA9IE5VTEwsICp0b2JqOworICAgIFB5X3NzaXplX3QgcmV0c3Ryc2l6ZSwgbmV3cG9zOworICAgIFB5X3NzaXplX3QgZXNpemUsIHN0YXJ0LCBlbmQ7CisgICAgY29uc3QgY2hhciAqcmVhc29uOwogCi0JaWYgKGUgPiAwKSB7Ci0JCXJlYXNvbiA9ICJpbGxlZ2FsIG11bHRpYnl0ZSBzZXF1ZW5jZSI7Ci0JCWVzaXplID0gZTsKLQl9Ci0JZWxzZSB7Ci0JCXN3aXRjaCAoZSkgewotCQljYXNlIE1CRVJSX1RPT1NNQUxMOgotCQkJUkVRVUlSRV9FTkNPREVCVUZGRVIoYnVmLCAtMSk7Ci0JCQlyZXR1cm4gMDsgLyogcmV0cnkgaXQgKi8KLQkJY2FzZSBNQkVSUl9UT09GRVc6Ci0JCQlyZWFzb24gPSAiaW5jb21wbGV0ZSBtdWx0aWJ5dGUgc2VxdWVuY2UiOwotCQkJZXNpemUgPSAoUHlfc3NpemVfdCkoYnVmLT5pbmJ1Zl9lbmQgLSBidWYtPmluYnVmKTsKLQkJCWJyZWFrOwotCQljYXNlIE1CRVJSX0lOVEVSTkFMOgotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKLQkJCQkJImludGVybmFsIGNvZGVjIGVycm9yIik7Ci0JCQlyZXR1cm4gLTE7Ci0JCWRlZmF1bHQ6Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAotCQkJCQkidW5rbm93biBydW50aW1lIGVycm9yIik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9CisgICAgaWYgKGUgPiAwKSB7CisgICAgICAgIHJlYXNvbiA9ICJpbGxlZ2FsIG11bHRpYnl0ZSBzZXF1ZW5jZSI7CisgICAgICAgIGVzaXplID0gZTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHN3aXRjaCAoZSkgeworICAgICAgICBjYXNlIE1CRVJSX1RPT1NNQUxMOgorICAgICAgICAgICAgUkVRVUlSRV9FTkNPREVCVUZGRVIoYnVmLCAtMSk7CisgICAgICAgICAgICByZXR1cm4gMDsgLyogcmV0cnkgaXQgKi8KKyAgICAgICAgY2FzZSBNQkVSUl9UT09GRVc6CisgICAgICAgICAgICByZWFzb24gPSAiaW5jb21wbGV0ZSBtdWx0aWJ5dGUgc2VxdWVuY2UiOworICAgICAgICAgICAgZXNpemUgPSAoUHlfc3NpemVfdCkoYnVmLT5pbmJ1Zl9lbmQgLSBidWYtPmluYnVmKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1CRVJSX0lOVEVSTkFMOgorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW50ZXJuYWwgY29kZWMgZXJyb3IiKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVua25vd24gcnVudGltZSBlcnJvciIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQogCi0JaWYgKGVycm9ycyA9PSBFUlJPUl9SRVBMQUNFKSB7Ci0JCWNvbnN0IFB5X1VOSUNPREUgcmVwbGNoYXIgPSAnPycsICppbmJ1ZiA9ICZyZXBsY2hhcjsKLQkJUHlfc3NpemVfdCByOworICAgIGlmIChlcnJvcnMgPT0gRVJST1JfUkVQTEFDRSkgeworICAgICAgICBjb25zdCBQeV9VTklDT0RFIHJlcGxjaGFyID0gJz8nLCAqaW5idWYgPSAmcmVwbGNoYXI7CisgICAgICAgIFB5X3NzaXplX3QgcjsKIAotCQlmb3IgKDs7KSB7Ci0JCQlQeV9zc2l6ZV90IG91dGxlZnQ7CisgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgIFB5X3NzaXplX3Qgb3V0bGVmdDsKIAotCQkJb3V0bGVmdCA9IChQeV9zc2l6ZV90KShidWYtPm91dGJ1Zl9lbmQgLSBidWYtPm91dGJ1Zik7Ci0JCQlyID0gY29kZWMtPmVuY29kZShzdGF0ZSwgY29kZWMtPmNvbmZpZywgJmluYnVmLCAxLAotCQkJCQkgICZidWYtPm91dGJ1Ziwgb3V0bGVmdCwgMCk7Ci0JCQlpZiAociA9PSBNQkVSUl9UT09TTUFMTCkgewotCQkJCVJFUVVJUkVfRU5DT0RFQlVGRkVSKGJ1ZiwgLTEpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJZWxzZQotCQkJCWJyZWFrOwotCQl9CisgICAgICAgICAgICBvdXRsZWZ0ID0gKFB5X3NzaXplX3QpKGJ1Zi0+b3V0YnVmX2VuZCAtIGJ1Zi0+b3V0YnVmKTsKKyAgICAgICAgICAgIHIgPSBjb2RlYy0+ZW5jb2RlKHN0YXRlLCBjb2RlYy0+Y29uZmlnLCAmaW5idWYsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnVmLT5vdXRidWYsIG91dGxlZnQsIDApOworICAgICAgICAgICAgaWYgKHIgPT0gTUJFUlJfVE9PU01BTEwpIHsKKyAgICAgICAgICAgICAgICBSRVFVSVJFX0VOQ09ERUJVRkZFUihidWYsIC0xKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogCi0JCWlmIChyICE9IDApIHsKLQkJCVJFUVVJUkVfRU5DT0RFQlVGRkVSKGJ1ZiwgMSk7Ci0JCQkqYnVmLT5vdXRidWYrKyA9ICc/JzsKLQkJfQotCX0KLQlpZiAoZXJyb3JzID09IEVSUk9SX0lHTk9SRSB8fCBlcnJvcnMgPT0gRVJST1JfUkVQTEFDRSkgewotCQlidWYtPmluYnVmICs9IGVzaXplOwotCQlyZXR1cm4gMDsKLQl9CisgICAgICAgIGlmIChyICE9IDApIHsKKyAgICAgICAgICAgIFJFUVVJUkVfRU5DT0RFQlVGRkVSKGJ1ZiwgMSk7CisgICAgICAgICAgICAqYnVmLT5vdXRidWYrKyA9ICc/JzsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoZXJyb3JzID09IEVSUk9SX0lHTk9SRSB8fCBlcnJvcnMgPT0gRVJST1JfUkVQTEFDRSkgeworICAgICAgICBidWYtPmluYnVmICs9IGVzaXplOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLQlzdGFydCA9IChQeV9zc2l6ZV90KShidWYtPmluYnVmIC0gYnVmLT5pbmJ1Zl90b3ApOwotCWVuZCA9IHN0YXJ0ICsgZXNpemU7CisgICAgc3RhcnQgPSAoUHlfc3NpemVfdCkoYnVmLT5pbmJ1ZiAtIGJ1Zi0+aW5idWZfdG9wKTsKKyAgICBlbmQgPSBzdGFydCArIGVzaXplOwogCi0JLyogdXNlIGNhY2hlZCBleGNlcHRpb24gb2JqZWN0IGlmIGF2YWlsYWJsZSAqLwotCWlmIChidWYtPmV4Y29iaiA9PSBOVUxMKSB7Ci0JCWJ1Zi0+ZXhjb2JqID0gUHlVbmljb2RlRW5jb2RlRXJyb3JfQ3JlYXRlKGNvZGVjLT5lbmNvZGluZywKLQkJCQlidWYtPmluYnVmX3RvcCwKLQkJCQlidWYtPmluYnVmX2VuZCAtIGJ1Zi0+aW5idWZfdG9wLAotCQkJCXN0YXJ0LCBlbmQsIHJlYXNvbik7Ci0JCWlmIChidWYtPmV4Y29iaiA9PSBOVUxMKQotCQkJZ290byBlcnJvcmV4aXQ7Ci0JfQotCWVsc2UKLQkJaWYgKFB5VW5pY29kZUVuY29kZUVycm9yX1NldFN0YXJ0KGJ1Zi0+ZXhjb2JqLCBzdGFydCkgIT0gMCB8fAotCQkgICAgUHlVbmljb2RlRW5jb2RlRXJyb3JfU2V0RW5kKGJ1Zi0+ZXhjb2JqLCBlbmQpICE9IDAgfHwKLQkJICAgIFB5VW5pY29kZUVuY29kZUVycm9yX1NldFJlYXNvbihidWYtPmV4Y29iaiwgcmVhc29uKSAhPSAwKQotCQkJZ290byBlcnJvcmV4aXQ7CisgICAgLyogdXNlIGNhY2hlZCBleGNlcHRpb24gb2JqZWN0IGlmIGF2YWlsYWJsZSAqLworICAgIGlmIChidWYtPmV4Y29iaiA9PSBOVUxMKSB7CisgICAgICAgIGJ1Zi0+ZXhjb2JqID0gUHlVbmljb2RlRW5jb2RlRXJyb3JfQ3JlYXRlKGNvZGVjLT5lbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zi0+aW5idWZfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgYnVmLT5pbmJ1Zl9lbmQgLSBidWYtPmluYnVmX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0LCBlbmQsIHJlYXNvbik7CisgICAgICAgIGlmIChidWYtPmV4Y29iaiA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBlcnJvcmV4aXQ7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgaWYgKFB5VW5pY29kZUVuY29kZUVycm9yX1NldFN0YXJ0KGJ1Zi0+ZXhjb2JqLCBzdGFydCkgIT0gMCB8fAorICAgICAgICAgICAgUHlVbmljb2RlRW5jb2RlRXJyb3JfU2V0RW5kKGJ1Zi0+ZXhjb2JqLCBlbmQpICE9IDAgfHwKKyAgICAgICAgICAgIFB5VW5pY29kZUVuY29kZUVycm9yX1NldFJlYXNvbihidWYtPmV4Y29iaiwgcmVhc29uKSAhPSAwKQorICAgICAgICAgICAgZ290byBlcnJvcmV4aXQ7CiAKLQlpZiAoZXJyb3JzID09IEVSUk9SX1NUUklDVCkgewotCQlQeUNvZGVjX1N0cmljdEVycm9ycyhidWYtPmV4Y29iaik7Ci0JCWdvdG8gZXJyb3JleGl0OwotCX0KKyAgICBpZiAoZXJyb3JzID09IEVSUk9SX1NUUklDVCkgeworICAgICAgICBQeUNvZGVjX1N0cmljdEVycm9ycyhidWYtPmV4Y29iaik7CisgICAgICAgIGdvdG8gZXJyb3JleGl0OworICAgIH0KIAotCXJldG9iaiA9IGNhbGxfZXJyb3JfY2FsbGJhY2soZXJyb3JzLCBidWYtPmV4Y29iaik7Ci0JaWYgKHJldG9iaiA9PSBOVUxMKQotCQlnb3RvIGVycm9yZXhpdDsKKyAgICByZXRvYmogPSBjYWxsX2Vycm9yX2NhbGxiYWNrKGVycm9ycywgYnVmLT5leGNvYmopOworICAgIGlmIChyZXRvYmogPT0gTlVMTCkKKyAgICAgICAgZ290byBlcnJvcmV4aXQ7CiAKLQlpZiAoIVB5VHVwbGVfQ2hlY2socmV0b2JqKSB8fCBQeVR1cGxlX0dFVF9TSVpFKHJldG9iaikgIT0gMiB8fAotCSAgICAhUHlVbmljb2RlX0NoZWNrKCh0b2JqID0gUHlUdXBsZV9HRVRfSVRFTShyZXRvYmosIDApKSkgfHwKLQkgICAgIShQeUludF9DaGVjayhQeVR1cGxlX0dFVF9JVEVNKHJldG9iaiwgMSkpIHx8Ci0JICAgICAgUHlMb25nX0NoZWNrKFB5VHVwbGVfR0VUX0lURU0ocmV0b2JqLCAxKSkpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJImVuY29kaW5nIGVycm9yIGhhbmRsZXIgbXVzdCByZXR1cm4gIgotCQkJCSIodW5pY29kZSwgaW50KSB0dXBsZSIpOwotCQlnb3RvIGVycm9yZXhpdDsKLQl9CisgICAgaWYgKCFQeVR1cGxlX0NoZWNrKHJldG9iaikgfHwgUHlUdXBsZV9HRVRfU0laRShyZXRvYmopICE9IDIgfHwKKyAgICAgICAgIVB5VW5pY29kZV9DaGVjaygodG9iaiA9IFB5VHVwbGVfR0VUX0lURU0ocmV0b2JqLCAwKSkpIHx8CisgICAgICAgICEoUHlJbnRfQ2hlY2soUHlUdXBsZV9HRVRfSVRFTShyZXRvYmosIDEpKSB8fAorICAgICAgICAgIFB5TG9uZ19DaGVjayhQeVR1cGxlX0dFVF9JVEVNKHJldG9iaiwgMSkpKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImVuY29kaW5nIGVycm9yIGhhbmRsZXIgbXVzdCByZXR1cm4gIgorICAgICAgICAgICAgICAgICAgICAgICAgIih1bmljb2RlLCBpbnQpIHR1cGxlIik7CisgICAgICAgIGdvdG8gZXJyb3JleGl0OworICAgIH0KIAotCXsKLQkJY29uc3QgUHlfVU5JQ09ERSAqdXJhdyA9IFB5VW5pY29kZV9BU19VTklDT0RFKHRvYmopOworICAgIHsKKyAgICAgICAgY29uc3QgUHlfVU5JQ09ERSAqdXJhdyA9IFB5VW5pY29kZV9BU19VTklDT0RFKHRvYmopOwogCi0JCXJldHN0ciA9IG11bHRpYnl0ZWNvZGVjX2VuY29kZShjb2RlYywgc3RhdGUsICZ1cmF3LAotCQkJCVB5VW5pY29kZV9HRVRfU0laRSh0b2JqKSwgRVJST1JfU1RSSUNULAotCQkJCU1CRU5DX0ZMVVNIKTsKLQkJaWYgKHJldHN0ciA9PSBOVUxMKQotCQkJZ290byBlcnJvcmV4aXQ7Ci0JfQorICAgICAgICByZXRzdHIgPSBtdWx0aWJ5dGVjb2RlY19lbmNvZGUoY29kZWMsIHN0YXRlLCAmdXJhdywKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfU0laRSh0b2JqKSwgRVJST1JfU1RSSUNULAorICAgICAgICAgICAgICAgICAgICAgICAgTUJFTkNfRkxVU0gpOworICAgICAgICBpZiAocmV0c3RyID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGVycm9yZXhpdDsKKyAgICB9CiAKLQlyZXRzdHJzaXplID0gUHlTdHJpbmdfR0VUX1NJWkUocmV0c3RyKTsKLQlSRVFVSVJFX0VOQ09ERUJVRkZFUihidWYsIHJldHN0cnNpemUpOworICAgIHJldHN0cnNpemUgPSBQeVN0cmluZ19HRVRfU0laRShyZXRzdHIpOworICAgIFJFUVVJUkVfRU5DT0RFQlVGRkVSKGJ1ZiwgcmV0c3Ryc2l6ZSk7CiAKLQltZW1jcHkoYnVmLT5vdXRidWYsIFB5U3RyaW5nX0FTX1NUUklORyhyZXRzdHIpLCByZXRzdHJzaXplKTsKLQlidWYtPm91dGJ1ZiArPSByZXRzdHJzaXplOworICAgIG1lbWNweShidWYtPm91dGJ1ZiwgUHlTdHJpbmdfQVNfU1RSSU5HKHJldHN0ciksIHJldHN0cnNpemUpOworICAgIGJ1Zi0+b3V0YnVmICs9IHJldHN0cnNpemU7CiAKLQluZXdwb3MgPSBQeUludF9Bc1NzaXplX3QoUHlUdXBsZV9HRVRfSVRFTShyZXRvYmosIDEpKTsKLQlpZiAobmV3cG9zIDwgMCAmJiAhUHlFcnJfT2NjdXJyZWQoKSkKLQkJbmV3cG9zICs9IChQeV9zc2l6ZV90KShidWYtPmluYnVmX2VuZCAtIGJ1Zi0+aW5idWZfdG9wKTsKLQlpZiAobmV3cG9zIDwgMCB8fCBidWYtPmluYnVmX3RvcCArIG5ld3BvcyA+IGJ1Zi0+aW5idWZfZW5kKSB7Ci0JCVB5RXJyX0NsZWFyKCk7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19JbmRleEVycm9yLAotCQkJICAgICAicG9zaXRpb24gJXpkIGZyb20gZXJyb3IgaGFuZGxlciBvdXQgb2YgYm91bmRzIiwKLQkJCSAgICAgbmV3cG9zKTsKLQkJZ290byBlcnJvcmV4aXQ7Ci0JfQotCWJ1Zi0+aW5idWYgPSBidWYtPmluYnVmX3RvcCArIG5ld3BvczsKKyAgICBuZXdwb3MgPSBQeUludF9Bc1NzaXplX3QoUHlUdXBsZV9HRVRfSVRFTShyZXRvYmosIDEpKTsKKyAgICBpZiAobmV3cG9zIDwgMCAmJiAhUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgbmV3cG9zICs9IChQeV9zc2l6ZV90KShidWYtPmluYnVmX2VuZCAtIGJ1Zi0+aW5idWZfdG9wKTsKKyAgICBpZiAobmV3cG9zIDwgMCB8fCBidWYtPmluYnVmX3RvcCArIG5ld3BvcyA+IGJ1Zi0+aW5idWZfZW5kKSB7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19JbmRleEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgInBvc2l0aW9uICV6ZCBmcm9tIGVycm9yIGhhbmRsZXIgb3V0IG9mIGJvdW5kcyIsCisgICAgICAgICAgICAgICAgICAgICBuZXdwb3MpOworICAgICAgICBnb3RvIGVycm9yZXhpdDsKKyAgICB9CisgICAgYnVmLT5pbmJ1ZiA9IGJ1Zi0+aW5idWZfdG9wICsgbmV3cG9zOwogCi0JUHlfREVDUkVGKHJldG9iaik7Ci0JUHlfREVDUkVGKHJldHN0cik7Ci0JcmV0dXJuIDA7CisgICAgUHlfREVDUkVGKHJldG9iaik7CisgICAgUHlfREVDUkVGKHJldHN0cik7CisgICAgcmV0dXJuIDA7CiAKIGVycm9yZXhpdDoKLQlQeV9YREVDUkVGKHJldG9iaik7Ci0JUHlfWERFQ1JFRihyZXRzdHIpOwotCXJldHVybiAtMTsKKyAgICBQeV9YREVDUkVGKHJldG9iaik7CisgICAgUHlfWERFQ1JFRihyZXRzdHIpOworICAgIHJldHVybiAtMTsKIH0KIAogc3RhdGljIGludAogbXVsdGlieXRlY29kZWNfZGVjZXJyb3IoTXVsdGlieXRlQ29kZWMgKmNvZGVjLAotCQkJTXVsdGlieXRlQ29kZWNfU3RhdGUgKnN0YXRlLAotCQkJTXVsdGlieXRlRGVjb2RlQnVmZmVyICpidWYsCi0JCQlQeU9iamVjdCAqZXJyb3JzLCBQeV9zc2l6ZV90IGUpCisgICAgICAgICAgICAgICAgICAgICAgICBNdWx0aWJ5dGVDb2RlY19TdGF0ZSAqc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICBNdWx0aWJ5dGVEZWNvZGVCdWZmZXIgKmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICplcnJvcnMsIFB5X3NzaXplX3QgZSkKIHsKLQlQeU9iamVjdCAqcmV0b2JqID0gTlVMTCwgKnJldHVuaSA9IE5VTEw7Ci0JUHlfc3NpemVfdCByZXR1bmlzaXplLCBuZXdwb3M7Ci0JY29uc3QgY2hhciAqcmVhc29uOwotCVB5X3NzaXplX3QgZXNpemUsIHN0YXJ0LCBlbmQ7CisgICAgUHlPYmplY3QgKnJldG9iaiA9IE5VTEwsICpyZXR1bmkgPSBOVUxMOworICAgIFB5X3NzaXplX3QgcmV0dW5pc2l6ZSwgbmV3cG9zOworICAgIGNvbnN0IGNoYXIgKnJlYXNvbjsKKyAgICBQeV9zc2l6ZV90IGVzaXplLCBzdGFydCwgZW5kOwogCi0JaWYgKGUgPiAwKSB7Ci0JCXJlYXNvbiA9ICJpbGxlZ2FsIG11bHRpYnl0ZSBzZXF1ZW5jZSI7Ci0JCWVzaXplID0gZTsKLQl9Ci0JZWxzZSB7Ci0JCXN3aXRjaCAoZSkgewotCQljYXNlIE1CRVJSX1RPT1NNQUxMOgotCQkJUkVRVUlSRV9ERUNPREVCVUZGRVIoYnVmLCAtMSk7Ci0JCQlyZXR1cm4gMDsgLyogcmV0cnkgaXQgKi8KLQkJY2FzZSBNQkVSUl9UT09GRVc6Ci0JCQlyZWFzb24gPSAiaW5jb21wbGV0ZSBtdWx0aWJ5dGUgc2VxdWVuY2UiOwotCQkJZXNpemUgPSAoUHlfc3NpemVfdCkoYnVmLT5pbmJ1Zl9lbmQgLSBidWYtPmluYnVmKTsKLQkJCWJyZWFrOwotCQljYXNlIE1CRVJSX0lOVEVSTkFMOgotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKLQkJCQkJImludGVybmFsIGNvZGVjIGVycm9yIik7Ci0JCQlyZXR1cm4gLTE7Ci0JCWRlZmF1bHQ6Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAotCQkJCQkidW5rbm93biBydW50aW1lIGVycm9yIik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9CisgICAgaWYgKGUgPiAwKSB7CisgICAgICAgIHJlYXNvbiA9ICJpbGxlZ2FsIG11bHRpYnl0ZSBzZXF1ZW5jZSI7CisgICAgICAgIGVzaXplID0gZTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHN3aXRjaCAoZSkgeworICAgICAgICBjYXNlIE1CRVJSX1RPT1NNQUxMOgorICAgICAgICAgICAgUkVRVUlSRV9ERUNPREVCVUZGRVIoYnVmLCAtMSk7CisgICAgICAgICAgICByZXR1cm4gMDsgLyogcmV0cnkgaXQgKi8KKyAgICAgICAgY2FzZSBNQkVSUl9UT09GRVc6CisgICAgICAgICAgICByZWFzb24gPSAiaW5jb21wbGV0ZSBtdWx0aWJ5dGUgc2VxdWVuY2UiOworICAgICAgICAgICAgZXNpemUgPSAoUHlfc3NpemVfdCkoYnVmLT5pbmJ1Zl9lbmQgLSBidWYtPmluYnVmKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1CRVJSX0lOVEVSTkFMOgorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW50ZXJuYWwgY29kZWMgZXJyb3IiKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVua25vd24gcnVudGltZSBlcnJvciIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQogCi0JaWYgKGVycm9ycyA9PSBFUlJPUl9SRVBMQUNFKSB7Ci0JCVJFUVVJUkVfREVDT0RFQlVGRkVSKGJ1ZiwgMSk7Ci0JCSpidWYtPm91dGJ1ZisrID0gUHlfVU5JQ09ERV9SRVBMQUNFTUVOVF9DSEFSQUNURVI7Ci0JfQotCWlmIChlcnJvcnMgPT0gRVJST1JfSUdOT1JFIHx8IGVycm9ycyA9PSBFUlJPUl9SRVBMQUNFKSB7Ci0JCWJ1Zi0+aW5idWYgKz0gZXNpemU7Ci0JCXJldHVybiAwOwotCX0KKyAgICBpZiAoZXJyb3JzID09IEVSUk9SX1JFUExBQ0UpIHsKKyAgICAgICAgUkVRVUlSRV9ERUNPREVCVUZGRVIoYnVmLCAxKTsKKyAgICAgICAgKmJ1Zi0+b3V0YnVmKysgPSBQeV9VTklDT0RFX1JFUExBQ0VNRU5UX0NIQVJBQ1RFUjsKKyAgICB9CisgICAgaWYgKGVycm9ycyA9PSBFUlJPUl9JR05PUkUgfHwgZXJyb3JzID09IEVSUk9SX1JFUExBQ0UpIHsKKyAgICAgICAgYnVmLT5pbmJ1ZiArPSBlc2l6ZTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCi0Jc3RhcnQgPSAoUHlfc3NpemVfdCkoYnVmLT5pbmJ1ZiAtIGJ1Zi0+aW5idWZfdG9wKTsKLQllbmQgPSBzdGFydCArIGVzaXplOworICAgIHN0YXJ0ID0gKFB5X3NzaXplX3QpKGJ1Zi0+aW5idWYgLSBidWYtPmluYnVmX3RvcCk7CisgICAgZW5kID0gc3RhcnQgKyBlc2l6ZTsKIAotCS8qIHVzZSBjYWNoZWQgZXhjZXB0aW9uIG9iamVjdCBpZiBhdmFpbGFibGUgKi8KLQlpZiAoYnVmLT5leGNvYmogPT0gTlVMTCkgewotCQlidWYtPmV4Y29iaiA9IFB5VW5pY29kZURlY29kZUVycm9yX0NyZWF0ZShjb2RlYy0+ZW5jb2RpbmcsCi0JCQkJKGNvbnN0IGNoYXIgKilidWYtPmluYnVmX3RvcCwKLQkJCQkoUHlfc3NpemVfdCkoYnVmLT5pbmJ1Zl9lbmQgLSBidWYtPmluYnVmX3RvcCksCi0JCQkJc3RhcnQsIGVuZCwgcmVhc29uKTsKLQkJaWYgKGJ1Zi0+ZXhjb2JqID09IE5VTEwpCi0JCQlnb3RvIGVycm9yZXhpdDsKLQl9Ci0JZWxzZQotCQlpZiAoUHlVbmljb2RlRGVjb2RlRXJyb3JfU2V0U3RhcnQoYnVmLT5leGNvYmosIHN0YXJ0KSB8fAotCQkgICAgUHlVbmljb2RlRGVjb2RlRXJyb3JfU2V0RW5kKGJ1Zi0+ZXhjb2JqLCBlbmQpIHx8Ci0JCSAgICBQeVVuaWNvZGVEZWNvZGVFcnJvcl9TZXRSZWFzb24oYnVmLT5leGNvYmosIHJlYXNvbikpCi0JCQlnb3RvIGVycm9yZXhpdDsKKyAgICAvKiB1c2UgY2FjaGVkIGV4Y2VwdGlvbiBvYmplY3QgaWYgYXZhaWxhYmxlICovCisgICAgaWYgKGJ1Zi0+ZXhjb2JqID09IE5VTEwpIHsKKyAgICAgICAgYnVmLT5leGNvYmogPSBQeVVuaWNvZGVEZWNvZGVFcnJvcl9DcmVhdGUoY29kZWMtPmVuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIgKilidWYtPmluYnVmX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIChQeV9zc2l6ZV90KShidWYtPmluYnVmX2VuZCAtIGJ1Zi0+aW5idWZfdG9wKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0LCBlbmQsIHJlYXNvbik7CisgICAgICAgIGlmIChidWYtPmV4Y29iaiA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBlcnJvcmV4aXQ7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgaWYgKFB5VW5pY29kZURlY29kZUVycm9yX1NldFN0YXJ0KGJ1Zi0+ZXhjb2JqLCBzdGFydCkgfHwKKyAgICAgICAgICAgIFB5VW5pY29kZURlY29kZUVycm9yX1NldEVuZChidWYtPmV4Y29iaiwgZW5kKSB8fAorICAgICAgICAgICAgUHlVbmljb2RlRGVjb2RlRXJyb3JfU2V0UmVhc29uKGJ1Zi0+ZXhjb2JqLCByZWFzb24pKQorICAgICAgICAgICAgZ290byBlcnJvcmV4aXQ7CiAKLQlpZiAoZXJyb3JzID09IEVSUk9SX1NUUklDVCkgewotCQlQeUNvZGVjX1N0cmljdEVycm9ycyhidWYtPmV4Y29iaik7Ci0JCWdvdG8gZXJyb3JleGl0OwotCX0KKyAgICBpZiAoZXJyb3JzID09IEVSUk9SX1NUUklDVCkgeworICAgICAgICBQeUNvZGVjX1N0cmljdEVycm9ycyhidWYtPmV4Y29iaik7CisgICAgICAgIGdvdG8gZXJyb3JleGl0OworICAgIH0KIAotCXJldG9iaiA9IGNhbGxfZXJyb3JfY2FsbGJhY2soZXJyb3JzLCBidWYtPmV4Y29iaik7Ci0JaWYgKHJldG9iaiA9PSBOVUxMKQotCQlnb3RvIGVycm9yZXhpdDsKKyAgICByZXRvYmogPSBjYWxsX2Vycm9yX2NhbGxiYWNrKGVycm9ycywgYnVmLT5leGNvYmopOworICAgIGlmIChyZXRvYmogPT0gTlVMTCkKKyAgICAgICAgZ290byBlcnJvcmV4aXQ7CiAKLQlpZiAoIVB5VHVwbGVfQ2hlY2socmV0b2JqKSB8fCBQeVR1cGxlX0dFVF9TSVpFKHJldG9iaikgIT0gMiB8fAotCSAgICAhUHlVbmljb2RlX0NoZWNrKChyZXR1bmkgPSBQeVR1cGxlX0dFVF9JVEVNKHJldG9iaiwgMCkpKSB8fAotCSAgICAhKFB5SW50X0NoZWNrKFB5VHVwbGVfR0VUX0lURU0ocmV0b2JqLCAxKSkgfHwKLQkgICAgICBQeUxvbmdfQ2hlY2soUHlUdXBsZV9HRVRfSVRFTShyZXRvYmosIDEpKSkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiZGVjb2RpbmcgZXJyb3IgaGFuZGxlciBtdXN0IHJldHVybiAiCi0JCQkJIih1bmljb2RlLCBpbnQpIHR1cGxlIik7Ci0JCWdvdG8gZXJyb3JleGl0OwotCX0KKyAgICBpZiAoIVB5VHVwbGVfQ2hlY2socmV0b2JqKSB8fCBQeVR1cGxlX0dFVF9TSVpFKHJldG9iaikgIT0gMiB8fAorICAgICAgICAhUHlVbmljb2RlX0NoZWNrKChyZXR1bmkgPSBQeVR1cGxlX0dFVF9JVEVNKHJldG9iaiwgMCkpKSB8fAorICAgICAgICAhKFB5SW50X0NoZWNrKFB5VHVwbGVfR0VUX0lURU0ocmV0b2JqLCAxKSkgfHwKKyAgICAgICAgICBQeUxvbmdfQ2hlY2soUHlUdXBsZV9HRVRfSVRFTShyZXRvYmosIDEpKSkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJkZWNvZGluZyBlcnJvciBoYW5kbGVyIG11c3QgcmV0dXJuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICIodW5pY29kZSwgaW50KSB0dXBsZSIpOworICAgICAgICBnb3RvIGVycm9yZXhpdDsKKyAgICB9CiAKLQlyZXR1bmlzaXplID0gUHlVbmljb2RlX0dFVF9TSVpFKHJldHVuaSk7Ci0JaWYgKHJldHVuaXNpemUgPiAwKSB7Ci0JCVJFUVVJUkVfREVDT0RFQlVGRkVSKGJ1ZiwgcmV0dW5pc2l6ZSk7Ci0JCW1lbWNweSgoY2hhciAqKWJ1Zi0+b3V0YnVmLCBQeVVuaWNvZGVfQVNfREFUQShyZXR1bmkpLAotCQkJCXJldHVuaXNpemUgKiBQeV9VTklDT0RFX1NJWkUpOwotCQlidWYtPm91dGJ1ZiArPSByZXR1bmlzaXplOwotCX0KKyAgICByZXR1bmlzaXplID0gUHlVbmljb2RlX0dFVF9TSVpFKHJldHVuaSk7CisgICAgaWYgKHJldHVuaXNpemUgPiAwKSB7CisgICAgICAgIFJFUVVJUkVfREVDT0RFQlVGRkVSKGJ1ZiwgcmV0dW5pc2l6ZSk7CisgICAgICAgIG1lbWNweSgoY2hhciAqKWJ1Zi0+b3V0YnVmLCBQeVVuaWNvZGVfQVNfREFUQShyZXR1bmkpLAorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dW5pc2l6ZSAqIFB5X1VOSUNPREVfU0laRSk7CisgICAgICAgIGJ1Zi0+b3V0YnVmICs9IHJldHVuaXNpemU7CisgICAgfQogCi0JbmV3cG9zID0gUHlJbnRfQXNTc2l6ZV90KFB5VHVwbGVfR0VUX0lURU0ocmV0b2JqLCAxKSk7Ci0JaWYgKG5ld3BvcyA8IDAgJiYgIVB5RXJyX09jY3VycmVkKCkpCi0JCW5ld3BvcyArPSAoUHlfc3NpemVfdCkoYnVmLT5pbmJ1Zl9lbmQgLSBidWYtPmluYnVmX3RvcCk7Ci0JaWYgKG5ld3BvcyA8IDAgfHwgYnVmLT5pbmJ1Zl90b3AgKyBuZXdwb3MgPiBidWYtPmluYnVmX2VuZCkgewotCQlQeUVycl9DbGVhcigpOwotCQlQeUVycl9Gb3JtYXQoUHlFeGNfSW5kZXhFcnJvciwKLQkJCSAgICAgInBvc2l0aW9uICV6ZCBmcm9tIGVycm9yIGhhbmRsZXIgb3V0IG9mIGJvdW5kcyIsCi0JCQkgICAgIG5ld3Bvcyk7Ci0JCWdvdG8gZXJyb3JleGl0OwotCX0KLQlidWYtPmluYnVmID0gYnVmLT5pbmJ1Zl90b3AgKyBuZXdwb3M7Ci0JUHlfREVDUkVGKHJldG9iaik7Ci0JcmV0dXJuIDA7CisgICAgbmV3cG9zID0gUHlJbnRfQXNTc2l6ZV90KFB5VHVwbGVfR0VUX0lURU0ocmV0b2JqLCAxKSk7CisgICAgaWYgKG5ld3BvcyA8IDAgJiYgIVB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIG5ld3BvcyArPSAoUHlfc3NpemVfdCkoYnVmLT5pbmJ1Zl9lbmQgLSBidWYtPmluYnVmX3RvcCk7CisgICAgaWYgKG5ld3BvcyA8IDAgfHwgYnVmLT5pbmJ1Zl90b3AgKyBuZXdwb3MgPiBidWYtPmluYnVmX2VuZCkgeworICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfSW5kZXhFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJwb3NpdGlvbiAlemQgZnJvbSBlcnJvciBoYW5kbGVyIG91dCBvZiBib3VuZHMiLAorICAgICAgICAgICAgICAgICAgICAgbmV3cG9zKTsKKyAgICAgICAgZ290byBlcnJvcmV4aXQ7CisgICAgfQorICAgIGJ1Zi0+aW5idWYgPSBidWYtPmluYnVmX3RvcCArIG5ld3BvczsKKyAgICBQeV9ERUNSRUYocmV0b2JqKTsKKyAgICByZXR1cm4gMDsKIAogZXJyb3JleGl0OgotCVB5X1hERUNSRUYocmV0b2JqKTsKLQlyZXR1cm4gLTE7CisgICAgUHlfWERFQ1JFRihyZXRvYmopOworICAgIHJldHVybiAtMTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG11bHRpYnl0ZWNvZGVjX2VuY29kZShNdWx0aWJ5dGVDb2RlYyAqY29kZWMsCi0JCSAgICAgIE11bHRpYnl0ZUNvZGVjX1N0YXRlICpzdGF0ZSwKLQkJICAgICAgY29uc3QgUHlfVU5JQ09ERSAqKmRhdGEsIFB5X3NzaXplX3QgZGF0YWxlbiwKLQkJICAgICAgUHlPYmplY3QgKmVycm9ycywgaW50IGZsYWdzKQorICAgICAgICAgICAgICAgICAgICAgIE11bHRpYnl0ZUNvZGVjX1N0YXRlICpzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQeV9VTklDT0RFICoqZGF0YSwgUHlfc3NpemVfdCBkYXRhbGVuLAorICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICplcnJvcnMsIGludCBmbGFncykKIHsKLQlNdWx0aWJ5dGVFbmNvZGVCdWZmZXIgYnVmOwotCVB5X3NzaXplX3QgZmluYWxzaXplLCByID0gMDsKKyAgICBNdWx0aWJ5dGVFbmNvZGVCdWZmZXIgYnVmOworICAgIFB5X3NzaXplX3QgZmluYWxzaXplLCByID0gMDsKIAotCWlmIChkYXRhbGVuID09IDApCi0JCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKCIiKTsKKyAgICBpZiAoZGF0YWxlbiA9PSAwKQorICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZygiIik7CiAKLQlidWYuZXhjb2JqID0gTlVMTDsKLQlidWYuaW5idWYgPSBidWYuaW5idWZfdG9wID0gKmRhdGE7Ci0JYnVmLmluYnVmX2VuZCA9IGJ1Zi5pbmJ1Zl90b3AgKyBkYXRhbGVuOworICAgIGJ1Zi5leGNvYmogPSBOVUxMOworICAgIGJ1Zi5pbmJ1ZiA9IGJ1Zi5pbmJ1Zl90b3AgPSAqZGF0YTsKKyAgICBidWYuaW5idWZfZW5kID0gYnVmLmluYnVmX3RvcCArIGRhdGFsZW47CiAKLQlpZiAoZGF0YWxlbiA+IChQWV9TU0laRV9UX01BWCAtIDE2KSAvIDIpIHsKLQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJZ290byBlcnJvcmV4aXQ7Ci0JfQorICAgIGlmIChkYXRhbGVuID4gKFBZX1NTSVpFX1RfTUFYIC0gMTYpIC8gMikgeworICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICBnb3RvIGVycm9yZXhpdDsKKyAgICB9CiAKLQlidWYub3V0b2JqID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgZGF0YWxlbiAqIDIgKyAxNik7Ci0JaWYgKGJ1Zi5vdXRvYmogPT0gTlVMTCkKLQkJZ290byBlcnJvcmV4aXQ7Ci0JYnVmLm91dGJ1ZiA9ICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQVNfU1RSSU5HKGJ1Zi5vdXRvYmopOwotCWJ1Zi5vdXRidWZfZW5kID0gYnVmLm91dGJ1ZiArIFB5U3RyaW5nX0dFVF9TSVpFKGJ1Zi5vdXRvYmopOworICAgIGJ1Zi5vdXRvYmogPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBkYXRhbGVuICogMiArIDE2KTsKKyAgICBpZiAoYnVmLm91dG9iaiA9PSBOVUxMKQorICAgICAgICBnb3RvIGVycm9yZXhpdDsKKyAgICBidWYub3V0YnVmID0gKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19BU19TVFJJTkcoYnVmLm91dG9iaik7CisgICAgYnVmLm91dGJ1Zl9lbmQgPSBidWYub3V0YnVmICsgUHlTdHJpbmdfR0VUX1NJWkUoYnVmLm91dG9iaik7CiAKLQl3aGlsZSAoYnVmLmluYnVmIDwgYnVmLmluYnVmX2VuZCkgewotCQlQeV9zc2l6ZV90IGlubGVmdCwgb3V0bGVmdDsKKyAgICB3aGlsZSAoYnVmLmluYnVmIDwgYnVmLmluYnVmX2VuZCkgeworICAgICAgICBQeV9zc2l6ZV90IGlubGVmdCwgb3V0bGVmdDsKIAotCQkvKiB3ZSBkb24ndCByZXVzZSBpbmxlZnQgYW5kIG91dGxlZnQgaGVyZS4KLQkJICogZXJyb3IgY2FsbGJhY2tzIGNhbiByZWxvY2F0ZSB0aGUgY3Vyc29yIGFueXdoZXJlIG9uIGJ1ZmZlciovCi0JCWlubGVmdCA9IChQeV9zc2l6ZV90KShidWYuaW5idWZfZW5kIC0gYnVmLmluYnVmKTsKLQkJb3V0bGVmdCA9IChQeV9zc2l6ZV90KShidWYub3V0YnVmX2VuZCAtIGJ1Zi5vdXRidWYpOwotCQlyID0gY29kZWMtPmVuY29kZShzdGF0ZSwgY29kZWMtPmNvbmZpZywgJmJ1Zi5pbmJ1ZiwgaW5sZWZ0LAotCQkJCSAgJmJ1Zi5vdXRidWYsIG91dGxlZnQsIGZsYWdzKTsKLQkJKmRhdGEgPSBidWYuaW5idWY7Ci0JCWlmICgociA9PSAwKSB8fCAociA9PSBNQkVSUl9UT09GRVcgJiYgIShmbGFncyAmIE1CRU5DX0ZMVVNIKSkpCi0JCQlicmVhazsKLQkJZWxzZSBpZiAobXVsdGlieXRlY29kZWNfZW5jZXJyb3IoY29kZWMsIHN0YXRlLCAmYnVmLCBlcnJvcnMscikpCi0JCQlnb3RvIGVycm9yZXhpdDsKLQkJZWxzZSBpZiAociA9PSBNQkVSUl9UT09GRVcpCi0JCQlicmVhazsKLQl9CisgICAgICAgIC8qIHdlIGRvbid0IHJldXNlIGlubGVmdCBhbmQgb3V0bGVmdCBoZXJlLgorICAgICAgICAgKiBlcnJvciBjYWxsYmFja3MgY2FuIHJlbG9jYXRlIHRoZSBjdXJzb3IgYW55d2hlcmUgb24gYnVmZmVyKi8KKyAgICAgICAgaW5sZWZ0ID0gKFB5X3NzaXplX3QpKGJ1Zi5pbmJ1Zl9lbmQgLSBidWYuaW5idWYpOworICAgICAgICBvdXRsZWZ0ID0gKFB5X3NzaXplX3QpKGJ1Zi5vdXRidWZfZW5kIC0gYnVmLm91dGJ1Zik7CisgICAgICAgIHIgPSBjb2RlYy0+ZW5jb2RlKHN0YXRlLCBjb2RlYy0+Y29uZmlnLCAmYnVmLmluYnVmLCBpbmxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZidWYub3V0YnVmLCBvdXRsZWZ0LCBmbGFncyk7CisgICAgICAgICpkYXRhID0gYnVmLmluYnVmOworICAgICAgICBpZiAoKHIgPT0gMCkgfHwgKHIgPT0gTUJFUlJfVE9PRkVXICYmICEoZmxhZ3MgJiBNQkVOQ19GTFVTSCkpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGVsc2UgaWYgKG11bHRpYnl0ZWNvZGVjX2VuY2Vycm9yKGNvZGVjLCBzdGF0ZSwgJmJ1ZiwgZXJyb3JzLHIpKQorICAgICAgICAgICAgZ290byBlcnJvcmV4aXQ7CisgICAgICAgIGVsc2UgaWYgKHIgPT0gTUJFUlJfVE9PRkVXKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQogCi0JaWYgKGNvZGVjLT5lbmNyZXNldCAhPSBOVUxMKQotCQlmb3IgKDs7KSB7Ci0JCQlQeV9zc2l6ZV90IG91dGxlZnQ7CisgICAgaWYgKGNvZGVjLT5lbmNyZXNldCAhPSBOVUxMKQorICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICBQeV9zc2l6ZV90IG91dGxlZnQ7CiAKLQkJCW91dGxlZnQgPSAoUHlfc3NpemVfdCkoYnVmLm91dGJ1Zl9lbmQgLSBidWYub3V0YnVmKTsKLQkJCXIgPSBjb2RlYy0+ZW5jcmVzZXQoc3RhdGUsIGNvZGVjLT5jb25maWcsICZidWYub3V0YnVmLAotCQkJCQkgICAgb3V0bGVmdCk7Ci0JCQlpZiAociA9PSAwKQotCQkJCWJyZWFrOwotCQkJZWxzZSBpZiAobXVsdGlieXRlY29kZWNfZW5jZXJyb3IoY29kZWMsIHN0YXRlLAotCQkJCQkJCSAmYnVmLCBlcnJvcnMsIHIpKQotCQkJCWdvdG8gZXJyb3JleGl0OwotCQl9CisgICAgICAgICAgICBvdXRsZWZ0ID0gKFB5X3NzaXplX3QpKGJ1Zi5vdXRidWZfZW5kIC0gYnVmLm91dGJ1Zik7CisgICAgICAgICAgICByID0gY29kZWMtPmVuY3Jlc2V0KHN0YXRlLCBjb2RlYy0+Y29uZmlnLCAmYnVmLm91dGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0bGVmdCk7CisgICAgICAgICAgICBpZiAociA9PSAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZWxzZSBpZiAobXVsdGlieXRlY29kZWNfZW5jZXJyb3IoY29kZWMsIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ1ZiwgZXJyb3JzLCByKSkKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yZXhpdDsKKyAgICAgICAgfQogCi0JZmluYWxzaXplID0gKFB5X3NzaXplX3QpKChjaGFyICopYnVmLm91dGJ1ZiAtCi0JCQkJIFB5U3RyaW5nX0FTX1NUUklORyhidWYub3V0b2JqKSk7CisgICAgZmluYWxzaXplID0gKFB5X3NzaXplX3QpKChjaGFyICopYnVmLm91dGJ1ZiAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FTX1NUUklORyhidWYub3V0b2JqKSk7CiAKLQlpZiAoZmluYWxzaXplICE9IFB5U3RyaW5nX0dFVF9TSVpFKGJ1Zi5vdXRvYmopKQotCQlpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmYnVmLm91dG9iaiwgZmluYWxzaXplKSA9PSAtMSkKLQkJCWdvdG8gZXJyb3JleGl0OworICAgIGlmIChmaW5hbHNpemUgIT0gUHlTdHJpbmdfR0VUX1NJWkUoYnVmLm91dG9iaikpCisgICAgICAgIGlmIChfUHlTdHJpbmdfUmVzaXplKCZidWYub3V0b2JqLCBmaW5hbHNpemUpID09IC0xKQorICAgICAgICAgICAgZ290byBlcnJvcmV4aXQ7CiAKLQlQeV9YREVDUkVGKGJ1Zi5leGNvYmopOwotCXJldHVybiBidWYub3V0b2JqOworICAgIFB5X1hERUNSRUYoYnVmLmV4Y29iaik7CisgICAgcmV0dXJuIGJ1Zi5vdXRvYmo7CiAKIGVycm9yZXhpdDoKLQlQeV9YREVDUkVGKGJ1Zi5leGNvYmopOwotCVB5X1hERUNSRUYoYnVmLm91dG9iaik7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlfWERFQ1JFRihidWYuZXhjb2JqKTsKKyAgICBQeV9YREVDUkVGKGJ1Zi5vdXRvYmopOworICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogTXVsdGlieXRlQ29kZWNfRW5jb2RlKE11bHRpYnl0ZUNvZGVjT2JqZWN0ICpzZWxmLAotCQkgICAgICBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKKyAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKLQlNdWx0aWJ5dGVDb2RlY19TdGF0ZSBzdGF0ZTsKLQlQeV9VTklDT0RFICpkYXRhOwotCVB5T2JqZWN0ICplcnJvcmNiLCAqciwgKmFyZywgKnVjdnQ7Ci0JY29uc3QgY2hhciAqZXJyb3JzID0gTlVMTDsKLQlQeV9zc2l6ZV90IGRhdGFsZW47CisgICAgTXVsdGlieXRlQ29kZWNfU3RhdGUgc3RhdGU7CisgICAgUHlfVU5JQ09ERSAqZGF0YTsKKyAgICBQeU9iamVjdCAqZXJyb3JjYiwgKnIsICphcmcsICp1Y3Z0OworICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CisgICAgUHlfc3NpemVfdCBkYXRhbGVuOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiT3x6OmVuY29kZSIsCi0JCQkJY29kZWNrd2FyZ2xpc3QsICZhcmcsICZlcnJvcnMpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPfHo6ZW5jb2RlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY2t3YXJnbGlzdCwgJmFyZywgJmVycm9ycykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKFB5VW5pY29kZV9DaGVjayhhcmcpKQotCQl1Y3Z0ID0gTlVMTDsKLQllbHNlIHsKLQkJYXJnID0gdWN2dCA9IFB5T2JqZWN0X1VuaWNvZGUoYXJnKTsKLQkJaWYgKGFyZyA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWVsc2UgaWYgKCFQeVVuaWNvZGVfQ2hlY2soYXJnKSkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiY291bGRuJ3QgY29udmVydCB0aGUgb2JqZWN0IHRvIHVuaWNvZGUuIik7Ci0JCQlQeV9ERUNSRUYodWN2dCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KKyAgICBpZiAoUHlVbmljb2RlX0NoZWNrKGFyZykpCisgICAgICAgIHVjdnQgPSBOVUxMOworICAgIGVsc2UgeworICAgICAgICBhcmcgPSB1Y3Z0ID0gUHlPYmplY3RfVW5pY29kZShhcmcpOworICAgICAgICBpZiAoYXJnID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgZWxzZSBpZiAoIVB5VW5pY29kZV9DaGVjayhhcmcpKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICJjb3VsZG4ndCBjb252ZXJ0IHRoZSBvYmplY3QgdG8gdW5pY29kZS4iKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih1Y3Z0KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQogCi0JZGF0YSA9IFB5VW5pY29kZV9BU19VTklDT0RFKGFyZyk7Ci0JZGF0YWxlbiA9IFB5VW5pY29kZV9HRVRfU0laRShhcmcpOworICAgIGRhdGEgPSBQeVVuaWNvZGVfQVNfVU5JQ09ERShhcmcpOworICAgIGRhdGFsZW4gPSBQeVVuaWNvZGVfR0VUX1NJWkUoYXJnKTsKIAotCWVycm9yY2IgPSBpbnRlcm5hbF9lcnJvcl9jYWxsYmFjayhlcnJvcnMpOwotCWlmIChlcnJvcmNiID09IE5VTEwpIHsKLQkJUHlfWERFQ1JFRih1Y3Z0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGVycm9yY2IgPSBpbnRlcm5hbF9lcnJvcl9jYWxsYmFjayhlcnJvcnMpOworICAgIGlmIChlcnJvcmNiID09IE5VTEwpIHsKKyAgICAgICAgUHlfWERFQ1JFRih1Y3Z0KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaWYgKHNlbGYtPmNvZGVjLT5lbmNpbml0ICE9IE5VTEwgJiYKLQkgICAgc2VsZi0+Y29kZWMtPmVuY2luaXQoJnN0YXRlLCBzZWxmLT5jb2RlYy0+Y29uZmlnKSAhPSAwKQotCQlnb3RvIGVycm9yZXhpdDsKLQlyID0gbXVsdGlieXRlY29kZWNfZW5jb2RlKHNlbGYtPmNvZGVjLCAmc3RhdGUsCi0JCQkoY29uc3QgUHlfVU5JQ09ERSAqKikmZGF0YSwgZGF0YWxlbiwgZXJyb3JjYiwKLQkJCU1CRU5DX0ZMVVNIIHwgTUJFTkNfUkVTRVQpOwotCWlmIChyID09IE5VTEwpCi0JCWdvdG8gZXJyb3JleGl0OworICAgIGlmIChzZWxmLT5jb2RlYy0+ZW5jaW5pdCAhPSBOVUxMICYmCisgICAgICAgIHNlbGYtPmNvZGVjLT5lbmNpbml0KCZzdGF0ZSwgc2VsZi0+Y29kZWMtPmNvbmZpZykgIT0gMCkKKyAgICAgICAgZ290byBlcnJvcmV4aXQ7CisgICAgciA9IG11bHRpYnl0ZWNvZGVjX2VuY29kZShzZWxmLT5jb2RlYywgJnN0YXRlLAorICAgICAgICAgICAgICAgICAgICAoY29uc3QgUHlfVU5JQ09ERSAqKikmZGF0YSwgZGF0YWxlbiwgZXJyb3JjYiwKKyAgICAgICAgICAgICAgICAgICAgTUJFTkNfRkxVU0ggfCBNQkVOQ19SRVNFVCk7CisgICAgaWYgKHIgPT0gTlVMTCkKKyAgICAgICAgZ290byBlcnJvcmV4aXQ7CiAKLQlFUlJPUl9ERUNSRUYoZXJyb3JjYik7Ci0JUHlfWERFQ1JFRih1Y3Z0KTsKLQlyZXR1cm4gbWFrZV90dXBsZShyLCBkYXRhbGVuKTsKKyAgICBFUlJPUl9ERUNSRUYoZXJyb3JjYik7CisgICAgUHlfWERFQ1JFRih1Y3Z0KTsKKyAgICByZXR1cm4gbWFrZV90dXBsZShyLCBkYXRhbGVuKTsKIAogZXJyb3JleGl0OgotCUVSUk9SX0RFQ1JFRihlcnJvcmNiKTsKLQlQeV9YREVDUkVGKHVjdnQpOwotCXJldHVybiBOVUxMOworICAgIEVSUk9SX0RFQ1JFRihlcnJvcmNiKTsKKyAgICBQeV9YREVDUkVGKHVjdnQpOworICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogTXVsdGlieXRlQ29kZWNfRGVjb2RlKE11bHRpYnl0ZUNvZGVjT2JqZWN0ICpzZWxmLAotCQkgICAgICBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKKyAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKLQlNdWx0aWJ5dGVDb2RlY19TdGF0ZSBzdGF0ZTsKLQlNdWx0aWJ5dGVEZWNvZGVCdWZmZXIgYnVmOwotCVB5T2JqZWN0ICplcnJvcmNiOwotCVB5X2J1ZmZlciBwZGF0YTsKLQljb25zdCBjaGFyICpkYXRhLCAqZXJyb3JzID0gTlVMTDsKLQlQeV9zc2l6ZV90IGRhdGFsZW4sIGZpbmFsc2l6ZTsKKyAgICBNdWx0aWJ5dGVDb2RlY19TdGF0ZSBzdGF0ZTsKKyAgICBNdWx0aWJ5dGVEZWNvZGVCdWZmZXIgYnVmOworICAgIFB5T2JqZWN0ICplcnJvcmNiOworICAgIFB5X2J1ZmZlciBwZGF0YTsKKyAgICBjb25zdCBjaGFyICpkYXRhLCAqZXJyb3JzID0gTlVMTDsKKyAgICBQeV9zc2l6ZV90IGRhdGFsZW4sIGZpbmFsc2l6ZTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInMqfHo6ZGVjb2RlIiwKLQkJCQljb2RlY2t3YXJnbGlzdCwgJnBkYXRhLCAmZXJyb3JzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZGF0YSA9IHBkYXRhLmJ1ZjsKLQlkYXRhbGVuID0gcGRhdGEubGVuOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInMqfHo6ZGVjb2RlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY2t3YXJnbGlzdCwgJnBkYXRhLCAmZXJyb3JzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZGF0YSA9IHBkYXRhLmJ1ZjsKKyAgICBkYXRhbGVuID0gcGRhdGEubGVuOwogCi0JZXJyb3JjYiA9IGludGVybmFsX2Vycm9yX2NhbGxiYWNrKGVycm9ycyk7Ci0JaWYgKGVycm9yY2IgPT0gTlVMTCkgewotCQlQeUJ1ZmZlcl9SZWxlYXNlKCZwZGF0YSk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBlcnJvcmNiID0gaW50ZXJuYWxfZXJyb3JfY2FsbGJhY2soZXJyb3JzKTsKKyAgICBpZiAoZXJyb3JjYiA9PSBOVUxMKSB7CisgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnBkYXRhKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaWYgKGRhdGFsZW4gPT0gMCkgewotCQlQeUJ1ZmZlcl9SZWxlYXNlKCZwZGF0YSk7Ci0JCUVSUk9SX0RFQ1JFRihlcnJvcmNiKTsKLQkJcmV0dXJuIG1ha2VfdHVwbGUoUHlVbmljb2RlX0Zyb21Vbmljb2RlKE5VTEwsIDApLCAwKTsKLQl9CisgICAgaWYgKGRhdGFsZW4gPT0gMCkgeworICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZwZGF0YSk7CisgICAgICAgIEVSUk9SX0RFQ1JFRihlcnJvcmNiKTsKKyAgICAgICAgcmV0dXJuIG1ha2VfdHVwbGUoUHlVbmljb2RlX0Zyb21Vbmljb2RlKE5VTEwsIDApLCAwKTsKKyAgICB9CiAKLQlidWYuZXhjb2JqID0gTlVMTDsKLQlidWYuaW5idWYgPSBidWYuaW5idWZfdG9wID0gKHVuc2lnbmVkIGNoYXIgKilkYXRhOwotCWJ1Zi5pbmJ1Zl9lbmQgPSBidWYuaW5idWZfdG9wICsgZGF0YWxlbjsKLQlidWYub3V0b2JqID0gUHlVbmljb2RlX0Zyb21Vbmljb2RlKE5VTEwsIGRhdGFsZW4pOwotCWlmIChidWYub3V0b2JqID09IE5VTEwpCi0JCWdvdG8gZXJyb3JleGl0OwotCWJ1Zi5vdXRidWYgPSBQeVVuaWNvZGVfQVNfVU5JQ09ERShidWYub3V0b2JqKTsKLQlidWYub3V0YnVmX2VuZCA9IGJ1Zi5vdXRidWYgKyBQeVVuaWNvZGVfR0VUX1NJWkUoYnVmLm91dG9iaik7CisgICAgYnVmLmV4Y29iaiA9IE5VTEw7CisgICAgYnVmLmluYnVmID0gYnVmLmluYnVmX3RvcCA9ICh1bnNpZ25lZCBjaGFyICopZGF0YTsKKyAgICBidWYuaW5idWZfZW5kID0gYnVmLmluYnVmX3RvcCArIGRhdGFsZW47CisgICAgYnVmLm91dG9iaiA9IFB5VW5pY29kZV9Gcm9tVW5pY29kZShOVUxMLCBkYXRhbGVuKTsKKyAgICBpZiAoYnVmLm91dG9iaiA9PSBOVUxMKQorICAgICAgICBnb3RvIGVycm9yZXhpdDsKKyAgICBidWYub3V0YnVmID0gUHlVbmljb2RlX0FTX1VOSUNPREUoYnVmLm91dG9iaik7CisgICAgYnVmLm91dGJ1Zl9lbmQgPSBidWYub3V0YnVmICsgUHlVbmljb2RlX0dFVF9TSVpFKGJ1Zi5vdXRvYmopOwogCi0JaWYgKHNlbGYtPmNvZGVjLT5kZWNpbml0ICE9IE5VTEwgJiYKLQkgICAgc2VsZi0+Y29kZWMtPmRlY2luaXQoJnN0YXRlLCBzZWxmLT5jb2RlYy0+Y29uZmlnKSAhPSAwKQotCQlnb3RvIGVycm9yZXhpdDsKKyAgICBpZiAoc2VsZi0+Y29kZWMtPmRlY2luaXQgIT0gTlVMTCAmJgorICAgICAgICBzZWxmLT5jb2RlYy0+ZGVjaW5pdCgmc3RhdGUsIHNlbGYtPmNvZGVjLT5jb25maWcpICE9IDApCisgICAgICAgIGdvdG8gZXJyb3JleGl0OwogCi0Jd2hpbGUgKGJ1Zi5pbmJ1ZiA8IGJ1Zi5pbmJ1Zl9lbmQpIHsKLQkJUHlfc3NpemVfdCBpbmxlZnQsIG91dGxlZnQsIHI7CisgICAgd2hpbGUgKGJ1Zi5pbmJ1ZiA8IGJ1Zi5pbmJ1Zl9lbmQpIHsKKyAgICAgICAgUHlfc3NpemVfdCBpbmxlZnQsIG91dGxlZnQsIHI7CiAKLQkJaW5sZWZ0ID0gKFB5X3NzaXplX3QpKGJ1Zi5pbmJ1Zl9lbmQgLSBidWYuaW5idWYpOwotCQlvdXRsZWZ0ID0gKFB5X3NzaXplX3QpKGJ1Zi5vdXRidWZfZW5kIC0gYnVmLm91dGJ1Zik7CisgICAgICAgIGlubGVmdCA9IChQeV9zc2l6ZV90KShidWYuaW5idWZfZW5kIC0gYnVmLmluYnVmKTsKKyAgICAgICAgb3V0bGVmdCA9IChQeV9zc2l6ZV90KShidWYub3V0YnVmX2VuZCAtIGJ1Zi5vdXRidWYpOwogCi0JCXIgPSBzZWxmLT5jb2RlYy0+ZGVjb2RlKCZzdGF0ZSwgc2VsZi0+Y29kZWMtPmNvbmZpZywKLQkJCQkmYnVmLmluYnVmLCBpbmxlZnQsICZidWYub3V0YnVmLCBvdXRsZWZ0KTsKLQkJaWYgKHIgPT0gMCkKLQkJCWJyZWFrOwotCQllbHNlIGlmIChtdWx0aWJ5dGVjb2RlY19kZWNlcnJvcihzZWxmLT5jb2RlYywgJnN0YXRlLAotCQkJCQkJICZidWYsIGVycm9yY2IsIHIpKQotCQkJZ290byBlcnJvcmV4aXQ7Ci0JfQorICAgICAgICByID0gc2VsZi0+Y29kZWMtPmRlY29kZSgmc3RhdGUsIHNlbGYtPmNvZGVjLT5jb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAmYnVmLmluYnVmLCBpbmxlZnQsICZidWYub3V0YnVmLCBvdXRsZWZ0KTsKKyAgICAgICAgaWYgKHIgPT0gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBlbHNlIGlmIChtdWx0aWJ5dGVjb2RlY19kZWNlcnJvcihzZWxmLT5jb2RlYywgJnN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnVmLCBlcnJvcmNiLCByKSkKKyAgICAgICAgICAgIGdvdG8gZXJyb3JleGl0OworICAgIH0KIAotCWZpbmFsc2l6ZSA9IChQeV9zc2l6ZV90KShidWYub3V0YnVmIC0KLQkJCQkgUHlVbmljb2RlX0FTX1VOSUNPREUoYnVmLm91dG9iaikpOworICAgIGZpbmFsc2l6ZSA9IChQeV9zc2l6ZV90KShidWYub3V0YnVmIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0FTX1VOSUNPREUoYnVmLm91dG9iaikpOwogCi0JaWYgKGZpbmFsc2l6ZSAhPSBQeVVuaWNvZGVfR0VUX1NJWkUoYnVmLm91dG9iaikpCi0JCWlmIChQeVVuaWNvZGVfUmVzaXplKCZidWYub3V0b2JqLCBmaW5hbHNpemUpID09IC0xKQotCQkJZ290byBlcnJvcmV4aXQ7CisgICAgaWYgKGZpbmFsc2l6ZSAhPSBQeVVuaWNvZGVfR0VUX1NJWkUoYnVmLm91dG9iaikpCisgICAgICAgIGlmIChQeVVuaWNvZGVfUmVzaXplKCZidWYub3V0b2JqLCBmaW5hbHNpemUpID09IC0xKQorICAgICAgICAgICAgZ290byBlcnJvcmV4aXQ7CiAKLQlQeUJ1ZmZlcl9SZWxlYXNlKCZwZGF0YSk7Ci0JUHlfWERFQ1JFRihidWYuZXhjb2JqKTsKLQlFUlJPUl9ERUNSRUYoZXJyb3JjYik7Ci0JcmV0dXJuIG1ha2VfdHVwbGUoYnVmLm91dG9iaiwgZGF0YWxlbik7CisgICAgUHlCdWZmZXJfUmVsZWFzZSgmcGRhdGEpOworICAgIFB5X1hERUNSRUYoYnVmLmV4Y29iaik7CisgICAgRVJST1JfREVDUkVGKGVycm9yY2IpOworICAgIHJldHVybiBtYWtlX3R1cGxlKGJ1Zi5vdXRvYmosIGRhdGFsZW4pOwogCiBlcnJvcmV4aXQ6Ci0JUHlCdWZmZXJfUmVsZWFzZSgmcGRhdGEpOwotCUVSUk9SX0RFQ1JFRihlcnJvcmNiKTsKLQlQeV9YREVDUkVGKGJ1Zi5leGNvYmopOwotCVB5X1hERUNSRUYoYnVmLm91dG9iaik7CisgICAgUHlCdWZmZXJfUmVsZWFzZSgmcGRhdGEpOworICAgIEVSUk9SX0RFQ1JFRihlcnJvcmNiKTsKKyAgICBQeV9YREVDUkVGKGJ1Zi5leGNvYmopOworICAgIFB5X1hERUNSRUYoYnVmLm91dG9iaik7CiAKLQlyZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIHN0cnVjdCBQeU1ldGhvZERlZiBtdWx0aWJ5dGVjb2RlY19tZXRob2RzW10gPSB7Ci0JeyJlbmNvZGUiLAkoUHlDRnVuY3Rpb24pTXVsdGlieXRlQ29kZWNfRW5jb2RlLAotCQkJTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywKLQkJCU11bHRpYnl0ZUNvZGVjX0VuY29kZV9fZG9jX199LAotCXsiZGVjb2RlIiwJKFB5Q0Z1bmN0aW9uKU11bHRpYnl0ZUNvZGVjX0RlY29kZSwKLQkJCU1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsCi0JCQlNdWx0aWJ5dGVDb2RlY19EZWNvZGVfX2RvY19ffSwKLQl7TlVMTCwJCU5VTEx9LAorICAgIHsiZW5jb2RlIiwgICAgICAgICAgKFB5Q0Z1bmN0aW9uKU11bHRpYnl0ZUNvZGVjX0VuY29kZSwKKyAgICAgICAgICAgICAgICAgICAgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywKKyAgICAgICAgICAgICAgICAgICAgTXVsdGlieXRlQ29kZWNfRW5jb2RlX19kb2NfX30sCisgICAgeyJkZWNvZGUiLCAgICAgICAgICAoUHlDRnVuY3Rpb24pTXVsdGlieXRlQ29kZWNfRGVjb2RlLAorICAgICAgICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLAorICAgICAgICAgICAgICAgICAgICBNdWx0aWJ5dGVDb2RlY19EZWNvZGVfX2RvY19ffSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9LAogfTsKIAogc3RhdGljIHZvaWQKIG11bHRpYnl0ZWNvZGVjX2RlYWxsb2MoTXVsdGlieXRlQ29kZWNPYmplY3QgKnNlbGYpCiB7Ci0JUHlPYmplY3RfRGVsKHNlbGYpOworICAgIFB5T2JqZWN0X0RlbChzZWxmKTsKIH0KIAogc3RhdGljIFB5VHlwZU9iamVjdCBNdWx0aWJ5dGVDb2RlY19UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotCSJNdWx0aWJ5dGVDb2RlYyIsCQkvKiB0cF9uYW1lICovCi0Jc2l6ZW9mKE11bHRpYnl0ZUNvZGVjT2JqZWN0KSwJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpbXVsdGlieXRlY29kZWNfZGVhbGxvYywgLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkvKiB0cF9jb21wYXJlICovCi0JMCwJCQkJLyogdHBfcmVwciAqLwotCTAsCQkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCS8qIHRwX2hhc2ggKi8KLQkwLAkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQsCQkvKiB0cF9mbGFncyAqLwotCTAsCQkJCS8qIHRwX2RvYyAqLwotCTAsCQkJCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JMCwJCQkJLyogdHBfaXRlciAqLwotCTAsCQkJCS8qIHRwX2l0ZXJleHQgKi8KLQltdWx0aWJ5dGVjb2RlY19tZXRob2RzLAkJLyogdHBfbWV0aG9kcyAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQorICAgICJNdWx0aWJ5dGVDb2RlYyIsICAgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICBzaXplb2YoTXVsdGlieXRlQ29kZWNPYmplY3QpLCAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvciltdWx0aWJ5dGVjb2RlY19kZWFsbG9jLCAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyZXh0ICovCisgICAgbXVsdGlieXRlY29kZWNfbWV0aG9kcywgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLwogfTsKIAogCkBAIC03MjQsMTUwICs3MjQsMTUwIEBACiAgKiBVdGlsaXR5IGZ1bmN0aW9ucyBmb3Igc3RhdGVmdWwgY29kZWMgbWVjaGFuaXNtCiAgKi8KIAotI2RlZmluZSBTVEFURUZVTF9EQ1RYKG8pCSgoTXVsdGlieXRlU3RhdGVmdWxEZWNvZGVyQ29udGV4dCAqKShvKSkKLSNkZWZpbmUgU1RBVEVGVUxfRUNUWChvKQkoKE11bHRpYnl0ZVN0YXRlZnVsRW5jb2RlckNvbnRleHQgKikobykpCisjZGVmaW5lIFNUQVRFRlVMX0RDVFgobykgICAgICAgICgoTXVsdGlieXRlU3RhdGVmdWxEZWNvZGVyQ29udGV4dCAqKShvKSkKKyNkZWZpbmUgU1RBVEVGVUxfRUNUWChvKSAgICAgICAgKChNdWx0aWJ5dGVTdGF0ZWZ1bEVuY29kZXJDb250ZXh0ICopKG8pKQogCiBzdGF0aWMgUHlPYmplY3QgKgogZW5jb2Rlcl9lbmNvZGVfc3RhdGVmdWwoTXVsdGlieXRlU3RhdGVmdWxFbmNvZGVyQ29udGV4dCAqY3R4LAotCQkJUHlPYmplY3QgKnVuaXN0ciwgaW50IGZpbmFsKQorICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKnVuaXN0ciwgaW50IGZpbmFsKQogewotCVB5T2JqZWN0ICp1Y3Z0LCAqciA9IE5VTEw7Ci0JUHlfVU5JQ09ERSAqaW5idWYsICppbmJ1Zl9lbmQsICppbmJ1Zl90bXAgPSBOVUxMOwotCVB5X3NzaXplX3QgZGF0YWxlbiwgb3JpZ3BlbmRpbmc7CisgICAgUHlPYmplY3QgKnVjdnQsICpyID0gTlVMTDsKKyAgICBQeV9VTklDT0RFICppbmJ1ZiwgKmluYnVmX2VuZCwgKmluYnVmX3RtcCA9IE5VTEw7CisgICAgUHlfc3NpemVfdCBkYXRhbGVuLCBvcmlncGVuZGluZzsKIAotCWlmIChQeVVuaWNvZGVfQ2hlY2sodW5pc3RyKSkKLQkJdWN2dCA9IE5VTEw7Ci0JZWxzZSB7Ci0JCXVuaXN0ciA9IHVjdnQgPSBQeU9iamVjdF9Vbmljb2RlKHVuaXN0cik7Ci0JCWlmICh1bmlzdHIgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQllbHNlIGlmICghUHlVbmljb2RlX0NoZWNrKHVuaXN0cikpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJImNvdWxkbid0IGNvbnZlcnQgdGhlIG9iamVjdCB0byB1bmljb2RlLiIpOwotCQkJUHlfREVDUkVGKHVjdnQpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9CisgICAgaWYgKFB5VW5pY29kZV9DaGVjayh1bmlzdHIpKQorICAgICAgICB1Y3Z0ID0gTlVMTDsKKyAgICBlbHNlIHsKKyAgICAgICAgdW5pc3RyID0gdWN2dCA9IFB5T2JqZWN0X1VuaWNvZGUodW5pc3RyKTsKKyAgICAgICAgaWYgKHVuaXN0ciA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGVsc2UgaWYgKCFQeVVuaWNvZGVfQ2hlY2sodW5pc3RyKSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAiY291bGRuJ3QgY29udmVydCB0aGUgb2JqZWN0IHRvIHVuaWNvZGUuIik7CisgICAgICAgICAgICBQeV9ERUNSRUYodWN2dCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KIAotCWRhdGFsZW4gPSBQeVVuaWNvZGVfR0VUX1NJWkUodW5pc3RyKTsKLQlvcmlncGVuZGluZyA9IGN0eC0+cGVuZGluZ3NpemU7CisgICAgZGF0YWxlbiA9IFB5VW5pY29kZV9HRVRfU0laRSh1bmlzdHIpOworICAgIG9yaWdwZW5kaW5nID0gY3R4LT5wZW5kaW5nc2l6ZTsKIAotCWlmIChvcmlncGVuZGluZyA+IDApIHsKLQkJaWYgKGRhdGFsZW4gPiBQWV9TU0laRV9UX01BWCAtIGN0eC0+cGVuZGluZ3NpemUpIHsKLQkJCVB5RXJyX05vTWVtb3J5KCk7Ci0JCQkvKiBpbmJ1Zl90bXAgPT0gTlVMTCAqLwotCQkJZ290byBlcnJvcmV4aXQ7Ci0JCX0KLQkJaW5idWZfdG1wID0gUHlNZW1fTmV3KFB5X1VOSUNPREUsIGRhdGFsZW4gKyBjdHgtPnBlbmRpbmdzaXplKTsKLQkJaWYgKGluYnVmX3RtcCA9PSBOVUxMKQotCQkJZ290byBlcnJvcmV4aXQ7Ci0JCW1lbWNweShpbmJ1Zl90bXAsIGN0eC0+cGVuZGluZywKLQkJCVB5X1VOSUNPREVfU0laRSAqIGN0eC0+cGVuZGluZ3NpemUpOwotCQltZW1jcHkoaW5idWZfdG1wICsgY3R4LT5wZW5kaW5nc2l6ZSwKLQkJCVB5VW5pY29kZV9BU19VTklDT0RFKHVuaXN0ciksCi0JCQlQeV9VTklDT0RFX1NJWkUgKiBkYXRhbGVuKTsKLQkJZGF0YWxlbiArPSBjdHgtPnBlbmRpbmdzaXplOwotCQljdHgtPnBlbmRpbmdzaXplID0gMDsKLQkJaW5idWYgPSBpbmJ1Zl90bXA7Ci0JfQotCWVsc2UKLQkJaW5idWYgPSAoUHlfVU5JQ09ERSAqKVB5VW5pY29kZV9BU19VTklDT0RFKHVuaXN0cik7CisgICAgaWYgKG9yaWdwZW5kaW5nID4gMCkgeworICAgICAgICBpZiAoZGF0YWxlbiA+IFBZX1NTSVpFX1RfTUFYIC0gY3R4LT5wZW5kaW5nc2l6ZSkgeworICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgICAgIC8qIGluYnVmX3RtcCA9PSBOVUxMICovCisgICAgICAgICAgICBnb3RvIGVycm9yZXhpdDsKKyAgICAgICAgfQorICAgICAgICBpbmJ1Zl90bXAgPSBQeU1lbV9OZXcoUHlfVU5JQ09ERSwgZGF0YWxlbiArIGN0eC0+cGVuZGluZ3NpemUpOworICAgICAgICBpZiAoaW5idWZfdG1wID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGVycm9yZXhpdDsKKyAgICAgICAgbWVtY3B5KGluYnVmX3RtcCwgY3R4LT5wZW5kaW5nLAorICAgICAgICAgICAgUHlfVU5JQ09ERV9TSVpFICogY3R4LT5wZW5kaW5nc2l6ZSk7CisgICAgICAgIG1lbWNweShpbmJ1Zl90bXAgKyBjdHgtPnBlbmRpbmdzaXplLAorICAgICAgICAgICAgUHlVbmljb2RlX0FTX1VOSUNPREUodW5pc3RyKSwKKyAgICAgICAgICAgIFB5X1VOSUNPREVfU0laRSAqIGRhdGFsZW4pOworICAgICAgICBkYXRhbGVuICs9IGN0eC0+cGVuZGluZ3NpemU7CisgICAgICAgIGN0eC0+cGVuZGluZ3NpemUgPSAwOworICAgICAgICBpbmJ1ZiA9IGluYnVmX3RtcDsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBpbmJ1ZiA9IChQeV9VTklDT0RFICopUHlVbmljb2RlX0FTX1VOSUNPREUodW5pc3RyKTsKIAotCWluYnVmX2VuZCA9IGluYnVmICsgZGF0YWxlbjsKKyAgICBpbmJ1Zl9lbmQgPSBpbmJ1ZiArIGRhdGFsZW47CiAKLQlyID0gbXVsdGlieXRlY29kZWNfZW5jb2RlKGN0eC0+Y29kZWMsICZjdHgtPnN0YXRlLAotCQkJKGNvbnN0IFB5X1VOSUNPREUgKiopJmluYnVmLAotCQkJZGF0YWxlbiwgY3R4LT5lcnJvcnMsIGZpbmFsID8gTUJFTkNfRkxVU0ggOiAwKTsKLQlpZiAociA9PSBOVUxMKSB7Ci0JCS8qIHJlY292ZXIgdGhlIG9yaWdpbmFsIHBlbmRpbmcgYnVmZmVyICovCi0JCWlmIChvcmlncGVuZGluZyA+IDApCi0JCQltZW1jcHkoY3R4LT5wZW5kaW5nLCBpbmJ1Zl90bXAsCi0JCQkJUHlfVU5JQ09ERV9TSVpFICogb3JpZ3BlbmRpbmcpOwotCQljdHgtPnBlbmRpbmdzaXplID0gb3JpZ3BlbmRpbmc7Ci0JCWdvdG8gZXJyb3JleGl0OwotCX0KKyAgICByID0gbXVsdGlieXRlY29kZWNfZW5jb2RlKGN0eC0+Y29kZWMsICZjdHgtPnN0YXRlLAorICAgICAgICAgICAgICAgICAgICAoY29uc3QgUHlfVU5JQ09ERSAqKikmaW5idWYsCisgICAgICAgICAgICAgICAgICAgIGRhdGFsZW4sIGN0eC0+ZXJyb3JzLCBmaW5hbCA/IE1CRU5DX0ZMVVNIIDogMCk7CisgICAgaWYgKHIgPT0gTlVMTCkgeworICAgICAgICAvKiByZWNvdmVyIHRoZSBvcmlnaW5hbCBwZW5kaW5nIGJ1ZmZlciAqLworICAgICAgICBpZiAob3JpZ3BlbmRpbmcgPiAwKQorICAgICAgICAgICAgbWVtY3B5KGN0eC0+cGVuZGluZywgaW5idWZfdG1wLAorICAgICAgICAgICAgICAgIFB5X1VOSUNPREVfU0laRSAqIG9yaWdwZW5kaW5nKTsKKyAgICAgICAgY3R4LT5wZW5kaW5nc2l6ZSA9IG9yaWdwZW5kaW5nOworICAgICAgICBnb3RvIGVycm9yZXhpdDsKKyAgICB9CiAKLQlpZiAoaW5idWYgPCBpbmJ1Zl9lbmQpIHsKLQkJY3R4LT5wZW5kaW5nc2l6ZSA9IChQeV9zc2l6ZV90KShpbmJ1Zl9lbmQgLSBpbmJ1Zik7Ci0JCWlmIChjdHgtPnBlbmRpbmdzaXplID4gTUFYRU5DUEVORElORykgewotCQkJLyogbm9ybWFsIGNvZGVjcyBjYW4ndCByZWFjaCBoZXJlICovCi0JCQljdHgtPnBlbmRpbmdzaXplID0gMDsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19Vbmljb2RlRXJyb3IsCi0JCQkJCSJwZW5kaW5nIGJ1ZmZlciBvdmVyZmxvdyIpOwotCQkJZ290byBlcnJvcmV4aXQ7Ci0JCX0KLQkJbWVtY3B5KGN0eC0+cGVuZGluZywgaW5idWYsCi0JCQljdHgtPnBlbmRpbmdzaXplICogUHlfVU5JQ09ERV9TSVpFKTsKLQl9CisgICAgaWYgKGluYnVmIDwgaW5idWZfZW5kKSB7CisgICAgICAgIGN0eC0+cGVuZGluZ3NpemUgPSAoUHlfc3NpemVfdCkoaW5idWZfZW5kIC0gaW5idWYpOworICAgICAgICBpZiAoY3R4LT5wZW5kaW5nc2l6ZSA+IE1BWEVOQ1BFTkRJTkcpIHsKKyAgICAgICAgICAgIC8qIG5vcm1hbCBjb2RlY3MgY2FuJ3QgcmVhY2ggaGVyZSAqLworICAgICAgICAgICAgY3R4LT5wZW5kaW5nc2l6ZSA9IDA7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVW5pY29kZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwZW5kaW5nIGJ1ZmZlciBvdmVyZmxvdyIpOworICAgICAgICAgICAgZ290byBlcnJvcmV4aXQ7CisgICAgICAgIH0KKyAgICAgICAgbWVtY3B5KGN0eC0+cGVuZGluZywgaW5idWYsCisgICAgICAgICAgICBjdHgtPnBlbmRpbmdzaXplICogUHlfVU5JQ09ERV9TSVpFKTsKKyAgICB9CiAKLQlpZiAoaW5idWZfdG1wICE9IE5VTEwpCi0JCVB5TWVtX0RlbChpbmJ1Zl90bXApOwotCVB5X1hERUNSRUYodWN2dCk7Ci0JcmV0dXJuIHI7CisgICAgaWYgKGluYnVmX3RtcCAhPSBOVUxMKQorICAgICAgICBQeU1lbV9EZWwoaW5idWZfdG1wKTsKKyAgICBQeV9YREVDUkVGKHVjdnQpOworICAgIHJldHVybiByOwogCiBlcnJvcmV4aXQ6Ci0JaWYgKGluYnVmX3RtcCAhPSBOVUxMKQotCQlQeU1lbV9EZWwoaW5idWZfdG1wKTsKLQlQeV9YREVDUkVGKHIpOwotCVB5X1hERUNSRUYodWN2dCk7Ci0JcmV0dXJuIE5VTEw7CisgICAgaWYgKGluYnVmX3RtcCAhPSBOVUxMKQorICAgICAgICBQeU1lbV9EZWwoaW5idWZfdG1wKTsKKyAgICBQeV9YREVDUkVGKHIpOworICAgIFB5X1hERUNSRUYodWN2dCk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBpbnQKIGRlY29kZXJfYXBwZW5kX3BlbmRpbmcoTXVsdGlieXRlU3RhdGVmdWxEZWNvZGVyQ29udGV4dCAqY3R4LAotCQkgICAgICAgTXVsdGlieXRlRGVjb2RlQnVmZmVyICpidWYpCisgICAgICAgICAgICAgICAgICAgICAgIE11bHRpYnl0ZURlY29kZUJ1ZmZlciAqYnVmKQogewotCVB5X3NzaXplX3QgbnBlbmRpbmdzOworICAgIFB5X3NzaXplX3QgbnBlbmRpbmdzOwogCi0JbnBlbmRpbmdzID0gKFB5X3NzaXplX3QpKGJ1Zi0+aW5idWZfZW5kIC0gYnVmLT5pbmJ1Zik7Ci0JaWYgKG5wZW5kaW5ncyArIGN0eC0+cGVuZGluZ3NpemUgPiBNQVhERUNQRU5ESU5HIHx8Ci0JCW5wZW5kaW5ncyA+IFBZX1NTSVpFX1RfTUFYIC0gY3R4LT5wZW5kaW5nc2l6ZSkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1VuaWNvZGVFcnJvciwgInBlbmRpbmcgYnVmZmVyIG92ZXJmbG93Iik7Ci0JCQlyZXR1cm4gLTE7Ci0JfQotCW1lbWNweShjdHgtPnBlbmRpbmcgKyBjdHgtPnBlbmRpbmdzaXplLCBidWYtPmluYnVmLCBucGVuZGluZ3MpOwotCWN0eC0+cGVuZGluZ3NpemUgKz0gbnBlbmRpbmdzOwotCXJldHVybiAwOworICAgIG5wZW5kaW5ncyA9IChQeV9zc2l6ZV90KShidWYtPmluYnVmX2VuZCAtIGJ1Zi0+aW5idWYpOworICAgIGlmIChucGVuZGluZ3MgKyBjdHgtPnBlbmRpbmdzaXplID4gTUFYREVDUEVORElORyB8fAorICAgICAgICBucGVuZGluZ3MgPiBQWV9TU0laRV9UX01BWCAtIGN0eC0+cGVuZGluZ3NpemUpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19Vbmljb2RlRXJyb3IsICJwZW5kaW5nIGJ1ZmZlciBvdmVyZmxvdyIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBtZW1jcHkoY3R4LT5wZW5kaW5nICsgY3R4LT5wZW5kaW5nc2l6ZSwgYnVmLT5pbmJ1ZiwgbnBlbmRpbmdzKTsKKyAgICBjdHgtPnBlbmRpbmdzaXplICs9IG5wZW5kaW5nczsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogZGVjb2Rlcl9wcmVwYXJlX2J1ZmZlcihNdWx0aWJ5dGVEZWNvZGVCdWZmZXIgKmJ1ZiwgY29uc3QgY2hhciAqZGF0YSwKLQkJICAgICAgIFB5X3NzaXplX3Qgc2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBzaXplKQogewotCWJ1Zi0+aW5idWYgPSBidWYtPmluYnVmX3RvcCA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopZGF0YTsKLQlidWYtPmluYnVmX2VuZCA9IGJ1Zi0+aW5idWZfdG9wICsgc2l6ZTsKLQlpZiAoYnVmLT5vdXRvYmogPT0gTlVMTCkgeyAvKiBvbmx5IGlmIG91dG9iaiBpcyBub3QgYWxsb2NhdGVkIHlldCAqLwotCQlidWYtPm91dG9iaiA9IFB5VW5pY29kZV9Gcm9tVW5pY29kZShOVUxMLCBzaXplKTsKLQkJaWYgKGJ1Zi0+b3V0b2JqID09IE5VTEwpCi0JCQlyZXR1cm4gLTE7Ci0JCWJ1Zi0+b3V0YnVmID0gUHlVbmljb2RlX0FTX1VOSUNPREUoYnVmLT5vdXRvYmopOwotCQlidWYtPm91dGJ1Zl9lbmQgPSBidWYtPm91dGJ1ZiArCi0JCQkJICBQeVVuaWNvZGVfR0VUX1NJWkUoYnVmLT5vdXRvYmopOwotCX0KKyAgICBidWYtPmluYnVmID0gYnVmLT5pbmJ1Zl90b3AgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKWRhdGE7CisgICAgYnVmLT5pbmJ1Zl9lbmQgPSBidWYtPmluYnVmX3RvcCArIHNpemU7CisgICAgaWYgKGJ1Zi0+b3V0b2JqID09IE5VTEwpIHsgLyogb25seSBpZiBvdXRvYmogaXMgbm90IGFsbG9jYXRlZCB5ZXQgKi8KKyAgICAgICAgYnVmLT5vdXRvYmogPSBQeVVuaWNvZGVfRnJvbVVuaWNvZGUoTlVMTCwgc2l6ZSk7CisgICAgICAgIGlmIChidWYtPm91dG9iaiA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBidWYtPm91dGJ1ZiA9IFB5VW5pY29kZV9BU19VTklDT0RFKGJ1Zi0+b3V0b2JqKTsKKyAgICAgICAgYnVmLT5vdXRidWZfZW5kID0gYnVmLT5vdXRidWYgKworICAgICAgICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX1NJWkUoYnVmLT5vdXRvYmopOworICAgIH0KIAotCXJldHVybiAwOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBkZWNvZGVyX2ZlZWRfYnVmZmVyKE11bHRpYnl0ZVN0YXRlZnVsRGVjb2RlckNvbnRleHQgKmN0eCwKLQkJICAgIE11bHRpYnl0ZURlY29kZUJ1ZmZlciAqYnVmKQorICAgICAgICAgICAgICAgICAgICBNdWx0aWJ5dGVEZWNvZGVCdWZmZXIgKmJ1ZikKIHsKLQl3aGlsZSAoYnVmLT5pbmJ1ZiA8IGJ1Zi0+aW5idWZfZW5kKSB7Ci0JCVB5X3NzaXplX3QgaW5sZWZ0LCBvdXRsZWZ0OwotCQlQeV9zc2l6ZV90IHI7CisgICAgd2hpbGUgKGJ1Zi0+aW5idWYgPCBidWYtPmluYnVmX2VuZCkgeworICAgICAgICBQeV9zc2l6ZV90IGlubGVmdCwgb3V0bGVmdDsKKyAgICAgICAgUHlfc3NpemVfdCByOwogCi0JCWlubGVmdCA9IChQeV9zc2l6ZV90KShidWYtPmluYnVmX2VuZCAtIGJ1Zi0+aW5idWYpOwotCQlvdXRsZWZ0ID0gKFB5X3NzaXplX3QpKGJ1Zi0+b3V0YnVmX2VuZCAtIGJ1Zi0+b3V0YnVmKTsKKyAgICAgICAgaW5sZWZ0ID0gKFB5X3NzaXplX3QpKGJ1Zi0+aW5idWZfZW5kIC0gYnVmLT5pbmJ1Zik7CisgICAgICAgIG91dGxlZnQgPSAoUHlfc3NpemVfdCkoYnVmLT5vdXRidWZfZW5kIC0gYnVmLT5vdXRidWYpOwogCi0JCXIgPSBjdHgtPmNvZGVjLT5kZWNvZGUoJmN0eC0+c3RhdGUsIGN0eC0+Y29kZWMtPmNvbmZpZywKLQkJCSZidWYtPmluYnVmLCBpbmxlZnQsICZidWYtPm91dGJ1Ziwgb3V0bGVmdCk7Ci0JCWlmIChyID09IDAgfHwgciA9PSBNQkVSUl9UT09GRVcpCi0JCQlicmVhazsKLQkJZWxzZSBpZiAobXVsdGlieXRlY29kZWNfZGVjZXJyb3IoY3R4LT5jb2RlYywgJmN0eC0+c3RhdGUsCi0JCQkJCQkgYnVmLCBjdHgtPmVycm9ycywgcikpCi0JCQlyZXR1cm4gLTE7Ci0JfQotCXJldHVybiAwOworICAgICAgICByID0gY3R4LT5jb2RlYy0+ZGVjb2RlKCZjdHgtPnN0YXRlLCBjdHgtPmNvZGVjLT5jb25maWcsCisgICAgICAgICAgICAmYnVmLT5pbmJ1ZiwgaW5sZWZ0LCAmYnVmLT5vdXRidWYsIG91dGxlZnQpOworICAgICAgICBpZiAociA9PSAwIHx8IHIgPT0gTUJFUlJfVE9PRkVXKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGVsc2UgaWYgKG11bHRpYnl0ZWNvZGVjX2RlY2Vycm9yKGN0eC0+Y29kZWMsICZjdHgtPnN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWYsIGN0eC0+ZXJyb3JzLCByKSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIApAQCAtODc3LDE0MiArODc3LDE0MiBAQAogCiBzdGF0aWMgUHlPYmplY3QgKgogbWJpZW5jb2Rlcl9lbmNvZGUoTXVsdGlieXRlSW5jcmVtZW50YWxFbmNvZGVyT2JqZWN0ICpzZWxmLAotCQkgIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQorICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7Ci0JUHlPYmplY3QgKmRhdGE7Ci0JaW50IGZpbmFsID0gMDsKKyAgICBQeU9iamVjdCAqZGF0YTsKKyAgICBpbnQgZmluYWwgPSAwOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiT3xpOmVuY29kZSIsCi0JCQlpbmNyZW1lbnRhbGt3YXJnbGlzdCwgJmRhdGEsICZmaW5hbCkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk98aTplbmNvZGUiLAorICAgICAgICAgICAgICAgICAgICBpbmNyZW1lbnRhbGt3YXJnbGlzdCwgJmRhdGEsICZmaW5hbCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JcmV0dXJuIGVuY29kZXJfZW5jb2RlX3N0YXRlZnVsKFNUQVRFRlVMX0VDVFgoc2VsZiksIGRhdGEsIGZpbmFsKTsKKyAgICByZXR1cm4gZW5jb2Rlcl9lbmNvZGVfc3RhdGVmdWwoU1RBVEVGVUxfRUNUWChzZWxmKSwgZGF0YSwgZmluYWwpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbWJpZW5jb2Rlcl9yZXNldChNdWx0aWJ5dGVJbmNyZW1lbnRhbEVuY29kZXJPYmplY3QgKnNlbGYpCiB7Ci0JaWYgKHNlbGYtPmNvZGVjLT5kZWNyZXNldCAhPSBOVUxMICYmCi0JICAgIHNlbGYtPmNvZGVjLT5kZWNyZXNldCgmc2VsZi0+c3RhdGUsIHNlbGYtPmNvZGVjLT5jb25maWcpICE9IDApCi0JCXJldHVybiBOVUxMOwotCXNlbGYtPnBlbmRpbmdzaXplID0gMDsKKyAgICBpZiAoc2VsZi0+Y29kZWMtPmRlY3Jlc2V0ICE9IE5VTEwgJiYKKyAgICAgICAgc2VsZi0+Y29kZWMtPmRlY3Jlc2V0KCZzZWxmLT5zdGF0ZSwgc2VsZi0+Y29kZWMtPmNvbmZpZykgIT0gMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgc2VsZi0+cGVuZGluZ3NpemUgPSAwOwogCi0JUHlfUkVUVVJOX05PTkU7CisgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgUHlNZXRob2REZWYgbWJpZW5jb2Rlcl9tZXRob2RzW10gPSB7Ci0JeyJlbmNvZGUiLAkoUHlDRnVuY3Rpb24pbWJpZW5jb2Rlcl9lbmNvZGUsCi0JCQlNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLCBOVUxMfSwKLQl7InJlc2V0IiwJKFB5Q0Z1bmN0aW9uKW1iaWVuY29kZXJfcmVzZXQsCi0JCQlNRVRIX05PQVJHUywgTlVMTH0sCi0Je05VTEwsCQlOVUxMfSwKKyAgICB7ImVuY29kZSIsICAgICAgICAgIChQeUNGdW5jdGlvbiltYmllbmNvZGVyX2VuY29kZSwKKyAgICAgICAgICAgICAgICAgICAgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywgTlVMTH0sCisgICAgeyJyZXNldCIsICAgICAgICAgICAoUHlDRnVuY3Rpb24pbWJpZW5jb2Rlcl9yZXNldCwKKyAgICAgICAgICAgICAgICAgICAgTUVUSF9OT0FSR1MsIE5VTEx9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0sCiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKgogbWJpZW5jb2Rlcl9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JTXVsdGlieXRlSW5jcmVtZW50YWxFbmNvZGVyT2JqZWN0ICpzZWxmOwotCVB5T2JqZWN0ICpjb2RlYyA9IE5VTEw7Ci0JY2hhciAqZXJyb3JzID0gTlVMTDsKKyAgICBNdWx0aWJ5dGVJbmNyZW1lbnRhbEVuY29kZXJPYmplY3QgKnNlbGY7CisgICAgUHlPYmplY3QgKmNvZGVjID0gTlVMTDsKKyAgICBjaGFyICplcnJvcnMgPSBOVUxMOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgInxzOkluY3JlbWVudGFsRW5jb2RlciIsCi0JCQkJCSBpbmNuZXdrd2FyZ2xpc3QsICZlcnJvcnMpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAifHM6SW5jcmVtZW50YWxFbmNvZGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNuZXdrd2FyZ2xpc3QsICZlcnJvcnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXNlbGYgPSAoTXVsdGlieXRlSW5jcmVtZW50YWxFbmNvZGVyT2JqZWN0ICopdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7Ci0JaWYgKHNlbGYgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgc2VsZiA9IChNdWx0aWJ5dGVJbmNyZW1lbnRhbEVuY29kZXJPYmplY3QgKil0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKKyAgICBpZiAoc2VsZiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWNvZGVjID0gUHlPYmplY3RfR2V0QXR0clN0cmluZygoUHlPYmplY3QgKil0eXBlLCAiY29kZWMiKTsKLQlpZiAoY29kZWMgPT0gTlVMTCkKLQkJZ290byBlcnJvcmV4aXQ7Ci0JaWYgKCFNdWx0aWJ5dGVDb2RlY19DaGVjayhjb2RlYykpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImNvZGVjIGlzIHVuZXhwZWN0ZWQgdHlwZSIpOwotCQlnb3RvIGVycm9yZXhpdDsKLQl9CisgICAgY29kZWMgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKChQeU9iamVjdCAqKXR5cGUsICJjb2RlYyIpOworICAgIGlmIChjb2RlYyA9PSBOVUxMKQorICAgICAgICBnb3RvIGVycm9yZXhpdDsKKyAgICBpZiAoIU11bHRpYnl0ZUNvZGVjX0NoZWNrKGNvZGVjKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiY29kZWMgaXMgdW5leHBlY3RlZCB0eXBlIik7CisgICAgICAgIGdvdG8gZXJyb3JleGl0OworICAgIH0KIAotCXNlbGYtPmNvZGVjID0gKChNdWx0aWJ5dGVDb2RlY09iamVjdCAqKWNvZGVjKS0+Y29kZWM7Ci0Jc2VsZi0+cGVuZGluZ3NpemUgPSAwOwotCXNlbGYtPmVycm9ycyA9IGludGVybmFsX2Vycm9yX2NhbGxiYWNrKGVycm9ycyk7Ci0JaWYgKHNlbGYtPmVycm9ycyA9PSBOVUxMKQotCQlnb3RvIGVycm9yZXhpdDsKLQlpZiAoc2VsZi0+Y29kZWMtPmVuY2luaXQgIT0gTlVMTCAmJgotCSAgICBzZWxmLT5jb2RlYy0+ZW5jaW5pdCgmc2VsZi0+c3RhdGUsIHNlbGYtPmNvZGVjLT5jb25maWcpICE9IDApCi0JCWdvdG8gZXJyb3JleGl0OworICAgIHNlbGYtPmNvZGVjID0gKChNdWx0aWJ5dGVDb2RlY09iamVjdCAqKWNvZGVjKS0+Y29kZWM7CisgICAgc2VsZi0+cGVuZGluZ3NpemUgPSAwOworICAgIHNlbGYtPmVycm9ycyA9IGludGVybmFsX2Vycm9yX2NhbGxiYWNrKGVycm9ycyk7CisgICAgaWYgKHNlbGYtPmVycm9ycyA9PSBOVUxMKQorICAgICAgICBnb3RvIGVycm9yZXhpdDsKKyAgICBpZiAoc2VsZi0+Y29kZWMtPmVuY2luaXQgIT0gTlVMTCAmJgorICAgICAgICBzZWxmLT5jb2RlYy0+ZW5jaW5pdCgmc2VsZi0+c3RhdGUsIHNlbGYtPmNvZGVjLT5jb25maWcpICE9IDApCisgICAgICAgIGdvdG8gZXJyb3JleGl0OwogCi0JUHlfREVDUkVGKGNvZGVjKTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKKyAgICBQeV9ERUNSRUYoY29kZWMpOworICAgIHJldHVybiAoUHlPYmplY3QgKilzZWxmOwogCiBlcnJvcmV4aXQ6Ci0JUHlfWERFQ1JFRihzZWxmKTsKLQlQeV9YREVDUkVGKGNvZGVjKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeV9YREVDUkVGKHNlbGYpOworICAgIFB5X1hERUNSRUYoY29kZWMpOworICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgaW50CiBtYmllbmNvZGVyX2luaXQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogbWJpZW5jb2Rlcl90cmF2ZXJzZShNdWx0aWJ5dGVJbmNyZW1lbnRhbEVuY29kZXJPYmplY3QgKnNlbGYsCi0JCSAgICB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKKyAgICAgICAgICAgICAgICAgICAgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JaWYgKEVSUk9SX0lTQ1VTVE9NKHNlbGYtPmVycm9ycykpCi0JCVB5X1ZJU0lUKHNlbGYtPmVycm9ycyk7Ci0JcmV0dXJuIDA7CisgICAgaWYgKEVSUk9SX0lTQ1VTVE9NKHNlbGYtPmVycm9ycykpCisgICAgICAgIFB5X1ZJU0lUKHNlbGYtPmVycm9ycyk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkCiBtYmllbmNvZGVyX2RlYWxsb2MoTXVsdGlieXRlSW5jcmVtZW50YWxFbmNvZGVyT2JqZWN0ICpzZWxmKQogewotCVB5T2JqZWN0X0dDX1VuVHJhY2soc2VsZik7Ci0JRVJST1JfREVDUkVGKHNlbGYtPmVycm9ycyk7Ci0JUHlfVFlQRShzZWxmKS0+dHBfZnJlZShzZWxmKTsKKyAgICBQeU9iamVjdF9HQ19VblRyYWNrKHNlbGYpOworICAgIEVSUk9SX0RFQ1JFRihzZWxmLT5lcnJvcnMpOworICAgIFB5X1RZUEUoc2VsZiktPnRwX2ZyZWUoc2VsZik7CiB9CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgTXVsdGlieXRlSW5jcmVtZW50YWxFbmNvZGVyX1R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JIk11bHRpYnl0ZUluY3JlbWVudGFsRW5jb2RlciIsCS8qIHRwX25hbWUgKi8KLQlzaXplb2YoTXVsdGlieXRlSW5jcmVtZW50YWxFbmNvZGVyT2JqZWN0KSwgLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkvKiAgbWV0aG9kcyAgKi8KLQkoZGVzdHJ1Y3RvciltYmllbmNvZGVyX2RlYWxsb2MsIC8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJLyogdHBfY29tcGFyZSAqLwotCTAsCQkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJLyogdHBfY2FsbCAqLwotCTAsCQkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDCi0JCXwgUHlfVFBGTEFHU19CQVNFVFlQRSwJLyogdHBfZmxhZ3MgKi8KLQkwLAkJCQkvKiB0cF9kb2MgKi8KLQkodHJhdmVyc2Vwcm9jKW1iaWVuY29kZXJfdHJhdmVyc2UsCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JMCwJCQkJLyogdHBfaXRlciAqLwotCTAsCQkJCS8qIHRwX2l0ZXJleHQgKi8KLQltYmllbmNvZGVyX21ldGhvZHMsCQkvKiB0cF9tZXRob2RzICovCi0JMCwJCQkJLyogdHBfbWVtYmVycyAqLwotCWNvZGVjY3R4X2dldHNldHMsCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQltYmllbmNvZGVyX2luaXQsCQkvKiB0cF9pbml0ICovCi0JMCwJCQkJLyogdHBfYWxsb2MgKi8KLQltYmllbmNvZGVyX25ldywJCQkvKiB0cF9uZXcgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAiTXVsdGlieXRlSW5jcmVtZW50YWxFbmNvZGVyIiwgICAgICAvKiB0cF9uYW1lICovCisgICAgc2l6ZW9mKE11bHRpYnl0ZUluY3JlbWVudGFsRW5jb2Rlck9iamVjdCksIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgLyogIG1ldGhvZHMgICovCisgICAgKGRlc3RydWN0b3IpbWJpZW5jb2Rlcl9kZWFsbG9jLCAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDCisgICAgICAgIHwgUHlfVFBGTEFHU19CQVNFVFlQRSwgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAodHJhdmVyc2Vwcm9jKW1iaWVuY29kZXJfdHJhdmVyc2UsICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJleHQgKi8KKyAgICBtYmllbmNvZGVyX21ldGhvZHMsICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIGNvZGVjY3R4X2dldHNldHMsICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIG1iaWVuY29kZXJfaW5pdCwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIG1iaWVuY29kZXJfbmV3LCAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLwogfTsKIAogCkBAIC0xMDIyLDIwNiArMTAyMiwyMDYgQEAKIAogc3RhdGljIFB5T2JqZWN0ICoKIG1iaWRlY29kZXJfZGVjb2RlKE11bHRpYnl0ZUluY3JlbWVudGFsRGVjb2Rlck9iamVjdCAqc2VsZiwKLQkJICBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKKyAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewotCU11bHRpYnl0ZURlY29kZUJ1ZmZlciBidWY7Ci0JY2hhciAqZGF0YSwgKndkYXRhID0gTlVMTDsKLQlQeV9idWZmZXIgcGRhdGE7Ci0JUHlfc3NpemVfdCB3c2l6ZSwgZmluYWxzaXplID0gMCwgc2l6ZSwgb3JpZ3BlbmRpbmc7Ci0JaW50IGZpbmFsID0gMDsKKyAgICBNdWx0aWJ5dGVEZWNvZGVCdWZmZXIgYnVmOworICAgIGNoYXIgKmRhdGEsICp3ZGF0YSA9IE5VTEw7CisgICAgUHlfYnVmZmVyIHBkYXRhOworICAgIFB5X3NzaXplX3Qgd3NpemUsIGZpbmFsc2l6ZSA9IDAsIHNpemUsIG9yaWdwZW5kaW5nOworICAgIGludCBmaW5hbCA9IDA7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJzKnxpOmRlY29kZSIsCi0JCQlpbmNyZW1lbnRhbGt3YXJnbGlzdCwgJnBkYXRhLCAmZmluYWwpKQotCQlyZXR1cm4gTlVMTDsKLQlkYXRhID0gcGRhdGEuYnVmOwotCXNpemUgPSBwZGF0YS5sZW47CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAicyp8aTpkZWNvZGUiLAorICAgICAgICAgICAgICAgICAgICBpbmNyZW1lbnRhbGt3YXJnbGlzdCwgJnBkYXRhLCAmZmluYWwpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBkYXRhID0gcGRhdGEuYnVmOworICAgIHNpemUgPSBwZGF0YS5sZW47CiAKLQlidWYub3V0b2JqID0gYnVmLmV4Y29iaiA9IE5VTEw7Ci0Jb3JpZ3BlbmRpbmcgPSBzZWxmLT5wZW5kaW5nc2l6ZTsKKyAgICBidWYub3V0b2JqID0gYnVmLmV4Y29iaiA9IE5VTEw7CisgICAgb3JpZ3BlbmRpbmcgPSBzZWxmLT5wZW5kaW5nc2l6ZTsKIAotCWlmIChzZWxmLT5wZW5kaW5nc2l6ZSA9PSAwKSB7Ci0JCXdzaXplID0gc2l6ZTsKLQkJd2RhdGEgPSBkYXRhOwotCX0KLQllbHNlIHsKLQkJaWYgKHNpemUgPiBQWV9TU0laRV9UX01BWCAtIHNlbGYtPnBlbmRpbmdzaXplKSB7Ci0JCQlQeUVycl9Ob01lbW9yeSgpOwotCQkJZ290byBlcnJvcmV4aXQ7Ci0JCX0KLQkJd3NpemUgPSBzaXplICsgc2VsZi0+cGVuZGluZ3NpemU7Ci0JCXdkYXRhID0gUHlNZW1fTWFsbG9jKHdzaXplKTsKLQkJaWYgKHdkYXRhID09IE5VTEwpCi0JCQlnb3RvIGVycm9yZXhpdDsKLQkJbWVtY3B5KHdkYXRhLCBzZWxmLT5wZW5kaW5nLCBzZWxmLT5wZW5kaW5nc2l6ZSk7Ci0JCW1lbWNweSh3ZGF0YSArIHNlbGYtPnBlbmRpbmdzaXplLCBkYXRhLCBzaXplKTsKLQkJc2VsZi0+cGVuZGluZ3NpemUgPSAwOwotCX0KKyAgICBpZiAoc2VsZi0+cGVuZGluZ3NpemUgPT0gMCkgeworICAgICAgICB3c2l6ZSA9IHNpemU7CisgICAgICAgIHdkYXRhID0gZGF0YTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGlmIChzaXplID4gUFlfU1NJWkVfVF9NQVggLSBzZWxmLT5wZW5kaW5nc2l6ZSkgeworICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3JleGl0OworICAgICAgICB9CisgICAgICAgIHdzaXplID0gc2l6ZSArIHNlbGYtPnBlbmRpbmdzaXplOworICAgICAgICB3ZGF0YSA9IFB5TWVtX01hbGxvYyh3c2l6ZSk7CisgICAgICAgIGlmICh3ZGF0YSA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBlcnJvcmV4aXQ7CisgICAgICAgIG1lbWNweSh3ZGF0YSwgc2VsZi0+cGVuZGluZywgc2VsZi0+cGVuZGluZ3NpemUpOworICAgICAgICBtZW1jcHkod2RhdGEgKyBzZWxmLT5wZW5kaW5nc2l6ZSwgZGF0YSwgc2l6ZSk7CisgICAgICAgIHNlbGYtPnBlbmRpbmdzaXplID0gMDsKKyAgICB9CiAKLQlpZiAoZGVjb2Rlcl9wcmVwYXJlX2J1ZmZlcigmYnVmLCB3ZGF0YSwgd3NpemUpICE9IDApCi0JCWdvdG8gZXJyb3JleGl0OworICAgIGlmIChkZWNvZGVyX3ByZXBhcmVfYnVmZmVyKCZidWYsIHdkYXRhLCB3c2l6ZSkgIT0gMCkKKyAgICAgICAgZ290byBlcnJvcmV4aXQ7CiAKLQlpZiAoZGVjb2Rlcl9mZWVkX2J1ZmZlcihTVEFURUZVTF9EQ1RYKHNlbGYpLCAmYnVmKSkKLQkJZ290byBlcnJvcmV4aXQ7CisgICAgaWYgKGRlY29kZXJfZmVlZF9idWZmZXIoU1RBVEVGVUxfRENUWChzZWxmKSwgJmJ1ZikpCisgICAgICAgIGdvdG8gZXJyb3JleGl0OwogCi0JaWYgKGZpbmFsICYmIGJ1Zi5pbmJ1ZiA8IGJ1Zi5pbmJ1Zl9lbmQpIHsKLQkJaWYgKG11bHRpYnl0ZWNvZGVjX2RlY2Vycm9yKHNlbGYtPmNvZGVjLCAmc2VsZi0+c3RhdGUsCi0JCQkJJmJ1Ziwgc2VsZi0+ZXJyb3JzLCBNQkVSUl9UT09GRVcpKSB7Ci0JCQkvKiByZWNvdmVyIHRoZSBvcmlnaW5hbCBwZW5kaW5nIGJ1ZmZlciAqLwotCQkJbWVtY3B5KHNlbGYtPnBlbmRpbmcsIHdkYXRhLCBvcmlncGVuZGluZyk7Ci0JCQlzZWxmLT5wZW5kaW5nc2l6ZSA9IG9yaWdwZW5kaW5nOwotCQkJZ290byBlcnJvcmV4aXQ7Ci0JCX0KLQl9CisgICAgaWYgKGZpbmFsICYmIGJ1Zi5pbmJ1ZiA8IGJ1Zi5pbmJ1Zl9lbmQpIHsKKyAgICAgICAgaWYgKG11bHRpYnl0ZWNvZGVjX2RlY2Vycm9yKHNlbGYtPmNvZGVjLCAmc2VsZi0+c3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAmYnVmLCBzZWxmLT5lcnJvcnMsIE1CRVJSX1RPT0ZFVykpIHsKKyAgICAgICAgICAgIC8qIHJlY292ZXIgdGhlIG9yaWdpbmFsIHBlbmRpbmcgYnVmZmVyICovCisgICAgICAgICAgICBtZW1jcHkoc2VsZi0+cGVuZGluZywgd2RhdGEsIG9yaWdwZW5kaW5nKTsKKyAgICAgICAgICAgIHNlbGYtPnBlbmRpbmdzaXplID0gb3JpZ3BlbmRpbmc7CisgICAgICAgICAgICBnb3RvIGVycm9yZXhpdDsKKyAgICAgICAgfQorICAgIH0KIAotCWlmIChidWYuaW5idWYgPCBidWYuaW5idWZfZW5kKSB7IC8qIHBlbmRpbmcgc2VxdWVuY2Ugc3RpbGwgZXhpc3RzICovCi0JCWlmIChkZWNvZGVyX2FwcGVuZF9wZW5kaW5nKFNUQVRFRlVMX0RDVFgoc2VsZiksICZidWYpICE9IDApCi0JCQlnb3RvIGVycm9yZXhpdDsKLQl9CisgICAgaWYgKGJ1Zi5pbmJ1ZiA8IGJ1Zi5pbmJ1Zl9lbmQpIHsgLyogcGVuZGluZyBzZXF1ZW5jZSBzdGlsbCBleGlzdHMgKi8KKyAgICAgICAgaWYgKGRlY29kZXJfYXBwZW5kX3BlbmRpbmcoU1RBVEVGVUxfRENUWChzZWxmKSwgJmJ1ZikgIT0gMCkKKyAgICAgICAgICAgIGdvdG8gZXJyb3JleGl0OworICAgIH0KIAotCWZpbmFsc2l6ZSA9IChQeV9zc2l6ZV90KShidWYub3V0YnVmIC0gUHlVbmljb2RlX0FTX1VOSUNPREUoYnVmLm91dG9iaikpOwotCWlmIChmaW5hbHNpemUgIT0gUHlVbmljb2RlX0dFVF9TSVpFKGJ1Zi5vdXRvYmopKQotCQlpZiAoUHlVbmljb2RlX1Jlc2l6ZSgmYnVmLm91dG9iaiwgZmluYWxzaXplKSA9PSAtMSkKLQkJCWdvdG8gZXJyb3JleGl0OworICAgIGZpbmFsc2l6ZSA9IChQeV9zc2l6ZV90KShidWYub3V0YnVmIC0gUHlVbmljb2RlX0FTX1VOSUNPREUoYnVmLm91dG9iaikpOworICAgIGlmIChmaW5hbHNpemUgIT0gUHlVbmljb2RlX0dFVF9TSVpFKGJ1Zi5vdXRvYmopKQorICAgICAgICBpZiAoUHlVbmljb2RlX1Jlc2l6ZSgmYnVmLm91dG9iaiwgZmluYWxzaXplKSA9PSAtMSkKKyAgICAgICAgICAgIGdvdG8gZXJyb3JleGl0OwogCi0JUHlCdWZmZXJfUmVsZWFzZSgmcGRhdGEpOwotCWlmICh3ZGF0YSAhPSBkYXRhKQotCQlQeU1lbV9EZWwod2RhdGEpOwotCVB5X1hERUNSRUYoYnVmLmV4Y29iaik7Ci0JcmV0dXJuIGJ1Zi5vdXRvYmo7CisgICAgUHlCdWZmZXJfUmVsZWFzZSgmcGRhdGEpOworICAgIGlmICh3ZGF0YSAhPSBkYXRhKQorICAgICAgICBQeU1lbV9EZWwod2RhdGEpOworICAgIFB5X1hERUNSRUYoYnVmLmV4Y29iaik7CisgICAgcmV0dXJuIGJ1Zi5vdXRvYmo7CiAKIGVycm9yZXhpdDoKLQlQeUJ1ZmZlcl9SZWxlYXNlKCZwZGF0YSk7Ci0JaWYgKHdkYXRhICE9IE5VTEwgJiYgd2RhdGEgIT0gZGF0YSkKLQkJUHlNZW1fRGVsKHdkYXRhKTsKLQlQeV9YREVDUkVGKGJ1Zi5leGNvYmopOwotCVB5X1hERUNSRUYoYnVmLm91dG9iaik7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlCdWZmZXJfUmVsZWFzZSgmcGRhdGEpOworICAgIGlmICh3ZGF0YSAhPSBOVUxMICYmIHdkYXRhICE9IGRhdGEpCisgICAgICAgIFB5TWVtX0RlbCh3ZGF0YSk7CisgICAgUHlfWERFQ1JFRihidWYuZXhjb2JqKTsKKyAgICBQeV9YREVDUkVGKGJ1Zi5vdXRvYmopOworICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbWJpZGVjb2Rlcl9yZXNldChNdWx0aWJ5dGVJbmNyZW1lbnRhbERlY29kZXJPYmplY3QgKnNlbGYpCiB7Ci0JaWYgKHNlbGYtPmNvZGVjLT5kZWNyZXNldCAhPSBOVUxMICYmCi0JICAgIHNlbGYtPmNvZGVjLT5kZWNyZXNldCgmc2VsZi0+c3RhdGUsIHNlbGYtPmNvZGVjLT5jb25maWcpICE9IDApCi0JCXJldHVybiBOVUxMOwotCXNlbGYtPnBlbmRpbmdzaXplID0gMDsKKyAgICBpZiAoc2VsZi0+Y29kZWMtPmRlY3Jlc2V0ICE9IE5VTEwgJiYKKyAgICAgICAgc2VsZi0+Y29kZWMtPmRlY3Jlc2V0KCZzZWxmLT5zdGF0ZSwgc2VsZi0+Y29kZWMtPmNvbmZpZykgIT0gMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgc2VsZi0+cGVuZGluZ3NpemUgPSAwOwogCi0JUHlfUkVUVVJOX05PTkU7CisgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgUHlNZXRob2REZWYgbWJpZGVjb2Rlcl9tZXRob2RzW10gPSB7Ci0JeyJkZWNvZGUiLAkoUHlDRnVuY3Rpb24pbWJpZGVjb2Rlcl9kZWNvZGUsCi0JCQlNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLCBOVUxMfSwKLQl7InJlc2V0IiwJKFB5Q0Z1bmN0aW9uKW1iaWRlY29kZXJfcmVzZXQsCi0JCQlNRVRIX05PQVJHUywgTlVMTH0sCi0Je05VTEwsCQlOVUxMfSwKKyAgICB7ImRlY29kZSIsICAgICAgICAgIChQeUNGdW5jdGlvbiltYmlkZWNvZGVyX2RlY29kZSwKKyAgICAgICAgICAgICAgICAgICAgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywgTlVMTH0sCisgICAgeyJyZXNldCIsICAgICAgICAgICAoUHlDRnVuY3Rpb24pbWJpZGVjb2Rlcl9yZXNldCwKKyAgICAgICAgICAgICAgICAgICAgTUVUSF9OT0FSR1MsIE5VTEx9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0sCiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKgogbWJpZGVjb2Rlcl9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JTXVsdGlieXRlSW5jcmVtZW50YWxEZWNvZGVyT2JqZWN0ICpzZWxmOwotCVB5T2JqZWN0ICpjb2RlYyA9IE5VTEw7Ci0JY2hhciAqZXJyb3JzID0gTlVMTDsKKyAgICBNdWx0aWJ5dGVJbmNyZW1lbnRhbERlY29kZXJPYmplY3QgKnNlbGY7CisgICAgUHlPYmplY3QgKmNvZGVjID0gTlVMTDsKKyAgICBjaGFyICplcnJvcnMgPSBOVUxMOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgInxzOkluY3JlbWVudGFsRGVjb2RlciIsCi0JCQkJCSBpbmNuZXdrd2FyZ2xpc3QsICZlcnJvcnMpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAifHM6SW5jcmVtZW50YWxEZWNvZGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNuZXdrd2FyZ2xpc3QsICZlcnJvcnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXNlbGYgPSAoTXVsdGlieXRlSW5jcmVtZW50YWxEZWNvZGVyT2JqZWN0ICopdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7Ci0JaWYgKHNlbGYgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgc2VsZiA9IChNdWx0aWJ5dGVJbmNyZW1lbnRhbERlY29kZXJPYmplY3QgKil0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKKyAgICBpZiAoc2VsZiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWNvZGVjID0gUHlPYmplY3RfR2V0QXR0clN0cmluZygoUHlPYmplY3QgKil0eXBlLCAiY29kZWMiKTsKLQlpZiAoY29kZWMgPT0gTlVMTCkKLQkJZ290byBlcnJvcmV4aXQ7Ci0JaWYgKCFNdWx0aWJ5dGVDb2RlY19DaGVjayhjb2RlYykpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImNvZGVjIGlzIHVuZXhwZWN0ZWQgdHlwZSIpOwotCQlnb3RvIGVycm9yZXhpdDsKLQl9CisgICAgY29kZWMgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKChQeU9iamVjdCAqKXR5cGUsICJjb2RlYyIpOworICAgIGlmIChjb2RlYyA9PSBOVUxMKQorICAgICAgICBnb3RvIGVycm9yZXhpdDsKKyAgICBpZiAoIU11bHRpYnl0ZUNvZGVjX0NoZWNrKGNvZGVjKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiY29kZWMgaXMgdW5leHBlY3RlZCB0eXBlIik7CisgICAgICAgIGdvdG8gZXJyb3JleGl0OworICAgIH0KIAotCXNlbGYtPmNvZGVjID0gKChNdWx0aWJ5dGVDb2RlY09iamVjdCAqKWNvZGVjKS0+Y29kZWM7Ci0Jc2VsZi0+cGVuZGluZ3NpemUgPSAwOwotCXNlbGYtPmVycm9ycyA9IGludGVybmFsX2Vycm9yX2NhbGxiYWNrKGVycm9ycyk7Ci0JaWYgKHNlbGYtPmVycm9ycyA9PSBOVUxMKQotCQlnb3RvIGVycm9yZXhpdDsKLQlpZiAoc2VsZi0+Y29kZWMtPmRlY2luaXQgIT0gTlVMTCAmJgotCSAgICBzZWxmLT5jb2RlYy0+ZGVjaW5pdCgmc2VsZi0+c3RhdGUsIHNlbGYtPmNvZGVjLT5jb25maWcpICE9IDApCi0JCWdvdG8gZXJyb3JleGl0OworICAgIHNlbGYtPmNvZGVjID0gKChNdWx0aWJ5dGVDb2RlY09iamVjdCAqKWNvZGVjKS0+Y29kZWM7CisgICAgc2VsZi0+cGVuZGluZ3NpemUgPSAwOworICAgIHNlbGYtPmVycm9ycyA9IGludGVybmFsX2Vycm9yX2NhbGxiYWNrKGVycm9ycyk7CisgICAgaWYgKHNlbGYtPmVycm9ycyA9PSBOVUxMKQorICAgICAgICBnb3RvIGVycm9yZXhpdDsKKyAgICBpZiAoc2VsZi0+Y29kZWMtPmRlY2luaXQgIT0gTlVMTCAmJgorICAgICAgICBzZWxmLT5jb2RlYy0+ZGVjaW5pdCgmc2VsZi0+c3RhdGUsIHNlbGYtPmNvZGVjLT5jb25maWcpICE9IDApCisgICAgICAgIGdvdG8gZXJyb3JleGl0OwogCi0JUHlfREVDUkVGKGNvZGVjKTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKKyAgICBQeV9ERUNSRUYoY29kZWMpOworICAgIHJldHVybiAoUHlPYmplY3QgKilzZWxmOwogCiBlcnJvcmV4aXQ6Ci0JUHlfWERFQ1JFRihzZWxmKTsKLQlQeV9YREVDUkVGKGNvZGVjKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeV9YREVDUkVGKHNlbGYpOworICAgIFB5X1hERUNSRUYoY29kZWMpOworICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgaW50CiBtYmlkZWNvZGVyX2luaXQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogbWJpZGVjb2Rlcl90cmF2ZXJzZShNdWx0aWJ5dGVJbmNyZW1lbnRhbERlY29kZXJPYmplY3QgKnNlbGYsCi0JCSAgICB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKKyAgICAgICAgICAgICAgICAgICAgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JaWYgKEVSUk9SX0lTQ1VTVE9NKHNlbGYtPmVycm9ycykpCi0JCVB5X1ZJU0lUKHNlbGYtPmVycm9ycyk7Ci0JcmV0dXJuIDA7CisgICAgaWYgKEVSUk9SX0lTQ1VTVE9NKHNlbGYtPmVycm9ycykpCisgICAgICAgIFB5X1ZJU0lUKHNlbGYtPmVycm9ycyk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkCiBtYmlkZWNvZGVyX2RlYWxsb2MoTXVsdGlieXRlSW5jcmVtZW50YWxEZWNvZGVyT2JqZWN0ICpzZWxmKQogewotCVB5T2JqZWN0X0dDX1VuVHJhY2soc2VsZik7Ci0JRVJST1JfREVDUkVGKHNlbGYtPmVycm9ycyk7Ci0JUHlfVFlQRShzZWxmKS0+dHBfZnJlZShzZWxmKTsKKyAgICBQeU9iamVjdF9HQ19VblRyYWNrKHNlbGYpOworICAgIEVSUk9SX0RFQ1JFRihzZWxmLT5lcnJvcnMpOworICAgIFB5X1RZUEUoc2VsZiktPnRwX2ZyZWUoc2VsZik7CiB9CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgTXVsdGlieXRlSW5jcmVtZW50YWxEZWNvZGVyX1R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JIk11bHRpYnl0ZUluY3JlbWVudGFsRGVjb2RlciIsCS8qIHRwX25hbWUgKi8KLQlzaXplb2YoTXVsdGlieXRlSW5jcmVtZW50YWxEZWNvZGVyT2JqZWN0KSwgLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkvKiAgbWV0aG9kcyAgKi8KLQkoZGVzdHJ1Y3RvciltYmlkZWNvZGVyX2RlYWxsb2MsIC8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJLyogdHBfY29tcGFyZSAqLwotCTAsCQkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJLyogdHBfY2FsbCAqLwotCTAsCQkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDCi0JCXwgUHlfVFBGTEFHU19CQVNFVFlQRSwJLyogdHBfZmxhZ3MgKi8KLQkwLAkJCQkvKiB0cF9kb2MgKi8KLQkodHJhdmVyc2Vwcm9jKW1iaWRlY29kZXJfdHJhdmVyc2UsCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JMCwJCQkJLyogdHBfaXRlciAqLwotCTAsCQkJCS8qIHRwX2l0ZXJleHQgKi8KLQltYmlkZWNvZGVyX21ldGhvZHMsCQkvKiB0cF9tZXRob2RzICovCi0JMCwJCQkJLyogdHBfbWVtYmVycyAqLwotCWNvZGVjY3R4X2dldHNldHMsCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQltYmlkZWNvZGVyX2luaXQsCQkvKiB0cF9pbml0ICovCi0JMCwJCQkJLyogdHBfYWxsb2MgKi8KLQltYmlkZWNvZGVyX25ldywJCQkvKiB0cF9uZXcgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAiTXVsdGlieXRlSW5jcmVtZW50YWxEZWNvZGVyIiwgICAgICAvKiB0cF9uYW1lICovCisgICAgc2l6ZW9mKE11bHRpYnl0ZUluY3JlbWVudGFsRGVjb2Rlck9iamVjdCksIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgLyogIG1ldGhvZHMgICovCisgICAgKGRlc3RydWN0b3IpbWJpZGVjb2Rlcl9kZWFsbG9jLCAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDCisgICAgICAgIHwgUHlfVFBGTEFHU19CQVNFVFlQRSwgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAodHJhdmVyc2Vwcm9jKW1iaWRlY29kZXJfdHJhdmVyc2UsICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJleHQgKi8KKyAgICBtYmlkZWNvZGVyX21ldGhvZHMsICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIGNvZGVjY3R4X2dldHNldHMsICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIG1iaWRlY29kZXJfaW5pdCwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIG1iaWRlY29kZXJfbmV3LCAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLwogfTsKIAogCkBAIC0xMjMxLDMxNyArMTIzMSwzMTcgQEAKIAogc3RhdGljIFB5T2JqZWN0ICoKIG1ic3RyZWFtcmVhZGVyX2lyZWFkKE11bHRpYnl0ZVN0cmVhbVJlYWRlck9iamVjdCAqc2VsZiwKLQkJICAgICBjb25zdCBjaGFyICptZXRob2QsIFB5X3NzaXplX3Qgc2l6ZWhpbnQpCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICptZXRob2QsIFB5X3NzaXplX3Qgc2l6ZWhpbnQpCiB7Ci0JTXVsdGlieXRlRGVjb2RlQnVmZmVyIGJ1ZjsKLQlQeU9iamVjdCAqY3JlczsKLQlQeV9zc2l6ZV90IHJzaXplLCBmaW5hbHNpemUgPSAwOworICAgIE11bHRpYnl0ZURlY29kZUJ1ZmZlciBidWY7CisgICAgUHlPYmplY3QgKmNyZXM7CisgICAgUHlfc3NpemVfdCByc2l6ZSwgZmluYWxzaXplID0gMDsKIAotCWlmIChzaXplaGludCA9PSAwKQotCQlyZXR1cm4gUHlVbmljb2RlX0Zyb21Vbmljb2RlKE5VTEwsIDApOworICAgIGlmIChzaXplaGludCA9PSAwKQorICAgICAgICByZXR1cm4gUHlVbmljb2RlX0Zyb21Vbmljb2RlKE5VTEwsIDApOwogCi0JYnVmLm91dG9iaiA9IGJ1Zi5leGNvYmogPSBOVUxMOwotCWNyZXMgPSBOVUxMOworICAgIGJ1Zi5vdXRvYmogPSBidWYuZXhjb2JqID0gTlVMTDsKKyAgICBjcmVzID0gTlVMTDsKIAotCWZvciAoOzspIHsKLQkJaW50IGVuZG9mZmlsZTsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGludCBlbmRvZmZpbGU7CiAKLQkJaWYgKHNpemVoaW50IDwgMCkKLQkJCWNyZXMgPSBQeU9iamVjdF9DYWxsTWV0aG9kKHNlbGYtPnN0cmVhbSwKLQkJCQkJKGNoYXIgKiltZXRob2QsIE5VTEwpOwotCQllbHNlCi0JCQljcmVzID0gUHlPYmplY3RfQ2FsbE1ldGhvZChzZWxmLT5zdHJlYW0sCi0JCQkJCShjaGFyICopbWV0aG9kLCAiaSIsIHNpemVoaW50KTsKLQkJaWYgKGNyZXMgPT0gTlVMTCkKLQkJCWdvdG8gZXJyb3JleGl0OworICAgICAgICBpZiAoc2l6ZWhpbnQgPCAwKQorICAgICAgICAgICAgY3JlcyA9IFB5T2JqZWN0X0NhbGxNZXRob2Qoc2VsZi0+c3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopbWV0aG9kLCBOVUxMKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgY3JlcyA9IFB5T2JqZWN0X0NhbGxNZXRob2Qoc2VsZi0+c3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopbWV0aG9kLCAiaSIsIHNpemVoaW50KTsKKyAgICAgICAgaWYgKGNyZXMgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gZXJyb3JleGl0OwogCi0JCWlmICghUHlTdHJpbmdfQ2hlY2soY3JlcykpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJCSJzdHJlYW0gZnVuY3Rpb24gcmV0dXJuZWQgYSAiCi0JCQkJCSJub24tc3RyaW5nIG9iamVjdCIpOwotCQkJZ290byBlcnJvcmV4aXQ7Ci0JCX0KKyAgICAgICAgaWYgKCFQeVN0cmluZ19DaGVjayhjcmVzKSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RyZWFtIGZ1bmN0aW9uIHJldHVybmVkIGEgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJub24tc3RyaW5nIG9iamVjdCIpOworICAgICAgICAgICAgZ290byBlcnJvcmV4aXQ7CisgICAgICAgIH0KIAotCQllbmRvZmZpbGUgPSAoUHlTdHJpbmdfR0VUX1NJWkUoY3JlcykgPT0gMCk7CisgICAgICAgIGVuZG9mZmlsZSA9IChQeVN0cmluZ19HRVRfU0laRShjcmVzKSA9PSAwKTsKIAotCQlpZiAoc2VsZi0+cGVuZGluZ3NpemUgPiAwKSB7Ci0JCQlQeU9iamVjdCAqY3RyOwotCQkJY2hhciAqY3RyZGF0YTsKKyAgICAgICAgaWYgKHNlbGYtPnBlbmRpbmdzaXplID4gMCkgeworICAgICAgICAgICAgUHlPYmplY3QgKmN0cjsKKyAgICAgICAgICAgIGNoYXIgKmN0cmRhdGE7CiAKLQkJCWlmIChQeVN0cmluZ19HRVRfU0laRShjcmVzKSA+IFBZX1NTSVpFX1RfTUFYIC0gc2VsZi0+cGVuZGluZ3NpemUpIHsKLQkJCQlQeUVycl9Ob01lbW9yeSgpOwotCQkJCWdvdG8gZXJyb3JleGl0OwotICAgICAgICAgICAgfQotCQkJcnNpemUgPSBQeVN0cmluZ19HRVRfU0laRShjcmVzKSArIHNlbGYtPnBlbmRpbmdzaXplOwotCQkJY3RyID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgcnNpemUpOwotCQkJaWYgKGN0ciA9PSBOVUxMKQotCQkJCWdvdG8gZXJyb3JleGl0OwotCQkJY3RyZGF0YSA9IFB5U3RyaW5nX0FTX1NUUklORyhjdHIpOwotCQkJbWVtY3B5KGN0cmRhdGEsIHNlbGYtPnBlbmRpbmcsIHNlbGYtPnBlbmRpbmdzaXplKTsKLQkJCW1lbWNweShjdHJkYXRhICsgc2VsZi0+cGVuZGluZ3NpemUsCi0JCQkJUHlTdHJpbmdfQVNfU1RSSU5HKGNyZXMpLAotCQkJCVB5U3RyaW5nX0dFVF9TSVpFKGNyZXMpKTsKLQkJCVB5X0RFQ1JFRihjcmVzKTsKLQkJCWNyZXMgPSBjdHI7Ci0JCQlzZWxmLT5wZW5kaW5nc2l6ZSA9IDA7Ci0JCX0KKyAgICAgICAgICAgIGlmIChQeVN0cmluZ19HRVRfU0laRShjcmVzKSA+IFBZX1NTSVpFX1RfTUFYIC0gc2VsZi0+cGVuZGluZ3NpemUpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICAgICAgICAgIGdvdG8gZXJyb3JleGl0OworICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJzaXplID0gUHlTdHJpbmdfR0VUX1NJWkUoY3JlcykgKyBzZWxmLT5wZW5kaW5nc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgY3RyID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgcnNpemUpOworICAgICAgICAgICAgICAgICAgICBpZiAoY3RyID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcmV4aXQ7CisgICAgICAgICAgICAgICAgICAgIGN0cmRhdGEgPSBQeVN0cmluZ19BU19TVFJJTkcoY3RyKTsKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGN0cmRhdGEsIHNlbGYtPnBlbmRpbmcsIHNlbGYtPnBlbmRpbmdzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGN0cmRhdGEgKyBzZWxmLT5wZW5kaW5nc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcoY3JlcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfR0VUX1NJWkUoY3JlcykpOworICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoY3Jlcyk7CisgICAgICAgICAgICAgICAgICAgIGNyZXMgPSBjdHI7CisgICAgICAgICAgICAgICAgICAgIHNlbGYtPnBlbmRpbmdzaXplID0gMDsKKyAgICAgICAgfQogCi0JCXJzaXplID0gUHlTdHJpbmdfR0VUX1NJWkUoY3Jlcyk7Ci0JCWlmIChkZWNvZGVyX3ByZXBhcmVfYnVmZmVyKCZidWYsIFB5U3RyaW5nX0FTX1NUUklORyhjcmVzKSwKLQkJCQkJICAgcnNpemUpICE9IDApCi0JCQlnb3RvIGVycm9yZXhpdDsKKyAgICAgICAgcnNpemUgPSBQeVN0cmluZ19HRVRfU0laRShjcmVzKTsKKyAgICAgICAgaWYgKGRlY29kZXJfcHJlcGFyZV9idWZmZXIoJmJ1ZiwgUHlTdHJpbmdfQVNfU1RSSU5HKGNyZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByc2l6ZSkgIT0gMCkKKyAgICAgICAgICAgIGdvdG8gZXJyb3JleGl0OwogCi0JCWlmIChyc2l6ZSA+IDAgJiYgZGVjb2Rlcl9mZWVkX2J1ZmZlcigKLQkJCQkoTXVsdGlieXRlU3RhdGVmdWxEZWNvZGVyQ29udGV4dCAqKXNlbGYsICZidWYpKQotCQkJZ290byBlcnJvcmV4aXQ7CisgICAgICAgIGlmIChyc2l6ZSA+IDAgJiYgZGVjb2Rlcl9mZWVkX2J1ZmZlcigKKyAgICAgICAgICAgICAgICAgICAgICAgIChNdWx0aWJ5dGVTdGF0ZWZ1bERlY29kZXJDb250ZXh0ICopc2VsZiwgJmJ1ZikpCisgICAgICAgICAgICBnb3RvIGVycm9yZXhpdDsKIAotCQlpZiAoZW5kb2ZmaWxlIHx8IHNpemVoaW50IDwgMCkgewotCQkJaWYgKGJ1Zi5pbmJ1ZiA8IGJ1Zi5pbmJ1Zl9lbmQgJiYKLQkJCSAgICBtdWx0aWJ5dGVjb2RlY19kZWNlcnJvcihzZWxmLT5jb2RlYywgJnNlbGYtPnN0YXRlLAotCQkJCQkmYnVmLCBzZWxmLT5lcnJvcnMsIE1CRVJSX1RPT0ZFVykpCi0JCQkJZ290byBlcnJvcmV4aXQ7Ci0JCX0KKyAgICAgICAgaWYgKGVuZG9mZmlsZSB8fCBzaXplaGludCA8IDApIHsKKyAgICAgICAgICAgIGlmIChidWYuaW5idWYgPCBidWYuaW5idWZfZW5kICYmCisgICAgICAgICAgICAgICAgbXVsdGlieXRlY29kZWNfZGVjZXJyb3Ioc2VsZi0+Y29kZWMsICZzZWxmLT5zdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnVmLCBzZWxmLT5lcnJvcnMsIE1CRVJSX1RPT0ZFVykpCisgICAgICAgICAgICAgICAgZ290byBlcnJvcmV4aXQ7CisgICAgICAgIH0KIAotCQlpZiAoYnVmLmluYnVmIDwgYnVmLmluYnVmX2VuZCkgeyAvKiBwZW5kaW5nIHNlcXVlbmNlIGV4aXN0cyAqLwotCQkJaWYgKGRlY29kZXJfYXBwZW5kX3BlbmRpbmcoU1RBVEVGVUxfRENUWChzZWxmKSwKLQkJCQkJCSAgICZidWYpICE9IDApCi0JCQkJZ290byBlcnJvcmV4aXQ7Ci0JCX0KKyAgICAgICAgaWYgKGJ1Zi5pbmJ1ZiA8IGJ1Zi5pbmJ1Zl9lbmQpIHsgLyogcGVuZGluZyBzZXF1ZW5jZSBleGlzdHMgKi8KKyAgICAgICAgICAgIGlmIChkZWNvZGVyX2FwcGVuZF9wZW5kaW5nKFNUQVRFRlVMX0RDVFgoc2VsZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnVmKSAhPSAwKQorICAgICAgICAgICAgICAgIGdvdG8gZXJyb3JleGl0OworICAgICAgICB9CiAKLQkJZmluYWxzaXplID0gKFB5X3NzaXplX3QpKGJ1Zi5vdXRidWYgLQotCQkJCVB5VW5pY29kZV9BU19VTklDT0RFKGJ1Zi5vdXRvYmopKTsKLQkJUHlfREVDUkVGKGNyZXMpOwotCQljcmVzID0gTlVMTDsKKyAgICAgICAgZmluYWxzaXplID0gKFB5X3NzaXplX3QpKGJ1Zi5vdXRidWYgLQorICAgICAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0FTX1VOSUNPREUoYnVmLm91dG9iaikpOworICAgICAgICBQeV9ERUNSRUYoY3Jlcyk7CisgICAgICAgIGNyZXMgPSBOVUxMOwogCi0JCWlmIChzaXplaGludCA8IDAgfHwgZmluYWxzaXplICE9IDAgfHwgcnNpemUgPT0gMCkKLQkJCWJyZWFrOworICAgICAgICBpZiAoc2l6ZWhpbnQgPCAwIHx8IGZpbmFsc2l6ZSAhPSAwIHx8IHJzaXplID09IDApCisgICAgICAgICAgICBicmVhazsKIAotCQlzaXplaGludCA9IDE7IC8qIHJlYWQgMSBtb3JlIGJ5dGUgYW5kIHJldHJ5ICovCi0JfQorICAgICAgICBzaXplaGludCA9IDE7IC8qIHJlYWQgMSBtb3JlIGJ5dGUgYW5kIHJldHJ5ICovCisgICAgfQogCi0JaWYgKGZpbmFsc2l6ZSAhPSBQeVVuaWNvZGVfR0VUX1NJWkUoYnVmLm91dG9iaikpCi0JCWlmIChQeVVuaWNvZGVfUmVzaXplKCZidWYub3V0b2JqLCBmaW5hbHNpemUpID09IC0xKQotCQkJZ290byBlcnJvcmV4aXQ7CisgICAgaWYgKGZpbmFsc2l6ZSAhPSBQeVVuaWNvZGVfR0VUX1NJWkUoYnVmLm91dG9iaikpCisgICAgICAgIGlmIChQeVVuaWNvZGVfUmVzaXplKCZidWYub3V0b2JqLCBmaW5hbHNpemUpID09IC0xKQorICAgICAgICAgICAgZ290byBlcnJvcmV4aXQ7CiAKLQlQeV9YREVDUkVGKGNyZXMpOwotCVB5X1hERUNSRUYoYnVmLmV4Y29iaik7Ci0JcmV0dXJuIGJ1Zi5vdXRvYmo7CisgICAgUHlfWERFQ1JFRihjcmVzKTsKKyAgICBQeV9YREVDUkVGKGJ1Zi5leGNvYmopOworICAgIHJldHVybiBidWYub3V0b2JqOwogCiBlcnJvcmV4aXQ6Ci0JUHlfWERFQ1JFRihjcmVzKTsKLQlQeV9YREVDUkVGKGJ1Zi5leGNvYmopOwotCVB5X1hERUNSRUYoYnVmLm91dG9iaik7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlfWERFQ1JFRihjcmVzKTsKKyAgICBQeV9YREVDUkVGKGJ1Zi5leGNvYmopOworICAgIFB5X1hERUNSRUYoYnVmLm91dG9iaik7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBtYnN0cmVhbXJlYWRlcl9yZWFkKE11bHRpYnl0ZVN0cmVhbVJlYWRlck9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKnNpemVvYmogPSBOVUxMOwotCVB5X3NzaXplX3Qgc2l6ZTsKKyAgICBQeU9iamVjdCAqc2l6ZW9iaiA9IE5VTEw7CisgICAgUHlfc3NpemVfdCBzaXplOwogCi0JaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAicmVhZCIsIDAsIDEsICZzaXplb2JqKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAicmVhZCIsIDAsIDEsICZzaXplb2JqKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoc2l6ZW9iaiA9PSBQeV9Ob25lIHx8IHNpemVvYmogPT0gTlVMTCkKLQkJc2l6ZSA9IC0xOwotCWVsc2UgaWYgKFB5SW50X0NoZWNrKHNpemVvYmopKQotCQlzaXplID0gUHlJbnRfQXNTc2l6ZV90KHNpemVvYmopOwotCWVsc2UgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYXJnIDEgbXVzdCBiZSBhbiBpbnRlZ2VyIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoc2l6ZW9iaiA9PSBQeV9Ob25lIHx8IHNpemVvYmogPT0gTlVMTCkKKyAgICAgICAgc2l6ZSA9IC0xOworICAgIGVsc2UgaWYgKFB5SW50X0NoZWNrKHNpemVvYmopKQorICAgICAgICBzaXplID0gUHlJbnRfQXNTc2l6ZV90KHNpemVvYmopOworICAgIGVsc2UgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYXJnIDEgbXVzdCBiZSBhbiBpbnRlZ2VyIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXJldHVybiBtYnN0cmVhbXJlYWRlcl9pcmVhZChzZWxmLCAicmVhZCIsIHNpemUpOworICAgIHJldHVybiBtYnN0cmVhbXJlYWRlcl9pcmVhZChzZWxmLCAicmVhZCIsIHNpemUpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbWJzdHJlYW1yZWFkZXJfcmVhZGxpbmUoTXVsdGlieXRlU3RyZWFtUmVhZGVyT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqc2l6ZW9iaiA9IE5VTEw7Ci0JUHlfc3NpemVfdCBzaXplOworICAgIFB5T2JqZWN0ICpzaXplb2JqID0gTlVMTDsKKyAgICBQeV9zc2l6ZV90IHNpemU7CiAKLQlpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJyZWFkbGluZSIsIDAsIDEsICZzaXplb2JqKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAicmVhZGxpbmUiLCAwLCAxLCAmc2l6ZW9iaikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKHNpemVvYmogPT0gUHlfTm9uZSB8fCBzaXplb2JqID09IE5VTEwpCi0JCXNpemUgPSAtMTsKLQllbHNlIGlmIChQeUludF9DaGVjayhzaXplb2JqKSkKLQkJc2l6ZSA9IFB5SW50X0FzU3NpemVfdChzaXplb2JqKTsKLQllbHNlIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImFyZyAxIG11c3QgYmUgYW4gaW50ZWdlciIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKHNpemVvYmogPT0gUHlfTm9uZSB8fCBzaXplb2JqID09IE5VTEwpCisgICAgICAgIHNpemUgPSAtMTsKKyAgICBlbHNlIGlmIChQeUludF9DaGVjayhzaXplb2JqKSkKKyAgICAgICAgc2l6ZSA9IFB5SW50X0FzU3NpemVfdChzaXplb2JqKTsKKyAgICBlbHNlIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImFyZyAxIG11c3QgYmUgYW4gaW50ZWdlciIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlyZXR1cm4gbWJzdHJlYW1yZWFkZXJfaXJlYWQoc2VsZiwgInJlYWRsaW5lIiwgc2l6ZSk7CisgICAgcmV0dXJuIG1ic3RyZWFtcmVhZGVyX2lyZWFkKHNlbGYsICJyZWFkbGluZSIsIHNpemUpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbWJzdHJlYW1yZWFkZXJfcmVhZGxpbmVzKE11bHRpYnl0ZVN0cmVhbVJlYWRlck9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKnNpemVoaW50b2JqID0gTlVMTCwgKnIsICpzcjsKLQlQeV9zc2l6ZV90IHNpemVoaW50OworICAgIFB5T2JqZWN0ICpzaXplaGludG9iaiA9IE5VTEwsICpyLCAqc3I7CisgICAgUHlfc3NpemVfdCBzaXplaGludDsKIAotCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInJlYWRsaW5lcyIsIDAsIDEsICZzaXplaGludG9iaikpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInJlYWRsaW5lcyIsIDAsIDEsICZzaXplaGludG9iaikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKHNpemVoaW50b2JqID09IFB5X05vbmUgfHwgc2l6ZWhpbnRvYmogPT0gTlVMTCkKLQkJc2l6ZWhpbnQgPSAtMTsKLQllbHNlIGlmIChQeUludF9DaGVjayhzaXplaGludG9iaikpCi0JCXNpemVoaW50ID0gUHlJbnRfQXNTc2l6ZV90KHNpemVoaW50b2JqKTsKLQllbHNlIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImFyZyAxIG11c3QgYmUgYW4gaW50ZWdlciIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKHNpemVoaW50b2JqID09IFB5X05vbmUgfHwgc2l6ZWhpbnRvYmogPT0gTlVMTCkKKyAgICAgICAgc2l6ZWhpbnQgPSAtMTsKKyAgICBlbHNlIGlmIChQeUludF9DaGVjayhzaXplaGludG9iaikpCisgICAgICAgIHNpemVoaW50ID0gUHlJbnRfQXNTc2l6ZV90KHNpemVoaW50b2JqKTsKKyAgICBlbHNlIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImFyZyAxIG11c3QgYmUgYW4gaW50ZWdlciIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlyID0gbWJzdHJlYW1yZWFkZXJfaXJlYWQoc2VsZiwgInJlYWQiLCBzaXplaGludCk7Ci0JaWYgKHIgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgciA9IG1ic3RyZWFtcmVhZGVyX2lyZWFkKHNlbGYsICJyZWFkIiwgc2l6ZWhpbnQpOworICAgIGlmIChyID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0Jc3IgPSBQeVVuaWNvZGVfU3BsaXRsaW5lcyhyLCAxKTsKLQlQeV9ERUNSRUYocik7Ci0JcmV0dXJuIHNyOworICAgIHNyID0gUHlVbmljb2RlX1NwbGl0bGluZXMociwgMSk7CisgICAgUHlfREVDUkVGKHIpOworICAgIHJldHVybiBzcjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG1ic3RyZWFtcmVhZGVyX3Jlc2V0KE11bHRpYnl0ZVN0cmVhbVJlYWRlck9iamVjdCAqc2VsZikKIHsKLQlpZiAoc2VsZi0+Y29kZWMtPmRlY3Jlc2V0ICE9IE5VTEwgJiYKLQkgICAgc2VsZi0+Y29kZWMtPmRlY3Jlc2V0KCZzZWxmLT5zdGF0ZSwgc2VsZi0+Y29kZWMtPmNvbmZpZykgIT0gMCkKLQkJcmV0dXJuIE5VTEw7Ci0Jc2VsZi0+cGVuZGluZ3NpemUgPSAwOworICAgIGlmIChzZWxmLT5jb2RlYy0+ZGVjcmVzZXQgIT0gTlVMTCAmJgorICAgICAgICBzZWxmLT5jb2RlYy0+ZGVjcmVzZXQoJnNlbGYtPnN0YXRlLCBzZWxmLT5jb2RlYy0+Y29uZmlnKSAhPSAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBzZWxmLT5wZW5kaW5nc2l6ZSA9IDA7CiAKLQlQeV9SRVRVUk5fTk9ORTsKKyAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAogc3RhdGljIHN0cnVjdCBQeU1ldGhvZERlZiBtYnN0cmVhbXJlYWRlcl9tZXRob2RzW10gPSB7Ci0JeyJyZWFkIiwJKFB5Q0Z1bmN0aW9uKW1ic3RyZWFtcmVhZGVyX3JlYWQsCi0JCQlNRVRIX1ZBUkFSR1MsIE5VTEx9LAotCXsicmVhZGxpbmUiLAkoUHlDRnVuY3Rpb24pbWJzdHJlYW1yZWFkZXJfcmVhZGxpbmUsCi0JCQlNRVRIX1ZBUkFSR1MsIE5VTEx9LAotCXsicmVhZGxpbmVzIiwJKFB5Q0Z1bmN0aW9uKW1ic3RyZWFtcmVhZGVyX3JlYWRsaW5lcywKLQkJCU1FVEhfVkFSQVJHUywgTlVMTH0sCi0JeyJyZXNldCIsCShQeUNGdW5jdGlvbiltYnN0cmVhbXJlYWRlcl9yZXNldCwKLQkJCU1FVEhfTk9BUkdTLCBOVUxMfSwKLQl7TlVMTCwJCU5VTEx9LAorICAgIHsicmVhZCIsICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKW1ic3RyZWFtcmVhZGVyX3JlYWQsCisgICAgICAgICAgICAgICAgICAgIE1FVEhfVkFSQVJHUywgTlVMTH0sCisgICAgeyJyZWFkbGluZSIsICAgICAgICAoUHlDRnVuY3Rpb24pbWJzdHJlYW1yZWFkZXJfcmVhZGxpbmUsCisgICAgICAgICAgICAgICAgICAgIE1FVEhfVkFSQVJHUywgTlVMTH0sCisgICAgeyJyZWFkbGluZXMiLCAgICAgICAoUHlDRnVuY3Rpb24pbWJzdHJlYW1yZWFkZXJfcmVhZGxpbmVzLAorICAgICAgICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1MsIE5VTEx9LAorICAgIHsicmVzZXQiLCAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKW1ic3RyZWFtcmVhZGVyX3Jlc2V0LAorICAgICAgICAgICAgICAgICAgICBNRVRIX05PQVJHUywgTlVMTH0sCisgICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSwKIH07CiAKIHN0YXRpYyBQeU1lbWJlckRlZiBtYnN0cmVhbXJlYWRlcl9tZW1iZXJzW10gPSB7Ci0JeyJzdHJlYW0iLAlUX09CSkVDVCwKLQkJCW9mZnNldG9mKE11bHRpYnl0ZVN0cmVhbVJlYWRlck9iamVjdCwgc3RyZWFtKSwKLQkJCVJFQURPTkxZLCBOVUxMfSwKLQl7TlVMTCx9CisgICAgeyJzdHJlYW0iLCAgICAgICAgICBUX09CSkVDVCwKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0b2YoTXVsdGlieXRlU3RyZWFtUmVhZGVyT2JqZWN0LCBzdHJlYW0pLAorICAgICAgICAgICAgICAgICAgICBSRUFET05MWSwgTlVMTH0sCisgICAge05VTEwsfQogfTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIG1ic3RyZWFtcmVhZGVyX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlNdWx0aWJ5dGVTdHJlYW1SZWFkZXJPYmplY3QgKnNlbGY7Ci0JUHlPYmplY3QgKnN0cmVhbSwgKmNvZGVjID0gTlVMTDsKLQljaGFyICplcnJvcnMgPSBOVUxMOworICAgIE11bHRpYnl0ZVN0cmVhbVJlYWRlck9iamVjdCAqc2VsZjsKKyAgICBQeU9iamVjdCAqc3RyZWFtLCAqY29kZWMgPSBOVUxMOworICAgIGNoYXIgKmVycm9ycyA9IE5VTEw7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAiT3xzOlN0cmVhbVJlYWRlciIsCi0JCQkJc3RyZWFta3dhcmdsaXN0LCAmc3RyZWFtLCAmZXJyb3JzKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgIk98czpTdHJlYW1SZWFkZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbWt3YXJnbGlzdCwgJnN0cmVhbSwgJmVycm9ycykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0Jc2VsZiA9IChNdWx0aWJ5dGVTdHJlYW1SZWFkZXJPYmplY3QgKil0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKLQlpZiAoc2VsZiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBzZWxmID0gKE11bHRpYnl0ZVN0cmVhbVJlYWRlck9iamVjdCAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOworICAgIGlmIChzZWxmID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JY29kZWMgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKChQeU9iamVjdCAqKXR5cGUsICJjb2RlYyIpOwotCWlmIChjb2RlYyA9PSBOVUxMKQotCQlnb3RvIGVycm9yZXhpdDsKLQlpZiAoIU11bHRpYnl0ZUNvZGVjX0NoZWNrKGNvZGVjKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiY29kZWMgaXMgdW5leHBlY3RlZCB0eXBlIik7Ci0JCWdvdG8gZXJyb3JleGl0OwotCX0KKyAgICBjb2RlYyA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoKFB5T2JqZWN0ICopdHlwZSwgImNvZGVjIik7CisgICAgaWYgKGNvZGVjID09IE5VTEwpCisgICAgICAgIGdvdG8gZXJyb3JleGl0OworICAgIGlmICghTXVsdGlieXRlQ29kZWNfQ2hlY2soY29kZWMpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJjb2RlYyBpcyB1bmV4cGVjdGVkIHR5cGUiKTsKKyAgICAgICAgZ290byBlcnJvcmV4aXQ7CisgICAgfQogCi0Jc2VsZi0+Y29kZWMgPSAoKE11bHRpYnl0ZUNvZGVjT2JqZWN0ICopY29kZWMpLT5jb2RlYzsKLQlzZWxmLT5zdHJlYW0gPSBzdHJlYW07Ci0JUHlfSU5DUkVGKHN0cmVhbSk7Ci0Jc2VsZi0+cGVuZGluZ3NpemUgPSAwOwotCXNlbGYtPmVycm9ycyA9IGludGVybmFsX2Vycm9yX2NhbGxiYWNrKGVycm9ycyk7Ci0JaWYgKHNlbGYtPmVycm9ycyA9PSBOVUxMKQotCQlnb3RvIGVycm9yZXhpdDsKLQlpZiAoc2VsZi0+Y29kZWMtPmRlY2luaXQgIT0gTlVMTCAmJgotCSAgICBzZWxmLT5jb2RlYy0+ZGVjaW5pdCgmc2VsZi0+c3RhdGUsIHNlbGYtPmNvZGVjLT5jb25maWcpICE9IDApCi0JCWdvdG8gZXJyb3JleGl0OworICAgIHNlbGYtPmNvZGVjID0gKChNdWx0aWJ5dGVDb2RlY09iamVjdCAqKWNvZGVjKS0+Y29kZWM7CisgICAgc2VsZi0+c3RyZWFtID0gc3RyZWFtOworICAgIFB5X0lOQ1JFRihzdHJlYW0pOworICAgIHNlbGYtPnBlbmRpbmdzaXplID0gMDsKKyAgICBzZWxmLT5lcnJvcnMgPSBpbnRlcm5hbF9lcnJvcl9jYWxsYmFjayhlcnJvcnMpOworICAgIGlmIChzZWxmLT5lcnJvcnMgPT0gTlVMTCkKKyAgICAgICAgZ290byBlcnJvcmV4aXQ7CisgICAgaWYgKHNlbGYtPmNvZGVjLT5kZWNpbml0ICE9IE5VTEwgJiYKKyAgICAgICAgc2VsZi0+Y29kZWMtPmRlY2luaXQoJnNlbGYtPnN0YXRlLCBzZWxmLT5jb2RlYy0+Y29uZmlnKSAhPSAwKQorICAgICAgICBnb3RvIGVycm9yZXhpdDsKIAotCVB5X0RFQ1JFRihjb2RlYyk7Ci0JcmV0dXJuIChQeU9iamVjdCAqKXNlbGY7CisgICAgUHlfREVDUkVGKGNvZGVjKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKIAogZXJyb3JleGl0OgotCVB5X1hERUNSRUYoc2VsZik7Ci0JUHlfWERFQ1JFRihjb2RlYyk7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlfWERFQ1JFRihzZWxmKTsKKyAgICBQeV9YREVDUkVGKGNvZGVjKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIGludAogbWJzdHJlYW1yZWFkZXJfaW5pdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCXJldHVybiAwOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBtYnN0cmVhbXJlYWRlcl90cmF2ZXJzZShNdWx0aWJ5dGVTdHJlYW1SZWFkZXJPYmplY3QgKnNlbGYsCi0JCQl2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKKyAgICAgICAgICAgICAgICAgICAgICAgIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotCWlmIChFUlJPUl9JU0NVU1RPTShzZWxmLT5lcnJvcnMpKQotCQlQeV9WSVNJVChzZWxmLT5lcnJvcnMpOwotCVB5X1ZJU0lUKHNlbGYtPnN0cmVhbSk7Ci0JcmV0dXJuIDA7CisgICAgaWYgKEVSUk9SX0lTQ1VTVE9NKHNlbGYtPmVycm9ycykpCisgICAgICAgIFB5X1ZJU0lUKHNlbGYtPmVycm9ycyk7CisgICAgUHlfVklTSVQoc2VsZi0+c3RyZWFtKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQKIG1ic3RyZWFtcmVhZGVyX2RlYWxsb2MoTXVsdGlieXRlU3RyZWFtUmVhZGVyT2JqZWN0ICpzZWxmKQogewotCVB5T2JqZWN0X0dDX1VuVHJhY2soc2VsZik7Ci0JRVJST1JfREVDUkVGKHNlbGYtPmVycm9ycyk7Ci0JUHlfWERFQ1JFRihzZWxmLT5zdHJlYW0pOwotCVB5X1RZUEUoc2VsZiktPnRwX2ZyZWUoc2VsZik7CisgICAgUHlPYmplY3RfR0NfVW5UcmFjayhzZWxmKTsKKyAgICBFUlJPUl9ERUNSRUYoc2VsZi0+ZXJyb3JzKTsKKyAgICBQeV9YREVDUkVGKHNlbGYtPnN0cmVhbSk7CisgICAgUHlfVFlQRShzZWxmKS0+dHBfZnJlZShzZWxmKTsKIH0KIAogc3RhdGljIFB5VHlwZU9iamVjdCBNdWx0aWJ5dGVTdHJlYW1SZWFkZXJfVHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKLQkiTXVsdGlieXRlU3RyZWFtUmVhZGVyIiwJLyogdHBfbmFtZSAqLwotCXNpemVvZihNdWx0aWJ5dGVTdHJlYW1SZWFkZXJPYmplY3QpLCAvKiB0cF9iYXNpY3NpemUgKi8KLQkwLAkJCQkvKiB0cF9pdGVtc2l6ZSAqLwotCS8qICBtZXRob2RzICAqLwotCShkZXN0cnVjdG9yKW1ic3RyZWFtcmVhZGVyX2RlYWxsb2MsIC8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJLyogdHBfY29tcGFyZSAqLwotCTAsCQkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJLyogdHBfY2FsbCAqLwotCTAsCQkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDCi0JCXwgUHlfVFBGTEFHU19CQVNFVFlQRSwJLyogdHBfZmxhZ3MgKi8KLQkwLAkJCQkvKiB0cF9kb2MgKi8KLQkodHJhdmVyc2Vwcm9jKW1ic3RyZWFtcmVhZGVyX3RyYXZlcnNlLAkvKiB0cF90cmF2ZXJzZSAqLwotCTAsCQkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCTAsCQkJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkvKiB0cF9pdGVyZXh0ICovCi0JbWJzdHJlYW1yZWFkZXJfbWV0aG9kcywJCS8qIHRwX21ldGhvZHMgKi8KLQltYnN0cmVhbXJlYWRlcl9tZW1iZXJzLAkJLyogdHBfbWVtYmVycyAqLwotCWNvZGVjY3R4X2dldHNldHMsCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQltYnN0cmVhbXJlYWRlcl9pbml0LAkJLyogdHBfaW5pdCAqLwotCTAsCQkJCS8qIHRwX2FsbG9jICovCi0JbWJzdHJlYW1yZWFkZXJfbmV3LAkJLyogdHBfbmV3ICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisgICAgIk11bHRpYnl0ZVN0cmVhbVJlYWRlciIsICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgIHNpemVvZihNdWx0aWJ5dGVTdHJlYW1SZWFkZXJPYmplY3QpLCAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIC8qICBtZXRob2RzICAqLworICAgIChkZXN0cnVjdG9yKW1ic3RyZWFtcmVhZGVyX2RlYWxsb2MsIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MKKyAgICAgICAgfCBQeV9UUEZMQUdTX0JBU0VUWVBFLCAgICAgICAgICAvKiB0cF9mbGFncyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2MpbWJzdHJlYW1yZWFkZXJfdHJhdmVyc2UsICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcmV4dCAqLworICAgIG1ic3RyZWFtcmVhZGVyX21ldGhvZHMsICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICBtYnN0cmVhbXJlYWRlcl9tZW1iZXJzLCAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgY29kZWNjdHhfZ2V0c2V0cywgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgbWJzdHJlYW1yZWFkZXJfaW5pdCwgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgbWJzdHJlYW1yZWFkZXJfbmV3LCAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCiB9OwogCiAKQEAgLTE1NTEsMjE2ICsxNTUxLDIxNiBAQAogCiBzdGF0aWMgaW50CiBtYnN0cmVhbXdyaXRlcl9pd3JpdGUoTXVsdGlieXRlU3RyZWFtV3JpdGVyT2JqZWN0ICpzZWxmLAotCQkgICAgICBQeU9iamVjdCAqdW5pc3RyKQorICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICp1bmlzdHIpCiB7Ci0JUHlPYmplY3QgKnN0ciwgKndyOworICAgIFB5T2JqZWN0ICpzdHIsICp3cjsKIAotCXN0ciA9IGVuY29kZXJfZW5jb2RlX3N0YXRlZnVsKFNUQVRFRlVMX0VDVFgoc2VsZiksIHVuaXN0ciwgMCk7Ci0JaWYgKHN0ciA9PSBOVUxMKQotCQlyZXR1cm4gLTE7CisgICAgc3RyID0gZW5jb2Rlcl9lbmNvZGVfc3RhdGVmdWwoU1RBVEVGVUxfRUNUWChzZWxmKSwgdW5pc3RyLCAwKTsKKyAgICBpZiAoc3RyID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKIAotCXdyID0gUHlPYmplY3RfQ2FsbE1ldGhvZChzZWxmLT5zdHJlYW0sICJ3cml0ZSIsICJPIiwgc3RyKTsKLQlQeV9ERUNSRUYoc3RyKTsKLQlpZiAod3IgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOworICAgIHdyID0gUHlPYmplY3RfQ2FsbE1ldGhvZChzZWxmLT5zdHJlYW0sICJ3cml0ZSIsICJPIiwgc3RyKTsKKyAgICBQeV9ERUNSRUYoc3RyKTsKKyAgICBpZiAod3IgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0JUHlfREVDUkVGKHdyKTsKLQlyZXR1cm4gMDsKKyAgICBQeV9ERUNSRUYod3IpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbWJzdHJlYW13cml0ZXJfd3JpdGUoTXVsdGlieXRlU3RyZWFtV3JpdGVyT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqc3Ryb2JqKQogewotCWlmIChtYnN0cmVhbXdyaXRlcl9pd3JpdGUoc2VsZiwgc3Ryb2JqKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZWxzZQotCQlQeV9SRVRVUk5fTk9ORTsKKyAgICBpZiAobWJzdHJlYW13cml0ZXJfaXdyaXRlKHNlbGYsIHN0cm9iaikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGVsc2UKKyAgICAgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBtYnN0cmVhbXdyaXRlcl93cml0ZWxpbmVzKE11bHRpYnl0ZVN0cmVhbVdyaXRlck9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmxpbmVzKQogewotCVB5T2JqZWN0ICpzdHJvYmo7Ci0JaW50IGksIHI7CisgICAgUHlPYmplY3QgKnN0cm9iajsKKyAgICBpbnQgaSwgcjsKIAotCWlmICghUHlTZXF1ZW5jZV9DaGVjayhsaW5lcykpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiYXJnIG11c3QgYmUgYSBzZXF1ZW5jZSBvYmplY3QiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICghUHlTZXF1ZW5jZV9DaGVjayhsaW5lcykpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJhcmcgbXVzdCBiZSBhIHNlcXVlbmNlIG9iamVjdCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlmb3IgKGkgPSAwOyBpIDwgUHlTZXF1ZW5jZV9MZW5ndGgobGluZXMpOyBpKyspIHsKLQkJLyogbGVuZ3RoIGNhbiBiZSBjaGFuZ2VkIGV2ZW4gd2l0aGluIHRoaXMgbG9vcCAqLwotCQlzdHJvYmogPSBQeVNlcXVlbmNlX0dldEl0ZW0obGluZXMsIGkpOwotCQlpZiAoc3Ryb2JqID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgUHlTZXF1ZW5jZV9MZW5ndGgobGluZXMpOyBpKyspIHsKKyAgICAgICAgLyogbGVuZ3RoIGNhbiBiZSBjaGFuZ2VkIGV2ZW4gd2l0aGluIHRoaXMgbG9vcCAqLworICAgICAgICBzdHJvYmogPSBQeVNlcXVlbmNlX0dldEl0ZW0obGluZXMsIGkpOworICAgICAgICBpZiAoc3Ryb2JqID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKIAotCQlyID0gbWJzdHJlYW13cml0ZXJfaXdyaXRlKHNlbGYsIHN0cm9iaik7Ci0JCVB5X0RFQ1JFRihzdHJvYmopOwotCQlpZiAociA9PSAtMSkKLQkJCXJldHVybiBOVUxMOwotCX0KKyAgICAgICAgciA9IG1ic3RyZWFtd3JpdGVyX2l3cml0ZShzZWxmLCBzdHJvYmopOworICAgICAgICBQeV9ERUNSRUYoc3Ryb2JqKTsKKyAgICAgICAgaWYgKHIgPT0gLTEpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlQeV9SRVRVUk5fTk9ORTsKKyAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG1ic3RyZWFtd3JpdGVyX3Jlc2V0KE11bHRpYnl0ZVN0cmVhbVdyaXRlck9iamVjdCAqc2VsZikKIHsKLQljb25zdCBQeV9VTklDT0RFICpwZW5kaW5nOwotCVB5T2JqZWN0ICpwd3J0OworICAgIGNvbnN0IFB5X1VOSUNPREUgKnBlbmRpbmc7CisgICAgUHlPYmplY3QgKnB3cnQ7CiAKLQlwZW5kaW5nID0gc2VsZi0+cGVuZGluZzsKLQlwd3J0ID0gbXVsdGlieXRlY29kZWNfZW5jb2RlKHNlbGYtPmNvZGVjLCAmc2VsZi0+c3RhdGUsCi0JCQkmcGVuZGluZywgc2VsZi0+cGVuZGluZ3NpemUsIHNlbGYtPmVycm9ycywKLQkJCU1CRU5DX0ZMVVNIIHwgTUJFTkNfUkVTRVQpOwotCS8qIHNvbWUgcGVuZGluZyBidWZmZXIgY2FuIGJlIHRydW5jYXRlZCB3aGVuIFVuaWNvZGVFbmNvZGVFcnJvciBpcwotCSAqIHJhaXNlZCBvbiAnc3RyaWN0JyBtb2RlLiBidXQsICdyZXNldCcgbWV0aG9kIGlzIGRlc2lnbmVkIHRvCi0JICogcmVzZXQgdGhlIHBlbmRpbmcgYnVmZmVyIG9yIHN0YXRlcyBzbyBmYWlsZWQgc3RyaW5nIHNlcXVlbmNlCi0JICogb3VnaHQgdG8gYmUgbWlzc2VkICovCi0Jc2VsZi0+cGVuZGluZ3NpemUgPSAwOwotCWlmIChwd3J0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIHBlbmRpbmcgPSBzZWxmLT5wZW5kaW5nOworICAgIHB3cnQgPSBtdWx0aWJ5dGVjb2RlY19lbmNvZGUoc2VsZi0+Y29kZWMsICZzZWxmLT5zdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgJnBlbmRpbmcsIHNlbGYtPnBlbmRpbmdzaXplLCBzZWxmLT5lcnJvcnMsCisgICAgICAgICAgICAgICAgICAgIE1CRU5DX0ZMVVNIIHwgTUJFTkNfUkVTRVQpOworICAgIC8qIHNvbWUgcGVuZGluZyBidWZmZXIgY2FuIGJlIHRydW5jYXRlZCB3aGVuIFVuaWNvZGVFbmNvZGVFcnJvciBpcworICAgICAqIHJhaXNlZCBvbiAnc3RyaWN0JyBtb2RlLiBidXQsICdyZXNldCcgbWV0aG9kIGlzIGRlc2lnbmVkIHRvCisgICAgICogcmVzZXQgdGhlIHBlbmRpbmcgYnVmZmVyIG9yIHN0YXRlcyBzbyBmYWlsZWQgc3RyaW5nIHNlcXVlbmNlCisgICAgICogb3VnaHQgdG8gYmUgbWlzc2VkICovCisgICAgc2VsZi0+cGVuZGluZ3NpemUgPSAwOworICAgIGlmIChwd3J0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKFB5U3RyaW5nX1NpemUocHdydCkgPiAwKSB7Ci0JCVB5T2JqZWN0ICp3cjsKLQkJd3IgPSBQeU9iamVjdF9DYWxsTWV0aG9kKHNlbGYtPnN0cmVhbSwgIndyaXRlIiwgIk8iLCBwd3J0KTsKLQkJaWYgKHdyID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRihwd3J0KTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQotCVB5X0RFQ1JFRihwd3J0KTsKKyAgICBpZiAoUHlTdHJpbmdfU2l6ZShwd3J0KSA+IDApIHsKKyAgICAgICAgUHlPYmplY3QgKndyOworICAgICAgICB3ciA9IFB5T2JqZWN0X0NhbGxNZXRob2Qoc2VsZi0+c3RyZWFtLCAid3JpdGUiLCAiTyIsIHB3cnQpOworICAgICAgICBpZiAod3IgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKHB3cnQpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgUHlfREVDUkVGKHB3cnQpOwogCi0JUHlfUkVUVVJOX05PTkU7CisgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBtYnN0cmVhbXdyaXRlcl9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JTXVsdGlieXRlU3RyZWFtV3JpdGVyT2JqZWN0ICpzZWxmOwotCVB5T2JqZWN0ICpzdHJlYW0sICpjb2RlYyA9IE5VTEw7Ci0JY2hhciAqZXJyb3JzID0gTlVMTDsKKyAgICBNdWx0aWJ5dGVTdHJlYW1Xcml0ZXJPYmplY3QgKnNlbGY7CisgICAgUHlPYmplY3QgKnN0cmVhbSwgKmNvZGVjID0gTlVMTDsKKyAgICBjaGFyICplcnJvcnMgPSBOVUxMOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgIk98czpTdHJlYW1Xcml0ZXIiLAotCQkJCXN0cmVhbWt3YXJnbGlzdCwgJnN0cmVhbSwgJmVycm9ycykpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJPfHM6U3RyZWFtV3JpdGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1rd2FyZ2xpc3QsICZzdHJlYW0sICZlcnJvcnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXNlbGYgPSAoTXVsdGlieXRlU3RyZWFtV3JpdGVyT2JqZWN0ICopdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7Ci0JaWYgKHNlbGYgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgc2VsZiA9IChNdWx0aWJ5dGVTdHJlYW1Xcml0ZXJPYmplY3QgKil0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKKyAgICBpZiAoc2VsZiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWNvZGVjID0gUHlPYmplY3RfR2V0QXR0clN0cmluZygoUHlPYmplY3QgKil0eXBlLCAiY29kZWMiKTsKLQlpZiAoY29kZWMgPT0gTlVMTCkKLQkJZ290byBlcnJvcmV4aXQ7Ci0JaWYgKCFNdWx0aWJ5dGVDb2RlY19DaGVjayhjb2RlYykpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImNvZGVjIGlzIHVuZXhwZWN0ZWQgdHlwZSIpOwotCQlnb3RvIGVycm9yZXhpdDsKLQl9CisgICAgY29kZWMgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKChQeU9iamVjdCAqKXR5cGUsICJjb2RlYyIpOworICAgIGlmIChjb2RlYyA9PSBOVUxMKQorICAgICAgICBnb3RvIGVycm9yZXhpdDsKKyAgICBpZiAoIU11bHRpYnl0ZUNvZGVjX0NoZWNrKGNvZGVjKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiY29kZWMgaXMgdW5leHBlY3RlZCB0eXBlIik7CisgICAgICAgIGdvdG8gZXJyb3JleGl0OworICAgIH0KIAotCXNlbGYtPmNvZGVjID0gKChNdWx0aWJ5dGVDb2RlY09iamVjdCAqKWNvZGVjKS0+Y29kZWM7Ci0Jc2VsZi0+c3RyZWFtID0gc3RyZWFtOwotCVB5X0lOQ1JFRihzdHJlYW0pOwotCXNlbGYtPnBlbmRpbmdzaXplID0gMDsKLQlzZWxmLT5lcnJvcnMgPSBpbnRlcm5hbF9lcnJvcl9jYWxsYmFjayhlcnJvcnMpOwotCWlmIChzZWxmLT5lcnJvcnMgPT0gTlVMTCkKLQkJZ290byBlcnJvcmV4aXQ7Ci0JaWYgKHNlbGYtPmNvZGVjLT5lbmNpbml0ICE9IE5VTEwgJiYKLQkgICAgc2VsZi0+Y29kZWMtPmVuY2luaXQoJnNlbGYtPnN0YXRlLCBzZWxmLT5jb2RlYy0+Y29uZmlnKSAhPSAwKQotCQlnb3RvIGVycm9yZXhpdDsKKyAgICBzZWxmLT5jb2RlYyA9ICgoTXVsdGlieXRlQ29kZWNPYmplY3QgKiljb2RlYyktPmNvZGVjOworICAgIHNlbGYtPnN0cmVhbSA9IHN0cmVhbTsKKyAgICBQeV9JTkNSRUYoc3RyZWFtKTsKKyAgICBzZWxmLT5wZW5kaW5nc2l6ZSA9IDA7CisgICAgc2VsZi0+ZXJyb3JzID0gaW50ZXJuYWxfZXJyb3JfY2FsbGJhY2soZXJyb3JzKTsKKyAgICBpZiAoc2VsZi0+ZXJyb3JzID09IE5VTEwpCisgICAgICAgIGdvdG8gZXJyb3JleGl0OworICAgIGlmIChzZWxmLT5jb2RlYy0+ZW5jaW5pdCAhPSBOVUxMICYmCisgICAgICAgIHNlbGYtPmNvZGVjLT5lbmNpbml0KCZzZWxmLT5zdGF0ZSwgc2VsZi0+Y29kZWMtPmNvbmZpZykgIT0gMCkKKyAgICAgICAgZ290byBlcnJvcmV4aXQ7CiAKLQlQeV9ERUNSRUYoY29kZWMpOwotCXJldHVybiAoUHlPYmplY3QgKilzZWxmOworICAgIFB5X0RFQ1JFRihjb2RlYyk7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKXNlbGY7CiAKIGVycm9yZXhpdDoKLQlQeV9YREVDUkVGKHNlbGYpOwotCVB5X1hERUNSRUYoY29kZWMpOwotCXJldHVybiBOVUxMOworICAgIFB5X1hERUNSRUYoc2VsZik7CisgICAgUHlfWERFQ1JFRihjb2RlYyk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBpbnQKIG1ic3RyZWFtd3JpdGVyX2luaXQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogbWJzdHJlYW13cml0ZXJfdHJhdmVyc2UoTXVsdGlieXRlU3RyZWFtV3JpdGVyT2JqZWN0ICpzZWxmLAotCQkJdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCisgICAgICAgICAgICAgICAgICAgICAgICB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlpZiAoRVJST1JfSVNDVVNUT00oc2VsZi0+ZXJyb3JzKSkKLQkJUHlfVklTSVQoc2VsZi0+ZXJyb3JzKTsKLQlQeV9WSVNJVChzZWxmLT5zdHJlYW0pOwotCXJldHVybiAwOworICAgIGlmIChFUlJPUl9JU0NVU1RPTShzZWxmLT5lcnJvcnMpKQorICAgICAgICBQeV9WSVNJVChzZWxmLT5lcnJvcnMpOworICAgIFB5X1ZJU0lUKHNlbGYtPnN0cmVhbSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkCiBtYnN0cmVhbXdyaXRlcl9kZWFsbG9jKE11bHRpYnl0ZVN0cmVhbVdyaXRlck9iamVjdCAqc2VsZikKIHsKLQlQeU9iamVjdF9HQ19VblRyYWNrKHNlbGYpOwotCUVSUk9SX0RFQ1JFRihzZWxmLT5lcnJvcnMpOwotCVB5X1hERUNSRUYoc2VsZi0+c3RyZWFtKTsKLQlQeV9UWVBFKHNlbGYpLT50cF9mcmVlKHNlbGYpOworICAgIFB5T2JqZWN0X0dDX1VuVHJhY2soc2VsZik7CisgICAgRVJST1JfREVDUkVGKHNlbGYtPmVycm9ycyk7CisgICAgUHlfWERFQ1JFRihzZWxmLT5zdHJlYW0pOworICAgIFB5X1RZUEUoc2VsZiktPnRwX2ZyZWUoc2VsZik7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgUHlNZXRob2REZWYgbWJzdHJlYW13cml0ZXJfbWV0aG9kc1tdID0gewotCXsid3JpdGUiLAkoUHlDRnVuY3Rpb24pbWJzdHJlYW13cml0ZXJfd3JpdGUsCi0JCQlNRVRIX08sIE5VTEx9LAotCXsid3JpdGVsaW5lcyIsCShQeUNGdW5jdGlvbiltYnN0cmVhbXdyaXRlcl93cml0ZWxpbmVzLAotCQkJTUVUSF9PLCBOVUxMfSwKLQl7InJlc2V0IiwJKFB5Q0Z1bmN0aW9uKW1ic3RyZWFtd3JpdGVyX3Jlc2V0LAotCQkJTUVUSF9OT0FSR1MsIE5VTEx9LAotCXtOVUxMLAkJTlVMTH0sCisgICAgeyJ3cml0ZSIsICAgICAgICAgICAoUHlDRnVuY3Rpb24pbWJzdHJlYW13cml0ZXJfd3JpdGUsCisgICAgICAgICAgICAgICAgICAgIE1FVEhfTywgTlVMTH0sCisgICAgeyJ3cml0ZWxpbmVzIiwgICAgICAoUHlDRnVuY3Rpb24pbWJzdHJlYW13cml0ZXJfd3JpdGVsaW5lcywKKyAgICAgICAgICAgICAgICAgICAgTUVUSF9PLCBOVUxMfSwKKyAgICB7InJlc2V0IiwgICAgICAgICAgIChQeUNGdW5jdGlvbiltYnN0cmVhbXdyaXRlcl9yZXNldCwKKyAgICAgICAgICAgICAgICAgICAgTUVUSF9OT0FSR1MsIE5VTEx9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0sCiB9OwogCiBzdGF0aWMgUHlNZW1iZXJEZWYgbWJzdHJlYW13cml0ZXJfbWVtYmVyc1tdID0gewotCXsic3RyZWFtIiwJVF9PQkpFQ1QsCi0JCQlvZmZzZXRvZihNdWx0aWJ5dGVTdHJlYW1Xcml0ZXJPYmplY3QsIHN0cmVhbSksCi0JCQlSRUFET05MWSwgTlVMTH0sCi0Je05VTEwsfQorICAgIHsic3RyZWFtIiwgICAgICAgICAgVF9PQkpFQ1QsCisgICAgICAgICAgICAgICAgICAgIG9mZnNldG9mKE11bHRpYnl0ZVN0cmVhbVdyaXRlck9iamVjdCwgc3RyZWFtKSwKKyAgICAgICAgICAgICAgICAgICAgUkVBRE9OTFksIE5VTEx9LAorICAgIHtOVUxMLH0KIH07CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgTXVsdGlieXRlU3RyZWFtV3JpdGVyX1R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JIk11bHRpYnl0ZVN0cmVhbVdyaXRlciIsCS8qIHRwX25hbWUgKi8KLQlzaXplb2YoTXVsdGlieXRlU3RyZWFtV3JpdGVyT2JqZWN0KSwgLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkvKiAgbWV0aG9kcyAgKi8KLQkoZGVzdHJ1Y3RvciltYnN0cmVhbXdyaXRlcl9kZWFsbG9jLCAvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkwLAkJCQkvKiB0cF9yZXByICovCi0JMCwJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkvKiB0cF9zdHIgKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQwotCQl8IFB5X1RQRkxBR1NfQkFTRVRZUEUsCS8qIHRwX2ZsYWdzICovCi0JMCwJCQkJLyogdHBfZG9jICovCi0JKHRyYXZlcnNlcHJvYyltYnN0cmVhbXdyaXRlcl90cmF2ZXJzZSwJLyogdHBfdHJhdmVyc2UgKi8KLQkwLAkJCQkvKiB0cF9jbGVhciAqLwotCTAsCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQkwLAkJCQkvKiB0cF9pdGVyICovCi0JMCwJCQkJLyogdHBfaXRlcmV4dCAqLwotCW1ic3RyZWFtd3JpdGVyX21ldGhvZHMsCQkvKiB0cF9tZXRob2RzICovCi0JbWJzdHJlYW13cml0ZXJfbWVtYmVycywJCS8qIHRwX21lbWJlcnMgKi8KLQljb2RlY2N0eF9nZXRzZXRzLAkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCS8qIHRwX2RpY3QgKi8KLQkwLAkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KLQkwLAkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCi0JbWJzdHJlYW13cml0ZXJfaW5pdCwJCS8qIHRwX2luaXQgKi8KLQkwLAkJCQkvKiB0cF9hbGxvYyAqLwotCW1ic3RyZWFtd3JpdGVyX25ldywJCS8qIHRwX25ldyAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQorICAgICJNdWx0aWJ5dGVTdHJlYW1Xcml0ZXIiLCAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICBzaXplb2YoTXVsdGlieXRlU3RyZWFtV3JpdGVyT2JqZWN0KSwgLyogdHBfYmFzaWNzaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAvKiAgbWV0aG9kcyAgKi8KKyAgICAoZGVzdHJ1Y3RvciltYnN0cmVhbXdyaXRlcl9kZWFsbG9jLCAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDCisgICAgICAgIHwgUHlfVFBGTEFHU19CQVNFVFlQRSwgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAodHJhdmVyc2Vwcm9jKW1ic3RyZWFtd3JpdGVyX3RyYXZlcnNlLCAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJleHQgKi8KKyAgICBtYnN0cmVhbXdyaXRlcl9tZXRob2RzLCAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgbWJzdHJlYW13cml0ZXJfbWVtYmVycywgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIGNvZGVjY3R4X2dldHNldHMsICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIG1ic3RyZWFtd3JpdGVyX2luaXQsICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIG1ic3RyZWFtd3JpdGVyX25ldywgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLwogfTsKIAogCkBAIC0xNzcxLDU5ICsxNzcxLDU5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogX19jcmVhdGVfY29kZWMoUHlPYmplY3QgKmlnbm9yZSwgUHlPYmplY3QgKmFyZykKIHsKLQlNdWx0aWJ5dGVDb2RlY09iamVjdCAqc2VsZjsKLQlNdWx0aWJ5dGVDb2RlYyAqY29kZWM7CisgICAgTXVsdGlieXRlQ29kZWNPYmplY3QgKnNlbGY7CisgICAgTXVsdGlieXRlQ29kZWMgKmNvZGVjOwogCi0JaWYgKCFQeUNPYmplY3RfQ2hlY2soYXJnKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImFyZ3VtZW50IHR5cGUgaW52YWxpZCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKCFQeUNPYmplY3RfQ2hlY2soYXJnKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImFyZ3VtZW50IHR5cGUgaW52YWxpZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQljb2RlYyA9IFB5Q09iamVjdF9Bc1ZvaWRQdHIoYXJnKTsKLQlpZiAoY29kZWMtPmNvZGVjaW5pdCAhPSBOVUxMICYmIGNvZGVjLT5jb2RlY2luaXQoY29kZWMtPmNvbmZpZykgIT0gMCkKLQkJcmV0dXJuIE5VTEw7CisgICAgY29kZWMgPSBQeUNPYmplY3RfQXNWb2lkUHRyKGFyZyk7CisgICAgaWYgKGNvZGVjLT5jb2RlY2luaXQgIT0gTlVMTCAmJiBjb2RlYy0+Y29kZWNpbml0KGNvZGVjLT5jb25maWcpICE9IDApCisgICAgICAgIHJldHVybiBOVUxMOwogCi0Jc2VsZiA9IFB5T2JqZWN0X05ldyhNdWx0aWJ5dGVDb2RlY09iamVjdCwgJk11bHRpYnl0ZUNvZGVjX1R5cGUpOwotCWlmIChzZWxmID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXNlbGYtPmNvZGVjID0gY29kZWM7CisgICAgc2VsZiA9IFB5T2JqZWN0X05ldyhNdWx0aWJ5dGVDb2RlY09iamVjdCwgJk11bHRpYnl0ZUNvZGVjX1R5cGUpOworICAgIGlmIChzZWxmID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHNlbGYtPmNvZGVjID0gY29kZWM7CiAKLQlyZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKIH0KIAogc3RhdGljIHN0cnVjdCBQeU1ldGhvZERlZiBfX21ldGhvZHNbXSA9IHsKLQl7Il9fY3JlYXRlX2NvZGVjIiwgKFB5Q0Z1bmN0aW9uKV9fY3JlYXRlX2NvZGVjLCBNRVRIX099LAotCXtOVUxMLCBOVUxMfSwKKyAgICB7Il9fY3JlYXRlX2NvZGVjIiwgKFB5Q0Z1bmN0aW9uKV9fY3JlYXRlX2NvZGVjLCBNRVRIX099LAorICAgIHtOVUxMLCBOVUxMfSwKIH07CiAKIFB5TU9ESU5JVF9GVU5DCiBpbml0X211bHRpYnl0ZWNvZGVjKHZvaWQpCiB7Ci0JaW50IGk7Ci0JUHlPYmplY3QgKm07Ci0JUHlUeXBlT2JqZWN0ICp0eXBlbGlzdFtdID0gewotCQkmTXVsdGlieXRlSW5jcmVtZW50YWxFbmNvZGVyX1R5cGUsCi0JCSZNdWx0aWJ5dGVJbmNyZW1lbnRhbERlY29kZXJfVHlwZSwKLQkJJk11bHRpYnl0ZVN0cmVhbVJlYWRlcl9UeXBlLAotCQkmTXVsdGlieXRlU3RyZWFtV3JpdGVyX1R5cGUsCi0JCU5VTEwKLQl9OworICAgIGludCBpOworICAgIFB5T2JqZWN0ICptOworICAgIFB5VHlwZU9iamVjdCAqdHlwZWxpc3RbXSA9IHsKKyAgICAgICAgJk11bHRpYnl0ZUluY3JlbWVudGFsRW5jb2Rlcl9UeXBlLAorICAgICAgICAmTXVsdGlieXRlSW5jcmVtZW50YWxEZWNvZGVyX1R5cGUsCisgICAgICAgICZNdWx0aWJ5dGVTdHJlYW1SZWFkZXJfVHlwZSwKKyAgICAgICAgJk11bHRpYnl0ZVN0cmVhbVdyaXRlcl9UeXBlLAorICAgICAgICBOVUxMCisgICAgfTsKIAotCWlmIChQeVR5cGVfUmVhZHkoJk11bHRpYnl0ZUNvZGVjX1R5cGUpIDwgMCkKLQkJcmV0dXJuOworICAgIGlmIChQeVR5cGVfUmVhZHkoJk11bHRpYnl0ZUNvZGVjX1R5cGUpIDwgMCkKKyAgICAgICAgcmV0dXJuOwogCi0JbSA9IFB5X0luaXRNb2R1bGUoIl9tdWx0aWJ5dGVjb2RlYyIsIF9fbWV0aG9kcyk7Ci0JaWYgKG0gPT0gTlVMTCkKLQkJcmV0dXJuOworICAgIG0gPSBQeV9Jbml0TW9kdWxlKCJfbXVsdGlieXRlY29kZWMiLCBfX21ldGhvZHMpOworICAgIGlmIChtID09IE5VTEwpCisgICAgICAgIHJldHVybjsKIAotCWZvciAoaSA9IDA7IHR5cGVsaXN0W2ldICE9IE5VTEw7IGkrKykgewotCQlpZiAoUHlUeXBlX1JlYWR5KHR5cGVsaXN0W2ldKSA8IDApCi0JCQlyZXR1cm47Ci0JCVB5X0lOQ1JFRih0eXBlbGlzdFtpXSk7Ci0JCVB5TW9kdWxlX0FkZE9iamVjdChtLCB0eXBlbGlzdFtpXS0+dHBfbmFtZSwKLQkJCQkgICAoUHlPYmplY3QgKil0eXBlbGlzdFtpXSk7Ci0JfQorICAgIGZvciAoaSA9IDA7IHR5cGVsaXN0W2ldICE9IE5VTEw7IGkrKykgeworICAgICAgICBpZiAoUHlUeXBlX1JlYWR5KHR5cGVsaXN0W2ldKSA8IDApCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIFB5X0lOQ1JFRih0eXBlbGlzdFtpXSk7CisgICAgICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCB0eXBlbGlzdFtpXS0+dHBfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChQeU9iamVjdCAqKXR5cGVsaXN0W2ldKTsKKyAgICB9CiAKLQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkKLQkJUHlfRmF0YWxFcnJvcigiY2FuJ3QgaW5pdGlhbGl6ZSB0aGUgX211bHRpYnl0ZWNvZGVjIG1vZHVsZSIpOworICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJjYW4ndCBpbml0aWFsaXplIHRoZSBfbXVsdGlieXRlY29kZWMgbW9kdWxlIik7CiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL2Nqa2NvZGVjcy9tdWx0aWJ5dGVjb2RlYy5oIGIvTW9kdWxlcy9jamtjb2RlY3MvbXVsdGlieXRlY29kZWMuaAppbmRleCAyMmVhNWQ0Li5mMjBjMDdkIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2Nqa2NvZGVjcy9tdWx0aWJ5dGVjb2RlYy5oCisrKyBiL01vZHVsZXMvY2prY29kZWNzL211bHRpYnl0ZWNvZGVjLmgKQEAgLTIzLDExNCArMjMsMTE0IEBACiAjZW5kaWYKIAogdHlwZWRlZiB1bmlvbiB7Ci0Jdm9pZCAqcDsKLQlpbnQgaTsKLQl1bnNpZ25lZCBjaGFyIGNbOF07Ci0JdWNzMl90IHUyWzRdOwotCXVjczRfdCB1NFsyXTsKKyAgICB2b2lkICpwOworICAgIGludCBpOworICAgIHVuc2lnbmVkIGNoYXIgY1s4XTsKKyAgICB1Y3MyX3QgdTJbNF07CisgICAgdWNzNF90IHU0WzJdOwogfSBNdWx0aWJ5dGVDb2RlY19TdGF0ZTsKIAogdHlwZWRlZiBpbnQgKCptYmNvZGVjX2luaXQpKGNvbnN0IHZvaWQgKmNvbmZpZyk7CiB0eXBlZGVmIFB5X3NzaXplX3QgKCptYmVuY29kZV9mdW5jKShNdWx0aWJ5dGVDb2RlY19TdGF0ZSAqc3RhdGUsCi0JCQljb25zdCB2b2lkICpjb25maWcsCi0JCQljb25zdCBQeV9VTklDT0RFICoqaW5idWYsIFB5X3NzaXplX3QgaW5sZWZ0LAotCQkJdW5zaWduZWQgY2hhciAqKm91dGJ1ZiwgUHlfc3NpemVfdCBvdXRsZWZ0LAotCQkJaW50IGZsYWdzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFB5X1VOSUNPREUgKippbmJ1ZiwgUHlfc3NpemVfdCBpbmxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICoqb3V0YnVmLCBQeV9zc2l6ZV90IG91dGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MpOwogdHlwZWRlZiBpbnQgKCptYmVuY29kZWluaXRfZnVuYykoTXVsdGlieXRlQ29kZWNfU3RhdGUgKnN0YXRlLAotCQkJCSBjb25zdCB2b2lkICpjb25maWcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqY29uZmlnKTsKIHR5cGVkZWYgUHlfc3NpemVfdCAoKm1iZW5jb2RlcmVzZXRfZnVuYykoTXVsdGlieXRlQ29kZWNfU3RhdGUgKnN0YXRlLAotCQkJY29uc3Qgdm9pZCAqY29uZmlnLAotCQkJdW5zaWduZWQgY2hhciAqKm91dGJ1ZiwgUHlfc3NpemVfdCBvdXRsZWZ0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKipvdXRidWYsIFB5X3NzaXplX3Qgb3V0bGVmdCk7CiB0eXBlZGVmIFB5X3NzaXplX3QgKCptYmRlY29kZV9mdW5jKShNdWx0aWJ5dGVDb2RlY19TdGF0ZSAqc3RhdGUsCi0JCQljb25zdCB2b2lkICpjb25maWcsCi0JCQljb25zdCB1bnNpZ25lZCBjaGFyICoqaW5idWYsIFB5X3NzaXplX3QgaW5sZWZ0LAotCQkJUHlfVU5JQ09ERSAqKm91dGJ1ZiwgUHlfc3NpemVfdCBvdXRsZWZ0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKippbmJ1ZiwgUHlfc3NpemVfdCBpbmxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICBQeV9VTklDT0RFICoqb3V0YnVmLCBQeV9zc2l6ZV90IG91dGxlZnQpOwogdHlwZWRlZiBpbnQgKCptYmRlY29kZWluaXRfZnVuYykoTXVsdGlieXRlQ29kZWNfU3RhdGUgKnN0YXRlLAotCQkJCSBjb25zdCB2b2lkICpjb25maWcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqY29uZmlnKTsKIHR5cGVkZWYgUHlfc3NpemVfdCAoKm1iZGVjb2RlcmVzZXRfZnVuYykoTXVsdGlieXRlQ29kZWNfU3RhdGUgKnN0YXRlLAotCQkJCQkgY29uc3Qgdm9pZCAqY29uZmlnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqY29uZmlnKTsKIAogdHlwZWRlZiBzdHJ1Y3QgewotCWNvbnN0IGNoYXIgKmVuY29kaW5nOwotCWNvbnN0IHZvaWQgKmNvbmZpZzsKLQltYmNvZGVjX2luaXQgY29kZWNpbml0OwotCW1iZW5jb2RlX2Z1bmMgZW5jb2RlOwotCW1iZW5jb2RlaW5pdF9mdW5jIGVuY2luaXQ7Ci0JbWJlbmNvZGVyZXNldF9mdW5jIGVuY3Jlc2V0OwotCW1iZGVjb2RlX2Z1bmMgZGVjb2RlOwotCW1iZGVjb2RlaW5pdF9mdW5jIGRlY2luaXQ7Ci0JbWJkZWNvZGVyZXNldF9mdW5jIGRlY3Jlc2V0OworICAgIGNvbnN0IGNoYXIgKmVuY29kaW5nOworICAgIGNvbnN0IHZvaWQgKmNvbmZpZzsKKyAgICBtYmNvZGVjX2luaXQgY29kZWNpbml0OworICAgIG1iZW5jb2RlX2Z1bmMgZW5jb2RlOworICAgIG1iZW5jb2RlaW5pdF9mdW5jIGVuY2luaXQ7CisgICAgbWJlbmNvZGVyZXNldF9mdW5jIGVuY3Jlc2V0OworICAgIG1iZGVjb2RlX2Z1bmMgZGVjb2RlOworICAgIG1iZGVjb2RlaW5pdF9mdW5jIGRlY2luaXQ7CisgICAgbWJkZWNvZGVyZXNldF9mdW5jIGRlY3Jlc2V0OwogfSBNdWx0aWJ5dGVDb2RlYzsKIAogdHlwZWRlZiBzdHJ1Y3QgewotCVB5T2JqZWN0X0hFQUQKLQlNdWx0aWJ5dGVDb2RlYyAqY29kZWM7CisgICAgUHlPYmplY3RfSEVBRAorICAgIE11bHRpYnl0ZUNvZGVjICpjb2RlYzsKIH0gTXVsdGlieXRlQ29kZWNPYmplY3Q7CiAKICNkZWZpbmUgTXVsdGlieXRlQ29kZWNfQ2hlY2sob3ApICgob3ApLT5vYl90eXBlID09ICZNdWx0aWJ5dGVDb2RlY19UeXBlKQogCi0jZGVmaW5lIF9NdWx0aWJ5dGVTdGF0ZWZ1bENvZGVjX0hFQUQJCVwKLQlQeU9iamVjdF9IRUFECQkJCVwKLQlNdWx0aWJ5dGVDb2RlYyAqY29kZWM7CQkJXAotCU11bHRpYnl0ZUNvZGVjX1N0YXRlIHN0YXRlOwkJXAotCVB5T2JqZWN0ICplcnJvcnM7CisjZGVmaW5lIF9NdWx0aWJ5dGVTdGF0ZWZ1bENvZGVjX0hFQUQgICAgICAgICAgICBcCisgICAgUHlPYmplY3RfSEVBRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgTXVsdGlieXRlQ29kZWMgKmNvZGVjOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgTXVsdGlieXRlQ29kZWNfU3RhdGUgc3RhdGU7ICAgICAgICAgICAgICAgICBcCisgICAgUHlPYmplY3QgKmVycm9yczsKIHR5cGVkZWYgc3RydWN0IHsKLQlfTXVsdGlieXRlU3RhdGVmdWxDb2RlY19IRUFECisgICAgX011bHRpYnl0ZVN0YXRlZnVsQ29kZWNfSEVBRAogfSBNdWx0aWJ5dGVTdGF0ZWZ1bENvZGVjQ29udGV4dDsKIAotI2RlZmluZSBNQVhFTkNQRU5ESU5HCTIKLSNkZWZpbmUgX011bHRpYnl0ZVN0YXRlZnVsRW5jb2Rlcl9IRUFECQlcCi0JX011bHRpYnl0ZVN0YXRlZnVsQ29kZWNfSEVBRAkJXAotCVB5X1VOSUNPREUgcGVuZGluZ1tNQVhFTkNQRU5ESU5HXTsJXAotCVB5X3NzaXplX3QgcGVuZGluZ3NpemU7CisjZGVmaW5lIE1BWEVOQ1BFTkRJTkcgICAyCisjZGVmaW5lIF9NdWx0aWJ5dGVTdGF0ZWZ1bEVuY29kZXJfSEVBRCAgICAgICAgICBcCisgICAgX011bHRpYnl0ZVN0YXRlZnVsQ29kZWNfSEVBRCAgICAgICAgICAgICAgICBcCisgICAgUHlfVU5JQ09ERSBwZW5kaW5nW01BWEVOQ1BFTkRJTkddOyAgICAgICAgICBcCisgICAgUHlfc3NpemVfdCBwZW5kaW5nc2l6ZTsKIHR5cGVkZWYgc3RydWN0IHsKLQlfTXVsdGlieXRlU3RhdGVmdWxFbmNvZGVyX0hFQUQKKyAgICBfTXVsdGlieXRlU3RhdGVmdWxFbmNvZGVyX0hFQUQKIH0gTXVsdGlieXRlU3RhdGVmdWxFbmNvZGVyQ29udGV4dDsKIAotI2RlZmluZSBNQVhERUNQRU5ESU5HCTgKLSNkZWZpbmUgX011bHRpYnl0ZVN0YXRlZnVsRGVjb2Rlcl9IRUFECQlcCi0JX011bHRpYnl0ZVN0YXRlZnVsQ29kZWNfSEVBRAkJXAotCXVuc2lnbmVkIGNoYXIgcGVuZGluZ1tNQVhERUNQRU5ESU5HXTsJXAotCVB5X3NzaXplX3QgcGVuZGluZ3NpemU7CisjZGVmaW5lIE1BWERFQ1BFTkRJTkcgICA4CisjZGVmaW5lIF9NdWx0aWJ5dGVTdGF0ZWZ1bERlY29kZXJfSEVBRCAgICAgICAgICBcCisgICAgX011bHRpYnl0ZVN0YXRlZnVsQ29kZWNfSEVBRCAgICAgICAgICAgICAgICBcCisgICAgdW5zaWduZWQgY2hhciBwZW5kaW5nW01BWERFQ1BFTkRJTkddOyAgICAgICBcCisgICAgUHlfc3NpemVfdCBwZW5kaW5nc2l6ZTsKIHR5cGVkZWYgc3RydWN0IHsKLQlfTXVsdGlieXRlU3RhdGVmdWxEZWNvZGVyX0hFQUQKKyAgICBfTXVsdGlieXRlU3RhdGVmdWxEZWNvZGVyX0hFQUQKIH0gTXVsdGlieXRlU3RhdGVmdWxEZWNvZGVyQ29udGV4dDsKIAogdHlwZWRlZiBzdHJ1Y3QgewotCV9NdWx0aWJ5dGVTdGF0ZWZ1bEVuY29kZXJfSEVBRAorICAgIF9NdWx0aWJ5dGVTdGF0ZWZ1bEVuY29kZXJfSEVBRAogfSBNdWx0aWJ5dGVJbmNyZW1lbnRhbEVuY29kZXJPYmplY3Q7CiAKIHR5cGVkZWYgc3RydWN0IHsKLQlfTXVsdGlieXRlU3RhdGVmdWxEZWNvZGVyX0hFQUQKKyAgICBfTXVsdGlieXRlU3RhdGVmdWxEZWNvZGVyX0hFQUQKIH0gTXVsdGlieXRlSW5jcmVtZW50YWxEZWNvZGVyT2JqZWN0OwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JX011bHRpYnl0ZVN0YXRlZnVsRGVjb2Rlcl9IRUFECi0JUHlPYmplY3QgKnN0cmVhbTsKKyAgICBfTXVsdGlieXRlU3RhdGVmdWxEZWNvZGVyX0hFQUQKKyAgICBQeU9iamVjdCAqc3RyZWFtOwogfSBNdWx0aWJ5dGVTdHJlYW1SZWFkZXJPYmplY3Q7CiAKIHR5cGVkZWYgc3RydWN0IHsKLQlfTXVsdGlieXRlU3RhdGVmdWxFbmNvZGVyX0hFQUQKLQlQeU9iamVjdCAqc3RyZWFtOworICAgIF9NdWx0aWJ5dGVTdGF0ZWZ1bEVuY29kZXJfSEVBRAorICAgIFB5T2JqZWN0ICpzdHJlYW07CiB9IE11bHRpYnl0ZVN0cmVhbVdyaXRlck9iamVjdDsKIAogLyogcG9zaXRpdmUgdmFsdWVzIGZvciBpbGxlZ2FsIHNlcXVlbmNlcyAqLwotI2RlZmluZSBNQkVSUl9UT09TTUFMTAkJKC0xKSAvKiBpbnN1ZmZpY2llbnQgb3V0cHV0IGJ1ZmZlciBzcGFjZSAqLwotI2RlZmluZSBNQkVSUl9UT09GRVcJCSgtMikgLyogaW5jb21wbGV0ZSBpbnB1dCBidWZmZXIgKi8KLSNkZWZpbmUgTUJFUlJfSU5URVJOQUwJCSgtMykgLyogaW50ZXJuYWwgcnVudGltZSBlcnJvciAqLworI2RlZmluZSBNQkVSUl9UT09TTUFMTCAgICAgICAgICAoLTEpIC8qIGluc3VmZmljaWVudCBvdXRwdXQgYnVmZmVyIHNwYWNlICovCisjZGVmaW5lIE1CRVJSX1RPT0ZFVyAgICAgICAgICAgICgtMikgLyogaW5jb21wbGV0ZSBpbnB1dCBidWZmZXIgKi8KKyNkZWZpbmUgTUJFUlJfSU5URVJOQUwgICAgICAgICAgKC0zKSAvKiBpbnRlcm5hbCBydW50aW1lIGVycm9yICovCiAKLSNkZWZpbmUgRVJST1JfU1RSSUNUCQkoUHlPYmplY3QgKikoMSkKLSNkZWZpbmUgRVJST1JfSUdOT1JFCQkoUHlPYmplY3QgKikoMikKLSNkZWZpbmUgRVJST1JfUkVQTEFDRQkJKFB5T2JqZWN0ICopKDMpCi0jZGVmaW5lIEVSUk9SX0lTQ1VTVE9NKHApCSgocCkgPCBFUlJPUl9TVFJJQ1QgfHwgRVJST1JfUkVQTEFDRSA8IChwKSkKLSNkZWZpbmUgRVJST1JfREVDUkVGKHApIGRvIHsJCQlcCi0JaWYgKHAgIT0gTlVMTCAmJiBFUlJPUl9JU0NVU1RPTShwKSkgewlcCi0JCVB5X0RFQ1JFRihwKTsJCQlcCi0JfQkJCQkJXAorI2RlZmluZSBFUlJPUl9TVFJJQ1QgICAgICAgICAgICAoUHlPYmplY3QgKikoMSkKKyNkZWZpbmUgRVJST1JfSUdOT1JFICAgICAgICAgICAgKFB5T2JqZWN0ICopKDIpCisjZGVmaW5lIEVSUk9SX1JFUExBQ0UgICAgICAgICAgIChQeU9iamVjdCAqKSgzKQorI2RlZmluZSBFUlJPUl9JU0NVU1RPTShwKSAgICAgICAoKHApIDwgRVJST1JfU1RSSUNUIHx8IEVSUk9SX1JFUExBQ0UgPCAocCkpCisjZGVmaW5lIEVSUk9SX0RFQ1JFRihwKSBkbyB7ICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKHAgIT0gTlVMTCAmJiBFUlJPUl9JU0NVU1RPTShwKSkgeyAgICAgICBcCisgICAgICAgIFB5X0RFQ1JFRihwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiB9IHdoaWxlICgwKTsKIAotI2RlZmluZSBNQkVOQ19GTFVTSAkJMHgwMDAxIC8qIGVuY29kZSBhbGwgY2hhcmFjdGVycyBlbmNvZGFibGUgKi8KLSNkZWZpbmUgTUJFTkNfTUFYCQlNQkVOQ19GTFVTSAorI2RlZmluZSBNQkVOQ19GTFVTSCAgICAgICAgICAgICAweDAwMDEgLyogZW5jb2RlIGFsbCBjaGFyYWN0ZXJzIGVuY29kYWJsZSAqLworI2RlZmluZSBNQkVOQ19NQVggICAgICAgICAgICAgICBNQkVOQ19GTFVTSAogCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvY2xtb2R1bGUuYyBiL01vZHVsZXMvY2xtb2R1bGUuYwppbmRleCBkM2UwZWRmLi5lNWQ1NjhmIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2NsbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9jbG1vZHVsZS5jCkBAIC0xMiwxNCArMTIsMTQgQEAKICNpbmNsdWRlICJQeXRob24uaCIKIAogdHlwZWRlZiBzdHJ1Y3QgewotCVB5T2JqZWN0X0hFQUQKLQlpbnQgb2JfaXNDb21wcmVzc29yOwkvKiBDb21wcmVzc29yIG9yIERlY29tcHJlc3NvciAqLwotCUNMX0hhbmRsZSBvYl9jb21wcmVzc29ySGRsOwotCWludCAqb2JfcGFyYW10eXBlczsKLQlpbnQgb2JfbnBhcmFtczsKKyAgICBQeU9iamVjdF9IRUFECisgICAgaW50IG9iX2lzQ29tcHJlc3NvcjsgICAgICAgIC8qIENvbXByZXNzb3Igb3IgRGVjb21wcmVzc29yICovCisgICAgQ0xfSGFuZGxlIG9iX2NvbXByZXNzb3JIZGw7CisgICAgaW50ICpvYl9wYXJhbXR5cGVzOworICAgIGludCBvYl9ucGFyYW1zOwogfSBjbG9iamVjdDsKIAotc3RhdGljIFB5T2JqZWN0ICpDbEVycm9yOwkJLyogZXhjZXB0aW9uIGNsLmVycm9yICovCitzdGF0aWMgUHlPYmplY3QgKkNsRXJyb3I7ICAgICAgICAgICAgICAgLyogZXhjZXB0aW9uIGNsLmVycm9yICovCiAKIHN0YXRpYyBpbnQgZXJyb3JfaGFuZGxlcl9jYWxsZWQgPSAwOwogCkBAIC0zMCwyOCArMzAsMjggQEAKICAqIGV2ZW4gdGhvdWdoIHRoZXkgYXJlIHJlYWxseSAiY2xvYmplY3QgKiIuICBUaGVyZWZvcmUgd2UgY2FzdCB0aGUKICAqIGFyZ3VtZW50IHRvIHRoZSBwcm9wZXIgdHlwZSB1c2luZyB0aGlzIG1hY3JvLgogICovCi0jZGVmaW5lIFNFTEYJKChjbG9iamVjdCAqKSBzZWxmKQorI2RlZmluZSBTRUxGICAgICgoY2xvYmplY3QgKikgc2VsZikKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCQkgIFV0aWxpdHkgcm91dGluZXMuCisgICAgICAgICAgICAgICAgICAgICAgICAgIFV0aWxpdHkgcm91dGluZXMuCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHN0YXRpYyB2b2lkCiBjbF9FcnJvckhhbmRsZXIoQ0xfSGFuZGxlIGhhbmRsZSwgaW50IGNvZGUsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQogewotCXZhX2xpc3QgYXA7Ci0JY2hhciBlcnJidWZbQlVGU0laXTsJLyogaG9wZWZ1bGx5IGJpZyBlbm91Z2ggKi8KLQljaGFyICpwOworICAgIHZhX2xpc3QgYXA7CisgICAgY2hhciBlcnJidWZbQlVGU0laXTsgICAgICAgIC8qIGhvcGVmdWxseSBiaWcgZW5vdWdoICovCisgICAgY2hhciAqcDsKIAotCWlmIChQeUVycl9PY2N1cnJlZCgpKQkvKiBkb24ndCBjaGFuZ2UgZXhpc3RpbmcgZXJyb3IgKi8KLQkJcmV0dXJuOwotCWVycm9yX2hhbmRsZXJfY2FsbGVkID0gMTsKLQl2YV9zdGFydChhcCwgZm10KTsKLQl2c3ByaW50ZihlcnJidWYsIGZtdCwgYXApOwotCXZhX2VuZChhcCk7Ci0JcCA9ICZlcnJidWZbc3RybGVuKGVycmJ1ZikgLSAxXTsgLyogc3dhdCB0aGUgbGluZSBmZWVkICovCi0JaWYgKCpwID09ICdcbicpCi0JCSpwID0gMDsKLQlQeUVycl9TZXRTdHJpbmcoQ2xFcnJvciwgZXJyYnVmKTsKKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgICAgICAgLyogZG9uJ3QgY2hhbmdlIGV4aXN0aW5nIGVycm9yICovCisgICAgICAgIHJldHVybjsKKyAgICBlcnJvcl9oYW5kbGVyX2NhbGxlZCA9IDE7CisgICAgdmFfc3RhcnQoYXAsIGZtdCk7CisgICAgdnNwcmludGYoZXJyYnVmLCBmbXQsIGFwKTsKKyAgICB2YV9lbmQoYXApOworICAgIHAgPSAmZXJyYnVmW3N0cmxlbihlcnJidWYpIC0gMV07IC8qIHN3YXQgdGhlIGxpbmUgZmVlZCAqLworICAgIGlmICgqcCA9PSAnXG4nKQorICAgICAgICAqcCA9IDA7CisgICAgUHlFcnJfU2V0U3RyaW5nKENsRXJyb3IsIGVycmJ1Zik7CiB9CiAKIC8qCkBAIC02MCw4MzkgKzYwLDgzOSBAQAogc3RhdGljIGludAogcGFyYW1fdHlwZV9pc19mbG9hdChjbG9iamVjdCAqc2VsZiwgaW50IHBhcmFtKQogewotCWludCBidWZmZXJsZW5ndGg7CisgICAgaW50IGJ1ZmZlcmxlbmd0aDsKIAotCWlmIChzZWxmLT5vYl9wYXJhbXR5cGVzID09IE5VTEwpIHsKLQkJZXJyb3JfaGFuZGxlcl9jYWxsZWQgPSAwOwotCQlidWZmZXJsZW5ndGggPSBjbFF1ZXJ5UGFyYW1zKHNlbGYtPm9iX2NvbXByZXNzb3JIZGwsIDAsIDApOwotCQlpZiAoZXJyb3JfaGFuZGxlcl9jYWxsZWQpCi0JCQlyZXR1cm4gLTE7CisgICAgaWYgKHNlbGYtPm9iX3BhcmFtdHlwZXMgPT0gTlVMTCkgeworICAgICAgICBlcnJvcl9oYW5kbGVyX2NhbGxlZCA9IDA7CisgICAgICAgIGJ1ZmZlcmxlbmd0aCA9IGNsUXVlcnlQYXJhbXMoc2VsZi0+b2JfY29tcHJlc3NvckhkbCwgMCwgMCk7CisgICAgICAgIGlmIChlcnJvcl9oYW5kbGVyX2NhbGxlZCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKIAotCQlzZWxmLT5vYl9wYXJhbXR5cGVzID0gUHlNZW1fTkVXKGludCwgYnVmZmVybGVuZ3RoKTsKLQkJaWYgKHNlbGYtPm9iX3BhcmFtdHlwZXMgPT0gTlVMTCkKLQkJCXJldHVybiAtMTsKLQkJc2VsZi0+b2JfbnBhcmFtcyA9IGJ1ZmZlcmxlbmd0aCAvIDI7CisgICAgICAgIHNlbGYtPm9iX3BhcmFtdHlwZXMgPSBQeU1lbV9ORVcoaW50LCBidWZmZXJsZW5ndGgpOworICAgICAgICBpZiAoc2VsZi0+b2JfcGFyYW10eXBlcyA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBzZWxmLT5vYl9ucGFyYW1zID0gYnVmZmVybGVuZ3RoIC8gMjsKIAotCQkodm9pZCkgY2xRdWVyeVBhcmFtcyhzZWxmLT5vYl9jb21wcmVzc29ySGRsLAotCQkJCSAgICAgc2VsZi0+b2JfcGFyYW10eXBlcywgYnVmZmVybGVuZ3RoKTsKLQkJaWYgKGVycm9yX2hhbmRsZXJfY2FsbGVkKSB7Ci0JCQlQeU1lbV9ERUwoc2VsZi0+b2JfcGFyYW10eXBlcyk7Ci0JCQlzZWxmLT5vYl9wYXJhbXR5cGVzID0gTlVMTDsKLQkJCXJldHVybiAtMTsKLQkJfQotCX0KKyAgICAgICAgKHZvaWQpIGNsUXVlcnlQYXJhbXMoc2VsZi0+b2JfY29tcHJlc3NvckhkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+b2JfcGFyYW10eXBlcywgYnVmZmVybGVuZ3RoKTsKKyAgICAgICAgaWYgKGVycm9yX2hhbmRsZXJfY2FsbGVkKSB7CisgICAgICAgICAgICBQeU1lbV9ERUwoc2VsZi0+b2JfcGFyYW10eXBlcyk7CisgICAgICAgICAgICBzZWxmLT5vYl9wYXJhbXR5cGVzID0gTlVMTDsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KIAotCWlmIChwYXJhbSA8IDAgfHwgcGFyYW0gPj0gc2VsZi0+b2JfbnBhcmFtcykKLQkJcmV0dXJuIC0xOworICAgIGlmIChwYXJhbSA8IDAgfHwgcGFyYW0gPj0gc2VsZi0+b2JfbnBhcmFtcykKKyAgICAgICAgcmV0dXJuIC0xOwogCi0JaWYgKHNlbGYtPm9iX3BhcmFtdHlwZXNbcGFyYW0qMiArIDFdID09IENMX0ZMT0FUSU5HX0VOVU1fVkFMVUUgfHwKLQkgICAgc2VsZi0+b2JfcGFyYW10eXBlc1twYXJhbSoyICsgMV0gPT0gQ0xfRkxPQVRJTkdfUkFOR0VfVkFMVUUpCi0JCXJldHVybiAxOwotCWVsc2UKLQkJcmV0dXJuIDA7CisgICAgaWYgKHNlbGYtPm9iX3BhcmFtdHlwZXNbcGFyYW0qMiArIDFdID09IENMX0ZMT0FUSU5HX0VOVU1fVkFMVUUgfHwKKyAgICAgICAgc2VsZi0+b2JfcGFyYW10eXBlc1twYXJhbSoyICsgMV0gPT0gQ0xfRkxPQVRJTkdfUkFOR0VfVkFMVUUpCisgICAgICAgIHJldHVybiAxOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIDA7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCSAgICAgICBTaW5nbGUgaW1hZ2UgY29tcHJlc3Npb24vZGVjb21wcmVzc2lvbi4KKyAgICAgICAgICAgICAgIFNpbmdsZSBpbWFnZSBjb21wcmVzc2lvbi9kZWNvbXByZXNzaW9uLgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBzdGF0aWMgUHlPYmplY3QgKgogY2xfQ29tcHJlc3NJbWFnZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IGNvbXByZXNzaW9uU2NoZW1lLCB3aWR0aCwgaGVpZ2h0LCBvcmlnaW5hbEZvcm1hdDsKLQlmbG9hdCBjb21wcmVzc2lvblJhdGlvOwotCWludCBmcmFtZUJ1ZmZlclNpemUsIGNvbXByZXNzZWRCdWZmZXJTaXplOwotCWNoYXIgKmZyYW1lQnVmZmVyOwotCVB5T2JqZWN0ICpjb21wcmVzc2VkQnVmZmVyOworICAgIGludCBjb21wcmVzc2lvblNjaGVtZSwgd2lkdGgsIGhlaWdodCwgb3JpZ2luYWxGb3JtYXQ7CisgICAgZmxvYXQgY29tcHJlc3Npb25SYXRpbzsKKyAgICBpbnQgZnJhbWVCdWZmZXJTaXplLCBjb21wcmVzc2VkQnVmZmVyU2l6ZTsKKyAgICBjaGFyICpmcmFtZUJ1ZmZlcjsKKyAgICBQeU9iamVjdCAqY29tcHJlc3NlZEJ1ZmZlcjsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaWlpaWZzIyIsICZjb21wcmVzc2lvblNjaGVtZSwKLQkJCSAmd2lkdGgsICZoZWlnaHQsCi0JCQkgJm9yaWdpbmFsRm9ybWF0LCAmY29tcHJlc3Npb25SYXRpbywgJmZyYW1lQnVmZmVyLAotCQkJICZmcmFtZUJ1ZmZlclNpemUpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpaWlmcyMiLCAmY29tcHJlc3Npb25TY2hlbWUsCisgICAgICAgICAgICAgICAgICAgICAmd2lkdGgsICZoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAmb3JpZ2luYWxGb3JtYXQsICZjb21wcmVzc2lvblJhdGlvLCAmZnJhbWVCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAmZnJhbWVCdWZmZXJTaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgcmV0cnk6Ci0JY29tcHJlc3NlZEJ1ZmZlciA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGZyYW1lQnVmZmVyU2l6ZSk7Ci0JaWYgKGNvbXByZXNzZWRCdWZmZXIgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgY29tcHJlc3NlZEJ1ZmZlciA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGZyYW1lQnVmZmVyU2l6ZSk7CisgICAgaWYgKGNvbXByZXNzZWRCdWZmZXIgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQljb21wcmVzc2VkQnVmZmVyU2l6ZSA9IGZyYW1lQnVmZmVyU2l6ZTsKLQllcnJvcl9oYW5kbGVyX2NhbGxlZCA9IDA7Ci0JaWYgKGNsQ29tcHJlc3NJbWFnZShjb21wcmVzc2lvblNjaGVtZSwgd2lkdGgsIGhlaWdodCwgb3JpZ2luYWxGb3JtYXQsCi0JCQkgICAgY29tcHJlc3Npb25SYXRpbywgKHZvaWQgKikgZnJhbWVCdWZmZXIsCi0JCQkgICAgJmNvbXByZXNzZWRCdWZmZXJTaXplLAotCQkJICAgICh2b2lkICopIFB5U3RyaW5nX0FzU3RyaW5nKGNvbXByZXNzZWRCdWZmZXIpKQotCSAgICA9PSBGQUlMVVJFIHx8IGVycm9yX2hhbmRsZXJfY2FsbGVkKSB7Ci0JCVB5X0RFQ1JFRihjb21wcmVzc2VkQnVmZmVyKTsKLQkJaWYgKCFlcnJvcl9oYW5kbGVyX2NhbGxlZCkKLQkJCVB5RXJyX1NldFN0cmluZyhDbEVycm9yLCAiY2xDb21wcmVzc0ltYWdlIGZhaWxlZCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgY29tcHJlc3NlZEJ1ZmZlclNpemUgPSBmcmFtZUJ1ZmZlclNpemU7CisgICAgZXJyb3JfaGFuZGxlcl9jYWxsZWQgPSAwOworICAgIGlmIChjbENvbXByZXNzSW1hZ2UoY29tcHJlc3Npb25TY2hlbWUsIHdpZHRoLCBoZWlnaHQsIG9yaWdpbmFsRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgY29tcHJlc3Npb25SYXRpbywgKHZvaWQgKikgZnJhbWVCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAmY29tcHJlc3NlZEJ1ZmZlclNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSBQeVN0cmluZ19Bc1N0cmluZyhjb21wcmVzc2VkQnVmZmVyKSkKKyAgICAgICAgPT0gRkFJTFVSRSB8fCBlcnJvcl9oYW5kbGVyX2NhbGxlZCkgeworICAgICAgICBQeV9ERUNSRUYoY29tcHJlc3NlZEJ1ZmZlcik7CisgICAgICAgIGlmICghZXJyb3JfaGFuZGxlcl9jYWxsZWQpCisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQ2xFcnJvciwgImNsQ29tcHJlc3NJbWFnZSBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaWYgKGNvbXByZXNzZWRCdWZmZXJTaXplID4gZnJhbWVCdWZmZXJTaXplKSB7Ci0JCWZyYW1lQnVmZmVyU2l6ZSA9IGNvbXByZXNzZWRCdWZmZXJTaXplOwotCQlQeV9ERUNSRUYoY29tcHJlc3NlZEJ1ZmZlcik7Ci0JCWdvdG8gcmV0cnk7Ci0JfQorICAgIGlmIChjb21wcmVzc2VkQnVmZmVyU2l6ZSA+IGZyYW1lQnVmZmVyU2l6ZSkgeworICAgICAgICBmcmFtZUJ1ZmZlclNpemUgPSBjb21wcmVzc2VkQnVmZmVyU2l6ZTsKKyAgICAgICAgUHlfREVDUkVGKGNvbXByZXNzZWRCdWZmZXIpOworICAgICAgICBnb3RvIHJldHJ5OworICAgIH0KIAotCWlmIChjb21wcmVzc2VkQnVmZmVyU2l6ZSA8IGZyYW1lQnVmZmVyU2l6ZSkKLQkJX1B5U3RyaW5nX1Jlc2l6ZSgmY29tcHJlc3NlZEJ1ZmZlciwgY29tcHJlc3NlZEJ1ZmZlclNpemUpOworICAgIGlmIChjb21wcmVzc2VkQnVmZmVyU2l6ZSA8IGZyYW1lQnVmZmVyU2l6ZSkKKyAgICAgICAgX1B5U3RyaW5nX1Jlc2l6ZSgmY29tcHJlc3NlZEJ1ZmZlciwgY29tcHJlc3NlZEJ1ZmZlclNpemUpOwogCi0JcmV0dXJuIGNvbXByZXNzZWRCdWZmZXI7CisgICAgcmV0dXJuIGNvbXByZXNzZWRCdWZmZXI7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjbF9EZWNvbXByZXNzSW1hZ2UoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBjb21wcmVzc2lvblNjaGVtZSwgd2lkdGgsIGhlaWdodCwgb3JpZ2luYWxGb3JtYXQ7Ci0JY2hhciAqY29tcHJlc3NlZEJ1ZmZlcjsKLQlpbnQgY29tcHJlc3NlZEJ1ZmZlclNpemUsIGZyYW1lQnVmZmVyU2l6ZTsKLQlQeU9iamVjdCAqZnJhbWVCdWZmZXI7CisgICAgaW50IGNvbXByZXNzaW9uU2NoZW1lLCB3aWR0aCwgaGVpZ2h0LCBvcmlnaW5hbEZvcm1hdDsKKyAgICBjaGFyICpjb21wcmVzc2VkQnVmZmVyOworICAgIGludCBjb21wcmVzc2VkQnVmZmVyU2l6ZSwgZnJhbWVCdWZmZXJTaXplOworICAgIFB5T2JqZWN0ICpmcmFtZUJ1ZmZlcjsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaWlpaXMjIiwgJmNvbXByZXNzaW9uU2NoZW1lLCAmd2lkdGgsICZoZWlnaHQsCi0JCQkgJm9yaWdpbmFsRm9ybWF0LCAmY29tcHJlc3NlZEJ1ZmZlciwKLQkJCSAmY29tcHJlc3NlZEJ1ZmZlclNpemUpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpaWlzIyIsICZjb21wcmVzc2lvblNjaGVtZSwgJndpZHRoLCAmaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgJm9yaWdpbmFsRm9ybWF0LCAmY29tcHJlc3NlZEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICZjb21wcmVzc2VkQnVmZmVyU2l6ZSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JZnJhbWVCdWZmZXJTaXplID0gd2lkdGggKiBoZWlnaHQgKiBDTF9CeXRlc1BlclBpeGVsKG9yaWdpbmFsRm9ybWF0KTsKKyAgICBmcmFtZUJ1ZmZlclNpemUgPSB3aWR0aCAqIGhlaWdodCAqIENMX0J5dGVzUGVyUGl4ZWwob3JpZ2luYWxGb3JtYXQpOwogCi0JZnJhbWVCdWZmZXIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBmcmFtZUJ1ZmZlclNpemUpOwotCWlmIChmcmFtZUJ1ZmZlciA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBmcmFtZUJ1ZmZlciA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGZyYW1lQnVmZmVyU2l6ZSk7CisgICAgaWYgKGZyYW1lQnVmZmVyID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JZXJyb3JfaGFuZGxlcl9jYWxsZWQgPSAwOwotCWlmIChjbERlY29tcHJlc3NJbWFnZShjb21wcmVzc2lvblNjaGVtZSwgd2lkdGgsIGhlaWdodCwgb3JpZ2luYWxGb3JtYXQsCi0JCQkgICAgICBjb21wcmVzc2VkQnVmZmVyU2l6ZSwgY29tcHJlc3NlZEJ1ZmZlciwKLQkJCSAgICAgICh2b2lkICopIFB5U3RyaW5nX0FzU3RyaW5nKGZyYW1lQnVmZmVyKSkKLQkgICAgPT0gRkFJTFVSRSB8fCBlcnJvcl9oYW5kbGVyX2NhbGxlZCkgewotCQlQeV9ERUNSRUYoZnJhbWVCdWZmZXIpOwotCQlpZiAoIWVycm9yX2hhbmRsZXJfY2FsbGVkKQotCQkJUHlFcnJfU2V0U3RyaW5nKENsRXJyb3IsICJjbERlY29tcHJlc3NJbWFnZSBmYWlsZWQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGVycm9yX2hhbmRsZXJfY2FsbGVkID0gMDsKKyAgICBpZiAoY2xEZWNvbXByZXNzSW1hZ2UoY29tcHJlc3Npb25TY2hlbWUsIHdpZHRoLCBoZWlnaHQsIG9yaWdpbmFsRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc2VkQnVmZmVyU2l6ZSwgY29tcHJlc3NlZEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikgUHlTdHJpbmdfQXNTdHJpbmcoZnJhbWVCdWZmZXIpKQorICAgICAgICA9PSBGQUlMVVJFIHx8IGVycm9yX2hhbmRsZXJfY2FsbGVkKSB7CisgICAgICAgIFB5X0RFQ1JFRihmcmFtZUJ1ZmZlcik7CisgICAgICAgIGlmICghZXJyb3JfaGFuZGxlcl9jYWxsZWQpCisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQ2xFcnJvciwgImNsRGVjb21wcmVzc0ltYWdlIGZhaWxlZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlyZXR1cm4gZnJhbWVCdWZmZXI7CisgICAgcmV0dXJuIGZyYW1lQnVmZmVyOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkJU2VxdWVudGlhbCBjb21wcmVzc2lvbi9kZWNvbXByZXNzaW9uLgorICAgICAgICAgICAgICAgIFNlcXVlbnRpYWwgY29tcHJlc3Npb24vZGVjb21wcmVzc2lvbi4KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBDaGVja0NvbXByZXNzb3Ioc2VsZikJaWYgKChzZWxmKS0+b2JfY29tcHJlc3NvckhkbCA9PSBOVUxMKSB7IFwKLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAiKGRlKWNvbXByZXNzb3Igbm90IGFjdGl2ZSIpOyBcCi0JcmV0dXJuIE5VTEw7IFwKKyNkZWZpbmUgQ2hlY2tDb21wcmVzc29yKHNlbGYpICAgaWYgKChzZWxmKS0+b2JfY29tcHJlc3NvckhkbCA9PSBOVUxMKSB7IFwKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAiKGRlKWNvbXByZXNzb3Igbm90IGFjdGl2ZSIpOyBcCisgICAgcmV0dXJuIE5VTEw7IFwKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRvQ2xvc2UoY2xvYmplY3QgKnNlbGYsIGludCAoKmNsb3NlX2Z1bmMpKENMX0hhbmRsZSkpCiB7Ci0JQ2hlY2tDb21wcmVzc29yKHNlbGYpOworICAgIENoZWNrQ29tcHJlc3NvcihzZWxmKTsKIAotCWVycm9yX2hhbmRsZXJfY2FsbGVkID0gMDsKLQlpZiAoKCpjbG9zZV9mdW5jKShzZWxmLT5vYl9jb21wcmVzc29ySGRsKSA9PSBGQUlMVVJFIHx8Ci0JICAgIGVycm9yX2hhbmRsZXJfY2FsbGVkKSB7Ci0JCWlmICghZXJyb3JfaGFuZGxlcl9jYWxsZWQpCi0JCQlQeUVycl9TZXRTdHJpbmcoQ2xFcnJvciwgImNsb3NlIGZhaWxlZCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgZXJyb3JfaGFuZGxlcl9jYWxsZWQgPSAwOworICAgIGlmICgoKmNsb3NlX2Z1bmMpKHNlbGYtPm9iX2NvbXByZXNzb3JIZGwpID09IEZBSUxVUkUgfHwKKyAgICAgICAgZXJyb3JfaGFuZGxlcl9jYWxsZWQpIHsKKyAgICAgICAgaWYgKCFlcnJvcl9oYW5kbGVyX2NhbGxlZCkKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhDbEVycm9yLCAiY2xvc2UgZmFpbGVkIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXNlbGYtPm9iX2NvbXByZXNzb3JIZGwgPSBOVUxMOworICAgIHNlbGYtPm9iX2NvbXByZXNzb3JIZGwgPSBOVUxMOwogCi0JaWYgKHNlbGYtPm9iX3BhcmFtdHlwZXMpCi0JCVB5TWVtX0RFTChzZWxmLT5vYl9wYXJhbXR5cGVzKTsKLQlzZWxmLT5vYl9wYXJhbXR5cGVzID0gTlVMTDsKKyAgICBpZiAoc2VsZi0+b2JfcGFyYW10eXBlcykKKyAgICAgICAgUHlNZW1fREVMKHNlbGYtPm9iX3BhcmFtdHlwZXMpOworICAgIHNlbGYtPm9iX3BhcmFtdHlwZXMgPSBOVUxMOwogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNsbV9DbG9zZUNvbXByZXNzb3IoUHlPYmplY3QgKnNlbGYpCiB7Ci0JcmV0dXJuIGRvQ2xvc2UoU0VMRiwgY2xDbG9zZUNvbXByZXNzb3IpOworICAgIHJldHVybiBkb0Nsb3NlKFNFTEYsIGNsQ2xvc2VDb21wcmVzc29yKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNsbV9DbG9zZURlY29tcHJlc3NvcihQeU9iamVjdCAqc2VsZikKIHsKLQlyZXR1cm4gZG9DbG9zZShTRUxGLCBjbENsb3NlRGVjb21wcmVzc29yKTsKKyAgICByZXR1cm4gZG9DbG9zZShTRUxGLCBjbENsb3NlRGVjb21wcmVzc29yKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNsbV9Db21wcmVzcyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IG51bWJlck9mRnJhbWVzOwotCWludCBmcmFtZUJ1ZmZlclNpemUsIGNvbXByZXNzZWRCdWZmZXJTaXplLCBzaXplOwotCWNoYXIgKmZyYW1lQnVmZmVyOwotCVB5T2JqZWN0ICpkYXRhOworICAgIGludCBudW1iZXJPZkZyYW1lczsKKyAgICBpbnQgZnJhbWVCdWZmZXJTaXplLCBjb21wcmVzc2VkQnVmZmVyU2l6ZSwgc2l6ZTsKKyAgICBjaGFyICpmcmFtZUJ1ZmZlcjsKKyAgICBQeU9iamVjdCAqZGF0YTsKIAotCUNoZWNrQ29tcHJlc3NvcihTRUxGKTsKKyAgICBDaGVja0NvbXByZXNzb3IoU0VMRik7CiAKLQlpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICIoaXMjKSIsICZudW1iZXJPZkZyYW1lcywKLQkJCSAmZnJhbWVCdWZmZXIsICZmcmFtZUJ1ZmZlclNpemUpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICIoaXMjKSIsICZudW1iZXJPZkZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICZmcmFtZUJ1ZmZlciwgJmZyYW1lQnVmZmVyU2l6ZSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JZXJyb3JfaGFuZGxlcl9jYWxsZWQgPSAwOwotCXNpemUgPSBjbEdldFBhcmFtKFNFTEYtPm9iX2NvbXByZXNzb3JIZGwsIENMX0NPTVBSRVNTRURfQlVGRkVSX1NJWkUpOwotCWNvbXByZXNzZWRCdWZmZXJTaXplID0gc2l6ZTsKLQlpZiAoZXJyb3JfaGFuZGxlcl9jYWxsZWQpCi0JCXJldHVybiBOVUxMOworICAgIGVycm9yX2hhbmRsZXJfY2FsbGVkID0gMDsKKyAgICBzaXplID0gY2xHZXRQYXJhbShTRUxGLT5vYl9jb21wcmVzc29ySGRsLCBDTF9DT01QUkVTU0VEX0JVRkZFUl9TSVpFKTsKKyAgICBjb21wcmVzc2VkQnVmZmVyU2l6ZSA9IHNpemU7CisgICAgaWYgKGVycm9yX2hhbmRsZXJfY2FsbGVkKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWRhdGEgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBzaXplKTsKLQlpZiAoZGF0YSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBkYXRhID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgc2l6ZSk7CisgICAgaWYgKGRhdGEgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQllcnJvcl9oYW5kbGVyX2NhbGxlZCA9IDA7Ci0JaWYgKGNsQ29tcHJlc3MoU0VMRi0+b2JfY29tcHJlc3NvckhkbCwgbnVtYmVyT2ZGcmFtZXMsCi0JCSAgICAgICAodm9pZCAqKSBmcmFtZUJ1ZmZlciwgJmNvbXByZXNzZWRCdWZmZXJTaXplLAotCQkgICAgICAgKHZvaWQgKikgUHlTdHJpbmdfQXNTdHJpbmcoZGF0YSkpID09IEZBSUxVUkUgfHwKLQkgICAgZXJyb3JfaGFuZGxlcl9jYWxsZWQpIHsKLQkJUHlfREVDUkVGKGRhdGEpOwotCQlpZiAoIWVycm9yX2hhbmRsZXJfY2FsbGVkKQotCQkJUHlFcnJfU2V0U3RyaW5nKENsRXJyb3IsICJjb21wcmVzcyBmYWlsZWQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGVycm9yX2hhbmRsZXJfY2FsbGVkID0gMDsKKyAgICBpZiAoY2xDb21wcmVzcyhTRUxGLT5vYl9jb21wcmVzc29ySGRsLCBudW1iZXJPZkZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAodm9pZCAqKSBmcmFtZUJ1ZmZlciwgJmNvbXByZXNzZWRCdWZmZXJTaXplLAorICAgICAgICAgICAgICAgICAgICh2b2lkICopIFB5U3RyaW5nX0FzU3RyaW5nKGRhdGEpKSA9PSBGQUlMVVJFIHx8CisgICAgICAgIGVycm9yX2hhbmRsZXJfY2FsbGVkKSB7CisgICAgICAgIFB5X0RFQ1JFRihkYXRhKTsKKyAgICAgICAgaWYgKCFlcnJvcl9oYW5kbGVyX2NhbGxlZCkKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhDbEVycm9yLCAiY29tcHJlc3MgZmFpbGVkIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWlmIChjb21wcmVzc2VkQnVmZmVyU2l6ZSA8IHNpemUpCi0JCWlmIChfUHlTdHJpbmdfUmVzaXplKCZkYXRhLCBjb21wcmVzc2VkQnVmZmVyU2l6ZSkpCi0JCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoY29tcHJlc3NlZEJ1ZmZlclNpemUgPCBzaXplKQorICAgICAgICBpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmZGF0YSwgY29tcHJlc3NlZEJ1ZmZlclNpemUpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoY29tcHJlc3NlZEJ1ZmZlclNpemUgPiBzaXplKSB7Ci0JCS8qIHdlIGRpZG4ndCBnZXQgYWxsICJjb21wcmVzc2VkIiBkYXRhICovCi0JCVB5X0RFQ1JFRihkYXRhKTsKLQkJUHlFcnJfU2V0U3RyaW5nKENsRXJyb3IsCi0JCQkJImNvbXByZXNzZWQgZGF0YSBpcyBtb3JlIHRoYW4gZml0dGVkIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoY29tcHJlc3NlZEJ1ZmZlclNpemUgPiBzaXplKSB7CisgICAgICAgIC8qIHdlIGRpZG4ndCBnZXQgYWxsICJjb21wcmVzc2VkIiBkYXRhICovCisgICAgICAgIFB5X0RFQ1JFRihkYXRhKTsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKENsRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiY29tcHJlc3NlZCBkYXRhIGlzIG1vcmUgdGhhbiBmaXR0ZWQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JcmV0dXJuIGRhdGE7CisgICAgcmV0dXJuIGRhdGE7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjbG1fRGVjb21wcmVzcyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKmRhdGE7Ci0JaW50IG51bWJlck9mRnJhbWVzOwotCWNoYXIgKmNvbXByZXNzZWREYXRhOwotCWludCBjb21wcmVzc2VkRGF0YVNpemUsIGRhdGFTaXplOworICAgIFB5T2JqZWN0ICpkYXRhOworICAgIGludCBudW1iZXJPZkZyYW1lczsKKyAgICBjaGFyICpjb21wcmVzc2VkRGF0YTsKKyAgICBpbnQgY29tcHJlc3NlZERhdGFTaXplLCBkYXRhU2l6ZTsKIAotCUNoZWNrQ29tcHJlc3NvcihTRUxGKTsKKyAgICBDaGVja0NvbXByZXNzb3IoU0VMRik7CiAKLQlpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICIoaXMjKSIsICZudW1iZXJPZkZyYW1lcywgJmNvbXByZXNzZWREYXRhLAotCQkJICZjb21wcmVzc2VkRGF0YVNpemUpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICIoaXMjKSIsICZudW1iZXJPZkZyYW1lcywgJmNvbXByZXNzZWREYXRhLAorICAgICAgICAgICAgICAgICAgICAgJmNvbXByZXNzZWREYXRhU2l6ZSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JZXJyb3JfaGFuZGxlcl9jYWxsZWQgPSAwOwotCWRhdGFTaXplID0gY2xHZXRQYXJhbShTRUxGLT5vYl9jb21wcmVzc29ySGRsLCBDTF9GUkFNRV9CVUZGRVJfU0laRSk7Ci0JaWYgKGVycm9yX2hhbmRsZXJfY2FsbGVkKQotCQlyZXR1cm4gTlVMTDsKKyAgICBlcnJvcl9oYW5kbGVyX2NhbGxlZCA9IDA7CisgICAgZGF0YVNpemUgPSBjbEdldFBhcmFtKFNFTEYtPm9iX2NvbXByZXNzb3JIZGwsIENMX0ZSQU1FX0JVRkZFUl9TSVpFKTsKKyAgICBpZiAoZXJyb3JfaGFuZGxlcl9jYWxsZWQpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JZGF0YSA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGRhdGFTaXplKTsKLQlpZiAoZGF0YSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBkYXRhID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgZGF0YVNpemUpOworICAgIGlmIChkYXRhID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JZXJyb3JfaGFuZGxlcl9jYWxsZWQgPSAwOwotCWlmIChjbERlY29tcHJlc3MoU0VMRi0+b2JfY29tcHJlc3NvckhkbCwgbnVtYmVyT2ZGcmFtZXMsCi0JCQkgY29tcHJlc3NlZERhdGFTaXplLCAodm9pZCAqKSBjb21wcmVzc2VkRGF0YSwKLQkJCSAodm9pZCAqKSBQeVN0cmluZ19Bc1N0cmluZyhkYXRhKSkgPT0gRkFJTFVSRSB8fAotCSAgICBlcnJvcl9oYW5kbGVyX2NhbGxlZCkgewotCQlQeV9ERUNSRUYoZGF0YSk7Ci0JCWlmICghZXJyb3JfaGFuZGxlcl9jYWxsZWQpCi0JCQlQeUVycl9TZXRTdHJpbmcoQ2xFcnJvciwgImRlY29tcHJlc3MgZmFpbGVkIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBlcnJvcl9oYW5kbGVyX2NhbGxlZCA9IDA7CisgICAgaWYgKGNsRGVjb21wcmVzcyhTRUxGLT5vYl9jb21wcmVzc29ySGRsLCBudW1iZXJPZkZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzZWREYXRhU2l6ZSwgKHZvaWQgKikgY29tcHJlc3NlZERhdGEsCisgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSBQeVN0cmluZ19Bc1N0cmluZyhkYXRhKSkgPT0gRkFJTFVSRSB8fAorICAgICAgICBlcnJvcl9oYW5kbGVyX2NhbGxlZCkgeworICAgICAgICBQeV9ERUNSRUYoZGF0YSk7CisgICAgICAgIGlmICghZXJyb3JfaGFuZGxlcl9jYWxsZWQpCisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQ2xFcnJvciwgImRlY29tcHJlc3MgZmFpbGVkIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXJldHVybiBkYXRhOworICAgIHJldHVybiBkYXRhOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZG9QYXJhbXMoY2xvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBpbnQgKCpmdW5jKShDTF9IYW5kbGUsIGludCAqLCBpbnQpLAotCSBpbnQgbW9kaWZpZWQpCisgICAgICAgICBpbnQgbW9kaWZpZWQpCiB7Ci0JUHlPYmplY3QgKmxpc3QsICp2OwotCWludCAqUFZidWZmZXI7Ci0JaW50IGxlbmd0aDsKLQlpbnQgaTsKLQlmbG9hdCBudW1iZXI7Ci0JCi0JQ2hlY2tDb21wcmVzc29yKHNlbGYpOworICAgIFB5T2JqZWN0ICpsaXN0LCAqdjsKKyAgICBpbnQgKlBWYnVmZmVyOworICAgIGludCBsZW5ndGg7CisgICAgaW50IGk7CisgICAgZmxvYXQgbnVtYmVyOwogCi0JaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiTyIsICZsaXN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFQeUxpc3RfQ2hlY2sobGlzdCkpIHsKLQkJUHlFcnJfQmFkQXJndW1lbnQoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWxlbmd0aCA9IFB5TGlzdF9TaXplKGxpc3QpOwotCVBWYnVmZmVyID0gUHlNZW1fTkVXKGludCwgbGVuZ3RoKTsKLQlpZiAoUFZidWZmZXIgPT0gTlVMTCkKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCXYgPSBQeUxpc3RfR2V0SXRlbShsaXN0LCBpKTsKLQkJaWYgKFB5RmxvYXRfQ2hlY2sodikpIHsKLQkJCW51bWJlciA9IFB5RmxvYXRfQXNEb3VibGUodik7Ci0JCQlQVmJ1ZmZlcltpXSA9IENMX1R5cGVJc0ludChudW1iZXIpOwotCQl9IGVsc2UgaWYgKFB5SW50X0NoZWNrKHYpKSB7Ci0JCQlQVmJ1ZmZlcltpXSA9IFB5SW50X0FzTG9uZyh2KTsKLQkJCWlmICgoaSAmIDEpICYmCi0JCQkgICAgcGFyYW1fdHlwZV9pc19mbG9hdChzZWxmLCBQVmJ1ZmZlcltpLTFdKSA+IDApIHsKLQkJCQludW1iZXIgPSBQVmJ1ZmZlcltpXTsKLQkJCQlQVmJ1ZmZlcltpXSA9IENMX1R5cGVJc0ludChudW1iZXIpOwotCQkJfQotCQl9IGVsc2UgewotCQkJUHlNZW1fREVMKFBWYnVmZmVyKTsKLQkJCVB5RXJyX0JhZEFyZ3VtZW50KCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KKyAgICBDaGVja0NvbXByZXNzb3Ioc2VsZik7CiAKLQllcnJvcl9oYW5kbGVyX2NhbGxlZCA9IDA7Ci0JKCpmdW5jKShzZWxmLT5vYl9jb21wcmVzc29ySGRsLCBQVmJ1ZmZlciwgbGVuZ3RoKTsKLQlpZiAoZXJyb3JfaGFuZGxlcl9jYWxsZWQpIHsKLQkJUHlNZW1fREVMKFBWYnVmZmVyKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJncywgIk8iLCAmbGlzdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHlMaXN0X0NoZWNrKGxpc3QpKSB7CisgICAgICAgIFB5RXJyX0JhZEFyZ3VtZW50KCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBsZW5ndGggPSBQeUxpc3RfU2l6ZShsaXN0KTsKKyAgICBQVmJ1ZmZlciA9IFB5TWVtX05FVyhpbnQsIGxlbmd0aCk7CisgICAgaWYgKFBWYnVmZmVyID09IE5VTEwpCisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworICAgICAgICB2ID0gUHlMaXN0X0dldEl0ZW0obGlzdCwgaSk7CisgICAgICAgIGlmIChQeUZsb2F0X0NoZWNrKHYpKSB7CisgICAgICAgICAgICBudW1iZXIgPSBQeUZsb2F0X0FzRG91YmxlKHYpOworICAgICAgICAgICAgUFZidWZmZXJbaV0gPSBDTF9UeXBlSXNJbnQobnVtYmVyKTsKKyAgICAgICAgfSBlbHNlIGlmIChQeUludF9DaGVjayh2KSkgeworICAgICAgICAgICAgUFZidWZmZXJbaV0gPSBQeUludF9Bc0xvbmcodik7CisgICAgICAgICAgICBpZiAoKGkgJiAxKSAmJgorICAgICAgICAgICAgICAgIHBhcmFtX3R5cGVfaXNfZmxvYXQoc2VsZiwgUFZidWZmZXJbaS0xXSkgPiAwKSB7CisgICAgICAgICAgICAgICAgbnVtYmVyID0gUFZidWZmZXJbaV07CisgICAgICAgICAgICAgICAgUFZidWZmZXJbaV0gPSBDTF9UeXBlSXNJbnQobnVtYmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFB5TWVtX0RFTChQVmJ1ZmZlcik7CisgICAgICAgICAgICBQeUVycl9CYWRBcmd1bWVudCgpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CiAKLQlpZiAobW9kaWZpZWQpIHsKLQkJZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoKGkgJiAxKSAmJgotCQkJICAgIHBhcmFtX3R5cGVfaXNfZmxvYXQoc2VsZiwgUFZidWZmZXJbaS0xXSkgPiAwKSB7Ci0JCQkJbnVtYmVyID0gQ0xfVHlwZUlzRmxvYXQoUFZidWZmZXJbaV0pOwotCQkJCXYgPSBQeUZsb2F0X0Zyb21Eb3VibGUobnVtYmVyKTsKLQkJCX0gZWxzZQotCQkJCXYgPSBQeUludF9Gcm9tTG9uZyhQVmJ1ZmZlcltpXSk7Ci0JCQlQeUxpc3RfU2V0SXRlbShsaXN0LCBpLCB2KTsKLQkJfQotCX0KKyAgICBlcnJvcl9oYW5kbGVyX2NhbGxlZCA9IDA7CisgICAgKCpmdW5jKShzZWxmLT5vYl9jb21wcmVzc29ySGRsLCBQVmJ1ZmZlciwgbGVuZ3RoKTsKKyAgICBpZiAoZXJyb3JfaGFuZGxlcl9jYWxsZWQpIHsKKyAgICAgICAgUHlNZW1fREVMKFBWYnVmZmVyKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JUHlNZW1fREVMKFBWYnVmZmVyKTsKKyAgICBpZiAobW9kaWZpZWQpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoKGkgJiAxKSAmJgorICAgICAgICAgICAgICAgIHBhcmFtX3R5cGVfaXNfZmxvYXQoc2VsZiwgUFZidWZmZXJbaS0xXSkgPiAwKSB7CisgICAgICAgICAgICAgICAgbnVtYmVyID0gQ0xfVHlwZUlzRmxvYXQoUFZidWZmZXJbaV0pOworICAgICAgICAgICAgICAgIHYgPSBQeUZsb2F0X0Zyb21Eb3VibGUobnVtYmVyKTsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIHYgPSBQeUludF9Gcm9tTG9uZyhQVmJ1ZmZlcltpXSk7CisgICAgICAgICAgICBQeUxpc3RfU2V0SXRlbShsaXN0LCBpLCB2KTsKKyAgICAgICAgfQorICAgIH0KIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeU1lbV9ERUwoUFZidWZmZXIpOworCisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY2xtX0dldFBhcmFtcyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGRvUGFyYW1zKFNFTEYsIGFyZ3MsIGNsR2V0UGFyYW1zLCAxKTsKKyAgICByZXR1cm4gZG9QYXJhbXMoU0VMRiwgYXJncywgY2xHZXRQYXJhbXMsIDEpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY2xtX1NldFBhcmFtcyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGRvUGFyYW1zKFNFTEYsIGFyZ3MsIGNsU2V0UGFyYW1zLCAwKTsKKyAgICByZXR1cm4gZG9QYXJhbXMoU0VMRiwgYXJncywgY2xTZXRQYXJhbXMsIDApOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZG9fZ2V0KGNsb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgaW50ICgqZnVuYykoQ0xfSGFuZGxlLCBpbnQpKQogewotCWludCBwYXJhbUlELCB2YWx1ZTsKLQlmbG9hdCBmdmFsdWU7CisgICAgaW50IHBhcmFtSUQsIHZhbHVlOworICAgIGZsb2F0IGZ2YWx1ZTsKIAotCUNoZWNrQ29tcHJlc3NvcihzZWxmKTsKKyAgICBDaGVja0NvbXByZXNzb3Ioc2VsZik7CiAKLQlpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICJpIiwgJnBhcmFtSUQpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICJpIiwgJnBhcmFtSUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWVycm9yX2hhbmRsZXJfY2FsbGVkID0gMDsKLQl2YWx1ZSA9ICgqZnVuYykoc2VsZi0+b2JfY29tcHJlc3NvckhkbCwgcGFyYW1JRCk7Ci0JaWYgKGVycm9yX2hhbmRsZXJfY2FsbGVkKQotCQlyZXR1cm4gTlVMTDsKKyAgICBlcnJvcl9oYW5kbGVyX2NhbGxlZCA9IDA7CisgICAgdmFsdWUgPSAoKmZ1bmMpKHNlbGYtPm9iX2NvbXByZXNzb3JIZGwsIHBhcmFtSUQpOworICAgIGlmIChlcnJvcl9oYW5kbGVyX2NhbGxlZCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAocGFyYW1fdHlwZV9pc19mbG9hdChzZWxmLCBwYXJhbUlEKSA+IDApIHsKLQkJZnZhbHVlID0gQ0xfVHlwZUlzRmxvYXQodmFsdWUpOwotCQlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKGZ2YWx1ZSk7Ci0JfQorICAgIGlmIChwYXJhbV90eXBlX2lzX2Zsb2F0KHNlbGYsIHBhcmFtSUQpID4gMCkgeworICAgICAgICBmdmFsdWUgPSBDTF9UeXBlSXNGbG9hdCh2YWx1ZSk7CisgICAgICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoZnZhbHVlKTsKKyAgICB9CiAKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcodmFsdWUpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyh2YWx1ZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjbG1fR2V0UGFyYW0oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBkb19nZXQoU0VMRiwgYXJncywgY2xHZXRQYXJhbSk7CisgICAgcmV0dXJuIGRvX2dldChTRUxGLCBhcmdzLCBjbEdldFBhcmFtKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNsbV9HZXREZWZhdWx0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gZG9fZ2V0KFNFTEYsIGFyZ3MsIGNsR2V0RGVmYXVsdCk7CisgICAgcmV0dXJuIGRvX2dldChTRUxGLCBhcmdzLCBjbEdldERlZmF1bHQpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY2xtX1NldFBhcmFtKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgcGFyYW1JRCwgdmFsdWU7Ci0JZmxvYXQgZnZhbHVlOworICAgIGludCBwYXJhbUlELCB2YWx1ZTsKKyAgICBmbG9hdCBmdmFsdWU7CiAKLQlDaGVja0NvbXByZXNzb3IoU0VMRik7CisgICAgQ2hlY2tDb21wcmVzc29yKFNFTEYpOwogCi0JaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiKGlpKSIsICZwYXJhbUlELCAmdmFsdWUpKSB7Ci0JCVB5RXJyX0NsZWFyKCk7Ci0JCWlmICghUHlBcmdfUGFyc2UoYXJncywgIihpZikiLCAmcGFyYW1JRCwgJmZ2YWx1ZSkpIHsKLQkJCVB5RXJyX0NsZWFyKCk7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJICAgICAgICJiYWQgYXJndW1lbnQgbGlzdCAoZm9ybWF0ICcoaWkpJyBvciAnKGlmKScpIik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQl2YWx1ZSA9IENMX1R5cGVJc0ludChmdmFsdWUpOwotCX0gZWxzZSB7Ci0JCWlmIChwYXJhbV90eXBlX2lzX2Zsb2F0KFNFTEYsIHBhcmFtSUQpID4gMCkgewotCQkJZnZhbHVlID0gdmFsdWU7Ci0JCQl2YWx1ZSA9IENMX1R5cGVJc0ludChmdmFsdWUpOwotCQl9Ci0JfQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJncywgIihpaSkiLCAmcGFyYW1JRCwgJnZhbHVlKSkgeworICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICIoaWYpIiwgJnBhcmFtSUQsICZmdmFsdWUpKSB7CisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAiYmFkIGFyZ3VtZW50IGxpc3QgKGZvcm1hdCAnKGlpKScgb3IgJyhpZiknKSIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgdmFsdWUgPSBDTF9UeXBlSXNJbnQoZnZhbHVlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAocGFyYW1fdHlwZV9pc19mbG9hdChTRUxGLCBwYXJhbUlEKSA+IDApIHsKKyAgICAgICAgICAgIGZ2YWx1ZSA9IHZhbHVlOworICAgICAgICAgICAgdmFsdWUgPSBDTF9UeXBlSXNJbnQoZnZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KIAotIAllcnJvcl9oYW5kbGVyX2NhbGxlZCA9IDA7Ci0JdmFsdWUgPSBjbFNldFBhcmFtKFNFTEYtPm9iX2NvbXByZXNzb3JIZGwsIHBhcmFtSUQsIHZhbHVlKTsKLQlpZiAoZXJyb3JfaGFuZGxlcl9jYWxsZWQpCi0JCXJldHVybiBOVUxMOworICAgIGVycm9yX2hhbmRsZXJfY2FsbGVkID0gMDsKKyAgICB2YWx1ZSA9IGNsU2V0UGFyYW0oU0VMRi0+b2JfY29tcHJlc3NvckhkbCwgcGFyYW1JRCwgdmFsdWUpOworICAgIGlmIChlcnJvcl9oYW5kbGVyX2NhbGxlZCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAocGFyYW1fdHlwZV9pc19mbG9hdChTRUxGLCBwYXJhbUlEKSA+IDApCi0JCXJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoQ0xfVHlwZUlzRmxvYXQodmFsdWUpKTsKLQllbHNlCi0JCXJldHVybiBQeUludF9Gcm9tTG9uZyh2YWx1ZSk7CisgICAgaWYgKHBhcmFtX3R5cGVfaXNfZmxvYXQoU0VMRiwgcGFyYW1JRCkgPiAwKQorICAgICAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKENMX1R5cGVJc0Zsb2F0KHZhbHVlKSk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcodmFsdWUpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY2xtX0dldFBhcmFtSUQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKm5hbWU7Ci0JaW50IHZhbHVlOworICAgIGNoYXIgKm5hbWU7CisgICAgaW50IHZhbHVlOwogCi0JQ2hlY2tDb21wcmVzc29yKFNFTEYpOworICAgIENoZWNrQ29tcHJlc3NvcihTRUxGKTsKIAotCWlmICghUHlBcmdfUGFyc2UoYXJncywgInMiLCAmbmFtZSkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2UoYXJncywgInMiLCAmbmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JZXJyb3JfaGFuZGxlcl9jYWxsZWQgPSAwOwotCXZhbHVlID0gY2xHZXRQYXJhbUlEKFNFTEYtPm9iX2NvbXByZXNzb3JIZGwsIG5hbWUpOwotCWlmICh2YWx1ZSA9PSBGQUlMVVJFIHx8IGVycm9yX2hhbmRsZXJfY2FsbGVkKSB7Ci0JCWlmICghZXJyb3JfaGFuZGxlcl9jYWxsZWQpCi0JCQlQeUVycl9TZXRTdHJpbmcoQ2xFcnJvciwgImdldHBhcmFtaWQgZmFpbGVkIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBlcnJvcl9oYW5kbGVyX2NhbGxlZCA9IDA7CisgICAgdmFsdWUgPSBjbEdldFBhcmFtSUQoU0VMRi0+b2JfY29tcHJlc3NvckhkbCwgbmFtZSk7CisgICAgaWYgKHZhbHVlID09IEZBSUxVUkUgfHwgZXJyb3JfaGFuZGxlcl9jYWxsZWQpIHsKKyAgICAgICAgaWYgKCFlcnJvcl9oYW5kbGVyX2NhbGxlZCkKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhDbEVycm9yLCAiZ2V0cGFyYW1pZCBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKHZhbHVlKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcodmFsdWUpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY2xtX1F1ZXJ5UGFyYW1zKFB5T2JqZWN0ICpzZWxmKQogewotCWludCBidWZmZXJsZW5ndGg7Ci0JaW50ICpQVmJ1ZmZlcjsKLQlQeU9iamVjdCAqbGlzdDsKLQlpbnQgaTsKKyAgICBpbnQgYnVmZmVybGVuZ3RoOworICAgIGludCAqUFZidWZmZXI7CisgICAgUHlPYmplY3QgKmxpc3Q7CisgICAgaW50IGk7CiAKLQlDaGVja0NvbXByZXNzb3IoU0VMRik7CisgICAgQ2hlY2tDb21wcmVzc29yKFNFTEYpOwogCi0JZXJyb3JfaGFuZGxlcl9jYWxsZWQgPSAwOwotCWJ1ZmZlcmxlbmd0aCA9IGNsUXVlcnlQYXJhbXMoU0VMRi0+b2JfY29tcHJlc3NvckhkbCwgMCwgMCk7Ci0JaWYgKGVycm9yX2hhbmRsZXJfY2FsbGVkKQotCQlyZXR1cm4gTlVMTDsKKyAgICBlcnJvcl9oYW5kbGVyX2NhbGxlZCA9IDA7CisgICAgYnVmZmVybGVuZ3RoID0gY2xRdWVyeVBhcmFtcyhTRUxGLT5vYl9jb21wcmVzc29ySGRsLCAwLCAwKTsKKyAgICBpZiAoZXJyb3JfaGFuZGxlcl9jYWxsZWQpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JUFZidWZmZXIgPSBQeU1lbV9ORVcoaW50LCBidWZmZXJsZW5ndGgpOwotCWlmIChQVmJ1ZmZlciA9PSBOVUxMKQotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICBQVmJ1ZmZlciA9IFB5TWVtX05FVyhpbnQsIGJ1ZmZlcmxlbmd0aCk7CisgICAgaWYgKFBWYnVmZmVyID09IE5VTEwpCisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOwogCi0JYnVmZmVybGVuZ3RoID0gY2xRdWVyeVBhcmFtcyhTRUxGLT5vYl9jb21wcmVzc29ySGRsLCBQVmJ1ZmZlciwKLQkJCQkgICAgIGJ1ZmZlcmxlbmd0aCk7Ci0JaWYgKGVycm9yX2hhbmRsZXJfY2FsbGVkKSB7Ci0JCVB5TWVtX0RFTChQVmJ1ZmZlcik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBidWZmZXJsZW5ndGggPSBjbFF1ZXJ5UGFyYW1zKFNFTEYtPm9iX2NvbXByZXNzb3JIZGwsIFBWYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVybGVuZ3RoKTsKKyAgICBpZiAoZXJyb3JfaGFuZGxlcl9jYWxsZWQpIHsKKyAgICAgICAgUHlNZW1fREVMKFBWYnVmZmVyKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JbGlzdCA9IFB5TGlzdF9OZXcoYnVmZmVybGVuZ3RoKTsKLQlpZiAobGlzdCA9PSBOVUxMKSB7Ci0JCVB5TWVtX0RFTChQVmJ1ZmZlcik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBsaXN0ID0gUHlMaXN0X05ldyhidWZmZXJsZW5ndGgpOworICAgIGlmIChsaXN0ID09IE5VTEwpIHsKKyAgICAgICAgUHlNZW1fREVMKFBWYnVmZmVyKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JZm9yIChpID0gMDsgaSA8IGJ1ZmZlcmxlbmd0aDsgaSsrKSB7Ci0JCWlmIChpICYgMSkKLQkJCVB5TGlzdF9TZXRJdGVtKGxpc3QsIGksIFB5SW50X0Zyb21Mb25nKFBWYnVmZmVyW2ldKSk7Ci0JCWVsc2UgaWYgKFBWYnVmZmVyW2ldID09IDApIHsKLQkJCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJCVB5TGlzdF9TZXRJdGVtKGxpc3QsIGksIFB5X05vbmUpOwotCQl9IGVsc2UKLQkJCVB5TGlzdF9TZXRJdGVtKGxpc3QsIGksCi0JCQkJICAgUHlTdHJpbmdfRnJvbVN0cmluZygoY2hhciAqKSBQVmJ1ZmZlcltpXSkpOwotCX0KKyAgICBmb3IgKGkgPSAwOyBpIDwgYnVmZmVybGVuZ3RoOyBpKyspIHsKKyAgICAgICAgaWYgKGkgJiAxKQorICAgICAgICAgICAgUHlMaXN0X1NldEl0ZW0obGlzdCwgaSwgUHlJbnRfRnJvbUxvbmcoUFZidWZmZXJbaV0pKTsKKyAgICAgICAgZWxzZSBpZiAoUFZidWZmZXJbaV0gPT0gMCkgeworICAgICAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICAgICAgUHlMaXN0X1NldEl0ZW0obGlzdCwgaSwgUHlfTm9uZSk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgUHlMaXN0X1NldEl0ZW0obGlzdCwgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfRnJvbVN0cmluZygoY2hhciAqKSBQVmJ1ZmZlcltpXSkpOworICAgIH0KIAotCVB5TWVtX0RFTChQVmJ1ZmZlcik7CisgICAgUHlNZW1fREVMKFBWYnVmZmVyKTsKIAotCXJldHVybiBsaXN0OworICAgIHJldHVybiBsaXN0OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY2xtX0dldE1pbk1heChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IHBhcmFtLCBtaW4sIG1heDsKLQlmbG9hdCBmbWluLCBmbWF4OworICAgIGludCBwYXJhbSwgbWluLCBtYXg7CisgICAgZmxvYXQgZm1pbiwgZm1heDsKIAotCUNoZWNrQ29tcHJlc3NvcihTRUxGKTsKKyAgICBDaGVja0NvbXByZXNzb3IoU0VMRik7CiAKLQlpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICJpIiwgJnBhcmFtKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiaSIsICZwYXJhbSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JY2xHZXRNaW5NYXgoU0VMRi0+b2JfY29tcHJlc3NvckhkbCwgcGFyYW0sICZtaW4sICZtYXgpOworICAgIGNsR2V0TWluTWF4KFNFTEYtPm9iX2NvbXByZXNzb3JIZGwsIHBhcmFtLCAmbWluLCAmbWF4KTsKIAotCWlmIChwYXJhbV90eXBlX2lzX2Zsb2F0KFNFTEYsIHBhcmFtKSA+IDApIHsKLQkJZm1pbiA9IENMX1R5cGVJc0Zsb2F0KG1pbik7Ci0JCWZtYXggPSBDTF9UeXBlSXNGbG9hdChtYXgpOwotCQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKGZmKSIsIGZtaW4sIGZtYXgpOwotCX0KKyAgICBpZiAocGFyYW1fdHlwZV9pc19mbG9hdChTRUxGLCBwYXJhbSkgPiAwKSB7CisgICAgICAgIGZtaW4gPSBDTF9UeXBlSXNGbG9hdChtaW4pOworICAgICAgICBmbWF4ID0gQ0xfVHlwZUlzRmxvYXQobWF4KTsKKyAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihmZikiLCBmbWluLCBmbWF4KTsKKyAgICB9CiAKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKGlpKSIsIG1pbiwgbWF4KTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKGlpKSIsIG1pbiwgbWF4KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNsbV9HZXROYW1lKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgcGFyYW07Ci0JY2hhciAqbmFtZTsKKyAgICBpbnQgcGFyYW07CisgICAgY2hhciAqbmFtZTsKIAotCUNoZWNrQ29tcHJlc3NvcihTRUxGKTsKKyAgICBDaGVja0NvbXByZXNzb3IoU0VMRik7CiAKLQlpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICJpIiwgJnBhcmFtKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiaSIsICZwYXJhbSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JZXJyb3JfaGFuZGxlcl9jYWxsZWQgPSAwOwotCW5hbWUgPSBjbEdldE5hbWUoU0VMRi0+b2JfY29tcHJlc3NvckhkbCwgcGFyYW0pOwotCWlmIChuYW1lID09IE5VTEwgfHwgZXJyb3JfaGFuZGxlcl9jYWxsZWQpIHsKLQkJaWYgKCFlcnJvcl9oYW5kbGVyX2NhbGxlZCkKLQkJCVB5RXJyX1NldFN0cmluZyhDbEVycm9yLCAiZ2V0bmFtZSBmYWlsZWQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGVycm9yX2hhbmRsZXJfY2FsbGVkID0gMDsKKyAgICBuYW1lID0gY2xHZXROYW1lKFNFTEYtPm9iX2NvbXByZXNzb3JIZGwsIHBhcmFtKTsKKyAgICBpZiAobmFtZSA9PSBOVUxMIHx8IGVycm9yX2hhbmRsZXJfY2FsbGVkKSB7CisgICAgICAgIGlmICghZXJyb3JfaGFuZGxlcl9jYWxsZWQpCisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQ2xFcnJvciwgImdldG5hbWUgZmFpbGVkIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKG5hbWUpOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKG5hbWUpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY2xtX1F1ZXJ5U2NoZW1lRnJvbUhhbmRsZShQeU9iamVjdCAqc2VsZikKIHsKLQlDaGVja0NvbXByZXNzb3IoU0VMRik7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKGNsUXVlcnlTY2hlbWVGcm9tSGFuZGxlKFNFTEYtPm9iX2NvbXByZXNzb3JIZGwpKTsKKyAgICBDaGVja0NvbXByZXNzb3IoU0VMRik7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKGNsUXVlcnlTY2hlbWVGcm9tSGFuZGxlKFNFTEYtPm9iX2NvbXByZXNzb3JIZGwpKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNsbV9SZWFkSGVhZGVyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpoZWFkZXI7Ci0JaW50IGhlYWRlclNpemU7CisgICAgY2hhciAqaGVhZGVyOworICAgIGludCBoZWFkZXJTaXplOwogCi0JQ2hlY2tDb21wcmVzc29yKFNFTEYpOworICAgIENoZWNrQ29tcHJlc3NvcihTRUxGKTsKIAotCWlmICghUHlBcmdfUGFyc2UoYXJncywgInMjIiwgJmhlYWRlciwgJmhlYWRlclNpemUpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICJzIyIsICZoZWFkZXIsICZoZWFkZXJTaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoY2xSZWFkSGVhZGVyKFNFTEYtPm9iX2NvbXByZXNzb3JIZGwsCi0JCQkJCSAgIGhlYWRlclNpemUsIGhlYWRlcikpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhjbFJlYWRIZWFkZXIoU0VMRi0+b2JfY29tcHJlc3NvckhkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlclNpemUsIGhlYWRlcikpOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgY29tcHJlc3Nvcl9tZXRob2RzW10gPSB7Ci0JeyJjbG9zZSIsCQljbG1fQ2xvc2VDb21wcmVzc29yLCBNRVRIX05PQVJHU30sIC8qIGFsaWFzICovCi0JeyJDbG9zZUNvbXByZXNzb3IiLAljbG1fQ2xvc2VDb21wcmVzc29yLCBNRVRIX05PQVJHU30sCi0JeyJDb21wcmVzcyIsCQljbG1fQ29tcHJlc3MsIE1FVEhfT0xEQVJHU30sCi0JeyJHZXREZWZhdWx0IiwJCWNsbV9HZXREZWZhdWx0LCBNRVRIX09MREFSR1N9LAotCXsiR2V0TWluTWF4IiwJCWNsbV9HZXRNaW5NYXgsIE1FVEhfT0xEQVJHU30sCi0JeyJHZXROYW1lIiwJCWNsbV9HZXROYW1lLCBNRVRIX09MREFSR1N9LAotCXsiR2V0UGFyYW0iLAkJY2xtX0dldFBhcmFtLCBNRVRIX09MREFSR1N9LAotCXsiR2V0UGFyYW1JRCIsCQljbG1fR2V0UGFyYW1JRCwgTUVUSF9PTERBUkdTfSwKLQl7IkdldFBhcmFtcyIsCQljbG1fR2V0UGFyYW1zLCBNRVRIX09MREFSR1N9LAotCXsiUXVlcnlQYXJhbXMiLAkJY2xtX1F1ZXJ5UGFyYW1zLCBNRVRIX05PQVJHU30sCi0JeyJRdWVyeVNjaGVtZUZyb21IYW5kbGUiLGNsbV9RdWVyeVNjaGVtZUZyb21IYW5kbGUsIE1FVEhfTk9BUkdTfSwKLQl7IlNldFBhcmFtIiwJCWNsbV9TZXRQYXJhbSwgTUVUSF9PTERBUkdTfSwKLQl7IlNldFBhcmFtcyIsCQljbG1fU2V0UGFyYW1zLCBNRVRIX09MREFSR1N9LAotCXtOVUxMLAkJCU5VTEx9CQkvKiBzZW50aW5lbCAqLworICAgIHsiY2xvc2UiLCAgICAgICAgICAgICAgICAgICBjbG1fQ2xvc2VDb21wcmVzc29yLCBNRVRIX05PQVJHU30sIC8qIGFsaWFzICovCisgICAgeyJDbG9zZUNvbXByZXNzb3IiLCAgICAgICAgIGNsbV9DbG9zZUNvbXByZXNzb3IsIE1FVEhfTk9BUkdTfSwKKyAgICB7IkNvbXByZXNzIiwgICAgICAgICAgICAgICAgY2xtX0NvbXByZXNzLCBNRVRIX09MREFSR1N9LAorICAgIHsiR2V0RGVmYXVsdCIsICAgICAgICAgICAgICBjbG1fR2V0RGVmYXVsdCwgTUVUSF9PTERBUkdTfSwKKyAgICB7IkdldE1pbk1heCIsICAgICAgICAgICAgICAgY2xtX0dldE1pbk1heCwgTUVUSF9PTERBUkdTfSwKKyAgICB7IkdldE5hbWUiLCAgICAgICAgICAgICAgICAgY2xtX0dldE5hbWUsIE1FVEhfT0xEQVJHU30sCisgICAgeyJHZXRQYXJhbSIsICAgICAgICAgICAgICAgIGNsbV9HZXRQYXJhbSwgTUVUSF9PTERBUkdTfSwKKyAgICB7IkdldFBhcmFtSUQiLCAgICAgICAgICAgICAgY2xtX0dldFBhcmFtSUQsIE1FVEhfT0xEQVJHU30sCisgICAgeyJHZXRQYXJhbXMiLCAgICAgICAgICAgICAgIGNsbV9HZXRQYXJhbXMsIE1FVEhfT0xEQVJHU30sCisgICAgeyJRdWVyeVBhcmFtcyIsICAgICAgICAgICAgIGNsbV9RdWVyeVBhcmFtcywgTUVUSF9OT0FSR1N9LAorICAgIHsiUXVlcnlTY2hlbWVGcm9tSGFuZGxlIixjbG1fUXVlcnlTY2hlbWVGcm9tSGFuZGxlLCBNRVRIX05PQVJHU30sCisgICAgeyJTZXRQYXJhbSIsICAgICAgICAgICAgICAgIGNsbV9TZXRQYXJhbSwgTUVUSF9PTERBUkdTfSwKKyAgICB7IlNldFBhcmFtcyIsICAgICAgICAgICAgICAgY2xtX1NldFBhcmFtcywgTUVUSF9PTERBUkdTfSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiBzdGF0aWMgUHlNZXRob2REZWYgZGVjb21wcmVzc29yX21ldGhvZHNbXSA9IHsKLQl7ImNsb3NlIiwJCWNsbV9DbG9zZURlY29tcHJlc3NvciwgTUVUSF9OT0FSR1N9LAkvKiBhbGlhcyAqLwotCXsiQ2xvc2VEZWNvbXByZXNzb3IiLAljbG1fQ2xvc2VEZWNvbXByZXNzb3IsIE1FVEhfTk9BUkdTfSwKLQl7IkRlY29tcHJlc3MiLAkJY2xtX0RlY29tcHJlc3MsIE1FVEhfT0xEQVJHU30sCi0JeyJHZXREZWZhdWx0IiwJCWNsbV9HZXREZWZhdWx0LCBNRVRIX09MREFSR1N9LAotCXsiR2V0TWluTWF4IiwJCWNsbV9HZXRNaW5NYXgsIE1FVEhfT0xEQVJHU30sCi0JeyJHZXROYW1lIiwJCWNsbV9HZXROYW1lLCBNRVRIX09MREFSR1N9LAotCXsiR2V0UGFyYW0iLAkJY2xtX0dldFBhcmFtLCBNRVRIX09MREFSR1N9LAotCXsiR2V0UGFyYW1JRCIsCQljbG1fR2V0UGFyYW1JRCwgTUVUSF9PTERBUkdTfSwKLQl7IkdldFBhcmFtcyIsCQljbG1fR2V0UGFyYW1zLCBNRVRIX09MREFSR1N9LAotCXsiUmVhZEhlYWRlciIsCQljbG1fUmVhZEhlYWRlciwgTUVUSF9PTERBUkdTfSwKLQl7IlF1ZXJ5UGFyYW1zIiwJCWNsbV9RdWVyeVBhcmFtcywgTUVUSF9OT0FSR1N9LAotCXsiUXVlcnlTY2hlbWVGcm9tSGFuZGxlIixjbG1fUXVlcnlTY2hlbWVGcm9tSGFuZGxlLCBNRVRIX05PQVJHU30sCi0JeyJTZXRQYXJhbSIsCQljbG1fU2V0UGFyYW0sIE1FVEhfT0xEQVJHU30sCi0JeyJTZXRQYXJhbXMiLAkJY2xtX1NldFBhcmFtcywgTUVUSF9PTERBUkdTfSwKLQl7TlVMTCwJCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7ImNsb3NlIiwgICAgICAgICAgICAgICAgICAgY2xtX0Nsb3NlRGVjb21wcmVzc29yLCBNRVRIX05PQVJHU30sICAgIC8qIGFsaWFzICovCisgICAgeyJDbG9zZURlY29tcHJlc3NvciIsICAgICAgIGNsbV9DbG9zZURlY29tcHJlc3NvciwgTUVUSF9OT0FSR1N9LAorICAgIHsiRGVjb21wcmVzcyIsICAgICAgICAgICAgICBjbG1fRGVjb21wcmVzcywgTUVUSF9PTERBUkdTfSwKKyAgICB7IkdldERlZmF1bHQiLCAgICAgICAgICAgICAgY2xtX0dldERlZmF1bHQsIE1FVEhfT0xEQVJHU30sCisgICAgeyJHZXRNaW5NYXgiLCAgICAgICAgICAgICAgIGNsbV9HZXRNaW5NYXgsIE1FVEhfT0xEQVJHU30sCisgICAgeyJHZXROYW1lIiwgICAgICAgICAgICAgICAgIGNsbV9HZXROYW1lLCBNRVRIX09MREFSR1N9LAorICAgIHsiR2V0UGFyYW0iLCAgICAgICAgICAgICAgICBjbG1fR2V0UGFyYW0sIE1FVEhfT0xEQVJHU30sCisgICAgeyJHZXRQYXJhbUlEIiwgICAgICAgICAgICAgIGNsbV9HZXRQYXJhbUlELCBNRVRIX09MREFSR1N9LAorICAgIHsiR2V0UGFyYW1zIiwgICAgICAgICAgICAgICBjbG1fR2V0UGFyYW1zLCBNRVRIX09MREFSR1N9LAorICAgIHsiUmVhZEhlYWRlciIsICAgICAgICAgICAgICBjbG1fUmVhZEhlYWRlciwgTUVUSF9PTERBUkdTfSwKKyAgICB7IlF1ZXJ5UGFyYW1zIiwgICAgICAgICAgICAgY2xtX1F1ZXJ5UGFyYW1zLCBNRVRIX05PQVJHU30sCisgICAgeyJRdWVyeVNjaGVtZUZyb21IYW5kbGUiLGNsbV9RdWVyeVNjaGVtZUZyb21IYW5kbGUsIE1FVEhfTk9BUkdTfSwKKyAgICB7IlNldFBhcmFtIiwgICAgICAgICAgICAgICAgY2xtX1NldFBhcmFtLCBNRVRIX09MREFSR1N9LAorICAgIHsiU2V0UGFyYW1zIiwgICAgICAgICAgICAgICBjbG1fU2V0UGFyYW1zLCBNRVRIX09MREFSR1N9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIHN0YXRpYyB2b2lkCiBjbF9kZWFsbG9jKFB5T2JqZWN0ICpzZWxmKQogewotCWlmIChTRUxGLT5vYl9jb21wcmVzc29ySGRsKSB7Ci0JCWlmIChTRUxGLT5vYl9pc0NvbXByZXNzb3IpCi0JCQljbENsb3NlQ29tcHJlc3NvcihTRUxGLT5vYl9jb21wcmVzc29ySGRsKTsKLQkJZWxzZQotCQkJY2xDbG9zZURlY29tcHJlc3NvcihTRUxGLT5vYl9jb21wcmVzc29ySGRsKTsKLQl9Ci0JUHlPYmplY3RfRGVsKHNlbGYpOworICAgIGlmIChTRUxGLT5vYl9jb21wcmVzc29ySGRsKSB7CisgICAgICAgIGlmIChTRUxGLT5vYl9pc0NvbXByZXNzb3IpCisgICAgICAgICAgICBjbENsb3NlQ29tcHJlc3NvcihTRUxGLT5vYl9jb21wcmVzc29ySGRsKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgY2xDbG9zZURlY29tcHJlc3NvcihTRUxGLT5vYl9jb21wcmVzc29ySGRsKTsKKyAgICB9CisgICAgUHlPYmplY3RfRGVsKHNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY2xfZ2V0YXR0cihQeU9iamVjdCAqc2VsZiwgY2hhciAqbmFtZSkKIHsKLQlpZiAoU0VMRi0+b2JfaXNDb21wcmVzc29yKQotCQlyZXR1cm4gUHlfRmluZE1ldGhvZChjb21wcmVzc29yX21ldGhvZHMsIHNlbGYsIG5hbWUpOwotCWVsc2UKLQkJcmV0dXJuIFB5X0ZpbmRNZXRob2QoZGVjb21wcmVzc29yX21ldGhvZHMsIHNlbGYsIG5hbWUpOworICAgIGlmIChTRUxGLT5vYl9pc0NvbXByZXNzb3IpCisgICAgICAgIHJldHVybiBQeV9GaW5kTWV0aG9kKGNvbXByZXNzb3JfbWV0aG9kcywgc2VsZiwgbmFtZSk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gUHlfRmluZE1ldGhvZChkZWNvbXByZXNzb3JfbWV0aG9kcywgc2VsZiwgbmFtZSk7CiB9CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgQ2x0eXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUpCi0JMCwJCQkvKm9iX3NpemUqLwotCSJjbC5jbCIsCQkvKnRwX25hbWUqLwotCXNpemVvZihjbG9iamVjdCksCS8qdHBfc2l6ZSovCi0JMCwJCQkvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpY2xfZGVhbGxvYywJLyp0cF9kZWFsbG9jKi8KLQkwLAkJCS8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYyljbF9nZXRhdHRyLCAvKnRwX2dldGF0dHIqLwotCTAsCQkJLyp0cF9zZXRhdHRyKi8KLQkwLAkJCS8qdHBfY29tcGFyZSovCi0JMCwJCQkvKnRwX3JlcHIqLwotCTAsCQkJLyp0cF9hc19udW1iZXIqLwotCTAsCQkJLyp0cF9hc19zZXF1ZW5jZSovCi0JMCwJCQkvKnRwX2FzX21hcHBpbmcqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUpCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb2Jfc2l6ZSovCisgICAgImNsLmNsIiwgICAgICAgICAgICAgICAgICAgIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKGNsb2JqZWN0KSwgICAgICAgICAgIC8qdHBfc2l6ZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvciljbF9kZWFsbG9jLCAgICAgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKWNsX2dldGF0dHIsIC8qdHBfZ2V0YXR0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc2V0YXR0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY29tcGFyZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmVwciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbnVtYmVyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19zZXF1ZW5jZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbWFwcGluZyovCiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKgogZG9PcGVuKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgaW50ICgqb3Blbl9mdW5jKShpbnQsIENMX0hhbmRsZSAqKSwKICAgICAgICBpbnQgaXNjb21wcmVzc29yKQogewotCWludCBzY2hlbWU7Ci0JY2xvYmplY3QgKm5ldzsKKyAgICBpbnQgc2NoZW1lOworICAgIGNsb2JqZWN0ICpuZXc7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImkiLCAmc2NoZW1lKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpIiwgJnNjaGVtZSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JbmV3ID0gUHlPYmplY3RfTmV3KGNsb2JqZWN0LCAmQ2x0eXBlKTsKLQlpZiAobmV3ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIG5ldyA9IFB5T2JqZWN0X05ldyhjbG9iamVjdCwgJkNsdHlwZSk7CisgICAgaWYgKG5ldyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCW5ldy0+b2JfY29tcHJlc3NvckhkbCA9IE5VTEw7Ci0JbmV3LT5vYl9pc0NvbXByZXNzb3IgPSBpc2NvbXByZXNzb3I7Ci0JbmV3LT5vYl9wYXJhbXR5cGVzID0gTlVMTDsKKyAgICBuZXctPm9iX2NvbXByZXNzb3JIZGwgPSBOVUxMOworICAgIG5ldy0+b2JfaXNDb21wcmVzc29yID0gaXNjb21wcmVzc29yOworICAgIG5ldy0+b2JfcGFyYW10eXBlcyA9IE5VTEw7CiAKLQllcnJvcl9oYW5kbGVyX2NhbGxlZCA9IDA7Ci0JaWYgKCgqb3Blbl9mdW5jKShzY2hlbWUsICZuZXctPm9iX2NvbXByZXNzb3JIZGwpID09IEZBSUxVUkUgfHwKLQkgICAgZXJyb3JfaGFuZGxlcl9jYWxsZWQpIHsKLQkJUHlfREVDUkVGKG5ldyk7Ci0JCWlmICghZXJyb3JfaGFuZGxlcl9jYWxsZWQpCi0JCQlQeUVycl9TZXRTdHJpbmcoQ2xFcnJvciwgIk9wZW4oRGUpQ29tcHJlc3NvciBmYWlsZWQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiAoUHlPYmplY3QgKiluZXc7CisgICAgZXJyb3JfaGFuZGxlcl9jYWxsZWQgPSAwOworICAgIGlmICgoKm9wZW5fZnVuYykoc2NoZW1lLCAmbmV3LT5vYl9jb21wcmVzc29ySGRsKSA9PSBGQUlMVVJFIHx8CisgICAgICAgIGVycm9yX2hhbmRsZXJfY2FsbGVkKSB7CisgICAgICAgIFB5X0RFQ1JFRihuZXcpOworICAgICAgICBpZiAoIWVycm9yX2hhbmRsZXJfY2FsbGVkKQorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKENsRXJyb3IsICJPcGVuKERlKUNvbXByZXNzb3IgZmFpbGVkIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gKFB5T2JqZWN0ICopbmV3OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY2xfT3BlbkNvbXByZXNzb3IoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBkb09wZW4oc2VsZiwgYXJncywgY2xPcGVuQ29tcHJlc3NvciwgMSk7CisgICAgcmV0dXJuIGRvT3BlbihzZWxmLCBhcmdzLCBjbE9wZW5Db21wcmVzc29yLCAxKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNsX09wZW5EZWNvbXByZXNzb3IoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBkb09wZW4oc2VsZiwgYXJncywgY2xPcGVuRGVjb21wcmVzc29yLCAwKTsKKyAgICByZXR1cm4gZG9PcGVuKHNlbGYsIGFyZ3MsIGNsT3BlbkRlY29tcHJlc3NvciwgMCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjbF9RdWVyeVNjaGVtZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqaGVhZGVyOwotCWludCBoZWFkZXJsZW47Ci0JaW50IHNjaGVtZTsKKyAgICBjaGFyICpoZWFkZXI7CisgICAgaW50IGhlYWRlcmxlbjsKKyAgICBpbnQgc2NoZW1lOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIyIsICZoZWFkZXIsICZoZWFkZXJsZW4pKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjIiwgJmhlYWRlciwgJmhlYWRlcmxlbikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0Jc2NoZW1lID0gY2xRdWVyeVNjaGVtZShoZWFkZXIpOwotCWlmIChzY2hlbWUgPCAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhDbEVycm9yLCAidW5rbm93biBjb21wcmVzc2lvbiBzY2hlbWUiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIHNjaGVtZSA9IGNsUXVlcnlTY2hlbWUoaGVhZGVyKTsKKyAgICBpZiAoc2NoZW1lIDwgMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoQ2xFcnJvciwgInVua25vd24gY29tcHJlc3Npb24gc2NoZW1lIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXJldHVybiBQeUludF9Gcm9tTG9uZyhzY2hlbWUpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhzY2hlbWUpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY2xfUXVlcnlNYXhIZWFkZXJTaXplKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgc2NoZW1lOworICAgIGludCBzY2hlbWU7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImkiLCAmc2NoZW1lKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpIiwgJnNjaGVtZSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKGNsUXVlcnlNYXhIZWFkZXJTaXplKHNjaGVtZSkpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhjbFF1ZXJ5TWF4SGVhZGVyU2l6ZShzY2hlbWUpKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNsX1F1ZXJ5QWxnb3JpdGhtcyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IGFsZ29yaXRobU1lZGlhVHlwZTsKLQlpbnQgYnVmZmVybGVuZ3RoOwotCWludCAqUFZidWZmZXI7Ci0JUHlPYmplY3QgKmxpc3Q7Ci0JaW50IGk7CisgICAgaW50IGFsZ29yaXRobU1lZGlhVHlwZTsKKyAgICBpbnQgYnVmZmVybGVuZ3RoOworICAgIGludCAqUFZidWZmZXI7CisgICAgUHlPYmplY3QgKmxpc3Q7CisgICAgaW50IGk7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImkiLCAmYWxnb3JpdGhtTWVkaWFUeXBlKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpIiwgJmFsZ29yaXRobU1lZGlhVHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JZXJyb3JfaGFuZGxlcl9jYWxsZWQgPSAwOwotCWJ1ZmZlcmxlbmd0aCA9IGNsUXVlcnlBbGdvcml0aG1zKGFsZ29yaXRobU1lZGlhVHlwZSwgMCwgMCk7Ci0JaWYgKGVycm9yX2hhbmRsZXJfY2FsbGVkKQotCQlyZXR1cm4gTlVMTDsKKyAgICBlcnJvcl9oYW5kbGVyX2NhbGxlZCA9IDA7CisgICAgYnVmZmVybGVuZ3RoID0gY2xRdWVyeUFsZ29yaXRobXMoYWxnb3JpdGhtTWVkaWFUeXBlLCAwLCAwKTsKKyAgICBpZiAoZXJyb3JfaGFuZGxlcl9jYWxsZWQpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JUFZidWZmZXIgPSBQeU1lbV9ORVcoaW50LCBidWZmZXJsZW5ndGgpOwotCWlmIChQVmJ1ZmZlciA9PSBOVUxMKQotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICBQVmJ1ZmZlciA9IFB5TWVtX05FVyhpbnQsIGJ1ZmZlcmxlbmd0aCk7CisgICAgaWYgKFBWYnVmZmVyID09IE5VTEwpCisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOwogCi0JYnVmZmVybGVuZ3RoID0gY2xRdWVyeUFsZ29yaXRobXMoYWxnb3JpdGhtTWVkaWFUeXBlLCBQVmJ1ZmZlciwKLQkJCQkJIGJ1ZmZlcmxlbmd0aCk7Ci0JaWYgKGVycm9yX2hhbmRsZXJfY2FsbGVkKSB7Ci0JCVB5TWVtX0RFTChQVmJ1ZmZlcik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBidWZmZXJsZW5ndGggPSBjbFF1ZXJ5QWxnb3JpdGhtcyhhbGdvcml0aG1NZWRpYVR5cGUsIFBWYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcmxlbmd0aCk7CisgICAgaWYgKGVycm9yX2hhbmRsZXJfY2FsbGVkKSB7CisgICAgICAgIFB5TWVtX0RFTChQVmJ1ZmZlcik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWxpc3QgPSBQeUxpc3RfTmV3KGJ1ZmZlcmxlbmd0aCk7Ci0JaWYgKGxpc3QgPT0gTlVMTCkgewotCQlQeU1lbV9ERUwoUFZidWZmZXIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgbGlzdCA9IFB5TGlzdF9OZXcoYnVmZmVybGVuZ3RoKTsKKyAgICBpZiAobGlzdCA9PSBOVUxMKSB7CisgICAgICAgIFB5TWVtX0RFTChQVmJ1ZmZlcik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWZvciAoaSA9IDA7IGkgPCBidWZmZXJsZW5ndGg7IGkrKykgewotCQlpZiAoaSAmIDEpCi0JCQlQeUxpc3RfU2V0SXRlbShsaXN0LCBpLCBQeUludF9Gcm9tTG9uZyhQVmJ1ZmZlcltpXSkpOwotCQllbHNlIGlmIChQVmJ1ZmZlcltpXSA9PSAwKSB7Ci0JCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCQlQeUxpc3RfU2V0SXRlbShsaXN0LCBpLCBQeV9Ob25lKTsKLQkJfSBlbHNlCi0JCQlQeUxpc3RfU2V0SXRlbShsaXN0LCBpLAotCQkJCSAgIFB5U3RyaW5nX0Zyb21TdHJpbmcoKGNoYXIgKikgUFZidWZmZXJbaV0pKTsKLQl9CisgICAgZm9yIChpID0gMDsgaSA8IGJ1ZmZlcmxlbmd0aDsgaSsrKSB7CisgICAgICAgIGlmIChpICYgMSkKKyAgICAgICAgICAgIFB5TGlzdF9TZXRJdGVtKGxpc3QsIGksIFB5SW50X0Zyb21Mb25nKFBWYnVmZmVyW2ldKSk7CisgICAgICAgIGVsc2UgaWYgKFBWYnVmZmVyW2ldID09IDApIHsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgICAgIFB5TGlzdF9TZXRJdGVtKGxpc3QsIGksIFB5X05vbmUpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIFB5TGlzdF9TZXRJdGVtKGxpc3QsIGksCisgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0Zyb21TdHJpbmcoKGNoYXIgKikgUFZidWZmZXJbaV0pKTsKKyAgICB9CiAKLQlQeU1lbV9ERUwoUFZidWZmZXIpOworICAgIFB5TWVtX0RFTChQVmJ1ZmZlcik7CiAKLQlyZXR1cm4gbGlzdDsKKyAgICByZXR1cm4gbGlzdDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNsX1F1ZXJ5U2NoZW1lRnJvbU5hbWUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBhbGdvcml0aG1NZWRpYVR5cGU7Ci0JY2hhciAqbmFtZTsKLQlpbnQgc2NoZW1lOworICAgIGludCBhbGdvcml0aG1NZWRpYVR5cGU7CisgICAgY2hhciAqbmFtZTsKKyAgICBpbnQgc2NoZW1lOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpcyIsICZhbGdvcml0aG1NZWRpYVR5cGUsICZuYW1lKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpcyIsICZhbGdvcml0aG1NZWRpYVR5cGUsICZuYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQllcnJvcl9oYW5kbGVyX2NhbGxlZCA9IDA7Ci0Jc2NoZW1lID0gY2xRdWVyeVNjaGVtZUZyb21OYW1lKGFsZ29yaXRobU1lZGlhVHlwZSwgbmFtZSk7Ci0JaWYgKGVycm9yX2hhbmRsZXJfY2FsbGVkKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhDbEVycm9yLCAidW5rbm93biBjb21wcmVzc2lvbiBzY2hlbWUiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGVycm9yX2hhbmRsZXJfY2FsbGVkID0gMDsKKyAgICBzY2hlbWUgPSBjbFF1ZXJ5U2NoZW1lRnJvbU5hbWUoYWxnb3JpdGhtTWVkaWFUeXBlLCBuYW1lKTsKKyAgICBpZiAoZXJyb3JfaGFuZGxlcl9jYWxsZWQpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKENsRXJyb3IsICJ1bmtub3duIGNvbXByZXNzaW9uIHNjaGVtZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoc2NoZW1lKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoc2NoZW1lKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNsX0dldEFsZ29yaXRobU5hbWUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBzY2hlbWU7Ci0JY2hhciAqbmFtZTsKKyAgICBpbnQgc2NoZW1lOworICAgIGNoYXIgKm5hbWU7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImkiLCAmc2NoZW1lKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpIiwgJnNjaGVtZSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JbmFtZSA9IGNsR2V0QWxnb3JpdGhtTmFtZShzY2hlbWUpOwotCWlmIChuYW1lID09IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKENsRXJyb3IsICJ1bmtub3duIGNvbXByZXNzaW9uIHNjaGVtZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgbmFtZSA9IGNsR2V0QWxnb3JpdGhtTmFtZShzY2hlbWUpOworICAgIGlmIChuYW1lID09IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKENsRXJyb3IsICJ1bmtub3duIGNvbXByZXNzaW9uIHNjaGVtZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhuYW1lKTsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhuYW1lKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRvX3NldChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIGludCAoKmZ1bmMpKGludCwgaW50LCBpbnQpKQogewotCWludCBzY2hlbWUsIHBhcmFtSUQsIHZhbHVlOwotCWZsb2F0IGZ2YWx1ZTsKLQlpbnQgaXNfZmxvYXQgPSAwOworICAgIGludCBzY2hlbWUsIHBhcmFtSUQsIHZhbHVlOworICAgIGZsb2F0IGZ2YWx1ZTsKKyAgICBpbnQgaXNfZmxvYXQgPSAwOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpaWkiLCAmc2NoZW1lLCAmcGFyYW1JRCwgJnZhbHVlKSkgewotCQlQeUVycl9DbGVhcigpOwotCQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpZiIsICZzY2hlbWUsICZwYXJhbUlELCAmZnZhbHVlKSkgewotCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgICJiYWQgYXJndW1lbnQgbGlzdCAoZm9ybWF0ICcoaWlpKScgb3IgJyhpaWYpJykiKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCXZhbHVlID0gQ0xfVHlwZUlzSW50KGZ2YWx1ZSk7Ci0JCWlzX2Zsb2F0ID0gMTsKLQl9IGVsc2UgewotCQkvKiBjaGVjayBzb21lIHBhcmFtZXRlcnMgd2hpY2ggd2Uga25vdyB0byBiZSBmbG9hdHMgKi8KLQkJc3dpdGNoIChzY2hlbWUpIHsKLQkJY2FzZSBDTF9DT01QUkVTU0lPTl9SQVRJTzoKLQkJY2FzZSBDTF9TUEVFRDoKLQkJCWZ2YWx1ZSA9IHZhbHVlOwotCQkJdmFsdWUgPSBDTF9UeXBlSXNJbnQoZnZhbHVlKTsKLQkJCWlzX2Zsb2F0ID0gMTsKLQkJCWJyZWFrOwotCQl9Ci0JfQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaWlpIiwgJnNjaGVtZSwgJnBhcmFtSUQsICZ2YWx1ZSkpIHsKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpaWYiLCAmc2NoZW1lLCAmcGFyYW1JRCwgJmZ2YWx1ZSkpIHsKKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAiYmFkIGFyZ3VtZW50IGxpc3QgKGZvcm1hdCAnKGlpaSknIG9yICcoaWlmKScpIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICB2YWx1ZSA9IENMX1R5cGVJc0ludChmdmFsdWUpOworICAgICAgICBpc19mbG9hdCA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogY2hlY2sgc29tZSBwYXJhbWV0ZXJzIHdoaWNoIHdlIGtub3cgdG8gYmUgZmxvYXRzICovCisgICAgICAgIHN3aXRjaCAoc2NoZW1lKSB7CisgICAgICAgIGNhc2UgQ0xfQ09NUFJFU1NJT05fUkFUSU86CisgICAgICAgIGNhc2UgQ0xfU1BFRUQ6CisgICAgICAgICAgICBmdmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgICAgIHZhbHVlID0gQ0xfVHlwZUlzSW50KGZ2YWx1ZSk7CisgICAgICAgICAgICBpc19mbG9hdCA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KIAotIAllcnJvcl9oYW5kbGVyX2NhbGxlZCA9IDA7Ci0JdmFsdWUgPSAoKmZ1bmMpKHNjaGVtZSwgcGFyYW1JRCwgdmFsdWUpOwotCWlmIChlcnJvcl9oYW5kbGVyX2NhbGxlZCkKLQkJcmV0dXJuIE5VTEw7CisgICAgZXJyb3JfaGFuZGxlcl9jYWxsZWQgPSAwOworICAgIHZhbHVlID0gKCpmdW5jKShzY2hlbWUsIHBhcmFtSUQsIHZhbHVlKTsKKyAgICBpZiAoZXJyb3JfaGFuZGxlcl9jYWxsZWQpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKGlzX2Zsb2F0KQotCQlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKENMX1R5cGVJc0Zsb2F0KHZhbHVlKSk7Ci0JZWxzZQotCQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcodmFsdWUpOworICAgIGlmIChpc19mbG9hdCkKKyAgICAgICAgcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShDTF9UeXBlSXNGbG9hdCh2YWx1ZSkpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHZhbHVlKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNsX1NldERlZmF1bHQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBkb19zZXQoc2VsZiwgYXJncywgY2xTZXREZWZhdWx0KTsKKyAgICByZXR1cm4gZG9fc2V0KHNlbGYsIGFyZ3MsIGNsU2V0RGVmYXVsdCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjbF9TZXRNaW4oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBkb19zZXQoc2VsZiwgYXJncywgY2xTZXRNaW4pOworICAgIHJldHVybiBkb19zZXQoc2VsZiwgYXJncywgY2xTZXRNaW4pOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY2xfU2V0TWF4KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gZG9fc2V0KHNlbGYsIGFyZ3MsIGNsU2V0TWF4KTsKKyAgICByZXR1cm4gZG9fc2V0KHNlbGYsIGFyZ3MsIGNsU2V0TWF4KTsKIH0KIAotI2RlZmluZSBmdW5jKG5hbWUsIGhhbmRsZXIpCVwKKyNkZWZpbmUgZnVuYyhuYW1lLCBoYW5kbGVyKSAgICAgXAogc3RhdGljIFB5T2JqZWN0ICpjbF8jI25hbWUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKSBcCiB7IFwKLQkgIGludCB4OyBcCi0JICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImkiLCAmeCkpIHJldHVybiBOVUxMOyBcCi0JICByZXR1cm4gUHkjI2hhbmRsZXIoQ0xfIyNuYW1lKHgpKTsgXAorICAgICAgICAgIGludCB4OyBcCisgICAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpIiwgJngpKSByZXR1cm4gTlVMTDsgXAorICAgICAgICAgIHJldHVybiBQeSMjaGFuZGxlcihDTF8jI25hbWUoeCkpOyBcCiB9CiAKLSNkZWZpbmUgZnVuYzIobmFtZSwgaGFuZGxlcikJXAorI2RlZmluZSBmdW5jMihuYW1lLCBoYW5kbGVyKSAgICBcCiBzdGF0aWMgUHlPYmplY3QgKmNsXyMjbmFtZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpIFwKIHsgXAotCSAgaW50IGExLCBhMjsgXAotCSAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpaSIsICZhMSwgJmEyKSkgcmV0dXJuIE5VTEw7IFwKLQkgIHJldHVybiBQeSMjaGFuZGxlcihDTF8jI25hbWUoYTEsIGEyKSk7IFwKKyAgICAgICAgICBpbnQgYTEsIGEyOyBcCisgICAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpaSIsICZhMSwgJmEyKSkgcmV0dXJuIE5VTEw7IFwKKyAgICAgICAgICByZXR1cm4gUHkjI2hhbmRsZXIoQ0xfIyNuYW1lKGExLCBhMikpOyBcCiB9CiAKIGZ1bmMoQnl0ZXNQZXJTYW1wbGUsIEludF9Gcm9tTG9uZykKQEAgLTkwNyw1MCArOTA3LDUwIEBACiBmdW5jMihQYXJhbUlELCBJbnRfRnJvbUxvbmcpCiAKICNpZmRlZiBDTERFQlVHCi0Jc3RhdGljIFB5T2JqZWN0ICoKKyAgICBzdGF0aWMgUHlPYmplY3QgKgogY3Z0X3R5cGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBudW1iZXI7Ci0JZmxvYXQgZm51bWJlcjsKKyAgICBpbnQgbnVtYmVyOworICAgIGZsb2F0IGZudW1iZXI7CiAKLQlpZiAoUHlBcmdfUGFyc2UoYXJncywgImkiLCAmbnVtYmVyKSkKLQkJcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShDTF9UeXBlSXNGbG9hdChudW1iZXIpKTsKLQllbHNlIHsKLQkJUHlFcnJfQ2xlYXIoKTsKLQkJaWYgKFB5QXJnX1BhcnNlKGFyZ3MsICJmIiwgJmZudW1iZXIpKQotCQkJcmV0dXJuIFB5SW50X0Zyb21Mb25nKENMX1R5cGVJc0ludChmbnVtYmVyKSk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoUHlBcmdfUGFyc2UoYXJncywgImkiLCAmbnVtYmVyKSkKKyAgICAgICAgcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShDTF9UeXBlSXNGbG9hdChudW1iZXIpKTsKKyAgICBlbHNlIHsKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgaWYgKFB5QXJnX1BhcnNlKGFyZ3MsICJmIiwgJmZudW1iZXIpKQorICAgICAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKENMX1R5cGVJc0ludChmbnVtYmVyKSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIH0KICNlbmRpZgogCiBzdGF0aWMgUHlNZXRob2REZWYgY2xfbWV0aG9kc1tdID0gewotCXsiQ29tcHJlc3NJbWFnZSIsCWNsX0NvbXByZXNzSW1hZ2UsIE1FVEhfVkFSQVJHU30sCi0JeyJEZWNvbXByZXNzSW1hZ2UiLAljbF9EZWNvbXByZXNzSW1hZ2UsIE1FVEhfVkFSQVJHU30sCi0JeyJHZXRBbGdvcml0aG1OYW1lIiwJY2xfR2V0QWxnb3JpdGhtTmFtZSwgTUVUSF9WQVJBUkdTfSwKLQl7Ik9wZW5Db21wcmVzc29yIiwJY2xfT3BlbkNvbXByZXNzb3IsIE1FVEhfVkFSQVJHU30sCi0JeyJPcGVuRGVjb21wcmVzc29yIiwJY2xfT3BlbkRlY29tcHJlc3NvciwgTUVUSF9WQVJBUkdTfSwKLQl7IlF1ZXJ5QWxnb3JpdGhtcyIsCWNsX1F1ZXJ5QWxnb3JpdGhtcywgTUVUSF9WQVJBUkdTfSwKLQl7IlF1ZXJ5TWF4SGVhZGVyU2l6ZSIsCWNsX1F1ZXJ5TWF4SGVhZGVyU2l6ZSwgTUVUSF9WQVJBUkdTfSwKLQl7IlF1ZXJ5U2NoZW1lIiwJCWNsX1F1ZXJ5U2NoZW1lLCBNRVRIX1ZBUkFSR1N9LAotCXsiUXVlcnlTY2hlbWVGcm9tTmFtZSIsCWNsX1F1ZXJ5U2NoZW1lRnJvbU5hbWUsIE1FVEhfVkFSQVJHU30sCi0JeyJTZXREZWZhdWx0IiwJCWNsX1NldERlZmF1bHQsIE1FVEhfVkFSQVJHU30sCi0JeyJTZXRNYXgiLAkJY2xfU2V0TWF4LCBNRVRIX1ZBUkFSR1N9LAotCXsiU2V0TWluIiwJCWNsX1NldE1pbiwgTUVUSF9WQVJBUkdTfSwKLQl7IkJ5dGVzUGVyU2FtcGxlIiwJY2xfQnl0ZXNQZXJTYW1wbGUsIE1FVEhfVkFSQVJHU30sCi0JeyJCeXRlc1BlclBpeGVsIiwJY2xfQnl0ZXNQZXJQaXhlbCwgTUVUSF9WQVJBUkdTfSwKLQl7IkF1ZGlvRm9ybWF0TmFtZSIsCWNsX0F1ZGlvRm9ybWF0TmFtZSwgTUVUSF9WQVJBUkdTfSwKLQl7IlZpZGVvRm9ybWF0TmFtZSIsCWNsX1ZpZGVvRm9ybWF0TmFtZSwgTUVUSF9WQVJBUkdTfSwKLQl7IkFsZ29yaXRobU51bWJlciIsCWNsX0FsZ29yaXRobU51bWJlciwgTUVUSF9WQVJBUkdTfSwKLQl7IkFsZ29yaXRobVR5cGUiLAljbF9BbGdvcml0aG1UeXBlLCBNRVRIX1ZBUkFSR1N9LAotCXsiQWxnb3JpdGhtIiwJCWNsX0FsZ29yaXRobSwgTUVUSF9WQVJBUkdTfSwKLQl7IlBhcmFtTnVtYmVyIiwJCWNsX1BhcmFtTnVtYmVyLCBNRVRIX1ZBUkFSR1N9LAotCXsiUGFyYW1UeXBlIiwJCWNsX1BhcmFtVHlwZSwgTUVUSF9WQVJBUkdTfSwKLQl7IlBhcmFtSUQiLAkJY2xfUGFyYW1JRCwgTUVUSF9WQVJBUkdTfSwKKyAgICB7IkNvbXByZXNzSW1hZ2UiLCAgICAgICAgICAgY2xfQ29tcHJlc3NJbWFnZSwgTUVUSF9WQVJBUkdTfSwKKyAgICB7IkRlY29tcHJlc3NJbWFnZSIsICAgICAgICAgY2xfRGVjb21wcmVzc0ltYWdlLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsiR2V0QWxnb3JpdGhtTmFtZSIsICAgICAgICBjbF9HZXRBbGdvcml0aG1OYW1lLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsiT3BlbkNvbXByZXNzb3IiLCAgICAgICAgICBjbF9PcGVuQ29tcHJlc3NvciwgTUVUSF9WQVJBUkdTfSwKKyAgICB7Ik9wZW5EZWNvbXByZXNzb3IiLCAgICAgICAgY2xfT3BlbkRlY29tcHJlc3NvciwgTUVUSF9WQVJBUkdTfSwKKyAgICB7IlF1ZXJ5QWxnb3JpdGhtcyIsICAgICAgICAgY2xfUXVlcnlBbGdvcml0aG1zLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsiUXVlcnlNYXhIZWFkZXJTaXplIiwgICAgICBjbF9RdWVyeU1heEhlYWRlclNpemUsIE1FVEhfVkFSQVJHU30sCisgICAgeyJRdWVyeVNjaGVtZSIsICAgICAgICAgICAgIGNsX1F1ZXJ5U2NoZW1lLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsiUXVlcnlTY2hlbWVGcm9tTmFtZSIsICAgICBjbF9RdWVyeVNjaGVtZUZyb21OYW1lLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsiU2V0RGVmYXVsdCIsICAgICAgICAgICAgICBjbF9TZXREZWZhdWx0LCBNRVRIX1ZBUkFSR1N9LAorICAgIHsiU2V0TWF4IiwgICAgICAgICAgICAgICAgICBjbF9TZXRNYXgsIE1FVEhfVkFSQVJHU30sCisgICAgeyJTZXRNaW4iLCAgICAgICAgICAgICAgICAgIGNsX1NldE1pbiwgTUVUSF9WQVJBUkdTfSwKKyAgICB7IkJ5dGVzUGVyU2FtcGxlIiwgICAgICAgICAgY2xfQnl0ZXNQZXJTYW1wbGUsIE1FVEhfVkFSQVJHU30sCisgICAgeyJCeXRlc1BlclBpeGVsIiwgICAgICAgICAgIGNsX0J5dGVzUGVyUGl4ZWwsIE1FVEhfVkFSQVJHU30sCisgICAgeyJBdWRpb0Zvcm1hdE5hbWUiLCAgICAgICAgIGNsX0F1ZGlvRm9ybWF0TmFtZSwgTUVUSF9WQVJBUkdTfSwKKyAgICB7IlZpZGVvRm9ybWF0TmFtZSIsICAgICAgICAgY2xfVmlkZW9Gb3JtYXROYW1lLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsiQWxnb3JpdGhtTnVtYmVyIiwgICAgICAgICBjbF9BbGdvcml0aG1OdW1iZXIsIE1FVEhfVkFSQVJHU30sCisgICAgeyJBbGdvcml0aG1UeXBlIiwgICAgICAgICAgIGNsX0FsZ29yaXRobVR5cGUsIE1FVEhfVkFSQVJHU30sCisgICAgeyJBbGdvcml0aG0iLCAgICAgICAgICAgICAgIGNsX0FsZ29yaXRobSwgTUVUSF9WQVJBUkdTfSwKKyAgICB7IlBhcmFtTnVtYmVyIiwgICAgICAgICAgICAgY2xfUGFyYW1OdW1iZXIsIE1FVEhfVkFSQVJHU30sCisgICAgeyJQYXJhbVR5cGUiLCAgICAgICAgICAgICAgIGNsX1BhcmFtVHlwZSwgTUVUSF9WQVJBUkdTfSwKKyAgICB7IlBhcmFtSUQiLCAgICAgICAgICAgICAgICAgY2xfUGFyYW1JRCwgTUVUSF9WQVJBUkdTfSwKICNpZmRlZiBDTERFQlVHCi0JeyJjdnRfdHlwZSIsCQljdnRfdHlwZSwgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImN2dF90eXBlIiwgICAgICAgICAgICAgICAgY3Z0X3R5cGUsIE1FVEhfVkFSQVJHU30sCiAjZW5kaWYKLQl7TlVMTCwJCQlOVUxMfSAvKiBTZW50aW5lbCAqLworICAgIHtOVUxMLCAgICAgICAgICAgICAgICAgICAgICBOVUxMfSAvKiBTZW50aW5lbCAqLwogfTsKIAogI2lmZGVmIENMX0pQRUdfU09GVFdBUkUKQEAgLTk2MCwxNjA0ICs5NjAsMTYwNCBAQAogdm9pZAogaW5pdGNsKHZvaWQpCiB7Ci0JUHlPYmplY3QgKm0sICpkLCAqeDsKLSAgICAKKyAgICBQeU9iamVjdCAqbSwgKmQsICp4OworCiAgICAgaWYgKFB5RXJyX1dhcm5QeTNrKCJ0aGUgY2wgbW9kdWxlIGhhcyBiZWVuIHJlbW92ZWQgaW4gIgogICAgICAgICAgICAgICAgICAgICAgICAiUHl0aG9uIDMuMCIsIDIpIDwgMCkKLSAgICAgICAgcmV0dXJuOwotICAgIAotCW0gPSBQeV9Jbml0TW9kdWxlKCJjbCIsIGNsX21ldGhvZHMpOwotCWlmIChtID09IE5VTEwpCi0JCXJldHVybjsKLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICByZXR1cm47CiAKLQlDbEVycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJjbC5lcnJvciIsIE5VTEwsIE5VTEwpOwotCSh2b2lkKSBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiZXJyb3IiLCBDbEVycm9yKTsKKyAgICBtID0gUHlfSW5pdE1vZHVsZSgiY2wiLCBjbF9tZXRob2RzKTsKKyAgICBpZiAobSA9PSBOVUxMKQorICAgICAgICByZXR1cm47CisgICAgZCA9IFB5TW9kdWxlX0dldERpY3QobSk7CisKKyAgICBDbEVycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJjbC5lcnJvciIsIE5VTEwsIE5VTEwpOworICAgICh2b2lkKSBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiZXJyb3IiLCBDbEVycm9yKTsKIAogI2lmZGVmIENMX0FEREVEX0FMR09SSVRITV9FUlJPUgotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9BRERFRF9BTEdPUklUSE1fRVJST1IpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkFEREVEX0FMR09SSVRITV9FUlJPUiIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQURERURfQUxHT1JJVEhNX0VSUk9SKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJBRERFRF9BTEdPUklUSE1fRVJST1IiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9BTEFXCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0FMQVcpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkFMQVciLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0FMQVcpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkFMQVciLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9BTEdPUklUSE1fSUQKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQUxHT1JJVEhNX0lEKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJBTEdPUklUSE1fSUQiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0FMR09SSVRITV9JRCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQUxHT1JJVEhNX0lEIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfQUxHT1JJVEhNX1RBQkxFX0ZVTEwKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQUxHT1JJVEhNX1RBQkxFX0ZVTEwpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkFMR09SSVRITV9UQUJMRV9GVUxMIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9BTEdPUklUSE1fVEFCTEVfRlVMTCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQUxHT1JJVEhNX1RBQkxFX0ZVTEwiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9BTEdPUklUSE1fVkVSU0lPTgotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9BTEdPUklUSE1fVkVSU0lPTik7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQUxHT1JJVEhNX1ZFUlNJT04iLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0FMR09SSVRITV9WRVJTSU9OKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJBTEdPUklUSE1fVkVSU0lPTiIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0FMR19BVURJTwotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9BTEdfQVVESU8pOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkFMR19BVURJTyIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQUxHX0FVRElPKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJBTEdfQVVESU8iLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9BTEdfVklERU8KLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQUxHX1ZJREVPKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJBTEdfVklERU8iLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0FMR19WSURFTyk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQUxHX1ZJREVPIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfQVVESU8KLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQVVESU8pOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkFVRElPIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9BVURJTyk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQVVESU8iLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9BV0FSRV9CSVRSQVRFX1BPTElDWQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9BV0FSRV9CSVRSQVRFX1BPTElDWSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQVdBUkVfQklUUkFURV9QT0xJQ1kiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0FXQVJFX0JJVFJBVEVfUE9MSUNZKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJBV0FSRV9CSVRSQVRFX1BPTElDWSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0FXQVJFX0JJVFJBVEVfVEFSR0VUCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0FXQVJFX0JJVFJBVEVfVEFSR0VUKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJBV0FSRV9CSVRSQVRFX1RBUkdFVCIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQVdBUkVfQklUUkFURV9UQVJHRVQpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkFXQVJFX0JJVFJBVEVfVEFSR0VUIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfQVdBUkVfQ0hBTk5FTF9QT0xJQ1kKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQVdBUkVfQ0hBTk5FTF9QT0xJQ1kpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkFXQVJFX0NIQU5ORUxfUE9MSUNZIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9BV0FSRV9DSEFOTkVMX1BPTElDWSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQVdBUkVfQ0hBTk5FTF9QT0xJQ1kiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9BV0FSRV9DT05TVF9RVUFMCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0FXQVJFX0NPTlNUX1FVQUwpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkFXQVJFX0NPTlNUX1FVQUwiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0FXQVJFX0NPTlNUX1FVQUwpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkFXQVJFX0NPTlNUX1FVQUwiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9BV0FSRV9FUlJPUgotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9BV0FSRV9FUlJPUik7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQVdBUkVfRVJST1IiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0FXQVJFX0VSUk9SKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJBV0FSRV9FUlJPUiIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0FXQVJFX0ZJWEVEX1JBVEUKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQVdBUkVfRklYRURfUkFURSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQVdBUkVfRklYRURfUkFURSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQVdBUkVfRklYRURfUkFURSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQVdBUkVfRklYRURfUkFURSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0FXQVJFX0lOREVQRU5ERU5UCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0FXQVJFX0lOREVQRU5ERU5UKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJBV0FSRV9JTkRFUEVOREVOVCIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQVdBUkVfSU5ERVBFTkRFTlQpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkFXQVJFX0lOREVQRU5ERU5UIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfQVdBUkVfSk9JTlRfU1RFUkVPCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0FXQVJFX0pPSU5UX1NURVJFTyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQVdBUkVfSk9JTlRfU1RFUkVPIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9BV0FSRV9KT0lOVF9TVEVSRU8pOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkFXQVJFX0pPSU5UX1NURVJFTyIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0FXQVJFX0xBWUVSCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0FXQVJFX0xBWUVSKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJBV0FSRV9MQVlFUiIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQVdBUkVfTEFZRVIpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkFXQVJFX0xBWUVSIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfQVdBUkVfTE9TU0xFU1MKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQVdBUkVfTE9TU0xFU1MpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkFXQVJFX0xPU1NMRVNTIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9BV0FSRV9MT1NTTEVTUyk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQVdBUkVfTE9TU0xFU1MiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9BV0FSRV9NUEVHX0FVRElPCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0FXQVJFX01QRUdfQVVESU8pOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkFXQVJFX01QRUdfQVVESU8iLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0FXQVJFX01QRUdfQVVESU8pOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkFXQVJFX01QRUdfQVVESU8iLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9BV0FSRV9NUEVHX0xBWUVSX0kKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQVdBUkVfTVBFR19MQVlFUl9JKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJBV0FSRV9NUEVHX0xBWUVSX0kiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0FXQVJFX01QRUdfTEFZRVJfSSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQVdBUkVfTVBFR19MQVlFUl9JIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfQVdBUkVfTVBFR19MQVlFUl9JSQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9BV0FSRV9NUEVHX0xBWUVSX0lJKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJBV0FSRV9NUEVHX0xBWUVSX0lJIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9BV0FSRV9NUEVHX0xBWUVSX0lJKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJBV0FSRV9NUEVHX0xBWUVSX0lJIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfQVdBUkVfTVVMVElSQVRFCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0FXQVJFX01VTFRJUkFURSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQVdBUkVfTVVMVElSQVRFIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9BV0FSRV9NVUxUSVJBVEUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkFXQVJFX01VTFRJUkFURSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0FXQVJFX05PSVNFX01BUkdJTgotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9BV0FSRV9OT0lTRV9NQVJHSU4pOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkFXQVJFX05PSVNFX01BUkdJTiIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQVdBUkVfTk9JU0VfTUFSR0lOKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJBV0FSRV9OT0lTRV9NQVJHSU4iLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9BV0FSRV9TVEVSRU8KLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQVdBUkVfU1RFUkVPKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJBV0FSRV9TVEVSRU8iLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0FXQVJFX1NURVJFTyk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQVdBUkVfU1RFUkVPIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfQkFEX0FMR09SSVRITV9OQU1FCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0JBRF9BTEdPUklUSE1fTkFNRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX0FMR09SSVRITV9OQU1FIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9CQURfQUxHT1JJVEhNX05BTUUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9BTEdPUklUSE1fTkFNRSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0JBRF9BTEdPUklUSE1fVFlQRQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9CQURfQUxHT1JJVEhNX1RZUEUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9BTEdPUklUSE1fVFlQRSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQkFEX0FMR09SSVRITV9UWVBFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfQUxHT1JJVEhNX1RZUEUiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9CQURfQkxPQ0tfU0laRQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9CQURfQkxPQ0tfU0laRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX0JMT0NLX1NJWkUiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0JBRF9CTE9DS19TSVpFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfQkxPQ0tfU0laRSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0JBRF9CT0FSRAotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9CQURfQk9BUkQpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9CT0FSRCIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQkFEX0JPQVJEKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfQk9BUkQiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9CQURfQlVGRkVSSU5HCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0JBRF9CVUZGRVJJTkcpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9CVUZGRVJJTkciLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0JBRF9CVUZGRVJJTkcpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9CVUZGRVJJTkciLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9CQURfQlVGRkVSTEVOR1RIX05FRwotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9CQURfQlVGRkVSTEVOR1RIX05FRyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX0JVRkZFUkxFTkdUSF9ORUciLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0JBRF9CVUZGRVJMRU5HVEhfTkVHKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfQlVGRkVSTEVOR1RIX05FRyIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0JBRF9CVUZGRVJMRU5HVEhfT0RECi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0JBRF9CVUZGRVJMRU5HVEhfT0REKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfQlVGRkVSTEVOR1RIX09ERCIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQkFEX0JVRkZFUkxFTkdUSF9PREQpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9CVUZGRVJMRU5HVEhfT0REIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfQkFEX0JVRkZFUl9FWElTVFMKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQkFEX0JVRkZFUl9FWElTVFMpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9CVUZGRVJfRVhJU1RTIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9CQURfQlVGRkVSX0VYSVNUUyk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX0JVRkZFUl9FWElTVFMiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9CQURfQlVGRkVSX0hBTkRMRQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9CQURfQlVGRkVSX0hBTkRMRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX0JVRkZFUl9IQU5ETEUiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0JBRF9CVUZGRVJfSEFORExFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfQlVGRkVSX0hBTkRMRSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0JBRF9CVUZGRVJfUE9JTlRFUgotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9CQURfQlVGRkVSX1BPSU5URVIpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9CVUZGRVJfUE9JTlRFUiIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQkFEX0JVRkZFUl9QT0lOVEVSKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfQlVGRkVSX1BPSU5URVIiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9CQURfQlVGRkVSX1FVRVJZX1NJWkUKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQkFEX0JVRkZFUl9RVUVSWV9TSVpFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfQlVGRkVSX1FVRVJZX1NJWkUiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0JBRF9CVUZGRVJfUVVFUllfU0laRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX0JVRkZFUl9RVUVSWV9TSVpFIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfQkFEX0JVRkZFUl9TSVpFCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0JBRF9CVUZGRVJfU0laRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX0JVRkZFUl9TSVpFIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9CQURfQlVGRkVSX1NJWkUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9CVUZGRVJfU0laRSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0JBRF9CVUZGRVJfU0laRV9QT0lOVEVSCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0JBRF9CVUZGRVJfU0laRV9QT0lOVEVSKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfQlVGRkVSX1NJWkVfUE9JTlRFUiIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQkFEX0JVRkZFUl9TSVpFX1BPSU5URVIpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9CVUZGRVJfU0laRV9QT0lOVEVSIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfQkFEX0JVRkZFUl9UWVBFCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0JBRF9CVUZGRVJfVFlQRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX0JVRkZFUl9UWVBFIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9CQURfQlVGRkVSX1RZUEUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9CVUZGRVJfVFlQRSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0JBRF9DT01QUkVTU0lPTl9TQ0hFTUUKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQkFEX0NPTVBSRVNTSU9OX1NDSEVNRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX0NPTVBSRVNTSU9OX1NDSEVNRSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQkFEX0NPTVBSRVNTSU9OX1NDSEVNRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX0NPTVBSRVNTSU9OX1NDSEVNRSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0JBRF9DT01QUkVTU09SX0hBTkRMRQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9CQURfQ09NUFJFU1NPUl9IQU5ETEUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9DT01QUkVTU09SX0hBTkRMRSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQkFEX0NPTVBSRVNTT1JfSEFORExFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfQ09NUFJFU1NPUl9IQU5ETEUiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9CQURfQ09NUFJFU1NPUl9IQU5ETEVfUE9JTlRFUgotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9CQURfQ09NUFJFU1NPUl9IQU5ETEVfUE9JTlRFUik7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX0NPTVBSRVNTT1JfSEFORExFX1BPSU5URVIiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0JBRF9DT01QUkVTU09SX0hBTkRMRV9QT0lOVEVSKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfQ09NUFJFU1NPUl9IQU5ETEVfUE9JTlRFUiIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0JBRF9GUkFNRV9TSVpFCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0JBRF9GUkFNRV9TSVpFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfRlJBTUVfU0laRSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQkFEX0ZSQU1FX1NJWkUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9GUkFNRV9TSVpFIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfQkFEX0ZVTkNUSU9OQUxJVFkKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQkFEX0ZVTkNUSU9OQUxJVFkpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9GVU5DVElPTkFMSVRZIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9CQURfRlVOQ1RJT05BTElUWSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX0ZVTkNUSU9OQUxJVFkiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9CQURfRlVOQ1RJT05fUE9JTlRFUgotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9CQURfRlVOQ1RJT05fUE9JTlRFUik7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX0ZVTkNUSU9OX1BPSU5URVIiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0JBRF9GVU5DVElPTl9QT0lOVEVSKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfRlVOQ1RJT05fUE9JTlRFUiIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0JBRF9IRUFERVJfU0laRQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9CQURfSEVBREVSX1NJWkUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9IRUFERVJfU0laRSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQkFEX0hFQURFUl9TSVpFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfSEVBREVSX1NJWkUiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9CQURfSU5JVElBTF9WQUxVRQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9CQURfSU5JVElBTF9WQUxVRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX0lOSVRJQUxfVkFMVUUiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0JBRF9JTklUSUFMX1ZBTFVFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfSU5JVElBTF9WQUxVRSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0JBRF9JTlRFUk5BTF9GT1JNQVQKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQkFEX0lOVEVSTkFMX0ZPUk1BVCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX0lOVEVSTkFMX0ZPUk1BVCIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQkFEX0lOVEVSTkFMX0ZPUk1BVCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX0lOVEVSTkFMX0ZPUk1BVCIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0JBRF9MSUNFTlNFCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0JBRF9MSUNFTlNFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfTElDRU5TRSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQkFEX0xJQ0VOU0UpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9MSUNFTlNFIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfQkFEX01JTl9HVF9NQVgKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQkFEX01JTl9HVF9NQVgpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9NSU5fR1RfTUFYIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9CQURfTUlOX0dUX01BWCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX01JTl9HVF9NQVgiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9CQURfTk9fQlVGRkVSU1BBQ0UKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQkFEX05PX0JVRkZFUlNQQUNFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfTk9fQlVGRkVSU1BBQ0UiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0JBRF9OT19CVUZGRVJTUEFDRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX05PX0JVRkZFUlNQQUNFIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfQkFEX05VTUJFUl9PRl9CTE9DS1MKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQkFEX05VTUJFUl9PRl9CTE9DS1MpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9OVU1CRVJfT0ZfQkxPQ0tTIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9CQURfTlVNQkVSX09GX0JMT0NLUyk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX05VTUJFUl9PRl9CTE9DS1MiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9CQURfUEFSQU0KLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQkFEX1BBUkFNKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfUEFSQU0iLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0JBRF9QQVJBTSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX1BBUkFNIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfQkFEX1BBUkFNX0lEX1BPSU5URVIKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQkFEX1BBUkFNX0lEX1BPSU5URVIpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9QQVJBTV9JRF9QT0lOVEVSIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9CQURfUEFSQU1fSURfUE9JTlRFUik7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX1BBUkFNX0lEX1BPSU5URVIiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9CQURfUEFSQU1fVFlQRQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9CQURfUEFSQU1fVFlQRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX1BBUkFNX1RZUEUiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0JBRF9QQVJBTV9UWVBFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfUEFSQU1fVFlQRSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0JBRF9QT0lOVEVSCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0JBRF9QT0lOVEVSKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfUE9JTlRFUiIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQkFEX1BPSU5URVIpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9QT0lOVEVSIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfQkFEX1BWQlVGRkVSCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0JBRF9QVkJVRkZFUik7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX1BWQlVGRkVSIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9CQURfUFZCVUZGRVIpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9QVkJVRkZFUiIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0JBRF9TQ0hFTUVfUE9JTlRFUgotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9CQURfU0NIRU1FX1BPSU5URVIpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9TQ0hFTUVfUE9JTlRFUiIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQkFEX1NDSEVNRV9QT0lOVEVSKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfU0NIRU1FX1BPSU5URVIiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9CQURfU1RSRUFNX0hFQURFUgotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9CQURfU1RSRUFNX0hFQURFUik7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX1NUUkVBTV9IRUFERVIiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0JBRF9TVFJFQU1fSEVBREVSKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfU1RSRUFNX0hFQURFUiIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0JBRF9TVFJJTkdfUE9JTlRFUgotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9CQURfU1RSSU5HX1BPSU5URVIpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9TVFJJTkdfUE9JTlRFUiIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQkFEX1NUUklOR19QT0lOVEVSKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfU1RSSU5HX1BPSU5URVIiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9CQURfVEVYVF9TVFJJTkdfUFRSCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0JBRF9URVhUX1NUUklOR19QVFIpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9URVhUX1NUUklOR19QVFIiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0JBRF9URVhUX1NUUklOR19QVFIpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9URVhUX1NUUklOR19QVFIiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9CRVNUX0ZJVAotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9CRVNUX0ZJVCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkVTVF9GSVQiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0JFU1RfRklUKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCRVNUX0ZJVCIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0JJRElSRUNUSU9OQUwKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQklESVJFQ1RJT05BTCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQklESVJFQ1RJT05BTCIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQklESVJFQ1RJT05BTCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQklESVJFQ1RJT05BTCIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0JJVFJBVEUKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQklUUkFURSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQklUUkFURSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQklUUkFURSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQklUUkFURSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0JJVFJBVEVfUE9MSUNZCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0JJVFJBVEVfUE9MSUNZKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCSVRSQVRFX1BPTElDWSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQklUUkFURV9QT0xJQ1kpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJJVFJBVEVfUE9MSUNZIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfQklUUkFURV9UQVJHRVQKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQklUUkFURV9UQVJHRVQpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJJVFJBVEVfVEFSR0VUIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9CSVRSQVRFX1RBUkdFVCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQklUUkFURV9UQVJHRVQiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9CSVRTX1BFUl9DT01QT05FTlQKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQklUU19QRVJfQ09NUE9ORU5UKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCSVRTX1BFUl9DT01QT05FTlQiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0JJVFNfUEVSX0NPTVBPTkVOVCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQklUU19QRVJfQ09NUE9ORU5UIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfQkxFTkRJTkcKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQkxFTkRJTkcpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJMRU5ESU5HIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9CTEVORElORyk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkxFTkRJTkciLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9CTE9DS19TSVpFCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0JMT0NLX1NJWkUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJMT0NLX1NJWkUiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0JMT0NLX1NJWkUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJMT0NLX1NJWkUiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9CT1RUT01fVVAKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQk9UVE9NX1VQKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCT1RUT01fVVAiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0JPVFRPTV9VUCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQk9UVE9NX1VQIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfQlVGRkVSX05PVF9DUkVBVEVECi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0JVRkZFUl9OT1RfQ1JFQVRFRCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQlVGRkVSX05PVF9DUkVBVEVEIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9CVUZGRVJfTk9UX0NSRUFURUQpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJVRkZFUl9OT1RfQ1JFQVRFRCIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0JVRl9DT01QUkVTU0VECi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0JVRl9DT01QUkVTU0VEKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCVUZfQ09NUFJFU1NFRCIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQlVGX0NPTVBSRVNTRUQpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJVRl9DT01QUkVTU0VEIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfQlVGX0RBVEEKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQlVGX0RBVEEpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJVRl9EQVRBIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9CVUZfREFUQSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQlVGX0RBVEEiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9CVUZfRlJBTUUKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQlVGX0ZSQU1FKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCVUZfRlJBTUUiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0JVRl9GUkFNRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQlVGX0ZSQU1FIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfQ0hBTk5FTF9QT0xJQ1kKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQ0hBTk5FTF9QT0xJQ1kpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkNIQU5ORUxfUE9MSUNZIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9DSEFOTkVMX1BPTElDWSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQ0hBTk5FTF9QT0xJQ1kiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9DSFJPTUFfVEhSRVNIT0xECi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0NIUk9NQV9USFJFU0hPTEQpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkNIUk9NQV9USFJFU0hPTEQiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0NIUk9NQV9USFJFU0hPTEQpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkNIUk9NQV9USFJFU0hPTEQiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9DT0RFQwotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9DT0RFQyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQ09ERUMiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0NPREVDKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJDT0RFQyIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0NPTVBPTkVOVFMKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQ09NUE9ORU5UUyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQ09NUE9ORU5UUyIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQ09NUE9ORU5UUyk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQ09NUE9ORU5UUyIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0NPTVBSRVNTRURfQlVGRkVSX1NJWkUKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQ09NUFJFU1NFRF9CVUZGRVJfU0laRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQ09NUFJFU1NFRF9CVUZGRVJfU0laRSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQ09NUFJFU1NFRF9CVUZGRVJfU0laRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQ09NUFJFU1NFRF9CVUZGRVJfU0laRSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0NPTVBSRVNTSU9OX1JBVElPCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0NPTVBSRVNTSU9OX1JBVElPKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJDT01QUkVTU0lPTl9SQVRJTyIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQ09NUFJFU1NJT05fUkFUSU8pOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkNPTVBSRVNTSU9OX1JBVElPIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfQ09NUFJFU1NPUgotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9DT01QUkVTU09SKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJDT01QUkVTU09SIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9DT01QUkVTU09SKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJDT01QUkVTU09SIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfQ09OVElOVU9VU19CTE9DSwotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9DT05USU5VT1VTX0JMT0NLKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJDT05USU5VT1VTX0JMT0NLIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9DT05USU5VT1VTX0JMT0NLKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJDT05USU5VT1VTX0JMT0NLIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfQ09OVElOVU9VU19OT05CTE9DSwotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9DT05USU5VT1VTX05PTkJMT0NLKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJDT05USU5VT1VTX05PTkJMT0NLIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9DT05USU5VT1VTX05PTkJMT0NLKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJDT05USU5VT1VTX05PTkJMT0NLIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfQ09TTU9fQ09ERUNfQ09OVFJPTAotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9DT1NNT19DT0RFQ19DT05UUk9MKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJDT1NNT19DT0RFQ19DT05UUk9MIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9DT1NNT19DT0RFQ19DT05UUk9MKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJDT1NNT19DT0RFQ19DT05UUk9MIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfQ09TTU9fTlVNX1BBUkFNUwotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9DT1NNT19OVU1fUEFSQU1TKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJDT1NNT19OVU1fUEFSQU1TIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9DT1NNT19OVU1fUEFSQU1TKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJDT1NNT19OVU1fUEFSQU1TIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfQ09TTU9fVkFMVUVfQkFTRQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9DT1NNT19WQUxVRV9CQVNFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJDT1NNT19WQUxVRV9CQVNFIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9DT1NNT19WQUxVRV9CQVNFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJDT1NNT19WQUxVRV9CQVNFIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfQ09TTU9fVklERU9fTUFOVUFMX0NPTlRST0wKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQ09TTU9fVklERU9fTUFOVUFMX0NPTlRST0wpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkNPU01PX1ZJREVPX01BTlVBTF9DT05UUk9MIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9DT1NNT19WSURFT19NQU5VQUxfQ09OVFJPTCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQ09TTU9fVklERU9fTUFOVUFMX0NPTlRST0wiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9DT1NNT19WSURFT19UUkFOU0ZFUl9NT0RFCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0NPU01PX1ZJREVPX1RSQU5TRkVSX01PREUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkNPU01PX1ZJREVPX1RSQU5TRkVSX01PREUiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0NPU01PX1ZJREVPX1RSQU5TRkVSX01PREUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkNPU01PX1ZJREVPX1RSQU5TRkVSX01PREUiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9EQVRBCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0RBVEEpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkRBVEEiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0RBVEEpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkRBVEEiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9ERUNPTVBSRVNTT1IKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfREVDT01QUkVTU09SKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJERUNPTVBSRVNTT1IiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0RFQ09NUFJFU1NPUik7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiREVDT01QUkVTU09SIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfRFNPX0VSUk9SCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0RTT19FUlJPUik7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRFNPX0VSUk9SIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9EU09fRVJST1IpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkRTT19FUlJPUiIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0VER0VfVEhSRVNIT0xECi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0VER0VfVEhSRVNIT0xEKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFREdFX1RIUkVTSE9MRCIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfRURHRV9USFJFU0hPTEQpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVER0VfVEhSRVNIT0xEIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfRU5BQkxFX0lNQUdFSU5GTwotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9FTkFCTEVfSU1BR0VJTkZPKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFTkFCTEVfSU1BR0VJTkZPIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9FTkFCTEVfSU1BR0VJTkZPKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFTkFCTEVfSU1BR0VJTkZPIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfRU5EX09GX1NFUVVFTkNFCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0VORF9PRl9TRVFVRU5DRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRU5EX09GX1NFUVVFTkNFIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9FTkRfT0ZfU0VRVUVOQ0UpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVORF9PRl9TRVFVRU5DRSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0VOVU1fVkFMVUUKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfRU5VTV9WQUxVRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRU5VTV9WQUxVRSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfRU5VTV9WQUxVRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRU5VTV9WQUxVRSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0VYQUNUX0NPTVBSRVNTSU9OX1JBVElPCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0VYQUNUX0NPTVBSRVNTSU9OX1JBVElPKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFWEFDVF9DT01QUkVTU0lPTl9SQVRJTyIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfRVhBQ1RfQ09NUFJFU1NJT05fUkFUSU8pOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVYQUNUX0NPTVBSRVNTSU9OX1JBVElPIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfRVhURVJOQUxfREVWSUNFCi0JeCA9IFB5SW50X0Zyb21Mb25nKChsb25nKSBDTF9FWFRFUk5BTF9ERVZJQ0UpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVYVEVSTkFMX0RFVklDRSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIENMX0VYVEVSTkFMX0RFVklDRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRVhURVJOQUxfREVWSUNFIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfRkxPQVRJTkdfRU5VTV9WQUxVRQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9GTE9BVElOR19FTlVNX1ZBTFVFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJGTE9BVElOR19FTlVNX1ZBTFVFIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9GTE9BVElOR19FTlVNX1ZBTFVFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJGTE9BVElOR19FTlVNX1ZBTFVFIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfRkxPQVRJTkdfUkFOR0VfVkFMVUUKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfRkxPQVRJTkdfUkFOR0VfVkFMVUUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkZMT0FUSU5HX1JBTkdFX1ZBTFVFIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9GTE9BVElOR19SQU5HRV9WQUxVRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRkxPQVRJTkdfUkFOR0VfVkFMVUUiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9GT1JNQVQKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfRk9STUFUKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJGT1JNQVQiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0ZPUk1BVCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRk9STUFUIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfRk9STUFUX0FCR1IKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfRk9STUFUX0FCR1IpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkZPUk1BVF9BQkdSIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9GT1JNQVRfQUJHUik7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRk9STUFUX0FCR1IiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9GT1JNQVRfQkdSCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0ZPUk1BVF9CR1IpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkZPUk1BVF9CR1IiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0ZPUk1BVF9CR1IpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkZPUk1BVF9CR1IiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9GT1JNQVRfQkdSMjMzCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0ZPUk1BVF9CR1IyMzMpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkZPUk1BVF9CR1IyMzMiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0ZPUk1BVF9CR1IyMzMpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkZPUk1BVF9CR1IyMzMiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9GT1JNQVRfR1JBWVNDQUxFCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0ZPUk1BVF9HUkFZU0NBTEUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkZPUk1BVF9HUkFZU0NBTEUiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0ZPUk1BVF9HUkFZU0NBTEUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkZPUk1BVF9HUkFZU0NBTEUiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9GT1JNQVRfTU9OTwotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9GT1JNQVRfTU9OTyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRk9STUFUX01PTk8iLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0ZPUk1BVF9NT05PKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJGT1JNQVRfTU9OTyIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0ZPUk1BVF9SQkczMjMKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfRk9STUFUX1JCRzMyMyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRk9STUFUX1JCRzMyMyIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfRk9STUFUX1JCRzMyMyk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRk9STUFUX1JCRzMyMyIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0ZPUk1BVF9TVEVSRU9fSU5URVJMRUFWRUQKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfRk9STUFUX1NURVJFT19JTlRFUkxFQVZFRCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRk9STUFUX1NURVJFT19JTlRFUkxFQVZFRCIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfRk9STUFUX1NURVJFT19JTlRFUkxFQVZFRCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRk9STUFUX1NURVJFT19JTlRFUkxFQVZFRCIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0ZPUk1BVF9YQkdSCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0ZPUk1BVF9YQkdSKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJGT1JNQVRfWEJHUiIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfRk9STUFUX1hCR1IpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkZPUk1BVF9YQkdSIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfRk9STUFUX1lDYkNyCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0ZPUk1BVF9ZQ2JDcik7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRk9STUFUX1lDYkNyIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9GT1JNQVRfWUNiQ3IpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkZPUk1BVF9ZQ2JDciIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0ZPUk1BVF9ZQ2JDcjQyMgotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9GT1JNQVRfWUNiQ3I0MjIpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkZPUk1BVF9ZQ2JDcjQyMiIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfRk9STUFUX1lDYkNyNDIyKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJGT1JNQVRfWUNiQ3I0MjIiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9GT1JNQVRfWUNiQ3I0MjJEQwotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9GT1JNQVRfWUNiQ3I0MjJEQyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRk9STUFUX1lDYkNyNDIyREMiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0ZPUk1BVF9ZQ2JDcjQyMkRDKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJGT1JNQVRfWUNiQ3I0MjJEQyIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0ZSQU1FCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0ZSQU1FKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJGUkFNRSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfRlJBTUUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkZSQU1FIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfRlJBTUVTX1BFUl9DSFVOSwotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9GUkFNRVNfUEVSX0NIVU5LKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJGUkFNRVNfUEVSX0NIVU5LIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9GUkFNRVNfUEVSX0NIVU5LKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJGUkFNRVNfUEVSX0NIVU5LIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfRlJBTUVfQlVGRkVSX1NJWkUKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfRlJBTUVfQlVGRkVSX1NJWkUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkZSQU1FX0JVRkZFUl9TSVpFIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9GUkFNRV9CVUZGRVJfU0laRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRlJBTUVfQlVGRkVSX1NJWkUiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9GUkFNRV9CVUZGRVJfU0laRV9aRVJPCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0ZSQU1FX0JVRkZFUl9TSVpFX1pFUk8pOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkZSQU1FX0JVRkZFUl9TSVpFX1pFUk8iLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0ZSQU1FX0JVRkZFUl9TSVpFX1pFUk8pOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkZSQU1FX0JVRkZFUl9TSVpFX1pFUk8iLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9GUkFNRV9JTkRFWAotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9GUkFNRV9JTkRFWCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRlJBTUVfSU5ERVgiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0ZSQU1FX0lOREVYKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJGUkFNRV9JTkRFWCIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0ZSQU1FX1JBVEUKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfRlJBTUVfUkFURSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRlJBTUVfUkFURSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfRlJBTUVfUkFURSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRlJBTUVfUkFURSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0ZSQU1FX1NJWkUKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfRlJBTUVfU0laRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRlJBTUVfU0laRSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfRlJBTUVfU0laRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRlJBTUVfU0laRSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0ZSQU1FX1RZUEUKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfRlJBTUVfVFlQRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRlJBTUVfVFlQRSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfRlJBTUVfVFlQRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRlJBTUVfVFlQRSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0c3MTFfQUxBVwotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9HNzExX0FMQVcpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkc3MTFfQUxBVyIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfRzcxMV9BTEFXKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJHNzExX0FMQVciLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9HNzExX0FMQVdfU09GVFdBUkUKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfRzcxMV9BTEFXX1NPRlRXQVJFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJHNzExX0FMQVdfU09GVFdBUkUiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0c3MTFfQUxBV19TT0ZUV0FSRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRzcxMV9BTEFXX1NPRlRXQVJFIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfRzcxMV9VTEFXCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0c3MTFfVUxBVyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRzcxMV9VTEFXIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9HNzExX1VMQVcpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkc3MTFfVUxBVyIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0c3MTFfVUxBV19TT0ZUV0FSRQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9HNzExX1VMQVdfU09GVFdBUkUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkc3MTFfVUxBV19TT0ZUV0FSRSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfRzcxMV9VTEFXX1NPRlRXQVJFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJHNzExX1VMQVdfU09GVFdBUkUiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9HUkFZU0NBTEUKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfR1JBWVNDQUxFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJHUkFZU0NBTEUiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0dSQVlTQ0FMRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiR1JBWVNDQUxFIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfSERDQwotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9IRENDKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJIRENDIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9IRENDKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJIRENDIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfSERDQ19TQU1QTEVTX1BFUl9USUxFCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0hEQ0NfU0FNUExFU19QRVJfVElMRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSERDQ19TQU1QTEVTX1BFUl9USUxFIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9IRENDX1NBTVBMRVNfUEVSX1RJTEUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkhEQ0NfU0FNUExFU19QRVJfVElMRSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0hEQ0NfU09GVFdBUkUKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfSERDQ19TT0ZUV0FSRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSERDQ19TT0ZUV0FSRSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfSERDQ19TT0ZUV0FSRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSERDQ19TT0ZUV0FSRSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0hEQ0NfVElMRV9USFJFU0hPTEQKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfSERDQ19USUxFX1RIUkVTSE9MRCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSERDQ19USUxFX1RIUkVTSE9MRCIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfSERDQ19USUxFX1RIUkVTSE9MRCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSERDQ19USUxFX1RIUkVTSE9MRCIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0hFQURFUl9TVEFSVF9DT0RFCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0hFQURFUl9TVEFSVF9DT0RFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJIRUFERVJfU1RBUlRfQ09ERSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfSEVBREVSX1NUQVJUX0NPREUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkhFQURFUl9TVEFSVF9DT0RFIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfSU1BR0VJTkZPX0ZJRUxETUFTSwotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9JTUFHRUlORk9fRklFTERNQVNLKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJJTUFHRUlORk9fRklFTERNQVNLIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9JTUFHRUlORk9fRklFTERNQVNLKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJJTUFHRUlORk9fRklFTERNQVNLIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfSU1BR0VfQ1JPUF9CT1RUT00KLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfSU1BR0VfQ1JPUF9CT1RUT00pOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIklNQUdFX0NST1BfQk9UVE9NIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9JTUFHRV9DUk9QX0JPVFRPTSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSU1BR0VfQ1JPUF9CT1RUT00iLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9JTUFHRV9DUk9QX0xFRlQKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfSU1BR0VfQ1JPUF9MRUZUKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJJTUFHRV9DUk9QX0xFRlQiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0lNQUdFX0NST1BfTEVGVCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSU1BR0VfQ1JPUF9MRUZUIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfSU1BR0VfQ1JPUF9SSUdIVAotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9JTUFHRV9DUk9QX1JJR0hUKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJJTUFHRV9DUk9QX1JJR0hUIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9JTUFHRV9DUk9QX1JJR0hUKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJJTUFHRV9DUk9QX1JJR0hUIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfSU1BR0VfQ1JPUF9UT1AKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfSU1BR0VfQ1JPUF9UT1ApOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIklNQUdFX0NST1BfVE9QIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9JTUFHRV9DUk9QX1RPUCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSU1BR0VfQ1JPUF9UT1AiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9JTUFHRV9IRUlHSFQKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfSU1BR0VfSEVJR0hUKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJJTUFHRV9IRUlHSFQiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0lNQUdFX0hFSUdIVCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSU1BR0VfSEVJR0hUIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfSU1BR0VfV0lEVEgKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfSU1BR0VfV0lEVEgpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIklNQUdFX1dJRFRIIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9JTUFHRV9XSURUSCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSU1BR0VfV0lEVEgiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9JTVBBQ1RfQ09ERUNfQ09OVFJPTAotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9JTVBBQ1RfQ09ERUNfQ09OVFJPTCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSU1QQUNUX0NPREVDX0NPTlRST0wiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0lNUEFDVF9DT0RFQ19DT05UUk9MKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJJTVBBQ1RfQ09ERUNfQ09OVFJPTCIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0lNUEFDVF9GUkFNRV9JTlRFUkxFQVZFCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0lNUEFDVF9GUkFNRV9JTlRFUkxFQVZFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJJTVBBQ1RfRlJBTUVfSU5URVJMRUFWRSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfSU1QQUNUX0ZSQU1FX0lOVEVSTEVBVkUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIklNUEFDVF9GUkFNRV9JTlRFUkxFQVZFIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfSU1QQUNUX05VTV9QQVJBTVMKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfSU1QQUNUX05VTV9QQVJBTVMpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIklNUEFDVF9OVU1fUEFSQU1TIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9JTVBBQ1RfTlVNX1BBUkFNUyk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSU1QQUNUX05VTV9QQVJBTVMiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9JTlRFUk5BTF9GT1JNQVQKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfSU5URVJOQUxfRk9STUFUKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJJTlRFUk5BTF9GT1JNQVQiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0lOVEVSTkFMX0ZPUk1BVCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSU5URVJOQUxfRk9STUFUIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfSU5URVJOQUxfSU1BR0VfSEVJR0hUCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0lOVEVSTkFMX0lNQUdFX0hFSUdIVCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSU5URVJOQUxfSU1BR0VfSEVJR0hUIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9JTlRFUk5BTF9JTUFHRV9IRUlHSFQpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIklOVEVSTkFMX0lNQUdFX0hFSUdIVCIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0lOVEVSTkFMX0lNQUdFX1dJRFRICi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0lOVEVSTkFMX0lNQUdFX1dJRFRIKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJJTlRFUk5BTF9JTUFHRV9XSURUSCIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfSU5URVJOQUxfSU1BR0VfV0lEVEgpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIklOVEVSTkFMX0lNQUdFX1dJRFRIIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfSU5UUkEKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfSU5UUkEpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIklOVFJBIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9JTlRSQSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSU5UUkEiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9KUEVHCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0pQRUcpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkpQRUciLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0pQRUcpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkpQRUciLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9KUEVHX0NPU01PCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0pQRUdfQ09TTU8pOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkpQRUdfQ09TTU8iLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0pQRUdfQ09TTU8pOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkpQRUdfQ09TTU8iLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9KUEVHX0VSUk9SCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0pQRUdfRVJST1IpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkpQRUdfRVJST1IiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0pQRUdfRVJST1IpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkpQRUdfRVJST1IiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9KUEVHX0lNUEFDVAotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9KUEVHX0lNUEFDVCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSlBFR19JTVBBQ1QiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0pQRUdfSU1QQUNUKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJKUEVHX0lNUEFDVCIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0pQRUdfTlVNX1BBUkFNUwotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9KUEVHX05VTV9QQVJBTVMpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkpQRUdfTlVNX1BBUkFNUyIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfSlBFR19OVU1fUEFSQU1TKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJKUEVHX05VTV9QQVJBTVMiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9KUEVHX1FVQUxJVFlfRkFDVE9SCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0pQRUdfUVVBTElUWV9GQUNUT1IpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkpQRUdfUVVBTElUWV9GQUNUT1IiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0pQRUdfUVVBTElUWV9GQUNUT1IpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkpQRUdfUVVBTElUWV9GQUNUT1IiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9KUEVHX1FVQU5USVpBVElPTl9UQUJMRVMKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfSlBFR19RVUFOVElaQVRJT05fVEFCTEVTKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJKUEVHX1FVQU5USVpBVElPTl9UQUJMRVMiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0pQRUdfUVVBTlRJWkFUSU9OX1RBQkxFUyk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSlBFR19RVUFOVElaQVRJT05fVEFCTEVTIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfSlBFR19TT0ZUV0FSRQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9KUEVHX1NPRlRXQVJFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJKUEVHX1NPRlRXQVJFIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9KUEVHX1NPRlRXQVJFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJKUEVHX1NPRlRXQVJFIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfSlBFR19TVFJFQU1fSEVBREVSUwotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9KUEVHX1NUUkVBTV9IRUFERVJTKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJKUEVHX1NUUkVBTV9IRUFERVJTIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9KUEVHX1NUUkVBTV9IRUFERVJTKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJKUEVHX1NUUkVBTV9IRUFERVJTIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfS0VZRlJBTUUKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfS0VZRlJBTUUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIktFWUZSQU1FIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9LRVlGUkFNRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiS0VZRlJBTUUiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9LRVlGUkFNRV9ESVNUQU5DRQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9LRVlGUkFNRV9ESVNUQU5DRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiS0VZRlJBTUVfRElTVEFOQ0UiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0tFWUZSQU1FX0RJU1RBTkNFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJLRVlGUkFNRV9ESVNUQU5DRSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0xBU1RfRlJBTUVfSU5ERVgKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTEFTVF9GUkFNRV9JTkRFWCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTEFTVF9GUkFNRV9JTkRFWCIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTEFTVF9GUkFNRV9JTkRFWCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTEFTVF9GUkFNRV9JTkRFWCIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0xBWUVSCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0xBWUVSKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJMQVlFUiIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTEFZRVIpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkxBWUVSIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfTFVNQV9USFJFU0hPTEQKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTFVNQV9USFJFU0hPTEQpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkxVTUFfVEhSRVNIT0xEIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9MVU1BX1RIUkVTSE9MRCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTFVNQV9USFJFU0hPTEQiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9NQVhfTlVNQkVSX09GX0FVRElPX0FMR09SSVRITVMKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTUFYX05VTUJFUl9PRl9BVURJT19BTEdPUklUSE1TKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNQVhfTlVNQkVSX09GX0FVRElPX0FMR09SSVRITVMiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX01BWF9OVU1CRVJfT0ZfQVVESU9fQUxHT1JJVEhNUyk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTUFYX05VTUJFUl9PRl9BVURJT19BTEdPUklUSE1TIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfTUFYX05VTUJFUl9PRl9GT1JNQVRTCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX01BWF9OVU1CRVJfT0ZfRk9STUFUUyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTUFYX05VTUJFUl9PRl9GT1JNQVRTIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9NQVhfTlVNQkVSX09GX0ZPUk1BVFMpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1BWF9OVU1CRVJfT0ZfRk9STUFUUyIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX01BWF9OVU1CRVJfT0ZfT1JJR0lOQUxfRk9STUFUUwotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9NQVhfTlVNQkVSX09GX09SSUdJTkFMX0ZPUk1BVFMpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1BWF9OVU1CRVJfT0ZfT1JJR0lOQUxfRk9STUFUUyIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTUFYX05VTUJFUl9PRl9PUklHSU5BTF9GT1JNQVRTKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNQVhfTlVNQkVSX09GX09SSUdJTkFMX0ZPUk1BVFMiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9NQVhfTlVNQkVSX09GX1BBUkFNUwotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9NQVhfTlVNQkVSX09GX1BBUkFNUyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTUFYX05VTUJFUl9PRl9QQVJBTVMiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX01BWF9OVU1CRVJfT0ZfUEFSQU1TKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNQVhfTlVNQkVSX09GX1BBUkFNUyIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX01BWF9OVU1CRVJfT0ZfVklERU9fQUxHT1JJVEhNUwotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9NQVhfTlVNQkVSX09GX1ZJREVPX0FMR09SSVRITVMpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1BWF9OVU1CRVJfT0ZfVklERU9fQUxHT1JJVEhNUyIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTUFYX05VTUJFUl9PRl9WSURFT19BTEdPUklUSE1TKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNQVhfTlVNQkVSX09GX1ZJREVPX0FMR09SSVRITVMiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9NT05PCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX01PTk8pOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1PTk8iLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX01PTk8pOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1PTk8iLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9NUEVHMV9BVURJT19BV0FSRQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9NUEVHMV9BVURJT19BV0FSRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVBFRzFfQVVESU9fQVdBUkUiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX01QRUcxX0FVRElPX0FXQVJFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNUEVHMV9BVURJT19BV0FSRSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX01QRUcxX0FVRElPX0xBWUVSCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX01QRUcxX0FVRElPX0xBWUVSKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNUEVHMV9BVURJT19MQVlFUiIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVBFRzFfQVVESU9fTEFZRVIpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1QRUcxX0FVRElPX0xBWUVSIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfTVBFRzFfQVVESU9fTEFZRVJfSQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9NUEVHMV9BVURJT19MQVlFUl9JKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNUEVHMV9BVURJT19MQVlFUl9JIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9NUEVHMV9BVURJT19MQVlFUl9JKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNUEVHMV9BVURJT19MQVlFUl9JIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfTVBFRzFfQVVESU9fTEFZRVJfSUkKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVBFRzFfQVVESU9fTEFZRVJfSUkpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1QRUcxX0FVRElPX0xBWUVSX0lJIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9NUEVHMV9BVURJT19MQVlFUl9JSSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVBFRzFfQVVESU9fTEFZRVJfSUkiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9NUEVHMV9BVURJT19NT0RFCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX01QRUcxX0FVRElPX01PREUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1QRUcxX0FVRElPX01PREUiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX01QRUcxX0FVRElPX01PREUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1QRUcxX0FVRElPX01PREUiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9NUEVHMV9BVURJT19NT0RFX0RVQUwKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVBFRzFfQVVESU9fTU9ERV9EVUFMKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNUEVHMV9BVURJT19NT0RFX0RVQUwiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX01QRUcxX0FVRElPX01PREVfRFVBTCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVBFRzFfQVVESU9fTU9ERV9EVUFMIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfTVBFRzFfQVVESU9fTU9ERV9KT0lOVAotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9NUEVHMV9BVURJT19NT0RFX0pPSU5UKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNUEVHMV9BVURJT19NT0RFX0pPSU5UIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9NUEVHMV9BVURJT19NT0RFX0pPSU5UKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNUEVHMV9BVURJT19NT0RFX0pPSU5UIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfTVBFRzFfQVVESU9fTU9ERV9TSU5HTEUKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVBFRzFfQVVESU9fTU9ERV9TSU5HTEUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1QRUcxX0FVRElPX01PREVfU0lOR0xFIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9NUEVHMV9BVURJT19NT0RFX1NJTkdMRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVBFRzFfQVVESU9fTU9ERV9TSU5HTEUiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9NUEVHMV9BVURJT19NT0RFX1NURVJFTwotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9NUEVHMV9BVURJT19NT0RFX1NURVJFTyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVBFRzFfQVVESU9fTU9ERV9TVEVSRU8iLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX01QRUcxX0FVRElPX01PREVfU1RFUkVPKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNUEVHMV9BVURJT19NT0RFX1NURVJFTyIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX01QRUcxX0FVRElPX1NPRlRXQVJFCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX01QRUcxX0FVRElPX1NPRlRXQVJFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNUEVHMV9BVURJT19TT0ZUV0FSRSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVBFRzFfQVVESU9fU09GVFdBUkUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1QRUcxX0FVRElPX1NPRlRXQVJFIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfTVBFRzFfRU5EX09GX1NUUkVBTQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9NUEVHMV9FTkRfT0ZfU1RSRUFNKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNUEVHMV9FTkRfT0ZfU1RSRUFNIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9NUEVHMV9FTkRfT0ZfU1RSRUFNKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNUEVHMV9FTkRfT0ZfU1RSRUFNIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfTVBFRzFfRVJST1IKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVBFRzFfRVJST1IpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1QRUcxX0VSUk9SIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9NUEVHMV9FUlJPUik7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVBFRzFfRVJST1IiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9NUEVHMV9OVU1fUEFSQU1TCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX01QRUcxX05VTV9QQVJBTVMpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1QRUcxX05VTV9QQVJBTVMiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX01QRUcxX05VTV9QQVJBTVMpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1QRUcxX05VTV9QQVJBTVMiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9NUEVHMV9WSURFT19NCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX01QRUcxX1ZJREVPX00pOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1QRUcxX1ZJREVPX00iLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX01QRUcxX1ZJREVPX00pOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1QRUcxX1ZJREVPX00iLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9NUEVHMV9WSURFT19NQVhfTU9USU9OX1ZFQ1RPUl9MRU5HVEhfQl9YCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX01QRUcxX1ZJREVPX01BWF9NT1RJT05fVkVDVE9SX0xFTkdUSF9CX1gpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1QRUcxX1ZJREVPX01BWF9NT1RJT05fVkVDVE9SX0xFTkdUSF9CX1giLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX01QRUcxX1ZJREVPX01BWF9NT1RJT05fVkVDVE9SX0xFTkdUSF9CX1gpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1QRUcxX1ZJREVPX01BWF9NT1RJT05fVkVDVE9SX0xFTkdUSF9CX1giLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9NUEVHMV9WSURFT19NQVhfTU9USU9OX1ZFQ1RPUl9MRU5HVEhfQl9ZCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX01QRUcxX1ZJREVPX01BWF9NT1RJT05fVkVDVE9SX0xFTkdUSF9CX1kpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1QRUcxX1ZJREVPX01BWF9NT1RJT05fVkVDVE9SX0xFTkdUSF9CX1kiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX01QRUcxX1ZJREVPX01BWF9NT1RJT05fVkVDVE9SX0xFTkdUSF9CX1kpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1QRUcxX1ZJREVPX01BWF9NT1RJT05fVkVDVE9SX0xFTkdUSF9CX1kiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9NUEVHMV9WSURFT19NQVhfTU9USU9OX1ZFQ1RPUl9MRU5HVEhfUF9YCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX01QRUcxX1ZJREVPX01BWF9NT1RJT05fVkVDVE9SX0xFTkdUSF9QX1gpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1QRUcxX1ZJREVPX01BWF9NT1RJT05fVkVDVE9SX0xFTkdUSF9QX1giLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX01QRUcxX1ZJREVPX01BWF9NT1RJT05fVkVDVE9SX0xFTkdUSF9QX1gpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1QRUcxX1ZJREVPX01BWF9NT1RJT05fVkVDVE9SX0xFTkdUSF9QX1giLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9NUEVHMV9WSURFT19NQVhfTU9USU9OX1ZFQ1RPUl9MRU5HVEhfUF9ZCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX01QRUcxX1ZJREVPX01BWF9NT1RJT05fVkVDVE9SX0xFTkdUSF9QX1kpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1QRUcxX1ZJREVPX01BWF9NT1RJT05fVkVDVE9SX0xFTkdUSF9QX1kiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX01QRUcxX1ZJREVPX01BWF9NT1RJT05fVkVDVE9SX0xFTkdUSF9QX1kpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1QRUcxX1ZJREVPX01BWF9NT1RJT05fVkVDVE9SX0xFTkdUSF9QX1kiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9NUEVHMV9WSURFT19OCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX01QRUcxX1ZJREVPX04pOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1QRUcxX1ZJREVPX04iLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX01QRUcxX1ZJREVPX04pOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1QRUcxX1ZJREVPX04iLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9NUEVHMV9WSURFT19TT0ZUTkVTUwotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9NUEVHMV9WSURFT19TT0ZUTkVTUyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVBFRzFfVklERU9fU09GVE5FU1MiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX01QRUcxX1ZJREVPX1NPRlRORVNTKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNUEVHMV9WSURFT19TT0ZUTkVTUyIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX01QRUcxX1ZJREVPX1NPRlRORVNTX01BWElNVU0KLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVBFRzFfVklERU9fU09GVE5FU1NfTUFYSU1VTSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVBFRzFfVklERU9fU09GVE5FU1NfTUFYSU1VTSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVBFRzFfVklERU9fU09GVE5FU1NfTUFYSU1VTSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVBFRzFfVklERU9fU09GVE5FU1NfTUFYSU1VTSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX01QRUcxX1ZJREVPX1NPRlRORVNTX01FRElVTQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9NUEVHMV9WSURFT19TT0ZUTkVTU19NRURJVU0pOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1QRUcxX1ZJREVPX1NPRlRORVNTX01FRElVTSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVBFRzFfVklERU9fU09GVE5FU1NfTUVESVVNKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNUEVHMV9WSURFT19TT0ZUTkVTU19NRURJVU0iLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9NUEVHMV9WSURFT19TT0ZUTkVTU19OT05FCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX01QRUcxX1ZJREVPX1NPRlRORVNTX05PTkUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1QRUcxX1ZJREVPX1NPRlRORVNTX05PTkUiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX01QRUcxX1ZJREVPX1NPRlRORVNTX05PTkUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1QRUcxX1ZJREVPX1NPRlRORVNTX05PTkUiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9NUEVHMV9WSURFT19TT0ZUV0FSRQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9NUEVHMV9WSURFT19TT0ZUV0FSRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVBFRzFfVklERU9fU09GVFdBUkUiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX01QRUcxX1ZJREVPX1NPRlRXQVJFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNUEVHMV9WSURFT19TT0ZUV0FSRSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX01QRUdfVklERU8KLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVBFR19WSURFTyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVBFR19WSURFTyIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVBFR19WSURFTyk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVBFR19WSURFTyIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX01VTFRJUkFURV9BV0FSRQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9NVUxUSVJBVEVfQVdBUkUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1VTFRJUkFURV9BV0FSRSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVVMVElSQVRFX0FXQVJFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNVUxUSVJBVEVfQVdBUkUiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9NVkMxCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX01WQzEpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1WQzEiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX01WQzEpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1WQzEiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9NVkMxX1NPRlRXQVJFCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX01WQzFfU09GVFdBUkUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1WQzFfU09GVFdBUkUiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX01WQzFfU09GVFdBUkUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1WQzFfU09GVFdBUkUiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9NVkMyCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX01WQzIpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1WQzIiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX01WQzIpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1WQzIiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9NVkMyX0JMRU5ESU5HCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX01WQzJfQkxFTkRJTkcpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1WQzJfQkxFTkRJTkciLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX01WQzJfQkxFTkRJTkcpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1WQzJfQkxFTkRJTkciLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9NVkMyX0JMRU5ESU5HX09GRgotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9NVkMyX0JMRU5ESU5HX09GRik7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVZDMl9CTEVORElOR19PRkYiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX01WQzJfQkxFTkRJTkdfT0ZGKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNVkMyX0JMRU5ESU5HX09GRiIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX01WQzJfQkxFTkRJTkdfT04KLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVZDMl9CTEVORElOR19PTik7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVZDMl9CTEVORElOR19PTiIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVZDMl9CTEVORElOR19PTik7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVZDMl9CTEVORElOR19PTiIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX01WQzJfQ0hST01BX1RIUkVTSE9MRAotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9NVkMyX0NIUk9NQV9USFJFU0hPTEQpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1WQzJfQ0hST01BX1RIUkVTSE9MRCIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVZDMl9DSFJPTUFfVEhSRVNIT0xEKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNVkMyX0NIUk9NQV9USFJFU0hPTEQiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9NVkMyX0VER0VfVEhSRVNIT0xECi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX01WQzJfRURHRV9USFJFU0hPTEQpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1WQzJfRURHRV9USFJFU0hPTEQiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX01WQzJfRURHRV9USFJFU0hPTEQpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1WQzJfRURHRV9USFJFU0hPTEQiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9NVkMyX0VSUk9SCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX01WQzJfRVJST1IpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1WQzJfRVJST1IiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX01WQzJfRVJST1IpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1WQzJfRVJST1IiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9NVkMyX0xVTUFfVEhSRVNIT0xECi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX01WQzJfTFVNQV9USFJFU0hPTEQpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1WQzJfTFVNQV9USFJFU0hPTEQiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX01WQzJfTFVNQV9USFJFU0hPTEQpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1WQzJfTFVNQV9USFJFU0hPTEQiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9NVkMyX1NPRlRXQVJFCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX01WQzJfU09GVFdBUkUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1WQzJfU09GVFdBUkUiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX01WQzJfU09GVFdBUkUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1WQzJfU09GVFdBUkUiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9NVkMzX1FVQUxJVFlfTEVWRUwKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVZDM19RVUFMSVRZX0xFVkVMKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNVkMzX1FVQUxJVFlfTEVWRUwiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX01WQzNfUVVBTElUWV9MRVZFTCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVZDM19RVUFMSVRZX0xFVkVMIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfTVZDM19TT0ZUV0FSRQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9NVkMzX1NPRlRXQVJFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNVkMzX1NPRlRXQVJFIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9NVkMzX1NPRlRXQVJFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNVkMzX1NPRlRXQVJFIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfTkVYVF9OT1RfQVZBSUxBQkxFCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX05FWFRfTk9UX0FWQUlMQUJMRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTkVYVF9OT1RfQVZBSUxBQkxFIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9ORVhUX05PVF9BVkFJTEFCTEUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk5FWFRfTk9UX0FWQUlMQUJMRSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX05PSVNFX01BUkdJTgotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9OT0lTRV9NQVJHSU4pOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk5PSVNFX01BUkdJTiIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTk9JU0VfTUFSR0lOKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJOT0lTRV9NQVJHSU4iLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9OT05FCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX05PTkUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk5PTkUiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX05PTkUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk5PTkUiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9OVU1CRVJfT0ZfRk9STUFUUwotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9OVU1CRVJfT0ZfRk9STUFUUyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTlVNQkVSX09GX0ZPUk1BVFMiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX05VTUJFUl9PRl9GT1JNQVRTKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJOVU1CRVJfT0ZfRk9STUFUUyIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX05VTUJFUl9PRl9GUkFNRVMKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTlVNQkVSX09GX0ZSQU1FUyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTlVNQkVSX09GX0ZSQU1FUyIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTlVNQkVSX09GX0ZSQU1FUyk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTlVNQkVSX09GX0ZSQU1FUyIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX05VTUJFUl9PRl9QQVJBTVMKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTlVNQkVSX09GX1BBUkFNUyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTlVNQkVSX09GX1BBUkFNUyIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTlVNQkVSX09GX1BBUkFNUyk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTlVNQkVSX09GX1BBUkFNUyIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX05VTUJFUl9PRl9QQVJBTVNfRlJFRVpFCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX05VTUJFUl9PRl9QQVJBTVNfRlJFRVpFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJOVU1CRVJfT0ZfUEFSQU1TX0ZSRUVaRSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTlVNQkVSX09GX1BBUkFNU19GUkVFWkUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk5VTUJFUl9PRl9QQVJBTVNfRlJFRVpFIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfTlVNQkVSX09GX1ZJREVPX0ZPUk1BVFMKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTlVNQkVSX09GX1ZJREVPX0ZPUk1BVFMpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk5VTUJFUl9PRl9WSURFT19GT1JNQVRTIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9OVU1CRVJfT0ZfVklERU9fRk9STUFUUyk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTlVNQkVSX09GX1ZJREVPX0ZPUk1BVFMiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9PUklFTlRBVElPTgotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9PUklFTlRBVElPTik7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiT1JJRU5UQVRJT04iLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX09SSUVOVEFUSU9OKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJPUklFTlRBVElPTiIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX09SSUdJTkFMX0ZPUk1BVAotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9PUklHSU5BTF9GT1JNQVQpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk9SSUdJTkFMX0ZPUk1BVCIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfT1JJR0lOQUxfRk9STUFUKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJPUklHSU5BTF9GT1JNQVQiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9QQVJBTV9PVVRfT0ZfUkFOR0UKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfUEFSQU1fT1VUX09GX1JBTkdFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJQQVJBTV9PVVRfT0ZfUkFOR0UiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX1BBUkFNX09VVF9PRl9SQU5HRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUEFSQU1fT1VUX09GX1JBTkdFIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfUElYRUxfQVNQRUNUCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX1BJWEVMX0FTUEVDVCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUElYRUxfQVNQRUNUIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9QSVhFTF9BU1BFQ1QpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlBJWEVMX0FTUEVDVCIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX1BSRURJQ1RFRAotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9QUkVESUNURUQpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlBSRURJQ1RFRCIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfUFJFRElDVEVEKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJQUkVESUNURUQiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9QUkVST0xMCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX1BSRVJPTEwpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlBSRVJPTEwiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX1BSRVJPTEwpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlBSRVJPTEwiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9RVUFMSVRZX0ZBQ1RPUgotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9RVUFMSVRZX0ZBQ1RPUik7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUVVBTElUWV9GQUNUT1IiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX1FVQUxJVFlfRkFDVE9SKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJRVUFMSVRZX0ZBQ1RPUiIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX1FVQUxJVFlfTEVWRUwKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfUVVBTElUWV9MRVZFTCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUVVBTElUWV9MRVZFTCIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfUVVBTElUWV9MRVZFTCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUVVBTElUWV9MRVZFTCIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX1FVQUxJVFlfU1BBVElBTAotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9RVUFMSVRZX1NQQVRJQUwpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlFVQUxJVFlfU1BBVElBTCIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfUVVBTElUWV9TUEFUSUFMKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJRVUFMSVRZX1NQQVRJQUwiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9RVUFMSVRZX1RFTVBPUkFMCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX1FVQUxJVFlfVEVNUE9SQUwpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlFVQUxJVFlfVEVNUE9SQUwiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX1FVQUxJVFlfVEVNUE9SQUwpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlFVQUxJVFlfVEVNUE9SQUwiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9RVUFOVElaQVRJT05fVEFCTEVTCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX1FVQU5USVpBVElPTl9UQUJMRVMpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlFVQU5USVpBVElPTl9UQUJMRVMiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX1FVQU5USVpBVElPTl9UQUJMRVMpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlFVQU5USVpBVElPTl9UQUJMRVMiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9SQU5HRV9WQUxVRQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9SQU5HRV9WQUxVRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUkFOR0VfVkFMVUUiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX1JBTkdFX1ZBTFVFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSQU5HRV9WQUxVRSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX1JHQgotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9SR0IpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJHQiIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfUkdCKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSR0IiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9SR0IzMzIKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfUkdCMzMyKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSR0IzMzIiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX1JHQjMzMik7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUkdCMzMyIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfUkdCOAotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9SR0I4KTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSR0I4IiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9SR0I4KTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSR0I4IiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfUkdCQQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9SR0JBKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSR0JBIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9SR0JBKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSR0JBIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfUkdCWAotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9SR0JYKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSR0JYIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9SR0JYKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSR0JYIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfUkxFCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX1JMRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUkxFIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9STEUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJMRSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX1JMRTI0Ci0JeCA9IFB5SW50X0Zyb21Mb25nKENMX1JMRTI0KTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSTEUyNCIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfUkxFMjQpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJMRTI0IiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfUkxFMjRfU09GVFdBUkUKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfUkxFMjRfU09GVFdBUkUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJMRTI0X1NPRlRXQVJFIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9STEUyNF9TT0ZUV0FSRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUkxFMjRfU09GVFdBUkUiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9STEVfU09GVFdBUkUKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfUkxFX1NPRlRXQVJFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSTEVfU09GVFdBUkUiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX1JMRV9TT0ZUV0FSRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUkxFX1NPRlRXQVJFIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfUlRSCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX1JUUik7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUlRSIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9SVFIpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJUUiIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX1JUUjEKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfUlRSMSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUlRSMSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfUlRSMSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUlRSMSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX1JUUl9RVUFMSVRZX0xFVkVMCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX1JUUl9RVUFMSVRZX0xFVkVMKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSVFJfUVVBTElUWV9MRVZFTCIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfUlRSX1FVQUxJVFlfTEVWRUwpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJUUl9RVUFMSVRZX0xFVkVMIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfU0FNUExFU19QRVJfVElMRQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9TQU1QTEVTX1BFUl9USUxFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTQU1QTEVTX1BFUl9USUxFIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9TQU1QTEVTX1BFUl9USUxFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTQU1QTEVTX1BFUl9USUxFIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfU0NIRU1FX0JVU1kKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfU0NIRU1FX0JVU1kpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNDSEVNRV9CVVNZIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9TQ0hFTUVfQlVTWSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0NIRU1FX0JVU1kiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9TQ0hFTUVfTk9UX0FWQUlMQUJMRQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9TQ0hFTUVfTk9UX0FWQUlMQUJMRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0NIRU1FX05PVF9BVkFJTEFCTEUiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX1NDSEVNRV9OT1RfQVZBSUxBQkxFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTQ0hFTUVfTk9UX0FWQUlMQUJMRSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX1NQRUVECi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX1NQRUVEKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTUEVFRCIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfU1BFRUQpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNQRUVEIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfU1RFUkVPX0lOVEVSTEVBVkVECi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX1NURVJFT19JTlRFUkxFQVZFRCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU1RFUkVPX0lOVEVSTEVBVkVEIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9TVEVSRU9fSU5URVJMRUFWRUQpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNURVJFT19JTlRFUkxFQVZFRCIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX1NUUkVBTV9IRUFERVJTCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX1NUUkVBTV9IRUFERVJTKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTVFJFQU1fSEVBREVSUyIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfU1RSRUFNX0hFQURFUlMpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNUUkVBTV9IRUFERVJTIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfVElMRV9USFJFU0hPTEQKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfVElMRV9USFJFU0hPTEQpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlRJTEVfVEhSRVNIT0xEIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9USUxFX1RIUkVTSE9MRCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiVElMRV9USFJFU0hPTEQiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9UT1BfRE9XTgotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9UT1BfRE9XTik7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiVE9QX0RPV04iLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX1RPUF9ET1dOKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJUT1BfRE9XTiIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX1VMQVcKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfVUxBVyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiVUxBVyIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfVUxBVyk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiVUxBVyIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX1VOQ09NUFJFU1NFRAotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9VTkNPTVBSRVNTRUQpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlVOQ09NUFJFU1NFRCIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfVU5DT01QUkVTU0VEKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJVTkNPTVBSRVNTRUQiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9VTkNPTVBSRVNTRURfQVVESU8KLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfVU5DT01QUkVTU0VEX0FVRElPKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJVTkNPTVBSRVNTRURfQVVESU8iLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX1VOQ09NUFJFU1NFRF9BVURJTyk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiVU5DT01QUkVTU0VEX0FVRElPIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfVU5DT01QUkVTU0VEX1ZJREVPCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX1VOQ09NUFJFU1NFRF9WSURFTyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiVU5DT01QUkVTU0VEX1ZJREVPIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9VTkNPTVBSRVNTRURfVklERU8pOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlVOQ09NUFJFU1NFRF9WSURFTyIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX1VOS05PV05fU0NIRU1FCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX1VOS05PV05fU0NIRU1FKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJVTktOT1dOX1NDSEVNRSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfVU5LTk9XTl9TQ0hFTUUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlVOS05PV05fU0NIRU1FIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfVklERU8KLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfVklERU8pOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlZJREVPIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9WSURFTyk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiVklERU8iLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9ZCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX1kpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlkiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX1kpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlkiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9ZQ2JDcgotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9ZQ2JDcik7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiWUNiQ3IiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX1lDYkNyKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJZQ2JDciIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX1lDYkNyNDIyCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX1lDYkNyNDIyKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJZQ2JDcjQyMiIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfWUNiQ3I0MjIpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIllDYkNyNDIyIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfWUNiQ3I0MjJEQwotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9ZQ2JDcjQyMkRDKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJZQ2JDcjQyMkRDIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9ZQ2JDcjQyMkRDKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJZQ2JDcjQyMkRDIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfWUNiQ3I0MjJIQwotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9ZQ2JDcjQyMkhDKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJZQ2JDcjQyMkhDIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9ZQ2JDcjQyMkhDKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJZQ2JDcjQyMkhDIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfWVVWCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX1lVVik7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiWVVWIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9ZVVYpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIllVViIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX1lVVjQyMgotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9ZVVY0MjIpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIllVVjQyMiIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfWVVWNDIyKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJZVVY0MjIiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9ZVVY0MjJEQwotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9ZVVY0MjJEQyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiWVVWNDIyREMiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX1lVVjQyMkRDKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJZVVY0MjJEQyIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX1lVVjQyMkhDCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX1lVVjQyMkhDKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJZVVY0MjJIQyIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfWVVWNDIySEMpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIllVVjQyMkhDIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQVdDTVBfU1RFUkVPCi0JeCA9IFB5SW50X0Zyb21Mb25nKEFXQ01QX1NURVJFTyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQVdDTVBfU1RFUkVPIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhBV0NNUF9TVEVSRU8pOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkFXQ01QX1NURVJFTyIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFXQ01QX0pPSU5UX1NURVJFTwotCXggPSBQeUludF9Gcm9tTG9uZyhBV0NNUF9KT0lOVF9TVEVSRU8pOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkFXQ01QX0pPSU5UX1NURVJFTyIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQVdDTVBfSk9JTlRfU1RFUkVPKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJBV0NNUF9KT0lOVF9TVEVSRU8iLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBV0NNUF9JTkRFUEVOREVOVAotCXggPSBQeUludF9Gcm9tTG9uZyhBV0NNUF9JTkRFUEVOREVOVCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQVdDTVBfSU5ERVBFTkRFTlQiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKEFXQ01QX0lOREVQRU5ERU5UKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJBV0NNUF9JTkRFUEVOREVOVCIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFXQ01QX0ZJWEVEX1JBVEUKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQVdDTVBfRklYRURfUkFURSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQVdDTVBfRklYRURfUkFURSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQVdDTVBfRklYRURfUkFURSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQVdDTVBfRklYRURfUkFURSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFXQ01QX0NPTlNUX1FVQUwKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQVdDTVBfQ09OU1RfUVVBTCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQVdDTVBfQ09OU1RfUVVBTCIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQVdDTVBfQ09OU1RfUVVBTCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQVdDTVBfQ09OU1RfUVVBTCIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFXQ01QX0xPU1NMRVNTCi0JeCA9IFB5SW50X0Zyb21Mb25nKEFXQ01QX0xPU1NMRVNTKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJBV0NNUF9MT1NTTEVTUyIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQVdDTVBfTE9TU0xFU1MpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkFXQ01QX0xPU1NMRVNTIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQVdDTVBfTVBFR19MQVlFUl9JCi0JeCA9IFB5SW50X0Zyb21Mb25nKEFXQ01QX01QRUdfTEFZRVJfSSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQVdDTVBfTVBFR19MQVlFUl9JIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhBV0NNUF9NUEVHX0xBWUVSX0kpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkFXQ01QX01QRUdfTEFZRVJfSSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFXQ01QX01QRUdfTEFZRVJfSUkKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQVdDTVBfTVBFR19MQVlFUl9JSSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQVdDTVBfTVBFR19MQVlFUl9JSSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQVdDTVBfTVBFR19MQVlFUl9JSSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQVdDTVBfTVBFR19MQVlFUl9JSSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogCi0JKHZvaWQpIGNsU2V0RXJyb3JIYW5kbGVyKGNsX0Vycm9ySGFuZGxlcik7CisgICAgKHZvaWQpIGNsU2V0RXJyb3JIYW5kbGVyKGNsX0Vycm9ySGFuZGxlcik7CiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL2NtYXRobW9kdWxlLmMgYi9Nb2R1bGVzL2NtYXRobW9kdWxlLmMKaW5kZXggN2IyZTMxNi4uZWVjNjFjMCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9jbWF0aG1vZHVsZS5jCisrKyBiL01vZHVsZXMvY21hdGhtb2R1bGUuYwpAQCAtMzEsNyArMzEsNyBAQAogI2RlZmluZSBDTV9MT0dfTEFSR0VfRE9VQkxFIChsb2coQ01fTEFSR0VfRE9VQkxFKSkKICNkZWZpbmUgQ01fU1FSVF9EQkxfTUlOIChzcXJ0KERCTF9NSU4pKQogCi0vKiAKKy8qCiAgICBDTV9TQ0FMRV9VUCBpcyBhbiBvZGQgaW50ZWdlciBjaG9zZW4gc3VjaCB0aGF0IG11bHRpcGxpY2F0aW9uIGJ5CiAgICAyKipDTV9TQ0FMRV9VUCBpcyBzdWZmaWNpZW50IHRvIHR1cm4gYSBzdWJub3JtYWwgaW50byBhIG5vcm1hbC4KICAgIENNX1NDQUxFX0RPV04gaXMgKC0oQ01fU0NBTEVfVVArMSkvMikuICBUaGVzZSBzY2FsaW5ncyBhcmUgdXNlZCB0byBjb21wdXRlCkBAIC02Miw0NiArNjIsNDYgQEAKICovCiAKIGVudW0gc3BlY2lhbF90eXBlcyB7Ci0JU1RfTklORiwJLyogMCwgbmVnYXRpdmUgaW5maW5pdHkgKi8KLQlTVF9ORUcsCQkvKiAxLCBuZWdhdGl2ZSBmaW5pdGUgbnVtYmVyIChub256ZXJvKSAqLwotCVNUX05aRVJPLAkvKiAyLCAtMC4gKi8KLQlTVF9QWkVSTywJLyogMywgKzAuICovCi0JU1RfUE9TLAkJLyogNCwgcG9zaXRpdmUgZmluaXRlIG51bWJlciAobm9uemVybykgKi8KLQlTVF9QSU5GLAkvKiA1LCBwb3NpdGl2ZSBpbmZpbml0eSAqLwotCVNUX05BTgkJLyogNiwgTm90IGEgTnVtYmVyICovCisgICAgU1RfTklORiwgICAgICAgICAgICAvKiAwLCBuZWdhdGl2ZSBpbmZpbml0eSAqLworICAgIFNUX05FRywgICAgICAgICAgICAgLyogMSwgbmVnYXRpdmUgZmluaXRlIG51bWJlciAobm9uemVybykgKi8KKyAgICBTVF9OWkVSTywgICAgICAgICAgIC8qIDIsIC0wLiAqLworICAgIFNUX1BaRVJPLCAgICAgICAgICAgLyogMywgKzAuICovCisgICAgU1RfUE9TLCAgICAgICAgICAgICAvKiA0LCBwb3NpdGl2ZSBmaW5pdGUgbnVtYmVyIChub256ZXJvKSAqLworICAgIFNUX1BJTkYsICAgICAgICAgICAgLyogNSwgcG9zaXRpdmUgaW5maW5pdHkgKi8KKyAgICBTVF9OQU4gICAgICAgICAgICAgIC8qIDYsIE5vdCBhIE51bWJlciAqLwogfTsKIAogc3RhdGljIGVudW0gc3BlY2lhbF90eXBlcwogc3BlY2lhbF90eXBlKGRvdWJsZSBkKQogewotCWlmIChQeV9JU19GSU5JVEUoZCkpIHsKLQkJaWYgKGQgIT0gMCkgewotCQkJaWYgKGNvcHlzaWduKDEuLCBkKSA9PSAxLikKLQkJCQlyZXR1cm4gU1RfUE9TOwotCQkJZWxzZQotCQkJCXJldHVybiBTVF9ORUc7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoY29weXNpZ24oMS4sIGQpID09IDEuKQotCQkJCXJldHVybiBTVF9QWkVSTzsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gU1RfTlpFUk87Ci0JCX0KLQl9Ci0JaWYgKFB5X0lTX05BTihkKSkKLQkJcmV0dXJuIFNUX05BTjsKLQlpZiAoY29weXNpZ24oMS4sIGQpID09IDEuKQotCQlyZXR1cm4gU1RfUElORjsKLQllbHNlCi0JCXJldHVybiBTVF9OSU5GOworICAgIGlmIChQeV9JU19GSU5JVEUoZCkpIHsKKyAgICAgICAgaWYgKGQgIT0gMCkgeworICAgICAgICAgICAgaWYgKGNvcHlzaWduKDEuLCBkKSA9PSAxLikKKyAgICAgICAgICAgICAgICByZXR1cm4gU1RfUE9TOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBTVF9ORUc7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAoY29weXNpZ24oMS4sIGQpID09IDEuKQorICAgICAgICAgICAgICAgIHJldHVybiBTVF9QWkVSTzsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gU1RfTlpFUk87CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKFB5X0lTX05BTihkKSkKKyAgICAgICAgcmV0dXJuIFNUX05BTjsKKyAgICBpZiAoY29weXNpZ24oMS4sIGQpID09IDEuKQorICAgICAgICByZXR1cm4gU1RfUElORjsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBTVF9OSU5GOwogfQogCi0jZGVmaW5lIFNQRUNJQUxfVkFMVUUoeiwgdGFibGUpCQkJCQkJXAotCWlmICghUHlfSVNfRklOSVRFKCh6KS5yZWFsKSB8fCAhUHlfSVNfRklOSVRFKCh6KS5pbWFnKSkgewlcCi0JCWVycm5vID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQlyZXR1cm4gdGFibGVbc3BlY2lhbF90eXBlKCh6KS5yZWFsKV0JICAgICAgICAgICAgICAgIFwKLQkJCSAgICBbc3BlY2lhbF90eXBlKCh6KS5pbWFnKV07CQkJXAotCX0KKyNkZWZpbmUgU1BFQ0lBTF9WQUxVRSh6LCB0YWJsZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIVB5X0lTX0ZJTklURSgoeikucmVhbCkgfHwgIVB5X0lTX0ZJTklURSgoeikuaW1hZykpIHsgICAgICAgICAgIFwKKyAgICAgICAgZXJybm8gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiB0YWJsZVtzcGVjaWFsX3R5cGUoKHopLnJlYWwpXSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIFtzcGVjaWFsX3R5cGUoKHopLmltYWcpXTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQogCiAjZGVmaW5lIFAgUHlfTUFUSF9QSQogI2RlZmluZSBQMTQgMC4yNSpQeV9NQVRIX1BJCkBAIC0xMjUsMzQgKzEyNSwzNCBAQAogc3RhdGljIFB5X2NvbXBsZXgKIGNfYWNvcyhQeV9jb21wbGV4IHopCiB7Ci0JUHlfY29tcGxleCBzMSwgczIsIHI7CisgICAgUHlfY29tcGxleCBzMSwgczIsIHI7CiAKLQlTUEVDSUFMX1ZBTFVFKHosIGFjb3Nfc3BlY2lhbF92YWx1ZXMpOworICAgIFNQRUNJQUxfVkFMVUUoeiwgYWNvc19zcGVjaWFsX3ZhbHVlcyk7CiAKLQlpZiAoZmFicyh6LnJlYWwpID4gQ01fTEFSR0VfRE9VQkxFIHx8IGZhYnMoei5pbWFnKSA+IENNX0xBUkdFX0RPVUJMRSkgewotCQkvKiBhdm9pZCB1bm5lY2Vzc2FyeSBvdmVyZmxvdyBmb3IgbGFyZ2UgYXJndW1lbnRzICovCi0JCXIucmVhbCA9IGF0YW4yKGZhYnMoei5pbWFnKSwgei5yZWFsKTsKLQkJLyogc3BsaXQgaW50byBjYXNlcyB0byBtYWtlIHN1cmUgdGhhdCB0aGUgYnJhbmNoIGN1dCBoYXMgdGhlCi0JCSAgIGNvcnJlY3QgY29udGludWl0eSBvbiBzeXN0ZW1zIHdpdGggdW5zaWduZWQgemVyb3MgKi8KLQkJaWYgKHoucmVhbCA8IDAuKSB7Ci0JCQlyLmltYWcgPSAtY29weXNpZ24obG9nKGh5cG90KHoucmVhbC8yLiwgei5pbWFnLzIuKSkgKwotCQkJCQkgICBNX0xOMioyLiwgei5pbWFnKTsKLQkJfSBlbHNlIHsKLQkJCXIuaW1hZyA9IGNvcHlzaWduKGxvZyhoeXBvdCh6LnJlYWwvMi4sIHouaW1hZy8yLikpICsKLQkJCQkJICBNX0xOMioyLiwgLXouaW1hZyk7Ci0JCX0KLQl9IGVsc2UgewotCQlzMS5yZWFsID0gMS4tei5yZWFsOwotCQlzMS5pbWFnID0gLXouaW1hZzsKLQkJczEgPSBjX3NxcnQoczEpOwotCQlzMi5yZWFsID0gMS4rei5yZWFsOwotCQlzMi5pbWFnID0gei5pbWFnOwotCQlzMiA9IGNfc3FydChzMik7Ci0JCXIucmVhbCA9IDIuKmF0YW4yKHMxLnJlYWwsIHMyLnJlYWwpOwotCQlyLmltYWcgPSBhc2luaChzMi5yZWFsKnMxLmltYWcgLSBzMi5pbWFnKnMxLnJlYWwpOwotCX0KLQllcnJubyA9IDA7Ci0JcmV0dXJuIHI7CisgICAgaWYgKGZhYnMoei5yZWFsKSA+IENNX0xBUkdFX0RPVUJMRSB8fCBmYWJzKHouaW1hZykgPiBDTV9MQVJHRV9ET1VCTEUpIHsKKyAgICAgICAgLyogYXZvaWQgdW5uZWNlc3Nhcnkgb3ZlcmZsb3cgZm9yIGxhcmdlIGFyZ3VtZW50cyAqLworICAgICAgICByLnJlYWwgPSBhdGFuMihmYWJzKHouaW1hZyksIHoucmVhbCk7CisgICAgICAgIC8qIHNwbGl0IGludG8gY2FzZXMgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGJyYW5jaCBjdXQgaGFzIHRoZQorICAgICAgICAgICBjb3JyZWN0IGNvbnRpbnVpdHkgb24gc3lzdGVtcyB3aXRoIHVuc2lnbmVkIHplcm9zICovCisgICAgICAgIGlmICh6LnJlYWwgPCAwLikgeworICAgICAgICAgICAgci5pbWFnID0gLWNvcHlzaWduKGxvZyhoeXBvdCh6LnJlYWwvMi4sIHouaW1hZy8yLikpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNX0xOMioyLiwgei5pbWFnKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHIuaW1hZyA9IGNvcHlzaWduKGxvZyhoeXBvdCh6LnJlYWwvMi4sIHouaW1hZy8yLikpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1fTE4yKjIuLCAtei5pbWFnKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHMxLnJlYWwgPSAxLi16LnJlYWw7CisgICAgICAgIHMxLmltYWcgPSAtei5pbWFnOworICAgICAgICBzMSA9IGNfc3FydChzMSk7CisgICAgICAgIHMyLnJlYWwgPSAxLit6LnJlYWw7CisgICAgICAgIHMyLmltYWcgPSB6LmltYWc7CisgICAgICAgIHMyID0gY19zcXJ0KHMyKTsKKyAgICAgICAgci5yZWFsID0gMi4qYXRhbjIoczEucmVhbCwgczIucmVhbCk7CisgICAgICAgIHIuaW1hZyA9IGFzaW5oKHMyLnJlYWwqczEuaW1hZyAtIHMyLmltYWcqczEucmVhbCk7CisgICAgfQorICAgIGVycm5vID0gMDsKKyAgICByZXR1cm4gcjsKIH0KIAogUHlEb2NfU1RSVkFSKGNfYWNvc19kb2MsCkBAIC0xNjYsMjYgKzE2NiwyNiBAQAogc3RhdGljIFB5X2NvbXBsZXgKIGNfYWNvc2goUHlfY29tcGxleCB6KQogewotCVB5X2NvbXBsZXggczEsIHMyLCByOworICAgIFB5X2NvbXBsZXggczEsIHMyLCByOwogCi0JU1BFQ0lBTF9WQUxVRSh6LCBhY29zaF9zcGVjaWFsX3ZhbHVlcyk7CisgICAgU1BFQ0lBTF9WQUxVRSh6LCBhY29zaF9zcGVjaWFsX3ZhbHVlcyk7CiAKLQlpZiAoZmFicyh6LnJlYWwpID4gQ01fTEFSR0VfRE9VQkxFIHx8IGZhYnMoei5pbWFnKSA+IENNX0xBUkdFX0RPVUJMRSkgewotCQkvKiBhdm9pZCB1bm5lY2Vzc2FyeSBvdmVyZmxvdyBmb3IgbGFyZ2UgYXJndW1lbnRzICovCi0JCXIucmVhbCA9IGxvZyhoeXBvdCh6LnJlYWwvMi4sIHouaW1hZy8yLikpICsgTV9MTjIqMi47Ci0JCXIuaW1hZyA9IGF0YW4yKHouaW1hZywgei5yZWFsKTsKLQl9IGVsc2UgewotCQlzMS5yZWFsID0gei5yZWFsIC0gMS47Ci0JCXMxLmltYWcgPSB6LmltYWc7Ci0JCXMxID0gY19zcXJ0KHMxKTsKLQkJczIucmVhbCA9IHoucmVhbCArIDEuOwotCQlzMi5pbWFnID0gei5pbWFnOwotCQlzMiA9IGNfc3FydChzMik7Ci0JCXIucmVhbCA9IGFzaW5oKHMxLnJlYWwqczIucmVhbCArIHMxLmltYWcqczIuaW1hZyk7Ci0JCXIuaW1hZyA9IDIuKmF0YW4yKHMxLmltYWcsIHMyLnJlYWwpOwotCX0KLQllcnJubyA9IDA7Ci0JcmV0dXJuIHI7CisgICAgaWYgKGZhYnMoei5yZWFsKSA+IENNX0xBUkdFX0RPVUJMRSB8fCBmYWJzKHouaW1hZykgPiBDTV9MQVJHRV9ET1VCTEUpIHsKKyAgICAgICAgLyogYXZvaWQgdW5uZWNlc3Nhcnkgb3ZlcmZsb3cgZm9yIGxhcmdlIGFyZ3VtZW50cyAqLworICAgICAgICByLnJlYWwgPSBsb2coaHlwb3Qoei5yZWFsLzIuLCB6LmltYWcvMi4pKSArIE1fTE4yKjIuOworICAgICAgICByLmltYWcgPSBhdGFuMih6LmltYWcsIHoucmVhbCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgczEucmVhbCA9IHoucmVhbCAtIDEuOworICAgICAgICBzMS5pbWFnID0gei5pbWFnOworICAgICAgICBzMSA9IGNfc3FydChzMSk7CisgICAgICAgIHMyLnJlYWwgPSB6LnJlYWwgKyAxLjsKKyAgICAgICAgczIuaW1hZyA9IHouaW1hZzsKKyAgICAgICAgczIgPSBjX3NxcnQoczIpOworICAgICAgICByLnJlYWwgPSBhc2luaChzMS5yZWFsKnMyLnJlYWwgKyBzMS5pbWFnKnMyLmltYWcpOworICAgICAgICByLmltYWcgPSAyLiphdGFuMihzMS5pbWFnLCBzMi5yZWFsKTsKKyAgICB9CisgICAgZXJybm8gPSAwOworICAgIHJldHVybiByOwogfQogCiBQeURvY19TVFJWQVIoY19hY29zaF9kb2MsCkBAIC0xOTcsMTQgKzE5NywxNCBAQAogc3RhdGljIFB5X2NvbXBsZXgKIGNfYXNpbihQeV9jb21wbGV4IHopCiB7Ci0JLyogYXNpbih6KSA9IC1pIGFzaW5oKGl6KSAqLwotCVB5X2NvbXBsZXggcywgcjsKLQlzLnJlYWwgPSAtei5pbWFnOwotCXMuaW1hZyA9IHoucmVhbDsKLQlzID0gY19hc2luaChzKTsKLQlyLnJlYWwgPSBzLmltYWc7Ci0Jci5pbWFnID0gLXMucmVhbDsKLQlyZXR1cm4gcjsKKyAgICAvKiBhc2luKHopID0gLWkgYXNpbmgoaXopICovCisgICAgUHlfY29tcGxleCBzLCByOworICAgIHMucmVhbCA9IC16LmltYWc7CisgICAgcy5pbWFnID0gei5yZWFsOworICAgIHMgPSBjX2FzaW5oKHMpOworICAgIHIucmVhbCA9IHMuaW1hZzsKKyAgICByLmltYWcgPSAtcy5yZWFsOworICAgIHJldHVybiByOwogfQogCiBQeURvY19TVFJWQVIoY19hc2luX2RvYywKQEAgLTIxOCwzMSArMjE4LDMxIEBACiBzdGF0aWMgUHlfY29tcGxleAogY19hc2luaChQeV9jb21wbGV4IHopCiB7Ci0JUHlfY29tcGxleCBzMSwgczIsIHI7CisgICAgUHlfY29tcGxleCBzMSwgczIsIHI7CiAKLQlTUEVDSUFMX1ZBTFVFKHosIGFzaW5oX3NwZWNpYWxfdmFsdWVzKTsKKyAgICBTUEVDSUFMX1ZBTFVFKHosIGFzaW5oX3NwZWNpYWxfdmFsdWVzKTsKIAotCWlmIChmYWJzKHoucmVhbCkgPiBDTV9MQVJHRV9ET1VCTEUgfHwgZmFicyh6LmltYWcpID4gQ01fTEFSR0VfRE9VQkxFKSB7Ci0JCWlmICh6LmltYWcgPj0gMC4pIHsKLQkJCXIucmVhbCA9IGNvcHlzaWduKGxvZyhoeXBvdCh6LnJlYWwvMi4sIHouaW1hZy8yLikpICsKLQkJCQkJICBNX0xOMioyLiwgei5yZWFsKTsKLQkJfSBlbHNlIHsKLQkJCXIucmVhbCA9IC1jb3B5c2lnbihsb2coaHlwb3Qoei5yZWFsLzIuLCB6LmltYWcvMi4pKSArCi0JCQkJCSAgIE1fTE4yKjIuLCAtei5yZWFsKTsKLQkJfQotCQlyLmltYWcgPSBhdGFuMih6LmltYWcsIGZhYnMoei5yZWFsKSk7Ci0JfSBlbHNlIHsKLQkJczEucmVhbCA9IDEuK3ouaW1hZzsKLQkJczEuaW1hZyA9IC16LnJlYWw7Ci0JCXMxID0gY19zcXJ0KHMxKTsKLQkJczIucmVhbCA9IDEuLXouaW1hZzsKLQkJczIuaW1hZyA9IHoucmVhbDsKLQkJczIgPSBjX3NxcnQoczIpOwotCQlyLnJlYWwgPSBhc2luaChzMS5yZWFsKnMyLmltYWctczIucmVhbCpzMS5pbWFnKTsKLQkJci5pbWFnID0gYXRhbjIoei5pbWFnLCBzMS5yZWFsKnMyLnJlYWwtczEuaW1hZypzMi5pbWFnKTsKLQl9Ci0JZXJybm8gPSAwOwotCXJldHVybiByOworICAgIGlmIChmYWJzKHoucmVhbCkgPiBDTV9MQVJHRV9ET1VCTEUgfHwgZmFicyh6LmltYWcpID4gQ01fTEFSR0VfRE9VQkxFKSB7CisgICAgICAgIGlmICh6LmltYWcgPj0gMC4pIHsKKyAgICAgICAgICAgIHIucmVhbCA9IGNvcHlzaWduKGxvZyhoeXBvdCh6LnJlYWwvMi4sIHouaW1hZy8yLikpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1fTE4yKjIuLCB6LnJlYWwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgci5yZWFsID0gLWNvcHlzaWduKGxvZyhoeXBvdCh6LnJlYWwvMi4sIHouaW1hZy8yLikpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNX0xOMioyLiwgLXoucmVhbCk7CisgICAgICAgIH0KKyAgICAgICAgci5pbWFnID0gYXRhbjIoei5pbWFnLCBmYWJzKHoucmVhbCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIHMxLnJlYWwgPSAxLit6LmltYWc7CisgICAgICAgIHMxLmltYWcgPSAtei5yZWFsOworICAgICAgICBzMSA9IGNfc3FydChzMSk7CisgICAgICAgIHMyLnJlYWwgPSAxLi16LmltYWc7CisgICAgICAgIHMyLmltYWcgPSB6LnJlYWw7CisgICAgICAgIHMyID0gY19zcXJ0KHMyKTsKKyAgICAgICAgci5yZWFsID0gYXNpbmgoczEucmVhbCpzMi5pbWFnLXMyLnJlYWwqczEuaW1hZyk7CisgICAgICAgIHIuaW1hZyA9IGF0YW4yKHouaW1hZywgczEucmVhbCpzMi5yZWFsLXMxLmltYWcqczIuaW1hZyk7CisgICAgfQorICAgIGVycm5vID0gMDsKKyAgICByZXR1cm4gcjsKIH0KIAogUHlEb2NfU1RSVkFSKGNfYXNpbmhfZG9jLApAQCAtMjU0LDE0ICsyNTQsMTQgQEAKIHN0YXRpYyBQeV9jb21wbGV4CiBjX2F0YW4oUHlfY29tcGxleCB6KQogewotCS8qIGF0YW4oeikgPSAtaSBhdGFuaChpeikgKi8KLQlQeV9jb21wbGV4IHMsIHI7Ci0Jcy5yZWFsID0gLXouaW1hZzsKLQlzLmltYWcgPSB6LnJlYWw7Ci0JcyA9IGNfYXRhbmgocyk7Ci0Jci5yZWFsID0gcy5pbWFnOwotCXIuaW1hZyA9IC1zLnJlYWw7Ci0JcmV0dXJuIHI7CisgICAgLyogYXRhbih6KSA9IC1pIGF0YW5oKGl6KSAqLworICAgIFB5X2NvbXBsZXggcywgcjsKKyAgICBzLnJlYWwgPSAtei5pbWFnOworICAgIHMuaW1hZyA9IHoucmVhbDsKKyAgICBzID0gY19hdGFuaChzKTsKKyAgICByLnJlYWwgPSBzLmltYWc7CisgICAgci5pbWFnID0gLXMucmVhbDsKKyAgICByZXR1cm4gcjsKIH0KIAogLyogV2luZG93cyBzY3Jld3MgdXAgYXRhbjIgZm9yIGluZiBhbmQgbmFuLCBhbmQgYWxwaGEgVHJ1NjQgNS4xIGRvZXNuJ3QgZm9sbG93CkBAIC0yNjksMjkgKzI2OSwyOSBAQAogc3RhdGljIGRvdWJsZQogY19hdGFuMihQeV9jb21wbGV4IHopCiB7Ci0JaWYgKFB5X0lTX05BTih6LnJlYWwpIHx8IFB5X0lTX05BTih6LmltYWcpKQotCQlyZXR1cm4gUHlfTkFOOwotCWlmIChQeV9JU19JTkZJTklUWSh6LmltYWcpKSB7Ci0JCWlmIChQeV9JU19JTkZJTklUWSh6LnJlYWwpKSB7Ci0JCQlpZiAoY29weXNpZ24oMS4sIHoucmVhbCkgPT0gMS4pCi0JCQkJLyogYXRhbjIoKy1pbmYsICtpbmYpID09ICstcGkvNCAqLwotCQkJCXJldHVybiBjb3B5c2lnbigwLjI1KlB5X01BVEhfUEksIHouaW1hZyk7Ci0JCQllbHNlCi0JCQkJLyogYXRhbjIoKy1pbmYsIC1pbmYpID09ICstcGkqMy80ICovCi0JCQkJcmV0dXJuIGNvcHlzaWduKDAuNzUqUHlfTUFUSF9QSSwgei5pbWFnKTsKLQkJfQotCQkvKiBhdGFuMigrLWluZiwgeCkgPT0gKy1waS8yIGZvciBmaW5pdGUgeCAqLwotCQlyZXR1cm4gY29weXNpZ24oMC41KlB5X01BVEhfUEksIHouaW1hZyk7Ci0JfQotCWlmIChQeV9JU19JTkZJTklUWSh6LnJlYWwpIHx8IHouaW1hZyA9PSAwLikgewotCQlpZiAoY29weXNpZ24oMS4sIHoucmVhbCkgPT0gMS4pCi0JCQkvKiBhdGFuMigrLXksICtpbmYpID0gYXRhbjIoKy0wLCAreCkgPSArLTAuICovCi0JCQlyZXR1cm4gY29weXNpZ24oMC4sIHouaW1hZyk7Ci0JCWVsc2UKLQkJCS8qIGF0YW4yKCsteSwgLWluZikgPSBhdGFuMigrLTAuLCAteCkgPSArLXBpLiAqLwotCQkJcmV0dXJuIGNvcHlzaWduKFB5X01BVEhfUEksIHouaW1hZyk7Ci0JfQotCXJldHVybiBhdGFuMih6LmltYWcsIHoucmVhbCk7CisgICAgaWYgKFB5X0lTX05BTih6LnJlYWwpIHx8IFB5X0lTX05BTih6LmltYWcpKQorICAgICAgICByZXR1cm4gUHlfTkFOOworICAgIGlmIChQeV9JU19JTkZJTklUWSh6LmltYWcpKSB7CisgICAgICAgIGlmIChQeV9JU19JTkZJTklUWSh6LnJlYWwpKSB7CisgICAgICAgICAgICBpZiAoY29weXNpZ24oMS4sIHoucmVhbCkgPT0gMS4pCisgICAgICAgICAgICAgICAgLyogYXRhbjIoKy1pbmYsICtpbmYpID09ICstcGkvNCAqLworICAgICAgICAgICAgICAgIHJldHVybiBjb3B5c2lnbigwLjI1KlB5X01BVEhfUEksIHouaW1hZyk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgLyogYXRhbjIoKy1pbmYsIC1pbmYpID09ICstcGkqMy80ICovCisgICAgICAgICAgICAgICAgcmV0dXJuIGNvcHlzaWduKDAuNzUqUHlfTUFUSF9QSSwgei5pbWFnKTsKKyAgICAgICAgfQorICAgICAgICAvKiBhdGFuMigrLWluZiwgeCkgPT0gKy1waS8yIGZvciBmaW5pdGUgeCAqLworICAgICAgICByZXR1cm4gY29weXNpZ24oMC41KlB5X01BVEhfUEksIHouaW1hZyk7CisgICAgfQorICAgIGlmIChQeV9JU19JTkZJTklUWSh6LnJlYWwpIHx8IHouaW1hZyA9PSAwLikgeworICAgICAgICBpZiAoY29weXNpZ24oMS4sIHoucmVhbCkgPT0gMS4pCisgICAgICAgICAgICAvKiBhdGFuMigrLXksICtpbmYpID0gYXRhbjIoKy0wLCAreCkgPSArLTAuICovCisgICAgICAgICAgICByZXR1cm4gY29weXNpZ24oMC4sIHouaW1hZyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIC8qIGF0YW4yKCsteSwgLWluZikgPSBhdGFuMigrLTAuLCAteCkgPSArLXBpLiAqLworICAgICAgICAgICAgcmV0dXJuIGNvcHlzaWduKFB5X01BVEhfUEksIHouaW1hZyk7CisgICAgfQorICAgIHJldHVybiBhdGFuMih6LmltYWcsIHoucmVhbCk7CiB9CiAKIFB5RG9jX1NUUlZBUihjX2F0YW5fZG9jLApAQCAtMzA1LDQ4ICszMDUsNDggQEAKIHN0YXRpYyBQeV9jb21wbGV4CiBjX2F0YW5oKFB5X2NvbXBsZXggeikKIHsKLQlQeV9jb21wbGV4IHI7Ci0JZG91YmxlIGF5LCBoOworICAgIFB5X2NvbXBsZXggcjsKKyAgICBkb3VibGUgYXksIGg7CiAKLQlTUEVDSUFMX1ZBTFVFKHosIGF0YW5oX3NwZWNpYWxfdmFsdWVzKTsKKyAgICBTUEVDSUFMX1ZBTFVFKHosIGF0YW5oX3NwZWNpYWxfdmFsdWVzKTsKIAotCS8qIFJlZHVjZSB0byBjYXNlIHdoZXJlIHoucmVhbCA+PSAwLiwgdXNpbmcgYXRhbmgoeikgPSAtYXRhbmgoLXopLiAqLwotCWlmICh6LnJlYWwgPCAwLikgewotCQlyZXR1cm4gY19uZWcoY19hdGFuaChjX25lZyh6KSkpOwotCX0KKyAgICAvKiBSZWR1Y2UgdG8gY2FzZSB3aGVyZSB6LnJlYWwgPj0gMC4sIHVzaW5nIGF0YW5oKHopID0gLWF0YW5oKC16KS4gKi8KKyAgICBpZiAoei5yZWFsIDwgMC4pIHsKKyAgICAgICAgcmV0dXJuIGNfbmVnKGNfYXRhbmgoY19uZWcoeikpKTsKKyAgICB9CiAKLQlheSA9IGZhYnMoei5pbWFnKTsKLQlpZiAoei5yZWFsID4gQ01fU1FSVF9MQVJHRV9ET1VCTEUgfHwgYXkgPiBDTV9TUVJUX0xBUkdFX0RPVUJMRSkgewotCQkvKgotCQkgICBpZiBhYnMoeikgaXMgbGFyZ2UgdGhlbiB3ZSB1c2UgdGhlIGFwcHJveGltYXRpb24KLQkJICAgYXRhbmgoeikgfiAxL3ogKy8tIGkqcGkvMiAoKy8tIGRlcGVuZGluZyBvbiB0aGUgc2lnbgotCQkgICBvZiB6LmltYWcpCi0JCSovCi0JCWggPSBoeXBvdCh6LnJlYWwvMi4sIHouaW1hZy8yLik7ICAvKiBzYWZlIGZyb20gb3ZlcmZsb3cgKi8KLQkJci5yZWFsID0gei5yZWFsLzQuL2gvaDsKLQkJLyogdGhlIHR3byBuZWdhdGlvbnMgaW4gdGhlIG5leHQgbGluZSBjYW5jZWwgZWFjaCBvdGhlciBvdXQKLQkJICAgZXhjZXB0IHdoZW4gd29ya2luZyB3aXRoIHVuc2lnbmVkIHplcm9zOiB0aGV5J3JlIHRoZXJlIHRvCi0JCSAgIGVuc3VyZSB0aGF0IHRoZSBicmFuY2ggY3V0IGhhcyB0aGUgY29ycmVjdCBjb250aW51aXR5IG9uCi0JCSAgIHN5c3RlbXMgdGhhdCBkb24ndCBzdXBwb3J0IHNpZ25lZCB6ZXJvcyAqLwotCQlyLmltYWcgPSAtY29weXNpZ24oUHlfTUFUSF9QSS8yLiwgLXouaW1hZyk7Ci0JCWVycm5vID0gMDsKLQl9IGVsc2UgaWYgKHoucmVhbCA9PSAxLiAmJiBheSA8IENNX1NRUlRfREJMX01JTikgewotCQkvKiBDOTkgc3RhbmRhcmQgc2F5czogIGF0YW5oKDErLy0wLikgc2hvdWxkIGJlIGluZiArLy0gMGkgKi8KLQkJaWYgKGF5ID09IDAuKSB7Ci0JCQlyLnJlYWwgPSBJTkY7Ci0JCQlyLmltYWcgPSB6LmltYWc7Ci0JCQllcnJubyA9IEVET007Ci0JCX0gZWxzZSB7Ci0JCQlyLnJlYWwgPSAtbG9nKHNxcnQoYXkpL3NxcnQoaHlwb3QoYXksIDIuKSkpOwotCQkJci5pbWFnID0gY29weXNpZ24oYXRhbjIoMi4sIC1heSkvMiwgei5pbWFnKTsKLQkJCWVycm5vID0gMDsKLQkJfQotCX0gZWxzZSB7Ci0JCXIucmVhbCA9IGxvZzFwKDQuKnoucmVhbC8oKDEtei5yZWFsKSooMS16LnJlYWwpICsgYXkqYXkpKS80LjsKLQkJci5pbWFnID0gLWF0YW4yKC0yLip6LmltYWcsICgxLXoucmVhbCkqKDErei5yZWFsKSAtIGF5KmF5KS8yLjsKLQkJZXJybm8gPSAwOwotCX0KLQlyZXR1cm4gcjsKKyAgICBheSA9IGZhYnMoei5pbWFnKTsKKyAgICBpZiAoei5yZWFsID4gQ01fU1FSVF9MQVJHRV9ET1VCTEUgfHwgYXkgPiBDTV9TUVJUX0xBUkdFX0RPVUJMRSkgeworICAgICAgICAvKgorICAgICAgICAgICBpZiBhYnMoeikgaXMgbGFyZ2UgdGhlbiB3ZSB1c2UgdGhlIGFwcHJveGltYXRpb24KKyAgICAgICAgICAgYXRhbmgoeikgfiAxL3ogKy8tIGkqcGkvMiAoKy8tIGRlcGVuZGluZyBvbiB0aGUgc2lnbgorICAgICAgICAgICBvZiB6LmltYWcpCisgICAgICAgICovCisgICAgICAgIGggPSBoeXBvdCh6LnJlYWwvMi4sIHouaW1hZy8yLik7ICAvKiBzYWZlIGZyb20gb3ZlcmZsb3cgKi8KKyAgICAgICAgci5yZWFsID0gei5yZWFsLzQuL2gvaDsKKyAgICAgICAgLyogdGhlIHR3byBuZWdhdGlvbnMgaW4gdGhlIG5leHQgbGluZSBjYW5jZWwgZWFjaCBvdGhlciBvdXQKKyAgICAgICAgICAgZXhjZXB0IHdoZW4gd29ya2luZyB3aXRoIHVuc2lnbmVkIHplcm9zOiB0aGV5J3JlIHRoZXJlIHRvCisgICAgICAgICAgIGVuc3VyZSB0aGF0IHRoZSBicmFuY2ggY3V0IGhhcyB0aGUgY29ycmVjdCBjb250aW51aXR5IG9uCisgICAgICAgICAgIHN5c3RlbXMgdGhhdCBkb24ndCBzdXBwb3J0IHNpZ25lZCB6ZXJvcyAqLworICAgICAgICByLmltYWcgPSAtY29weXNpZ24oUHlfTUFUSF9QSS8yLiwgLXouaW1hZyk7CisgICAgICAgIGVycm5vID0gMDsKKyAgICB9IGVsc2UgaWYgKHoucmVhbCA9PSAxLiAmJiBheSA8IENNX1NRUlRfREJMX01JTikgeworICAgICAgICAvKiBDOTkgc3RhbmRhcmQgc2F5czogIGF0YW5oKDErLy0wLikgc2hvdWxkIGJlIGluZiArLy0gMGkgKi8KKyAgICAgICAgaWYgKGF5ID09IDAuKSB7CisgICAgICAgICAgICByLnJlYWwgPSBJTkY7CisgICAgICAgICAgICByLmltYWcgPSB6LmltYWc7CisgICAgICAgICAgICBlcnJubyA9IEVET007CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByLnJlYWwgPSAtbG9nKHNxcnQoYXkpL3NxcnQoaHlwb3QoYXksIDIuKSkpOworICAgICAgICAgICAgci5pbWFnID0gY29weXNpZ24oYXRhbjIoMi4sIC1heSkvMiwgei5pbWFnKTsKKyAgICAgICAgICAgIGVycm5vID0gMDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHIucmVhbCA9IGxvZzFwKDQuKnoucmVhbC8oKDEtei5yZWFsKSooMS16LnJlYWwpICsgYXkqYXkpKS80LjsKKyAgICAgICAgci5pbWFnID0gLWF0YW4yKC0yLip6LmltYWcsICgxLXoucmVhbCkqKDErei5yZWFsKSAtIGF5KmF5KS8yLjsKKyAgICAgICAgZXJybm8gPSAwOworICAgIH0KKyAgICByZXR1cm4gcjsKIH0KIAogUHlEb2NfU1RSVkFSKGNfYXRhbmhfZG9jLApAQCAtMzU4LDEyICszNTgsMTIgQEAKIHN0YXRpYyBQeV9jb21wbGV4CiBjX2NvcyhQeV9jb21wbGV4IHopCiB7Ci0JLyogY29zKHopID0gY29zaChpeikgKi8KLQlQeV9jb21wbGV4IHI7Ci0Jci5yZWFsID0gLXouaW1hZzsKLQlyLmltYWcgPSB6LnJlYWw7Ci0JciA9IGNfY29zaChyKTsKLQlyZXR1cm4gcjsKKyAgICAvKiBjb3MoeikgPSBjb3NoKGl6KSAqLworICAgIFB5X2NvbXBsZXggcjsKKyAgICByLnJlYWwgPSAtei5pbWFnOworICAgIHIuaW1hZyA9IHoucmVhbDsKKyAgICByID0gY19jb3NoKHIpOworICAgIHJldHVybiByOwogfQogCiBQeURvY19TVFJWQVIoY19jb3NfZG9jLApAQCAtMzc4LDUxICszNzgsNTEgQEAKIHN0YXRpYyBQeV9jb21wbGV4CiBjX2Nvc2goUHlfY29tcGxleCB6KQogewotCVB5X2NvbXBsZXggcjsKLQlkb3VibGUgeF9taW51c19vbmU7CisgICAgUHlfY29tcGxleCByOworICAgIGRvdWJsZSB4X21pbnVzX29uZTsKIAotCS8qIHNwZWNpYWwgdHJlYXRtZW50IGZvciBjb3NoKCsvLWluZiArIGl5KSBpZiB5IGlzIG5vdCBhIE5hTiAqLwotCWlmICghUHlfSVNfRklOSVRFKHoucmVhbCkgfHwgIVB5X0lTX0ZJTklURSh6LmltYWcpKSB7Ci0JCWlmIChQeV9JU19JTkZJTklUWSh6LnJlYWwpICYmIFB5X0lTX0ZJTklURSh6LmltYWcpICYmCi0JCSAgICAoei5pbWFnICE9IDAuKSkgewotCQkJaWYgKHoucmVhbCA+IDApIHsKLQkJCQlyLnJlYWwgPSBjb3B5c2lnbihJTkYsIGNvcyh6LmltYWcpKTsKLQkJCQlyLmltYWcgPSBjb3B5c2lnbihJTkYsIHNpbih6LmltYWcpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXIucmVhbCA9IGNvcHlzaWduKElORiwgY29zKHouaW1hZykpOwotCQkJCXIuaW1hZyA9IC1jb3B5c2lnbihJTkYsIHNpbih6LmltYWcpKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXIgPSBjb3NoX3NwZWNpYWxfdmFsdWVzW3NwZWNpYWxfdHlwZSh6LnJlYWwpXQotCQkJCSAgICAgICAgICAgICAgIFtzcGVjaWFsX3R5cGUoei5pbWFnKV07Ci0JCX0KLQkJLyogbmVlZCB0byBzZXQgZXJybm8gPSBFRE9NIGlmIHkgaXMgKy8tIGluZmluaXR5IGFuZCB4IGlzIG5vdAotCQkgICBhIE5hTiAqLwotCQlpZiAoUHlfSVNfSU5GSU5JVFkoei5pbWFnKSAmJiAhUHlfSVNfTkFOKHoucmVhbCkpCi0JCQllcnJubyA9IEVET007Ci0JCWVsc2UKLQkJCWVycm5vID0gMDsKLQkJcmV0dXJuIHI7Ci0JfQorICAgIC8qIHNwZWNpYWwgdHJlYXRtZW50IGZvciBjb3NoKCsvLWluZiArIGl5KSBpZiB5IGlzIG5vdCBhIE5hTiAqLworICAgIGlmICghUHlfSVNfRklOSVRFKHoucmVhbCkgfHwgIVB5X0lTX0ZJTklURSh6LmltYWcpKSB7CisgICAgICAgIGlmIChQeV9JU19JTkZJTklUWSh6LnJlYWwpICYmIFB5X0lTX0ZJTklURSh6LmltYWcpICYmCisgICAgICAgICAgICAoei5pbWFnICE9IDAuKSkgeworICAgICAgICAgICAgaWYgKHoucmVhbCA+IDApIHsKKyAgICAgICAgICAgICAgICByLnJlYWwgPSBjb3B5c2lnbihJTkYsIGNvcyh6LmltYWcpKTsKKyAgICAgICAgICAgICAgICByLmltYWcgPSBjb3B5c2lnbihJTkYsIHNpbih6LmltYWcpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHIucmVhbCA9IGNvcHlzaWduKElORiwgY29zKHouaW1hZykpOworICAgICAgICAgICAgICAgIHIuaW1hZyA9IC1jb3B5c2lnbihJTkYsIHNpbih6LmltYWcpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHIgPSBjb3NoX3NwZWNpYWxfdmFsdWVzW3NwZWNpYWxfdHlwZSh6LnJlYWwpXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3BlY2lhbF90eXBlKHouaW1hZyldOworICAgICAgICB9CisgICAgICAgIC8qIG5lZWQgdG8gc2V0IGVycm5vID0gRURPTSBpZiB5IGlzICsvLSBpbmZpbml0eSBhbmQgeCBpcyBub3QKKyAgICAgICAgICAgYSBOYU4gKi8KKyAgICAgICAgaWYgKFB5X0lTX0lORklOSVRZKHouaW1hZykgJiYgIVB5X0lTX05BTih6LnJlYWwpKQorICAgICAgICAgICAgZXJybm8gPSBFRE9NOworICAgICAgICBlbHNlCisgICAgICAgICAgICBlcnJubyA9IDA7CisgICAgICAgIHJldHVybiByOworICAgIH0KIAotCWlmIChmYWJzKHoucmVhbCkgPiBDTV9MT0dfTEFSR0VfRE9VQkxFKSB7Ci0JCS8qIGRlYWwgY29ycmVjdGx5IHdpdGggY2FzZXMgd2hlcmUgY29zaCh6LnJlYWwpIG92ZXJmbG93cyBidXQKLQkJICAgY29zaCh6KSBkb2VzIG5vdC4gKi8KLQkJeF9taW51c19vbmUgPSB6LnJlYWwgLSBjb3B5c2lnbigxLiwgei5yZWFsKTsKLQkJci5yZWFsID0gY29zKHouaW1hZykgKiBjb3NoKHhfbWludXNfb25lKSAqIFB5X01BVEhfRTsKLQkJci5pbWFnID0gc2luKHouaW1hZykgKiBzaW5oKHhfbWludXNfb25lKSAqIFB5X01BVEhfRTsKLQl9IGVsc2UgewotCQlyLnJlYWwgPSBjb3Moei5pbWFnKSAqIGNvc2goei5yZWFsKTsKLQkJci5pbWFnID0gc2luKHouaW1hZykgKiBzaW5oKHoucmVhbCk7Ci0JfQotCS8qIGRldGVjdCBvdmVyZmxvdywgYW5kIHNldCBlcnJubyBhY2NvcmRpbmdseSAqLwotCWlmIChQeV9JU19JTkZJTklUWShyLnJlYWwpIHx8IFB5X0lTX0lORklOSVRZKHIuaW1hZykpCi0JCWVycm5vID0gRVJBTkdFOwotCWVsc2UKLQkJZXJybm8gPSAwOwotCXJldHVybiByOworICAgIGlmIChmYWJzKHoucmVhbCkgPiBDTV9MT0dfTEFSR0VfRE9VQkxFKSB7CisgICAgICAgIC8qIGRlYWwgY29ycmVjdGx5IHdpdGggY2FzZXMgd2hlcmUgY29zaCh6LnJlYWwpIG92ZXJmbG93cyBidXQKKyAgICAgICAgICAgY29zaCh6KSBkb2VzIG5vdC4gKi8KKyAgICAgICAgeF9taW51c19vbmUgPSB6LnJlYWwgLSBjb3B5c2lnbigxLiwgei5yZWFsKTsKKyAgICAgICAgci5yZWFsID0gY29zKHouaW1hZykgKiBjb3NoKHhfbWludXNfb25lKSAqIFB5X01BVEhfRTsKKyAgICAgICAgci5pbWFnID0gc2luKHouaW1hZykgKiBzaW5oKHhfbWludXNfb25lKSAqIFB5X01BVEhfRTsKKyAgICB9IGVsc2UgeworICAgICAgICByLnJlYWwgPSBjb3Moei5pbWFnKSAqIGNvc2goei5yZWFsKTsKKyAgICAgICAgci5pbWFnID0gc2luKHouaW1hZykgKiBzaW5oKHoucmVhbCk7CisgICAgfQorICAgIC8qIGRldGVjdCBvdmVyZmxvdywgYW5kIHNldCBlcnJubyBhY2NvcmRpbmdseSAqLworICAgIGlmIChQeV9JU19JTkZJTklUWShyLnJlYWwpIHx8IFB5X0lTX0lORklOSVRZKHIuaW1hZykpCisgICAgICAgIGVycm5vID0gRVJBTkdFOworICAgIGVsc2UKKyAgICAgICAgZXJybm8gPSAwOworICAgIHJldHVybiByOwogfQogCiBQeURvY19TVFJWQVIoY19jb3NoX2RvYywKQEAgLTQzOCw1MSArNDM4LDUxIEBACiBzdGF0aWMgUHlfY29tcGxleAogY19leHAoUHlfY29tcGxleCB6KQogewotCVB5X2NvbXBsZXggcjsKLQlkb3VibGUgbDsKKyAgICBQeV9jb21wbGV4IHI7CisgICAgZG91YmxlIGw7CiAKLQlpZiAoIVB5X0lTX0ZJTklURSh6LnJlYWwpIHx8ICFQeV9JU19GSU5JVEUoei5pbWFnKSkgewotCQlpZiAoUHlfSVNfSU5GSU5JVFkoei5yZWFsKSAmJiBQeV9JU19GSU5JVEUoei5pbWFnKQotCQkgICAgJiYgKHouaW1hZyAhPSAwLikpIHsKLQkJCWlmICh6LnJlYWwgPiAwKSB7Ci0JCQkJci5yZWFsID0gY29weXNpZ24oSU5GLCBjb3Moei5pbWFnKSk7Ci0JCQkJci5pbWFnID0gY29weXNpZ24oSU5GLCBzaW4oei5pbWFnKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyLnJlYWwgPSBjb3B5c2lnbigwLiwgY29zKHouaW1hZykpOwotCQkJCXIuaW1hZyA9IGNvcHlzaWduKDAuLCBzaW4oei5pbWFnKSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyID0gZXhwX3NwZWNpYWxfdmFsdWVzW3NwZWNpYWxfdHlwZSh6LnJlYWwpXQotCQkJCSAgICAgICAgICAgICAgW3NwZWNpYWxfdHlwZSh6LmltYWcpXTsKLQkJfQotCQkvKiBuZWVkIHRvIHNldCBlcnJubyA9IEVET00gaWYgeSBpcyArLy0gaW5maW5pdHkgYW5kIHggaXMgbm90Ci0JCSAgIGEgTmFOIGFuZCBub3QgLWluZmluaXR5ICovCi0JCWlmIChQeV9JU19JTkZJTklUWSh6LmltYWcpICYmCi0JCSAgICAoUHlfSVNfRklOSVRFKHoucmVhbCkgfHwKLQkJICAgICAoUHlfSVNfSU5GSU5JVFkoei5yZWFsKSAmJiB6LnJlYWwgPiAwKSkpCi0JCQllcnJubyA9IEVET007Ci0JCWVsc2UKLQkJCWVycm5vID0gMDsKLQkJcmV0dXJuIHI7Ci0JfQorICAgIGlmICghUHlfSVNfRklOSVRFKHoucmVhbCkgfHwgIVB5X0lTX0ZJTklURSh6LmltYWcpKSB7CisgICAgICAgIGlmIChQeV9JU19JTkZJTklUWSh6LnJlYWwpICYmIFB5X0lTX0ZJTklURSh6LmltYWcpCisgICAgICAgICAgICAmJiAoei5pbWFnICE9IDAuKSkgeworICAgICAgICAgICAgaWYgKHoucmVhbCA+IDApIHsKKyAgICAgICAgICAgICAgICByLnJlYWwgPSBjb3B5c2lnbihJTkYsIGNvcyh6LmltYWcpKTsKKyAgICAgICAgICAgICAgICByLmltYWcgPSBjb3B5c2lnbihJTkYsIHNpbih6LmltYWcpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHIucmVhbCA9IGNvcHlzaWduKDAuLCBjb3Moei5pbWFnKSk7CisgICAgICAgICAgICAgICAgci5pbWFnID0gY29weXNpZ24oMC4sIHNpbih6LmltYWcpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHIgPSBleHBfc3BlY2lhbF92YWx1ZXNbc3BlY2lhbF90eXBlKHoucmVhbCldCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NwZWNpYWxfdHlwZSh6LmltYWcpXTsKKyAgICAgICAgfQorICAgICAgICAvKiBuZWVkIHRvIHNldCBlcnJubyA9IEVET00gaWYgeSBpcyArLy0gaW5maW5pdHkgYW5kIHggaXMgbm90CisgICAgICAgICAgIGEgTmFOIGFuZCBub3QgLWluZmluaXR5ICovCisgICAgICAgIGlmIChQeV9JU19JTkZJTklUWSh6LmltYWcpICYmCisgICAgICAgICAgICAoUHlfSVNfRklOSVRFKHoucmVhbCkgfHwKKyAgICAgICAgICAgICAoUHlfSVNfSU5GSU5JVFkoei5yZWFsKSAmJiB6LnJlYWwgPiAwKSkpCisgICAgICAgICAgICBlcnJubyA9IEVET007CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVycm5vID0gMDsKKyAgICAgICAgcmV0dXJuIHI7CisgICAgfQogCi0JaWYgKHoucmVhbCA+IENNX0xPR19MQVJHRV9ET1VCTEUpIHsKLQkJbCA9IGV4cCh6LnJlYWwtMS4pOwotCQlyLnJlYWwgPSBsKmNvcyh6LmltYWcpKlB5X01BVEhfRTsKLQkJci5pbWFnID0gbCpzaW4oei5pbWFnKSpQeV9NQVRIX0U7Ci0JfSBlbHNlIHsKLQkJbCA9IGV4cCh6LnJlYWwpOwotCQlyLnJlYWwgPSBsKmNvcyh6LmltYWcpOwotCQlyLmltYWcgPSBsKnNpbih6LmltYWcpOwotCX0KLQkvKiBkZXRlY3Qgb3ZlcmZsb3csIGFuZCBzZXQgZXJybm8gYWNjb3JkaW5nbHkgKi8KLQlpZiAoUHlfSVNfSU5GSU5JVFkoci5yZWFsKSB8fCBQeV9JU19JTkZJTklUWShyLmltYWcpKQotCQllcnJubyA9IEVSQU5HRTsKLQllbHNlCi0JCWVycm5vID0gMDsKLQlyZXR1cm4gcjsKKyAgICBpZiAoei5yZWFsID4gQ01fTE9HX0xBUkdFX0RPVUJMRSkgeworICAgICAgICBsID0gZXhwKHoucmVhbC0xLik7CisgICAgICAgIHIucmVhbCA9IGwqY29zKHouaW1hZykqUHlfTUFUSF9FOworICAgICAgICByLmltYWcgPSBsKnNpbih6LmltYWcpKlB5X01BVEhfRTsKKyAgICB9IGVsc2UgeworICAgICAgICBsID0gZXhwKHoucmVhbCk7CisgICAgICAgIHIucmVhbCA9IGwqY29zKHouaW1hZyk7CisgICAgICAgIHIuaW1hZyA9IGwqc2luKHouaW1hZyk7CisgICAgfQorICAgIC8qIGRldGVjdCBvdmVyZmxvdywgYW5kIHNldCBlcnJubyBhY2NvcmRpbmdseSAqLworICAgIGlmIChQeV9JU19JTkZJTklUWShyLnJlYWwpIHx8IFB5X0lTX0lORklOSVRZKHIuaW1hZykpCisgICAgICAgIGVycm5vID0gRVJBTkdFOworICAgIGVsc2UKKyAgICAgICAgZXJybm8gPSAwOworICAgIHJldHVybiByOwogfQogCiBQeURvY19TVFJWQVIoY19leHBfZG9jLApAQCAtNDk2LDg1ICs0OTYsODUgQEAKIHN0YXRpYyBQeV9jb21wbGV4CiBjX2xvZyhQeV9jb21wbGV4IHopCiB7Ci0JLyoKLQkgICBUaGUgdXN1YWwgZm9ybXVsYSBmb3IgdGhlIHJlYWwgcGFydCBpcyBsb2coaHlwb3Qoei5yZWFsLCB6LmltYWcpKS4KLQkgICBUaGVyZSBhcmUgZm91ciBzaXR1YXRpb25zIHdoZXJlIHRoaXMgZm9ybXVsYSBpcyBwb3RlbnRpYWxseQotCSAgIHByb2JsZW1hdGljOgorICAgIC8qCisgICAgICAgVGhlIHVzdWFsIGZvcm11bGEgZm9yIHRoZSByZWFsIHBhcnQgaXMgbG9nKGh5cG90KHoucmVhbCwgei5pbWFnKSkuCisgICAgICAgVGhlcmUgYXJlIGZvdXIgc2l0dWF0aW9ucyB3aGVyZSB0aGlzIGZvcm11bGEgaXMgcG90ZW50aWFsbHkKKyAgICAgICBwcm9ibGVtYXRpYzoKIAotCSAgICgxKSB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgeiBpcyBzdWJub3JtYWwuICBUaGVuIGh5cG90IGlzIHN1Ym5vcm1hbCwKLQkgICBzbyBoYXMgZmV3ZXIgdGhhbiB0aGUgdXN1YWwgbnVtYmVyIG9mIGJpdHMgb2YgYWNjdXJhY3ksIGhlbmNlIG1heQotCSAgIGhhdmUgbGFyZ2UgcmVsYXRpdmUgZXJyb3IuICBUaGlzIHRoZW4gZ2l2ZXMgYSBsYXJnZSBhYnNvbHV0ZSBlcnJvcgotCSAgIGluIHRoZSBsb2cuICBUaGlzIGNhbiBiZSBzb2x2ZWQgYnkgcmVzY2FsaW5nIHogYnkgYSBzdWl0YWJsZSBwb3dlcgotCSAgIG9mIDIuCisgICAgICAgKDEpIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB6IGlzIHN1Ym5vcm1hbC4gIFRoZW4gaHlwb3QgaXMgc3Vibm9ybWFsLAorICAgICAgIHNvIGhhcyBmZXdlciB0aGFuIHRoZSB1c3VhbCBudW1iZXIgb2YgYml0cyBvZiBhY2N1cmFjeSwgaGVuY2UgbWF5CisgICAgICAgaGF2ZSBsYXJnZSByZWxhdGl2ZSBlcnJvci4gIFRoaXMgdGhlbiBnaXZlcyBhIGxhcmdlIGFic29sdXRlIGVycm9yCisgICAgICAgaW4gdGhlIGxvZy4gIFRoaXMgY2FuIGJlIHNvbHZlZCBieSByZXNjYWxpbmcgeiBieSBhIHN1aXRhYmxlIHBvd2VyCisgICAgICAgb2YgMi4KIAotCSAgICgyKSB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgeiBpcyBncmVhdGVyIHRoYW4gREJMX01BWCAoZS5nLiB3aGVuIGJvdGgKLQkgICB6LnJlYWwgYW5kIHouaW1hZyBhcmUgd2l0aGluIGEgZmFjdG9yIG9mIDEvc3FydCgyKSBvZiBEQkxfTUFYKQotCSAgIEFnYWluLCByZXNjYWxpbmcgc29sdmVzIHRoaXMuCisgICAgICAgKDIpIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB6IGlzIGdyZWF0ZXIgdGhhbiBEQkxfTUFYIChlLmcuIHdoZW4gYm90aAorICAgICAgIHoucmVhbCBhbmQgei5pbWFnIGFyZSB3aXRoaW4gYSBmYWN0b3Igb2YgMS9zcXJ0KDIpIG9mIERCTF9NQVgpCisgICAgICAgQWdhaW4sIHJlc2NhbGluZyBzb2x2ZXMgdGhpcy4KIAotCSAgICgzKSB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgeiBpcyBjbG9zZSB0byAxLiAgSW4gdGhpcyBjYXNlIGl0J3MKLQkgICBkaWZmaWN1bHQgdG8gYWNoaWV2ZSBnb29kIGFjY3VyYWN5LCBhdCBsZWFzdCBpbiBwYXJ0IGJlY2F1c2UgYQotCSAgIGNoYW5nZSBvZiAxdWxwIGluIHRoZSByZWFsIG9yIGltYWdpbmFyeSBwYXJ0IG9mIHogY2FuIHJlc3VsdCBpbiBhCi0JICAgY2hhbmdlIG9mIGJpbGxpb25zIG9mIHVscHMgaW4gdGhlIGNvcnJlY3RseSByb3VuZGVkIGFuc3dlci4KKyAgICAgICAoMykgdGhlIGFic29sdXRlIHZhbHVlIG9mIHogaXMgY2xvc2UgdG8gMS4gIEluIHRoaXMgY2FzZSBpdCdzCisgICAgICAgZGlmZmljdWx0IHRvIGFjaGlldmUgZ29vZCBhY2N1cmFjeSwgYXQgbGVhc3QgaW4gcGFydCBiZWNhdXNlIGEKKyAgICAgICBjaGFuZ2Ugb2YgMXVscCBpbiB0aGUgcmVhbCBvciBpbWFnaW5hcnkgcGFydCBvZiB6IGNhbiByZXN1bHQgaW4gYQorICAgICAgIGNoYW5nZSBvZiBiaWxsaW9ucyBvZiB1bHBzIGluIHRoZSBjb3JyZWN0bHkgcm91bmRlZCBhbnN3ZXIuCiAKLQkgICAoNCkgeiA9IDAuICBUaGUgc2ltcGxlc3QgdGhpbmcgdG8gZG8gaGVyZSBpcyB0byBjYWxsIHRoZQotCSAgIGZsb2F0aW5nLXBvaW50IGxvZyB3aXRoIGFuIGFyZ3VtZW50IG9mIDAsIGFuZCBsZXQgaXRzIGJlaGF2aW91cgotCSAgIChyZXR1cm5pbmcgLWluZmluaXR5LCBzaWduYWxpbmcgYSBmbG9hdGluZy1wb2ludCBleGNlcHRpb24sIHNldHRpbmcKLQkgICBlcnJubywgb3Igd2hhdGV2ZXIpIGRldGVybWluZSB0aGF0IG9mIGNfbG9nLiAgU28gdGhlIHVzdWFsIGZvcm11bGEKLQkgICBpcyBmaW5lIGhlcmUuCisgICAgICAgKDQpIHogPSAwLiAgVGhlIHNpbXBsZXN0IHRoaW5nIHRvIGRvIGhlcmUgaXMgdG8gY2FsbCB0aGUKKyAgICAgICBmbG9hdGluZy1wb2ludCBsb2cgd2l0aCBhbiBhcmd1bWVudCBvZiAwLCBhbmQgbGV0IGl0cyBiZWhhdmlvdXIKKyAgICAgICAocmV0dXJuaW5nIC1pbmZpbml0eSwgc2lnbmFsaW5nIGEgZmxvYXRpbmctcG9pbnQgZXhjZXB0aW9uLCBzZXR0aW5nCisgICAgICAgZXJybm8sIG9yIHdoYXRldmVyKSBkZXRlcm1pbmUgdGhhdCBvZiBjX2xvZy4gIFNvIHRoZSB1c3VhbCBmb3JtdWxhCisgICAgICAgaXMgZmluZSBoZXJlLgogCi0JICovCisgICAgICovCiAKLQlQeV9jb21wbGV4IHI7Ci0JZG91YmxlIGF4LCBheSwgYW0sIGFuLCBoOworICAgIFB5X2NvbXBsZXggcjsKKyAgICBkb3VibGUgYXgsIGF5LCBhbSwgYW4sIGg7CiAKLQlTUEVDSUFMX1ZBTFVFKHosIGxvZ19zcGVjaWFsX3ZhbHVlcyk7CisgICAgU1BFQ0lBTF9WQUxVRSh6LCBsb2dfc3BlY2lhbF92YWx1ZXMpOwogCi0JYXggPSBmYWJzKHoucmVhbCk7Ci0JYXkgPSBmYWJzKHouaW1hZyk7CisgICAgYXggPSBmYWJzKHoucmVhbCk7CisgICAgYXkgPSBmYWJzKHouaW1hZyk7CiAKLQlpZiAoYXggPiBDTV9MQVJHRV9ET1VCTEUgfHwgYXkgPiBDTV9MQVJHRV9ET1VCTEUpIHsKLQkJci5yZWFsID0gbG9nKGh5cG90KGF4LzIuLCBheS8yLikpICsgTV9MTjI7Ci0JfSBlbHNlIGlmIChheCA8IERCTF9NSU4gJiYgYXkgPCBEQkxfTUlOKSB7Ci0JCWlmIChheCA+IDAuIHx8IGF5ID4gMC4pIHsKLQkJCS8qIGNhdGNoIGNhc2VzIHdoZXJlIGh5cG90KGF4LCBheSkgaXMgc3Vibm9ybWFsICovCi0JCQlyLnJlYWwgPSBsb2coaHlwb3QobGRleHAoYXgsIERCTF9NQU5UX0RJRyksCi0JCQkJIGxkZXhwKGF5LCBEQkxfTUFOVF9ESUcpKSkgLSBEQkxfTUFOVF9ESUcqTV9MTjI7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvKiBsb2coKy8tMC4gKy8tIDBpKSAqLwotCQkJci5yZWFsID0gLUlORjsKLQkJCXIuaW1hZyA9IGF0YW4yKHouaW1hZywgei5yZWFsKTsKLQkJCWVycm5vID0gRURPTTsKLQkJCXJldHVybiByOwotCQl9Ci0JfSBlbHNlIHsKLQkJaCA9IGh5cG90KGF4LCBheSk7Ci0JCWlmICgwLjcxIDw9IGggJiYgaCA8PSAxLjczKSB7Ci0JCQlhbSA9IGF4ID4gYXkgPyBheCA6IGF5OyAgLyogbWF4KGF4LCBheSkgKi8KLQkJCWFuID0gYXggPiBheSA/IGF5IDogYXg7ICAvKiBtaW4oYXgsIGF5KSAqLwotCQkJci5yZWFsID0gbG9nMXAoKGFtLTEpKihhbSsxKSthbiphbikvMi47Ci0JCX0gZWxzZSB7Ci0JCQlyLnJlYWwgPSBsb2coaCk7Ci0JCX0KLQl9Ci0Jci5pbWFnID0gYXRhbjIoei5pbWFnLCB6LnJlYWwpOwotCWVycm5vID0gMDsKLQlyZXR1cm4gcjsKKyAgICBpZiAoYXggPiBDTV9MQVJHRV9ET1VCTEUgfHwgYXkgPiBDTV9MQVJHRV9ET1VCTEUpIHsKKyAgICAgICAgci5yZWFsID0gbG9nKGh5cG90KGF4LzIuLCBheS8yLikpICsgTV9MTjI7CisgICAgfSBlbHNlIGlmIChheCA8IERCTF9NSU4gJiYgYXkgPCBEQkxfTUlOKSB7CisgICAgICAgIGlmIChheCA+IDAuIHx8IGF5ID4gMC4pIHsKKyAgICAgICAgICAgIC8qIGNhdGNoIGNhc2VzIHdoZXJlIGh5cG90KGF4LCBheSkgaXMgc3Vibm9ybWFsICovCisgICAgICAgICAgICByLnJlYWwgPSBsb2coaHlwb3QobGRleHAoYXgsIERCTF9NQU5UX0RJRyksCisgICAgICAgICAgICAgICAgICAgICBsZGV4cChheSwgREJMX01BTlRfRElHKSkpIC0gREJMX01BTlRfRElHKk1fTE4yOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLyogbG9nKCsvLTAuICsvLSAwaSkgKi8KKyAgICAgICAgICAgIHIucmVhbCA9IC1JTkY7CisgICAgICAgICAgICByLmltYWcgPSBhdGFuMih6LmltYWcsIHoucmVhbCk7CisgICAgICAgICAgICBlcnJubyA9IEVET007CisgICAgICAgICAgICByZXR1cm4gcjsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGggPSBoeXBvdChheCwgYXkpOworICAgICAgICBpZiAoMC43MSA8PSBoICYmIGggPD0gMS43MykgeworICAgICAgICAgICAgYW0gPSBheCA+IGF5ID8gYXggOiBheTsgIC8qIG1heChheCwgYXkpICovCisgICAgICAgICAgICBhbiA9IGF4ID4gYXkgPyBheSA6IGF4OyAgLyogbWluKGF4LCBheSkgKi8KKyAgICAgICAgICAgIHIucmVhbCA9IGxvZzFwKChhbS0xKSooYW0rMSkrYW4qYW4pLzIuOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgci5yZWFsID0gbG9nKGgpOworICAgICAgICB9CisgICAgfQorICAgIHIuaW1hZyA9IGF0YW4yKHouaW1hZywgei5yZWFsKTsKKyAgICBlcnJubyA9IDA7CisgICAgcmV0dXJuIHI7CiB9CiAKIAogc3RhdGljIFB5X2NvbXBsZXgKIGNfbG9nMTAoUHlfY29tcGxleCB6KQogewotCVB5X2NvbXBsZXggcjsKLQlpbnQgZXJybm9fc2F2ZTsKKyAgICBQeV9jb21wbGV4IHI7CisgICAgaW50IGVycm5vX3NhdmU7CiAKLQlyID0gY19sb2coeik7Ci0JZXJybm9fc2F2ZSA9IGVycm5vOyAvKiBqdXN0IGluIGNhc2UgdGhlIGRpdmlzaW9ucyBhZmZlY3QgZXJybm8gKi8KLQlyLnJlYWwgPSByLnJlYWwgLyBNX0xOMTA7Ci0Jci5pbWFnID0gci5pbWFnIC8gTV9MTjEwOwotCWVycm5vID0gZXJybm9fc2F2ZTsKLQlyZXR1cm4gcjsKKyAgICByID0gY19sb2coeik7CisgICAgZXJybm9fc2F2ZSA9IGVycm5vOyAvKiBqdXN0IGluIGNhc2UgdGhlIGRpdmlzaW9ucyBhZmZlY3QgZXJybm8gKi8KKyAgICByLnJlYWwgPSByLnJlYWwgLyBNX0xOMTA7CisgICAgci5pbWFnID0gci5pbWFnIC8gTV9MTjEwOworICAgIGVycm5vID0gZXJybm9fc2F2ZTsKKyAgICByZXR1cm4gcjsKIH0KIAogUHlEb2NfU1RSVkFSKGNfbG9nMTBfZG9jLApAQCAtNTg2LDE0ICs1ODYsMTQgQEAKIHN0YXRpYyBQeV9jb21wbGV4CiBjX3NpbihQeV9jb21wbGV4IHopCiB7Ci0JLyogc2luKHopID0gLWkgc2luKGl6KSAqLwotCVB5X2NvbXBsZXggcywgcjsKLQlzLnJlYWwgPSAtei5pbWFnOwotCXMuaW1hZyA9IHoucmVhbDsKLQlzID0gY19zaW5oKHMpOwotCXIucmVhbCA9IHMuaW1hZzsKLQlyLmltYWcgPSAtcy5yZWFsOwotCXJldHVybiByOworICAgIC8qIHNpbih6KSA9IC1pIHNpbihpeikgKi8KKyAgICBQeV9jb21wbGV4IHMsIHI7CisgICAgcy5yZWFsID0gLXouaW1hZzsKKyAgICBzLmltYWcgPSB6LnJlYWw7CisgICAgcyA9IGNfc2luaChzKTsKKyAgICByLnJlYWwgPSBzLmltYWc7CisgICAgci5pbWFnID0gLXMucmVhbDsKKyAgICByZXR1cm4gcjsKIH0KIAogUHlEb2NfU1RSVkFSKGNfc2luX2RvYywKQEAgLTYwOCw1MCArNjA4LDUwIEBACiBzdGF0aWMgUHlfY29tcGxleAogY19zaW5oKFB5X2NvbXBsZXggeikKIHsKLQlQeV9jb21wbGV4IHI7Ci0JZG91YmxlIHhfbWludXNfb25lOworICAgIFB5X2NvbXBsZXggcjsKKyAgICBkb3VibGUgeF9taW51c19vbmU7CiAKLQkvKiBzcGVjaWFsIHRyZWF0bWVudCBmb3Igc2luaCgrLy1pbmYgKyBpeSkgaWYgeSBpcyBmaW5pdGUgYW5kCi0JICAgbm9uemVybyAqLwotCWlmICghUHlfSVNfRklOSVRFKHoucmVhbCkgfHwgIVB5X0lTX0ZJTklURSh6LmltYWcpKSB7Ci0JCWlmIChQeV9JU19JTkZJTklUWSh6LnJlYWwpICYmIFB5X0lTX0ZJTklURSh6LmltYWcpCi0JCSAgICAmJiAoei5pbWFnICE9IDAuKSkgewotCQkJaWYgKHoucmVhbCA+IDApIHsKLQkJCQlyLnJlYWwgPSBjb3B5c2lnbihJTkYsIGNvcyh6LmltYWcpKTsKLQkJCQlyLmltYWcgPSBjb3B5c2lnbihJTkYsIHNpbih6LmltYWcpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXIucmVhbCA9IC1jb3B5c2lnbihJTkYsIGNvcyh6LmltYWcpKTsKLQkJCQlyLmltYWcgPSBjb3B5c2lnbihJTkYsIHNpbih6LmltYWcpKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXIgPSBzaW5oX3NwZWNpYWxfdmFsdWVzW3NwZWNpYWxfdHlwZSh6LnJlYWwpXQotCQkJCSAgICAgICAgICAgICAgIFtzcGVjaWFsX3R5cGUoei5pbWFnKV07Ci0JCX0KLQkJLyogbmVlZCB0byBzZXQgZXJybm8gPSBFRE9NIGlmIHkgaXMgKy8tIGluZmluaXR5IGFuZCB4IGlzIG5vdAotCQkgICBhIE5hTiAqLwotCQlpZiAoUHlfSVNfSU5GSU5JVFkoei5pbWFnKSAmJiAhUHlfSVNfTkFOKHoucmVhbCkpCi0JCQllcnJubyA9IEVET007Ci0JCWVsc2UKLQkJCWVycm5vID0gMDsKLQkJcmV0dXJuIHI7Ci0JfQorICAgIC8qIHNwZWNpYWwgdHJlYXRtZW50IGZvciBzaW5oKCsvLWluZiArIGl5KSBpZiB5IGlzIGZpbml0ZSBhbmQKKyAgICAgICBub256ZXJvICovCisgICAgaWYgKCFQeV9JU19GSU5JVEUoei5yZWFsKSB8fCAhUHlfSVNfRklOSVRFKHouaW1hZykpIHsKKyAgICAgICAgaWYgKFB5X0lTX0lORklOSVRZKHoucmVhbCkgJiYgUHlfSVNfRklOSVRFKHouaW1hZykKKyAgICAgICAgICAgICYmICh6LmltYWcgIT0gMC4pKSB7CisgICAgICAgICAgICBpZiAoei5yZWFsID4gMCkgeworICAgICAgICAgICAgICAgIHIucmVhbCA9IGNvcHlzaWduKElORiwgY29zKHouaW1hZykpOworICAgICAgICAgICAgICAgIHIuaW1hZyA9IGNvcHlzaWduKElORiwgc2luKHouaW1hZykpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgci5yZWFsID0gLWNvcHlzaWduKElORiwgY29zKHouaW1hZykpOworICAgICAgICAgICAgICAgIHIuaW1hZyA9IGNvcHlzaWduKElORiwgc2luKHouaW1hZykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgciA9IHNpbmhfc3BlY2lhbF92YWx1ZXNbc3BlY2lhbF90eXBlKHoucmVhbCldCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzcGVjaWFsX3R5cGUoei5pbWFnKV07CisgICAgICAgIH0KKyAgICAgICAgLyogbmVlZCB0byBzZXQgZXJybm8gPSBFRE9NIGlmIHkgaXMgKy8tIGluZmluaXR5IGFuZCB4IGlzIG5vdAorICAgICAgICAgICBhIE5hTiAqLworICAgICAgICBpZiAoUHlfSVNfSU5GSU5JVFkoei5pbWFnKSAmJiAhUHlfSVNfTkFOKHoucmVhbCkpCisgICAgICAgICAgICBlcnJubyA9IEVET007CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVycm5vID0gMDsKKyAgICAgICAgcmV0dXJuIHI7CisgICAgfQogCi0JaWYgKGZhYnMoei5yZWFsKSA+IENNX0xPR19MQVJHRV9ET1VCTEUpIHsKLQkJeF9taW51c19vbmUgPSB6LnJlYWwgLSBjb3B5c2lnbigxLiwgei5yZWFsKTsKLQkJci5yZWFsID0gY29zKHouaW1hZykgKiBzaW5oKHhfbWludXNfb25lKSAqIFB5X01BVEhfRTsKLQkJci5pbWFnID0gc2luKHouaW1hZykgKiBjb3NoKHhfbWludXNfb25lKSAqIFB5X01BVEhfRTsKLQl9IGVsc2UgewotCQlyLnJlYWwgPSBjb3Moei5pbWFnKSAqIHNpbmgoei5yZWFsKTsKLQkJci5pbWFnID0gc2luKHouaW1hZykgKiBjb3NoKHoucmVhbCk7Ci0JfQotCS8qIGRldGVjdCBvdmVyZmxvdywgYW5kIHNldCBlcnJubyBhY2NvcmRpbmdseSAqLwotCWlmIChQeV9JU19JTkZJTklUWShyLnJlYWwpIHx8IFB5X0lTX0lORklOSVRZKHIuaW1hZykpCi0JCWVycm5vID0gRVJBTkdFOwotCWVsc2UKLQkJZXJybm8gPSAwOwotCXJldHVybiByOworICAgIGlmIChmYWJzKHoucmVhbCkgPiBDTV9MT0dfTEFSR0VfRE9VQkxFKSB7CisgICAgICAgIHhfbWludXNfb25lID0gei5yZWFsIC0gY29weXNpZ24oMS4sIHoucmVhbCk7CisgICAgICAgIHIucmVhbCA9IGNvcyh6LmltYWcpICogc2luaCh4X21pbnVzX29uZSkgKiBQeV9NQVRIX0U7CisgICAgICAgIHIuaW1hZyA9IHNpbih6LmltYWcpICogY29zaCh4X21pbnVzX29uZSkgKiBQeV9NQVRIX0U7CisgICAgfSBlbHNlIHsKKyAgICAgICAgci5yZWFsID0gY29zKHouaW1hZykgKiBzaW5oKHoucmVhbCk7CisgICAgICAgIHIuaW1hZyA9IHNpbih6LmltYWcpICogY29zaCh6LnJlYWwpOworICAgIH0KKyAgICAvKiBkZXRlY3Qgb3ZlcmZsb3csIGFuZCBzZXQgZXJybm8gYWNjb3JkaW5nbHkgKi8KKyAgICBpZiAoUHlfSVNfSU5GSU5JVFkoci5yZWFsKSB8fCBQeV9JU19JTkZJTklUWShyLmltYWcpKQorICAgICAgICBlcnJubyA9IEVSQU5HRTsKKyAgICBlbHNlCisgICAgICAgIGVycm5vID0gMDsKKyAgICByZXR1cm4gcjsKIH0KIAogUHlEb2NfU1RSVkFSKGNfc2luaF9kb2MsCkBAIC02NjUsNjggKzY2NSw2OCBAQAogc3RhdGljIFB5X2NvbXBsZXgKIGNfc3FydChQeV9jb21wbGV4IHopCiB7Ci0JLyoKLQkgICBNZXRob2Q6IHVzZSBzeW1tZXRyaWVzIHRvIHJlZHVjZSB0byB0aGUgY2FzZSB3aGVuIHggPSB6LnJlYWwgYW5kIHkKLQkgICA9IHouaW1hZyBhcmUgbm9ubmVnYXRpdmUuICBUaGVuIHRoZSByZWFsIHBhcnQgb2YgdGhlIHJlc3VsdCBpcwotCSAgIGdpdmVuIGJ5CisgICAgLyoKKyAgICAgICBNZXRob2Q6IHVzZSBzeW1tZXRyaWVzIHRvIHJlZHVjZSB0byB0aGUgY2FzZSB3aGVuIHggPSB6LnJlYWwgYW5kIHkKKyAgICAgICA9IHouaW1hZyBhcmUgbm9ubmVnYXRpdmUuICBUaGVuIHRoZSByZWFsIHBhcnQgb2YgdGhlIHJlc3VsdCBpcworICAgICAgIGdpdmVuIGJ5CiAKLQkgICAgIHMgPSBzcXJ0KCh4ICsgaHlwb3QoeCwgeSkpLzIpCisgICAgICAgICBzID0gc3FydCgoeCArIGh5cG90KHgsIHkpKS8yKQogCi0JICAgYW5kIHRoZSBpbWFnaW5hcnkgcGFydCBpcworICAgICAgIGFuZCB0aGUgaW1hZ2luYXJ5IHBhcnQgaXMKIAotCSAgICAgZCA9ICh5LzIpL3MKKyAgICAgICAgIGQgPSAoeS8yKS9zCiAKLQkgICBJZiBlaXRoZXIgeCBvciB5IGlzIHZlcnkgbGFyZ2UgdGhlbiB0aGVyZSdzIGEgcmlzayBvZiBvdmVyZmxvdyBpbgotCSAgIGNvbXB1dGF0aW9uIG9mIHRoZSBleHByZXNzaW9uIHggKyBoeXBvdCh4LCB5KS4gIFdlIGNhbiBhdm9pZCB0aGlzCi0JICAgYnkgcmV3cml0aW5nIHRoZSBmb3JtdWxhIGZvciBzIGFzOgorICAgICAgIElmIGVpdGhlciB4IG9yIHkgaXMgdmVyeSBsYXJnZSB0aGVuIHRoZXJlJ3MgYSByaXNrIG9mIG92ZXJmbG93IGluCisgICAgICAgY29tcHV0YXRpb24gb2YgdGhlIGV4cHJlc3Npb24geCArIGh5cG90KHgsIHkpLiAgV2UgY2FuIGF2b2lkIHRoaXMKKyAgICAgICBieSByZXdyaXRpbmcgdGhlIGZvcm11bGEgZm9yIHMgYXM6CiAKLQkgICAgIHMgPSAyKnNxcnQoeC84ICsgaHlwb3QoeC84LCB5LzgpKQorICAgICAgICAgcyA9IDIqc3FydCh4LzggKyBoeXBvdCh4LzgsIHkvOCkpCiAKLQkgICBUaGlzIGNvc3RzIHVzIHR3byBleHRyYSBtdWx0aXBsaWNhdGlvbnMvZGl2aXNpb25zLCBidXQgYXZvaWRzIHRoZQotCSAgIG92ZXJoZWFkIG9mIGNoZWNraW5nIGZvciB4IGFuZCB5IGxhcmdlLgorICAgICAgIFRoaXMgY29zdHMgdXMgdHdvIGV4dHJhIG11bHRpcGxpY2F0aW9ucy9kaXZpc2lvbnMsIGJ1dCBhdm9pZHMgdGhlCisgICAgICAgb3ZlcmhlYWQgb2YgY2hlY2tpbmcgZm9yIHggYW5kIHkgbGFyZ2UuCiAKLQkgICBJZiBib3RoIHggYW5kIHkgYXJlIHN1Ym5vcm1hbCB0aGVuIGh5cG90KHgsIHkpIG1heSBhbHNvIGJlCi0JICAgc3Vibm9ybWFsLCBzbyB3aWxsIGxhY2sgZnVsbCBwcmVjaXNpb24uICBXZSBzb2x2ZSB0aGlzIGJ5IHJlc2NhbGluZwotCSAgIHggYW5kIHkgYnkgYSBzdWZmaWNpZW50bHkgbGFyZ2UgcG93ZXIgb2YgMiB0byBlbnN1cmUgdGhhdCB4IGFuZCB5Ci0JICAgYXJlIG5vcm1hbC4KLQkqLworICAgICAgIElmIGJvdGggeCBhbmQgeSBhcmUgc3Vibm9ybWFsIHRoZW4gaHlwb3QoeCwgeSkgbWF5IGFsc28gYmUKKyAgICAgICBzdWJub3JtYWwsIHNvIHdpbGwgbGFjayBmdWxsIHByZWNpc2lvbi4gIFdlIHNvbHZlIHRoaXMgYnkgcmVzY2FsaW5nCisgICAgICAgeCBhbmQgeSBieSBhIHN1ZmZpY2llbnRseSBsYXJnZSBwb3dlciBvZiAyIHRvIGVuc3VyZSB0aGF0IHggYW5kIHkKKyAgICAgICBhcmUgbm9ybWFsLgorICAgICovCiAKIAotCVB5X2NvbXBsZXggcjsKLQlkb3VibGUgcyxkOwotCWRvdWJsZSBheCwgYXk7CisgICAgUHlfY29tcGxleCByOworICAgIGRvdWJsZSBzLGQ7CisgICAgZG91YmxlIGF4LCBheTsKIAotCVNQRUNJQUxfVkFMVUUoeiwgc3FydF9zcGVjaWFsX3ZhbHVlcyk7CisgICAgU1BFQ0lBTF9WQUxVRSh6LCBzcXJ0X3NwZWNpYWxfdmFsdWVzKTsKIAotCWlmICh6LnJlYWwgPT0gMC4gJiYgei5pbWFnID09IDAuKSB7Ci0JCXIucmVhbCA9IDAuOwotCQlyLmltYWcgPSB6LmltYWc7Ci0JCXJldHVybiByOwotCX0KKyAgICBpZiAoei5yZWFsID09IDAuICYmIHouaW1hZyA9PSAwLikgeworICAgICAgICByLnJlYWwgPSAwLjsKKyAgICAgICAgci5pbWFnID0gei5pbWFnOworICAgICAgICByZXR1cm4gcjsKKyAgICB9CiAKLQlheCA9IGZhYnMoei5yZWFsKTsKLQlheSA9IGZhYnMoei5pbWFnKTsKKyAgICBheCA9IGZhYnMoei5yZWFsKTsKKyAgICBheSA9IGZhYnMoei5pbWFnKTsKIAotCWlmIChheCA8IERCTF9NSU4gJiYgYXkgPCBEQkxfTUlOICYmIChheCA+IDAuIHx8IGF5ID4gMC4pKSB7Ci0JCS8qIGhlcmUgd2UgY2F0Y2ggY2FzZXMgd2hlcmUgaHlwb3QoYXgsIGF5KSBpcyBzdWJub3JtYWwgKi8KLQkJYXggPSBsZGV4cChheCwgQ01fU0NBTEVfVVApOwotCQlzID0gbGRleHAoc3FydChheCArIGh5cG90KGF4LCBsZGV4cChheSwgQ01fU0NBTEVfVVApKSksCi0JCQkgIENNX1NDQUxFX0RPV04pOwotCX0gZWxzZSB7Ci0JCWF4IC89IDguOwotCQlzID0gMi4qc3FydChheCArIGh5cG90KGF4LCBheS84LikpOwotCX0KLQlkID0gYXkvKDIuKnMpOworICAgIGlmIChheCA8IERCTF9NSU4gJiYgYXkgPCBEQkxfTUlOICYmIChheCA+IDAuIHx8IGF5ID4gMC4pKSB7CisgICAgICAgIC8qIGhlcmUgd2UgY2F0Y2ggY2FzZXMgd2hlcmUgaHlwb3QoYXgsIGF5KSBpcyBzdWJub3JtYWwgKi8KKyAgICAgICAgYXggPSBsZGV4cChheCwgQ01fU0NBTEVfVVApOworICAgICAgICBzID0gbGRleHAoc3FydChheCArIGh5cG90KGF4LCBsZGV4cChheSwgQ01fU0NBTEVfVVApKSksCisgICAgICAgICAgICAgICAgICBDTV9TQ0FMRV9ET1dOKTsKKyAgICB9IGVsc2UgeworICAgICAgICBheCAvPSA4LjsKKyAgICAgICAgcyA9IDIuKnNxcnQoYXggKyBoeXBvdChheCwgYXkvOC4pKTsKKyAgICB9CisgICAgZCA9IGF5LygyLipzKTsKIAotCWlmICh6LnJlYWwgPj0gMC4pIHsKLQkJci5yZWFsID0gczsKLQkJci5pbWFnID0gY29weXNpZ24oZCwgei5pbWFnKTsKLQl9IGVsc2UgewotCQlyLnJlYWwgPSBkOwotCQlyLmltYWcgPSBjb3B5c2lnbihzLCB6LmltYWcpOwotCX0KLQllcnJubyA9IDA7Ci0JcmV0dXJuIHI7CisgICAgaWYgKHoucmVhbCA+PSAwLikgeworICAgICAgICByLnJlYWwgPSBzOworICAgICAgICByLmltYWcgPSBjb3B5c2lnbihkLCB6LmltYWcpOworICAgIH0gZWxzZSB7CisgICAgICAgIHIucmVhbCA9IGQ7CisgICAgICAgIHIuaW1hZyA9IGNvcHlzaWduKHMsIHouaW1hZyk7CisgICAgfQorICAgIGVycm5vID0gMDsKKyAgICByZXR1cm4gcjsKIH0KIAogUHlEb2NfU1RSVkFSKGNfc3FydF9kb2MsCkBAIC03MzgsMTQgKzczOCwxNCBAQAogc3RhdGljIFB5X2NvbXBsZXgKIGNfdGFuKFB5X2NvbXBsZXggeikKIHsKLQkvKiB0YW4oeikgPSAtaSB0YW5oKGl6KSAqLwotCVB5X2NvbXBsZXggcywgcjsKLQlzLnJlYWwgPSAtei5pbWFnOwotCXMuaW1hZyA9IHoucmVhbDsKLQlzID0gY190YW5oKHMpOwotCXIucmVhbCA9IHMuaW1hZzsKLQlyLmltYWcgPSAtcy5yZWFsOwotCXJldHVybiByOworICAgIC8qIHRhbih6KSA9IC1pIHRhbmgoaXopICovCisgICAgUHlfY29tcGxleCBzLCByOworICAgIHMucmVhbCA9IC16LmltYWc7CisgICAgcy5pbWFnID0gei5yZWFsOworICAgIHMgPSBjX3Rhbmgocyk7CisgICAgci5yZWFsID0gcy5pbWFnOworICAgIHIuaW1hZyA9IC1zLnJlYWw7CisgICAgcmV0dXJuIHI7CiB9CiAKIFB5RG9jX1NUUlZBUihjX3Rhbl9kb2MsCkBAIC03NjAsNjUgKzc2MCw2NSBAQAogc3RhdGljIFB5X2NvbXBsZXgKIGNfdGFuaChQeV9jb21wbGV4IHopCiB7Ci0JLyogRm9ybXVsYToKKyAgICAvKiBGb3JtdWxhOgogCi0JICAgdGFuaCh4K2l5KSA9ICh0YW5oKHgpKDErdGFuKHkpXjIpICsgaSB0YW4oeSkoMS10YW5oKHgpKV4yKSAvCi0JICAgKDErdGFuKHkpXjIgdGFuaCh4KV4yKQorICAgICAgIHRhbmgoeCtpeSkgPSAodGFuaCh4KSgxK3Rhbih5KV4yKSArIGkgdGFuKHkpKDEtdGFuaCh4KSleMikgLworICAgICAgICgxK3Rhbih5KV4yIHRhbmgoeCleMikKIAotCSAgIFRvIGF2b2lkIGV4Y2Vzc2l2ZSByb3VuZG9mZiBlcnJvciwgMS10YW5oKHgpXjIgaXMgYmV0dGVyIGNvbXB1dGVkCi0JICAgYXMgMS9jb3NoKHgpXjIuICBXaGVuIGFicyh4KSBpcyBsYXJnZSwgd2UgYXBwcm94aW1hdGUgMS10YW5oKHgpXjIKLQkgICBieSA0IGV4cCgtMip4KSBpbnN0ZWFkLCB0byBhdm9pZCBwb3NzaWJsZSBvdmVyZmxvdyBpbiB0aGUKLQkgICBjb21wdXRhdGlvbiBvZiBjb3NoKHgpLgorICAgICAgIFRvIGF2b2lkIGV4Y2Vzc2l2ZSByb3VuZG9mZiBlcnJvciwgMS10YW5oKHgpXjIgaXMgYmV0dGVyIGNvbXB1dGVkCisgICAgICAgYXMgMS9jb3NoKHgpXjIuICBXaGVuIGFicyh4KSBpcyBsYXJnZSwgd2UgYXBwcm94aW1hdGUgMS10YW5oKHgpXjIKKyAgICAgICBieSA0IGV4cCgtMip4KSBpbnN0ZWFkLCB0byBhdm9pZCBwb3NzaWJsZSBvdmVyZmxvdyBpbiB0aGUKKyAgICAgICBjb21wdXRhdGlvbiBvZiBjb3NoKHgpLgogCi0JKi8KKyAgICAqLwogCi0JUHlfY29tcGxleCByOwotCWRvdWJsZSB0eCwgdHksIGN4LCB0eHR5LCBkZW5vbTsKKyAgICBQeV9jb21wbGV4IHI7CisgICAgZG91YmxlIHR4LCB0eSwgY3gsIHR4dHksIGRlbm9tOwogCi0JLyogc3BlY2lhbCB0cmVhdG1lbnQgZm9yIHRhbmgoKy8taW5mICsgaXkpIGlmIHkgaXMgZmluaXRlIGFuZAotCSAgIG5vbnplcm8gKi8KLQlpZiAoIVB5X0lTX0ZJTklURSh6LnJlYWwpIHx8ICFQeV9JU19GSU5JVEUoei5pbWFnKSkgewotCQlpZiAoUHlfSVNfSU5GSU5JVFkoei5yZWFsKSAmJiBQeV9JU19GSU5JVEUoei5pbWFnKQotCQkgICAgJiYgKHouaW1hZyAhPSAwLikpIHsKLQkJCWlmICh6LnJlYWwgPiAwKSB7Ci0JCQkJci5yZWFsID0gMS4wOwotCQkJCXIuaW1hZyA9IGNvcHlzaWduKDAuLAotCQkJCQkJICAyLipzaW4oei5pbWFnKSpjb3Moei5pbWFnKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyLnJlYWwgPSAtMS4wOwotCQkJCXIuaW1hZyA9IGNvcHlzaWduKDAuLAotCQkJCQkJICAyLipzaW4oei5pbWFnKSpjb3Moei5pbWFnKSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyID0gdGFuaF9zcGVjaWFsX3ZhbHVlc1tzcGVjaWFsX3R5cGUoei5yZWFsKV0KLQkJCQkgICAgICAgICAgICAgICBbc3BlY2lhbF90eXBlKHouaW1hZyldOwotCQl9Ci0JCS8qIG5lZWQgdG8gc2V0IGVycm5vID0gRURPTSBpZiB6LmltYWcgaXMgKy8taW5maW5pdHkgYW5kCi0JCSAgIHoucmVhbCBpcyBmaW5pdGUgKi8KLQkJaWYgKFB5X0lTX0lORklOSVRZKHouaW1hZykgJiYgUHlfSVNfRklOSVRFKHoucmVhbCkpCi0JCQllcnJubyA9IEVET007Ci0JCWVsc2UKLQkJCWVycm5vID0gMDsKLQkJcmV0dXJuIHI7Ci0JfQorICAgIC8qIHNwZWNpYWwgdHJlYXRtZW50IGZvciB0YW5oKCsvLWluZiArIGl5KSBpZiB5IGlzIGZpbml0ZSBhbmQKKyAgICAgICBub256ZXJvICovCisgICAgaWYgKCFQeV9JU19GSU5JVEUoei5yZWFsKSB8fCAhUHlfSVNfRklOSVRFKHouaW1hZykpIHsKKyAgICAgICAgaWYgKFB5X0lTX0lORklOSVRZKHoucmVhbCkgJiYgUHlfSVNfRklOSVRFKHouaW1hZykKKyAgICAgICAgICAgICYmICh6LmltYWcgIT0gMC4pKSB7CisgICAgICAgICAgICBpZiAoei5yZWFsID4gMCkgeworICAgICAgICAgICAgICAgIHIucmVhbCA9IDEuMDsKKyAgICAgICAgICAgICAgICByLmltYWcgPSBjb3B5c2lnbigwLiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLipzaW4oei5pbWFnKSpjb3Moei5pbWFnKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICByLnJlYWwgPSAtMS4wOworICAgICAgICAgICAgICAgIHIuaW1hZyA9IGNvcHlzaWduKDAuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuKnNpbih6LmltYWcpKmNvcyh6LmltYWcpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHIgPSB0YW5oX3NwZWNpYWxfdmFsdWVzW3NwZWNpYWxfdHlwZSh6LnJlYWwpXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3BlY2lhbF90eXBlKHouaW1hZyldOworICAgICAgICB9CisgICAgICAgIC8qIG5lZWQgdG8gc2V0IGVycm5vID0gRURPTSBpZiB6LmltYWcgaXMgKy8taW5maW5pdHkgYW5kCisgICAgICAgICAgIHoucmVhbCBpcyBmaW5pdGUgKi8KKyAgICAgICAgaWYgKFB5X0lTX0lORklOSVRZKHouaW1hZykgJiYgUHlfSVNfRklOSVRFKHoucmVhbCkpCisgICAgICAgICAgICBlcnJubyA9IEVET007CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVycm5vID0gMDsKKyAgICAgICAgcmV0dXJuIHI7CisgICAgfQogCi0JLyogZGFuZ2VyIG9mIG92ZXJmbG93IGluIDIuKnouaW1hZyAhKi8KLQlpZiAoZmFicyh6LnJlYWwpID4gQ01fTE9HX0xBUkdFX0RPVUJMRSkgewotCQlyLnJlYWwgPSBjb3B5c2lnbigxLiwgei5yZWFsKTsKLQkJci5pbWFnID0gNC4qc2luKHouaW1hZykqY29zKHouaW1hZykqZXhwKC0yLipmYWJzKHoucmVhbCkpOwotCX0gZWxzZSB7Ci0JCXR4ID0gdGFuaCh6LnJlYWwpOwotCQl0eSA9IHRhbih6LmltYWcpOwotCQljeCA9IDEuL2Nvc2goei5yZWFsKTsKLQkJdHh0eSA9IHR4KnR5OwotCQlkZW5vbSA9IDEuICsgdHh0eSp0eHR5OwotCQlyLnJlYWwgPSB0eCooMS4rdHkqdHkpL2Rlbm9tOwotCQlyLmltYWcgPSAoKHR5L2Rlbm9tKSpjeCkqY3g7Ci0JfQotCWVycm5vID0gMDsKLQlyZXR1cm4gcjsKKyAgICAvKiBkYW5nZXIgb2Ygb3ZlcmZsb3cgaW4gMi4qei5pbWFnICEqLworICAgIGlmIChmYWJzKHoucmVhbCkgPiBDTV9MT0dfTEFSR0VfRE9VQkxFKSB7CisgICAgICAgIHIucmVhbCA9IGNvcHlzaWduKDEuLCB6LnJlYWwpOworICAgICAgICByLmltYWcgPSA0LipzaW4oei5pbWFnKSpjb3Moei5pbWFnKSpleHAoLTIuKmZhYnMoei5yZWFsKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdHggPSB0YW5oKHoucmVhbCk7CisgICAgICAgIHR5ID0gdGFuKHouaW1hZyk7CisgICAgICAgIGN4ID0gMS4vY29zaCh6LnJlYWwpOworICAgICAgICB0eHR5ID0gdHgqdHk7CisgICAgICAgIGRlbm9tID0gMS4gKyB0eHR5KnR4dHk7CisgICAgICAgIHIucmVhbCA9IHR4KigxLit0eSp0eSkvZGVub207CisgICAgICAgIHIuaW1hZyA9ICgodHkvZGVub20pKmN4KSpjeDsKKyAgICB9CisgICAgZXJybm8gPSAwOworICAgIHJldHVybiByOwogfQogCiBQeURvY19TVFJWQVIoY190YW5oX2RvYywKQEAgLTgzMCwyMyArODMwLDIzIEBACiBzdGF0aWMgUHlPYmplY3QgKgogY21hdGhfbG9nKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeV9jb21wbGV4IHg7Ci0JUHlfY29tcGxleCB5OworICAgIFB5X2NvbXBsZXggeDsKKyAgICBQeV9jb21wbGV4IHk7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIkR8RCIsICZ4LCAmeSkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiRHxEIiwgJngsICZ5KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQllcnJubyA9IDA7Ci0JUHlGUEVfU1RBUlRfUFJPVEVDVCgiY29tcGxleCBmdW5jdGlvbiIsIHJldHVybiAwKQotCXggPSBjX2xvZyh4KTsKLQlpZiAoUHlUdXBsZV9HRVRfU0laRShhcmdzKSA9PSAyKSB7Ci0JCXkgPSBjX2xvZyh5KTsKLQkJeCA9IGNfcXVvdCh4LCB5KTsKLQl9Ci0JUHlGUEVfRU5EX1BST1RFQ1QoeCkKLQlpZiAoZXJybm8gIT0gMCkKLQkJcmV0dXJuIG1hdGhfZXJyb3IoKTsKLQlyZXR1cm4gUHlDb21wbGV4X0Zyb21DQ29tcGxleCh4KTsKKyAgICBlcnJubyA9IDA7CisgICAgUHlGUEVfU1RBUlRfUFJPVEVDVCgiY29tcGxleCBmdW5jdGlvbiIsIHJldHVybiAwKQorICAgIHggPSBjX2xvZyh4KTsKKyAgICBpZiAoUHlUdXBsZV9HRVRfU0laRShhcmdzKSA9PSAyKSB7CisgICAgICAgIHkgPSBjX2xvZyh5KTsKKyAgICAgICAgeCA9IGNfcXVvdCh4LCB5KTsKKyAgICB9CisgICAgUHlGUEVfRU5EX1BST1RFQ1QoeCkKKyAgICBpZiAoZXJybm8gIT0gMCkKKyAgICAgICAgcmV0dXJuIG1hdGhfZXJyb3IoKTsKKyAgICByZXR1cm4gUHlDb21wbGV4X0Zyb21DQ29tcGxleCh4KTsKIH0KIAogUHlEb2NfU1RSVkFSKGNtYXRoX2xvZ19kb2MsCkBAIC04NTksNDIgKzg1OSw0MiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIG1hdGhfZXJyb3Iodm9pZCkKIHsKLQlpZiAoZXJybm8gPT0gRURPTSkKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJtYXRoIGRvbWFpbiBlcnJvciIpOwotCWVsc2UgaWYgKGVycm5vID09IEVSQU5HRSkKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsICJtYXRoIHJhbmdlIGVycm9yIik7Ci0JZWxzZSAgICAvKiBVbmV4cGVjdGVkIG1hdGggZXJyb3IgKi8KLQkJUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX1ZhbHVlRXJyb3IpOwotCXJldHVybiBOVUxMOworICAgIGlmIChlcnJubyA9PSBFRE9NKQorICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIm1hdGggZG9tYWluIGVycm9yIik7CisgICAgZWxzZSBpZiAoZXJybm8gPT0gRVJBTkdFKQorICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwgIm1hdGggcmFuZ2UgZXJyb3IiKTsKKyAgICBlbHNlICAgIC8qIFVuZXhwZWN0ZWQgbWF0aCBlcnJvciAqLworICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfVmFsdWVFcnJvcik7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBtYXRoXzEoUHlPYmplY3QgKmFyZ3MsIFB5X2NvbXBsZXggKCpmdW5jKShQeV9jb21wbGV4KSkKIHsKLQlQeV9jb21wbGV4IHgsciA7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJEIiwgJngpKQotCQlyZXR1cm4gTlVMTDsKLQllcnJubyA9IDA7Ci0JUHlGUEVfU1RBUlRfUFJPVEVDVCgiY29tcGxleCBmdW5jdGlvbiIsIHJldHVybiAwKTsKLQlyID0gKCpmdW5jKSh4KTsKLQlQeUZQRV9FTkRfUFJPVEVDVChyKTsKLQlpZiAoZXJybm8gPT0gRURPTSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIm1hdGggZG9tYWluIGVycm9yIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQllbHNlIGlmIChlcnJubyA9PSBFUkFOR0UpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsICJtYXRoIHJhbmdlIGVycm9yIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQllbHNlIHsKLQkJcmV0dXJuIFB5Q29tcGxleF9Gcm9tQ0NvbXBsZXgocik7Ci0JfQorICAgIFB5X2NvbXBsZXggeCxyIDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIkQiLCAmeCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGVycm5vID0gMDsKKyAgICBQeUZQRV9TVEFSVF9QUk9URUNUKCJjb21wbGV4IGZ1bmN0aW9uIiwgcmV0dXJuIDApOworICAgIHIgPSAoKmZ1bmMpKHgpOworICAgIFB5RlBFX0VORF9QUk9URUNUKHIpOworICAgIGlmIChlcnJubyA9PSBFRE9NKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAibWF0aCBkb21haW4gZXJyb3IiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGVsc2UgaWYgKGVycm5vID09IEVSQU5HRSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwgIm1hdGggcmFuZ2UgZXJyb3IiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByZXR1cm4gUHlDb21wbGV4X0Zyb21DQ29tcGxleChyKTsKKyAgICB9CiB9CiAKICNkZWZpbmUgRlVOQzEoc3R1Ym5hbWUsIGZ1bmMpIFwKLQlzdGF0aWMgUHlPYmplY3QgKiBzdHVibmFtZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpIHsgXAotCQlyZXR1cm4gbWF0aF8xKGFyZ3MsIGZ1bmMpOyBcCi0JfQorICAgIHN0YXRpYyBQeU9iamVjdCAqIHN0dWJuYW1lKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykgeyBcCisgICAgICAgIHJldHVybiBtYXRoXzEoYXJncywgZnVuYyk7IFwKKyAgICB9CiAKIEZVTkMxKGNtYXRoX2Fjb3MsIGNfYWNvcykKIEZVTkMxKGNtYXRoX2Fjb3NoLCBjX2Fjb3NoKQpAQCAtOTE1LDE4ICs5MTUsMTggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBjbWF0aF9waGFzZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlfY29tcGxleCB6OwotCWRvdWJsZSBwaGk7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJEOnBoYXNlIiwgJnopKQotCQlyZXR1cm4gTlVMTDsKLQllcnJubyA9IDA7Ci0JUHlGUEVfU1RBUlRfUFJPVEVDVCgiYXJnIGZ1bmN0aW9uIiwgcmV0dXJuIDApCi0JcGhpID0gY19hdGFuMih6KTsKLQlQeUZQRV9FTkRfUFJPVEVDVChwaGkpCi0JaWYgKGVycm5vICE9IDApCi0JCXJldHVybiBtYXRoX2Vycm9yKCk7Ci0JZWxzZQotCQlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKHBoaSk7CisgICAgUHlfY29tcGxleCB6OworICAgIGRvdWJsZSBwaGk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJEOnBoYXNlIiwgJnopKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBlcnJubyA9IDA7CisgICAgUHlGUEVfU1RBUlRfUFJPVEVDVCgiYXJnIGZ1bmN0aW9uIiwgcmV0dXJuIDApCisgICAgcGhpID0gY19hdGFuMih6KTsKKyAgICBQeUZQRV9FTkRfUFJPVEVDVChwaGkpCisgICAgaWYgKGVycm5vICE9IDApCisgICAgICAgIHJldHVybiBtYXRoX2Vycm9yKCk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKHBoaSk7CiB9CiAKIFB5RG9jX1NUUlZBUihjbWF0aF9waGFzZV9kb2MsCkBAIC05MzYsMTggKzkzNiwxOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGNtYXRoX3BvbGFyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeV9jb21wbGV4IHo7Ci0JZG91YmxlIHIsIHBoaTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIkQ6cG9sYXIiLCAmeikpCi0JCXJldHVybiBOVUxMOwotCVB5RlBFX1NUQVJUX1BST1RFQ1QoInBvbGFyIGZ1bmN0aW9uIiwgcmV0dXJuIDApCi0JcGhpID0gY19hdGFuMih6KTsgLyogc2hvdWxkIG5vdCBjYXVzZSBhbnkgZXhjZXB0aW9uICovCi0JciA9IGNfYWJzKHopOyAvKiBzZXRzIGVycm5vIHRvIEVSQU5HRSBvbiBvdmVyZmxvdzsgIG90aGVyd2lzZSAwICovCi0JUHlGUEVfRU5EX1BST1RFQ1QocikKLQlpZiAoZXJybm8gIT0gMCkKLQkJcmV0dXJuIG1hdGhfZXJyb3IoKTsKLQllbHNlCi0JCXJldHVybiBQeV9CdWlsZFZhbHVlKCJkZCIsIHIsIHBoaSk7CisgICAgUHlfY29tcGxleCB6OworICAgIGRvdWJsZSByLCBwaGk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJEOnBvbGFyIiwgJnopKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQeUZQRV9TVEFSVF9QUk9URUNUKCJwb2xhciBmdW5jdGlvbiIsIHJldHVybiAwKQorICAgIHBoaSA9IGNfYXRhbjIoeik7IC8qIHNob3VsZCBub3QgY2F1c2UgYW55IGV4Y2VwdGlvbiAqLworICAgIHIgPSBjX2Ficyh6KTsgLyogc2V0cyBlcnJubyB0byBFUkFOR0Ugb24gb3ZlcmZsb3c7ICBvdGhlcndpc2UgMCAqLworICAgIFB5RlBFX0VORF9QUk9URUNUKHIpCisgICAgaWYgKGVycm5vICE9IDApCisgICAgICAgIHJldHVybiBtYXRoX2Vycm9yKCk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiZGQiLCByLCBwaGkpOwogfQogCiBQeURvY19TVFJWQVIoY21hdGhfcG9sYXJfZG9jLApAQCAtOTcxLDUxICs5NzEsNTEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBjbWF0aF9yZWN0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeV9jb21wbGV4IHo7Ci0JZG91YmxlIHIsIHBoaTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImRkOnJlY3QiLCAmciwgJnBoaSkpCi0JCXJldHVybiBOVUxMOwotCWVycm5vID0gMDsKLQlQeUZQRV9TVEFSVF9QUk9URUNUKCJyZWN0IGZ1bmN0aW9uIiwgcmV0dXJuIDApCisgICAgUHlfY29tcGxleCB6OworICAgIGRvdWJsZSByLCBwaGk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJkZDpyZWN0IiwgJnIsICZwaGkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBlcnJubyA9IDA7CisgICAgUHlGUEVfU1RBUlRfUFJPVEVDVCgicmVjdCBmdW5jdGlvbiIsIHJldHVybiAwKQogCi0JLyogZGVhbCB3aXRoIHNwZWNpYWwgdmFsdWVzICovCi0JaWYgKCFQeV9JU19GSU5JVEUocikgfHwgIVB5X0lTX0ZJTklURShwaGkpKSB7Ci0JCS8qIGlmIHIgaXMgKy8taW5maW5pdHkgYW5kIHBoaSBpcyBmaW5pdGUgYnV0IG5vbnplcm8gdGhlbgotCQkgICByZXN1bHQgaXMgKCstSU5GICstSU5GIGkpLCBidXQgd2UgbmVlZCB0byBjb21wdXRlIGNvcyhwaGkpCi0JCSAgIGFuZCBzaW4ocGhpKSB0byBmaWd1cmUgb3V0IHRoZSBzaWducy4gKi8KLQkJaWYgKFB5X0lTX0lORklOSVRZKHIpICYmIChQeV9JU19GSU5JVEUocGhpKQotCQkJCQkgICYmIChwaGkgIT0gMC4pKSkgewotCQkJaWYgKHIgPiAwKSB7Ci0JCQkJei5yZWFsID0gY29weXNpZ24oSU5GLCBjb3MocGhpKSk7Ci0JCQkJei5pbWFnID0gY29weXNpZ24oSU5GLCBzaW4ocGhpKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl6LnJlYWwgPSAtY29weXNpZ24oSU5GLCBjb3MocGhpKSk7Ci0JCQkJei5pbWFnID0gLWNvcHlzaWduKElORiwgc2luKHBoaSkpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJeiA9IHJlY3Rfc3BlY2lhbF92YWx1ZXNbc3BlY2lhbF90eXBlKHIpXQotCQkJCSAgICAgICAgICAgICAgIFtzcGVjaWFsX3R5cGUocGhpKV07Ci0JCX0KLQkJLyogbmVlZCB0byBzZXQgZXJybm8gPSBFRE9NIGlmIHIgaXMgYSBub256ZXJvIG51bWJlciBhbmQgcGhpCi0JCSAgIGlzIGluZmluaXRlICovCi0JCWlmIChyICE9IDAuICYmICFQeV9JU19OQU4ocikgJiYgUHlfSVNfSU5GSU5JVFkocGhpKSkKLQkJCWVycm5vID0gRURPTTsKLQkJZWxzZQotCQkJZXJybm8gPSAwOwotCX0KLQllbHNlIHsKLQkJei5yZWFsID0gciAqIGNvcyhwaGkpOwotCQl6LmltYWcgPSByICogc2luKHBoaSk7Ci0JCWVycm5vID0gMDsKLQl9CisgICAgLyogZGVhbCB3aXRoIHNwZWNpYWwgdmFsdWVzICovCisgICAgaWYgKCFQeV9JU19GSU5JVEUocikgfHwgIVB5X0lTX0ZJTklURShwaGkpKSB7CisgICAgICAgIC8qIGlmIHIgaXMgKy8taW5maW5pdHkgYW5kIHBoaSBpcyBmaW5pdGUgYnV0IG5vbnplcm8gdGhlbgorICAgICAgICAgICByZXN1bHQgaXMgKCstSU5GICstSU5GIGkpLCBidXQgd2UgbmVlZCB0byBjb21wdXRlIGNvcyhwaGkpCisgICAgICAgICAgIGFuZCBzaW4ocGhpKSB0byBmaWd1cmUgb3V0IHRoZSBzaWducy4gKi8KKyAgICAgICAgaWYgKFB5X0lTX0lORklOSVRZKHIpICYmIChQeV9JU19GSU5JVEUocGhpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChwaGkgIT0gMC4pKSkgeworICAgICAgICAgICAgaWYgKHIgPiAwKSB7CisgICAgICAgICAgICAgICAgei5yZWFsID0gY29weXNpZ24oSU5GLCBjb3MocGhpKSk7CisgICAgICAgICAgICAgICAgei5pbWFnID0gY29weXNpZ24oSU5GLCBzaW4ocGhpKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICB6LnJlYWwgPSAtY29weXNpZ24oSU5GLCBjb3MocGhpKSk7CisgICAgICAgICAgICAgICAgei5pbWFnID0gLWNvcHlzaWduKElORiwgc2luKHBoaSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgeiA9IHJlY3Rfc3BlY2lhbF92YWx1ZXNbc3BlY2lhbF90eXBlKHIpXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3BlY2lhbF90eXBlKHBoaSldOworICAgICAgICB9CisgICAgICAgIC8qIG5lZWQgdG8gc2V0IGVycm5vID0gRURPTSBpZiByIGlzIGEgbm9uemVybyBudW1iZXIgYW5kIHBoaQorICAgICAgICAgICBpcyBpbmZpbml0ZSAqLworICAgICAgICBpZiAociAhPSAwLiAmJiAhUHlfSVNfTkFOKHIpICYmIFB5X0lTX0lORklOSVRZKHBoaSkpCisgICAgICAgICAgICBlcnJubyA9IEVET007CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVycm5vID0gMDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHoucmVhbCA9IHIgKiBjb3MocGhpKTsKKyAgICAgICAgei5pbWFnID0gciAqIHNpbihwaGkpOworICAgICAgICBlcnJubyA9IDA7CisgICAgfQogCi0JUHlGUEVfRU5EX1BST1RFQ1QoeikKLQlpZiAoZXJybm8gIT0gMCkKLQkJcmV0dXJuIG1hdGhfZXJyb3IoKTsKLQllbHNlCi0JCXJldHVybiBQeUNvbXBsZXhfRnJvbUNDb21wbGV4KHopOworICAgIFB5RlBFX0VORF9QUk9URUNUKHopCisgICAgaWYgKGVycm5vICE9IDApCisgICAgICAgIHJldHVybiBtYXRoX2Vycm9yKCk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gUHlDb21wbGV4X0Zyb21DQ29tcGxleCh6KTsKIH0KIAogUHlEb2NfU1RSVkFSKGNtYXRoX3JlY3RfZG9jLApAQCAtMTAyNSwxMCArMTAyNSwxMCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGNtYXRoX2lzbmFuKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeV9jb21wbGV4IHo7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJEOmlzbmFuIiwgJnopKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKFB5X0lTX05BTih6LnJlYWwpIHx8IFB5X0lTX05BTih6LmltYWcpKTsKKyAgICBQeV9jb21wbGV4IHo7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJEOmlzbmFuIiwgJnopKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKFB5X0lTX05BTih6LnJlYWwpIHx8IFB5X0lTX05BTih6LmltYWcpKTsKIH0KIAogUHlEb2NfU1RSVkFSKGNtYXRoX2lzbmFuX2RvYywKQEAgLTEwMzgsMTEgKzEwMzgsMTEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBjbWF0aF9pc2luZihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlfY29tcGxleCB6OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiRDppc25hbiIsICZ6KSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZyhQeV9JU19JTkZJTklUWSh6LnJlYWwpIHx8Ci0JCQkgICAgICAgUHlfSVNfSU5GSU5JVFkoei5pbWFnKSk7CisgICAgUHlfY29tcGxleCB6OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiRDppc25hbiIsICZ6KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZyhQeV9JU19JTkZJTklUWSh6LnJlYWwpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9JU19JTkZJTklUWSh6LmltYWcpKTsKIH0KIAogUHlEb2NfU1RSVkFSKGNtYXRoX2lzaW5mX2RvYywKQEAgLTEwNTUsMTU1ICsxMDU1LDE1NSBAQAogImZ1bmN0aW9ucyBmb3IgY29tcGxleCBudW1iZXJzLiIpOwogCiBzdGF0aWMgUHlNZXRob2REZWYgY21hdGhfbWV0aG9kc1tdID0gewotCXsiYWNvcyIsICAgY21hdGhfYWNvcywgIE1FVEhfVkFSQVJHUywgY19hY29zX2RvY30sCi0JeyJhY29zaCIsICBjbWF0aF9hY29zaCwgTUVUSF9WQVJBUkdTLCBjX2Fjb3NoX2RvY30sCi0JeyJhc2luIiwgICBjbWF0aF9hc2luLCAgTUVUSF9WQVJBUkdTLCBjX2FzaW5fZG9jfSwKLQl7ImFzaW5oIiwgIGNtYXRoX2FzaW5oLCBNRVRIX1ZBUkFSR1MsIGNfYXNpbmhfZG9jfSwKLQl7ImF0YW4iLCAgIGNtYXRoX2F0YW4sICBNRVRIX1ZBUkFSR1MsIGNfYXRhbl9kb2N9LAotCXsiYXRhbmgiLCAgY21hdGhfYXRhbmgsIE1FVEhfVkFSQVJHUywgY19hdGFuaF9kb2N9LAotCXsiY29zIiwgICAgY21hdGhfY29zLCAgIE1FVEhfVkFSQVJHUywgY19jb3NfZG9jfSwKLQl7ImNvc2giLCAgIGNtYXRoX2Nvc2gsICBNRVRIX1ZBUkFSR1MsIGNfY29zaF9kb2N9LAotCXsiZXhwIiwgICAgY21hdGhfZXhwLCAgIE1FVEhfVkFSQVJHUywgY19leHBfZG9jfSwKLQl7ImlzaW5mIiwgIGNtYXRoX2lzaW5mLCBNRVRIX1ZBUkFSR1MsIGNtYXRoX2lzaW5mX2RvY30sCi0JeyJpc25hbiIsICBjbWF0aF9pc25hbiwgTUVUSF9WQVJBUkdTLCBjbWF0aF9pc25hbl9kb2N9LAotCXsibG9nIiwgICAgY21hdGhfbG9nLCAgIE1FVEhfVkFSQVJHUywgY21hdGhfbG9nX2RvY30sCi0JeyJsb2cxMCIsICBjbWF0aF9sb2cxMCwgTUVUSF9WQVJBUkdTLCBjX2xvZzEwX2RvY30sCi0JeyJwaGFzZSIsICBjbWF0aF9waGFzZSwgTUVUSF9WQVJBUkdTLCBjbWF0aF9waGFzZV9kb2N9LAotCXsicG9sYXIiLCAgY21hdGhfcG9sYXIsIE1FVEhfVkFSQVJHUywgY21hdGhfcG9sYXJfZG9jfSwKLQl7InJlY3QiLCAgIGNtYXRoX3JlY3QsICBNRVRIX1ZBUkFSR1MsIGNtYXRoX3JlY3RfZG9jfSwKLQl7InNpbiIsICAgIGNtYXRoX3NpbiwgICBNRVRIX1ZBUkFSR1MsIGNfc2luX2RvY30sCi0JeyJzaW5oIiwgICBjbWF0aF9zaW5oLCAgTUVUSF9WQVJBUkdTLCBjX3NpbmhfZG9jfSwKLQl7InNxcnQiLCAgIGNtYXRoX3NxcnQsICBNRVRIX1ZBUkFSR1MsIGNfc3FydF9kb2N9LAotCXsidGFuIiwgICAgY21hdGhfdGFuLCAgIE1FVEhfVkFSQVJHUywgY190YW5fZG9jfSwKLQl7InRhbmgiLCAgIGNtYXRoX3RhbmgsICBNRVRIX1ZBUkFSR1MsIGNfdGFuaF9kb2N9LAotCXtOVUxMLAkJTlVMTH0JCS8qIHNlbnRpbmVsICovCisgICAgeyJhY29zIiwgICBjbWF0aF9hY29zLCAgTUVUSF9WQVJBUkdTLCBjX2Fjb3NfZG9jfSwKKyAgICB7ImFjb3NoIiwgIGNtYXRoX2Fjb3NoLCBNRVRIX1ZBUkFSR1MsIGNfYWNvc2hfZG9jfSwKKyAgICB7ImFzaW4iLCAgIGNtYXRoX2FzaW4sICBNRVRIX1ZBUkFSR1MsIGNfYXNpbl9kb2N9LAorICAgIHsiYXNpbmgiLCAgY21hdGhfYXNpbmgsIE1FVEhfVkFSQVJHUywgY19hc2luaF9kb2N9LAorICAgIHsiYXRhbiIsICAgY21hdGhfYXRhbiwgIE1FVEhfVkFSQVJHUywgY19hdGFuX2RvY30sCisgICAgeyJhdGFuaCIsICBjbWF0aF9hdGFuaCwgTUVUSF9WQVJBUkdTLCBjX2F0YW5oX2RvY30sCisgICAgeyJjb3MiLCAgICBjbWF0aF9jb3MsICAgTUVUSF9WQVJBUkdTLCBjX2Nvc19kb2N9LAorICAgIHsiY29zaCIsICAgY21hdGhfY29zaCwgIE1FVEhfVkFSQVJHUywgY19jb3NoX2RvY30sCisgICAgeyJleHAiLCAgICBjbWF0aF9leHAsICAgTUVUSF9WQVJBUkdTLCBjX2V4cF9kb2N9LAorICAgIHsiaXNpbmYiLCAgY21hdGhfaXNpbmYsIE1FVEhfVkFSQVJHUywgY21hdGhfaXNpbmZfZG9jfSwKKyAgICB7ImlzbmFuIiwgIGNtYXRoX2lzbmFuLCBNRVRIX1ZBUkFSR1MsIGNtYXRoX2lzbmFuX2RvY30sCisgICAgeyJsb2ciLCAgICBjbWF0aF9sb2csICAgTUVUSF9WQVJBUkdTLCBjbWF0aF9sb2dfZG9jfSwKKyAgICB7ImxvZzEwIiwgIGNtYXRoX2xvZzEwLCBNRVRIX1ZBUkFSR1MsIGNfbG9nMTBfZG9jfSwKKyAgICB7InBoYXNlIiwgIGNtYXRoX3BoYXNlLCBNRVRIX1ZBUkFSR1MsIGNtYXRoX3BoYXNlX2RvY30sCisgICAgeyJwb2xhciIsICBjbWF0aF9wb2xhciwgTUVUSF9WQVJBUkdTLCBjbWF0aF9wb2xhcl9kb2N9LAorICAgIHsicmVjdCIsICAgY21hdGhfcmVjdCwgIE1FVEhfVkFSQVJHUywgY21hdGhfcmVjdF9kb2N9LAorICAgIHsic2luIiwgICAgY21hdGhfc2luLCAgIE1FVEhfVkFSQVJHUywgY19zaW5fZG9jfSwKKyAgICB7InNpbmgiLCAgIGNtYXRoX3NpbmgsICBNRVRIX1ZBUkFSR1MsIGNfc2luaF9kb2N9LAorICAgIHsic3FydCIsICAgY21hdGhfc3FydCwgIE1FVEhfVkFSQVJHUywgY19zcXJ0X2RvY30sCisgICAgeyJ0YW4iLCAgICBjbWF0aF90YW4sICAgTUVUSF9WQVJBUkdTLCBjX3Rhbl9kb2N9LAorICAgIHsidGFuaCIsICAgY21hdGhfdGFuaCwgIE1FVEhfVkFSQVJHUywgY190YW5oX2RvY30sCisgICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIFB5TU9ESU5JVF9GVU5DCiBpbml0Y21hdGgodm9pZCkKIHsKLQlQeU9iamVjdCAqbTsKKyAgICBQeU9iamVjdCAqbTsKIAotCW0gPSBQeV9Jbml0TW9kdWxlMygiY21hdGgiLCBjbWF0aF9tZXRob2RzLCBtb2R1bGVfZG9jKTsKLQlpZiAobSA9PSBOVUxMKQotCQlyZXR1cm47CisgICAgbSA9IFB5X0luaXRNb2R1bGUzKCJjbWF0aCIsIGNtYXRoX21ldGhvZHMsIG1vZHVsZV9kb2MpOworICAgIGlmIChtID09IE5VTEwpCisgICAgICAgIHJldHVybjsKIAotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAicGkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlGbG9hdF9Gcm9tRG91YmxlKFB5X01BVEhfUEkpKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgImUiLCBQeUZsb2F0X0Zyb21Eb3VibGUoUHlfTUFUSF9FKSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJwaSIsCisgICAgICAgICAgICAgICAgICAgICAgIFB5RmxvYXRfRnJvbURvdWJsZShQeV9NQVRIX1BJKSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJlIiwgUHlGbG9hdF9Gcm9tRG91YmxlKFB5X01BVEhfRSkpOwogCi0JLyogaW5pdGlhbGl6ZSBzcGVjaWFsIHZhbHVlIHRhYmxlcyAqLworICAgIC8qIGluaXRpYWxpemUgc3BlY2lhbCB2YWx1ZSB0YWJsZXMgKi8KIAogI2RlZmluZSBJTklUX1NQRUNJQUxfVkFMVUVTKE5BTUUsIEJPRFkpIHsgUHlfY29tcGxleCogcCA9IChQeV9jb21wbGV4KilOQU1FOyBCT0RZIH0KICNkZWZpbmUgQyhSRUFMLCBJTUFHKSBwLT5yZWFsID0gUkVBTDsgcC0+aW1hZyA9IElNQUc7ICsrcDsKIAotCUlOSVRfU1BFQ0lBTF9WQUxVRVMoYWNvc19zcGVjaWFsX3ZhbHVlcywgewotCSAgQyhQMzQsSU5GKSBDKFAsSU5GKSAgQyhQLElORikgIEMoUCwtSU5GKSAgQyhQLC1JTkYpICBDKFAzNCwtSU5GKSBDKE4sSU5GKQotCSAgQyhQMTIsSU5GKSBDKFUsVSkgICAgQyhVLFUpICAgIEMoVSxVKSAgICAgQyhVLFUpICAgICBDKFAxMiwtSU5GKSBDKE4sTikKLQkgIEMoUDEyLElORikgQyhVLFUpICAgIEMoUDEyLDAuKSBDKFAxMiwtMC4pIEMoVSxVKSAgICAgQyhQMTIsLUlORikgQyhQMTIsTikKLQkgIEMoUDEyLElORikgQyhVLFUpICAgIEMoUDEyLDAuKSBDKFAxMiwtMC4pIEMoVSxVKSAgICAgQyhQMTIsLUlORikgQyhQMTIsTikKLQkgIEMoUDEyLElORikgQyhVLFUpICAgIEMoVSxVKSAgICBDKFUsVSkgICAgIEMoVSxVKSAgICAgQyhQMTIsLUlORikgQyhOLE4pCi0JICBDKFAxNCxJTkYpIEMoMC4sSU5GKSBDKDAuLElORikgQygwLiwtSU5GKSBDKDAuLC1JTkYpIEMoUDE0LC1JTkYpIEMoTixJTkYpCi0JICBDKE4sSU5GKSAgIEMoTixOKSAgICBDKE4sTikgICAgQyhOLE4pICAgICBDKE4sTikgICAgIEMoTiwtSU5GKSAgIEMoTixOKQotCX0pCisgICAgSU5JVF9TUEVDSUFMX1ZBTFVFUyhhY29zX3NwZWNpYWxfdmFsdWVzLCB7CisgICAgICBDKFAzNCxJTkYpIEMoUCxJTkYpICBDKFAsSU5GKSAgQyhQLC1JTkYpICBDKFAsLUlORikgIEMoUDM0LC1JTkYpIEMoTixJTkYpCisgICAgICBDKFAxMixJTkYpIEMoVSxVKSAgICBDKFUsVSkgICAgQyhVLFUpICAgICBDKFUsVSkgICAgIEMoUDEyLC1JTkYpIEMoTixOKQorICAgICAgQyhQMTIsSU5GKSBDKFUsVSkgICAgQyhQMTIsMC4pIEMoUDEyLC0wLikgQyhVLFUpICAgICBDKFAxMiwtSU5GKSBDKFAxMixOKQorICAgICAgQyhQMTIsSU5GKSBDKFUsVSkgICAgQyhQMTIsMC4pIEMoUDEyLC0wLikgQyhVLFUpICAgICBDKFAxMiwtSU5GKSBDKFAxMixOKQorICAgICAgQyhQMTIsSU5GKSBDKFUsVSkgICAgQyhVLFUpICAgIEMoVSxVKSAgICAgQyhVLFUpICAgICBDKFAxMiwtSU5GKSBDKE4sTikKKyAgICAgIEMoUDE0LElORikgQygwLixJTkYpIEMoMC4sSU5GKSBDKDAuLC1JTkYpIEMoMC4sLUlORikgQyhQMTQsLUlORikgQyhOLElORikKKyAgICAgIEMoTixJTkYpICAgQyhOLE4pICAgIEMoTixOKSAgICBDKE4sTikgICAgIEMoTixOKSAgICAgQyhOLC1JTkYpICAgQyhOLE4pCisgICAgfSkKIAotCUlOSVRfU1BFQ0lBTF9WQUxVRVMoYWNvc2hfc3BlY2lhbF92YWx1ZXMsIHsKLQkgIEMoSU5GLC1QMzQpIEMoSU5GLC1QKSAgQyhJTkYsLVApICBDKElORixQKSAgQyhJTkYsUCkgIEMoSU5GLFAzNCkgQyhJTkYsTikKLQkgIEMoSU5GLC1QMTIpIEMoVSxVKSAgICAgQyhVLFUpICAgICBDKFUsVSkgICAgQyhVLFUpICAgIEMoSU5GLFAxMikgQyhOLE4pCi0JICBDKElORiwtUDEyKSBDKFUsVSkgICAgIEMoMC4sLVAxMikgQygwLixQMTIpIEMoVSxVKSAgICBDKElORixQMTIpIEMoTixOKQotCSAgQyhJTkYsLVAxMikgQyhVLFUpICAgICBDKDAuLC1QMTIpIEMoMC4sUDEyKSBDKFUsVSkgICAgQyhJTkYsUDEyKSBDKE4sTikKLQkgIEMoSU5GLC1QMTIpIEMoVSxVKSAgICAgQyhVLFUpICAgICBDKFUsVSkgICAgQyhVLFUpICAgIEMoSU5GLFAxMikgQyhOLE4pCi0JICBDKElORiwtUDE0KSBDKElORiwtMC4pIEMoSU5GLC0wLikgQyhJTkYsMC4pIEMoSU5GLDAuKSBDKElORixQMTQpIEMoSU5GLE4pCi0JICBDKElORixOKSAgICBDKE4sTikgICAgIEMoTixOKSAgICAgQyhOLE4pICAgIEMoTixOKSAgICBDKElORixOKSAgIEMoTixOKQotCX0pCisgICAgSU5JVF9TUEVDSUFMX1ZBTFVFUyhhY29zaF9zcGVjaWFsX3ZhbHVlcywgeworICAgICAgQyhJTkYsLVAzNCkgQyhJTkYsLVApICBDKElORiwtUCkgIEMoSU5GLFApICBDKElORixQKSAgQyhJTkYsUDM0KSBDKElORixOKQorICAgICAgQyhJTkYsLVAxMikgQyhVLFUpICAgICBDKFUsVSkgICAgIEMoVSxVKSAgICBDKFUsVSkgICAgQyhJTkYsUDEyKSBDKE4sTikKKyAgICAgIEMoSU5GLC1QMTIpIEMoVSxVKSAgICAgQygwLiwtUDEyKSBDKDAuLFAxMikgQyhVLFUpICAgIEMoSU5GLFAxMikgQyhOLE4pCisgICAgICBDKElORiwtUDEyKSBDKFUsVSkgICAgIEMoMC4sLVAxMikgQygwLixQMTIpIEMoVSxVKSAgICBDKElORixQMTIpIEMoTixOKQorICAgICAgQyhJTkYsLVAxMikgQyhVLFUpICAgICBDKFUsVSkgICAgIEMoVSxVKSAgICBDKFUsVSkgICAgQyhJTkYsUDEyKSBDKE4sTikKKyAgICAgIEMoSU5GLC1QMTQpIEMoSU5GLC0wLikgQyhJTkYsLTAuKSBDKElORiwwLikgQyhJTkYsMC4pIEMoSU5GLFAxNCkgQyhJTkYsTikKKyAgICAgIEMoSU5GLE4pICAgIEMoTixOKSAgICAgQyhOLE4pICAgICBDKE4sTikgICAgQyhOLE4pICAgIEMoSU5GLE4pICAgQyhOLE4pCisgICAgfSkKIAotCUlOSVRfU1BFQ0lBTF9WQUxVRVMoYXNpbmhfc3BlY2lhbF92YWx1ZXMsIHsKLQkgIEMoLUlORiwtUDE0KSBDKC1JTkYsLTAuKSBDKC1JTkYsLTAuKSBDKC1JTkYsMC4pIEMoLUlORiwwLikgQygtSU5GLFAxNCkgQygtSU5GLE4pCi0JICBDKC1JTkYsLVAxMikgQyhVLFUpICAgICAgQyhVLFUpICAgICAgQyhVLFUpICAgICBDKFUsVSkgICAgIEMoLUlORixQMTIpIEMoTixOKQotCSAgQygtSU5GLC1QMTIpIEMoVSxVKSAgICAgIEMoLTAuLC0wLikgIEMoLTAuLDAuKSAgQyhVLFUpICAgICBDKC1JTkYsUDEyKSBDKE4sTikKLQkgIEMoSU5GLC1QMTIpICBDKFUsVSkgICAgICBDKDAuLC0wLikgICBDKDAuLDAuKSAgIEMoVSxVKSAgICAgQyhJTkYsUDEyKSAgQyhOLE4pCi0JICBDKElORiwtUDEyKSAgQyhVLFUpICAgICAgQyhVLFUpICAgICAgQyhVLFUpICAgICBDKFUsVSkgICAgIEMoSU5GLFAxMikgIEMoTixOKQotCSAgQyhJTkYsLVAxNCkgIEMoSU5GLC0wLikgIEMoSU5GLC0wLikgIEMoSU5GLDAuKSAgQyhJTkYsMC4pICBDKElORixQMTQpICBDKElORixOKQotCSAgQyhJTkYsTikgICAgIEMoTixOKSAgICAgIEMoTiwtMC4pICAgIEMoTiwwLikgICAgQyhOLE4pICAgICBDKElORixOKSAgICBDKE4sTikKLQl9KQorICAgIElOSVRfU1BFQ0lBTF9WQUxVRVMoYXNpbmhfc3BlY2lhbF92YWx1ZXMsIHsKKyAgICAgIEMoLUlORiwtUDE0KSBDKC1JTkYsLTAuKSBDKC1JTkYsLTAuKSBDKC1JTkYsMC4pIEMoLUlORiwwLikgQygtSU5GLFAxNCkgQygtSU5GLE4pCisgICAgICBDKC1JTkYsLVAxMikgQyhVLFUpICAgICAgQyhVLFUpICAgICAgQyhVLFUpICAgICBDKFUsVSkgICAgIEMoLUlORixQMTIpIEMoTixOKQorICAgICAgQygtSU5GLC1QMTIpIEMoVSxVKSAgICAgIEMoLTAuLC0wLikgIEMoLTAuLDAuKSAgQyhVLFUpICAgICBDKC1JTkYsUDEyKSBDKE4sTikKKyAgICAgIEMoSU5GLC1QMTIpICBDKFUsVSkgICAgICBDKDAuLC0wLikgICBDKDAuLDAuKSAgIEMoVSxVKSAgICAgQyhJTkYsUDEyKSAgQyhOLE4pCisgICAgICBDKElORiwtUDEyKSAgQyhVLFUpICAgICAgQyhVLFUpICAgICAgQyhVLFUpICAgICBDKFUsVSkgICAgIEMoSU5GLFAxMikgIEMoTixOKQorICAgICAgQyhJTkYsLVAxNCkgIEMoSU5GLC0wLikgIEMoSU5GLC0wLikgIEMoSU5GLDAuKSAgQyhJTkYsMC4pICBDKElORixQMTQpICBDKElORixOKQorICAgICAgQyhJTkYsTikgICAgIEMoTixOKSAgICAgIEMoTiwtMC4pICAgIEMoTiwwLikgICAgQyhOLE4pICAgICBDKElORixOKSAgICBDKE4sTikKKyAgICB9KQogCi0JSU5JVF9TUEVDSUFMX1ZBTFVFUyhhdGFuaF9zcGVjaWFsX3ZhbHVlcywgewotCSAgQygtMC4sLVAxMikgQygtMC4sLVAxMikgQygtMC4sLVAxMikgQygtMC4sUDEyKSBDKC0wLixQMTIpIEMoLTAuLFAxMikgQygtMC4sTikKLQkgIEMoLTAuLC1QMTIpIEMoVSxVKSAgICAgIEMoVSxVKSAgICAgIEMoVSxVKSAgICAgQyhVLFUpICAgICBDKC0wLixQMTIpIEMoTixOKQotCSAgQygtMC4sLVAxMikgQyhVLFUpICAgICAgQygtMC4sLTAuKSAgQygtMC4sMC4pICBDKFUsVSkgICAgIEMoLTAuLFAxMikgQygtMC4sTikKLQkgIEMoMC4sLVAxMikgIEMoVSxVKSAgICAgIEMoMC4sLTAuKSAgIEMoMC4sMC4pICAgQyhVLFUpICAgICBDKDAuLFAxMikgIEMoMC4sTikKLQkgIEMoMC4sLVAxMikgIEMoVSxVKSAgICAgIEMoVSxVKSAgICAgIEMoVSxVKSAgICAgQyhVLFUpICAgICBDKDAuLFAxMikgIEMoTixOKQotCSAgQygwLiwtUDEyKSAgQygwLiwtUDEyKSAgQygwLiwtUDEyKSAgQygwLixQMTIpICBDKDAuLFAxMikgIEMoMC4sUDEyKSAgQygwLixOKQotCSAgQygwLiwtUDEyKSAgQyhOLE4pICAgICAgQyhOLE4pICAgICAgQyhOLE4pICAgICBDKE4sTikgICAgIEMoMC4sUDEyKSAgQyhOLE4pCi0JfSkKKyAgICBJTklUX1NQRUNJQUxfVkFMVUVTKGF0YW5oX3NwZWNpYWxfdmFsdWVzLCB7CisgICAgICBDKC0wLiwtUDEyKSBDKC0wLiwtUDEyKSBDKC0wLiwtUDEyKSBDKC0wLixQMTIpIEMoLTAuLFAxMikgQygtMC4sUDEyKSBDKC0wLixOKQorICAgICAgQygtMC4sLVAxMikgQyhVLFUpICAgICAgQyhVLFUpICAgICAgQyhVLFUpICAgICBDKFUsVSkgICAgIEMoLTAuLFAxMikgQyhOLE4pCisgICAgICBDKC0wLiwtUDEyKSBDKFUsVSkgICAgICBDKC0wLiwtMC4pICBDKC0wLiwwLikgIEMoVSxVKSAgICAgQygtMC4sUDEyKSBDKC0wLixOKQorICAgICAgQygwLiwtUDEyKSAgQyhVLFUpICAgICAgQygwLiwtMC4pICAgQygwLiwwLikgICBDKFUsVSkgICAgIEMoMC4sUDEyKSAgQygwLixOKQorICAgICAgQygwLiwtUDEyKSAgQyhVLFUpICAgICAgQyhVLFUpICAgICAgQyhVLFUpICAgICBDKFUsVSkgICAgIEMoMC4sUDEyKSAgQyhOLE4pCisgICAgICBDKDAuLC1QMTIpICBDKDAuLC1QMTIpICBDKDAuLC1QMTIpICBDKDAuLFAxMikgIEMoMC4sUDEyKSAgQygwLixQMTIpICBDKDAuLE4pCisgICAgICBDKDAuLC1QMTIpICBDKE4sTikgICAgICBDKE4sTikgICAgICBDKE4sTikgICAgIEMoTixOKSAgICAgQygwLixQMTIpICBDKE4sTikKKyAgICB9KQogCi0JSU5JVF9TUEVDSUFMX1ZBTFVFUyhjb3NoX3NwZWNpYWxfdmFsdWVzLCB7Ci0JICBDKElORixOKSBDKFUsVSkgQyhJTkYsMC4pICBDKElORiwtMC4pIEMoVSxVKSBDKElORixOKSBDKElORixOKQotCSAgQyhOLE4pICAgQyhVLFUpIEMoVSxVKSAgICAgQyhVLFUpICAgICBDKFUsVSkgQyhOLE4pICAgQyhOLE4pCi0JICBDKE4sMC4pICBDKFUsVSkgQygxLiwwLikgICBDKDEuLC0wLikgIEMoVSxVKSBDKE4sMC4pICBDKE4sMC4pCi0JICBDKE4sMC4pICBDKFUsVSkgQygxLiwtMC4pICBDKDEuLDAuKSAgIEMoVSxVKSBDKE4sMC4pICBDKE4sMC4pCi0JICBDKE4sTikgICBDKFUsVSkgQyhVLFUpICAgICBDKFUsVSkgICAgIEMoVSxVKSBDKE4sTikgICBDKE4sTikKLQkgIEMoSU5GLE4pIEMoVSxVKSBDKElORiwtMC4pIEMoSU5GLDAuKSAgQyhVLFUpIEMoSU5GLE4pIEMoSU5GLE4pCi0JICBDKE4sTikgICBDKE4sTikgQyhOLDAuKSAgICBDKE4sMC4pICAgIEMoTixOKSBDKE4sTikgICBDKE4sTikKLQl9KQorICAgIElOSVRfU1BFQ0lBTF9WQUxVRVMoY29zaF9zcGVjaWFsX3ZhbHVlcywgeworICAgICAgQyhJTkYsTikgQyhVLFUpIEMoSU5GLDAuKSAgQyhJTkYsLTAuKSBDKFUsVSkgQyhJTkYsTikgQyhJTkYsTikKKyAgICAgIEMoTixOKSAgIEMoVSxVKSBDKFUsVSkgICAgIEMoVSxVKSAgICAgQyhVLFUpIEMoTixOKSAgIEMoTixOKQorICAgICAgQyhOLDAuKSAgQyhVLFUpIEMoMS4sMC4pICAgQygxLiwtMC4pICBDKFUsVSkgQyhOLDAuKSAgQyhOLDAuKQorICAgICAgQyhOLDAuKSAgQyhVLFUpIEMoMS4sLTAuKSAgQygxLiwwLikgICBDKFUsVSkgQyhOLDAuKSAgQyhOLDAuKQorICAgICAgQyhOLE4pICAgQyhVLFUpIEMoVSxVKSAgICAgQyhVLFUpICAgICBDKFUsVSkgQyhOLE4pICAgQyhOLE4pCisgICAgICBDKElORixOKSBDKFUsVSkgQyhJTkYsLTAuKSBDKElORiwwLikgIEMoVSxVKSBDKElORixOKSBDKElORixOKQorICAgICAgQyhOLE4pICAgQyhOLE4pIEMoTiwwLikgICAgQyhOLDAuKSAgICBDKE4sTikgQyhOLE4pICAgQyhOLE4pCisgICAgfSkKIAotCUlOSVRfU1BFQ0lBTF9WQUxVRVMoZXhwX3NwZWNpYWxfdmFsdWVzLCB7Ci0JICBDKDAuLDAuKSBDKFUsVSkgQygwLiwtMC4pICBDKDAuLDAuKSAgQyhVLFUpIEMoMC4sMC4pIEMoMC4sMC4pCi0JICBDKE4sTikgICBDKFUsVSkgQyhVLFUpICAgICBDKFUsVSkgICAgQyhVLFUpIEMoTixOKSAgIEMoTixOKQotCSAgQyhOLE4pICAgQyhVLFUpIEMoMS4sLTAuKSAgQygxLiwwLikgIEMoVSxVKSBDKE4sTikgICBDKE4sTikKLQkgIEMoTixOKSAgIEMoVSxVKSBDKDEuLC0wLikgIEMoMS4sMC4pICBDKFUsVSkgQyhOLE4pICAgQyhOLE4pCi0JICBDKE4sTikgICBDKFUsVSkgQyhVLFUpICAgICBDKFUsVSkgICAgQyhVLFUpIEMoTixOKSAgIEMoTixOKQotCSAgQyhJTkYsTikgQyhVLFUpIEMoSU5GLC0wLikgQyhJTkYsMC4pIEMoVSxVKSBDKElORixOKSBDKElORixOKQotCSAgQyhOLE4pICAgQyhOLE4pIEMoTiwtMC4pICAgQyhOLDAuKSAgIEMoTixOKSBDKE4sTikgICBDKE4sTikKLQl9KQorICAgIElOSVRfU1BFQ0lBTF9WQUxVRVMoZXhwX3NwZWNpYWxfdmFsdWVzLCB7CisgICAgICBDKDAuLDAuKSBDKFUsVSkgQygwLiwtMC4pICBDKDAuLDAuKSAgQyhVLFUpIEMoMC4sMC4pIEMoMC4sMC4pCisgICAgICBDKE4sTikgICBDKFUsVSkgQyhVLFUpICAgICBDKFUsVSkgICAgQyhVLFUpIEMoTixOKSAgIEMoTixOKQorICAgICAgQyhOLE4pICAgQyhVLFUpIEMoMS4sLTAuKSAgQygxLiwwLikgIEMoVSxVKSBDKE4sTikgICBDKE4sTikKKyAgICAgIEMoTixOKSAgIEMoVSxVKSBDKDEuLC0wLikgIEMoMS4sMC4pICBDKFUsVSkgQyhOLE4pICAgQyhOLE4pCisgICAgICBDKE4sTikgICBDKFUsVSkgQyhVLFUpICAgICBDKFUsVSkgICAgQyhVLFUpIEMoTixOKSAgIEMoTixOKQorICAgICAgQyhJTkYsTikgQyhVLFUpIEMoSU5GLC0wLikgQyhJTkYsMC4pIEMoVSxVKSBDKElORixOKSBDKElORixOKQorICAgICAgQyhOLE4pICAgQyhOLE4pIEMoTiwtMC4pICAgQyhOLDAuKSAgIEMoTixOKSBDKE4sTikgICBDKE4sTikKKyAgICB9KQogCi0JSU5JVF9TUEVDSUFMX1ZBTFVFUyhsb2dfc3BlY2lhbF92YWx1ZXMsIHsKLQkgIEMoSU5GLC1QMzQpIEMoSU5GLC1QKSAgQyhJTkYsLVApICAgQyhJTkYsUCkgICBDKElORixQKSAgQyhJTkYsUDM0KSAgQyhJTkYsTikKLQkgIEMoSU5GLC1QMTIpIEMoVSxVKSAgICAgQyhVLFUpICAgICAgQyhVLFUpICAgICBDKFUsVSkgICAgQyhJTkYsUDEyKSAgQyhOLE4pCi0JICBDKElORiwtUDEyKSBDKFUsVSkgICAgIEMoLUlORiwtUCkgIEMoLUlORixQKSAgQyhVLFUpICAgIEMoSU5GLFAxMikgIEMoTixOKQotCSAgQyhJTkYsLVAxMikgQyhVLFUpICAgICBDKC1JTkYsLTAuKSBDKC1JTkYsMC4pIEMoVSxVKSAgICBDKElORixQMTIpICBDKE4sTikKLQkgIEMoSU5GLC1QMTIpIEMoVSxVKSAgICAgQyhVLFUpICAgICAgQyhVLFUpICAgICBDKFUsVSkgICAgQyhJTkYsUDEyKSAgQyhOLE4pCi0JICBDKElORiwtUDE0KSBDKElORiwtMC4pIEMoSU5GLC0wLikgIEMoSU5GLDAuKSAgQyhJTkYsMC4pIEMoSU5GLFAxNCkgIEMoSU5GLE4pCi0JICBDKElORixOKSAgICBDKE4sTikgICAgIEMoTixOKSAgICAgIEMoTixOKSAgICAgQyhOLE4pICAgIEMoSU5GLE4pICAgIEMoTixOKQotCX0pCisgICAgSU5JVF9TUEVDSUFMX1ZBTFVFUyhsb2dfc3BlY2lhbF92YWx1ZXMsIHsKKyAgICAgIEMoSU5GLC1QMzQpIEMoSU5GLC1QKSAgQyhJTkYsLVApICAgQyhJTkYsUCkgICBDKElORixQKSAgQyhJTkYsUDM0KSAgQyhJTkYsTikKKyAgICAgIEMoSU5GLC1QMTIpIEMoVSxVKSAgICAgQyhVLFUpICAgICAgQyhVLFUpICAgICBDKFUsVSkgICAgQyhJTkYsUDEyKSAgQyhOLE4pCisgICAgICBDKElORiwtUDEyKSBDKFUsVSkgICAgIEMoLUlORiwtUCkgIEMoLUlORixQKSAgQyhVLFUpICAgIEMoSU5GLFAxMikgIEMoTixOKQorICAgICAgQyhJTkYsLVAxMikgQyhVLFUpICAgICBDKC1JTkYsLTAuKSBDKC1JTkYsMC4pIEMoVSxVKSAgICBDKElORixQMTIpICBDKE4sTikKKyAgICAgIEMoSU5GLC1QMTIpIEMoVSxVKSAgICAgQyhVLFUpICAgICAgQyhVLFUpICAgICBDKFUsVSkgICAgQyhJTkYsUDEyKSAgQyhOLE4pCisgICAgICBDKElORiwtUDE0KSBDKElORiwtMC4pIEMoSU5GLC0wLikgIEMoSU5GLDAuKSAgQyhJTkYsMC4pIEMoSU5GLFAxNCkgIEMoSU5GLE4pCisgICAgICBDKElORixOKSAgICBDKE4sTikgICAgIEMoTixOKSAgICAgIEMoTixOKSAgICAgQyhOLE4pICAgIEMoSU5GLE4pICAgIEMoTixOKQorICAgIH0pCiAKLQlJTklUX1NQRUNJQUxfVkFMVUVTKHNpbmhfc3BlY2lhbF92YWx1ZXMsIHsKLQkgIEMoSU5GLE4pIEMoVSxVKSBDKC1JTkYsLTAuKSBDKC1JTkYsMC4pIEMoVSxVKSBDKElORixOKSBDKElORixOKQotCSAgQyhOLE4pICAgQyhVLFUpIEMoVSxVKSAgICAgIEMoVSxVKSAgICAgQyhVLFUpIEMoTixOKSAgIEMoTixOKQotCSAgQygwLixOKSAgQyhVLFUpIEMoLTAuLC0wLikgIEMoLTAuLDAuKSAgQyhVLFUpIEMoMC4sTikgIEMoMC4sTikKLQkgIEMoMC4sTikgIEMoVSxVKSBDKDAuLC0wLikgICBDKDAuLDAuKSAgIEMoVSxVKSBDKDAuLE4pICBDKDAuLE4pCi0JICBDKE4sTikgICBDKFUsVSkgQyhVLFUpICAgICAgQyhVLFUpICAgICBDKFUsVSkgQyhOLE4pICAgQyhOLE4pCi0JICBDKElORixOKSBDKFUsVSkgQyhJTkYsLTAuKSAgQyhJTkYsMC4pICBDKFUsVSkgQyhJTkYsTikgQyhJTkYsTikKLQkgIEMoTixOKSAgIEMoTixOKSBDKE4sLTAuKSAgICBDKE4sMC4pICAgIEMoTixOKSBDKE4sTikgICBDKE4sTikKLQl9KQorICAgIElOSVRfU1BFQ0lBTF9WQUxVRVMoc2luaF9zcGVjaWFsX3ZhbHVlcywgeworICAgICAgQyhJTkYsTikgQyhVLFUpIEMoLUlORiwtMC4pIEMoLUlORiwwLikgQyhVLFUpIEMoSU5GLE4pIEMoSU5GLE4pCisgICAgICBDKE4sTikgICBDKFUsVSkgQyhVLFUpICAgICAgQyhVLFUpICAgICBDKFUsVSkgQyhOLE4pICAgQyhOLE4pCisgICAgICBDKDAuLE4pICBDKFUsVSkgQygtMC4sLTAuKSAgQygtMC4sMC4pICBDKFUsVSkgQygwLixOKSAgQygwLixOKQorICAgICAgQygwLixOKSAgQyhVLFUpIEMoMC4sLTAuKSAgIEMoMC4sMC4pICAgQyhVLFUpIEMoMC4sTikgIEMoMC4sTikKKyAgICAgIEMoTixOKSAgIEMoVSxVKSBDKFUsVSkgICAgICBDKFUsVSkgICAgIEMoVSxVKSBDKE4sTikgICBDKE4sTikKKyAgICAgIEMoSU5GLE4pIEMoVSxVKSBDKElORiwtMC4pICBDKElORiwwLikgIEMoVSxVKSBDKElORixOKSBDKElORixOKQorICAgICAgQyhOLE4pICAgQyhOLE4pIEMoTiwtMC4pICAgIEMoTiwwLikgICAgQyhOLE4pIEMoTixOKSAgIEMoTixOKQorICAgIH0pCiAKLQlJTklUX1NQRUNJQUxfVkFMVUVTKHNxcnRfc3BlY2lhbF92YWx1ZXMsIHsKLQkgIEMoSU5GLC1JTkYpIEMoMC4sLUlORikgQygwLiwtSU5GKSBDKDAuLElORikgQygwLixJTkYpIEMoSU5GLElORikgQyhOLElORikKLQkgIEMoSU5GLC1JTkYpIEMoVSxVKSAgICAgQyhVLFUpICAgICBDKFUsVSkgICAgQyhVLFUpICAgIEMoSU5GLElORikgQyhOLE4pCi0JICBDKElORiwtSU5GKSBDKFUsVSkgICAgIEMoMC4sLTAuKSAgQygwLiwwLikgIEMoVSxVKSAgICBDKElORixJTkYpIEMoTixOKQotCSAgQyhJTkYsLUlORikgQyhVLFUpICAgICBDKDAuLC0wLikgIEMoMC4sMC4pICBDKFUsVSkgICAgQyhJTkYsSU5GKSBDKE4sTikKLQkgIEMoSU5GLC1JTkYpIEMoVSxVKSAgICAgQyhVLFUpICAgICBDKFUsVSkgICAgQyhVLFUpICAgIEMoSU5GLElORikgQyhOLE4pCi0JICBDKElORiwtSU5GKSBDKElORiwtMC4pIEMoSU5GLC0wLikgQyhJTkYsMC4pIEMoSU5GLDAuKSBDKElORixJTkYpIEMoSU5GLE4pCi0JICBDKElORiwtSU5GKSBDKE4sTikgICAgIEMoTixOKSAgICAgQyhOLE4pICAgIEMoTixOKSAgICBDKElORixJTkYpIEMoTixOKQotCX0pCisgICAgSU5JVF9TUEVDSUFMX1ZBTFVFUyhzcXJ0X3NwZWNpYWxfdmFsdWVzLCB7CisgICAgICBDKElORiwtSU5GKSBDKDAuLC1JTkYpIEMoMC4sLUlORikgQygwLixJTkYpIEMoMC4sSU5GKSBDKElORixJTkYpIEMoTixJTkYpCisgICAgICBDKElORiwtSU5GKSBDKFUsVSkgICAgIEMoVSxVKSAgICAgQyhVLFUpICAgIEMoVSxVKSAgICBDKElORixJTkYpIEMoTixOKQorICAgICAgQyhJTkYsLUlORikgQyhVLFUpICAgICBDKDAuLC0wLikgIEMoMC4sMC4pICBDKFUsVSkgICAgQyhJTkYsSU5GKSBDKE4sTikKKyAgICAgIEMoSU5GLC1JTkYpIEMoVSxVKSAgICAgQygwLiwtMC4pICBDKDAuLDAuKSAgQyhVLFUpICAgIEMoSU5GLElORikgQyhOLE4pCisgICAgICBDKElORiwtSU5GKSBDKFUsVSkgICAgIEMoVSxVKSAgICAgQyhVLFUpICAgIEMoVSxVKSAgICBDKElORixJTkYpIEMoTixOKQorICAgICAgQyhJTkYsLUlORikgQyhJTkYsLTAuKSBDKElORiwtMC4pIEMoSU5GLDAuKSBDKElORiwwLikgQyhJTkYsSU5GKSBDKElORixOKQorICAgICAgQyhJTkYsLUlORikgQyhOLE4pICAgICBDKE4sTikgICAgIEMoTixOKSAgICBDKE4sTikgICAgQyhJTkYsSU5GKSBDKE4sTikKKyAgICB9KQogCi0JSU5JVF9TUEVDSUFMX1ZBTFVFUyh0YW5oX3NwZWNpYWxfdmFsdWVzLCB7Ci0JICBDKC0xLiwwLikgQyhVLFUpIEMoLTEuLC0wLikgQygtMS4sMC4pIEMoVSxVKSBDKC0xLiwwLikgQygtMS4sMC4pCi0JICBDKE4sTikgICAgQyhVLFUpIEMoVSxVKSAgICAgQyhVLFUpICAgIEMoVSxVKSBDKE4sTikgICAgQyhOLE4pCi0JICBDKE4sTikgICAgQyhVLFUpIEMoLTAuLC0wLikgQygtMC4sMC4pIEMoVSxVKSBDKE4sTikgICAgQyhOLE4pCi0JICBDKE4sTikgICAgQyhVLFUpIEMoMC4sLTAuKSAgQygwLiwwLikgIEMoVSxVKSBDKE4sTikgICAgQyhOLE4pCi0JICBDKE4sTikgICAgQyhVLFUpIEMoVSxVKSAgICAgQyhVLFUpICAgIEMoVSxVKSBDKE4sTikgICAgQyhOLE4pCi0JICBDKDEuLDAuKSAgQyhVLFUpIEMoMS4sLTAuKSAgQygxLiwwLikgIEMoVSxVKSBDKDEuLDAuKSAgQygxLiwwLikKLQkgIEMoTixOKSAgICBDKE4sTikgQyhOLC0wLikgICBDKE4sMC4pICAgQyhOLE4pIEMoTixOKSAgICBDKE4sTikKLQl9KQorICAgIElOSVRfU1BFQ0lBTF9WQUxVRVModGFuaF9zcGVjaWFsX3ZhbHVlcywgeworICAgICAgQygtMS4sMC4pIEMoVSxVKSBDKC0xLiwtMC4pIEMoLTEuLDAuKSBDKFUsVSkgQygtMS4sMC4pIEMoLTEuLDAuKQorICAgICAgQyhOLE4pICAgIEMoVSxVKSBDKFUsVSkgICAgIEMoVSxVKSAgICBDKFUsVSkgQyhOLE4pICAgIEMoTixOKQorICAgICAgQyhOLE4pICAgIEMoVSxVKSBDKC0wLiwtMC4pIEMoLTAuLDAuKSBDKFUsVSkgQyhOLE4pICAgIEMoTixOKQorICAgICAgQyhOLE4pICAgIEMoVSxVKSBDKDAuLC0wLikgIEMoMC4sMC4pICBDKFUsVSkgQyhOLE4pICAgIEMoTixOKQorICAgICAgQyhOLE4pICAgIEMoVSxVKSBDKFUsVSkgICAgIEMoVSxVKSAgICBDKFUsVSkgQyhOLE4pICAgIEMoTixOKQorICAgICAgQygxLiwwLikgIEMoVSxVKSBDKDEuLC0wLikgIEMoMS4sMC4pICBDKFUsVSkgQygxLiwwLikgIEMoMS4sMC4pCisgICAgICBDKE4sTikgICAgQyhOLE4pIEMoTiwtMC4pICAgQyhOLDAuKSAgIEMoTixOKSBDKE4sTikgICAgQyhOLE4pCisgICAgfSkKIAotCUlOSVRfU1BFQ0lBTF9WQUxVRVMocmVjdF9zcGVjaWFsX3ZhbHVlcywgewotCSAgQyhJTkYsTikgQyhVLFUpIEMoLUlORiwwLikgQygtSU5GLC0wLikgQyhVLFUpIEMoSU5GLE4pIEMoSU5GLE4pCi0JICBDKE4sTikgICBDKFUsVSkgQyhVLFUpICAgICBDKFUsVSkgICAgICBDKFUsVSkgQyhOLE4pICAgQyhOLE4pCi0JICBDKDAuLDAuKSBDKFUsVSkgQygtMC4sMC4pICBDKC0wLiwtMC4pICBDKFUsVSkgQygwLiwwLikgQygwLiwwLikKLQkgIEMoMC4sMC4pIEMoVSxVKSBDKDAuLC0wLikgIEMoMC4sMC4pICAgIEMoVSxVKSBDKDAuLDAuKSBDKDAuLDAuKQotCSAgQyhOLE4pICAgQyhVLFUpIEMoVSxVKSAgICAgQyhVLFUpICAgICAgQyhVLFUpIEMoTixOKSAgIEMoTixOKQotCSAgQyhJTkYsTikgQyhVLFUpIEMoSU5GLC0wLikgQyhJTkYsMC4pICAgQyhVLFUpIEMoSU5GLE4pIEMoSU5GLE4pCi0JICBDKE4sTikgICBDKE4sTikgQyhOLDAuKSAgICBDKE4sMC4pICAgICBDKE4sTikgQyhOLE4pICAgQyhOLE4pCi0JfSkKKyAgICBJTklUX1NQRUNJQUxfVkFMVUVTKHJlY3Rfc3BlY2lhbF92YWx1ZXMsIHsKKyAgICAgIEMoSU5GLE4pIEMoVSxVKSBDKC1JTkYsMC4pIEMoLUlORiwtMC4pIEMoVSxVKSBDKElORixOKSBDKElORixOKQorICAgICAgQyhOLE4pICAgQyhVLFUpIEMoVSxVKSAgICAgQyhVLFUpICAgICAgQyhVLFUpIEMoTixOKSAgIEMoTixOKQorICAgICAgQygwLiwwLikgQyhVLFUpIEMoLTAuLDAuKSAgQygtMC4sLTAuKSAgQyhVLFUpIEMoMC4sMC4pIEMoMC4sMC4pCisgICAgICBDKDAuLDAuKSBDKFUsVSkgQygwLiwtMC4pICBDKDAuLDAuKSAgICBDKFUsVSkgQygwLiwwLikgQygwLiwwLikKKyAgICAgIEMoTixOKSAgIEMoVSxVKSBDKFUsVSkgICAgIEMoVSxVKSAgICAgIEMoVSxVKSBDKE4sTikgICBDKE4sTikKKyAgICAgIEMoSU5GLE4pIEMoVSxVKSBDKElORiwtMC4pIEMoSU5GLDAuKSAgIEMoVSxVKSBDKElORixOKSBDKElORixOKQorICAgICAgQyhOLE4pICAgQyhOLE4pIEMoTiwwLikgICAgQyhOLDAuKSAgICAgQyhOLE4pIEMoTixOKSAgIEMoTixOKQorICAgIH0pCiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL2NyeXB0bW9kdWxlLmMgYi9Nb2R1bGVzL2NyeXB0bW9kdWxlLmMKaW5kZXggNjM3N2Y4NC4uNzZkZTU0ZiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9jcnlwdG1vZHVsZS5jCisrKyBiL01vZHVsZXMvY3J5cHRtb2R1bGUuYwpAQCAtMTQsMTcgKzE0LDE3IEBACiAKIHN0YXRpYyBQeU9iamVjdCAqY3J5cHRfY3J5cHQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKndvcmQsICpzYWx0OyAKKyAgICBjaGFyICp3b3JkLCAqc2FsdDsKICNpZm5kZWYgX19WTVMKLQlleHRlcm4gY2hhciAqIGNyeXB0KGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKKyAgICBleHRlcm4gY2hhciAqIGNyeXB0KGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKICNlbmRpZgogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzczpjcnlwdCIsICZ3b3JkLCAmc2FsdCkpIHsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCS8qIE9uIHNvbWUgcGxhdGZvcm1zIChBdGhlT1MpIGNyeXB0IHJldHVybnMgTlVMTCBmb3IgYW4gaW52YWxpZAotCSAgIHNhbHQuIFJldHVybiBOb25lIGluIHRoYXQgY2FzZS4gWFhYIE1heWJlIHJhaXNlIGFuIGV4Y2VwdGlvbj8gICovCi0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoInMiLCBjcnlwdCh3b3JkLCBzYWx0KSk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzczpjcnlwdCIsICZ3b3JkLCAmc2FsdCkpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIC8qIE9uIHNvbWUgcGxhdGZvcm1zIChBdGhlT1MpIGNyeXB0IHJldHVybnMgTlVMTCBmb3IgYW4gaW52YWxpZAorICAgICAgIHNhbHQuIFJldHVybiBOb25lIGluIHRoYXQgY2FzZS4gWFhYIE1heWJlIHJhaXNlIGFuIGV4Y2VwdGlvbj8gICovCisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoInMiLCBjcnlwdCh3b3JkLCBzYWx0KSk7CiAKIH0KIApAQCAtMzgsMTIgKzM4LDEyIEBACiAKIAogc3RhdGljIFB5TWV0aG9kRGVmIGNyeXB0X21ldGhvZHNbXSA9IHsKLQl7ImNyeXB0IiwJY3J5cHRfY3J5cHQsIE1FVEhfVkFSQVJHUywgY3J5cHRfY3J5cHRfX2RvY19ffSwKLQl7TlVMTCwJCU5VTEx9CQkvKiBzZW50aW5lbCAqLworICAgIHsiY3J5cHQiLCAgICAgICAgICAgY3J5cHRfY3J5cHQsIE1FVEhfVkFSQVJHUywgY3J5cHRfY3J5cHRfX2RvY19ffSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogUHlNT0RJTklUX0ZVTkMKIGluaXRjcnlwdCh2b2lkKQogewotCVB5X0luaXRNb2R1bGUoImNyeXB0IiwgY3J5cHRfbWV0aG9kcyk7CisgICAgUHlfSW5pdE1vZHVsZSgiY3J5cHQiLCBjcnlwdF9tZXRob2RzKTsKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvZGF0ZXRpbWVtb2R1bGUuYyBiL01vZHVsZXMvZGF0ZXRpbWVtb2R1bGUuYwppbmRleCBlZTU1OGNlLi5lY2NlNTJkIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2RhdGV0aW1lbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9kYXRldGltZW1vZHVsZS5jCkBAIC0yNyw3ICsyNyw3IEBACiAgKiBmaW5hbCByZXN1bHQgZml0cyBpbiBhIEMgaW50ICh0aGlzIGNhbiBiZSBhbiBpc3N1ZSBvbiA2NC1iaXQgYm94ZXMpLgogICovCiAjaWYgU0laRU9GX0lOVCA8IDQKLSMJZXJyb3IgImRhdGV0aW1lLmMgcmVxdWlyZXMgdGhhdCBDIGludCBoYXZlIGF0IGxlYXN0IDMyIGJpdHMiCisjICAgICAgIGVycm9yICJkYXRldGltZS5jIHJlcXVpcmVzIHRoYXQgQyBpbnQgaGF2ZSBhdCBsZWFzdCAzMiBiaXRzIgogI2VuZGlmCiAKICNkZWZpbmUgTUlOWUVBUiAxCkBAIC00MSw1OSArNDEsNTkgQEAKICNkZWZpbmUgTUFYX0RFTFRBX0RBWVMgOTk5OTk5OTk5CiAKIC8qIFJlbmFtZSB0aGUgbG9uZyBtYWNyb3MgaW4gZGF0ZXRpbWUuaCB0byBtb3JlIHJlYXNvbmFibGUgc2hvcnQgbmFtZXMuICovCi0jZGVmaW5lIEdFVF9ZRUFSCQlQeURhdGVUaW1lX0dFVF9ZRUFSCi0jZGVmaW5lIEdFVF9NT05USAkJUHlEYXRlVGltZV9HRVRfTU9OVEgKLSNkZWZpbmUgR0VUX0RBWQkJCVB5RGF0ZVRpbWVfR0VUX0RBWQotI2RlZmluZSBEQVRFX0dFVF9IT1VSCQlQeURhdGVUaW1lX0RBVEVfR0VUX0hPVVIKLSNkZWZpbmUgREFURV9HRVRfTUlOVVRFCQlQeURhdGVUaW1lX0RBVEVfR0VUX01JTlVURQotI2RlZmluZSBEQVRFX0dFVF9TRUNPTkQJCVB5RGF0ZVRpbWVfREFURV9HRVRfU0VDT05ECi0jZGVmaW5lIERBVEVfR0VUX01JQ1JPU0VDT05ECVB5RGF0ZVRpbWVfREFURV9HRVRfTUlDUk9TRUNPTkQKKyNkZWZpbmUgR0VUX1lFQVIgICAgICAgICAgICAgICAgUHlEYXRlVGltZV9HRVRfWUVBUgorI2RlZmluZSBHRVRfTU9OVEggICAgICAgICAgICAgICBQeURhdGVUaW1lX0dFVF9NT05USAorI2RlZmluZSBHRVRfREFZICAgICAgICAgICAgICAgICBQeURhdGVUaW1lX0dFVF9EQVkKKyNkZWZpbmUgREFURV9HRVRfSE9VUiAgICAgICAgICAgUHlEYXRlVGltZV9EQVRFX0dFVF9IT1VSCisjZGVmaW5lIERBVEVfR0VUX01JTlVURSAgICAgICAgIFB5RGF0ZVRpbWVfREFURV9HRVRfTUlOVVRFCisjZGVmaW5lIERBVEVfR0VUX1NFQ09ORCAgICAgICAgIFB5RGF0ZVRpbWVfREFURV9HRVRfU0VDT05ECisjZGVmaW5lIERBVEVfR0VUX01JQ1JPU0VDT05EICAgIFB5RGF0ZVRpbWVfREFURV9HRVRfTUlDUk9TRUNPTkQKIAogLyogRGF0ZSBhY2Nlc3NvcnMgZm9yIGRhdGUgYW5kIGRhdGV0aW1lLiAqLwotI2RlZmluZSBTRVRfWUVBUihvLCB2KQkJKCgobyktPmRhdGFbMF0gPSAoKHYpICYgMHhmZjAwKSA+PiA4KSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChvKS0+ZGF0YVsxXSA9ICgodikgJiAweDAwZmYpKSkKLSNkZWZpbmUgU0VUX01PTlRIKG8sIHYpCQkoUHlEYXRlVGltZV9HRVRfTU9OVEgobykgPSAodikpCi0jZGVmaW5lIFNFVF9EQVkobywgdikJCShQeURhdGVUaW1lX0dFVF9EQVkobykgPSAodikpCisjZGVmaW5lIFNFVF9ZRUFSKG8sIHYpICAgICAgICAgICgoKG8pLT5kYXRhWzBdID0gKCh2KSAmIDB4ZmYwMCkgPj4gOCksIFwKKyAgICAgICAgICAgICAgICAgKChvKS0+ZGF0YVsxXSA9ICgodikgJiAweDAwZmYpKSkKKyNkZWZpbmUgU0VUX01PTlRIKG8sIHYpICAgICAgICAgKFB5RGF0ZVRpbWVfR0VUX01PTlRIKG8pID0gKHYpKQorI2RlZmluZSBTRVRfREFZKG8sIHYpICAgICAgICAgICAoUHlEYXRlVGltZV9HRVRfREFZKG8pID0gKHYpKQogCiAvKiBEYXRlL1RpbWUgYWNjZXNzb3JzIGZvciBkYXRldGltZS4gKi8KLSNkZWZpbmUgREFURV9TRVRfSE9VUihvLCB2KQkoUHlEYXRlVGltZV9EQVRFX0dFVF9IT1VSKG8pID0gKHYpKQotI2RlZmluZSBEQVRFX1NFVF9NSU5VVEUobywgdikJKFB5RGF0ZVRpbWVfREFURV9HRVRfTUlOVVRFKG8pID0gKHYpKQotI2RlZmluZSBEQVRFX1NFVF9TRUNPTkQobywgdikJKFB5RGF0ZVRpbWVfREFURV9HRVRfU0VDT05EKG8pID0gKHYpKQotI2RlZmluZSBEQVRFX1NFVF9NSUNST1NFQ09ORChvLCB2KQlcCi0JKCgobyktPmRhdGFbN10gPSAoKHYpICYgMHhmZjAwMDApID4+IDE2KSwgXAotICAgICAgICAgKChvKS0+ZGF0YVs4XSA9ICgodikgJiAweDAwZmYwMCkgPj4gOCksIFwKLSAgICAgICAgICgobyktPmRhdGFbOV0gPSAoKHYpICYgMHgwMDAwZmYpKSkKKyNkZWZpbmUgREFURV9TRVRfSE9VUihvLCB2KSAgICAgKFB5RGF0ZVRpbWVfREFURV9HRVRfSE9VUihvKSA9ICh2KSkKKyNkZWZpbmUgREFURV9TRVRfTUlOVVRFKG8sIHYpICAgKFB5RGF0ZVRpbWVfREFURV9HRVRfTUlOVVRFKG8pID0gKHYpKQorI2RlZmluZSBEQVRFX1NFVF9TRUNPTkQobywgdikgICAoUHlEYXRlVGltZV9EQVRFX0dFVF9TRUNPTkQobykgPSAodikpCisjZGVmaW5lIERBVEVfU0VUX01JQ1JPU0VDT05EKG8sIHYpICAgICAgXAorICAgICgoKG8pLT5kYXRhWzddID0gKCh2KSAmIDB4ZmYwMDAwKSA+PiAxNiksIFwKKyAgICAgKChvKS0+ZGF0YVs4XSA9ICgodikgJiAweDAwZmYwMCkgPj4gOCksIFwKKyAgICAgKChvKS0+ZGF0YVs5XSA9ICgodikgJiAweDAwMDBmZikpKQogCiAvKiBUaW1lIGFjY2Vzc29ycyBmb3IgdGltZS4gKi8KLSNkZWZpbmUgVElNRV9HRVRfSE9VUgkJUHlEYXRlVGltZV9USU1FX0dFVF9IT1VSCi0jZGVmaW5lIFRJTUVfR0VUX01JTlVURQkJUHlEYXRlVGltZV9USU1FX0dFVF9NSU5VVEUKLSNkZWZpbmUgVElNRV9HRVRfU0VDT05ECQlQeURhdGVUaW1lX1RJTUVfR0VUX1NFQ09ORAotI2RlZmluZSBUSU1FX0dFVF9NSUNST1NFQ09ORAlQeURhdGVUaW1lX1RJTUVfR0VUX01JQ1JPU0VDT05ECi0jZGVmaW5lIFRJTUVfU0VUX0hPVVIobywgdikJKFB5RGF0ZVRpbWVfVElNRV9HRVRfSE9VUihvKSA9ICh2KSkKLSNkZWZpbmUgVElNRV9TRVRfTUlOVVRFKG8sIHYpCShQeURhdGVUaW1lX1RJTUVfR0VUX01JTlVURShvKSA9ICh2KSkKLSNkZWZpbmUgVElNRV9TRVRfU0VDT05EKG8sIHYpCShQeURhdGVUaW1lX1RJTUVfR0VUX1NFQ09ORChvKSA9ICh2KSkKLSNkZWZpbmUgVElNRV9TRVRfTUlDUk9TRUNPTkQobywgdikJXAotCSgoKG8pLT5kYXRhWzNdID0gKCh2KSAmIDB4ZmYwMDAwKSA+PiAxNiksIFwKLSAgICAgICAgICgobyktPmRhdGFbNF0gPSAoKHYpICYgMHgwMGZmMDApID4+IDgpLCBcCi0gICAgICAgICAoKG8pLT5kYXRhWzVdID0gKCh2KSAmIDB4MDAwMGZmKSkpCisjZGVmaW5lIFRJTUVfR0VUX0hPVVIgICAgICAgICAgIFB5RGF0ZVRpbWVfVElNRV9HRVRfSE9VUgorI2RlZmluZSBUSU1FX0dFVF9NSU5VVEUgICAgICAgICBQeURhdGVUaW1lX1RJTUVfR0VUX01JTlVURQorI2RlZmluZSBUSU1FX0dFVF9TRUNPTkQgICAgICAgICBQeURhdGVUaW1lX1RJTUVfR0VUX1NFQ09ORAorI2RlZmluZSBUSU1FX0dFVF9NSUNST1NFQ09ORCAgICBQeURhdGVUaW1lX1RJTUVfR0VUX01JQ1JPU0VDT05ECisjZGVmaW5lIFRJTUVfU0VUX0hPVVIobywgdikgICAgIChQeURhdGVUaW1lX1RJTUVfR0VUX0hPVVIobykgPSAodikpCisjZGVmaW5lIFRJTUVfU0VUX01JTlVURShvLCB2KSAgIChQeURhdGVUaW1lX1RJTUVfR0VUX01JTlVURShvKSA9ICh2KSkKKyNkZWZpbmUgVElNRV9TRVRfU0VDT05EKG8sIHYpICAgKFB5RGF0ZVRpbWVfVElNRV9HRVRfU0VDT05EKG8pID0gKHYpKQorI2RlZmluZSBUSU1FX1NFVF9NSUNST1NFQ09ORChvLCB2KSAgICAgIFwKKyAgICAoKChvKS0+ZGF0YVszXSA9ICgodikgJiAweGZmMDAwMCkgPj4gMTYpLCBcCisgICAgICgobyktPmRhdGFbNF0gPSAoKHYpICYgMHgwMGZmMDApID4+IDgpLCBcCisgICAgICgobyktPmRhdGFbNV0gPSAoKHYpICYgMHgwMDAwZmYpKSkKIAogLyogRGVsdGEgYWNjZXNzb3JzIGZvciB0aW1lZGVsdGEuICovCi0jZGVmaW5lIEdFVF9URF9EQVlTKG8pCQkoKChQeURhdGVUaW1lX0RlbHRhICopKG8pKS0+ZGF5cykKLSNkZWZpbmUgR0VUX1REX1NFQ09ORFMobykJKCgoUHlEYXRlVGltZV9EZWx0YSAqKShvKSktPnNlY29uZHMpCi0jZGVmaW5lIEdFVF9URF9NSUNST1NFQ09ORFMobykJKCgoUHlEYXRlVGltZV9EZWx0YSAqKShvKSktPm1pY3Jvc2Vjb25kcykKKyNkZWZpbmUgR0VUX1REX0RBWVMobykgICAgICAgICAgKCgoUHlEYXRlVGltZV9EZWx0YSAqKShvKSktPmRheXMpCisjZGVmaW5lIEdFVF9URF9TRUNPTkRTKG8pICAgICAgICgoKFB5RGF0ZVRpbWVfRGVsdGEgKikobykpLT5zZWNvbmRzKQorI2RlZmluZSBHRVRfVERfTUlDUk9TRUNPTkRTKG8pICAoKChQeURhdGVUaW1lX0RlbHRhICopKG8pKS0+bWljcm9zZWNvbmRzKQogCi0jZGVmaW5lIFNFVF9URF9EQVlTKG8sIHYpCSgobyktPmRheXMgPSAodikpCi0jZGVmaW5lIFNFVF9URF9TRUNPTkRTKG8sIHYpCSgobyktPnNlY29uZHMgPSAodikpCisjZGVmaW5lIFNFVF9URF9EQVlTKG8sIHYpICAgICAgICgobyktPmRheXMgPSAodikpCisjZGVmaW5lIFNFVF9URF9TRUNPTkRTKG8sIHYpICAgICgobyktPnNlY29uZHMgPSAodikpCiAjZGVmaW5lIFNFVF9URF9NSUNST1NFQ09ORFMobywgdikgKChvKS0+bWljcm9zZWNvbmRzID0gKHYpKQogCiAvKiBwIGlzIGEgcG9pbnRlciB0byBhIHRpbWUgb3IgYSBkYXRldGltZSBvYmplY3Q7IEhBU1RaSU5GTyhwKSByZXR1cm5zCiAgKiBwLT5oYXN0emluZm8uCiAgKi8KLSNkZWZpbmUgSEFTVFpJTkZPKHApCQkoKChfUHlEYXRlVGltZV9CYXNlVFpJbmZvICopKHApKS0+aGFzdHppbmZvKQorI2RlZmluZSBIQVNUWklORk8ocCkgICAgICAgICAgICAoKChfUHlEYXRlVGltZV9CYXNlVFpJbmZvICopKHApKS0+aGFzdHppbmZvKQogCiAvKiBNIGlzIGEgY2hhciBvciBpbnQgY2xhaW1pbmcgdG8gYmUgYSB2YWxpZCBtb250aC4gIFRoZSBtYWNybyBpcyBlcXVpdmFsZW50CiAgKiB0byB0aGUgdHdvLXNpZGVkIFB5dGhvbiB0ZXN0Ci0gKgkxIDw9IE0gPD0gMTIKKyAqICAgICAgMSA8PSBNIDw9IDEyCiAgKi8KICNkZWZpbmUgTU9OVEhfSVNfU0FORShNKSAoKHVuc2lnbmVkIGludCkoTSkgLSAxIDwgMTIpCiAKQEAgLTExMyw3ICsxMTMsNyBAQAogICogaWZmIChrXmkpJihrXmopIGhhcyBzaWduIGJpdCBzZXQuCiAgKi8KICNkZWZpbmUgU0lHTkVEX0FERF9PVkVSRkxPV0VEKFJFU1VMVCwgSSwgSikgXAotCSgoKChSRVNVTFQpIF4gKEkpKSAmICgoUkVTVUxUKSBeIChKKSkpIDwgMCkKKyAgICAoKCgoUkVTVUxUKSBeIChJKSkgJiAoKFJFU1VMVCkgXiAoSikpKSA8IDApCiAKIC8qIENvbXB1dGUgUHl0aG9uIGRpdm1vZCh4LCB5KSwgcmV0dXJuaW5nIHRoZSBxdW90aWVudCBhbmQgc3RvcmluZyB0aGUKICAqIHJlbWFpbmRlciBpbnRvICpyLiAgVGhlIHF1b3RpZW50IGlzIHRoZSBmbG9vciBvZiB4L3ksIGFuZCB0aGF0J3MKQEAgLTEyNywxNyArMTI3LDE3IEBACiBzdGF0aWMgaW50CiBkaXZtb2QoaW50IHgsIGludCB5LCBpbnQgKnIpCiB7Ci0JaW50IHF1bzsKKyAgICBpbnQgcXVvOwogCi0JYXNzZXJ0KHkgPiAwKTsKLQlxdW8gPSB4IC8geTsKLQkqciA9IHggLSBxdW8gKiB5OwotCWlmICgqciA8IDApIHsKLQkJLS1xdW87Ci0JCSpyICs9IHk7Ci0JfQotCWFzc2VydCgwIDw9ICpyICYmICpyIDwgeSk7Ci0JcmV0dXJuIHF1bzsKKyAgICBhc3NlcnQoeSA+IDApOworICAgIHF1byA9IHggLyB5OworICAgICpyID0geCAtIHF1byAqIHk7CisgICAgaWYgKCpyIDwgMCkgeworICAgICAgICAtLXF1bzsKKyAgICAgICAgKnIgKz0geTsKKyAgICB9CisgICAgYXNzZXJ0KDAgPD0gKnIgJiYgKnIgPCB5KTsKKyAgICByZXR1cm4gcXVvOwogfQogCiAvKiBSb3VuZCBhIGRvdWJsZSB0byB0aGUgbmVhcmVzdCBsb25nLiAgfHh8IG11c3QgYmUgc21hbGwgZW5vdWdoIHRvIGZpdApAQCAtMTQ2LDExICsxNDYsMTEgQEAKIHN0YXRpYyBsb25nCiByb3VuZF90b19sb25nKGRvdWJsZSB4KQogewotCWlmICh4ID49IDAuMCkKLQkJeCA9IGZsb29yKHggKyAwLjUpOwotCWVsc2UKLQkJeCA9IGNlaWwoeCAtIDAuNSk7Ci0JcmV0dXJuIChsb25nKXg7CisgICAgaWYgKHggPj0gMC4wKQorICAgICAgICB4ID0gZmxvb3IoeCArIDAuNSk7CisgICAgZWxzZQorICAgICAgICB4ID0gY2VpbCh4IC0gMC41KTsKKyAgICByZXR1cm4gKGxvbmcpeDsKIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0xNjIsNTIgKzE2Miw1MiBAQAogICogYXJlIGNvcnJlY3QgZm9yIG5vbi1sZWFwIHllYXJzIG9ubHkuCiAgKi8KIHN0YXRpYyBpbnQgX2RheXNfaW5fbW9udGhbXSA9IHsKLQkwLCAvKiB1bnVzZWQ7IHRoaXMgdmVjdG9yIHVzZXMgMS1iYXNlZCBpbmRleGluZyAqLwotCTMxLCAyOCwgMzEsIDMwLCAzMSwgMzAsIDMxLCAzMSwgMzAsIDMxLCAzMCwgMzEKKyAgICAwLCAvKiB1bnVzZWQ7IHRoaXMgdmVjdG9yIHVzZXMgMS1iYXNlZCBpbmRleGluZyAqLworICAgIDMxLCAyOCwgMzEsIDMwLCAzMSwgMzAsIDMxLCAzMSwgMzAsIDMxLCAzMCwgMzEKIH07CiAKIHN0YXRpYyBpbnQgX2RheXNfYmVmb3JlX21vbnRoW10gPSB7Ci0JMCwgLyogdW51c2VkOyB0aGlzIHZlY3RvciB1c2VzIDEtYmFzZWQgaW5kZXhpbmcgKi8KLQkwLCAzMSwgNTksIDkwLCAxMjAsIDE1MSwgMTgxLCAyMTIsIDI0MywgMjczLCAzMDQsIDMzNAorICAgIDAsIC8qIHVudXNlZDsgdGhpcyB2ZWN0b3IgdXNlcyAxLWJhc2VkIGluZGV4aW5nICovCisgICAgMCwgMzEsIDU5LCA5MCwgMTIwLCAxNTEsIDE4MSwgMjEyLCAyNDMsIDI3MywgMzA0LCAzMzQKIH07CiAKIC8qIHllYXIgLT4gMSBpZiBsZWFwIHllYXIsIGVsc2UgMC4gKi8KIHN0YXRpYyBpbnQKIGlzX2xlYXAoaW50IHllYXIpCiB7Ci0JLyogQ2FzdCB5ZWFyIHRvIHVuc2lnbmVkLiAgVGhlIHJlc3VsdCBpcyB0aGUgc2FtZSBlaXRoZXIgd2F5LCBidXQKLQkgKiBDIGNhbiBnZW5lcmF0ZSBmYXN0ZXIgY29kZSBmb3IgdW5zaWduZWQgbW9kIHRoYW4gZm9yIHNpZ25lZAotCSAqIG1vZCAoZXNwZWNpYWxseSBmb3IgJSA0IC0tIGEgZ29vZCBjb21waWxlciBzaG91bGQganVzdCBncmFiCi0JICogdGhlIGxhc3QgMiBiaXRzIHdoZW4gdGhlIExIUyBpcyB1bnNpZ25lZCkuCi0JICovCi0JY29uc3QgdW5zaWduZWQgaW50IGF5ZWFyID0gKHVuc2lnbmVkIGludCl5ZWFyOwotCXJldHVybiBheWVhciAlIDQgPT0gMCAmJiAoYXllYXIgJSAxMDAgIT0gMCB8fCBheWVhciAlIDQwMCA9PSAwKTsKKyAgICAvKiBDYXN0IHllYXIgdG8gdW5zaWduZWQuICBUaGUgcmVzdWx0IGlzIHRoZSBzYW1lIGVpdGhlciB3YXksIGJ1dAorICAgICAqIEMgY2FuIGdlbmVyYXRlIGZhc3RlciBjb2RlIGZvciB1bnNpZ25lZCBtb2QgdGhhbiBmb3Igc2lnbmVkCisgICAgICogbW9kIChlc3BlY2lhbGx5IGZvciAlIDQgLS0gYSBnb29kIGNvbXBpbGVyIHNob3VsZCBqdXN0IGdyYWIKKyAgICAgKiB0aGUgbGFzdCAyIGJpdHMgd2hlbiB0aGUgTEhTIGlzIHVuc2lnbmVkKS4KKyAgICAgKi8KKyAgICBjb25zdCB1bnNpZ25lZCBpbnQgYXllYXIgPSAodW5zaWduZWQgaW50KXllYXI7CisgICAgcmV0dXJuIGF5ZWFyICUgNCA9PSAwICYmIChheWVhciAlIDEwMCAhPSAwIHx8IGF5ZWFyICUgNDAwID09IDApOwogfQogCiAvKiB5ZWFyLCBtb250aCAtPiBudW1iZXIgb2YgZGF5cyBpbiB0aGF0IG1vbnRoIGluIHRoYXQgeWVhciAqLwogc3RhdGljIGludAogZGF5c19pbl9tb250aChpbnQgeWVhciwgaW50IG1vbnRoKQogewotCWFzc2VydChtb250aCA+PSAxKTsKLQlhc3NlcnQobW9udGggPD0gMTIpOwotCWlmIChtb250aCA9PSAyICYmIGlzX2xlYXAoeWVhcikpCi0JCXJldHVybiAyOTsKLQllbHNlCi0JCXJldHVybiBfZGF5c19pbl9tb250aFttb250aF07CisgICAgYXNzZXJ0KG1vbnRoID49IDEpOworICAgIGFzc2VydChtb250aCA8PSAxMik7CisgICAgaWYgKG1vbnRoID09IDIgJiYgaXNfbGVhcCh5ZWFyKSkKKyAgICAgICAgcmV0dXJuIDI5OworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIF9kYXlzX2luX21vbnRoW21vbnRoXTsKIH0KIAogLyogeWVhciwgbW9udGggLT4gbnVtYmVyIG9mIGRheXMgaW4geWVhciBwcmVjZWVkaW5nIGZpcnN0IGRheSBvZiBtb250aCAqLwogc3RhdGljIGludAogZGF5c19iZWZvcmVfbW9udGgoaW50IHllYXIsIGludCBtb250aCkKIHsKLQlpbnQgZGF5czsKKyAgICBpbnQgZGF5czsKIAotCWFzc2VydChtb250aCA+PSAxKTsKLQlhc3NlcnQobW9udGggPD0gMTIpOwotCWRheXMgPSBfZGF5c19iZWZvcmVfbW9udGhbbW9udGhdOwotCWlmIChtb250aCA+IDIgJiYgaXNfbGVhcCh5ZWFyKSkKLQkJKytkYXlzOwotCXJldHVybiBkYXlzOworICAgIGFzc2VydChtb250aCA+PSAxKTsKKyAgICBhc3NlcnQobW9udGggPD0gMTIpOworICAgIGRheXMgPSBfZGF5c19iZWZvcmVfbW9udGhbbW9udGhdOworICAgIGlmIChtb250aCA+IDIgJiYgaXNfbGVhcCh5ZWFyKSkKKyAgICAgICAgKytkYXlzOworICAgIHJldHVybiBkYXlzOwogfQogCiAvKiB5ZWFyIC0+IG51bWJlciBvZiBkYXlzIGJlZm9yZSBKYW51YXJ5IDFzdCBvZiB5ZWFyLiAgUmVtZW1iZXIgdGhhdCB3ZQpAQCAtMjE2LDEyNCArMjE2LDEyNCBAQAogc3RhdGljIGludAogZGF5c19iZWZvcmVfeWVhcihpbnQgeWVhcikKIHsKLQlpbnQgeSA9IHllYXIgLSAxOwotCS8qIFRoaXMgaXMgaW5jb3JyZWN0IGlmIHllYXIgPD0gMDsgd2UgcmVhbGx5IHdhbnQgdGhlIGZsb29yCi0JICogaGVyZS4gIEJ1dCBzbyBsb25nIGFzIE1JTllFQVIgaXMgMSwgdGhlIHNtYWxsZXN0IHllYXIgdGhpcwotCSAqIGNhbiBzZWUgaXMgMCAodGhpcyBjYW4gaGFwcGVuIGluIHNvbWUgbm9ybWFsaXphdGlvbiBlbmRjYXNlcyksCi0JICogc28gd2UnbGwganVzdCBzcGVjaWFsLWNhc2UgdGhhdC4KLQkgKi8KLQlhc3NlcnQgKHllYXIgPj0gMCk7Ci0JaWYgKHkgPj0gMCkKLQkJcmV0dXJuIHkqMzY1ICsgeS80IC0geS8xMDAgKyB5LzQwMDsKLQllbHNlIHsKLQkJYXNzZXJ0KHkgPT0gLTEpOwotCQlyZXR1cm4gLTM2NjsKLQl9CisgICAgaW50IHkgPSB5ZWFyIC0gMTsKKyAgICAvKiBUaGlzIGlzIGluY29ycmVjdCBpZiB5ZWFyIDw9IDA7IHdlIHJlYWxseSB3YW50IHRoZSBmbG9vcgorICAgICAqIGhlcmUuICBCdXQgc28gbG9uZyBhcyBNSU5ZRUFSIGlzIDEsIHRoZSBzbWFsbGVzdCB5ZWFyIHRoaXMKKyAgICAgKiBjYW4gc2VlIGlzIDAgKHRoaXMgY2FuIGhhcHBlbiBpbiBzb21lIG5vcm1hbGl6YXRpb24gZW5kY2FzZXMpLAorICAgICAqIHNvIHdlJ2xsIGp1c3Qgc3BlY2lhbC1jYXNlIHRoYXQuCisgICAgICovCisgICAgYXNzZXJ0ICh5ZWFyID49IDApOworICAgIGlmICh5ID49IDApCisgICAgICAgIHJldHVybiB5KjM2NSArIHkvNCAtIHkvMTAwICsgeS80MDA7CisgICAgZWxzZSB7CisgICAgICAgIGFzc2VydCh5ID09IC0xKTsKKyAgICAgICAgcmV0dXJuIC0zNjY7CisgICAgfQogfQogCiAvKiBOdW1iZXIgb2YgZGF5cyBpbiA0LCAxMDAsIGFuZCA0MDAgeWVhciBjeWNsZXMuICBUaGF0IHRoZXNlIGhhdmUKICAqIHRoZSBjb3JyZWN0IHZhbHVlcyBpcyBhc3NlcnRlZCBpbiB0aGUgbW9kdWxlIGluaXQgZnVuY3Rpb24uCiAgKi8KLSNkZWZpbmUgREk0WQkxNDYxCS8qIGRheXNfYmVmb3JlX3llYXIoNSk7IGRheXMgaW4gNCB5ZWFycyAqLwotI2RlZmluZSBESTEwMFkJMzY1MjQJLyogZGF5c19iZWZvcmVfeWVhcigxMDEpOyBkYXlzIGluIDEwMCB5ZWFycyAqLwotI2RlZmluZSBESTQwMFkJMTQ2MDk3CS8qIGRheXNfYmVmb3JlX3llYXIoNDAxKTsgZGF5cyBpbiA0MDAgeWVhcnMgICovCisjZGVmaW5lIERJNFkgICAgMTQ2MSAgICAvKiBkYXlzX2JlZm9yZV95ZWFyKDUpOyBkYXlzIGluIDQgeWVhcnMgKi8KKyNkZWZpbmUgREkxMDBZICAzNjUyNCAgIC8qIGRheXNfYmVmb3JlX3llYXIoMTAxKTsgZGF5cyBpbiAxMDAgeWVhcnMgKi8KKyNkZWZpbmUgREk0MDBZICAxNDYwOTcgIC8qIGRheXNfYmVmb3JlX3llYXIoNDAxKTsgZGF5cyBpbiA0MDAgeWVhcnMgICovCiAKIC8qIG9yZGluYWwgLT4geWVhciwgbW9udGgsIGRheSwgY29uc2lkZXJpbmcgMDEtSmFuLTAwMDEgYXMgZGF5IDEuICovCiBzdGF0aWMgdm9pZAogb3JkX3RvX3ltZChpbnQgb3JkaW5hbCwgaW50ICp5ZWFyLCBpbnQgKm1vbnRoLCBpbnQgKmRheSkKIHsKLQlpbnQgbiwgbjEsIG40LCBuMTAwLCBuNDAwLCBsZWFweWVhciwgcHJlY2VkaW5nOworICAgIGludCBuLCBuMSwgbjQsIG4xMDAsIG40MDAsIGxlYXB5ZWFyLCBwcmVjZWRpbmc7CiAKLQkvKiBvcmRpbmFsIGlzIGEgMS1iYXNlZCBpbmRleCwgc3RhcnRpbmcgYXQgMS1KYW4tMS4gIFRoZSBwYXR0ZXJuIG9mCi0JICogbGVhcCB5ZWFycyByZXBlYXRzIGV4YWN0bHkgZXZlcnkgNDAwIHllYXJzLiAgVGhlIGJhc2ljIHN0cmF0ZWd5IGlzCi0JICogdG8gZmluZCB0aGUgY2xvc2VzdCA0MDAteWVhciBib3VuZGFyeSBhdCBvciBiZWZvcmUgb3JkaW5hbCwgdGhlbgotCSAqIHdvcmsgd2l0aCB0aGUgb2Zmc2V0IGZyb20gdGhhdCBib3VuZGFyeSB0byBvcmRpbmFsLiAgTGlmZSBpcyBtdWNoCi0JICogY2xlYXJlciBpZiB3ZSBzdWJ0cmFjdCAxIGZyb20gb3JkaW5hbCBmaXJzdCAtLSB0aGVuIHRoZSB2YWx1ZXMKLQkgKiBvZiBvcmRpbmFsIGF0IDQwMC15ZWFyIGJvdW5kYXJpZXMgYXJlIGV4YWN0bHkgdGhvc2UgZGl2aXNpYmxlCi0JICogYnkgREk0MDBZOgotCSAqCi0JICogICAgRCAgTSAgIFkgICAgICAgICAgICBuICAgICAgICAgICAgICBuLTEKLQkgKiAgICAtLSAtLS0gLS0tLSAgICAgICAgLS0tLS0tLS0tLSAgICAgLS0tLS0tLS0tLS0tLS0tLQotCSAqICAgIDMxIERlYyAtNDAwICAgICAgICAtREk0MDBZICAgICAgIC1ESTQwMFkgLTEKLQkgKiAgICAgMSBKYW4gLTM5OSAgICAgICAgIC1ESTQwMFkgKzEgICAtREk0MDBZICAgICAgNDAwLXllYXIgYm91bmRhcnkKLQkgKiAgICAuLi4KLQkgKiAgICAzMCBEZWMgIDAwMCAgICAgICAgLTEgICAgICAgICAgICAgLTIKLQkgKiAgICAzMSBEZWMgIDAwMCAgICAgICAgIDAgICAgICAgICAgICAgLTEKLQkgKiAgICAgMSBKYW4gIDAwMSAgICAgICAgIDEgICAgICAgICAgICAgIDAgICAgICAgICAgNDAwLXllYXIgYm91bmRhcnkKLQkgKiAgICAgMiBKYW4gIDAwMSAgICAgICAgIDIgICAgICAgICAgICAgIDEKLQkgKiAgICAgMyBKYW4gIDAwMSAgICAgICAgIDMgICAgICAgICAgICAgIDIKLQkgKiAgICAuLi4KLQkgKiAgICAzMSBEZWMgIDQwMCAgICAgICAgIERJNDAwWSAgICAgICAgREk0MDBZIC0xCi0JICogICAgIDEgSmFuICA0MDEgICAgICAgICBESTQwMFkgKzEgICAgIERJNDAwWSAgICAgIDQwMC15ZWFyIGJvdW5kYXJ5Ci0JICovCi0JYXNzZXJ0KG9yZGluYWwgPj0gMSk7Ci0JLS1vcmRpbmFsOwotCW40MDAgPSBvcmRpbmFsIC8gREk0MDBZOwotCW4gPSBvcmRpbmFsICUgREk0MDBZOwotCSp5ZWFyID0gbjQwMCAqIDQwMCArIDE7CisgICAgLyogb3JkaW5hbCBpcyBhIDEtYmFzZWQgaW5kZXgsIHN0YXJ0aW5nIGF0IDEtSmFuLTEuICBUaGUgcGF0dGVybiBvZgorICAgICAqIGxlYXAgeWVhcnMgcmVwZWF0cyBleGFjdGx5IGV2ZXJ5IDQwMCB5ZWFycy4gIFRoZSBiYXNpYyBzdHJhdGVneSBpcworICAgICAqIHRvIGZpbmQgdGhlIGNsb3Nlc3QgNDAwLXllYXIgYm91bmRhcnkgYXQgb3IgYmVmb3JlIG9yZGluYWwsIHRoZW4KKyAgICAgKiB3b3JrIHdpdGggdGhlIG9mZnNldCBmcm9tIHRoYXQgYm91bmRhcnkgdG8gb3JkaW5hbC4gIExpZmUgaXMgbXVjaAorICAgICAqIGNsZWFyZXIgaWYgd2Ugc3VidHJhY3QgMSBmcm9tIG9yZGluYWwgZmlyc3QgLS0gdGhlbiB0aGUgdmFsdWVzCisgICAgICogb2Ygb3JkaW5hbCBhdCA0MDAteWVhciBib3VuZGFyaWVzIGFyZSBleGFjdGx5IHRob3NlIGRpdmlzaWJsZQorICAgICAqIGJ5IERJNDAwWToKKyAgICAgKgorICAgICAqICAgIEQgIE0gICBZICAgICAgICAgICAgbiAgICAgICAgICAgICAgbi0xCisgICAgICogICAgLS0gLS0tIC0tLS0gICAgICAgIC0tLS0tLS0tLS0gICAgIC0tLS0tLS0tLS0tLS0tLS0KKyAgICAgKiAgICAzMSBEZWMgLTQwMCAgICAgICAgLURJNDAwWSAgICAgICAtREk0MDBZIC0xCisgICAgICogICAgIDEgSmFuIC0zOTkgICAgICAgICAtREk0MDBZICsxICAgLURJNDAwWSAgICAgIDQwMC15ZWFyIGJvdW5kYXJ5CisgICAgICogICAgLi4uCisgICAgICogICAgMzAgRGVjICAwMDAgICAgICAgIC0xICAgICAgICAgICAgIC0yCisgICAgICogICAgMzEgRGVjICAwMDAgICAgICAgICAwICAgICAgICAgICAgIC0xCisgICAgICogICAgIDEgSmFuICAwMDEgICAgICAgICAxICAgICAgICAgICAgICAwICAgICAgICAgIDQwMC15ZWFyIGJvdW5kYXJ5CisgICAgICogICAgIDIgSmFuICAwMDEgICAgICAgICAyICAgICAgICAgICAgICAxCisgICAgICogICAgIDMgSmFuICAwMDEgICAgICAgICAzICAgICAgICAgICAgICAyCisgICAgICogICAgLi4uCisgICAgICogICAgMzEgRGVjICA0MDAgICAgICAgICBESTQwMFkgICAgICAgIERJNDAwWSAtMQorICAgICAqICAgICAxIEphbiAgNDAxICAgICAgICAgREk0MDBZICsxICAgICBESTQwMFkgICAgICA0MDAteWVhciBib3VuZGFyeQorICAgICAqLworICAgIGFzc2VydChvcmRpbmFsID49IDEpOworICAgIC0tb3JkaW5hbDsKKyAgICBuNDAwID0gb3JkaW5hbCAvIERJNDAwWTsKKyAgICBuID0gb3JkaW5hbCAlIERJNDAwWTsKKyAgICAqeWVhciA9IG40MDAgKiA0MDAgKyAxOwogCi0JLyogTm93IG4gaXMgdGhlIChub24tbmVnYXRpdmUpIG9mZnNldCwgaW4gZGF5cywgZnJvbSBKYW51YXJ5IDEgb2YKLQkgKiB5ZWFyLCB0byB0aGUgZGVzaXJlZCBkYXRlLiAgTm93IGNvbXB1dGUgaG93IG1hbnkgMTAwLXllYXIgY3ljbGVzCi0JICogcHJlY2VkZSBuLgotCSAqIE5vdGUgdGhhdCBpdCdzIHBvc3NpYmxlIGZvciBuMTAwIHRvIGVxdWFsIDQhICBJbiB0aGF0IGNhc2UgNCBmdWxsCi0JICogMTAwLXllYXIgY3ljbGVzIHByZWNlZGUgdGhlIGRlc2lyZWQgZGF5LCB3aGljaCBpbXBsaWVzIHRoZQotCSAqIGRlc2lyZWQgZGF5IGlzIERlY2VtYmVyIDMxIGF0IHRoZSBlbmQgb2YgYSA0MDAteWVhciBjeWNsZS4KLQkgKi8KLQluMTAwID0gbiAvIERJMTAwWTsKLQluID0gbiAlIERJMTAwWTsKKyAgICAvKiBOb3cgbiBpcyB0aGUgKG5vbi1uZWdhdGl2ZSkgb2Zmc2V0LCBpbiBkYXlzLCBmcm9tIEphbnVhcnkgMSBvZgorICAgICAqIHllYXIsIHRvIHRoZSBkZXNpcmVkIGRhdGUuICBOb3cgY29tcHV0ZSBob3cgbWFueSAxMDAteWVhciBjeWNsZXMKKyAgICAgKiBwcmVjZWRlIG4uCisgICAgICogTm90ZSB0aGF0IGl0J3MgcG9zc2libGUgZm9yIG4xMDAgdG8gZXF1YWwgNCEgIEluIHRoYXQgY2FzZSA0IGZ1bGwKKyAgICAgKiAxMDAteWVhciBjeWNsZXMgcHJlY2VkZSB0aGUgZGVzaXJlZCBkYXksIHdoaWNoIGltcGxpZXMgdGhlCisgICAgICogZGVzaXJlZCBkYXkgaXMgRGVjZW1iZXIgMzEgYXQgdGhlIGVuZCBvZiBhIDQwMC15ZWFyIGN5Y2xlLgorICAgICAqLworICAgIG4xMDAgPSBuIC8gREkxMDBZOworICAgIG4gPSBuICUgREkxMDBZOwogCi0JLyogTm93IGNvbXB1dGUgaG93IG1hbnkgNC15ZWFyIGN5Y2xlcyBwcmVjZWRlIGl0LiAqLwotCW40ID0gbiAvIERJNFk7Ci0JbiA9IG4gJSBESTRZOworICAgIC8qIE5vdyBjb21wdXRlIGhvdyBtYW55IDQteWVhciBjeWNsZXMgcHJlY2VkZSBpdC4gKi8KKyAgICBuNCA9IG4gLyBESTRZOworICAgIG4gPSBuICUgREk0WTsKIAotCS8qIEFuZCBub3cgaG93IG1hbnkgc2luZ2xlIHllYXJzLiAgQWdhaW4gbjEgY2FuIGJlIDQsIGFuZCBhZ2FpbgotCSAqIG1lYW5pbmcgdGhhdCB0aGUgZGVzaXJlZCBkYXkgaXMgRGVjZW1iZXIgMzEgYXQgdGhlIGVuZCBvZiB0aGUKLQkgKiA0LXllYXIgY3ljbGUuCi0JICovCi0JbjEgPSBuIC8gMzY1OwotCW4gPSBuICUgMzY1OworICAgIC8qIEFuZCBub3cgaG93IG1hbnkgc2luZ2xlIHllYXJzLiAgQWdhaW4gbjEgY2FuIGJlIDQsIGFuZCBhZ2FpbgorICAgICAqIG1lYW5pbmcgdGhhdCB0aGUgZGVzaXJlZCBkYXkgaXMgRGVjZW1iZXIgMzEgYXQgdGhlIGVuZCBvZiB0aGUKKyAgICAgKiA0LXllYXIgY3ljbGUuCisgICAgICovCisgICAgbjEgPSBuIC8gMzY1OworICAgIG4gPSBuICUgMzY1OwogCi0JKnllYXIgKz0gbjEwMCAqIDEwMCArIG40ICogNCArIG4xOwotCWlmIChuMSA9PSA0IHx8IG4xMDAgPT0gNCkgewotCQlhc3NlcnQobiA9PSAwKTsKLQkJKnllYXIgLT0gMTsKLQkJKm1vbnRoID0gMTI7Ci0JCSpkYXkgPSAzMTsKLQkJcmV0dXJuOwotCX0KKyAgICAqeWVhciArPSBuMTAwICogMTAwICsgbjQgKiA0ICsgbjE7CisgICAgaWYgKG4xID09IDQgfHwgbjEwMCA9PSA0KSB7CisgICAgICAgIGFzc2VydChuID09IDApOworICAgICAgICAqeWVhciAtPSAxOworICAgICAgICAqbW9udGggPSAxMjsKKyAgICAgICAgKmRheSA9IDMxOworICAgICAgICByZXR1cm47CisgICAgfQogCi0JLyogTm93IHRoZSB5ZWFyIGlzIGNvcnJlY3QsIGFuZCBuIGlzIHRoZSBvZmZzZXQgZnJvbSBKYW51YXJ5IDEuICBXZQotCSAqIGZpbmQgdGhlIG1vbnRoIHZpYSBhbiBlc3RpbWF0ZSB0aGF0J3MgZWl0aGVyIGV4YWN0IG9yIG9uZSB0b28KLQkgKiBsYXJnZS4KLQkgKi8KLQlsZWFweWVhciA9IG4xID09IDMgJiYgKG40ICE9IDI0IHx8IG4xMDAgPT0gMyk7Ci0JYXNzZXJ0KGxlYXB5ZWFyID09IGlzX2xlYXAoKnllYXIpKTsKLQkqbW9udGggPSAobiArIDUwKSA+PiA1OwotCXByZWNlZGluZyA9IChfZGF5c19iZWZvcmVfbW9udGhbKm1vbnRoXSArICgqbW9udGggPiAyICYmIGxlYXB5ZWFyKSk7Ci0JaWYgKHByZWNlZGluZyA+IG4pIHsKLQkJLyogZXN0aW1hdGUgaXMgdG9vIGxhcmdlICovCi0JCSptb250aCAtPSAxOwotCQlwcmVjZWRpbmcgLT0gZGF5c19pbl9tb250aCgqeWVhciwgKm1vbnRoKTsKLQl9Ci0JbiAtPSBwcmVjZWRpbmc7Ci0JYXNzZXJ0KDAgPD0gbik7Ci0JYXNzZXJ0KG4gPCBkYXlzX2luX21vbnRoKCp5ZWFyLCAqbW9udGgpKTsKKyAgICAvKiBOb3cgdGhlIHllYXIgaXMgY29ycmVjdCwgYW5kIG4gaXMgdGhlIG9mZnNldCBmcm9tIEphbnVhcnkgMS4gIFdlCisgICAgICogZmluZCB0aGUgbW9udGggdmlhIGFuIGVzdGltYXRlIHRoYXQncyBlaXRoZXIgZXhhY3Qgb3Igb25lIHRvbworICAgICAqIGxhcmdlLgorICAgICAqLworICAgIGxlYXB5ZWFyID0gbjEgPT0gMyAmJiAobjQgIT0gMjQgfHwgbjEwMCA9PSAzKTsKKyAgICBhc3NlcnQobGVhcHllYXIgPT0gaXNfbGVhcCgqeWVhcikpOworICAgICptb250aCA9IChuICsgNTApID4+IDU7CisgICAgcHJlY2VkaW5nID0gKF9kYXlzX2JlZm9yZV9tb250aFsqbW9udGhdICsgKCptb250aCA+IDIgJiYgbGVhcHllYXIpKTsKKyAgICBpZiAocHJlY2VkaW5nID4gbikgeworICAgICAgICAvKiBlc3RpbWF0ZSBpcyB0b28gbGFyZ2UgKi8KKyAgICAgICAgKm1vbnRoIC09IDE7CisgICAgICAgIHByZWNlZGluZyAtPSBkYXlzX2luX21vbnRoKCp5ZWFyLCAqbW9udGgpOworICAgIH0KKyAgICBuIC09IHByZWNlZGluZzsKKyAgICBhc3NlcnQoMCA8PSBuKTsKKyAgICBhc3NlcnQobiA8IGRheXNfaW5fbW9udGgoKnllYXIsICptb250aCkpOwogCi0JKmRheSA9IG4gKyAxOworICAgICpkYXkgPSBuICsgMTsKIH0KIAogLyogeWVhciwgbW9udGgsIGRheSAtPiBvcmRpbmFsLCBjb25zaWRlcmluZyAwMS1KYW4tMDAwMSBhcyBkYXkgMS4gKi8KIHN0YXRpYyBpbnQKIHltZF90b19vcmQoaW50IHllYXIsIGludCBtb250aCwgaW50IGRheSkKIHsKLQlyZXR1cm4gZGF5c19iZWZvcmVfeWVhcih5ZWFyKSArIGRheXNfYmVmb3JlX21vbnRoKHllYXIsIG1vbnRoKSArIGRheTsKKyAgICByZXR1cm4gZGF5c19iZWZvcmVfeWVhcih5ZWFyKSArIGRheXNfYmVmb3JlX21vbnRoKHllYXIsIG1vbnRoKSArIGRheTsKIH0KIAogLyogRGF5IG9mIHdlZWssIHdoZXJlIE1vbmRheT09MCwgLi4uLCBTdW5kYXk9PTYuICAxLzEvMSB3YXMgYSBNb25kYXkuICovCiBzdGF0aWMgaW50CiB3ZWVrZGF5KGludCB5ZWFyLCBpbnQgbW9udGgsIGludCBkYXkpCiB7Ci0JcmV0dXJuICh5bWRfdG9fb3JkKHllYXIsIG1vbnRoLCBkYXkpICsgNikgJSA3OworICAgIHJldHVybiAoeW1kX3RvX29yZCh5ZWFyLCBtb250aCwgZGF5KSArIDYpICUgNzsKIH0KIAogLyogT3JkaW5hbCBvZiB0aGUgTW9uZGF5IHN0YXJ0aW5nIHdlZWsgMSBvZiB0aGUgSVNPIHllYXIuICBXZWVrIDEgaXMgdGhlCkBAIC0zNDIsMTUgKzM0MiwxNSBAQAogc3RhdGljIGludAogaXNvX3dlZWsxX21vbmRheShpbnQgeWVhcikKIHsKLQlpbnQgZmlyc3RfZGF5ID0geW1kX3RvX29yZCh5ZWFyLCAxLCAxKTsJLyogb3JkIG9mIDEvMSAqLwotCS8qIDAgaWYgMS8xIGlzIGEgTW9uZGF5LCAxIGlmIGEgVHVlLCBldGMuICovCi0JaW50IGZpcnN0X3dlZWtkYXkgPSAoZmlyc3RfZGF5ICsgNikgJSA3OwotCS8qIG9yZGluYWwgb2YgY2xvc2VzdCBNb25kYXkgYXQgb3IgYmVmb3JlIDEvMSAqLwotCWludCB3ZWVrMV9tb25kYXkgID0gZmlyc3RfZGF5IC0gZmlyc3Rfd2Vla2RheTsKKyAgICBpbnQgZmlyc3RfZGF5ID0geW1kX3RvX29yZCh5ZWFyLCAxLCAxKTsgICAgIC8qIG9yZCBvZiAxLzEgKi8KKyAgICAvKiAwIGlmIDEvMSBpcyBhIE1vbmRheSwgMSBpZiBhIFR1ZSwgZXRjLiAqLworICAgIGludCBmaXJzdF93ZWVrZGF5ID0gKGZpcnN0X2RheSArIDYpICUgNzsKKyAgICAvKiBvcmRpbmFsIG9mIGNsb3Nlc3QgTW9uZGF5IGF0IG9yIGJlZm9yZSAxLzEgKi8KKyAgICBpbnQgd2VlazFfbW9uZGF5ICA9IGZpcnN0X2RheSAtIGZpcnN0X3dlZWtkYXk7CiAKLQlpZiAoZmlyc3Rfd2Vla2RheSA+IDMpCS8qIGlmIDEvMSB3YXMgRnJpLCBTYXQsIFN1biAqLwotCQl3ZWVrMV9tb25kYXkgKz0gNzsKLQlyZXR1cm4gd2VlazFfbW9uZGF5OworICAgIGlmIChmaXJzdF93ZWVrZGF5ID4gMykgICAgICAvKiBpZiAxLzEgd2FzIEZyaSwgU2F0LCBTdW4gKi8KKyAgICAgICAgd2VlazFfbW9uZGF5ICs9IDc7CisgICAgcmV0dXJuIHdlZWsxX21vbmRheTsKIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0zNjMsMTIgKzM2MywxMiBAQAogc3RhdGljIGludAogY2hlY2tfZGVsdGFfZGF5X3JhbmdlKGludCBkYXlzKQogewotCWlmICgtTUFYX0RFTFRBX0RBWVMgPD0gZGF5cyAmJiBkYXlzIDw9IE1BWF9ERUxUQV9EQVlTKQotCQlyZXR1cm4gMDsKLQlQeUVycl9Gb3JtYXQoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJICAgICAiZGF5cz0lZDsgbXVzdCBoYXZlIG1hZ25pdHVkZSA8PSAlZCIsCi0JCSAgICAgZGF5cywgTUFYX0RFTFRBX0RBWVMpOwotCXJldHVybiAtMTsKKyAgICBpZiAoLU1BWF9ERUxUQV9EQVlTIDw9IGRheXMgJiYgZGF5cyA8PSBNQVhfREVMVEFfREFZUykKKyAgICAgICAgcmV0dXJuIDA7CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgICJkYXlzPSVkOyBtdXN0IGhhdmUgbWFnbml0dWRlIDw9ICVkIiwKKyAgICAgICAgICAgICAgICAgZGF5cywgTUFYX0RFTFRBX0RBWVMpOworICAgIHJldHVybiAtMTsKIH0KIAogLyogQ2hlY2sgdGhhdCBkYXRlIGFyZ3VtZW50cyBhcmUgaW4gcmFuZ2UuICBSZXR1cm4gMCBpZiB0aGV5IGFyZS4gIElmIHRoZXkKQEAgLTM3OCwyMiArMzc4LDIyIEBACiBjaGVja19kYXRlX2FyZ3MoaW50IHllYXIsIGludCBtb250aCwgaW50IGRheSkKIHsKIAotCWlmICh5ZWFyIDwgTUlOWUVBUiB8fCB5ZWFyID4gTUFYWUVBUikgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkieWVhciBpcyBvdXQgb2YgcmFuZ2UiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAobW9udGggPCAxIHx8IG1vbnRoID4gMTIpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJIm1vbnRoIG11c3QgYmUgaW4gMS4uMTIiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoZGF5IDwgMSB8fCBkYXkgPiBkYXlzX2luX21vbnRoKHllYXIsIG1vbnRoKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkiZGF5IGlzIG91dCBvZiByYW5nZSBmb3IgbW9udGgiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlyZXR1cm4gMDsKKyAgICBpZiAoeWVhciA8IE1JTllFQVIgfHwgeWVhciA+IE1BWFlFQVIpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAieWVhciBpcyBvdXQgb2YgcmFuZ2UiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAobW9udGggPCAxIHx8IG1vbnRoID4gMTIpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAibW9udGggbXVzdCBiZSBpbiAxLi4xMiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChkYXkgPCAxIHx8IGRheSA+IGRheXNfaW5fbW9udGgoeWVhciwgbW9udGgpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImRheSBpcyBvdXQgb2YgcmFuZ2UgZm9yIG1vbnRoIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIC8qIENoZWNrIHRoYXQgdGltZSBhcmd1bWVudHMgYXJlIGluIHJhbmdlLiAgUmV0dXJuIDAgaWYgdGhleSBhcmUuICBJZiB0aGV5CkBAIC00MDIsMjcgKzQwMiwyNyBAQAogc3RhdGljIGludAogY2hlY2tfdGltZV9hcmdzKGludCBoLCBpbnQgbSwgaW50IHMsIGludCB1cykKIHsKLQlpZiAoaCA8IDAgfHwgaCA+IDIzKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJob3VyIG11c3QgYmUgaW4gMC4uMjMiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAobSA8IDAgfHwgbSA+IDU5KSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJtaW51dGUgbXVzdCBiZSBpbiAwLi41OSIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmIChzIDwgMCB8fCBzID4gNTkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJInNlY29uZCBtdXN0IGJlIGluIDAuLjU5Iik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKHVzIDwgMCB8fCB1cyA+IDk5OTk5OSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkibWljcm9zZWNvbmQgbXVzdCBiZSBpbiAwLi45OTk5OTkiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlyZXR1cm4gMDsKKyAgICBpZiAoaCA8IDAgfHwgaCA+IDIzKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImhvdXIgbXVzdCBiZSBpbiAwLi4yMyIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChtIDwgMCB8fCBtID4gNTkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAibWludXRlIG11c3QgYmUgaW4gMC4uNTkiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAocyA8IDAgfHwgcyA+IDU5KSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInNlY29uZCBtdXN0IGJlIGluIDAuLjU5Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKHVzIDwgMCB8fCB1cyA+IDk5OTk5OSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJtaWNyb3NlY29uZCBtdXN0IGJlIGluIDAuLjk5OTk5OSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiAwOwogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTQzOCwxMDkgKzQzOCwxMDkgQEAKIHN0YXRpYyB2b2lkCiBub3JtYWxpemVfcGFpcihpbnQgKmhpLCBpbnQgKmxvLCBpbnQgZmFjdG9yKQogewotCWFzc2VydChmYWN0b3IgPiAwKTsKLQlhc3NlcnQobG8gIT0gaGkpOwotCWlmICgqbG8gPCAwIHx8ICpsbyA+PSBmYWN0b3IpIHsKLQkJY29uc3QgaW50IG51bV9oaSA9IGRpdm1vZCgqbG8sIGZhY3RvciwgbG8pOwotCQljb25zdCBpbnQgbmV3X2hpID0gKmhpICsgbnVtX2hpOwotCQlhc3NlcnQoISBTSUdORURfQUREX09WRVJGTE9XRUQobmV3X2hpLCAqaGksIG51bV9oaSkpOwotCQkqaGkgPSBuZXdfaGk7Ci0JfQotCWFzc2VydCgwIDw9ICpsbyAmJiAqbG8gPCBmYWN0b3IpOworICAgIGFzc2VydChmYWN0b3IgPiAwKTsKKyAgICBhc3NlcnQobG8gIT0gaGkpOworICAgIGlmICgqbG8gPCAwIHx8ICpsbyA+PSBmYWN0b3IpIHsKKyAgICAgICAgY29uc3QgaW50IG51bV9oaSA9IGRpdm1vZCgqbG8sIGZhY3RvciwgbG8pOworICAgICAgICBjb25zdCBpbnQgbmV3X2hpID0gKmhpICsgbnVtX2hpOworICAgICAgICBhc3NlcnQoISBTSUdORURfQUREX09WRVJGTE9XRUQobmV3X2hpLCAqaGksIG51bV9oaSkpOworICAgICAgICAqaGkgPSBuZXdfaGk7CisgICAgfQorICAgIGFzc2VydCgwIDw9ICpsbyAmJiAqbG8gPCBmYWN0b3IpOwogfQogCiAvKiBGaWRkbGUgZGF5cyAoZCksIHNlY29uZHMgKHMpLCBhbmQgbWljcm9zZWNvbmRzICh1cykgc28gdGhhdAotICogCTAgPD0gKnMgPCAyNCozNjAwCi0gKiAJMCA8PSAqdXMgPCAxMDAwMDAwCisgKiAgICAgIDAgPD0gKnMgPCAyNCozNjAwCisgKiAgICAgIDAgPD0gKnVzIDwgMTAwMDAwMAogICogVGhlIGlucHV0IHZhbHVlcyBtdXN0IGJlIHN1Y2ggdGhhdCB0aGUgaW50ZXJuYWxzIGRvbid0IG92ZXJmbG93LgogICogVGhlIHdheSB0aGlzIHJvdXRpbmUgaXMgdXNlZCwgd2UgZG9uJ3QgZ2V0IGNsb3NlLgogICovCiBzdGF0aWMgdm9pZAogbm9ybWFsaXplX2Rfc191cyhpbnQgKmQsIGludCAqcywgaW50ICp1cykKIHsKLQlpZiAoKnVzIDwgMCB8fCAqdXMgPj0gMTAwMDAwMCkgewotCQlub3JtYWxpemVfcGFpcihzLCB1cywgMTAwMDAwMCk7Ci0JCS8qIHxzfCBjYW4ndCBiZSBiaWdnZXIgdGhhbiBhYm91dAotCQkgKiB8b3JpZ2luYWwgc3wgKyB8b3JpZ2luYWwgdXN8LzEwMDAwMDAgbm93LgotCQkgKi8KKyAgICBpZiAoKnVzIDwgMCB8fCAqdXMgPj0gMTAwMDAwMCkgeworICAgICAgICBub3JtYWxpemVfcGFpcihzLCB1cywgMTAwMDAwMCk7CisgICAgICAgIC8qIHxzfCBjYW4ndCBiZSBiaWdnZXIgdGhhbiBhYm91dAorICAgICAgICAgKiB8b3JpZ2luYWwgc3wgKyB8b3JpZ2luYWwgdXN8LzEwMDAwMDAgbm93LgorICAgICAgICAgKi8KIAotCX0KLQlpZiAoKnMgPCAwIHx8ICpzID49IDI0KjM2MDApIHsKLQkJbm9ybWFsaXplX3BhaXIoZCwgcywgMjQqMzYwMCk7Ci0JCS8qIHxkfCBjYW4ndCBiZSBiaWdnZXIgdGhhbiBhYm91dAotCQkgKiB8b3JpZ2luYWwgZHwgKwotCQkgKiAofG9yaWdpbmFsIHN8ICsgfG9yaWdpbmFsIHVzfC8xMDAwMDAwKSAvICgyNCozNjAwKSBub3cuCi0JCSAqLwotCX0KLQlhc3NlcnQoMCA8PSAqcyAmJiAqcyA8IDI0KjM2MDApOwotCWFzc2VydCgwIDw9ICp1cyAmJiAqdXMgPCAxMDAwMDAwKTsKKyAgICB9CisgICAgaWYgKCpzIDwgMCB8fCAqcyA+PSAyNCozNjAwKSB7CisgICAgICAgIG5vcm1hbGl6ZV9wYWlyKGQsIHMsIDI0KjM2MDApOworICAgICAgICAvKiB8ZHwgY2FuJ3QgYmUgYmlnZ2VyIHRoYW4gYWJvdXQKKyAgICAgICAgICogfG9yaWdpbmFsIGR8ICsKKyAgICAgICAgICogKHxvcmlnaW5hbCBzfCArIHxvcmlnaW5hbCB1c3wvMTAwMDAwMCkgLyAoMjQqMzYwMCkgbm93LgorICAgICAgICAgKi8KKyAgICB9CisgICAgYXNzZXJ0KDAgPD0gKnMgJiYgKnMgPCAyNCozNjAwKTsKKyAgICBhc3NlcnQoMCA8PSAqdXMgJiYgKnVzIDwgMTAwMDAwMCk7CiB9CiAKIC8qIEZpZGRsZSB5ZWFycyAoeSksIG1vbnRocyAobSksIGFuZCBkYXlzIChkKSBzbyB0aGF0Ci0gKiAJMSA8PSAqbSA8PSAxMgotICogCTEgPD0gKmQgPD0gZGF5c19pbl9tb250aCgqeSwgKm0pCisgKiAgICAgIDEgPD0gKm0gPD0gMTIKKyAqICAgICAgMSA8PSAqZCA8PSBkYXlzX2luX21vbnRoKCp5LCAqbSkKICAqIFRoZSBpbnB1dCB2YWx1ZXMgbXVzdCBiZSBzdWNoIHRoYXQgdGhlIGludGVybmFscyBkb24ndCBvdmVyZmxvdy4KICAqIFRoZSB3YXkgdGhpcyByb3V0aW5lIGlzIHVzZWQsIHdlIGRvbid0IGdldCBjbG9zZS4KICAqLwogc3RhdGljIHZvaWQKIG5vcm1hbGl6ZV95X21fZChpbnQgKnksIGludCAqbSwgaW50ICpkKQogewotCWludCBkaW07CS8qICMgb2YgZGF5cyBpbiBtb250aCAqLworICAgIGludCBkaW07ICAgICAgICAgICAgLyogIyBvZiBkYXlzIGluIG1vbnRoICovCiAKLQkvKiBUaGlzIGdldHMgbXVkZHk6ICB0aGUgcHJvcGVyIHJhbmdlIGZvciBkYXkgY2FuJ3QgYmUgZGV0ZXJtaW5lZAotCSAqIHdpdGhvdXQga25vd2luZyB0aGUgY29ycmVjdCBtb250aCBhbmQgeWVhciwgYnV0IGlmIGRheSBpcywgZS5nLiwKLQkgKiBwbHVzIG9yIG1pbnVzIGEgbWlsbGlvbiwgdGhlIGN1cnJlbnQgbW9udGggYW5kIHllYXIgdmFsdWVzIG1ha2UKLQkgKiBubyBzZW5zZSAoYW5kIG1heSBhbHNvIGJlIG91dCBvZiBib3VuZHMgdGhlbXNlbHZlcykuCi0JICogU2F5aW5nIDEyIG1vbnRocyA9PSAxIHllYXIgc2hvdWxkIGJlIG5vbi1jb250cm92ZXJzaWFsLgotCSAqLwotCWlmICgqbSA8IDEgfHwgKm0gPiAxMikgewotCQktLSptOwotCQlub3JtYWxpemVfcGFpcih5LCBtLCAxMik7Ci0JCSsrKm07Ci0JCS8qIHx5fCBjYW4ndCBiZSBiaWdnZXIgdGhhbiBhYm91dAotCQkgKiB8b3JpZ2luYWwgeXwgKyB8b3JpZ2luYWwgbXwvMTIgbm93LgotCQkgKi8KLQl9Ci0JYXNzZXJ0KDEgPD0gKm0gJiYgKm0gPD0gMTIpOworICAgIC8qIFRoaXMgZ2V0cyBtdWRkeTogIHRoZSBwcm9wZXIgcmFuZ2UgZm9yIGRheSBjYW4ndCBiZSBkZXRlcm1pbmVkCisgICAgICogd2l0aG91dCBrbm93aW5nIHRoZSBjb3JyZWN0IG1vbnRoIGFuZCB5ZWFyLCBidXQgaWYgZGF5IGlzLCBlLmcuLAorICAgICAqIHBsdXMgb3IgbWludXMgYSBtaWxsaW9uLCB0aGUgY3VycmVudCBtb250aCBhbmQgeWVhciB2YWx1ZXMgbWFrZQorICAgICAqIG5vIHNlbnNlIChhbmQgbWF5IGFsc28gYmUgb3V0IG9mIGJvdW5kcyB0aGVtc2VsdmVzKS4KKyAgICAgKiBTYXlpbmcgMTIgbW9udGhzID09IDEgeWVhciBzaG91bGQgYmUgbm9uLWNvbnRyb3ZlcnNpYWwuCisgICAgICovCisgICAgaWYgKCptIDwgMSB8fCAqbSA+IDEyKSB7CisgICAgICAgIC0tKm07CisgICAgICAgIG5vcm1hbGl6ZV9wYWlyKHksIG0sIDEyKTsKKyAgICAgICAgKysqbTsKKyAgICAgICAgLyogfHl8IGNhbid0IGJlIGJpZ2dlciB0aGFuIGFib3V0CisgICAgICAgICAqIHxvcmlnaW5hbCB5fCArIHxvcmlnaW5hbCBtfC8xMiBub3cuCisgICAgICAgICAqLworICAgIH0KKyAgICBhc3NlcnQoMSA8PSAqbSAmJiAqbSA8PSAxMik7CiAKLQkvKiBOb3cgb25seSBkYXkgY2FuIGJlIG91dCBvZiBib3VuZHMgKHllYXIgbWF5IGFsc28gYmUgb3V0IG9mIGJvdW5kcwotCSAqIGZvciBhIGRhdGV0aW1lIG9iamVjdCwgYnV0IHdlIGRvbid0IGNhcmUgYWJvdXQgdGhhdCBoZXJlKS4KLQkgKiBJZiBkYXkgaXMgb3V0IG9mIGJvdW5kcywgd2hhdCB0byBkbyBpcyBhcmd1YWJsZSwgYnV0IGF0IGxlYXN0IHRoZQotCSAqIG1ldGhvZCBoZXJlIGlzIHByaW5jaXBsZWQgYW5kIGV4cGxhaW5hYmxlLgotCSAqLwotCWRpbSA9IGRheXNfaW5fbW9udGgoKnksICptKTsKLQlpZiAoKmQgPCAxIHx8ICpkID4gZGltKSB7Ci0JCS8qIE1vdmUgZGF5LTEgZGF5cyBmcm9tIHRoZSBmaXJzdCBvZiB0aGUgbW9udGguICBGaXJzdCB0cnkgdG8KLQkJICogZ2V0IG9mZiBjaGVhcCBpZiB3ZSdyZSBvbmx5IG9uZSBkYXkgb3V0IG9mIHJhbmdlCi0JCSAqIChhZGp1c3RtZW50cyBmb3IgdGltZXpvbmUgYWxvbmUgY2FuJ3QgYmUgd29yc2UgdGhhbiB0aGF0KS4KLQkJICovCi0JCWlmICgqZCA9PSAwKSB7Ci0JCQktLSptOwotCQkJaWYgKCptID4gMCkKLQkJCQkqZCA9IGRheXNfaW5fbW9udGgoKnksICptKTsKLQkJCWVsc2UgewotCQkJCS0tKnk7Ci0JCQkJKm0gPSAxMjsKLQkJCQkqZCA9IDMxOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKCpkID09IGRpbSArIDEpIHsKLQkJCS8qIG1vdmUgZm9yd2FyZCBhIGRheSAqLwotCQkJKysqbTsKLQkJCSpkID0gMTsKLQkJCWlmICgqbSA+IDEyKSB7Ci0JCQkJKm0gPSAxOwotCQkJCSsrKnk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpbnQgb3JkaW5hbCA9IHltZF90b19vcmQoKnksICptLCAxKSArCi0JCQkJCQkgICpkIC0gMTsKLQkJCW9yZF90b195bWQob3JkaW5hbCwgeSwgbSwgZCk7Ci0JCX0KLQl9Ci0JYXNzZXJ0KCptID4gMCk7Ci0JYXNzZXJ0KCpkID4gMCk7CisgICAgLyogTm93IG9ubHkgZGF5IGNhbiBiZSBvdXQgb2YgYm91bmRzICh5ZWFyIG1heSBhbHNvIGJlIG91dCBvZiBib3VuZHMKKyAgICAgKiBmb3IgYSBkYXRldGltZSBvYmplY3QsIGJ1dCB3ZSBkb24ndCBjYXJlIGFib3V0IHRoYXQgaGVyZSkuCisgICAgICogSWYgZGF5IGlzIG91dCBvZiBib3VuZHMsIHdoYXQgdG8gZG8gaXMgYXJndWFibGUsIGJ1dCBhdCBsZWFzdCB0aGUKKyAgICAgKiBtZXRob2QgaGVyZSBpcyBwcmluY2lwbGVkIGFuZCBleHBsYWluYWJsZS4KKyAgICAgKi8KKyAgICBkaW0gPSBkYXlzX2luX21vbnRoKCp5LCAqbSk7CisgICAgaWYgKCpkIDwgMSB8fCAqZCA+IGRpbSkgeworICAgICAgICAvKiBNb3ZlIGRheS0xIGRheXMgZnJvbSB0aGUgZmlyc3Qgb2YgdGhlIG1vbnRoLiAgRmlyc3QgdHJ5IHRvCisgICAgICAgICAqIGdldCBvZmYgY2hlYXAgaWYgd2UncmUgb25seSBvbmUgZGF5IG91dCBvZiByYW5nZQorICAgICAgICAgKiAoYWRqdXN0bWVudHMgZm9yIHRpbWV6b25lIGFsb25lIGNhbid0IGJlIHdvcnNlIHRoYW4gdGhhdCkuCisgICAgICAgICAqLworICAgICAgICBpZiAoKmQgPT0gMCkgeworICAgICAgICAgICAgLS0qbTsKKyAgICAgICAgICAgIGlmICgqbSA+IDApCisgICAgICAgICAgICAgICAgKmQgPSBkYXlzX2luX21vbnRoKCp5LCAqbSk7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAtLSp5OworICAgICAgICAgICAgICAgICptID0gMTI7CisgICAgICAgICAgICAgICAgKmQgPSAzMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgqZCA9PSBkaW0gKyAxKSB7CisgICAgICAgICAgICAvKiBtb3ZlIGZvcndhcmQgYSBkYXkgKi8KKyAgICAgICAgICAgICsrKm07CisgICAgICAgICAgICAqZCA9IDE7CisgICAgICAgICAgICBpZiAoKm0gPiAxMikgeworICAgICAgICAgICAgICAgICptID0gMTsKKyAgICAgICAgICAgICAgICArKyp5OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaW50IG9yZGluYWwgPSB5bWRfdG9fb3JkKCp5LCAqbSwgMSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZCAtIDE7CisgICAgICAgICAgICBvcmRfdG9feW1kKG9yZGluYWwsIHksIG0sIGQpOworICAgICAgICB9CisgICAgfQorICAgIGFzc2VydCgqbSA+IDApOworICAgIGFzc2VydCgqZCA+IDApOwogfQogCiAvKiBGaWRkbGUgb3V0LW9mLWJvdW5kcyBtb250aHMgYW5kIGRheXMgc28gdGhhdCB0aGUgcmVzdWx0IG1ha2VzIHNvbWUga2luZApAQCAtNTUwLDE3ICs1NTAsMTcgQEAKIHN0YXRpYyBpbnQKIG5vcm1hbGl6ZV9kYXRlKGludCAqeWVhciwgaW50ICptb250aCwgaW50ICpkYXkpCiB7Ci0JaW50IHJlc3VsdDsKKyAgICBpbnQgcmVzdWx0OwogCi0Jbm9ybWFsaXplX3lfbV9kKHllYXIsIG1vbnRoLCBkYXkpOwotCWlmIChNSU5ZRUFSIDw9ICp5ZWFyICYmICp5ZWFyIDw9IE1BWFlFQVIpCi0JCXJlc3VsdCA9IDA7Ci0JZWxzZSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJCSJkYXRlIHZhbHVlIG91dCBvZiByYW5nZSIpOwotCQlyZXN1bHQgPSAtMTsKLQl9Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBub3JtYWxpemVfeV9tX2QoeWVhciwgbW9udGgsIGRheSk7CisgICAgaWYgKE1JTllFQVIgPD0gKnllYXIgJiYgKnllYXIgPD0gTUFYWUVBUikKKyAgICAgICAgcmVzdWx0ID0gMDsKKyAgICBlbHNlIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiZGF0ZSB2YWx1ZSBvdXQgb2YgcmFuZ2UiKTsKKyAgICAgICAgcmVzdWx0ID0gLTE7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIC8qIEZvcmNlIGFsbCB0aGUgZGF0ZXRpbWUgZmllbGRzIGludG8gcmFuZ2UuICBUaGUgcGFyYW1ldGVycyBhcmUgYm90aApAQCAtNTcxLDExICs1NzEsMTEgQEAKICAgICAgICAgICAgICAgICAgICBpbnQgKmhvdXIsIGludCAqbWludXRlLCBpbnQgKnNlY29uZCwKICAgICAgICAgICAgICAgICAgICBpbnQgKm1pY3Jvc2Vjb25kKQogewotCW5vcm1hbGl6ZV9wYWlyKHNlY29uZCwgbWljcm9zZWNvbmQsIDEwMDAwMDApOwotCW5vcm1hbGl6ZV9wYWlyKG1pbnV0ZSwgc2Vjb25kLCA2MCk7Ci0Jbm9ybWFsaXplX3BhaXIoaG91ciwgbWludXRlLCA2MCk7Ci0Jbm9ybWFsaXplX3BhaXIoZGF5LCBob3VyLCAyNCk7Ci0JcmV0dXJuIG5vcm1hbGl6ZV9kYXRlKHllYXIsIG1vbnRoLCBkYXkpOworICAgIG5vcm1hbGl6ZV9wYWlyKHNlY29uZCwgbWljcm9zZWNvbmQsIDEwMDAwMDApOworICAgIG5vcm1hbGl6ZV9wYWlyKG1pbnV0ZSwgc2Vjb25kLCA2MCk7CisgICAgbm9ybWFsaXplX3BhaXIoaG91ciwgbWludXRlLCA2MCk7CisgICAgbm9ybWFsaXplX3BhaXIoZGF5LCBob3VyLCAyNCk7CisgICAgcmV0dXJuIG5vcm1hbGl6ZV9kYXRlKHllYXIsIG1vbnRoLCBkYXkpOwogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTYwMiwzMSArNjAyLDMxIEBACiBzdGF0aWMgUHlPYmplY3QgKgogdGltZV9hbGxvYyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5X3NzaXplX3QgYXdhcmUpCiB7Ci0JUHlPYmplY3QgKnNlbGY7CisgICAgUHlPYmplY3QgKnNlbGY7CiAKLQlzZWxmID0gKFB5T2JqZWN0ICopCi0JCVB5T2JqZWN0X01BTExPQyhhd2FyZSA/Ci0JCQkJc2l6ZW9mKFB5RGF0ZVRpbWVfVGltZSkgOgotCQkJCXNpemVvZihfUHlEYXRlVGltZV9CYXNlVGltZSkpOwotCWlmIChzZWxmID09IE5VTEwpCi0JCXJldHVybiAoUHlPYmplY3QgKilQeUVycl9Ob01lbW9yeSgpOwotCVB5T2JqZWN0X0lOSVQoc2VsZiwgdHlwZSk7Ci0JcmV0dXJuIHNlbGY7CisgICAgc2VsZiA9IChQeU9iamVjdCAqKQorICAgICAgICBQeU9iamVjdF9NQUxMT0MoYXdhcmUgPworICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFB5RGF0ZVRpbWVfVGltZSkgOgorICAgICAgICAgICAgICAgIHNpemVvZihfUHlEYXRlVGltZV9CYXNlVGltZSkpOworICAgIGlmIChzZWxmID09IE5VTEwpCisgICAgICAgIHJldHVybiAoUHlPYmplY3QgKilQeUVycl9Ob01lbW9yeSgpOworICAgIFB5T2JqZWN0X0lOSVQoc2VsZiwgdHlwZSk7CisgICAgcmV0dXJuIHNlbGY7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkYXRldGltZV9hbGxvYyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5X3NzaXplX3QgYXdhcmUpCiB7Ci0JUHlPYmplY3QgKnNlbGY7CisgICAgUHlPYmplY3QgKnNlbGY7CiAKLQlzZWxmID0gKFB5T2JqZWN0ICopCi0JCVB5T2JqZWN0X01BTExPQyhhd2FyZSA/Ci0JCQkJc2l6ZW9mKFB5RGF0ZVRpbWVfRGF0ZVRpbWUpIDoKLQkJCQlzaXplb2YoX1B5RGF0ZVRpbWVfQmFzZURhdGVUaW1lKSk7Ci0JaWYgKHNlbGYgPT0gTlVMTCkKLQkJcmV0dXJuIChQeU9iamVjdCAqKVB5RXJyX05vTWVtb3J5KCk7Ci0JUHlPYmplY3RfSU5JVChzZWxmLCB0eXBlKTsKLQlyZXR1cm4gc2VsZjsKKyAgICBzZWxmID0gKFB5T2JqZWN0ICopCisgICAgICAgIFB5T2JqZWN0X01BTExPQyhhd2FyZSA/CisgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoUHlEYXRlVGltZV9EYXRlVGltZSkgOgorICAgICAgICAgICAgICAgIHNpemVvZihfUHlEYXRlVGltZV9CYXNlRGF0ZVRpbWUpKTsKKyAgICBpZiAoc2VsZiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gKFB5T2JqZWN0ICopUHlFcnJfTm9NZW1vcnkoKTsKKyAgICBQeU9iamVjdF9JTklUKHNlbGYsIHR5cGUpOworICAgIHJldHVybiBzZWxmOwogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTYzOCwxMCArNjM4LDEwIEBACiBzdGF0aWMgdm9pZAogc2V0X2RhdGVfZmllbGRzKFB5RGF0ZVRpbWVfRGF0ZSAqc2VsZiwgaW50IHksIGludCBtLCBpbnQgZCkKIHsKLQlzZWxmLT5oYXNoY29kZSA9IC0xOwotCVNFVF9ZRUFSKHNlbGYsIHkpOwotCVNFVF9NT05USChzZWxmLCBtKTsKLQlTRVRfREFZKHNlbGYsIGQpOworICAgIHNlbGYtPmhhc2hjb2RlID0gLTE7CisgICAgU0VUX1lFQVIoc2VsZiwgeSk7CisgICAgU0VUX01PTlRIKHNlbGYsIG0pOworICAgIFNFVF9EQVkoc2VsZiwgZCk7CiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNjUyLDcxICs2NTIsNzEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBuZXdfZGF0ZV9leChpbnQgeWVhciwgaW50IG1vbnRoLCBpbnQgZGF5LCBQeVR5cGVPYmplY3QgKnR5cGUpCiB7Ci0JUHlEYXRlVGltZV9EYXRlICpzZWxmOworICAgIFB5RGF0ZVRpbWVfRGF0ZSAqc2VsZjsKIAotCXNlbGYgPSAoUHlEYXRlVGltZV9EYXRlICopICh0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSk7Ci0JaWYgKHNlbGYgIT0gTlVMTCkKLQkJc2V0X2RhdGVfZmllbGRzKHNlbGYsIHllYXIsIG1vbnRoLCBkYXkpOwotCXJldHVybiAoUHlPYmplY3QgKikgc2VsZjsKKyAgICBzZWxmID0gKFB5RGF0ZVRpbWVfRGF0ZSAqKSAodHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpOworICAgIGlmIChzZWxmICE9IE5VTEwpCisgICAgICAgIHNldF9kYXRlX2ZpZWxkcyhzZWxmLCB5ZWFyLCBtb250aCwgZGF5KTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopIHNlbGY7CiB9CiAKICNkZWZpbmUgbmV3X2RhdGUoeWVhciwgbW9udGgsIGRheSkgXAotCW5ld19kYXRlX2V4KHllYXIsIG1vbnRoLCBkYXksICZQeURhdGVUaW1lX0RhdGVUeXBlKQorICAgIG5ld19kYXRlX2V4KHllYXIsIG1vbnRoLCBkYXksICZQeURhdGVUaW1lX0RhdGVUeXBlKQogCiAvKiBDcmVhdGUgYSBkYXRldGltZSBpbnN0YW5jZSB3aXRoIG5vIHJhbmdlIGNoZWNraW5nLiAqLwogc3RhdGljIFB5T2JqZWN0ICoKIG5ld19kYXRldGltZV9leChpbnQgeWVhciwgaW50IG1vbnRoLCBpbnQgZGF5LCBpbnQgaG91ciwgaW50IG1pbnV0ZSwKLQkgICAgIGludCBzZWNvbmQsIGludCB1c2Vjb25kLCBQeU9iamVjdCAqdHppbmZvLCBQeVR5cGVPYmplY3QgKnR5cGUpCisgICAgICAgICAgICAgaW50IHNlY29uZCwgaW50IHVzZWNvbmQsIFB5T2JqZWN0ICp0emluZm8sIFB5VHlwZU9iamVjdCAqdHlwZSkKIHsKLQlQeURhdGVUaW1lX0RhdGVUaW1lICpzZWxmOwotCWNoYXIgYXdhcmUgPSB0emluZm8gIT0gUHlfTm9uZTsKKyAgICBQeURhdGVUaW1lX0RhdGVUaW1lICpzZWxmOworICAgIGNoYXIgYXdhcmUgPSB0emluZm8gIT0gUHlfTm9uZTsKIAotCXNlbGYgPSAoUHlEYXRlVGltZV9EYXRlVGltZSAqKSAodHlwZS0+dHBfYWxsb2ModHlwZSwgYXdhcmUpKTsKLQlpZiAoc2VsZiAhPSBOVUxMKSB7Ci0JCXNlbGYtPmhhc3R6aW5mbyA9IGF3YXJlOwotCQlzZXRfZGF0ZV9maWVsZHMoKFB5RGF0ZVRpbWVfRGF0ZSAqKXNlbGYsIHllYXIsIG1vbnRoLCBkYXkpOwotCQlEQVRFX1NFVF9IT1VSKHNlbGYsIGhvdXIpOwotCQlEQVRFX1NFVF9NSU5VVEUoc2VsZiwgbWludXRlKTsKLQkJREFURV9TRVRfU0VDT05EKHNlbGYsIHNlY29uZCk7Ci0JCURBVEVfU0VUX01JQ1JPU0VDT05EKHNlbGYsIHVzZWNvbmQpOwotCQlpZiAoYXdhcmUpIHsKLQkJCVB5X0lOQ1JFRih0emluZm8pOwotCQkJc2VsZi0+dHppbmZvID0gdHppbmZvOwotCQl9Ci0JfQotCXJldHVybiAoUHlPYmplY3QgKilzZWxmOworICAgIHNlbGYgPSAoUHlEYXRlVGltZV9EYXRlVGltZSAqKSAodHlwZS0+dHBfYWxsb2ModHlwZSwgYXdhcmUpKTsKKyAgICBpZiAoc2VsZiAhPSBOVUxMKSB7CisgICAgICAgIHNlbGYtPmhhc3R6aW5mbyA9IGF3YXJlOworICAgICAgICBzZXRfZGF0ZV9maWVsZHMoKFB5RGF0ZVRpbWVfRGF0ZSAqKXNlbGYsIHllYXIsIG1vbnRoLCBkYXkpOworICAgICAgICBEQVRFX1NFVF9IT1VSKHNlbGYsIGhvdXIpOworICAgICAgICBEQVRFX1NFVF9NSU5VVEUoc2VsZiwgbWludXRlKTsKKyAgICAgICAgREFURV9TRVRfU0VDT05EKHNlbGYsIHNlY29uZCk7CisgICAgICAgIERBVEVfU0VUX01JQ1JPU0VDT05EKHNlbGYsIHVzZWNvbmQpOworICAgICAgICBpZiAoYXdhcmUpIHsKKyAgICAgICAgICAgIFB5X0lOQ1JFRih0emluZm8pOworICAgICAgICAgICAgc2VsZi0+dHppbmZvID0gdHppbmZvOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAoUHlPYmplY3QgKilzZWxmOwogfQogCi0jZGVmaW5lIG5ld19kYXRldGltZSh5LCBtLCBkLCBoaCwgbW0sIHNzLCB1cywgdHppbmZvKQkJXAotCW5ld19kYXRldGltZV9leCh5LCBtLCBkLCBoaCwgbW0sIHNzLCB1cywgdHppbmZvLAlcCi0JCQkmUHlEYXRlVGltZV9EYXRlVGltZVR5cGUpCisjZGVmaW5lIG5ld19kYXRldGltZSh5LCBtLCBkLCBoaCwgbW0sIHNzLCB1cywgdHppbmZvKSAgICAgICAgICAgXAorICAgIG5ld19kYXRldGltZV9leCh5LCBtLCBkLCBoaCwgbW0sIHNzLCB1cywgdHppbmZvLCAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgJlB5RGF0ZVRpbWVfRGF0ZVRpbWVUeXBlKQogCiAvKiBDcmVhdGUgYSB0aW1lIGluc3RhbmNlIHdpdGggbm8gcmFuZ2UgY2hlY2tpbmcuICovCiBzdGF0aWMgUHlPYmplY3QgKgogbmV3X3RpbWVfZXgoaW50IGhvdXIsIGludCBtaW51dGUsIGludCBzZWNvbmQsIGludCB1c2Vjb25kLAotCSAgICBQeU9iamVjdCAqdHppbmZvLCBQeVR5cGVPYmplY3QgKnR5cGUpCisgICAgICAgICAgICBQeU9iamVjdCAqdHppbmZvLCBQeVR5cGVPYmplY3QgKnR5cGUpCiB7Ci0JUHlEYXRlVGltZV9UaW1lICpzZWxmOwotCWNoYXIgYXdhcmUgPSB0emluZm8gIT0gUHlfTm9uZTsKKyAgICBQeURhdGVUaW1lX1RpbWUgKnNlbGY7CisgICAgY2hhciBhd2FyZSA9IHR6aW5mbyAhPSBQeV9Ob25lOwogCi0Jc2VsZiA9IChQeURhdGVUaW1lX1RpbWUgKikgKHR5cGUtPnRwX2FsbG9jKHR5cGUsIGF3YXJlKSk7Ci0JaWYgKHNlbGYgIT0gTlVMTCkgewotCQlzZWxmLT5oYXN0emluZm8gPSBhd2FyZTsKLQkJc2VsZi0+aGFzaGNvZGUgPSAtMTsKLQkJVElNRV9TRVRfSE9VUihzZWxmLCBob3VyKTsKLQkJVElNRV9TRVRfTUlOVVRFKHNlbGYsIG1pbnV0ZSk7Ci0JCVRJTUVfU0VUX1NFQ09ORChzZWxmLCBzZWNvbmQpOwotCQlUSU1FX1NFVF9NSUNST1NFQ09ORChzZWxmLCB1c2Vjb25kKTsKLQkJaWYgKGF3YXJlKSB7Ci0JCQlQeV9JTkNSRUYodHppbmZvKTsKLQkJCXNlbGYtPnR6aW5mbyA9IHR6aW5mbzsKLQkJfQotCX0KLQlyZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKKyAgICBzZWxmID0gKFB5RGF0ZVRpbWVfVGltZSAqKSAodHlwZS0+dHBfYWxsb2ModHlwZSwgYXdhcmUpKTsKKyAgICBpZiAoc2VsZiAhPSBOVUxMKSB7CisgICAgICAgIHNlbGYtPmhhc3R6aW5mbyA9IGF3YXJlOworICAgICAgICBzZWxmLT5oYXNoY29kZSA9IC0xOworICAgICAgICBUSU1FX1NFVF9IT1VSKHNlbGYsIGhvdXIpOworICAgICAgICBUSU1FX1NFVF9NSU5VVEUoc2VsZiwgbWludXRlKTsKKyAgICAgICAgVElNRV9TRVRfU0VDT05EKHNlbGYsIHNlY29uZCk7CisgICAgICAgIFRJTUVfU0VUX01JQ1JPU0VDT05EKHNlbGYsIHVzZWNvbmQpOworICAgICAgICBpZiAoYXdhcmUpIHsKKyAgICAgICAgICAgIFB5X0lOQ1JFRih0emluZm8pOworICAgICAgICAgICAgc2VsZi0+dHppbmZvID0gdHppbmZvOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAoUHlPYmplY3QgKilzZWxmOwogfQogCi0jZGVmaW5lIG5ld190aW1lKGhoLCBtbSwgc3MsIHVzLCB0emluZm8pCQlcCi0JbmV3X3RpbWVfZXgoaGgsIG1tLCBzcywgdXMsIHR6aW5mbywgJlB5RGF0ZVRpbWVfVGltZVR5cGUpCisjZGVmaW5lIG5ld190aW1lKGhoLCBtbSwgc3MsIHVzLCB0emluZm8pICAgICAgICAgICAgICAgIFwKKyAgICBuZXdfdGltZV9leChoaCwgbW0sIHNzLCB1cywgdHppbmZvLCAmUHlEYXRlVGltZV9UaW1lVHlwZSkKIAogLyogQ3JlYXRlIGEgdGltZWRlbHRhIGluc3RhbmNlLiAgTm9ybWFsaXplIHRoZSBtZW1iZXJzIGlmZiBub3JtYWxpemUgaXMKICAqIHRydWUuICBQYXNzaW5nIGZhbHNlIGlzIGEgc3BlZWQgb3B0aW1pemF0aW9uLCBpZiB5b3Uga25vdyBmb3Igc3VyZQpAQCAtNzI2LDMwICs3MjYsMzAgQEAKICAqLwogc3RhdGljIFB5T2JqZWN0ICoKIG5ld19kZWx0YV9leChpbnQgZGF5cywgaW50IHNlY29uZHMsIGludCBtaWNyb3NlY29uZHMsIGludCBub3JtYWxpemUsCi0JICAgICBQeVR5cGVPYmplY3QgKnR5cGUpCisgICAgICAgICAgICAgUHlUeXBlT2JqZWN0ICp0eXBlKQogewotCVB5RGF0ZVRpbWVfRGVsdGEgKnNlbGY7CisgICAgUHlEYXRlVGltZV9EZWx0YSAqc2VsZjsKIAotCWlmIChub3JtYWxpemUpCi0JCW5vcm1hbGl6ZV9kX3NfdXMoJmRheXMsICZzZWNvbmRzLCAmbWljcm9zZWNvbmRzKTsKLQlhc3NlcnQoMCA8PSBzZWNvbmRzICYmIHNlY29uZHMgPCAyNCozNjAwKTsKLQlhc3NlcnQoMCA8PSBtaWNyb3NlY29uZHMgJiYgbWljcm9zZWNvbmRzIDwgMTAwMDAwMCk7CisgICAgaWYgKG5vcm1hbGl6ZSkKKyAgICAgICAgbm9ybWFsaXplX2Rfc191cygmZGF5cywgJnNlY29uZHMsICZtaWNyb3NlY29uZHMpOworICAgIGFzc2VydCgwIDw9IHNlY29uZHMgJiYgc2Vjb25kcyA8IDI0KjM2MDApOworICAgIGFzc2VydCgwIDw9IG1pY3Jvc2Vjb25kcyAmJiBtaWNyb3NlY29uZHMgPCAxMDAwMDAwKTsKIAotIAlpZiAoY2hlY2tfZGVsdGFfZGF5X3JhbmdlKGRheXMpIDwgMCkKLSAJCXJldHVybiBOVUxMOworICAgIGlmIChjaGVja19kZWx0YV9kYXlfcmFuZ2UoZGF5cykgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXNlbGYgPSAoUHlEYXRlVGltZV9EZWx0YSAqKSAodHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpOwotCWlmIChzZWxmICE9IE5VTEwpIHsKLQkJc2VsZi0+aGFzaGNvZGUgPSAtMTsKLQkJU0VUX1REX0RBWVMoc2VsZiwgZGF5cyk7Ci0JCVNFVF9URF9TRUNPTkRTKHNlbGYsIHNlY29uZHMpOwotCQlTRVRfVERfTUlDUk9TRUNPTkRTKHNlbGYsIG1pY3Jvc2Vjb25kcyk7Ci0JfQotCXJldHVybiAoUHlPYmplY3QgKikgc2VsZjsKKyAgICBzZWxmID0gKFB5RGF0ZVRpbWVfRGVsdGEgKikgKHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKTsKKyAgICBpZiAoc2VsZiAhPSBOVUxMKSB7CisgICAgICAgIHNlbGYtPmhhc2hjb2RlID0gLTE7CisgICAgICAgIFNFVF9URF9EQVlTKHNlbGYsIGRheXMpOworICAgICAgICBTRVRfVERfU0VDT05EUyhzZWxmLCBzZWNvbmRzKTsKKyAgICAgICAgU0VUX1REX01JQ1JPU0VDT05EUyhzZWxmLCBtaWNyb3NlY29uZHMpOworICAgIH0KKyAgICByZXR1cm4gKFB5T2JqZWN0ICopIHNlbGY7CiB9CiAKLSNkZWZpbmUgbmV3X2RlbHRhKGQsIHMsIHVzLCBub3JtYWxpemUpCVwKLQluZXdfZGVsdGFfZXgoZCwgcywgdXMsIG5vcm1hbGl6ZSwgJlB5RGF0ZVRpbWVfRGVsdGFUeXBlKQorI2RlZmluZSBuZXdfZGVsdGEoZCwgcywgdXMsIG5vcm1hbGl6ZSkgIFwKKyAgICBuZXdfZGVsdGFfZXgoZCwgcywgdXMsIG5vcm1hbGl6ZSwgJlB5RGF0ZVRpbWVfRGVsdGFUeXBlKQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIHR6aW5mbyBoZWxwZXJzLgpAQCAtNzYxLDEzICs3NjEsMTMgQEAKIHN0YXRpYyBpbnQKIGNoZWNrX3R6aW5mb19zdWJjbGFzcyhQeU9iamVjdCAqcCkKIHsKLQlpZiAocCA9PSBQeV9Ob25lIHx8IFB5VFpJbmZvX0NoZWNrKHApKQotCQlyZXR1cm4gMDsKLQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkgICAgICJ0emluZm8gYXJndW1lbnQgbXVzdCBiZSBOb25lIG9yIG9mIGEgdHppbmZvIHN1YmNsYXNzLCAiCi0JCSAgICAgIm5vdCB0eXBlICclcyciLAotCQkgICAgIFB5X1RZUEUocCktPnRwX25hbWUpOwotCXJldHVybiAtMTsKKyAgICBpZiAocCA9PSBQeV9Ob25lIHx8IFB5VFpJbmZvX0NoZWNrKHApKQorICAgICAgICByZXR1cm4gMDsKKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAidHppbmZvIGFyZ3VtZW50IG11c3QgYmUgTm9uZSBvciBvZiBhIHR6aW5mbyBzdWJjbGFzcywgIgorICAgICAgICAgICAgICAgICAibm90IHR5cGUgJyVzJyIsCisgICAgICAgICAgICAgICAgIFB5X1RZUEUocCktPnRwX25hbWUpOworICAgIHJldHVybiAtMTsKIH0KIAogLyogUmV0dXJuIHR6aW5mby5tZXRobmFtZSh0emluZm9hcmcpLCB3aXRob3V0IGFueSBjaGVja2luZyBvZiByZXN1bHRzLgpAQCAtNzc2LDE3ICs3NzYsMTcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBjYWxsX3R6aW5mb19tZXRob2QoUHlPYmplY3QgKnR6aW5mbywgY2hhciAqbWV0aG5hbWUsIFB5T2JqZWN0ICp0emluZm9hcmcpCiB7Ci0JUHlPYmplY3QgKnJlc3VsdDsKKyAgICBQeU9iamVjdCAqcmVzdWx0OwogCi0JYXNzZXJ0KHR6aW5mbyAmJiBtZXRobmFtZSAmJiB0emluZm9hcmcpOwotCWFzc2VydChjaGVja190emluZm9fc3ViY2xhc3ModHppbmZvKSA+PSAwKTsKLQlpZiAodHppbmZvID09IFB5X05vbmUpIHsKLQkJcmVzdWx0ID0gUHlfTm9uZTsKLQkJUHlfSU5DUkVGKHJlc3VsdCk7Ci0JfQotCWVsc2UKLQkJcmVzdWx0ID0gUHlPYmplY3RfQ2FsbE1ldGhvZCh0emluZm8sIG1ldGhuYW1lLCAiTyIsIHR6aW5mb2FyZyk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBhc3NlcnQodHppbmZvICYmIG1ldGhuYW1lICYmIHR6aW5mb2FyZyk7CisgICAgYXNzZXJ0KGNoZWNrX3R6aW5mb19zdWJjbGFzcyh0emluZm8pID49IDApOworICAgIGlmICh0emluZm8gPT0gUHlfTm9uZSkgeworICAgICAgICByZXN1bHQgPSBQeV9Ob25lOworICAgICAgICBQeV9JTkNSRUYocmVzdWx0KTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXN1bHQgPSBQeU9iamVjdF9DYWxsTWV0aG9kKHR6aW5mbywgbWV0aG5hbWUsICJPIiwgdHppbmZvYXJnKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiAvKiBJZiBzZWxmIGhhcyBhIHR6aW5mbyBtZW1iZXIsIHJldHVybiBhIEJPUlJPV0VEIHJlZmVyZW5jZSB0byBpdC4gIEVsc2UKQEAgLTc5NiwxNCArNzk2LDE0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2V0X3R6aW5mb19tZW1iZXIoUHlPYmplY3QgKnNlbGYpCiB7Ci0JUHlPYmplY3QgKnR6aW5mbyA9IE5VTEw7CisgICAgUHlPYmplY3QgKnR6aW5mbyA9IE5VTEw7CiAKLQlpZiAoUHlEYXRlVGltZV9DaGVjayhzZWxmKSAmJiBIQVNUWklORk8oc2VsZikpCi0JCXR6aW5mbyA9ICgoUHlEYXRlVGltZV9EYXRlVGltZSAqKXNlbGYpLT50emluZm87Ci0JZWxzZSBpZiAoUHlUaW1lX0NoZWNrKHNlbGYpICYmIEhBU1RaSU5GTyhzZWxmKSkKLQkJdHppbmZvID0gKChQeURhdGVUaW1lX1RpbWUgKilzZWxmKS0+dHppbmZvOworICAgIGlmIChQeURhdGVUaW1lX0NoZWNrKHNlbGYpICYmIEhBU1RaSU5GTyhzZWxmKSkKKyAgICAgICAgdHppbmZvID0gKChQeURhdGVUaW1lX0RhdGVUaW1lICopc2VsZiktPnR6aW5mbzsKKyAgICBlbHNlIGlmIChQeVRpbWVfQ2hlY2soc2VsZikgJiYgSEFTVFpJTkZPKHNlbGYpKQorICAgICAgICB0emluZm8gPSAoKFB5RGF0ZVRpbWVfVGltZSAqKXNlbGYpLT50emluZm87CiAKLQlyZXR1cm4gdHppbmZvOworICAgIHJldHVybiB0emluZm87CiB9CiAKIC8qIENhbGwgZ2V0YXR0cih0emluZm8sIG5hbWUpKHR6aW5mb2FyZyksIGFuZCBleHRyYWN0IGFuIGludCBmcm9tIHRoZQpAQCAtODE2LDU5ICs4MTYsNTkgQEAKICAqLwogc3RhdGljIGludAogY2FsbF91dGNfdHppbmZvX21ldGhvZChQeU9iamVjdCAqdHppbmZvLCBjaGFyICpuYW1lLCBQeU9iamVjdCAqdHppbmZvYXJnLAotCQkgICAgICAgaW50ICpub25lKQorICAgICAgICAgICAgICAgICAgICAgICBpbnQgKm5vbmUpCiB7Ci0JUHlPYmplY3QgKnU7Ci0JaW50IHJlc3VsdCA9IC0xOworICAgIFB5T2JqZWN0ICp1OworICAgIGludCByZXN1bHQgPSAtMTsKIAotCWFzc2VydCh0emluZm8gIT0gTlVMTCk7Ci0JYXNzZXJ0KFB5VFpJbmZvX0NoZWNrKHR6aW5mbykpOwotCWFzc2VydCh0emluZm9hcmcgIT0gTlVMTCk7CisgICAgYXNzZXJ0KHR6aW5mbyAhPSBOVUxMKTsKKyAgICBhc3NlcnQoUHlUWkluZm9fQ2hlY2sodHppbmZvKSk7CisgICAgYXNzZXJ0KHR6aW5mb2FyZyAhPSBOVUxMKTsKIAotCSpub25lID0gMDsKLQl1ID0gY2FsbF90emluZm9fbWV0aG9kKHR6aW5mbywgbmFtZSwgdHppbmZvYXJnKTsKLQlpZiAodSA9PSBOVUxMKQotCQlyZXR1cm4gLTE7CisgICAgKm5vbmUgPSAwOworICAgIHUgPSBjYWxsX3R6aW5mb19tZXRob2QodHppbmZvLCBuYW1lLCB0emluZm9hcmcpOworICAgIGlmICh1ID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKIAotCWVsc2UgaWYgKHUgPT0gUHlfTm9uZSkgewotCQlyZXN1bHQgPSAwOwotCQkqbm9uZSA9IDE7Ci0JfQotCWVsc2UgaWYgKFB5RGVsdGFfQ2hlY2sodSkpIHsKLQkJY29uc3QgaW50IGRheXMgPSBHRVRfVERfREFZUyh1KTsKLQkJaWYgKGRheXMgPCAtMSB8fCBkYXlzID4gMCkKLQkJCXJlc3VsdCA9IDI0KjYwOwkvKiB0cmlnZ2VyIFZhbHVlRXJyb3IgYmVsb3cgKi8KLQkJZWxzZSB7Ci0JCQkvKiBuZXh0IGxpbmUgY2FuJ3Qgb3ZlcmZsb3cgYmVjYXVzZSB3ZSBrbm93IGRheXMKLQkJCSAqIGlzIC0xIG9yIDAgbm93Ci0JCQkgKi8KLQkJCWludCBzcyA9IGRheXMgKiAyNCAqIDM2MDAgKyBHRVRfVERfU0VDT05EUyh1KTsKLQkJCXJlc3VsdCA9IGRpdm1vZChzcywgNjAsICZzcyk7Ci0JCQlpZiAoc3MgfHwgR0VUX1REX01JQ1JPU0VDT05EUyh1KSkgewotCQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAotCQkJCQkgICAgICJ0emluZm8uJXMoKSBtdXN0IHJldHVybiBhICIKLQkJCQkJICAgICAid2hvbGUgbnVtYmVyIG9mIG1pbnV0ZXMiLAotCQkJCQkgICAgIG5hbWUpOwotCQkJCXJlc3VsdCA9IC0xOwotCQkJfQotCQl9Ci0JfQotCWVsc2UgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJICAgICAidHppbmZvLiVzKCkgbXVzdCByZXR1cm4gTm9uZSBvciAiCi0JCQkgICAgICJ0aW1lZGVsdGEsIG5vdCAnJXMnIiwKLQkJCSAgICAgbmFtZSwgUHlfVFlQRSh1KS0+dHBfbmFtZSk7Ci0JfQorICAgIGVsc2UgaWYgKHUgPT0gUHlfTm9uZSkgeworICAgICAgICByZXN1bHQgPSAwOworICAgICAgICAqbm9uZSA9IDE7CisgICAgfQorICAgIGVsc2UgaWYgKFB5RGVsdGFfQ2hlY2sodSkpIHsKKyAgICAgICAgY29uc3QgaW50IGRheXMgPSBHRVRfVERfREFZUyh1KTsKKyAgICAgICAgaWYgKGRheXMgPCAtMSB8fCBkYXlzID4gMCkKKyAgICAgICAgICAgIHJlc3VsdCA9IDI0KjYwOyAgICAgICAgICAgICAvKiB0cmlnZ2VyIFZhbHVlRXJyb3IgYmVsb3cgKi8KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvKiBuZXh0IGxpbmUgY2FuJ3Qgb3ZlcmZsb3cgYmVjYXVzZSB3ZSBrbm93IGRheXMKKyAgICAgICAgICAgICAqIGlzIC0xIG9yIDAgbm93CisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGludCBzcyA9IGRheXMgKiAyNCAqIDM2MDAgKyBHRVRfVERfU0VDT05EUyh1KTsKKyAgICAgICAgICAgIHJlc3VsdCA9IGRpdm1vZChzcywgNjAsICZzcyk7CisgICAgICAgICAgICBpZiAoc3MgfHwgR0VUX1REX01JQ1JPU0VDT05EUyh1KSkgeworICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHppbmZvLiVzKCkgbXVzdCByZXR1cm4gYSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aG9sZSBudW1iZXIgb2YgbWludXRlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUpOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgInR6aW5mby4lcygpIG11c3QgcmV0dXJuIE5vbmUgb3IgIgorICAgICAgICAgICAgICAgICAgICAgInRpbWVkZWx0YSwgbm90ICclcyciLAorICAgICAgICAgICAgICAgICAgICAgbmFtZSwgUHlfVFlQRSh1KS0+dHBfbmFtZSk7CisgICAgfQogCi0JUHlfREVDUkVGKHUpOwotCWlmIChyZXN1bHQgPCAtMTQzOSB8fCByZXN1bHQgPiAxNDM5KSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAotCQkJICAgICAidHppbmZvLiVzKCkgcmV0dXJuZWQgJWQ7IG11c3QgYmUgaW4gIgotCQkJICAgICAiLTE0MzkgLi4gMTQzOSIsCi0JCQkgICAgIG5hbWUsIHJlc3VsdCk7Ci0JCXJlc3VsdCA9IC0xOwotCX0KLQlyZXR1cm4gcmVzdWx0OworICAgIFB5X0RFQ1JFRih1KTsKKyAgICBpZiAocmVzdWx0IDwgLTE0MzkgfHwgcmVzdWx0ID4gMTQzOSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJ0emluZm8uJXMoKSByZXR1cm5lZCAlZDsgbXVzdCBiZSBpbiAiCisgICAgICAgICAgICAgICAgICAgICAiLTE0MzkgLi4gMTQzOSIsCisgICAgICAgICAgICAgICAgICAgICBuYW1lLCByZXN1bHQpOworICAgICAgICByZXN1bHQgPSAtMTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogLyogQ2FsbCB0emluZm8udXRjb2Zmc2V0KHR6aW5mb2FyZyksIGFuZCBleHRyYWN0IGFuIGludGVnZXIgZnJvbSB0aGUKQEAgLTg4MiwzNCArODgyLDM0IEBACiBzdGF0aWMgaW50CiBjYWxsX3V0Y29mZnNldChQeU9iamVjdCAqdHppbmZvLCBQeU9iamVjdCAqdHppbmZvYXJnLCBpbnQgKm5vbmUpCiB7Ci0JcmV0dXJuIGNhbGxfdXRjX3R6aW5mb19tZXRob2QodHppbmZvLCAidXRjb2Zmc2V0IiwgdHppbmZvYXJnLCBub25lKTsKKyAgICByZXR1cm4gY2FsbF91dGNfdHppbmZvX21ldGhvZCh0emluZm8sICJ1dGNvZmZzZXQiLCB0emluZm9hcmcsIG5vbmUpOwogfQogCiAvKiBDYWxsIHR6aW5mby5uYW1lKHR6aW5mb2FyZyksIGFuZCByZXR1cm4gdGhlIG9mZnNldCBhcyBhIHRpbWVkZWx0YSBvciBOb25lLgogICovCiBzdGF0aWMgUHlPYmplY3QgKgogb2Zmc2V0X2FzX3RpbWVkZWx0YShQeU9iamVjdCAqdHppbmZvLCBjaGFyICpuYW1lLCBQeU9iamVjdCAqdHppbmZvYXJnKSB7Ci0JUHlPYmplY3QgKnJlc3VsdDsKKyAgICBQeU9iamVjdCAqcmVzdWx0OwogCi0JYXNzZXJ0KHR6aW5mbyAmJiBuYW1lICYmIHR6aW5mb2FyZyk7Ci0JaWYgKHR6aW5mbyA9PSBQeV9Ob25lKSB7Ci0JCXJlc3VsdCA9IFB5X05vbmU7Ci0JCVB5X0lOQ1JFRihyZXN1bHQpOwotCX0KLQllbHNlIHsKLQkJaW50IG5vbmU7Ci0JCWludCBvZmZzZXQgPSBjYWxsX3V0Y190emluZm9fbWV0aG9kKHR6aW5mbywgbmFtZSwgdHppbmZvYXJnLAotCQkJCQkJICAgICZub25lKTsKLQkJaWYgKG9mZnNldCA8IDAgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJCXJldHVybiBOVUxMOwotCQlpZiAobm9uZSkgewotCQkJcmVzdWx0ID0gUHlfTm9uZTsKLQkJCVB5X0lOQ1JFRihyZXN1bHQpOwotCQl9Ci0JCWVsc2UKLQkJCXJlc3VsdCA9IG5ld19kZWx0YSgwLCBvZmZzZXQgKiA2MCwgMCwgMSk7Ci0JfQotCXJldHVybiByZXN1bHQ7CisgICAgYXNzZXJ0KHR6aW5mbyAmJiBuYW1lICYmIHR6aW5mb2FyZyk7CisgICAgaWYgKHR6aW5mbyA9PSBQeV9Ob25lKSB7CisgICAgICAgIHJlc3VsdCA9IFB5X05vbmU7CisgICAgICAgIFB5X0lOQ1JFRihyZXN1bHQpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaW50IG5vbmU7CisgICAgICAgIGludCBvZmZzZXQgPSBjYWxsX3V0Y190emluZm9fbWV0aG9kKHR6aW5mbywgbmFtZSwgdHppbmZvYXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbm9uZSk7CisgICAgICAgIGlmIChvZmZzZXQgPCAwICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKG5vbmUpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IFB5X05vbmU7CisgICAgICAgICAgICBQeV9JTkNSRUYocmVzdWx0KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICByZXN1bHQgPSBuZXdfZGVsdGEoMCwgb2Zmc2V0ICogNjAsIDAsIDEpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiAvKiBDYWxsIHR6aW5mby5kc3QodHppbmZvYXJnKSwgYW5kIGV4dHJhY3QgYW4gaW50ZWdlciBmcm9tIHRoZQpAQCAtOTIzLDcgKzkyMyw3IEBACiBzdGF0aWMgaW50CiBjYWxsX2RzdChQeU9iamVjdCAqdHppbmZvLCBQeU9iamVjdCAqdHppbmZvYXJnLCBpbnQgKm5vbmUpCiB7Ci0JcmV0dXJuIGNhbGxfdXRjX3R6aW5mb19tZXRob2QodHppbmZvLCAiZHN0IiwgdHppbmZvYXJnLCBub25lKTsKKyAgICByZXR1cm4gY2FsbF91dGNfdHppbmZvX21ldGhvZCh0emluZm8sICJkc3QiLCB0emluZm9hcmcsIG5vbmUpOwogfQogCiAvKiBDYWxsIHR6aW5mby50em5hbWUodHppbmZvYXJnKSwgYW5kIHJldHVybiB0aGUgcmVzdWx0LiAgdHppbmZvIG11c3QgYmUKQEAgLTkzNCw0OCArOTM0LDQ4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogY2FsbF90em5hbWUoUHlPYmplY3QgKnR6aW5mbywgUHlPYmplY3QgKnR6aW5mb2FyZykKIHsKLQlQeU9iamVjdCAqcmVzdWx0OworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CiAKLQlhc3NlcnQodHppbmZvICE9IE5VTEwpOwotCWFzc2VydChjaGVja190emluZm9fc3ViY2xhc3ModHppbmZvKSA+PSAwKTsKLQlhc3NlcnQodHppbmZvYXJnICE9IE5VTEwpOworICAgIGFzc2VydCh0emluZm8gIT0gTlVMTCk7CisgICAgYXNzZXJ0KGNoZWNrX3R6aW5mb19zdWJjbGFzcyh0emluZm8pID49IDApOworICAgIGFzc2VydCh0emluZm9hcmcgIT0gTlVMTCk7CiAKLQlpZiAodHppbmZvID09IFB5X05vbmUpIHsKLQkJcmVzdWx0ID0gUHlfTm9uZTsKLQkJUHlfSU5DUkVGKHJlc3VsdCk7Ci0JfQotCWVsc2UKLQkJcmVzdWx0ID0gUHlPYmplY3RfQ2FsbE1ldGhvZCh0emluZm8sICJ0em5hbWUiLCAiTyIsIHR6aW5mb2FyZyk7CisgICAgaWYgKHR6aW5mbyA9PSBQeV9Ob25lKSB7CisgICAgICAgIHJlc3VsdCA9IFB5X05vbmU7CisgICAgICAgIFB5X0lOQ1JFRihyZXN1bHQpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJlc3VsdCA9IFB5T2JqZWN0X0NhbGxNZXRob2QodHppbmZvLCAidHpuYW1lIiwgIk8iLCB0emluZm9hcmcpOwogCi0JaWYgKHJlc3VsdCAhPSBOVUxMICYmIHJlc3VsdCAhPSBQeV9Ob25lICYmICEgUHlTdHJpbmdfQ2hlY2socmVzdWx0KSkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAidHppbmZvLnR6bmFtZSgpIG11c3QgIgotCQkJICAgICAicmV0dXJuIE5vbmUgb3IgYSBzdHJpbmcsIG5vdCAnJXMnIiwKLQkJCSAgICAgUHlfVFlQRShyZXN1bHQpLT50cF9uYW1lKTsKLQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCXJlc3VsdCA9IE5VTEw7Ci0JfQotCXJldHVybiByZXN1bHQ7CisgICAgaWYgKHJlc3VsdCAhPSBOVUxMICYmIHJlc3VsdCAhPSBQeV9Ob25lICYmICEgUHlTdHJpbmdfQ2hlY2socmVzdWx0KSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAidHppbmZvLnR6bmFtZSgpIG11c3QgIgorICAgICAgICAgICAgICAgICAgICAgInJldHVybiBOb25lIG9yIGEgc3RyaW5nLCBub3QgJyVzJyIsCisgICAgICAgICAgICAgICAgICAgICBQeV9UWVBFKHJlc3VsdCktPnRwX25hbWUpOworICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgcmVzdWx0ID0gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogdHlwZWRlZiBlbnVtIHsKLQkgICAgICAvKiBhbiBleGNlcHRpb24gaGFzIGJlZW4gc2V0OyB0aGUgY2FsbGVyIHNob3VsZCBwYXNzIGl0IG9uICovCi0JICAgICAgT0ZGU0VUX0VSUk9SLAorICAgICAgICAgICAgICAvKiBhbiBleGNlcHRpb24gaGFzIGJlZW4gc2V0OyB0aGUgY2FsbGVyIHNob3VsZCBwYXNzIGl0IG9uICovCisgICAgICAgICAgT0ZGU0VUX0VSUk9SLAogCi0JICAgICAgLyogdHlwZSBpc24ndCBkYXRlLCBkYXRldGltZSwgb3IgdGltZSBzdWJjbGFzcyAqLwotCSAgICAgIE9GRlNFVF9VTktOT1dOLAorICAgICAgICAgIC8qIHR5cGUgaXNuJ3QgZGF0ZSwgZGF0ZXRpbWUsIG9yIHRpbWUgc3ViY2xhc3MgKi8KKyAgICAgICAgICBPRkZTRVRfVU5LTk9XTiwKIAotCSAgICAgIC8qIGRhdGUsCi0JICAgICAgICogZGF0ZXRpbWUgd2l0aCAhaGFzdHppbmZvCi0JICAgICAgICogZGF0ZXRpbWUgd2l0aCBOb25lIHR6aW5mbywKLQkgICAgICAgKiBkYXRldGltZSB3aGVyZSB1dGNvZmZzZXQoKSByZXR1cm5zIE5vbmUKLQkgICAgICAgKiB0aW1lIHdpdGggIWhhc3R6aW5mbwotCSAgICAgICAqIHRpbWUgd2l0aCBOb25lIHR6aW5mbywKLQkgICAgICAgKiB0aW1lIHdoZXJlIHV0Y29mZnNldCgpIHJldHVybnMgTm9uZQotCSAgICAgICAqLwotCSAgICAgIE9GRlNFVF9OQUlWRSwKKyAgICAgICAgICAvKiBkYXRlLAorICAgICAgICAgICAqIGRhdGV0aW1lIHdpdGggIWhhc3R6aW5mbworICAgICAgICAgICAqIGRhdGV0aW1lIHdpdGggTm9uZSB0emluZm8sCisgICAgICAgICAgICogZGF0ZXRpbWUgd2hlcmUgdXRjb2Zmc2V0KCkgcmV0dXJucyBOb25lCisgICAgICAgICAgICogdGltZSB3aXRoICFoYXN0emluZm8KKyAgICAgICAgICAgKiB0aW1lIHdpdGggTm9uZSB0emluZm8sCisgICAgICAgICAgICogdGltZSB3aGVyZSB1dGNvZmZzZXQoKSByZXR1cm5zIE5vbmUKKyAgICAgICAgICAgKi8KKyAgICAgICAgICBPRkZTRVRfTkFJVkUsCiAKLQkgICAgICAvKiB0aW1lIG9yIGRhdGV0aW1lIHdoZXJlIHV0Y29mZnNldCgpIGRvZXNuJ3QgcmV0dXJuIE5vbmUgKi8KLQkgICAgICBPRkZTRVRfQVdBUkUKKyAgICAgICAgICAvKiB0aW1lIG9yIGRhdGV0aW1lIHdoZXJlIHV0Y29mZnNldCgpIGRvZXNuJ3QgcmV0dXJuIE5vbmUgKi8KKyAgICAgICAgICBPRkZTRVRfQVdBUkUKIH0gbmFpdmV0eTsKIAogLyogQ2xhc3NpZnkgYW4gb2JqZWN0IGFzIHRvIHdoZXRoZXIgaXQncyBuYWl2ZSBvciBvZmZzZXQtYXdhcmUuICBTZWUKQEAgLTk4NywyMyArOTg3LDIzIEBACiBzdGF0aWMgbmFpdmV0eQogY2xhc3NpZnlfdXRjb2Zmc2V0KFB5T2JqZWN0ICpvcCwgUHlPYmplY3QgKnR6aW5mb2FyZywgaW50ICpvZmZzZXQpCiB7Ci0JaW50IG5vbmU7Ci0JUHlPYmplY3QgKnR6aW5mbzsKKyAgICBpbnQgbm9uZTsKKyAgICBQeU9iamVjdCAqdHppbmZvOwogCi0JYXNzZXJ0KHR6aW5mb2FyZyAhPSBOVUxMKTsKLQkqb2Zmc2V0ID0gMDsKLQl0emluZm8gPSBnZXRfdHppbmZvX21lbWJlcihvcCk7CS8qIE5VTEwgbWVhbnMgbm8gdHppbmZvLCBub3QgZXJyb3IgKi8KLQlpZiAodHppbmZvID09IFB5X05vbmUpCi0JCXJldHVybiBPRkZTRVRfTkFJVkU7Ci0JaWYgKHR6aW5mbyA9PSBOVUxMKSB7Ci0JCS8qIG5vdGUgdGhhdCBhIGRhdGV0aW1lIHBhc3NlcyB0aGUgUHlEYXRlX0NoZWNrIHRlc3QgKi8KLQkJcmV0dXJuIChQeVRpbWVfQ2hlY2sob3ApIHx8IFB5RGF0ZV9DaGVjayhvcCkpID8KLQkJICAgICAgIE9GRlNFVF9OQUlWRSA6IE9GRlNFVF9VTktOT1dOOwotCX0KLQkqb2Zmc2V0ID0gY2FsbF91dGNvZmZzZXQodHppbmZvLCB0emluZm9hcmcsICZub25lKTsKLQlpZiAoKm9mZnNldCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gT0ZGU0VUX0VSUk9SOwotCXJldHVybiBub25lID8gT0ZGU0VUX05BSVZFIDogT0ZGU0VUX0FXQVJFOworICAgIGFzc2VydCh0emluZm9hcmcgIT0gTlVMTCk7CisgICAgKm9mZnNldCA9IDA7CisgICAgdHppbmZvID0gZ2V0X3R6aW5mb19tZW1iZXIob3ApOyAgICAgLyogTlVMTCBtZWFucyBubyB0emluZm8sIG5vdCBlcnJvciAqLworICAgIGlmICh0emluZm8gPT0gUHlfTm9uZSkKKyAgICAgICAgcmV0dXJuIE9GRlNFVF9OQUlWRTsKKyAgICBpZiAodHppbmZvID09IE5VTEwpIHsKKyAgICAgICAgLyogbm90ZSB0aGF0IGEgZGF0ZXRpbWUgcGFzc2VzIHRoZSBQeURhdGVfQ2hlY2sgdGVzdCAqLworICAgICAgICByZXR1cm4gKFB5VGltZV9DaGVjayhvcCkgfHwgUHlEYXRlX0NoZWNrKG9wKSkgPworICAgICAgICAgICAgICAgT0ZGU0VUX05BSVZFIDogT0ZGU0VUX1VOS05PV047CisgICAgfQorICAgICpvZmZzZXQgPSBjYWxsX3V0Y29mZnNldCh0emluZm8sIHR6aW5mb2FyZywgJm5vbmUpOworICAgIGlmICgqb2Zmc2V0ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiBPRkZTRVRfRVJST1I7CisgICAgcmV0dXJuIG5vbmUgPyBPRkZTRVRfTkFJVkUgOiBPRkZTRVRfQVdBUkU7CiB9CiAKIC8qIENsYXNzaWZ5IHR3byBvYmplY3RzIGFzIHRvIHdoZXRoZXIgdGhleSdyZSBuYWl2ZSBvciBvZmZzZXQtYXdhcmUuCkBAIC0xMDE3LDIzICsxMDE3LDIzIEBACiAgKi8KIHN0YXRpYyBpbnQKIGNsYXNzaWZ5X3R3b191dGNvZmZzZXRzKFB5T2JqZWN0ICpvMSwgaW50ICpvZmZzZXQxLCBuYWl2ZXR5ICpuMSwKLQkJCVB5T2JqZWN0ICp0emluZm9hcmcxLAotCQkJUHlPYmplY3QgKm8yLCBpbnQgKm9mZnNldDIsIG5haXZldHkgKm4yLAotCQkJUHlPYmplY3QgKnR6aW5mb2FyZzIpCisgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqdHppbmZvYXJnMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpvMiwgaW50ICpvZmZzZXQyLCBuYWl2ZXR5ICpuMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICp0emluZm9hcmcyKQogewotCWlmIChnZXRfdHppbmZvX21lbWJlcihvMSkgPT0gZ2V0X3R6aW5mb19tZW1iZXIobzIpKSB7Ci0JCSpvZmZzZXQxID0gKm9mZnNldDIgPSAwOwotCQkqbjEgPSAqbjIgPSBPRkZTRVRfTkFJVkU7Ci0JfQotCWVsc2UgewotCQkqbjEgPSBjbGFzc2lmeV91dGNvZmZzZXQobzEsIHR6aW5mb2FyZzEsIG9mZnNldDEpOwotCQlpZiAoKm4xID09IE9GRlNFVF9FUlJPUikKLQkJCXJldHVybiAtMTsKLQkJKm4yID0gY2xhc3NpZnlfdXRjb2Zmc2V0KG8yLCB0emluZm9hcmcyLCBvZmZzZXQyKTsKLQkJaWYgKCpuMiA9PSBPRkZTRVRfRVJST1IpCi0JCQlyZXR1cm4gLTE7Ci0JfQotCXJldHVybiAwOworICAgIGlmIChnZXRfdHppbmZvX21lbWJlcihvMSkgPT0gZ2V0X3R6aW5mb19tZW1iZXIobzIpKSB7CisgICAgICAgICpvZmZzZXQxID0gKm9mZnNldDIgPSAwOworICAgICAgICAqbjEgPSAqbjIgPSBPRkZTRVRfTkFJVkU7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAqbjEgPSBjbGFzc2lmeV91dGNvZmZzZXQobzEsIHR6aW5mb2FyZzEsIG9mZnNldDEpOworICAgICAgICBpZiAoKm4xID09IE9GRlNFVF9FUlJPUikKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgKm4yID0gY2xhc3NpZnlfdXRjb2Zmc2V0KG8yLCB0emluZm9hcmcyLCBvZmZzZXQyKTsKKyAgICAgICAgaWYgKCpuMiA9PSBPRkZTRVRfRVJST1IpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiAwOwogfQogCiAvKiByZXByIGlzIGxpa2UgInNvbWVjbGFzcyhhcmcxLCBhcmcyKSIuICBJZiB0emluZm8gaXNuJ3QgTm9uZSwKQEAgLTEwNDQsMzAgKzEwNDQsMzAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBhcHBlbmRfa2V5d29yZF90emluZm8oUHlPYmplY3QgKnJlcHIsIFB5T2JqZWN0ICp0emluZm8pCiB7Ci0JUHlPYmplY3QgKnRlbXA7CisgICAgUHlPYmplY3QgKnRlbXA7CiAKLQlhc3NlcnQoUHlTdHJpbmdfQ2hlY2socmVwcikpOwotCWFzc2VydCh0emluZm8pOwotCWlmICh0emluZm8gPT0gUHlfTm9uZSkKLQkJcmV0dXJuIHJlcHI7Ci0JLyogR2V0IHJpZCBvZiB0aGUgdHJhaWxpbmcgJyknLiAqLwotCWFzc2VydChQeVN0cmluZ19Bc1N0cmluZyhyZXByKVtQeVN0cmluZ19TaXplKHJlcHIpLTFdID09ICcpJyk7Ci0JdGVtcCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKFB5U3RyaW5nX0FzU3RyaW5nKHJlcHIpLAotCQkJCQkgIFB5U3RyaW5nX1NpemUocmVwcikgLSAxKTsKLQlQeV9ERUNSRUYocmVwcik7Ci0JaWYgKHRlbXAgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JcmVwciA9IHRlbXA7CisgICAgYXNzZXJ0KFB5U3RyaW5nX0NoZWNrKHJlcHIpKTsKKyAgICBhc3NlcnQodHppbmZvKTsKKyAgICBpZiAodHppbmZvID09IFB5X05vbmUpCisgICAgICAgIHJldHVybiByZXByOworICAgIC8qIEdldCByaWQgb2YgdGhlIHRyYWlsaW5nICcpJy4gKi8KKyAgICBhc3NlcnQoUHlTdHJpbmdfQXNTdHJpbmcocmVwcilbUHlTdHJpbmdfU2l6ZShyZXByKS0xXSA9PSAnKScpOworICAgIHRlbXAgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShQeVN0cmluZ19Bc1N0cmluZyhyZXByKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfU2l6ZShyZXByKSAtIDEpOworICAgIFB5X0RFQ1JFRihyZXByKTsKKyAgICBpZiAodGVtcCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXByID0gdGVtcDsKIAotCS8qIEFwcGVuZCAiLCB0emluZm89Ii4gKi8KLQlQeVN0cmluZ19Db25jYXRBbmREZWwoJnJlcHIsIFB5U3RyaW5nX0Zyb21TdHJpbmcoIiwgdHppbmZvPSIpKTsKKyAgICAvKiBBcHBlbmQgIiwgdHppbmZvPSIuICovCisgICAgUHlTdHJpbmdfQ29uY2F0QW5kRGVsKCZyZXByLCBQeVN0cmluZ19Gcm9tU3RyaW5nKCIsIHR6aW5mbz0iKSk7CiAKLQkvKiBBcHBlbmQgcmVwcih0emluZm8pLiAqLwotCVB5U3RyaW5nX0NvbmNhdEFuZERlbCgmcmVwciwgUHlPYmplY3RfUmVwcih0emluZm8pKTsKKyAgICAvKiBBcHBlbmQgcmVwcih0emluZm8pLiAqLworICAgIFB5U3RyaW5nX0NvbmNhdEFuZERlbCgmcmVwciwgUHlPYmplY3RfUmVwcih0emluZm8pKTsKIAotCS8qIEFkZCBhIGNsb3NpbmcgcGFyZW4uICovCi0JUHlTdHJpbmdfQ29uY2F0QW5kRGVsKCZyZXByLCBQeVN0cmluZ19Gcm9tU3RyaW5nKCIpIikpOwotCXJldHVybiByZXByOworICAgIC8qIEFkZCBhIGNsb3NpbmcgcGFyZW4uICovCisgICAgUHlTdHJpbmdfQ29uY2F0QW5kRGVsKCZyZXByLCBQeVN0cmluZ19Gcm9tU3RyaW5nKCIpIikpOworICAgIHJldHVybiByZXByOwogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTEwNzcsMjIgKzEwNzcsMjIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBmb3JtYXRfY3RpbWUoUHlEYXRlVGltZV9EYXRlICpkYXRlLCBpbnQgaG91cnMsIGludCBtaW51dGVzLCBpbnQgc2Vjb25kcykKIHsKLQlzdGF0aWMgY29uc3QgY2hhciAqRGF5TmFtZXNbXSA9IHsKLQkJIk1vbiIsICJUdWUiLCAiV2VkIiwgIlRodSIsICJGcmkiLCAiU2F0IiwgIlN1biIKLQl9OwotCXN0YXRpYyBjb25zdCBjaGFyICpNb250aE5hbWVzW10gPSB7Ci0JCSJKYW4iLCAiRmViIiwgIk1hciIsICJBcHIiLCAiTWF5IiwgIkp1biIsCi0JCSJKdWwiLCAiQXVnIiwgIlNlcCIsICJPY3QiLCAiTm92IiwgIkRlYyIKLQl9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICpEYXlOYW1lc1tdID0geworICAgICAgICAiTW9uIiwgIlR1ZSIsICJXZWQiLCAiVGh1IiwgIkZyaSIsICJTYXQiLCAiU3VuIgorICAgIH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKk1vbnRoTmFtZXNbXSA9IHsKKyAgICAgICAgIkphbiIsICJGZWIiLCAiTWFyIiwgIkFwciIsICJNYXkiLCAiSnVuIiwKKyAgICAgICAgIkp1bCIsICJBdWciLCAiU2VwIiwgIk9jdCIsICJOb3YiLCAiRGVjIgorICAgIH07CiAKLQljaGFyIGJ1ZmZlclsxMjhdOwotCWludCB3ZGF5ID0gd2Vla2RheShHRVRfWUVBUihkYXRlKSwgR0VUX01PTlRIKGRhdGUpLCBHRVRfREFZKGRhdGUpKTsKKyAgICBjaGFyIGJ1ZmZlclsxMjhdOworICAgIGludCB3ZGF5ID0gd2Vla2RheShHRVRfWUVBUihkYXRlKSwgR0VUX01PTlRIKGRhdGUpLCBHRVRfREFZKGRhdGUpKTsKIAotCVB5T1Nfc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgIiVzICVzICUyZCAlMDJkOiUwMmQ6JTAyZCAlMDRkIiwKLQkJICAgICAgRGF5TmFtZXNbd2RheV0sIE1vbnRoTmFtZXNbR0VUX01PTlRIKGRhdGUpIC0gMV0sCi0JCSAgICAgIEdFVF9EQVkoZGF0ZSksIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzLAotCQkgICAgICBHRVRfWUVBUihkYXRlKSk7Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmZmVyKTsKKyAgICBQeU9TX3NucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICIlcyAlcyAlMmQgJTAyZDolMDJkOiUwMmQgJTA0ZCIsCisgICAgICAgICAgICAgICAgICBEYXlOYW1lc1t3ZGF5XSwgTW9udGhOYW1lc1tHRVRfTU9OVEgoZGF0ZSkgLSAxXSwKKyAgICAgICAgICAgICAgICAgIEdFVF9EQVkoZGF0ZSksIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzLAorICAgICAgICAgICAgICAgICAgR0VUX1lFQVIoZGF0ZSkpOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1ZmZlcik7CiB9CiAKIC8qIEFkZCBhbiBob3VycyAmIG1pbnV0ZXMgVVRDIG9mZnNldCBzdHJpbmcgdG8gYnVmLiAgYnVmIGhhcyBubyBtb3JlIHRoYW4KQEAgLTExMDcsNDUgKzExMDcsNDUgQEAKICAqLwogc3RhdGljIGludAogZm9ybWF0X3V0Y29mZnNldChjaGFyICpidWYsIHNpemVfdCBidWZsZW4sIGNvbnN0IGNoYXIgKnNlcCwKLQkJUHlPYmplY3QgKnR6aW5mbywgUHlPYmplY3QgKnR6aW5mb2FyZykKKyAgICAgICAgICAgICAgICBQeU9iamVjdCAqdHppbmZvLCBQeU9iamVjdCAqdHppbmZvYXJnKQogewotCWludCBvZmZzZXQ7Ci0JaW50IGhvdXJzOwotCWludCBtaW51dGVzOwotCWNoYXIgc2lnbjsKLQlpbnQgbm9uZTsKKyAgICBpbnQgb2Zmc2V0OworICAgIGludCBob3VyczsKKyAgICBpbnQgbWludXRlczsKKyAgICBjaGFyIHNpZ247CisgICAgaW50IG5vbmU7CiAKLQlhc3NlcnQoYnVmbGVuID49IDEpOworICAgIGFzc2VydChidWZsZW4gPj0gMSk7CiAKLQlvZmZzZXQgPSBjYWxsX3V0Y29mZnNldCh0emluZm8sIHR6aW5mb2FyZywgJm5vbmUpOwotCWlmIChvZmZzZXQgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIC0xOwotCWlmIChub25lKSB7Ci0JCSpidWYgPSAnXDAnOwotCQlyZXR1cm4gMDsKLQl9Ci0Jc2lnbiA9ICcrJzsKLQlpZiAob2Zmc2V0IDwgMCkgewotCQlzaWduID0gJy0nOwotCQlvZmZzZXQgPSAtIG9mZnNldDsKLQl9Ci0JaG91cnMgPSBkaXZtb2Qob2Zmc2V0LCA2MCwgJm1pbnV0ZXMpOwotCVB5T1Nfc25wcmludGYoYnVmLCBidWZsZW4sICIlYyUwMmQlcyUwMmQiLCBzaWduLCBob3Vycywgc2VwLCBtaW51dGVzKTsKLQlyZXR1cm4gMDsKKyAgICBvZmZzZXQgPSBjYWxsX3V0Y29mZnNldCh0emluZm8sIHR6aW5mb2FyZywgJm5vbmUpOworICAgIGlmIChvZmZzZXQgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmIChub25lKSB7CisgICAgICAgICpidWYgPSAnXDAnOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgc2lnbiA9ICcrJzsKKyAgICBpZiAob2Zmc2V0IDwgMCkgeworICAgICAgICBzaWduID0gJy0nOworICAgICAgICBvZmZzZXQgPSAtIG9mZnNldDsKKyAgICB9CisgICAgaG91cnMgPSBkaXZtb2Qob2Zmc2V0LCA2MCwgJm1pbnV0ZXMpOworICAgIFB5T1Nfc25wcmludGYoYnVmLCBidWZsZW4sICIlYyUwMmQlcyUwMmQiLCBzaWduLCBob3Vycywgc2VwLCBtaW51dGVzKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG1ha2VfZnJlcGxhY2VtZW50KFB5T2JqZWN0ICpvYmplY3QpCiB7Ci0JY2hhciBmcmVwbGFjZW1lbnRbNjRdOwotCWlmIChQeVRpbWVfQ2hlY2sob2JqZWN0KSkKLQkgICAgc3ByaW50ZihmcmVwbGFjZW1lbnQsICIlMDZkIiwgVElNRV9HRVRfTUlDUk9TRUNPTkQob2JqZWN0KSk7Ci0JZWxzZSBpZiAoUHlEYXRlVGltZV9DaGVjayhvYmplY3QpKQotCSAgICBzcHJpbnRmKGZyZXBsYWNlbWVudCwgIiUwNmQiLCBEQVRFX0dFVF9NSUNST1NFQ09ORChvYmplY3QpKTsKLQllbHNlCi0JICAgIHNwcmludGYoZnJlcGxhY2VtZW50LCAiJTA2ZCIsIDApOworICAgIGNoYXIgZnJlcGxhY2VtZW50WzY0XTsKKyAgICBpZiAoUHlUaW1lX0NoZWNrKG9iamVjdCkpCisgICAgICAgIHNwcmludGYoZnJlcGxhY2VtZW50LCAiJTA2ZCIsIFRJTUVfR0VUX01JQ1JPU0VDT05EKG9iamVjdCkpOworICAgIGVsc2UgaWYgKFB5RGF0ZVRpbWVfQ2hlY2sob2JqZWN0KSkKKyAgICAgICAgc3ByaW50ZihmcmVwbGFjZW1lbnQsICIlMDZkIiwgREFURV9HRVRfTUlDUk9TRUNPTkQob2JqZWN0KSk7CisgICAgZWxzZQorICAgICAgICBzcHJpbnRmKGZyZXBsYWNlbWVudCwgIiUwNmQiLCAwKTsKIAotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShmcmVwbGFjZW1lbnQsIHN0cmxlbihmcmVwbGFjZW1lbnQpKTsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoZnJlcGxhY2VtZW50LCBzdHJsZW4oZnJlcGxhY2VtZW50KSk7CiB9CiAKIC8qIEkgc3VyZSBkb24ndCB3YW50IHRvIHJlcHJvZHVjZSB0aGUgc3RyZnRpbWUgY29kZSBmcm9tIHRoZSB0aW1lIG1vZHVsZSwKQEAgLTExNTcsMjMxICsxMTU3LDIzMSBAQAogICovCiBzdGF0aWMgUHlPYmplY3QgKgogd3JhcF9zdHJmdGltZShQeU9iamVjdCAqb2JqZWN0LCBjb25zdCBjaGFyICpmb3JtYXQsIHNpemVfdCBmb3JtYXRfbGVuLAotCQlQeU9iamVjdCAqdGltZXR1cGxlLCBQeU9iamVjdCAqdHppbmZvYXJnKQorICAgICAgICAgICAgICAgIFB5T2JqZWN0ICp0aW1ldHVwbGUsIFB5T2JqZWN0ICp0emluZm9hcmcpCiB7Ci0JUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7CS8qIGd1aWx0eSB1bnRpbCBwcm92ZWQgaW5ub2NlbnQgKi8KKyAgICBQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsgICAgICAgICAgICAvKiBndWlsdHkgdW50aWwgcHJvdmVkIGlubm9jZW50ICovCiAKLQlQeU9iamVjdCAqenJlcGxhY2VtZW50ID0gTlVMTDsJLyogcHkgc3RyaW5nLCByZXBsYWNlbWVudCBmb3IgJXogKi8KLQlQeU9iamVjdCAqWnJlcGxhY2VtZW50ID0gTlVMTDsJLyogcHkgc3RyaW5nLCByZXBsYWNlbWVudCBmb3IgJVogKi8KLQlQeU9iamVjdCAqZnJlcGxhY2VtZW50ID0gTlVMTDsJLyogcHkgc3RyaW5nLCByZXBsYWNlbWVudCBmb3IgJWYgKi8KKyAgICBQeU9iamVjdCAqenJlcGxhY2VtZW50ID0gTlVMTDsgICAgICAvKiBweSBzdHJpbmcsIHJlcGxhY2VtZW50IGZvciAleiAqLworICAgIFB5T2JqZWN0ICpacmVwbGFjZW1lbnQgPSBOVUxMOyAgICAgIC8qIHB5IHN0cmluZywgcmVwbGFjZW1lbnQgZm9yICVaICovCisgICAgUHlPYmplY3QgKmZyZXBsYWNlbWVudCA9IE5VTEw7ICAgICAgLyogcHkgc3RyaW5nLCByZXBsYWNlbWVudCBmb3IgJWYgKi8KIAotCWNvbnN0IGNoYXIgKnBpbjsJLyogcG9pbnRlciB0byBuZXh0IGNoYXIgaW4gaW5wdXQgZm9ybWF0ICovCi0JY2hhciBjaDsJCS8qIG5leHQgY2hhciBpbiBpbnB1dCBmb3JtYXQgKi8KKyAgICBjb25zdCBjaGFyICpwaW47ICAgICAgICAgICAgLyogcG9pbnRlciB0byBuZXh0IGNoYXIgaW4gaW5wdXQgZm9ybWF0ICovCisgICAgY2hhciBjaDsgICAgICAgICAgICAgICAgICAgIC8qIG5leHQgY2hhciBpbiBpbnB1dCBmb3JtYXQgKi8KIAotCVB5T2JqZWN0ICpuZXdmbXQgPSBOVUxMOwkvKiBweSBzdHJpbmcsIHRoZSBvdXRwdXQgZm9ybWF0ICovCi0JY2hhciAqcG5ldzsJLyogcG9pbnRlciB0byBhdmFpbGFibGUgYnl0ZSBpbiBvdXRwdXQgZm9ybWF0ICovCi0Jc2l6ZV90IHRvdGFsbmV3OwkvKiBudW1iZXIgYnl0ZXMgdG90YWwgaW4gb3V0cHV0IGZvcm1hdCBidWZmZXIsCi0JCQkJICAgZXhjbHVzaXZlIG9mIHRyYWlsaW5nIFwwICovCi0Jc2l6ZV90IHVzZWRuZXc7CS8qIG51bWJlciBieXRlcyB1c2VkIHNvIGZhciBpbiBvdXRwdXQgZm9ybWF0IGJ1ZmZlciAqLworICAgIFB5T2JqZWN0ICpuZXdmbXQgPSBOVUxMOyAgICAgICAgICAgIC8qIHB5IHN0cmluZywgdGhlIG91dHB1dCBmb3JtYXQgKi8KKyAgICBjaGFyICpwbmV3OyAgICAgICAgIC8qIHBvaW50ZXIgdG8gYXZhaWxhYmxlIGJ5dGUgaW4gb3V0cHV0IGZvcm1hdCAqLworICAgIHNpemVfdCB0b3RhbG5ldzsgICAgICAgICAgICAvKiBudW1iZXIgYnl0ZXMgdG90YWwgaW4gb3V0cHV0IGZvcm1hdCBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjbHVzaXZlIG9mIHRyYWlsaW5nIFwwICovCisgICAgc2l6ZV90IHVzZWRuZXc7ICAgICAvKiBudW1iZXIgYnl0ZXMgdXNlZCBzbyBmYXIgaW4gb3V0cHV0IGZvcm1hdCBidWZmZXIgKi8KIAotCWNvbnN0IGNoYXIgKnB0b2FwcGVuZDsJLyogcHRyIHRvIHN0cmluZyB0byBhcHBlbmQgdG8gb3V0cHV0IGJ1ZmZlciAqLwotCXNpemVfdCBudG9hcHBlbmQ7CS8qICMgb2YgYnl0ZXMgdG8gYXBwZW5kIHRvIG91dHB1dCBidWZmZXIgKi8KKyAgICBjb25zdCBjaGFyICpwdG9hcHBlbmQ7ICAgICAgLyogcHRyIHRvIHN0cmluZyB0byBhcHBlbmQgdG8gb3V0cHV0IGJ1ZmZlciAqLworICAgIHNpemVfdCBudG9hcHBlbmQ7ICAgICAgICAgICAvKiAjIG9mIGJ5dGVzIHRvIGFwcGVuZCB0byBvdXRwdXQgYnVmZmVyICovCiAKLQlhc3NlcnQob2JqZWN0ICYmIGZvcm1hdCAmJiB0aW1ldHVwbGUpOworICAgIGFzc2VydChvYmplY3QgJiYgZm9ybWF0ICYmIHRpbWV0dXBsZSk7CiAKLQkvKiBHaXZlIHVwIGlmIHRoZSB5ZWFyIGlzIGJlZm9yZSAxOTAwLgotCSAqIFB5dGhvbiBzdHJmdGltZSgpIHBsYXlzIGdhbWVzIHdpdGggdGhlIHllYXIsIGFuZCBkaWZmZXJlbnQKLQkgKiBnYW1lcyBkZXBlbmRpbmcgb24gd2hldGhlciBlbnZhciBQWVRIT04ySyBpcyBzZXQuICBUaGlzIG1ha2VzCi0JICogeWVhcnMgYmVmb3JlIDE5MDAgYSBuaWdodG1hcmUsIGV2ZW4gaWYgdGhlIHBsYXRmb3JtIHN0cmZ0aW1lCi0JICogc3VwcG9ydHMgdGhlbSAoYW5kIG5vdCBhbGwgZG8pLgotCSAqIFdlIGNvdWxkIGdldCBhIGxvdCBmYXJ0aGVyIGhlcmUgYnkgYXZvaWRpbmcgUHl0aG9uJ3Mgc3RyZnRpbWUKLQkgKiB3cmFwcGVyIGFuZCBjYWxsaW5nIHRoZSBDIHN0cmZ0aW1lKCkgZGlyZWN0bHksIGJ1dCB0aGF0IGlzbid0Ci0JICogYW4gb3B0aW9uIGluIHRoZSBQeXRob24gaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtb2R1bGUuCi0JICovCi0JewotCQlsb25nIHllYXI7Ci0JCVB5T2JqZWN0ICpweXllYXIgPSBQeVNlcXVlbmNlX0dldEl0ZW0odGltZXR1cGxlLCAwKTsKLQkJaWYgKHB5eWVhciA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkJYXNzZXJ0KFB5SW50X0NoZWNrKHB5eWVhcikpOwotCQl5ZWFyID0gUHlJbnRfQXNMb25nKHB5eWVhcik7Ci0JCVB5X0RFQ1JFRihweXllYXIpOwotCQlpZiAoeWVhciA8IDE5MDApIHsKLQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLCAieWVhcj0lbGQgaXMgYmVmb3JlICIKLQkJCQkgICAgICIxOTAwOyB0aGUgZGF0ZXRpbWUgc3RyZnRpbWUoKSAiCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWV0aG9kcyByZXF1aXJlIHllYXIgPj0gMTkwMCIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ZWFyKTsKLQkgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0JCX0KLQl9CisgICAgLyogR2l2ZSB1cCBpZiB0aGUgeWVhciBpcyBiZWZvcmUgMTkwMC4KKyAgICAgKiBQeXRob24gc3RyZnRpbWUoKSBwbGF5cyBnYW1lcyB3aXRoIHRoZSB5ZWFyLCBhbmQgZGlmZmVyZW50CisgICAgICogZ2FtZXMgZGVwZW5kaW5nIG9uIHdoZXRoZXIgZW52YXIgUFlUSE9OMksgaXMgc2V0LiAgVGhpcyBtYWtlcworICAgICAqIHllYXJzIGJlZm9yZSAxOTAwIGEgbmlnaHRtYXJlLCBldmVuIGlmIHRoZSBwbGF0Zm9ybSBzdHJmdGltZQorICAgICAqIHN1cHBvcnRzIHRoZW0gKGFuZCBub3QgYWxsIGRvKS4KKyAgICAgKiBXZSBjb3VsZCBnZXQgYSBsb3QgZmFydGhlciBoZXJlIGJ5IGF2b2lkaW5nIFB5dGhvbidzIHN0cmZ0aW1lCisgICAgICogd3JhcHBlciBhbmQgY2FsbGluZyB0aGUgQyBzdHJmdGltZSgpIGRpcmVjdGx5LCBidXQgdGhhdCBpc24ndAorICAgICAqIGFuIG9wdGlvbiBpbiB0aGUgUHl0aG9uIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbW9kdWxlLgorICAgICAqLworICAgIHsKKyAgICAgICAgbG9uZyB5ZWFyOworICAgICAgICBQeU9iamVjdCAqcHl5ZWFyID0gUHlTZXF1ZW5jZV9HZXRJdGVtKHRpbWV0dXBsZSwgMCk7CisgICAgICAgIGlmIChweXllYXIgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgICAgIGFzc2VydChQeUludF9DaGVjayhweXllYXIpKTsKKyAgICAgICAgeWVhciA9IFB5SW50X0FzTG9uZyhweXllYXIpOworICAgICAgICBQeV9ERUNSRUYocHl5ZWFyKTsKKyAgICAgICAgaWYgKHllYXIgPCAxOTAwKSB7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwgInllYXI9JWxkIGlzIGJlZm9yZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgIjE5MDA7IHRoZSBkYXRldGltZSBzdHJmdGltZSgpICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAibWV0aG9kcyByZXF1aXJlIHllYXIgPj0gMTkwMCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgeWVhcik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KIAotCS8qIFNjYW4gdGhlIGlucHV0IGZvcm1hdCwgbG9va2luZyBmb3IgJXovJVovJWYgZXNjYXBlcywgYnVpbGRpbmcKLQkgKiBhIG5ldyBmb3JtYXQuICBTaW5jZSBjb21wdXRpbmcgdGhlIHJlcGxhY2VtZW50cyBmb3IgdGhvc2UgY29kZXMKLQkgKiBpcyBleHBlbnNpdmUsIGRvbid0IHVubGVzcyB0aGV5J3JlIGFjdHVhbGx5IHVzZWQuCi0JICovCi0JaWYgKGZvcm1hdF9sZW4gPiBJTlRfTUFYIC0gMSkgewotCQlQeUVycl9Ob01lbW9yeSgpOwotCQlnb3RvIERvbmU7Ci0JfQorICAgIC8qIFNjYW4gdGhlIGlucHV0IGZvcm1hdCwgbG9va2luZyBmb3IgJXovJVovJWYgZXNjYXBlcywgYnVpbGRpbmcKKyAgICAgKiBhIG5ldyBmb3JtYXQuICBTaW5jZSBjb21wdXRpbmcgdGhlIHJlcGxhY2VtZW50cyBmb3IgdGhvc2UgY29kZXMKKyAgICAgKiBpcyBleHBlbnNpdmUsIGRvbid0IHVubGVzcyB0aGV5J3JlIGFjdHVhbGx5IHVzZWQuCisgICAgICovCisgICAgaWYgKGZvcm1hdF9sZW4gPiBJTlRfTUFYIC0gMSkgeworICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICBnb3RvIERvbmU7CisgICAgfQogCi0JdG90YWxuZXcgPSBmb3JtYXRfbGVuICsgMTsJLyogcmVhbGlzdGljIGlmIG5vICV6LyVaLyVmICovCi0JbmV3Zm10ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgdG90YWxuZXcpOwotCWlmIChuZXdmbXQgPT0gTlVMTCkgZ290byBEb25lOwotCXBuZXcgPSBQeVN0cmluZ19Bc1N0cmluZyhuZXdmbXQpOwotCXVzZWRuZXcgPSAwOworICAgIHRvdGFsbmV3ID0gZm9ybWF0X2xlbiArIDE7ICAgICAgICAgIC8qIHJlYWxpc3RpYyBpZiBubyAlei8lWi8lZiAqLworICAgIG5ld2ZtdCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIHRvdGFsbmV3KTsKKyAgICBpZiAobmV3Zm10ID09IE5VTEwpIGdvdG8gRG9uZTsKKyAgICBwbmV3ID0gUHlTdHJpbmdfQXNTdHJpbmcobmV3Zm10KTsKKyAgICB1c2VkbmV3ID0gMDsKIAotCXBpbiA9IGZvcm1hdDsKLQl3aGlsZSAoKGNoID0gKnBpbisrKSAhPSAnXDAnKSB7Ci0JCWlmIChjaCAhPSAnJScpIHsKLQkJCXB0b2FwcGVuZCA9IHBpbiAtIDE7Ci0JCQludG9hcHBlbmQgPSAxOwotCQl9Ci0JCWVsc2UgaWYgKChjaCA9ICpwaW4rKykgPT0gJ1wwJykgewotCQkJLyogVGhlcmUncyBhIGxvbmUgdHJhaWxpbmcgJTsgZG9lc24ndCBtYWtlIHNlbnNlLiAqLwotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJzdHJmdGltZSBmb3JtYXQgIgotCQkJCQkiZW5kcyB3aXRoIHJhdyAlIik7Ci0JCQlnb3RvIERvbmU7Ci0JCX0KLQkJLyogQSAlIGhhcyBiZWVuIHNlZW4gYW5kIGNoIGlzIHRoZSBjaGFyYWN0ZXIgYWZ0ZXIgaXQuICovCi0JCWVsc2UgaWYgKGNoID09ICd6JykgewotCQkJaWYgKHpyZXBsYWNlbWVudCA9PSBOVUxMKSB7Ci0JCQkJLyogZm9ybWF0IHV0Y29mZnNldCAqLwotCQkJCWNoYXIgYnVmWzEwMF07Ci0JCQkJUHlPYmplY3QgKnR6aW5mbyA9IGdldF90emluZm9fbWVtYmVyKG9iamVjdCk7Ci0JCQkJenJlcGxhY2VtZW50ID0gUHlTdHJpbmdfRnJvbVN0cmluZygiIik7Ci0JCQkJaWYgKHpyZXBsYWNlbWVudCA9PSBOVUxMKSBnb3RvIERvbmU7Ci0JCQkJaWYgKHR6aW5mbyAhPSBQeV9Ob25lICYmIHR6aW5mbyAhPSBOVUxMKSB7Ci0JCQkJCWFzc2VydCh0emluZm9hcmcgIT0gTlVMTCk7Ci0JCQkJCWlmIChmb3JtYXRfdXRjb2Zmc2V0KGJ1ZiwKLQkJCQkJCQkgICAgIHNpemVvZihidWYpLAotCQkJCQkJCSAgICAgIiIsCi0JCQkJCQkJICAgICB0emluZm8sCi0JCQkJCQkJICAgICB0emluZm9hcmcpIDwgMCkKLQkJCQkJCWdvdG8gRG9uZTsKLQkJCQkJUHlfREVDUkVGKHpyZXBsYWNlbWVudCk7Ci0JCQkJCXpyZXBsYWNlbWVudCA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmKTsKLQkJCQkJaWYgKHpyZXBsYWNlbWVudCA9PSBOVUxMKSBnb3RvIERvbmU7Ci0JCQkJfQotCQkJfQotCQkJYXNzZXJ0KHpyZXBsYWNlbWVudCAhPSBOVUxMKTsKLQkJCXB0b2FwcGVuZCA9IFB5U3RyaW5nX0FTX1NUUklORyh6cmVwbGFjZW1lbnQpOwotCQkJbnRvYXBwZW5kID0gUHlTdHJpbmdfR0VUX1NJWkUoenJlcGxhY2VtZW50KTsKLQkJfQotCQllbHNlIGlmIChjaCA9PSAnWicpIHsKLQkJCS8qIGZvcm1hdCB0em5hbWUgKi8KLQkJCWlmIChacmVwbGFjZW1lbnQgPT0gTlVMTCkgewotCQkJCVB5T2JqZWN0ICp0emluZm8gPSBnZXRfdHppbmZvX21lbWJlcihvYmplY3QpOwotCQkJCVpyZXBsYWNlbWVudCA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIiIpOwotCQkJCWlmIChacmVwbGFjZW1lbnQgPT0gTlVMTCkgZ290byBEb25lOwotCQkJCWlmICh0emluZm8gIT0gUHlfTm9uZSAmJiB0emluZm8gIT0gTlVMTCkgewotCQkJCQlQeU9iamVjdCAqdGVtcDsKLQkJCQkJYXNzZXJ0KHR6aW5mb2FyZyAhPSBOVUxMKTsKLQkJCQkJdGVtcCA9IGNhbGxfdHpuYW1lKHR6aW5mbywgdHppbmZvYXJnKTsKLQkJCQkJaWYgKHRlbXAgPT0gTlVMTCkgZ290byBEb25lOwotCQkJCQlpZiAodGVtcCAhPSBQeV9Ob25lKSB7Ci0JCQkJCQlhc3NlcnQoUHlTdHJpbmdfQ2hlY2sodGVtcCkpOwotCQkJCQkJLyogU2luY2UgdGhlIHR6bmFtZSBpcyBnZXR0aW5nCi0JCQkJCQkgKiBzdHVmZmVkIGludG8gdGhlIGZvcm1hdCwgd2UKLQkJCQkJCSAqIGhhdmUgdG8gZG91YmxlIGFueSAlIHNpZ25zCi0JCQkJCQkgKiBzbyB0aGF0IHN0cmZ0aW1lIGRvZXNuJ3QKLQkJCQkJCSAqIHRyZWF0IHRoZW0gYXMgZm9ybWF0IGNvZGVzLgotCQkJCQkJICovCi0JCQkJCQlQeV9ERUNSRUYoWnJlcGxhY2VtZW50KTsKLQkJCQkJCVpyZXBsYWNlbWVudCA9IFB5T2JqZWN0X0NhbGxNZXRob2QoCi0JCQkJCQkJdGVtcCwgInJlcGxhY2UiLAotCQkJCQkJCSJzcyIsICIlIiwgIiUlIik7Ci0JCQkJCQlQeV9ERUNSRUYodGVtcCk7Ci0JCQkJCQlpZiAoWnJlcGxhY2VtZW50ID09IE5VTEwpCi0JCQkJCQkJZ290byBEb25lOwotCQkJCQkJaWYgKCFQeVN0cmluZ19DaGVjayhacmVwbGFjZW1lbnQpKSB7Ci0JCQkJCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgInR6bmFtZS5yZXBsYWNlKCkgZGlkIG5vdCByZXR1cm4gYSBzdHJpbmciKTsKLQkJCQkJCQlnb3RvIERvbmU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQkJUHlfREVDUkVGKHRlbXApOwotCQkJCX0KLQkJCX0KLQkJCWFzc2VydChacmVwbGFjZW1lbnQgIT0gTlVMTCk7Ci0JCQlwdG9hcHBlbmQgPSBQeVN0cmluZ19BU19TVFJJTkcoWnJlcGxhY2VtZW50KTsKLQkJCW50b2FwcGVuZCA9IFB5U3RyaW5nX0dFVF9TSVpFKFpyZXBsYWNlbWVudCk7Ci0JCX0KLQkJZWxzZSBpZiAoY2ggPT0gJ2YnKSB7Ci0JCQkvKiBmb3JtYXQgbWljcm9zZWNvbmRzICovCi0JCQlpZiAoZnJlcGxhY2VtZW50ID09IE5VTEwpIHsKLQkJCQlmcmVwbGFjZW1lbnQgPSBtYWtlX2ZyZXBsYWNlbWVudChvYmplY3QpOwotCQkJCWlmIChmcmVwbGFjZW1lbnQgPT0gTlVMTCkKLQkJCQkJZ290byBEb25lOwotCQkJfQotCQkJYXNzZXJ0KGZyZXBsYWNlbWVudCAhPSBOVUxMKTsKLQkJCWFzc2VydChQeVN0cmluZ19DaGVjayhmcmVwbGFjZW1lbnQpKTsKLQkJCXB0b2FwcGVuZCA9IFB5U3RyaW5nX0FTX1NUUklORyhmcmVwbGFjZW1lbnQpOwotCQkJbnRvYXBwZW5kID0gUHlTdHJpbmdfR0VUX1NJWkUoZnJlcGxhY2VtZW50KTsKLQkJfQotCQllbHNlIHsKLQkJCS8qIHBlcmNlbnQgZm9sbG93ZWQgYnkgbmVpdGhlciB6IG5vciBaICovCi0JCQlwdG9hcHBlbmQgPSBwaW4gLSAyOwotCQkJbnRvYXBwZW5kID0gMjsKLQkJfQorICAgIHBpbiA9IGZvcm1hdDsKKyAgICB3aGlsZSAoKGNoID0gKnBpbisrKSAhPSAnXDAnKSB7CisgICAgICAgIGlmIChjaCAhPSAnJScpIHsKKyAgICAgICAgICAgIHB0b2FwcGVuZCA9IHBpbiAtIDE7CisgICAgICAgICAgICBudG9hcHBlbmQgPSAxOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKChjaCA9ICpwaW4rKykgPT0gJ1wwJykgeworICAgICAgICAgICAgLyogVGhlcmUncyBhIGxvbmUgdHJhaWxpbmcgJTsgZG9lc24ndCBtYWtlIHNlbnNlLiAqLworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJzdHJmdGltZSBmb3JtYXQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbmRzIHdpdGggcmF3ICUiKTsKKyAgICAgICAgICAgIGdvdG8gRG9uZTsKKyAgICAgICAgfQorICAgICAgICAvKiBBICUgaGFzIGJlZW4gc2VlbiBhbmQgY2ggaXMgdGhlIGNoYXJhY3RlciBhZnRlciBpdC4gKi8KKyAgICAgICAgZWxzZSBpZiAoY2ggPT0gJ3onKSB7CisgICAgICAgICAgICBpZiAoenJlcGxhY2VtZW50ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAvKiBmb3JtYXQgdXRjb2Zmc2V0ICovCisgICAgICAgICAgICAgICAgY2hhciBidWZbMTAwXTsKKyAgICAgICAgICAgICAgICBQeU9iamVjdCAqdHppbmZvID0gZ2V0X3R6aW5mb19tZW1iZXIob2JqZWN0KTsKKyAgICAgICAgICAgICAgICB6cmVwbGFjZW1lbnQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCIiKTsKKyAgICAgICAgICAgICAgICBpZiAoenJlcGxhY2VtZW50ID09IE5VTEwpIGdvdG8gRG9uZTsKKyAgICAgICAgICAgICAgICBpZiAodHppbmZvICE9IFB5X05vbmUgJiYgdHppbmZvICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHR6aW5mb2FyZyAhPSBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZvcm1hdF91dGNvZmZzZXQoYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoYnVmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR6aW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHppbmZvYXJnKSA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIERvbmU7CisgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih6cmVwbGFjZW1lbnQpOworICAgICAgICAgICAgICAgICAgICB6cmVwbGFjZW1lbnQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CisgICAgICAgICAgICAgICAgICAgIGlmICh6cmVwbGFjZW1lbnQgPT0gTlVMTCkgZ290byBEb25lOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFzc2VydCh6cmVwbGFjZW1lbnQgIT0gTlVMTCk7CisgICAgICAgICAgICBwdG9hcHBlbmQgPSBQeVN0cmluZ19BU19TVFJJTkcoenJlcGxhY2VtZW50KTsKKyAgICAgICAgICAgIG50b2FwcGVuZCA9IFB5U3RyaW5nX0dFVF9TSVpFKHpyZXBsYWNlbWVudCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoY2ggPT0gJ1onKSB7CisgICAgICAgICAgICAvKiBmb3JtYXQgdHpuYW1lICovCisgICAgICAgICAgICBpZiAoWnJlcGxhY2VtZW50ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeU9iamVjdCAqdHppbmZvID0gZ2V0X3R6aW5mb19tZW1iZXIob2JqZWN0KTsKKyAgICAgICAgICAgICAgICBacmVwbGFjZW1lbnQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCIiKTsKKyAgICAgICAgICAgICAgICBpZiAoWnJlcGxhY2VtZW50ID09IE5VTEwpIGdvdG8gRG9uZTsKKyAgICAgICAgICAgICAgICBpZiAodHppbmZvICE9IFB5X05vbmUgJiYgdHppbmZvICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKnRlbXA7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydCh0emluZm9hcmcgIT0gTlVMTCk7CisgICAgICAgICAgICAgICAgICAgIHRlbXAgPSBjYWxsX3R6bmFtZSh0emluZm8sIHR6aW5mb2FyZyk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wID09IE5VTEwpIGdvdG8gRG9uZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXAgIT0gUHlfTm9uZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KFB5U3RyaW5nX0NoZWNrKHRlbXApKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNpbmNlIHRoZSB0em5hbWUgaXMgZ2V0dGluZworICAgICAgICAgICAgICAgICAgICAgICAgICogc3R1ZmZlZCBpbnRvIHRoZSBmb3JtYXQsIHdlCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBoYXZlIHRvIGRvdWJsZSBhbnkgJSBzaWducworICAgICAgICAgICAgICAgICAgICAgICAgICogc28gdGhhdCBzdHJmdGltZSBkb2Vzbid0CisgICAgICAgICAgICAgICAgICAgICAgICAgKiB0cmVhdCB0aGVtIGFzIGZvcm1hdCBjb2Rlcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKFpyZXBsYWNlbWVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBacmVwbGFjZW1lbnQgPSBQeU9iamVjdF9DYWxsTWV0aG9kKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAsICJyZXBsYWNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3MiLCAiJSIsICIlJSIpOworICAgICAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHRlbXApOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFpyZXBsYWNlbWVudCA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gRG9uZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghUHlTdHJpbmdfQ2hlY2soWnJlcGxhY2VtZW50KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJ0em5hbWUucmVwbGFjZSgpIGRpZCBub3QgcmV0dXJuIGEgc3RyaW5nIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBEb25lOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih0ZW1wKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhc3NlcnQoWnJlcGxhY2VtZW50ICE9IE5VTEwpOworICAgICAgICAgICAgcHRvYXBwZW5kID0gUHlTdHJpbmdfQVNfU1RSSU5HKFpyZXBsYWNlbWVudCk7CisgICAgICAgICAgICBudG9hcHBlbmQgPSBQeVN0cmluZ19HRVRfU0laRShacmVwbGFjZW1lbnQpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGNoID09ICdmJykgeworICAgICAgICAgICAgLyogZm9ybWF0IG1pY3Jvc2Vjb25kcyAqLworICAgICAgICAgICAgaWYgKGZyZXBsYWNlbWVudCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgZnJlcGxhY2VtZW50ID0gbWFrZV9mcmVwbGFjZW1lbnQob2JqZWN0KTsKKyAgICAgICAgICAgICAgICBpZiAoZnJlcGxhY2VtZW50ID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gRG9uZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFzc2VydChmcmVwbGFjZW1lbnQgIT0gTlVMTCk7CisgICAgICAgICAgICBhc3NlcnQoUHlTdHJpbmdfQ2hlY2soZnJlcGxhY2VtZW50KSk7CisgICAgICAgICAgICBwdG9hcHBlbmQgPSBQeVN0cmluZ19BU19TVFJJTkcoZnJlcGxhY2VtZW50KTsKKyAgICAgICAgICAgIG50b2FwcGVuZCA9IFB5U3RyaW5nX0dFVF9TSVpFKGZyZXBsYWNlbWVudCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvKiBwZXJjZW50IGZvbGxvd2VkIGJ5IG5laXRoZXIgeiBub3IgWiAqLworICAgICAgICAgICAgcHRvYXBwZW5kID0gcGluIC0gMjsKKyAgICAgICAgICAgIG50b2FwcGVuZCA9IDI7CisgICAgICAgIH0KIAotIAkJLyogQXBwZW5kIHRoZSBudG9hcHBlbmQgY2hhcnMgc3RhcnRpbmcgYXQgcHRvYXBwZW5kIHRvCi0gCQkgKiB0aGUgbmV3IGZvcm1hdC4KLSAJCSAqLwotIAkJYXNzZXJ0KHB0b2FwcGVuZCAhPSBOVUxMKTsKLSAJCWFzc2VydChudG9hcHBlbmQgPj0gMCk7Ci0gCQlpZiAobnRvYXBwZW5kID09IDApCi0gCQkJY29udGludWU7Ci0gCQl3aGlsZSAodXNlZG5ldyArIG50b2FwcGVuZCA+IHRvdGFsbmV3KSB7Ci0gCQkJc2l6ZV90IGJpZ2dlciA9IHRvdGFsbmV3IDw8IDE7Ci0gCQkJaWYgKChiaWdnZXIgPj4gMSkgIT0gdG90YWxuZXcpIHsgLyogb3ZlcmZsb3cgKi8KLSAJCQkJUHlFcnJfTm9NZW1vcnkoKTsKLSAJCQkJZ290byBEb25lOwotIAkJCX0KLSAJCQlpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmbmV3Zm10LCBiaWdnZXIpIDwgMCkKLSAJCQkJZ290byBEb25lOwotIAkJCXRvdGFsbmV3ID0gYmlnZ2VyOwotIAkJCXBuZXcgPSBQeVN0cmluZ19Bc1N0cmluZyhuZXdmbXQpICsgdXNlZG5ldzsKLSAJCX0KLQkJbWVtY3B5KHBuZXcsIHB0b2FwcGVuZCwgbnRvYXBwZW5kKTsKLQkJcG5ldyArPSBudG9hcHBlbmQ7Ci0JCXVzZWRuZXcgKz0gbnRvYXBwZW5kOwotCQlhc3NlcnQodXNlZG5ldyA8PSB0b3RhbG5ldyk7Ci0JfSAgLyogZW5kIHdoaWxlKCkgKi8KKyAgICAgICAgLyogQXBwZW5kIHRoZSBudG9hcHBlbmQgY2hhcnMgc3RhcnRpbmcgYXQgcHRvYXBwZW5kIHRvCisgICAgICAgICAqIHRoZSBuZXcgZm9ybWF0LgorICAgICAgICAgKi8KKyAgICAgICAgYXNzZXJ0KHB0b2FwcGVuZCAhPSBOVUxMKTsKKyAgICAgICAgYXNzZXJ0KG50b2FwcGVuZCA+PSAwKTsKKyAgICAgICAgaWYgKG50b2FwcGVuZCA9PSAwKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIHdoaWxlICh1c2VkbmV3ICsgbnRvYXBwZW5kID4gdG90YWxuZXcpIHsKKyAgICAgICAgICAgIHNpemVfdCBiaWdnZXIgPSB0b3RhbG5ldyA8PCAxOworICAgICAgICAgICAgaWYgKChiaWdnZXIgPj4gMSkgIT0gdG90YWxuZXcpIHsgLyogb3ZlcmZsb3cgKi8KKyAgICAgICAgICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICAgICAgICAgIGdvdG8gRG9uZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChfUHlTdHJpbmdfUmVzaXplKCZuZXdmbXQsIGJpZ2dlcikgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gRG9uZTsKKyAgICAgICAgICAgIHRvdGFsbmV3ID0gYmlnZ2VyOworICAgICAgICAgICAgcG5ldyA9IFB5U3RyaW5nX0FzU3RyaW5nKG5ld2ZtdCkgKyB1c2VkbmV3OworICAgICAgICB9CisgICAgICAgIG1lbWNweShwbmV3LCBwdG9hcHBlbmQsIG50b2FwcGVuZCk7CisgICAgICAgIHBuZXcgKz0gbnRvYXBwZW5kOworICAgICAgICB1c2VkbmV3ICs9IG50b2FwcGVuZDsKKyAgICAgICAgYXNzZXJ0KHVzZWRuZXcgPD0gdG90YWxuZXcpOworICAgIH0gIC8qIGVuZCB3aGlsZSgpICovCiAKLQlpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmbmV3Zm10LCB1c2VkbmV3KSA8IDApCi0JCWdvdG8gRG9uZTsKLQl7Ci0JCVB5T2JqZWN0ICp0aW1lID0gUHlJbXBvcnRfSW1wb3J0TW9kdWxlTm9CbG9jaygidGltZSIpOwotCQlpZiAodGltZSA9PSBOVUxMKQotCQkJZ290byBEb25lOwotCQlyZXN1bHQgPSBQeU9iamVjdF9DYWxsTWV0aG9kKHRpbWUsICJzdHJmdGltZSIsICJPTyIsCi0JCQkJCSAgICAgbmV3Zm10LCB0aW1ldHVwbGUpOwotCQlQeV9ERUNSRUYodGltZSk7Ci0gICAgCX0KKyAgICBpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmbmV3Zm10LCB1c2VkbmV3KSA8IDApCisgICAgICAgIGdvdG8gRG9uZTsKKyAgICB7CisgICAgICAgIFB5T2JqZWN0ICp0aW1lID0gUHlJbXBvcnRfSW1wb3J0TW9kdWxlTm9CbG9jaygidGltZSIpOworICAgICAgICBpZiAodGltZSA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBEb25lOworICAgICAgICByZXN1bHQgPSBQeU9iamVjdF9DYWxsTWV0aG9kKHRpbWUsICJzdHJmdGltZSIsICJPTyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Zm10LCB0aW1ldHVwbGUpOworICAgICAgICBQeV9ERUNSRUYodGltZSk7CisgICAgfQogIERvbmU6Ci0JUHlfWERFQ1JFRihmcmVwbGFjZW1lbnQpOwotCVB5X1hERUNSRUYoenJlcGxhY2VtZW50KTsKLQlQeV9YREVDUkVGKFpyZXBsYWNlbWVudCk7Ci0JUHlfWERFQ1JFRihuZXdmbXQpOwotICAgIAlyZXR1cm4gcmVzdWx0OworICAgIFB5X1hERUNSRUYoZnJlcGxhY2VtZW50KTsKKyAgICBQeV9YREVDUkVGKHpyZXBsYWNlbWVudCk7CisgICAgUHlfWERFQ1JFRihacmVwbGFjZW1lbnQpOworICAgIFB5X1hERUNSRUYobmV3Zm10KTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgY2hhciAqCiBpc29mb3JtYXRfZGF0ZShQeURhdGVUaW1lX0RhdGUgKmR0LCBjaGFyIGJ1ZmZlcltdLCBpbnQgYnVmZmxlbikKIHsKLQlpbnQgeDsKLQl4ID0gUHlPU19zbnByaW50ZihidWZmZXIsIGJ1ZmZsZW4sCi0JCQkgICIlMDRkLSUwMmQtJTAyZCIsCi0JCQkgIEdFVF9ZRUFSKGR0KSwgR0VUX01PTlRIKGR0KSwgR0VUX0RBWShkdCkpOwotCWFzc2VydChidWZmbGVuID49IHgpOwotCXJldHVybiBidWZmZXIgKyB4OworICAgIGludCB4OworICAgIHggPSBQeU9TX3NucHJpbnRmKGJ1ZmZlciwgYnVmZmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAiJTA0ZC0lMDJkLSUwMmQiLAorICAgICAgICAgICAgICAgICAgICAgIEdFVF9ZRUFSKGR0KSwgR0VUX01PTlRIKGR0KSwgR0VUX0RBWShkdCkpOworICAgIGFzc2VydChidWZmbGVuID49IHgpOworICAgIHJldHVybiBidWZmZXIgKyB4OwogfQogCiBzdGF0aWMgY2hhciAqCiBpc29mb3JtYXRfdGltZShQeURhdGVUaW1lX0RhdGVUaW1lICpkdCwgY2hhciBidWZmZXJbXSwgaW50IGJ1ZmZsZW4pCiB7Ci0JaW50IHg7Ci0JaW50IHVzID0gREFURV9HRVRfTUlDUk9TRUNPTkQoZHQpOworICAgIGludCB4OworICAgIGludCB1cyA9IERBVEVfR0VUX01JQ1JPU0VDT05EKGR0KTsKIAotCXggPSBQeU9TX3NucHJpbnRmKGJ1ZmZlciwgYnVmZmxlbiwKLQkJCSAgIiUwMmQ6JTAyZDolMDJkIiwKLQkJCSAgREFURV9HRVRfSE9VUihkdCksCi0JCQkgIERBVEVfR0VUX01JTlVURShkdCksCi0JCQkgIERBVEVfR0VUX1NFQ09ORChkdCkpOwotCWFzc2VydChidWZmbGVuID49IHgpOwotCWlmICh1cykKLQkJeCArPSBQeU9TX3NucHJpbnRmKGJ1ZmZlciArIHgsIGJ1ZmZsZW4gLSB4LCAiLiUwNmQiLCB1cyk7Ci0JYXNzZXJ0KGJ1ZmZsZW4gPj0geCk7Ci0JcmV0dXJuIGJ1ZmZlciArIHg7CisgICAgeCA9IFB5T1Nfc25wcmludGYoYnVmZmVyLCBidWZmbGVuLAorICAgICAgICAgICAgICAgICAgICAgICIlMDJkOiUwMmQ6JTAyZCIsCisgICAgICAgICAgICAgICAgICAgICAgREFURV9HRVRfSE9VUihkdCksCisgICAgICAgICAgICAgICAgICAgICAgREFURV9HRVRfTUlOVVRFKGR0KSwKKyAgICAgICAgICAgICAgICAgICAgICBEQVRFX0dFVF9TRUNPTkQoZHQpKTsKKyAgICBhc3NlcnQoYnVmZmxlbiA+PSB4KTsKKyAgICBpZiAodXMpCisgICAgICAgIHggKz0gUHlPU19zbnByaW50ZihidWZmZXIgKyB4LCBidWZmbGVuIC0geCwgIi4lMDZkIiwgdXMpOworICAgIGFzc2VydChidWZmbGVuID49IHgpOworICAgIHJldHVybiBidWZmZXIgKyB4OwogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTEzOTMsMTQgKzEzOTMsMTQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiB0aW1lX3RpbWUodm9pZCkKIHsKLQlQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKLQlQeU9iamVjdCAqdGltZSA9IFB5SW1wb3J0X0ltcG9ydE1vZHVsZU5vQmxvY2soInRpbWUiKTsKKyAgICBQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKKyAgICBQeU9iamVjdCAqdGltZSA9IFB5SW1wb3J0X0ltcG9ydE1vZHVsZU5vQmxvY2soInRpbWUiKTsKIAotCWlmICh0aW1lICE9IE5VTEwpIHsKLQkJcmVzdWx0ID0gUHlPYmplY3RfQ2FsbE1ldGhvZCh0aW1lLCAidGltZSIsICIoKSIpOwotCQlQeV9ERUNSRUYodGltZSk7Ci0JfQotCXJldHVybiByZXN1bHQ7CisgICAgaWYgKHRpbWUgIT0gTlVMTCkgeworICAgICAgICByZXN1bHQgPSBQeU9iamVjdF9DYWxsTWV0aG9kKHRpbWUsICJ0aW1lIiwgIigpIik7CisgICAgICAgIFB5X0RFQ1JFRih0aW1lKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogLyogQnVpbGQgYSB0aW1lLnN0cnVjdF90aW1lLiAgVGhlIHdlZWtkYXkgYW5kIGRheSBudW1iZXIgYXJlIGF1dG9tYXRpY2FsbHkKQEAgLTE0MDksMjEgKzE0MDksMjEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBidWlsZF9zdHJ1Y3RfdGltZShpbnQgeSwgaW50IG0sIGludCBkLCBpbnQgaGgsIGludCBtbSwgaW50IHNzLCBpbnQgZHN0ZmxhZykKIHsKLQlQeU9iamVjdCAqdGltZTsKLQlQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKKyAgICBQeU9iamVjdCAqdGltZTsKKyAgICBQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKIAotCXRpbWUgPSBQeUltcG9ydF9JbXBvcnRNb2R1bGVOb0Jsb2NrKCJ0aW1lIik7Ci0JaWYgKHRpbWUgIT0gTlVMTCkgewotCQlyZXN1bHQgPSBQeU9iamVjdF9DYWxsTWV0aG9kKHRpbWUsICJzdHJ1Y3RfdGltZSIsCi0JCQkJCSAgICAgIigoaWlpaWlpaWlpKSkiLAotCQkJCQkgICAgIHksIG0sIGQsCi0JCQkJCSAgICAgaGgsIG1tLCBzcywKLQkJCQkgCSAgICAgd2Vla2RheSh5LCBtLCBkKSwKLQkJCQkgCSAgICAgZGF5c19iZWZvcmVfbW9udGgoeSwgbSkgKyBkLAotCQkJCSAJICAgICBkc3RmbGFnKTsKLQkJUHlfREVDUkVGKHRpbWUpOwotCX0KLQlyZXR1cm4gcmVzdWx0OworICAgIHRpbWUgPSBQeUltcG9ydF9JbXBvcnRNb2R1bGVOb0Jsb2NrKCJ0aW1lIik7CisgICAgaWYgKHRpbWUgIT0gTlVMTCkgeworICAgICAgICByZXN1bHQgPSBQeU9iamVjdF9DYWxsTWV0aG9kKHRpbWUsICJzdHJ1Y3RfdGltZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIigoaWlpaWlpaWlpKSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHksIG0sIGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGgsIG1tLCBzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWVrZGF5KHksIG0sIGQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRheXNfYmVmb3JlX21vbnRoKHksIG0pICsgZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RmbGFnKTsKKyAgICAgICAgUHlfREVDUkVGKHRpbWUpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTE0MzcsMzMgKzE0MzcsMzMgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBkaWZmX3RvX2Jvb2woaW50IGRpZmYsIGludCBvcCkKIHsKLQlQeU9iamVjdCAqcmVzdWx0OwotCWludCBpc3RydWU7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICBpbnQgaXN0cnVlOwogCi0Jc3dpdGNoIChvcCkgewotCQljYXNlIFB5X0VROiBpc3RydWUgPSBkaWZmID09IDA7IGJyZWFrOwotCQljYXNlIFB5X05FOiBpc3RydWUgPSBkaWZmICE9IDA7IGJyZWFrOwotCQljYXNlIFB5X0xFOiBpc3RydWUgPSBkaWZmIDw9IDA7IGJyZWFrOwotCQljYXNlIFB5X0dFOiBpc3RydWUgPSBkaWZmID49IDA7IGJyZWFrOwotCQljYXNlIFB5X0xUOiBpc3RydWUgPSBkaWZmIDwgMDsgYnJlYWs7Ci0JCWNhc2UgUHlfR1Q6IGlzdHJ1ZSA9IGRpZmYgPiAwOyBicmVhazsKLQkJZGVmYXVsdDoKLQkJCWFzc2VydCghICJvcCB1bmtub3duIik7Ci0JCQlpc3RydWUgPSAwOyAvKiBUbyBzaHV0IHVwIGNvbXBpbGVyICovCi0JfQotCXJlc3VsdCA9IGlzdHJ1ZSA/IFB5X1RydWUgOiBQeV9GYWxzZTsKLQlQeV9JTkNSRUYocmVzdWx0KTsKLQlyZXR1cm4gcmVzdWx0OworICAgIHN3aXRjaCAob3ApIHsKKyAgICAgICAgY2FzZSBQeV9FUTogaXN0cnVlID0gZGlmZiA9PSAwOyBicmVhazsKKyAgICAgICAgY2FzZSBQeV9ORTogaXN0cnVlID0gZGlmZiAhPSAwOyBicmVhazsKKyAgICAgICAgY2FzZSBQeV9MRTogaXN0cnVlID0gZGlmZiA8PSAwOyBicmVhazsKKyAgICAgICAgY2FzZSBQeV9HRTogaXN0cnVlID0gZGlmZiA+PSAwOyBicmVhazsKKyAgICAgICAgY2FzZSBQeV9MVDogaXN0cnVlID0gZGlmZiA8IDA7IGJyZWFrOworICAgICAgICBjYXNlIFB5X0dUOiBpc3RydWUgPSBkaWZmID4gMDsgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhc3NlcnQoISAib3AgdW5rbm93biIpOworICAgICAgICAgICAgaXN0cnVlID0gMDsgLyogVG8gc2h1dCB1cCBjb21waWxlciAqLworICAgIH0KKyAgICByZXN1bHQgPSBpc3RydWUgPyBQeV9UcnVlIDogUHlfRmFsc2U7CisgICAgUHlfSU5DUkVGKHJlc3VsdCk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogLyogUmFpc2VzIGEgImNhbid0IGNvbXBhcmUiIFR5cGVFcnJvciBhbmQgcmV0dXJucyBOVUxMLiAqLwogc3RhdGljIFB5T2JqZWN0ICoKIGNtcGVycm9yKFB5T2JqZWN0ICphLCBQeU9iamVjdCAqYikKIHsKLQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkgICAgICJjYW4ndCBjb21wYXJlICVzIHRvICVzIiwKLQkJICAgICBQeV9UWVBFKGEpLT50cF9uYW1lLCBQeV9UWVBFKGIpLT50cF9uYW1lKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAiY2FuJ3QgY29tcGFyZSAlcyB0byAlcyIsCisgICAgICAgICAgICAgICAgIFB5X1RZUEUoYSktPnRwX25hbWUsIFB5X1RZUEUoYiktPnRwX25hbWUpOworICAgIHJldHVybiBOVUxMOwogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTE0NzEsMTMgKzE0NzEsMTMgQEAKICAqLwogCiAvKiBDb252ZXJzaW9uIGZhY3RvcnMuICovCi1zdGF0aWMgUHlPYmplY3QgKnVzX3Blcl91cyA9IE5VTEw7CS8qIDEgKi8KLXN0YXRpYyBQeU9iamVjdCAqdXNfcGVyX21zID0gTlVMTDsJLyogMTAwMCAqLwotc3RhdGljIFB5T2JqZWN0ICp1c19wZXJfc2Vjb25kID0gTlVMTDsJLyogMTAwMDAwMCAqLwotc3RhdGljIFB5T2JqZWN0ICp1c19wZXJfbWludXRlID0gTlVMTDsJLyogMWU2ICogNjAgYXMgUHl0aG9uIGludCAqLwotc3RhdGljIFB5T2JqZWN0ICp1c19wZXJfaG91ciA9IE5VTEw7CS8qIDFlNiAqIDM2MDAgYXMgUHl0aG9uIGxvbmcgKi8KLXN0YXRpYyBQeU9iamVjdCAqdXNfcGVyX2RheSA9IE5VTEw7CS8qIDFlNiAqIDM2MDAgKiAyNCBhcyBQeXRob24gbG9uZyAqLwotc3RhdGljIFB5T2JqZWN0ICp1c19wZXJfd2VlayA9IE5VTEw7CS8qIDFlNiozNjAwKjI0KjcgYXMgUHl0aG9uIGxvbmcgKi8KK3N0YXRpYyBQeU9iamVjdCAqdXNfcGVyX3VzID0gTlVMTDsgICAgICAvKiAxICovCitzdGF0aWMgUHlPYmplY3QgKnVzX3Blcl9tcyA9IE5VTEw7ICAgICAgLyogMTAwMCAqLworc3RhdGljIFB5T2JqZWN0ICp1c19wZXJfc2Vjb25kID0gTlVMTDsgIC8qIDEwMDAwMDAgKi8KK3N0YXRpYyBQeU9iamVjdCAqdXNfcGVyX21pbnV0ZSA9IE5VTEw7ICAvKiAxZTYgKiA2MCBhcyBQeXRob24gaW50ICovCitzdGF0aWMgUHlPYmplY3QgKnVzX3Blcl9ob3VyID0gTlVMTDsgICAgLyogMWU2ICogMzYwMCBhcyBQeXRob24gbG9uZyAqLworc3RhdGljIFB5T2JqZWN0ICp1c19wZXJfZGF5ID0gTlVMTDsgICAgIC8qIDFlNiAqIDM2MDAgKiAyNCBhcyBQeXRob24gbG9uZyAqLworc3RhdGljIFB5T2JqZWN0ICp1c19wZXJfd2VlayA9IE5VTEw7ICAgIC8qIDFlNiozNjAwKjI0KjcgYXMgUHl0aG9uIGxvbmcgKi8KIHN0YXRpYyBQeU9iamVjdCAqc2Vjb25kc19wZXJfZGF5ID0gTlVMTDsgLyogMzYwMCoyNCBhcyBQeXRob24gaW50ICovCiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTQ4OSw3ICsxNDg5LDcgQEAKICAqLwogCiAvKiBDb252ZXJ0IGEgdGltZWRlbHRhIHRvIGEgbnVtYmVyIG9mIHVzLAotICogCSgyNCozNjAwKnNlbGYuZGF5cyArIHNlbGYuc2Vjb25kcykqMTAwMDAwMCArIHNlbGYubWljcm9zZWNvbmRzCisgKiAgICAgICgyNCozNjAwKnNlbGYuZGF5cyArIHNlbGYuc2Vjb25kcykqMTAwMDAwMCArIHNlbGYubWljcm9zZWNvbmRzCiAgKiBhcyBhIFB5dGhvbiBpbnQgb3IgbG9uZy4KICAqIERvaW5nIG1peGVkLXJhZGl4IGFyaXRobWV0aWMgYnkgaGFuZCBpbnN0ZWFkIGlzIGV4Y3J1Y2lhdGluZyBpbiBDLAogICogZHVlIHRvIHViaXF1aXRvdXMgb3ZlcmZsb3cgcG9zc2liaWxpdGllcy4KQEAgLTE0OTcsNDkgKzE0OTcsNDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBkZWx0YV90b19taWNyb3NlY29uZHMoUHlEYXRlVGltZV9EZWx0YSAqc2VsZikKIHsKLQlQeU9iamVjdCAqeDEgPSBOVUxMOwotCVB5T2JqZWN0ICp4MiA9IE5VTEw7Ci0JUHlPYmplY3QgKngzID0gTlVMTDsKLQlQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKKyAgICBQeU9iamVjdCAqeDEgPSBOVUxMOworICAgIFB5T2JqZWN0ICp4MiA9IE5VTEw7CisgICAgUHlPYmplY3QgKngzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKIAotCXgxID0gUHlJbnRfRnJvbUxvbmcoR0VUX1REX0RBWVMoc2VsZikpOwotCWlmICh4MSA9PSBOVUxMKQotCQlnb3RvIERvbmU7Ci0JeDIgPSBQeU51bWJlcl9NdWx0aXBseSh4MSwgc2Vjb25kc19wZXJfZGF5KTsJLyogZGF5cyBpbiBzZWNvbmRzICovCi0JaWYgKHgyID09IE5VTEwpCi0JCWdvdG8gRG9uZTsKLQlQeV9ERUNSRUYoeDEpOwotCXgxID0gTlVMTDsKKyAgICB4MSA9IFB5SW50X0Zyb21Mb25nKEdFVF9URF9EQVlTKHNlbGYpKTsKKyAgICBpZiAoeDEgPT0gTlVMTCkKKyAgICAgICAgZ290byBEb25lOworICAgIHgyID0gUHlOdW1iZXJfTXVsdGlwbHkoeDEsIHNlY29uZHNfcGVyX2RheSk7ICAgICAgICAvKiBkYXlzIGluIHNlY29uZHMgKi8KKyAgICBpZiAoeDIgPT0gTlVMTCkKKyAgICAgICAgZ290byBEb25lOworICAgIFB5X0RFQ1JFRih4MSk7CisgICAgeDEgPSBOVUxMOwogCi0JLyogeDIgaGFzIGRheXMgaW4gc2Vjb25kcyAqLwotCXgxID0gUHlJbnRfRnJvbUxvbmcoR0VUX1REX1NFQ09ORFMoc2VsZikpOwkvKiBzZWNvbmRzICovCi0JaWYgKHgxID09IE5VTEwpCi0JCWdvdG8gRG9uZTsKLQl4MyA9IFB5TnVtYmVyX0FkZCh4MSwgeDIpOwkvKiBkYXlzIGFuZCBzZWNvbmRzIGluIHNlY29uZHMgKi8KLQlpZiAoeDMgPT0gTlVMTCkKLQkJZ290byBEb25lOwotCVB5X0RFQ1JFRih4MSk7Ci0JUHlfREVDUkVGKHgyKTsKLQl4MSA9IHgyID0gTlVMTDsKKyAgICAvKiB4MiBoYXMgZGF5cyBpbiBzZWNvbmRzICovCisgICAgeDEgPSBQeUludF9Gcm9tTG9uZyhHRVRfVERfU0VDT05EUyhzZWxmKSk7ICAgICAgICAgIC8qIHNlY29uZHMgKi8KKyAgICBpZiAoeDEgPT0gTlVMTCkKKyAgICAgICAgZ290byBEb25lOworICAgIHgzID0gUHlOdW1iZXJfQWRkKHgxLCB4Mik7ICAgICAgICAgIC8qIGRheXMgYW5kIHNlY29uZHMgaW4gc2Vjb25kcyAqLworICAgIGlmICh4MyA9PSBOVUxMKQorICAgICAgICBnb3RvIERvbmU7CisgICAgUHlfREVDUkVGKHgxKTsKKyAgICBQeV9ERUNSRUYoeDIpOworICAgIHgxID0geDIgPSBOVUxMOwogCi0JLyogeDMgaGFzIGRheXMrc2Vjb25kcyBpbiBzZWNvbmRzICovCi0JeDEgPSBQeU51bWJlcl9NdWx0aXBseSh4MywgdXNfcGVyX3NlY29uZCk7CS8qIHVzICovCi0JaWYgKHgxID09IE5VTEwpCi0JCWdvdG8gRG9uZTsKLQlQeV9ERUNSRUYoeDMpOwotCXgzID0gTlVMTDsKKyAgICAvKiB4MyBoYXMgZGF5cytzZWNvbmRzIGluIHNlY29uZHMgKi8KKyAgICB4MSA9IFB5TnVtYmVyX011bHRpcGx5KHgzLCB1c19wZXJfc2Vjb25kKTsgICAgICAgICAgLyogdXMgKi8KKyAgICBpZiAoeDEgPT0gTlVMTCkKKyAgICAgICAgZ290byBEb25lOworICAgIFB5X0RFQ1JFRih4Myk7CisgICAgeDMgPSBOVUxMOwogCi0JLyogeDEgaGFzIGRheXMrc2Vjb25kcyBpbiB1cyAqLwotCXgyID0gUHlJbnRfRnJvbUxvbmcoR0VUX1REX01JQ1JPU0VDT05EUyhzZWxmKSk7Ci0JaWYgKHgyID09IE5VTEwpCi0JCWdvdG8gRG9uZTsKLQlyZXN1bHQgPSBQeU51bWJlcl9BZGQoeDEsIHgyKTsKKyAgICAvKiB4MSBoYXMgZGF5cytzZWNvbmRzIGluIHVzICovCisgICAgeDIgPSBQeUludF9Gcm9tTG9uZyhHRVRfVERfTUlDUk9TRUNPTkRTKHNlbGYpKTsKKyAgICBpZiAoeDIgPT0gTlVMTCkKKyAgICAgICAgZ290byBEb25lOworICAgIHJlc3VsdCA9IFB5TnVtYmVyX0FkZCh4MSwgeDIpOwogCiBEb25lOgotCVB5X1hERUNSRUYoeDEpOwotCVB5X1hERUNSRUYoeDIpOwotCVB5X1hERUNSRUYoeDMpOwotCXJldHVybiByZXN1bHQ7CisgICAgUHlfWERFQ1JFRih4MSk7CisgICAgUHlfWERFQ1JFRih4Mik7CisgICAgUHlfWERFQ1JFRih4Myk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogLyogQ29udmVydCBhIG51bWJlciBvZiB1cyAoYXMgYSBQeXRob24gaW50IG9yIGxvbmcpIHRvIGEgdGltZWRlbHRhLgpAQCAtMTU0NywyMDUgKzE1NDcsMjA1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogbWljcm9zZWNvbmRzX3RvX2RlbHRhX2V4KFB5T2JqZWN0ICpweXVzLCBQeVR5cGVPYmplY3QgKnR5cGUpCiB7Ci0JaW50IHVzOwotCWludCBzOwotCWludCBkOwotCWxvbmcgdGVtcDsKKyAgICBpbnQgdXM7CisgICAgaW50IHM7CisgICAgaW50IGQ7CisgICAgbG9uZyB0ZW1wOwogCi0JUHlPYmplY3QgKnR1cGxlID0gTlVMTDsKLQlQeU9iamVjdCAqbnVtID0gTlVMTDsKLQlQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKKyAgICBQeU9iamVjdCAqdHVwbGUgPSBOVUxMOworICAgIFB5T2JqZWN0ICpudW0gPSBOVUxMOworICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOwogCi0JdHVwbGUgPSBQeU51bWJlcl9EaXZtb2QocHl1cywgdXNfcGVyX3NlY29uZCk7Ci0JaWYgKHR1cGxlID09IE5VTEwpCi0JCWdvdG8gRG9uZTsKKyAgICB0dXBsZSA9IFB5TnVtYmVyX0Rpdm1vZChweXVzLCB1c19wZXJfc2Vjb25kKTsKKyAgICBpZiAodHVwbGUgPT0gTlVMTCkKKyAgICAgICAgZ290byBEb25lOwogCi0JbnVtID0gUHlUdXBsZV9HZXRJdGVtKHR1cGxlLCAxKTsJLyogdXMgKi8KLQlpZiAobnVtID09IE5VTEwpCi0JCWdvdG8gRG9uZTsKLQl0ZW1wID0gUHlMb25nX0FzTG9uZyhudW0pOwotCW51bSA9IE5VTEw7Ci0JaWYgKHRlbXAgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJZ290byBEb25lOwotCWFzc2VydCgwIDw9IHRlbXAgJiYgdGVtcCA8IDEwMDAwMDApOwotCXVzID0gKGludCl0ZW1wOwotCWlmICh1cyA8IDApIHsKLQkJLyogVGhlIGRpdmlzb3Igd2FzIHBvc2l0aXZlLCBzbyB0aGlzIG11c3QgYmUgYW4gZXJyb3IuICovCi0JCWFzc2VydChQeUVycl9PY2N1cnJlZCgpKTsKLQkJZ290byBEb25lOwotCX0KKyAgICBudW0gPSBQeVR1cGxlX0dldEl0ZW0odHVwbGUsIDEpOyAgICAgICAgICAgIC8qIHVzICovCisgICAgaWYgKG51bSA9PSBOVUxMKQorICAgICAgICBnb3RvIERvbmU7CisgICAgdGVtcCA9IFB5TG9uZ19Bc0xvbmcobnVtKTsKKyAgICBudW0gPSBOVUxMOworICAgIGlmICh0ZW1wID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIGdvdG8gRG9uZTsKKyAgICBhc3NlcnQoMCA8PSB0ZW1wICYmIHRlbXAgPCAxMDAwMDAwKTsKKyAgICB1cyA9IChpbnQpdGVtcDsKKyAgICBpZiAodXMgPCAwKSB7CisgICAgICAgIC8qIFRoZSBkaXZpc29yIHdhcyBwb3NpdGl2ZSwgc28gdGhpcyBtdXN0IGJlIGFuIGVycm9yLiAqLworICAgICAgICBhc3NlcnQoUHlFcnJfT2NjdXJyZWQoKSk7CisgICAgICAgIGdvdG8gRG9uZTsKKyAgICB9CiAKLQludW0gPSBQeVR1cGxlX0dldEl0ZW0odHVwbGUsIDApOwkvKiBsZWZ0b3ZlciBzZWNvbmRzICovCi0JaWYgKG51bSA9PSBOVUxMKQotCQlnb3RvIERvbmU7Ci0JUHlfSU5DUkVGKG51bSk7Ci0JUHlfREVDUkVGKHR1cGxlKTsKKyAgICBudW0gPSBQeVR1cGxlX0dldEl0ZW0odHVwbGUsIDApOyAgICAgICAgICAgIC8qIGxlZnRvdmVyIHNlY29uZHMgKi8KKyAgICBpZiAobnVtID09IE5VTEwpCisgICAgICAgIGdvdG8gRG9uZTsKKyAgICBQeV9JTkNSRUYobnVtKTsKKyAgICBQeV9ERUNSRUYodHVwbGUpOwogCi0JdHVwbGUgPSBQeU51bWJlcl9EaXZtb2QobnVtLCBzZWNvbmRzX3Blcl9kYXkpOwotCWlmICh0dXBsZSA9PSBOVUxMKQotCQlnb3RvIERvbmU7Ci0JUHlfREVDUkVGKG51bSk7CisgICAgdHVwbGUgPSBQeU51bWJlcl9EaXZtb2QobnVtLCBzZWNvbmRzX3Blcl9kYXkpOworICAgIGlmICh0dXBsZSA9PSBOVUxMKQorICAgICAgICBnb3RvIERvbmU7CisgICAgUHlfREVDUkVGKG51bSk7CiAKLQludW0gPSBQeVR1cGxlX0dldEl0ZW0odHVwbGUsIDEpOyAJLyogc2Vjb25kcyAqLwotCWlmIChudW0gPT0gTlVMTCkKLQkJZ290byBEb25lOwotCXRlbXAgPSBQeUxvbmdfQXNMb25nKG51bSk7Ci0JbnVtID0gTlVMTDsKLQlpZiAodGVtcCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQlnb3RvIERvbmU7Ci0JYXNzZXJ0KDAgPD0gdGVtcCAmJiB0ZW1wIDwgMjQqMzYwMCk7Ci0JcyA9IChpbnQpdGVtcDsKKyAgICBudW0gPSBQeVR1cGxlX0dldEl0ZW0odHVwbGUsIDEpOyAgICAgICAgICAgIC8qIHNlY29uZHMgKi8KKyAgICBpZiAobnVtID09IE5VTEwpCisgICAgICAgIGdvdG8gRG9uZTsKKyAgICB0ZW1wID0gUHlMb25nX0FzTG9uZyhudW0pOworICAgIG51bSA9IE5VTEw7CisgICAgaWYgKHRlbXAgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgZ290byBEb25lOworICAgIGFzc2VydCgwIDw9IHRlbXAgJiYgdGVtcCA8IDI0KjM2MDApOworICAgIHMgPSAoaW50KXRlbXA7CiAKLQlpZiAocyA8IDApIHsKLQkJLyogVGhlIGRpdmlzb3Igd2FzIHBvc2l0aXZlLCBzbyB0aGlzIG11c3QgYmUgYW4gZXJyb3IuICovCi0JCWFzc2VydChQeUVycl9PY2N1cnJlZCgpKTsKLQkJZ290byBEb25lOwotCX0KKyAgICBpZiAocyA8IDApIHsKKyAgICAgICAgLyogVGhlIGRpdmlzb3Igd2FzIHBvc2l0aXZlLCBzbyB0aGlzIG11c3QgYmUgYW4gZXJyb3IuICovCisgICAgICAgIGFzc2VydChQeUVycl9PY2N1cnJlZCgpKTsKKyAgICAgICAgZ290byBEb25lOworICAgIH0KIAotCW51bSA9IFB5VHVwbGVfR2V0SXRlbSh0dXBsZSwgMCk7CS8qIGxlZnRvdmVyIGRheXMgKi8KLQlpZiAobnVtID09IE5VTEwpCi0JCWdvdG8gRG9uZTsKLQlQeV9JTkNSRUYobnVtKTsKLQl0ZW1wID0gUHlMb25nX0FzTG9uZyhudW0pOwotCWlmICh0ZW1wID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCWdvdG8gRG9uZTsKLQlkID0gKGludCl0ZW1wOwotCWlmICgobG9uZylkICE9IHRlbXApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsICJub3JtYWxpemVkIGRheXMgdG9vICIKLQkJCQkibGFyZ2UgdG8gZml0IGluIGEgQyBpbnQiKTsKLQkJZ290byBEb25lOwotCX0KLQlyZXN1bHQgPSBuZXdfZGVsdGFfZXgoZCwgcywgdXMsIDAsIHR5cGUpOworICAgIG51bSA9IFB5VHVwbGVfR2V0SXRlbSh0dXBsZSwgMCk7ICAgICAgICAgICAgLyogbGVmdG92ZXIgZGF5cyAqLworICAgIGlmIChudW0gPT0gTlVMTCkKKyAgICAgICAgZ290byBEb25lOworICAgIFB5X0lOQ1JFRihudW0pOworICAgIHRlbXAgPSBQeUxvbmdfQXNMb25nKG51bSk7CisgICAgaWYgKHRlbXAgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgZ290byBEb25lOworICAgIGQgPSAoaW50KXRlbXA7CisgICAgaWYgKChsb25nKWQgIT0gdGVtcCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwgIm5vcm1hbGl6ZWQgZGF5cyB0b28gIgorICAgICAgICAgICAgICAgICAgICAgICAgImxhcmdlIHRvIGZpdCBpbiBhIEMgaW50Iik7CisgICAgICAgIGdvdG8gRG9uZTsKKyAgICB9CisgICAgcmVzdWx0ID0gbmV3X2RlbHRhX2V4KGQsIHMsIHVzLCAwLCB0eXBlKTsKIAogRG9uZToKLQlQeV9YREVDUkVGKHR1cGxlKTsKLQlQeV9YREVDUkVGKG51bSk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBQeV9YREVDUkVGKHR1cGxlKTsKKyAgICBQeV9YREVDUkVGKG51bSk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAotI2RlZmluZSBtaWNyb3NlY29uZHNfdG9fZGVsdGEocHltaWNyb3MpCVwKLQltaWNyb3NlY29uZHNfdG9fZGVsdGFfZXgocHltaWNyb3MsICZQeURhdGVUaW1lX0RlbHRhVHlwZSkKKyNkZWZpbmUgbWljcm9zZWNvbmRzX3RvX2RlbHRhKHB5bWljcm9zKSBcCisgICAgbWljcm9zZWNvbmRzX3RvX2RlbHRhX2V4KHB5bWljcm9zLCAmUHlEYXRlVGltZV9EZWx0YVR5cGUpCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBtdWx0aXBseV9pbnRfdGltZWRlbHRhKFB5T2JqZWN0ICppbnRvYmosIFB5RGF0ZVRpbWVfRGVsdGEgKmRlbHRhKQogewotCVB5T2JqZWN0ICpweXVzX2luOwotCVB5T2JqZWN0ICpweXVzX291dDsKLQlQeU9iamVjdCAqcmVzdWx0OworICAgIFB5T2JqZWN0ICpweXVzX2luOworICAgIFB5T2JqZWN0ICpweXVzX291dDsKKyAgICBQeU9iamVjdCAqcmVzdWx0OwogCi0JcHl1c19pbiA9IGRlbHRhX3RvX21pY3Jvc2Vjb25kcyhkZWx0YSk7Ci0JaWYgKHB5dXNfaW4gPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgcHl1c19pbiA9IGRlbHRhX3RvX21pY3Jvc2Vjb25kcyhkZWx0YSk7CisgICAgaWYgKHB5dXNfaW4gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlweXVzX291dCA9IFB5TnVtYmVyX011bHRpcGx5KHB5dXNfaW4sIGludG9iaik7Ci0JUHlfREVDUkVGKHB5dXNfaW4pOwotCWlmIChweXVzX291dCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBweXVzX291dCA9IFB5TnVtYmVyX011bHRpcGx5KHB5dXNfaW4sIGludG9iaik7CisgICAgUHlfREVDUkVGKHB5dXNfaW4pOworICAgIGlmIChweXVzX291dCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXJlc3VsdCA9IG1pY3Jvc2Vjb25kc190b19kZWx0YShweXVzX291dCk7Ci0JUHlfREVDUkVGKHB5dXNfb3V0KTsKLQlyZXR1cm4gcmVzdWx0OworICAgIHJlc3VsdCA9IG1pY3Jvc2Vjb25kc190b19kZWx0YShweXVzX291dCk7CisgICAgUHlfREVDUkVGKHB5dXNfb3V0KTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZGl2aWRlX3RpbWVkZWx0YV9pbnQoUHlEYXRlVGltZV9EZWx0YSAqZGVsdGEsIFB5T2JqZWN0ICppbnRvYmopCiB7Ci0JUHlPYmplY3QgKnB5dXNfaW47Ci0JUHlPYmplY3QgKnB5dXNfb3V0OwotCVB5T2JqZWN0ICpyZXN1bHQ7CisgICAgUHlPYmplY3QgKnB5dXNfaW47CisgICAgUHlPYmplY3QgKnB5dXNfb3V0OworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CiAKLQlweXVzX2luID0gZGVsdGFfdG9fbWljcm9zZWNvbmRzKGRlbHRhKTsKLQlpZiAocHl1c19pbiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBweXVzX2luID0gZGVsdGFfdG9fbWljcm9zZWNvbmRzKGRlbHRhKTsKKyAgICBpZiAocHl1c19pbiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXB5dXNfb3V0ID0gUHlOdW1iZXJfRmxvb3JEaXZpZGUocHl1c19pbiwgaW50b2JqKTsKLQlQeV9ERUNSRUYocHl1c19pbik7Ci0JaWYgKHB5dXNfb3V0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIHB5dXNfb3V0ID0gUHlOdW1iZXJfRmxvb3JEaXZpZGUocHl1c19pbiwgaW50b2JqKTsKKyAgICBQeV9ERUNSRUYocHl1c19pbik7CisgICAgaWYgKHB5dXNfb3V0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JcmVzdWx0ID0gbWljcm9zZWNvbmRzX3RvX2RlbHRhKHB5dXNfb3V0KTsKLQlQeV9ERUNSRUYocHl1c19vdXQpOwotCXJldHVybiByZXN1bHQ7CisgICAgcmVzdWx0ID0gbWljcm9zZWNvbmRzX3RvX2RlbHRhKHB5dXNfb3V0KTsKKyAgICBQeV9ERUNSRUYocHl1c19vdXQpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkZWx0YV9hZGQoUHlPYmplY3QgKmxlZnQsIFB5T2JqZWN0ICpyaWdodCkKIHsKLQlQeU9iamVjdCAqcmVzdWx0ID0gUHlfTm90SW1wbGVtZW50ZWQ7CisgICAgUHlPYmplY3QgKnJlc3VsdCA9IFB5X05vdEltcGxlbWVudGVkOwogCi0JaWYgKFB5RGVsdGFfQ2hlY2sobGVmdCkgJiYgUHlEZWx0YV9DaGVjayhyaWdodCkpIHsKLQkJLyogZGVsdGEgKyBkZWx0YSAqLwotCQkvKiBUaGUgQy1sZXZlbCBhZGRpdGlvbnMgY2FuJ3Qgb3ZlcmZsb3cgYmVjYXVzZSBvZiB0aGUKLQkJICogaW52YXJpYW50IGJvdW5kcy4KLQkJICovCi0JCWludCBkYXlzID0gR0VUX1REX0RBWVMobGVmdCkgKyBHRVRfVERfREFZUyhyaWdodCk7Ci0JCWludCBzZWNvbmRzID0gR0VUX1REX1NFQ09ORFMobGVmdCkgKyBHRVRfVERfU0VDT05EUyhyaWdodCk7Ci0JCWludCBtaWNyb3NlY29uZHMgPSBHRVRfVERfTUlDUk9TRUNPTkRTKGxlZnQpICsKLQkJCQkgICBHRVRfVERfTUlDUk9TRUNPTkRTKHJpZ2h0KTsKLQkJcmVzdWx0ID0gbmV3X2RlbHRhKGRheXMsIHNlY29uZHMsIG1pY3Jvc2Vjb25kcywgMSk7Ci0JfQorICAgIGlmIChQeURlbHRhX0NoZWNrKGxlZnQpICYmIFB5RGVsdGFfQ2hlY2socmlnaHQpKSB7CisgICAgICAgIC8qIGRlbHRhICsgZGVsdGEgKi8KKyAgICAgICAgLyogVGhlIEMtbGV2ZWwgYWRkaXRpb25zIGNhbid0IG92ZXJmbG93IGJlY2F1c2Ugb2YgdGhlCisgICAgICAgICAqIGludmFyaWFudCBib3VuZHMuCisgICAgICAgICAqLworICAgICAgICBpbnQgZGF5cyA9IEdFVF9URF9EQVlTKGxlZnQpICsgR0VUX1REX0RBWVMocmlnaHQpOworICAgICAgICBpbnQgc2Vjb25kcyA9IEdFVF9URF9TRUNPTkRTKGxlZnQpICsgR0VUX1REX1NFQ09ORFMocmlnaHQpOworICAgICAgICBpbnQgbWljcm9zZWNvbmRzID0gR0VUX1REX01JQ1JPU0VDT05EUyhsZWZ0KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHRVRfVERfTUlDUk9TRUNPTkRTKHJpZ2h0KTsKKyAgICAgICAgcmVzdWx0ID0gbmV3X2RlbHRhKGRheXMsIHNlY29uZHMsIG1pY3Jvc2Vjb25kcywgMSk7CisgICAgfQogCi0JaWYgKHJlc3VsdCA9PSBQeV9Ob3RJbXBsZW1lbnRlZCkKLQkJUHlfSU5DUkVGKHJlc3VsdCk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBpZiAocmVzdWx0ID09IFB5X05vdEltcGxlbWVudGVkKQorICAgICAgICBQeV9JTkNSRUYocmVzdWx0KTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZGVsdGFfbmVnYXRpdmUoUHlEYXRlVGltZV9EZWx0YSAqc2VsZikKIHsKLQlyZXR1cm4gbmV3X2RlbHRhKC1HRVRfVERfREFZUyhzZWxmKSwKLQkJCSAtR0VUX1REX1NFQ09ORFMoc2VsZiksCi0JCQkgLUdFVF9URF9NSUNST1NFQ09ORFMoc2VsZiksCi0JCQkgMSk7CisgICAgcmV0dXJuIG5ld19kZWx0YSgtR0VUX1REX0RBWVMoc2VsZiksCisgICAgICAgICAgICAgICAgICAgICAtR0VUX1REX1NFQ09ORFMoc2VsZiksCisgICAgICAgICAgICAgICAgICAgICAtR0VUX1REX01JQ1JPU0VDT05EUyhzZWxmKSwKKyAgICAgICAgICAgICAgICAgICAgIDEpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZGVsdGFfcG9zaXRpdmUoUHlEYXRlVGltZV9EZWx0YSAqc2VsZikKIHsKLQkvKiBDb3VsZCBvcHRpbWl6ZSB0aGlzIChieSByZXR1cm5pbmcgc2VsZikgaWYgdGhpcyBpc24ndCBhCi0JICogc3ViY2xhc3MgLS0gYnV0IHdobyB1c2VzIHVuYXJ5ICsgPyAgQXBwcm94aW1hdGVseSBub2JvZHkuCi0JICovCi0JcmV0dXJuIG5ld19kZWx0YShHRVRfVERfREFZUyhzZWxmKSwKLQkJCSBHRVRfVERfU0VDT05EUyhzZWxmKSwKLQkJCSBHRVRfVERfTUlDUk9TRUNPTkRTKHNlbGYpLAotCQkJIDApOworICAgIC8qIENvdWxkIG9wdGltaXplIHRoaXMgKGJ5IHJldHVybmluZyBzZWxmKSBpZiB0aGlzIGlzbid0IGEKKyAgICAgKiBzdWJjbGFzcyAtLSBidXQgd2hvIHVzZXMgdW5hcnkgKyA/ICBBcHByb3hpbWF0ZWx5IG5vYm9keS4KKyAgICAgKi8KKyAgICByZXR1cm4gbmV3X2RlbHRhKEdFVF9URF9EQVlTKHNlbGYpLAorICAgICAgICAgICAgICAgICAgICAgR0VUX1REX1NFQ09ORFMoc2VsZiksCisgICAgICAgICAgICAgICAgICAgICBHRVRfVERfTUlDUk9TRUNPTkRTKHNlbGYpLAorICAgICAgICAgICAgICAgICAgICAgMCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkZWx0YV9hYnMoUHlEYXRlVGltZV9EZWx0YSAqc2VsZikKIHsKLQlQeU9iamVjdCAqcmVzdWx0OworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CiAKLQlhc3NlcnQoR0VUX1REX01JQ1JPU0VDT05EUyhzZWxmKSA+PSAwKTsKLQlhc3NlcnQoR0VUX1REX1NFQ09ORFMoc2VsZikgPj0gMCk7CisgICAgYXNzZXJ0KEdFVF9URF9NSUNST1NFQ09ORFMoc2VsZikgPj0gMCk7CisgICAgYXNzZXJ0KEdFVF9URF9TRUNPTkRTKHNlbGYpID49IDApOwogCi0JaWYgKEdFVF9URF9EQVlTKHNlbGYpIDwgMCkKLQkJcmVzdWx0ID0gZGVsdGFfbmVnYXRpdmUoc2VsZik7Ci0JZWxzZQotCQlyZXN1bHQgPSBkZWx0YV9wb3NpdGl2ZShzZWxmKTsKKyAgICBpZiAoR0VUX1REX0RBWVMoc2VsZikgPCAwKQorICAgICAgICByZXN1bHQgPSBkZWx0YV9uZWdhdGl2ZShzZWxmKTsKKyAgICBlbHNlCisgICAgICAgIHJlc3VsdCA9IGRlbHRhX3Bvc2l0aXZlKHNlbGYpOwogCi0JcmV0dXJuIHJlc3VsdDsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZGVsdGFfc3VidHJhY3QoUHlPYmplY3QgKmxlZnQsIFB5T2JqZWN0ICpyaWdodCkKIHsKLQlQeU9iamVjdCAqcmVzdWx0ID0gUHlfTm90SW1wbGVtZW50ZWQ7CisgICAgUHlPYmplY3QgKnJlc3VsdCA9IFB5X05vdEltcGxlbWVudGVkOwogCi0JaWYgKFB5RGVsdGFfQ2hlY2sobGVmdCkgJiYgUHlEZWx0YV9DaGVjayhyaWdodCkpIHsKLQkgICAgCS8qIGRlbHRhIC0gZGVsdGEgKi8KLQkgICAgCVB5T2JqZWN0ICptaW51c19yaWdodCA9IFB5TnVtYmVyX05lZ2F0aXZlKHJpZ2h0KTsKLQkgICAgCWlmIChtaW51c19yaWdodCkgewotCSAgICAJCXJlc3VsdCA9IGRlbHRhX2FkZChsZWZ0LCBtaW51c19yaWdodCk7Ci0JICAgIAkJUHlfREVDUkVGKG1pbnVzX3JpZ2h0KTsKLQkgICAgCX0KLQkgICAgCWVsc2UKLQkgICAgCQlyZXN1bHQgPSBOVUxMOwotCX0KKyAgICBpZiAoUHlEZWx0YV9DaGVjayhsZWZ0KSAmJiBQeURlbHRhX0NoZWNrKHJpZ2h0KSkgeworICAgICAgICAvKiBkZWx0YSAtIGRlbHRhICovCisgICAgICAgIFB5T2JqZWN0ICptaW51c19yaWdodCA9IFB5TnVtYmVyX05lZ2F0aXZlKHJpZ2h0KTsKKyAgICAgICAgaWYgKG1pbnVzX3JpZ2h0KSB7CisgICAgICAgICAgICByZXN1bHQgPSBkZWx0YV9hZGQobGVmdCwgbWludXNfcmlnaHQpOworICAgICAgICAgICAgUHlfREVDUkVGKG1pbnVzX3JpZ2h0KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICByZXN1bHQgPSBOVUxMOworICAgIH0KIAotCWlmIChyZXN1bHQgPT0gUHlfTm90SW1wbGVtZW50ZWQpCi0JCVB5X0lOQ1JFRihyZXN1bHQpOwotCXJldHVybiByZXN1bHQ7CisgICAgaWYgKHJlc3VsdCA9PSBQeV9Ob3RJbXBsZW1lbnRlZCkKKyAgICAgICAgUHlfSU5DUkVGKHJlc3VsdCk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogLyogVGhpcyBpcyBtb3JlIG5hdHVyYWwgYXMgYSB0cF9jb21wYXJlLCBidXQgZG9lc24ndCB3b3JrIHRoZW46ICBmb3Igd2hhdGV2ZXIKQEAgLTE3NTUsMjQgKzE3NTUsMjQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBkZWx0YV9yaWNoY29tcGFyZShQeURhdGVUaW1lX0RlbHRhICpzZWxmLCBQeU9iamVjdCAqb3RoZXIsIGludCBvcCkKIHsKLQlpbnQgZGlmZiA9IDQyOwkvKiBub25zZW5zZSAqLworICAgIGludCBkaWZmID0gNDI7ICAgICAgLyogbm9uc2Vuc2UgKi8KIAotCWlmIChQeURlbHRhX0NoZWNrKG90aGVyKSkgewotCQlkaWZmID0gR0VUX1REX0RBWVMoc2VsZikgLSBHRVRfVERfREFZUyhvdGhlcik7Ci0JCWlmIChkaWZmID09IDApIHsKLQkJCWRpZmYgPSBHRVRfVERfU0VDT05EUyhzZWxmKSAtIEdFVF9URF9TRUNPTkRTKG90aGVyKTsKLQkJCWlmIChkaWZmID09IDApCi0JCQkJZGlmZiA9IEdFVF9URF9NSUNST1NFQ09ORFMoc2VsZikgLQotCQkJCSAgICAgICBHRVRfVERfTUlDUk9TRUNPTkRTKG90aGVyKTsKLQkJfQotCX0KLQllbHNlIGlmIChvcCA9PSBQeV9FUSB8fCBvcCA9PSBQeV9ORSkKLQkJZGlmZiA9IDE7CS8qIGFueSBub24temVybyB2YWx1ZSB3aWxsIGRvICovCisgICAgaWYgKFB5RGVsdGFfQ2hlY2sob3RoZXIpKSB7CisgICAgICAgIGRpZmYgPSBHRVRfVERfREFZUyhzZWxmKSAtIEdFVF9URF9EQVlTKG90aGVyKTsKKyAgICAgICAgaWYgKGRpZmYgPT0gMCkgeworICAgICAgICAgICAgZGlmZiA9IEdFVF9URF9TRUNPTkRTKHNlbGYpIC0gR0VUX1REX1NFQ09ORFMob3RoZXIpOworICAgICAgICAgICAgaWYgKGRpZmYgPT0gMCkKKyAgICAgICAgICAgICAgICBkaWZmID0gR0VUX1REX01JQ1JPU0VDT05EUyhzZWxmKSAtCisgICAgICAgICAgICAgICAgICAgICAgIEdFVF9URF9NSUNST1NFQ09ORFMob3RoZXIpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKG9wID09IFB5X0VRIHx8IG9wID09IFB5X05FKQorICAgICAgICBkaWZmID0gMTsgICAgICAgICAgICAgICAvKiBhbnkgbm9uLXplcm8gdmFsdWUgd2lsbCBkbyAqLwogCi0JZWxzZSAvKiBzdG9wIHRoaXMgZnJvbSBmYWxsaW5nIGJhY2sgdG8gYWRkcmVzcyBjb21wYXJpc29uICovCi0JCXJldHVybiBjbXBlcnJvcigoUHlPYmplY3QgKilzZWxmLCBvdGhlcik7CisgICAgZWxzZSAvKiBzdG9wIHRoaXMgZnJvbSBmYWxsaW5nIGJhY2sgdG8gYWRkcmVzcyBjb21wYXJpc29uICovCisgICAgICAgIHJldHVybiBjbXBlcnJvcigoUHlPYmplY3QgKilzZWxmLCBvdGhlcik7CiAKLQlyZXR1cm4gZGlmZl90b19ib29sKGRpZmYsIG9wKTsKKyAgICByZXR1cm4gZGlmZl90b19ib29sKGRpZmYsIG9wKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpkZWx0YV9nZXRzdGF0ZShQeURhdGVUaW1lX0RlbHRhICpzZWxmKTsKQEAgLTE3ODAsNTIgKzE3ODAsNTIgQEAKIHN0YXRpYyBsb25nCiBkZWx0YV9oYXNoKFB5RGF0ZVRpbWVfRGVsdGEgKnNlbGYpCiB7Ci0JaWYgKHNlbGYtPmhhc2hjb2RlID09IC0xKSB7Ci0JCVB5T2JqZWN0ICp0ZW1wID0gZGVsdGFfZ2V0c3RhdGUoc2VsZik7Ci0JCWlmICh0ZW1wICE9IE5VTEwpIHsKLQkJCXNlbGYtPmhhc2hjb2RlID0gUHlPYmplY3RfSGFzaCh0ZW1wKTsKLQkJCVB5X0RFQ1JFRih0ZW1wKTsKLQkJfQotCX0KLQlyZXR1cm4gc2VsZi0+aGFzaGNvZGU7CisgICAgaWYgKHNlbGYtPmhhc2hjb2RlID09IC0xKSB7CisgICAgICAgIFB5T2JqZWN0ICp0ZW1wID0gZGVsdGFfZ2V0c3RhdGUoc2VsZik7CisgICAgICAgIGlmICh0ZW1wICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHNlbGYtPmhhc2hjb2RlID0gUHlPYmplY3RfSGFzaCh0ZW1wKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih0ZW1wKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2VsZi0+aGFzaGNvZGU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkZWx0YV9tdWx0aXBseShQeU9iamVjdCAqbGVmdCwgUHlPYmplY3QgKnJpZ2h0KQogewotCVB5T2JqZWN0ICpyZXN1bHQgPSBQeV9Ob3RJbXBsZW1lbnRlZDsKKyAgICBQeU9iamVjdCAqcmVzdWx0ID0gUHlfTm90SW1wbGVtZW50ZWQ7CiAKLQlpZiAoUHlEZWx0YV9DaGVjayhsZWZ0KSkgewotCQkvKiBkZWx0YSAqID8/PyAqLwotCQlpZiAoUHlJbnRfQ2hlY2socmlnaHQpIHx8IFB5TG9uZ19DaGVjayhyaWdodCkpCi0JCQlyZXN1bHQgPSBtdWx0aXBseV9pbnRfdGltZWRlbHRhKHJpZ2h0LAotCQkJCQkoUHlEYXRlVGltZV9EZWx0YSAqKSBsZWZ0KTsKLQl9Ci0JZWxzZSBpZiAoUHlJbnRfQ2hlY2sobGVmdCkgfHwgUHlMb25nX0NoZWNrKGxlZnQpKQotCQlyZXN1bHQgPSBtdWx0aXBseV9pbnRfdGltZWRlbHRhKGxlZnQsCi0JCQkJCQkoUHlEYXRlVGltZV9EZWx0YSAqKSByaWdodCk7CisgICAgaWYgKFB5RGVsdGFfQ2hlY2sobGVmdCkpIHsKKyAgICAgICAgLyogZGVsdGEgKiA/Pz8gKi8KKyAgICAgICAgaWYgKFB5SW50X0NoZWNrKHJpZ2h0KSB8fCBQeUxvbmdfQ2hlY2socmlnaHQpKQorICAgICAgICAgICAgcmVzdWx0ID0gbXVsdGlwbHlfaW50X3RpbWVkZWx0YShyaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUHlEYXRlVGltZV9EZWx0YSAqKSBsZWZ0KTsKKyAgICB9CisgICAgZWxzZSBpZiAoUHlJbnRfQ2hlY2sobGVmdCkgfHwgUHlMb25nX0NoZWNrKGxlZnQpKQorICAgICAgICByZXN1bHQgPSBtdWx0aXBseV9pbnRfdGltZWRlbHRhKGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFB5RGF0ZVRpbWVfRGVsdGEgKikgcmlnaHQpOwogCi0JaWYgKHJlc3VsdCA9PSBQeV9Ob3RJbXBsZW1lbnRlZCkKLQkJUHlfSU5DUkVGKHJlc3VsdCk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBpZiAocmVzdWx0ID09IFB5X05vdEltcGxlbWVudGVkKQorICAgICAgICBQeV9JTkNSRUYocmVzdWx0KTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZGVsdGFfZGl2aWRlKFB5T2JqZWN0ICpsZWZ0LCBQeU9iamVjdCAqcmlnaHQpCiB7Ci0JUHlPYmplY3QgKnJlc3VsdCA9IFB5X05vdEltcGxlbWVudGVkOworICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBQeV9Ob3RJbXBsZW1lbnRlZDsKIAotCWlmIChQeURlbHRhX0NoZWNrKGxlZnQpKSB7Ci0JCS8qIGRlbHRhICogPz8/ICovCi0JCWlmIChQeUludF9DaGVjayhyaWdodCkgfHwgUHlMb25nX0NoZWNrKHJpZ2h0KSkKLQkJCXJlc3VsdCA9IGRpdmlkZV90aW1lZGVsdGFfaW50KAotCQkJCQkoUHlEYXRlVGltZV9EZWx0YSAqKWxlZnQsCi0JCQkJCXJpZ2h0KTsKLQl9CisgICAgaWYgKFB5RGVsdGFfQ2hlY2sobGVmdCkpIHsKKyAgICAgICAgLyogZGVsdGEgKiA/Pz8gKi8KKyAgICAgICAgaWYgKFB5SW50X0NoZWNrKHJpZ2h0KSB8fCBQeUxvbmdfQ2hlY2socmlnaHQpKQorICAgICAgICAgICAgcmVzdWx0ID0gZGl2aWRlX3RpbWVkZWx0YV9pbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFB5RGF0ZVRpbWVfRGVsdGEgKilsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0KTsKKyAgICB9CiAKLQlpZiAocmVzdWx0ID09IFB5X05vdEltcGxlbWVudGVkKQotCQlQeV9JTkNSRUYocmVzdWx0KTsKLQlyZXR1cm4gcmVzdWx0OworICAgIGlmIChyZXN1bHQgPT0gUHlfTm90SW1wbGVtZW50ZWQpCisgICAgICAgIFB5X0lOQ1JFRihyZXN1bHQpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIC8qIEZvbGQgaW4gdGhlIHZhbHVlIG9mIHRoZSB0YWcgKCJzZWNvbmRzIiwgIndlZWtzIiwgZXRjKSBjb21wb25lbnQgb2YgYQpAQCAtMTg0MSwxNjkgKzE4NDEsMTY5IEBACiBhY2N1bShjb25zdCBjaGFyKiB0YWcsIFB5T2JqZWN0ICpzb2ZhciwgUHlPYmplY3QgKm51bSwgUHlPYmplY3QgKmZhY3RvciwKICAgICAgIGRvdWJsZSAqbGVmdG92ZXIpCiB7Ci0JUHlPYmplY3QgKnByb2Q7Ci0JUHlPYmplY3QgKnN1bTsKKyAgICBQeU9iamVjdCAqcHJvZDsKKyAgICBQeU9iamVjdCAqc3VtOwogCi0JYXNzZXJ0KG51bSAhPSBOVUxMKTsKKyAgICBhc3NlcnQobnVtICE9IE5VTEwpOwogCi0JaWYgKFB5SW50X0NoZWNrKG51bSkgfHwgUHlMb25nX0NoZWNrKG51bSkpIHsKLQkJcHJvZCA9IFB5TnVtYmVyX011bHRpcGx5KG51bSwgZmFjdG9yKTsKLQkJaWYgKHByb2QgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQlzdW0gPSBQeU51bWJlcl9BZGQoc29mYXIsIHByb2QpOwotCQlQeV9ERUNSRUYocHJvZCk7Ci0JCXJldHVybiBzdW07Ci0JfQorICAgIGlmIChQeUludF9DaGVjayhudW0pIHx8IFB5TG9uZ19DaGVjayhudW0pKSB7CisgICAgICAgIHByb2QgPSBQeU51bWJlcl9NdWx0aXBseShudW0sIGZhY3Rvcik7CisgICAgICAgIGlmIChwcm9kID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgc3VtID0gUHlOdW1iZXJfQWRkKHNvZmFyLCBwcm9kKTsKKyAgICAgICAgUHlfREVDUkVGKHByb2QpOworICAgICAgICByZXR1cm4gc3VtOworICAgIH0KIAotCWlmIChQeUZsb2F0X0NoZWNrKG51bSkpIHsKLQkJZG91YmxlIGRudW07Ci0JCWRvdWJsZSBmcmFjcGFydDsKLQkJZG91YmxlIGludHBhcnQ7Ci0JCVB5T2JqZWN0ICp4OwotCQlQeU9iamVjdCAqeTsKKyAgICBpZiAoUHlGbG9hdF9DaGVjayhudW0pKSB7CisgICAgICAgIGRvdWJsZSBkbnVtOworICAgICAgICBkb3VibGUgZnJhY3BhcnQ7CisgICAgICAgIGRvdWJsZSBpbnRwYXJ0OworICAgICAgICBQeU9iamVjdCAqeDsKKyAgICAgICAgUHlPYmplY3QgKnk7CiAKLQkJLyogVGhlIFBsYW46ICBkZWNvbXBvc2UgbnVtIGludG8gYW4gaW50ZWdlciBwYXJ0IGFuZCBhCi0JCSAqIGZyYWN0aW9uYWwgcGFydCwgbnVtID0gaW50cGFydCArIGZyYWNwYXJ0LgotCQkgKiBUaGVuIG51bSAqIGZhY3RvciA9PQotCQkgKiAgICAgIGludHBhcnQgKiBmYWN0b3IgKyBmcmFjcGFydCAqIGZhY3RvcgotCQkgKiBhbmQgdGhlIExIUyBjYW4gYmUgY29tcHV0ZWQgZXhhY3RseSBpbiBsb25nIGFyaXRobWV0aWMuCi0JCSAqIFRoZSBSSFMgaXMgYWdhaW4gYnJva2VuIGludG8gYW4gaW50IHBhcnQgYW5kIGZyYWMgcGFydC4KLQkJICogYW5kIHRoZSBmcmFjIHBhcnQgaXMgYWRkZWQgaW50byAqbGVmdG92ZXIuCi0JCSAqLwotCQlkbnVtID0gUHlGbG9hdF9Bc0RvdWJsZShudW0pOwotCQlpZiAoZG51bSA9PSAtMS4wICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCQlyZXR1cm4gTlVMTDsKLQkJZnJhY3BhcnQgPSBtb2RmKGRudW0sICZpbnRwYXJ0KTsKLQkJeCA9IFB5TG9uZ19Gcm9tRG91YmxlKGludHBhcnQpOwotCQlpZiAoeCA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7CisgICAgICAgIC8qIFRoZSBQbGFuOiAgZGVjb21wb3NlIG51bSBpbnRvIGFuIGludGVnZXIgcGFydCBhbmQgYQorICAgICAgICAgKiBmcmFjdGlvbmFsIHBhcnQsIG51bSA9IGludHBhcnQgKyBmcmFjcGFydC4KKyAgICAgICAgICogVGhlbiBudW0gKiBmYWN0b3IgPT0KKyAgICAgICAgICogICAgICBpbnRwYXJ0ICogZmFjdG9yICsgZnJhY3BhcnQgKiBmYWN0b3IKKyAgICAgICAgICogYW5kIHRoZSBMSFMgY2FuIGJlIGNvbXB1dGVkIGV4YWN0bHkgaW4gbG9uZyBhcml0aG1ldGljLgorICAgICAgICAgKiBUaGUgUkhTIGlzIGFnYWluIGJyb2tlbiBpbnRvIGFuIGludCBwYXJ0IGFuZCBmcmFjIHBhcnQuCisgICAgICAgICAqIGFuZCB0aGUgZnJhYyBwYXJ0IGlzIGFkZGVkIGludG8gKmxlZnRvdmVyLgorICAgICAgICAgKi8KKyAgICAgICAgZG51bSA9IFB5RmxvYXRfQXNEb3VibGUobnVtKTsKKyAgICAgICAgaWYgKGRudW0gPT0gLTEuMCAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGZyYWNwYXJ0ID0gbW9kZihkbnVtLCAmaW50cGFydCk7CisgICAgICAgIHggPSBQeUxvbmdfRnJvbURvdWJsZShpbnRwYXJ0KTsKKyAgICAgICAgaWYgKHggPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogCi0JCXByb2QgPSBQeU51bWJlcl9NdWx0aXBseSh4LCBmYWN0b3IpOwotCQlQeV9ERUNSRUYoeCk7Ci0JCWlmIChwcm9kID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKKyAgICAgICAgcHJvZCA9IFB5TnVtYmVyX011bHRpcGx5KHgsIGZhY3Rvcik7CisgICAgICAgIFB5X0RFQ1JFRih4KTsKKyAgICAgICAgaWYgKHByb2QgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogCi0JCXN1bSA9IFB5TnVtYmVyX0FkZChzb2ZhciwgcHJvZCk7Ci0JCVB5X0RFQ1JFRihwcm9kKTsKLQkJaWYgKHN1bSA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7CisgICAgICAgIHN1bSA9IFB5TnVtYmVyX0FkZChzb2ZhciwgcHJvZCk7CisgICAgICAgIFB5X0RFQ1JFRihwcm9kKTsKKyAgICAgICAgaWYgKHN1bSA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkJaWYgKGZyYWNwYXJ0ID09IDAuMCkKLQkJCXJldHVybiBzdW07Ci0JCS8qIFNvIGZhciB3ZSd2ZSBsb3N0IG5vIGluZm9ybWF0aW9uLiAgRGVhbGluZyB3aXRoIHRoZQotCQkgKiBmcmFjdGlvbmFsIHBhcnQgcmVxdWlyZXMgZmxvYXQgYXJpdGhtZXRpYywgYW5kIG1heQotCQkgKiBsb3NlIGEgbGl0dGxlIGluZm8uCi0JCSAqLwotCQlhc3NlcnQoUHlJbnRfQ2hlY2soZmFjdG9yKSB8fCBQeUxvbmdfQ2hlY2soZmFjdG9yKSk7Ci0JCWlmIChQeUludF9DaGVjayhmYWN0b3IpKQotCQkJZG51bSA9IChkb3VibGUpUHlJbnRfQXNMb25nKGZhY3Rvcik7Ci0JCWVsc2UKLQkJCWRudW0gPSBQeUxvbmdfQXNEb3VibGUoZmFjdG9yKTsKKyAgICAgICAgaWYgKGZyYWNwYXJ0ID09IDAuMCkKKyAgICAgICAgICAgIHJldHVybiBzdW07CisgICAgICAgIC8qIFNvIGZhciB3ZSd2ZSBsb3N0IG5vIGluZm9ybWF0aW9uLiAgRGVhbGluZyB3aXRoIHRoZQorICAgICAgICAgKiBmcmFjdGlvbmFsIHBhcnQgcmVxdWlyZXMgZmxvYXQgYXJpdGhtZXRpYywgYW5kIG1heQorICAgICAgICAgKiBsb3NlIGEgbGl0dGxlIGluZm8uCisgICAgICAgICAqLworICAgICAgICBhc3NlcnQoUHlJbnRfQ2hlY2soZmFjdG9yKSB8fCBQeUxvbmdfQ2hlY2soZmFjdG9yKSk7CisgICAgICAgIGlmIChQeUludF9DaGVjayhmYWN0b3IpKQorICAgICAgICAgICAgZG51bSA9IChkb3VibGUpUHlJbnRfQXNMb25nKGZhY3Rvcik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGRudW0gPSBQeUxvbmdfQXNEb3VibGUoZmFjdG9yKTsKIAotCQlkbnVtICo9IGZyYWNwYXJ0OwotCQlmcmFjcGFydCA9IG1vZGYoZG51bSwgJmludHBhcnQpOwotCQl4ID0gUHlMb25nX0Zyb21Eb3VibGUoaW50cGFydCk7Ci0JCWlmICh4ID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRihzdW0pOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KKyAgICAgICAgZG51bSAqPSBmcmFjcGFydDsKKyAgICAgICAgZnJhY3BhcnQgPSBtb2RmKGRudW0sICZpbnRwYXJ0KTsKKyAgICAgICAgeCA9IFB5TG9uZ19Gcm9tRG91YmxlKGludHBhcnQpOworICAgICAgICBpZiAoeCA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoc3VtKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CiAKLQkJeSA9IFB5TnVtYmVyX0FkZChzdW0sIHgpOwotCQlQeV9ERUNSRUYoc3VtKTsKLQkJUHlfREVDUkVGKHgpOwotCQkqbGVmdG92ZXIgKz0gZnJhY3BhcnQ7Ci0JCXJldHVybiB5OwotCX0KKyAgICAgICAgeSA9IFB5TnVtYmVyX0FkZChzdW0sIHgpOworICAgICAgICBQeV9ERUNSRUYoc3VtKTsKKyAgICAgICAgUHlfREVDUkVGKHgpOworICAgICAgICAqbGVmdG92ZXIgKz0gZnJhY3BhcnQ7CisgICAgICAgIHJldHVybiB5OworICAgIH0KIAotCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCSAgICAgInVuc3VwcG9ydGVkIHR5cGUgZm9yIHRpbWVkZWx0YSAlcyBjb21wb25lbnQ6ICVzIiwKLQkJICAgICB0YWcsIFB5X1RZUEUobnVtKS0+dHBfbmFtZSk7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgInVuc3VwcG9ydGVkIHR5cGUgZm9yIHRpbWVkZWx0YSAlcyBjb21wb25lbnQ6ICVzIiwKKyAgICAgICAgICAgICAgICAgdGFnLCBQeV9UWVBFKG51bSktPnRwX25hbWUpOworICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZGVsdGFfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprdykKIHsKLQlQeU9iamVjdCAqc2VsZiA9IE5VTEw7CisgICAgUHlPYmplY3QgKnNlbGYgPSBOVUxMOwogCi0JLyogQXJndW1lbnQgb2JqZWN0cy4gKi8KLQlQeU9iamVjdCAqZGF5ID0gTlVMTDsKLQlQeU9iamVjdCAqc2Vjb25kID0gTlVMTDsKLQlQeU9iamVjdCAqdXMgPSBOVUxMOwotCVB5T2JqZWN0ICptcyA9IE5VTEw7Ci0JUHlPYmplY3QgKm1pbnV0ZSA9IE5VTEw7Ci0JUHlPYmplY3QgKmhvdXIgPSBOVUxMOwotCVB5T2JqZWN0ICp3ZWVrID0gTlVMTDsKKyAgICAvKiBBcmd1bWVudCBvYmplY3RzLiAqLworICAgIFB5T2JqZWN0ICpkYXkgPSBOVUxMOworICAgIFB5T2JqZWN0ICpzZWNvbmQgPSBOVUxMOworICAgIFB5T2JqZWN0ICp1cyA9IE5VTEw7CisgICAgUHlPYmplY3QgKm1zID0gTlVMTDsKKyAgICBQeU9iamVjdCAqbWludXRlID0gTlVMTDsKKyAgICBQeU9iamVjdCAqaG91ciA9IE5VTEw7CisgICAgUHlPYmplY3QgKndlZWsgPSBOVUxMOwogCi0JUHlPYmplY3QgKnggPSBOVUxMOwkvKiBydW5uaW5nIHN1bSBvZiBtaWNyb3NlY29uZHMgKi8KLQlQeU9iamVjdCAqeSA9IE5VTEw7CS8qIHRlbXAgc3VtIG9mIG1pY3Jvc2Vjb25kcyAqLwotCWRvdWJsZSBsZWZ0b3Zlcl91cyA9IDAuMDsKKyAgICBQeU9iamVjdCAqeCA9IE5VTEw7ICAgICAgICAgLyogcnVubmluZyBzdW0gb2YgbWljcm9zZWNvbmRzICovCisgICAgUHlPYmplY3QgKnkgPSBOVUxMOyAgICAgICAgIC8qIHRlbXAgc3VtIG9mIG1pY3Jvc2Vjb25kcyAqLworICAgIGRvdWJsZSBsZWZ0b3Zlcl91cyA9IDAuMDsKIAotCXN0YXRpYyBjaGFyICprZXl3b3Jkc1tdID0gewotCQkiZGF5cyIsICJzZWNvbmRzIiwgIm1pY3Jvc2Vjb25kcyIsICJtaWxsaXNlY29uZHMiLAotCQkibWludXRlcyIsICJob3VycyIsICJ3ZWVrcyIsIE5VTEwKLQl9OworICAgIHN0YXRpYyBjaGFyICprZXl3b3Jkc1tdID0geworICAgICAgICAiZGF5cyIsICJzZWNvbmRzIiwgIm1pY3Jvc2Vjb25kcyIsICJtaWxsaXNlY29uZHMiLAorICAgICAgICAibWludXRlcyIsICJob3VycyIsICJ3ZWVrcyIsIE5VTEwKKyAgICB9OwogCi0JaWYgKFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrdywgInxPT09PT09POl9fbmV3X18iLAotCQkJCQlrZXl3b3JkcywKLQkJCQkJJmRheSwgJnNlY29uZCwgJnVzLAotCQkJCQkmbXMsICZtaW51dGUsICZob3VyLCAmd2VlaykgPT0gMCkKLQkJZ290byBEb25lOworICAgIGlmIChQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3csICJ8T09PT09PTzpfX25ld19fIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXdvcmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRheSwgJnNlY29uZCwgJnVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1zLCAmbWludXRlLCAmaG91ciwgJndlZWspID09IDApCisgICAgICAgIGdvdG8gRG9uZTsKIAotCXggPSBQeUludF9Gcm9tTG9uZygwKTsKLQlpZiAoeCA9PSBOVUxMKQotCQlnb3RvIERvbmU7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKDApOworICAgIGlmICh4ID09IE5VTEwpCisgICAgICAgIGdvdG8gRG9uZTsKIAotI2RlZmluZSBDTEVBTlVQIAlcCi0JUHlfREVDUkVGKHgpOwlcCi0JeCA9IHk7CQlcCi0JaWYgKHggPT0gTlVMTCkJXAotCQlnb3RvIERvbmUKKyNkZWZpbmUgQ0xFQU5VUCAgICAgICAgIFwKKyAgICBQeV9ERUNSRUYoeCk7ICAgICAgIFwKKyAgICB4ID0geTsgICAgICAgICAgICAgIFwKKyAgICBpZiAoeCA9PSBOVUxMKSAgICAgIFwKKyAgICAgICAgZ290byBEb25lCiAKLQlpZiAodXMpIHsKLQkJeSA9IGFjY3VtKCJtaWNyb3NlY29uZHMiLCB4LCB1cywgdXNfcGVyX3VzLCAmbGVmdG92ZXJfdXMpOwotCQlDTEVBTlVQOwotCX0KLQlpZiAobXMpIHsKLQkJeSA9IGFjY3VtKCJtaWxsaXNlY29uZHMiLCB4LCBtcywgdXNfcGVyX21zLCAmbGVmdG92ZXJfdXMpOwotCQlDTEVBTlVQOwotCX0KLQlpZiAoc2Vjb25kKSB7Ci0JCXkgPSBhY2N1bSgic2Vjb25kcyIsIHgsIHNlY29uZCwgdXNfcGVyX3NlY29uZCwgJmxlZnRvdmVyX3VzKTsKLQkJQ0xFQU5VUDsKLQl9Ci0JaWYgKG1pbnV0ZSkgewotCQl5ID0gYWNjdW0oIm1pbnV0ZXMiLCB4LCBtaW51dGUsIHVzX3Blcl9taW51dGUsICZsZWZ0b3Zlcl91cyk7Ci0JCUNMRUFOVVA7Ci0JfQotCWlmIChob3VyKSB7Ci0JCXkgPSBhY2N1bSgiaG91cnMiLCB4LCBob3VyLCB1c19wZXJfaG91ciwgJmxlZnRvdmVyX3VzKTsKLQkJQ0xFQU5VUDsKLQl9Ci0JaWYgKGRheSkgewotCQl5ID0gYWNjdW0oImRheXMiLCB4LCBkYXksIHVzX3Blcl9kYXksICZsZWZ0b3Zlcl91cyk7Ci0JCUNMRUFOVVA7Ci0JfQotCWlmICh3ZWVrKSB7Ci0JCXkgPSBhY2N1bSgid2Vla3MiLCB4LCB3ZWVrLCB1c19wZXJfd2VlaywgJmxlZnRvdmVyX3VzKTsKLQkJQ0xFQU5VUDsKLQl9Ci0JaWYgKGxlZnRvdmVyX3VzKSB7Ci0JCS8qIFJvdW5kIHRvIG5lYXJlc3Qgd2hvbGUgIyBvZiB1cywgYW5kIGFkZCBpbnRvIHguICovCi0JCVB5T2JqZWN0ICp0ZW1wID0gUHlMb25nX0Zyb21Mb25nKHJvdW5kX3RvX2xvbmcobGVmdG92ZXJfdXMpKTsKLQkJaWYgKHRlbXAgPT0gTlVMTCkgewotCQkJUHlfREVDUkVGKHgpOwotCQkJZ290byBEb25lOwotCQl9Ci0JCXkgPSBQeU51bWJlcl9BZGQoeCwgdGVtcCk7Ci0JCVB5X0RFQ1JFRih0ZW1wKTsKLQkJQ0xFQU5VUDsKLQl9CisgICAgaWYgKHVzKSB7CisgICAgICAgIHkgPSBhY2N1bSgibWljcm9zZWNvbmRzIiwgeCwgdXMsIHVzX3Blcl91cywgJmxlZnRvdmVyX3VzKTsKKyAgICAgICAgQ0xFQU5VUDsKKyAgICB9CisgICAgaWYgKG1zKSB7CisgICAgICAgIHkgPSBhY2N1bSgibWlsbGlzZWNvbmRzIiwgeCwgbXMsIHVzX3Blcl9tcywgJmxlZnRvdmVyX3VzKTsKKyAgICAgICAgQ0xFQU5VUDsKKyAgICB9CisgICAgaWYgKHNlY29uZCkgeworICAgICAgICB5ID0gYWNjdW0oInNlY29uZHMiLCB4LCBzZWNvbmQsIHVzX3Blcl9zZWNvbmQsICZsZWZ0b3Zlcl91cyk7CisgICAgICAgIENMRUFOVVA7CisgICAgfQorICAgIGlmIChtaW51dGUpIHsKKyAgICAgICAgeSA9IGFjY3VtKCJtaW51dGVzIiwgeCwgbWludXRlLCB1c19wZXJfbWludXRlLCAmbGVmdG92ZXJfdXMpOworICAgICAgICBDTEVBTlVQOworICAgIH0KKyAgICBpZiAoaG91cikgeworICAgICAgICB5ID0gYWNjdW0oImhvdXJzIiwgeCwgaG91ciwgdXNfcGVyX2hvdXIsICZsZWZ0b3Zlcl91cyk7CisgICAgICAgIENMRUFOVVA7CisgICAgfQorICAgIGlmIChkYXkpIHsKKyAgICAgICAgeSA9IGFjY3VtKCJkYXlzIiwgeCwgZGF5LCB1c19wZXJfZGF5LCAmbGVmdG92ZXJfdXMpOworICAgICAgICBDTEVBTlVQOworICAgIH0KKyAgICBpZiAod2VlaykgeworICAgICAgICB5ID0gYWNjdW0oIndlZWtzIiwgeCwgd2VlaywgdXNfcGVyX3dlZWssICZsZWZ0b3Zlcl91cyk7CisgICAgICAgIENMRUFOVVA7CisgICAgfQorICAgIGlmIChsZWZ0b3Zlcl91cykgeworICAgICAgICAvKiBSb3VuZCB0byBuZWFyZXN0IHdob2xlICMgb2YgdXMsIGFuZCBhZGQgaW50byB4LiAqLworICAgICAgICBQeU9iamVjdCAqdGVtcCA9IFB5TG9uZ19Gcm9tTG9uZyhyb3VuZF90b19sb25nKGxlZnRvdmVyX3VzKSk7CisgICAgICAgIGlmICh0ZW1wID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih4KTsKKyAgICAgICAgICAgIGdvdG8gRG9uZTsKKyAgICAgICAgfQorICAgICAgICB5ID0gUHlOdW1iZXJfQWRkKHgsIHRlbXApOworICAgICAgICBQeV9ERUNSRUYodGVtcCk7CisgICAgICAgIENMRUFOVVA7CisgICAgfQogCi0Jc2VsZiA9IG1pY3Jvc2Vjb25kc190b19kZWx0YV9leCh4LCB0eXBlKTsKLQlQeV9ERUNSRUYoeCk7CisgICAgc2VsZiA9IG1pY3Jvc2Vjb25kc190b19kZWx0YV9leCh4LCB0eXBlKTsKKyAgICBQeV9ERUNSRUYoeCk7CiBEb25lOgotCXJldHVybiBzZWxmOworICAgIHJldHVybiBzZWxmOwogCiAjdW5kZWYgQ0xFQU5VUAogfQpAQCAtMjAxMSw3NSArMjAxMSw3NSBAQAogc3RhdGljIGludAogZGVsdGFfbm9uemVybyhQeURhdGVUaW1lX0RlbHRhICpzZWxmKQogewotCXJldHVybiAoR0VUX1REX0RBWVMoc2VsZikgIT0gMAotCQl8fCBHRVRfVERfU0VDT05EUyhzZWxmKSAhPSAwCi0JCXx8IEdFVF9URF9NSUNST1NFQ09ORFMoc2VsZikgIT0gMCk7CisgICAgcmV0dXJuIChHRVRfVERfREFZUyhzZWxmKSAhPSAwCisgICAgICAgIHx8IEdFVF9URF9TRUNPTkRTKHNlbGYpICE9IDAKKyAgICAgICAgfHwgR0VUX1REX01JQ1JPU0VDT05EUyhzZWxmKSAhPSAwKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRlbHRhX3JlcHIoUHlEYXRlVGltZV9EZWx0YSAqc2VsZikKIHsKLQlpZiAoR0VUX1REX01JQ1JPU0VDT05EUyhzZWxmKSAhPSAwKQotCQlyZXR1cm4gUHlTdHJpbmdfRnJvbUZvcm1hdCgiJXMoJWQsICVkLCAlZCkiLAotCQkJCQkgICBQeV9UWVBFKHNlbGYpLT50cF9uYW1lLAotCQkJCQkgICBHRVRfVERfREFZUyhzZWxmKSwKLQkJCQkJICAgR0VUX1REX1NFQ09ORFMoc2VsZiksCi0JCQkJCSAgIEdFVF9URF9NSUNST1NFQ09ORFMoc2VsZikpOwotCWlmIChHRVRfVERfU0VDT05EUyhzZWxmKSAhPSAwKQotCQlyZXR1cm4gUHlTdHJpbmdfRnJvbUZvcm1hdCgiJXMoJWQsICVkKSIsCi0JCQkJCSAgIFB5X1RZUEUoc2VsZiktPnRwX25hbWUsCi0JCQkJCSAgIEdFVF9URF9EQVlTKHNlbGYpLAotCQkJCQkgICBHRVRfVERfU0VDT05EUyhzZWxmKSk7CisgICAgaWYgKEdFVF9URF9NSUNST1NFQ09ORFMoc2VsZikgIT0gMCkKKyAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21Gb3JtYXQoIiVzKCVkLCAlZCwgJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRShzZWxmKS0+dHBfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VUX1REX0RBWVMoc2VsZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9URF9TRUNPTkRTKHNlbGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRVRfVERfTUlDUk9TRUNPTkRTKHNlbGYpKTsKKyAgICBpZiAoR0VUX1REX1NFQ09ORFMoc2VsZikgIT0gMCkKKyAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21Gb3JtYXQoIiVzKCVkLCAlZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9UWVBFKHNlbGYpLT50cF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRVRfVERfREFZUyhzZWxmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VUX1REX1NFQ09ORFMoc2VsZikpOwogCi0JcmV0dXJuIFB5U3RyaW5nX0Zyb21Gb3JtYXQoIiVzKCVkKSIsCi0JCQkJICAgUHlfVFlQRShzZWxmKS0+dHBfbmFtZSwKLQkJCQkgICBHRVRfVERfREFZUyhzZWxmKSk7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21Gb3JtYXQoIiVzKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRShzZWxmKS0+dHBfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRVRfVERfREFZUyhzZWxmKSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkZWx0YV9zdHIoUHlEYXRlVGltZV9EZWx0YSAqc2VsZikKIHsKLQlpbnQgZGF5cyA9IEdFVF9URF9EQVlTKHNlbGYpOwotCWludCBzZWNvbmRzID0gR0VUX1REX1NFQ09ORFMoc2VsZik7Ci0JaW50IHVzID0gR0VUX1REX01JQ1JPU0VDT05EUyhzZWxmKTsKLQlpbnQgaG91cnM7Ci0JaW50IG1pbnV0ZXM7Ci0JY2hhciBidWZbMTAwXTsKLQljaGFyICpwYnVmID0gYnVmOwotCXNpemVfdCBidWZsZW4gPSBzaXplb2YoYnVmKTsKLQlpbnQgbjsKKyAgICBpbnQgZGF5cyA9IEdFVF9URF9EQVlTKHNlbGYpOworICAgIGludCBzZWNvbmRzID0gR0VUX1REX1NFQ09ORFMoc2VsZik7CisgICAgaW50IHVzID0gR0VUX1REX01JQ1JPU0VDT05EUyhzZWxmKTsKKyAgICBpbnQgaG91cnM7CisgICAgaW50IG1pbnV0ZXM7CisgICAgY2hhciBidWZbMTAwXTsKKyAgICBjaGFyICpwYnVmID0gYnVmOworICAgIHNpemVfdCBidWZsZW4gPSBzaXplb2YoYnVmKTsKKyAgICBpbnQgbjsKIAotCW1pbnV0ZXMgPSBkaXZtb2Qoc2Vjb25kcywgNjAsICZzZWNvbmRzKTsKLQlob3VycyA9IGRpdm1vZChtaW51dGVzLCA2MCwgJm1pbnV0ZXMpOworICAgIG1pbnV0ZXMgPSBkaXZtb2Qoc2Vjb25kcywgNjAsICZzZWNvbmRzKTsKKyAgICBob3VycyA9IGRpdm1vZChtaW51dGVzLCA2MCwgJm1pbnV0ZXMpOwogCi0JaWYgKGRheXMpIHsKLQkJbiA9IFB5T1Nfc25wcmludGYocGJ1ZiwgYnVmbGVuLCAiJWQgZGF5JXMsICIsIGRheXMsCi0JCQkJICAoZGF5cyA9PSAxIHx8IGRheXMgPT0gLTEpID8gIiIgOiAicyIpOwotCQlpZiAobiA8IDAgfHwgKHNpemVfdCluID49IGJ1ZmxlbikKLQkJCWdvdG8gRmFpbDsKLQkJcGJ1ZiArPSBuOwotCQlidWZsZW4gLT0gKHNpemVfdCluOwotCX0KKyAgICBpZiAoZGF5cykgeworICAgICAgICBuID0gUHlPU19zbnByaW50ZihwYnVmLCBidWZsZW4sICIlZCBkYXklcywgIiwgZGF5cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGRheXMgPT0gMSB8fCBkYXlzID09IC0xKSA/ICIiIDogInMiKTsKKyAgICAgICAgaWYgKG4gPCAwIHx8IChzaXplX3QpbiA+PSBidWZsZW4pCisgICAgICAgICAgICBnb3RvIEZhaWw7CisgICAgICAgIHBidWYgKz0gbjsKKyAgICAgICAgYnVmbGVuIC09IChzaXplX3QpbjsKKyAgICB9CiAKLQluID0gUHlPU19zbnByaW50ZihwYnVmLCBidWZsZW4sICIlZDolMDJkOiUwMmQiLAotCQkJICBob3VycywgbWludXRlcywgc2Vjb25kcyk7Ci0JaWYgKG4gPCAwIHx8IChzaXplX3QpbiA+PSBidWZsZW4pCi0JCWdvdG8gRmFpbDsKLQlwYnVmICs9IG47Ci0JYnVmbGVuIC09IChzaXplX3QpbjsKKyAgICBuID0gUHlPU19zbnByaW50ZihwYnVmLCBidWZsZW4sICIlZDolMDJkOiUwMmQiLAorICAgICAgICAgICAgICAgICAgICAgIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzKTsKKyAgICBpZiAobiA8IDAgfHwgKHNpemVfdCluID49IGJ1ZmxlbikKKyAgICAgICAgZ290byBGYWlsOworICAgIHBidWYgKz0gbjsKKyAgICBidWZsZW4gLT0gKHNpemVfdCluOwogCi0JaWYgKHVzKSB7Ci0JCW4gPSBQeU9TX3NucHJpbnRmKHBidWYsIGJ1ZmxlbiwgIi4lMDZkIiwgdXMpOwotCQlpZiAobiA8IDAgfHwgKHNpemVfdCluID49IGJ1ZmxlbikKLQkJCWdvdG8gRmFpbDsKLQkJcGJ1ZiArPSBuOwotCX0KKyAgICBpZiAodXMpIHsKKyAgICAgICAgbiA9IFB5T1Nfc25wcmludGYocGJ1ZiwgYnVmbGVuLCAiLiUwNmQiLCB1cyk7CisgICAgICAgIGlmIChuIDwgMCB8fCAoc2l6ZV90KW4gPj0gYnVmbGVuKQorICAgICAgICAgICAgZ290byBGYWlsOworICAgICAgICBwYnVmICs9IG47CisgICAgfQogCi0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGJ1ZiwgcGJ1ZiAtIGJ1Zik7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGJ1ZiwgcGJ1ZiAtIGJ1Zik7CiAKICBGYWlsOgotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwgImdvb2Z5IHJlc3VsdCBmcm9tIFB5T1Nfc25wcmludGYiKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsICJnb29meSByZXN1bHQgZnJvbSBQeU9TX3NucHJpbnRmIik7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIC8qIFBpY2tsZSBzdXBwb3J0LCBhIHNpbXBsZSB1c2Ugb2YgX19yZWR1Y2VfXy4gKi8KQEAgLTIwODgsMTI0ICsyMDg4LDEyNCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGRlbHRhX2dldHN0YXRlKFB5RGF0ZVRpbWVfRGVsdGEgKnNlbGYpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImlpaSIsIEdFVF9URF9EQVlTKHNlbGYpLAotCQkJCSAgICBHRVRfVERfU0VDT05EUyhzZWxmKSwKLQkJCQkgICAgR0VUX1REX01JQ1JPU0VDT05EUyhzZWxmKSk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImlpaSIsIEdFVF9URF9EQVlTKHNlbGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRVRfVERfU0VDT05EUyhzZWxmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VUX1REX01JQ1JPU0VDT05EUyhzZWxmKSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkZWx0YV9yZWR1Y2UoUHlEYXRlVGltZV9EZWx0YSogc2VsZikKIHsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiT04iLCBQeV9UWVBFKHNlbGYpLCBkZWx0YV9nZXRzdGF0ZShzZWxmKSk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk9OIiwgUHlfVFlQRShzZWxmKSwgZGVsdGFfZ2V0c3RhdGUoc2VsZikpOwogfQogCiAjZGVmaW5lIE9GRlNFVChmaWVsZCkgIG9mZnNldG9mKFB5RGF0ZVRpbWVfRGVsdGEsIGZpZWxkKQogCiBzdGF0aWMgUHlNZW1iZXJEZWYgZGVsdGFfbWVtYmVyc1tdID0gewogCi0JeyJkYXlzIiwgICAgICAgICBUX0lOVCwgT0ZGU0VUKGRheXMpLCAgICAgICAgIFJFQURPTkxZLAotCSBQeURvY19TVFIoIk51bWJlciBvZiBkYXlzLiIpfSwKKyAgICB7ImRheXMiLCAgICAgICAgIFRfSU5ULCBPRkZTRVQoZGF5cyksICAgICAgICAgUkVBRE9OTFksCisgICAgIFB5RG9jX1NUUigiTnVtYmVyIG9mIGRheXMuIil9LAogCi0JeyJzZWNvbmRzIiwgICAgICBUX0lOVCwgT0ZGU0VUKHNlY29uZHMpLCAgICAgIFJFQURPTkxZLAotCSBQeURvY19TVFIoIk51bWJlciBvZiBzZWNvbmRzICg+PSAwIGFuZCBsZXNzIHRoYW4gMSBkYXkpLiIpfSwKKyAgICB7InNlY29uZHMiLCAgICAgIFRfSU5ULCBPRkZTRVQoc2Vjb25kcyksICAgICAgUkVBRE9OTFksCisgICAgIFB5RG9jX1NUUigiTnVtYmVyIG9mIHNlY29uZHMgKD49IDAgYW5kIGxlc3MgdGhhbiAxIGRheSkuIil9LAogCi0JeyJtaWNyb3NlY29uZHMiLCBUX0lOVCwgT0ZGU0VUKG1pY3Jvc2Vjb25kcyksIFJFQURPTkxZLAotCSBQeURvY19TVFIoIk51bWJlciBvZiBtaWNyb3NlY29uZHMgKD49IDAgYW5kIGxlc3MgdGhhbiAxIHNlY29uZCkuIil9LAotCXtOVUxMfQorICAgIHsibWljcm9zZWNvbmRzIiwgVF9JTlQsIE9GRlNFVChtaWNyb3NlY29uZHMpLCBSRUFET05MWSwKKyAgICAgUHlEb2NfU1RSKCJOdW1iZXIgb2YgbWljcm9zZWNvbmRzICg+PSAwIGFuZCBsZXNzIHRoYW4gMSBzZWNvbmQpLiIpfSwKKyAgICB7TlVMTH0KIH07CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBkZWx0YV9tZXRob2RzW10gPSB7Ci0JeyJfX3JlZHVjZV9fIiwgKFB5Q0Z1bmN0aW9uKWRlbHRhX3JlZHVjZSwgICAgIE1FVEhfTk9BUkdTLAotCSBQeURvY19TVFIoIl9fcmVkdWNlX18oKSAtPiAoY2xzLCBzdGF0ZSkiKX0sCisgICAgeyJfX3JlZHVjZV9fIiwgKFB5Q0Z1bmN0aW9uKWRlbHRhX3JlZHVjZSwgICAgIE1FVEhfTk9BUkdTLAorICAgICBQeURvY19TVFIoIl9fcmVkdWNlX18oKSAtPiAoY2xzLCBzdGF0ZSkiKX0sCiAKLQl7TlVMTCwJTlVMTH0sCisgICAge05VTEwsICAgICAgTlVMTH0sCiB9OwogCiBzdGF0aWMgY2hhciBkZWx0YV9kb2NbXSA9CiBQeURvY19TVFIoIkRpZmZlcmVuY2UgYmV0d2VlbiB0d28gZGF0ZXRpbWUgdmFsdWVzLiIpOwogCiBzdGF0aWMgUHlOdW1iZXJNZXRob2RzIGRlbHRhX2FzX251bWJlciA9IHsKLQlkZWx0YV9hZGQsCQkJCS8qIG5iX2FkZCAqLwotCWRlbHRhX3N1YnRyYWN0LAkJCQkvKiBuYl9zdWJ0cmFjdCAqLwotCWRlbHRhX211bHRpcGx5LAkJCQkvKiBuYl9tdWx0aXBseSAqLwotCWRlbHRhX2RpdmlkZSwJCQkJLyogbmJfZGl2aWRlICovCi0JMCwJCQkJCS8qIG5iX3JlbWFpbmRlciAqLwotCTAsCQkJCQkvKiBuYl9kaXZtb2QgKi8KLQkwLAkJCQkJLyogbmJfcG93ZXIgKi8KLQkodW5hcnlmdW5jKWRlbHRhX25lZ2F0aXZlLAkJLyogbmJfbmVnYXRpdmUgKi8KLQkodW5hcnlmdW5jKWRlbHRhX3Bvc2l0aXZlLAkJLyogbmJfcG9zaXRpdmUgKi8KLQkodW5hcnlmdW5jKWRlbHRhX2FicywJCQkvKiBuYl9hYnNvbHV0ZSAqLwotCShpbnF1aXJ5KWRlbHRhX25vbnplcm8sCQkJLyogbmJfbm9uemVybyAqLwotCTAsCQkJCQkvKm5iX2ludmVydCovCi0JMCwJCQkJCS8qbmJfbHNoaWZ0Ki8KLQkwLAkJCQkJLypuYl9yc2hpZnQqLwotCTAsCQkJCQkvKm5iX2FuZCovCi0JMCwJCQkJCS8qbmJfeG9yKi8KLQkwLAkJCQkJLypuYl9vciovCi0JMCwJCQkJCS8qbmJfY29lcmNlKi8KLQkwLAkJCQkJLypuYl9pbnQqLwotCTAsCQkJCQkvKm5iX2xvbmcqLwotCTAsCQkJCQkvKm5iX2Zsb2F0Ki8KLQkwLAkJCQkJLypuYl9vY3QqLwotCTAsIAkJCQkJLypuYl9oZXgqLwotCTAsCQkJCQkvKm5iX2lucGxhY2VfYWRkKi8KLQkwLAkJCQkJLypuYl9pbnBsYWNlX3N1YnRyYWN0Ki8KLQkwLAkJCQkJLypuYl9pbnBsYWNlX211bHRpcGx5Ki8KLQkwLAkJCQkJLypuYl9pbnBsYWNlX2RpdmlkZSovCi0JMCwJCQkJCS8qbmJfaW5wbGFjZV9yZW1haW5kZXIqLwotCTAsCQkJCQkvKm5iX2lucGxhY2VfcG93ZXIqLwotCTAsCQkJCQkvKm5iX2lucGxhY2VfbHNoaWZ0Ki8KLQkwLAkJCQkJLypuYl9pbnBsYWNlX3JzaGlmdCovCi0JMCwJCQkJCS8qbmJfaW5wbGFjZV9hbmQqLwotCTAsCQkJCQkvKm5iX2lucGxhY2VfeG9yKi8KLQkwLAkJCQkJLypuYl9pbnBsYWNlX29yKi8KLQlkZWx0YV9kaXZpZGUsCQkJCS8qIG5iX2Zsb29yX2RpdmlkZSAqLwotCTAsCQkJCQkvKiBuYl90cnVlX2RpdmlkZSAqLwotCTAsCQkJCQkvKiBuYl9pbnBsYWNlX2Zsb29yX2RpdmlkZSAqLwotCTAsCQkJCQkvKiBuYl9pbnBsYWNlX3RydWVfZGl2aWRlICovCisgICAgZGVsdGFfYWRkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9hZGQgKi8KKyAgICBkZWx0YV9zdWJ0cmFjdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX3N1YnRyYWN0ICovCisgICAgZGVsdGFfbXVsdGlwbHksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9tdWx0aXBseSAqLworICAgIGRlbHRhX2RpdmlkZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfZGl2aWRlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9yZW1haW5kZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2Rpdm1vZCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfcG93ZXIgKi8KKyAgICAodW5hcnlmdW5jKWRlbHRhX25lZ2F0aXZlLCAgICAgICAgICAgICAgICAgIC8qIG5iX25lZ2F0aXZlICovCisgICAgKHVuYXJ5ZnVuYylkZWx0YV9wb3NpdGl2ZSwgICAgICAgICAgICAgICAgICAvKiBuYl9wb3NpdGl2ZSAqLworICAgICh1bmFyeWZ1bmMpZGVsdGFfYWJzLCAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfYWJzb2x1dGUgKi8KKyAgICAoaW5xdWlyeSlkZWx0YV9ub256ZXJvLCAgICAgICAgICAgICAgICAgICAgIC8qIG5iX25vbnplcm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbmJfaW52ZXJ0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbmJfbHNoaWZ0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbmJfcnNoaWZ0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbmJfYW5kKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbmJfeG9yKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbmJfb3IqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypuYl9jb2VyY2UqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypuYl9pbnQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypuYl9sb25nKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbmJfZmxvYXQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypuYl9vY3QqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypuYl9oZXgqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypuYl9pbnBsYWNlX2FkZCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm5iX2lucGxhY2Vfc3VidHJhY3QqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypuYl9pbnBsYWNlX211bHRpcGx5Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbmJfaW5wbGFjZV9kaXZpZGUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypuYl9pbnBsYWNlX3JlbWFpbmRlciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm5iX2lucGxhY2VfcG93ZXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypuYl9pbnBsYWNlX2xzaGlmdCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm5iX2lucGxhY2VfcnNoaWZ0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbmJfaW5wbGFjZV9hbmQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypuYl9pbnBsYWNlX3hvciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm5iX2lucGxhY2Vfb3IqLworICAgIGRlbHRhX2RpdmlkZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfZmxvb3JfZGl2aWRlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl90cnVlX2RpdmlkZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfaW5wbGFjZV9mbG9vcl9kaXZpZGUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2lucGxhY2VfdHJ1ZV9kaXZpZGUgKi8KIH07CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgUHlEYXRlVGltZV9EZWx0YVR5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JImRhdGV0aW1lLnRpbWVkZWx0YSIsCQkJCS8qIHRwX25hbWUgKi8KLQlzaXplb2YoUHlEYXRlVGltZV9EZWx0YSksCQkJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJCQkvKiB0cF9pdGVtc2l6ZSAqLwotCTAsCQkJCQkJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkocmVwcmZ1bmMpZGVsdGFfcmVwciwJCQkJLyogdHBfcmVwciAqLwotCSZkZWx0YV9hc19udW1iZXIsCQkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpZGVsdGFfaGFzaCwJCQkJLyogdHBfaGFzaCAqLwotCTAsICAgICAgICAgICAgICAJCQkJLyogdHBfY2FsbCAqLwotCShyZXByZnVuYylkZWx0YV9zdHIsCQkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkJCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19DSEVDS1RZUEVTIHwKLQkgICAgICAgIFB5X1RQRkxBR1NfQkFTRVRZUEUsCQkJLyogdHBfZmxhZ3MgKi8KLQlkZWx0YV9kb2MsCQkJCQkvKiB0cF9kb2MgKi8KLQkwLAkJCQkJCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJCQkvKiB0cF9jbGVhciAqLwotCShyaWNoY21wZnVuYylkZWx0YV9yaWNoY29tcGFyZSwJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQkwLAkJCQkJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkJCS8qIHRwX2l0ZXJuZXh0ICovCi0JZGVsdGFfbWV0aG9kcywJCQkJCS8qIHRwX21ldGhvZHMgKi8KLQlkZWx0YV9tZW1iZXJzLAkJCQkJLyogdHBfbWVtYmVycyAqLwotCTAsCQkJCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJCQkvKiB0cF9kaWN0ICovCi0JMCwJCQkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCQkJLyogdHBfZGljdG9mZnNldCAqLwotCTAsCQkJCQkJLyogdHBfaW5pdCAqLwotCTAsCQkJCQkJLyogdHBfYWxsb2MgKi8KLQlkZWx0YV9uZXcsCQkJCQkvKiB0cF9uZXcgKi8KLQkwLAkJCQkJCS8qIHRwX2ZyZWUgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAiZGF0ZXRpbWUudGltZWRlbHRhIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgIHNpemVvZihQeURhdGVUaW1lX0RlbHRhKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIChyZXByZnVuYylkZWx0YV9yZXByLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgJmRlbHRhX2FzX251bWJlciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKWRlbHRhX2hhc2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIChyZXByZnVuYylkZWx0YV9zdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19DSEVDS1RZUEVTIHwKKyAgICAgICAgUHlfVFBGTEFHU19CQVNFVFlQRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICBkZWx0YV9kb2MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgKHJpY2hjbXBmdW5jKWRlbHRhX3JpY2hjb21wYXJlLCAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICBkZWx0YV9tZXRob2RzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIGRlbHRhX21lbWJlcnMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBkZWx0YV9uZXcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KIH07CiAKIC8qCkBAIC0yMjE3LDI2ICsyMjE3LDI2IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZGF0ZV95ZWFyKFB5RGF0ZVRpbWVfRGF0ZSAqc2VsZiwgdm9pZCAqdW51c2VkKQogewotCXJldHVybiBQeUludF9Gcm9tTG9uZyhHRVRfWUVBUihzZWxmKSk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKEdFVF9ZRUFSKHNlbGYpKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRhdGVfbW9udGgoUHlEYXRlVGltZV9EYXRlICpzZWxmLCB2b2lkICp1bnVzZWQpCiB7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKEdFVF9NT05USChzZWxmKSk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKEdFVF9NT05USChzZWxmKSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkYXRlX2RheShQeURhdGVUaW1lX0RhdGUgKnNlbGYsIHZvaWQgKnVudXNlZCkKIHsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoR0VUX0RBWShzZWxmKSk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKEdFVF9EQVkoc2VsZikpOwogfQogCiBzdGF0aWMgUHlHZXRTZXREZWYgZGF0ZV9nZXRzZXRbXSA9IHsKLQl7InllYXIiLCAgICAgICAgKGdldHRlcilkYXRlX3llYXJ9LAotCXsibW9udGgiLCAgICAgICAoZ2V0dGVyKWRhdGVfbW9udGh9LAotCXsiZGF5IiwgICAgICAgICAoZ2V0dGVyKWRhdGVfZGF5fSwKLQl7TlVMTH0KKyAgICB7InllYXIiLCAgICAgICAgKGdldHRlcilkYXRlX3llYXJ9LAorICAgIHsibW9udGgiLCAgICAgICAoZ2V0dGVyKWRhdGVfbW9udGh9LAorICAgIHsiZGF5IiwgICAgICAgICAoZ2V0dGVyKWRhdGVfZGF5fSwKKyAgICB7TlVMTH0KIH07CiAKIC8qIENvbnN0cnVjdG9ycy4gKi8KQEAgLTIyNDYsNjAgKzIyNDYsNjAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBkYXRlX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3cpCiB7Ci0JUHlPYmplY3QgKnNlbGYgPSBOVUxMOwotCVB5T2JqZWN0ICpzdGF0ZTsKLQlpbnQgeWVhcjsKLQlpbnQgbW9udGg7Ci0JaW50IGRheTsKKyAgICBQeU9iamVjdCAqc2VsZiA9IE5VTEw7CisgICAgUHlPYmplY3QgKnN0YXRlOworICAgIGludCB5ZWFyOworICAgIGludCBtb250aDsKKyAgICBpbnQgZGF5OwogCi0JLyogQ2hlY2sgZm9yIGludm9jYXRpb24gZnJvbSBwaWNrbGUgd2l0aCBfX2dldHN0YXRlX18gc3RhdGUgKi8KLQlpZiAoUHlUdXBsZV9HRVRfU0laRShhcmdzKSA9PSAxICYmCi0JICAgIFB5U3RyaW5nX0NoZWNrKHN0YXRlID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCAwKSkgJiYKLQkgICAgUHlTdHJpbmdfR0VUX1NJWkUoc3RhdGUpID09IF9QeURhdGVUaW1lX0RBVEVfREFUQVNJWkUgJiYKLQkgICAgTU9OVEhfSVNfU0FORShQeVN0cmluZ19BU19TVFJJTkcoc3RhdGUpWzJdKSkKLQl7Ci0JICAgIAlQeURhdGVUaW1lX0RhdGUgKm1lOworICAgIC8qIENoZWNrIGZvciBpbnZvY2F0aW9uIGZyb20gcGlja2xlIHdpdGggX19nZXRzdGF0ZV9fIHN0YXRlICovCisgICAgaWYgKFB5VHVwbGVfR0VUX1NJWkUoYXJncykgPT0gMSAmJgorICAgICAgICBQeVN0cmluZ19DaGVjayhzdGF0ZSA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgMCkpICYmCisgICAgICAgIFB5U3RyaW5nX0dFVF9TSVpFKHN0YXRlKSA9PSBfUHlEYXRlVGltZV9EQVRFX0RBVEFTSVpFICYmCisgICAgICAgIE1PTlRIX0lTX1NBTkUoUHlTdHJpbmdfQVNfU1RSSU5HKHN0YXRlKVsyXSkpCisgICAgeworICAgICAgICBQeURhdGVUaW1lX0RhdGUgKm1lOwogCi0JCW1lID0gKFB5RGF0ZVRpbWVfRGF0ZSAqKSAodHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpOwotCQlpZiAobWUgIT0gTlVMTCkgewotCQkJY2hhciAqcGRhdGEgPSBQeVN0cmluZ19BU19TVFJJTkcoc3RhdGUpOwotCQkJbWVtY3B5KG1lLT5kYXRhLCBwZGF0YSwgX1B5RGF0ZVRpbWVfREFURV9EQVRBU0laRSk7Ci0JCQltZS0+aGFzaGNvZGUgPSAtMTsKLQkJfQotCQlyZXR1cm4gKFB5T2JqZWN0ICopbWU7Ci0JfQorICAgICAgICBtZSA9IChQeURhdGVUaW1lX0RhdGUgKikgKHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKTsKKyAgICAgICAgaWYgKG1lICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGNoYXIgKnBkYXRhID0gUHlTdHJpbmdfQVNfU1RSSU5HKHN0YXRlKTsKKyAgICAgICAgICAgIG1lbWNweShtZS0+ZGF0YSwgcGRhdGEsIF9QeURhdGVUaW1lX0RBVEVfREFUQVNJWkUpOworICAgICAgICAgICAgbWUtPmhhc2hjb2RlID0gLTE7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChQeU9iamVjdCAqKW1lOworICAgIH0KIAotCWlmIChQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3csICJpaWkiLCBkYXRlX2t3cywKLQkJCQkJJnllYXIsICZtb250aCwgJmRheSkpIHsKLQkJaWYgKGNoZWNrX2RhdGVfYXJncyh5ZWFyLCBtb250aCwgZGF5KSA8IDApCi0JCQlyZXR1cm4gTlVMTDsKLQkJc2VsZiA9IG5ld19kYXRlX2V4KHllYXIsIG1vbnRoLCBkYXksIHR5cGUpOwotCX0KLQlyZXR1cm4gc2VsZjsKKyAgICBpZiAoUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3LCAiaWlpIiwgZGF0ZV9rd3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmeWVhciwgJm1vbnRoLCAmZGF5KSkgeworICAgICAgICBpZiAoY2hlY2tfZGF0ZV9hcmdzKHllYXIsIG1vbnRoLCBkYXkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBzZWxmID0gbmV3X2RhdGVfZXgoeWVhciwgbW9udGgsIGRheSwgdHlwZSk7CisgICAgfQorICAgIHJldHVybiBzZWxmOwogfQogCiAvKiBSZXR1cm4gbmV3IGRhdGUgZnJvbSBsb2NhbHRpbWUodCkuICovCiBzdGF0aWMgUHlPYmplY3QgKgogZGF0ZV9sb2NhbF9mcm9tX3RpbWVfdChQeU9iamVjdCAqY2xzLCBkb3VibGUgdHMpCiB7Ci0Jc3RydWN0IHRtICp0bTsKLQl0aW1lX3QgdDsKLQlQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKKyAgICBzdHJ1Y3QgdG0gKnRtOworICAgIHRpbWVfdCB0OworICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOwogCi0JdCA9IF9QeVRpbWVfRG91YmxlVG9UaW1ldCh0cyk7Ci0JaWYgKHQgPT0gKHRpbWVfdCktMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gTlVMTDsKLQl0bSA9IGxvY2FsdGltZSgmdCk7Ci0JaWYgKHRtKQotCQlyZXN1bHQgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oY2xzLCAiaWlpIiwKLQkJCQkJICAgICAgIHRtLT50bV95ZWFyICsgMTkwMCwKLQkJCQkJICAgICAgIHRtLT50bV9tb24gKyAxLAotCQkJCQkgICAgICAgdG0tPnRtX21kYXkpOwotCWVsc2UKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJInRpbWVzdGFtcCBvdXQgb2YgcmFuZ2UgZm9yICIKLQkJCQkicGxhdGZvcm0gbG9jYWx0aW1lKCkgZnVuY3Rpb24iKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIHQgPSBfUHlUaW1lX0RvdWJsZVRvVGltZXQodHMpOworICAgIGlmICh0ID09ICh0aW1lX3QpLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgdG0gPSBsb2NhbHRpbWUoJnQpOworICAgIGlmICh0bSkKKyAgICAgICAgcmVzdWx0ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKGNscywgImlpaSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bS0+dG1feWVhciArIDE5MDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bS0+dG1fbW9uICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtLT50bV9tZGF5KTsKKyAgICBlbHNlCisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInRpbWVzdGFtcCBvdXQgb2YgcmFuZ2UgZm9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJwbGF0Zm9ybSBsb2NhbHRpbWUoKSBmdW5jdGlvbiIpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIC8qIFJldHVybiBuZXcgZGF0ZSBmcm9tIGN1cnJlbnQgdGltZS4KQEAgLTIzMTAsMzQgKzIzMTAsMzQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBkYXRlX3RvZGF5KFB5T2JqZWN0ICpjbHMsIFB5T2JqZWN0ICpkdW1teSkKIHsKLQlQeU9iamVjdCAqdGltZTsKLQlQeU9iamVjdCAqcmVzdWx0OworICAgIFB5T2JqZWN0ICp0aW1lOworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CiAKLQl0aW1lID0gdGltZV90aW1lKCk7Ci0JaWYgKHRpbWUgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgdGltZSA9IHRpbWVfdGltZSgpOworICAgIGlmICh0aW1lID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JLyogTm90ZSB3ZWxsOiAgdG9kYXkoKSBpcyBhIGNsYXNzIG1ldGhvZCwgc28gdGhpcyBtYXkgbm90IGNhbGwKLQkgKiBkYXRlLmZyb210aW1lc3RhbXAuICBGb3IgZXhhbXBsZSwgaXQgbWF5IGNhbGwKLQkgKiBkYXRldGltZS5mcm9tdGltZXN0YW1wLiAgVGhhdCdzIHdoeSB3ZSBuZWVkIGFsbCB0aGUgYWNjdXJhY3kKLQkgKiB0aW1lLnRpbWUoKSBkZWxpdmVyczsgaWYgc29tZW9uZSB3ZXJlIGdvbnpvIGFib3V0IG9wdGltaXphdGlvbiwKLQkgKiBkYXRlLnRvZGF5KCkgY291bGQgZ2V0IGF3YXkgd2l0aCBwbGFpbiBDIHRpbWUoKS4KLQkgKi8KLQlyZXN1bHQgPSBQeU9iamVjdF9DYWxsTWV0aG9kKGNscywgImZyb210aW1lc3RhbXAiLCAiTyIsIHRpbWUpOwotCVB5X0RFQ1JFRih0aW1lKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIC8qIE5vdGUgd2VsbDogIHRvZGF5KCkgaXMgYSBjbGFzcyBtZXRob2QsIHNvIHRoaXMgbWF5IG5vdCBjYWxsCisgICAgICogZGF0ZS5mcm9tdGltZXN0YW1wLiAgRm9yIGV4YW1wbGUsIGl0IG1heSBjYWxsCisgICAgICogZGF0ZXRpbWUuZnJvbXRpbWVzdGFtcC4gIFRoYXQncyB3aHkgd2UgbmVlZCBhbGwgdGhlIGFjY3VyYWN5CisgICAgICogdGltZS50aW1lKCkgZGVsaXZlcnM7IGlmIHNvbWVvbmUgd2VyZSBnb256byBhYm91dCBvcHRpbWl6YXRpb24sCisgICAgICogZGF0ZS50b2RheSgpIGNvdWxkIGdldCBhd2F5IHdpdGggcGxhaW4gQyB0aW1lKCkuCisgICAgICovCisgICAgcmVzdWx0ID0gUHlPYmplY3RfQ2FsbE1ldGhvZChjbHMsICJmcm9tdGltZXN0YW1wIiwgIk8iLCB0aW1lKTsKKyAgICBQeV9ERUNSRUYodGltZSk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogLyogUmV0dXJuIG5ldyBkYXRlIGZyb20gZ2l2ZW4gdGltZXN0YW1wIChQeXRob24gdGltZXN0YW1wIC0tIGEgZG91YmxlKS4gKi8KIHN0YXRpYyBQeU9iamVjdCAqCiBkYXRlX2Zyb210aW1lc3RhbXAoUHlPYmplY3QgKmNscywgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZG91YmxlIHRpbWVzdGFtcDsKLQlQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKKyAgICBkb3VibGUgdGltZXN0YW1wOworICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOwogCi0JaWYgKFB5QXJnX1BhcnNlVHVwbGUoYXJncywgImQ6ZnJvbXRpbWVzdGFtcCIsICZ0aW1lc3RhbXApKQotCQlyZXN1bHQgPSBkYXRlX2xvY2FsX2Zyb21fdGltZV90KGNscywgdGltZXN0YW1wKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIGlmIChQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJkOmZyb210aW1lc3RhbXAiLCAmdGltZXN0YW1wKSkKKyAgICAgICAgcmVzdWx0ID0gZGF0ZV9sb2NhbF9mcm9tX3RpbWVfdChjbHMsIHRpbWVzdGFtcCk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogLyogUmV0dXJuIG5ldyBkYXRlIGZyb20gcHJvbGVwdGljIEdyZWdvcmlhbiBvcmRpbmFsLiAgUmFpc2VzIFZhbHVlRXJyb3IgaWYKQEAgLTIzNDYsMjQgKzIzNDYsMjQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBkYXRlX2Zyb21vcmRpbmFsKFB5T2JqZWN0ICpjbHMsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOwotCWludCBvcmRpbmFsOworICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOworICAgIGludCBvcmRpbmFsOwogCi0JaWYgKFB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6ZnJvbW9yZGluYWwiLCAmb3JkaW5hbCkpIHsKLQkJaW50IHllYXI7Ci0JCWludCBtb250aDsKLQkJaW50IGRheTsKKyAgICBpZiAoUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpmcm9tb3JkaW5hbCIsICZvcmRpbmFsKSkgeworICAgICAgICBpbnQgeWVhcjsKKyAgICAgICAgaW50IG1vbnRoOworICAgICAgICBpbnQgZGF5OwogCi0JCWlmIChvcmRpbmFsIDwgMSkKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAib3JkaW5hbCBtdXN0IGJlICIKLQkJCQkJCQkgICI+PSAxIik7Ci0JCWVsc2UgewotCQkJb3JkX3RvX3ltZChvcmRpbmFsLCAmeWVhciwgJm1vbnRoLCAmZGF5KTsKLQkJCXJlc3VsdCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihjbHMsICJpaWkiLAotCQkJCQkJICAgICAgIHllYXIsIG1vbnRoLCBkYXkpOwotCQl9Ci0JfQotCXJldHVybiByZXN1bHQ7CisgICAgICAgIGlmIChvcmRpbmFsIDwgMSkKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAib3JkaW5hbCBtdXN0IGJlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPj0gMSIpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIG9yZF90b195bWQob3JkaW5hbCwgJnllYXIsICZtb250aCwgJmRheSk7CisgICAgICAgICAgICByZXN1bHQgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oY2xzLCAiaWlpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ZWFyLCBtb250aCwgZGF5KTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiAvKgpAQCAtMjM3Niw3NCArMjM3Niw3NCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGFkZF9kYXRlX3RpbWVkZWx0YShQeURhdGVUaW1lX0RhdGUgKmRhdGUsIFB5RGF0ZVRpbWVfRGVsdGEgKmRlbHRhLCBpbnQgbmVnYXRlKQogewotCVB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOwotCWludCB5ZWFyID0gR0VUX1lFQVIoZGF0ZSk7Ci0JaW50IG1vbnRoID0gR0VUX01PTlRIKGRhdGUpOwotCWludCBkZWx0YWRheXMgPSBHRVRfVERfREFZUyhkZWx0YSk7Ci0JLyogQy1sZXZlbCBvdmVyZmxvdyBpcyBpbXBvc3NpYmxlIGJlY2F1c2UgfGRlbHRhZGF5c3wgPCAxZTkuICovCi0JaW50IGRheSA9IEdFVF9EQVkoZGF0ZSkgKyAobmVnYXRlID8gLWRlbHRhZGF5cyA6IGRlbHRhZGF5cyk7CisgICAgUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7CisgICAgaW50IHllYXIgPSBHRVRfWUVBUihkYXRlKTsKKyAgICBpbnQgbW9udGggPSBHRVRfTU9OVEgoZGF0ZSk7CisgICAgaW50IGRlbHRhZGF5cyA9IEdFVF9URF9EQVlTKGRlbHRhKTsKKyAgICAvKiBDLWxldmVsIG92ZXJmbG93IGlzIGltcG9zc2libGUgYmVjYXVzZSB8ZGVsdGFkYXlzfCA8IDFlOS4gKi8KKyAgICBpbnQgZGF5ID0gR0VUX0RBWShkYXRlKSArIChuZWdhdGUgPyAtZGVsdGFkYXlzIDogZGVsdGFkYXlzKTsKIAotCWlmIChub3JtYWxpemVfZGF0ZSgmeWVhciwgJm1vbnRoLCAmZGF5KSA+PSAwKQotCQlyZXN1bHQgPSBuZXdfZGF0ZSh5ZWFyLCBtb250aCwgZGF5KTsKLQlyZXR1cm4gcmVzdWx0OworICAgIGlmIChub3JtYWxpemVfZGF0ZSgmeWVhciwgJm1vbnRoLCAmZGF5KSA+PSAwKQorICAgICAgICByZXN1bHQgPSBuZXdfZGF0ZSh5ZWFyLCBtb250aCwgZGF5KTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZGF0ZV9hZGQoUHlPYmplY3QgKmxlZnQsIFB5T2JqZWN0ICpyaWdodCkKIHsKLQlpZiAoUHlEYXRlVGltZV9DaGVjayhsZWZ0KSB8fCBQeURhdGVUaW1lX0NoZWNrKHJpZ2h0KSkgewotCQlQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOwotCQlyZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7Ci0JfQotCWlmIChQeURhdGVfQ2hlY2sobGVmdCkpIHsKLQkJLyogZGF0ZSArID8/PyAqLwotCQlpZiAoUHlEZWx0YV9DaGVjayhyaWdodCkpCi0JCQkvKiBkYXRlICsgZGVsdGEgKi8KLQkJCXJldHVybiBhZGRfZGF0ZV90aW1lZGVsdGEoKFB5RGF0ZVRpbWVfRGF0ZSAqKSBsZWZ0LAotCQkJCQkJICAoUHlEYXRlVGltZV9EZWx0YSAqKSByaWdodCwKLQkJCQkJCSAgMCk7Ci0JfQotCWVsc2UgewotCQkvKiA/Pz8gKyBkYXRlCi0JCSAqICdyaWdodCcgbXVzdCBiZSBvbmUgb2YgdXMsIG9yIHdlIHdvdWxkbid0IGhhdmUgYmVlbiBjYWxsZWQKLQkJICovCi0JCWlmIChQeURlbHRhX0NoZWNrKGxlZnQpKQotCQkJLyogZGVsdGEgKyBkYXRlICovCi0JCQlyZXR1cm4gYWRkX2RhdGVfdGltZWRlbHRhKChQeURhdGVUaW1lX0RhdGUgKikgcmlnaHQsCi0JCQkJCQkgIChQeURhdGVUaW1lX0RlbHRhICopIGxlZnQsCi0JCQkJCQkgIDApOwotCX0KLQlQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOwotCXJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKKyAgICBpZiAoUHlEYXRlVGltZV9DaGVjayhsZWZ0KSB8fCBQeURhdGVUaW1lX0NoZWNrKHJpZ2h0KSkgeworICAgICAgICBQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOworICAgICAgICByZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7CisgICAgfQorICAgIGlmIChQeURhdGVfQ2hlY2sobGVmdCkpIHsKKyAgICAgICAgLyogZGF0ZSArID8/PyAqLworICAgICAgICBpZiAoUHlEZWx0YV9DaGVjayhyaWdodCkpCisgICAgICAgICAgICAvKiBkYXRlICsgZGVsdGEgKi8KKyAgICAgICAgICAgIHJldHVybiBhZGRfZGF0ZV90aW1lZGVsdGEoKFB5RGF0ZVRpbWVfRGF0ZSAqKSBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUHlEYXRlVGltZV9EZWx0YSAqKSByaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvKiA/Pz8gKyBkYXRlCisgICAgICAgICAqICdyaWdodCcgbXVzdCBiZSBvbmUgb2YgdXMsIG9yIHdlIHdvdWxkbid0IGhhdmUgYmVlbiBjYWxsZWQKKyAgICAgICAgICovCisgICAgICAgIGlmIChQeURlbHRhX0NoZWNrKGxlZnQpKQorICAgICAgICAgICAgLyogZGVsdGEgKyBkYXRlICovCisgICAgICAgICAgICByZXR1cm4gYWRkX2RhdGVfdGltZWRlbHRhKChQeURhdGVUaW1lX0RhdGUgKikgcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQeURhdGVUaW1lX0RlbHRhICopIGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworICAgIH0KKyAgICBQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOworICAgIHJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRhdGVfc3VidHJhY3QoUHlPYmplY3QgKmxlZnQsIFB5T2JqZWN0ICpyaWdodCkKIHsKLQlpZiAoUHlEYXRlVGltZV9DaGVjayhsZWZ0KSB8fCBQeURhdGVUaW1lX0NoZWNrKHJpZ2h0KSkgewotCQlQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOwotCQlyZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7Ci0JfQotCWlmIChQeURhdGVfQ2hlY2sobGVmdCkpIHsKLQkJaWYgKFB5RGF0ZV9DaGVjayhyaWdodCkpIHsKLQkJCS8qIGRhdGUgLSBkYXRlICovCi0JCQlpbnQgbGVmdF9vcmQgPSB5bWRfdG9fb3JkKEdFVF9ZRUFSKGxlZnQpLAotCQkJCQkJICBHRVRfTU9OVEgobGVmdCksCi0JCQkJCQkgIEdFVF9EQVkobGVmdCkpOwotCQkJaW50IHJpZ2h0X29yZCA9IHltZF90b19vcmQoR0VUX1lFQVIocmlnaHQpLAotCQkJCQkJICAgR0VUX01PTlRIKHJpZ2h0KSwKLQkJCQkJCSAgIEdFVF9EQVkocmlnaHQpKTsKLQkJCXJldHVybiBuZXdfZGVsdGEobGVmdF9vcmQgLSByaWdodF9vcmQsIDAsIDAsIDApOwotCQl9Ci0JCWlmIChQeURlbHRhX0NoZWNrKHJpZ2h0KSkgewotCQkJLyogZGF0ZSAtIGRlbHRhICovCi0JCQlyZXR1cm4gYWRkX2RhdGVfdGltZWRlbHRhKChQeURhdGVUaW1lX0RhdGUgKikgbGVmdCwKLQkJCQkJCSAgKFB5RGF0ZVRpbWVfRGVsdGEgKikgcmlnaHQsCi0JCQkJCQkgIDEpOwotCQl9Ci0JfQotCVB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7Ci0JcmV0dXJuIFB5X05vdEltcGxlbWVudGVkOworICAgIGlmIChQeURhdGVUaW1lX0NoZWNrKGxlZnQpIHx8IFB5RGF0ZVRpbWVfQ2hlY2socmlnaHQpKSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7CisgICAgICAgIHJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKKyAgICB9CisgICAgaWYgKFB5RGF0ZV9DaGVjayhsZWZ0KSkgeworICAgICAgICBpZiAoUHlEYXRlX0NoZWNrKHJpZ2h0KSkgeworICAgICAgICAgICAgLyogZGF0ZSAtIGRhdGUgKi8KKyAgICAgICAgICAgIGludCBsZWZ0X29yZCA9IHltZF90b19vcmQoR0VUX1lFQVIobGVmdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9NT05USChsZWZ0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VUX0RBWShsZWZ0KSk7CisgICAgICAgICAgICBpbnQgcmlnaHRfb3JkID0geW1kX3RvX29yZChHRVRfWUVBUihyaWdodCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRVRfTU9OVEgocmlnaHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VUX0RBWShyaWdodCkpOworICAgICAgICAgICAgcmV0dXJuIG5ld19kZWx0YShsZWZ0X29yZCAtIHJpZ2h0X29yZCwgMCwgMCwgMCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKFB5RGVsdGFfQ2hlY2socmlnaHQpKSB7CisgICAgICAgICAgICAvKiBkYXRlIC0gZGVsdGEgKi8KKyAgICAgICAgICAgIHJldHVybiBhZGRfZGF0ZV90aW1lZGVsdGEoKFB5RGF0ZVRpbWVfRGF0ZSAqKSBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUHlEYXRlVGltZV9EZWx0YSAqKSByaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgICAgIH0KKyAgICB9CisgICAgUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKKyAgICByZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7CiB9CiAKIApAQCAtMjQ1Miw4OSArMjQ1Miw4OSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGRhdGVfcmVwcihQeURhdGVUaW1lX0RhdGUgKnNlbGYpCiB7Ci0JY2hhciBidWZmZXJbMTAyOF07Ci0JY29uc3QgY2hhciAqdHlwZV9uYW1lOworICAgIGNoYXIgYnVmZmVyWzEwMjhdOworICAgIGNvbnN0IGNoYXIgKnR5cGVfbmFtZTsKIAotCXR5cGVfbmFtZSA9IFB5X1RZUEUoc2VsZiktPnRwX25hbWU7Ci0JUHlPU19zbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCAiJXMoJWQsICVkLCAlZCkiLAotCQkgICAgICB0eXBlX25hbWUsCi0JCSAgICAgIEdFVF9ZRUFSKHNlbGYpLCBHRVRfTU9OVEgoc2VsZiksIEdFVF9EQVkoc2VsZikpOworICAgIHR5cGVfbmFtZSA9IFB5X1RZUEUoc2VsZiktPnRwX25hbWU7CisgICAgUHlPU19zbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCAiJXMoJWQsICVkLCAlZCkiLAorICAgICAgICAgICAgICAgICAgdHlwZV9uYW1lLAorICAgICAgICAgICAgICAgICAgR0VUX1lFQVIoc2VsZiksIEdFVF9NT05USChzZWxmKSwgR0VUX0RBWShzZWxmKSk7CiAKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWZmZXIpOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1ZmZlcik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkYXRlX2lzb2Zvcm1hdChQeURhdGVUaW1lX0RhdGUgKnNlbGYpCiB7Ci0JY2hhciBidWZmZXJbMTI4XTsKKyAgICBjaGFyIGJ1ZmZlclsxMjhdOwogCi0JaXNvZm9ybWF0X2RhdGUoc2VsZiwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmZmVyKTsKKyAgICBpc29mb3JtYXRfZGF0ZShzZWxmLCBidWZmZXIsIHNpemVvZihidWZmZXIpKTsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWZmZXIpOwogfQogCiAvKiBzdHIoKSBjYWxscyB0aGUgYXBwcm9wcmlhdGUgaXNvZm9ybWF0KCkgbWV0aG9kLiAqLwogc3RhdGljIFB5T2JqZWN0ICoKIGRhdGVfc3RyKFB5RGF0ZVRpbWVfRGF0ZSAqc2VsZikKIHsKLQlyZXR1cm4gUHlPYmplY3RfQ2FsbE1ldGhvZCgoUHlPYmplY3QgKilzZWxmLCAiaXNvZm9ybWF0IiwgIigpIik7CisgICAgcmV0dXJuIFB5T2JqZWN0X0NhbGxNZXRob2QoKFB5T2JqZWN0ICopc2VsZiwgImlzb2Zvcm1hdCIsICIoKSIpOwogfQogCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkYXRlX2N0aW1lKFB5RGF0ZVRpbWVfRGF0ZSAqc2VsZikKIHsKLQlyZXR1cm4gZm9ybWF0X2N0aW1lKHNlbGYsIDAsIDAsIDApOworICAgIHJldHVybiBmb3JtYXRfY3RpbWUoc2VsZiwgMCwgMCwgMCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkYXRlX3N0cmZ0aW1lKFB5RGF0ZVRpbWVfRGF0ZSAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprdykKIHsKLQkvKiBUaGlzIG1ldGhvZCBjYW4gYmUgaW5oZXJpdGVkLCBhbmQgbmVlZHMgdG8gY2FsbCB0aGUKLQkgKiB0aW1ldHVwbGUoKSBtZXRob2QgYXBwcm9wcmlhdGUgdG8gc2VsZidzIGNsYXNzLgotCSAqLwotCVB5T2JqZWN0ICpyZXN1bHQ7Ci0JUHlPYmplY3QgKnR1cGxlOwotCWNvbnN0IGNoYXIgKmZvcm1hdDsKLQlQeV9zc2l6ZV90IGZvcm1hdF9sZW47Ci0Jc3RhdGljIGNoYXIgKmtleXdvcmRzW10gPSB7ImZvcm1hdCIsIE5VTEx9OworICAgIC8qIFRoaXMgbWV0aG9kIGNhbiBiZSBpbmhlcml0ZWQsIGFuZCBuZWVkcyB0byBjYWxsIHRoZQorICAgICAqIHRpbWV0dXBsZSgpIG1ldGhvZCBhcHByb3ByaWF0ZSB0byBzZWxmJ3MgY2xhc3MuCisgICAgICovCisgICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICBQeU9iamVjdCAqdHVwbGU7CisgICAgY29uc3QgY2hhciAqZm9ybWF0OworICAgIFB5X3NzaXplX3QgZm9ybWF0X2xlbjsKKyAgICBzdGF0aWMgY2hhciAqa2V5d29yZHNbXSA9IHsiZm9ybWF0IiwgTlVMTH07CiAKLQlpZiAoISBQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3csICJzIzpzdHJmdGltZSIsIGtleXdvcmRzLAotCQkJCQkgICZmb3JtYXQsICZmb3JtYXRfbGVuKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCEgUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3LCAicyM6c3RyZnRpbWUiLCBrZXl3b3JkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZvcm1hdCwgJmZvcm1hdF9sZW4pKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXR1cGxlID0gUHlPYmplY3RfQ2FsbE1ldGhvZCgoUHlPYmplY3QgKilzZWxmLCAidGltZXR1cGxlIiwgIigpIik7Ci0JaWYgKHR1cGxlID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXJlc3VsdCA9IHdyYXBfc3RyZnRpbWUoKFB5T2JqZWN0ICopc2VsZiwgZm9ybWF0LCBmb3JtYXRfbGVuLCB0dXBsZSwKLQkJCSAgICAgICAoUHlPYmplY3QgKilzZWxmKTsKLQlQeV9ERUNSRUYodHVwbGUpOwotCXJldHVybiByZXN1bHQ7CisgICAgdHVwbGUgPSBQeU9iamVjdF9DYWxsTWV0aG9kKChQeU9iamVjdCAqKXNlbGYsICJ0aW1ldHVwbGUiLCAiKCkiKTsKKyAgICBpZiAodHVwbGUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmVzdWx0ID0gd3JhcF9zdHJmdGltZSgoUHlPYmplY3QgKilzZWxmLCBmb3JtYXQsIGZvcm1hdF9sZW4sIHR1cGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKFB5T2JqZWN0ICopc2VsZik7CisgICAgUHlfREVDUkVGKHR1cGxlKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZGF0ZV9mb3JtYXQoUHlEYXRlVGltZV9EYXRlICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqZm9ybWF0OworICAgIFB5T2JqZWN0ICpmb3JtYXQ7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk86X19mb3JtYXRfXyIsICZmb3JtYXQpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk86X19mb3JtYXRfXyIsICZmb3JtYXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCS8qIENoZWNrIGZvciBzdHIgb3IgdW5pY29kZSAqLwotCWlmIChQeVN0cmluZ19DaGVjayhmb3JtYXQpKSB7Ci0gICAgICAgICAgICAgICAgLyogSWYgZm9ybWF0IGlzIHplcm8gbGVuZ3RoLCByZXR1cm4gc3RyKHNlbGYpICovCi0JCWlmIChQeVN0cmluZ19HRVRfU0laRShmb3JtYXQpID09IDApCi0JCQlyZXR1cm4gUHlPYmplY3RfU3RyKChQeU9iamVjdCAqKXNlbGYpOwotCX0gZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrKGZvcm1hdCkpIHsKLSAgICAgICAgICAgICAgICAvKiBJZiBmb3JtYXQgaXMgemVybyBsZW5ndGgsIHJldHVybiBzdHIoc2VsZikgKi8KLQkJaWYgKFB5VW5pY29kZV9HRVRfU0laRShmb3JtYXQpID09IDApCi0JCQlyZXR1cm4gUHlPYmplY3RfVW5pY29kZSgoUHlPYmplY3QgKilzZWxmKTsKLQl9IGVsc2UgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKLQkJCSAgICAgIl9fZm9ybWF0X18gZXhwZWN0cyBzdHIgb3IgdW5pY29kZSwgbm90ICUuMjAwcyIsCi0JCQkgICAgIFB5X1RZUEUoZm9ybWF0KS0+dHBfbmFtZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gUHlPYmplY3RfQ2FsbE1ldGhvZCgoUHlPYmplY3QgKilzZWxmLCAic3RyZnRpbWUiLCAiTyIsIGZvcm1hdCk7CisgICAgLyogQ2hlY2sgZm9yIHN0ciBvciB1bmljb2RlICovCisgICAgaWYgKFB5U3RyaW5nX0NoZWNrKGZvcm1hdCkpIHsKKyAgICAgICAgLyogSWYgZm9ybWF0IGlzIHplcm8gbGVuZ3RoLCByZXR1cm4gc3RyKHNlbGYpICovCisgICAgICAgIGlmIChQeVN0cmluZ19HRVRfU0laRShmb3JtYXQpID09IDApCisgICAgICAgICAgICByZXR1cm4gUHlPYmplY3RfU3RyKChQeU9iamVjdCAqKXNlbGYpOworICAgIH0gZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrKGZvcm1hdCkpIHsKKyAgICAgICAgLyogSWYgZm9ybWF0IGlzIHplcm8gbGVuZ3RoLCByZXR1cm4gc3RyKHNlbGYpICovCisgICAgICAgIGlmIChQeVVuaWNvZGVfR0VUX1NJWkUoZm9ybWF0KSA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIFB5T2JqZWN0X1VuaWNvZGUoKFB5T2JqZWN0ICopc2VsZik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiX19mb3JtYXRfXyBleHBlY3RzIHN0ciBvciB1bmljb2RlLCBub3QgJS4yMDBzIiwKKyAgICAgICAgICAgICAgICAgICAgIFB5X1RZUEUoZm9ybWF0KS0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlPYmplY3RfQ2FsbE1ldGhvZCgoUHlPYmplY3QgKilzZWxmLCAic3RyZnRpbWUiLCAiTyIsIGZvcm1hdCk7CiB9CiAKIC8qIElTTyBtZXRob2RzLiAqLwpAQCAtMjU0MiwzMSArMjU0MiwzMSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGRhdGVfaXNvd2Vla2RheShQeURhdGVUaW1lX0RhdGUgKnNlbGYpCiB7Ci0JaW50IGRvdyA9IHdlZWtkYXkoR0VUX1lFQVIoc2VsZiksIEdFVF9NT05USChzZWxmKSwgR0VUX0RBWShzZWxmKSk7CisgICAgaW50IGRvdyA9IHdlZWtkYXkoR0VUX1lFQVIoc2VsZiksIEdFVF9NT05USChzZWxmKSwgR0VUX0RBWShzZWxmKSk7CiAKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoZG93ICsgMSk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKGRvdyArIDEpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZGF0ZV9pc29jYWxlbmRhcihQeURhdGVUaW1lX0RhdGUgKnNlbGYpCiB7Ci0JaW50ICB5ZWFyICAgICAgICAgPSBHRVRfWUVBUihzZWxmKTsKLQlpbnQgIHdlZWsxX21vbmRheSA9IGlzb193ZWVrMV9tb25kYXkoeWVhcik7Ci0JaW50IHRvZGF5ICAgICAgICAgPSB5bWRfdG9fb3JkKHllYXIsIEdFVF9NT05USChzZWxmKSwgR0VUX0RBWShzZWxmKSk7Ci0JaW50ICB3ZWVrOwotCWludCAgZGF5OworICAgIGludCAgeWVhciAgICAgICAgID0gR0VUX1lFQVIoc2VsZik7CisgICAgaW50ICB3ZWVrMV9tb25kYXkgPSBpc29fd2VlazFfbW9uZGF5KHllYXIpOworICAgIGludCB0b2RheSAgICAgICAgID0geW1kX3RvX29yZCh5ZWFyLCBHRVRfTU9OVEgoc2VsZiksIEdFVF9EQVkoc2VsZikpOworICAgIGludCAgd2VlazsKKyAgICBpbnQgIGRheTsKIAotCXdlZWsgPSBkaXZtb2QodG9kYXkgLSB3ZWVrMV9tb25kYXksIDcsICZkYXkpOwotCWlmICh3ZWVrIDwgMCkgewotCQktLXllYXI7Ci0JCXdlZWsxX21vbmRheSA9IGlzb193ZWVrMV9tb25kYXkoeWVhcik7Ci0JCXdlZWsgPSBkaXZtb2QodG9kYXkgLSB3ZWVrMV9tb25kYXksIDcsICZkYXkpOwotCX0KLQllbHNlIGlmICh3ZWVrID49IDUyICYmIHRvZGF5ID49IGlzb193ZWVrMV9tb25kYXkoeWVhciArIDEpKSB7Ci0JCSsreWVhcjsKLQkJd2VlayA9IDA7Ci0JfQotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJpaWkiLCB5ZWFyLCB3ZWVrICsgMSwgZGF5ICsgMSk7CisgICAgd2VlayA9IGRpdm1vZCh0b2RheSAtIHdlZWsxX21vbmRheSwgNywgJmRheSk7CisgICAgaWYgKHdlZWsgPCAwKSB7CisgICAgICAgIC0teWVhcjsKKyAgICAgICAgd2VlazFfbW9uZGF5ID0gaXNvX3dlZWsxX21vbmRheSh5ZWFyKTsKKyAgICAgICAgd2VlayA9IGRpdm1vZCh0b2RheSAtIHdlZWsxX21vbmRheSwgNywgJmRheSk7CisgICAgfQorICAgIGVsc2UgaWYgKHdlZWsgPj0gNTIgJiYgdG9kYXkgPj0gaXNvX3dlZWsxX21vbmRheSh5ZWFyICsgMSkpIHsKKyAgICAgICAgKyt5ZWFyOworICAgICAgICB3ZWVrID0gMDsKKyAgICB9CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImlpaSIsIHllYXIsIHdlZWsgKyAxLCBkYXkgKyAxKTsKIH0KIAogLyogTWlzY2VsbGFuZW91cyBtZXRob2RzLiAqLwpAQCAtMjU3OCw1MyArMjU3OCw1MyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGRhdGVfcmljaGNvbXBhcmUoUHlEYXRlVGltZV9EYXRlICpzZWxmLCBQeU9iamVjdCAqb3RoZXIsIGludCBvcCkKIHsKLQlpbnQgZGlmZiA9IDQyOwkvKiBub25zZW5zZSAqLworICAgIGludCBkaWZmID0gNDI7ICAgICAgLyogbm9uc2Vuc2UgKi8KIAotCWlmIChQeURhdGVfQ2hlY2sob3RoZXIpKQotCQlkaWZmID0gbWVtY21wKHNlbGYtPmRhdGEsICgoUHlEYXRlVGltZV9EYXRlICopb3RoZXIpLT5kYXRhLAotCQkJICAgICAgX1B5RGF0ZVRpbWVfREFURV9EQVRBU0laRSk7CisgICAgaWYgKFB5RGF0ZV9DaGVjayhvdGhlcikpCisgICAgICAgIGRpZmYgPSBtZW1jbXAoc2VsZi0+ZGF0YSwgKChQeURhdGVUaW1lX0RhdGUgKilvdGhlciktPmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgX1B5RGF0ZVRpbWVfREFURV9EQVRBU0laRSk7CiAKLQllbHNlIGlmIChQeU9iamVjdF9IYXNBdHRyU3RyaW5nKG90aGVyLCAidGltZXR1cGxlIikpIHsKLQkJLyogQSBob29rIGZvciBvdGhlciBraW5kcyBvZiBkYXRlIG9iamVjdHMuICovCi0JCVB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7Ci0JCXJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKLQl9Ci0JZWxzZSBpZiAob3AgPT0gUHlfRVEgfHwgb3AgPT0gUHlfTkUpCi0JCWRpZmYgPSAxOwkvKiBhbnkgbm9uLXplcm8gdmFsdWUgd2lsbCBkbyAqLworICAgIGVsc2UgaWYgKFB5T2JqZWN0X0hhc0F0dHJTdHJpbmcob3RoZXIsICJ0aW1ldHVwbGUiKSkgeworICAgICAgICAvKiBBIGhvb2sgZm9yIG90aGVyIGtpbmRzIG9mIGRhdGUgb2JqZWN0cy4gKi8KKyAgICAgICAgUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKKyAgICAgICAgcmV0dXJuIFB5X05vdEltcGxlbWVudGVkOworICAgIH0KKyAgICBlbHNlIGlmIChvcCA9PSBQeV9FUSB8fCBvcCA9PSBQeV9ORSkKKyAgICAgICAgZGlmZiA9IDE7ICAgICAgICAgICAgICAgLyogYW55IG5vbi16ZXJvIHZhbHVlIHdpbGwgZG8gKi8KIAotCWVsc2UgLyogc3RvcCB0aGlzIGZyb20gZmFsbGluZyBiYWNrIHRvIGFkZHJlc3MgY29tcGFyaXNvbiAqLwotCQlyZXR1cm4gY21wZXJyb3IoKFB5T2JqZWN0ICopc2VsZiwgb3RoZXIpOworICAgIGVsc2UgLyogc3RvcCB0aGlzIGZyb20gZmFsbGluZyBiYWNrIHRvIGFkZHJlc3MgY29tcGFyaXNvbiAqLworICAgICAgICByZXR1cm4gY21wZXJyb3IoKFB5T2JqZWN0ICopc2VsZiwgb3RoZXIpOwogCi0JcmV0dXJuIGRpZmZfdG9fYm9vbChkaWZmLCBvcCk7CisgICAgcmV0dXJuIGRpZmZfdG9fYm9vbChkaWZmLCBvcCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkYXRlX3RpbWV0dXBsZShQeURhdGVUaW1lX0RhdGUgKnNlbGYpCiB7Ci0JcmV0dXJuIGJ1aWxkX3N0cnVjdF90aW1lKEdFVF9ZRUFSKHNlbGYpLAotCQkJCSBHRVRfTU9OVEgoc2VsZiksCi0JCQkJIEdFVF9EQVkoc2VsZiksCi0JCQkJIDAsIDAsIDAsIC0xKTsKKyAgICByZXR1cm4gYnVpbGRfc3RydWN0X3RpbWUoR0VUX1lFQVIoc2VsZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9NT05USChzZWxmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VUX0RBWShzZWxmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgLTEpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZGF0ZV9yZXBsYWNlKFB5RGF0ZVRpbWVfRGF0ZSAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprdykKIHsKLQlQeU9iamVjdCAqY2xvbmU7Ci0JUHlPYmplY3QgKnR1cGxlOwotCWludCB5ZWFyID0gR0VUX1lFQVIoc2VsZik7Ci0JaW50IG1vbnRoID0gR0VUX01PTlRIKHNlbGYpOwotCWludCBkYXkgPSBHRVRfREFZKHNlbGYpOworICAgIFB5T2JqZWN0ICpjbG9uZTsKKyAgICBQeU9iamVjdCAqdHVwbGU7CisgICAgaW50IHllYXIgPSBHRVRfWUVBUihzZWxmKTsKKyAgICBpbnQgbW9udGggPSBHRVRfTU9OVEgoc2VsZik7CisgICAgaW50IGRheSA9IEdFVF9EQVkoc2VsZik7CiAKLQlpZiAoISBQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3csICJ8aWlpOnJlcGxhY2UiLCBkYXRlX2t3cywKLQkJCQkJICAmeWVhciwgJm1vbnRoLCAmZGF5KSkKLQkJcmV0dXJuIE5VTEw7Ci0JdHVwbGUgPSBQeV9CdWlsZFZhbHVlKCJpaWkiLCB5ZWFyLCBtb250aCwgZGF5KTsKLQlpZiAodHVwbGUgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JY2xvbmUgPSBkYXRlX25ldyhQeV9UWVBFKHNlbGYpLCB0dXBsZSwgTlVMTCk7Ci0JUHlfREVDUkVGKHR1cGxlKTsKLQlyZXR1cm4gY2xvbmU7CisgICAgaWYgKCEgUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3LCAifGlpaTpyZXBsYWNlIiwgZGF0ZV9rd3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ5ZWFyLCAmbW9udGgsICZkYXkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB0dXBsZSA9IFB5X0J1aWxkVmFsdWUoImlpaSIsIHllYXIsIG1vbnRoLCBkYXkpOworICAgIGlmICh0dXBsZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBjbG9uZSA9IGRhdGVfbmV3KFB5X1RZUEUoc2VsZiksIHR1cGxlLCBOVUxMKTsKKyAgICBQeV9ERUNSRUYodHVwbGUpOworICAgIHJldHVybiBjbG9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpkYXRlX2dldHN0YXRlKFB5RGF0ZVRpbWVfRGF0ZSAqc2VsZik7CkBAIC0yNjMyLDI5ICsyNjMyLDI5IEBACiBzdGF0aWMgbG9uZwogZGF0ZV9oYXNoKFB5RGF0ZVRpbWVfRGF0ZSAqc2VsZikKIHsKLQlpZiAoc2VsZi0+aGFzaGNvZGUgPT0gLTEpIHsKLQkJUHlPYmplY3QgKnRlbXAgPSBkYXRlX2dldHN0YXRlKHNlbGYpOwotCQlpZiAodGVtcCAhPSBOVUxMKSB7Ci0JCQlzZWxmLT5oYXNoY29kZSA9IFB5T2JqZWN0X0hhc2godGVtcCk7Ci0JCQlQeV9ERUNSRUYodGVtcCk7Ci0JCX0KLQl9Ci0JcmV0dXJuIHNlbGYtPmhhc2hjb2RlOworICAgIGlmIChzZWxmLT5oYXNoY29kZSA9PSAtMSkgeworICAgICAgICBQeU9iamVjdCAqdGVtcCA9IGRhdGVfZ2V0c3RhdGUoc2VsZik7CisgICAgICAgIGlmICh0ZW1wICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHNlbGYtPmhhc2hjb2RlID0gUHlPYmplY3RfSGFzaCh0ZW1wKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih0ZW1wKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2VsZi0+aGFzaGNvZGU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkYXRlX3Rvb3JkaW5hbChQeURhdGVUaW1lX0RhdGUgKnNlbGYpCiB7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKHltZF90b19vcmQoR0VUX1lFQVIoc2VsZiksIEdFVF9NT05USChzZWxmKSwKLQkJCQkJIEdFVF9EQVkoc2VsZikpKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoeW1kX3RvX29yZChHRVRfWUVBUihzZWxmKSwgR0VUX01PTlRIKHNlbGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9EQVkoc2VsZikpKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRhdGVfd2Vla2RheShQeURhdGVUaW1lX0RhdGUgKnNlbGYpCiB7Ci0JaW50IGRvdyA9IHdlZWtkYXkoR0VUX1lFQVIoc2VsZiksIEdFVF9NT05USChzZWxmKSwgR0VUX0RBWShzZWxmKSk7CisgICAgaW50IGRvdyA9IHdlZWtkYXkoR0VUX1lFQVIoc2VsZiksIEdFVF9NT05USChzZWxmKSwgR0VUX0RBWShzZWxmKSk7CiAKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoZG93KTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoZG93KTsKIH0KIAogLyogUGlja2xlIHN1cHBvcnQsIGEgc2ltcGxlIHVzZSBvZiBfX3JlZHVjZV9fLiAqLwpAQCAtMjY2MywxMzYgKzI2NjMsMTM2IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZGF0ZV9nZXRzdGF0ZShQeURhdGVUaW1lX0RhdGUgKnNlbGYpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoCi0JCSIoTikiLAotCQlQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKXNlbGYtPmRhdGEsCi0JCQkJCSAgIF9QeURhdGVUaW1lX0RBVEVfREFUQVNJWkUpKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgKKyAgICAgICAgIihOKSIsCisgICAgICAgIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopc2VsZi0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1B5RGF0ZVRpbWVfREFURV9EQVRBU0laRSkpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZGF0ZV9yZWR1Y2UoUHlEYXRlVGltZV9EYXRlICpzZWxmLCBQeU9iamVjdCAqYXJnKQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKCIoT04pIiwgUHlfVFlQRShzZWxmKSwgZGF0ZV9nZXRzdGF0ZShzZWxmKSk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihPTikiLCBQeV9UWVBFKHNlbGYpLCBkYXRlX2dldHN0YXRlKHNlbGYpKTsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIGRhdGVfbWV0aG9kc1tdID0gewogCi0JLyogQ2xhc3MgbWV0aG9kczogKi8KKyAgICAvKiBDbGFzcyBtZXRob2RzOiAqLwogCi0JeyJmcm9tdGltZXN0YW1wIiwgKFB5Q0Z1bmN0aW9uKWRhdGVfZnJvbXRpbWVzdGFtcCwgTUVUSF9WQVJBUkdTIHwKLQkJCQkJCQkgICBNRVRIX0NMQVNTLAotCSBQeURvY19TVFIoInRpbWVzdGFtcCAtPiBsb2NhbCBkYXRlIGZyb20gYSBQT1NJWCB0aW1lc3RhbXAgKGxpa2UgIgotCSAJICAgInRpbWUudGltZSgpKS4iKX0sCisgICAgeyJmcm9tdGltZXN0YW1wIiwgKFB5Q0Z1bmN0aW9uKWRhdGVfZnJvbXRpbWVzdGFtcCwgTUVUSF9WQVJBUkdTIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRVRIX0NMQVNTLAorICAgICBQeURvY19TVFIoInRpbWVzdGFtcCAtPiBsb2NhbCBkYXRlIGZyb20gYSBQT1NJWCB0aW1lc3RhbXAgKGxpa2UgIgorICAgICAgICAgICAgICAgInRpbWUudGltZSgpKS4iKX0sCiAKLQl7ImZyb21vcmRpbmFsIiwgKFB5Q0Z1bmN0aW9uKWRhdGVfZnJvbW9yZGluYWwsCU1FVEhfVkFSQVJHUyB8Ci0JCQkJCQkJTUVUSF9DTEFTUywKLQkgUHlEb2NfU1RSKCJpbnQgLT4gZGF0ZSBjb3JyZXNwb25kaW5nIHRvIGEgcHJvbGVwdGljIEdyZWdvcmlhbiAiCi0JIAkgICAib3JkaW5hbC4iKX0sCisgICAgeyJmcm9tb3JkaW5hbCIsIChQeUNGdW5jdGlvbilkYXRlX2Zyb21vcmRpbmFsLCAgICAgIE1FVEhfVkFSQVJHUyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVUSF9DTEFTUywKKyAgICAgUHlEb2NfU1RSKCJpbnQgLT4gZGF0ZSBjb3JyZXNwb25kaW5nIHRvIGEgcHJvbGVwdGljIEdyZWdvcmlhbiAiCisgICAgICAgICAgICAgICAib3JkaW5hbC4iKX0sCiAKLQl7InRvZGF5IiwgICAgICAgICAoUHlDRnVuY3Rpb24pZGF0ZV90b2RheSwgICBNRVRIX05PQVJHUyB8IE1FVEhfQ0xBU1MsCi0JIFB5RG9jX1NUUigiQ3VycmVudCBkYXRlIG9yIGRhdGV0aW1lOiAgc2FtZSBhcyAiCi0JIAkgICAic2VsZi5fX2NsYXNzX18uZnJvbXRpbWVzdGFtcCh0aW1lLnRpbWUoKSkuIil9LAorICAgIHsidG9kYXkiLCAgICAgICAgIChQeUNGdW5jdGlvbilkYXRlX3RvZGF5LCAgIE1FVEhfTk9BUkdTIHwgTUVUSF9DTEFTUywKKyAgICAgUHlEb2NfU1RSKCJDdXJyZW50IGRhdGUgb3IgZGF0ZXRpbWU6ICBzYW1lIGFzICIKKyAgICAgICAgICAgICAgICJzZWxmLl9fY2xhc3NfXy5mcm9tdGltZXN0YW1wKHRpbWUudGltZSgpKS4iKX0sCiAKLQkvKiBJbnN0YW5jZSBtZXRob2RzOiAqLworICAgIC8qIEluc3RhbmNlIG1ldGhvZHM6ICovCiAKLQl7ImN0aW1lIiwgICAgICAgKFB5Q0Z1bmN0aW9uKWRhdGVfY3RpbWUsICAgICAgICBNRVRIX05PQVJHUywKLQkgUHlEb2NfU1RSKCJSZXR1cm4gY3RpbWUoKSBzdHlsZSBzdHJpbmcuIil9LAorICAgIHsiY3RpbWUiLCAgICAgICAoUHlDRnVuY3Rpb24pZGF0ZV9jdGltZSwgICAgICAgIE1FVEhfTk9BUkdTLAorICAgICBQeURvY19TVFIoIlJldHVybiBjdGltZSgpIHN0eWxlIHN0cmluZy4iKX0sCiAKLQl7InN0cmZ0aW1lIiwgICAJKFB5Q0Z1bmN0aW9uKWRhdGVfc3RyZnRpbWUsCU1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsCi0JIFB5RG9jX1NUUigiZm9ybWF0IC0+IHN0cmZ0aW1lKCkgc3R5bGUgc3RyaW5nLiIpfSwKKyAgICB7InN0cmZ0aW1lIiwgICAgICAgIChQeUNGdW5jdGlvbilkYXRlX3N0cmZ0aW1lLCAgICAgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywKKyAgICAgUHlEb2NfU1RSKCJmb3JtYXQgLT4gc3RyZnRpbWUoKSBzdHlsZSBzdHJpbmcuIil9LAogCi0JeyJfX2Zvcm1hdF9fIiwgCShQeUNGdW5jdGlvbilkYXRlX2Zvcm1hdCwJTUVUSF9WQVJBUkdTLAotCSBQeURvY19TVFIoIkZvcm1hdHMgc2VsZiB3aXRoIHN0cmZ0aW1lLiIpfSwKKyAgICB7Il9fZm9ybWF0X18iLCAgICAgIChQeUNGdW5jdGlvbilkYXRlX2Zvcm1hdCwgICAgICAgTUVUSF9WQVJBUkdTLAorICAgICBQeURvY19TVFIoIkZvcm1hdHMgc2VsZiB3aXRoIHN0cmZ0aW1lLiIpfSwKIAotCXsidGltZXR1cGxlIiwgICAoUHlDRnVuY3Rpb24pZGF0ZV90aW1ldHVwbGUsICAgIE1FVEhfTk9BUkdTLAotICAgICAgICAgUHlEb2NfU1RSKCJSZXR1cm4gdGltZSB0dXBsZSwgY29tcGF0aWJsZSB3aXRoIHRpbWUubG9jYWx0aW1lKCkuIil9LAorICAgIHsidGltZXR1cGxlIiwgICAoUHlDRnVuY3Rpb24pZGF0ZV90aW1ldHVwbGUsICAgIE1FVEhfTk9BUkdTLAorICAgICBQeURvY19TVFIoIlJldHVybiB0aW1lIHR1cGxlLCBjb21wYXRpYmxlIHdpdGggdGltZS5sb2NhbHRpbWUoKS4iKX0sCiAKLQl7Imlzb2NhbGVuZGFyIiwgKFB5Q0Z1bmN0aW9uKWRhdGVfaXNvY2FsZW5kYXIsICBNRVRIX05PQVJHUywKLQkgUHlEb2NfU1RSKCJSZXR1cm4gYSAzLXR1cGxlIGNvbnRhaW5pbmcgSVNPIHllYXIsIHdlZWsgbnVtYmVyLCBhbmQgIgotCSAJICAgIndlZWtkYXkuIil9LAorICAgIHsiaXNvY2FsZW5kYXIiLCAoUHlDRnVuY3Rpb24pZGF0ZV9pc29jYWxlbmRhciwgIE1FVEhfTk9BUkdTLAorICAgICBQeURvY19TVFIoIlJldHVybiBhIDMtdHVwbGUgY29udGFpbmluZyBJU08geWVhciwgd2VlayBudW1iZXIsIGFuZCAiCisgICAgICAgICAgICAgICAid2Vla2RheS4iKX0sCiAKLQl7Imlzb2Zvcm1hdCIsICAgKFB5Q0Z1bmN0aW9uKWRhdGVfaXNvZm9ybWF0LAlNRVRIX05PQVJHUywKLQkgUHlEb2NfU1RSKCJSZXR1cm4gc3RyaW5nIGluIElTTyA4NjAxIGZvcm1hdCwgWVlZWS1NTS1ERC4iKX0sCisgICAgeyJpc29mb3JtYXQiLCAgIChQeUNGdW5jdGlvbilkYXRlX2lzb2Zvcm1hdCwgICAgICAgIE1FVEhfTk9BUkdTLAorICAgICBQeURvY19TVFIoIlJldHVybiBzdHJpbmcgaW4gSVNPIDg2MDEgZm9ybWF0LCBZWVlZLU1NLURELiIpfSwKIAotCXsiaXNvd2Vla2RheSIsICAoUHlDRnVuY3Rpb24pZGF0ZV9pc293ZWVrZGF5LCAgIE1FVEhfTk9BUkdTLAotCSBQeURvY19TVFIoIlJldHVybiB0aGUgZGF5IG9mIHRoZSB3ZWVrIHJlcHJlc2VudGVkIGJ5IHRoZSBkYXRlLlxuIgotCSAJICAgIk1vbmRheSA9PSAxIC4uLiBTdW5kYXkgPT0gNyIpfSwKKyAgICB7Imlzb3dlZWtkYXkiLCAgKFB5Q0Z1bmN0aW9uKWRhdGVfaXNvd2Vla2RheSwgICBNRVRIX05PQVJHUywKKyAgICAgUHlEb2NfU1RSKCJSZXR1cm4gdGhlIGRheSBvZiB0aGUgd2VlayByZXByZXNlbnRlZCBieSB0aGUgZGF0ZS5cbiIKKyAgICAgICAgICAgICAgICJNb25kYXkgPT0gMSAuLi4gU3VuZGF5ID09IDciKX0sCiAKLQl7InRvb3JkaW5hbCIsICAgKFB5Q0Z1bmN0aW9uKWRhdGVfdG9vcmRpbmFsLCAgICBNRVRIX05PQVJHUywKLQkgUHlEb2NfU1RSKCJSZXR1cm4gcHJvbGVwdGljIEdyZWdvcmlhbiBvcmRpbmFsLiAgSmFudWFyeSAxIG9mIHllYXIgIgotCSAJICAgIjEgaXMgZGF5IDEuIil9LAorICAgIHsidG9vcmRpbmFsIiwgICAoUHlDRnVuY3Rpb24pZGF0ZV90b29yZGluYWwsICAgIE1FVEhfTk9BUkdTLAorICAgICBQeURvY19TVFIoIlJldHVybiBwcm9sZXB0aWMgR3JlZ29yaWFuIG9yZGluYWwuICBKYW51YXJ5IDEgb2YgeWVhciAiCisgICAgICAgICAgICAgICAiMSBpcyBkYXkgMS4iKX0sCiAKLQl7IndlZWtkYXkiLCAgICAgKFB5Q0Z1bmN0aW9uKWRhdGVfd2Vla2RheSwgICAgICBNRVRIX05PQVJHUywKLQkgUHlEb2NfU1RSKCJSZXR1cm4gdGhlIGRheSBvZiB0aGUgd2VlayByZXByZXNlbnRlZCBieSB0aGUgZGF0ZS5cbiIKLQkJICAgIk1vbmRheSA9PSAwIC4uLiBTdW5kYXkgPT0gNiIpfSwKKyAgICB7IndlZWtkYXkiLCAgICAgKFB5Q0Z1bmN0aW9uKWRhdGVfd2Vla2RheSwgICAgICBNRVRIX05PQVJHUywKKyAgICAgUHlEb2NfU1RSKCJSZXR1cm4gdGhlIGRheSBvZiB0aGUgd2VlayByZXByZXNlbnRlZCBieSB0aGUgZGF0ZS5cbiIKKyAgICAgICAgICAgICAgICJNb25kYXkgPT0gMCAuLi4gU3VuZGF5ID09IDYiKX0sCiAKLQl7InJlcGxhY2UiLCAgICAgKFB5Q0Z1bmN0aW9uKWRhdGVfcmVwbGFjZSwgICAgICBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLAotCSBQeURvY19TVFIoIlJldHVybiBkYXRlIHdpdGggbmV3IHNwZWNpZmllZCBmaWVsZHMuIil9LAorICAgIHsicmVwbGFjZSIsICAgICAoUHlDRnVuY3Rpb24pZGF0ZV9yZXBsYWNlLCAgICAgIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsCisgICAgIFB5RG9jX1NUUigiUmV0dXJuIGRhdGUgd2l0aCBuZXcgc3BlY2lmaWVkIGZpZWxkcy4iKX0sCiAKLQl7Il9fcmVkdWNlX18iLCAoUHlDRnVuY3Rpb24pZGF0ZV9yZWR1Y2UsICAgICAgICBNRVRIX05PQVJHUywKLQkgUHlEb2NfU1RSKCJfX3JlZHVjZV9fKCkgLT4gKGNscywgc3RhdGUpIil9LAorICAgIHsiX19yZWR1Y2VfXyIsIChQeUNGdW5jdGlvbilkYXRlX3JlZHVjZSwgICAgICAgIE1FVEhfTk9BUkdTLAorICAgICBQeURvY19TVFIoIl9fcmVkdWNlX18oKSAtPiAoY2xzLCBzdGF0ZSkiKX0sCiAKLQl7TlVMTCwJTlVMTH0KKyAgICB7TlVMTCwgICAgICBOVUxMfQogfTsKIAogc3RhdGljIGNoYXIgZGF0ZV9kb2NbXSA9CiBQeURvY19TVFIoImRhdGUoeWVhciwgbW9udGgsIGRheSkgLS0+IGRhdGUgb2JqZWN0Iik7CiAKIHN0YXRpYyBQeU51bWJlck1ldGhvZHMgZGF0ZV9hc19udW1iZXIgPSB7Ci0JZGF0ZV9hZGQsCQkJCQkvKiBuYl9hZGQgKi8KLQlkYXRlX3N1YnRyYWN0LAkJCQkJLyogbmJfc3VidHJhY3QgKi8KLQkwLAkJCQkJCS8qIG5iX211bHRpcGx5ICovCi0JMCwJCQkJCQkvKiBuYl9kaXZpZGUgKi8KLQkwLAkJCQkJCS8qIG5iX3JlbWFpbmRlciAqLwotCTAsCQkJCQkJLyogbmJfZGl2bW9kICovCi0JMCwJCQkJCQkvKiBuYl9wb3dlciAqLwotCTAsCQkJCQkJLyogbmJfbmVnYXRpdmUgKi8KLQkwLAkJCQkJCS8qIG5iX3Bvc2l0aXZlICovCi0JMCwJCQkJCQkvKiBuYl9hYnNvbHV0ZSAqLwotCTAsCQkJCQkJLyogbmJfbm9uemVybyAqLworICAgIGRhdGVfYWRkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9hZGQgKi8KKyAgICBkYXRlX3N1YnRyYWN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfc3VidHJhY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfbXVsdGlwbHkgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfZGl2aWRlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX3JlbWFpbmRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9kaXZtb2QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfcG93ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfbmVnYXRpdmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfcG9zaXRpdmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfYWJzb2x1dGUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfbm9uemVybyAqLwogfTsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBQeURhdGVUaW1lX0RhdGVUeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotCSJkYXRldGltZS5kYXRlIiwJCQkJLyogdHBfbmFtZSAqLwotCXNpemVvZihQeURhdGVUaW1lX0RhdGUpLAkJCS8qIHRwX2Jhc2ljc2l6ZSAqLwotCTAsCQkJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkwLAkJCQkJCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJCQkvKiB0cF9jb21wYXJlICovCi0JKHJlcHJmdW5jKWRhdGVfcmVwciwJCQkJLyogdHBfcmVwciAqLwotCSZkYXRlX2FzX251bWJlciwJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYylkYXRlX2hhc2gsCQkJCS8qIHRwX2hhc2ggKi8KLQkwLCAgICAgICAgICAgICAgCQkJCS8qIHRwX2NhbGwgKi8KLQkocmVwcmZ1bmMpZGF0ZV9zdHIsCQkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkJCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19DSEVDS1RZUEVTIHwKLSAgICAgICAgUHlfVFBGTEFHU19CQVNFVFlQRSwJCQkJLyogdHBfZmxhZ3MgKi8KLQlkYXRlX2RvYywJCQkJCS8qIHRwX2RvYyAqLwotCTAsCQkJCQkJLyogdHBfdHJhdmVyc2UgKi8KLQkwLAkJCQkJCS8qIHRwX2NsZWFyICovCi0JKHJpY2hjbXBmdW5jKWRhdGVfcmljaGNvbXBhcmUsCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JMCwJCQkJCQkvKiB0cF9pdGVyICovCi0JMCwJCQkJCQkvKiB0cF9pdGVybmV4dCAqLwotCWRhdGVfbWV0aG9kcywJCQkJCS8qIHRwX21ldGhvZHMgKi8KLQkwLAkJCQkJCS8qIHRwX21lbWJlcnMgKi8KLQlkYXRlX2dldHNldCwJCQkJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KLQkwLAkJCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQkwLAkJCQkJCS8qIHRwX2luaXQgKi8KLQkwLAkJCQkJCS8qIHRwX2FsbG9jICovCi0JZGF0ZV9uZXcsCQkJCQkvKiB0cF9uZXcgKi8KLQkwLAkJCQkJCS8qIHRwX2ZyZWUgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAiZGF0ZXRpbWUuZGF0ZSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgIHNpemVvZihQeURhdGVUaW1lX0RhdGUpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIChyZXByZnVuYylkYXRlX3JlcHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgJmRhdGVfYXNfbnVtYmVyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKWRhdGVfaGFzaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIChyZXByZnVuYylkYXRlX3N0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19DSEVDS1RZUEVTIHwKKyAgICBQeV9UUEZMQUdTX0JBU0VUWVBFLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICBkYXRlX2RvYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgKHJpY2hjbXBmdW5jKWRhdGVfcmljaGNvbXBhcmUsICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICBkYXRlX21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgZGF0ZV9nZXRzZXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBkYXRlX25ldywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KIH07CiAKIC8qCkBAIC0yODE1LDEwICsyODE1LDEwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogdHppbmZvX25vZ28oY29uc3QgY2hhciogbWV0aG9kbmFtZSkKIHsKLQlQeUVycl9Gb3JtYXQoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwKLQkJICAgICAiYSB0emluZm8gc3ViY2xhc3MgbXVzdCBpbXBsZW1lbnQgJXMoKSIsCi0JCSAgICAgbWV0aG9kbmFtZSk7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsCisgICAgICAgICAgICAgICAgICJhIHR6aW5mbyBzdWJjbGFzcyBtdXN0IGltcGxlbWVudCAlcygpIiwKKyAgICAgICAgICAgICAgICAgbWV0aG9kbmFtZSk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIC8qIE1ldGhvZHMuICBBIHN1YmNsYXNzIG11c3QgaW1wbGVtZW50IHRoZXNlLiAqLwpAQCAtMjgyNiwxMDEgKzI4MjYsMTAxIEBACiBzdGF0aWMgUHlPYmplY3QgKgogdHppbmZvX3R6bmFtZShQeURhdGVUaW1lX1RaSW5mbyAqc2VsZiwgUHlPYmplY3QgKmR0KQogewotCXJldHVybiB0emluZm9fbm9nbygidHpuYW1lIik7CisgICAgcmV0dXJuIHR6aW5mb19ub2dvKCJ0em5hbWUiKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHR6aW5mb191dGNvZmZzZXQoUHlEYXRlVGltZV9UWkluZm8gKnNlbGYsIFB5T2JqZWN0ICpkdCkKIHsKLQlyZXR1cm4gdHppbmZvX25vZ28oInV0Y29mZnNldCIpOworICAgIHJldHVybiB0emluZm9fbm9nbygidXRjb2Zmc2V0Iik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB0emluZm9fZHN0KFB5RGF0ZVRpbWVfVFpJbmZvICpzZWxmLCBQeU9iamVjdCAqZHQpCiB7Ci0JcmV0dXJuIHR6aW5mb19ub2dvKCJkc3QiKTsKKyAgICByZXR1cm4gdHppbmZvX25vZ28oImRzdCIpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogdHppbmZvX2Zyb211dGMoUHlEYXRlVGltZV9UWkluZm8gKnNlbGYsIFB5RGF0ZVRpbWVfRGF0ZVRpbWUgKmR0KQogewotCWludCB5LCBtLCBkLCBoaCwgbW0sIHNzLCB1czsKKyAgICBpbnQgeSwgbSwgZCwgaGgsIG1tLCBzcywgdXM7CiAKLQlQeU9iamVjdCAqcmVzdWx0OwotCWludCBvZmYsIGRzdDsKLQlpbnQgbm9uZTsKLQlpbnQgZGVsdGE7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICBpbnQgb2ZmLCBkc3Q7CisgICAgaW50IG5vbmU7CisgICAgaW50IGRlbHRhOwogCi0JaWYgKCEgUHlEYXRlVGltZV9DaGVjayhkdCkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiZnJvbXV0YzogYXJndW1lbnQgbXVzdCBiZSBhIGRhdGV0aW1lIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoISBIQVNUWklORk8oZHQpIHx8IGR0LT50emluZm8gIT0gKFB5T2JqZWN0ICopc2VsZikgewotCSAgICAJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJmcm9tdXRjOiBkdC50emluZm8gIgotCSAgICAJCQkiaXMgbm90IHNlbGYiKTsKLQkgICAgCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoISBQeURhdGVUaW1lX0NoZWNrKGR0KSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImZyb211dGM6IGFyZ3VtZW50IG11c3QgYmUgYSBkYXRldGltZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKCEgSEFTVFpJTkZPKGR0KSB8fCBkdC0+dHppbmZvICE9IChQeU9iamVjdCAqKXNlbGYpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJmcm9tdXRjOiBkdC50emluZm8gIgorICAgICAgICAgICAgICAgICAgICAgICAgImlzIG5vdCBzZWxmIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCW9mZiA9IGNhbGxfdXRjb2Zmc2V0KGR0LT50emluZm8sIChQeU9iamVjdCAqKWR0LCAmbm9uZSk7Ci0JaWYgKG9mZiA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAobm9uZSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImZyb211dGM6IG5vbi1Ob25lICIKLQkJCQkidXRjb2Zmc2V0KCkgcmVzdWx0IHJlcXVpcmVkIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBvZmYgPSBjYWxsX3V0Y29mZnNldChkdC0+dHppbmZvLCAoUHlPYmplY3QgKilkdCwgJm5vbmUpOworICAgIGlmIChvZmYgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKG5vbmUpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJmcm9tdXRjOiBub24tTm9uZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAidXRjb2Zmc2V0KCkgcmVzdWx0IHJlcXVpcmVkIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWRzdCA9IGNhbGxfZHN0KGR0LT50emluZm8sIChQeU9iamVjdCAqKWR0LCAmbm9uZSk7Ci0JaWYgKGRzdCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAobm9uZSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImZyb211dGM6IG5vbi1Ob25lICIKLQkJCQkiZHN0KCkgcmVzdWx0IHJlcXVpcmVkIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBkc3QgPSBjYWxsX2RzdChkdC0+dHppbmZvLCAoUHlPYmplY3QgKilkdCwgJm5vbmUpOworICAgIGlmIChkc3QgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKG5vbmUpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJmcm9tdXRjOiBub24tTm9uZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAiZHN0KCkgcmVzdWx0IHJlcXVpcmVkIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXkgPSBHRVRfWUVBUihkdCk7Ci0JbSA9IEdFVF9NT05USChkdCk7Ci0JZCA9IEdFVF9EQVkoZHQpOwotCWhoID0gREFURV9HRVRfSE9VUihkdCk7Ci0JbW0gPSBEQVRFX0dFVF9NSU5VVEUoZHQpOwotCXNzID0gREFURV9HRVRfU0VDT05EKGR0KTsKLQl1cyA9IERBVEVfR0VUX01JQ1JPU0VDT05EKGR0KTsKKyAgICB5ID0gR0VUX1lFQVIoZHQpOworICAgIG0gPSBHRVRfTU9OVEgoZHQpOworICAgIGQgPSBHRVRfREFZKGR0KTsKKyAgICBoaCA9IERBVEVfR0VUX0hPVVIoZHQpOworICAgIG1tID0gREFURV9HRVRfTUlOVVRFKGR0KTsKKyAgICBzcyA9IERBVEVfR0VUX1NFQ09ORChkdCk7CisgICAgdXMgPSBEQVRFX0dFVF9NSUNST1NFQ09ORChkdCk7CiAKLQlkZWx0YSA9IG9mZiAtIGRzdDsKLQltbSArPSBkZWx0YTsKLQlpZiAoKG1tIDwgMCB8fCBtbSA+PSA2MCkgJiYKLQkgICAgbm9ybWFsaXplX2RhdGV0aW1lKCZ5LCAmbSwgJmQsICZoaCwgJm1tLCAmc3MsICZ1cykgPCAwKQotCQlyZXR1cm4gTlVMTDsKLQlyZXN1bHQgPSBuZXdfZGF0ZXRpbWUoeSwgbSwgZCwgaGgsIG1tLCBzcywgdXMsIGR0LT50emluZm8pOwotCWlmIChyZXN1bHQgPT0gTlVMTCkKLQkJcmV0dXJuIHJlc3VsdDsKKyAgICBkZWx0YSA9IG9mZiAtIGRzdDsKKyAgICBtbSArPSBkZWx0YTsKKyAgICBpZiAoKG1tIDwgMCB8fCBtbSA+PSA2MCkgJiYKKyAgICAgICAgbm9ybWFsaXplX2RhdGV0aW1lKCZ5LCAmbSwgJmQsICZoaCwgJm1tLCAmc3MsICZ1cykgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXN1bHQgPSBuZXdfZGF0ZXRpbWUoeSwgbSwgZCwgaGgsIG1tLCBzcywgdXMsIGR0LT50emluZm8pOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKIAotCWRzdCA9IGNhbGxfZHN0KGR0LT50emluZm8sIHJlc3VsdCwgJm5vbmUpOwotCWlmIChkc3QgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJZ290byBGYWlsOwotCWlmIChub25lKQotCQlnb3RvIEluY29uc2lzdGVudDsKLQlpZiAoZHN0ID09IDApCi0JCXJldHVybiByZXN1bHQ7CisgICAgZHN0ID0gY2FsbF9kc3QoZHQtPnR6aW5mbywgcmVzdWx0LCAmbm9uZSk7CisgICAgaWYgKGRzdCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICBnb3RvIEZhaWw7CisgICAgaWYgKG5vbmUpCisgICAgICAgIGdvdG8gSW5jb25zaXN0ZW50OworICAgIGlmIChkc3QgPT0gMCkKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKIAotCW1tICs9IGRzdDsKLQlpZiAoKG1tIDwgMCB8fCBtbSA+PSA2MCkgJiYKLQkgICAgbm9ybWFsaXplX2RhdGV0aW1lKCZ5LCAmbSwgJmQsICZoaCwgJm1tLCAmc3MsICZ1cykgPCAwKQotCQlnb3RvIEZhaWw7Ci0JUHlfREVDUkVGKHJlc3VsdCk7Ci0JcmVzdWx0ID0gbmV3X2RhdGV0aW1lKHksIG0sIGQsIGhoLCBtbSwgc3MsIHVzLCBkdC0+dHppbmZvKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIG1tICs9IGRzdDsKKyAgICBpZiAoKG1tIDwgMCB8fCBtbSA+PSA2MCkgJiYKKyAgICAgICAgbm9ybWFsaXplX2RhdGV0aW1lKCZ5LCAmbSwgJmQsICZoaCwgJm1tLCAmc3MsICZ1cykgPCAwKQorICAgICAgICBnb3RvIEZhaWw7CisgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgcmVzdWx0ID0gbmV3X2RhdGV0aW1lKHksIG0sIGQsIGhoLCBtbSwgc3MsIHVzLCBkdC0+dHppbmZvKTsKKyAgICByZXR1cm4gcmVzdWx0OwogCiBJbmNvbnNpc3RlbnQ6Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJmcm9tdXRjOiB0ei5kc3QoKSBnYXZlIgotCQkJImluY29uc2lzdGVudCByZXN1bHRzOyBjYW5ub3QgY29udmVydCIpOworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiZnJvbXV0YzogdHouZHN0KCkgZ2F2ZSIKKyAgICAgICAgICAgICAgICAgICAgImluY29uc2lzdGVudCByZXN1bHRzOyBjYW5ub3QgY29udmVydCIpOwogCi0JLyogZmFsbCB0aHJ1IHRvIGZhaWx1cmUgKi8KKyAgICAvKiBmYWxsIHRocnUgdG8gZmFpbHVyZSAqLwogRmFpbDoKLQlQeV9ERUNSRUYocmVzdWx0KTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogLyoKQEAgLTI5MzEsMTI0ICsyOTMxLDEyNCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHR6aW5mb19yZWR1Y2UoUHlPYmplY3QgKnNlbGYpCiB7Ci0JUHlPYmplY3QgKmFyZ3MsICpzdGF0ZSwgKnRtcDsKLQlQeU9iamVjdCAqZ2V0aW5pdGFyZ3MsICpnZXRzdGF0ZTsKKyAgICBQeU9iamVjdCAqYXJncywgKnN0YXRlLCAqdG1wOworICAgIFB5T2JqZWN0ICpnZXRpbml0YXJncywgKmdldHN0YXRlOwogCi0JdG1wID0gUHlUdXBsZV9OZXcoMCk7Ci0JaWYgKHRtcCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICB0bXAgPSBQeVR1cGxlX05ldygwKTsKKyAgICBpZiAodG1wID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JZ2V0aW5pdGFyZ3MgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHNlbGYsICJfX2dldGluaXRhcmdzX18iKTsKLQlpZiAoZ2V0aW5pdGFyZ3MgIT0gTlVMTCkgewotCQlhcmdzID0gUHlPYmplY3RfQ2FsbE9iamVjdChnZXRpbml0YXJncywgdG1wKTsKLQkJUHlfREVDUkVGKGdldGluaXRhcmdzKTsKLQkJaWYgKGFyZ3MgPT0gTlVMTCkgewotCQkJUHlfREVDUkVGKHRtcCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KLQllbHNlIHsKLQkJUHlFcnJfQ2xlYXIoKTsKLQkJYXJncyA9IHRtcDsKLQkJUHlfSU5DUkVGKGFyZ3MpOwotCX0KKyAgICBnZXRpbml0YXJncyA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoc2VsZiwgIl9fZ2V0aW5pdGFyZ3NfXyIpOworICAgIGlmIChnZXRpbml0YXJncyAhPSBOVUxMKSB7CisgICAgICAgIGFyZ3MgPSBQeU9iamVjdF9DYWxsT2JqZWN0KGdldGluaXRhcmdzLCB0bXApOworICAgICAgICBQeV9ERUNSRUYoZ2V0aW5pdGFyZ3MpOworICAgICAgICBpZiAoYXJncyA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYodG1wKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBhcmdzID0gdG1wOworICAgICAgICBQeV9JTkNSRUYoYXJncyk7CisgICAgfQogCi0JZ2V0c3RhdGUgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHNlbGYsICJfX2dldHN0YXRlX18iKTsKLQlpZiAoZ2V0c3RhdGUgIT0gTlVMTCkgewotCQlzdGF0ZSA9IFB5T2JqZWN0X0NhbGxPYmplY3QoZ2V0c3RhdGUsIHRtcCk7Ci0JCVB5X0RFQ1JFRihnZXRzdGF0ZSk7Ci0JCWlmIChzdGF0ZSA9PSBOVUxMKSB7Ci0JCQlQeV9ERUNSRUYoYXJncyk7Ci0JCQlQeV9ERUNSRUYodG1wKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQotCWVsc2UgewotCQlQeU9iamVjdCAqKmRpY3RwdHI7Ci0JCVB5RXJyX0NsZWFyKCk7Ci0JCXN0YXRlID0gUHlfTm9uZTsKLQkJZGljdHB0ciA9IF9QeU9iamVjdF9HZXREaWN0UHRyKHNlbGYpOwotCQlpZiAoZGljdHB0ciAmJiAqZGljdHB0ciAmJiBQeURpY3RfU2l6ZSgqZGljdHB0cikpCi0JCQlzdGF0ZSA9ICpkaWN0cHRyOwotCQlQeV9JTkNSRUYoc3RhdGUpOwotCX0KKyAgICBnZXRzdGF0ZSA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoc2VsZiwgIl9fZ2V0c3RhdGVfXyIpOworICAgIGlmIChnZXRzdGF0ZSAhPSBOVUxMKSB7CisgICAgICAgIHN0YXRlID0gUHlPYmplY3RfQ2FsbE9iamVjdChnZXRzdGF0ZSwgdG1wKTsKKyAgICAgICAgUHlfREVDUkVGKGdldHN0YXRlKTsKKyAgICAgICAgaWYgKHN0YXRlID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihhcmdzKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih0bXApOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5T2JqZWN0ICoqZGljdHB0cjsKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgc3RhdGUgPSBQeV9Ob25lOworICAgICAgICBkaWN0cHRyID0gX1B5T2JqZWN0X0dldERpY3RQdHIoc2VsZik7CisgICAgICAgIGlmIChkaWN0cHRyICYmICpkaWN0cHRyICYmIFB5RGljdF9TaXplKCpkaWN0cHRyKSkKKyAgICAgICAgICAgIHN0YXRlID0gKmRpY3RwdHI7CisgICAgICAgIFB5X0lOQ1JFRihzdGF0ZSk7CisgICAgfQogCi0JUHlfREVDUkVGKHRtcCk7CisgICAgUHlfREVDUkVGKHRtcCk7CiAKLQlpZiAoc3RhdGUgPT0gUHlfTm9uZSkgewotCQlQeV9ERUNSRUYoc3RhdGUpOwotCQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKE9OKSIsIFB5X1RZUEUoc2VsZiksIGFyZ3MpOwotCX0KLQllbHNlCi0JCXJldHVybiBQeV9CdWlsZFZhbHVlKCIoT05OKSIsIFB5X1RZUEUoc2VsZiksIGFyZ3MsIHN0YXRlKTsKKyAgICBpZiAoc3RhdGUgPT0gUHlfTm9uZSkgeworICAgICAgICBQeV9ERUNSRUYoc3RhdGUpOworICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKE9OKSIsIFB5X1RZUEUoc2VsZiksIGFyZ3MpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIoT05OKSIsIFB5X1RZUEUoc2VsZiksIGFyZ3MsIHN0YXRlKTsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIHR6aW5mb19tZXRob2RzW10gPSB7CiAKLQl7InR6bmFtZSIsCShQeUNGdW5jdGlvbil0emluZm9fdHpuYW1lLAkJTUVUSF9PLAotCSBQeURvY19TVFIoImRhdGV0aW1lIC0+IHN0cmluZyBuYW1lIG9mIHRpbWUgem9uZS4iKX0sCisgICAgeyJ0em5hbWUiLCAgICAgICAgICAoUHlDRnVuY3Rpb24pdHppbmZvX3R6bmFtZSwgICAgICAgICAgICAgTUVUSF9PLAorICAgICBQeURvY19TVFIoImRhdGV0aW1lIC0+IHN0cmluZyBuYW1lIG9mIHRpbWUgem9uZS4iKX0sCiAKLQl7InV0Y29mZnNldCIsCShQeUNGdW5jdGlvbil0emluZm9fdXRjb2Zmc2V0LAkJTUVUSF9PLAotCSBQeURvY19TVFIoImRhdGV0aW1lIC0+IG1pbnV0ZXMgZWFzdCBvZiBVVEMgKG5lZ2F0aXZlIGZvciAiCi0JIAkgICAid2VzdCBvZiBVVEMpLiIpfSwKKyAgICB7InV0Y29mZnNldCIsICAgICAgIChQeUNGdW5jdGlvbil0emluZm9fdXRjb2Zmc2V0LCAgICAgICAgICBNRVRIX08sCisgICAgIFB5RG9jX1NUUigiZGF0ZXRpbWUgLT4gbWludXRlcyBlYXN0IG9mIFVUQyAobmVnYXRpdmUgZm9yICIKKyAgICAgICAgICAgICAgICJ3ZXN0IG9mIFVUQykuIil9LAogCi0JeyJkc3QiLAkJKFB5Q0Z1bmN0aW9uKXR6aW5mb19kc3QsCQlNRVRIX08sCi0JIFB5RG9jX1NUUigiZGF0ZXRpbWUgLT4gRFNUIG9mZnNldCBpbiBtaW51dGVzIGVhc3Qgb2YgVVRDLiIpfSwKKyAgICB7ImRzdCIsICAgICAgICAgICAgIChQeUNGdW5jdGlvbil0emluZm9fZHN0LCAgICAgICAgICAgICAgICBNRVRIX08sCisgICAgIFB5RG9jX1NUUigiZGF0ZXRpbWUgLT4gRFNUIG9mZnNldCBpbiBtaW51dGVzIGVhc3Qgb2YgVVRDLiIpfSwKIAotCXsiZnJvbXV0YyIsCShQeUNGdW5jdGlvbil0emluZm9fZnJvbXV0YywJCU1FVEhfTywKLQkgUHlEb2NfU1RSKCJkYXRldGltZSBpbiBVVEMgLT4gZGF0ZXRpbWUgaW4gbG9jYWwgdGltZS4iKX0sCisgICAgeyJmcm9tdXRjIiwgICAgICAgICAoUHlDRnVuY3Rpb24pdHppbmZvX2Zyb211dGMsICAgICAgICAgICAgTUVUSF9PLAorICAgICBQeURvY19TVFIoImRhdGV0aW1lIGluIFVUQyAtPiBkYXRldGltZSBpbiBsb2NhbCB0aW1lLiIpfSwKIAotCXsiX19yZWR1Y2VfXyIsICAoUHlDRnVuY3Rpb24pdHppbmZvX3JlZHVjZSwgICAgICAgICAgICAgTUVUSF9OT0FSR1MsCi0JIFB5RG9jX1NUUigiLT4gKGNscywgc3RhdGUpIil9LAorICAgIHsiX19yZWR1Y2VfXyIsICAoUHlDRnVuY3Rpb24pdHppbmZvX3JlZHVjZSwgICAgICAgICAgICAgTUVUSF9OT0FSR1MsCisgICAgIFB5RG9jX1NUUigiLT4gKGNscywgc3RhdGUpIil9LAogCi0Je05VTEwsIE5VTEx9CisgICAge05VTEwsIE5VTEx9CiB9OwogCiBzdGF0aWMgY2hhciB0emluZm9fZG9jW10gPQogUHlEb2NfU1RSKCJBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciB0aW1lIHpvbmUgaW5mbyBvYmplY3RzLiIpOwogCiBzdGF0aWNoZXJlIFB5VHlwZU9iamVjdCBQeURhdGVUaW1lX1RaSW5mb1R5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCi0JMCwJCQkJCS8qIG9iX3NpemUgKi8KLQkiZGF0ZXRpbWUudHppbmZvIiwJCQkvKiB0cF9uYW1lICovCi0Jc2l6ZW9mKFB5RGF0ZVRpbWVfVFpJbmZvKSwJCS8qIHRwX2Jhc2ljc2l6ZSAqLwotCTAsCQkJCQkvKiB0cF9pdGVtc2l6ZSAqLwotCTAsCQkJCQkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9jb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkJLyogdHBfaGFzaCAqLwotCTAsICAgICAgICAgICAgICAJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19DSEVDS1RZUEVTIHwKLSAgICAgICAgUHlfVFBGTEFHU19CQVNFVFlQRSwJCQkvKiB0cF9mbGFncyAqLwotCXR6aW5mb19kb2MsCQkJCS8qIHRwX2RvYyAqLwotCTAsCQkJCQkvKiB0cF90cmF2ZXJzZSAqLwotCTAsCQkJCQkvKiB0cF9jbGVhciAqLwotCTAsCQkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCTAsCQkJCQkvKiB0cF9pdGVyICovCi0JMCwJCQkJCS8qIHRwX2l0ZXJuZXh0ICovCi0JdHppbmZvX21ldGhvZHMsCQkJCS8qIHRwX21ldGhvZHMgKi8KLQkwLAkJCQkJLyogdHBfbWVtYmVycyAqLwotCTAsCQkJCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCQkvKiB0cF9kaWN0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KLQkwLAkJCQkJLyogdHBfZGljdG9mZnNldCAqLwotCTAsCQkJCQkvKiB0cF9pbml0ICovCi0JMCwJCQkJCS8qIHRwX2FsbG9jICovCi0JUHlUeXBlX0dlbmVyaWNOZXcsCQkJLyogdHBfbmV3ICovCi0JMCwJCQkJCS8qIHRwX2ZyZWUgKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9iX3NpemUgKi8KKyAgICAiZGF0ZXRpbWUudHppbmZvIiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICBzaXplb2YoUHlEYXRlVGltZV9UWkluZm8pLCAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19DSEVDS1RZUEVTIHwKKyAgICBQeV9UUEZMQUdTX0JBU0VUWVBFLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCisgICAgdHppbmZvX2RvYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIHR6aW5mb19tZXRob2RzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBQeVR5cGVfR2VuZXJpY05ldywgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKIAogLyoKQEAgLTMwNjEsNDMgKzMwNjEsNDMgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiB0aW1lX2hvdXIoUHlEYXRlVGltZV9UaW1lICpzZWxmLCB2b2lkICp1bnVzZWQpCiB7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKFRJTUVfR0VUX0hPVVIoc2VsZikpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhUSU1FX0dFVF9IT1VSKHNlbGYpKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHRpbWVfbWludXRlKFB5RGF0ZVRpbWVfVGltZSAqc2VsZiwgdm9pZCAqdW51c2VkKQogewotCXJldHVybiBQeUludF9Gcm9tTG9uZyhUSU1FX0dFVF9NSU5VVEUoc2VsZikpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhUSU1FX0dFVF9NSU5VVEUoc2VsZikpOwogfQogCiAvKiBUaGUgbmFtZSB0aW1lX3NlY29uZCBjb25mbGljdGVkIHdpdGggc29tZSBwbGF0Zm9ybSBoZWFkZXIgZmlsZS4gKi8KIHN0YXRpYyBQeU9iamVjdCAqCiBweV90aW1lX3NlY29uZChQeURhdGVUaW1lX1RpbWUgKnNlbGYsIHZvaWQgKnVudXNlZCkKIHsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoVElNRV9HRVRfU0VDT05EKHNlbGYpKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoVElNRV9HRVRfU0VDT05EKHNlbGYpKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHRpbWVfbWljcm9zZWNvbmQoUHlEYXRlVGltZV9UaW1lICpzZWxmLCB2b2lkICp1bnVzZWQpCiB7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKFRJTUVfR0VUX01JQ1JPU0VDT05EKHNlbGYpKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoVElNRV9HRVRfTUlDUk9TRUNPTkQoc2VsZikpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogdGltZV90emluZm8oUHlEYXRlVGltZV9UaW1lICpzZWxmLCB2b2lkICp1bnVzZWQpCiB7Ci0JUHlPYmplY3QgKnJlc3VsdCA9IEhBU1RaSU5GTyhzZWxmKSA/IHNlbGYtPnR6aW5mbyA6IFB5X05vbmU7Ci0JUHlfSU5DUkVGKHJlc3VsdCk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBQeU9iamVjdCAqcmVzdWx0ID0gSEFTVFpJTkZPKHNlbGYpID8gc2VsZi0+dHppbmZvIDogUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYocmVzdWx0KTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgUHlHZXRTZXREZWYgdGltZV9nZXRzZXRbXSA9IHsKLQl7ImhvdXIiLCAgICAgICAgKGdldHRlcil0aW1lX2hvdXJ9LAotCXsibWludXRlIiwgICAgICAoZ2V0dGVyKXRpbWVfbWludXRlfSwKLQl7InNlY29uZCIsICAgICAgKGdldHRlcilweV90aW1lX3NlY29uZH0sCi0JeyJtaWNyb3NlY29uZCIsIChnZXR0ZXIpdGltZV9taWNyb3NlY29uZH0sCi0JeyJ0emluZm8iLAkoZ2V0dGVyKXRpbWVfdHppbmZvfSwKLQl7TlVMTH0KKyAgICB7ImhvdXIiLCAgICAgICAgKGdldHRlcil0aW1lX2hvdXJ9LAorICAgIHsibWludXRlIiwgICAgICAoZ2V0dGVyKXRpbWVfbWludXRlfSwKKyAgICB7InNlY29uZCIsICAgICAgKGdldHRlcilweV90aW1lX3NlY29uZH0sCisgICAgeyJtaWNyb3NlY29uZCIsIChnZXR0ZXIpdGltZV9taWNyb3NlY29uZH0sCisgICAgeyJ0emluZm8iLCAgICAgICAgICAoZ2V0dGVyKXRpbWVfdHppbmZvfSwKKyAgICB7TlVMTH0KIH07CiAKIC8qCkBAIC0zMTA1LDY0ICszMTA1LDY0IEBACiAgKi8KIAogc3RhdGljIGNoYXIgKnRpbWVfa3dzW10gPSB7ImhvdXIiLCAibWludXRlIiwgInNlY29uZCIsICJtaWNyb3NlY29uZCIsCi0JCQkgICAidHppbmZvIiwgTlVMTH07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAidHppbmZvIiwgTlVMTH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB0aW1lX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3cpCiB7Ci0JUHlPYmplY3QgKnNlbGYgPSBOVUxMOwotCVB5T2JqZWN0ICpzdGF0ZTsKLQlpbnQgaG91ciA9IDA7Ci0JaW50IG1pbnV0ZSA9IDA7Ci0JaW50IHNlY29uZCA9IDA7Ci0JaW50IHVzZWNvbmQgPSAwOwotCVB5T2JqZWN0ICp0emluZm8gPSBQeV9Ob25lOworICAgIFB5T2JqZWN0ICpzZWxmID0gTlVMTDsKKyAgICBQeU9iamVjdCAqc3RhdGU7CisgICAgaW50IGhvdXIgPSAwOworICAgIGludCBtaW51dGUgPSAwOworICAgIGludCBzZWNvbmQgPSAwOworICAgIGludCB1c2Vjb25kID0gMDsKKyAgICBQeU9iamVjdCAqdHppbmZvID0gUHlfTm9uZTsKIAotCS8qIENoZWNrIGZvciBpbnZvY2F0aW9uIGZyb20gcGlja2xlIHdpdGggX19nZXRzdGF0ZV9fIHN0YXRlICovCi0JaWYgKFB5VHVwbGVfR0VUX1NJWkUoYXJncykgPj0gMSAmJgotCSAgICBQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpIDw9IDIgJiYKLQkgICAgUHlTdHJpbmdfQ2hlY2soc3RhdGUgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDApKSAmJgotCSAgICBQeVN0cmluZ19HRVRfU0laRShzdGF0ZSkgPT0gX1B5RGF0ZVRpbWVfVElNRV9EQVRBU0laRSAmJgotCSAgICAoKHVuc2lnbmVkIGNoYXIpIChQeVN0cmluZ19BU19TVFJJTkcoc3RhdGUpWzBdKSkgPCAyNCkKLQl7Ci0JCVB5RGF0ZVRpbWVfVGltZSAqbWU7Ci0JCWNoYXIgYXdhcmU7CisgICAgLyogQ2hlY2sgZm9yIGludm9jYXRpb24gZnJvbSBwaWNrbGUgd2l0aCBfX2dldHN0YXRlX18gc3RhdGUgKi8KKyAgICBpZiAoUHlUdXBsZV9HRVRfU0laRShhcmdzKSA+PSAxICYmCisgICAgICAgIFB5VHVwbGVfR0VUX1NJWkUoYXJncykgPD0gMiAmJgorICAgICAgICBQeVN0cmluZ19DaGVjayhzdGF0ZSA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgMCkpICYmCisgICAgICAgIFB5U3RyaW5nX0dFVF9TSVpFKHN0YXRlKSA9PSBfUHlEYXRlVGltZV9USU1FX0RBVEFTSVpFICYmCisgICAgICAgICgodW5zaWduZWQgY2hhcikgKFB5U3RyaW5nX0FTX1NUUklORyhzdGF0ZSlbMF0pKSA8IDI0KQorICAgIHsKKyAgICAgICAgUHlEYXRlVGltZV9UaW1lICptZTsKKyAgICAgICAgY2hhciBhd2FyZTsKIAotCQlpZiAoUHlUdXBsZV9HRVRfU0laRShhcmdzKSA9PSAyKSB7Ci0JCQl0emluZm8gPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDEpOwotCQkJaWYgKGNoZWNrX3R6aW5mb19zdWJjbGFzcyh0emluZm8pIDwgMCkgewotCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJiYWQgIgotCQkJCQkidHppbmZvIHN0YXRlIGFyZyIpOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQl9Ci0JCWF3YXJlID0gKGNoYXIpKHR6aW5mbyAhPSBQeV9Ob25lKTsKLQkJbWUgPSAoUHlEYXRlVGltZV9UaW1lICopICh0eXBlLT50cF9hbGxvYyh0eXBlLCBhd2FyZSkpOwotCQlpZiAobWUgIT0gTlVMTCkgewotCQkJY2hhciAqcGRhdGEgPSBQeVN0cmluZ19BU19TVFJJTkcoc3RhdGUpOworICAgICAgICBpZiAoUHlUdXBsZV9HRVRfU0laRShhcmdzKSA9PSAyKSB7CisgICAgICAgICAgICB0emluZm8gPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDEpOworICAgICAgICAgICAgaWYgKGNoZWNrX3R6aW5mb19zdWJjbGFzcyh0emluZm8pIDwgMCkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJiYWQgIgorICAgICAgICAgICAgICAgICAgICAidHppbmZvIHN0YXRlIGFyZyIpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGF3YXJlID0gKGNoYXIpKHR6aW5mbyAhPSBQeV9Ob25lKTsKKyAgICAgICAgbWUgPSAoUHlEYXRlVGltZV9UaW1lICopICh0eXBlLT50cF9hbGxvYyh0eXBlLCBhd2FyZSkpOworICAgICAgICBpZiAobWUgIT0gTlVMTCkgeworICAgICAgICAgICAgY2hhciAqcGRhdGEgPSBQeVN0cmluZ19BU19TVFJJTkcoc3RhdGUpOwogCi0JCQltZW1jcHkobWUtPmRhdGEsIHBkYXRhLCBfUHlEYXRlVGltZV9USU1FX0RBVEFTSVpFKTsKLQkJCW1lLT5oYXNoY29kZSA9IC0xOwotCQkJbWUtPmhhc3R6aW5mbyA9IGF3YXJlOwotCQkJaWYgKGF3YXJlKSB7Ci0JCQkJUHlfSU5DUkVGKHR6aW5mbyk7Ci0JCQkJbWUtPnR6aW5mbyA9IHR6aW5mbzsKLQkJCX0KLQkJfQotCQlyZXR1cm4gKFB5T2JqZWN0ICopbWU7Ci0JfQorICAgICAgICAgICAgbWVtY3B5KG1lLT5kYXRhLCBwZGF0YSwgX1B5RGF0ZVRpbWVfVElNRV9EQVRBU0laRSk7CisgICAgICAgICAgICBtZS0+aGFzaGNvZGUgPSAtMTsKKyAgICAgICAgICAgIG1lLT5oYXN0emluZm8gPSBhd2FyZTsKKyAgICAgICAgICAgIGlmIChhd2FyZSkgeworICAgICAgICAgICAgICAgIFB5X0lOQ1JFRih0emluZm8pOworICAgICAgICAgICAgICAgIG1lLT50emluZm8gPSB0emluZm87CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChQeU9iamVjdCAqKW1lOworICAgIH0KIAotCWlmIChQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3csICJ8aWlpaU8iLCB0aW1lX2t3cywKLQkJCQkJJmhvdXIsICZtaW51dGUsICZzZWNvbmQsICZ1c2Vjb25kLAotCQkJCQkmdHppbmZvKSkgewotCQlpZiAoY2hlY2tfdGltZV9hcmdzKGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCB1c2Vjb25kKSA8IDApCi0JCQlyZXR1cm4gTlVMTDsKLQkJaWYgKGNoZWNrX3R6aW5mb19zdWJjbGFzcyh0emluZm8pIDwgMCkKLQkJCXJldHVybiBOVUxMOwotCQlzZWxmID0gbmV3X3RpbWVfZXgoaG91ciwgbWludXRlLCBzZWNvbmQsIHVzZWNvbmQsIHR6aW5mbywKLQkJCQkgICB0eXBlKTsKLQl9Ci0JcmV0dXJuIHNlbGY7CisgICAgaWYgKFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrdywgInxpaWlpTyIsIHRpbWVfa3dzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhvdXIsICZtaW51dGUsICZzZWNvbmQsICZ1c2Vjb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnR6aW5mbykpIHsKKyAgICAgICAgaWYgKGNoZWNrX3RpbWVfYXJncyhob3VyLCBtaW51dGUsIHNlY29uZCwgdXNlY29uZCkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGlmIChjaGVja190emluZm9fc3ViY2xhc3ModHppbmZvKSA8IDApCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgc2VsZiA9IG5ld190aW1lX2V4KGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCB1c2Vjb25kLCB0emluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlKTsKKyAgICB9CisgICAgcmV0dXJuIHNlbGY7CiB9CiAKIC8qCkBAIC0zMTcyLDEwICszMTcyLDEwIEBACiBzdGF0aWMgdm9pZAogdGltZV9kZWFsbG9jKFB5RGF0ZVRpbWVfVGltZSAqc2VsZikKIHsKLQlpZiAoSEFTVFpJTkZPKHNlbGYpKSB7Ci0JCVB5X1hERUNSRUYoc2VsZi0+dHppbmZvKTsKLQl9Ci0JUHlfVFlQRShzZWxmKS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKKyAgICBpZiAoSEFTVFpJTkZPKHNlbGYpKSB7CisgICAgICAgIFB5X1hERUNSRUYoc2VsZi0+dHppbmZvKTsKKyAgICB9CisgICAgUHlfVFlQRShzZWxmKS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogLyoKQEAgLTMxODUsMjAgKzMxODUsMjAgQEAKIC8qIFRoZXNlIGFyZSBhbGwgTUVUSF9OT0FSR1MsIHNvIGRvbid0IG5lZWQgdG8gY2hlY2sgdGhlIGFyZ2xpc3QuICovCiBzdGF0aWMgUHlPYmplY3QgKgogdGltZV91dGNvZmZzZXQoUHlEYXRlVGltZV9UaW1lICpzZWxmLCBQeU9iamVjdCAqdW51c2VkKSB7Ci0JcmV0dXJuIG9mZnNldF9hc190aW1lZGVsdGEoSEFTVFpJTkZPKHNlbGYpID8gc2VsZi0+dHppbmZvIDogUHlfTm9uZSwKLQkJCQkgICAidXRjb2Zmc2V0IiwgUHlfTm9uZSk7CisgICAgcmV0dXJuIG9mZnNldF9hc190aW1lZGVsdGEoSEFTVFpJTkZPKHNlbGYpID8gc2VsZi0+dHppbmZvIDogUHlfTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXRjb2Zmc2V0IiwgUHlfTm9uZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB0aW1lX2RzdChQeURhdGVUaW1lX1RpbWUgKnNlbGYsIFB5T2JqZWN0ICp1bnVzZWQpIHsKLQlyZXR1cm4gb2Zmc2V0X2FzX3RpbWVkZWx0YShIQVNUWklORk8oc2VsZikgPyBzZWxmLT50emluZm8gOiBQeV9Ob25lLAotCQkJCSAgICJkc3QiLCBQeV9Ob25lKTsKKyAgICByZXR1cm4gb2Zmc2V0X2FzX3RpbWVkZWx0YShIQVNUWklORk8oc2VsZikgPyBzZWxmLT50emluZm8gOiBQeV9Ob25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkc3QiLCBQeV9Ob25lKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHRpbWVfdHpuYW1lKFB5RGF0ZVRpbWVfVGltZSAqc2VsZiwgUHlPYmplY3QgKnVudXNlZCkgewotCXJldHVybiBjYWxsX3R6bmFtZShIQVNUWklORk8oc2VsZikgPyBzZWxmLT50emluZm8gOiBQeV9Ob25lLAotCQkJICAgUHlfTm9uZSk7CisgICAgcmV0dXJuIGNhbGxfdHpuYW1lKEhBU1RaSU5GTyhzZWxmKSA/IHNlbGYtPnR6aW5mbyA6IFB5X05vbmUsCisgICAgICAgICAgICAgICAgICAgICAgIFB5X05vbmUpOwogfQogCiAvKgpAQCAtMzIwOCw5NCArMzIwOCw5NCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHRpbWVfcmVwcihQeURhdGVUaW1lX1RpbWUgKnNlbGYpCiB7Ci0JY2hhciBidWZmZXJbMTAwXTsKLQljb25zdCBjaGFyICp0eXBlX25hbWUgPSBQeV9UWVBFKHNlbGYpLT50cF9uYW1lOwotCWludCBoID0gVElNRV9HRVRfSE9VUihzZWxmKTsKLQlpbnQgbSA9IFRJTUVfR0VUX01JTlVURShzZWxmKTsKLQlpbnQgcyA9IFRJTUVfR0VUX1NFQ09ORChzZWxmKTsKLQlpbnQgdXMgPSBUSU1FX0dFVF9NSUNST1NFQ09ORChzZWxmKTsKLQlQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKKyAgICBjaGFyIGJ1ZmZlclsxMDBdOworICAgIGNvbnN0IGNoYXIgKnR5cGVfbmFtZSA9IFB5X1RZUEUoc2VsZiktPnRwX25hbWU7CisgICAgaW50IGggPSBUSU1FX0dFVF9IT1VSKHNlbGYpOworICAgIGludCBtID0gVElNRV9HRVRfTUlOVVRFKHNlbGYpOworICAgIGludCBzID0gVElNRV9HRVRfU0VDT05EKHNlbGYpOworICAgIGludCB1cyA9IFRJTUVfR0VUX01JQ1JPU0VDT05EKHNlbGYpOworICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOwogCi0JaWYgKHVzKQotCQlQeU9TX3NucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksCi0JCQkgICAgICAiJXMoJWQsICVkLCAlZCwgJWQpIiwgdHlwZV9uYW1lLCBoLCBtLCBzLCB1cyk7Ci0JZWxzZSBpZiAocykKLQkJUHlPU19zbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLAotCQkJICAgICAgIiVzKCVkLCAlZCwgJWQpIiwgdHlwZV9uYW1lLCBoLCBtLCBzKTsKLQllbHNlCi0JCVB5T1Nfc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwKLQkJCSAgICAgICIlcyglZCwgJWQpIiwgdHlwZV9uYW1lLCBoLCBtKTsKLQlyZXN1bHQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1ZmZlcik7Ci0JaWYgKHJlc3VsdCAhPSBOVUxMICYmIEhBU1RaSU5GTyhzZWxmKSkKLQkJcmVzdWx0ID0gYXBwZW5kX2tleXdvcmRfdHppbmZvKHJlc3VsdCwgc2VsZi0+dHppbmZvKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIGlmICh1cykKKyAgICAgICAgUHlPU19zbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLAorICAgICAgICAgICAgICAgICAgICAgICIlcyglZCwgJWQsICVkLCAlZCkiLCB0eXBlX25hbWUsIGgsIG0sIHMsIHVzKTsKKyAgICBlbHNlIGlmIChzKQorICAgICAgICBQeU9TX3NucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksCisgICAgICAgICAgICAgICAgICAgICAgIiVzKCVkLCAlZCwgJWQpIiwgdHlwZV9uYW1lLCBoLCBtLCBzKTsKKyAgICBlbHNlCisgICAgICAgIFB5T1Nfc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAiJXMoJWQsICVkKSIsIHR5cGVfbmFtZSwgaCwgbSk7CisgICAgcmVzdWx0ID0gUHlTdHJpbmdfRnJvbVN0cmluZyhidWZmZXIpOworICAgIGlmIChyZXN1bHQgIT0gTlVMTCAmJiBIQVNUWklORk8oc2VsZikpCisgICAgICAgIHJlc3VsdCA9IGFwcGVuZF9rZXl3b3JkX3R6aW5mbyhyZXN1bHQsIHNlbGYtPnR6aW5mbyk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHRpbWVfc3RyKFB5RGF0ZVRpbWVfVGltZSAqc2VsZikKIHsKLQlyZXR1cm4gUHlPYmplY3RfQ2FsbE1ldGhvZCgoUHlPYmplY3QgKilzZWxmLCAiaXNvZm9ybWF0IiwgIigpIik7CisgICAgcmV0dXJuIFB5T2JqZWN0X0NhbGxNZXRob2QoKFB5T2JqZWN0ICopc2VsZiwgImlzb2Zvcm1hdCIsICIoKSIpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogdGltZV9pc29mb3JtYXQoUHlEYXRlVGltZV9UaW1lICpzZWxmLCBQeU9iamVjdCAqdW51c2VkKQogewotCWNoYXIgYnVmWzEwMF07Ci0JUHlPYmplY3QgKnJlc3VsdDsKLQkvKiBSZXVzZSB0aGUgdGltZSBmb3JtYXQgY29kZSBmcm9tIHRoZSBkYXRldGltZSB0eXBlLiAqLwotCVB5RGF0ZVRpbWVfRGF0ZVRpbWUgZGF0ZXRpbWU7Ci0JUHlEYXRlVGltZV9EYXRlVGltZSAqcGRhdGV0aW1lID0gJmRhdGV0aW1lOworICAgIGNoYXIgYnVmWzEwMF07CisgICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICAvKiBSZXVzZSB0aGUgdGltZSBmb3JtYXQgY29kZSBmcm9tIHRoZSBkYXRldGltZSB0eXBlLiAqLworICAgIFB5RGF0ZVRpbWVfRGF0ZVRpbWUgZGF0ZXRpbWU7CisgICAgUHlEYXRlVGltZV9EYXRlVGltZSAqcGRhdGV0aW1lID0gJmRhdGV0aW1lOwogCi0JLyogQ29weSBvdmVyIGp1c3QgdGhlIHRpbWUgYnl0ZXMuICovCi0JbWVtY3B5KHBkYXRldGltZS0+ZGF0YSArIF9QeURhdGVUaW1lX0RBVEVfREFUQVNJWkUsCi0JICAgICAgIHNlbGYtPmRhdGEsCi0JICAgICAgIF9QeURhdGVUaW1lX1RJTUVfREFUQVNJWkUpOworICAgIC8qIENvcHkgb3ZlciBqdXN0IHRoZSB0aW1lIGJ5dGVzLiAqLworICAgIG1lbWNweShwZGF0ZXRpbWUtPmRhdGEgKyBfUHlEYXRlVGltZV9EQVRFX0RBVEFTSVpFLAorICAgICAgICAgICBzZWxmLT5kYXRhLAorICAgICAgICAgICBfUHlEYXRlVGltZV9USU1FX0RBVEFTSVpFKTsKIAotCWlzb2Zvcm1hdF90aW1lKHBkYXRldGltZSwgYnVmLCBzaXplb2YoYnVmKSk7Ci0JcmVzdWx0ID0gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOwotCWlmIChyZXN1bHQgPT0gTlVMTCB8fCAhIEhBU1RaSU5GTyhzZWxmKSB8fCBzZWxmLT50emluZm8gPT0gUHlfTm9uZSkKLQkJcmV0dXJuIHJlc3VsdDsKKyAgICBpc29mb3JtYXRfdGltZShwZGF0ZXRpbWUsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOworICAgIHJlc3VsdCA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwgfHwgISBIQVNUWklORk8oc2VsZikgfHwgc2VsZi0+dHppbmZvID09IFB5X05vbmUpCisgICAgICAgIHJldHVybiByZXN1bHQ7CiAKLQkvKiBXZSBuZWVkIHRvIGFwcGVuZCB0aGUgVVRDIG9mZnNldC4gKi8KLQlpZiAoZm9ybWF0X3V0Y29mZnNldChidWYsIHNpemVvZihidWYpLCAiOiIsIHNlbGYtPnR6aW5mbywKLQkJCSAgICAgUHlfTm9uZSkgPCAwKSB7Ci0JCVB5X0RFQ1JFRihyZXN1bHQpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JUHlTdHJpbmdfQ29uY2F0QW5kRGVsKCZyZXN1bHQsIFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmKSk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICAvKiBXZSBuZWVkIHRvIGFwcGVuZCB0aGUgVVRDIG9mZnNldC4gKi8KKyAgICBpZiAoZm9ybWF0X3V0Y29mZnNldChidWYsIHNpemVvZihidWYpLCAiOiIsIHNlbGYtPnR6aW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeV9Ob25lKSA8IDApIHsKKyAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeVN0cmluZ19Db25jYXRBbmREZWwoJnJlc3VsdCwgUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogdGltZV9zdHJmdGltZShQeURhdGVUaW1lX1RpbWUgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3cpCiB7Ci0JUHlPYmplY3QgKnJlc3VsdDsKLQlQeU9iamVjdCAqdHVwbGU7Ci0JY29uc3QgY2hhciAqZm9ybWF0OwotCVB5X3NzaXplX3QgZm9ybWF0X2xlbjsKLQlzdGF0aWMgY2hhciAqa2V5d29yZHNbXSA9IHsiZm9ybWF0IiwgTlVMTH07CisgICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICBQeU9iamVjdCAqdHVwbGU7CisgICAgY29uc3QgY2hhciAqZm9ybWF0OworICAgIFB5X3NzaXplX3QgZm9ybWF0X2xlbjsKKyAgICBzdGF0aWMgY2hhciAqa2V5d29yZHNbXSA9IHsiZm9ybWF0IiwgTlVMTH07CiAKLQlpZiAoISBQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3csICJzIzpzdHJmdGltZSIsIGtleXdvcmRzLAotCQkJCQkgICZmb3JtYXQsICZmb3JtYXRfbGVuKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCEgUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3LCAicyM6c3RyZnRpbWUiLCBrZXl3b3JkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZvcm1hdCwgJmZvcm1hdF9sZW4pKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCS8qIFB5dGhvbidzIHN0cmZ0aW1lIGRvZXMgaW5zYW5lIHRoaW5ncyB3aXRoIHRoZSB5ZWFyIHBhcnQgb2YgdGhlCi0JICogdGltZXR1cGxlLiAgVGhlIHllYXIgaXMgZm9yY2VkIHRvICh0aGUgb3RoZXJ3aXNlIG5vbnNlbnNpY2FsKQotCSAqIDE5MDAgdG8gd29ybSBhcm91bmQgdGhhdC4KLQkgKi8KLQl0dXBsZSA9IFB5X0J1aWxkVmFsdWUoImlpaWlpaWlpaSIsCi0JCSAgICAgICAgICAgICAgMTkwMCwgMSwgMSwgLyogeWVhciwgbW9udGgsIGRheSAqLwotCQkJICAgICAgVElNRV9HRVRfSE9VUihzZWxmKSwKLQkJCSAgICAgIFRJTUVfR0VUX01JTlVURShzZWxmKSwKLQkJCSAgICAgIFRJTUVfR0VUX1NFQ09ORChzZWxmKSwKLQkJCSAgICAgIDAsIDEsIC0xKTsgLyogd2Vla2RheSwgZGF5bnVtLCBkc3QgKi8KLQlpZiAodHVwbGUgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JYXNzZXJ0KFB5VHVwbGVfU2l6ZSh0dXBsZSkgPT0gOSk7Ci0JcmVzdWx0ID0gd3JhcF9zdHJmdGltZSgoUHlPYmplY3QgKilzZWxmLCBmb3JtYXQsIGZvcm1hdF9sZW4sIHR1cGxlLAotCQkJICAgICAgIFB5X05vbmUpOwotCVB5X0RFQ1JFRih0dXBsZSk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICAvKiBQeXRob24ncyBzdHJmdGltZSBkb2VzIGluc2FuZSB0aGluZ3Mgd2l0aCB0aGUgeWVhciBwYXJ0IG9mIHRoZQorICAgICAqIHRpbWV0dXBsZS4gIFRoZSB5ZWFyIGlzIGZvcmNlZCB0byAodGhlIG90aGVyd2lzZSBub25zZW5zaWNhbCkKKyAgICAgKiAxOTAwIHRvIHdvcm0gYXJvdW5kIHRoYXQuCisgICAgICovCisgICAgdHVwbGUgPSBQeV9CdWlsZFZhbHVlKCJpaWlpaWlpaWkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAxOTAwLCAxLCAxLCAvKiB5ZWFyLCBtb250aCwgZGF5ICovCisgICAgICAgICAgICAgICAgICBUSU1FX0dFVF9IT1VSKHNlbGYpLAorICAgICAgICAgICAgICAgICAgVElNRV9HRVRfTUlOVVRFKHNlbGYpLAorICAgICAgICAgICAgICAgICAgVElNRV9HRVRfU0VDT05EKHNlbGYpLAorICAgICAgICAgICAgICAgICAgMCwgMSwgLTEpOyAvKiB3ZWVrZGF5LCBkYXludW0sIGRzdCAqLworICAgIGlmICh0dXBsZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBhc3NlcnQoUHlUdXBsZV9TaXplKHR1cGxlKSA9PSA5KTsKKyAgICByZXN1bHQgPSB3cmFwX3N0cmZ0aW1lKChQeU9iamVjdCAqKXNlbGYsIGZvcm1hdCwgZm9ybWF0X2xlbiwgdHVwbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9Ob25lKTsKKyAgICBQeV9ERUNSRUYodHVwbGUpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIC8qCkBAIC0zMzA5LDE0NiArMzMwOSwxNDYgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiB0aW1lX3JpY2hjb21wYXJlKFB5RGF0ZVRpbWVfVGltZSAqc2VsZiwgUHlPYmplY3QgKm90aGVyLCBpbnQgb3ApCiB7Ci0JaW50IGRpZmY7Ci0JbmFpdmV0eSBuMSwgbjI7Ci0JaW50IG9mZnNldDEsIG9mZnNldDI7CisgICAgaW50IGRpZmY7CisgICAgbmFpdmV0eSBuMSwgbjI7CisgICAgaW50IG9mZnNldDEsIG9mZnNldDI7CiAKLQlpZiAoISBQeVRpbWVfQ2hlY2sob3RoZXIpKSB7Ci0JCWlmIChvcCA9PSBQeV9FUSB8fCBvcCA9PSBQeV9ORSkgewotCQkJUHlPYmplY3QgKnJlc3VsdCA9IG9wID09IFB5X0VRID8gUHlfRmFsc2UgOiBQeV9UcnVlOwotCQkJUHlfSU5DUkVGKHJlc3VsdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCS8qIFN0b3AgdGhpcyBmcm9tIGZhbGxpbmcgYmFjayB0byBhZGRyZXNzIGNvbXBhcmlzb24uICovCi0JCXJldHVybiBjbXBlcnJvcigoUHlPYmplY3QgKilzZWxmLCBvdGhlcik7Ci0JfQotCWlmIChjbGFzc2lmeV90d29fdXRjb2Zmc2V0cygoUHlPYmplY3QgKilzZWxmLCAmb2Zmc2V0MSwgJm4xLCBQeV9Ob25lLAotCQkJCSAgICAgb3RoZXIsICZvZmZzZXQyLCAmbjIsIFB5X05vbmUpIDwgMCkKLQkJcmV0dXJuIE5VTEw7Ci0JYXNzZXJ0KG4xICE9IE9GRlNFVF9VTktOT1dOICYmIG4yICE9IE9GRlNFVF9VTktOT1dOKTsKLQkvKiBJZiB0aGV5J3JlIGJvdGggbmFpdmUsIG9yIGJvdGggYXdhcmUgYW5kIGhhdmUgdGhlIHNhbWUgb2Zmc2V0cywKLQkgKiB3ZSBnZXQgb2ZmIGNoZWFwLiAgTm90ZSB0aGF0IGlmIHRoZXkncmUgYm90aCBuYWl2ZSwgb2Zmc2V0MSA9PQotCSAqIG9mZnNldDIgPT0gMCBhdCB0aGlzIHBvaW50LgotCSAqLwotCWlmIChuMSA9PSBuMiAmJiBvZmZzZXQxID09IG9mZnNldDIpIHsKLQkJZGlmZiA9IG1lbWNtcChzZWxmLT5kYXRhLCAoKFB5RGF0ZVRpbWVfVGltZSAqKW90aGVyKS0+ZGF0YSwKLQkJCSAgICAgIF9QeURhdGVUaW1lX1RJTUVfREFUQVNJWkUpOwotCQlyZXR1cm4gZGlmZl90b19ib29sKGRpZmYsIG9wKTsKLQl9CisgICAgaWYgKCEgUHlUaW1lX0NoZWNrKG90aGVyKSkgeworICAgICAgICBpZiAob3AgPT0gUHlfRVEgfHwgb3AgPT0gUHlfTkUpIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBvcCA9PSBQeV9FUSA/IFB5X0ZhbHNlIDogUHlfVHJ1ZTsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihyZXN1bHQpOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICAvKiBTdG9wIHRoaXMgZnJvbSBmYWxsaW5nIGJhY2sgdG8gYWRkcmVzcyBjb21wYXJpc29uLiAqLworICAgICAgICByZXR1cm4gY21wZXJyb3IoKFB5T2JqZWN0ICopc2VsZiwgb3RoZXIpOworICAgIH0KKyAgICBpZiAoY2xhc3NpZnlfdHdvX3V0Y29mZnNldHMoKFB5T2JqZWN0ICopc2VsZiwgJm9mZnNldDEsICZuMSwgUHlfTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyLCAmb2Zmc2V0MiwgJm4yLCBQeV9Ob25lKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGFzc2VydChuMSAhPSBPRkZTRVRfVU5LTk9XTiAmJiBuMiAhPSBPRkZTRVRfVU5LTk9XTik7CisgICAgLyogSWYgdGhleSdyZSBib3RoIG5haXZlLCBvciBib3RoIGF3YXJlIGFuZCBoYXZlIHRoZSBzYW1lIG9mZnNldHMsCisgICAgICogd2UgZ2V0IG9mZiBjaGVhcC4gIE5vdGUgdGhhdCBpZiB0aGV5J3JlIGJvdGggbmFpdmUsIG9mZnNldDEgPT0KKyAgICAgKiBvZmZzZXQyID09IDAgYXQgdGhpcyBwb2ludC4KKyAgICAgKi8KKyAgICBpZiAobjEgPT0gbjIgJiYgb2Zmc2V0MSA9PSBvZmZzZXQyKSB7CisgICAgICAgIGRpZmYgPSBtZW1jbXAoc2VsZi0+ZGF0YSwgKChQeURhdGVUaW1lX1RpbWUgKilvdGhlciktPmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgX1B5RGF0ZVRpbWVfVElNRV9EQVRBU0laRSk7CisgICAgICAgIHJldHVybiBkaWZmX3RvX2Jvb2woZGlmZiwgb3ApOworICAgIH0KIAotCWlmIChuMSA9PSBPRkZTRVRfQVdBUkUgJiYgbjIgPT0gT0ZGU0VUX0FXQVJFKSB7Ci0JCWFzc2VydChvZmZzZXQxICE9IG9mZnNldDIpOwkvKiBlbHNlIGxhc3QgImlmIiBoYW5kbGVkIGl0ICovCi0JCS8qIENvbnZlcnQgZXZlcnl0aGluZyBleGNlcHQgbWljcm9zZWNvbmRzIHRvIHNlY29uZHMuICBUaGVzZQotCQkgKiBjYW4ndCBvdmVyZmxvdyAobm8gbW9yZSB0aGFuIHRoZSAjIG9mIHNlY29uZHMgaW4gMiBkYXlzKS4KLQkJICovCi0JCW9mZnNldDEgPSBUSU1FX0dFVF9IT1VSKHNlbGYpICogMzYwMCArCi0JCQkgIChUSU1FX0dFVF9NSU5VVEUoc2VsZikgLSBvZmZzZXQxKSAqIDYwICsKLQkJCSAgVElNRV9HRVRfU0VDT05EKHNlbGYpOwotCQlvZmZzZXQyID0gVElNRV9HRVRfSE9VUihvdGhlcikgKiAzNjAwICsKLQkJCSAgKFRJTUVfR0VUX01JTlVURShvdGhlcikgLSBvZmZzZXQyKSAqIDYwICsKLQkJCSAgVElNRV9HRVRfU0VDT05EKG90aGVyKTsKLQkJZGlmZiA9IG9mZnNldDEgLSBvZmZzZXQyOwotCQlpZiAoZGlmZiA9PSAwKQotCQkJZGlmZiA9IFRJTUVfR0VUX01JQ1JPU0VDT05EKHNlbGYpIC0KLQkJCSAgICAgICBUSU1FX0dFVF9NSUNST1NFQ09ORChvdGhlcik7Ci0JCXJldHVybiBkaWZmX3RvX2Jvb2woZGlmZiwgb3ApOwotCX0KKyAgICBpZiAobjEgPT0gT0ZGU0VUX0FXQVJFICYmIG4yID09IE9GRlNFVF9BV0FSRSkgeworICAgICAgICBhc3NlcnQob2Zmc2V0MSAhPSBvZmZzZXQyKTsgICAgICAgICAgICAgLyogZWxzZSBsYXN0ICJpZiIgaGFuZGxlZCBpdCAqLworICAgICAgICAvKiBDb252ZXJ0IGV2ZXJ5dGhpbmcgZXhjZXB0IG1pY3Jvc2Vjb25kcyB0byBzZWNvbmRzLiAgVGhlc2UKKyAgICAgICAgICogY2FuJ3Qgb3ZlcmZsb3cgKG5vIG1vcmUgdGhhbiB0aGUgIyBvZiBzZWNvbmRzIGluIDIgZGF5cykuCisgICAgICAgICAqLworICAgICAgICBvZmZzZXQxID0gVElNRV9HRVRfSE9VUihzZWxmKSAqIDM2MDAgKworICAgICAgICAgICAgICAgICAgKFRJTUVfR0VUX01JTlVURShzZWxmKSAtIG9mZnNldDEpICogNjAgKworICAgICAgICAgICAgICAgICAgVElNRV9HRVRfU0VDT05EKHNlbGYpOworICAgICAgICBvZmZzZXQyID0gVElNRV9HRVRfSE9VUihvdGhlcikgKiAzNjAwICsKKyAgICAgICAgICAgICAgICAgIChUSU1FX0dFVF9NSU5VVEUob3RoZXIpIC0gb2Zmc2V0MikgKiA2MCArCisgICAgICAgICAgICAgICAgICBUSU1FX0dFVF9TRUNPTkQob3RoZXIpOworICAgICAgICBkaWZmID0gb2Zmc2V0MSAtIG9mZnNldDI7CisgICAgICAgIGlmIChkaWZmID09IDApCisgICAgICAgICAgICBkaWZmID0gVElNRV9HRVRfTUlDUk9TRUNPTkQoc2VsZikgLQorICAgICAgICAgICAgICAgICAgIFRJTUVfR0VUX01JQ1JPU0VDT05EKG90aGVyKTsKKyAgICAgICAgcmV0dXJuIGRpZmZfdG9fYm9vbChkaWZmLCBvcCk7CisgICAgfQogCi0JYXNzZXJ0KG4xICE9IG4yKTsKLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJImNhbid0IGNvbXBhcmUgb2Zmc2V0LW5haXZlIGFuZCAiCi0JCQkib2Zmc2V0LWF3YXJlIHRpbWVzIik7Ci0JcmV0dXJuIE5VTEw7CisgICAgYXNzZXJ0KG4xICE9IG4yKTsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAiY2FuJ3QgY29tcGFyZSBvZmZzZXQtbmFpdmUgYW5kICIKKyAgICAgICAgICAgICAgICAgICAgIm9mZnNldC1hd2FyZSB0aW1lcyIpOworICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgbG9uZwogdGltZV9oYXNoKFB5RGF0ZVRpbWVfVGltZSAqc2VsZikKIHsKLQlpZiAoc2VsZi0+aGFzaGNvZGUgPT0gLTEpIHsKLQkJbmFpdmV0eSBuOwotCQlpbnQgb2Zmc2V0OwotCQlQeU9iamVjdCAqdGVtcDsKKyAgICBpZiAoc2VsZi0+aGFzaGNvZGUgPT0gLTEpIHsKKyAgICAgICAgbmFpdmV0eSBuOworICAgICAgICBpbnQgb2Zmc2V0OworICAgICAgICBQeU9iamVjdCAqdGVtcDsKIAotCQluID0gY2xhc3NpZnlfdXRjb2Zmc2V0KChQeU9iamVjdCAqKXNlbGYsIFB5X05vbmUsICZvZmZzZXQpOwotCQlhc3NlcnQobiAhPSBPRkZTRVRfVU5LTk9XTik7Ci0JCWlmIChuID09IE9GRlNFVF9FUlJPUikKLQkJCXJldHVybiAtMTsKKyAgICAgICAgbiA9IGNsYXNzaWZ5X3V0Y29mZnNldCgoUHlPYmplY3QgKilzZWxmLCBQeV9Ob25lLCAmb2Zmc2V0KTsKKyAgICAgICAgYXNzZXJ0KG4gIT0gT0ZGU0VUX1VOS05PV04pOworICAgICAgICBpZiAobiA9PSBPRkZTRVRfRVJST1IpCisgICAgICAgICAgICByZXR1cm4gLTE7CiAKLQkJLyogUmVkdWNlIHRoaXMgdG8gYSBoYXNoIG9mIGFub3RoZXIgb2JqZWN0LiAqLwotCQlpZiAob2Zmc2V0ID09IDApCi0JCQl0ZW1wID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilzZWxmLT5kYXRhLAotCQkJCQkJX1B5RGF0ZVRpbWVfVElNRV9EQVRBU0laRSk7Ci0JCWVsc2UgewotCQkJaW50IGhvdXI7Ci0JCQlpbnQgbWludXRlOworICAgICAgICAvKiBSZWR1Y2UgdGhpcyB0byBhIGhhc2ggb2YgYW5vdGhlciBvYmplY3QuICovCisgICAgICAgIGlmIChvZmZzZXQgPT0gMCkKKyAgICAgICAgICAgIHRlbXAgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKXNlbGYtPmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUHlEYXRlVGltZV9USU1FX0RBVEFTSVpFKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpbnQgaG91cjsKKyAgICAgICAgICAgIGludCBtaW51dGU7CiAKLQkJCWFzc2VydChuID09IE9GRlNFVF9BV0FSRSk7Ci0JCQlhc3NlcnQoSEFTVFpJTkZPKHNlbGYpKTsKLQkJCWhvdXIgPSBkaXZtb2QoVElNRV9HRVRfSE9VUihzZWxmKSAqIDYwICsKLQkJCQkJVElNRV9HRVRfTUlOVVRFKHNlbGYpIC0gb2Zmc2V0LAotCQkJCSAgICAgIDYwLAotCQkJCSAgICAgICZtaW51dGUpOwotCQkJaWYgKDAgPD0gaG91ciAmJiBob3VyIDwgMjQpCi0JCQkJdGVtcCA9IG5ld190aW1lKGhvdXIsIG1pbnV0ZSwKLQkJCQkJCVRJTUVfR0VUX1NFQ09ORChzZWxmKSwKLQkJCQkJCVRJTUVfR0VUX01JQ1JPU0VDT05EKHNlbGYpLAotCQkJCQkJUHlfTm9uZSk7Ci0JCQllbHNlCi0JCQkJdGVtcCA9IFB5X0J1aWxkVmFsdWUoImlpaWkiLAotCQkJCQkgICBob3VyLCBtaW51dGUsCi0JCQkJCSAgIFRJTUVfR0VUX1NFQ09ORChzZWxmKSwKLQkJCQkJICAgVElNRV9HRVRfTUlDUk9TRUNPTkQoc2VsZikpOwotCQl9Ci0JCWlmICh0ZW1wICE9IE5VTEwpIHsKLQkJCXNlbGYtPmhhc2hjb2RlID0gUHlPYmplY3RfSGFzaCh0ZW1wKTsKLQkJCVB5X0RFQ1JFRih0ZW1wKTsKLQkJfQotCX0KLQlyZXR1cm4gc2VsZi0+aGFzaGNvZGU7CisgICAgICAgICAgICBhc3NlcnQobiA9PSBPRkZTRVRfQVdBUkUpOworICAgICAgICAgICAgYXNzZXJ0KEhBU1RaSU5GTyhzZWxmKSk7CisgICAgICAgICAgICBob3VyID0gZGl2bW9kKFRJTUVfR0VUX0hPVVIoc2VsZikgKiA2MCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNRV9HRVRfTUlOVVRFKHNlbGYpIC0gb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICA2MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1pbnV0ZSk7CisgICAgICAgICAgICBpZiAoMCA8PSBob3VyICYmIGhvdXIgPCAyNCkKKyAgICAgICAgICAgICAgICB0ZW1wID0gbmV3X3RpbWUoaG91ciwgbWludXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1FX0dFVF9TRUNPTkQoc2VsZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTUVfR0VUX01JQ1JPU0VDT05EKHNlbGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9Ob25lKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB0ZW1wID0gUHlfQnVpbGRWYWx1ZSgiaWlpaSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBob3VyLCBtaW51dGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1FX0dFVF9TRUNPTkQoc2VsZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1FX0dFVF9NSUNST1NFQ09ORChzZWxmKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRlbXAgIT0gTlVMTCkgeworICAgICAgICAgICAgc2VsZi0+aGFzaGNvZGUgPSBQeU9iamVjdF9IYXNoKHRlbXApOworICAgICAgICAgICAgUHlfREVDUkVGKHRlbXApOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBzZWxmLT5oYXNoY29kZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHRpbWVfcmVwbGFjZShQeURhdGVUaW1lX1RpbWUgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3cpCiB7Ci0JUHlPYmplY3QgKmNsb25lOwotCVB5T2JqZWN0ICp0dXBsZTsKLQlpbnQgaGggPSBUSU1FX0dFVF9IT1VSKHNlbGYpOwotCWludCBtbSA9IFRJTUVfR0VUX01JTlVURShzZWxmKTsKLQlpbnQgc3MgPSBUSU1FX0dFVF9TRUNPTkQoc2VsZik7Ci0JaW50IHVzID0gVElNRV9HRVRfTUlDUk9TRUNPTkQoc2VsZik7Ci0JUHlPYmplY3QgKnR6aW5mbyA9IEhBU1RaSU5GTyhzZWxmKSA/IHNlbGYtPnR6aW5mbyA6IFB5X05vbmU7CisgICAgUHlPYmplY3QgKmNsb25lOworICAgIFB5T2JqZWN0ICp0dXBsZTsKKyAgICBpbnQgaGggPSBUSU1FX0dFVF9IT1VSKHNlbGYpOworICAgIGludCBtbSA9IFRJTUVfR0VUX01JTlVURShzZWxmKTsKKyAgICBpbnQgc3MgPSBUSU1FX0dFVF9TRUNPTkQoc2VsZik7CisgICAgaW50IHVzID0gVElNRV9HRVRfTUlDUk9TRUNPTkQoc2VsZik7CisgICAgUHlPYmplY3QgKnR6aW5mbyA9IEhBU1RaSU5GTyhzZWxmKSA/IHNlbGYtPnR6aW5mbyA6IFB5X05vbmU7CiAKLQlpZiAoISBQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3csICJ8aWlpaU86cmVwbGFjZSIsCi0JCQkJCSAgdGltZV9rd3MsCi0JCQkJCSAgJmhoLCAmbW0sICZzcywgJnVzLCAmdHppbmZvKSkKLQkJcmV0dXJuIE5VTEw7Ci0JdHVwbGUgPSBQeV9CdWlsZFZhbHVlKCJpaWlpTyIsIGhoLCBtbSwgc3MsIHVzLCB0emluZm8pOwotCWlmICh0dXBsZSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQljbG9uZSA9IHRpbWVfbmV3KFB5X1RZUEUoc2VsZiksIHR1cGxlLCBOVUxMKTsKLQlQeV9ERUNSRUYodHVwbGUpOwotCXJldHVybiBjbG9uZTsKKyAgICBpZiAoISBQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3csICJ8aWlpaU86cmVwbGFjZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVfa3dzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaGgsICZtbSwgJnNzLCAmdXMsICZ0emluZm8pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB0dXBsZSA9IFB5X0J1aWxkVmFsdWUoImlpaWlPIiwgaGgsIG1tLCBzcywgdXMsIHR6aW5mbyk7CisgICAgaWYgKHR1cGxlID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGNsb25lID0gdGltZV9uZXcoUHlfVFlQRShzZWxmKSwgdHVwbGUsIE5VTEwpOworICAgIFB5X0RFQ1JFRih0dXBsZSk7CisgICAgcmV0dXJuIGNsb25lOwogfQogCiBzdGF0aWMgaW50CiB0aW1lX25vbnplcm8oUHlEYXRlVGltZV9UaW1lICpzZWxmKQogewotCWludCBvZmZzZXQ7Ci0JaW50IG5vbmU7CisgICAgaW50IG9mZnNldDsKKyAgICBpbnQgbm9uZTsKIAotCWlmIChUSU1FX0dFVF9TRUNPTkQoc2VsZikgfHwgVElNRV9HRVRfTUlDUk9TRUNPTkQoc2VsZikpIHsKLQkJLyogU2luY2UgdXRjb2Zmc2V0IGlzIGluIHdob2xlIG1pbnV0ZXMsIG5vdGhpbmcgY2FuCi0JCSAqIGFsdGVyIHRoZSBjb25jbHVzaW9uIHRoYXQgdGhpcyBpcyBub256ZXJvLgotCQkgKi8KLQkJcmV0dXJuIDE7Ci0JfQotCW9mZnNldCA9IDA7Ci0JaWYgKEhBU1RaSU5GTyhzZWxmKSAmJiBzZWxmLT50emluZm8gIT0gUHlfTm9uZSkgewotCQlvZmZzZXQgPSBjYWxsX3V0Y29mZnNldChzZWxmLT50emluZm8sIFB5X05vbmUsICZub25lKTsKLQkJaWYgKG9mZnNldCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIC0xOwotCX0KLQlyZXR1cm4gKFRJTUVfR0VUX01JTlVURShzZWxmKSAtIG9mZnNldCArIFRJTUVfR0VUX0hPVVIoc2VsZikqNjApICE9IDA7CisgICAgaWYgKFRJTUVfR0VUX1NFQ09ORChzZWxmKSB8fCBUSU1FX0dFVF9NSUNST1NFQ09ORChzZWxmKSkgeworICAgICAgICAvKiBTaW5jZSB1dGNvZmZzZXQgaXMgaW4gd2hvbGUgbWludXRlcywgbm90aGluZyBjYW4KKyAgICAgICAgICogYWx0ZXIgdGhlIGNvbmNsdXNpb24gdGhhdCB0aGlzIGlzIG5vbnplcm8uCisgICAgICAgICAqLworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgb2Zmc2V0ID0gMDsKKyAgICBpZiAoSEFTVFpJTkZPKHNlbGYpICYmIHNlbGYtPnR6aW5mbyAhPSBQeV9Ob25lKSB7CisgICAgICAgIG9mZnNldCA9IGNhbGxfdXRjb2Zmc2V0KHNlbGYtPnR6aW5mbywgUHlfTm9uZSwgJm5vbmUpOworICAgICAgICBpZiAob2Zmc2V0ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiAoVElNRV9HRVRfTUlOVVRFKHNlbGYpIC0gb2Zmc2V0ICsgVElNRV9HRVRfSE9VUihzZWxmKSo2MCkgIT0gMDsKIH0KIAogLyogUGlja2xlIHN1cHBvcnQsIGEgc2ltcGxlIHVzZSBvZiBfX3JlZHVjZV9fLiAqLwpAQCAtMzQ2MSw1NSArMzQ2MSw1NSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHRpbWVfZ2V0c3RhdGUoUHlEYXRlVGltZV9UaW1lICpzZWxmKQogewotCVB5T2JqZWN0ICpiYXNlc3RhdGU7Ci0JUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7CisgICAgUHlPYmplY3QgKmJhc2VzdGF0ZTsKKyAgICBQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKIAotCWJhc2VzdGF0ZSA9ICBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKXNlbGYtPmRhdGEsCi0JCQkJCQlfUHlEYXRlVGltZV9USU1FX0RBVEFTSVpFKTsKLQlpZiAoYmFzZXN0YXRlICE9IE5VTEwpIHsKLQkJaWYgKCEgSEFTVFpJTkZPKHNlbGYpIHx8IHNlbGYtPnR6aW5mbyA9PSBQeV9Ob25lKQotCQkJcmVzdWx0ID0gUHlUdXBsZV9QYWNrKDEsIGJhc2VzdGF0ZSk7Ci0JCWVsc2UKLQkJCXJlc3VsdCA9IFB5VHVwbGVfUGFjaygyLCBiYXNlc3RhdGUsIHNlbGYtPnR6aW5mbyk7Ci0JCVB5X0RFQ1JFRihiYXNlc3RhdGUpOwotCX0KLQlyZXR1cm4gcmVzdWx0OworICAgIGJhc2VzdGF0ZSA9ICBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKXNlbGYtPmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9QeURhdGVUaW1lX1RJTUVfREFUQVNJWkUpOworICAgIGlmIChiYXNlc3RhdGUgIT0gTlVMTCkgeworICAgICAgICBpZiAoISBIQVNUWklORk8oc2VsZikgfHwgc2VsZi0+dHppbmZvID09IFB5X05vbmUpCisgICAgICAgICAgICByZXN1bHQgPSBQeVR1cGxlX1BhY2soMSwgYmFzZXN0YXRlKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmVzdWx0ID0gUHlUdXBsZV9QYWNrKDIsIGJhc2VzdGF0ZSwgc2VsZi0+dHppbmZvKTsKKyAgICAgICAgUHlfREVDUkVGKGJhc2VzdGF0ZSk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB0aW1lX3JlZHVjZShQeURhdGVUaW1lX1RpbWUgKnNlbGYsIFB5T2JqZWN0ICphcmcpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihPTikiLCBQeV9UWVBFKHNlbGYpLCB0aW1lX2dldHN0YXRlKHNlbGYpKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKE9OKSIsIFB5X1RZUEUoc2VsZiksIHRpbWVfZ2V0c3RhdGUoc2VsZikpOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgdGltZV9tZXRob2RzW10gPSB7CiAKLQl7Imlzb2Zvcm1hdCIsICAgKFB5Q0Z1bmN0aW9uKXRpbWVfaXNvZm9ybWF0LAlNRVRIX05PQVJHUywKLQkgUHlEb2NfU1RSKCJSZXR1cm4gc3RyaW5nIGluIElTTyA4NjAxIGZvcm1hdCwgSEg6TU06U1NbLm1tbW1tbV0iCi0JIAkgICAiWytISDpNTV0uIil9LAorICAgIHsiaXNvZm9ybWF0IiwgICAoUHlDRnVuY3Rpb24pdGltZV9pc29mb3JtYXQsICAgICAgICBNRVRIX05PQVJHUywKKyAgICAgUHlEb2NfU1RSKCJSZXR1cm4gc3RyaW5nIGluIElTTyA4NjAxIGZvcm1hdCwgSEg6TU06U1NbLm1tbW1tbV0iCisgICAgICAgICAgICAgICAiWytISDpNTV0uIil9LAogCi0JeyJzdHJmdGltZSIsICAgCShQeUNGdW5jdGlvbil0aW1lX3N0cmZ0aW1lLAlNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLAotCSBQeURvY19TVFIoImZvcm1hdCAtPiBzdHJmdGltZSgpIHN0eWxlIHN0cmluZy4iKX0sCisgICAgeyJzdHJmdGltZSIsICAgICAgICAoUHlDRnVuY3Rpb24pdGltZV9zdHJmdGltZSwgICAgIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsCisgICAgIFB5RG9jX1NUUigiZm9ybWF0IC0+IHN0cmZ0aW1lKCkgc3R5bGUgc3RyaW5nLiIpfSwKIAotCXsiX19mb3JtYXRfXyIsIAkoUHlDRnVuY3Rpb24pZGF0ZV9mb3JtYXQsCU1FVEhfVkFSQVJHUywKLQkgUHlEb2NfU1RSKCJGb3JtYXRzIHNlbGYgd2l0aCBzdHJmdGltZS4iKX0sCisgICAgeyJfX2Zvcm1hdF9fIiwgICAgICAoUHlDRnVuY3Rpb24pZGF0ZV9mb3JtYXQsICAgICAgIE1FVEhfVkFSQVJHUywKKyAgICAgUHlEb2NfU1RSKCJGb3JtYXRzIHNlbGYgd2l0aCBzdHJmdGltZS4iKX0sCiAKLQl7InV0Y29mZnNldCIsCShQeUNGdW5jdGlvbil0aW1lX3V0Y29mZnNldCwJTUVUSF9OT0FSR1MsCi0JIFB5RG9jX1NUUigiUmV0dXJuIHNlbGYudHppbmZvLnV0Y29mZnNldChzZWxmKS4iKX0sCisgICAgeyJ1dGNvZmZzZXQiLCAgICAgICAoUHlDRnVuY3Rpb24pdGltZV91dGNvZmZzZXQsICAgIE1FVEhfTk9BUkdTLAorICAgICBQeURvY19TVFIoIlJldHVybiBzZWxmLnR6aW5mby51dGNvZmZzZXQoc2VsZikuIil9LAogCi0JeyJ0em5hbWUiLAkoUHlDRnVuY3Rpb24pdGltZV90em5hbWUsCU1FVEhfTk9BUkdTLAotCSBQeURvY19TVFIoIlJldHVybiBzZWxmLnR6aW5mby50em5hbWUoc2VsZikuIil9LAorICAgIHsidHpuYW1lIiwgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXRpbWVfdHpuYW1lLCAgICAgICBNRVRIX05PQVJHUywKKyAgICAgUHlEb2NfU1RSKCJSZXR1cm4gc2VsZi50emluZm8udHpuYW1lKHNlbGYpLiIpfSwKIAotCXsiZHN0IiwJCShQeUNGdW5jdGlvbil0aW1lX2RzdCwJCU1FVEhfTk9BUkdTLAotCSBQeURvY19TVFIoIlJldHVybiBzZWxmLnR6aW5mby5kc3Qoc2VsZikuIil9LAorICAgIHsiZHN0IiwgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXRpbWVfZHN0LCAgICAgICAgICBNRVRIX05PQVJHUywKKyAgICAgUHlEb2NfU1RSKCJSZXR1cm4gc2VsZi50emluZm8uZHN0KHNlbGYpLiIpfSwKIAotCXsicmVwbGFjZSIsICAgICAoUHlDRnVuY3Rpb24pdGltZV9yZXBsYWNlLAlNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLAotCSBQeURvY19TVFIoIlJldHVybiB0aW1lIHdpdGggbmV3IHNwZWNpZmllZCBmaWVsZHMuIil9LAorICAgIHsicmVwbGFjZSIsICAgICAoUHlDRnVuY3Rpb24pdGltZV9yZXBsYWNlLCAgICAgICAgICBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLAorICAgICBQeURvY19TVFIoIlJldHVybiB0aW1lIHdpdGggbmV3IHNwZWNpZmllZCBmaWVsZHMuIil9LAogCi0JeyJfX3JlZHVjZV9fIiwgKFB5Q0Z1bmN0aW9uKXRpbWVfcmVkdWNlLCAgICAgICAgTUVUSF9OT0FSR1MsCi0JIFB5RG9jX1NUUigiX19yZWR1Y2VfXygpIC0+IChjbHMsIHN0YXRlKSIpfSwKKyAgICB7Il9fcmVkdWNlX18iLCAoUHlDRnVuY3Rpb24pdGltZV9yZWR1Y2UsICAgICAgICBNRVRIX05PQVJHUywKKyAgICAgUHlEb2NfU1RSKCJfX3JlZHVjZV9fKCkgLT4gKGNscywgc3RhdGUpIil9LAogCi0Je05VTEwsCU5VTEx9CisgICAge05VTEwsICAgICAgTlVMTH0KIH07CiAKIHN0YXRpYyBjaGFyIHRpbWVfZG9jW10gPQpAQCAtMzUxOSw2MSArMzUxOSw2MSBAQAogYSB0emluZm8gc3ViY2xhc3MuIFRoZSByZW1haW5pbmcgYXJndW1lbnRzIG1heSBiZSBpbnRzIG9yIGxvbmdzLlxuIik7CiAKIHN0YXRpYyBQeU51bWJlck1ldGhvZHMgdGltZV9hc19udW1iZXIgPSB7Ci0JMCwJCQkJCS8qIG5iX2FkZCAqLwotCTAsCQkJCQkvKiBuYl9zdWJ0cmFjdCAqLwotCTAsCQkJCQkvKiBuYl9tdWx0aXBseSAqLwotCTAsCQkJCQkvKiBuYl9kaXZpZGUgKi8KLQkwLAkJCQkJLyogbmJfcmVtYWluZGVyICovCi0JMCwJCQkJCS8qIG5iX2Rpdm1vZCAqLwotCTAsCQkJCQkvKiBuYl9wb3dlciAqLwotCTAsCQkJCQkvKiBuYl9uZWdhdGl2ZSAqLwotCTAsCQkJCQkvKiBuYl9wb3NpdGl2ZSAqLwotCTAsCQkJCQkvKiBuYl9hYnNvbHV0ZSAqLwotCShpbnF1aXJ5KXRpbWVfbm9uemVybywJCQkvKiBuYl9ub256ZXJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9hZGQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX3N1YnRyYWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9tdWx0aXBseSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfZGl2aWRlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9yZW1haW5kZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2Rpdm1vZCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfcG93ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX25lZ2F0aXZlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9wb3NpdGl2ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfYWJzb2x1dGUgKi8KKyAgICAoaW5xdWlyeSl0aW1lX25vbnplcm8sICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX25vbnplcm8gKi8KIH07CiAKIHN0YXRpY2hlcmUgUHlUeXBlT2JqZWN0IFB5RGF0ZVRpbWVfVGltZVR5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCi0JMCwJCQkJCS8qIG9iX3NpemUgKi8KLQkiZGF0ZXRpbWUudGltZSIsCQkJLyogdHBfbmFtZSAqLwotCXNpemVvZihQeURhdGVUaW1lX1RpbWUpLAkJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJCS8qIHRwX2l0ZW1zaXplICovCi0JKGRlc3RydWN0b3IpdGltZV9kZWFsbG9jLAkJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfY29tcGFyZSAqLwotCShyZXByZnVuYyl0aW1lX3JlcHIsCQkJLyogdHBfcmVwciAqLwotCSZ0aW1lX2FzX251bWJlciwJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYyl0aW1lX2hhc2gsCQkJLyogdHBfaGFzaCAqLwotCTAsICAgICAgICAgICAgICAJCQkvKiB0cF9jYWxsICovCi0JKHJlcHJmdW5jKXRpbWVfc3RyLAkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19DSEVDS1RZUEVTIHwKLSAgICAgICAgUHlfVFBGTEFHU19CQVNFVFlQRSwJCQkvKiB0cF9mbGFncyAqLwotCXRpbWVfZG9jLAkJCQkvKiB0cF9kb2MgKi8KLQkwLAkJCQkJLyogdHBfdHJhdmVyc2UgKi8KLQkwLAkJCQkJLyogdHBfY2xlYXIgKi8KLQkocmljaGNtcGZ1bmMpdGltZV9yaWNoY29tcGFyZSwJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkJLyogdHBfaXRlcm5leHQgKi8KLQl0aW1lX21ldGhvZHMsCQkJCS8qIHRwX21ldGhvZHMgKi8KLQkwLAkJCQkJLyogdHBfbWVtYmVycyAqLwotCXRpbWVfZ2V0c2V0LAkJCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCQkvKiB0cF9kaWN0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KLQkwLAkJCQkJLyogdHBfZGljdG9mZnNldCAqLwotCTAsCQkJCQkvKiB0cF9pbml0ICovCi0JdGltZV9hbGxvYywJCQkJLyogdHBfYWxsb2MgKi8KLQl0aW1lX25ldywJCQkJLyogdHBfbmV3ICovCi0JMCwJCQkJCS8qIHRwX2ZyZWUgKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9iX3NpemUgKi8KKyAgICAiZGF0ZXRpbWUudGltZSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICBzaXplb2YoUHlEYXRlVGltZV9UaW1lKSwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAoZGVzdHJ1Y3Rvcil0aW1lX2RlYWxsb2MsICAgICAgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgKHJlcHJmdW5jKXRpbWVfcmVwciwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgJnRpbWVfYXNfbnVtYmVyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKXRpbWVfaGFzaCwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgKHJlcHJmdW5jKXRpbWVfc3RyLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19DSEVDS1RZUEVTIHwKKyAgICBQeV9UUEZMQUdTX0JBU0VUWVBFLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCisgICAgdGltZV9kb2MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIChyaWNoY21wZnVuYyl0aW1lX3JpY2hjb21wYXJlLCAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIHRpbWVfbWV0aG9kcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIHRpbWVfZ2V0c2V0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIHRpbWVfYWxsb2MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICB0aW1lX25ldywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKIAogLyoKQEAgLTM1ODcsNDIgKzM1ODcsNDIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBkYXRldGltZV9ob3VyKFB5RGF0ZVRpbWVfRGF0ZVRpbWUgKnNlbGYsIHZvaWQgKnVudXNlZCkKIHsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoREFURV9HRVRfSE9VUihzZWxmKSk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKERBVEVfR0VUX0hPVVIoc2VsZikpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZGF0ZXRpbWVfbWludXRlKFB5RGF0ZVRpbWVfRGF0ZVRpbWUgKnNlbGYsIHZvaWQgKnVudXNlZCkKIHsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoREFURV9HRVRfTUlOVVRFKHNlbGYpKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoREFURV9HRVRfTUlOVVRFKHNlbGYpKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRhdGV0aW1lX3NlY29uZChQeURhdGVUaW1lX0RhdGVUaW1lICpzZWxmLCB2b2lkICp1bnVzZWQpCiB7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKERBVEVfR0VUX1NFQ09ORChzZWxmKSk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKERBVEVfR0VUX1NFQ09ORChzZWxmKSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkYXRldGltZV9taWNyb3NlY29uZChQeURhdGVUaW1lX0RhdGVUaW1lICpzZWxmLCB2b2lkICp1bnVzZWQpCiB7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKERBVEVfR0VUX01JQ1JPU0VDT05EKHNlbGYpKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoREFURV9HRVRfTUlDUk9TRUNPTkQoc2VsZikpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZGF0ZXRpbWVfdHppbmZvKFB5RGF0ZVRpbWVfRGF0ZVRpbWUgKnNlbGYsIHZvaWQgKnVudXNlZCkKIHsKLQlQeU9iamVjdCAqcmVzdWx0ID0gSEFTVFpJTkZPKHNlbGYpID8gc2VsZi0+dHppbmZvIDogUHlfTm9uZTsKLQlQeV9JTkNSRUYocmVzdWx0KTsKLQlyZXR1cm4gcmVzdWx0OworICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBIQVNUWklORk8oc2VsZikgPyBzZWxmLT50emluZm8gOiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihyZXN1bHQpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBQeUdldFNldERlZiBkYXRldGltZV9nZXRzZXRbXSA9IHsKLQl7ImhvdXIiLCAgICAgICAgKGdldHRlcilkYXRldGltZV9ob3VyfSwKLQl7Im1pbnV0ZSIsICAgICAgKGdldHRlcilkYXRldGltZV9taW51dGV9LAotCXsic2Vjb25kIiwgICAgICAoZ2V0dGVyKWRhdGV0aW1lX3NlY29uZH0sCi0JeyJtaWNyb3NlY29uZCIsIChnZXR0ZXIpZGF0ZXRpbWVfbWljcm9zZWNvbmR9LAotCXsidHppbmZvIiwJKGdldHRlcilkYXRldGltZV90emluZm99LAotCXtOVUxMfQorICAgIHsiaG91ciIsICAgICAgICAoZ2V0dGVyKWRhdGV0aW1lX2hvdXJ9LAorICAgIHsibWludXRlIiwgICAgICAoZ2V0dGVyKWRhdGV0aW1lX21pbnV0ZX0sCisgICAgeyJzZWNvbmQiLCAgICAgIChnZXR0ZXIpZGF0ZXRpbWVfc2Vjb25kfSwKKyAgICB7Im1pY3Jvc2Vjb25kIiwgKGdldHRlcilkYXRldGltZV9taWNyb3NlY29uZH0sCisgICAgeyJ0emluZm8iLCAgICAgICAgICAoZ2V0dGVyKWRhdGV0aW1lX3R6aW5mb30sCisgICAge05VTEx9CiB9OwogCiAvKgpAQCAtMzYzMCw3MiArMzYzMCw3MiBAQAogICovCiAKIHN0YXRpYyBjaGFyICpkYXRldGltZV9rd3NbXSA9IHsKLQkieWVhciIsICJtb250aCIsICJkYXkiLCAiaG91ciIsICJtaW51dGUiLCAic2Vjb25kIiwKLQkibWljcm9zZWNvbmQiLCAidHppbmZvIiwgTlVMTAorICAgICJ5ZWFyIiwgIm1vbnRoIiwgImRheSIsICJob3VyIiwgIm1pbnV0ZSIsICJzZWNvbmQiLAorICAgICJtaWNyb3NlY29uZCIsICJ0emluZm8iLCBOVUxMCiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKgogZGF0ZXRpbWVfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprdykKIHsKLQlQeU9iamVjdCAqc2VsZiA9IE5VTEw7Ci0JUHlPYmplY3QgKnN0YXRlOwotCWludCB5ZWFyOwotCWludCBtb250aDsKLQlpbnQgZGF5OwotCWludCBob3VyID0gMDsKLQlpbnQgbWludXRlID0gMDsKLQlpbnQgc2Vjb25kID0gMDsKLQlpbnQgdXNlY29uZCA9IDA7Ci0JUHlPYmplY3QgKnR6aW5mbyA9IFB5X05vbmU7CisgICAgUHlPYmplY3QgKnNlbGYgPSBOVUxMOworICAgIFB5T2JqZWN0ICpzdGF0ZTsKKyAgICBpbnQgeWVhcjsKKyAgICBpbnQgbW9udGg7CisgICAgaW50IGRheTsKKyAgICBpbnQgaG91ciA9IDA7CisgICAgaW50IG1pbnV0ZSA9IDA7CisgICAgaW50IHNlY29uZCA9IDA7CisgICAgaW50IHVzZWNvbmQgPSAwOworICAgIFB5T2JqZWN0ICp0emluZm8gPSBQeV9Ob25lOwogCi0JLyogQ2hlY2sgZm9yIGludm9jYXRpb24gZnJvbSBwaWNrbGUgd2l0aCBfX2dldHN0YXRlX18gc3RhdGUgKi8KLQlpZiAoUHlUdXBsZV9HRVRfU0laRShhcmdzKSA+PSAxICYmCi0JICAgIFB5VHVwbGVfR0VUX1NJWkUoYXJncykgPD0gMiAmJgotCSAgICBQeVN0cmluZ19DaGVjayhzdGF0ZSA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgMCkpICYmCi0JICAgIFB5U3RyaW5nX0dFVF9TSVpFKHN0YXRlKSA9PSBfUHlEYXRlVGltZV9EQVRFVElNRV9EQVRBU0laRSAmJgotCSAgICBNT05USF9JU19TQU5FKFB5U3RyaW5nX0FTX1NUUklORyhzdGF0ZSlbMl0pKQotCXsKLQkJUHlEYXRlVGltZV9EYXRlVGltZSAqbWU7Ci0JCWNoYXIgYXdhcmU7CisgICAgLyogQ2hlY2sgZm9yIGludm9jYXRpb24gZnJvbSBwaWNrbGUgd2l0aCBfX2dldHN0YXRlX18gc3RhdGUgKi8KKyAgICBpZiAoUHlUdXBsZV9HRVRfU0laRShhcmdzKSA+PSAxICYmCisgICAgICAgIFB5VHVwbGVfR0VUX1NJWkUoYXJncykgPD0gMiAmJgorICAgICAgICBQeVN0cmluZ19DaGVjayhzdGF0ZSA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgMCkpICYmCisgICAgICAgIFB5U3RyaW5nX0dFVF9TSVpFKHN0YXRlKSA9PSBfUHlEYXRlVGltZV9EQVRFVElNRV9EQVRBU0laRSAmJgorICAgICAgICBNT05USF9JU19TQU5FKFB5U3RyaW5nX0FTX1NUUklORyhzdGF0ZSlbMl0pKQorICAgIHsKKyAgICAgICAgUHlEYXRlVGltZV9EYXRlVGltZSAqbWU7CisgICAgICAgIGNoYXIgYXdhcmU7CiAKLQkJaWYgKFB5VHVwbGVfR0VUX1NJWkUoYXJncykgPT0gMikgewotCQkJdHppbmZvID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCAxKTsKLQkJCWlmIChjaGVja190emluZm9fc3ViY2xhc3ModHppbmZvKSA8IDApIHsKLQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYmFkICIKLQkJCQkJInR6aW5mbyBzdGF0ZSBhcmciKTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJfQotCQlhd2FyZSA9IChjaGFyKSh0emluZm8gIT0gUHlfTm9uZSk7Ci0JCW1lID0gKFB5RGF0ZVRpbWVfRGF0ZVRpbWUgKikgKHR5cGUtPnRwX2FsbG9jKHR5cGUgLCBhd2FyZSkpOwotCQlpZiAobWUgIT0gTlVMTCkgewotCQkJY2hhciAqcGRhdGEgPSBQeVN0cmluZ19BU19TVFJJTkcoc3RhdGUpOworICAgICAgICBpZiAoUHlUdXBsZV9HRVRfU0laRShhcmdzKSA9PSAyKSB7CisgICAgICAgICAgICB0emluZm8gPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDEpOworICAgICAgICAgICAgaWYgKGNoZWNrX3R6aW5mb19zdWJjbGFzcyh0emluZm8pIDwgMCkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJiYWQgIgorICAgICAgICAgICAgICAgICAgICAidHppbmZvIHN0YXRlIGFyZyIpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGF3YXJlID0gKGNoYXIpKHR6aW5mbyAhPSBQeV9Ob25lKTsKKyAgICAgICAgbWUgPSAoUHlEYXRlVGltZV9EYXRlVGltZSAqKSAodHlwZS0+dHBfYWxsb2ModHlwZSAsIGF3YXJlKSk7CisgICAgICAgIGlmIChtZSAhPSBOVUxMKSB7CisgICAgICAgICAgICBjaGFyICpwZGF0YSA9IFB5U3RyaW5nX0FTX1NUUklORyhzdGF0ZSk7CiAKLQkJCW1lbWNweShtZS0+ZGF0YSwgcGRhdGEsIF9QeURhdGVUaW1lX0RBVEVUSU1FX0RBVEFTSVpFKTsKLQkJCW1lLT5oYXNoY29kZSA9IC0xOwotCQkJbWUtPmhhc3R6aW5mbyA9IGF3YXJlOwotCQkJaWYgKGF3YXJlKSB7Ci0JCQkJUHlfSU5DUkVGKHR6aW5mbyk7Ci0JCQkJbWUtPnR6aW5mbyA9IHR6aW5mbzsKLQkJCX0KLQkJfQotCQlyZXR1cm4gKFB5T2JqZWN0ICopbWU7Ci0JfQorICAgICAgICAgICAgbWVtY3B5KG1lLT5kYXRhLCBwZGF0YSwgX1B5RGF0ZVRpbWVfREFURVRJTUVfREFUQVNJWkUpOworICAgICAgICAgICAgbWUtPmhhc2hjb2RlID0gLTE7CisgICAgICAgICAgICBtZS0+aGFzdHppbmZvID0gYXdhcmU7CisgICAgICAgICAgICBpZiAoYXdhcmUpIHsKKyAgICAgICAgICAgICAgICBQeV9JTkNSRUYodHppbmZvKTsKKyAgICAgICAgICAgICAgICBtZS0+dHppbmZvID0gdHppbmZvOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAoUHlPYmplY3QgKiltZTsKKyAgICB9CiAKLQlpZiAoUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3LCAiaWlpfGlpaWlPIiwgZGF0ZXRpbWVfa3dzLAotCQkJCQkmeWVhciwgJm1vbnRoLCAmZGF5LCAmaG91ciwgJm1pbnV0ZSwKLQkJCQkJJnNlY29uZCwgJnVzZWNvbmQsICZ0emluZm8pKSB7Ci0JCWlmIChjaGVja19kYXRlX2FyZ3MoeWVhciwgbW9udGgsIGRheSkgPCAwKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWlmIChjaGVja190aW1lX2FyZ3MoaG91ciwgbWludXRlLCBzZWNvbmQsIHVzZWNvbmQpIDwgMCkKLQkJCXJldHVybiBOVUxMOwotCQlpZiAoY2hlY2tfdHppbmZvX3N1YmNsYXNzKHR6aW5mbykgPCAwKQotCQkJcmV0dXJuIE5VTEw7Ci0JCXNlbGYgPSBuZXdfZGF0ZXRpbWVfZXgoeWVhciwgbW9udGgsIGRheSwKLQkJCQkgICAgCWhvdXIsIG1pbnV0ZSwgc2Vjb25kLCB1c2Vjb25kLAotCQkJCSAgICAJdHppbmZvLCB0eXBlKTsKLQl9Ci0JcmV0dXJuIHNlbGY7CisgICAgaWYgKFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrdywgImlpaXxpaWlpTyIsIGRhdGV0aW1lX2t3cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ5ZWFyLCAmbW9udGgsICZkYXksICZob3VyLCAmbWludXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlY29uZCwgJnVzZWNvbmQsICZ0emluZm8pKSB7CisgICAgICAgIGlmIChjaGVja19kYXRlX2FyZ3MoeWVhciwgbW9udGgsIGRheSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGlmIChjaGVja190aW1lX2FyZ3MoaG91ciwgbWludXRlLCBzZWNvbmQsIHVzZWNvbmQpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBpZiAoY2hlY2tfdHppbmZvX3N1YmNsYXNzKHR6aW5mbykgPCAwKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHNlbGYgPSBuZXdfZGF0ZXRpbWVfZXgoeWVhciwgbW9udGgsIGRheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG91ciwgbWludXRlLCBzZWNvbmQsIHVzZWNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR6aW5mbywgdHlwZSk7CisgICAgfQorICAgIHJldHVybiBzZWxmOwogfQogCiAvKiBUTV9GVU5DIGlzIHRoZSBzaGFyZWQgdHlwZSBvZiBsb2NhbHRpbWUoKSBhbmQgZ210aW1lKCkuICovCkBAIC0zNzA3LDM2ICszNzA3LDM2IEBACiAgKi8KIHN0YXRpYyBQeU9iamVjdCAqCiBkYXRldGltZV9mcm9tX3RpbWV0X2FuZF91cyhQeU9iamVjdCAqY2xzLCBUTV9GVU5DIGYsIHRpbWVfdCB0aW1ldCwgaW50IHVzLAotCQkJICAgUHlPYmplY3QgKnR6aW5mbykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICp0emluZm8pCiB7Ci0Jc3RydWN0IHRtICp0bTsKLQlQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKKyAgICBzdHJ1Y3QgdG0gKnRtOworICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOwogCi0JdG0gPSBmKCZ0aW1ldCk7Ci0JaWYgKHRtKSB7Ci0JCS8qIFRoZSBwbGF0Zm9ybSBsb2NhbHRpbWUvZ210aW1lIG1heSBpbnNlcnQgbGVhcCBzZWNvbmRzLAotCQkgKiBpbmRpY2F0ZWQgYnkgdG0tPnRtX3NlYyA+IDU5LiAgV2UgZG9uJ3QgY2FyZSBhYm91dCB0aGVtLAotCQkgKiBleGNlcHQgdG8gdGhlIGV4dGVudCB0aGF0IHBhc3NpbmcgdGhlbSBvbiB0byB0aGUgZGF0ZXRpbWUKLQkJICogY29uc3RydWN0b3Igd291bGQgcmFpc2UgVmFsdWVFcnJvciBmb3IgYSByZWFzb24gdGhhdAotCQkgKiBtYWRlIG5vIHNlbnNlIHRvIHRoZSB1c2VyLgotCQkgKi8KLQkJaWYgKHRtLT50bV9zZWMgPiA1OSkKLQkJCXRtLT50bV9zZWMgPSA1OTsKLQkJcmVzdWx0ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKGNscywgImlpaWlpaWlPIiwKLQkJCQkJICAgICAgIHRtLT50bV95ZWFyICsgMTkwMCwKLQkJCQkJICAgICAgIHRtLT50bV9tb24gKyAxLAotCQkJCQkgICAgICAgdG0tPnRtX21kYXksCi0JCQkJCSAgICAgICB0bS0+dG1faG91ciwKLQkJCQkJICAgICAgIHRtLT50bV9taW4sCi0JCQkJCSAgICAgICB0bS0+dG1fc2VjLAotCQkJCQkgICAgICAgdXMsCi0JCQkJCSAgICAgICB0emluZm8pOwotCX0KLQllbHNlCi0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJ0aW1lc3RhbXAgb3V0IG9mIHJhbmdlIGZvciAiCi0JCQkJInBsYXRmb3JtIGxvY2FsdGltZSgpL2dtdGltZSgpIGZ1bmN0aW9uIik7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICB0bSA9IGYoJnRpbWV0KTsKKyAgICBpZiAodG0pIHsKKyAgICAgICAgLyogVGhlIHBsYXRmb3JtIGxvY2FsdGltZS9nbXRpbWUgbWF5IGluc2VydCBsZWFwIHNlY29uZHMsCisgICAgICAgICAqIGluZGljYXRlZCBieSB0bS0+dG1fc2VjID4gNTkuICBXZSBkb24ndCBjYXJlIGFib3V0IHRoZW0sCisgICAgICAgICAqIGV4Y2VwdCB0byB0aGUgZXh0ZW50IHRoYXQgcGFzc2luZyB0aGVtIG9uIHRvIHRoZSBkYXRldGltZQorICAgICAgICAgKiBjb25zdHJ1Y3RvciB3b3VsZCByYWlzZSBWYWx1ZUVycm9yIGZvciBhIHJlYXNvbiB0aGF0CisgICAgICAgICAqIG1hZGUgbm8gc2Vuc2UgdG8gdGhlIHVzZXIuCisgICAgICAgICAqLworICAgICAgICBpZiAodG0tPnRtX3NlYyA+IDU5KQorICAgICAgICAgICAgdG0tPnRtX3NlYyA9IDU5OworICAgICAgICByZXN1bHQgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oY2xzLCAiaWlpaWlpaU8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG0tPnRtX3llYXIgKyAxOTAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG0tPnRtX21vbiArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bS0+dG1fbWRheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtLT50bV9ob3VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG0tPnRtX21pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtLT50bV9zZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR6aW5mbyk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAidGltZXN0YW1wIG91dCBvZiByYW5nZSBmb3IgIgorICAgICAgICAgICAgICAgICAgICAgICAgInBsYXRmb3JtIGxvY2FsdGltZSgpL2dtdGltZSgpIGZ1bmN0aW9uIik7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogLyogSW50ZXJuYWwgaGVscGVyLgpAQCAtMzc0OCwzMSArMzc0OCwzMSBAQAogICovCiBzdGF0aWMgUHlPYmplY3QgKgogZGF0ZXRpbWVfZnJvbV90aW1lc3RhbXAoUHlPYmplY3QgKmNscywgVE1fRlVOQyBmLCBkb3VibGUgdGltZXN0YW1wLAotCQkJUHlPYmplY3QgKnR6aW5mbykKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICp0emluZm8pCiB7Ci0JdGltZV90IHRpbWV0OwotCWRvdWJsZSBmcmFjdGlvbjsKLQlpbnQgdXM7CisgICAgdGltZV90IHRpbWV0OworICAgIGRvdWJsZSBmcmFjdGlvbjsKKyAgICBpbnQgdXM7CiAKLQl0aW1ldCA9IF9QeVRpbWVfRG91YmxlVG9UaW1ldCh0aW1lc3RhbXApOwotCWlmICh0aW1ldCA9PSAodGltZV90KS0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiBOVUxMOwotCWZyYWN0aW9uID0gdGltZXN0YW1wIC0gKGRvdWJsZSl0aW1ldDsKLQl1cyA9IChpbnQpcm91bmRfdG9fbG9uZyhmcmFjdGlvbiAqIDFlNik7Ci0JaWYgKHVzIDwgMCkgewotCQkvKiBUcnVuY2F0aW9uIHRvd2FyZHMgemVybyBpcyBub3Qgd2hhdCB3ZSB3YW50ZWQKLQkJICAgZm9yIG5lZ2F0aXZlIG51bWJlcnMgKFB5dGhvbidzIG1vZCBzZW1hbnRpY3MpICovCi0JCXRpbWV0IC09IDE7Ci0JCXVzICs9IDEwMDAwMDA7Ci0JfQotCS8qIElmIHRpbWVzdGFtcCBpcyBsZXNzIHRoYW4gb25lIG1pY3Jvc2Vjb25kIHNtYWxsZXIgdGhhbiBhCi0JICogZnVsbCBzZWNvbmQsIHJvdW5kIHVwLiBPdGhlcndpc2UsIFZhbHVlRXJyb3JzIGFyZSByYWlzZWQKLQkgKiBmb3Igc29tZSBmbG9hdHMuICovCi0JaWYgKHVzID09IDEwMDAwMDApIHsKLQkJdGltZXQgKz0gMTsKLQkJdXMgPSAwOwotCX0KLQlyZXR1cm4gZGF0ZXRpbWVfZnJvbV90aW1ldF9hbmRfdXMoY2xzLCBmLCB0aW1ldCwgdXMsIHR6aW5mbyk7CisgICAgdGltZXQgPSBfUHlUaW1lX0RvdWJsZVRvVGltZXQodGltZXN0YW1wKTsKKyAgICBpZiAodGltZXQgPT0gKHRpbWVfdCktMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBmcmFjdGlvbiA9IHRpbWVzdGFtcCAtIChkb3VibGUpdGltZXQ7CisgICAgdXMgPSAoaW50KXJvdW5kX3RvX2xvbmcoZnJhY3Rpb24gKiAxZTYpOworICAgIGlmICh1cyA8IDApIHsKKyAgICAgICAgLyogVHJ1bmNhdGlvbiB0b3dhcmRzIHplcm8gaXMgbm90IHdoYXQgd2Ugd2FudGVkCisgICAgICAgICAgIGZvciBuZWdhdGl2ZSBudW1iZXJzIChQeXRob24ncyBtb2Qgc2VtYW50aWNzKSAqLworICAgICAgICB0aW1ldCAtPSAxOworICAgICAgICB1cyArPSAxMDAwMDAwOworICAgIH0KKyAgICAvKiBJZiB0aW1lc3RhbXAgaXMgbGVzcyB0aGFuIG9uZSBtaWNyb3NlY29uZCBzbWFsbGVyIHRoYW4gYQorICAgICAqIGZ1bGwgc2Vjb25kLCByb3VuZCB1cC4gT3RoZXJ3aXNlLCBWYWx1ZUVycm9ycyBhcmUgcmFpc2VkCisgICAgICogZm9yIHNvbWUgZmxvYXRzLiAqLworICAgIGlmICh1cyA9PSAxMDAwMDAwKSB7CisgICAgICAgIHRpbWV0ICs9IDE7CisgICAgICAgIHVzID0gMDsKKyAgICB9CisgICAgcmV0dXJuIGRhdGV0aW1lX2Zyb21fdGltZXRfYW5kX3VzKGNscywgZiwgdGltZXQsIHVzLCB0emluZm8pOwogfQogCiAvKiBJbnRlcm5hbCBoZWxwZXIuCkBAIC0zNzgzLDM2ICszNzgzLDM2IEBACiBkYXRldGltZV9iZXN0X3Bvc3NpYmxlKFB5T2JqZWN0ICpjbHMsIFRNX0ZVTkMgZiwgUHlPYmplY3QgKnR6aW5mbykKIHsKICNpZmRlZiBIQVZFX0dFVFRJTUVPRkRBWQotCXN0cnVjdCB0aW1ldmFsIHQ7CisgICAgc3RydWN0IHRpbWV2YWwgdDsKIAogI2lmZGVmIEdFVFRJTUVPRkRBWV9OT19UWgotCWdldHRpbWVvZmRheSgmdCk7CisgICAgZ2V0dGltZW9mZGF5KCZ0KTsKICNlbHNlCi0JZ2V0dGltZW9mZGF5KCZ0LCAoc3RydWN0IHRpbWV6b25lICopTlVMTCk7CisgICAgZ2V0dGltZW9mZGF5KCZ0LCAoc3RydWN0IHRpbWV6b25lICopTlVMTCk7CiAjZW5kaWYKLQlyZXR1cm4gZGF0ZXRpbWVfZnJvbV90aW1ldF9hbmRfdXMoY2xzLCBmLCB0LnR2X3NlYywgKGludCl0LnR2X3VzZWMsCi0JCQkJCSAgdHppbmZvKTsKKyAgICByZXR1cm4gZGF0ZXRpbWVfZnJvbV90aW1ldF9hbmRfdXMoY2xzLCBmLCB0LnR2X3NlYywgKGludCl0LnR2X3VzZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR6aW5mbyk7CiAKLSNlbHNlCS8qICEgSEFWRV9HRVRUSU1FT0ZEQVkgKi8KLQkvKiBObyBmbGF2b3Igb2YgZ2V0dGltZW9mZGF5IGV4aXN0cyBvbiB0aGlzIHBsYXRmb3JtLiAgUHl0aG9uJ3MKLQkgKiB0aW1lLnRpbWUoKSBkb2VzIGEgbG90IG9mIG90aGVyIHBsYXRmb3JtIHRyaWNrcyB0byBnZXQgdGhlCi0JICogYmVzdCB0aW1lIGl0IGNhbiBvbiB0aGUgcGxhdGZvcm0sIGFuZCB3ZSdyZSBub3QgZ29pbmcgdG8gZG8KLQkgKiBiZXR0ZXIgdGhhbiB0aGF0IChpZiB3ZSBjb3VsZCwgdGhlIGJldHRlciBjb2RlIHdvdWxkIGJlbG9uZwotCSAqIGluIHRpbWUudGltZSgpISkgIFdlJ3JlIGxpbWl0ZWQgYnkgdGhlIHByZWNpc2lvbiBvZiBhIGRvdWJsZSwKLQkgKiB0aG91Z2guCi0JICovCi0JUHlPYmplY3QgKnRpbWU7Ci0JZG91YmxlIGR0aW1lOworI2Vsc2UgICAvKiAhIEhBVkVfR0VUVElNRU9GREFZICovCisgICAgLyogTm8gZmxhdm9yIG9mIGdldHRpbWVvZmRheSBleGlzdHMgb24gdGhpcyBwbGF0Zm9ybS4gIFB5dGhvbidzCisgICAgICogdGltZS50aW1lKCkgZG9lcyBhIGxvdCBvZiBvdGhlciBwbGF0Zm9ybSB0cmlja3MgdG8gZ2V0IHRoZQorICAgICAqIGJlc3QgdGltZSBpdCBjYW4gb24gdGhlIHBsYXRmb3JtLCBhbmQgd2UncmUgbm90IGdvaW5nIHRvIGRvCisgICAgICogYmV0dGVyIHRoYW4gdGhhdCAoaWYgd2UgY291bGQsIHRoZSBiZXR0ZXIgY29kZSB3b3VsZCBiZWxvbmcKKyAgICAgKiBpbiB0aW1lLnRpbWUoKSEpICBXZSdyZSBsaW1pdGVkIGJ5IHRoZSBwcmVjaXNpb24gb2YgYSBkb3VibGUsCisgICAgICogdGhvdWdoLgorICAgICAqLworICAgIFB5T2JqZWN0ICp0aW1lOworICAgIGRvdWJsZSBkdGltZTsKIAotCXRpbWUgPSB0aW1lX3RpbWUoKTsKLSAgICAJaWYgKHRpbWUgPT0gTlVMTCkKLSAgICAJCXJldHVybiBOVUxMOwotCWR0aW1lID0gUHlGbG9hdF9Bc0RvdWJsZSh0aW1lKTsKLQlQeV9ERUNSRUYodGltZSk7Ci0JaWYgKGR0aW1lID09IC0xLjAgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIGRhdGV0aW1lX2Zyb21fdGltZXN0YW1wKGNscywgZiwgZHRpbWUsIHR6aW5mbyk7Ci0jZW5kaWYJLyogISBIQVZFX0dFVFRJTUVPRkRBWSAqLworICAgIHRpbWUgPSB0aW1lX3RpbWUoKTsKKyAgICBpZiAodGltZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBkdGltZSA9IFB5RmxvYXRfQXNEb3VibGUodGltZSk7CisgICAgUHlfREVDUkVGKHRpbWUpOworICAgIGlmIChkdGltZSA9PSAtMS4wICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBkYXRldGltZV9mcm9tX3RpbWVzdGFtcChjbHMsIGYsIGR0aW1lLCB0emluZm8pOworI2VuZGlmICAvKiAhIEhBVkVfR0VUVElNRU9GREFZICovCiB9CiAKIC8qIFJldHVybiBiZXN0IHBvc3NpYmxlIGxvY2FsIHRpbWUgLS0gdGhpcyBpc24ndCBjb25zdHJhaW5lZCBieSB0aGUKQEAgLTM4MjEsMjYgKzM4MjEsMjYgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBkYXRldGltZV9ub3coUHlPYmplY3QgKmNscywgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprdykKIHsKLQlQeU9iamVjdCAqc2VsZjsKLQlQeU9iamVjdCAqdHppbmZvID0gUHlfTm9uZTsKLQlzdGF0aWMgY2hhciAqa2V5d29yZHNbXSA9IHsidHoiLCBOVUxMfTsKKyAgICBQeU9iamVjdCAqc2VsZjsKKyAgICBQeU9iamVjdCAqdHppbmZvID0gUHlfTm9uZTsKKyAgICBzdGF0aWMgY2hhciAqa2V5d29yZHNbXSA9IHsidHoiLCBOVUxMfTsKIAotCWlmICghIFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrdywgInxPOm5vdyIsIGtleXdvcmRzLAotCQkJCQkgICZ0emluZm8pKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoY2hlY2tfdHppbmZvX3N1YmNsYXNzKHR6aW5mbykgPCAwKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoISBQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3csICJ8Tzpub3ciLCBrZXl3b3JkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnR6aW5mbykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChjaGVja190emluZm9fc3ViY2xhc3ModHppbmZvKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOwogCi0Jc2VsZiA9IGRhdGV0aW1lX2Jlc3RfcG9zc2libGUoY2xzLAotCQkJCSAgICAgIHR6aW5mbyA9PSBQeV9Ob25lID8gbG9jYWx0aW1lIDogZ210aW1lLAotCQkJCSAgICAgIHR6aW5mbyk7Ci0JaWYgKHNlbGYgIT0gTlVMTCAmJiB0emluZm8gIT0gUHlfTm9uZSkgewotCQkvKiBDb252ZXJ0IFVUQyB0byB0emluZm8ncyB6b25lLiAqLwotCQlQeU9iamVjdCAqdGVtcCA9IHNlbGY7Ci0JCXNlbGYgPSBQeU9iamVjdF9DYWxsTWV0aG9kKHR6aW5mbywgImZyb211dGMiLCAiTyIsIHNlbGYpOwotCQlQeV9ERUNSRUYodGVtcCk7Ci0JfQotCXJldHVybiBzZWxmOworICAgIHNlbGYgPSBkYXRldGltZV9iZXN0X3Bvc3NpYmxlKGNscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0emluZm8gPT0gUHlfTm9uZSA/IGxvY2FsdGltZSA6IGdtdGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0emluZm8pOworICAgIGlmIChzZWxmICE9IE5VTEwgJiYgdHppbmZvICE9IFB5X05vbmUpIHsKKyAgICAgICAgLyogQ29udmVydCBVVEMgdG8gdHppbmZvJ3Mgem9uZS4gKi8KKyAgICAgICAgUHlPYmplY3QgKnRlbXAgPSBzZWxmOworICAgICAgICBzZWxmID0gUHlPYmplY3RfQ2FsbE1ldGhvZCh0emluZm8sICJmcm9tdXRjIiwgIk8iLCBzZWxmKTsKKyAgICAgICAgUHlfREVDUkVGKHRlbXApOworICAgIH0KKyAgICByZXR1cm4gc2VsZjsKIH0KIAogLyogUmV0dXJuIGJlc3QgcG9zc2libGUgVVRDIHRpbWUgLS0gdGhpcyBpc24ndCBjb25zdHJhaW5lZCBieSB0aGUKQEAgLTM4NDksMTQ3ICszODQ5LDE0NyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGRhdGV0aW1lX3V0Y25vdyhQeU9iamVjdCAqY2xzLCBQeU9iamVjdCAqZHVtbXkpCiB7Ci0JcmV0dXJuIGRhdGV0aW1lX2Jlc3RfcG9zc2libGUoY2xzLCBnbXRpbWUsIFB5X05vbmUpOworICAgIHJldHVybiBkYXRldGltZV9iZXN0X3Bvc3NpYmxlKGNscywgZ210aW1lLCBQeV9Ob25lKTsKIH0KIAogLyogUmV0dXJuIG5ldyBsb2NhbCBkYXRldGltZSBmcm9tIHRpbWVzdGFtcCAoUHl0aG9uIHRpbWVzdGFtcCAtLSBhIGRvdWJsZSkuICovCiBzdGF0aWMgUHlPYmplY3QgKgogZGF0ZXRpbWVfZnJvbXRpbWVzdGFtcChQeU9iamVjdCAqY2xzLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3KQogewotCVB5T2JqZWN0ICpzZWxmOwotCWRvdWJsZSB0aW1lc3RhbXA7Ci0JUHlPYmplY3QgKnR6aW5mbyA9IFB5X05vbmU7Ci0Jc3RhdGljIGNoYXIgKmtleXdvcmRzW10gPSB7InRpbWVzdGFtcCIsICJ0eiIsIE5VTEx9OworICAgIFB5T2JqZWN0ICpzZWxmOworICAgIGRvdWJsZSB0aW1lc3RhbXA7CisgICAgUHlPYmplY3QgKnR6aW5mbyA9IFB5X05vbmU7CisgICAgc3RhdGljIGNoYXIgKmtleXdvcmRzW10gPSB7InRpbWVzdGFtcCIsICJ0eiIsIE5VTEx9OwogCi0JaWYgKCEgUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3LCAiZHxPOmZyb210aW1lc3RhbXAiLAotCQkJCQkgIGtleXdvcmRzLCAmdGltZXN0YW1wLCAmdHppbmZvKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKGNoZWNrX3R6aW5mb19zdWJjbGFzcyh0emluZm8pIDwgMCkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCEgUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3LCAiZHxPOmZyb210aW1lc3RhbXAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXl3b3JkcywgJnRpbWVzdGFtcCwgJnR6aW5mbykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChjaGVja190emluZm9fc3ViY2xhc3ModHppbmZvKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOwogCi0Jc2VsZiA9IGRhdGV0aW1lX2Zyb21fdGltZXN0YW1wKGNscywKLQkJCQkgICAgICAgdHppbmZvID09IFB5X05vbmUgPyBsb2NhbHRpbWUgOiBnbXRpbWUsCi0JCQkJICAgICAgIHRpbWVzdGFtcCwKLQkJCQkgICAgICAgdHppbmZvKTsKLQlpZiAoc2VsZiAhPSBOVUxMICYmIHR6aW5mbyAhPSBQeV9Ob25lKSB7Ci0JCS8qIENvbnZlcnQgVVRDIHRvIHR6aW5mbydzIHpvbmUuICovCi0JCVB5T2JqZWN0ICp0ZW1wID0gc2VsZjsKLQkJc2VsZiA9IFB5T2JqZWN0X0NhbGxNZXRob2QodHppbmZvLCAiZnJvbXV0YyIsICJPIiwgc2VsZik7Ci0JCVB5X0RFQ1JFRih0ZW1wKTsKLQl9Ci0JcmV0dXJuIHNlbGY7CisgICAgc2VsZiA9IGRhdGV0aW1lX2Zyb21fdGltZXN0YW1wKGNscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHppbmZvID09IFB5X05vbmUgPyBsb2NhbHRpbWUgOiBnbXRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHppbmZvKTsKKyAgICBpZiAoc2VsZiAhPSBOVUxMICYmIHR6aW5mbyAhPSBQeV9Ob25lKSB7CisgICAgICAgIC8qIENvbnZlcnQgVVRDIHRvIHR6aW5mbydzIHpvbmUuICovCisgICAgICAgIFB5T2JqZWN0ICp0ZW1wID0gc2VsZjsKKyAgICAgICAgc2VsZiA9IFB5T2JqZWN0X0NhbGxNZXRob2QodHppbmZvLCAiZnJvbXV0YyIsICJPIiwgc2VsZik7CisgICAgICAgIFB5X0RFQ1JFRih0ZW1wKTsKKyAgICB9CisgICAgcmV0dXJuIHNlbGY7CiB9CiAKIC8qIFJldHVybiBuZXcgVVRDIGRhdGV0aW1lIGZyb20gdGltZXN0YW1wIChQeXRob24gdGltZXN0YW1wIC0tIGEgZG91YmxlKS4gKi8KIHN0YXRpYyBQeU9iamVjdCAqCiBkYXRldGltZV91dGNmcm9tdGltZXN0YW1wKFB5T2JqZWN0ICpjbHMsIFB5T2JqZWN0ICphcmdzKQogewotCWRvdWJsZSB0aW1lc3RhbXA7Ci0JUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7CisgICAgZG91YmxlIHRpbWVzdGFtcDsKKyAgICBQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKIAotCWlmIChQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJkOnV0Y2Zyb210aW1lc3RhbXAiLCAmdGltZXN0YW1wKSkKLQkJcmVzdWx0ID0gZGF0ZXRpbWVfZnJvbV90aW1lc3RhbXAoY2xzLCBnbXRpbWUsIHRpbWVzdGFtcCwKLQkJCQkJCSBQeV9Ob25lKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIGlmIChQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJkOnV0Y2Zyb210aW1lc3RhbXAiLCAmdGltZXN0YW1wKSkKKyAgICAgICAgcmVzdWx0ID0gZGF0ZXRpbWVfZnJvbV90aW1lc3RhbXAoY2xzLCBnbXRpbWUsIHRpbWVzdGFtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfTm9uZSk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogLyogUmV0dXJuIG5ldyBkYXRldGltZSBmcm9tIHRpbWUuc3RycHRpbWUoKS4gKi8KIHN0YXRpYyBQeU9iamVjdCAqCiBkYXRldGltZV9zdHJwdGltZShQeU9iamVjdCAqY2xzLCBQeU9iamVjdCAqYXJncykKIHsKLQlzdGF0aWMgUHlPYmplY3QgKm1vZHVsZSA9IE5VTEw7Ci0JUHlPYmplY3QgKnJlc3VsdCA9IE5VTEwsICpvYmosICpzdCA9IE5VTEwsICpmcmFjID0gTlVMTDsKLQljb25zdCBjaGFyICpzdHJpbmcsICpmb3JtYXQ7CisgICAgc3RhdGljIFB5T2JqZWN0ICptb2R1bGUgPSBOVUxMOworICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMLCAqb2JqLCAqc3QgPSBOVUxMLCAqZnJhYyA9IE5VTEw7CisgICAgY29uc3QgY2hhciAqc3RyaW5nLCAqZm9ybWF0OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzczpzdHJwdGltZSIsICZzdHJpbmcsICZmb3JtYXQpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInNzOnN0cnB0aW1lIiwgJnN0cmluZywgJmZvcm1hdCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKG1vZHVsZSA9PSBOVUxMICYmCi0JICAgIChtb2R1bGUgPSBQeUltcG9ydF9JbXBvcnRNb2R1bGVOb0Jsb2NrKCJfc3RycHRpbWUiKSkgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKG1vZHVsZSA9PSBOVUxMICYmCisgICAgICAgIChtb2R1bGUgPSBQeUltcG9ydF9JbXBvcnRNb2R1bGVOb0Jsb2NrKCJfc3RycHRpbWUiKSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkvKiBfc3RycHRpbWUuX3N0cnB0aW1lIHJldHVybnMgYSB0d28tZWxlbWVudCB0dXBsZS4gIFRoZSBmaXJzdAotCSAgIGVsZW1lbnQgaXMgYSB0aW1lLnN0cnVjdF90aW1lIG9iamVjdC4gIFRoZSBzZWNvbmQgaXMgdGhlCi0JICAgbWljcm9zZWNvbmRzICh3aGljaCBhcmUgbm90IGRlZmluZWQgZm9yIHRpbWUuc3RydWN0X3RpbWUpLiAqLwotCW9iaiA9IFB5T2JqZWN0X0NhbGxNZXRob2QobW9kdWxlLCAiX3N0cnB0aW1lIiwgInNzIiwgc3RyaW5nLCBmb3JtYXQpOwotCWlmIChvYmogIT0gTlVMTCkgewotCQlpbnQgaSwgZ29vZF90aW1ldHVwbGUgPSAxOwotCQlsb25nIGludCBpYVs3XTsKLQkJaWYgKFB5U2VxdWVuY2VfQ2hlY2sob2JqKSAmJiBQeVNlcXVlbmNlX1NpemUob2JqKSA9PSAyKSB7Ci0JCQlzdCA9IFB5U2VxdWVuY2VfR2V0SXRlbShvYmosIDApOwotCQkJZnJhYyA9IFB5U2VxdWVuY2VfR2V0SXRlbShvYmosIDEpOwotCQkJaWYgKHN0ID09IE5VTEwgfHwgZnJhYyA9PSBOVUxMKQotCQkJCWdvb2RfdGltZXR1cGxlID0gMDsKLQkJCS8qIGNvcHkgeS9tL2QvaC9tL3MgdmFsdWVzIG91dCBvZiB0aGUKLQkJCSAgIHRpbWUuc3RydWN0X3RpbWUgKi8KLQkJCWlmIChnb29kX3RpbWV0dXBsZSAmJgotCQkJICAgIFB5U2VxdWVuY2VfQ2hlY2soc3QpICYmCi0JCQkgICAgUHlTZXF1ZW5jZV9TaXplKHN0KSA+PSA2KSB7Ci0JCQkJZm9yIChpPTA7IGkgPCA2OyBpKyspIHsKLQkJCQkJUHlPYmplY3QgKnAgPSBQeVNlcXVlbmNlX0dldEl0ZW0oc3QsIGkpOwotCQkJCQlpZiAocCA9PSBOVUxMKSB7Ci0JCQkJCQlnb29kX3RpbWV0dXBsZSA9IDA7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQlpZiAoUHlJbnRfQ2hlY2socCkpCi0JCQkJCQlpYVtpXSA9IFB5SW50X0FzTG9uZyhwKTsKLQkJCQkJZWxzZQotCQkJCQkJZ29vZF90aW1ldHVwbGUgPSAwOwotCQkJCQlQeV9ERUNSRUYocCk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZQotCQkJCWdvb2RfdGltZXR1cGxlID0gMDsKLQkJCS8qIGZvbGxvdyB0aGF0IHVwIHdpdGggYSBsaXR0bGUgZG9zZSBvZiBtaWNyb3NlY29uZHMgKi8KLQkJCWlmIChQeUludF9DaGVjayhmcmFjKSkKLQkJCQlpYVs2XSA9IFB5SW50X0FzTG9uZyhmcmFjKTsKLQkJCWVsc2UKLQkJCQlnb29kX3RpbWV0dXBsZSA9IDA7Ci0JCX0KLQkJZWxzZQotCQkJZ29vZF90aW1ldHVwbGUgPSAwOwotCQlpZiAoZ29vZF90aW1ldHVwbGUpCi0JCQlyZXN1bHQgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oY2xzLCAiaWlpaWlpaSIsCi0JCQkJCQkgICAgICAgaWFbMF0sIGlhWzFdLCBpYVsyXSwKLQkJCQkJCSAgICAgICBpYVszXSwgaWFbNF0sIGlhWzVdLAotCQkJCQkJICAgICAgIGlhWzZdKTsKLQkJZWxzZQotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJInVuZXhwZWN0ZWQgdmFsdWUgZnJvbSBfc3RycHRpbWUuX3N0cnB0aW1lIik7Ci0JfQotCVB5X1hERUNSRUYob2JqKTsKLQlQeV9YREVDUkVGKHN0KTsKLQlQeV9YREVDUkVGKGZyYWMpOwotCXJldHVybiByZXN1bHQ7CisgICAgLyogX3N0cnB0aW1lLl9zdHJwdGltZSByZXR1cm5zIGEgdHdvLWVsZW1lbnQgdHVwbGUuICBUaGUgZmlyc3QKKyAgICAgICBlbGVtZW50IGlzIGEgdGltZS5zdHJ1Y3RfdGltZSBvYmplY3QuICBUaGUgc2Vjb25kIGlzIHRoZQorICAgICAgIG1pY3Jvc2Vjb25kcyAod2hpY2ggYXJlIG5vdCBkZWZpbmVkIGZvciB0aW1lLnN0cnVjdF90aW1lKS4gKi8KKyAgICBvYmogPSBQeU9iamVjdF9DYWxsTWV0aG9kKG1vZHVsZSwgIl9zdHJwdGltZSIsICJzcyIsIHN0cmluZywgZm9ybWF0KTsKKyAgICBpZiAob2JqICE9IE5VTEwpIHsKKyAgICAgICAgaW50IGksIGdvb2RfdGltZXR1cGxlID0gMTsKKyAgICAgICAgbG9uZyBpbnQgaWFbN107CisgICAgICAgIGlmIChQeVNlcXVlbmNlX0NoZWNrKG9iaikgJiYgUHlTZXF1ZW5jZV9TaXplKG9iaikgPT0gMikgeworICAgICAgICAgICAgc3QgPSBQeVNlcXVlbmNlX0dldEl0ZW0ob2JqLCAwKTsKKyAgICAgICAgICAgIGZyYWMgPSBQeVNlcXVlbmNlX0dldEl0ZW0ob2JqLCAxKTsKKyAgICAgICAgICAgIGlmIChzdCA9PSBOVUxMIHx8IGZyYWMgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBnb29kX3RpbWV0dXBsZSA9IDA7CisgICAgICAgICAgICAvKiBjb3B5IHkvbS9kL2gvbS9zIHZhbHVlcyBvdXQgb2YgdGhlCisgICAgICAgICAgICAgICB0aW1lLnN0cnVjdF90aW1lICovCisgICAgICAgICAgICBpZiAoZ29vZF90aW1ldHVwbGUgJiYKKyAgICAgICAgICAgICAgICBQeVNlcXVlbmNlX0NoZWNrKHN0KSAmJgorICAgICAgICAgICAgICAgIFB5U2VxdWVuY2VfU2l6ZShzdCkgPj0gNikgeworICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpIDwgNjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpwID0gUHlTZXF1ZW5jZV9HZXRJdGVtKHN0LCBpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHAgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZ29vZF90aW1ldHVwbGUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKFB5SW50X0NoZWNrKHApKQorICAgICAgICAgICAgICAgICAgICAgICAgaWFbaV0gPSBQeUludF9Bc0xvbmcocCk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvb2RfdGltZXR1cGxlID0gMDsKKyAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBnb29kX3RpbWV0dXBsZSA9IDA7CisgICAgICAgICAgICAvKiBmb2xsb3cgdGhhdCB1cCB3aXRoIGEgbGl0dGxlIGRvc2Ugb2YgbWljcm9zZWNvbmRzICovCisgICAgICAgICAgICBpZiAoUHlJbnRfQ2hlY2soZnJhYykpCisgICAgICAgICAgICAgICAgaWFbNl0gPSBQeUludF9Bc0xvbmcoZnJhYyk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZ29vZF90aW1ldHVwbGUgPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGdvb2RfdGltZXR1cGxlID0gMDsKKyAgICAgICAgaWYgKGdvb2RfdGltZXR1cGxlKQorICAgICAgICAgICAgcmVzdWx0ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKGNscywgImlpaWlpaWkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlhWzBdLCBpYVsxXSwgaWFbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWFbM10sIGlhWzRdLCBpYVs1XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpYVs2XSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkIHZhbHVlIGZyb20gX3N0cnB0aW1lLl9zdHJwdGltZSIpOworICAgIH0KKyAgICBQeV9YREVDUkVGKG9iaik7CisgICAgUHlfWERFQ1JFRihzdCk7CisgICAgUHlfWERFQ1JFRihmcmFjKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiAvKiBSZXR1cm4gbmV3IGRhdGV0aW1lIGZyb20gZGF0ZS9kYXRldGltZSBhbmQgdGltZSBhcmd1bWVudHMuICovCiBzdGF0aWMgUHlPYmplY3QgKgogZGF0ZXRpbWVfY29tYmluZShQeU9iamVjdCAqY2xzLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3KQogewotIAlzdGF0aWMgY2hhciAqa2V5d29yZHNbXSA9IHsiZGF0ZSIsICJ0aW1lIiwgTlVMTH07Ci0JUHlPYmplY3QgKmRhdGU7Ci0JUHlPYmplY3QgKnRpbWU7Ci0JUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7CisgICAgc3RhdGljIGNoYXIgKmtleXdvcmRzW10gPSB7ImRhdGUiLCAidGltZSIsIE5VTEx9OworICAgIFB5T2JqZWN0ICpkYXRlOworICAgIFB5T2JqZWN0ICp0aW1lOworICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOwogCi0JaWYgKFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrdywgIk8hTyE6Y29tYmluZSIsIGtleXdvcmRzLAotCQkJCQkmUHlEYXRlVGltZV9EYXRlVHlwZSwgJmRhdGUsCi0JCQkJCSZQeURhdGVUaW1lX1RpbWVUeXBlLCAmdGltZSkpIHsKLQkJUHlPYmplY3QgKnR6aW5mbyA9IFB5X05vbmU7CisgICAgaWYgKFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrdywgIk8hTyE6Y29tYmluZSIsIGtleXdvcmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlB5RGF0ZVRpbWVfRGF0ZVR5cGUsICZkYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlB5RGF0ZVRpbWVfVGltZVR5cGUsICZ0aW1lKSkgeworICAgICAgICBQeU9iamVjdCAqdHppbmZvID0gUHlfTm9uZTsKIAotCQlpZiAoSEFTVFpJTkZPKHRpbWUpKQotCQkJdHppbmZvID0gKChQeURhdGVUaW1lX1RpbWUgKil0aW1lKS0+dHppbmZvOwotCQlyZXN1bHQgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oY2xzLCAiaWlpaWlpaU8iLAotCQkJCQkJR0VUX1lFQVIoZGF0ZSksCi0JCQkJICAgIAkJR0VUX01PTlRIKGRhdGUpLAotCQkJCQkJR0VUX0RBWShkYXRlKSwKLQkJCQkgICAgCQlUSU1FX0dFVF9IT1VSKHRpbWUpLAotCQkJCSAgICAJCVRJTUVfR0VUX01JTlVURSh0aW1lKSwKLQkJCQkgICAgCQlUSU1FX0dFVF9TRUNPTkQodGltZSksCi0JCQkJICAgIAkJVElNRV9HRVRfTUlDUk9TRUNPTkQodGltZSksCi0JCQkJICAgIAkJdHppbmZvKTsKLQl9Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgaWYgKEhBU1RaSU5GTyh0aW1lKSkKKyAgICAgICAgICAgIHR6aW5mbyA9ICgoUHlEYXRlVGltZV9UaW1lICopdGltZSktPnR6aW5mbzsKKyAgICAgICAgcmVzdWx0ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKGNscywgImlpaWlpaWlPIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRVRfWUVBUihkYXRlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRVRfTU9OVEgoZGF0ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VUX0RBWShkYXRlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1FX0dFVF9IT1VSKHRpbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTUVfR0VUX01JTlVURSh0aW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1FX0dFVF9TRUNPTkQodGltZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNRV9HRVRfTUlDUk9TRUNPTkQodGltZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHppbmZvKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogLyoKQEAgLTM5OTksMTAgKzM5OTksMTAgQEAKIHN0YXRpYyB2b2lkCiBkYXRldGltZV9kZWFsbG9jKFB5RGF0ZVRpbWVfRGF0ZVRpbWUgKnNlbGYpCiB7Ci0JaWYgKEhBU1RaSU5GTyhzZWxmKSkgewotCQlQeV9YREVDUkVGKHNlbGYtPnR6aW5mbyk7Ci0JfQotCVB5X1RZUEUoc2VsZiktPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CisgICAgaWYgKEhBU1RaSU5GTyhzZWxmKSkgeworICAgICAgICBQeV9YREVDUkVGKHNlbGYtPnR6aW5mbyk7CisgICAgfQorICAgIFB5X1RZUEUoc2VsZiktPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIC8qCkBAIC00MDEyLDIwICs0MDEyLDIwIEBACiAvKiBUaGVzZSBhcmUgYWxsIE1FVEhfTk9BUkdTLCBzbyBkb24ndCBuZWVkIHRvIGNoZWNrIHRoZSBhcmdsaXN0LiAqLwogc3RhdGljIFB5T2JqZWN0ICoKIGRhdGV0aW1lX3V0Y29mZnNldChQeURhdGVUaW1lX0RhdGVUaW1lICpzZWxmLCBQeU9iamVjdCAqdW51c2VkKSB7Ci0JcmV0dXJuIG9mZnNldF9hc190aW1lZGVsdGEoSEFTVFpJTkZPKHNlbGYpID8gc2VsZi0+dHppbmZvIDogUHlfTm9uZSwKLQkJCQkgICAidXRjb2Zmc2V0IiwgKFB5T2JqZWN0ICopc2VsZik7CisgICAgcmV0dXJuIG9mZnNldF9hc190aW1lZGVsdGEoSEFTVFpJTkZPKHNlbGYpID8gc2VsZi0+dHppbmZvIDogUHlfTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXRjb2Zmc2V0IiwgKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkYXRldGltZV9kc3QoUHlEYXRlVGltZV9EYXRlVGltZSAqc2VsZiwgUHlPYmplY3QgKnVudXNlZCkgewotCXJldHVybiBvZmZzZXRfYXNfdGltZWRlbHRhKEhBU1RaSU5GTyhzZWxmKSA/IHNlbGYtPnR6aW5mbyA6IFB5X05vbmUsCi0JCQkJICAgImRzdCIsIChQeU9iamVjdCAqKXNlbGYpOworICAgIHJldHVybiBvZmZzZXRfYXNfdGltZWRlbHRhKEhBU1RaSU5GTyhzZWxmKSA/IHNlbGYtPnR6aW5mbyA6IFB5X05vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRzdCIsIChQeU9iamVjdCAqKXNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZGF0ZXRpbWVfdHpuYW1lKFB5RGF0ZVRpbWVfRGF0ZVRpbWUgKnNlbGYsIFB5T2JqZWN0ICp1bnVzZWQpIHsKLQlyZXR1cm4gY2FsbF90em5hbWUoSEFTVFpJTkZPKHNlbGYpID8gc2VsZi0+dHppbmZvIDogUHlfTm9uZSwKLQkJCSAgIChQeU9iamVjdCAqKXNlbGYpOworICAgIHJldHVybiBjYWxsX3R6bmFtZShIQVNUWklORk8oc2VsZikgPyBzZWxmLT50emluZm8gOiBQeV9Ob25lLAorICAgICAgICAgICAgICAgICAgICAgICAoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogLyoKQEAgLTQwMzcsMTEyICs0MDM3LDExMiBAQAogICovCiBzdGF0aWMgUHlPYmplY3QgKgogYWRkX2RhdGV0aW1lX3RpbWVkZWx0YShQeURhdGVUaW1lX0RhdGVUaW1lICpkYXRlLCBQeURhdGVUaW1lX0RlbHRhICpkZWx0YSwKLQkJICAgICAgIGludCBmYWN0b3IpCisgICAgICAgICAgICAgICAgICAgICAgIGludCBmYWN0b3IpCiB7Ci0JLyogTm90ZSB0aGF0IHRoZSBDLWxldmVsIGFkZGl0aW9ucyBjYW4ndCBvdmVyZmxvdywgYmVjYXVzZSBvZgotCSAqIGludmFyaWFudCBib3VuZHMgb24gdGhlIG1lbWJlciB2YWx1ZXMuCi0JICovCi0JaW50IHllYXIgPSBHRVRfWUVBUihkYXRlKTsKLQlpbnQgbW9udGggPSBHRVRfTU9OVEgoZGF0ZSk7Ci0JaW50IGRheSA9IEdFVF9EQVkoZGF0ZSkgKyBHRVRfVERfREFZUyhkZWx0YSkgKiBmYWN0b3I7Ci0JaW50IGhvdXIgPSBEQVRFX0dFVF9IT1VSKGRhdGUpOwotCWludCBtaW51dGUgPSBEQVRFX0dFVF9NSU5VVEUoZGF0ZSk7Ci0JaW50IHNlY29uZCA9IERBVEVfR0VUX1NFQ09ORChkYXRlKSArIEdFVF9URF9TRUNPTkRTKGRlbHRhKSAqIGZhY3RvcjsKLQlpbnQgbWljcm9zZWNvbmQgPSBEQVRFX0dFVF9NSUNST1NFQ09ORChkYXRlKSArCi0JCQkgIEdFVF9URF9NSUNST1NFQ09ORFMoZGVsdGEpICogZmFjdG9yOworICAgIC8qIE5vdGUgdGhhdCB0aGUgQy1sZXZlbCBhZGRpdGlvbnMgY2FuJ3Qgb3ZlcmZsb3csIGJlY2F1c2Ugb2YKKyAgICAgKiBpbnZhcmlhbnQgYm91bmRzIG9uIHRoZSBtZW1iZXIgdmFsdWVzLgorICAgICAqLworICAgIGludCB5ZWFyID0gR0VUX1lFQVIoZGF0ZSk7CisgICAgaW50IG1vbnRoID0gR0VUX01PTlRIKGRhdGUpOworICAgIGludCBkYXkgPSBHRVRfREFZKGRhdGUpICsgR0VUX1REX0RBWVMoZGVsdGEpICogZmFjdG9yOworICAgIGludCBob3VyID0gREFURV9HRVRfSE9VUihkYXRlKTsKKyAgICBpbnQgbWludXRlID0gREFURV9HRVRfTUlOVVRFKGRhdGUpOworICAgIGludCBzZWNvbmQgPSBEQVRFX0dFVF9TRUNPTkQoZGF0ZSkgKyBHRVRfVERfU0VDT05EUyhkZWx0YSkgKiBmYWN0b3I7CisgICAgaW50IG1pY3Jvc2Vjb25kID0gREFURV9HRVRfTUlDUk9TRUNPTkQoZGF0ZSkgKworICAgICAgICAgICAgICAgICAgICAgIEdFVF9URF9NSUNST1NFQ09ORFMoZGVsdGEpICogZmFjdG9yOwogCi0JYXNzZXJ0KGZhY3RvciA9PSAxIHx8IGZhY3RvciA9PSAtMSk7Ci0JaWYgKG5vcm1hbGl6ZV9kYXRldGltZSgmeWVhciwgJm1vbnRoLCAmZGF5LAotCQkJICAgICAgICZob3VyLCAmbWludXRlLCAmc2Vjb25kLCAmbWljcm9zZWNvbmQpIDwgMCkKLQkJcmV0dXJuIE5VTEw7Ci0JZWxzZQotCQlyZXR1cm4gbmV3X2RhdGV0aW1lKHllYXIsIG1vbnRoLCBkYXksCi0JCQkJICAgIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWNyb3NlY29uZCwKLQkJCQkgICAgSEFTVFpJTkZPKGRhdGUpID8gZGF0ZS0+dHppbmZvIDogUHlfTm9uZSk7CisgICAgYXNzZXJ0KGZhY3RvciA9PSAxIHx8IGZhY3RvciA9PSAtMSk7CisgICAgaWYgKG5vcm1hbGl6ZV9kYXRldGltZSgmeWVhciwgJm1vbnRoLCAmZGF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhvdXIsICZtaW51dGUsICZzZWNvbmQsICZtaWNyb3NlY29uZCkgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBuZXdfZGF0ZXRpbWUoeWVhciwgbW9udGgsIGRheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3VyLCBtaW51dGUsIHNlY29uZCwgbWljcm9zZWNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFTVFpJTkZPKGRhdGUpID8gZGF0ZS0+dHppbmZvIDogUHlfTm9uZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkYXRldGltZV9hZGQoUHlPYmplY3QgKmxlZnQsIFB5T2JqZWN0ICpyaWdodCkKIHsKLQlpZiAoUHlEYXRlVGltZV9DaGVjayhsZWZ0KSkgewotCQkvKiBkYXRldGltZSArID8/PyAqLwotCQlpZiAoUHlEZWx0YV9DaGVjayhyaWdodCkpCi0JCQkvKiBkYXRldGltZSArIGRlbHRhICovCi0JCQlyZXR1cm4gYWRkX2RhdGV0aW1lX3RpbWVkZWx0YSgKLQkJCQkJKFB5RGF0ZVRpbWVfRGF0ZVRpbWUgKilsZWZ0LAotCQkJCQkoUHlEYXRlVGltZV9EZWx0YSAqKXJpZ2h0LAotCQkJCQkxKTsKLQl9Ci0JZWxzZSBpZiAoUHlEZWx0YV9DaGVjayhsZWZ0KSkgewotCQkvKiBkZWx0YSArIGRhdGV0aW1lICovCi0JCXJldHVybiBhZGRfZGF0ZXRpbWVfdGltZWRlbHRhKChQeURhdGVUaW1lX0RhdGVUaW1lICopIHJpZ2h0LAotCQkJCQkgICAgICAoUHlEYXRlVGltZV9EZWx0YSAqKSBsZWZ0LAotCQkJCQkgICAgICAxKTsKLQl9Ci0JUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKLQlyZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7CisgICAgaWYgKFB5RGF0ZVRpbWVfQ2hlY2sobGVmdCkpIHsKKyAgICAgICAgLyogZGF0ZXRpbWUgKyA/Pz8gKi8KKyAgICAgICAgaWYgKFB5RGVsdGFfQ2hlY2socmlnaHQpKQorICAgICAgICAgICAgLyogZGF0ZXRpbWUgKyBkZWx0YSAqLworICAgICAgICAgICAgcmV0dXJuIGFkZF9kYXRldGltZV90aW1lZGVsdGEoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFB5RGF0ZVRpbWVfRGF0ZVRpbWUgKilsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQeURhdGVUaW1lX0RlbHRhICopcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgfQorICAgIGVsc2UgaWYgKFB5RGVsdGFfQ2hlY2sobGVmdCkpIHsKKyAgICAgICAgLyogZGVsdGEgKyBkYXRldGltZSAqLworICAgICAgICByZXR1cm4gYWRkX2RhdGV0aW1lX3RpbWVkZWx0YSgoUHlEYXRlVGltZV9EYXRlVGltZSAqKSByaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFB5RGF0ZVRpbWVfRGVsdGEgKikgbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgfQorICAgIFB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7CisgICAgcmV0dXJuIFB5X05vdEltcGxlbWVudGVkOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZGF0ZXRpbWVfc3VidHJhY3QoUHlPYmplY3QgKmxlZnQsIFB5T2JqZWN0ICpyaWdodCkKIHsKLQlQeU9iamVjdCAqcmVzdWx0ID0gUHlfTm90SW1wbGVtZW50ZWQ7CisgICAgUHlPYmplY3QgKnJlc3VsdCA9IFB5X05vdEltcGxlbWVudGVkOwogCi0JaWYgKFB5RGF0ZVRpbWVfQ2hlY2sobGVmdCkpIHsKLQkJLyogZGF0ZXRpbWUgLSA/Pz8gKi8KLQkJaWYgKFB5RGF0ZVRpbWVfQ2hlY2socmlnaHQpKSB7Ci0JCQkvKiBkYXRldGltZSAtIGRhdGV0aW1lICovCi0JCQluYWl2ZXR5IG4xLCBuMjsKLQkJCWludCBvZmZzZXQxLCBvZmZzZXQyOwotCQkJaW50IGRlbHRhX2QsIGRlbHRhX3MsIGRlbHRhX3VzOworICAgIGlmIChQeURhdGVUaW1lX0NoZWNrKGxlZnQpKSB7CisgICAgICAgIC8qIGRhdGV0aW1lIC0gPz8/ICovCisgICAgICAgIGlmIChQeURhdGVUaW1lX0NoZWNrKHJpZ2h0KSkgeworICAgICAgICAgICAgLyogZGF0ZXRpbWUgLSBkYXRldGltZSAqLworICAgICAgICAgICAgbmFpdmV0eSBuMSwgbjI7CisgICAgICAgICAgICBpbnQgb2Zmc2V0MSwgb2Zmc2V0MjsKKyAgICAgICAgICAgIGludCBkZWx0YV9kLCBkZWx0YV9zLCBkZWx0YV91czsKIAotCQkJaWYgKGNsYXNzaWZ5X3R3b191dGNvZmZzZXRzKGxlZnQsICZvZmZzZXQxLCAmbjEsIGxlZnQsCi0JCQkJCQkgICAgcmlnaHQsICZvZmZzZXQyLCAmbjIsCi0JCQkJCQkgICAgcmlnaHQpIDwgMCkKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCWFzc2VydChuMSAhPSBPRkZTRVRfVU5LTk9XTiAmJiBuMiAhPSBPRkZTRVRfVU5LTk9XTik7Ci0JCQlpZiAobjEgIT0gbjIpIHsKLQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCQkiY2FuJ3Qgc3VidHJhY3Qgb2Zmc2V0LW5haXZlIGFuZCAiCi0JCQkJCSJvZmZzZXQtYXdhcmUgZGF0ZXRpbWVzIik7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCQlkZWx0YV9kID0geW1kX3RvX29yZChHRVRfWUVBUihsZWZ0KSwKLQkJCQkJICAgICBHRVRfTU9OVEgobGVmdCksCi0JCQkJCSAgICAgR0VUX0RBWShsZWZ0KSkgLQotCQkJCSAgeW1kX3RvX29yZChHRVRfWUVBUihyaWdodCksCi0JCQkJCSAgICAgR0VUX01PTlRIKHJpZ2h0KSwKLQkJCQkJICAgICBHRVRfREFZKHJpZ2h0KSk7Ci0JCQkvKiBUaGVzZSBjYW4ndCBvdmVyZmxvdywgc2luY2UgdGhlIHZhbHVlcyBhcmUKLQkJCSAqIG5vcm1hbGl6ZWQuICBBdCBtb3N0IHRoaXMgZ2l2ZXMgdGhlIG51bWJlciBvZgotCQkJICogc2Vjb25kcyBpbiBvbmUgZGF5LgotCQkJICovCi0JCQlkZWx0YV9zID0gKERBVEVfR0VUX0hPVVIobGVmdCkgLQotCQkJCSAgIERBVEVfR0VUX0hPVVIocmlnaHQpKSAqIDM2MDAgKwotCQkJICAgICAgICAgIChEQVRFX0dFVF9NSU5VVEUobGVmdCkgLQotCQkJICAgICAgICAgICBEQVRFX0dFVF9NSU5VVEUocmlnaHQpKSAqIDYwICsKLQkJCQkgIChEQVRFX0dFVF9TRUNPTkQobGVmdCkgLQotCQkJCSAgIERBVEVfR0VUX1NFQ09ORChyaWdodCkpOwotCQkJZGVsdGFfdXMgPSBEQVRFX0dFVF9NSUNST1NFQ09ORChsZWZ0KSAtCi0JCQkJICAgREFURV9HRVRfTUlDUk9TRUNPTkQocmlnaHQpOwotCQkJLyogKGxlZnQgLSBvZmZzZXQxKSAtIChyaWdodCAtIG9mZnNldDIpID0KLQkJCSAqIChsZWZ0IC0gcmlnaHQpICsgKG9mZnNldDIgLSBvZmZzZXQxKQotCQkJICovCi0JCQlkZWx0YV9zICs9IChvZmZzZXQyIC0gb2Zmc2V0MSkgKiA2MDsKLQkJCXJlc3VsdCA9IG5ld19kZWx0YShkZWx0YV9kLCBkZWx0YV9zLCBkZWx0YV91cywgMSk7Ci0JCX0KLQkJZWxzZSBpZiAoUHlEZWx0YV9DaGVjayhyaWdodCkpIHsKLQkJCS8qIGRhdGV0aW1lIC0gZGVsdGEgKi8KLQkJCXJlc3VsdCA9IGFkZF9kYXRldGltZV90aW1lZGVsdGEoCi0JCQkJCShQeURhdGVUaW1lX0RhdGVUaW1lICopbGVmdCwKLQkJCQkJKFB5RGF0ZVRpbWVfRGVsdGEgKilyaWdodCwKLQkJCQkJLTEpOwotCQl9Ci0JfQorICAgICAgICAgICAgaWYgKGNsYXNzaWZ5X3R3b191dGNvZmZzZXRzKGxlZnQsICZvZmZzZXQxLCAmbjEsIGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQsICZvZmZzZXQyLCAmbjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIGFzc2VydChuMSAhPSBPRkZTRVRfVU5LTk9XTiAmJiBuMiAhPSBPRkZTRVRfVU5LTk9XTik7CisgICAgICAgICAgICBpZiAobjEgIT0gbjIpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAiY2FuJ3Qgc3VidHJhY3Qgb2Zmc2V0LW5haXZlIGFuZCAiCisgICAgICAgICAgICAgICAgICAgICJvZmZzZXQtYXdhcmUgZGF0ZXRpbWVzIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWx0YV9kID0geW1kX3RvX29yZChHRVRfWUVBUihsZWZ0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9NT05USChsZWZ0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9EQVkobGVmdCkpIC0KKyAgICAgICAgICAgICAgICAgICAgICB5bWRfdG9fb3JkKEdFVF9ZRUFSKHJpZ2h0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9NT05USChyaWdodCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRVRfREFZKHJpZ2h0KSk7CisgICAgICAgICAgICAvKiBUaGVzZSBjYW4ndCBvdmVyZmxvdywgc2luY2UgdGhlIHZhbHVlcyBhcmUKKyAgICAgICAgICAgICAqIG5vcm1hbGl6ZWQuICBBdCBtb3N0IHRoaXMgZ2l2ZXMgdGhlIG51bWJlciBvZgorICAgICAgICAgICAgICogc2Vjb25kcyBpbiBvbmUgZGF5LgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBkZWx0YV9zID0gKERBVEVfR0VUX0hPVVIobGVmdCkgLQorICAgICAgICAgICAgICAgICAgICAgICBEQVRFX0dFVF9IT1VSKHJpZ2h0KSkgKiAzNjAwICsKKyAgICAgICAgICAgICAgICAgICAgICAoREFURV9HRVRfTUlOVVRFKGxlZnQpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgREFURV9HRVRfTUlOVVRFKHJpZ2h0KSkgKiA2MCArCisgICAgICAgICAgICAgICAgICAgICAgKERBVEVfR0VUX1NFQ09ORChsZWZ0KSAtCisgICAgICAgICAgICAgICAgICAgICAgIERBVEVfR0VUX1NFQ09ORChyaWdodCkpOworICAgICAgICAgICAgZGVsdGFfdXMgPSBEQVRFX0dFVF9NSUNST1NFQ09ORChsZWZ0KSAtCisgICAgICAgICAgICAgICAgICAgICAgIERBVEVfR0VUX01JQ1JPU0VDT05EKHJpZ2h0KTsKKyAgICAgICAgICAgIC8qIChsZWZ0IC0gb2Zmc2V0MSkgLSAocmlnaHQgLSBvZmZzZXQyKSA9CisgICAgICAgICAgICAgKiAobGVmdCAtIHJpZ2h0KSArIChvZmZzZXQyIC0gb2Zmc2V0MSkKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgZGVsdGFfcyArPSAob2Zmc2V0MiAtIG9mZnNldDEpICogNjA7CisgICAgICAgICAgICByZXN1bHQgPSBuZXdfZGVsdGEoZGVsdGFfZCwgZGVsdGFfcywgZGVsdGFfdXMsIDEpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKFB5RGVsdGFfQ2hlY2socmlnaHQpKSB7CisgICAgICAgICAgICAvKiBkYXRldGltZSAtIGRlbHRhICovCisgICAgICAgICAgICByZXN1bHQgPSBhZGRfZGF0ZXRpbWVfdGltZWRlbHRhKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQeURhdGVUaW1lX0RhdGVUaW1lICopbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUHlEYXRlVGltZV9EZWx0YSAqKXJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xKTsKKyAgICAgICAgfQorICAgIH0KIAotCWlmIChyZXN1bHQgPT0gUHlfTm90SW1wbGVtZW50ZWQpCi0JCVB5X0lOQ1JFRihyZXN1bHQpOwotCXJldHVybiByZXN1bHQ7CisgICAgaWYgKHJlc3VsdCA9PSBQeV9Ob3RJbXBsZW1lbnRlZCkKKyAgICAgICAgUHlfSU5DUkVGKHJlc3VsdCk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogLyogVmFyaW91cyB3YXlzIHRvIHR1cm4gYSBkYXRldGltZSBpbnRvIGEgc3RyaW5nLiAqLwpAQCAtNDE1MCw4MyArNDE1MCw4MyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGRhdGV0aW1lX3JlcHIoUHlEYXRlVGltZV9EYXRlVGltZSAqc2VsZikKIHsKLQljaGFyIGJ1ZmZlclsxMDAwXTsKLQljb25zdCBjaGFyICp0eXBlX25hbWUgPSBQeV9UWVBFKHNlbGYpLT50cF9uYW1lOwotCVB5T2JqZWN0ICpiYXNlcmVwcjsKKyAgICBjaGFyIGJ1ZmZlclsxMDAwXTsKKyAgICBjb25zdCBjaGFyICp0eXBlX25hbWUgPSBQeV9UWVBFKHNlbGYpLT50cF9uYW1lOworICAgIFB5T2JqZWN0ICpiYXNlcmVwcjsKIAotCWlmIChEQVRFX0dFVF9NSUNST1NFQ09ORChzZWxmKSkgewotCQlQeU9TX3NucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksCi0JCQkgICAgICAiJXMoJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgJWQpIiwKLQkJCSAgICAgIHR5cGVfbmFtZSwKLQkJCSAgICAgIEdFVF9ZRUFSKHNlbGYpLCBHRVRfTU9OVEgoc2VsZiksIEdFVF9EQVkoc2VsZiksCi0JCQkgICAgICBEQVRFX0dFVF9IT1VSKHNlbGYpLCBEQVRFX0dFVF9NSU5VVEUoc2VsZiksCi0JCQkgICAgICBEQVRFX0dFVF9TRUNPTkQoc2VsZiksCi0JCQkgICAgICBEQVRFX0dFVF9NSUNST1NFQ09ORChzZWxmKSk7Ci0JfQotCWVsc2UgaWYgKERBVEVfR0VUX1NFQ09ORChzZWxmKSkgewotCQlQeU9TX3NucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksCi0JCQkgICAgICAiJXMoJWQsICVkLCAlZCwgJWQsICVkLCAlZCkiLAotCQkJICAgICAgdHlwZV9uYW1lLAotCQkJICAgICAgR0VUX1lFQVIoc2VsZiksIEdFVF9NT05USChzZWxmKSwgR0VUX0RBWShzZWxmKSwKLQkJCSAgICAgIERBVEVfR0VUX0hPVVIoc2VsZiksIERBVEVfR0VUX01JTlVURShzZWxmKSwKLQkJCSAgICAgIERBVEVfR0VUX1NFQ09ORChzZWxmKSk7Ci0JfQotCWVsc2UgewotCQlQeU9TX3NucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksCi0JCQkgICAgICAiJXMoJWQsICVkLCAlZCwgJWQsICVkKSIsCi0JCQkgICAgICB0eXBlX25hbWUsCi0JCQkgICAgICBHRVRfWUVBUihzZWxmKSwgR0VUX01PTlRIKHNlbGYpLCBHRVRfREFZKHNlbGYpLAotCQkJICAgICAgREFURV9HRVRfSE9VUihzZWxmKSwgREFURV9HRVRfTUlOVVRFKHNlbGYpKTsKLQl9Ci0JYmFzZXJlcHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1ZmZlcik7Ci0JaWYgKGJhc2VyZXByID09IE5VTEwgfHwgISBIQVNUWklORk8oc2VsZikpCi0JCXJldHVybiBiYXNlcmVwcjsKLQlyZXR1cm4gYXBwZW5kX2tleXdvcmRfdHppbmZvKGJhc2VyZXByLCBzZWxmLT50emluZm8pOworICAgIGlmIChEQVRFX0dFVF9NSUNST1NFQ09ORChzZWxmKSkgeworICAgICAgICBQeU9TX3NucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksCisgICAgICAgICAgICAgICAgICAgICAgIiVzKCVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgdHlwZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgIEdFVF9ZRUFSKHNlbGYpLCBHRVRfTU9OVEgoc2VsZiksIEdFVF9EQVkoc2VsZiksCisgICAgICAgICAgICAgICAgICAgICAgREFURV9HRVRfSE9VUihzZWxmKSwgREFURV9HRVRfTUlOVVRFKHNlbGYpLAorICAgICAgICAgICAgICAgICAgICAgIERBVEVfR0VUX1NFQ09ORChzZWxmKSwKKyAgICAgICAgICAgICAgICAgICAgICBEQVRFX0dFVF9NSUNST1NFQ09ORChzZWxmKSk7CisgICAgfQorICAgIGVsc2UgaWYgKERBVEVfR0VUX1NFQ09ORChzZWxmKSkgeworICAgICAgICBQeU9TX3NucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksCisgICAgICAgICAgICAgICAgICAgICAgIiVzKCVkLCAlZCwgJWQsICVkLCAlZCwgJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICB0eXBlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgR0VUX1lFQVIoc2VsZiksIEdFVF9NT05USChzZWxmKSwgR0VUX0RBWShzZWxmKSwKKyAgICAgICAgICAgICAgICAgICAgICBEQVRFX0dFVF9IT1VSKHNlbGYpLCBEQVRFX0dFVF9NSU5VVEUoc2VsZiksCisgICAgICAgICAgICAgICAgICAgICAgREFURV9HRVRfU0VDT05EKHNlbGYpKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5T1Nfc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAiJXMoJWQsICVkLCAlZCwgJWQsICVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgdHlwZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgIEdFVF9ZRUFSKHNlbGYpLCBHRVRfTU9OVEgoc2VsZiksIEdFVF9EQVkoc2VsZiksCisgICAgICAgICAgICAgICAgICAgICAgREFURV9HRVRfSE9VUihzZWxmKSwgREFURV9HRVRfTUlOVVRFKHNlbGYpKTsKKyAgICB9CisgICAgYmFzZXJlcHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1ZmZlcik7CisgICAgaWYgKGJhc2VyZXByID09IE5VTEwgfHwgISBIQVNUWklORk8oc2VsZikpCisgICAgICAgIHJldHVybiBiYXNlcmVwcjsKKyAgICByZXR1cm4gYXBwZW5kX2tleXdvcmRfdHppbmZvKGJhc2VyZXByLCBzZWxmLT50emluZm8pOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZGF0ZXRpbWVfc3RyKFB5RGF0ZVRpbWVfRGF0ZVRpbWUgKnNlbGYpCiB7Ci0JcmV0dXJuIFB5T2JqZWN0X0NhbGxNZXRob2QoKFB5T2JqZWN0ICopc2VsZiwgImlzb2Zvcm1hdCIsICIocykiLCAiICIpOworICAgIHJldHVybiBQeU9iamVjdF9DYWxsTWV0aG9kKChQeU9iamVjdCAqKXNlbGYsICJpc29mb3JtYXQiLCAiKHMpIiwgIiAiKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRhdGV0aW1lX2lzb2Zvcm1hdChQeURhdGVUaW1lX0RhdGVUaW1lICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3KQogewotCWNoYXIgc2VwID0gJ1QnOwotCXN0YXRpYyBjaGFyICprZXl3b3Jkc1tdID0geyJzZXAiLCBOVUxMfTsKLQljaGFyIGJ1ZmZlclsxMDBdOwotCWNoYXIgKmNwOwotCVB5T2JqZWN0ICpyZXN1bHQ7CisgICAgY2hhciBzZXAgPSAnVCc7CisgICAgc3RhdGljIGNoYXIgKmtleXdvcmRzW10gPSB7InNlcCIsIE5VTEx9OworICAgIGNoYXIgYnVmZmVyWzEwMF07CisgICAgY2hhciAqY3A7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3LCAifGM6aXNvZm9ybWF0Iiwga2V5d29yZHMsCi0JCQkJCSAmc2VwKSkKLQkJcmV0dXJuIE5VTEw7Ci0JY3AgPSBpc29mb3JtYXRfZGF0ZSgoUHlEYXRlVGltZV9EYXRlICopc2VsZiwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7Ci0JYXNzZXJ0KGNwICE9IE5VTEwpOwotCSpjcCsrID0gc2VwOwotCWNwID0gaXNvZm9ybWF0X3RpbWUoc2VsZiwgY3AsIHNpemVvZihidWZmZXIpIC0gKGNwIC0gYnVmZmVyKSk7Ci0JcmVzdWx0ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoYnVmZmVyLCBjcCAtIGJ1ZmZlcik7Ci0JaWYgKHJlc3VsdCA9PSBOVUxMIHx8ICEgSEFTVFpJTkZPKHNlbGYpKQotCQlyZXR1cm4gcmVzdWx0OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3LCAifGM6aXNvZm9ybWF0Iiwga2V5d29yZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlcCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGNwID0gaXNvZm9ybWF0X2RhdGUoKFB5RGF0ZVRpbWVfRGF0ZSAqKXNlbGYsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOworICAgIGFzc2VydChjcCAhPSBOVUxMKTsKKyAgICAqY3ArKyA9IHNlcDsKKyAgICBjcCA9IGlzb2Zvcm1hdF90aW1lKHNlbGYsIGNwLCBzaXplb2YoYnVmZmVyKSAtIChjcCAtIGJ1ZmZlcikpOworICAgIHJlc3VsdCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGJ1ZmZlciwgY3AgLSBidWZmZXIpOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCB8fCAhIEhBU1RaSU5GTyhzZWxmKSkKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKIAotCS8qIFdlIG5lZWQgdG8gYXBwZW5kIHRoZSBVVEMgb2Zmc2V0LiAqLwotCWlmIChmb3JtYXRfdXRjb2Zmc2V0KGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICI6Iiwgc2VsZi0+dHppbmZvLAotCQkJICAgICAoUHlPYmplY3QgKilzZWxmKSA8IDApIHsKLQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlQeVN0cmluZ19Db25jYXRBbmREZWwoJnJlc3VsdCwgUHlTdHJpbmdfRnJvbVN0cmluZyhidWZmZXIpKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIC8qIFdlIG5lZWQgdG8gYXBwZW5kIHRoZSBVVEMgb2Zmc2V0LiAqLworICAgIGlmIChmb3JtYXRfdXRjb2Zmc2V0KGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICI6Iiwgc2VsZi0+dHppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgIChQeU9iamVjdCAqKXNlbGYpIDwgMCkgeworICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5U3RyaW5nX0NvbmNhdEFuZERlbCgmcmVzdWx0LCBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1ZmZlcikpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkYXRldGltZV9jdGltZShQeURhdGVUaW1lX0RhdGVUaW1lICpzZWxmKQogewotCXJldHVybiBmb3JtYXRfY3RpbWUoKFB5RGF0ZVRpbWVfRGF0ZSAqKXNlbGYsCi0JCQkgICAgREFURV9HRVRfSE9VUihzZWxmKSwKLQkJCSAgICBEQVRFX0dFVF9NSU5VVEUoc2VsZiksCi0JCQkgICAgREFURV9HRVRfU0VDT05EKHNlbGYpKTsKKyAgICByZXR1cm4gZm9ybWF0X2N0aW1lKChQeURhdGVUaW1lX0RhdGUgKilzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgREFURV9HRVRfSE9VUihzZWxmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIERBVEVfR0VUX01JTlVURShzZWxmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIERBVEVfR0VUX1NFQ09ORChzZWxmKSk7CiB9CiAKIC8qIE1pc2NlbGxhbmVvdXMgbWV0aG9kcy4gKi8KQEAgLTQyMzgsMjk4ICs0MjM4LDI5OCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGRhdGV0aW1lX3JpY2hjb21wYXJlKFB5RGF0ZVRpbWVfRGF0ZVRpbWUgKnNlbGYsIFB5T2JqZWN0ICpvdGhlciwgaW50IG9wKQogewotCWludCBkaWZmOwotCW5haXZldHkgbjEsIG4yOwotCWludCBvZmZzZXQxLCBvZmZzZXQyOworICAgIGludCBkaWZmOworICAgIG5haXZldHkgbjEsIG4yOworICAgIGludCBvZmZzZXQxLCBvZmZzZXQyOwogCi0JaWYgKCEgUHlEYXRlVGltZV9DaGVjayhvdGhlcikpIHsKLQkJLyogSWYgb3RoZXIgaGFzIGEgInRpbWV0dXBsZSIgYXR0ciwgdGhhdCdzIGFuIGFkdmVydGlzZWQKLQkJICogaG9vayBmb3Igb3RoZXIgY2xhc3NlcyB0byBhc2sgdG8gZ2V0IGNvbXBhcmlzb24gY29udHJvbC4KLQkJICogSG93ZXZlciwgZGF0ZSBpbnN0YW5jZXMgaGF2ZSBhIHRpbWV0dXBsZSBhdHRyLCBhbmQgd2UKLQkJICogZG9uJ3Qgd2FudCB0byBhbGxvdyB0aGF0IGNvbXBhcmlzb24uICBCZWNhdXNlIGRhdGV0aW1lCi0JCSAqIGlzIGEgc3ViY2xhc3Mgb2YgZGF0ZSwgd2hlbiBtaXhpbmcgZGF0ZSBhbmQgZGF0ZXRpbWUKLQkJICogaW4gYSBjb21wYXJpc29uLCBQeXRob24gZ2l2ZXMgZGF0ZXRpbWUgdGhlIGZpcnN0IHNob3QKLQkJICogKGl0J3MgdGhlIG1vcmUgc3BlY2lmaWMgc3VidHlwZSkuICBTbyB3ZSBjYW4gc3RvcCB0aGF0Ci0JCSAqIGNvbWJpbmF0aW9uIGhlcmUgcmVsaWFibHkuCi0JCSAqLwotCQlpZiAoUHlPYmplY3RfSGFzQXR0clN0cmluZyhvdGhlciwgInRpbWV0dXBsZSIpICYmCi0JCSAgICAhIFB5RGF0ZV9DaGVjayhvdGhlcikpIHsKLQkJCS8qIEEgaG9vayBmb3Igb3RoZXIga2luZHMgb2YgZGF0ZXRpbWUgb2JqZWN0cy4gKi8KLQkJCVB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7Ci0JCQlyZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7Ci0JCX0KLQkJaWYgKG9wID09IFB5X0VRIHx8IG9wID09IFB5X05FKSB7Ci0JCQlQeU9iamVjdCAqcmVzdWx0ID0gb3AgPT0gUHlfRVEgPyBQeV9GYWxzZSA6IFB5X1RydWU7Ci0JCQlQeV9JTkNSRUYocmVzdWx0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJLyogU3RvcCB0aGlzIGZyb20gZmFsbGluZyBiYWNrIHRvIGFkZHJlc3MgY29tcGFyaXNvbi4gKi8KLQkJcmV0dXJuIGNtcGVycm9yKChQeU9iamVjdCAqKXNlbGYsIG90aGVyKTsKLQl9CisgICAgaWYgKCEgUHlEYXRlVGltZV9DaGVjayhvdGhlcikpIHsKKyAgICAgICAgLyogSWYgb3RoZXIgaGFzIGEgInRpbWV0dXBsZSIgYXR0ciwgdGhhdCdzIGFuIGFkdmVydGlzZWQKKyAgICAgICAgICogaG9vayBmb3Igb3RoZXIgY2xhc3NlcyB0byBhc2sgdG8gZ2V0IGNvbXBhcmlzb24gY29udHJvbC4KKyAgICAgICAgICogSG93ZXZlciwgZGF0ZSBpbnN0YW5jZXMgaGF2ZSBhIHRpbWV0dXBsZSBhdHRyLCBhbmQgd2UKKyAgICAgICAgICogZG9uJ3Qgd2FudCB0byBhbGxvdyB0aGF0IGNvbXBhcmlzb24uICBCZWNhdXNlIGRhdGV0aW1lCisgICAgICAgICAqIGlzIGEgc3ViY2xhc3Mgb2YgZGF0ZSwgd2hlbiBtaXhpbmcgZGF0ZSBhbmQgZGF0ZXRpbWUKKyAgICAgICAgICogaW4gYSBjb21wYXJpc29uLCBQeXRob24gZ2l2ZXMgZGF0ZXRpbWUgdGhlIGZpcnN0IHNob3QKKyAgICAgICAgICogKGl0J3MgdGhlIG1vcmUgc3BlY2lmaWMgc3VidHlwZSkuICBTbyB3ZSBjYW4gc3RvcCB0aGF0CisgICAgICAgICAqIGNvbWJpbmF0aW9uIGhlcmUgcmVsaWFibHkuCisgICAgICAgICAqLworICAgICAgICBpZiAoUHlPYmplY3RfSGFzQXR0clN0cmluZyhvdGhlciwgInRpbWV0dXBsZSIpICYmCisgICAgICAgICAgICAhIFB5RGF0ZV9DaGVjayhvdGhlcikpIHsKKyAgICAgICAgICAgIC8qIEEgaG9vayBmb3Igb3RoZXIga2luZHMgb2YgZGF0ZXRpbWUgb2JqZWN0cy4gKi8KKyAgICAgICAgICAgIFB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7CisgICAgICAgICAgICByZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG9wID09IFB5X0VRIHx8IG9wID09IFB5X05FKSB7CisgICAgICAgICAgICBQeU9iamVjdCAqcmVzdWx0ID0gb3AgPT0gUHlfRVEgPyBQeV9GYWxzZSA6IFB5X1RydWU7CisgICAgICAgICAgICBQeV9JTkNSRUYocmVzdWx0KTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgLyogU3RvcCB0aGlzIGZyb20gZmFsbGluZyBiYWNrIHRvIGFkZHJlc3MgY29tcGFyaXNvbi4gKi8KKyAgICAgICAgcmV0dXJuIGNtcGVycm9yKChQeU9iamVjdCAqKXNlbGYsIG90aGVyKTsKKyAgICB9CiAKLQlpZiAoY2xhc3NpZnlfdHdvX3V0Y29mZnNldHMoKFB5T2JqZWN0ICopc2VsZiwgJm9mZnNldDEsICZuMSwKLQkJCQkgICAgKFB5T2JqZWN0ICopc2VsZiwKLQkJCQkgICAgIG90aGVyLCAmb2Zmc2V0MiwgJm4yLAotCQkJCSAgICAgb3RoZXIpIDwgMCkKLQkJcmV0dXJuIE5VTEw7Ci0JYXNzZXJ0KG4xICE9IE9GRlNFVF9VTktOT1dOICYmIG4yICE9IE9GRlNFVF9VTktOT1dOKTsKLSAJLyogSWYgdGhleSdyZSBib3RoIG5haXZlLCBvciBib3RoIGF3YXJlIGFuZCBoYXZlIHRoZSBzYW1lIG9mZnNldHMsCi0JICogd2UgZ2V0IG9mZiBjaGVhcC4gIE5vdGUgdGhhdCBpZiB0aGV5J3JlIGJvdGggbmFpdmUsIG9mZnNldDEgPT0KLQkgKiBvZmZzZXQyID09IDAgYXQgdGhpcyBwb2ludC4KLQkgKi8KLQlpZiAobjEgPT0gbjIgJiYgb2Zmc2V0MSA9PSBvZmZzZXQyKSB7Ci0JCWRpZmYgPSBtZW1jbXAoc2VsZi0+ZGF0YSwgKChQeURhdGVUaW1lX0RhdGVUaW1lICopb3RoZXIpLT5kYXRhLAotCQkJICAgICAgX1B5RGF0ZVRpbWVfREFURVRJTUVfREFUQVNJWkUpOwotCQlyZXR1cm4gZGlmZl90b19ib29sKGRpZmYsIG9wKTsKLQl9CisgICAgaWYgKGNsYXNzaWZ5X3R3b191dGNvZmZzZXRzKChQeU9iamVjdCAqKXNlbGYsICZvZmZzZXQxLCAmbjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQeU9iamVjdCAqKXNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlciwgJm9mZnNldDIsICZuMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGFzc2VydChuMSAhPSBPRkZTRVRfVU5LTk9XTiAmJiBuMiAhPSBPRkZTRVRfVU5LTk9XTik7CisgICAgLyogSWYgdGhleSdyZSBib3RoIG5haXZlLCBvciBib3RoIGF3YXJlIGFuZCBoYXZlIHRoZSBzYW1lIG9mZnNldHMsCisgICAgICogd2UgZ2V0IG9mZiBjaGVhcC4gIE5vdGUgdGhhdCBpZiB0aGV5J3JlIGJvdGggbmFpdmUsIG9mZnNldDEgPT0KKyAgICAgKiBvZmZzZXQyID09IDAgYXQgdGhpcyBwb2ludC4KKyAgICAgKi8KKyAgICBpZiAobjEgPT0gbjIgJiYgb2Zmc2V0MSA9PSBvZmZzZXQyKSB7CisgICAgICAgIGRpZmYgPSBtZW1jbXAoc2VsZi0+ZGF0YSwgKChQeURhdGVUaW1lX0RhdGVUaW1lICopb3RoZXIpLT5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgIF9QeURhdGVUaW1lX0RBVEVUSU1FX0RBVEFTSVpFKTsKKyAgICAgICAgcmV0dXJuIGRpZmZfdG9fYm9vbChkaWZmLCBvcCk7CisgICAgfQogCi0JaWYgKG4xID09IE9GRlNFVF9BV0FSRSAmJiBuMiA9PSBPRkZTRVRfQVdBUkUpIHsKLQkJUHlEYXRlVGltZV9EZWx0YSAqZGVsdGE7CisgICAgaWYgKG4xID09IE9GRlNFVF9BV0FSRSAmJiBuMiA9PSBPRkZTRVRfQVdBUkUpIHsKKyAgICAgICAgUHlEYXRlVGltZV9EZWx0YSAqZGVsdGE7CiAKLQkJYXNzZXJ0KG9mZnNldDEgIT0gb2Zmc2V0Mik7CS8qIGVsc2UgbGFzdCAiaWYiIGhhbmRsZWQgaXQgKi8KLQkJZGVsdGEgPSAoUHlEYXRlVGltZV9EZWx0YSAqKWRhdGV0aW1lX3N1YnRyYWN0KChQeU9iamVjdCAqKXNlbGYsCi0JCQkJCQkJICAgICAgIG90aGVyKTsKLQkJaWYgKGRlbHRhID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQkJZGlmZiA9IEdFVF9URF9EQVlTKGRlbHRhKTsKLQkJaWYgKGRpZmYgPT0gMCkKLQkJCWRpZmYgPSBHRVRfVERfU0VDT05EUyhkZWx0YSkgfAotCQkJICAgICAgIEdFVF9URF9NSUNST1NFQ09ORFMoZGVsdGEpOwotCQlQeV9ERUNSRUYoZGVsdGEpOwotCQlyZXR1cm4gZGlmZl90b19ib29sKGRpZmYsIG9wKTsKLQl9CisgICAgICAgIGFzc2VydChvZmZzZXQxICE9IG9mZnNldDIpOyAgICAgICAgICAgICAvKiBlbHNlIGxhc3QgImlmIiBoYW5kbGVkIGl0ICovCisgICAgICAgIGRlbHRhID0gKFB5RGF0ZVRpbWVfRGVsdGEgKilkYXRldGltZV9zdWJ0cmFjdCgoUHlPYmplY3QgKilzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyKTsKKyAgICAgICAgaWYgKGRlbHRhID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgZGlmZiA9IEdFVF9URF9EQVlTKGRlbHRhKTsKKyAgICAgICAgaWYgKGRpZmYgPT0gMCkKKyAgICAgICAgICAgIGRpZmYgPSBHRVRfVERfU0VDT05EUyhkZWx0YSkgfAorICAgICAgICAgICAgICAgICAgIEdFVF9URF9NSUNST1NFQ09ORFMoZGVsdGEpOworICAgICAgICBQeV9ERUNSRUYoZGVsdGEpOworICAgICAgICByZXR1cm4gZGlmZl90b19ib29sKGRpZmYsIG9wKTsKKyAgICB9CiAKLQlhc3NlcnQobjEgIT0gbjIpOwotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkiY2FuJ3QgY29tcGFyZSBvZmZzZXQtbmFpdmUgYW5kICIKLQkJCSJvZmZzZXQtYXdhcmUgZGF0ZXRpbWVzIik7Ci0JcmV0dXJuIE5VTEw7CisgICAgYXNzZXJ0KG4xICE9IG4yKTsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAiY2FuJ3QgY29tcGFyZSBvZmZzZXQtbmFpdmUgYW5kICIKKyAgICAgICAgICAgICAgICAgICAgIm9mZnNldC1hd2FyZSBkYXRldGltZXMiKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIGxvbmcKIGRhdGV0aW1lX2hhc2goUHlEYXRlVGltZV9EYXRlVGltZSAqc2VsZikKIHsKLQlpZiAoc2VsZi0+aGFzaGNvZGUgPT0gLTEpIHsKLQkJbmFpdmV0eSBuOwotCQlpbnQgb2Zmc2V0OwotCQlQeU9iamVjdCAqdGVtcDsKKyAgICBpZiAoc2VsZi0+aGFzaGNvZGUgPT0gLTEpIHsKKyAgICAgICAgbmFpdmV0eSBuOworICAgICAgICBpbnQgb2Zmc2V0OworICAgICAgICBQeU9iamVjdCAqdGVtcDsKIAotCQluID0gY2xhc3NpZnlfdXRjb2Zmc2V0KChQeU9iamVjdCAqKXNlbGYsIChQeU9iamVjdCAqKXNlbGYsCi0JCQkJICAgICAgICZvZmZzZXQpOwotCQlhc3NlcnQobiAhPSBPRkZTRVRfVU5LTk9XTik7Ci0JCWlmIChuID09IE9GRlNFVF9FUlJPUikKLQkJCXJldHVybiAtMTsKKyAgICAgICAgbiA9IGNsYXNzaWZ5X3V0Y29mZnNldCgoUHlPYmplY3QgKilzZWxmLCAoUHlPYmplY3QgKilzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvZmZzZXQpOworICAgICAgICBhc3NlcnQobiAhPSBPRkZTRVRfVU5LTk9XTik7CisgICAgICAgIGlmIChuID09IE9GRlNFVF9FUlJPUikKKyAgICAgICAgICAgIHJldHVybiAtMTsKIAotCQkvKiBSZWR1Y2UgdGhpcyB0byBhIGhhc2ggb2YgYW5vdGhlciBvYmplY3QuICovCi0JCWlmIChuID09IE9GRlNFVF9OQUlWRSkKLQkJCXRlbXAgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgKLQkJCQkJKGNoYXIgKilzZWxmLT5kYXRhLAotCQkJCQlfUHlEYXRlVGltZV9EQVRFVElNRV9EQVRBU0laRSk7Ci0JCWVsc2UgewotCQkJaW50IGRheXM7Ci0JCQlpbnQgc2Vjb25kczsKKyAgICAgICAgLyogUmVkdWNlIHRoaXMgdG8gYSBoYXNoIG9mIGFub3RoZXIgb2JqZWN0LiAqLworICAgICAgICBpZiAobiA9PSBPRkZTRVRfTkFJVkUpCisgICAgICAgICAgICB0ZW1wID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKilzZWxmLT5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9QeURhdGVUaW1lX0RBVEVUSU1FX0RBVEFTSVpFKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpbnQgZGF5czsKKyAgICAgICAgICAgIGludCBzZWNvbmRzOwogCi0JCQlhc3NlcnQobiA9PSBPRkZTRVRfQVdBUkUpOwotCQkJYXNzZXJ0KEhBU1RaSU5GTyhzZWxmKSk7Ci0JCQlkYXlzID0geW1kX3RvX29yZChHRVRfWUVBUihzZWxmKSwKLQkJCQkJICBHRVRfTU9OVEgoc2VsZiksCi0JCQkJCSAgR0VUX0RBWShzZWxmKSk7Ci0JCQlzZWNvbmRzID0gREFURV9HRVRfSE9VUihzZWxmKSAqIDM2MDAgKwotCQkJCSAgKERBVEVfR0VUX01JTlVURShzZWxmKSAtIG9mZnNldCkgKiA2MCArCi0JCQkJICBEQVRFX0dFVF9TRUNPTkQoc2VsZik7Ci0JCQl0ZW1wID0gbmV3X2RlbHRhKGRheXMsCi0JCQkJCSBzZWNvbmRzLAotCQkJCQkgREFURV9HRVRfTUlDUk9TRUNPTkQoc2VsZiksCi0JCQkJCSAxKTsKLQkJfQotCQlpZiAodGVtcCAhPSBOVUxMKSB7Ci0JCQlzZWxmLT5oYXNoY29kZSA9IFB5T2JqZWN0X0hhc2godGVtcCk7Ci0JCQlQeV9ERUNSRUYodGVtcCk7Ci0JCX0KLQl9Ci0JcmV0dXJuIHNlbGYtPmhhc2hjb2RlOworICAgICAgICAgICAgYXNzZXJ0KG4gPT0gT0ZGU0VUX0FXQVJFKTsKKyAgICAgICAgICAgIGFzc2VydChIQVNUWklORk8oc2VsZikpOworICAgICAgICAgICAgZGF5cyA9IHltZF90b19vcmQoR0VUX1lFQVIoc2VsZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRVRfTU9OVEgoc2VsZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRVRfREFZKHNlbGYpKTsKKyAgICAgICAgICAgIHNlY29uZHMgPSBEQVRFX0dFVF9IT1VSKHNlbGYpICogMzYwMCArCisgICAgICAgICAgICAgICAgICAgICAgKERBVEVfR0VUX01JTlVURShzZWxmKSAtIG9mZnNldCkgKiA2MCArCisgICAgICAgICAgICAgICAgICAgICAgREFURV9HRVRfU0VDT05EKHNlbGYpOworICAgICAgICAgICAgdGVtcCA9IG5ld19kZWx0YShkYXlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQVRFX0dFVF9NSUNST1NFQ09ORChzZWxmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRlbXAgIT0gTlVMTCkgeworICAgICAgICAgICAgc2VsZi0+aGFzaGNvZGUgPSBQeU9iamVjdF9IYXNoKHRlbXApOworICAgICAgICAgICAgUHlfREVDUkVGKHRlbXApOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBzZWxmLT5oYXNoY29kZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRhdGV0aW1lX3JlcGxhY2UoUHlEYXRlVGltZV9EYXRlVGltZSAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprdykKIHsKLQlQeU9iamVjdCAqY2xvbmU7Ci0JUHlPYmplY3QgKnR1cGxlOwotCWludCB5ID0gR0VUX1lFQVIoc2VsZik7Ci0JaW50IG0gPSBHRVRfTU9OVEgoc2VsZik7Ci0JaW50IGQgPSBHRVRfREFZKHNlbGYpOwotCWludCBoaCA9IERBVEVfR0VUX0hPVVIoc2VsZik7Ci0JaW50IG1tID0gREFURV9HRVRfTUlOVVRFKHNlbGYpOwotCWludCBzcyA9IERBVEVfR0VUX1NFQ09ORChzZWxmKTsKLQlpbnQgdXMgPSBEQVRFX0dFVF9NSUNST1NFQ09ORChzZWxmKTsKLQlQeU9iamVjdCAqdHppbmZvID0gSEFTVFpJTkZPKHNlbGYpID8gc2VsZi0+dHppbmZvIDogUHlfTm9uZTsKKyAgICBQeU9iamVjdCAqY2xvbmU7CisgICAgUHlPYmplY3QgKnR1cGxlOworICAgIGludCB5ID0gR0VUX1lFQVIoc2VsZik7CisgICAgaW50IG0gPSBHRVRfTU9OVEgoc2VsZik7CisgICAgaW50IGQgPSBHRVRfREFZKHNlbGYpOworICAgIGludCBoaCA9IERBVEVfR0VUX0hPVVIoc2VsZik7CisgICAgaW50IG1tID0gREFURV9HRVRfTUlOVVRFKHNlbGYpOworICAgIGludCBzcyA9IERBVEVfR0VUX1NFQ09ORChzZWxmKTsKKyAgICBpbnQgdXMgPSBEQVRFX0dFVF9NSUNST1NFQ09ORChzZWxmKTsKKyAgICBQeU9iamVjdCAqdHppbmZvID0gSEFTVFpJTkZPKHNlbGYpID8gc2VsZi0+dHppbmZvIDogUHlfTm9uZTsKIAotCWlmICghIFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrdywgInxpaWlpaWlpTzpyZXBsYWNlIiwKLQkJCQkJICBkYXRldGltZV9rd3MsCi0JCQkJCSAgJnksICZtLCAmZCwgJmhoLCAmbW0sICZzcywgJnVzLAotCQkJCQkgICZ0emluZm8pKQotCQlyZXR1cm4gTlVMTDsKLQl0dXBsZSA9IFB5X0J1aWxkVmFsdWUoImlpaWlpaWlPIiwgeSwgbSwgZCwgaGgsIG1tLCBzcywgdXMsIHR6aW5mbyk7Ci0JaWYgKHR1cGxlID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWNsb25lID0gZGF0ZXRpbWVfbmV3KFB5X1RZUEUoc2VsZiksIHR1cGxlLCBOVUxMKTsKLQlQeV9ERUNSRUYodHVwbGUpOwotCXJldHVybiBjbG9uZTsKKyAgICBpZiAoISBQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3csICJ8aWlpaWlpaU86cmVwbGFjZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGV0aW1lX2t3cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnksICZtLCAmZCwgJmhoLCAmbW0sICZzcywgJnVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHppbmZvKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgdHVwbGUgPSBQeV9CdWlsZFZhbHVlKCJpaWlpaWlpTyIsIHksIG0sIGQsIGhoLCBtbSwgc3MsIHVzLCB0emluZm8pOworICAgIGlmICh0dXBsZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBjbG9uZSA9IGRhdGV0aW1lX25ldyhQeV9UWVBFKHNlbGYpLCB0dXBsZSwgTlVMTCk7CisgICAgUHlfREVDUkVGKHR1cGxlKTsKKyAgICByZXR1cm4gY2xvbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkYXRldGltZV9hc3RpbWV6b25lKFB5RGF0ZVRpbWVfRGF0ZVRpbWUgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3cpCiB7Ci0JaW50IHksIG0sIGQsIGhoLCBtbSwgc3MsIHVzOwotCVB5T2JqZWN0ICpyZXN1bHQ7Ci0JaW50IG9mZnNldCwgbm9uZTsKKyAgICBpbnQgeSwgbSwgZCwgaGgsIG1tLCBzcywgdXM7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICBpbnQgb2Zmc2V0LCBub25lOwogCi0JUHlPYmplY3QgKnR6aW5mbzsKLQlzdGF0aWMgY2hhciAqa2V5d29yZHNbXSA9IHsidHoiLCBOVUxMfTsKKyAgICBQeU9iamVjdCAqdHppbmZvOworICAgIHN0YXRpYyBjaGFyICprZXl3b3Jkc1tdID0geyJ0eiIsIE5VTEx9OwogCi0JaWYgKCEgUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3LCAiTyE6YXN0aW1lem9uZSIsIGtleXdvcmRzLAotCQkJCQkgICZQeURhdGVUaW1lX1RaSW5mb1R5cGUsICZ0emluZm8pKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoISBQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3csICJPITphc3RpbWV6b25lIiwga2V5d29yZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZQeURhdGVUaW1lX1RaSW5mb1R5cGUsICZ0emluZm8pKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotICAgICAgICBpZiAoIUhBU1RaSU5GTyhzZWxmKSB8fCBzZWxmLT50emluZm8gPT0gUHlfTm9uZSkKLSAgICAgICAgCWdvdG8gTmVlZEF3YXJlOworICAgIGlmICghSEFTVFpJTkZPKHNlbGYpIHx8IHNlbGYtPnR6aW5mbyA9PSBQeV9Ob25lKQorICAgICAgICBnb3RvIE5lZWRBd2FyZTsKIAotICAgICAgICAvKiBDb252ZXJzaW9uIHRvIHNlbGYncyBvd24gdGltZSB6b25lIGlzIGEgTk9QLiAqLwotCWlmIChzZWxmLT50emluZm8gPT0gdHppbmZvKSB7Ci0JCVB5X0lOQ1JFRihzZWxmKTsKLQkJcmV0dXJuIChQeU9iamVjdCAqKXNlbGY7Ci0JfQorICAgIC8qIENvbnZlcnNpb24gdG8gc2VsZidzIG93biB0aW1lIHpvbmUgaXMgYSBOT1AuICovCisgICAgaWYgKHNlbGYtPnR6aW5mbyA9PSB0emluZm8pIHsKKyAgICAgICAgUHlfSU5DUkVGKHNlbGYpOworICAgICAgICByZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKKyAgICB9CiAKLSAgICAgICAgLyogQ29udmVydCBzZWxmIHRvIFVUQy4gKi8KLSAgICAgICAgb2Zmc2V0ID0gY2FsbF91dGNvZmZzZXQoc2VsZi0+dHppbmZvLCAoUHlPYmplY3QgKilzZWxmLCAmbm9uZSk7Ci0gICAgICAgIGlmIChvZmZzZXQgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLSAgICAgICAgCXJldHVybiBOVUxMOwotICAgICAgICBpZiAobm9uZSkKLSAgICAgICAgCWdvdG8gTmVlZEF3YXJlOworICAgIC8qIENvbnZlcnQgc2VsZiB0byBVVEMuICovCisgICAgb2Zmc2V0ID0gY2FsbF91dGNvZmZzZXQoc2VsZi0+dHppbmZvLCAoUHlPYmplY3QgKilzZWxmLCAmbm9uZSk7CisgICAgaWYgKG9mZnNldCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAobm9uZSkKKyAgICAgICAgZ290byBOZWVkQXdhcmU7CiAKLQl5ID0gR0VUX1lFQVIoc2VsZik7Ci0JbSA9IEdFVF9NT05USChzZWxmKTsKLQlkID0gR0VUX0RBWShzZWxmKTsKLQloaCA9IERBVEVfR0VUX0hPVVIoc2VsZik7Ci0JbW0gPSBEQVRFX0dFVF9NSU5VVEUoc2VsZik7Ci0Jc3MgPSBEQVRFX0dFVF9TRUNPTkQoc2VsZik7Ci0JdXMgPSBEQVRFX0dFVF9NSUNST1NFQ09ORChzZWxmKTsKKyAgICB5ID0gR0VUX1lFQVIoc2VsZik7CisgICAgbSA9IEdFVF9NT05USChzZWxmKTsKKyAgICBkID0gR0VUX0RBWShzZWxmKTsKKyAgICBoaCA9IERBVEVfR0VUX0hPVVIoc2VsZik7CisgICAgbW0gPSBEQVRFX0dFVF9NSU5VVEUoc2VsZik7CisgICAgc3MgPSBEQVRFX0dFVF9TRUNPTkQoc2VsZik7CisgICAgdXMgPSBEQVRFX0dFVF9NSUNST1NFQ09ORChzZWxmKTsKIAotCW1tIC09IG9mZnNldDsKLQlpZiAoKG1tIDwgMCB8fCBtbSA+PSA2MCkgJiYKLQkgICAgbm9ybWFsaXplX2RhdGV0aW1lKCZ5LCAmbSwgJmQsICZoaCwgJm1tLCAmc3MsICZ1cykgPCAwKQotCQlyZXR1cm4gTlVMTDsKKyAgICBtbSAtPSBvZmZzZXQ7CisgICAgaWYgKChtbSA8IDAgfHwgbW0gPj0gNjApICYmCisgICAgICAgIG5vcm1hbGl6ZV9kYXRldGltZSgmeSwgJm0sICZkLCAmaGgsICZtbSwgJnNzLCAmdXMpIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkvKiBBdHRhY2ggbmV3IHR6aW5mbyBhbmQgbGV0IGZyb211dGMoKSBkbyB0aGUgcmVzdC4gKi8KLQlyZXN1bHQgPSBuZXdfZGF0ZXRpbWUoeSwgbSwgZCwgaGgsIG1tLCBzcywgdXMsIHR6aW5mbyk7Ci0JaWYgKHJlc3VsdCAhPSBOVUxMKSB7Ci0JCVB5T2JqZWN0ICp0ZW1wID0gcmVzdWx0OworICAgIC8qIEF0dGFjaCBuZXcgdHppbmZvIGFuZCBsZXQgZnJvbXV0YygpIGRvIHRoZSByZXN0LiAqLworICAgIHJlc3VsdCA9IG5ld19kYXRldGltZSh5LCBtLCBkLCBoaCwgbW0sIHNzLCB1cywgdHppbmZvKTsKKyAgICBpZiAocmVzdWx0ICE9IE5VTEwpIHsKKyAgICAgICAgUHlPYmplY3QgKnRlbXAgPSByZXN1bHQ7CiAKLQkJcmVzdWx0ID0gUHlPYmplY3RfQ2FsbE1ldGhvZCh0emluZm8sICJmcm9tdXRjIiwgIk8iLCB0ZW1wKTsKLQkJUHlfREVDUkVGKHRlbXApOwotCX0KLQlyZXR1cm4gcmVzdWx0OworICAgICAgICByZXN1bHQgPSBQeU9iamVjdF9DYWxsTWV0aG9kKHR6aW5mbywgImZyb211dGMiLCAiTyIsIHRlbXApOworICAgICAgICBQeV9ERUNSRUYodGVtcCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CiAKIE5lZWRBd2FyZToKLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImFzdGltZXpvbmUoKSBjYW5ub3QgYmUgYXBwbGllZCB0byAiCi0JCQkJCSAgImEgbmFpdmUgZGF0ZXRpbWUiKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImFzdGltZXpvbmUoKSBjYW5ub3QgYmUgYXBwbGllZCB0byAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhIG5haXZlIGRhdGV0aW1lIik7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkYXRldGltZV90aW1ldHVwbGUoUHlEYXRlVGltZV9EYXRlVGltZSAqc2VsZikKIHsKLQlpbnQgZHN0ZmxhZyA9IC0xOworICAgIGludCBkc3RmbGFnID0gLTE7CiAKLQlpZiAoSEFTVFpJTkZPKHNlbGYpICYmIHNlbGYtPnR6aW5mbyAhPSBQeV9Ob25lKSB7Ci0JCWludCBub25lOworICAgIGlmIChIQVNUWklORk8oc2VsZikgJiYgc2VsZi0+dHppbmZvICE9IFB5X05vbmUpIHsKKyAgICAgICAgaW50IG5vbmU7CiAKLQkJZHN0ZmxhZyA9IGNhbGxfZHN0KHNlbGYtPnR6aW5mbywgKFB5T2JqZWN0ICopc2VsZiwgJm5vbmUpOwotCQlpZiAoZHN0ZmxhZyA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIE5VTEw7CisgICAgICAgIGRzdGZsYWcgPSBjYWxsX2RzdChzZWxmLT50emluZm8sIChQeU9iamVjdCAqKXNlbGYsICZub25lKTsKKyAgICAgICAgaWYgKGRzdGZsYWcgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogCi0JCWlmIChub25lKQotCQkJZHN0ZmxhZyA9IC0xOwotCQllbHNlIGlmIChkc3RmbGFnICE9IDApCi0JCQlkc3RmbGFnID0gMTsKKyAgICAgICAgaWYgKG5vbmUpCisgICAgICAgICAgICBkc3RmbGFnID0gLTE7CisgICAgICAgIGVsc2UgaWYgKGRzdGZsYWcgIT0gMCkKKyAgICAgICAgICAgIGRzdGZsYWcgPSAxOwogCi0JfQotCXJldHVybiBidWlsZF9zdHJ1Y3RfdGltZShHRVRfWUVBUihzZWxmKSwKLQkJCQkgR0VUX01PTlRIKHNlbGYpLAotCQkJCSBHRVRfREFZKHNlbGYpLAotCQkJCSBEQVRFX0dFVF9IT1VSKHNlbGYpLAotCQkJCSBEQVRFX0dFVF9NSU5VVEUoc2VsZiksCi0JCQkJIERBVEVfR0VUX1NFQ09ORChzZWxmKSwKLQkJCQkgZHN0ZmxhZyk7CisgICAgfQorICAgIHJldHVybiBidWlsZF9zdHJ1Y3RfdGltZShHRVRfWUVBUihzZWxmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VUX01PTlRIKHNlbGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRVRfREFZKHNlbGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQVRFX0dFVF9IT1VSKHNlbGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQVRFX0dFVF9NSU5VVEUoc2VsZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBVEVfR0VUX1NFQ09ORChzZWxmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0ZmxhZyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkYXRldGltZV9nZXRkYXRlKFB5RGF0ZVRpbWVfRGF0ZVRpbWUgKnNlbGYpCiB7Ci0JcmV0dXJuIG5ld19kYXRlKEdFVF9ZRUFSKHNlbGYpLAotCQkJR0VUX01PTlRIKHNlbGYpLAotCQkJR0VUX0RBWShzZWxmKSk7CisgICAgcmV0dXJuIG5ld19kYXRlKEdFVF9ZRUFSKHNlbGYpLAorICAgICAgICAgICAgICAgICAgICBHRVRfTU9OVEgoc2VsZiksCisgICAgICAgICAgICAgICAgICAgIEdFVF9EQVkoc2VsZikpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZGF0ZXRpbWVfZ2V0dGltZShQeURhdGVUaW1lX0RhdGVUaW1lICpzZWxmKQogewotCXJldHVybiBuZXdfdGltZShEQVRFX0dFVF9IT1VSKHNlbGYpLAotCQkJREFURV9HRVRfTUlOVVRFKHNlbGYpLAotCQkJREFURV9HRVRfU0VDT05EKHNlbGYpLAotCQkJREFURV9HRVRfTUlDUk9TRUNPTkQoc2VsZiksCi0JCQlQeV9Ob25lKTsKKyAgICByZXR1cm4gbmV3X3RpbWUoREFURV9HRVRfSE9VUihzZWxmKSwKKyAgICAgICAgICAgICAgICAgICAgREFURV9HRVRfTUlOVVRFKHNlbGYpLAorICAgICAgICAgICAgICAgICAgICBEQVRFX0dFVF9TRUNPTkQoc2VsZiksCisgICAgICAgICAgICAgICAgICAgIERBVEVfR0VUX01JQ1JPU0VDT05EKHNlbGYpLAorICAgICAgICAgICAgICAgICAgICBQeV9Ob25lKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRhdGV0aW1lX2dldHRpbWV0eihQeURhdGVUaW1lX0RhdGVUaW1lICpzZWxmKQogewotCXJldHVybiBuZXdfdGltZShEQVRFX0dFVF9IT1VSKHNlbGYpLAotCQkJREFURV9HRVRfTUlOVVRFKHNlbGYpLAotCQkJREFURV9HRVRfU0VDT05EKHNlbGYpLAotCQkJREFURV9HRVRfTUlDUk9TRUNPTkQoc2VsZiksCi0JCQlIQVNUWklORk8oc2VsZikgPyBzZWxmLT50emluZm8gOiBQeV9Ob25lKTsKKyAgICByZXR1cm4gbmV3X3RpbWUoREFURV9HRVRfSE9VUihzZWxmKSwKKyAgICAgICAgICAgICAgICAgICAgREFURV9HRVRfTUlOVVRFKHNlbGYpLAorICAgICAgICAgICAgICAgICAgICBEQVRFX0dFVF9TRUNPTkQoc2VsZiksCisgICAgICAgICAgICAgICAgICAgIERBVEVfR0VUX01JQ1JPU0VDT05EKHNlbGYpLAorICAgICAgICAgICAgICAgICAgICBIQVNUWklORk8oc2VsZikgPyBzZWxmLT50emluZm8gOiBQeV9Ob25lKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRhdGV0aW1lX3V0Y3RpbWV0dXBsZShQeURhdGVUaW1lX0RhdGVUaW1lICpzZWxmKQogewotCWludCB5ID0gR0VUX1lFQVIoc2VsZik7Ci0JaW50IG0gPSBHRVRfTU9OVEgoc2VsZik7Ci0JaW50IGQgPSBHRVRfREFZKHNlbGYpOwotCWludCBoaCA9IERBVEVfR0VUX0hPVVIoc2VsZik7Ci0JaW50IG1tID0gREFURV9HRVRfTUlOVVRFKHNlbGYpOwotCWludCBzcyA9IERBVEVfR0VUX1NFQ09ORChzZWxmKTsKLQlpbnQgdXMgPSAwOwkvKiBtaWNyb3NlY29uZHMgYXJlIGlnbm9yZWQgaW4gYSB0aW1ldHVwbGUgKi8KLQlpbnQgb2Zmc2V0ID0gMDsKKyAgICBpbnQgeSA9IEdFVF9ZRUFSKHNlbGYpOworICAgIGludCBtID0gR0VUX01PTlRIKHNlbGYpOworICAgIGludCBkID0gR0VUX0RBWShzZWxmKTsKKyAgICBpbnQgaGggPSBEQVRFX0dFVF9IT1VSKHNlbGYpOworICAgIGludCBtbSA9IERBVEVfR0VUX01JTlVURShzZWxmKTsKKyAgICBpbnQgc3MgPSBEQVRFX0dFVF9TRUNPTkQoc2VsZik7CisgICAgaW50IHVzID0gMDsgICAgICAgICAvKiBtaWNyb3NlY29uZHMgYXJlIGlnbm9yZWQgaW4gYSB0aW1ldHVwbGUgKi8KKyAgICBpbnQgb2Zmc2V0ID0gMDsKIAotCWlmIChIQVNUWklORk8oc2VsZikgJiYgc2VsZi0+dHppbmZvICE9IFB5X05vbmUpIHsKLQkJaW50IG5vbmU7CisgICAgaWYgKEhBU1RaSU5GTyhzZWxmKSAmJiBzZWxmLT50emluZm8gIT0gUHlfTm9uZSkgeworICAgICAgICBpbnQgbm9uZTsKIAotCQlvZmZzZXQgPSBjYWxsX3V0Y29mZnNldChzZWxmLT50emluZm8sIChQeU9iamVjdCAqKXNlbGYsICZub25lKTsKLQkJaWYgKG9mZnNldCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCS8qIEV2ZW4gaWYgb2Zmc2V0IGlzIDAsIGRvbid0IGNhbGwgdGltZXR1cGxlKCkgLS0gdG1faXNkc3Qgc2hvdWxkIGJlCi0JICogMCBpbiBhIFVUQyB0aW1ldHVwbGUgcmVnYXJkbGVzcyBvZiB3aGF0IGRzdCgpIHNheXMuCi0JICovCi0JaWYgKG9mZnNldCkgewotCQkvKiBTdWJ0cmFjdCBvZmZzZXQgbWludXRlcyAmIG5vcm1hbGl6ZS4gKi8KLQkJaW50IHN0YXQ7CisgICAgICAgIG9mZnNldCA9IGNhbGxfdXRjb2Zmc2V0KHNlbGYtPnR6aW5mbywgKFB5T2JqZWN0ICopc2VsZiwgJm5vbmUpOworICAgICAgICBpZiAob2Zmc2V0ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgLyogRXZlbiBpZiBvZmZzZXQgaXMgMCwgZG9uJ3QgY2FsbCB0aW1ldHVwbGUoKSAtLSB0bV9pc2RzdCBzaG91bGQgYmUKKyAgICAgKiAwIGluIGEgVVRDIHRpbWV0dXBsZSByZWdhcmRsZXNzIG9mIHdoYXQgZHN0KCkgc2F5cy4KKyAgICAgKi8KKyAgICBpZiAob2Zmc2V0KSB7CisgICAgICAgIC8qIFN1YnRyYWN0IG9mZnNldCBtaW51dGVzICYgbm9ybWFsaXplLiAqLworICAgICAgICBpbnQgc3RhdDsKIAotCQltbSAtPSBvZmZzZXQ7Ci0JCXN0YXQgPSBub3JtYWxpemVfZGF0ZXRpbWUoJnksICZtLCAmZCwgJmhoLCAmbW0sICZzcywgJnVzKTsKLQkJaWYgKHN0YXQgPCAwKSB7Ci0JCQkvKiBBdCB0aGUgZWRnZXMsIGl0J3MgcG9zc2libGUgd2Ugb3ZlcmZsb3dlZAotCQkJICogYmV5b25kIE1JTllFQVIgb3IgTUFYWUVBUi4KLQkJCSAqLwotCQkJaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfT3ZlcmZsb3dFcnJvcikpCi0JCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KLQlyZXR1cm4gYnVpbGRfc3RydWN0X3RpbWUoeSwgbSwgZCwgaGgsIG1tLCBzcywgMCk7CisgICAgICAgIG1tIC09IG9mZnNldDsKKyAgICAgICAgc3RhdCA9IG5vcm1hbGl6ZV9kYXRldGltZSgmeSwgJm0sICZkLCAmaGgsICZtbSwgJnNzLCAmdXMpOworICAgICAgICBpZiAoc3RhdCA8IDApIHsKKyAgICAgICAgICAgIC8qIEF0IHRoZSBlZGdlcywgaXQncyBwb3NzaWJsZSB3ZSBvdmVyZmxvd2VkCisgICAgICAgICAgICAgKiBiZXlvbmQgTUlOWUVBUiBvciBNQVhZRUFSLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19PdmVyZmxvd0Vycm9yKSkKKyAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBidWlsZF9zdHJ1Y3RfdGltZSh5LCBtLCBkLCBoaCwgbW0sIHNzLCAwKTsKIH0KIAogLyogUGlja2xlIHN1cHBvcnQsIGEgc2ltcGxlIHVzZSBvZiBfX3JlZHVjZV9fLiAqLwpAQCAtNDU0MiwxMDIgKzQ1NDIsMTAyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZGF0ZXRpbWVfZ2V0c3RhdGUoUHlEYXRlVGltZV9EYXRlVGltZSAqc2VsZikKIHsKLQlQeU9iamVjdCAqYmFzZXN0YXRlOwotCVB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOworICAgIFB5T2JqZWN0ICpiYXNlc3RhdGU7CisgICAgUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7CiAKLQliYXNlc3RhdGUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKXNlbGYtPmRhdGEsCi0JCQkJCSAgX1B5RGF0ZVRpbWVfREFURVRJTUVfREFUQVNJWkUpOwotCWlmIChiYXNlc3RhdGUgIT0gTlVMTCkgewotCQlpZiAoISBIQVNUWklORk8oc2VsZikgfHwgc2VsZi0+dHppbmZvID09IFB5X05vbmUpCi0JCQlyZXN1bHQgPSBQeVR1cGxlX1BhY2soMSwgYmFzZXN0YXRlKTsKLQkJZWxzZQotCQkJcmVzdWx0ID0gUHlUdXBsZV9QYWNrKDIsIGJhc2VzdGF0ZSwgc2VsZi0+dHppbmZvKTsKLQkJUHlfREVDUkVGKGJhc2VzdGF0ZSk7Ci0JfQotCXJldHVybiByZXN1bHQ7CisgICAgYmFzZXN0YXRlID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilzZWxmLT5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUHlEYXRlVGltZV9EQVRFVElNRV9EQVRBU0laRSk7CisgICAgaWYgKGJhc2VzdGF0ZSAhPSBOVUxMKSB7CisgICAgICAgIGlmICghIEhBU1RaSU5GTyhzZWxmKSB8fCBzZWxmLT50emluZm8gPT0gUHlfTm9uZSkKKyAgICAgICAgICAgIHJlc3VsdCA9IFB5VHVwbGVfUGFjaygxLCBiYXNlc3RhdGUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXN1bHQgPSBQeVR1cGxlX1BhY2soMiwgYmFzZXN0YXRlLCBzZWxmLT50emluZm8pOworICAgICAgICBQeV9ERUNSRUYoYmFzZXN0YXRlKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRhdGV0aW1lX3JlZHVjZShQeURhdGVUaW1lX0RhdGVUaW1lICpzZWxmLCBQeU9iamVjdCAqYXJnKQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKCIoT04pIiwgUHlfVFlQRShzZWxmKSwgZGF0ZXRpbWVfZ2V0c3RhdGUoc2VsZikpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIoT04pIiwgUHlfVFlQRShzZWxmKSwgZGF0ZXRpbWVfZ2V0c3RhdGUoc2VsZikpOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgZGF0ZXRpbWVfbWV0aG9kc1tdID0gewogCi0JLyogQ2xhc3MgbWV0aG9kczogKi8KKyAgICAvKiBDbGFzcyBtZXRob2RzOiAqLwogCi0JeyJub3ciLCAgICAgICAgIChQeUNGdW5jdGlvbilkYXRldGltZV9ub3csCi0JIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMgfCBNRVRIX0NMQVNTLAotCSBQeURvY19TVFIoIlt0el0gLT4gbmV3IGRhdGV0aW1lIHdpdGggdHoncyBsb2NhbCBkYXkgYW5kIHRpbWUuIil9LAorICAgIHsibm93IiwgICAgICAgICAoUHlDRnVuY3Rpb24pZGF0ZXRpbWVfbm93LAorICAgICBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTIHwgTUVUSF9DTEFTUywKKyAgICAgUHlEb2NfU1RSKCJbdHpdIC0+IG5ldyBkYXRldGltZSB3aXRoIHR6J3MgbG9jYWwgZGF5IGFuZCB0aW1lLiIpfSwKIAotCXsidXRjbm93IiwgICAgICAgICAoUHlDRnVuY3Rpb24pZGF0ZXRpbWVfdXRjbm93LAotCSBNRVRIX05PQVJHUyB8IE1FVEhfQ0xBU1MsCi0JIFB5RG9jX1NUUigiUmV0dXJuIGEgbmV3IGRhdGV0aW1lIHJlcHJlc2VudGluZyBVVEMgZGF5IGFuZCB0aW1lLiIpfSwKKyAgICB7InV0Y25vdyIsICAgICAgICAgKFB5Q0Z1bmN0aW9uKWRhdGV0aW1lX3V0Y25vdywKKyAgICAgTUVUSF9OT0FSR1MgfCBNRVRIX0NMQVNTLAorICAgICBQeURvY19TVFIoIlJldHVybiBhIG5ldyBkYXRldGltZSByZXByZXNlbnRpbmcgVVRDIGRheSBhbmQgdGltZS4iKX0sCiAKLQl7ImZyb210aW1lc3RhbXAiLCAoUHlDRnVuY3Rpb24pZGF0ZXRpbWVfZnJvbXRpbWVzdGFtcCwKLQkgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUyB8IE1FVEhfQ0xBU1MsCi0JIFB5RG9jX1NUUigidGltZXN0YW1wWywgdHpdIC0+IHR6J3MgbG9jYWwgdGltZSBmcm9tIFBPU0lYIHRpbWVzdGFtcC4iKX0sCisgICAgeyJmcm9tdGltZXN0YW1wIiwgKFB5Q0Z1bmN0aW9uKWRhdGV0aW1lX2Zyb210aW1lc3RhbXAsCisgICAgIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMgfCBNRVRIX0NMQVNTLAorICAgICBQeURvY19TVFIoInRpbWVzdGFtcFssIHR6XSAtPiB0eidzIGxvY2FsIHRpbWUgZnJvbSBQT1NJWCB0aW1lc3RhbXAuIil9LAogCi0JeyJ1dGNmcm9tdGltZXN0YW1wIiwgKFB5Q0Z1bmN0aW9uKWRhdGV0aW1lX3V0Y2Zyb210aW1lc3RhbXAsCi0JIE1FVEhfVkFSQVJHUyB8IE1FVEhfQ0xBU1MsCi0JIFB5RG9jX1NUUigidGltZXN0YW1wIC0+IFVUQyBkYXRldGltZSBmcm9tIGEgUE9TSVggdGltZXN0YW1wICIKLQkgCSAgICIobGlrZSB0aW1lLnRpbWUoKSkuIil9LAorICAgIHsidXRjZnJvbXRpbWVzdGFtcCIsIChQeUNGdW5jdGlvbilkYXRldGltZV91dGNmcm9tdGltZXN0YW1wLAorICAgICBNRVRIX1ZBUkFSR1MgfCBNRVRIX0NMQVNTLAorICAgICBQeURvY19TVFIoInRpbWVzdGFtcCAtPiBVVEMgZGF0ZXRpbWUgZnJvbSBhIFBPU0lYIHRpbWVzdGFtcCAiCisgICAgICAgICAgICAgICAiKGxpa2UgdGltZS50aW1lKCkpLiIpfSwKIAotCXsic3RycHRpbWUiLCAoUHlDRnVuY3Rpb24pZGF0ZXRpbWVfc3RycHRpbWUsCi0JIE1FVEhfVkFSQVJHUyB8IE1FVEhfQ0xBU1MsCi0JIFB5RG9jX1NUUigic3RyaW5nLCBmb3JtYXQgLT4gbmV3IGRhdGV0aW1lIHBhcnNlZCBmcm9tIGEgc3RyaW5nICIKLQkgCSAgICIobGlrZSB0aW1lLnN0cnB0aW1lKCkpLiIpfSwKKyAgICB7InN0cnB0aW1lIiwgKFB5Q0Z1bmN0aW9uKWRhdGV0aW1lX3N0cnB0aW1lLAorICAgICBNRVRIX1ZBUkFSR1MgfCBNRVRIX0NMQVNTLAorICAgICBQeURvY19TVFIoInN0cmluZywgZm9ybWF0IC0+IG5ldyBkYXRldGltZSBwYXJzZWQgZnJvbSBhIHN0cmluZyAiCisgICAgICAgICAgICAgICAiKGxpa2UgdGltZS5zdHJwdGltZSgpKS4iKX0sCiAKLQl7ImNvbWJpbmUiLCAoUHlDRnVuY3Rpb24pZGF0ZXRpbWVfY29tYmluZSwKLQkgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUyB8IE1FVEhfQ0xBU1MsCi0JIFB5RG9jX1NUUigiZGF0ZSwgdGltZSAtPiBkYXRldGltZSB3aXRoIHNhbWUgZGF0ZSBhbmQgdGltZSBmaWVsZHMiKX0sCisgICAgeyJjb21iaW5lIiwgKFB5Q0Z1bmN0aW9uKWRhdGV0aW1lX2NvbWJpbmUsCisgICAgIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMgfCBNRVRIX0NMQVNTLAorICAgICBQeURvY19TVFIoImRhdGUsIHRpbWUgLT4gZGF0ZXRpbWUgd2l0aCBzYW1lIGRhdGUgYW5kIHRpbWUgZmllbGRzIil9LAogCi0JLyogSW5zdGFuY2UgbWV0aG9kczogKi8KKyAgICAvKiBJbnN0YW5jZSBtZXRob2RzOiAqLwogCi0JeyJkYXRlIiwgICAoUHlDRnVuY3Rpb24pZGF0ZXRpbWVfZ2V0ZGF0ZSwgTUVUSF9OT0FSR1MsCi0gICAgICAgICBQeURvY19TVFIoIlJldHVybiBkYXRlIG9iamVjdCB3aXRoIHNhbWUgeWVhciwgbW9udGggYW5kIGRheS4iKX0sCisgICAgeyJkYXRlIiwgICAoUHlDRnVuY3Rpb24pZGF0ZXRpbWVfZ2V0ZGF0ZSwgTUVUSF9OT0FSR1MsCisgICAgIFB5RG9jX1NUUigiUmV0dXJuIGRhdGUgb2JqZWN0IHdpdGggc2FtZSB5ZWFyLCBtb250aCBhbmQgZGF5LiIpfSwKIAotCXsidGltZSIsICAgKFB5Q0Z1bmN0aW9uKWRhdGV0aW1lX2dldHRpbWUsIE1FVEhfTk9BUkdTLAotICAgICAgICAgUHlEb2NfU1RSKCJSZXR1cm4gdGltZSBvYmplY3Qgd2l0aCBzYW1lIHRpbWUgYnV0IHdpdGggdHppbmZvPU5vbmUuIil9LAorICAgIHsidGltZSIsICAgKFB5Q0Z1bmN0aW9uKWRhdGV0aW1lX2dldHRpbWUsIE1FVEhfTk9BUkdTLAorICAgICBQeURvY19TVFIoIlJldHVybiB0aW1lIG9iamVjdCB3aXRoIHNhbWUgdGltZSBidXQgd2l0aCB0emluZm89Tm9uZS4iKX0sCiAKLQl7InRpbWV0eiIsICAgKFB5Q0Z1bmN0aW9uKWRhdGV0aW1lX2dldHRpbWV0eiwgTUVUSF9OT0FSR1MsCi0gICAgICAgICBQeURvY19TVFIoIlJldHVybiB0aW1lIG9iamVjdCB3aXRoIHNhbWUgdGltZSBhbmQgdHppbmZvLiIpfSwKKyAgICB7InRpbWV0eiIsICAgKFB5Q0Z1bmN0aW9uKWRhdGV0aW1lX2dldHRpbWV0eiwgTUVUSF9OT0FSR1MsCisgICAgIFB5RG9jX1NUUigiUmV0dXJuIHRpbWUgb2JqZWN0IHdpdGggc2FtZSB0aW1lIGFuZCB0emluZm8uIil9LAogCi0JeyJjdGltZSIsICAgICAgIChQeUNGdW5jdGlvbilkYXRldGltZV9jdGltZSwJTUVUSF9OT0FSR1MsCi0JIFB5RG9jX1NUUigiUmV0dXJuIGN0aW1lKCkgc3R5bGUgc3RyaW5nLiIpfSwKKyAgICB7ImN0aW1lIiwgICAgICAgKFB5Q0Z1bmN0aW9uKWRhdGV0aW1lX2N0aW1lLCAgICAgICAgTUVUSF9OT0FSR1MsCisgICAgIFB5RG9jX1NUUigiUmV0dXJuIGN0aW1lKCkgc3R5bGUgc3RyaW5nLiIpfSwKIAotCXsidGltZXR1cGxlIiwgICAoUHlDRnVuY3Rpb24pZGF0ZXRpbWVfdGltZXR1cGxlLCBNRVRIX05PQVJHUywKLSAgICAgICAgIFB5RG9jX1NUUigiUmV0dXJuIHRpbWUgdHVwbGUsIGNvbXBhdGlibGUgd2l0aCB0aW1lLmxvY2FsdGltZSgpLiIpfSwKKyAgICB7InRpbWV0dXBsZSIsICAgKFB5Q0Z1bmN0aW9uKWRhdGV0aW1lX3RpbWV0dXBsZSwgTUVUSF9OT0FSR1MsCisgICAgIFB5RG9jX1NUUigiUmV0dXJuIHRpbWUgdHVwbGUsIGNvbXBhdGlibGUgd2l0aCB0aW1lLmxvY2FsdGltZSgpLiIpfSwKIAotCXsidXRjdGltZXR1cGxlIiwgICAoUHlDRnVuY3Rpb24pZGF0ZXRpbWVfdXRjdGltZXR1cGxlLCBNRVRIX05PQVJHUywKLSAgICAgICAgIFB5RG9jX1NUUigiUmV0dXJuIFVUQyB0aW1lIHR1cGxlLCBjb21wYXRpYmxlIHdpdGggdGltZS5sb2NhbHRpbWUoKS4iKX0sCisgICAgeyJ1dGN0aW1ldHVwbGUiLCAgIChQeUNGdW5jdGlvbilkYXRldGltZV91dGN0aW1ldHVwbGUsIE1FVEhfTk9BUkdTLAorICAgICBQeURvY19TVFIoIlJldHVybiBVVEMgdGltZSB0dXBsZSwgY29tcGF0aWJsZSB3aXRoIHRpbWUubG9jYWx0aW1lKCkuIil9LAogCi0JeyJpc29mb3JtYXQiLCAgIChQeUNGdW5jdGlvbilkYXRldGltZV9pc29mb3JtYXQsIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsCi0JIFB5RG9jX1NUUigiW3NlcF0gLT4gc3RyaW5nIGluIElTTyA4NjAxIGZvcm1hdCwgIgotCSAJICAgIllZWVktTU0tRERUSEg6TU06U1NbLm1tbW1tbV1bK0hIOk1NXS5cblxuIgotCSAJICAgInNlcCBpcyB1c2VkIHRvIHNlcGFyYXRlIHRoZSB5ZWFyIGZyb20gdGhlIHRpbWUsIGFuZCAiCi0JIAkgICAiZGVmYXVsdHMgdG8gJ1QnLiIpfSwKKyAgICB7Imlzb2Zvcm1hdCIsICAgKFB5Q0Z1bmN0aW9uKWRhdGV0aW1lX2lzb2Zvcm1hdCwgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywKKyAgICAgUHlEb2NfU1RSKCJbc2VwXSAtPiBzdHJpbmcgaW4gSVNPIDg2MDEgZm9ybWF0LCAiCisgICAgICAgICAgICAgICAiWVlZWS1NTS1ERFRISDpNTTpTU1subW1tbW1tXVsrSEg6TU1dLlxuXG4iCisgICAgICAgICAgICAgICAic2VwIGlzIHVzZWQgdG8gc2VwYXJhdGUgdGhlIHllYXIgZnJvbSB0aGUgdGltZSwgYW5kICIKKyAgICAgICAgICAgICAgICJkZWZhdWx0cyB0byAnVCcuIil9LAogCi0JeyJ1dGNvZmZzZXQiLAkoUHlDRnVuY3Rpb24pZGF0ZXRpbWVfdXRjb2Zmc2V0LCBNRVRIX05PQVJHUywKLQkgUHlEb2NfU1RSKCJSZXR1cm4gc2VsZi50emluZm8udXRjb2Zmc2V0KHNlbGYpLiIpfSwKKyAgICB7InV0Y29mZnNldCIsICAgICAgIChQeUNGdW5jdGlvbilkYXRldGltZV91dGNvZmZzZXQsIE1FVEhfTk9BUkdTLAorICAgICBQeURvY19TVFIoIlJldHVybiBzZWxmLnR6aW5mby51dGNvZmZzZXQoc2VsZikuIil9LAogCi0JeyJ0em5hbWUiLAkoUHlDRnVuY3Rpb24pZGF0ZXRpbWVfdHpuYW1lLAlNRVRIX05PQVJHUywKLQkgUHlEb2NfU1RSKCJSZXR1cm4gc2VsZi50emluZm8udHpuYW1lKHNlbGYpLiIpfSwKKyAgICB7InR6bmFtZSIsICAgICAgICAgIChQeUNGdW5jdGlvbilkYXRldGltZV90em5hbWUsICAgTUVUSF9OT0FSR1MsCisgICAgIFB5RG9jX1NUUigiUmV0dXJuIHNlbGYudHppbmZvLnR6bmFtZShzZWxmKS4iKX0sCiAKLQl7ImRzdCIsCQkoUHlDRnVuY3Rpb24pZGF0ZXRpbWVfZHN0LCBNRVRIX05PQVJHUywKLQkgUHlEb2NfU1RSKCJSZXR1cm4gc2VsZi50emluZm8uZHN0KHNlbGYpLiIpfSwKKyAgICB7ImRzdCIsICAgICAgICAgICAgIChQeUNGdW5jdGlvbilkYXRldGltZV9kc3QsIE1FVEhfTk9BUkdTLAorICAgICBQeURvY19TVFIoIlJldHVybiBzZWxmLnR6aW5mby5kc3Qoc2VsZikuIil9LAogCi0JeyJyZXBsYWNlIiwgICAgIChQeUNGdW5jdGlvbilkYXRldGltZV9yZXBsYWNlLAlNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLAotCSBQeURvY19TVFIoIlJldHVybiBkYXRldGltZSB3aXRoIG5ldyBzcGVjaWZpZWQgZmllbGRzLiIpfSwKKyAgICB7InJlcGxhY2UiLCAgICAgKFB5Q0Z1bmN0aW9uKWRhdGV0aW1lX3JlcGxhY2UsICAgICAgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywKKyAgICAgUHlEb2NfU1RSKCJSZXR1cm4gZGF0ZXRpbWUgd2l0aCBuZXcgc3BlY2lmaWVkIGZpZWxkcy4iKX0sCiAKLQl7ImFzdGltZXpvbmUiLCAgKFB5Q0Z1bmN0aW9uKWRhdGV0aW1lX2FzdGltZXpvbmUsIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsCi0JIFB5RG9jX1NUUigidHogLT4gY29udmVydCB0byBsb2NhbCB0aW1lIGluIG5ldyB0aW1lem9uZSB0elxuIil9LAorICAgIHsiYXN0aW1lem9uZSIsICAoUHlDRnVuY3Rpb24pZGF0ZXRpbWVfYXN0aW1lem9uZSwgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywKKyAgICAgUHlEb2NfU1RSKCJ0eiAtPiBjb252ZXJ0IHRvIGxvY2FsIHRpbWUgaW4gbmV3IHRpbWV6b25lIHR6XG4iKX0sCiAKLQl7Il9fcmVkdWNlX18iLCAoUHlDRnVuY3Rpb24pZGF0ZXRpbWVfcmVkdWNlLCAgICAgTUVUSF9OT0FSR1MsCi0JIFB5RG9jX1NUUigiX19yZWR1Y2VfXygpIC0+IChjbHMsIHN0YXRlKSIpfSwKKyAgICB7Il9fcmVkdWNlX18iLCAoUHlDRnVuY3Rpb24pZGF0ZXRpbWVfcmVkdWNlLCAgICAgTUVUSF9OT0FSR1MsCisgICAgIFB5RG9jX1NUUigiX19yZWR1Y2VfXygpIC0+IChjbHMsIHN0YXRlKSIpfSwKIAotCXtOVUxMLAlOVUxMfQorICAgIHtOVUxMLCAgICAgIE5VTEx9CiB9OwogCiBzdGF0aWMgY2hhciBkYXRldGltZV9kb2NbXSA9CkBAIC00NjQ3LDYxICs0NjQ3LDYxIEBACiBpbnN0YW5jZSBvZiBhIHR6aW5mbyBzdWJjbGFzcy4gVGhlIHJlbWFpbmluZyBhcmd1bWVudHMgbWF5IGJlIGludHMgb3IgbG9uZ3MuXG4iKTsKIAogc3RhdGljIFB5TnVtYmVyTWV0aG9kcyBkYXRldGltZV9hc19udW1iZXIgPSB7Ci0JZGF0ZXRpbWVfYWRkLAkJCQkvKiBuYl9hZGQgKi8KLQlkYXRldGltZV9zdWJ0cmFjdCwJCQkvKiBuYl9zdWJ0cmFjdCAqLwotCTAsCQkJCQkvKiBuYl9tdWx0aXBseSAqLwotCTAsCQkJCQkvKiBuYl9kaXZpZGUgKi8KLQkwLAkJCQkJLyogbmJfcmVtYWluZGVyICovCi0JMCwJCQkJCS8qIG5iX2Rpdm1vZCAqLwotCTAsCQkJCQkvKiBuYl9wb3dlciAqLwotCTAsCQkJCQkvKiBuYl9uZWdhdGl2ZSAqLwotCTAsCQkJCQkvKiBuYl9wb3NpdGl2ZSAqLwotCTAsCQkJCQkvKiBuYl9hYnNvbHV0ZSAqLwotCTAsCQkJCQkvKiBuYl9ub256ZXJvICovCisgICAgZGF0ZXRpbWVfYWRkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9hZGQgKi8KKyAgICBkYXRldGltZV9zdWJ0cmFjdCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX3N1YnRyYWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9tdWx0aXBseSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfZGl2aWRlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9yZW1haW5kZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2Rpdm1vZCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfcG93ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX25lZ2F0aXZlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9wb3NpdGl2ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfYWJzb2x1dGUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX25vbnplcm8gKi8KIH07CiAKIHN0YXRpY2hlcmUgUHlUeXBlT2JqZWN0IFB5RGF0ZVRpbWVfRGF0ZVRpbWVUeXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQotCTAsCQkJCQkvKiBvYl9zaXplICovCi0JImRhdGV0aW1lLmRhdGV0aW1lIiwJCQkvKiB0cF9uYW1lICovCi0Jc2l6ZW9mKFB5RGF0ZVRpbWVfRGF0ZVRpbWUpLAkJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJCS8qIHRwX2l0ZW1zaXplICovCi0JKGRlc3RydWN0b3IpZGF0ZXRpbWVfZGVhbGxvYywJCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkocmVwcmZ1bmMpZGF0ZXRpbWVfcmVwciwJCS8qIHRwX3JlcHIgKi8KLQkmZGF0ZXRpbWVfYXNfbnVtYmVyLAkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JKGhhc2hmdW5jKWRhdGV0aW1lX2hhc2gsCQkvKiB0cF9oYXNoICovCi0JMCwgICAgICAgICAgICAgIAkJCS8qIHRwX2NhbGwgKi8KLQkocmVwcmZ1bmMpZGF0ZXRpbWVfc3RyLAkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19DSEVDS1RZUEVTIHwKLSAgICAgICAgUHlfVFBGTEFHU19CQVNFVFlQRSwJCQkvKiB0cF9mbGFncyAqLwotCWRhdGV0aW1lX2RvYywJCQkJLyogdHBfZG9jICovCi0JMCwJCQkJCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJCS8qIHRwX2NsZWFyICovCi0JKHJpY2hjbXBmdW5jKWRhdGV0aW1lX3JpY2hjb21wYXJlLAkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCTAsCQkJCQkvKiB0cF9pdGVyICovCi0JMCwJCQkJCS8qIHRwX2l0ZXJuZXh0ICovCi0JZGF0ZXRpbWVfbWV0aG9kcywJCQkvKiB0cF9tZXRob2RzICovCi0JMCwJCQkJCS8qIHRwX21lbWJlcnMgKi8KLQlkYXRldGltZV9nZXRzZXQsCQkJLyogdHBfZ2V0c2V0ICovCi0JJlB5RGF0ZVRpbWVfRGF0ZVR5cGUsCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCQkvKiB0cF9kaWN0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KLQkwLAkJCQkJLyogdHBfZGljdG9mZnNldCAqLwotCTAsCQkJCQkvKiB0cF9pbml0ICovCi0JZGF0ZXRpbWVfYWxsb2MsCQkJCS8qIHRwX2FsbG9jICovCi0JZGF0ZXRpbWVfbmV3LAkJCQkvKiB0cF9uZXcgKi8KLQkwLAkJCQkJLyogdHBfZnJlZSAqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb2Jfc2l6ZSAqLworICAgICJkYXRldGltZS5kYXRldGltZSIsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgIHNpemVvZihQeURhdGVUaW1lX0RhdGVUaW1lKSwgICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIChkZXN0cnVjdG9yKWRhdGV0aW1lX2RlYWxsb2MsICAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAocmVwcmZ1bmMpZGF0ZXRpbWVfcmVwciwgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAmZGF0ZXRpbWVfYXNfbnVtYmVyLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAoaGFzaGZ1bmMpZGF0ZXRpbWVfaGFzaCwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAocmVwcmZ1bmMpZGF0ZXRpbWVfc3RyLCAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0NIRUNLVFlQRVMgfAorICAgIFB5X1RQRkxBR1NfQkFTRVRZUEUsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICBkYXRldGltZV9kb2MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgKHJpY2hjbXBmdW5jKWRhdGV0aW1lX3JpY2hjb21wYXJlLCAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgZGF0ZXRpbWVfbWV0aG9kcywgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgZGF0ZXRpbWVfZ2V0c2V0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAmUHlEYXRlVGltZV9EYXRlVHlwZSwgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgZGF0ZXRpbWVfYWxsb2MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIGRhdGV0aW1lX25ldywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTQ3MDksMTkyICs0NzA5LDE5MiBAQAogICovCiAKIHN0YXRpYyBQeU1ldGhvZERlZiBtb2R1bGVfbWV0aG9kc1tdID0gewotCXtOVUxMLCBOVUxMfQorICAgIHtOVUxMLCBOVUxMfQogfTsKIAogLyogQyBBUEkuICBDbGllbnRzIGdldCBhdCB0aGlzIHZpYSBQeURhdGVUaW1lX0lNUE9SVCwgZGVmaW5lZCBpbgogICogZGF0ZXRpbWUuaC4KICAqLwogc3RhdGljIFB5RGF0ZVRpbWVfQ0FQSSBDQVBJID0gewotICAgICAgICAmUHlEYXRlVGltZV9EYXRlVHlwZSwKLSAgICAgICAgJlB5RGF0ZVRpbWVfRGF0ZVRpbWVUeXBlLAotICAgICAgICAmUHlEYXRlVGltZV9UaW1lVHlwZSwKLSAgICAgICAgJlB5RGF0ZVRpbWVfRGVsdGFUeXBlLAotICAgICAgICAmUHlEYXRlVGltZV9UWkluZm9UeXBlLAotICAgICAgICBuZXdfZGF0ZV9leCwKLSAgICAgICAgbmV3X2RhdGV0aW1lX2V4LAotICAgICAgICBuZXdfdGltZV9leCwKLSAgICAgICAgbmV3X2RlbHRhX2V4LAotICAgICAgICBkYXRldGltZV9mcm9tdGltZXN0YW1wLAotICAgICAgICBkYXRlX2Zyb210aW1lc3RhbXAKKyAgICAmUHlEYXRlVGltZV9EYXRlVHlwZSwKKyAgICAmUHlEYXRlVGltZV9EYXRlVGltZVR5cGUsCisgICAgJlB5RGF0ZVRpbWVfVGltZVR5cGUsCisgICAgJlB5RGF0ZVRpbWVfRGVsdGFUeXBlLAorICAgICZQeURhdGVUaW1lX1RaSW5mb1R5cGUsCisgICAgbmV3X2RhdGVfZXgsCisgICAgbmV3X2RhdGV0aW1lX2V4LAorICAgIG5ld190aW1lX2V4LAorICAgIG5ld19kZWx0YV9leCwKKyAgICBkYXRldGltZV9mcm9tdGltZXN0YW1wLAorICAgIGRhdGVfZnJvbXRpbWVzdGFtcAogfTsKIAogCiBQeU1PRElOSVRfRlVOQwogaW5pdGRhdGV0aW1lKHZvaWQpCiB7Ci0JUHlPYmplY3QgKm07CS8qIGEgbW9kdWxlIG9iamVjdCAqLwotCVB5T2JqZWN0ICpkOwkvKiBpdHMgZGljdCAqLwotCVB5T2JqZWN0ICp4OworICAgIFB5T2JqZWN0ICptOyAgICAgICAgLyogYSBtb2R1bGUgb2JqZWN0ICovCisgICAgUHlPYmplY3QgKmQ7ICAgICAgICAvKiBpdHMgZGljdCAqLworICAgIFB5T2JqZWN0ICp4OwogCi0JbSA9IFB5X0luaXRNb2R1bGUzKCJkYXRldGltZSIsIG1vZHVsZV9tZXRob2RzLAotCQkJICAgIkZhc3QgaW1wbGVtZW50YXRpb24gb2YgdGhlIGRhdGV0aW1lIHR5cGUuIik7Ci0JaWYgKG0gPT0gTlVMTCkKLQkJcmV0dXJuOworICAgIG0gPSBQeV9Jbml0TW9kdWxlMygiZGF0ZXRpbWUiLCBtb2R1bGVfbWV0aG9kcywKKyAgICAgICAgICAgICAgICAgICAgICAgIkZhc3QgaW1wbGVtZW50YXRpb24gb2YgdGhlIGRhdGV0aW1lIHR5cGUuIik7CisgICAgaWYgKG0gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOwogCi0JaWYgKFB5VHlwZV9SZWFkeSgmUHlEYXRlVGltZV9EYXRlVHlwZSkgPCAwKQotCQlyZXR1cm47Ci0JaWYgKFB5VHlwZV9SZWFkeSgmUHlEYXRlVGltZV9EYXRlVGltZVR5cGUpIDwgMCkKLQkJcmV0dXJuOwotCWlmIChQeVR5cGVfUmVhZHkoJlB5RGF0ZVRpbWVfRGVsdGFUeXBlKSA8IDApCi0JCXJldHVybjsKLQlpZiAoUHlUeXBlX1JlYWR5KCZQeURhdGVUaW1lX1RpbWVUeXBlKSA8IDApCi0JCXJldHVybjsKLQlpZiAoUHlUeXBlX1JlYWR5KCZQeURhdGVUaW1lX1RaSW5mb1R5cGUpIDwgMCkKLQkJcmV0dXJuOworICAgIGlmIChQeVR5cGVfUmVhZHkoJlB5RGF0ZVRpbWVfRGF0ZVR5cGUpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIGlmIChQeVR5cGVfUmVhZHkoJlB5RGF0ZVRpbWVfRGF0ZVRpbWVUeXBlKSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZQeURhdGVUaW1lX0RlbHRhVHlwZSkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmUHlEYXRlVGltZV9UaW1lVHlwZSkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmUHlEYXRlVGltZV9UWkluZm9UeXBlKSA8IDApCisgICAgICAgIHJldHVybjsKIAotCS8qIHRpbWVkZWx0YSB2YWx1ZXMgKi8KLQlkID0gUHlEYXRlVGltZV9EZWx0YVR5cGUudHBfZGljdDsKKyAgICAvKiB0aW1lZGVsdGEgdmFsdWVzICovCisgICAgZCA9IFB5RGF0ZVRpbWVfRGVsdGFUeXBlLnRwX2RpY3Q7CiAKLQl4ID0gbmV3X2RlbHRhKDAsIDAsIDEsIDApOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgInJlc29sdXRpb24iLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IG5ld19kZWx0YSgwLCAwLCAxLCAwKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJyZXNvbHV0aW9uIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogCi0JeCA9IG5ld19kZWx0YSgtTUFYX0RFTFRBX0RBWVMsIDAsIDAsIDApOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIm1pbiIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gbmV3X2RlbHRhKC1NQVhfREVMVEFfREFZUywgMCwgMCwgMCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAibWluIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogCi0JeCA9IG5ld19kZWx0YShNQVhfREVMVEFfREFZUywgMjQqMzYwMC0xLCAxMDAwMDAwLTEsIDApOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIm1heCIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gbmV3X2RlbHRhKE1BWF9ERUxUQV9EQVlTLCAyNCozNjAwLTEsIDEwMDAwMDAtMSwgMCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAibWF4IiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogCi0JLyogZGF0ZSB2YWx1ZXMgKi8KLQlkID0gUHlEYXRlVGltZV9EYXRlVHlwZS50cF9kaWN0OworICAgIC8qIGRhdGUgdmFsdWVzICovCisgICAgZCA9IFB5RGF0ZVRpbWVfRGF0ZVR5cGUudHBfZGljdDsKIAotCXggPSBuZXdfZGF0ZSgxLCAxLCAxKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJtaW4iLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IG5ld19kYXRlKDEsIDEsIDEpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIm1pbiIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKIAotCXggPSBuZXdfZGF0ZShNQVhZRUFSLCAxMiwgMzEpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIm1heCIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gbmV3X2RhdGUoTUFYWUVBUiwgMTIsIDMxKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJtYXgiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAKLQl4ID0gbmV3X2RlbHRhKDEsIDAsIDAsIDApOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgInJlc29sdXRpb24iLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IG5ld19kZWx0YSgxLCAwLCAwLCAwKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJyZXNvbHV0aW9uIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogCi0JLyogdGltZSB2YWx1ZXMgKi8KLQlkID0gUHlEYXRlVGltZV9UaW1lVHlwZS50cF9kaWN0OworICAgIC8qIHRpbWUgdmFsdWVzICovCisgICAgZCA9IFB5RGF0ZVRpbWVfVGltZVR5cGUudHBfZGljdDsKIAotCXggPSBuZXdfdGltZSgwLCAwLCAwLCAwLCBQeV9Ob25lKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJtaW4iLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IG5ld190aW1lKDAsIDAsIDAsIDAsIFB5X05vbmUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIm1pbiIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKIAotCXggPSBuZXdfdGltZSgyMywgNTksIDU5LCA5OTk5OTksIFB5X05vbmUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIm1heCIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gbmV3X3RpbWUoMjMsIDU5LCA1OSwgOTk5OTk5LCBQeV9Ob25lKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJtYXgiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAKLQl4ID0gbmV3X2RlbHRhKDAsIDAsIDEsIDApOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgInJlc29sdXRpb24iLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IG5ld19kZWx0YSgwLCAwLCAxLCAwKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJyZXNvbHV0aW9uIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogCi0JLyogZGF0ZXRpbWUgdmFsdWVzICovCi0JZCA9IFB5RGF0ZVRpbWVfRGF0ZVRpbWVUeXBlLnRwX2RpY3Q7CisgICAgLyogZGF0ZXRpbWUgdmFsdWVzICovCisgICAgZCA9IFB5RGF0ZVRpbWVfRGF0ZVRpbWVUeXBlLnRwX2RpY3Q7CiAKLQl4ID0gbmV3X2RhdGV0aW1lKDEsIDEsIDEsIDAsIDAsIDAsIDAsIFB5X05vbmUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIm1pbiIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gbmV3X2RhdGV0aW1lKDEsIDEsIDEsIDAsIDAsIDAsIDAsIFB5X05vbmUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIm1pbiIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKIAotCXggPSBuZXdfZGF0ZXRpbWUoTUFYWUVBUiwgMTIsIDMxLCAyMywgNTksIDU5LCA5OTk5OTksIFB5X05vbmUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIm1heCIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gbmV3X2RhdGV0aW1lKE1BWFlFQVIsIDEyLCAzMSwgMjMsIDU5LCA1OSwgOTk5OTk5LCBQeV9Ob25lKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJtYXgiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAKLQl4ID0gbmV3X2RlbHRhKDAsIDAsIDEsIDApOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgInJlc29sdXRpb24iLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IG5ld19kZWx0YSgwLCAwLCAxLCAwKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJyZXNvbHV0aW9uIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogCi0JLyogbW9kdWxlIGluaXRpYWxpemF0aW9uICovCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk1JTllFQVIiLCBNSU5ZRUFSKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTUFYWUVBUiIsIE1BWFlFQVIpOworICAgIC8qIG1vZHVsZSBpbml0aWFsaXphdGlvbiAqLworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJNSU5ZRUFSIiwgTUlOWUVBUik7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk1BWFlFQVIiLCBNQVhZRUFSKTsKIAotCVB5X0lOQ1JFRigmUHlEYXRlVGltZV9EYXRlVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJkYXRlIiwgKFB5T2JqZWN0ICopICZQeURhdGVUaW1lX0RhdGVUeXBlKTsKKyAgICBQeV9JTkNSRUYoJlB5RGF0ZVRpbWVfRGF0ZVR5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiZGF0ZSIsIChQeU9iamVjdCAqKSAmUHlEYXRlVGltZV9EYXRlVHlwZSk7CiAKLQlQeV9JTkNSRUYoJlB5RGF0ZVRpbWVfRGF0ZVRpbWVUeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgImRhdGV0aW1lIiwKLQkJCSAgIChQeU9iamVjdCAqKSZQeURhdGVUaW1lX0RhdGVUaW1lVHlwZSk7CisgICAgUHlfSU5DUkVGKCZQeURhdGVUaW1lX0RhdGVUaW1lVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJkYXRldGltZSIsCisgICAgICAgICAgICAgICAgICAgICAgIChQeU9iamVjdCAqKSZQeURhdGVUaW1lX0RhdGVUaW1lVHlwZSk7CiAKLQlQeV9JTkNSRUYoJlB5RGF0ZVRpbWVfVGltZVR5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAidGltZSIsIChQeU9iamVjdCAqKSAmUHlEYXRlVGltZV9UaW1lVHlwZSk7CisgICAgUHlfSU5DUkVGKCZQeURhdGVUaW1lX1RpbWVUeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgInRpbWUiLCAoUHlPYmplY3QgKikgJlB5RGF0ZVRpbWVfVGltZVR5cGUpOwogCi0JUHlfSU5DUkVGKCZQeURhdGVUaW1lX0RlbHRhVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJ0aW1lZGVsdGEiLCAoUHlPYmplY3QgKikgJlB5RGF0ZVRpbWVfRGVsdGFUeXBlKTsKKyAgICBQeV9JTkNSRUYoJlB5RGF0ZVRpbWVfRGVsdGFUeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgInRpbWVkZWx0YSIsIChQeU9iamVjdCAqKSAmUHlEYXRlVGltZV9EZWx0YVR5cGUpOwogCi0JUHlfSU5DUkVGKCZQeURhdGVUaW1lX1RaSW5mb1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAidHppbmZvIiwgKFB5T2JqZWN0ICopICZQeURhdGVUaW1lX1RaSW5mb1R5cGUpOworICAgIFB5X0lOQ1JFRigmUHlEYXRlVGltZV9UWkluZm9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgInR6aW5mbyIsIChQeU9iamVjdCAqKSAmUHlEYXRlVGltZV9UWkluZm9UeXBlKTsKIAotICAgICAgICB4ID0gUHlDT2JqZWN0X0Zyb21Wb2lkUHRyQW5kRGVzYygmQ0FQSSwgKHZvaWQqKSBEQVRFVElNRV9BUElfTUFHSUMsCi0gICAgICAgICAgICAgICAgTlVMTCk7Ci0gICAgICAgIGlmICh4ID09IE5VTEwpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiZGF0ZXRpbWVfQ0FQSSIsIHgpOworICAgIHggPSBQeUNPYmplY3RfRnJvbVZvaWRQdHJBbmREZXNjKCZDQVBJLCAodm9pZCopIERBVEVUSU1FX0FQSV9NQUdJQywKKyAgICAgICAgTlVMTCk7CisgICAgaWYgKHggPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiZGF0ZXRpbWVfQ0FQSSIsIHgpOwogCi0JLyogQSA0LXllYXIgY3ljbGUgaGFzIGFuIGV4dHJhIGxlYXAgZGF5IG92ZXIgd2hhdCB3ZSdkIGdldCBmcm9tCi0JICogcGFzdGluZyB0b2dldGhlciA0IHNpbmdsZSB5ZWFycy4KLQkgKi8KLQlhc3NlcnQoREk0WSA9PSA0ICogMzY1ICsgMSk7Ci0JYXNzZXJ0KERJNFkgPT0gZGF5c19iZWZvcmVfeWVhcig0KzEpKTsKKyAgICAvKiBBIDQteWVhciBjeWNsZSBoYXMgYW4gZXh0cmEgbGVhcCBkYXkgb3ZlciB3aGF0IHdlJ2QgZ2V0IGZyb20KKyAgICAgKiBwYXN0aW5nIHRvZ2V0aGVyIDQgc2luZ2xlIHllYXJzLgorICAgICAqLworICAgIGFzc2VydChESTRZID09IDQgKiAzNjUgKyAxKTsKKyAgICBhc3NlcnQoREk0WSA9PSBkYXlzX2JlZm9yZV95ZWFyKDQrMSkpOwogCi0JLyogU2ltaWxhcmx5LCBhIDQwMC15ZWFyIGN5Y2xlIGhhcyBhbiBleHRyYSBsZWFwIGRheSBvdmVyIHdoYXQgd2UnZAotCSAqIGdldCBmcm9tIHBhc3RpbmcgdG9nZXRoZXIgNCAxMDAteWVhciBjeWNsZXMuCi0JICovCi0JYXNzZXJ0KERJNDAwWSA9PSA0ICogREkxMDBZICsgMSk7Ci0JYXNzZXJ0KERJNDAwWSA9PSBkYXlzX2JlZm9yZV95ZWFyKDQwMCsxKSk7CisgICAgLyogU2ltaWxhcmx5LCBhIDQwMC15ZWFyIGN5Y2xlIGhhcyBhbiBleHRyYSBsZWFwIGRheSBvdmVyIHdoYXQgd2UnZAorICAgICAqIGdldCBmcm9tIHBhc3RpbmcgdG9nZXRoZXIgNCAxMDAteWVhciBjeWNsZXMuCisgICAgICovCisgICAgYXNzZXJ0KERJNDAwWSA9PSA0ICogREkxMDBZICsgMSk7CisgICAgYXNzZXJ0KERJNDAwWSA9PSBkYXlzX2JlZm9yZV95ZWFyKDQwMCsxKSk7CiAKLQkvKiBPVE9ILCBhIDEwMC15ZWFyIGN5Y2xlIGhhcyBvbmUgZmV3ZXIgbGVhcCBkYXkgdGhhbiB3ZSdkIGdldCBmcm9tCi0JICogcGFzdGluZyB0b2dldGhlciAyNSA0LXllYXIgY3ljbGVzLgotCSAqLwotCWFzc2VydChESTEwMFkgPT0gMjUgKiBESTRZIC0gMSk7Ci0JYXNzZXJ0KERJMTAwWSA9PSBkYXlzX2JlZm9yZV95ZWFyKDEwMCsxKSk7CisgICAgLyogT1RPSCwgYSAxMDAteWVhciBjeWNsZSBoYXMgb25lIGZld2VyIGxlYXAgZGF5IHRoYW4gd2UnZCBnZXQgZnJvbQorICAgICAqIHBhc3RpbmcgdG9nZXRoZXIgMjUgNC15ZWFyIGN5Y2xlcy4KKyAgICAgKi8KKyAgICBhc3NlcnQoREkxMDBZID09IDI1ICogREk0WSAtIDEpOworICAgIGFzc2VydChESTEwMFkgPT0gZGF5c19iZWZvcmVfeWVhcigxMDArMSkpOwogCi0JdXNfcGVyX3VzID0gUHlJbnRfRnJvbUxvbmcoMSk7Ci0JdXNfcGVyX21zID0gUHlJbnRfRnJvbUxvbmcoMTAwMCk7Ci0JdXNfcGVyX3NlY29uZCA9IFB5SW50X0Zyb21Mb25nKDEwMDAwMDApOwotCXVzX3Blcl9taW51dGUgPSBQeUludF9Gcm9tTG9uZyg2MDAwMDAwMCk7Ci0Jc2Vjb25kc19wZXJfZGF5ID0gUHlJbnRfRnJvbUxvbmcoMjQgKiAzNjAwKTsKLQlpZiAodXNfcGVyX3VzID09IE5VTEwgfHwgdXNfcGVyX21zID09IE5VTEwgfHwgdXNfcGVyX3NlY29uZCA9PSBOVUxMIHx8Ci0JICAgIHVzX3Blcl9taW51dGUgPT0gTlVMTCB8fCBzZWNvbmRzX3Blcl9kYXkgPT0gTlVMTCkKLQkJcmV0dXJuOworICAgIHVzX3Blcl91cyA9IFB5SW50X0Zyb21Mb25nKDEpOworICAgIHVzX3Blcl9tcyA9IFB5SW50X0Zyb21Mb25nKDEwMDApOworICAgIHVzX3Blcl9zZWNvbmQgPSBQeUludF9Gcm9tTG9uZygxMDAwMDAwKTsKKyAgICB1c19wZXJfbWludXRlID0gUHlJbnRfRnJvbUxvbmcoNjAwMDAwMDApOworICAgIHNlY29uZHNfcGVyX2RheSA9IFB5SW50X0Zyb21Mb25nKDI0ICogMzYwMCk7CisgICAgaWYgKHVzX3Blcl91cyA9PSBOVUxMIHx8IHVzX3Blcl9tcyA9PSBOVUxMIHx8IHVzX3Blcl9zZWNvbmQgPT0gTlVMTCB8fAorICAgICAgICB1c19wZXJfbWludXRlID09IE5VTEwgfHwgc2Vjb25kc19wZXJfZGF5ID09IE5VTEwpCisgICAgICAgIHJldHVybjsKIAotCS8qIFRoZSByZXN0IGFyZSB0b28gYmlnIGZvciAzMi1iaXQgaW50cywgYnV0IGV2ZW4KLQkgKiB1c19wZXJfd2VlayBmaXRzIGluIDQwIGJpdHMsIHNvIGRvdWJsZXMgc2hvdWxkIGJlIGV4YWN0LgotCSAqLwotCXVzX3Blcl9ob3VyID0gUHlMb25nX0Zyb21Eb3VibGUoMzYwMDAwMDAwMC4wKTsKLQl1c19wZXJfZGF5ID0gUHlMb25nX0Zyb21Eb3VibGUoODY0MDAwMDAwMDAuMCk7Ci0JdXNfcGVyX3dlZWsgPSBQeUxvbmdfRnJvbURvdWJsZSg2MDQ4MDAwMDAwMDAuMCk7Ci0JaWYgKHVzX3Blcl9ob3VyID09IE5VTEwgfHwgdXNfcGVyX2RheSA9PSBOVUxMIHx8IHVzX3Blcl93ZWVrID09IE5VTEwpCi0JCXJldHVybjsKKyAgICAvKiBUaGUgcmVzdCBhcmUgdG9vIGJpZyBmb3IgMzItYml0IGludHMsIGJ1dCBldmVuCisgICAgICogdXNfcGVyX3dlZWsgZml0cyBpbiA0MCBiaXRzLCBzbyBkb3VibGVzIHNob3VsZCBiZSBleGFjdC4KKyAgICAgKi8KKyAgICB1c19wZXJfaG91ciA9IFB5TG9uZ19Gcm9tRG91YmxlKDM2MDAwMDAwMDAuMCk7CisgICAgdXNfcGVyX2RheSA9IFB5TG9uZ19Gcm9tRG91YmxlKDg2NDAwMDAwMDAwLjApOworICAgIHVzX3Blcl93ZWVrID0gUHlMb25nX0Zyb21Eb3VibGUoNjA0ODAwMDAwMDAwLjApOworICAgIGlmICh1c19wZXJfaG91ciA9PSBOVUxMIHx8IHVzX3Blcl9kYXkgPT0gTlVMTCB8fCB1c19wZXJfd2VlayA9PSBOVUxMKQorICAgICAgICByZXR1cm47CiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29tZSB0aW1lIHpvbmUgYWxnZWJyYS4gIEZvciBhIGRhdGV0aW1lIHgsIGxldAogICAgIHgubiA9IHggc3RyaXBwZWQgb2YgaXRzIHRpbWV6b25lIC0tIGl0cyBuYWl2ZSB0aW1lLgogICAgIHgubyA9IHgudXRjb2Zmc2V0KCksIGFuZCBhc3N1bWluZyB0aGF0IGRvZXNuJ3QgcmFpc2UgYW4gZXhjZXB0aW9uIG9yCi0gICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgIHJldHVybiBOb25lCiAgICAgeC5kID0geC5kc3QoKSwgYW5kIGFzc3VtaW5nIHRoYXQgZG9lc24ndCByYWlzZSBhbiBleGNlcHRpb24gb3IKLSAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgcmV0dXJuIE5vbmUKICAgICB4LnMgPSB4J3Mgc3RhbmRhcmQgb2Zmc2V0LCB4Lm8gLSB4LmQKIAogTm93IHNvbWUgZGVyaXZlZCBydWxlcywgd2hlcmUgayBpcyBhIGR1cmF0aW9uICh0aW1lZGVsdGEpLgpAQCAtNTAxNiwxMyArNTAxNiwxMyBAQAogYWxyZWFkeSk6CiAKICAgICBkaWZmJyA9IHgubiAtICh6Jy5uIC0geicubykgPSAgICAgICAgICAgcmVwbGFjaW5nIHonLm4gdmlhIFs3XQotICAgICAgICAgICAgeC5uICAtICh6Lm4gKyBkaWZmIC0geicubykgPSAgICByZXBsYWNpbmcgZGlmZiB2aWEgWzZdCi0gICAgICAgICAgICB4Lm4gLSAoei5uICsgeC5uIC0gKHoubiAtIHoubykgLSB6Jy5vKSA9Ci0gICAgICAgICAgICB4Lm4gLSB6Lm4gLSB4Lm4gKyB6Lm4gLSB6Lm8gKyB6Jy5vID0gICAgY2FuY2VsIHgubgotICAgICAgICAgICAgLSB6Lm4gKyB6Lm4gLSB6Lm8gKyB6Jy5vID0gICAgICAgICAgICAgIGNhbmNlbCB6Lm4KLSAgICAgICAgICAgIC0gei5vICsgeicubyA9ICAgICAgICAgICAgICAgICAgICAgICMxIHR3aWNlCi0gICAgICAgICAgICAtei5zIC0gei5kICsgeicucyArIHonLmQgPSAgICAgICAgICB6IGFuZCB6JyBoYXZlIHNhbWUgdHppbmZvCi0gICAgICAgICAgICB6Jy5kIC0gei5kCisgICAgICAgIHgubiAgLSAoei5uICsgZGlmZiAtIHonLm8pID0gICAgcmVwbGFjaW5nIGRpZmYgdmlhIFs2XQorICAgICAgICB4Lm4gLSAoei5uICsgeC5uIC0gKHoubiAtIHoubykgLSB6Jy5vKSA9CisgICAgICAgIHgubiAtIHoubiAtIHgubiArIHoubiAtIHoubyArIHonLm8gPSAgICBjYW5jZWwgeC5uCisgICAgICAgIC0gei5uICsgei5uIC0gei5vICsgeicubyA9ICAgICAgICAgICAgICBjYW5jZWwgei5uCisgICAgICAgIC0gei5vICsgeicubyA9ICAgICAgICAgICAgICAgICAgICAgICMxIHR3aWNlCisgICAgICAgIC16LnMgLSB6LmQgKyB6Jy5zICsgeicuZCA9ICAgICAgICAgIHogYW5kIHonIGhhdmUgc2FtZSB0emluZm8KKyAgICAgICAgeicuZCAtIHouZAogCiBTbyB6JyBpcyBVVEMtZXF1aXZhbGVudCB0byB4IGlmZiB6Jy5kID0gei5kIGF0IHRoaXMgcG9pbnQuICBJZiB0aGV5IGFyZSBlcXVhbCwKIHdlJ3ZlIGZvdW5kIHRoZSBVVEMtZXF1aXZhbGVudCBzbyBhcmUgZG9uZS4gIEluIGZhY3QsIHdlIHN0b3Agd2l0aCBbN10gYW5kCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2RibW1vZHVsZS5jIGIvTW9kdWxlcy9kYm1tb2R1bGUuYwppbmRleCAwYzUwYjU0Li5mOWM5OWE4IDEwMDY0NAotLS0gYS9Nb2R1bGVzL2RibW1vZHVsZS5jCisrKyBiL01vZHVsZXMvZGJtbW9kdWxlLmMKQEAgLTMyLDkgKzMyLDkgQEAKICNlbmRpZgogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCWludCBkaV9zaXplOwkvKiAtMSBtZWFucyByZWNvbXB1dGUgKi8KLQlEQk0gKmRpX2RibTsKKyAgICBQeU9iamVjdF9IRUFECisgICAgaW50IGRpX3NpemU7ICAgICAgICAvKiAtMSBtZWFucyByZWNvbXB1dGUgKi8KKyAgICBEQk0gKmRpX2RibTsKIH0gZGJtb2JqZWN0OwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IERibXR5cGU7CkBAIC00OSwxOCArNDksMTggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBuZXdkYm1vYmplY3QoY2hhciAqZmlsZSwgaW50IGZsYWdzLCBpbnQgbW9kZSkKIHsKLSAgICAgICAgZGJtb2JqZWN0ICpkcDsKKyAgICBkYm1vYmplY3QgKmRwOwogCi0JZHAgPSBQeU9iamVjdF9OZXcoZGJtb2JqZWN0LCAmRGJtdHlwZSk7Ci0JaWYgKGRwID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWRwLT5kaV9zaXplID0gLTE7Ci0JaWYgKCAoZHAtPmRpX2RibSA9IGRibV9vcGVuKGZpbGUsIGZsYWdzLCBtb2RlKSkgPT0gMCApIHsKLQkJUHlFcnJfU2V0RnJvbUVycm5vKERibUVycm9yKTsKLQkJUHlfREVDUkVGKGRwKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiAoUHlPYmplY3QgKilkcDsKKyAgICBkcCA9IFB5T2JqZWN0X05ldyhkYm1vYmplY3QsICZEYm10eXBlKTsKKyAgICBpZiAoZHAgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZHAtPmRpX3NpemUgPSAtMTsKKyAgICBpZiAoIChkcC0+ZGlfZGJtID0gZGJtX29wZW4oZmlsZSwgZmxhZ3MsIG1vZGUpKSA9PSAwICkgeworICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oRGJtRXJyb3IpOworICAgICAgICBQeV9ERUNSRUYoZHApOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWRwOwogfQogCiAvKiBNZXRob2RzICovCkBAIC02OCwxMTkgKzY4LDExOSBAQAogc3RhdGljIHZvaWQKIGRibV9kZWFsbG9jKHJlZ2lzdGVyIGRibW9iamVjdCAqZHApCiB7Ci0gICAgICAgIGlmICggZHAtPmRpX2RibSApCi0JCWRibV9jbG9zZShkcC0+ZGlfZGJtKTsKLQlQeU9iamVjdF9EZWwoZHApOworICAgIGlmICggZHAtPmRpX2RibSApCisgICAgICAgIGRibV9jbG9zZShkcC0+ZGlfZGJtKTsKKyAgICBQeU9iamVjdF9EZWwoZHApOwogfQogCiBzdGF0aWMgUHlfc3NpemVfdAogZGJtX2xlbmd0aChkYm1vYmplY3QgKmRwKQogewotICAgICAgICBpZiAoZHAtPmRpX2RibSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhEYm1FcnJvciwgIkRCTSBvYmplY3QgaGFzIGFscmVhZHkgYmVlbiBjbG9zZWQiKTsgCi0gICAgICAgICAgICAgICAgIHJldHVybiAtMTsgCi0gICAgICAgIH0KLSAgICAgICAgaWYgKCBkcC0+ZGlfc2l6ZSA8IDAgKSB7Ci0JCWRhdHVtIGtleTsKLQkJaW50IHNpemU7CisgICAgaWYgKGRwLT5kaV9kYm0gPT0gTlVMTCkgeworICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhEYm1FcnJvciwgIkRCTSBvYmplY3QgaGFzIGFscmVhZHkgYmVlbiBjbG9zZWQiKTsKKyAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICggZHAtPmRpX3NpemUgPCAwICkgeworICAgICAgICBkYXR1bSBrZXk7CisgICAgICAgIGludCBzaXplOwogCi0JCXNpemUgPSAwOwotCQlmb3IgKCBrZXk9ZGJtX2ZpcnN0a2V5KGRwLT5kaV9kYm0pOyBrZXkuZHB0cjsKLQkJICAgICAga2V5ID0gZGJtX25leHRrZXkoZHAtPmRpX2RibSkpCi0JCQlzaXplKys7Ci0JCWRwLT5kaV9zaXplID0gc2l6ZTsKLQl9Ci0JcmV0dXJuIGRwLT5kaV9zaXplOworICAgICAgICBzaXplID0gMDsKKyAgICAgICAgZm9yICgga2V5PWRibV9maXJzdGtleShkcC0+ZGlfZGJtKTsga2V5LmRwdHI7CisgICAgICAgICAgICAgIGtleSA9IGRibV9uZXh0a2V5KGRwLT5kaV9kYm0pKQorICAgICAgICAgICAgc2l6ZSsrOworICAgICAgICBkcC0+ZGlfc2l6ZSA9IHNpemU7CisgICAgfQorICAgIHJldHVybiBkcC0+ZGlfc2l6ZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRibV9zdWJzY3JpcHQoZGJtb2JqZWN0ICpkcCwgcmVnaXN0ZXIgUHlPYmplY3QgKmtleSkKIHsKLQlkYXR1bSBkcmVjLCBrcmVjOwotCWludCB0bXBfc2l6ZTsKLQkKLQlpZiAoIVB5QXJnX1BhcnNlKGtleSwgInMjIiwgJmtyZWMuZHB0ciwgJnRtcF9zaXplKSApCi0JCXJldHVybiBOVUxMOwotCQotCWtyZWMuZHNpemUgPSB0bXBfc2l6ZTsKLSAgICAgICAgY2hlY2tfZGJtb2JqZWN0X29wZW4oZHApOwotCWRyZWMgPSBkYm1fZmV0Y2goZHAtPmRpX2RibSwga3JlYyk7Ci0JaWYgKCBkcmVjLmRwdHIgPT0gMCApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0tleUVycm9yLAotCQkJCVB5U3RyaW5nX0FTX1NUUklORygoUHlTdHJpbmdPYmplY3QgKilrZXkpKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmICggZGJtX2Vycm9yKGRwLT5kaV9kYm0pICkgewotCQlkYm1fY2xlYXJlcnIoZHAtPmRpX2RibSk7Ci0JCVB5RXJyX1NldFN0cmluZyhEYm1FcnJvciwgIiIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGRyZWMuZHB0ciwgZHJlYy5kc2l6ZSk7CisgICAgZGF0dW0gZHJlYywga3JlYzsKKyAgICBpbnQgdG1wX3NpemU7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGtleSwgInMjIiwgJmtyZWMuZHB0ciwgJnRtcF9zaXplKSApCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAga3JlYy5kc2l6ZSA9IHRtcF9zaXplOworICAgIGNoZWNrX2RibW9iamVjdF9vcGVuKGRwKTsKKyAgICBkcmVjID0gZGJtX2ZldGNoKGRwLT5kaV9kYm0sIGtyZWMpOworICAgIGlmICggZHJlYy5kcHRyID09IDAgKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19LZXlFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FTX1NUUklORygoUHlTdHJpbmdPYmplY3QgKilrZXkpKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmICggZGJtX2Vycm9yKGRwLT5kaV9kYm0pICkgeworICAgICAgICBkYm1fY2xlYXJlcnIoZHAtPmRpX2RibSk7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhEYm1FcnJvciwgIiIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGRyZWMuZHB0ciwgZHJlYy5kc2l6ZSk7CiB9CiAKIHN0YXRpYyBpbnQKIGRibV9hc3Nfc3ViKGRibW9iamVjdCAqZHAsIFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdykKIHsKLSAgICAgICAgZGF0dW0ga3JlYywgZHJlYzsKLQlpbnQgdG1wX3NpemU7Ci0JCi0gICAgICAgIGlmICggIVB5QXJnX1BhcnNlKHYsICJzIyIsICZrcmVjLmRwdHIsICZ0bXBfc2l6ZSkgKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJImRibSBtYXBwaW5ncyBoYXZlIHN0cmluZyBpbmRpY2VzIG9ubHkiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlrcmVjLmRzaXplID0gdG1wX3NpemU7Ci0gICAgICAgIGlmIChkcC0+ZGlfZGJtID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKERibUVycm9yLCAiREJNIG9iamVjdCBoYXMgYWxyZWFkeSBiZWVuIGNsb3NlZCIpOyAKLSAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIGRhdHVtIGtyZWMsIGRyZWM7CisgICAgaW50IHRtcF9zaXplOworCisgICAgaWYgKCAhUHlBcmdfUGFyc2UodiwgInMjIiwgJmtyZWMuZHB0ciwgJnRtcF9zaXplKSApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJkYm0gbWFwcGluZ3MgaGF2ZSBzdHJpbmcgaW5kaWNlcyBvbmx5Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAga3JlYy5kc2l6ZSA9IHRtcF9zaXplOworICAgIGlmIChkcC0+ZGlfZGJtID09IE5VTEwpIHsKKyAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoRGJtRXJyb3IsICJEQk0gb2JqZWN0IGhhcyBhbHJlYWR5IGJlZW4gY2xvc2VkIik7CisgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBkcC0+ZGlfc2l6ZSA9IC0xOworICAgIGlmICh3ID09IE5VTEwpIHsKKyAgICAgICAgaWYgKCBkYm1fZGVsZXRlKGRwLT5kaV9kYm0sIGtyZWMpIDwgMCApIHsKKyAgICAgICAgICAgIGRibV9jbGVhcmVycihkcC0+ZGlfZGJtKTsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19LZXlFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKChQeVN0cmluZ09iamVjdCAqKXYpKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfQotCWRwLT5kaV9zaXplID0gLTE7Ci0JaWYgKHcgPT0gTlVMTCkgewotCQlpZiAoIGRibV9kZWxldGUoZHAtPmRpX2RibSwga3JlYykgPCAwICkgewotCQkJZGJtX2NsZWFyZXJyKGRwLT5kaV9kYm0pOwotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0tleUVycm9yLAotCQkJCSAgICAgIFB5U3RyaW5nX0FTX1NUUklORygoUHlTdHJpbmdPYmplY3QgKil2KSk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9IGVsc2UgewotCQlpZiAoICFQeUFyZ19QYXJzZSh3LCAicyMiLCAmZHJlYy5kcHRyLCAmdG1wX3NpemUpICkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkgICAgICJkYm0gbWFwcGluZ3MgaGF2ZSBzdHJpbmcgZWxlbWVudHMgb25seSIpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWRyZWMuZHNpemUgPSB0bXBfc2l6ZTsKLQkJaWYgKCBkYm1fc3RvcmUoZHAtPmRpX2RibSwga3JlYywgZHJlYywgREJNX1JFUExBQ0UpIDwgMCApIHsKLQkJCWRibV9jbGVhcmVycihkcC0+ZGlfZGJtKTsKLQkJCVB5RXJyX1NldFN0cmluZyhEYm1FcnJvciwKLQkJCQkJImNhbm5vdCBhZGQgaXRlbSB0byBkYXRhYmFzZSIpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQotCWlmICggZGJtX2Vycm9yKGRwLT5kaV9kYm0pICkgewotCQlkYm1fY2xlYXJlcnIoZHAtPmRpX2RibSk7Ci0JCVB5RXJyX1NldFN0cmluZyhEYm1FcnJvciwgIiIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXJldHVybiAwOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmICggIVB5QXJnX1BhcnNlKHcsICJzIyIsICZkcmVjLmRwdHIsICZ0bXBfc2l6ZSkgKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICJkYm0gbWFwcGluZ3MgaGF2ZSBzdHJpbmcgZWxlbWVudHMgb25seSIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGRyZWMuZHNpemUgPSB0bXBfc2l6ZTsKKyAgICAgICAgaWYgKCBkYm1fc3RvcmUoZHAtPmRpX2RibSwga3JlYywgZHJlYywgREJNX1JFUExBQ0UpIDwgMCApIHsKKyAgICAgICAgICAgIGRibV9jbGVhcmVycihkcC0+ZGlfZGJtKTsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhEYm1FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2Fubm90IGFkZCBpdGVtIHRvIGRhdGFiYXNlIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCBkYm1fZXJyb3IoZHAtPmRpX2RibSkgKSB7CisgICAgICAgIGRibV9jbGVhcmVycihkcC0+ZGlfZGJtKTsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKERibUVycm9yLCAiIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIGRibV9jb250YWlucyhyZWdpc3RlciBkYm1vYmplY3QgKmRwLCBQeU9iamVjdCAqdikKIHsKLQlkYXR1bSBrZXksIHZhbDsKKyAgICBkYXR1bSBrZXksIHZhbDsKIAotCWlmIChQeVN0cmluZ19Bc1N0cmluZ0FuZFNpemUodiwgKGNoYXIgKiopJmtleS5kcHRyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFB5X3NzaXplX3QgKikma2V5LmRzaXplKSkgewotCQlyZXR1cm4gLTE7Ci0JfQorICAgIGlmIChQeVN0cmluZ19Bc1N0cmluZ0FuZFNpemUodiwgKGNoYXIgKiopJmtleS5kcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFB5X3NzaXplX3QgKikma2V5LmRzaXplKSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JLyogRXhwYW5kIGNoZWNrX2RibW9iamVjdF9vcGVuIHRvIHJldHVybiAtMSAqLwotCWlmIChkcC0+ZGlfZGJtID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKERibUVycm9yLCAiREJNIG9iamVjdCBoYXMgYWxyZWFkeSBiZWVuIGNsb3NlZCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXZhbCA9IGRibV9mZXRjaChkcC0+ZGlfZGJtLCBrZXkpOwotCXJldHVybiB2YWwuZHB0ciAhPSBOVUxMOworICAgIC8qIEV4cGFuZCBjaGVja19kYm1vYmplY3Rfb3BlbiB0byByZXR1cm4gLTEgKi8KKyAgICBpZiAoZHAtPmRpX2RibSA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhEYm1FcnJvciwgIkRCTSBvYmplY3QgaGFzIGFscmVhZHkgYmVlbiBjbG9zZWQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICB2YWwgPSBkYm1fZmV0Y2goZHAtPmRpX2RibSwga2V5KTsKKyAgICByZXR1cm4gdmFsLmRwdHIgIT0gTlVMTDsKIH0KIAogc3RhdGljIFB5U2VxdWVuY2VNZXRob2RzIGRibV9hc19zZXF1ZW5jZSA9IHsKQEAgLTE5NywxNTkgKzE5NywxNTkgQEAKIH07CiAKIHN0YXRpYyBQeU1hcHBpbmdNZXRob2RzIGRibV9hc19tYXBwaW5nID0gewotCShsZW5mdW5jKWRibV9sZW5ndGgsCQkvKm1wX2xlbmd0aCovCi0JKGJpbmFyeWZ1bmMpZGJtX3N1YnNjcmlwdCwJLyptcF9zdWJzY3JpcHQqLwotCShvYmpvYmphcmdwcm9jKWRibV9hc3Nfc3ViLAkvKm1wX2Fzc19zdWJzY3JpcHQqLworICAgIChsZW5mdW5jKWRibV9sZW5ndGgsICAgICAgICAgICAgICAgIC8qbXBfbGVuZ3RoKi8KKyAgICAoYmluYXJ5ZnVuYylkYm1fc3Vic2NyaXB0LCAgICAgICAgICAvKm1wX3N1YnNjcmlwdCovCisgICAgKG9iam9iamFyZ3Byb2MpZGJtX2Fzc19zdWIsICAgICAgICAgLyptcF9hc3Nfc3Vic2NyaXB0Ki8KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkYm1fX2Nsb3NlKHJlZ2lzdGVyIGRibW9iamVjdCAqZHAsIFB5T2JqZWN0ICp1bnVzZWQpCiB7Ci0gICAgICAgIGlmIChkcC0+ZGlfZGJtKQotCQlkYm1fY2xvc2UoZHAtPmRpX2RibSk7Ci0JZHAtPmRpX2RibSA9IE5VTEw7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGlmIChkcC0+ZGlfZGJtKQorICAgICAgICBkYm1fY2xvc2UoZHAtPmRpX2RibSk7CisgICAgZHAtPmRpX2RibSA9IE5VTEw7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZGJtX2tleXMocmVnaXN0ZXIgZGJtb2JqZWN0ICpkcCwgUHlPYmplY3QgKnVudXNlZCkKIHsKLQlyZWdpc3RlciBQeU9iamVjdCAqdiwgKml0ZW07Ci0JZGF0dW0ga2V5OwotCWludCBlcnI7CisgICAgcmVnaXN0ZXIgUHlPYmplY3QgKnYsICppdGVtOworICAgIGRhdHVtIGtleTsKKyAgICBpbnQgZXJyOwogCi0gICAgICAgIGNoZWNrX2RibW9iamVjdF9vcGVuKGRwKTsKLQl2ID0gUHlMaXN0X05ldygwKTsKLQlpZiAodiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlmb3IgKGtleSA9IGRibV9maXJzdGtleShkcC0+ZGlfZGJtKTsga2V5LmRwdHI7Ci0JICAgICBrZXkgPSBkYm1fbmV4dGtleShkcC0+ZGlfZGJtKSkgewotCQlpdGVtID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoa2V5LmRwdHIsIGtleS5kc2l6ZSk7Ci0JCWlmIChpdGVtID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRih2KTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWVyciA9IFB5TGlzdF9BcHBlbmQodiwgaXRlbSk7Ci0JCVB5X0RFQ1JFRihpdGVtKTsKLQkJaWYgKGVyciAhPSAwKSB7Ci0JCQlQeV9ERUNSRUYodik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KLQlyZXR1cm4gdjsKKyAgICBjaGVja19kYm1vYmplY3Rfb3BlbihkcCk7CisgICAgdiA9IFB5TGlzdF9OZXcoMCk7CisgICAgaWYgKHYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZm9yIChrZXkgPSBkYm1fZmlyc3RrZXkoZHAtPmRpX2RibSk7IGtleS5kcHRyOworICAgICAgICAga2V5ID0gZGJtX25leHRrZXkoZHAtPmRpX2RibSkpIHsKKyAgICAgICAgaXRlbSA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGtleS5kcHRyLCBrZXkuZHNpemUpOworICAgICAgICBpZiAoaXRlbSA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBlcnIgPSBQeUxpc3RfQXBwZW5kKHYsIGl0ZW0pOworICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CisgICAgICAgIGlmIChlcnIgIT0gMCkgeworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHY7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkYm1faGFzX2tleShyZWdpc3RlciBkYm1vYmplY3QgKmRwLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICp0bXBfcHRyOwotCWRhdHVtIGtleSwgdmFsOwotCWludCB0bXBfc2l6ZTsKLQkKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjOmhhc19rZXkiLCAmdG1wX3B0ciwgJnRtcF9zaXplKSkKLQkJcmV0dXJuIE5VTEw7Ci0Ja2V5LmRwdHIgPSB0bXBfcHRyOwotCWtleS5kc2l6ZSA9IHRtcF9zaXplOwotICAgICAgICBjaGVja19kYm1vYmplY3Rfb3BlbihkcCk7Ci0JdmFsID0gZGJtX2ZldGNoKGRwLT5kaV9kYm0sIGtleSk7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKHZhbC5kcHRyICE9IE5VTEwpOworICAgIGNoYXIgKnRtcF9wdHI7CisgICAgZGF0dW0ga2V5LCB2YWw7CisgICAgaW50IHRtcF9zaXplOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIzpoYXNfa2V5IiwgJnRtcF9wdHIsICZ0bXBfc2l6ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGtleS5kcHRyID0gdG1wX3B0cjsKKyAgICBrZXkuZHNpemUgPSB0bXBfc2l6ZTsKKyAgICBjaGVja19kYm1vYmplY3Rfb3BlbihkcCk7CisgICAgdmFsID0gZGJtX2ZldGNoKGRwLT5kaV9kYm0sIGtleSk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHZhbC5kcHRyICE9IE5VTEwpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZGJtX2dldChyZWdpc3RlciBkYm1vYmplY3QgKmRwLCBQeU9iamVjdCAqYXJncykKIHsKLQlkYXR1bSBrZXksIHZhbDsKLQlQeU9iamVjdCAqZGVmdmFsdWUgPSBQeV9Ob25lOwotCWNoYXIgKnRtcF9wdHI7Ci0JaW50IHRtcF9zaXplOworICAgIGRhdHVtIGtleSwgdmFsOworICAgIFB5T2JqZWN0ICpkZWZ2YWx1ZSA9IFB5X05vbmU7CisgICAgY2hhciAqdG1wX3B0cjsKKyAgICBpbnQgdG1wX3NpemU7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjfE86Z2V0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0bXBfcHRyLCAmdG1wX3NpemUsICZkZWZ2YWx1ZSkpCi0JCXJldHVybiBOVUxMOwotCWtleS5kcHRyID0gdG1wX3B0cjsKLQlrZXkuZHNpemUgPSB0bXBfc2l6ZTsKLSAgICAgICAgY2hlY2tfZGJtb2JqZWN0X29wZW4oZHApOwotCXZhbCA9IGRibV9mZXRjaChkcC0+ZGlfZGJtLCBrZXkpOwotCWlmICh2YWwuZHB0ciAhPSBOVUxMKQotCQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUodmFsLmRwdHIsIHZhbC5kc2l6ZSk7Ci0JZWxzZSB7Ci0JCVB5X0lOQ1JFRihkZWZ2YWx1ZSk7Ci0JCXJldHVybiBkZWZ2YWx1ZTsKLQl9CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI3xPOmdldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0bXBfcHRyLCAmdG1wX3NpemUsICZkZWZ2YWx1ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGtleS5kcHRyID0gdG1wX3B0cjsKKyAgICBrZXkuZHNpemUgPSB0bXBfc2l6ZTsKKyAgICBjaGVja19kYm1vYmplY3Rfb3BlbihkcCk7CisgICAgdmFsID0gZGJtX2ZldGNoKGRwLT5kaV9kYm0sIGtleSk7CisgICAgaWYgKHZhbC5kcHRyICE9IE5VTEwpCisgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSh2YWwuZHB0ciwgdmFsLmRzaXplKTsKKyAgICBlbHNlIHsKKyAgICAgICAgUHlfSU5DUkVGKGRlZnZhbHVlKTsKKyAgICAgICAgcmV0dXJuIGRlZnZhbHVlOworICAgIH0KIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRibV9zZXRkZWZhdWx0KHJlZ2lzdGVyIGRibW9iamVjdCAqZHAsIFB5T2JqZWN0ICphcmdzKQogewotCWRhdHVtIGtleSwgdmFsOwotCVB5T2JqZWN0ICpkZWZ2YWx1ZSA9IE5VTEw7Ci0JY2hhciAqdG1wX3B0cjsKLQlpbnQgdG1wX3NpemU7CisgICAgZGF0dW0ga2V5LCB2YWw7CisgICAgUHlPYmplY3QgKmRlZnZhbHVlID0gTlVMTDsKKyAgICBjaGFyICp0bXBfcHRyOworICAgIGludCB0bXBfc2l6ZTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyN8UzpzZXRkZWZhdWx0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0bXBfcHRyLCAmdG1wX3NpemUsICZkZWZ2YWx1ZSkpCi0JCXJldHVybiBOVUxMOwotCWtleS5kcHRyID0gdG1wX3B0cjsKLQlrZXkuZHNpemUgPSB0bXBfc2l6ZTsKLSAgICAgICAgY2hlY2tfZGJtb2JqZWN0X29wZW4oZHApOwotCXZhbCA9IGRibV9mZXRjaChkcC0+ZGlfZGJtLCBrZXkpOwotCWlmICh2YWwuZHB0ciAhPSBOVUxMKQotCQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUodmFsLmRwdHIsIHZhbC5kc2l6ZSk7Ci0JaWYgKGRlZnZhbHVlID09IE5VTEwpIHsKLQkJZGVmdmFsdWUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCAwKTsKLQkJaWYgKGRlZnZhbHVlID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZWxzZQotCQlQeV9JTkNSRUYoZGVmdmFsdWUpOwotCXZhbC5kcHRyID0gUHlTdHJpbmdfQVNfU1RSSU5HKGRlZnZhbHVlKTsKLQl2YWwuZHNpemUgPSBQeVN0cmluZ19HRVRfU0laRShkZWZ2YWx1ZSk7Ci0JaWYgKGRibV9zdG9yZShkcC0+ZGlfZGJtLCBrZXksIHZhbCwgREJNX0lOU0VSVCkgPCAwKSB7Ci0JCWRibV9jbGVhcmVycihkcC0+ZGlfZGJtKTsKLQkJUHlFcnJfU2V0U3RyaW5nKERibUVycm9yLCAiY2Fubm90IGFkZCBpdGVtIHRvIGRhdGFiYXNlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gZGVmdmFsdWU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI3xTOnNldGRlZmF1bHQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdG1wX3B0ciwgJnRtcF9zaXplLCAmZGVmdmFsdWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBrZXkuZHB0ciA9IHRtcF9wdHI7CisgICAga2V5LmRzaXplID0gdG1wX3NpemU7CisgICAgY2hlY2tfZGJtb2JqZWN0X29wZW4oZHApOworICAgIHZhbCA9IGRibV9mZXRjaChkcC0+ZGlfZGJtLCBrZXkpOworICAgIGlmICh2YWwuZHB0ciAhPSBOVUxMKQorICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUodmFsLmRwdHIsIHZhbC5kc2l6ZSk7CisgICAgaWYgKGRlZnZhbHVlID09IE5VTEwpIHsKKyAgICAgICAgZGVmdmFsdWUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCAwKTsKKyAgICAgICAgaWYgKGRlZnZhbHVlID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBQeV9JTkNSRUYoZGVmdmFsdWUpOworICAgIHZhbC5kcHRyID0gUHlTdHJpbmdfQVNfU1RSSU5HKGRlZnZhbHVlKTsKKyAgICB2YWwuZHNpemUgPSBQeVN0cmluZ19HRVRfU0laRShkZWZ2YWx1ZSk7CisgICAgaWYgKGRibV9zdG9yZShkcC0+ZGlfZGJtLCBrZXksIHZhbCwgREJNX0lOU0VSVCkgPCAwKSB7CisgICAgICAgIGRibV9jbGVhcmVycihkcC0+ZGlfZGJtKTsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKERibUVycm9yLCAiY2Fubm90IGFkZCBpdGVtIHRvIGRhdGFiYXNlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gZGVmdmFsdWU7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBkYm1fbWV0aG9kc1tdID0gewotCXsiY2xvc2UiLAkoUHlDRnVuY3Rpb24pZGJtX19jbG9zZSwJTUVUSF9OT0FSR1MsCi0JICJjbG9zZSgpXG5DbG9zZSB0aGUgZGF0YWJhc2UuIn0sCi0JeyJrZXlzIiwJKFB5Q0Z1bmN0aW9uKWRibV9rZXlzLAkJTUVUSF9OT0FSR1MsCi0JICJrZXlzKCkgLT4gbGlzdFxuUmV0dXJuIGEgbGlzdCBvZiBhbGwga2V5cyBpbiB0aGUgZGF0YWJhc2UuIn0sCi0JeyJoYXNfa2V5IiwJKFB5Q0Z1bmN0aW9uKWRibV9oYXNfa2V5LAlNRVRIX1ZBUkFSR1MsCi0JICJoYXNfa2V5KGtleX0gLT4gYm9vbGVhblxuUmV0dXJuIHRydWUgaWZmIGtleSBpcyBpbiB0aGUgZGF0YWJhc2UuIn0sCi0JeyJnZXQiLAkJKFB5Q0Z1bmN0aW9uKWRibV9nZXQsCQlNRVRIX1ZBUkFSR1MsCi0JICJnZXQoa2V5WywgZGVmYXVsdF0pIC0+IHZhbHVlXG4iCi0JICJSZXR1cm4gdGhlIHZhbHVlIGZvciBrZXkgaWYgcHJlc2VudCwgb3RoZXJ3aXNlIGRlZmF1bHQuIn0sCi0JeyJzZXRkZWZhdWx0IiwJKFB5Q0Z1bmN0aW9uKWRibV9zZXRkZWZhdWx0LAlNRVRIX1ZBUkFSR1MsCi0JICJzZXRkZWZhdWx0KGtleVssIGRlZmF1bHRdKSAtPiB2YWx1ZVxuIgotCSAiUmV0dXJuIHRoZSB2YWx1ZSBmb3Iga2V5IGlmIHByZXNlbnQsIG90aGVyd2lzZSBkZWZhdWx0LiAgSWYga2V5XG4iCi0JICJpcyBub3QgaW4gdGhlIGRhdGFiYXNlLCBpdCBpcyBpbnNlcnRlZCB3aXRoIGRlZmF1bHQgYXMgdGhlIHZhbHVlLiJ9LAotCXtOVUxMLAkJTlVMTH0JCS8qIHNlbnRpbmVsICovCisgICAgeyJjbG9zZSIsICAgICAgICAgICAoUHlDRnVuY3Rpb24pZGJtX19jbG9zZSwgICAgICAgIE1FVEhfTk9BUkdTLAorICAgICAiY2xvc2UoKVxuQ2xvc2UgdGhlIGRhdGFiYXNlLiJ9LAorICAgIHsia2V5cyIsICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWRibV9rZXlzLCAgICAgICAgICBNRVRIX05PQVJHUywKKyAgICAgImtleXMoKSAtPiBsaXN0XG5SZXR1cm4gYSBsaXN0IG9mIGFsbCBrZXlzIGluIHRoZSBkYXRhYmFzZS4ifSwKKyAgICB7Imhhc19rZXkiLCAgICAgICAgIChQeUNGdW5jdGlvbilkYm1faGFzX2tleSwgICAgICAgTUVUSF9WQVJBUkdTLAorICAgICAiaGFzX2tleShrZXl9IC0+IGJvb2xlYW5cblJldHVybiB0cnVlIGlmZiBrZXkgaXMgaW4gdGhlIGRhdGFiYXNlLiJ9LAorICAgIHsiZ2V0IiwgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWRibV9nZXQsICAgICAgICAgICBNRVRIX1ZBUkFSR1MsCisgICAgICJnZXQoa2V5WywgZGVmYXVsdF0pIC0+IHZhbHVlXG4iCisgICAgICJSZXR1cm4gdGhlIHZhbHVlIGZvciBrZXkgaWYgcHJlc2VudCwgb3RoZXJ3aXNlIGRlZmF1bHQuIn0sCisgICAgeyJzZXRkZWZhdWx0IiwgICAgICAoUHlDRnVuY3Rpb24pZGJtX3NldGRlZmF1bHQsICAgIE1FVEhfVkFSQVJHUywKKyAgICAgInNldGRlZmF1bHQoa2V5WywgZGVmYXVsdF0pIC0+IHZhbHVlXG4iCisgICAgICJSZXR1cm4gdGhlIHZhbHVlIGZvciBrZXkgaWYgcHJlc2VudCwgb3RoZXJ3aXNlIGRlZmF1bHQuICBJZiBrZXlcbiIKKyAgICAgImlzIG5vdCBpbiB0aGUgZGF0YWJhc2UsIGl0IGlzIGluc2VydGVkIHdpdGggZGVmYXVsdCBhcyB0aGUgdmFsdWUuIn0sCisgICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkYm1fZ2V0YXR0cihkYm1vYmplY3QgKmRwLCBjaGFyICpuYW1lKQogewotCXJldHVybiBQeV9GaW5kTWV0aG9kKGRibV9tZXRob2RzLCAoUHlPYmplY3QgKilkcCwgbmFtZSk7CisgICAgcmV0dXJuIFB5X0ZpbmRNZXRob2QoZGJtX21ldGhvZHMsIChQeU9iamVjdCAqKWRwLCBuYW1lKTsKIH0KIAogc3RhdGljIFB5VHlwZU9iamVjdCBEYm10eXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotCSJkYm0uZGJtIiwKLQlzaXplb2YoZGJtb2JqZWN0KSwKLQkwLAotCShkZXN0cnVjdG9yKWRibV9kZWFsbG9jLCAgLyp0cF9kZWFsbG9jKi8KLQkwLAkJCSAgLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKWRibV9nZXRhdHRyLCAvKnRwX2dldGF0dHIqLwotCTAsCQkJICAvKnRwX3NldGF0dHIqLwotCTAsCQkJICAvKnRwX2NvbXBhcmUqLwotCTAsCQkJICAvKnRwX3JlcHIqLwotCTAsCQkJICAvKnRwX2FzX251bWJlciovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisgICAgImRibS5kYm0iLAorICAgIHNpemVvZihkYm1vYmplY3QpLAorICAgIDAsCisgICAgKGRlc3RydWN0b3IpZGJtX2RlYWxsb2MsICAvKnRwX2RlYWxsb2MqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYylkYm1fZ2V0YXR0ciwgLyp0cF9nZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY29tcGFyZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9yZXByKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX251bWJlciovCiAgICAgJmRibV9hc19zZXF1ZW5jZSwgICAgIC8qdHBfYXNfc2VxdWVuY2UqLwotCSZkYm1fYXNfbWFwcGluZywJICAvKnRwX2FzX21hcHBpbmcqLworICAgICZkYm1fYXNfbWFwcGluZywgICAgICAgICAgICAgIC8qdHBfYXNfbWFwcGluZyovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgIC8qdHBfaGFzaCovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgIC8qdHBfY2FsbCovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgIC8qdHBfc3RyKi8KQEAgLTM2NCw1NCArMzY0LDU0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZGJtb3BlbihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqbmFtZTsKLQljaGFyICpmbGFncyA9ICJyIjsKLQlpbnQgaWZsYWdzOwotCWludCBtb2RlID0gMDY2NjsKKyAgICBjaGFyICpuYW1lOworICAgIGNoYXIgKmZsYWdzID0gInIiOworICAgIGludCBpZmxhZ3M7CisgICAgaW50IG1vZGUgPSAwNjY2OwogCi0gICAgICAgIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInN8c2k6b3BlbiIsICZuYW1lLCAmZmxhZ3MsICZtb2RlKSApCi0JCXJldHVybiBOVUxMOwotCWlmICggc3RyY21wKGZsYWdzLCAiciIpID09IDAgKQotCQlpZmxhZ3MgPSBPX1JET05MWTsKLQllbHNlIGlmICggc3RyY21wKGZsYWdzLCAidyIpID09IDAgKQotCQlpZmxhZ3MgPSBPX1JEV1I7Ci0JZWxzZSBpZiAoIHN0cmNtcChmbGFncywgInJ3IikgPT0gMCApIC8qIEIvVyBjb21wYXQgKi8KLQkJaWZsYWdzID0gT19SRFdSfE9fQ1JFQVQ7IAotCWVsc2UgaWYgKCBzdHJjbXAoZmxhZ3MsICJjIikgPT0gMCApCi0JCWlmbGFncyA9IE9fUkRXUnxPX0NSRUFUOwotCWVsc2UgaWYgKCBzdHJjbXAoZmxhZ3MsICJuIikgPT0gMCApCi0JCWlmbGFncyA9IE9fUkRXUnxPX0NSRUFUfE9fVFJVTkM7Ci0JZWxzZSB7Ci0JCVB5RXJyX1NldFN0cmluZyhEYm1FcnJvciwKLQkJCQkiYXJnIDIgdG8gb3BlbiBzaG91bGQgYmUgJ3InLCAndycsICdjJywgb3IgJ24nIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLSAgICAgICAgcmV0dXJuIG5ld2RibW9iamVjdChuYW1lLCBpZmxhZ3MsIG1vZGUpOworICAgIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInN8c2k6b3BlbiIsICZuYW1lLCAmZmxhZ3MsICZtb2RlKSApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICggc3RyY21wKGZsYWdzLCAiciIpID09IDAgKQorICAgICAgICBpZmxhZ3MgPSBPX1JET05MWTsKKyAgICBlbHNlIGlmICggc3RyY21wKGZsYWdzLCAidyIpID09IDAgKQorICAgICAgICBpZmxhZ3MgPSBPX1JEV1I7CisgICAgZWxzZSBpZiAoIHN0cmNtcChmbGFncywgInJ3IikgPT0gMCApIC8qIEIvVyBjb21wYXQgKi8KKyAgICAgICAgaWZsYWdzID0gT19SRFdSfE9fQ1JFQVQ7CisgICAgZWxzZSBpZiAoIHN0cmNtcChmbGFncywgImMiKSA9PSAwICkKKyAgICAgICAgaWZsYWdzID0gT19SRFdSfE9fQ1JFQVQ7CisgICAgZWxzZSBpZiAoIHN0cmNtcChmbGFncywgIm4iKSA9PSAwICkKKyAgICAgICAgaWZsYWdzID0gT19SRFdSfE9fQ1JFQVR8T19UUlVOQzsKKyAgICBlbHNlIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKERibUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImFyZyAyIHRvIG9wZW4gc2hvdWxkIGJlICdyJywgJ3cnLCAnYycsIG9yICduJyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIG5ld2RibW9iamVjdChuYW1lLCBpZmxhZ3MsIG1vZGUpOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgZGJtbW9kdWxlX21ldGhvZHNbXSA9IHsKLQl7ICJvcGVuIiwgKFB5Q0Z1bmN0aW9uKWRibW9wZW4sIE1FVEhfVkFSQVJHUywKLQkgICJvcGVuKHBhdGhbLCBmbGFnWywgbW9kZV1dKSAtPiBtYXBwaW5nXG4iCi0JICAiUmV0dXJuIGEgZGF0YWJhc2Ugb2JqZWN0LiJ9LAotCXsgMCwgMCB9LAorICAgIHsgIm9wZW4iLCAoUHlDRnVuY3Rpb24pZGJtb3BlbiwgTUVUSF9WQVJBUkdTLAorICAgICAgIm9wZW4ocGF0aFssIGZsYWdbLCBtb2RlXV0pIC0+IG1hcHBpbmdcbiIKKyAgICAgICJSZXR1cm4gYSBkYXRhYmFzZSBvYmplY3QuIn0sCisgICAgeyAwLCAwIH0sCiB9OwogCiBQeU1PRElOSVRfRlVOQwogaW5pdGRibSh2b2lkKSB7Ci0JUHlPYmplY3QgKm0sICpkLCAqczsKKyAgICBQeU9iamVjdCAqbSwgKmQsICpzOwogCi0JRGJtdHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCW0gPSBQeV9Jbml0TW9kdWxlKCJkYm0iLCBkYm1tb2R1bGVfbWV0aG9kcyk7Ci0JaWYgKG0gPT0gTlVMTCkKLQkJcmV0dXJuOwotCWQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOwotCWlmIChEYm1FcnJvciA9PSBOVUxMKQotCQlEYm1FcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbigiZGJtLmVycm9yIiwgTlVMTCwgTlVMTCk7Ci0JcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmcod2hpY2hfZGJtKTsKLQlpZiAocyAhPSBOVUxMKSB7Ci0JCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJsaWJyYXJ5Iiwgcyk7Ci0JCVB5X0RFQ1JFRihzKTsKLQl9Ci0JaWYgKERibUVycm9yICE9IE5VTEwpCi0JCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJlcnJvciIsIERibUVycm9yKTsKKyAgICBEYm10eXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7CisgICAgbSA9IFB5X0luaXRNb2R1bGUoImRibSIsIGRibW1vZHVsZV9tZXRob2RzKTsKKyAgICBpZiAobSA9PSBOVUxMKQorICAgICAgICByZXR1cm47CisgICAgZCA9IFB5TW9kdWxlX0dldERpY3QobSk7CisgICAgaWYgKERibUVycm9yID09IE5VTEwpCisgICAgICAgIERibUVycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJkYm0uZXJyb3IiLCBOVUxMLCBOVUxMKTsKKyAgICBzID0gUHlTdHJpbmdfRnJvbVN0cmluZyh3aGljaF9kYm0pOworICAgIGlmIChzICE9IE5VTEwpIHsKKyAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgImxpYnJhcnkiLCBzKTsKKyAgICAgICAgUHlfREVDUkVGKHMpOworICAgIH0KKyAgICBpZiAoRGJtRXJyb3IgIT0gTlVMTCkKKyAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgImVycm9yIiwgRGJtRXJyb3IpOwogfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9kbG1vZHVsZS5jIGIvTW9kdWxlcy9kbG1vZHVsZS5jCmluZGV4IGIyZWE0ZjUuLmMzNDlhZDAgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvZGxtb2R1bGUuYworKysgYi9Nb2R1bGVzL2RsbW9kdWxlLmMKQEAgLTE1LDggKzE1LDggQEAKIAogdHlwZWRlZiB2b2lkICpQeVVuaXZQdHI7CiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCVB5VW5pdlB0ciAqZGxfaGFuZGxlOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBQeVVuaXZQdHIgKmRsX2hhbmRsZTsKIH0gZGxvYmplY3Q7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgRGx0eXBlOwpAQCAtMjYsMTk2ICsyNiwxOTYgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBuZXdkbG9iamVjdChQeVVuaXZQdHIgKmhhbmRsZSkKIHsKLQlkbG9iamVjdCAqeHA7Ci0JeHAgPSBQeU9iamVjdF9OZXcoZGxvYmplY3QsICZEbHR5cGUpOwotCWlmICh4cCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQl4cC0+ZGxfaGFuZGxlID0gaGFuZGxlOwotCXJldHVybiAoUHlPYmplY3QgKil4cDsKKyAgICBkbG9iamVjdCAqeHA7CisgICAgeHAgPSBQeU9iamVjdF9OZXcoZGxvYmplY3QsICZEbHR5cGUpOworICAgIGlmICh4cCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB4cC0+ZGxfaGFuZGxlID0gaGFuZGxlOworICAgIHJldHVybiAoUHlPYmplY3QgKil4cDsKIH0KIAogc3RhdGljIHZvaWQKIGRsX2RlYWxsb2MoZGxvYmplY3QgKnhwKQogewotCWlmICh4cC0+ZGxfaGFuZGxlICE9IE5VTEwpCi0JCWRsY2xvc2UoeHAtPmRsX2hhbmRsZSk7Ci0JUHlPYmplY3RfRGVsKHhwKTsKKyAgICBpZiAoeHAtPmRsX2hhbmRsZSAhPSBOVUxMKQorICAgICAgICBkbGNsb3NlKHhwLT5kbF9oYW5kbGUpOworICAgIFB5T2JqZWN0X0RlbCh4cCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkbF9jbG9zZShkbG9iamVjdCAqeHApCiB7Ci0JaWYgKHhwLT5kbF9oYW5kbGUgIT0gTlVMTCkgewotCQlkbGNsb3NlKHhwLT5kbF9oYW5kbGUpOwotCQl4cC0+ZGxfaGFuZGxlID0gTlVMTDsKLQl9Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGlmICh4cC0+ZGxfaGFuZGxlICE9IE5VTEwpIHsKKyAgICAgICAgZGxjbG9zZSh4cC0+ZGxfaGFuZGxlKTsKKyAgICAgICAgeHAtPmRsX2hhbmRsZSA9IE5VTEw7CisgICAgfQorICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRsX3N5bShkbG9iamVjdCAqeHAsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKm5hbWU7Ci0JUHlVbml2UHRyICpmdW5jOwotCWlmIChQeVN0cmluZ19DaGVjayhhcmdzKSkgewotCQluYW1lID0gUHlTdHJpbmdfQVNfU1RSSU5HKGFyZ3MpOwotCX0gZWxzZSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICJleHBlY3RlZCBzdHJpbmcsIGZvdW5kICUuMjAwcyIsCi0JCQkgICAgIFB5X1RZUEUoYXJncyktPnRwX25hbWUpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZnVuYyA9IGRsc3ltKHhwLT5kbF9oYW5kbGUsIG5hbWUpOwotCWlmIChmdW5jID09IE5VTEwpIHsKLQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQlyZXR1cm4gUHlfTm9uZTsKLQl9Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKWZ1bmMpOworICAgIGNoYXIgKm5hbWU7CisgICAgUHlVbml2UHRyICpmdW5jOworICAgIGlmIChQeVN0cmluZ19DaGVjayhhcmdzKSkgeworICAgICAgICBuYW1lID0gUHlTdHJpbmdfQVNfU1RSSU5HKGFyZ3MpOworICAgIH0gZWxzZSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICJleHBlY3RlZCBzdHJpbmcsIGZvdW5kICUuMjAwcyIsCisgICAgICAgICAgICAgICAgICAgICBQeV9UWVBFKGFyZ3MpLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGZ1bmMgPSBkbHN5bSh4cC0+ZGxfaGFuZGxlLCBuYW1lKTsKKyAgICBpZiAoZnVuYyA9PSBOVUxMKSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgfQorICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZylmdW5jKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRsX2NhbGwoZGxvYmplY3QgKnhwLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqbmFtZTsKLQlsb25nICgqZnVuYykobG9uZywgbG9uZywgbG9uZywgbG9uZywgbG9uZywKLSAgICAgICAgICAgICAgICAgICAgIGxvbmcsIGxvbmcsIGxvbmcsIGxvbmcsIGxvbmcpOwotCWxvbmcgYWxpc3RbMTBdOwotCWxvbmcgcmVzOwotCVB5X3NzaXplX3QgaTsKLQlQeV9zc2l6ZV90IG4gPSBQeVR1cGxlX1NpemUoYXJncyk7Ci0JaWYgKG4gPCAxKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJhdCBsZWFzdCBhIG5hbWUgaXMgbmVlZGVkIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQluYW1lID0gUHlUdXBsZV9HZXRJdGVtKGFyZ3MsIDApOwotCWlmICghUHlTdHJpbmdfQ2hlY2sobmFtZSkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiZnVuY3Rpb24gbmFtZSBtdXN0IGJlIGEgc3RyaW5nIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlmdW5jID0gKGxvbmcgKCopKGxvbmcsIGxvbmcsIGxvbmcsIGxvbmcsIGxvbmcsIAotICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcsIGxvbmcsIGxvbmcsIGxvbmcsIGxvbmcpKSAKLSAgICAgICAgICBkbHN5bSh4cC0+ZGxfaGFuZGxlLCBQeVN0cmluZ19Bc1N0cmluZyhuYW1lKSk7Ci0JaWYgKGZ1bmMgPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgZGxlcnJvcigpKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChuLTEgPiAxMCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJ0b28gbWFueSBhcmd1bWVudHMgKG1heCAxMCkiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWZvciAoaSA9IDE7IGkgPCBuOyBpKyspIHsKLQkJUHlPYmplY3QgKnYgPSBQeVR1cGxlX0dldEl0ZW0oYXJncywgaSk7Ci0JCWlmIChQeUludF9DaGVjayh2KSkKLQkJCWFsaXN0W2ktMV0gPSBQeUludF9Bc0xvbmcodik7Ci0JCWVsc2UgaWYgKFB5U3RyaW5nX0NoZWNrKHYpKQotCQkJYWxpc3RbaS0xXSA9IChsb25nKVB5U3RyaW5nX0FzU3RyaW5nKHYpOwotCQllbHNlIGlmICh2ID09IFB5X05vbmUpCi0JCQlhbGlzdFtpLTFdID0gKGxvbmcpICgoY2hhciAqKU5VTEwpOwotCQllbHNlIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJICAgImFyZ3VtZW50cyBtdXN0IGJlIGludCwgc3RyaW5nIG9yIE5vbmUiKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQotCWZvciAoOyBpIDw9IDEwOyBpKyspCi0JCWFsaXN0W2ktMV0gPSAwOwotCXJlcyA9ICgqZnVuYykoYWxpc3RbMF0sIGFsaXN0WzFdLCBhbGlzdFsyXSwgYWxpc3RbM10sIGFsaXN0WzRdLAotCQkgICAgICBhbGlzdFs1XSwgYWxpc3RbNl0sIGFsaXN0WzddLCBhbGlzdFs4XSwgYWxpc3RbOV0pOwotCXJldHVybiBQeUludF9Gcm9tTG9uZyhyZXMpOworICAgIFB5T2JqZWN0ICpuYW1lOworICAgIGxvbmcgKCpmdW5jKShsb25nLCBsb25nLCBsb25nLCBsb25nLCBsb25nLAorICAgICAgICAgICAgICAgICBsb25nLCBsb25nLCBsb25nLCBsb25nLCBsb25nKTsKKyAgICBsb25nIGFsaXN0WzEwXTsKKyAgICBsb25nIHJlczsKKyAgICBQeV9zc2l6ZV90IGk7CisgICAgUHlfc3NpemVfdCBuID0gUHlUdXBsZV9TaXplKGFyZ3MpOworICAgIGlmIChuIDwgMSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYXQgbGVhc3QgYSBuYW1lIGlzIG5lZWRlZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgbmFtZSA9IFB5VHVwbGVfR2V0SXRlbShhcmdzLCAwKTsKKyAgICBpZiAoIVB5U3RyaW5nX0NoZWNrKG5hbWUpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiZnVuY3Rpb24gbmFtZSBtdXN0IGJlIGEgc3RyaW5nIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBmdW5jID0gKGxvbmcgKCopKGxvbmcsIGxvbmcsIGxvbmcsIGxvbmcsIGxvbmcsCisgICAgICAgICAgICAgICAgICAgICBsb25nLCBsb25nLCBsb25nLCBsb25nLCBsb25nKSkKKyAgICAgIGRsc3ltKHhwLT5kbF9oYW5kbGUsIFB5U3RyaW5nX0FzU3RyaW5nKG5hbWUpKTsKKyAgICBpZiAoZnVuYyA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCBkbGVycm9yKCkpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKG4tMSA+IDEwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAidG9vIG1hbnkgYXJndW1lbnRzIChtYXggMTApIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBmb3IgKGkgPSAxOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIFB5T2JqZWN0ICp2ID0gUHlUdXBsZV9HZXRJdGVtKGFyZ3MsIGkpOworICAgICAgICBpZiAoUHlJbnRfQ2hlY2sodikpCisgICAgICAgICAgICBhbGlzdFtpLTFdID0gUHlJbnRfQXNMb25nKHYpOworICAgICAgICBlbHNlIGlmIChQeVN0cmluZ19DaGVjayh2KSkKKyAgICAgICAgICAgIGFsaXN0W2ktMV0gPSAobG9uZylQeVN0cmluZ19Bc1N0cmluZyh2KTsKKyAgICAgICAgZWxzZSBpZiAodiA9PSBQeV9Ob25lKQorICAgICAgICAgICAgYWxpc3RbaS0xXSA9IChsb25nKSAoKGNoYXIgKilOVUxMKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAiYXJndW1lbnRzIG11c3QgYmUgaW50LCBzdHJpbmcgb3IgTm9uZSIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgZm9yICg7IGkgPD0gMTA7IGkrKykKKyAgICAgICAgYWxpc3RbaS0xXSA9IDA7CisgICAgcmVzID0gKCpmdW5jKShhbGlzdFswXSwgYWxpc3RbMV0sIGFsaXN0WzJdLCBhbGlzdFszXSwgYWxpc3RbNF0sCisgICAgICAgICAgICAgICAgICBhbGlzdFs1XSwgYWxpc3RbNl0sIGFsaXN0WzddLCBhbGlzdFs4XSwgYWxpc3RbOV0pOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhyZXMpOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgZGxvYmplY3RfbWV0aG9kc1tdID0gewotCXsiY2FsbCIsCShQeUNGdW5jdGlvbilkbF9jYWxsLCBNRVRIX1ZBUkFSR1N9LAotCXsic3ltIiwgCShQeUNGdW5jdGlvbilkbF9zeW0sIE1FVEhfT30sCi0JeyJjbG9zZSIsCShQeUNGdW5jdGlvbilkbF9jbG9zZSwgTUVUSF9OT0FSR1N9LAotCXtOVUxMLCAgCU5VTEx9CQkJIC8qIFNlbnRpbmVsICovCisgICAgeyJjYWxsIiwgICAgICAgICAgICAoUHlDRnVuY3Rpb24pZGxfY2FsbCwgTUVUSF9WQVJBUkdTfSwKKyAgICB7InN5bSIsICAgICAgICAgICAgIChQeUNGdW5jdGlvbilkbF9zeW0sIE1FVEhfT30sCisgICAgeyJjbG9zZSIsICAgICAgICAgICAoUHlDRnVuY3Rpb24pZGxfY2xvc2UsIE1FVEhfTk9BUkdTfSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAgICAgICAgICAvKiBTZW50aW5lbCAqLwogfTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIGRsX2dldGF0dHIoZGxvYmplY3QgKnhwLCBjaGFyICpuYW1lKQogewotCXJldHVybiBQeV9GaW5kTWV0aG9kKGRsb2JqZWN0X21ldGhvZHMsIChQeU9iamVjdCAqKXhwLCBuYW1lKTsKKyAgICByZXR1cm4gUHlfRmluZE1ldGhvZChkbG9iamVjdF9tZXRob2RzLCAoUHlPYmplY3QgKil4cCwgbmFtZSk7CiB9CiAKIAogc3RhdGljIFB5VHlwZU9iamVjdCBEbHR5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JImRsLmRsIiwJCS8qdHBfbmFtZSovCi0Jc2l6ZW9mKGRsb2JqZWN0KSwJLyp0cF9iYXNpY3NpemUqLwotCTAsCQkJLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKWRsX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCi0JMCwJCQkvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpZGxfZ2V0YXR0ciwvKnRwX2dldGF0dHIqLwotCTAsCQkJLyp0cF9zZXRhdHRyKi8KLQkwLAkJCS8qdHBfY29tcGFyZSovCi0JMCwJCQkvKnRwX3JlcHIqLwotCTAsCQkJLyp0cF9hc19udW1iZXIqLwotCTAsCQkJLyp0cF9hc19zZXF1ZW5jZSovCi0JMCwJCQkvKnRwX2FzX21hcHBpbmcqLwotCTAsCQkJLyp0cF9oYXNoKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAiZGwuZGwiLCAgICAgICAgICAgICAgICAgICAgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoZGxvYmplY3QpLCAgICAgICAgICAgLyp0cF9iYXNpY3NpemUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpZGxfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKWRsX2dldGF0dHIsLyp0cF9nZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jb21wYXJlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9yZXByKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19udW1iZXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX3NlcXVlbmNlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19tYXBwaW5nKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9oYXNoKi8KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkbF9vcGVuKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpuYW1lOwotCWludCBtb2RlOwotCVB5VW5pdlB0ciAqaGFuZGxlOwotCWlmIChzaXplb2YoaW50KSAhPSBzaXplb2YobG9uZykgfHwKLQkgICAgc2l6ZW9mKGxvbmcpICE9IHNpemVvZihjaGFyICopKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKKyAgICBjaGFyICpuYW1lOworICAgIGludCBtb2RlOworICAgIFB5VW5pdlB0ciAqaGFuZGxlOworICAgIGlmIChzaXplb2YoaW50KSAhPSBzaXplb2YobG9uZykgfHwKKyAgICAgICAgc2l6ZW9mKGxvbmcpICE9IHNpemVvZihjaGFyICopKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKICAibW9kdWxlIGRsIHJlcXVpcmVzIHNpemVvZihpbnQpID09IHNpemVvZihsb25nKSA9PSBzaXplb2YoY2hhciopIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlpZiAoUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiejpvcGVuIiwgJm5hbWUpKQotCQltb2RlID0gUlRMRF9MQVpZOwotCWVsc2UgewotCQlQeUVycl9DbGVhcigpOwotCQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInppOm9wZW4iLCAmbmFtZSwgJm1vZGUpKQotCQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKFB5QXJnX1BhcnNlVHVwbGUoYXJncywgIno6b3BlbiIsICZuYW1lKSkKKyAgICAgICAgbW9kZSA9IFJUTERfTEFaWTsKKyAgICBlbHNlIHsKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ6aTpvcGVuIiwgJm5hbWUsICZtb2RlKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogI2lmbmRlZiBSVExEX05PVwotCQlpZiAobW9kZSAhPSBSVExEX0xBWlkpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAibW9kZSBtdXN0IGJlIDEiKTsKLQkJCXJldHVybiBOVUxMOwotCQl9CisgICAgICAgIGlmIChtb2RlICE9IFJUTERfTEFaWSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJtb2RlIG11c3QgYmUgMSIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KICNlbmRpZgotCX0KLQloYW5kbGUgPSBkbG9wZW4obmFtZSwgbW9kZSk7Ci0JaWYgKGhhbmRsZSA9PSBOVUxMKSB7Ci0JCWNoYXIgKmVycm1zZyA9IGRsZXJyb3IoKTsKLQkJaWYgKCFlcnJtc2cpCi0JCQllcnJtc2cgPSAiZGxvcGVuKCkgZXJyb3IiOwotCQlQeUVycl9TZXRTdHJpbmcoRGxlcnJvciwgZXJybXNnKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIH0KKyAgICBoYW5kbGUgPSBkbG9wZW4obmFtZSwgbW9kZSk7CisgICAgaWYgKGhhbmRsZSA9PSBOVUxMKSB7CisgICAgICAgIGNoYXIgKmVycm1zZyA9IGRsZXJyb3IoKTsKKyAgICAgICAgaWYgKCFlcnJtc2cpCisgICAgICAgICAgICBlcnJtc2cgPSAiZGxvcGVuKCkgZXJyb3IiOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoRGxlcnJvciwgZXJybXNnKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogI2lmZGVmIF9fVk1TCi0JLyogICBVbmRlciBPcGVuVk1TIGRsb3BlbiBkb2Vzbid0IGRvIGFueSBjaGVjaywganVzdCBzYXZlIHRoZSBuYW1lCi0JICogZm9yIGxhdGVyIHVzZSwgc28gd2UgaGF2ZSB0byBjaGVjayBpZiB0aGUgZmlsZSBpcyByZWFkYWJsZSwKLQkgKiB0aGUgbmFtZSBjYW4gYmUgYSBsb2dpY2FsIG9yIGEgZmlsZSBmcm9tIFNZUyRTSEFSRS4KLQkgKi8KLQlpZiAoYWNjZXNzKG5hbWUsIFJfT0spKSB7Ci0JCWNoYXIgZm5hbWVbc3RybGVuKG5hbWUpICsgMjBdOwotCQlzdHJjcHkoZm5hbWUsICJTWVMkU0hBUkU6Iik7Ci0JCXN0cmNhdChmbmFtZSwgbmFtZSk7Ci0JCXN0cmNhdChmbmFtZSwgIi5FWEUiKTsKLQkJaWYgKGFjY2VzcyhmbmFtZSwgUl9PSykpIHsKLQkJCWRsY2xvc2UoaGFuZGxlKTsKLQkJCVB5RXJyX1NldFN0cmluZyhEbGVycm9yLAotCQkJCSJGaWxlIG5vdCBmb3VuZCBvciBwcm90ZWN0aW9uIHZpb2xhdGlvbiIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9CisgICAgLyogICBVbmRlciBPcGVuVk1TIGRsb3BlbiBkb2Vzbid0IGRvIGFueSBjaGVjaywganVzdCBzYXZlIHRoZSBuYW1lCisgICAgICogZm9yIGxhdGVyIHVzZSwgc28gd2UgaGF2ZSB0byBjaGVjayBpZiB0aGUgZmlsZSBpcyByZWFkYWJsZSwKKyAgICAgKiB0aGUgbmFtZSBjYW4gYmUgYSBsb2dpY2FsIG9yIGEgZmlsZSBmcm9tIFNZUyRTSEFSRS4KKyAgICAgKi8KKyAgICBpZiAoYWNjZXNzKG5hbWUsIFJfT0spKSB7CisgICAgICAgIGNoYXIgZm5hbWVbc3RybGVuKG5hbWUpICsgMjBdOworICAgICAgICBzdHJjcHkoZm5hbWUsICJTWVMkU0hBUkU6Iik7CisgICAgICAgIHN0cmNhdChmbmFtZSwgbmFtZSk7CisgICAgICAgIHN0cmNhdChmbmFtZSwgIi5FWEUiKTsKKyAgICAgICAgaWYgKGFjY2VzcyhmbmFtZSwgUl9PSykpIHsKKyAgICAgICAgICAgIGRsY2xvc2UoaGFuZGxlKTsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhEbGVycm9yLAorICAgICAgICAgICAgICAgICJGaWxlIG5vdCBmb3VuZCBvciBwcm90ZWN0aW9uIHZpb2xhdGlvbiIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CiAjZW5kaWYKLQlyZXR1cm4gbmV3ZGxvYmplY3QoaGFuZGxlKTsKKyAgICByZXR1cm4gbmV3ZGxvYmplY3QoaGFuZGxlKTsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIGRsX21ldGhvZHNbXSA9IHsKLQl7Im9wZW4iLAlkbF9vcGVuLCBNRVRIX1ZBUkFSR1N9LAotCXtOVUxMLAkJTlVMTH0JCS8qIHNlbnRpbmVsICovCisgICAgeyJvcGVuIiwgICAgICAgICAgICBkbF9vcGVuLCBNRVRIX1ZBUkFSR1N9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiAvKiBGcm9tIHNvY2tldG1vZHVsZS5jCkBAIC0yMjYsNTkgKzIyNiw1OSBAQAogc3RhdGljIHZvaWQKIGluc2ludChQeU9iamVjdCAqZCwgY2hhciAqbmFtZSwgaW50IHZhbHVlKQogewotCVB5T2JqZWN0ICp2ID0gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIHZhbHVlKTsKLQlpZiAoIXYgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgbmFtZSwgdikpCi0JCVB5RXJyX0NsZWFyKCk7CisgICAgUHlPYmplY3QgKnYgPSBQeUludF9Gcm9tTG9uZygobG9uZykgdmFsdWUpOworICAgIGlmICghdiB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCBuYW1lLCB2KSkKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKIAotCVB5X1hERUNSRUYodik7CisgICAgUHlfWERFQ1JFRih2KTsKIH0KIAogUHlNT0RJTklUX0ZVTkMKIGluaXRkbCh2b2lkKQogewotCVB5T2JqZWN0ICptLCAqZCwgKng7CisgICAgUHlPYmplY3QgKm0sICpkLCAqeDsKIAogICAgIGlmIChQeUVycl9XYXJuUHkzaygidGhlIGRsIG1vZHVsZSBoYXMgYmVlbiByZW1vdmVkIGluICIKICAgICAgICAgICAgICAgICAgICAgICAgICJQeXRob24gMy4wOyB1c2UgdGhlIGN0eXBlcyBtb2R1bGUgaW5zdGVhZCIsIDIpIDwgMCkKLSAgICAgICAgcmV0dXJuOyAgICAKKyAgICByZXR1cm47CiAKLQkvKiBJbml0aWFsaXplIG9iamVjdCB0eXBlICovCi0JUHlfVFlQRSgmRGx0eXBlKSA9ICZQeVR5cGVfVHlwZTsKKyAgICAvKiBJbml0aWFsaXplIG9iamVjdCB0eXBlICovCisgICAgUHlfVFlQRSgmRGx0eXBlKSA9ICZQeVR5cGVfVHlwZTsKIAotCS8qIENyZWF0ZSB0aGUgbW9kdWxlIGFuZCBhZGQgdGhlIGZ1bmN0aW9ucyAqLwotCW0gPSBQeV9Jbml0TW9kdWxlKCJkbCIsIGRsX21ldGhvZHMpOwotCWlmIChtID09IE5VTEwpCi0JCXJldHVybjsKKyAgICAvKiBDcmVhdGUgdGhlIG1vZHVsZSBhbmQgYWRkIHRoZSBmdW5jdGlvbnMgKi8KKyAgICBtID0gUHlfSW5pdE1vZHVsZSgiZGwiLCBkbF9tZXRob2RzKTsKKyAgICBpZiAobSA9PSBOVUxMKQorICAgICAgICByZXR1cm47CiAKLQkvKiBBZGQgc29tZSBzeW1ib2xpYyBjb25zdGFudHMgdG8gdGhlIG1vZHVsZSAqLwotCWQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOwotCURsZXJyb3IgPSB4ID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJkbC5lcnJvciIsIE5VTEwsIE5VTEwpOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJlcnJvciIsIHgpOwotCXggPSBQeUludF9Gcm9tTG9uZygobG9uZylSVExEX0xBWlkpOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSVExEX0xBWlkiLCB4KTsKKyAgICAvKiBBZGQgc29tZSBzeW1ib2xpYyBjb25zdGFudHMgdG8gdGhlIG1vZHVsZSAqLworICAgIGQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOworICAgIERsZXJyb3IgPSB4ID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJkbC5lcnJvciIsIE5VTEwsIE5VTEwpOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJlcnJvciIsIHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZygobG9uZylSVExEX0xBWlkpOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSVExEX0xBWlkiLCB4KTsKICNkZWZpbmUgSU5TSU5UKFgpICAgIGluc2ludChkLCNYLFgpCiAjaWZkZWYgUlRMRF9OT1cKLSAgICAgICAgSU5TSU5UKFJUTERfTk9XKTsKKyAgICBJTlNJTlQoUlRMRF9OT1cpOwogI2VuZGlmCiAjaWZkZWYgUlRMRF9OT0xPQUQKLSAgICAgICAgSU5TSU5UKFJUTERfTk9MT0FEKTsKKyAgICBJTlNJTlQoUlRMRF9OT0xPQUQpOwogI2VuZGlmCiAjaWZkZWYgUlRMRF9HTE9CQUwKLSAgICAgICAgSU5TSU5UKFJUTERfR0xPQkFMKTsKKyAgICBJTlNJTlQoUlRMRF9HTE9CQUwpOwogI2VuZGlmCiAjaWZkZWYgUlRMRF9MT0NBTAotICAgICAgICBJTlNJTlQoUlRMRF9MT0NBTCk7CisgICAgSU5TSU5UKFJUTERfTE9DQUwpOwogI2VuZGlmCiAjaWZkZWYgUlRMRF9QQVJFTlQKLSAgICAgICAgSU5TSU5UKFJUTERfUEFSRU5UKTsKKyAgICBJTlNJTlQoUlRMRF9QQVJFTlQpOwogI2VuZGlmCiAjaWZkZWYgUlRMRF9HUk9VUAotICAgICAgICBJTlNJTlQoUlRMRF9HUk9VUCk7CisgICAgSU5TSU5UKFJUTERfR1JPVVApOwogI2VuZGlmCiAjaWZkZWYgUlRMRF9XT1JMRAotICAgICAgICBJTlNJTlQoUlRMRF9XT1JMRCk7CisgICAgSU5TSU5UKFJUTERfV09STEQpOwogI2VuZGlmCiAjaWZkZWYgUlRMRF9OT0RFTEVURQotICAgICAgICBJTlNJTlQoUlRMRF9OT0RFTEVURSk7CisgICAgSU5TSU5UKFJUTERfTk9ERUxFVEUpOwogI2VuZGlmCiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL2Vycm5vbW9kdWxlLmMgYi9Nb2R1bGVzL2Vycm5vbW9kdWxlLmMKaW5kZXggNjQyZDcyMS4uNjhjM2M0OSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9lcnJub21vZHVsZS5jCisrKyBiL01vZHVsZXMvZXJybm9tb2R1bGUuYwpAQCAtMTAsMTAgKzEwLDEwIEBACiAKIC8qCiAgKiBQdWxsIGluIHRoZSBzeXN0ZW0gZXJyb3IgZGVmaW5pdGlvbnMKLSAqLyAKKyAqLwogCiBzdGF0aWMgUHlNZXRob2REZWYgZXJybm9fbWV0aG9kc1tdID0gewotCXtOVUxMLAkgICAgICAJTlVMTH0KKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9CiB9OwogCiAvKiBIZWxwZXIgZnVuY3Rpb24gZG9pbmcgdGhlIGRpY3Rpb25hcnkgaW5zZXJ0aW5nICovCkBAIC0yMSwyMSArMjEsMjEgQEAKIHN0YXRpYyB2b2lkCiBfaW5zY29kZShQeU9iamVjdCAqZCwgUHlPYmplY3QgKmRlLCBjaGFyICpuYW1lLCBpbnQgY29kZSkKIHsKLQlQeU9iamVjdCAqdSA9IFB5U3RyaW5nX0Zyb21TdHJpbmcobmFtZSk7Ci0JUHlPYmplY3QgKnYgPSBQeUludF9Gcm9tTG9uZygobG9uZykgY29kZSk7CisgICAgUHlPYmplY3QgKnUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKG5hbWUpOworICAgIFB5T2JqZWN0ICp2ID0gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIGNvZGUpOwogCi0JLyogRG9uJ3QgYm90aGVyIGNoZWNraW5nIGZvciBlcnJvcnM7IHRoZXknbGwgYmUgY2F1Z2h0IGF0IHRoZSBlbmQKLQkgKiBvZiB0aGUgbW9kdWxlIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uIGJ5IHRoZSBjYWxsZXIgb2YKLQkgKiBpbml0ZXJybm8oKS4KLQkgKi8KLQlpZiAodSAmJiB2KSB7Ci0JCS8qIGluc2VydCBpbiBtb2R1bGVzIGRpY3QgKi8KLQkJUHlEaWN0X1NldEl0ZW0oZCwgdSwgdik7Ci0JCS8qIGluc2VydCBpbiBlcnJvcmNvZGUgZGljdCAqLwotCQlQeURpY3RfU2V0SXRlbShkZSwgdiwgdSk7Ci0JfQotCVB5X1hERUNSRUYodSk7Ci0JUHlfWERFQ1JFRih2KTsKKyAgICAvKiBEb24ndCBib3RoZXIgY2hlY2tpbmcgZm9yIGVycm9yczsgdGhleSdsbCBiZSBjYXVnaHQgYXQgdGhlIGVuZAorICAgICAqIG9mIHRoZSBtb2R1bGUgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24gYnkgdGhlIGNhbGxlciBvZgorICAgICAqIGluaXRlcnJubygpLgorICAgICAqLworICAgIGlmICh1ICYmIHYpIHsKKyAgICAgICAgLyogaW5zZXJ0IGluIG1vZHVsZXMgZGljdCAqLworICAgICAgICBQeURpY3RfU2V0SXRlbShkLCB1LCB2KTsKKyAgICAgICAgLyogaW5zZXJ0IGluIGVycm9yY29kZSBkaWN0ICovCisgICAgICAgIFB5RGljdF9TZXRJdGVtKGRlLCB2LCB1KTsKKyAgICB9CisgICAgUHlfWERFQ1JFRih1KTsKKyAgICBQeV9YREVDUkVGKHYpOwogfQogCiBQeURvY19TVFJWQVIoZXJybm9fX2RvY19fLApAQCAtNTUsNzM0ICs1NSw3MzQgQEAKIFB5TU9ESU5JVF9GVU5DCiBpbml0ZXJybm8odm9pZCkKIHsKLQlQeU9iamVjdCAqbSwgKmQsICpkZTsKLQltID0gUHlfSW5pdE1vZHVsZTMoImVycm5vIiwgZXJybm9fbWV0aG9kcywgZXJybm9fX2RvY19fKTsKLQlpZiAobSA9PSBOVUxMKQotCQlyZXR1cm47Ci0JZCA9IFB5TW9kdWxlX0dldERpY3QobSk7Ci0JZGUgPSBQeURpY3RfTmV3KCk7Ci0JaWYgKCFkIHx8ICFkZSB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiZXJyb3Jjb2RlIiwgZGUpIDwgMCkKLQkJcmV0dXJuOworICAgIFB5T2JqZWN0ICptLCAqZCwgKmRlOworICAgIG0gPSBQeV9Jbml0TW9kdWxlMygiZXJybm8iLCBlcnJub19tZXRob2RzLCBlcnJub19fZG9jX18pOworICAgIGlmIChtID09IE5VTEwpCisgICAgICAgIHJldHVybjsKKyAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICBkZSA9IFB5RGljdF9OZXcoKTsKKyAgICBpZiAoIWQgfHwgIWRlIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJlcnJvcmNvZGUiLCBkZSkgPCAwKQorICAgICAgICByZXR1cm47CiAKIC8qIE1hY3JvIHNvIEkgZG9uJ3QgaGF2ZSB0byBlZGl0IGVhY2ggYW5kIGV2ZXJ5IGxpbmUgYmVsb3cuLi4gKi8KICNkZWZpbmUgaW5zY29kZShkLCBkcywgZGUsIG5hbWUsIGNvZGUsIGNvbW1lbnQpIF9pbnNjb2RlKGQsIGRlLCBuYW1lLCBjb2RlKQogCi0JLyoKLQkgKiBUaGUgbmFtZXMgYW5kIGNvbW1lbnRzIGFyZSBib3Jyb3dlZCBmcm9tIGxpbnV4L2luY2x1ZGUvZXJybm8uaCwKLQkgKiB3aGljaCBzaG91bGQgYmUgcHJldHR5IGFsbC1pbmNsdXNpdmUKLQkgKi8gCisgICAgLyoKKyAgICAgKiBUaGUgbmFtZXMgYW5kIGNvbW1lbnRzIGFyZSBib3Jyb3dlZCBmcm9tIGxpbnV4L2luY2x1ZGUvZXJybm8uaCwKKyAgICAgKiB3aGljaCBzaG91bGQgYmUgcHJldHR5IGFsbC1pbmNsdXNpdmUKKyAgICAgKi8KIAogI2lmZGVmIEVOT0RFVgotCWluc2NvZGUoZCwgZHMsIGRlLCAiRU5PREVWIiwgRU5PREVWLCAiTm8gc3VjaCBkZXZpY2UiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVOT0RFViIsIEVOT0RFViwgIk5vIHN1Y2ggZGV2aWNlIik7CiAjZW5kaWYKICNpZmRlZiBFTk9DU0kKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVOT0NTSSIsIEVOT0NTSSwgIk5vIENTSSBzdHJ1Y3R1cmUgYXZhaWxhYmxlIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFTk9DU0kiLCBFTk9DU0ksICJObyBDU0kgc3RydWN0dXJlIGF2YWlsYWJsZSIpOwogI2VuZGlmCiAjaWZkZWYgRUhPU1RVTlJFQUNICi0JaW5zY29kZShkLCBkcywgZGUsICJFSE9TVFVOUkVBQ0giLCBFSE9TVFVOUkVBQ0gsICJObyByb3V0ZSB0byBob3N0Iik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFSE9TVFVOUkVBQ0giLCBFSE9TVFVOUkVBQ0gsICJObyByb3V0ZSB0byBob3N0Iik7CiAjZWxzZQogI2lmZGVmIFdTQUVIT1NUVU5SRUFDSAotCWluc2NvZGUoZCwgZHMsIGRlLCAiRUhPU1RVTlJFQUNIIiwgV1NBRUhPU1RVTlJFQUNILCAiTm8gcm91dGUgdG8gaG9zdCIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRUhPU1RVTlJFQUNIIiwgV1NBRUhPU1RVTlJFQUNILCAiTm8gcm91dGUgdG8gaG9zdCIpOwogI2VuZGlmCiAjZW5kaWYKICNpZmRlZiBFTk9NU0cKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVOT01TRyIsIEVOT01TRywgIk5vIG1lc3NhZ2Ugb2YgZGVzaXJlZCB0eXBlIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFTk9NU0ciLCBFTk9NU0csICJObyBtZXNzYWdlIG9mIGRlc2lyZWQgdHlwZSIpOwogI2VuZGlmCiAjaWZkZWYgRVVDTEVBTgotCWluc2NvZGUoZCwgZHMsIGRlLCAiRVVDTEVBTiIsIEVVQ0xFQU4sICJTdHJ1Y3R1cmUgbmVlZHMgY2xlYW5pbmciKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVVQ0xFQU4iLCBFVUNMRUFOLCAiU3RydWN0dXJlIG5lZWRzIGNsZWFuaW5nIik7CiAjZW5kaWYKICNpZmRlZiBFTDJOU1lOQwotCWluc2NvZGUoZCwgZHMsIGRlLCAiRUwyTlNZTkMiLCBFTDJOU1lOQywgIkxldmVsIDIgbm90IHN5bmNocm9uaXplZCIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRUwyTlNZTkMiLCBFTDJOU1lOQywgIkxldmVsIDIgbm90IHN5bmNocm9uaXplZCIpOwogI2VuZGlmCiAjaWZkZWYgRUwySExUCi0JaW5zY29kZShkLCBkcywgZGUsICJFTDJITFQiLCBFTDJITFQsICJMZXZlbCAyIGhhbHRlZCIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRUwySExUIiwgRUwySExULCAiTGV2ZWwgMiBoYWx0ZWQiKTsKICNlbmRpZgogI2lmZGVmIEVOT0RBVEEKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVOT0RBVEEiLCBFTk9EQVRBLCAiTm8gZGF0YSBhdmFpbGFibGUiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVOT0RBVEEiLCBFTk9EQVRBLCAiTm8gZGF0YSBhdmFpbGFibGUiKTsKICNlbmRpZgogI2lmZGVmIEVOT1RCTEsKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVOT1RCTEsiLCBFTk9UQkxLLCAiQmxvY2sgZGV2aWNlIHJlcXVpcmVkIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFTk9UQkxLIiwgRU5PVEJMSywgIkJsb2NrIGRldmljZSByZXF1aXJlZCIpOwogI2VuZGlmCiAjaWZkZWYgRU5PU1lTCi0JaW5zY29kZShkLCBkcywgZGUsICJFTk9TWVMiLCBFTk9TWVMsICJGdW5jdGlvbiBub3QgaW1wbGVtZW50ZWQiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVOT1NZUyIsIEVOT1NZUywgIkZ1bmN0aW9uIG5vdCBpbXBsZW1lbnRlZCIpOwogI2VuZGlmCiAjaWZkZWYgRVBJUEUKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVQSVBFIiwgRVBJUEUsICJCcm9rZW4gcGlwZSIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRVBJUEUiLCBFUElQRSwgIkJyb2tlbiBwaXBlIik7CiAjZW5kaWYKICNpZmRlZiBFSU5WQUwKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVJTlZBTCIsIEVJTlZBTCwgIkludmFsaWQgYXJndW1lbnQiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVJTlZBTCIsIEVJTlZBTCwgIkludmFsaWQgYXJndW1lbnQiKTsKICNlbHNlCiAjaWZkZWYgV1NBRUlOVkFMCi0JaW5zY29kZShkLCBkcywgZGUsICJFSU5WQUwiLCBXU0FFSU5WQUwsICJJbnZhbGlkIGFyZ3VtZW50Iik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFSU5WQUwiLCBXU0FFSU5WQUwsICJJbnZhbGlkIGFyZ3VtZW50Iik7CiAjZW5kaWYKICNlbmRpZgogI2lmZGVmIEVPVkVSRkxPVwotCWluc2NvZGUoZCwgZHMsIGRlLCAiRU9WRVJGTE9XIiwgRU9WRVJGTE9XLCAiVmFsdWUgdG9vIGxhcmdlIGZvciBkZWZpbmVkIGRhdGEgdHlwZSIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRU9WRVJGTE9XIiwgRU9WRVJGTE9XLCAiVmFsdWUgdG9vIGxhcmdlIGZvciBkZWZpbmVkIGRhdGEgdHlwZSIpOwogI2VuZGlmCiAjaWZkZWYgRUFEVgotCWluc2NvZGUoZCwgZHMsIGRlLCAiRUFEViIsIEVBRFYsICJBZHZlcnRpc2UgZXJyb3IiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVBRFYiLCBFQURWLCAiQWR2ZXJ0aXNlIGVycm9yIik7CiAjZW5kaWYKICNpZmRlZiBFSU5UUgotCWluc2NvZGUoZCwgZHMsIGRlLCAiRUlOVFIiLCBFSU5UUiwgIkludGVycnVwdGVkIHN5c3RlbSBjYWxsIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFSU5UUiIsIEVJTlRSLCAiSW50ZXJydXB0ZWQgc3lzdGVtIGNhbGwiKTsKICNlbHNlCiAjaWZkZWYgV1NBRUlOVFIKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVJTlRSIiwgV1NBRUlOVFIsICJJbnRlcnJ1cHRlZCBzeXN0ZW0gY2FsbCIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRUlOVFIiLCBXU0FFSU5UUiwgIkludGVycnVwdGVkIHN5c3RlbSBjYWxsIik7CiAjZW5kaWYKICNlbmRpZgogI2lmZGVmIEVVU0VSUwotCWluc2NvZGUoZCwgZHMsIGRlLCAiRVVTRVJTIiwgRVVTRVJTLCAiVG9vIG1hbnkgdXNlcnMiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVVU0VSUyIsIEVVU0VSUywgIlRvbyBtYW55IHVzZXJzIik7CiAjZWxzZQogI2lmZGVmIFdTQUVVU0VSUwotCWluc2NvZGUoZCwgZHMsIGRlLCAiRVVTRVJTIiwgV1NBRVVTRVJTLCAiVG9vIG1hbnkgdXNlcnMiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVVU0VSUyIsIFdTQUVVU0VSUywgIlRvbyBtYW55IHVzZXJzIik7CiAjZW5kaWYKICNlbmRpZgogI2lmZGVmIEVOT1RFTVBUWQotCWluc2NvZGUoZCwgZHMsIGRlLCAiRU5PVEVNUFRZIiwgRU5PVEVNUFRZLCAiRGlyZWN0b3J5IG5vdCBlbXB0eSIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRU5PVEVNUFRZIiwgRU5PVEVNUFRZLCAiRGlyZWN0b3J5IG5vdCBlbXB0eSIpOwogI2Vsc2UKICNpZmRlZiBXU0FFTk9URU1QVFkKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVOT1RFTVBUWSIsIFdTQUVOT1RFTVBUWSwgIkRpcmVjdG9yeSBub3QgZW1wdHkiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVOT1RFTVBUWSIsIFdTQUVOT1RFTVBUWSwgIkRpcmVjdG9yeSBub3QgZW1wdHkiKTsKICNlbmRpZgogI2VuZGlmCiAjaWZkZWYgRU5PQlVGUwotCWluc2NvZGUoZCwgZHMsIGRlLCAiRU5PQlVGUyIsIEVOT0JVRlMsICJObyBidWZmZXIgc3BhY2UgYXZhaWxhYmxlIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFTk9CVUZTIiwgRU5PQlVGUywgIk5vIGJ1ZmZlciBzcGFjZSBhdmFpbGFibGUiKTsKICNlbHNlCiAjaWZkZWYgV1NBRU5PQlVGUwotCWluc2NvZGUoZCwgZHMsIGRlLCAiRU5PQlVGUyIsIFdTQUVOT0JVRlMsICJObyBidWZmZXIgc3BhY2UgYXZhaWxhYmxlIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFTk9CVUZTIiwgV1NBRU5PQlVGUywgIk5vIGJ1ZmZlciBzcGFjZSBhdmFpbGFibGUiKTsKICNlbmRpZgogI2VuZGlmCiAjaWZkZWYgRVBST1RPCi0JaW5zY29kZShkLCBkcywgZGUsICJFUFJPVE8iLCBFUFJPVE8sICJQcm90b2NvbCBlcnJvciIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRVBST1RPIiwgRVBST1RPLCAiUHJvdG9jb2wgZXJyb3IiKTsKICNlbmRpZgogI2lmZGVmIEVSRU1PVEUKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVSRU1PVEUiLCBFUkVNT1RFLCAiT2JqZWN0IGlzIHJlbW90ZSIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRVJFTU9URSIsIEVSRU1PVEUsICJPYmplY3QgaXMgcmVtb3RlIik7CiAjZWxzZQogI2lmZGVmIFdTQUVSRU1PVEUKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVSRU1PVEUiLCBXU0FFUkVNT1RFLCAiT2JqZWN0IGlzIHJlbW90ZSIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRVJFTU9URSIsIFdTQUVSRU1PVEUsICJPYmplY3QgaXMgcmVtb3RlIik7CiAjZW5kaWYKICNlbmRpZgogI2lmZGVmIEVOQVZBSUwKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVOQVZBSUwiLCBFTkFWQUlMLCAiTm8gWEVOSVggc2VtYXBob3JlcyBhdmFpbGFibGUiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVOQVZBSUwiLCBFTkFWQUlMLCAiTm8gWEVOSVggc2VtYXBob3JlcyBhdmFpbGFibGUiKTsKICNlbmRpZgogI2lmZGVmIEVDSElMRAotCWluc2NvZGUoZCwgZHMsIGRlLCAiRUNISUxEIiwgRUNISUxELCAiTm8gY2hpbGQgcHJvY2Vzc2VzIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFQ0hJTEQiLCBFQ0hJTEQsICJObyBjaGlsZCBwcm9jZXNzZXMiKTsKICNlbmRpZgogI2lmZGVmIEVMT09QCi0JaW5zY29kZShkLCBkcywgZGUsICJFTE9PUCIsIEVMT09QLCAiVG9vIG1hbnkgc3ltYm9saWMgbGlua3MgZW5jb3VudGVyZWQiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVMT09QIiwgRUxPT1AsICJUb28gbWFueSBzeW1ib2xpYyBsaW5rcyBlbmNvdW50ZXJlZCIpOwogI2Vsc2UKICNpZmRlZiBXU0FFTE9PUAotCWluc2NvZGUoZCwgZHMsIGRlLCAiRUxPT1AiLCBXU0FFTE9PUCwgIlRvbyBtYW55IHN5bWJvbGljIGxpbmtzIGVuY291bnRlcmVkIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFTE9PUCIsIFdTQUVMT09QLCAiVG9vIG1hbnkgc3ltYm9saWMgbGlua3MgZW5jb3VudGVyZWQiKTsKICNlbmRpZgogI2VuZGlmCiAjaWZkZWYgRVhERVYKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVYREVWIiwgRVhERVYsICJDcm9zcy1kZXZpY2UgbGluayIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRVhERVYiLCBFWERFViwgIkNyb3NzLWRldmljZSBsaW5rIik7CiAjZW5kaWYKICNpZmRlZiBFMkJJRwotCWluc2NvZGUoZCwgZHMsIGRlLCAiRTJCSUciLCBFMkJJRywgIkFyZyBsaXN0IHRvbyBsb25nIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFMkJJRyIsIEUyQklHLCAiQXJnIGxpc3QgdG9vIGxvbmciKTsKICNlbmRpZgogI2lmZGVmIEVTUkNICi0JaW5zY29kZShkLCBkcywgZGUsICJFU1JDSCIsIEVTUkNILCAiTm8gc3VjaCBwcm9jZXNzIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFU1JDSCIsIEVTUkNILCAiTm8gc3VjaCBwcm9jZXNzIik7CiAjZW5kaWYKICNpZmRlZiBFTVNHU0laRQotCWluc2NvZGUoZCwgZHMsIGRlLCAiRU1TR1NJWkUiLCBFTVNHU0laRSwgIk1lc3NhZ2UgdG9vIGxvbmciKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVNU0dTSVpFIiwgRU1TR1NJWkUsICJNZXNzYWdlIHRvbyBsb25nIik7CiAjZWxzZQogI2lmZGVmIFdTQUVNU0dTSVpFCi0JaW5zY29kZShkLCBkcywgZGUsICJFTVNHU0laRSIsIFdTQUVNU0dTSVpFLCAiTWVzc2FnZSB0b28gbG9uZyIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRU1TR1NJWkUiLCBXU0FFTVNHU0laRSwgIk1lc3NhZ2UgdG9vIGxvbmciKTsKICNlbmRpZgogI2VuZGlmCiAjaWZkZWYgRUFGTk9TVVBQT1JUCi0JaW5zY29kZShkLCBkcywgZGUsICJFQUZOT1NVUFBPUlQiLCBFQUZOT1NVUFBPUlQsICJBZGRyZXNzIGZhbWlseSBub3Qgc3VwcG9ydGVkIGJ5IHByb3RvY29sIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFQUZOT1NVUFBPUlQiLCBFQUZOT1NVUFBPUlQsICJBZGRyZXNzIGZhbWlseSBub3Qgc3VwcG9ydGVkIGJ5IHByb3RvY29sIik7CiAjZWxzZQogI2lmZGVmIFdTQUVBRk5PU1VQUE9SVAotCWluc2NvZGUoZCwgZHMsIGRlLCAiRUFGTk9TVVBQT1JUIiwgV1NBRUFGTk9TVVBQT1JULCAiQWRkcmVzcyBmYW1pbHkgbm90IHN1cHBvcnRlZCBieSBwcm90b2NvbCIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRUFGTk9TVVBQT1JUIiwgV1NBRUFGTk9TVVBQT1JULCAiQWRkcmVzcyBmYW1pbHkgbm90IHN1cHBvcnRlZCBieSBwcm90b2NvbCIpOwogI2VuZGlmCiAjZW5kaWYKICNpZmRlZiBFQkFEUgotCWluc2NvZGUoZCwgZHMsIGRlLCAiRUJBRFIiLCBFQkFEUiwgIkludmFsaWQgcmVxdWVzdCBkZXNjcmlwdG9yIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFQkFEUiIsIEVCQURSLCAiSW52YWxpZCByZXF1ZXN0IGRlc2NyaXB0b3IiKTsKICNlbmRpZgogI2lmZGVmIEVIT1NURE9XTgotCWluc2NvZGUoZCwgZHMsIGRlLCAiRUhPU1RET1dOIiwgRUhPU1RET1dOLCAiSG9zdCBpcyBkb3duIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFSE9TVERPV04iLCBFSE9TVERPV04sICJIb3N0IGlzIGRvd24iKTsKICNlbHNlCiAjaWZkZWYgV1NBRUhPU1RET1dOCi0JaW5zY29kZShkLCBkcywgZGUsICJFSE9TVERPV04iLCBXU0FFSE9TVERPV04sICJIb3N0IGlzIGRvd24iKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVIT1NURE9XTiIsIFdTQUVIT1NURE9XTiwgIkhvc3QgaXMgZG93biIpOwogI2VuZGlmCiAjZW5kaWYKICNpZmRlZiBFUEZOT1NVUFBPUlQKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVQRk5PU1VQUE9SVCIsIEVQRk5PU1VQUE9SVCwgIlByb3RvY29sIGZhbWlseSBub3Qgc3VwcG9ydGVkIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFUEZOT1NVUFBPUlQiLCBFUEZOT1NVUFBPUlQsICJQcm90b2NvbCBmYW1pbHkgbm90IHN1cHBvcnRlZCIpOwogI2Vsc2UKICNpZmRlZiBXU0FFUEZOT1NVUFBPUlQKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVQRk5PU1VQUE9SVCIsIFdTQUVQRk5PU1VQUE9SVCwgIlByb3RvY29sIGZhbWlseSBub3Qgc3VwcG9ydGVkIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFUEZOT1NVUFBPUlQiLCBXU0FFUEZOT1NVUFBPUlQsICJQcm90b2NvbCBmYW1pbHkgbm90IHN1cHBvcnRlZCIpOwogI2VuZGlmCiAjZW5kaWYKICNpZmRlZiBFTk9QUk9UT09QVAotCWluc2NvZGUoZCwgZHMsIGRlLCAiRU5PUFJPVE9PUFQiLCBFTk9QUk9UT09QVCwgIlByb3RvY29sIG5vdCBhdmFpbGFibGUiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVOT1BST1RPT1BUIiwgRU5PUFJPVE9PUFQsICJQcm90b2NvbCBub3QgYXZhaWxhYmxlIik7CiAjZWxzZQogI2lmZGVmIFdTQUVOT1BST1RPT1BUCi0JaW5zY29kZShkLCBkcywgZGUsICJFTk9QUk9UT09QVCIsIFdTQUVOT1BST1RPT1BULCAiUHJvdG9jb2wgbm90IGF2YWlsYWJsZSIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRU5PUFJPVE9PUFQiLCBXU0FFTk9QUk9UT09QVCwgIlByb3RvY29sIG5vdCBhdmFpbGFibGUiKTsKICNlbmRpZgogI2VuZGlmCiAjaWZkZWYgRUJVU1kKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVCVVNZIiwgRUJVU1ksICJEZXZpY2Ugb3IgcmVzb3VyY2UgYnVzeSIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRUJVU1kiLCBFQlVTWSwgIkRldmljZSBvciByZXNvdXJjZSBidXN5Iik7CiAjZW5kaWYKICNpZmRlZiBFV09VTERCTE9DSwotCWluc2NvZGUoZCwgZHMsIGRlLCAiRVdPVUxEQkxPQ0siLCBFV09VTERCTE9DSywgIk9wZXJhdGlvbiB3b3VsZCBibG9jayIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRVdPVUxEQkxPQ0siLCBFV09VTERCTE9DSywgIk9wZXJhdGlvbiB3b3VsZCBibG9jayIpOwogI2Vsc2UKICNpZmRlZiBXU0FFV09VTERCTE9DSwotCWluc2NvZGUoZCwgZHMsIGRlLCAiRVdPVUxEQkxPQ0siLCBXU0FFV09VTERCTE9DSywgIk9wZXJhdGlvbiB3b3VsZCBibG9jayIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRVdPVUxEQkxPQ0siLCBXU0FFV09VTERCTE9DSywgIk9wZXJhdGlvbiB3b3VsZCBibG9jayIpOwogI2VuZGlmCiAjZW5kaWYKICNpZmRlZiBFQkFERkQKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVCQURGRCIsIEVCQURGRCwgIkZpbGUgZGVzY3JpcHRvciBpbiBiYWQgc3RhdGUiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVCQURGRCIsIEVCQURGRCwgIkZpbGUgZGVzY3JpcHRvciBpbiBiYWQgc3RhdGUiKTsKICNlbmRpZgogI2lmZGVmIEVET1RET1QKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVET1RET1QiLCBFRE9URE9ULCAiUkZTIHNwZWNpZmljIGVycm9yIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFRE9URE9UIiwgRURPVERPVCwgIlJGUyBzcGVjaWZpYyBlcnJvciIpOwogI2VuZGlmCiAjaWZkZWYgRUlTQ09OTgotCWluc2NvZGUoZCwgZHMsIGRlLCAiRUlTQ09OTiIsIEVJU0NPTk4sICJUcmFuc3BvcnQgZW5kcG9pbnQgaXMgYWxyZWFkeSBjb25uZWN0ZWQiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVJU0NPTk4iLCBFSVNDT05OLCAiVHJhbnNwb3J0IGVuZHBvaW50IGlzIGFscmVhZHkgY29ubmVjdGVkIik7CiAjZWxzZQogI2lmZGVmIFdTQUVJU0NPTk4KLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVJU0NPTk4iLCBXU0FFSVNDT05OLCAiVHJhbnNwb3J0IGVuZHBvaW50IGlzIGFscmVhZHkgY29ubmVjdGVkIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFSVNDT05OIiwgV1NBRUlTQ09OTiwgIlRyYW5zcG9ydCBlbmRwb2ludCBpcyBhbHJlYWR5IGNvbm5lY3RlZCIpOwogI2VuZGlmCiAjZW5kaWYKICNpZmRlZiBFTk9BTk8KLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVOT0FOTyIsIEVOT0FOTywgIk5vIGFub2RlIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFTk9BTk8iLCBFTk9BTk8sICJObyBhbm9kZSIpOwogI2VuZGlmCiAjaWZkZWYgRVNIVVRET1dOCi0JaW5zY29kZShkLCBkcywgZGUsICJFU0hVVERPV04iLCBFU0hVVERPV04sICJDYW5ub3Qgc2VuZCBhZnRlciB0cmFuc3BvcnQgZW5kcG9pbnQgc2h1dGRvd24iKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVTSFVURE9XTiIsIEVTSFVURE9XTiwgIkNhbm5vdCBzZW5kIGFmdGVyIHRyYW5zcG9ydCBlbmRwb2ludCBzaHV0ZG93biIpOwogI2Vsc2UKICNpZmRlZiBXU0FFU0hVVERPV04KLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVTSFVURE9XTiIsIFdTQUVTSFVURE9XTiwgIkNhbm5vdCBzZW5kIGFmdGVyIHRyYW5zcG9ydCBlbmRwb2ludCBzaHV0ZG93biIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRVNIVVRET1dOIiwgV1NBRVNIVVRET1dOLCAiQ2Fubm90IHNlbmQgYWZ0ZXIgdHJhbnNwb3J0IGVuZHBvaW50IHNodXRkb3duIik7CiAjZW5kaWYKICNlbmRpZgogI2lmZGVmIEVDSFJORwotCWluc2NvZGUoZCwgZHMsIGRlLCAiRUNIUk5HIiwgRUNIUk5HLCAiQ2hhbm5lbCBudW1iZXIgb3V0IG9mIHJhbmdlIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFQ0hSTkciLCBFQ0hSTkcsICJDaGFubmVsIG51bWJlciBvdXQgb2YgcmFuZ2UiKTsKICNlbmRpZgogI2lmZGVmIEVMSUJCQUQKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVMSUJCQUQiLCBFTElCQkFELCAiQWNjZXNzaW5nIGEgY29ycnVwdGVkIHNoYXJlZCBsaWJyYXJ5Iik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFTElCQkFEIiwgRUxJQkJBRCwgIkFjY2Vzc2luZyBhIGNvcnJ1cHRlZCBzaGFyZWQgbGlicmFyeSIpOwogI2VuZGlmCiAjaWZkZWYgRU5PTkVUCi0JaW5zY29kZShkLCBkcywgZGUsICJFTk9ORVQiLCBFTk9ORVQsICJNYWNoaW5lIGlzIG5vdCBvbiB0aGUgbmV0d29yayIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRU5PTkVUIiwgRU5PTkVULCAiTWFjaGluZSBpcyBub3Qgb24gdGhlIG5ldHdvcmsiKTsKICNlbmRpZgogI2lmZGVmIEVCQURFCi0JaW5zY29kZShkLCBkcywgZGUsICJFQkFERSIsIEVCQURFLCAiSW52YWxpZCBleGNoYW5nZSIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRUJBREUiLCBFQkFERSwgIkludmFsaWQgZXhjaGFuZ2UiKTsKICNlbmRpZgogI2lmZGVmIEVCQURGCi0JaW5zY29kZShkLCBkcywgZGUsICJFQkFERiIsIEVCQURGLCAiQmFkIGZpbGUgbnVtYmVyIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFQkFERiIsIEVCQURGLCAiQmFkIGZpbGUgbnVtYmVyIik7CiAjZWxzZQogI2lmZGVmIFdTQUVCQURGCi0JaW5zY29kZShkLCBkcywgZGUsICJFQkFERiIsIFdTQUVCQURGLCAiQmFkIGZpbGUgbnVtYmVyIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFQkFERiIsIFdTQUVCQURGLCAiQmFkIGZpbGUgbnVtYmVyIik7CiAjZW5kaWYKICNlbmRpZgogI2lmZGVmIEVNVUxUSUhPUAotCWluc2NvZGUoZCwgZHMsIGRlLCAiRU1VTFRJSE9QIiwgRU1VTFRJSE9QLCAiTXVsdGlob3AgYXR0ZW1wdGVkIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFTVVMVElIT1AiLCBFTVVMVElIT1AsICJNdWx0aWhvcCBhdHRlbXB0ZWQiKTsKICNlbmRpZgogI2lmZGVmIEVJTwotCWluc2NvZGUoZCwgZHMsIGRlLCAiRUlPIiwgRUlPLCAiSS9PIGVycm9yIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFSU8iLCBFSU8sICJJL08gZXJyb3IiKTsKICNlbmRpZgogI2lmZGVmIEVVTkFUQ0gKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVVTkFUQ0giLCBFVU5BVENILCAiUHJvdG9jb2wgZHJpdmVyIG5vdCBhdHRhY2hlZCIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRVVOQVRDSCIsIEVVTkFUQ0gsICJQcm90b2NvbCBkcml2ZXIgbm90IGF0dGFjaGVkIik7CiAjZW5kaWYKICNpZmRlZiBFUFJPVE9UWVBFCi0JaW5zY29kZShkLCBkcywgZGUsICJFUFJPVE9UWVBFIiwgRVBST1RPVFlQRSwgIlByb3RvY29sIHdyb25nIHR5cGUgZm9yIHNvY2tldCIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRVBST1RPVFlQRSIsIEVQUk9UT1RZUEUsICJQcm90b2NvbCB3cm9uZyB0eXBlIGZvciBzb2NrZXQiKTsKICNlbHNlCiAjaWZkZWYgV1NBRVBST1RPVFlQRQotCWluc2NvZGUoZCwgZHMsIGRlLCAiRVBST1RPVFlQRSIsIFdTQUVQUk9UT1RZUEUsICJQcm90b2NvbCB3cm9uZyB0eXBlIGZvciBzb2NrZXQiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVQUk9UT1RZUEUiLCBXU0FFUFJPVE9UWVBFLCAiUHJvdG9jb2wgd3JvbmcgdHlwZSBmb3Igc29ja2V0Iik7CiAjZW5kaWYKICNlbmRpZgogI2lmZGVmIEVOT1NQQwotCWluc2NvZGUoZCwgZHMsIGRlLCAiRU5PU1BDIiwgRU5PU1BDLCAiTm8gc3BhY2UgbGVmdCBvbiBkZXZpY2UiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVOT1NQQyIsIEVOT1NQQywgIk5vIHNwYWNlIGxlZnQgb24gZGV2aWNlIik7CiAjZW5kaWYKICNpZmRlZiBFTk9FWEVDCi0JaW5zY29kZShkLCBkcywgZGUsICJFTk9FWEVDIiwgRU5PRVhFQywgIkV4ZWMgZm9ybWF0IGVycm9yIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFTk9FWEVDIiwgRU5PRVhFQywgIkV4ZWMgZm9ybWF0IGVycm9yIik7CiAjZW5kaWYKICNpZmRlZiBFQUxSRUFEWQotCWluc2NvZGUoZCwgZHMsIGRlLCAiRUFMUkVBRFkiLCBFQUxSRUFEWSwgIk9wZXJhdGlvbiBhbHJlYWR5IGluIHByb2dyZXNzIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFQUxSRUFEWSIsIEVBTFJFQURZLCAiT3BlcmF0aW9uIGFscmVhZHkgaW4gcHJvZ3Jlc3MiKTsKICNlbHNlCiAjaWZkZWYgV1NBRUFMUkVBRFkKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVBTFJFQURZIiwgV1NBRUFMUkVBRFksICJPcGVyYXRpb24gYWxyZWFkeSBpbiBwcm9ncmVzcyIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRUFMUkVBRFkiLCBXU0FFQUxSRUFEWSwgIk9wZXJhdGlvbiBhbHJlYWR5IGluIHByb2dyZXNzIik7CiAjZW5kaWYKICNlbmRpZgogI2lmZGVmIEVORVRET1dOCi0JaW5zY29kZShkLCBkcywgZGUsICJFTkVURE9XTiIsIEVORVRET1dOLCAiTmV0d29yayBpcyBkb3duIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFTkVURE9XTiIsIEVORVRET1dOLCAiTmV0d29yayBpcyBkb3duIik7CiAjZWxzZQogI2lmZGVmIFdTQUVORVRET1dOCi0JaW5zY29kZShkLCBkcywgZGUsICJFTkVURE9XTiIsIFdTQUVORVRET1dOLCAiTmV0d29yayBpcyBkb3duIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFTkVURE9XTiIsIFdTQUVORVRET1dOLCAiTmV0d29yayBpcyBkb3duIik7CiAjZW5kaWYKICNlbmRpZgogI2lmZGVmIEVOT1ROQU0KLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVOT1ROQU0iLCBFTk9UTkFNLCAiTm90IGEgWEVOSVggbmFtZWQgdHlwZSBmaWxlIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFTk9UTkFNIiwgRU5PVE5BTSwgIk5vdCBhIFhFTklYIG5hbWVkIHR5cGUgZmlsZSIpOwogI2VuZGlmCiAjaWZkZWYgRUFDQ0VTCi0JaW5zY29kZShkLCBkcywgZGUsICJFQUNDRVMiLCBFQUNDRVMsICJQZXJtaXNzaW9uIGRlbmllZCIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRUFDQ0VTIiwgRUFDQ0VTLCAiUGVybWlzc2lvbiBkZW5pZWQiKTsKICNlbHNlCiAjaWZkZWYgV1NBRUFDQ0VTCi0JaW5zY29kZShkLCBkcywgZGUsICJFQUNDRVMiLCBXU0FFQUNDRVMsICJQZXJtaXNzaW9uIGRlbmllZCIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRUFDQ0VTIiwgV1NBRUFDQ0VTLCAiUGVybWlzc2lvbiBkZW5pZWQiKTsKICNlbmRpZgogI2VuZGlmCiAjaWZkZWYgRUxOUk5HCi0JaW5zY29kZShkLCBkcywgZGUsICJFTE5STkciLCBFTE5STkcsICJMaW5rIG51bWJlciBvdXQgb2YgcmFuZ2UiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVMTlJORyIsIEVMTlJORywgIkxpbmsgbnVtYmVyIG91dCBvZiByYW5nZSIpOwogI2VuZGlmCiAjaWZkZWYgRUlMU0VRCi0JaW5zY29kZShkLCBkcywgZGUsICJFSUxTRVEiLCBFSUxTRVEsICJJbGxlZ2FsIGJ5dGUgc2VxdWVuY2UiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVJTFNFUSIsIEVJTFNFUSwgIklsbGVnYWwgYnl0ZSBzZXF1ZW5jZSIpOwogI2VuZGlmCiAjaWZkZWYgRU5PVERJUgotCWluc2NvZGUoZCwgZHMsIGRlLCAiRU5PVERJUiIsIEVOT1RESVIsICJOb3QgYSBkaXJlY3RvcnkiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVOT1RESVIiLCBFTk9URElSLCAiTm90IGEgZGlyZWN0b3J5Iik7CiAjZW5kaWYKICNpZmRlZiBFTk9UVU5JUQotCWluc2NvZGUoZCwgZHMsIGRlLCAiRU5PVFVOSVEiLCBFTk9UVU5JUSwgIk5hbWUgbm90IHVuaXF1ZSBvbiBuZXR3b3JrIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFTk9UVU5JUSIsIEVOT1RVTklRLCAiTmFtZSBub3QgdW5pcXVlIG9uIG5ldHdvcmsiKTsKICNlbmRpZgogI2lmZGVmIEVQRVJNCi0JaW5zY29kZShkLCBkcywgZGUsICJFUEVSTSIsIEVQRVJNLCAiT3BlcmF0aW9uIG5vdCBwZXJtaXR0ZWQiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVQRVJNIiwgRVBFUk0sICJPcGVyYXRpb24gbm90IHBlcm1pdHRlZCIpOwogI2VuZGlmCiAjaWZkZWYgRURPTQotCWluc2NvZGUoZCwgZHMsIGRlLCAiRURPTSIsIEVET00sICJNYXRoIGFyZ3VtZW50IG91dCBvZiBkb21haW4gb2YgZnVuYyIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRURPTSIsIEVET00sICJNYXRoIGFyZ3VtZW50IG91dCBvZiBkb21haW4gb2YgZnVuYyIpOwogI2VuZGlmCiAjaWZkZWYgRVhGVUxMCi0JaW5zY29kZShkLCBkcywgZGUsICJFWEZVTEwiLCBFWEZVTEwsICJFeGNoYW5nZSBmdWxsIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFWEZVTEwiLCBFWEZVTEwsICJFeGNoYW5nZSBmdWxsIik7CiAjZW5kaWYKICNpZmRlZiBFQ09OTlJFRlVTRUQKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVDT05OUkVGVVNFRCIsIEVDT05OUkVGVVNFRCwgIkNvbm5lY3Rpb24gcmVmdXNlZCIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRUNPTk5SRUZVU0VEIiwgRUNPTk5SRUZVU0VELCAiQ29ubmVjdGlvbiByZWZ1c2VkIik7CiAjZWxzZQogI2lmZGVmIFdTQUVDT05OUkVGVVNFRAotCWluc2NvZGUoZCwgZHMsIGRlLCAiRUNPTk5SRUZVU0VEIiwgV1NBRUNPTk5SRUZVU0VELCAiQ29ubmVjdGlvbiByZWZ1c2VkIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFQ09OTlJFRlVTRUQiLCBXU0FFQ09OTlJFRlVTRUQsICJDb25uZWN0aW9uIHJlZnVzZWQiKTsKICNlbmRpZgogI2VuZGlmCiAjaWZkZWYgRUlTRElSCi0JaW5zY29kZShkLCBkcywgZGUsICJFSVNESVIiLCBFSVNESVIsICJJcyBhIGRpcmVjdG9yeSIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRUlTRElSIiwgRUlTRElSLCAiSXMgYSBkaXJlY3RvcnkiKTsKICNlbmRpZgogI2lmZGVmIEVQUk9UT05PU1VQUE9SVAotCWluc2NvZGUoZCwgZHMsIGRlLCAiRVBST1RPTk9TVVBQT1JUIiwgRVBST1RPTk9TVVBQT1JULCAiUHJvdG9jb2wgbm90IHN1cHBvcnRlZCIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRVBST1RPTk9TVVBQT1JUIiwgRVBST1RPTk9TVVBQT1JULCAiUHJvdG9jb2wgbm90IHN1cHBvcnRlZCIpOwogI2Vsc2UKICNpZmRlZiBXU0FFUFJPVE9OT1NVUFBPUlQKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVQUk9UT05PU1VQUE9SVCIsIFdTQUVQUk9UT05PU1VQUE9SVCwgIlByb3RvY29sIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVQUk9UT05PU1VQUE9SVCIsIFdTQUVQUk9UT05PU1VQUE9SVCwgIlByb3RvY29sIG5vdCBzdXBwb3J0ZWQiKTsKICNlbmRpZgogI2VuZGlmCiAjaWZkZWYgRVJPRlMKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVST0ZTIiwgRVJPRlMsICJSZWFkLW9ubHkgZmlsZSBzeXN0ZW0iKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVST0ZTIiwgRVJPRlMsICJSZWFkLW9ubHkgZmlsZSBzeXN0ZW0iKTsKICNlbmRpZgogI2lmZGVmIEVBRERSTk9UQVZBSUwKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVBRERSTk9UQVZBSUwiLCBFQUREUk5PVEFWQUlMLCAiQ2Fubm90IGFzc2lnbiByZXF1ZXN0ZWQgYWRkcmVzcyIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRUFERFJOT1RBVkFJTCIsIEVBRERSTk9UQVZBSUwsICJDYW5ub3QgYXNzaWduIHJlcXVlc3RlZCBhZGRyZXNzIik7CiAjZWxzZQogI2lmZGVmIFdTQUVBRERSTk9UQVZBSUwKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVBRERSTk9UQVZBSUwiLCBXU0FFQUREUk5PVEFWQUlMLCAiQ2Fubm90IGFzc2lnbiByZXF1ZXN0ZWQgYWRkcmVzcyIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRUFERFJOT1RBVkFJTCIsIFdTQUVBRERSTk9UQVZBSUwsICJDYW5ub3QgYXNzaWduIHJlcXVlc3RlZCBhZGRyZXNzIik7CiAjZW5kaWYKICNlbmRpZgogI2lmZGVmIEVJRFJNCi0JaW5zY29kZShkLCBkcywgZGUsICJFSURSTSIsIEVJRFJNLCAiSWRlbnRpZmllciByZW1vdmVkIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFSURSTSIsIEVJRFJNLCAiSWRlbnRpZmllciByZW1vdmVkIik7CiAjZW5kaWYKICNpZmRlZiBFQ09NTQotCWluc2NvZGUoZCwgZHMsIGRlLCAiRUNPTU0iLCBFQ09NTSwgIkNvbW11bmljYXRpb24gZXJyb3Igb24gc2VuZCIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRUNPTU0iLCBFQ09NTSwgIkNvbW11bmljYXRpb24gZXJyb3Igb24gc2VuZCIpOwogI2VuZGlmCiAjaWZkZWYgRVNSTU5UCi0JaW5zY29kZShkLCBkcywgZGUsICJFU1JNTlQiLCBFU1JNTlQsICJTcm1vdW50IGVycm9yIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFU1JNTlQiLCBFU1JNTlQsICJTcm1vdW50IGVycm9yIik7CiAjZW5kaWYKICNpZmRlZiBFUkVNT1RFSU8KLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVSRU1PVEVJTyIsIEVSRU1PVEVJTywgIlJlbW90ZSBJL08gZXJyb3IiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVSRU1PVEVJTyIsIEVSRU1PVEVJTywgIlJlbW90ZSBJL08gZXJyb3IiKTsKICNlbmRpZgogI2lmZGVmIEVMM1JTVAotCWluc2NvZGUoZCwgZHMsIGRlLCAiRUwzUlNUIiwgRUwzUlNULCAiTGV2ZWwgMyByZXNldCIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRUwzUlNUIiwgRUwzUlNULCAiTGV2ZWwgMyByZXNldCIpOwogI2VuZGlmCiAjaWZkZWYgRUJBRE1TRwotCWluc2NvZGUoZCwgZHMsIGRlLCAiRUJBRE1TRyIsIEVCQURNU0csICJOb3QgYSBkYXRhIG1lc3NhZ2UiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVCQURNU0ciLCBFQkFETVNHLCAiTm90IGEgZGF0YSBtZXNzYWdlIik7CiAjZW5kaWYKICNpZmRlZiBFTkZJTEUKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVORklMRSIsIEVORklMRSwgIkZpbGUgdGFibGUgb3ZlcmZsb3ciKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVORklMRSIsIEVORklMRSwgIkZpbGUgdGFibGUgb3ZlcmZsb3ciKTsKICNlbmRpZgogI2lmZGVmIEVMSUJNQVgKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVMSUJNQVgiLCBFTElCTUFYLCAiQXR0ZW1wdGluZyB0byBsaW5rIGluIHRvbyBtYW55IHNoYXJlZCBsaWJyYXJpZXMiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVMSUJNQVgiLCBFTElCTUFYLCAiQXR0ZW1wdGluZyB0byBsaW5rIGluIHRvbyBtYW55IHNoYXJlZCBsaWJyYXJpZXMiKTsKICNlbmRpZgogI2lmZGVmIEVTUElQRQotCWluc2NvZGUoZCwgZHMsIGRlLCAiRVNQSVBFIiwgRVNQSVBFLCAiSWxsZWdhbCBzZWVrIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFU1BJUEUiLCBFU1BJUEUsICJJbGxlZ2FsIHNlZWsiKTsKICNlbmRpZgogI2lmZGVmIEVOT0xJTksKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVOT0xJTksiLCBFTk9MSU5LLCAiTGluayBoYXMgYmVlbiBzZXZlcmVkIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFTk9MSU5LIiwgRU5PTElOSywgIkxpbmsgaGFzIGJlZW4gc2V2ZXJlZCIpOwogI2VuZGlmCiAjaWZkZWYgRU5FVFJFU0VUCi0JaW5zY29kZShkLCBkcywgZGUsICJFTkVUUkVTRVQiLCBFTkVUUkVTRVQsICJOZXR3b3JrIGRyb3BwZWQgY29ubmVjdGlvbiBiZWNhdXNlIG9mIHJlc2V0Iik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFTkVUUkVTRVQiLCBFTkVUUkVTRVQsICJOZXR3b3JrIGRyb3BwZWQgY29ubmVjdGlvbiBiZWNhdXNlIG9mIHJlc2V0Iik7CiAjZWxzZQogI2lmZGVmIFdTQUVORVRSRVNFVAotCWluc2NvZGUoZCwgZHMsIGRlLCAiRU5FVFJFU0VUIiwgV1NBRU5FVFJFU0VULCAiTmV0d29yayBkcm9wcGVkIGNvbm5lY3Rpb24gYmVjYXVzZSBvZiByZXNldCIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRU5FVFJFU0VUIiwgV1NBRU5FVFJFU0VULCAiTmV0d29yayBkcm9wcGVkIGNvbm5lY3Rpb24gYmVjYXVzZSBvZiByZXNldCIpOwogI2VuZGlmCiAjZW5kaWYKICNpZmRlZiBFVElNRURPVVQKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVUSU1FRE9VVCIsIEVUSU1FRE9VVCwgIkNvbm5lY3Rpb24gdGltZWQgb3V0Iik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFVElNRURPVVQiLCBFVElNRURPVVQsICJDb25uZWN0aW9uIHRpbWVkIG91dCIpOwogI2Vsc2UKICNpZmRlZiBXU0FFVElNRURPVVQKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVUSU1FRE9VVCIsIFdTQUVUSU1FRE9VVCwgIkNvbm5lY3Rpb24gdGltZWQgb3V0Iik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFVElNRURPVVQiLCBXU0FFVElNRURPVVQsICJDb25uZWN0aW9uIHRpbWVkIG91dCIpOwogI2VuZGlmCiAjZW5kaWYKICNpZmRlZiBFTk9FTlQKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVOT0VOVCIsIEVOT0VOVCwgIk5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVOT0VOVCIsIEVOT0VOVCwgIk5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkiKTsKICNlbmRpZgogI2lmZGVmIEVFWElTVAotCWluc2NvZGUoZCwgZHMsIGRlLCAiRUVYSVNUIiwgRUVYSVNULCAiRmlsZSBleGlzdHMiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVFWElTVCIsIEVFWElTVCwgIkZpbGUgZXhpc3RzIik7CiAjZW5kaWYKICNpZmRlZiBFRFFVT1QKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVEUVVPVCIsIEVEUVVPVCwgIlF1b3RhIGV4Y2VlZGVkIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFRFFVT1QiLCBFRFFVT1QsICJRdW90YSBleGNlZWRlZCIpOwogI2Vsc2UKICNpZmRlZiBXU0FFRFFVT1QKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVEUVVPVCIsIFdTQUVEUVVPVCwgIlF1b3RhIGV4Y2VlZGVkIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFRFFVT1QiLCBXU0FFRFFVT1QsICJRdW90YSBleGNlZWRlZCIpOwogI2VuZGlmCiAjZW5kaWYKICNpZmRlZiBFTk9TVFIKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVOT1NUUiIsIEVOT1NUUiwgIkRldmljZSBub3QgYSBzdHJlYW0iKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVOT1NUUiIsIEVOT1NUUiwgIkRldmljZSBub3QgYSBzdHJlYW0iKTsKICNlbmRpZgogI2lmZGVmIEVCQURTTFQKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVCQURTTFQiLCBFQkFEU0xULCAiSW52YWxpZCBzbG90Iik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFQkFEU0xUIiwgRUJBRFNMVCwgIkludmFsaWQgc2xvdCIpOwogI2VuZGlmCiAjaWZkZWYgRUJBRFJRQwotCWluc2NvZGUoZCwgZHMsIGRlLCAiRUJBRFJRQyIsIEVCQURSUUMsICJJbnZhbGlkIHJlcXVlc3QgY29kZSIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRUJBRFJRQyIsIEVCQURSUUMsICJJbnZhbGlkIHJlcXVlc3QgY29kZSIpOwogI2VuZGlmCiAjaWZkZWYgRUxJQkFDQwotCWluc2NvZGUoZCwgZHMsIGRlLCAiRUxJQkFDQyIsIEVMSUJBQ0MsICJDYW4gbm90IGFjY2VzcyBhIG5lZWRlZCBzaGFyZWQgbGlicmFyeSIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRUxJQkFDQyIsIEVMSUJBQ0MsICJDYW4gbm90IGFjY2VzcyBhIG5lZWRlZCBzaGFyZWQgbGlicmFyeSIpOwogI2VuZGlmCiAjaWZkZWYgRUZBVUxUCi0JaW5zY29kZShkLCBkcywgZGUsICJFRkFVTFQiLCBFRkFVTFQsICJCYWQgYWRkcmVzcyIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRUZBVUxUIiwgRUZBVUxULCAiQmFkIGFkZHJlc3MiKTsKICNlbHNlCiAjaWZkZWYgV1NBRUZBVUxUCi0JaW5zY29kZShkLCBkcywgZGUsICJFRkFVTFQiLCBXU0FFRkFVTFQsICJCYWQgYWRkcmVzcyIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRUZBVUxUIiwgV1NBRUZBVUxULCAiQmFkIGFkZHJlc3MiKTsKICNlbmRpZgogI2VuZGlmCiAjaWZkZWYgRUZCSUcKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVGQklHIiwgRUZCSUcsICJGaWxlIHRvbyBsYXJnZSIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRUZCSUciLCBFRkJJRywgIkZpbGUgdG9vIGxhcmdlIik7CiAjZW5kaWYKICNpZmRlZiBFREVBRExLCi0JaW5zY29kZShkLCBkcywgZGUsICJFREVBRExLIiwgRURFQURMSywgIlJlc291cmNlIGRlYWRsb2NrIHdvdWxkIG9jY3VyIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFREVBRExLIiwgRURFQURMSywgIlJlc291cmNlIGRlYWRsb2NrIHdvdWxkIG9jY3VyIik7CiAjZW5kaWYKICNpZmRlZiBFTk9UQ09OTgotCWluc2NvZGUoZCwgZHMsIGRlLCAiRU5PVENPTk4iLCBFTk9UQ09OTiwgIlRyYW5zcG9ydCBlbmRwb2ludCBpcyBub3QgY29ubmVjdGVkIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFTk9UQ09OTiIsIEVOT1RDT05OLCAiVHJhbnNwb3J0IGVuZHBvaW50IGlzIG5vdCBjb25uZWN0ZWQiKTsKICNlbHNlCiAjaWZkZWYgV1NBRU5PVENPTk4KLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVOT1RDT05OIiwgV1NBRU5PVENPTk4sICJUcmFuc3BvcnQgZW5kcG9pbnQgaXMgbm90IGNvbm5lY3RlZCIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRU5PVENPTk4iLCBXU0FFTk9UQ09OTiwgIlRyYW5zcG9ydCBlbmRwb2ludCBpcyBub3QgY29ubmVjdGVkIik7CiAjZW5kaWYKICNlbmRpZgogI2lmZGVmIEVERVNUQUREUlJFUQotCWluc2NvZGUoZCwgZHMsIGRlLCAiRURFU1RBRERSUkVRIiwgRURFU1RBRERSUkVRLCAiRGVzdGluYXRpb24gYWRkcmVzcyByZXF1aXJlZCIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRURFU1RBRERSUkVRIiwgRURFU1RBRERSUkVRLCAiRGVzdGluYXRpb24gYWRkcmVzcyByZXF1aXJlZCIpOwogI2Vsc2UKICNpZmRlZiBXU0FFREVTVEFERFJSRVEKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVERVNUQUREUlJFUSIsIFdTQUVERVNUQUREUlJFUSwgIkRlc3RpbmF0aW9uIGFkZHJlc3MgcmVxdWlyZWQiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVERVNUQUREUlJFUSIsIFdTQUVERVNUQUREUlJFUSwgIkRlc3RpbmF0aW9uIGFkZHJlc3MgcmVxdWlyZWQiKTsKICNlbmRpZgogI2VuZGlmCiAjaWZkZWYgRUxJQlNDTgotCWluc2NvZGUoZCwgZHMsIGRlLCAiRUxJQlNDTiIsIEVMSUJTQ04sICIubGliIHNlY3Rpb24gaW4gYS5vdXQgY29ycnVwdGVkIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFTElCU0NOIiwgRUxJQlNDTiwgIi5saWIgc2VjdGlvbiBpbiBhLm91dCBjb3JydXB0ZWQiKTsKICNlbmRpZgogI2lmZGVmIEVOT0xDSwotCWluc2NvZGUoZCwgZHMsIGRlLCAiRU5PTENLIiwgRU5PTENLLCAiTm8gcmVjb3JkIGxvY2tzIGF2YWlsYWJsZSIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRU5PTENLIiwgRU5PTENLLCAiTm8gcmVjb3JkIGxvY2tzIGF2YWlsYWJsZSIpOwogI2VuZGlmCiAjaWZkZWYgRUlTTkFNCi0JaW5zY29kZShkLCBkcywgZGUsICJFSVNOQU0iLCBFSVNOQU0sICJJcyBhIG5hbWVkIHR5cGUgZmlsZSIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRUlTTkFNIiwgRUlTTkFNLCAiSXMgYSBuYW1lZCB0eXBlIGZpbGUiKTsKICNlbmRpZgogI2lmZGVmIEVDT05OQUJPUlRFRAotCWluc2NvZGUoZCwgZHMsIGRlLCAiRUNPTk5BQk9SVEVEIiwgRUNPTk5BQk9SVEVELCAiU29mdHdhcmUgY2F1c2VkIGNvbm5lY3Rpb24gYWJvcnQiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVDT05OQUJPUlRFRCIsIEVDT05OQUJPUlRFRCwgIlNvZnR3YXJlIGNhdXNlZCBjb25uZWN0aW9uIGFib3J0Iik7CiAjZWxzZQogI2lmZGVmIFdTQUVDT05OQUJPUlRFRAotCWluc2NvZGUoZCwgZHMsIGRlLCAiRUNPTk5BQk9SVEVEIiwgV1NBRUNPTk5BQk9SVEVELCAiU29mdHdhcmUgY2F1c2VkIGNvbm5lY3Rpb24gYWJvcnQiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVDT05OQUJPUlRFRCIsIFdTQUVDT05OQUJPUlRFRCwgIlNvZnR3YXJlIGNhdXNlZCBjb25uZWN0aW9uIGFib3J0Iik7CiAjZW5kaWYKICNlbmRpZgogI2lmZGVmIEVORVRVTlJFQUNICi0JaW5zY29kZShkLCBkcywgZGUsICJFTkVUVU5SRUFDSCIsIEVORVRVTlJFQUNILCAiTmV0d29yayBpcyB1bnJlYWNoYWJsZSIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRU5FVFVOUkVBQ0giLCBFTkVUVU5SRUFDSCwgIk5ldHdvcmsgaXMgdW5yZWFjaGFibGUiKTsKICNlbHNlCiAjaWZkZWYgV1NBRU5FVFVOUkVBQ0gKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVORVRVTlJFQUNIIiwgV1NBRU5FVFVOUkVBQ0gsICJOZXR3b3JrIGlzIHVucmVhY2hhYmxlIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFTkVUVU5SRUFDSCIsIFdTQUVORVRVTlJFQUNILCAiTmV0d29yayBpcyB1bnJlYWNoYWJsZSIpOwogI2VuZGlmCiAjZW5kaWYKICNpZmRlZiBFU1RBTEUKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVTVEFMRSIsIEVTVEFMRSwgIlN0YWxlIE5GUyBmaWxlIGhhbmRsZSIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRVNUQUxFIiwgRVNUQUxFLCAiU3RhbGUgTkZTIGZpbGUgaGFuZGxlIik7CiAjZWxzZQogI2lmZGVmIFdTQUVTVEFMRQotCWluc2NvZGUoZCwgZHMsIGRlLCAiRVNUQUxFIiwgV1NBRVNUQUxFLCAiU3RhbGUgTkZTIGZpbGUgaGFuZGxlIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFU1RBTEUiLCBXU0FFU1RBTEUsICJTdGFsZSBORlMgZmlsZSBoYW5kbGUiKTsKICNlbmRpZgogI2VuZGlmCiAjaWZkZWYgRU5PU1IKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVOT1NSIiwgRU5PU1IsICJPdXQgb2Ygc3RyZWFtcyByZXNvdXJjZXMiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVOT1NSIiwgRU5PU1IsICJPdXQgb2Ygc3RyZWFtcyByZXNvdXJjZXMiKTsKICNlbmRpZgogI2lmZGVmIEVOT01FTQotCWluc2NvZGUoZCwgZHMsIGRlLCAiRU5PTUVNIiwgRU5PTUVNLCAiT3V0IG9mIG1lbW9yeSIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRU5PTUVNIiwgRU5PTUVNLCAiT3V0IG9mIG1lbW9yeSIpOwogI2VuZGlmCiAjaWZkZWYgRU5PVFNPQ0sKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVOT1RTT0NLIiwgRU5PVFNPQ0ssICJTb2NrZXQgb3BlcmF0aW9uIG9uIG5vbi1zb2NrZXQiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVOT1RTT0NLIiwgRU5PVFNPQ0ssICJTb2NrZXQgb3BlcmF0aW9uIG9uIG5vbi1zb2NrZXQiKTsKICNlbHNlCiAjaWZkZWYgV1NBRU5PVFNPQ0sKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVOT1RTT0NLIiwgV1NBRU5PVFNPQ0ssICJTb2NrZXQgb3BlcmF0aW9uIG9uIG5vbi1zb2NrZXQiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVOT1RTT0NLIiwgV1NBRU5PVFNPQ0ssICJTb2NrZXQgb3BlcmF0aW9uIG9uIG5vbi1zb2NrZXQiKTsKICNlbmRpZgogI2VuZGlmCiAjaWZkZWYgRVNUUlBJUEUKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVTVFJQSVBFIiwgRVNUUlBJUEUsICJTdHJlYW1zIHBpcGUgZXJyb3IiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVTVFJQSVBFIiwgRVNUUlBJUEUsICJTdHJlYW1zIHBpcGUgZXJyb3IiKTsKICNlbmRpZgogI2lmZGVmIEVNTElOSwotCWluc2NvZGUoZCwgZHMsIGRlLCAiRU1MSU5LIiwgRU1MSU5LLCAiVG9vIG1hbnkgbGlua3MiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVNTElOSyIsIEVNTElOSywgIlRvbyBtYW55IGxpbmtzIik7CiAjZW5kaWYKICNpZmRlZiBFUkFOR0UKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVSQU5HRSIsIEVSQU5HRSwgIk1hdGggcmVzdWx0IG5vdCByZXByZXNlbnRhYmxlIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFUkFOR0UiLCBFUkFOR0UsICJNYXRoIHJlc3VsdCBub3QgcmVwcmVzZW50YWJsZSIpOwogI2VuZGlmCiAjaWZkZWYgRUxJQkVYRUMKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVMSUJFWEVDIiwgRUxJQkVYRUMsICJDYW5ub3QgZXhlYyBhIHNoYXJlZCBsaWJyYXJ5IGRpcmVjdGx5Iik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFTElCRVhFQyIsIEVMSUJFWEVDLCAiQ2Fubm90IGV4ZWMgYSBzaGFyZWQgbGlicmFyeSBkaXJlY3RseSIpOwogI2VuZGlmCiAjaWZkZWYgRUwzSExUCi0JaW5zY29kZShkLCBkcywgZGUsICJFTDNITFQiLCBFTDNITFQsICJMZXZlbCAzIGhhbHRlZCIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRUwzSExUIiwgRUwzSExULCAiTGV2ZWwgMyBoYWx0ZWQiKTsKICNlbmRpZgogI2lmZGVmIEVDT05OUkVTRVQKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVDT05OUkVTRVQiLCBFQ09OTlJFU0VULCAiQ29ubmVjdGlvbiByZXNldCBieSBwZWVyIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFQ09OTlJFU0VUIiwgRUNPTk5SRVNFVCwgIkNvbm5lY3Rpb24gcmVzZXQgYnkgcGVlciIpOwogI2Vsc2UKICNpZmRlZiBXU0FFQ09OTlJFU0VUCi0JaW5zY29kZShkLCBkcywgZGUsICJFQ09OTlJFU0VUIiwgV1NBRUNPTk5SRVNFVCwgIkNvbm5lY3Rpb24gcmVzZXQgYnkgcGVlciIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRUNPTk5SRVNFVCIsIFdTQUVDT05OUkVTRVQsICJDb25uZWN0aW9uIHJlc2V0IGJ5IHBlZXIiKTsKICNlbmRpZgogI2VuZGlmCiAjaWZkZWYgRUFERFJJTlVTRQotCWluc2NvZGUoZCwgZHMsIGRlLCAiRUFERFJJTlVTRSIsIEVBRERSSU5VU0UsICJBZGRyZXNzIGFscmVhZHkgaW4gdXNlIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFQUREUklOVVNFIiwgRUFERFJJTlVTRSwgIkFkZHJlc3MgYWxyZWFkeSBpbiB1c2UiKTsKICNlbHNlCiAjaWZkZWYgV1NBRUFERFJJTlVTRQotCWluc2NvZGUoZCwgZHMsIGRlLCAiRUFERFJJTlVTRSIsIFdTQUVBRERSSU5VU0UsICJBZGRyZXNzIGFscmVhZHkgaW4gdXNlIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFQUREUklOVVNFIiwgV1NBRUFERFJJTlVTRSwgIkFkZHJlc3MgYWxyZWFkeSBpbiB1c2UiKTsKICNlbmRpZgogI2VuZGlmCiAjaWZkZWYgRU9QTk9UU1VQUAotCWluc2NvZGUoZCwgZHMsIGRlLCAiRU9QTk9UU1VQUCIsIEVPUE5PVFNVUFAsICJPcGVyYXRpb24gbm90IHN1cHBvcnRlZCBvbiB0cmFuc3BvcnQgZW5kcG9pbnQiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVPUE5PVFNVUFAiLCBFT1BOT1RTVVBQLCAiT3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWQgb24gdHJhbnNwb3J0IGVuZHBvaW50Iik7CiAjZWxzZQogI2lmZGVmIFdTQUVPUE5PVFNVUFAKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVPUE5PVFNVUFAiLCBXU0FFT1BOT1RTVVBQLCAiT3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWQgb24gdHJhbnNwb3J0IGVuZHBvaW50Iik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFT1BOT1RTVVBQIiwgV1NBRU9QTk9UU1VQUCwgIk9wZXJhdGlvbiBub3Qgc3VwcG9ydGVkIG9uIHRyYW5zcG9ydCBlbmRwb2ludCIpOwogI2VuZGlmCiAjZW5kaWYKICNpZmRlZiBFUkVNQ0hHCi0JaW5zY29kZShkLCBkcywgZGUsICJFUkVNQ0hHIiwgRVJFTUNIRywgIlJlbW90ZSBhZGRyZXNzIGNoYW5nZWQiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVSRU1DSEciLCBFUkVNQ0hHLCAiUmVtb3RlIGFkZHJlc3MgY2hhbmdlZCIpOwogI2VuZGlmCiAjaWZkZWYgRUFHQUlOCi0JaW5zY29kZShkLCBkcywgZGUsICJFQUdBSU4iLCBFQUdBSU4sICJUcnkgYWdhaW4iKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVBR0FJTiIsIEVBR0FJTiwgIlRyeSBhZ2FpbiIpOwogI2VuZGlmCiAjaWZkZWYgRU5BTUVUT09MT05HCi0JaW5zY29kZShkLCBkcywgZGUsICJFTkFNRVRPT0xPTkciLCBFTkFNRVRPT0xPTkcsICJGaWxlIG5hbWUgdG9vIGxvbmciKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVOQU1FVE9PTE9ORyIsIEVOQU1FVE9PTE9ORywgIkZpbGUgbmFtZSB0b28gbG9uZyIpOwogI2Vsc2UKICNpZmRlZiBXU0FFTkFNRVRPT0xPTkcKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVOQU1FVE9PTE9ORyIsIFdTQUVOQU1FVE9PTE9ORywgIkZpbGUgbmFtZSB0b28gbG9uZyIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRU5BTUVUT09MT05HIiwgV1NBRU5BTUVUT09MT05HLCAiRmlsZSBuYW1lIHRvbyBsb25nIik7CiAjZW5kaWYKICNlbmRpZgogI2lmZGVmIEVOT1RUWQotCWluc2NvZGUoZCwgZHMsIGRlLCAiRU5PVFRZIiwgRU5PVFRZLCAiTm90IGEgdHlwZXdyaXRlciIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRU5PVFRZIiwgRU5PVFRZLCAiTm90IGEgdHlwZXdyaXRlciIpOwogI2VuZGlmCiAjaWZkZWYgRVJFU1RBUlQKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVSRVNUQVJUIiwgRVJFU1RBUlQsICJJbnRlcnJ1cHRlZCBzeXN0ZW0gY2FsbCBzaG91bGQgYmUgcmVzdGFydGVkIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFUkVTVEFSVCIsIEVSRVNUQVJULCAiSW50ZXJydXB0ZWQgc3lzdGVtIGNhbGwgc2hvdWxkIGJlIHJlc3RhcnRlZCIpOwogI2VuZGlmCiAjaWZkZWYgRVNPQ0tUTk9TVVBQT1JUCi0JaW5zY29kZShkLCBkcywgZGUsICJFU09DS1ROT1NVUFBPUlQiLCBFU09DS1ROT1NVUFBPUlQsICJTb2NrZXQgdHlwZSBub3Qgc3VwcG9ydGVkIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFU09DS1ROT1NVUFBPUlQiLCBFU09DS1ROT1NVUFBPUlQsICJTb2NrZXQgdHlwZSBub3Qgc3VwcG9ydGVkIik7CiAjZWxzZQogI2lmZGVmIFdTQUVTT0NLVE5PU1VQUE9SVAotCWluc2NvZGUoZCwgZHMsIGRlLCAiRVNPQ0tUTk9TVVBQT1JUIiwgV1NBRVNPQ0tUTk9TVVBQT1JULCAiU29ja2V0IHR5cGUgbm90IHN1cHBvcnRlZCIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRVNPQ0tUTk9TVVBQT1JUIiwgV1NBRVNPQ0tUTk9TVVBQT1JULCAiU29ja2V0IHR5cGUgbm90IHN1cHBvcnRlZCIpOwogI2VuZGlmCiAjZW5kaWYKICNpZmRlZiBFVElNRQotCWluc2NvZGUoZCwgZHMsIGRlLCAiRVRJTUUiLCBFVElNRSwgIlRpbWVyIGV4cGlyZWQiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVUSU1FIiwgRVRJTUUsICJUaW1lciBleHBpcmVkIik7CiAjZW5kaWYKICNpZmRlZiBFQkZPTlQKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVCRk9OVCIsIEVCRk9OVCwgIkJhZCBmb250IGZpbGUgZm9ybWF0Iik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFQkZPTlQiLCBFQkZPTlQsICJCYWQgZm9udCBmaWxlIGZvcm1hdCIpOwogI2VuZGlmCiAjaWZkZWYgRURFQURMT0NLCi0JaW5zY29kZShkLCBkcywgZGUsICJFREVBRExPQ0siLCBFREVBRExPQ0ssICJFcnJvciBFREVBRExPQ0siKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVERUFETE9DSyIsIEVERUFETE9DSywgIkVycm9yIEVERUFETE9DSyIpOwogI2VuZGlmCiAjaWZkZWYgRVRPT01BTllSRUZTCi0JaW5zY29kZShkLCBkcywgZGUsICJFVE9PTUFOWVJFRlMiLCBFVE9PTUFOWVJFRlMsICJUb28gbWFueSByZWZlcmVuY2VzOiBjYW5ub3Qgc3BsaWNlIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFVE9PTUFOWVJFRlMiLCBFVE9PTUFOWVJFRlMsICJUb28gbWFueSByZWZlcmVuY2VzOiBjYW5ub3Qgc3BsaWNlIik7CiAjZWxzZQogI2lmZGVmIFdTQUVUT09NQU5ZUkVGUwotCWluc2NvZGUoZCwgZHMsIGRlLCAiRVRPT01BTllSRUZTIiwgV1NBRVRPT01BTllSRUZTLCAiVG9vIG1hbnkgcmVmZXJlbmNlczogY2Fubm90IHNwbGljZSIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRVRPT01BTllSRUZTIiwgV1NBRVRPT01BTllSRUZTLCAiVG9vIG1hbnkgcmVmZXJlbmNlczogY2Fubm90IHNwbGljZSIpOwogI2VuZGlmCiAjZW5kaWYKICNpZmRlZiBFTUZJTEUKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVNRklMRSIsIEVNRklMRSwgIlRvbyBtYW55IG9wZW4gZmlsZXMiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVNRklMRSIsIEVNRklMRSwgIlRvbyBtYW55IG9wZW4gZmlsZXMiKTsKICNlbHNlCiAjaWZkZWYgV1NBRU1GSUxFCi0JaW5zY29kZShkLCBkcywgZGUsICJFTUZJTEUiLCBXU0FFTUZJTEUsICJUb28gbWFueSBvcGVuIGZpbGVzIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFTUZJTEUiLCBXU0FFTUZJTEUsICJUb28gbWFueSBvcGVuIGZpbGVzIik7CiAjZW5kaWYKICNlbmRpZgogI2lmZGVmIEVUWFRCU1kKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVUWFRCU1kiLCBFVFhUQlNZLCAiVGV4dCBmaWxlIGJ1c3kiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVUWFRCU1kiLCBFVFhUQlNZLCAiVGV4dCBmaWxlIGJ1c3kiKTsKICNlbmRpZgogI2lmZGVmIEVJTlBST0dSRVNTCi0JaW5zY29kZShkLCBkcywgZGUsICJFSU5QUk9HUkVTUyIsIEVJTlBST0dSRVNTLCAiT3BlcmF0aW9uIG5vdyBpbiBwcm9ncmVzcyIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRUlOUFJPR1JFU1MiLCBFSU5QUk9HUkVTUywgIk9wZXJhdGlvbiBub3cgaW4gcHJvZ3Jlc3MiKTsKICNlbHNlCiAjaWZkZWYgV1NBRUlOUFJPR1JFU1MKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVJTlBST0dSRVNTIiwgV1NBRUlOUFJPR1JFU1MsICJPcGVyYXRpb24gbm93IGluIHByb2dyZXNzIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFSU5QUk9HUkVTUyIsIFdTQUVJTlBST0dSRVNTLCAiT3BlcmF0aW9uIG5vdyBpbiBwcm9ncmVzcyIpOwogI2VuZGlmCiAjZW5kaWYKICNpZmRlZiBFTlhJTwotCWluc2NvZGUoZCwgZHMsIGRlLCAiRU5YSU8iLCBFTlhJTywgIk5vIHN1Y2ggZGV2aWNlIG9yIGFkZHJlc3MiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVOWElPIiwgRU5YSU8sICJObyBzdWNoIGRldmljZSBvciBhZGRyZXNzIik7CiAjZW5kaWYKICNpZmRlZiBFTk9QS0cKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVOT1BLRyIsIEVOT1BLRywgIlBhY2thZ2Ugbm90IGluc3RhbGxlZCIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRU5PUEtHIiwgRU5PUEtHLCAiUGFja2FnZSBub3QgaW5zdGFsbGVkIik7CiAjZW5kaWYKICNpZmRlZiBXU0FTWQotCWluc2NvZGUoZCwgZHMsIGRlLCAiV1NBU1kiLCBXU0FTWSwgIkVycm9yIFdTQVNZIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJXU0FTWSIsIFdTQVNZLCAiRXJyb3IgV1NBU1kiKTsKICNlbmRpZgogI2lmZGVmIFdTQUVIT1NURE9XTgotCWluc2NvZGUoZCwgZHMsIGRlLCAiV1NBRUhPU1RET1dOIiwgV1NBRUhPU1RET1dOLCAiSG9zdCBpcyBkb3duIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJXU0FFSE9TVERPV04iLCBXU0FFSE9TVERPV04sICJIb3N0IGlzIGRvd24iKTsKICNlbmRpZgogI2lmZGVmIFdTQUVORVRET1dOCi0JaW5zY29kZShkLCBkcywgZGUsICJXU0FFTkVURE9XTiIsIFdTQUVORVRET1dOLCAiTmV0d29yayBpcyBkb3duIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJXU0FFTkVURE9XTiIsIFdTQUVORVRET1dOLCAiTmV0d29yayBpcyBkb3duIik7CiAjZW5kaWYKICNpZmRlZiBXU0FFTk9UU09DSwotCWluc2NvZGUoZCwgZHMsIGRlLCAiV1NBRU5PVFNPQ0siLCBXU0FFTk9UU09DSywgIlNvY2tldCBvcGVyYXRpb24gb24gbm9uLXNvY2tldCIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiV1NBRU5PVFNPQ0siLCBXU0FFTk9UU09DSywgIlNvY2tldCBvcGVyYXRpb24gb24gbm9uLXNvY2tldCIpOwogI2VuZGlmCiAjaWZkZWYgV1NBRUhPU1RVTlJFQUNICi0JaW5zY29kZShkLCBkcywgZGUsICJXU0FFSE9TVFVOUkVBQ0giLCBXU0FFSE9TVFVOUkVBQ0gsICJObyByb3V0ZSB0byBob3N0Iik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJXU0FFSE9TVFVOUkVBQ0giLCBXU0FFSE9TVFVOUkVBQ0gsICJObyByb3V0ZSB0byBob3N0Iik7CiAjZW5kaWYKICNpZmRlZiBXU0FFTE9PUAotCWluc2NvZGUoZCwgZHMsIGRlLCAiV1NBRUxPT1AiLCBXU0FFTE9PUCwgIlRvbyBtYW55IHN5bWJvbGljIGxpbmtzIGVuY291bnRlcmVkIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJXU0FFTE9PUCIsIFdTQUVMT09QLCAiVG9vIG1hbnkgc3ltYm9saWMgbGlua3MgZW5jb3VudGVyZWQiKTsKICNlbmRpZgogI2lmZGVmIFdTQUVNRklMRQotCWluc2NvZGUoZCwgZHMsIGRlLCAiV1NBRU1GSUxFIiwgV1NBRU1GSUxFLCAiVG9vIG1hbnkgb3BlbiBmaWxlcyIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiV1NBRU1GSUxFIiwgV1NBRU1GSUxFLCAiVG9vIG1hbnkgb3BlbiBmaWxlcyIpOwogI2VuZGlmCiAjaWZkZWYgV1NBRVNUQUxFCi0JaW5zY29kZShkLCBkcywgZGUsICJXU0FFU1RBTEUiLCBXU0FFU1RBTEUsICJTdGFsZSBORlMgZmlsZSBoYW5kbGUiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUVTVEFMRSIsIFdTQUVTVEFMRSwgIlN0YWxlIE5GUyBmaWxlIGhhbmRsZSIpOwogI2VuZGlmCiAjaWZkZWYgV1NBVkVSTk9UU1VQUE9SVEVECi0JaW5zY29kZShkLCBkcywgZGUsICJXU0FWRVJOT1RTVVBQT1JURUQiLCBXU0FWRVJOT1RTVVBQT1JURUQsICJFcnJvciBXU0FWRVJOT1RTVVBQT1JURUQiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIldTQVZFUk5PVFNVUFBPUlRFRCIsIFdTQVZFUk5PVFNVUFBPUlRFRCwgIkVycm9yIFdTQVZFUk5PVFNVUFBPUlRFRCIpOwogI2VuZGlmCiAjaWZkZWYgV1NBRU5FVFVOUkVBQ0gKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUVORVRVTlJFQUNIIiwgV1NBRU5FVFVOUkVBQ0gsICJOZXR3b3JrIGlzIHVucmVhY2hhYmxlIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJXU0FFTkVUVU5SRUFDSCIsIFdTQUVORVRVTlJFQUNILCAiTmV0d29yayBpcyB1bnJlYWNoYWJsZSIpOwogI2VuZGlmCiAjaWZkZWYgV1NBRVBST0NMSU0KLQlpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUVQUk9DTElNIiwgV1NBRVBST0NMSU0sICJFcnJvciBXU0FFUFJPQ0xJTSIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiV1NBRVBST0NMSU0iLCBXU0FFUFJPQ0xJTSwgIkVycm9yIFdTQUVQUk9DTElNIik7CiAjZW5kaWYKICNpZmRlZiBXU0FFRkFVTFQKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUVGQVVMVCIsIFdTQUVGQVVMVCwgIkJhZCBhZGRyZXNzIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJXU0FFRkFVTFQiLCBXU0FFRkFVTFQsICJCYWQgYWRkcmVzcyIpOwogI2VuZGlmCiAjaWZkZWYgV1NBTk9USU5JVElBTElTRUQKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIldTQU5PVElOSVRJQUxJU0VEIiwgV1NBTk9USU5JVElBTElTRUQsICJFcnJvciBXU0FOT1RJTklUSUFMSVNFRCIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiV1NBTk9USU5JVElBTElTRUQiLCBXU0FOT1RJTklUSUFMSVNFRCwgIkVycm9yIFdTQU5PVElOSVRJQUxJU0VEIik7CiAjZW5kaWYKICNpZmRlZiBXU0FFVVNFUlMKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUVVU0VSUyIsIFdTQUVVU0VSUywgIlRvbyBtYW55IHVzZXJzIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJXU0FFVVNFUlMiLCBXU0FFVVNFUlMsICJUb28gbWFueSB1c2VycyIpOwogI2VuZGlmCiAjaWZkZWYgV1NBTUFLRUFTWU5DUkVQTAotCWluc2NvZGUoZCwgZHMsIGRlLCAiV1NBTUFLRUFTWU5DUkVQTCIsIFdTQU1BS0VBU1lOQ1JFUEwsICJFcnJvciBXU0FNQUtFQVNZTkNSRVBMIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJXU0FNQUtFQVNZTkNSRVBMIiwgV1NBTUFLRUFTWU5DUkVQTCwgIkVycm9yIFdTQU1BS0VBU1lOQ1JFUEwiKTsKICNlbmRpZgogI2lmZGVmIFdTQUVOT1BST1RPT1BUCi0JaW5zY29kZShkLCBkcywgZGUsICJXU0FFTk9QUk9UT09QVCIsIFdTQUVOT1BST1RPT1BULCAiUHJvdG9jb2wgbm90IGF2YWlsYWJsZSIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiV1NBRU5PUFJPVE9PUFQiLCBXU0FFTk9QUk9UT09QVCwgIlByb3RvY29sIG5vdCBhdmFpbGFibGUiKTsKICNlbmRpZgogI2lmZGVmIFdTQUVDT05OQUJPUlRFRAotCWluc2NvZGUoZCwgZHMsIGRlLCAiV1NBRUNPTk5BQk9SVEVEIiwgV1NBRUNPTk5BQk9SVEVELCAiU29mdHdhcmUgY2F1c2VkIGNvbm5lY3Rpb24gYWJvcnQiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUVDT05OQUJPUlRFRCIsIFdTQUVDT05OQUJPUlRFRCwgIlNvZnR3YXJlIGNhdXNlZCBjb25uZWN0aW9uIGFib3J0Iik7CiAjZW5kaWYKICNpZmRlZiBXU0FFTkFNRVRPT0xPTkcKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUVOQU1FVE9PTE9ORyIsIFdTQUVOQU1FVE9PTE9ORywgIkZpbGUgbmFtZSB0b28gbG9uZyIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiV1NBRU5BTUVUT09MT05HIiwgV1NBRU5BTUVUT09MT05HLCAiRmlsZSBuYW1lIHRvbyBsb25nIik7CiAjZW5kaWYKICNpZmRlZiBXU0FFTk9URU1QVFkKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUVOT1RFTVBUWSIsIFdTQUVOT1RFTVBUWSwgIkRpcmVjdG9yeSBub3QgZW1wdHkiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUVOT1RFTVBUWSIsIFdTQUVOT1RFTVBUWSwgIkRpcmVjdG9yeSBub3QgZW1wdHkiKTsKICNlbmRpZgogI2lmZGVmIFdTQUVTSFVURE9XTgotCWluc2NvZGUoZCwgZHMsIGRlLCAiV1NBRVNIVVRET1dOIiwgV1NBRVNIVVRET1dOLCAiQ2Fubm90IHNlbmQgYWZ0ZXIgdHJhbnNwb3J0IGVuZHBvaW50IHNodXRkb3duIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJXU0FFU0hVVERPV04iLCBXU0FFU0hVVERPV04sICJDYW5ub3Qgc2VuZCBhZnRlciB0cmFuc3BvcnQgZW5kcG9pbnQgc2h1dGRvd24iKTsKICNlbmRpZgogI2lmZGVmIFdTQUVBRk5PU1VQUE9SVAotCWluc2NvZGUoZCwgZHMsIGRlLCAiV1NBRUFGTk9TVVBQT1JUIiwgV1NBRUFGTk9TVVBQT1JULCAiQWRkcmVzcyBmYW1pbHkgbm90IHN1cHBvcnRlZCBieSBwcm90b2NvbCIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiV1NBRUFGTk9TVVBQT1JUIiwgV1NBRUFGTk9TVVBQT1JULCAiQWRkcmVzcyBmYW1pbHkgbm90IHN1cHBvcnRlZCBieSBwcm90b2NvbCIpOwogI2VuZGlmCiAjaWZkZWYgV1NBRVRPT01BTllSRUZTCi0JaW5zY29kZShkLCBkcywgZGUsICJXU0FFVE9PTUFOWVJFRlMiLCBXU0FFVE9PTUFOWVJFRlMsICJUb28gbWFueSByZWZlcmVuY2VzOiBjYW5ub3Qgc3BsaWNlIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJXU0FFVE9PTUFOWVJFRlMiLCBXU0FFVE9PTUFOWVJFRlMsICJUb28gbWFueSByZWZlcmVuY2VzOiBjYW5ub3Qgc3BsaWNlIik7CiAjZW5kaWYKICNpZmRlZiBXU0FFQUNDRVMKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUVBQ0NFUyIsIFdTQUVBQ0NFUywgIlBlcm1pc3Npb24gZGVuaWVkIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJXU0FFQUNDRVMiLCBXU0FFQUNDRVMsICJQZXJtaXNzaW9uIGRlbmllZCIpOwogI2VuZGlmCiAjaWZkZWYgV1NBVFIKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIldTQVRSIiwgV1NBVFIsICJFcnJvciBXU0FUUiIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiV1NBVFIiLCBXU0FUUiwgIkVycm9yIFdTQVRSIik7CiAjZW5kaWYKICNpZmRlZiBXU0FCQVNFRVJSCi0JaW5zY29kZShkLCBkcywgZGUsICJXU0FCQVNFRVJSIiwgV1NBQkFTRUVSUiwgIkVycm9yIFdTQUJBU0VFUlIiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUJBU0VFUlIiLCBXU0FCQVNFRVJSLCAiRXJyb3IgV1NBQkFTRUVSUiIpOwogI2VuZGlmCiAjaWZkZWYgV1NBREVTQ1JJUFRJTwotCWluc2NvZGUoZCwgZHMsIGRlLCAiV1NBREVTQ1JJUFRJTyIsIFdTQURFU0NSSVBUSU8sICJFcnJvciBXU0FERVNDUklQVElPIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJXU0FERVNDUklQVElPIiwgV1NBREVTQ1JJUFRJTywgIkVycm9yIFdTQURFU0NSSVBUSU8iKTsKICNlbmRpZgogI2lmZGVmIFdTQUVNU0dTSVpFCi0JaW5zY29kZShkLCBkcywgZGUsICJXU0FFTVNHU0laRSIsIFdTQUVNU0dTSVpFLCAiTWVzc2FnZSB0b28gbG9uZyIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiV1NBRU1TR1NJWkUiLCBXU0FFTVNHU0laRSwgIk1lc3NhZ2UgdG9vIGxvbmciKTsKICNlbmRpZgogI2lmZGVmIFdTQUVCQURGCi0JaW5zY29kZShkLCBkcywgZGUsICJXU0FFQkFERiIsIFdTQUVCQURGLCAiQmFkIGZpbGUgbnVtYmVyIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJXU0FFQkFERiIsIFdTQUVCQURGLCAiQmFkIGZpbGUgbnVtYmVyIik7CiAjZW5kaWYKICNpZmRlZiBXU0FFQ09OTlJFU0VUCi0JaW5zY29kZShkLCBkcywgZGUsICJXU0FFQ09OTlJFU0VUIiwgV1NBRUNPTk5SRVNFVCwgIkNvbm5lY3Rpb24gcmVzZXQgYnkgcGVlciIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiV1NBRUNPTk5SRVNFVCIsIFdTQUVDT05OUkVTRVQsICJDb25uZWN0aW9uIHJlc2V0IGJ5IHBlZXIiKTsKICNlbmRpZgogI2lmZGVmIFdTQUdFVFNFTEVDVEVSUk8KLQlpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUdFVFNFTEVDVEVSUk8iLCBXU0FHRVRTRUxFQ1RFUlJPLCAiRXJyb3IgV1NBR0VUU0VMRUNURVJSTyIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiV1NBR0VUU0VMRUNURVJSTyIsIFdTQUdFVFNFTEVDVEVSUk8sICJFcnJvciBXU0FHRVRTRUxFQ1RFUlJPIik7CiAjZW5kaWYKICNpZmRlZiBXU0FFVElNRURPVVQKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUVUSU1FRE9VVCIsIFdTQUVUSU1FRE9VVCwgIkNvbm5lY3Rpb24gdGltZWQgb3V0Iik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJXU0FFVElNRURPVVQiLCBXU0FFVElNRURPVVQsICJDb25uZWN0aW9uIHRpbWVkIG91dCIpOwogI2VuZGlmCiAjaWZkZWYgV1NBRU5PQlVGUwotCWluc2NvZGUoZCwgZHMsIGRlLCAiV1NBRU5PQlVGUyIsIFdTQUVOT0JVRlMsICJObyBidWZmZXIgc3BhY2UgYXZhaWxhYmxlIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJXU0FFTk9CVUZTIiwgV1NBRU5PQlVGUywgIk5vIGJ1ZmZlciBzcGFjZSBhdmFpbGFibGUiKTsKICNlbmRpZgogI2lmZGVmIFdTQUVESVNDT04KLQlpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUVESVNDT04iLCBXU0FFRElTQ09OLCAiRXJyb3IgV1NBRURJU0NPTiIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiV1NBRURJU0NPTiIsIFdTQUVESVNDT04sICJFcnJvciBXU0FFRElTQ09OIik7CiAjZW5kaWYKICNpZmRlZiBXU0FFSU5UUgotCWluc2NvZGUoZCwgZHMsIGRlLCAiV1NBRUlOVFIiLCBXU0FFSU5UUiwgIkludGVycnVwdGVkIHN5c3RlbSBjYWxsIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJXU0FFSU5UUiIsIFdTQUVJTlRSLCAiSW50ZXJydXB0ZWQgc3lzdGVtIGNhbGwiKTsKICNlbmRpZgogI2lmZGVmIFdTQUVQUk9UT1RZUEUKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUVQUk9UT1RZUEUiLCBXU0FFUFJPVE9UWVBFLCAiUHJvdG9jb2wgd3JvbmcgdHlwZSBmb3Igc29ja2V0Iik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJXU0FFUFJPVE9UWVBFIiwgV1NBRVBST1RPVFlQRSwgIlByb3RvY29sIHdyb25nIHR5cGUgZm9yIHNvY2tldCIpOwogI2VuZGlmCiAjaWZkZWYgV1NBSE9TCi0JaW5zY29kZShkLCBkcywgZGUsICJXU0FIT1MiLCBXU0FIT1MsICJFcnJvciBXU0FIT1MiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUhPUyIsIFdTQUhPUywgIkVycm9yIFdTQUhPUyIpOwogI2VuZGlmCiAjaWZkZWYgV1NBRUFERFJJTlVTRQotCWluc2NvZGUoZCwgZHMsIGRlLCAiV1NBRUFERFJJTlVTRSIsIFdTQUVBRERSSU5VU0UsICJBZGRyZXNzIGFscmVhZHkgaW4gdXNlIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJXU0FFQUREUklOVVNFIiwgV1NBRUFERFJJTlVTRSwgIkFkZHJlc3MgYWxyZWFkeSBpbiB1c2UiKTsKICNlbmRpZgogI2lmZGVmIFdTQUVBRERSTk9UQVZBSUwKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUVBRERSTk9UQVZBSUwiLCBXU0FFQUREUk5PVEFWQUlMLCAiQ2Fubm90IGFzc2lnbiByZXF1ZXN0ZWQgYWRkcmVzcyIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiV1NBRUFERFJOT1RBVkFJTCIsIFdTQUVBRERSTk9UQVZBSUwsICJDYW5ub3QgYXNzaWduIHJlcXVlc3RlZCBhZGRyZXNzIik7CiAjZW5kaWYKICNpZmRlZiBXU0FFQUxSRUFEWQotCWluc2NvZGUoZCwgZHMsIGRlLCAiV1NBRUFMUkVBRFkiLCBXU0FFQUxSRUFEWSwgIk9wZXJhdGlvbiBhbHJlYWR5IGluIHByb2dyZXNzIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJXU0FFQUxSRUFEWSIsIFdTQUVBTFJFQURZLCAiT3BlcmF0aW9uIGFscmVhZHkgaW4gcHJvZ3Jlc3MiKTsKICNlbmRpZgogI2lmZGVmIFdTQUVQUk9UT05PU1VQUE9SVAotCWluc2NvZGUoZCwgZHMsIGRlLCAiV1NBRVBST1RPTk9TVVBQT1JUIiwgV1NBRVBST1RPTk9TVVBQT1JULCAiUHJvdG9jb2wgbm90IHN1cHBvcnRlZCIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiV1NBRVBST1RPTk9TVVBQT1JUIiwgV1NBRVBST1RPTk9TVVBQT1JULCAiUHJvdG9jb2wgbm90IHN1cHBvcnRlZCIpOwogI2VuZGlmCiAjaWZkZWYgV1NBU1lTTk9UUkVBRFkKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIldTQVNZU05PVFJFQURZIiwgV1NBU1lTTk9UUkVBRFksICJFcnJvciBXU0FTWVNOT1RSRUFEWSIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiV1NBU1lTTk9UUkVBRFkiLCBXU0FTWVNOT1RSRUFEWSwgIkVycm9yIFdTQVNZU05PVFJFQURZIik7CiAjZW5kaWYKICNpZmRlZiBXU0FFV09VTERCTE9DSwotCWluc2NvZGUoZCwgZHMsIGRlLCAiV1NBRVdPVUxEQkxPQ0siLCBXU0FFV09VTERCTE9DSywgIk9wZXJhdGlvbiB3b3VsZCBibG9jayIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiV1NBRVdPVUxEQkxPQ0siLCBXU0FFV09VTERCTE9DSywgIk9wZXJhdGlvbiB3b3VsZCBibG9jayIpOwogI2VuZGlmCiAjaWZkZWYgV1NBRVBGTk9TVVBQT1JUCi0JaW5zY29kZShkLCBkcywgZGUsICJXU0FFUEZOT1NVUFBPUlQiLCBXU0FFUEZOT1NVUFBPUlQsICJQcm90b2NvbCBmYW1pbHkgbm90IHN1cHBvcnRlZCIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiV1NBRVBGTk9TVVBQT1JUIiwgV1NBRVBGTk9TVVBQT1JULCAiUHJvdG9jb2wgZmFtaWx5IG5vdCBzdXBwb3J0ZWQiKTsKICNlbmRpZgogI2lmZGVmIFdTQUVPUE5PVFNVUFAKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUVPUE5PVFNVUFAiLCBXU0FFT1BOT1RTVVBQLCAiT3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWQgb24gdHJhbnNwb3J0IGVuZHBvaW50Iik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJXU0FFT1BOT1RTVVBQIiwgV1NBRU9QTk9UU1VQUCwgIk9wZXJhdGlvbiBub3Qgc3VwcG9ydGVkIG9uIHRyYW5zcG9ydCBlbmRwb2ludCIpOwogI2VuZGlmCiAjaWZkZWYgV1NBRUlTQ09OTgotCWluc2NvZGUoZCwgZHMsIGRlLCAiV1NBRUlTQ09OTiIsIFdTQUVJU0NPTk4sICJUcmFuc3BvcnQgZW5kcG9pbnQgaXMgYWxyZWFkeSBjb25uZWN0ZWQiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUVJU0NPTk4iLCBXU0FFSVNDT05OLCAiVHJhbnNwb3J0IGVuZHBvaW50IGlzIGFscmVhZHkgY29ubmVjdGVkIik7CiAjZW5kaWYKICNpZmRlZiBXU0FFRFFVT1QKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUVEUVVPVCIsIFdTQUVEUVVPVCwgIlF1b3RhIGV4Y2VlZGVkIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJXU0FFRFFVT1QiLCBXU0FFRFFVT1QsICJRdW90YSBleGNlZWRlZCIpOwogI2VuZGlmCiAjaWZkZWYgV1NBRU5PVENPTk4KLQlpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUVOT1RDT05OIiwgV1NBRU5PVENPTk4sICJUcmFuc3BvcnQgZW5kcG9pbnQgaXMgbm90IGNvbm5lY3RlZCIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiV1NBRU5PVENPTk4iLCBXU0FFTk9UQ09OTiwgIlRyYW5zcG9ydCBlbmRwb2ludCBpcyBub3QgY29ubmVjdGVkIik7CiAjZW5kaWYKICNpZmRlZiBXU0FFUkVNT1RFCi0JaW5zY29kZShkLCBkcywgZGUsICJXU0FFUkVNT1RFIiwgV1NBRVJFTU9URSwgIk9iamVjdCBpcyByZW1vdGUiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUVSRU1PVEUiLCBXU0FFUkVNT1RFLCAiT2JqZWN0IGlzIHJlbW90ZSIpOwogI2VuZGlmCiAjaWZkZWYgV1NBRUlOVkFMCi0JaW5zY29kZShkLCBkcywgZGUsICJXU0FFSU5WQUwiLCBXU0FFSU5WQUwsICJJbnZhbGlkIGFyZ3VtZW50Iik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJXU0FFSU5WQUwiLCBXU0FFSU5WQUwsICJJbnZhbGlkIGFyZ3VtZW50Iik7CiAjZW5kaWYKICNpZmRlZiBXU0FFSU5QUk9HUkVTUwotCWluc2NvZGUoZCwgZHMsIGRlLCAiV1NBRUlOUFJPR1JFU1MiLCBXU0FFSU5QUk9HUkVTUywgIk9wZXJhdGlvbiBub3cgaW4gcHJvZ3Jlc3MiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUVJTlBST0dSRVNTIiwgV1NBRUlOUFJPR1JFU1MsICJPcGVyYXRpb24gbm93IGluIHByb2dyZXNzIik7CiAjZW5kaWYKICNpZmRlZiBXU0FHRVRTRUxFQ1RFVkVOCi0JaW5zY29kZShkLCBkcywgZGUsICJXU0FHRVRTRUxFQ1RFVkVOIiwgV1NBR0VUU0VMRUNURVZFTiwgIkVycm9yIFdTQUdFVFNFTEVDVEVWRU4iKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUdFVFNFTEVDVEVWRU4iLCBXU0FHRVRTRUxFQ1RFVkVOLCAiRXJyb3IgV1NBR0VUU0VMRUNURVZFTiIpOwogI2VuZGlmCiAjaWZkZWYgV1NBRVNPQ0tUTk9TVVBQT1JUCi0JaW5zY29kZShkLCBkcywgZGUsICJXU0FFU09DS1ROT1NVUFBPUlQiLCBXU0FFU09DS1ROT1NVUFBPUlQsICJTb2NrZXQgdHlwZSBub3Qgc3VwcG9ydGVkIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJXU0FFU09DS1ROT1NVUFBPUlQiLCBXU0FFU09DS1ROT1NVUFBPUlQsICJTb2NrZXQgdHlwZSBub3Qgc3VwcG9ydGVkIik7CiAjZW5kaWYKICNpZmRlZiBXU0FHRVRBU1lOQ0VSUk8KLQlpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUdFVEFTWU5DRVJSTyIsIFdTQUdFVEFTWU5DRVJSTywgIkVycm9yIFdTQUdFVEFTWU5DRVJSTyIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiV1NBR0VUQVNZTkNFUlJPIiwgV1NBR0VUQVNZTkNFUlJPLCAiRXJyb3IgV1NBR0VUQVNZTkNFUlJPIik7CiAjZW5kaWYKICNpZmRlZiBXU0FNQUtFU0VMRUNUUkVQTAotCWluc2NvZGUoZCwgZHMsIGRlLCAiV1NBTUFLRVNFTEVDVFJFUEwiLCBXU0FNQUtFU0VMRUNUUkVQTCwgIkVycm9yIFdTQU1BS0VTRUxFQ1RSRVBMIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJXU0FNQUtFU0VMRUNUUkVQTCIsIFdTQU1BS0VTRUxFQ1RSRVBMLCAiRXJyb3IgV1NBTUFLRVNFTEVDVFJFUEwiKTsKICNlbmRpZgogI2lmZGVmIFdTQUdFVEFTWU5DQlVGTEUKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUdFVEFTWU5DQlVGTEUiLCBXU0FHRVRBU1lOQ0JVRkxFLCAiRXJyb3IgV1NBR0VUQVNZTkNCVUZMRSIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiV1NBR0VUQVNZTkNCVUZMRSIsIFdTQUdFVEFTWU5DQlVGTEUsICJFcnJvciBXU0FHRVRBU1lOQ0JVRkxFIik7CiAjZW5kaWYKICNpZmRlZiBXU0FFREVTVEFERFJSRVEKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUVERVNUQUREUlJFUSIsIFdTQUVERVNUQUREUlJFUSwgIkRlc3RpbmF0aW9uIGFkZHJlc3MgcmVxdWlyZWQiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUVERVNUQUREUlJFUSIsIFdTQUVERVNUQUREUlJFUSwgIkRlc3RpbmF0aW9uIGFkZHJlc3MgcmVxdWlyZWQiKTsKICNlbmRpZgogI2lmZGVmIFdTQUVDT05OUkVGVVNFRAotCWluc2NvZGUoZCwgZHMsIGRlLCAiV1NBRUNPTk5SRUZVU0VEIiwgV1NBRUNPTk5SRUZVU0VELCAiQ29ubmVjdGlvbiByZWZ1c2VkIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJXU0FFQ09OTlJFRlVTRUQiLCBXU0FFQ09OTlJFRlVTRUQsICJDb25uZWN0aW9uIHJlZnVzZWQiKTsKICNlbmRpZgogI2lmZGVmIFdTQUVORVRSRVNFVAotCWluc2NvZGUoZCwgZHMsIGRlLCAiV1NBRU5FVFJFU0VUIiwgV1NBRU5FVFJFU0VULCAiTmV0d29yayBkcm9wcGVkIGNvbm5lY3Rpb24gYmVjYXVzZSBvZiByZXNldCIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiV1NBRU5FVFJFU0VUIiwgV1NBRU5FVFJFU0VULCAiTmV0d29yayBkcm9wcGVkIGNvbm5lY3Rpb24gYmVjYXVzZSBvZiByZXNldCIpOwogI2VuZGlmCiAjaWZkZWYgV1NBTgotCWluc2NvZGUoZCwgZHMsIGRlLCAiV1NBTiIsIFdTQU4sICJFcnJvciBXU0FOIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJXU0FOIiwgV1NBTiwgIkVycm9yIFdTQU4iKTsKICNlbmRpZgogCi0JUHlfREVDUkVGKGRlKTsKKyAgICBQeV9ERUNSRUYoZGUpOwogfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9mY250bG1vZHVsZS5jIGIvTW9kdWxlcy9mY250bG1vZHVsZS5jCmluZGV4IGEzMzNhMzQuLjYzZDA2ZDMgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvZmNudGxtb2R1bGUuYworKysgYi9Nb2R1bGVzL2ZjbnRsbW9kdWxlLmMKQEAgLTIxLDcgKzIxLDcgQEAKICAgICBpbnQgZmQgPSBQeU9iamVjdF9Bc0ZpbGVEZXNjcmlwdG9yKG9iamVjdCk7CiAKICAgICBpZiAoZmQgPCAwKQotICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKICAgICAqdGFyZ2V0ID0gZmQ7CiAgICAgcmV0dXJuIDE7CiB9CkBAIC0zMiw0OCArMzIsNDggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBmY250bF9mY250bChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IGZkOwotCWludCBjb2RlOwotCWxvbmcgYXJnOwotCWludCByZXQ7Ci0JY2hhciAqc3RyOwotCVB5X3NzaXplX3QgbGVuOwotCWNoYXIgYnVmWzEwMjRdOworICAgIGludCBmZDsKKyAgICBpbnQgY29kZTsKKyAgICBsb25nIGFyZzsKKyAgICBpbnQgcmV0OworICAgIGNoYXIgKnN0cjsKKyAgICBQeV9zc2l6ZV90IGxlbjsKKyAgICBjaGFyIGJ1ZlsxMDI0XTsKIAotCWlmIChQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJmlzIzpmY250bCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZfZGVzY3JpcHRvciwgJmZkLCAmY29kZSwgJnN0ciwgJmxlbikpIHsKLQkJaWYgKGxlbiA+IHNpemVvZiBidWYpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCQkiZmNudGwgc3RyaW5nIGFyZyB0b28gbG9uZyIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJbWVtY3B5KGJ1Ziwgc3RyLCBsZW4pOwotCQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JCXJldCA9IGZjbnRsKGZkLCBjb2RlLCBidWYpOwotCQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCQlpZiAocmV0IDwgMCkgewotCQkJUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGJ1ZiwgbGVuKTsKLQl9CisgICAgaWYgKFB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8maXMjOmZjbnRsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb252X2Rlc2NyaXB0b3IsICZmZCwgJmNvZGUsICZzdHIsICZsZW4pKSB7CisgICAgICAgIGlmIChsZW4gPiBzaXplb2YgYnVmKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmNudGwgc3RyaW5nIGFyZyB0b28gbG9uZyIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgbWVtY3B5KGJ1Ziwgc3RyLCBsZW4pOworICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgICAgIHJldCA9IGZjbnRsKGZkLCBjb2RlLCBidWYpOworICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGJ1ZiwgbGVuKTsKKyAgICB9CiAKLQlQeUVycl9DbGVhcigpOwotCWFyZyA9IDA7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsCi0gICAgICAgICAgICAgIk8maXxsO2ZjbnRsIHJlcXVpcmVzIGEgZmlsZSBvciBmaWxlIGRlc2NyaXB0b3IsIgotICAgICAgICAgICAgICIgYW4gaW50ZWdlciBhbmQgb3B0aW9uYWxseSBhIHRoaXJkIGludGVnZXIgb3IgYSBzdHJpbmciLCAKLQkJCSAgICAgIGNvbnZfZGVzY3JpcHRvciwgJmZkLCAmY29kZSwgJmFyZykpIHsKLQkgIHJldHVybiBOVUxMOwotCX0KLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JcmV0ID0gZmNudGwoZmQsIGNvZGUsIGFyZyk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQlpZiAocmV0IDwgMCkgewotCQlQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpcmV0KTsKKyAgICBQeUVycl9DbGVhcigpOworICAgIGFyZyA9IDA7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsCisgICAgICAgICAiTyZpfGw7ZmNudGwgcmVxdWlyZXMgYSBmaWxlIG9yIGZpbGUgZGVzY3JpcHRvciwiCisgICAgICAgICAiIGFuIGludGVnZXIgYW5kIG9wdGlvbmFsbHkgYSB0aGlyZCBpbnRlZ2VyIG9yIGEgc3RyaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29udl9kZXNjcmlwdG9yLCAmZmQsICZjb2RlLCAmYXJnKSkgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICByZXQgPSBmY250bChmZCwgY29kZSwgYXJnKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZylyZXQpOwogfQogCiBQeURvY19TVFJWQVIoZmNudGxfZG9jLApAQCAtOTYsMTE4ICs5NiwxMTggQEAKIGZjbnRsX2lvY3RsKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKICNkZWZpbmUgSU9DVExfQlVGU1ogMTAyNAotCWludCBmZDsKLQkvKiBJbiBQeUFyZ19QYXJzZVR1cGxlIGJlbG93LCB3ZSB1c2UgdGhlIHVuc2lnbmVkIG5vbi1jaGVja2VkICdJJwotCSAgIGZvcm1hdCBmb3IgdGhlICdjb2RlJyBwYXJhbWV0ZXIgYmVjYXVzZSBQeXRob24gdHVybnMgMHg4MDAwMDAwCi0JICAgaW50byBlaXRoZXIgYSBsYXJnZSBwb3NpdGl2ZSBudW1iZXIgKFB5TG9uZyBvciBQeUludCBvbiA2NC1iaXQKLQkgICBwbGF0Zm9ybXMpIG9yIGEgbmVnYXRpdmUgbnVtYmVyIG9uIG90aGVycyAoMzItYml0IFB5SW50KQotCSAgIHdoZXJlYXMgdGhlIHN5c3RlbSBleHBlY3RzIGl0IHRvIGJlIGEgMzJiaXQgYml0IGZpZWxkIHZhbHVlCi0JICAgcmVnYXJkbGVzcyBvZiBpdCBiZWluZyBwYXNzZWQgYXMgYW4gaW50IG9yIHVuc2lnbmVkIGxvbmcgb24KLQkgICB2YXJpb3VzIHBsYXRmb3Jtcy4gIFNlZSB0aGUgdGVybWlvcy5USU9DU1dJTlNaIGNvbnN0YW50IGFjcm9zcwotCSAgIHBsYXRmb3JtcyBmb3IgYW4gZXhhbXBsZSBvZiB0aGlzZS4KKyAgICBpbnQgZmQ7CisgICAgLyogSW4gUHlBcmdfUGFyc2VUdXBsZSBiZWxvdywgd2UgdXNlIHRoZSB1bnNpZ25lZCBub24tY2hlY2tlZCAnSScKKyAgICAgICBmb3JtYXQgZm9yIHRoZSAnY29kZScgcGFyYW1ldGVyIGJlY2F1c2UgUHl0aG9uIHR1cm5zIDB4ODAwMDAwMAorICAgICAgIGludG8gZWl0aGVyIGEgbGFyZ2UgcG9zaXRpdmUgbnVtYmVyIChQeUxvbmcgb3IgUHlJbnQgb24gNjQtYml0CisgICAgICAgcGxhdGZvcm1zKSBvciBhIG5lZ2F0aXZlIG51bWJlciBvbiBvdGhlcnMgKDMyLWJpdCBQeUludCkKKyAgICAgICB3aGVyZWFzIHRoZSBzeXN0ZW0gZXhwZWN0cyBpdCB0byBiZSBhIDMyYml0IGJpdCBmaWVsZCB2YWx1ZQorICAgICAgIHJlZ2FyZGxlc3Mgb2YgaXQgYmVpbmcgcGFzc2VkIGFzIGFuIGludCBvciB1bnNpZ25lZCBsb25nIG9uCisgICAgICAgdmFyaW91cyBwbGF0Zm9ybXMuICBTZWUgdGhlIHRlcm1pb3MuVElPQ1NXSU5TWiBjb25zdGFudCBhY3Jvc3MKKyAgICAgICBwbGF0Zm9ybXMgZm9yIGFuIGV4YW1wbGUgb2YgdGhpc2UuCiAKLQkgICBJZiBhbnkgb2YgdGhlIDY0Yml0IHBsYXRmb3JtcyBldmVyIGRlY2lkZSB0byB1c2UgbW9yZSB0aGFuIDMyYml0cwotCSAgIGluIHRoZWlyIHVuc2lnbmVkIGxvbmcgaW9jdGwgY29kZXMgdGhpcyB3aWxsIGJyZWFrIGFuZCBuZWVkCi0JICAgc3BlY2lhbCBjYXNpbmcgYmFzZWQgb24gdGhlIHBsYXRmb3JtIGJlaW5nIGJ1aWx0IG9uLgotCSAqLwotCXVuc2lnbmVkIGludCBjb2RlOwotCWludCBhcmc7Ci0JaW50IHJldDsKLQljaGFyICpzdHI7Ci0JUHlfc3NpemVfdCBsZW47Ci0JaW50IG11dGF0ZV9hcmcgPSAxOwotIAljaGFyIGJ1ZltJT0NUTF9CVUZTWisxXTsgIC8qIGFyZ3VtZW50IHBsdXMgTlVMIGJ5dGUgKi8KKyAgICAgICBJZiBhbnkgb2YgdGhlIDY0Yml0IHBsYXRmb3JtcyBldmVyIGRlY2lkZSB0byB1c2UgbW9yZSB0aGFuIDMyYml0cworICAgICAgIGluIHRoZWlyIHVuc2lnbmVkIGxvbmcgaW9jdGwgY29kZXMgdGhpcyB3aWxsIGJyZWFrIGFuZCBuZWVkCisgICAgICAgc3BlY2lhbCBjYXNpbmcgYmFzZWQgb24gdGhlIHBsYXRmb3JtIGJlaW5nIGJ1aWx0IG9uLgorICAgICAqLworICAgIHVuc2lnbmVkIGludCBjb2RlOworICAgIGludCBhcmc7CisgICAgaW50IHJldDsKKyAgICBjaGFyICpzdHI7CisgICAgUHlfc3NpemVfdCBsZW47CisgICAgaW50IG11dGF0ZV9hcmcgPSAxOworICAgIGNoYXIgYnVmW0lPQ1RMX0JVRlNaKzFdOyAgLyogYXJndW1lbnQgcGx1cyBOVUwgYnl0ZSAqLwogCi0JaWYgKFB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mSXcjfGk6aW9jdGwiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252X2Rlc2NyaXB0b3IsICZmZCwgJmNvZGUsIAotCQkJICAgICAmc3RyLCAmbGVuLCAmbXV0YXRlX2FyZykpIHsKLQkJY2hhciAqYXJnOworICAgIGlmIChQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJkl3I3xpOmlvY3RsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb252X2Rlc2NyaXB0b3IsICZmZCwgJmNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgJnN0ciwgJmxlbiwgJm11dGF0ZV9hcmcpKSB7CisgICAgICAgIGNoYXIgKmFyZzsKIAotCSAgICAgICAJaWYgKG11dGF0ZV9hcmcpIHsKLQkJCWlmIChsZW4gPD0gSU9DVExfQlVGU1opIHsKLQkJCQltZW1jcHkoYnVmLCBzdHIsIGxlbik7Ci0JCQkJYnVmW2xlbl0gPSAnXDAnOwotCQkJCWFyZyA9IGJ1ZjsKLQkJCX0gCi0JCQllbHNlIHsKLQkJCQlhcmcgPSBzdHI7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAobGVuID4gSU9DVExfQlVGU1opIHsKLQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkJImlvY3RsIHN0cmluZyBhcmcgdG9vIGxvbmciKTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJCWVsc2UgewotCQkJCW1lbWNweShidWYsIHN0ciwgbGVuKTsKLQkJCQlidWZbbGVuXSA9ICdcMCc7Ci0JCQkJYXJnID0gYnVmOwotCQkJfQotCQl9Ci0JCWlmIChidWYgPT0gYXJnKSB7Ci0JCQlQeV9CRUdJTl9BTExPV19USFJFQURTIC8qIHRoaW5rIGFycmF5LnJlc2l6ZSgpICovCi0JCQlyZXQgPSBpb2N0bChmZCwgY29kZSwgYXJnKTsKLQkJCVB5X0VORF9BTExPV19USFJFQURTCi0JCX0KLQkJZWxzZSB7Ci0JCQlyZXQgPSBpb2N0bChmZCwgY29kZSwgYXJnKTsKLQkJfQotCQlpZiAobXV0YXRlX2FyZyAmJiAobGVuIDwgSU9DVExfQlVGU1opKSB7Ci0JCQltZW1jcHkoc3RyLCBidWYsIGxlbik7Ci0JCX0KLQkJaWYgKHJldCA8IDApIHsKLQkJCVB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWlmIChtdXRhdGVfYXJnKSB7Ci0JCQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcocmV0KTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShidWYsIGxlbik7Ci0JCX0KLQl9CisgICAgICAgIGlmIChtdXRhdGVfYXJnKSB7CisgICAgICAgICAgICBpZiAobGVuIDw9IElPQ1RMX0JVRlNaKSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KGJ1Ziwgc3RyLCBsZW4pOworICAgICAgICAgICAgICAgIGJ1ZltsZW5dID0gJ1wwJzsKKyAgICAgICAgICAgICAgICBhcmcgPSBidWY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBhcmcgPSBzdHI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAobGVuID4gSU9DVExfQlVGU1opIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgImlvY3RsIHN0cmluZyBhcmcgdG9vIGxvbmciKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIG1lbWNweShidWYsIHN0ciwgbGVuKTsKKyAgICAgICAgICAgICAgICBidWZbbGVuXSA9ICdcMCc7CisgICAgICAgICAgICAgICAgYXJnID0gYnVmOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChidWYgPT0gYXJnKSB7CisgICAgICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTIC8qIHRoaW5rIGFycmF5LnJlc2l6ZSgpICovCisgICAgICAgICAgICByZXQgPSBpb2N0bChmZCwgY29kZSwgYXJnKTsKKyAgICAgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICByZXQgPSBpb2N0bChmZCwgY29kZSwgYXJnKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobXV0YXRlX2FyZyAmJiAobGVuIDwgSU9DVExfQlVGU1opKSB7CisgICAgICAgICAgICBtZW1jcHkoc3RyLCBidWYsIGxlbik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGlmIChtdXRhdGVfYXJnKSB7CisgICAgICAgICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcocmV0KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShidWYsIGxlbik7CisgICAgICAgIH0KKyAgICB9CiAKLQlQeUVycl9DbGVhcigpOwotCWlmIChQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJklzIzppb2N0bCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZfZGVzY3JpcHRvciwgJmZkLCAmY29kZSwgJnN0ciwgJmxlbikpIHsKLQkJaWYgKGxlbiA+IElPQ1RMX0JVRlNaKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkJImlvY3RsIHN0cmluZyBhcmcgdG9vIGxvbmciKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCW1lbWNweShidWYsIHN0ciwgbGVuKTsKLQkJYnVmW2xlbl0gPSAnXDAnOwotCQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JCXJldCA9IGlvY3RsKGZkLCBjb2RlLCBidWYpOwotCQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCQlpZiAocmV0IDwgMCkgewotCQkJUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGJ1ZiwgbGVuKTsKLQl9CisgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICBpZiAoUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyZJcyM6aW9jdGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZfZGVzY3JpcHRvciwgJmZkLCAmY29kZSwgJnN0ciwgJmxlbikpIHsKKyAgICAgICAgaWYgKGxlbiA+IElPQ1RMX0JVRlNaKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW9jdGwgc3RyaW5nIGFyZyB0b28gbG9uZyIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgbWVtY3B5KGJ1Ziwgc3RyLCBsZW4pOworICAgICAgICBidWZbbGVuXSA9ICdcMCc7CisgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgcmV0ID0gaW9jdGwoZmQsIGNvZGUsIGJ1Zik7CisgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoYnVmLCBsZW4pOworICAgIH0KIAotCVB5RXJyX0NsZWFyKCk7Ci0JYXJnID0gMDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywKLQkgICAgICJPJkl8aTtpb2N0bCByZXF1aXJlcyBhIGZpbGUgb3IgZmlsZSBkZXNjcmlwdG9yLCIKLQkgICAgICIgYW4gaW50ZWdlciBhbmQgb3B0aW9uYWxseSBhbiBpbnRlZ2VyIG9yIGJ1ZmZlciBhcmd1bWVudCIsCi0JCQkgICAgICBjb252X2Rlc2NyaXB0b3IsICZmZCwgJmNvZGUsICZhcmcpKSB7Ci0JICByZXR1cm4gTlVMTDsKLQl9Ci0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIFB5RXJyX0NsZWFyKCk7CisgICAgYXJnID0gMDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywKKyAgICAgICAgICJPJkl8aTtpb2N0bCByZXF1aXJlcyBhIGZpbGUgb3IgZmlsZSBkZXNjcmlwdG9yLCIKKyAgICAgICAgICIgYW4gaW50ZWdlciBhbmQgb3B0aW9uYWxseSBhbiBpbnRlZ2VyIG9yIGJ1ZmZlciBhcmd1bWVudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZfZGVzY3JpcHRvciwgJmZkLCAmY29kZSwgJmFyZykpIHsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCiAjaWZkZWYgX19WTVMKLQlyZXQgPSBpb2N0bChmZCwgY29kZSwgKHZvaWQgKilhcmcpOworICAgIHJldCA9IGlvY3RsKGZkLCBjb2RlLCAodm9pZCAqKWFyZyk7CiAjZWxzZQotCXJldCA9IGlvY3RsKGZkLCBjb2RlLCBhcmcpOworICAgIHJldCA9IGlvY3RsKGZkLCBjb2RlLCBhcmcpOwogI2VuZGlmCi0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQlpZiAocmV0IDwgMCkgewotCQlQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpcmV0KTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZylyZXQpOwogI3VuZGVmIElPQ1RMX0JVRlNaCiB9CiAKQEAgLTI0OCw1MSArMjQ4LDUxIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZmNudGxfZmxvY2soUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBmZDsKLQlpbnQgY29kZTsKLQlpbnQgcmV0OworICAgIGludCBmZDsKKyAgICBpbnQgY29kZTsKKyAgICBpbnQgcmV0OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJmk6ZmxvY2siLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udl9kZXNjcmlwdG9yLCAmZmQsICZjb2RlKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJmk6ZmxvY2siLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb252X2Rlc2NyaXB0b3IsICZmZCwgJmNvZGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAogI2lmZGVmIEhBVkVfRkxPQ0sKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JcmV0ID0gZmxvY2soZmQsIGNvZGUpOwotCVB5X0VORF9BTExPV19USFJFQURTCisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIHJldCA9IGZsb2NrKGZkLCBjb2RlKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogI2Vsc2UKIAogI2lmbmRlZiBMT0NLX1NICi0jZGVmaW5lIExPQ0tfU0gJCTEJLyogc2hhcmVkIGxvY2sgKi8KLSNkZWZpbmUgTE9DS19FWAkJMgkvKiBleGNsdXNpdmUgbG9jayAqLwotI2RlZmluZSBMT0NLX05CCQk0CS8qIGRvbid0IGJsb2NrIHdoZW4gbG9ja2luZyAqLwotI2RlZmluZSBMT0NLX1VOCQk4CS8qIHVubG9jayAqLworI2RlZmluZSBMT0NLX1NIICAgICAgICAgMSAgICAgICAvKiBzaGFyZWQgbG9jayAqLworI2RlZmluZSBMT0NLX0VYICAgICAgICAgMiAgICAgICAvKiBleGNsdXNpdmUgbG9jayAqLworI2RlZmluZSBMT0NLX05CICAgICAgICAgNCAgICAgICAvKiBkb24ndCBibG9jayB3aGVuIGxvY2tpbmcgKi8KKyNkZWZpbmUgTE9DS19VTiAgICAgICAgIDggICAgICAgLyogdW5sb2NrICovCiAjZW5kaWYKLQl7Ci0JCXN0cnVjdCBmbG9jayBsOwotCQlpZiAoY29kZSA9PSBMT0NLX1VOKQotCQkJbC5sX3R5cGUgPSBGX1VOTENLOwotCQllbHNlIGlmIChjb2RlICYgTE9DS19TSCkKLQkJCWwubF90eXBlID0gRl9SRExDSzsKLQkJZWxzZSBpZiAoY29kZSAmIExPQ0tfRVgpCi0JCQlsLmxfdHlwZSA9IEZfV1JMQ0s7Ci0JCWVsc2UgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJCSJ1bnJlY29nbml6ZWQgZmxvY2sgYXJndW1lbnQiKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWwubF93aGVuY2UgPSBsLmxfc3RhcnQgPSBsLmxfbGVuID0gMDsKLQkJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCQlyZXQgPSBmY250bChmZCwgKGNvZGUgJiBMT0NLX05CKSA/IEZfU0VUTEsgOiBGX1NFVExLVywgJmwpOwotCQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCX0KKyAgICB7CisgICAgICAgIHN0cnVjdCBmbG9jayBsOworICAgICAgICBpZiAoY29kZSA9PSBMT0NLX1VOKQorICAgICAgICAgICAgbC5sX3R5cGUgPSBGX1VOTENLOworICAgICAgICBlbHNlIGlmIChjb2RlICYgTE9DS19TSCkKKyAgICAgICAgICAgIGwubF90eXBlID0gRl9SRExDSzsKKyAgICAgICAgZWxzZSBpZiAoY29kZSAmIExPQ0tfRVgpCisgICAgICAgICAgICBsLmxfdHlwZSA9IEZfV1JMQ0s7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVucmVjb2duaXplZCBmbG9jayBhcmd1bWVudCIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgbC5sX3doZW5jZSA9IGwubF9zdGFydCA9IGwubF9sZW4gPSAwOworICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgICAgIHJldCA9IGZjbnRsKGZkLCAoY29kZSAmIExPQ0tfTkIpID8gRl9TRVRMSyA6IEZfU0VUTEtXLCAmbCk7CisgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgfQogI2VuZGlmIC8qIEhBVkVfRkxPQ0sgKi8KLQlpZiAocmV0IDwgMCkgewotCQlQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBQeURvY19TVFJWQVIoZmxvY2tfZG9jLApAQCAtMzA3LDcyICszMDcsNzIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBmY250bF9sb2NrZihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IGZkLCBjb2RlLCByZXQsIHdoZW5jZSA9IDA7Ci0JUHlPYmplY3QgKmxlbm9iaiA9IE5VTEwsICpzdGFydG9iaiA9IE5VTEw7CisgICAgaW50IGZkLCBjb2RlLCByZXQsIHdoZW5jZSA9IDA7CisgICAgUHlPYmplY3QgKmxlbm9iaiA9IE5VTEwsICpzdGFydG9iaiA9IE5VTEw7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8maXxPT2k6bG9ja2YiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udl9kZXNjcmlwdG9yLCAmZmQsICZjb2RlLAotCQkJICAgICAgJmxlbm9iaiwgJnN0YXJ0b2JqLCAmd2hlbmNlKSkKLQkgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJml8T09pOmxvY2tmIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29udl9kZXNjcmlwdG9yLCAmZmQsICZjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbGVub2JqLCAmc3RhcnRvYmosICZ3aGVuY2UpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAogI2lmIGRlZmluZWQoUFlPU19PUzIpICYmIGRlZmluZWQoUFlDQ19HQ0MpCi0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsCi0JCQkibG9ja2Ygbm90IHN1cHBvcnRlZCBvbiBPUy8yIChFTVgpIik7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICJsb2NrZiBub3Qgc3VwcG9ydGVkIG9uIE9TLzIgKEVNWCkiKTsKKyAgICByZXR1cm4gTlVMTDsKICNlbHNlCiAjaWZuZGVmIExPQ0tfU0gKLSNkZWZpbmUgTE9DS19TSAkJMQkvKiBzaGFyZWQgbG9jayAqLwotI2RlZmluZSBMT0NLX0VYCQkyCS8qIGV4Y2x1c2l2ZSBsb2NrICovCi0jZGVmaW5lIExPQ0tfTkIJCTQJLyogZG9uJ3QgYmxvY2sgd2hlbiBsb2NraW5nICovCi0jZGVmaW5lIExPQ0tfVU4JCTgJLyogdW5sb2NrICovCisjZGVmaW5lIExPQ0tfU0ggICAgICAgICAxICAgICAgIC8qIHNoYXJlZCBsb2NrICovCisjZGVmaW5lIExPQ0tfRVggICAgICAgICAyICAgICAgIC8qIGV4Y2x1c2l2ZSBsb2NrICovCisjZGVmaW5lIExPQ0tfTkIgICAgICAgICA0ICAgICAgIC8qIGRvbid0IGJsb2NrIHdoZW4gbG9ja2luZyAqLworI2RlZmluZSBMT0NLX1VOICAgICAgICAgOCAgICAgICAvKiB1bmxvY2sgKi8KICNlbmRpZiAgLyogTE9DS19TSCAqLwotCXsKLQkJc3RydWN0IGZsb2NrIGw7Ci0JCWlmIChjb2RlID09IExPQ0tfVU4pCi0JCQlsLmxfdHlwZSA9IEZfVU5MQ0s7Ci0JCWVsc2UgaWYgKGNvZGUgJiBMT0NLX1NIKQotCQkJbC5sX3R5cGUgPSBGX1JETENLOwotCQllbHNlIGlmIChjb2RlICYgTE9DS19FWCkKLQkJCWwubF90eXBlID0gRl9XUkxDSzsKLQkJZWxzZSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkJInVucmVjb2duaXplZCBsb2NrZiBhcmd1bWVudCIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJbC5sX3N0YXJ0ID0gbC5sX2xlbiA9IDA7Ci0JCWlmIChzdGFydG9iaiAhPSBOVUxMKSB7CisgICAgeworICAgICAgICBzdHJ1Y3QgZmxvY2sgbDsKKyAgICAgICAgaWYgKGNvZGUgPT0gTE9DS19VTikKKyAgICAgICAgICAgIGwubF90eXBlID0gRl9VTkxDSzsKKyAgICAgICAgZWxzZSBpZiAoY29kZSAmIExPQ0tfU0gpCisgICAgICAgICAgICBsLmxfdHlwZSA9IEZfUkRMQ0s7CisgICAgICAgIGVsc2UgaWYgKGNvZGUgJiBMT0NLX0VYKQorICAgICAgICAgICAgbC5sX3R5cGUgPSBGX1dSTENLOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bnJlY29nbml6ZWQgbG9ja2YgYXJndW1lbnQiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGwubF9zdGFydCA9IGwubF9sZW4gPSAwOworICAgICAgICBpZiAoc3RhcnRvYmogIT0gTlVMTCkgewogI2lmICFkZWZpbmVkKEhBVkVfTEFSR0VGSUxFX1NVUFBPUlQpCi0JCQlsLmxfc3RhcnQgPSBQeUludF9Bc0xvbmcoc3RhcnRvYmopOworICAgICAgICAgICAgbC5sX3N0YXJ0ID0gUHlJbnRfQXNMb25nKHN0YXJ0b2JqKTsKICNlbHNlCi0JCQlsLmxfc3RhcnQgPSBQeUxvbmdfQ2hlY2soc3RhcnRvYmopID8KLQkJCQkJUHlMb25nX0FzTG9uZ0xvbmcoc3RhcnRvYmopIDoKLQkJCQkJUHlJbnRfQXNMb25nKHN0YXJ0b2JqKTsKKyAgICAgICAgICAgIGwubF9zdGFydCA9IFB5TG9uZ19DaGVjayhzdGFydG9iaikgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TG9uZ19Bc0xvbmdMb25nKHN0YXJ0b2JqKSA6CisgICAgICAgICAgICAgICAgICAgIFB5SW50X0FzTG9uZyhzdGFydG9iaik7CiAjZW5kaWYKLQkJCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWlmIChsZW5vYmogIT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGxlbm9iaiAhPSBOVUxMKSB7CiAjaWYgIWRlZmluZWQoSEFWRV9MQVJHRUZJTEVfU1VQUE9SVCkKLQkJCWwubF9sZW4gPSBQeUludF9Bc0xvbmcobGVub2JqKTsKKyAgICAgICAgICAgIGwubF9sZW4gPSBQeUludF9Bc0xvbmcobGVub2JqKTsKICNlbHNlCi0JCQlsLmxfbGVuID0gUHlMb25nX0NoZWNrKGxlbm9iaikgPwotCQkJCQlQeUxvbmdfQXNMb25nTG9uZyhsZW5vYmopIDoKLQkJCQkJUHlJbnRfQXNMb25nKGxlbm9iaik7CisgICAgICAgICAgICBsLmxfbGVuID0gUHlMb25nX0NoZWNrKGxlbm9iaikgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TG9uZ19Bc0xvbmdMb25nKGxlbm9iaikgOgorICAgICAgICAgICAgICAgICAgICBQeUludF9Bc0xvbmcobGVub2JqKTsKICNlbmRpZgotCQkJaWYgKFB5RXJyX09jY3VycmVkKCkpCi0JCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJbC5sX3doZW5jZSA9IHdoZW5jZTsKLQkJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCQlyZXQgPSBmY250bChmZCwgKGNvZGUgJiBMT0NLX05CKSA/IEZfU0VUTEsgOiBGX1NFVExLVywgJmwpOwotCQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCX0KLQlpZiAocmV0IDwgMCkgewotCQlQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBsLmxfd2hlbmNlID0gd2hlbmNlOworICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgICAgIHJldCA9IGZjbnRsKGZkLCAoY29kZSAmIExPQ0tfTkIpID8gRl9TRVRMSyA6IEZfU0VUTEtXLCAmbCk7CisgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgfQorICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKICNlbmRpZiAgLyogZGVmaW5lZChQWU9TX09TMikgJiYgZGVmaW5lZChQWUNDX0dDQykgKi8KIH0KIApAQCAtNDA0LDExICs0MDQsMTEgQEAKIC8qIExpc3Qgb2YgZnVuY3Rpb25zICovCiAKIHN0YXRpYyBQeU1ldGhvZERlZiBmY250bF9tZXRob2RzW10gPSB7Ci0JeyJmY250bCIsCWZjbnRsX2ZjbnRsLCBNRVRIX1ZBUkFSR1MsIGZjbnRsX2RvY30sCi0JeyJpb2N0bCIsCWZjbnRsX2lvY3RsLCBNRVRIX1ZBUkFSR1MsIGlvY3RsX2RvY30sCi0JeyJmbG9jayIsCWZjbnRsX2Zsb2NrLCBNRVRIX1ZBUkFSR1MsIGZsb2NrX2RvY30sCi0JeyJsb2NrZiIsICAgICAgIGZjbnRsX2xvY2tmLCBNRVRIX1ZBUkFSR1MsIGxvY2tmX2RvY30sCi0Je05VTEwsCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7ImZjbnRsIiwgICAgICAgICAgIGZjbnRsX2ZjbnRsLCBNRVRIX1ZBUkFSR1MsIGZjbnRsX2RvY30sCisgICAgeyJpb2N0bCIsICAgICAgICAgICBmY250bF9pb2N0bCwgTUVUSF9WQVJBUkdTLCBpb2N0bF9kb2N9LAorICAgIHsiZmxvY2siLCAgICAgICAgICAgZmNudGxfZmxvY2ssIE1FVEhfVkFSQVJHUywgZmxvY2tfZG9jfSwKKyAgICB7ImxvY2tmIiwgICAgICAgZmNudGxfbG9ja2YsIE1FVEhfVkFSQVJHUywgbG9ja2ZfZG9jfSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogCkBAIC00MjMsMTIgKzQyMywxMiBAQAogc3RhdGljIGludAogaW5zKFB5T2JqZWN0KiBkLCBjaGFyKiBzeW1ib2wsIGxvbmcgdmFsdWUpCiB7Ci0gICAgICAgIFB5T2JqZWN0KiB2ID0gUHlJbnRfRnJvbUxvbmcodmFsdWUpOwotICAgICAgICBpZiAoIXYgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgc3ltYm9sLCB2KSA8IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIFB5T2JqZWN0KiB2ID0gUHlJbnRfRnJvbUxvbmcodmFsdWUpOworICAgIGlmICghdiB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCBzeW1ib2wsIHYpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0gICAgICAgIFB5X0RFQ1JFRih2KTsKLSAgICAgICAgcmV0dXJuIDA7CisgICAgUHlfREVDUkVGKHYpOworICAgIHJldHVybiAwOwogfQogCiAjZGVmaW5lIElOUyh4KSBpZiAoaW5zKGQsICN4LCAobG9uZyl4KSkgcmV0dXJuIC0xCkBAIC00MzYsMTg1ICs0MzYsMTg1IEBACiBzdGF0aWMgaW50CiBhbGxfaW5zKFB5T2JqZWN0KiBkKQogewotICAgICAgICBpZiAoaW5zKGQsICJMT0NLX1NIIiwgKGxvbmcpTE9DS19TSCkpIHJldHVybiAtMTsKLSAgICAgICAgaWYgKGlucyhkLCAiTE9DS19FWCIsIChsb25nKUxPQ0tfRVgpKSByZXR1cm4gLTE7Ci0gICAgICAgIGlmIChpbnMoZCwgIkxPQ0tfTkIiLCAobG9uZylMT0NLX05CKSkgcmV0dXJuIC0xOwotICAgICAgICBpZiAoaW5zKGQsICJMT0NLX1VOIiwgKGxvbmcpTE9DS19VTikpIHJldHVybiAtMTsKKyAgICBpZiAoaW5zKGQsICJMT0NLX1NIIiwgKGxvbmcpTE9DS19TSCkpIHJldHVybiAtMTsKKyAgICBpZiAoaW5zKGQsICJMT0NLX0VYIiwgKGxvbmcpTE9DS19FWCkpIHJldHVybiAtMTsKKyAgICBpZiAoaW5zKGQsICJMT0NLX05CIiwgKGxvbmcpTE9DS19OQikpIHJldHVybiAtMTsKKyAgICBpZiAoaW5zKGQsICJMT0NLX1VOIiwgKGxvbmcpTE9DS19VTikpIHJldHVybiAtMTsKIC8qIEdOVSBleHRlbnNpb25zLCBhcyBvZiBnbGliYyAyLjIuNCAqLwogI2lmZGVmIExPQ0tfTUFORAotICAgICAgICBpZiAoaW5zKGQsICJMT0NLX01BTkQiLCAobG9uZylMT0NLX01BTkQpKSByZXR1cm4gLTE7CisgICAgaWYgKGlucyhkLCAiTE9DS19NQU5EIiwgKGxvbmcpTE9DS19NQU5EKSkgcmV0dXJuIC0xOwogI2VuZGlmCiAjaWZkZWYgTE9DS19SRUFECi0gICAgICAgIGlmIChpbnMoZCwgIkxPQ0tfUkVBRCIsIChsb25nKUxPQ0tfUkVBRCkpIHJldHVybiAtMTsKKyAgICBpZiAoaW5zKGQsICJMT0NLX1JFQUQiLCAobG9uZylMT0NLX1JFQUQpKSByZXR1cm4gLTE7CiAjZW5kaWYKICNpZmRlZiBMT0NLX1dSSVRFCi0gICAgICAgIGlmIChpbnMoZCwgIkxPQ0tfV1JJVEUiLCAobG9uZylMT0NLX1dSSVRFKSkgcmV0dXJuIC0xOworICAgIGlmIChpbnMoZCwgIkxPQ0tfV1JJVEUiLCAobG9uZylMT0NLX1dSSVRFKSkgcmV0dXJuIC0xOwogI2VuZGlmCiAjaWZkZWYgTE9DS19SVwotICAgICAgICBpZiAoaW5zKGQsICJMT0NLX1JXIiwgKGxvbmcpTE9DS19SVykpIHJldHVybiAtMTsKKyAgICBpZiAoaW5zKGQsICJMT0NLX1JXIiwgKGxvbmcpTE9DS19SVykpIHJldHVybiAtMTsKICNlbmRpZgogCiAjaWZkZWYgRl9EVVBGRAotICAgICAgICBpZiAoaW5zKGQsICJGX0RVUEZEIiwgKGxvbmcpRl9EVVBGRCkpIHJldHVybiAtMTsKKyAgICBpZiAoaW5zKGQsICJGX0RVUEZEIiwgKGxvbmcpRl9EVVBGRCkpIHJldHVybiAtMTsKICNlbmRpZgogI2lmZGVmIEZfR0VURkQKLSAgICAgICAgaWYgKGlucyhkLCAiRl9HRVRGRCIsIChsb25nKUZfR0VURkQpKSByZXR1cm4gLTE7CisgICAgaWYgKGlucyhkLCAiRl9HRVRGRCIsIChsb25nKUZfR0VURkQpKSByZXR1cm4gLTE7CiAjZW5kaWYKICNpZmRlZiBGX1NFVEZECi0gICAgICAgIGlmIChpbnMoZCwgIkZfU0VURkQiLCAobG9uZylGX1NFVEZEKSkgcmV0dXJuIC0xOworICAgIGlmIChpbnMoZCwgIkZfU0VURkQiLCAobG9uZylGX1NFVEZEKSkgcmV0dXJuIC0xOwogI2VuZGlmCiAjaWZkZWYgRl9HRVRGTAotICAgICAgICBpZiAoaW5zKGQsICJGX0dFVEZMIiwgKGxvbmcpRl9HRVRGTCkpIHJldHVybiAtMTsKKyAgICBpZiAoaW5zKGQsICJGX0dFVEZMIiwgKGxvbmcpRl9HRVRGTCkpIHJldHVybiAtMTsKICNlbmRpZgogI2lmZGVmIEZfU0VURkwKLSAgICAgICAgaWYgKGlucyhkLCAiRl9TRVRGTCIsIChsb25nKUZfU0VURkwpKSByZXR1cm4gLTE7CisgICAgaWYgKGlucyhkLCAiRl9TRVRGTCIsIChsb25nKUZfU0VURkwpKSByZXR1cm4gLTE7CiAjZW5kaWYKICNpZmRlZiBGX0dFVExLCi0gICAgICAgIGlmIChpbnMoZCwgIkZfR0VUTEsiLCAobG9uZylGX0dFVExLKSkgcmV0dXJuIC0xOworICAgIGlmIChpbnMoZCwgIkZfR0VUTEsiLCAobG9uZylGX0dFVExLKSkgcmV0dXJuIC0xOwogI2VuZGlmCiAjaWZkZWYgRl9TRVRMSwotICAgICAgICBpZiAoaW5zKGQsICJGX1NFVExLIiwgKGxvbmcpRl9TRVRMSykpIHJldHVybiAtMTsKKyAgICBpZiAoaW5zKGQsICJGX1NFVExLIiwgKGxvbmcpRl9TRVRMSykpIHJldHVybiAtMTsKICNlbmRpZgogI2lmZGVmIEZfU0VUTEtXCi0gICAgICAgIGlmIChpbnMoZCwgIkZfU0VUTEtXIiwgKGxvbmcpRl9TRVRMS1cpKSByZXR1cm4gLTE7CisgICAgaWYgKGlucyhkLCAiRl9TRVRMS1ciLCAobG9uZylGX1NFVExLVykpIHJldHVybiAtMTsKICNlbmRpZgogI2lmZGVmIEZfR0VUT1dOCi0gICAgICAgIGlmIChpbnMoZCwgIkZfR0VUT1dOIiwgKGxvbmcpRl9HRVRPV04pKSByZXR1cm4gLTE7CisgICAgaWYgKGlucyhkLCAiRl9HRVRPV04iLCAobG9uZylGX0dFVE9XTikpIHJldHVybiAtMTsKICNlbmRpZgogI2lmZGVmIEZfU0VUT1dOCi0gICAgICAgIGlmIChpbnMoZCwgIkZfU0VUT1dOIiwgKGxvbmcpRl9TRVRPV04pKSByZXR1cm4gLTE7CisgICAgaWYgKGlucyhkLCAiRl9TRVRPV04iLCAobG9uZylGX1NFVE9XTikpIHJldHVybiAtMTsKICNlbmRpZgogI2lmZGVmIEZfR0VUU0lHCi0gICAgICAgIGlmIChpbnMoZCwgIkZfR0VUU0lHIiwgKGxvbmcpRl9HRVRTSUcpKSByZXR1cm4gLTE7CisgICAgaWYgKGlucyhkLCAiRl9HRVRTSUciLCAobG9uZylGX0dFVFNJRykpIHJldHVybiAtMTsKICNlbmRpZgogI2lmZGVmIEZfU0VUU0lHCi0gICAgICAgIGlmIChpbnMoZCwgIkZfU0VUU0lHIiwgKGxvbmcpRl9TRVRTSUcpKSByZXR1cm4gLTE7CisgICAgaWYgKGlucyhkLCAiRl9TRVRTSUciLCAobG9uZylGX1NFVFNJRykpIHJldHVybiAtMTsKICNlbmRpZgogI2lmZGVmIEZfUkRMQ0sKLSAgICAgICAgaWYgKGlucyhkLCAiRl9SRExDSyIsIChsb25nKUZfUkRMQ0spKSByZXR1cm4gLTE7CisgICAgaWYgKGlucyhkLCAiRl9SRExDSyIsIChsb25nKUZfUkRMQ0spKSByZXR1cm4gLTE7CiAjZW5kaWYKICNpZmRlZiBGX1dSTENLCi0gICAgICAgIGlmIChpbnMoZCwgIkZfV1JMQ0siLCAobG9uZylGX1dSTENLKSkgcmV0dXJuIC0xOworICAgIGlmIChpbnMoZCwgIkZfV1JMQ0siLCAobG9uZylGX1dSTENLKSkgcmV0dXJuIC0xOwogI2VuZGlmCiAjaWZkZWYgRl9VTkxDSwotICAgICAgICBpZiAoaW5zKGQsICJGX1VOTENLIiwgKGxvbmcpRl9VTkxDSykpIHJldHVybiAtMTsKKyAgICBpZiAoaW5zKGQsICJGX1VOTENLIiwgKGxvbmcpRl9VTkxDSykpIHJldHVybiAtMTsKICNlbmRpZgogLyogTEZTIGNvbnN0YW50cyAqLwogI2lmZGVmIEZfR0VUTEs2NAotICAgICAgICBpZiAoaW5zKGQsICJGX0dFVExLNjQiLCAobG9uZylGX0dFVExLNjQpKSByZXR1cm4gLTE7CisgICAgaWYgKGlucyhkLCAiRl9HRVRMSzY0IiwgKGxvbmcpRl9HRVRMSzY0KSkgcmV0dXJuIC0xOwogI2VuZGlmCiAjaWZkZWYgRl9TRVRMSzY0Ci0gICAgICAgIGlmIChpbnMoZCwgIkZfU0VUTEs2NCIsIChsb25nKUZfU0VUTEs2NCkpIHJldHVybiAtMTsKKyAgICBpZiAoaW5zKGQsICJGX1NFVExLNjQiLCAobG9uZylGX1NFVExLNjQpKSByZXR1cm4gLTE7CiAjZW5kaWYKICNpZmRlZiBGX1NFVExLVzY0Ci0gICAgICAgIGlmIChpbnMoZCwgIkZfU0VUTEtXNjQiLCAobG9uZylGX1NFVExLVzY0KSkgcmV0dXJuIC0xOworICAgIGlmIChpbnMoZCwgIkZfU0VUTEtXNjQiLCAobG9uZylGX1NFVExLVzY0KSkgcmV0dXJuIC0xOwogI2VuZGlmCiAvKiBHTlUgZXh0ZW5zaW9ucywgYXMgb2YgZ2xpYmMgMi4yLjQuICovCiAjaWZkZWYgRkFTWU5DCi0gICAgICAgIGlmIChpbnMoZCwgIkZBU1lOQyIsIChsb25nKUZBU1lOQykpIHJldHVybiAtMTsKKyAgICBpZiAoaW5zKGQsICJGQVNZTkMiLCAobG9uZylGQVNZTkMpKSByZXR1cm4gLTE7CiAjZW5kaWYKICNpZmRlZiBGX1NFVExFQVNFCi0gICAgICAgIGlmIChpbnMoZCwgIkZfU0VUTEVBU0UiLCAobG9uZylGX1NFVExFQVNFKSkgcmV0dXJuIC0xOworICAgIGlmIChpbnMoZCwgIkZfU0VUTEVBU0UiLCAobG9uZylGX1NFVExFQVNFKSkgcmV0dXJuIC0xOwogI2VuZGlmCiAjaWZkZWYgRl9HRVRMRUFTRQotICAgICAgICBpZiAoaW5zKGQsICJGX0dFVExFQVNFIiwgKGxvbmcpRl9HRVRMRUFTRSkpIHJldHVybiAtMTsKKyAgICBpZiAoaW5zKGQsICJGX0dFVExFQVNFIiwgKGxvbmcpRl9HRVRMRUFTRSkpIHJldHVybiAtMTsKICNlbmRpZgogI2lmZGVmIEZfTk9USUZZCi0gICAgICAgIGlmIChpbnMoZCwgIkZfTk9USUZZIiwgKGxvbmcpRl9OT1RJRlkpKSByZXR1cm4gLTE7CisgICAgaWYgKGlucyhkLCAiRl9OT1RJRlkiLCAobG9uZylGX05PVElGWSkpIHJldHVybiAtMTsKICNlbmRpZgogLyogT2xkIEJTRCBmbG9jaygpLiAqLwogI2lmZGVmIEZfRVhMQ0sKLSAgICAgICAgaWYgKGlucyhkLCAiRl9FWExDSyIsIChsb25nKUZfRVhMQ0spKSByZXR1cm4gLTE7CisgICAgaWYgKGlucyhkLCAiRl9FWExDSyIsIChsb25nKUZfRVhMQ0spKSByZXR1cm4gLTE7CiAjZW5kaWYKICNpZmRlZiBGX1NITENLCi0gICAgICAgIGlmIChpbnMoZCwgIkZfU0hMQ0siLCAobG9uZylGX1NITENLKSkgcmV0dXJuIC0xOworICAgIGlmIChpbnMoZCwgIkZfU0hMQ0siLCAobG9uZylGX1NITENLKSkgcmV0dXJuIC0xOwogI2VuZGlmCiAKIC8qIE9TIFggKGFuZCBtYXliZSBvdGhlcnMpIGxldCB5b3UgdGVsbCB0aGUgc3RvcmFnZSBkZXZpY2UgdG8gZmx1c2ggdG8gcGh5c2ljYWwgbWVkaWEgKi8KICNpZmRlZiBGX0ZVTExGU1lOQwotICAgICAgICBpZiAoaW5zKGQsICJGX0ZVTExGU1lOQyIsIChsb25nKUZfRlVMTEZTWU5DKSkgcmV0dXJuIC0xOworICAgIGlmIChpbnMoZCwgIkZfRlVMTEZTWU5DIiwgKGxvbmcpRl9GVUxMRlNZTkMpKSByZXR1cm4gLTE7CiAjZW5kaWYKIAogLyogRm9yIEZfe0dFVHxTRVR9RkwgKi8KICNpZmRlZiBGRF9DTE9FWEVDCi0gICAgICAgIGlmIChpbnMoZCwgIkZEX0NMT0VYRUMiLCAobG9uZylGRF9DTE9FWEVDKSkgcmV0dXJuIC0xOworICAgIGlmIChpbnMoZCwgIkZEX0NMT0VYRUMiLCAobG9uZylGRF9DTE9FWEVDKSkgcmV0dXJuIC0xOwogI2VuZGlmCiAKIC8qIEZvciBGX05PVElGWSAqLwogI2lmZGVmIEROX0FDQ0VTUwotICAgICAgICBpZiAoaW5zKGQsICJETl9BQ0NFU1MiLCAobG9uZylETl9BQ0NFU1MpKSByZXR1cm4gLTE7CisgICAgaWYgKGlucyhkLCAiRE5fQUNDRVNTIiwgKGxvbmcpRE5fQUNDRVNTKSkgcmV0dXJuIC0xOwogI2VuZGlmCiAjaWZkZWYgRE5fTU9ESUZZCi0gICAgICAgIGlmIChpbnMoZCwgIkROX01PRElGWSIsIChsb25nKUROX01PRElGWSkpIHJldHVybiAtMTsKKyAgICBpZiAoaW5zKGQsICJETl9NT0RJRlkiLCAobG9uZylETl9NT0RJRlkpKSByZXR1cm4gLTE7CiAjZW5kaWYKICNpZmRlZiBETl9DUkVBVEUKLSAgICAgICAgaWYgKGlucyhkLCAiRE5fQ1JFQVRFIiwgKGxvbmcpRE5fQ1JFQVRFKSkgcmV0dXJuIC0xOworICAgIGlmIChpbnMoZCwgIkROX0NSRUFURSIsIChsb25nKUROX0NSRUFURSkpIHJldHVybiAtMTsKICNlbmRpZgogI2lmZGVmIEROX0RFTEVURQotICAgICAgICBpZiAoaW5zKGQsICJETl9ERUxFVEUiLCAobG9uZylETl9ERUxFVEUpKSByZXR1cm4gLTE7CisgICAgaWYgKGlucyhkLCAiRE5fREVMRVRFIiwgKGxvbmcpRE5fREVMRVRFKSkgcmV0dXJuIC0xOwogI2VuZGlmCiAjaWZkZWYgRE5fUkVOQU1FCi0gICAgICAgIGlmIChpbnMoZCwgIkROX1JFTkFNRSIsIChsb25nKUROX1JFTkFNRSkpIHJldHVybiAtMTsKKyAgICBpZiAoaW5zKGQsICJETl9SRU5BTUUiLCAobG9uZylETl9SRU5BTUUpKSByZXR1cm4gLTE7CiAjZW5kaWYKICNpZmRlZiBETl9BVFRSSUIKLSAgICAgICAgaWYgKGlucyhkLCAiRE5fQVRUUklCIiwgKGxvbmcpRE5fQVRUUklCKSkgcmV0dXJuIC0xOworICAgIGlmIChpbnMoZCwgIkROX0FUVFJJQiIsIChsb25nKUROX0FUVFJJQikpIHJldHVybiAtMTsKICNlbmRpZgogI2lmZGVmIEROX01VTFRJU0hPVAotICAgICAgICBpZiAoaW5zKGQsICJETl9NVUxUSVNIT1QiLCAobG9uZylETl9NVUxUSVNIT1QpKSByZXR1cm4gLTE7CisgICAgaWYgKGlucyhkLCAiRE5fTVVMVElTSE9UIiwgKGxvbmcpRE5fTVVMVElTSE9UKSkgcmV0dXJuIC0xOwogI2VuZGlmCiAKICNpZmRlZiBIQVZFX1NUUk9QVFNfSAotCS8qIFVuaXggOTggZ3VhcmFudGVlcyB0aGF0IHRoZXNlIGFyZSBpbiBzdHJvcHRzLmguICovCi0JSU5TKElfUFVTSCk7Ci0JSU5TKElfUE9QKTsKLQlJTlMoSV9MT09LKTsKLQlJTlMoSV9GTFVTSCk7Ci0JSU5TKElfRkxVU0hCQU5EKTsKLQlJTlMoSV9TRVRTSUcpOwotCUlOUyhJX0dFVFNJRyk7Ci0JSU5TKElfRklORCk7Ci0JSU5TKElfUEVFSyk7Ci0JSU5TKElfU1JET1BUKTsKLQlJTlMoSV9HUkRPUFQpOwotCUlOUyhJX05SRUFEKTsKLQlJTlMoSV9GRElOU0VSVCk7Ci0JSU5TKElfU1RSKTsKLQlJTlMoSV9TV1JPUFQpOworICAgIC8qIFVuaXggOTggZ3VhcmFudGVlcyB0aGF0IHRoZXNlIGFyZSBpbiBzdHJvcHRzLmguICovCisgICAgSU5TKElfUFVTSCk7CisgICAgSU5TKElfUE9QKTsKKyAgICBJTlMoSV9MT09LKTsKKyAgICBJTlMoSV9GTFVTSCk7CisgICAgSU5TKElfRkxVU0hCQU5EKTsKKyAgICBJTlMoSV9TRVRTSUcpOworICAgIElOUyhJX0dFVFNJRyk7CisgICAgSU5TKElfRklORCk7CisgICAgSU5TKElfUEVFSyk7CisgICAgSU5TKElfU1JET1BUKTsKKyAgICBJTlMoSV9HUkRPUFQpOworICAgIElOUyhJX05SRUFEKTsKKyAgICBJTlMoSV9GRElOU0VSVCk7CisgICAgSU5TKElfU1RSKTsKKyAgICBJTlMoSV9TV1JPUFQpOwogI2lmZGVmIElfR1dST1BUCi0JLyogZGVzcGl0ZSB0aGUgY29tbWVudCBhYm92ZSwgb2xkLWlzaCBnbGliY3MgbWlzcyBhIGNvdXBsZS4uLiAqLwotCUlOUyhJX0dXUk9QVCk7CisgICAgLyogZGVzcGl0ZSB0aGUgY29tbWVudCBhYm92ZSwgb2xkLWlzaCBnbGliY3MgbWlzcyBhIGNvdXBsZS4uLiAqLworICAgIElOUyhJX0dXUk9QVCk7CiAjZW5kaWYKLQlJTlMoSV9TRU5ERkQpOwotCUlOUyhJX1JFQ1ZGRCk7Ci0JSU5TKElfTElTVCk7Ci0JSU5TKElfQVRNQVJLKTsKLQlJTlMoSV9DS0JBTkQpOwotCUlOUyhJX0dFVEJBTkQpOwotCUlOUyhJX0NBTlBVVCk7Ci0JSU5TKElfU0VUQ0xUSU1FKTsKKyAgICBJTlMoSV9TRU5ERkQpOworICAgIElOUyhJX1JFQ1ZGRCk7CisgICAgSU5TKElfTElTVCk7CisgICAgSU5TKElfQVRNQVJLKTsKKyAgICBJTlMoSV9DS0JBTkQpOworICAgIElOUyhJX0dFVEJBTkQpOworICAgIElOUyhJX0NBTlBVVCk7CisgICAgSU5TKElfU0VUQ0xUSU1FKTsKICNpZmRlZiBJX0dFVENMVElNRQotCUlOUyhJX0dFVENMVElNRSk7CisgICAgSU5TKElfR0VUQ0xUSU1FKTsKICNlbmRpZgotCUlOUyhJX0xJTkspOwotCUlOUyhJX1VOTElOSyk7Ci0JSU5TKElfUExJTkspOwotCUlOUyhJX1BVTkxJTkspOworICAgIElOUyhJX0xJTkspOworICAgIElOUyhJX1VOTElOSyk7CisgICAgSU5TKElfUExJTkspOworICAgIElOUyhJX1BVTkxJTkspOwogI2VuZGlmCi0JCi0JcmV0dXJuIDA7CisKKyAgICByZXR1cm4gMDsKIH0KIAogUHlNT0RJTklUX0ZVTkMKIGluaXRmY250bCh2b2lkKQogewotCVB5T2JqZWN0ICptLCAqZDsKKyAgICBQeU9iamVjdCAqbSwgKmQ7CiAKLQkvKiBDcmVhdGUgdGhlIG1vZHVsZSBhbmQgYWRkIHRoZSBmdW5jdGlvbnMgYW5kIGRvY3VtZW50YXRpb24gKi8KLQltID0gUHlfSW5pdE1vZHVsZTMoImZjbnRsIiwgZmNudGxfbWV0aG9kcywgbW9kdWxlX2RvYyk7Ci0JaWYgKG0gPT0gTlVMTCkKLQkJcmV0dXJuOworICAgIC8qIENyZWF0ZSB0aGUgbW9kdWxlIGFuZCBhZGQgdGhlIGZ1bmN0aW9ucyBhbmQgZG9jdW1lbnRhdGlvbiAqLworICAgIG0gPSBQeV9Jbml0TW9kdWxlMygiZmNudGwiLCBmY250bF9tZXRob2RzLCBtb2R1bGVfZG9jKTsKKyAgICBpZiAobSA9PSBOVUxMKQorICAgICAgICByZXR1cm47CiAKLQkvKiBBZGQgc29tZSBzeW1ib2xpYyBjb25zdGFudHMgdG8gdGhlIG1vZHVsZSAqLwotCWQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOwotCWFsbF9pbnMoZCk7CisgICAgLyogQWRkIHNvbWUgc3ltYm9saWMgY29uc3RhbnRzIHRvIHRoZSBtb2R1bGUgKi8KKyAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICBhbGxfaW5zKGQpOwogfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9mbG1vZHVsZS5jIGIvTW9kdWxlcy9mbG1vZHVsZS5jCmluZGV4IGQyYzI1MDYuLmI1YTc4Y2YgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvZmxtb2R1bGUuYworKysgYi9Nb2R1bGVzL2ZsbW9kdWxlLmMKQEAgLTIyLDExICsyMiwxMSBAQAogLyogR2VuZXJpYyBGb3JtcyBPYmplY3RzICovCiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JRkxfT0JKRUNUICpvYl9nZW5lcmljOwotCVB5TWV0aG9kRGVmICpvYl9tZXRob2RzOwotCVB5T2JqZWN0ICpvYl9jYWxsYmFjazsKLQlQeU9iamVjdCAqb2JfY2FsbGJhY2tfYXJnOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBGTF9PQkpFQ1QgKm9iX2dlbmVyaWM7CisgICAgUHlNZXRob2REZWYgKm9iX21ldGhvZHM7CisgICAgUHlPYmplY3QgKm9iX2NhbGxiYWNrOworICAgIFB5T2JqZWN0ICpvYl9jYWxsYmFja19hcmc7CiB9IGdlbmVyaWNvYmplY3Q7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgR2VuZXJpY09iamVjdHR5cGU7CkBAIC00MywzMiArNDMsMzIgQEAKIHN0YXRpYyB2b2lkCiBrbm93Z2VuZXJpYyhnZW5lcmljb2JqZWN0ICpnKQogewotCWludCBpLCBuOwotCS8qIENyZWF0ZSB0aGUgbGlzdCBpZiBpdCBkb2Vzbid0IGFscmVhZHkgZXhpc3QgKi8KLQlpZiAoYWxsZ2VuZXJpY3MgPT0gTlVMTCkgewotCQlhbGxnZW5lcmljcyA9IFB5TGlzdF9OZXcoMCk7Ci0JCWlmIChhbGxnZW5lcmljcyA9PSBOVUxMKSB7Ci0JCQlQeUVycl9DbGVhcigpOwotCQkJcmV0dXJuOyAvKiBUb28gYmFkLCBsaXZlIHdpdGhvdXQgYWxsZ2VuZXJpY3MuLi4gKi8KLQkJfQotCX0KLQlpZiAobmZyZWVzbG90cyA+IDApIHsKLQkJLyogU2VhcmNoIHRoZSBsaXN0IGZvciByZXVzYWJsZSBzbG90cyAoTlVMTCBpdGVtcykgKi8KLQkJLyogWFhYIFRoaXMgY2FuIGJlIG1hZGUgZmFzdGVyISAqLwotCQluID0gUHlMaXN0X1NpemUoYWxsZ2VuZXJpY3MpOwotCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCQlpZiAoUHlMaXN0X0dldEl0ZW0oYWxsZ2VuZXJpY3MsIGkpID09IE5VTEwpIHsKLQkJCQlQeV9JTkNSRUYoZyk7Ci0JCQkJUHlMaXN0X1NldEl0ZW0oYWxsZ2VuZXJpY3MsIGksIChQeU9iamVjdCAqKWcpOwotCQkJCW5mcmVlc2xvdHMtLTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJLyogU3RyYW5nZS4uLiBubyBmcmVlIHNsb3RzIGZvdW5kLi4uICovCi0JCW5mcmVlc2xvdHMgPSAwOwotCX0KLQkvKiBObyBmcmVlIGVudHJpZXMsIGFwcGVuZCBuZXcgaXRlbSB0byB0aGUgZW5kICovCi0JUHlMaXN0X0FwcGVuZChhbGxnZW5lcmljcywgKFB5T2JqZWN0ICopZyk7CisgICAgaW50IGksIG47CisgICAgLyogQ3JlYXRlIHRoZSBsaXN0IGlmIGl0IGRvZXNuJ3QgYWxyZWFkeSBleGlzdCAqLworICAgIGlmIChhbGxnZW5lcmljcyA9PSBOVUxMKSB7CisgICAgICAgIGFsbGdlbmVyaWNzID0gUHlMaXN0X05ldygwKTsKKyAgICAgICAgaWYgKGFsbGdlbmVyaWNzID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICByZXR1cm47IC8qIFRvbyBiYWQsIGxpdmUgd2l0aG91dCBhbGxnZW5lcmljcy4uLiAqLworICAgICAgICB9CisgICAgfQorICAgIGlmIChuZnJlZXNsb3RzID4gMCkgeworICAgICAgICAvKiBTZWFyY2ggdGhlIGxpc3QgZm9yIHJldXNhYmxlIHNsb3RzIChOVUxMIGl0ZW1zKSAqLworICAgICAgICAvKiBYWFggVGhpcyBjYW4gYmUgbWFkZSBmYXN0ZXIhICovCisgICAgICAgIG4gPSBQeUxpc3RfU2l6ZShhbGxnZW5lcmljcyk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChQeUxpc3RfR2V0SXRlbShhbGxnZW5lcmljcywgaSkgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihnKTsKKyAgICAgICAgICAgICAgICBQeUxpc3RfU2V0SXRlbShhbGxnZW5lcmljcywgaSwgKFB5T2JqZWN0ICopZyk7CisgICAgICAgICAgICAgICAgbmZyZWVzbG90cy0tOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiBTdHJhbmdlLi4uIG5vIGZyZWUgc2xvdHMgZm91bmQuLi4gKi8KKyAgICAgICAgbmZyZWVzbG90cyA9IDA7CisgICAgfQorICAgIC8qIE5vIGZyZWUgZW50cmllcywgYXBwZW5kIG5ldyBpdGVtIHRvIHRoZSBlbmQgKi8KKyAgICBQeUxpc3RfQXBwZW5kKGFsbGdlbmVyaWNzLCAoUHlPYmplY3QgKilnKTsKIH0KIAogLyogRmluZCBhbiBvYmplY3QgaW4gdGhlIGxpc3Qgb2Yga25vd24gb2JqZWN0cyAqLwpAQCAtNzYsMTggKzc2LDE4IEBACiBzdGF0aWMgZ2VuZXJpY29iamVjdCAqCiBmaW5kZ2VuZXJpYyhGTF9PQkpFQ1QgKmdlbmVyaWMpCiB7Ci0JaW50IGksIG47Ci0JZ2VuZXJpY29iamVjdCAqZzsKLQkKLQlpZiAoYWxsZ2VuZXJpY3MgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7IC8qIE5vIG9iamVjdHMga25vd24geWV0ICovCi0JbiA9IFB5TGlzdF9TaXplKGFsbGdlbmVyaWNzKTsKLQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCWcgPSAoZ2VuZXJpY29iamVjdCAqKVB5TGlzdF9HZXRJdGVtKGFsbGdlbmVyaWNzLCBpKTsKLQkJaWYgKGcgIT0gTlVMTCAmJiBnLT5vYl9nZW5lcmljID09IGdlbmVyaWMpCi0JCQlyZXR1cm4gZzsKLQl9Ci0JcmV0dXJuIE5VTEw7IC8qIFVua25vd24gb2JqZWN0ICovCisgICAgaW50IGksIG47CisgICAgZ2VuZXJpY29iamVjdCAqZzsKKworICAgIGlmIChhbGxnZW5lcmljcyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsgLyogTm8gb2JqZWN0cyBrbm93biB5ZXQgKi8KKyAgICBuID0gUHlMaXN0X1NpemUoYWxsZ2VuZXJpY3MpOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgZyA9IChnZW5lcmljb2JqZWN0ICopUHlMaXN0X0dldEl0ZW0oYWxsZ2VuZXJpY3MsIGkpOworICAgICAgICBpZiAoZyAhPSBOVUxMICYmIGctPm9iX2dlbmVyaWMgPT0gZ2VuZXJpYykKKyAgICAgICAgICAgIHJldHVybiBnOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsgLyogVW5rbm93biBvYmplY3QgKi8KIH0KIAogLyogUmVtb3ZlIGFuIG9iamVjdCBmcm9tIHRoZSBsaXN0IG9mIGtub3duIG9iamVjdHMgKi8KQEAgLTk1LDIyICs5NSwyMiBAQAogc3RhdGljIHZvaWQKIGZvcmdldGdlbmVyaWMoZ2VuZXJpY29iamVjdCAqZykKIHsKLQlpbnQgaSwgbjsKLQkKLQlQeV9YREVDUkVGKGctPm9iX2NhbGxiYWNrKTsKLQlnLT5vYl9jYWxsYmFjayA9IE5VTEw7Ci0JUHlfWERFQ1JFRihnLT5vYl9jYWxsYmFja19hcmcpOwotCWctPm9iX2NhbGxiYWNrX2FyZyA9IE5VTEw7Ci0JaWYgKGFsbGdlbmVyaWNzID09IE5VTEwpCi0JCXJldHVybjsgLyogTm8gb2JqZWN0cyBrbm93biB5ZXQgKi8KLQluID0gUHlMaXN0X1NpemUoYWxsZ2VuZXJpY3MpOwotCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJaWYgKGcgPT0gKGdlbmVyaWNvYmplY3QgKilQeUxpc3RfR2V0SXRlbShhbGxnZW5lcmljcywgaSkpIHsKLQkJCVB5TGlzdF9TZXRJdGVtKGFsbGdlbmVyaWNzLCBpLCAoUHlPYmplY3QgKilOVUxMKTsKLQkJCW5mcmVlc2xvdHMrKzsKLQkJCWJyZWFrOwotCQl9Ci0JfQorICAgIGludCBpLCBuOworCisgICAgUHlfWERFQ1JFRihnLT5vYl9jYWxsYmFjayk7CisgICAgZy0+b2JfY2FsbGJhY2sgPSBOVUxMOworICAgIFB5X1hERUNSRUYoZy0+b2JfY2FsbGJhY2tfYXJnKTsKKyAgICBnLT5vYl9jYWxsYmFja19hcmcgPSBOVUxMOworICAgIGlmIChhbGxnZW5lcmljcyA9PSBOVUxMKQorICAgICAgICByZXR1cm47IC8qIE5vIG9iamVjdHMga25vd24geWV0ICovCisgICAgbiA9IFB5TGlzdF9TaXplKGFsbGdlbmVyaWNzKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIGlmIChnID09IChnZW5lcmljb2JqZWN0ICopUHlMaXN0X0dldEl0ZW0oYWxsZ2VuZXJpY3MsIGkpKSB7CisgICAgICAgICAgICBQeUxpc3RfU2V0SXRlbShhbGxnZW5lcmljcywgaSwgKFB5T2JqZWN0ICopTlVMTCk7CisgICAgICAgICAgICBuZnJlZXNsb3RzKys7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KIH0KIAogLyogQ2FsbGVkIHdoZW4gYSBmb3JtIGlzIGFib3V0IHRvIGJlIGZyZWVkIC0tCkBAIC0xMTksMjcgKzExOSwyNyBAQAogc3RhdGljIHZvaWQKIHJlbGVhc2VvYmplY3RzKEZMX0ZPUk0gKmZvcm0pCiB7Ci0JaW50IGksIG47Ci0JZ2VuZXJpY29iamVjdCAqZzsKLQkKLQlpZiAoYWxsZ2VuZXJpY3MgPT0gTlVMTCkKLQkJcmV0dXJuOyAvKiBObyBvYmplY3RzIGtub3duIHlldCAqLwotCW4gPSBQeUxpc3RfU2l6ZShhbGxnZW5lcmljcyk7Ci0JZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQlnID0gKGdlbmVyaWNvYmplY3QgKilQeUxpc3RfR2V0SXRlbShhbGxnZW5lcmljcywgaSk7Ci0JCWlmIChnICE9IE5VTEwgJiYgZy0+b2JfZ2VuZXJpYy0+Zm9ybSA9PSBmb3JtKSB7Ci0JCQlmbF9kZWxldGVfb2JqZWN0KGctPm9iX2dlbmVyaWMpOwotCQkJLyogVGhlIG9iamVjdCBpcyBub3cgdW5yZWFjaGFibGUgZm9yCi0JCQkgICBkb19mb3JtcyBhbmQgY2hlY2tfZm9ybXMsIHNvCi0JCQkgICBkZWxldGUgaXQgZnJvbSB0aGUgbGlzdCBvZiBrbm93biBvYmplY3RzICovCi0JCQlQeV9YREVDUkVGKGctPm9iX2NhbGxiYWNrKTsKLQkJCWctPm9iX2NhbGxiYWNrID0gTlVMTDsKLQkJCVB5X1hERUNSRUYoZy0+b2JfY2FsbGJhY2tfYXJnKTsKLQkJCWctPm9iX2NhbGxiYWNrX2FyZyA9IE5VTEw7Ci0JCQlQeUxpc3RfU2V0SXRlbShhbGxnZW5lcmljcywgaSwgKFB5T2JqZWN0ICopTlVMTCk7Ci0JCQluZnJlZXNsb3RzKys7Ci0JCX0KLQl9CisgICAgaW50IGksIG47CisgICAgZ2VuZXJpY29iamVjdCAqZzsKKworICAgIGlmIChhbGxnZW5lcmljcyA9PSBOVUxMKQorICAgICAgICByZXR1cm47IC8qIE5vIG9iamVjdHMga25vd24geWV0ICovCisgICAgbiA9IFB5TGlzdF9TaXplKGFsbGdlbmVyaWNzKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIGcgPSAoZ2VuZXJpY29iamVjdCAqKVB5TGlzdF9HZXRJdGVtKGFsbGdlbmVyaWNzLCBpKTsKKyAgICAgICAgaWYgKGcgIT0gTlVMTCAmJiBnLT5vYl9nZW5lcmljLT5mb3JtID09IGZvcm0pIHsKKyAgICAgICAgICAgIGZsX2RlbGV0ZV9vYmplY3QoZy0+b2JfZ2VuZXJpYyk7CisgICAgICAgICAgICAvKiBUaGUgb2JqZWN0IGlzIG5vdyB1bnJlYWNoYWJsZSBmb3IKKyAgICAgICAgICAgICAgIGRvX2Zvcm1zIGFuZCBjaGVja19mb3Jtcywgc28KKyAgICAgICAgICAgICAgIGRlbGV0ZSBpdCBmcm9tIHRoZSBsaXN0IG9mIGtub3duIG9iamVjdHMgKi8KKyAgICAgICAgICAgIFB5X1hERUNSRUYoZy0+b2JfY2FsbGJhY2spOworICAgICAgICAgICAgZy0+b2JfY2FsbGJhY2sgPSBOVUxMOworICAgICAgICAgICAgUHlfWERFQ1JFRihnLT5vYl9jYWxsYmFja19hcmcpOworICAgICAgICAgICAgZy0+b2JfY2FsbGJhY2tfYXJnID0gTlVMTDsKKyAgICAgICAgICAgIFB5TGlzdF9TZXRJdGVtKGFsbGdlbmVyaWNzLCBpLCAoUHlPYmplY3QgKilOVUxMKTsKKyAgICAgICAgICAgIG5mcmVlc2xvdHMrKzsKKyAgICAgICAgfQorICAgIH0KIH0KIAogCkBAIC0xNDgsNzkgKzE0OCw3OSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdlbmVyaWNfc2V0X2NhbGxfYmFjayhnZW5lcmljb2JqZWN0ICpnLCBQeU9iamVjdCAqYXJncykKIHsKLQlpZiAoUHlUdXBsZV9HRVRfU0laRShhcmdzKSA9PSAwKSB7Ci0JCVB5X1hERUNSRUYoZy0+b2JfY2FsbGJhY2spOwotCQlQeV9YREVDUkVGKGctPm9iX2NhbGxiYWNrX2FyZyk7Ci0JCWctPm9iX2NhbGxiYWNrID0gTlVMTDsKLQkJZy0+b2JfY2FsbGJhY2tfYXJnID0gTlVMTDsKLQl9Ci0JZWxzZSB7Ci0gICAgICAgIFB5T2JqZWN0ICphLCAqYjsKLSAgICAgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAic2V0X2NhbGxfYmFjayIsIDIsIDIsICZhLCAmYikpCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLQkJUHlfWERFQ1JFRihnLT5vYl9jYWxsYmFjayk7Ci0JCVB5X1hERUNSRUYoZy0+b2JfY2FsbGJhY2tfYXJnKTsKLQkJZy0+b2JfY2FsbGJhY2sgPSBhOwotCQlQeV9JTkNSRUYoZy0+b2JfY2FsbGJhY2spOwotCQlnLT5vYl9jYWxsYmFja19hcmcgPSBiOwotCQlQeV9JTkNSRUYoZy0+b2JfY2FsbGJhY2tfYXJnKTsKLQl9Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGlmIChQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpID09IDApIHsKKyAgICAgICAgUHlfWERFQ1JFRihnLT5vYl9jYWxsYmFjayk7CisgICAgICAgIFB5X1hERUNSRUYoZy0+b2JfY2FsbGJhY2tfYXJnKTsKKyAgICAgICAgZy0+b2JfY2FsbGJhY2sgPSBOVUxMOworICAgICAgICBnLT5vYl9jYWxsYmFja19hcmcgPSBOVUxMOworICAgIH0KKyAgICBlbHNlIHsKKyAgICBQeU9iamVjdCAqYSwgKmI7CisgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAic2V0X2NhbGxfYmFjayIsIDIsIDIsICZhLCAmYikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBQeV9YREVDUkVGKGctPm9iX2NhbGxiYWNrKTsKKyAgICAgICAgUHlfWERFQ1JFRihnLT5vYl9jYWxsYmFja19hcmcpOworICAgICAgICBnLT5vYl9jYWxsYmFjayA9IGE7CisgICAgICAgIFB5X0lOQ1JFRihnLT5vYl9jYWxsYmFjayk7CisgICAgICAgIGctPm9iX2NhbGxiYWNrX2FyZyA9IGI7CisgICAgICAgIFB5X0lOQ1JFRihnLT5vYl9jYWxsYmFja19hcmcpOworICAgIH0KKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZW5lcmljX2NhbGwoZ2VuZXJpY29iamVjdCAqZywgdm9pZCAoKmZ1bmMpKEZMX09CSkVDVCAqKSkKIHsKLQkoKmZ1bmMpKGctPm9iX2dlbmVyaWMpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICAoKmZ1bmMpKGctPm9iX2dlbmVyaWMpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGdlbmVyaWNfZGVsZXRlX29iamVjdChnZW5lcmljb2JqZWN0ICpnKQogewotCVB5T2JqZWN0ICpyZXM7Ci0JcmVzID0gZ2VuZXJpY19jYWxsKGcsIGZsX2RlbGV0ZV9vYmplY3QpOwotCWlmIChyZXMgIT0gTlVMTCkKLQkJZm9yZ2V0Z2VuZXJpYyhnKTsKLQlyZXR1cm4gcmVzOworICAgIFB5T2JqZWN0ICpyZXM7CisgICAgcmVzID0gZ2VuZXJpY19jYWxsKGcsIGZsX2RlbGV0ZV9vYmplY3QpOworICAgIGlmIChyZXMgIT0gTlVMTCkKKyAgICAgICAgZm9yZ2V0Z2VuZXJpYyhnKTsKKyAgICByZXR1cm4gcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZ2VuZXJpY19zaG93X29iamVjdChnZW5lcmljb2JqZWN0ICpnKQogewotCXJldHVybiBnZW5lcmljX2NhbGwoZywgZmxfc2hvd19vYmplY3QpOworICAgIHJldHVybiBnZW5lcmljX2NhbGwoZywgZmxfc2hvd19vYmplY3QpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZ2VuZXJpY19oaWRlX29iamVjdChnZW5lcmljb2JqZWN0ICpnKQogewotCXJldHVybiBnZW5lcmljX2NhbGwoZywgZmxfaGlkZV9vYmplY3QpOworICAgIHJldHVybiBnZW5lcmljX2NhbGwoZywgZmxfaGlkZV9vYmplY3QpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZ2VuZXJpY19yZWRyYXdfb2JqZWN0KGdlbmVyaWNvYmplY3QgKmcpCiB7Ci0JcmV0dXJuIGdlbmVyaWNfY2FsbChnLCBmbF9yZWRyYXdfb2JqZWN0KTsKKyAgICByZXR1cm4gZ2VuZXJpY19jYWxsKGcsIGZsX3JlZHJhd19vYmplY3QpOwogfQogCiAjaWZkZWYgT0JTT0xFVEVfRk9STVNfQ0FMTFMKLSAKKwogIC8qICh1bilmcmVlemVfb2JqZWN0KCkgYXJlIG9ic29sZXRlIGluIEZPUk1TIDIuMiBhbmQgdW5zdXBwb3J0ZWQKICAgICBpbiAyLjMuICBTaW5jZSB0aGVyZSdzIG5vIGZvb2xwcm9vZiB3YXkgdG8gdGVsbCB3aGljaCB2ZXJzaW9uIHdlJ3JlCiAgICAgdXNpbmcsIHdlIG9taXQgdGhlbSB1bmNvbmRpdGlvbmFsbHkuICovCi0gCisKIHN0YXRpYyBQeU9iamVjdCAqCiBnZW5lcmljX2ZyZWV6ZV9vYmplY3QoZ2VuZXJpY29iamVjdCAqZykKIHsKLQlyZXR1cm4gZ2VuZXJpY19jYWxsKGcsIGZsX2ZyZWV6ZV9vYmplY3QpOworICAgIHJldHVybiBnZW5lcmljX2NhbGwoZywgZmxfZnJlZXplX29iamVjdCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZW5lcmljX3VuZnJlZXplX29iamVjdChnZW5lcmljb2JqZWN0ICpnKQogewotCXJldHVybiBnZW5lcmljX2NhbGwoZywgZmxfdW5mcmVlemVfb2JqZWN0KTsKKyAgICByZXR1cm4gZ2VuZXJpY19jYWxsKGcsIGZsX3VuZnJlZXplX29iamVjdCk7CiB9CiAKICNlbmRpZiAvKiBPQlNPTEVURV9GT1JNU19DQUxMUyAqLwpAQCAtMjI4LDc4ICsyMjgsNzggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZW5lcmljX2FjdGl2YXRlX29iamVjdChnZW5lcmljb2JqZWN0ICpnKQogewotCXJldHVybiBnZW5lcmljX2NhbGwoZywgZmxfYWN0aXZhdGVfb2JqZWN0KTsKKyAgICByZXR1cm4gZ2VuZXJpY19jYWxsKGcsIGZsX2FjdGl2YXRlX29iamVjdCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZW5lcmljX2RlYWN0aXZhdGVfb2JqZWN0KGdlbmVyaWNvYmplY3QgKmcpCiB7Ci0JcmV0dXJuIGdlbmVyaWNfY2FsbChnLCBmbF9kZWFjdGl2YXRlX29iamVjdCk7CisgICAgcmV0dXJuIGdlbmVyaWNfY2FsbChnLCBmbF9kZWFjdGl2YXRlX29iamVjdCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZW5lcmljX3NldF9vYmplY3Rfc2hvcnRjdXQoZ2VuZXJpY29iamVjdCAqZywgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqc3RyOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczpzZXRfb2JqZWN0X3Nob3J0Y3V0IiwgJnN0cikpCi0JCXJldHVybiBOVUxMOwotCWZsX3NldF9vYmplY3Rfc2hvcnRjdXQoZy0+b2JfZ2VuZXJpYywgc3RyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgY2hhciAqc3RyOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczpzZXRfb2JqZWN0X3Nob3J0Y3V0IiwgJnN0cikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGZsX3NldF9vYmplY3Rfc2hvcnRjdXQoZy0+b2JfZ2VuZXJpYywgc3RyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBnZW5lcmljX21ldGhvZHNbXSA9IHsKLQl7InNldF9jYWxsX2JhY2siLAkoUHlDRnVuY3Rpb24pZ2VuZXJpY19zZXRfY2FsbF9iYWNrLCBNRVRIX1ZBUkFSR1N9LAotCXsiZGVsZXRlX29iamVjdCIsCShQeUNGdW5jdGlvbilnZW5lcmljX2RlbGV0ZV9vYmplY3QsIE1FVEhfTk9BUkdTfSwKLQl7InNob3dfb2JqZWN0IiwJCShQeUNGdW5jdGlvbilnZW5lcmljX3Nob3dfb2JqZWN0LCBNRVRIX05PQVJHU30sCi0JeyJoaWRlX29iamVjdCIsCQkoUHlDRnVuY3Rpb24pZ2VuZXJpY19oaWRlX29iamVjdCwgTUVUSF9OT0FSR1N9LAotCXsicmVkcmF3X29iamVjdCIsCShQeUNGdW5jdGlvbilnZW5lcmljX3JlZHJhd19vYmplY3QsIE1FVEhfTk9BUkdTfSwKKyAgICB7InNldF9jYWxsX2JhY2siLCAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWdlbmVyaWNfc2V0X2NhbGxfYmFjaywgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImRlbGV0ZV9vYmplY3QiLCAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWdlbmVyaWNfZGVsZXRlX29iamVjdCwgTUVUSF9OT0FSR1N9LAorICAgIHsic2hvd19vYmplY3QiLCAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pZ2VuZXJpY19zaG93X29iamVjdCwgTUVUSF9OT0FSR1N9LAorICAgIHsiaGlkZV9vYmplY3QiLCAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pZ2VuZXJpY19oaWRlX29iamVjdCwgTUVUSF9OT0FSR1N9LAorICAgIHsicmVkcmF3X29iamVjdCIsICAgICAgICAgICAoUHlDRnVuY3Rpb24pZ2VuZXJpY19yZWRyYXdfb2JqZWN0LCBNRVRIX05PQVJHU30sCiAjaWZkZWYgT0JTT0xFVEVfRk9STVNfQ0FMTFMKLQl7ImZyZWV6ZV9vYmplY3QiLAkoUHlDRnVuY3Rpb24pZ2VuZXJpY19mcmVlemVfb2JqZWN0LCBNRVRIX05PQVJHU30sCi0JeyJ1bmZyZWV6ZV9vYmplY3QiLAkoUHlDRnVuY3Rpb24pZ2VuZXJpY191bmZyZWV6ZV9vYmplY3QsIE1FVEhfTk9BUkdTfSwKKyAgICB7ImZyZWV6ZV9vYmplY3QiLCAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWdlbmVyaWNfZnJlZXplX29iamVjdCwgTUVUSF9OT0FSR1N9LAorICAgIHsidW5mcmVlemVfb2JqZWN0IiwgICAgICAgICAoUHlDRnVuY3Rpb24pZ2VuZXJpY191bmZyZWV6ZV9vYmplY3QsIE1FVEhfTk9BUkdTfSwKICNlbmRpZgotCXsiYWN0aXZhdGVfb2JqZWN0IiwJKFB5Q0Z1bmN0aW9uKWdlbmVyaWNfYWN0aXZhdGVfb2JqZWN0LCBNRVRIX05PQVJHU30sCi0JeyJkZWFjdGl2YXRlX29iamVjdCIsCShQeUNGdW5jdGlvbilnZW5lcmljX2RlYWN0aXZhdGVfb2JqZWN0LCBNRVRIX05PQVJHU30sCi0JeyJzZXRfb2JqZWN0X3Nob3J0Y3V0IiwJKFB5Q0Z1bmN0aW9uKWdlbmVyaWNfc2V0X29iamVjdF9zaG9ydGN1dCwgTUVUSF9WQVJBUkdTfSwKLQl7TlVMTCwJCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7ImFjdGl2YXRlX29iamVjdCIsICAgICAgICAgKFB5Q0Z1bmN0aW9uKWdlbmVyaWNfYWN0aXZhdGVfb2JqZWN0LCBNRVRIX05PQVJHU30sCisgICAgeyJkZWFjdGl2YXRlX29iamVjdCIsICAgICAgIChQeUNGdW5jdGlvbilnZW5lcmljX2RlYWN0aXZhdGVfb2JqZWN0LCBNRVRIX05PQVJHU30sCisgICAgeyJzZXRfb2JqZWN0X3Nob3J0Y3V0IiwgICAgIChQeUNGdW5jdGlvbilnZW5lcmljX3NldF9vYmplY3Rfc2hvcnRjdXQsIE1FVEhfVkFSQVJHU30sCisgICAge05VTEwsICAgICAgICAgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogc3RhdGljIHZvaWQKIGdlbmVyaWNfZGVhbGxvYyhnZW5lcmljb2JqZWN0ICpnKQogewotCWZsX2ZyZWVfb2JqZWN0KGctPm9iX2dlbmVyaWMpOwotCVB5X1hERUNSRUYoZy0+b2JfY2FsbGJhY2spOwotCVB5X1hERUNSRUYoZy0+b2JfY2FsbGJhY2tfYXJnKTsKLQlQeU9iamVjdF9EZWwoZyk7CisgICAgZmxfZnJlZV9vYmplY3QoZy0+b2JfZ2VuZXJpYyk7CisgICAgUHlfWERFQ1JFRihnLT5vYl9jYWxsYmFjayk7CisgICAgUHlfWERFQ1JFRihnLT5vYl9jYWxsYmFja19hcmcpOworICAgIFB5T2JqZWN0X0RlbChnKTsKIH0KIAogI2RlZmluZSBPRkYoeCkgb2Zmc2V0b2YoRkxfT0JKRUNULCB4KQogCiBzdGF0aWMgc3RydWN0IG1lbWJlcmxpc3QgZ2VuZXJpY19tZW1iZXJsaXN0W10gPSB7Ci0JeyJvYmpjbGFzcyIsCVRfSU5ULAkJT0ZGKG9iamNsYXNzKSwJUk99LAotCXsidHlwZSIsCVRfSU5ULAkJT0ZGKHR5cGUpLAlST30sCi0JeyJib3h0eXBlIiwJVF9JTlQsCQlPRkYoYm94dHlwZSl9LAotCXsieCIsCQlUX0ZMT0FULAlPRkYoeCl9LAotCXsieSIsCQlUX0ZMT0FULAlPRkYoeSl9LAotCXsidyIsCQlUX0ZMT0FULAlPRkYodyl9LAotCXsiaCIsCQlUX0ZMT0FULAlPRkYoaCl9LAotCXsiY29sMSIsCVRfSU5ULAkJT0ZGKGNvbDEpfSwKLQl7ImNvbDIiLAlUX0lOVCwJCU9GRihjb2wyKX0sCi0JeyJhbGlnbiIsCVRfSU5ULAkJT0ZGKGFsaWduKX0sCi0JeyJsY29sIiwJVF9JTlQsCQlPRkYobGNvbCl9LAotCXsibHNpemUiLAlUX0ZMT0FULAlPRkYobHNpemUpfSwKLQkvKiAibGFiZWwiIGlzIHRyZWF0ZWQgc3BlY2lhbGx5ISAqLwotCXsibHN0eWxlIiwJVF9JTlQsCQlPRkYobHN0eWxlKX0sCi0JeyJwdXNoZWQiLAlUX0lOVCwJCU9GRihwdXNoZWQpLAlST30sCi0JeyJmb2N1cyIsCVRfSU5ULAkJT0ZGKGZvY3VzKSwJUk99LAotCXsiYmVsb3dtb3VzZSIsCVRfSU5ULAkJT0ZGKGJlbG93bW91c2UpLFJPfSwKLS8qCXsiZnJvemVuIiwJVF9JTlQsCQlPRkYoZnJvemVuKSwJUk99LAkqLwotCXsiYWN0aXZlIiwJVF9JTlQsCQlPRkYoYWN0aXZlKX0sCi0JeyJpbnB1dCIsCVRfSU5ULAkJT0ZGKGlucHV0KX0sCi0JeyJ2aXNpYmxlIiwJVF9JTlQsCQlPRkYodmlzaWJsZSksCVJPfSwKLQl7InJhZGlvIiwJVF9JTlQsCQlPRkYocmFkaW8pfSwKLQl7ImF1dG9tYXRpYyIsCVRfSU5ULAkJT0ZGKGF1dG9tYXRpYyl9LAotCXtOVUxMfQkvKiBTZW50aW5lbCAqLworICAgIHsib2JqY2xhc3MiLCAgICAgICAgVF9JTlQsICAgICAgICAgIE9GRihvYmpjbGFzcyksICBST30sCisgICAgeyJ0eXBlIiwgICAgICAgICAgICBUX0lOVCwgICAgICAgICAgT0ZGKHR5cGUpLCAgICAgIFJPfSwKKyAgICB7ImJveHR5cGUiLCAgICAgICAgIFRfSU5ULCAgICAgICAgICBPRkYoYm94dHlwZSl9LAorICAgIHsieCIsICAgICAgICAgICAgICAgVF9GTE9BVCwgICAgICAgIE9GRih4KX0sCisgICAgeyJ5IiwgICAgICAgICAgICAgICBUX0ZMT0FULCAgICAgICAgT0ZGKHkpfSwKKyAgICB7InciLCAgICAgICAgICAgICAgIFRfRkxPQVQsICAgICAgICBPRkYodyl9LAorICAgIHsiaCIsICAgICAgICAgICAgICAgVF9GTE9BVCwgICAgICAgIE9GRihoKX0sCisgICAgeyJjb2wxIiwgICAgICAgICAgICBUX0lOVCwgICAgICAgICAgT0ZGKGNvbDEpfSwKKyAgICB7ImNvbDIiLCAgICAgICAgICAgIFRfSU5ULCAgICAgICAgICBPRkYoY29sMil9LAorICAgIHsiYWxpZ24iLCAgICAgICAgICAgVF9JTlQsICAgICAgICAgIE9GRihhbGlnbil9LAorICAgIHsibGNvbCIsICAgICAgICAgICAgVF9JTlQsICAgICAgICAgIE9GRihsY29sKX0sCisgICAgeyJsc2l6ZSIsICAgICAgICAgICBUX0ZMT0FULCAgICAgICAgT0ZGKGxzaXplKX0sCisgICAgLyogImxhYmVsIiBpcyB0cmVhdGVkIHNwZWNpYWxseSEgKi8KKyAgICB7ImxzdHlsZSIsICAgICAgICAgIFRfSU5ULCAgICAgICAgICBPRkYobHN0eWxlKX0sCisgICAgeyJwdXNoZWQiLCAgICAgICAgICBUX0lOVCwgICAgICAgICAgT0ZGKHB1c2hlZCksICAgIFJPfSwKKyAgICB7ImZvY3VzIiwgICAgICAgICAgIFRfSU5ULCAgICAgICAgICBPRkYoZm9jdXMpLCAgICAgUk99LAorICAgIHsiYmVsb3dtb3VzZSIsICAgICAgVF9JTlQsICAgICAgICAgIE9GRihiZWxvd21vdXNlKSxST30sCisvKiAgICAgIHsiZnJvemVuIiwgICAgICBUX0lOVCwgICAgICAgICAgT0ZGKGZyb3plbiksICAgIFJPfSwgICAgKi8KKyAgICB7ImFjdGl2ZSIsICAgICAgICAgIFRfSU5ULCAgICAgICAgICBPRkYoYWN0aXZlKX0sCisgICAgeyJpbnB1dCIsICAgICAgICAgICBUX0lOVCwgICAgICAgICAgT0ZGKGlucHV0KX0sCisgICAgeyJ2aXNpYmxlIiwgICAgICAgICBUX0lOVCwgICAgICAgICAgT0ZGKHZpc2libGUpLCAgIFJPfSwKKyAgICB7InJhZGlvIiwgICAgICAgICAgIFRfSU5ULCAgICAgICAgICBPRkYocmFkaW8pfSwKKyAgICB7ImF1dG9tYXRpYyIsICAgICAgIFRfSU5ULCAgICAgICAgICBPRkYoYXV0b21hdGljKX0sCisgICAge05VTEx9ICAgICAgLyogU2VudGluZWwgKi8KIH07CiAKICN1bmRlZiBPRkYKQEAgLTMwNyw5OSArMzA3LDk5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2VuZXJpY19nZXRhdHRyKGdlbmVyaWNvYmplY3QgKmcsIGNoYXIgKm5hbWUpCiB7Ci0JUHlPYmplY3QgKm1ldGg7CisgICAgUHlPYmplY3QgKm1ldGg7CiAKLQkvKiBYWFggT3VnaHQgdG8gc3BlY2lhbC1jYXNlIG5hbWUgIl9fbWV0aG9kc19fIiAqLwotCWlmIChnLT4gb2JfbWV0aG9kcykgewotCQltZXRoID0gUHlfRmluZE1ldGhvZChnLT5vYl9tZXRob2RzLCAoUHlPYmplY3QgKilnLCBuYW1lKTsKLQkJaWYgKG1ldGggIT0gTlVMTCkgcmV0dXJuIG1ldGg7Ci0JCVB5RXJyX0NsZWFyKCk7Ci0JfQorICAgIC8qIFhYWCBPdWdodCB0byBzcGVjaWFsLWNhc2UgbmFtZSAiX19tZXRob2RzX18iICovCisgICAgaWYgKGctPiBvYl9tZXRob2RzKSB7CisgICAgICAgIG1ldGggPSBQeV9GaW5kTWV0aG9kKGctPm9iX21ldGhvZHMsIChQeU9iamVjdCAqKWcsIG5hbWUpOworICAgICAgICBpZiAobWV0aCAhPSBOVUxMKSByZXR1cm4gbWV0aDsKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICB9CiAKLQltZXRoID0gUHlfRmluZE1ldGhvZChnZW5lcmljX21ldGhvZHMsIChQeU9iamVjdCAqKWcsIG5hbWUpOwotCWlmIChtZXRoICE9IE5VTEwpCi0JCXJldHVybiBtZXRoOwotCVB5RXJyX0NsZWFyKCk7CisgICAgbWV0aCA9IFB5X0ZpbmRNZXRob2QoZ2VuZXJpY19tZXRob2RzLCAoUHlPYmplY3QgKilnLCBuYW1lKTsKKyAgICBpZiAobWV0aCAhPSBOVUxMKQorICAgICAgICByZXR1cm4gbWV0aDsKKyAgICBQeUVycl9DbGVhcigpOwogCi0JLyogImxhYmVsIiBpcyBhbiBleGNlcHRpb24sIGdldG1lbWJlciBvbmx5IHdvcmtzIGZvciBjaGFyIHBvaW50ZXJzLAotCSAgIG5vdCBmb3IgY2hhciBhcnJheXMgKi8KLQlpZiAoc3RyY21wKG5hbWUsICJsYWJlbCIpID09IDApCi0JCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGctPm9iX2dlbmVyaWMtPmxhYmVsKTsKKyAgICAvKiAibGFiZWwiIGlzIGFuIGV4Y2VwdGlvbiwgZ2V0bWVtYmVyIG9ubHkgd29ya3MgZm9yIGNoYXIgcG9pbnRlcnMsCisgICAgICAgbm90IGZvciBjaGFyIGFycmF5cyAqLworICAgIGlmIChzdHJjbXAobmFtZSwgImxhYmVsIikgPT0gMCkKKyAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoZy0+b2JfZ2VuZXJpYy0+bGFiZWwpOwogCi0JcmV0dXJuIFB5TWVtYmVyX0dldCgoY2hhciAqKWctPm9iX2dlbmVyaWMsIGdlbmVyaWNfbWVtYmVybGlzdCwgbmFtZSk7CisgICAgcmV0dXJuIFB5TWVtYmVyX0dldCgoY2hhciAqKWctPm9iX2dlbmVyaWMsIGdlbmVyaWNfbWVtYmVybGlzdCwgbmFtZSk7CiB9CiAKIHN0YXRpYyBpbnQKIGdlbmVyaWNfc2V0YXR0cihnZW5lcmljb2JqZWN0ICpnLCBjaGFyICpuYW1lLCBQeU9iamVjdCAqdikKIHsKLQlpbnQgcmV0OworICAgIGludCByZXQ7CiAKLQlpZiAodiA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJImNhbid0IGRlbGV0ZSBmb3JtcyBvYmplY3QgYXR0cmlidXRlcyIpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIGlmICh2ID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjYW4ndCBkZWxldGUgZm9ybXMgb2JqZWN0IGF0dHJpYnV0ZXMiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCS8qICJsYWJlbCIgaXMgYW4gZXhjZXB0aW9uOiBzZXRtZW1iZXIgZG9lc24ndCBzZXQgc3RyaW5nczsKLQkgICBhbmQgRk9STVMgd2FudHMgeW91IHRvIGNhbGwgYSBmdW5jdGlvbiB0byBzZXQgdGhlIGxhYmVsICovCi0JaWYgKHN0cmNtcChuYW1lLCAibGFiZWwiKSA9PSAwKSB7Ci0JCWlmICghUHlTdHJpbmdfQ2hlY2sodikpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJCSJsYWJlbCBhdHRyIG11c3QgYmUgc3RyaW5nIik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJZmxfc2V0X29iamVjdF9sYWJlbChnLT5vYl9nZW5lcmljLCBQeVN0cmluZ19Bc1N0cmluZyh2KSk7Ci0JCXJldHVybiAwOwotCX0KKyAgICAvKiAibGFiZWwiIGlzIGFuIGV4Y2VwdGlvbjogc2V0bWVtYmVyIGRvZXNuJ3Qgc2V0IHN0cmluZ3M7CisgICAgICAgYW5kIEZPUk1TIHdhbnRzIHlvdSB0byBjYWxsIGEgZnVuY3Rpb24gdG8gc2V0IHRoZSBsYWJlbCAqLworICAgIGlmIChzdHJjbXAobmFtZSwgImxhYmVsIikgPT0gMCkgeworICAgICAgICBpZiAoIVB5U3RyaW5nX0NoZWNrKHYpKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsYWJlbCBhdHRyIG11c3QgYmUgc3RyaW5nIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgZmxfc2V0X29iamVjdF9sYWJlbChnLT5vYl9nZW5lcmljLCBQeVN0cmluZ19Bc1N0cmluZyh2KSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KIAotCXJldCA9IFB5TWVtYmVyX1NldCgoY2hhciAqKWctPm9iX2dlbmVyaWMsIGdlbmVyaWNfbWVtYmVybGlzdCwgbmFtZSwgdik7CisgICAgcmV0ID0gUHlNZW1iZXJfU2V0KChjaGFyICopZy0+b2JfZ2VuZXJpYywgZ2VuZXJpY19tZW1iZXJsaXN0LCBuYW1lLCB2KTsKIAotCS8qIFJhdGhlciB0aGFuIGNhbGxpbmcgYWxsIHRoZSB2YXJpb3VzIHNldF9vYmplY3RfKiBmdW5jdGlvbnMsCi0JICAgd2UgY2FsbCBmbF9yZWRyYXdfb2JqZWN0IGhlcmUuICBUaGlzIGlzIHNvbWV0aW1lcyByZWR1bmRhbnQKLQkgICBidXQgSSBkb3VidCB0aGF0J3MgYSBiaWcgcHJvYmxlbSAqLwotCWlmIChyZXQgPT0gMCkKLQkJZmxfcmVkcmF3X29iamVjdChnLT5vYl9nZW5lcmljKTsKKyAgICAvKiBSYXRoZXIgdGhhbiBjYWxsaW5nIGFsbCB0aGUgdmFyaW91cyBzZXRfb2JqZWN0XyogZnVuY3Rpb25zLAorICAgICAgIHdlIGNhbGwgZmxfcmVkcmF3X29iamVjdCBoZXJlLiAgVGhpcyBpcyBzb21ldGltZXMgcmVkdW5kYW50CisgICAgICAgYnV0IEkgZG91YnQgdGhhdCdzIGEgYmlnIHByb2JsZW0gKi8KKyAgICBpZiAocmV0ID09IDApCisgICAgICAgIGZsX3JlZHJhd19vYmplY3QoZy0+b2JfZ2VuZXJpYyk7CiAKLQlyZXR1cm4gcmV0OworICAgIHJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZW5lcmljX3JlcHIoZ2VuZXJpY29iamVjdCAqZykKIHsKLQljaGFyIGJ1ZlsxMDBdOwotCVB5T1Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIjxGT1JNU19vYmplY3QgYXQgJXAsIG9iamNsYXNzPSVkPiIsCi0JCSAgICAgIGcsIGctPm9iX2dlbmVyaWMtPm9iamNsYXNzKTsKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOworICAgIGNoYXIgYnVmWzEwMF07CisgICAgUHlPU19zbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiPEZPUk1TX29iamVjdCBhdCAlcCwgb2JqY2xhc3M9JWQ+IiwKKyAgICAgICAgICAgICAgICAgIGcsIGctPm9iX2dlbmVyaWMtPm9iamNsYXNzKTsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOwogfQogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IEdlbmVyaWNPYmplY3R0eXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUpCi0JMCwJCQkJLypvYl9zaXplKi8KLQkiZmwuRk9STVNfb2JqZWN0IiwJCS8qdHBfbmFtZSovCi0Jc2l6ZW9mKGdlbmVyaWNvYmplY3QpLAkJLyp0cF9zaXplKi8KLQkwLAkJCQkvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpZ2VuZXJpY19kZWFsbG9jLAkvKnRwX2RlYWxsb2MqLwotCTAsCQkJCS8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYylnZW5lcmljX2dldGF0dHIsCS8qdHBfZ2V0YXR0ciovCi0JKHNldGF0dHJmdW5jKWdlbmVyaWNfc2V0YXR0ciwJLyp0cF9zZXRhdHRyKi8KLQkwLAkJCQkvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYylnZW5lcmljX3JlcHIsCQkvKnRwX3JlcHIqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUpCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypvYl9zaXplKi8KKyAgICAiZmwuRk9STVNfb2JqZWN0IiwgICAgICAgICAgICAgICAgICAvKnRwX25hbWUqLworICAgIHNpemVvZihnZW5lcmljb2JqZWN0KSwgICAgICAgICAgICAgIC8qdHBfc2l6ZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKWdlbmVyaWNfZGVhbGxvYywgICAgICAgIC8qdHBfZGVhbGxvYyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKWdlbmVyaWNfZ2V0YXR0ciwgICAgICAgLyp0cF9nZXRhdHRyKi8KKyAgICAoc2V0YXR0cmZ1bmMpZ2VuZXJpY19zZXRhdHRyLCAgICAgICAvKnRwX3NldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY29tcGFyZSovCisgICAgKHJlcHJmdW5jKWdlbmVyaWNfcmVwciwgICAgICAgICAgICAgLyp0cF9yZXByKi8KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBuZXdnZW5lcmljb2JqZWN0KEZMX09CSkVDVCAqZ2VuZXJpYywgUHlNZXRob2REZWYgKm1ldGhvZHMpCiB7Ci0JZ2VuZXJpY29iamVjdCAqZzsKLQlnID0gUHlPYmplY3RfTmV3KGdlbmVyaWNvYmplY3QsICZHZW5lcmljT2JqZWN0dHlwZSk7Ci0JaWYgKGcgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JZy0+IG9iX2dlbmVyaWMgPSBnZW5lcmljOwotCWctPm9iX21ldGhvZHMgPSBtZXRob2RzOwotCWctPm9iX2NhbGxiYWNrID0gTlVMTDsKLQlnLT5vYl9jYWxsYmFja19hcmcgPSBOVUxMOwotCWtub3dnZW5lcmljKGcpOwotCXJldHVybiAoUHlPYmplY3QgKilnOworICAgIGdlbmVyaWNvYmplY3QgKmc7CisgICAgZyA9IFB5T2JqZWN0X05ldyhnZW5lcmljb2JqZWN0LCAmR2VuZXJpY09iamVjdHR5cGUpOworICAgIGlmIChnID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGctPiBvYl9nZW5lcmljID0gZ2VuZXJpYzsKKyAgICBnLT5vYl9tZXRob2RzID0gbWV0aG9kczsKKyAgICBnLT5vYl9jYWxsYmFjayA9IE5VTEw7CisgICAgZy0+b2JfY2FsbGJhY2tfYXJnID0gTlVMTDsKKyAgICBrbm93Z2VuZXJpYyhnKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopZzsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC00MDksNzAgKzQwOSw3MCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGNhbGxfZm9ybXNfSU5mICh2b2lkICgqZnVuYykoRkxfT0JKRUNUICosIGZsb2F0KSwgRkxfT0JKRUNUICpvYmosIFB5T2JqZWN0ICphcmdzKQogewotCWZsb2F0IHBhcmFtZXRlcjsKKyAgICBmbG9hdCBwYXJhbWV0ZXI7CiAKLQlpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICJmIiwgJnBhcmFtZXRlcikpIHJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2UoYXJncywgImYiLCAmcGFyYW1ldGVyKSkgcmV0dXJuIE5VTEw7CiAKLQkoKmZ1bmMpIChvYmosIHBhcmFtZXRlcik7CisgICAgKCpmdW5jKSAob2JqLCBwYXJhbWV0ZXIpOwogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBmdW5jIChvYmplY3QsIGZsb2F0KSAqLwogc3RhdGljIFB5T2JqZWN0ICoKIGNhbGxfZm9ybXNfSU5mSU5mICh2b2lkICgqZnVuYykoRkxfT0JKRUNUICosIGZsb2F0LCBmbG9hdCksIEZMX09CSkVDVCAqb2JqLCBQeU9iamVjdCAqYXJncykKIHsKLQlmbG9hdCBwYXIxLCBwYXIyOworICAgIGZsb2F0IHBhcjEsIHBhcjI7CiAKLQlpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICIoZmYpIiwgJnBhcjEsICZwYXIyKSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiKGZmKSIsICZwYXIxLCAmcGFyMikpIHJldHVybiBOVUxMOwogCi0JKCpmdW5jKSAob2JqLCBwYXIxLCBwYXIyKTsKKyAgICAoKmZ1bmMpIChvYmosIHBhcjEsIHBhcjIpOwogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBmdW5jIChvYmplY3QsIGludCkgKi8KIHN0YXRpYyBQeU9iamVjdCAqCiBjYWxsX2Zvcm1zX0lOaSAodm9pZCAoKmZ1bmMpKEZMX09CSkVDVCAqLCBpbnQpLCBGTF9PQkpFQ1QgKm9iaiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IHBhcmFtZXRlcjsKKyAgICBpbnQgcGFyYW1ldGVyOwogCi0JaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiaSIsICZwYXJhbWV0ZXIpKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICJpIiwgJnBhcmFtZXRlcikpIHJldHVybiBOVUxMOwogCi0JKCpmdW5jKSAob2JqLCBwYXJhbWV0ZXIpOworICAgICgqZnVuYykgKG9iaiwgcGFyYW1ldGVyKTsKIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgZnVuYyAob2JqZWN0LCBjaGFyKSAqLwogc3RhdGljIFB5T2JqZWN0ICoKIGNhbGxfZm9ybXNfSU5jICh2b2lkICgqZnVuYykoRkxfT0JKRUNUICosIGludCksIEZMX09CSkVDVCAqb2JqLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICphOworICAgIGNoYXIgKmE7CiAKLQlpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICJzIiwgJmEpKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICJzIiwgJmEpKSByZXR1cm4gTlVMTDsKIAotCSgqZnVuYykgKG9iaiwgYVswXSk7CisgICAgKCpmdW5jKSAob2JqLCBhWzBdKTsKIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgZnVuYyAob2JqZWN0LCBzdHJpbmcpICovCiBzdGF0aWMgUHlPYmplY3QgKgogY2FsbF9mb3Jtc19JTnN0ciAodm9pZCAoKmZ1bmMpKEZMX09CSkVDVCAqLCBjaGFyICopLCBGTF9PQkpFQ1QgKm9iaiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqYTsKKyAgICBjaGFyICphOwogCi0JaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAicyIsICZhKSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAicyIsICZhKSkgcmV0dXJuIE5VTEw7CiAKLQkoKmZ1bmMpIChvYmosIGEpOworICAgICgqZnVuYykgKG9iaiwgYSk7CiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAKQEAgLTQ4MCwxNSArNDgwLDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogY2FsbF9mb3Jtc19JTmlJTnN0ciAodm9pZCAoKmZ1bmMpKEZMX09CSkVDVCAqLCBpbnQsIGNoYXIgKiksIEZMX09CSkVDVCAqb2JqLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpiOwotCWludCBhOwotCQotCWlmICghUHlBcmdfUGFyc2UoYXJncywgIihpcykiLCAmYSwgJmIpKSByZXR1cm4gTlVMTDsKLQkKLQkoKmZ1bmMpIChvYmosIGEsIGIpOwotCQotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBjaGFyICpiOworICAgIGludCBhOworCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiKGlzKSIsICZhLCAmYikpIHJldHVybiBOVUxMOworCisgICAgKCpmdW5jKSAob2JqLCBhLCBiKTsKKworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogI2lmZGVmIFVOVVNFRApAQCAtNDk2LDE0ICs0OTYsMTQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBjYWxsX2Zvcm1zX0lOaUlOaSAodm9pZCAoKmZ1bmMpKEZMX09CSkVDVCAqLCBpbnQsIGludCksIEZMX09CSkVDVCAqb2JqLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgcGFyMSwgcGFyMjsKLQkKLQlpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICIoaWkpIiwgJnBhcjEsICZwYXIyKSkgcmV0dXJuIE5VTEw7Ci0JCi0JKCpmdW5jKSAob2JqLCBwYXIxLCBwYXIyKTsKLQkKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaW50IHBhcjEsIHBhcjI7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICIoaWkpIiwgJnBhcjEsICZwYXIyKSkgcmV0dXJuIE5VTEw7CisKKyAgICAoKmZ1bmMpIChvYmosIHBhcjEsIHBhcjIpOworCisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogI2VuZGlmCiAKQEAgLTUxMSw1OCArNTExLDU4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogY2FsbF9mb3Jtc19SaSAoaW50ICgqZnVuYykoRkxfT0JKRUNUICopLCBGTF9PQkpFQ1QgKm9iaikKIHsKLQlpbnQgcmV0dmFsOworICAgIGludCByZXR2YWw7CiAKLQlyZXR2YWwgPSAoKmZ1bmMpIChvYmopOworICAgIHJldHZhbCA9ICgqZnVuYykgKG9iaik7CiAKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcgKChsb25nKSByZXR2YWwpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyAoKGxvbmcpIHJldHZhbCk7CiB9CiAKIC8qIGNoYXIgKiBmdW5jIChvYmplY3QpICovCiBzdGF0aWMgUHlPYmplY3QgKgogY2FsbF9mb3Jtc19Sc3RyIChjaGFyICogKCpmdW5jKShGTF9PQkpFQ1QgKiksIEZMX09CSkVDVCAqb2JqKQogewotCWNoYXIgKnN0cjsKKyAgICBjaGFyICpzdHI7CiAKLQlzdHIgPSAoKmZ1bmMpIChvYmopOworICAgIHN0ciA9ICgqZnVuYykgKG9iaik7CiAKLQlpZiAoc3RyID09IE5VTEwpIHsKLQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQlyZXR1cm4gUHlfTm9uZTsKLQl9Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcgKHN0cik7CisgICAgaWYgKHN0ciA9PSBOVUxMKSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgfQorICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nIChzdHIpOwogfQogCiAvKiBpbnQgZnVuYyAob2JqZWN0KSAqLwogc3RhdGljIFB5T2JqZWN0ICoKIGNhbGxfZm9ybXNfUmYgKGZsb2F0ICgqZnVuYykoRkxfT0JKRUNUICopLCBGTF9PQkpFQ1QgKm9iaikKIHsKLQlmbG9hdCByZXR2YWw7CisgICAgZmxvYXQgcmV0dmFsOwogCi0JcmV0dmFsID0gKCpmdW5jKSAob2JqKTsKKyAgICByZXR2YWwgPSAoKmZ1bmMpIChvYmopOwogCi0JcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZSAocmV0dmFsKTsKKyAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlIChyZXR2YWwpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY2FsbF9mb3Jtc19PVVRmT1VUZiAodm9pZCAoKmZ1bmMpKEZMX09CSkVDVCAqLCBmbG9hdCAqLCBmbG9hdCAqKSwgRkxfT0JKRUNUICpvYmopCiB7Ci0JZmxvYXQgZjEsIGYyOworICAgIGZsb2F0IGYxLCBmMjsKIAotCSgqZnVuYykgKG9iaiwgJmYxLCAmZjIpOworICAgICgqZnVuYykgKG9iaiwgJmYxLCAmZjIpOwogCi0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihmZikiLCBmMSwgZjIpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIoZmYpIiwgZjEsIGYyKTsKIH0KIAogI2lmZGVmIFVOVVNFRAogc3RhdGljIFB5T2JqZWN0ICoKIGNhbGxfZm9ybXNfT1VUZiAodm9pZCAoKmZ1bmMpKEZMX09CSkVDVCAqLCBmbG9hdCAqKSwgRkxfT0JKRUNUICpvYmopCiB7Ci0JZmxvYXQgZjsKKyAgICBmbG9hdCBmOwogCi0JKCpmdW5jKSAob2JqLCAmZik7CisgICAgKCpmdW5jKSAob2JqLCAmZik7CiAKLQlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlIChmKTsKKyAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlIChmKTsKIH0KICNlbmRpZgogCkBAIC01NzIsMTcyICs1NzIsMTcyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogc2V0X2Jyb3dzZXJfdG9wbGluZShnZW5lcmljb2JqZWN0ICpnLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gY2FsbF9mb3Jtc19JTmkgKGZsX3NldF9icm93c2VyX3RvcGxpbmUsIGctPiBvYl9nZW5lcmljLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF9mb3Jtc19JTmkgKGZsX3NldF9icm93c2VyX3RvcGxpbmUsIGctPiBvYl9nZW5lcmljLCBhcmdzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNsZWFyX2Jyb3dzZXIoZ2VuZXJpY29iamVjdCAqZykKIHsKLQlyZXR1cm4gZ2VuZXJpY19jYWxsIChnLCBmbF9jbGVhcl9icm93c2VyKTsKKyAgICByZXR1cm4gZ2VuZXJpY19jYWxsIChnLCBmbF9jbGVhcl9icm93c2VyKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGFkZF9icm93c2VyX2xpbmUgKGdlbmVyaWNvYmplY3QgKmcsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX2Zvcm1zX0lOc3RyIChmbF9hZGRfYnJvd3Nlcl9saW5lLCBnLT4gb2JfZ2VuZXJpYywgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfZm9ybXNfSU5zdHIgKGZsX2FkZF9icm93c2VyX2xpbmUsIGctPiBvYl9nZW5lcmljLCBhcmdzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGFkZHRvX2Jyb3dzZXIgKGdlbmVyaWNvYmplY3QgKmcsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX2Zvcm1zX0lOc3RyIChmbF9hZGR0b19icm93c2VyLCBnLT4gb2JfZ2VuZXJpYywgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfZm9ybXNfSU5zdHIgKGZsX2FkZHRvX2Jyb3dzZXIsIGctPiBvYl9nZW5lcmljLCBhcmdzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGluc2VydF9icm93c2VyX2xpbmUgKGdlbmVyaWNvYmplY3QgKmcsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX2Zvcm1zX0lOaUlOc3RyIChmbF9pbnNlcnRfYnJvd3Nlcl9saW5lLAotCQkJCSAgICBnLT4gb2JfZ2VuZXJpYywgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfZm9ybXNfSU5pSU5zdHIgKGZsX2luc2VydF9icm93c2VyX2xpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGctPiBvYl9nZW5lcmljLCBhcmdzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRlbGV0ZV9icm93c2VyX2xpbmUgKGdlbmVyaWNvYmplY3QgKmcsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX2Zvcm1zX0lOaSAoZmxfZGVsZXRlX2Jyb3dzZXJfbGluZSwgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX2Zvcm1zX0lOaSAoZmxfZGVsZXRlX2Jyb3dzZXJfbGluZSwgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogcmVwbGFjZV9icm93c2VyX2xpbmUgKGdlbmVyaWNvYmplY3QgKmcsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX2Zvcm1zX0lOaUlOc3RyIChmbF9yZXBsYWNlX2Jyb3dzZXJfbGluZSwKLQkJCQkgICAgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX2Zvcm1zX0lOaUlOc3RyIChmbF9yZXBsYWNlX2Jyb3dzZXJfbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZ2V0X2Jyb3dzZXJfbGluZShnZW5lcmljb2JqZWN0ICpnLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgaTsKLQljaGFyICpzdHI7CisgICAgaW50IGk7CisgICAgY2hhciAqc3RyOwogCi0JaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiaSIsICZpKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiaSIsICZpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlzdHIgPSBmbF9nZXRfYnJvd3Nlcl9saW5lIChnLT5vYl9nZW5lcmljLCBpKTsKKyAgICBzdHIgPSBmbF9nZXRfYnJvd3Nlcl9saW5lIChnLT5vYl9nZW5lcmljLCBpKTsKIAotCWlmIChzdHIgPT0gTlVMTCkgewotCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCXJldHVybiBQeV9Ob25lOwotCX0KLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyAoc3RyKTsKKyAgICBpZiAoc3RyID09IE5VTEwpIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICB9CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcgKHN0cik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBsb2FkX2Jyb3dzZXIgKGdlbmVyaWNvYmplY3QgKmcsIFB5T2JqZWN0ICphcmdzKQogewotCS8qIFhYWCBzdHJpY3RseSBzcGVha2luZyB0aGlzIGlzIHdyb25nIHNpbmNlIGZsX2xvYWRfYnJvd3NlcgotCSAgIFhYWCByZXR1cm5zIGludCwgbm90IHZvaWQgKi8KLQlyZXR1cm4gY2FsbF9mb3Jtc19JTnN0ciAoZmxfbG9hZF9icm93c2VyLCBnLT4gb2JfZ2VuZXJpYywgYXJncyk7CisgICAgLyogWFhYIHN0cmljdGx5IHNwZWFraW5nIHRoaXMgaXMgd3Jvbmcgc2luY2UgZmxfbG9hZF9icm93c2VyCisgICAgICAgWFhYIHJldHVybnMgaW50LCBub3Qgdm9pZCAqLworICAgIHJldHVybiBjYWxsX2Zvcm1zX0lOc3RyIChmbF9sb2FkX2Jyb3dzZXIsIGctPiBvYl9nZW5lcmljLCBhcmdzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGdldF9icm93c2VyX21heGxpbmUoZ2VuZXJpY29iamVjdCAqZykKIHsKLQlyZXR1cm4gY2FsbF9mb3Jtc19SaSAoZmxfZ2V0X2Jyb3dzZXJfbWF4bGluZSwgZy0+IG9iX2dlbmVyaWMpOworICAgIHJldHVybiBjYWxsX2Zvcm1zX1JpIChmbF9nZXRfYnJvd3Nlcl9tYXhsaW5lLCBnLT4gb2JfZ2VuZXJpYyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZWxlY3RfYnJvd3Nlcl9saW5lIChnZW5lcmljb2JqZWN0ICpnLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gY2FsbF9mb3Jtc19JTmkgKGZsX3NlbGVjdF9icm93c2VyX2xpbmUsIGctPiBvYl9nZW5lcmljLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF9mb3Jtc19JTmkgKGZsX3NlbGVjdF9icm93c2VyX2xpbmUsIGctPiBvYl9nZW5lcmljLCBhcmdzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRlc2VsZWN0X2Jyb3dzZXJfbGluZSAoZ2VuZXJpY29iamVjdCAqZywgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfZm9ybXNfSU5pIChmbF9kZXNlbGVjdF9icm93c2VyX2xpbmUsIGctPiBvYl9nZW5lcmljLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF9mb3Jtc19JTmkgKGZsX2Rlc2VsZWN0X2Jyb3dzZXJfbGluZSwgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZGVzZWxlY3RfYnJvd3NlciAoZ2VuZXJpY29iamVjdCAqZykKIHsKLQlyZXR1cm4gZ2VuZXJpY19jYWxsIChnLCBmbF9kZXNlbGVjdF9icm93c2VyKTsKKyAgICByZXR1cm4gZ2VuZXJpY19jYWxsIChnLCBmbF9kZXNlbGVjdF9icm93c2VyKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGlzc2VsZWN0ZWRfYnJvd3Nlcl9saW5lIChnZW5lcmljb2JqZWN0ICpnLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgaSwgajsKLQkKLQlpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICJpIiwgJmkpKQotCQlyZXR1cm4gTlVMTDsKLQkKLQlqID0gZmxfaXNzZWxlY3RlZF9icm93c2VyX2xpbmUgKGctPm9iX2dlbmVyaWMsIGkpOwotCQotCXJldHVybiBQeUludF9Gcm9tTG9uZyAoaik7CisgICAgaW50IGksIGo7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICJpIiwgJmkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGogPSBmbF9pc3NlbGVjdGVkX2Jyb3dzZXJfbGluZSAoZy0+b2JfZ2VuZXJpYywgaSk7CisKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcgKGopOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZ2V0X2Jyb3dzZXIgKGdlbmVyaWNvYmplY3QgKmcpCiB7Ci0JcmV0dXJuIGNhbGxfZm9ybXNfUmkgKGZsX2dldF9icm93c2VyLCBnLT4gb2JfZ2VuZXJpYyk7CisgICAgcmV0dXJuIGNhbGxfZm9ybXNfUmkgKGZsX2dldF9icm93c2VyLCBnLT4gb2JfZ2VuZXJpYyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZXRfYnJvd3Nlcl9mb250c2l6ZSAoZ2VuZXJpY29iamVjdCAqZywgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfZm9ybXNfSU5mIChmbF9zZXRfYnJvd3Nlcl9mb250c2l6ZSwgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX2Zvcm1zX0lOZiAoZmxfc2V0X2Jyb3dzZXJfZm9udHNpemUsIGctPiBvYl9nZW5lcmljLCBhcmdzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNldF9icm93c2VyX2ZvbnRzdHlsZSAoZ2VuZXJpY29iamVjdCAqZywgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfZm9ybXNfSU5pIChmbF9zZXRfYnJvd3Nlcl9mb250c3R5bGUsIGctPiBvYl9nZW5lcmljLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF9mb3Jtc19JTmkgKGZsX3NldF9icm93c2VyX2ZvbnRzdHlsZSwgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc2V0X2Jyb3dzZXJfc3BlY2lhbGtleSAoZ2VuZXJpY29iamVjdCAqZywgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfZm9ybXNfSU5jKGZsX3NldF9icm93c2VyX3NwZWNpYWxrZXksIGctPiBvYl9nZW5lcmljLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF9mb3Jtc19JTmMoZmxfc2V0X2Jyb3dzZXJfc3BlY2lhbGtleSwgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgYnJvd3Nlcl9tZXRob2RzW10gPSB7Ci0JeyJzZXRfYnJvd3Nlcl90b3BsaW5lIiwJCShQeUNGdW5jdGlvbilzZXRfYnJvd3Nlcl90b3BsaW5lLAotCSBNRVRIX09MREFSR1N9LAotCXsiY2xlYXJfYnJvd3NlciIsCQkoUHlDRnVuY3Rpb24pY2xlYXJfYnJvd3NlciwKLQkgTUVUSF9OT0FSR1N9LAotCXsiYWRkX2Jyb3dzZXJfbGluZSIsCQkoUHlDRnVuY3Rpb24pYWRkX2Jyb3dzZXJfbGluZSwKLQkgTUVUSF9PTERBUkdTfSwKLQl7ImFkZHRvX2Jyb3dzZXIiLAkJKFB5Q0Z1bmN0aW9uKWFkZHRvX2Jyb3dzZXIsCi0JIE1FVEhfT0xEQVJHU30sCi0JeyJpbnNlcnRfYnJvd3Nlcl9saW5lIiwJCShQeUNGdW5jdGlvbilpbnNlcnRfYnJvd3Nlcl9saW5lLAotCSBNRVRIX09MREFSR1N9LAotCXsiZGVsZXRlX2Jyb3dzZXJfbGluZSIsCQkoUHlDRnVuY3Rpb24pZGVsZXRlX2Jyb3dzZXJfbGluZSwKLQkgTUVUSF9PTERBUkdTfSwKLQl7InJlcGxhY2VfYnJvd3Nlcl9saW5lIiwJKFB5Q0Z1bmN0aW9uKXJlcGxhY2VfYnJvd3Nlcl9saW5lLAotCSBNRVRIX09MREFSR1N9LAotCXsiZ2V0X2Jyb3dzZXJfbGluZSIsCQkoUHlDRnVuY3Rpb24pZ2V0X2Jyb3dzZXJfbGluZSwKLQkgTUVUSF9PTERBUkdTfSwKLQl7ImxvYWRfYnJvd3NlciIsCQkoUHlDRnVuY3Rpb24pbG9hZF9icm93c2VyLAotCSBNRVRIX09MREFSR1N9LAotCXsiZ2V0X2Jyb3dzZXJfbWF4bGluZSIsCQkoUHlDRnVuY3Rpb24pZ2V0X2Jyb3dzZXJfbWF4bGluZSwKLQkgTUVUSF9OT0FSR1MsfQotCXsic2VsZWN0X2Jyb3dzZXJfbGluZSIsCQkoUHlDRnVuY3Rpb24pc2VsZWN0X2Jyb3dzZXJfbGluZSwKLQkgTUVUSF9PTERBUkdTfSwKLQl7ImRlc2VsZWN0X2Jyb3dzZXJfbGluZSIsCShQeUNGdW5jdGlvbilkZXNlbGVjdF9icm93c2VyX2xpbmUsCi0JIE1FVEhfT0xEQVJHU30sCi0JeyJkZXNlbGVjdF9icm93c2VyIiwJCShQeUNGdW5jdGlvbilkZXNlbGVjdF9icm93c2VyLAotCSBNRVRIX05PQVJHUyx9Ci0JeyJpc3NlbGVjdGVkX2Jyb3dzZXJfbGluZSIsCShQeUNGdW5jdGlvbilpc3NlbGVjdGVkX2Jyb3dzZXJfbGluZSwKLQkgTUVUSF9PTERBUkdTfSwKLQl7ImdldF9icm93c2VyIiwJCQkoUHlDRnVuY3Rpb24pZ2V0X2Jyb3dzZXIsCi0JIE1FVEhfTk9BUkdTLH0KLQl7InNldF9icm93c2VyX2ZvbnRzaXplIiwJKFB5Q0Z1bmN0aW9uKXNldF9icm93c2VyX2ZvbnRzaXplLAotCSBNRVRIX09MREFSR1N9LAotCXsic2V0X2Jyb3dzZXJfZm9udHN0eWxlIiwJKFB5Q0Z1bmN0aW9uKXNldF9icm93c2VyX2ZvbnRzdHlsZSwKLQkgTUVUSF9PTERBUkdTfSwKLQl7InNldF9icm93c2VyX3NwZWNpYWxrZXkiLAkoUHlDRnVuY3Rpb24pc2V0X2Jyb3dzZXJfc3BlY2lhbGtleSwKLQkgTUVUSF9PTERBUkdTfSwKLQl7TlVMTCwJCQkJTlVMTH0JCS8qIHNlbnRpbmVsICovCisgICAgeyJzZXRfYnJvd3Nlcl90b3BsaW5lIiwgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXNldF9icm93c2VyX3RvcGxpbmUsCisgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJjbGVhcl9icm93c2VyIiwgICAgICAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWNsZWFyX2Jyb3dzZXIsCisgICAgIE1FVEhfTk9BUkdTfSwKKyAgICB7ImFkZF9icm93c2VyX2xpbmUiLCAgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pYWRkX2Jyb3dzZXJfbGluZSwKKyAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImFkZHRvX2Jyb3dzZXIiLCAgICAgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pYWRkdG9fYnJvd3NlciwKKyAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7Imluc2VydF9icm93c2VyX2xpbmUiLCAgICAgICAgICAgICAoUHlDRnVuY3Rpb24paW5zZXJ0X2Jyb3dzZXJfbGluZSwKKyAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImRlbGV0ZV9icm93c2VyX2xpbmUiLCAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pZGVsZXRlX2Jyb3dzZXJfbGluZSwKKyAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InJlcGxhY2VfYnJvd3Nlcl9saW5lIiwgICAgICAgICAgICAoUHlDRnVuY3Rpb24pcmVwbGFjZV9icm93c2VyX2xpbmUsCisgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJnZXRfYnJvd3Nlcl9saW5lIiwgICAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWdldF9icm93c2VyX2xpbmUsCisgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJsb2FkX2Jyb3dzZXIiLCAgICAgICAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWxvYWRfYnJvd3NlciwKKyAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldF9icm93c2VyX21heGxpbmUiLCAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pZ2V0X2Jyb3dzZXJfbWF4bGluZSwKKyAgICAgTUVUSF9OT0FSR1MsfQorICAgIHsic2VsZWN0X2Jyb3dzZXJfbGluZSIsICAgICAgICAgICAgIChQeUNGdW5jdGlvbilzZWxlY3RfYnJvd3Nlcl9saW5lLAorICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiZGVzZWxlY3RfYnJvd3Nlcl9saW5lIiwgICAgICAgICAgIChQeUNGdW5jdGlvbilkZXNlbGVjdF9icm93c2VyX2xpbmUsCisgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJkZXNlbGVjdF9icm93c2VyIiwgICAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWRlc2VsZWN0X2Jyb3dzZXIsCisgICAgIE1FVEhfTk9BUkdTLH0KKyAgICB7Imlzc2VsZWN0ZWRfYnJvd3Nlcl9saW5lIiwgICAgICAgICAoUHlDRnVuY3Rpb24paXNzZWxlY3RlZF9icm93c2VyX2xpbmUsCisgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJnZXRfYnJvd3NlciIsICAgICAgICAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWdldF9icm93c2VyLAorICAgICBNRVRIX05PQVJHUyx9CisgICAgeyJzZXRfYnJvd3Nlcl9mb250c2l6ZSIsICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXNldF9icm93c2VyX2ZvbnRzaXplLAorICAgICBNRVRIX09MREFSR1N9LAorICAgIHsic2V0X2Jyb3dzZXJfZm9udHN0eWxlIiwgICAgICAgICAgIChQeUNGdW5jdGlvbilzZXRfYnJvd3Nlcl9mb250c3R5bGUsCisgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJzZXRfYnJvd3Nlcl9zcGVjaWFsa2V5IiwgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXNldF9icm93c2VyX3NwZWNpYWxrZXksCisgICAgIE1FVEhfT0xEQVJHU30sCisgICAge05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiAvKiBDbGFzczogYnV0dG9uICovCkBAIC03NDUsMzMgKzc0NSwzMyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNldF9idXR0b24oZ2VuZXJpY29iamVjdCAqZywgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfZm9ybXNfSU5pIChmbF9zZXRfYnV0dG9uLCBnLT4gb2JfZ2VuZXJpYywgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfZm9ybXNfSU5pIChmbF9zZXRfYnV0dG9uLCBnLT4gb2JfZ2VuZXJpYywgYXJncyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZXRfYnV0dG9uKGdlbmVyaWNvYmplY3QgKmcpCiB7Ci0JcmV0dXJuIGNhbGxfZm9ybXNfUmkgKGZsX2dldF9idXR0b24sIGctPiBvYl9nZW5lcmljKTsKKyAgICByZXR1cm4gY2FsbF9mb3Jtc19SaSAoZmxfZ2V0X2J1dHRvbiwgZy0+IG9iX2dlbmVyaWMpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZ2V0X2J1dHRvbl9udW1iKGdlbmVyaWNvYmplY3QgKmcpCiB7Ci0JcmV0dXJuIGNhbGxfZm9ybXNfUmkgKGZsX2dldF9idXR0b25fbnVtYiwgZy0+IG9iX2dlbmVyaWMpOworICAgIHJldHVybiBjYWxsX2Zvcm1zX1JpIChmbF9nZXRfYnV0dG9uX251bWIsIGctPiBvYl9nZW5lcmljKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNldF9idXR0b25fc2hvcnRjdXQoZ2VuZXJpY29iamVjdCAqZywgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfZm9ybXNfSU5zdHIgKGZsX3NldF9idXR0b25fc2hvcnRjdXQsIGctPiBvYl9nZW5lcmljLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF9mb3Jtc19JTnN0ciAoZmxfc2V0X2J1dHRvbl9zaG9ydGN1dCwgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgYnV0dG9uX21ldGhvZHNbXSA9IHsKLQl7InNldF9idXR0b24iLAkJKFB5Q0Z1bmN0aW9uKXNldF9idXR0b24sIE1FVEhfT0xEQVJHU30sCi0JeyJnZXRfYnV0dG9uIiwJCShQeUNGdW5jdGlvbilnZXRfYnV0dG9uLCBNRVRIX05PQVJHU30sCi0JeyJnZXRfYnV0dG9uX251bWIiLAkoUHlDRnVuY3Rpb24pZ2V0X2J1dHRvbl9udW1iLCBNRVRIX05PQVJHU30sCi0JeyJzZXRfYnV0dG9uX3Nob3J0Y3V0IiwJKFB5Q0Z1bmN0aW9uKXNldF9idXR0b25fc2hvcnRjdXQsIE1FVEhfT0xEQVJHU30sCi0Je05VTEwsCQkJTlVMTH0JCS8qIHNlbnRpbmVsICovCisgICAgeyJzZXRfYnV0dG9uIiwgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilzZXRfYnV0dG9uLCBNRVRIX09MREFSR1N9LAorICAgIHsiZ2V0X2J1dHRvbiIsICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pZ2V0X2J1dHRvbiwgTUVUSF9OT0FSR1N9LAorICAgIHsiZ2V0X2J1dHRvbl9udW1iIiwgICAgICAgICAoUHlDRnVuY3Rpb24pZ2V0X2J1dHRvbl9udW1iLCBNRVRIX05PQVJHU30sCisgICAgeyJzZXRfYnV0dG9uX3Nob3J0Y3V0IiwgICAgIChQeUNGdW5jdGlvbilzZXRfYnV0dG9uX3Nob3J0Y3V0LCBNRVRIX09MREFSR1N9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIC8qIENsYXNzOiBjaG9pY2UgKi8KQEAgLTc3OSw2OCArNzc5LDY4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc2V0X2Nob2ljZShnZW5lcmljb2JqZWN0ICpnLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gY2FsbF9mb3Jtc19JTmkgKGZsX3NldF9jaG9pY2UsIGctPiBvYl9nZW5lcmljLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF9mb3Jtc19JTmkgKGZsX3NldF9jaG9pY2UsIGctPiBvYl9nZW5lcmljLCBhcmdzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGdldF9jaG9pY2UoZ2VuZXJpY29iamVjdCAqZykKIHsKLQlyZXR1cm4gY2FsbF9mb3Jtc19SaSAoZmxfZ2V0X2Nob2ljZSwgZy0+IG9iX2dlbmVyaWMpOworICAgIHJldHVybiBjYWxsX2Zvcm1zX1JpIChmbF9nZXRfY2hvaWNlLCBnLT4gb2JfZ2VuZXJpYyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjbGVhcl9jaG9pY2UgKGdlbmVyaWNvYmplY3QgKmcpCiB7Ci0JcmV0dXJuIGdlbmVyaWNfY2FsbCAoZywgZmxfY2xlYXJfY2hvaWNlKTsKKyAgICByZXR1cm4gZ2VuZXJpY19jYWxsIChnLCBmbF9jbGVhcl9jaG9pY2UpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYWRkdG9fY2hvaWNlIChnZW5lcmljb2JqZWN0ICpnLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gY2FsbF9mb3Jtc19JTnN0ciAoZmxfYWRkdG9fY2hvaWNlLCBnLT4gb2JfZ2VuZXJpYywgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfZm9ybXNfSU5zdHIgKGZsX2FkZHRvX2Nob2ljZSwgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogcmVwbGFjZV9jaG9pY2UgKGdlbmVyaWNvYmplY3QgKmcsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX2Zvcm1zX0lOaUlOc3RyIChmbF9yZXBsYWNlX2Nob2ljZSwgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX2Zvcm1zX0lOaUlOc3RyIChmbF9yZXBsYWNlX2Nob2ljZSwgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZGVsZXRlX2Nob2ljZSAoZ2VuZXJpY29iamVjdCAqZywgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfZm9ybXNfSU5pIChmbF9kZWxldGVfY2hvaWNlLCBnLT4gb2JfZ2VuZXJpYywgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfZm9ybXNfSU5pIChmbF9kZWxldGVfY2hvaWNlLCBnLT4gb2JfZ2VuZXJpYywgYXJncyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZXRfY2hvaWNlX3RleHQgKGdlbmVyaWNvYmplY3QgKmcpCiB7Ci0JcmV0dXJuIGNhbGxfZm9ybXNfUnN0ciAoZmxfZ2V0X2Nob2ljZV90ZXh0LCBnLT4gb2JfZ2VuZXJpYyk7CisgICAgcmV0dXJuIGNhbGxfZm9ybXNfUnN0ciAoZmxfZ2V0X2Nob2ljZV90ZXh0LCBnLT4gb2JfZ2VuZXJpYyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZXRfY2hvaWNlX2ZvbnRzaXplIChnZW5lcmljb2JqZWN0ICpnLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gY2FsbF9mb3Jtc19JTmYgKGZsX3NldF9jaG9pY2VfZm9udHNpemUsIGctPiBvYl9nZW5lcmljLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF9mb3Jtc19JTmYgKGZsX3NldF9jaG9pY2VfZm9udHNpemUsIGctPiBvYl9nZW5lcmljLCBhcmdzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNldF9jaG9pY2VfZm9udHN0eWxlIChnZW5lcmljb2JqZWN0ICpnLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gY2FsbF9mb3Jtc19JTmkgKGZsX3NldF9jaG9pY2VfZm9udHN0eWxlLCBnLT4gb2JfZ2VuZXJpYywgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfZm9ybXNfSU5pIChmbF9zZXRfY2hvaWNlX2ZvbnRzdHlsZSwgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgY2hvaWNlX21ldGhvZHNbXSA9IHsKLQl7InNldF9jaG9pY2UiLAkJKFB5Q0Z1bmN0aW9uKXNldF9jaG9pY2UsICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImdldF9jaG9pY2UiLAkJKFB5Q0Z1bmN0aW9uKWdldF9jaG9pY2UsICAgICAgTUVUSF9OT0FSR1N9LAotCXsiY2xlYXJfY2hvaWNlIiwJKFB5Q0Z1bmN0aW9uKWNsZWFyX2Nob2ljZSwgICAgTUVUSF9OT0FSR1N9LAotCXsiYWRkdG9fY2hvaWNlIiwJKFB5Q0Z1bmN0aW9uKWFkZHRvX2Nob2ljZSwgICAgTUVUSF9PTERBUkdTfSwKLQl7InJlcGxhY2VfY2hvaWNlIiwJKFB5Q0Z1bmN0aW9uKXJlcGxhY2VfY2hvaWNlLCAgTUVUSF9PTERBUkdTfSwKLQl7ImRlbGV0ZV9jaG9pY2UiLAkoUHlDRnVuY3Rpb24pZGVsZXRlX2Nob2ljZSwgICBNRVRIX09MREFSR1N9LAotCXsiZ2V0X2Nob2ljZV90ZXh0IiwJKFB5Q0Z1bmN0aW9uKWdldF9jaG9pY2VfdGV4dCwgTUVUSF9OT0FSR1N9LAotCXsic2V0X2Nob2ljZV9mb250c2l6ZSIsIChQeUNGdW5jdGlvbilzZXRfY2hvaWNlX2ZvbnRzaXplLCBNRVRIX09MREFSR1N9LAotCXsic2V0X2Nob2ljZV9mb250c3R5bGUiLChQeUNGdW5jdGlvbilzZXRfY2hvaWNlX2ZvbnRzdHlsZSwgTUVUSF9PTERBUkdTfSwKLQl7TlVMTCwJCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7InNldF9jaG9pY2UiLCAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXNldF9jaG9pY2UsICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldF9jaG9pY2UiLCAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWdldF9jaG9pY2UsICAgICAgTUVUSF9OT0FSR1N9LAorICAgIHsiY2xlYXJfY2hvaWNlIiwgICAgICAgICAgICAoUHlDRnVuY3Rpb24pY2xlYXJfY2hvaWNlLCAgICBNRVRIX05PQVJHU30sCisgICAgeyJhZGR0b19jaG9pY2UiLCAgICAgICAgICAgIChQeUNGdW5jdGlvbilhZGR0b19jaG9pY2UsICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJyZXBsYWNlX2Nob2ljZSIsICAgICAgICAgIChQeUNGdW5jdGlvbilyZXBsYWNlX2Nob2ljZSwgIE1FVEhfT0xEQVJHU30sCisgICAgeyJkZWxldGVfY2hvaWNlIiwgICAgICAgICAgIChQeUNGdW5jdGlvbilkZWxldGVfY2hvaWNlLCAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJnZXRfY2hvaWNlX3RleHQiLCAgICAgICAgIChQeUNGdW5jdGlvbilnZXRfY2hvaWNlX3RleHQsIE1FVEhfTk9BUkdTfSwKKyAgICB7InNldF9jaG9pY2VfZm9udHNpemUiLCAoUHlDRnVuY3Rpb24pc2V0X2Nob2ljZV9mb250c2l6ZSwgTUVUSF9PTERBUkdTfSwKKyAgICB7InNldF9jaG9pY2VfZm9udHN0eWxlIiwoUHlDRnVuY3Rpb24pc2V0X2Nob2ljZV9mb250c3R5bGUsIE1FVEhfT0xEQVJHU30sCisgICAge05VTEwsICAgICAgICAgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogLyogQ2xhc3MgOiBDbG9jayAqLwpAQCAtODQ4LDE2ICs4NDgsMTYgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZXRfY2xvY2soZ2VuZXJpY29iamVjdCAqZykKIHsKLQlpbnQgaTAsIGkxLCBpMjsKKyAgICBpbnQgaTAsIGkxLCBpMjsKIAotCWZsX2dldF9jbG9jayAoZy0+b2JfZ2VuZXJpYywgJmkwLCAmaTEsICZpMik7CisgICAgZmxfZ2V0X2Nsb2NrIChnLT5vYl9nZW5lcmljLCAmaTAsICZpMSwgJmkyKTsKIAotCXJldHVybiBQeV9CdWlsZFZhbHVlKCIoaWlpKSIsIGkwLCBpMSwgaTIpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIoaWlpKSIsIGkwLCBpMSwgaTIpOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgY2xvY2tfbWV0aG9kc1tdID0gewotCXsiZ2V0X2Nsb2NrIiwJCShQeUNGdW5jdGlvbilnZXRfY2xvY2ssIE1FVEhfTk9BUkdTfSwKLQl7TlVMTCwJCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7ImdldF9jbG9jayIsICAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWdldF9jbG9jaywgTUVUSF9OT0FSR1N9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIC8qIENMYXNzIDogQ291bnRlcnMgKi8KQEAgLTg2NSw1MyArODY1LDUzIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2V0X2NvdW50ZXJfdmFsdWUoZ2VuZXJpY29iamVjdCAqZykKIHsKLQlyZXR1cm4gY2FsbF9mb3Jtc19SZiAoZmxfZ2V0X2NvdW50ZXJfdmFsdWUsIGctPiBvYl9nZW5lcmljKTsKKyAgICByZXR1cm4gY2FsbF9mb3Jtc19SZiAoZmxfZ2V0X2NvdW50ZXJfdmFsdWUsIGctPiBvYl9nZW5lcmljKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNldF9jb3VudGVyX3ZhbHVlIChnZW5lcmljb2JqZWN0ICpnLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gY2FsbF9mb3Jtc19JTmYgKGZsX3NldF9jb3VudGVyX3ZhbHVlLCBnLT4gb2JfZ2VuZXJpYywgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfZm9ybXNfSU5mIChmbF9zZXRfY291bnRlcl92YWx1ZSwgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc2V0X2NvdW50ZXJfcHJlY2lzaW9uIChnZW5lcmljb2JqZWN0ICpnLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gY2FsbF9mb3Jtc19JTmkgKGZsX3NldF9jb3VudGVyX3ByZWNpc2lvbiwgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX2Zvcm1zX0lOaSAoZmxfc2V0X2NvdW50ZXJfcHJlY2lzaW9uLCBnLT4gb2JfZ2VuZXJpYywgYXJncyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZXRfY291bnRlcl9ib3VuZHMgKGdlbmVyaWNvYmplY3QgKmcsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX2Zvcm1zX0lOZklOZiAoZmxfc2V0X2NvdW50ZXJfYm91bmRzLCBnLT4gb2JfZ2VuZXJpYywgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfZm9ybXNfSU5mSU5mIChmbF9zZXRfY291bnRlcl9ib3VuZHMsIGctPiBvYl9nZW5lcmljLCBhcmdzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNldF9jb3VudGVyX3N0ZXAgKGdlbmVyaWNvYmplY3QgKmcsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX2Zvcm1zX0lOZklOZiAoZmxfc2V0X2NvdW50ZXJfc3RlcCwgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX2Zvcm1zX0lOZklOZiAoZmxfc2V0X2NvdW50ZXJfc3RlcCwgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc2V0X2NvdW50ZXJfcmV0dXJuIChnZW5lcmljb2JqZWN0ICpnLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gY2FsbF9mb3Jtc19JTmkgKGZsX3NldF9jb3VudGVyX3JldHVybiwgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX2Zvcm1zX0lOaSAoZmxfc2V0X2NvdW50ZXJfcmV0dXJuLCBnLT4gb2JfZ2VuZXJpYywgYXJncyk7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBjb3VudGVyX21ldGhvZHNbXSA9IHsKLQl7InNldF9jb3VudGVyX3ZhbHVlIiwJCShQeUNGdW5jdGlvbilzZXRfY291bnRlcl92YWx1ZSwKLQkgTUVUSF9PTERBUkdTfSwKLQl7ImdldF9jb3VudGVyX3ZhbHVlIiwJCShQeUNGdW5jdGlvbilnZXRfY291bnRlcl92YWx1ZSwKLQkgTUVUSF9OT0FSR1N9LAotCXsic2V0X2NvdW50ZXJfYm91bmRzIiwJCShQeUNGdW5jdGlvbilzZXRfY291bnRlcl9ib3VuZHMsCi0JIE1FVEhfT0xEQVJHU30sCi0JeyJzZXRfY291bnRlcl9zdGVwIiwJCShQeUNGdW5jdGlvbilzZXRfY291bnRlcl9zdGVwLAotCSBNRVRIX09MREFSR1N9LAotCXsic2V0X2NvdW50ZXJfcHJlY2lzaW9uIiwJKFB5Q0Z1bmN0aW9uKXNldF9jb3VudGVyX3ByZWNpc2lvbiwKLQkgTUVUSF9PTERBUkdTfSwKLQl7InNldF9jb3VudGVyX3JldHVybiIsCQkoUHlDRnVuY3Rpb24pc2V0X2NvdW50ZXJfcmV0dXJuLAotCSBNRVRIX09MREFSR1N9LAotCXtOVUxMLAkJCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7InNldF9jb3VudGVyX3ZhbHVlIiwgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pc2V0X2NvdW50ZXJfdmFsdWUsCisgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJnZXRfY291bnRlcl92YWx1ZSIsICAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWdldF9jb3VudGVyX3ZhbHVlLAorICAgICBNRVRIX05PQVJHU30sCisgICAgeyJzZXRfY291bnRlcl9ib3VuZHMiLCAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXNldF9jb3VudGVyX2JvdW5kcywKKyAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InNldF9jb3VudGVyX3N0ZXAiLCAgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pc2V0X2NvdW50ZXJfc3RlcCwKKyAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InNldF9jb3VudGVyX3ByZWNpc2lvbiIsICAgICAgICAgICAoUHlDRnVuY3Rpb24pc2V0X2NvdW50ZXJfcHJlY2lzaW9uLAorICAgICBNRVRIX09MREFSR1N9LAorICAgIHsic2V0X2NvdW50ZXJfcmV0dXJuIiwgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilzZXRfY291bnRlcl9yZXR1cm4sCisgICAgIE1FVEhfT0xEQVJHU30sCisgICAge05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiAKQEAgLTkyMCw0MCArOTIwLDQwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2V0X2RpYWxfdmFsdWUoZ2VuZXJpY29iamVjdCAqZykKIHsKLQlyZXR1cm4gY2FsbF9mb3Jtc19SZiAoZmxfZ2V0X2RpYWxfdmFsdWUsIGctPiBvYl9nZW5lcmljKTsKKyAgICByZXR1cm4gY2FsbF9mb3Jtc19SZiAoZmxfZ2V0X2RpYWxfdmFsdWUsIGctPiBvYl9nZW5lcmljKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNldF9kaWFsX3ZhbHVlIChnZW5lcmljb2JqZWN0ICpnLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gY2FsbF9mb3Jtc19JTmYgKGZsX3NldF9kaWFsX3ZhbHVlLCBnLT4gb2JfZ2VuZXJpYywgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfZm9ybXNfSU5mIChmbF9zZXRfZGlhbF92YWx1ZSwgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc2V0X2RpYWxfYm91bmRzIChnZW5lcmljb2JqZWN0ICpnLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gY2FsbF9mb3Jtc19JTmZJTmYgKGZsX3NldF9kaWFsX2JvdW5kcywgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX2Zvcm1zX0lOZklOZiAoZmxfc2V0X2RpYWxfYm91bmRzLCBnLT4gb2JfZ2VuZXJpYywgYXJncyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZXRfZGlhbF9ib3VuZHMgKGdlbmVyaWNvYmplY3QgKmcpCiB7Ci0JcmV0dXJuIGNhbGxfZm9ybXNfT1VUZk9VVGYgKGZsX2dldF9kaWFsX2JvdW5kcywgZy0+IG9iX2dlbmVyaWMpOworICAgIHJldHVybiBjYWxsX2Zvcm1zX09VVGZPVVRmIChmbF9nZXRfZGlhbF9ib3VuZHMsIGctPiBvYl9nZW5lcmljKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNldF9kaWFsX3N0ZXAgKGdlbmVyaWNvYmplY3QgKmcsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX2Zvcm1zX0lOZiAoZmxfc2V0X2RpYWxfc3RlcCwgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX2Zvcm1zX0lOZiAoZmxfc2V0X2RpYWxfc3RlcCwgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgZGlhbF9tZXRob2RzW10gPSB7Ci0JeyJzZXRfZGlhbF92YWx1ZSIsCShQeUNGdW5jdGlvbilzZXRfZGlhbF92YWx1ZSwgIE1FVEhfT0xEQVJHU30sCi0JeyJnZXRfZGlhbF92YWx1ZSIsCShQeUNGdW5jdGlvbilnZXRfZGlhbF92YWx1ZSwgIE1FVEhfTk9BUkdTfSwKLQl7InNldF9kaWFsX2JvdW5kcyIsCShQeUNGdW5jdGlvbilzZXRfZGlhbF9ib3VuZHMsIE1FVEhfT0xEQVJHU30sCi0JeyJnZXRfZGlhbF9ib3VuZHMiLAkoUHlDRnVuY3Rpb24pZ2V0X2RpYWxfYm91bmRzLCBNRVRIX05PQVJHU30sCi0JeyJzZXRfZGlhbF9zdGVwIiwJKFB5Q0Z1bmN0aW9uKXNldF9kaWFsX3N0ZXAsICAgTUVUSF9PTERBUkdTfSwKLQl7TlVMTCwJCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7InNldF9kaWFsX3ZhbHVlIiwgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXNldF9kaWFsX3ZhbHVlLCAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldF9kaWFsX3ZhbHVlIiwgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWdldF9kaWFsX3ZhbHVlLCAgTUVUSF9OT0FSR1N9LAorICAgIHsic2V0X2RpYWxfYm91bmRzIiwgICAgICAgICAoUHlDRnVuY3Rpb24pc2V0X2RpYWxfYm91bmRzLCBNRVRIX09MREFSR1N9LAorICAgIHsiZ2V0X2RpYWxfYm91bmRzIiwgICAgICAgICAoUHlDRnVuY3Rpb24pZ2V0X2RpYWxfYm91bmRzLCBNRVRIX05PQVJHU30sCisgICAgeyJzZXRfZGlhbF9zdGVwIiwgICAgICAgICAgIChQeUNGdW5jdGlvbilzZXRfZGlhbF9zdGVwLCAgIE1FVEhfT0xEQVJHU30sCisgICAge05VTEwsICAgICAgICAgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogLyogQ2xhc3MgOiBJbnB1dCAqLwpAQCAtOTYxLDMzICs5NjEsMzMgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZXRfaW5wdXQgKGdlbmVyaWNvYmplY3QgKmcsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX2Zvcm1zX0lOc3RyIChmbF9zZXRfaW5wdXQsIGctPiBvYl9nZW5lcmljLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF9mb3Jtc19JTnN0ciAoZmxfc2V0X2lucHV0LCBnLT4gb2JfZ2VuZXJpYywgYXJncyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZXRfaW5wdXQgKGdlbmVyaWNvYmplY3QgKmcpCiB7Ci0JcmV0dXJuIGNhbGxfZm9ybXNfUnN0ciAoZmxfZ2V0X2lucHV0LCBnLT4gb2JfZ2VuZXJpYyk7CisgICAgcmV0dXJuIGNhbGxfZm9ybXNfUnN0ciAoZmxfZ2V0X2lucHV0LCBnLT4gb2JfZ2VuZXJpYyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZXRfaW5wdXRfY29sb3IgKGdlbmVyaWNvYmplY3QgKmcsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX2Zvcm1zX0lOZklOZiAoZmxfc2V0X2lucHV0X2NvbG9yLCBnLT4gb2JfZ2VuZXJpYywgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfZm9ybXNfSU5mSU5mIChmbF9zZXRfaW5wdXRfY29sb3IsIGctPiBvYl9nZW5lcmljLCBhcmdzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNldF9pbnB1dF9yZXR1cm4gKGdlbmVyaWNvYmplY3QgKmcsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX2Zvcm1zX0lOaSAoZmxfc2V0X2lucHV0X3JldHVybiwgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX2Zvcm1zX0lOaSAoZmxfc2V0X2lucHV0X3JldHVybiwgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgaW5wdXRfbWV0aG9kc1tdID0gewotCXsic2V0X2lucHV0IiwJCShQeUNGdW5jdGlvbilzZXRfaW5wdXQsICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiZ2V0X2lucHV0IiwJCShQeUNGdW5jdGlvbilnZXRfaW5wdXQsICAgICAgICBNRVRIX05PQVJHU30sCi0JeyJzZXRfaW5wdXRfY29sb3IiLAkoUHlDRnVuY3Rpb24pc2V0X2lucHV0X2NvbG9yLCAgTUVUSF9PTERBUkdTfSwKLQl7InNldF9pbnB1dF9yZXR1cm4iLAkoUHlDRnVuY3Rpb24pc2V0X2lucHV0X3JldHVybiwgTUVUSF9PTERBUkdTfSwKLQl7TlVMTCwJCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7InNldF9pbnB1dCIsICAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXNldF9pbnB1dCwgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJnZXRfaW5wdXQiLCAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilnZXRfaW5wdXQsICAgICAgICBNRVRIX05PQVJHU30sCisgICAgeyJzZXRfaW5wdXRfY29sb3IiLCAgICAgICAgIChQeUNGdW5jdGlvbilzZXRfaW5wdXRfY29sb3IsICBNRVRIX09MREFSR1N9LAorICAgIHsic2V0X2lucHV0X3JldHVybiIsICAgICAgICAoUHlDRnVuY3Rpb24pc2V0X2lucHV0X3JldHVybiwgTUVUSF9PTERBUkdTfSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiAKQEAgLTk5NiwzNSArOTk2LDM1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc2V0X21lbnUgKGdlbmVyaWNvYmplY3QgKmcsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX2Zvcm1zX0lOc3RyIChmbF9zZXRfbWVudSwgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX2Zvcm1zX0lOc3RyIChmbF9zZXRfbWVudSwgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZ2V0X21lbnUgKGdlbmVyaWNvYmplY3QgKmcpCiB7Ci0JLyogWFhYIHN0cmljdGx5IHNwZWFraW5nIHRoaXMgaXMgd3Jvbmcgc2luY2UgZmxfZ2V0X21lbnUKLQkgICBYWFggcmV0dXJucyBsb25nLCBub3QgaW50ICovCi0JcmV0dXJuIGNhbGxfZm9ybXNfUmkgKGZsX2dldF9tZW51LCBnLT4gb2JfZ2VuZXJpYyk7CisgICAgLyogWFhYIHN0cmljdGx5IHNwZWFraW5nIHRoaXMgaXMgd3Jvbmcgc2luY2UgZmxfZ2V0X21lbnUKKyAgICAgICBYWFggcmV0dXJucyBsb25nLCBub3QgaW50ICovCisgICAgcmV0dXJuIGNhbGxfZm9ybXNfUmkgKGZsX2dldF9tZW51LCBnLT4gb2JfZ2VuZXJpYyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZXRfbWVudV90ZXh0IChnZW5lcmljb2JqZWN0ICpnKQogewotCXJldHVybiBjYWxsX2Zvcm1zX1JzdHIgKGZsX2dldF9tZW51X3RleHQsIGctPiBvYl9nZW5lcmljKTsKKyAgICByZXR1cm4gY2FsbF9mb3Jtc19Sc3RyIChmbF9nZXRfbWVudV90ZXh0LCBnLT4gb2JfZ2VuZXJpYyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhZGR0b19tZW51IChnZW5lcmljb2JqZWN0ICpnLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gY2FsbF9mb3Jtc19JTnN0ciAoZmxfYWRkdG9fbWVudSwgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX2Zvcm1zX0lOc3RyIChmbF9hZGR0b19tZW51LCBnLT4gb2JfZ2VuZXJpYywgYXJncyk7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBtZW51X21ldGhvZHNbXSA9IHsKLQl7InNldF9tZW51IiwJCShQeUNGdW5jdGlvbilzZXRfbWVudSwgICAgICBNRVRIX09MREFSR1N9LAotCXsiZ2V0X21lbnUiLAkJKFB5Q0Z1bmN0aW9uKWdldF9tZW51LCAgICAgIE1FVEhfTk9BUkdTfSwKLQl7ImdldF9tZW51X3RleHQiLAkoUHlDRnVuY3Rpb24pZ2V0X21lbnVfdGV4dCwgTUVUSF9OT0FSR1N9LAotCXsiYWRkdG9fbWVudSIsCQkoUHlDRnVuY3Rpb24pYWRkdG9fbWVudSwgICAgTUVUSF9PTERBUkdTfSwKLQl7TlVMTCwJCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7InNldF9tZW51IiwgICAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXNldF9tZW51LCAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJnZXRfbWVudSIsICAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilnZXRfbWVudSwgICAgICBNRVRIX05PQVJHU30sCisgICAgeyJnZXRfbWVudV90ZXh0IiwgICAgICAgICAgIChQeUNGdW5jdGlvbilnZXRfbWVudV90ZXh0LCBNRVRIX05PQVJHU30sCisgICAgeyJhZGR0b19tZW51IiwgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilhZGR0b19tZW51LCAgICBNRVRIX09MREFSR1N9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIApAQCAtMTAzMywxMzIgKzEwMzMsMTMyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2V0X3NsaWRlcl92YWx1ZShnZW5lcmljb2JqZWN0ICpnKQogewotCXJldHVybiBjYWxsX2Zvcm1zX1JmIChmbF9nZXRfc2xpZGVyX3ZhbHVlLCBnLT4gb2JfZ2VuZXJpYyk7CisgICAgcmV0dXJuIGNhbGxfZm9ybXNfUmYgKGZsX2dldF9zbGlkZXJfdmFsdWUsIGctPiBvYl9nZW5lcmljKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNldF9zbGlkZXJfdmFsdWUgKGdlbmVyaWNvYmplY3QgKmcsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX2Zvcm1zX0lOZiAoZmxfc2V0X3NsaWRlcl92YWx1ZSwgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX2Zvcm1zX0lOZiAoZmxfc2V0X3NsaWRlcl92YWx1ZSwgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc2V0X3NsaWRlcl9ib3VuZHMgKGdlbmVyaWNvYmplY3QgKmcsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX2Zvcm1zX0lOZklOZiAoZmxfc2V0X3NsaWRlcl9ib3VuZHMsIGctPiBvYl9nZW5lcmljLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF9mb3Jtc19JTmZJTmYgKGZsX3NldF9zbGlkZXJfYm91bmRzLCBnLT4gb2JfZ2VuZXJpYywgYXJncyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZXRfc2xpZGVyX2JvdW5kcyAoZ2VuZXJpY29iamVjdCAqZykKIHsKLQlyZXR1cm4gY2FsbF9mb3Jtc19PVVRmT1VUZihmbF9nZXRfc2xpZGVyX2JvdW5kcywgZy0+IG9iX2dlbmVyaWMpOworICAgIHJldHVybiBjYWxsX2Zvcm1zX09VVGZPVVRmKGZsX2dldF9zbGlkZXJfYm91bmRzLCBnLT4gb2JfZ2VuZXJpYyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZXRfc2xpZGVyX3JldHVybiAoZ2VuZXJpY29iamVjdCAqZywgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfZm9ybXNfSU5mIChmbF9zZXRfc2xpZGVyX3JldHVybiwgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX2Zvcm1zX0lOZiAoZmxfc2V0X3NsaWRlcl9yZXR1cm4sIGctPiBvYl9nZW5lcmljLCBhcmdzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNldF9zbGlkZXJfc2l6ZSAoZ2VuZXJpY29iamVjdCAqZywgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfZm9ybXNfSU5mIChmbF9zZXRfc2xpZGVyX3NpemUsIGctPiBvYl9nZW5lcmljLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF9mb3Jtc19JTmYgKGZsX3NldF9zbGlkZXJfc2l6ZSwgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc2V0X3NsaWRlcl9wcmVjaXNpb24gKGdlbmVyaWNvYmplY3QgKmcsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX2Zvcm1zX0lOaSAoZmxfc2V0X3NsaWRlcl9wcmVjaXNpb24sIGctPiBvYl9nZW5lcmljLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF9mb3Jtc19JTmkgKGZsX3NldF9zbGlkZXJfcHJlY2lzaW9uLCBnLT4gb2JfZ2VuZXJpYywgYXJncyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZXRfc2xpZGVyX3N0ZXAgKGdlbmVyaWNvYmplY3QgKmcsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX2Zvcm1zX0lOZiAoZmxfc2V0X3NsaWRlcl9zdGVwLCBnLT4gb2JfZ2VuZXJpYywgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfZm9ybXNfSU5mIChmbF9zZXRfc2xpZGVyX3N0ZXAsIGctPiBvYl9nZW5lcmljLCBhcmdzKTsKIH0KIAogCiBzdGF0aWMgUHlNZXRob2REZWYgc2xpZGVyX21ldGhvZHNbXSA9IHsKLQl7InNldF9zbGlkZXJfdmFsdWUiLAkoUHlDRnVuY3Rpb24pc2V0X3NsaWRlcl92YWx1ZSwgIE1FVEhfT0xEQVJHU30sCi0JeyJnZXRfc2xpZGVyX3ZhbHVlIiwJKFB5Q0Z1bmN0aW9uKWdldF9zbGlkZXJfdmFsdWUsICBNRVRIX05PQVJHU30sCi0JeyJzZXRfc2xpZGVyX2JvdW5kcyIsCShQeUNGdW5jdGlvbilzZXRfc2xpZGVyX2JvdW5kcywgTUVUSF9PTERBUkdTfSwKLQl7ImdldF9zbGlkZXJfYm91bmRzIiwJKFB5Q0Z1bmN0aW9uKWdldF9zbGlkZXJfYm91bmRzLCBNRVRIX05PQVJHU30sCi0JeyJzZXRfc2xpZGVyX3JldHVybiIsCShQeUNGdW5jdGlvbilzZXRfc2xpZGVyX3JldHVybiwgTUVUSF9PTERBUkdTfSwKLQl7InNldF9zbGlkZXJfc2l6ZSIsCShQeUNGdW5jdGlvbilzZXRfc2xpZGVyX3NpemUsICAgTUVUSF9PTERBUkdTfSwKLQl7InNldF9zbGlkZXJfcHJlY2lzaW9uIiwoUHlDRnVuY3Rpb24pc2V0X3NsaWRlcl9wcmVjaXNpb24sIE1FVEhfT0xEQVJHU30sCi0JeyJzZXRfc2xpZGVyX3N0ZXAiLAkoUHlDRnVuY3Rpb24pc2V0X3NsaWRlcl9zdGVwLCAgIE1FVEhfT0xEQVJHU30sCi0Je05VTEwsCQkJTlVMTH0JCS8qIHNlbnRpbmVsICovCisgICAgeyJzZXRfc2xpZGVyX3ZhbHVlIiwgICAgICAgIChQeUNGdW5jdGlvbilzZXRfc2xpZGVyX3ZhbHVlLCAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldF9zbGlkZXJfdmFsdWUiLCAgICAgICAgKFB5Q0Z1bmN0aW9uKWdldF9zbGlkZXJfdmFsdWUsICBNRVRIX05PQVJHU30sCisgICAgeyJzZXRfc2xpZGVyX2JvdW5kcyIsICAgICAgIChQeUNGdW5jdGlvbilzZXRfc2xpZGVyX2JvdW5kcywgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldF9zbGlkZXJfYm91bmRzIiwgICAgICAgKFB5Q0Z1bmN0aW9uKWdldF9zbGlkZXJfYm91bmRzLCBNRVRIX05PQVJHU30sCisgICAgeyJzZXRfc2xpZGVyX3JldHVybiIsICAgICAgIChQeUNGdW5jdGlvbilzZXRfc2xpZGVyX3JldHVybiwgTUVUSF9PTERBUkdTfSwKKyAgICB7InNldF9zbGlkZXJfc2l6ZSIsICAgICAgICAgKFB5Q0Z1bmN0aW9uKXNldF9zbGlkZXJfc2l6ZSwgICBNRVRIX09MREFSR1N9LAorICAgIHsic2V0X3NsaWRlcl9wcmVjaXNpb24iLChQeUNGdW5jdGlvbilzZXRfc2xpZGVyX3ByZWNpc2lvbiwgTUVUSF9PTERBUkdTfSwKKyAgICB7InNldF9zbGlkZXJfc3RlcCIsICAgICAgICAgKFB5Q0Z1bmN0aW9uKXNldF9zbGlkZXJfc3RlcCwgICBNRVRIX09MREFSR1N9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZXRfcG9zaXRpb25lcl94dmFsdWUgKGdlbmVyaWNvYmplY3QgKmcsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX2Zvcm1zX0lOZiAoZmxfc2V0X3Bvc2l0aW9uZXJfeHZhbHVlLCBnLT4gb2JfZ2VuZXJpYywgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfZm9ybXNfSU5mIChmbF9zZXRfcG9zaXRpb25lcl94dmFsdWUsIGctPiBvYl9nZW5lcmljLCBhcmdzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNldF9wb3NpdGlvbmVyX3hib3VuZHMgKGdlbmVyaWNvYmplY3QgKmcsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX2Zvcm1zX0lOZklOZiAoZmxfc2V0X3Bvc2l0aW9uZXJfeGJvdW5kcywKLQkJCQkgIGctPiBvYl9nZW5lcmljLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF9mb3Jtc19JTmZJTmYgKGZsX3NldF9wb3NpdGlvbmVyX3hib3VuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnLT4gb2JfZ2VuZXJpYywgYXJncyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZXRfcG9zaXRpb25lcl95dmFsdWUgKGdlbmVyaWNvYmplY3QgKmcsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX2Zvcm1zX0lOZiAoZmxfc2V0X3Bvc2l0aW9uZXJfeXZhbHVlLCBnLT4gb2JfZ2VuZXJpYywgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfZm9ybXNfSU5mIChmbF9zZXRfcG9zaXRpb25lcl95dmFsdWUsIGctPiBvYl9nZW5lcmljLCBhcmdzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNldF9wb3NpdGlvbmVyX3lib3VuZHMgKGdlbmVyaWNvYmplY3QgKmcsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX2Zvcm1zX0lOZklOZiAoZmxfc2V0X3Bvc2l0aW9uZXJfeWJvdW5kcywKLQkJCQkgIGctPiBvYl9nZW5lcmljLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF9mb3Jtc19JTmZJTmYgKGZsX3NldF9wb3NpdGlvbmVyX3lib3VuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnLT4gb2JfZ2VuZXJpYywgYXJncyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZXRfcG9zaXRpb25lcl94dmFsdWUgKGdlbmVyaWNvYmplY3QgKmcpCiB7Ci0JcmV0dXJuIGNhbGxfZm9ybXNfUmYgKGZsX2dldF9wb3NpdGlvbmVyX3h2YWx1ZSwgZy0+IG9iX2dlbmVyaWMpOworICAgIHJldHVybiBjYWxsX2Zvcm1zX1JmIChmbF9nZXRfcG9zaXRpb25lcl94dmFsdWUsIGctPiBvYl9nZW5lcmljKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGdldF9wb3NpdGlvbmVyX3hib3VuZHMgKGdlbmVyaWNvYmplY3QgKmcpCiB7Ci0JcmV0dXJuIGNhbGxfZm9ybXNfT1VUZk9VVGYgKGZsX2dldF9wb3NpdGlvbmVyX3hib3VuZHMsIGctPiBvYl9nZW5lcmljKTsKKyAgICByZXR1cm4gY2FsbF9mb3Jtc19PVVRmT1VUZiAoZmxfZ2V0X3Bvc2l0aW9uZXJfeGJvdW5kcywgZy0+IG9iX2dlbmVyaWMpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZ2V0X3Bvc2l0aW9uZXJfeXZhbHVlIChnZW5lcmljb2JqZWN0ICpnKQogewotCXJldHVybiBjYWxsX2Zvcm1zX1JmIChmbF9nZXRfcG9zaXRpb25lcl95dmFsdWUsIGctPiBvYl9nZW5lcmljKTsKKyAgICByZXR1cm4gY2FsbF9mb3Jtc19SZiAoZmxfZ2V0X3Bvc2l0aW9uZXJfeXZhbHVlLCBnLT4gb2JfZ2VuZXJpYyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZXRfcG9zaXRpb25lcl95Ym91bmRzIChnZW5lcmljb2JqZWN0ICpnKQogewotCXJldHVybiBjYWxsX2Zvcm1zX09VVGZPVVRmIChmbF9nZXRfcG9zaXRpb25lcl95Ym91bmRzLCBnLT4gb2JfZ2VuZXJpYyk7CisgICAgcmV0dXJuIGNhbGxfZm9ybXNfT1VUZk9VVGYgKGZsX2dldF9wb3NpdGlvbmVyX3lib3VuZHMsIGctPiBvYl9nZW5lcmljKTsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIHBvc2l0aW9uZXJfbWV0aG9kc1tdID0gewotCXsic2V0X3Bvc2l0aW9uZXJfeHZhbHVlIiwJKFB5Q0Z1bmN0aW9uKXNldF9wb3NpdGlvbmVyX3h2YWx1ZSwKLQkgTUVUSF9PTERBUkdTfSwKLQl7InNldF9wb3NpdGlvbmVyX3l2YWx1ZSIsCShQeUNGdW5jdGlvbilzZXRfcG9zaXRpb25lcl95dmFsdWUsCi0JIE1FVEhfT0xEQVJHU30sCi0JeyJzZXRfcG9zaXRpb25lcl94Ym91bmRzIiwJKFB5Q0Z1bmN0aW9uKXNldF9wb3NpdGlvbmVyX3hib3VuZHMsCi0JIE1FVEhfT0xEQVJHU30sCi0JeyJzZXRfcG9zaXRpb25lcl95Ym91bmRzIiwJKFB5Q0Z1bmN0aW9uKXNldF9wb3NpdGlvbmVyX3lib3VuZHMsCi0JIE1FVEhfT0xEQVJHU30sCi0JeyJnZXRfcG9zaXRpb25lcl94dmFsdWUiLAkoUHlDRnVuY3Rpb24pZ2V0X3Bvc2l0aW9uZXJfeHZhbHVlLAotCSBNRVRIX05PQVJHU30sCi0JeyJnZXRfcG9zaXRpb25lcl95dmFsdWUiLAkoUHlDRnVuY3Rpb24pZ2V0X3Bvc2l0aW9uZXJfeXZhbHVlLAotCSBNRVRIX05PQVJHU30sCi0JeyJnZXRfcG9zaXRpb25lcl94Ym91bmRzIiwJKFB5Q0Z1bmN0aW9uKWdldF9wb3NpdGlvbmVyX3hib3VuZHMsCi0JIE1FVEhfTk9BUkdTfSwKLQl7ImdldF9wb3NpdGlvbmVyX3lib3VuZHMiLAkoUHlDRnVuY3Rpb24pZ2V0X3Bvc2l0aW9uZXJfeWJvdW5kcywKLQkgTUVUSF9OT0FSR1N9LAotCXtOVUxMLAkJCU5VTEx9CQkvKiBzZW50aW5lbCAqLworICAgIHsic2V0X3Bvc2l0aW9uZXJfeHZhbHVlIiwgICAgICAgICAgIChQeUNGdW5jdGlvbilzZXRfcG9zaXRpb25lcl94dmFsdWUsCisgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJzZXRfcG9zaXRpb25lcl95dmFsdWUiLCAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXNldF9wb3NpdGlvbmVyX3l2YWx1ZSwKKyAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InNldF9wb3NpdGlvbmVyX3hib3VuZHMiLCAgICAgICAgICAoUHlDRnVuY3Rpb24pc2V0X3Bvc2l0aW9uZXJfeGJvdW5kcywKKyAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InNldF9wb3NpdGlvbmVyX3lib3VuZHMiLCAgICAgICAgICAoUHlDRnVuY3Rpb24pc2V0X3Bvc2l0aW9uZXJfeWJvdW5kcywKKyAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldF9wb3NpdGlvbmVyX3h2YWx1ZSIsICAgICAgICAgICAoUHlDRnVuY3Rpb24pZ2V0X3Bvc2l0aW9uZXJfeHZhbHVlLAorICAgICBNRVRIX05PQVJHU30sCisgICAgeyJnZXRfcG9zaXRpb25lcl95dmFsdWUiLCAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWdldF9wb3NpdGlvbmVyX3l2YWx1ZSwKKyAgICAgTUVUSF9OT0FSR1N9LAorICAgIHsiZ2V0X3Bvc2l0aW9uZXJfeGJvdW5kcyIsICAgICAgICAgIChQeUNGdW5jdGlvbilnZXRfcG9zaXRpb25lcl94Ym91bmRzLAorICAgICBNRVRIX05PQVJHU30sCisgICAgeyJnZXRfcG9zaXRpb25lcl95Ym91bmRzIiwgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWdldF9wb3NpdGlvbmVyX3lib3VuZHMsCisgICAgIE1FVEhfTk9BUkdTfSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiAvKiBDbGFzcyB0aW1lciAqLwpAQCAtMTE2NiwyNiArMTE2NiwyNiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNldF90aW1lciAoZ2VuZXJpY29iamVjdCAqZywgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfZm9ybXNfSU5mIChmbF9zZXRfdGltZXIsIGctPiBvYl9nZW5lcmljLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF9mb3Jtc19JTmYgKGZsX3NldF90aW1lciwgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZ2V0X3RpbWVyIChnZW5lcmljb2JqZWN0ICpnKQogewotCXJldHVybiBjYWxsX2Zvcm1zX1JmIChmbF9nZXRfdGltZXIsIGctPiBvYl9nZW5lcmljKTsKKyAgICByZXR1cm4gY2FsbF9mb3Jtc19SZiAoZmxfZ2V0X3RpbWVyLCBnLT4gb2JfZ2VuZXJpYyk7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiB0aW1lcl9tZXRob2RzW10gPSB7Ci0JeyJzZXRfdGltZXIiLAkJKFB5Q0Z1bmN0aW9uKXNldF90aW1lciwgTUVUSF9PTERBUkdTfSwKLQl7ImdldF90aW1lciIsCQkoUHlDRnVuY3Rpb24pZ2V0X3RpbWVyLCBNRVRIX05PQVJHU30sCi0Je05VTEwsCQkJTlVMTH0JCS8qIHNlbnRpbmVsICovCisgICAgeyJzZXRfdGltZXIiLCAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilzZXRfdGltZXIsIE1FVEhfT0xEQVJHU30sCisgICAgeyJnZXRfdGltZXIiLCAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilnZXRfdGltZXIsIE1FVEhfTk9BUkdTfSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiAvKiBGb3JtIG9iamVjdHMgKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewotCVB5T2JqZWN0X0hFQUQKLQlGTF9GT1JNICpvYl9mb3JtOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBGTF9GT1JNICpvYl9mb3JtOwogfSBmb3Jtb2JqZWN0OwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IEZvcm10eXBlOwpAQCAtMTE5NSwzNzEgKzExOTUsMzcxIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZm9ybV9zaG93X2Zvcm0oZm9ybW9iamVjdCAqZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IHBsYWNlLCBib3JkZXI7Ci0JY2hhciAqbmFtZTsKLQlpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICIoaWlzKSIsICZwbGFjZSwgJmJvcmRlciwgJm5hbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlmbF9zaG93X2Zvcm0oZi0+b2JfZm9ybSwgcGxhY2UsIGJvcmRlciwgbmFtZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGludCBwbGFjZSwgYm9yZGVyOworICAgIGNoYXIgKm5hbWU7CisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiKGlpcykiLCAmcGxhY2UsICZib3JkZXIsICZuYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZmxfc2hvd19mb3JtKGYtPm9iX2Zvcm0sIHBsYWNlLCBib3JkZXIsIG5hbWUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZvcm1fY2FsbCh2b2lkICgqZnVuYykoRkxfRk9STSAqKSwgRkxfRk9STSAqZikKIHsKLQkoKmZ1bmMpKGYpOworICAgICgqZnVuYykoZik7CiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZm9ybV9jYWxsX0lOaUlOaSh2b2lkICgqZnVuYykoRkxfRk9STSAqLCBpbnQsIGludCksIEZMX0ZPUk0gKmYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBhLCBiOworICAgIGludCBhLCBiOwogCi0JaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiKGlpKSIsICZhLCAmYikpIHJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2UoYXJncywgIihpaSkiLCAmYSwgJmIpKSByZXR1cm4gTlVMTDsKIAotCSgqZnVuYykoZiwgYSwgYik7CisgICAgKCpmdW5jKShmLCBhLCBiKTsKIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmb3JtX2NhbGxfSU5mSU5mKHZvaWQgKCpmdW5jKShGTF9GT1JNICosIGZsb2F0LCBmbG9hdCksIEZMX0ZPUk0gKmYsIFB5T2JqZWN0ICphcmdzKQogewotCWZsb2F0IGEsIGI7CisgICAgZmxvYXQgYSwgYjsKIAotCWlmICghUHlBcmdfUGFyc2UoYXJncywgIihmZikiLCAmYSwgJmIpKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICIoZmYpIiwgJmEsICZiKSkgcmV0dXJuIE5VTEw7CiAKLQkoKmZ1bmMpKGYsIGEsIGIpOworICAgICgqZnVuYykoZiwgYSwgYik7CiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZm9ybV9oaWRlX2Zvcm0oZm9ybW9iamVjdCAqZikKIHsKLQlyZXR1cm4gZm9ybV9jYWxsKGZsX2hpZGVfZm9ybSwgZi0+IG9iX2Zvcm0pOworICAgIHJldHVybiBmb3JtX2NhbGwoZmxfaGlkZV9mb3JtLCBmLT4gb2JfZm9ybSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmb3JtX3JlZHJhd19mb3JtKGZvcm1vYmplY3QgKmYpCiB7Ci0JcmV0dXJuIGZvcm1fY2FsbChmbF9yZWRyYXdfZm9ybSwgZi0+IG9iX2Zvcm0pOworICAgIHJldHVybiBmb3JtX2NhbGwoZmxfcmVkcmF3X2Zvcm0sIGYtPiBvYl9mb3JtKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZvcm1fc2V0X2Zvcm1fcG9zaXRpb24oZm9ybW9iamVjdCAqZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGZvcm1fY2FsbF9JTmlJTmkoZmxfc2V0X2Zvcm1fcG9zaXRpb24sIGYtPiBvYl9mb3JtLCBhcmdzKTsKKyAgICByZXR1cm4gZm9ybV9jYWxsX0lOaUlOaShmbF9zZXRfZm9ybV9wb3NpdGlvbiwgZi0+IG9iX2Zvcm0sIGFyZ3MpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZm9ybV9zZXRfZm9ybV9zaXplKGZvcm1vYmplY3QgKmYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBmb3JtX2NhbGxfSU5pSU5pKGZsX3NldF9mb3JtX3NpemUsIGYtPiBvYl9mb3JtLCBhcmdzKTsKKyAgICByZXR1cm4gZm9ybV9jYWxsX0lOaUlOaShmbF9zZXRfZm9ybV9zaXplLCBmLT4gb2JfZm9ybSwgYXJncyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmb3JtX3NjYWxlX2Zvcm0oZm9ybW9iamVjdCAqZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGZvcm1fY2FsbF9JTmZJTmYoZmxfc2NhbGVfZm9ybSwgZi0+IG9iX2Zvcm0sIGFyZ3MpOworICAgIHJldHVybiBmb3JtX2NhbGxfSU5mSU5mKGZsX3NjYWxlX2Zvcm0sIGYtPiBvYl9mb3JtLCBhcmdzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGdlbmVyaWNfYWRkX29iamVjdChmb3Jtb2JqZWN0ICpmLCBQeU9iamVjdCAqYXJncywgRkxfT0JKRUNUICooKmZ1bmMpKGludCwgZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQsIGNoYXIqKSwgUHlNZXRob2REZWYgKmludGVybmFsX21ldGhvZHMpCiB7Ci0JaW50IHR5cGU7Ci0JZmxvYXQgeCwgeSwgdywgaDsKLQljaGFyICpuYW1lOwotCUZMX09CSkVDVCAqb2JqOworICAgIGludCB0eXBlOworICAgIGZsb2F0IHgsIHksIHcsIGg7CisgICAgY2hhciAqbmFtZTsKKyAgICBGTF9PQkpFQ1QgKm9iajsKIAotCWlmICghUHlBcmdfUGFyc2UoYXJncywiKGlmZmZmcykiLCAmdHlwZSwmeCwmeSwmdywmaCwmbmFtZSkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2UoYXJncywiKGlmZmZmcykiLCAmdHlwZSwmeCwmeSwmdywmaCwmbmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JZmxfYWRkdG9fZm9ybSAoZi0+IG9iX2Zvcm0pOworICAgIGZsX2FkZHRvX2Zvcm0gKGYtPiBvYl9mb3JtKTsKIAotCW9iaiA9ICgqZnVuYykgKHR5cGUsIHgsIHksIHcsIGgsIG5hbWUpOworICAgIG9iaiA9ICgqZnVuYykgKHR5cGUsIHgsIHksIHcsIGgsIG5hbWUpOwogCi0JZmxfZW5kX2Zvcm0oKTsKKyAgICBmbF9lbmRfZm9ybSgpOwogCi0JaWYgKG9iaiA9PSBOVUxMKSB7Ci0JCVB5RXJyX05vTWVtb3J5KCk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAob2JqID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JcmV0dXJuIG5ld2dlbmVyaWNvYmplY3QgKG9iaiwgaW50ZXJuYWxfbWV0aG9kcyk7CisgICAgcmV0dXJuIG5ld2dlbmVyaWNvYmplY3QgKG9iaiwgaW50ZXJuYWxfbWV0aG9kcyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmb3JtX2FkZF9idXR0b24oZm9ybW9iamVjdCAqZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGdlbmVyaWNfYWRkX29iamVjdChmLCBhcmdzLCBmbF9hZGRfYnV0dG9uLCBidXR0b25fbWV0aG9kcyk7CisgICAgcmV0dXJuIGdlbmVyaWNfYWRkX29iamVjdChmLCBhcmdzLCBmbF9hZGRfYnV0dG9uLCBidXR0b25fbWV0aG9kcyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmb3JtX2FkZF9saWdodGJ1dHRvbihmb3Jtb2JqZWN0ICpmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gZ2VuZXJpY19hZGRfb2JqZWN0KGYsIGFyZ3MsIGZsX2FkZF9saWdodGJ1dHRvbiwgYnV0dG9uX21ldGhvZHMpOworICAgIHJldHVybiBnZW5lcmljX2FkZF9vYmplY3QoZiwgYXJncywgZmxfYWRkX2xpZ2h0YnV0dG9uLCBidXR0b25fbWV0aG9kcyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmb3JtX2FkZF9yb3VuZGJ1dHRvbihmb3Jtb2JqZWN0ICpmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gZ2VuZXJpY19hZGRfb2JqZWN0KGYsIGFyZ3MsIGZsX2FkZF9yb3VuZGJ1dHRvbiwgYnV0dG9uX21ldGhvZHMpOworICAgIHJldHVybiBnZW5lcmljX2FkZF9vYmplY3QoZiwgYXJncywgZmxfYWRkX3JvdW5kYnV0dG9uLCBidXR0b25fbWV0aG9kcyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmb3JtX2FkZF9tZW51IChmb3Jtb2JqZWN0ICpmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gZ2VuZXJpY19hZGRfb2JqZWN0KGYsIGFyZ3MsIGZsX2FkZF9tZW51LCBtZW51X21ldGhvZHMpOworICAgIHJldHVybiBnZW5lcmljX2FkZF9vYmplY3QoZiwgYXJncywgZmxfYWRkX21lbnUsIG1lbnVfbWV0aG9kcyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmb3JtX2FkZF9zbGlkZXIoZm9ybW9iamVjdCAqZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGdlbmVyaWNfYWRkX29iamVjdChmLCBhcmdzLCBmbF9hZGRfc2xpZGVyLCBzbGlkZXJfbWV0aG9kcyk7CisgICAgcmV0dXJuIGdlbmVyaWNfYWRkX29iamVjdChmLCBhcmdzLCBmbF9hZGRfc2xpZGVyLCBzbGlkZXJfbWV0aG9kcyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmb3JtX2FkZF92YWxzbGlkZXIoZm9ybW9iamVjdCAqZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGdlbmVyaWNfYWRkX29iamVjdChmLCBhcmdzLCBmbF9hZGRfdmFsc2xpZGVyLCBzbGlkZXJfbWV0aG9kcyk7CisgICAgcmV0dXJuIGdlbmVyaWNfYWRkX29iamVjdChmLCBhcmdzLCBmbF9hZGRfdmFsc2xpZGVyLCBzbGlkZXJfbWV0aG9kcyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmb3JtX2FkZF9kaWFsKGZvcm1vYmplY3QgKmYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBnZW5lcmljX2FkZF9vYmplY3QoZiwgYXJncywgZmxfYWRkX2RpYWwsIGRpYWxfbWV0aG9kcyk7CisgICAgcmV0dXJuIGdlbmVyaWNfYWRkX29iamVjdChmLCBhcmdzLCBmbF9hZGRfZGlhbCwgZGlhbF9tZXRob2RzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZvcm1fYWRkX2NvdW50ZXIoZm9ybW9iamVjdCAqZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGdlbmVyaWNfYWRkX29iamVjdChmLCBhcmdzLCBmbF9hZGRfY291bnRlciwgY291bnRlcl9tZXRob2RzKTsKKyAgICByZXR1cm4gZ2VuZXJpY19hZGRfb2JqZWN0KGYsIGFyZ3MsIGZsX2FkZF9jb3VudGVyLCBjb3VudGVyX21ldGhvZHMpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZm9ybV9hZGRfY2xvY2soZm9ybW9iamVjdCAqZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGdlbmVyaWNfYWRkX29iamVjdChmLCBhcmdzLCBmbF9hZGRfY2xvY2ssIGNsb2NrX21ldGhvZHMpOworICAgIHJldHVybiBnZW5lcmljX2FkZF9vYmplY3QoZiwgYXJncywgZmxfYWRkX2Nsb2NrLCBjbG9ja19tZXRob2RzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZvcm1fYWRkX2JveChmb3Jtb2JqZWN0ICpmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gZ2VuZXJpY19hZGRfb2JqZWN0KGYsIGFyZ3MsIGZsX2FkZF9ib3gsCi0JCQkJICAoUHlNZXRob2REZWYgKilOVUxMKTsKKyAgICByZXR1cm4gZ2VuZXJpY19hZGRfb2JqZWN0KGYsIGFyZ3MsIGZsX2FkZF9ib3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUHlNZXRob2REZWYgKilOVUxMKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZvcm1fYWRkX2Nob2ljZShmb3Jtb2JqZWN0ICpmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gZ2VuZXJpY19hZGRfb2JqZWN0KGYsIGFyZ3MsIGZsX2FkZF9jaG9pY2UsIGNob2ljZV9tZXRob2RzKTsKKyAgICByZXR1cm4gZ2VuZXJpY19hZGRfb2JqZWN0KGYsIGFyZ3MsIGZsX2FkZF9jaG9pY2UsIGNob2ljZV9tZXRob2RzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZvcm1fYWRkX2Jyb3dzZXIoZm9ybW9iamVjdCAqZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGdlbmVyaWNfYWRkX29iamVjdChmLCBhcmdzLCBmbF9hZGRfYnJvd3NlciwgYnJvd3Nlcl9tZXRob2RzKTsKKyAgICByZXR1cm4gZ2VuZXJpY19hZGRfb2JqZWN0KGYsIGFyZ3MsIGZsX2FkZF9icm93c2VyLCBicm93c2VyX21ldGhvZHMpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZm9ybV9hZGRfcG9zaXRpb25lcihmb3Jtb2JqZWN0ICpmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gZ2VuZXJpY19hZGRfb2JqZWN0KGYsIGFyZ3MsIGZsX2FkZF9wb3NpdGlvbmVyLAotCQkJCSAgcG9zaXRpb25lcl9tZXRob2RzKTsKKyAgICByZXR1cm4gZ2VuZXJpY19hZGRfb2JqZWN0KGYsIGFyZ3MsIGZsX2FkZF9wb3NpdGlvbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25lcl9tZXRob2RzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZvcm1fYWRkX2lucHV0KGZvcm1vYmplY3QgKmYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBnZW5lcmljX2FkZF9vYmplY3QoZiwgYXJncywgZmxfYWRkX2lucHV0LCBpbnB1dF9tZXRob2RzKTsKKyAgICByZXR1cm4gZ2VuZXJpY19hZGRfb2JqZWN0KGYsIGFyZ3MsIGZsX2FkZF9pbnB1dCwgaW5wdXRfbWV0aG9kcyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmb3JtX2FkZF90ZXh0KGZvcm1vYmplY3QgKmYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBnZW5lcmljX2FkZF9vYmplY3QoZiwgYXJncywgZmxfYWRkX3RleHQsCi0JCQkJICAoUHlNZXRob2REZWYgKilOVUxMKTsKKyAgICByZXR1cm4gZ2VuZXJpY19hZGRfb2JqZWN0KGYsIGFyZ3MsIGZsX2FkZF90ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFB5TWV0aG9kRGVmICopTlVMTCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmb3JtX2FkZF90aW1lcihmb3Jtb2JqZWN0ICpmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gZ2VuZXJpY19hZGRfb2JqZWN0KGYsIGFyZ3MsIGZsX2FkZF90aW1lciwgdGltZXJfbWV0aG9kcyk7CisgICAgcmV0dXJuIGdlbmVyaWNfYWRkX29iamVjdChmLCBhcmdzLCBmbF9hZGRfdGltZXIsIHRpbWVyX21ldGhvZHMpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZm9ybV9mcmVlemVfZm9ybShmb3Jtb2JqZWN0ICpmKQogewotCXJldHVybiBmb3JtX2NhbGwoZmxfZnJlZXplX2Zvcm0sIGYtPiBvYl9mb3JtKTsKKyAgICByZXR1cm4gZm9ybV9jYWxsKGZsX2ZyZWV6ZV9mb3JtLCBmLT4gb2JfZm9ybSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmb3JtX3VuZnJlZXplX2Zvcm0oZm9ybW9iamVjdCAqZikKIHsKLQlyZXR1cm4gZm9ybV9jYWxsKGZsX3VuZnJlZXplX2Zvcm0sIGYtPiBvYl9mb3JtKTsKKyAgICByZXR1cm4gZm9ybV9jYWxsKGZsX3VuZnJlZXplX2Zvcm0sIGYtPiBvYl9mb3JtKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZvcm1fYWN0aXZhdGVfZm9ybShmb3Jtb2JqZWN0ICpmKQogewotCXJldHVybiBmb3JtX2NhbGwoZmxfYWN0aXZhdGVfZm9ybSwgZi0+IG9iX2Zvcm0pOworICAgIHJldHVybiBmb3JtX2NhbGwoZmxfYWN0aXZhdGVfZm9ybSwgZi0+IG9iX2Zvcm0pOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZm9ybV9kZWFjdGl2YXRlX2Zvcm0oZm9ybW9iamVjdCAqZikKIHsKLQlyZXR1cm4gZm9ybV9jYWxsKGZsX2RlYWN0aXZhdGVfZm9ybSwgZi0+IG9iX2Zvcm0pOworICAgIHJldHVybiBmb3JtX2NhbGwoZmxfZGVhY3RpdmF0ZV9mb3JtLCBmLT4gb2JfZm9ybSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmb3JtX2Jnbl9ncm91cChmb3Jtb2JqZWN0ICpmLCBQeU9iamVjdCAqYXJncykKIHsKLQlGTF9PQkpFQ1QgKm9iajsKKyAgICBGTF9PQkpFQ1QgKm9iajsKIAotCWZsX2FkZHRvX2Zvcm0oZi0+IG9iX2Zvcm0pOwotCW9iaiA9IGZsX2Jnbl9ncm91cCgpOwotCWZsX2VuZF9mb3JtKCk7CisgICAgZmxfYWRkdG9fZm9ybShmLT4gb2JfZm9ybSk7CisgICAgb2JqID0gZmxfYmduX2dyb3VwKCk7CisgICAgZmxfZW5kX2Zvcm0oKTsKIAotCWlmIChvYmogPT0gTlVMTCkgewotCQlQeUVycl9Ob01lbW9yeSgpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKG9iaiA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXJldHVybiBuZXdnZW5lcmljb2JqZWN0IChvYmosIChQeU1ldGhvZERlZiAqKSBOVUxMKTsKKyAgICByZXR1cm4gbmV3Z2VuZXJpY29iamVjdCAob2JqLCAoUHlNZXRob2REZWYgKikgTlVMTCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmb3JtX2VuZF9ncm91cChmb3Jtb2JqZWN0ICpmLCBQeU9iamVjdCAqYXJncykKIHsKLQlmbF9hZGR0b19mb3JtKGYtPiBvYl9mb3JtKTsKLQlmbF9lbmRfZ3JvdXAoKTsKLQlmbF9lbmRfZm9ybSgpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBmbF9hZGR0b19mb3JtKGYtPiBvYl9mb3JtKTsKKyAgICBmbF9lbmRfZ3JvdXAoKTsKKyAgICBmbF9lbmRfZm9ybSgpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZvcm1zX2ZpbmRfZmlyc3Rfb3JfbGFzdChGTF9PQkpFQ1QgKigqZnVuYykoRkxfRk9STSAqLCBpbnQsIGZsb2F0LCBmbG9hdCksIGZvcm1vYmplY3QgKmYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCB0eXBlOwotCWZsb2F0IG14LCBteTsKLQlGTF9PQkpFQ1QgKmdlbmVyaWM7Ci0JZ2VuZXJpY29iamVjdCAqZzsKLQkKLQlpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICIoaWZmKSIsICZ0eXBlLCAmbXgsICZteSkpIHJldHVybiBOVUxMOworICAgIGludCB0eXBlOworICAgIGZsb2F0IG14LCBteTsKKyAgICBGTF9PQkpFQ1QgKmdlbmVyaWM7CisgICAgZ2VuZXJpY29iamVjdCAqZzsKIAotCWdlbmVyaWMgPSAoKmZ1bmMpIChmLT4gb2JfZm9ybSwgdHlwZSwgbXgsIG15KTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICIoaWZmKSIsICZ0eXBlLCAmbXgsICZteSkpIHJldHVybiBOVUxMOwogCi0JaWYgKGdlbmVyaWMgPT0gTlVMTCkKLQl7Ci0JCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJcmV0dXJuIFB5X05vbmU7Ci0JfQorICAgIGdlbmVyaWMgPSAoKmZ1bmMpIChmLT4gb2JfZm9ybSwgdHlwZSwgbXgsIG15KTsKIAotCWcgPSBmaW5kZ2VuZXJpYyhnZW5lcmljKTsKLQlpZiAoZyA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCi0JCQkgICAiZm9ybXNfZmluZF97Zmlyc3R8bGFzdH0gcmV0dXJucyB1bmtub3duIG9iamVjdCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JUHlfSU5DUkVGKGcpOwotCXJldHVybiAoUHlPYmplY3QgKikgZzsKKyAgICBpZiAoZ2VuZXJpYyA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICB9CisKKyAgICBnID0gZmluZGdlbmVyaWMoZ2VuZXJpYyk7CisgICAgaWYgKGcgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAorICAgICAgICAgICAgICAgICAgICJmb3Jtc19maW5kX3tmaXJzdHxsYXN0fSByZXR1cm5zIHVua25vd24gb2JqZWN0Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeV9JTkNSRUYoZyk7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKSBnOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZm9ybV9maW5kX2ZpcnN0KGZvcm1vYmplY3QgKmYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBmb3Jtc19maW5kX2ZpcnN0X29yX2xhc3QoZmxfZmluZF9maXJzdCwgZiwgYXJncyk7CisgICAgcmV0dXJuIGZvcm1zX2ZpbmRfZmlyc3Rfb3JfbGFzdChmbF9maW5kX2ZpcnN0LCBmLCBhcmdzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZvcm1fZmluZF9sYXN0KGZvcm1vYmplY3QgKmYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBmb3Jtc19maW5kX2ZpcnN0X29yX2xhc3QoZmxfZmluZF9sYXN0LCBmLCBhcmdzKTsKKyAgICByZXR1cm4gZm9ybXNfZmluZF9maXJzdF9vcl9sYXN0KGZsX2ZpbmRfbGFzdCwgZiwgYXJncyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmb3JtX3NldF9vYmplY3RfZm9jdXMoZm9ybW9iamVjdCAqZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZ2VuZXJpY29iamVjdCAqZzsKLQlpZiAoYXJncyA9PSBOVUxMIHx8ICFpc19nZW5lcmljb2JqZWN0KGFyZ3MpKSB7Ci0JCVB5RXJyX0JhZEFyZ3VtZW50KCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlnID0gKGdlbmVyaWNvYmplY3QgKilhcmdzOwotCWZsX3NldF9vYmplY3RfZm9jdXMoZi0+b2JfZm9ybSwgZy0+b2JfZ2VuZXJpYyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGdlbmVyaWNvYmplY3QgKmc7CisgICAgaWYgKGFyZ3MgPT0gTlVMTCB8fCAhaXNfZ2VuZXJpY29iamVjdChhcmdzKSkgeworICAgICAgICBQeUVycl9CYWRBcmd1bWVudCgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZyA9IChnZW5lcmljb2JqZWN0ICopYXJnczsKKyAgICBmbF9zZXRfb2JqZWN0X2ZvY3VzKGYtPm9iX2Zvcm0sIGctPm9iX2dlbmVyaWMpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIGZvcm1fbWV0aG9kc1tdID0gewogLyogYWRtICovCi0JeyJzaG93X2Zvcm0iLAkJKFB5Q0Z1bmN0aW9uKWZvcm1fc2hvd19mb3JtLCAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImhpZGVfZm9ybSIsCQkoUHlDRnVuY3Rpb24pZm9ybV9oaWRlX2Zvcm0sICAgICBNRVRIX05PQVJHU30sCi0JeyJyZWRyYXdfZm9ybSIsCQkoUHlDRnVuY3Rpb24pZm9ybV9yZWRyYXdfZm9ybSwgICBNRVRIX05PQVJHU30sCi0JeyJzZXRfZm9ybV9wb3NpdGlvbiIsCShQeUNGdW5jdGlvbilmb3JtX3NldF9mb3JtX3Bvc2l0aW9uLCBNRVRIX09MREFSR1N9LAotCXsic2V0X2Zvcm1fc2l6ZSIsCShQeUNGdW5jdGlvbilmb3JtX3NldF9mb3JtX3NpemUsIE1FVEhfT0xEQVJHU30sCi0JeyJzY2FsZV9mb3JtIiwJCShQeUNGdW5jdGlvbilmb3JtX3NjYWxlX2Zvcm0sICAgIE1FVEhfT0xEQVJHU30sCi0JeyJmcmVlemVfZm9ybSIsCQkoUHlDRnVuY3Rpb24pZm9ybV9mcmVlemVfZm9ybSwgICBNRVRIX05PQVJHU30sCi0JeyJ1bmZyZWV6ZV9mb3JtIiwJKFB5Q0Z1bmN0aW9uKWZvcm1fdW5mcmVlemVfZm9ybSwgTUVUSF9OT0FSR1N9LAotCXsiYWN0aXZhdGVfZm9ybSIsCShQeUNGdW5jdGlvbilmb3JtX2FjdGl2YXRlX2Zvcm0sIE1FVEhfTk9BUkdTfSwKLQl7ImRlYWN0aXZhdGVfZm9ybSIsCShQeUNGdW5jdGlvbilmb3JtX2RlYWN0aXZhdGVfZm9ybSwgTUVUSF9OT0FSR1N9LAotCXsiYmduX2dyb3VwIiwJCShQeUNGdW5jdGlvbilmb3JtX2Jnbl9ncm91cCwgIE1FVEhfT0xEQVJHU30sCi0JeyJlbmRfZ3JvdXAiLAkJKFB5Q0Z1bmN0aW9uKWZvcm1fZW5kX2dyb3VwLCAgTUVUSF9PTERBUkdTfSwKLQl7ImZpbmRfZmlyc3QiLAkJKFB5Q0Z1bmN0aW9uKWZvcm1fZmluZF9maXJzdCwgTUVUSF9PTERBUkdTfSwKLQl7ImZpbmRfbGFzdCIsCQkoUHlDRnVuY3Rpb24pZm9ybV9maW5kX2xhc3QsICBNRVRIX09MREFSR1N9LAotCXsic2V0X29iamVjdF9mb2N1cyIsCShQeUNGdW5jdGlvbilmb3JtX3NldF9vYmplY3RfZm9jdXMsIE1FVEhfT0xEQVJHU30sCisgICAgeyJzaG93X2Zvcm0iLCAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilmb3JtX3Nob3dfZm9ybSwgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJoaWRlX2Zvcm0iLCAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilmb3JtX2hpZGVfZm9ybSwgICAgIE1FVEhfTk9BUkdTfSwKKyAgICB7InJlZHJhd19mb3JtIiwgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWZvcm1fcmVkcmF3X2Zvcm0sICAgTUVUSF9OT0FSR1N9LAorICAgIHsic2V0X2Zvcm1fcG9zaXRpb24iLCAgICAgICAoUHlDRnVuY3Rpb24pZm9ybV9zZXRfZm9ybV9wb3NpdGlvbiwgTUVUSF9PTERBUkdTfSwKKyAgICB7InNldF9mb3JtX3NpemUiLCAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWZvcm1fc2V0X2Zvcm1fc2l6ZSwgTUVUSF9PTERBUkdTfSwKKyAgICB7InNjYWxlX2Zvcm0iLCAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWZvcm1fc2NhbGVfZm9ybSwgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImZyZWV6ZV9mb3JtIiwgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWZvcm1fZnJlZXplX2Zvcm0sICAgTUVUSF9OT0FSR1N9LAorICAgIHsidW5mcmVlemVfZm9ybSIsICAgICAgICAgICAoUHlDRnVuY3Rpb24pZm9ybV91bmZyZWV6ZV9mb3JtLCBNRVRIX05PQVJHU30sCisgICAgeyJhY3RpdmF0ZV9mb3JtIiwgICAgICAgICAgIChQeUNGdW5jdGlvbilmb3JtX2FjdGl2YXRlX2Zvcm0sIE1FVEhfTk9BUkdTfSwKKyAgICB7ImRlYWN0aXZhdGVfZm9ybSIsICAgICAgICAgKFB5Q0Z1bmN0aW9uKWZvcm1fZGVhY3RpdmF0ZV9mb3JtLCBNRVRIX05PQVJHU30sCisgICAgeyJiZ25fZ3JvdXAiLCAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilmb3JtX2Jnbl9ncm91cCwgIE1FVEhfT0xEQVJHU30sCisgICAgeyJlbmRfZ3JvdXAiLCAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilmb3JtX2VuZF9ncm91cCwgIE1FVEhfT0xEQVJHU30sCisgICAgeyJmaW5kX2ZpcnN0IiwgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilmb3JtX2ZpbmRfZmlyc3QsIE1FVEhfT0xEQVJHU30sCisgICAgeyJmaW5kX2xhc3QiLCAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilmb3JtX2ZpbmRfbGFzdCwgIE1FVEhfT0xEQVJHU30sCisgICAgeyJzZXRfb2JqZWN0X2ZvY3VzIiwgICAgICAgIChQeUNGdW5jdGlvbilmb3JtX3NldF9vYmplY3RfZm9jdXMsIE1FVEhfT0xEQVJHU30sCiAKIC8qIGJhc2ljIG9iamVjdHMgKi8KLQl7ImFkZF9idXR0b24iLAkJKFB5Q0Z1bmN0aW9uKWZvcm1fYWRkX2J1dHRvbiwgTUVUSF9PTERBUkdTfSwKLS8qCXsiYWRkX2JpdG1hcCIsCQkobWV0aG9kKWZvcm1fYWRkX2JpdG1hcCwgTUVUSF9PTERBUkdTfSwgKi8KLQl7ImFkZF9saWdodGJ1dHRvbiIsCShQeUNGdW5jdGlvbilmb3JtX2FkZF9saWdodGJ1dHRvbiwgTUVUSF9PTERBUkdTfSwKLQl7ImFkZF9yb3VuZGJ1dHRvbiIsCShQeUNGdW5jdGlvbilmb3JtX2FkZF9yb3VuZGJ1dHRvbiwgTUVUSF9PTERBUkdTfSwKLQl7ImFkZF9tZW51IiwJCShQeUNGdW5jdGlvbilmb3JtX2FkZF9tZW51LCAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJhZGRfc2xpZGVyIiwJCShQeUNGdW5jdGlvbilmb3JtX2FkZF9zbGlkZXIsICAgIE1FVEhfT0xEQVJHU30sCi0JeyJhZGRfcG9zaXRpb25lciIsCShQeUNGdW5jdGlvbilmb3JtX2FkZF9wb3NpdGlvbmVyLCBNRVRIX09MREFSR1N9LAotCXsiYWRkX3ZhbHNsaWRlciIsCShQeUNGdW5jdGlvbilmb3JtX2FkZF92YWxzbGlkZXIsIE1FVEhfT0xEQVJHU30sCi0JeyJhZGRfZGlhbCIsCQkoUHlDRnVuY3Rpb24pZm9ybV9hZGRfZGlhbCwgICAgICBNRVRIX09MREFSR1N9LAotCXsiYWRkX2NvdW50ZXIiLAkJKFB5Q0Z1bmN0aW9uKWZvcm1fYWRkX2NvdW50ZXIsICAgTUVUSF9PTERBUkdTfSwKLQl7ImFkZF9ib3giLAkJKFB5Q0Z1bmN0aW9uKWZvcm1fYWRkX2JveCwgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImFkZF9jbG9jayIsCQkoUHlDRnVuY3Rpb24pZm9ybV9hZGRfY2xvY2ssICAgICBNRVRIX09MREFSR1N9LAotCXsiYWRkX2Nob2ljZSIsCQkoUHlDRnVuY3Rpb24pZm9ybV9hZGRfY2hvaWNlLCAgICBNRVRIX09MREFSR1N9LAotCXsiYWRkX2Jyb3dzZXIiLAkJKFB5Q0Z1bmN0aW9uKWZvcm1fYWRkX2Jyb3dzZXIsICAgTUVUSF9PTERBUkdTfSwKLQl7ImFkZF9pbnB1dCIsCQkoUHlDRnVuY3Rpb24pZm9ybV9hZGRfaW5wdXQsICAgICBNRVRIX09MREFSR1N9LAotCXsiYWRkX3RpbWVyIiwJCShQeUNGdW5jdGlvbilmb3JtX2FkZF90aW1lciwgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJhZGRfdGV4dCIsCQkoUHlDRnVuY3Rpb24pZm9ybV9hZGRfdGV4dCwgICAgICBNRVRIX09MREFSR1N9LAotCXtOVUxMLAkJCU5VTEx9CQkvKiBzZW50aW5lbCAqLworICAgIHsiYWRkX2J1dHRvbiIsICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pZm9ybV9hZGRfYnV0dG9uLCBNRVRIX09MREFSR1N9LAorLyogICAgICB7ImFkZF9iaXRtYXAiLCAgICAgICAgICAobWV0aG9kKWZvcm1fYWRkX2JpdG1hcCwgTUVUSF9PTERBUkdTfSwgKi8KKyAgICB7ImFkZF9saWdodGJ1dHRvbiIsICAgICAgICAgKFB5Q0Z1bmN0aW9uKWZvcm1fYWRkX2xpZ2h0YnV0dG9uLCBNRVRIX09MREFSR1N9LAorICAgIHsiYWRkX3JvdW5kYnV0dG9uIiwgICAgICAgICAoUHlDRnVuY3Rpb24pZm9ybV9hZGRfcm91bmRidXR0b24sIE1FVEhfT0xEQVJHU30sCisgICAgeyJhZGRfbWVudSIsICAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilmb3JtX2FkZF9tZW51LCAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJhZGRfc2xpZGVyIiwgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilmb3JtX2FkZF9zbGlkZXIsICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJhZGRfcG9zaXRpb25lciIsICAgICAgICAgIChQeUNGdW5jdGlvbilmb3JtX2FkZF9wb3NpdGlvbmVyLCBNRVRIX09MREFSR1N9LAorICAgIHsiYWRkX3ZhbHNsaWRlciIsICAgICAgICAgICAoUHlDRnVuY3Rpb24pZm9ybV9hZGRfdmFsc2xpZGVyLCBNRVRIX09MREFSR1N9LAorICAgIHsiYWRkX2RpYWwiLCAgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pZm9ybV9hZGRfZGlhbCwgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiYWRkX2NvdW50ZXIiLCAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pZm9ybV9hZGRfY291bnRlciwgICBNRVRIX09MREFSR1N9LAorICAgIHsiYWRkX2JveCIsICAgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pZm9ybV9hZGRfYm94LCAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiYWRkX2Nsb2NrIiwgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pZm9ybV9hZGRfY2xvY2ssICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiYWRkX2Nob2ljZSIsICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pZm9ybV9hZGRfY2hvaWNlLCAgICBNRVRIX09MREFSR1N9LAorICAgIHsiYWRkX2Jyb3dzZXIiLCAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pZm9ybV9hZGRfYnJvd3NlciwgICBNRVRIX09MREFSR1N9LAorICAgIHsiYWRkX2lucHV0IiwgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pZm9ybV9hZGRfaW5wdXQsICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiYWRkX3RpbWVyIiwgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pZm9ybV9hZGRfdGltZXIsICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiYWRkX3RleHQiLCAgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pZm9ybV9hZGRfdGV4dCwgICAgICBNRVRIX09MREFSR1N9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIHN0YXRpYyB2b2lkCiBmb3JtX2RlYWxsb2MoZm9ybW9iamVjdCAqZikKIHsKLQlyZWxlYXNlb2JqZWN0cyhmLT5vYl9mb3JtKTsKLQlpZiAoZi0+b2JfZm9ybS0+dmlzaWJsZSkKLQkJZmxfaGlkZV9mb3JtKGYtPm9iX2Zvcm0pOwotCWZsX2ZyZWVfZm9ybShmLT5vYl9mb3JtKTsKLQlQeU9iamVjdF9EZWwoZik7CisgICAgcmVsZWFzZW9iamVjdHMoZi0+b2JfZm9ybSk7CisgICAgaWYgKGYtPm9iX2Zvcm0tPnZpc2libGUpCisgICAgICAgIGZsX2hpZGVfZm9ybShmLT5vYl9mb3JtKTsKKyAgICBmbF9mcmVlX2Zvcm0oZi0+b2JfZm9ybSk7CisgICAgUHlPYmplY3RfRGVsKGYpOwogfQogCiAjZGVmaW5lIE9GRih4KSBvZmZzZXRvZihGTF9GT1JNLCB4KQogCiBzdGF0aWMgc3RydWN0IG1lbWJlcmxpc3QgZm9ybV9tZW1iZXJsaXN0W10gPSB7Ci0JeyJ3aW5kb3ciLAlUX0xPTkcsCQlPRkYod2luZG93KSwJUk99LAotCXsidyIsCQlUX0ZMT0FULAlPRkYodyl9LAotCXsiaCIsCQlUX0ZMT0FULAlPRkYoaCl9LAotCXsieCIsCQlUX0ZMT0FULAlPRkYoeCksCQlST30sCi0JeyJ5IiwJCVRfRkxPQVQsCU9GRih5KSwJCVJPfSwKLQl7ImRlYWN0aXZhdGVkIiwJVF9JTlQsCQlPRkYoZGVhY3RpdmF0ZWQpfSwKLQl7InZpc2libGUiLAlUX0lOVCwJCU9GRih2aXNpYmxlKSwJUk99LAotCXsiZnJvemVuIiwJVF9JTlQsCQlPRkYoZnJvemVuKSwJUk99LAotCXsiZG91YmxlYnVmIiwJVF9JTlQsCQlPRkYoZG91YmxlYnVmKX0sCi0Je05VTEx9CS8qIFNlbnRpbmVsICovCisgICAgeyJ3aW5kb3ciLCAgICAgICAgICBUX0xPTkcsICAgICAgICAgT0ZGKHdpbmRvdyksICAgIFJPfSwKKyAgICB7InciLCAgICAgICAgICAgICAgIFRfRkxPQVQsICAgICAgICBPRkYodyl9LAorICAgIHsiaCIsICAgICAgICAgICAgICAgVF9GTE9BVCwgICAgICAgIE9GRihoKX0sCisgICAgeyJ4IiwgICAgICAgICAgICAgICBUX0ZMT0FULCAgICAgICAgT0ZGKHgpLCAgICAgICAgIFJPfSwKKyAgICB7InkiLCAgICAgICAgICAgICAgIFRfRkxPQVQsICAgICAgICBPRkYoeSksICAgICAgICAgUk99LAorICAgIHsiZGVhY3RpdmF0ZWQiLCAgICAgVF9JTlQsICAgICAgICAgIE9GRihkZWFjdGl2YXRlZCl9LAorICAgIHsidmlzaWJsZSIsICAgICAgICAgVF9JTlQsICAgICAgICAgIE9GRih2aXNpYmxlKSwgICBST30sCisgICAgeyJmcm96ZW4iLCAgICAgICAgICBUX0lOVCwgICAgICAgICAgT0ZGKGZyb3plbiksICAgIFJPfSwKKyAgICB7ImRvdWJsZWJ1ZiIsICAgICAgIFRfSU5ULCAgICAgICAgICBPRkYoZG91YmxlYnVmKX0sCisgICAge05VTEx9ICAgICAgLyogU2VudGluZWwgKi8KIH07CiAKICN1bmRlZiBPRkYKQEAgLTE1NjcsNjAgKzE1NjcsNjAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBmb3JtX2dldGF0dHIoZm9ybW9iamVjdCAqZiwgY2hhciAqbmFtZSkKIHsKLQlQeU9iamVjdCAqbWV0aDsKKyAgICBQeU9iamVjdCAqbWV0aDsKIAotCW1ldGggPSBQeV9GaW5kTWV0aG9kKGZvcm1fbWV0aG9kcywgKFB5T2JqZWN0ICopZiwgbmFtZSk7Ci0JaWYgKG1ldGggIT0gTlVMTCkKLQkJcmV0dXJuIG1ldGg7Ci0JUHlFcnJfQ2xlYXIoKTsKLQlyZXR1cm4gUHlNZW1iZXJfR2V0KChjaGFyICopZi0+b2JfZm9ybSwgZm9ybV9tZW1iZXJsaXN0LCBuYW1lKTsKKyAgICBtZXRoID0gUHlfRmluZE1ldGhvZChmb3JtX21ldGhvZHMsIChQeU9iamVjdCAqKWYsIG5hbWUpOworICAgIGlmIChtZXRoICE9IE5VTEwpCisgICAgICAgIHJldHVybiBtZXRoOworICAgIFB5RXJyX0NsZWFyKCk7CisgICAgcmV0dXJuIFB5TWVtYmVyX0dldCgoY2hhciAqKWYtPm9iX2Zvcm0sIGZvcm1fbWVtYmVybGlzdCwgbmFtZSk7CiB9CiAKIHN0YXRpYyBpbnQKIGZvcm1fc2V0YXR0cihmb3Jtb2JqZWN0ICpmLCBjaGFyICpuYW1lLCBQeU9iamVjdCAqdikKIHsKLQlpZiAodiA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJImNhbid0IGRlbGV0ZSBmb3JtIGF0dHJpYnV0ZXMiKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICBpZiAodiA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiY2FuJ3QgZGVsZXRlIGZvcm0gYXR0cmlidXRlcyIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JcmV0dXJuIFB5TWVtYmVyX1NldCgoY2hhciAqKWYtPm9iX2Zvcm0sIGZvcm1fbWVtYmVybGlzdCwgbmFtZSwgdik7CisgICAgcmV0dXJuIFB5TWVtYmVyX1NldCgoY2hhciAqKWYtPm9iX2Zvcm0sIGZvcm1fbWVtYmVybGlzdCwgbmFtZSwgdik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmb3JtX3JlcHIoZm9ybW9iamVjdCAqZikKIHsKLQljaGFyIGJ1ZlsxMDBdOwotCVB5T1Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIjxGT1JNU19mb3JtIGF0ICVwLCB3aW5kb3c9JWxkPiIsCi0JCSAgICAgIGYsIGYtPm9iX2Zvcm0tPndpbmRvdyk7Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmKTsKKyAgICBjaGFyIGJ1ZlsxMDBdOworICAgIFB5T1Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIjxGT1JNU19mb3JtIGF0ICVwLCB3aW5kb3c9JWxkPiIsCisgICAgICAgICAgICAgICAgICBmLCBmLT5vYl9mb3JtLT53aW5kb3cpOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CiB9CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgRm9ybXR5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSkKLQkwLAkJCQkvKm9iX3NpemUqLwotCSJmbC5GT1JNU19mb3JtIiwJCS8qdHBfbmFtZSovCi0Jc2l6ZW9mKGZvcm1vYmplY3QpLAkJLyp0cF9zaXplKi8KLQkwLAkJCQkvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpZm9ybV9kZWFsbG9jLAkvKnRwX2RlYWxsb2MqLwotCTAsCQkJCS8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYylmb3JtX2dldGF0dHIsCS8qdHBfZ2V0YXR0ciovCi0JKHNldGF0dHJmdW5jKWZvcm1fc2V0YXR0ciwJLyp0cF9zZXRhdHRyKi8KLQkwLAkJCQkvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYylmb3JtX3JlcHIsCQkvKnRwX3JlcHIqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUpCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypvYl9zaXplKi8KKyAgICAiZmwuRk9STVNfZm9ybSIsICAgICAgICAgICAgICAgICAgICAvKnRwX25hbWUqLworICAgIHNpemVvZihmb3Jtb2JqZWN0KSwgICAgICAgICAgICAgICAgIC8qdHBfc2l6ZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKWZvcm1fZGVhbGxvYywgICAgICAgICAgIC8qdHBfZGVhbGxvYyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKWZvcm1fZ2V0YXR0ciwgICAgICAgICAgLyp0cF9nZXRhdHRyKi8KKyAgICAoc2V0YXR0cmZ1bmMpZm9ybV9zZXRhdHRyLCAgICAgICAgICAvKnRwX3NldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY29tcGFyZSovCisgICAgKHJlcHJmdW5jKWZvcm1fcmVwciwgICAgICAgICAgICAgICAgLyp0cF9yZXByKi8KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBuZXdmb3Jtb2JqZWN0KEZMX0ZPUk0gKmZvcm0pCiB7Ci0JZm9ybW9iamVjdCAqZjsKLQlmID0gUHlPYmplY3RfTmV3KGZvcm1vYmplY3QsICZGb3JtdHlwZSk7Ci0JaWYgKGYgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JZi0+b2JfZm9ybSA9IGZvcm07Ci0JcmV0dXJuIChQeU9iamVjdCAqKWY7CisgICAgZm9ybW9iamVjdCAqZjsKKyAgICBmID0gUHlPYmplY3RfTmV3KGZvcm1vYmplY3QsICZGb3JtdHlwZSk7CisgICAgaWYgKGYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZi0+b2JfZm9ybSA9IGZvcm07CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWY7CiB9CiAKIApAQCAtMTYyOSwzNSArMTYyOSwzNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGZvcm1zX21ha2VfZm9ybShQeU9iamVjdCAqZHVtbXksIFB5T2JqZWN0ICphcmdzKQogewotCWludCB0eXBlOwotCWZsb2F0IHcsIGg7Ci0JRkxfRk9STSAqZm9ybTsKLQlpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICIoaWZmKSIsICZ0eXBlLCAmdywgJmgpKQotCQlyZXR1cm4gTlVMTDsKLQlmb3JtID0gZmxfYmduX2Zvcm0odHlwZSwgdywgaCk7Ci0JaWYgKGZvcm0gPT0gTlVMTCkgewotCQkvKiBYWFggQWN0dWFsbHksIGNhbm5vdCBoYXBwZW4hICovCi0JCVB5RXJyX05vTWVtb3J5KCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlmbF9lbmRfZm9ybSgpOwotCXJldHVybiBuZXdmb3Jtb2JqZWN0KGZvcm0pOworICAgIGludCB0eXBlOworICAgIGZsb2F0IHcsIGg7CisgICAgRkxfRk9STSAqZm9ybTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICIoaWZmKSIsICZ0eXBlLCAmdywgJmgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBmb3JtID0gZmxfYmduX2Zvcm0odHlwZSwgdywgaCk7CisgICAgaWYgKGZvcm0gPT0gTlVMTCkgeworICAgICAgICAvKiBYWFggQWN0dWFsbHksIGNhbm5vdCBoYXBwZW4hICovCisgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBmbF9lbmRfZm9ybSgpOworICAgIHJldHVybiBuZXdmb3Jtb2JqZWN0KGZvcm0pOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZm9ybXNfYWN0aXZhdGVfYWxsX2Zvcm1zKFB5T2JqZWN0ICpmLCBQeU9iamVjdCAqYXJncykKIHsKLQlmbF9hY3RpdmF0ZV9hbGxfZm9ybXMoKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZmxfYWN0aXZhdGVfYWxsX2Zvcm1zKCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZm9ybXNfZGVhY3RpdmF0ZV9hbGxfZm9ybXMoUHlPYmplY3QgKmYsIFB5T2JqZWN0ICphcmdzKQogewotCWZsX2RlYWN0aXZhdGVfYWxsX2Zvcm1zKCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGZsX2RlYWN0aXZhdGVfYWxsX2Zvcm1zKCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKm15X2V2ZW50X2NhbGxiYWNrID0gTlVMTDsKQEAgLTE2NjUsNDc5ICsxNjY1LDQ3OSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGZvcm1zX3NldF9ldmVudF9jYWxsX2JhY2soUHlPYmplY3QgKmR1bW15LCBQeU9iamVjdCAqYXJncykKIHsKLQlpZiAoYXJncyA9PSBQeV9Ob25lKQotCQlhcmdzID0gTlVMTDsKLQlteV9ldmVudF9jYWxsYmFjayA9IGFyZ3M7Ci0JUHlfWElOQ1JFRihhcmdzKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKGFyZ3MgPT0gUHlfTm9uZSkKKyAgICAgICAgYXJncyA9IE5VTEw7CisgICAgbXlfZXZlbnRfY2FsbGJhY2sgPSBhcmdzOworICAgIFB5X1hJTkNSRUYoYXJncyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZm9ybXNfZG9fb3JfY2hlY2tfZm9ybXMoUHlPYmplY3QgKmR1bW15LCBGTF9PQkpFQ1QgKigqZnVuYykodm9pZCkpCiB7Ci0JRkxfT0JKRUNUICpnZW5lcmljOwotCWdlbmVyaWNvYmplY3QgKmc7Ci0JUHlPYmplY3QgKmFyZywgKnJlczsKKyAgICBGTF9PQkpFQ1QgKmdlbmVyaWM7CisgICAgZ2VuZXJpY29iamVjdCAqZzsKKyAgICBQeU9iamVjdCAqYXJnLCAqcmVzOwogCi0JZm9yICg7OykgewotCQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JCWdlbmVyaWMgPSAoKmZ1bmMpKCk7Ci0JCVB5X0VORF9BTExPV19USFJFQURTCi0JCWlmIChnZW5lcmljID09IE5VTEwpIHsKLQkJCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJCXJldHVybiBQeV9Ob25lOwotCQl9Ci0JCWlmIChnZW5lcmljID09IEZMX0VWRU5UKSB7Ci0JCQlpbnQgZGV2OwotCQkJc2hvcnQgdmFsOwotCQkJaWYgKG15X2V2ZW50X2NhbGxiYWNrID09IE5VTEwpCi0JCQkJcmV0dXJuIFB5SW50X0Zyb21Mb25nKC0xTCk7Ci0JCQlkZXYgPSBmbF9xcmVhZCgmdmFsKTsKLQkJCWFyZyA9IFB5X0J1aWxkVmFsdWUoIihpaCkiLCBkZXYsIHZhbCk7Ci0JCQlpZiAoYXJnID09IE5VTEwpCi0JCQkJcmV0dXJuIE5VTEw7Ci0JCQlyZXMgPSBQeUV2YWxfQ2FsbE9iamVjdChteV9ldmVudF9jYWxsYmFjaywgYXJnKTsKLQkJCVB5X1hERUNSRUYocmVzKTsKLQkJCVB5X0RFQ1JFRihhcmcpOwotCQkJaWYgKHJlcyA9PSBOVUxMKQotCQkJCXJldHVybiBOVUxMOyAvKiBDYWxsYmFjayByYWlzZWQgZXhjZXB0aW9uICovCi0JCQljb250aW51ZTsKLQkJfQotCQlnID0gZmluZGdlbmVyaWMoZ2VuZXJpYyk7Ci0JCWlmIChnID09IE5VTEwpIHsKLQkJCS8qIE9iamVjdCBub3Qga25vd24gdG8gdXMgKHNvbWUgZGlhbG9ncyBjYXVzZSB0aGlzKSAqLwotCQkJY29udGludWU7IC8qIElnbm9yZSBpdCAqLwotCQl9Ci0JCWlmIChnLT5vYl9jYWxsYmFjayA9PSBOVUxMKSB7Ci0JCQlQeV9JTkNSRUYoZyk7Ci0JCQlyZXR1cm4gKChQeU9iamVjdCAqKSBnKTsKLQkJfQotCQlhcmcgPSBQeVR1cGxlX1BhY2soMiwgKFB5T2JqZWN0ICopZywgZy0+b2JfY2FsbGJhY2tfYXJnKTsKLQkJaWYgKGFyZyA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCXJlcyA9IFB5RXZhbF9DYWxsT2JqZWN0KGctPm9iX2NhbGxiYWNrLCBhcmcpOwotCQlQeV9YREVDUkVGKHJlcyk7Ci0JCVB5X0RFQ1JFRihhcmcpOwotCQlpZiAocmVzID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsgLyogQ2FsbGJhY2sgcmFpc2VkIGV4Y2VwdGlvbiAqLwotCX0KKyAgICBmb3IgKDs7KSB7CisgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgZ2VuZXJpYyA9ICgqZnVuYykoKTsKKyAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgaWYgKGdlbmVyaWMgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGdlbmVyaWMgPT0gRkxfRVZFTlQpIHsKKyAgICAgICAgICAgIGludCBkZXY7CisgICAgICAgICAgICBzaG9ydCB2YWw7CisgICAgICAgICAgICBpZiAobXlfZXZlbnRfY2FsbGJhY2sgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoLTFMKTsKKyAgICAgICAgICAgIGRldiA9IGZsX3FyZWFkKCZ2YWwpOworICAgICAgICAgICAgYXJnID0gUHlfQnVpbGRWYWx1ZSgiKGloKSIsIGRldiwgdmFsKTsKKyAgICAgICAgICAgIGlmIChhcmcgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIHJlcyA9IFB5RXZhbF9DYWxsT2JqZWN0KG15X2V2ZW50X2NhbGxiYWNrLCBhcmcpOworICAgICAgICAgICAgUHlfWERFQ1JFRihyZXMpOworICAgICAgICAgICAgUHlfREVDUkVGKGFyZyk7CisgICAgICAgICAgICBpZiAocmVzID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7IC8qIENhbGxiYWNrIHJhaXNlZCBleGNlcHRpb24gKi8KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGcgPSBmaW5kZ2VuZXJpYyhnZW5lcmljKTsKKyAgICAgICAgaWYgKGcgPT0gTlVMTCkgeworICAgICAgICAgICAgLyogT2JqZWN0IG5vdCBrbm93biB0byB1cyAoc29tZSBkaWFsb2dzIGNhdXNlIHRoaXMpICovCisgICAgICAgICAgICBjb250aW51ZTsgLyogSWdub3JlIGl0ICovCisgICAgICAgIH0KKyAgICAgICAgaWYgKGctPm9iX2NhbGxiYWNrID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihnKTsKKyAgICAgICAgICAgIHJldHVybiAoKFB5T2JqZWN0ICopIGcpOworICAgICAgICB9CisgICAgICAgIGFyZyA9IFB5VHVwbGVfUGFjaygyLCAoUHlPYmplY3QgKilnLCBnLT5vYl9jYWxsYmFja19hcmcpOworICAgICAgICBpZiAoYXJnID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgcmVzID0gUHlFdmFsX0NhbGxPYmplY3QoZy0+b2JfY2FsbGJhY2ssIGFyZyk7CisgICAgICAgIFB5X1hERUNSRUYocmVzKTsKKyAgICAgICAgUHlfREVDUkVGKGFyZyk7CisgICAgICAgIGlmIChyZXMgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOyAvKiBDYWxsYmFjayByYWlzZWQgZXhjZXB0aW9uICovCisgICAgfQogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZm9ybXNfZG9fZm9ybXMoUHlPYmplY3QgKmR1bW15KQogewotCXJldHVybiBmb3Jtc19kb19vcl9jaGVja19mb3JtcyhkdW1teSwgZmxfZG9fZm9ybXMpOworICAgIHJldHVybiBmb3Jtc19kb19vcl9jaGVja19mb3JtcyhkdW1teSwgZmxfZG9fZm9ybXMpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZm9ybXNfY2hlY2tfZm9ybXMoUHlPYmplY3QgKmR1bW15KQogewotCXJldHVybiBmb3Jtc19kb19vcl9jaGVja19mb3JtcyhkdW1teSwgZmxfY2hlY2tfZm9ybXMpOworICAgIHJldHVybiBmb3Jtc19kb19vcl9jaGVja19mb3JtcyhkdW1teSwgZmxfY2hlY2tfZm9ybXMpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZm9ybXNfZG9fb25seV9mb3JtcyhQeU9iamVjdCAqZHVtbXkpCiB7Ci0JcmV0dXJuIGZvcm1zX2RvX29yX2NoZWNrX2Zvcm1zKGR1bW15LCBmbF9kb19vbmx5X2Zvcm1zKTsKKyAgICByZXR1cm4gZm9ybXNfZG9fb3JfY2hlY2tfZm9ybXMoZHVtbXksIGZsX2RvX29ubHlfZm9ybXMpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZm9ybXNfY2hlY2tfb25seV9mb3JtcyhQeU9iamVjdCAqZHVtbXkpCiB7Ci0JcmV0dXJuIGZvcm1zX2RvX29yX2NoZWNrX2Zvcm1zKGR1bW15LCBmbF9jaGVja19vbmx5X2Zvcm1zKTsKKyAgICByZXR1cm4gZm9ybXNfZG9fb3JfY2hlY2tfZm9ybXMoZHVtbXksIGZsX2NoZWNrX29ubHlfZm9ybXMpOwogfQogCiAjaWZkZWYgVU5VU0VECiBzdGF0aWMgUHlPYmplY3QgKgogZmxfY2FsbCh2b2lkICgqZnVuYykodm9pZCkpCiB7Ci0JKCpmdW5jKSgpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICAoKmZ1bmMpKCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogI2VuZGlmCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmb3Jtc19zZXRfZ3JhcGhpY3NfbW9kZShQeU9iamVjdCAqZHVtbXksIFB5T2JqZWN0ICphcmdzKQogewotCWludCByZ2Jtb2RlLCBkb3VibGVidWY7CisgICAgaW50IHJnYm1vZGUsIGRvdWJsZWJ1ZjsKIAotCWlmICghUHlBcmdfUGFyc2UoYXJncywgIihpaSkiLCAmcmdibW9kZSwgJmRvdWJsZWJ1ZikpCi0JCXJldHVybiBOVUxMOwotCWZsX3NldF9ncmFwaGljc19tb2RlKHJnYm1vZGUsZG91YmxlYnVmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiKGlpKSIsICZyZ2Jtb2RlLCAmZG91YmxlYnVmKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZmxfc2V0X2dyYXBoaWNzX21vZGUocmdibW9kZSxkb3VibGVidWYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZvcm1zX2dldF9yZ2Jtb2RlKFB5T2JqZWN0ICpkdW1teSwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZXh0ZXJuIGludCBmbF9yZ2Jtb2RlOworICAgIGV4dGVybiBpbnQgZmxfcmdibW9kZTsKIAotCWlmIChhcmdzICE9IE5VTEwpIHsKLQkJUHlFcnJfQmFkQXJndW1lbnQoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZylmbF9yZ2Jtb2RlKTsKKyAgICBpZiAoYXJncyAhPSBOVUxMKSB7CisgICAgICAgIFB5RXJyX0JhZEFyZ3VtZW50KCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpZmxfcmdibW9kZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmb3Jtc19zaG93X2Vycm9ycyhQeU9iamVjdCAqZHVtbXksIFB5T2JqZWN0ICphcmdzKQogewotCWludCBzaG93OwotCWlmICghUHlBcmdfUGFyc2UoYXJncywgImkiLCAmc2hvdykpCi0JCXJldHVybiBOVUxMOwotCWZsX3Nob3dfZXJyb3JzKHNob3cpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpbnQgc2hvdzsKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICJpIiwgJnNob3cpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBmbF9zaG93X2Vycm9ycyhzaG93KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmb3Jtc19zZXRfZm9udF9uYW1lKFB5T2JqZWN0ICpkdW1teSwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IG51bWI7Ci0JY2hhciAqbmFtZTsKLQlpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICIoaXMpIiwgJm51bWIsICZuYW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZmxfc2V0X2ZvbnRfbmFtZShudW1iLCBuYW1lKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaW50IG51bWI7CisgICAgY2hhciAqbmFtZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICIoaXMpIiwgJm51bWIsICZuYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZmxfc2V0X2ZvbnRfbmFtZShudW1iLCBuYW1lKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIAogc3RhdGljIFB5T2JqZWN0ICoKIGZvcm1zX3FkZXZpY2UoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzE7Ci0JaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiaCIsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZmxfcWRldmljZShhcmcxKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICJoIiwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBmbF9xZGV2aWNlKGFyZzEpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZvcm1zX3VucWRldmljZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMTsKLQlpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICJoIiwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlmbF91bnFkZXZpY2UoYXJnMSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzE7CisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiaCIsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZmxfdW5xZGV2aWNlKGFyZzEpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZvcm1zX2lzcXVldWVkKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIHJldHZhbDsKLQlzaG9ydCBhcmcxOwotCWlmICghUHlBcmdfUGFyc2UoYXJncywgImgiLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCXJldHZhbCA9IGZsX2lzcXVldWVkKGFyZzEpOworICAgIGxvbmcgcmV0dmFsOworICAgIHNob3J0IGFyZzE7CisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiaCIsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dmFsID0gZmxfaXNxdWV1ZWQoYXJnMSk7CiAKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcocmV0dmFsKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcocmV0dmFsKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZvcm1zX3F0ZXN0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIHJldHZhbDsKLQlyZXR2YWwgPSBmbF9xdGVzdCgpOwotCXJldHVybiBQeUludF9Gcm9tTG9uZyhyZXR2YWwpOworICAgIGxvbmcgcmV0dmFsOworICAgIHJldHZhbCA9IGZsX3F0ZXN0KCk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHJldHZhbCk7CiB9CiAKIAogc3RhdGljIFB5T2JqZWN0ICoKIGZvcm1zX3FyZWFkKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgZGV2OwotCXNob3J0IHZhbDsKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JZGV2ID0gZmxfcXJlYWQoJnZhbCk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKGloKSIsIGRldiwgdmFsKTsKKyAgICBpbnQgZGV2OworICAgIHNob3J0IHZhbDsKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgZGV2ID0gZmxfcXJlYWQoJnZhbCk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKGloKSIsIGRldiwgdmFsKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZvcm1zX3FyZXNldChQeU9iamVjdCAqc2VsZikKIHsKLQlmbF9xcmVzZXQoKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZmxfcXJlc2V0KCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZm9ybXNfcWVudGVyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxLCBhcmcyOwotCWlmICghUHlBcmdfUGFyc2UoYXJncywgIihoaCkiLCAmYXJnMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlmbF9xZW50ZXIoYXJnMSwgYXJnMik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEsIGFyZzI7CisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiKGhoKSIsICZhcmcxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGZsX3FlbnRlcihhcmcxLCBhcmcyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmb3Jtc19jb2xvcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IGFyZzsKKyAgICBpbnQgYXJnOwogCi0JaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiaSIsICZhcmcpKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICJpIiwgJmFyZykpIHJldHVybiBOVUxMOwogCi0JZmxfY29sb3IoKHNob3J0KSBhcmcpOworICAgIGZsX2NvbG9yKChzaG9ydCkgYXJnKTsKIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmb3Jtc19tYXBjb2xvcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IGFyZzAsIGFyZzEsIGFyZzIsIGFyZzM7CisgICAgaW50IGFyZzAsIGFyZzEsIGFyZzIsIGFyZzM7CiAKLQlpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICIoaWlpaSkiLCAmYXJnMCwgJmFyZzEsICZhcmcyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2UoYXJncywgIihpaWlpKSIsICZhcmcwLCAmYXJnMSwgJmFyZzIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlmbF9tYXBjb2xvcihhcmcwLCAoc2hvcnQpIGFyZzEsIChzaG9ydCkgYXJnMiwgKHNob3J0KSBhcmczKTsKKyAgICBmbF9tYXBjb2xvcihhcmcwLCAoc2hvcnQpIGFyZzEsIChzaG9ydCkgYXJnMiwgKHNob3J0KSBhcmczKTsKIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmb3Jtc19nZXRtY29sb3IoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBhcmc7Ci0Jc2hvcnQgciwgZywgYjsKKyAgICBpbnQgYXJnOworICAgIHNob3J0IHIsIGcsIGI7CiAKLQlpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICJpIiwgJmFyZykpIHJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2UoYXJncywgImkiLCAmYXJnKSkgcmV0dXJuIE5VTEw7CiAKLQlmbF9nZXRtY29sb3IoYXJnLCAmciwgJmcsICZiKTsKKyAgICBmbF9nZXRtY29sb3IoYXJnLCAmciwgJmcsICZiKTsKIAotCXJldHVybiBQeV9CdWlsZFZhbHVlKCIoaGhoKSIsIHIsIGcsIGIpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIoaGhoKSIsIHIsIGcsIGIpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZm9ybXNfZ2V0X21vdXNlKFB5T2JqZWN0ICpzZWxmKQogewotCWZsb2F0IHgsIHk7CisgICAgZmxvYXQgeCwgeTsKIAotCWZsX2dldF9tb3VzZSgmeCwgJnkpOworICAgIGZsX2dldF9tb3VzZSgmeCwgJnkpOwogCi0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihmZikiLCB4LCB5KTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKGZmKSIsIHgsIHkpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZm9ybXNfdGllKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxLCBhcmcyLCBhcmczOwotCWlmICghUHlBcmdfUGFyc2UoYXJncywgIihoaGgpIiwgJmFyZzEsICZhcmcyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCWZsX3RpZShhcmcxLCBhcmcyLCBhcmczKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSwgYXJnMiwgYXJnMzsKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICIoaGhoKSIsICZhcmcxLCAmYXJnMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBmbF90aWUoYXJnMSwgYXJnMiwgYXJnMyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZm9ybXNfc2hvd19tZXNzYWdlKFB5T2JqZWN0ICpmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICphLCAqYiwgKmM7CisgICAgY2hhciAqYSwgKmIsICpjOwogCi0JaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiKHNzcykiLCAmYSwgJmIsICZjKSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiKHNzcykiLCAmYSwgJmIsICZjKSkgcmV0dXJuIE5VTEw7CiAKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JZmxfc2hvd19tZXNzYWdlKGEsIGIsIGMpOwotCVB5X0VORF9BTExPV19USFJFQURTCisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIGZsX3Nob3dfbWVzc2FnZShhLCBiLCBjKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZvcm1zX3Nob3dfY2hvaWNlKFB5T2JqZWN0ICpmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICptMSwgKm0yLCAqbTMsICpiMSwgKmIyLCAqYjM7Ci0JaW50IG5iOwotCWNoYXIgKmZvcm1hdDsKLQlsb25nIHJ2OworICAgIGNoYXIgKm0xLCAqbTIsICptMywgKmIxLCAqYjIsICpiMzsKKyAgICBpbnQgbmI7CisgICAgY2hhciAqZm9ybWF0OworICAgIGxvbmcgcnY7CiAKLQlpZiAoYXJncyA9PSBOVUxMIHx8ICFQeVR1cGxlX0NoZWNrKGFyZ3MpKSB7Ci0JCVB5RXJyX0JhZEFyZ3VtZW50KCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQluYiA9IFB5VHVwbGVfU2l6ZShhcmdzKSAtIDM7Ci0JaWYgKG5iIDw9IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkibmVlZCBhdCBsZWFzdCBvbmUgYnV0dG9uIGxhYmVsIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoUHlJbnRfQ2hlY2soUHlUdXBsZV9HZXRJdGVtKGFyZ3MsIDMpKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJICAgIidudW1iZXItb2YtYnV0dG9ucycgYXJndW1lbnQgbm90IG5lZWRlZCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0Jc3dpdGNoIChuYikgewotCWNhc2UgMTogZm9ybWF0ID0gIihzc3NzKSI7IGJyZWFrOwotCWNhc2UgMjogZm9ybWF0ID0gIihzc3NzcykiOyBicmVhazsKLQljYXNlIDM6IGZvcm1hdCA9ICIoc3Nzc3NzKSI7IGJyZWFrOwotCWRlZmF1bHQ6Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJ0b28gbWFueSBidXR0b24gbGFiZWxzIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoYXJncyA9PSBOVUxMIHx8ICFQeVR1cGxlX0NoZWNrKGFyZ3MpKSB7CisgICAgICAgIFB5RXJyX0JhZEFyZ3VtZW50KCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBuYiA9IFB5VHVwbGVfU2l6ZShhcmdzKSAtIDM7CisgICAgaWYgKG5iIDw9IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJuZWVkIGF0IGxlYXN0IG9uZSBidXR0b24gbGFiZWwiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChQeUludF9DaGVjayhQeVR1cGxlX0dldEl0ZW0oYXJncywgMykpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgIidudW1iZXItb2YtYnV0dG9ucycgYXJndW1lbnQgbm90IG5lZWRlZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgc3dpdGNoIChuYikgeworICAgIGNhc2UgMTogZm9ybWF0ID0gIihzc3NzKSI7IGJyZWFrOworICAgIGNhc2UgMjogZm9ybWF0ID0gIihzc3NzcykiOyBicmVhazsKKyAgICBjYXNlIDM6IGZvcm1hdCA9ICIoc3Nzc3NzKSI7IGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJ0b28gbWFueSBidXR0b24gbGFiZWxzIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWlmICghUHlBcmdfUGFyc2UoYXJncywgZm9ybWF0LCAmbTEsICZtMiwgJm0zLCAmYjEsICZiMiwgJmIzKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmdzLCBmb3JtYXQsICZtMSwgJm0yLCAmbTMsICZiMSwgJmIyLCAmYjMpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlydiA9IGZsX3Nob3dfY2hvaWNlKG0xLCBtMiwgbTMsIG5iLCBiMSwgYjIsIGIzKTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCXJldHVybiBQeUludF9Gcm9tTG9uZyhydik7CisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIHJ2ID0gZmxfc2hvd19jaG9pY2UobTEsIG0yLCBtMywgbmIsIGIxLCBiMiwgYjMpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHJ2KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZvcm1zX3Nob3dfcXVlc3Rpb24oUHlPYmplY3QgKmYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCByZXQ7Ci0JY2hhciAqYSwgKmIsICpjOworICAgIGludCByZXQ7CisgICAgY2hhciAqYSwgKmIsICpjOwogCi0JaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiKHNzcykiLCAmYSwgJmIsICZjKSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiKHNzcykiLCAmYSwgJmIsICZjKSkgcmV0dXJuIE5VTEw7CiAKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JcmV0ID0gZmxfc2hvd19xdWVzdGlvbihhLCBiLCBjKTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICByZXQgPSBmbF9zaG93X3F1ZXN0aW9uKGEsIGIsIGMpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCiAKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIHJldCk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKSByZXQpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZm9ybXNfc2hvd19pbnB1dChQeU9iamVjdCAqZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqc3RyOwotCWNoYXIgKmEsICpiOworICAgIGNoYXIgKnN0cjsKKyAgICBjaGFyICphLCAqYjsKIAotCWlmICghUHlBcmdfUGFyc2UoYXJncywgIihzcykiLCAmYSwgJmIpKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICIoc3MpIiwgJmEsICZiKSkgcmV0dXJuIE5VTEw7CiAKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0Jc3RyID0gZmxfc2hvd19pbnB1dChhLCBiKTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICBzdHIgPSBmbF9zaG93X2lucHV0KGEsIGIpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCiAKLQlpZiAoc3RyID09IE5VTEwpIHsKLQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQlyZXR1cm4gUHlfTm9uZTsKLQl9Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoc3RyKTsKKyAgICBpZiAoc3RyID09IE5VTEwpIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICB9CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoc3RyKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZvcm1zX2ZpbGVfc2VsZWN0b3IoUHlPYmplY3QgKmYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKnN0cjsKLQljaGFyICphLCAqYiwgKmMsICpkOworICAgIGNoYXIgKnN0cjsKKyAgICBjaGFyICphLCAqYiwgKmMsICpkOwogCi0JaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiKHNzc3MpIiwgJmEsICZiLCAmYywgJmQpKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICIoc3NzcykiLCAmYSwgJmIsICZjLCAmZCkpIHJldHVybiBOVUxMOwogCi0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCXN0ciA9IGZsX3Nob3dfZmlsZV9zZWxlY3RvcihhLCBiLCBjLCBkKTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICBzdHIgPSBmbF9zaG93X2ZpbGVfc2VsZWN0b3IoYSwgYiwgYywgZCk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKIAotCWlmIChzdHIgPT0gTlVMTCkgewotCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCXJldHVybiBQeV9Ob25lOwotCX0KLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhzdHIpOworICAgIGlmIChzdHIgPT0gTlVMTCkgeworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIHJldHVybiBQeV9Ob25lOworICAgIH0KKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhzdHIpOwogfQogCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmb3Jtc19maWxlX3NlbGVjdG9yX2Z1bmMoUHlPYmplY3QgKmFyZ3MsIGNoYXIgKigqZnVuYykodm9pZCkpCiB7Ci0JY2hhciAqc3RyOworICAgIGNoYXIgKnN0cjsKIAotCXN0ciA9ICgqZnVuYykgKCk7CisgICAgc3RyID0gKCpmdW5jKSAoKTsKIAotCWlmIChzdHIgPT0gTlVMTCkgewotCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCXJldHVybiBQeV9Ob25lOwotCX0KLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhzdHIpOworICAgIGlmIChzdHIgPT0gTlVMTCkgeworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIHJldHVybiBQeV9Ob25lOworICAgIH0KKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhzdHIpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZm9ybXNfZ2V0X2RpcmVjdG9yeShQeU9iamVjdCAqZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGZvcm1zX2ZpbGVfc2VsZWN0b3JfZnVuYyhhcmdzLCBmbF9nZXRfZGlyZWN0b3J5KTsKKyAgICByZXR1cm4gZm9ybXNfZmlsZV9zZWxlY3Rvcl9mdW5jKGFyZ3MsIGZsX2dldF9kaXJlY3RvcnkpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZm9ybXNfZ2V0X3BhdHRlcm4oUHlPYmplY3QgKmYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBmb3Jtc19maWxlX3NlbGVjdG9yX2Z1bmMoYXJncywgZmxfZ2V0X3BhdHRlcm4pOworICAgIHJldHVybiBmb3Jtc19maWxlX3NlbGVjdG9yX2Z1bmMoYXJncywgZmxfZ2V0X3BhdHRlcm4pOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZm9ybXNfZ2V0X2ZpbGVuYW1lKFB5T2JqZWN0ICpmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gZm9ybXNfZmlsZV9zZWxlY3Rvcl9mdW5jKGFyZ3MsIGZsX2dldF9maWxlbmFtZSk7CisgICAgcmV0dXJuIGZvcm1zX2ZpbGVfc2VsZWN0b3JfZnVuYyhhcmdzLCBmbF9nZXRfZmlsZW5hbWUpOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgZm9ybXNfbWV0aG9kc1tdID0gewogLyogYWRtICovCi0JeyJtYWtlX2Zvcm0iLAkJZm9ybXNfbWFrZV9mb3JtLCBNRVRIX09MREFSR1N9LAotCXsiYWN0aXZhdGVfYWxsX2Zvcm1zIiwJZm9ybXNfYWN0aXZhdGVfYWxsX2Zvcm1zLCBNRVRIX09MREFSR1N9LAotCXsiZGVhY3RpdmF0ZV9hbGxfZm9ybXMiLGZvcm1zX2RlYWN0aXZhdGVfYWxsX2Zvcm1zLCBNRVRIX09MREFSR1N9LAorICAgIHsibWFrZV9mb3JtIiwgICAgICAgICAgICAgICBmb3Jtc19tYWtlX2Zvcm0sIE1FVEhfT0xEQVJHU30sCisgICAgeyJhY3RpdmF0ZV9hbGxfZm9ybXMiLCAgICAgIGZvcm1zX2FjdGl2YXRlX2FsbF9mb3JtcywgTUVUSF9PTERBUkdTfSwKKyAgICB7ImRlYWN0aXZhdGVfYWxsX2Zvcm1zIixmb3Jtc19kZWFjdGl2YXRlX2FsbF9mb3JtcywgTUVUSF9PTERBUkdTfSwKIC8qIGdsIHN1cHBvcnQgd3JhcHBlcnMgKi8KLQl7InFkZXZpY2UiLAkJZm9ybXNfcWRldmljZSwgTUVUSF9PTERBUkdTfSwKLQl7InVucWRldmljZSIsCQlmb3Jtc191bnFkZXZpY2UsIE1FVEhfT0xEQVJHU30sCi0JeyJpc3F1ZXVlZCIsCQlmb3Jtc19pc3F1ZXVlZCwgTUVUSF9PTERBUkdTfSwKLQl7InF0ZXN0IiwJCWZvcm1zX3F0ZXN0LCBNRVRIX09MREFSR1N9LAotCXsicXJlYWQiLAkJZm9ybXNfcXJlYWQsIE1FVEhfT0xEQVJHU30sCi0vKgl7ImJsa3FyZWFkIiwJCWZvcm1zX2Jsa3FyZWFkLCBNRVRIX09MREFSR1N9LCAqLwotCXsicXJlc2V0IiwJCWZvcm1zX3FyZXNldCwgTUVUSF9OT0FSR1N9LAotCXsicWVudGVyIiwJCWZvcm1zX3FlbnRlciwgTUVUSF9PTERBUkdTfSwKLQl7ImdldF9tb3VzZSIsCQlmb3Jtc19nZXRfbW91c2UsIE1FVEhfTk9BUkdTfSwKLQl7InRpZSIsCQkJZm9ybXNfdGllLCBNRVRIX09MREFSR1N9LAotLyoJeyJuZXdfZXZlbnRzIiwJCWZvcm1zX25ld19ldmVudHMsIE1FVEhfT0xEQVJHU30sICovCi0JeyJjb2xvciIsCQlmb3Jtc19jb2xvciwgTUVUSF9PTERBUkdTfSwKLQl7Im1hcGNvbG9yIiwJCWZvcm1zX21hcGNvbG9yLCBNRVRIX09MREFSR1N9LAotCXsiZ2V0bWNvbG9yIiwJCWZvcm1zX2dldG1jb2xvciwgTUVUSF9PTERBUkdTfSwKKyAgICB7InFkZXZpY2UiLCAgICAgICAgICAgICAgICAgZm9ybXNfcWRldmljZSwgTUVUSF9PTERBUkdTfSwKKyAgICB7InVucWRldmljZSIsICAgICAgICAgICAgICAgZm9ybXNfdW5xZGV2aWNlLCBNRVRIX09MREFSR1N9LAorICAgIHsiaXNxdWV1ZWQiLCAgICAgICAgICAgICAgICBmb3Jtc19pc3F1ZXVlZCwgTUVUSF9PTERBUkdTfSwKKyAgICB7InF0ZXN0IiwgICAgICAgICAgICAgICAgICAgZm9ybXNfcXRlc3QsIE1FVEhfT0xEQVJHU30sCisgICAgeyJxcmVhZCIsICAgICAgICAgICAgICAgICAgIGZvcm1zX3FyZWFkLCBNRVRIX09MREFSR1N9LAorLyogICAgICB7ImJsa3FyZWFkIiwgICAgICAgICAgICBmb3Jtc19ibGtxcmVhZCwgTUVUSF9PTERBUkdTfSwgKi8KKyAgICB7InFyZXNldCIsICAgICAgICAgICAgICAgICAgZm9ybXNfcXJlc2V0LCBNRVRIX05PQVJHU30sCisgICAgeyJxZW50ZXIiLCAgICAgICAgICAgICAgICAgIGZvcm1zX3FlbnRlciwgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldF9tb3VzZSIsICAgICAgICAgICAgICAgZm9ybXNfZ2V0X21vdXNlLCBNRVRIX05PQVJHU30sCisgICAgeyJ0aWUiLCAgICAgICAgICAgICAgICAgICAgIGZvcm1zX3RpZSwgTUVUSF9PTERBUkdTfSwKKy8qICAgICAgeyJuZXdfZXZlbnRzIiwgICAgICAgICAgZm9ybXNfbmV3X2V2ZW50cywgTUVUSF9PTERBUkdTfSwgKi8KKyAgICB7ImNvbG9yIiwgICAgICAgICAgICAgICAgICAgZm9ybXNfY29sb3IsIE1FVEhfT0xEQVJHU30sCisgICAgeyJtYXBjb2xvciIsICAgICAgICAgICAgICAgIGZvcm1zX21hcGNvbG9yLCBNRVRIX09MREFSR1N9LAorICAgIHsiZ2V0bWNvbG9yIiwgICAgICAgICAgICAgICBmb3Jtc19nZXRtY29sb3IsIE1FVEhfT0xEQVJHU30sCiAvKiBpbnRlcmFjdGlvbiAqLwotCXsiZG9fZm9ybXMiLAkJZm9ybXNfZG9fZm9ybXMsIE1FVEhfTk9BUkdTfSwKLQl7ImRvX29ubHlfZm9ybXMiLAlmb3Jtc19kb19vbmx5X2Zvcm1zLCBNRVRIX05PQVJHU30sCi0JeyJjaGVja19mb3JtcyIsCQlmb3Jtc19jaGVja19mb3JtcywgTUVUSF9OT0FSR1N9LAotCXsiY2hlY2tfb25seV9mb3JtcyIsCWZvcm1zX2NoZWNrX29ubHlfZm9ybXMsIE1FVEhfTk9BUkdTfSwKLQl7InNldF9ldmVudF9jYWxsX2JhY2siLAlmb3Jtc19zZXRfZXZlbnRfY2FsbF9iYWNrLCBNRVRIX09MREFSR1N9LAorICAgIHsiZG9fZm9ybXMiLCAgICAgICAgICAgICAgICBmb3Jtc19kb19mb3JtcywgTUVUSF9OT0FSR1N9LAorICAgIHsiZG9fb25seV9mb3JtcyIsICAgICAgICAgICBmb3Jtc19kb19vbmx5X2Zvcm1zLCBNRVRIX05PQVJHU30sCisgICAgeyJjaGVja19mb3JtcyIsICAgICAgICAgICAgIGZvcm1zX2NoZWNrX2Zvcm1zLCBNRVRIX05PQVJHU30sCisgICAgeyJjaGVja19vbmx5X2Zvcm1zIiwgICAgICAgIGZvcm1zX2NoZWNrX29ubHlfZm9ybXMsIE1FVEhfTk9BUkdTfSwKKyAgICB7InNldF9ldmVudF9jYWxsX2JhY2siLCAgICAgZm9ybXNfc2V0X2V2ZW50X2NhbGxfYmFjaywgTUVUSF9PTERBUkdTfSwKIC8qIGdvb2RpZXMgKi8KLQl7InNob3dfbWVzc2FnZSIsCWZvcm1zX3Nob3dfbWVzc2FnZSwgTUVUSF9PTERBUkdTfSwKLQl7InNob3dfcXVlc3Rpb24iLAlmb3Jtc19zaG93X3F1ZXN0aW9uLCBNRVRIX09MREFSR1N9LAotCXsic2hvd19jaG9pY2UiLAkJZm9ybXNfc2hvd19jaG9pY2UsIE1FVEhfT0xEQVJHU30sCi0JeyJzaG93X2lucHV0IiwJCWZvcm1zX3Nob3dfaW5wdXQsIE1FVEhfT0xEQVJHU30sCi0JeyJzaG93X2ZpbGVfc2VsZWN0b3IiLAlmb3Jtc19maWxlX3NlbGVjdG9yLCBNRVRIX09MREFSR1N9LAotCXsiZmlsZV9zZWxlY3RvciIsCWZvcm1zX2ZpbGVfc2VsZWN0b3IsIE1FVEhfT0xEQVJHU30sIC8qIEJXIGNvbXBhdCAqLwotCXsiZ2V0X2RpcmVjdG9yeSIsCWZvcm1zX2dldF9kaXJlY3RvcnksIE1FVEhfT0xEQVJHU30sCi0JeyJnZXRfcGF0dGVybiIsCQlmb3Jtc19nZXRfcGF0dGVybiwgTUVUSF9PTERBUkdTfSwKLQl7ImdldF9maWxlbmFtZSIsCWZvcm1zX2dldF9maWxlbmFtZSwgTUVUSF9PTERBUkdTfSwKLQl7InNldF9ncmFwaGljc19tb2RlIiwJZm9ybXNfc2V0X2dyYXBoaWNzX21vZGUsIE1FVEhfT0xEQVJHU30sCi0JeyJnZXRfcmdibW9kZSIsCQlmb3Jtc19nZXRfcmdibW9kZSwgTUVUSF9PTERBUkdTfSwKLQl7InNob3dfZXJyb3JzIiwJCWZvcm1zX3Nob3dfZXJyb3JzLCBNRVRIX09MREFSR1N9LAotCXsic2V0X2ZvbnRfbmFtZSIsCWZvcm1zX3NldF9mb250X25hbWUsIE1FVEhfT0xEQVJHU30sCi0Je05VTEwsCQkJTlVMTH0JCS8qIHNlbnRpbmVsICovCisgICAgeyJzaG93X21lc3NhZ2UiLCAgICAgICAgICAgIGZvcm1zX3Nob3dfbWVzc2FnZSwgTUVUSF9PTERBUkdTfSwKKyAgICB7InNob3dfcXVlc3Rpb24iLCAgICAgICAgICAgZm9ybXNfc2hvd19xdWVzdGlvbiwgTUVUSF9PTERBUkdTfSwKKyAgICB7InNob3dfY2hvaWNlIiwgICAgICAgICAgICAgZm9ybXNfc2hvd19jaG9pY2UsIE1FVEhfT0xEQVJHU30sCisgICAgeyJzaG93X2lucHV0IiwgICAgICAgICAgICAgIGZvcm1zX3Nob3dfaW5wdXQsIE1FVEhfT0xEQVJHU30sCisgICAgeyJzaG93X2ZpbGVfc2VsZWN0b3IiLCAgICAgIGZvcm1zX2ZpbGVfc2VsZWN0b3IsIE1FVEhfT0xEQVJHU30sCisgICAgeyJmaWxlX3NlbGVjdG9yIiwgICAgICAgICAgIGZvcm1zX2ZpbGVfc2VsZWN0b3IsIE1FVEhfT0xEQVJHU30sIC8qIEJXIGNvbXBhdCAqLworICAgIHsiZ2V0X2RpcmVjdG9yeSIsICAgICAgICAgICBmb3Jtc19nZXRfZGlyZWN0b3J5LCBNRVRIX09MREFSR1N9LAorICAgIHsiZ2V0X3BhdHRlcm4iLCAgICAgICAgICAgICBmb3Jtc19nZXRfcGF0dGVybiwgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldF9maWxlbmFtZSIsICAgICAgICAgICAgZm9ybXNfZ2V0X2ZpbGVuYW1lLCBNRVRIX09MREFSR1N9LAorICAgIHsic2V0X2dyYXBoaWNzX21vZGUiLCAgICAgICBmb3Jtc19zZXRfZ3JhcGhpY3NfbW9kZSwgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldF9yZ2Jtb2RlIiwgICAgICAgICAgICAgZm9ybXNfZ2V0X3JnYm1vZGUsIE1FVEhfT0xEQVJHU30sCisgICAgeyJzaG93X2Vycm9ycyIsICAgICAgICAgICAgIGZvcm1zX3Nob3dfZXJyb3JzLCBNRVRIX09MREFSR1N9LAorICAgIHsic2V0X2ZvbnRfbmFtZSIsICAgICAgICAgICBmb3Jtc19zZXRfZm9udF9uYW1lLCBNRVRIX09MREFSR1N9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIFB5TU9ESU5JVF9GVU5DCiBpbml0Zmwodm9pZCkKIHsKLSAgICAKKwogICAgIGlmIChQeUVycl9XYXJuUHkzaygidGhlIGZsIG1vZHVsZSBoYXMgYmVlbiByZW1vdmVkIGluICIKICAgICAgICAgICAgICAgICAgICAgICAgIlB5dGhvbiAzLjAiLCAyKSA8IDApCisgICAgcmV0dXJuOworCisgICAgUHlfSW5pdE1vZHVsZSgiZmwiLCBmb3Jtc19tZXRob2RzKTsKKyAgICBpZiAobSA9PSBOVUxMKQogICAgICAgICByZXR1cm47Ci0gICAgCi0JUHlfSW5pdE1vZHVsZSgiZmwiLCBmb3Jtc19tZXRob2RzKTsKLQlpZiAobSA9PSBOVUxMKQotCQlyZXR1cm47Ci0JZm9yZWdyb3VuZCgpOwotCWZsX2luaXQoKTsKKyAgICBmb3JlZ3JvdW5kKCk7CisgICAgZmxfaW5pdCgpOwogfQogCiAKZGlmZiAtLWdpdCBhL01vZHVsZXMvZm1tb2R1bGUuYyBiL01vZHVsZXMvZm1tb2R1bGUuYwppbmRleCBmM2YwZGM1Li4zYTc0MTA3IDEwMDY0NAotLS0gYS9Nb2R1bGVzL2ZtbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9mbW1vZHVsZS5jCkBAIC0xMSwyOCArMTEsMjggQEAKIC8qIEZvbnQgSGFuZGxlIG9iamVjdCBpbXBsZW1lbnRhdGlvbiAqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCWZtZm9udGhhbmRsZSBmaF9maDsKKyAgICBQeU9iamVjdF9IRUFECisgICAgZm1mb250aGFuZGxlIGZoX2ZoOwogfSBmaG9iamVjdDsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBGaHR5cGU7CiAKLSNkZWZpbmUgaXNfZmhvYmplY3QodikJCSgodiktPm9iX3R5cGUgPT0gJkZodHlwZSkKKyNkZWZpbmUgaXNfZmhvYmplY3QodikgICAgICAgICAgKCh2KS0+b2JfdHlwZSA9PSAmRmh0eXBlKQogCiBzdGF0aWMgUHlPYmplY3QgKgogbmV3ZmhvYmplY3QoZm1mb250aGFuZGxlIGZoKQogewotCWZob2JqZWN0ICpmaHA7Ci0JaWYgKGZoID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKLQkJCQkiZXJyb3IgY3JlYXRpbmcgbmV3IGZvbnQgaGFuZGxlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlmaHAgPSBQeU9iamVjdF9OZXcoZmhvYmplY3QsICZGaHR5cGUpOwotCWlmIChmaHAgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JZmhwLT5maF9maCA9IGZoOwotCXJldHVybiAoUHlPYmplY3QgKilmaHA7CisgICAgZmhvYmplY3QgKmZocDsKKyAgICBpZiAoZmggPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImVycm9yIGNyZWF0aW5nIG5ldyBmb250IGhhbmRsZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZmhwID0gUHlPYmplY3RfTmV3KGZob2JqZWN0LCAmRmh0eXBlKTsKKyAgICBpZiAoZmhwID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGZocC0+ZmhfZmggPSBmaDsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopZmhwOwogfQogCiAvKiBGb250IEhhbmRsZSBtZXRob2RzICovCkBAIC00MCwxMCArNDAsMTAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBmaF9zY2FsZWZvbnQoZmhvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWRvdWJsZSBzaXplOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiZCIsICZzaXplKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIG5ld2Zob2JqZWN0KGZtc2NhbGVmb250KHNlbGYtPmZoX2ZoLCBzaXplKSk7CisgICAgZG91YmxlIHNpemU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJkIiwgJnNpemUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gbmV3ZmhvYmplY3QoZm1zY2FsZWZvbnQoc2VsZi0+ZmhfZmgsIHNpemUpKTsKIH0KIAogLyogWFhYIGZtbWFrZWZvbnQgKi8KQEAgLTUxLDU0ICs1MSw1NCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGZoX3NldGZvbnQoZmhvYmplY3QgKnNlbGYpCiB7Ci0JZm1zZXRmb250KHNlbGYtPmZoX2ZoKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZm1zZXRmb250KHNlbGYtPmZoX2ZoKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmaF9nZXRmb250bmFtZShmaG9iamVjdCAqc2VsZikKIHsKLQljaGFyIGZvbnRuYW1lWzI1Nl07Ci0JaW50IGxlbjsKLQlsZW4gPSBmbWdldGZvbnRuYW1lKHNlbGYtPmZoX2ZoLCBzaXplb2YgZm9udG5hbWUsIGZvbnRuYW1lKTsKLQlpZiAobGVuIDwgMCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAiZXJyb3IgaW4gZm1nZXRmb250bmFtZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGZvbnRuYW1lLCBsZW4pOworICAgIGNoYXIgZm9udG5hbWVbMjU2XTsKKyAgICBpbnQgbGVuOworICAgIGxlbiA9IGZtZ2V0Zm9udG5hbWUoc2VsZi0+ZmhfZmgsIHNpemVvZiBmb250bmFtZSwgZm9udG5hbWUpOworICAgIGlmIChsZW4gPCAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJlcnJvciBpbiBmbWdldGZvbnRuYW1lIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoZm9udG5hbWUsIGxlbik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmaF9nZXRjb21tZW50KGZob2JqZWN0ICpzZWxmKQogewotCWNoYXIgY29tbWVudFsyNTZdOwotCWludCBsZW47Ci0JbGVuID0gZm1nZXRjb21tZW50KHNlbGYtPmZoX2ZoLCBzaXplb2YgY29tbWVudCwgY29tbWVudCk7Ci0JaWYgKGxlbiA8IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgImVycm9yIGluIGZtZ2V0Y29tbWVudCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGNvbW1lbnQsIGxlbik7CisgICAgY2hhciBjb21tZW50WzI1Nl07CisgICAgaW50IGxlbjsKKyAgICBsZW4gPSBmbWdldGNvbW1lbnQoc2VsZi0+ZmhfZmgsIHNpemVvZiBjb21tZW50LCBjb21tZW50KTsKKyAgICBpZiAobGVuIDwgMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAiZXJyb3IgaW4gZm1nZXRjb21tZW50Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoY29tbWVudCwgbGVuKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZoX2dldGZvbnRpbmZvKGZob2JqZWN0ICpzZWxmKQogewotCWZtZm9udGluZm8gaW5mbzsKLQlpZiAoZm1nZXRmb250aW5mbyhzZWxmLT5maF9maCwgJmluZm8pIDwgMCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAiZXJyb3IgaW4gZm1nZXRmb250aW5mbyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihsbGxsbGxsbCkiLAotCQkJICAgICBpbmZvLnByaW50ZXJtYXRjaGVkLAotCQkJICAgICBpbmZvLmZpeGVkX3dpZHRoLAotCQkJICAgICBpbmZvLnhvcmlnLAotCQkJICAgICBpbmZvLnlvcmlnLAotCQkJICAgICBpbmZvLnhzaXplLAotCQkJICAgICBpbmZvLnlzaXplLAotCQkJICAgICBpbmZvLmhlaWdodCwKLQkJCSAgICAgaW5mby5uZ2x5cGhzKTsKKyAgICBmbWZvbnRpbmZvIGluZm87CisgICAgaWYgKGZtZ2V0Zm9udGluZm8oc2VsZi0+ZmhfZmgsICZpbmZvKSA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgImVycm9yIGluIGZtZ2V0Zm9udGluZm8iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIobGxsbGxsbGwpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLnByaW50ZXJtYXRjaGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8uZml4ZWRfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby54b3JpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLnlvcmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8ueHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby55c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLmhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLm5nbHlwaHMpOwogfQogCiAjaWYgMApAQCAtMTExLDUxICsxMTEsNTEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBmaF9nZXRzdHJ3aWR0aChmaG9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqc3RyOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyIsICZzdHIpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoZm1nZXRzdHJ3aWR0aChzZWxmLT5maF9maCwgc3RyKSk7CisgICAgY2hhciAqc3RyOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyIsICZzdHIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoZm1nZXRzdHJ3aWR0aChzZWxmLT5maF9maCwgc3RyKSk7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBmaF9tZXRob2RzW10gPSB7Ci0JeyJzY2FsZWZvbnQiLAkoUHlDRnVuY3Rpb24pZmhfc2NhbGVmb250LCAgIE1FVEhfVkFSQVJHU30sCi0JeyJzZXRmb250IiwJKFB5Q0Z1bmN0aW9uKWZoX3NldGZvbnQsICAgICBNRVRIX05PQVJHU30sCi0JeyJnZXRmb250bmFtZSIsCShQeUNGdW5jdGlvbilmaF9nZXRmb250bmFtZSwgTUVUSF9OT0FSR1N9LAotCXsiZ2V0Y29tbWVudCIsCShQeUNGdW5jdGlvbilmaF9nZXRjb21tZW50LCAgTUVUSF9OT0FSR1N9LAotCXsiZ2V0Zm9udGluZm8iLAkoUHlDRnVuY3Rpb24pZmhfZ2V0Zm9udGluZm8sIE1FVEhfTk9BUkdTfSwKKyAgICB7InNjYWxlZm9udCIsICAgICAgIChQeUNGdW5jdGlvbilmaF9zY2FsZWZvbnQsICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7InNldGZvbnQiLCAgICAgICAgIChQeUNGdW5jdGlvbilmaF9zZXRmb250LCAgICAgTUVUSF9OT0FSR1N9LAorICAgIHsiZ2V0Zm9udG5hbWUiLCAgICAgKFB5Q0Z1bmN0aW9uKWZoX2dldGZvbnRuYW1lLCBNRVRIX05PQVJHU30sCisgICAgeyJnZXRjb21tZW50IiwgICAgICAoUHlDRnVuY3Rpb24pZmhfZ2V0Y29tbWVudCwgIE1FVEhfTk9BUkdTfSwKKyAgICB7ImdldGZvbnRpbmZvIiwgICAgIChQeUNGdW5jdGlvbilmaF9nZXRmb250aW5mbywgTUVUSF9OT0FSR1N9LAogI2lmIDAKLQl7ImdldHdob2xlbWV0cmljcyIsCShQeUNGdW5jdGlvbilmaF9nZXR3aG9sZW1ldHJpY3MsIE1FVEhfVkFSQVJHU30sCisgICAgeyJnZXR3aG9sZW1ldHJpY3MiLCAgICAgICAgIChQeUNGdW5jdGlvbilmaF9nZXR3aG9sZW1ldHJpY3MsIE1FVEhfVkFSQVJHU30sCiAjZW5kaWYKLQl7ImdldHN0cndpZHRoIiwJKFB5Q0Z1bmN0aW9uKWZoX2dldHN0cndpZHRoLCBNRVRIX1ZBUkFSR1N9LAotCXtOVUxMLAkJTlVMTH0JCS8qIHNlbnRpbmVsICovCisgICAgeyJnZXRzdHJ3aWR0aCIsICAgICAoUHlDRnVuY3Rpb24pZmhfZ2V0c3Ryd2lkdGgsIE1FVEhfVkFSQVJHU30sCisgICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmaF9nZXRhdHRyKGZob2JqZWN0ICpmaHAsIGNoYXIgKm5hbWUpCiB7Ci0JcmV0dXJuIFB5X0ZpbmRNZXRob2QoZmhfbWV0aG9kcywgKFB5T2JqZWN0ICopZmhwLCBuYW1lKTsKKyAgICByZXR1cm4gUHlfRmluZE1ldGhvZChmaF9tZXRob2RzLCAoUHlPYmplY3QgKilmaHAsIG5hbWUpOwogfQogCiBzdGF0aWMgdm9pZAogZmhfZGVhbGxvYyhmaG9iamVjdCAqZmhwKQogewotCWZtZnJlZWZvbnQoZmhwLT5maF9maCk7Ci0JUHlPYmplY3RfRGVsKGZocCk7CisgICAgZm1mcmVlZm9udChmaHAtPmZoX2ZoKTsKKyAgICBQeU9iamVjdF9EZWwoZmhwKTsKIH0KIAogc3RhdGljIFB5VHlwZU9iamVjdCBGaHR5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSkKLQkwLAkJCQkvKm9iX3NpemUqLwotCSJmbS5mb250IGhhbmRsZSIsCQkvKnRwX25hbWUqLwotCXNpemVvZihmaG9iamVjdCksCQkvKnRwX3NpemUqLwotCTAsCQkJCS8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcilmaF9kZWFsbG9jLAkJLyp0cF9kZWFsbG9jKi8KLQkwLAkJCQkvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpZmhfZ2V0YXR0ciwJLyp0cF9nZXRhdHRyKi8KLQkwLAkJCQkvKnRwX3NldGF0dHIqLwotCTAsCQkJCS8qdHBfY29tcGFyZSovCi0JMCwJCQkJLyp0cF9yZXByKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlKQorICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb2Jfc2l6ZSovCisgICAgImZtLmZvbnQgaGFuZGxlIiwgICAgICAgICAgICAgICAgICAgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoZmhvYmplY3QpLCAgICAgICAgICAgICAgICAgICAvKnRwX3NpemUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcilmaF9kZWFsbG9jLCAgICAgICAgICAgICAvKnRwX2RlYWxsb2MqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYylmaF9nZXRhdHRyLCAgICAgICAgICAgIC8qdHBfZ2V0YXR0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NvbXBhcmUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmVwciovCiB9OwogCiAKQEAgLTE2NCwyOSArMTY0LDI5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZm1faW5pdChQeU9iamVjdCAqc2VsZikKIHsKLQlmbWluaXQoKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZm1pbml0KCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZm1fZmluZGZvbnQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKnN0cjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMiLCAmc3RyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIG5ld2Zob2JqZWN0KGZtZmluZGZvbnQoc3RyKSk7CisgICAgY2hhciAqc3RyOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyIsICZzdHIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gbmV3ZmhvYmplY3QoZm1maW5kZm9udChzdHIpKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZtX3Byc3RyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpzdHI7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIiwgJnN0cikpCi0JCXJldHVybiBOVUxMOwotCWZtcHJzdHIoc3RyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgY2hhciAqc3RyOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyIsICZzdHIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBmbXByc3RyKHN0cik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiBYWFggVGhpcyB1c2VzIGEgZ2xvYmFsIHZhcmlhYmxlIGFzIHRlbXBvcmFyeSEgTm90IHJlLWVudHJhbnQhICovCkBAIC0xOTYsNzQgKzE5Niw3NCBAQAogc3RhdGljIHZvaWQKIGNsaWVudHByb2MoY2hhciAqZm9udG5hbWUpCiB7Ci0JaW50IGVycjsKLQlQeU9iamVjdCAqdjsKLQlpZiAoZm9udGxpc3QgPT0gTlVMTCkKLQkJcmV0dXJuOwotCXYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGZvbnRuYW1lKTsKLQlpZiAodiA9PSBOVUxMKQotCQllcnIgPSAtMTsKLQllbHNlIHsKLQkJZXJyID0gUHlMaXN0X0FwcGVuZChmb250bGlzdCwgdik7Ci0JCVB5X0RFQ1JFRih2KTsKLQl9Ci0JaWYgKGVyciAhPSAwKSB7Ci0JCVB5X0RFQ1JFRihmb250bGlzdCk7Ci0JCWZvbnRsaXN0ID0gTlVMTDsKLQl9CisgICAgaW50IGVycjsKKyAgICBQeU9iamVjdCAqdjsKKyAgICBpZiAoZm9udGxpc3QgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOworICAgIHYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGZvbnRuYW1lKTsKKyAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICBlcnIgPSAtMTsKKyAgICBlbHNlIHsKKyAgICAgICAgZXJyID0gUHlMaXN0X0FwcGVuZChmb250bGlzdCwgdik7CisgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICB9CisgICAgaWYgKGVyciAhPSAwKSB7CisgICAgICAgIFB5X0RFQ1JFRihmb250bGlzdCk7CisgICAgICAgIGZvbnRsaXN0ID0gTlVMTDsKKyAgICB9CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmbV9lbnVtZXJhdGUoUHlPYmplY3QgKnNlbGYpCiB7Ci0JUHlPYmplY3QgKnJlczsKLQlmb250bGlzdCA9IFB5TGlzdF9OZXcoMCk7Ci0JaWYgKGZvbnRsaXN0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWZtZW51bWVyYXRlKGNsaWVudHByb2MpOwotCXJlcyA9IGZvbnRsaXN0OwotCWZvbnRsaXN0ID0gTlVMTDsKLQlyZXR1cm4gcmVzOworICAgIFB5T2JqZWN0ICpyZXM7CisgICAgZm9udGxpc3QgPSBQeUxpc3RfTmV3KDApOworICAgIGlmIChmb250bGlzdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBmbWVudW1lcmF0ZShjbGllbnRwcm9jKTsKKyAgICByZXMgPSBmb250bGlzdDsKKyAgICBmb250bGlzdCA9IE5VTEw7CisgICAgcmV0dXJuIHJlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZtX3NldHBhdGgoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKnN0cjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMiLCAmc3RyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZm1zZXRwYXRoKHN0cik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGNoYXIgKnN0cjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMiLCAmc3RyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZm1zZXRwYXRoKHN0cik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZm1fZm9udHBhdGgoUHlPYmplY3QgKnNlbGYpCiB7Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoZm1mb250cGF0aCgpKTsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhmbWZvbnRwYXRoKCkpOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgZm1fbWV0aG9kc1tdID0gewotCXsiaW5pdCIsCWZtX2luaXQsICAgICAgTUVUSF9OT0FSR1N9LAotCXsiZmluZGZvbnQiLAlmbV9maW5kZm9udCwgIE1FVEhfVkFSQVJHU30sCi0JeyJlbnVtZXJhdGUiLAlmbV9lbnVtZXJhdGUsIE1FVEhfTk9BUkdTfSwKLQl7InByc3RyIiwJZm1fcHJzdHIsICAgICBNRVRIX1ZBUkFSR1N9LAotCXsic2V0cGF0aCIsCWZtX3NldHBhdGgsICAgTUVUSF9WQVJBUkdTfSwKLQl7ImZvbnRwYXRoIiwJZm1fZm9udHBhdGgsICBNRVRIX05PQVJHU30sCi0Je05VTEwsCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7ImluaXQiLCAgICAgICAgICAgIGZtX2luaXQsICAgICAgTUVUSF9OT0FSR1N9LAorICAgIHsiZmluZGZvbnQiLCAgICAgICAgZm1fZmluZGZvbnQsICBNRVRIX1ZBUkFSR1N9LAorICAgIHsiZW51bWVyYXRlIiwgICAgICAgZm1fZW51bWVyYXRlLCBNRVRIX05PQVJHU30sCisgICAgeyJwcnN0ciIsICAgICAgICAgICBmbV9wcnN0ciwgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJzZXRwYXRoIiwgICAgICAgICBmbV9zZXRwYXRoLCAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJmb250cGF0aCIsICAgICAgICBmbV9mb250cGF0aCwgIE1FVEhfTk9BUkdTfSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogCiB2b2lkCiBpbml0Zm0odm9pZCkKIHsKLSAgICAKKwogICAgIGlmIChQeUVycl9XYXJuUHkzaygidGhlIGZtIG1vZHVsZSBoYXMgYmVlbiByZW1vdmVkIGluICIKICAgICAgICAgICAgICAgICAgICAgICAgIlB5dGhvbiAzLjAiLCAyKSA8IDApCisgICAgcmV0dXJuOworCisgICAgUHlfSW5pdE1vZHVsZSgiZm0iLCBmbV9tZXRob2RzKTsKKyAgICBpZiAobSA9PSBOVUxMKQogICAgICAgICByZXR1cm47Ci0gICAgCi0JUHlfSW5pdE1vZHVsZSgiZm0iLCBmbV9tZXRob2RzKTsKLQlpZiAobSA9PSBOVUxMKQotCQlyZXR1cm47Ci0JZm1pbml0KCk7CisgICAgZm1pbml0KCk7CiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL2ZwZWN0bG1vZHVsZS5jIGIvTW9kdWxlcy9mcGVjdGxtb2R1bGUuYwppbmRleCA3NDM1NGJhLi5mYWEyNzliIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2ZwZWN0bG1vZHVsZS5jCisrKyBiL01vZHVsZXMvZnBlY3RsbW9kdWxlLmMKQEAgLTEsNiArMSw2IEBACiAvKgotICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAotICAgIC8gICAgICAgICAgICAgICAgICAgICAgIENvcHlyaWdodCAoYykgMTk5Ni4gICAgICAgICAgICAgICAgICAgICAgICAgICBcIAorICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvICAgICAgICAgICAgICAgICAgICAgICBDb3B5cmlnaHQgKGMpIDE5OTYuICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgfCAgICAgICAgICBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgICAgICAgICAgICAgICAgfAogICAgfCAgICAgICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfApAQCAtMzIsMTIgKzMyLDEyIEBACiAgICB8ICAgb3BpbmlvbnMgIG9mIGF1dGhvcnMgZXhwcmVzc2VkIGhlcmVpbiBkbyBub3QgbmVjZXNzYXJpbHkgc3RhdGUgb3IgICB8CiAgICB8ICAgcmVmbGVjdCB0aG9zZSBvZiB0aGUgVW5pdGVkIFN0YXRlcyBHb3Zlcm5tZW50IG9yICB0aGUgIFVuaXZlcnNpdHkgICB8CiAgICB8ICAgb2YgIENhbGlmb3JuaWEsICBhbmQgc2hhbGwgbm90IGJlIHVzZWQgZm9yIGFkdmVydGlzaW5nIG9yIHByb2R1Y3QgICB8Ci0gICAgXCAgZW5kb3JzZW1lbnQgcHVycG9zZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gCi0gICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCisgICAgXCAgZW5kb3JzZW1lbnQgcHVycG9zZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8KKyAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqLwogCiAvKgotCQkgIEZsb2F0aW5nIHBvaW50IGV4Y2VwdGlvbiBjb250cm9sIG1vZHVsZS4KKyAgICAgICAgICAgICAgICAgIEZsb2F0aW5nIHBvaW50IGV4Y2VwdGlvbiBjb250cm9sIG1vZHVsZS4KIAogICAgVGhpcyBQeXRob24gbW9kdWxlIHByb3ZpZGVzIGJhcmUtYm9uZXMgY29udHJvbCBvdmVyIGZsb2F0aW5nIHBvaW50CiAgICB1bml0cyBmcm9tIHNldmVyYWwgaGFyZHdhcmUgbWFudWZhY3R1cmVycy4gIFNwZWNpZmljYWxseSwgaXQgYWxsb3dzCkBAIC05NSw4ICs5NSw4IEBACiBzdGF0aWMgUHlPYmplY3QgKnR1cm5vZmZfc2lnZnBlICAgICAgICAgICAoUHlPYmplY3QgKnNlbGYsUHlPYmplY3QgKmFyZ3MpOwogCiBzdGF0aWMgUHlNZXRob2REZWYgZnBlY3RsX21ldGhvZHNbXSA9IHsKLSAgICB7InR1cm5vbl9zaWdmcGUiLAkJIChQeUNGdW5jdGlvbikgdHVybm9uX3NpZ2ZwZSwJCSBNRVRIX1ZBUkFSR1N9LAotICAgIHsidHVybm9mZl9zaWdmcGUiLAkJIChQeUNGdW5jdGlvbikgdHVybm9mZl9zaWdmcGUsIAkgICAgICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsidHVybm9uX3NpZ2ZwZSIsICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKSB0dXJub25fc2lnZnBlLCAgICAgICAgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJ0dXJub2ZmX3NpZ2ZwZSIsICAgICAgICAgICAoUHlDRnVuY3Rpb24pIHR1cm5vZmZfc2lnZnBlLCAgICAgICAgICAgTUVUSF9WQVJBUkdTfSwKICAgICB7MCwwfQogfTsKIApAQCAtMTIxLDE5ICsxMjEsMTkgQEAKICAgICAgKiBNeSB1c2FnZSBkb2Vzbid0IGZvbGxvdyB0aGUgbWFuIHBhZ2UgZXhhY3RseS4gIE1heWJlIHNvbWVib2R5CiAgICAgICogZWxzZSBjYW4gZXhwbGFpbiBoYW5kbGVfc2lnZnBlcyB0byBtZS4uLi4KICAgICAgKiBjYyAtYyAtSS91c3IvbG9jYWwvcHl0aG9uL2luY2x1ZGUgZnBlY3RsbW9kdWxlLmMKLSAgICAgKiBsZCAtc2hhcmVkIC1vIGZwZWN0bG1vZHVsZS5zbyBmcGVjdGxtb2R1bGUubyAtbGZwZSAKKyAgICAgKiBsZCAtc2hhcmVkIC1vIGZwZWN0bG1vZHVsZS5zbyBmcGVjdGxtb2R1bGUubyAtbGZwZQogICAgICAqLwogI2luY2x1ZGUgPHNpZ2ZwZS5oPgogICAgIHR5cGVkZWYgdm9pZCB1c2VyX3JvdXRpbmUgKHVuc2lnbmVkWzVdLCBpbnRbMl0pOwogICAgIHR5cGVkZWYgdm9pZCBhYm9ydF9yb3V0aW5lICh1bnNpZ25lZCBsb25nKTsKICAgICBoYW5kbGVfc2lnZnBlcyhfT0ZGLCAwLAotCQkgKHVzZXJfcm91dGluZSAqKTAsCi0JCSBfVFVSTl9PRkZfSEFORExFUl9PTl9FUlJPUiwKLQkJIE5VTEwpOworICAgICAgICAgICAgICAgICAodXNlcl9yb3V0aW5lICopMCwKKyAgICAgICAgICAgICAgICAgX1RVUk5fT0ZGX0hBTkRMRVJfT05fRVJST1IsCisgICAgICAgICAgICAgICAgIE5VTEwpOwogICAgIGhhbmRsZV9zaWdmcGVzKF9PTiwgX0VOX09WRVJGTCB8IF9FTl9ESVZaRVJPIHwgX0VOX0lOVkFMSUQsCi0JCSAodXNlcl9yb3V0aW5lICopMCwKLQkJIF9BQk9SVF9PTl9FUlJPUiwKLQkJIE5VTEwpOworICAgICAgICAgICAgICAgICAodXNlcl9yb3V0aW5lICopMCwKKyAgICAgICAgICAgICAgICAgX0FCT1JUX09OX0VSUk9SLAorICAgICAgICAgICAgICAgICBOVUxMKTsKICAgICBQeU9TX3NldHNpZyhTSUdGUEUsIGhhbmRsZXIpOwogCiAvKi0tIFN1bk9TIGFuZCBTb2xhcmlzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpAQCAtMTk0LDE2ICsxOTQsMTYgQEAKIAogLyotLSBERUMgQUxQSEEgVk1TIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICNlbGlmIGRlZmluZWQoX19BTFBIQSkgJiYgZGVmaW5lZChfX1ZNUykKLQlJRUVFIGNscm1zazsKLQlJRUVFIHNldG1zazsKLQljbHJtc2suaWVlZSRxX2ZsYWdzID0KLQkJSUVFRSRNX1RSQVBfRU5BQkxFX1VORiB8ICBJRUVFJE1fVFJBUF9FTkFCTEVfSU5FIHwKLQkJIElFRUUkTV9NQVBfVU1aOwotCXNldG1zay5pZWVlJHFfZmxhZ3MgPQotCQlJRUVFJE1fVFJBUF9FTkFCTEVfSU5WIHwgSUVFRSRNX1RSQVBfRU5BQkxFX0RaRSB8Ci0JCUlFRUUkTV9UUkFQX0VOQUJMRV9PVkY7Ci0Jc3lzJGllZWVfc2V0X2ZwX2NvbnRyb2woJmNscm1zaywgJnNldG1zaywgMCk7Ci0JUHlPU19zZXRzaWcoU0lHRlBFLCBoYW5kbGVyKTsKKyAgICAgICAgSUVFRSBjbHJtc2s7CisgICAgICAgIElFRUUgc2V0bXNrOworICAgICAgICBjbHJtc2suaWVlZSRxX2ZsYWdzID0KKyAgICAgICAgICAgICAgICBJRUVFJE1fVFJBUF9FTkFCTEVfVU5GIHwgIElFRUUkTV9UUkFQX0VOQUJMRV9JTkUgfAorICAgICAgICAgICAgICAgICBJRUVFJE1fTUFQX1VNWjsKKyAgICAgICAgc2V0bXNrLmllZWUkcV9mbGFncyA9CisgICAgICAgICAgICAgICAgSUVFRSRNX1RSQVBfRU5BQkxFX0lOViB8IElFRUUkTV9UUkFQX0VOQUJMRV9EWkUgfAorICAgICAgICAgICAgICAgIElFRUUkTV9UUkFQX0VOQUJMRV9PVkY7CisgICAgICAgIHN5cyRpZWVlX3NldF9mcF9jb250cm9sKCZjbHJtc2ssICZzZXRtc2ssIDApOworICAgICAgICBQeU9TX3NldHNpZyhTSUdGUEUsIGhhbmRsZXIpOwogCiAvKi0tIEhQIElBNjQgVk1TIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICNlbGlmIGRlZmluZWQoX19pYTY0KSAmJiBkZWZpbmVkKF9fVk1TKQpAQCAtMjYyLDEzICsyNjIsMTMgQEAKICAgICBmcHJlc2V0c3RpY2t5KGZwZ2V0c3RpY2t5KCkpOwogICAgIGZwc2V0bWFzaygwKTsKICNlbGlmIGRlZmluZWQoX19WTVMpCi0JSUVFRSBjbHJtc2s7Ci0JIGNscm1zay5pZWVlJHFfZmxhZ3MgPQotCQlJRUVFJE1fVFJBUF9FTkFCTEVfVU5GIHwgIElFRUUkTV9UUkFQX0VOQUJMRV9JTkUgfAotCQlJRUVFJE1fTUFQX1VNWiB8IElFRUUkTV9UUkFQX0VOQUJMRV9JTlYgfAotCQlJRUVFJE1fVFJBUF9FTkFCTEVfRFpFIHwgSUVFRSRNX1RSQVBfRU5BQkxFX09WRiB8Ci0JCUlFRUUkTV9JTkhFUklUOwotCXN5cyRpZWVlX3NldF9mcF9jb250cm9sKCZjbHJtc2ssIDAsIDApOworICAgICAgICBJRUVFIGNscm1zazsKKyAgICAgICAgIGNscm1zay5pZWVlJHFfZmxhZ3MgPQorICAgICAgICAgICAgICAgIElFRUUkTV9UUkFQX0VOQUJMRV9VTkYgfCAgSUVFRSRNX1RSQVBfRU5BQkxFX0lORSB8CisgICAgICAgICAgICAgICAgSUVFRSRNX01BUF9VTVogfCBJRUVFJE1fVFJBUF9FTkFCTEVfSU5WIHwKKyAgICAgICAgICAgICAgICBJRUVFJE1fVFJBUF9FTkFCTEVfRFpFIHwgSUVFRSRNX1RSQVBfRU5BQkxFX09WRiB8CisgICAgICAgICAgICAgICAgSUVFRSRNX0lOSEVSSVQ7CisgICAgICAgIHN5cyRpZWVlX3NldF9mcF9jb250cm9sKCZjbHJtc2ssIDAsIDApOwogI2Vsc2UKICAgICBmcHV0cygiT3BlcmF0aW9uIG5vdCBpbXBsZW1lbnRlZFxuIiwgc3RkZXJyKTsKICNlbmRpZgpAQCAtMjkxLDExICsyOTEsMTEgQEAKICAgICBQeU9iamVjdCAqbSwgKmQ7CiAgICAgbSA9IFB5X0luaXRNb2R1bGUoImZwZWN0bCIsIGZwZWN0bF9tZXRob2RzKTsKICAgICBpZiAobSA9PSBOVUxMKQotICAgIAlyZXR1cm47CisgICAgICAgIHJldHVybjsKICAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKICAgICBmcGVfZXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oImZwZWN0bC5lcnJvciIsIE5VTEwsIE5VTEwpOwogICAgIGlmIChmcGVfZXJyb3IgIT0gTlVMTCkKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiZXJyb3IiLCBmcGVfZXJyb3IpOworICAgICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiZXJyb3IiLCBmcGVfZXJyb3IpOwogfQogCiAjaWZkZWYgX19jcGx1c3BsdXMKZGlmZiAtLWdpdCBhL01vZHVsZXMvZnV0dXJlX2J1aWx0aW5zLmMgYi9Nb2R1bGVzL2Z1dHVyZV9idWlsdGlucy5jCmluZGV4IDRjODQwZmIuLjFhYWUyY2MgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvZnV0dXJlX2J1aWx0aW5zLmMKKysrIGIvTW9kdWxlcy9mdXR1cmVfYnVpbHRpbnMuYwpAQCAtMjQsNyArMjQsNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGJ1aWx0aW5faGV4KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdikKIHsKLQlyZXR1cm4gUHlOdW1iZXJfVG9CYXNlKHYsIDE2KTsKKyAgICByZXR1cm4gUHlOdW1iZXJfVG9CYXNlKHYsIDE2KTsKIH0KIAogUHlEb2NfU1RSVkFSKGhleF9kb2MsCkBAIC0zNiw3ICszNiw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYnVpbHRpbl9vY3QoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp2KQogewotCXJldHVybiBQeU51bWJlcl9Ub0Jhc2UodiwgOCk7CisgICAgcmV0dXJuIFB5TnVtYmVyX1RvQmFzZSh2LCA4KTsKIH0KIAogUHlEb2NfU1RSVkFSKG9jdF9kb2MsCkBAIC00OCw3ICs0OCw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYnVpbHRpbl9hc2NpaShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnYpCiB7Ci0JcmV0dXJuIFB5T2JqZWN0X1JlcHIodik7CisgICAgcmV0dXJuIFB5T2JqZWN0X1JlcHIodik7CiB9CiAKIFB5RG9jX1NUUlZBUihhc2NpaV9kb2MsCkBAIC02MSwxMCArNjEsMTAgQEAKIC8qIExpc3Qgb2YgZnVuY3Rpb25zIGV4cG9ydGVkIGJ5IHRoaXMgbW9kdWxlICovCiAKIHN0YXRpYyBQeU1ldGhvZERlZiBtb2R1bGVfZnVuY3Rpb25zW10gPSB7Ci0gCXsiaGV4IiwJCWJ1aWx0aW5faGV4LCAgICAgICAgTUVUSF9PLCBoZXhfZG9jfSwKLSAJeyJvY3QiLAkJYnVpbHRpbl9vY3QsICAgICAgICBNRVRIX08sIG9jdF9kb2N9LAotCXsiYXNjaWkiLAlidWlsdGluX2FzY2lpLCAgICAgIE1FVEhfTywgYXNjaWlfZG9jfSwKLQl7TlVMTCwJCU5VTEx9CS8qIFNlbnRpbmVsICovCisgICAgeyJoZXgiLCAgICAgICAgICAgICBidWlsdGluX2hleCwgICAgICAgIE1FVEhfTywgaGV4X2RvY30sCisgICAgeyJvY3QiLCAgICAgICAgICAgICBidWlsdGluX29jdCwgICAgICAgIE1FVEhfTywgb2N0X2RvY30sCisgICAgeyJhc2NpaSIsICAgICAgICAgICBidWlsdGluX2FzY2lpLCAgICAgIE1FVEhfTywgYXNjaWlfZG9jfSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgLyogU2VudGluZWwgKi8KIH07CiAKIApAQCAtNzMsMjQgKzczLDI0IEBACiBQeU1PRElOSVRfRlVOQwogaW5pdGZ1dHVyZV9idWlsdGlucyh2b2lkKQogewotCVB5T2JqZWN0ICptLCAqaXRlcnRvb2xzLCAqaXRlcl9mdW5jOwotCWNoYXIgKml0X2Z1bmNzW10gPSB7ImltYXAiLCAiaWZpbHRlciIsICJpemlwIiwgTlVMTH07Ci0JY2hhciAqKmN1cl9mdW5jOworICAgIFB5T2JqZWN0ICptLCAqaXRlcnRvb2xzLCAqaXRlcl9mdW5jOworICAgIGNoYXIgKml0X2Z1bmNzW10gPSB7ImltYXAiLCAiaWZpbHRlciIsICJpemlwIiwgTlVMTH07CisgICAgY2hhciAqKmN1cl9mdW5jOwogCi0JbSA9IFB5X0luaXRNb2R1bGUzKCJmdXR1cmVfYnVpbHRpbnMiLCBtb2R1bGVfZnVuY3Rpb25zLCBtb2R1bGVfZG9jKTsKLQlpZiAobSA9PSBOVUxMKQotCQlyZXR1cm47CisgICAgbSA9IFB5X0luaXRNb2R1bGUzKCJmdXR1cmVfYnVpbHRpbnMiLCBtb2R1bGVfZnVuY3Rpb25zLCBtb2R1bGVfZG9jKTsKKyAgICBpZiAobSA9PSBOVUxMKQorICAgICAgICByZXR1cm47CiAKLQlpdGVydG9vbHMgPSBQeUltcG9ydF9JbXBvcnRNb2R1bGVOb0Jsb2NrKCJpdGVydG9vbHMiKTsKLQlpZiAoaXRlcnRvb2xzID09IE5VTEwpCi0JCXJldHVybjsKKyAgICBpdGVydG9vbHMgPSBQeUltcG9ydF9JbXBvcnRNb2R1bGVOb0Jsb2NrKCJpdGVydG9vbHMiKTsKKyAgICBpZiAoaXRlcnRvb2xzID09IE5VTEwpCisgICAgICAgIHJldHVybjsKIAotCWZvciAoY3VyX2Z1bmMgPSBpdF9mdW5jczsgKmN1cl9mdW5jOyArK2N1cl9mdW5jKXsKLQkJaXRlcl9mdW5jID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhpdGVydG9vbHMsICpjdXJfZnVuYyk7Ci0JCWlmIChpdGVyX2Z1bmMgPT0gTlVMTCkKLQkJCXJldHVybjsKLQkJUHlNb2R1bGVfQWRkT2JqZWN0KG0sICpjdXJfZnVuYysxLCBpdGVyX2Z1bmMpOwotCX0KLQlQeV9ERUNSRUYoaXRlcnRvb2xzKTsKLQkvKiBhbnkgb3RoZXIgaW5pdGlhbGl6YXRpb24gbmVlZGVkICovCisgICAgZm9yIChjdXJfZnVuYyA9IGl0X2Z1bmNzOyAqY3VyX2Z1bmM7ICsrY3VyX2Z1bmMpeworICAgICAgICBpdGVyX2Z1bmMgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKGl0ZXJ0b29scywgKmN1cl9mdW5jKTsKKyAgICAgICAgaWYgKGl0ZXJfZnVuYyA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgKmN1cl9mdW5jKzEsIGl0ZXJfZnVuYyk7CisgICAgfQorICAgIFB5X0RFQ1JFRihpdGVydG9vbHMpOworICAgIC8qIGFueSBvdGhlciBpbml0aWFsaXphdGlvbiBuZWVkZWQgKi8KIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvZ2Ntb2R1bGUuYyBiL01vZHVsZXMvZ2Ntb2R1bGUuYwppbmRleCA0OWNmNzE2Li4zY2NiYTU1IDEwMDY0NAotLS0gYS9Nb2R1bGVzL2djbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9nY21vZHVsZS5jCkBAIC0xOSw3ICsxOSw3IEBACiAqLwogCiAjaW5jbHVkZSAiUHl0aG9uLmgiCi0jaW5jbHVkZSAiZnJhbWVvYmplY3QuaCIJLyogZm9yIFB5RnJhbWVfQ2xlYXJGcmVlTGlzdCAqLworI2luY2x1ZGUgImZyYW1lb2JqZWN0LmgiICAgICAgICAvKiBmb3IgUHlGcmFtZV9DbGVhckZyZWVMaXN0ICovCiAKIC8qIEdldCBhbiBvYmplY3QncyBHQyBoZWFkICovCiAjZGVmaW5lIEFTX0dDKG8pICgoUHlHQ19IZWFkICopKG8pLTEpCkBAIC0zMCwxMCArMzAsMTAgQEAKIC8qKiogR2xvYmFsIEdDIHN0YXRlICoqKi8KIAogc3RydWN0IGdjX2dlbmVyYXRpb24gewotCVB5R0NfSGVhZCBoZWFkOwotCWludCB0aHJlc2hvbGQ7IC8qIGNvbGxlY3Rpb24gdGhyZXNob2xkICovCi0JaW50IGNvdW50OyAvKiBjb3VudCBvZiBhbGxvY2F0aW9ucyBvciBjb2xsZWN0aW9ucyBvZiB5b3VuZ2VyCi0JCSAgICAgIGdlbmVyYXRpb25zICovCisgICAgUHlHQ19IZWFkIGhlYWQ7CisgICAgaW50IHRocmVzaG9sZDsgLyogY29sbGVjdGlvbiB0aHJlc2hvbGQgKi8KKyAgICBpbnQgY291bnQ7IC8qIGNvdW50IG9mIGFsbG9jYXRpb25zIG9yIGNvbGxlY3Rpb25zIG9mIHlvdW5nZXIKKyAgICAgICAgICAgICAgICAgIGdlbmVyYXRpb25zICovCiB9OwogCiAjZGVmaW5lIE5VTV9HRU5FUkFUSU9OUyAzCkBAIC00MSwxMCArNDEsMTAgQEAKIAogLyogbGlua2VkIGxpc3RzIG9mIGNvbnRhaW5lciBvYmplY3RzICovCiBzdGF0aWMgc3RydWN0IGdjX2dlbmVyYXRpb24gZ2VuZXJhdGlvbnNbTlVNX0dFTkVSQVRJT05TXSA9IHsKLQkvKiBQeUdDX0hlYWQsCQkJCXRocmVzaG9sZCwJY291bnQgKi8KLQl7e3tHRU5fSEVBRCgwKSwgR0VOX0hFQUQoMCksIDB9fSwJNzAwLAkJMH0sCi0Je3t7R0VOX0hFQUQoMSksIEdFTl9IRUFEKDEpLCAwfX0sCTEwLAkJMH0sCi0Je3t7R0VOX0hFQUQoMiksIEdFTl9IRUFEKDIpLCAwfX0sCTEwLAkJMH0sCisgICAgLyogUHlHQ19IZWFkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlc2hvbGQsICAgICAgY291bnQgKi8KKyAgICB7e3tHRU5fSEVBRCgwKSwgR0VOX0hFQUQoMCksIDB9fSwgICAgICAgICAgIDcwMCwgICAgICAgICAgICAwfSwKKyAgICB7e3tHRU5fSEVBRCgxKSwgR0VOX0hFQUQoMSksIDB9fSwgICAgICAgICAgIDEwLCAgICAgICAgICAgICAwfSwKKyAgICB7e3tHRU5fSEVBRCgyKSwgR0VOX0hFQUQoMiksIDB9fSwgICAgICAgICAgIDEwLCAgICAgICAgICAgICAwfSwKIH07CiAKIFB5R0NfSGVhZCAqX1B5R0NfZ2VuZXJhdGlvbjAgPSBHRU5fSEVBRCgwKTsKQEAgLTY0LDE3ICs2NCwxNyBAQAogc3RhdGljIFB5T2JqZWN0ICpkZWxzdHIgPSBOVUxMOwogCiAvKiBzZXQgZm9yIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiAqLwotI2RlZmluZSBERUJVR19TVEFUUwkJKDE8PDApIC8qIHByaW50IGNvbGxlY3Rpb24gc3RhdGlzdGljcyAqLwotI2RlZmluZSBERUJVR19DT0xMRUNUQUJMRQkoMTw8MSkgLyogcHJpbnQgY29sbGVjdGFibGUgb2JqZWN0cyAqLwotI2RlZmluZSBERUJVR19VTkNPTExFQ1RBQkxFCSgxPDwyKSAvKiBwcmludCB1bmNvbGxlY3RhYmxlIG9iamVjdHMgKi8KLSNkZWZpbmUgREVCVUdfSU5TVEFOQ0VTCQkoMTw8MykgLyogcHJpbnQgaW5zdGFuY2VzICovCi0jZGVmaW5lIERFQlVHX09CSkVDVFMJCSgxPDw0KSAvKiBwcmludCBvdGhlciBvYmplY3RzICovCi0jZGVmaW5lIERFQlVHX1NBVkVBTEwJCSgxPDw1KSAvKiBzYXZlIGFsbCBnYXJiYWdlIGluIGdjLmdhcmJhZ2UgKi8KLSNkZWZpbmUgREVCVUdfTEVBSwkJREVCVUdfQ09MTEVDVEFCTEUgfCBcCi0JCQkJREVCVUdfVU5DT0xMRUNUQUJMRSB8IFwKLQkJCQlERUJVR19JTlNUQU5DRVMgfCBcCi0JCQkJREVCVUdfT0JKRUNUUyB8IFwKLQkJCQlERUJVR19TQVZFQUxMCisjZGVmaW5lIERFQlVHX1NUQVRTICAgICAgICAgICAgICgxPDwwKSAvKiBwcmludCBjb2xsZWN0aW9uIHN0YXRpc3RpY3MgKi8KKyNkZWZpbmUgREVCVUdfQ09MTEVDVEFCTEUgICAgICAgKDE8PDEpIC8qIHByaW50IGNvbGxlY3RhYmxlIG9iamVjdHMgKi8KKyNkZWZpbmUgREVCVUdfVU5DT0xMRUNUQUJMRSAgICAgKDE8PDIpIC8qIHByaW50IHVuY29sbGVjdGFibGUgb2JqZWN0cyAqLworI2RlZmluZSBERUJVR19JTlNUQU5DRVMgICAgICAgICAoMTw8MykgLyogcHJpbnQgaW5zdGFuY2VzICovCisjZGVmaW5lIERFQlVHX09CSkVDVFMgICAgICAgICAgICgxPDw0KSAvKiBwcmludCBvdGhlciBvYmplY3RzICovCisjZGVmaW5lIERFQlVHX1NBVkVBTEwgICAgICAgICAgICgxPDw1KSAvKiBzYXZlIGFsbCBnYXJiYWdlIGluIGdjLmdhcmJhZ2UgKi8KKyNkZWZpbmUgREVCVUdfTEVBSyAgICAgICAgICAgICAgREVCVUdfQ09MTEVDVEFCTEUgfCBcCisgICAgICAgICAgICAgICAgREVCVUdfVU5DT0xMRUNUQUJMRSB8IFwKKyAgICAgICAgICAgICAgICBERUJVR19JTlNUQU5DRVMgfCBcCisgICAgICAgICAgICAgICAgREVCVUdfT0JKRUNUUyB8IFwKKyAgICAgICAgICAgICAgICBERUJVR19TQVZFQUxMCiBzdGF0aWMgaW50IGRlYnVnOwogc3RhdGljIFB5T2JqZWN0ICp0bW9kID0gTlVMTDsKIApAQCAtMTE3LDI4ICsxMTcsMjggQEAKICAgICBpdCBoYXMgYSBfX2RlbF9fIG1ldGhvZCksIGl0cyBnY19yZWZzIGlzIHJlc3RvcmVkIHRvIEdDX1JFQUNIQUJMRSBhZ2Fpbi4KIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICovCi0jZGVmaW5lIEdDX1VOVFJBQ0tFRAkJCV9QeUdDX1JFRlNfVU5UUkFDS0VECi0jZGVmaW5lIEdDX1JFQUNIQUJMRQkJCV9QeUdDX1JFRlNfUkVBQ0hBQkxFCi0jZGVmaW5lIEdDX1RFTlRBVElWRUxZX1VOUkVBQ0hBQkxFCV9QeUdDX1JFRlNfVEVOVEFUSVZFTFlfVU5SRUFDSEFCTEUKKyNkZWZpbmUgR0NfVU5UUkFDS0VEICAgICAgICAgICAgICAgICAgICBfUHlHQ19SRUZTX1VOVFJBQ0tFRAorI2RlZmluZSBHQ19SRUFDSEFCTEUgICAgICAgICAgICAgICAgICAgIF9QeUdDX1JFRlNfUkVBQ0hBQkxFCisjZGVmaW5lIEdDX1RFTlRBVElWRUxZX1VOUkVBQ0hBQkxFICAgICAgX1B5R0NfUkVGU19URU5UQVRJVkVMWV9VTlJFQUNIQUJMRQogCiAjZGVmaW5lIElTX1RSQUNLRUQobykgKChBU19HQyhvKSktPmdjLmdjX3JlZnMgIT0gR0NfVU5UUkFDS0VEKQogI2RlZmluZSBJU19SRUFDSEFCTEUobykgKChBU19HQyhvKSktPmdjLmdjX3JlZnMgPT0gR0NfUkVBQ0hBQkxFKQogI2RlZmluZSBJU19URU5UQVRJVkVMWV9VTlJFQUNIQUJMRShvKSAoIFwKLQkoQVNfR0MobykpLT5nYy5nY19yZWZzID09IEdDX1RFTlRBVElWRUxZX1VOUkVBQ0hBQkxFKQorICAgIChBU19HQyhvKSktPmdjLmdjX3JlZnMgPT0gR0NfVEVOVEFUSVZFTFlfVU5SRUFDSEFCTEUpCiAKIC8qKiogbGlzdCBmdW5jdGlvbnMgKioqLwogCiBzdGF0aWMgdm9pZAogZ2NfbGlzdF9pbml0KFB5R0NfSGVhZCAqbGlzdCkKIHsKLQlsaXN0LT5nYy5nY19wcmV2ID0gbGlzdDsKLQlsaXN0LT5nYy5nY19uZXh0ID0gbGlzdDsKKyAgICBsaXN0LT5nYy5nY19wcmV2ID0gbGlzdDsKKyAgICBsaXN0LT5nYy5nY19uZXh0ID0gbGlzdDsKIH0KIAogc3RhdGljIGludAogZ2NfbGlzdF9pc19lbXB0eShQeUdDX0hlYWQgKmxpc3QpCiB7Ci0JcmV0dXJuIChsaXN0LT5nYy5nY19uZXh0ID09IGxpc3QpOworICAgIHJldHVybiAobGlzdC0+Z2MuZ2NfbmV4dCA9PSBsaXN0KTsKIH0KIAogI2lmIDAKQEAgLTE0NywxMCArMTQ3LDEwIEBACiBzdGF0aWMgdm9pZAogZ2NfbGlzdF9hcHBlbmQoUHlHQ19IZWFkICpub2RlLCBQeUdDX0hlYWQgKmxpc3QpCiB7Ci0Jbm9kZS0+Z2MuZ2NfbmV4dCA9IGxpc3Q7Ci0Jbm9kZS0+Z2MuZ2NfcHJldiA9IGxpc3QtPmdjLmdjX3ByZXY7Ci0Jbm9kZS0+Z2MuZ2NfcHJldi0+Z2MuZ2NfbmV4dCA9IG5vZGU7Ci0JbGlzdC0+Z2MuZ2NfcHJldiA9IG5vZGU7CisgICAgbm9kZS0+Z2MuZ2NfbmV4dCA9IGxpc3Q7CisgICAgbm9kZS0+Z2MuZ2NfcHJldiA9IGxpc3QtPmdjLmdjX3ByZXY7CisgICAgbm9kZS0+Z2MuZ2NfcHJldi0+Z2MuZ2NfbmV4dCA9IG5vZGU7CisgICAgbGlzdC0+Z2MuZ2NfcHJldiA9IG5vZGU7CiB9CiAjZW5kaWYKIApAQCAtMTU4LDkgKzE1OCw5IEBACiBzdGF0aWMgdm9pZAogZ2NfbGlzdF9yZW1vdmUoUHlHQ19IZWFkICpub2RlKQogewotCW5vZGUtPmdjLmdjX3ByZXYtPmdjLmdjX25leHQgPSBub2RlLT5nYy5nY19uZXh0OwotCW5vZGUtPmdjLmdjX25leHQtPmdjLmdjX3ByZXYgPSBub2RlLT5nYy5nY19wcmV2OwotCW5vZGUtPmdjLmdjX25leHQgPSBOVUxMOyAvKiBvYmplY3QgaXMgbm90IGN1cnJlbnRseSB0cmFja2VkICovCisgICAgbm9kZS0+Z2MuZ2NfcHJldi0+Z2MuZ2NfbmV4dCA9IG5vZGUtPmdjLmdjX25leHQ7CisgICAgbm9kZS0+Z2MuZ2NfbmV4dC0+Z2MuZ2NfcHJldiA9IG5vZGUtPmdjLmdjX3ByZXY7CisgICAgbm9kZS0+Z2MuZ2NfbmV4dCA9IE5VTEw7IC8qIG9iamVjdCBpcyBub3QgY3VycmVudGx5IHRyYWNrZWQgKi8KIH0KIAogLyogTW92ZSBgbm9kZWAgZnJvbSB0aGUgZ2MgbGlzdCBpdCdzIGN1cnJlbnRseSBpbiAod2hpY2ggaXMgbm90IGV4cGxpY2l0bHkKQEAgLTE3MCw0MyArMTcwLDQzIEBACiBzdGF0aWMgdm9pZAogZ2NfbGlzdF9tb3ZlKFB5R0NfSGVhZCAqbm9kZSwgUHlHQ19IZWFkICpsaXN0KQogewotCVB5R0NfSGVhZCAqbmV3X3ByZXY7Ci0JUHlHQ19IZWFkICpjdXJyZW50X3ByZXYgPSBub2RlLT5nYy5nY19wcmV2OwotCVB5R0NfSGVhZCAqY3VycmVudF9uZXh0ID0gbm9kZS0+Z2MuZ2NfbmV4dDsKLQkvKiBVbmxpbmsgZnJvbSBjdXJyZW50IGxpc3QuICovCi0JY3VycmVudF9wcmV2LT5nYy5nY19uZXh0ID0gY3VycmVudF9uZXh0OwotCWN1cnJlbnRfbmV4dC0+Z2MuZ2NfcHJldiA9IGN1cnJlbnRfcHJldjsKLQkvKiBSZWxpbmsgYXQgZW5kIG9mIG5ldyBsaXN0LiAqLwotCW5ld19wcmV2ID0gbm9kZS0+Z2MuZ2NfcHJldiA9IGxpc3QtPmdjLmdjX3ByZXY7Ci0JbmV3X3ByZXYtPmdjLmdjX25leHQgPSBsaXN0LT5nYy5nY19wcmV2ID0gbm9kZTsKLQlub2RlLT5nYy5nY19uZXh0ID0gbGlzdDsKKyAgICBQeUdDX0hlYWQgKm5ld19wcmV2OworICAgIFB5R0NfSGVhZCAqY3VycmVudF9wcmV2ID0gbm9kZS0+Z2MuZ2NfcHJldjsKKyAgICBQeUdDX0hlYWQgKmN1cnJlbnRfbmV4dCA9IG5vZGUtPmdjLmdjX25leHQ7CisgICAgLyogVW5saW5rIGZyb20gY3VycmVudCBsaXN0LiAqLworICAgIGN1cnJlbnRfcHJldi0+Z2MuZ2NfbmV4dCA9IGN1cnJlbnRfbmV4dDsKKyAgICBjdXJyZW50X25leHQtPmdjLmdjX3ByZXYgPSBjdXJyZW50X3ByZXY7CisgICAgLyogUmVsaW5rIGF0IGVuZCBvZiBuZXcgbGlzdC4gKi8KKyAgICBuZXdfcHJldiA9IG5vZGUtPmdjLmdjX3ByZXYgPSBsaXN0LT5nYy5nY19wcmV2OworICAgIG5ld19wcmV2LT5nYy5nY19uZXh0ID0gbGlzdC0+Z2MuZ2NfcHJldiA9IG5vZGU7CisgICAgbm9kZS0+Z2MuZ2NfbmV4dCA9IGxpc3Q7CiB9CiAKIC8qIGFwcGVuZCBsaXN0IGBmcm9tYCBvbnRvIGxpc3QgYHRvYDsgYGZyb21gIGJlY29tZXMgYW4gZW1wdHkgbGlzdCAqLwogc3RhdGljIHZvaWQKIGdjX2xpc3RfbWVyZ2UoUHlHQ19IZWFkICpmcm9tLCBQeUdDX0hlYWQgKnRvKQogewotCVB5R0NfSGVhZCAqdGFpbDsKLQlhc3NlcnQoZnJvbSAhPSB0byk7Ci0JaWYgKCFnY19saXN0X2lzX2VtcHR5KGZyb20pKSB7Ci0JCXRhaWwgPSB0by0+Z2MuZ2NfcHJldjsKLQkJdGFpbC0+Z2MuZ2NfbmV4dCA9IGZyb20tPmdjLmdjX25leHQ7Ci0JCXRhaWwtPmdjLmdjX25leHQtPmdjLmdjX3ByZXYgPSB0YWlsOwotCQl0by0+Z2MuZ2NfcHJldiA9IGZyb20tPmdjLmdjX3ByZXY7Ci0JCXRvLT5nYy5nY19wcmV2LT5nYy5nY19uZXh0ID0gdG87Ci0JfQotCWdjX2xpc3RfaW5pdChmcm9tKTsKKyAgICBQeUdDX0hlYWQgKnRhaWw7CisgICAgYXNzZXJ0KGZyb20gIT0gdG8pOworICAgIGlmICghZ2NfbGlzdF9pc19lbXB0eShmcm9tKSkgeworICAgICAgICB0YWlsID0gdG8tPmdjLmdjX3ByZXY7CisgICAgICAgIHRhaWwtPmdjLmdjX25leHQgPSBmcm9tLT5nYy5nY19uZXh0OworICAgICAgICB0YWlsLT5nYy5nY19uZXh0LT5nYy5nY19wcmV2ID0gdGFpbDsKKyAgICAgICAgdG8tPmdjLmdjX3ByZXYgPSBmcm9tLT5nYy5nY19wcmV2OworICAgICAgICB0by0+Z2MuZ2NfcHJldi0+Z2MuZ2NfbmV4dCA9IHRvOworICAgIH0KKyAgICBnY19saXN0X2luaXQoZnJvbSk7CiB9CiAKIHN0YXRpYyBQeV9zc2l6ZV90CiBnY19saXN0X3NpemUoUHlHQ19IZWFkICpsaXN0KQogewotCVB5R0NfSGVhZCAqZ2M7Ci0JUHlfc3NpemVfdCBuID0gMDsKLQlmb3IgKGdjID0gbGlzdC0+Z2MuZ2NfbmV4dDsgZ2MgIT0gbGlzdDsgZ2MgPSBnYy0+Z2MuZ2NfbmV4dCkgewotCQluKys7Ci0JfQotCXJldHVybiBuOworICAgIFB5R0NfSGVhZCAqZ2M7CisgICAgUHlfc3NpemVfdCBuID0gMDsKKyAgICBmb3IgKGdjID0gbGlzdC0+Z2MuZ2NfbmV4dDsgZ2MgIT0gbGlzdDsgZ2MgPSBnYy0+Z2MuZ2NfbmV4dCkgeworICAgICAgICBuKys7CisgICAgfQorICAgIHJldHVybiBuOwogfQogCiAvKiBBcHBlbmQgb2JqZWN0cyBpbiBhIEdDIGxpc3QgdG8gYSBQeXRob24gbGlzdC4KQEAgLTIxNSwxNiArMjE1LDE2IEBACiBzdGF0aWMgaW50CiBhcHBlbmRfb2JqZWN0cyhQeU9iamVjdCAqcHlfbGlzdCwgUHlHQ19IZWFkICpnY19saXN0KQogewotCVB5R0NfSGVhZCAqZ2M7Ci0JZm9yIChnYyA9IGdjX2xpc3QtPmdjLmdjX25leHQ7IGdjICE9IGdjX2xpc3Q7IGdjID0gZ2MtPmdjLmdjX25leHQpIHsKLQkJUHlPYmplY3QgKm9wID0gRlJPTV9HQyhnYyk7Ci0JCWlmIChvcCAhPSBweV9saXN0KSB7Ci0JCQlpZiAoUHlMaXN0X0FwcGVuZChweV9saXN0LCBvcCkpIHsKLQkJCQlyZXR1cm4gLTE7IC8qIGV4Y2VwdGlvbiAqLwotCQkJfQotCQl9Ci0JfQotCXJldHVybiAwOworICAgIFB5R0NfSGVhZCAqZ2M7CisgICAgZm9yIChnYyA9IGdjX2xpc3QtPmdjLmdjX25leHQ7IGdjICE9IGdjX2xpc3Q7IGdjID0gZ2MtPmdjLmdjX25leHQpIHsKKyAgICAgICAgUHlPYmplY3QgKm9wID0gRlJPTV9HQyhnYyk7CisgICAgICAgIGlmIChvcCAhPSBweV9saXN0KSB7CisgICAgICAgICAgICBpZiAoUHlMaXN0X0FwcGVuZChweV9saXN0LCBvcCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7IC8qIGV4Y2VwdGlvbiAqLworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOwogfQogCiAvKioqIGVuZCBvZiBsaXN0IHN0dWZmICoqKi8KQEAgLTIzNyw0OCArMjM3LDQ4IEBACiBzdGF0aWMgdm9pZAogdXBkYXRlX3JlZnMoUHlHQ19IZWFkICpjb250YWluZXJzKQogewotCVB5R0NfSGVhZCAqZ2MgPSBjb250YWluZXJzLT5nYy5nY19uZXh0OwotCWZvciAoOyBnYyAhPSBjb250YWluZXJzOyBnYyA9IGdjLT5nYy5nY19uZXh0KSB7Ci0JCWFzc2VydChnYy0+Z2MuZ2NfcmVmcyA9PSBHQ19SRUFDSEFCTEUpOwotCQlnYy0+Z2MuZ2NfcmVmcyA9IFB5X1JFRkNOVChGUk9NX0dDKGdjKSk7Ci0JCS8qIFB5dGhvbidzIGN5Y2xpYyBnYyBzaG91bGQgbmV2ZXIgc2VlIGFuIGluY29taW5nIHJlZmNvdW50Ci0JCSAqIG9mIDA6ICBpZiBzb21ldGhpbmcgZGVjcmVmJ2VkIHRvIDAsIGl0IHNob3VsZCBoYXZlIGJlZW4KLQkJICogZGVhbGxvY2F0ZWQgaW1tZWRpYXRlbHkgYXQgdGhhdCB0aW1lLgotCQkgKiBQb3NzaWJsZSBjYXVzZSAoaWYgdGhlIGFzc2VydCB0cmlnZ2Vycyk6ICBhIHRwX2RlYWxsb2MKLQkJICogcm91dGluZSBsZWZ0IGEgZ2MtYXdhcmUgb2JqZWN0IHRyYWNrZWQgZHVyaW5nIGl0cyB0ZWFyZG93bgotCQkgKiBwaGFzZSwgYW5kIGRpZCBzb21ldGhpbmctLSBvciBhbGxvd2VkIHNvbWV0aGluZyB0byBoYXBwZW4gLS0KLQkJICogdGhhdCBjYWxsZWQgYmFjayBpbnRvIFB5dGhvbi4gIGdjIGNhbiB0cmlnZ2VyIHRoZW4sIGFuZCBtYXkKLQkJICogc2VlIHRoZSBzdGlsbC10cmFja2VkIGR5aW5nIG9iamVjdC4gIEJlZm9yZSB0aGlzIGFzc2VydAotCQkgKiB3YXMgYWRkZWQsIHN1Y2ggbWlzdGFrZXMgd2VudCBvbiB0byBhbGxvdyBnYyB0byB0cnkgdG8KLQkJICogZGVsZXRlIHRoZSBvYmplY3QgYWdhaW4uICBJbiBhIGRlYnVnIGJ1aWxkLCB0aGF0IGNhdXNlZAotCQkgKiBhIG15c3RlcmlvdXMgc2VnZmF1bHQsIHdoZW4gX1B5X0ZvcmdldFJlZmVyZW5jZSB0cmllZAotCQkgKiB0byByZW1vdmUgdGhlIG9iamVjdCBmcm9tIHRoZSBkb3VibHktbGlua2VkIGxpc3Qgb2YgYWxsCi0JCSAqIG9iamVjdHMgYSBzZWNvbmQgdGltZS4gIEluIGEgcmVsZWFzZSBidWlsZCwgYW4gYWN0dWFsCi0JCSAqIGRvdWJsZSBkZWFsbG9jYXRpb24gb2NjdXJyZWQsIHdoaWNoIGxlYWRzIHRvIGNvcnJ1cHRpb24KLQkJICogb2YgdGhlIGFsbG9jYXRvcidzIGludGVybmFsIGJvb2trZWVwaW5nIHBvaW50ZXJzLiAgVGhhdCdzCi0JCSAqIHNvIHNlcmlvdXMgdGhhdCBtYXliZSB0aGlzIHNob3VsZCBiZSBhIHJlbGVhc2UtYnVpbGQKLQkJICogY2hlY2sgaW5zdGVhZCBvZiBhbiBhc3NlcnQ/Ci0JCSAqLwotCQlhc3NlcnQoZ2MtPmdjLmdjX3JlZnMgIT0gMCk7Ci0JfQorICAgIFB5R0NfSGVhZCAqZ2MgPSBjb250YWluZXJzLT5nYy5nY19uZXh0OworICAgIGZvciAoOyBnYyAhPSBjb250YWluZXJzOyBnYyA9IGdjLT5nYy5nY19uZXh0KSB7CisgICAgICAgIGFzc2VydChnYy0+Z2MuZ2NfcmVmcyA9PSBHQ19SRUFDSEFCTEUpOworICAgICAgICBnYy0+Z2MuZ2NfcmVmcyA9IFB5X1JFRkNOVChGUk9NX0dDKGdjKSk7CisgICAgICAgIC8qIFB5dGhvbidzIGN5Y2xpYyBnYyBzaG91bGQgbmV2ZXIgc2VlIGFuIGluY29taW5nIHJlZmNvdW50CisgICAgICAgICAqIG9mIDA6ICBpZiBzb21ldGhpbmcgZGVjcmVmJ2VkIHRvIDAsIGl0IHNob3VsZCBoYXZlIGJlZW4KKyAgICAgICAgICogZGVhbGxvY2F0ZWQgaW1tZWRpYXRlbHkgYXQgdGhhdCB0aW1lLgorICAgICAgICAgKiBQb3NzaWJsZSBjYXVzZSAoaWYgdGhlIGFzc2VydCB0cmlnZ2Vycyk6ICBhIHRwX2RlYWxsb2MKKyAgICAgICAgICogcm91dGluZSBsZWZ0IGEgZ2MtYXdhcmUgb2JqZWN0IHRyYWNrZWQgZHVyaW5nIGl0cyB0ZWFyZG93bgorICAgICAgICAgKiBwaGFzZSwgYW5kIGRpZCBzb21ldGhpbmctLSBvciBhbGxvd2VkIHNvbWV0aGluZyB0byBoYXBwZW4gLS0KKyAgICAgICAgICogdGhhdCBjYWxsZWQgYmFjayBpbnRvIFB5dGhvbi4gIGdjIGNhbiB0cmlnZ2VyIHRoZW4sIGFuZCBtYXkKKyAgICAgICAgICogc2VlIHRoZSBzdGlsbC10cmFja2VkIGR5aW5nIG9iamVjdC4gIEJlZm9yZSB0aGlzIGFzc2VydAorICAgICAgICAgKiB3YXMgYWRkZWQsIHN1Y2ggbWlzdGFrZXMgd2VudCBvbiB0byBhbGxvdyBnYyB0byB0cnkgdG8KKyAgICAgICAgICogZGVsZXRlIHRoZSBvYmplY3QgYWdhaW4uICBJbiBhIGRlYnVnIGJ1aWxkLCB0aGF0IGNhdXNlZAorICAgICAgICAgKiBhIG15c3RlcmlvdXMgc2VnZmF1bHQsIHdoZW4gX1B5X0ZvcmdldFJlZmVyZW5jZSB0cmllZAorICAgICAgICAgKiB0byByZW1vdmUgdGhlIG9iamVjdCBmcm9tIHRoZSBkb3VibHktbGlua2VkIGxpc3Qgb2YgYWxsCisgICAgICAgICAqIG9iamVjdHMgYSBzZWNvbmQgdGltZS4gIEluIGEgcmVsZWFzZSBidWlsZCwgYW4gYWN0dWFsCisgICAgICAgICAqIGRvdWJsZSBkZWFsbG9jYXRpb24gb2NjdXJyZWQsIHdoaWNoIGxlYWRzIHRvIGNvcnJ1cHRpb24KKyAgICAgICAgICogb2YgdGhlIGFsbG9jYXRvcidzIGludGVybmFsIGJvb2trZWVwaW5nIHBvaW50ZXJzLiAgVGhhdCdzCisgICAgICAgICAqIHNvIHNlcmlvdXMgdGhhdCBtYXliZSB0aGlzIHNob3VsZCBiZSBhIHJlbGVhc2UtYnVpbGQKKyAgICAgICAgICogY2hlY2sgaW5zdGVhZCBvZiBhbiBhc3NlcnQ/CisgICAgICAgICAqLworICAgICAgICBhc3NlcnQoZ2MtPmdjLmdjX3JlZnMgIT0gMCk7CisgICAgfQogfQogCiAvKiBBIHRyYXZlcnNhbCBjYWxsYmFjayBmb3Igc3VidHJhY3RfcmVmcy4gKi8KIHN0YXRpYyBpbnQKIHZpc2l0X2RlY3JlZihQeU9iamVjdCAqb3AsIHZvaWQgKmRhdGEpCiB7Ci0gICAgICAgIGFzc2VydChvcCAhPSBOVUxMKTsKLQlpZiAoUHlPYmplY3RfSVNfR0Mob3ApKSB7Ci0JCVB5R0NfSGVhZCAqZ2MgPSBBU19HQyhvcCk7Ci0JCS8qIFdlJ3JlIG9ubHkgaW50ZXJlc3RlZCBpbiBnY19yZWZzIGZvciBvYmplY3RzIGluIHRoZQotCQkgKiBnZW5lcmF0aW9uIGJlaW5nIGNvbGxlY3RlZCwgd2hpY2ggY2FuIGJlIHJlY29nbml6ZWQKLQkJICogYmVjYXVzZSBvbmx5IHRoZXkgaGF2ZSBwb3NpdGl2ZSBnY19yZWZzLgotCQkgKi8KLQkJYXNzZXJ0KGdjLT5nYy5nY19yZWZzICE9IDApOyAvKiBlbHNlIHJlZmNvdW50IHdhcyB0b28gc21hbGwgKi8KLQkJaWYgKGdjLT5nYy5nY19yZWZzID4gMCkKLQkJCWdjLT5nYy5nY19yZWZzLS07Ci0JfQotCXJldHVybiAwOworICAgIGFzc2VydChvcCAhPSBOVUxMKTsKKyAgICBpZiAoUHlPYmplY3RfSVNfR0Mob3ApKSB7CisgICAgICAgIFB5R0NfSGVhZCAqZ2MgPSBBU19HQyhvcCk7CisgICAgICAgIC8qIFdlJ3JlIG9ubHkgaW50ZXJlc3RlZCBpbiBnY19yZWZzIGZvciBvYmplY3RzIGluIHRoZQorICAgICAgICAgKiBnZW5lcmF0aW9uIGJlaW5nIGNvbGxlY3RlZCwgd2hpY2ggY2FuIGJlIHJlY29nbml6ZWQKKyAgICAgICAgICogYmVjYXVzZSBvbmx5IHRoZXkgaGF2ZSBwb3NpdGl2ZSBnY19yZWZzLgorICAgICAgICAgKi8KKyAgICAgICAgYXNzZXJ0KGdjLT5nYy5nY19yZWZzICE9IDApOyAvKiBlbHNlIHJlZmNvdW50IHdhcyB0b28gc21hbGwgKi8KKyAgICAgICAgaWYgKGdjLT5nYy5nY19yZWZzID4gMCkKKyAgICAgICAgICAgIGdjLT5nYy5nY19yZWZzLS07CisgICAgfQorICAgIHJldHVybiAwOwogfQogCiAvKiBTdWJ0cmFjdCBpbnRlcm5hbCByZWZlcmVuY2VzIGZyb20gZ2NfcmVmcy4gIEFmdGVyIHRoaXMsIGdjX3JlZnMgaXMgPj0gMApAQCAtMjg5LDU3ICsyODksNTcgQEAKIHN0YXRpYyB2b2lkCiBzdWJ0cmFjdF9yZWZzKFB5R0NfSGVhZCAqY29udGFpbmVycykKIHsKLQl0cmF2ZXJzZXByb2MgdHJhdmVyc2U7Ci0JUHlHQ19IZWFkICpnYyA9IGNvbnRhaW5lcnMtPmdjLmdjX25leHQ7Ci0JZm9yICg7IGdjICE9IGNvbnRhaW5lcnM7IGdjPWdjLT5nYy5nY19uZXh0KSB7Ci0JCXRyYXZlcnNlID0gUHlfVFlQRShGUk9NX0dDKGdjKSktPnRwX3RyYXZlcnNlOwotCQkodm9pZCkgdHJhdmVyc2UoRlJPTV9HQyhnYyksCi0JCQkgICAgICAgKHZpc2l0cHJvYyl2aXNpdF9kZWNyZWYsCi0JCQkgICAgICAgTlVMTCk7Ci0JfQorICAgIHRyYXZlcnNlcHJvYyB0cmF2ZXJzZTsKKyAgICBQeUdDX0hlYWQgKmdjID0gY29udGFpbmVycy0+Z2MuZ2NfbmV4dDsKKyAgICBmb3IgKDsgZ2MgIT0gY29udGFpbmVyczsgZ2M9Z2MtPmdjLmdjX25leHQpIHsKKyAgICAgICAgdHJhdmVyc2UgPSBQeV9UWVBFKEZST01fR0MoZ2MpKS0+dHBfdHJhdmVyc2U7CisgICAgICAgICh2b2lkKSB0cmF2ZXJzZShGUk9NX0dDKGdjKSwKKyAgICAgICAgICAgICAgICAgICAgICAgKHZpc2l0cHJvYyl2aXNpdF9kZWNyZWYsCisgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgIH0KIH0KIAogLyogQSB0cmF2ZXJzYWwgY2FsbGJhY2sgZm9yIG1vdmVfdW5yZWFjaGFibGUuICovCiBzdGF0aWMgaW50CiB2aXNpdF9yZWFjaGFibGUoUHlPYmplY3QgKm9wLCBQeUdDX0hlYWQgKnJlYWNoYWJsZSkKIHsKLQlpZiAoUHlPYmplY3RfSVNfR0Mob3ApKSB7Ci0JCVB5R0NfSGVhZCAqZ2MgPSBBU19HQyhvcCk7Ci0JCWNvbnN0IFB5X3NzaXplX3QgZ2NfcmVmcyA9IGdjLT5nYy5nY19yZWZzOworICAgIGlmIChQeU9iamVjdF9JU19HQyhvcCkpIHsKKyAgICAgICAgUHlHQ19IZWFkICpnYyA9IEFTX0dDKG9wKTsKKyAgICAgICAgY29uc3QgUHlfc3NpemVfdCBnY19yZWZzID0gZ2MtPmdjLmdjX3JlZnM7CiAKLQkJaWYgKGdjX3JlZnMgPT0gMCkgewotCQkJLyogVGhpcyBpcyBpbiBtb3ZlX3VucmVhY2hhYmxlJ3MgJ3lvdW5nJyBsaXN0LCBidXQKLQkJCSAqIHRoZSB0cmF2ZXJzYWwgaGFzbid0IHlldCBnb3R0ZW4gdG8gaXQuICBBbGwKLQkJCSAqIHdlIG5lZWQgdG8gZG8gaXMgdGVsbCBtb3ZlX3VucmVhY2hhYmxlIHRoYXQgaXQncwotCQkJICogcmVhY2hhYmxlLgotCQkJICovCi0JCQlnYy0+Z2MuZ2NfcmVmcyA9IDE7Ci0JCX0KLQkJZWxzZSBpZiAoZ2NfcmVmcyA9PSBHQ19URU5UQVRJVkVMWV9VTlJFQUNIQUJMRSkgewotCQkJLyogVGhpcyBoYWQgZ2NfcmVmcyA9IDAgd2hlbiBtb3ZlX3VucmVhY2hhYmxlIGdvdAotCQkJICogdG8gaXQsIGJ1dCB0dXJucyBvdXQgaXQncyByZWFjaGFibGUgYWZ0ZXIgYWxsLgotCQkJICogTW92ZSBpdCBiYWNrIHRvIG1vdmVfdW5yZWFjaGFibGUncyAneW91bmcnIGxpc3QsCi0JCQkgKiBhbmQgbW92ZV91bnJlYWNoYWJsZSB3aWxsIGV2ZW50dWFsbHkgZ2V0IHRvIGl0Ci0JCQkgKiBhZ2Fpbi4KLQkJCSAqLwotCQkJZ2NfbGlzdF9tb3ZlKGdjLCByZWFjaGFibGUpOwotCQkJZ2MtPmdjLmdjX3JlZnMgPSAxOwotCQl9Ci0JCS8qIEVsc2UgdGhlcmUncyBub3RoaW5nIHRvIGRvLgotCQkgKiBJZiBnY19yZWZzID4gMCwgaXQgbXVzdCBiZSBpbiBtb3ZlX3VucmVhY2hhYmxlJ3MgJ3lvdW5nJwotCQkgKiBsaXN0LCBhbmQgbW92ZV91bnJlYWNoYWJsZSB3aWxsIGV2ZW50dWFsbHkgZ2V0IHRvIGl0LgotCQkgKiBJZiBnY19yZWZzID09IEdDX1JFQUNIQUJMRSwgaXQncyBlaXRoZXIgaW4gc29tZSBvdGhlcgotCQkgKiBnZW5lcmF0aW9uIHNvIHdlIGRvbid0IGNhcmUgYWJvdXQgaXQsIG9yIG1vdmVfdW5yZWFjaGFibGUKLQkJICogYWxyZWFkeSBkZWFsdCB3aXRoIGl0LgotCQkgKiBJZiBnY19yZWZzID09IEdDX1VOVFJBQ0tFRCwgaXQgbXVzdCBiZSBpZ25vcmVkLgotCQkgKi8KLQkJIGVsc2UgewotCQkgCWFzc2VydChnY19yZWZzID4gMAotCQkgCSAgICAgICB8fCBnY19yZWZzID09IEdDX1JFQUNIQUJMRQotCQkgCSAgICAgICB8fCBnY19yZWZzID09IEdDX1VOVFJBQ0tFRCk7Ci0JCSB9Ci0JfQotCXJldHVybiAwOworICAgICAgICBpZiAoZ2NfcmVmcyA9PSAwKSB7CisgICAgICAgICAgICAvKiBUaGlzIGlzIGluIG1vdmVfdW5yZWFjaGFibGUncyAneW91bmcnIGxpc3QsIGJ1dAorICAgICAgICAgICAgICogdGhlIHRyYXZlcnNhbCBoYXNuJ3QgeWV0IGdvdHRlbiB0byBpdC4gIEFsbAorICAgICAgICAgICAgICogd2UgbmVlZCB0byBkbyBpcyB0ZWxsIG1vdmVfdW5yZWFjaGFibGUgdGhhdCBpdCdzCisgICAgICAgICAgICAgKiByZWFjaGFibGUuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGdjLT5nYy5nY19yZWZzID0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChnY19yZWZzID09IEdDX1RFTlRBVElWRUxZX1VOUkVBQ0hBQkxFKSB7CisgICAgICAgICAgICAvKiBUaGlzIGhhZCBnY19yZWZzID0gMCB3aGVuIG1vdmVfdW5yZWFjaGFibGUgZ290CisgICAgICAgICAgICAgKiB0byBpdCwgYnV0IHR1cm5zIG91dCBpdCdzIHJlYWNoYWJsZSBhZnRlciBhbGwuCisgICAgICAgICAgICAgKiBNb3ZlIGl0IGJhY2sgdG8gbW92ZV91bnJlYWNoYWJsZSdzICd5b3VuZycgbGlzdCwKKyAgICAgICAgICAgICAqIGFuZCBtb3ZlX3VucmVhY2hhYmxlIHdpbGwgZXZlbnR1YWxseSBnZXQgdG8gaXQKKyAgICAgICAgICAgICAqIGFnYWluLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBnY19saXN0X21vdmUoZ2MsIHJlYWNoYWJsZSk7CisgICAgICAgICAgICBnYy0+Z2MuZ2NfcmVmcyA9IDE7CisgICAgICAgIH0KKyAgICAgICAgLyogRWxzZSB0aGVyZSdzIG5vdGhpbmcgdG8gZG8uCisgICAgICAgICAqIElmIGdjX3JlZnMgPiAwLCBpdCBtdXN0IGJlIGluIG1vdmVfdW5yZWFjaGFibGUncyAneW91bmcnCisgICAgICAgICAqIGxpc3QsIGFuZCBtb3ZlX3VucmVhY2hhYmxlIHdpbGwgZXZlbnR1YWxseSBnZXQgdG8gaXQuCisgICAgICAgICAqIElmIGdjX3JlZnMgPT0gR0NfUkVBQ0hBQkxFLCBpdCdzIGVpdGhlciBpbiBzb21lIG90aGVyCisgICAgICAgICAqIGdlbmVyYXRpb24gc28gd2UgZG9uJ3QgY2FyZSBhYm91dCBpdCwgb3IgbW92ZV91bnJlYWNoYWJsZQorICAgICAgICAgKiBhbHJlYWR5IGRlYWx0IHdpdGggaXQuCisgICAgICAgICAqIElmIGdjX3JlZnMgPT0gR0NfVU5UUkFDS0VELCBpdCBtdXN0IGJlIGlnbm9yZWQuCisgICAgICAgICAqLworICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBhc3NlcnQoZ2NfcmVmcyA+IDAKKyAgICAgICAgICAgICAgICAgICB8fCBnY19yZWZzID09IEdDX1JFQUNIQUJMRQorICAgICAgICAgICAgICAgICAgIHx8IGdjX3JlZnMgPT0gR0NfVU5UUkFDS0VEKTsKKyAgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIC8qIE1vdmUgdGhlIHVucmVhY2hhYmxlIG9iamVjdHMgZnJvbSB5b3VuZyB0byB1bnJlYWNoYWJsZS4gIEFmdGVyIHRoaXMsCkBAIC0zNTMsNTIgKzM1Myw1MiBAQAogc3RhdGljIHZvaWQKIG1vdmVfdW5yZWFjaGFibGUoUHlHQ19IZWFkICp5b3VuZywgUHlHQ19IZWFkICp1bnJlYWNoYWJsZSkKIHsKLQlQeUdDX0hlYWQgKmdjID0geW91bmctPmdjLmdjX25leHQ7CisgICAgUHlHQ19IZWFkICpnYyA9IHlvdW5nLT5nYy5nY19uZXh0OwogCi0JLyogSW52YXJpYW50czogIGFsbCBvYmplY3RzICJ0byB0aGUgbGVmdCIgb2YgdXMgaW4geW91bmcgaGF2ZSBnY19yZWZzCi0JICogPSBHQ19SRUFDSEFCTEUsIGFuZCBhcmUgaW5kZWVkIHJlYWNoYWJsZSAoZGlyZWN0bHkgb3IgaW5kaXJlY3RseSkKLQkgKiBmcm9tIG91dHNpZGUgdGhlIHlvdW5nIGxpc3QgYXMgaXQgd2FzIGF0IGVudHJ5LiAgQWxsIG90aGVyIG9iamVjdHMKLQkgKiBmcm9tIHRoZSBvcmlnaW5hbCB5b3VuZyAidG8gdGhlIGxlZnQiIG9mIHVzIGFyZSBpbiB1bnJlYWNoYWJsZSBub3csCi0JICogYW5kIGhhdmUgZ2NfcmVmcyA9IEdDX1RFTlRBVElWRUxZX1VOUkVBQ0hBQkxFLiAgQWxsIG9iamVjdHMgdG8gdGhlCi0JICogbGVmdCBvZiB1cyBpbiAneW91bmcnIG5vdyBoYXZlIGJlZW4gc2Nhbm5lZCwgYW5kIG5vIG9iamVjdHMgaGVyZQotCSAqIG9yIHRvIHRoZSByaWdodCBoYXZlIGJlZW4gc2Nhbm5lZCB5ZXQuCi0JICovCisgICAgLyogSW52YXJpYW50czogIGFsbCBvYmplY3RzICJ0byB0aGUgbGVmdCIgb2YgdXMgaW4geW91bmcgaGF2ZSBnY19yZWZzCisgICAgICogPSBHQ19SRUFDSEFCTEUsIGFuZCBhcmUgaW5kZWVkIHJlYWNoYWJsZSAoZGlyZWN0bHkgb3IgaW5kaXJlY3RseSkKKyAgICAgKiBmcm9tIG91dHNpZGUgdGhlIHlvdW5nIGxpc3QgYXMgaXQgd2FzIGF0IGVudHJ5LiAgQWxsIG90aGVyIG9iamVjdHMKKyAgICAgKiBmcm9tIHRoZSBvcmlnaW5hbCB5b3VuZyAidG8gdGhlIGxlZnQiIG9mIHVzIGFyZSBpbiB1bnJlYWNoYWJsZSBub3csCisgICAgICogYW5kIGhhdmUgZ2NfcmVmcyA9IEdDX1RFTlRBVElWRUxZX1VOUkVBQ0hBQkxFLiAgQWxsIG9iamVjdHMgdG8gdGhlCisgICAgICogbGVmdCBvZiB1cyBpbiAneW91bmcnIG5vdyBoYXZlIGJlZW4gc2Nhbm5lZCwgYW5kIG5vIG9iamVjdHMgaGVyZQorICAgICAqIG9yIHRvIHRoZSByaWdodCBoYXZlIGJlZW4gc2Nhbm5lZCB5ZXQuCisgICAgICovCiAKLQl3aGlsZSAoZ2MgIT0geW91bmcpIHsKLQkJUHlHQ19IZWFkICpuZXh0OworICAgIHdoaWxlIChnYyAhPSB5b3VuZykgeworICAgICAgICBQeUdDX0hlYWQgKm5leHQ7CiAKLQkJaWYgKGdjLT5nYy5nY19yZWZzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBnYyBpcyBkZWZpbml0ZWx5IHJlYWNoYWJsZSBmcm9tIG91dHNpZGUgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBvcmlnaW5hbCAneW91bmcnLiAgTWFyayBpdCBhcyBzdWNoLCBhbmQgdHJhdmVyc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIGl0cyBwb2ludGVycyB0byBmaW5kIGFueSBvdGhlciBvYmplY3RzIHRoYXQgbWF5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgKiBiZSBkaXJlY3RseSByZWFjaGFibGUgZnJvbSBpdC4gIE5vdGUgdGhhdCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIGNhbGwgdG8gdHBfdHJhdmVyc2UgbWF5IGFwcGVuZCBvYmplY3RzIHRvIHlvdW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICogc28gd2UgaGF2ZSB0byB3YWl0IHVudGlsIGl0IHJldHVybnMgdG8gZGV0ZXJtaW5lCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiB0aGUgbmV4dCBvYmplY3QgdG8gdmlzaXQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpvcCA9IEZST01fR0MoZ2MpOwotICAgICAgICAgICAgICAgICAgICAgICAgdHJhdmVyc2Vwcm9jIHRyYXZlcnNlID0gUHlfVFlQRShvcCktPnRwX3RyYXZlcnNlOwotICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KGdjLT5nYy5nY19yZWZzID4gMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBnYy0+Z2MuZ2NfcmVmcyA9IEdDX1JFQUNIQUJMRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKSB0cmF2ZXJzZShvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmlzaXRwcm9jKXZpc2l0X3JlYWNoYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXlvdW5nKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgPSBnYy0+Z2MuZ2NfbmV4dDsKLQkJfQotCQllbHNlIHsKLQkJCS8qIFRoaXMgKm1heSogYmUgdW5yZWFjaGFibGUuICBUbyBtYWtlIHByb2dyZXNzLAotCQkJICogYXNzdW1lIGl0IGlzLiAgZ2MgaXNuJ3QgZGlyZWN0bHkgcmVhY2hhYmxlIGZyb20KLQkJCSAqIGFueSBvYmplY3Qgd2UndmUgYWxyZWFkeSB0cmF2ZXJzZWQsIGJ1dCBtYXkgYmUKLQkJCSAqIHJlYWNoYWJsZSBmcm9tIGFuIG9iamVjdCB3ZSBoYXZlbid0IGdvdHRlbiB0byB5ZXQuCi0JCQkgKiB2aXNpdF9yZWFjaGFibGUgd2lsbCBldmVudHVhbGx5IG1vdmUgZ2MgYmFjayBpbnRvCi0JCQkgKiB5b3VuZyBpZiB0aGF0J3Mgc28sIGFuZCB3ZSdsbCBzZWUgaXQgYWdhaW4uCi0JCQkgKi8KLQkJCW5leHQgPSBnYy0+Z2MuZ2NfbmV4dDsKLQkJCWdjX2xpc3RfbW92ZShnYywgdW5yZWFjaGFibGUpOwotCQkJZ2MtPmdjLmdjX3JlZnMgPSBHQ19URU5UQVRJVkVMWV9VTlJFQUNIQUJMRTsKLQkJfQotCQlnYyA9IG5leHQ7Ci0JfQorICAgICAgICBpZiAoZ2MtPmdjLmdjX3JlZnMpIHsKKyAgICAgICAgICAgIC8qIGdjIGlzIGRlZmluaXRlbHkgcmVhY2hhYmxlIGZyb20gb3V0c2lkZSB0aGUKKyAgICAgICAgICAgICAqIG9yaWdpbmFsICd5b3VuZycuICBNYXJrIGl0IGFzIHN1Y2gsIGFuZCB0cmF2ZXJzZQorICAgICAgICAgICAgICogaXRzIHBvaW50ZXJzIHRvIGZpbmQgYW55IG90aGVyIG9iamVjdHMgdGhhdCBtYXkKKyAgICAgICAgICAgICAqIGJlIGRpcmVjdGx5IHJlYWNoYWJsZSBmcm9tIGl0LiAgTm90ZSB0aGF0IHRoZQorICAgICAgICAgICAgICogY2FsbCB0byB0cF90cmF2ZXJzZSBtYXkgYXBwZW5kIG9iamVjdHMgdG8geW91bmcsCisgICAgICAgICAgICAgKiBzbyB3ZSBoYXZlIHRvIHdhaXQgdW50aWwgaXQgcmV0dXJucyB0byBkZXRlcm1pbmUKKyAgICAgICAgICAgICAqIHRoZSBuZXh0IG9iamVjdCB0byB2aXNpdC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgUHlPYmplY3QgKm9wID0gRlJPTV9HQyhnYyk7CisgICAgICAgICAgICB0cmF2ZXJzZXByb2MgdHJhdmVyc2UgPSBQeV9UWVBFKG9wKS0+dHBfdHJhdmVyc2U7CisgICAgICAgICAgICBhc3NlcnQoZ2MtPmdjLmdjX3JlZnMgPiAwKTsKKyAgICAgICAgICAgIGdjLT5nYy5nY19yZWZzID0gR0NfUkVBQ0hBQkxFOworICAgICAgICAgICAgKHZvaWQpIHRyYXZlcnNlKG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2aXNpdHByb2MpdmlzaXRfcmVhY2hhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopeW91bmcpOworICAgICAgICAgICAgbmV4dCA9IGdjLT5nYy5nY19uZXh0OworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLyogVGhpcyAqbWF5KiBiZSB1bnJlYWNoYWJsZS4gIFRvIG1ha2UgcHJvZ3Jlc3MsCisgICAgICAgICAgICAgKiBhc3N1bWUgaXQgaXMuICBnYyBpc24ndCBkaXJlY3RseSByZWFjaGFibGUgZnJvbQorICAgICAgICAgICAgICogYW55IG9iamVjdCB3ZSd2ZSBhbHJlYWR5IHRyYXZlcnNlZCwgYnV0IG1heSBiZQorICAgICAgICAgICAgICogcmVhY2hhYmxlIGZyb20gYW4gb2JqZWN0IHdlIGhhdmVuJ3QgZ290dGVuIHRvIHlldC4KKyAgICAgICAgICAgICAqIHZpc2l0X3JlYWNoYWJsZSB3aWxsIGV2ZW50dWFsbHkgbW92ZSBnYyBiYWNrIGludG8KKyAgICAgICAgICAgICAqIHlvdW5nIGlmIHRoYXQncyBzbywgYW5kIHdlJ2xsIHNlZSBpdCBhZ2Fpbi4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgbmV4dCA9IGdjLT5nYy5nY19uZXh0OworICAgICAgICAgICAgZ2NfbGlzdF9tb3ZlKGdjLCB1bnJlYWNoYWJsZSk7CisgICAgICAgICAgICBnYy0+Z2MuZ2NfcmVmcyA9IEdDX1RFTlRBVElWRUxZX1VOUkVBQ0hBQkxFOworICAgICAgICB9CisgICAgICAgIGdjID0gbmV4dDsKKyAgICB9CiB9CiAKIC8qIFJldHVybiB0cnVlIGlmIG9iamVjdCBoYXMgYSBmaW5hbGl6YXRpb24gbWV0aG9kLgpAQCAtNDExLDE2ICs0MTEsMTYgQEAKIHN0YXRpYyBpbnQKIGhhc19maW5hbGl6ZXIoUHlPYmplY3QgKm9wKQogewotCWlmIChQeUluc3RhbmNlX0NoZWNrKG9wKSkgewotCQlhc3NlcnQoZGVsc3RyICE9IE5VTEwpOwotCQlyZXR1cm4gX1B5SW5zdGFuY2VfTG9va3VwKG9wLCBkZWxzdHIpICE9IE5VTEw7Ci0JfQotCWVsc2UgaWYgKFB5VHlwZV9IYXNGZWF0dXJlKG9wLT5vYl90eXBlLCBQeV9UUEZMQUdTX0hFQVBUWVBFKSkKLQkJcmV0dXJuIG9wLT5vYl90eXBlLT50cF9kZWwgIT0gTlVMTDsKLQllbHNlIGlmIChQeUdlbl9DaGVja0V4YWN0KG9wKSkKLQkJcmV0dXJuIFB5R2VuX05lZWRzRmluYWxpemluZygoUHlHZW5PYmplY3QgKilvcCk7Ci0JZWxzZQotCQlyZXR1cm4gMDsKKyAgICBpZiAoUHlJbnN0YW5jZV9DaGVjayhvcCkpIHsKKyAgICAgICAgYXNzZXJ0KGRlbHN0ciAhPSBOVUxMKTsKKyAgICAgICAgcmV0dXJuIF9QeUluc3RhbmNlX0xvb2t1cChvcCwgZGVsc3RyKSAhPSBOVUxMOworICAgIH0KKyAgICBlbHNlIGlmIChQeVR5cGVfSGFzRmVhdHVyZShvcC0+b2JfdHlwZSwgUHlfVFBGTEFHU19IRUFQVFlQRSkpCisgICAgICAgIHJldHVybiBvcC0+b2JfdHlwZS0+dHBfZGVsICE9IE5VTEw7CisgICAgZWxzZSBpZiAoUHlHZW5fQ2hlY2tFeGFjdChvcCkpCisgICAgICAgIHJldHVybiBQeUdlbl9OZWVkc0ZpbmFsaXppbmcoKFB5R2VuT2JqZWN0ICopb3ApOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIDA7CiB9CiAKIC8qIE1vdmUgdGhlIG9iamVjdHMgaW4gdW5yZWFjaGFibGUgd2l0aCBfX2RlbF9fIG1ldGhvZHMgaW50byBgZmluYWxpemVyc2AuCkBAIC00MzAsMzcgKzQzMCwzNyBAQAogc3RhdGljIHZvaWQKIG1vdmVfZmluYWxpemVycyhQeUdDX0hlYWQgKnVucmVhY2hhYmxlLCBQeUdDX0hlYWQgKmZpbmFsaXplcnMpCiB7Ci0JUHlHQ19IZWFkICpnYzsKLQlQeUdDX0hlYWQgKm5leHQ7CisgICAgUHlHQ19IZWFkICpnYzsKKyAgICBQeUdDX0hlYWQgKm5leHQ7CiAKLQkvKiBNYXJjaCBvdmVyIHVucmVhY2hhYmxlLiAgTW92ZSBvYmplY3RzIHdpdGggZmluYWxpemVycyBpbnRvCi0JICogYGZpbmFsaXplcnNgLgotCSAqLwotCWZvciAoZ2MgPSB1bnJlYWNoYWJsZS0+Z2MuZ2NfbmV4dDsgZ2MgIT0gdW5yZWFjaGFibGU7IGdjID0gbmV4dCkgewotCQlQeU9iamVjdCAqb3AgPSBGUk9NX0dDKGdjKTsKKyAgICAvKiBNYXJjaCBvdmVyIHVucmVhY2hhYmxlLiAgTW92ZSBvYmplY3RzIHdpdGggZmluYWxpemVycyBpbnRvCisgICAgICogYGZpbmFsaXplcnNgLgorICAgICAqLworICAgIGZvciAoZ2MgPSB1bnJlYWNoYWJsZS0+Z2MuZ2NfbmV4dDsgZ2MgIT0gdW5yZWFjaGFibGU7IGdjID0gbmV4dCkgeworICAgICAgICBQeU9iamVjdCAqb3AgPSBGUk9NX0dDKGdjKTsKIAotCQlhc3NlcnQoSVNfVEVOVEFUSVZFTFlfVU5SRUFDSEFCTEUob3ApKTsKLQkJbmV4dCA9IGdjLT5nYy5nY19uZXh0OworICAgICAgICBhc3NlcnQoSVNfVEVOVEFUSVZFTFlfVU5SRUFDSEFCTEUob3ApKTsKKyAgICAgICAgbmV4dCA9IGdjLT5nYy5nY19uZXh0OwogCi0JCWlmIChoYXNfZmluYWxpemVyKG9wKSkgewotCQkJZ2NfbGlzdF9tb3ZlKGdjLCBmaW5hbGl6ZXJzKTsKLQkJCWdjLT5nYy5nY19yZWZzID0gR0NfUkVBQ0hBQkxFOwotCQl9Ci0JfQorICAgICAgICBpZiAoaGFzX2ZpbmFsaXplcihvcCkpIHsKKyAgICAgICAgICAgIGdjX2xpc3RfbW92ZShnYywgZmluYWxpemVycyk7CisgICAgICAgICAgICBnYy0+Z2MuZ2NfcmVmcyA9IEdDX1JFQUNIQUJMRTsKKyAgICAgICAgfQorICAgIH0KIH0KIAogLyogQSB0cmF2ZXJzYWwgY2FsbGJhY2sgZm9yIG1vdmVfZmluYWxpemVyX3JlYWNoYWJsZS4gKi8KIHN0YXRpYyBpbnQKIHZpc2l0X21vdmUoUHlPYmplY3QgKm9wLCBQeUdDX0hlYWQgKnRvbGlzdCkKIHsKLQlpZiAoUHlPYmplY3RfSVNfR0Mob3ApKSB7Ci0JCWlmIChJU19URU5UQVRJVkVMWV9VTlJFQUNIQUJMRShvcCkpIHsKLQkJCVB5R0NfSGVhZCAqZ2MgPSBBU19HQyhvcCk7Ci0JCQlnY19saXN0X21vdmUoZ2MsIHRvbGlzdCk7Ci0JCQlnYy0+Z2MuZ2NfcmVmcyA9IEdDX1JFQUNIQUJMRTsKLQkJfQotCX0KLQlyZXR1cm4gMDsKKyAgICBpZiAoUHlPYmplY3RfSVNfR0Mob3ApKSB7CisgICAgICAgIGlmIChJU19URU5UQVRJVkVMWV9VTlJFQUNIQUJMRShvcCkpIHsKKyAgICAgICAgICAgIFB5R0NfSGVhZCAqZ2MgPSBBU19HQyhvcCk7CisgICAgICAgICAgICBnY19saXN0X21vdmUoZ2MsIHRvbGlzdCk7CisgICAgICAgICAgICBnYy0+Z2MuZ2NfcmVmcyA9IEdDX1JFQUNIQUJMRTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogLyogTW92ZSBvYmplY3RzIHRoYXQgYXJlIHJlYWNoYWJsZSBmcm9tIGZpbmFsaXplcnMsIGZyb20gdGhlIHVucmVhY2hhYmxlIHNldApAQCAtNDY5LDE1ICs0NjksMTUgQEAKIHN0YXRpYyB2b2lkCiBtb3ZlX2ZpbmFsaXplcl9yZWFjaGFibGUoUHlHQ19IZWFkICpmaW5hbGl6ZXJzKQogewotCXRyYXZlcnNlcHJvYyB0cmF2ZXJzZTsKLQlQeUdDX0hlYWQgKmdjID0gZmluYWxpemVycy0+Z2MuZ2NfbmV4dDsKLQlmb3IgKDsgZ2MgIT0gZmluYWxpemVyczsgZ2MgPSBnYy0+Z2MuZ2NfbmV4dCkgewotCQkvKiBOb3RlIHRoYXQgdGhlIGZpbmFsaXplcnMgbGlzdCBtYXkgZ3JvdyBkdXJpbmcgdGhpcy4gKi8KLQkJdHJhdmVyc2UgPSBQeV9UWVBFKEZST01fR0MoZ2MpKS0+dHBfdHJhdmVyc2U7Ci0JCSh2b2lkKSB0cmF2ZXJzZShGUk9NX0dDKGdjKSwKLQkJCQkodmlzaXRwcm9jKXZpc2l0X21vdmUsCi0JCQkJKHZvaWQgKilmaW5hbGl6ZXJzKTsKLQl9CisgICAgdHJhdmVyc2Vwcm9jIHRyYXZlcnNlOworICAgIFB5R0NfSGVhZCAqZ2MgPSBmaW5hbGl6ZXJzLT5nYy5nY19uZXh0OworICAgIGZvciAoOyBnYyAhPSBmaW5hbGl6ZXJzOyBnYyA9IGdjLT5nYy5nY19uZXh0KSB7CisgICAgICAgIC8qIE5vdGUgdGhhdCB0aGUgZmluYWxpemVycyBsaXN0IG1heSBncm93IGR1cmluZyB0aGlzLiAqLworICAgICAgICB0cmF2ZXJzZSA9IFB5X1RZUEUoRlJPTV9HQyhnYykpLT50cF90cmF2ZXJzZTsKKyAgICAgICAgKHZvaWQpIHRyYXZlcnNlKEZST01fR0MoZ2MpLAorICAgICAgICAgICAgICAgICAgICAgICAgKHZpc2l0cHJvYyl2aXNpdF9tb3ZlLAorICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilmaW5hbGl6ZXJzKTsKKyAgICB9CiB9CiAKIC8qIENsZWFyIGFsbCB3ZWFrcmVmcyB0byB1bnJlYWNoYWJsZSBvYmplY3RzLCBhbmQgaWYgc3VjaCBhIHdlYWtyZWYgaGFzIGEKQEAgLTQ5NCwxNjkgKzQ5NCwxNjkgQEAKIHN0YXRpYyBpbnQKIGhhbmRsZV93ZWFrcmVmcyhQeUdDX0hlYWQgKnVucmVhY2hhYmxlLCBQeUdDX0hlYWQgKm9sZCkKIHsKLQlQeUdDX0hlYWQgKmdjOwotCVB5T2JqZWN0ICpvcDsJCS8qIGdlbmVyYWxseSBGUk9NX0dDKGdjKSAqLwotCVB5V2Vha1JlZmVyZW5jZSAqd3I7CS8qIGdlbmVyYWxseSBhIGNhc3Qgb2Ygb3AgKi8KLQlQeUdDX0hlYWQgd3JjYl90b19jYWxsOwkvKiB3ZWFrcmVmcyB3aXRoIGNhbGxiYWNrcyB0byBjYWxsICovCi0JUHlHQ19IZWFkICpuZXh0OwotCWludCBudW1fZnJlZWQgPSAwOworICAgIFB5R0NfSGVhZCAqZ2M7CisgICAgUHlPYmplY3QgKm9wOyAgICAgICAgICAgICAgIC8qIGdlbmVyYWxseSBGUk9NX0dDKGdjKSAqLworICAgIFB5V2Vha1JlZmVyZW5jZSAqd3I7ICAgICAgICAvKiBnZW5lcmFsbHkgYSBjYXN0IG9mIG9wICovCisgICAgUHlHQ19IZWFkIHdyY2JfdG9fY2FsbDsgICAgIC8qIHdlYWtyZWZzIHdpdGggY2FsbGJhY2tzIHRvIGNhbGwgKi8KKyAgICBQeUdDX0hlYWQgKm5leHQ7CisgICAgaW50IG51bV9mcmVlZCA9IDA7CiAKLQlnY19saXN0X2luaXQoJndyY2JfdG9fY2FsbCk7CisgICAgZ2NfbGlzdF9pbml0KCZ3cmNiX3RvX2NhbGwpOwogCi0JLyogQ2xlYXIgYWxsIHdlYWtyZWZzIHRvIHRoZSBvYmplY3RzIGluIHVucmVhY2hhYmxlLiAgSWYgc3VjaCBhIHdlYWtyZWYKLQkgKiBhbHNvIGhhcyBhIGNhbGxiYWNrLCBtb3ZlIGl0IGludG8gYHdyY2JfdG9fY2FsbGAgaWYgdGhlIGNhbGxiYWNrCi0JICogbmVlZHMgdG8gYmUgaW52b2tlZC4gIE5vdGUgdGhhdCB3ZSBjYW5ub3QgaW52b2tlIGFueSBjYWxsYmFja3MgdW50aWwKLQkgKiBhbGwgd2Vha3JlZnMgdG8gdW5yZWFjaGFibGUgb2JqZWN0cyBhcmUgY2xlYXJlZCwgbGVzdCB0aGUgY2FsbGJhY2sKLQkgKiByZXN1cnJlY3QgYW4gdW5yZWFjaGFibGUgb2JqZWN0IHZpYSBhIHN0aWxsLWFjdGl2ZSB3ZWFrcmVmLiAgV2UKLQkgKiBtYWtlIGFub3RoZXIgcGFzcyBvdmVyIHdyY2JfdG9fY2FsbCwgaW52b2tpbmcgY2FsbGJhY2tzLCBhZnRlciB0aGlzCi0JICogcGFzcyBjb21wbGV0ZXMuCi0JICovCi0JZm9yIChnYyA9IHVucmVhY2hhYmxlLT5nYy5nY19uZXh0OyBnYyAhPSB1bnJlYWNoYWJsZTsgZ2MgPSBuZXh0KSB7Ci0JCVB5V2Vha1JlZmVyZW5jZSAqKndybGlzdDsKKyAgICAvKiBDbGVhciBhbGwgd2Vha3JlZnMgdG8gdGhlIG9iamVjdHMgaW4gdW5yZWFjaGFibGUuICBJZiBzdWNoIGEgd2Vha3JlZgorICAgICAqIGFsc28gaGFzIGEgY2FsbGJhY2ssIG1vdmUgaXQgaW50byBgd3JjYl90b19jYWxsYCBpZiB0aGUgY2FsbGJhY2sKKyAgICAgKiBuZWVkcyB0byBiZSBpbnZva2VkLiAgTm90ZSB0aGF0IHdlIGNhbm5vdCBpbnZva2UgYW55IGNhbGxiYWNrcyB1bnRpbAorICAgICAqIGFsbCB3ZWFrcmVmcyB0byB1bnJlYWNoYWJsZSBvYmplY3RzIGFyZSBjbGVhcmVkLCBsZXN0IHRoZSBjYWxsYmFjaworICAgICAqIHJlc3VycmVjdCBhbiB1bnJlYWNoYWJsZSBvYmplY3QgdmlhIGEgc3RpbGwtYWN0aXZlIHdlYWtyZWYuICBXZQorICAgICAqIG1ha2UgYW5vdGhlciBwYXNzIG92ZXIgd3JjYl90b19jYWxsLCBpbnZva2luZyBjYWxsYmFja3MsIGFmdGVyIHRoaXMKKyAgICAgKiBwYXNzIGNvbXBsZXRlcy4KKyAgICAgKi8KKyAgICBmb3IgKGdjID0gdW5yZWFjaGFibGUtPmdjLmdjX25leHQ7IGdjICE9IHVucmVhY2hhYmxlOyBnYyA9IG5leHQpIHsKKyAgICAgICAgUHlXZWFrUmVmZXJlbmNlICoqd3JsaXN0OwogCi0JCW9wID0gRlJPTV9HQyhnYyk7Ci0JCWFzc2VydChJU19URU5UQVRJVkVMWV9VTlJFQUNIQUJMRShvcCkpOwotCQluZXh0ID0gZ2MtPmdjLmdjX25leHQ7CisgICAgICAgIG9wID0gRlJPTV9HQyhnYyk7CisgICAgICAgIGFzc2VydChJU19URU5UQVRJVkVMWV9VTlJFQUNIQUJMRShvcCkpOworICAgICAgICBuZXh0ID0gZ2MtPmdjLmdjX25leHQ7CiAKLQkJaWYgKCEgUHlUeXBlX1NVUFBPUlRTX1dFQUtSRUZTKFB5X1RZUEUob3ApKSkKLQkJCWNvbnRpbnVlOworICAgICAgICBpZiAoISBQeVR5cGVfU1VQUE9SVFNfV0VBS1JFRlMoUHlfVFlQRShvcCkpKQorICAgICAgICAgICAgY29udGludWU7CiAKLQkJLyogSXQgc3VwcG9ydHMgd2Vha3JlZnMuICBEb2VzIGl0IGhhdmUgYW55PyAqLwotCQl3cmxpc3QgPSAoUHlXZWFrUmVmZXJlbmNlICoqKQotCQkJICAgICAJCVB5T2JqZWN0X0dFVF9XRUFLUkVGU19MSVNUUFRSKG9wKTsKKyAgICAgICAgLyogSXQgc3VwcG9ydHMgd2Vha3JlZnMuICBEb2VzIGl0IGhhdmUgYW55PyAqLworICAgICAgICB3cmxpc3QgPSAoUHlXZWFrUmVmZXJlbmNlICoqKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdF9HRVRfV0VBS1JFRlNfTElTVFBUUihvcCk7CiAKLQkJLyogYG9wYCBtYXkgaGF2ZSBzb21lIHdlYWtyZWZzLiAgTWFyY2ggb3ZlciB0aGUgbGlzdCwgY2xlYXIKLQkJICogYWxsIHRoZSB3ZWFrcmVmcywgYW5kIG1vdmUgdGhlIHdlYWtyZWZzIHdpdGggY2FsbGJhY2tzCi0JCSAqIHRoYXQgbXVzdCBiZSBjYWxsZWQgaW50byB3cmNiX3RvX2NhbGwuCi0JCSAqLwotCQlmb3IgKHdyID0gKndybGlzdDsgd3IgIT0gTlVMTDsgd3IgPSAqd3JsaXN0KSB7Ci0JCQlQeUdDX0hlYWQgKndyYXNnYzsJLyogQVNfR0Mod3IpICovCisgICAgICAgIC8qIGBvcGAgbWF5IGhhdmUgc29tZSB3ZWFrcmVmcy4gIE1hcmNoIG92ZXIgdGhlIGxpc3QsIGNsZWFyCisgICAgICAgICAqIGFsbCB0aGUgd2Vha3JlZnMsIGFuZCBtb3ZlIHRoZSB3ZWFrcmVmcyB3aXRoIGNhbGxiYWNrcworICAgICAgICAgKiB0aGF0IG11c3QgYmUgY2FsbGVkIGludG8gd3JjYl90b19jYWxsLgorICAgICAgICAgKi8KKyAgICAgICAgZm9yICh3ciA9ICp3cmxpc3Q7IHdyICE9IE5VTEw7IHdyID0gKndybGlzdCkgeworICAgICAgICAgICAgUHlHQ19IZWFkICp3cmFzZ2M7ICAgICAgICAgICAgICAgICAgLyogQVNfR0Mod3IpICovCiAKLQkJCS8qIF9QeVdlYWtyZWZfQ2xlYXJSZWYgY2xlYXJzIHRoZSB3ZWFrcmVmIGJ1dCBsZWF2ZXMKLQkJCSAqIHRoZSBjYWxsYmFjayBwb2ludGVyIGludGFjdC4gIE9ic2N1cmU6ICBpdCBhbHNvCi0JCQkgKiBjaGFuZ2VzICp3cmxpc3QuCi0JCQkgKi8KLQkJCWFzc2VydCh3ci0+d3Jfb2JqZWN0ID09IG9wKTsKLQkJCV9QeVdlYWtyZWZfQ2xlYXJSZWYod3IpOwotCQkJYXNzZXJ0KHdyLT53cl9vYmplY3QgPT0gUHlfTm9uZSk7Ci0JCQlpZiAod3ItPndyX2NhbGxiYWNrID09IE5VTEwpCi0JCQkJY29udGludWU7CS8qIG5vIGNhbGxiYWNrICovCisgICAgICAgICAgICAvKiBfUHlXZWFrcmVmX0NsZWFyUmVmIGNsZWFycyB0aGUgd2Vha3JlZiBidXQgbGVhdmVzCisgICAgICAgICAgICAgKiB0aGUgY2FsbGJhY2sgcG9pbnRlciBpbnRhY3QuICBPYnNjdXJlOiAgaXQgYWxzbworICAgICAgICAgICAgICogY2hhbmdlcyAqd3JsaXN0LgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBhc3NlcnQod3ItPndyX29iamVjdCA9PSBvcCk7CisgICAgICAgICAgICBfUHlXZWFrcmVmX0NsZWFyUmVmKHdyKTsKKyAgICAgICAgICAgIGFzc2VydCh3ci0+d3Jfb2JqZWN0ID09IFB5X05vbmUpOworICAgICAgICAgICAgaWYgKHdyLT53cl9jYWxsYmFjayA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAgICAgICAgICAgICAgICAgICAgICAgLyogbm8gY2FsbGJhY2sgKi8KIAotCS8qIEhlYWRhY2hlIHRpbWUuICBgb3BgIGlzIGdvaW5nIGF3YXksIGFuZCBpcyB3ZWFrbHkgcmVmZXJlbmNlZCBieQotCSAqIGB3cmAsIHdoaWNoIGhhcyBhIGNhbGxiYWNrLiAgU2hvdWxkIHRoZSBjYWxsYmFjayBiZSBpbnZva2VkPyAgSWYgd3IKLQkgKiBpcyBhbHNvIHRyYXNoLCBubzoKLQkgKgotCSAqIDEuIFRoZXJlJ3Mgbm8gbmVlZCB0byBjYWxsIGl0LiAgVGhlIG9iamVjdCBhbmQgdGhlIHdlYWtyZWYgYXJlCi0JICogICAgYm90aCBnb2luZyBhd2F5LCBzbyBpdCdzIGxlZ2l0aW1hdGUgdG8gcHJldGVuZCB0aGUgd2Vha3JlZiBpcwotCSAqICAgIGdvaW5nIGF3YXkgZmlyc3QuICBUaGUgdXNlciBoYXMgdG8gZW5zdXJlIGEgd2Vha3JlZiBvdXRsaXZlcyBpdHMKLQkgKiAgICByZWZlcmVudCBpZiB0aGV5IHdhbnQgYSBndWFyYW50ZWUgdGhhdCB0aGUgd3IgY2FsbGJhY2sgd2lsbCBnZXQKLQkgKiAgICBpbnZva2VkLgotCSAqCi0JICogMi4gSXQgbWF5IGJlIGNhdGFzdHJvcGhpYyB0byBjYWxsIGl0LiAgSWYgdGhlIGNhbGxiYWNrIGlzIGFsc28gaW4KLQkgKiAgICBjeWNsaWMgdHJhc2ggKENUKSwgdGhlbiBhbHRob3VnaCB0aGUgQ1QgaXMgdW5yZWFjaGFibGUgZnJvbQotCSAqICAgIG91dHNpZGUgdGhlIGN1cnJlbnQgZ2VuZXJhdGlvbiwgQ1QgbWF5IGJlIHJlYWNoYWJsZSBmcm9tIHRoZQotCSAqICAgIGNhbGxiYWNrLiAgVGhlbiB0aGUgY2FsbGJhY2sgY291bGQgcmVzdXJyZWN0IGluc2FuZSBvYmplY3RzLgotCSAqCi0JICogU2luY2UgdGhlIGNhbGxiYWNrIGlzIG5ldmVyIG5lZWRlZCBhbmQgbWF5IGJlIHVuc2FmZSBpbiB0aGlzIGNhc2UsCi0JICogd3IgaXMgc2ltcGx5IGxlZnQgaW4gdGhlIHVucmVhY2hhYmxlIHNldC4gIE5vdGUgdGhhdCBiZWNhdXNlIHdlCi0JICogYWxyZWFkeSBjYWxsZWQgX1B5V2Vha3JlZl9DbGVhclJlZih3ciksIGl0cyBjYWxsYmFjayB3aWxsIG5ldmVyCi0JICogdHJpZ2dlci4KLQkgKgotCSAqIE9UT0gsIGlmIHdyIGlzbid0IHBhcnQgb2YgQ1QsIHdlIHNob3VsZCBpbnZva2UgdGhlIGNhbGxiYWNrOiAgdGhlCi0JICogd2Vha3JlZiBvdXRsaXZlZCB0aGUgdHJhc2guICBOb3RlIHRoYXQgc2luY2Ugd3IgaXNuJ3QgQ1QgaW4gdGhpcwotCSAqIGNhc2UsIGl0cyBjYWxsYmFjayBjYW4ndCBiZSBDVCBlaXRoZXIgLS0gd3IgYWN0ZWQgYXMgYW4gZXh0ZXJuYWwKLQkgKiByb290IHRvIHRoaXMgZ2VuZXJhdGlvbiwgYW5kIHRoZXJlZm9yZSBpdHMgY2FsbGJhY2sgZGlkIHRvby4gIFNvCi0JICogbm90aGluZyBpbiBDVCBpcyByZWFjaGFibGUgZnJvbSB0aGUgY2FsbGJhY2sgZWl0aGVyLCBzbyBpdCdzIGhhcmQKLQkgKiB0byBpbWFnaW5lIGhvdyBjYWxsaW5nIGl0IGxhdGVyIGNvdWxkIGNyZWF0ZSBhIHByb2JsZW0gZm9yIHVzLiAgd3IKLQkgKiBpcyBtb3ZlZCB0byB3cmNiX3RvX2NhbGwgaW4gdGhpcyBjYXNlLgotCSAqLwotCSAJCWlmIChJU19URU5UQVRJVkVMWV9VTlJFQUNIQUJMRSh3cikpCi0JIAkJCWNvbnRpbnVlOwotCQkJYXNzZXJ0KElTX1JFQUNIQUJMRSh3cikpOworICAgIC8qIEhlYWRhY2hlIHRpbWUuICBgb3BgIGlzIGdvaW5nIGF3YXksIGFuZCBpcyB3ZWFrbHkgcmVmZXJlbmNlZCBieQorICAgICAqIGB3cmAsIHdoaWNoIGhhcyBhIGNhbGxiYWNrLiAgU2hvdWxkIHRoZSBjYWxsYmFjayBiZSBpbnZva2VkPyAgSWYgd3IKKyAgICAgKiBpcyBhbHNvIHRyYXNoLCBubzoKKyAgICAgKgorICAgICAqIDEuIFRoZXJlJ3Mgbm8gbmVlZCB0byBjYWxsIGl0LiAgVGhlIG9iamVjdCBhbmQgdGhlIHdlYWtyZWYgYXJlCisgICAgICogICAgYm90aCBnb2luZyBhd2F5LCBzbyBpdCdzIGxlZ2l0aW1hdGUgdG8gcHJldGVuZCB0aGUgd2Vha3JlZiBpcworICAgICAqICAgIGdvaW5nIGF3YXkgZmlyc3QuICBUaGUgdXNlciBoYXMgdG8gZW5zdXJlIGEgd2Vha3JlZiBvdXRsaXZlcyBpdHMKKyAgICAgKiAgICByZWZlcmVudCBpZiB0aGV5IHdhbnQgYSBndWFyYW50ZWUgdGhhdCB0aGUgd3IgY2FsbGJhY2sgd2lsbCBnZXQKKyAgICAgKiAgICBpbnZva2VkLgorICAgICAqCisgICAgICogMi4gSXQgbWF5IGJlIGNhdGFzdHJvcGhpYyB0byBjYWxsIGl0LiAgSWYgdGhlIGNhbGxiYWNrIGlzIGFsc28gaW4KKyAgICAgKiAgICBjeWNsaWMgdHJhc2ggKENUKSwgdGhlbiBhbHRob3VnaCB0aGUgQ1QgaXMgdW5yZWFjaGFibGUgZnJvbQorICAgICAqICAgIG91dHNpZGUgdGhlIGN1cnJlbnQgZ2VuZXJhdGlvbiwgQ1QgbWF5IGJlIHJlYWNoYWJsZSBmcm9tIHRoZQorICAgICAqICAgIGNhbGxiYWNrLiAgVGhlbiB0aGUgY2FsbGJhY2sgY291bGQgcmVzdXJyZWN0IGluc2FuZSBvYmplY3RzLgorICAgICAqCisgICAgICogU2luY2UgdGhlIGNhbGxiYWNrIGlzIG5ldmVyIG5lZWRlZCBhbmQgbWF5IGJlIHVuc2FmZSBpbiB0aGlzIGNhc2UsCisgICAgICogd3IgaXMgc2ltcGx5IGxlZnQgaW4gdGhlIHVucmVhY2hhYmxlIHNldC4gIE5vdGUgdGhhdCBiZWNhdXNlIHdlCisgICAgICogYWxyZWFkeSBjYWxsZWQgX1B5V2Vha3JlZl9DbGVhclJlZih3ciksIGl0cyBjYWxsYmFjayB3aWxsIG5ldmVyCisgICAgICogdHJpZ2dlci4KKyAgICAgKgorICAgICAqIE9UT0gsIGlmIHdyIGlzbid0IHBhcnQgb2YgQ1QsIHdlIHNob3VsZCBpbnZva2UgdGhlIGNhbGxiYWNrOiAgdGhlCisgICAgICogd2Vha3JlZiBvdXRsaXZlZCB0aGUgdHJhc2guICBOb3RlIHRoYXQgc2luY2Ugd3IgaXNuJ3QgQ1QgaW4gdGhpcworICAgICAqIGNhc2UsIGl0cyBjYWxsYmFjayBjYW4ndCBiZSBDVCBlaXRoZXIgLS0gd3IgYWN0ZWQgYXMgYW4gZXh0ZXJuYWwKKyAgICAgKiByb290IHRvIHRoaXMgZ2VuZXJhdGlvbiwgYW5kIHRoZXJlZm9yZSBpdHMgY2FsbGJhY2sgZGlkIHRvby4gIFNvCisgICAgICogbm90aGluZyBpbiBDVCBpcyByZWFjaGFibGUgZnJvbSB0aGUgY2FsbGJhY2sgZWl0aGVyLCBzbyBpdCdzIGhhcmQKKyAgICAgKiB0byBpbWFnaW5lIGhvdyBjYWxsaW5nIGl0IGxhdGVyIGNvdWxkIGNyZWF0ZSBhIHByb2JsZW0gZm9yIHVzLiAgd3IKKyAgICAgKiBpcyBtb3ZlZCB0byB3cmNiX3RvX2NhbGwgaW4gdGhpcyBjYXNlLgorICAgICAqLworICAgICAgICAgICAgaWYgKElTX1RFTlRBVElWRUxZX1VOUkVBQ0hBQkxFKHdyKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGFzc2VydChJU19SRUFDSEFCTEUod3IpKTsKIAotCQkJLyogQ3JlYXRlIGEgbmV3IHJlZmVyZW5jZSBzbyB0aGF0IHdyIGNhbid0IGdvIGF3YXkKLQkJCSAqIGJlZm9yZSB3ZSBjYW4gcHJvY2VzcyBpdCBhZ2Fpbi4KLQkJCSAqLwotCQkJUHlfSU5DUkVGKHdyKTsKKyAgICAgICAgICAgIC8qIENyZWF0ZSBhIG5ldyByZWZlcmVuY2Ugc28gdGhhdCB3ciBjYW4ndCBnbyBhd2F5CisgICAgICAgICAgICAgKiBiZWZvcmUgd2UgY2FuIHByb2Nlc3MgaXQgYWdhaW4uCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIFB5X0lOQ1JFRih3cik7CiAKLQkJCS8qIE1vdmUgd3IgdG8gd3JjYl90b19jYWxsLCBmb3IgdGhlIG5leHQgcGFzcy4gKi8KLQkJCXdyYXNnYyA9IEFTX0dDKHdyKTsKLQkJCWFzc2VydCh3cmFzZ2MgIT0gbmV4dCk7IC8qIHdyYXNnYyBpcyByZWFjaGFibGUsIGJ1dAotCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBpc24ndCwgc28gdGhleSBjYW4ndAotCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgdGhlIHNhbWUgKi8KLQkJCWdjX2xpc3RfbW92ZSh3cmFzZ2MsICZ3cmNiX3RvX2NhbGwpOwotCQl9Ci0JfQorICAgICAgICAgICAgLyogTW92ZSB3ciB0byB3cmNiX3RvX2NhbGwsIGZvciB0aGUgbmV4dCBwYXNzLiAqLworICAgICAgICAgICAgd3Jhc2djID0gQVNfR0Mod3IpOworICAgICAgICAgICAgYXNzZXJ0KHdyYXNnYyAhPSBuZXh0KTsgLyogd3Jhc2djIGlzIHJlYWNoYWJsZSwgYnV0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IGlzbid0LCBzbyB0aGV5IGNhbid0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSB0aGUgc2FtZSAqLworICAgICAgICAgICAgZ2NfbGlzdF9tb3ZlKHdyYXNnYywgJndyY2JfdG9fY2FsbCk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKiBJbnZva2UgdGhlIGNhbGxiYWNrcyB3ZSBkZWNpZGVkIHRvIGhvbm9yLiAgSXQncyBzYWZlIHRvIGludm9rZSB0aGVtCi0JICogYmVjYXVzZSB0aGV5IGNhbid0IHJlZmVyZW5jZSB1bnJlYWNoYWJsZSBvYmplY3RzLgotCSAqLwotCXdoaWxlICghIGdjX2xpc3RfaXNfZW1wdHkoJndyY2JfdG9fY2FsbCkpIHsKLQkJUHlPYmplY3QgKnRlbXA7Ci0JCVB5T2JqZWN0ICpjYWxsYmFjazsKKyAgICAvKiBJbnZva2UgdGhlIGNhbGxiYWNrcyB3ZSBkZWNpZGVkIHRvIGhvbm9yLiAgSXQncyBzYWZlIHRvIGludm9rZSB0aGVtCisgICAgICogYmVjYXVzZSB0aGV5IGNhbid0IHJlZmVyZW5jZSB1bnJlYWNoYWJsZSBvYmplY3RzLgorICAgICAqLworICAgIHdoaWxlICghIGdjX2xpc3RfaXNfZW1wdHkoJndyY2JfdG9fY2FsbCkpIHsKKyAgICAgICAgUHlPYmplY3QgKnRlbXA7CisgICAgICAgIFB5T2JqZWN0ICpjYWxsYmFjazsKIAotCQlnYyA9IHdyY2JfdG9fY2FsbC5nYy5nY19uZXh0OwotCQlvcCA9IEZST01fR0MoZ2MpOwotCQlhc3NlcnQoSVNfUkVBQ0hBQkxFKG9wKSk7Ci0JCWFzc2VydChQeVdlYWtyZWZfQ2hlY2sob3ApKTsKLQkJd3IgPSAoUHlXZWFrUmVmZXJlbmNlICopb3A7Ci0JCWNhbGxiYWNrID0gd3ItPndyX2NhbGxiYWNrOwotCQlhc3NlcnQoY2FsbGJhY2sgIT0gTlVMTCk7CisgICAgICAgIGdjID0gd3JjYl90b19jYWxsLmdjLmdjX25leHQ7CisgICAgICAgIG9wID0gRlJPTV9HQyhnYyk7CisgICAgICAgIGFzc2VydChJU19SRUFDSEFCTEUob3ApKTsKKyAgICAgICAgYXNzZXJ0KFB5V2Vha3JlZl9DaGVjayhvcCkpOworICAgICAgICB3ciA9IChQeVdlYWtSZWZlcmVuY2UgKilvcDsKKyAgICAgICAgY2FsbGJhY2sgPSB3ci0+d3JfY2FsbGJhY2s7CisgICAgICAgIGFzc2VydChjYWxsYmFjayAhPSBOVUxMKTsKIAotCQkvKiBjb3B5LXBhc3RlIG9mIHdlYWtyZWZvYmplY3QuYydzIGhhbmRsZV9jYWxsYmFjaygpICovCi0JCXRlbXAgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGNhbGxiYWNrLCB3ciwgTlVMTCk7Ci0JCWlmICh0ZW1wID09IE5VTEwpCi0JCQlQeUVycl9Xcml0ZVVucmFpc2FibGUoY2FsbGJhY2spOwotCQllbHNlCi0JCQlQeV9ERUNSRUYodGVtcCk7CisgICAgICAgIC8qIGNvcHktcGFzdGUgb2Ygd2Vha3JlZm9iamVjdC5jJ3MgaGFuZGxlX2NhbGxiYWNrKCkgKi8KKyAgICAgICAgdGVtcCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoY2FsbGJhY2ssIHdyLCBOVUxMKTsKKyAgICAgICAgaWYgKHRlbXAgPT0gTlVMTCkKKyAgICAgICAgICAgIFB5RXJyX1dyaXRlVW5yYWlzYWJsZShjYWxsYmFjayk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIFB5X0RFQ1JFRih0ZW1wKTsKIAotCQkvKiBHaXZlIHVwIHRoZSByZWZlcmVuY2Ugd2UgY3JlYXRlZCBpbiB0aGUgZmlyc3QgcGFzcy4gIFdoZW4KLQkJICogb3AncyByZWZjb3VudCBoaXRzIDAgKHdoaWNoIGl0IG1heSBvciBtYXkgbm90IGRvIHJpZ2h0IG5vdyksCi0JCSAqIG9wJ3MgdHBfZGVhbGxvYyB3aWxsIGRlY3JlZiBvcC0+d3JfY2FsbGJhY2sgdG9vLiAgTm90ZQotCQkgKiB0aGF0IHRoZSByZWZjb3VudCBwcm9iYWJseSB3aWxsIGhpdCAwIG5vdywgYW5kIGJlY2F1c2UgdGhpcwotCQkgKiB3ZWFrcmVmIHdhcyByZWFjaGFibGUgdG8gYmVnaW4gd2l0aCwgZ2MgZGlkbid0IGFscmVhZHkKLQkJICogYWRkIGl0IHRvIGl0cyBjb3VudCBvZiBmcmVlZCBvYmplY3RzLiAgRXhhbXBsZTogIGEgcmVhY2hhYmxlCi0JCSAqIHdlYWsgdmFsdWUgZGljdCBtYXBzIHNvbWUga2V5IHRvIHRoaXMgcmVhY2hhYmxlIHdlYWtyZWYuCi0JCSAqIFRoZSBjYWxsYmFjayByZW1vdmVzIHRoaXMga2V5LT53ZWFrcmVmIG1hcHBpbmcgZnJvbSB0aGUKLQkJICogZGljdCwgbGVhdmluZyBubyBvdGhlciByZWZlcmVuY2VzIHRvIHRoZSB3ZWFrcmVmIChleGNlcHRpbmcKLQkJICogb3VycykuCi0JCSAqLwotCQlQeV9ERUNSRUYob3ApOwotCQlpZiAod3JjYl90b19jYWxsLmdjLmdjX25leHQgPT0gZ2MpIHsKLQkJCS8qIG9iamVjdCBpcyBzdGlsbCBhbGl2ZSAtLSBtb3ZlIGl0ICovCi0JCQlnY19saXN0X21vdmUoZ2MsIG9sZCk7Ci0JCX0KLQkJZWxzZQotCQkJKytudW1fZnJlZWQ7Ci0JfQorICAgICAgICAvKiBHaXZlIHVwIHRoZSByZWZlcmVuY2Ugd2UgY3JlYXRlZCBpbiB0aGUgZmlyc3QgcGFzcy4gIFdoZW4KKyAgICAgICAgICogb3AncyByZWZjb3VudCBoaXRzIDAgKHdoaWNoIGl0IG1heSBvciBtYXkgbm90IGRvIHJpZ2h0IG5vdyksCisgICAgICAgICAqIG9wJ3MgdHBfZGVhbGxvYyB3aWxsIGRlY3JlZiBvcC0+d3JfY2FsbGJhY2sgdG9vLiAgTm90ZQorICAgICAgICAgKiB0aGF0IHRoZSByZWZjb3VudCBwcm9iYWJseSB3aWxsIGhpdCAwIG5vdywgYW5kIGJlY2F1c2UgdGhpcworICAgICAgICAgKiB3ZWFrcmVmIHdhcyByZWFjaGFibGUgdG8gYmVnaW4gd2l0aCwgZ2MgZGlkbid0IGFscmVhZHkKKyAgICAgICAgICogYWRkIGl0IHRvIGl0cyBjb3VudCBvZiBmcmVlZCBvYmplY3RzLiAgRXhhbXBsZTogIGEgcmVhY2hhYmxlCisgICAgICAgICAqIHdlYWsgdmFsdWUgZGljdCBtYXBzIHNvbWUga2V5IHRvIHRoaXMgcmVhY2hhYmxlIHdlYWtyZWYuCisgICAgICAgICAqIFRoZSBjYWxsYmFjayByZW1vdmVzIHRoaXMga2V5LT53ZWFrcmVmIG1hcHBpbmcgZnJvbSB0aGUKKyAgICAgICAgICogZGljdCwgbGVhdmluZyBubyBvdGhlciByZWZlcmVuY2VzIHRvIHRoZSB3ZWFrcmVmIChleGNlcHRpbmcKKyAgICAgICAgICogb3VycykuCisgICAgICAgICAqLworICAgICAgICBQeV9ERUNSRUYob3ApOworICAgICAgICBpZiAod3JjYl90b19jYWxsLmdjLmdjX25leHQgPT0gZ2MpIHsKKyAgICAgICAgICAgIC8qIG9iamVjdCBpcyBzdGlsbCBhbGl2ZSAtLSBtb3ZlIGl0ICovCisgICAgICAgICAgICBnY19saXN0X21vdmUoZ2MsIG9sZCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgKytudW1fZnJlZWQ7CisgICAgfQogCi0JcmV0dXJuIG51bV9mcmVlZDsKKyAgICByZXR1cm4gbnVtX2ZyZWVkOwogfQogCiBzdGF0aWMgdm9pZAogZGVidWdfaW5zdGFuY2UoY2hhciAqbXNnLCBQeUluc3RhbmNlT2JqZWN0ICppbnN0KQogewotCWNoYXIgKmNuYW1lOwotCS8qIHNpbXBsZSB2ZXJzaW9uIG9mIGluc3RhbmNlX3JlcHIgKi8KLQlQeU9iamVjdCAqY2xhc3NuYW1lID0gaW5zdC0+aW5fY2xhc3MtPmNsX25hbWU7Ci0JaWYgKGNsYXNzbmFtZSAhPSBOVUxMICYmIFB5U3RyaW5nX0NoZWNrKGNsYXNzbmFtZSkpCi0JCWNuYW1lID0gUHlTdHJpbmdfQXNTdHJpbmcoY2xhc3NuYW1lKTsKLQllbHNlCi0JCWNuYW1lID0gIj8iOwotCVB5U3lzX1dyaXRlU3RkZXJyKCJnYzogJS4xMDBzIDwlLjEwMHMgaW5zdGFuY2UgYXQgJXA+XG4iLAotCQkJICBtc2csIGNuYW1lLCBpbnN0KTsKKyAgICBjaGFyICpjbmFtZTsKKyAgICAvKiBzaW1wbGUgdmVyc2lvbiBvZiBpbnN0YW5jZV9yZXByICovCisgICAgUHlPYmplY3QgKmNsYXNzbmFtZSA9IGluc3QtPmluX2NsYXNzLT5jbF9uYW1lOworICAgIGlmIChjbGFzc25hbWUgIT0gTlVMTCAmJiBQeVN0cmluZ19DaGVjayhjbGFzc25hbWUpKQorICAgICAgICBjbmFtZSA9IFB5U3RyaW5nX0FzU3RyaW5nKGNsYXNzbmFtZSk7CisgICAgZWxzZQorICAgICAgICBjbmFtZSA9ICI/IjsKKyAgICBQeVN5c19Xcml0ZVN0ZGVycigiZ2M6ICUuMTAwcyA8JS4xMDBzIGluc3RhbmNlIGF0ICVwPlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBtc2csIGNuYW1lLCBpbnN0KTsKIH0KIAogc3RhdGljIHZvaWQKIGRlYnVnX2N5Y2xlKGNoYXIgKm1zZywgUHlPYmplY3QgKm9wKQogewotCWlmICgoZGVidWcgJiBERUJVR19JTlNUQU5DRVMpICYmIFB5SW5zdGFuY2VfQ2hlY2sob3ApKSB7Ci0JCWRlYnVnX2luc3RhbmNlKG1zZywgKFB5SW5zdGFuY2VPYmplY3QgKilvcCk7Ci0JfQotCWVsc2UgaWYgKGRlYnVnICYgREVCVUdfT0JKRUNUUykgewotCQlQeVN5c19Xcml0ZVN0ZGVycigiZ2M6ICUuMTAwcyA8JS4xMDBzICVwPlxuIiwKLQkJCQkgIG1zZywgUHlfVFlQRShvcCktPnRwX25hbWUsIG9wKTsKLQl9CisgICAgaWYgKChkZWJ1ZyAmIERFQlVHX0lOU1RBTkNFUykgJiYgUHlJbnN0YW5jZV9DaGVjayhvcCkpIHsKKyAgICAgICAgZGVidWdfaW5zdGFuY2UobXNnLCAoUHlJbnN0YW5jZU9iamVjdCAqKW9wKTsKKyAgICB9CisgICAgZWxzZSBpZiAoZGVidWcgJiBERUJVR19PQkpFQ1RTKSB7CisgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCJnYzogJS4xMDBzIDwlLjEwMHMgJXA+XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtc2csIFB5X1RZUEUob3ApLT50cF9uYW1lLCBvcCk7CisgICAgfQogfQogCiAvKiBIYW5kbGUgdW5jb2xsZWN0YWJsZSBnYXJiYWdlIChjeWNsZXMgd2l0aCBmaW5hbGl6ZXJzLCBhbmQgc3R1ZmYgcmVhY2hhYmxlCkBAIC02NzEsNTYgKzY3MSw1NiBAQAogc3RhdGljIGludAogaGFuZGxlX2ZpbmFsaXplcnMoUHlHQ19IZWFkICpmaW5hbGl6ZXJzLCBQeUdDX0hlYWQgKm9sZCkKIHsKLQlQeUdDX0hlYWQgKmdjID0gZmluYWxpemVycy0+Z2MuZ2NfbmV4dDsKKyAgICBQeUdDX0hlYWQgKmdjID0gZmluYWxpemVycy0+Z2MuZ2NfbmV4dDsKIAotCWlmIChnYXJiYWdlID09IE5VTEwpIHsKLQkJZ2FyYmFnZSA9IFB5TGlzdF9OZXcoMCk7Ci0JCWlmIChnYXJiYWdlID09IE5VTEwpCi0JCQlQeV9GYXRhbEVycm9yKCJnYyBjb3VsZG4ndCBjcmVhdGUgZ2MuZ2FyYmFnZSBsaXN0Iik7Ci0JfQotCWZvciAoOyBnYyAhPSBmaW5hbGl6ZXJzOyBnYyA9IGdjLT5nYy5nY19uZXh0KSB7Ci0JCVB5T2JqZWN0ICpvcCA9IEZST01fR0MoZ2MpOworICAgIGlmIChnYXJiYWdlID09IE5VTEwpIHsKKyAgICAgICAgZ2FyYmFnZSA9IFB5TGlzdF9OZXcoMCk7CisgICAgICAgIGlmIChnYXJiYWdlID09IE5VTEwpCisgICAgICAgICAgICBQeV9GYXRhbEVycm9yKCJnYyBjb3VsZG4ndCBjcmVhdGUgZ2MuZ2FyYmFnZSBsaXN0Iik7CisgICAgfQorICAgIGZvciAoOyBnYyAhPSBmaW5hbGl6ZXJzOyBnYyA9IGdjLT5nYy5nY19uZXh0KSB7CisgICAgICAgIFB5T2JqZWN0ICpvcCA9IEZST01fR0MoZ2MpOwogCi0JCWlmICgoZGVidWcgJiBERUJVR19TQVZFQUxMKSB8fCBoYXNfZmluYWxpemVyKG9wKSkgewotCQkJaWYgKFB5TGlzdF9BcHBlbmQoZ2FyYmFnZSwgb3ApIDwgMCkKLQkJCQlyZXR1cm4gLTE7Ci0JCX0KLQl9CisgICAgICAgIGlmICgoZGVidWcgJiBERUJVR19TQVZFQUxMKSB8fCBoYXNfZmluYWxpemVyKG9wKSkgeworICAgICAgICAgICAgaWYgKFB5TGlzdF9BcHBlbmQoZ2FyYmFnZSwgb3ApIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CiAKLQlnY19saXN0X21lcmdlKGZpbmFsaXplcnMsIG9sZCk7Ci0JcmV0dXJuIDA7CisgICAgZ2NfbGlzdF9tZXJnZShmaW5hbGl6ZXJzLCBvbGQpOworICAgIHJldHVybiAwOwogfQogCi0vKiBCcmVhayByZWZlcmVuY2UgY3ljbGVzIGJ5IGNsZWFyaW5nIHRoZSBjb250YWluZXJzIGludm9sdmVkLglUaGlzIGlzCisvKiBCcmVhayByZWZlcmVuY2UgY3ljbGVzIGJ5IGNsZWFyaW5nIHRoZSBjb250YWluZXJzIGludm9sdmVkLiAgVGhpcyBpcwogICogdHJpY2t5IGJ1c2luZXNzIGFzIHRoZSBsaXN0cyBjYW4gYmUgY2hhbmdpbmcgYW5kIHdlIGRvbid0IGtub3cgd2hpY2gKICAqIG9iamVjdHMgbWF5IGJlIGZyZWVkLiAgSXQgaXMgcG9zc2libGUgSSBzY3Jld2VkIHNvbWV0aGluZyB1cCBoZXJlLgogICovCiBzdGF0aWMgdm9pZAogZGVsZXRlX2dhcmJhZ2UoUHlHQ19IZWFkICpjb2xsZWN0YWJsZSwgUHlHQ19IZWFkICpvbGQpCiB7Ci0JaW5xdWlyeSBjbGVhcjsKKyAgICBpbnF1aXJ5IGNsZWFyOwogCi0Jd2hpbGUgKCFnY19saXN0X2lzX2VtcHR5KGNvbGxlY3RhYmxlKSkgewotCQlQeUdDX0hlYWQgKmdjID0gY29sbGVjdGFibGUtPmdjLmdjX25leHQ7Ci0JCVB5T2JqZWN0ICpvcCA9IEZST01fR0MoZ2MpOworICAgIHdoaWxlICghZ2NfbGlzdF9pc19lbXB0eShjb2xsZWN0YWJsZSkpIHsKKyAgICAgICAgUHlHQ19IZWFkICpnYyA9IGNvbGxlY3RhYmxlLT5nYy5nY19uZXh0OworICAgICAgICBQeU9iamVjdCAqb3AgPSBGUk9NX0dDKGdjKTsKIAotCQlhc3NlcnQoSVNfVEVOVEFUSVZFTFlfVU5SRUFDSEFCTEUob3ApKTsKLQkJaWYgKGRlYnVnICYgREVCVUdfU0FWRUFMTCkgewotCQkJUHlMaXN0X0FwcGVuZChnYXJiYWdlLCBvcCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoKGNsZWFyID0gUHlfVFlQRShvcCktPnRwX2NsZWFyKSAhPSBOVUxMKSB7Ci0JCQkJUHlfSU5DUkVGKG9wKTsKLQkJCQljbGVhcihvcCk7Ci0JCQkJUHlfREVDUkVGKG9wKTsKLQkJCX0KLQkJfQotCQlpZiAoY29sbGVjdGFibGUtPmdjLmdjX25leHQgPT0gZ2MpIHsKLQkJCS8qIG9iamVjdCBpcyBzdGlsbCBhbGl2ZSwgbW92ZSBpdCwgaXQgbWF5IGRpZSBsYXRlciAqLwotCQkJZ2NfbGlzdF9tb3ZlKGdjLCBvbGQpOwotCQkJZ2MtPmdjLmdjX3JlZnMgPSBHQ19SRUFDSEFCTEU7Ci0JCX0KLQl9CisgICAgICAgIGFzc2VydChJU19URU5UQVRJVkVMWV9VTlJFQUNIQUJMRShvcCkpOworICAgICAgICBpZiAoZGVidWcgJiBERUJVR19TQVZFQUxMKSB7CisgICAgICAgICAgICBQeUxpc3RfQXBwZW5kKGdhcmJhZ2UsIG9wKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmICgoY2xlYXIgPSBQeV9UWVBFKG9wKS0+dHBfY2xlYXIpICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeV9JTkNSRUYob3ApOworICAgICAgICAgICAgICAgIGNsZWFyKG9wKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYob3ApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChjb2xsZWN0YWJsZS0+Z2MuZ2NfbmV4dCA9PSBnYykgeworICAgICAgICAgICAgLyogb2JqZWN0IGlzIHN0aWxsIGFsaXZlLCBtb3ZlIGl0LCBpdCBtYXkgZGllIGxhdGVyICovCisgICAgICAgICAgICBnY19saXN0X21vdmUoZ2MsIG9sZCk7CisgICAgICAgICAgICBnYy0+Z2MuZ2NfcmVmcyA9IEdDX1JFQUNIQUJMRTsKKyAgICAgICAgfQorICAgIH0KIH0KIAogLyogQ2xlYXIgYWxsIGZyZWUgbGlzdHMKQEAgLTczMSwzMSArNzMxLDMxIEBACiBzdGF0aWMgdm9pZAogY2xlYXJfZnJlZWxpc3RzKHZvaWQpCiB7Ci0JKHZvaWQpUHlNZXRob2RfQ2xlYXJGcmVlTGlzdCgpOwotCSh2b2lkKVB5RnJhbWVfQ2xlYXJGcmVlTGlzdCgpOwotCSh2b2lkKVB5Q0Z1bmN0aW9uX0NsZWFyRnJlZUxpc3QoKTsKLQkodm9pZClQeVR1cGxlX0NsZWFyRnJlZUxpc3QoKTsKLQkodm9pZClQeVVuaWNvZGVfQ2xlYXJGcmVlTGlzdCgpOwotCSh2b2lkKVB5SW50X0NsZWFyRnJlZUxpc3QoKTsKLQkodm9pZClQeUZsb2F0X0NsZWFyRnJlZUxpc3QoKTsKKyAgICAodm9pZClQeU1ldGhvZF9DbGVhckZyZWVMaXN0KCk7CisgICAgKHZvaWQpUHlGcmFtZV9DbGVhckZyZWVMaXN0KCk7CisgICAgKHZvaWQpUHlDRnVuY3Rpb25fQ2xlYXJGcmVlTGlzdCgpOworICAgICh2b2lkKVB5VHVwbGVfQ2xlYXJGcmVlTGlzdCgpOworICAgICh2b2lkKVB5VW5pY29kZV9DbGVhckZyZWVMaXN0KCk7CisgICAgKHZvaWQpUHlJbnRfQ2xlYXJGcmVlTGlzdCgpOworICAgICh2b2lkKVB5RmxvYXRfQ2xlYXJGcmVlTGlzdCgpOwogfQogCiBzdGF0aWMgZG91YmxlCiBnZXRfdGltZSh2b2lkKQogewotCWRvdWJsZSByZXN1bHQgPSAwOwotCWlmICh0bW9kICE9IE5VTEwpIHsKLQkJUHlPYmplY3QgKmYgPSBQeU9iamVjdF9DYWxsTWV0aG9kKHRtb2QsICJ0aW1lIiwgTlVMTCk7Ci0JCWlmIChmID09IE5VTEwpIHsKLQkJCVB5RXJyX0NsZWFyKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoUHlGbG9hdF9DaGVjayhmKSkKLQkJCQlyZXN1bHQgPSBQeUZsb2F0X0FzRG91YmxlKGYpOwotCQkJUHlfREVDUkVGKGYpOwotCQl9Ci0JfQotCXJldHVybiByZXN1bHQ7CisgICAgZG91YmxlIHJlc3VsdCA9IDA7CisgICAgaWYgKHRtb2QgIT0gTlVMTCkgeworICAgICAgICBQeU9iamVjdCAqZiA9IFB5T2JqZWN0X0NhbGxNZXRob2QodG1vZCwgInRpbWUiLCBOVUxMKTsKKyAgICAgICAgaWYgKGYgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmIChQeUZsb2F0X0NoZWNrKGYpKQorICAgICAgICAgICAgICAgIHJlc3VsdCA9IFB5RmxvYXRfQXNEb3VibGUoZik7CisgICAgICAgICAgICBQeV9ERUNSRUYoZik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogLyogVGhpcyBpcyB0aGUgbWFpbiBmdW5jdGlvbi4gIFJlYWQgdGhpcyB0byB1bmRlcnN0YW5kIGhvdyB0aGUKQEAgLTc2MywxNjkgKzc2MywxNjkgQEAKIHN0YXRpYyBQeV9zc2l6ZV90CiBjb2xsZWN0KGludCBnZW5lcmF0aW9uKQogewotCWludCBpOwotCVB5X3NzaXplX3QgbSA9IDA7IC8qICMgb2JqZWN0cyBjb2xsZWN0ZWQgKi8KLQlQeV9zc2l6ZV90IG4gPSAwOyAvKiAjIHVucmVhY2hhYmxlIG9iamVjdHMgdGhhdCBjb3VsZG4ndCBiZSBjb2xsZWN0ZWQgKi8KLQlQeUdDX0hlYWQgKnlvdW5nOyAvKiB0aGUgZ2VuZXJhdGlvbiB3ZSBhcmUgZXhhbWluaW5nICovCi0JUHlHQ19IZWFkICpvbGQ7IC8qIG5leHQgb2xkZXIgZ2VuZXJhdGlvbiAqLwotCVB5R0NfSGVhZCB1bnJlYWNoYWJsZTsgLyogbm9uLXByb2JsZW1hdGljIHVucmVhY2hhYmxlIHRyYXNoICovCi0JUHlHQ19IZWFkIGZpbmFsaXplcnM7ICAvKiBvYmplY3RzIHdpdGgsICYgcmVhY2hhYmxlIGZyb20sIF9fZGVsX18gKi8KLQlQeUdDX0hlYWQgKmdjOwotCWRvdWJsZSB0MSA9IDAuMDsKKyAgICBpbnQgaTsKKyAgICBQeV9zc2l6ZV90IG0gPSAwOyAvKiAjIG9iamVjdHMgY29sbGVjdGVkICovCisgICAgUHlfc3NpemVfdCBuID0gMDsgLyogIyB1bnJlYWNoYWJsZSBvYmplY3RzIHRoYXQgY291bGRuJ3QgYmUgY29sbGVjdGVkICovCisgICAgUHlHQ19IZWFkICp5b3VuZzsgLyogdGhlIGdlbmVyYXRpb24gd2UgYXJlIGV4YW1pbmluZyAqLworICAgIFB5R0NfSGVhZCAqb2xkOyAvKiBuZXh0IG9sZGVyIGdlbmVyYXRpb24gKi8KKyAgICBQeUdDX0hlYWQgdW5yZWFjaGFibGU7IC8qIG5vbi1wcm9ibGVtYXRpYyB1bnJlYWNoYWJsZSB0cmFzaCAqLworICAgIFB5R0NfSGVhZCBmaW5hbGl6ZXJzOyAgLyogb2JqZWN0cyB3aXRoLCAmIHJlYWNoYWJsZSBmcm9tLCBfX2RlbF9fICovCisgICAgUHlHQ19IZWFkICpnYzsKKyAgICBkb3VibGUgdDEgPSAwLjA7CiAKLQlpZiAoZGVsc3RyID09IE5VTEwpIHsKLQkJZGVsc3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19kZWxfXyIpOwotCQlpZiAoZGVsc3RyID09IE5VTEwpCi0JCQlQeV9GYXRhbEVycm9yKCJnYyBjb3VsZG4ndCBhbGxvY2F0ZSBcIl9fZGVsX19cIiIpOwotCX0KKyAgICBpZiAoZGVsc3RyID09IE5VTEwpIHsKKyAgICAgICAgZGVsc3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19kZWxfXyIpOworICAgICAgICBpZiAoZGVsc3RyID09IE5VTEwpCisgICAgICAgICAgICBQeV9GYXRhbEVycm9yKCJnYyBjb3VsZG4ndCBhbGxvY2F0ZSBcIl9fZGVsX19cIiIpOworICAgIH0KIAotCWlmIChkZWJ1ZyAmIERFQlVHX1NUQVRTKSB7Ci0JCVB5U3lzX1dyaXRlU3RkZXJyKCJnYzogY29sbGVjdGluZyBnZW5lcmF0aW9uICVkLi4uXG4iLAotCQkJCSAgZ2VuZXJhdGlvbik7Ci0JCVB5U3lzX1dyaXRlU3RkZXJyKCJnYzogb2JqZWN0cyBpbiBlYWNoIGdlbmVyYXRpb246Iik7Ci0JCWZvciAoaSA9IDA7IGkgPCBOVU1fR0VORVJBVElPTlM7IGkrKykKLQkJCVB5U3lzX1dyaXRlU3RkZXJyKCIgJSIgUFlfRk9STUFUX1NJWkVfVCAiZCIsCi0JCQkJCSAgZ2NfbGlzdF9zaXplKEdFTl9IRUFEKGkpKSk7Ci0JCXQxID0gZ2V0X3RpbWUoKTsKLQkJUHlTeXNfV3JpdGVTdGRlcnIoIlxuIik7Ci0JfQorICAgIGlmIChkZWJ1ZyAmIERFQlVHX1NUQVRTKSB7CisgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCJnYzogY29sbGVjdGluZyBnZW5lcmF0aW9uICVkLi4uXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0aW9uKTsKKyAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoImdjOiBvYmplY3RzIGluIGVhY2ggZ2VuZXJhdGlvbjoiKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IE5VTV9HRU5FUkFUSU9OUzsgaSsrKQorICAgICAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoIiAlIiBQWV9GT1JNQVRfU0laRV9UICJkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjX2xpc3Rfc2l6ZShHRU5fSEVBRChpKSkpOworICAgICAgICB0MSA9IGdldF90aW1lKCk7CisgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCJcbiIpOworICAgIH0KIAotCS8qIHVwZGF0ZSBjb2xsZWN0aW9uIGFuZCBhbGxvY2F0aW9uIGNvdW50ZXJzICovCi0JaWYgKGdlbmVyYXRpb24rMSA8IE5VTV9HRU5FUkFUSU9OUykKLQkJZ2VuZXJhdGlvbnNbZ2VuZXJhdGlvbisxXS5jb3VudCArPSAxOwotCWZvciAoaSA9IDA7IGkgPD0gZ2VuZXJhdGlvbjsgaSsrKQotCQlnZW5lcmF0aW9uc1tpXS5jb3VudCA9IDA7CisgICAgLyogdXBkYXRlIGNvbGxlY3Rpb24gYW5kIGFsbG9jYXRpb24gY291bnRlcnMgKi8KKyAgICBpZiAoZ2VuZXJhdGlvbisxIDwgTlVNX0dFTkVSQVRJT05TKQorICAgICAgICBnZW5lcmF0aW9uc1tnZW5lcmF0aW9uKzFdLmNvdW50ICs9IDE7CisgICAgZm9yIChpID0gMDsgaSA8PSBnZW5lcmF0aW9uOyBpKyspCisgICAgICAgIGdlbmVyYXRpb25zW2ldLmNvdW50ID0gMDsKIAotCS8qIG1lcmdlIHlvdW5nZXIgZ2VuZXJhdGlvbnMgd2l0aCBvbmUgd2UgYXJlIGN1cnJlbnRseSBjb2xsZWN0aW5nICovCi0JZm9yIChpID0gMDsgaSA8IGdlbmVyYXRpb247IGkrKykgewotCQlnY19saXN0X21lcmdlKEdFTl9IRUFEKGkpLCBHRU5fSEVBRChnZW5lcmF0aW9uKSk7Ci0JfQorICAgIC8qIG1lcmdlIHlvdW5nZXIgZ2VuZXJhdGlvbnMgd2l0aCBvbmUgd2UgYXJlIGN1cnJlbnRseSBjb2xsZWN0aW5nICovCisgICAgZm9yIChpID0gMDsgaSA8IGdlbmVyYXRpb247IGkrKykgeworICAgICAgICBnY19saXN0X21lcmdlKEdFTl9IRUFEKGkpLCBHRU5fSEVBRChnZW5lcmF0aW9uKSk7CisgICAgfQogCi0JLyogaGFuZHkgcmVmZXJlbmNlcyAqLwotCXlvdW5nID0gR0VOX0hFQUQoZ2VuZXJhdGlvbik7Ci0JaWYgKGdlbmVyYXRpb24gPCBOVU1fR0VORVJBVElPTlMtMSkKLQkJb2xkID0gR0VOX0hFQUQoZ2VuZXJhdGlvbisxKTsKLQllbHNlCi0JCW9sZCA9IHlvdW5nOworICAgIC8qIGhhbmR5IHJlZmVyZW5jZXMgKi8KKyAgICB5b3VuZyA9IEdFTl9IRUFEKGdlbmVyYXRpb24pOworICAgIGlmIChnZW5lcmF0aW9uIDwgTlVNX0dFTkVSQVRJT05TLTEpCisgICAgICAgIG9sZCA9IEdFTl9IRUFEKGdlbmVyYXRpb24rMSk7CisgICAgZWxzZQorICAgICAgICBvbGQgPSB5b3VuZzsKIAotCS8qIFVzaW5nIG9iX3JlZmNudCBhbmQgZ2NfcmVmcywgY2FsY3VsYXRlIHdoaWNoIG9iamVjdHMgaW4gdGhlCi0JICogY29udGFpbmVyIHNldCBhcmUgcmVhY2hhYmxlIGZyb20gb3V0c2lkZSB0aGUgc2V0IChpLmUuLCBoYXZlIGEKLQkgKiByZWZjb3VudCBncmVhdGVyIHRoYW4gMCB3aGVuIGFsbCB0aGUgcmVmZXJlbmNlcyB3aXRoaW4gdGhlCi0JICogc2V0IGFyZSB0YWtlbiBpbnRvIGFjY291bnQpLgotCSAqLwotCXVwZGF0ZV9yZWZzKHlvdW5nKTsKLQlzdWJ0cmFjdF9yZWZzKHlvdW5nKTsKKyAgICAvKiBVc2luZyBvYl9yZWZjbnQgYW5kIGdjX3JlZnMsIGNhbGN1bGF0ZSB3aGljaCBvYmplY3RzIGluIHRoZQorICAgICAqIGNvbnRhaW5lciBzZXQgYXJlIHJlYWNoYWJsZSBmcm9tIG91dHNpZGUgdGhlIHNldCAoaS5lLiwgaGF2ZSBhCisgICAgICogcmVmY291bnQgZ3JlYXRlciB0aGFuIDAgd2hlbiBhbGwgdGhlIHJlZmVyZW5jZXMgd2l0aGluIHRoZQorICAgICAqIHNldCBhcmUgdGFrZW4gaW50byBhY2NvdW50KS4KKyAgICAgKi8KKyAgICB1cGRhdGVfcmVmcyh5b3VuZyk7CisgICAgc3VidHJhY3RfcmVmcyh5b3VuZyk7CiAKLQkvKiBMZWF2ZSBldmVyeXRoaW5nIHJlYWNoYWJsZSBmcm9tIG91dHNpZGUgeW91bmcgaW4geW91bmcsIGFuZCBtb3ZlCi0JICogZXZlcnl0aGluZyBlbHNlIChpbiB5b3VuZykgdG8gdW5yZWFjaGFibGUuCi0JICogTk9URTogIFRoaXMgdXNlZCB0byBtb3ZlIHRoZSByZWFjaGFibGUgb2JqZWN0cyBpbnRvIGEgcmVhY2hhYmxlCi0JICogc2V0IGluc3RlYWQuICBCdXQgbW9zdCB0aGluZ3MgdXN1YWxseSB0dXJuIG91dCB0byBiZSByZWFjaGFibGUsCi0JICogc28gaXQncyBtb3JlIGVmZmljaWVudCB0byBtb3ZlIHRoZSB1bnJlYWNoYWJsZSB0aGluZ3MuCi0JICovCi0JZ2NfbGlzdF9pbml0KCZ1bnJlYWNoYWJsZSk7Ci0JbW92ZV91bnJlYWNoYWJsZSh5b3VuZywgJnVucmVhY2hhYmxlKTsKKyAgICAvKiBMZWF2ZSBldmVyeXRoaW5nIHJlYWNoYWJsZSBmcm9tIG91dHNpZGUgeW91bmcgaW4geW91bmcsIGFuZCBtb3ZlCisgICAgICogZXZlcnl0aGluZyBlbHNlIChpbiB5b3VuZykgdG8gdW5yZWFjaGFibGUuCisgICAgICogTk9URTogIFRoaXMgdXNlZCB0byBtb3ZlIHRoZSByZWFjaGFibGUgb2JqZWN0cyBpbnRvIGEgcmVhY2hhYmxlCisgICAgICogc2V0IGluc3RlYWQuICBCdXQgbW9zdCB0aGluZ3MgdXN1YWxseSB0dXJuIG91dCB0byBiZSByZWFjaGFibGUsCisgICAgICogc28gaXQncyBtb3JlIGVmZmljaWVudCB0byBtb3ZlIHRoZSB1bnJlYWNoYWJsZSB0aGluZ3MuCisgICAgICovCisgICAgZ2NfbGlzdF9pbml0KCZ1bnJlYWNoYWJsZSk7CisgICAgbW92ZV91bnJlYWNoYWJsZSh5b3VuZywgJnVucmVhY2hhYmxlKTsKIAotCS8qIE1vdmUgcmVhY2hhYmxlIG9iamVjdHMgdG8gbmV4dCBnZW5lcmF0aW9uLiAqLwotCWlmICh5b3VuZyAhPSBvbGQpCi0JCWdjX2xpc3RfbWVyZ2UoeW91bmcsIG9sZCk7CisgICAgLyogTW92ZSByZWFjaGFibGUgb2JqZWN0cyB0byBuZXh0IGdlbmVyYXRpb24uICovCisgICAgaWYgKHlvdW5nICE9IG9sZCkKKyAgICAgICAgZ2NfbGlzdF9tZXJnZSh5b3VuZywgb2xkKTsKIAotCS8qIEFsbCBvYmplY3RzIGluIHVucmVhY2hhYmxlIGFyZSB0cmFzaCwgYnV0IG9iamVjdHMgcmVhY2hhYmxlIGZyb20KLQkgKiBmaW5hbGl6ZXJzIGNhbid0IHNhZmVseSBiZSBkZWxldGVkLiAgUHl0aG9uIHByb2dyYW1tZXJzIHNob3VsZCB0YWtlCi0JICogY2FyZSBub3QgdG8gY3JlYXRlIHN1Y2ggdGhpbmdzLiAgRm9yIFB5dGhvbiwgZmluYWxpemVycyBtZWFucwotCSAqIGluc3RhbmNlIG9iamVjdHMgd2l0aCBfX2RlbF9fIG1ldGhvZHMuICBXZWFrcmVmcyB3aXRoIGNhbGxiYWNrcwotCSAqIGNhbiBhbHNvIGNhbGwgYXJiaXRyYXJ5IFB5dGhvbiBjb2RlIGJ1dCB0aGV5IHdpbGwgYmUgZGVhbHQgd2l0aCBieQotCSAqIGhhbmRsZV93ZWFrcmVmcygpLgotIAkgKi8KLQlnY19saXN0X2luaXQoJmZpbmFsaXplcnMpOwotCW1vdmVfZmluYWxpemVycygmdW5yZWFjaGFibGUsICZmaW5hbGl6ZXJzKTsKLQkvKiBmaW5hbGl6ZXJzIGNvbnRhaW5zIHRoZSB1bnJlYWNoYWJsZSBvYmplY3RzIHdpdGggYSBmaW5hbGl6ZXI7Ci0JICogdW5yZWFjaGFibGUgb2JqZWN0cyByZWFjaGFibGUgKmZyb20qIHRob3NlIGFyZSBhbHNvIHVuY29sbGVjdGFibGUsCi0JICogYW5kIHdlIG1vdmUgdGhvc2UgaW50byB0aGUgZmluYWxpemVycyBsaXN0IHRvby4KLQkgKi8KLQltb3ZlX2ZpbmFsaXplcl9yZWFjaGFibGUoJmZpbmFsaXplcnMpOworICAgIC8qIEFsbCBvYmplY3RzIGluIHVucmVhY2hhYmxlIGFyZSB0cmFzaCwgYnV0IG9iamVjdHMgcmVhY2hhYmxlIGZyb20KKyAgICAgKiBmaW5hbGl6ZXJzIGNhbid0IHNhZmVseSBiZSBkZWxldGVkLiAgUHl0aG9uIHByb2dyYW1tZXJzIHNob3VsZCB0YWtlCisgICAgICogY2FyZSBub3QgdG8gY3JlYXRlIHN1Y2ggdGhpbmdzLiAgRm9yIFB5dGhvbiwgZmluYWxpemVycyBtZWFucworICAgICAqIGluc3RhbmNlIG9iamVjdHMgd2l0aCBfX2RlbF9fIG1ldGhvZHMuICBXZWFrcmVmcyB3aXRoIGNhbGxiYWNrcworICAgICAqIGNhbiBhbHNvIGNhbGwgYXJiaXRyYXJ5IFB5dGhvbiBjb2RlIGJ1dCB0aGV5IHdpbGwgYmUgZGVhbHQgd2l0aCBieQorICAgICAqIGhhbmRsZV93ZWFrcmVmcygpLgorICAgICAqLworICAgIGdjX2xpc3RfaW5pdCgmZmluYWxpemVycyk7CisgICAgbW92ZV9maW5hbGl6ZXJzKCZ1bnJlYWNoYWJsZSwgJmZpbmFsaXplcnMpOworICAgIC8qIGZpbmFsaXplcnMgY29udGFpbnMgdGhlIHVucmVhY2hhYmxlIG9iamVjdHMgd2l0aCBhIGZpbmFsaXplcjsKKyAgICAgKiB1bnJlYWNoYWJsZSBvYmplY3RzIHJlYWNoYWJsZSAqZnJvbSogdGhvc2UgYXJlIGFsc28gdW5jb2xsZWN0YWJsZSwKKyAgICAgKiBhbmQgd2UgbW92ZSB0aG9zZSBpbnRvIHRoZSBmaW5hbGl6ZXJzIGxpc3QgdG9vLgorICAgICAqLworICAgIG1vdmVfZmluYWxpemVyX3JlYWNoYWJsZSgmZmluYWxpemVycyk7CiAKLQkvKiBDb2xsZWN0IHN0YXRpc3RpY3Mgb24gY29sbGVjdGFibGUgb2JqZWN0cyBmb3VuZCBhbmQgcHJpbnQKLQkgKiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uCi0JICovCi0JZm9yIChnYyA9IHVucmVhY2hhYmxlLmdjLmdjX25leHQ7IGdjICE9ICZ1bnJlYWNoYWJsZTsKLQkJCWdjID0gZ2MtPmdjLmdjX25leHQpIHsKLQkJbSsrOwotCQlpZiAoZGVidWcgJiBERUJVR19DT0xMRUNUQUJMRSkgewotCQkJZGVidWdfY3ljbGUoImNvbGxlY3RhYmxlIiwgRlJPTV9HQyhnYykpOwotCQl9Ci0JfQorICAgIC8qIENvbGxlY3Qgc3RhdGlzdGljcyBvbiBjb2xsZWN0YWJsZSBvYmplY3RzIGZvdW5kIGFuZCBwcmludAorICAgICAqIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4KKyAgICAgKi8KKyAgICBmb3IgKGdjID0gdW5yZWFjaGFibGUuZ2MuZ2NfbmV4dDsgZ2MgIT0gJnVucmVhY2hhYmxlOworICAgICAgICAgICAgICAgICAgICBnYyA9IGdjLT5nYy5nY19uZXh0KSB7CisgICAgICAgIG0rKzsKKyAgICAgICAgaWYgKGRlYnVnICYgREVCVUdfQ09MTEVDVEFCTEUpIHsKKyAgICAgICAgICAgIGRlYnVnX2N5Y2xlKCJjb2xsZWN0YWJsZSIsIEZST01fR0MoZ2MpKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qIENsZWFyIHdlYWtyZWZzIGFuZCBpbnZva2UgY2FsbGJhY2tzIGFzIG5lY2Vzc2FyeS4gKi8KLQltICs9IGhhbmRsZV93ZWFrcmVmcygmdW5yZWFjaGFibGUsIG9sZCk7CisgICAgLyogQ2xlYXIgd2Vha3JlZnMgYW5kIGludm9rZSBjYWxsYmFja3MgYXMgbmVjZXNzYXJ5LiAqLworICAgIG0gKz0gaGFuZGxlX3dlYWtyZWZzKCZ1bnJlYWNoYWJsZSwgb2xkKTsKIAotCS8qIENhbGwgdHBfY2xlYXIgb24gb2JqZWN0cyBpbiB0aGUgdW5yZWFjaGFibGUgc2V0LiAgVGhpcyB3aWxsIGNhdXNlCi0JICogdGhlIHJlZmVyZW5jZSBjeWNsZXMgdG8gYmUgYnJva2VuLiAgSXQgbWF5IGFsc28gY2F1c2Ugc29tZSBvYmplY3RzCi0JICogaW4gZmluYWxpemVycyB0byBiZSBmcmVlZC4KLQkgKi8KLQlkZWxldGVfZ2FyYmFnZSgmdW5yZWFjaGFibGUsIG9sZCk7CisgICAgLyogQ2FsbCB0cF9jbGVhciBvbiBvYmplY3RzIGluIHRoZSB1bnJlYWNoYWJsZSBzZXQuICBUaGlzIHdpbGwgY2F1c2UKKyAgICAgKiB0aGUgcmVmZXJlbmNlIGN5Y2xlcyB0byBiZSBicm9rZW4uICBJdCBtYXkgYWxzbyBjYXVzZSBzb21lIG9iamVjdHMKKyAgICAgKiBpbiBmaW5hbGl6ZXJzIHRvIGJlIGZyZWVkLgorICAgICAqLworICAgIGRlbGV0ZV9nYXJiYWdlKCZ1bnJlYWNoYWJsZSwgb2xkKTsKIAotCS8qIENvbGxlY3Qgc3RhdGlzdGljcyBvbiB1bmNvbGxlY3RhYmxlIG9iamVjdHMgZm91bmQgYW5kIHByaW50Ci0JICogZGVidWdnaW5nIGluZm9ybWF0aW9uLiAqLwotCWZvciAoZ2MgPSBmaW5hbGl6ZXJzLmdjLmdjX25leHQ7Ci0JICAgICBnYyAhPSAmZmluYWxpemVyczsKLQkgICAgIGdjID0gZ2MtPmdjLmdjX25leHQpIHsKLQkJbisrOwotCQlpZiAoZGVidWcgJiBERUJVR19VTkNPTExFQ1RBQkxFKQotCQkJZGVidWdfY3ljbGUoInVuY29sbGVjdGFibGUiLCBGUk9NX0dDKGdjKSk7Ci0JfQotCWlmIChkZWJ1ZyAmIERFQlVHX1NUQVRTKSB7Ci0JCWRvdWJsZSB0MiA9IGdldF90aW1lKCk7Ci0JCWlmIChtID09IDAgJiYgbiA9PSAwKQotCQkJUHlTeXNfV3JpdGVTdGRlcnIoImdjOiBkb25lIik7Ci0JCWVsc2UKLQkJCVB5U3lzX1dyaXRlU3RkZXJyKAotCQkJICAgICJnYzogZG9uZSwgIgotCQkJICAgICIlIiBQWV9GT1JNQVRfU0laRV9UICJkIHVucmVhY2hhYmxlLCAiCi0JCQkgICAgIiUiIFBZX0ZPUk1BVF9TSVpFX1QgImQgdW5jb2xsZWN0YWJsZSIsCi0JCQkgICAgbittLCBuKTsKLQkJaWYgKHQxICYmIHQyKSB7Ci0JCQlQeVN5c19Xcml0ZVN0ZGVycigiLCAlLjRmcyBlbGFwc2VkIiwgdDItdDEpOwotCQl9Ci0JCVB5U3lzX1dyaXRlU3RkZXJyKCIuXG4iKTsKLQl9CisgICAgLyogQ29sbGVjdCBzdGF0aXN0aWNzIG9uIHVuY29sbGVjdGFibGUgb2JqZWN0cyBmb3VuZCBhbmQgcHJpbnQKKyAgICAgKiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICovCisgICAgZm9yIChnYyA9IGZpbmFsaXplcnMuZ2MuZ2NfbmV4dDsKKyAgICAgICAgIGdjICE9ICZmaW5hbGl6ZXJzOworICAgICAgICAgZ2MgPSBnYy0+Z2MuZ2NfbmV4dCkgeworICAgICAgICBuKys7CisgICAgICAgIGlmIChkZWJ1ZyAmIERFQlVHX1VOQ09MTEVDVEFCTEUpCisgICAgICAgICAgICBkZWJ1Z19jeWNsZSgidW5jb2xsZWN0YWJsZSIsIEZST01fR0MoZ2MpKTsKKyAgICB9CisgICAgaWYgKGRlYnVnICYgREVCVUdfU1RBVFMpIHsKKyAgICAgICAgZG91YmxlIHQyID0gZ2V0X3RpbWUoKTsKKyAgICAgICAgaWYgKG0gPT0gMCAmJiBuID09IDApCisgICAgICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigiZ2M6IGRvbmUiKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoCisgICAgICAgICAgICAgICAgImdjOiBkb25lLCAiCisgICAgICAgICAgICAgICAgIiUiIFBZX0ZPUk1BVF9TSVpFX1QgImQgdW5yZWFjaGFibGUsICIKKyAgICAgICAgICAgICAgICAiJSIgUFlfRk9STUFUX1NJWkVfVCAiZCB1bmNvbGxlY3RhYmxlIiwKKyAgICAgICAgICAgICAgICBuK20sIG4pOworICAgICAgICBpZiAodDEgJiYgdDIpIHsKKyAgICAgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCIsICUuNGZzIGVsYXBzZWQiLCB0Mi10MSk7CisgICAgICAgIH0KKyAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoIi5cbiIpOworICAgIH0KIAotCS8qIEFwcGVuZCBpbnN0YW5jZXMgaW4gdGhlIHVuY29sbGVjdGFibGUgc2V0IHRvIGEgUHl0aG9uCi0JICogcmVhY2hhYmxlIGxpc3Qgb2YgZ2FyYmFnZS4gIFRoZSBwcm9ncmFtbWVyIGhhcyB0byBkZWFsIHdpdGgKLQkgKiB0aGlzIGlmIHRoZXkgaW5zaXN0IG9uIGNyZWF0aW5nIHRoaXMgdHlwZSBvZiBzdHJ1Y3R1cmUuCi0JICovCi0JKHZvaWQpaGFuZGxlX2ZpbmFsaXplcnMoJmZpbmFsaXplcnMsIG9sZCk7CisgICAgLyogQXBwZW5kIGluc3RhbmNlcyBpbiB0aGUgdW5jb2xsZWN0YWJsZSBzZXQgdG8gYSBQeXRob24KKyAgICAgKiByZWFjaGFibGUgbGlzdCBvZiBnYXJiYWdlLiAgVGhlIHByb2dyYW1tZXIgaGFzIHRvIGRlYWwgd2l0aAorICAgICAqIHRoaXMgaWYgdGhleSBpbnNpc3Qgb24gY3JlYXRpbmcgdGhpcyB0eXBlIG9mIHN0cnVjdHVyZS4KKyAgICAgKi8KKyAgICAodm9pZCloYW5kbGVfZmluYWxpemVycygmZmluYWxpemVycywgb2xkKTsKIAotCS8qIENsZWFyIGZyZWUgbGlzdCBvbmx5IGR1cmluZyB0aGUgY29sbGVjdGlvbiBvZiB0aGUgaGlnZXN0Ci0JICogZ2VuZXJhdGlvbiAqLwotCWlmIChnZW5lcmF0aW9uID09IE5VTV9HRU5FUkFUSU9OUy0xKSB7Ci0JCWNsZWFyX2ZyZWVsaXN0cygpOwotCX0KKyAgICAvKiBDbGVhciBmcmVlIGxpc3Qgb25seSBkdXJpbmcgdGhlIGNvbGxlY3Rpb24gb2YgdGhlIGhpZ2VzdAorICAgICAqIGdlbmVyYXRpb24gKi8KKyAgICBpZiAoZ2VuZXJhdGlvbiA9PSBOVU1fR0VORVJBVElPTlMtMSkgeworICAgICAgICBjbGVhcl9mcmVlbGlzdHMoKTsKKyAgICB9CiAKLQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkgewotCQlpZiAoZ2Nfc3RyID09IE5VTEwpCi0JCQlnY19zdHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCJnYXJiYWdlIGNvbGxlY3Rpb24iKTsKLQkJUHlFcnJfV3JpdGVVbnJhaXNhYmxlKGdjX3N0cik7Ci0JCVB5X0ZhdGFsRXJyb3IoInVuZXhwZWN0ZWQgZXhjZXB0aW9uIGR1cmluZyBnYXJiYWdlIGNvbGxlY3Rpb24iKTsKLQl9Ci0JcmV0dXJuIG4rbTsKKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICBpZiAoZ2Nfc3RyID09IE5VTEwpCisgICAgICAgICAgICBnY19zdHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCJnYXJiYWdlIGNvbGxlY3Rpb24iKTsKKyAgICAgICAgUHlFcnJfV3JpdGVVbnJhaXNhYmxlKGdjX3N0cik7CisgICAgICAgIFB5X0ZhdGFsRXJyb3IoInVuZXhwZWN0ZWQgZXhjZXB0aW9uIGR1cmluZyBnYXJiYWdlIGNvbGxlY3Rpb24iKTsKKyAgICB9CisgICAgcmV0dXJuIG4rbTsKIH0KIAogc3RhdGljIFB5X3NzaXplX3QKIGNvbGxlY3RfZ2VuZXJhdGlvbnModm9pZCkKIHsKLQlpbnQgaTsKLQlQeV9zc2l6ZV90IG4gPSAwOworICAgIGludCBpOworICAgIFB5X3NzaXplX3QgbiA9IDA7CiAKLQkvKiBGaW5kIHRoZSBvbGRlc3QgZ2VuZXJhdGlvbiAoaGlnZXN0IG51bWJlcmVkKSB3aGVyZSB0aGUgY291bnQKLQkgKiBleGNlZWRzIHRoZSB0aHJlc2hvbGQuICBPYmplY3RzIGluIHRoZSB0aGF0IGdlbmVyYXRpb24gYW5kCi0JICogZ2VuZXJhdGlvbnMgeW91bmdlciB0aGFuIGl0IHdpbGwgYmUgY29sbGVjdGVkLiAqLwotCWZvciAoaSA9IE5VTV9HRU5FUkFUSU9OUy0xOyBpID49IDA7IGktLSkgewotCQlpZiAoZ2VuZXJhdGlvbnNbaV0uY291bnQgPiBnZW5lcmF0aW9uc1tpXS50aHJlc2hvbGQpIHsKLQkJCW4gPSBjb2xsZWN0KGkpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JcmV0dXJuIG47CisgICAgLyogRmluZCB0aGUgb2xkZXN0IGdlbmVyYXRpb24gKGhpZ2VzdCBudW1iZXJlZCkgd2hlcmUgdGhlIGNvdW50CisgICAgICogZXhjZWVkcyB0aGUgdGhyZXNob2xkLiAgT2JqZWN0cyBpbiB0aGUgdGhhdCBnZW5lcmF0aW9uIGFuZAorICAgICAqIGdlbmVyYXRpb25zIHlvdW5nZXIgdGhhbiBpdCB3aWxsIGJlIGNvbGxlY3RlZC4gKi8KKyAgICBmb3IgKGkgPSBOVU1fR0VORVJBVElPTlMtMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgaWYgKGdlbmVyYXRpb25zW2ldLmNvdW50ID4gZ2VuZXJhdGlvbnNbaV0udGhyZXNob2xkKSB7CisgICAgICAgICAgICBuID0gY29sbGVjdChpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBuOwogfQogCiBQeURvY19TVFJWQVIoZ2NfZW5hYmxlX19kb2NfXywKQEAgLTkzNiw5ICs5MzYsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdjX2VuYWJsZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm5vYXJncykKIHsKLQllbmFibGVkID0gMTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZW5hYmxlZCA9IDE7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBQeURvY19TVFJWQVIoZ2NfZGlzYWJsZV9fZG9jX18sCkBAIC05NDksOSArOTQ5LDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnY19kaXNhYmxlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqbm9hcmdzKQogewotCWVuYWJsZWQgPSAwOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBlbmFibGVkID0gMDsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIFB5RG9jX1NUUlZBUihnY19pc2VuYWJsZWRfX2RvY19fLApAQCAtOTYyLDcgKzk2Miw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2NfaXNlbmFibGVkKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqbm9hcmdzKQogewotCXJldHVybiBQeUJvb2xfRnJvbUxvbmcoKGxvbmcpZW5hYmxlZCk7CisgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygobG9uZyllbmFibGVkKTsKIH0KIAogUHlEb2NfU1RSVkFSKGdjX2NvbGxlY3RfX2RvY19fLApAQCAtOTc2LDI3ICs5NzYsMjcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnY19jb2xsZWN0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3cykKIHsKLQlzdGF0aWMgY2hhciAqa2V5d29yZHNbXSA9IHsiZ2VuZXJhdGlvbiIsIE5VTEx9OwotCWludCBnZW5hcmcgPSBOVU1fR0VORVJBVElPTlMgLSAxOwotCVB5X3NzaXplX3QgbjsKKyAgICBzdGF0aWMgY2hhciAqa2V5d29yZHNbXSA9IHsiZ2VuZXJhdGlvbiIsIE5VTEx9OworICAgIGludCBnZW5hcmcgPSBOVU1fR0VORVJBVElPTlMgLSAxOworICAgIFB5X3NzaXplX3QgbjsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3cywgInxpIiwga2V5d29yZHMsICZnZW5hcmcpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd3MsICJ8aSIsIGtleXdvcmRzLCAmZ2VuYXJnKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQllbHNlIGlmIChnZW5hcmcgPCAwIHx8IGdlbmFyZyA+PSBOVU1fR0VORVJBVElPTlMpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJpbnZhbGlkIGdlbmVyYXRpb24iKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGVsc2UgaWYgKGdlbmFyZyA8IDAgfHwgZ2VuYXJnID49IE5VTV9HRU5FUkFUSU9OUykgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImludmFsaWQgZ2VuZXJhdGlvbiIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlpZiAoY29sbGVjdGluZykKLQkJbiA9IDA7IC8qIGFscmVhZHkgY29sbGVjdGluZywgZG9uJ3QgZG8gYW55dGhpbmcgKi8KLQllbHNlIHsKLQkJY29sbGVjdGluZyA9IDE7Ci0JCW4gPSBjb2xsZWN0KGdlbmFyZyk7Ci0JCWNvbGxlY3RpbmcgPSAwOwotCX0KKyAgICBpZiAoY29sbGVjdGluZykKKyAgICAgICAgbiA9IDA7IC8qIGFscmVhZHkgY29sbGVjdGluZywgZG9uJ3QgZG8gYW55dGhpbmcgKi8KKyAgICBlbHNlIHsKKyAgICAgICAgY29sbGVjdGluZyA9IDE7CisgICAgICAgIG4gPSBjb2xsZWN0KGdlbmFyZyk7CisgICAgICAgIGNvbGxlY3RpbmcgPSAwOworICAgIH0KIAotCXJldHVybiBQeUludF9Gcm9tU3NpemVfdChuKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbVNzaXplX3Qobik7CiB9CiAKIFB5RG9jX1NUUlZBUihnY19zZXRfZGVidWdfX2RvY19fLApAQCAtMTAxOCwxMSArMTAxOCwxMSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdjX3NldF9kZWJ1ZyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOnNldF9kZWJ1ZyIsICZkZWJ1ZykpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpzZXRfZGVidWciLCAmZGVidWcpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIFB5RG9jX1NUUlZBUihnY19nZXRfZGVidWdfX2RvY19fLApAQCAtMTAzMyw3ICsxMDMzLDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnY19nZXRfZGVidWcoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpub2FyZ3MpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLCBkZWJ1Zyk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLCBkZWJ1Zyk7CiB9CiAKIFB5RG9jX1NUUlZBUihnY19zZXRfdGhyZXNoX19kb2NfXywKQEAgLTEwNDUsMTkgKzEwNDUsMTkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnY19zZXRfdGhyZXNoKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgaTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIml8aWk6c2V0X3RocmVzaG9sZCIsCi0JCQkgICAgICAmZ2VuZXJhdGlvbnNbMF0udGhyZXNob2xkLAotCQkJICAgICAgJmdlbmVyYXRpb25zWzFdLnRocmVzaG9sZCwKLQkJCSAgICAgICZnZW5lcmF0aW9uc1syXS50aHJlc2hvbGQpKQotCQlyZXR1cm4gTlVMTDsKLQlmb3IgKGkgPSAyOyBpIDwgTlVNX0dFTkVSQVRJT05TOyBpKyspIHsKLSAJCS8qIGdlbmVyYXRpb25zIGhpZ2hlciB0aGFuIDIgZ2V0IHRoZSBzYW1lIHRocmVzaG9sZCAqLwotCQlnZW5lcmF0aW9uc1tpXS50aHJlc2hvbGQgPSBnZW5lcmF0aW9uc1syXS50aHJlc2hvbGQ7Ci0JfQorICAgIGludCBpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaXxpaTpzZXRfdGhyZXNob2xkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmdlbmVyYXRpb25zWzBdLnRocmVzaG9sZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmdlbmVyYXRpb25zWzFdLnRocmVzaG9sZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmdlbmVyYXRpb25zWzJdLnRocmVzaG9sZCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGZvciAoaSA9IDI7IGkgPCBOVU1fR0VORVJBVElPTlM7IGkrKykgeworICAgICAgICAvKiBnZW5lcmF0aW9ucyBoaWdoZXIgdGhhbiAyIGdldCB0aGUgc2FtZSB0aHJlc2hvbGQgKi8KKyAgICAgICAgZ2VuZXJhdGlvbnNbaV0udGhyZXNob2xkID0gZ2VuZXJhdGlvbnNbMl0udGhyZXNob2xkOworICAgIH0KIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIFB5RG9jX1NUUlZBUihnY19nZXRfdGhyZXNoX19kb2NfXywKQEAgLTEwNjgsMTAgKzEwNjgsMTAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnY19nZXRfdGhyZXNoKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqbm9hcmdzKQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKCIoaWlpKSIsCi0JCQkgICAgIGdlbmVyYXRpb25zWzBdLnRocmVzaG9sZCwKLQkJCSAgICAgZ2VuZXJhdGlvbnNbMV0udGhyZXNob2xkLAotCQkJICAgICBnZW5lcmF0aW9uc1syXS50aHJlc2hvbGQpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIoaWlpKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGlvbnNbMF0udGhyZXNob2xkLAorICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRpb25zWzFdLnRocmVzaG9sZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0aW9uc1syXS50aHJlc2hvbGQpOwogfQogCiBQeURvY19TVFJWQVIoZ2NfZ2V0X2NvdW50X19kb2NfXywKQEAgLTEwODIsMzkgKzEwODIsMzkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnY19nZXRfY291bnQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpub2FyZ3MpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihpaWkpIiwKLQkJCSAgICAgZ2VuZXJhdGlvbnNbMF0uY291bnQsCi0JCQkgICAgIGdlbmVyYXRpb25zWzFdLmNvdW50LAotCQkJICAgICBnZW5lcmF0aW9uc1syXS5jb3VudCk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihpaWkpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0aW9uc1swXS5jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0aW9uc1sxXS5jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0aW9uc1syXS5jb3VudCk7CiB9CiAKIHN0YXRpYyBpbnQKIHJlZmVycmVyc3Zpc2l0KFB5T2JqZWN0KiBvYmosIFB5T2JqZWN0ICpvYmpzKQogewotCVB5X3NzaXplX3QgaTsKLQlmb3IgKGkgPSAwOyBpIDwgUHlUdXBsZV9HRVRfU0laRShvYmpzKTsgaSsrKQotCQlpZiAoUHlUdXBsZV9HRVRfSVRFTShvYmpzLCBpKSA9PSBvYmopCi0JCQlyZXR1cm4gMTsKLQlyZXR1cm4gMDsKKyAgICBQeV9zc2l6ZV90IGk7CisgICAgZm9yIChpID0gMDsgaSA8IFB5VHVwbGVfR0VUX1NJWkUob2Jqcyk7IGkrKykKKyAgICAgICAgaWYgKFB5VHVwbGVfR0VUX0lURU0ob2JqcywgaSkgPT0gb2JqKQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIGdjX3JlZmVycmVyc19mb3IoUHlPYmplY3QgKm9ianMsIFB5R0NfSGVhZCAqbGlzdCwgUHlPYmplY3QgKnJlc3VsdGxpc3QpCiB7Ci0JUHlHQ19IZWFkICpnYzsKLQlQeU9iamVjdCAqb2JqOwotCXRyYXZlcnNlcHJvYyB0cmF2ZXJzZTsKLQlmb3IgKGdjID0gbGlzdC0+Z2MuZ2NfbmV4dDsgZ2MgIT0gbGlzdDsgZ2MgPSBnYy0+Z2MuZ2NfbmV4dCkgewotCQlvYmogPSBGUk9NX0dDKGdjKTsKLQkJdHJhdmVyc2UgPSBQeV9UWVBFKG9iaiktPnRwX3RyYXZlcnNlOwotCQlpZiAob2JqID09IG9ianMgfHwgb2JqID09IHJlc3VsdGxpc3QpCi0JCQljb250aW51ZTsKLQkJaWYgKHRyYXZlcnNlKG9iaiwgKHZpc2l0cHJvYylyZWZlcnJlcnN2aXNpdCwgb2JqcykpIHsKLQkJCWlmIChQeUxpc3RfQXBwZW5kKHJlc3VsdGxpc3QsIG9iaikgPCAwKQotCQkJCXJldHVybiAwOyAvKiBlcnJvciAqLwotCQl9Ci0JfQotCXJldHVybiAxOyAvKiBubyBlcnJvciAqLworICAgIFB5R0NfSGVhZCAqZ2M7CisgICAgUHlPYmplY3QgKm9iajsKKyAgICB0cmF2ZXJzZXByb2MgdHJhdmVyc2U7CisgICAgZm9yIChnYyA9IGxpc3QtPmdjLmdjX25leHQ7IGdjICE9IGxpc3Q7IGdjID0gZ2MtPmdjLmdjX25leHQpIHsKKyAgICAgICAgb2JqID0gRlJPTV9HQyhnYyk7CisgICAgICAgIHRyYXZlcnNlID0gUHlfVFlQRShvYmopLT50cF90cmF2ZXJzZTsKKyAgICAgICAgaWYgKG9iaiA9PSBvYmpzIHx8IG9iaiA9PSByZXN1bHRsaXN0KQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmICh0cmF2ZXJzZShvYmosICh2aXNpdHByb2MpcmVmZXJyZXJzdmlzaXQsIG9ianMpKSB7CisgICAgICAgICAgICBpZiAoUHlMaXN0X0FwcGVuZChyZXN1bHRsaXN0LCBvYmopIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsgLyogZXJyb3IgKi8KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMTsgLyogbm8gZXJyb3IgKi8KIH0KIAogUHlEb2NfU1RSVkFSKGdjX2dldF9yZWZlcnJlcnNfX2RvY19fLApAQCAtMTEyNCwyNCArMTEyNCwyNCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdjX2dldF9yZWZlcnJlcnMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBpOwotCVB5T2JqZWN0ICpyZXN1bHQgPSBQeUxpc3RfTmV3KDApOwotCWlmICghcmVzdWx0KSByZXR1cm4gTlVMTDsKKyAgICBpbnQgaTsKKyAgICBQeU9iamVjdCAqcmVzdWx0ID0gUHlMaXN0X05ldygwKTsKKyAgICBpZiAoIXJlc3VsdCkgcmV0dXJuIE5VTEw7CiAKLQlmb3IgKGkgPSAwOyBpIDwgTlVNX0dFTkVSQVRJT05TOyBpKyspIHsKLQkJaWYgKCEoZ2NfcmVmZXJyZXJzX2ZvcihhcmdzLCBHRU5fSEVBRChpKSwgcmVzdWx0KSkpIHsKLQkJCVB5X0RFQ1JFRihyZXN1bHQpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX0dFTkVSQVRJT05TOyBpKyspIHsKKyAgICAgICAgaWYgKCEoZ2NfcmVmZXJyZXJzX2ZvcihhcmdzLCBHRU5fSEVBRChpKSwgcmVzdWx0KSkpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogLyogQXBwZW5kIG9iaiB0byBsaXN0OyByZXR1cm4gdHJ1ZSBpZiBlcnJvciAob3V0IG9mIG1lbW9yeSksIGZhbHNlIGlmIE9LLiAqLwogc3RhdGljIGludAogcmVmZXJlbnRzdmlzaXQoUHlPYmplY3QgKm9iaiwgUHlPYmplY3QgKmxpc3QpCiB7Ci0JcmV0dXJuIFB5TGlzdF9BcHBlbmQobGlzdCwgb2JqKSA8IDA7CisgICAgcmV0dXJuIFB5TGlzdF9BcHBlbmQobGlzdCwgb2JqKSA8IDA7CiB9CiAKIFB5RG9jX1NUUlZBUihnY19nZXRfcmVmZXJlbnRzX19kb2NfXywKQEAgLTExNTEsMjcgKzExNTEsMjcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnY19nZXRfcmVmZXJlbnRzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeV9zc2l6ZV90IGk7Ci0JUHlPYmplY3QgKnJlc3VsdCA9IFB5TGlzdF9OZXcoMCk7CisgICAgUHlfc3NpemVfdCBpOworICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBQeUxpc3RfTmV3KDApOwogCi0JaWYgKHJlc3VsdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JZm9yIChpID0gMDsgaSA8IFB5VHVwbGVfR0VUX1NJWkUoYXJncyk7IGkrKykgewotCQl0cmF2ZXJzZXByb2MgdHJhdmVyc2U7Ci0JCVB5T2JqZWN0ICpvYmogPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIGkpOworICAgIGZvciAoaSA9IDA7IGkgPCBQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpOyBpKyspIHsKKyAgICAgICAgdHJhdmVyc2Vwcm9jIHRyYXZlcnNlOworICAgICAgICBQeU9iamVjdCAqb2JqID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCBpKTsKIAotCQlpZiAoISBQeU9iamVjdF9JU19HQyhvYmopKQotCQkJY29udGludWU7Ci0JCXRyYXZlcnNlID0gUHlfVFlQRShvYmopLT50cF90cmF2ZXJzZTsKLQkJaWYgKCEgdHJhdmVyc2UpCi0JCQljb250aW51ZTsKLQkJaWYgKHRyYXZlcnNlKG9iaiwgKHZpc2l0cHJvYylyZWZlcmVudHN2aXNpdCwgcmVzdWx0KSkgewotCQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KLQlyZXR1cm4gcmVzdWx0OworICAgICAgICBpZiAoISBQeU9iamVjdF9JU19HQyhvYmopKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIHRyYXZlcnNlID0gUHlfVFlQRShvYmopLT50cF90cmF2ZXJzZTsKKyAgICAgICAgaWYgKCEgdHJhdmVyc2UpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKHRyYXZlcnNlKG9iaiwgKHZpc2l0cHJvYylyZWZlcmVudHN2aXNpdCwgcmVzdWx0KSkgeworICAgICAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBQeURvY19TVFJWQVIoZ2NfZ2V0X29iamVjdHNfX2RvY19fLApAQCAtMTE4MywxOSArMTE4MywxOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdjX2dldF9vYmplY3RzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqbm9hcmdzKQogewotCWludCBpOwotCVB5T2JqZWN0KiByZXN1bHQ7CisgICAgaW50IGk7CisgICAgUHlPYmplY3QqIHJlc3VsdDsKIAotCXJlc3VsdCA9IFB5TGlzdF9OZXcoMCk7Ci0JaWYgKHJlc3VsdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlmb3IgKGkgPSAwOyBpIDwgTlVNX0dFTkVSQVRJT05TOyBpKyspIHsKLQkJaWYgKGFwcGVuZF9vYmplY3RzKHJlc3VsdCwgR0VOX0hFQUQoaSkpKSB7Ci0JCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQotCXJldHVybiByZXN1bHQ7CisgICAgcmVzdWx0ID0gUHlMaXN0X05ldygwKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fR0VORVJBVElPTlM7IGkrKykgeworICAgICAgICBpZiAoYXBwZW5kX29iamVjdHMocmVzdWx0LCBHRU5fSEVBRChpKSkpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogCkBAIC0xMjE2LDY2ICsxMjE2LDY2IEBACiAiZ2V0X3JlZmVyZW50cygpIC0tIFJldHVybiB0aGUgbGlzdCBvZiBvYmplY3RzIHRoYXQgYW4gb2JqZWN0IHJlZmVycyB0by5cbiIpOwogCiBzdGF0aWMgUHlNZXRob2REZWYgR2NNZXRob2RzW10gPSB7Ci0JeyJlbmFibGUiLAkgICBnY19lbmFibGUsCSAgTUVUSF9OT0FSR1MsICBnY19lbmFibGVfX2RvY19ffSwKLQl7ImRpc2FibGUiLAkgICBnY19kaXNhYmxlLAkgIE1FVEhfTk9BUkdTLCAgZ2NfZGlzYWJsZV9fZG9jX199LAotCXsiaXNlbmFibGVkIiwJICAgZ2NfaXNlbmFibGVkLCAgTUVUSF9OT0FSR1MsICBnY19pc2VuYWJsZWRfX2RvY19ffSwKLQl7InNldF9kZWJ1ZyIsCSAgIGdjX3NldF9kZWJ1ZywgIE1FVEhfVkFSQVJHUywgZ2Nfc2V0X2RlYnVnX19kb2NfX30sCi0JeyJnZXRfZGVidWciLAkgICBnY19nZXRfZGVidWcsICBNRVRIX05PQVJHUywgIGdjX2dldF9kZWJ1Z19fZG9jX199LAotCXsiZ2V0X2NvdW50IiwJICAgZ2NfZ2V0X2NvdW50LCAgTUVUSF9OT0FSR1MsICBnY19nZXRfY291bnRfX2RvY19ffSwKLQl7InNldF90aHJlc2hvbGQiLCAgZ2Nfc2V0X3RocmVzaCwgTUVUSF9WQVJBUkdTLCBnY19zZXRfdGhyZXNoX19kb2NfX30sCi0JeyJnZXRfdGhyZXNob2xkIiwgIGdjX2dldF90aHJlc2gsIE1FVEhfTk9BUkdTLCAgZ2NfZ2V0X3RocmVzaF9fZG9jX199LAotCXsiY29sbGVjdCIsCSAgIChQeUNGdW5jdGlvbilnY19jb2xsZWN0LAotICAgICAgICAgCU1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsICAgICAgICAgICBnY19jb2xsZWN0X19kb2NfX30sCi0JeyJnZXRfb2JqZWN0cyIsICAgIGdjX2dldF9vYmplY3RzLE1FVEhfTk9BUkdTLCAgZ2NfZ2V0X29iamVjdHNfX2RvY19ffSwKLQl7ImdldF9yZWZlcnJlcnMiLCAgZ2NfZ2V0X3JlZmVycmVycywgTUVUSF9WQVJBUkdTLAotCQlnY19nZXRfcmVmZXJyZXJzX19kb2NfX30sCi0JeyJnZXRfcmVmZXJlbnRzIiwgIGdjX2dldF9yZWZlcmVudHMsIE1FVEhfVkFSQVJHUywKLQkJZ2NfZ2V0X3JlZmVyZW50c19fZG9jX199LAotCXtOVUxMLAlOVUxMfQkJLyogU2VudGluZWwgKi8KKyAgICB7ImVuYWJsZSIsICAgICAgICAgICAgIGdjX2VuYWJsZSwgICAgIE1FVEhfTk9BUkdTLCAgZ2NfZW5hYmxlX19kb2NfX30sCisgICAgeyJkaXNhYmxlIiwgICAgICAgICAgICBnY19kaXNhYmxlLCAgICBNRVRIX05PQVJHUywgIGdjX2Rpc2FibGVfX2RvY19ffSwKKyAgICB7ImlzZW5hYmxlZCIsICAgICAgICAgIGdjX2lzZW5hYmxlZCwgIE1FVEhfTk9BUkdTLCAgZ2NfaXNlbmFibGVkX19kb2NfX30sCisgICAgeyJzZXRfZGVidWciLCAgICAgICAgICBnY19zZXRfZGVidWcsICBNRVRIX1ZBUkFSR1MsIGdjX3NldF9kZWJ1Z19fZG9jX199LAorICAgIHsiZ2V0X2RlYnVnIiwgICAgICAgICAgZ2NfZ2V0X2RlYnVnLCAgTUVUSF9OT0FSR1MsICBnY19nZXRfZGVidWdfX2RvY19ffSwKKyAgICB7ImdldF9jb3VudCIsICAgICAgICAgIGdjX2dldF9jb3VudCwgIE1FVEhfTk9BUkdTLCAgZ2NfZ2V0X2NvdW50X19kb2NfX30sCisgICAgeyJzZXRfdGhyZXNob2xkIiwgIGdjX3NldF90aHJlc2gsIE1FVEhfVkFSQVJHUywgZ2Nfc2V0X3RocmVzaF9fZG9jX199LAorICAgIHsiZ2V0X3RocmVzaG9sZCIsICBnY19nZXRfdGhyZXNoLCBNRVRIX05PQVJHUywgIGdjX2dldF90aHJlc2hfX2RvY19ffSwKKyAgICB7ImNvbGxlY3QiLCAgICAgICAgICAgIChQeUNGdW5jdGlvbilnY19jb2xsZWN0LAorICAgICAgICBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLCAgICAgICAgICAgZ2NfY29sbGVjdF9fZG9jX199LAorICAgIHsiZ2V0X29iamVjdHMiLCAgICBnY19nZXRfb2JqZWN0cyxNRVRIX05PQVJHUywgIGdjX2dldF9vYmplY3RzX19kb2NfX30sCisgICAgeyJnZXRfcmVmZXJyZXJzIiwgIGdjX2dldF9yZWZlcnJlcnMsIE1FVEhfVkFSQVJHUywKKyAgICAgICAgZ2NfZ2V0X3JlZmVycmVyc19fZG9jX199LAorICAgIHsiZ2V0X3JlZmVyZW50cyIsICBnY19nZXRfcmVmZXJlbnRzLCBNRVRIX1ZBUkFSR1MsCisgICAgICAgIGdjX2dldF9yZWZlcmVudHNfX2RvY19ffSwKKyAgICB7TlVMTCwgICAgICBOVUxMfSAgICAgICAgICAgLyogU2VudGluZWwgKi8KIH07CiAKIFB5TU9ESU5JVF9GVU5DCiBpbml0Z2Modm9pZCkKIHsKLQlQeU9iamVjdCAqbTsKKyAgICBQeU9iamVjdCAqbTsKIAotCW0gPSBQeV9Jbml0TW9kdWxlNCgiZ2MiLAotCQkJICAgICAgR2NNZXRob2RzLAotCQkJICAgICAgZ2NfX2RvY19fLAotCQkJICAgICAgTlVMTCwKLQkJCSAgICAgIFBZVEhPTl9BUElfVkVSU0lPTik7Ci0JaWYgKG0gPT0gTlVMTCkKLQkJcmV0dXJuOworICAgIG0gPSBQeV9Jbml0TW9kdWxlNCgiZ2MiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBHY01ldGhvZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGdjX19kb2NfXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUFlUSE9OX0FQSV9WRVJTSU9OKTsKKyAgICBpZiAobSA9PSBOVUxMKQorICAgICAgICByZXR1cm47CiAKLQlpZiAoZ2FyYmFnZSA9PSBOVUxMKSB7Ci0JCWdhcmJhZ2UgPSBQeUxpc3RfTmV3KDApOwotCQlpZiAoZ2FyYmFnZSA9PSBOVUxMKQotCQkJcmV0dXJuOwotCX0KLQlQeV9JTkNSRUYoZ2FyYmFnZSk7Ci0JaWYgKFB5TW9kdWxlX0FkZE9iamVjdChtLCAiZ2FyYmFnZSIsIGdhcmJhZ2UpIDwgMCkKLQkJcmV0dXJuOworICAgIGlmIChnYXJiYWdlID09IE5VTEwpIHsKKyAgICAgICAgZ2FyYmFnZSA9IFB5TGlzdF9OZXcoMCk7CisgICAgICAgIGlmIChnYXJiYWdlID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm47CisgICAgfQorICAgIFB5X0lOQ1JFRihnYXJiYWdlKTsKKyAgICBpZiAoUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJnYXJiYWdlIiwgZ2FyYmFnZSkgPCAwKQorICAgICAgICByZXR1cm47CiAKLQkvKiBJbXBvcnRpbmcgY2FuJ3QgYmUgZG9uZSBpbiBjb2xsZWN0KCkgYmVjYXVzZSBjb2xsZWN0KCkKLQkgKiBjYW4gYmUgY2FsbGVkIHZpYSBQeUdDX0NvbGxlY3QoKSBpbiBQeV9GaW5hbGl6ZSgpLgotCSAqIFRoaXMgd291bGRuJ3QgYmUgYSBwcm9ibGVtLCBleGNlcHQgdGhhdCA8aW5pdGlhbGl6ZWQ+IGlzCi0JICogcmVzZXQgdG8gMCBiZWZvcmUgY2FsbGluZyBjb2xsZWN0IHdoaWNoIHRyaXBzIHVwCi0JICogdGhlIGltcG9ydCBhbmQgdHJpZ2dlcnMgYW4gYXNzZXJ0aW9uLgotCSAqLwotCWlmICh0bW9kID09IE5VTEwpIHsKLQkJdG1vZCA9IFB5SW1wb3J0X0ltcG9ydE1vZHVsZU5vQmxvY2soInRpbWUiKTsKLQkJaWYgKHRtb2QgPT0gTlVMTCkKLQkJCVB5RXJyX0NsZWFyKCk7Ci0JfQorICAgIC8qIEltcG9ydGluZyBjYW4ndCBiZSBkb25lIGluIGNvbGxlY3QoKSBiZWNhdXNlIGNvbGxlY3QoKQorICAgICAqIGNhbiBiZSBjYWxsZWQgdmlhIFB5R0NfQ29sbGVjdCgpIGluIFB5X0ZpbmFsaXplKCkuCisgICAgICogVGhpcyB3b3VsZG4ndCBiZSBhIHByb2JsZW0sIGV4Y2VwdCB0aGF0IDxpbml0aWFsaXplZD4gaXMKKyAgICAgKiByZXNldCB0byAwIGJlZm9yZSBjYWxsaW5nIGNvbGxlY3Qgd2hpY2ggdHJpcHMgdXAKKyAgICAgKiB0aGUgaW1wb3J0IGFuZCB0cmlnZ2VycyBhbiBhc3NlcnRpb24uCisgICAgICovCisgICAgaWYgKHRtb2QgPT0gTlVMTCkgeworICAgICAgICB0bW9kID0gUHlJbXBvcnRfSW1wb3J0TW9kdWxlTm9CbG9jaygidGltZSIpOworICAgICAgICBpZiAodG1vZCA9PSBOVUxMKQorICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICB9CiAKICNkZWZpbmUgQUREX0lOVChOQU1FKSBpZiAoUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgI05BTUUsIE5BTUUpIDwgMCkgcmV0dXJuCi0JQUREX0lOVChERUJVR19TVEFUUyk7Ci0JQUREX0lOVChERUJVR19DT0xMRUNUQUJMRSk7Ci0JQUREX0lOVChERUJVR19VTkNPTExFQ1RBQkxFKTsKLQlBRERfSU5UKERFQlVHX0lOU1RBTkNFUyk7Ci0JQUREX0lOVChERUJVR19PQkpFQ1RTKTsKLQlBRERfSU5UKERFQlVHX1NBVkVBTEwpOwotCUFERF9JTlQoREVCVUdfTEVBSyk7CisgICAgQUREX0lOVChERUJVR19TVEFUUyk7CisgICAgQUREX0lOVChERUJVR19DT0xMRUNUQUJMRSk7CisgICAgQUREX0lOVChERUJVR19VTkNPTExFQ1RBQkxFKTsKKyAgICBBRERfSU5UKERFQlVHX0lOU1RBTkNFUyk7CisgICAgQUREX0lOVChERUJVR19PQkpFQ1RTKTsKKyAgICBBRERfSU5UKERFQlVHX1NBVkVBTEwpOworICAgIEFERF9JTlQoREVCVUdfTEVBSyk7CiAjdW5kZWYgQUREX0lOVAogfQogCkBAIC0xMjgzLDI0ICsxMjgzLDI0IEBACiBQeV9zc2l6ZV90CiBQeUdDX0NvbGxlY3Qodm9pZCkKIHsKLQlQeV9zc2l6ZV90IG47CisgICAgUHlfc3NpemVfdCBuOwogCi0JaWYgKGNvbGxlY3RpbmcpCi0JCW4gPSAwOyAvKiBhbHJlYWR5IGNvbGxlY3RpbmcsIGRvbid0IGRvIGFueXRoaW5nICovCi0JZWxzZSB7Ci0JCWNvbGxlY3RpbmcgPSAxOwotCQluID0gY29sbGVjdChOVU1fR0VORVJBVElPTlMgLSAxKTsKLQkJY29sbGVjdGluZyA9IDA7Ci0JfQorICAgIGlmIChjb2xsZWN0aW5nKQorICAgICAgICBuID0gMDsgLyogYWxyZWFkeSBjb2xsZWN0aW5nLCBkb24ndCBkbyBhbnl0aGluZyAqLworICAgIGVsc2UgeworICAgICAgICBjb2xsZWN0aW5nID0gMTsKKyAgICAgICAgbiA9IGNvbGxlY3QoTlVNX0dFTkVSQVRJT05TIC0gMSk7CisgICAgICAgIGNvbGxlY3RpbmcgPSAwOworICAgIH0KIAotCXJldHVybiBuOworICAgIHJldHVybiBuOwogfQogCiAvKiBmb3IgZGVidWdnaW5nICovCiB2b2lkCiBfUHlHQ19EdW1wKFB5R0NfSGVhZCAqZykKIHsKLQlfUHlPYmplY3RfRHVtcChGUk9NX0dDKGcpKTsKKyAgICBfUHlPYmplY3RfRHVtcChGUk9NX0dDKGcpKTsKIH0KIAogLyogZXh0ZW5zaW9uIG1vZHVsZXMgbWlnaHQgYmUgY29tcGlsZWQgd2l0aCBHQyBzdXBwb3J0IHNvIHRoZXNlCkBAIC0xMzE0LDcgKzEzMTQsNyBAQAogdm9pZAogUHlPYmplY3RfR0NfVHJhY2sodm9pZCAqb3ApCiB7Ci0JX1B5T2JqZWN0X0dDX1RSQUNLKG9wKTsKKyAgICBfUHlPYmplY3RfR0NfVFJBQ0sob3ApOwogfQogCiAvKiBmb3IgYmluYXJ5IGNvbXBhdGliaWxpdHkgd2l0aCAyLjIgKi8KQEAgLTEzMjcsMTEgKzEzMjcsMTEgQEAKIHZvaWQKIFB5T2JqZWN0X0dDX1VuVHJhY2sodm9pZCAqb3ApCiB7Ci0JLyogT2JzY3VyZTogIHRoZSBQeV9UUkFTSENBTiBtZWNoYW5pc20gcmVxdWlyZXMgdGhhdCB3ZSBiZSBhYmxlIHRvCi0JICogY2FsbCBQeU9iamVjdF9HQ19VblRyYWNrIHR3aWNlIG9uIGFuIG9iamVjdC4KLQkgKi8KLQlpZiAoSVNfVFJBQ0tFRChvcCkpCi0JCV9QeU9iamVjdF9HQ19VTlRSQUNLKG9wKTsKKyAgICAvKiBPYnNjdXJlOiAgdGhlIFB5X1RSQVNIQ0FOIG1lY2hhbmlzbSByZXF1aXJlcyB0aGF0IHdlIGJlIGFibGUgdG8KKyAgICAgKiBjYWxsIFB5T2JqZWN0X0dDX1VuVHJhY2sgdHdpY2Ugb24gYW4gb2JqZWN0LgorICAgICAqLworICAgIGlmIChJU19UUkFDS0VEKG9wKSkKKyAgICAgICAgX1B5T2JqZWN0X0dDX1VOVFJBQ0sob3ApOwogfQogCiAvKiBmb3IgYmluYXJ5IGNvbXBhdGliaWxpdHkgd2l0aCAyLjIgKi8KQEAgLTEzNDQsNzMgKzEzNDQsNzMgQEAKIFB5T2JqZWN0ICoKIF9QeU9iamVjdF9HQ19NYWxsb2Moc2l6ZV90IGJhc2ljc2l6ZSkKIHsKLQlQeU9iamVjdCAqb3A7Ci0JUHlHQ19IZWFkICpnOwotCWlmIChiYXNpY3NpemUgPiBQWV9TU0laRV9UX01BWCAtIHNpemVvZihQeUdDX0hlYWQpKQotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQlnID0gKFB5R0NfSGVhZCAqKVB5T2JqZWN0X01BTExPQygKLSAgICAgICAgICAgICAgICBzaXplb2YoUHlHQ19IZWFkKSArIGJhc2ljc2l6ZSk7Ci0JaWYgKGcgPT0gTlVMTCkKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JZy0+Z2MuZ2NfcmVmcyA9IEdDX1VOVFJBQ0tFRDsKLQlnZW5lcmF0aW9uc1swXS5jb3VudCsrOyAvKiBudW1iZXIgb2YgYWxsb2NhdGVkIEdDIG9iamVjdHMgKi8KLSAJaWYgKGdlbmVyYXRpb25zWzBdLmNvdW50ID4gZ2VuZXJhdGlvbnNbMF0udGhyZXNob2xkICYmCi0gCSAgICBlbmFibGVkICYmCi0gCSAgICBnZW5lcmF0aW9uc1swXS50aHJlc2hvbGQgJiYKLSAJICAgICFjb2xsZWN0aW5nICYmCi0gCSAgICAhUHlFcnJfT2NjdXJyZWQoKSkgewotCQljb2xsZWN0aW5nID0gMTsKLQkJY29sbGVjdF9nZW5lcmF0aW9ucygpOwotCQljb2xsZWN0aW5nID0gMDsKLQl9Ci0Jb3AgPSBGUk9NX0dDKGcpOwotCXJldHVybiBvcDsKKyAgICBQeU9iamVjdCAqb3A7CisgICAgUHlHQ19IZWFkICpnOworICAgIGlmIChiYXNpY3NpemUgPiBQWV9TU0laRV9UX01BWCAtIHNpemVvZihQeUdDX0hlYWQpKQorICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICBnID0gKFB5R0NfSGVhZCAqKVB5T2JqZWN0X01BTExPQygKKyAgICAgICAgc2l6ZW9mKFB5R0NfSGVhZCkgKyBiYXNpY3NpemUpOworICAgIGlmIChnID09IE5VTEwpCisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIGctPmdjLmdjX3JlZnMgPSBHQ19VTlRSQUNLRUQ7CisgICAgZ2VuZXJhdGlvbnNbMF0uY291bnQrKzsgLyogbnVtYmVyIG9mIGFsbG9jYXRlZCBHQyBvYmplY3RzICovCisgICAgaWYgKGdlbmVyYXRpb25zWzBdLmNvdW50ID4gZ2VuZXJhdGlvbnNbMF0udGhyZXNob2xkICYmCisgICAgICAgIGVuYWJsZWQgJiYKKyAgICAgICAgZ2VuZXJhdGlvbnNbMF0udGhyZXNob2xkICYmCisgICAgICAgICFjb2xsZWN0aW5nICYmCisgICAgICAgICFQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgIGNvbGxlY3RpbmcgPSAxOworICAgICAgICBjb2xsZWN0X2dlbmVyYXRpb25zKCk7CisgICAgICAgIGNvbGxlY3RpbmcgPSAwOworICAgIH0KKyAgICBvcCA9IEZST01fR0MoZyk7CisgICAgcmV0dXJuIG9wOwogfQogCiBQeU9iamVjdCAqCiBfUHlPYmplY3RfR0NfTmV3KFB5VHlwZU9iamVjdCAqdHApCiB7Ci0JUHlPYmplY3QgKm9wID0gX1B5T2JqZWN0X0dDX01hbGxvYyhfUHlPYmplY3RfU0laRSh0cCkpOwotCWlmIChvcCAhPSBOVUxMKQotCQlvcCA9IFB5T2JqZWN0X0lOSVQob3AsIHRwKTsKLQlyZXR1cm4gb3A7CisgICAgUHlPYmplY3QgKm9wID0gX1B5T2JqZWN0X0dDX01hbGxvYyhfUHlPYmplY3RfU0laRSh0cCkpOworICAgIGlmIChvcCAhPSBOVUxMKQorICAgICAgICBvcCA9IFB5T2JqZWN0X0lOSVQob3AsIHRwKTsKKyAgICByZXR1cm4gb3A7CiB9CiAKIFB5VmFyT2JqZWN0ICoKIF9QeU9iamVjdF9HQ19OZXdWYXIoUHlUeXBlT2JqZWN0ICp0cCwgUHlfc3NpemVfdCBuaXRlbXMpCiB7Ci0JY29uc3Qgc2l6ZV90IHNpemUgPSBfUHlPYmplY3RfVkFSX1NJWkUodHAsIG5pdGVtcyk7Ci0JUHlWYXJPYmplY3QgKm9wID0gKFB5VmFyT2JqZWN0ICopIF9QeU9iamVjdF9HQ19NYWxsb2Moc2l6ZSk7Ci0JaWYgKG9wICE9IE5VTEwpCi0JCW9wID0gUHlPYmplY3RfSU5JVF9WQVIob3AsIHRwLCBuaXRlbXMpOwotCXJldHVybiBvcDsKKyAgICBjb25zdCBzaXplX3Qgc2l6ZSA9IF9QeU9iamVjdF9WQVJfU0laRSh0cCwgbml0ZW1zKTsKKyAgICBQeVZhck9iamVjdCAqb3AgPSAoUHlWYXJPYmplY3QgKikgX1B5T2JqZWN0X0dDX01hbGxvYyhzaXplKTsKKyAgICBpZiAob3AgIT0gTlVMTCkKKyAgICAgICAgb3AgPSBQeU9iamVjdF9JTklUX1ZBUihvcCwgdHAsIG5pdGVtcyk7CisgICAgcmV0dXJuIG9wOwogfQogCiBQeVZhck9iamVjdCAqCiBfUHlPYmplY3RfR0NfUmVzaXplKFB5VmFyT2JqZWN0ICpvcCwgUHlfc3NpemVfdCBuaXRlbXMpCiB7Ci0JY29uc3Qgc2l6ZV90IGJhc2ljc2l6ZSA9IF9QeU9iamVjdF9WQVJfU0laRShQeV9UWVBFKG9wKSwgbml0ZW1zKTsKLQlQeUdDX0hlYWQgKmcgPSBBU19HQyhvcCk7Ci0JaWYgKGJhc2ljc2l6ZSA+IFBZX1NTSVpFX1RfTUFYIC0gc2l6ZW9mKFB5R0NfSGVhZCkpCi0JCXJldHVybiAoUHlWYXJPYmplY3QgKilQeUVycl9Ob01lbW9yeSgpOwotCWcgPSAoUHlHQ19IZWFkICopUHlPYmplY3RfUkVBTExPQyhnLCAgc2l6ZW9mKFB5R0NfSGVhZCkgKyBiYXNpY3NpemUpOwotCWlmIChnID09IE5VTEwpCi0JCXJldHVybiAoUHlWYXJPYmplY3QgKilQeUVycl9Ob01lbW9yeSgpOwotCW9wID0gKFB5VmFyT2JqZWN0ICopIEZST01fR0MoZyk7Ci0JUHlfU0laRShvcCkgPSBuaXRlbXM7Ci0JcmV0dXJuIG9wOworICAgIGNvbnN0IHNpemVfdCBiYXNpY3NpemUgPSBfUHlPYmplY3RfVkFSX1NJWkUoUHlfVFlQRShvcCksIG5pdGVtcyk7CisgICAgUHlHQ19IZWFkICpnID0gQVNfR0Mob3ApOworICAgIGlmIChiYXNpY3NpemUgPiBQWV9TU0laRV9UX01BWCAtIHNpemVvZihQeUdDX0hlYWQpKQorICAgICAgICByZXR1cm4gKFB5VmFyT2JqZWN0ICopUHlFcnJfTm9NZW1vcnkoKTsKKyAgICBnID0gKFB5R0NfSGVhZCAqKVB5T2JqZWN0X1JFQUxMT0MoZywgIHNpemVvZihQeUdDX0hlYWQpICsgYmFzaWNzaXplKTsKKyAgICBpZiAoZyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gKFB5VmFyT2JqZWN0ICopUHlFcnJfTm9NZW1vcnkoKTsKKyAgICBvcCA9IChQeVZhck9iamVjdCAqKSBGUk9NX0dDKGcpOworICAgIFB5X1NJWkUob3ApID0gbml0ZW1zOworICAgIHJldHVybiBvcDsKIH0KIAogdm9pZAogUHlPYmplY3RfR0NfRGVsKHZvaWQgKm9wKQogewotCVB5R0NfSGVhZCAqZyA9IEFTX0dDKG9wKTsKLQlpZiAoSVNfVFJBQ0tFRChvcCkpCi0JCWdjX2xpc3RfcmVtb3ZlKGcpOwotCWlmIChnZW5lcmF0aW9uc1swXS5jb3VudCA+IDApIHsKLQkJZ2VuZXJhdGlvbnNbMF0uY291bnQtLTsKLQl9Ci0JUHlPYmplY3RfRlJFRShnKTsKKyAgICBQeUdDX0hlYWQgKmcgPSBBU19HQyhvcCk7CisgICAgaWYgKElTX1RSQUNLRUQob3ApKQorICAgICAgICBnY19saXN0X3JlbW92ZShnKTsKKyAgICBpZiAoZ2VuZXJhdGlvbnNbMF0uY291bnQgPiAwKSB7CisgICAgICAgIGdlbmVyYXRpb25zWzBdLmNvdW50LS07CisgICAgfQorICAgIFB5T2JqZWN0X0ZSRUUoZyk7CiB9CiAKIC8qIGZvciBiaW5hcnkgY29tcGF0aWJpbGl0eSB3aXRoIDIuMiAqLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9nZXRhZGRyaW5mby5jIGIvTW9kdWxlcy9nZXRhZGRyaW5mby5jCmluZGV4IDRkMTljMzQuLjFkMGJmYmIgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvZ2V0YWRkcmluZm8uYworKysgYi9Nb2R1bGVzL2dldGFkZHJpbmZvLmMKQEAgLTEsNyArMSw3IEBACiAvKgogICogQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3LCBhbmQgMTk5OCBXSURFIFByb2plY3QuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogCisgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKICAqIGFyZSBtZXQ6CkBAIC0xMyw3ICsxMyw3IEBACiAgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycwogICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCiAgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIAorICoKICAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFBST0pFQ1QgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECiAgKiBHQUlfQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCiAgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQpAQCAtNzMsNTIgKzczLDUyIEBACiAKIHN0YXRpYyBjb25zdCBjaGFyIGluX2FkZHJhbnlbXSA9IHsgMCwgMCwgMCwgMCB9Owogc3RhdGljIGNvbnN0IGNoYXIgaW42X2FkZHJhbnlbXSA9IHsKLQkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwCisgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMAogfTsKLXN0YXRpYyBjb25zdCBjaGFyIGluX2xvb3BiYWNrW10gPSB7IDEyNywgMCwgMCwgMSB9OyAKK3N0YXRpYyBjb25zdCBjaGFyIGluX2xvb3BiYWNrW10gPSB7IDEyNywgMCwgMCwgMSB9Owogc3RhdGljIGNvbnN0IGNoYXIgaW42X2xvb3BiYWNrW10gPSB7Ci0JMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMQorICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEKIH07CiAKIHN0cnVjdCBzb2NraW5ldCB7Ci0JdV9jaGFyCXNpX2xlbjsKLQl1X2NoYXIJc2lfZmFtaWx5OwotCXVfc2hvcnQJc2lfcG9ydDsKKyAgICB1X2NoYXIgICAgICBzaV9sZW47CisgICAgdV9jaGFyICAgICAgc2lfZmFtaWx5OworICAgIHVfc2hvcnQgICAgIHNpX3BvcnQ7CiB9OwogCiBzdGF0aWMgc3RydWN0IGdhaV9hZmQgewotCWludCBhX2FmOwotCWludCBhX2FkZHJsZW47Ci0JaW50IGFfc29ja2xlbjsKLQlpbnQgYV9vZmY7Ci0JY29uc3QgY2hhciAqYV9hZGRyYW55OwotCWNvbnN0IGNoYXIgKmFfbG9vcGJhY2s7CQorICAgIGludCBhX2FmOworICAgIGludCBhX2FkZHJsZW47CisgICAgaW50IGFfc29ja2xlbjsKKyAgICBpbnQgYV9vZmY7CisgICAgY29uc3QgY2hhciAqYV9hZGRyYW55OworICAgIGNvbnN0IGNoYXIgKmFfbG9vcGJhY2s7CiB9IGdhaV9hZmRsIFtdID0gewogI2lmZGVmIEVOQUJMRV9JUFY2CiAjZGVmaW5lIE5fSU5FVDYgMAotCXtQRl9JTkVUNiwgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkciksCi0JIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KSwKLQkgb2Zmc2V0b2Yoc3RydWN0IHNvY2thZGRyX2luNiwgc2luNl9hZGRyKSwKLQkgaW42X2FkZHJhbnksIGluNl9sb29wYmFja30sCisgICAge1BGX0lORVQ2LCBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSwKKyAgICAgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbjYpLAorICAgICBvZmZzZXRvZihzdHJ1Y3Qgc29ja2FkZHJfaW42LCBzaW42X2FkZHIpLAorICAgICBpbjZfYWRkcmFueSwgaW42X2xvb3BiYWNrfSwKICNkZWZpbmUgTl9JTkVUICAxCiAjZWxzZQogI2RlZmluZSBOX0lORVQgIDAKICNlbmRpZgotCXtQRl9JTkVULCBzaXplb2Yoc3RydWN0IGluX2FkZHIpLAotCSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKSwKLQkgb2Zmc2V0b2Yoc3RydWN0IHNvY2thZGRyX2luLCBzaW5fYWRkciksCi0JIGluX2FkZHJhbnksIGluX2xvb3BiYWNrfSwKLQl7MCwgMCwgMCwgMCwgTlVMTCwgTlVMTH0sCisgICAge1BGX0lORVQsIHNpemVvZihzdHJ1Y3QgaW5fYWRkciksCisgICAgIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pLAorICAgICBvZmZzZXRvZihzdHJ1Y3Qgc29ja2FkZHJfaW4sIHNpbl9hZGRyKSwKKyAgICAgaW5fYWRkcmFueSwgaW5fbG9vcGJhY2t9LAorICAgIHswLCAwLCAwLCAwLCBOVUxMLCBOVUxMfSwKIH07CiAKICNpZmRlZiBFTkFCTEVfSVBWNgotI2RlZmluZSBQVE9OX01BWAkxNgorI2RlZmluZSBQVE9OX01BWCAgICAgICAgMTYKICNlbHNlCi0jZGVmaW5lIFBUT05fTUFYCTQKKyNkZWZpbmUgUFRPTl9NQVggICAgICAgIDQKICNlbmRpZgogCiAjaWZuZGVmIElOX01VTFRJQ0FTVAotI2RlZmluZSBJTl9NVUxUSUNBU1QoaSkJICAgICgoKGkpICYgMHhmMDAwMDAwMFUpID09IDB4ZTAwMDAwMDBVKQorI2RlZmluZSBJTl9NVUxUSUNBU1QoaSkgICAgICgoKGkpICYgMHhmMDAwMDAwMFUpID09IDB4ZTAwMDAwMDBVKQogI2VuZGlmCiAKICNpZm5kZWYgSU5fRVhQRVJJTUVOVEFMCkBAIC0xMjYsNzMgKzEyNiw3MyBAQAogI2VuZGlmCiAKICNpZm5kZWYgSU5fTE9PUEJBQ0tORVQKLSNkZWZpbmUgSU5fTE9PUEJBQ0tORVQJICAgIDEyNworI2RlZmluZSBJTl9MT09QQkFDS05FVCAgICAgIDEyNwogI2VuZGlmCiAKIHN0YXRpYyBpbnQgZ2V0X25hbWUgUHlfUFJPVE8oKGNvbnN0IGNoYXIgKiwgc3RydWN0IGdhaV9hZmQgKiwKLQkJCSAgc3RydWN0IGFkZHJpbmZvICoqLCBjaGFyICosIHN0cnVjdCBhZGRyaW5mbyAqLAotCQkJICBpbnQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGFkZHJpbmZvICoqLCBjaGFyICosIHN0cnVjdCBhZGRyaW5mbyAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQpKTsKIHN0YXRpYyBpbnQgZ2V0X2FkZHIgUHlfUFJPVE8oKGNvbnN0IGNoYXIgKiwgaW50LCBzdHJ1Y3QgYWRkcmluZm8gKiosCi0JCQlzdHJ1Y3QgYWRkcmluZm8gKiwgaW50KSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYWRkcmluZm8gKiwgaW50KSk7CiBzdGF0aWMgaW50IHN0cl9pc251bWJlciBQeV9QUk9UTygoY29uc3QgY2hhciAqKSk7Ci0JCisKIHN0YXRpYyBjaGFyICphaV9lcnJsaXN0W10gPSB7Ci0JInN1Y2Nlc3MuIiwKLQkiYWRkcmVzcyBmYW1pbHkgZm9yIGhvc3RuYW1lIG5vdCBzdXBwb3J0ZWQuIiwJLyogRUFJX0FERFJGQU1JTFkgKi8KLQkidGVtcG9yYXJ5IGZhaWx1cmUgaW4gbmFtZSByZXNvbHV0aW9uLiIsCS8qIEVBSV9BR0FJTiAgICAgICovCi0JImludmFsaWQgdmFsdWUgZm9yIGFpX2ZsYWdzLiIsCQkgICAgICAgCS8qIEVBSV9CQURGTEFHUyAgICovCi0JIm5vbi1yZWNvdmVyYWJsZSBmYWlsdXJlIGluIG5hbWUgcmVzb2x1dGlvbi4iLCAJLyogRUFJX0ZBSUwgICAgICAgKi8KLQkiYWlfZmFtaWx5IG5vdCBzdXBwb3J0ZWQuIiwJCQkvKiBFQUlfRkFNSUxZICAgICAqLwotCSJtZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlLiIsIAkJCS8qIEVBSV9NRU1PUlkgICAgICovCi0JIm5vIGFkZHJlc3MgYXNzb2NpYXRlZCB3aXRoIGhvc3RuYW1lLiIsIAkvKiBFQUlfTk9EQVRBICAgICAqLwotCSJob3N0bmFtZSBub3Igc2Vydm5hbWUgcHJvdmlkZWQsIG9yIG5vdCBrbm93bi4iLC8qIEVBSV9OT05BTUUgICAgICovCi0JInNlcnZuYW1lIG5vdCBzdXBwb3J0ZWQgZm9yIGFpX3NvY2t0eXBlLiIsCS8qIEVBSV9TRVJWSUNFICAgICovCi0JImFpX3NvY2t0eXBlIG5vdCBzdXBwb3J0ZWQuIiwgCQkJLyogRUFJX1NPQ0tUWVBFICAgKi8KLQkic3lzdGVtIGVycm9yIHJldHVybmVkIGluIGVycm5vLiIsIAkJLyogRUFJX1NZU1RFTSAgICAgKi8KLQkiaW52YWxpZCB2YWx1ZSBmb3IgaGludHMuIiwJCQkvKiBFQUlfQkFESElOVFMJICAqLwotCSJyZXNvbHZlZCBwcm90b2NvbCBpcyB1bmtub3duLiIsCQkvKiBFQUlfUFJPVE9DT0wgICAqLwotCSJ1bmtub3duIGVycm9yLiIsIAkJCQkvKiBFQUlfTUFYICAgICAgICAqLworICAgICJzdWNjZXNzLiIsCisgICAgImFkZHJlc3MgZmFtaWx5IGZvciBob3N0bmFtZSBub3Qgc3VwcG9ydGVkLiIsICAgICAgIC8qIEVBSV9BRERSRkFNSUxZICovCisgICAgInRlbXBvcmFyeSBmYWlsdXJlIGluIG5hbWUgcmVzb2x1dGlvbi4iLCAgICAgICAgICAgIC8qIEVBSV9BR0FJTiAgICAgICovCisgICAgImludmFsaWQgdmFsdWUgZm9yIGFpX2ZsYWdzLiIsICAgICAgICAgICAgICAgICAgICAgIC8qIEVBSV9CQURGTEFHUyAgICovCisgICAgIm5vbi1yZWNvdmVyYWJsZSBmYWlsdXJlIGluIG5hbWUgcmVzb2x1dGlvbi4iLCAgICAgIC8qIEVBSV9GQUlMICAgICAgICovCisgICAgImFpX2ZhbWlseSBub3Qgc3VwcG9ydGVkLiIsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVBSV9GQU1JTFkgICAgICovCisgICAgIm1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUuIiwgICAgICAgICAgICAgICAgICAgICAgIC8qIEVBSV9NRU1PUlkgICAgICovCisgICAgIm5vIGFkZHJlc3MgYXNzb2NpYXRlZCB3aXRoIGhvc3RuYW1lLiIsICAgICAgICAgICAgIC8qIEVBSV9OT0RBVEEgICAgICovCisgICAgImhvc3RuYW1lIG5vciBzZXJ2bmFtZSBwcm92aWRlZCwgb3Igbm90IGtub3duLiIsLyogRUFJX05PTkFNRSAgICAgKi8KKyAgICAic2Vydm5hbWUgbm90IHN1cHBvcnRlZCBmb3IgYWlfc29ja3R5cGUuIiwgICAgICAgICAgLyogRUFJX1NFUlZJQ0UgICAgKi8KKyAgICAiYWlfc29ja3R5cGUgbm90IHN1cHBvcnRlZC4iLCAgICAgICAgICAgICAgICAgICAgICAgLyogRUFJX1NPQ0tUWVBFICAgKi8KKyAgICAic3lzdGVtIGVycm9yIHJldHVybmVkIGluIGVycm5vLiIsICAgICAgICAgICAgICAgICAgLyogRUFJX1NZU1RFTSAgICAgKi8KKyAgICAiaW52YWxpZCB2YWx1ZSBmb3IgaGludHMuIiwgICAgICAgICAgICAgICAgICAgICAgICAgLyogRUFJX0JBREhJTlRTICAgKi8KKyAgICAicmVzb2x2ZWQgcHJvdG9jb2wgaXMgdW5rbm93bi4iLCAgICAgICAgICAgICAgICAgICAgLyogRUFJX1BST1RPQ09MICAgKi8KKyAgICAidW5rbm93biBlcnJvci4iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRUFJX01BWCAgICAgICAgKi8KIH07CiAKICNkZWZpbmUgR0VUX0NBTk9OTkFNRShhaSwgc3RyKSBcCiBpZiAocGFpLT5haV9mbGFncyAmIEFJX0NBTk9OTkFNRSkge1wKLQlpZiAoKChhaSktPmFpX2Nhbm9ubmFtZSA9IChjaGFyICopbWFsbG9jKHN0cmxlbihzdHIpICsgMSkpICE9IE5VTEwpIHtcCi0JCXN0cmNweSgoYWkpLT5haV9jYW5vbm5hbWUsIChzdHIpKTtcCi0JfSBlbHNlIHtcCi0JCWVycm9yID0gRUFJX01FTU9SWTtcCi0JCWdvdG8gZnJlZTtcCi0JfVwKKyAgICBpZiAoKChhaSktPmFpX2Nhbm9ubmFtZSA9IChjaGFyICopbWFsbG9jKHN0cmxlbihzdHIpICsgMSkpICE9IE5VTEwpIHtcCisgICAgICAgIHN0cmNweSgoYWkpLT5haV9jYW5vbm5hbWUsIChzdHIpKTtcCisgICAgfSBlbHNlIHtcCisgICAgICAgIGVycm9yID0gRUFJX01FTU9SWTtcCisgICAgICAgIGdvdG8gZnJlZTtcCisgICAgfVwKIH0KIAogI2lmZGVmIEhBVkVfU09DS0FERFJfU0FfTEVOCiAjZGVmaW5lIEdFVF9BSShhaSwgZ2FpX2FmZCwgYWRkciwgcG9ydCkge1wKLQljaGFyICpwO1wKLQlpZiAoKChhaSkgPSAoc3RydWN0IGFkZHJpbmZvICopbWFsbG9jKHNpemVvZihzdHJ1Y3QgYWRkcmluZm8pICtcCi0JCQkJCSAgICAgICgoZ2FpX2FmZCktPmFfc29ja2xlbikpKVwKLQkgICAgPT0gTlVMTCkgZ290byBmcmVlO1wKLQltZW1jcHkoYWksIHBhaSwgc2l6ZW9mKHN0cnVjdCBhZGRyaW5mbykpO1wKLQkoYWkpLT5haV9hZGRyID0gKHN0cnVjdCBzb2NrYWRkciAqKSgoYWkpICsgMSk7XAotCW1lbXNldCgoYWkpLT5haV9hZGRyLCAwLCAoZ2FpX2FmZCktPmFfc29ja2xlbik7XAotCShhaSktPmFpX2FkZHItPnNhX2xlbiA9IChhaSktPmFpX2FkZHJsZW4gPSAoZ2FpX2FmZCktPmFfc29ja2xlbjtcCi0JKGFpKS0+YWlfYWRkci0+c2FfZmFtaWx5ID0gKGFpKS0+YWlfZmFtaWx5ID0gKGdhaV9hZmQpLT5hX2FmO1wKLQkoKHN0cnVjdCBzb2NraW5ldCAqKShhaSktPmFpX2FkZHIpLT5zaV9wb3J0ID0gcG9ydDtcCi0JcCA9IChjaGFyICopKChhaSktPmFpX2FkZHIpO1wKLQltZW1jcHkocCArIChnYWlfYWZkKS0+YV9vZmYsIChhZGRyKSwgKGdhaV9hZmQpLT5hX2FkZHJsZW4pO1wKKyAgICBjaGFyICpwO1wKKyAgICBpZiAoKChhaSkgPSAoc3RydWN0IGFkZHJpbmZvICopbWFsbG9jKHNpemVvZihzdHJ1Y3QgYWRkcmluZm8pICtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGdhaV9hZmQpLT5hX3NvY2tsZW4pKSlcCisgICAgICAgID09IE5VTEwpIGdvdG8gZnJlZTtcCisgICAgbWVtY3B5KGFpLCBwYWksIHNpemVvZihzdHJ1Y3QgYWRkcmluZm8pKTtcCisgICAgKGFpKS0+YWlfYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHIgKikoKGFpKSArIDEpO1wKKyAgICBtZW1zZXQoKGFpKS0+YWlfYWRkciwgMCwgKGdhaV9hZmQpLT5hX3NvY2tsZW4pO1wKKyAgICAoYWkpLT5haV9hZGRyLT5zYV9sZW4gPSAoYWkpLT5haV9hZGRybGVuID0gKGdhaV9hZmQpLT5hX3NvY2tsZW47XAorICAgIChhaSktPmFpX2FkZHItPnNhX2ZhbWlseSA9IChhaSktPmFpX2ZhbWlseSA9IChnYWlfYWZkKS0+YV9hZjtcCisgICAgKChzdHJ1Y3Qgc29ja2luZXQgKikoYWkpLT5haV9hZGRyKS0+c2lfcG9ydCA9IHBvcnQ7XAorICAgIHAgPSAoY2hhciAqKSgoYWkpLT5haV9hZGRyKTtcCisgICAgbWVtY3B5KHAgKyAoZ2FpX2FmZCktPmFfb2ZmLCAoYWRkciksIChnYWlfYWZkKS0+YV9hZGRybGVuKTtcCiB9CiAjZWxzZQogI2RlZmluZSBHRVRfQUkoYWksIGdhaV9hZmQsIGFkZHIsIHBvcnQpIHtcCi0JY2hhciAqcDtcCi0JaWYgKCgoYWkpID0gKHN0cnVjdCBhZGRyaW5mbyAqKW1hbGxvYyhzaXplb2Yoc3RydWN0IGFkZHJpbmZvKSArXAotCQkJCQkgICAgICAoKGdhaV9hZmQpLT5hX3NvY2tsZW4pKSlcCi0JICAgID09IE5VTEwpIGdvdG8gZnJlZTtcCi0JbWVtY3B5KGFpLCBwYWksIHNpemVvZihzdHJ1Y3QgYWRkcmluZm8pKTtcCi0JKGFpKS0+YWlfYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHIgKikoKGFpKSArIDEpO1wKLQltZW1zZXQoKGFpKS0+YWlfYWRkciwgMCwgKGdhaV9hZmQpLT5hX3NvY2tsZW4pO1wKLQkoYWkpLT5haV9hZGRybGVuID0gKGdhaV9hZmQpLT5hX3NvY2tsZW47XAotCShhaSktPmFpX2FkZHItPnNhX2ZhbWlseSA9IChhaSktPmFpX2ZhbWlseSA9IChnYWlfYWZkKS0+YV9hZjtcCi0JKChzdHJ1Y3Qgc29ja2luZXQgKikoYWkpLT5haV9hZGRyKS0+c2lfcG9ydCA9IHBvcnQ7XAotCXAgPSAoY2hhciAqKSgoYWkpLT5haV9hZGRyKTtcCi0JbWVtY3B5KHAgKyAoZ2FpX2FmZCktPmFfb2ZmLCAoYWRkciksIChnYWlfYWZkKS0+YV9hZGRybGVuKTtcCisgICAgY2hhciAqcDtcCisgICAgaWYgKCgoYWkpID0gKHN0cnVjdCBhZGRyaW5mbyAqKW1hbGxvYyhzaXplb2Yoc3RydWN0IGFkZHJpbmZvKSArXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChnYWlfYWZkKS0+YV9zb2NrbGVuKSkpXAorICAgICAgICA9PSBOVUxMKSBnb3RvIGZyZWU7XAorICAgIG1lbWNweShhaSwgcGFpLCBzaXplb2Yoc3RydWN0IGFkZHJpbmZvKSk7XAorICAgIChhaSktPmFpX2FkZHIgPSAoc3RydWN0IHNvY2thZGRyICopKChhaSkgKyAxKTtcCisgICAgbWVtc2V0KChhaSktPmFpX2FkZHIsIDAsIChnYWlfYWZkKS0+YV9zb2NrbGVuKTtcCisgICAgKGFpKS0+YWlfYWRkcmxlbiA9IChnYWlfYWZkKS0+YV9zb2NrbGVuO1wKKyAgICAoYWkpLT5haV9hZGRyLT5zYV9mYW1pbHkgPSAoYWkpLT5haV9mYW1pbHkgPSAoZ2FpX2FmZCktPmFfYWY7XAorICAgICgoc3RydWN0IHNvY2tpbmV0ICopKGFpKS0+YWlfYWRkciktPnNpX3BvcnQgPSBwb3J0O1wKKyAgICBwID0gKGNoYXIgKikoKGFpKS0+YWlfYWRkcik7XAorICAgIG1lbWNweShwICsgKGdhaV9hZmQpLT5hX29mZiwgKGFkZHIpLCAoZ2FpX2FmZCktPmFfYWRkcmxlbik7XAogfQogI2VuZGlmCiAKQEAgLTIwMSw0MzggKzIwMSw0MzggQEAKIGNoYXIgKgogZ2FpX3N0cmVycm9yKGludCBlY29kZSkKIHsKLQlpZiAoZWNvZGUgPCAwIHx8IGVjb2RlID4gRUFJX01BWCkKLQkJZWNvZGUgPSBFQUlfTUFYOwotCXJldHVybiBhaV9lcnJsaXN0W2Vjb2RlXTsKKyAgICBpZiAoZWNvZGUgPCAwIHx8IGVjb2RlID4gRUFJX01BWCkKKyAgICAgICAgZWNvZGUgPSBFQUlfTUFYOworICAgIHJldHVybiBhaV9lcnJsaXN0W2Vjb2RlXTsKIH0KIAogdm9pZAogZnJlZWFkZHJpbmZvKHN0cnVjdCBhZGRyaW5mbyAqYWkpCiB7Ci0Jc3RydWN0IGFkZHJpbmZvICpuZXh0OworICAgIHN0cnVjdCBhZGRyaW5mbyAqbmV4dDsKIAotCWRvIHsKLQkJbmV4dCA9IGFpLT5haV9uZXh0OwotCQlpZiAoYWktPmFpX2Nhbm9ubmFtZSkKLQkJCWZyZWUoYWktPmFpX2Nhbm9ubmFtZSk7Ci0JCS8qIG5vIG5lZWQgdG8gZnJlZShhaS0+YWlfYWRkcikgKi8KLQkJZnJlZShhaSk7Ci0JfSB3aGlsZSAoKGFpID0gbmV4dCkgIT0gTlVMTCk7CisgICAgZG8geworICAgICAgICBuZXh0ID0gYWktPmFpX25leHQ7CisgICAgICAgIGlmIChhaS0+YWlfY2Fub25uYW1lKQorICAgICAgICAgICAgZnJlZShhaS0+YWlfY2Fub25uYW1lKTsKKyAgICAgICAgLyogbm8gbmVlZCB0byBmcmVlKGFpLT5haV9hZGRyKSAqLworICAgICAgICBmcmVlKGFpKTsKKyAgICB9IHdoaWxlICgoYWkgPSBuZXh0KSAhPSBOVUxMKTsKIH0KIAogc3RhdGljIGludAogc3RyX2lzbnVtYmVyKGNvbnN0IGNoYXIgKnApCiB7Ci0JdW5zaWduZWQgY2hhciAqcSA9ICh1bnNpZ25lZCBjaGFyICopcDsKLQl3aGlsZSAoKnEpIHsKLQkJaWYgKCEgaXNkaWdpdCgqcSkpCi0JCQlyZXR1cm4gTk87Ci0JCXErKzsKLQl9Ci0JcmV0dXJuIFlFUzsKKyAgICB1bnNpZ25lZCBjaGFyICpxID0gKHVuc2lnbmVkIGNoYXIgKilwOworICAgIHdoaWxlICgqcSkgeworICAgICAgICBpZiAoISBpc2RpZ2l0KCpxKSkKKyAgICAgICAgICAgIHJldHVybiBOTzsKKyAgICAgICAgcSsrOworICAgIH0KKyAgICByZXR1cm4gWUVTOwogfQogCiBpbnQKIGdldGFkZHJpbmZvKGNvbnN0IGNoYXIqaG9zdG5hbWUsIGNvbnN0IGNoYXIqc2Vydm5hbWUsCiAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYWRkcmluZm8gKmhpbnRzLCBzdHJ1Y3QgYWRkcmluZm8gKipyZXMpCiB7Ci0Jc3RydWN0IGFkZHJpbmZvIHNlbnRpbmVsOwotCXN0cnVjdCBhZGRyaW5mbyAqdG9wID0gTlVMTDsKLQlzdHJ1Y3QgYWRkcmluZm8gKmN1cjsKLQlpbnQgaSwgZXJyb3IgPSAwOwotCWNoYXIgcHRvbltQVE9OX01BWF07Ci0Jc3RydWN0IGFkZHJpbmZvIGFpOwotCXN0cnVjdCBhZGRyaW5mbyAqcGFpOwotCXVfc2hvcnQgcG9ydDsKKyAgICBzdHJ1Y3QgYWRkcmluZm8gc2VudGluZWw7CisgICAgc3RydWN0IGFkZHJpbmZvICp0b3AgPSBOVUxMOworICAgIHN0cnVjdCBhZGRyaW5mbyAqY3VyOworICAgIGludCBpLCBlcnJvciA9IDA7CisgICAgY2hhciBwdG9uW1BUT05fTUFYXTsKKyAgICBzdHJ1Y3QgYWRkcmluZm8gYWk7CisgICAgc3RydWN0IGFkZHJpbmZvICpwYWk7CisgICAgdV9zaG9ydCBwb3J0OwogCiAjaWZkZWYgRkFJVEgKLQlzdGF0aWMgaW50IGZpcnN0dGltZSA9IDE7CisgICAgc3RhdGljIGludCBmaXJzdHRpbWUgPSAxOwogCi0JaWYgKGZpcnN0dGltZSkgewotCQkvKiB0cmFuc2xhdG9yIGhhY2sgKi8KLQkJewotCQkJY2hhciAqcSA9IGdldGVudigiR0FJIik7Ci0JCQlpZiAocSAmJiBpbmV0X3B0b24oQUZfSU5FVDYsIHEsICZmYWl0aF9wcmVmaXgpID09IDEpCi0JCQkJdHJhbnNsYXRlID0gWUVTOwotCQl9Ci0JCWZpcnN0dGltZSA9IDA7Ci0JfQorICAgIGlmIChmaXJzdHRpbWUpIHsKKyAgICAgICAgLyogdHJhbnNsYXRvciBoYWNrICovCisgICAgICAgIHsKKyAgICAgICAgICAgIGNoYXIgKnEgPSBnZXRlbnYoIkdBSSIpOworICAgICAgICAgICAgaWYgKHEgJiYgaW5ldF9wdG9uKEFGX0lORVQ2LCBxLCAmZmFpdGhfcHJlZml4KSA9PSAxKQorICAgICAgICAgICAgICAgIHRyYW5zbGF0ZSA9IFlFUzsKKyAgICAgICAgfQorICAgICAgICBmaXJzdHRpbWUgPSAwOworICAgIH0KICNlbmRpZgogCi0JLyogaW5pdGlhbGl6ZSBmaWxlIHN0YXRpYyB2YXJzICovCi0Jc2VudGluZWwuYWlfbmV4dCA9IE5VTEw7Ci0JY3VyID0gJnNlbnRpbmVsOwotCXBhaSA9ICZhaTsKLQlwYWktPmFpX2ZsYWdzID0gMDsKLQlwYWktPmFpX2ZhbWlseSA9IFBGX1VOU1BFQzsKLQlwYWktPmFpX3NvY2t0eXBlID0gR0FJX0FOWTsKLQlwYWktPmFpX3Byb3RvY29sID0gR0FJX0FOWTsKLQlwYWktPmFpX2FkZHJsZW4gPSAwOwotCXBhaS0+YWlfY2Fub25uYW1lID0gTlVMTDsKLQlwYWktPmFpX2FkZHIgPSBOVUxMOwotCXBhaS0+YWlfbmV4dCA9IE5VTEw7Ci0JcG9ydCA9IEdBSV9BTlk7Ci0JCi0JaWYgKGhvc3RuYW1lID09IE5VTEwgJiYgc2Vydm5hbWUgPT0gTlVMTCkKLQkJcmV0dXJuIEVBSV9OT05BTUU7Ci0JaWYgKGhpbnRzKSB7Ci0JCS8qIGVycm9yIGNoZWNrIGZvciBoaW50cyAqLwotCQlpZiAoaGludHMtPmFpX2FkZHJsZW4gfHwgaGludHMtPmFpX2Nhbm9ubmFtZSB8fAotCQkgICAgaGludHMtPmFpX2FkZHIgfHwgaGludHMtPmFpX25leHQpCi0JCQlFUlIoRUFJX0JBREhJTlRTKTsgLyogeHh4ICovCi0JCWlmIChoaW50cy0+YWlfZmxhZ3MgJiB+QUlfTUFTSykKLQkJCUVSUihFQUlfQkFERkxBR1MpOwotCQlzd2l0Y2ggKGhpbnRzLT5haV9mYW1pbHkpIHsKLQkJY2FzZSBQRl9VTlNQRUM6Ci0JCWNhc2UgUEZfSU5FVDoKKyAgICAvKiBpbml0aWFsaXplIGZpbGUgc3RhdGljIHZhcnMgKi8KKyAgICBzZW50aW5lbC5haV9uZXh0ID0gTlVMTDsKKyAgICBjdXIgPSAmc2VudGluZWw7CisgICAgcGFpID0gJmFpOworICAgIHBhaS0+YWlfZmxhZ3MgPSAwOworICAgIHBhaS0+YWlfZmFtaWx5ID0gUEZfVU5TUEVDOworICAgIHBhaS0+YWlfc29ja3R5cGUgPSBHQUlfQU5ZOworICAgIHBhaS0+YWlfcHJvdG9jb2wgPSBHQUlfQU5ZOworICAgIHBhaS0+YWlfYWRkcmxlbiA9IDA7CisgICAgcGFpLT5haV9jYW5vbm5hbWUgPSBOVUxMOworICAgIHBhaS0+YWlfYWRkciA9IE5VTEw7CisgICAgcGFpLT5haV9uZXh0ID0gTlVMTDsKKyAgICBwb3J0ID0gR0FJX0FOWTsKKworICAgIGlmIChob3N0bmFtZSA9PSBOVUxMICYmIHNlcnZuYW1lID09IE5VTEwpCisgICAgICAgIHJldHVybiBFQUlfTk9OQU1FOworICAgIGlmIChoaW50cykgeworICAgICAgICAvKiBlcnJvciBjaGVjayBmb3IgaGludHMgKi8KKyAgICAgICAgaWYgKGhpbnRzLT5haV9hZGRybGVuIHx8IGhpbnRzLT5haV9jYW5vbm5hbWUgfHwKKyAgICAgICAgICAgIGhpbnRzLT5haV9hZGRyIHx8IGhpbnRzLT5haV9uZXh0KQorICAgICAgICAgICAgRVJSKEVBSV9CQURISU5UUyk7IC8qIHh4eCAqLworICAgICAgICBpZiAoaGludHMtPmFpX2ZsYWdzICYgfkFJX01BU0spCisgICAgICAgICAgICBFUlIoRUFJX0JBREZMQUdTKTsKKyAgICAgICAgc3dpdGNoIChoaW50cy0+YWlfZmFtaWx5KSB7CisgICAgICAgIGNhc2UgUEZfVU5TUEVDOgorICAgICAgICBjYXNlIFBGX0lORVQ6CiAjaWZkZWYgRU5BQkxFX0lQVjYKLQkJY2FzZSBQRl9JTkVUNjoKKyAgICAgICAgY2FzZSBQRl9JTkVUNjoKICNlbmRpZgotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlFUlIoRUFJX0ZBTUlMWSk7Ci0JCX0KLQkJbWVtY3B5KHBhaSwgaGludHMsIHNpemVvZigqcGFpKSk7Ci0JCXN3aXRjaCAocGFpLT5haV9zb2NrdHlwZSkgewotCQljYXNlIEdBSV9BTlk6Ci0JCQlzd2l0Y2ggKHBhaS0+YWlfcHJvdG9jb2wpIHsKLQkJCWNhc2UgR0FJX0FOWToKLQkJCQlicmVhazsKLQkJCWNhc2UgSVBQUk9UT19VRFA6Ci0JCQkJcGFpLT5haV9zb2NrdHlwZSA9IFNPQ0tfREdSQU07Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElQUFJPVE9fVENQOgotCQkJCXBhaS0+YWlfc29ja3R5cGUgPSBTT0NLX1NUUkVBTTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJcGFpLT5haV9zb2NrdHlwZSA9IFNPQ0tfUkFXOwotCQkJCWJyZWFrOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgU09DS19SQVc6Ci0JCQlicmVhazsKLQkJY2FzZSBTT0NLX0RHUkFNOgotCQkJaWYgKHBhaS0+YWlfcHJvdG9jb2wgIT0gSVBQUk9UT19VRFAgJiYKLQkJCSAgICBwYWktPmFpX3Byb3RvY29sICE9IEdBSV9BTlkpCi0JCQkJRVJSKEVBSV9CQURISU5UUyk7CS8qeHh4Ki8KLQkJCXBhaS0+YWlfcHJvdG9jb2wgPSBJUFBST1RPX1VEUDsKLQkJCWJyZWFrOwotCQljYXNlIFNPQ0tfU1RSRUFNOgotCQkJaWYgKHBhaS0+YWlfcHJvdG9jb2wgIT0gSVBQUk9UT19UQ1AgJiYKLQkJCSAgICBwYWktPmFpX3Byb3RvY29sICE9IEdBSV9BTlkpCi0JCQkJRVJSKEVBSV9CQURISU5UUyk7CS8qeHh4Ki8KLQkJCXBhaS0+YWlfcHJvdG9jb2wgPSBJUFBST1RPX1RDUDsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJRVJSKEVBSV9TT0NLVFlQRSk7Ci0JCQkvKiB1bnJlYWNoYWJsZSAqLwotCQl9Ci0JfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBFUlIoRUFJX0ZBTUlMWSk7CisgICAgICAgIH0KKyAgICAgICAgbWVtY3B5KHBhaSwgaGludHMsIHNpemVvZigqcGFpKSk7CisgICAgICAgIHN3aXRjaCAocGFpLT5haV9zb2NrdHlwZSkgeworICAgICAgICBjYXNlIEdBSV9BTlk6CisgICAgICAgICAgICBzd2l0Y2ggKHBhaS0+YWlfcHJvdG9jb2wpIHsKKyAgICAgICAgICAgIGNhc2UgR0FJX0FOWToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSVBQUk9UT19VRFA6CisgICAgICAgICAgICAgICAgcGFpLT5haV9zb2NrdHlwZSA9IFNPQ0tfREdSQU07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIElQUFJPVE9fVENQOgorICAgICAgICAgICAgICAgIHBhaS0+YWlfc29ja3R5cGUgPSBTT0NLX1NUUkVBTTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcGFpLT5haV9zb2NrdHlwZSA9IFNPQ0tfUkFXOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU09DS19SQVc6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTT0NLX0RHUkFNOgorICAgICAgICAgICAgaWYgKHBhaS0+YWlfcHJvdG9jb2wgIT0gSVBQUk9UT19VRFAgJiYKKyAgICAgICAgICAgICAgICBwYWktPmFpX3Byb3RvY29sICE9IEdBSV9BTlkpCisgICAgICAgICAgICAgICAgRVJSKEVBSV9CQURISU5UUyk7ICAgICAgICAgICAgICAgICAgICAgIC8qeHh4Ki8KKyAgICAgICAgICAgIHBhaS0+YWlfcHJvdG9jb2wgPSBJUFBST1RPX1VEUDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNPQ0tfU1RSRUFNOgorICAgICAgICAgICAgaWYgKHBhaS0+YWlfcHJvdG9jb2wgIT0gSVBQUk9UT19UQ1AgJiYKKyAgICAgICAgICAgICAgICBwYWktPmFpX3Byb3RvY29sICE9IEdBSV9BTlkpCisgICAgICAgICAgICAgICAgRVJSKEVBSV9CQURISU5UUyk7ICAgICAgICAgICAgICAgICAgICAgIC8qeHh4Ki8KKyAgICAgICAgICAgIHBhaS0+YWlfcHJvdG9jb2wgPSBJUFBST1RPX1RDUDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgRVJSKEVBSV9TT0NLVFlQRSk7CisgICAgICAgICAgICAvKiB1bnJlYWNoYWJsZSAqLworICAgICAgICB9CisgICAgfQogCi0JLyoKLQkgKiBzZXJ2aWNlIHBvcnQKLQkgKi8KLQlpZiAoc2Vydm5hbWUpIHsKLQkJaWYgKHN0cl9pc251bWJlcihzZXJ2bmFtZSkpIHsKLQkJCWlmIChwYWktPmFpX3NvY2t0eXBlID09IEdBSV9BTlkpIHsKLQkJCQkvKiBjYWxsZXIgYWNjZXB0ICpHQUlfQU5ZKiBzb2NrdHlwZSAqLwotCQkJCXBhaS0+YWlfc29ja3R5cGUgPSBTT0NLX0RHUkFNOwotCQkJCXBhaS0+YWlfcHJvdG9jb2wgPSBJUFBST1RPX1VEUDsKLQkJCX0KLQkJCXBvcnQgPSBodG9ucygodV9zaG9ydClhdG9pKHNlcnZuYW1lKSk7Ci0JCX0gZWxzZSB7Ci0JCQlzdHJ1Y3Qgc2VydmVudCAqc3A7Ci0JCQljaGFyICpwcm90bzsKKyAgICAvKgorICAgICAqIHNlcnZpY2UgcG9ydAorICAgICAqLworICAgIGlmIChzZXJ2bmFtZSkgeworICAgICAgICBpZiAoc3RyX2lzbnVtYmVyKHNlcnZuYW1lKSkgeworICAgICAgICAgICAgaWYgKHBhaS0+YWlfc29ja3R5cGUgPT0gR0FJX0FOWSkgeworICAgICAgICAgICAgICAgIC8qIGNhbGxlciBhY2NlcHQgKkdBSV9BTlkqIHNvY2t0eXBlICovCisgICAgICAgICAgICAgICAgcGFpLT5haV9zb2NrdHlwZSA9IFNPQ0tfREdSQU07CisgICAgICAgICAgICAgICAgcGFpLT5haV9wcm90b2NvbCA9IElQUFJPVE9fVURQOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcG9ydCA9IGh0b25zKCh1X3Nob3J0KWF0b2koc2Vydm5hbWUpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0cnVjdCBzZXJ2ZW50ICpzcDsKKyAgICAgICAgICAgIGNoYXIgKnByb3RvOwogCi0JCQlwcm90byA9IE5VTEw7Ci0JCQlzd2l0Y2ggKHBhaS0+YWlfc29ja3R5cGUpIHsKLQkJCWNhc2UgR0FJX0FOWToKLQkJCQlwcm90byA9IE5VTEw7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFNPQ0tfREdSQU06Ci0JCQkJcHJvdG8gPSAidWRwIjsKLQkJCQlicmVhazsKLQkJCWNhc2UgU09DS19TVFJFQU06Ci0JCQkJcHJvdG8gPSAidGNwIjsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJZnByaW50ZihzdGRlcnIsICJwYW5pYyFcbiIpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKChzcCA9IGdldHNlcnZieW5hbWUoc2Vydm5hbWUsIHByb3RvKSkgPT0gTlVMTCkKLQkJCQlFUlIoRUFJX1NFUlZJQ0UpOwotCQkJcG9ydCA9IHNwLT5zX3BvcnQ7Ci0JCQlpZiAocGFpLT5haV9zb2NrdHlwZSA9PSBHQUlfQU5ZKSB7Ci0JCQkJaWYgKHN0cmNtcChzcC0+c19wcm90bywgInVkcCIpID09IDApIHsKLQkJCQkJcGFpLT5haV9zb2NrdHlwZSA9IFNPQ0tfREdSQU07Ci0JCQkJCXBhaS0+YWlfcHJvdG9jb2wgPSBJUFBST1RPX1VEUDsKLQkJCQl9IGVsc2UgaWYgKHN0cmNtcChzcC0+c19wcm90bywgInRjcCIpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWktPmFpX3NvY2t0eXBlID0gU09DS19TVFJFQU07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFpLT5haV9wcm90b2NvbCA9IElQUFJPVE9fVENQOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFUlIoRUFJX1BST1RPQ09MKTsJLyp4eHgqLwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCQl9Ci0JfQotCQotCS8qCi0JICogaG9zdG5hbWUgPT0gTlVMTC4KLQkgKiBwYXNzaXZlIHNvY2tldCAtPiBhbnlhZGRyICgwLjAuMC4wIG9yIDo6KQotCSAqIG5vbi1wYXNzaXZlIHNvY2tldCAtPiBsb2NhbGhvc3QgKDEyNy4wLjAuMSBvciA6OjEpCi0JICovCi0JaWYgKGhvc3RuYW1lID09IE5VTEwpIHsKLQkJc3RydWN0IGdhaV9hZmQgKmdhaV9hZmQ7CisgICAgICAgICAgICBwcm90byA9IE5VTEw7CisgICAgICAgICAgICBzd2l0Y2ggKHBhaS0+YWlfc29ja3R5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgR0FJX0FOWToKKyAgICAgICAgICAgICAgICBwcm90byA9IE5VTEw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNPQ0tfREdSQU06CisgICAgICAgICAgICAgICAgcHJvdG8gPSAidWRwIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU09DS19TVFJFQU06CisgICAgICAgICAgICAgICAgcHJvdG8gPSAidGNwIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJwYW5pYyFcbiIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChzcCA9IGdldHNlcnZieW5hbWUoc2Vydm5hbWUsIHByb3RvKSkgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBFUlIoRUFJX1NFUlZJQ0UpOworICAgICAgICAgICAgcG9ydCA9IHNwLT5zX3BvcnQ7CisgICAgICAgICAgICBpZiAocGFpLT5haV9zb2NrdHlwZSA9PSBHQUlfQU5ZKSB7CisgICAgICAgICAgICAgICAgaWYgKHN0cmNtcChzcC0+c19wcm90bywgInVkcCIpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcGFpLT5haV9zb2NrdHlwZSA9IFNPQ0tfREdSQU07CisgICAgICAgICAgICAgICAgICAgIHBhaS0+YWlfcHJvdG9jb2wgPSBJUFBST1RPX1VEUDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChzcC0+c19wcm90bywgInRjcCIpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcGFpLT5haV9zb2NrdHlwZSA9IFNPQ0tfU1RSRUFNOworICAgICAgICAgICAgICAgICAgICBwYWktPmFpX3Byb3RvY29sID0gSVBQUk9UT19UQ1A7CisgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgIEVSUihFQUlfUFJPVE9DT0wpOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyp4eHgqLworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogCi0JCWZvciAoZ2FpX2FmZCA9ICZnYWlfYWZkbFswXTsgZ2FpX2FmZC0+YV9hZjsgZ2FpX2FmZCsrKSB7Ci0JCQlpZiAoIShwYWktPmFpX2ZhbWlseSA9PSBQRl9VTlNQRUMKLQkJCSAgIHx8IHBhaS0+YWlfZmFtaWx5ID09IGdhaV9hZmQtPmFfYWYpKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9CisgICAgLyoKKyAgICAgKiBob3N0bmFtZSA9PSBOVUxMLgorICAgICAqIHBhc3NpdmUgc29ja2V0IC0+IGFueWFkZHIgKDAuMC4wLjAgb3IgOjopCisgICAgICogbm9uLXBhc3NpdmUgc29ja2V0IC0+IGxvY2FsaG9zdCAoMTI3LjAuMC4xIG9yIDo6MSkKKyAgICAgKi8KKyAgICBpZiAoaG9zdG5hbWUgPT0gTlVMTCkgeworICAgICAgICBzdHJ1Y3QgZ2FpX2FmZCAqZ2FpX2FmZDsKIAotCQkJaWYgKHBhaS0+YWlfZmxhZ3MgJiBBSV9QQVNTSVZFKSB7Ci0JCQkJR0VUX0FJKGN1ci0+YWlfbmV4dCwgZ2FpX2FmZCwgZ2FpX2FmZC0+YV9hZGRyYW55LCBwb3J0KTsKLQkJCQkvKiB4eHggbWVhbmluZ2xlc3M/Ci0JCQkJICogR0VUX0NBTk9OTkFNRShjdXItPmFpX25leHQsICJhbnlhZGRyIik7Ci0JCQkJICovCi0JCQl9IGVsc2UgewotCQkJCUdFVF9BSShjdXItPmFpX25leHQsIGdhaV9hZmQsIGdhaV9hZmQtPmFfbG9vcGJhY2ssCi0JCQkJCXBvcnQpOwotCQkJCS8qIHh4eCBtZWFuaW5nbGVzcz8KLQkJCQkgKiBHRVRfQ0FOT05OQU1FKGN1ci0+YWlfbmV4dCwgImxvY2FsaG9zdCIpOwotCQkJCSAqLwotCQkJfQotCQkJY3VyID0gY3VyLT5haV9uZXh0OwotCQl9Ci0JCXRvcCA9IHNlbnRpbmVsLmFpX25leHQ7Ci0JCWlmICh0b3ApCi0JCQlnb3RvIGdvb2Q7Ci0JCWVsc2UKLQkJCUVSUihFQUlfRkFNSUxZKTsKLQl9Ci0JCi0JLyogaG9zdG5hbWUgYXMgbnVtZXJpYyBuYW1lICovCi0JZm9yIChpID0gMDsgZ2FpX2FmZGxbaV0uYV9hZjsgaSsrKSB7Ci0JCWlmIChpbmV0X3B0b24oZ2FpX2FmZGxbaV0uYV9hZiwgaG9zdG5hbWUsIHB0b24pKSB7Ci0JCQl1X2xvbmcgdjRhOworICAgICAgICBmb3IgKGdhaV9hZmQgPSAmZ2FpX2FmZGxbMF07IGdhaV9hZmQtPmFfYWY7IGdhaV9hZmQrKykgeworICAgICAgICAgICAgaWYgKCEocGFpLT5haV9mYW1pbHkgPT0gUEZfVU5TUEVDCisgICAgICAgICAgICAgICB8fCBwYWktPmFpX2ZhbWlseSA9PSBnYWlfYWZkLT5hX2FmKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocGFpLT5haV9mbGFncyAmIEFJX1BBU1NJVkUpIHsKKyAgICAgICAgICAgICAgICBHRVRfQUkoY3VyLT5haV9uZXh0LCBnYWlfYWZkLCBnYWlfYWZkLT5hX2FkZHJhbnksIHBvcnQpOworICAgICAgICAgICAgICAgIC8qIHh4eCBtZWFuaW5nbGVzcz8KKyAgICAgICAgICAgICAgICAgKiBHRVRfQ0FOT05OQU1FKGN1ci0+YWlfbmV4dCwgImFueWFkZHIiKTsKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgR0VUX0FJKGN1ci0+YWlfbmV4dCwgZ2FpX2FmZCwgZ2FpX2FmZC0+YV9sb29wYmFjaywKKyAgICAgICAgICAgICAgICAgICAgcG9ydCk7CisgICAgICAgICAgICAgICAgLyogeHh4IG1lYW5pbmdsZXNzPworICAgICAgICAgICAgICAgICAqIEdFVF9DQU5PTk5BTUUoY3VyLT5haV9uZXh0LCAibG9jYWxob3N0Iik7CisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBjdXIgPSBjdXItPmFpX25leHQ7CisgICAgICAgIH0KKyAgICAgICAgdG9wID0gc2VudGluZWwuYWlfbmV4dDsKKyAgICAgICAgaWYgKHRvcCkKKyAgICAgICAgICAgIGdvdG8gZ29vZDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgRVJSKEVBSV9GQU1JTFkpOworICAgIH0KKworICAgIC8qIGhvc3RuYW1lIGFzIG51bWVyaWMgbmFtZSAqLworICAgIGZvciAoaSA9IDA7IGdhaV9hZmRsW2ldLmFfYWY7IGkrKykgeworICAgICAgICBpZiAoaW5ldF9wdG9uKGdhaV9hZmRsW2ldLmFfYWYsIGhvc3RuYW1lLCBwdG9uKSkgeworICAgICAgICAgICAgdV9sb25nIHY0YTsKICNpZmRlZiBFTkFCTEVfSVBWNgotCQkJdV9jaGFyIHBmeDsKKyAgICAgICAgICAgIHVfY2hhciBwZng7CiAjZW5kaWYKIAotCQkJc3dpdGNoIChnYWlfYWZkbFtpXS5hX2FmKSB7Ci0JCQljYXNlIEFGX0lORVQ6Ci0JCQkJdjRhID0gKChzdHJ1Y3QgaW5fYWRkciAqKXB0b24pLT5zX2FkZHI7Ci0JCQkJdjRhID0gbnRvaGwodjRhKTsKLQkJCQlpZiAoSU5fTVVMVElDQVNUKHY0YSkgfHwgSU5fRVhQRVJJTUVOVEFMKHY0YSkpCi0JCQkJCXBhaS0+YWlfZmxhZ3MgJj0gfkFJX0NBTk9OTkFNRTsKLQkJCQl2NGEgPj49IElOX0NMQVNTQV9OU0hJRlQ7Ci0JCQkJaWYgKHY0YSA9PSAwIHx8IHY0YSA9PSBJTl9MT09QQkFDS05FVCkKLQkJCQkJcGFpLT5haV9mbGFncyAmPSB+QUlfQ0FOT05OQU1FOwotCQkJCWJyZWFrOworICAgICAgICAgICAgc3dpdGNoIChnYWlfYWZkbFtpXS5hX2FmKSB7CisgICAgICAgICAgICBjYXNlIEFGX0lORVQ6CisgICAgICAgICAgICAgICAgdjRhID0gKChzdHJ1Y3QgaW5fYWRkciAqKXB0b24pLT5zX2FkZHI7CisgICAgICAgICAgICAgICAgdjRhID0gbnRvaGwodjRhKTsKKyAgICAgICAgICAgICAgICBpZiAoSU5fTVVMVElDQVNUKHY0YSkgfHwgSU5fRVhQRVJJTUVOVEFMKHY0YSkpCisgICAgICAgICAgICAgICAgICAgIHBhaS0+YWlfZmxhZ3MgJj0gfkFJX0NBTk9OTkFNRTsKKyAgICAgICAgICAgICAgICB2NGEgPj49IElOX0NMQVNTQV9OU0hJRlQ7CisgICAgICAgICAgICAgICAgaWYgKHY0YSA9PSAwIHx8IHY0YSA9PSBJTl9MT09QQkFDS05FVCkKKyAgICAgICAgICAgICAgICAgICAgcGFpLT5haV9mbGFncyAmPSB+QUlfQ0FOT05OQU1FOworICAgICAgICAgICAgICAgIGJyZWFrOwogI2lmZGVmIEVOQUJMRV9JUFY2Ci0JCQljYXNlIEFGX0lORVQ2OgotCQkJCXBmeCA9ICgoc3RydWN0IGluNl9hZGRyICopcHRvbiktPnM2X2FkZHI4WzBdOwotCQkJCWlmIChwZnggPT0gMCB8fCBwZnggPT0gMHhmZSB8fCBwZnggPT0gMHhmZikKLQkJCQkJcGFpLT5haV9mbGFncyAmPSB+QUlfQ0FOT05OQU1FOwotCQkJCWJyZWFrOworICAgICAgICAgICAgY2FzZSBBRl9JTkVUNjoKKyAgICAgICAgICAgICAgICBwZnggPSAoKHN0cnVjdCBpbjZfYWRkciAqKXB0b24pLT5zNl9hZGRyOFswXTsKKyAgICAgICAgICAgICAgICBpZiAocGZ4ID09IDAgfHwgcGZ4ID09IDB4ZmUgfHwgcGZ4ID09IDB4ZmYpCisgICAgICAgICAgICAgICAgICAgIHBhaS0+YWlfZmxhZ3MgJj0gfkFJX0NBTk9OTkFNRTsKKyAgICAgICAgICAgICAgICBicmVhazsKICNlbmRpZgotCQkJfQotCQkJCi0JCQlpZiAocGFpLT5haV9mYW1pbHkgPT0gZ2FpX2FmZGxbaV0uYV9hZiB8fAotCQkJICAgIHBhaS0+YWlfZmFtaWx5ID09IFBGX1VOU1BFQykgewotCQkJCWlmICghIChwYWktPmFpX2ZsYWdzICYgQUlfQ0FOT05OQU1FKSkgewotCQkJCQlHRVRfQUkodG9wLCAmZ2FpX2FmZGxbaV0sIHB0b24sIHBvcnQpOwotCQkJCQlnb3RvIGdvb2Q7Ci0JCQkJfQotCQkJCS8qCi0JCQkJICogaWYgQUlfQ0FOT05OQU1FIGFuZCBpZiByZXZlcnNlIGxvb2t1cAotCQkJCSAqIGZhaWwsIHJldHVybiBhaSBhbnl3YXkgdG8gcGFjaWZ5Ci0JCQkJICogY2FsbGluZyBhcHBsaWNhdGlvbi4KLQkJCQkgKgotCQkJCSAqIFhYWCBnZXRhZGRyaW5mbygpIGlzIGEgbmFtZS0+YWRkcmVzcwotCQkJCSAqIHRyYW5zbGF0aW9uIGZ1bmN0aW9uLCBhbmQgaXQgbG9va3Mgc3RyYW5nZQotCQkJCSAqIHRoYXQgd2UgZG8gYWRkci0+bmFtZSB0cmFuc2xhdGlvbiBoZXJlLgotCQkJCSAqLwotCQkJCWdldF9uYW1lKHB0b24sICZnYWlfYWZkbFtpXSwgJnRvcCwgcHRvbiwgcGFpLCBwb3J0KTsKLQkJCQlnb3RvIGdvb2Q7Ci0JCQl9IGVsc2UgCi0JCQkJRVJSKEVBSV9GQU1JTFkpOwkvKnh4eCovCi0JCX0KLQl9CisgICAgICAgICAgICB9CiAKLQlpZiAocGFpLT5haV9mbGFncyAmIEFJX05VTUVSSUNIT1NUKQotCQlFUlIoRUFJX05PTkFNRSk7CisgICAgICAgICAgICBpZiAocGFpLT5haV9mYW1pbHkgPT0gZ2FpX2FmZGxbaV0uYV9hZiB8fAorICAgICAgICAgICAgICAgIHBhaS0+YWlfZmFtaWx5ID09IFBGX1VOU1BFQykgeworICAgICAgICAgICAgICAgIGlmICghIChwYWktPmFpX2ZsYWdzICYgQUlfQ0FOT05OQU1FKSkgeworICAgICAgICAgICAgICAgICAgICBHRVRfQUkodG9wLCAmZ2FpX2FmZGxbaV0sIHB0b24sIHBvcnQpOworICAgICAgICAgICAgICAgICAgICBnb3RvIGdvb2Q7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogaWYgQUlfQ0FOT05OQU1FIGFuZCBpZiByZXZlcnNlIGxvb2t1cAorICAgICAgICAgICAgICAgICAqIGZhaWwsIHJldHVybiBhaSBhbnl3YXkgdG8gcGFjaWZ5CisgICAgICAgICAgICAgICAgICogY2FsbGluZyBhcHBsaWNhdGlvbi4KKyAgICAgICAgICAgICAgICAgKgorICAgICAgICAgICAgICAgICAqIFhYWCBnZXRhZGRyaW5mbygpIGlzIGEgbmFtZS0+YWRkcmVzcworICAgICAgICAgICAgICAgICAqIHRyYW5zbGF0aW9uIGZ1bmN0aW9uLCBhbmQgaXQgbG9va3Mgc3RyYW5nZQorICAgICAgICAgICAgICAgICAqIHRoYXQgd2UgZG8gYWRkci0+bmFtZSB0cmFuc2xhdGlvbiBoZXJlLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGdldF9uYW1lKHB0b24sICZnYWlfYWZkbFtpXSwgJnRvcCwgcHRvbiwgcGFpLCBwb3J0KTsKKyAgICAgICAgICAgICAgICBnb3RvIGdvb2Q7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICBFUlIoRUFJX0ZBTUlMWSk7ICAgICAgICAgICAgICAgICAgICAgICAgLyp4eHgqLworICAgICAgICB9CisgICAgfQogCi0JLyogaG9zdG5hbWUgYXMgYWxwaGFiZXRpY2FsIG5hbWUgKi8KLQllcnJvciA9IGdldF9hZGRyKGhvc3RuYW1lLCBwYWktPmFpX2ZhbWlseSwgJnRvcCwgcGFpLCBwb3J0KTsKLQlpZiAoZXJyb3IgPT0gMCkgewotCQlpZiAodG9wKSB7CisgICAgaWYgKHBhaS0+YWlfZmxhZ3MgJiBBSV9OVU1FUklDSE9TVCkKKyAgICAgICAgRVJSKEVBSV9OT05BTUUpOworCisgICAgLyogaG9zdG5hbWUgYXMgYWxwaGFiZXRpY2FsIG5hbWUgKi8KKyAgICBlcnJvciA9IGdldF9hZGRyKGhvc3RuYW1lLCBwYWktPmFpX2ZhbWlseSwgJnRvcCwgcGFpLCBwb3J0KTsKKyAgICBpZiAoZXJyb3IgPT0gMCkgeworICAgICAgICBpZiAodG9wKSB7CiAgZ29vZDoKLQkJCSpyZXMgPSB0b3A7Ci0JCQlyZXR1cm4gU1VDQ0VTUzsKLQkJfSBlbHNlCi0JCQllcnJvciA9IEVBSV9GQUlMOwotCX0KKyAgICAgICAgICAgICpyZXMgPSB0b3A7CisgICAgICAgICAgICByZXR1cm4gU1VDQ0VTUzsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBlcnJvciA9IEVBSV9GQUlMOworICAgIH0KICBmcmVlOgotCWlmICh0b3ApCi0JCWZyZWVhZGRyaW5mbyh0b3ApOworICAgIGlmICh0b3ApCisgICAgICAgIGZyZWVhZGRyaW5mbyh0b3ApOwogIGJhZDoKLQkqcmVzID0gTlVMTDsKLQlyZXR1cm4gZXJyb3I7CisgICAgKnJlcyA9IE5VTEw7CisgICAgcmV0dXJuIGVycm9yOwogfQogCiBzdGF0aWMgaW50CiBnZXRfbmFtZShhZGRyLCBnYWlfYWZkLCByZXMsIG51bWFkZHIsIHBhaSwgcG9ydDApCi0JY29uc3QgY2hhciAqYWRkcjsKLQlzdHJ1Y3QgZ2FpX2FmZCAqZ2FpX2FmZDsKLQlzdHJ1Y3QgYWRkcmluZm8gKipyZXM7Ci0JY2hhciAqbnVtYWRkcjsKLQlzdHJ1Y3QgYWRkcmluZm8gKnBhaTsKLQlpbnQgcG9ydDA7CisgICAgY29uc3QgY2hhciAqYWRkcjsKKyAgICBzdHJ1Y3QgZ2FpX2FmZCAqZ2FpX2FmZDsKKyAgICBzdHJ1Y3QgYWRkcmluZm8gKipyZXM7CisgICAgY2hhciAqbnVtYWRkcjsKKyAgICBzdHJ1Y3QgYWRkcmluZm8gKnBhaTsKKyAgICBpbnQgcG9ydDA7CiB7Ci0JdV9zaG9ydCBwb3J0ID0gcG9ydDAgJiAweGZmZmY7Ci0Jc3RydWN0IGhvc3RlbnQgKmhwOwotCXN0cnVjdCBhZGRyaW5mbyAqY3VyOwotCWludCBlcnJvciA9IDA7CisgICAgdV9zaG9ydCBwb3J0ID0gcG9ydDAgJiAweGZmZmY7CisgICAgc3RydWN0IGhvc3RlbnQgKmhwOworICAgIHN0cnVjdCBhZGRyaW5mbyAqY3VyOworICAgIGludCBlcnJvciA9IDA7CiAjaWZkZWYgRU5BQkxFX0lQVjYKLQlpbnQgaF9lcnJvcjsKKyAgICBpbnQgaF9lcnJvcjsKICNlbmRpZgotCQorCiAjaWZkZWYgRU5BQkxFX0lQVjYKLQlocCA9IGdldGlwbm9kZWJ5YWRkcihhZGRyLCBnYWlfYWZkLT5hX2FkZHJsZW4sIGdhaV9hZmQtPmFfYWYsICZoX2Vycm9yKTsKKyAgICBocCA9IGdldGlwbm9kZWJ5YWRkcihhZGRyLCBnYWlfYWZkLT5hX2FkZHJsZW4sIGdhaV9hZmQtPmFfYWYsICZoX2Vycm9yKTsKICNlbHNlCi0JaHAgPSBnZXRob3N0YnlhZGRyKGFkZHIsIGdhaV9hZmQtPmFfYWRkcmxlbiwgQUZfSU5FVCk7CisgICAgaHAgPSBnZXRob3N0YnlhZGRyKGFkZHIsIGdhaV9hZmQtPmFfYWRkcmxlbiwgQUZfSU5FVCk7CiAjZW5kaWYKLQlpZiAoaHAgJiYgaHAtPmhfbmFtZSAmJiBocC0+aF9uYW1lWzBdICYmIGhwLT5oX2FkZHJfbGlzdFswXSkgewotCQlHRVRfQUkoY3VyLCBnYWlfYWZkLCBocC0+aF9hZGRyX2xpc3RbMF0sIHBvcnQpOwotCQlHRVRfQ0FOT05OQU1FKGN1ciwgaHAtPmhfbmFtZSk7Ci0JfSBlbHNlCi0JCUdFVF9BSShjdXIsIGdhaV9hZmQsIG51bWFkZHIsIHBvcnQpOwotCQorICAgIGlmIChocCAmJiBocC0+aF9uYW1lICYmIGhwLT5oX25hbWVbMF0gJiYgaHAtPmhfYWRkcl9saXN0WzBdKSB7CisgICAgICAgIEdFVF9BSShjdXIsIGdhaV9hZmQsIGhwLT5oX2FkZHJfbGlzdFswXSwgcG9ydCk7CisgICAgICAgIEdFVF9DQU5PTk5BTUUoY3VyLCBocC0+aF9uYW1lKTsKKyAgICB9IGVsc2UKKyAgICAgICAgR0VUX0FJKGN1ciwgZ2FpX2FmZCwgbnVtYWRkciwgcG9ydCk7CisKICNpZmRlZiBFTkFCTEVfSVBWNgotCWlmIChocCkKLQkJZnJlZWhvc3RlbnQoaHApOworICAgIGlmIChocCkKKyAgICAgICAgZnJlZWhvc3RlbnQoaHApOwogI2VuZGlmCi0JKnJlcyA9IGN1cjsKLQlyZXR1cm4gU1VDQ0VTUzsKKyAgICAqcmVzID0gY3VyOworICAgIHJldHVybiBTVUNDRVNTOwogIGZyZWU6Ci0JaWYgKGN1cikKLQkJZnJlZWFkZHJpbmZvKGN1cik7CisgICAgaWYgKGN1cikKKyAgICAgICAgZnJlZWFkZHJpbmZvKGN1cik7CiAjaWZkZWYgRU5BQkxFX0lQVjYKLQlpZiAoaHApCi0JCWZyZWVob3N0ZW50KGhwKTsKKyAgICBpZiAoaHApCisgICAgICAgIGZyZWVob3N0ZW50KGhwKTsKICNlbmRpZgogIC8qIGJhZDogKi8KLQkqcmVzID0gTlVMTDsKLQlyZXR1cm4gZXJyb3I7CisgICAgKnJlcyA9IE5VTEw7CisgICAgcmV0dXJuIGVycm9yOwogfQogCiBzdGF0aWMgaW50CiBnZXRfYWRkcihob3N0bmFtZSwgYWYsIHJlcywgcGFpLCBwb3J0MCkKLQljb25zdCBjaGFyICpob3N0bmFtZTsKLQlpbnQgYWY7Ci0Jc3RydWN0IGFkZHJpbmZvICoqcmVzOwotCXN0cnVjdCBhZGRyaW5mbyAqcGFpOwotCWludCBwb3J0MDsKKyAgICBjb25zdCBjaGFyICpob3N0bmFtZTsKKyAgICBpbnQgYWY7CisgICAgc3RydWN0IGFkZHJpbmZvICoqcmVzOworICAgIHN0cnVjdCBhZGRyaW5mbyAqcGFpOworICAgIGludCBwb3J0MDsKIHsKLQl1X3Nob3J0IHBvcnQgPSBwb3J0MCAmIDB4ZmZmZjsKLQlzdHJ1Y3QgYWRkcmluZm8gc2VudGluZWw7Ci0Jc3RydWN0IGhvc3RlbnQgKmhwOwotCXN0cnVjdCBhZGRyaW5mbyAqdG9wLCAqY3VyOwotCXN0cnVjdCBnYWlfYWZkICpnYWlfYWZkOwotCWludCBpLCBlcnJvciA9IDAsIGhfZXJyb3I7Ci0JY2hhciAqYXA7CisgICAgdV9zaG9ydCBwb3J0ID0gcG9ydDAgJiAweGZmZmY7CisgICAgc3RydWN0IGFkZHJpbmZvIHNlbnRpbmVsOworICAgIHN0cnVjdCBob3N0ZW50ICpocDsKKyAgICBzdHJ1Y3QgYWRkcmluZm8gKnRvcCwgKmN1cjsKKyAgICBzdHJ1Y3QgZ2FpX2FmZCAqZ2FpX2FmZDsKKyAgICBpbnQgaSwgZXJyb3IgPSAwLCBoX2Vycm9yOworICAgIGNoYXIgKmFwOwogCi0JdG9wID0gTlVMTDsKLQlzZW50aW5lbC5haV9uZXh0ID0gTlVMTDsKLQljdXIgPSAmc2VudGluZWw7CisgICAgdG9wID0gTlVMTDsKKyAgICBzZW50aW5lbC5haV9uZXh0ID0gTlVMTDsKKyAgICBjdXIgPSAmc2VudGluZWw7CiAjaWZkZWYgRU5BQkxFX0lQVjYKLQlpZiAoYWYgPT0gQUZfVU5TUEVDKSB7Ci0JCWhwID0gZ2V0aXBub2RlYnluYW1lKGhvc3RuYW1lLCBBRl9JTkVUNiwKLQkJCQlBSV9BRERSQ09ORklHfEFJX0FMTHxBSV9WNE1BUFBFRCwgJmhfZXJyb3IpOwotCX0gZWxzZQotCQlocCA9IGdldGlwbm9kZWJ5bmFtZShob3N0bmFtZSwgYWYsIEFJX0FERFJDT05GSUcsICZoX2Vycm9yKTsKKyAgICBpZiAoYWYgPT0gQUZfVU5TUEVDKSB7CisgICAgICAgIGhwID0gZ2V0aXBub2RlYnluYW1lKGhvc3RuYW1lLCBBRl9JTkVUNiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFJX0FERFJDT05GSUd8QUlfQUxMfEFJX1Y0TUFQUEVELCAmaF9lcnJvcik7CisgICAgfSBlbHNlCisgICAgICAgIGhwID0gZ2V0aXBub2RlYnluYW1lKGhvc3RuYW1lLCBhZiwgQUlfQUREUkNPTkZJRywgJmhfZXJyb3IpOwogI2Vsc2UKLQlocCA9IGdldGhvc3RieW5hbWUoaG9zdG5hbWUpOwotCWhfZXJyb3IgPSBoX2Vycm5vOworICAgIGhwID0gZ2V0aG9zdGJ5bmFtZShob3N0bmFtZSk7CisgICAgaF9lcnJvciA9IGhfZXJybm87CiAjZW5kaWYKLQlpZiAoaHAgPT0gTlVMTCkgewotCQlzd2l0Y2ggKGhfZXJyb3IpIHsKLQkJY2FzZSBIT1NUX05PVF9GT1VORDoKLQkJY2FzZSBOT19EQVRBOgotCQkJZXJyb3IgPSBFQUlfTk9EQVRBOwotCQkJYnJlYWs7Ci0JCWNhc2UgVFJZX0FHQUlOOgotCQkJZXJyb3IgPSBFQUlfQUdBSU47Ci0JCQlicmVhazsKLQkJY2FzZSBOT19SRUNPVkVSWToKLQkJZGVmYXVsdDoKLQkJCWVycm9yID0gRUFJX0ZBSUw7Ci0JCQlicmVhazsKLQkJfQotCQlnb3RvIGZyZWU7Ci0JfQorICAgIGlmIChocCA9PSBOVUxMKSB7CisgICAgICAgIHN3aXRjaCAoaF9lcnJvcikgeworICAgICAgICBjYXNlIEhPU1RfTk9UX0ZPVU5EOgorICAgICAgICBjYXNlIE5PX0RBVEE6CisgICAgICAgICAgICBlcnJvciA9IEVBSV9OT0RBVEE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBUUllfQUdBSU46CisgICAgICAgICAgICBlcnJvciA9IEVBSV9BR0FJTjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE5PX1JFQ09WRVJZOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZXJyb3IgPSBFQUlfRkFJTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGdvdG8gZnJlZTsKKyAgICB9CiAKLQlpZiAoKGhwLT5oX25hbWUgPT0gTlVMTCkgfHwgKGhwLT5oX25hbWVbMF0gPT0gMCkgfHwKLQkgICAgKGhwLT5oX2FkZHJfbGlzdFswXSA9PSBOVUxMKSkgewotCQllcnJvciA9IEVBSV9GQUlMOwotCQlnb3RvIGZyZWU7Ci0JfQotCQotCWZvciAoaSA9IDA7IChhcCA9IGhwLT5oX2FkZHJfbGlzdFtpXSkgIT0gTlVMTDsgaSsrKSB7Ci0JCXN3aXRjaCAoYWYpIHsKKyAgICBpZiAoKGhwLT5oX25hbWUgPT0gTlVMTCkgfHwgKGhwLT5oX25hbWVbMF0gPT0gMCkgfHwKKyAgICAgICAgKGhwLT5oX2FkZHJfbGlzdFswXSA9PSBOVUxMKSkgeworICAgICAgICBlcnJvciA9IEVBSV9GQUlMOworICAgICAgICBnb3RvIGZyZWU7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgKGFwID0gaHAtPmhfYWRkcl9saXN0W2ldKSAhPSBOVUxMOyBpKyspIHsKKyAgICAgICAgc3dpdGNoIChhZikgewogI2lmZGVmIEVOQUJMRV9JUFY2Ci0JCWNhc2UgQUZfSU5FVDY6Ci0JCQlnYWlfYWZkID0gJmdhaV9hZmRsW05fSU5FVDZdOwotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgQUZfSU5FVDY6CisgICAgICAgICAgICBnYWlfYWZkID0gJmdhaV9hZmRsW05fSU5FVDZdOworICAgICAgICAgICAgYnJlYWs7CiAjZW5kaWYKICNpZm5kZWYgRU5BQkxFX0lQVjYKLQkJZGVmYXVsdDoJLyogQUZfVU5TUEVDICovCisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgIC8qIEFGX1VOU1BFQyAqLwogI2VuZGlmCi0JCWNhc2UgQUZfSU5FVDoKLQkJCWdhaV9hZmQgPSAmZ2FpX2FmZGxbTl9JTkVUXTsKLQkJCWJyZWFrOworICAgICAgICBjYXNlIEFGX0lORVQ6CisgICAgICAgICAgICBnYWlfYWZkID0gJmdhaV9hZmRsW05fSU5FVF07CisgICAgICAgICAgICBicmVhazsKICNpZmRlZiBFTkFCTEVfSVBWNgotCQlkZWZhdWx0OgkvKiBBRl9VTlNQRUMgKi8KLQkJCWlmIChJTjZfSVNfQUREUl9WNE1BUFBFRCgoc3RydWN0IGluNl9hZGRyICopYXApKSB7Ci0JCQkJYXAgKz0gc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikgLQotCQkJCQlzaXplb2Yoc3RydWN0IGluX2FkZHIpOwotCQkJCWdhaV9hZmQgPSAmZ2FpX2FmZGxbTl9JTkVUXTsKLQkJCX0gZWxzZQotCQkJCWdhaV9hZmQgPSAmZ2FpX2FmZGxbTl9JTkVUNl07Ci0JCQlicmVhazsKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgLyogQUZfVU5TUEVDICovCisgICAgICAgICAgICBpZiAoSU42X0lTX0FERFJfVjRNQVBQRUQoKHN0cnVjdCBpbjZfYWRkciAqKWFwKSkgeworICAgICAgICAgICAgICAgIGFwICs9IHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpIC0KKyAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKTsKKyAgICAgICAgICAgICAgICBnYWlfYWZkID0gJmdhaV9hZmRsW05fSU5FVF07CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICBnYWlfYWZkID0gJmdhaV9hZmRsW05fSU5FVDZdOworICAgICAgICAgICAgYnJlYWs7CiAjZW5kaWYKLQkJfQorICAgICAgICB9CiAjaWZkZWYgRkFJVEgKLQkJaWYgKHRyYW5zbGF0ZSAmJiBnYWlfYWZkLT5hX2FmID09IEFGX0lORVQpIHsKLQkJCXN0cnVjdCBpbjZfYWRkciAqaW42OworICAgICAgICBpZiAodHJhbnNsYXRlICYmIGdhaV9hZmQtPmFfYWYgPT0gQUZfSU5FVCkgeworICAgICAgICAgICAgc3RydWN0IGluNl9hZGRyICppbjY7CiAKLQkJCUdFVF9BSShjdXItPmFpX25leHQsICZnYWlfYWZkbFtOX0lORVQ2XSwgYXAsIHBvcnQpOwotCQkJaW42ID0gJigoc3RydWN0IHNvY2thZGRyX2luNiAqKWN1ci0+YWlfbmV4dC0+YWlfYWRkciktPnNpbjZfYWRkcjsKLQkJCW1lbWNweSgmaW42LT5zNl9hZGRyMzJbMF0sICZmYWl0aF9wcmVmaXgsCi0JCQkgICAgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikgLSBzaXplb2Yoc3RydWN0IGluX2FkZHIpKTsKLQkJCW1lbWNweSgmaW42LT5zNl9hZGRyMzJbM10sIGFwLCBzaXplb2Yoc3RydWN0IGluX2FkZHIpKTsKLQkJfSBlbHNlCisgICAgICAgICAgICBHRVRfQUkoY3VyLT5haV9uZXh0LCAmZ2FpX2FmZGxbTl9JTkVUNl0sIGFwLCBwb3J0KTsKKyAgICAgICAgICAgIGluNiA9ICYoKHN0cnVjdCBzb2NrYWRkcl9pbjYgKiljdXItPmFpX25leHQtPmFpX2FkZHIpLT5zaW42X2FkZHI7CisgICAgICAgICAgICBtZW1jcHkoJmluNi0+czZfYWRkcjMyWzBdLCAmZmFpdGhfcHJlZml4LAorICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpIC0gc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSk7CisgICAgICAgICAgICBtZW1jcHkoJmluNi0+czZfYWRkcjMyWzNdLCBhcCwgc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSk7CisgICAgICAgIH0gZWxzZQogI2VuZGlmIC8qIEZBSVRIICovCi0JCUdFVF9BSShjdXItPmFpX25leHQsIGdhaV9hZmQsIGFwLCBwb3J0KTsKLQkJaWYgKGN1ciA9PSAmc2VudGluZWwpIHsKLQkJCXRvcCA9IGN1ci0+YWlfbmV4dDsKLQkJCUdFVF9DQU5PTk5BTUUodG9wLCBocC0+aF9uYW1lKTsKLQkJfQotCQljdXIgPSBjdXItPmFpX25leHQ7Ci0JfQorICAgICAgICBHRVRfQUkoY3VyLT5haV9uZXh0LCBnYWlfYWZkLCBhcCwgcG9ydCk7CisgICAgICAgIGlmIChjdXIgPT0gJnNlbnRpbmVsKSB7CisgICAgICAgICAgICB0b3AgPSBjdXItPmFpX25leHQ7CisgICAgICAgICAgICBHRVRfQ0FOT05OQU1FKHRvcCwgaHAtPmhfbmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgY3VyID0gY3VyLT5haV9uZXh0OworICAgIH0KICNpZmRlZiBFTkFCTEVfSVBWNgotCWZyZWVob3N0ZW50KGhwKTsKKyAgICBmcmVlaG9zdGVudChocCk7CiAjZW5kaWYKLQkqcmVzID0gdG9wOwotCXJldHVybiBTVUNDRVNTOworICAgICpyZXMgPSB0b3A7CisgICAgcmV0dXJuIFNVQ0NFU1M7CiAgZnJlZToKLQlpZiAodG9wKQotCQlmcmVlYWRkcmluZm8odG9wKTsKKyAgICBpZiAodG9wKQorICAgICAgICBmcmVlYWRkcmluZm8odG9wKTsKICNpZmRlZiBFTkFCTEVfSVBWNgotCWlmIChocCkKLQkJZnJlZWhvc3RlbnQoaHApOworICAgIGlmIChocCkKKyAgICAgICAgZnJlZWhvc3RlbnQoaHApOwogI2VuZGlmCiAvKiBiYWQ6ICovCi0JKnJlcyA9IE5VTEw7Ci0JcmV0dXJuIGVycm9yOworICAgICpyZXMgPSBOVUxMOworICAgIHJldHVybiBlcnJvcjsKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvZ2V0YnVpbGRpbmZvLmMgYi9Nb2R1bGVzL2dldGJ1aWxkaW5mby5jCmluZGV4IGY0YmQxNGEuLjNiYWMxYzUgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvZ2V0YnVpbGRpbmZvLmMKKysrIGIvTW9kdWxlcy9nZXRidWlsZGluZm8uYwpAQCAtMzEsMjIgKzMxLDIyIEBACiBjb25zdCBjaGFyICoKIFB5X0dldEJ1aWxkSW5mbyh2b2lkKQogewotCXN0YXRpYyBjaGFyIGJ1aWxkaW5mb1s1MF07Ci0JY29uc3QgY2hhciAqcmV2aXNpb24gPSBQeV9TdWJ2ZXJzaW9uUmV2aXNpb24oKTsKLQljb25zdCBjaGFyICpzZXAgPSAqcmV2aXNpb24gPyAiOiIgOiAiIjsKLQljb25zdCBjaGFyICpicmFuY2ggPSBQeV9TdWJ2ZXJzaW9uU2hvcnRCcmFuY2goKTsKLQlQeU9TX3NucHJpbnRmKGJ1aWxkaW5mbywgc2l6ZW9mKGJ1aWxkaW5mbyksCi0JCSAgICAgICIlcyVzJXMsICUuMjBzLCAlLjlzIiwgYnJhbmNoLCBzZXAsIHJldmlzaW9uLCAKLQkJICAgICAgREFURSwgVElNRSk7Ci0JcmV0dXJuIGJ1aWxkaW5mbzsKKyAgICBzdGF0aWMgY2hhciBidWlsZGluZm9bNTBdOworICAgIGNvbnN0IGNoYXIgKnJldmlzaW9uID0gUHlfU3VidmVyc2lvblJldmlzaW9uKCk7CisgICAgY29uc3QgY2hhciAqc2VwID0gKnJldmlzaW9uID8gIjoiIDogIiI7CisgICAgY29uc3QgY2hhciAqYnJhbmNoID0gUHlfU3VidmVyc2lvblNob3J0QnJhbmNoKCk7CisgICAgUHlPU19zbnByaW50ZihidWlsZGluZm8sIHNpemVvZihidWlsZGluZm8pLAorICAgICAgICAgICAgICAgICAgIiVzJXMlcywgJS4yMHMsICUuOXMiLCBicmFuY2gsIHNlcCwgcmV2aXNpb24sCisgICAgICAgICAgICAgICAgICBEQVRFLCBUSU1FKTsKKyAgICByZXR1cm4gYnVpbGRpbmZvOwogfQogCiBjb25zdCBjaGFyICoKIF9QeV9zdm52ZXJzaW9uKHZvaWQpCiB7Ci0JLyogdGhlIGZvbGxvd2luZyBzdHJpbmcgY2FuIGJlIG1vZGlmaWVkIGJ5IHN1YndjcmV2LmV4ZSAqLwotCXN0YXRpYyBjb25zdCBjaGFyIHN2bnZlcnNpb25bXSA9IFNWTlZFUlNJT047Ci0JaWYgKHN2bnZlcnNpb25bMF0gIT0gJyQnKQotCQlyZXR1cm4gc3ZudmVyc2lvbjsgLyogaXQgd2FzIGludGVycG9sYXRlZCwgb3IgcGFzc2VkIG9uIGNvbW1hbmQgbGluZSAqLwotCXJldHVybiAiVW52ZXJzaW9uZWQgZGlyZWN0b3J5IjsKKyAgICAvKiB0aGUgZm9sbG93aW5nIHN0cmluZyBjYW4gYmUgbW9kaWZpZWQgYnkgc3Vid2NyZXYuZXhlICovCisgICAgc3RhdGljIGNvbnN0IGNoYXIgc3ZudmVyc2lvbltdID0gU1ZOVkVSU0lPTjsKKyAgICBpZiAoc3ZudmVyc2lvblswXSAhPSAnJCcpCisgICAgICAgIHJldHVybiBzdm52ZXJzaW9uOyAvKiBpdCB3YXMgaW50ZXJwb2xhdGVkLCBvciBwYXNzZWQgb24gY29tbWFuZCBsaW5lICovCisgICAgcmV0dXJuICJVbnZlcnNpb25lZCBkaXJlY3RvcnkiOwogfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9nZXRuYW1laW5mby5jIGIvTW9kdWxlcy9nZXRuYW1laW5mby5jCmluZGV4IGQzYzBhYzUuLjc4OTJhZTkgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvZ2V0bmFtZWluZm8uYworKysgYi9Nb2R1bGVzL2dldG5hbWVpbmZvLmMKQEAgLTEsNyArMSw3IEBACiAvKgogICogQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3LCBhbmQgMTk5OCBXSURFIFByb2plY3QuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogCisgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKICAqIGFyZSBtZXQ6CkBAIC0xMyw3ICsxMyw3IEBACiAgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycwogICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCiAgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIAorICoKICAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFBST0pFQ1QgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECiAgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKICAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCkBAIC01MywxNjIgKzUzLDE2MiBAQAogI2RlZmluZSBOTyAgMAogCiBzdGF0aWMgc3RydWN0IGduaV9hZmQgewotCWludCBhX2FmOwotCWludCBhX2FkZHJsZW47Ci0JaW50IGFfc29ja2xlbjsKLQlpbnQgYV9vZmY7CisgICAgaW50IGFfYWY7CisgICAgaW50IGFfYWRkcmxlbjsKKyAgICBpbnQgYV9zb2NrbGVuOworICAgIGludCBhX29mZjsKIH0gZ25pX2FmZGwgW10gPSB7CiAjaWZkZWYgRU5BQkxFX0lQVjYKLQl7UEZfSU5FVDYsIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNiksCi0JCW9mZnNldG9mKHN0cnVjdCBzb2NrYWRkcl9pbjYsIHNpbjZfYWRkcil9LAorICAgIHtQRl9JTkVUNiwgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkciksIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KSwKKyAgICAgICAgb2Zmc2V0b2Yoc3RydWN0IHNvY2thZGRyX2luNiwgc2luNl9hZGRyKX0sCiAjZW5kaWYKLQl7UEZfSU5FVCwgc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbiksCi0JCW9mZnNldG9mKHN0cnVjdCBzb2NrYWRkcl9pbiwgc2luX2FkZHIpfSwKLQl7MCwgMCwgMH0sCisgICAge1BGX0lORVQsIHNpemVvZihzdHJ1Y3QgaW5fYWRkciksIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pLAorICAgICAgICBvZmZzZXRvZihzdHJ1Y3Qgc29ja2FkZHJfaW4sIHNpbl9hZGRyKX0sCisgICAgezAsIDAsIDB9LAogfTsKIAogc3RydWN0IGduaV9zb2NraW5ldCB7Ci0JdV9jaGFyCXNpX2xlbjsKLQl1X2NoYXIJc2lfZmFtaWx5OwotCXVfc2hvcnQJc2lfcG9ydDsKKyAgICB1X2NoYXIgICAgICBzaV9sZW47CisgICAgdV9jaGFyICAgICAgc2lfZmFtaWx5OworICAgIHVfc2hvcnQgICAgIHNpX3BvcnQ7CiB9OwogCi0jZGVmaW5lIEVOSV9OT1NPQ0tFVCAJMAotI2RlZmluZSBFTklfTk9TRVJWTkFNRQkxCi0jZGVmaW5lIEVOSV9OT0hPU1ROQU1FCTIKLSNkZWZpbmUgRU5JX01FTU9SWQkzCi0jZGVmaW5lIEVOSV9TWVNURU0JNAotI2RlZmluZSBFTklfRkFNSUxZCTUKLSNkZWZpbmUgRU5JX1NBTEVOCTYKKyNkZWZpbmUgRU5JX05PU09DS0VUICAgIDAKKyNkZWZpbmUgRU5JX05PU0VSVk5BTUUgIDEKKyNkZWZpbmUgRU5JX05PSE9TVE5BTUUgIDIKKyNkZWZpbmUgRU5JX01FTU9SWSAgICAgIDMKKyNkZWZpbmUgRU5JX1NZU1RFTSAgICAgIDQKKyNkZWZpbmUgRU5JX0ZBTUlMWSAgICAgIDUKKyNkZWZpbmUgRU5JX1NBTEVOICAgICAgIDYKIAogLyogZm9yd2FyZCBkZWNsYXJhdGlvbiB0byBtYWtlIGdjYyBoYXBweSAqLwogaW50IGdldG5hbWVpbmZvIFB5X1BST1RPKChjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKiwgc2l6ZV90LCBjaGFyICosIHNpemVfdCwKLQkJCSAgY2hhciAqLCBzaXplX3QsIGludCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICosIHNpemVfdCwgaW50KSk7CiAKIGludAogZ2V0bmFtZWluZm8oc2EsIHNhbGVuLCBob3N0LCBob3N0bGVuLCBzZXJ2LCBzZXJ2bGVuLCBmbGFncykKLQljb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKnNhOwotCXNpemVfdCBzYWxlbjsKLQljaGFyICpob3N0OwotCXNpemVfdCBob3N0bGVuOwotCWNoYXIgKnNlcnY7Ci0Jc2l6ZV90IHNlcnZsZW47Ci0JaW50IGZsYWdzOworICAgIGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc2E7CisgICAgc2l6ZV90IHNhbGVuOworICAgIGNoYXIgKmhvc3Q7CisgICAgc2l6ZV90IGhvc3RsZW47CisgICAgY2hhciAqc2VydjsKKyAgICBzaXplX3Qgc2VydmxlbjsKKyAgICBpbnQgZmxhZ3M7CiB7Ci0Jc3RydWN0IGduaV9hZmQgKmduaV9hZmQ7Ci0Jc3RydWN0IHNlcnZlbnQgKnNwOwotCXN0cnVjdCBob3N0ZW50ICpocDsKLQl1X3Nob3J0IHBvcnQ7Ci0JaW50IGZhbWlseSwgbGVuLCBpOwotCWNoYXIgKmFkZHIsICpwOwotCXVfbG9uZyB2NGE7CisgICAgc3RydWN0IGduaV9hZmQgKmduaV9hZmQ7CisgICAgc3RydWN0IHNlcnZlbnQgKnNwOworICAgIHN0cnVjdCBob3N0ZW50ICpocDsKKyAgICB1X3Nob3J0IHBvcnQ7CisgICAgaW50IGZhbWlseSwgbGVuLCBpOworICAgIGNoYXIgKmFkZHIsICpwOworICAgIHVfbG9uZyB2NGE7CiAjaWZkZWYgRU5BQkxFX0lQVjYKLQl1X2NoYXIgcGZ4OworICAgIHVfY2hhciBwZng7CiAjZW5kaWYKLQlpbnQgaF9lcnJvcjsKLQljaGFyIG51bXNlcnZbNTEyXTsKLQljaGFyIG51bWFkZHJbNTEyXTsKKyAgICBpbnQgaF9lcnJvcjsKKyAgICBjaGFyIG51bXNlcnZbNTEyXTsKKyAgICBjaGFyIG51bWFkZHJbNTEyXTsKIAotCWlmIChzYSA9PSBOVUxMKQotCQlyZXR1cm4gRU5JX05PU09DS0VUOworICAgIGlmIChzYSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gRU5JX05PU09DS0VUOwogCiAjaWZkZWYgSEFWRV9TT0NLQUREUl9TQV9MRU4KLQlsZW4gPSBzYS0+c2FfbGVuOwotCWlmIChsZW4gIT0gc2FsZW4pIHJldHVybiBFTklfU0FMRU47CisgICAgbGVuID0gc2EtPnNhX2xlbjsKKyAgICBpZiAobGVuICE9IHNhbGVuKSByZXR1cm4gRU5JX1NBTEVOOwogI2Vsc2UKLQlsZW4gPSBzYWxlbjsKKyAgICBsZW4gPSBzYWxlbjsKICNlbmRpZgotCQotCWZhbWlseSA9IHNhLT5zYV9mYW1pbHk7Ci0JZm9yIChpID0gMDsgZ25pX2FmZGxbaV0uYV9hZjsgaSsrKQotCQlpZiAoZ25pX2FmZGxbaV0uYV9hZiA9PSBmYW1pbHkpIHsKLQkJCWduaV9hZmQgPSAmZ25pX2FmZGxbaV07Ci0JCQlnb3RvIGZvdW5kOwotCQl9Ci0JcmV0dXJuIEVOSV9GQU1JTFk7Ci0JCisKKyAgICBmYW1pbHkgPSBzYS0+c2FfZmFtaWx5OworICAgIGZvciAoaSA9IDA7IGduaV9hZmRsW2ldLmFfYWY7IGkrKykKKyAgICAgICAgaWYgKGduaV9hZmRsW2ldLmFfYWYgPT0gZmFtaWx5KSB7CisgICAgICAgICAgICBnbmlfYWZkID0gJmduaV9hZmRsW2ldOworICAgICAgICAgICAgZ290byBmb3VuZDsKKyAgICAgICAgfQorICAgIHJldHVybiBFTklfRkFNSUxZOworCiAgZm91bmQ6Ci0JaWYgKGxlbiAhPSBnbmlfYWZkLT5hX3NvY2tsZW4pIHJldHVybiBFTklfU0FMRU47Ci0JCi0JcG9ydCA9ICgoc3RydWN0IGduaV9zb2NraW5ldCAqKXNhKS0+c2lfcG9ydDsgLyogbmV0d29yayBieXRlIG9yZGVyICovCi0JYWRkciA9IChjaGFyICopc2EgKyBnbmlfYWZkLT5hX29mZjsKKyAgICBpZiAobGVuICE9IGduaV9hZmQtPmFfc29ja2xlbikgcmV0dXJuIEVOSV9TQUxFTjsKIAotCWlmIChzZXJ2ID09IE5VTEwgfHwgc2VydmxlbiA9PSAwKSB7Ci0JCS8qIHdoYXQgd2Ugc2hvdWxkIGRvPyAqLwotCX0gZWxzZSBpZiAoZmxhZ3MgJiBOSV9OVU1FUklDU0VSVikgewotCQlzcHJpbnRmKG51bXNlcnYsICIlZCIsIG50b2hzKHBvcnQpKTsKLQkJaWYgKHN0cmxlbihudW1zZXJ2KSA+IHNlcnZsZW4pCi0JCQlyZXR1cm4gRU5JX01FTU9SWTsKLQkJc3RyY3B5KHNlcnYsIG51bXNlcnYpOwotCX0gZWxzZSB7Ci0JCXNwID0gZ2V0c2VydmJ5cG9ydChwb3J0LCAoZmxhZ3MgJiBOSV9ER1JBTSkgPyAidWRwIiA6ICJ0Y3AiKTsKLQkJaWYgKHNwKSB7Ci0JCQlpZiAoc3RybGVuKHNwLT5zX25hbWUpID4gc2VydmxlbikKLQkJCQlyZXR1cm4gRU5JX01FTU9SWTsKLQkJCXN0cmNweShzZXJ2LCBzcC0+c19uYW1lKTsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gRU5JX05PU0VSVk5BTUU7Ci0JfQorICAgIHBvcnQgPSAoKHN0cnVjdCBnbmlfc29ja2luZXQgKilzYSktPnNpX3BvcnQ7IC8qIG5ldHdvcmsgYnl0ZSBvcmRlciAqLworICAgIGFkZHIgPSAoY2hhciAqKXNhICsgZ25pX2FmZC0+YV9vZmY7CiAKLQlzd2l0Y2ggKHNhLT5zYV9mYW1pbHkpIHsKLQljYXNlIEFGX0lORVQ6Ci0JCXY0YSA9ICgoc3RydWN0IHNvY2thZGRyX2luICopc2EpLT5zaW5fYWRkci5zX2FkZHI7Ci0JCWlmIChJTl9NVUxUSUNBU1QodjRhKSB8fCBJTl9FWFBFUklNRU5UQUwodjRhKSkKLQkJCWZsYWdzIHw9IE5JX05VTUVSSUNIT1NUOwotCQl2NGEgPj49IElOX0NMQVNTQV9OU0hJRlQ7Ci0JCWlmICh2NGEgPT0gMCB8fCB2NGEgPT0gSU5fTE9PUEJBQ0tORVQpCi0JCQlmbGFncyB8PSBOSV9OVU1FUklDSE9TVDsJCQkKLQkJYnJlYWs7CisgICAgaWYgKHNlcnYgPT0gTlVMTCB8fCBzZXJ2bGVuID09IDApIHsKKyAgICAgICAgLyogd2hhdCB3ZSBzaG91bGQgZG8/ICovCisgICAgfSBlbHNlIGlmIChmbGFncyAmIE5JX05VTUVSSUNTRVJWKSB7CisgICAgICAgIHNwcmludGYobnVtc2VydiwgIiVkIiwgbnRvaHMocG9ydCkpOworICAgICAgICBpZiAoc3RybGVuKG51bXNlcnYpID4gc2VydmxlbikKKyAgICAgICAgICAgIHJldHVybiBFTklfTUVNT1JZOworICAgICAgICBzdHJjcHkoc2VydiwgbnVtc2Vydik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3AgPSBnZXRzZXJ2Ynlwb3J0KHBvcnQsIChmbGFncyAmIE5JX0RHUkFNKSA/ICJ1ZHAiIDogInRjcCIpOworICAgICAgICBpZiAoc3ApIHsKKyAgICAgICAgICAgIGlmIChzdHJsZW4oc3AtPnNfbmFtZSkgPiBzZXJ2bGVuKQorICAgICAgICAgICAgICAgIHJldHVybiBFTklfTUVNT1JZOworICAgICAgICAgICAgc3RyY3B5KHNlcnYsIHNwLT5zX25hbWUpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHJldHVybiBFTklfTk9TRVJWTkFNRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHNhLT5zYV9mYW1pbHkpIHsKKyAgICBjYXNlIEFGX0lORVQ6CisgICAgICAgIHY0YSA9ICgoc3RydWN0IHNvY2thZGRyX2luICopc2EpLT5zaW5fYWRkci5zX2FkZHI7CisgICAgICAgIGlmIChJTl9NVUxUSUNBU1QodjRhKSB8fCBJTl9FWFBFUklNRU5UQUwodjRhKSkKKyAgICAgICAgICAgIGZsYWdzIHw9IE5JX05VTUVSSUNIT1NUOworICAgICAgICB2NGEgPj49IElOX0NMQVNTQV9OU0hJRlQ7CisgICAgICAgIGlmICh2NGEgPT0gMCB8fCB2NGEgPT0gSU5fTE9PUEJBQ0tORVQpCisgICAgICAgICAgICBmbGFncyB8PSBOSV9OVU1FUklDSE9TVDsKKyAgICAgICAgYnJlYWs7CiAjaWZkZWYgRU5BQkxFX0lQVjYKLQljYXNlIEFGX0lORVQ2OgotCQlwZnggPSAoKHN0cnVjdCBzb2NrYWRkcl9pbjYgKilzYSktPnNpbjZfYWRkci5zNl9hZGRyOFswXTsKLQkJaWYgKHBmeCA9PSAwIHx8IHBmeCA9PSAweGZlIHx8IHBmeCA9PSAweGZmKQotCQkJZmxhZ3MgfD0gTklfTlVNRVJJQ0hPU1Q7Ci0JCWJyZWFrOworICAgIGNhc2UgQUZfSU5FVDY6CisgICAgICAgIHBmeCA9ICgoc3RydWN0IHNvY2thZGRyX2luNiAqKXNhKS0+c2luNl9hZGRyLnM2X2FkZHI4WzBdOworICAgICAgICBpZiAocGZ4ID09IDAgfHwgcGZ4ID09IDB4ZmUgfHwgcGZ4ID09IDB4ZmYpCisgICAgICAgICAgICBmbGFncyB8PSBOSV9OVU1FUklDSE9TVDsKKyAgICAgICAgYnJlYWs7CiAjZW5kaWYKLQl9Ci0JaWYgKGhvc3QgPT0gTlVMTCB8fCBob3N0bGVuID09IDApIHsKLQkJLyogd2hhdCBzaG91bGQgd2UgZG8/ICovCi0JfSBlbHNlIGlmIChmbGFncyAmIE5JX05VTUVSSUNIT1NUKSB7Ci0JCWlmIChpbmV0X250b3AoZ25pX2FmZC0+YV9hZiwgYWRkciwgbnVtYWRkciwgc2l6ZW9mKG51bWFkZHIpKQotCQkgICAgPT0gTlVMTCkKLQkJCXJldHVybiBFTklfU1lTVEVNOwotCQlpZiAoc3RybGVuKG51bWFkZHIpID4gaG9zdGxlbikKLQkJCXJldHVybiBFTklfTUVNT1JZOwotCQlzdHJjcHkoaG9zdCwgbnVtYWRkcik7Ci0JfSBlbHNlIHsKKyAgICB9CisgICAgaWYgKGhvc3QgPT0gTlVMTCB8fCBob3N0bGVuID09IDApIHsKKyAgICAgICAgLyogd2hhdCBzaG91bGQgd2UgZG8/ICovCisgICAgfSBlbHNlIGlmIChmbGFncyAmIE5JX05VTUVSSUNIT1NUKSB7CisgICAgICAgIGlmIChpbmV0X250b3AoZ25pX2FmZC0+YV9hZiwgYWRkciwgbnVtYWRkciwgc2l6ZW9mKG51bWFkZHIpKQorICAgICAgICAgICAgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBFTklfU1lTVEVNOworICAgICAgICBpZiAoc3RybGVuKG51bWFkZHIpID4gaG9zdGxlbikKKyAgICAgICAgICAgIHJldHVybiBFTklfTUVNT1JZOworICAgICAgICBzdHJjcHkoaG9zdCwgbnVtYWRkcik7CisgICAgfSBlbHNlIHsKICNpZmRlZiBFTkFCTEVfSVBWNgotCQlocCA9IGdldGlwbm9kZWJ5YWRkcihhZGRyLCBnbmlfYWZkLT5hX2FkZHJsZW4sIGduaV9hZmQtPmFfYWYsICZoX2Vycm9yKTsKKyAgICAgICAgaHAgPSBnZXRpcG5vZGVieWFkZHIoYWRkciwgZ25pX2FmZC0+YV9hZGRybGVuLCBnbmlfYWZkLT5hX2FmLCAmaF9lcnJvcik7CiAjZWxzZQotCQlocCA9IGdldGhvc3RieWFkZHIoYWRkciwgZ25pX2FmZC0+YV9hZGRybGVuLCBnbmlfYWZkLT5hX2FmKTsKLQkJaF9lcnJvciA9IGhfZXJybm87CisgICAgICAgIGhwID0gZ2V0aG9zdGJ5YWRkcihhZGRyLCBnbmlfYWZkLT5hX2FkZHJsZW4sIGduaV9hZmQtPmFfYWYpOworICAgICAgICBoX2Vycm9yID0gaF9lcnJubzsKICNlbmRpZgogCi0JCWlmIChocCkgewotCQkJaWYgKGZsYWdzICYgTklfTk9GUUROKSB7Ci0JCQkJcCA9IHN0cmNocihocC0+aF9uYW1lLCAnLicpOwotCQkJCWlmIChwKSAqcCA9ICdcMCc7Ci0JCQl9Ci0JCQlpZiAoc3RybGVuKGhwLT5oX25hbWUpID4gaG9zdGxlbikgeworICAgICAgICBpZiAoaHApIHsKKyAgICAgICAgICAgIGlmIChmbGFncyAmIE5JX05PRlFETikgeworICAgICAgICAgICAgICAgIHAgPSBzdHJjaHIoaHAtPmhfbmFtZSwgJy4nKTsKKyAgICAgICAgICAgICAgICBpZiAocCkgKnAgPSAnXDAnOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0cmxlbihocC0+aF9uYW1lKSA+IGhvc3RsZW4pIHsKICNpZmRlZiBFTkFCTEVfSVBWNgotCQkJCWZyZWVob3N0ZW50KGhwKTsKKyAgICAgICAgICAgICAgICBmcmVlaG9zdGVudChocCk7CiAjZW5kaWYKLQkJCQlyZXR1cm4gRU5JX01FTU9SWTsKLQkJCX0KLQkJCXN0cmNweShob3N0LCBocC0+aF9uYW1lKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRU5JX01FTU9SWTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0cmNweShob3N0LCBocC0+aF9uYW1lKTsKICNpZmRlZiBFTkFCTEVfSVBWNgotCQkJZnJlZWhvc3RlbnQoaHApOworICAgICAgICAgICAgZnJlZWhvc3RlbnQoaHApOwogI2VuZGlmCi0JCX0gZWxzZSB7Ci0JCQlpZiAoZmxhZ3MgJiBOSV9OQU1FUkVRRCkKLQkJCQlyZXR1cm4gRU5JX05PSE9TVE5BTUU7Ci0JCQlpZiAoaW5ldF9udG9wKGduaV9hZmQtPmFfYWYsIGFkZHIsIG51bWFkZHIsIHNpemVvZihudW1hZGRyKSkKLQkJCSAgICA9PSBOVUxMKQotCQkJCXJldHVybiBFTklfTk9IT1NUTkFNRTsKLQkJCWlmIChzdHJsZW4obnVtYWRkcikgPiBob3N0bGVuKQotCQkJCXJldHVybiBFTklfTUVNT1JZOwotCQkJc3RyY3B5KGhvc3QsIG51bWFkZHIpOwotCQl9Ci0JfQotCXJldHVybiBTVUNDRVNTOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGZsYWdzICYgTklfTkFNRVJFUUQpCisgICAgICAgICAgICAgICAgcmV0dXJuIEVOSV9OT0hPU1ROQU1FOworICAgICAgICAgICAgaWYgKGluZXRfbnRvcChnbmlfYWZkLT5hX2FmLCBhZGRyLCBudW1hZGRyLCBzaXplb2YobnVtYWRkcikpCisgICAgICAgICAgICAgICAgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gRU5JX05PSE9TVE5BTUU7CisgICAgICAgICAgICBpZiAoc3RybGVuKG51bWFkZHIpID4gaG9zdGxlbikKKyAgICAgICAgICAgICAgICByZXR1cm4gRU5JX01FTU9SWTsKKyAgICAgICAgICAgIHN0cmNweShob3N0LCBudW1hZGRyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gU1VDQ0VTUzsKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvZ2V0cGF0aC5jIGIvTW9kdWxlcy9nZXRwYXRoLmMKaW5kZXggNjgyYWQzZS4uOTY1M2QzZSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9nZXRwYXRoLmMKKysrIGIvTW9kdWxlcy9nZXRwYXRoLmMKQEAgLTIxNiw3ICsyMTYsNyBAQAogICAgICAgICAgICAgYnVmZmVyW24rK10gPSBTRVA7CiAgICAgfQogICAgIGlmIChuID4gTUFYUEFUSExFTikKLSAgICAJUHlfRmF0YWxFcnJvcigiYnVmZmVyIG92ZXJmbG93IGluIGdldHBhdGguYydzIGpvaW5wYXRoKCkiKTsKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiYnVmZmVyIG92ZXJmbG93IGluIGdldHBhdGguYydzIGpvaW5wYXRoKCkiKTsKICAgICBrID0gc3RybGVuKHN0dWZmKTsKICAgICBpZiAobiArIGsgPiBNQVhQQVRITEVOKQogICAgICAgICBrID0gTUFYUEFUSExFTiAtIG47CkBAIC0zOTMsMTMgKzM5MywxMyBAQAogI2VuZGlmCiAjZW5kaWYKIAotCS8qIElmIHRoZXJlIGlzIG5vIHNsYXNoIGluIHRoZSBhcmd2MCBwYXRoLCB0aGVuIHdlIGhhdmUgdG8KLQkgKiBhc3N1bWUgcHl0aG9uIGlzIG9uIHRoZSB1c2VyJ3MgJFBBVEgsIHNpbmNlIHRoZXJlJ3Mgbm8KLQkgKiBvdGhlciB3YXkgdG8gZmluZCBhIGRpcmVjdG9yeSB0byBzdGFydCB0aGUgc2VhcmNoIGZyb20uICBJZgotCSAqICRQQVRIIGlzbid0IGV4cG9ydGVkLCB5b3UgbG9zZS4KLQkgKi8KLQlpZiAoc3RyY2hyKHByb2csIFNFUCkpCi0JCXN0cm5jcHkocHJvZ3BhdGgsIHByb2csIE1BWFBBVEhMRU4pOworICAgICAgICAvKiBJZiB0aGVyZSBpcyBubyBzbGFzaCBpbiB0aGUgYXJndjAgcGF0aCwgdGhlbiB3ZSBoYXZlIHRvCisgICAgICAgICAqIGFzc3VtZSBweXRob24gaXMgb24gdGhlIHVzZXIncyAkUEFUSCwgc2luY2UgdGhlcmUncyBubworICAgICAgICAgKiBvdGhlciB3YXkgdG8gZmluZCBhIGRpcmVjdG9yeSB0byBzdGFydCB0aGUgc2VhcmNoIGZyb20uICBJZgorICAgICAgICAgKiAkUEFUSCBpc24ndCBleHBvcnRlZCwgeW91IGxvc2UuCisgICAgICAgICAqLworICAgICAgICBpZiAoc3RyY2hyKHByb2csIFNFUCkpCisgICAgICAgICAgICAgICAgc3RybmNweShwcm9ncGF0aCwgcHJvZywgTUFYUEFUSExFTik7CiAjaWZkZWYgX19BUFBMRV9fCiAgICAgIC8qIE9uIE1hYyBPUyBYLCBpZiBhIHNjcmlwdCB1c2VzIGFuIGludGVycHJldGVyIG9mIHRoZSBmb3JtCiAgICAgICAqICIjIS9vcHQvcHl0aG9uMi4zL2Jpbi9weXRob24iLCB0aGUga2VybmVsIG9ubHkgcGFzc2VzICJweXRob24iCkBAIC00MTQsNDQgKzQxNCw0NCBAQAogICAgICBlbHNlIGlmKDAgPT0gX05TR2V0RXhlY3V0YWJsZVBhdGgocHJvZ3BhdGgsICZuc2V4ZWNsZW5ndGgpICYmIHByb2dwYXRoWzBdID09IFNFUCkKICAgICAgICA7CiAjZW5kaWYgLyogX19BUFBMRV9fICovCi0JZWxzZSBpZiAocGF0aCkgewotCQl3aGlsZSAoMSkgewotCQkJY2hhciAqZGVsaW0gPSBzdHJjaHIocGF0aCwgREVMSU0pOworICAgICAgICBlbHNlIGlmIChwYXRoKSB7CisgICAgICAgICAgICAgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmRlbGltID0gc3RyY2hyKHBhdGgsIERFTElNKTsKIAotCQkJaWYgKGRlbGltKSB7Ci0JCQkJc2l6ZV90IGxlbiA9IGRlbGltIC0gcGF0aDsKLQkJCQlpZiAobGVuID4gTUFYUEFUSExFTikKLQkJCQkJbGVuID0gTUFYUEFUSExFTjsKLQkJCQlzdHJuY3B5KHByb2dwYXRoLCBwYXRoLCBsZW4pOwotCQkJCSoocHJvZ3BhdGggKyBsZW4pID0gJ1wwJzsKLQkJCX0KLQkJCWVsc2UKLQkJCQlzdHJuY3B5KHByb2dwYXRoLCBwYXRoLCBNQVhQQVRITEVOKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWxpbSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuID0gZGVsaW0gLSBwYXRoOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGVuID4gTUFYUEFUSExFTikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSBNQVhQQVRITEVOOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJuY3B5KHByb2dwYXRoLCBwYXRoLCBsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHByb2dwYXRoICsgbGVuKSA9ICdcMCc7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm5jcHkocHJvZ3BhdGgsIHBhdGgsIE1BWFBBVEhMRU4pOwogCi0JCQlqb2lucGF0aChwcm9ncGF0aCwgcHJvZyk7Ci0JCQlpZiAoaXN4ZmlsZShwcm9ncGF0aCkpCi0JCQkJYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBqb2lucGF0aChwcm9ncGF0aCwgcHJvZyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXN4ZmlsZShwcm9ncGF0aCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogCi0JCQlpZiAoIWRlbGltKSB7Ci0JCQkJcHJvZ3BhdGhbMF0gPSAnXDAnOwotCQkJCWJyZWFrOwotCQkJfQotCQkJcGF0aCA9IGRlbGltICsgMTsKLQkJfQotCX0KLQllbHNlCi0JCXByb2dwYXRoWzBdID0gJ1wwJzsKLQlpZiAocHJvZ3BhdGhbMF0gIT0gU0VQICYmIHByb2dwYXRoWzBdICE9ICdcMCcpCi0JCWFic29sdXRpemUocHJvZ3BhdGgpOwotCXN0cm5jcHkoYXJndjBfcGF0aCwgcHJvZ3BhdGgsIE1BWFBBVEhMRU4pOwotCWFyZ3YwX3BhdGhbTUFYUEFUSExFTl0gPSAnXDAnOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkZWxpbSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9ncGF0aFswXSA9ICdcMCc7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCA9IGRlbGltICsgMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHByb2dwYXRoWzBdID0gJ1wwJzsKKyAgICAgICAgaWYgKHByb2dwYXRoWzBdICE9IFNFUCAmJiBwcm9ncGF0aFswXSAhPSAnXDAnKQorICAgICAgICAgICAgICAgIGFic29sdXRpemUocHJvZ3BhdGgpOworICAgICAgICBzdHJuY3B5KGFyZ3YwX3BhdGgsIHByb2dwYXRoLCBNQVhQQVRITEVOKTsKKyAgICAgICAgYXJndjBfcGF0aFtNQVhQQVRITEVOXSA9ICdcMCc7CiAKICNpZmRlZiBXSVRIX05FWFRfRlJBTUVXT1JLCi0JLyogT24gTWFjIE9TIFggd2UgaGF2ZSBhIHNwZWNpYWwgY2FzZSBpZiB3ZSdyZSBydW5uaW5nIGZyb20gYSBmcmFtZXdvcmsuCi0JKiogVGhpcyBpcyBiZWNhdXNlIHRoZSBweXRob24gaG9tZSBzaG91bGQgYmUgc2V0IHJlbGF0aXZlIHRvIHRoZSBsaWJyYXJ5LAotCSoqIHdoaWNoIGlzIGluIHRoZSBmcmFtZXdvcmssIG5vdCByZWxhdGl2ZSB0byB0aGUgZXhlY3V0YWJsZSwgd2hpY2ggbWF5Ci0JKiogYmUgb3V0c2lkZSBvZiB0aGUgZnJhbWV3b3JrLiBFeGNlcHQgd2hlbiB3ZSdyZSBpbiB0aGUgYnVpbGQgZGlyZWN0b3J5Li4uCi0JKi8KKyAgICAgICAgLyogT24gTWFjIE9TIFggd2UgaGF2ZSBhIHNwZWNpYWwgY2FzZSBpZiB3ZSdyZSBydW5uaW5nIGZyb20gYSBmcmFtZXdvcmsuCisgICAgICAgICoqIFRoaXMgaXMgYmVjYXVzZSB0aGUgcHl0aG9uIGhvbWUgc2hvdWxkIGJlIHNldCByZWxhdGl2ZSB0byB0aGUgbGlicmFyeSwKKyAgICAgICAgKiogd2hpY2ggaXMgaW4gdGhlIGZyYW1ld29yaywgbm90IHJlbGF0aXZlIHRvIHRoZSBleGVjdXRhYmxlLCB3aGljaCBtYXkKKyAgICAgICAgKiogYmUgb3V0c2lkZSBvZiB0aGUgZnJhbWV3b3JrLiBFeGNlcHQgd2hlbiB3ZSdyZSBpbiB0aGUgYnVpbGQgZGlyZWN0b3J5Li4uCisgICAgICAgICovCiAgICAgcHl0aG9uTW9kdWxlID0gTlNNb2R1bGVGb3JTeW1ib2woTlNMb29rdXBBbmRCaW5kU3ltYm9sKCJfUHlfSW5pdGlhbGl6ZSIpKTsKICAgICAvKiBVc2UgZHlsaWIgZnVuY3Rpb25zIHRvIGZpbmQgb3V0IHdoZXJlIHRoZSBmcmFtZXdvcmsgd2FzIGxvYWRlZCBmcm9tICovCiAgICAgYnVmID0gKGNoYXIgKilOU0xpYnJhcnlOYW1lRm9yTW9kdWxlKHB5dGhvbk1vZHVsZSk7CkBAIC01MjUsNyArNTI1LDcgQEAKICAgICBlbHNlCiAgICAgICAgIHN0cm5jcHkoemlwX3BhdGgsIFBSRUZJWCwgTUFYUEFUSExFTik7CiAgICAgam9pbnBhdGgoemlwX3BhdGgsICJsaWIvcHl0aG9uMDAuemlwIik7Ci0gICAgYnVmc3ogPSBzdHJsZW4oemlwX3BhdGgpOwkvKiBSZXBsYWNlICIwMCIgd2l0aCB2ZXJzaW9uICovCisgICAgYnVmc3ogPSBzdHJsZW4oemlwX3BhdGgpOyAgIC8qIFJlcGxhY2UgIjAwIiB3aXRoIHZlcnNpb24gKi8KICAgICB6aXBfcGF0aFtidWZzeiAtIDZdID0gVkVSU0lPTlswXTsKICAgICB6aXBfcGF0aFtidWZzeiAtIDVdID0gVkVSU0lPTlsyXTsKIApAQCAtNjMzLDEwICs2MzMsMTAgQEAKICAgICBpZiAocGZvdW5kID4gMCkgewogICAgICAgICByZWR1Y2UocHJlZml4KTsKICAgICAgICAgcmVkdWNlKHByZWZpeCk7Ci0JLyogVGhlIHByZWZpeCBpcyB0aGUgcm9vdCBkaXJlY3RvcnksIGJ1dCByZWR1Y2UoKSBjaG9wcGVkCi0JICogb2ZmIHRoZSAiLyIuICovCi0JaWYgKCFwcmVmaXhbMF0pCi0JCXN0cmNweShwcmVmaXgsIHNlcGFyYXRvcik7CisgICAgICAgIC8qIFRoZSBwcmVmaXggaXMgdGhlIHJvb3QgZGlyZWN0b3J5LCBidXQgcmVkdWNlKCkgY2hvcHBlZAorICAgICAgICAgKiBvZmYgdGhlICIvIi4gKi8KKyAgICAgICAgaWYgKCFwcmVmaXhbMF0pCisgICAgICAgICAgICAgICAgc3RyY3B5KHByZWZpeCwgc2VwYXJhdG9yKTsKICAgICB9CiAgICAgZWxzZQogICAgICAgICBzdHJuY3B5KHByZWZpeCwgUFJFRklYLCBNQVhQQVRITEVOKTsKQEAgLTY0NSw4ICs2NDUsOCBAQAogICAgICAgICByZWR1Y2UoZXhlY19wcmVmaXgpOwogICAgICAgICByZWR1Y2UoZXhlY19wcmVmaXgpOwogICAgICAgICByZWR1Y2UoZXhlY19wcmVmaXgpOwotCWlmICghZXhlY19wcmVmaXhbMF0pCi0JCXN0cmNweShleGVjX3ByZWZpeCwgc2VwYXJhdG9yKTsKKyAgICAgICAgaWYgKCFleGVjX3ByZWZpeFswXSkKKyAgICAgICAgICAgICAgICBzdHJjcHkoZXhlY19wcmVmaXgsIHNlcGFyYXRvcik7CiAgICAgfQogICAgIGVsc2UKICAgICAgICAgc3RybmNweShleGVjX3ByZWZpeCwgRVhFQ19QUkVGSVgsIE1BWFBBVEhMRU4pOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9nbG1vZHVsZS5jIGIvTW9kdWxlcy9nbG1vZHVsZS5jCmluZGV4IDAxZGI5ZmMuLmI5YzY0ZmIgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvZ2xtb2R1bGUuYworKysgYi9Nb2R1bGVzL2dsbW9kdWxlLmMKQEAgLTEwLDI2ICsxMCwyNiBAQAogPHJldHVybnR5cGU+IGNhbiBiZTogdm9pZCwgc2hvcnQsIGxvbmcgKFhYWCBtYXliZSBvdGhlcnM/KQogCiA8dHlwZT4gY2FuIGJlOiBjaGFyLCBzdHJpbmcsIHNob3J0LCBmbG9hdCwgbG9uZywgb3IgZG91YmxlCi0Jc3RyaW5nIGluZGljYXRlcyBhIG51bGwgdGVybWluYXRlZCBzdHJpbmc7Ci0JaWYgPHR5cGU+IGlzIGNoYXIgYW5kIDxhcmc+IGJlZ2lucyB3aXRoIGEgKiwgdGhlICogaXMgc3RyaXBwZWQKLQlhbmQgPHR5cGU+IGlzIGNoYW5nZWQgaW50byBzdHJpbmcKKyAgICBzdHJpbmcgaW5kaWNhdGVzIGEgbnVsbCB0ZXJtaW5hdGVkIHN0cmluZzsKKyAgICBpZiA8dHlwZT4gaXMgY2hhciBhbmQgPGFyZz4gYmVnaW5zIHdpdGggYSAqLCB0aGUgKiBpcyBzdHJpcHBlZAorICAgIGFuZCA8dHlwZT4gaXMgY2hhbmdlZCBpbnRvIHN0cmluZwogCiA8YXJnPiBoYXMgdGhlIGZvcm0gPG1vZGU+IG9yIDxtb2RlPls8c3Vic2NyaXB0Pl0KLQl3aGVyZSA8bW9kZT4gY2FuIGJlCi0JCXM6IGFyZyBpcyBzZW50Ci0JCXI6IGFyZyBpcyByZWNlaXZlZAkJKGFyZyBpcyBhIHBvaW50ZXIpCi0JYW5kIDxzdWJzY3JpcHQ+IGNhbiBiZSAoTiBhbmQgSSBhcmUgbnVtYmVycyk6Ci0JCU4KLQkJYXJnSQotCQlyZXR2YWwKLQkJTiphcmdJCi0JCU4qSQotCQlOKnJldHZhbAotCUluIHRoZSBjYXNlIHdoZXJlIHRoZSBzdWJzY3JpcHQgY29uc2lzdHMgb2YgdHdvIHBhcnRzCi0Jc2VwYXJhdGVkIGJ5ICosIHRoZSBmaXJzdCBwYXJ0IGlzIHRoZSB3aWR0aCBvZiB0aGUgbWF0cml4LCBhbmQKLQl0aGUgc2Vjb25kIHBhcnQgaXMgdGhlIGxlbmd0aCBvZiB0aGUgbWF0cml4LiAgVGhpcyBvcmRlciBpcwotCW9wcG9zaXRlIGZyb20gdGhlIG9yZGVyIHVzZWQgaW4gQyB0byBkZWNsYXJlIGEgdHdvLWRpbWVuc2lvbmFsCi0JbWF0cml4LgorICAgIHdoZXJlIDxtb2RlPiBjYW4gYmUKKyAgICAgICAgczogYXJnIGlzIHNlbnQKKyAgICAgICAgcjogYXJnIGlzIHJlY2VpdmVkICAgICAgICAgICAgICAgICAgICAgIChhcmcgaXMgYSBwb2ludGVyKQorICAgIGFuZCA8c3Vic2NyaXB0PiBjYW4gYmUgKE4gYW5kIEkgYXJlIG51bWJlcnMpOgorICAgICAgICBOCisgICAgICAgIGFyZ0kKKyAgICAgICAgcmV0dmFsCisgICAgICAgIE4qYXJnSQorICAgICAgICBOKkkKKyAgICAgICAgTipyZXR2YWwKKyAgICBJbiB0aGUgY2FzZSB3aGVyZSB0aGUgc3Vic2NyaXB0IGNvbnNpc3RzIG9mIHR3byBwYXJ0cworICAgIHNlcGFyYXRlZCBieSAqLCB0aGUgZmlyc3QgcGFydCBpcyB0aGUgd2lkdGggb2YgdGhlIG1hdHJpeCwgYW5kCisgICAgdGhlIHNlY29uZCBwYXJ0IGlzIHRoZSBsZW5ndGggb2YgdGhlIG1hdHJpeC4gIFRoaXMgb3JkZXIgaXMKKyAgICBvcHBvc2l0ZSBmcm9tIHRoZSBvcmRlciB1c2VkIGluIEMgdG8gZGVjbGFyZSBhIHR3by1kaW1lbnNpb25hbAorICAgIG1hdHJpeC4KICovCiAKIC8qCkBAIC02MiwxNyArNjIsMTcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9xcmVhZChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyByZXR2YWw7Ci0Jc2hvcnQgYXJnMSA7Ci0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCXJldHZhbCA9IHFyZWFkKCAmIGFyZzEgKTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCXsgUHlPYmplY3QgKnYgPSBQeVR1cGxlX05ldyggMiApOwotCSAgaWYgKHYgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JICBQeVR1cGxlX1NldEl0ZW0odiwgMCwgbWtuZXdsb25nb2JqZWN0KHJldHZhbCkpOwotCSAgUHlUdXBsZV9TZXRJdGVtKHYsIDEsIG1rbmV3c2hvcnRvYmplY3QoYXJnMSkpOwotCSAgcmV0dXJuIHY7Ci0JfQorICAgIGxvbmcgcmV0dmFsOworICAgIHNob3J0IGFyZzEgOworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICByZXR2YWwgPSBxcmVhZCggJiBhcmcxICk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICB7IFB5T2JqZWN0ICp2ID0gUHlUdXBsZV9OZXcoIDIgKTsKKyAgICAgIGlmICh2ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgICAgUHlUdXBsZV9TZXRJdGVtKHYsIDAsIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpKTsKKyAgICAgIFB5VHVwbGVfU2V0SXRlbSh2LCAxLCBta25ld3Nob3J0b2JqZWN0KGFyZzEpKTsKKyAgICAgIHJldHVybiB2OworICAgIH0KIH0KIAogCkBAIC05MSw2NCArOTEsNjQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF92YXJyYXkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICp2LCAqdz1OVUxMOwotCWludCBpLCBuLCB3aWR0aDsKLQlkb3VibGUgdmVjWzNdOwotCVB5T2JqZWN0ICogKCpnZXRpdGVtKShQeU9iamVjdCAqLCBpbnQpOwotCQotCWlmICghUHlBcmdfR2V0T2JqZWN0KGFyZ3MsIDEsIDAsICZ2KSkKLQkJcmV0dXJuIE5VTEw7Ci0JCi0JaWYgKFB5TGlzdF9DaGVjayh2KSkgewotCQluID0gUHlMaXN0X1NpemUodik7Ci0JCWdldGl0ZW0gPSBQeUxpc3RfR2V0SXRlbTsKLQl9Ci0JZWxzZSBpZiAoUHlUdXBsZV9DaGVjayh2KSkgewotCQluID0gUHlUdXBsZV9TaXplKHYpOwotCQlnZXRpdGVtID0gUHlUdXBsZV9HZXRJdGVtOwotCX0KLQllbHNlIHsKLQkJUHlFcnJfQmFkQXJndW1lbnQoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCQotCWlmIChuID09IDApIHsKLQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQlyZXR1cm4gUHlfTm9uZTsKLQl9Ci0JaWYgKG4gPiAwKQotCQl3ID0gKCpnZXRpdGVtKSh2LCAwKTsKLQkKLQl3aWR0aCA9IDA7Ci0JaWYgKHcgPT0gTlVMTCkgewotCX0KLQllbHNlIGlmIChQeUxpc3RfQ2hlY2sodykpIHsKLQkJd2lkdGggPSBQeUxpc3RfU2l6ZSh3KTsKLQl9Ci0JZWxzZSBpZiAoUHlUdXBsZV9DaGVjayh3KSkgewotCQl3aWR0aCA9IFB5VHVwbGVfU2l6ZSh3KTsKLQl9Ci0JCi0Jc3dpdGNoICh3aWR0aCkgewotCWNhc2UgMjoKLQkJdmVjWzJdID0gMC4wOwotCQkvKiBGYWxsIHRocm91Z2ggKi8KLQljYXNlIDM6Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCVB5RXJyX0JhZEFyZ3VtZW50KCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQkKLQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCXcgPSAoKmdldGl0ZW0pKHYsIGkpOwotCQlpZiAoIVB5QXJnX0dldERvdWJsZUFycmF5KHcsIDEsIDAsIHdpZHRoLCB2ZWMpKQotCQkJcmV0dXJuIE5VTEw7Ci0JCXYzZCh2ZWMpOwotCX0KLQkKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlPYmplY3QgKnYsICp3PU5VTEw7CisgICAgaW50IGksIG4sIHdpZHRoOworICAgIGRvdWJsZSB2ZWNbM107CisgICAgUHlPYmplY3QgKiAoKmdldGl0ZW0pKFB5T2JqZWN0ICosIGludCk7CisKKyAgICBpZiAoIVB5QXJnX0dldE9iamVjdChhcmdzLCAxLCAwLCAmdikpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgaWYgKFB5TGlzdF9DaGVjayh2KSkgeworICAgICAgICBuID0gUHlMaXN0X1NpemUodik7CisgICAgICAgIGdldGl0ZW0gPSBQeUxpc3RfR2V0SXRlbTsKKyAgICB9CisgICAgZWxzZSBpZiAoUHlUdXBsZV9DaGVjayh2KSkgeworICAgICAgICBuID0gUHlUdXBsZV9TaXplKHYpOworICAgICAgICBnZXRpdGVtID0gUHlUdXBsZV9HZXRJdGVtOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgUHlFcnJfQmFkQXJndW1lbnQoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaWYgKG4gPT0gMCkgeworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIHJldHVybiBQeV9Ob25lOworICAgIH0KKyAgICBpZiAobiA+IDApCisgICAgICAgIHcgPSAoKmdldGl0ZW0pKHYsIDApOworCisgICAgd2lkdGggPSAwOworICAgIGlmICh3ID09IE5VTEwpIHsKKyAgICB9CisgICAgZWxzZSBpZiAoUHlMaXN0X0NoZWNrKHcpKSB7CisgICAgICAgIHdpZHRoID0gUHlMaXN0X1NpemUodyk7CisgICAgfQorICAgIGVsc2UgaWYgKFB5VHVwbGVfQ2hlY2sodykpIHsKKyAgICAgICAgd2lkdGggPSBQeVR1cGxlX1NpemUodyk7CisgICAgfQorCisgICAgc3dpdGNoICh3aWR0aCkgeworICAgIGNhc2UgMjoKKyAgICAgICAgdmVjWzJdID0gMC4wOworICAgICAgICAvKiBGYWxsIHRocm91Z2ggKi8KKyAgICBjYXNlIDM6CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIFB5RXJyX0JhZEFyZ3VtZW50KCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgdyA9ICgqZ2V0aXRlbSkodiwgaSk7CisgICAgICAgIGlmICghUHlBcmdfR2V0RG91YmxlQXJyYXkodywgMSwgMCwgd2lkdGgsIHZlYykpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgdjNkKHZlYyk7CisgICAgfQorCisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKgpAQCAtMTcwLDE0ICsxNzAsMTQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9udmFycmF5KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gZ2VuX252YXJyYXkoYXJncywgMCk7CisgICAgcmV0dXJuIGdlbl9udmFycmF5KGFyZ3MsIDApOwogfQogCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF92bmFycmF5KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gZ2VuX252YXJyYXkoYXJncywgMSk7CisgICAgcmV0dXJuIGdlbl9udmFycmF5KGFyZ3MsIDEpOwogfQogCiAvKiBHZW5lcmljLCBpbnRlcm5hbCB2ZXJzaW9uIG9mIHtudixudn1hcnJheTogaW5vcm0gaW5kaWNhdGVzIHRoZQpAQCAtMTg2LDQ0ICsxODYsNDQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZW5fbnZhcnJheShQeU9iamVjdCAqYXJncywgaW50IGlub3JtKQogewotCVB5T2JqZWN0ICp2LCAqdywgKndub3JtLCAqd3ZlYzsKLQlpbnQgaSwgbjsKLQlmbG9hdCBub3JtWzNdLCB2ZWNbM107Ci0JUHlPYmplY3QgKiAoKmdldGl0ZW0pKFB5T2JqZWN0ICosIGludCk7Ci0JCi0JaWYgKCFQeUFyZ19HZXRPYmplY3QoYXJncywgMSwgMCwgJnYpKQotCQlyZXR1cm4gTlVMTDsKLQkKLQlpZiAoUHlMaXN0X0NoZWNrKHYpKSB7Ci0JCW4gPSBQeUxpc3RfU2l6ZSh2KTsKLQkJZ2V0aXRlbSA9IFB5TGlzdF9HZXRJdGVtOwotCX0KLQllbHNlIGlmIChQeVR1cGxlX0NoZWNrKHYpKSB7Ci0JCW4gPSBQeVR1cGxlX1NpemUodik7Ci0JCWdldGl0ZW0gPSBQeVR1cGxlX0dldEl0ZW07Ci0JfQotCWVsc2UgewotCQlQeUVycl9CYWRBcmd1bWVudCgpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JCi0JZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQl3ID0gKCpnZXRpdGVtKSh2LCBpKTsKLQkJaWYgKCFQeVR1cGxlX0NoZWNrKHcpIHx8IFB5VHVwbGVfU2l6ZSh3KSAhPSAyKSB7Ci0JCQlQeUVycl9CYWRBcmd1bWVudCgpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJd25vcm0gPSBQeVR1cGxlX0dldEl0ZW0odywgaW5vcm0pOwotCQl3dmVjID0gUHlUdXBsZV9HZXRJdGVtKHcsIDEgLSBpbm9ybSk7Ci0JCWlmICghUHlBcmdfR2V0RmxvYXRBcnJheSh3bm9ybSwgMSwgMCwgMywgbm9ybSkgfHwKLQkJCSFQeUFyZ19HZXRGbG9hdEFycmF5KHd2ZWMsIDEsIDAsIDMsIHZlYykpCi0JCQlyZXR1cm4gTlVMTDsKLQkJbjNmKG5vcm0pOwotCQl2M2YodmVjKTsKLQl9Ci0JCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5T2JqZWN0ICp2LCAqdywgKndub3JtLCAqd3ZlYzsKKyAgICBpbnQgaSwgbjsKKyAgICBmbG9hdCBub3JtWzNdLCB2ZWNbM107CisgICAgUHlPYmplY3QgKiAoKmdldGl0ZW0pKFB5T2JqZWN0ICosIGludCk7CisKKyAgICBpZiAoIVB5QXJnX0dldE9iamVjdChhcmdzLCAxLCAwLCAmdikpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgaWYgKFB5TGlzdF9DaGVjayh2KSkgeworICAgICAgICBuID0gUHlMaXN0X1NpemUodik7CisgICAgICAgIGdldGl0ZW0gPSBQeUxpc3RfR2V0SXRlbTsKKyAgICB9CisgICAgZWxzZSBpZiAoUHlUdXBsZV9DaGVjayh2KSkgeworICAgICAgICBuID0gUHlUdXBsZV9TaXplKHYpOworICAgICAgICBnZXRpdGVtID0gUHlUdXBsZV9HZXRJdGVtOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgUHlFcnJfQmFkQXJndW1lbnQoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICB3ID0gKCpnZXRpdGVtKSh2LCBpKTsKKyAgICAgICAgaWYgKCFQeVR1cGxlX0NoZWNrKHcpIHx8IFB5VHVwbGVfU2l6ZSh3KSAhPSAyKSB7CisgICAgICAgICAgICBQeUVycl9CYWRBcmd1bWVudCgpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgd25vcm0gPSBQeVR1cGxlX0dldEl0ZW0odywgaW5vcm0pOworICAgICAgICB3dmVjID0gUHlUdXBsZV9HZXRJdGVtKHcsIDEgLSBpbm9ybSk7CisgICAgICAgIGlmICghUHlBcmdfR2V0RmxvYXRBcnJheSh3bm9ybSwgMSwgMCwgMywgbm9ybSkgfHwKKyAgICAgICAgICAgICFQeUFyZ19HZXRGbG9hdEFycmF5KHd2ZWMsIDEsIDAsIDMsIHZlYykpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgbjNmKG5vcm0pOworICAgICAgICB2M2YodmVjKTsKKyAgICB9CisKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIG51cmJzc3VyZmFjZShzX2tub3RzW10sIHRfa25vdHNbXSwgY3RsW11bXSwgc19vcmRlciwgdF9vcmRlciwgdHlwZSkuCkBAIC0yMzUsODMgKzIzNSw4MyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX251cmJzc3VyZmFjZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlkb3VibGUgKiBhcmcyIDsKLQlsb25nIGFyZzMgOwotCWRvdWJsZSAqIGFyZzQgOwotCWRvdWJsZSAqYXJnNSA7Ci0JbG9uZyBhcmc2IDsKLQlsb25nIGFyZzcgOwotCWxvbmcgYXJnOCA7Ci0JbG9uZyBuY29vcmRzOwotCWxvbmcgc19ieXRlX3N0cmlkZSwgdF9ieXRlX3N0cmlkZTsKLQlsb25nIHNfbmN0bCwgdF9uY3RsOwotCWxvbmcgcywgdDsKLQlQeU9iamVjdCAqdiwgKncsICpwdDsKLQlkb3VibGUgKnBuZXh0OwotCWlmICghUHlBcmdfR2V0TG9uZ0FycmF5U2l6ZShhcmdzLCA2LCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICgoYXJnMiA9IFB5TWVtX05FVyhkb3VibGUsIGFyZzEgKSkgPT0gTlVMTCkgewotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQl9Ci0JaWYgKCFQeUFyZ19HZXREb3VibGVBcnJheShhcmdzLCA2LCAwLCBhcmcxICwgYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghUHlBcmdfR2V0TG9uZ0FycmF5U2l6ZShhcmdzLCA2LCAxLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCWlmICgoYXJnNCA9IFB5TWVtX05FVyhkb3VibGUsIGFyZzMgKSkgPT0gTlVMTCkgewotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQl9Ci0JaWYgKCFQeUFyZ19HZXREb3VibGVBcnJheShhcmdzLCA2LCAxLCBhcmczICwgYXJnNCkpCi0JCXJldHVybiBOVUxMOwotCWlmICghUHlBcmdfR2V0TG9uZyhhcmdzLCA2LCAzLCAmYXJnNikpCi0JCXJldHVybiBOVUxMOwotCWlmICghUHlBcmdfR2V0TG9uZyhhcmdzLCA2LCA0LCAmYXJnNykpCi0JCXJldHVybiBOVUxMOwotCWlmICghUHlBcmdfR2V0TG9uZyhhcmdzLCA2LCA1LCAmYXJnOCkpCi0JCXJldHVybiBOVUxMOwotCWlmIChhcmc4ID09IE5fWFlaKQotCQluY29vcmRzID0gMzsKLQllbHNlIGlmIChhcmc4ID09IE5fWFlaVykKLQkJbmNvb3JkcyA9IDQ7Ci0JZWxzZSB7Ci0JCVB5RXJyX0JhZEFyZ3VtZW50KCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlzX25jdGwgPSBhcmcxIC0gYXJnNjsKLQl0X25jdGwgPSBhcmczIC0gYXJnNzsKLQlpZiAoIVB5QXJnX0dldE9iamVjdChhcmdzLCA2LCAyLCAmdikpCi0JCXJldHVybiBOVUxMOwotCWlmICghUHlMaXN0X0NoZWNrKHYpIHx8IFB5TGlzdF9TaXplKHYpICE9IHNfbmN0bCkgewotCQlQeUVycl9CYWRBcmd1bWVudCgpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKChhcmc1ID0gUHlNZW1fTkVXKGRvdWJsZSwgc19uY3RsKnRfbmN0bCpuY29vcmRzICkpID09IE5VTEwpIHsKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JfQotCXBuZXh0ID0gYXJnNTsKLQlmb3IgKHMgPSAwOyBzIDwgc19uY3RsOyBzKyspIHsKLQkJdyA9IFB5TGlzdF9HZXRJdGVtKHYsIHMpOwotCQlpZiAodyA9PSBOVUxMIHx8ICFQeUxpc3RfQ2hlY2sodykgfHwKLQkJCQkJUHlMaXN0X1NpemUodykgIT0gdF9uY3RsKSB7Ci0JCQlQeUVycl9CYWRBcmd1bWVudCgpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJZm9yICh0ID0gMDsgdCA8IHRfbmN0bDsgdCsrKSB7Ci0JCQlwdCA9IFB5TGlzdF9HZXRJdGVtKHcsIHQpOwotCQkJaWYgKCFQeUFyZ19HZXREb3VibGVBcnJheShwdCwgMSwgMCwgbmNvb3JkcywgcG5leHQpKQotCQkJCXJldHVybiBOVUxMOwotCQkJcG5leHQgKz0gbmNvb3JkczsKLQkJfQotCX0KLQlzX2J5dGVfc3RyaWRlID0gc2l6ZW9mKGRvdWJsZSkgKiBuY29vcmRzOwotCXRfYnl0ZV9zdHJpZGUgPSBzX2J5dGVfc3RyaWRlICogc19uY3RsOwotCW51cmJzc3VyZmFjZSggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCAsCi0JCXNfYnl0ZV9zdHJpZGUgLCB0X2J5dGVfc3RyaWRlICwgYXJnNSAsIGFyZzYgLCBhcmc3ICwgYXJnOCApOwotCVB5TWVtX0RFTChhcmcyKTsKLQlQeU1lbV9ERUwoYXJnNCk7Ci0JUHlNZW1fREVMKGFyZzUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGRvdWJsZSAqIGFyZzIgOworICAgIGxvbmcgYXJnMyA7CisgICAgZG91YmxlICogYXJnNCA7CisgICAgZG91YmxlICphcmc1IDsKKyAgICBsb25nIGFyZzYgOworICAgIGxvbmcgYXJnNyA7CisgICAgbG9uZyBhcmc4IDsKKyAgICBsb25nIG5jb29yZHM7CisgICAgbG9uZyBzX2J5dGVfc3RyaWRlLCB0X2J5dGVfc3RyaWRlOworICAgIGxvbmcgc19uY3RsLCB0X25jdGw7CisgICAgbG9uZyBzLCB0OworICAgIFB5T2JqZWN0ICp2LCAqdywgKnB0OworICAgIGRvdWJsZSAqcG5leHQ7CisgICAgaWYgKCFQeUFyZ19HZXRMb25nQXJyYXlTaXplKGFyZ3MsIDYsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKChhcmcyID0gUHlNZW1fTkVXKGRvdWJsZSwgYXJnMSApKSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIH0KKyAgICBpZiAoIVB5QXJnX0dldERvdWJsZUFycmF5KGFyZ3MsIDYsIDAsIGFyZzEgLCBhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19HZXRMb25nQXJyYXlTaXplKGFyZ3MsIDYsIDEsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKChhcmc0ID0gUHlNZW1fTkVXKGRvdWJsZSwgYXJnMyApKSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIH0KKyAgICBpZiAoIVB5QXJnX0dldERvdWJsZUFycmF5KGFyZ3MsIDYsIDEsIGFyZzMgLCBhcmc0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19HZXRMb25nKGFyZ3MsIDYsIDMsICZhcmc2KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19HZXRMb25nKGFyZ3MsIDYsIDQsICZhcmc3KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19HZXRMb25nKGFyZ3MsIDYsIDUsICZhcmc4KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKGFyZzggPT0gTl9YWVopCisgICAgICAgIG5jb29yZHMgPSAzOworICAgIGVsc2UgaWYgKGFyZzggPT0gTl9YWVpXKQorICAgICAgICBuY29vcmRzID0gNDsKKyAgICBlbHNlIHsKKyAgICAgICAgUHlFcnJfQmFkQXJndW1lbnQoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHNfbmN0bCA9IGFyZzEgLSBhcmc2OworICAgIHRfbmN0bCA9IGFyZzMgLSBhcmc3OworICAgIGlmICghUHlBcmdfR2V0T2JqZWN0KGFyZ3MsIDYsIDIsICZ2KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUxpc3RfQ2hlY2sodikgfHwgUHlMaXN0X1NpemUodikgIT0gc19uY3RsKSB7CisgICAgICAgIFB5RXJyX0JhZEFyZ3VtZW50KCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoKGFyZzUgPSBQeU1lbV9ORVcoZG91YmxlLCBzX25jdGwqdF9uY3RsKm5jb29yZHMgKSkgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICB9CisgICAgcG5leHQgPSBhcmc1OworICAgIGZvciAocyA9IDA7IHMgPCBzX25jdGw7IHMrKykgeworICAgICAgICB3ID0gUHlMaXN0X0dldEl0ZW0odiwgcyk7CisgICAgICAgIGlmICh3ID09IE5VTEwgfHwgIVB5TGlzdF9DaGVjayh3KSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUxpc3RfU2l6ZSh3KSAhPSB0X25jdGwpIHsKKyAgICAgICAgICAgIFB5RXJyX0JhZEFyZ3VtZW50KCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBmb3IgKHQgPSAwOyB0IDwgdF9uY3RsOyB0KyspIHsKKyAgICAgICAgICAgIHB0ID0gUHlMaXN0X0dldEl0ZW0odywgdCk7CisgICAgICAgICAgICBpZiAoIVB5QXJnX0dldERvdWJsZUFycmF5KHB0LCAxLCAwLCBuY29vcmRzLCBwbmV4dCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICBwbmV4dCArPSBuY29vcmRzOworICAgICAgICB9CisgICAgfQorICAgIHNfYnl0ZV9zdHJpZGUgPSBzaXplb2YoZG91YmxlKSAqIG5jb29yZHM7CisgICAgdF9ieXRlX3N0cmlkZSA9IHNfYnl0ZV9zdHJpZGUgKiBzX25jdGw7CisgICAgbnVyYnNzdXJmYWNlKCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICwKKyAgICAgICAgc19ieXRlX3N0cmlkZSAsIHRfYnl0ZV9zdHJpZGUgLCBhcmc1ICwgYXJnNiAsIGFyZzcgLCBhcmc4ICk7CisgICAgUHlNZW1fREVMKGFyZzIpOworICAgIFB5TWVtX0RFTChhcmc0KTsKKyAgICBQeU1lbV9ERUwoYXJnNSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiBudXJic2N1cnZlKGtub3RzLCBjdGxwb2ludHMsIG9yZGVyLCB0eXBlKS4KQEAgLTMyMSw1NyArMzIxLDU3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfbnVyYnNjdXJ2ZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlkb3VibGUgKiBhcmcyIDsKLQlsb25nIGFyZzMgOwotCWRvdWJsZSAqIGFyZzQgOwotCWxvbmcgYXJnNSA7Ci0JbG9uZyBhcmc2IDsKLQlpbnQgbmNvb3JkcywgbnBvaW50czsKLQlpbnQgaTsKLQlQeU9iamVjdCAqdjsKLQlkb3VibGUgKnBuZXh0OwotCWlmICghUHlBcmdfR2V0TG9uZ0FycmF5U2l6ZShhcmdzLCA0LCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICgoYXJnMiA9IFB5TWVtX05FVyhkb3VibGUsIGFyZzEgKSkgPT0gTlVMTCkgewotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQl9Ci0JaWYgKCFQeUFyZ19HZXREb3VibGVBcnJheShhcmdzLCA0LCAwLCBhcmcxICwgYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghUHlBcmdfR2V0TG9uZyhhcmdzLCA0LCAyLCAmYXJnNSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghUHlBcmdfR2V0TG9uZyhhcmdzLCA0LCAzLCAmYXJnNikpCi0JCXJldHVybiBOVUxMOwotCWlmIChhcmc2ID09IE5fU1QpCi0JCW5jb29yZHMgPSAyOwotCWVsc2UgaWYgKGFyZzYgPT0gTl9TVFcpCi0JCW5jb29yZHMgPSAzOwotCWVsc2UgewotCQlQeUVycl9CYWRBcmd1bWVudCgpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JbnBvaW50cyA9IGFyZzEgLSBhcmc1OwotCWlmICghUHlBcmdfR2V0T2JqZWN0KGFyZ3MsIDQsIDEsICZ2KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFQeUxpc3RfQ2hlY2sodikgfHwgUHlMaXN0X1NpemUodikgIT0gbnBvaW50cykgewotCQlQeUVycl9CYWRBcmd1bWVudCgpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKChhcmc0ID0gUHlNZW1fTkVXKGRvdWJsZSwgbnBvaW50cypuY29vcmRzICkpID09IE5VTEwpIHsKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JfQotCXBuZXh0ID0gYXJnNDsKLQlmb3IgKGkgPSAwOyBpIDwgbnBvaW50czsgaSsrKSB7Ci0JCWlmICghUHlBcmdfR2V0RG91YmxlQXJyYXkoUHlMaXN0X0dldEl0ZW0odiwgaSksIDEsIDAsIG5jb29yZHMsIHBuZXh0KSkKLQkJCXJldHVybiBOVUxMOwotCQlwbmV4dCArPSBuY29vcmRzOwotCX0KLQlhcmczID0gKHNpemVvZihkb3VibGUpKSAqIG5jb29yZHM7Ci0JbnVyYnNjdXJ2ZSggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCAsIGFyZzUgLCBhcmc2ICk7Ci0JUHlNZW1fREVMKGFyZzIpOwotCVB5TWVtX0RFTChhcmc0KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBkb3VibGUgKiBhcmcyIDsKKyAgICBsb25nIGFyZzMgOworICAgIGRvdWJsZSAqIGFyZzQgOworICAgIGxvbmcgYXJnNSA7CisgICAgbG9uZyBhcmc2IDsKKyAgICBpbnQgbmNvb3JkcywgbnBvaW50czsKKyAgICBpbnQgaTsKKyAgICBQeU9iamVjdCAqdjsKKyAgICBkb3VibGUgKnBuZXh0OworICAgIGlmICghUHlBcmdfR2V0TG9uZ0FycmF5U2l6ZShhcmdzLCA0LCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICgoYXJnMiA9IFB5TWVtX05FVyhkb3VibGUsIGFyZzEgKSkgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICB9CisgICAgaWYgKCFQeUFyZ19HZXREb3VibGVBcnJheShhcmdzLCA0LCAwLCBhcmcxICwgYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfR2V0TG9uZyhhcmdzLCA0LCAyLCAmYXJnNSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfR2V0TG9uZyhhcmdzLCA0LCAzLCAmYXJnNikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChhcmc2ID09IE5fU1QpCisgICAgICAgIG5jb29yZHMgPSAyOworICAgIGVsc2UgaWYgKGFyZzYgPT0gTl9TVFcpCisgICAgICAgIG5jb29yZHMgPSAzOworICAgIGVsc2UgeworICAgICAgICBQeUVycl9CYWRBcmd1bWVudCgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgbnBvaW50cyA9IGFyZzEgLSBhcmc1OworICAgIGlmICghUHlBcmdfR2V0T2JqZWN0KGFyZ3MsIDQsIDEsICZ2KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUxpc3RfQ2hlY2sodikgfHwgUHlMaXN0X1NpemUodikgIT0gbnBvaW50cykgeworICAgICAgICBQeUVycl9CYWRBcmd1bWVudCgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKChhcmc0ID0gUHlNZW1fTkVXKGRvdWJsZSwgbnBvaW50cypuY29vcmRzICkpID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgfQorICAgIHBuZXh0ID0gYXJnNDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnBvaW50czsgaSsrKSB7CisgICAgICAgIGlmICghUHlBcmdfR2V0RG91YmxlQXJyYXkoUHlMaXN0X0dldEl0ZW0odiwgaSksIDEsIDAsIG5jb29yZHMsIHBuZXh0KSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBwbmV4dCArPSBuY29vcmRzOworICAgIH0KKyAgICBhcmczID0gKHNpemVvZihkb3VibGUpKSAqIG5jb29yZHM7CisgICAgbnVyYnNjdXJ2ZSggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCAsIGFyZzUgLCBhcmc2ICk7CisgICAgUHlNZW1fREVMKGFyZzIpOworICAgIFB5TWVtX0RFTChhcmc0KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHB3bGN1cnZlKHBvaW50cywgdHlwZSkuCkBAIC0zODEsMzkgKzM4MSwzOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3B3bGN1cnZlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqdjsKLQlsb25nIHR5cGU7Ci0JZG91YmxlICpkYXRhLCAqcG5leHQ7Ci0JbG9uZyBucG9pbnRzLCBuY29vcmRzOwotCWludCBpOwotCWlmICghUHlBcmdfR2V0T2JqZWN0KGFyZ3MsIDIsIDAsICZ2KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFQeUFyZ19HZXRMb25nKGFyZ3MsIDIsIDEsICZ0eXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFQeUxpc3RfQ2hlY2sodikpIHsKLQkJUHlFcnJfQmFkQXJndW1lbnQoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCW5wb2ludHMgPSBQeUxpc3RfU2l6ZSh2KTsKLQlpZiAodHlwZSA9PSBOX1NUKQotCQluY29vcmRzID0gMjsKLQllbHNlIHsKLQkJUHlFcnJfQmFkQXJndW1lbnQoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmICgoZGF0YSA9IFB5TWVtX05FVyhkb3VibGUsIG5wb2ludHMqbmNvb3JkcykpID09IE5VTEwpIHsKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JfQotCXBuZXh0ID0gZGF0YTsKLQlmb3IgKGkgPSAwOyBpIDwgbnBvaW50czsgaSsrKSB7Ci0JCWlmICghUHlBcmdfR2V0RG91YmxlQXJyYXkoUHlMaXN0X0dldEl0ZW0odiwgaSksIDEsIDAsIG5jb29yZHMsIHBuZXh0KSkKLQkJCXJldHVybiBOVUxMOwotCQlwbmV4dCArPSBuY29vcmRzOwotCX0KLQlwd2xjdXJ2ZShucG9pbnRzLCBkYXRhLCBzaXplb2YoZG91YmxlKSpuY29vcmRzLCB0eXBlKTsKLQlQeU1lbV9ERUwoZGF0YSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5T2JqZWN0ICp2OworICAgIGxvbmcgdHlwZTsKKyAgICBkb3VibGUgKmRhdGEsICpwbmV4dDsKKyAgICBsb25nIG5wb2ludHMsIG5jb29yZHM7CisgICAgaW50IGk7CisgICAgaWYgKCFQeUFyZ19HZXRPYmplY3QoYXJncywgMiwgMCwgJnYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX0dldExvbmcoYXJncywgMiwgMSwgJnR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5TGlzdF9DaGVjayh2KSkgeworICAgICAgICBQeUVycl9CYWRBcmd1bWVudCgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgbnBvaW50cyA9IFB5TGlzdF9TaXplKHYpOworICAgIGlmICh0eXBlID09IE5fU1QpCisgICAgICAgIG5jb29yZHMgPSAyOworICAgIGVsc2UgeworICAgICAgICBQeUVycl9CYWRBcmd1bWVudCgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKChkYXRhID0gUHlNZW1fTkVXKGRvdWJsZSwgbnBvaW50cypuY29vcmRzKSkgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICB9CisgICAgcG5leHQgPSBkYXRhOworICAgIGZvciAoaSA9IDA7IGkgPCBucG9pbnRzOyBpKyspIHsKKyAgICAgICAgaWYgKCFQeUFyZ19HZXREb3VibGVBcnJheShQeUxpc3RfR2V0SXRlbSh2LCBpKSwgMSwgMCwgbmNvb3JkcywgcG5leHQpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHBuZXh0ICs9IG5jb29yZHM7CisgICAgfQorICAgIHB3bGN1cnZlKG5wb2ludHMsIGRhdGEsIHNpemVvZihkb3VibGUpKm5jb29yZHMsIHR5cGUpOworICAgIFB5TWVtX0RFTChkYXRhKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIApAQCAtNDI1LDU2ICs0MjUsNTYgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBwaWNrX3NlbGVjdChQeU9iamVjdCAqYXJncywgdm9pZCAoKmZ1bmMpKCkpCiB7Ci0JaWYgKCFQeUFyZ19HZXRMb25nKGFyZ3MsIDEsIDAsICZwaWNrYnVmZmVyc2l6ZSkpCi0JCXJldHVybiBOVUxMOwotCWlmIChwaWNrYnVmZmVyICE9IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKLQkJCSJwaWNrL2dzZWxlY3Q6IGFscmVhZHkgcGlja2luZy9zZWxlY3RpbmciKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmICgocGlja2J1ZmZlciA9IFB5TWVtX05FVyhzaG9ydCwgcGlja2J1ZmZlcnNpemUpKSA9PSBOVUxMKSB7Ci0JCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCX0KLQkoKmZ1bmMpKHBpY2tidWZmZXIsIHBpY2tidWZmZXJzaXplKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKCFQeUFyZ19HZXRMb25nKGFyZ3MsIDEsIDAsICZwaWNrYnVmZmVyc2l6ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChwaWNrYnVmZmVyICE9IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICJwaWNrL2dzZWxlY3Q6IGFscmVhZHkgcGlja2luZy9zZWxlY3RpbmciKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmICgocGlja2J1ZmZlciA9IFB5TWVtX05FVyhzaG9ydCwgcGlja2J1ZmZlcnNpemUpKSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIH0KKyAgICAoKmZ1bmMpKHBpY2tidWZmZXIsIHBpY2tidWZmZXJzaXplKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBlbmRwaWNrX3NlbGVjdChsb25nICgqZnVuYykoKSkKIHsKLQlQeU9iamVjdCAqdiwgKnc7Ci0JaW50IGksIG5oaXRzLCBuOwotCWlmIChwaWNrYnVmZmVyID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKLQkJCSJlbmRwaWNrL2VuZHNlbGVjdDogbm90IGluIHBpY2svc2VsZWN0IG1vZGUiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCW5oaXRzID0gKCpmdW5jKShwaWNrYnVmZmVyKTsKLQlpZiAobmhpdHMgPCAwKSB7Ci0JCW5oaXRzID0gLW5oaXRzOyAvKiBIb3cgdG8gcmVwb3J0IGJ1ZmZlciBvdmVyZmxvdyBvdGhlcndpc2U/ICovCi0JfQotCS8qIFNjYW4gdGhlIGJ1ZmZlciB0byBzZWUgaG93IG1hbnkgaW50ZWdlcnMgKi8KLQluID0gMDsKLQlmb3IgKDsgbmhpdHMgPiAwOyBuaGl0cy0tKSB7Ci0JCW4gKz0gMSArIHBpY2tidWZmZXJbbl07Ci0JfQotCXYgPSBQeUxpc3RfTmV3KG4pOwotCWlmICh2ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCS8qIFhYWCBDb3VsZCBkbyBpdCBuaWNlciBhbmQgaW50ZXJwcmV0IHRoZSBkYXRhIHN0cnVjdHVyZSBoZXJlLAotCSAgIHJldHVybmluZyBhIGxpc3Qgb2YgbGlzdHMuIEJ1dCB0aGlzIGNhbiBiZSBkb25lIGluIFB5dGhvbi4uLiAqLwotCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJdyA9IFB5SW50X0Zyb21Mb25nKChsb25nKXBpY2tidWZmZXJbaV0pOwotCQlpZiAodyA9PSBOVUxMKSB7Ci0JCQlQeV9ERUNSRUYodik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlQeUxpc3RfU2V0SXRlbSh2LCBpLCB3KTsKLQl9Ci0JUHlNZW1fREVMKHBpY2tidWZmZXIpOwotCXBpY2tidWZmZXIgPSBOVUxMOwotCXJldHVybiB2OworICAgIFB5T2JqZWN0ICp2LCAqdzsKKyAgICBpbnQgaSwgbmhpdHMsIG47CisgICAgaWYgKHBpY2tidWZmZXIgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAorICAgICAgICAgICAgImVuZHBpY2svZW5kc2VsZWN0OiBub3QgaW4gcGljay9zZWxlY3QgbW9kZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgbmhpdHMgPSAoKmZ1bmMpKHBpY2tidWZmZXIpOworICAgIGlmIChuaGl0cyA8IDApIHsKKyAgICAgICAgbmhpdHMgPSAtbmhpdHM7IC8qIEhvdyB0byByZXBvcnQgYnVmZmVyIG92ZXJmbG93IG90aGVyd2lzZT8gKi8KKyAgICB9CisgICAgLyogU2NhbiB0aGUgYnVmZmVyIHRvIHNlZSBob3cgbWFueSBpbnRlZ2VycyAqLworICAgIG4gPSAwOworICAgIGZvciAoOyBuaGl0cyA+IDA7IG5oaXRzLS0pIHsKKyAgICAgICAgbiArPSAxICsgcGlja2J1ZmZlcltuXTsKKyAgICB9CisgICAgdiA9IFB5TGlzdF9OZXcobik7CisgICAgaWYgKHYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgLyogWFhYIENvdWxkIGRvIGl0IG5pY2VyIGFuZCBpbnRlcnByZXQgdGhlIGRhdGEgc3RydWN0dXJlIGhlcmUsCisgICAgICAgcmV0dXJuaW5nIGEgbGlzdCBvZiBsaXN0cy4gQnV0IHRoaXMgY2FuIGJlIGRvbmUgaW4gUHl0aG9uLi4uICovCisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICB3ID0gUHlJbnRfRnJvbUxvbmcoKGxvbmcpcGlja2J1ZmZlcltpXSk7CisgICAgICAgIGlmICh3ID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIFB5TGlzdF9TZXRJdGVtKHYsIGksIHcpOworICAgIH0KKyAgICBQeU1lbV9ERUwocGlja2J1ZmZlcik7CisgICAgcGlja2J1ZmZlciA9IE5VTEw7CisgICAgcmV0dXJuIHY7CiB9CiAKIGV4dGVybiB2b2lkIHBpY2soKSwgZ3NlbGVjdCgpOwpAQCAtNDgyLDIyICs0ODIsMjIgQEAKIAogc3RhdGljIFB5T2JqZWN0ICpnbF9waWNrKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gcGlja19zZWxlY3QoYXJncywgcGljayk7CisgICAgcmV0dXJuIHBpY2tfc2VsZWN0KGFyZ3MsIHBpY2spOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKmdsX2VuZHBpY2soUHlPYmplY3QgKnNlbGYpCiB7Ci0JcmV0dXJuIGVuZHBpY2tfc2VsZWN0KGVuZHBpY2spOworICAgIHJldHVybiBlbmRwaWNrX3NlbGVjdChlbmRwaWNrKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpnbF9nc2VsZWN0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gcGlja19zZWxlY3QoYXJncywgZ3NlbGVjdCk7CisgICAgcmV0dXJuIHBpY2tfc2VsZWN0KGFyZ3MsIGdzZWxlY3QpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKmdsX2VuZHNlbGVjdChQeU9iamVjdCAqc2VsZikKIHsKLQlyZXR1cm4gZW5kcGlja19zZWxlY3QoZW5kc2VsZWN0KTsKKyAgICByZXR1cm4gZW5kcGlja19zZWxlY3QoZW5kc2VsZWN0KTsKIH0KIAogCkBAIC01MDksMjMgKzUwOSwyMyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2dldG1hdHJpeChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JTWF0cml4IGFyZzE7Ci0JUHlPYmplY3QgKnYsICp3OwotCWludCBpLCBqOwotCWdldG1hdHJpeCggYXJnMSApOwotCXYgPSBQeUxpc3RfTmV3KDE2KTsKLQlpZiAodiA9PSBOVUxMKSB7Ci0JCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCX0KLQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSBmb3IgKGogPSAwOyBqIDwgNDsgaisrKSB7Ci0JCXcgPSBta25ld2Zsb2F0b2JqZWN0KGFyZzFbaV1bal0pOwotCQlpZiAodyA9PSBOVUxMKSB7Ci0JCQlQeV9ERUNSRUYodik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlQeUxpc3RfU2V0SXRlbSh2LCBpKjQraiwgdyk7Ci0JfQotCXJldHVybiB2OworICAgIE1hdHJpeCBhcmcxOworICAgIFB5T2JqZWN0ICp2LCAqdzsKKyAgICBpbnQgaSwgajsKKyAgICBnZXRtYXRyaXgoIGFyZzEgKTsKKyAgICB2ID0gUHlMaXN0X05ldygxNik7CisgICAgaWYgKHYgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgZm9yIChqID0gMDsgaiA8IDQ7IGorKykgeworICAgICAgICB3ID0gbWtuZXdmbG9hdG9iamVjdChhcmcxW2ldW2pdKTsKKyAgICAgICAgaWYgKHcgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgUHlMaXN0X1NldEl0ZW0odiwgaSo0K2osIHcpOworICAgIH0KKyAgICByZXR1cm4gdjsKIH0KIAogLyogSGVyZSdzIGFuIGFsdGVybmF0ZSB2ZXJzaW9uIHRoYXQgcmV0dXJucyBhIDR4NCBtYXRyaXggaW5zdGVhZCBvZgpAQCAtNTM2LDEzNyArNTM2LDEzNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2FsdGdldG1hdHJpeChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JTWF0cml4IGFyZzE7Ci0JUHlPYmplY3QgKnYsICp3OwotCWludCBpLCBqOwotCWdldG1hdHJpeCggYXJnMSApOwotCXYgPSBQeUxpc3RfTmV3KDQpOwotCWlmICh2ID09IE5VTEwpIHsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKLQkJdyA9IFB5TGlzdF9OZXcoNCk7Ci0JCWlmICh3ID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRih2KTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCVB5TGlzdF9TZXRJdGVtKHYsIGksIHcpOwotCX0KLQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0JCWZvciAoaiA9IDA7IGogPCA0OyBqKyspIHsKLQkJCXcgPSBta25ld2Zsb2F0b2JqZWN0KGFyZzFbaV1bal0pOwotCQkJaWYgKHcgPT0gTlVMTCkgewotCQkJCVB5X0RFQ1JFRih2KTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJCVB5TGlzdF9TZXRJdGVtKFB5TGlzdF9HZXRJdGVtKHYsIGkpLCBqLCB3KTsKLQkJfQotCX0KLQlyZXR1cm4gdjsKKyAgICBNYXRyaXggYXJnMTsKKyAgICBQeU9iamVjdCAqdiwgKnc7CisgICAgaW50IGksIGo7CisgICAgZ2V0bWF0cml4KCBhcmcxICk7CisgICAgdiA9IFB5TGlzdF9OZXcoNCk7CisgICAgaWYgKHYgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICB3ID0gUHlMaXN0X05ldyg0KTsKKyAgICAgICAgaWYgKHcgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgUHlMaXN0X1NldEl0ZW0odiwgaSwgdyk7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykgeworICAgICAgICAgICAgdyA9IG1rbmV3ZmxvYXRvYmplY3QoYXJnMVtpXVtqXSk7CisgICAgICAgICAgICBpZiAodyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlMaXN0X1NldEl0ZW0oUHlMaXN0X0dldEl0ZW0odiwgaSksIGosIHcpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB2OwogfQogCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9scmVjdHdyaXRlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCB4MSA7Ci0Jc2hvcnQgeTEgOwotCXNob3J0IHgyIDsKLQlzaG9ydCB5MiA7Ci0Jc3RyaW5nIHBhcnJheSA7Ci0JUHlPYmplY3QgKnM7CisgICAgc2hvcnQgeDEgOworICAgIHNob3J0IHkxIDsKKyAgICBzaG9ydCB4MiA7CisgICAgc2hvcnQgeTIgOworICAgIHN0cmluZyBwYXJyYXkgOworICAgIFB5T2JqZWN0ICpzOwogI2lmIDAKLQlpbnQgcGl4Y291bnQ7CisgICAgaW50IHBpeGNvdW50OwogI2VuZGlmCi0JaWYgKCFQeUFyZ19HZXRTaG9ydChhcmdzLCA1LCAwLCAmeDEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIVB5QXJnX0dldFNob3J0KGFyZ3MsIDUsIDEsICZ5MSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghUHlBcmdfR2V0U2hvcnQoYXJncywgNSwgMiwgJngyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFQeUFyZ19HZXRTaG9ydChhcmdzLCA1LCAzLCAmeTIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIVB5QXJnX0dldFN0cmluZyhhcmdzLCA1LCA0LCAmcGFycmF5KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFQeUFyZ19HZXRPYmplY3QoYXJncywgNSwgNCwgJnMpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX0dldFNob3J0KGFyZ3MsIDUsIDAsICZ4MSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfR2V0U2hvcnQoYXJncywgNSwgMSwgJnkxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19HZXRTaG9ydChhcmdzLCA1LCAyLCAmeDIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX0dldFNob3J0KGFyZ3MsIDUsIDMsICZ5MikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfR2V0U3RyaW5nKGFyZ3MsIDUsIDQsICZwYXJyYXkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX0dldE9iamVjdChhcmdzLCA1LCA0LCAmcykpCisgICAgICAgIHJldHVybiBOVUxMOwogI2lmIDAKIC8qIERvbid0IGNoZWNrIHRoaXMsIGl0IGJyZWFrcyBleHBlcmltZW50cyB3aXRoIHBpeG1vZGUoUE1fU0laRSwgLi4uKSAqLwotCXBpeGNvdW50ID0gKGxvbmcpKHgyKzEteDEpICogKGxvbmcpKHkyKzEteTEpOwotCWlmICghUHlTdHJpbmdfQ2hlY2socykgfHwgUHlTdHJpbmdfU2l6ZShzKSAhPSBwaXhjb3VudCpzaXplb2YobG9uZykpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKLQkJCSAgICJzdHJpbmcgYXJnIHRvIGxyZWN0d3JpdGUgaGFzIHdyb25nIHNpemUiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIHBpeGNvdW50ID0gKGxvbmcpKHgyKzEteDEpICogKGxvbmcpKHkyKzEteTEpOworICAgIGlmICghUHlTdHJpbmdfQ2hlY2socykgfHwgUHlTdHJpbmdfU2l6ZShzKSAhPSBwaXhjb3VudCpzaXplb2YobG9uZykpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAic3RyaW5nIGFyZyB0byBscmVjdHdyaXRlIGhhcyB3cm9uZyBzaXplIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KICNlbmRpZgotCWxyZWN0d3JpdGUoIHgxICwgeTEgLCB4MiAsIHkyICwgKHVuc2lnbmVkIGxvbmcgKikgcGFycmF5ICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxyZWN0d3JpdGUoIHgxICwgeTEgLCB4MiAsIHkyICwgKHVuc2lnbmVkIGxvbmcgKikgcGFycmF5ICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9scmVjdHJlYWQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IHgxIDsKLQlzaG9ydCB5MSA7Ci0Jc2hvcnQgeDIgOwotCXNob3J0IHkyIDsKLQlQeU9iamVjdCAqcGFycmF5OwotCWludCBwaXhjb3VudDsKLQlpZiAoIVB5QXJnX0dldFNob3J0KGFyZ3MsIDQsIDAsICZ4MSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghUHlBcmdfR2V0U2hvcnQoYXJncywgNCwgMSwgJnkxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFQeUFyZ19HZXRTaG9ydChhcmdzLCA0LCAyLCAmeDIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIVB5QXJnX0dldFNob3J0KGFyZ3MsIDQsIDMsICZ5MikpCi0JCXJldHVybiBOVUxMOwotCXBpeGNvdW50ID0gKGxvbmcpKHgyKzEteDEpICogKGxvbmcpKHkyKzEteTEpOwotCXBhcnJheSA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopTlVMTCwgcGl4Y291bnQqc2l6ZW9mKGxvbmcpKTsKLQlpZiAocGFycmF5ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOyAvKiBObyBtZW1vcnkgKi8KLQlscmVjdHJlYWQoeDEsIHkxLCB4MiwgeTIsICh1bnNpZ25lZCBsb25nICopIFB5U3RyaW5nX0FzU3RyaW5nKHBhcnJheSkpOwotCXJldHVybiBwYXJyYXk7CisgICAgc2hvcnQgeDEgOworICAgIHNob3J0IHkxIDsKKyAgICBzaG9ydCB4MiA7CisgICAgc2hvcnQgeTIgOworICAgIFB5T2JqZWN0ICpwYXJyYXk7CisgICAgaW50IHBpeGNvdW50OworICAgIGlmICghUHlBcmdfR2V0U2hvcnQoYXJncywgNCwgMCwgJngxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19HZXRTaG9ydChhcmdzLCA0LCAxLCAmeTEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX0dldFNob3J0KGFyZ3MsIDQsIDIsICZ4MikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfR2V0U2hvcnQoYXJncywgNCwgMywgJnkyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcGl4Y291bnQgPSAobG9uZykoeDIrMS14MSkgKiAobG9uZykoeTIrMS15MSk7CisgICAgcGFycmF5ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilOVUxMLCBwaXhjb3VudCpzaXplb2YobG9uZykpOworICAgIGlmIChwYXJyYXkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7IC8qIE5vIG1lbW9yeSAqLworICAgIGxyZWN0cmVhZCh4MSwgeTEsIHgyLCB5MiwgKHVuc2lnbmVkIGxvbmcgKikgUHlTdHJpbmdfQXNTdHJpbmcocGFycmF5KSk7CisgICAgcmV0dXJuIHBhcnJheTsKIH0KIAogCiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcmVhZGRpc3BsYXkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotICAgICAgICBzaG9ydCB4MSwgeTEsIHgyLCB5MjsKLQl1bnNpZ25lZCBsb25nICpwYXJyYXksIGhpbnRzOwotCWxvbmcgc2l6ZSwgc2l6ZV9yZXQ7Ci0JUHlPYmplY3QgKnJ2OworICAgIHNob3J0IHgxLCB5MSwgeDIsIHkyOworICAgIHVuc2lnbmVkIGxvbmcgKnBhcnJheSwgaGludHM7CisgICAgbG9uZyBzaXplLCBzaXplX3JldDsKKyAgICBQeU9iamVjdCAqcnY7CiAKLQlpZiAoICFQeUFyZ19QYXJzZShhcmdzLCAiaGhoaGwiLCAmeDEsICZ5MSwgJngyLCAmeTIsICZoaW50cykgKQotCSAgcmV0dXJuIDA7Ci0Jc2l6ZSA9IChsb25nKSh4MisxLXgxKSAqIChsb25nKSh5MisxLXkxKTsKLQlydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopTlVMTCwgc2l6ZSpzaXplb2YobG9uZykpOwotCWlmICggcnYgPT0gTlVMTCApCi0JICByZXR1cm4gTlVMTDsKLQlwYXJyYXkgPSAodW5zaWduZWQgbG9uZyAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKLQlzaXplX3JldCA9IHJlYWRkaXNwbGF5KHgxLCB5MSwgeDIsIHkyLCBwYXJyYXksIGhpbnRzKTsKLQlpZiAoIHNpemVfcmV0ICE9IHNpemUgKSB7Ci0JICAgIHByaW50ZigiZ2xfcmVhZGRpc3BsYXk6IGdvdCAlbGQgcGl4ZWxzLCBleHBlY3RlZCAlbGRcbiIsCi0JCSAgIHNpemVfcmV0LCBzaXplKTsKLQkgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgInJlYWRkaXNwbGF5IHJldHVybmVkIHVuZXhwZWN0ZWQgbGVuZ3RoIik7Ci0JICAgIHJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gcnY7CisgICAgaWYgKCAhUHlBcmdfUGFyc2UoYXJncywgImhoaGhsIiwgJngxLCAmeTEsICZ4MiwgJnkyLCAmaGludHMpICkKKyAgICAgIHJldHVybiAwOworICAgIHNpemUgPSAobG9uZykoeDIrMS14MSkgKiAobG9uZykoeTIrMS15MSk7CisgICAgcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKU5VTEwsIHNpemUqc2l6ZW9mKGxvbmcpKTsKKyAgICBpZiAoIHJ2ID09IE5VTEwgKQorICAgICAgcmV0dXJuIE5VTEw7CisgICAgcGFycmF5ID0gKHVuc2lnbmVkIGxvbmcgKilQeVN0cmluZ19Bc1N0cmluZyhydik7CisgICAgc2l6ZV9yZXQgPSByZWFkZGlzcGxheSh4MSwgeTEsIHgyLCB5MiwgcGFycmF5LCBoaW50cyk7CisgICAgaWYgKCBzaXplX3JldCAhPSBzaXplICkgeworICAgICAgICBwcmludGYoImdsX3JlYWRkaXNwbGF5OiBnb3QgJWxkIHBpeGVscywgZXhwZWN0ZWQgJWxkXG4iLAorICAgICAgICAgICBzaXplX3JldCwgc2l6ZSk7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJyZWFkZGlzcGxheSByZXR1cm5lZCB1bmV4cGVjdGVkIGxlbmd0aCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIHJ2OwogfQogCiAvKiBEZXNwZXJhdGVseSBuZWVkZWQsIGhlcmUgYXJlIHRvb2xzIHRvIGNvbXByZXNzIGFuZCBkZWNvbXByZXNzCiAgICB0aGUgZGF0YSBtYW5pcHVsYXRlZCBieSBscmVjdHJlYWQvbHJlY3R3cml0ZS4KIAogICAgZ2wucGFja3JlY3Qod2lkdGgsIGhlaWdodCwgcGFja2ZhY3RvciwgYmlnZGF0YSkgLS0+IHNtYWxsZGF0YQotCQltYWtlcyAnYmlnZGF0YScgNCoocGFja2ZhY3RvcioqMikgdGltZXMgc21hbGxlciBieToKLQkJLSB0dXJuaW5nIGl0IGludG8gQi9XIChhIGZhY3RvciA0KQotCQktIHJlcGxhY2luZyBzcXVhcmVzIG9mIHNpemUgcGFjZmFjdG9yIGJ5IG9uZQotCQkgIHJlcHJlc2VudGF0aXZlCisgICAgICAgICAgICAgICAgbWFrZXMgJ2JpZ2RhdGEnIDQqKHBhY2tmYWN0b3IqKjIpIHRpbWVzIHNtYWxsZXIgYnk6CisgICAgICAgIC0gdHVybmluZyBpdCBpbnRvIEIvVyAoYSBmYWN0b3IgNCkKKyAgICAgICAgLSByZXBsYWNpbmcgc3F1YXJlcyBvZiBzaXplIHBhY2ZhY3RvciBieSBvbmUKKyAgICAgICAgICByZXByZXNlbnRhdGl2ZQogCiAgICBnbC51bnBhY2tyZWN0KHdpZHRoLCBoZWlnaHQsIHBhY2tmYWN0b3IsIHNtYWxsZGF0YSkgLS0+IGJpZ2RhdGEKLQkJaXMgdGhlIGludmVyc2U7IHRoZSBudW1lcmljIGFyZ3VtZW50cyBtdXN0IGJlICp0aGUgc2FtZSouCisgICAgICAgICAgICAgICAgaXMgdGhlIGludmVyc2U7IHRoZSBudW1lcmljIGFyZ3VtZW50cyBtdXN0IGJlICp0aGUgc2FtZSouCiAKICAgIEJvdGggd29yayBiZXN0IGlmIHdpZHRoIGFuZCBoZWlnaHQgYXJlIG11bHRpcGxlcyBvZiBwYWNrZmFjdG9yCiAgICAoaW4gZmFjdCB1bnBhY2tyZWN0IHdpbGwgbGVhdmUgZ2FyYmFnZSBieXRlcykuCkBAIC02NzYsNTAgKzY3Niw1MCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3BhY2tyZWN0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIHdpZHRoLCBoZWlnaHQsIHBhY2tmYWN0b3I7Ci0JY2hhciAqczsKLQlQeU9iamVjdCAqdW5wYWNrZWQsICpwYWNrZWQ7Ci0JaW50IHBpeGNvdW50LCBwYWNrZWRjb3VudCwgeCwgeSwgciwgZywgYjsKLQl1bnNpZ25lZCBsb25nIHBpeGVsOwotCXVuc2lnbmVkIGNoYXIgKnA7Ci0JdW5zaWduZWQgbG9uZyAqcGFycmF5OwotCWlmICghUHlBcmdfR2V0TG9uZyhhcmdzLCA0LCAwLCAmd2lkdGgpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIVB5QXJnX0dldExvbmcoYXJncywgNCwgMSwgJmhlaWdodCkpCi0JCXJldHVybiBOVUxMOwotCWlmICghUHlBcmdfR2V0TG9uZyhhcmdzLCA0LCAyLCAmcGFja2ZhY3RvcikpCi0JCXJldHVybiBOVUxMOwotCWlmICghUHlBcmdfR2V0U3RyaW5nKGFyZ3MsIDQsIDMsICZzKSkgLyogRm9yIHR5cGUgY2hlY2tpbmcgb25seSAqLwotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIVB5QXJnX0dldE9iamVjdChhcmdzLCA0LCAzLCAmdW5wYWNrZWQpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAod2lkdGggPD0gMCB8fCBoZWlnaHQgPD0gMCB8fCBwYWNrZmFjdG9yIDw9IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgInBhY2tyZWN0IGFyZ3MgbXVzdCBiZSA+IDAiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXBpeGNvdW50ID0gd2lkdGgqaGVpZ2h0OwotCXBhY2tlZGNvdW50ID0gKCh3aWR0aCtwYWNrZmFjdG9yLTEpL3BhY2tmYWN0b3IpICoKLQkJKChoZWlnaHQrcGFja2ZhY3Rvci0xKS9wYWNrZmFjdG9yKTsKLQlpZiAoUHlTdHJpbmdfU2l6ZSh1bnBhY2tlZCkgIT0gcGl4Y291bnQqc2l6ZW9mKGxvbmcpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCi0JCQkgICAic3RyaW5nIGFyZyB0byBwYWNrcmVjdCBoYXMgd3Jvbmcgc2l6ZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcGFja2VkID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilOVUxMLCBwYWNrZWRjb3VudCk7Ci0JaWYgKHBhY2tlZCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlwYXJyYXkgPSAodW5zaWduZWQgbG9uZyAqKSBQeVN0cmluZ19Bc1N0cmluZyh1bnBhY2tlZCk7Ci0JcCA9ICh1bnNpZ25lZCBjaGFyICopIFB5U3RyaW5nX0FzU3RyaW5nKHBhY2tlZCk7Ci0JZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSArPSBwYWNrZmFjdG9yLCBwYXJyYXkgKz0gcGFja2ZhY3Rvcip3aWR0aCkgewotCQlmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHggKz0gcGFja2ZhY3RvcikgewotCQkJcGl4ZWwgPSBwYXJyYXlbeF07Ci0JCQlyID0gcGl4ZWwgJiAweGZmOwotCQkJZyA9IChwaXhlbCA+PiA4KSAmIDB4ZmY7Ci0JCQliID0gKHBpeGVsID4+IDE2KSAmIDB4ZmY7Ci0JCQkqcCsrID0gKDMwKnIrNTkqZysxMSpiKSAvIDEwMDsKLQkJfQotCX0KLQlyZXR1cm4gcGFja2VkOworICAgIGxvbmcgd2lkdGgsIGhlaWdodCwgcGFja2ZhY3RvcjsKKyAgICBjaGFyICpzOworICAgIFB5T2JqZWN0ICp1bnBhY2tlZCwgKnBhY2tlZDsKKyAgICBpbnQgcGl4Y291bnQsIHBhY2tlZGNvdW50LCB4LCB5LCByLCBnLCBiOworICAgIHVuc2lnbmVkIGxvbmcgcGl4ZWw7CisgICAgdW5zaWduZWQgY2hhciAqcDsKKyAgICB1bnNpZ25lZCBsb25nICpwYXJyYXk7CisgICAgaWYgKCFQeUFyZ19HZXRMb25nKGFyZ3MsIDQsIDAsICZ3aWR0aCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfR2V0TG9uZyhhcmdzLCA0LCAxLCAmaGVpZ2h0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19HZXRMb25nKGFyZ3MsIDQsIDIsICZwYWNrZmFjdG9yKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19HZXRTdHJpbmcoYXJncywgNCwgMywgJnMpKSAvKiBGb3IgdHlwZSBjaGVja2luZyBvbmx5ICovCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfR2V0T2JqZWN0KGFyZ3MsIDQsIDMsICZ1bnBhY2tlZCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICh3aWR0aCA8PSAwIHx8IGhlaWdodCA8PSAwIHx8IHBhY2tmYWN0b3IgPD0gMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAicGFja3JlY3QgYXJncyBtdXN0IGJlID4gMCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcGl4Y291bnQgPSB3aWR0aCpoZWlnaHQ7CisgICAgcGFja2VkY291bnQgPSAoKHdpZHRoK3BhY2tmYWN0b3ItMSkvcGFja2ZhY3RvcikgKgorICAgICAgICAoKGhlaWdodCtwYWNrZmFjdG9yLTEpL3BhY2tmYWN0b3IpOworICAgIGlmIChQeVN0cmluZ19TaXplKHVucGFja2VkKSAhPSBwaXhjb3VudCpzaXplb2YobG9uZykpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAic3RyaW5nIGFyZyB0byBwYWNrcmVjdCBoYXMgd3Jvbmcgc2l6ZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcGFja2VkID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilOVUxMLCBwYWNrZWRjb3VudCk7CisgICAgaWYgKHBhY2tlZCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBwYXJyYXkgPSAodW5zaWduZWQgbG9uZyAqKSBQeVN0cmluZ19Bc1N0cmluZyh1bnBhY2tlZCk7CisgICAgcCA9ICh1bnNpZ25lZCBjaGFyICopIFB5U3RyaW5nX0FzU3RyaW5nKHBhY2tlZCk7CisgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSArPSBwYWNrZmFjdG9yLCBwYXJyYXkgKz0gcGFja2ZhY3Rvcip3aWR0aCkgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHggKz0gcGFja2ZhY3RvcikgeworICAgICAgICAgICAgcGl4ZWwgPSBwYXJyYXlbeF07CisgICAgICAgICAgICByID0gcGl4ZWwgJiAweGZmOworICAgICAgICAgICAgZyA9IChwaXhlbCA+PiA4KSAmIDB4ZmY7CisgICAgICAgICAgICBiID0gKHBpeGVsID4+IDE2KSAmIDB4ZmY7CisgICAgICAgICAgICAqcCsrID0gKDMwKnIrNTkqZysxMSpiKSAvIDEwMDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcGFja2VkOwogfQogCiAKQEAgLTcyOSw3NyArNzI5LDc3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfdW5wYWNrcmVjdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyB3aWR0aCwgaGVpZ2h0LCBwYWNrZmFjdG9yOwotCWNoYXIgKnM7Ci0JUHlPYmplY3QgKnVucGFja2VkLCAqcGFja2VkOwotCWludCBwaXhjb3VudCwgcGFja2VkY291bnQ7Ci0JcmVnaXN0ZXIgdW5zaWduZWQgY2hhciAqcDsKLQlyZWdpc3RlciB1bnNpZ25lZCBsb25nICpwYXJyYXk7Ci0JaWYgKCF1bnBhY2t0YWJfaW5pdGVkKSB7Ci0JCXJlZ2lzdGVyIGludCB3aGl0ZTsKLQkJZm9yICh3aGl0ZSA9IDI1NjsgLS13aGl0ZSA+PSAwOyApCi0JCQl1bnBhY2t0YWJbd2hpdGVdID0gd2hpdGUgKiAweDAxMDEwMUw7Ci0JCXVucGFja3RhYl9pbml0ZWQrKzsKLQl9Ci0JaWYgKCFQeUFyZ19HZXRMb25nKGFyZ3MsIDQsIDAsICZ3aWR0aCkpCi0JCXJldHVybiBOVUxMOwotCWlmICghUHlBcmdfR2V0TG9uZyhhcmdzLCA0LCAxLCAmaGVpZ2h0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFQeUFyZ19HZXRMb25nKGFyZ3MsIDQsIDIsICZwYWNrZmFjdG9yKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFQeUFyZ19HZXRTdHJpbmcoYXJncywgNCwgMywgJnMpKSAvKiBGb3IgdHlwZSBjaGVja2luZyBvbmx5ICovCi0JCXJldHVybiBOVUxMOwotCWlmICghUHlBcmdfR2V0T2JqZWN0KGFyZ3MsIDQsIDMsICZwYWNrZWQpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAod2lkdGggPD0gMCB8fCBoZWlnaHQgPD0gMCB8fCBwYWNrZmFjdG9yIDw9IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgInBhY2tyZWN0IGFyZ3MgbXVzdCBiZSA+IDAiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXBpeGNvdW50ID0gd2lkdGgqaGVpZ2h0OwotCXBhY2tlZGNvdW50ID0gKCh3aWR0aCtwYWNrZmFjdG9yLTEpL3BhY2tmYWN0b3IpICoKLQkJKChoZWlnaHQrcGFja2ZhY3Rvci0xKS9wYWNrZmFjdG9yKTsKLQlpZiAoUHlTdHJpbmdfU2l6ZShwYWNrZWQpICE9IHBhY2tlZGNvdW50KSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCi0JCQkgICAic3RyaW5nIGFyZyB0byB1bnBhY2tyZWN0IGhhcyB3cm9uZyBzaXplIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQl1bnBhY2tlZCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopTlVMTCwgcGl4Y291bnQqc2l6ZW9mKGxvbmcpKTsKLQlpZiAodW5wYWNrZWQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JcGFycmF5ID0gKHVuc2lnbmVkIGxvbmcgKikgUHlTdHJpbmdfQXNTdHJpbmcodW5wYWNrZWQpOwotCXAgPSAodW5zaWduZWQgY2hhciAqKSBQeVN0cmluZ19Bc1N0cmluZyhwYWNrZWQpOwotCWlmIChwYWNrZmFjdG9yID09IDEgJiYgd2lkdGgqaGVpZ2h0ID4gMCkgewotCQkvKiBKdXN0IGV4cGFuZCBieXRlcyB0byBsb25ncyAqLwotCQlyZWdpc3RlciBpbnQgeCA9IHdpZHRoICogaGVpZ2h0OwotCQlkbyB7Ci0JCQkqcGFycmF5KysgPSB1bnBhY2t0YWJbKnArK107Ci0JCX0gd2hpbGUgKC0teCA+PSAwKTsKLQl9Ci0JZWxzZSB7Ci0JCXJlZ2lzdGVyIGludCB5OwotCQlmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0LXBhY2tmYWN0b3IrMTsKLQkJICAgICB5ICs9IHBhY2tmYWN0b3IsIHBhcnJheSArPSBwYWNrZmFjdG9yKndpZHRoKSB7Ci0JCQlyZWdpc3RlciBpbnQgeDsKLQkJCWZvciAoeCA9IDA7IHggPCB3aWR0aC1wYWNrZmFjdG9yKzE7IHggKz0gcGFja2ZhY3RvcikgewotCQkJCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgcGl4ZWwgPSB1bnBhY2t0YWJbKnArK107Ci0JCQkJcmVnaXN0ZXIgaW50IGk7Ci0JCQkJZm9yIChpID0gcGFja2ZhY3Rvcip3aWR0aDsgKGktPXdpZHRoKSA+PSAwOykgewotCQkJCQlyZWdpc3RlciBpbnQgajsKLQkJCQkJZm9yIChqID0gcGFja2ZhY3RvcjsgLS1qID49IDA7ICkKLQkJCQkJCXBhcnJheVtpK3gral0gPSBwaXhlbDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JcmV0dXJuIHVucGFja2VkOworICAgIGxvbmcgd2lkdGgsIGhlaWdodCwgcGFja2ZhY3RvcjsKKyAgICBjaGFyICpzOworICAgIFB5T2JqZWN0ICp1bnBhY2tlZCwgKnBhY2tlZDsKKyAgICBpbnQgcGl4Y291bnQsIHBhY2tlZGNvdW50OworICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgKnA7CisgICAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyAqcGFycmF5OworICAgIGlmICghdW5wYWNrdGFiX2luaXRlZCkgeworICAgICAgICByZWdpc3RlciBpbnQgd2hpdGU7CisgICAgICAgIGZvciAod2hpdGUgPSAyNTY7IC0td2hpdGUgPj0gMDsgKQorICAgICAgICAgICAgdW5wYWNrdGFiW3doaXRlXSA9IHdoaXRlICogMHgwMTAxMDFMOworICAgICAgICB1bnBhY2t0YWJfaW5pdGVkKys7CisgICAgfQorICAgIGlmICghUHlBcmdfR2V0TG9uZyhhcmdzLCA0LCAwLCAmd2lkdGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX0dldExvbmcoYXJncywgNCwgMSwgJmhlaWdodCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfR2V0TG9uZyhhcmdzLCA0LCAyLCAmcGFja2ZhY3RvcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfR2V0U3RyaW5nKGFyZ3MsIDQsIDMsICZzKSkgLyogRm9yIHR5cGUgY2hlY2tpbmcgb25seSAqLworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX0dldE9iamVjdChhcmdzLCA0LCAzLCAmcGFja2VkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKHdpZHRoIDw9IDAgfHwgaGVpZ2h0IDw9IDAgfHwgcGFja2ZhY3RvciA8PSAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJwYWNrcmVjdCBhcmdzIG11c3QgYmUgPiAwIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBwaXhjb3VudCA9IHdpZHRoKmhlaWdodDsKKyAgICBwYWNrZWRjb3VudCA9ICgod2lkdGgrcGFja2ZhY3Rvci0xKS9wYWNrZmFjdG9yKSAqCisgICAgICAgICgoaGVpZ2h0K3BhY2tmYWN0b3ItMSkvcGFja2ZhY3Rvcik7CisgICAgaWYgKFB5U3RyaW5nX1NpemUocGFja2VkKSAhPSBwYWNrZWRjb3VudCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAorICAgICAgICAgICAgICAgICAgICJzdHJpbmcgYXJnIHRvIHVucGFja3JlY3QgaGFzIHdyb25nIHNpemUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHVucGFja2VkID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilOVUxMLCBwaXhjb3VudCpzaXplb2YobG9uZykpOworICAgIGlmICh1bnBhY2tlZCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBwYXJyYXkgPSAodW5zaWduZWQgbG9uZyAqKSBQeVN0cmluZ19Bc1N0cmluZyh1bnBhY2tlZCk7CisgICAgcCA9ICh1bnNpZ25lZCBjaGFyICopIFB5U3RyaW5nX0FzU3RyaW5nKHBhY2tlZCk7CisgICAgaWYgKHBhY2tmYWN0b3IgPT0gMSAmJiB3aWR0aCpoZWlnaHQgPiAwKSB7CisgICAgICAgIC8qIEp1c3QgZXhwYW5kIGJ5dGVzIHRvIGxvbmdzICovCisgICAgICAgIHJlZ2lzdGVyIGludCB4ID0gd2lkdGggKiBoZWlnaHQ7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgICpwYXJyYXkrKyA9IHVucGFja3RhYlsqcCsrXTsKKyAgICAgICAgfSB3aGlsZSAoLS14ID49IDApOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcmVnaXN0ZXIgaW50IHk7CisgICAgICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQtcGFja2ZhY3RvcisxOworICAgICAgICAgICAgIHkgKz0gcGFja2ZhY3RvciwgcGFycmF5ICs9IHBhY2tmYWN0b3Iqd2lkdGgpIHsKKyAgICAgICAgICAgIHJlZ2lzdGVyIGludCB4OworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoLXBhY2tmYWN0b3IrMTsgeCArPSBwYWNrZmFjdG9yKSB7CisgICAgICAgICAgICAgICAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBwaXhlbCA9IHVucGFja3RhYlsqcCsrXTsKKyAgICAgICAgICAgICAgICByZWdpc3RlciBpbnQgaTsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSBwYWNrZmFjdG9yKndpZHRoOyAoaS09d2lkdGgpID49IDA7KSB7CisgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGludCBqOworICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSBwYWNrZmFjdG9yOyAtLWogPj0gMDsgKQorICAgICAgICAgICAgICAgICAgICAgICAgcGFycmF5W2kreCtqXSA9IHBpeGVsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdW5wYWNrZWQ7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9ndmVyc2lvbihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciBidWZbMjBdOwotCWd2ZXJzaW9uKGJ1Zik7Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmKTsKKyAgICBjaGFyIGJ1ZlsyMF07CisgICAgZ3ZlcnNpb24oYnVmKTsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOwogfQogCiAKQEAgLTgwNyw5ICs4MDcsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2NsZWFyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlfX0dMY2xlYXIoICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIF9fR0xjbGVhciggKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIEVuZCBvZiBtYW51YWxseSB3cml0dGVuIHN0dWJzICovCkBAIC04MjAsOSArODIwLDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9nZXRzaGFkZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyByZXR2YWw7Ci0JcmV0dmFsID0gZ2V0c2hhZGUoICk7Ci0JcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOworICAgIGxvbmcgcmV0dmFsOworICAgIHJldHZhbCA9IGdldHNoYWRlKCApOworICAgIHJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKIH0KIAogLyogdm9pZCBkZXZwb3J0IHNob3J0IHMgbG9uZyBzICovCkBAIC04MzAsMTUgKzgzMCwxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2RldnBvcnQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCWxvbmcgYXJnMiA7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMiwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZGV2cG9ydCggYXJnMSAsIGFyZzIgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSA7CisgICAgbG9uZyBhcmcyIDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBkZXZwb3J0KCBhcmcxICwgYXJnMiApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCByZHIyaSBsb25nIHMgbG9uZyBzICovCkBAIC04NDYsMTUgKzg0NiwxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3JkcjJpKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWxvbmcgYXJnMiA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlyZHIyaSggYXJnMSAsIGFyZzIgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBsb25nIGFyZzIgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmRyMmkoIGFyZzEgLCBhcmcyICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHJlY3RmcyBzaG9ydCBzIHNob3J0IHMgc2hvcnQgcyBzaG9ydCBzICovCkBAIC04NjIsMjEgKzg2MiwyMSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3JlY3RmcyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0Jc2hvcnQgYXJnMiA7Ci0Jc2hvcnQgYXJnMyA7Ci0Jc2hvcnQgYXJnNCA7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMywgJmFyZzQpKQotCQlyZXR1cm4gTlVMTDsKLQlyZWN0ZnMoIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSA7CisgICAgc2hvcnQgYXJnMiA7CisgICAgc2hvcnQgYXJnMyA7CisgICAgc2hvcnQgYXJnNCA7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMywgJmFyZzQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZWN0ZnMoIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcmVjdHMgc2hvcnQgcyBzaG9ydCBzIHNob3J0IHMgc2hvcnQgcyAqLwpAQCAtODg0LDIxICs4ODQsMjEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9yZWN0cyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0Jc2hvcnQgYXJnMiA7Ci0Jc2hvcnQgYXJnMyA7Ci0Jc2hvcnQgYXJnNCA7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMywgJmFyZzQpKQotCQlyZXR1cm4gTlVMTDsKLQlyZWN0cyggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxIDsKKyAgICBzaG9ydCBhcmcyIDsKKyAgICBzaG9ydCBhcmczIDsKKyAgICBzaG9ydCBhcmc0IDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAzLCAmYXJnNCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJlY3RzKCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHJtdjJpIGxvbmcgcyBsb25nIHMgKi8KQEAgLTkwNiwxNSArOTA2LDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcm12MmkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JbG9uZyBhcmcyIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCXJtdjJpKCBhcmcxICwgYXJnMiApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGxvbmcgYXJnMiA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBybXYyaSggYXJnMSAsIGFyZzIgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgbm9wb3J0ICovCkBAIC05MjIsOSArOTIyLDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9ub3BvcnQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCW5vcG9ydCggKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbm9wb3J0KCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBwb3B2aWV3cG9ydCAqLwpAQCAtOTMyLDkgKzkzMiw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcG9wdmlld3BvcnQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXBvcHZpZXdwb3J0KCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBwb3B2aWV3cG9ydCggKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgY2xlYXJoaXRjb2RlICovCkBAIC05NDIsOSArOTQyLDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9jbGVhcmhpdGNvZGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNsZWFyaGl0Y29kZSggKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgY2xlYXJoaXRjb2RlKCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBjbG9zZW9iaiAqLwpAQCAtOTUyLDkgKzk1Miw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfY2xvc2VvYmooUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNsb3Nlb2JqKCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBjbG9zZW9iaiggKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgY3Vyc29mZiAqLwpAQCAtOTYyLDkgKzk2Miw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfY3Vyc29mZihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY3Vyc29mZiggKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgY3Vyc29mZiggKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgY3Vyc29uICovCkBAIC05NzIsOSArOTcyLDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9jdXJzb24oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWN1cnNvbiggKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgY3Vyc29uKCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBkb3VibGVidWZmZXIgKi8KQEAgLTk4Miw5ICs5ODIsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2RvdWJsZWJ1ZmZlcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZG91YmxlYnVmZmVyKCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBkb3VibGVidWZmZXIoICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGZpbmlzaCAqLwpAQCAtOTkyLDkgKzk5Miw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZmluaXNoKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlmaW5pc2goICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGZpbmlzaCggKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgZ2NvbmZpZyAqLwpAQCAtMTAwMiw5ICsxMDAyLDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9nY29uZmlnKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlnY29uZmlnKCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBnY29uZmlnKCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBnaW5pdCAqLwpAQCAtMTAxMiw5ICsxMDEyLDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9naW5pdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZ2luaXQoICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGdpbml0KCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBncmVzZXQgKi8KQEAgLTEwMjIsOSArMTAyMiw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZ3Jlc2V0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlncmVzZXQoICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGdyZXNldCggKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgbXVsdGltYXAgKi8KQEAgLTEwMzIsOSArMTAzMiw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfbXVsdGltYXAoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCW11bHRpbWFwKCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBtdWx0aW1hcCggKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgb25lbWFwICovCkBAIC0xMDQyLDkgKzEwNDIsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX29uZW1hcChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jb25lbWFwKCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBvbmVtYXAoICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHBvcGF0dHJpYnV0ZXMgKi8KQEAgLTEwNTIsOSArMTA1Miw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcG9wYXR0cmlidXRlcyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcG9wYXR0cmlidXRlcyggKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgcG9wYXR0cmlidXRlcyggKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcG9wbWF0cml4ICovCkBAIC0xMDYyLDkgKzEwNjIsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3BvcG1hdHJpeChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcG9wbWF0cml4KCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBwb3BtYXRyaXgoICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHB1c2hhdHRyaWJ1dGVzICovCkBAIC0xMDcyLDkgKzEwNzIsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3B1c2hhdHRyaWJ1dGVzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlwdXNoYXR0cmlidXRlcyggKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgcHVzaGF0dHJpYnV0ZXMoICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHB1c2htYXRyaXggKi8KQEAgLTEwODIsOSArMTA4Miw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcHVzaG1hdHJpeChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcHVzaG1hdHJpeCggKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgcHVzaG1hdHJpeCggKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcHVzaHZpZXdwb3J0ICovCkBAIC0xMDkyLDkgKzEwOTIsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3B1c2h2aWV3cG9ydChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcHVzaHZpZXdwb3J0KCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBwdXNodmlld3BvcnQoICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHFyZXNldCAqLwpAQCAtMTEwMiw5ICsxMTAyLDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9xcmVzZXQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXFyZXNldCggKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgcXJlc2V0KCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBSR0Jtb2RlICovCkBAIC0xMTEyLDkgKzExMTIsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX1JHQm1vZGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVJHQm1vZGUoICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFJHQm1vZGUoICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHNpbmdsZWJ1ZmZlciAqLwpAQCAtMTEyMiw5ICsxMTIyLDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9zaW5nbGVidWZmZXIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNpbmdsZWJ1ZmZlciggKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2luZ2xlYnVmZmVyKCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBzd2FwYnVmZmVycyAqLwpAQCAtMTEzMiw5ICsxMTMyLDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9zd2FwYnVmZmVycyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc3dhcGJ1ZmZlcnMoICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHN3YXBidWZmZXJzKCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBnc3luYyAqLwpAQCAtMTE0Miw5ICsxMTQyLDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9nc3luYyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZ3N5bmMoICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGdzeW5jKCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBnZmx1c2ggKi8KQEAgLTExNTIsOSArMTE1Miw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZ2ZsdXNoKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlnZmx1c2goICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGdmbHVzaCggKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgdHBvbiAqLwpAQCAtMTE2Miw5ICsxMTYyLDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF90cG9uKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQl0cG9uKCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICB0cG9uKCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCB0cG9mZiAqLwpAQCAtMTE3Miw5ICsxMTcyLDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF90cG9mZihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JdHBvZmYoICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHRwb2ZmKCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBjbGtvbiAqLwpAQCAtMTE4Miw5ICsxMTgyLDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9jbGtvbihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2xrb24oICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGNsa29uKCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBjbGtvZmYgKi8KQEAgLTExOTIsOSArMTE5Miw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfY2xrb2ZmKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljbGtvZmYoICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGNsa29mZiggKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcmluZ2JlbGwgKi8KQEAgLTEyMDIsOSArMTIwMiw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcmluZ2JlbGwoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJpbmdiZWxsKCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICByaW5nYmVsbCggKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgZ2JlZ2luICovCkBAIC0xMjEyLDkgKzEyMTIsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2diZWdpbihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZ2JlZ2luKCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBnYmVnaW4oICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHRleHRpbml0ICovCkBAIC0xMjIyLDkgKzEyMjIsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3RleHRpbml0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQl0ZXh0aW5pdCggKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgdGV4dGluaXQoICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGluaXRuYW1lcyAqLwpAQCAtMTIzMiw5ICsxMjMyLDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9pbml0bmFtZXMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWluaXRuYW1lcyggKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaW5pdG5hbWVzKCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBwY2xvcyAqLwpAQCAtMTI0Miw5ICsxMjQyLDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9wY2xvcyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcGNsb3MoICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHBjbG9zKCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBwb3BuYW1lICovCkBAIC0xMjUyLDkgKzEyNTIsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3BvcG5hbWUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXBvcG5hbWUoICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHBvcG5hbWUoICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHNwY2xvcyAqLwpAQCAtMTI2Miw5ICsxMjYyLDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9zcGNsb3MoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNwY2xvcyggKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc3BjbG9zKCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCB6Y2xlYXIgKi8KQEAgLTEyNzIsOSArMTI3Miw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfemNsZWFyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQl6Y2xlYXIoICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHpjbGVhciggKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgc2NyZWVuc3BhY2UgKi8KQEAgLTEyODIsOSArMTI4Miw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfc2NyZWVuc3BhY2UoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNjcmVlbnNwYWNlKCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzY3JlZW5zcGFjZSggKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcmVzaGFwZXZpZXdwb3J0ICovCkBAIC0xMjkyLDkgKzEyOTIsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3Jlc2hhcGV2aWV3cG9ydChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmVzaGFwZXZpZXdwb3J0KCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICByZXNoYXBldmlld3BvcnQoICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHdpbnB1c2ggKi8KQEAgLTEzMDIsOSArMTMwMiw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfd2lucHVzaChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jd2lucHVzaCggKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgd2lucHVzaCggKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgd2lucG9wICovCkBAIC0xMzEyLDkgKzEzMTIsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3dpbnBvcChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jd2lucG9wKCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICB3aW5wb3AoICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGZvcmVncm91bmQgKi8KQEAgLTEzMjIsOSArMTMyMiw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZm9yZWdyb3VuZChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZm9yZWdyb3VuZCggKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZm9yZWdyb3VuZCggKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgZW5kZnVsbHNjcm4gKi8KQEAgLTEzMzIsOSArMTMzMiw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZW5kZnVsbHNjcm4oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWVuZGZ1bGxzY3JuKCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBlbmRmdWxsc2NybiggKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgZW5kcHVwbW9kZSAqLwpAQCAtMTM0Miw5ICsxMzQyLDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9lbmRwdXBtb2RlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQllbmRwdXBtb2RlKCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBlbmRwdXBtb2RlKCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBmdWxsc2NybiAqLwpAQCAtMTM1Miw5ICsxMzUyLDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9mdWxsc2NybihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZnVsbHNjcm4oICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGZ1bGxzY3JuKCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBwdXBtb2RlICovCkBAIC0xMzYyLDkgKzEzNjIsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3B1cG1vZGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXB1cG1vZGUoICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHB1cG1vZGUoICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHdpbmNvbnN0cmFpbnRzICovCkBAIC0xMzcyLDkgKzEzNzIsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3dpbmNvbnN0cmFpbnRzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQl3aW5jb25zdHJhaW50cyggKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgd2luY29uc3RyYWludHMoICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHBhZ2Vjb2xvciBzaG9ydCBzICovCkBAIC0xMzgyLDEyICsxMzgyLDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcGFnZWNvbG9yKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCXBhZ2Vjb2xvciggYXJnMSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxIDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHBhZ2Vjb2xvciggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCB0ZXh0Y29sb3Igc2hvcnQgcyAqLwpAQCAtMTM5NSwxMiArMTM5NSwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3RleHRjb2xvcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQl0ZXh0Y29sb3IoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSA7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB0ZXh0Y29sb3IoIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgY29sb3Igc2hvcnQgcyAqLwpAQCAtMTQwOCwxMiArMTQwOCwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2NvbG9yKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWNvbG9yKCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgY29sb3IoIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgY3VydmVpdCBzaG9ydCBzICovCkBAIC0xNDIxLDEyICsxNDIxLDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfY3VydmVpdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQljdXJ2ZWl0KCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgY3VydmVpdCggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBmb250IHNob3J0IHMgKi8KQEAgLTE0MzQsMTIgKzE0MzQsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9mb250KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWZvbnQoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSA7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBmb250KCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGxpbmV3aWR0aCBzaG9ydCBzICovCkBAIC0xNDQ3LDEyICsxNDQ3LDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfbGluZXdpZHRoKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWxpbmV3aWR0aCggYXJnMSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxIDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGxpbmV3aWR0aCggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBzZXRsaW5lc3R5bGUgc2hvcnQgcyAqLwpAQCAtMTQ2MCwxMiArMTQ2MCwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3NldGxpbmVzdHlsZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlzZXRsaW5lc3R5bGUoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSA7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBzZXRsaW5lc3R5bGUoIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgc2V0bWFwIHNob3J0IHMgKi8KQEAgLTE0NzMsMTIgKzE0NzMsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9zZXRtYXAoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0Jc2V0bWFwKCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgc2V0bWFwKCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHN3YXBpbnRlcnZhbCBzaG9ydCBzICovCkBAIC0xNDg2LDEyICsxNDg2LDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfc3dhcGludGVydmFsKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCXN3YXBpbnRlcnZhbCggYXJnMSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxIDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHN3YXBpbnRlcnZhbCggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCB3cml0ZW1hc2sgc2hvcnQgcyAqLwpAQCAtMTQ5OSwxMiArMTQ5OSwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3dyaXRlbWFzayhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQl3cml0ZW1hc2soIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSA7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB3cml0ZW1hc2soIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgdGV4dHdyaXRlbWFzayBzaG9ydCBzICovCkBAIC0xNTEyLDEyICsxNTEyLDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfdGV4dHdyaXRlbWFzayhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQl0ZXh0d3JpdGVtYXNrKCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgdGV4dHdyaXRlbWFzayggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBxZGV2aWNlIHNob3J0IHMgKi8KQEAgLTE1MjUsMTIgKzE1MjUsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9xZGV2aWNlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCXFkZXZpY2UoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSA7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBxZGV2aWNlKCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHVucWRldmljZSBzaG9ydCBzICovCkBAIC0xNTM4LDEyICsxNTM4LDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfdW5xZGV2aWNlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCXVucWRldmljZSggYXJnMSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxIDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHVucWRldmljZSggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBjdXJ2ZWJhc2lzIHNob3J0IHMgKi8KQEAgLTE1NTEsMTIgKzE1NTEsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9jdXJ2ZWJhc2lzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWN1cnZlYmFzaXMoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSA7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBjdXJ2ZWJhc2lzKCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGN1cnZlcHJlY2lzaW9uIHNob3J0IHMgKi8KQEAgLTE1NjQsMTIgKzE1NjQsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9jdXJ2ZXByZWNpc2lvbihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQljdXJ2ZXByZWNpc2lvbiggYXJnMSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxIDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGN1cnZlcHJlY2lzaW9uKCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGxvYWRuYW1lIHNob3J0IHMgKi8KQEAgLTE1NzcsMTIgKzE1NzcsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9sb2FkbmFtZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlsb2FkbmFtZSggYXJnMSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxIDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGxvYWRuYW1lKCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHBhc3N0aHJvdWdoIHNob3J0IHMgKi8KQEAgLTE1OTAsMTIgKzE1OTAsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9wYXNzdGhyb3VnaChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlwYXNzdGhyb3VnaCggYXJnMSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxIDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHBhc3N0aHJvdWdoKCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHB1c2huYW1lIHNob3J0IHMgKi8KQEAgLTE2MDMsMTIgKzE2MDMsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9wdXNobmFtZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlwdXNobmFtZSggYXJnMSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxIDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHB1c2huYW1lKCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHNldG1vbml0b3Igc2hvcnQgcyAqLwpAQCAtMTYxNiwxMiArMTYxNiwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3NldG1vbml0b3IoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0Jc2V0bW9uaXRvciggYXJnMSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxIDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHNldG1vbml0b3IoIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgc2V0c2hhZGUgc2hvcnQgcyAqLwpAQCAtMTYyOSwxMiArMTYyOSwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3NldHNoYWRlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCXNldHNoYWRlKCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgc2V0c2hhZGUoIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgc2V0cGF0dGVybiBzaG9ydCBzICovCkBAIC0xNjQyLDEyICsxNjQyLDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfc2V0cGF0dGVybihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlzZXRwYXR0ZXJuKCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgc2V0cGF0dGVybiggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBwYWdld3JpdGVtYXNrIHNob3J0IHMgKi8KQEAgLTE2NTUsMTIgKzE2NTUsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9wYWdld3JpdGVtYXNrKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCXBhZ2V3cml0ZW1hc2soIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSA7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBwYWdld3JpdGVtYXNrKCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGNhbGxvYmogbG9uZyBzICovCkBAIC0xNjY4LDEyICsxNjY4LDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfY2FsbG9iaihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JY2FsbG9iaiggYXJnMSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBjYWxsb2JqKCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGRlbG9iaiBsb25nIHMgKi8KQEAgLTE2ODEsMTIgKzE2ODEsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9kZWxvYmooUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWRlbG9iaiggYXJnMSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBkZWxvYmooIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgZWRpdG9iaiBsb25nIHMgKi8KQEAgLTE2OTQsMTIgKzE2OTQsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9lZGl0b2JqKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQllZGl0b2JqKCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGVkaXRvYmooIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgbWFrZW9iaiBsb25nIHMgKi8KQEAgLTE3MDcsMTIgKzE3MDcsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9tYWtlb2JqKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQltYWtlb2JqKCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG1ha2VvYmooIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgbWFrZXRhZyBsb25nIHMgKi8KQEAgLTE3MjAsMTIgKzE3MjAsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9tYWtldGFnKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQltYWtldGFnKCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG1ha2V0YWcoIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgY2h1bmtzaXplIGxvbmcgcyAqLwpAQCAtMTczMywxMiArMTczMywxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2NodW5rc2l6ZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JY2h1bmtzaXplKCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGNodW5rc2l6ZSggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBjb21wYWN0aWZ5IGxvbmcgcyAqLwpAQCAtMTc0NiwxMiArMTc0NiwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2NvbXBhY3RpZnkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWNvbXBhY3RpZnkoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgY29tcGFjdGlmeSggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBkZWx0YWcgbG9uZyBzICovCkBAIC0xNzU5LDEyICsxNzU5LDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZGVsdGFnKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlkZWx0YWcoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZGVsdGFnKCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGxzcmVwZWF0IGxvbmcgcyAqLwpAQCAtMTc3MiwxMiArMTc3MiwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2xzcmVwZWF0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlsc3JlcGVhdCggYXJnMSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBsc3JlcGVhdCggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBvYmppbnNlcnQgbG9uZyBzICovCkBAIC0xNzg1LDEyICsxNzg1LDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfb2JqaW5zZXJ0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlvYmppbnNlcnQoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgb2JqaW5zZXJ0KCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIG9ianJlcGxhY2UgbG9uZyBzICovCkBAIC0xNzk4LDEyICsxNzk4LDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfb2JqcmVwbGFjZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0Jb2JqcmVwbGFjZSggYXJnMSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBvYmpyZXBsYWNlKCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHdpbmNsb3NlIGxvbmcgcyAqLwpAQCAtMTgxMSwxMiArMTgxMSwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3dpbmNsb3NlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQl3aW5jbG9zZSggYXJnMSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB3aW5jbG9zZSggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBibGFua3RpbWUgbG9uZyBzICovCkBAIC0xODI0LDEyICsxODI0LDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfYmxhbmt0aW1lKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlibGFua3RpbWUoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYmxhbmt0aW1lKCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGZyZWVwdXAgbG9uZyBzICovCkBAIC0xODM3LDEyICsxODM3LDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZnJlZXB1cChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZnJlZXB1cCggYXJnMSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBmcmVlcHVwKCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGJhY2tidWZmZXIgbG9uZyBzICovCkBAIC0xODUwLDEyICsxODUwLDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfYmFja2J1ZmZlcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JYmFja2J1ZmZlciggYXJnMSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBiYWNrYnVmZmVyKCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGZyb250YnVmZmVyIGxvbmcgcyAqLwpAQCAtMTg2MywxMiArMTg2MywxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2Zyb250YnVmZmVyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlmcm9udGJ1ZmZlciggYXJnMSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBmcm9udGJ1ZmZlciggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBsc2JhY2t1cCBsb25nIHMgKi8KQEAgLTE4NzYsMTIgKzE4NzYsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9sc2JhY2t1cChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JbHNiYWNrdXAoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbHNiYWNrdXAoIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcmVzZXRscyBsb25nIHMgKi8KQEAgLTE4ODksMTIgKzE4ODksMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9yZXNldGxzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXNldGxzKCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJlc2V0bHMoIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgbGFtcG9uIGxvbmcgcyAqLwpAQCAtMTkwMiwxMiArMTkwMiwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2xhbXBvbihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JbGFtcG9uKCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGxhbXBvbiggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBsYW1wb2ZmIGxvbmcgcyAqLwpAQCAtMTkxNSwxMiArMTkxNSwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2xhbXBvZmYoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWxhbXBvZmYoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbGFtcG9mZiggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBzZXRiZWxsIGxvbmcgcyAqLwpAQCAtMTkyOCwxMiArMTkyOCwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3NldGJlbGwoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCXNldGJlbGwoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgc2V0YmVsbCggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBibGFua3NjcmVlbiBsb25nIHMgKi8KQEAgLTE5NDEsMTIgKzE5NDEsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9ibGFua3NjcmVlbihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JYmxhbmtzY3JlZW4oIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYmxhbmtzY3JlZW4oIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgZGVwdGhjdWUgbG9uZyBzICovCkBAIC0xOTU0LDEyICsxOTU0LDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZGVwdGhjdWUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWRlcHRoY3VlKCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGRlcHRoY3VlKCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHpidWZmZXIgbG9uZyBzICovCkBAIC0xOTY3LDEyICsxOTY3LDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfemJ1ZmZlcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JemJ1ZmZlciggYXJnMSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB6YnVmZmVyKCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGJhY2tmYWNlIGxvbmcgcyAqLwpAQCAtMTk4MCwxMiArMTk4MCwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2JhY2tmYWNlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQliYWNrZmFjZSggYXJnMSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBiYWNrZmFjZSggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBjbW92MmkgbG9uZyBzIGxvbmcgcyAqLwpAQCAtMTk5MywxNSArMTk5MywxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2Ntb3YyaShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlsb25nIGFyZzIgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JY21vdjJpKCBhcmcxICwgYXJnMiApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGxvbmcgYXJnMiA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBjbW92MmkoIGFyZzEgLCBhcmcyICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGRyYXcyaSBsb25nIHMgbG9uZyBzICovCkBAIC0yMDA5LDE1ICsyMDA5LDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZHJhdzJpKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWxvbmcgYXJnMiA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlkcmF3MmkoIGFyZzEgLCBhcmcyICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgbG9uZyBhcmcyIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGRyYXcyaSggYXJnMSAsIGFyZzIgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgbW92ZTJpIGxvbmcgcyBsb25nIHMgKi8KQEAgLTIwMjUsMTUgKzIwMjUsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9tb3ZlMmkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JbG9uZyBhcmcyIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCW1vdmUyaSggYXJnMSAsIGFyZzIgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBsb25nIGFyZzIgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbW92ZTJpKCBhcmcxICwgYXJnMiApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBwbnQyaSBsb25nIHMgbG9uZyBzICovCkBAIC0yMDQxLDE1ICsyMDQxLDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcG50MmkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JbG9uZyBhcmcyIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCXBudDJpKCBhcmcxICwgYXJnMiApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGxvbmcgYXJnMiA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBwbnQyaSggYXJnMSAsIGFyZzIgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcGF0Y2hiYXNpcyBsb25nIHMgbG9uZyBzICovCkBAIC0yMDU3LDE1ICsyMDU3LDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcGF0Y2hiYXNpcyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlsb25nIGFyZzIgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcGF0Y2hiYXNpcyggYXJnMSAsIGFyZzIgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBsb25nIGFyZzIgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcGF0Y2hiYXNpcyggYXJnMSAsIGFyZzIgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcGF0Y2hwcmVjaXNpb24gbG9uZyBzIGxvbmcgcyAqLwpAQCAtMjA3MywxNSArMjA3MywxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3BhdGNocHJlY2lzaW9uKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWxvbmcgYXJnMiA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlwYXRjaHByZWNpc2lvbiggYXJnMSAsIGFyZzIgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBsb25nIGFyZzIgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcGF0Y2hwcmVjaXNpb24oIGFyZzEgLCBhcmcyICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHBkcjJpIGxvbmcgcyBsb25nIHMgKi8KQEAgLTIwODksMTUgKzIwODksMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9wZHIyaShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlsb25nIGFyZzIgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcGRyMmkoIGFyZzEgLCBhcmcyICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgbG9uZyBhcmcyIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHBkcjJpKCBhcmcxICwgYXJnMiApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBwbXYyaSBsb25nIHMgbG9uZyBzICovCkBAIC0yMTA1LDE1ICsyMTA1LDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcG12MmkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JbG9uZyBhcmcyIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCXBtdjJpKCBhcmcxICwgYXJnMiApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGxvbmcgYXJnMiA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBwbXYyaSggYXJnMSAsIGFyZzIgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcnBkcjJpIGxvbmcgcyBsb25nIHMgKi8KQEAgLTIxMjEsMTUgKzIxMjEsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9ycGRyMmkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JbG9uZyBhcmcyIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCXJwZHIyaSggYXJnMSAsIGFyZzIgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBsb25nIGFyZzIgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcnBkcjJpKCBhcmcxICwgYXJnMiApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBycG12MmkgbG9uZyBzIGxvbmcgcyAqLwpAQCAtMjEzNywxNSArMjEzNywxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3JwbXYyaShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlsb25nIGFyZzIgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcnBtdjJpKCBhcmcxICwgYXJnMiApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGxvbmcgYXJnMiA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBycG12MmkoIGFyZzEgLCBhcmcyICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHhmcHQyaSBsb25nIHMgbG9uZyBzICovCkBAIC0yMTUzLDE1ICsyMTUzLDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfeGZwdDJpKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWxvbmcgYXJnMiA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQl4ZnB0MmkoIGFyZzEgLCBhcmcyICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgbG9uZyBhcmcyIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHhmcHQyaSggYXJnMSAsIGFyZzIgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgb2JqZGVsZXRlIGxvbmcgcyBsb25nIHMgKi8KQEAgLTIxNjksMTUgKzIxNjksMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9vYmpkZWxldGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JbG9uZyBhcmcyIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCW9iamRlbGV0ZSggYXJnMSAsIGFyZzIgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBsb25nIGFyZzIgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgb2JqZGVsZXRlKCBhcmcxICwgYXJnMiApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBwYXRjaGN1cnZlcyBsb25nIHMgbG9uZyBzICovCkBAIC0yMTg1LDE1ICsyMTg1LDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcGF0Y2hjdXJ2ZXMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JbG9uZyBhcmcyIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCXBhdGNoY3VydmVzKCBhcmcxICwgYXJnMiApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGxvbmcgYXJnMiA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBwYXRjaGN1cnZlcyggYXJnMSAsIGFyZzIgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgbWluc2l6ZSBsb25nIHMgbG9uZyBzICovCkBAIC0yMjAxLDE1ICsyMjAxLDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfbWluc2l6ZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlsb25nIGFyZzIgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JbWluc2l6ZSggYXJnMSAsIGFyZzIgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBsb25nIGFyZzIgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbWluc2l6ZSggYXJnMSAsIGFyZzIgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgbWF4c2l6ZSBsb25nIHMgbG9uZyBzICovCkBAIC0yMjE3LDE1ICsyMjE3LDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfbWF4c2l6ZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlsb25nIGFyZzIgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JbWF4c2l6ZSggYXJnMSAsIGFyZzIgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBsb25nIGFyZzIgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbWF4c2l6ZSggYXJnMSAsIGFyZzIgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQga2VlcGFzcGVjdCBsb25nIHMgbG9uZyBzICovCkBAIC0yMjMzLDE1ICsyMjMzLDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfa2VlcGFzcGVjdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlsb25nIGFyZzIgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0Ja2VlcGFzcGVjdCggYXJnMSAsIGFyZzIgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBsb25nIGFyZzIgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAga2VlcGFzcGVjdCggYXJnMSAsIGFyZzIgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcHJlZnNpemUgbG9uZyBzIGxvbmcgcyAqLwpAQCAtMjI0OSwxNSArMjI0OSwxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3ByZWZzaXplKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWxvbmcgYXJnMiA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlwcmVmc2l6ZSggYXJnMSAsIGFyZzIgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBsb25nIGFyZzIgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcHJlZnNpemUoIGFyZzEgLCBhcmcyICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHN0ZXB1bml0IGxvbmcgcyBsb25nIHMgKi8KQEAgLTIyNjUsMTUgKzIyNjUsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9zdGVwdW5pdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlsb25nIGFyZzIgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0Jc3RlcHVuaXQoIGFyZzEgLCBhcmcyICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgbG9uZyBhcmcyIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHN0ZXB1bml0KCBhcmcxICwgYXJnMiApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBmdWRnZSBsb25nIHMgbG9uZyBzICovCkBAIC0yMjgxLDE1ICsyMjgxLDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZnVkZ2UoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JbG9uZyBhcmcyIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWZ1ZGdlKCBhcmcxICwgYXJnMiApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGxvbmcgYXJnMiA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBmdWRnZSggYXJnMSAsIGFyZzIgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgd2lubW92ZSBsb25nIHMgbG9uZyBzICovCkBAIC0yMjk3LDE1ICsyMjk3LDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfd2lubW92ZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlsb25nIGFyZzIgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0Jd2lubW92ZSggYXJnMSAsIGFyZzIgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBsb25nIGFyZzIgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgd2lubW92ZSggYXJnMSAsIGFyZzIgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgYXR0YWNoY3Vyc29yIHNob3J0IHMgc2hvcnQgcyAqLwpAQCAtMjMxMywxNSArMjMxMywxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2F0dGFjaGN1cnNvcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0Jc2hvcnQgYXJnMiA7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMiwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWF0dGFjaGN1cnNvciggYXJnMSAsIGFyZzIgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSA7CisgICAgc2hvcnQgYXJnMiA7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMiwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGF0dGFjaGN1cnNvciggYXJnMSAsIGFyZzIgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgZGVmbGluZXN0eWxlIHNob3J0IHMgc2hvcnQgcyAqLwpAQCAtMjMyOSwxNSArMjMyOSwxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2RlZmxpbmVzdHlsZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0Jc2hvcnQgYXJnMiA7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMiwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWRlZmxpbmVzdHlsZSggYXJnMSAsIGFyZzIgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSA7CisgICAgc2hvcnQgYXJnMiA7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMiwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGRlZmxpbmVzdHlsZSggYXJnMSAsIGFyZzIgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgbm9pc2Ugc2hvcnQgcyBzaG9ydCBzICovCkBAIC0yMzQ1LDE1ICsyMzQ1LDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfbm9pc2UoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCXNob3J0IGFyZzIgOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMiwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlub2lzZSggYXJnMSAsIGFyZzIgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSA7CisgICAgc2hvcnQgYXJnMiA7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMiwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG5vaXNlKCBhcmcxICwgYXJnMiApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBwaWNrc2l6ZSBzaG9ydCBzIHNob3J0IHMgKi8KQEAgLTIzNjEsMTUgKzIzNjEsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9waWNrc2l6ZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0Jc2hvcnQgYXJnMiA7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMiwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCXBpY2tzaXplKCBhcmcxICwgYXJnMiApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxIDsKKyAgICBzaG9ydCBhcmcyIDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcGlja3NpemUoIGFyZzEgLCBhcmcyICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHFlbnRlciBzaG9ydCBzIHNob3J0IHMgKi8KQEAgLTIzNzcsMTUgKzIzNzcsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9xZW50ZXIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCXNob3J0IGFyZzIgOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMiwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlxZW50ZXIoIGFyZzEgLCBhcmcyICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgOworICAgIHNob3J0IGFyZzIgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMiwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBxZW50ZXIoIGFyZzEgLCBhcmcyICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHNldGRlcHRoIHNob3J0IHMgc2hvcnQgcyAqLwpAQCAtMjM5MywxNSArMjM5MywxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3NldGRlcHRoKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlzaG9ydCBhcmcyIDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0Jc2V0ZGVwdGgoIGFyZzEgLCBhcmcyICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgOworICAgIHNob3J0IGFyZzIgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMiwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBzZXRkZXB0aCggYXJnMSAsIGFyZzIgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgY21vdjJzIHNob3J0IHMgc2hvcnQgcyAqLwpAQCAtMjQwOSwxNSArMjQwOSwxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2Ntb3YycyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0Jc2hvcnQgYXJnMiA7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMiwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWNtb3YycyggYXJnMSAsIGFyZzIgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSA7CisgICAgc2hvcnQgYXJnMiA7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMiwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGNtb3YycyggYXJnMSAsIGFyZzIgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgZHJhdzJzIHNob3J0IHMgc2hvcnQgcyAqLwpAQCAtMjQyNSwxNSArMjQyNSwxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2RyYXcycyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0Jc2hvcnQgYXJnMiA7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMiwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWRyYXcycyggYXJnMSAsIGFyZzIgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSA7CisgICAgc2hvcnQgYXJnMiA7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMiwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGRyYXcycyggYXJnMSAsIGFyZzIgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgbW92ZTJzIHNob3J0IHMgc2hvcnQgcyAqLwpAQCAtMjQ0MSwxNSArMjQ0MSwxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX21vdmUycyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0Jc2hvcnQgYXJnMiA7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMiwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCW1vdmUycyggYXJnMSAsIGFyZzIgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSA7CisgICAgc2hvcnQgYXJnMiA7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMiwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG1vdmUycyggYXJnMSAsIGFyZzIgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcGRyMnMgc2hvcnQgcyBzaG9ydCBzICovCkBAIC0yNDU3LDE1ICsyNDU3LDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcGRyMnMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCXNob3J0IGFyZzIgOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMiwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlwZHIycyggYXJnMSAsIGFyZzIgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSA7CisgICAgc2hvcnQgYXJnMiA7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMiwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHBkcjJzKCBhcmcxICwgYXJnMiApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBwbXYycyBzaG9ydCBzIHNob3J0IHMgKi8KQEAgLTI0NzMsMTUgKzI0NzMsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9wbXYycyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0Jc2hvcnQgYXJnMiA7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMiwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCXBtdjJzKCBhcmcxICwgYXJnMiApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxIDsKKyAgICBzaG9ydCBhcmcyIDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcG12MnMoIGFyZzEgLCBhcmcyICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHBudDJzIHNob3J0IHMgc2hvcnQgcyAqLwpAQCAtMjQ4OSwxNSArMjQ4OSwxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3BudDJzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlzaG9ydCBhcmcyIDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcG50MnMoIGFyZzEgLCBhcmcyICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgOworICAgIHNob3J0IGFyZzIgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMiwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBwbnQycyggYXJnMSAsIGFyZzIgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcmRyMnMgc2hvcnQgcyBzaG9ydCBzICovCkBAIC0yNTA1LDE1ICsyNTA1LDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcmRyMnMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCXNob3J0IGFyZzIgOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMiwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlyZHIycyggYXJnMSAsIGFyZzIgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSA7CisgICAgc2hvcnQgYXJnMiA7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMiwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJkcjJzKCBhcmcxICwgYXJnMiApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBybXYycyBzaG9ydCBzIHNob3J0IHMgKi8KQEAgLTI1MjEsMTUgKzI1MjEsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9ybXYycyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0Jc2hvcnQgYXJnMiA7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMiwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCXJtdjJzKCBhcmcxICwgYXJnMiApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxIDsKKyAgICBzaG9ydCBhcmcyIDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcm12MnMoIGFyZzEgLCBhcmcyICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHJwZHIycyBzaG9ydCBzIHNob3J0IHMgKi8KQEAgLTI1MzcsMTUgKzI1MzcsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9ycGRyMnMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCXNob3J0IGFyZzIgOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMiwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlycGRyMnMoIGFyZzEgLCBhcmcyICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgOworICAgIHNob3J0IGFyZzIgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMiwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBycGRyMnMoIGFyZzEgLCBhcmcyICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHJwbXYycyBzaG9ydCBzIHNob3J0IHMgKi8KQEAgLTI1NTMsMTUgKzI1NTMsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9ycG12MnMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCXNob3J0IGFyZzIgOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMiwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlycG12MnMoIGFyZzEgLCBhcmcyICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgOworICAgIHNob3J0IGFyZzIgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMiwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBycG12MnMoIGFyZzEgLCBhcmcyICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHhmcHQycyBzaG9ydCBzIHNob3J0IHMgKi8KQEAgLTI1NjksMTUgKzI1NjksMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF94ZnB0MnMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCXNob3J0IGFyZzIgOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMiwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQl4ZnB0MnMoIGFyZzEgLCBhcmcyICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgOworICAgIHNob3J0IGFyZzIgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMiwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB4ZnB0MnMoIGFyZzEgLCBhcmcyICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGNtb3YyIGZsb2F0IHMgZmxvYXQgcyAqLwpAQCAtMjU4NSwxNSArMjU4NSwxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2Ntb3YyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlmbG9hdCBhcmcxIDsKLQlmbG9hdCBhcmcyIDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JY21vdjIoIGFyZzEgLCBhcmcyICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGZsb2F0IGFyZzEgOworICAgIGZsb2F0IGFyZzIgOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMiwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBjbW92MiggYXJnMSAsIGFyZzIgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgZHJhdzIgZmxvYXQgcyBmbG9hdCBzICovCkBAIC0yNjAxLDE1ICsyNjAxLDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZHJhdzIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWZsb2F0IGFyZzEgOwotCWZsb2F0IGFyZzIgOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMiwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlkcmF3MiggYXJnMSAsIGFyZzIgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZmxvYXQgYXJnMSA7CisgICAgZmxvYXQgYXJnMiA7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMiwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAyLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGRyYXcyKCBhcmcxICwgYXJnMiApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBtb3ZlMiBmbG9hdCBzIGZsb2F0IHMgKi8KQEAgLTI2MTcsMTUgKzI2MTcsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9tb3ZlMihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZmxvYXQgYXJnMSA7Ci0JZmxvYXQgYXJnMiA7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMiwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAyLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCW1vdmUyKCBhcmcxICwgYXJnMiApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBmbG9hdCBhcmcxIDsKKyAgICBmbG9hdCBhcmcyIDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbW92ZTIoIGFyZzEgLCBhcmcyICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHBudDIgZmxvYXQgcyBmbG9hdCBzICovCkBAIC0yNjMzLDE1ICsyNjMzLDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcG50MihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZmxvYXQgYXJnMSA7Ci0JZmxvYXQgYXJnMiA7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMiwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAyLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCXBudDIoIGFyZzEgLCBhcmcyICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGZsb2F0IGFyZzEgOworICAgIGZsb2F0IGFyZzIgOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMiwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBwbnQyKCBhcmcxICwgYXJnMiApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBwZHIyIGZsb2F0IHMgZmxvYXQgcyAqLwpAQCAtMjY0OSwxNSArMjY0OSwxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3BkcjIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWZsb2F0IGFyZzEgOwotCWZsb2F0IGFyZzIgOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMiwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlwZHIyKCBhcmcxICwgYXJnMiApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBmbG9hdCBhcmcxIDsKKyAgICBmbG9hdCBhcmcyIDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcGRyMiggYXJnMSAsIGFyZzIgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcG12MiBmbG9hdCBzIGZsb2F0IHMgKi8KQEAgLTI2NjUsMTUgKzI2NjUsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9wbXYyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlmbG9hdCBhcmcxIDsKLQlmbG9hdCBhcmcyIDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcG12MiggYXJnMSAsIGFyZzIgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZmxvYXQgYXJnMSA7CisgICAgZmxvYXQgYXJnMiA7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMiwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAyLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHBtdjIoIGFyZzEgLCBhcmcyICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHJkcjIgZmxvYXQgcyBmbG9hdCBzICovCkBAIC0yNjgxLDE1ICsyNjgxLDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcmRyMihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZmxvYXQgYXJnMSA7Ci0JZmxvYXQgYXJnMiA7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMiwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAyLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCXJkcjIoIGFyZzEgLCBhcmcyICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGZsb2F0IGFyZzEgOworICAgIGZsb2F0IGFyZzIgOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMiwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZHIyKCBhcmcxICwgYXJnMiApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBybXYyIGZsb2F0IHMgZmxvYXQgcyAqLwpAQCAtMjY5NywxNSArMjY5NywxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3JtdjIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWZsb2F0IGFyZzEgOwotCWZsb2F0IGFyZzIgOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMiwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlybXYyKCBhcmcxICwgYXJnMiApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBmbG9hdCBhcmcxIDsKKyAgICBmbG9hdCBhcmcyIDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcm12MiggYXJnMSAsIGFyZzIgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcnBkcjIgZmxvYXQgcyBmbG9hdCBzICovCkBAIC0yNzEzLDE1ICsyNzEzLDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcnBkcjIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWZsb2F0IGFyZzEgOwotCWZsb2F0IGFyZzIgOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMiwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlycGRyMiggYXJnMSAsIGFyZzIgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZmxvYXQgYXJnMSA7CisgICAgZmxvYXQgYXJnMiA7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMiwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAyLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJwZHIyKCBhcmcxICwgYXJnMiApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBycG12MiBmbG9hdCBzIGZsb2F0IHMgKi8KQEAgLTI3MjksMTUgKzI3MjksMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9ycG12MihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZmxvYXQgYXJnMSA7Ci0JZmxvYXQgYXJnMiA7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMiwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAyLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCXJwbXYyKCBhcmcxICwgYXJnMiApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBmbG9hdCBhcmcxIDsKKyAgICBmbG9hdCBhcmcyIDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcnBtdjIoIGFyZzEgLCBhcmcyICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHhmcHQyIGZsb2F0IHMgZmxvYXQgcyAqLwpAQCAtMjc0NSwxNSArMjc0NSwxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3hmcHQyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlmbG9hdCBhcmcxIDsKLQlmbG9hdCBhcmcyIDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JeGZwdDIoIGFyZzEgLCBhcmcyICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGZsb2F0IGFyZzEgOworICAgIGZsb2F0IGFyZzIgOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMiwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB4ZnB0MiggYXJnMSAsIGFyZzIgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgbG9hZG1hdHJpeCBmbG9hdCBzWzQqNF0gKi8KQEAgLTI3NjEsMTIgKzI3NjEsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9sb2FkbWF0cml4KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlmbG9hdCBhcmcxIFsgNCBdIFsgNCBdIDsKLQlpZiAoIWdldGlmbG9hdGFycmF5KGFyZ3MsIDEsIDAsIDQgKiA0ICwgKGZsb2F0ICopIGFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlsb2FkbWF0cml4KCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGZsb2F0IGFyZzEgWyA0IF0gWyA0IF0gOworICAgIGlmICghZ2V0aWZsb2F0YXJyYXkoYXJncywgMSwgMCwgNCAqIDQgLCAoZmxvYXQgKikgYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGxvYWRtYXRyaXgoIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgbXVsdG1hdHJpeCBmbG9hdCBzWzQqNF0gKi8KQEAgLTI3NzQsMTIgKzI3NzQsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9tdWx0bWF0cml4KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlmbG9hdCBhcmcxIFsgNCBdIFsgNCBdIDsKLQlpZiAoIWdldGlmbG9hdGFycmF5KGFyZ3MsIDEsIDAsIDQgKiA0ICwgKGZsb2F0ICopIGFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQltdWx0bWF0cml4KCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGZsb2F0IGFyZzEgWyA0IF0gWyA0IF0gOworICAgIGlmICghZ2V0aWZsb2F0YXJyYXkoYXJncywgMSwgMCwgNCAqIDQgLCAoZmxvYXQgKikgYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG11bHRtYXRyaXgoIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgY3J2IGZsb2F0IHNbMyo0XSAqLwpAQCAtMjc4NywxMiArMjc4NywxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2NydihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZmxvYXQgYXJnMSBbIDQgXSBbIDMgXSA7Ci0JaWYgKCFnZXRpZmxvYXRhcnJheShhcmdzLCAxLCAwLCAzICogNCAsIChmbG9hdCAqKSBhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JY3J2KCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGZsb2F0IGFyZzEgWyA0IF0gWyAzIF0gOworICAgIGlmICghZ2V0aWZsb2F0YXJyYXkoYXJncywgMSwgMCwgMyAqIDQgLCAoZmxvYXQgKikgYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGNydiggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCByY3J2IGZsb2F0IHNbNCo0XSAqLwpAQCAtMjgwMCwxMiArMjgwMCwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3JjcnYoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWZsb2F0IGFyZzEgWyA0IF0gWyA0IF0gOwotCWlmICghZ2V0aWZsb2F0YXJyYXkoYXJncywgMSwgMCwgNCAqIDQgLCAoZmxvYXQgKikgYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCXJjcnYoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZmxvYXQgYXJnMSBbIDQgXSBbIDQgXSA7CisgICAgaWYgKCFnZXRpZmxvYXRhcnJheShhcmdzLCAxLCAwLCA0ICogNCAsIChmbG9hdCAqKSBhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmNydiggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBhZGR0b3B1cCBsb25nIHMgY2hhciAqcyBsb25nIHMgKi8KQEAgLTI4MTMsMTggKzI4MTMsMTggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9hZGR0b3B1cChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlzdHJpbmcgYXJnMiA7Ci0JbG9uZyBhcmczIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc3RyaW5nYXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCWFkZHRvcHVwKCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBzdHJpbmcgYXJnMiA7CisgICAgbG9uZyBhcmczIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc3RyaW5nYXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGFkZHRvcHVwKCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgY2hhcnN0ciBjaGFyICpzICovCkBAIC0yODMyLDEyICsyODMyLDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfY2hhcnN0cihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc3RyaW5nIGFyZzEgOwotCWlmICghZ2V0aXN0cmluZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWNoYXJzdHIoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc3RyaW5nIGFyZzEgOworICAgIGlmICghZ2V0aXN0cmluZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGNoYXJzdHIoIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgZ2V0cG9ydCBjaGFyICpzICovCkBAIC0yODQ1LDEyICsyODQ1LDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZ2V0cG9ydChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc3RyaW5nIGFyZzEgOwotCWlmICghZ2V0aXN0cmluZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWdldHBvcnQoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc3RyaW5nIGFyZzEgOworICAgIGlmICghZ2V0aXN0cmluZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGdldHBvcnQoIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIGxvbmcgc3Ryd2lkdGggY2hhciAqcyAqLwpAQCAtMjg1OCwxMiArMjg1OCwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3N0cndpZHRoKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIHJldHZhbDsKLQlzdHJpbmcgYXJnMSA7Ci0JaWYgKCFnZXRpc3RyaW5nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dmFsID0gc3Ryd2lkdGgoIGFyZzEgKTsKLQlyZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CisgICAgbG9uZyByZXR2YWw7CisgICAgc3RyaW5nIGFyZzEgOworICAgIGlmICghZ2V0aXN0cmluZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHZhbCA9IHN0cndpZHRoKCBhcmcxICk7CisgICAgcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOwogfQogCiAvKiBsb25nIHdpbm9wZW4gY2hhciAqcyAqLwpAQCAtMjg3MSwxMiArMjg3MSwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3dpbm9wZW4oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgcmV0dmFsOwotCXN0cmluZyBhcmcxIDsKLQlpZiAoIWdldGlzdHJpbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR2YWwgPSB3aW5vcGVuKCBhcmcxICk7Ci0JcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOworICAgIGxvbmcgcmV0dmFsOworICAgIHN0cmluZyBhcmcxIDsKKyAgICBpZiAoIWdldGlzdHJpbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR2YWwgPSB3aW5vcGVuKCBhcmcxICk7CisgICAgcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOwogfQogCiAvKiB2b2lkIHdpbnRpdGxlIGNoYXIgKnMgKi8KQEAgLTI4ODQsMTIgKzI4ODQsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF93aW50aXRsZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc3RyaW5nIGFyZzEgOwotCWlmICghZ2V0aXN0cmluZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCXdpbnRpdGxlKCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHN0cmluZyBhcmcxIDsKKyAgICBpZiAoIWdldGlzdHJpbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB3aW50aXRsZSggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBwb2xmIGxvbmcgcyBmbG9hdCBzWzMqYXJnMV0gKi8KQEAgLTI4OTcsMTkgKzI4OTcsMTkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9wb2xmKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWZsb2F0ICgqIGFyZzIpIFsgMyBdIDsKLQlpZiAoIWdldGlsb25nYXJyYXlzaXplKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JYXJnMSA9IGFyZzEgLyAzOwotCWlmICgoYXJnMiA9IChmbG9hdCgqKVszXSkgUHlNZW1fTkVXKGZsb2F0ICwgMyAqIGFyZzEgKSkgPT0gTlVMTCkKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JaWYgKCFnZXRpZmxvYXRhcnJheShhcmdzLCAxLCAwLCAzICogYXJnMSAsIChmbG9hdCAqKSBhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcG9sZiggYXJnMSAsIGFyZzIgKTsKLQlQeU1lbV9ERUwoYXJnMik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgZmxvYXQgKCogYXJnMikgWyAzIF0gOworICAgIGlmICghZ2V0aWxvbmdhcnJheXNpemUoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBhcmcxID0gYXJnMSAvIDM7CisgICAgaWYgKChhcmcyID0gKGZsb2F0KCopWzNdKSBQeU1lbV9ORVcoZmxvYXQgLCAzICogYXJnMSApKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICBpZiAoIWdldGlmbG9hdGFycmF5KGFyZ3MsIDEsIDAsIDMgKiBhcmcxICwgKGZsb2F0ICopIGFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBwb2xmKCBhcmcxICwgYXJnMiApOworICAgIFB5TWVtX0RFTChhcmcyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcG9sZjIgbG9uZyBzIGZsb2F0IHNbMiphcmcxXSAqLwpAQCAtMjkxNywxOSArMjkxNywxOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3BvbGYyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWZsb2F0ICgqIGFyZzIpIFsgMiBdIDsKLQlpZiAoIWdldGlsb25nYXJyYXlzaXplKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JYXJnMSA9IGFyZzEgLyAyOwotCWlmICgoYXJnMiA9IChmbG9hdCgqKVsyXSkgUHlNZW1fTkVXKGZsb2F0ICwgMiAqIGFyZzEgKSkgPT0gTlVMTCkKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JaWYgKCFnZXRpZmxvYXRhcnJheShhcmdzLCAxLCAwLCAyICogYXJnMSAsIChmbG9hdCAqKSBhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcG9sZjIoIGFyZzEgLCBhcmcyICk7Ci0JUHlNZW1fREVMKGFyZzIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGZsb2F0ICgqIGFyZzIpIFsgMiBdIDsKKyAgICBpZiAoIWdldGlsb25nYXJyYXlzaXplKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYXJnMSA9IGFyZzEgLyAyOworICAgIGlmICgoYXJnMiA9IChmbG9hdCgqKVsyXSkgUHlNZW1fTkVXKGZsb2F0ICwgMiAqIGFyZzEgKSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgaWYgKCFnZXRpZmxvYXRhcnJheShhcmdzLCAxLCAwLCAyICogYXJnMSAsIChmbG9hdCAqKSBhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcG9sZjIoIGFyZzEgLCBhcmcyICk7CisgICAgUHlNZW1fREVMKGFyZzIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBwb2x5IGxvbmcgcyBmbG9hdCBzWzMqYXJnMV0gKi8KQEAgLTI5MzcsMTkgKzI5MzcsMTkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9wb2x5KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWZsb2F0ICgqIGFyZzIpIFsgMyBdIDsKLQlpZiAoIWdldGlsb25nYXJyYXlzaXplKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JYXJnMSA9IGFyZzEgLyAzOwotCWlmICgoYXJnMiA9IChmbG9hdCgqKVszXSkgUHlNZW1fTkVXKGZsb2F0ICwgMyAqIGFyZzEgKSkgPT0gTlVMTCkKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JaWYgKCFnZXRpZmxvYXRhcnJheShhcmdzLCAxLCAwLCAzICogYXJnMSAsIChmbG9hdCAqKSBhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcG9seSggYXJnMSAsIGFyZzIgKTsKLQlQeU1lbV9ERUwoYXJnMik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgZmxvYXQgKCogYXJnMikgWyAzIF0gOworICAgIGlmICghZ2V0aWxvbmdhcnJheXNpemUoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBhcmcxID0gYXJnMSAvIDM7CisgICAgaWYgKChhcmcyID0gKGZsb2F0KCopWzNdKSBQeU1lbV9ORVcoZmxvYXQgLCAzICogYXJnMSApKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICBpZiAoIWdldGlmbG9hdGFycmF5KGFyZ3MsIDEsIDAsIDMgKiBhcmcxICwgKGZsb2F0ICopIGFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBwb2x5KCBhcmcxICwgYXJnMiApOworICAgIFB5TWVtX0RFTChhcmcyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcG9seTIgbG9uZyBzIGZsb2F0IHNbMiphcmcxXSAqLwpAQCAtMjk1NywxOSArMjk1NywxOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3BvbHkyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWZsb2F0ICgqIGFyZzIpIFsgMiBdIDsKLQlpZiAoIWdldGlsb25nYXJyYXlzaXplKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JYXJnMSA9IGFyZzEgLyAyOwotCWlmICgoYXJnMiA9IChmbG9hdCgqKVsyXSkgUHlNZW1fTkVXKGZsb2F0ICwgMiAqIGFyZzEgKSkgPT0gTlVMTCkKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JaWYgKCFnZXRpZmxvYXRhcnJheShhcmdzLCAxLCAwLCAyICogYXJnMSAsIChmbG9hdCAqKSBhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcG9seTIoIGFyZzEgLCBhcmcyICk7Ci0JUHlNZW1fREVMKGFyZzIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGZsb2F0ICgqIGFyZzIpIFsgMiBdIDsKKyAgICBpZiAoIWdldGlsb25nYXJyYXlzaXplKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYXJnMSA9IGFyZzEgLyAyOworICAgIGlmICgoYXJnMiA9IChmbG9hdCgqKVsyXSkgUHlNZW1fTkVXKGZsb2F0ICwgMiAqIGFyZzEgKSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgaWYgKCFnZXRpZmxvYXRhcnJheShhcmdzLCAxLCAwLCAyICogYXJnMSAsIChmbG9hdCAqKSBhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcG9seTIoIGFyZzEgLCBhcmcyICk7CisgICAgUHlNZW1fREVMKGFyZzIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBjcnZuIGxvbmcgcyBmbG9hdCBzWzMqYXJnMV0gKi8KQEAgLTI5NzcsMTkgKzI5NzcsMTkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9jcnZuKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWZsb2F0ICgqIGFyZzIpIFsgMyBdIDsKLQlpZiAoIWdldGlsb25nYXJyYXlzaXplKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JYXJnMSA9IGFyZzEgLyAzOwotCWlmICgoYXJnMiA9IChmbG9hdCgqKVszXSkgUHlNZW1fTkVXKGZsb2F0ICwgMyAqIGFyZzEgKSkgPT0gTlVMTCkKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JaWYgKCFnZXRpZmxvYXRhcnJheShhcmdzLCAxLCAwLCAzICogYXJnMSAsIChmbG9hdCAqKSBhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JY3J2biggYXJnMSAsIGFyZzIgKTsKLQlQeU1lbV9ERUwoYXJnMik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgZmxvYXQgKCogYXJnMikgWyAzIF0gOworICAgIGlmICghZ2V0aWxvbmdhcnJheXNpemUoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBhcmcxID0gYXJnMSAvIDM7CisgICAgaWYgKChhcmcyID0gKGZsb2F0KCopWzNdKSBQeU1lbV9ORVcoZmxvYXQgLCAzICogYXJnMSApKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICBpZiAoIWdldGlmbG9hdGFycmF5KGFyZ3MsIDEsIDAsIDMgKiBhcmcxICwgKGZsb2F0ICopIGFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBjcnZuKCBhcmcxICwgYXJnMiApOworICAgIFB5TWVtX0RFTChhcmcyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcmNydm4gbG9uZyBzIGZsb2F0IHNbNCphcmcxXSAqLwpAQCAtMjk5NywxOSArMjk5NywxOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3JjcnZuKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWZsb2F0ICgqIGFyZzIpIFsgNCBdIDsKLQlpZiAoIWdldGlsb25nYXJyYXlzaXplKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JYXJnMSA9IGFyZzEgLyA0OwotCWlmICgoYXJnMiA9IChmbG9hdCgqKVs0XSkgUHlNZW1fTkVXKGZsb2F0ICwgNCAqIGFyZzEgKSkgPT0gTlVMTCkKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JaWYgKCFnZXRpZmxvYXRhcnJheShhcmdzLCAxLCAwLCA0ICogYXJnMSAsIChmbG9hdCAqKSBhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmNydm4oIGFyZzEgLCBhcmcyICk7Ci0JUHlNZW1fREVMKGFyZzIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGZsb2F0ICgqIGFyZzIpIFsgNCBdIDsKKyAgICBpZiAoIWdldGlsb25nYXJyYXlzaXplKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYXJnMSA9IGFyZzEgLyA0OworICAgIGlmICgoYXJnMiA9IChmbG9hdCgqKVs0XSkgUHlNZW1fTkVXKGZsb2F0ICwgNCAqIGFyZzEgKSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgaWYgKCFnZXRpZmxvYXRhcnJheShhcmdzLCAxLCAwLCA0ICogYXJnMSAsIChmbG9hdCAqKSBhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmNydm4oIGFyZzEgLCBhcmcyICk7CisgICAgUHlNZW1fREVMKGFyZzIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBwb2xmMmkgbG9uZyBzIGxvbmcgc1syKmFyZzFdICovCkBAIC0zMDE3LDE5ICszMDE3LDE5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcG9sZjJpKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWxvbmcgKCogYXJnMikgWyAyIF0gOwotCWlmICghZ2V0aWxvbmdhcnJheXNpemUoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlhcmcxID0gYXJnMSAvIDI7Ci0JaWYgKChhcmcyID0gKGxvbmcoKilbMl0pIFB5TWVtX05FVyhsb25nICwgMiAqIGFyZzEgKSkgPT0gTlVMTCkKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JaWYgKCFnZXRpbG9uZ2FycmF5KGFyZ3MsIDEsIDAsIDIgKiBhcmcxICwgKGxvbmcgKikgYXJnMikpCi0JCXJldHVybiBOVUxMOwotCXBvbGYyaSggYXJnMSAsIGFyZzIgKTsKLQlQeU1lbV9ERUwoYXJnMik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgbG9uZyAoKiBhcmcyKSBbIDIgXSA7CisgICAgaWYgKCFnZXRpbG9uZ2FycmF5c2l6ZShhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGFyZzEgPSBhcmcxIC8gMjsKKyAgICBpZiAoKGFyZzIgPSAobG9uZygqKVsyXSkgUHlNZW1fTkVXKGxvbmcgLCAyICogYXJnMSApKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICBpZiAoIWdldGlsb25nYXJyYXkoYXJncywgMSwgMCwgMiAqIGFyZzEgLCAobG9uZyAqKSBhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcG9sZjJpKCBhcmcxICwgYXJnMiApOworICAgIFB5TWVtX0RFTChhcmcyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcG9sZmkgbG9uZyBzIGxvbmcgc1szKmFyZzFdICovCkBAIC0zMDM3LDE5ICszMDM3LDE5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcG9sZmkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JbG9uZyAoKiBhcmcyKSBbIDMgXSA7Ci0JaWYgKCFnZXRpbG9uZ2FycmF5c2l6ZShhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWFyZzEgPSBhcmcxIC8gMzsKLQlpZiAoKGFyZzIgPSAobG9uZygqKVszXSkgUHlNZW1fTkVXKGxvbmcgLCAzICogYXJnMSApKSA9PSBOVUxMKQotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQlpZiAoIWdldGlsb25nYXJyYXkoYXJncywgMSwgMCwgMyAqIGFyZzEgLCAobG9uZyAqKSBhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcG9sZmkoIGFyZzEgLCBhcmcyICk7Ci0JUHlNZW1fREVMKGFyZzIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGxvbmcgKCogYXJnMikgWyAzIF0gOworICAgIGlmICghZ2V0aWxvbmdhcnJheXNpemUoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBhcmcxID0gYXJnMSAvIDM7CisgICAgaWYgKChhcmcyID0gKGxvbmcoKilbM10pIFB5TWVtX05FVyhsb25nICwgMyAqIGFyZzEgKSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgaWYgKCFnZXRpbG9uZ2FycmF5KGFyZ3MsIDEsIDAsIDMgKiBhcmcxICwgKGxvbmcgKikgYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHBvbGZpKCBhcmcxICwgYXJnMiApOworICAgIFB5TWVtX0RFTChhcmcyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcG9seTJpIGxvbmcgcyBsb25nIHNbMiphcmcxXSAqLwpAQCAtMzA1NywxOSArMzA1NywxOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3BvbHkyaShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlsb25nICgqIGFyZzIpIFsgMiBdIDsKLQlpZiAoIWdldGlsb25nYXJyYXlzaXplKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JYXJnMSA9IGFyZzEgLyAyOwotCWlmICgoYXJnMiA9IChsb25nKCopWzJdKSBQeU1lbV9ORVcobG9uZyAsIDIgKiBhcmcxICkpID09IE5VTEwpCi0JCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCWlmICghZ2V0aWxvbmdhcnJheShhcmdzLCAxLCAwLCAyICogYXJnMSAsIChsb25nICopIGFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlwb2x5MmkoIGFyZzEgLCBhcmcyICk7Ci0JUHlNZW1fREVMKGFyZzIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGxvbmcgKCogYXJnMikgWyAyIF0gOworICAgIGlmICghZ2V0aWxvbmdhcnJheXNpemUoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBhcmcxID0gYXJnMSAvIDI7CisgICAgaWYgKChhcmcyID0gKGxvbmcoKilbMl0pIFB5TWVtX05FVyhsb25nICwgMiAqIGFyZzEgKSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgaWYgKCFnZXRpbG9uZ2FycmF5KGFyZ3MsIDEsIDAsIDIgKiBhcmcxICwgKGxvbmcgKikgYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHBvbHkyaSggYXJnMSAsIGFyZzIgKTsKKyAgICBQeU1lbV9ERUwoYXJnMik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHBvbHlpIGxvbmcgcyBsb25nIHNbMyphcmcxXSAqLwpAQCAtMzA3NywxOSArMzA3NywxOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3BvbHlpKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWxvbmcgKCogYXJnMikgWyAzIF0gOwotCWlmICghZ2V0aWxvbmdhcnJheXNpemUoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlhcmcxID0gYXJnMSAvIDM7Ci0JaWYgKChhcmcyID0gKGxvbmcoKilbM10pIFB5TWVtX05FVyhsb25nICwgMyAqIGFyZzEgKSkgPT0gTlVMTCkKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JaWYgKCFnZXRpbG9uZ2FycmF5KGFyZ3MsIDEsIDAsIDMgKiBhcmcxICwgKGxvbmcgKikgYXJnMikpCi0JCXJldHVybiBOVUxMOwotCXBvbHlpKCBhcmcxICwgYXJnMiApOwotCVB5TWVtX0RFTChhcmcyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBsb25nICgqIGFyZzIpIFsgMyBdIDsKKyAgICBpZiAoIWdldGlsb25nYXJyYXlzaXplKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYXJnMSA9IGFyZzEgLyAzOworICAgIGlmICgoYXJnMiA9IChsb25nKCopWzNdKSBQeU1lbV9ORVcobG9uZyAsIDMgKiBhcmcxICkpID09IE5VTEwpCisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIGlmICghZ2V0aWxvbmdhcnJheShhcmdzLCAxLCAwLCAzICogYXJnMSAsIChsb25nICopIGFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBwb2x5aSggYXJnMSAsIGFyZzIgKTsKKyAgICBQeU1lbV9ERUwoYXJnMik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHBvbGYycyBsb25nIHMgc2hvcnQgc1syKmFyZzFdICovCkBAIC0zMDk3LDE5ICszMDk3LDE5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcG9sZjJzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCXNob3J0ICgqIGFyZzIpIFsgMiBdIDsKLQlpZiAoIWdldGlsb25nYXJyYXlzaXplKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JYXJnMSA9IGFyZzEgLyAyOwotCWlmICgoYXJnMiA9IChzaG9ydCgqKVsyXSkgUHlNZW1fTkVXKHNob3J0ICwgMiAqIGFyZzEgKSkgPT0gTlVMTCkKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JaWYgKCFnZXRpc2hvcnRhcnJheShhcmdzLCAxLCAwLCAyICogYXJnMSAsIChzaG9ydCAqKSBhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcG9sZjJzKCBhcmcxICwgYXJnMiApOwotCVB5TWVtX0RFTChhcmcyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBzaG9ydCAoKiBhcmcyKSBbIDIgXSA7CisgICAgaWYgKCFnZXRpbG9uZ2FycmF5c2l6ZShhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGFyZzEgPSBhcmcxIC8gMjsKKyAgICBpZiAoKGFyZzIgPSAoc2hvcnQoKilbMl0pIFB5TWVtX05FVyhzaG9ydCAsIDIgKiBhcmcxICkpID09IE5VTEwpCisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIGlmICghZ2V0aXNob3J0YXJyYXkoYXJncywgMSwgMCwgMiAqIGFyZzEgLCAoc2hvcnQgKikgYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHBvbGYycyggYXJnMSAsIGFyZzIgKTsKKyAgICBQeU1lbV9ERUwoYXJnMik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHBvbGZzIGxvbmcgcyBzaG9ydCBzWzMqYXJnMV0gKi8KQEAgLTMxMTcsMTkgKzMxMTcsMTkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9wb2xmcyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlzaG9ydCAoKiBhcmcyKSBbIDMgXSA7Ci0JaWYgKCFnZXRpbG9uZ2FycmF5c2l6ZShhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWFyZzEgPSBhcmcxIC8gMzsKLQlpZiAoKGFyZzIgPSAoc2hvcnQoKilbM10pIFB5TWVtX05FVyhzaG9ydCAsIDMgKiBhcmcxICkpID09IE5VTEwpCi0JCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCWlmICghZ2V0aXNob3J0YXJyYXkoYXJncywgMSwgMCwgMyAqIGFyZzEgLCAoc2hvcnQgKikgYXJnMikpCi0JCXJldHVybiBOVUxMOwotCXBvbGZzKCBhcmcxICwgYXJnMiApOwotCVB5TWVtX0RFTChhcmcyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBzaG9ydCAoKiBhcmcyKSBbIDMgXSA7CisgICAgaWYgKCFnZXRpbG9uZ2FycmF5c2l6ZShhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGFyZzEgPSBhcmcxIC8gMzsKKyAgICBpZiAoKGFyZzIgPSAoc2hvcnQoKilbM10pIFB5TWVtX05FVyhzaG9ydCAsIDMgKiBhcmcxICkpID09IE5VTEwpCisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIGlmICghZ2V0aXNob3J0YXJyYXkoYXJncywgMSwgMCwgMyAqIGFyZzEgLCAoc2hvcnQgKikgYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHBvbGZzKCBhcmcxICwgYXJnMiApOworICAgIFB5TWVtX0RFTChhcmcyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcG9seXMgbG9uZyBzIHNob3J0IHNbMyphcmcxXSAqLwpAQCAtMzEzNywxOSArMzEzNywxOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3BvbHlzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCXNob3J0ICgqIGFyZzIpIFsgMyBdIDsKLQlpZiAoIWdldGlsb25nYXJyYXlzaXplKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JYXJnMSA9IGFyZzEgLyAzOwotCWlmICgoYXJnMiA9IChzaG9ydCgqKVszXSkgUHlNZW1fTkVXKHNob3J0ICwgMyAqIGFyZzEgKSkgPT0gTlVMTCkKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JaWYgKCFnZXRpc2hvcnRhcnJheShhcmdzLCAxLCAwLCAzICogYXJnMSAsIChzaG9ydCAqKSBhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcG9seXMoIGFyZzEgLCBhcmcyICk7Ci0JUHlNZW1fREVMKGFyZzIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIHNob3J0ICgqIGFyZzIpIFsgMyBdIDsKKyAgICBpZiAoIWdldGlsb25nYXJyYXlzaXplKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYXJnMSA9IGFyZzEgLyAzOworICAgIGlmICgoYXJnMiA9IChzaG9ydCgqKVszXSkgUHlNZW1fTkVXKHNob3J0ICwgMyAqIGFyZzEgKSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgaWYgKCFnZXRpc2hvcnRhcnJheShhcmdzLCAxLCAwLCAzICogYXJnMSAsIChzaG9ydCAqKSBhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcG9seXMoIGFyZzEgLCBhcmcyICk7CisgICAgUHlNZW1fREVMKGFyZzIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBwb2x5MnMgbG9uZyBzIHNob3J0IHNbMiphcmcxXSAqLwpAQCAtMzE1NywxOSArMzE1NywxOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3BvbHkycyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlzaG9ydCAoKiBhcmcyKSBbIDIgXSA7Ci0JaWYgKCFnZXRpbG9uZ2FycmF5c2l6ZShhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWFyZzEgPSBhcmcxIC8gMjsKLQlpZiAoKGFyZzIgPSAoc2hvcnQoKilbMl0pIFB5TWVtX05FVyhzaG9ydCAsIDIgKiBhcmcxICkpID09IE5VTEwpCi0JCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCWlmICghZ2V0aXNob3J0YXJyYXkoYXJncywgMSwgMCwgMiAqIGFyZzEgLCAoc2hvcnQgKikgYXJnMikpCi0JCXJldHVybiBOVUxMOwotCXBvbHkycyggYXJnMSAsIGFyZzIgKTsKLQlQeU1lbV9ERUwoYXJnMik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgc2hvcnQgKCogYXJnMikgWyAyIF0gOworICAgIGlmICghZ2V0aWxvbmdhcnJheXNpemUoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBhcmcxID0gYXJnMSAvIDI7CisgICAgaWYgKChhcmcyID0gKHNob3J0KCopWzJdKSBQeU1lbV9ORVcoc2hvcnQgLCAyICogYXJnMSApKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICBpZiAoIWdldGlzaG9ydGFycmF5KGFyZ3MsIDEsIDAsIDIgKiBhcmcxICwgKHNob3J0ICopIGFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBwb2x5MnMoIGFyZzEgLCBhcmcyICk7CisgICAgUHlNZW1fREVMKGFyZzIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBkZWZjdXJzb3Igc2hvcnQgcyB1X3Nob3J0IHNbMTI4XSAqLwpAQCAtMzE3NywxNSArMzE3NywxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2RlZmN1cnNvcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0JdW5zaWduZWQgc2hvcnQgYXJnMiBbIDEyOCBdIDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJyYXkoYXJncywgMiwgMSwgMTI4ICwgKHNob3J0ICopIGFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlkZWZjdXJzb3IoIGFyZzEgLCBhcmcyICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgOworICAgIHVuc2lnbmVkIHNob3J0IGFyZzIgWyAxMjggXSA7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMiwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFycmF5KGFyZ3MsIDIsIDEsIDEyOCAsIChzaG9ydCAqKSBhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZGVmY3Vyc29yKCBhcmcxICwgYXJnMiApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCB3cml0ZXBpeGVscyBzaG9ydCBzIHVfc2hvcnQgc1thcmcxXSAqLwpAQCAtMzE5MywxOCArMzE5MywxOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3dyaXRlcGl4ZWxzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQl1bnNpZ25lZCBzaG9ydCAqIGFyZzIgOwotCWlmICghZ2V0aXNob3J0YXJyYXlzaXplKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKChhcmcyID0gUHlNZW1fTkVXKHVuc2lnbmVkIHNob3J0ICwgYXJnMSApKSA9PSBOVUxMKQotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQlpZiAoIWdldGlzaG9ydGFycmF5KGFyZ3MsIDEsIDAsIGFyZzEgLCAoc2hvcnQgKikgYXJnMikpCi0JCXJldHVybiBOVUxMOwotCXdyaXRlcGl4ZWxzKCBhcmcxICwgYXJnMiApOwotCVB5TWVtX0RFTChhcmcyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSA7CisgICAgdW5zaWduZWQgc2hvcnQgKiBhcmcyIDsKKyAgICBpZiAoIWdldGlzaG9ydGFycmF5c2l6ZShhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICgoYXJnMiA9IFB5TWVtX05FVyh1bnNpZ25lZCBzaG9ydCAsIGFyZzEgKSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgaWYgKCFnZXRpc2hvcnRhcnJheShhcmdzLCAxLCAwLCBhcmcxICwgKHNob3J0ICopIGFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB3cml0ZXBpeGVscyggYXJnMSAsIGFyZzIgKTsKKyAgICBQeU1lbV9ERUwoYXJnMik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGRlZmJhc2lzIGxvbmcgcyBmbG9hdCBzWzQqNF0gKi8KQEAgLTMyMTIsMTUgKzMyMTIsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9kZWZiYXNpcyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlmbG9hdCBhcmcyIFsgNCBdIFsgNCBdIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcnJheShhcmdzLCAyLCAxLCA0ICogNCAsIChmbG9hdCAqKSBhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZGVmYmFzaXMoIGFyZzEgLCBhcmcyICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgZmxvYXQgYXJnMiBbIDQgXSBbIDQgXSA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJyYXkoYXJncywgMiwgMSwgNCAqIDQgLCAoZmxvYXQgKikgYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGRlZmJhc2lzKCBhcmcxICwgYXJnMiApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBnZXdyaXRlIHNob3J0IHMgc2hvcnQgc1thcmcxXSAqLwpAQCAtMzIyOCwxOCArMzIyOCwxOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2dld3JpdGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCXNob3J0ICogYXJnMiA7Ci0JaWYgKCFnZXRpc2hvcnRhcnJheXNpemUoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoKGFyZzIgPSBQeU1lbV9ORVcoc2hvcnQgLCBhcmcxICkpID09IE5VTEwpCi0JCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCWlmICghZ2V0aXNob3J0YXJyYXkoYXJncywgMSwgMCwgYXJnMSAsIGFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlnZXdyaXRlKCBhcmcxICwgYXJnMiApOwotCVB5TWVtX0RFTChhcmcyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSA7CisgICAgc2hvcnQgKiBhcmcyIDsKKyAgICBpZiAoIWdldGlzaG9ydGFycmF5c2l6ZShhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICgoYXJnMiA9IFB5TWVtX05FVyhzaG9ydCAsIGFyZzEgKSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgaWYgKCFnZXRpc2hvcnRhcnJheShhcmdzLCAxLCAwLCBhcmcxICwgYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGdld3JpdGUoIGFyZzEgLCBhcmcyICk7CisgICAgUHlNZW1fREVMKGFyZzIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCByb3RhdGUgc2hvcnQgcyBjaGFyIHMgKi8KQEAgLTMyNDcsMTUgKzMyNDcsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9yb3RhdGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCWNoYXIgYXJnMiA7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMiwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGljaGFyYXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0Jcm90YXRlKCBhcmcxICwgYXJnMiApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxIDsKKyAgICBjaGFyIGFyZzIgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpY2hhcmFyZyhhcmdzLCAyLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJvdGF0ZSggYXJnMSAsIGFyZzIgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcm90IGZsb2F0IHMgY2hhciBzICovCkBAIC0zMjYzLDE1ICszMjYzLDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcm90KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlmbG9hdCBhcmcxIDsKLQljaGFyIGFyZzIgOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpY2hhcmFyZyhhcmdzLCAyLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCXJvdCggYXJnMSAsIGFyZzIgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZmxvYXQgYXJnMSA7CisgICAgY2hhciBhcmcyIDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWNoYXJhcmcoYXJncywgMiwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByb3QoIGFyZzEgLCBhcmcyICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGNpcmNmaSBsb25nIHMgbG9uZyBzIGxvbmcgcyAqLwpAQCAtMzI3OSwxOCArMzI3OSwxOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2NpcmNmaShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlsb25nIGFyZzIgOwotCWxvbmcgYXJnMyA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JY2lyY2ZpKCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBsb25nIGFyZzIgOworICAgIGxvbmcgYXJnMyA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgY2lyY2ZpKCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgY2lyY2kgbG9uZyBzIGxvbmcgcyBsb25nIHMgKi8KQEAgLTMyOTgsMTggKzMyOTgsMTggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9jaXJjaShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlsb25nIGFyZzIgOwotCWxvbmcgYXJnMyA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JY2lyY2koIGFyZzEgLCBhcmcyICwgYXJnMyApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGxvbmcgYXJnMiA7CisgICAgbG9uZyBhcmczIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBjaXJjaSggYXJnMSAsIGFyZzIgLCBhcmczICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGNtb3ZpIGxvbmcgcyBsb25nIHMgbG9uZyBzICovCkBAIC0zMzE3LDE4ICszMzE3LDE4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfY21vdmkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JbG9uZyBhcmcyIDsKLQlsb25nIGFyZzMgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCWNtb3ZpKCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBsb25nIGFyZzIgOworICAgIGxvbmcgYXJnMyA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgY21vdmkoIGFyZzEgLCBhcmcyICwgYXJnMyApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBkcmF3aSBsb25nIHMgbG9uZyBzIGxvbmcgcyAqLwpAQCAtMzMzNiwxOCArMzMzNiwxOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2RyYXdpKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWxvbmcgYXJnMiA7Ci0JbG9uZyBhcmczIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQlkcmF3aSggYXJnMSAsIGFyZzIgLCBhcmczICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgbG9uZyBhcmcyIDsKKyAgICBsb25nIGFyZzMgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGRyYXdpKCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgbW92ZWkgbG9uZyBzIGxvbmcgcyBsb25nIHMgKi8KQEAgLTMzNTUsMTggKzMzNTUsMTggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9tb3ZlaShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlsb25nIGFyZzIgOwotCWxvbmcgYXJnMyA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JbW92ZWkoIGFyZzEgLCBhcmcyICwgYXJnMyApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGxvbmcgYXJnMiA7CisgICAgbG9uZyBhcmczIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBtb3ZlaSggYXJnMSAsIGFyZzIgLCBhcmczICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHBudGkgbG9uZyBzIGxvbmcgcyBsb25nIHMgKi8KQEAgLTMzNzQsMTggKzMzNzQsMTggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9wbnRpKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWxvbmcgYXJnMiA7Ci0JbG9uZyBhcmczIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQlwbnRpKCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBsb25nIGFyZzIgOworICAgIGxvbmcgYXJnMyA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcG50aSggYXJnMSAsIGFyZzIgLCBhcmczICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIG5ld3RhZyBsb25nIHMgbG9uZyBzIGxvbmcgcyAqLwpAQCAtMzM5MywxOCArMzM5MywxOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX25ld3RhZyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlsb25nIGFyZzIgOwotCWxvbmcgYXJnMyA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JbmV3dGFnKCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBsb25nIGFyZzIgOworICAgIGxvbmcgYXJnMyA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbmV3dGFnKCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcGRyaSBsb25nIHMgbG9uZyBzIGxvbmcgcyAqLwpAQCAtMzQxMiwxOCArMzQxMiwxOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3BkcmkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JbG9uZyBhcmcyIDsKLQlsb25nIGFyZzMgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCXBkcmkoIGFyZzEgLCBhcmcyICwgYXJnMyApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGxvbmcgYXJnMiA7CisgICAgbG9uZyBhcmczIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBwZHJpKCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcG12aSBsb25nIHMgbG9uZyBzIGxvbmcgcyAqLwpAQCAtMzQzMSwxOCArMzQzMSwxOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3BtdmkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JbG9uZyBhcmcyIDsKLQlsb25nIGFyZzMgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCXBtdmkoIGFyZzEgLCBhcmcyICwgYXJnMyApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGxvbmcgYXJnMiA7CisgICAgbG9uZyBhcmczIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBwbXZpKCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcmRyaSBsb25nIHMgbG9uZyBzIGxvbmcgcyAqLwpAQCAtMzQ1MCwxOCArMzQ1MCwxOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3JkcmkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JbG9uZyBhcmcyIDsKLQlsb25nIGFyZzMgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCXJkcmkoIGFyZzEgLCBhcmcyICwgYXJnMyApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGxvbmcgYXJnMiA7CisgICAgbG9uZyBhcmczIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZHJpKCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcm12aSBsb25nIHMgbG9uZyBzIGxvbmcgcyAqLwpAQCAtMzQ2OSwxOCArMzQ2OSwxOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3JtdmkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JbG9uZyBhcmcyIDsKLQlsb25nIGFyZzMgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCXJtdmkoIGFyZzEgLCBhcmcyICwgYXJnMyApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGxvbmcgYXJnMiA7CisgICAgbG9uZyBhcmczIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBybXZpKCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcnBkcmkgbG9uZyBzIGxvbmcgcyBsb25nIHMgKi8KQEAgLTM0ODgsMTggKzM0ODgsMTggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9ycGRyaShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlsb25nIGFyZzIgOwotCWxvbmcgYXJnMyA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcnBkcmkoIGFyZzEgLCBhcmcyICwgYXJnMyApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGxvbmcgYXJnMiA7CisgICAgbG9uZyBhcmczIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBycGRyaSggYXJnMSAsIGFyZzIgLCBhcmczICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHJwbXZpIGxvbmcgcyBsb25nIHMgbG9uZyBzICovCkBAIC0zNTA3LDE4ICszNTA3LDE4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcnBtdmkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JbG9uZyBhcmcyIDsKLQlsb25nIGFyZzMgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCXJwbXZpKCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBsb25nIGFyZzIgOworICAgIGxvbmcgYXJnMyA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcnBtdmkoIGFyZzEgLCBhcmcyICwgYXJnMyApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCB4ZnB0aSBsb25nIHMgbG9uZyBzIGxvbmcgcyAqLwpAQCAtMzUyNiwxOCArMzUyNiwxOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3hmcHRpKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWxvbmcgYXJnMiA7Ci0JbG9uZyBhcmczIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQl4ZnB0aSggYXJnMSAsIGFyZzIgLCBhcmczICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgbG9uZyBhcmcyIDsKKyAgICBsb25nIGFyZzMgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHhmcHRpKCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgY2lyYyBmbG9hdCBzIGZsb2F0IHMgZmxvYXQgcyAqLwpAQCAtMzU0NSwxOCArMzU0NSwxOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2NpcmMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWZsb2F0IGFyZzEgOwotCWZsb2F0IGFyZzIgOwotCWZsb2F0IGFyZzMgOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMywgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAzLCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCWNpcmMoIGFyZzEgLCBhcmcyICwgYXJnMyApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBmbG9hdCBhcmcxIDsKKyAgICBmbG9hdCBhcmcyIDsKKyAgICBmbG9hdCBhcmczIDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMywgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBjaXJjKCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgY2lyY2YgZmxvYXQgcyBmbG9hdCBzIGZsb2F0IHMgKi8KQEAgLTM1NjQsMTggKzM1NjQsMTggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9jaXJjZihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZmxvYXQgYXJnMSA7Ci0JZmxvYXQgYXJnMiA7Ci0JZmxvYXQgYXJnMyA7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMywgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAzLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JY2lyY2YoIGFyZzEgLCBhcmcyICwgYXJnMyApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBmbG9hdCBhcmcxIDsKKyAgICBmbG9hdCBhcmcyIDsKKyAgICBmbG9hdCBhcmczIDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMywgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBjaXJjZiggYXJnMSAsIGFyZzIgLCBhcmczICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGNtb3YgZmxvYXQgcyBmbG9hdCBzIGZsb2F0IHMgKi8KQEAgLTM1ODMsMTggKzM1ODMsMTggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9jbW92KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlmbG9hdCBhcmcxIDsKLQlmbG9hdCBhcmcyIDsKLQlmbG9hdCBhcmczIDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMywgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQljbW92KCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZmxvYXQgYXJnMSA7CisgICAgZmxvYXQgYXJnMiA7CisgICAgZmxvYXQgYXJnMyA7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMywgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAzLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgY21vdiggYXJnMSAsIGFyZzIgLCBhcmczICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGRyYXcgZmxvYXQgcyBmbG9hdCBzIGZsb2F0IHMgKi8KQEAgLTM2MDIsMTggKzM2MDIsMTggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9kcmF3KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlmbG9hdCBhcmcxIDsKLQlmbG9hdCBhcmcyIDsKLQlmbG9hdCBhcmczIDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMywgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQlkcmF3KCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZmxvYXQgYXJnMSA7CisgICAgZmxvYXQgYXJnMiA7CisgICAgZmxvYXQgYXJnMyA7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMywgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAzLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZHJhdyggYXJnMSAsIGFyZzIgLCBhcmczICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIG1vdmUgZmxvYXQgcyBmbG9hdCBzIGZsb2F0IHMgKi8KQEAgLTM2MjEsMTggKzM2MjEsMTggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9tb3ZlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlmbG9hdCBhcmcxIDsKLQlmbG9hdCBhcmcyIDsKLQlmbG9hdCBhcmczIDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMywgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQltb3ZlKCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZmxvYXQgYXJnMSA7CisgICAgZmxvYXQgYXJnMiA7CisgICAgZmxvYXQgYXJnMyA7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMywgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAzLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbW92ZSggYXJnMSAsIGFyZzIgLCBhcmczICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHBudCBmbG9hdCBzIGZsb2F0IHMgZmxvYXQgcyAqLwpAQCAtMzY0MCwxOCArMzY0MCwxOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3BudChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZmxvYXQgYXJnMSA7Ci0JZmxvYXQgYXJnMiA7Ci0JZmxvYXQgYXJnMyA7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMywgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAzLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcG50KCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZmxvYXQgYXJnMSA7CisgICAgZmxvYXQgYXJnMiA7CisgICAgZmxvYXQgYXJnMyA7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMywgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAzLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcG50KCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgc2NhbGUgZmxvYXQgcyBmbG9hdCBzIGZsb2F0IHMgKi8KQEAgLTM2NTksMTggKzM2NTksMTggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9zY2FsZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZmxvYXQgYXJnMSA7Ci0JZmxvYXQgYXJnMiA7Ci0JZmxvYXQgYXJnMyA7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMywgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAzLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0Jc2NhbGUoIGFyZzEgLCBhcmcyICwgYXJnMyApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBmbG9hdCBhcmcxIDsKKyAgICBmbG9hdCBhcmcyIDsKKyAgICBmbG9hdCBhcmczIDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMywgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBzY2FsZSggYXJnMSAsIGFyZzIgLCBhcmczICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHRyYW5zbGF0ZSBmbG9hdCBzIGZsb2F0IHMgZmxvYXQgcyAqLwpAQCAtMzY3OCwxOCArMzY3OCwxOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3RyYW5zbGF0ZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZmxvYXQgYXJnMSA7Ci0JZmxvYXQgYXJnMiA7Ci0JZmxvYXQgYXJnMyA7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMywgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAzLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JdHJhbnNsYXRlKCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZmxvYXQgYXJnMSA7CisgICAgZmxvYXQgYXJnMiA7CisgICAgZmxvYXQgYXJnMyA7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMywgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAzLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgdHJhbnNsYXRlKCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcGRyIGZsb2F0IHMgZmxvYXQgcyBmbG9hdCBzICovCkBAIC0zNjk3LDE4ICszNjk3LDE4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcGRyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlmbG9hdCBhcmcxIDsKLQlmbG9hdCBhcmcyIDsKLQlmbG9hdCBhcmczIDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMywgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQlwZHIoIGFyZzEgLCBhcmcyICwgYXJnMyApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBmbG9hdCBhcmcxIDsKKyAgICBmbG9hdCBhcmcyIDsKKyAgICBmbG9hdCBhcmczIDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMywgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBwZHIoIGFyZzEgLCBhcmcyICwgYXJnMyApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBwbXYgZmxvYXQgcyBmbG9hdCBzIGZsb2F0IHMgKi8KQEAgLTM3MTYsMTggKzM3MTYsMTggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9wbXYoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWZsb2F0IGFyZzEgOwotCWZsb2F0IGFyZzIgOwotCWZsb2F0IGFyZzMgOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMywgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAzLCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCXBtdiggYXJnMSAsIGFyZzIgLCBhcmczICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGZsb2F0IGFyZzEgOworICAgIGZsb2F0IGFyZzIgOworICAgIGZsb2F0IGFyZzMgOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMywgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAzLCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHBtdiggYXJnMSAsIGFyZzIgLCBhcmczICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHJkciBmbG9hdCBzIGZsb2F0IHMgZmxvYXQgcyAqLwpAQCAtMzczNSwxOCArMzczNSwxOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3JkcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZmxvYXQgYXJnMSA7Ci0JZmxvYXQgYXJnMiA7Ci0JZmxvYXQgYXJnMyA7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMywgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAzLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmRyKCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZmxvYXQgYXJnMSA7CisgICAgZmxvYXQgYXJnMiA7CisgICAgZmxvYXQgYXJnMyA7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMywgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAzLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmRyKCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcm12IGZsb2F0IHMgZmxvYXQgcyBmbG9hdCBzICovCkBAIC0zNzU0LDE4ICszNzU0LDE4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcm12KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlmbG9hdCBhcmcxIDsKLQlmbG9hdCBhcmcyIDsKLQlmbG9hdCBhcmczIDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMywgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQlybXYoIGFyZzEgLCBhcmcyICwgYXJnMyApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBmbG9hdCBhcmcxIDsKKyAgICBmbG9hdCBhcmcyIDsKKyAgICBmbG9hdCBhcmczIDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMywgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBybXYoIGFyZzEgLCBhcmcyICwgYXJnMyApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBycGRyIGZsb2F0IHMgZmxvYXQgcyBmbG9hdCBzICovCkBAIC0zNzczLDE4ICszNzczLDE4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcnBkcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZmxvYXQgYXJnMSA7Ci0JZmxvYXQgYXJnMiA7Ci0JZmxvYXQgYXJnMyA7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMywgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAzLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcnBkciggYXJnMSAsIGFyZzIgLCBhcmczICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGZsb2F0IGFyZzEgOworICAgIGZsb2F0IGFyZzIgOworICAgIGZsb2F0IGFyZzMgOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMywgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAzLCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJwZHIoIGFyZzEgLCBhcmcyICwgYXJnMyApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBycG12IGZsb2F0IHMgZmxvYXQgcyBmbG9hdCBzICovCkBAIC0zNzkyLDE4ICszNzkyLDE4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcnBtdihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZmxvYXQgYXJnMSA7Ci0JZmxvYXQgYXJnMiA7Ci0JZmxvYXQgYXJnMyA7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMywgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAzLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcnBtdiggYXJnMSAsIGFyZzIgLCBhcmczICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGZsb2F0IGFyZzEgOworICAgIGZsb2F0IGFyZzIgOworICAgIGZsb2F0IGFyZzMgOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMywgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAzLCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJwbXYoIGFyZzEgLCBhcmcyICwgYXJnMyApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCB4ZnB0IGZsb2F0IHMgZmxvYXQgcyBmbG9hdCBzICovCkBAIC0zODExLDE4ICszODExLDE4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfeGZwdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZmxvYXQgYXJnMSA7Ci0JZmxvYXQgYXJnMiA7Ci0JZmxvYXQgYXJnMyA7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMywgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAzLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JeGZwdCggYXJnMSAsIGFyZzIgLCBhcmczICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGZsb2F0IGFyZzEgOworICAgIGZsb2F0IGFyZzIgOworICAgIGZsb2F0IGFyZzMgOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMywgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAzLCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHhmcHQoIGFyZzEgLCBhcmcyICwgYXJnMyApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBSR0Jjb2xvciBzaG9ydCBzIHNob3J0IHMgc2hvcnQgcyAqLwpAQCAtMzgzMCwxOCArMzgzMCwxOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX1JHQmNvbG9yKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlzaG9ydCBhcmcyIDsKLQlzaG9ydCBhcmczIDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQlSR0Jjb2xvciggYXJnMSAsIGFyZzIgLCBhcmczICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgOworICAgIHNob3J0IGFyZzIgOworICAgIHNob3J0IGFyZzMgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFJHQmNvbG9yKCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgUkdCd3JpdGVtYXNrIHNob3J0IHMgc2hvcnQgcyBzaG9ydCBzICovCkBAIC0zODQ5LDE4ICszODQ5LDE4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfUkdCd3JpdGVtYXNrKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlzaG9ydCBhcmcyIDsKLQlzaG9ydCBhcmczIDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQlSR0J3cml0ZW1hc2soIGFyZzEgLCBhcmcyICwgYXJnMyApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxIDsKKyAgICBzaG9ydCBhcmcyIDsKKyAgICBzaG9ydCBhcmczIDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBSR0J3cml0ZW1hc2soIGFyZzEgLCBhcmcyICwgYXJnMyApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBzZXRjdXJzb3Igc2hvcnQgcyBzaG9ydCBzIHNob3J0IHMgKi8KQEAgLTM4NjgsMTggKzM4NjgsMTggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9zZXRjdXJzb3IoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCXNob3J0IGFyZzIgOwotCXNob3J0IGFyZzMgOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCXNldGN1cnNvciggYXJnMSAsIGFyZzIgLCBhcmczICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgOworICAgIHNob3J0IGFyZzIgOworICAgIHNob3J0IGFyZzMgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHNldGN1cnNvciggYXJnMSAsIGFyZzIgLCBhcmczICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHRpZSBzaG9ydCBzIHNob3J0IHMgc2hvcnQgcyAqLwpAQCAtMzg4NywxOCArMzg4NywxOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3RpZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0Jc2hvcnQgYXJnMiA7Ci0Jc2hvcnQgYXJnMyA7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JdGllKCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSA7CisgICAgc2hvcnQgYXJnMiA7CisgICAgc2hvcnQgYXJnMyA7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgdGllKCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgY2lyY2ZzIHNob3J0IHMgc2hvcnQgcyBzaG9ydCBzICovCkBAIC0zOTA2LDE4ICszOTA2LDE4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfY2lyY2ZzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlzaG9ydCBhcmcyIDsKLQlzaG9ydCBhcmczIDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQljaXJjZnMoIGFyZzEgLCBhcmcyICwgYXJnMyApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxIDsKKyAgICBzaG9ydCBhcmcyIDsKKyAgICBzaG9ydCBhcmczIDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBjaXJjZnMoIGFyZzEgLCBhcmcyICwgYXJnMyApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBjaXJjcyBzaG9ydCBzIHNob3J0IHMgc2hvcnQgcyAqLwpAQCAtMzkyNSwxOCArMzkyNSwxOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2NpcmNzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlzaG9ydCBhcmcyIDsKLQlzaG9ydCBhcmczIDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQljaXJjcyggYXJnMSAsIGFyZzIgLCBhcmczICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgOworICAgIHNob3J0IGFyZzIgOworICAgIHNob3J0IGFyZzMgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGNpcmNzKCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgY21vdnMgc2hvcnQgcyBzaG9ydCBzIHNob3J0IHMgKi8KQEAgLTM5NDQsMTggKzM5NDQsMTggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9jbW92cyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0Jc2hvcnQgYXJnMiA7Ci0Jc2hvcnQgYXJnMyA7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JY21vdnMoIGFyZzEgLCBhcmcyICwgYXJnMyApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxIDsKKyAgICBzaG9ydCBhcmcyIDsKKyAgICBzaG9ydCBhcmczIDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBjbW92cyggYXJnMSAsIGFyZzIgLCBhcmczICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGRyYXdzIHNob3J0IHMgc2hvcnQgcyBzaG9ydCBzICovCkBAIC0zOTYzLDE4ICszOTYzLDE4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZHJhd3MoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCXNob3J0IGFyZzIgOwotCXNob3J0IGFyZzMgOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCWRyYXdzKCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSA7CisgICAgc2hvcnQgYXJnMiA7CisgICAgc2hvcnQgYXJnMyA7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZHJhd3MoIGFyZzEgLCBhcmcyICwgYXJnMyApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBtb3ZlcyBzaG9ydCBzIHNob3J0IHMgc2hvcnQgcyAqLwpAQCAtMzk4MiwxOCArMzk4MiwxOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX21vdmVzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlzaG9ydCBhcmcyIDsKLQlzaG9ydCBhcmczIDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQltb3ZlcyggYXJnMSAsIGFyZzIgLCBhcmczICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgOworICAgIHNob3J0IGFyZzIgOworICAgIHNob3J0IGFyZzMgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG1vdmVzKCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcGRycyBzaG9ydCBzIHNob3J0IHMgc2hvcnQgcyAqLwpAQCAtNDAwMSwxOCArNDAwMSwxOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3BkcnMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCXNob3J0IGFyZzIgOwotCXNob3J0IGFyZzMgOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCXBkcnMoIGFyZzEgLCBhcmcyICwgYXJnMyApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxIDsKKyAgICBzaG9ydCBhcmcyIDsKKyAgICBzaG9ydCBhcmczIDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBwZHJzKCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcG12cyBzaG9ydCBzIHNob3J0IHMgc2hvcnQgcyAqLwpAQCAtNDAyMCwxOCArNDAyMCwxOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3BtdnMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCXNob3J0IGFyZzIgOwotCXNob3J0IGFyZzMgOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCXBtdnMoIGFyZzEgLCBhcmcyICwgYXJnMyApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxIDsKKyAgICBzaG9ydCBhcmcyIDsKKyAgICBzaG9ydCBhcmczIDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBwbXZzKCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcG50cyBzaG9ydCBzIHNob3J0IHMgc2hvcnQgcyAqLwpAQCAtNDAzOSwxOCArNDAzOSwxOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3BudHMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCXNob3J0IGFyZzIgOwotCXNob3J0IGFyZzMgOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCXBudHMoIGFyZzEgLCBhcmcyICwgYXJnMyApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxIDsKKyAgICBzaG9ydCBhcmcyIDsKKyAgICBzaG9ydCBhcmczIDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBwbnRzKCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcmRycyBzaG9ydCBzIHNob3J0IHMgc2hvcnQgcyAqLwpAQCAtNDA1OCwxOCArNDA1OCwxOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3JkcnMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCXNob3J0IGFyZzIgOwotCXNob3J0IGFyZzMgOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCXJkcnMoIGFyZzEgLCBhcmcyICwgYXJnMyApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxIDsKKyAgICBzaG9ydCBhcmcyIDsKKyAgICBzaG9ydCBhcmczIDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZHJzKCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcm12cyBzaG9ydCBzIHNob3J0IHMgc2hvcnQgcyAqLwpAQCAtNDA3NywxOCArNDA3NywxOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3JtdnMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCXNob3J0IGFyZzIgOwotCXNob3J0IGFyZzMgOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCXJtdnMoIGFyZzEgLCBhcmcyICwgYXJnMyApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxIDsKKyAgICBzaG9ydCBhcmcyIDsKKyAgICBzaG9ydCBhcmczIDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBybXZzKCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcnBkcnMgc2hvcnQgcyBzaG9ydCBzIHNob3J0IHMgKi8KQEAgLTQwOTYsMTggKzQwOTYsMTggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9ycGRycyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0Jc2hvcnQgYXJnMiA7Ci0Jc2hvcnQgYXJnMyA7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcnBkcnMoIGFyZzEgLCBhcmcyICwgYXJnMyApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxIDsKKyAgICBzaG9ydCBhcmcyIDsKKyAgICBzaG9ydCBhcmczIDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBycGRycyggYXJnMSAsIGFyZzIgLCBhcmczICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHJwbXZzIHNob3J0IHMgc2hvcnQgcyBzaG9ydCBzICovCkBAIC00MTE1LDE4ICs0MTE1LDE4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcnBtdnMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCXNob3J0IGFyZzIgOwotCXNob3J0IGFyZzMgOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCXJwbXZzKCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSA7CisgICAgc2hvcnQgYXJnMiA7CisgICAgc2hvcnQgYXJnMyA7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcnBtdnMoIGFyZzEgLCBhcmcyICwgYXJnMyApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCB4ZnB0cyBzaG9ydCBzIHNob3J0IHMgc2hvcnQgcyAqLwpAQCAtNDEzNCwxOCArNDEzNCwxOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3hmcHRzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlzaG9ydCBhcmcyIDsKLQlzaG9ydCBhcmczIDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQl4ZnB0cyggYXJnMSAsIGFyZzIgLCBhcmczICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgOworICAgIHNob3J0IGFyZzIgOworICAgIHNob3J0IGFyZzMgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHhmcHRzKCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgY3Vyb3JpZ2luIHNob3J0IHMgc2hvcnQgcyBzaG9ydCBzICovCkBAIC00MTUzLDE4ICs0MTUzLDE4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfY3Vyb3JpZ2luKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlzaG9ydCBhcmcyIDsKLQlzaG9ydCBhcmczIDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQljdXJvcmlnaW4oIGFyZzEgLCBhcmcyICwgYXJnMyApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxIDsKKyAgICBzaG9ydCBhcmcyIDsKKyAgICBzaG9ydCBhcmczIDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBjdXJvcmlnaW4oIGFyZzEgLCBhcmcyICwgYXJnMyApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBjeWNsZW1hcCBzaG9ydCBzIHNob3J0IHMgc2hvcnQgcyAqLwpAQCAtNDE3MiwxOCArNDE3MiwxOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2N5Y2xlbWFwKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlzaG9ydCBhcmcyIDsKLQlzaG9ydCBhcmczIDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQljeWNsZW1hcCggYXJnMSAsIGFyZzIgLCBhcmczICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgOworICAgIHNob3J0IGFyZzIgOworICAgIHNob3J0IGFyZzMgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGN5Y2xlbWFwKCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcGF0Y2ggZmxvYXQgc1s0KjRdIGZsb2F0IHNbNCo0XSBmbG9hdCBzWzQqNF0gKi8KQEAgLTQxOTEsMTggKzQxOTEsMTggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9wYXRjaChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZmxvYXQgYXJnMSBbIDQgXSBbIDQgXSA7Ci0JZmxvYXQgYXJnMiBbIDQgXSBbIDQgXSA7Ci0JZmxvYXQgYXJnMyBbIDQgXSBbIDQgXSA7Ci0JaWYgKCFnZXRpZmxvYXRhcnJheShhcmdzLCAzLCAwLCA0ICogNCAsIChmbG9hdCAqKSBhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcnJheShhcmdzLCAzLCAxLCA0ICogNCAsIChmbG9hdCAqKSBhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcnJheShhcmdzLCAzLCAyLCA0ICogNCAsIChmbG9hdCAqKSBhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcGF0Y2goIGFyZzEgLCBhcmcyICwgYXJnMyApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBmbG9hdCBhcmcxIFsgNCBdIFsgNCBdIDsKKyAgICBmbG9hdCBhcmcyIFsgNCBdIFsgNCBdIDsKKyAgICBmbG9hdCBhcmczIFsgNCBdIFsgNCBdIDsKKyAgICBpZiAoIWdldGlmbG9hdGFycmF5KGFyZ3MsIDMsIDAsIDQgKiA0ICwgKGZsb2F0ICopIGFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlmbG9hdGFycmF5KGFyZ3MsIDMsIDEsIDQgKiA0ICwgKGZsb2F0ICopIGFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlmbG9hdGFycmF5KGFyZ3MsIDMsIDIsIDQgKiA0ICwgKGZsb2F0ICopIGFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBwYXRjaCggYXJnMSAsIGFyZzIgLCBhcmczICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHNwbGYgbG9uZyBzIGZsb2F0IHNbMyphcmcxXSB1X3Nob3J0IHNbYXJnMV0gKi8KQEAgLTQyMTAsMjUgKzQyMTAsMjUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9zcGxmKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWZsb2F0ICgqIGFyZzIpIFsgMyBdIDsKLQl1bnNpZ25lZCBzaG9ydCAqIGFyZzMgOwotCWlmICghZ2V0aWxvbmdhcnJheXNpemUoYXJncywgMiwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlhcmcxID0gYXJnMSAvIDM7Ci0JaWYgKChhcmcyID0gKGZsb2F0KCopWzNdKSBQeU1lbV9ORVcoZmxvYXQgLCAzICogYXJnMSApKSA9PSBOVUxMKQotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQlpZiAoIWdldGlmbG9hdGFycmF5KGFyZ3MsIDIsIDAsIDMgKiBhcmcxICwgKGZsb2F0ICopIGFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoKGFyZzMgPSBQeU1lbV9ORVcodW5zaWduZWQgc2hvcnQgLCBhcmcxICkpID09IE5VTEwpCi0JCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCWlmICghZ2V0aXNob3J0YXJyYXkoYXJncywgMiwgMSwgYXJnMSAsIChzaG9ydCAqKSBhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0Jc3BsZiggYXJnMSAsIGFyZzIgLCBhcmczICk7Ci0JUHlNZW1fREVMKGFyZzIpOwotCVB5TWVtX0RFTChhcmczKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBmbG9hdCAoKiBhcmcyKSBbIDMgXSA7CisgICAgdW5zaWduZWQgc2hvcnQgKiBhcmczIDsKKyAgICBpZiAoIWdldGlsb25nYXJyYXlzaXplKGFyZ3MsIDIsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYXJnMSA9IGFyZzEgLyAzOworICAgIGlmICgoYXJnMiA9IChmbG9hdCgqKVszXSkgUHlNZW1fTkVXKGZsb2F0ICwgMyAqIGFyZzEgKSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgaWYgKCFnZXRpZmxvYXRhcnJheShhcmdzLCAyLCAwLCAzICogYXJnMSAsIChmbG9hdCAqKSBhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKChhcmczID0gUHlNZW1fTkVXKHVuc2lnbmVkIHNob3J0ICwgYXJnMSApKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICBpZiAoIWdldGlzaG9ydGFycmF5KGFyZ3MsIDIsIDEsIGFyZzEgLCAoc2hvcnQgKikgYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHNwbGYoIGFyZzEgLCBhcmcyICwgYXJnMyApOworICAgIFB5TWVtX0RFTChhcmcyKTsKKyAgICBQeU1lbV9ERUwoYXJnMyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHNwbGYyIGxvbmcgcyBmbG9hdCBzWzIqYXJnMV0gdV9zaG9ydCBzW2FyZzFdICovCkBAIC00MjM2LDI1ICs0MjM2LDI1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfc3BsZjIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JZmxvYXQgKCogYXJnMikgWyAyIF0gOwotCXVuc2lnbmVkIHNob3J0ICogYXJnMyA7Ci0JaWYgKCFnZXRpbG9uZ2FycmF5c2l6ZShhcmdzLCAyLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWFyZzEgPSBhcmcxIC8gMjsKLQlpZiAoKGFyZzIgPSAoZmxvYXQoKilbMl0pIFB5TWVtX05FVyhmbG9hdCAsIDIgKiBhcmcxICkpID09IE5VTEwpCi0JCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCWlmICghZ2V0aWZsb2F0YXJyYXkoYXJncywgMiwgMCwgMiAqIGFyZzEgLCAoZmxvYXQgKikgYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICgoYXJnMyA9IFB5TWVtX05FVyh1bnNpZ25lZCBzaG9ydCAsIGFyZzEgKSkgPT0gTlVMTCkKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JaWYgKCFnZXRpc2hvcnRhcnJheShhcmdzLCAyLCAxLCBhcmcxICwgKHNob3J0ICopIGFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQlzcGxmMiggYXJnMSAsIGFyZzIgLCBhcmczICk7Ci0JUHlNZW1fREVMKGFyZzIpOwotCVB5TWVtX0RFTChhcmczKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBmbG9hdCAoKiBhcmcyKSBbIDIgXSA7CisgICAgdW5zaWduZWQgc2hvcnQgKiBhcmczIDsKKyAgICBpZiAoIWdldGlsb25nYXJyYXlzaXplKGFyZ3MsIDIsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYXJnMSA9IGFyZzEgLyAyOworICAgIGlmICgoYXJnMiA9IChmbG9hdCgqKVsyXSkgUHlNZW1fTkVXKGZsb2F0ICwgMiAqIGFyZzEgKSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgaWYgKCFnZXRpZmxvYXRhcnJheShhcmdzLCAyLCAwLCAyICogYXJnMSAsIChmbG9hdCAqKSBhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKChhcmczID0gUHlNZW1fTkVXKHVuc2lnbmVkIHNob3J0ICwgYXJnMSApKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICBpZiAoIWdldGlzaG9ydGFycmF5KGFyZ3MsIDIsIDEsIGFyZzEgLCAoc2hvcnQgKikgYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHNwbGYyKCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKKyAgICBQeU1lbV9ERUwoYXJnMik7CisgICAgUHlNZW1fREVMKGFyZzMpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBzcGxmaSBsb25nIHMgbG9uZyBzWzMqYXJnMV0gdV9zaG9ydCBzW2FyZzFdICovCkBAIC00MjYyLDI1ICs0MjYyLDI1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfc3BsZmkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JbG9uZyAoKiBhcmcyKSBbIDMgXSA7Ci0JdW5zaWduZWQgc2hvcnQgKiBhcmczIDsKLQlpZiAoIWdldGlsb25nYXJyYXlzaXplKGFyZ3MsIDIsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JYXJnMSA9IGFyZzEgLyAzOwotCWlmICgoYXJnMiA9IChsb25nKCopWzNdKSBQeU1lbV9ORVcobG9uZyAsIDMgKiBhcmcxICkpID09IE5VTEwpCi0JCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCWlmICghZ2V0aWxvbmdhcnJheShhcmdzLCAyLCAwLCAzICogYXJnMSAsIChsb25nICopIGFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoKGFyZzMgPSBQeU1lbV9ORVcodW5zaWduZWQgc2hvcnQgLCBhcmcxICkpID09IE5VTEwpCi0JCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCWlmICghZ2V0aXNob3J0YXJyYXkoYXJncywgMiwgMSwgYXJnMSAsIChzaG9ydCAqKSBhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0Jc3BsZmkoIGFyZzEgLCBhcmcyICwgYXJnMyApOwotCVB5TWVtX0RFTChhcmcyKTsKLQlQeU1lbV9ERUwoYXJnMyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgbG9uZyAoKiBhcmcyKSBbIDMgXSA7CisgICAgdW5zaWduZWQgc2hvcnQgKiBhcmczIDsKKyAgICBpZiAoIWdldGlsb25nYXJyYXlzaXplKGFyZ3MsIDIsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYXJnMSA9IGFyZzEgLyAzOworICAgIGlmICgoYXJnMiA9IChsb25nKCopWzNdKSBQeU1lbV9ORVcobG9uZyAsIDMgKiBhcmcxICkpID09IE5VTEwpCisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIGlmICghZ2V0aWxvbmdhcnJheShhcmdzLCAyLCAwLCAzICogYXJnMSAsIChsb25nICopIGFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoKGFyZzMgPSBQeU1lbV9ORVcodW5zaWduZWQgc2hvcnQgLCBhcmcxICkpID09IE5VTEwpCisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIGlmICghZ2V0aXNob3J0YXJyYXkoYXJncywgMiwgMSwgYXJnMSAsIChzaG9ydCAqKSBhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgc3BsZmkoIGFyZzEgLCBhcmcyICwgYXJnMyApOworICAgIFB5TWVtX0RFTChhcmcyKTsKKyAgICBQeU1lbV9ERUwoYXJnMyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHNwbGYyaSBsb25nIHMgbG9uZyBzWzIqYXJnMV0gdV9zaG9ydCBzW2FyZzFdICovCkBAIC00Mjg4LDI1ICs0Mjg4LDI1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfc3BsZjJpKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWxvbmcgKCogYXJnMikgWyAyIF0gOwotCXVuc2lnbmVkIHNob3J0ICogYXJnMyA7Ci0JaWYgKCFnZXRpbG9uZ2FycmF5c2l6ZShhcmdzLCAyLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWFyZzEgPSBhcmcxIC8gMjsKLQlpZiAoKGFyZzIgPSAobG9uZygqKVsyXSkgUHlNZW1fTkVXKGxvbmcgLCAyICogYXJnMSApKSA9PSBOVUxMKQotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQlpZiAoIWdldGlsb25nYXJyYXkoYXJncywgMiwgMCwgMiAqIGFyZzEgLCAobG9uZyAqKSBhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKChhcmczID0gUHlNZW1fTkVXKHVuc2lnbmVkIHNob3J0ICwgYXJnMSApKSA9PSBOVUxMKQotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQlpZiAoIWdldGlzaG9ydGFycmF5KGFyZ3MsIDIsIDEsIGFyZzEgLCAoc2hvcnQgKikgYXJnMykpCi0JCXJldHVybiBOVUxMOwotCXNwbGYyaSggYXJnMSAsIGFyZzIgLCBhcmczICk7Ci0JUHlNZW1fREVMKGFyZzIpOwotCVB5TWVtX0RFTChhcmczKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBsb25nICgqIGFyZzIpIFsgMiBdIDsKKyAgICB1bnNpZ25lZCBzaG9ydCAqIGFyZzMgOworICAgIGlmICghZ2V0aWxvbmdhcnJheXNpemUoYXJncywgMiwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBhcmcxID0gYXJnMSAvIDI7CisgICAgaWYgKChhcmcyID0gKGxvbmcoKilbMl0pIFB5TWVtX05FVyhsb25nICwgMiAqIGFyZzEgKSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgaWYgKCFnZXRpbG9uZ2FycmF5KGFyZ3MsIDIsIDAsIDIgKiBhcmcxICwgKGxvbmcgKikgYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICgoYXJnMyA9IFB5TWVtX05FVyh1bnNpZ25lZCBzaG9ydCAsIGFyZzEgKSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgaWYgKCFnZXRpc2hvcnRhcnJheShhcmdzLCAyLCAxLCBhcmcxICwgKHNob3J0ICopIGFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBzcGxmMmkoIGFyZzEgLCBhcmcyICwgYXJnMyApOworICAgIFB5TWVtX0RFTChhcmcyKTsKKyAgICBQeU1lbV9ERUwoYXJnMyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHNwbGZzIGxvbmcgcyBzaG9ydCBzWzMqYXJnMV0gdV9zaG9ydCBzW2FyZzFdICovCkBAIC00MzE0LDI1ICs0MzE0LDI1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfc3BsZnMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0Jc2hvcnQgKCogYXJnMikgWyAzIF0gOwotCXVuc2lnbmVkIHNob3J0ICogYXJnMyA7Ci0JaWYgKCFnZXRpbG9uZ2FycmF5c2l6ZShhcmdzLCAyLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWFyZzEgPSBhcmcxIC8gMzsKLQlpZiAoKGFyZzIgPSAoc2hvcnQoKilbM10pIFB5TWVtX05FVyhzaG9ydCAsIDMgKiBhcmcxICkpID09IE5VTEwpCi0JCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCWlmICghZ2V0aXNob3J0YXJyYXkoYXJncywgMiwgMCwgMyAqIGFyZzEgLCAoc2hvcnQgKikgYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICgoYXJnMyA9IFB5TWVtX05FVyh1bnNpZ25lZCBzaG9ydCAsIGFyZzEgKSkgPT0gTlVMTCkKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JaWYgKCFnZXRpc2hvcnRhcnJheShhcmdzLCAyLCAxLCBhcmcxICwgKHNob3J0ICopIGFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQlzcGxmcyggYXJnMSAsIGFyZzIgLCBhcmczICk7Ci0JUHlNZW1fREVMKGFyZzIpOwotCVB5TWVtX0RFTChhcmczKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBzaG9ydCAoKiBhcmcyKSBbIDMgXSA7CisgICAgdW5zaWduZWQgc2hvcnQgKiBhcmczIDsKKyAgICBpZiAoIWdldGlsb25nYXJyYXlzaXplKGFyZ3MsIDIsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYXJnMSA9IGFyZzEgLyAzOworICAgIGlmICgoYXJnMiA9IChzaG9ydCgqKVszXSkgUHlNZW1fTkVXKHNob3J0ICwgMyAqIGFyZzEgKSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgaWYgKCFnZXRpc2hvcnRhcnJheShhcmdzLCAyLCAwLCAzICogYXJnMSAsIChzaG9ydCAqKSBhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKChhcmczID0gUHlNZW1fTkVXKHVuc2lnbmVkIHNob3J0ICwgYXJnMSApKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICBpZiAoIWdldGlzaG9ydGFycmF5KGFyZ3MsIDIsIDEsIGFyZzEgLCAoc2hvcnQgKikgYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHNwbGZzKCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKKyAgICBQeU1lbV9ERUwoYXJnMik7CisgICAgUHlNZW1fREVMKGFyZzMpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBzcGxmMnMgbG9uZyBzIHNob3J0IHNbMiphcmcxXSB1X3Nob3J0IHNbYXJnMV0gKi8KQEAgLTQzNDAsMjUgKzQzNDAsMjUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9zcGxmMnMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0Jc2hvcnQgKCogYXJnMikgWyAyIF0gOwotCXVuc2lnbmVkIHNob3J0ICogYXJnMyA7Ci0JaWYgKCFnZXRpbG9uZ2FycmF5c2l6ZShhcmdzLCAyLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWFyZzEgPSBhcmcxIC8gMjsKLQlpZiAoKGFyZzIgPSAoc2hvcnQoKilbMl0pIFB5TWVtX05FVyhzaG9ydCAsIDIgKiBhcmcxICkpID09IE5VTEwpCi0JCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCWlmICghZ2V0aXNob3J0YXJyYXkoYXJncywgMiwgMCwgMiAqIGFyZzEgLCAoc2hvcnQgKikgYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICgoYXJnMyA9IFB5TWVtX05FVyh1bnNpZ25lZCBzaG9ydCAsIGFyZzEgKSkgPT0gTlVMTCkKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JaWYgKCFnZXRpc2hvcnRhcnJheShhcmdzLCAyLCAxLCBhcmcxICwgKHNob3J0ICopIGFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQlzcGxmMnMoIGFyZzEgLCBhcmcyICwgYXJnMyApOwotCVB5TWVtX0RFTChhcmcyKTsKLQlQeU1lbV9ERUwoYXJnMyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgc2hvcnQgKCogYXJnMikgWyAyIF0gOworICAgIHVuc2lnbmVkIHNob3J0ICogYXJnMyA7CisgICAgaWYgKCFnZXRpbG9uZ2FycmF5c2l6ZShhcmdzLCAyLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGFyZzEgPSBhcmcxIC8gMjsKKyAgICBpZiAoKGFyZzIgPSAoc2hvcnQoKilbMl0pIFB5TWVtX05FVyhzaG9ydCAsIDIgKiBhcmcxICkpID09IE5VTEwpCisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIGlmICghZ2V0aXNob3J0YXJyYXkoYXJncywgMiwgMCwgMiAqIGFyZzEgLCAoc2hvcnQgKikgYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICgoYXJnMyA9IFB5TWVtX05FVyh1bnNpZ25lZCBzaG9ydCAsIGFyZzEgKSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgaWYgKCFnZXRpc2hvcnRhcnJheShhcmdzLCAyLCAxLCBhcmcxICwgKHNob3J0ICopIGFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBzcGxmMnMoIGFyZzEgLCBhcmcyICwgYXJnMyApOworICAgIFB5TWVtX0RFTChhcmcyKTsKKyAgICBQeU1lbV9ERUwoYXJnMyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHJwYXRjaCBmbG9hdCBzWzQqNF0gZmxvYXQgc1s0KjRdIGZsb2F0IHNbNCo0XSBmbG9hdCBzWzQqNF0gKi8KQEAgLTQzNjYsMjEgKzQzNjYsMjEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9ycGF0Y2goUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWZsb2F0IGFyZzEgWyA0IF0gWyA0IF0gOwotCWZsb2F0IGFyZzIgWyA0IF0gWyA0IF0gOwotCWZsb2F0IGFyZzMgWyA0IF0gWyA0IF0gOwotCWZsb2F0IGFyZzQgWyA0IF0gWyA0IF0gOwotCWlmICghZ2V0aWZsb2F0YXJyYXkoYXJncywgNCwgMCwgNCAqIDQgLCAoZmxvYXQgKikgYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJyYXkoYXJncywgNCwgMSwgNCAqIDQgLCAoZmxvYXQgKikgYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJyYXkoYXJncywgNCwgMiwgNCAqIDQgLCAoZmxvYXQgKikgYXJnMykpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJyYXkoYXJncywgNCwgMywgNCAqIDQgLCAoZmxvYXQgKikgYXJnNCkpCi0JCXJldHVybiBOVUxMOwotCXJwYXRjaCggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBmbG9hdCBhcmcxIFsgNCBdIFsgNCBdIDsKKyAgICBmbG9hdCBhcmcyIFsgNCBdIFsgNCBdIDsKKyAgICBmbG9hdCBhcmczIFsgNCBdIFsgNCBdIDsKKyAgICBmbG9hdCBhcmc0IFsgNCBdIFsgNCBdIDsKKyAgICBpZiAoIWdldGlmbG9hdGFycmF5KGFyZ3MsIDQsIDAsIDQgKiA0ICwgKGZsb2F0ICopIGFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlmbG9hdGFycmF5KGFyZ3MsIDQsIDEsIDQgKiA0ICwgKGZsb2F0ICopIGFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlmbG9hdGFycmF5KGFyZ3MsIDQsIDIsIDQgKiA0ICwgKGZsb2F0ICopIGFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlmbG9hdGFycmF5KGFyZ3MsIDQsIDMsIDQgKiA0ICwgKGZsb2F0ICopIGFyZzQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBycGF0Y2goIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgb3J0aG8yIGZsb2F0IHMgZmxvYXQgcyBmbG9hdCBzIGZsb2F0IHMgKi8KQEAgLTQzODgsMjEgKzQzODgsMjEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9vcnRobzIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWZsb2F0IGFyZzEgOwotCWZsb2F0IGFyZzIgOwotCWZsb2F0IGFyZzMgOwotCWZsb2F0IGFyZzQgOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDQsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNCwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA0LCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDQsIDMsICZhcmc0KSkKLQkJcmV0dXJuIE5VTEw7Ci0Jb3J0aG8yKCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGZsb2F0IGFyZzEgOworICAgIGZsb2F0IGFyZzIgOworICAgIGZsb2F0IGFyZzMgOworICAgIGZsb2F0IGFyZzQgOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDQsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNCwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA0LCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDQsIDMsICZhcmc0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgb3J0aG8yKCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHJlY3QgZmxvYXQgcyBmbG9hdCBzIGZsb2F0IHMgZmxvYXQgcyAqLwpAQCAtNDQxMCwyMSArNDQxMCwyMSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3JlY3QoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWZsb2F0IGFyZzEgOwotCWZsb2F0IGFyZzIgOwotCWZsb2F0IGFyZzMgOwotCWZsb2F0IGFyZzQgOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDQsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNCwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA0LCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDQsIDMsICZhcmc0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmVjdCggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBmbG9hdCBhcmcxIDsKKyAgICBmbG9hdCBhcmcyIDsKKyAgICBmbG9hdCBhcmczIDsKKyAgICBmbG9hdCBhcmc0IDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA0LCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDQsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNCwgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA0LCAzLCAmYXJnNCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJlY3QoIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcmVjdGYgZmxvYXQgcyBmbG9hdCBzIGZsb2F0IHMgZmxvYXQgcyAqLwpAQCAtNDQzMiwyMSArNDQzMiwyMSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3JlY3RmKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlmbG9hdCBhcmcxIDsKLQlmbG9hdCBhcmcyIDsKLQlmbG9hdCBhcmczIDsKLQlmbG9hdCBhcmc0IDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA0LCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDQsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNCwgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA0LCAzLCAmYXJnNCkpCi0JCXJldHVybiBOVUxMOwotCXJlY3RmKCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGZsb2F0IGFyZzEgOworICAgIGZsb2F0IGFyZzIgOworICAgIGZsb2F0IGFyZzMgOworICAgIGZsb2F0IGFyZzQgOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDQsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNCwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA0LCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDQsIDMsICZhcmc0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmVjdGYoIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgeGZwdDQgZmxvYXQgcyBmbG9hdCBzIGZsb2F0IHMgZmxvYXQgcyAqLwpAQCAtNDQ1NCwyMSArNDQ1NCwyMSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3hmcHQ0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlmbG9hdCBhcmcxIDsKLQlmbG9hdCBhcmcyIDsKLQlmbG9hdCBhcmczIDsKLQlmbG9hdCBhcmc0IDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA0LCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDQsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNCwgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA0LCAzLCAmYXJnNCkpCi0JCXJldHVybiBOVUxMOwotCXhmcHQ0KCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGZsb2F0IGFyZzEgOworICAgIGZsb2F0IGFyZzIgOworICAgIGZsb2F0IGFyZzMgOworICAgIGZsb2F0IGFyZzQgOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDQsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNCwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA0LCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDQsIDMsICZhcmc0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgeGZwdDQoIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgdGV4dHBvcnQgc2hvcnQgcyBzaG9ydCBzIHNob3J0IHMgc2hvcnQgcyAqLwpAQCAtNDQ3NiwyMSArNDQ3NiwyMSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3RleHRwb3J0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlzaG9ydCBhcmcyIDsKLQlzaG9ydCBhcmczIDsKLQlzaG9ydCBhcmc0IDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAzLCAmYXJnNCkpCi0JCXJldHVybiBOVUxMOwotCXRleHRwb3J0KCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgOworICAgIHNob3J0IGFyZzIgOworICAgIHNob3J0IGFyZzMgOworICAgIHNob3J0IGFyZzQgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDMsICZhcmc0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgdGV4dHBvcnQoIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgbWFwY29sb3Igc2hvcnQgcyBzaG9ydCBzIHNob3J0IHMgc2hvcnQgcyAqLwpAQCAtNDQ5OCwyMSArNDQ5OCwyMSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX21hcGNvbG9yKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlzaG9ydCBhcmcyIDsKLQlzaG9ydCBhcmczIDsKLQlzaG9ydCBhcmc0IDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAzLCAmYXJnNCkpCi0JCXJldHVybiBOVUxMOwotCW1hcGNvbG9yKCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgOworICAgIHNob3J0IGFyZzIgOworICAgIHNob3J0IGFyZzMgOworICAgIHNob3J0IGFyZzQgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDMsICZhcmc0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbWFwY29sb3IoIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgc2NybWFzayBzaG9ydCBzIHNob3J0IHMgc2hvcnQgcyBzaG9ydCBzICovCkBAIC00NTIwLDIxICs0NTIwLDIxIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfc2NybWFzayhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0Jc2hvcnQgYXJnMiA7Ci0Jc2hvcnQgYXJnMyA7Ci0Jc2hvcnQgYXJnNCA7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMywgJmFyZzQpKQotCQlyZXR1cm4gTlVMTDsKLQlzY3JtYXNrKCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgOworICAgIHNob3J0IGFyZzIgOworICAgIHNob3J0IGFyZzMgOworICAgIHNob3J0IGFyZzQgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDMsICZhcmc0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgc2NybWFzayggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBzZXR2YWx1YXRvciBzaG9ydCBzIHNob3J0IHMgc2hvcnQgcyBzaG9ydCBzICovCkBAIC00NTQyLDIxICs0NTQyLDIxIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfc2V0dmFsdWF0b3IoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCXNob3J0IGFyZzIgOwotCXNob3J0IGFyZzMgOwotCXNob3J0IGFyZzQgOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDMsICZhcmc0KSkKLQkJcmV0dXJuIE5VTEw7Ci0Jc2V0dmFsdWF0b3IoIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSA7CisgICAgc2hvcnQgYXJnMiA7CisgICAgc2hvcnQgYXJnMyA7CisgICAgc2hvcnQgYXJnNCA7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMywgJmFyZzQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBzZXR2YWx1YXRvciggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCB2aWV3cG9ydCBzaG9ydCBzIHNob3J0IHMgc2hvcnQgcyBzaG9ydCBzICovCkBAIC00NTY0LDIxICs0NTY0LDIxIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfdmlld3BvcnQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCXNob3J0IGFyZzIgOwotCXNob3J0IGFyZzMgOwotCXNob3J0IGFyZzQgOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDMsICZhcmc0KSkKLQkJcmV0dXJuIE5VTEw7Ci0Jdmlld3BvcnQoIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSA7CisgICAgc2hvcnQgYXJnMiA7CisgICAgc2hvcnQgYXJnMyA7CisgICAgc2hvcnQgYXJnNCA7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMywgJmFyZzQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB2aWV3cG9ydCggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBzaGFkZXJhbmdlIHNob3J0IHMgc2hvcnQgcyBzaG9ydCBzIHNob3J0IHMgKi8KQEAgLTQ1ODYsMjEgKzQ1ODYsMjEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9zaGFkZXJhbmdlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlzaG9ydCBhcmcyIDsKLQlzaG9ydCBhcmczIDsKLQlzaG9ydCBhcmc0IDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAzLCAmYXJnNCkpCi0JCXJldHVybiBOVUxMOwotCXNoYWRlcmFuZ2UoIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSA7CisgICAgc2hvcnQgYXJnMiA7CisgICAgc2hvcnQgYXJnMyA7CisgICAgc2hvcnQgYXJnNCA7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMywgJmFyZzQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBzaGFkZXJhbmdlKCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHhmcHQ0cyBzaG9ydCBzIHNob3J0IHMgc2hvcnQgcyBzaG9ydCBzICovCkBAIC00NjA4LDIxICs0NjA4LDIxIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfeGZwdDRzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlzaG9ydCBhcmcyIDsKLQlzaG9ydCBhcmczIDsKLQlzaG9ydCBhcmc0IDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAzLCAmYXJnNCkpCi0JCXJldHVybiBOVUxMOwotCXhmcHQ0cyggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxIDsKKyAgICBzaG9ydCBhcmcyIDsKKyAgICBzaG9ydCBhcmczIDsKKyAgICBzaG9ydCBhcmc0IDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAzLCAmYXJnNCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHhmcHQ0cyggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCByZWN0ZmkgbG9uZyBzIGxvbmcgcyBsb25nIHMgbG9uZyBzICovCkBAIC00NjMwLDIxICs0NjMwLDIxIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcmVjdGZpKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWxvbmcgYXJnMiA7Ci0JbG9uZyBhcmczIDsKLQlsb25nIGFyZzQgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgNCwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDQsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCA0LCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgNCwgMywgJmFyZzQpKQotCQlyZXR1cm4gTlVMTDsKLQlyZWN0ZmkoIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBsb25nIGFyZzIgOworICAgIGxvbmcgYXJnMyA7CisgICAgbG9uZyBhcmc0IDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDQsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCA0LCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgNCwgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDQsIDMsICZhcmc0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmVjdGZpKCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHJlY3RpIGxvbmcgcyBsb25nIHMgbG9uZyBzIGxvbmcgcyAqLwpAQCAtNDY1MiwyMSArNDY1MiwyMSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3JlY3RpKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWxvbmcgYXJnMiA7Ci0JbG9uZyBhcmczIDsKLQlsb25nIGFyZzQgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgNCwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDQsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCA0LCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgNCwgMywgJmFyZzQpKQotCQlyZXR1cm4gTlVMTDsKLQlyZWN0aSggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGxvbmcgYXJnMiA7CisgICAgbG9uZyBhcmczIDsKKyAgICBsb25nIGFyZzQgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgNCwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDQsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCA0LCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgNCwgMywgJmFyZzQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZWN0aSggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCB4ZnB0NGkgbG9uZyBzIGxvbmcgcyBsb25nIHMgbG9uZyBzICovCkBAIC00Njc0LDIxICs0Njc0LDIxIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfeGZwdDRpKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWxvbmcgYXJnMiA7Ci0JbG9uZyBhcmczIDsKLQlsb25nIGFyZzQgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgNCwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDQsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCA0LCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgNCwgMywgJmFyZzQpKQotCQlyZXR1cm4gTlVMTDsKLQl4ZnB0NGkoIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBsb25nIGFyZzIgOworICAgIGxvbmcgYXJnMyA7CisgICAgbG9uZyBhcmc0IDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDQsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCA0LCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgNCwgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDQsIDMsICZhcmc0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgeGZwdDRpKCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHByZWZwb3NpdGlvbiBsb25nIHMgbG9uZyBzIGxvbmcgcyBsb25nIHMgKi8KQEAgLTQ2OTYsMjEgKzQ2OTYsMjEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9wcmVmcG9zaXRpb24oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JbG9uZyBhcmcyIDsKLQlsb25nIGFyZzMgOwotCWxvbmcgYXJnNCA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCA0LCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgNCwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDQsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCA0LCAzLCAmYXJnNCkpCi0JCXJldHVybiBOVUxMOwotCXByZWZwb3NpdGlvbiggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGxvbmcgYXJnMiA7CisgICAgbG9uZyBhcmczIDsKKyAgICBsb25nIGFyZzQgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgNCwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDQsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCA0LCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgNCwgMywgJmFyZzQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBwcmVmcG9zaXRpb24oIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgYXJjIGZsb2F0IHMgZmxvYXQgcyBmbG9hdCBzIHNob3J0IHMgc2hvcnQgcyAqLwpAQCAtNDcxOCwyNCArNDcxOCwyNCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2FyYyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZmxvYXQgYXJnMSA7Ci0JZmxvYXQgYXJnMiA7Ci0JZmxvYXQgYXJnMyA7Ci0Jc2hvcnQgYXJnNCA7Ci0Jc2hvcnQgYXJnNSA7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA1LCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDUsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNSwgMywgJmFyZzQpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA1LCA0LCAmYXJnNSkpCi0JCXJldHVybiBOVUxMOwotCWFyYyggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCAsIGFyZzUgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZmxvYXQgYXJnMSA7CisgICAgZmxvYXQgYXJnMiA7CisgICAgZmxvYXQgYXJnMyA7CisgICAgc2hvcnQgYXJnNCA7CisgICAgc2hvcnQgYXJnNSA7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA1LCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDUsIDIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNSwgMywgJmFyZzQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA1LCA0LCAmYXJnNSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGFyYyggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCAsIGFyZzUgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgYXJjZiBmbG9hdCBzIGZsb2F0IHMgZmxvYXQgcyBzaG9ydCBzIHNob3J0IHMgKi8KQEAgLTQ3NDMsMjQgKzQ3NDMsMjQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9hcmNmKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlmbG9hdCBhcmcxIDsKLQlmbG9hdCBhcmcyIDsKLQlmbG9hdCBhcmczIDsKLQlzaG9ydCBhcmc0IDsKLQlzaG9ydCBhcmc1IDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA1LCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDUsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNSwgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA1LCAzLCAmYXJnNCkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDUsIDQsICZhcmc1KSkKLQkJcmV0dXJuIE5VTEw7Ci0JYXJjZiggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCAsIGFyZzUgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZmxvYXQgYXJnMSA7CisgICAgZmxvYXQgYXJnMiA7CisgICAgZmxvYXQgYXJnMyA7CisgICAgc2hvcnQgYXJnNCA7CisgICAgc2hvcnQgYXJnNSA7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA1LCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDUsIDIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNSwgMywgJmFyZzQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA1LCA0LCAmYXJnNSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGFyY2YoIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgLCBhcmc1ICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGFyY2ZpIGxvbmcgcyBsb25nIHMgbG9uZyBzIHNob3J0IHMgc2hvcnQgcyAqLwpAQCAtNDc2OCwyNCArNDc2OCwyNCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2FyY2ZpKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWxvbmcgYXJnMiA7Ci0JbG9uZyBhcmczIDsKLQlzaG9ydCBhcmc0IDsKLQlzaG9ydCBhcmc1IDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDUsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCA1LCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgNSwgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA1LCAzLCAmYXJnNCkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDUsIDQsICZhcmc1KSkKLQkJcmV0dXJuIE5VTEw7Ci0JYXJjZmkoIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgLCBhcmc1ICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgbG9uZyBhcmcyIDsKKyAgICBsb25nIGFyZzMgOworICAgIHNob3J0IGFyZzQgOworICAgIHNob3J0IGFyZzUgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgNSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDUsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCA1LCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDUsIDMsICZhcmc0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNSwgNCwgJmFyZzUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBhcmNmaSggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCAsIGFyZzUgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgYXJjaSBsb25nIHMgbG9uZyBzIGxvbmcgcyBzaG9ydCBzIHNob3J0IHMgKi8KQEAgLTQ3OTMsMjQgKzQ3OTMsMjQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9hcmNpKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWxvbmcgYXJnMiA7Ci0JbG9uZyBhcmczIDsKLQlzaG9ydCBhcmc0IDsKLQlzaG9ydCBhcmc1IDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDUsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCA1LCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgNSwgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA1LCAzLCAmYXJnNCkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDUsIDQsICZhcmc1KSkKLQkJcmV0dXJuIE5VTEw7Ci0JYXJjaSggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCAsIGFyZzUgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBsb25nIGFyZzIgOworICAgIGxvbmcgYXJnMyA7CisgICAgc2hvcnQgYXJnNCA7CisgICAgc2hvcnQgYXJnNSA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCA1LCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgNSwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDUsIDIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNSwgMywgJmFyZzQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA1LCA0LCAmYXJnNSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGFyY2koIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgLCBhcmc1ICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGJib3gyIHNob3J0IHMgc2hvcnQgcyBmbG9hdCBzIGZsb2F0IHMgZmxvYXQgcyBmbG9hdCBzICovCkBAIC00ODE4LDI3ICs0ODE4LDI3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfYmJveDIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCXNob3J0IGFyZzIgOwotCWZsb2F0IGFyZzMgOwotCWZsb2F0IGFyZzQgOwotCWZsb2F0IGFyZzUgOwotCWZsb2F0IGFyZzYgOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDYsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNiwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA2LCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDYsIDMsICZhcmc0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNiwgNCwgJmFyZzUpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA2LCA1LCAmYXJnNikpCi0JCXJldHVybiBOVUxMOwotCWJib3gyKCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICwgYXJnNSAsIGFyZzYgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSA7CisgICAgc2hvcnQgYXJnMiA7CisgICAgZmxvYXQgYXJnMyA7CisgICAgZmxvYXQgYXJnNCA7CisgICAgZmxvYXQgYXJnNSA7CisgICAgZmxvYXQgYXJnNiA7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNiwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA2LCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDYsIDIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNiwgMywgJmFyZzQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA2LCA0LCAmYXJnNSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDYsIDUsICZhcmc2KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYmJveDIoIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgLCBhcmc1ICwgYXJnNiApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBiYm94Mmkgc2hvcnQgcyBzaG9ydCBzIGxvbmcgcyBsb25nIHMgbG9uZyBzIGxvbmcgcyAqLwpAQCAtNDg0NiwyNyArNDg0NiwyNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2Jib3gyaShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0Jc2hvcnQgYXJnMiA7Ci0JbG9uZyBhcmczIDsKLQlsb25nIGFyZzQgOwotCWxvbmcgYXJnNSA7Ci0JbG9uZyBhcmc2IDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA2LCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDYsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCA2LCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgNiwgMywgJmFyZzQpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDYsIDQsICZhcmc1KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCA2LCA1LCAmYXJnNikpCi0JCXJldHVybiBOVUxMOwotCWJib3gyaSggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCAsIGFyZzUgLCBhcmc2ICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgOworICAgIHNob3J0IGFyZzIgOworICAgIGxvbmcgYXJnMyA7CisgICAgbG9uZyBhcmc0IDsKKyAgICBsb25nIGFyZzUgOworICAgIGxvbmcgYXJnNiA7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNiwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA2LCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgNiwgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDYsIDMsICZhcmc0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCA2LCA0LCAmYXJnNSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgNiwgNSwgJmFyZzYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBiYm94MmkoIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgLCBhcmc1ICwgYXJnNiApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBiYm94MnMgc2hvcnQgcyBzaG9ydCBzIHNob3J0IHMgc2hvcnQgcyBzaG9ydCBzIHNob3J0IHMgKi8KQEAgLTQ4NzQsMjcgKzQ4NzQsMjcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9iYm94MnMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCXNob3J0IGFyZzIgOwotCXNob3J0IGFyZzMgOwotCXNob3J0IGFyZzQgOwotCXNob3J0IGFyZzUgOwotCXNob3J0IGFyZzYgOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDYsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNiwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA2LCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDYsIDMsICZhcmc0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNiwgNCwgJmFyZzUpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA2LCA1LCAmYXJnNikpCi0JCXJldHVybiBOVUxMOwotCWJib3gycyggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCAsIGFyZzUgLCBhcmc2ICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgOworICAgIHNob3J0IGFyZzIgOworICAgIHNob3J0IGFyZzMgOworICAgIHNob3J0IGFyZzQgOworICAgIHNob3J0IGFyZzUgOworICAgIHNob3J0IGFyZzYgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDYsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNiwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA2LCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDYsIDMsICZhcmc0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNiwgNCwgJmFyZzUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA2LCA1LCAmYXJnNikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGJib3gycyggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCAsIGFyZzUgLCBhcmc2ICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGJsaW5rIHNob3J0IHMgc2hvcnQgcyBzaG9ydCBzIHNob3J0IHMgc2hvcnQgcyAqLwpAQCAtNDkwMiwyNCArNDkwMiwyNCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2JsaW5rKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlzaG9ydCBhcmcyIDsKLQlzaG9ydCBhcmczIDsKLQlzaG9ydCBhcmc0IDsKLQlzaG9ydCBhcmc1IDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA1LCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDUsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNSwgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA1LCAzLCAmYXJnNCkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDUsIDQsICZhcmc1KSkKLQkJcmV0dXJuIE5VTEw7Ci0JYmxpbmsoIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgLCBhcmc1ICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgOworICAgIHNob3J0IGFyZzIgOworICAgIHNob3J0IGFyZzMgOworICAgIHNob3J0IGFyZzQgOworICAgIHNob3J0IGFyZzUgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDUsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNSwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA1LCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDUsIDMsICZhcmc0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNSwgNCwgJmFyZzUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBibGluayggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCAsIGFyZzUgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgb3J0aG8gZmxvYXQgcyBmbG9hdCBzIGZsb2F0IHMgZmxvYXQgcyBmbG9hdCBzIGZsb2F0IHMgKi8KQEAgLTQ5MjcsMjcgKzQ5MjcsMjcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9vcnRobyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZmxvYXQgYXJnMSA7Ci0JZmxvYXQgYXJnMiA7Ci0JZmxvYXQgYXJnMyA7Ci0JZmxvYXQgYXJnNCA7Ci0JZmxvYXQgYXJnNSA7Ci0JZmxvYXQgYXJnNiA7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNiwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA2LCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDYsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNiwgMywgJmFyZzQpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA2LCA0LCAmYXJnNSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDYsIDUsICZhcmc2KSkKLQkJcmV0dXJuIE5VTEw7Ci0Jb3J0aG8oIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgLCBhcmc1ICwgYXJnNiApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBmbG9hdCBhcmcxIDsKKyAgICBmbG9hdCBhcmcyIDsKKyAgICBmbG9hdCBhcmczIDsKKyAgICBmbG9hdCBhcmc0IDsKKyAgICBmbG9hdCBhcmc1IDsKKyAgICBmbG9hdCBhcmc2IDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA2LCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDYsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNiwgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA2LCAzLCAmYXJnNCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDYsIDQsICZhcmc1KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNiwgNSwgJmFyZzYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBvcnRobyggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCAsIGFyZzUgLCBhcmc2ICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHdpbmRvdyBmbG9hdCBzIGZsb2F0IHMgZmxvYXQgcyBmbG9hdCBzIGZsb2F0IHMgZmxvYXQgcyAqLwpAQCAtNDk1NSwyNyArNDk1NSwyNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3dpbmRvdyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZmxvYXQgYXJnMSA7Ci0JZmxvYXQgYXJnMiA7Ci0JZmxvYXQgYXJnMyA7Ci0JZmxvYXQgYXJnNCA7Ci0JZmxvYXQgYXJnNSA7Ci0JZmxvYXQgYXJnNiA7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNiwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA2LCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDYsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNiwgMywgJmFyZzQpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA2LCA0LCAmYXJnNSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDYsIDUsICZhcmc2KSkKLQkJcmV0dXJuIE5VTEw7Ci0Jd2luZG93KCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICwgYXJnNSAsIGFyZzYgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZmxvYXQgYXJnMSA7CisgICAgZmxvYXQgYXJnMiA7CisgICAgZmxvYXQgYXJnMyA7CisgICAgZmxvYXQgYXJnNCA7CisgICAgZmxvYXQgYXJnNSA7CisgICAgZmxvYXQgYXJnNiA7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNiwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA2LCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDYsIDIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNiwgMywgJmFyZzQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA2LCA0LCAmYXJnNSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDYsIDUsICZhcmc2KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgd2luZG93KCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICwgYXJnNSAsIGFyZzYgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgbG9va2F0IGZsb2F0IHMgZmxvYXQgcyBmbG9hdCBzIGZsb2F0IHMgZmxvYXQgcyBmbG9hdCBzIHNob3J0IHMgKi8KQEAgLTQ5ODMsMzAgKzQ5ODMsMzAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9sb29rYXQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWZsb2F0IGFyZzEgOwotCWZsb2F0IGFyZzIgOwotCWZsb2F0IGFyZzMgOwotCWZsb2F0IGFyZzQgOwotCWZsb2F0IGFyZzUgOwotCWZsb2F0IGFyZzYgOwotCXNob3J0IGFyZzcgOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDcsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNywgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA3LCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDcsIDMsICZhcmc0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNywgNCwgJmFyZzUpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA3LCA1LCAmYXJnNikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDcsIDYsICZhcmc3KSkKLQkJcmV0dXJuIE5VTEw7Ci0JbG9va2F0KCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICwgYXJnNSAsIGFyZzYgLCBhcmc3ICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGZsb2F0IGFyZzEgOworICAgIGZsb2F0IGFyZzIgOworICAgIGZsb2F0IGFyZzMgOworICAgIGZsb2F0IGFyZzQgOworICAgIGZsb2F0IGFyZzUgOworICAgIGZsb2F0IGFyZzYgOworICAgIHNob3J0IGFyZzcgOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDcsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNywgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA3LCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDcsIDMsICZhcmc0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNywgNCwgJmFyZzUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA3LCA1LCAmYXJnNikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDcsIDYsICZhcmc3KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbG9va2F0KCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICwgYXJnNSAsIGFyZzYgLCBhcmc3ICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHBlcnNwZWN0aXZlIHNob3J0IHMgZmxvYXQgcyBmbG9hdCBzIGZsb2F0IHMgKi8KQEAgLTUwMTQsMjEgKzUwMTQsMjEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9wZXJzcGVjdGl2ZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0JZmxvYXQgYXJnMiA7Ci0JZmxvYXQgYXJnMyA7Ci0JZmxvYXQgYXJnNCA7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA0LCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDQsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNCwgMywgJmFyZzQpKQotCQlyZXR1cm4gTlVMTDsKLQlwZXJzcGVjdGl2ZSggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxIDsKKyAgICBmbG9hdCBhcmcyIDsKKyAgICBmbG9hdCBhcmczIDsKKyAgICBmbG9hdCBhcmc0IDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDQsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNCwgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA0LCAzLCAmYXJnNCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHBlcnNwZWN0aXZlKCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHBvbGFydmlldyBmbG9hdCBzIHNob3J0IHMgc2hvcnQgcyBzaG9ydCBzICovCkBAIC01MDM2LDIxICs1MDM2LDIxIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcG9sYXJ2aWV3KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlmbG9hdCBhcmcxIDsKLQlzaG9ydCBhcmcyIDsKLQlzaG9ydCBhcmczIDsKLQlzaG9ydCBhcmc0IDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA0LCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAzLCAmYXJnNCkpCi0JCXJldHVybiBOVUxMOwotCXBvbGFydmlldyggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBmbG9hdCBhcmcxIDsKKyAgICBzaG9ydCBhcmcyIDsKKyAgICBzaG9ydCBhcmczIDsKKyAgICBzaG9ydCBhcmc0IDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA0LCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAzLCAmYXJnNCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHBvbGFydmlldyggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBhcmNmcyBzaG9ydCBzIHNob3J0IHMgc2hvcnQgcyBzaG9ydCBzIHNob3J0IHMgKi8KQEAgLTUwNTgsMjQgKzUwNTgsMjQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9hcmNmcyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0Jc2hvcnQgYXJnMiA7Ci0Jc2hvcnQgYXJnMyA7Ci0Jc2hvcnQgYXJnNCA7Ci0Jc2hvcnQgYXJnNSA7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA1LCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDUsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNSwgMywgJmFyZzQpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA1LCA0LCAmYXJnNSkpCi0JCXJldHVybiBOVUxMOwotCWFyY2ZzKCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICwgYXJnNSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxIDsKKyAgICBzaG9ydCBhcmcyIDsKKyAgICBzaG9ydCBhcmczIDsKKyAgICBzaG9ydCBhcmc0IDsKKyAgICBzaG9ydCBhcmc1IDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA1LCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDUsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNSwgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA1LCAzLCAmYXJnNCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDUsIDQsICZhcmc1KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYXJjZnMoIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgLCBhcmc1ICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGFyY3Mgc2hvcnQgcyBzaG9ydCBzIHNob3J0IHMgc2hvcnQgcyBzaG9ydCBzICovCkBAIC01MDgzLDI0ICs1MDgzLDI0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfYXJjcyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0Jc2hvcnQgYXJnMiA7Ci0Jc2hvcnQgYXJnMyA7Ci0Jc2hvcnQgYXJnNCA7Ci0Jc2hvcnQgYXJnNSA7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA1LCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDUsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNSwgMywgJmFyZzQpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA1LCA0LCAmYXJnNSkpCi0JCXJldHVybiBOVUxMOwotCWFyY3MoIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgLCBhcmc1ICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgOworICAgIHNob3J0IGFyZzIgOworICAgIHNob3J0IGFyZzMgOworICAgIHNob3J0IGFyZzQgOworICAgIHNob3J0IGFyZzUgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDUsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNSwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA1LCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDUsIDMsICZhcmc0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNSwgNCwgJmFyZzUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBhcmNzKCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICwgYXJnNSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCByZWN0Y29weSBzaG9ydCBzIHNob3J0IHMgc2hvcnQgcyBzaG9ydCBzIHNob3J0IHMgc2hvcnQgcyAqLwpAQCAtNTEwOCwyNyArNTEwOCwyNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3JlY3Rjb3B5KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlzaG9ydCBhcmcyIDsKLQlzaG9ydCBhcmczIDsKLQlzaG9ydCBhcmc0IDsKLQlzaG9ydCBhcmc1IDsKLQlzaG9ydCBhcmc2IDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA2LCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDYsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNiwgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA2LCAzLCAmYXJnNCkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDYsIDQsICZhcmc1KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNiwgNSwgJmFyZzYpKQotCQlyZXR1cm4gTlVMTDsKLQlyZWN0Y29weSggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCAsIGFyZzUgLCBhcmc2ICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgOworICAgIHNob3J0IGFyZzIgOworICAgIHNob3J0IGFyZzMgOworICAgIHNob3J0IGFyZzQgOworICAgIHNob3J0IGFyZzUgOworICAgIHNob3J0IGFyZzYgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDYsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNiwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA2LCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDYsIDMsICZhcmc0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNiwgNCwgJmFyZzUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA2LCA1LCAmYXJnNikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJlY3Rjb3B5KCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICwgYXJnNSAsIGFyZzYgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgUkdCY3Vyc29yIHNob3J0IHMgc2hvcnQgcyBzaG9ydCBzIHNob3J0IHMgc2hvcnQgcyBzaG9ydCBzIHNob3J0IHMgKi8KQEAgLTUxMzYsMzAgKzUxMzYsMzAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9SR0JjdXJzb3IoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCXNob3J0IGFyZzIgOwotCXNob3J0IGFyZzMgOwotCXNob3J0IGFyZzQgOwotCXNob3J0IGFyZzUgOwotCXNob3J0IGFyZzYgOwotCXNob3J0IGFyZzcgOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDcsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNywgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA3LCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDcsIDMsICZhcmc0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNywgNCwgJmFyZzUpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA3LCA1LCAmYXJnNikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDcsIDYsICZhcmc3KSkKLQkJcmV0dXJuIE5VTEw7Ci0JUkdCY3Vyc29yKCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICwgYXJnNSAsIGFyZzYgLCBhcmc3ICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgOworICAgIHNob3J0IGFyZzIgOworICAgIHNob3J0IGFyZzMgOworICAgIHNob3J0IGFyZzQgOworICAgIHNob3J0IGFyZzUgOworICAgIHNob3J0IGFyZzYgOworICAgIHNob3J0IGFyZzcgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDcsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNywgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA3LCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDcsIDMsICZhcmc0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNywgNCwgJmFyZzUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA3LCA1LCAmYXJnNikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDcsIDYsICZhcmc3KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUkdCY3Vyc29yKCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICwgYXJnNSAsIGFyZzYgLCBhcmc3ICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiBsb25nIGdldGJ1dHRvbiBzaG9ydCBzICovCkBAIC01MTY3LDEyICs1MTY3LDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZ2V0YnV0dG9uKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIHJldHZhbDsKLQlzaG9ydCBhcmcxIDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCXJldHZhbCA9IGdldGJ1dHRvbiggYXJnMSApOwotCXJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKKyAgICBsb25nIHJldHZhbDsKKyAgICBzaG9ydCBhcmcxIDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHZhbCA9IGdldGJ1dHRvbiggYXJnMSApOworICAgIHJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKIH0KIAogLyogbG9uZyBnZXRjbW1vZGUgKi8KQEAgLTUxODAsOSArNTE4MCw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZ2V0Y21tb2RlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIHJldHZhbDsKLQlyZXR2YWwgPSBnZXRjbW1vZGUoICk7Ci0JcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOworICAgIGxvbmcgcmV0dmFsOworICAgIHJldHZhbCA9IGdldGNtbW9kZSggKTsKKyAgICByZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CiB9CiAKIC8qIGxvbmcgZ2V0bHNiYWNrdXAgKi8KQEAgLTUxOTAsOSArNTE5MCw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZ2V0bHNiYWNrdXAoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgcmV0dmFsOwotCXJldHZhbCA9IGdldGxzYmFja3VwKCApOwotCXJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKKyAgICBsb25nIHJldHZhbDsKKyAgICByZXR2YWwgPSBnZXRsc2JhY2t1cCggKTsKKyAgICByZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CiB9CiAKIC8qIGxvbmcgZ2V0cmVzZXRscyAqLwpAQCAtNTIwMCw5ICs1MjAwLDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9nZXRyZXNldGxzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIHJldHZhbDsKLQlyZXR2YWwgPSBnZXRyZXNldGxzKCApOwotCXJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKKyAgICBsb25nIHJldHZhbDsKKyAgICByZXR2YWwgPSBnZXRyZXNldGxzKCApOworICAgIHJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKIH0KIAogLyogbG9uZyBnZXRkY20gKi8KQEAgLTUyMTAsOSArNTIxMCw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZ2V0ZGNtKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIHJldHZhbDsKLQlyZXR2YWwgPSBnZXRkY20oICk7Ci0JcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOworICAgIGxvbmcgcmV0dmFsOworICAgIHJldHZhbCA9IGdldGRjbSggKTsKKyAgICByZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CiB9CiAKIC8qIGxvbmcgZ2V0emJ1ZmZlciAqLwpAQCAtNTIyMCw5ICs1MjIwLDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9nZXR6YnVmZmVyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIHJldHZhbDsKLQlyZXR2YWwgPSBnZXR6YnVmZmVyKCApOwotCXJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKKyAgICBsb25nIHJldHZhbDsKKyAgICByZXR2YWwgPSBnZXR6YnVmZmVyKCApOworICAgIHJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKIH0KIAogLyogbG9uZyBpc21leCAqLwpAQCAtNTIzMCw5ICs1MjMwLDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9pc21leChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyByZXR2YWw7Ci0JcmV0dmFsID0gaXNtZXgoICk7Ci0JcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOworICAgIGxvbmcgcmV0dmFsOworICAgIHJldHZhbCA9IGlzbWV4KCApOworICAgIHJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKIH0KIAogLyogbG9uZyBpc29iaiBsb25nIHMgKi8KQEAgLTUyNDAsMTIgKzUyNDAsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9pc29iaihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyByZXR2YWw7Ci0JbG9uZyBhcmcxIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dmFsID0gaXNvYmooIGFyZzEgKTsKLQlyZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CisgICAgbG9uZyByZXR2YWw7CisgICAgbG9uZyBhcmcxIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dmFsID0gaXNvYmooIGFyZzEgKTsKKyAgICByZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CiB9CiAKIC8qIGxvbmcgaXNxdWV1ZWQgc2hvcnQgcyAqLwpAQCAtNTI1MywxMiArNTI1MywxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2lzcXVldWVkKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIHJldHZhbDsKLQlzaG9ydCBhcmcxIDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCXJldHZhbCA9IGlzcXVldWVkKCBhcmcxICk7Ci0JcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOworICAgIGxvbmcgcmV0dmFsOworICAgIHNob3J0IGFyZzEgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dmFsID0gaXNxdWV1ZWQoIGFyZzEgKTsKKyAgICByZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CiB9CiAKIC8qIGxvbmcgaXN0YWcgbG9uZyBzICovCkBAIC01MjY2LDEyICs1MjY2LDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfaXN0YWcoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgcmV0dmFsOwotCWxvbmcgYXJnMSA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCXJldHZhbCA9IGlzdGFnKCBhcmcxICk7Ci0JcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOworICAgIGxvbmcgcmV0dmFsOworICAgIGxvbmcgYXJnMSA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHZhbCA9IGlzdGFnKCBhcmcxICk7CisgICAgcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOwogfQogCiAvKiBsb25nIGdlbm9iaiAqLwpAQCAtNTI3OSw5ICs1Mjc5LDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9nZW5vYmooUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgcmV0dmFsOwotCXJldHZhbCA9IGdlbm9iaiggKTsKLQlyZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CisgICAgbG9uZyByZXR2YWw7CisgICAgcmV0dmFsID0gZ2Vub2JqKCApOworICAgIHJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKIH0KIAogLyogbG9uZyBnZW50YWcgKi8KQEAgLTUyODksOSArNTI4OSw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZ2VudGFnKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIHJldHZhbDsKLQlyZXR2YWwgPSBnZW50YWcoICk7Ci0JcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOworICAgIGxvbmcgcmV0dmFsOworICAgIHJldHZhbCA9IGdlbnRhZyggKTsKKyAgICByZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CiB9CiAKIC8qIGxvbmcgZ2V0YnVmZmVyICovCkBAIC01Mjk5LDkgKzUyOTksOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2dldGJ1ZmZlcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyByZXR2YWw7Ci0JcmV0dmFsID0gZ2V0YnVmZmVyKCApOwotCXJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKKyAgICBsb25nIHJldHZhbDsKKyAgICByZXR2YWwgPSBnZXRidWZmZXIoICk7CisgICAgcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOwogfQogCiAvKiBsb25nIGdldGNvbG9yICovCkBAIC01MzA5LDkgKzUzMDksOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2dldGNvbG9yKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIHJldHZhbDsKLQlyZXR2YWwgPSBnZXRjb2xvciggKTsKLQlyZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CisgICAgbG9uZyByZXR2YWw7CisgICAgcmV0dmFsID0gZ2V0Y29sb3IoICk7CisgICAgcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOwogfQogCiAvKiBsb25nIGdldGRpc3BsYXltb2RlICovCkBAIC01MzE5LDkgKzUzMTksOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2dldGRpc3BsYXltb2RlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIHJldHZhbDsKLQlyZXR2YWwgPSBnZXRkaXNwbGF5bW9kZSggKTsKLQlyZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CisgICAgbG9uZyByZXR2YWw7CisgICAgcmV0dmFsID0gZ2V0ZGlzcGxheW1vZGUoICk7CisgICAgcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOwogfQogCiAvKiBsb25nIGdldGZvbnQgKi8KQEAgLTUzMjksOSArNTMyOSw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZ2V0Zm9udChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyByZXR2YWw7Ci0JcmV0dmFsID0gZ2V0Zm9udCggKTsKLQlyZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CisgICAgbG9uZyByZXR2YWw7CisgICAgcmV0dmFsID0gZ2V0Zm9udCggKTsKKyAgICByZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CiB9CiAKIC8qIGxvbmcgZ2V0aGVpZ2h0ICovCkBAIC01MzM5LDkgKzUzMzksOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2dldGhlaWdodChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyByZXR2YWw7Ci0JcmV0dmFsID0gZ2V0aGVpZ2h0KCApOwotCXJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKKyAgICBsb25nIHJldHZhbDsKKyAgICByZXR2YWwgPSBnZXRoZWlnaHQoICk7CisgICAgcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOwogfQogCiAvKiBsb25nIGdldGhpdGNvZGUgKi8KQEAgLTUzNDksOSArNTM0OSw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZ2V0aGl0Y29kZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyByZXR2YWw7Ci0JcmV0dmFsID0gZ2V0aGl0Y29kZSggKTsKLQlyZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CisgICAgbG9uZyByZXR2YWw7CisgICAgcmV0dmFsID0gZ2V0aGl0Y29kZSggKTsKKyAgICByZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CiB9CiAKIC8qIGxvbmcgZ2V0bHN0eWxlICovCkBAIC01MzU5LDkgKzUzNTksOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2dldGxzdHlsZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyByZXR2YWw7Ci0JcmV0dmFsID0gZ2V0bHN0eWxlKCApOwotCXJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKKyAgICBsb25nIHJldHZhbDsKKyAgICByZXR2YWwgPSBnZXRsc3R5bGUoICk7CisgICAgcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOwogfQogCiAvKiBsb25nIGdldGx3aWR0aCAqLwpAQCAtNTM2OSw5ICs1MzY5LDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9nZXRsd2lkdGgoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgcmV0dmFsOwotCXJldHZhbCA9IGdldGx3aWR0aCggKTsKLQlyZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CisgICAgbG9uZyByZXR2YWw7CisgICAgcmV0dmFsID0gZ2V0bHdpZHRoKCApOworICAgIHJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKIH0KIAogLyogbG9uZyBnZXRtYXAgKi8KQEAgLTUzNzksOSArNTM3OSw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZ2V0bWFwKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIHJldHZhbDsKLQlyZXR2YWwgPSBnZXRtYXAoICk7Ci0JcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOworICAgIGxvbmcgcmV0dmFsOworICAgIHJldHZhbCA9IGdldG1hcCggKTsKKyAgICByZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CiB9CiAKIC8qIGxvbmcgZ2V0cGxhbmVzICovCkBAIC01Mzg5LDkgKzUzODksOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2dldHBsYW5lcyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyByZXR2YWw7Ci0JcmV0dmFsID0gZ2V0cGxhbmVzKCApOwotCXJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKKyAgICBsb25nIHJldHZhbDsKKyAgICByZXR2YWwgPSBnZXRwbGFuZXMoICk7CisgICAgcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOwogfQogCiAvKiBsb25nIGdldHdyaXRlbWFzayAqLwpAQCAtNTM5OSw5ICs1Mzk5LDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9nZXR3cml0ZW1hc2soUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgcmV0dmFsOwotCXJldHZhbCA9IGdldHdyaXRlbWFzayggKTsKLQlyZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CisgICAgbG9uZyByZXR2YWw7CisgICAgcmV0dmFsID0gZ2V0d3JpdGVtYXNrKCApOworICAgIHJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKIH0KIAogLyogbG9uZyBxdGVzdCAqLwpAQCAtNTQwOSw5ICs1NDA5LDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9xdGVzdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyByZXR2YWw7Ci0JcmV0dmFsID0gcXRlc3QoICk7Ci0JcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOworICAgIGxvbmcgcmV0dmFsOworICAgIHJldHZhbCA9IHF0ZXN0KCApOworICAgIHJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKIH0KIAogLyogbG9uZyBnZXRsc3JlcGVhdCAqLwpAQCAtNTQxOSw5ICs1NDE5LDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9nZXRsc3JlcGVhdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyByZXR2YWw7Ci0JcmV0dmFsID0gZ2V0bHNyZXBlYXQoICk7Ci0JcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOworICAgIGxvbmcgcmV0dmFsOworICAgIHJldHZhbCA9IGdldGxzcmVwZWF0KCApOworICAgIHJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKIH0KIAogLyogbG9uZyBnZXRtb25pdG9yICovCkBAIC01NDI5LDkgKzU0MjksOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2dldG1vbml0b3IoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgcmV0dmFsOwotCXJldHZhbCA9IGdldG1vbml0b3IoICk7Ci0JcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOworICAgIGxvbmcgcmV0dmFsOworICAgIHJldHZhbCA9IGdldG1vbml0b3IoICk7CisgICAgcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOwogfQogCiAvKiBsb25nIGdldG9wZW5vYmogKi8KQEAgLTU0MzksOSArNTQzOSw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZ2V0b3Blbm9iaihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyByZXR2YWw7Ci0JcmV0dmFsID0gZ2V0b3Blbm9iaiggKTsKLQlyZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CisgICAgbG9uZyByZXR2YWw7CisgICAgcmV0dmFsID0gZ2V0b3Blbm9iaiggKTsKKyAgICByZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CiB9CiAKIC8qIGxvbmcgZ2V0cGF0dGVybiAqLwpAQCAtNTQ0OSw5ICs1NDQ5LDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9nZXRwYXR0ZXJuKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIHJldHZhbDsKLQlyZXR2YWwgPSBnZXRwYXR0ZXJuKCApOwotCXJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKKyAgICBsb25nIHJldHZhbDsKKyAgICByZXR2YWwgPSBnZXRwYXR0ZXJuKCApOworICAgIHJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKIH0KIAogLyogbG9uZyB3aW5nZXQgKi8KQEAgLTU0NTksOSArNTQ1OSw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfd2luZ2V0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIHJldHZhbDsKLQlyZXR2YWwgPSB3aW5nZXQoICk7Ci0JcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOworICAgIGxvbmcgcmV0dmFsOworICAgIHJldHZhbCA9IHdpbmdldCggKTsKKyAgICByZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CiB9CiAKIC8qIGxvbmcgd2luYXR0YWNoICovCkBAIC01NDY5LDkgKzU0NjksOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3dpbmF0dGFjaChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyByZXR2YWw7Ci0JcmV0dmFsID0gd2luYXR0YWNoKCApOwotCXJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKKyAgICBsb25nIHJldHZhbDsKKyAgICByZXR2YWwgPSB3aW5hdHRhY2goICk7CisgICAgcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOwogfQogCiAvKiBsb25nIGdldG90aGVybW9uaXRvciAqLwpAQCAtNTQ3OSw5ICs1NDc5LDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9nZXRvdGhlcm1vbml0b3IoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgcmV0dmFsOwotCXJldHZhbCA9IGdldG90aGVybW9uaXRvciggKTsKLQlyZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CisgICAgbG9uZyByZXR2YWw7CisgICAgcmV0dmFsID0gZ2V0b3RoZXJtb25pdG9yKCApOworICAgIHJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKIH0KIAogLyogbG9uZyBuZXdwdXAgKi8KQEAgLTU0ODksOSArNTQ4OSw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfbmV3cHVwKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIHJldHZhbDsKLQlyZXR2YWwgPSBuZXdwdXAoICk7Ci0JcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOworICAgIGxvbmcgcmV0dmFsOworICAgIHJldHZhbCA9IG5ld3B1cCggKTsKKyAgICByZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CiB9CiAKIC8qIGxvbmcgZ2V0dmFsdWF0b3Igc2hvcnQgcyAqLwpAQCAtNTQ5OSwxMiArNTQ5OSwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2dldHZhbHVhdG9yKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIHJldHZhbDsKLQlzaG9ydCBhcmcxIDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCXJldHZhbCA9IGdldHZhbHVhdG9yKCBhcmcxICk7Ci0JcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOworICAgIGxvbmcgcmV0dmFsOworICAgIHNob3J0IGFyZzEgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dmFsID0gZ2V0dmFsdWF0b3IoIGFyZzEgKTsKKyAgICByZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CiB9CiAKIC8qIHZvaWQgd2luc2V0IGxvbmcgcyAqLwpAQCAtNTUxMiwxMiArNTUxMiwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3dpbnNldChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0Jd2luc2V0KCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHdpbnNldCggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogbG9uZyBkb3B1cCBsb25nIHMgKi8KQEAgLTU1MjUsMTIgKzU1MjUsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9kb3B1cChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyByZXR2YWw7Ci0JbG9uZyBhcmcxIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dmFsID0gZG9wdXAoIGFyZzEgKTsKLQlyZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CisgICAgbG9uZyByZXR2YWw7CisgICAgbG9uZyBhcmcxIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dmFsID0gZG9wdXAoIGFyZzEgKTsKKyAgICByZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CiB9CiAKIC8qIHZvaWQgZ2V0ZGVwdGggc2hvcnQgciBzaG9ydCByICovCkBAIC01NTM4LDE1ICs1NTM4LDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZ2V0ZGVwdGgoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCXNob3J0IGFyZzIgOwotCWdldGRlcHRoKCAmIGFyZzEgLCAmIGFyZzIgKTsKLQl7IFB5T2JqZWN0ICp2ID0gUHlUdXBsZV9OZXcoIDIgKTsKLQkgIGlmICh2ID09IE5VTEwpIHJldHVybiBOVUxMOwotCSAgUHlUdXBsZV9TZXRJdGVtKHYsIDAsIG1rbmV3c2hvcnRvYmplY3QoYXJnMSkpOwotCSAgUHlUdXBsZV9TZXRJdGVtKHYsIDEsIG1rbmV3c2hvcnRvYmplY3QoYXJnMikpOwotCSAgcmV0dXJuIHY7Ci0JfQorICAgIHNob3J0IGFyZzEgOworICAgIHNob3J0IGFyZzIgOworICAgIGdldGRlcHRoKCAmIGFyZzEgLCAmIGFyZzIgKTsKKyAgICB7IFB5T2JqZWN0ICp2ID0gUHlUdXBsZV9OZXcoIDIgKTsKKyAgICAgIGlmICh2ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgICAgUHlUdXBsZV9TZXRJdGVtKHYsIDAsIG1rbmV3c2hvcnRvYmplY3QoYXJnMSkpOworICAgICAgUHlUdXBsZV9TZXRJdGVtKHYsIDEsIG1rbmV3c2hvcnRvYmplY3QoYXJnMikpOworICAgICAgcmV0dXJuIHY7CisgICAgfQogfQogCiAvKiB2b2lkIGdldGNwb3Mgc2hvcnQgciBzaG9ydCByICovCkBAIC01NTU0LDE1ICs1NTU0LDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZ2V0Y3BvcyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0Jc2hvcnQgYXJnMiA7Ci0JZ2V0Y3BvcyggJiBhcmcxICwgJiBhcmcyICk7Ci0JeyBQeU9iamVjdCAqdiA9IFB5VHVwbGVfTmV3KCAyICk7Ci0JICBpZiAodiA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkgIFB5VHVwbGVfU2V0SXRlbSh2LCAwLCBta25ld3Nob3J0b2JqZWN0KGFyZzEpKTsKLQkgIFB5VHVwbGVfU2V0SXRlbSh2LCAxLCBta25ld3Nob3J0b2JqZWN0KGFyZzIpKTsKLQkgIHJldHVybiB2OwotCX0KKyAgICBzaG9ydCBhcmcxIDsKKyAgICBzaG9ydCBhcmcyIDsKKyAgICBnZXRjcG9zKCAmIGFyZzEgLCAmIGFyZzIgKTsKKyAgICB7IFB5T2JqZWN0ICp2ID0gUHlUdXBsZV9OZXcoIDIgKTsKKyAgICAgIGlmICh2ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgICAgUHlUdXBsZV9TZXRJdGVtKHYsIDAsIG1rbmV3c2hvcnRvYmplY3QoYXJnMSkpOworICAgICAgUHlUdXBsZV9TZXRJdGVtKHYsIDEsIG1rbmV3c2hvcnRvYmplY3QoYXJnMikpOworICAgICAgcmV0dXJuIHY7CisgICAgfQogfQogCiAvKiB2b2lkIGdldHNpemUgbG9uZyByIGxvbmcgciAqLwpAQCAtNTU3MCwxNSArNTU3MCwxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2dldHNpemUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JbG9uZyBhcmcyIDsKLQlnZXRzaXplKCAmIGFyZzEgLCAmIGFyZzIgKTsKLQl7IFB5T2JqZWN0ICp2ID0gUHlUdXBsZV9OZXcoIDIgKTsKLQkgIGlmICh2ID09IE5VTEwpIHJldHVybiBOVUxMOwotCSAgUHlUdXBsZV9TZXRJdGVtKHYsIDAsIG1rbmV3bG9uZ29iamVjdChhcmcxKSk7Ci0JICBQeVR1cGxlX1NldEl0ZW0odiwgMSwgbWtuZXdsb25nb2JqZWN0KGFyZzIpKTsKLQkgIHJldHVybiB2OwotCX0KKyAgICBsb25nIGFyZzEgOworICAgIGxvbmcgYXJnMiA7CisgICAgZ2V0c2l6ZSggJiBhcmcxICwgJiBhcmcyICk7CisgICAgeyBQeU9iamVjdCAqdiA9IFB5VHVwbGVfTmV3KCAyICk7CisgICAgICBpZiAodiA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAgIFB5VHVwbGVfU2V0SXRlbSh2LCAwLCBta25ld2xvbmdvYmplY3QoYXJnMSkpOworICAgICAgUHlUdXBsZV9TZXRJdGVtKHYsIDEsIG1rbmV3bG9uZ29iamVjdChhcmcyKSk7CisgICAgICByZXR1cm4gdjsKKyAgICB9CiB9CiAKIC8qIHZvaWQgZ2V0b3JpZ2luIGxvbmcgciBsb25nIHIgKi8KQEAgLTU1ODYsMTUgKzU1ODYsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9nZXRvcmlnaW4oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JbG9uZyBhcmcyIDsKLQlnZXRvcmlnaW4oICYgYXJnMSAsICYgYXJnMiApOwotCXsgUHlPYmplY3QgKnYgPSBQeVR1cGxlX05ldyggMiApOwotCSAgaWYgKHYgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JICBQeVR1cGxlX1NldEl0ZW0odiwgMCwgbWtuZXdsb25nb2JqZWN0KGFyZzEpKTsKLQkgIFB5VHVwbGVfU2V0SXRlbSh2LCAxLCBta25ld2xvbmdvYmplY3QoYXJnMikpOwotCSAgcmV0dXJuIHY7Ci0JfQorICAgIGxvbmcgYXJnMSA7CisgICAgbG9uZyBhcmcyIDsKKyAgICBnZXRvcmlnaW4oICYgYXJnMSAsICYgYXJnMiApOworICAgIHsgUHlPYmplY3QgKnYgPSBQeVR1cGxlX05ldyggMiApOworICAgICAgaWYgKHYgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgICBQeVR1cGxlX1NldEl0ZW0odiwgMCwgbWtuZXdsb25nb2JqZWN0KGFyZzEpKTsKKyAgICAgIFB5VHVwbGVfU2V0SXRlbSh2LCAxLCBta25ld2xvbmdvYmplY3QoYXJnMikpOworICAgICAgcmV0dXJuIHY7CisgICAgfQogfQogCiAvKiB2b2lkIGdldHZpZXdwb3J0IHNob3J0IHIgc2hvcnQgciBzaG9ydCByIHNob3J0IHIgKi8KQEAgLTU2MDIsMTkgKzU2MDIsMTkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9nZXR2aWV3cG9ydChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0Jc2hvcnQgYXJnMiA7Ci0Jc2hvcnQgYXJnMyA7Ci0Jc2hvcnQgYXJnNCA7Ci0JZ2V0dmlld3BvcnQoICYgYXJnMSAsICYgYXJnMiAsICYgYXJnMyAsICYgYXJnNCApOwotCXsgUHlPYmplY3QgKnYgPSBQeVR1cGxlX05ldyggNCApOwotCSAgaWYgKHYgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JICBQeVR1cGxlX1NldEl0ZW0odiwgMCwgbWtuZXdzaG9ydG9iamVjdChhcmcxKSk7Ci0JICBQeVR1cGxlX1NldEl0ZW0odiwgMSwgbWtuZXdzaG9ydG9iamVjdChhcmcyKSk7Ci0JICBQeVR1cGxlX1NldEl0ZW0odiwgMiwgbWtuZXdzaG9ydG9iamVjdChhcmczKSk7Ci0JICBQeVR1cGxlX1NldEl0ZW0odiwgMywgbWtuZXdzaG9ydG9iamVjdChhcmc0KSk7Ci0JICByZXR1cm4gdjsKLQl9CisgICAgc2hvcnQgYXJnMSA7CisgICAgc2hvcnQgYXJnMiA7CisgICAgc2hvcnQgYXJnMyA7CisgICAgc2hvcnQgYXJnNCA7CisgICAgZ2V0dmlld3BvcnQoICYgYXJnMSAsICYgYXJnMiAsICYgYXJnMyAsICYgYXJnNCApOworICAgIHsgUHlPYmplY3QgKnYgPSBQeVR1cGxlX05ldyggNCApOworICAgICAgaWYgKHYgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgICBQeVR1cGxlX1NldEl0ZW0odiwgMCwgbWtuZXdzaG9ydG9iamVjdChhcmcxKSk7CisgICAgICBQeVR1cGxlX1NldEl0ZW0odiwgMSwgbWtuZXdzaG9ydG9iamVjdChhcmcyKSk7CisgICAgICBQeVR1cGxlX1NldEl0ZW0odiwgMiwgbWtuZXdzaG9ydG9iamVjdChhcmczKSk7CisgICAgICBQeVR1cGxlX1NldEl0ZW0odiwgMywgbWtuZXdzaG9ydG9iamVjdChhcmc0KSk7CisgICAgICByZXR1cm4gdjsKKyAgICB9CiB9CiAKIC8qIHZvaWQgZ2V0dHAgc2hvcnQgciBzaG9ydCByIHNob3J0IHIgc2hvcnQgciAqLwpAQCAtNTYyMiwxOSArNTYyMiwxOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2dldHRwKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlzaG9ydCBhcmcyIDsKLQlzaG9ydCBhcmczIDsKLQlzaG9ydCBhcmc0IDsKLQlnZXR0cCggJiBhcmcxICwgJiBhcmcyICwgJiBhcmczICwgJiBhcmc0ICk7Ci0JeyBQeU9iamVjdCAqdiA9IFB5VHVwbGVfTmV3KCA0ICk7Ci0JICBpZiAodiA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkgIFB5VHVwbGVfU2V0SXRlbSh2LCAwLCBta25ld3Nob3J0b2JqZWN0KGFyZzEpKTsKLQkgIFB5VHVwbGVfU2V0SXRlbSh2LCAxLCBta25ld3Nob3J0b2JqZWN0KGFyZzIpKTsKLQkgIFB5VHVwbGVfU2V0SXRlbSh2LCAyLCBta25ld3Nob3J0b2JqZWN0KGFyZzMpKTsKLQkgIFB5VHVwbGVfU2V0SXRlbSh2LCAzLCBta25ld3Nob3J0b2JqZWN0KGFyZzQpKTsKLQkgIHJldHVybiB2OwotCX0KKyAgICBzaG9ydCBhcmcxIDsKKyAgICBzaG9ydCBhcmcyIDsKKyAgICBzaG9ydCBhcmczIDsKKyAgICBzaG9ydCBhcmc0IDsKKyAgICBnZXR0cCggJiBhcmcxICwgJiBhcmcyICwgJiBhcmczICwgJiBhcmc0ICk7CisgICAgeyBQeU9iamVjdCAqdiA9IFB5VHVwbGVfTmV3KCA0ICk7CisgICAgICBpZiAodiA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAgIFB5VHVwbGVfU2V0SXRlbSh2LCAwLCBta25ld3Nob3J0b2JqZWN0KGFyZzEpKTsKKyAgICAgIFB5VHVwbGVfU2V0SXRlbSh2LCAxLCBta25ld3Nob3J0b2JqZWN0KGFyZzIpKTsKKyAgICAgIFB5VHVwbGVfU2V0SXRlbSh2LCAyLCBta25ld3Nob3J0b2JqZWN0KGFyZzMpKTsKKyAgICAgIFB5VHVwbGVfU2V0SXRlbSh2LCAzLCBta25ld3Nob3J0b2JqZWN0KGFyZzQpKTsKKyAgICAgIHJldHVybiB2OworICAgIH0KIH0KIAogLyogdm9pZCBnZXRncG9zIGZsb2F0IHIgZmxvYXQgciBmbG9hdCByIGZsb2F0IHIgKi8KQEAgLTU2NDIsMTkgKzU2NDIsMTkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9nZXRncG9zKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlmbG9hdCBhcmcxIDsKLQlmbG9hdCBhcmcyIDsKLQlmbG9hdCBhcmczIDsKLQlmbG9hdCBhcmc0IDsKLQlnZXRncG9zKCAmIGFyZzEgLCAmIGFyZzIgLCAmIGFyZzMgLCAmIGFyZzQgKTsKLQl7IFB5T2JqZWN0ICp2ID0gUHlUdXBsZV9OZXcoIDQgKTsKLQkgIGlmICh2ID09IE5VTEwpIHJldHVybiBOVUxMOwotCSAgUHlUdXBsZV9TZXRJdGVtKHYsIDAsIG1rbmV3ZmxvYXRvYmplY3QoYXJnMSkpOwotCSAgUHlUdXBsZV9TZXRJdGVtKHYsIDEsIG1rbmV3ZmxvYXRvYmplY3QoYXJnMikpOwotCSAgUHlUdXBsZV9TZXRJdGVtKHYsIDIsIG1rbmV3ZmxvYXRvYmplY3QoYXJnMykpOwotCSAgUHlUdXBsZV9TZXRJdGVtKHYsIDMsIG1rbmV3ZmxvYXRvYmplY3QoYXJnNCkpOwotCSAgcmV0dXJuIHY7Ci0JfQorICAgIGZsb2F0IGFyZzEgOworICAgIGZsb2F0IGFyZzIgOworICAgIGZsb2F0IGFyZzMgOworICAgIGZsb2F0IGFyZzQgOworICAgIGdldGdwb3MoICYgYXJnMSAsICYgYXJnMiAsICYgYXJnMyAsICYgYXJnNCApOworICAgIHsgUHlPYmplY3QgKnYgPSBQeVR1cGxlX05ldyggNCApOworICAgICAgaWYgKHYgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgICBQeVR1cGxlX1NldEl0ZW0odiwgMCwgbWtuZXdmbG9hdG9iamVjdChhcmcxKSk7CisgICAgICBQeVR1cGxlX1NldEl0ZW0odiwgMSwgbWtuZXdmbG9hdG9iamVjdChhcmcyKSk7CisgICAgICBQeVR1cGxlX1NldEl0ZW0odiwgMiwgbWtuZXdmbG9hdG9iamVjdChhcmczKSk7CisgICAgICBQeVR1cGxlX1NldEl0ZW0odiwgMywgbWtuZXdmbG9hdG9iamVjdChhcmc0KSk7CisgICAgICByZXR1cm4gdjsKKyAgICB9CiB9CiAKIC8qIHZvaWQgd2lucG9zaXRpb24gbG9uZyBzIGxvbmcgcyBsb25nIHMgbG9uZyBzICovCkBAIC01NjYyLDIxICs1NjYyLDIxIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfd2lucG9zaXRpb24oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JbG9uZyBhcmcyIDsKLQlsb25nIGFyZzMgOwotCWxvbmcgYXJnNCA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCA0LCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgNCwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDQsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCA0LCAzLCAmYXJnNCkpCi0JCXJldHVybiBOVUxMOwotCXdpbnBvc2l0aW9uKCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgbG9uZyBhcmcyIDsKKyAgICBsb25nIGFyZzMgOworICAgIGxvbmcgYXJnNCA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCA0LCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgNCwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDQsIDIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCA0LCAzLCAmYXJnNCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHdpbnBvc2l0aW9uKCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGdSR0Jjb2xvciBzaG9ydCByIHNob3J0IHIgc2hvcnQgciAqLwpAQCAtNTY4NCwxNyArNTY4NCwxNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2dSR0Jjb2xvcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0Jc2hvcnQgYXJnMiA7Ci0Jc2hvcnQgYXJnMyA7Ci0JZ1JHQmNvbG9yKCAmIGFyZzEgLCAmIGFyZzIgLCAmIGFyZzMgKTsKLQl7IFB5T2JqZWN0ICp2ID0gUHlUdXBsZV9OZXcoIDMgKTsKLQkgIGlmICh2ID09IE5VTEwpIHJldHVybiBOVUxMOwotCSAgUHlUdXBsZV9TZXRJdGVtKHYsIDAsIG1rbmV3c2hvcnRvYmplY3QoYXJnMSkpOwotCSAgUHlUdXBsZV9TZXRJdGVtKHYsIDEsIG1rbmV3c2hvcnRvYmplY3QoYXJnMikpOwotCSAgUHlUdXBsZV9TZXRJdGVtKHYsIDIsIG1rbmV3c2hvcnRvYmplY3QoYXJnMykpOwotCSAgcmV0dXJuIHY7Ci0JfQorICAgIHNob3J0IGFyZzEgOworICAgIHNob3J0IGFyZzIgOworICAgIHNob3J0IGFyZzMgOworICAgIGdSR0Jjb2xvciggJiBhcmcxICwgJiBhcmcyICwgJiBhcmczICk7CisgICAgeyBQeU9iamVjdCAqdiA9IFB5VHVwbGVfTmV3KCAzICk7CisgICAgICBpZiAodiA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAgIFB5VHVwbGVfU2V0SXRlbSh2LCAwLCBta25ld3Nob3J0b2JqZWN0KGFyZzEpKTsKKyAgICAgIFB5VHVwbGVfU2V0SXRlbSh2LCAxLCBta25ld3Nob3J0b2JqZWN0KGFyZzIpKTsKKyAgICAgIFB5VHVwbGVfU2V0SXRlbSh2LCAyLCBta25ld3Nob3J0b2JqZWN0KGFyZzMpKTsKKyAgICAgIHJldHVybiB2OworICAgIH0KIH0KIAogLyogdm9pZCBnUkdCbWFzayBzaG9ydCByIHNob3J0IHIgc2hvcnQgciAqLwpAQCAtNTcwMiwxNyArNTcwMiwxNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2dSR0JtYXNrKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlzaG9ydCBhcmcyIDsKLQlzaG9ydCBhcmczIDsKLQlnUkdCbWFzayggJiBhcmcxICwgJiBhcmcyICwgJiBhcmczICk7Ci0JeyBQeU9iamVjdCAqdiA9IFB5VHVwbGVfTmV3KCAzICk7Ci0JICBpZiAodiA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkgIFB5VHVwbGVfU2V0SXRlbSh2LCAwLCBta25ld3Nob3J0b2JqZWN0KGFyZzEpKTsKLQkgIFB5VHVwbGVfU2V0SXRlbSh2LCAxLCBta25ld3Nob3J0b2JqZWN0KGFyZzIpKTsKLQkgIFB5VHVwbGVfU2V0SXRlbSh2LCAyLCBta25ld3Nob3J0b2JqZWN0KGFyZzMpKTsKLQkgIHJldHVybiB2OwotCX0KKyAgICBzaG9ydCBhcmcxIDsKKyAgICBzaG9ydCBhcmcyIDsKKyAgICBzaG9ydCBhcmczIDsKKyAgICBnUkdCbWFzayggJiBhcmcxICwgJiBhcmcyICwgJiBhcmczICk7CisgICAgeyBQeU9iamVjdCAqdiA9IFB5VHVwbGVfTmV3KCAzICk7CisgICAgICBpZiAodiA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAgIFB5VHVwbGVfU2V0SXRlbSh2LCAwLCBta25ld3Nob3J0b2JqZWN0KGFyZzEpKTsKKyAgICAgIFB5VHVwbGVfU2V0SXRlbSh2LCAxLCBta25ld3Nob3J0b2JqZWN0KGFyZzIpKTsKKyAgICAgIFB5VHVwbGVfU2V0SXRlbSh2LCAyLCBta25ld3Nob3J0b2JqZWN0KGFyZzMpKTsKKyAgICAgIHJldHVybiB2OworICAgIH0KIH0KIAogLyogdm9pZCBnZXRzY3JtYXNrIHNob3J0IHIgc2hvcnQgciBzaG9ydCByIHNob3J0IHIgKi8KQEAgLTU3MjAsMTkgKzU3MjAsMTkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9nZXRzY3JtYXNrKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlzaG9ydCBhcmcyIDsKLQlzaG9ydCBhcmczIDsKLQlzaG9ydCBhcmc0IDsKLQlnZXRzY3JtYXNrKCAmIGFyZzEgLCAmIGFyZzIgLCAmIGFyZzMgLCAmIGFyZzQgKTsKLQl7IFB5T2JqZWN0ICp2ID0gUHlUdXBsZV9OZXcoIDQgKTsKLQkgIGlmICh2ID09IE5VTEwpIHJldHVybiBOVUxMOwotCSAgUHlUdXBsZV9TZXRJdGVtKHYsIDAsIG1rbmV3c2hvcnRvYmplY3QoYXJnMSkpOwotCSAgUHlUdXBsZV9TZXRJdGVtKHYsIDEsIG1rbmV3c2hvcnRvYmplY3QoYXJnMikpOwotCSAgUHlUdXBsZV9TZXRJdGVtKHYsIDIsIG1rbmV3c2hvcnRvYmplY3QoYXJnMykpOwotCSAgUHlUdXBsZV9TZXRJdGVtKHYsIDMsIG1rbmV3c2hvcnRvYmplY3QoYXJnNCkpOwotCSAgcmV0dXJuIHY7Ci0JfQorICAgIHNob3J0IGFyZzEgOworICAgIHNob3J0IGFyZzIgOworICAgIHNob3J0IGFyZzMgOworICAgIHNob3J0IGFyZzQgOworICAgIGdldHNjcm1hc2soICYgYXJnMSAsICYgYXJnMiAsICYgYXJnMyAsICYgYXJnNCApOworICAgIHsgUHlPYmplY3QgKnYgPSBQeVR1cGxlX05ldyggNCApOworICAgICAgaWYgKHYgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgICBQeVR1cGxlX1NldEl0ZW0odiwgMCwgbWtuZXdzaG9ydG9iamVjdChhcmcxKSk7CisgICAgICBQeVR1cGxlX1NldEl0ZW0odiwgMSwgbWtuZXdzaG9ydG9iamVjdChhcmcyKSk7CisgICAgICBQeVR1cGxlX1NldEl0ZW0odiwgMiwgbWtuZXdzaG9ydG9iamVjdChhcmczKSk7CisgICAgICBQeVR1cGxlX1NldEl0ZW0odiwgMywgbWtuZXdzaG9ydG9iamVjdChhcmc0KSk7CisgICAgICByZXR1cm4gdjsKKyAgICB9CiB9CiAKIC8qIHZvaWQgZ2V0bWNvbG9yIHNob3J0IHMgc2hvcnQgciBzaG9ydCByIHNob3J0IHIgKi8KQEAgLTU3NDAsMjAgKzU3NDAsMjAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9nZXRtY29sb3IoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCXNob3J0IGFyZzIgOwotCXNob3J0IGFyZzMgOwotCXNob3J0IGFyZzQgOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZ2V0bWNvbG9yKCBhcmcxICwgJiBhcmcyICwgJiBhcmczICwgJiBhcmc0ICk7Ci0JeyBQeU9iamVjdCAqdiA9IFB5VHVwbGVfTmV3KCAzICk7Ci0JICBpZiAodiA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkgIFB5VHVwbGVfU2V0SXRlbSh2LCAwLCBta25ld3Nob3J0b2JqZWN0KGFyZzIpKTsKLQkgIFB5VHVwbGVfU2V0SXRlbSh2LCAxLCBta25ld3Nob3J0b2JqZWN0KGFyZzMpKTsKLQkgIFB5VHVwbGVfU2V0SXRlbSh2LCAyLCBta25ld3Nob3J0b2JqZWN0KGFyZzQpKTsKLQkgIHJldHVybiB2OwotCX0KKyAgICBzaG9ydCBhcmcxIDsKKyAgICBzaG9ydCBhcmcyIDsKKyAgICBzaG9ydCBhcmczIDsKKyAgICBzaG9ydCBhcmc0IDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGdldG1jb2xvciggYXJnMSAsICYgYXJnMiAsICYgYXJnMyAsICYgYXJnNCApOworICAgIHsgUHlPYmplY3QgKnYgPSBQeVR1cGxlX05ldyggMyApOworICAgICAgaWYgKHYgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgICBQeVR1cGxlX1NldEl0ZW0odiwgMCwgbWtuZXdzaG9ydG9iamVjdChhcmcyKSk7CisgICAgICBQeVR1cGxlX1NldEl0ZW0odiwgMSwgbWtuZXdzaG9ydG9iamVjdChhcmczKSk7CisgICAgICBQeVR1cGxlX1NldEl0ZW0odiwgMiwgbWtuZXdzaG9ydG9iamVjdChhcmc0KSk7CisgICAgICByZXR1cm4gdjsKKyAgICB9CiB9CiAKIC8qIHZvaWQgbWFwdyBsb25nIHMgc2hvcnQgcyBzaG9ydCBzIGZsb2F0IHIgZmxvYXQgciBmbG9hdCByIGZsb2F0IHIgZmxvYXQgciBmbG9hdCByICovCkBAIC01NzYxLDMyICs1NzYxLDMyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfbWFwdyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlzaG9ydCBhcmcyIDsKLQlzaG9ydCBhcmczIDsKLQlmbG9hdCBhcmc0IDsKLQlmbG9hdCBhcmc1IDsKLQlmbG9hdCBhcmc2IDsKLQlmbG9hdCBhcmc3IDsKLQlmbG9hdCBhcmc4IDsKLQlmbG9hdCBhcmc5IDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCW1hcHcoIGFyZzEgLCBhcmcyICwgYXJnMyAsICYgYXJnNCAsICYgYXJnNSAsICYgYXJnNiAsICYgYXJnNyAsICYgYXJnOCAsICYgYXJnOSApOwotCXsgUHlPYmplY3QgKnYgPSBQeVR1cGxlX05ldyggNiApOwotCSAgaWYgKHYgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JICBQeVR1cGxlX1NldEl0ZW0odiwgMCwgbWtuZXdmbG9hdG9iamVjdChhcmc0KSk7Ci0JICBQeVR1cGxlX1NldEl0ZW0odiwgMSwgbWtuZXdmbG9hdG9iamVjdChhcmc1KSk7Ci0JICBQeVR1cGxlX1NldEl0ZW0odiwgMiwgbWtuZXdmbG9hdG9iamVjdChhcmc2KSk7Ci0JICBQeVR1cGxlX1NldEl0ZW0odiwgMywgbWtuZXdmbG9hdG9iamVjdChhcmc3KSk7Ci0JICBQeVR1cGxlX1NldEl0ZW0odiwgNCwgbWtuZXdmbG9hdG9iamVjdChhcmc4KSk7Ci0JICBQeVR1cGxlX1NldEl0ZW0odiwgNSwgbWtuZXdmbG9hdG9iamVjdChhcmc5KSk7Ci0JICByZXR1cm4gdjsKLQl9CisgICAgbG9uZyBhcmcxIDsKKyAgICBzaG9ydCBhcmcyIDsKKyAgICBzaG9ydCBhcmczIDsKKyAgICBmbG9hdCBhcmc0IDsKKyAgICBmbG9hdCBhcmc1IDsKKyAgICBmbG9hdCBhcmc2IDsKKyAgICBmbG9hdCBhcmc3IDsKKyAgICBmbG9hdCBhcmc4IDsKKyAgICBmbG9hdCBhcmc5IDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG1hcHcoIGFyZzEgLCBhcmcyICwgYXJnMyAsICYgYXJnNCAsICYgYXJnNSAsICYgYXJnNiAsICYgYXJnNyAsICYgYXJnOCAsICYgYXJnOSApOworICAgIHsgUHlPYmplY3QgKnYgPSBQeVR1cGxlX05ldyggNiApOworICAgICAgaWYgKHYgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgICBQeVR1cGxlX1NldEl0ZW0odiwgMCwgbWtuZXdmbG9hdG9iamVjdChhcmc0KSk7CisgICAgICBQeVR1cGxlX1NldEl0ZW0odiwgMSwgbWtuZXdmbG9hdG9iamVjdChhcmc1KSk7CisgICAgICBQeVR1cGxlX1NldEl0ZW0odiwgMiwgbWtuZXdmbG9hdG9iamVjdChhcmc2KSk7CisgICAgICBQeVR1cGxlX1NldEl0ZW0odiwgMywgbWtuZXdmbG9hdG9iamVjdChhcmc3KSk7CisgICAgICBQeVR1cGxlX1NldEl0ZW0odiwgNCwgbWtuZXdmbG9hdG9iamVjdChhcmc4KSk7CisgICAgICBQeVR1cGxlX1NldEl0ZW0odiwgNSwgbWtuZXdmbG9hdG9iamVjdChhcmc5KSk7CisgICAgICByZXR1cm4gdjsKKyAgICB9CiB9CiAKIC8qIHZvaWQgbWFwdzIgbG9uZyBzIHNob3J0IHMgc2hvcnQgcyBmbG9hdCByIGZsb2F0IHIgKi8KQEAgLTU3OTQsMjQgKzU3OTQsMjQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9tYXB3MihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlzaG9ydCBhcmcyIDsKLQlzaG9ydCBhcmczIDsKLQlmbG9hdCBhcmc0IDsKLQlmbG9hdCBhcmc1IDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCW1hcHcyKCBhcmcxICwgYXJnMiAsIGFyZzMgLCAmIGFyZzQgLCAmIGFyZzUgKTsKLQl7IFB5T2JqZWN0ICp2ID0gUHlUdXBsZV9OZXcoIDIgKTsKLQkgIGlmICh2ID09IE5VTEwpIHJldHVybiBOVUxMOwotCSAgUHlUdXBsZV9TZXRJdGVtKHYsIDAsIG1rbmV3ZmxvYXRvYmplY3QoYXJnNCkpOwotCSAgUHlUdXBsZV9TZXRJdGVtKHYsIDEsIG1rbmV3ZmxvYXRvYmplY3QoYXJnNSkpOwotCSAgcmV0dXJuIHY7Ci0JfQorICAgIGxvbmcgYXJnMSA7CisgICAgc2hvcnQgYXJnMiA7CisgICAgc2hvcnQgYXJnMyA7CisgICAgZmxvYXQgYXJnNCA7CisgICAgZmxvYXQgYXJnNSA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBtYXB3MiggYXJnMSAsIGFyZzIgLCBhcmczICwgJiBhcmc0ICwgJiBhcmc1ICk7CisgICAgeyBQeU9iamVjdCAqdiA9IFB5VHVwbGVfTmV3KCAyICk7CisgICAgICBpZiAodiA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAgIFB5VHVwbGVfU2V0SXRlbSh2LCAwLCBta25ld2Zsb2F0b2JqZWN0KGFyZzQpKTsKKyAgICAgIFB5VHVwbGVfU2V0SXRlbSh2LCAxLCBta25ld2Zsb2F0b2JqZWN0KGFyZzUpKTsKKyAgICAgIHJldHVybiB2OworICAgIH0KIH0KIAogLyogdm9pZCBnZXRjdXJzb3Igc2hvcnQgciB1X3Nob3J0IHIgdV9zaG9ydCByIGxvbmcgciAqLwpAQCAtNTgxOSwxOSArNTgxOSwxOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2dldGN1cnNvcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0JdW5zaWduZWQgc2hvcnQgYXJnMiA7Ci0JdW5zaWduZWQgc2hvcnQgYXJnMyA7Ci0JbG9uZyBhcmc0IDsKLQlnZXRjdXJzb3IoICYgYXJnMSAsICYgYXJnMiAsICYgYXJnMyAsICYgYXJnNCApOwotCXsgUHlPYmplY3QgKnYgPSBQeVR1cGxlX05ldyggNCApOwotCSAgaWYgKHYgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JICBQeVR1cGxlX1NldEl0ZW0odiwgMCwgbWtuZXdzaG9ydG9iamVjdChhcmcxKSk7Ci0JICBQeVR1cGxlX1NldEl0ZW0odiwgMSwgbWtuZXdzaG9ydG9iamVjdCgoc2hvcnQpIGFyZzIpKTsKLQkgIFB5VHVwbGVfU2V0SXRlbSh2LCAyLCBta25ld3Nob3J0b2JqZWN0KChzaG9ydCkgYXJnMykpOwotCSAgUHlUdXBsZV9TZXRJdGVtKHYsIDMsIG1rbmV3bG9uZ29iamVjdChhcmc0KSk7Ci0JICByZXR1cm4gdjsKLQl9CisgICAgc2hvcnQgYXJnMSA7CisgICAgdW5zaWduZWQgc2hvcnQgYXJnMiA7CisgICAgdW5zaWduZWQgc2hvcnQgYXJnMyA7CisgICAgbG9uZyBhcmc0IDsKKyAgICBnZXRjdXJzb3IoICYgYXJnMSAsICYgYXJnMiAsICYgYXJnMyAsICYgYXJnNCApOworICAgIHsgUHlPYmplY3QgKnYgPSBQeVR1cGxlX05ldyggNCApOworICAgICAgaWYgKHYgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgICBQeVR1cGxlX1NldEl0ZW0odiwgMCwgbWtuZXdzaG9ydG9iamVjdChhcmcxKSk7CisgICAgICBQeVR1cGxlX1NldEl0ZW0odiwgMSwgbWtuZXdzaG9ydG9iamVjdCgoc2hvcnQpIGFyZzIpKTsKKyAgICAgIFB5VHVwbGVfU2V0SXRlbSh2LCAyLCBta25ld3Nob3J0b2JqZWN0KChzaG9ydCkgYXJnMykpOworICAgICAgUHlUdXBsZV9TZXRJdGVtKHYsIDMsIG1rbmV3bG9uZ29iamVjdChhcmc0KSk7CisgICAgICByZXR1cm4gdjsKKyAgICB9CiB9CiAKIC8qIHZvaWQgY21vZGUgKi8KQEAgLTU4MzksOSArNTgzOSw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfY21vZGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNtb2RlKCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBjbW9kZSggKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgY29uY2F2ZSBsb25nIHMgKi8KQEAgLTU4NDksMTIgKzU4NDksMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9jb25jYXZlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQljb25jYXZlKCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGNvbmNhdmUoIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgY3Vyc3R5cGUgbG9uZyBzICovCkBAIC01ODYyLDEyICs1ODYyLDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfY3Vyc3R5cGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWN1cnN0eXBlKCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGN1cnN0eXBlKCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGRyYXdtb2RlIGxvbmcgcyAqLwpAQCAtNTg3NSwxMiArNTg3NSwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2RyYXdtb2RlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlkcmF3bW9kZSggYXJnMSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBkcmF3bW9kZSggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBnYW1tYXJhbXAgc2hvcnQgc1syNTZdIHNob3J0IHNbMjU2XSBzaG9ydCBzWzI1Nl0gKi8KQEAgLTU4ODgsMTggKzU4ODgsMTggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9nYW1tYXJhbXAoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgWyAyNTYgXSA7Ci0Jc2hvcnQgYXJnMiBbIDI1NiBdIDsKLQlzaG9ydCBhcmczIFsgMjU2IF0gOwotCWlmICghZ2V0aXNob3J0YXJyYXkoYXJncywgMywgMCwgMjU2ICwgYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJyYXkoYXJncywgMywgMSwgMjU2ICwgYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJyYXkoYXJncywgMywgMiwgMjU2ICwgYXJnMykpCi0JCXJldHVybiBOVUxMOwotCWdhbW1hcmFtcCggYXJnMSAsIGFyZzIgLCBhcmczICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgWyAyNTYgXSA7CisgICAgc2hvcnQgYXJnMiBbIDI1NiBdIDsKKyAgICBzaG9ydCBhcmczIFsgMjU2IF0gOworICAgIGlmICghZ2V0aXNob3J0YXJyYXkoYXJncywgMywgMCwgMjU2ICwgYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJyYXkoYXJncywgMywgMSwgMjU2ICwgYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJyYXkoYXJncywgMywgMiwgMjU2ICwgYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGdhbW1hcmFtcCggYXJnMSAsIGFyZzIgLCBhcmczICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiBsb25nIGdldGJhY2tmYWNlICovCkBAIC01OTA3LDkgKzU5MDcsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2dldGJhY2tmYWNlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIHJldHZhbDsKLQlyZXR2YWwgPSBnZXRiYWNrZmFjZSggKTsKLQlyZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CisgICAgbG9uZyByZXR2YWw7CisgICAgcmV0dmFsID0gZ2V0YmFja2ZhY2UoICk7CisgICAgcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOwogfQogCiAvKiBsb25nIGdldGRlc2NlbmRlciAqLwpAQCAtNTkxNyw5ICs1OTE3LDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9nZXRkZXNjZW5kZXIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgcmV0dmFsOwotCXJldHZhbCA9IGdldGRlc2NlbmRlciggKTsKLQlyZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CisgICAgbG9uZyByZXR2YWw7CisgICAgcmV0dmFsID0gZ2V0ZGVzY2VuZGVyKCApOworICAgIHJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKIH0KIAogLyogbG9uZyBnZXRkcmF3bW9kZSAqLwpAQCAtNTkyNyw5ICs1OTI3LDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9nZXRkcmF3bW9kZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyByZXR2YWw7Ci0JcmV0dmFsID0gZ2V0ZHJhd21vZGUoICk7Ci0JcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOworICAgIGxvbmcgcmV0dmFsOworICAgIHJldHZhbCA9IGdldGRyYXdtb2RlKCApOworICAgIHJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKIH0KIAogLyogbG9uZyBnZXRtbW9kZSAqLwpAQCAtNTkzNyw5ICs1OTM3LDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9nZXRtbW9kZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyByZXR2YWw7Ci0JcmV0dmFsID0gZ2V0bW1vZGUoICk7Ci0JcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOworICAgIGxvbmcgcmV0dmFsOworICAgIHJldHZhbCA9IGdldG1tb2RlKCApOworICAgIHJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKIH0KIAogLyogbG9uZyBnZXRzbSAqLwpAQCAtNTk0Nyw5ICs1OTQ3LDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9nZXRzbShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyByZXR2YWw7Ci0JcmV0dmFsID0gZ2V0c20oICk7Ci0JcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOworICAgIGxvbmcgcmV0dmFsOworICAgIHJldHZhbCA9IGdldHNtKCApOworICAgIHJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKIH0KIAogLyogbG9uZyBnZXR2aWRlbyBsb25nIHMgKi8KQEAgLTU5NTcsMTIgKzU5NTcsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9nZXR2aWRlbyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyByZXR2YWw7Ci0JbG9uZyBhcmcxIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dmFsID0gZ2V0dmlkZW8oIGFyZzEgKTsKLQlyZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CisgICAgbG9uZyByZXR2YWw7CisgICAgbG9uZyBhcmcxIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dmFsID0gZ2V0dmlkZW8oIGFyZzEgKTsKKyAgICByZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CiB9CiAKIC8qIHZvaWQgaW1ha2ViYWNrZ3JvdW5kICovCkBAIC01OTcwLDkgKzU5NzAsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2ltYWtlYmFja2dyb3VuZChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW1ha2ViYWNrZ3JvdW5kKCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpbWFrZWJhY2tncm91bmQoICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGxtYmluZCBzaG9ydCBzIHNob3J0IHMgKi8KQEAgLTU5ODAsMTUgKzU5ODAsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9sbWJpbmQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCXNob3J0IGFyZzIgOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMiwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlsbWJpbmQoIGFyZzEgLCBhcmcyICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgOworICAgIHNob3J0IGFyZzIgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMiwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBsbWJpbmQoIGFyZzEgLCBhcmcyICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGxtZGVmIGxvbmcgcyBsb25nIHMgbG9uZyBzIGZsb2F0IHNbYXJnM10gKi8KQEAgLTU5OTYsMjQgKzU5OTYsMjQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9sbWRlZihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlsb25nIGFyZzIgOwotCWxvbmcgYXJnMyA7Ci0JZmxvYXQgKiBhcmc0IDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcnJheXNpemUoYXJncywgMywgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoKGFyZzQgPSBQeU1lbV9ORVcoZmxvYXQgLCBhcmczICkpID09IE5VTEwpCi0JCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCWlmICghZ2V0aWZsb2F0YXJyYXkoYXJncywgMywgMiwgYXJnMyAsIGFyZzQpKQotCQlyZXR1cm4gTlVMTDsKLQlsbWRlZiggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCApOwotCVB5TWVtX0RFTChhcmc0KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBsb25nIGFyZzIgOworICAgIGxvbmcgYXJnMyA7CisgICAgZmxvYXQgKiBhcmc0IDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcnJheXNpemUoYXJncywgMywgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoKGFyZzQgPSBQeU1lbV9ORVcoZmxvYXQgLCBhcmczICkpID09IE5VTEwpCisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIGlmICghZ2V0aWZsb2F0YXJyYXkoYXJncywgMywgMiwgYXJnMyAsIGFyZzQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBsbWRlZiggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCApOworICAgIFB5TWVtX0RFTChhcmc0KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgbW1vZGUgbG9uZyBzICovCkBAIC02MDIxLDEyICs2MDIxLDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfbW1vZGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCW1tb2RlKCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG1tb2RlKCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIG5vcm1hbCBmbG9hdCBzWzNdICovCkBAIC02MDM0LDEyICs2MDM0LDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfbm9ybWFsKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlmbG9hdCBhcmcxIFsgMyBdIDsKLQlpZiAoIWdldGlmbG9hdGFycmF5KGFyZ3MsIDEsIDAsIDMgLCBhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0Jbm9ybWFsKCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGZsb2F0IGFyZzEgWyAzIF0gOworICAgIGlmICghZ2V0aWZsb2F0YXJyYXkoYXJncywgMSwgMCwgMyAsIGFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBub3JtYWwoIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgb3ZlcmxheSBsb25nIHMgKi8KQEAgLTYwNDcsMTIgKzYwNDcsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9vdmVybGF5KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlvdmVybGF5KCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG92ZXJsYXkoIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgUkdCcmFuZ2Ugc2hvcnQgcyBzaG9ydCBzIHNob3J0IHMgc2hvcnQgcyBzaG9ydCBzIHNob3J0IHMgc2hvcnQgcyBzaG9ydCBzICovCkBAIC02MDYwLDMzICs2MDYwLDMzIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfUkdCcmFuZ2UoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCXNob3J0IGFyZzIgOwotCXNob3J0IGFyZzMgOwotCXNob3J0IGFyZzQgOwotCXNob3J0IGFyZzUgOwotCXNob3J0IGFyZzYgOwotCXNob3J0IGFyZzcgOwotCXNob3J0IGFyZzggOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDgsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgOCwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA4LCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDgsIDMsICZhcmc0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgOCwgNCwgJmFyZzUpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA4LCA1LCAmYXJnNikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDgsIDYsICZhcmc3KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgOCwgNywgJmFyZzgpKQotCQlyZXR1cm4gTlVMTDsKLQlSR0JyYW5nZSggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCAsIGFyZzUgLCBhcmc2ICwgYXJnNyAsIGFyZzggKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSA7CisgICAgc2hvcnQgYXJnMiA7CisgICAgc2hvcnQgYXJnMyA7CisgICAgc2hvcnQgYXJnNCA7CisgICAgc2hvcnQgYXJnNSA7CisgICAgc2hvcnQgYXJnNiA7CisgICAgc2hvcnQgYXJnNyA7CisgICAgc2hvcnQgYXJnOCA7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgOCwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA4LCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDgsIDIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgOCwgMywgJmFyZzQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA4LCA0LCAmYXJnNSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDgsIDUsICZhcmc2KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgOCwgNiwgJmFyZzcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA4LCA3LCAmYXJnOCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFJHQnJhbmdlKCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICwgYXJnNSAsIGFyZzYgLCBhcmc3ICwgYXJnOCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBzZXR2aWRlbyBsb25nIHMgbG9uZyBzICovCkBAIC02MDk0LDE1ICs2MDk0LDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfc2V0dmlkZW8oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JbG9uZyBhcmcyIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCXNldHZpZGVvKCBhcmcxICwgYXJnMiApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGxvbmcgYXJnMiA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBzZXR2aWRlbyggYXJnMSAsIGFyZzIgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgc2hhZGVtb2RlbCBsb25nIHMgKi8KQEAgLTYxMTAsMTIgKzYxMTAsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9zaGFkZW1vZGVsKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlzaGFkZW1vZGVsKCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHNoYWRlbW9kZWwoIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgdW5kZXJsYXkgbG9uZyBzICovCkBAIC02MTIzLDEyICs2MTIzLDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfdW5kZXJsYXkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCXVuZGVybGF5KCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHVuZGVybGF5KCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGJnbmNsb3NlZGxpbmUgKi8KQEAgLTYxMzYsOSArNjEzNiw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfYmduY2xvc2VkbGluZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JYmduY2xvc2VkbGluZSggKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgYmduY2xvc2VkbGluZSggKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgYmdubGluZSAqLwpAQCAtNjE0Niw5ICs2MTQ2LDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9iZ25saW5lKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQliZ25saW5lKCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBiZ25saW5lKCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBiZ25wb2ludCAqLwpAQCAtNjE1Niw5ICs2MTU2LDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9iZ25wb2ludChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JYmducG9pbnQoICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGJnbnBvaW50KCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBiZ25wb2x5Z29uICovCkBAIC02MTY2LDkgKzYxNjYsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2JnbnBvbHlnb24oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWJnbnBvbHlnb24oICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGJnbnBvbHlnb24oICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGJnbnN1cmZhY2UgKi8KQEAgLTYxNzYsOSArNjE3Niw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfYmduc3VyZmFjZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JYmduc3VyZmFjZSggKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgYmduc3VyZmFjZSggKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgYmdudG1lc2ggKi8KQEAgLTYxODYsOSArNjE4Niw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfYmdudG1lc2goUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWJnbnRtZXNoKCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBiZ250bWVzaCggKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgYmdudHJpbSAqLwpAQCAtNjE5Niw5ICs2MTk2LDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9iZ250cmltKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQliZ250cmltKCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBiZ250cmltKCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBlbmRjbG9zZWRsaW5lICovCkBAIC02MjA2LDkgKzYyMDYsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2VuZGNsb3NlZGxpbmUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWVuZGNsb3NlZGxpbmUoICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGVuZGNsb3NlZGxpbmUoICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGVuZGxpbmUgKi8KQEAgLTYyMTYsOSArNjIxNiw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZW5kbGluZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZW5kbGluZSggKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZW5kbGluZSggKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgZW5kcG9pbnQgKi8KQEAgLTYyMjYsOSArNjIyNiw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZW5kcG9pbnQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWVuZHBvaW50KCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBlbmRwb2ludCggKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgZW5kcG9seWdvbiAqLwpAQCAtNjIzNiw5ICs2MjM2LDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9lbmRwb2x5Z29uKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQllbmRwb2x5Z29uKCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBlbmRwb2x5Z29uKCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBlbmRzdXJmYWNlICovCkBAIC02MjQ2LDkgKzYyNDYsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2VuZHN1cmZhY2UoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWVuZHN1cmZhY2UoICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGVuZHN1cmZhY2UoICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGVuZHRtZXNoICovCkBAIC02MjU2LDkgKzYyNTYsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2VuZHRtZXNoKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQllbmR0bWVzaCggKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZW5kdG1lc2goICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGVuZHRyaW0gKi8KQEAgLTYyNjYsOSArNjI2Niw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZW5kdHJpbShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZW5kdHJpbSggKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZW5kdHJpbSggKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgYmxlbmRmdW5jdGlvbiBsb25nIHMgbG9uZyBzICovCkBAIC02Mjc2LDE1ICs2Mjc2LDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfYmxlbmRmdW5jdGlvbihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlsb25nIGFyZzIgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JYmxlbmRmdW5jdGlvbiggYXJnMSAsIGFyZzIgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBsb25nIGFyZzIgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYmxlbmRmdW5jdGlvbiggYXJnMSAsIGFyZzIgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgYzNmIGZsb2F0IHNbM10gKi8KQEAgLTYyOTIsMTIgKzYyOTIsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9jM2YoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWZsb2F0IGFyZzEgWyAzIF0gOwotCWlmICghZ2V0aWZsb2F0YXJyYXkoYXJncywgMSwgMCwgMyAsIGFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQljM2YoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZmxvYXQgYXJnMSBbIDMgXSA7CisgICAgaWYgKCFnZXRpZmxvYXRhcnJheShhcmdzLCAxLCAwLCAzICwgYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGMzZiggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBjM2kgbG9uZyBzWzNdICovCkBAIC02MzA1LDEyICs2MzA1LDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfYzNpKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgWyAzIF0gOwotCWlmICghZ2V0aWxvbmdhcnJheShhcmdzLCAxLCAwLCAzICwgYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWMzaSggYXJnMSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgWyAzIF0gOworICAgIGlmICghZ2V0aWxvbmdhcnJheShhcmdzLCAxLCAwLCAzICwgYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGMzaSggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBjM3Mgc2hvcnQgc1szXSAqLwpAQCAtNjMxOCwxMiArNjMxOCwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2MzcyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSBbIDMgXSA7Ci0JaWYgKCFnZXRpc2hvcnRhcnJheShhcmdzLCAxLCAwLCAzICwgYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWMzcyggYXJnMSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxIFsgMyBdIDsKKyAgICBpZiAoIWdldGlzaG9ydGFycmF5KGFyZ3MsIDEsIDAsIDMgLCBhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYzNzKCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGM0ZiBmbG9hdCBzWzRdICovCkBAIC02MzMxLDEyICs2MzMxLDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfYzRmKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlmbG9hdCBhcmcxIFsgNCBdIDsKLQlpZiAoIWdldGlmbG9hdGFycmF5KGFyZ3MsIDEsIDAsIDQgLCBhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JYzRmKCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGZsb2F0IGFyZzEgWyA0IF0gOworICAgIGlmICghZ2V0aWZsb2F0YXJyYXkoYXJncywgMSwgMCwgNCAsIGFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBjNGYoIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgYzRpIGxvbmcgc1s0XSAqLwpAQCAtNjM0NCwxMiArNjM0NCwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2M0aShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIFsgNCBdIDsKLQlpZiAoIWdldGlsb25nYXJyYXkoYXJncywgMSwgMCwgNCAsIGFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQljNGkoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIFsgNCBdIDsKKyAgICBpZiAoIWdldGlsb25nYXJyYXkoYXJncywgMSwgMCwgNCAsIGFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBjNGkoIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgYzRzIHNob3J0IHNbNF0gKi8KQEAgLTYzNTcsMTIgKzYzNTcsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9jNHMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgWyA0IF0gOwotCWlmICghZ2V0aXNob3J0YXJyYXkoYXJncywgMSwgMCwgNCAsIGFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQljNHMoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSBbIDQgXSA7CisgICAgaWYgKCFnZXRpc2hvcnRhcnJheShhcmdzLCAxLCAwLCA0ICwgYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGM0cyggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBjb2xvcmYgZmxvYXQgcyAqLwpAQCAtNjM3MCwxMiArNjM3MCwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2NvbG9yZihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZmxvYXQgYXJnMSA7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQljb2xvcmYoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZmxvYXQgYXJnMSA7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBjb2xvcmYoIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgY3BhY2sgbG9uZyBzICovCkBAIC02MzgzLDEyICs2MzgzLDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfY3BhY2soUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWNwYWNrKCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGNwYWNrKCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGN6Y2xlYXIgbG9uZyBzIGxvbmcgcyAqLwpAQCAtNjM5NiwxNSArNjM5NiwxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2N6Y2xlYXIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JbG9uZyBhcmcyIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWN6Y2xlYXIoIGFyZzEgLCBhcmcyICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgbG9uZyBhcmcyIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGN6Y2xlYXIoIGFyZzEgLCBhcmcyICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGRnbGNsb3NlIGxvbmcgcyAqLwpAQCAtNjQxMiwxMiArNjQxMiwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2RnbGNsb3NlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlkZ2xjbG9zZSggYXJnMSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBkZ2xjbG9zZSggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogbG9uZyBkZ2xvcGVuIGNoYXIgKnMgbG9uZyBzICovCkBAIC02NDI1LDE1ICs2NDI1LDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZGdsb3BlbihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyByZXR2YWw7Ci0Jc3RyaW5nIGFyZzEgOwotCWxvbmcgYXJnMiA7Ci0JaWYgKCFnZXRpc3RyaW5nYXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCXJldHZhbCA9IGRnbG9wZW4oIGFyZzEgLCBhcmcyICk7Ci0JcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOworICAgIGxvbmcgcmV0dmFsOworICAgIHN0cmluZyBhcmcxIDsKKyAgICBsb25nIGFyZzIgOworICAgIGlmICghZ2V0aXN0cmluZ2FyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR2YWwgPSBkZ2xvcGVuKCBhcmcxICwgYXJnMiApOworICAgIHJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKIH0KIAogLyogbG9uZyBnZXRnZGVzYyBsb25nIHMgKi8KQEAgLTY0NDEsMTIgKzY0NDEsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9nZXRnZGVzYyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyByZXR2YWw7Ci0JbG9uZyBhcmcxIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dmFsID0gZ2V0Z2Rlc2MoIGFyZzEgKTsKLQlyZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CisgICAgbG9uZyByZXR2YWw7CisgICAgbG9uZyBhcmcxIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dmFsID0gZ2V0Z2Rlc2MoIGFyZzEgKTsKKyAgICByZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CiB9CiAKIC8qIHZvaWQgZ2V0bnVyYnNwcm9wZXJ0eSBsb25nIHMgZmxvYXQgciAqLwpAQCAtNjQ1NCwxMiArNjQ1NCwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2dldG51cmJzcHJvcGVydHkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JZmxvYXQgYXJnMiA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWdldG51cmJzcHJvcGVydHkoIGFyZzEgLCAmIGFyZzIgKTsKLQlyZXR1cm4gbWtuZXdmbG9hdG9iamVjdChhcmcyKTsKKyAgICBsb25nIGFyZzEgOworICAgIGZsb2F0IGFyZzIgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBnZXRudXJic3Byb3BlcnR5KCBhcmcxICwgJiBhcmcyICk7CisgICAgcmV0dXJuIG1rbmV3ZmxvYXRvYmplY3QoYXJnMik7CiB9CiAKIC8qIHZvaWQgZ2xjb21wYXQgbG9uZyBzIGxvbmcgcyAqLwpAQCAtNjQ2NywxNSArNjQ2NywxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2dsY29tcGF0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWxvbmcgYXJnMiA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlnbGNvbXBhdCggYXJnMSAsIGFyZzIgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBsb25nIGFyZzIgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZ2xjb21wYXQoIGFyZzEgLCBhcmcyICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGljb25zaXplIGxvbmcgcyBsb25nIHMgKi8KQEAgLTY0ODMsMTUgKzY0ODMsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9pY29uc2l6ZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlsb25nIGFyZzIgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWNvbnNpemUoIGFyZzEgLCBhcmcyICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgbG9uZyBhcmcyIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGljb25zaXplKCBhcmcxICwgYXJnMiApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBpY29udGl0bGUgY2hhciAqcyAqLwpAQCAtNjQ5OSwxMiArNjQ5OSwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2ljb250aXRsZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc3RyaW5nIGFyZzEgOwotCWlmICghZ2V0aXN0cmluZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWljb250aXRsZSggYXJnMSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzdHJpbmcgYXJnMSA7CisgICAgaWYgKCFnZXRpc3RyaW5nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWNvbnRpdGxlKCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGxSR0JyYW5nZSBzaG9ydCBzIHNob3J0IHMgc2hvcnQgcyBzaG9ydCBzIHNob3J0IHMgc2hvcnQgcyBsb25nIHMgbG9uZyBzICovCkBAIC02NTEyLDMzICs2NTEyLDMzIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfbFJHQnJhbmdlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlzaG9ydCBhcmcyIDsKLQlzaG9ydCBhcmczIDsKLQlzaG9ydCBhcmc0IDsKLQlzaG9ydCBhcmc1IDsKLQlzaG9ydCBhcmc2IDsKLQlsb25nIGFyZzcgOwotCWxvbmcgYXJnOCA7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgOCwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA4LCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDgsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgOCwgMywgJmFyZzQpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA4LCA0LCAmYXJnNSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDgsIDUsICZhcmc2KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCA4LCA2LCAmYXJnNykpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgOCwgNywgJmFyZzgpKQotCQlyZXR1cm4gTlVMTDsKLQlsUkdCcmFuZ2UoIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgLCBhcmc1ICwgYXJnNiAsIGFyZzcgLCBhcmc4ICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgOworICAgIHNob3J0IGFyZzIgOworICAgIHNob3J0IGFyZzMgOworICAgIHNob3J0IGFyZzQgOworICAgIHNob3J0IGFyZzUgOworICAgIHNob3J0IGFyZzYgOworICAgIGxvbmcgYXJnNyA7CisgICAgbG9uZyBhcmc4IDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA4LCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDgsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgOCwgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA4LCAzLCAmYXJnNCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDgsIDQsICZhcmc1KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgOCwgNSwgJmFyZzYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDgsIDYsICZhcmc3KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCA4LCA3LCAmYXJnOCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGxSR0JyYW5nZSggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCAsIGFyZzUgLCBhcmc2ICwgYXJnNyAsIGFyZzggKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgbGluZXNtb290aCBsb25nIHMgKi8KQEAgLTY1NDYsMTIgKzY1NDYsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9saW5lc21vb3RoKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlsaW5lc21vb3RoKCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGxpbmVzbW9vdGgoIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgbG1jb2xvciBsb25nIHMgKi8KQEAgLTY1NTksMTIgKzY1NTksMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9sbWNvbG9yKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlsbWNvbG9yKCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGxtY29sb3IoIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgbG9naWNvcCBsb25nIHMgKi8KQEAgLTY1NzIsMTIgKzY1NzIsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9sb2dpY29wKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlsb2dpY29wKCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGxvZ2ljb3AoIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgbHNldGRlcHRoIGxvbmcgcyBsb25nIHMgKi8KQEAgLTY1ODUsMTUgKzY1ODUsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9sc2V0ZGVwdGgoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JbG9uZyBhcmcyIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWxzZXRkZXB0aCggYXJnMSAsIGFyZzIgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBsb25nIGFyZzIgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbHNldGRlcHRoKCBhcmcxICwgYXJnMiApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBsc2hhZGVyYW5nZSBzaG9ydCBzIHNob3J0IHMgbG9uZyBzIGxvbmcgcyAqLwpAQCAtNjYwMSwyMSArNjYwMSwyMSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2xzaGFkZXJhbmdlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlzaG9ydCBhcmcyIDsKLQlsb25nIGFyZzMgOwotCWxvbmcgYXJnNCA7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgNCwgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDQsIDMsICZhcmc0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JbHNoYWRlcmFuZ2UoIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSA7CisgICAgc2hvcnQgYXJnMiA7CisgICAgbG9uZyBhcmczIDsKKyAgICBsb25nIGFyZzQgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDQsIDIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCA0LCAzLCAmYXJnNCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGxzaGFkZXJhbmdlKCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIG4zZiBmbG9hdCBzWzNdICovCkBAIC02NjIzLDEyICs2NjIzLDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfbjNmKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlmbG9hdCBhcmcxIFsgMyBdIDsKLQlpZiAoIWdldGlmbG9hdGFycmF5KGFyZ3MsIDEsIDAsIDMgLCBhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JbjNmKCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGZsb2F0IGFyZzEgWyAzIF0gOworICAgIGlmICghZ2V0aWZsb2F0YXJyYXkoYXJncywgMSwgMCwgMyAsIGFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBuM2YoIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgbm9ib3JkZXIgKi8KQEAgLTY2MzYsOSArNjYzNiw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfbm9ib3JkZXIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCW5vYm9yZGVyKCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBub2JvcmRlciggKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcG50c21vb3RoIGxvbmcgcyAqLwpAQCAtNjY0NiwxMiArNjY0NiwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3BudHNtb290aChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcG50c21vb3RoKCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHBudHNtb290aCggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCByZWFkc291cmNlIGxvbmcgcyAqLwpAQCAtNjY1OSwxMiArNjY1OSwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3JlYWRzb3VyY2UoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCXJlYWRzb3VyY2UoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmVhZHNvdXJjZSggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCByZWN0em9vbSBmbG9hdCBzIGZsb2F0IHMgKi8KQEAgLTY2NzIsMTUgKzY2NzIsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9yZWN0em9vbShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZmxvYXQgYXJnMSA7Ci0JZmxvYXQgYXJnMiA7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMiwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAyLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCXJlY3R6b29tKCBhcmcxICwgYXJnMiApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBmbG9hdCBhcmcxIDsKKyAgICBmbG9hdCBhcmcyIDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmVjdHpvb20oIGFyZzEgLCBhcmcyICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHNib3ggZmxvYXQgcyBmbG9hdCBzIGZsb2F0IHMgZmxvYXQgcyAqLwpAQCAtNjY4OCwyMSArNjY4OCwyMSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3Nib3goUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWZsb2F0IGFyZzEgOwotCWZsb2F0IGFyZzIgOwotCWZsb2F0IGFyZzMgOwotCWZsb2F0IGFyZzQgOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDQsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNCwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA0LCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDQsIDMsICZhcmc0KSkKLQkJcmV0dXJuIE5VTEw7Ci0Jc2JveCggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBmbG9hdCBhcmcxIDsKKyAgICBmbG9hdCBhcmcyIDsKKyAgICBmbG9hdCBhcmczIDsKKyAgICBmbG9hdCBhcmc0IDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA0LCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDQsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNCwgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA0LCAzLCAmYXJnNCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHNib3goIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgc2JveGkgbG9uZyBzIGxvbmcgcyBsb25nIHMgbG9uZyBzICovCkBAIC02NzEwLDIxICs2NzEwLDIxIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfc2JveGkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JbG9uZyBhcmcyIDsKLQlsb25nIGFyZzMgOwotCWxvbmcgYXJnNCA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCA0LCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgNCwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDQsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCA0LCAzLCAmYXJnNCkpCi0JCXJldHVybiBOVUxMOwotCXNib3hpKCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgbG9uZyBhcmcyIDsKKyAgICBsb25nIGFyZzMgOworICAgIGxvbmcgYXJnNCA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCA0LCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgNCwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDQsIDIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCA0LCAzLCAmYXJnNCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHNib3hpKCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHNib3hzIHNob3J0IHMgc2hvcnQgcyBzaG9ydCBzIHNob3J0IHMgKi8KQEAgLTY3MzIsMjEgKzY3MzIsMjEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9zYm94cyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0Jc2hvcnQgYXJnMiA7Ci0Jc2hvcnQgYXJnMyA7Ci0Jc2hvcnQgYXJnNCA7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMywgJmFyZzQpKQotCQlyZXR1cm4gTlVMTDsKLQlzYm94cyggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxIDsKKyAgICBzaG9ydCBhcmcyIDsKKyAgICBzaG9ydCBhcmczIDsKKyAgICBzaG9ydCBhcmc0IDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAzLCAmYXJnNCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHNib3hzKCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHNib3hmIGZsb2F0IHMgZmxvYXQgcyBmbG9hdCBzIGZsb2F0IHMgKi8KQEAgLTY3NTQsMjEgKzY3NTQsMjEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9zYm94ZihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZmxvYXQgYXJnMSA7Ci0JZmxvYXQgYXJnMiA7Ci0JZmxvYXQgYXJnMyA7Ci0JZmxvYXQgYXJnNCA7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNCwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA0LCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDQsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNCwgMywgJmFyZzQpKQotCQlyZXR1cm4gTlVMTDsKLQlzYm94ZiggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBmbG9hdCBhcmcxIDsKKyAgICBmbG9hdCBhcmcyIDsKKyAgICBmbG9hdCBhcmczIDsKKyAgICBmbG9hdCBhcmc0IDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA0LCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDQsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNCwgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA0LCAzLCAmYXJnNCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHNib3hmKCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHNib3hmaSBsb25nIHMgbG9uZyBzIGxvbmcgcyBsb25nIHMgKi8KQEAgLTY3NzYsMjEgKzY3NzYsMjEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9zYm94ZmkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JbG9uZyBhcmcyIDsKLQlsb25nIGFyZzMgOwotCWxvbmcgYXJnNCA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCA0LCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgNCwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDQsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCA0LCAzLCAmYXJnNCkpCi0JCXJldHVybiBOVUxMOwotCXNib3hmaSggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGxvbmcgYXJnMiA7CisgICAgbG9uZyBhcmczIDsKKyAgICBsb25nIGFyZzQgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgNCwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDQsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCA0LCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgNCwgMywgJmFyZzQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBzYm94ZmkoIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgc2JveGZzIHNob3J0IHMgc2hvcnQgcyBzaG9ydCBzIHNob3J0IHMgKi8KQEAgLTY3OTgsMjEgKzY3OTgsMjEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9zYm94ZnMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCXNob3J0IGFyZzIgOwotCXNob3J0IGFyZzMgOwotCXNob3J0IGFyZzQgOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDMsICZhcmc0KSkKLQkJcmV0dXJuIE5VTEw7Ci0Jc2JveGZzKCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgOworICAgIHNob3J0IGFyZzIgOworICAgIHNob3J0IGFyZzMgOworICAgIHNob3J0IGFyZzQgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDMsICZhcmc0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgc2JveGZzKCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHNldG51cmJzcHJvcGVydHkgbG9uZyBzIGZsb2F0IHMgKi8KQEAgLTY4MjAsMTUgKzY4MjAsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9zZXRudXJic3Byb3BlcnR5KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWZsb2F0IGFyZzIgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAyLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCXNldG51cmJzcHJvcGVydHkoIGFyZzEgLCBhcmcyICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgZmxvYXQgYXJnMiA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgc2V0bnVyYnNwcm9wZXJ0eSggYXJnMSAsIGFyZzIgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgc2V0cHVwIGxvbmcgcyBsb25nIHMgbG9uZyBzICovCkBAIC02ODM2LDE4ICs2ODM2LDE4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfc2V0cHVwKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWxvbmcgYXJnMiA7Ci0JbG9uZyBhcmczIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQlzZXRwdXAoIGFyZzEgLCBhcmcyICwgYXJnMyApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGxvbmcgYXJnMiA7CisgICAgbG9uZyBhcmczIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBzZXRwdXAoIGFyZzEgLCBhcmcyICwgYXJnMyApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBzbW9vdGhsaW5lIGxvbmcgcyAqLwpAQCAtNjg1NSwxMiArNjg1NSwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3Ntb290aGxpbmUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCXNtb290aGxpbmUoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgc21vb3RobGluZSggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBzdWJwaXhlbCBsb25nIHMgKi8KQEAgLTY4NjgsMTIgKzY4NjgsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9zdWJwaXhlbChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0Jc3VicGl4ZWwoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgc3VicGl4ZWwoIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgc3dhcHRtZXNoICovCkBAIC02ODgxLDkgKzY4ODEsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3N3YXB0bWVzaChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc3dhcHRtZXNoKCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzd2FwdG1lc2goICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiBsb25nIHN3aW5vcGVuIGxvbmcgcyAqLwpAQCAtNjg5MSwxMiArNjg5MSwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3N3aW5vcGVuKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIHJldHZhbDsKLQlsb25nIGFyZzEgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR2YWwgPSBzd2lub3BlbiggYXJnMSApOwotCXJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKKyAgICBsb25nIHJldHZhbDsKKyAgICBsb25nIGFyZzEgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR2YWwgPSBzd2lub3BlbiggYXJnMSApOworICAgIHJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKIH0KIAogLyogdm9pZCB2MmYgZmxvYXQgc1syXSAqLwpAQCAtNjkwNCwxMiArNjkwNCwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3YyZihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZmxvYXQgYXJnMSBbIDIgXSA7Ci0JaWYgKCFnZXRpZmxvYXRhcnJheShhcmdzLCAxLCAwLCAyICwgYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCXYyZiggYXJnMSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBmbG9hdCBhcmcxIFsgMiBdIDsKKyAgICBpZiAoIWdldGlmbG9hdGFycmF5KGFyZ3MsIDEsIDAsIDIgLCBhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgdjJmKCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHYyaSBsb25nIHNbMl0gKi8KQEAgLTY5MTcsMTIgKzY5MTcsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF92MmkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSBbIDIgXSA7Ci0JaWYgKCFnZXRpbG9uZ2FycmF5KGFyZ3MsIDEsIDAsIDIgLCBhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JdjJpKCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSBbIDIgXSA7CisgICAgaWYgKCFnZXRpbG9uZ2FycmF5KGFyZ3MsIDEsIDAsIDIgLCBhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgdjJpKCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHYycyBzaG9ydCBzWzJdICovCkBAIC02OTMwLDEyICs2OTMwLDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfdjJzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIFsgMiBdIDsKLQlpZiAoIWdldGlzaG9ydGFycmF5KGFyZ3MsIDEsIDAsIDIgLCBhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JdjJzKCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgWyAyIF0gOworICAgIGlmICghZ2V0aXNob3J0YXJyYXkoYXJncywgMSwgMCwgMiAsIGFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB2MnMoIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgdjNmIGZsb2F0IHNbM10gKi8KQEAgLTY5NDMsMTIgKzY5NDMsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF92M2YoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWZsb2F0IGFyZzEgWyAzIF0gOwotCWlmICghZ2V0aWZsb2F0YXJyYXkoYXJncywgMSwgMCwgMyAsIGFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQl2M2YoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZmxvYXQgYXJnMSBbIDMgXSA7CisgICAgaWYgKCFnZXRpZmxvYXRhcnJheShhcmdzLCAxLCAwLCAzICwgYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHYzZiggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCB2M2kgbG9uZyBzWzNdICovCkBAIC02OTU2LDEyICs2OTU2LDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfdjNpKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgWyAzIF0gOwotCWlmICghZ2V0aWxvbmdhcnJheShhcmdzLCAxLCAwLCAzICwgYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCXYzaSggYXJnMSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgWyAzIF0gOworICAgIGlmICghZ2V0aWxvbmdhcnJheShhcmdzLCAxLCAwLCAzICwgYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHYzaSggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCB2M3Mgc2hvcnQgc1szXSAqLwpAQCAtNjk2OSwxMiArNjk2OSwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3YzcyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSBbIDMgXSA7Ci0JaWYgKCFnZXRpc2hvcnRhcnJheShhcmdzLCAxLCAwLCAzICwgYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCXYzcyggYXJnMSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxIFsgMyBdIDsKKyAgICBpZiAoIWdldGlzaG9ydGFycmF5KGFyZ3MsIDEsIDAsIDMgLCBhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgdjNzKCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHY0ZiBmbG9hdCBzWzRdICovCkBAIC02OTgyLDEyICs2OTgyLDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfdjRmKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlmbG9hdCBhcmcxIFsgNCBdIDsKLQlpZiAoIWdldGlmbG9hdGFycmF5KGFyZ3MsIDEsIDAsIDQgLCBhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JdjRmKCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGZsb2F0IGFyZzEgWyA0IF0gOworICAgIGlmICghZ2V0aWZsb2F0YXJyYXkoYXJncywgMSwgMCwgNCAsIGFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB2NGYoIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgdjRpIGxvbmcgc1s0XSAqLwpAQCAtNjk5NSwxMiArNjk5NSwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3Y0aShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIFsgNCBdIDsKLQlpZiAoIWdldGlsb25nYXJyYXkoYXJncywgMSwgMCwgNCAsIGFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQl2NGkoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIFsgNCBdIDsKKyAgICBpZiAoIWdldGlsb25nYXJyYXkoYXJncywgMSwgMCwgNCAsIGFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB2NGkoIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgdjRzIHNob3J0IHNbNF0gKi8KQEAgLTcwMDgsMTIgKzcwMDgsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF92NHMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgWyA0IF0gOwotCWlmICghZ2V0aXNob3J0YXJyYXkoYXJncywgMSwgMCwgNCAsIGFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQl2NHMoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSBbIDQgXSA7CisgICAgaWYgKCFnZXRpc2hvcnRhcnJheShhcmdzLCAxLCAwLCA0ICwgYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHY0cyggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCB2aWRlb2NtZCBsb25nIHMgKi8KQEAgLTcwMjEsMTIgKzcwMjEsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF92aWRlb2NtZChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JdmlkZW9jbWQoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgdmlkZW9jbWQoIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIGxvbmcgd2luZGVwdGggbG9uZyBzICovCkBAIC03MDM0LDEyICs3MDM0LDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfd2luZGVwdGgoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgcmV0dmFsOwotCWxvbmcgYXJnMSA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCXJldHZhbCA9IHdpbmRlcHRoKCBhcmcxICk7Ci0JcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOworICAgIGxvbmcgcmV0dmFsOworICAgIGxvbmcgYXJnMSA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHZhbCA9IHdpbmRlcHRoKCBhcmcxICk7CisgICAgcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOwogfQogCiAvKiB2b2lkIHdtcGFjayBsb25nIHMgKi8KQEAgLTcwNDcsMTIgKzcwNDcsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF93bXBhY2soUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCXdtcGFjayggYXJnMSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB3bXBhY2soIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgemRyYXcgbG9uZyBzICovCkBAIC03MDYwLDEyICs3MDYwLDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfemRyYXcoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCXpkcmF3KCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHpkcmF3KCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHpmdW5jdGlvbiBsb25nIHMgKi8KQEAgLTcwNzMsMTIgKzcwNzMsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF96ZnVuY3Rpb24oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCXpmdW5jdGlvbiggYXJnMSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB6ZnVuY3Rpb24oIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgenNvdXJjZSBsb25nIHMgKi8KQEAgLTcwODYsMTIgKzcwODYsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF96c291cmNlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQl6c291cmNlKCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHpzb3VyY2UoIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgendyaXRlbWFzayBsb25nIHMgKi8KQEAgLTcwOTksMTIgKzcwOTksMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF96d3JpdGVtYXNrKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQl6d3JpdGVtYXNrKCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHp3cml0ZW1hc2soIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgdjJkIGRvdWJsZSBzWzJdICovCkBAIC03MTEyLDEyICs3MTEyLDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfdjJkKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlkb3VibGUgYXJnMSBbIDIgXSA7Ci0JaWYgKCFnZXRpZG91YmxlYXJyYXkoYXJncywgMSwgMCwgMiAsIGFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQl2MmQoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZG91YmxlIGFyZzEgWyAyIF0gOworICAgIGlmICghZ2V0aWRvdWJsZWFycmF5KGFyZ3MsIDEsIDAsIDIgLCBhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgdjJkKCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHYzZCBkb3VibGUgc1szXSAqLwpAQCAtNzEyNSwxMiArNzEyNSwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3YzZChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZG91YmxlIGFyZzEgWyAzIF0gOwotCWlmICghZ2V0aWRvdWJsZWFycmF5KGFyZ3MsIDEsIDAsIDMgLCBhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JdjNkKCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGRvdWJsZSBhcmcxIFsgMyBdIDsKKyAgICBpZiAoIWdldGlkb3VibGVhcnJheShhcmdzLCAxLCAwLCAzICwgYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHYzZCggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCB2NGQgZG91YmxlIHNbNF0gKi8KQEAgLTcxMzgsMTIgKzcxMzgsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF92NGQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWRvdWJsZSBhcmcxIFsgNCBdIDsKLQlpZiAoIWdldGlkb3VibGVhcnJheShhcmdzLCAxLCAwLCA0ICwgYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCXY0ZCggYXJnMSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBkb3VibGUgYXJnMSBbIDQgXSA7CisgICAgaWYgKCFnZXRpZG91YmxlYXJyYXkoYXJncywgMSwgMCwgNCAsIGFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB2NGQoIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcGl4bW9kZSBsb25nIHMgbG9uZyBzICovCkBAIC03MTUxLDE1ICs3MTUxLDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcGl4bW9kZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlsb25nIGFyZzIgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcGl4bW9kZSggYXJnMSAsIGFyZzIgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBsb25nIGFyZzIgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcGl4bW9kZSggYXJnMSAsIGFyZzIgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIGxvbmcgcWdldGZkICovCkBAIC03MTY3LDkgKzcxNjcsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3FnZXRmZChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyByZXR2YWw7Ci0JcmV0dmFsID0gcWdldGZkKCApOwotCXJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKKyAgICBsb25nIHJldHZhbDsKKyAgICByZXR2YWwgPSBxZ2V0ZmQoICk7CisgICAgcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOwogfQogCiAvKiB2b2lkIGRpdGhlciBsb25nIHMgKi8KQEAgLTcxNzcsNDU3ICs3MTc3LDQ1NyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2RpdGhlcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZGl0aGVyKCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGRpdGhlciggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIHN0cnVjdCBQeU1ldGhvZERlZiBnbF9tZXRob2RzW10gPSB7Ci0JeyJxcmVhZCIsIGdsX3FyZWFkLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJ2YXJyYXkiLCBnbF92YXJyYXksICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJudmFycmF5IiwgZ2xfbnZhcnJheSwgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJ2bmFycmF5IiwgZ2xfdm5hcnJheSwgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJudXJic3N1cmZhY2UiLCBnbF9udXJic3N1cmZhY2UsICAgIE1FVEhfT0xEQVJHU30sCi0JeyJudXJic2N1cnZlIiwgZ2xfbnVyYnNjdXJ2ZSwgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJwd2xjdXJ2ZSIsIGdsX3B3bGN1cnZlLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJwaWNrIiwgZ2xfcGljaywgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJlbmRwaWNrIiwgZ2xfZW5kcGljaywgICAgICAgICAgICAgIE1FVEhfTk9BUkdTfSwKLQl7ImdzZWxlY3QiLCBnbF9nc2VsZWN0LCAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImVuZHNlbGVjdCIsIGdsX2VuZHNlbGVjdCwgICAgICAgICAgTUVUSF9OT0FSR1N9LAotCXsiZ2V0bWF0cml4IiwgZ2xfZ2V0bWF0cml4LCAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiYWx0Z2V0bWF0cml4IiwgZ2xfYWx0Z2V0bWF0cml4LCAgICBNRVRIX09MREFSR1N9LAotCXsibHJlY3R3cml0ZSIsIGdsX2xyZWN0d3JpdGUsICAgICAgICBNRVRIX09MREFSR1N9LAotCXsibHJlY3RyZWFkIiwgZ2xfbHJlY3RyZWFkLCAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsicmVhZGRpc3BsYXkiLCBnbF9yZWFkZGlzcGxheSwgICAgICBNRVRIX09MREFSR1N9LAotCXsicGFja3JlY3QiLCBnbF9wYWNrcmVjdCwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsidW5wYWNrcmVjdCIsIGdsX3VucGFja3JlY3QsICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiZ3ZlcnNpb24iLCBnbF9ndmVyc2lvbiwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiY2xlYXIiLCBnbF9jbGVhciwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiZ2V0c2hhZGUiLCBnbF9nZXRzaGFkZSwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiZGV2cG9ydCIsIGdsX2RldnBvcnQsICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsicmRyMmkiLCBnbF9yZHIyaSwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsicmVjdGZzIiwgZ2xfcmVjdGZzLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsicmVjdHMiLCBnbF9yZWN0cywgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsicm12MmkiLCBnbF9ybXYyaSwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsibm9wb3J0IiwgZ2xfbm9wb3J0LCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsicG9wdmlld3BvcnQiLCBnbF9wb3B2aWV3cG9ydCwgICAgICBNRVRIX09MREFSR1N9LAotCXsiY2xlYXJoaXRjb2RlIiwgZ2xfY2xlYXJoaXRjb2RlLCAgICBNRVRIX09MREFSR1N9LAotCXsiY2xvc2VvYmoiLCBnbF9jbG9zZW9iaiwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiY3Vyc29mZiIsIGdsX2N1cnNvZmYsICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiY3Vyc29uIiwgZ2xfY3Vyc29uLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiZG91YmxlYnVmZmVyIiwgZ2xfZG91YmxlYnVmZmVyLCAgICBNRVRIX09MREFSR1N9LAotCXsiZmluaXNoIiwgZ2xfZmluaXNoLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiZ2NvbmZpZyIsIGdsX2djb25maWcsICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiZ2luaXQiLCBnbF9naW5pdCwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiZ3Jlc2V0IiwgZ2xfZ3Jlc2V0LCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsibXVsdGltYXAiLCBnbF9tdWx0aW1hcCwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsib25lbWFwIiwgZ2xfb25lbWFwLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsicG9wYXR0cmlidXRlcyIsIGdsX3BvcGF0dHJpYnV0ZXMsICBNRVRIX09MREFSR1N9LAotCXsicG9wbWF0cml4IiwgZ2xfcG9wbWF0cml4LCAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsicHVzaGF0dHJpYnV0ZXMiLCBnbF9wdXNoYXR0cmlidXRlcyxNRVRIX09MREFSR1N9LAotCXsicHVzaG1hdHJpeCIsIGdsX3B1c2htYXRyaXgsICAgICAgICBNRVRIX09MREFSR1N9LAotCXsicHVzaHZpZXdwb3J0IiwgZ2xfcHVzaHZpZXdwb3J0LCAgICBNRVRIX09MREFSR1N9LAotCXsicXJlc2V0IiwgZ2xfcXJlc2V0LCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiUkdCbW9kZSIsIGdsX1JHQm1vZGUsICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsic2luZ2xlYnVmZmVyIiwgZ2xfc2luZ2xlYnVmZmVyLCAgICBNRVRIX09MREFSR1N9LAotCXsic3dhcGJ1ZmZlcnMiLCBnbF9zd2FwYnVmZmVycywgICAgICBNRVRIX09MREFSR1N9LAotCXsiZ3N5bmMiLCBnbF9nc3luYywgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiZ2ZsdXNoIiwgZ2xfZ2ZsdXNoLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsidHBvbiIsIGdsX3Rwb24sICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsidHBvZmYiLCBnbF90cG9mZiwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiY2xrb24iLCBnbF9jbGtvbiwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiY2xrb2ZmIiwgZ2xfY2xrb2ZmLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsicmluZ2JlbGwiLCBnbF9yaW5nYmVsbCwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiZ2JlZ2luIiwgZ2xfZ2JlZ2luLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsidGV4dGluaXQiLCBnbF90ZXh0aW5pdCwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiaW5pdG5hbWVzIiwgZ2xfaW5pdG5hbWVzLCAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsicGNsb3MiLCBnbF9wY2xvcywgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsicG9wbmFtZSIsIGdsX3BvcG5hbWUsICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsic3BjbG9zIiwgZ2xfc3BjbG9zLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiemNsZWFyIiwgZ2xfemNsZWFyLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsic2NyZWVuc3BhY2UiLCBnbF9zY3JlZW5zcGFjZSwgICAgICBNRVRIX09MREFSR1N9LAotCXsicmVzaGFwZXZpZXdwb3J0IiwgZ2xfcmVzaGFwZXZpZXdwb3J0LCBNRVRIX09MREFSR1N9LAotCXsid2lucHVzaCIsIGdsX3dpbnB1c2gsICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsid2lucG9wIiwgZ2xfd2lucG9wLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiZm9yZWdyb3VuZCIsIGdsX2ZvcmVncm91bmQsICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiZW5kZnVsbHNjcm4iLCBnbF9lbmRmdWxsc2NybiwgICAgICBNRVRIX09MREFSR1N9LAotCXsiZW5kcHVwbW9kZSIsIGdsX2VuZHB1cG1vZGUsICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiZnVsbHNjcm4iLCBnbF9mdWxsc2NybiwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsicHVwbW9kZSIsIGdsX3B1cG1vZGUsICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsid2luY29uc3RyYWludHMiLCBnbF93aW5jb25zdHJhaW50cywgTUVUSF9PTERBUkdTfSwKLQl7InBhZ2Vjb2xvciIsIGdsX3BhZ2Vjb2xvciwgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InRleHRjb2xvciIsIGdsX3RleHRjb2xvciwgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImNvbG9yIiwgZ2xfY29sb3IsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImN1cnZlaXQiLCBnbF9jdXJ2ZWl0LCAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImZvbnQiLCBnbF9mb250LCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImxpbmV3aWR0aCIsIGdsX2xpbmV3aWR0aCwgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InNldGxpbmVzdHlsZSIsIGdsX3NldGxpbmVzdHlsZSwgICAgTUVUSF9PTERBUkdTfSwKLQl7InNldG1hcCIsIGdsX3NldG1hcCwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InN3YXBpbnRlcnZhbCIsIGdsX3N3YXBpbnRlcnZhbCwgICAgTUVUSF9PTERBUkdTfSwKLQl7IndyaXRlbWFzayIsIGdsX3dyaXRlbWFzaywgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InRleHR3cml0ZW1hc2siLCBnbF90ZXh0d3JpdGVtYXNrLCAgTUVUSF9PTERBUkdTfSwKLQl7InFkZXZpY2UiLCBnbF9xZGV2aWNlLCAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InVucWRldmljZSIsIGdsX3VucWRldmljZSwgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImN1cnZlYmFzaXMiLCBnbF9jdXJ2ZWJhc2lzLCAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImN1cnZlcHJlY2lzaW9uIiwgZ2xfY3VydmVwcmVjaXNpb24sTUVUSF9PTERBUkdTfSwKLQl7ImxvYWRuYW1lIiwgZ2xfbG9hZG5hbWUsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InBhc3N0aHJvdWdoIiwgZ2xfcGFzc3Rocm91Z2gsICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InB1c2huYW1lIiwgZ2xfcHVzaG5hbWUsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InNldG1vbml0b3IiLCBnbF9zZXRtb25pdG9yLCAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InNldHNoYWRlIiwgZ2xfc2V0c2hhZGUsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InNldHBhdHRlcm4iLCBnbF9zZXRwYXR0ZXJuLCAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InBhZ2V3cml0ZW1hc2siLCBnbF9wYWdld3JpdGVtYXNrLCAgTUVUSF9PTERBUkdTfSwKLQl7ImNhbGxvYmoiLCBnbF9jYWxsb2JqLCAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImRlbG9iaiIsIGdsX2RlbG9iaiwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImVkaXRvYmoiLCBnbF9lZGl0b2JqLCAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7Im1ha2VvYmoiLCBnbF9tYWtlb2JqLCAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7Im1ha2V0YWciLCBnbF9tYWtldGFnLCAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImNodW5rc2l6ZSIsIGdsX2NodW5rc2l6ZSwgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImNvbXBhY3RpZnkiLCBnbF9jb21wYWN0aWZ5LCAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImRlbHRhZyIsIGdsX2RlbHRhZywgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImxzcmVwZWF0IiwgZ2xfbHNyZXBlYXQsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7Im9iamluc2VydCIsIGdsX29iamluc2VydCwgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7Im9ianJlcGxhY2UiLCBnbF9vYmpyZXBsYWNlLCAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7IndpbmNsb3NlIiwgZ2xfd2luY2xvc2UsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImJsYW5rdGltZSIsIGdsX2JsYW5rdGltZSwgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImZyZWVwdXAiLCBnbF9mcmVlcHVwLCAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImJhY2tidWZmZXIiLCBnbF9iYWNrYnVmZmVyLCAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImZyb250YnVmZmVyIiwgZ2xfZnJvbnRidWZmZXIsICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImxzYmFja3VwIiwgZ2xfbHNiYWNrdXAsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InJlc2V0bHMiLCBnbF9yZXNldGxzLCAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImxhbXBvbiIsIGdsX2xhbXBvbiwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImxhbXBvZmYiLCBnbF9sYW1wb2ZmLCAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InNldGJlbGwiLCBnbF9zZXRiZWxsLCAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImJsYW5rc2NyZWVuIiwgZ2xfYmxhbmtzY3JlZW4sICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImRlcHRoY3VlIiwgZ2xfZGVwdGhjdWUsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InpidWZmZXIiLCBnbF96YnVmZmVyLCAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImJhY2tmYWNlIiwgZ2xfYmFja2ZhY2UsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImNtb3YyaSIsIGdsX2Ntb3YyaSwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImRyYXcyaSIsIGdsX2RyYXcyaSwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7Im1vdmUyaSIsIGdsX21vdmUyaSwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InBudDJpIiwgZ2xfcG50MmksICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InBhdGNoYmFzaXMiLCBnbF9wYXRjaGJhc2lzLCAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InBhdGNocHJlY2lzaW9uIiwgZ2xfcGF0Y2hwcmVjaXNpb24sIE1FVEhfT0xEQVJHU30sCi0JeyJwZHIyaSIsIGdsX3BkcjJpLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJwbXYyaSIsIGdsX3BtdjJpLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJycGRyMmkiLCBnbF9ycGRyMmksICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJycG12MmkiLCBnbF9ycG12MmksICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJ4ZnB0MmkiLCBnbF94ZnB0MmksICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJvYmpkZWxldGUiLCBnbF9vYmpkZWxldGUsICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJwYXRjaGN1cnZlcyIsIGdsX3BhdGNoY3VydmVzLCAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJtaW5zaXplIiwgZ2xfbWluc2l6ZSwgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJtYXhzaXplIiwgZ2xfbWF4c2l6ZSwgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJrZWVwYXNwZWN0IiwgZ2xfa2VlcGFzcGVjdCwgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJwcmVmc2l6ZSIsIGdsX3ByZWZzaXplLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJzdGVwdW5pdCIsIGdsX3N0ZXB1bml0LCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJmdWRnZSIsIGdsX2Z1ZGdlLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJ3aW5tb3ZlIiwgZ2xfd2lubW92ZSwgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJhdHRhY2hjdXJzb3IiLCBnbF9hdHRhY2hjdXJzb3IsICAgIE1FVEhfT0xEQVJHU30sCi0JeyJkZWZsaW5lc3R5bGUiLCBnbF9kZWZsaW5lc3R5bGUsICAgIE1FVEhfT0xEQVJHU30sCi0JeyJub2lzZSIsIGdsX25vaXNlLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJwaWNrc2l6ZSIsIGdsX3BpY2tzaXplLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJxZW50ZXIiLCBnbF9xZW50ZXIsICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJzZXRkZXB0aCIsIGdsX3NldGRlcHRoLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJjbW92MnMiLCBnbF9jbW92MnMsICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJkcmF3MnMiLCBnbF9kcmF3MnMsICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJtb3ZlMnMiLCBnbF9tb3ZlMnMsICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJwZHIycyIsIGdsX3BkcjJzLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJwbXYycyIsIGdsX3BtdjJzLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJwbnQycyIsIGdsX3BudDJzLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJyZHIycyIsIGdsX3JkcjJzLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJybXYycyIsIGdsX3JtdjJzLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJycGRyMnMiLCBnbF9ycGRyMnMsICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJycG12MnMiLCBnbF9ycG12MnMsICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJ4ZnB0MnMiLCBnbF94ZnB0MnMsICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJjbW92MiIsIGdsX2Ntb3YyLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJkcmF3MiIsIGdsX2RyYXcyLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJtb3ZlMiIsIGdsX21vdmUyLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJwbnQyIiwgZ2xfcG50MiwgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJwZHIyIiwgZ2xfcGRyMiwgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJwbXYyIiwgZ2xfcG12MiwgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJyZHIyIiwgZ2xfcmRyMiwgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJybXYyIiwgZ2xfcm12MiwgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJycGRyMiIsIGdsX3JwZHIyLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJycG12MiIsIGdsX3JwbXYyLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJ4ZnB0MiIsIGdsX3hmcHQyLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJsb2FkbWF0cml4IiwgZ2xfbG9hZG1hdHJpeCwgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJtdWx0bWF0cml4IiwgZ2xfbXVsdG1hdHJpeCwgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJjcnYiLCBnbF9jcnYsICAgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJyY3J2IiwgZ2xfcmNydiwgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJhZGR0b3B1cCIsIGdsX2FkZHRvcHVwLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJjaGFyc3RyIiwgZ2xfY2hhcnN0ciwgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnZXRwb3J0IiwgZ2xfZ2V0cG9ydCwgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJzdHJ3aWR0aCIsIGdsX3N0cndpZHRoLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJ3aW5vcGVuIiwgZ2xfd2lub3BlbiwgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJ3aW50aXRsZSIsIGdsX3dpbnRpdGxlLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJwb2xmIiwgZ2xfcG9sZiwgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJwb2xmMiIsIGdsX3BvbGYyLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJwb2x5IiwgZ2xfcG9seSwgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJwb2x5MiIsIGdsX3BvbHkyLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJjcnZuIiwgZ2xfY3J2biwgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJyY3J2biIsIGdsX3JjcnZuLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJwb2xmMmkiLCBnbF9wb2xmMmksICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJwb2xmaSIsIGdsX3BvbGZpLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJwb2x5MmkiLCBnbF9wb2x5MmksICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJwb2x5aSIsIGdsX3BvbHlpLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJwb2xmMnMiLCBnbF9wb2xmMnMsICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJwb2xmcyIsIGdsX3BvbGZzLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJwb2x5cyIsIGdsX3BvbHlzLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJwb2x5MnMiLCBnbF9wb2x5MnMsICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJkZWZjdXJzb3IiLCBnbF9kZWZjdXJzb3IsICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJ3cml0ZXBpeGVscyIsIGdsX3dyaXRlcGl4ZWxzLCAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJkZWZiYXNpcyIsIGdsX2RlZmJhc2lzLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnZXdyaXRlIiwgZ2xfZ2V3cml0ZSwgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJyb3RhdGUiLCBnbF9yb3RhdGUsICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJyb3QiLCBnbF9yb3QsICAgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJjaXJjZmkiLCBnbF9jaXJjZmksICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJjaXJjaSIsIGdsX2NpcmNpLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJjbW92aSIsIGdsX2Ntb3ZpLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJkcmF3aSIsIGdsX2RyYXdpLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJtb3ZlaSIsIGdsX21vdmVpLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJwbnRpIiwgZ2xfcG50aSwgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJuZXd0YWciLCBnbF9uZXd0YWcsICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJwZHJpIiwgZ2xfcGRyaSwgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJwbXZpIiwgZ2xfcG12aSwgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJyZHJpIiwgZ2xfcmRyaSwgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJybXZpIiwgZ2xfcm12aSwgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJycGRyaSIsIGdsX3JwZHJpLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJycG12aSIsIGdsX3JwbXZpLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJ4ZnB0aSIsIGdsX3hmcHRpLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJjaXJjIiwgZ2xfY2lyYywgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJjaXJjZiIsIGdsX2NpcmNmLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJjbW92IiwgZ2xfY21vdiwgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJkcmF3IiwgZ2xfZHJhdywgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJtb3ZlIiwgZ2xfbW92ZSwgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJwbnQiLCBnbF9wbnQsICAgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJzY2FsZSIsIGdsX3NjYWxlLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJ0cmFuc2xhdGUiLCBnbF90cmFuc2xhdGUsICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJwZHIiLCBnbF9wZHIsICAgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJwbXYiLCBnbF9wbXYsICAgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJyZHIiLCBnbF9yZHIsICAgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJybXYiLCBnbF9ybXYsICAgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJycGRyIiwgZ2xfcnBkciwgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJycG12IiwgZ2xfcnBtdiwgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJ4ZnB0IiwgZ2xfeGZwdCwgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJSR0Jjb2xvciIsIGdsX1JHQmNvbG9yLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJSR0J3cml0ZW1hc2siLCBnbF9SR0J3cml0ZW1hc2ssICAgIE1FVEhfT0xEQVJHU30sCi0JeyJzZXRjdXJzb3IiLCBnbF9zZXRjdXJzb3IsICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJ0aWUiLCBnbF90aWUsICAgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJjaXJjZnMiLCBnbF9jaXJjZnMsICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJjaXJjcyIsIGdsX2NpcmNzLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJjbW92cyIsIGdsX2Ntb3ZzLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJkcmF3cyIsIGdsX2RyYXdzLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJtb3ZlcyIsIGdsX21vdmVzLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJwZHJzIiwgZ2xfcGRycywgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJwbXZzIiwgZ2xfcG12cywgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJwbnRzIiwgZ2xfcG50cywgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJyZHJzIiwgZ2xfcmRycywgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJybXZzIiwgZ2xfcm12cywgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJycGRycyIsIGdsX3JwZHJzLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJycG12cyIsIGdsX3JwbXZzLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJ4ZnB0cyIsIGdsX3hmcHRzLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJjdXJvcmlnaW4iLCBnbF9jdXJvcmlnaW4sICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJjeWNsZW1hcCIsIGdsX2N5Y2xlbWFwLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJwYXRjaCIsIGdsX3BhdGNoLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJzcGxmIiwgZ2xfc3BsZiwgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJzcGxmMiIsIGdsX3NwbGYyLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJzcGxmaSIsIGdsX3NwbGZpLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJzcGxmMmkiLCBnbF9zcGxmMmksICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJzcGxmcyIsIGdsX3NwbGZzLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJzcGxmMnMiLCBnbF9zcGxmMnMsICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJycGF0Y2giLCBnbF9ycGF0Y2gsICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJvcnRobzIiLCBnbF9vcnRobzIsICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJyZWN0IiwgZ2xfcmVjdCwgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJyZWN0ZiIsIGdsX3JlY3RmLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJ4ZnB0NCIsIGdsX3hmcHQ0LCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJ0ZXh0cG9ydCIsIGdsX3RleHRwb3J0LCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJtYXBjb2xvciIsIGdsX21hcGNvbG9yLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJzY3JtYXNrIiwgZ2xfc2NybWFzaywgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJzZXR2YWx1YXRvciIsIGdsX3NldHZhbHVhdG9yLCAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJ2aWV3cG9ydCIsIGdsX3ZpZXdwb3J0LCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJzaGFkZXJhbmdlIiwgZ2xfc2hhZGVyYW5nZSwgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJ4ZnB0NHMiLCBnbF94ZnB0NHMsICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJyZWN0ZmkiLCBnbF9yZWN0ZmksICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJyZWN0aSIsIGdsX3JlY3RpLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJ4ZnB0NGkiLCBnbF94ZnB0NGksICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJwcmVmcG9zaXRpb24iLCBnbF9wcmVmcG9zaXRpb24sICAgIE1FVEhfT0xEQVJHU30sCi0JeyJhcmMiLCBnbF9hcmMsICAgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJhcmNmIiwgZ2xfYXJjZiwgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJhcmNmaSIsIGdsX2FyY2ZpLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJhcmNpIiwgZ2xfYXJjaSwgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJiYm94MiIsIGdsX2Jib3gyLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJiYm94MmkiLCBnbF9iYm94MmksICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJiYm94MnMiLCBnbF9iYm94MnMsICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJibGluayIsIGdsX2JsaW5rLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJvcnRobyIsIGdsX29ydGhvLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJ3aW5kb3ciLCBnbF93aW5kb3csICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJsb29rYXQiLCBnbF9sb29rYXQsICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJwZXJzcGVjdGl2ZSIsIGdsX3BlcnNwZWN0aXZlLCAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJwb2xhcnZpZXciLCBnbF9wb2xhcnZpZXcsICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJhcmNmcyIsIGdsX2FyY2ZzLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJhcmNzIiwgZ2xfYXJjcywgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJyZWN0Y29weSIsIGdsX3JlY3Rjb3B5LCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJSR0JjdXJzb3IiLCBnbF9SR0JjdXJzb3IsICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnZXRidXR0b24iLCBnbF9nZXRidXR0b24sICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnZXRjbW1vZGUiLCBnbF9nZXRjbW1vZGUsICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnZXRsc2JhY2t1cCIsIGdsX2dldGxzYmFja3VwLCAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnZXRyZXNldGxzIiwgZ2xfZ2V0cmVzZXRscywgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnZXRkY20iLCBnbF9nZXRkY20sICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnZXR6YnVmZmVyIiwgZ2xfZ2V0emJ1ZmZlciwgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJpc21leCIsIGdsX2lzbWV4LCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJpc29iaiIsIGdsX2lzb2JqLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJpc3F1ZXVlZCIsIGdsX2lzcXVldWVkLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJpc3RhZyIsIGdsX2lzdGFnLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnZW5vYmoiLCBnbF9nZW5vYmosICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnZW50YWciLCBnbF9nZW50YWcsICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnZXRidWZmZXIiLCBnbF9nZXRidWZmZXIsICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnZXRjb2xvciIsIGdsX2dldGNvbG9yLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnZXRkaXNwbGF5bW9kZSIsIGdsX2dldGRpc3BsYXltb2RlLCBNRVRIX09MREFSR1N9LAotCXsiZ2V0Zm9udCIsIGdsX2dldGZvbnQsICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiZ2V0aGVpZ2h0IiwgZ2xfZ2V0aGVpZ2h0LCAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiZ2V0aGl0Y29kZSIsIGdsX2dldGhpdGNvZGUsICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiZ2V0bHN0eWxlIiwgZ2xfZ2V0bHN0eWxlLCAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiZ2V0bHdpZHRoIiwgZ2xfZ2V0bHdpZHRoLCAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiZ2V0bWFwIiwgZ2xfZ2V0bWFwLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiZ2V0cGxhbmVzIiwgZ2xfZ2V0cGxhbmVzLCAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiZ2V0d3JpdGVtYXNrIiwgZ2xfZ2V0d3JpdGVtYXNrLCAgICBNRVRIX09MREFSR1N9LAotCXsicXRlc3QiLCBnbF9xdGVzdCwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiZ2V0bHNyZXBlYXQiLCBnbF9nZXRsc3JlcGVhdCwgICAgICBNRVRIX09MREFSR1N9LAotCXsiZ2V0bW9uaXRvciIsIGdsX2dldG1vbml0b3IsICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiZ2V0b3Blbm9iaiIsIGdsX2dldG9wZW5vYmosICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiZ2V0cGF0dGVybiIsIGdsX2dldHBhdHRlcm4sICAgICAgICBNRVRIX09MREFSR1N9LAotCXsid2luZ2V0IiwgZ2xfd2luZ2V0LCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsid2luYXR0YWNoIiwgZ2xfd2luYXR0YWNoLCAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiZ2V0b3RoZXJtb25pdG9yIiwgZ2xfZ2V0b3RoZXJtb25pdG9yLCBNRVRIX09MREFSR1N9LAotCXsibmV3cHVwIiwgZ2xfbmV3cHVwLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiZ2V0dmFsdWF0b3IiLCBnbF9nZXR2YWx1YXRvciwgICAgICBNRVRIX09MREFSR1N9LAotCXsid2luc2V0IiwgZ2xfd2luc2V0LCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiZG9wdXAiLCBnbF9kb3B1cCwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiZ2V0ZGVwdGgiLCBnbF9nZXRkZXB0aCwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiZ2V0Y3BvcyIsIGdsX2dldGNwb3MsICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiZ2V0c2l6ZSIsIGdsX2dldHNpemUsICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiZ2V0b3JpZ2luIiwgZ2xfZ2V0b3JpZ2luLCAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiZ2V0dmlld3BvcnQiLCBnbF9nZXR2aWV3cG9ydCwgICAgICBNRVRIX09MREFSR1N9LAotCXsiZ2V0dHAiLCBnbF9nZXR0cCwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiZ2V0Z3BvcyIsIGdsX2dldGdwb3MsICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsid2lucG9zaXRpb24iLCBnbF93aW5wb3NpdGlvbiwgICAgICBNRVRIX09MREFSR1N9LAotCXsiZ1JHQmNvbG9yIiwgZ2xfZ1JHQmNvbG9yLCAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiZ1JHQm1hc2siLCBnbF9nUkdCbWFzaywgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiZ2V0c2NybWFzayIsIGdsX2dldHNjcm1hc2ssICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiZ2V0bWNvbG9yIiwgZ2xfZ2V0bWNvbG9yLCAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsibWFwdyIsIGdsX21hcHcsICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsibWFwdzIiLCBnbF9tYXB3MiwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiZ2V0Y3Vyc29yIiwgZ2xfZ2V0Y3Vyc29yLCAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiY21vZGUiLCBnbF9jbW9kZSwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiY29uY2F2ZSIsIGdsX2NvbmNhdmUsICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiY3Vyc3R5cGUiLCBnbF9jdXJzdHlwZSwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiZHJhd21vZGUiLCBnbF9kcmF3bW9kZSwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiZ2FtbWFyYW1wIiwgZ2xfZ2FtbWFyYW1wLCAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiZ2V0YmFja2ZhY2UiLCBnbF9nZXRiYWNrZmFjZSwgICAgICBNRVRIX09MREFSR1N9LAotCXsiZ2V0ZGVzY2VuZGVyIiwgZ2xfZ2V0ZGVzY2VuZGVyLCAgICBNRVRIX09MREFSR1N9LAotCXsiZ2V0ZHJhd21vZGUiLCBnbF9nZXRkcmF3bW9kZSwgICAgICBNRVRIX09MREFSR1N9LAotCXsiZ2V0bW1vZGUiLCBnbF9nZXRtbW9kZSwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiZ2V0c20iLCBnbF9nZXRzbSwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiZ2V0dmlkZW8iLCBnbF9nZXR2aWRlbywgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiaW1ha2ViYWNrZ3JvdW5kIiwgZ2xfaW1ha2ViYWNrZ3JvdW5kLCBNRVRIX09MREFSR1N9LAotCXsibG1iaW5kIiwgZ2xfbG1iaW5kLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsibG1kZWYiLCBnbF9sbWRlZiwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsibW1vZGUiLCBnbF9tbW9kZSwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsibm9ybWFsIiwgZ2xfbm9ybWFsLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsib3ZlcmxheSIsIGdsX292ZXJsYXksICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiUkdCcmFuZ2UiLCBnbF9SR0JyYW5nZSwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsic2V0dmlkZW8iLCBnbF9zZXR2aWRlbywgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsic2hhZGVtb2RlbCIsIGdsX3NoYWRlbW9kZWwsICAgICAgICBNRVRIX09MREFSR1N9LAotCXsidW5kZXJsYXkiLCBnbF91bmRlcmxheSwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiYmduY2xvc2VkbGluZSIsIGdsX2JnbmNsb3NlZGxpbmUsICBNRVRIX09MREFSR1N9LAotCXsiYmdubGluZSIsIGdsX2JnbmxpbmUsICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiYmducG9pbnQiLCBnbF9iZ25wb2ludCwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiYmducG9seWdvbiIsIGdsX2JnbnBvbHlnb24sICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiYmduc3VyZmFjZSIsIGdsX2JnbnN1cmZhY2UsICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiYmdudG1lc2giLCBnbF9iZ250bWVzaCwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiYmdudHJpbSIsIGdsX2JnbnRyaW0sICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiZW5kY2xvc2VkbGluZSIsIGdsX2VuZGNsb3NlZGxpbmUsICBNRVRIX09MREFSR1N9LAotCXsiZW5kbGluZSIsIGdsX2VuZGxpbmUsICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiZW5kcG9pbnQiLCBnbF9lbmRwb2ludCwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiZW5kcG9seWdvbiIsIGdsX2VuZHBvbHlnb24sICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiZW5kc3VyZmFjZSIsIGdsX2VuZHN1cmZhY2UsICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiZW5kdG1lc2giLCBnbF9lbmR0bWVzaCwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiZW5kdHJpbSIsIGdsX2VuZHRyaW0sICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiYmxlbmRmdW5jdGlvbiIsIGdsX2JsZW5kZnVuY3Rpb24sICBNRVRIX09MREFSR1N9LAotCXsiYzNmIiwgZ2xfYzNmLCAgICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiYzNpIiwgZ2xfYzNpLCAgICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiYzNzIiwgZ2xfYzNzLCAgICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiYzRmIiwgZ2xfYzRmLCAgICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiYzRpIiwgZ2xfYzRpLCAgICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiYzRzIiwgZ2xfYzRzLCAgICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiY29sb3JmIiwgZ2xfY29sb3JmLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiY3BhY2siLCBnbF9jcGFjaywgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiY3pjbGVhciIsIGdsX2N6Y2xlYXIsICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiZGdsY2xvc2UiLCBnbF9kZ2xjbG9zZSwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiZGdsb3BlbiIsIGdsX2RnbG9wZW4sICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiZ2V0Z2Rlc2MiLCBnbF9nZXRnZGVzYywgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiZ2V0bnVyYnNwcm9wZXJ0eSIsIGdsX2dldG51cmJzcHJvcGVydHksIE1FVEhfT0xEQVJHU30sCi0JeyJnbGNvbXBhdCIsIGdsX2dsY29tcGF0LCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJpY29uc2l6ZSIsIGdsX2ljb25zaXplLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJpY29udGl0bGUiLCBnbF9pY29udGl0bGUsICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJsUkdCcmFuZ2UiLCBnbF9sUkdCcmFuZ2UsICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJsaW5lc21vb3RoIiwgZ2xfbGluZXNtb290aCwgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJsbWNvbG9yIiwgZ2xfbG1jb2xvciwgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJsb2dpY29wIiwgZ2xfbG9naWNvcCwgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJsc2V0ZGVwdGgiLCBnbF9sc2V0ZGVwdGgsICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJsc2hhZGVyYW5nZSIsIGdsX2xzaGFkZXJhbmdlLCAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJuM2YiLCBnbF9uM2YsICAgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJub2JvcmRlciIsIGdsX25vYm9yZGVyLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJwbnRzbW9vdGgiLCBnbF9wbnRzbW9vdGgsICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJyZWFkc291cmNlIiwgZ2xfcmVhZHNvdXJjZSwgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJyZWN0em9vbSIsIGdsX3JlY3R6b29tLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJzYm94IiwgZ2xfc2JveCwgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJzYm94aSIsIGdsX3Nib3hpLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJzYm94cyIsIGdsX3Nib3hzLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJzYm94ZiIsIGdsX3Nib3hmLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJzYm94ZmkiLCBnbF9zYm94ZmksICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJzYm94ZnMiLCBnbF9zYm94ZnMsICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJzZXRudXJic3Byb3BlcnR5IiwgZ2xfc2V0bnVyYnNwcm9wZXJ0eSwgTUVUSF9PTERBUkdTfSwKLQl7InNldHB1cCIsIGdsX3NldHB1cCwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InNtb290aGxpbmUiLCBnbF9zbW9vdGhsaW5lLCAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InN1YnBpeGVsIiwgZ2xfc3VicGl4ZWwsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InN3YXB0bWVzaCIsIGdsX3N3YXB0bWVzaCwgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InN3aW5vcGVuIiwgZ2xfc3dpbm9wZW4sICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InYyZiIsIGdsX3YyZiwgICAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InYyaSIsIGdsX3YyaSwgICAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InYycyIsIGdsX3YycywgICAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InYzZiIsIGdsX3YzZiwgICAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InYzaSIsIGdsX3YzaSwgICAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InYzcyIsIGdsX3YzcywgICAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InY0ZiIsIGdsX3Y0ZiwgICAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InY0aSIsIGdsX3Y0aSwgICAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InY0cyIsIGdsX3Y0cywgICAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InZpZGVvY21kIiwgZ2xfdmlkZW9jbWQsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7IndpbmRlcHRoIiwgZ2xfd2luZGVwdGgsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7IndtcGFjayIsIGdsX3dtcGFjaywgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InpkcmF3IiwgZ2xfemRyYXcsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InpmdW5jdGlvbiIsIGdsX3pmdW5jdGlvbiwgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7Inpzb3VyY2UiLCBnbF96c291cmNlLCAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7Inp3cml0ZW1hc2siLCBnbF96d3JpdGVtYXNrLCAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InYyZCIsIGdsX3YyZCwgICAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InYzZCIsIGdsX3YzZCwgICAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InY0ZCIsIGdsX3Y0ZCwgICAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InBpeG1vZGUiLCBnbF9waXhtb2RlLCAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InFnZXRmZCIsIGdsX3FnZXRmZCwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImRpdGhlciIsIGdsX2RpdGhlciwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7TlVMTCwgTlVMTH0gLyogU2VudGluZWwgKi8KKyAgICB7InFyZWFkIiwgZ2xfcXJlYWQsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InZhcnJheSIsIGdsX3ZhcnJheSwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7Im52YXJyYXkiLCBnbF9udmFycmF5LCAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InZuYXJyYXkiLCBnbF92bmFycmF5LCAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7Im51cmJzc3VyZmFjZSIsIGdsX251cmJzc3VyZmFjZSwgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7Im51cmJzY3VydmUiLCBnbF9udXJic2N1cnZlLCAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InB3bGN1cnZlIiwgZ2xfcHdsY3VydmUsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InBpY2siLCBnbF9waWNrLCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImVuZHBpY2siLCBnbF9lbmRwaWNrLCAgICAgICAgICAgICAgTUVUSF9OT0FSR1N9LAorICAgIHsiZ3NlbGVjdCIsIGdsX2dzZWxlY3QsICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiZW5kc2VsZWN0IiwgZ2xfZW5kc2VsZWN0LCAgICAgICAgICBNRVRIX05PQVJHU30sCisgICAgeyJnZXRtYXRyaXgiLCBnbF9nZXRtYXRyaXgsICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJhbHRnZXRtYXRyaXgiLCBnbF9hbHRnZXRtYXRyaXgsICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJscmVjdHdyaXRlIiwgZ2xfbHJlY3R3cml0ZSwgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJscmVjdHJlYWQiLCBnbF9scmVjdHJlYWQsICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJyZWFkZGlzcGxheSIsIGdsX3JlYWRkaXNwbGF5LCAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJwYWNrcmVjdCIsIGdsX3BhY2tyZWN0LCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJ1bnBhY2tyZWN0IiwgZ2xfdW5wYWNrcmVjdCwgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJndmVyc2lvbiIsIGdsX2d2ZXJzaW9uLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJjbGVhciIsIGdsX2NsZWFyLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJnZXRzaGFkZSIsIGdsX2dldHNoYWRlLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJkZXZwb3J0IiwgZ2xfZGV2cG9ydCwgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJyZHIyaSIsIGdsX3JkcjJpLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJyZWN0ZnMiLCBnbF9yZWN0ZnMsICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJyZWN0cyIsIGdsX3JlY3RzLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJybXYyaSIsIGdsX3JtdjJpLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJub3BvcnQiLCBnbF9ub3BvcnQsICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJwb3B2aWV3cG9ydCIsIGdsX3BvcHZpZXdwb3J0LCAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJjbGVhcmhpdGNvZGUiLCBnbF9jbGVhcmhpdGNvZGUsICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJjbG9zZW9iaiIsIGdsX2Nsb3Nlb2JqLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJjdXJzb2ZmIiwgZ2xfY3Vyc29mZiwgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJjdXJzb24iLCBnbF9jdXJzb24sICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJkb3VibGVidWZmZXIiLCBnbF9kb3VibGVidWZmZXIsICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJmaW5pc2giLCBnbF9maW5pc2gsICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJnY29uZmlnIiwgZ2xfZ2NvbmZpZywgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJnaW5pdCIsIGdsX2dpbml0LCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJncmVzZXQiLCBnbF9ncmVzZXQsICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJtdWx0aW1hcCIsIGdsX211bHRpbWFwLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJvbmVtYXAiLCBnbF9vbmVtYXAsICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJwb3BhdHRyaWJ1dGVzIiwgZ2xfcG9wYXR0cmlidXRlcywgIE1FVEhfT0xEQVJHU30sCisgICAgeyJwb3BtYXRyaXgiLCBnbF9wb3BtYXRyaXgsICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJwdXNoYXR0cmlidXRlcyIsIGdsX3B1c2hhdHRyaWJ1dGVzLE1FVEhfT0xEQVJHU30sCisgICAgeyJwdXNobWF0cml4IiwgZ2xfcHVzaG1hdHJpeCwgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJwdXNodmlld3BvcnQiLCBnbF9wdXNodmlld3BvcnQsICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJxcmVzZXQiLCBnbF9xcmVzZXQsICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJSR0Jtb2RlIiwgZ2xfUkdCbW9kZSwgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJzaW5nbGVidWZmZXIiLCBnbF9zaW5nbGVidWZmZXIsICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJzd2FwYnVmZmVycyIsIGdsX3N3YXBidWZmZXJzLCAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJnc3luYyIsIGdsX2dzeW5jLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJnZmx1c2giLCBnbF9nZmx1c2gsICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJ0cG9uIiwgZ2xfdHBvbiwgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJ0cG9mZiIsIGdsX3Rwb2ZmLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJjbGtvbiIsIGdsX2Nsa29uLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJjbGtvZmYiLCBnbF9jbGtvZmYsICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJyaW5nYmVsbCIsIGdsX3JpbmdiZWxsLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJnYmVnaW4iLCBnbF9nYmVnaW4sICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJ0ZXh0aW5pdCIsIGdsX3RleHRpbml0LCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJpbml0bmFtZXMiLCBnbF9pbml0bmFtZXMsICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJwY2xvcyIsIGdsX3BjbG9zLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJwb3BuYW1lIiwgZ2xfcG9wbmFtZSwgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJzcGNsb3MiLCBnbF9zcGNsb3MsICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJ6Y2xlYXIiLCBnbF96Y2xlYXIsICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJzY3JlZW5zcGFjZSIsIGdsX3NjcmVlbnNwYWNlLCAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJyZXNoYXBldmlld3BvcnQiLCBnbF9yZXNoYXBldmlld3BvcnQsIE1FVEhfT0xEQVJHU30sCisgICAgeyJ3aW5wdXNoIiwgZ2xfd2lucHVzaCwgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJ3aW5wb3AiLCBnbF93aW5wb3AsICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJmb3JlZ3JvdW5kIiwgZ2xfZm9yZWdyb3VuZCwgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJlbmRmdWxsc2NybiIsIGdsX2VuZGZ1bGxzY3JuLCAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJlbmRwdXBtb2RlIiwgZ2xfZW5kcHVwbW9kZSwgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJmdWxsc2NybiIsIGdsX2Z1bGxzY3JuLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJwdXBtb2RlIiwgZ2xfcHVwbW9kZSwgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJ3aW5jb25zdHJhaW50cyIsIGdsX3dpbmNvbnN0cmFpbnRzLCBNRVRIX09MREFSR1N9LAorICAgIHsicGFnZWNvbG9yIiwgZ2xfcGFnZWNvbG9yLCAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsidGV4dGNvbG9yIiwgZ2xfdGV4dGNvbG9yLCAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiY29sb3IiLCBnbF9jb2xvciwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiY3VydmVpdCIsIGdsX2N1cnZlaXQsICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiZm9udCIsIGdsX2ZvbnQsICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsibGluZXdpZHRoIiwgZ2xfbGluZXdpZHRoLCAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsic2V0bGluZXN0eWxlIiwgZ2xfc2V0bGluZXN0eWxlLCAgICBNRVRIX09MREFSR1N9LAorICAgIHsic2V0bWFwIiwgZ2xfc2V0bWFwLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsic3dhcGludGVydmFsIiwgZ2xfc3dhcGludGVydmFsLCAgICBNRVRIX09MREFSR1N9LAorICAgIHsid3JpdGVtYXNrIiwgZ2xfd3JpdGVtYXNrLCAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsidGV4dHdyaXRlbWFzayIsIGdsX3RleHR3cml0ZW1hc2ssICBNRVRIX09MREFSR1N9LAorICAgIHsicWRldmljZSIsIGdsX3FkZXZpY2UsICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsidW5xZGV2aWNlIiwgZ2xfdW5xZGV2aWNlLCAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiY3VydmViYXNpcyIsIGdsX2N1cnZlYmFzaXMsICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiY3VydmVwcmVjaXNpb24iLCBnbF9jdXJ2ZXByZWNpc2lvbixNRVRIX09MREFSR1N9LAorICAgIHsibG9hZG5hbWUiLCBnbF9sb2FkbmFtZSwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicGFzc3Rocm91Z2giLCBnbF9wYXNzdGhyb3VnaCwgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicHVzaG5hbWUiLCBnbF9wdXNobmFtZSwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsic2V0bW9uaXRvciIsIGdsX3NldG1vbml0b3IsICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsic2V0c2hhZGUiLCBnbF9zZXRzaGFkZSwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsic2V0cGF0dGVybiIsIGdsX3NldHBhdHRlcm4sICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicGFnZXdyaXRlbWFzayIsIGdsX3BhZ2V3cml0ZW1hc2ssICBNRVRIX09MREFSR1N9LAorICAgIHsiY2FsbG9iaiIsIGdsX2NhbGxvYmosICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiZGVsb2JqIiwgZ2xfZGVsb2JqLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiZWRpdG9iaiIsIGdsX2VkaXRvYmosICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsibWFrZW9iaiIsIGdsX21ha2VvYmosICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsibWFrZXRhZyIsIGdsX21ha2V0YWcsICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiY2h1bmtzaXplIiwgZ2xfY2h1bmtzaXplLCAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiY29tcGFjdGlmeSIsIGdsX2NvbXBhY3RpZnksICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiZGVsdGFnIiwgZ2xfZGVsdGFnLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsibHNyZXBlYXQiLCBnbF9sc3JlcGVhdCwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsib2JqaW5zZXJ0IiwgZ2xfb2JqaW5zZXJ0LCAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsib2JqcmVwbGFjZSIsIGdsX29ianJlcGxhY2UsICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsid2luY2xvc2UiLCBnbF93aW5jbG9zZSwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiYmxhbmt0aW1lIiwgZ2xfYmxhbmt0aW1lLCAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiZnJlZXB1cCIsIGdsX2ZyZWVwdXAsICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiYmFja2J1ZmZlciIsIGdsX2JhY2tidWZmZXIsICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiZnJvbnRidWZmZXIiLCBnbF9mcm9udGJ1ZmZlciwgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsibHNiYWNrdXAiLCBnbF9sc2JhY2t1cCwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicmVzZXRscyIsIGdsX3Jlc2V0bHMsICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsibGFtcG9uIiwgZ2xfbGFtcG9uLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsibGFtcG9mZiIsIGdsX2xhbXBvZmYsICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsic2V0YmVsbCIsIGdsX3NldGJlbGwsICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiYmxhbmtzY3JlZW4iLCBnbF9ibGFua3NjcmVlbiwgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiZGVwdGhjdWUiLCBnbF9kZXB0aGN1ZSwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiemJ1ZmZlciIsIGdsX3pidWZmZXIsICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiYmFja2ZhY2UiLCBnbF9iYWNrZmFjZSwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiY21vdjJpIiwgZ2xfY21vdjJpLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiZHJhdzJpIiwgZ2xfZHJhdzJpLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsibW92ZTJpIiwgZ2xfbW92ZTJpLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicG50MmkiLCBnbF9wbnQyaSwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicGF0Y2hiYXNpcyIsIGdsX3BhdGNoYmFzaXMsICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicGF0Y2hwcmVjaXNpb24iLCBnbF9wYXRjaHByZWNpc2lvbiwgTUVUSF9PTERBUkdTfSwKKyAgICB7InBkcjJpIiwgZ2xfcGRyMmksICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InBtdjJpIiwgZ2xfcG12MmksICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InJwZHIyaSIsIGdsX3JwZHIyaSwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InJwbXYyaSIsIGdsX3JwbXYyaSwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InhmcHQyaSIsIGdsX3hmcHQyaSwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7Im9iamRlbGV0ZSIsIGdsX29iamRlbGV0ZSwgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InBhdGNoY3VydmVzIiwgZ2xfcGF0Y2hjdXJ2ZXMsICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7Im1pbnNpemUiLCBnbF9taW5zaXplLCAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7Im1heHNpemUiLCBnbF9tYXhzaXplLCAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImtlZXBhc3BlY3QiLCBnbF9rZWVwYXNwZWN0LCAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InByZWZzaXplIiwgZ2xfcHJlZnNpemUsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InN0ZXB1bml0IiwgZ2xfc3RlcHVuaXQsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImZ1ZGdlIiwgZ2xfZnVkZ2UsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7Indpbm1vdmUiLCBnbF93aW5tb3ZlLCAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImF0dGFjaGN1cnNvciIsIGdsX2F0dGFjaGN1cnNvciwgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImRlZmxpbmVzdHlsZSIsIGdsX2RlZmxpbmVzdHlsZSwgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7Im5vaXNlIiwgZ2xfbm9pc2UsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InBpY2tzaXplIiwgZ2xfcGlja3NpemUsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InFlbnRlciIsIGdsX3FlbnRlciwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InNldGRlcHRoIiwgZ2xfc2V0ZGVwdGgsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImNtb3YycyIsIGdsX2Ntb3YycywgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImRyYXcycyIsIGdsX2RyYXcycywgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7Im1vdmUycyIsIGdsX21vdmUycywgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InBkcjJzIiwgZ2xfcGRyMnMsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InBtdjJzIiwgZ2xfcG12MnMsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InBudDJzIiwgZ2xfcG50MnMsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InJkcjJzIiwgZ2xfcmRyMnMsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InJtdjJzIiwgZ2xfcm12MnMsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InJwZHIycyIsIGdsX3JwZHIycywgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InJwbXYycyIsIGdsX3JwbXYycywgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InhmcHQycyIsIGdsX3hmcHQycywgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImNtb3YyIiwgZ2xfY21vdjIsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImRyYXcyIiwgZ2xfZHJhdzIsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7Im1vdmUyIiwgZ2xfbW92ZTIsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InBudDIiLCBnbF9wbnQyLCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InBkcjIiLCBnbF9wZHIyLCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InBtdjIiLCBnbF9wbXYyLCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InJkcjIiLCBnbF9yZHIyLCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InJtdjIiLCBnbF9ybXYyLCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InJwZHIyIiwgZ2xfcnBkcjIsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InJwbXYyIiwgZ2xfcnBtdjIsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InhmcHQyIiwgZ2xfeGZwdDIsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImxvYWRtYXRyaXgiLCBnbF9sb2FkbWF0cml4LCAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7Im11bHRtYXRyaXgiLCBnbF9tdWx0bWF0cml4LCAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImNydiIsIGdsX2NydiwgICAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InJjcnYiLCBnbF9yY3J2LCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImFkZHRvcHVwIiwgZ2xfYWRkdG9wdXAsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImNoYXJzdHIiLCBnbF9jaGFyc3RyLCAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldHBvcnQiLCBnbF9nZXRwb3J0LCAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InN0cndpZHRoIiwgZ2xfc3Ryd2lkdGgsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7Indpbm9wZW4iLCBnbF93aW5vcGVuLCAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7IndpbnRpdGxlIiwgZ2xfd2ludGl0bGUsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InBvbGYiLCBnbF9wb2xmLCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InBvbGYyIiwgZ2xfcG9sZjIsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InBvbHkiLCBnbF9wb2x5LCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InBvbHkyIiwgZ2xfcG9seTIsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImNydm4iLCBnbF9jcnZuLCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InJjcnZuIiwgZ2xfcmNydm4sICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InBvbGYyaSIsIGdsX3BvbGYyaSwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InBvbGZpIiwgZ2xfcG9sZmksICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InBvbHkyaSIsIGdsX3BvbHkyaSwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InBvbHlpIiwgZ2xfcG9seWksICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InBvbGYycyIsIGdsX3BvbGYycywgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InBvbGZzIiwgZ2xfcG9sZnMsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InBvbHlzIiwgZ2xfcG9seXMsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InBvbHkycyIsIGdsX3BvbHkycywgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImRlZmN1cnNvciIsIGdsX2RlZmN1cnNvciwgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7IndyaXRlcGl4ZWxzIiwgZ2xfd3JpdGVwaXhlbHMsICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImRlZmJhc2lzIiwgZ2xfZGVmYmFzaXMsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7Imdld3JpdGUiLCBnbF9nZXdyaXRlLCAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InJvdGF0ZSIsIGdsX3JvdGF0ZSwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InJvdCIsIGdsX3JvdCwgICAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImNpcmNmaSIsIGdsX2NpcmNmaSwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImNpcmNpIiwgZ2xfY2lyY2ksICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImNtb3ZpIiwgZ2xfY21vdmksICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImRyYXdpIiwgZ2xfZHJhd2ksICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7Im1vdmVpIiwgZ2xfbW92ZWksICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InBudGkiLCBnbF9wbnRpLCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7Im5ld3RhZyIsIGdsX25ld3RhZywgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InBkcmkiLCBnbF9wZHJpLCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InBtdmkiLCBnbF9wbXZpLCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InJkcmkiLCBnbF9yZHJpLCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InJtdmkiLCBnbF9ybXZpLCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InJwZHJpIiwgZ2xfcnBkcmksICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InJwbXZpIiwgZ2xfcnBtdmksICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InhmcHRpIiwgZ2xfeGZwdGksICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImNpcmMiLCBnbF9jaXJjLCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImNpcmNmIiwgZ2xfY2lyY2YsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImNtb3YiLCBnbF9jbW92LCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImRyYXciLCBnbF9kcmF3LCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7Im1vdmUiLCBnbF9tb3ZlLCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InBudCIsIGdsX3BudCwgICAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InNjYWxlIiwgZ2xfc2NhbGUsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InRyYW5zbGF0ZSIsIGdsX3RyYW5zbGF0ZSwgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InBkciIsIGdsX3BkciwgICAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InBtdiIsIGdsX3BtdiwgICAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InJkciIsIGdsX3JkciwgICAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InJtdiIsIGdsX3JtdiwgICAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InJwZHIiLCBnbF9ycGRyLCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InJwbXYiLCBnbF9ycG12LCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InhmcHQiLCBnbF94ZnB0LCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7IlJHQmNvbG9yIiwgZ2xfUkdCY29sb3IsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7IlJHQndyaXRlbWFzayIsIGdsX1JHQndyaXRlbWFzaywgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InNldGN1cnNvciIsIGdsX3NldGN1cnNvciwgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InRpZSIsIGdsX3RpZSwgICAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImNpcmNmcyIsIGdsX2NpcmNmcywgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImNpcmNzIiwgZ2xfY2lyY3MsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImNtb3ZzIiwgZ2xfY21vdnMsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImRyYXdzIiwgZ2xfZHJhd3MsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7Im1vdmVzIiwgZ2xfbW92ZXMsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InBkcnMiLCBnbF9wZHJzLCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InBtdnMiLCBnbF9wbXZzLCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InBudHMiLCBnbF9wbnRzLCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InJkcnMiLCBnbF9yZHJzLCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InJtdnMiLCBnbF9ybXZzLCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InJwZHJzIiwgZ2xfcnBkcnMsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InJwbXZzIiwgZ2xfcnBtdnMsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InhmcHRzIiwgZ2xfeGZwdHMsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImN1cm9yaWdpbiIsIGdsX2N1cm9yaWdpbiwgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImN5Y2xlbWFwIiwgZ2xfY3ljbGVtYXAsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InBhdGNoIiwgZ2xfcGF0Y2gsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InNwbGYiLCBnbF9zcGxmLCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InNwbGYyIiwgZ2xfc3BsZjIsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InNwbGZpIiwgZ2xfc3BsZmksICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InNwbGYyaSIsIGdsX3NwbGYyaSwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InNwbGZzIiwgZ2xfc3BsZnMsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InNwbGYycyIsIGdsX3NwbGYycywgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InJwYXRjaCIsIGdsX3JwYXRjaCwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7Im9ydGhvMiIsIGdsX29ydGhvMiwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InJlY3QiLCBnbF9yZWN0LCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InJlY3RmIiwgZ2xfcmVjdGYsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InhmcHQ0IiwgZ2xfeGZwdDQsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InRleHRwb3J0IiwgZ2xfdGV4dHBvcnQsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7Im1hcGNvbG9yIiwgZ2xfbWFwY29sb3IsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InNjcm1hc2siLCBnbF9zY3JtYXNrLCAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InNldHZhbHVhdG9yIiwgZ2xfc2V0dmFsdWF0b3IsICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InZpZXdwb3J0IiwgZ2xfdmlld3BvcnQsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InNoYWRlcmFuZ2UiLCBnbF9zaGFkZXJhbmdlLCAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InhmcHQ0cyIsIGdsX3hmcHQ0cywgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InJlY3RmaSIsIGdsX3JlY3RmaSwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InJlY3RpIiwgZ2xfcmVjdGksICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InhmcHQ0aSIsIGdsX3hmcHQ0aSwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InByZWZwb3NpdGlvbiIsIGdsX3ByZWZwb3NpdGlvbiwgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImFyYyIsIGdsX2FyYywgICAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImFyY2YiLCBnbF9hcmNmLCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImFyY2ZpIiwgZ2xfYXJjZmksICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImFyY2kiLCBnbF9hcmNpLCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImJib3gyIiwgZ2xfYmJveDIsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImJib3gyaSIsIGdsX2Jib3gyaSwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImJib3gycyIsIGdsX2Jib3gycywgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImJsaW5rIiwgZ2xfYmxpbmssICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7Im9ydGhvIiwgZ2xfb3J0aG8sICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7IndpbmRvdyIsIGdsX3dpbmRvdywgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7Imxvb2thdCIsIGdsX2xvb2thdCwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InBlcnNwZWN0aXZlIiwgZ2xfcGVyc3BlY3RpdmUsICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InBvbGFydmlldyIsIGdsX3BvbGFydmlldywgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImFyY2ZzIiwgZ2xfYXJjZnMsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImFyY3MiLCBnbF9hcmNzLCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InJlY3Rjb3B5IiwgZ2xfcmVjdGNvcHksICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7IlJHQmN1cnNvciIsIGdsX1JHQmN1cnNvciwgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldGJ1dHRvbiIsIGdsX2dldGJ1dHRvbiwgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldGNtbW9kZSIsIGdsX2dldGNtbW9kZSwgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldGxzYmFja3VwIiwgZ2xfZ2V0bHNiYWNrdXAsICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldHJlc2V0bHMiLCBnbF9nZXRyZXNldGxzLCAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldGRjbSIsIGdsX2dldGRjbSwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldHpidWZmZXIiLCBnbF9nZXR6YnVmZmVyLCAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImlzbWV4IiwgZ2xfaXNtZXgsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7Imlzb2JqIiwgZ2xfaXNvYmosICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImlzcXVldWVkIiwgZ2xfaXNxdWV1ZWQsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImlzdGFnIiwgZ2xfaXN0YWcsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7Imdlbm9iaiIsIGdsX2dlbm9iaiwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdlbnRhZyIsIGdsX2dlbnRhZywgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldGJ1ZmZlciIsIGdsX2dldGJ1ZmZlciwgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldGNvbG9yIiwgZ2xfZ2V0Y29sb3IsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldGRpc3BsYXltb2RlIiwgZ2xfZ2V0ZGlzcGxheW1vZGUsIE1FVEhfT0xEQVJHU30sCisgICAgeyJnZXRmb250IiwgZ2xfZ2V0Zm9udCwgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJnZXRoZWlnaHQiLCBnbF9nZXRoZWlnaHQsICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJnZXRoaXRjb2RlIiwgZ2xfZ2V0aGl0Y29kZSwgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJnZXRsc3R5bGUiLCBnbF9nZXRsc3R5bGUsICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJnZXRsd2lkdGgiLCBnbF9nZXRsd2lkdGgsICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJnZXRtYXAiLCBnbF9nZXRtYXAsICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJnZXRwbGFuZXMiLCBnbF9nZXRwbGFuZXMsICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJnZXR3cml0ZW1hc2siLCBnbF9nZXR3cml0ZW1hc2ssICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJxdGVzdCIsIGdsX3F0ZXN0LCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJnZXRsc3JlcGVhdCIsIGdsX2dldGxzcmVwZWF0LCAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJnZXRtb25pdG9yIiwgZ2xfZ2V0bW9uaXRvciwgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJnZXRvcGVub2JqIiwgZ2xfZ2V0b3Blbm9iaiwgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJnZXRwYXR0ZXJuIiwgZ2xfZ2V0cGF0dGVybiwgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJ3aW5nZXQiLCBnbF93aW5nZXQsICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJ3aW5hdHRhY2giLCBnbF93aW5hdHRhY2gsICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJnZXRvdGhlcm1vbml0b3IiLCBnbF9nZXRvdGhlcm1vbml0b3IsIE1FVEhfT0xEQVJHU30sCisgICAgeyJuZXdwdXAiLCBnbF9uZXdwdXAsICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJnZXR2YWx1YXRvciIsIGdsX2dldHZhbHVhdG9yLCAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJ3aW5zZXQiLCBnbF93aW5zZXQsICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJkb3B1cCIsIGdsX2RvcHVwLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJnZXRkZXB0aCIsIGdsX2dldGRlcHRoLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJnZXRjcG9zIiwgZ2xfZ2V0Y3BvcywgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJnZXRzaXplIiwgZ2xfZ2V0c2l6ZSwgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJnZXRvcmlnaW4iLCBnbF9nZXRvcmlnaW4sICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJnZXR2aWV3cG9ydCIsIGdsX2dldHZpZXdwb3J0LCAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJnZXR0cCIsIGdsX2dldHRwLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJnZXRncG9zIiwgZ2xfZ2V0Z3BvcywgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJ3aW5wb3NpdGlvbiIsIGdsX3dpbnBvc2l0aW9uLCAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJnUkdCY29sb3IiLCBnbF9nUkdCY29sb3IsICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJnUkdCbWFzayIsIGdsX2dSR0JtYXNrLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJnZXRzY3JtYXNrIiwgZ2xfZ2V0c2NybWFzaywgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJnZXRtY29sb3IiLCBnbF9nZXRtY29sb3IsICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJtYXB3IiwgZ2xfbWFwdywgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJtYXB3MiIsIGdsX21hcHcyLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJnZXRjdXJzb3IiLCBnbF9nZXRjdXJzb3IsICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJjbW9kZSIsIGdsX2Ntb2RlLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJjb25jYXZlIiwgZ2xfY29uY2F2ZSwgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJjdXJzdHlwZSIsIGdsX2N1cnN0eXBlLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJkcmF3bW9kZSIsIGdsX2RyYXdtb2RlLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJnYW1tYXJhbXAiLCBnbF9nYW1tYXJhbXAsICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJnZXRiYWNrZmFjZSIsIGdsX2dldGJhY2tmYWNlLCAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJnZXRkZXNjZW5kZXIiLCBnbF9nZXRkZXNjZW5kZXIsICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJnZXRkcmF3bW9kZSIsIGdsX2dldGRyYXdtb2RlLCAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJnZXRtbW9kZSIsIGdsX2dldG1tb2RlLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJnZXRzbSIsIGdsX2dldHNtLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJnZXR2aWRlbyIsIGdsX2dldHZpZGVvLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJpbWFrZWJhY2tncm91bmQiLCBnbF9pbWFrZWJhY2tncm91bmQsIE1FVEhfT0xEQVJHU30sCisgICAgeyJsbWJpbmQiLCBnbF9sbWJpbmQsICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJsbWRlZiIsIGdsX2xtZGVmLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJtbW9kZSIsIGdsX21tb2RlLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJub3JtYWwiLCBnbF9ub3JtYWwsICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJvdmVybGF5IiwgZ2xfb3ZlcmxheSwgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJSR0JyYW5nZSIsIGdsX1JHQnJhbmdlLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJzZXR2aWRlbyIsIGdsX3NldHZpZGVvLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJzaGFkZW1vZGVsIiwgZ2xfc2hhZGVtb2RlbCwgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJ1bmRlcmxheSIsIGdsX3VuZGVybGF5LCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJiZ25jbG9zZWRsaW5lIiwgZ2xfYmduY2xvc2VkbGluZSwgIE1FVEhfT0xEQVJHU30sCisgICAgeyJiZ25saW5lIiwgZ2xfYmdubGluZSwgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJiZ25wb2ludCIsIGdsX2JnbnBvaW50LCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJiZ25wb2x5Z29uIiwgZ2xfYmducG9seWdvbiwgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJiZ25zdXJmYWNlIiwgZ2xfYmduc3VyZmFjZSwgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJiZ250bWVzaCIsIGdsX2JnbnRtZXNoLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJiZ250cmltIiwgZ2xfYmdudHJpbSwgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJlbmRjbG9zZWRsaW5lIiwgZ2xfZW5kY2xvc2VkbGluZSwgIE1FVEhfT0xEQVJHU30sCisgICAgeyJlbmRsaW5lIiwgZ2xfZW5kbGluZSwgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJlbmRwb2ludCIsIGdsX2VuZHBvaW50LCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJlbmRwb2x5Z29uIiwgZ2xfZW5kcG9seWdvbiwgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJlbmRzdXJmYWNlIiwgZ2xfZW5kc3VyZmFjZSwgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJlbmR0bWVzaCIsIGdsX2VuZHRtZXNoLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJlbmR0cmltIiwgZ2xfZW5kdHJpbSwgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJibGVuZGZ1bmN0aW9uIiwgZ2xfYmxlbmRmdW5jdGlvbiwgIE1FVEhfT0xEQVJHU30sCisgICAgeyJjM2YiLCBnbF9jM2YsICAgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJjM2kiLCBnbF9jM2ksICAgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJjM3MiLCBnbF9jM3MsICAgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJjNGYiLCBnbF9jNGYsICAgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJjNGkiLCBnbF9jNGksICAgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJjNHMiLCBnbF9jNHMsICAgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJjb2xvcmYiLCBnbF9jb2xvcmYsICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJjcGFjayIsIGdsX2NwYWNrLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJjemNsZWFyIiwgZ2xfY3pjbGVhciwgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJkZ2xjbG9zZSIsIGdsX2RnbGNsb3NlLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJkZ2xvcGVuIiwgZ2xfZGdsb3BlbiwgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJnZXRnZGVzYyIsIGdsX2dldGdkZXNjLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJnZXRudXJic3Byb3BlcnR5IiwgZ2xfZ2V0bnVyYnNwcm9wZXJ0eSwgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdsY29tcGF0IiwgZ2xfZ2xjb21wYXQsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7Imljb25zaXplIiwgZ2xfaWNvbnNpemUsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7Imljb250aXRsZSIsIGdsX2ljb250aXRsZSwgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImxSR0JyYW5nZSIsIGdsX2xSR0JyYW5nZSwgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImxpbmVzbW9vdGgiLCBnbF9saW5lc21vb3RoLCAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImxtY29sb3IiLCBnbF9sbWNvbG9yLCAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImxvZ2ljb3AiLCBnbF9sb2dpY29wLCAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImxzZXRkZXB0aCIsIGdsX2xzZXRkZXB0aCwgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImxzaGFkZXJhbmdlIiwgZ2xfbHNoYWRlcmFuZ2UsICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7Im4zZiIsIGdsX24zZiwgICAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7Im5vYm9yZGVyIiwgZ2xfbm9ib3JkZXIsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InBudHNtb290aCIsIGdsX3BudHNtb290aCwgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InJlYWRzb3VyY2UiLCBnbF9yZWFkc291cmNlLCAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InJlY3R6b29tIiwgZ2xfcmVjdHpvb20sICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InNib3giLCBnbF9zYm94LCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InNib3hpIiwgZ2xfc2JveGksICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InNib3hzIiwgZ2xfc2JveHMsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InNib3hmIiwgZ2xfc2JveGYsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InNib3hmaSIsIGdsX3Nib3hmaSwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InNib3hmcyIsIGdsX3Nib3hmcywgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InNldG51cmJzcHJvcGVydHkiLCBnbF9zZXRudXJic3Byb3BlcnR5LCBNRVRIX09MREFSR1N9LAorICAgIHsic2V0cHVwIiwgZ2xfc2V0cHVwLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsic21vb3RobGluZSIsIGdsX3Ntb290aGxpbmUsICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsic3VicGl4ZWwiLCBnbF9zdWJwaXhlbCwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsic3dhcHRtZXNoIiwgZ2xfc3dhcHRtZXNoLCAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsic3dpbm9wZW4iLCBnbF9zd2lub3BlbiwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsidjJmIiwgZ2xfdjJmLCAgICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsidjJpIiwgZ2xfdjJpLCAgICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsidjJzIiwgZ2xfdjJzLCAgICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsidjNmIiwgZ2xfdjNmLCAgICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsidjNpIiwgZ2xfdjNpLCAgICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsidjNzIiwgZ2xfdjNzLCAgICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsidjRmIiwgZ2xfdjRmLCAgICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsidjRpIiwgZ2xfdjRpLCAgICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsidjRzIiwgZ2xfdjRzLCAgICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsidmlkZW9jbWQiLCBnbF92aWRlb2NtZCwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsid2luZGVwdGgiLCBnbF93aW5kZXB0aCwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsid21wYWNrIiwgZ2xfd21wYWNrLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiemRyYXciLCBnbF96ZHJhdywgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiemZ1bmN0aW9uIiwgZ2xfemZ1bmN0aW9uLCAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsienNvdXJjZSIsIGdsX3pzb3VyY2UsICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiendyaXRlbWFzayIsIGdsX3p3cml0ZW1hc2ssICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsidjJkIiwgZ2xfdjJkLCAgICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsidjNkIiwgZ2xfdjNkLCAgICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsidjRkIiwgZ2xfdjRkLCAgICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicGl4bW9kZSIsIGdsX3BpeG1vZGUsICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicWdldGZkIiwgZ2xfcWdldGZkLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiZGl0aGVyIiwgZ2xfZGl0aGVyLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHtOVUxMLCBOVUxMfSAvKiBTZW50aW5lbCAqLwogfTsKIAogdm9pZAogaW5pdGdsKHZvaWQpCiB7Ci0gICAgCisKICAgICBpZiAoUHlFcnJfV2FyblB5M2soInRoZSBnbCBtb2R1bGUgaGFzIGJlZW4gcmVtb3ZlZCBpbiAiCiAgICAgICAgICAgICAgICAgICAgICAgICJQeXRob24gMy4wIiwgMikgPCAwKQotICAgICAgICByZXR1cm47Ci0gICAgCi0JKHZvaWQpIFB5X0luaXRNb2R1bGUoImdsIiwgZ2xfbWV0aG9kcyk7CisgICAgcmV0dXJuOworCisgICAgKHZvaWQpIFB5X0luaXRNb2R1bGUoImdsIiwgZ2xfbWV0aG9kcyk7CiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL2ltYWdlb3AuYyBiL01vZHVsZXMvaW1hZ2VvcC5jCmluZGV4IDhkMGQ2OGYuLjhiZDExYjIgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvaW1hZ2VvcC5jCisrKyBiL01vZHVsZXMvaW1hZ2VvcC5jCkBAIC0zMywxMCArMzMsMTAgQEAKIHN0YXRpYyBpbnQKIGNoZWNrX2Nvb3Jkb25uYXRlKGludCB2YWx1ZSwgY29uc3QgY2hhciogbmFtZSkKIHsKLQlpZiAoIDAgPCB2YWx1ZSkKLQkJcmV0dXJuIDE7Ci0JUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsICIlcyB2YWx1ZSBpcyBuZWdhdGl2ZSBvciBudWwiLCBuYW1lKTsKLQlyZXR1cm4gMDsKKyAgICBpZiAoIDAgPCB2YWx1ZSkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsICIlcyB2YWx1ZSBpcyBuZWdhdGl2ZSBvciBudWwiLCBuYW1lKTsKKyAgICByZXR1cm4gMDsKIH0KIAogLyoqCkBAIC00NiwxNCArNDYsMTQgQEAKIHN0YXRpYyBpbnQKIGNoZWNrX211bHRpcGx5X3NpemUoaW50IHByb2R1Y3QsIGludCB4LCBjb25zdCBjaGFyKiB4bmFtZSwgaW50IHksIGNvbnN0IGNoYXIqIHluYW1lLCBpbnQgc2l6ZSkKIHsKLQlpZiAoICFjaGVja19jb29yZG9ubmF0ZSh4LCB4bmFtZSkgKQotCQlyZXR1cm4gMDsKLQlpZiAoICFjaGVja19jb29yZG9ubmF0ZSh5LCB5bmFtZSkgKQotCQlyZXR1cm4gMDsKLQlpZiAoIHNpemUgPT0gKHByb2R1Y3QgLyB5KSAvIHggKQotCQlyZXR1cm4gMTsKLQlQeUVycl9TZXRTdHJpbmcoSW1hZ2VvcEVycm9yLCAiU3RyaW5nIGhhcyBpbmNvcnJlY3QgbGVuZ3RoIik7Ci0JcmV0dXJuIDA7CisgICAgaWYgKCAhY2hlY2tfY29vcmRvbm5hdGUoeCwgeG5hbWUpICkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKCAhY2hlY2tfY29vcmRvbm5hdGUoeSwgeW5hbWUpICkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKCBzaXplID09IChwcm9kdWN0IC8geSkgLyB4ICkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgUHlFcnJfU2V0U3RyaW5nKEltYWdlb3BFcnJvciwgIlN0cmluZyBoYXMgaW5jb3JyZWN0IGxlbmd0aCIpOworICAgIHJldHVybiAwOwogfQogCiAvKioKQEAgLTYzLDcgKzYzLDcgQEAKIHN0YXRpYyBpbnQKIGNoZWNrX211bHRpcGx5KGludCBwcm9kdWN0LCBpbnQgeCwgaW50IHkpCiB7Ci0JcmV0dXJuIGNoZWNrX211bHRpcGx5X3NpemUocHJvZHVjdCwgeCwgIngiLCB5LCAieSIsIDEpOworICAgIHJldHVybiBjaGVja19tdWx0aXBseV9zaXplKHByb2R1Y3QsIHgsICJ4IiwgeSwgInkiLCAxKTsKIH0KIAogLyogSWYgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgKHRoZSBkZWZhdWx0IGlmIGFueXRoaW5nIGdvZXMgd3JvbmcpLCB3ZSdyZQpAQCAtODYsMTMxICs4NiwxMzEgQEAKIHN0YXRpYyBpbnQKIGltYWdlb3BfYmFja3dhcmRfY29tcGF0aWJsZSh2b2lkKQogewotCXN0YXRpYyBQeU9iamVjdCAqYmNvczsKLQlQeU9iamVjdCAqYmNvOwotCWxvbmcgcmM7CisgICAgc3RhdGljIFB5T2JqZWN0ICpiY29zOworICAgIFB5T2JqZWN0ICpiY287CisgICAgbG9uZyByYzsKIAotCWlmIChJbWFnZW9wRGljdCA9PSBOVUxMKSAvKiAiY2Fubm90IGhhcHBlbiIgKi8KLQkJcmV0dXJuIDE7Ci0JaWYgKGJjb3MgPT0gTlVMTCkgewotCQkvKiBjYWNoZSBzdHJpbmcgb2JqZWN0IGZvciBmdXR1cmUgdXNlICovCi0JCWJjb3MgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCJiYWNrd2FyZF9jb21wYXRpYmxlIik7Ci0JCWlmIChiY29zID09IE5VTEwpCi0JCQlyZXR1cm4gMTsKLQl9Ci0JYmNvID0gUHlEaWN0X0dldEl0ZW0oSW1hZ2VvcERpY3QsIGJjb3MpOwotCWlmIChiY28gPT0gTlVMTCkKLQkJcmV0dXJuIDE7Ci0JaWYgKCFQeUludF9DaGVjayhiY28pKQotCQlyZXR1cm4gMTsKLQlyYyA9IFB5SW50X0FzTG9uZyhiY28pOwotCWlmIChQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCS8qIG5vdCBhbiBpbnRlZ2VyLCBvciB0b28gbGFyZ2UsIG9yIHNvbWV0aGluZyAqLwotCQlQeUVycl9DbGVhcigpOwotCQlyYyA9IDE7Ci0JfQotCXJldHVybiByYyAhPSAwOwkJLyogY29udmVydCB0byB2YWx1ZXMgMCwgMSAqLworICAgIGlmIChJbWFnZW9wRGljdCA9PSBOVUxMKSAvKiAiY2Fubm90IGhhcHBlbiIgKi8KKyAgICAgICAgcmV0dXJuIDE7CisgICAgaWYgKGJjb3MgPT0gTlVMTCkgeworICAgICAgICAvKiBjYWNoZSBzdHJpbmcgb2JqZWN0IGZvciBmdXR1cmUgdXNlICovCisgICAgICAgIGJjb3MgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCJiYWNrd2FyZF9jb21wYXRpYmxlIik7CisgICAgICAgIGlmIChiY29zID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgYmNvID0gUHlEaWN0X0dldEl0ZW0oSW1hZ2VvcERpY3QsIGJjb3MpOworICAgIGlmIChiY28gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgaWYgKCFQeUludF9DaGVjayhiY28pKQorICAgICAgICByZXR1cm4gMTsKKyAgICByYyA9IFB5SW50X0FzTG9uZyhiY28pOworICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgIC8qIG5vdCBhbiBpbnRlZ2VyLCBvciB0b28gbGFyZ2UsIG9yIHNvbWV0aGluZyAqLworICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICByYyA9IDE7CisgICAgfQorICAgIHJldHVybiByYyAhPSAwOyAgICAgICAgICAgICAvKiBjb252ZXJ0IHRvIHZhbHVlcyAwLCAxICovCiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbWFnZW9wX2Nyb3AoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKmNwLCAqbmNwOwotCXNob3J0ICpuc3A7Ci0JUHlfSW50MzIgKm5scDsKLQlpbnQgbGVuLCBzaXplLCB4LCB5LCBuZXd4MSwgbmV3eDIsIG5ld3kxLCBuZXd5MiwgbmxlbjsKLQlpbnQgaXgsIGl5LCB4c3RlcCwgeXN0ZXA7Ci0JUHlPYmplY3QgKnJ2OworICAgIGNoYXIgKmNwLCAqbmNwOworICAgIHNob3J0ICpuc3A7CisgICAgUHlfSW50MzIgKm5scDsKKyAgICBpbnQgbGVuLCBzaXplLCB4LCB5LCBuZXd4MSwgbmV3eDIsIG5ld3kxLCBuZXd5MiwgbmxlbjsKKyAgICBpbnQgaXgsIGl5LCB4c3RlcCwgeXN0ZXA7CisgICAgUHlPYmplY3QgKnJ2OwogCi0JaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyNpaWlpaWlpIiwgJmNwLCAmbGVuLCAmc2l6ZSwgJngsICZ5LAotCQkJICAmbmV3eDEsICZuZXd5MSwgJm5ld3gyLCAmbmV3eTIpICkKLQkJcmV0dXJuIDA7CisgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyNpaWlpaWlpIiwgJmNwLCAmbGVuLCAmc2l6ZSwgJngsICZ5LAorICAgICAgICAgICAgICAgICAgICAgICZuZXd4MSwgJm5ld3kxLCAmbmV3eDIsICZuZXd5MikgKQorICAgICAgICByZXR1cm4gMDsKIAotCWlmICggc2l6ZSAhPSAxICYmIHNpemUgIT0gMiAmJiBzaXplICE9IDQgKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhJbWFnZW9wRXJyb3IsICJTaXplIHNob3VsZCBiZSAxLCAyIG9yIDQiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCWlmICggIWNoZWNrX211bHRpcGx5X3NpemUobGVuLCB4LCAieCIsIHksICJ5Iiwgc2l6ZSkgKQotCQlyZXR1cm4gMDsKKyAgICBpZiAoIHNpemUgIT0gMSAmJiBzaXplICE9IDIgJiYgc2l6ZSAhPSA0ICkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoSW1hZ2VvcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoICFjaGVja19tdWx0aXBseV9zaXplKGxlbiwgeCwgIngiLCB5LCAieSIsIHNpemUpICkKKyAgICAgICAgcmV0dXJuIDA7CiAKLQl4c3RlcCA9IChuZXd4MSA8IG5ld3gyKT8gMSA6IC0xOwotCXlzdGVwID0gKG5ld3kxIDwgbmV3eTIpPyAxIDogLTE7CisgICAgeHN0ZXAgPSAobmV3eDEgPCBuZXd4Mik/IDEgOiAtMTsKKyAgICB5c3RlcCA9IChuZXd5MSA8IG5ld3kyKT8gMSA6IC0xOwogCi0gICAgICAgIG5sZW4gPSAoYWJzKG5ld3gyLW5ld3gxKSsxKSooYWJzKG5ld3kyLW5ld3kxKSsxKSpzaXplOwotCWlmICggIWNoZWNrX211bHRpcGx5X3NpemUobmxlbiwgYWJzKG5ld3gyLW5ld3gxKSsxLCAiYWJzKG5ld3gyLW5ld3gxKSsxIiwgYWJzKG5ld3kyLW5ld3kxKSsxLCAiYWJzKG5ld3kyLW5ld3kxKSsxIiwgc2l6ZSkgKQotCQlyZXR1cm4gMDsKLQlydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIG5sZW4pOwotCWlmICggcnYgPT0gMCApCi0JCXJldHVybiAwOwotCW5jcCA9IChjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpOwotCW5zcCA9IChzaG9ydCAqKW5jcDsKLQlubHAgPSAoUHlfSW50MzIgKiluY3A7Ci0JbmV3eTIgKz0geXN0ZXA7Ci0JbmV3eDIgKz0geHN0ZXA7Ci0JZm9yKCBpeSA9IG5ld3kxOyBpeSAhPSBuZXd5MjsgaXkrPXlzdGVwICkgewotCQlmb3IgKCBpeCA9IG5ld3gxOyBpeCAhPSBuZXd4MjsgaXgrPXhzdGVwICkgewotCQkJaWYgKCBpeSA8IDAgfHwgaXkgPj0geSB8fCBpeCA8IDAgfHwgaXggPj0geCApIHsKLQkJCQlpZiAoIHNpemUgPT0gMSApCi0JCQkJCSpuY3ArKyA9IDA7Ci0JCQkJZWxzZQotCQkJCQkqbmxwKysgPSAwOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoIHNpemUgPT0gMSApCi0JCQkJCSpuY3ArKyA9ICpDSEFSUChjcCwgeCwgaXgsIGl5KTsKLQkJCQllbHNlIGlmICggc2l6ZSA9PSAyICkKLQkJCQkJKm5zcCsrID0gKlNIT1JUUChjcCwgeCwgaXgsIGl5KTsKLQkJCQllbHNlCi0JCQkJCSpubHArKyA9ICpMT05HUChjcCwgeCwgaXgsIGl5KTsKLQkJCX0KLQkJfQotCX0KLQlyZXR1cm4gcnY7CisgICAgbmxlbiA9IChhYnMobmV3eDItbmV3eDEpKzEpKihhYnMobmV3eTItbmV3eTEpKzEpKnNpemU7CisgICAgaWYgKCAhY2hlY2tfbXVsdGlwbHlfc2l6ZShubGVuLCBhYnMobmV3eDItbmV3eDEpKzEsICJhYnMobmV3eDItbmV3eDEpKzEiLCBhYnMobmV3eTItbmV3eTEpKzEsICJhYnMobmV3eTItbmV3eTEpKzEiLCBzaXplKSApCisgICAgICAgIHJldHVybiAwOworICAgIHJ2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbmxlbik7CisgICAgaWYgKCBydiA9PSAwICkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgbmNwID0gKGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhydik7CisgICAgbnNwID0gKHNob3J0ICopbmNwOworICAgIG5scCA9IChQeV9JbnQzMiAqKW5jcDsKKyAgICBuZXd5MiArPSB5c3RlcDsKKyAgICBuZXd4MiArPSB4c3RlcDsKKyAgICBmb3IoIGl5ID0gbmV3eTE7IGl5ICE9IG5ld3kyOyBpeSs9eXN0ZXAgKSB7CisgICAgICAgIGZvciAoIGl4ID0gbmV3eDE7IGl4ICE9IG5ld3gyOyBpeCs9eHN0ZXAgKSB7CisgICAgICAgICAgICBpZiAoIGl5IDwgMCB8fCBpeSA+PSB5IHx8IGl4IDwgMCB8fCBpeCA+PSB4ICkgeworICAgICAgICAgICAgICAgIGlmICggc2l6ZSA9PSAxICkKKyAgICAgICAgICAgICAgICAgICAgKm5jcCsrID0gMDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICpubHArKyA9IDA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICggc2l6ZSA9PSAxICkKKyAgICAgICAgICAgICAgICAgICAgKm5jcCsrID0gKkNIQVJQKGNwLCB4LCBpeCwgaXkpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKQorICAgICAgICAgICAgICAgICAgICAqbnNwKysgPSAqU0hPUlRQKGNwLCB4LCBpeCwgaXkpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgKm5scCsrID0gKkxPTkdQKGNwLCB4LCBpeCwgaXkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBydjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGltYWdlb3Bfc2NhbGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKmNwLCAqbmNwOwotCXNob3J0ICpuc3A7Ci0JUHlfSW50MzIgKm5scDsKLQlpbnQgbGVuLCBzaXplLCB4LCB5LCBuZXd4LCBuZXd5LCBubGVuOwotCWludCBpeCwgaXk7Ci0JaW50IG9peCwgb2l5OwotCVB5T2JqZWN0ICpydjsKKyAgICBjaGFyICpjcCwgKm5jcDsKKyAgICBzaG9ydCAqbnNwOworICAgIFB5X0ludDMyICpubHA7CisgICAgaW50IGxlbiwgc2l6ZSwgeCwgeSwgbmV3eCwgbmV3eSwgbmxlbjsKKyAgICBpbnQgaXgsIGl5OworICAgIGludCBvaXgsIG9peTsKKyAgICBQeU9iamVjdCAqcnY7CiAKLQlpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI2lpaWlpIiwKLQkJCSAgJmNwLCAmbGVuLCAmc2l6ZSwgJngsICZ5LCAmbmV3eCwgJm5ld3kpICkKLQkJcmV0dXJuIDA7CisgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyNpaWlpaSIsCisgICAgICAgICAgICAgICAgICAgICAgJmNwLCAmbGVuLCAmc2l6ZSwgJngsICZ5LCAmbmV3eCwgJm5ld3kpICkKKyAgICAgICAgcmV0dXJuIDA7CiAKLQlpZiAoIHNpemUgIT0gMSAmJiBzaXplICE9IDIgJiYgc2l6ZSAhPSA0ICkgewotCQlQeUVycl9TZXRTdHJpbmcoSW1hZ2VvcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7Ci0JCXJldHVybiAwOwotCX0KLQlpZiAoICFjaGVja19tdWx0aXBseV9zaXplKGxlbiwgeCwgIngiLCB5LCAieSIsIHNpemUpICkKLQkJcmV0dXJuIDA7Ci0gICAgICAgIG5sZW4gPSBuZXd4Km5ld3kqc2l6ZTsKLQlpZiAoICFjaGVja19tdWx0aXBseV9zaXplKG5sZW4sIG5ld3gsICJuZXd4IiwgbmV3eSwgIm5ld3kiLCBzaXplKSApCi0JCXJldHVybiAwOworICAgIGlmICggc2l6ZSAhPSAxICYmIHNpemUgIT0gMiAmJiBzaXplICE9IDQgKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhJbWFnZW9wRXJyb3IsICJTaXplIHNob3VsZCBiZSAxLCAyIG9yIDQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmICggIWNoZWNrX211bHRpcGx5X3NpemUobGVuLCB4LCAieCIsIHksICJ5Iiwgc2l6ZSkgKQorICAgICAgICByZXR1cm4gMDsKKyAgICBubGVuID0gbmV3eCpuZXd5KnNpemU7CisgICAgaWYgKCAhY2hlY2tfbXVsdGlwbHlfc2l6ZShubGVuLCBuZXd4LCAibmV3eCIsIG5ld3ksICJuZXd5Iiwgc2l6ZSkgKQorICAgICAgICByZXR1cm4gMDsKIAotCXJ2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbmxlbik7Ci0JaWYgKCBydiA9PSAwICkKLQkJcmV0dXJuIDA7Ci0JbmNwID0gKGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhydik7Ci0JbnNwID0gKHNob3J0ICopbmNwOwotCW5scCA9IChQeV9JbnQzMiAqKW5jcDsKLQlmb3IoIGl5ID0gMDsgaXkgPCBuZXd5OyBpeSsrICkgewotCQlmb3IgKCBpeCA9IDA7IGl4IDwgbmV3eDsgaXgrKyApIHsKLQkJCW9peCA9IGl4ICogeCAvIG5ld3g7Ci0JCQlvaXkgPSBpeSAqIHkgLyBuZXd5OwotCQkJaWYgKCBzaXplID09IDEgKQotCQkJCSpuY3ArKyA9ICpDSEFSUChjcCwgeCwgb2l4LCBvaXkpOwotCQkJZWxzZSBpZiAoIHNpemUgPT0gMiApCi0JCQkJKm5zcCsrID0gKlNIT1JUUChjcCwgeCwgb2l4LCBvaXkpOwotCQkJZWxzZQotCQkJCSpubHArKyA9ICpMT05HUChjcCwgeCwgb2l4LCBvaXkpOwotCQl9Ci0JfQotCXJldHVybiBydjsKKyAgICBydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIG5sZW4pOworICAgIGlmICggcnYgPT0gMCApCisgICAgICAgIHJldHVybiAwOworICAgIG5jcCA9IChjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpOworICAgIG5zcCA9IChzaG9ydCAqKW5jcDsKKyAgICBubHAgPSAoUHlfSW50MzIgKiluY3A7CisgICAgZm9yKCBpeSA9IDA7IGl5IDwgbmV3eTsgaXkrKyApIHsKKyAgICAgICAgZm9yICggaXggPSAwOyBpeCA8IG5ld3g7IGl4KysgKSB7CisgICAgICAgICAgICBvaXggPSBpeCAqIHggLyBuZXd4OworICAgICAgICAgICAgb2l5ID0gaXkgKiB5IC8gbmV3eTsKKyAgICAgICAgICAgIGlmICggc2l6ZSA9PSAxICkKKyAgICAgICAgICAgICAgICAqbmNwKysgPSAqQ0hBUlAoY3AsIHgsIG9peCwgb2l5KTsKKyAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKQorICAgICAgICAgICAgICAgICpuc3ArKyA9ICpTSE9SVFAoY3AsIHgsIG9peCwgb2l5KTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAqbmxwKysgPSAqTE9OR1AoY3AsIHgsIG9peCwgb2l5KTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcnY7CiB9CiAKIC8qIE5vdGU6IHRoaXMgcm91dGluZSBjYW4gdXNlIGEgYml0IG9mIG9wdGltaXppbmcgKi8KQEAgLTIxOCw1NzcgKzIxOCw1NzcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbWFnZW9wX3RvdmlkZW8oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBtYXh4LCBtYXh5LCB4LCB5LCBsZW47Ci0JaW50IGk7Ci0JdW5zaWduZWQgY2hhciAqY3AsICpuY3A7Ci0JaW50IHdpZHRoOwotCVB5T2JqZWN0ICpydjsKKyAgICBpbnQgbWF4eCwgbWF4eSwgeCwgeSwgbGVuOworICAgIGludCBpOworICAgIHVuc2lnbmVkIGNoYXIgKmNwLCAqbmNwOworICAgIGludCB3aWR0aDsKKyAgICBQeU9iamVjdCAqcnY7CiAKIAotCWlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjaWlpIiwgJmNwLCAmbGVuLCAmd2lkdGgsICZtYXh4LCAmbWF4eSkgKQotCQlyZXR1cm4gMDsKKyAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI2lpaSIsICZjcCwgJmxlbiwgJndpZHRoLCAmbWF4eCwgJm1heHkpICkKKyAgICAgICAgcmV0dXJuIDA7CiAKLQlpZiAoIHdpZHRoICE9IDEgJiYgd2lkdGggIT0gNCApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKEltYWdlb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEgb3IgNCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKCAhY2hlY2tfbXVsdGlwbHlfc2l6ZShsZW4sIG1heHgsICJtYXgiLCBtYXh5LCAibWF4eSIsIHdpZHRoKSApCi0JCXJldHVybiAwOworICAgIGlmICggd2lkdGggIT0gMSAmJiB3aWR0aCAhPSA0ICkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoSW1hZ2VvcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSBvciA0Iik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoICFjaGVja19tdWx0aXBseV9zaXplKGxlbiwgbWF4eCwgIm1heCIsIG1heHksICJtYXh5Iiwgd2lkdGgpICkKKyAgICAgICAgcmV0dXJuIDA7CiAKLQlydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGxlbik7Ci0JaWYgKCBydiA9PSAwICkKLQkJcmV0dXJuIDA7Ci0JbmNwID0gKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhydik7CisgICAgcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBsZW4pOworICAgIGlmICggcnYgPT0gMCApCisgICAgICAgIHJldHVybiAwOworICAgIG5jcCA9ICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpOwogCi0JaWYgKCB3aWR0aCA9PSAxICkgewotCQltZW1jcHkobmNwLCBjcCwgbWF4eCk7CQkvKiBDb3B5IGZpcnN0IGxpbmUgKi8KLQkJbmNwICs9IG1heHg7Ci0JCWZvciAoeT0xOyB5PG1heHk7IHkrKykgewkvKiBJbnRlcnBvbGF0ZSBvdGhlciBsaW5lcyAqLwotCQkJZm9yKHg9MDsgeDxtYXh4OyB4KyspIHsKLQkJCQlpID0geSptYXh4ICsgeDsKLQkJCQkqbmNwKysgPSAoKGludCljcFtpXSArIChpbnQpY3BbaS1tYXh4XSkgPj4gMTsKLQkJCX0KLQkJfQotCX0gZWxzZSB7Ci0JCW1lbWNweShuY3AsIGNwLCBtYXh4KjQpOwkJLyogQ29weSBmaXJzdCBsaW5lICovCi0JCW5jcCArPSBtYXh4KjQ7Ci0JCWZvciAoeT0xOyB5PG1heHk7IHkrKykgewkvKiBJbnRlcnBvbGF0ZSBvdGhlciBsaW5lcyAqLwotCQkJZm9yKHg9MDsgeDxtYXh4OyB4KyspIHsKLQkJCQlpID0gKHkqbWF4eCArIHgpKjQgKyAxOwotCQkJCSpuY3ArKyA9IDA7CS8qIFNraXAgYWxmYSBjb21wICovCi0JCQkJKm5jcCsrID0gKChpbnQpY3BbaV0gKyAoaW50KWNwW2ktNCptYXh4XSkgPj4gMTsKLQkJCQlpKys7Ci0JCQkJKm5jcCsrID0gKChpbnQpY3BbaV0gKyAoaW50KWNwW2ktNCptYXh4XSkgPj4gMTsKLQkJCQlpKys7Ci0JCQkJKm5jcCsrID0gKChpbnQpY3BbaV0gKyAoaW50KWNwW2ktNCptYXh4XSkgPj4gMTsKLQkJCX0KLQkJfQotCX0KLQlyZXR1cm4gcnY7CisgICAgaWYgKCB3aWR0aCA9PSAxICkgeworICAgICAgICBtZW1jcHkobmNwLCBjcCwgbWF4eCk7ICAgICAgICAgICAgICAgICAgLyogQ29weSBmaXJzdCBsaW5lICovCisgICAgICAgIG5jcCArPSBtYXh4OworICAgICAgICBmb3IgKHk9MTsgeTxtYXh5OyB5KyspIHsgICAgICAgICAgICAgICAgLyogSW50ZXJwb2xhdGUgb3RoZXIgbGluZXMgKi8KKyAgICAgICAgICAgIGZvcih4PTA7IHg8bWF4eDsgeCsrKSB7CisgICAgICAgICAgICAgICAgaSA9IHkqbWF4eCArIHg7CisgICAgICAgICAgICAgICAgKm5jcCsrID0gKChpbnQpY3BbaV0gKyAoaW50KWNwW2ktbWF4eF0pID4+IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBtZW1jcHkobmNwLCBjcCwgbWF4eCo0KTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb3B5IGZpcnN0IGxpbmUgKi8KKyAgICAgICAgbmNwICs9IG1heHgqNDsKKyAgICAgICAgZm9yICh5PTE7IHk8bWF4eTsgeSsrKSB7ICAgICAgICAgICAgICAgIC8qIEludGVycG9sYXRlIG90aGVyIGxpbmVzICovCisgICAgICAgICAgICBmb3IoeD0wOyB4PG1heHg7IHgrKykgeworICAgICAgICAgICAgICAgIGkgPSAoeSptYXh4ICsgeCkqNCArIDE7CisgICAgICAgICAgICAgICAgKm5jcCsrID0gMDsgICAgICAgICAgICAgICAgICAgICAvKiBTa2lwIGFsZmEgY29tcCAqLworICAgICAgICAgICAgICAgICpuY3ArKyA9ICgoaW50KWNwW2ldICsgKGludCljcFtpLTQqbWF4eF0pID4+IDE7CisgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgICpuY3ArKyA9ICgoaW50KWNwW2ldICsgKGludCljcFtpLTQqbWF4eF0pID4+IDE7CisgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgICpuY3ArKyA9ICgoaW50KWNwW2ldICsgKGludCljcFtpLTQqbWF4eF0pID4+IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJ2OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaW1hZ2VvcF9ncmV5Mm1vbm8oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCB0cmVzLCB4LCB5LCBsZW47Ci0JdW5zaWduZWQgY2hhciAqY3AsICpuY3A7Ci0JdW5zaWduZWQgY2hhciBvdmFsdWU7Ci0JUHlPYmplY3QgKnJ2OwotCWludCBpLCBiaXQ7CisgICAgaW50IHRyZXMsIHgsIHksIGxlbjsKKyAgICB1bnNpZ25lZCBjaGFyICpjcCwgKm5jcDsKKyAgICB1bnNpZ25lZCBjaGFyIG92YWx1ZTsKKyAgICBQeU9iamVjdCAqcnY7CisgICAgaW50IGksIGJpdDsKIAogCi0JaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyNpaWkiLCAmY3AsICZsZW4sICZ4LCAmeSwgJnRyZXMpICkKLQkJcmV0dXJuIDA7CisgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyNpaWkiLCAmY3AsICZsZW4sICZ4LCAmeSwgJnRyZXMpICkKKyAgICAgICAgcmV0dXJuIDA7CiAKLQlpZiAoICFjaGVja19tdWx0aXBseShsZW4sIHgsIHkpICkKLQkJcmV0dXJuIDA7CisgICAgaWYgKCAhY2hlY2tfbXVsdGlwbHkobGVuLCB4LCB5KSApCisgICAgICAgIHJldHVybiAwOwogCi0JcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCAobGVuKzcpLzgpOwotCWlmICggcnYgPT0gMCApCi0JCXJldHVybiAwOwotCW5jcCA9ICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpOworICAgIHJ2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgKGxlbis3KS84KTsKKyAgICBpZiAoIHJ2ID09IDAgKQorICAgICAgICByZXR1cm4gMDsKKyAgICBuY3AgPSAodW5zaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKIAotCWJpdCA9IDB4ODA7Ci0Jb3ZhbHVlID0gMDsKLQlmb3IgKCBpPTA7IGkgPCBsZW47IGkrKyApIHsKLQkJaWYgKCAoaW50KWNwW2ldID4gdHJlcyApCi0JCQlvdmFsdWUgfD0gYml0OwotCQliaXQgPj49IDE7Ci0JCWlmICggYml0ID09IDAgKSB7Ci0JCQkqbmNwKysgPSBvdmFsdWU7Ci0JCQliaXQgPSAweDgwOwotCQkJb3ZhbHVlID0gMDsKLQkJfQotCX0KLQlpZiAoIGJpdCAhPSAweDgwICkKLQkJKm5jcCsrID0gb3ZhbHVlOwotCXJldHVybiBydjsKKyAgICBiaXQgPSAweDgwOworICAgIG92YWx1ZSA9IDA7CisgICAgZm9yICggaT0wOyBpIDwgbGVuOyBpKysgKSB7CisgICAgICAgIGlmICggKGludCljcFtpXSA+IHRyZXMgKQorICAgICAgICAgICAgb3ZhbHVlIHw9IGJpdDsKKyAgICAgICAgYml0ID4+PSAxOworICAgICAgICBpZiAoIGJpdCA9PSAwICkgeworICAgICAgICAgICAgKm5jcCsrID0gb3ZhbHVlOworICAgICAgICAgICAgYml0ID0gMHg4MDsKKyAgICAgICAgICAgIG92YWx1ZSA9IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCBiaXQgIT0gMHg4MCApCisgICAgICAgICpuY3ArKyA9IG92YWx1ZTsKKyAgICByZXR1cm4gcnY7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbWFnZW9wX2dyZXkyZ3JleTQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCB4LCB5LCBsZW47Ci0JdW5zaWduZWQgY2hhciAqY3AsICpuY3A7Ci0JdW5zaWduZWQgY2hhciBvdmFsdWU7Ci0JUHlPYmplY3QgKnJ2OwotCWludCBpOwotCWludCBwb3M7CisgICAgaW50IHgsIHksIGxlbjsKKyAgICB1bnNpZ25lZCBjaGFyICpjcCwgKm5jcDsKKyAgICB1bnNpZ25lZCBjaGFyIG92YWx1ZTsKKyAgICBQeU9iamVjdCAqcnY7CisgICAgaW50IGk7CisgICAgaW50IHBvczsKIAogCi0JaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyNpaSIsICZjcCwgJmxlbiwgJngsICZ5KSApCi0JCXJldHVybiAwOworICAgIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjaWkiLCAmY3AsICZsZW4sICZ4LCAmeSkgKQorICAgICAgICByZXR1cm4gMDsKIAotCWlmICggIWNoZWNrX211bHRpcGx5KGxlbiwgeCwgeSkgKQotCQlyZXR1cm4gMDsKKyAgICBpZiAoICFjaGVja19tdWx0aXBseShsZW4sIHgsIHkpICkKKyAgICAgICAgcmV0dXJuIDA7CiAKLQlydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIChsZW4rMSkvMik7Ci0JaWYgKCBydiA9PSAwICkKLQkJcmV0dXJuIDA7Ci0JbmNwID0gKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhydik7Ci0JcG9zID0gMDsKLQlvdmFsdWUgPSAwOwotCWZvciAoIGk9MDsgaSA8IGxlbjsgaSsrICkgewotCQlvdmFsdWUgfD0gKChpbnQpY3BbaV0gJiAweGYwKSA+PiBwb3M7Ci0JCXBvcyArPSA0OwotCQlpZiAoIHBvcyA9PSA4ICkgewotCQkJKm5jcCsrID0gb3ZhbHVlOwotCQkJb3ZhbHVlID0gMDsKLQkJCXBvcyA9IDA7Ci0JCX0KLQl9Ci0JaWYgKCBwb3MgIT0gMCApCi0JCSpuY3ArKyA9IG92YWx1ZTsKLQlyZXR1cm4gcnY7CisgICAgcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCAobGVuKzEpLzIpOworICAgIGlmICggcnYgPT0gMCApCisgICAgICAgIHJldHVybiAwOworICAgIG5jcCA9ICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpOworICAgIHBvcyA9IDA7CisgICAgb3ZhbHVlID0gMDsKKyAgICBmb3IgKCBpPTA7IGkgPCBsZW47IGkrKyApIHsKKyAgICAgICAgb3ZhbHVlIHw9ICgoaW50KWNwW2ldICYgMHhmMCkgPj4gcG9zOworICAgICAgICBwb3MgKz0gNDsKKyAgICAgICAgaWYgKCBwb3MgPT0gOCApIHsKKyAgICAgICAgICAgICpuY3ArKyA9IG92YWx1ZTsKKyAgICAgICAgICAgIG92YWx1ZSA9IDA7CisgICAgICAgICAgICBwb3MgPSAwOworICAgICAgICB9CisgICAgfQorICAgIGlmICggcG9zICE9IDAgKQorICAgICAgICAqbmNwKysgPSBvdmFsdWU7CisgICAgcmV0dXJuIHJ2OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaW1hZ2VvcF9ncmV5MmdyZXkyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgeCwgeSwgbGVuOwotCXVuc2lnbmVkIGNoYXIgKmNwLCAqbmNwOwotCXVuc2lnbmVkIGNoYXIgb3ZhbHVlOwotCVB5T2JqZWN0ICpydjsKLQlpbnQgaTsKLQlpbnQgcG9zOworICAgIGludCB4LCB5LCBsZW47CisgICAgdW5zaWduZWQgY2hhciAqY3AsICpuY3A7CisgICAgdW5zaWduZWQgY2hhciBvdmFsdWU7CisgICAgUHlPYmplY3QgKnJ2OworICAgIGludCBpOworICAgIGludCBwb3M7CiAKIAotCWlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjaWkiLCAmY3AsICZsZW4sICZ4LCAmeSkgKQotCQlyZXR1cm4gMDsKKyAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI2lpIiwgJmNwLCAmbGVuLCAmeCwgJnkpICkKKyAgICAgICAgcmV0dXJuIDA7CiAKLQlpZiAoICFjaGVja19tdWx0aXBseShsZW4sIHgsIHkpICkKLQkJcmV0dXJuIDA7CisgICAgaWYgKCAhY2hlY2tfbXVsdGlwbHkobGVuLCB4LCB5KSApCisgICAgICAgIHJldHVybiAwOwogCi0JcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCAobGVuKzMpLzQpOwotCWlmICggcnYgPT0gMCApCi0JCXJldHVybiAwOwotCW5jcCA9ICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpOwotCXBvcyA9IDA7Ci0Jb3ZhbHVlID0gMDsKLQlmb3IgKCBpPTA7IGkgPCBsZW47IGkrKyApIHsKLQkJb3ZhbHVlIHw9ICgoaW50KWNwW2ldICYgMHhjMCkgPj4gcG9zOwotCQlwb3MgKz0gMjsKLQkJaWYgKCBwb3MgPT0gOCApIHsKLQkJCSpuY3ArKyA9IG92YWx1ZTsKLQkJCW92YWx1ZSA9IDA7Ci0JCQlwb3MgPSAwOwotCQl9Ci0JfQotCWlmICggcG9zICE9IDAgKQotCQkqbmNwKysgPSBvdmFsdWU7Ci0JcmV0dXJuIHJ2OworICAgIHJ2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgKGxlbiszKS80KTsKKyAgICBpZiAoIHJ2ID09IDAgKQorICAgICAgICByZXR1cm4gMDsKKyAgICBuY3AgPSAodW5zaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKKyAgICBwb3MgPSAwOworICAgIG92YWx1ZSA9IDA7CisgICAgZm9yICggaT0wOyBpIDwgbGVuOyBpKysgKSB7CisgICAgICAgIG92YWx1ZSB8PSAoKGludCljcFtpXSAmIDB4YzApID4+IHBvczsKKyAgICAgICAgcG9zICs9IDI7CisgICAgICAgIGlmICggcG9zID09IDggKSB7CisgICAgICAgICAgICAqbmNwKysgPSBvdmFsdWU7CisgICAgICAgICAgICBvdmFsdWUgPSAwOworICAgICAgICAgICAgcG9zID0gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIHBvcyAhPSAwICkKKyAgICAgICAgKm5jcCsrID0gb3ZhbHVlOworICAgIHJldHVybiBydjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGltYWdlb3BfZGl0aGVyMm1vbm8oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBzdW0sIHgsIHksIGxlbjsKLQl1bnNpZ25lZCBjaGFyICpjcCwgKm5jcDsKLQl1bnNpZ25lZCBjaGFyIG92YWx1ZTsKLQlQeU9iamVjdCAqcnY7Ci0JaW50IGksIGJpdDsKKyAgICBpbnQgc3VtLCB4LCB5LCBsZW47CisgICAgdW5zaWduZWQgY2hhciAqY3AsICpuY3A7CisgICAgdW5zaWduZWQgY2hhciBvdmFsdWU7CisgICAgUHlPYmplY3QgKnJ2OworICAgIGludCBpLCBiaXQ7CiAKIAotCWlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjaWkiLCAmY3AsICZsZW4sICZ4LCAmeSkgKQotCQlyZXR1cm4gMDsKKyAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI2lpIiwgJmNwLCAmbGVuLCAmeCwgJnkpICkKKyAgICAgICAgcmV0dXJuIDA7CiAKLQlpZiAoICFjaGVja19tdWx0aXBseShsZW4sIHgsIHkpICkKLQkJcmV0dXJuIDA7CisgICAgaWYgKCAhY2hlY2tfbXVsdGlwbHkobGVuLCB4LCB5KSApCisgICAgICAgIHJldHVybiAwOwogCi0JcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCAobGVuKzcpLzgpOwotCWlmICggcnYgPT0gMCApCi0JCXJldHVybiAwOwotCW5jcCA9ICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpOworICAgIHJ2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgKGxlbis3KS84KTsKKyAgICBpZiAoIHJ2ID09IDAgKQorICAgICAgICByZXR1cm4gMDsKKyAgICBuY3AgPSAodW5zaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKIAotCWJpdCA9IDB4ODA7Ci0Jb3ZhbHVlID0gMDsKLQlzdW0gPSAwOwotCWZvciAoIGk9MDsgaSA8IGxlbjsgaSsrICkgewotCQlzdW0gKz0gY3BbaV07Ci0JCWlmICggc3VtID49IDI1NiApIHsKLQkJCXN1bSAtPSAyNTY7Ci0JCQlvdmFsdWUgfD0gYml0OwotCQl9Ci0JCWJpdCA+Pj0gMTsKLQkJaWYgKCBiaXQgPT0gMCApIHsKLQkJCSpuY3ArKyA9IG92YWx1ZTsKLQkJCWJpdCA9IDB4ODA7Ci0JCQlvdmFsdWUgPSAwOwotCQl9Ci0JfQotCWlmICggYml0ICE9IDB4ODAgKQotCQkqbmNwKysgPSBvdmFsdWU7Ci0JcmV0dXJuIHJ2OworICAgIGJpdCA9IDB4ODA7CisgICAgb3ZhbHVlID0gMDsKKyAgICBzdW0gPSAwOworICAgIGZvciAoIGk9MDsgaSA8IGxlbjsgaSsrICkgeworICAgICAgICBzdW0gKz0gY3BbaV07CisgICAgICAgIGlmICggc3VtID49IDI1NiApIHsKKyAgICAgICAgICAgIHN1bSAtPSAyNTY7CisgICAgICAgICAgICBvdmFsdWUgfD0gYml0OworICAgICAgICB9CisgICAgICAgIGJpdCA+Pj0gMTsKKyAgICAgICAgaWYgKCBiaXQgPT0gMCApIHsKKyAgICAgICAgICAgICpuY3ArKyA9IG92YWx1ZTsKKyAgICAgICAgICAgIGJpdCA9IDB4ODA7CisgICAgICAgICAgICBvdmFsdWUgPSAwOworICAgICAgICB9CisgICAgfQorICAgIGlmICggYml0ICE9IDB4ODAgKQorICAgICAgICAqbmNwKysgPSBvdmFsdWU7CisgICAgcmV0dXJuIHJ2OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaW1hZ2VvcF9kaXRoZXIyZ3JleTIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCB4LCB5LCBsZW47Ci0JdW5zaWduZWQgY2hhciAqY3AsICpuY3A7Ci0JdW5zaWduZWQgY2hhciBvdmFsdWU7Ci0JUHlPYmplY3QgKnJ2OwotCWludCBpOwotCWludCBwb3M7Ci0JaW50IHN1bSA9IDAsIG52YWx1ZTsKKyAgICBpbnQgeCwgeSwgbGVuOworICAgIHVuc2lnbmVkIGNoYXIgKmNwLCAqbmNwOworICAgIHVuc2lnbmVkIGNoYXIgb3ZhbHVlOworICAgIFB5T2JqZWN0ICpydjsKKyAgICBpbnQgaTsKKyAgICBpbnQgcG9zOworICAgIGludCBzdW0gPSAwLCBudmFsdWU7CiAKIAotCWlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjaWkiLCAmY3AsICZsZW4sICZ4LCAmeSkgKQotCQlyZXR1cm4gMDsKKyAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI2lpIiwgJmNwLCAmbGVuLCAmeCwgJnkpICkKKyAgICAgICAgcmV0dXJuIDA7CiAKLQlpZiAoICFjaGVja19tdWx0aXBseShsZW4sIHgsIHkpICkKLQkJcmV0dXJuIDA7CisgICAgaWYgKCAhY2hlY2tfbXVsdGlwbHkobGVuLCB4LCB5KSApCisgICAgICAgIHJldHVybiAwOwogCi0JcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCAobGVuKzMpLzQpOwotCWlmICggcnYgPT0gMCApCi0JCXJldHVybiAwOwotCW5jcCA9ICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpOwotCXBvcyA9IDE7Ci0Jb3ZhbHVlID0gMDsKLQlmb3IgKCBpPTA7IGkgPCBsZW47IGkrKyApIHsKLQkJc3VtICs9IGNwW2ldOwotCQludmFsdWUgPSBzdW0gJiAweDE4MDsKLQkJc3VtIC09IG52YWx1ZTsKLQkJb3ZhbHVlIHw9IG52YWx1ZSA+PiBwb3M7Ci0JCXBvcyArPSAyOwotCQlpZiAoIHBvcyA9PSA5ICkgewotCQkJKm5jcCsrID0gb3ZhbHVlOwotCQkJb3ZhbHVlID0gMDsKLQkJCXBvcyA9IDE7Ci0JCX0KLQl9Ci0JaWYgKCBwb3MgIT0gMCApCi0JCSpuY3ArKyA9IG92YWx1ZTsKLQlyZXR1cm4gcnY7CisgICAgcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCAobGVuKzMpLzQpOworICAgIGlmICggcnYgPT0gMCApCisgICAgICAgIHJldHVybiAwOworICAgIG5jcCA9ICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpOworICAgIHBvcyA9IDE7CisgICAgb3ZhbHVlID0gMDsKKyAgICBmb3IgKCBpPTA7IGkgPCBsZW47IGkrKyApIHsKKyAgICAgICAgc3VtICs9IGNwW2ldOworICAgICAgICBudmFsdWUgPSBzdW0gJiAweDE4MDsKKyAgICAgICAgc3VtIC09IG52YWx1ZTsKKyAgICAgICAgb3ZhbHVlIHw9IG52YWx1ZSA+PiBwb3M7CisgICAgICAgIHBvcyArPSAyOworICAgICAgICBpZiAoIHBvcyA9PSA5ICkgeworICAgICAgICAgICAgKm5jcCsrID0gb3ZhbHVlOworICAgICAgICAgICAgb3ZhbHVlID0gMDsKKyAgICAgICAgICAgIHBvcyA9IDE7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCBwb3MgIT0gMCApCisgICAgICAgICpuY3ArKyA9IG92YWx1ZTsKKyAgICByZXR1cm4gcnY7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbWFnZW9wX21vbm8yZ3JleShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IHYwLCB2MSwgeCwgeSwgbGVuLCBubGVuOwotCXVuc2lnbmVkIGNoYXIgKmNwLCAqbmNwOwotCVB5T2JqZWN0ICpydjsKLQlpbnQgaSwgYml0OworICAgIGludCB2MCwgdjEsIHgsIHksIGxlbiwgbmxlbjsKKyAgICB1bnNpZ25lZCBjaGFyICpjcCwgKm5jcDsKKyAgICBQeU9iamVjdCAqcnY7CisgICAgaW50IGksIGJpdDsKIAotCWlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjaWlpaSIsICZjcCwgJmxlbiwgJngsICZ5LCAmdjAsICZ2MSkgKQotCQlyZXR1cm4gMDsKKyAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI2lpaWkiLCAmY3AsICZsZW4sICZ4LCAmeSwgJnYwLCAmdjEpICkKKyAgICAgICAgcmV0dXJuIDA7CiAKLSAgICAgICAgbmxlbiA9IHgqeTsKLQlpZiAoICFjaGVja19tdWx0aXBseShubGVuLCB4LCB5KSApCi0JCXJldHVybiAwOwotCWlmICggKG5sZW4rNykvOCAhPSBsZW4gKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhJbWFnZW9wRXJyb3IsICJTdHJpbmcgaGFzIGluY29ycmVjdCBsZW5ndGgiKTsKLQkJcmV0dXJuIDA7Ci0JfQorICAgIG5sZW4gPSB4Knk7CisgICAgaWYgKCAhY2hlY2tfbXVsdGlwbHkobmxlbiwgeCwgeSkgKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoIChubGVuKzcpLzggIT0gbGVuICkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoSW1hZ2VvcEVycm9yLCAiU3RyaW5nIGhhcyBpbmNvcnJlY3QgbGVuZ3RoIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KIAotCXJ2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbmxlbik7Ci0JaWYgKCBydiA9PSAwICkKLQkJcmV0dXJuIDA7Ci0JbmNwID0gKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhydik7CisgICAgcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBubGVuKTsKKyAgICBpZiAoIHJ2ID09IDAgKQorICAgICAgICByZXR1cm4gMDsKKyAgICBuY3AgPSAodW5zaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKIAotCWJpdCA9IDB4ODA7Ci0JZm9yICggaT0wOyBpIDwgbmxlbjsgaSsrICkgewotCQlpZiAoICpjcCAmIGJpdCApCi0JCQkqbmNwKysgPSB2MTsKLQkJZWxzZQotCQkJKm5jcCsrID0gdjA7Ci0JCWJpdCA+Pj0gMTsKLQkJaWYgKCBiaXQgPT0gMCApIHsKLQkJCWJpdCA9IDB4ODA7Ci0JCQljcCsrOwotCQl9Ci0JfQotCXJldHVybiBydjsKKyAgICBiaXQgPSAweDgwOworICAgIGZvciAoIGk9MDsgaSA8IG5sZW47IGkrKyApIHsKKyAgICAgICAgaWYgKCAqY3AgJiBiaXQgKQorICAgICAgICAgICAgKm5jcCsrID0gdjE7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICpuY3ArKyA9IHYwOworICAgICAgICBiaXQgPj49IDE7CisgICAgICAgIGlmICggYml0ID09IDAgKSB7CisgICAgICAgICAgICBiaXQgPSAweDgwOworICAgICAgICAgICAgY3ArKzsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcnY7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbWFnZW9wX2dyZXkyMmdyZXkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCB4LCB5LCBsZW4sIG5sZW47Ci0JdW5zaWduZWQgY2hhciAqY3AsICpuY3A7Ci0JUHlPYmplY3QgKnJ2OwotCWludCBpLCBwb3MsIHZhbHVlID0gMCwgbnZhbHVlOworICAgIGludCB4LCB5LCBsZW4sIG5sZW47CisgICAgdW5zaWduZWQgY2hhciAqY3AsICpuY3A7CisgICAgUHlPYmplY3QgKnJ2OworICAgIGludCBpLCBwb3MsIHZhbHVlID0gMCwgbnZhbHVlOwogCi0JaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyNpaSIsICZjcCwgJmxlbiwgJngsICZ5KSApCi0JCXJldHVybiAwOworICAgIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjaWkiLCAmY3AsICZsZW4sICZ4LCAmeSkgKQorICAgICAgICByZXR1cm4gMDsKIAotCW5sZW4gPSB4Knk7Ci0JaWYgKCAhY2hlY2tfbXVsdGlwbHkobmxlbiwgeCwgeSkgKSB7Ci0JCXJldHVybiAwOwotCX0KLQlpZiAoIChubGVuKzMpLzQgIT0gbGVuICkgewotCQlQeUVycl9TZXRTdHJpbmcoSW1hZ2VvcEVycm9yLCAiU3RyaW5nIGhhcyBpbmNvcnJlY3QgbGVuZ3RoIik7Ci0JCXJldHVybiAwOwotCX0KKyAgICBubGVuID0geCp5OworICAgIGlmICggIWNoZWNrX211bHRpcGx5KG5sZW4sIHgsIHkpICkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKCAobmxlbiszKS80ICE9IGxlbiApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEltYWdlb3BFcnJvciwgIlN0cmluZyBoYXMgaW5jb3JyZWN0IGxlbmd0aCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLQlydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIG5sZW4pOwotCWlmICggcnYgPT0gMCApCi0JCXJldHVybiAwOwotCW5jcCA9ICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpOworICAgIHJ2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbmxlbik7CisgICAgaWYgKCBydiA9PSAwICkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgbmNwID0gKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhydik7CiAKLQlwb3MgPSAwOwotCWZvciAoIGk9MDsgaSA8IG5sZW47IGkrKyApIHsKLQkJaWYgKCBwb3MgPT0gMCApIHsKLQkJCXZhbHVlID0gKmNwKys7Ci0JCQlwb3MgPSA4OwotCQl9Ci0JCXBvcyAtPSAyOwotCQludmFsdWUgPSAodmFsdWUgPj4gcG9zKSAmIDB4MDM7Ci0JCSpuY3ArKyA9IG52YWx1ZSB8IChudmFsdWUgPDwgMikgfAotCQkJIChudmFsdWUgPDwgNCkgfCAobnZhbHVlIDw8IDYpOwotCX0KLQlyZXR1cm4gcnY7CisgICAgcG9zID0gMDsKKyAgICBmb3IgKCBpPTA7IGkgPCBubGVuOyBpKysgKSB7CisgICAgICAgIGlmICggcG9zID09IDAgKSB7CisgICAgICAgICAgICB2YWx1ZSA9ICpjcCsrOworICAgICAgICAgICAgcG9zID0gODsKKyAgICAgICAgfQorICAgICAgICBwb3MgLT0gMjsKKyAgICAgICAgbnZhbHVlID0gKHZhbHVlID4+IHBvcykgJiAweDAzOworICAgICAgICAqbmNwKysgPSBudmFsdWUgfCAobnZhbHVlIDw8IDIpIHwKKyAgICAgICAgICAgICAgICAgKG52YWx1ZSA8PCA0KSB8IChudmFsdWUgPDwgNik7CisgICAgfQorICAgIHJldHVybiBydjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGltYWdlb3BfZ3JleTQyZ3JleShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IHgsIHksIGxlbiwgbmxlbjsKLQl1bnNpZ25lZCBjaGFyICpjcCwgKm5jcDsKLQlQeU9iamVjdCAqcnY7Ci0JaW50IGksIHBvcywgdmFsdWUgPSAwLCBudmFsdWU7CisgICAgaW50IHgsIHksIGxlbiwgbmxlbjsKKyAgICB1bnNpZ25lZCBjaGFyICpjcCwgKm5jcDsKKyAgICBQeU9iamVjdCAqcnY7CisgICAgaW50IGksIHBvcywgdmFsdWUgPSAwLCBudmFsdWU7CiAKLQlpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI2lpIiwgJmNwLCAmbGVuLCAmeCwgJnkpICkKLQkJcmV0dXJuIDA7CisgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyNpaSIsICZjcCwgJmxlbiwgJngsICZ5KSApCisgICAgICAgIHJldHVybiAwOwogCi0JbmxlbiA9IHgqeTsKLQlpZiAoICFjaGVja19tdWx0aXBseShubGVuLCB4LCB5KSApCi0JCXJldHVybiAwOwotCWlmICggKG5sZW4rMSkvMiAhPSBsZW4gKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhJbWFnZW9wRXJyb3IsICJTdHJpbmcgaGFzIGluY29ycmVjdCBsZW5ndGgiKTsKLQkJcmV0dXJuIDA7Ci0JfQorICAgIG5sZW4gPSB4Knk7CisgICAgaWYgKCAhY2hlY2tfbXVsdGlwbHkobmxlbiwgeCwgeSkgKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoIChubGVuKzEpLzIgIT0gbGVuICkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoSW1hZ2VvcEVycm9yLCAiU3RyaW5nIGhhcyBpbmNvcnJlY3QgbGVuZ3RoIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KIAotCXJ2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbmxlbik7Ci0JaWYgKCBydiA9PSAwICkKLQkJcmV0dXJuIDA7Ci0JbmNwID0gKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhydik7CisgICAgcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBubGVuKTsKKyAgICBpZiAoIHJ2ID09IDAgKQorICAgICAgICByZXR1cm4gMDsKKyAgICBuY3AgPSAodW5zaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKIAotCXBvcyA9IDA7Ci0JZm9yICggaT0wOyBpIDwgbmxlbjsgaSsrICkgewotCQlpZiAoIHBvcyA9PSAwICkgewotCQkJdmFsdWUgPSAqY3ArKzsKLQkJCXBvcyA9IDg7Ci0JCX0KLQkJcG9zIC09IDQ7Ci0JCW52YWx1ZSA9ICh2YWx1ZSA+PiBwb3MpICYgMHgwZjsKLQkJKm5jcCsrID0gbnZhbHVlIHwgKG52YWx1ZSA8PCA0KTsKLQl9Ci0JcmV0dXJuIHJ2OworICAgIHBvcyA9IDA7CisgICAgZm9yICggaT0wOyBpIDwgbmxlbjsgaSsrICkgeworICAgICAgICBpZiAoIHBvcyA9PSAwICkgeworICAgICAgICAgICAgdmFsdWUgPSAqY3ArKzsKKyAgICAgICAgICAgIHBvcyA9IDg7CisgICAgICAgIH0KKyAgICAgICAgcG9zIC09IDQ7CisgICAgICAgIG52YWx1ZSA9ICh2YWx1ZSA+PiBwb3MpICYgMHgwZjsKKyAgICAgICAgKm5jcCsrID0gbnZhbHVlIHwgKG52YWx1ZSA8PCA0KTsKKyAgICB9CisgICAgcmV0dXJuIHJ2OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaW1hZ2VvcF9yZ2IycmdiOChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IHgsIHksIGxlbiwgbmxlbjsKLQl1bnNpZ25lZCBjaGFyICpjcDsKLQl1bnNpZ25lZCBjaGFyICpuY3A7Ci0JUHlPYmplY3QgKnJ2OwotCWludCBpLCByLCBnLCBiOwotCWludCBiYWNrd2FyZF9jb21wYXRpYmxlID0gaW1hZ2VvcF9iYWNrd2FyZF9jb21wYXRpYmxlKCk7CisgICAgaW50IHgsIHksIGxlbiwgbmxlbjsKKyAgICB1bnNpZ25lZCBjaGFyICpjcDsKKyAgICB1bnNpZ25lZCBjaGFyICpuY3A7CisgICAgUHlPYmplY3QgKnJ2OworICAgIGludCBpLCByLCBnLCBiOworICAgIGludCBiYWNrd2FyZF9jb21wYXRpYmxlID0gaW1hZ2VvcF9iYWNrd2FyZF9jb21wYXRpYmxlKCk7CiAKLQlpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI2lpIiwgJmNwLCAmbGVuLCAmeCwgJnkpICkKLQkJcmV0dXJuIDA7CisgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyNpaSIsICZjcCwgJmxlbiwgJngsICZ5KSApCisgICAgICAgIHJldHVybiAwOwogCi0JaWYgKCAhY2hlY2tfbXVsdGlwbHlfc2l6ZShsZW4sIHgsICJ4IiwgeSwgInkiLCA0KSApCi0JCXJldHVybiAwOwotCW5sZW4gPSB4Knk7Ci0JaWYgKCAhY2hlY2tfbXVsdGlwbHkobmxlbiwgeCwgeSkgKQotCQlyZXR1cm4gMDsKKyAgICBpZiAoICFjaGVja19tdWx0aXBseV9zaXplKGxlbiwgeCwgIngiLCB5LCAieSIsIDQpICkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgbmxlbiA9IHgqeTsKKyAgICBpZiAoICFjaGVja19tdWx0aXBseShubGVuLCB4LCB5KSApCisgICAgICAgIHJldHVybiAwOwogCi0JcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBubGVuKTsKLQlpZiAoIHJ2ID09IDAgKQotCQlyZXR1cm4gMDsKLQluY3AgPSAodW5zaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKKyAgICBydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIG5sZW4pOworICAgIGlmICggcnYgPT0gMCApCisgICAgICAgIHJldHVybiAwOworICAgIG5jcCA9ICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpOwogCi0JZm9yICggaT0wOyBpIDwgbmxlbjsgaSsrICkgewotCQkvKiBCaXRzIGluIHNvdXJjZTogYWFhYWFhYWEgQkJiYmJiYmIgR0dHZ2dnZ2cgUlJScnJycnIgKi8KLQkJaWYgKGJhY2t3YXJkX2NvbXBhdGlibGUpIHsKLQkJCVB5X1VJbnQzMiB2YWx1ZSA9ICogKFB5X1VJbnQzMiAqKSBjcDsKLQkJCWNwICs9IDQ7Ci0JCQlyID0gKGludCkgKCh2YWx1ZSAmIDB4ZmYpIC8gMjU1LiAqIDcuICsgLjUpOwotCQkJZyA9IChpbnQpICgoKHZhbHVlID4+IDgpICYgMHhmZikgLyAyNTUuICogNy4gKyAuNSk7Ci0JCQliID0gKGludCkgKCgodmFsdWUgPj4gMTYpICYgMHhmZikgLyAyNTUuICogMy4gKyAuNSk7Ci0JCX0gZWxzZSB7Ci0JCQljcCsrOwkJLyogc2tpcCBhbHBoYSBjaGFubmVsICovCi0JCQliID0gKGludCkgKCpjcCsrIC8gMjU1LiAqIDMuICsgLjUpOwotCQkJZyA9IChpbnQpICgqY3ArKyAvIDI1NS4gKiA3LiArIC41KTsKLQkJCXIgPSAoaW50KSAoKmNwKysgLyAyNTUuICogNy4gKyAuNSk7Ci0JCX0KLQkJKm5jcCsrID0gKHVuc2lnbmVkIGNoYXIpKChyPDw1KSB8IChiPDwzKSB8IGcpOwotCX0KLQlyZXR1cm4gcnY7CisgICAgZm9yICggaT0wOyBpIDwgbmxlbjsgaSsrICkgeworICAgICAgICAvKiBCaXRzIGluIHNvdXJjZTogYWFhYWFhYWEgQkJiYmJiYmIgR0dHZ2dnZ2cgUlJScnJycnIgKi8KKyAgICAgICAgaWYgKGJhY2t3YXJkX2NvbXBhdGlibGUpIHsKKyAgICAgICAgICAgIFB5X1VJbnQzMiB2YWx1ZSA9ICogKFB5X1VJbnQzMiAqKSBjcDsKKyAgICAgICAgICAgIGNwICs9IDQ7CisgICAgICAgICAgICByID0gKGludCkgKCh2YWx1ZSAmIDB4ZmYpIC8gMjU1LiAqIDcuICsgLjUpOworICAgICAgICAgICAgZyA9IChpbnQpICgoKHZhbHVlID4+IDgpICYgMHhmZikgLyAyNTUuICogNy4gKyAuNSk7CisgICAgICAgICAgICBiID0gKGludCkgKCgodmFsdWUgPj4gMTYpICYgMHhmZikgLyAyNTUuICogMy4gKyAuNSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjcCsrOyAgICAgICAgICAgICAgICAgICAgICAgLyogc2tpcCBhbHBoYSBjaGFubmVsICovCisgICAgICAgICAgICBiID0gKGludCkgKCpjcCsrIC8gMjU1LiAqIDMuICsgLjUpOworICAgICAgICAgICAgZyA9IChpbnQpICgqY3ArKyAvIDI1NS4gKiA3LiArIC41KTsKKyAgICAgICAgICAgIHIgPSAoaW50KSAoKmNwKysgLyAyNTUuICogNy4gKyAuNSk7CisgICAgICAgIH0KKyAgICAgICAgKm5jcCsrID0gKHVuc2lnbmVkIGNoYXIpKChyPDw1KSB8IChiPDwzKSB8IGcpOworICAgIH0KKyAgICByZXR1cm4gcnY7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbWFnZW9wX3JnYjgycmdiKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgeCwgeSwgbGVuLCBubGVuOwotCXVuc2lnbmVkIGNoYXIgKmNwOwotCXVuc2lnbmVkIGNoYXIgKm5jcDsKLQlQeU9iamVjdCAqcnY7Ci0JaW50IGksIHIsIGcsIGI7Ci0JdW5zaWduZWQgY2hhciB2YWx1ZTsKLQlpbnQgYmFja3dhcmRfY29tcGF0aWJsZSA9IGltYWdlb3BfYmFja3dhcmRfY29tcGF0aWJsZSgpOworICAgIGludCB4LCB5LCBsZW4sIG5sZW47CisgICAgdW5zaWduZWQgY2hhciAqY3A7CisgICAgdW5zaWduZWQgY2hhciAqbmNwOworICAgIFB5T2JqZWN0ICpydjsKKyAgICBpbnQgaSwgciwgZywgYjsKKyAgICB1bnNpZ25lZCBjaGFyIHZhbHVlOworICAgIGludCBiYWNrd2FyZF9jb21wYXRpYmxlID0gaW1hZ2VvcF9iYWNrd2FyZF9jb21wYXRpYmxlKCk7CiAKLQlpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI2lpIiwgJmNwLCAmbGVuLCAmeCwgJnkpICkKLQkJcmV0dXJuIDA7CisgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyNpaSIsICZjcCwgJmxlbiwgJngsICZ5KSApCisgICAgICAgIHJldHVybiAwOwogCi0JaWYgKCAhY2hlY2tfbXVsdGlwbHkobGVuLCB4LCB5KSApCi0JCXJldHVybiAwOwotCW5sZW4gPSB4KnkqNDsKLQlpZiAoICFjaGVja19tdWx0aXBseV9zaXplKG5sZW4sIHgsICJ4IiwgeSwgInkiLCA0KSApCi0JCXJldHVybiAwOworICAgIGlmICggIWNoZWNrX211bHRpcGx5KGxlbiwgeCwgeSkgKQorICAgICAgICByZXR1cm4gMDsKKyAgICBubGVuID0geCp5KjQ7CisgICAgaWYgKCAhY2hlY2tfbXVsdGlwbHlfc2l6ZShubGVuLCB4LCAieCIsIHksICJ5IiwgNCkgKQorICAgICAgICByZXR1cm4gMDsKIAotCXJ2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbmxlbik7Ci0JaWYgKCBydiA9PSAwICkKLQkJcmV0dXJuIDA7Ci0JbmNwID0gKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhydik7CisgICAgcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBubGVuKTsKKyAgICBpZiAoIHJ2ID09IDAgKQorICAgICAgICByZXR1cm4gMDsKKyAgICBuY3AgPSAodW5zaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKIAotCWZvciAoIGk9MDsgaSA8IGxlbjsgaSsrICkgewotCQkvKiBCaXRzIGluIHNvdXJjZTogUlJSQkJHR0cKLQkJKiogUmVkIGFuZCBHcmVlbiBhcmUgbXVsdGlwbGllZCBieSAzNi41LCBCbHVlIGJ5IDg1Ci0JCSovCi0JCXZhbHVlID0gKmNwKys7Ci0JCXIgPSAodmFsdWUgPj4gNSkgJiA3OwotCQlnID0gKHZhbHVlICAgICApICYgNzsKLQkJYiA9ICh2YWx1ZSA+PiAzKSAmIDM7Ci0JCXIgPSAocjw8NSkgfCAocjw8MykgfCAocj4+MSk7Ci0JCWcgPSAoZzw8NSkgfCAoZzw8MykgfCAoZz4+MSk7Ci0JCWIgPSAoYjw8NikgfCAoYjw8NCkgfCAoYjw8MikgfCBiOwotCQlpZiAoYmFja3dhcmRfY29tcGF0aWJsZSkgewotCQkJUHlfVUludDMyIG52YWx1ZSA9IHIgfCAoZzw8OCkgfCAoYjw8MTYpOwotCQkJKiAoUHlfVUludDMyICopIG5jcCA9IG52YWx1ZTsKLQkJCW5jcCArPSA0OwotCQl9IGVsc2UgewotCQkJKm5jcCsrID0gMDsKLQkJCSpuY3ArKyA9IGI7Ci0JCQkqbmNwKysgPSBnOwotCQkJKm5jcCsrID0gcjsKLQkJfQotCX0KLQlyZXR1cm4gcnY7CisgICAgZm9yICggaT0wOyBpIDwgbGVuOyBpKysgKSB7CisgICAgICAgIC8qIEJpdHMgaW4gc291cmNlOiBSUlJCQkdHRworICAgICAgICAqKiBSZWQgYW5kIEdyZWVuIGFyZSBtdWx0aXBsaWVkIGJ5IDM2LjUsIEJsdWUgYnkgODUKKyAgICAgICAgKi8KKyAgICAgICAgdmFsdWUgPSAqY3ArKzsKKyAgICAgICAgciA9ICh2YWx1ZSA+PiA1KSAmIDc7CisgICAgICAgIGcgPSAodmFsdWUgICAgICkgJiA3OworICAgICAgICBiID0gKHZhbHVlID4+IDMpICYgMzsKKyAgICAgICAgciA9IChyPDw1KSB8IChyPDwzKSB8IChyPj4xKTsKKyAgICAgICAgZyA9IChnPDw1KSB8IChnPDwzKSB8IChnPj4xKTsKKyAgICAgICAgYiA9IChiPDw2KSB8IChiPDw0KSB8IChiPDwyKSB8IGI7CisgICAgICAgIGlmIChiYWNrd2FyZF9jb21wYXRpYmxlKSB7CisgICAgICAgICAgICBQeV9VSW50MzIgbnZhbHVlID0gciB8IChnPDw4KSB8IChiPDwxNik7CisgICAgICAgICAgICAqIChQeV9VSW50MzIgKikgbmNwID0gbnZhbHVlOworICAgICAgICAgICAgbmNwICs9IDQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqbmNwKysgPSAwOworICAgICAgICAgICAgKm5jcCsrID0gYjsKKyAgICAgICAgICAgICpuY3ArKyA9IGc7CisgICAgICAgICAgICAqbmNwKysgPSByOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBydjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGltYWdlb3BfcmdiMmdyZXkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCB4LCB5LCBsZW4sIG5sZW47Ci0JdW5zaWduZWQgY2hhciAqY3A7Ci0JdW5zaWduZWQgY2hhciAqbmNwOwotCVB5T2JqZWN0ICpydjsKLQlpbnQgaSwgciwgZywgYjsKLQlpbnQgbnZhbHVlOwotCWludCBiYWNrd2FyZF9jb21wYXRpYmxlID0gaW1hZ2VvcF9iYWNrd2FyZF9jb21wYXRpYmxlKCk7CisgICAgaW50IHgsIHksIGxlbiwgbmxlbjsKKyAgICB1bnNpZ25lZCBjaGFyICpjcDsKKyAgICB1bnNpZ25lZCBjaGFyICpuY3A7CisgICAgUHlPYmplY3QgKnJ2OworICAgIGludCBpLCByLCBnLCBiOworICAgIGludCBudmFsdWU7CisgICAgaW50IGJhY2t3YXJkX2NvbXBhdGlibGUgPSBpbWFnZW9wX2JhY2t3YXJkX2NvbXBhdGlibGUoKTsKIAotCWlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjaWkiLCAmY3AsICZsZW4sICZ4LCAmeSkgKQotCQlyZXR1cm4gMDsKKyAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI2lpIiwgJmNwLCAmbGVuLCAmeCwgJnkpICkKKyAgICAgICAgcmV0dXJuIDA7CiAKLQlpZiAoICFjaGVja19tdWx0aXBseV9zaXplKGxlbiwgeCwgIngiLCB5LCAieSIsIDQpICkKLQkJcmV0dXJuIDA7Ci0JbmxlbiA9IHgqeTsKLQlpZiAoICFjaGVja19tdWx0aXBseShubGVuLCB4LCB5KSApCi0JCXJldHVybiAwOworICAgIGlmICggIWNoZWNrX211bHRpcGx5X3NpemUobGVuLCB4LCAieCIsIHksICJ5IiwgNCkgKQorICAgICAgICByZXR1cm4gMDsKKyAgICBubGVuID0geCp5OworICAgIGlmICggIWNoZWNrX211bHRpcGx5KG5sZW4sIHgsIHkpICkKKyAgICAgICAgcmV0dXJuIDA7CiAKLQlydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIG5sZW4pOwotCWlmICggcnYgPT0gMCApCi0JCXJldHVybiAwOwotCW5jcCA9ICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpOworICAgIHJ2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbmxlbik7CisgICAgaWYgKCBydiA9PSAwICkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgbmNwID0gKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhydik7CiAKLQlmb3IgKCBpPTA7IGkgPCBubGVuOyBpKysgKSB7Ci0JCWlmIChiYWNrd2FyZF9jb21wYXRpYmxlKSB7Ci0JCQlQeV9VSW50MzIgdmFsdWUgPSAqIChQeV9VSW50MzIgKikgY3A7Ci0JCQljcCArPSA0OwotCQkJciA9IChpbnQpICgodmFsdWUgJiAweGZmKSAvIDI1NS4gKiA3LiArIC41KTsKLQkJCWcgPSAoaW50KSAoKCh2YWx1ZSA+PiA4KSAmIDB4ZmYpIC8gMjU1LiAqIDcuICsgLjUpOwotCQkJYiA9IChpbnQpICgoKHZhbHVlID4+IDE2KSAmIDB4ZmYpIC8gMjU1LiAqIDMuICsgLjUpOwotCQl9IGVsc2UgewotCQkJY3ArKzsJCS8qIHNraXAgYWxwaGEgY2hhbm5lbCAqLwotCQkJYiA9ICpjcCsrOwotCQkJZyA9ICpjcCsrOwotCQkJciA9ICpjcCsrOwotCQl9Ci0JCW52YWx1ZSA9IChpbnQpKDAuMzAqciArIDAuNTkqZyArIDAuMTEqYik7Ci0JCWlmICggbnZhbHVlID4gMjU1ICkgbnZhbHVlID0gMjU1OwotCQkqbmNwKysgPSAodW5zaWduZWQgY2hhciludmFsdWU7Ci0JfQotCXJldHVybiBydjsKKyAgICBmb3IgKCBpPTA7IGkgPCBubGVuOyBpKysgKSB7CisgICAgICAgIGlmIChiYWNrd2FyZF9jb21wYXRpYmxlKSB7CisgICAgICAgICAgICBQeV9VSW50MzIgdmFsdWUgPSAqIChQeV9VSW50MzIgKikgY3A7CisgICAgICAgICAgICBjcCArPSA0OworICAgICAgICAgICAgciA9IChpbnQpICgodmFsdWUgJiAweGZmKSAvIDI1NS4gKiA3LiArIC41KTsKKyAgICAgICAgICAgIGcgPSAoaW50KSAoKCh2YWx1ZSA+PiA4KSAmIDB4ZmYpIC8gMjU1LiAqIDcuICsgLjUpOworICAgICAgICAgICAgYiA9IChpbnQpICgoKHZhbHVlID4+IDE2KSAmIDB4ZmYpIC8gMjU1LiAqIDMuICsgLjUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY3ArKzsgICAgICAgICAgICAgICAgICAgICAgIC8qIHNraXAgYWxwaGEgY2hhbm5lbCAqLworICAgICAgICAgICAgYiA9ICpjcCsrOworICAgICAgICAgICAgZyA9ICpjcCsrOworICAgICAgICAgICAgciA9ICpjcCsrOworICAgICAgICB9CisgICAgICAgIG52YWx1ZSA9IChpbnQpKDAuMzAqciArIDAuNTkqZyArIDAuMTEqYik7CisgICAgICAgIGlmICggbnZhbHVlID4gMjU1ICkgbnZhbHVlID0gMjU1OworICAgICAgICAqbmNwKysgPSAodW5zaWduZWQgY2hhciludmFsdWU7CisgICAgfQorICAgIHJldHVybiBydjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGltYWdlb3BfZ3JleTJyZ2IoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCB4LCB5LCBsZW4sIG5sZW47Ci0JdW5zaWduZWQgY2hhciAqY3A7Ci0JdW5zaWduZWQgY2hhciAqbmNwOwotCVB5T2JqZWN0ICpydjsKLQlpbnQgaTsKLQl1bnNpZ25lZCBjaGFyIHZhbHVlOwotCWludCBiYWNrd2FyZF9jb21wYXRpYmxlID0gaW1hZ2VvcF9iYWNrd2FyZF9jb21wYXRpYmxlKCk7CisgICAgaW50IHgsIHksIGxlbiwgbmxlbjsKKyAgICB1bnNpZ25lZCBjaGFyICpjcDsKKyAgICB1bnNpZ25lZCBjaGFyICpuY3A7CisgICAgUHlPYmplY3QgKnJ2OworICAgIGludCBpOworICAgIHVuc2lnbmVkIGNoYXIgdmFsdWU7CisgICAgaW50IGJhY2t3YXJkX2NvbXBhdGlibGUgPSBpbWFnZW9wX2JhY2t3YXJkX2NvbXBhdGlibGUoKTsKIAotCWlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjaWkiLCAmY3AsICZsZW4sICZ4LCAmeSkgKQotCQlyZXR1cm4gMDsKKyAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI2lpIiwgJmNwLCAmbGVuLCAmeCwgJnkpICkKKyAgICAgICAgcmV0dXJuIDA7CiAKLQlpZiAoICFjaGVja19tdWx0aXBseShsZW4sIHgsIHkpICkKLQkJcmV0dXJuIDA7Ci0gICAgICAgIG5sZW4gPSB4KnkqNDsKLQlpZiAoICFjaGVja19tdWx0aXBseV9zaXplKG5sZW4sIHgsICJ4IiwgeSwgInkiLCA0KSApCi0JCXJldHVybiAwOworICAgIGlmICggIWNoZWNrX211bHRpcGx5KGxlbiwgeCwgeSkgKQorICAgICAgICByZXR1cm4gMDsKKyAgICBubGVuID0geCp5KjQ7CisgICAgaWYgKCAhY2hlY2tfbXVsdGlwbHlfc2l6ZShubGVuLCB4LCAieCIsIHksICJ5IiwgNCkgKQorICAgICAgICByZXR1cm4gMDsKIAotCXJ2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbmxlbik7Ci0JaWYgKCBydiA9PSAwICkKLQkJcmV0dXJuIDA7Ci0JbmNwID0gKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhydik7CisgICAgcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBubGVuKTsKKyAgICBpZiAoIHJ2ID09IDAgKQorICAgICAgICByZXR1cm4gMDsKKyAgICBuY3AgPSAodW5zaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKIAotCWZvciAoIGk9MDsgaSA8IGxlbjsgaSsrICkgewotCQl2YWx1ZSA9ICpjcCsrOwotCQlpZiAoYmFja3dhcmRfY29tcGF0aWJsZSkgewotCQkJKiAoUHlfVUludDMyICopIG5jcCA9IChQeV9VSW50MzIpIHZhbHVlIHwgKChQeV9VSW50MzIpIHZhbHVlIDw8IDggKSB8ICgoUHlfVUludDMyKSB2YWx1ZSA8PCAxNik7Ci0JCQluY3AgKz0gNDsKLQkJfSBlbHNlIHsKLQkJCSpuY3ArKyA9IDA7Ci0JCQkqbmNwKysgPSB2YWx1ZTsKLQkJCSpuY3ArKyA9IHZhbHVlOwotCQkJKm5jcCsrID0gdmFsdWU7Ci0JCX0KLQl9Ci0JcmV0dXJuIHJ2OworICAgIGZvciAoIGk9MDsgaSA8IGxlbjsgaSsrICkgeworICAgICAgICB2YWx1ZSA9ICpjcCsrOworICAgICAgICBpZiAoYmFja3dhcmRfY29tcGF0aWJsZSkgeworICAgICAgICAgICAgKiAoUHlfVUludDMyICopIG5jcCA9IChQeV9VSW50MzIpIHZhbHVlIHwgKChQeV9VSW50MzIpIHZhbHVlIDw8IDggKSB8ICgoUHlfVUludDMyKSB2YWx1ZSA8PCAxNik7CisgICAgICAgICAgICBuY3AgKz0gNDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICpuY3ArKyA9IDA7CisgICAgICAgICAgICAqbmNwKysgPSB2YWx1ZTsKKyAgICAgICAgICAgICpuY3ArKyA9IHZhbHVlOworICAgICAgICAgICAgKm5jcCsrID0gdmFsdWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJ2OwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgaW1hZ2VvcF9tZXRob2RzW10gPSB7Ci0JeyAiY3JvcCIsCQlpbWFnZW9wX2Nyb3AsIE1FVEhfVkFSQVJHUyB9LAotCXsgInNjYWxlIiwJCWltYWdlb3Bfc2NhbGUsIE1FVEhfVkFSQVJHUyB9LAotCXsgImdyZXkybW9ubyIsCSAgICAgICAgaW1hZ2VvcF9ncmV5Mm1vbm8sIE1FVEhfVkFSQVJHUyB9LAotCXsgImdyZXkyZ3JleTIiLAkgICAgICAgIGltYWdlb3BfZ3JleTJncmV5MiwgTUVUSF9WQVJBUkdTIH0sCi0JeyAiZ3JleTJncmV5NCIsCSAgICAgICAgaW1hZ2VvcF9ncmV5MmdyZXk0LCBNRVRIX1ZBUkFSR1MgfSwKLQl7ICJkaXRoZXIybW9ubyIsCWltYWdlb3BfZGl0aGVyMm1vbm8sIE1FVEhfVkFSQVJHUyB9LAotCXsgImRpdGhlcjJncmV5MiIsCWltYWdlb3BfZGl0aGVyMmdyZXkyLCBNRVRIX1ZBUkFSR1MgfSwKLQl7ICJtb25vMmdyZXkiLAkgICAgICAgIGltYWdlb3BfbW9ubzJncmV5LCBNRVRIX1ZBUkFSR1MgfSwKLQl7ICJncmV5MjJncmV5IiwJICAgICAgICBpbWFnZW9wX2dyZXkyMmdyZXksIE1FVEhfVkFSQVJHUyB9LAotCXsgImdyZXk0MmdyZXkiLAkgICAgICAgIGltYWdlb3BfZ3JleTQyZ3JleSwgTUVUSF9WQVJBUkdTIH0sCi0JeyAidG92aWRlbyIsCSAgICAgICAgaW1hZ2VvcF90b3ZpZGVvLCBNRVRIX1ZBUkFSR1MgfSwKLQl7ICJyZ2IycmdiOCIsCSAgICAgICAgaW1hZ2VvcF9yZ2IycmdiOCwgTUVUSF9WQVJBUkdTIH0sCi0JeyAicmdiODJyZ2IiLAkgICAgICAgIGltYWdlb3BfcmdiODJyZ2IsIE1FVEhfVkFSQVJHUyB9LAotCXsgInJnYjJncmV5IiwJICAgICAgICBpbWFnZW9wX3JnYjJncmV5LCBNRVRIX1ZBUkFSR1MgfSwKLQl7ICJncmV5MnJnYiIsCSAgICAgICAgaW1hZ2VvcF9ncmV5MnJnYiwgTUVUSF9WQVJBUkdTIH0sCi0JeyAwLCAgICAgICAgICAgICAgICAgICAgMCB9CisgICAgeyAiY3JvcCIsICAgICAgICAgICAgICAgICAgIGltYWdlb3BfY3JvcCwgTUVUSF9WQVJBUkdTIH0sCisgICAgeyAic2NhbGUiLCAgICAgICAgICAgICAgICAgIGltYWdlb3Bfc2NhbGUsIE1FVEhfVkFSQVJHUyB9LAorICAgIHsgImdyZXkybW9ubyIsICAgICAgICAgICAgICBpbWFnZW9wX2dyZXkybW9ubywgTUVUSF9WQVJBUkdTIH0sCisgICAgeyAiZ3JleTJncmV5MiIsICAgICAgICAgICAgIGltYWdlb3BfZ3JleTJncmV5MiwgTUVUSF9WQVJBUkdTIH0sCisgICAgeyAiZ3JleTJncmV5NCIsICAgICAgICAgICAgIGltYWdlb3BfZ3JleTJncmV5NCwgTUVUSF9WQVJBUkdTIH0sCisgICAgeyAiZGl0aGVyMm1vbm8iLCAgICAgICAgICAgIGltYWdlb3BfZGl0aGVyMm1vbm8sIE1FVEhfVkFSQVJHUyB9LAorICAgIHsgImRpdGhlcjJncmV5MiIsICAgICAgICAgICBpbWFnZW9wX2RpdGhlcjJncmV5MiwgTUVUSF9WQVJBUkdTIH0sCisgICAgeyAibW9ubzJncmV5IiwgICAgICAgICAgICAgIGltYWdlb3BfbW9ubzJncmV5LCBNRVRIX1ZBUkFSR1MgfSwKKyAgICB7ICJncmV5MjJncmV5IiwgICAgICAgICAgICAgaW1hZ2VvcF9ncmV5MjJncmV5LCBNRVRIX1ZBUkFSR1MgfSwKKyAgICB7ICJncmV5NDJncmV5IiwgICAgICAgICAgICAgaW1hZ2VvcF9ncmV5NDJncmV5LCBNRVRIX1ZBUkFSR1MgfSwKKyAgICB7ICJ0b3ZpZGVvIiwgICAgICAgICAgICAgICAgaW1hZ2VvcF90b3ZpZGVvLCBNRVRIX1ZBUkFSR1MgfSwKKyAgICB7ICJyZ2IycmdiOCIsICAgICAgICAgICAgICAgaW1hZ2VvcF9yZ2IycmdiOCwgTUVUSF9WQVJBUkdTIH0sCisgICAgeyAicmdiODJyZ2IiLCAgICAgICAgICAgICAgIGltYWdlb3BfcmdiODJyZ2IsIE1FVEhfVkFSQVJHUyB9LAorICAgIHsgInJnYjJncmV5IiwgICAgICAgICAgICAgICBpbWFnZW9wX3JnYjJncmV5LCBNRVRIX1ZBUkFSR1MgfSwKKyAgICB7ICJncmV5MnJnYiIsICAgICAgICAgICAgICAgaW1hZ2VvcF9ncmV5MnJnYiwgTUVUSF9WQVJBUkdTIH0sCisgICAgeyAwLCAgICAgICAgICAgICAgICAgICAgMCB9CiB9OwogCiAKIFB5TU9ESU5JVF9GVU5DCiBpbml0aW1hZ2VvcCh2b2lkKQogewotCVB5T2JqZWN0ICptOworICAgIFB5T2JqZWN0ICptOwogCi0JaWYgKFB5RXJyX1dhcm5QeTNrKCJ0aGUgaW1hZ2VvcCBtb2R1bGUgaGFzIGJlZW4gcmVtb3ZlZCBpbiAiCi0JICAgICAgICAgICAgICAgICAgICJQeXRob24gMy4wIiwgMikgPCAwKQotCSAgICByZXR1cm47CisgICAgaWYgKFB5RXJyX1dhcm5QeTNrKCJ0aGUgaW1hZ2VvcCBtb2R1bGUgaGFzIGJlZW4gcmVtb3ZlZCBpbiAiCisgICAgICAgICAgICAgICAgICAgICAgICJQeXRob24gMy4wIiwgMikgPCAwKQorICAgICAgICByZXR1cm47CiAKLQltID0gUHlfSW5pdE1vZHVsZSgiaW1hZ2VvcCIsIGltYWdlb3BfbWV0aG9kcyk7Ci0JaWYgKG0gPT0gTlVMTCkKLQkJcmV0dXJuOwotCUltYWdlb3BEaWN0ID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQlJbWFnZW9wRXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oImltYWdlb3AuZXJyb3IiLCBOVUxMLCBOVUxMKTsKLQlpZiAoSW1hZ2VvcEVycm9yICE9IE5VTEwpCi0JCVB5RGljdF9TZXRJdGVtU3RyaW5nKEltYWdlb3BEaWN0LCAiZXJyb3IiLCBJbWFnZW9wRXJyb3IpOworICAgIG0gPSBQeV9Jbml0TW9kdWxlKCJpbWFnZW9wIiwgaW1hZ2VvcF9tZXRob2RzKTsKKyAgICBpZiAobSA9PSBOVUxMKQorICAgICAgICByZXR1cm47CisgICAgSW1hZ2VvcERpY3QgPSBQeU1vZHVsZV9HZXREaWN0KG0pOworICAgIEltYWdlb3BFcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbigiaW1hZ2VvcC5lcnJvciIsIE5VTEwsIE5VTEwpOworICAgIGlmIChJbWFnZW9wRXJyb3IgIT0gTlVMTCkKKyAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoSW1hZ2VvcERpY3QsICJlcnJvciIsIEltYWdlb3BFcnJvcik7CiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL2ltZ2ZpbGUuYyBiL01vZHVsZXMvaW1nZmlsZS5jCmluZGV4IGJhYTZlYWQuLjcwZDMwN2IgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvaW1nZmlsZS5jCisrKyBiL01vZHVsZXMvaW1nZmlsZS5jCkBAIC0yNSw3ICsyNSw3IEBACiAKIHN0YXRpYyBQeU9iamVjdCAqIEltZ2ZpbGVFcnJvcjsgLyogRXhjZXB0aW9uIHdlIHJhaXNlIGZvciB2YXJpb3VzIHRyb3VibGUgKi8KIAotc3RhdGljIGludCB0b3BfdG9fYm90dG9tOwkvKiBUcnVlIGlmIHdlIHdhbnQgdG9wLXRvLWJvdHRvbSBpbWFnZXMgKi8KK3N0YXRpYyBpbnQgdG9wX3RvX2JvdHRvbTsgICAgICAgLyogVHJ1ZSBpZiB3ZSB3YW50IHRvcC10by1ib3R0b20gaW1hZ2VzICovCiAKIC8qIFRoZSBpbWFnZSBsaWJyYXJ5IGRvZXMgbm90IGFsd2F5cyBjYWxsIHRoZSBlcnJvciBoYW5kZXIgOi0oLAogICAgdGhlcmVmb3JlIHdlIGhhdmUgYSBnbG9iYWwgdmFyaWFibGUgaW5kaWNhdGluZyB0aGF0IGl0IHdhcyBjYWxsZWQuCkBAIC0zOSw5ICszOSw5IEBACiBzdGF0aWMgdm9pZAogaW1nZmlsZV9lcnJvcihjaGFyICpzdHIpCiB7Ci0JUHlFcnJfU2V0U3RyaW5nKEltZ2ZpbGVFcnJvciwgc3RyKTsKLQllcnJvcl9jYWxsZWQgPSAxOwotCXJldHVybjsJLyogVG8gaW1nbGliLCB3aGljaCB3aWxsIHJldHVybiBhIGZhaWx1cmUgaW5kaWNhdG9yICovCisgICAgUHlFcnJfU2V0U3RyaW5nKEltZ2ZpbGVFcnJvciwgc3RyKTsKKyAgICBlcnJvcl9jYWxsZWQgPSAxOworICAgIHJldHVybjsgICAgIC8qIFRvIGltZ2xpYiwgd2hpY2ggd2lsbCByZXR1cm4gYSBmYWlsdXJlIGluZGljYXRvciAqLwogfQogCiAKQEAgLTUxLDEyMyArNTEsMTIzIEBACiBzdGF0aWMgSU1BR0UgKgogaW1nZmlsZV9vcGVuKGNoYXIgKmZuYW1lKQogewotCUlNQUdFICppbWFnZTsKLQlpX3NldGVycm9yKGltZ2ZpbGVfZXJyb3IpOwotCWVycm9yX2NhbGxlZCA9IDA7Ci0JZXJybm8gPSAwOwotCWlmICggKGltYWdlID0gaW9wZW4oZm5hbWUsICJyIikpID09IE5VTEwgKSB7Ci0JCS8qIEVycm9yIG1heSBhbHJlYWR5IGJlIHNldCBieSBpbWdmaWxlX2Vycm9yICovCi0JCWlmICggIWVycm9yX2NhbGxlZCApIHsKLQkJCWlmIChlcnJubykKLQkJCQlQeUVycl9TZXRGcm9tRXJybm8oSW1nZmlsZUVycm9yKTsKLQkJCWVsc2UKLQkJCQlQeUVycl9TZXRTdHJpbmcoSW1nZmlsZUVycm9yLAotCQkJCQkJIkNhbid0IG9wZW4gaW1hZ2UgZmlsZSIpOwotCQl9Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gaW1hZ2U7CisgICAgSU1BR0UgKmltYWdlOworICAgIGlfc2V0ZXJyb3IoaW1nZmlsZV9lcnJvcik7CisgICAgZXJyb3JfY2FsbGVkID0gMDsKKyAgICBlcnJubyA9IDA7CisgICAgaWYgKCAoaW1hZ2UgPSBpb3BlbihmbmFtZSwgInIiKSkgPT0gTlVMTCApIHsKKyAgICAgICAgLyogRXJyb3IgbWF5IGFscmVhZHkgYmUgc2V0IGJ5IGltZ2ZpbGVfZXJyb3IgKi8KKyAgICAgICAgaWYgKCAhZXJyb3JfY2FsbGVkICkgeworICAgICAgICAgICAgaWYgKGVycm5vKQorICAgICAgICAgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhJbWdmaWxlRXJyb3IpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhJbWdmaWxlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDYW4ndCBvcGVuIGltYWdlIGZpbGUiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIGltYWdlOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaW1nZmlsZV90dG9iKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgbmV3dmFsOwotCVB5T2JqZWN0ICpydjsKLSAgICAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6dHRvYiIsICZuZXd2YWwpKQotCQlyZXR1cm4gTlVMTDsKLQlydiA9IFB5SW50X0Zyb21Mb25nKHRvcF90b19ib3R0b20pOwotCXRvcF90b19ib3R0b20gPSBuZXd2YWw7Ci0JcmV0dXJuIHJ2OworICAgIGludCBuZXd2YWw7CisgICAgUHlPYmplY3QgKnJ2OworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOnR0b2IiLCAmbmV3dmFsKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcnYgPSBQeUludF9Gcm9tTG9uZyh0b3BfdG9fYm90dG9tKTsKKyAgICB0b3BfdG9fYm90dG9tID0gbmV3dmFsOworICAgIHJldHVybiBydjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGltZ2ZpbGVfcmVhZChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqZm5hbWU7Ci0JUHlPYmplY3QgKnJ2OwotCWludCB4c2l6ZSwgeXNpemUsIHpzaXplOwotCWNoYXIgKmNkYXRhcDsKLQlsb25nICppZGF0YXA7Ci0Jc3RhdGljIHNob3J0IHJzWzgxOTJdLCBnc1s4MTkyXSwgYnNbODE5Ml07Ci0JaW50IHgsIHk7Ci0JSU1BR0UgKmltYWdlOwotCWludCB5Zmlyc3QsIHlsYXN0LCB5c3RlcDsKKyAgICBjaGFyICpmbmFtZTsKKyAgICBQeU9iamVjdCAqcnY7CisgICAgaW50IHhzaXplLCB5c2l6ZSwgenNpemU7CisgICAgY2hhciAqY2RhdGFwOworICAgIGxvbmcgKmlkYXRhcDsKKyAgICBzdGF0aWMgc2hvcnQgcnNbODE5Ml0sIGdzWzgxOTJdLCBic1s4MTkyXTsKKyAgICBpbnQgeCwgeTsKKyAgICBJTUFHRSAqaW1hZ2U7CisgICAgaW50IHlmaXJzdCwgeWxhc3QsIHlzdGVwOwogCi0JaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczpyZWFkIiwgJmZuYW1lKSApCi0JCXJldHVybiBOVUxMOwotICAgIAotCWlmICggKGltYWdlID0gaW1nZmlsZV9vcGVuKGZuYW1lKSkgPT0gTlVMTCApCi0JCXJldHVybiBOVUxMOwotICAgIAotCWlmICggaW1hZ2UtPmNvbG9ybWFwICE9IENNX05PUk1BTCApIHsKLQkJaWNsb3NlKGltYWdlKTsKLQkJUHlFcnJfU2V0U3RyaW5nKEltZ2ZpbGVFcnJvciwKLQkJCQkiQ2FuIG9ubHkgaGFuZGxlIENNX05PUk1BTCBpbWFnZXMiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmICggQlBQKGltYWdlLT50eXBlKSAhPSAxICkgewotCQlpY2xvc2UoaW1hZ2UpOwotCQlQeUVycl9TZXRTdHJpbmcoSW1nZmlsZUVycm9yLAotCQkJCSJDYW4ndCBoYW5kbGUgaW1nZmlsZXMgd2l0aCBicHAhPTEiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXhzaXplID0gaW1hZ2UtPnhzaXplOwotCXlzaXplID0gaW1hZ2UtPnlzaXplOwotCXpzaXplID0gaW1hZ2UtPnpzaXplOwotCWlmICggenNpemUgIT0gMSAmJiB6c2l6ZSAhPSAzKSB7Ci0JCWljbG9zZShpbWFnZSk7Ci0JCVB5RXJyX1NldFN0cmluZyhJbWdmaWxlRXJyb3IsCi0JCQkJIkNhbiBvbmx5IGhhbmRsZSAxIG9yIDMgYnl0ZSBwaXhlbHMiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmICggeHNpemUgPiA4MTkyICkgewotCQlpY2xvc2UoaW1hZ2UpOwotCQlQeUVycl9TZXRTdHJpbmcoSW1nZmlsZUVycm9yLAotCQkJCSJDYW4ndCBoYW5kbGUgaW1hZ2Ugd2l0aCA+IDgxOTIgY29sdW1ucyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczpyZWFkIiwgJmZuYW1lKSApCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKCB6c2l6ZSA9PSAzICkgenNpemUgPSA0OwotCXJ2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilOVUxMLCB4c2l6ZSp5c2l6ZSp6c2l6ZSk7Ci0JaWYgKCBydiA9PSBOVUxMICkgewotCQlpY2xvc2UoaW1hZ2UpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JY2RhdGFwID0gUHlTdHJpbmdfQXNTdHJpbmcocnYpOwotCWlkYXRhcCA9IChsb25nICopY2RhdGFwOworICAgIGlmICggKGltYWdlID0gaW1nZmlsZV9vcGVuKGZuYW1lKSkgPT0gTlVMTCApCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKHRvcF90b19ib3R0b20pIHsKLQkJeWZpcnN0ID0geXNpemUtMTsKLQkJeWxhc3QgPSAtMTsKLQkJeXN0ZXAgPSAtMTsKLQl9IGVsc2UgewotCQl5Zmlyc3QgPSAwOwotCQl5bGFzdCA9IHlzaXplOwotCQl5c3RlcCA9IDE7Ci0JfQotCWZvciAoIHk9eWZpcnN0OyB5ICE9IHlsYXN0ICYmICFlcnJvcl9jYWxsZWQ7IHkgKz0geXN0ZXAgKSB7Ci0JCWlmICggenNpemUgPT0gMSApIHsKLQkJCWdldHJvdyhpbWFnZSwgcnMsIHksIDApOwotCQkJZm9yKHg9MDsgeDx4c2l6ZTsgeCsrICkKLQkJCQkqY2RhdGFwKysgPSByc1t4XTsKLQkJfSBlbHNlIHsKLQkJCWdldHJvdyhpbWFnZSwgcnMsIHksIDApOwotCQkJZ2V0cm93KGltYWdlLCBncywgeSwgMSk7Ci0JCQlnZXRyb3coaW1hZ2UsIGJzLCB5LCAyKTsKLQkJCWZvcih4PTA7IHg8eHNpemU7IHgrKyApCi0JCQkJKmlkYXRhcCsrID0gKHJzW3hdICYgMHhmZikgIHwKLQkJCQkJKChnc1t4XSAmIDB4ZmYpPDw4KSB8Ci0JCQkJCSgoYnNbeF0gJiAweGZmKTw8MTYpOwotCQl9Ci0JfQotCWljbG9zZShpbWFnZSk7Ci0JaWYgKCBlcnJvcl9jYWxsZWQgKSB7Ci0JCVB5X0RFQ1JFRihydik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gcnY7CisgICAgaWYgKCBpbWFnZS0+Y29sb3JtYXAgIT0gQ01fTk9STUFMICkgeworICAgICAgICBpY2xvc2UoaW1hZ2UpOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoSW1nZmlsZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIkNhbiBvbmx5IGhhbmRsZSBDTV9OT1JNQUwgaW1hZ2VzIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoIEJQUChpbWFnZS0+dHlwZSkgIT0gMSApIHsKKyAgICAgICAgaWNsb3NlKGltYWdlKTsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEltZ2ZpbGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJDYW4ndCBoYW5kbGUgaW1nZmlsZXMgd2l0aCBicHAhPTEiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHhzaXplID0gaW1hZ2UtPnhzaXplOworICAgIHlzaXplID0gaW1hZ2UtPnlzaXplOworICAgIHpzaXplID0gaW1hZ2UtPnpzaXplOworICAgIGlmICggenNpemUgIT0gMSAmJiB6c2l6ZSAhPSAzKSB7CisgICAgICAgIGljbG9zZShpbWFnZSk7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhJbWdmaWxlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiQ2FuIG9ubHkgaGFuZGxlIDEgb3IgMyBieXRlIHBpeGVscyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKCB4c2l6ZSA+IDgxOTIgKSB7CisgICAgICAgIGljbG9zZShpbWFnZSk7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhJbWdmaWxlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiQ2FuJ3QgaGFuZGxlIGltYWdlIHdpdGggPiA4MTkyIGNvbHVtbnMiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaWYgKCB6c2l6ZSA9PSAzICkgenNpemUgPSA0OworICAgIHJ2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilOVUxMLCB4c2l6ZSp5c2l6ZSp6c2l6ZSk7CisgICAgaWYgKCBydiA9PSBOVUxMICkgeworICAgICAgICBpY2xvc2UoaW1hZ2UpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgY2RhdGFwID0gUHlTdHJpbmdfQXNTdHJpbmcocnYpOworICAgIGlkYXRhcCA9IChsb25nICopY2RhdGFwOworCisgICAgaWYgKHRvcF90b19ib3R0b20pIHsKKyAgICAgICAgeWZpcnN0ID0geXNpemUtMTsKKyAgICAgICAgeWxhc3QgPSAtMTsKKyAgICAgICAgeXN0ZXAgPSAtMTsKKyAgICB9IGVsc2UgeworICAgICAgICB5Zmlyc3QgPSAwOworICAgICAgICB5bGFzdCA9IHlzaXplOworICAgICAgICB5c3RlcCA9IDE7CisgICAgfQorICAgIGZvciAoIHk9eWZpcnN0OyB5ICE9IHlsYXN0ICYmICFlcnJvcl9jYWxsZWQ7IHkgKz0geXN0ZXAgKSB7CisgICAgICAgIGlmICggenNpemUgPT0gMSApIHsKKyAgICAgICAgICAgIGdldHJvdyhpbWFnZSwgcnMsIHksIDApOworICAgICAgICAgICAgZm9yKHg9MDsgeDx4c2l6ZTsgeCsrICkKKyAgICAgICAgICAgICAgICAqY2RhdGFwKysgPSByc1t4XTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGdldHJvdyhpbWFnZSwgcnMsIHksIDApOworICAgICAgICAgICAgZ2V0cm93KGltYWdlLCBncywgeSwgMSk7CisgICAgICAgICAgICBnZXRyb3coaW1hZ2UsIGJzLCB5LCAyKTsKKyAgICAgICAgICAgIGZvcih4PTA7IHg8eHNpemU7IHgrKyApCisgICAgICAgICAgICAgICAgKmlkYXRhcCsrID0gKHJzW3hdICYgMHhmZikgIHwKKyAgICAgICAgICAgICAgICAgICAgKChnc1t4XSAmIDB4ZmYpPDw4KSB8CisgICAgICAgICAgICAgICAgICAgICgoYnNbeF0gJiAweGZmKTw8MTYpOworICAgICAgICB9CisgICAgfQorICAgIGljbG9zZShpbWFnZSk7CisgICAgaWYgKCBlcnJvcl9jYWxsZWQgKSB7CisgICAgICAgIFB5X0RFQ1JFRihydik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gcnY7CiB9CiAKIHN0YXRpYyBJTUFHRSAqZ2xvYl9pbWFnZTsKQEAgLTE3NywzMzIgKzE3NywzMzIgQEAKIHN0YXRpYyB2b2lkCiB4c19nZXQoc2hvcnQgKmJ1ZiwgaW50IHkpCiB7Ci0JaWYgKHRvcF90b19ib3R0b20pCi0JCWdldHJvdyhnbG9iX2ltYWdlLCBidWYsIChnbG9iX3lzaXplLTEteSksIGdsb2Jfeik7Ci0JZWxzZQotCQlnZXRyb3coZ2xvYl9pbWFnZSwgYnVmLCB5LCBnbG9iX3opOworICAgIGlmICh0b3BfdG9fYm90dG9tKQorICAgICAgICBnZXRyb3coZ2xvYl9pbWFnZSwgYnVmLCAoZ2xvYl95c2l6ZS0xLXkpLCBnbG9iX3opOworICAgIGVsc2UKKyAgICAgICAgZ2V0cm93KGdsb2JfaW1hZ2UsIGJ1ZiwgeSwgZ2xvYl96KTsKIH0KIAogc3RhdGljIHZvaWQKIHhzX3B1dF9jKHNob3J0ICpidWYsIGludCB5KQogewotCWNoYXIgKmRhdGFwID0gKGNoYXIgKilnbG9iX2RhdGFwICsgeSpnbG9iX3dpZHRoOwotCWludCB3aWR0aCA9IGdsb2Jfd2lkdGg7CisgICAgY2hhciAqZGF0YXAgPSAoY2hhciAqKWdsb2JfZGF0YXAgKyB5Kmdsb2Jfd2lkdGg7CisgICAgaW50IHdpZHRoID0gZ2xvYl93aWR0aDsKIAotCXdoaWxlICggd2lkdGgtLSApCi0JCSpkYXRhcCsrID0gKCpidWYrKykgJiAweGZmOworICAgIHdoaWxlICggd2lkdGgtLSApCisgICAgICAgICpkYXRhcCsrID0gKCpidWYrKykgJiAweGZmOwogfQogCiBzdGF0aWMgdm9pZAogeHNfcHV0XzAoc2hvcnQgKmJ1ZiwgaW50IHkpCiB7Ci0JbG9uZyAqZGF0YXAgPSBnbG9iX2RhdGFwICsgeSpnbG9iX3dpZHRoOwotCWludCB3aWR0aCA9IGdsb2Jfd2lkdGg7CisgICAgbG9uZyAqZGF0YXAgPSBnbG9iX2RhdGFwICsgeSpnbG9iX3dpZHRoOworICAgIGludCB3aWR0aCA9IGdsb2Jfd2lkdGg7CiAKLQl3aGlsZSAoIHdpZHRoLS0gKQotCQkqZGF0YXArKyA9ICgqYnVmKyspICYgMHhmZjsKKyAgICB3aGlsZSAoIHdpZHRoLS0gKQorICAgICAgICAqZGF0YXArKyA9ICgqYnVmKyspICYgMHhmZjsKIH0KIHN0YXRpYyB2b2lkCiB4c19wdXRfMTIoc2hvcnQgKmJ1ZiwgaW50IHkpCiB7Ci0JbG9uZyAqZGF0YXAgPSBnbG9iX2RhdGFwICsgeSpnbG9iX3dpZHRoOwotCWludCB3aWR0aCA9IGdsb2Jfd2lkdGg7CisgICAgbG9uZyAqZGF0YXAgPSBnbG9iX2RhdGFwICsgeSpnbG9iX3dpZHRoOworICAgIGludCB3aWR0aCA9IGdsb2Jfd2lkdGg7CiAKLQl3aGlsZSAoIHdpZHRoLS0gKQotCQkqZGF0YXArKyB8PSAoKCpidWYrKykgJiAweGZmKSA8PCAoZ2xvYl96KjgpOworICAgIHdoaWxlICggd2lkdGgtLSApCisgICAgICAgICpkYXRhcCsrIHw9ICgoKmJ1ZisrKSAmIDB4ZmYpIDw8IChnbG9iX3oqOCk7CiB9CiAKIHN0YXRpYyB2b2lkCiB4c2NhbGUoSU1BR0UgKmltYWdlLCBpbnQgeHNpemUsIGludCB5c2l6ZSwgaW50IHpzaXplLAogICAgICAgIGxvbmcgKmRhdGFwLCBpbnQgeG5ldywgaW50IHluZXcsIGludCBmbW9kZSwgZG91YmxlIGJsdXIpCiB7Ci0JZ2xvYl9pbWFnZSA9IGltYWdlOwotCWdsb2JfZGF0YXAgPSBkYXRhcDsKLQlnbG9iX3dpZHRoID0geG5ldzsKLQlnbG9iX3lzaXplID0geXNpemU7Ci0JaWYgKCB6c2l6ZSA9PSAxICkgewotCQlnbG9iX3ogPSAwOwotCQlmaWx0ZXJ6b29tKHhzX2dldCwgeHNfcHV0X2MsIHhzaXplLCB5c2l6ZSwKLQkJCSAgIHhuZXcsIHluZXcsIGZtb2RlLCBibHVyKTsKLQl9IGVsc2UgewotCQlnbG9iX3ogPSAwOwotCQlmaWx0ZXJ6b29tKHhzX2dldCwgeHNfcHV0XzAsIHhzaXplLCB5c2l6ZSwKLQkJCSAgIHhuZXcsIHluZXcsIGZtb2RlLCBibHVyKTsKLQkJZ2xvYl96ID0gMTsKLQkJZmlsdGVyem9vbSh4c19nZXQsIHhzX3B1dF8xMiwgeHNpemUsIHlzaXplLAotCQkJICAgeG5ldywgeW5ldywgZm1vZGUsIGJsdXIpOwotCQlnbG9iX3ogPSAyOwotCQlmaWx0ZXJ6b29tKHhzX2dldCwgeHNfcHV0XzEyLCB4c2l6ZSwgeXNpemUsCi0JCQkgICB4bmV3LCB5bmV3LCBmbW9kZSwgYmx1cik7Ci0JfQorICAgIGdsb2JfaW1hZ2UgPSBpbWFnZTsKKyAgICBnbG9iX2RhdGFwID0gZGF0YXA7CisgICAgZ2xvYl93aWR0aCA9IHhuZXc7CisgICAgZ2xvYl95c2l6ZSA9IHlzaXplOworICAgIGlmICggenNpemUgPT0gMSApIHsKKyAgICAgICAgZ2xvYl96ID0gMDsKKyAgICAgICAgZmlsdGVyem9vbSh4c19nZXQsIHhzX3B1dF9jLCB4c2l6ZSwgeXNpemUsCisgICAgICAgICAgICAgICAgICAgeG5ldywgeW5ldywgZm1vZGUsIGJsdXIpOworICAgIH0gZWxzZSB7CisgICAgICAgIGdsb2JfeiA9IDA7CisgICAgICAgIGZpbHRlcnpvb20oeHNfZ2V0LCB4c19wdXRfMCwgeHNpemUsIHlzaXplLAorICAgICAgICAgICAgICAgICAgIHhuZXcsIHluZXcsIGZtb2RlLCBibHVyKTsKKyAgICAgICAgZ2xvYl96ID0gMTsKKyAgICAgICAgZmlsdGVyem9vbSh4c19nZXQsIHhzX3B1dF8xMiwgeHNpemUsIHlzaXplLAorICAgICAgICAgICAgICAgICAgIHhuZXcsIHluZXcsIGZtb2RlLCBibHVyKTsKKyAgICAgICAgZ2xvYl96ID0gMjsKKyAgICAgICAgZmlsdGVyem9vbSh4c19nZXQsIHhzX3B1dF8xMiwgeHNpemUsIHlzaXplLAorICAgICAgICAgICAgICAgICAgIHhuZXcsIHluZXcsIGZtb2RlLCBibHVyKTsKKyAgICB9CiB9CiAKIAogc3RhdGljIFB5T2JqZWN0ICoKIGltZ2ZpbGVfcmVhZHNjYWxlZChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqZm5hbWU7Ci0JUHlPYmplY3QgKnJ2OwotCWludCB4c2l6ZSwgeXNpemUsIHpzaXplOwotCWNoYXIgKmNkYXRhcDsKLQlsb25nICppZGF0YXA7Ci0Jc3RhdGljIHNob3J0IHJzWzgxOTJdLCBnc1s4MTkyXSwgYnNbODE5Ml07Ci0JaW50IHgsIHk7Ci0JaW50IHh3dGQsIHl3dGQsIHhvcmlnLCB5b3JpZzsKLQlmbG9hdCB4ZmFjLCB5ZmFjOwotCUlNQUdFICppbWFnZTsKLQljaGFyICpmaWx0ZXI7Ci0JZG91YmxlIGJsdXIgPSAxLjA7Ci0JaW50IGV4dGVuZGVkOwotCWludCBmbW9kZSA9IDA7Ci0JaW50IHlmaXJzdCwgeWxhc3QsIHlzdGVwOworICAgIGNoYXIgKmZuYW1lOworICAgIFB5T2JqZWN0ICpydjsKKyAgICBpbnQgeHNpemUsIHlzaXplLCB6c2l6ZTsKKyAgICBjaGFyICpjZGF0YXA7CisgICAgbG9uZyAqaWRhdGFwOworICAgIHN0YXRpYyBzaG9ydCByc1s4MTkyXSwgZ3NbODE5Ml0sIGJzWzgxOTJdOworICAgIGludCB4LCB5OworICAgIGludCB4d3RkLCB5d3RkLCB4b3JpZywgeW9yaWc7CisgICAgZmxvYXQgeGZhYywgeWZhYzsKKyAgICBJTUFHRSAqaW1hZ2U7CisgICAgY2hhciAqZmlsdGVyOworICAgIGRvdWJsZSBibHVyID0gMS4wOworICAgIGludCBleHRlbmRlZDsKKyAgICBpbnQgZm1vZGUgPSAwOworICAgIGludCB5Zmlyc3QsIHlsYXN0LCB5c3RlcDsKIAotCS8qCi0JKiogUGFyc2UgYXJncy4gRnVubnksIHNpbmNlIGFyZyA0IGFuZCA1IGFyZSBvcHRpb25hbAotCSoqIChmaWx0ZXIgbmFtZSBhbmQgYmx1ciBmYWN0b3IpLiBBbHNvLCA0IG9yIDUgYXJndW1lbnRzIGluZGljYXRlcwotCSoqIGV4dGVuZGVkIHNjYWxlIGFsZ29yaXRobSBpbiBzdGVhZCBvZiBzaW1wbGUtbWluZGVkIHBpeGVsIGRyb3AvZHVwLgotCSovCi0JZXh0ZW5kZWQgPSBQeVR1cGxlX1NpemUoYXJncykgPj0gNDsKLQlpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzaWl8c2QiLAotCQkJICAgICAgICZmbmFtZSwgJnh3dGQsICZ5d3RkLCAmZmlsdGVyLCAmYmx1cikgKQotCQlyZXR1cm4gTlVMTDsKKyAgICAvKgorICAgICoqIFBhcnNlIGFyZ3MuIEZ1bm55LCBzaW5jZSBhcmcgNCBhbmQgNSBhcmUgb3B0aW9uYWwKKyAgICAqKiAoZmlsdGVyIG5hbWUgYW5kIGJsdXIgZmFjdG9yKS4gQWxzbywgNCBvciA1IGFyZ3VtZW50cyBpbmRpY2F0ZXMKKyAgICAqKiBleHRlbmRlZCBzY2FsZSBhbGdvcml0aG0gaW4gc3RlYWQgb2Ygc2ltcGxlLW1pbmRlZCBwaXhlbCBkcm9wL2R1cC4KKyAgICAqLworICAgIGV4dGVuZGVkID0gUHlUdXBsZV9TaXplKGFyZ3MpID49IDQ7CisgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic2lpfHNkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZmbmFtZSwgJnh3dGQsICZ5d3RkLCAmZmlsdGVyLCAmYmx1cikgKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCS8qCi0JKiogQ2hlY2sgcGFyYW1ldGVycywgb3BlbiBmaWxlIGFuZCBjaGVjayB0eXBlLCByb3dzLCBldGMuCi0JKi8KLQlpZiAoIGV4dGVuZGVkICkgewotCQlpZiAoIHN0cmNtcChmaWx0ZXIsICJpbXB1bHNlIikgPT0gMCApCi0JCQlmbW9kZSA9IElNUFVMU0U7Ci0JCWVsc2UgaWYgKCBzdHJjbXAoIGZpbHRlciwgImJveCIpID09IDAgKQotCQkJZm1vZGUgPSBCT1g7Ci0JCWVsc2UgaWYgKCBzdHJjbXAoIGZpbHRlciwgInRyaWFuZ2xlIikgPT0gMCApCi0JCQlmbW9kZSA9IFRSSUFOR0xFOwotCQllbHNlIGlmICggc3RyY21wKCBmaWx0ZXIsICJxdWFkcmF0aWMiKSA9PSAwICkKLQkJCWZtb2RlID0gUVVBRFJBVElDOwotCQllbHNlIGlmICggc3RyY21wKCBmaWx0ZXIsICJnYXVzc2lhbiIpID09IDAgKQotCQkJZm1vZGUgPSBHQVVTU0lBTjsKLQkJZWxzZSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoSW1nZmlsZUVycm9yLCAiVW5rbm93biBmaWx0ZXIgdHlwZSIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9Ci0gICAgCi0JaWYgKCAoaW1hZ2UgPSBpbWdmaWxlX29wZW4oZm5hbWUpKSA9PSBOVUxMICkKLQkJcmV0dXJuIE5VTEw7Ci0gICAgCi0JaWYgKCBpbWFnZS0+Y29sb3JtYXAgIT0gQ01fTk9STUFMICkgewotCQlpY2xvc2UoaW1hZ2UpOwotCQlQeUVycl9TZXRTdHJpbmcoSW1nZmlsZUVycm9yLAotCQkJCSJDYW4gb25seSBoYW5kbGUgQ01fTk9STUFMIGltYWdlcyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKCBCUFAoaW1hZ2UtPnR5cGUpICE9IDEgKSB7Ci0JCWljbG9zZShpbWFnZSk7Ci0JCVB5RXJyX1NldFN0cmluZyhJbWdmaWxlRXJyb3IsCi0JCQkJIkNhbid0IGhhbmRsZSBpbWdmaWxlcyB3aXRoIGJwcCE9MSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JeHNpemUgPSBpbWFnZS0+eHNpemU7Ci0JeXNpemUgPSBpbWFnZS0+eXNpemU7Ci0JenNpemUgPSBpbWFnZS0+enNpemU7Ci0JaWYgKCB6c2l6ZSAhPSAxICYmIHpzaXplICE9IDMpIHsKLQkJaWNsb3NlKGltYWdlKTsKLQkJUHlFcnJfU2V0U3RyaW5nKEltZ2ZpbGVFcnJvciwKLQkJCQkiQ2FuIG9ubHkgaGFuZGxlIDEgb3IgMyBieXRlIHBpeGVscyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKCB4c2l6ZSA+IDgxOTIgKSB7Ci0JCWljbG9zZShpbWFnZSk7Ci0JCVB5RXJyX1NldFN0cmluZyhJbWdmaWxlRXJyb3IsCi0JCQkJIkNhbid0IGhhbmRsZSBpbWFnZSB3aXRoID4gODE5MiBjb2x1bW5zIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICAvKgorICAgICoqIENoZWNrIHBhcmFtZXRlcnMsIG9wZW4gZmlsZSBhbmQgY2hlY2sgdHlwZSwgcm93cywgZXRjLgorICAgICovCisgICAgaWYgKCBleHRlbmRlZCApIHsKKyAgICAgICAgaWYgKCBzdHJjbXAoZmlsdGVyLCAiaW1wdWxzZSIpID09IDAgKQorICAgICAgICAgICAgZm1vZGUgPSBJTVBVTFNFOworICAgICAgICBlbHNlIGlmICggc3RyY21wKCBmaWx0ZXIsICJib3giKSA9PSAwICkKKyAgICAgICAgICAgIGZtb2RlID0gQk9YOworICAgICAgICBlbHNlIGlmICggc3RyY21wKCBmaWx0ZXIsICJ0cmlhbmdsZSIpID09IDAgKQorICAgICAgICAgICAgZm1vZGUgPSBUUklBTkdMRTsKKyAgICAgICAgZWxzZSBpZiAoIHN0cmNtcCggZmlsdGVyLCAicXVhZHJhdGljIikgPT0gMCApCisgICAgICAgICAgICBmbW9kZSA9IFFVQURSQVRJQzsKKyAgICAgICAgZWxzZSBpZiAoIHN0cmNtcCggZmlsdGVyLCAiZ2F1c3NpYW4iKSA9PSAwICkKKyAgICAgICAgICAgIGZtb2RlID0gR0FVU1NJQU47CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEltZ2ZpbGVFcnJvciwgIlVua25vd24gZmlsdGVyIHR5cGUiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQogCi0JaWYgKCB6c2l6ZSA9PSAzICkgenNpemUgPSA0OwotCXJ2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgeHd0ZCp5d3RkKnpzaXplKTsKLQlpZiAoIHJ2ID09IE5VTEwgKSB7Ci0JCWljbG9zZShpbWFnZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlQeUZQRV9TVEFSVF9QUk9URUNUKCJyZWFkc2NhbGVkIiwgcmV0dXJuIDApCi0JeGZhYyA9IChmbG9hdCl4c2l6ZS8oZmxvYXQpeHd0ZDsKLQl5ZmFjID0gKGZsb2F0KXlzaXplLyhmbG9hdCl5d3RkOwotCVB5RlBFX0VORF9QUk9URUNUKHlmYWMpCi0JY2RhdGFwID0gUHlTdHJpbmdfQXNTdHJpbmcocnYpOwotCWlkYXRhcCA9IChsb25nICopY2RhdGFwOworICAgIGlmICggKGltYWdlID0gaW1nZmlsZV9vcGVuKGZuYW1lKSkgPT0gTlVMTCApCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKCBleHRlbmRlZCApIHsKLQkJeHNjYWxlKGltYWdlLCB4c2l6ZSwgeXNpemUsIHpzaXplLAotCQkgICAgICAgaWRhdGFwLCB4d3RkLCB5d3RkLCBmbW9kZSwgYmx1cik7Ci0JfSBlbHNlIHsKLQkJaWYgKHRvcF90b19ib3R0b20pIHsKLQkJCXlmaXJzdCA9IHl3dGQtMTsKLQkJCXlsYXN0ID0gLTE7Ci0JCQl5c3RlcCA9IC0xOwotCQl9IGVsc2UgewotCQkJeWZpcnN0ID0gMDsKLQkJCXlsYXN0ID0geXd0ZDsKLQkJCXlzdGVwID0gMTsKLQkJfQotCQlmb3IgKCB5PXlmaXJzdDsgeSAhPSB5bGFzdCAmJiAhZXJyb3JfY2FsbGVkOyB5ICs9IHlzdGVwICkgewotCQkJeW9yaWcgPSAoaW50KSh5KnlmYWMpOwotCQkJaWYgKCB6c2l6ZSA9PSAxICkgewotCQkJCWdldHJvdyhpbWFnZSwgcnMsIHlvcmlnLCAwKTsKLQkJCQlmb3IoeD0wOyB4PHh3dGQ7IHgrKyApIHsKLQkJCQkJKmNkYXRhcCsrID0gcnNbKGludCkoeCp4ZmFjKV07CQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJZ2V0cm93KGltYWdlLCBycywgeW9yaWcsIDApOwotCQkJCWdldHJvdyhpbWFnZSwgZ3MsIHlvcmlnLCAxKTsKLQkJCQlnZXRyb3coaW1hZ2UsIGJzLCB5b3JpZywgMik7Ci0JCQkJZm9yKHg9MDsgeDx4d3RkOyB4KysgKSB7Ci0JCQkJCXhvcmlnID0gKGludCkoeCp4ZmFjKTsKLQkJCQkJKmlkYXRhcCsrID0gKHJzW3hvcmlnXSAmIDB4ZmYpICB8Ci0JCQkJCQkoKGdzW3hvcmlnXSAmIDB4ZmYpPDw4KSB8Ci0JCQkJCQkoKGJzW3hvcmlnXSAmIDB4ZmYpPDwxNik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCWljbG9zZShpbWFnZSk7Ci0JaWYgKCBlcnJvcl9jYWxsZWQgKSB7Ci0JCVB5X0RFQ1JFRihydik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gcnY7CisgICAgaWYgKCBpbWFnZS0+Y29sb3JtYXAgIT0gQ01fTk9STUFMICkgeworICAgICAgICBpY2xvc2UoaW1hZ2UpOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoSW1nZmlsZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIkNhbiBvbmx5IGhhbmRsZSBDTV9OT1JNQUwgaW1hZ2VzIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoIEJQUChpbWFnZS0+dHlwZSkgIT0gMSApIHsKKyAgICAgICAgaWNsb3NlKGltYWdlKTsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEltZ2ZpbGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJDYW4ndCBoYW5kbGUgaW1nZmlsZXMgd2l0aCBicHAhPTEiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHhzaXplID0gaW1hZ2UtPnhzaXplOworICAgIHlzaXplID0gaW1hZ2UtPnlzaXplOworICAgIHpzaXplID0gaW1hZ2UtPnpzaXplOworICAgIGlmICggenNpemUgIT0gMSAmJiB6c2l6ZSAhPSAzKSB7CisgICAgICAgIGljbG9zZShpbWFnZSk7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhJbWdmaWxlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiQ2FuIG9ubHkgaGFuZGxlIDEgb3IgMyBieXRlIHBpeGVscyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKCB4c2l6ZSA+IDgxOTIgKSB7CisgICAgICAgIGljbG9zZShpbWFnZSk7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhJbWdmaWxlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiQ2FuJ3QgaGFuZGxlIGltYWdlIHdpdGggPiA4MTkyIGNvbHVtbnMiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaWYgKCB6c2l6ZSA9PSAzICkgenNpemUgPSA0OworICAgIHJ2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgeHd0ZCp5d3RkKnpzaXplKTsKKyAgICBpZiAoIHJ2ID09IE5VTEwgKSB7CisgICAgICAgIGljbG9zZShpbWFnZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeUZQRV9TVEFSVF9QUk9URUNUKCJyZWFkc2NhbGVkIiwgcmV0dXJuIDApCisgICAgeGZhYyA9IChmbG9hdCl4c2l6ZS8oZmxvYXQpeHd0ZDsKKyAgICB5ZmFjID0gKGZsb2F0KXlzaXplLyhmbG9hdCl5d3RkOworICAgIFB5RlBFX0VORF9QUk9URUNUKHlmYWMpCisgICAgY2RhdGFwID0gUHlTdHJpbmdfQXNTdHJpbmcocnYpOworICAgIGlkYXRhcCA9IChsb25nICopY2RhdGFwOworCisgICAgaWYgKCBleHRlbmRlZCApIHsKKyAgICAgICAgeHNjYWxlKGltYWdlLCB4c2l6ZSwgeXNpemUsIHpzaXplLAorICAgICAgICAgICAgICAgaWRhdGFwLCB4d3RkLCB5d3RkLCBmbW9kZSwgYmx1cik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHRvcF90b19ib3R0b20pIHsKKyAgICAgICAgICAgIHlmaXJzdCA9IHl3dGQtMTsKKyAgICAgICAgICAgIHlsYXN0ID0gLTE7CisgICAgICAgICAgICB5c3RlcCA9IC0xOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgeWZpcnN0ID0gMDsKKyAgICAgICAgICAgIHlsYXN0ID0geXd0ZDsKKyAgICAgICAgICAgIHlzdGVwID0gMTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKCB5PXlmaXJzdDsgeSAhPSB5bGFzdCAmJiAhZXJyb3JfY2FsbGVkOyB5ICs9IHlzdGVwICkgeworICAgICAgICAgICAgeW9yaWcgPSAoaW50KSh5KnlmYWMpOworICAgICAgICAgICAgaWYgKCB6c2l6ZSA9PSAxICkgeworICAgICAgICAgICAgICAgIGdldHJvdyhpbWFnZSwgcnMsIHlvcmlnLCAwKTsKKyAgICAgICAgICAgICAgICBmb3IoeD0wOyB4PHh3dGQ7IHgrKyApIHsKKyAgICAgICAgICAgICAgICAgICAgKmNkYXRhcCsrID0gcnNbKGludCkoeCp4ZmFjKV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBnZXRyb3coaW1hZ2UsIHJzLCB5b3JpZywgMCk7CisgICAgICAgICAgICAgICAgZ2V0cm93KGltYWdlLCBncywgeW9yaWcsIDEpOworICAgICAgICAgICAgICAgIGdldHJvdyhpbWFnZSwgYnMsIHlvcmlnLCAyKTsKKyAgICAgICAgICAgICAgICBmb3IoeD0wOyB4PHh3dGQ7IHgrKyApIHsKKyAgICAgICAgICAgICAgICAgICAgeG9yaWcgPSAoaW50KSh4KnhmYWMpOworICAgICAgICAgICAgICAgICAgICAqaWRhdGFwKysgPSAocnNbeG9yaWddICYgMHhmZikgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICgoZ3NbeG9yaWddICYgMHhmZik8PDgpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICgoYnNbeG9yaWddICYgMHhmZik8PDE2KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWNsb3NlKGltYWdlKTsKKyAgICBpZiAoIGVycm9yX2NhbGxlZCApIHsKKyAgICAgICAgUHlfREVDUkVGKHJ2KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBydjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGltZ2ZpbGVfZ2V0c2l6ZXMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKmZuYW1lOwotCVB5T2JqZWN0ICpydjsKLQlJTUFHRSAqaW1hZ2U7Ci0gICAgCi0JaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczpnZXRzaXplcyIsICZmbmFtZSkgKQotCQlyZXR1cm4gTlVMTDsKLSAgICAKLQlpZiAoIChpbWFnZSA9IGltZ2ZpbGVfb3BlbihmbmFtZSkpID09IE5VTEwgKQotCQlyZXR1cm4gTlVMTDsKLQlydiA9IFB5X0J1aWxkVmFsdWUoIihpaWkpIiwgaW1hZ2UtPnhzaXplLCBpbWFnZS0+eXNpemUsIGltYWdlLT56c2l6ZSk7Ci0JaWNsb3NlKGltYWdlKTsKLQlyZXR1cm4gcnY7CisgICAgY2hhciAqZm5hbWU7CisgICAgUHlPYmplY3QgKnJ2OworICAgIElNQUdFICppbWFnZTsKKworICAgIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6Z2V0c2l6ZXMiLCAmZm5hbWUpICkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBpZiAoIChpbWFnZSA9IGltZ2ZpbGVfb3BlbihmbmFtZSkpID09IE5VTEwgKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBydiA9IFB5X0J1aWxkVmFsdWUoIihpaWkpIiwgaW1hZ2UtPnhzaXplLCBpbWFnZS0+eXNpemUsIGltYWdlLT56c2l6ZSk7CisgICAgaWNsb3NlKGltYWdlKTsKKyAgICByZXR1cm4gcnY7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbWdmaWxlX3dyaXRlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlJTUFHRSAqaW1hZ2U7Ci0JY2hhciAqZm5hbWU7Ci0JaW50IHhzaXplLCB5c2l6ZSwgenNpemUsIGxlbjsKLQljaGFyICpjZGF0YXA7Ci0JbG9uZyAqaWRhdGFwOwotCXNob3J0IHJzWzgxOTJdLCBnc1s4MTkyXSwgYnNbODE5Ml07Ci0Jc2hvcnQgciwgZywgYjsKLQlsb25nIHJnYjsKLQlpbnQgeCwgeTsKLQlpbnQgeWZpcnN0LCB5bGFzdCwgeXN0ZXA7CisgICAgSU1BR0UgKmltYWdlOworICAgIGNoYXIgKmZuYW1lOworICAgIGludCB4c2l6ZSwgeXNpemUsIHpzaXplLCBsZW47CisgICAgY2hhciAqY2RhdGFwOworICAgIGxvbmcgKmlkYXRhcDsKKyAgICBzaG9ydCByc1s4MTkyXSwgZ3NbODE5Ml0sIGJzWzgxOTJdOworICAgIHNob3J0IHIsIGcsIGI7CisgICAgbG9uZyByZ2I7CisgICAgaW50IHgsIHk7CisgICAgaW50IHlmaXJzdCwgeWxhc3QsIHlzdGVwOwogCiAKLQlpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzcyNpaWk6d3JpdGUiLAotCQkJICAmZm5hbWUsICZjZGF0YXAsICZsZW4sICZ4c2l6ZSwgJnlzaXplLCAmenNpemUpICkKLQkJcmV0dXJuIE5VTEw7Ci0gICAgCi0JaWYgKCB6c2l6ZSAhPSAxICYmIHpzaXplICE9IDMgKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhJbWdmaWxlRXJyb3IsCi0JCQkJIkNhbiBvbmx5IGhhbmRsZSAxIG9yIDMgYnl0ZSBwaXhlbHMiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmICggbGVuICE9IHhzaXplICogeXNpemUgKiAoenNpemUgPT0gMSA/IDEgOiA0KSApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKEltZ2ZpbGVFcnJvciwgIkRhdGEgZG9lcyBub3QgbWF0Y2ggc2l6ZXMiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmICggeHNpemUgPiA4MTkyICkgewotCQlQeUVycl9TZXRTdHJpbmcoSW1nZmlsZUVycm9yLAotCQkJCSJDYW4ndCBoYW5kbGUgaW1hZ2Ugd2l0aCA+IDgxOTIgY29sdW1ucyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic3MjaWlpOndyaXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAmZm5hbWUsICZjZGF0YXAsICZsZW4sICZ4c2l6ZSwgJnlzaXplLCAmenNpemUpICkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQllcnJvcl9jYWxsZWQgPSAwOwotCWVycm5vID0gMDsKLQlpbWFnZSA9aW9wZW4oZm5hbWUsICJ3IiwgUkxFKDEpLCAzLCB4c2l6ZSwgeXNpemUsIHpzaXplKTsKLQlpZiAoIGltYWdlID09IDAgKSB7Ci0JCWlmICggISBlcnJvcl9jYWxsZWQgKSB7Ci0JCQlpZiAoZXJybm8pCi0JCQkJUHlFcnJfU2V0RnJvbUVycm5vKEltZ2ZpbGVFcnJvcik7Ci0JCQllbHNlCi0JCQkJUHlFcnJfU2V0U3RyaW5nKEltZ2ZpbGVFcnJvciwKLQkJCQkJCSJDYW4ndCBjcmVhdGUgaW1hZ2UgZmlsZSIpOwotCQl9Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoIHpzaXplICE9IDEgJiYgenNpemUgIT0gMyApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEltZ2ZpbGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJDYW4gb25seSBoYW5kbGUgMSBvciAzIGJ5dGUgcGl4ZWxzIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoIGxlbiAhPSB4c2l6ZSAqIHlzaXplICogKHpzaXplID09IDEgPyAxIDogNCkgKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhJbWdmaWxlRXJyb3IsICJEYXRhIGRvZXMgbm90IG1hdGNoIHNpemVzIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoIHhzaXplID4gODE5MiApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEltZ2ZpbGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJDYW4ndCBoYW5kbGUgaW1hZ2Ugd2l0aCA+IDgxOTIgY29sdW1ucyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlpZGF0YXAgPSAobG9uZyAqKWNkYXRhcDsKLSAgICAKLQlpZiAodG9wX3RvX2JvdHRvbSkgewotCQl5Zmlyc3QgPSB5c2l6ZS0xOwotCQl5bGFzdCA9IC0xOwotCQl5c3RlcCA9IC0xOwotCX0gZWxzZSB7Ci0JCXlmaXJzdCA9IDA7Ci0JCXlsYXN0ID0geXNpemU7Ci0JCXlzdGVwID0gMTsKLQl9Ci0JZm9yICggeT15Zmlyc3Q7IHkgIT0geWxhc3QgJiYgIWVycm9yX2NhbGxlZDsgeSArPSB5c3RlcCApIHsKLQkJaWYgKCB6c2l6ZSA9PSAxICkgewotCQkJZm9yKCB4PTA7IHg8eHNpemU7IHgrKyApCi0JCQkJcnNbeF0gPSAqY2RhdGFwKys7Ci0JCQlwdXRyb3coaW1hZ2UsIHJzLCB5LCAwKTsKLQkJfSBlbHNlIHsKLQkJCWZvciggeD0wOyB4PHhzaXplOyB4KysgKSB7Ci0JCQkJcmdiID0gKmlkYXRhcCsrOwotCQkJCXIgPSByZ2IgJiAweGZmOwotCQkJCWcgPSAocmdiID4+IDggKSAmIDB4ZmY7Ci0JCQkJYiA9IChyZ2IgPj4gMTYgKSAmIDB4ZmY7Ci0JCQkJcnNbeF0gPSByOwotCQkJCWdzW3hdID0gZzsKLQkJCQlic1t4XSA9IGI7Ci0JCQl9Ci0JCQlwdXRyb3coaW1hZ2UsIHJzLCB5LCAwKTsKLQkJCXB1dHJvdyhpbWFnZSwgZ3MsIHksIDEpOwotCQkJcHV0cm93KGltYWdlLCBicywgeSwgMik7Ci0JCX0KLQl9Ci0JaWNsb3NlKGltYWdlKTsKLQlpZiAoIGVycm9yX2NhbGxlZCApCi0JCXJldHVybiBOVUxMOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKLSAgICAKKyAgICBlcnJvcl9jYWxsZWQgPSAwOworICAgIGVycm5vID0gMDsKKyAgICBpbWFnZSA9aW9wZW4oZm5hbWUsICJ3IiwgUkxFKDEpLCAzLCB4c2l6ZSwgeXNpemUsIHpzaXplKTsKKyAgICBpZiAoIGltYWdlID09IDAgKSB7CisgICAgICAgIGlmICggISBlcnJvcl9jYWxsZWQgKSB7CisgICAgICAgICAgICBpZiAoZXJybm8pCisgICAgICAgICAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKEltZ2ZpbGVFcnJvcik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEltZ2ZpbGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNhbid0IGNyZWF0ZSBpbWFnZSBmaWxlIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaWRhdGFwID0gKGxvbmcgKiljZGF0YXA7CisKKyAgICBpZiAodG9wX3RvX2JvdHRvbSkgeworICAgICAgICB5Zmlyc3QgPSB5c2l6ZS0xOworICAgICAgICB5bGFzdCA9IC0xOworICAgICAgICB5c3RlcCA9IC0xOworICAgIH0gZWxzZSB7CisgICAgICAgIHlmaXJzdCA9IDA7CisgICAgICAgIHlsYXN0ID0geXNpemU7CisgICAgICAgIHlzdGVwID0gMTsKKyAgICB9CisgICAgZm9yICggeT15Zmlyc3Q7IHkgIT0geWxhc3QgJiYgIWVycm9yX2NhbGxlZDsgeSArPSB5c3RlcCApIHsKKyAgICAgICAgaWYgKCB6c2l6ZSA9PSAxICkgeworICAgICAgICAgICAgZm9yKCB4PTA7IHg8eHNpemU7IHgrKyApCisgICAgICAgICAgICAgICAgcnNbeF0gPSAqY2RhdGFwKys7CisgICAgICAgICAgICBwdXRyb3coaW1hZ2UsIHJzLCB5LCAwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciggeD0wOyB4PHhzaXplOyB4KysgKSB7CisgICAgICAgICAgICAgICAgcmdiID0gKmlkYXRhcCsrOworICAgICAgICAgICAgICAgIHIgPSByZ2IgJiAweGZmOworICAgICAgICAgICAgICAgIGcgPSAocmdiID4+IDggKSAmIDB4ZmY7CisgICAgICAgICAgICAgICAgYiA9IChyZ2IgPj4gMTYgKSAmIDB4ZmY7CisgICAgICAgICAgICAgICAgcnNbeF0gPSByOworICAgICAgICAgICAgICAgIGdzW3hdID0gZzsKKyAgICAgICAgICAgICAgICBic1t4XSA9IGI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXRyb3coaW1hZ2UsIHJzLCB5LCAwKTsKKyAgICAgICAgICAgIHB1dHJvdyhpbWFnZSwgZ3MsIHksIDEpOworICAgICAgICAgICAgcHV0cm93KGltYWdlLCBicywgeSwgMik7CisgICAgICAgIH0KKyAgICB9CisgICAgaWNsb3NlKGltYWdlKTsKKyAgICBpZiAoIGVycm9yX2NhbGxlZCApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKKwogfQogCiAKIHN0YXRpYyBQeU1ldGhvZERlZiBpbWdmaWxlX21ldGhvZHNbXSA9IHsKLQl7ICJnZXRzaXplcyIsCWltZ2ZpbGVfZ2V0c2l6ZXMsIE1FVEhfVkFSQVJHUyB9LAotCXsgInJlYWQiLAlpbWdmaWxlX3JlYWQsIE1FVEhfVkFSQVJHUyB9LAotCXsgInJlYWRzY2FsZWQiLAlpbWdmaWxlX3JlYWRzY2FsZWQsIE1FVEhfVkFSQVJHU30sCi0JeyAid3JpdGUiLAlpbWdmaWxlX3dyaXRlLCBNRVRIX1ZBUkFSR1MgfSwKLQl7ICJ0dG9iIiwJaW1nZmlsZV90dG9iLCBNRVRIX1ZBUkFSR1MgfSwKLQl7IE5VTEwsCQlOVUxMIH0gLyogU2VudGluZWwgKi8KKyAgICB7ICJnZXRzaXplcyIsICAgICAgIGltZ2ZpbGVfZ2V0c2l6ZXMsIE1FVEhfVkFSQVJHUyB9LAorICAgIHsgInJlYWQiLCAgICAgICAgICAgaW1nZmlsZV9yZWFkLCBNRVRIX1ZBUkFSR1MgfSwKKyAgICB7ICJyZWFkc2NhbGVkIiwgICAgIGltZ2ZpbGVfcmVhZHNjYWxlZCwgTUVUSF9WQVJBUkdTfSwKKyAgICB7ICJ3cml0ZSIsICAgICAgICAgIGltZ2ZpbGVfd3JpdGUsIE1FVEhfVkFSQVJHUyB9LAorICAgIHsgInR0b2IiLCAgICAgICAgICAgaW1nZmlsZV90dG9iLCBNRVRIX1ZBUkFSR1MgfSwKKyAgICB7IE5VTEwsICAgICAgICAgICAgIE5VTEwgfSAvKiBTZW50aW5lbCAqLwogfTsKIAogCiB2b2lkCiBpbml0aW1nZmlsZSh2b2lkKQogewotCVB5T2JqZWN0ICptLCAqZDsKLQkKLQlpZiAoUHlFcnJfV2FyblB5M2soInRoZSBpbWdmaWxlIG1vZHVsZSBoYXMgYmVlbiByZW1vdmVkIGluICIKLQkgICAgICAgICAgICAgICAgICAgIlB5dGhvbiAzLjAiLCAyKSA8IDApCi0JICAgIHJldHVybjsKLQkKLQltID0gUHlfSW5pdE1vZHVsZSgiaW1nZmlsZSIsIGltZ2ZpbGVfbWV0aG9kcyk7Ci0JaWYgKG0gPT0gTlVMTCkKLQkJcmV0dXJuOwotCWQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOwotCUltZ2ZpbGVFcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbigiaW1nZmlsZS5lcnJvciIsIE5VTEwsIE5VTEwpOwotCWlmIChJbWdmaWxlRXJyb3IgIT0gTlVMTCkKLQkJUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgImVycm9yIiwgSW1nZmlsZUVycm9yKTsKKyAgICBQeU9iamVjdCAqbSwgKmQ7CisKKyAgICBpZiAoUHlFcnJfV2FyblB5M2soInRoZSBpbWdmaWxlIG1vZHVsZSBoYXMgYmVlbiByZW1vdmVkIGluICIKKyAgICAgICAgICAgICAgICAgICAgICAgIlB5dGhvbiAzLjAiLCAyKSA8IDApCisgICAgICAgIHJldHVybjsKKworICAgIG0gPSBQeV9Jbml0TW9kdWxlKCJpbWdmaWxlIiwgaW1nZmlsZV9tZXRob2RzKTsKKyAgICBpZiAobSA9PSBOVUxMKQorICAgICAgICByZXR1cm47CisgICAgZCA9IFB5TW9kdWxlX0dldERpY3QobSk7CisgICAgSW1nZmlsZUVycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJpbWdmaWxlLmVycm9yIiwgTlVMTCwgTlVMTCk7CisgICAgaWYgKEltZ2ZpbGVFcnJvciAhPSBOVUxMKQorICAgICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiZXJyb3IiLCBJbWdmaWxlRXJyb3IpOwogfQogCiAKZGlmZiAtLWdpdCBhL01vZHVsZXMvaXRlcnRvb2xzbW9kdWxlLmMgYi9Nb2R1bGVzL2l0ZXJ0b29sc21vZHVsZS5jCmluZGV4IDVmMWIxNjcuLjkxYjQ4MmQgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvaXRlcnRvb2xzbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9pdGVydG9vbHNtb2R1bGUuYwpAQCAtMiw3ICsyLDcgQEAKICNpbmNsdWRlICJQeXRob24uaCIKICNpbmNsdWRlICJzdHJ1Y3RtZW1iZXIuaCIKIAotLyogSXRlcnRvb2xzIG1vZHVsZSB3cml0dGVuIGFuZCBtYWludGFpbmVkIAorLyogSXRlcnRvb2xzIG1vZHVsZSB3cml0dGVuIGFuZCBtYWludGFpbmVkCiAgICBieSBSYXltb25kIEQuIEhldHRpbmdlciA8cHl0aG9uQHJjbi5jb20+CiAgICBDb3B5cmlnaHQgKGMpIDIwMDMgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgpAQCAtMTIsMTIgKzEyLDEyIEBACiAvKiBncm91cGJ5IG9iamVjdCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewotCVB5T2JqZWN0X0hFQUQKLQlQeU9iamVjdCAqaXQ7Ci0JUHlPYmplY3QgKmtleWZ1bmM7Ci0JUHlPYmplY3QgKnRndGtleTsKLQlQeU9iamVjdCAqY3VycmtleTsKLQlQeU9iamVjdCAqY3VycnZhbHVlOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBQeU9iamVjdCAqaXQ7CisgICAgUHlPYmplY3QgKmtleWZ1bmM7CisgICAgUHlPYmplY3QgKnRndGtleTsKKyAgICBQeU9iamVjdCAqY3VycmtleTsKKyAgICBQeU9iamVjdCAqY3VycnZhbHVlOwogfSBncm91cGJ5b2JqZWN0OwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IGdyb3VwYnlfdHlwZTsKQEAgLTI2LDExMiArMjYsMTEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ3JvdXBieV9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0Jc3RhdGljIGNoYXIgKmt3YXJnc1tdID0geyJpdGVyYWJsZSIsICJrZXkiLCBOVUxMfTsKLQlncm91cGJ5b2JqZWN0ICpnYm87Ci0gCVB5T2JqZWN0ICppdCwgKmtleWZ1bmMgPSBQeV9Ob25lOwotIAotIAlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAiT3xPOmdyb3VwYnkiLCBrd2FyZ3MsCi0JCQkJCSAmaXQsICZrZXlmdW5jKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgc3RhdGljIGNoYXIgKmt3YXJnc1tdID0geyJpdGVyYWJsZSIsICJrZXkiLCBOVUxMfTsKKyAgICBncm91cGJ5b2JqZWN0ICpnYm87CisgICAgUHlPYmplY3QgKml0LCAqa2V5ZnVuYyA9IFB5X05vbmU7CiAKLQlnYm8gPSAoZ3JvdXBieW9iamVjdCAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOwotCWlmIChnYm8gPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JZ2JvLT50Z3RrZXkgPSBOVUxMOwotCWdiby0+Y3VycmtleSA9IE5VTEw7Ci0JZ2JvLT5jdXJydmFsdWUgPSBOVUxMOwotCWdiby0+a2V5ZnVuYyA9IGtleWZ1bmM7Ci0JUHlfSU5DUkVGKGtleWZ1bmMpOwotCWdiby0+aXQgPSBQeU9iamVjdF9HZXRJdGVyKGl0KTsKLQlpZiAoZ2JvLT5pdCA9PSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRihnYm8pOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIChQeU9iamVjdCAqKWdibzsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAiT3xPOmdyb3VwYnkiLCBrd2FyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJml0LCAma2V5ZnVuYykpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgZ2JvID0gKGdyb3VwYnlvYmplY3QgKil0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKKyAgICBpZiAoZ2JvID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGdiby0+dGd0a2V5ID0gTlVMTDsKKyAgICBnYm8tPmN1cnJrZXkgPSBOVUxMOworICAgIGdiby0+Y3VycnZhbHVlID0gTlVMTDsKKyAgICBnYm8tPmtleWZ1bmMgPSBrZXlmdW5jOworICAgIFB5X0lOQ1JFRihrZXlmdW5jKTsKKyAgICBnYm8tPml0ID0gUHlPYmplY3RfR2V0SXRlcihpdCk7CisgICAgaWYgKGdiby0+aXQgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYoZ2JvKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiAoUHlPYmplY3QgKilnYm87CiB9CiAKIHN0YXRpYyB2b2lkCiBncm91cGJ5X2RlYWxsb2MoZ3JvdXBieW9iamVjdCAqZ2JvKQogewotCVB5T2JqZWN0X0dDX1VuVHJhY2soZ2JvKTsKLQlQeV9YREVDUkVGKGdiby0+aXQpOwotCVB5X1hERUNSRUYoZ2JvLT5rZXlmdW5jKTsKLQlQeV9YREVDUkVGKGdiby0+dGd0a2V5KTsKLQlQeV9YREVDUkVGKGdiby0+Y3VycmtleSk7Ci0JUHlfWERFQ1JFRihnYm8tPmN1cnJ2YWx1ZSk7Ci0JUHlfVFlQRShnYm8pLT50cF9mcmVlKGdibyk7CisgICAgUHlPYmplY3RfR0NfVW5UcmFjayhnYm8pOworICAgIFB5X1hERUNSRUYoZ2JvLT5pdCk7CisgICAgUHlfWERFQ1JFRihnYm8tPmtleWZ1bmMpOworICAgIFB5X1hERUNSRUYoZ2JvLT50Z3RrZXkpOworICAgIFB5X1hERUNSRUYoZ2JvLT5jdXJya2V5KTsKKyAgICBQeV9YREVDUkVGKGdiby0+Y3VycnZhbHVlKTsKKyAgICBQeV9UWVBFKGdibyktPnRwX2ZyZWUoZ2JvKTsKIH0KIAogc3RhdGljIGludAogZ3JvdXBieV90cmF2ZXJzZShncm91cGJ5b2JqZWN0ICpnYm8sIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotCVB5X1ZJU0lUKGdiby0+aXQpOwotCVB5X1ZJU0lUKGdiby0+a2V5ZnVuYyk7Ci0JUHlfVklTSVQoZ2JvLT50Z3RrZXkpOwotCVB5X1ZJU0lUKGdiby0+Y3VycmtleSk7Ci0JUHlfVklTSVQoZ2JvLT5jdXJydmFsdWUpOwotCXJldHVybiAwOworICAgIFB5X1ZJU0lUKGdiby0+aXQpOworICAgIFB5X1ZJU0lUKGdiby0+a2V5ZnVuYyk7CisgICAgUHlfVklTSVQoZ2JvLT50Z3RrZXkpOworICAgIFB5X1ZJU0lUKGdiby0+Y3VycmtleSk7CisgICAgUHlfVklTSVQoZ2JvLT5jdXJydmFsdWUpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZ3JvdXBieV9uZXh0KGdyb3VwYnlvYmplY3QgKmdibykKIHsKLQlQeU9iamVjdCAqbmV3dmFsdWUsICpuZXdrZXksICpyLCAqZ3JvdXBlciwgKnRtcDsKKyAgICBQeU9iamVjdCAqbmV3dmFsdWUsICpuZXdrZXksICpyLCAqZ3JvdXBlciwgKnRtcDsKIAotCS8qIHNraXAgdG8gbmV4dCBpdGVyYXRpb24gZ3JvdXAgKi8KLQlmb3IgKDs7KSB7Ci0JCWlmIChnYm8tPmN1cnJrZXkgPT0gTlVMTCkKLQkJCS8qIHBhc3MgKi87Ci0JCWVsc2UgaWYgKGdiby0+dGd0a2V5ID09IE5VTEwpCi0JCQlicmVhazsKLQkJZWxzZSB7Ci0JCQlpbnQgcmNtcDsKKyAgICAvKiBza2lwIHRvIG5leHQgaXRlcmF0aW9uIGdyb3VwICovCisgICAgZm9yICg7OykgeworICAgICAgICBpZiAoZ2JvLT5jdXJya2V5ID09IE5VTEwpCisgICAgICAgICAgICAvKiBwYXNzICovOworICAgICAgICBlbHNlIGlmIChnYm8tPnRndGtleSA9PSBOVUxMKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaW50IHJjbXA7CiAKLQkJCXJjbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woZ2JvLT50Z3RrZXksCi0JCQkJCQkJZ2JvLT5jdXJya2V5LCBQeV9FUSk7Ci0JCQlpZiAocmNtcCA9PSAtMSkKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCWVsc2UgaWYgKHJjbXAgPT0gMCkKLQkJCQlicmVhazsKLQkJfQorICAgICAgICAgICAgcmNtcCA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChnYm8tPnRndGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2JvLT5jdXJya2V5LCBQeV9FUSk7CisgICAgICAgICAgICBpZiAocmNtcCA9PSAtMSkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIGVsc2UgaWYgKHJjbXAgPT0gMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogCi0JCW5ld3ZhbHVlID0gUHlJdGVyX05leHQoZ2JvLT5pdCk7Ci0JCWlmIChuZXd2YWx1ZSA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7CisgICAgICAgIG5ld3ZhbHVlID0gUHlJdGVyX05leHQoZ2JvLT5pdCk7CisgICAgICAgIGlmIChuZXd2YWx1ZSA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkJaWYgKGdiby0+a2V5ZnVuYyA9PSBQeV9Ob25lKSB7Ci0JCQluZXdrZXkgPSBuZXd2YWx1ZTsKLQkJCVB5X0lOQ1JFRihuZXd2YWx1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQluZXdrZXkgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGdiby0+a2V5ZnVuYywKLQkJCQkJCQkgICAgICBuZXd2YWx1ZSwgTlVMTCk7Ci0JCQlpZiAobmV3a2V5ID09IE5VTEwpIHsKLQkJCQlQeV9ERUNSRUYobmV3dmFsdWUpOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQl9CisgICAgICAgIGlmIChnYm8tPmtleWZ1bmMgPT0gUHlfTm9uZSkgeworICAgICAgICAgICAgbmV3a2V5ID0gbmV3dmFsdWU7CisgICAgICAgICAgICBQeV9JTkNSRUYobmV3dmFsdWUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbmV3a2V5ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhnYm8tPmtleWZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld3ZhbHVlLCBOVUxMKTsKKyAgICAgICAgICAgIGlmIChuZXdrZXkgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihuZXd2YWx1ZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQl0bXAgPSBnYm8tPmN1cnJrZXk7Ci0JCWdiby0+Y3VycmtleSA9IG5ld2tleTsKLQkJUHlfWERFQ1JFRih0bXApOworICAgICAgICB0bXAgPSBnYm8tPmN1cnJrZXk7CisgICAgICAgIGdiby0+Y3VycmtleSA9IG5ld2tleTsKKyAgICAgICAgUHlfWERFQ1JFRih0bXApOwogCi0JCXRtcCA9IGdiby0+Y3VycnZhbHVlOwotCQlnYm8tPmN1cnJ2YWx1ZSA9IG5ld3ZhbHVlOwotCQlQeV9YREVDUkVGKHRtcCk7Ci0JfQorICAgICAgICB0bXAgPSBnYm8tPmN1cnJ2YWx1ZTsKKyAgICAgICAgZ2JvLT5jdXJydmFsdWUgPSBuZXd2YWx1ZTsKKyAgICAgICAgUHlfWERFQ1JFRih0bXApOworICAgIH0KIAotCVB5X0lOQ1JFRihnYm8tPmN1cnJrZXkpOwotCXRtcCA9IGdiby0+dGd0a2V5OwotCWdiby0+dGd0a2V5ID0gZ2JvLT5jdXJya2V5OwotCVB5X1hERUNSRUYodG1wKTsKKyAgICBQeV9JTkNSRUYoZ2JvLT5jdXJya2V5KTsKKyAgICB0bXAgPSBnYm8tPnRndGtleTsKKyAgICBnYm8tPnRndGtleSA9IGdiby0+Y3VycmtleTsKKyAgICBQeV9YREVDUkVGKHRtcCk7CiAKLQlncm91cGVyID0gX2dyb3VwZXJfY3JlYXRlKGdibywgZ2JvLT50Z3RrZXkpOwotCWlmIChncm91cGVyID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIGdyb3VwZXIgPSBfZ3JvdXBlcl9jcmVhdGUoZ2JvLCBnYm8tPnRndGtleSk7CisgICAgaWYgKGdyb3VwZXIgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlyID0gUHlUdXBsZV9QYWNrKDIsIGdiby0+Y3VycmtleSwgZ3JvdXBlcik7Ci0JUHlfREVDUkVGKGdyb3VwZXIpOwotCXJldHVybiByOworICAgIHIgPSBQeVR1cGxlX1BhY2soMiwgZ2JvLT5jdXJya2V5LCBncm91cGVyKTsKKyAgICBQeV9ERUNSRUYoZ3JvdXBlcik7CisgICAgcmV0dXJuIHI7CiB9CiAKIFB5RG9jX1NUUlZBUihncm91cGJ5X2RvYywKQEAgLTEzOSw1NiArMTM5LDU2IEBACiAoa2V5LCBzdWItaXRlcmF0b3IpIGdyb3VwZWQgYnkgZWFjaCB2YWx1ZSBvZiBrZXkodmFsdWUpLlxuIik7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgZ3JvdXBieV90eXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotCSJpdGVydG9vbHMuZ3JvdXBieSIsCQkvKiB0cF9uYW1lICovCi0Jc2l6ZW9mKGdyb3VwYnlvYmplY3QpLAkJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpZ3JvdXBieV9kZWFsbG9jLAkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkwLAkJCQkvKiB0cF9yZXByICovCi0JMCwJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkvKiB0cF9zdHIgKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQyB8Ci0JCVB5X1RQRkxBR1NfQkFTRVRZUEUsCS8qIHRwX2ZsYWdzICovCi0JZ3JvdXBieV9kb2MsCQkJLyogdHBfZG9jICovCi0JKHRyYXZlcnNlcHJvYylncm91cGJ5X3RyYXZlcnNlLAkvKiB0cF90cmF2ZXJzZSAqLwotCTAsCQkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCVB5T2JqZWN0X1NlbGZJdGVyLAkJLyogdHBfaXRlciAqLwotCShpdGVybmV4dGZ1bmMpZ3JvdXBieV9uZXh0LAkvKiB0cF9pdGVybmV4dCAqLwotCTAsCQkJCS8qIHRwX21ldGhvZHMgKi8KLQkwLAkJCQkvKiB0cF9tZW1iZXJzICovCi0JMCwJCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCS8qIHRwX2RpY3QgKi8KLQkwLAkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KLQkwLAkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCi0JMCwJCQkJLyogdHBfaW5pdCAqLwotCTAsCQkJCS8qIHRwX2FsbG9jICovCi0JZ3JvdXBieV9uZXcsCQkJLyogdHBfbmV3ICovCi0JUHlPYmplY3RfR0NfRGVsLAkJLyogdHBfZnJlZSAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQorICAgICJpdGVydG9vbHMuZ3JvdXBieSIsICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICBzaXplb2YoZ3JvdXBieW9iamVjdCksICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3Rvcilncm91cGJ5X2RlYWxsb2MsICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDIHwKKyAgICAgICAgUHlfVFBGTEFHU19CQVNFVFlQRSwgICAgICAgICAgICAvKiB0cF9mbGFncyAqLworICAgIGdyb3VwYnlfZG9jLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2MpZ3JvdXBieV90cmF2ZXJzZSwgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgUHlPYmplY3RfU2VsZkl0ZXIsICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIChpdGVybmV4dGZ1bmMpZ3JvdXBieV9uZXh0LCAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBncm91cGJ5X25ldywgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICBQeU9iamVjdF9HQ19EZWwsICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCiB9OwogCiAKIC8qIF9ncm91cGVyIG9iamVjdCAoaW50ZXJuYWwpICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewotCVB5T2JqZWN0X0hFQUQKLQlQeU9iamVjdCAqcGFyZW50OwotCVB5T2JqZWN0ICp0Z3RrZXk7CisgICAgUHlPYmplY3RfSEVBRAorICAgIFB5T2JqZWN0ICpwYXJlbnQ7CisgICAgUHlPYmplY3QgKnRndGtleTsKIH0gX2dyb3VwZXJvYmplY3Q7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgX2dyb3VwZXJfdHlwZTsKQEAgLTE5NiwxMjkgKzE5NiwxMjkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBfZ3JvdXBlcl9jcmVhdGUoZ3JvdXBieW9iamVjdCAqcGFyZW50LCBQeU9iamVjdCAqdGd0a2V5KQogewotCV9ncm91cGVyb2JqZWN0ICppZ287CisgICAgX2dyb3VwZXJvYmplY3QgKmlnbzsKIAotCWlnbyA9IFB5T2JqZWN0X0dDX05ldyhfZ3JvdXBlcm9iamVjdCwgJl9ncm91cGVyX3R5cGUpOwotCWlmIChpZ28gPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JaWdvLT5wYXJlbnQgPSAoUHlPYmplY3QgKilwYXJlbnQ7Ci0JUHlfSU5DUkVGKHBhcmVudCk7Ci0JaWdvLT50Z3RrZXkgPSB0Z3RrZXk7Ci0JUHlfSU5DUkVGKHRndGtleSk7CisgICAgaWdvID0gUHlPYmplY3RfR0NfTmV3KF9ncm91cGVyb2JqZWN0LCAmX2dyb3VwZXJfdHlwZSk7CisgICAgaWYgKGlnbyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZ28tPnBhcmVudCA9IChQeU9iamVjdCAqKXBhcmVudDsKKyAgICBQeV9JTkNSRUYocGFyZW50KTsKKyAgICBpZ28tPnRndGtleSA9IHRndGtleTsKKyAgICBQeV9JTkNSRUYodGd0a2V5KTsKIAotCVB5T2JqZWN0X0dDX1RyYWNrKGlnbyk7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWlnbzsKKyAgICBQeU9iamVjdF9HQ19UcmFjayhpZ28pOworICAgIHJldHVybiAoUHlPYmplY3QgKilpZ287CiB9CiAKIHN0YXRpYyB2b2lkCiBfZ3JvdXBlcl9kZWFsbG9jKF9ncm91cGVyb2JqZWN0ICppZ28pCiB7Ci0JUHlPYmplY3RfR0NfVW5UcmFjayhpZ28pOwotCVB5X0RFQ1JFRihpZ28tPnBhcmVudCk7Ci0JUHlfREVDUkVGKGlnby0+dGd0a2V5KTsKLQlQeU9iamVjdF9HQ19EZWwoaWdvKTsKKyAgICBQeU9iamVjdF9HQ19VblRyYWNrKGlnbyk7CisgICAgUHlfREVDUkVGKGlnby0+cGFyZW50KTsKKyAgICBQeV9ERUNSRUYoaWdvLT50Z3RrZXkpOworICAgIFB5T2JqZWN0X0dDX0RlbChpZ28pOwogfQogCiBzdGF0aWMgaW50CiBfZ3JvdXBlcl90cmF2ZXJzZShfZ3JvdXBlcm9iamVjdCAqaWdvLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlQeV9WSVNJVChpZ28tPnBhcmVudCk7Ci0JUHlfVklTSVQoaWdvLT50Z3RrZXkpOwotCXJldHVybiAwOworICAgIFB5X1ZJU0lUKGlnby0+cGFyZW50KTsKKyAgICBQeV9WSVNJVChpZ28tPnRndGtleSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBfZ3JvdXBlcl9uZXh0KF9ncm91cGVyb2JqZWN0ICppZ28pCiB7Ci0JZ3JvdXBieW9iamVjdCAqZ2JvID0gKGdyb3VwYnlvYmplY3QgKilpZ28tPnBhcmVudDsKLQlQeU9iamVjdCAqbmV3dmFsdWUsICpuZXdrZXksICpyOwotCWludCByY21wOworICAgIGdyb3VwYnlvYmplY3QgKmdibyA9IChncm91cGJ5b2JqZWN0ICopaWdvLT5wYXJlbnQ7CisgICAgUHlPYmplY3QgKm5ld3ZhbHVlLCAqbmV3a2V5LCAqcjsKKyAgICBpbnQgcmNtcDsKIAotCWlmIChnYm8tPmN1cnJ2YWx1ZSA9PSBOVUxMKSB7Ci0JCW5ld3ZhbHVlID0gUHlJdGVyX05leHQoZ2JvLT5pdCk7Ci0JCWlmIChuZXd2YWx1ZSA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKGdiby0+Y3VycnZhbHVlID09IE5VTEwpIHsKKyAgICAgICAgbmV3dmFsdWUgPSBQeUl0ZXJfTmV4dChnYm8tPml0KTsKKyAgICAgICAgaWYgKG5ld3ZhbHVlID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKIAotCQlpZiAoZ2JvLT5rZXlmdW5jID09IFB5X05vbmUpIHsKLQkJCW5ld2tleSA9IG5ld3ZhbHVlOwotCQkJUHlfSU5DUkVGKG5ld3ZhbHVlKTsKLQkJfSBlbHNlIHsKLQkJCW5ld2tleSA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoZ2JvLT5rZXlmdW5jLAotCQkJCQkJCSAgICAgIG5ld3ZhbHVlLCBOVUxMKTsKLQkJCWlmIChuZXdrZXkgPT0gTlVMTCkgewotCQkJCVB5X0RFQ1JFRihuZXd2YWx1ZSk7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCX0KKyAgICAgICAgaWYgKGdiby0+a2V5ZnVuYyA9PSBQeV9Ob25lKSB7CisgICAgICAgICAgICBuZXdrZXkgPSBuZXd2YWx1ZTsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihuZXd2YWx1ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBuZXdrZXkgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGdiby0+a2V5ZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3dmFsdWUsIE5VTEwpOworICAgICAgICAgICAgaWYgKG5ld2tleSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKG5ld3ZhbHVlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCWFzc2VydChnYm8tPmN1cnJrZXkgPT0gTlVMTCk7Ci0JCWdiby0+Y3VycmtleSA9IG5ld2tleTsKLQkJZ2JvLT5jdXJydmFsdWUgPSBuZXd2YWx1ZTsKLQl9CisgICAgICAgIGFzc2VydChnYm8tPmN1cnJrZXkgPT0gTlVMTCk7CisgICAgICAgIGdiby0+Y3VycmtleSA9IG5ld2tleTsKKyAgICAgICAgZ2JvLT5jdXJydmFsdWUgPSBuZXd2YWx1ZTsKKyAgICB9CiAKLQlhc3NlcnQoZ2JvLT5jdXJya2V5ICE9IE5VTEwpOwotCXJjbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woaWdvLT50Z3RrZXksIGdiby0+Y3VycmtleSwgUHlfRVEpOwotCWlmIChyY21wIDw9IDApCi0JCS8qIGdvdCBhbnkgZXJyb3Igb3IgY3VycmVudCBncm91cCBpcyBlbmQgKi8KLQkJcmV0dXJuIE5VTEw7CisgICAgYXNzZXJ0KGdiby0+Y3VycmtleSAhPSBOVUxMKTsKKyAgICByY21wID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKGlnby0+dGd0a2V5LCBnYm8tPmN1cnJrZXksIFB5X0VRKTsKKyAgICBpZiAocmNtcCA8PSAwKQorICAgICAgICAvKiBnb3QgYW55IGVycm9yIG9yIGN1cnJlbnQgZ3JvdXAgaXMgZW5kICovCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JciA9IGdiby0+Y3VycnZhbHVlOwotCWdiby0+Y3VycnZhbHVlID0gTlVMTDsKLQlQeV9DTEVBUihnYm8tPmN1cnJrZXkpOworICAgIHIgPSBnYm8tPmN1cnJ2YWx1ZTsKKyAgICBnYm8tPmN1cnJ2YWx1ZSA9IE5VTEw7CisgICAgUHlfQ0xFQVIoZ2JvLT5jdXJya2V5KTsKIAotCXJldHVybiByOworICAgIHJldHVybiByOwogfQogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IF9ncm91cGVyX3R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JIml0ZXJ0b29scy5fZ3JvdXBlciIsCQkvKiB0cF9uYW1lICovCi0Jc2l6ZW9mKF9ncm91cGVyb2JqZWN0KSwJCS8qIHRwX2Jhc2ljc2l6ZSAqLwotCTAsCQkJCS8qIHRwX2l0ZW1zaXplICovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKV9ncm91cGVyX2RlYWxsb2MsCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJLyogdHBfY29tcGFyZSAqLwotCTAsCQkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJLyogdHBfY2FsbCAqLwotCTAsCQkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDLAkvKiB0cF9mbGFncyAqLwotCTAsCQkJCS8qIHRwX2RvYyAqLwotCSh0cmF2ZXJzZXByb2MpX2dyb3VwZXJfdHJhdmVyc2UsLyogdHBfdHJhdmVyc2UgKi8KLQkwLAkJCQkvKiB0cF9jbGVhciAqLwotCTAsCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQlQeU9iamVjdF9TZWxmSXRlciwJCS8qIHRwX2l0ZXIgKi8KLQkoaXRlcm5leHRmdW5jKV9ncm91cGVyX25leHQsCS8qIHRwX2l0ZXJuZXh0ICovCi0JMCwJCQkJLyogdHBfbWV0aG9kcyAqLwotCTAsCQkJCS8qIHRwX21lbWJlcnMgKi8KLQkwLAkJCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQkwLAkJCQkvKiB0cF9pbml0ICovCi0JMCwJCQkJLyogdHBfYWxsb2MgKi8KLQkwLAkJCQkvKiB0cF9uZXcgKi8KLQlQeU9iamVjdF9HQ19EZWwsCQkvKiB0cF9mcmVlICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisgICAgIml0ZXJ0b29scy5fZ3JvdXBlciIsICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgIHNpemVvZihfZ3JvdXBlcm9iamVjdCksICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKV9ncm91cGVyX2RlYWxsb2MsICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAodHJhdmVyc2Vwcm9jKV9ncm91cGVyX3RyYXZlcnNlLC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgUHlPYmplY3RfU2VsZkl0ZXIsICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIChpdGVybmV4dGZ1bmMpX2dyb3VwZXJfbmV4dCwgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICBQeU9iamVjdF9HQ19EZWwsICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCiB9OwogCi0gCisKIAogLyogdGVlIG9iamVjdCBhbmQgd2l0aCBzdXBwb3J0aW5nIGZ1bmN0aW9uIGFuZCBvYmplY3RzICoqKioqKioqKioqKioqKi8KIAogLyogVGhlIHRlZWRhdGFvYmplY3QgcHJlLWFsbG9jYXRlcyBzcGFjZSBmb3IgTElOS0NFTExTIG51bWJlciBvZiBvYmplY3RzLgogICAgVG8gaGVscCB0aGUgb2JqZWN0IGZpdCBuZWF0bHkgaW5zaWRlIGNhY2hlIGxpbmVzIChzcGFjZSBmb3IgMTYgdG8gMzIKLSAgIHBvaW50ZXJzKSwgdGhlIHZhbHVlIHNob3VsZCBiZSBhIG11bHRpcGxlIG9mIDE2IG1pbnVzICBzcGFjZSBmb3IgCisgICBwb2ludGVycyksIHRoZSB2YWx1ZSBzaG91bGQgYmUgYSBtdWx0aXBsZSBvZiAxNiBtaW51cyAgc3BhY2UgZm9yCiAgICB0aGUgb3RoZXIgc3RydWN0dXJlIG1lbWJlcnMgaW5jbHVkaW5nIFB5SEVBRCBvdmVyaGVhZC4gIFRoZSBsYXJnZXIgdGhlCiAgICB2YWx1ZSwgdGhlIGxlc3MgbWVtb3J5IG92ZXJoZWFkIHBlciBvYmplY3QgYW5kIHRoZSBsZXNzIHRpbWUgc3BlbnQKICAgIGFsbG9jYXRpbmcvZGVhbGxvY2F0aW5nIG5ldyBsaW5rcy4gIFRoZSBzbWFsbGVyIHRoZSBudW1iZXIsIHRoZSBsZXNzCkBAIC0zMjcsMTggKzMyNywxOCBAQAogI2RlZmluZSBMSU5LQ0VMTFMgNTcKIAogdHlwZWRlZiBzdHJ1Y3QgewotCVB5T2JqZWN0X0hFQUQKLQlQeU9iamVjdCAqaXQ7Ci0JaW50IG51bXJlYWQ7Ci0JUHlPYmplY3QgKm5leHRsaW5rOwotCVB5T2JqZWN0ICoodmFsdWVzW0xJTktDRUxMU10pOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBQeU9iamVjdCAqaXQ7CisgICAgaW50IG51bXJlYWQ7CisgICAgUHlPYmplY3QgKm5leHRsaW5rOworICAgIFB5T2JqZWN0ICoodmFsdWVzW0xJTktDRUxMU10pOwogfSB0ZWVkYXRhb2JqZWN0OwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCXRlZWRhdGFvYmplY3QgKmRhdGFvYmo7Ci0JaW50IGluZGV4OwotCVB5T2JqZWN0ICp3ZWFrcmVmbGlzdDsKKyAgICBQeU9iamVjdF9IRUFECisgICAgdGVlZGF0YW9iamVjdCAqZGF0YW9iajsKKyAgICBpbnQgaW5kZXg7CisgICAgUHlPYmplY3QgKndlYWtyZWZsaXN0OwogfSB0ZWVvYmplY3Q7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgdGVlZGF0YW9iamVjdF90eXBlOwpAQCAtMzQ2LDEyMyArMzQ2LDEyMyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHRlZWRhdGFvYmplY3RfbmV3KFB5T2JqZWN0ICppdCkKIHsKLQl0ZWVkYXRhb2JqZWN0ICp0ZG87CisgICAgdGVlZGF0YW9iamVjdCAqdGRvOwogCi0JdGRvID0gUHlPYmplY3RfR0NfTmV3KHRlZWRhdGFvYmplY3QsICZ0ZWVkYXRhb2JqZWN0X3R5cGUpOwotCWlmICh0ZG8gPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgdGRvID0gUHlPYmplY3RfR0NfTmV3KHRlZWRhdGFvYmplY3QsICZ0ZWVkYXRhb2JqZWN0X3R5cGUpOworICAgIGlmICh0ZG8gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQl0ZG8tPm51bXJlYWQgPSAwOwotCXRkby0+bmV4dGxpbmsgPSBOVUxMOwotCVB5X0lOQ1JFRihpdCk7Ci0JdGRvLT5pdCA9IGl0OwotCVB5T2JqZWN0X0dDX1RyYWNrKHRkbyk7Ci0JcmV0dXJuIChQeU9iamVjdCAqKXRkbzsKKyAgICB0ZG8tPm51bXJlYWQgPSAwOworICAgIHRkby0+bmV4dGxpbmsgPSBOVUxMOworICAgIFB5X0lOQ1JFRihpdCk7CisgICAgdGRvLT5pdCA9IGl0OworICAgIFB5T2JqZWN0X0dDX1RyYWNrKHRkbyk7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKXRkbzsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHRlZWRhdGFvYmplY3RfanVtcGxpbmsodGVlZGF0YW9iamVjdCAqdGRvKQogewotCWlmICh0ZG8tPm5leHRsaW5rID09IE5VTEwpCi0JCXRkby0+bmV4dGxpbmsgPSB0ZWVkYXRhb2JqZWN0X25ldyh0ZG8tPml0KTsKLQlQeV9YSU5DUkVGKHRkby0+bmV4dGxpbmspOwotCXJldHVybiB0ZG8tPm5leHRsaW5rOworICAgIGlmICh0ZG8tPm5leHRsaW5rID09IE5VTEwpCisgICAgICAgIHRkby0+bmV4dGxpbmsgPSB0ZWVkYXRhb2JqZWN0X25ldyh0ZG8tPml0KTsKKyAgICBQeV9YSU5DUkVGKHRkby0+bmV4dGxpbmspOworICAgIHJldHVybiB0ZG8tPm5leHRsaW5rOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogdGVlZGF0YW9iamVjdF9nZXRpdGVtKHRlZWRhdGFvYmplY3QgKnRkbywgaW50IGkpCiB7Ci0JUHlPYmplY3QgKnZhbHVlOworICAgIFB5T2JqZWN0ICp2YWx1ZTsKIAotCWFzc2VydChpIDwgTElOS0NFTExTKTsKLQlpZiAoaSA8IHRkby0+bnVtcmVhZCkKLQkJdmFsdWUgPSB0ZG8tPnZhbHVlc1tpXTsKLQllbHNlIHsKLQkJLyogdGhpcyBpcyB0aGUgbGVhZCBpdGVyYXRvciwgc28gZmV0Y2ggbW9yZSBkYXRhICovCi0JCWFzc2VydChpID09IHRkby0+bnVtcmVhZCk7Ci0JCXZhbHVlID0gUHlJdGVyX05leHQodGRvLT5pdCk7Ci0JCWlmICh2YWx1ZSA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCXRkby0+bnVtcmVhZCsrOwotCQl0ZG8tPnZhbHVlc1tpXSA9IHZhbHVlOwotCX0KLQlQeV9JTkNSRUYodmFsdWUpOwotCXJldHVybiB2YWx1ZTsKKyAgICBhc3NlcnQoaSA8IExJTktDRUxMUyk7CisgICAgaWYgKGkgPCB0ZG8tPm51bXJlYWQpCisgICAgICAgIHZhbHVlID0gdGRvLT52YWx1ZXNbaV07CisgICAgZWxzZSB7CisgICAgICAgIC8qIHRoaXMgaXMgdGhlIGxlYWQgaXRlcmF0b3IsIHNvIGZldGNoIG1vcmUgZGF0YSAqLworICAgICAgICBhc3NlcnQoaSA9PSB0ZG8tPm51bXJlYWQpOworICAgICAgICB2YWx1ZSA9IFB5SXRlcl9OZXh0KHRkby0+aXQpOworICAgICAgICBpZiAodmFsdWUgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB0ZG8tPm51bXJlYWQrKzsKKyAgICAgICAgdGRvLT52YWx1ZXNbaV0gPSB2YWx1ZTsKKyAgICB9CisgICAgUHlfSU5DUkVGKHZhbHVlKTsKKyAgICByZXR1cm4gdmFsdWU7CiB9CiAKIHN0YXRpYyBpbnQKIHRlZWRhdGFvYmplY3RfdHJhdmVyc2UodGVlZGF0YW9iamVjdCAqdGRvLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKiBhcmcpCiB7Ci0JaW50IGk7Ci0JUHlfVklTSVQodGRvLT5pdCk7Ci0JZm9yIChpID0gMDsgaSA8IHRkby0+bnVtcmVhZDsgaSsrKQotCQlQeV9WSVNJVCh0ZG8tPnZhbHVlc1tpXSk7Ci0JUHlfVklTSVQodGRvLT5uZXh0bGluayk7Ci0JcmV0dXJuIDA7CisgICAgaW50IGk7CisgICAgUHlfVklTSVQodGRvLT5pdCk7CisgICAgZm9yIChpID0gMDsgaSA8IHRkby0+bnVtcmVhZDsgaSsrKQorICAgICAgICBQeV9WSVNJVCh0ZG8tPnZhbHVlc1tpXSk7CisgICAgUHlfVklTSVQodGRvLT5uZXh0bGluayk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIHRlZWRhdGFvYmplY3RfY2xlYXIodGVlZGF0YW9iamVjdCAqdGRvKQogewotCWludCBpOwotCVB5X0NMRUFSKHRkby0+aXQpOwotCWZvciAoaT0wIDsgaTx0ZG8tPm51bXJlYWQgOyBpKyspCi0JCVB5X0NMRUFSKHRkby0+dmFsdWVzW2ldKTsKLQlQeV9DTEVBUih0ZG8tPm5leHRsaW5rKTsKLQlyZXR1cm4gMDsKKyAgICBpbnQgaTsKKyAgICBQeV9DTEVBUih0ZG8tPml0KTsKKyAgICBmb3IgKGk9MCA7IGk8dGRvLT5udW1yZWFkIDsgaSsrKQorICAgICAgICBQeV9DTEVBUih0ZG8tPnZhbHVlc1tpXSk7CisgICAgUHlfQ0xFQVIodGRvLT5uZXh0bGluayk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkCiB0ZWVkYXRhb2JqZWN0X2RlYWxsb2ModGVlZGF0YW9iamVjdCAqdGRvKQogewotCVB5T2JqZWN0X0dDX1VuVHJhY2sodGRvKTsKLQl0ZWVkYXRhb2JqZWN0X2NsZWFyKHRkbyk7Ci0JUHlPYmplY3RfR0NfRGVsKHRkbyk7CisgICAgUHlPYmplY3RfR0NfVW5UcmFjayh0ZG8pOworICAgIHRlZWRhdGFvYmplY3RfY2xlYXIodGRvKTsKKyAgICBQeU9iamVjdF9HQ19EZWwodGRvKTsKIH0KIAogUHlEb2NfU1RSVkFSKHRlZWRhdGFvYmplY3RfZG9jLCAiRGF0YSBjb250YWluZXIgY29tbW9uIHRvIG11bHRpcGxlIHRlZSBvYmplY3RzLiIpOwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IHRlZWRhdGFvYmplY3RfdHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoMCwgMCkJLyogTXVzdCBmaWxsIGluIHR5cGUgdmFsdWUgbGF0ZXIgKi8KLQkiaXRlcnRvb2xzLnRlZV9kYXRhb2JqZWN0IiwJCS8qIHRwX25hbWUgKi8KLQlzaXplb2YodGVlZGF0YW9iamVjdCksCQkJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJCS8qIHRwX2l0ZW1zaXplICovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKXRlZWRhdGFvYmplY3RfZGVhbGxvYywJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfY29tcGFyZSAqLwotCTAsCQkJCQkvKiB0cF9yZXByICovCi0JMCwJCQkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJCQkJCS8qIHRwX2hhc2ggKi8KLQkwLAkJCQkJLyogdHBfY2FsbCAqLwotCTAsCQkJCQkvKiB0cF9zdHIgKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQywJLyogdHBfZmxhZ3MgKi8KLQl0ZWVkYXRhb2JqZWN0X2RvYywJCQkvKiB0cF9kb2MgKi8KLQkodHJhdmVyc2Vwcm9jKXRlZWRhdGFvYmplY3RfdHJhdmVyc2UsCS8qIHRwX3RyYXZlcnNlICovCi0JKGlucXVpcnkpdGVlZGF0YW9iamVjdF9jbGVhciwJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkJLyogdHBfaXRlcm5leHQgKi8KLQkwLAkJCQkJLyogdHBfbWV0aG9kcyAqLwotCTAsCQkJCQkvKiB0cF9tZW1iZXJzICovCi0JMCwJCQkJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJCS8qIHRwX2RpY3QgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2luaXQgKi8KLQkwLAkJCQkJLyogdHBfYWxsb2MgKi8KLQkwLAkJCQkJLyogdHBfbmV3ICovCi0JUHlPYmplY3RfR0NfRGVsLAkJCS8qIHRwX2ZyZWUgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoMCwgMCkgICAgICAgICAvKiBNdXN0IGZpbGwgaW4gdHlwZSB2YWx1ZSBsYXRlciAqLworICAgICJpdGVydG9vbHMudGVlX2RhdGFvYmplY3QiLCAgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgIHNpemVvZih0ZWVkYXRhb2JqZWN0KSwgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3Rvcil0ZWVkYXRhb2JqZWN0X2RlYWxsb2MsICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDLCAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCisgICAgdGVlZGF0YW9iamVjdF9kb2MsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAodHJhdmVyc2Vwcm9jKXRlZWRhdGFvYmplY3RfdHJhdmVyc2UsICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgKGlucXVpcnkpdGVlZGF0YW9iamVjdF9jbGVhciwgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworICAgIFB5T2JqZWN0X0dDX0RlbCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKIAogCkBAIC00NzEsNDIgKzQ3MSw0MiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHRlZV9uZXh0KHRlZW9iamVjdCAqdG8pCiB7Ci0JUHlPYmplY3QgKnZhbHVlLCAqbGluazsKKyAgICBQeU9iamVjdCAqdmFsdWUsICpsaW5rOwogCi0JaWYgKHRvLT5pbmRleCA+PSBMSU5LQ0VMTFMpIHsKLQkJbGluayA9IHRlZWRhdGFvYmplY3RfanVtcGxpbmsodG8tPmRhdGFvYmopOwotCQlQeV9ERUNSRUYodG8tPmRhdGFvYmopOwotCQl0by0+ZGF0YW9iaiA9ICh0ZWVkYXRhb2JqZWN0ICopbGluazsKLQkJdG8tPmluZGV4ID0gMDsKLQl9Ci0JdmFsdWUgPSB0ZWVkYXRhb2JqZWN0X2dldGl0ZW0odG8tPmRhdGFvYmosIHRvLT5pbmRleCk7Ci0JaWYgKHZhbHVlID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXRvLT5pbmRleCsrOwotCXJldHVybiB2YWx1ZTsKKyAgICBpZiAodG8tPmluZGV4ID49IExJTktDRUxMUykgeworICAgICAgICBsaW5rID0gdGVlZGF0YW9iamVjdF9qdW1wbGluayh0by0+ZGF0YW9iaik7CisgICAgICAgIFB5X0RFQ1JFRih0by0+ZGF0YW9iaik7CisgICAgICAgIHRvLT5kYXRhb2JqID0gKHRlZWRhdGFvYmplY3QgKilsaW5rOworICAgICAgICB0by0+aW5kZXggPSAwOworICAgIH0KKyAgICB2YWx1ZSA9IHRlZWRhdGFvYmplY3RfZ2V0aXRlbSh0by0+ZGF0YW9iaiwgdG8tPmluZGV4KTsKKyAgICBpZiAodmFsdWUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgdG8tPmluZGV4Kys7CisgICAgcmV0dXJuIHZhbHVlOwogfQogCiBzdGF0aWMgaW50CiB0ZWVfdHJhdmVyc2UodGVlb2JqZWN0ICp0bywgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JUHlfVklTSVQoKFB5T2JqZWN0ICopdG8tPmRhdGFvYmopOwotCXJldHVybiAwOworICAgIFB5X1ZJU0lUKChQeU9iamVjdCAqKXRvLT5kYXRhb2JqKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHRlZV9jb3B5KHRlZW9iamVjdCAqdG8pCiB7Ci0JdGVlb2JqZWN0ICpuZXd0bzsKKyAgICB0ZWVvYmplY3QgKm5ld3RvOwogCi0JbmV3dG8gPSBQeU9iamVjdF9HQ19OZXcodGVlb2JqZWN0LCAmdGVlX3R5cGUpOwotCWlmIChuZXd0byA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlQeV9JTkNSRUYodG8tPmRhdGFvYmopOwotCW5ld3RvLT5kYXRhb2JqID0gdG8tPmRhdGFvYmo7Ci0JbmV3dG8tPmluZGV4ID0gdG8tPmluZGV4OwotCW5ld3RvLT53ZWFrcmVmbGlzdCA9IE5VTEw7Ci0JUHlPYmplY3RfR0NfVHJhY2sobmV3dG8pOwotCXJldHVybiAoUHlPYmplY3QgKiluZXd0bzsKKyAgICBuZXd0byA9IFB5T2JqZWN0X0dDX05ldyh0ZWVvYmplY3QsICZ0ZWVfdHlwZSk7CisgICAgaWYgKG5ld3RvID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5X0lOQ1JFRih0by0+ZGF0YW9iaik7CisgICAgbmV3dG8tPmRhdGFvYmogPSB0by0+ZGF0YW9iajsKKyAgICBuZXd0by0+aW5kZXggPSB0by0+aW5kZXg7CisgICAgbmV3dG8tPndlYWtyZWZsaXN0ID0gTlVMTDsKKyAgICBQeU9iamVjdF9HQ19UcmFjayhuZXd0byk7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKW5ld3RvOwogfQogCiBQeURvY19TVFJWQVIodGVlY29weV9kb2MsICJSZXR1cm5zIGFuIGluZGVwZW5kZW50IGl0ZXJhdG9yLiIpOwpAQCAtNTE0LDE1NCArNTE0LDE1NCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHRlZV9mcm9taXRlcmFibGUoUHlPYmplY3QgKml0ZXJhYmxlKQogewotCXRlZW9iamVjdCAqdG87Ci0JUHlPYmplY3QgKml0ID0gTlVMTDsKKyAgICB0ZWVvYmplY3QgKnRvOworICAgIFB5T2JqZWN0ICppdCA9IE5VTEw7CiAKLQlpdCA9IFB5T2JqZWN0X0dldEl0ZXIoaXRlcmFibGUpOwotCWlmIChpdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoUHlPYmplY3RfVHlwZUNoZWNrKGl0LCAmdGVlX3R5cGUpKSB7Ci0JCXRvID0gKHRlZW9iamVjdCAqKXRlZV9jb3B5KCh0ZWVvYmplY3QgKilpdCk7Ci0JCWdvdG8gZG9uZTsKLQl9CisgICAgaXQgPSBQeU9iamVjdF9HZXRJdGVyKGl0ZXJhYmxlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKFB5T2JqZWN0X1R5cGVDaGVjayhpdCwgJnRlZV90eXBlKSkgeworICAgICAgICB0byA9ICh0ZWVvYmplY3QgKil0ZWVfY29weSgodGVlb2JqZWN0ICopaXQpOworICAgICAgICBnb3RvIGRvbmU7CisgICAgfQogCi0JdG8gPSBQeU9iamVjdF9HQ19OZXcodGVlb2JqZWN0LCAmdGVlX3R5cGUpOwotCWlmICh0byA9PSBOVUxMKSAKLQkJZ290byBkb25lOwotCXRvLT5kYXRhb2JqID0gKHRlZWRhdGFvYmplY3QgKil0ZWVkYXRhb2JqZWN0X25ldyhpdCk7Ci0JaWYgKCF0by0+ZGF0YW9iaikgewotCQlQeU9iamVjdF9HQ19EZWwodG8pOwotCQl0byA9IE5VTEw7Ci0JCWdvdG8gZG9uZTsKLQl9CisgICAgdG8gPSBQeU9iamVjdF9HQ19OZXcodGVlb2JqZWN0LCAmdGVlX3R5cGUpOworICAgIGlmICh0byA9PSBOVUxMKQorICAgICAgICBnb3RvIGRvbmU7CisgICAgdG8tPmRhdGFvYmogPSAodGVlZGF0YW9iamVjdCAqKXRlZWRhdGFvYmplY3RfbmV3KGl0KTsKKyAgICBpZiAoIXRvLT5kYXRhb2JqKSB7CisgICAgICAgIFB5T2JqZWN0X0dDX0RlbCh0byk7CisgICAgICAgIHRvID0gTlVMTDsKKyAgICAgICAgZ290byBkb25lOworICAgIH0KIAotCXRvLT5pbmRleCA9IDA7Ci0JdG8tPndlYWtyZWZsaXN0ID0gTlVMTDsKLQlQeU9iamVjdF9HQ19UcmFjayh0byk7CisgICAgdG8tPmluZGV4ID0gMDsKKyAgICB0by0+d2Vha3JlZmxpc3QgPSBOVUxMOworICAgIFB5T2JqZWN0X0dDX1RyYWNrKHRvKTsKIGRvbmU6Ci0JUHlfWERFQ1JFRihpdCk7Ci0JcmV0dXJuIChQeU9iamVjdCAqKXRvOworICAgIFB5X1hERUNSRUYoaXQpOworICAgIHJldHVybiAoUHlPYmplY3QgKil0bzsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHRlZV9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3KQogewotCVB5T2JqZWN0ICppdGVyYWJsZTsKKyAgICBQeU9iamVjdCAqaXRlcmFibGU7CiAKLQlpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJ0ZWUiLCAxLCAxLCAmaXRlcmFibGUpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gdGVlX2Zyb21pdGVyYWJsZShpdGVyYWJsZSk7CisgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAidGVlIiwgMSwgMSwgJml0ZXJhYmxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIHRlZV9mcm9taXRlcmFibGUoaXRlcmFibGUpOwogfQogCiBzdGF0aWMgaW50CiB0ZWVfY2xlYXIodGVlb2JqZWN0ICp0bykKIHsKLQlpZiAodG8tPndlYWtyZWZsaXN0ICE9IE5VTEwpCi0JCVB5T2JqZWN0X0NsZWFyV2Vha1JlZnMoKFB5T2JqZWN0ICopIHRvKTsKLQlQeV9DTEVBUih0by0+ZGF0YW9iaik7Ci0JcmV0dXJuIDA7CisgICAgaWYgKHRvLT53ZWFrcmVmbGlzdCAhPSBOVUxMKQorICAgICAgICBQeU9iamVjdF9DbGVhcldlYWtSZWZzKChQeU9iamVjdCAqKSB0byk7CisgICAgUHlfQ0xFQVIodG8tPmRhdGFvYmopOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZAogdGVlX2RlYWxsb2ModGVlb2JqZWN0ICp0bykKIHsKLQlQeU9iamVjdF9HQ19VblRyYWNrKHRvKTsKLQl0ZWVfY2xlYXIodG8pOwotCVB5T2JqZWN0X0dDX0RlbCh0byk7CisgICAgUHlPYmplY3RfR0NfVW5UcmFjayh0byk7CisgICAgdGVlX2NsZWFyKHRvKTsKKyAgICBQeU9iamVjdF9HQ19EZWwodG8pOwogfQogCiBQeURvY19TVFJWQVIodGVlb2JqZWN0X2RvYywKICJJdGVyYXRvciB3cmFwcGVkIHRvIG1ha2UgaXQgY29weWFibGUiKTsKIAogc3RhdGljIFB5TWV0aG9kRGVmIHRlZV9tZXRob2RzW10gPSB7Ci0JeyJfX2NvcHlfXyIsCShQeUNGdW5jdGlvbil0ZWVfY29weSwJTUVUSF9OT0FSR1MsIHRlZWNvcHlfZG9jfSwKLSAJe05VTEwsCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7Il9fY29weV9fIiwgICAgICAgIChQeUNGdW5jdGlvbil0ZWVfY29weSwgIE1FVEhfTk9BUkdTLCB0ZWVjb3B5X2RvY30sCisgICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgdGVlX3R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JIml0ZXJ0b29scy50ZWUiLAkJLyogdHBfbmFtZSAqLwotCXNpemVvZih0ZWVvYmplY3QpLAkJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpdGVlX2RlYWxsb2MsCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJLyogdHBfY29tcGFyZSAqLwotCTAsCQkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJLyogdHBfY2FsbCAqLwotCTAsCQkJCS8qIHRwX3N0ciAqLwotCTAsCQkJCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsCS8qIHRwX2ZsYWdzICovCi0JdGVlb2JqZWN0X2RvYywJCQkvKiB0cF9kb2MgKi8KLQkodHJhdmVyc2Vwcm9jKXRlZV90cmF2ZXJzZSwJLyogdHBfdHJhdmVyc2UgKi8KLQkoaW5xdWlyeSl0ZWVfY2xlYXIsCQkvKiB0cF9jbGVhciAqLwotCTAsCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0Jb2Zmc2V0b2YodGVlb2JqZWN0LCB3ZWFrcmVmbGlzdCksCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JUHlPYmplY3RfU2VsZkl0ZXIsCQkvKiB0cF9pdGVyICovCi0JKGl0ZXJuZXh0ZnVuYyl0ZWVfbmV4dCwJCS8qIHRwX2l0ZXJuZXh0ICovCi0JdGVlX21ldGhvZHMsCQkJLyogdHBfbWV0aG9kcyAqLwotCTAsCQkJCS8qIHRwX21lbWJlcnMgKi8KLQkwLAkJCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQkwLAkJCQkvKiB0cF9pbml0ICovCi0JMCwJCQkJLyogdHBfYWxsb2MgKi8KLQl0ZWVfbmV3LAkJCS8qIHRwX25ldyAqLwotCVB5T2JqZWN0X0dDX0RlbCwJCS8qIHRwX2ZyZWUgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAiaXRlcnRvb2xzLnRlZSIsICAgICAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCisgICAgc2l6ZW9mKHRlZW9iamVjdCksICAgICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpdGVlX2RlYWxsb2MsICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQywgICAgICAgICAgICAvKiB0cF9mbGFncyAqLworICAgIHRlZW9iamVjdF9kb2MsICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2MpdGVlX3RyYXZlcnNlLCAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgKGlucXVpcnkpdGVlX2NsZWFyLCAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIG9mZnNldG9mKHRlZW9iamVjdCwgd2Vha3JlZmxpc3QpLCAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICBQeU9iamVjdF9TZWxmSXRlciwgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgKGl0ZXJuZXh0ZnVuYyl0ZWVfbmV4dCwgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICB0ZWVfbWV0aG9kcywgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIHRlZV9uZXcsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworICAgIFB5T2JqZWN0X0dDX0RlbCwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB0ZWUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5X3NzaXplX3QgaSwgbj0yOwotCVB5T2JqZWN0ICppdCwgKml0ZXJhYmxlLCAqY29weWFibGUsICpyZXN1bHQ7CisgICAgUHlfc3NpemVfdCBpLCBuPTI7CisgICAgUHlPYmplY3QgKml0LCAqaXRlcmFibGUsICpjb3B5YWJsZSwgKnJlc3VsdDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3xuIiwgJml0ZXJhYmxlLCAmbikpCi0JCXJldHVybiBOVUxMOwotCWlmIChuIDwgMCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIm4gbXVzdCBiZSA+PSAwIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXN1bHQgPSBQeVR1cGxlX05ldyhuKTsKLQlpZiAocmVzdWx0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWlmIChuID09IDApCi0JCXJldHVybiByZXN1bHQ7Ci0JaXQgPSBQeU9iamVjdF9HZXRJdGVyKGl0ZXJhYmxlKTsKLQlpZiAoaXQgPT0gTlVMTCkgewotCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmICghUHlPYmplY3RfSGFzQXR0clN0cmluZyhpdCwgIl9fY29weV9fIikpIHsKLQkJY29weWFibGUgPSB0ZWVfZnJvbWl0ZXJhYmxlKGl0KTsKLQkJUHlfREVDUkVGKGl0KTsKLQkJaWYgKGNvcHlhYmxlID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRihyZXN1bHQpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9IGVsc2UKLQkJY29weWFibGUgPSBpdDsKLQlQeVR1cGxlX1NFVF9JVEVNKHJlc3VsdCwgMCwgY29weWFibGUpOwotCWZvciAoaT0xIDsgaTxuIDsgaSsrKSB7Ci0JCWNvcHlhYmxlID0gUHlPYmplY3RfQ2FsbE1ldGhvZChjb3B5YWJsZSwgIl9fY29weV9fIiwgTlVMTCk7Ci0JCWlmIChjb3B5YWJsZSA9PSBOVUxMKSB7Ci0JCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCVB5VHVwbGVfU0VUX0lURU0ocmVzdWx0LCBpLCBjb3B5YWJsZSk7Ci0JfQotCXJldHVybiByZXN1bHQ7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfG4iLCAmaXRlcmFibGUsICZuKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKG4gPCAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAibiBtdXN0IGJlID49IDAiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJlc3VsdCA9IFB5VHVwbGVfTmV3KG4pOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKG4gPT0gMCkKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICBpdCA9IFB5T2JqZWN0X0dldEl0ZXIoaXRlcmFibGUpOworICAgIGlmIChpdCA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKCFQeU9iamVjdF9IYXNBdHRyU3RyaW5nKGl0LCAiX19jb3B5X18iKSkgeworICAgICAgICBjb3B5YWJsZSA9IHRlZV9mcm9taXRlcmFibGUoaXQpOworICAgICAgICBQeV9ERUNSRUYoaXQpOworICAgICAgICBpZiAoY29weWFibGUgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0gZWxzZQorICAgICAgICBjb3B5YWJsZSA9IGl0OworICAgIFB5VHVwbGVfU0VUX0lURU0ocmVzdWx0LCAwLCBjb3B5YWJsZSk7CisgICAgZm9yIChpPTEgOyBpPG4gOyBpKyspIHsKKyAgICAgICAgY29weWFibGUgPSBQeU9iamVjdF9DYWxsTWV0aG9kKGNvcHlhYmxlLCAiX19jb3B5X18iLCBOVUxMKTsKKyAgICAgICAgaWYgKGNvcHlhYmxlID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIGksIGNvcHlhYmxlKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogUHlEb2NfU1RSVkFSKHRlZV9kb2MsCkBAIC02NzEsMTAgKzY3MSwxMCBAQAogLyogY3ljbGUgb2JqZWN0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JUHlPYmplY3QgKml0OwotCVB5T2JqZWN0ICpzYXZlZDsKLQlpbnQgZmlyc3RwYXNzOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBQeU9iamVjdCAqaXQ7CisgICAgUHlPYmplY3QgKnNhdmVkOworICAgIGludCBmaXJzdHBhc3M7CiB9IGN5Y2xlb2JqZWN0OwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IGN5Y2xlX3R5cGU7CkBAIC02ODIsODkgKzY4Miw4OSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGN5Y2xlX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlQeU9iamVjdCAqaXQ7Ci0JUHlPYmplY3QgKml0ZXJhYmxlOwotCVB5T2JqZWN0ICpzYXZlZDsKLQljeWNsZW9iamVjdCAqbHo7CisgICAgUHlPYmplY3QgKml0OworICAgIFB5T2JqZWN0ICppdGVyYWJsZTsKKyAgICBQeU9iamVjdCAqc2F2ZWQ7CisgICAgY3ljbGVvYmplY3QgKmx6OwogCi0JaWYgKHR5cGUgPT0gJmN5Y2xlX3R5cGUgJiYgIV9QeUFyZ19Ob0tleXdvcmRzKCJjeWNsZSgpIiwga3dkcykpCi0JCXJldHVybiBOVUxMOworICAgIGlmICh0eXBlID09ICZjeWNsZV90eXBlICYmICFfUHlBcmdfTm9LZXl3b3JkcygiY3ljbGUoKSIsIGt3ZHMpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImN5Y2xlIiwgMSwgMSwgJml0ZXJhYmxlKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiY3ljbGUiLCAxLCAxLCAmaXRlcmFibGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCS8qIEdldCBpdGVyYXRvci4gKi8KLQlpdCA9IFB5T2JqZWN0X0dldEl0ZXIoaXRlcmFibGUpOwotCWlmIChpdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICAvKiBHZXQgaXRlcmF0b3IuICovCisgICAgaXQgPSBQeU9iamVjdF9HZXRJdGVyKGl0ZXJhYmxlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlzYXZlZCA9IFB5TGlzdF9OZXcoMCk7Ci0JaWYgKHNhdmVkID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKGl0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIHNhdmVkID0gUHlMaXN0X05ldygwKTsKKyAgICBpZiAoc2F2ZWQgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYoaXQpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQkvKiBjcmVhdGUgY3ljbGVvYmplY3Qgc3RydWN0dXJlICovCi0JbHogPSAoY3ljbGVvYmplY3QgKil0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKLQlpZiAobHogPT0gTlVMTCkgewotCQlQeV9ERUNSRUYoaXQpOwotCQlQeV9ERUNSRUYoc2F2ZWQpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JbHotPml0ID0gaXQ7Ci0JbHotPnNhdmVkID0gc2F2ZWQ7Ci0JbHotPmZpcnN0cGFzcyA9IDA7CisgICAgLyogY3JlYXRlIGN5Y2xlb2JqZWN0IHN0cnVjdHVyZSAqLworICAgIGx6ID0gKGN5Y2xlb2JqZWN0ICopdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7CisgICAgaWYgKGx6ID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKGl0KTsKKyAgICAgICAgUHlfREVDUkVGKHNhdmVkKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGx6LT5pdCA9IGl0OworICAgIGx6LT5zYXZlZCA9IHNhdmVkOworICAgIGx6LT5maXJzdHBhc3MgPSAwOwogCi0JcmV0dXJuIChQeU9iamVjdCAqKWx6OworICAgIHJldHVybiAoUHlPYmplY3QgKilsejsKIH0KIAogc3RhdGljIHZvaWQKIGN5Y2xlX2RlYWxsb2MoY3ljbGVvYmplY3QgKmx6KQogewotCVB5T2JqZWN0X0dDX1VuVHJhY2sobHopOwotCVB5X1hERUNSRUYobHotPnNhdmVkKTsKLQlQeV9YREVDUkVGKGx6LT5pdCk7Ci0JUHlfVFlQRShseiktPnRwX2ZyZWUobHopOworICAgIFB5T2JqZWN0X0dDX1VuVHJhY2sobHopOworICAgIFB5X1hERUNSRUYobHotPnNhdmVkKTsKKyAgICBQeV9YREVDUkVGKGx6LT5pdCk7CisgICAgUHlfVFlQRShseiktPnRwX2ZyZWUobHopOwogfQogCiBzdGF0aWMgaW50CiBjeWNsZV90cmF2ZXJzZShjeWNsZW9iamVjdCAqbHosIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotCVB5X1ZJU0lUKGx6LT5pdCk7Ci0JUHlfVklTSVQobHotPnNhdmVkKTsKLQlyZXR1cm4gMDsKKyAgICBQeV9WSVNJVChsei0+aXQpOworICAgIFB5X1ZJU0lUKGx6LT5zYXZlZCk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjeWNsZV9uZXh0KGN5Y2xlb2JqZWN0ICpseikKIHsKLQlQeU9iamVjdCAqaXRlbTsKLQlQeU9iamVjdCAqaXQ7Ci0JUHlPYmplY3QgKnRtcDsKKyAgICBQeU9iamVjdCAqaXRlbTsKKyAgICBQeU9iamVjdCAqaXQ7CisgICAgUHlPYmplY3QgKnRtcDsKIAotCXdoaWxlICgxKSB7Ci0JCWl0ZW0gPSBQeUl0ZXJfTmV4dChsei0+aXQpOwotCQlpZiAoaXRlbSAhPSBOVUxMKSB7Ci0JCQlpZiAoIWx6LT5maXJzdHBhc3MpCi0JCQkJUHlMaXN0X0FwcGVuZChsei0+c2F2ZWQsIGl0ZW0pOwotCQkJcmV0dXJuIGl0ZW07Ci0JCX0KLQkJaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKLQkJCWlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1N0b3BJdGVyYXRpb24pKQotCQkJCVB5RXJyX0NsZWFyKCk7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJaWYgKFB5TGlzdF9TaXplKGx6LT5zYXZlZCkgPT0gMCkgCi0JCQlyZXR1cm4gTlVMTDsKLQkJaXQgPSBQeU9iamVjdF9HZXRJdGVyKGx6LT5zYXZlZCk7Ci0JCWlmIChpdCA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCXRtcCA9IGx6LT5pdDsKLQkJbHotPml0ID0gaXQ7Ci0JCWx6LT5maXJzdHBhc3MgPSAxOwotCQlQeV9ERUNSRUYodG1wKTsKLQl9CisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgaXRlbSA9IFB5SXRlcl9OZXh0KGx6LT5pdCk7CisgICAgICAgIGlmIChpdGVtICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGlmICghbHotPmZpcnN0cGFzcykKKyAgICAgICAgICAgICAgICBQeUxpc3RfQXBwZW5kKGx6LT5zYXZlZCwgaXRlbSk7CisgICAgICAgICAgICByZXR1cm4gaXRlbTsKKyAgICAgICAgfQorICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICAgICAgaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfU3RvcEl0ZXJhdGlvbikpCisgICAgICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoUHlMaXN0X1NpemUobHotPnNhdmVkKSA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGl0ID0gUHlPYmplY3RfR2V0SXRlcihsei0+c2F2ZWQpOworICAgICAgICBpZiAoaXQgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB0bXAgPSBsei0+aXQ7CisgICAgICAgIGx6LT5pdCA9IGl0OworICAgICAgICBsei0+Zmlyc3RwYXNzID0gMTsKKyAgICAgICAgUHlfREVDUkVGKHRtcCk7CisgICAgfQogfQogCiBQeURvY19TVFJWQVIoY3ljbGVfZG9jLApAQCAtNzc0LDU3ICs3NzQsNTcgQEAKIFRoZW4gcmVwZWF0IHRoZSBzZXF1ZW5jZSBpbmRlZmluaXRlbHkuIik7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgY3ljbGVfdHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKLQkiaXRlcnRvb2xzLmN5Y2xlIiwJCS8qIHRwX25hbWUgKi8KLQlzaXplb2YoY3ljbGVvYmplY3QpLAkJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpY3ljbGVfZGVhbGxvYywJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkvKiB0cF9jb21wYXJlICovCi0JMCwJCQkJLyogdHBfcmVwciAqLwotCTAsCQkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCS8qIHRwX2hhc2ggKi8KLQkwLAkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MgfAotCQlQeV9UUEZMQUdTX0JBU0VUWVBFLAkvKiB0cF9mbGFncyAqLwotCWN5Y2xlX2RvYywJCQkvKiB0cF9kb2MgKi8KLQkodHJhdmVyc2Vwcm9jKWN5Y2xlX3RyYXZlcnNlLAkvKiB0cF90cmF2ZXJzZSAqLwotCTAsCQkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCVB5T2JqZWN0X1NlbGZJdGVyLAkJLyogdHBfaXRlciAqLwotCShpdGVybmV4dGZ1bmMpY3ljbGVfbmV4dCwJLyogdHBfaXRlcm5leHQgKi8KLQkwLAkJCQkvKiB0cF9tZXRob2RzICovCi0JMCwJCQkJLyogdHBfbWVtYmVycyAqLwotCTAsCQkJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkvKiB0cF9kaWN0ICovCi0JMCwJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJCQkJLyogdHBfZGljdG9mZnNldCAqLwotCTAsCQkJCS8qIHRwX2luaXQgKi8KLQkwLAkJCQkvKiB0cF9hbGxvYyAqLwotCWN5Y2xlX25ldywJCQkvKiB0cF9uZXcgKi8KLQlQeU9iamVjdF9HQ19EZWwsCQkvKiB0cF9mcmVlICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisgICAgIml0ZXJ0b29scy5jeWNsZSIsICAgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgIHNpemVvZihjeWNsZW9iamVjdCksICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKWN5Y2xlX2RlYWxsb2MsICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MgfAorICAgICAgICBQeV9UUEZMQUdTX0JBU0VUWVBFLCAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCisgICAgY3ljbGVfZG9jLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgKHRyYXZlcnNlcHJvYyljeWNsZV90cmF2ZXJzZSwgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICBQeU9iamVjdF9TZWxmSXRlciwgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgKGl0ZXJuZXh0ZnVuYyljeWNsZV9uZXh0LCAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIGN5Y2xlX25ldywgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworICAgIFB5T2JqZWN0X0dDX0RlbCwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KIH07CiAKIAogLyogZHJvcHdoaWxlIG9iamVjdCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCVB5T2JqZWN0ICpmdW5jOwotCVB5T2JqZWN0ICppdDsKLQlsb25nCSBzdGFydDsKKyAgICBQeU9iamVjdF9IRUFECisgICAgUHlPYmplY3QgKmZ1bmM7CisgICAgUHlPYmplY3QgKml0OworICAgIGxvbmcgICAgICAgICBzdGFydDsKIH0gZHJvcHdoaWxlb2JqZWN0OwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IGRyb3B3aGlsZV90eXBlOwpAQCAtODMyLDgyICs4MzIsODIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBkcm9wd2hpbGVfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCVB5T2JqZWN0ICpmdW5jLCAqc2VxOwotCVB5T2JqZWN0ICppdDsKLQlkcm9wd2hpbGVvYmplY3QgKmx6OworICAgIFB5T2JqZWN0ICpmdW5jLCAqc2VxOworICAgIFB5T2JqZWN0ICppdDsKKyAgICBkcm9wd2hpbGVvYmplY3QgKmx6OwogCi0JaWYgKHR5cGUgPT0gJmRyb3B3aGlsZV90eXBlICYmICFfUHlBcmdfTm9LZXl3b3JkcygiZHJvcHdoaWxlKCkiLCBrd2RzKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKHR5cGUgPT0gJmRyb3B3aGlsZV90eXBlICYmICFfUHlBcmdfTm9LZXl3b3JkcygiZHJvcHdoaWxlKCkiLCBrd2RzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJkcm9wd2hpbGUiLCAyLCAyLCAmZnVuYywgJnNlcSkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImRyb3B3aGlsZSIsIDIsIDIsICZmdW5jLCAmc2VxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkvKiBHZXQgaXRlcmF0b3IuICovCi0JaXQgPSBQeU9iamVjdF9HZXRJdGVyKHNlcSk7Ci0JaWYgKGl0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIC8qIEdldCBpdGVyYXRvci4gKi8KKyAgICBpdCA9IFB5T2JqZWN0X0dldEl0ZXIoc2VxKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkvKiBjcmVhdGUgZHJvcHdoaWxlb2JqZWN0IHN0cnVjdHVyZSAqLwotCWx6ID0gKGRyb3B3aGlsZW9iamVjdCAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOwotCWlmIChseiA9PSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRihpdCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlQeV9JTkNSRUYoZnVuYyk7Ci0JbHotPmZ1bmMgPSBmdW5jOwotCWx6LT5pdCA9IGl0OwotCWx6LT5zdGFydCA9IDA7CisgICAgLyogY3JlYXRlIGRyb3B3aGlsZW9iamVjdCBzdHJ1Y3R1cmUgKi8KKyAgICBseiA9IChkcm9wd2hpbGVvYmplY3QgKil0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKKyAgICBpZiAobHogPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYoaXQpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlfSU5DUkVGKGZ1bmMpOworICAgIGx6LT5mdW5jID0gZnVuYzsKKyAgICBsei0+aXQgPSBpdDsKKyAgICBsei0+c3RhcnQgPSAwOwogCi0JcmV0dXJuIChQeU9iamVjdCAqKWx6OworICAgIHJldHVybiAoUHlPYmplY3QgKilsejsKIH0KIAogc3RhdGljIHZvaWQKIGRyb3B3aGlsZV9kZWFsbG9jKGRyb3B3aGlsZW9iamVjdCAqbHopCiB7Ci0JUHlPYmplY3RfR0NfVW5UcmFjayhseik7Ci0JUHlfWERFQ1JFRihsei0+ZnVuYyk7Ci0JUHlfWERFQ1JFRihsei0+aXQpOwotCVB5X1RZUEUobHopLT50cF9mcmVlKGx6KTsKKyAgICBQeU9iamVjdF9HQ19VblRyYWNrKGx6KTsKKyAgICBQeV9YREVDUkVGKGx6LT5mdW5jKTsKKyAgICBQeV9YREVDUkVGKGx6LT5pdCk7CisgICAgUHlfVFlQRShseiktPnRwX2ZyZWUobHopOwogfQogCiBzdGF0aWMgaW50CiBkcm9wd2hpbGVfdHJhdmVyc2UoZHJvcHdoaWxlb2JqZWN0ICpseiwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JUHlfVklTSVQobHotPml0KTsKLQlQeV9WSVNJVChsei0+ZnVuYyk7Ci0JcmV0dXJuIDA7CisgICAgUHlfVklTSVQobHotPml0KTsKKyAgICBQeV9WSVNJVChsei0+ZnVuYyk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkcm9wd2hpbGVfbmV4dChkcm9wd2hpbGVvYmplY3QgKmx6KQogewotCVB5T2JqZWN0ICppdGVtLCAqZ29vZDsKLQlQeU9iamVjdCAqaXQgPSBsei0+aXQ7Ci0JbG9uZyBvazsKLQlQeU9iamVjdCAqKCppdGVybmV4dCkoUHlPYmplY3QgKik7CisgICAgUHlPYmplY3QgKml0ZW0sICpnb29kOworICAgIFB5T2JqZWN0ICppdCA9IGx6LT5pdDsKKyAgICBsb25nIG9rOworICAgIFB5T2JqZWN0ICooKml0ZXJuZXh0KShQeU9iamVjdCAqKTsKIAotCWFzc2VydChQeUl0ZXJfQ2hlY2soaXQpKTsKLQlpdGVybmV4dCA9ICpQeV9UWVBFKGl0KS0+dHBfaXRlcm5leHQ7Ci0JZm9yICg7OykgewotCQlpdGVtID0gaXRlcm5leHQoaXQpOwotCQlpZiAoaXRlbSA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWlmIChsei0+c3RhcnQgPT0gMSkKLQkJCXJldHVybiBpdGVtOworICAgIGFzc2VydChQeUl0ZXJfQ2hlY2soaXQpKTsKKyAgICBpdGVybmV4dCA9ICpQeV9UWVBFKGl0KS0+dHBfaXRlcm5leHQ7CisgICAgZm9yICg7OykgeworICAgICAgICBpdGVtID0gaXRlcm5leHQoaXQpOworICAgICAgICBpZiAoaXRlbSA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGlmIChsei0+c3RhcnQgPT0gMSkKKyAgICAgICAgICAgIHJldHVybiBpdGVtOwogCi0JCWdvb2QgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGx6LT5mdW5jLCBpdGVtLCBOVUxMKTsKLQkJaWYgKGdvb2QgPT0gTlVMTCkgewotCQkJUHlfREVDUkVGKGl0ZW0pOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJb2sgPSBQeU9iamVjdF9Jc1RydWUoZ29vZCk7Ci0JCVB5X0RFQ1JFRihnb29kKTsKLQkJaWYgKCFvaykgewotCQkJbHotPnN0YXJ0ID0gMTsKLQkJCXJldHVybiBpdGVtOwotCQl9Ci0JCVB5X0RFQ1JFRihpdGVtKTsKLQl9CisgICAgICAgIGdvb2QgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGx6LT5mdW5jLCBpdGVtLCBOVUxMKTsKKyAgICAgICAgaWYgKGdvb2QgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgb2sgPSBQeU9iamVjdF9Jc1RydWUoZ29vZCk7CisgICAgICAgIFB5X0RFQ1JFRihnb29kKTsKKyAgICAgICAgaWYgKCFvaykgeworICAgICAgICAgICAgbHotPnN0YXJ0ID0gMTsKKyAgICAgICAgICAgIHJldHVybiBpdGVtOworICAgICAgICB9CisgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICB9CiB9CiAKIFB5RG9jX1NUUlZBUihkcm9wd2hpbGVfZG9jLApAQCAtOTE3LDU3ICs5MTcsNTcgQEAKIEFmdGVyd2FyZHMsIHJldHVybiBldmVyeSBlbGVtZW50IHVudGlsIHRoZSBpdGVyYWJsZSBpcyBleGhhdXN0ZWQuIik7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgZHJvcHdoaWxlX3R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JIml0ZXJ0b29scy5kcm9wd2hpbGUiLAkJLyogdHBfbmFtZSAqLwotCXNpemVvZihkcm9wd2hpbGVvYmplY3QpLAkvKiB0cF9iYXNpY3NpemUgKi8KLQkwLAkJCQkvKiB0cF9pdGVtc2l6ZSAqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3Rvcilkcm9wd2hpbGVfZGVhbGxvYywJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkvKiB0cF9jb21wYXJlICovCi0JMCwJCQkJLyogdHBfcmVwciAqLwotCTAsCQkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCS8qIHRwX2hhc2ggKi8KLQkwLAkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MgfAotCQlQeV9UUEZMQUdTX0JBU0VUWVBFLAkvKiB0cF9mbGFncyAqLwotCWRyb3B3aGlsZV9kb2MsCQkJLyogdHBfZG9jICovCi0JKHRyYXZlcnNlcHJvYylkcm9wd2hpbGVfdHJhdmVyc2UsICAgIC8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JUHlPYmplY3RfU2VsZkl0ZXIsCQkvKiB0cF9pdGVyICovCi0JKGl0ZXJuZXh0ZnVuYylkcm9wd2hpbGVfbmV4dCwJLyogdHBfaXRlcm5leHQgKi8KLQkwLAkJCQkvKiB0cF9tZXRob2RzICovCi0JMCwJCQkJLyogdHBfbWVtYmVycyAqLwotCTAsCQkJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkvKiB0cF9kaWN0ICovCi0JMCwJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJCQkJLyogdHBfZGljdG9mZnNldCAqLwotCTAsCQkJCS8qIHRwX2luaXQgKi8KLQkwLAkJCQkvKiB0cF9hbGxvYyAqLwotCWRyb3B3aGlsZV9uZXcsCQkJLyogdHBfbmV3ICovCi0JUHlPYmplY3RfR0NfRGVsLAkJLyogdHBfZnJlZSAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQorICAgICJpdGVydG9vbHMuZHJvcHdoaWxlIiwgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICBzaXplb2YoZHJvcHdoaWxlb2JqZWN0KSwgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3Rvcilkcm9wd2hpbGVfZGVhbGxvYywgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDIHwKKyAgICAgICAgUHlfVFBGTEFHU19CQVNFVFlQRSwgICAgICAgICAgICAvKiB0cF9mbGFncyAqLworICAgIGRyb3B3aGlsZV9kb2MsICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2MpZHJvcHdoaWxlX3RyYXZlcnNlLCAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIFB5T2JqZWN0X1NlbGZJdGVyLCAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAoaXRlcm5leHRmdW5jKWRyb3B3aGlsZV9uZXh0LCAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgZHJvcHdoaWxlX25ldywgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgUHlPYmplY3RfR0NfRGVsLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKIAogCiAvKiB0YWtld2hpbGUgb2JqZWN0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JUHlPYmplY3QgKmZ1bmM7Ci0JUHlPYmplY3QgKml0OwotCWxvbmcJIHN0b3A7CisgICAgUHlPYmplY3RfSEVBRAorICAgIFB5T2JqZWN0ICpmdW5jOworICAgIFB5T2JqZWN0ICppdDsKKyAgICBsb25nICAgICAgICAgc3RvcDsKIH0gdGFrZXdoaWxlb2JqZWN0OwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IHRha2V3aGlsZV90eXBlOwpAQCAtOTc1LDc5ICs5NzUsNzkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiB0YWtld2hpbGVfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCVB5T2JqZWN0ICpmdW5jLCAqc2VxOwotCVB5T2JqZWN0ICppdDsKLQl0YWtld2hpbGVvYmplY3QgKmx6OworICAgIFB5T2JqZWN0ICpmdW5jLCAqc2VxOworICAgIFB5T2JqZWN0ICppdDsKKyAgICB0YWtld2hpbGVvYmplY3QgKmx6OwogCi0JaWYgKHR5cGUgPT0gJnRha2V3aGlsZV90eXBlICYmICFfUHlBcmdfTm9LZXl3b3JkcygidGFrZXdoaWxlKCkiLCBrd2RzKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKHR5cGUgPT0gJnRha2V3aGlsZV90eXBlICYmICFfUHlBcmdfTm9LZXl3b3JkcygidGFrZXdoaWxlKCkiLCBrd2RzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJ0YWtld2hpbGUiLCAyLCAyLCAmZnVuYywgJnNlcSkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInRha2V3aGlsZSIsIDIsIDIsICZmdW5jLCAmc2VxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkvKiBHZXQgaXRlcmF0b3IuICovCi0JaXQgPSBQeU9iamVjdF9HZXRJdGVyKHNlcSk7Ci0JaWYgKGl0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIC8qIEdldCBpdGVyYXRvci4gKi8KKyAgICBpdCA9IFB5T2JqZWN0X0dldEl0ZXIoc2VxKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkvKiBjcmVhdGUgdGFrZXdoaWxlb2JqZWN0IHN0cnVjdHVyZSAqLwotCWx6ID0gKHRha2V3aGlsZW9iamVjdCAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOwotCWlmIChseiA9PSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRihpdCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlQeV9JTkNSRUYoZnVuYyk7Ci0JbHotPmZ1bmMgPSBmdW5jOwotCWx6LT5pdCA9IGl0OwotCWx6LT5zdG9wID0gMDsKKyAgICAvKiBjcmVhdGUgdGFrZXdoaWxlb2JqZWN0IHN0cnVjdHVyZSAqLworICAgIGx6ID0gKHRha2V3aGlsZW9iamVjdCAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOworICAgIGlmIChseiA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihpdCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeV9JTkNSRUYoZnVuYyk7CisgICAgbHotPmZ1bmMgPSBmdW5jOworICAgIGx6LT5pdCA9IGl0OworICAgIGx6LT5zdG9wID0gMDsKIAotCXJldHVybiAoUHlPYmplY3QgKilsejsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopbHo7CiB9CiAKIHN0YXRpYyB2b2lkCiB0YWtld2hpbGVfZGVhbGxvYyh0YWtld2hpbGVvYmplY3QgKmx6KQogewotCVB5T2JqZWN0X0dDX1VuVHJhY2sobHopOwotCVB5X1hERUNSRUYobHotPmZ1bmMpOwotCVB5X1hERUNSRUYobHotPml0KTsKLQlQeV9UWVBFKGx6KS0+dHBfZnJlZShseik7CisgICAgUHlPYmplY3RfR0NfVW5UcmFjayhseik7CisgICAgUHlfWERFQ1JFRihsei0+ZnVuYyk7CisgICAgUHlfWERFQ1JFRihsei0+aXQpOworICAgIFB5X1RZUEUobHopLT50cF9mcmVlKGx6KTsKIH0KIAogc3RhdGljIGludAogdGFrZXdoaWxlX3RyYXZlcnNlKHRha2V3aGlsZW9iamVjdCAqbHosIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotCVB5X1ZJU0lUKGx6LT5pdCk7Ci0JUHlfVklTSVQobHotPmZ1bmMpOwotCXJldHVybiAwOworICAgIFB5X1ZJU0lUKGx6LT5pdCk7CisgICAgUHlfVklTSVQobHotPmZ1bmMpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogdGFrZXdoaWxlX25leHQodGFrZXdoaWxlb2JqZWN0ICpseikKIHsKLQlQeU9iamVjdCAqaXRlbSwgKmdvb2Q7Ci0JUHlPYmplY3QgKml0ID0gbHotPml0OwotCWxvbmcgb2s7CisgICAgUHlPYmplY3QgKml0ZW0sICpnb29kOworICAgIFB5T2JqZWN0ICppdCA9IGx6LT5pdDsKKyAgICBsb25nIG9rOwogCi0JaWYgKGx6LT5zdG9wID09IDEpCi0JCXJldHVybiBOVUxMOworICAgIGlmIChsei0+c3RvcCA9PSAxKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWFzc2VydChQeUl0ZXJfQ2hlY2soaXQpKTsKLQlpdGVtID0gKCpQeV9UWVBFKGl0KS0+dHBfaXRlcm5leHQpKGl0KTsKLQlpZiAoaXRlbSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBhc3NlcnQoUHlJdGVyX0NoZWNrKGl0KSk7CisgICAgaXRlbSA9ICgqUHlfVFlQRShpdCktPnRwX2l0ZXJuZXh0KShpdCk7CisgICAgaWYgKGl0ZW0gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlnb29kID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhsei0+ZnVuYywgaXRlbSwgTlVMTCk7Ci0JaWYgKGdvb2QgPT0gTlVMTCkgewotCQlQeV9ERUNSRUYoaXRlbSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlvayA9IFB5T2JqZWN0X0lzVHJ1ZShnb29kKTsKLQlQeV9ERUNSRUYoZ29vZCk7Ci0JaWYgKG9rKQotCQlyZXR1cm4gaXRlbTsKLQlQeV9ERUNSRUYoaXRlbSk7Ci0JbHotPnN0b3AgPSAxOwotCXJldHVybiBOVUxMOworICAgIGdvb2QgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGx6LT5mdW5jLCBpdGVtLCBOVUxMKTsKKyAgICBpZiAoZ29vZCA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIG9rID0gUHlPYmplY3RfSXNUcnVlKGdvb2QpOworICAgIFB5X0RFQ1JFRihnb29kKTsKKyAgICBpZiAob2spCisgICAgICAgIHJldHVybiBpdGVtOworICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICBsei0+c3RvcCA9IDE7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIFB5RG9jX1NUUlZBUih0YWtld2hpbGVfZG9jLApAQCAtMTA1Nyw1OSArMTA1Nyw1OSBAQAogcHJlZGljYXRlIGV2YWx1YXRlcyB0byB0cnVlIGZvciBlYWNoIGVudHJ5LiIpOwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IHRha2V3aGlsZV90eXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotCSJpdGVydG9vbHMudGFrZXdoaWxlIiwJCS8qIHRwX25hbWUgKi8KLQlzaXplb2YodGFrZXdoaWxlb2JqZWN0KSwJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpdGFrZXdoaWxlX2RlYWxsb2MsCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJLyogdHBfY29tcGFyZSAqLwotCTAsCQkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJLyogdHBfY2FsbCAqLwotCTAsCQkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDIHwKLQkJUHlfVFBGTEFHU19CQVNFVFlQRSwJLyogdHBfZmxhZ3MgKi8KLQl0YWtld2hpbGVfZG9jLAkJCS8qIHRwX2RvYyAqLwotCSh0cmF2ZXJzZXByb2MpdGFrZXdoaWxlX3RyYXZlcnNlLCAgICAvKiB0cF90cmF2ZXJzZSAqLwotCTAsCQkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCVB5T2JqZWN0X1NlbGZJdGVyLAkJLyogdHBfaXRlciAqLwotCShpdGVybmV4dGZ1bmMpdGFrZXdoaWxlX25leHQsCS8qIHRwX2l0ZXJuZXh0ICovCi0JMCwJCQkJLyogdHBfbWV0aG9kcyAqLwotCTAsCQkJCS8qIHRwX21lbWJlcnMgKi8KLQkwLAkJCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQkwLAkJCQkvKiB0cF9pbml0ICovCi0JMCwJCQkJLyogdHBfYWxsb2MgKi8KLQl0YWtld2hpbGVfbmV3LAkJCS8qIHRwX25ldyAqLwotCVB5T2JqZWN0X0dDX0RlbCwJCS8qIHRwX2ZyZWUgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAiaXRlcnRvb2xzLnRha2V3aGlsZSIsICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCisgICAgc2l6ZW9mKHRha2V3aGlsZW9iamVjdCksICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpdGFrZXdoaWxlX2RlYWxsb2MsICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQyB8CisgICAgICAgIFB5X1RQRkxBR1NfQkFTRVRZUEUsICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICB0YWtld2hpbGVfZG9jLCAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAodHJhdmVyc2Vwcm9jKXRha2V3aGlsZV90cmF2ZXJzZSwgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICBQeU9iamVjdF9TZWxmSXRlciwgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgKGl0ZXJuZXh0ZnVuYyl0YWtld2hpbGVfbmV4dCwgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIHRha2V3aGlsZV9uZXcsICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworICAgIFB5T2JqZWN0X0dDX0RlbCwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KIH07CiAKIAogLyogaXNsaWNlIG9iamVjdCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JUHlPYmplY3QgKml0OwotCVB5X3NzaXplX3QgbmV4dDsKLQlQeV9zc2l6ZV90IHN0b3A7Ci0JUHlfc3NpemVfdCBzdGVwOwotCVB5X3NzaXplX3QgY250OworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBQeU9iamVjdCAqaXQ7CisgICAgUHlfc3NpemVfdCBuZXh0OworICAgIFB5X3NzaXplX3Qgc3RvcDsKKyAgICBQeV9zc2l6ZV90IHN0ZXA7CisgICAgUHlfc3NpemVfdCBjbnQ7CiB9IGlzbGljZW9iamVjdDsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBpc2xpY2VfdHlwZTsKQEAgLTExMTcsMTI4ICsxMTE3LDEyOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGlzbGljZV9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JUHlPYmplY3QgKnNlcTsKLQlQeV9zc2l6ZV90IHN0YXJ0PTAsIHN0b3A9LTEsIHN0ZXA9MTsKLQlQeU9iamVjdCAqaXQsICphMT1OVUxMLCAqYTI9TlVMTCwgKmEzPU5VTEw7Ci0JUHlfc3NpemVfdCBudW1hcmdzOwotCWlzbGljZW9iamVjdCAqbHo7CisgICAgUHlPYmplY3QgKnNlcTsKKyAgICBQeV9zc2l6ZV90IHN0YXJ0PTAsIHN0b3A9LTEsIHN0ZXA9MTsKKyAgICBQeU9iamVjdCAqaXQsICphMT1OVUxMLCAqYTI9TlVMTCwgKmEzPU5VTEw7CisgICAgUHlfc3NpemVfdCBudW1hcmdzOworICAgIGlzbGljZW9iamVjdCAqbHo7CiAKLQlpZiAodHlwZSA9PSAmaXNsaWNlX3R5cGUgJiYgIV9QeUFyZ19Ob0tleXdvcmRzKCJpc2xpY2UoKSIsIGt3ZHMpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAodHlwZSA9PSAmaXNsaWNlX3R5cGUgJiYgIV9QeUFyZ19Ob0tleXdvcmRzKCJpc2xpY2UoKSIsIGt3ZHMpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImlzbGljZSIsIDIsIDQsICZzZXEsICZhMSwgJmEyLCAmYTMpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJpc2xpY2UiLCAyLCA0LCAmc2VxLCAmYTEsICZhMiwgJmEzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQludW1hcmdzID0gUHlUdXBsZV9TaXplKGFyZ3MpOwotCWlmIChudW1hcmdzID09IDIpIHsKLQkJaWYgKGExICE9IFB5X05vbmUpIHsKLQkJCXN0b3AgPSBQeUludF9Bc1NzaXplX3QoYTEpOwotCQkJaWYgKHN0b3AgPT0gLTEpIHsKLQkJCQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkKLQkJCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkgICAiU3RvcCBhcmd1bWVudCBmb3IgaXNsaWNlKCkgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIG9yIE5vbmUuIik7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCX0KLQl9IGVsc2UgewotCQlpZiAoYTEgIT0gUHlfTm9uZSkKLQkJCXN0YXJ0ID0gUHlJbnRfQXNTc2l6ZV90KGExKTsKLQkJaWYgKHN0YXJ0ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCQlQeUVycl9DbGVhcigpOwotCQlpZiAoYTIgIT0gUHlfTm9uZSkgewotCQkJc3RvcCA9IFB5SW50X0FzU3NpemVfdChhMik7Ci0JCQlpZiAoc3RvcCA9PSAtMSkgewotCQkJCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQkJCQlQeUVycl9DbGVhcigpOwotCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSAgICJTdG9wIGFyZ3VtZW50IGZvciBpc2xpY2UoKSBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIgb3IgTm9uZS4iKTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJfQotCX0KLQlpZiAoc3RhcnQ8MCB8fCBzdG9wPC0xKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkgICAiSW5kaWNlcyBmb3IgaXNsaWNlKCkgbXVzdCBiZSBub24tbmVnYXRpdmUgaW50ZWdlcnMgb3IgTm9uZS4iKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIG51bWFyZ3MgPSBQeVR1cGxlX1NpemUoYXJncyk7CisgICAgaWYgKG51bWFyZ3MgPT0gMikgeworICAgICAgICBpZiAoYTEgIT0gUHlfTm9uZSkgeworICAgICAgICAgICAgc3RvcCA9IFB5SW50X0FzU3NpemVfdChhMSk7CisgICAgICAgICAgICBpZiAoc3RvcCA9PSAtMSkgeworICAgICAgICAgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICJTdG9wIGFyZ3VtZW50IGZvciBpc2xpY2UoKSBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIgb3IgTm9uZS4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChhMSAhPSBQeV9Ob25lKQorICAgICAgICAgICAgc3RhcnQgPSBQeUludF9Bc1NzaXplX3QoYTEpOworICAgICAgICBpZiAoc3RhcnQgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIGlmIChhMiAhPSBQeV9Ob25lKSB7CisgICAgICAgICAgICBzdG9wID0gUHlJbnRfQXNTc2l6ZV90KGEyKTsKKyAgICAgICAgICAgIGlmIChzdG9wID09IC0xKSB7CisgICAgICAgICAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgIlN0b3AgYXJndW1lbnQgZm9yIGlzbGljZSgpIG11c3QgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlciBvciBOb25lLiIpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmIChzdGFydDwwIHx8IHN0b3A8LTEpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICJJbmRpY2VzIGZvciBpc2xpY2UoKSBtdXN0IGJlIG5vbi1uZWdhdGl2ZSBpbnRlZ2VycyBvciBOb25lLiIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlpZiAoYTMgIT0gTlVMTCkgewotCQlpZiAoYTMgIT0gUHlfTm9uZSkKLQkJCXN0ZXAgPSBQeUludF9Bc1NzaXplX3QoYTMpOwotCQlpZiAoc3RlcCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJUHlFcnJfQ2xlYXIoKTsKLQl9Ci0JaWYgKHN0ZXA8MSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJICAgIlN0ZXAgZm9yIGlzbGljZSgpIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIG9yIE5vbmUuIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoYTMgIT0gTlVMTCkgeworICAgICAgICBpZiAoYTMgIT0gUHlfTm9uZSkKKyAgICAgICAgICAgIHN0ZXAgPSBQeUludF9Bc1NzaXplX3QoYTMpOworICAgICAgICBpZiAoc3RlcCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICB9CisgICAgaWYgKHN0ZXA8MSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgIlN0ZXAgZm9yIGlzbGljZSgpIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIG9yIE5vbmUuIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCS8qIEdldCBpdGVyYXRvci4gKi8KLQlpdCA9IFB5T2JqZWN0X0dldEl0ZXIoc2VxKTsKLQlpZiAoaXQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgLyogR2V0IGl0ZXJhdG9yLiAqLworICAgIGl0ID0gUHlPYmplY3RfR2V0SXRlcihzZXEpOworICAgIGlmIChpdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCS8qIGNyZWF0ZSBpc2xpY2VvYmplY3Qgc3RydWN0dXJlICovCi0JbHogPSAoaXNsaWNlb2JqZWN0ICopdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7Ci0JaWYgKGx6ID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKGl0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWx6LT5pdCA9IGl0OwotCWx6LT5uZXh0ID0gc3RhcnQ7Ci0JbHotPnN0b3AgPSBzdG9wOwotCWx6LT5zdGVwID0gc3RlcDsKLQlsei0+Y250ID0gMEw7CisgICAgLyogY3JlYXRlIGlzbGljZW9iamVjdCBzdHJ1Y3R1cmUgKi8KKyAgICBseiA9IChpc2xpY2VvYmplY3QgKil0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKKyAgICBpZiAobHogPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYoaXQpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgbHotPml0ID0gaXQ7CisgICAgbHotPm5leHQgPSBzdGFydDsKKyAgICBsei0+c3RvcCA9IHN0b3A7CisgICAgbHotPnN0ZXAgPSBzdGVwOworICAgIGx6LT5jbnQgPSAwTDsKIAotCXJldHVybiAoUHlPYmplY3QgKilsejsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopbHo7CiB9CiAKIHN0YXRpYyB2b2lkCiBpc2xpY2VfZGVhbGxvYyhpc2xpY2VvYmplY3QgKmx6KQogewotCVB5T2JqZWN0X0dDX1VuVHJhY2sobHopOwotCVB5X1hERUNSRUYobHotPml0KTsKLQlQeV9UWVBFKGx6KS0+dHBfZnJlZShseik7CisgICAgUHlPYmplY3RfR0NfVW5UcmFjayhseik7CisgICAgUHlfWERFQ1JFRihsei0+aXQpOworICAgIFB5X1RZUEUobHopLT50cF9mcmVlKGx6KTsKIH0KIAogc3RhdGljIGludAogaXNsaWNlX3RyYXZlcnNlKGlzbGljZW9iamVjdCAqbHosIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotCVB5X1ZJU0lUKGx6LT5pdCk7Ci0JcmV0dXJuIDA7CisgICAgUHlfVklTSVQobHotPml0KTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGlzbGljZV9uZXh0KGlzbGljZW9iamVjdCAqbHopCiB7Ci0JUHlPYmplY3QgKml0ZW07Ci0JUHlPYmplY3QgKml0ID0gbHotPml0OwotCVB5X3NzaXplX3Qgb2xkbmV4dDsKLQlQeU9iamVjdCAqKCppdGVybmV4dCkoUHlPYmplY3QgKik7CisgICAgUHlPYmplY3QgKml0ZW07CisgICAgUHlPYmplY3QgKml0ID0gbHotPml0OworICAgIFB5X3NzaXplX3Qgb2xkbmV4dDsKKyAgICBQeU9iamVjdCAqKCppdGVybmV4dCkoUHlPYmplY3QgKik7CiAKLQlhc3NlcnQoUHlJdGVyX0NoZWNrKGl0KSk7Ci0JaXRlcm5leHQgPSAqUHlfVFlQRShpdCktPnRwX2l0ZXJuZXh0OwotCXdoaWxlIChsei0+Y250IDwgbHotPm5leHQpIHsKLQkJaXRlbSA9IGl0ZXJuZXh0KGl0KTsKLQkJaWYgKGl0ZW0gPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQlQeV9ERUNSRUYoaXRlbSk7Ci0JCWx6LT5jbnQrKzsKLQl9Ci0JaWYgKGx6LT5zdG9wICE9IC0xICYmIGx6LT5jbnQgPj0gbHotPnN0b3ApCi0JCXJldHVybiBOVUxMOwotCWFzc2VydChQeUl0ZXJfQ2hlY2soaXQpKTsKLQlpdGVtID0gaXRlcm5leHQoaXQpOwotCWlmIChpdGVtID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWx6LT5jbnQrKzsKLQlvbGRuZXh0ID0gbHotPm5leHQ7Ci0JbHotPm5leHQgKz0gbHotPnN0ZXA7Ci0JaWYgKGx6LT5uZXh0IDwgb2xkbmV4dCkJLyogQ2hlY2sgZm9yIG92ZXJmbG93ICovCi0JCWx6LT5uZXh0ID0gbHotPnN0b3A7Ci0JcmV0dXJuIGl0ZW07CisgICAgYXNzZXJ0KFB5SXRlcl9DaGVjayhpdCkpOworICAgIGl0ZXJuZXh0ID0gKlB5X1RZUEUoaXQpLT50cF9pdGVybmV4dDsKKyAgICB3aGlsZSAobHotPmNudCA8IGx6LT5uZXh0KSB7CisgICAgICAgIGl0ZW0gPSBpdGVybmV4dChpdCk7CisgICAgICAgIGlmIChpdGVtID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgICAgICBsei0+Y250Kys7CisgICAgfQorICAgIGlmIChsei0+c3RvcCAhPSAtMSAmJiBsei0+Y250ID49IGx6LT5zdG9wKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBhc3NlcnQoUHlJdGVyX0NoZWNrKGl0KSk7CisgICAgaXRlbSA9IGl0ZXJuZXh0KGl0KTsKKyAgICBpZiAoaXRlbSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBsei0+Y250Kys7CisgICAgb2xkbmV4dCA9IGx6LT5uZXh0OworICAgIGx6LT5uZXh0ICs9IGx6LT5zdGVwOworICAgIGlmIChsei0+bmV4dCA8IG9sZG5leHQpICAgICAvKiBDaGVjayBmb3Igb3ZlcmZsb3cgKi8KKyAgICAgICAgbHotPm5leHQgPSBsei0+c3RvcDsKKyAgICByZXR1cm4gaXRlbTsKIH0KIAogUHlEb2NfU1RSVkFSKGlzbGljZV9kb2MsCkBAIC0xMjUyLDU2ICsxMjUyLDU2IEBACiBidXQgcmV0dXJucyBhbiBpdGVyYXRvci4iKTsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBpc2xpY2VfdHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKLQkiaXRlcnRvb2xzLmlzbGljZSIsCQkvKiB0cF9uYW1lICovCi0Jc2l6ZW9mKGlzbGljZW9iamVjdCksCQkvKiB0cF9iYXNpY3NpemUgKi8KLQkwLAkJCQkvKiB0cF9pdGVtc2l6ZSAqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3Rvcilpc2xpY2VfZGVhbGxvYywJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkvKiB0cF9jb21wYXJlICovCi0JMCwJCQkJLyogdHBfcmVwciAqLwotCTAsCQkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCS8qIHRwX2hhc2ggKi8KLQkwLAkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MgfAotCQlQeV9UUEZMQUdTX0JBU0VUWVBFLAkvKiB0cF9mbGFncyAqLwotCWlzbGljZV9kb2MsCQkJLyogdHBfZG9jICovCi0JKHRyYXZlcnNlcHJvYylpc2xpY2VfdHJhdmVyc2UsCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JUHlPYmplY3RfU2VsZkl0ZXIsCQkvKiB0cF9pdGVyICovCi0JKGl0ZXJuZXh0ZnVuYylpc2xpY2VfbmV4dCwJLyogdHBfaXRlcm5leHQgKi8KLQkwLAkJCQkvKiB0cF9tZXRob2RzICovCi0JMCwJCQkJLyogdHBfbWVtYmVycyAqLwotCTAsCQkJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkvKiB0cF9kaWN0ICovCi0JMCwJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJCQkJLyogdHBfZGljdG9mZnNldCAqLwotCTAsCQkJCS8qIHRwX2luaXQgKi8KLQkwLAkJCQkvKiB0cF9hbGxvYyAqLwotCWlzbGljZV9uZXcsCQkJLyogdHBfbmV3ICovCi0JUHlPYmplY3RfR0NfRGVsLAkJLyogdHBfZnJlZSAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQorICAgICJpdGVydG9vbHMuaXNsaWNlIiwgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICBzaXplb2YoaXNsaWNlb2JqZWN0KSwgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3Rvcilpc2xpY2VfZGVhbGxvYywgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDIHwKKyAgICAgICAgUHlfVFBGTEFHU19CQVNFVFlQRSwgICAgICAgICAgICAvKiB0cF9mbGFncyAqLworICAgIGlzbGljZV9kb2MsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2MpaXNsaWNlX3RyYXZlcnNlLCAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgUHlPYmplY3RfU2VsZkl0ZXIsICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIChpdGVybmV4dGZ1bmMpaXNsaWNlX25leHQsICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBpc2xpY2VfbmV3LCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICBQeU9iamVjdF9HQ19EZWwsICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCiB9OwogCiAKIC8qIHN0YXJtYXAgb2JqZWN0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewotCVB5T2JqZWN0X0hFQUQKLQlQeU9iamVjdCAqZnVuYzsKLQlQeU9iamVjdCAqaXQ7CisgICAgUHlPYmplY3RfSEVBRAorICAgIFB5T2JqZWN0ICpmdW5jOworICAgIFB5T2JqZWN0ICppdDsKIH0gc3Rhcm1hcG9iamVjdDsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBzdGFybWFwX3R5cGU7CkBAIC0xMzA5LDcyICsxMzA5LDcyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3Rhcm1hcF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JUHlPYmplY3QgKmZ1bmMsICpzZXE7Ci0JUHlPYmplY3QgKml0OwotCXN0YXJtYXBvYmplY3QgKmx6OworICAgIFB5T2JqZWN0ICpmdW5jLCAqc2VxOworICAgIFB5T2JqZWN0ICppdDsKKyAgICBzdGFybWFwb2JqZWN0ICpsejsKIAotCWlmICh0eXBlID09ICZzdGFybWFwX3R5cGUgJiYgIV9QeUFyZ19Ob0tleXdvcmRzKCJzdGFybWFwKCkiLCBrd2RzKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKHR5cGUgPT0gJnN0YXJtYXBfdHlwZSAmJiAhX1B5QXJnX05vS2V5d29yZHMoInN0YXJtYXAoKSIsIGt3ZHMpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInN0YXJtYXAiLCAyLCAyLCAmZnVuYywgJnNlcSkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInN0YXJtYXAiLCAyLCAyLCAmZnVuYywgJnNlcSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JLyogR2V0IGl0ZXJhdG9yLiAqLwotCWl0ID0gUHlPYmplY3RfR2V0SXRlcihzZXEpOwotCWlmIChpdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICAvKiBHZXQgaXRlcmF0b3IuICovCisgICAgaXQgPSBQeU9iamVjdF9HZXRJdGVyKHNlcSk7CisgICAgaWYgKGl0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JLyogY3JlYXRlIHN0YXJtYXBvYmplY3Qgc3RydWN0dXJlICovCi0JbHogPSAoc3Rhcm1hcG9iamVjdCAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOwotCWlmIChseiA9PSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRihpdCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlQeV9JTkNSRUYoZnVuYyk7Ci0JbHotPmZ1bmMgPSBmdW5jOwotCWx6LT5pdCA9IGl0OworICAgIC8qIGNyZWF0ZSBzdGFybWFwb2JqZWN0IHN0cnVjdHVyZSAqLworICAgIGx6ID0gKHN0YXJtYXBvYmplY3QgKil0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKKyAgICBpZiAobHogPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYoaXQpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlfSU5DUkVGKGZ1bmMpOworICAgIGx6LT5mdW5jID0gZnVuYzsKKyAgICBsei0+aXQgPSBpdDsKIAotCXJldHVybiAoUHlPYmplY3QgKilsejsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopbHo7CiB9CiAKIHN0YXRpYyB2b2lkCiBzdGFybWFwX2RlYWxsb2Moc3Rhcm1hcG9iamVjdCAqbHopCiB7Ci0JUHlPYmplY3RfR0NfVW5UcmFjayhseik7Ci0JUHlfWERFQ1JFRihsei0+ZnVuYyk7Ci0JUHlfWERFQ1JFRihsei0+aXQpOwotCVB5X1RZUEUobHopLT50cF9mcmVlKGx6KTsKKyAgICBQeU9iamVjdF9HQ19VblRyYWNrKGx6KTsKKyAgICBQeV9YREVDUkVGKGx6LT5mdW5jKTsKKyAgICBQeV9YREVDUkVGKGx6LT5pdCk7CisgICAgUHlfVFlQRShseiktPnRwX2ZyZWUobHopOwogfQogCiBzdGF0aWMgaW50CiBzdGFybWFwX3RyYXZlcnNlKHN0YXJtYXBvYmplY3QgKmx6LCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlQeV9WSVNJVChsei0+aXQpOwotCVB5X1ZJU0lUKGx6LT5mdW5jKTsKLQlyZXR1cm4gMDsKKyAgICBQeV9WSVNJVChsei0+aXQpOworICAgIFB5X1ZJU0lUKGx6LT5mdW5jKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHN0YXJtYXBfbmV4dChzdGFybWFwb2JqZWN0ICpseikKIHsKLQlQeU9iamVjdCAqYXJnczsKLQlQeU9iamVjdCAqcmVzdWx0OwotCVB5T2JqZWN0ICppdCA9IGx6LT5pdDsKKyAgICBQeU9iamVjdCAqYXJnczsKKyAgICBQeU9iamVjdCAqcmVzdWx0OworICAgIFB5T2JqZWN0ICppdCA9IGx6LT5pdDsKIAotCWFzc2VydChQeUl0ZXJfQ2hlY2soaXQpKTsKLQlhcmdzID0gKCpQeV9UWVBFKGl0KS0+dHBfaXRlcm5leHQpKGl0KTsKLQlpZiAoYXJncyA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIVB5VHVwbGVfQ2hlY2tFeGFjdChhcmdzKSkgewotCQlQeU9iamVjdCAqbmV3YXJncyA9IFB5U2VxdWVuY2VfVHVwbGUoYXJncyk7Ci0JCVB5X0RFQ1JFRihhcmdzKTsKLQkJaWYgKG5ld2FyZ3MgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQlhcmdzID0gbmV3YXJnczsKLQl9Ci0JcmVzdWx0ID0gUHlPYmplY3RfQ2FsbChsei0+ZnVuYywgYXJncywgTlVMTCk7Ci0JUHlfREVDUkVGKGFyZ3MpOwotCXJldHVybiByZXN1bHQ7CisgICAgYXNzZXJ0KFB5SXRlcl9DaGVjayhpdCkpOworICAgIGFyZ3MgPSAoKlB5X1RZUEUoaXQpLT50cF9pdGVybmV4dCkoaXQpOworICAgIGlmIChhcmdzID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHlUdXBsZV9DaGVja0V4YWN0KGFyZ3MpKSB7CisgICAgICAgIFB5T2JqZWN0ICpuZXdhcmdzID0gUHlTZXF1ZW5jZV9UdXBsZShhcmdzKTsKKyAgICAgICAgUHlfREVDUkVGKGFyZ3MpOworICAgICAgICBpZiAobmV3YXJncyA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGFyZ3MgPSBuZXdhcmdzOworICAgIH0KKyAgICByZXN1bHQgPSBQeU9iamVjdF9DYWxsKGx6LT5mdW5jLCBhcmdzLCBOVUxMKTsKKyAgICBQeV9ERUNSRUYoYXJncyk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogUHlEb2NfU1RSVkFSKHN0YXJtYXBfZG9jLApAQCAtMTM4NCw1NiArMTM4NCw1NiBAQAogd2l0aCBhIGFyZ3VtZW50IHR1cGxlIHRha2VuIGZyb20gdGhlIGdpdmVuIHNlcXVlbmNlLiIpOwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IHN0YXJtYXBfdHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKLQkiaXRlcnRvb2xzLnN0YXJtYXAiLAkJLyogdHBfbmFtZSAqLwotCXNpemVvZihzdGFybWFwb2JqZWN0KSwJCS8qIHRwX2Jhc2ljc2l6ZSAqLwotCTAsCQkJCS8qIHRwX2l0ZW1zaXplICovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKXN0YXJtYXBfZGVhbGxvYywJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkvKiB0cF9jb21wYXJlICovCi0JMCwJCQkJLyogdHBfcmVwciAqLwotCTAsCQkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCS8qIHRwX2hhc2ggKi8KLQkwLAkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MgfAotCQlQeV9UUEZMQUdTX0JBU0VUWVBFLAkvKiB0cF9mbGFncyAqLwotCXN0YXJtYXBfZG9jLAkJCS8qIHRwX2RvYyAqLwotCSh0cmF2ZXJzZXByb2Mpc3Rhcm1hcF90cmF2ZXJzZSwJLyogdHBfdHJhdmVyc2UgKi8KLQkwLAkJCQkvKiB0cF9jbGVhciAqLwotCTAsCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQlQeU9iamVjdF9TZWxmSXRlciwJCS8qIHRwX2l0ZXIgKi8KLQkoaXRlcm5leHRmdW5jKXN0YXJtYXBfbmV4dCwJLyogdHBfaXRlcm5leHQgKi8KLQkwLAkJCQkvKiB0cF9tZXRob2RzICovCi0JMCwJCQkJLyogdHBfbWVtYmVycyAqLwotCTAsCQkJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkvKiB0cF9kaWN0ICovCi0JMCwJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJCQkJLyogdHBfZGljdG9mZnNldCAqLwotCTAsCQkJCS8qIHRwX2luaXQgKi8KLQkwLAkJCQkvKiB0cF9hbGxvYyAqLwotCXN0YXJtYXBfbmV3LAkJCS8qIHRwX25ldyAqLwotCVB5T2JqZWN0X0dDX0RlbCwJCS8qIHRwX2ZyZWUgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAiaXRlcnRvb2xzLnN0YXJtYXAiLCAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCisgICAgc2l6ZW9mKHN0YXJtYXBvYmplY3QpLCAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3Ipc3Rhcm1hcF9kZWFsbG9jLCAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQyB8CisgICAgICAgIFB5X1RQRkxBR1NfQkFTRVRZUEUsICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICBzdGFybWFwX2RvYywgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAodHJhdmVyc2Vwcm9jKXN0YXJtYXBfdHJhdmVyc2UsICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIFB5T2JqZWN0X1NlbGZJdGVyLCAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAoaXRlcm5leHRmdW5jKXN0YXJtYXBfbmV4dCwgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgc3Rhcm1hcF9uZXcsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgUHlPYmplY3RfR0NfRGVsLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKIAogCiAvKiBpbWFwIG9iamVjdCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JUHlPYmplY3QgKml0ZXJzOwotCVB5T2JqZWN0ICpmdW5jOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBQeU9iamVjdCAqaXRlcnM7CisgICAgUHlPYmplY3QgKmZ1bmM7CiB9IGltYXBvYmplY3Q7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgaW1hcF90eXBlOwpAQCAtMTQ0MSw2NiArMTQ0MSw2NiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGltYXBfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCVB5T2JqZWN0ICppdCwgKml0ZXJzLCAqZnVuYzsKLQlpbWFwb2JqZWN0ICpsejsKLQlQeV9zc2l6ZV90IG51bWFyZ3MsIGk7CisgICAgUHlPYmplY3QgKml0LCAqaXRlcnMsICpmdW5jOworICAgIGltYXBvYmplY3QgKmx6OworICAgIFB5X3NzaXplX3QgbnVtYXJncywgaTsKIAotCWlmICh0eXBlID09ICZpbWFwX3R5cGUgJiYgIV9QeUFyZ19Ob0tleXdvcmRzKCJpbWFwKCkiLCBrd2RzKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKHR5cGUgPT0gJmltYXBfdHlwZSAmJiAhX1B5QXJnX05vS2V5d29yZHMoImltYXAoKSIsIGt3ZHMpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCW51bWFyZ3MgPSBQeVR1cGxlX1NpemUoYXJncyk7Ci0JaWYgKG51bWFyZ3MgPCAyKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCSAgICJpbWFwKCkgbXVzdCBoYXZlIGF0IGxlYXN0IHR3byBhcmd1bWVudHMuIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBudW1hcmdzID0gUHlUdXBsZV9TaXplKGFyZ3MpOworICAgIGlmIChudW1hcmdzIDwgMikgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAiaW1hcCgpIG11c3QgaGF2ZSBhdCBsZWFzdCB0d28gYXJndW1lbnRzLiIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlpdGVycyA9IFB5VHVwbGVfTmV3KG51bWFyZ3MtMSk7Ci0JaWYgKGl0ZXJzID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIGl0ZXJzID0gUHlUdXBsZV9OZXcobnVtYXJncy0xKTsKKyAgICBpZiAoaXRlcnMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlmb3IgKGk9MSA7IGk8bnVtYXJncyA7IGkrKykgewotCQkvKiBHZXQgaXRlcmF0b3IuICovCi0JCWl0ID0gUHlPYmplY3RfR2V0SXRlcihQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIGkpKTsKLQkJaWYgKGl0ID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRihpdGVycyk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlQeVR1cGxlX1NFVF9JVEVNKGl0ZXJzLCBpLTEsIGl0KTsKLQl9CisgICAgZm9yIChpPTEgOyBpPG51bWFyZ3MgOyBpKyspIHsKKyAgICAgICAgLyogR2V0IGl0ZXJhdG9yLiAqLworICAgICAgICBpdCA9IFB5T2JqZWN0X0dldEl0ZXIoUHlUdXBsZV9HRVRfSVRFTShhcmdzLCBpKSk7CisgICAgICAgIGlmIChpdCA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoaXRlcnMpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShpdGVycywgaS0xLCBpdCk7CisgICAgfQogCi0JLyogY3JlYXRlIGltYXBvYmplY3Qgc3RydWN0dXJlICovCi0JbHogPSAoaW1hcG9iamVjdCAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOwotCWlmIChseiA9PSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRihpdGVycyk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlsei0+aXRlcnMgPSBpdGVyczsKLQlmdW5jID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCAwKTsKLQlQeV9JTkNSRUYoZnVuYyk7Ci0JbHotPmZ1bmMgPSBmdW5jOworICAgIC8qIGNyZWF0ZSBpbWFwb2JqZWN0IHN0cnVjdHVyZSAqLworICAgIGx6ID0gKGltYXBvYmplY3QgKil0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKKyAgICBpZiAobHogPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYoaXRlcnMpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgbHotPml0ZXJzID0gaXRlcnM7CisgICAgZnVuYyA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgMCk7CisgICAgUHlfSU5DUkVGKGZ1bmMpOworICAgIGx6LT5mdW5jID0gZnVuYzsKIAotCXJldHVybiAoUHlPYmplY3QgKilsejsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopbHo7CiB9CiAKIHN0YXRpYyB2b2lkCiBpbWFwX2RlYWxsb2MoaW1hcG9iamVjdCAqbHopCiB7Ci0JUHlPYmplY3RfR0NfVW5UcmFjayhseik7Ci0JUHlfWERFQ1JFRihsei0+aXRlcnMpOwotCVB5X1hERUNSRUYobHotPmZ1bmMpOwotCVB5X1RZUEUobHopLT50cF9mcmVlKGx6KTsKKyAgICBQeU9iamVjdF9HQ19VblRyYWNrKGx6KTsKKyAgICBQeV9YREVDUkVGKGx6LT5pdGVycyk7CisgICAgUHlfWERFQ1JFRihsei0+ZnVuYyk7CisgICAgUHlfVFlQRShseiktPnRwX2ZyZWUobHopOwogfQogCiBzdGF0aWMgaW50CiBpbWFwX3RyYXZlcnNlKGltYXBvYmplY3QgKmx6LCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlQeV9WSVNJVChsei0+aXRlcnMpOwotCVB5X1ZJU0lUKGx6LT5mdW5jKTsKLQlyZXR1cm4gMDsKKyAgICBQeV9WSVNJVChsei0+aXRlcnMpOworICAgIFB5X1ZJU0lUKGx6LT5mdW5jKTsKKyAgICByZXR1cm4gMDsKIH0KIAotLyoJCisvKgogaW1hcCgpIGlzIGFuIGl0ZXJhdG9yIHZlcnNpb24gb2YgX19idWlsdGluc19fLm1hcCgpIGV4Y2VwdCB0aGF0IGl0IGRvZXMKIG5vdCBoYXZlIHRoZSBOb25lIGZpbGwtaW4gZmVhdHVyZS4gIFRoYXQgd2FzIGludGVudGlvbmFsbHkgbGVmdCBvdXQgZm9yCiB0aGUgZm9sbG93aW5nIHJlYXNvbnM6CkBAIC0xNTExLDE1ICsxNTExLDE1IEBACiAgICAgIGluZmluaXRlIGl0ZXJhdG9ycyBsaWtlIGNvdW50KCkgYW5kIHJlcGVhdCgpIChmb3Igc3VwcGx5aW5nIHNlcXVlbnRpYWwKICAgICAgb3IgY29uc3RhbnQgYXJndW1lbnRzIHRvIGEgZnVuY3Rpb24pLgogCi0gIDIpIEluIHR5cGljYWwgdXNlIGNhc2VzIGZvciBjb21iaW5pbmcgaXRlcnRvb2xzLCBoYXZpbmcgb25lIGZpbml0ZSBkYXRhIAorICAyKSBJbiB0eXBpY2FsIHVzZSBjYXNlcyBmb3IgY29tYmluaW5nIGl0ZXJ0b29scywgaGF2aW5nIG9uZSBmaW5pdGUgZGF0YQogICAgICBzdXBwbGllciBydW4gb3V0IGJlZm9yZSBhbm90aGVyIGlzIGxpa2VseSB0byBiZSBhbiBlcnJvciBjb25kaXRpb24gd2hpY2gKICAgICAgc2hvdWxkIG5vdCBwYXNzIHNpbGVudGx5IGJ5IGF1dG9tYXRpY2FsbHkgc3VwcGx5aW5nIE5vbmUuCiAKICAgMykgVGhlIHVzZSBjYXNlcyBmb3IgYXV0b21hdGljIE5vbmUgZmlsbC1pbiBhcmUgcmFyZSAtLSBub3QgbWFueSBmdW5jdGlvbnMKICAgICAgZG8gc29tZXRoaW5nIHVzZWZ1bCB3aGVuIGEgcGFyYW1ldGVyIHN1ZGRlbmx5IHN3aXRjaGVzIHR5cGUgYW5kIGJlY29tZXMKLSAgICAgTm9uZS4gIAorICAgICBOb25lLgogCi0gIDQpIElmIGEgbmVlZCBkb2VzIGFyaXNlLCBpdCBjYW4gYmUgbWV0IGJ5IF9fYnVpbHRpbnNfXy5tYXAoKSBvciBieSAKKyAgNCkgSWYgYSBuZWVkIGRvZXMgYXJpc2UsIGl0IGNhbiBiZSBtZXQgYnkgX19idWlsdGluc19fLm1hcCgpIG9yIGJ5CiAgICAgIHdyaXRpbmc6ICBjaGFpbihpdGVyYWJsZSwgcmVwZWF0KE5vbmUpKS4KIAogICA1KSBTaW1pbGFyIHRvb2xzZXRzIGluIEhhc2tlbGwgYW5kIFNNTCBkbyBub3QgaGF2ZSBhdXRvbWF0aWMgTm9uZSBmaWxsLWluLgpAQCAtMTUyOCwxODcgKzE1MjgsMTg3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogaW1hcF9uZXh0KGltYXBvYmplY3QgKmx6KQogewotCVB5T2JqZWN0ICp2YWw7Ci0JUHlPYmplY3QgKmFyZ3R1cGxlOwotCVB5T2JqZWN0ICpyZXN1bHQ7Ci0JUHlfc3NpemVfdCBudW1hcmdzLCBpOworICAgIFB5T2JqZWN0ICp2YWw7CisgICAgUHlPYmplY3QgKmFyZ3R1cGxlOworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisgICAgUHlfc3NpemVfdCBudW1hcmdzLCBpOwogCi0JbnVtYXJncyA9IFB5VHVwbGVfU2l6ZShsei0+aXRlcnMpOwotCWFyZ3R1cGxlID0gUHlUdXBsZV9OZXcobnVtYXJncyk7Ci0JaWYgKGFyZ3R1cGxlID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIG51bWFyZ3MgPSBQeVR1cGxlX1NpemUobHotPml0ZXJzKTsKKyAgICBhcmd0dXBsZSA9IFB5VHVwbGVfTmV3KG51bWFyZ3MpOworICAgIGlmIChhcmd0dXBsZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWZvciAoaT0wIDsgaTxudW1hcmdzIDsgaSsrKSB7Ci0JCXZhbCA9IFB5SXRlcl9OZXh0KFB5VHVwbGVfR0VUX0lURU0obHotPml0ZXJzLCBpKSk7Ci0JCWlmICh2YWwgPT0gTlVMTCkgewotCQkJUHlfREVDUkVGKGFyZ3R1cGxlKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCVB5VHVwbGVfU0VUX0lURU0oYXJndHVwbGUsIGksIHZhbCk7Ci0JfQotCWlmIChsei0+ZnVuYyA9PSBQeV9Ob25lKSAKLQkJcmV0dXJuIGFyZ3R1cGxlOwotCXJlc3VsdCA9IFB5T2JqZWN0X0NhbGwobHotPmZ1bmMsIGFyZ3R1cGxlLCBOVUxMKTsKLQlQeV9ERUNSRUYoYXJndHVwbGUpOwotCXJldHVybiByZXN1bHQ7CisgICAgZm9yIChpPTAgOyBpPG51bWFyZ3MgOyBpKyspIHsKKyAgICAgICAgdmFsID0gUHlJdGVyX05leHQoUHlUdXBsZV9HRVRfSVRFTShsei0+aXRlcnMsIGkpKTsKKyAgICAgICAgaWYgKHZhbCA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoYXJndHVwbGUpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShhcmd0dXBsZSwgaSwgdmFsKTsKKyAgICB9CisgICAgaWYgKGx6LT5mdW5jID09IFB5X05vbmUpCisgICAgICAgIHJldHVybiBhcmd0dXBsZTsKKyAgICByZXN1bHQgPSBQeU9iamVjdF9DYWxsKGx6LT5mdW5jLCBhcmd0dXBsZSwgTlVMTCk7CisgICAgUHlfREVDUkVGKGFyZ3R1cGxlKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBQeURvY19TVFJWQVIoaW1hcF9kb2MsCiAiaW1hcChmdW5jLCAqaXRlcmFibGVzKSAtLT4gaW1hcCBvYmplY3RcblwKIFxuXAogTWFrZSBhbiBpdGVyYXRvciB0aGF0IGNvbXB1dGVzIHRoZSBmdW5jdGlvbiB1c2luZyBhcmd1bWVudHMgZnJvbVxuXAotZWFjaCBvZiB0aGUgaXRlcmFibGVzLglMaWtlIG1hcCgpIGV4Y2VwdCB0aGF0IGl0IHJldHVybnNcblwKK2VhY2ggb2YgdGhlIGl0ZXJhYmxlcy4gIExpa2UgbWFwKCkgZXhjZXB0IHRoYXQgaXQgcmV0dXJuc1xuXAogYW4gaXRlcmF0b3IgaW5zdGVhZCBvZiBhIGxpc3QgYW5kIHRoYXQgaXQgc3RvcHMgd2hlbiB0aGUgc2hvcnRlc3RcblwKIGl0ZXJhYmxlIGlzIGV4aGF1c3RlZCBpbnN0ZWFkIG9mIGZpbGxpbmcgaW4gTm9uZSBmb3Igc2hvcnRlclxuXAogaXRlcmFibGVzLiIpOwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IGltYXBfdHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKLQkiaXRlcnRvb2xzLmltYXAiLAkJLyogdHBfbmFtZSAqLwotCXNpemVvZihpbWFwb2JqZWN0KSwJCS8qIHRwX2Jhc2ljc2l6ZSAqLwotCTAsCQkJCS8qIHRwX2l0ZW1zaXplICovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKWltYXBfZGVhbGxvYywJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkvKiB0cF9jb21wYXJlICovCi0JMCwJCQkJLyogdHBfcmVwciAqLwotCTAsCQkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCS8qIHRwX2hhc2ggKi8KLQkwLAkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MgfAotCQlQeV9UUEZMQUdTX0JBU0VUWVBFLAkvKiB0cF9mbGFncyAqLwotCWltYXBfZG9jLAkJCS8qIHRwX2RvYyAqLwotCSh0cmF2ZXJzZXByb2MpaW1hcF90cmF2ZXJzZSwJLyogdHBfdHJhdmVyc2UgKi8KLQkwLAkJCQkvKiB0cF9jbGVhciAqLwotCTAsCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQlQeU9iamVjdF9TZWxmSXRlciwJCS8qIHRwX2l0ZXIgKi8KLQkoaXRlcm5leHRmdW5jKWltYXBfbmV4dCwJLyogdHBfaXRlcm5leHQgKi8KLQkwLAkJCQkvKiB0cF9tZXRob2RzICovCi0JMCwJCQkJLyogdHBfbWVtYmVycyAqLwotCTAsCQkJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkvKiB0cF9kaWN0ICovCi0JMCwJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJCQkJLyogdHBfZGljdG9mZnNldCAqLwotCTAsCQkJCS8qIHRwX2luaXQgKi8KLQkwLAkJCQkvKiB0cF9hbGxvYyAqLwotCWltYXBfbmV3LAkJCS8qIHRwX25ldyAqLwotCVB5T2JqZWN0X0dDX0RlbCwJCS8qIHRwX2ZyZWUgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAiaXRlcnRvb2xzLmltYXAiLCAgICAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCisgICAgc2l6ZW9mKGltYXBvYmplY3QpLCAgICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpaW1hcF9kZWFsbG9jLCAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQyB8CisgICAgICAgIFB5X1RQRkxBR1NfQkFTRVRZUEUsICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICBpbWFwX2RvYywgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAodHJhdmVyc2Vwcm9jKWltYXBfdHJhdmVyc2UsICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIFB5T2JqZWN0X1NlbGZJdGVyLCAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAoaXRlcm5leHRmdW5jKWltYXBfbmV4dCwgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgaW1hcF9uZXcsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgUHlPYmplY3RfR0NfRGVsLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKIAogCiAvKiBjaGFpbiBvYmplY3QgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCVB5T2JqZWN0ICpzb3VyY2U7CQkvKiBJdGVyYXRvciBvdmVyIGlucHV0IGl0ZXJhYmxlcyAqLwotCVB5T2JqZWN0ICphY3RpdmU7CQkvKiBDdXJyZW50bHkgcnVubmluZyBpbnB1dCBpdGVyYXRvciAqLworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBQeU9iamVjdCAqc291cmNlOyAgICAgICAgICAgICAgICAgICAvKiBJdGVyYXRvciBvdmVyIGlucHV0IGl0ZXJhYmxlcyAqLworICAgIFB5T2JqZWN0ICphY3RpdmU7ICAgICAgICAgICAgICAgICAgIC8qIEN1cnJlbnRseSBydW5uaW5nIGlucHV0IGl0ZXJhdG9yICovCiB9IGNoYWlub2JqZWN0OwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IGNoYWluX3R5cGU7CiAKLXN0YXRpYyBQeU9iamVjdCAqIAorc3RhdGljIFB5T2JqZWN0ICoKIGNoYWluX25ld19pbnRlcm5hbChQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICpzb3VyY2UpCiB7Ci0JY2hhaW5vYmplY3QgKmx6OworICAgIGNoYWlub2JqZWN0ICpsejsKIAotCWx6ID0gKGNoYWlub2JqZWN0ICopdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7Ci0JaWYgKGx6ID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKHNvdXJjZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQkKLQlsei0+c291cmNlID0gc291cmNlOwotCWx6LT5hY3RpdmUgPSBOVUxMOwotCXJldHVybiAoUHlPYmplY3QgKilsejsKKyAgICBseiA9IChjaGFpbm9iamVjdCAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOworICAgIGlmIChseiA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihzb3VyY2UpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBsei0+c291cmNlID0gc291cmNlOworICAgIGx6LT5hY3RpdmUgPSBOVUxMOworICAgIHJldHVybiAoUHlPYmplY3QgKilsejsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNoYWluX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlQeU9iamVjdCAqc291cmNlOworICAgIFB5T2JqZWN0ICpzb3VyY2U7CiAKLQlpZiAodHlwZSA9PSAmY2hhaW5fdHlwZSAmJiAhX1B5QXJnX05vS2V5d29yZHMoImNoYWluKCkiLCBrd2RzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JCi0Jc291cmNlID0gUHlPYmplY3RfR2V0SXRlcihhcmdzKTsKLQlpZiAoc291cmNlID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIGlmICh0eXBlID09ICZjaGFpbl90eXBlICYmICFfUHlBcmdfTm9LZXl3b3JkcygiY2hhaW4oKSIsIGt3ZHMpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXJldHVybiBjaGFpbl9uZXdfaW50ZXJuYWwodHlwZSwgc291cmNlKTsKKyAgICBzb3VyY2UgPSBQeU9iamVjdF9HZXRJdGVyKGFyZ3MpOworICAgIGlmIChzb3VyY2UgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICByZXR1cm4gY2hhaW5fbmV3X2ludGVybmFsKHR5cGUsIHNvdXJjZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjaGFpbl9uZXdfZnJvbV9pdGVyYWJsZShQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmcpCiB7Ci0JUHlPYmplY3QgKnNvdXJjZTsKLQkKLQlzb3VyY2UgPSBQeU9iamVjdF9HZXRJdGVyKGFyZyk7Ci0JaWYgKHNvdXJjZSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBQeU9iamVjdCAqc291cmNlOwogCi0JcmV0dXJuIGNoYWluX25ld19pbnRlcm5hbCh0eXBlLCBzb3VyY2UpOworICAgIHNvdXJjZSA9IFB5T2JqZWN0X0dldEl0ZXIoYXJnKTsKKyAgICBpZiAoc291cmNlID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgcmV0dXJuIGNoYWluX25ld19pbnRlcm5hbCh0eXBlLCBzb3VyY2UpOwogfQogCiBzdGF0aWMgdm9pZAogY2hhaW5fZGVhbGxvYyhjaGFpbm9iamVjdCAqbHopCiB7Ci0JUHlPYmplY3RfR0NfVW5UcmFjayhseik7Ci0JUHlfWERFQ1JFRihsei0+YWN0aXZlKTsKLQlQeV9YREVDUkVGKGx6LT5zb3VyY2UpOwotCVB5X1RZUEUobHopLT50cF9mcmVlKGx6KTsKKyAgICBQeU9iamVjdF9HQ19VblRyYWNrKGx6KTsKKyAgICBQeV9YREVDUkVGKGx6LT5hY3RpdmUpOworICAgIFB5X1hERUNSRUYobHotPnNvdXJjZSk7CisgICAgUHlfVFlQRShseiktPnRwX2ZyZWUobHopOwogfQogCiBzdGF0aWMgaW50CiBjaGFpbl90cmF2ZXJzZShjaGFpbm9iamVjdCAqbHosIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotCVB5X1ZJU0lUKGx6LT5zb3VyY2UpOwotCVB5X1ZJU0lUKGx6LT5hY3RpdmUpOwotCXJldHVybiAwOworICAgIFB5X1ZJU0lUKGx6LT5zb3VyY2UpOworICAgIFB5X1ZJU0lUKGx6LT5hY3RpdmUpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY2hhaW5fbmV4dChjaGFpbm9iamVjdCAqbHopCiB7Ci0JUHlPYmplY3QgKml0ZW07CisgICAgUHlPYmplY3QgKml0ZW07CiAKLQlpZiAobHotPnNvdXJjZSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsJCQkJLyogYWxyZWFkeSBzdG9wcGVkICovCisgICAgaWYgKGx6LT5zb3VyY2UgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWxyZWFkeSBzdG9wcGVkICovCiAKLQlpZiAobHotPmFjdGl2ZSA9PSBOVUxMKSB7Ci0JCVB5T2JqZWN0ICppdGVyYWJsZSA9IFB5SXRlcl9OZXh0KGx6LT5zb3VyY2UpOwotCQlpZiAoaXRlcmFibGUgPT0gTlVMTCkgewotCQkJUHlfQ0xFQVIobHotPnNvdXJjZSk7Ci0JCQlyZXR1cm4gTlVMTDsJCQkvKiBubyBtb3JlIGlucHV0IHNvdXJjZXMgKi8KLQkJfQotCQlsei0+YWN0aXZlID0gUHlPYmplY3RfR2V0SXRlcihpdGVyYWJsZSk7Ci0JCVB5X0RFQ1JFRihpdGVyYWJsZSk7Ci0JCWlmIChsei0+YWN0aXZlID09IE5VTEwpIHsKLQkJCVB5X0NMRUFSKGx6LT5zb3VyY2UpOwotCQkJcmV0dXJuIE5VTEw7CQkJLyogaW5wdXQgbm90IGl0ZXJhYmxlICovCi0JCX0KLQl9Ci0JaXRlbSA9IFB5SXRlcl9OZXh0KGx6LT5hY3RpdmUpOwotCWlmIChpdGVtICE9IE5VTEwpCi0JCXJldHVybiBpdGVtOwotCWlmIChQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCWlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1N0b3BJdGVyYXRpb24pKQotCQkJUHlFcnJfQ2xlYXIoKTsKLQkJZWxzZQotCQkJcmV0dXJuIE5VTEw7IAkJCS8qIGlucHV0IHJhaXNlZCBhbiBleGNlcHRpb24gKi8KLQl9Ci0JUHlfQ0xFQVIobHotPmFjdGl2ZSk7Ci0JcmV0dXJuIGNoYWluX25leHQobHopOwkJCS8qIHJlY3Vyc2UgYW5kIHVzZSBuZXh0IGFjdGl2ZSAqLworICAgIGlmIChsei0+YWN0aXZlID09IE5VTEwpIHsKKyAgICAgICAgUHlPYmplY3QgKml0ZXJhYmxlID0gUHlJdGVyX05leHQobHotPnNvdXJjZSk7CisgICAgICAgIGlmIChpdGVyYWJsZSA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9DTEVBUihsei0+c291cmNlKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm8gbW9yZSBpbnB1dCBzb3VyY2VzICovCisgICAgICAgIH0KKyAgICAgICAgbHotPmFjdGl2ZSA9IFB5T2JqZWN0X0dldEl0ZXIoaXRlcmFibGUpOworICAgICAgICBQeV9ERUNSRUYoaXRlcmFibGUpOworICAgICAgICBpZiAobHotPmFjdGl2ZSA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9DTEVBUihsei0+c291cmNlKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQgbm90IGl0ZXJhYmxlICovCisgICAgICAgIH0KKyAgICB9CisgICAgaXRlbSA9IFB5SXRlcl9OZXh0KGx6LT5hY3RpdmUpOworICAgIGlmIChpdGVtICE9IE5VTEwpCisgICAgICAgIHJldHVybiBpdGVtOworICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgIGlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1N0b3BJdGVyYXRpb24pKQorICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dCByYWlzZWQgYW4gZXhjZXB0aW9uICovCisgICAgfQorICAgIFB5X0NMRUFSKGx6LT5hY3RpdmUpOworICAgIHJldHVybiBjaGFpbl9uZXh0KGx6KTsgICAgICAgICAgICAgICAgICAgICAgLyogcmVjdXJzZSBhbmQgdXNlIG5leHQgYWN0aXZlICovCiB9CiAKIFB5RG9jX1NUUlZBUihjaGFpbl9kb2MsCkBAIC0xNzI1LDY0ICsxNzI1LDY0IEBACiB0aGF0IGV2YWx1YXRlcyBsYXppbHkuIik7CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBjaGFpbl9tZXRob2RzW10gPSB7Ci0JeyJmcm9tX2l0ZXJhYmxlIiwgKFB5Q0Z1bmN0aW9uKSBjaGFpbl9uZXdfZnJvbV9pdGVyYWJsZSwJTUVUSF9PIHwgTUVUSF9DTEFTUywKLQkJY2hhaW5fZnJvbV9pdGVyYWJsZV9kb2N9LAotCXtOVUxMLAkJTlVMTH0JLyogc2VudGluZWwgKi8KKyAgICB7ImZyb21faXRlcmFibGUiLCAoUHlDRnVuY3Rpb24pIGNoYWluX25ld19mcm9tX2l0ZXJhYmxlLCAgICAgICAgICAgIE1FVEhfTyB8IE1FVEhfQ0xBU1MsCisgICAgICAgIGNoYWluX2Zyb21faXRlcmFibGVfZG9jfSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgLyogc2VudGluZWwgKi8KIH07CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgY2hhaW5fdHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKLQkiaXRlcnRvb2xzLmNoYWluIiwJCS8qIHRwX25hbWUgKi8KLQlzaXplb2YoY2hhaW5vYmplY3QpLAkJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpY2hhaW5fZGVhbGxvYywJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkvKiB0cF9jb21wYXJlICovCi0JMCwJCQkJLyogdHBfcmVwciAqLwotCTAsCQkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCS8qIHRwX2hhc2ggKi8KLQkwLAkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MgfAotCQlQeV9UUEZMQUdTX0JBU0VUWVBFLAkvKiB0cF9mbGFncyAqLwotCWNoYWluX2RvYywJCQkvKiB0cF9kb2MgKi8KLQkodHJhdmVyc2Vwcm9jKWNoYWluX3RyYXZlcnNlLAkvKiB0cF90cmF2ZXJzZSAqLwotCTAsCQkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCVB5T2JqZWN0X1NlbGZJdGVyLAkJLyogdHBfaXRlciAqLwotCShpdGVybmV4dGZ1bmMpY2hhaW5fbmV4dCwJLyogdHBfaXRlcm5leHQgKi8KLQljaGFpbl9tZXRob2RzLAkJCS8qIHRwX21ldGhvZHMgKi8KLQkwLAkJCQkvKiB0cF9tZW1iZXJzICovCi0JMCwJCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCS8qIHRwX2RpY3QgKi8KLQkwLAkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KLQkwLAkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCi0JMCwJCQkJLyogdHBfaW5pdCAqLwotCTAsCQkJCS8qIHRwX2FsbG9jICovCi0JY2hhaW5fbmV3LAkJCS8qIHRwX25ldyAqLwotCVB5T2JqZWN0X0dDX0RlbCwJCS8qIHRwX2ZyZWUgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAiaXRlcnRvb2xzLmNoYWluIiwgICAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCisgICAgc2l6ZW9mKGNoYWlub2JqZWN0KSwgICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpY2hhaW5fZGVhbGxvYywgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQyB8CisgICAgICAgIFB5X1RQRkxBR1NfQkFTRVRZUEUsICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICBjaGFpbl9kb2MsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAodHJhdmVyc2Vwcm9jKWNoYWluX3RyYXZlcnNlLCAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIFB5T2JqZWN0X1NlbGZJdGVyLCAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAoaXRlcm5leHRmdW5jKWNoYWluX25leHQsICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIGNoYWluX21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgY2hhaW5fbmV3LCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgUHlPYmplY3RfR0NfRGVsLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKIAogCiAvKiBwcm9kdWN0IG9iamVjdCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JUHlPYmplY3QgKnBvb2xzOwkJLyogdHVwbGUgb2YgcG9vbCB0dXBsZXMgKi8KLQlQeV9zc2l6ZV90ICppbmRpY2VzOyAgICAgICAgICAgIC8qIG9uZSBpbmRleCBwZXIgcG9vbCAqLwotCVB5T2JqZWN0ICpyZXN1bHQ7ICAgICAgICAgICAgICAgLyogbW9zdCByZWNlbnRseSByZXR1cm5lZCByZXN1bHQgdHVwbGUgKi8KLQlpbnQgc3RvcHBlZDsgICAgICAgICAgICAgICAgICAgIC8qIHNldCB0byAxIHdoZW4gdGhlIHByb2R1Y3QgaXRlcmF0b3IgaXMgZXhoYXVzdGVkICovCisgICAgUHlPYmplY3RfSEVBRAorICAgIFB5T2JqZWN0ICpwb29sczsgICAgICAgICAgICAgICAgICAgIC8qIHR1cGxlIG9mIHBvb2wgdHVwbGVzICovCisgICAgUHlfc3NpemVfdCAqaW5kaWNlczsgICAgICAgICAgICAvKiBvbmUgaW5kZXggcGVyIHBvb2wgKi8KKyAgICBQeU9iamVjdCAqcmVzdWx0OyAgICAgICAgICAgICAgIC8qIG1vc3QgcmVjZW50bHkgcmV0dXJuZWQgcmVzdWx0IHR1cGxlICovCisgICAgaW50IHN0b3BwZWQ7ICAgICAgICAgICAgICAgICAgICAvKiBzZXQgdG8gMSB3aGVuIHRoZSBwcm9kdWN0IGl0ZXJhdG9yIGlzIGV4aGF1c3RlZCAqLwogfSBwcm9kdWN0b2JqZWN0OwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IHByb2R1Y3RfdHlwZTsKQEAgLTE3OTAsMTgwICsxNzkwLDE4MCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHByb2R1Y3RfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCXByb2R1Y3RvYmplY3QgKmx6OwotCVB5X3NzaXplX3QgbmFyZ3MsIG5wb29scywgcmVwZWF0PTE7Ci0JUHlPYmplY3QgKnBvb2xzID0gTlVMTDsKLQlQeV9zc2l6ZV90ICppbmRpY2VzID0gTlVMTDsKLQlQeV9zc2l6ZV90IGk7CisgICAgcHJvZHVjdG9iamVjdCAqbHo7CisgICAgUHlfc3NpemVfdCBuYXJncywgbnBvb2xzLCByZXBlYXQ9MTsKKyAgICBQeU9iamVjdCAqcG9vbHMgPSBOVUxMOworICAgIFB5X3NzaXplX3QgKmluZGljZXMgPSBOVUxMOworICAgIFB5X3NzaXplX3QgaTsKIAotCWlmIChrd2RzICE9IE5VTEwpIHsKLQkJY2hhciAqa3dsaXN0W10gPSB7InJlcGVhdCIsIDB9OwotCQlQeU9iamVjdCAqdG1wYXJncyA9IFB5VHVwbGVfTmV3KDApOwotCQlpZiAodG1wYXJncyA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKHRtcGFyZ3MsIGt3ZHMsICJ8bjpwcm9kdWN0Iiwga3dsaXN0LCAmcmVwZWF0KSkgewotCQkJUHlfREVDUkVGKHRtcGFyZ3MpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJUHlfREVDUkVGKHRtcGFyZ3MpOwotCQlpZiAocmVwZWF0IDwgMCkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsIAotCQkJCQkicmVwZWF0IGFyZ3VtZW50IGNhbm5vdCBiZSBuZWdhdGl2ZSIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9CisgICAgaWYgKGt3ZHMgIT0gTlVMTCkgeworICAgICAgICBjaGFyICprd2xpc3RbXSA9IHsicmVwZWF0IiwgMH07CisgICAgICAgIFB5T2JqZWN0ICp0bXBhcmdzID0gUHlUdXBsZV9OZXcoMCk7CisgICAgICAgIGlmICh0bXBhcmdzID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHModG1wYXJncywga3dkcywgInxuOnByb2R1Y3QiLCBrd2xpc3QsICZyZXBlYXQpKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYodG1wYXJncyk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBQeV9ERUNSRUYodG1wYXJncyk7CisgICAgICAgIGlmIChyZXBlYXQgPCAwKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVwZWF0IGFyZ3VtZW50IGNhbm5vdCBiZSBuZWdhdGl2ZSIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CiAKLQlhc3NlcnQoUHlUdXBsZV9DaGVjayhhcmdzKSk7Ci0JbmFyZ3MgPSAocmVwZWF0ID09IDApID8gMCA6IFB5VHVwbGVfR0VUX1NJWkUoYXJncyk7Ci0JbnBvb2xzID0gbmFyZ3MgKiByZXBlYXQ7CisgICAgYXNzZXJ0KFB5VHVwbGVfQ2hlY2soYXJncykpOworICAgIG5hcmdzID0gKHJlcGVhdCA9PSAwKSA/IDAgOiBQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpOworICAgIG5wb29scyA9IG5hcmdzICogcmVwZWF0OwogCi0JaW5kaWNlcyA9IFB5TWVtX01hbGxvYyhucG9vbHMgKiBzaXplb2YoUHlfc3NpemVfdCkpOwotCWlmIChpbmRpY2VzID09IE5VTEwpIHsKLSAgICAJCVB5RXJyX05vTWVtb3J5KCk7Ci0JCWdvdG8gZXJyb3I7Ci0JfQorICAgIGluZGljZXMgPSBQeU1lbV9NYWxsb2MobnBvb2xzICogc2l6ZW9mKFB5X3NzaXplX3QpKTsKKyAgICBpZiAoaW5kaWNlcyA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQogCi0JcG9vbHMgPSBQeVR1cGxlX05ldyhucG9vbHMpOwotCWlmIChwb29scyA9PSBOVUxMKQotCQlnb3RvIGVycm9yOworICAgIHBvb2xzID0gUHlUdXBsZV9OZXcobnBvb2xzKTsKKyAgICBpZiAocG9vbHMgPT0gTlVMTCkKKyAgICAgICAgZ290byBlcnJvcjsKIAotCWZvciAoaT0wOyBpIDwgbmFyZ3MgOyArK2kpIHsKLQkJUHlPYmplY3QgKml0ZW0gPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIGkpOwotCQlQeU9iamVjdCAqcG9vbCA9IFB5U2VxdWVuY2VfVHVwbGUoaXRlbSk7Ci0JCWlmIChwb29sID09IE5VTEwpCi0JCQlnb3RvIGVycm9yOwotCQlQeVR1cGxlX1NFVF9JVEVNKHBvb2xzLCBpLCBwb29sKTsKLQkJaW5kaWNlc1tpXSA9IDA7Ci0JfQotCWZvciAoIDsgaSA8IG5wb29sczsgKytpKSB7Ci0JCVB5T2JqZWN0ICpwb29sID0gUHlUdXBsZV9HRVRfSVRFTShwb29scywgaSAtIG5hcmdzKTsKLQkJUHlfSU5DUkVGKHBvb2wpOwotCQlQeVR1cGxlX1NFVF9JVEVNKHBvb2xzLCBpLCBwb29sKTsKLQkJaW5kaWNlc1tpXSA9IDA7Ci0JfQorICAgIGZvciAoaT0wOyBpIDwgbmFyZ3MgOyArK2kpIHsKKyAgICAgICAgUHlPYmplY3QgKml0ZW0gPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIGkpOworICAgICAgICBQeU9iamVjdCAqcG9vbCA9IFB5U2VxdWVuY2VfVHVwbGUoaXRlbSk7CisgICAgICAgIGlmIChwb29sID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKHBvb2xzLCBpLCBwb29sKTsKKyAgICAgICAgaW5kaWNlc1tpXSA9IDA7CisgICAgfQorICAgIGZvciAoIDsgaSA8IG5wb29sczsgKytpKSB7CisgICAgICAgIFB5T2JqZWN0ICpwb29sID0gUHlUdXBsZV9HRVRfSVRFTShwb29scywgaSAtIG5hcmdzKTsKKyAgICAgICAgUHlfSU5DUkVGKHBvb2wpOworICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKHBvb2xzLCBpLCBwb29sKTsKKyAgICAgICAgaW5kaWNlc1tpXSA9IDA7CisgICAgfQogCi0JLyogY3JlYXRlIHByb2R1Y3RvYmplY3Qgc3RydWN0dXJlICovCi0JbHogPSAocHJvZHVjdG9iamVjdCAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOwotCWlmIChseiA9PSBOVUxMKQotCQlnb3RvIGVycm9yOworICAgIC8qIGNyZWF0ZSBwcm9kdWN0b2JqZWN0IHN0cnVjdHVyZSAqLworICAgIGx6ID0gKHByb2R1Y3RvYmplY3QgKil0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKKyAgICBpZiAobHogPT0gTlVMTCkKKyAgICAgICAgZ290byBlcnJvcjsKIAotCWx6LT5wb29scyA9IHBvb2xzOwotCWx6LT5pbmRpY2VzID0gaW5kaWNlczsKLQlsei0+cmVzdWx0ID0gTlVMTDsKLQlsei0+c3RvcHBlZCA9IDA7CisgICAgbHotPnBvb2xzID0gcG9vbHM7CisgICAgbHotPmluZGljZXMgPSBpbmRpY2VzOworICAgIGx6LT5yZXN1bHQgPSBOVUxMOworICAgIGx6LT5zdG9wcGVkID0gMDsKIAotCXJldHVybiAoUHlPYmplY3QgKilsejsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopbHo7CiAKIGVycm9yOgotCWlmIChpbmRpY2VzICE9IE5VTEwpCi0JCVB5TWVtX0ZyZWUoaW5kaWNlcyk7Ci0JUHlfWERFQ1JFRihwb29scyk7Ci0JcmV0dXJuIE5VTEw7CisgICAgaWYgKGluZGljZXMgIT0gTlVMTCkKKyAgICAgICAgUHlNZW1fRnJlZShpbmRpY2VzKTsKKyAgICBQeV9YREVDUkVGKHBvb2xzKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIHZvaWQKIHByb2R1Y3RfZGVhbGxvYyhwcm9kdWN0b2JqZWN0ICpseikKIHsKLQlQeU9iamVjdF9HQ19VblRyYWNrKGx6KTsKLQlQeV9YREVDUkVGKGx6LT5wb29scyk7Ci0JUHlfWERFQ1JFRihsei0+cmVzdWx0KTsKLQlQeU1lbV9GcmVlKGx6LT5pbmRpY2VzKTsKLQlQeV9UWVBFKGx6KS0+dHBfZnJlZShseik7CisgICAgUHlPYmplY3RfR0NfVW5UcmFjayhseik7CisgICAgUHlfWERFQ1JFRihsei0+cG9vbHMpOworICAgIFB5X1hERUNSRUYobHotPnJlc3VsdCk7CisgICAgUHlNZW1fRnJlZShsei0+aW5kaWNlcyk7CisgICAgUHlfVFlQRShseiktPnRwX2ZyZWUobHopOwogfQogCiBzdGF0aWMgaW50CiBwcm9kdWN0X3RyYXZlcnNlKHByb2R1Y3RvYmplY3QgKmx6LCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlQeV9WSVNJVChsei0+cG9vbHMpOwotCVB5X1ZJU0lUKGx6LT5yZXN1bHQpOwotCXJldHVybiAwOworICAgIFB5X1ZJU0lUKGx6LT5wb29scyk7CisgICAgUHlfVklTSVQobHotPnJlc3VsdCk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBwcm9kdWN0X25leHQocHJvZHVjdG9iamVjdCAqbHopCiB7Ci0JUHlPYmplY3QgKnBvb2w7Ci0JUHlPYmplY3QgKmVsZW07Ci0JUHlPYmplY3QgKm9sZGVsZW07Ci0JUHlPYmplY3QgKnBvb2xzID0gbHotPnBvb2xzOwotCVB5T2JqZWN0ICpyZXN1bHQgPSBsei0+cmVzdWx0OwotCVB5X3NzaXplX3QgbnBvb2xzID0gUHlUdXBsZV9HRVRfU0laRShwb29scyk7Ci0JUHlfc3NpemVfdCBpOworICAgIFB5T2JqZWN0ICpwb29sOworICAgIFB5T2JqZWN0ICplbGVtOworICAgIFB5T2JqZWN0ICpvbGRlbGVtOworICAgIFB5T2JqZWN0ICpwb29scyA9IGx6LT5wb29sczsKKyAgICBQeU9iamVjdCAqcmVzdWx0ID0gbHotPnJlc3VsdDsKKyAgICBQeV9zc2l6ZV90IG5wb29scyA9IFB5VHVwbGVfR0VUX1NJWkUocG9vbHMpOworICAgIFB5X3NzaXplX3QgaTsKIAotCWlmIChsei0+c3RvcHBlZCkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKGx6LT5zdG9wcGVkKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChyZXN1bHQgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIC8qIE9uIHRoZSBmaXJzdCBwYXNzLCByZXR1cm4gYW4gaW5pdGlhbCB0dXBsZSBmaWxsZWQgd2l0aCB0aGUgCi0gICAgICAgICAgICAgICAgICAgZmlyc3QgZWxlbWVudCBmcm9tIGVhY2ggcG9vbC4gKi8KLQkJcmVzdWx0ID0gUHlUdXBsZV9OZXcobnBvb2xzKTsKLQkJaWYgKHJlc3VsdCA9PSBOVUxMKQotICAgICAgICAgICAgCQlnb3RvIGVtcHR5OwotCQlsei0+cmVzdWx0ID0gcmVzdWx0OwotCQlmb3IgKGk9MDsgaSA8IG5wb29sczsgaSsrKSB7Ci0JCQlwb29sID0gUHlUdXBsZV9HRVRfSVRFTShwb29scywgaSk7Ci0JCQlpZiAoUHlUdXBsZV9HRVRfU0laRShwb29sKSA9PSAwKQotCQkJCWdvdG8gZW1wdHk7Ci0gICAgCQkJZWxlbSA9IFB5VHVwbGVfR0VUX0lURU0ocG9vbCwgMCk7Ci0gICAgCQkJUHlfSU5DUkVGKGVsZW0pOwotICAgIAkJCVB5VHVwbGVfU0VUX0lURU0ocmVzdWx0LCBpLCBlbGVtKTsKLQkJfQotCX0gZWxzZSB7Ci0JCVB5X3NzaXplX3QgKmluZGljZXMgPSBsei0+aW5kaWNlczsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpIHsKKyAgICAgICAgLyogT24gdGhlIGZpcnN0IHBhc3MsIHJldHVybiBhbiBpbml0aWFsIHR1cGxlIGZpbGxlZCB3aXRoIHRoZQorICAgICAgICAgICBmaXJzdCBlbGVtZW50IGZyb20gZWFjaCBwb29sLiAqLworICAgICAgICByZXN1bHQgPSBQeVR1cGxlX05ldyhucG9vbHMpOworICAgICAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGVtcHR5OworICAgICAgICBsei0+cmVzdWx0ID0gcmVzdWx0OworICAgICAgICBmb3IgKGk9MDsgaSA8IG5wb29sczsgaSsrKSB7CisgICAgICAgICAgICBwb29sID0gUHlUdXBsZV9HRVRfSVRFTShwb29scywgaSk7CisgICAgICAgICAgICBpZiAoUHlUdXBsZV9HRVRfU0laRShwb29sKSA9PSAwKQorICAgICAgICAgICAgICAgIGdvdG8gZW1wdHk7CisgICAgICAgICAgICBlbGVtID0gUHlUdXBsZV9HRVRfSVRFTShwb29sLCAwKTsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihlbGVtKTsKKyAgICAgICAgICAgIFB5VHVwbGVfU0VUX0lURU0ocmVzdWx0LCBpLCBlbGVtKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIFB5X3NzaXplX3QgKmluZGljZXMgPSBsei0+aW5kaWNlczsKIAotCQkvKiBDb3B5IHRoZSBwcmV2aW91cyByZXN1bHQgdHVwbGUgb3IgcmUtdXNlIGl0IGlmIGF2YWlsYWJsZSAqLwotCQlpZiAoUHlfUkVGQ05UKHJlc3VsdCkgPiAxKSB7Ci0JCQlQeU9iamVjdCAqb2xkX3Jlc3VsdCA9IHJlc3VsdDsKLQkJCXJlc3VsdCA9IFB5VHVwbGVfTmV3KG5wb29scyk7Ci0JCQlpZiAocmVzdWx0ID09IE5VTEwpCi0JCQkJZ290byBlbXB0eTsKLQkJCWx6LT5yZXN1bHQgPSByZXN1bHQ7Ci0JCQlmb3IgKGk9MDsgaSA8IG5wb29sczsgaSsrKSB7Ci0JCQkJZWxlbSA9IFB5VHVwbGVfR0VUX0lURU0ob2xkX3Jlc3VsdCwgaSk7Ci0gICAgCQkJCVB5X0lOQ1JFRihlbGVtKTsKLSAgICAJCQkJUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIGksIGVsZW0pOwotCQkJfQotCQkJUHlfREVDUkVGKG9sZF9yZXN1bHQpOwotCQl9Ci0JCS8qIE5vdywgd2UndmUgZ290IHRoZSBvbmx5IGNvcHkgc28gd2UgY2FuIHVwZGF0ZSBpdCBpbi1wbGFjZSAqLwotCQlhc3NlcnQgKG5wb29scz09MCB8fCBQeV9SRUZDTlQocmVzdWx0KSA9PSAxKTsKKyAgICAgICAgLyogQ29weSB0aGUgcHJldmlvdXMgcmVzdWx0IHR1cGxlIG9yIHJlLXVzZSBpdCBpZiBhdmFpbGFibGUgKi8KKyAgICAgICAgaWYgKFB5X1JFRkNOVChyZXN1bHQpID4gMSkgeworICAgICAgICAgICAgUHlPYmplY3QgKm9sZF9yZXN1bHQgPSByZXN1bHQ7CisgICAgICAgICAgICByZXN1bHQgPSBQeVR1cGxlX05ldyhucG9vbHMpOworICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGdvdG8gZW1wdHk7CisgICAgICAgICAgICBsei0+cmVzdWx0ID0gcmVzdWx0OworICAgICAgICAgICAgZm9yIChpPTA7IGkgPCBucG9vbHM7IGkrKykgeworICAgICAgICAgICAgICAgIGVsZW0gPSBQeVR1cGxlX0dFVF9JVEVNKG9sZF9yZXN1bHQsIGkpOworICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihlbGVtKTsKKyAgICAgICAgICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKHJlc3VsdCwgaSwgZWxlbSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQeV9ERUNSRUYob2xkX3Jlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgLyogTm93LCB3ZSd2ZSBnb3QgdGhlIG9ubHkgY29weSBzbyB3ZSBjYW4gdXBkYXRlIGl0IGluLXBsYWNlICovCisgICAgICAgIGFzc2VydCAobnBvb2xzPT0wIHx8IFB5X1JFRkNOVChyZXN1bHQpID09IDEpOwogCi0gICAgICAgICAgICAgICAgLyogVXBkYXRlIHRoZSBwb29sIGluZGljZXMgcmlnaHQtdG8tbGVmdC4gIE9ubHkgYWR2YW5jZSB0byB0aGUKLSAgICAgICAgICAgICAgICAgICBuZXh0IHBvb2wgd2hlbiB0aGUgcHJldmlvdXMgb25lIHJvbGxzLW92ZXIgKi8KLQkJZm9yIChpPW5wb29scy0xIDsgaSA+PSAwIDsgaS0tKSB7Ci0JCQlwb29sID0gUHlUdXBsZV9HRVRfSVRFTShwb29scywgaSk7Ci0JCQlpbmRpY2VzW2ldKys7Ci0JCQlpZiAoaW5kaWNlc1tpXSA9PSBQeVR1cGxlX0dFVF9TSVpFKHBvb2wpKSB7Ci0JCQkJLyogUm9sbC1vdmVyIGFuZCBhZHZhbmNlIHRvIG5leHQgcG9vbCAqLwotCQkJCWluZGljZXNbaV0gPSAwOwotCQkJCWVsZW0gPSBQeVR1cGxlX0dFVF9JVEVNKHBvb2wsIDApOwotCQkJCVB5X0lOQ1JFRihlbGVtKTsKLQkJCQlvbGRlbGVtID0gUHlUdXBsZV9HRVRfSVRFTShyZXN1bHQsIGkpOwotCQkJCVB5VHVwbGVfU0VUX0lURU0ocmVzdWx0LCBpLCBlbGVtKTsKLQkJCQlQeV9ERUNSRUYob2xkZWxlbSk7Ci0JCQl9IGVsc2UgewotCQkJCS8qIE5vIHJvbGxvdmVyLiBKdXN0IGluY3JlbWVudCBhbmQgc3RvcCBoZXJlLiAqLwotCQkJCWVsZW0gPSBQeVR1cGxlX0dFVF9JVEVNKHBvb2wsIGluZGljZXNbaV0pOwotCQkJCVB5X0lOQ1JFRihlbGVtKTsKLQkJCQlvbGRlbGVtID0gUHlUdXBsZV9HRVRfSVRFTShyZXN1bHQsIGkpOwotCQkJCVB5VHVwbGVfU0VUX0lURU0ocmVzdWx0LCBpLCBlbGVtKTsKLQkJCQlQeV9ERUNSRUYob2xkZWxlbSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KKyAgICAgICAgLyogVXBkYXRlIHRoZSBwb29sIGluZGljZXMgcmlnaHQtdG8tbGVmdC4gIE9ubHkgYWR2YW5jZSB0byB0aGUKKyAgICAgICAgICAgbmV4dCBwb29sIHdoZW4gdGhlIHByZXZpb3VzIG9uZSByb2xscy1vdmVyICovCisgICAgICAgIGZvciAoaT1ucG9vbHMtMSA7IGkgPj0gMCA7IGktLSkgeworICAgICAgICAgICAgcG9vbCA9IFB5VHVwbGVfR0VUX0lURU0ocG9vbHMsIGkpOworICAgICAgICAgICAgaW5kaWNlc1tpXSsrOworICAgICAgICAgICAgaWYgKGluZGljZXNbaV0gPT0gUHlUdXBsZV9HRVRfU0laRShwb29sKSkgeworICAgICAgICAgICAgICAgIC8qIFJvbGwtb3ZlciBhbmQgYWR2YW5jZSB0byBuZXh0IHBvb2wgKi8KKyAgICAgICAgICAgICAgICBpbmRpY2VzW2ldID0gMDsKKyAgICAgICAgICAgICAgICBlbGVtID0gUHlUdXBsZV9HRVRfSVRFTShwb29sLCAwKTsKKyAgICAgICAgICAgICAgICBQeV9JTkNSRUYoZWxlbSk7CisgICAgICAgICAgICAgICAgb2xkZWxlbSA9IFB5VHVwbGVfR0VUX0lURU0ocmVzdWx0LCBpKTsKKyAgICAgICAgICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKHJlc3VsdCwgaSwgZWxlbSk7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKG9sZGVsZW0pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBObyByb2xsb3Zlci4gSnVzdCBpbmNyZW1lbnQgYW5kIHN0b3AgaGVyZS4gKi8KKyAgICAgICAgICAgICAgICBlbGVtID0gUHlUdXBsZV9HRVRfSVRFTShwb29sLCBpbmRpY2VzW2ldKTsKKyAgICAgICAgICAgICAgICBQeV9JTkNSRUYoZWxlbSk7CisgICAgICAgICAgICAgICAgb2xkZWxlbSA9IFB5VHVwbGVfR0VUX0lURU0ocmVzdWx0LCBpKTsKKyAgICAgICAgICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKHJlc3VsdCwgaSwgZWxlbSk7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKG9sZGVsZW0pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJLyogSWYgaSBpcyBuZWdhdGl2ZSwgdGhlbiB0aGUgaW5kaWNlcyBoYXZlIGFsbCByb2xsZWQtb3ZlcgotICAgICAgICAgICAgICAgICAgIGFuZCB3ZSdyZSBkb25lLiAqLwotCQlpZiAoaSA8IDApCi0JCQlnb3RvIGVtcHR5OwotCX0KKyAgICAgICAgLyogSWYgaSBpcyBuZWdhdGl2ZSwgdGhlbiB0aGUgaW5kaWNlcyBoYXZlIGFsbCByb2xsZWQtb3ZlcgorICAgICAgICAgICBhbmQgd2UncmUgZG9uZS4gKi8KKyAgICAgICAgaWYgKGkgPCAwKQorICAgICAgICAgICAgZ290byBlbXB0eTsKKyAgICB9CiAKLQlQeV9JTkNSRUYocmVzdWx0KTsKLQlyZXR1cm4gcmVzdWx0OworICAgIFB5X0lOQ1JFRihyZXN1bHQpOworICAgIHJldHVybiByZXN1bHQ7CiAKIGVtcHR5OgotCWx6LT5zdG9wcGVkID0gMTsKLQlyZXR1cm4gTlVMTDsKKyAgICBsei0+c3RvcHBlZCA9IDE7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIFB5RG9jX1NUUlZBUihwcm9kdWN0X2RvYywKQEAgLTE5NzgsNTkgKzE5NzgsNTkgQEAKIHByb2R1Y3QoKDAsMSksICgwLDEpLCAoMCwxKSkgLS0+ICgwLDAsMCkgKDAsMCwxKSAoMCwxLDApICgwLDEsMSkgKDEsMCwwKSAuLi4iKTsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBwcm9kdWN0X3R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JIml0ZXJ0b29scy5wcm9kdWN0IiwJCS8qIHRwX25hbWUgKi8KLQlzaXplb2YocHJvZHVjdG9iamVjdCksCS8qIHRwX2Jhc2ljc2l6ZSAqLwotCTAsCQkJCS8qIHRwX2l0ZW1zaXplICovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKXByb2R1Y3RfZGVhbGxvYywJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkvKiB0cF9jb21wYXJlICovCi0JMCwJCQkJLyogdHBfcmVwciAqLwotCTAsCQkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCS8qIHRwX2hhc2ggKi8KLQkwLAkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MgfAotCQlQeV9UUEZMQUdTX0JBU0VUWVBFLAkvKiB0cF9mbGFncyAqLwotCXByb2R1Y3RfZG9jLAkJCS8qIHRwX2RvYyAqLwotCSh0cmF2ZXJzZXByb2MpcHJvZHVjdF90cmF2ZXJzZSwJLyogdHBfdHJhdmVyc2UgKi8KLQkwLAkJCQkvKiB0cF9jbGVhciAqLwotCTAsCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQlQeU9iamVjdF9TZWxmSXRlciwJCS8qIHRwX2l0ZXIgKi8KLQkoaXRlcm5leHRmdW5jKXByb2R1Y3RfbmV4dCwJLyogdHBfaXRlcm5leHQgKi8KLQkwLAkJCQkvKiB0cF9tZXRob2RzICovCi0JMCwJCQkJLyogdHBfbWVtYmVycyAqLwotCTAsCQkJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkvKiB0cF9kaWN0ICovCi0JMCwJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJCQkJLyogdHBfZGljdG9mZnNldCAqLwotCTAsCQkJCS8qIHRwX2luaXQgKi8KLQkwLAkJCQkvKiB0cF9hbGxvYyAqLwotCXByb2R1Y3RfbmV3LAkJCS8qIHRwX25ldyAqLwotCVB5T2JqZWN0X0dDX0RlbCwJCS8qIHRwX2ZyZWUgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAiaXRlcnRvb2xzLnByb2R1Y3QiLCAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCisgICAgc2l6ZW9mKHByb2R1Y3RvYmplY3QpLCAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKXByb2R1Y3RfZGVhbGxvYywgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MgfAorICAgICAgICBQeV9UUEZMQUdTX0JBU0VUWVBFLCAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCisgICAgcHJvZHVjdF9kb2MsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgKHRyYXZlcnNlcHJvYylwcm9kdWN0X3RyYXZlcnNlLCAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICBQeU9iamVjdF9TZWxmSXRlciwgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgKGl0ZXJuZXh0ZnVuYylwcm9kdWN0X25leHQsICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIHByb2R1Y3RfbmV3LCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworICAgIFB5T2JqZWN0X0dDX0RlbCwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KIH07CiAKIAogLyogY29tYmluYXRpb25zIG9iamVjdCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JUHlPYmplY3QgKnBvb2w7CQkJLyogaW5wdXQgY29udmVydGVkIHRvIGEgdHVwbGUgKi8KLQlQeV9zc2l6ZV90ICppbmRpY2VzOyAgICAgICAgICAgIC8qIG9uZSBpbmRleCBwZXIgcmVzdWx0IGVsZW1lbnQgKi8KLQlQeU9iamVjdCAqcmVzdWx0OyAgICAgICAgICAgICAgIC8qIG1vc3QgcmVjZW50bHkgcmV0dXJuZWQgcmVzdWx0IHR1cGxlICovCi0JUHlfc3NpemVfdCByOwkJCS8qIHNpemUgb2YgcmVzdWx0IHR1cGxlICovCi0JaW50IHN0b3BwZWQ7CQkJLyogc2V0IHRvIDEgd2hlbiB0aGUgY29tYmluYXRpb25zIGl0ZXJhdG9yIGlzIGV4aGF1c3RlZCAqLworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBQeU9iamVjdCAqcG9vbDsgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dCBjb252ZXJ0ZWQgdG8gYSB0dXBsZSAqLworICAgIFB5X3NzaXplX3QgKmluZGljZXM7ICAgICAgICAgICAgLyogb25lIGluZGV4IHBlciByZXN1bHQgZWxlbWVudCAqLworICAgIFB5T2JqZWN0ICpyZXN1bHQ7ICAgICAgICAgICAgICAgLyogbW9zdCByZWNlbnRseSByZXR1cm5lZCByZXN1bHQgdHVwbGUgKi8KKyAgICBQeV9zc2l6ZV90IHI7ICAgICAgICAgICAgICAgICAgICAgICAvKiBzaXplIG9mIHJlc3VsdCB0dXBsZSAqLworICAgIGludCBzdG9wcGVkOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNldCB0byAxIHdoZW4gdGhlIGNvbWJpbmF0aW9ucyBpdGVyYXRvciBpcyBleGhhdXN0ZWQgKi8KIH0gY29tYmluYXRpb25zb2JqZWN0OwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IGNvbWJpbmF0aW9uc190eXBlOwpAQCAtMjAzOCwxNTkgKzIwMzgsMTU5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogY29tYmluYXRpb25zX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQljb21iaW5hdGlvbnNvYmplY3QgKmNvOwotCVB5X3NzaXplX3QgbjsKLQlQeV9zc2l6ZV90IHI7Ci0JUHlPYmplY3QgKnBvb2wgPSBOVUxMOwotCVB5T2JqZWN0ICppdGVyYWJsZSA9IE5VTEw7Ci0JUHlfc3NpemVfdCAqaW5kaWNlcyA9IE5VTEw7Ci0JUHlfc3NpemVfdCBpOwotCXN0YXRpYyBjaGFyICprd2FyZ3NbXSA9IHsiaXRlcmFibGUiLCAiciIsIE5VTEx9OwotIAotIAlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAiT246Y29tYmluYXRpb25zIiwga3dhcmdzLCAKLQkJCQkJICZpdGVyYWJsZSwgJnIpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBjb21iaW5hdGlvbnNvYmplY3QgKmNvOworICAgIFB5X3NzaXplX3QgbjsKKyAgICBQeV9zc2l6ZV90IHI7CisgICAgUHlPYmplY3QgKnBvb2wgPSBOVUxMOworICAgIFB5T2JqZWN0ICppdGVyYWJsZSA9IE5VTEw7CisgICAgUHlfc3NpemVfdCAqaW5kaWNlcyA9IE5VTEw7CisgICAgUHlfc3NpemVfdCBpOworICAgIHN0YXRpYyBjaGFyICprd2FyZ3NbXSA9IHsiaXRlcmFibGUiLCAiciIsIE5VTEx9OwogCi0JcG9vbCA9IFB5U2VxdWVuY2VfVHVwbGUoaXRlcmFibGUpOwotCWlmIChwb29sID09IE5VTEwpCi0JCWdvdG8gZXJyb3I7Ci0JbiA9IFB5VHVwbGVfR0VUX1NJWkUocG9vbCk7Ci0JaWYgKHIgPCAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiciBtdXN0IGJlIG5vbi1uZWdhdGl2ZSIpOwotCQlnb3RvIGVycm9yOwotCX0KKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAiT246Y29tYmluYXRpb25zIiwga3dhcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpdGVyYWJsZSwgJnIpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWluZGljZXMgPSBQeU1lbV9NYWxsb2MociAqIHNpemVvZihQeV9zc2l6ZV90KSk7Ci0JaWYgKGluZGljZXMgPT0gTlVMTCkgewotICAgIAkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJZ290byBlcnJvcjsKLQl9CisgICAgcG9vbCA9IFB5U2VxdWVuY2VfVHVwbGUoaXRlcmFibGUpOworICAgIGlmIChwb29sID09IE5VTEwpCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgbiA9IFB5VHVwbGVfR0VUX1NJWkUocG9vbCk7CisgICAgaWYgKHIgPCAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiciBtdXN0IGJlIG5vbi1uZWdhdGl2ZSIpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KIAotCWZvciAoaT0wIDsgaTxyIDsgaSsrKQotCQlpbmRpY2VzW2ldID0gaTsKKyAgICBpbmRpY2VzID0gUHlNZW1fTWFsbG9jKHIgKiBzaXplb2YoUHlfc3NpemVfdCkpOworICAgIGlmIChpbmRpY2VzID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CiAKLQkvKiBjcmVhdGUgY29tYmluYXRpb25zb2JqZWN0IHN0cnVjdHVyZSAqLwotCWNvID0gKGNvbWJpbmF0aW9uc29iamVjdCAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOwotCWlmIChjbyA9PSBOVUxMKQotCQlnb3RvIGVycm9yOworICAgIGZvciAoaT0wIDsgaTxyIDsgaSsrKQorICAgICAgICBpbmRpY2VzW2ldID0gaTsKIAotCWNvLT5wb29sID0gcG9vbDsKLQljby0+aW5kaWNlcyA9IGluZGljZXM7Ci0JY28tPnJlc3VsdCA9IE5VTEw7Ci0JY28tPnIgPSByOwotCWNvLT5zdG9wcGVkID0gciA+IG4gPyAxIDogMDsKKyAgICAvKiBjcmVhdGUgY29tYmluYXRpb25zb2JqZWN0IHN0cnVjdHVyZSAqLworICAgIGNvID0gKGNvbWJpbmF0aW9uc29iamVjdCAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOworICAgIGlmIChjbyA9PSBOVUxMKQorICAgICAgICBnb3RvIGVycm9yOwogCi0JcmV0dXJuIChQeU9iamVjdCAqKWNvOworICAgIGNvLT5wb29sID0gcG9vbDsKKyAgICBjby0+aW5kaWNlcyA9IGluZGljZXM7CisgICAgY28tPnJlc3VsdCA9IE5VTEw7CisgICAgY28tPnIgPSByOworICAgIGNvLT5zdG9wcGVkID0gciA+IG4gPyAxIDogMDsKKworICAgIHJldHVybiAoUHlPYmplY3QgKiljbzsKIAogZXJyb3I6Ci0JaWYgKGluZGljZXMgIT0gTlVMTCkKLQkJUHlNZW1fRnJlZShpbmRpY2VzKTsKLQlQeV9YREVDUkVGKHBvb2wpOwotCXJldHVybiBOVUxMOworICAgIGlmIChpbmRpY2VzICE9IE5VTEwpCisgICAgICAgIFB5TWVtX0ZyZWUoaW5kaWNlcyk7CisgICAgUHlfWERFQ1JFRihwb29sKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIHZvaWQKIGNvbWJpbmF0aW9uc19kZWFsbG9jKGNvbWJpbmF0aW9uc29iamVjdCAqY28pCiB7Ci0JUHlPYmplY3RfR0NfVW5UcmFjayhjbyk7Ci0JUHlfWERFQ1JFRihjby0+cG9vbCk7Ci0JUHlfWERFQ1JFRihjby0+cmVzdWx0KTsKLQlQeU1lbV9GcmVlKGNvLT5pbmRpY2VzKTsKLQlQeV9UWVBFKGNvKS0+dHBfZnJlZShjbyk7CisgICAgUHlPYmplY3RfR0NfVW5UcmFjayhjbyk7CisgICAgUHlfWERFQ1JFRihjby0+cG9vbCk7CisgICAgUHlfWERFQ1JFRihjby0+cmVzdWx0KTsKKyAgICBQeU1lbV9GcmVlKGNvLT5pbmRpY2VzKTsKKyAgICBQeV9UWVBFKGNvKS0+dHBfZnJlZShjbyk7CiB9CiAKIHN0YXRpYyBpbnQKIGNvbWJpbmF0aW9uc190cmF2ZXJzZShjb21iaW5hdGlvbnNvYmplY3QgKmNvLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlQeV9WSVNJVChjby0+cG9vbCk7Ci0JUHlfVklTSVQoY28tPnJlc3VsdCk7Ci0JcmV0dXJuIDA7CisgICAgUHlfVklTSVQoY28tPnBvb2wpOworICAgIFB5X1ZJU0lUKGNvLT5yZXN1bHQpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY29tYmluYXRpb25zX25leHQoY29tYmluYXRpb25zb2JqZWN0ICpjbykKIHsKLQlQeU9iamVjdCAqZWxlbTsKLQlQeU9iamVjdCAqb2xkZWxlbTsKLQlQeU9iamVjdCAqcG9vbCA9IGNvLT5wb29sOwotCVB5X3NzaXplX3QgKmluZGljZXMgPSBjby0+aW5kaWNlczsKLQlQeU9iamVjdCAqcmVzdWx0ID0gY28tPnJlc3VsdDsKLQlQeV9zc2l6ZV90IG4gPSBQeVR1cGxlX0dFVF9TSVpFKHBvb2wpOwotCVB5X3NzaXplX3QgciA9IGNvLT5yOwotCVB5X3NzaXplX3QgaSwgaiwgaW5kZXg7CisgICAgUHlPYmplY3QgKmVsZW07CisgICAgUHlPYmplY3QgKm9sZGVsZW07CisgICAgUHlPYmplY3QgKnBvb2wgPSBjby0+cG9vbDsKKyAgICBQeV9zc2l6ZV90ICppbmRpY2VzID0gY28tPmluZGljZXM7CisgICAgUHlPYmplY3QgKnJlc3VsdCA9IGNvLT5yZXN1bHQ7CisgICAgUHlfc3NpemVfdCBuID0gUHlUdXBsZV9HRVRfU0laRShwb29sKTsKKyAgICBQeV9zc2l6ZV90IHIgPSBjby0+cjsKKyAgICBQeV9zc2l6ZV90IGksIGosIGluZGV4OwogCi0JaWYgKGNvLT5zdG9wcGVkKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoY28tPnN0b3BwZWQpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKHJlc3VsdCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgLyogT24gdGhlIGZpcnN0IHBhc3MsIGluaXRpYWxpemUgcmVzdWx0IHR1cGxlIHVzaW5nIHRoZSBpbmRpY2VzICovCi0JCXJlc3VsdCA9IFB5VHVwbGVfTmV3KHIpOwotCQlpZiAocmVzdWx0ID09IE5VTEwpCi0gICAgICAgICAgICAJCWdvdG8gZW1wdHk7Ci0JCWNvLT5yZXN1bHQgPSByZXN1bHQ7Ci0JCWZvciAoaT0wOyBpPHIgOyBpKyspIHsKLQkJCWluZGV4ID0gaW5kaWNlc1tpXTsKLSAgICAJCQllbGVtID0gUHlUdXBsZV9HRVRfSVRFTShwb29sLCBpbmRleCk7Ci0gICAgCQkJUHlfSU5DUkVGKGVsZW0pOwotICAgIAkJCVB5VHVwbGVfU0VUX0lURU0ocmVzdWx0LCBpLCBlbGVtKTsKLQkJfQotCX0gZWxzZSB7Ci0JCS8qIENvcHkgdGhlIHByZXZpb3VzIHJlc3VsdCB0dXBsZSBvciByZS11c2UgaXQgaWYgYXZhaWxhYmxlICovCi0JCWlmIChQeV9SRUZDTlQocmVzdWx0KSA+IDEpIHsKLQkJCVB5T2JqZWN0ICpvbGRfcmVzdWx0ID0gcmVzdWx0OwotCQkJcmVzdWx0ID0gUHlUdXBsZV9OZXcocik7Ci0JCQlpZiAocmVzdWx0ID09IE5VTEwpCi0JCQkJZ290byBlbXB0eTsKLQkJCWNvLT5yZXN1bHQgPSByZXN1bHQ7Ci0JCQlmb3IgKGk9MDsgaTxyIDsgaSsrKSB7Ci0JCQkJZWxlbSA9IFB5VHVwbGVfR0VUX0lURU0ob2xkX3Jlc3VsdCwgaSk7Ci0gICAgCQkJCVB5X0lOQ1JFRihlbGVtKTsKLSAgICAJCQkJUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIGksIGVsZW0pOwotCQkJfQotCQkJUHlfREVDUkVGKG9sZF9yZXN1bHQpOwotCQl9Ci0JCS8qIE5vdywgd2UndmUgZ290IHRoZSBvbmx5IGNvcHkgc28gd2UgY2FuIHVwZGF0ZSBpdCBpbi1wbGFjZSAKLQkJICogQ1B5dGhvbidzIGVtcHR5IHR1cGxlIGlzIGEgc2luZ2xldG9uIGFuZCBjYWNoZWQgaW4gCi0JCSAqIFB5VHVwbGUncyBmcmVlbGlzdC4gCi0JCSAqLwotCQlhc3NlcnQociA9PSAwIHx8IFB5X1JFRkNOVChyZXN1bHQpID09IDEpOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCkgeworICAgICAgICAvKiBPbiB0aGUgZmlyc3QgcGFzcywgaW5pdGlhbGl6ZSByZXN1bHQgdHVwbGUgdXNpbmcgdGhlIGluZGljZXMgKi8KKyAgICAgICAgcmVzdWx0ID0gUHlUdXBsZV9OZXcocik7CisgICAgICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gZW1wdHk7CisgICAgICAgIGNvLT5yZXN1bHQgPSByZXN1bHQ7CisgICAgICAgIGZvciAoaT0wOyBpPHIgOyBpKyspIHsKKyAgICAgICAgICAgIGluZGV4ID0gaW5kaWNlc1tpXTsKKyAgICAgICAgICAgIGVsZW0gPSBQeVR1cGxlX0dFVF9JVEVNKHBvb2wsIGluZGV4KTsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihlbGVtKTsKKyAgICAgICAgICAgIFB5VHVwbGVfU0VUX0lURU0ocmVzdWx0LCBpLCBlbGVtKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8qIENvcHkgdGhlIHByZXZpb3VzIHJlc3VsdCB0dXBsZSBvciByZS11c2UgaXQgaWYgYXZhaWxhYmxlICovCisgICAgICAgIGlmIChQeV9SRUZDTlQocmVzdWx0KSA+IDEpIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpvbGRfcmVzdWx0ID0gcmVzdWx0OworICAgICAgICAgICAgcmVzdWx0ID0gUHlUdXBsZV9OZXcocik7CisgICAgICAgICAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgICAgICAgICAgZ290byBlbXB0eTsKKyAgICAgICAgICAgIGNvLT5yZXN1bHQgPSByZXN1bHQ7CisgICAgICAgICAgICBmb3IgKGk9MDsgaTxyIDsgaSsrKSB7CisgICAgICAgICAgICAgICAgZWxlbSA9IFB5VHVwbGVfR0VUX0lURU0ob2xkX3Jlc3VsdCwgaSk7CisgICAgICAgICAgICAgICAgUHlfSU5DUkVGKGVsZW0pOworICAgICAgICAgICAgICAgIFB5VHVwbGVfU0VUX0lURU0ocmVzdWx0LCBpLCBlbGVtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5X0RFQ1JFRihvbGRfcmVzdWx0KTsKKyAgICAgICAgfQorICAgICAgICAvKiBOb3csIHdlJ3ZlIGdvdCB0aGUgb25seSBjb3B5IHNvIHdlIGNhbiB1cGRhdGUgaXQgaW4tcGxhY2UKKyAgICAgICAgICogQ1B5dGhvbidzIGVtcHR5IHR1cGxlIGlzIGEgc2luZ2xldG9uIGFuZCBjYWNoZWQgaW4KKyAgICAgICAgICogUHlUdXBsZSdzIGZyZWVsaXN0LgorICAgICAgICAgKi8KKyAgICAgICAgYXNzZXJ0KHIgPT0gMCB8fCBQeV9SRUZDTlQocmVzdWx0KSA9PSAxKTsKIAotICAgICAgICAgICAgICAgIC8qIFNjYW4gaW5kaWNlcyByaWdodC10by1sZWZ0IHVudGlsIGZpbmRpbmcgb25lIHRoYXQgaXMgbm90Ci0gICAgICAgICAgICAgICAgICAgYXQgaXRzIG1heGltdW0gKGkgKyBuIC0gcikuICovCi0JCWZvciAoaT1yLTEgOyBpID49IDAgJiYgaW5kaWNlc1tpXSA9PSBpK24tciA7IGktLSkKLQkJCTsKKyAgICAgICAgLyogU2NhbiBpbmRpY2VzIHJpZ2h0LXRvLWxlZnQgdW50aWwgZmluZGluZyBvbmUgdGhhdCBpcyBub3QKKyAgICAgICAgICAgYXQgaXRzIG1heGltdW0gKGkgKyBuIC0gcikuICovCisgICAgICAgIGZvciAoaT1yLTEgOyBpID49IDAgJiYgaW5kaWNlc1tpXSA9PSBpK24tciA7IGktLSkKKyAgICAgICAgICAgIDsKIAotCQkvKiBJZiBpIGlzIG5lZ2F0aXZlLCB0aGVuIHRoZSBpbmRpY2VzIGFyZSBhbGwgYXQKLSAgICAgICAgICAgICAgICAgICB0aGVpciBtYXhpbXVtIHZhbHVlIGFuZCB3ZSdyZSBkb25lLiAqLwotCQlpZiAoaSA8IDApCi0JCQlnb3RvIGVtcHR5OworICAgICAgICAvKiBJZiBpIGlzIG5lZ2F0aXZlLCB0aGVuIHRoZSBpbmRpY2VzIGFyZSBhbGwgYXQKKyAgICAgICAgICAgdGhlaXIgbWF4aW11bSB2YWx1ZSBhbmQgd2UncmUgZG9uZS4gKi8KKyAgICAgICAgaWYgKGkgPCAwKQorICAgICAgICAgICAgZ290byBlbXB0eTsKIAotCQkvKiBJbmNyZW1lbnQgdGhlIGN1cnJlbnQgaW5kZXggd2hpY2ggd2Uga25vdyBpcyBub3QgYXQgaXRzCi0gICAgICAgICAgICAgICAgICAgbWF4aW11bS4gIFRoZW4gbW92ZSBiYWNrIHRvIHRoZSByaWdodCBzZXR0aW5nIGVhY2ggaW5kZXgKLSAgICAgICAgICAgICAgICAgICB0byBpdHMgbG93ZXN0IHBvc3NpYmxlIHZhbHVlIChvbmUgaGlnaGVyIHRoYW4gdGhlIGluZGV4Ci0gICAgICAgICAgICAgICAgICAgdG8gaXRzIGxlZnQgLS0gdGhpcyBtYWludGFpbnMgdGhlIHNvcnQgb3JkZXIgaW52YXJpYW50KS4gKi8KLQkJaW5kaWNlc1tpXSsrOwotCQlmb3IgKGo9aSsxIDsgajxyIDsgaisrKQotCQkJaW5kaWNlc1tqXSA9IGluZGljZXNbai0xXSArIDE7CisgICAgICAgIC8qIEluY3JlbWVudCB0aGUgY3VycmVudCBpbmRleCB3aGljaCB3ZSBrbm93IGlzIG5vdCBhdCBpdHMKKyAgICAgICAgICAgbWF4aW11bS4gIFRoZW4gbW92ZSBiYWNrIHRvIHRoZSByaWdodCBzZXR0aW5nIGVhY2ggaW5kZXgKKyAgICAgICAgICAgdG8gaXRzIGxvd2VzdCBwb3NzaWJsZSB2YWx1ZSAob25lIGhpZ2hlciB0aGFuIHRoZSBpbmRleAorICAgICAgICAgICB0byBpdHMgbGVmdCAtLSB0aGlzIG1haW50YWlucyB0aGUgc29ydCBvcmRlciBpbnZhcmlhbnQpLiAqLworICAgICAgICBpbmRpY2VzW2ldKys7CisgICAgICAgIGZvciAoaj1pKzEgOyBqPHIgOyBqKyspCisgICAgICAgICAgICBpbmRpY2VzW2pdID0gaW5kaWNlc1tqLTFdICsgMTsKIAotCQkvKiBVcGRhdGUgdGhlIHJlc3VsdCB0dXBsZSBmb3IgdGhlIG5ldyBpbmRpY2VzCi0JCSAgIHN0YXJ0aW5nIHdpdGggaSwgdGhlIGxlZnRtb3N0IGluZGV4IHRoYXQgY2hhbmdlZCAqLwotCQlmb3IgKCA7IGk8ciA7IGkrKykgewotCQkJaW5kZXggPSBpbmRpY2VzW2ldOwotCQkJZWxlbSA9IFB5VHVwbGVfR0VUX0lURU0ocG9vbCwgaW5kZXgpOwotCQkJUHlfSU5DUkVGKGVsZW0pOwotCQkJb2xkZWxlbSA9IFB5VHVwbGVfR0VUX0lURU0ocmVzdWx0LCBpKTsKLQkJCVB5VHVwbGVfU0VUX0lURU0ocmVzdWx0LCBpLCBlbGVtKTsKLQkJCVB5X0RFQ1JFRihvbGRlbGVtKTsKLQkJfQotCX0KKyAgICAgICAgLyogVXBkYXRlIHRoZSByZXN1bHQgdHVwbGUgZm9yIHRoZSBuZXcgaW5kaWNlcworICAgICAgICAgICBzdGFydGluZyB3aXRoIGksIHRoZSBsZWZ0bW9zdCBpbmRleCB0aGF0IGNoYW5nZWQgKi8KKyAgICAgICAgZm9yICggOyBpPHIgOyBpKyspIHsKKyAgICAgICAgICAgIGluZGV4ID0gaW5kaWNlc1tpXTsKKyAgICAgICAgICAgIGVsZW0gPSBQeVR1cGxlX0dFVF9JVEVNKHBvb2wsIGluZGV4KTsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihlbGVtKTsKKyAgICAgICAgICAgIG9sZGVsZW0gPSBQeVR1cGxlX0dFVF9JVEVNKHJlc3VsdCwgaSk7CisgICAgICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKHJlc3VsdCwgaSwgZWxlbSk7CisgICAgICAgICAgICBQeV9ERUNSRUYob2xkZWxlbSk7CisgICAgICAgIH0KKyAgICB9CiAKLQlQeV9JTkNSRUYocmVzdWx0KTsKLQlyZXR1cm4gcmVzdWx0OworICAgIFB5X0lOQ1JFRihyZXN1bHQpOworICAgIHJldHVybiByZXN1bHQ7CiAKIGVtcHR5OgotCWNvLT5zdG9wcGVkID0gMTsKLQlyZXR1cm4gTlVMTDsKKyAgICBjby0+c3RvcHBlZCA9IDE7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIFB5RG9jX1NUUlZBUihjb21iaW5hdGlvbnNfZG9jLApAQCAtMjIwMCw1MiArMjIwMCw1MiBAQAogY29tYmluYXRpb25zKHJhbmdlKDQpLCAzKSAtLT4gKDAsMSwyKSwgKDAsMSwzKSwgKDAsMiwzKSwgKDEsMiwzKSIpOwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IGNvbWJpbmF0aW9uc190eXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotCSJpdGVydG9vbHMuY29tYmluYXRpb25zIiwJCS8qIHRwX25hbWUgKi8KLQlzaXplb2YoY29tYmluYXRpb25zb2JqZWN0KSwJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpY29tYmluYXRpb25zX2RlYWxsb2MsCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJLyogdHBfY29tcGFyZSAqLwotCTAsCQkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJLyogdHBfY2FsbCAqLwotCTAsCQkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDIHwKLQkJUHlfVFBGTEFHU19CQVNFVFlQRSwJLyogdHBfZmxhZ3MgKi8KLQljb21iaW5hdGlvbnNfZG9jLAkJCS8qIHRwX2RvYyAqLwotCSh0cmF2ZXJzZXByb2MpY29tYmluYXRpb25zX3RyYXZlcnNlLAkvKiB0cF90cmF2ZXJzZSAqLwotCTAsCQkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCVB5T2JqZWN0X1NlbGZJdGVyLAkJLyogdHBfaXRlciAqLwotCShpdGVybmV4dGZ1bmMpY29tYmluYXRpb25zX25leHQsCS8qIHRwX2l0ZXJuZXh0ICovCi0JMCwJCQkJLyogdHBfbWV0aG9kcyAqLwotCTAsCQkJCS8qIHRwX21lbWJlcnMgKi8KLQkwLAkJCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQkwLAkJCQkvKiB0cF9pbml0ICovCi0JMCwJCQkJLyogdHBfYWxsb2MgKi8KLQljb21iaW5hdGlvbnNfbmV3LAkJCS8qIHRwX25ldyAqLwotCVB5T2JqZWN0X0dDX0RlbCwJCS8qIHRwX2ZyZWUgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAiaXRlcnRvb2xzLmNvbWJpbmF0aW9ucyIsICAgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICBzaXplb2YoY29tYmluYXRpb25zb2JqZWN0KSwgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3Rvciljb21iaW5hdGlvbnNfZGVhbGxvYywgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MgfAorICAgICAgICBQeV9UUEZMQUdTX0JBU0VUWVBFLCAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCisgICAgY29tYmluYXRpb25zX2RvYywgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAodHJhdmVyc2Vwcm9jKWNvbWJpbmF0aW9uc190cmF2ZXJzZSwgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgUHlPYmplY3RfU2VsZkl0ZXIsICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIChpdGVybmV4dGZ1bmMpY29tYmluYXRpb25zX25leHQsICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIGNvbWJpbmF0aW9uc19uZXcsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgUHlPYmplY3RfR0NfRGVsLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKIAogCiAvKiBwZXJtdXRhdGlvbnMgb2JqZWN0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAKKwogZGVmIHBlcm11dGF0aW9ucyhpdGVyYWJsZSwgcj1Ob25lKToKICAgICAncGVybXV0YXRpb25zKHJhbmdlKDMpLCAyKSAtLT4gKDAsMSkgKDAsMikgKDEsMCkgKDEsMikgKDIsMCkgKDIsMSknCiAgICAgcG9vbCA9IHR1cGxlKGl0ZXJhYmxlKQpAQCAtMjI1NSwyOCArMjI1NSwyOCBAQAogICAgIGN5Y2xlcyA9IHJhbmdlKG4tcisxLCBuKzEpWzo6LTFdCiAgICAgeWllbGQgdHVwbGUocG9vbFtpXSBmb3IgaSBpbiBpbmRpY2VzWzpyXSkKICAgICB3aGlsZSBuOgotICAgICAgICBmb3IgaSBpbiByZXZlcnNlZChyYW5nZShyKSk6Ci0gICAgICAgICAgICBjeWNsZXNbaV0gLT0gMQotICAgICAgICAgICAgaWYgY3ljbGVzW2ldID09IDA6Ci0gICAgICAgICAgICAgICAgaW5kaWNlc1tpOl0gPSBpbmRpY2VzW2krMTpdICsgaW5kaWNlc1tpOmkrMV0KLSAgICAgICAgICAgICAgICBjeWNsZXNbaV0gPSBuIC0gaQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBqID0gY3ljbGVzW2ldCi0gICAgICAgICAgICAgICAgaW5kaWNlc1tpXSwgaW5kaWNlc1stal0gPSBpbmRpY2VzWy1qXSwgaW5kaWNlc1tpXQotICAgICAgICAgICAgICAgIHlpZWxkIHR1cGxlKHBvb2xbaV0gZm9yIGkgaW4gaW5kaWNlc1s6cl0pCi0gICAgICAgICAgICAgICAgYnJlYWsKKyAgICBmb3IgaSBpbiByZXZlcnNlZChyYW5nZShyKSk6CisgICAgICAgIGN5Y2xlc1tpXSAtPSAxCisgICAgICAgIGlmIGN5Y2xlc1tpXSA9PSAwOgorICAgICAgICBpbmRpY2VzW2k6XSA9IGluZGljZXNbaSsxOl0gKyBpbmRpY2VzW2k6aSsxXQorICAgICAgICBjeWNsZXNbaV0gPSBuIC0gaQogICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGogPSBjeWNsZXNbaV0KKyAgICAgICAgaW5kaWNlc1tpXSwgaW5kaWNlc1stal0gPSBpbmRpY2VzWy1qXSwgaW5kaWNlc1tpXQorICAgICAgICB5aWVsZCB0dXBsZShwb29sW2ldIGZvciBpIGluIGluZGljZXNbOnJdKQorICAgICAgICBicmVhaworICAgIGVsc2U6CisgICAgICAgIHJldHVybgogKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewotCVB5T2JqZWN0X0hFQUQKLQlQeU9iamVjdCAqcG9vbDsJCQkvKiBpbnB1dCBjb252ZXJ0ZWQgdG8gYSB0dXBsZSAqLwotCVB5X3NzaXplX3QgKmluZGljZXM7ICAgICAgICAgICAgLyogb25lIGluZGV4IHBlciBlbGVtZW50IGluIHRoZSBwb29sICovCi0JUHlfc3NpemVfdCAqY3ljbGVzOwkJLyogb25lIHJvbGxvdmVyIGNvdW50ZXIgcGVyIGVsZW1lbnQgaW4gdGhlIHJlc3VsdCAqLwotCVB5T2JqZWN0ICpyZXN1bHQ7ICAgICAgICAgICAgICAgLyogbW9zdCByZWNlbnRseSByZXR1cm5lZCByZXN1bHQgdHVwbGUgKi8KLQlQeV9zc2l6ZV90IHI7CQkJLyogc2l6ZSBvZiByZXN1bHQgdHVwbGUgKi8KLQlpbnQgc3RvcHBlZDsJCQkvKiBzZXQgdG8gMSB3aGVuIHRoZSBwZXJtdXRhdGlvbnMgaXRlcmF0b3IgaXMgZXhoYXVzdGVkICovCisgICAgUHlPYmplY3RfSEVBRAorICAgIFB5T2JqZWN0ICpwb29sOyAgICAgICAgICAgICAgICAgICAgIC8qIGlucHV0IGNvbnZlcnRlZCB0byBhIHR1cGxlICovCisgICAgUHlfc3NpemVfdCAqaW5kaWNlczsgICAgICAgICAgICAvKiBvbmUgaW5kZXggcGVyIGVsZW1lbnQgaW4gdGhlIHBvb2wgKi8KKyAgICBQeV9zc2l6ZV90ICpjeWNsZXM7ICAgICAgICAgICAgICAgICAvKiBvbmUgcm9sbG92ZXIgY291bnRlciBwZXIgZWxlbWVudCBpbiB0aGUgcmVzdWx0ICovCisgICAgUHlPYmplY3QgKnJlc3VsdDsgICAgICAgICAgICAgICAvKiBtb3N0IHJlY2VudGx5IHJldHVybmVkIHJlc3VsdCB0dXBsZSAqLworICAgIFB5X3NzaXplX3QgcjsgICAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgb2YgcmVzdWx0IHR1cGxlICovCisgICAgaW50IHN0b3BwZWQ7ICAgICAgICAgICAgICAgICAgICAgICAgLyogc2V0IHRvIDEgd2hlbiB0aGUgcGVybXV0YXRpb25zIGl0ZXJhdG9yIGlzIGV4aGF1c3RlZCAqLwogfSBwZXJtdXRhdGlvbnNvYmplY3Q7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgcGVybXV0YXRpb25zX3R5cGU7CkBAIC0yMjg0LDE4MCArMjI4NCwxODAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBwZXJtdXRhdGlvbnNfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCXBlcm11dGF0aW9uc29iamVjdCAqcG87Ci0JUHlfc3NpemVfdCBuOwotCVB5X3NzaXplX3QgcjsKLQlQeU9iamVjdCAqcm9iaiA9IFB5X05vbmU7Ci0JUHlPYmplY3QgKnBvb2wgPSBOVUxMOwotCVB5T2JqZWN0ICppdGVyYWJsZSA9IE5VTEw7Ci0JUHlfc3NpemVfdCAqaW5kaWNlcyA9IE5VTEw7Ci0JUHlfc3NpemVfdCAqY3ljbGVzID0gTlVMTDsKLQlQeV9zc2l6ZV90IGk7Ci0Jc3RhdGljIGNoYXIgKmt3YXJnc1tdID0geyJpdGVyYWJsZSIsICJyIiwgTlVMTH07Ci0gCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgIk98TzpwZXJtdXRhdGlvbnMiLCBrd2FyZ3MsIAotCQkJCQkgJml0ZXJhYmxlLCAmcm9iaikpCi0JCXJldHVybiBOVUxMOworICAgIHBlcm11dGF0aW9uc29iamVjdCAqcG87CisgICAgUHlfc3NpemVfdCBuOworICAgIFB5X3NzaXplX3QgcjsKKyAgICBQeU9iamVjdCAqcm9iaiA9IFB5X05vbmU7CisgICAgUHlPYmplY3QgKnBvb2wgPSBOVUxMOworICAgIFB5T2JqZWN0ICppdGVyYWJsZSA9IE5VTEw7CisgICAgUHlfc3NpemVfdCAqaW5kaWNlcyA9IE5VTEw7CisgICAgUHlfc3NpemVfdCAqY3ljbGVzID0gTlVMTDsKKyAgICBQeV9zc2l6ZV90IGk7CisgICAgc3RhdGljIGNoYXIgKmt3YXJnc1tdID0geyJpdGVyYWJsZSIsICJyIiwgTlVMTH07CiAKLQlwb29sID0gUHlTZXF1ZW5jZV9UdXBsZShpdGVyYWJsZSk7Ci0JaWYgKHBvb2wgPT0gTlVMTCkKLQkJZ290byBlcnJvcjsKLQluID0gUHlUdXBsZV9HRVRfU0laRShwb29sKTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAiT3xPOnBlcm11dGF0aW9ucyIsIGt3YXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRlcmFibGUsICZyb2JqKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlyID0gbjsKLQlpZiAocm9iaiAhPSBQeV9Ob25lKSB7Ci0JCXIgPSBQeUludF9Bc1NzaXplX3Qocm9iaik7Ci0JCWlmIChyID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCQlnb3RvIGVycm9yOwotCX0KLQlpZiAociA8IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJyIG11c3QgYmUgbm9uLW5lZ2F0aXZlIik7Ci0JCWdvdG8gZXJyb3I7Ci0JfQorICAgIHBvb2wgPSBQeVNlcXVlbmNlX1R1cGxlKGl0ZXJhYmxlKTsKKyAgICBpZiAocG9vbCA9PSBOVUxMKQorICAgICAgICBnb3RvIGVycm9yOworICAgIG4gPSBQeVR1cGxlX0dFVF9TSVpFKHBvb2wpOwogCi0JaW5kaWNlcyA9IFB5TWVtX01hbGxvYyhuICogc2l6ZW9mKFB5X3NzaXplX3QpKTsKLQljeWNsZXMgPSBQeU1lbV9NYWxsb2MociAqIHNpemVvZihQeV9zc2l6ZV90KSk7Ci0JaWYgKGluZGljZXMgPT0gTlVMTCB8fCBjeWNsZXMgPT0gTlVMTCkgewotICAgIAkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJZ290byBlcnJvcjsKLQl9CisgICAgciA9IG47CisgICAgaWYgKHJvYmogIT0gUHlfTm9uZSkgeworICAgICAgICByID0gUHlJbnRfQXNTc2l6ZV90KHJvYmopOworICAgICAgICBpZiAociA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgaWYgKHIgPCAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiciBtdXN0IGJlIG5vbi1uZWdhdGl2ZSIpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KIAotCWZvciAoaT0wIDsgaTxuIDsgaSsrKQotCQlpbmRpY2VzW2ldID0gaTsKLQlmb3IgKGk9MCA7IGk8ciA7IGkrKykKLQkJY3ljbGVzW2ldID0gbiAtIGk7CisgICAgaW5kaWNlcyA9IFB5TWVtX01hbGxvYyhuICogc2l6ZW9mKFB5X3NzaXplX3QpKTsKKyAgICBjeWNsZXMgPSBQeU1lbV9NYWxsb2MociAqIHNpemVvZihQeV9zc2l6ZV90KSk7CisgICAgaWYgKGluZGljZXMgPT0gTlVMTCB8fCBjeWNsZXMgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KIAotCS8qIGNyZWF0ZSBwZXJtdXRhdGlvbnNvYmplY3Qgc3RydWN0dXJlICovCi0JcG8gPSAocGVybXV0YXRpb25zb2JqZWN0ICopdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7Ci0JaWYgKHBvID09IE5VTEwpCi0JCWdvdG8gZXJyb3I7CisgICAgZm9yIChpPTAgOyBpPG4gOyBpKyspCisgICAgICAgIGluZGljZXNbaV0gPSBpOworICAgIGZvciAoaT0wIDsgaTxyIDsgaSsrKQorICAgICAgICBjeWNsZXNbaV0gPSBuIC0gaTsKIAotCXBvLT5wb29sID0gcG9vbDsKLQlwby0+aW5kaWNlcyA9IGluZGljZXM7Ci0JcG8tPmN5Y2xlcyA9IGN5Y2xlczsKLQlwby0+cmVzdWx0ID0gTlVMTDsKLQlwby0+ciA9IHI7Ci0JcG8tPnN0b3BwZWQgPSByID4gbiA/IDEgOiAwOworICAgIC8qIGNyZWF0ZSBwZXJtdXRhdGlvbnNvYmplY3Qgc3RydWN0dXJlICovCisgICAgcG8gPSAocGVybXV0YXRpb25zb2JqZWN0ICopdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7CisgICAgaWYgKHBvID09IE5VTEwpCisgICAgICAgIGdvdG8gZXJyb3I7CiAKLQlyZXR1cm4gKFB5T2JqZWN0ICopcG87CisgICAgcG8tPnBvb2wgPSBwb29sOworICAgIHBvLT5pbmRpY2VzID0gaW5kaWNlczsKKyAgICBwby0+Y3ljbGVzID0gY3ljbGVzOworICAgIHBvLT5yZXN1bHQgPSBOVUxMOworICAgIHBvLT5yID0gcjsKKyAgICBwby0+c3RvcHBlZCA9IHIgPiBuID8gMSA6IDA7CisKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopcG87CiAKIGVycm9yOgotCWlmIChpbmRpY2VzICE9IE5VTEwpCi0JCVB5TWVtX0ZyZWUoaW5kaWNlcyk7Ci0JaWYgKGN5Y2xlcyAhPSBOVUxMKQotCQlQeU1lbV9GcmVlKGN5Y2xlcyk7Ci0JUHlfWERFQ1JFRihwb29sKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoaW5kaWNlcyAhPSBOVUxMKQorICAgICAgICBQeU1lbV9GcmVlKGluZGljZXMpOworICAgIGlmIChjeWNsZXMgIT0gTlVMTCkKKyAgICAgICAgUHlNZW1fRnJlZShjeWNsZXMpOworICAgIFB5X1hERUNSRUYocG9vbCk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyB2b2lkCiBwZXJtdXRhdGlvbnNfZGVhbGxvYyhwZXJtdXRhdGlvbnNvYmplY3QgKnBvKQogewotCVB5T2JqZWN0X0dDX1VuVHJhY2socG8pOwotCVB5X1hERUNSRUYocG8tPnBvb2wpOwotCVB5X1hERUNSRUYocG8tPnJlc3VsdCk7Ci0JUHlNZW1fRnJlZShwby0+aW5kaWNlcyk7Ci0JUHlNZW1fRnJlZShwby0+Y3ljbGVzKTsKLQlQeV9UWVBFKHBvKS0+dHBfZnJlZShwbyk7CisgICAgUHlPYmplY3RfR0NfVW5UcmFjayhwbyk7CisgICAgUHlfWERFQ1JFRihwby0+cG9vbCk7CisgICAgUHlfWERFQ1JFRihwby0+cmVzdWx0KTsKKyAgICBQeU1lbV9GcmVlKHBvLT5pbmRpY2VzKTsKKyAgICBQeU1lbV9GcmVlKHBvLT5jeWNsZXMpOworICAgIFB5X1RZUEUocG8pLT50cF9mcmVlKHBvKTsKIH0KIAogc3RhdGljIGludAogcGVybXV0YXRpb25zX3RyYXZlcnNlKHBlcm11dGF0aW9uc29iamVjdCAqcG8sIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotCVB5X1ZJU0lUKHBvLT5wb29sKTsKLQlQeV9WSVNJVChwby0+cmVzdWx0KTsKLQlyZXR1cm4gMDsKKyAgICBQeV9WSVNJVChwby0+cG9vbCk7CisgICAgUHlfVklTSVQocG8tPnJlc3VsdCk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBwZXJtdXRhdGlvbnNfbmV4dChwZXJtdXRhdGlvbnNvYmplY3QgKnBvKQogewotCVB5T2JqZWN0ICplbGVtOwotCVB5T2JqZWN0ICpvbGRlbGVtOwotCVB5T2JqZWN0ICpwb29sID0gcG8tPnBvb2w7Ci0JUHlfc3NpemVfdCAqaW5kaWNlcyA9IHBvLT5pbmRpY2VzOwotCVB5X3NzaXplX3QgKmN5Y2xlcyA9IHBvLT5jeWNsZXM7Ci0JUHlPYmplY3QgKnJlc3VsdCA9IHBvLT5yZXN1bHQ7Ci0JUHlfc3NpemVfdCBuID0gUHlUdXBsZV9HRVRfU0laRShwb29sKTsKLQlQeV9zc2l6ZV90IHIgPSBwby0+cjsKLQlQeV9zc2l6ZV90IGksIGosIGssIGluZGV4OworICAgIFB5T2JqZWN0ICplbGVtOworICAgIFB5T2JqZWN0ICpvbGRlbGVtOworICAgIFB5T2JqZWN0ICpwb29sID0gcG8tPnBvb2w7CisgICAgUHlfc3NpemVfdCAqaW5kaWNlcyA9IHBvLT5pbmRpY2VzOworICAgIFB5X3NzaXplX3QgKmN5Y2xlcyA9IHBvLT5jeWNsZXM7CisgICAgUHlPYmplY3QgKnJlc3VsdCA9IHBvLT5yZXN1bHQ7CisgICAgUHlfc3NpemVfdCBuID0gUHlUdXBsZV9HRVRfU0laRShwb29sKTsKKyAgICBQeV9zc2l6ZV90IHIgPSBwby0+cjsKKyAgICBQeV9zc2l6ZV90IGksIGosIGssIGluZGV4OwogCi0JaWYgKHBvLT5zdG9wcGVkKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAocG8tPnN0b3BwZWQpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKHJlc3VsdCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgLyogT24gdGhlIGZpcnN0IHBhc3MsIGluaXRpYWxpemUgcmVzdWx0IHR1cGxlIHVzaW5nIHRoZSBpbmRpY2VzICovCi0JCXJlc3VsdCA9IFB5VHVwbGVfTmV3KHIpOwotCQlpZiAocmVzdWx0ID09IE5VTEwpCi0gICAgICAgICAgICAJCWdvdG8gZW1wdHk7Ci0JCXBvLT5yZXN1bHQgPSByZXN1bHQ7Ci0JCWZvciAoaT0wOyBpPHIgOyBpKyspIHsKLQkJCWluZGV4ID0gaW5kaWNlc1tpXTsKLSAgICAJCQllbGVtID0gUHlUdXBsZV9HRVRfSVRFTShwb29sLCBpbmRleCk7Ci0gICAgCQkJUHlfSU5DUkVGKGVsZW0pOwotICAgIAkJCVB5VHVwbGVfU0VUX0lURU0ocmVzdWx0LCBpLCBlbGVtKTsKLQkJfQotCX0gZWxzZSB7Ci0JCWlmIChuID09IDApCi0JCQlnb3RvIGVtcHR5OworICAgIGlmIChyZXN1bHQgPT0gTlVMTCkgeworICAgICAgICAvKiBPbiB0aGUgZmlyc3QgcGFzcywgaW5pdGlhbGl6ZSByZXN1bHQgdHVwbGUgdXNpbmcgdGhlIGluZGljZXMgKi8KKyAgICAgICAgcmVzdWx0ID0gUHlUdXBsZV9OZXcocik7CisgICAgICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gZW1wdHk7CisgICAgICAgIHBvLT5yZXN1bHQgPSByZXN1bHQ7CisgICAgICAgIGZvciAoaT0wOyBpPHIgOyBpKyspIHsKKyAgICAgICAgICAgIGluZGV4ID0gaW5kaWNlc1tpXTsKKyAgICAgICAgICAgIGVsZW0gPSBQeVR1cGxlX0dFVF9JVEVNKHBvb2wsIGluZGV4KTsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihlbGVtKTsKKyAgICAgICAgICAgIFB5VHVwbGVfU0VUX0lURU0ocmVzdWx0LCBpLCBlbGVtKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChuID09IDApCisgICAgICAgICAgICBnb3RvIGVtcHR5OwogCi0JCS8qIENvcHkgdGhlIHByZXZpb3VzIHJlc3VsdCB0dXBsZSBvciByZS11c2UgaXQgaWYgYXZhaWxhYmxlICovCi0JCWlmIChQeV9SRUZDTlQocmVzdWx0KSA+IDEpIHsKLQkJCVB5T2JqZWN0ICpvbGRfcmVzdWx0ID0gcmVzdWx0OwotCQkJcmVzdWx0ID0gUHlUdXBsZV9OZXcocik7Ci0JCQlpZiAocmVzdWx0ID09IE5VTEwpCi0JCQkJZ290byBlbXB0eTsKLQkJCXBvLT5yZXN1bHQgPSByZXN1bHQ7Ci0JCQlmb3IgKGk9MDsgaTxyIDsgaSsrKSB7Ci0JCQkJZWxlbSA9IFB5VHVwbGVfR0VUX0lURU0ob2xkX3Jlc3VsdCwgaSk7Ci0gICAgCQkJCVB5X0lOQ1JFRihlbGVtKTsKLSAgICAJCQkJUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIGksIGVsZW0pOwotCQkJfQotCQkJUHlfREVDUkVGKG9sZF9yZXN1bHQpOwotCQl9Ci0JCS8qIE5vdywgd2UndmUgZ290IHRoZSBvbmx5IGNvcHkgc28gd2UgY2FuIHVwZGF0ZSBpdCBpbi1wbGFjZSAqLwotCQlhc3NlcnQociA9PSAwIHx8IFB5X1JFRkNOVChyZXN1bHQpID09IDEpOworICAgICAgICAvKiBDb3B5IHRoZSBwcmV2aW91cyByZXN1bHQgdHVwbGUgb3IgcmUtdXNlIGl0IGlmIGF2YWlsYWJsZSAqLworICAgICAgICBpZiAoUHlfUkVGQ05UKHJlc3VsdCkgPiAxKSB7CisgICAgICAgICAgICBQeU9iamVjdCAqb2xkX3Jlc3VsdCA9IHJlc3VsdDsKKyAgICAgICAgICAgIHJlc3VsdCA9IFB5VHVwbGVfTmV3KHIpOworICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGdvdG8gZW1wdHk7CisgICAgICAgICAgICBwby0+cmVzdWx0ID0gcmVzdWx0OworICAgICAgICAgICAgZm9yIChpPTA7IGk8ciA7IGkrKykgeworICAgICAgICAgICAgICAgIGVsZW0gPSBQeVR1cGxlX0dFVF9JVEVNKG9sZF9yZXN1bHQsIGkpOworICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihlbGVtKTsKKyAgICAgICAgICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKHJlc3VsdCwgaSwgZWxlbSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQeV9ERUNSRUYob2xkX3Jlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgLyogTm93LCB3ZSd2ZSBnb3QgdGhlIG9ubHkgY29weSBzbyB3ZSBjYW4gdXBkYXRlIGl0IGluLXBsYWNlICovCisgICAgICAgIGFzc2VydChyID09IDAgfHwgUHlfUkVGQ05UKHJlc3VsdCkgPT0gMSk7CiAKLSAgICAgICAgICAgICAgICAvKiBEZWNyZW1lbnQgcmlnaHRtb3N0IGN5Y2xlLCBtb3ZpbmcgbGVmdHdhcmQgdXBvbiB6ZXJvIHJvbGxvdmVyICovCi0JCWZvciAoaT1yLTEgOyBpPj0wIDsgaS0tKSB7Ci0JCQljeWNsZXNbaV0gLT0gMTsKLQkJCWlmIChjeWNsZXNbaV0gPT0gMCkgewotCQkJCS8qIHJvdGF0YXRpb246IGluZGljZXNbaTpdID0gaW5kaWNlc1tpKzE6XSArIGluZGljZXNbaTppKzFdICovCi0JCQkJaW5kZXggPSBpbmRpY2VzW2ldOwotCQkJCWZvciAoaj1pIDsgajxuLTEgOyBqKyspCi0JCQkJCWluZGljZXNbal0gPSBpbmRpY2VzW2orMV07Ci0JCQkJaW5kaWNlc1tuLTFdID0gaW5kZXg7Ci0JCQkJY3ljbGVzW2ldID0gbiAtIGk7Ci0JCQl9IGVsc2UgewotCQkJCWogPSBjeWNsZXNbaV07Ci0JCQkJaW5kZXggPSBpbmRpY2VzW2ldOwotCQkJCWluZGljZXNbaV0gPSBpbmRpY2VzW24tal07Ci0JCQkJaW5kaWNlc1tuLWpdID0gaW5kZXg7CisgICAgICAgIC8qIERlY3JlbWVudCByaWdodG1vc3QgY3ljbGUsIG1vdmluZyBsZWZ0d2FyZCB1cG9uIHplcm8gcm9sbG92ZXIgKi8KKyAgICAgICAgZm9yIChpPXItMSA7IGk+PTAgOyBpLS0pIHsKKyAgICAgICAgICAgIGN5Y2xlc1tpXSAtPSAxOworICAgICAgICAgICAgaWYgKGN5Y2xlc1tpXSA9PSAwKSB7CisgICAgICAgICAgICAgICAgLyogcm90YXRhdGlvbjogaW5kaWNlc1tpOl0gPSBpbmRpY2VzW2krMTpdICsgaW5kaWNlc1tpOmkrMV0gKi8KKyAgICAgICAgICAgICAgICBpbmRleCA9IGluZGljZXNbaV07CisgICAgICAgICAgICAgICAgZm9yIChqPWkgOyBqPG4tMSA7IGorKykKKyAgICAgICAgICAgICAgICAgICAgaW5kaWNlc1tqXSA9IGluZGljZXNbaisxXTsKKyAgICAgICAgICAgICAgICBpbmRpY2VzW24tMV0gPSBpbmRleDsKKyAgICAgICAgICAgICAgICBjeWNsZXNbaV0gPSBuIC0gaTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaiA9IGN5Y2xlc1tpXTsKKyAgICAgICAgICAgICAgICBpbmRleCA9IGluZGljZXNbaV07CisgICAgICAgICAgICAgICAgaW5kaWNlc1tpXSA9IGluZGljZXNbbi1qXTsKKyAgICAgICAgICAgICAgICBpbmRpY2VzW24tal0gPSBpbmRleDsKIAotCQkJCWZvciAoaz1pOyBrPHIgOyBrKyspIHsKLQkJCQkJLyogc3RhcnQgd2l0aCBpLCB0aGUgbGVmdG1vc3QgZWxlbWVudCB0aGF0IGNoYW5nZWQgKi8KLQkJCQkJLyogeWllbGQgdHVwbGUocG9vbFtrXSBmb3IgayBpbiBpbmRpY2VzWzpyXSkgKi8KLQkJCQkJaW5kZXggPSBpbmRpY2VzW2tdOwotCQkJCQllbGVtID0gUHlUdXBsZV9HRVRfSVRFTShwb29sLCBpbmRleCk7Ci0gICAgCQkJCQlQeV9JTkNSRUYoZWxlbSk7Ci0JCQkJCW9sZGVsZW0gPSBQeVR1cGxlX0dFVF9JVEVNKHJlc3VsdCwgayk7Ci0gICAgCQkJCQlQeVR1cGxlX1NFVF9JVEVNKHJlc3VsdCwgaywgZWxlbSk7Ci0JCQkJCVB5X0RFQ1JFRihvbGRlbGVtKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJLyogSWYgaSBpcyBuZWdhdGl2ZSwgdGhlbiB0aGUgY3ljbGVzIGhhdmUgYWxsCi0gICAgICAgICAgICAgICAgICAgcm9sbGVkLW92ZXIgYW5kIHdlJ3JlIGRvbmUuICovCi0JCWlmIChpIDwgMCkKLQkJCWdvdG8gZW1wdHk7Ci0JfQotCVB5X0lOQ1JFRihyZXN1bHQpOwotCXJldHVybiByZXN1bHQ7CisgICAgICAgICAgICAgICAgZm9yIChrPWk7IGs8ciA7IGsrKykgeworICAgICAgICAgICAgICAgICAgICAvKiBzdGFydCB3aXRoIGksIHRoZSBsZWZ0bW9zdCBlbGVtZW50IHRoYXQgY2hhbmdlZCAqLworICAgICAgICAgICAgICAgICAgICAvKiB5aWVsZCB0dXBsZShwb29sW2tdIGZvciBrIGluIGluZGljZXNbOnJdKSAqLworICAgICAgICAgICAgICAgICAgICBpbmRleCA9IGluZGljZXNba107CisgICAgICAgICAgICAgICAgICAgIGVsZW0gPSBQeVR1cGxlX0dFVF9JVEVNKHBvb2wsIGluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgUHlfSU5DUkVGKGVsZW0pOworICAgICAgICAgICAgICAgICAgICBvbGRlbGVtID0gUHlUdXBsZV9HRVRfSVRFTShyZXN1bHQsIGspOworICAgICAgICAgICAgICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKHJlc3VsdCwgaywgZWxlbSk7CisgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihvbGRlbGVtKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyogSWYgaSBpcyBuZWdhdGl2ZSwgdGhlbiB0aGUgY3ljbGVzIGhhdmUgYWxsCisgICAgICAgICAgIHJvbGxlZC1vdmVyIGFuZCB3ZSdyZSBkb25lLiAqLworICAgICAgICBpZiAoaSA8IDApCisgICAgICAgICAgICBnb3RvIGVtcHR5OworICAgIH0KKyAgICBQeV9JTkNSRUYocmVzdWx0KTsKKyAgICByZXR1cm4gcmVzdWx0OwogCiBlbXB0eToKLQlwby0+c3RvcHBlZCA9IDE7Ci0JcmV0dXJuIE5VTEw7CisgICAgcG8tPnN0b3BwZWQgPSAxOworICAgIHJldHVybiBOVUxMOwogfQogCiBQeURvY19TVFJWQVIocGVybXV0YXRpb25zX2RvYywKQEAgLTI0NjcsNTYgKzI0NjcsNTYgQEAKIHBlcm11dGF0aW9ucyhyYW5nZSgzKSwgMikgLS0+ICgwLDEpLCAoMCwyKSwgKDEsMCksICgxLDIpLCAoMiwwKSwgKDIsMSkiKTsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBwZXJtdXRhdGlvbnNfdHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKLQkiaXRlcnRvb2xzLnBlcm11dGF0aW9ucyIsCQkvKiB0cF9uYW1lICovCi0Jc2l6ZW9mKHBlcm11dGF0aW9uc29iamVjdCksCS8qIHRwX2Jhc2ljc2l6ZSAqLwotCTAsCQkJCS8qIHRwX2l0ZW1zaXplICovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKXBlcm11dGF0aW9uc19kZWFsbG9jLAkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkwLAkJCQkvKiB0cF9yZXByICovCi0JMCwJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkvKiB0cF9zdHIgKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQyB8Ci0JCVB5X1RQRkxBR1NfQkFTRVRZUEUsCS8qIHRwX2ZsYWdzICovCi0JcGVybXV0YXRpb25zX2RvYywJCQkvKiB0cF9kb2MgKi8KLQkodHJhdmVyc2Vwcm9jKXBlcm11dGF0aW9uc190cmF2ZXJzZSwJLyogdHBfdHJhdmVyc2UgKi8KLQkwLAkJCQkvKiB0cF9jbGVhciAqLwotCTAsCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQlQeU9iamVjdF9TZWxmSXRlciwJCS8qIHRwX2l0ZXIgKi8KLQkoaXRlcm5leHRmdW5jKXBlcm11dGF0aW9uc19uZXh0LAkvKiB0cF9pdGVybmV4dCAqLwotCTAsCQkJCS8qIHRwX21ldGhvZHMgKi8KLQkwLAkJCQkvKiB0cF9tZW1iZXJzICovCi0JMCwJCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCS8qIHRwX2RpY3QgKi8KLQkwLAkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KLQkwLAkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCi0JMCwJCQkJLyogdHBfaW5pdCAqLwotCTAsCQkJCS8qIHRwX2FsbG9jICovCi0JcGVybXV0YXRpb25zX25ldywJCQkvKiB0cF9uZXcgKi8KLQlQeU9iamVjdF9HQ19EZWwsCQkvKiB0cF9mcmVlICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisgICAgIml0ZXJ0b29scy5wZXJtdXRhdGlvbnMiLCAgICAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCisgICAgc2l6ZW9mKHBlcm11dGF0aW9uc29iamVjdCksICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpcGVybXV0YXRpb25zX2RlYWxsb2MsICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDIHwKKyAgICAgICAgUHlfVFBGTEFHU19CQVNFVFlQRSwgICAgICAgICAgICAvKiB0cF9mbGFncyAqLworICAgIHBlcm11dGF0aW9uc19kb2MsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgKHRyYXZlcnNlcHJvYylwZXJtdXRhdGlvbnNfdHJhdmVyc2UsICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIFB5T2JqZWN0X1NlbGZJdGVyLCAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAoaXRlcm5leHRmdW5jKXBlcm11dGF0aW9uc19uZXh0LCAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBwZXJtdXRhdGlvbnNfbmV3LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworICAgIFB5T2JqZWN0X0dDX0RlbCwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KIH07CiAKIAogLyogaWZpbHRlciBvYmplY3QgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCVB5T2JqZWN0ICpmdW5jOwotCVB5T2JqZWN0ICppdDsKKyAgICBQeU9iamVjdF9IRUFECisgICAgUHlPYmplY3QgKmZ1bmM7CisgICAgUHlPYmplY3QgKml0OwogfSBpZmlsdGVyb2JqZWN0OwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IGlmaWx0ZXJfdHlwZTsKQEAgLTI1MjQsODMgKzI1MjQsODMgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBpZmlsdGVyX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlQeU9iamVjdCAqZnVuYywgKnNlcTsKLQlQeU9iamVjdCAqaXQ7Ci0JaWZpbHRlcm9iamVjdCAqbHo7CisgICAgUHlPYmplY3QgKmZ1bmMsICpzZXE7CisgICAgUHlPYmplY3QgKml0OworICAgIGlmaWx0ZXJvYmplY3QgKmx6OwogCi0JaWYgKHR5cGUgPT0gJmlmaWx0ZXJfdHlwZSAmJiAhX1B5QXJnX05vS2V5d29yZHMoImlmaWx0ZXIoKSIsIGt3ZHMpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAodHlwZSA9PSAmaWZpbHRlcl90eXBlICYmICFfUHlBcmdfTm9LZXl3b3JkcygiaWZpbHRlcigpIiwga3dkcykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiaWZpbHRlciIsIDIsIDIsICZmdW5jLCAmc2VxKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiaWZpbHRlciIsIDIsIDIsICZmdW5jLCAmc2VxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkvKiBHZXQgaXRlcmF0b3IuICovCi0JaXQgPSBQeU9iamVjdF9HZXRJdGVyKHNlcSk7Ci0JaWYgKGl0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIC8qIEdldCBpdGVyYXRvci4gKi8KKyAgICBpdCA9IFB5T2JqZWN0X0dldEl0ZXIoc2VxKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkvKiBjcmVhdGUgaWZpbHRlcm9iamVjdCBzdHJ1Y3R1cmUgKi8KLQlseiA9IChpZmlsdGVyb2JqZWN0ICopdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7Ci0JaWYgKGx6ID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKGl0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5X0lOQ1JFRihmdW5jKTsKLQlsei0+ZnVuYyA9IGZ1bmM7Ci0JbHotPml0ID0gaXQ7CisgICAgLyogY3JlYXRlIGlmaWx0ZXJvYmplY3Qgc3RydWN0dXJlICovCisgICAgbHogPSAoaWZpbHRlcm9iamVjdCAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOworICAgIGlmIChseiA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihpdCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeV9JTkNSRUYoZnVuYyk7CisgICAgbHotPmZ1bmMgPSBmdW5jOworICAgIGx6LT5pdCA9IGl0OwogCi0JcmV0dXJuIChQeU9iamVjdCAqKWx6OworICAgIHJldHVybiAoUHlPYmplY3QgKilsejsKIH0KIAogc3RhdGljIHZvaWQKIGlmaWx0ZXJfZGVhbGxvYyhpZmlsdGVyb2JqZWN0ICpseikKIHsKLQlQeU9iamVjdF9HQ19VblRyYWNrKGx6KTsKLQlQeV9YREVDUkVGKGx6LT5mdW5jKTsKLQlQeV9YREVDUkVGKGx6LT5pdCk7Ci0JUHlfVFlQRShseiktPnRwX2ZyZWUobHopOworICAgIFB5T2JqZWN0X0dDX1VuVHJhY2sobHopOworICAgIFB5X1hERUNSRUYobHotPmZ1bmMpOworICAgIFB5X1hERUNSRUYobHotPml0KTsKKyAgICBQeV9UWVBFKGx6KS0+dHBfZnJlZShseik7CiB9CiAKIHN0YXRpYyBpbnQKIGlmaWx0ZXJfdHJhdmVyc2UoaWZpbHRlcm9iamVjdCAqbHosIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotCVB5X1ZJU0lUKGx6LT5pdCk7Ci0JUHlfVklTSVQobHotPmZ1bmMpOwotCXJldHVybiAwOworICAgIFB5X1ZJU0lUKGx6LT5pdCk7CisgICAgUHlfVklTSVQobHotPmZ1bmMpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaWZpbHRlcl9uZXh0KGlmaWx0ZXJvYmplY3QgKmx6KQogewotCVB5T2JqZWN0ICppdGVtOwotCVB5T2JqZWN0ICppdCA9IGx6LT5pdDsKLQlsb25nIG9rOwotCVB5T2JqZWN0ICooKml0ZXJuZXh0KShQeU9iamVjdCAqKTsKKyAgICBQeU9iamVjdCAqaXRlbTsKKyAgICBQeU9iamVjdCAqaXQgPSBsei0+aXQ7CisgICAgbG9uZyBvazsKKyAgICBQeU9iamVjdCAqKCppdGVybmV4dCkoUHlPYmplY3QgKik7CiAKLQlhc3NlcnQoUHlJdGVyX0NoZWNrKGl0KSk7Ci0JaXRlcm5leHQgPSAqUHlfVFlQRShpdCktPnRwX2l0ZXJuZXh0OwotCWZvciAoOzspIHsKLQkJaXRlbSA9IGl0ZXJuZXh0KGl0KTsKLQkJaWYgKGl0ZW0gPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOworICAgIGFzc2VydChQeUl0ZXJfQ2hlY2soaXQpKTsKKyAgICBpdGVybmV4dCA9ICpQeV9UWVBFKGl0KS0+dHBfaXRlcm5leHQ7CisgICAgZm9yICg7OykgeworICAgICAgICBpdGVtID0gaXRlcm5leHQoaXQpOworICAgICAgICBpZiAoaXRlbSA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkJaWYgKGx6LT5mdW5jID09IFB5X05vbmUgfHwgbHotPmZ1bmMgPT0gKFB5T2JqZWN0ICopJlB5Qm9vbF9UeXBlKSB7Ci0JCQlvayA9IFB5T2JqZWN0X0lzVHJ1ZShpdGVtKTsKLQkJfSBlbHNlIHsKLQkJCVB5T2JqZWN0ICpnb29kOwotCQkJZ29vZCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MobHotPmZ1bmMsCi0JCQkJCQkJICAgIGl0ZW0sIE5VTEwpOwotCQkJaWYgKGdvb2QgPT0gTlVMTCkgewotCQkJCVB5X0RFQ1JFRihpdGVtKTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJCW9rID0gUHlPYmplY3RfSXNUcnVlKGdvb2QpOwotCQkJUHlfREVDUkVGKGdvb2QpOwotCQl9Ci0JCWlmIChvaykKLQkJCXJldHVybiBpdGVtOwotCQlQeV9ERUNSRUYoaXRlbSk7Ci0JfQorICAgICAgICBpZiAobHotPmZ1bmMgPT0gUHlfTm9uZSB8fCBsei0+ZnVuYyA9PSAoUHlPYmplY3QgKikmUHlCb29sX1R5cGUpIHsKKyAgICAgICAgICAgIG9rID0gUHlPYmplY3RfSXNUcnVlKGl0ZW0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgUHlPYmplY3QgKmdvb2Q7CisgICAgICAgICAgICBnb29kID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhsei0+ZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0sIE5VTEwpOworICAgICAgICAgICAgaWYgKGdvb2QgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9rID0gUHlPYmplY3RfSXNUcnVlKGdvb2QpOworICAgICAgICAgICAgUHlfREVDUkVGKGdvb2QpOworICAgICAgICB9CisgICAgICAgIGlmIChvaykKKyAgICAgICAgICAgIHJldHVybiBpdGVtOworICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CisgICAgfQogfQogCiBQeURvY19TVFJWQVIoaWZpbHRlcl9kb2MsCkBAIC0yNjEwLDU2ICsyNjEwLDU2IEBACiBJZiBmdW5jdGlvbiBpcyBOb25lLCByZXR1cm4gdGhlIGl0ZW1zIHRoYXQgYXJlIHRydWUuIik7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgaWZpbHRlcl90eXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotCSJpdGVydG9vbHMuaWZpbHRlciIsCQkvKiB0cF9uYW1lICovCi0Jc2l6ZW9mKGlmaWx0ZXJvYmplY3QpLAkJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpaWZpbHRlcl9kZWFsbG9jLAkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkwLAkJCQkvKiB0cF9yZXByICovCi0JMCwJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkvKiB0cF9zdHIgKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQyB8Ci0JCVB5X1RQRkxBR1NfQkFTRVRZUEUsCS8qIHRwX2ZsYWdzICovCi0JaWZpbHRlcl9kb2MsCQkJLyogdHBfZG9jICovCi0JKHRyYXZlcnNlcHJvYylpZmlsdGVyX3RyYXZlcnNlLAkvKiB0cF90cmF2ZXJzZSAqLwotCTAsCQkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCVB5T2JqZWN0X1NlbGZJdGVyLAkJLyogdHBfaXRlciAqLwotCShpdGVybmV4dGZ1bmMpaWZpbHRlcl9uZXh0LAkvKiB0cF9pdGVybmV4dCAqLwotCTAsCQkJCS8qIHRwX21ldGhvZHMgKi8KLQkwLAkJCQkvKiB0cF9tZW1iZXJzICovCi0JMCwJCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCS8qIHRwX2RpY3QgKi8KLQkwLAkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KLQkwLAkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCi0JMCwJCQkJLyogdHBfaW5pdCAqLwotCTAsCQkJCS8qIHRwX2FsbG9jICovCi0JaWZpbHRlcl9uZXcsCQkJLyogdHBfbmV3ICovCi0JUHlPYmplY3RfR0NfRGVsLAkJLyogdHBfZnJlZSAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQorICAgICJpdGVydG9vbHMuaWZpbHRlciIsICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICBzaXplb2YoaWZpbHRlcm9iamVjdCksICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcilpZmlsdGVyX2RlYWxsb2MsICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDIHwKKyAgICAgICAgUHlfVFBGTEFHU19CQVNFVFlQRSwgICAgICAgICAgICAvKiB0cF9mbGFncyAqLworICAgIGlmaWx0ZXJfZG9jLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2MpaWZpbHRlcl90cmF2ZXJzZSwgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgUHlPYmplY3RfU2VsZkl0ZXIsICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIChpdGVybmV4dGZ1bmMpaWZpbHRlcl9uZXh0LCAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBpZmlsdGVyX25ldywgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICBQeU9iamVjdF9HQ19EZWwsICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCiB9OwogCiAKIC8qIGlmaWx0ZXJmYWxzZSBvYmplY3QgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCVB5T2JqZWN0ICpmdW5jOwotCVB5T2JqZWN0ICppdDsKKyAgICBQeU9iamVjdF9IRUFECisgICAgUHlPYmplY3QgKmZ1bmM7CisgICAgUHlPYmplY3QgKml0OwogfSBpZmlsdGVyZmFsc2VvYmplY3Q7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgaWZpbHRlcmZhbHNlX3R5cGU7CkBAIC0yNjY3LDg0ICsyNjY3LDg0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogaWZpbHRlcmZhbHNlX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlQeU9iamVjdCAqZnVuYywgKnNlcTsKLQlQeU9iamVjdCAqaXQ7Ci0JaWZpbHRlcmZhbHNlb2JqZWN0ICpsejsKKyAgICBQeU9iamVjdCAqZnVuYywgKnNlcTsKKyAgICBQeU9iamVjdCAqaXQ7CisgICAgaWZpbHRlcmZhbHNlb2JqZWN0ICpsejsKIAotCWlmICh0eXBlID09ICZpZmlsdGVyZmFsc2VfdHlwZSAmJgotCSAgICAhX1B5QXJnX05vS2V5d29yZHMoImlmaWx0ZXJmYWxzZSgpIiwga3dkcykpCi0JCXJldHVybiBOVUxMOworICAgIGlmICh0eXBlID09ICZpZmlsdGVyZmFsc2VfdHlwZSAmJgorICAgICAgICAhX1B5QXJnX05vS2V5d29yZHMoImlmaWx0ZXJmYWxzZSgpIiwga3dkcykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiaWZpbHRlcmZhbHNlIiwgMiwgMiwgJmZ1bmMsICZzZXEpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJpZmlsdGVyZmFsc2UiLCAyLCAyLCAmZnVuYywgJnNlcSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JLyogR2V0IGl0ZXJhdG9yLiAqLwotCWl0ID0gUHlPYmplY3RfR2V0SXRlcihzZXEpOwotCWlmIChpdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICAvKiBHZXQgaXRlcmF0b3IuICovCisgICAgaXQgPSBQeU9iamVjdF9HZXRJdGVyKHNlcSk7CisgICAgaWYgKGl0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JLyogY3JlYXRlIGlmaWx0ZXJmYWxzZW9iamVjdCBzdHJ1Y3R1cmUgKi8KLQlseiA9IChpZmlsdGVyZmFsc2VvYmplY3QgKil0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKLQlpZiAobHogPT0gTlVMTCkgewotCQlQeV9ERUNSRUYoaXQpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JUHlfSU5DUkVGKGZ1bmMpOwotCWx6LT5mdW5jID0gZnVuYzsKLQlsei0+aXQgPSBpdDsKKyAgICAvKiBjcmVhdGUgaWZpbHRlcmZhbHNlb2JqZWN0IHN0cnVjdHVyZSAqLworICAgIGx6ID0gKGlmaWx0ZXJmYWxzZW9iamVjdCAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOworICAgIGlmIChseiA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihpdCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeV9JTkNSRUYoZnVuYyk7CisgICAgbHotPmZ1bmMgPSBmdW5jOworICAgIGx6LT5pdCA9IGl0OwogCi0JcmV0dXJuIChQeU9iamVjdCAqKWx6OworICAgIHJldHVybiAoUHlPYmplY3QgKilsejsKIH0KIAogc3RhdGljIHZvaWQKIGlmaWx0ZXJmYWxzZV9kZWFsbG9jKGlmaWx0ZXJmYWxzZW9iamVjdCAqbHopCiB7Ci0JUHlPYmplY3RfR0NfVW5UcmFjayhseik7Ci0JUHlfWERFQ1JFRihsei0+ZnVuYyk7Ci0JUHlfWERFQ1JFRihsei0+aXQpOwotCVB5X1RZUEUobHopLT50cF9mcmVlKGx6KTsKKyAgICBQeU9iamVjdF9HQ19VblRyYWNrKGx6KTsKKyAgICBQeV9YREVDUkVGKGx6LT5mdW5jKTsKKyAgICBQeV9YREVDUkVGKGx6LT5pdCk7CisgICAgUHlfVFlQRShseiktPnRwX2ZyZWUobHopOwogfQogCiBzdGF0aWMgaW50CiBpZmlsdGVyZmFsc2VfdHJhdmVyc2UoaWZpbHRlcmZhbHNlb2JqZWN0ICpseiwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JUHlfVklTSVQobHotPml0KTsKLQlQeV9WSVNJVChsei0+ZnVuYyk7Ci0JcmV0dXJuIDA7CisgICAgUHlfVklTSVQobHotPml0KTsKKyAgICBQeV9WSVNJVChsei0+ZnVuYyk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpZmlsdGVyZmFsc2VfbmV4dChpZmlsdGVyZmFsc2VvYmplY3QgKmx6KQogewotCVB5T2JqZWN0ICppdGVtOwotCVB5T2JqZWN0ICppdCA9IGx6LT5pdDsKLQlsb25nIG9rOwotCVB5T2JqZWN0ICooKml0ZXJuZXh0KShQeU9iamVjdCAqKTsKKyAgICBQeU9iamVjdCAqaXRlbTsKKyAgICBQeU9iamVjdCAqaXQgPSBsei0+aXQ7CisgICAgbG9uZyBvazsKKyAgICBQeU9iamVjdCAqKCppdGVybmV4dCkoUHlPYmplY3QgKik7CiAKLQlhc3NlcnQoUHlJdGVyX0NoZWNrKGl0KSk7Ci0JaXRlcm5leHQgPSAqUHlfVFlQRShpdCktPnRwX2l0ZXJuZXh0OwotCWZvciAoOzspIHsKLQkJaXRlbSA9IGl0ZXJuZXh0KGl0KTsKLQkJaWYgKGl0ZW0gPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOworICAgIGFzc2VydChQeUl0ZXJfQ2hlY2soaXQpKTsKKyAgICBpdGVybmV4dCA9ICpQeV9UWVBFKGl0KS0+dHBfaXRlcm5leHQ7CisgICAgZm9yICg7OykgeworICAgICAgICBpdGVtID0gaXRlcm5leHQoaXQpOworICAgICAgICBpZiAoaXRlbSA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkJaWYgKGx6LT5mdW5jID09IFB5X05vbmUgfHwgbHotPmZ1bmMgPT0gKFB5T2JqZWN0ICopJlB5Qm9vbF9UeXBlKSB7Ci0JCQlvayA9IFB5T2JqZWN0X0lzVHJ1ZShpdGVtKTsKLQkJfSBlbHNlIHsKLQkJCVB5T2JqZWN0ICpnb29kOwotCQkJZ29vZCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MobHotPmZ1bmMsCi0JCQkJCQkJICAgIGl0ZW0sIE5VTEwpOwotCQkJaWYgKGdvb2QgPT0gTlVMTCkgewotCQkJCVB5X0RFQ1JFRihpdGVtKTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJCW9rID0gUHlPYmplY3RfSXNUcnVlKGdvb2QpOwotCQkJUHlfREVDUkVGKGdvb2QpOwotCQl9Ci0JCWlmICghb2spCi0JCQlyZXR1cm4gaXRlbTsKLQkJUHlfREVDUkVGKGl0ZW0pOwotCX0KKyAgICAgICAgaWYgKGx6LT5mdW5jID09IFB5X05vbmUgfHwgbHotPmZ1bmMgPT0gKFB5T2JqZWN0ICopJlB5Qm9vbF9UeXBlKSB7CisgICAgICAgICAgICBvayA9IFB5T2JqZWN0X0lzVHJ1ZShpdGVtKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpnb29kOworICAgICAgICAgICAgZ29vZCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MobHotPmZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLCBOVUxMKTsKKyAgICAgICAgICAgIGlmIChnb29kID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvayA9IFB5T2JqZWN0X0lzVHJ1ZShnb29kKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihnb29kKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW9rKQorICAgICAgICAgICAgcmV0dXJuIGl0ZW07CisgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICB9CiB9CiAKIFB5RG9jX1NUUlZBUihpZmlsdGVyZmFsc2VfZG9jLApAQCAtMjc1NCw1NiArMjc1NCw1NiBAQAogSWYgZnVuY3Rpb24gaXMgTm9uZSwgcmV0dXJuIHRoZSBpdGVtcyB0aGF0IGFyZSBmYWxzZS4iKTsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBpZmlsdGVyZmFsc2VfdHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKLQkiaXRlcnRvb2xzLmlmaWx0ZXJmYWxzZSIsCS8qIHRwX25hbWUgKi8KLQlzaXplb2YoaWZpbHRlcmZhbHNlb2JqZWN0KSwJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpaWZpbHRlcmZhbHNlX2RlYWxsb2MsCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJLyogdHBfY29tcGFyZSAqLwotCTAsCQkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJLyogdHBfY2FsbCAqLwotCTAsCQkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDIHwKLQkJUHlfVFBGTEFHU19CQVNFVFlQRSwJLyogdHBfZmxhZ3MgKi8KLQlpZmlsdGVyZmFsc2VfZG9jLAkJLyogdHBfZG9jICovCi0JKHRyYXZlcnNlcHJvYylpZmlsdGVyZmFsc2VfdHJhdmVyc2UsCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JUHlPYmplY3RfU2VsZkl0ZXIsCQkvKiB0cF9pdGVyICovCi0JKGl0ZXJuZXh0ZnVuYylpZmlsdGVyZmFsc2VfbmV4dCwJLyogdHBfaXRlcm5leHQgKi8KLQkwLAkJCQkvKiB0cF9tZXRob2RzICovCi0JMCwJCQkJLyogdHBfbWVtYmVycyAqLwotCTAsCQkJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkvKiB0cF9kaWN0ICovCi0JMCwJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJCQkJLyogdHBfZGljdG9mZnNldCAqLwotCTAsCQkJCS8qIHRwX2luaXQgKi8KLQkwLAkJCQkvKiB0cF9hbGxvYyAqLwotCWlmaWx0ZXJmYWxzZV9uZXcsCQkvKiB0cF9uZXcgKi8KLQlQeU9iamVjdF9HQ19EZWwsCQkvKiB0cF9mcmVlICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisgICAgIml0ZXJ0b29scy5pZmlsdGVyZmFsc2UiLCAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgIHNpemVvZihpZmlsdGVyZmFsc2VvYmplY3QpLCAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKWlmaWx0ZXJmYWxzZV9kZWFsbG9jLCAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQyB8CisgICAgICAgIFB5X1RQRkxBR1NfQkFTRVRZUEUsICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICBpZmlsdGVyZmFsc2VfZG9jLCAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAodHJhdmVyc2Vwcm9jKWlmaWx0ZXJmYWxzZV90cmF2ZXJzZSwgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgUHlPYmplY3RfU2VsZkl0ZXIsICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIChpdGVybmV4dGZ1bmMpaWZpbHRlcmZhbHNlX25leHQsICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIGlmaWx0ZXJmYWxzZV9uZXcsICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworICAgIFB5T2JqZWN0X0dDX0RlbCwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KIH07CiAKIAogLyogY291bnQgb2JqZWN0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewotCVB5T2JqZWN0X0hFQUQKLQlQeV9zc2l6ZV90IGNudDsKLQlQeU9iamVjdCAqbG9uZ19jbnQ7CS8qIEFyYml0cmFyaWx5IGxhcmdlIGNvdW50IHdoZW4gY250ID49IFBZX1NTSVpFX1RfTUFYICovCisgICAgUHlPYmplY3RfSEVBRAorICAgIFB5X3NzaXplX3QgY250OworICAgIFB5T2JqZWN0ICpsb25nX2NudDsgICAgICAgICAvKiBBcmJpdHJhcmlseSBsYXJnZSBjb3VudCB3aGVuIGNudCA+PSBQWV9TU0laRV9UX01BWCAqLwogfSBjb3VudG9iamVjdDsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBjb3VudF90eXBlOwpAQCAtMjgxMSwxMTUgKzI4MTEsMTE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogY291bnRfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCWNvdW50b2JqZWN0ICpsejsKLQlQeV9zc2l6ZV90IGNudCA9IDA7Ci0JUHlPYmplY3QgKmNudF9hcmcgPSBOVUxMOwotCVB5T2JqZWN0ICpsb25nX2NudCA9IE5VTEw7CisgICAgY291bnRvYmplY3QgKmx6OworICAgIFB5X3NzaXplX3QgY250ID0gMDsKKyAgICBQeU9iamVjdCAqY250X2FyZyA9IE5VTEw7CisgICAgUHlPYmplY3QgKmxvbmdfY250ID0gTlVMTDsKIAotCWlmICh0eXBlID09ICZjb3VudF90eXBlICYmICFfUHlBcmdfTm9LZXl3b3JkcygiY291bnQoKSIsIGt3ZHMpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAodHlwZSA9PSAmY291bnRfdHlwZSAmJiAhX1B5QXJnX05vS2V5d29yZHMoImNvdW50KCkiLCBrd2RzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJjb3VudCIsIDAsIDEsICZjbnRfYXJnKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiY291bnQiLCAwLCAxLCAmY250X2FyZykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKGNudF9hcmcgIT0gTlVMTCkgewotCQljbnQgPSBQeUludF9Bc1NzaXplX3QoY250X2FyZyk7Ci0JCWlmIChjbnQgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewotCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCWlmICghUHlMb25nX0NoZWNrKGNudF9hcmcpKSB7Ci0JCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImFuIGludGVnZXIgaXMgcmVxdWlyZWQiKTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJCWxvbmdfY250ID0gY250X2FyZzsKLQkJCVB5X0lOQ1JFRihsb25nX2NudCk7Ci0JCQljbnQgPSBQWV9TU0laRV9UX01BWDsKLQkJfQotCX0KKyAgICBpZiAoY250X2FyZyAhPSBOVUxMKSB7CisgICAgICAgIGNudCA9IFB5SW50X0FzU3NpemVfdChjbnRfYXJnKTsKKyAgICAgICAgaWYgKGNudCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgaWYgKCFQeUxvbmdfQ2hlY2soY250X2FyZykpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYW4gaW50ZWdlciBpcyByZXF1aXJlZCIpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9uZ19jbnQgPSBjbnRfYXJnOworICAgICAgICAgICAgUHlfSU5DUkVGKGxvbmdfY250KTsKKyAgICAgICAgICAgIGNudCA9IFBZX1NTSVpFX1RfTUFYOworICAgICAgICB9CisgICAgfQogCi0JLyogY3JlYXRlIGNvdW50b2JqZWN0IHN0cnVjdHVyZSAqLwotCWx6ID0gKGNvdW50b2JqZWN0ICopUHlPYmplY3RfTmV3KGNvdW50b2JqZWN0LCAmY291bnRfdHlwZSk7Ci0JaWYgKGx6ID09IE5VTEwpIHsKLQkJUHlfWERFQ1JFRihsb25nX2NudCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlsei0+Y250ID0gY250OwotCWx6LT5sb25nX2NudCA9IGxvbmdfY250OworICAgIC8qIGNyZWF0ZSBjb3VudG9iamVjdCBzdHJ1Y3R1cmUgKi8KKyAgICBseiA9IChjb3VudG9iamVjdCAqKVB5T2JqZWN0X05ldyhjb3VudG9iamVjdCwgJmNvdW50X3R5cGUpOworICAgIGlmIChseiA9PSBOVUxMKSB7CisgICAgICAgIFB5X1hERUNSRUYobG9uZ19jbnQpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgbHotPmNudCA9IGNudDsKKyAgICBsei0+bG9uZ19jbnQgPSBsb25nX2NudDsKIAotCXJldHVybiAoUHlPYmplY3QgKilsejsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopbHo7CiB9CiAKIHN0YXRpYyB2b2lkCiBjb3VudF9kZWFsbG9jKGNvdW50b2JqZWN0ICpseikKIHsKLQlQeV9YREVDUkVGKGx6LT5sb25nX2NudCk7IAotCVB5T2JqZWN0X0RlbChseik7CisgICAgUHlfWERFQ1JFRihsei0+bG9uZ19jbnQpOworICAgIFB5T2JqZWN0X0RlbChseik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjb3VudF9uZXh0bG9uZyhjb3VudG9iamVjdCAqbHopCiB7Ci0Jc3RhdGljIFB5T2JqZWN0ICpvbmUgPSBOVUxMOwotCVB5T2JqZWN0ICpjbnQ7Ci0JUHlPYmplY3QgKnN0ZXBwZWRfdXA7CisgICAgc3RhdGljIFB5T2JqZWN0ICpvbmUgPSBOVUxMOworICAgIFB5T2JqZWN0ICpjbnQ7CisgICAgUHlPYmplY3QgKnN0ZXBwZWRfdXA7CiAKLQlpZiAobHotPmxvbmdfY250ID09IE5VTEwpIHsKLQkJbHotPmxvbmdfY250ID0gUHlJbnRfRnJvbVNzaXplX3QoUFlfU1NJWkVfVF9NQVgpOwotCQlpZiAobHotPmxvbmdfY250ID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKG9uZSA9PSBOVUxMKSB7Ci0JCW9uZSA9IFB5SW50X0Zyb21Mb25nKDEpOwotCQlpZiAob25lID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0JY250ID0gbHotPmxvbmdfY250OwotCWFzc2VydChjbnQgIT0gTlVMTCk7Ci0Jc3RlcHBlZF91cCA9IFB5TnVtYmVyX0FkZChjbnQsIG9uZSk7Ci0JaWYgKHN0ZXBwZWRfdXAgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JbHotPmxvbmdfY250ID0gc3RlcHBlZF91cDsKLQlyZXR1cm4gY250OworICAgIGlmIChsei0+bG9uZ19jbnQgPT0gTlVMTCkgeworICAgICAgICBsei0+bG9uZ19jbnQgPSBQeUludF9Gcm9tU3NpemVfdChQWV9TU0laRV9UX01BWCk7CisgICAgICAgIGlmIChsei0+bG9uZ19jbnQgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAob25lID09IE5VTEwpIHsKKyAgICAgICAgb25lID0gUHlJbnRfRnJvbUxvbmcoMSk7CisgICAgICAgIGlmIChvbmUgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBjbnQgPSBsei0+bG9uZ19jbnQ7CisgICAgYXNzZXJ0KGNudCAhPSBOVUxMKTsKKyAgICBzdGVwcGVkX3VwID0gUHlOdW1iZXJfQWRkKGNudCwgb25lKTsKKyAgICBpZiAoc3RlcHBlZF91cCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBsei0+bG9uZ19jbnQgPSBzdGVwcGVkX3VwOworICAgIHJldHVybiBjbnQ7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjb3VudF9uZXh0KGNvdW50b2JqZWN0ICpseikKIHsKLSAgICAgICAgaWYgKGx6LT5jbnQgPT0gUFlfU1NJWkVfVF9NQVgpCi0JCXJldHVybiBjb3VudF9uZXh0bG9uZyhseik7Ci0JcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KGx6LT5jbnQrKyk7CisgICAgaWYgKGx6LT5jbnQgPT0gUFlfU1NJWkVfVF9NQVgpCisgICAgICAgIHJldHVybiBjb3VudF9uZXh0bG9uZyhseik7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KGx6LT5jbnQrKyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjb3VudF9yZXByKGNvdW50b2JqZWN0ICpseikKIHsKLQlQeU9iamVjdCAqY250X3JlcHI7Ci0JUHlPYmplY3QgKnJlc3VsdDsKKyAgICBQeU9iamVjdCAqY250X3JlcHI7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKIAotICAgICAgICBpZiAobHotPmNudCAhPSBQWV9TU0laRV9UX01BWCkKLQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21Gb3JtYXQoImNvdW50KCV6ZCkiLCBsei0+Y250KTsKKyAgICBpZiAobHotPmNudCAhPSBQWV9TU0laRV9UX01BWCkKKyAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21Gb3JtYXQoImNvdW50KCV6ZCkiLCBsei0+Y250KTsKIAotCWNudF9yZXByID0gUHlPYmplY3RfUmVwcihsei0+bG9uZ19jbnQpOwotCWlmIChjbnRfcmVwciA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlyZXN1bHQgPSBQeVN0cmluZ19Gcm9tRm9ybWF0KCJjb3VudCglcykiLCBQeVN0cmluZ19BU19TVFJJTkcoY250X3JlcHIpKTsKLQlQeV9ERUNSRUYoY250X3JlcHIpOwotCXJldHVybiByZXN1bHQ7CisgICAgY250X3JlcHIgPSBQeU9iamVjdF9SZXByKGx6LT5sb25nX2NudCk7CisgICAgaWYgKGNudF9yZXByID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJlc3VsdCA9IFB5U3RyaW5nX0Zyb21Gb3JtYXQoImNvdW50KCVzKSIsIFB5U3RyaW5nX0FTX1NUUklORyhjbnRfcmVwcikpOworICAgIFB5X0RFQ1JFRihjbnRfcmVwcik7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNvdW50X3JlZHVjZShjb3VudG9iamVjdCAqbHopCiB7Ci0JaWYgKGx6LT5jbnQgPT0gUFlfU1NJWkVfVF9NQVgpCi0JCXJldHVybiBQeV9CdWlsZFZhbHVlKCJPKE8pIiwgUHlfVFlQRShseiksIGx6LT5sb25nX2NudCk7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8obikiLCBQeV9UWVBFKGx6KSwgbHotPmNudCk7CisgICAgaWYgKGx6LT5jbnQgPT0gUFlfU1NJWkVfVF9NQVgpCisgICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPKE8pIiwgUHlfVFlQRShseiksIGx6LT5sb25nX2NudCk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8obikiLCBQeV9UWVBFKGx6KSwgbHotPmNudCk7CiB9CiAKIFB5RG9jX1NUUlZBUihjb3VudF9yZWR1Y2VfZG9jLCAiUmV0dXJuIHN0YXRlIGluZm9ybWF0aW9uIGZvciBwaWNrbGluZy4iKTsKIAogc3RhdGljIFB5TWV0aG9kRGVmIGNvdW50X21ldGhvZHNbXSA9IHsKLQl7Il9fcmVkdWNlX18iLAkoUHlDRnVuY3Rpb24pY291bnRfcmVkdWNlLAlNRVRIX05PQVJHUywKLQkgY291bnRfcmVkdWNlX2RvY30sCi0Je05VTEwsCQlOVUxMfQkvKiBzZW50aW5lbCAqLworICAgIHsiX19yZWR1Y2VfXyIsICAgICAgKFB5Q0Z1bmN0aW9uKWNvdW50X3JlZHVjZSwgICAgICBNRVRIX05PQVJHUywKKyAgICAgY291bnRfcmVkdWNlX2RvY30sCisgICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSAgIC8qIHNlbnRpbmVsICovCiB9OwogCiBQeURvY19TVFJWQVIoY291bnRfZG9jLApAQCAtMjkyOSw0NSArMjkyOSw0NSBAQAogaW50ZWdlcnMgc3RhcnRpbmcgZnJvbSB6ZXJvIG9yLCBpZiBzcGVjaWZpZWQsIGZyb20gZmlyc3R2YWwuIik7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgY291bnRfdHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKLQkiaXRlcnRvb2xzLmNvdW50IiwJCS8qIHRwX25hbWUgKi8KLQlzaXplb2YoY291bnRvYmplY3QpLAkJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpY291bnRfZGVhbGxvYywJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkvKiB0cF9jb21wYXJlICovCi0JKHJlcHJmdW5jKWNvdW50X3JlcHIsCQkvKiB0cF9yZXByICovCi0JMCwJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkvKiB0cF9zdHIgKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCwJCS8qIHRwX2ZsYWdzICovCi0JY291bnRfZG9jLAkJCS8qIHRwX2RvYyAqLwotCTAsCQkJCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JUHlPYmplY3RfU2VsZkl0ZXIsCQkvKiB0cF9pdGVyICovCi0JKGl0ZXJuZXh0ZnVuYyljb3VudF9uZXh0LAkvKiB0cF9pdGVybmV4dCAqLwotCWNvdW50X21ldGhvZHMsCQkJCS8qIHRwX21ldGhvZHMgKi8KLQkwLAkJCQkvKiB0cF9tZW1iZXJzICovCi0JMCwJCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCS8qIHRwX2RpY3QgKi8KLQkwLAkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KLQkwLAkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCi0JMCwJCQkJLyogdHBfaW5pdCAqLwotCTAsCQkJCS8qIHRwX2FsbG9jICovCi0JY291bnRfbmV3LAkJCS8qIHRwX25ldyAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQorICAgICJpdGVydG9vbHMuY291bnQiLCAgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICBzaXplb2YoY291bnRvYmplY3QpLCAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3Rvciljb3VudF9kZWFsbG9jLCAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAocmVwcmZ1bmMpY291bnRfcmVwciwgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICBjb3VudF9kb2MsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIFB5T2JqZWN0X1NlbGZJdGVyLCAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAoaXRlcm5leHRmdW5jKWNvdW50X25leHQsICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIGNvdW50X21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBjb3VudF9uZXcsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KIH07CiAKIApAQCAtMjk3NiwxMCArMjk3NiwxMCBAQAogI2luY2x1ZGUgIlB5dGhvbi5oIgogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCVB5X3NzaXplX3QJdHVwbGVzaXplOwotCVB5T2JqZWN0ICppdHR1cGxlOwkJLyogdHVwbGUgb2YgaXRlcmF0b3JzICovCi0JUHlPYmplY3QgKnJlc3VsdDsKKyAgICBQeU9iamVjdF9IRUFECisgICAgUHlfc3NpemVfdCAgICAgICAgICB0dXBsZXNpemU7CisgICAgUHlPYmplY3QgKml0dHVwbGU7ICAgICAgICAgICAgICAgICAgLyogdHVwbGUgb2YgaXRlcmF0b3JzICovCisgICAgUHlPYmplY3QgKnJlc3VsdDsKIH0gaXppcG9iamVjdDsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBpemlwX3R5cGU7CkBAIC0yOTg3LDEyMCArMjk4NywxMjAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBpemlwX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlpemlwb2JqZWN0ICpsejsKLQlQeV9zc2l6ZV90IGk7Ci0JUHlPYmplY3QgKml0dHVwbGU7ICAvKiB0dXBsZSBvZiBpdGVyYXRvcnMgKi8KLQlQeU9iamVjdCAqcmVzdWx0OwotCVB5X3NzaXplX3QgdHVwbGVzaXplID0gUHlTZXF1ZW5jZV9MZW5ndGgoYXJncyk7CisgICAgaXppcG9iamVjdCAqbHo7CisgICAgUHlfc3NpemVfdCBpOworICAgIFB5T2JqZWN0ICppdHR1cGxlOyAgLyogdHVwbGUgb2YgaXRlcmF0b3JzICovCisgICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICBQeV9zc2l6ZV90IHR1cGxlc2l6ZSA9IFB5U2VxdWVuY2VfTGVuZ3RoKGFyZ3MpOwogCi0JaWYgKHR5cGUgPT0gJml6aXBfdHlwZSAmJiAhX1B5QXJnX05vS2V5d29yZHMoIml6aXAoKSIsIGt3ZHMpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAodHlwZSA9PSAmaXppcF90eXBlICYmICFfUHlBcmdfTm9LZXl3b3JkcygiaXppcCgpIiwga3dkcykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JLyogYXJncyBtdXN0IGJlIGEgdHVwbGUgKi8KLQlhc3NlcnQoUHlUdXBsZV9DaGVjayhhcmdzKSk7CisgICAgLyogYXJncyBtdXN0IGJlIGEgdHVwbGUgKi8KKyAgICBhc3NlcnQoUHlUdXBsZV9DaGVjayhhcmdzKSk7CiAKLQkvKiBvYnRhaW4gaXRlcmF0b3JzICovCi0JaXR0dXBsZSA9IFB5VHVwbGVfTmV3KHR1cGxlc2l6ZSk7Ci0JaWYgKGl0dHVwbGUgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JZm9yIChpPTA7IGkgPCB0dXBsZXNpemU7ICsraSkgewotCQlQeU9iamVjdCAqaXRlbSA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgaSk7Ci0JCVB5T2JqZWN0ICppdCA9IFB5T2JqZWN0X0dldEl0ZXIoaXRlbSk7Ci0JCWlmIChpdCA9PSBOVUxMKSB7Ci0JCQlpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19UeXBlRXJyb3IpKQotCQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkJICAgICJpemlwIGFyZ3VtZW50ICMlemQgbXVzdCBzdXBwb3J0IGl0ZXJhdGlvbiIsCi0JCQkJICAgIGkrMSk7Ci0JCQlQeV9ERUNSRUYoaXR0dXBsZSk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlQeVR1cGxlX1NFVF9JVEVNKGl0dHVwbGUsIGksIGl0KTsKLQl9CisgICAgLyogb2J0YWluIGl0ZXJhdG9ycyAqLworICAgIGl0dHVwbGUgPSBQeVR1cGxlX05ldyh0dXBsZXNpemUpOworICAgIGlmIChpdHR1cGxlID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGZvciAoaT0wOyBpIDwgdHVwbGVzaXplOyArK2kpIHsKKyAgICAgICAgUHlPYmplY3QgKml0ZW0gPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIGkpOworICAgICAgICBQeU9iamVjdCAqaXQgPSBQeU9iamVjdF9HZXRJdGVyKGl0ZW0pOworICAgICAgICBpZiAoaXQgPT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfVHlwZUVycm9yKSkKKyAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAiaXppcCBhcmd1bWVudCAjJXpkIG11c3Qgc3VwcG9ydCBpdGVyYXRpb24iLAorICAgICAgICAgICAgICAgICAgICBpKzEpOworICAgICAgICAgICAgUHlfREVDUkVGKGl0dHVwbGUpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShpdHR1cGxlLCBpLCBpdCk7CisgICAgfQogCi0JLyogY3JlYXRlIGEgcmVzdWx0IGhvbGRlciAqLwotCXJlc3VsdCA9IFB5VHVwbGVfTmV3KHR1cGxlc2l6ZSk7Ci0JaWYgKHJlc3VsdCA9PSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRihpdHR1cGxlKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWZvciAoaT0wIDsgaSA8IHR1cGxlc2l6ZSA7IGkrKykgewotCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCVB5VHVwbGVfU0VUX0lURU0ocmVzdWx0LCBpLCBQeV9Ob25lKTsKLQl9CisgICAgLyogY3JlYXRlIGEgcmVzdWx0IGhvbGRlciAqLworICAgIHJlc3VsdCA9IFB5VHVwbGVfTmV3KHR1cGxlc2l6ZSk7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihpdHR1cGxlKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGZvciAoaT0wIDsgaSA8IHR1cGxlc2l6ZSA7IGkrKykgeworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIFB5VHVwbGVfU0VUX0lURU0ocmVzdWx0LCBpLCBQeV9Ob25lKTsKKyAgICB9CiAKLQkvKiBjcmVhdGUgaXppcG9iamVjdCBzdHJ1Y3R1cmUgKi8KLQlseiA9IChpemlwb2JqZWN0ICopdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7Ci0JaWYgKGx6ID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKGl0dHVwbGUpOwotCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWx6LT5pdHR1cGxlID0gaXR0dXBsZTsKLQlsei0+dHVwbGVzaXplID0gdHVwbGVzaXplOwotCWx6LT5yZXN1bHQgPSByZXN1bHQ7CisgICAgLyogY3JlYXRlIGl6aXBvYmplY3Qgc3RydWN0dXJlICovCisgICAgbHogPSAoaXppcG9iamVjdCAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOworICAgIGlmIChseiA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihpdHR1cGxlKTsKKyAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBsei0+aXR0dXBsZSA9IGl0dHVwbGU7CisgICAgbHotPnR1cGxlc2l6ZSA9IHR1cGxlc2l6ZTsKKyAgICBsei0+cmVzdWx0ID0gcmVzdWx0OwogCi0JcmV0dXJuIChQeU9iamVjdCAqKWx6OworICAgIHJldHVybiAoUHlPYmplY3QgKilsejsKIH0KIAogc3RhdGljIHZvaWQKIGl6aXBfZGVhbGxvYyhpemlwb2JqZWN0ICpseikKIHsKLQlQeU9iamVjdF9HQ19VblRyYWNrKGx6KTsKLQlQeV9YREVDUkVGKGx6LT5pdHR1cGxlKTsKLQlQeV9YREVDUkVGKGx6LT5yZXN1bHQpOwotCVB5X1RZUEUobHopLT50cF9mcmVlKGx6KTsKKyAgICBQeU9iamVjdF9HQ19VblRyYWNrKGx6KTsKKyAgICBQeV9YREVDUkVGKGx6LT5pdHR1cGxlKTsKKyAgICBQeV9YREVDUkVGKGx6LT5yZXN1bHQpOworICAgIFB5X1RZUEUobHopLT50cF9mcmVlKGx6KTsKIH0KIAogc3RhdGljIGludAogaXppcF90cmF2ZXJzZShpemlwb2JqZWN0ICpseiwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JUHlfVklTSVQobHotPml0dHVwbGUpOwotCVB5X1ZJU0lUKGx6LT5yZXN1bHQpOwotCXJldHVybiAwOworICAgIFB5X1ZJU0lUKGx6LT5pdHR1cGxlKTsKKyAgICBQeV9WSVNJVChsei0+cmVzdWx0KTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGl6aXBfbmV4dChpemlwb2JqZWN0ICpseikKIHsKLQlQeV9zc2l6ZV90IGk7Ci0JUHlfc3NpemVfdCB0dXBsZXNpemUgPSBsei0+dHVwbGVzaXplOwotCVB5T2JqZWN0ICpyZXN1bHQgPSBsei0+cmVzdWx0OwotCVB5T2JqZWN0ICppdDsKLQlQeU9iamVjdCAqaXRlbTsKLQlQeU9iamVjdCAqb2xkaXRlbTsKKyAgICBQeV9zc2l6ZV90IGk7CisgICAgUHlfc3NpemVfdCB0dXBsZXNpemUgPSBsei0+dHVwbGVzaXplOworICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBsei0+cmVzdWx0OworICAgIFB5T2JqZWN0ICppdDsKKyAgICBQeU9iamVjdCAqaXRlbTsKKyAgICBQeU9iamVjdCAqb2xkaXRlbTsKIAotCWlmICh0dXBsZXNpemUgPT0gMCkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKFB5X1JFRkNOVChyZXN1bHQpID09IDEpIHsKLQkJUHlfSU5DUkVGKHJlc3VsdCk7Ci0JCWZvciAoaT0wIDsgaSA8IHR1cGxlc2l6ZSA7IGkrKykgewotCQkJaXQgPSBQeVR1cGxlX0dFVF9JVEVNKGx6LT5pdHR1cGxlLCBpKTsKLQkJCWFzc2VydChQeUl0ZXJfQ2hlY2soaXQpKTsKLQkJCWl0ZW0gPSAoKlB5X1RZUEUoaXQpLT50cF9pdGVybmV4dCkoaXQpOwotCQkJaWYgKGl0ZW0gPT0gTlVMTCkgewotCQkJCVB5X0RFQ1JFRihyZXN1bHQpOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQkJb2xkaXRlbSA9IFB5VHVwbGVfR0VUX0lURU0ocmVzdWx0LCBpKTsKLQkJCVB5VHVwbGVfU0VUX0lURU0ocmVzdWx0LCBpLCBpdGVtKTsKLQkJCVB5X0RFQ1JFRihvbGRpdGVtKTsKLQkJfQotCX0gZWxzZSB7Ci0JCXJlc3VsdCA9IFB5VHVwbGVfTmV3KHR1cGxlc2l6ZSk7Ci0JCWlmIChyZXN1bHQgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQlmb3IgKGk9MCA7IGkgPCB0dXBsZXNpemUgOyBpKyspIHsKLQkJCWl0ID0gUHlUdXBsZV9HRVRfSVRFTShsei0+aXR0dXBsZSwgaSk7Ci0JCQlhc3NlcnQoUHlJdGVyX0NoZWNrKGl0KSk7Ci0JCQlpdGVtID0gKCpQeV9UWVBFKGl0KS0+dHBfaXRlcm5leHQpKGl0KTsKLQkJCWlmIChpdGVtID09IE5VTEwpIHsKLQkJCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJCVB5VHVwbGVfU0VUX0lURU0ocmVzdWx0LCBpLCBpdGVtKTsKLQkJfQotCX0KLQlyZXR1cm4gcmVzdWx0OworICAgIGlmICh0dXBsZXNpemUgPT0gMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKFB5X1JFRkNOVChyZXN1bHQpID09IDEpIHsKKyAgICAgICAgUHlfSU5DUkVGKHJlc3VsdCk7CisgICAgICAgIGZvciAoaT0wIDsgaSA8IHR1cGxlc2l6ZSA7IGkrKykgeworICAgICAgICAgICAgaXQgPSBQeVR1cGxlX0dFVF9JVEVNKGx6LT5pdHR1cGxlLCBpKTsKKyAgICAgICAgICAgIGFzc2VydChQeUl0ZXJfQ2hlY2soaXQpKTsKKyAgICAgICAgICAgIGl0ZW0gPSAoKlB5X1RZUEUoaXQpLT50cF9pdGVybmV4dCkoaXQpOworICAgICAgICAgICAgaWYgKGl0ZW0gPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb2xkaXRlbSA9IFB5VHVwbGVfR0VUX0lURU0ocmVzdWx0LCBpKTsKKyAgICAgICAgICAgIFB5VHVwbGVfU0VUX0lURU0ocmVzdWx0LCBpLCBpdGVtKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihvbGRpdGVtKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHJlc3VsdCA9IFB5VHVwbGVfTmV3KHR1cGxlc2l6ZSk7CisgICAgICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBmb3IgKGk9MCA7IGkgPCB0dXBsZXNpemUgOyBpKyspIHsKKyAgICAgICAgICAgIGl0ID0gUHlUdXBsZV9HRVRfSVRFTShsei0+aXR0dXBsZSwgaSk7CisgICAgICAgICAgICBhc3NlcnQoUHlJdGVyX0NoZWNrKGl0KSk7CisgICAgICAgICAgICBpdGVtID0gKCpQeV9UWVBFKGl0KS0+dHBfaXRlcm5leHQpKGl0KTsKKyAgICAgICAgICAgIGlmIChpdGVtID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5VHVwbGVfU0VUX0lURU0ocmVzdWx0LCBpLCBpdGVtKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBQeURvY19TVFJWQVIoaXppcF9kb2MsCkBAIC0zMTE0LDU2ICszMTE0LDU2IEBACiBhIGxpc3QuIik7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgaXppcF90eXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotCSJpdGVydG9vbHMuaXppcCIsCQkvKiB0cF9uYW1lICovCi0Jc2l6ZW9mKGl6aXBvYmplY3QpLAkJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpaXppcF9kZWFsbG9jLAkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkwLAkJCQkvKiB0cF9yZXByICovCi0JMCwJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkvKiB0cF9zdHIgKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQyB8Ci0JCVB5X1RQRkxBR1NfQkFTRVRZUEUsCS8qIHRwX2ZsYWdzICovCi0JaXppcF9kb2MsCQkJLyogdHBfZG9jICovCi0JKHRyYXZlcnNlcHJvYylpemlwX3RyYXZlcnNlLCAgICAvKiB0cF90cmF2ZXJzZSAqLwotCTAsCQkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCVB5T2JqZWN0X1NlbGZJdGVyLAkJLyogdHBfaXRlciAqLwotCShpdGVybmV4dGZ1bmMpaXppcF9uZXh0LAkvKiB0cF9pdGVybmV4dCAqLwotCTAsCQkJCS8qIHRwX21ldGhvZHMgKi8KLQkwLAkJCQkvKiB0cF9tZW1iZXJzICovCi0JMCwJCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCS8qIHRwX2RpY3QgKi8KLQkwLAkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KLQkwLAkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCi0JMCwJCQkJLyogdHBfaW5pdCAqLwotCTAsCQkJCS8qIHRwX2FsbG9jICovCi0JaXppcF9uZXcsCQkJLyogdHBfbmV3ICovCi0JUHlPYmplY3RfR0NfRGVsLAkJLyogdHBfZnJlZSAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQorICAgICJpdGVydG9vbHMuaXppcCIsICAgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICBzaXplb2YoaXppcG9iamVjdCksICAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcilpemlwX2RlYWxsb2MsICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDIHwKKyAgICAgICAgUHlfVFBGTEFHU19CQVNFVFlQRSwgICAgICAgICAgICAvKiB0cF9mbGFncyAqLworICAgIGl6aXBfZG9jLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2MpaXppcF90cmF2ZXJzZSwgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICBQeU9iamVjdF9TZWxmSXRlciwgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgKGl0ZXJuZXh0ZnVuYylpemlwX25leHQsICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIGl6aXBfbmV3LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworICAgIFB5T2JqZWN0X0dDX0RlbCwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KIH07CiAKIAogLyogcmVwZWF0IG9iamVjdCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JUHlPYmplY3QgKmVsZW1lbnQ7Ci0JUHlfc3NpemVfdCBjbnQ7CisgICAgUHlPYmplY3RfSEVBRAorICAgIFB5T2JqZWN0ICplbGVtZW50OworICAgIFB5X3NzaXplX3QgY250OwogfSByZXBlYXRvYmplY3Q7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgcmVwZWF0X3R5cGU7CkBAIC0zMTcxLDg4ICszMTcxLDg4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogcmVwZWF0X25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlyZXBlYXRvYmplY3QgKnJvOwotCVB5T2JqZWN0ICplbGVtZW50OwotCVB5X3NzaXplX3QgY250ID0gLTE7CisgICAgcmVwZWF0b2JqZWN0ICpybzsKKyAgICBQeU9iamVjdCAqZWxlbWVudDsKKyAgICBQeV9zc2l6ZV90IGNudCA9IC0xOwogCi0JaWYgKHR5cGUgPT0gJnJlcGVhdF90eXBlICYmICFfUHlBcmdfTm9LZXl3b3JkcygicmVwZWF0KCkiLCBrd2RzKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKHR5cGUgPT0gJnJlcGVhdF90eXBlICYmICFfUHlBcmdfTm9LZXl3b3JkcygicmVwZWF0KCkiLCBrd2RzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98bjpyZXBlYXQiLCAmZWxlbWVudCwgJmNudCkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3xuOnJlcGVhdCIsICZlbGVtZW50LCAmY250KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoUHlUdXBsZV9TaXplKGFyZ3MpID09IDIgJiYgY250IDwgMCkKLQkJY250ID0gMDsKKyAgICBpZiAoUHlUdXBsZV9TaXplKGFyZ3MpID09IDIgJiYgY250IDwgMCkKKyAgICAgICAgY250ID0gMDsKIAotCXJvID0gKHJlcGVhdG9iamVjdCAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOwotCWlmIChybyA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlQeV9JTkNSRUYoZWxlbWVudCk7Ci0Jcm8tPmVsZW1lbnQgPSBlbGVtZW50OwotCXJvLT5jbnQgPSBjbnQ7Ci0JcmV0dXJuIChQeU9iamVjdCAqKXJvOworICAgIHJvID0gKHJlcGVhdG9iamVjdCAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOworICAgIGlmIChybyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQeV9JTkNSRUYoZWxlbWVudCk7CisgICAgcm8tPmVsZW1lbnQgPSBlbGVtZW50OworICAgIHJvLT5jbnQgPSBjbnQ7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKXJvOwogfQogCiBzdGF0aWMgdm9pZAogcmVwZWF0X2RlYWxsb2MocmVwZWF0b2JqZWN0ICpybykKIHsKLQlQeU9iamVjdF9HQ19VblRyYWNrKHJvKTsKLQlQeV9YREVDUkVGKHJvLT5lbGVtZW50KTsKLQlQeV9UWVBFKHJvKS0+dHBfZnJlZShybyk7CisgICAgUHlPYmplY3RfR0NfVW5UcmFjayhybyk7CisgICAgUHlfWERFQ1JFRihyby0+ZWxlbWVudCk7CisgICAgUHlfVFlQRShybyktPnRwX2ZyZWUocm8pOwogfQogCiBzdGF0aWMgaW50CiByZXBlYXRfdHJhdmVyc2UocmVwZWF0b2JqZWN0ICpybywgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JUHlfVklTSVQocm8tPmVsZW1lbnQpOwotCXJldHVybiAwOworICAgIFB5X1ZJU0lUKHJvLT5lbGVtZW50KTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHJlcGVhdF9uZXh0KHJlcGVhdG9iamVjdCAqcm8pCiB7Ci0JaWYgKHJvLT5jbnQgPT0gMCkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKHJvLT5jbnQgPiAwKQotCQlyby0+Y250LS07Ci0JUHlfSU5DUkVGKHJvLT5lbGVtZW50KTsKLQlyZXR1cm4gcm8tPmVsZW1lbnQ7CisgICAgaWYgKHJvLT5jbnQgPT0gMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKHJvLT5jbnQgPiAwKQorICAgICAgICByby0+Y250LS07CisgICAgUHlfSU5DUkVGKHJvLT5lbGVtZW50KTsKKyAgICByZXR1cm4gcm8tPmVsZW1lbnQ7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiByZXBlYXRfcmVwcihyZXBlYXRvYmplY3QgKnJvKQogewotCVB5T2JqZWN0ICpyZXN1bHQsICpvYmpyZXByOworICAgIFB5T2JqZWN0ICpyZXN1bHQsICpvYmpyZXByOwogCi0Jb2JqcmVwciA9IFB5T2JqZWN0X1JlcHIocm8tPmVsZW1lbnQpOwotCWlmIChvYmpyZXByID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIG9ianJlcHIgPSBQeU9iamVjdF9SZXByKHJvLT5lbGVtZW50KTsKKyAgICBpZiAob2JqcmVwciA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChyby0+Y250ID09IC0xKQotCQlyZXN1bHQgPSBQeVN0cmluZ19Gcm9tRm9ybWF0KCJyZXBlYXQoJXMpIiwKLQkJCVB5U3RyaW5nX0FTX1NUUklORyhvYmpyZXByKSk7Ci0JZWxzZQotCQlyZXN1bHQgPSBQeVN0cmluZ19Gcm9tRm9ybWF0KCJyZXBlYXQoJXMsICV6ZCkiLAotCQkJUHlTdHJpbmdfQVNfU1RSSU5HKG9ianJlcHIpLCByby0+Y250KTsKLQlQeV9ERUNSRUYob2JqcmVwcik7Ci0JcmV0dXJuIHJlc3VsdDsKLX0JCisgICAgaWYgKHJvLT5jbnQgPT0gLTEpCisgICAgICAgIHJlc3VsdCA9IFB5U3RyaW5nX0Zyb21Gb3JtYXQoInJlcGVhdCglcykiLAorICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKG9ianJlcHIpKTsKKyAgICBlbHNlCisgICAgICAgIHJlc3VsdCA9IFB5U3RyaW5nX0Zyb21Gb3JtYXQoInJlcGVhdCglcywgJXpkKSIsCisgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcob2JqcmVwciksIHJvLT5jbnQpOworICAgIFB5X0RFQ1JFRihvYmpyZXByKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQogCiBzdGF0aWMgUHlPYmplY3QgKgogcmVwZWF0X2xlbihyZXBlYXRvYmplY3QgKnJvKQogewotICAgICAgICBpZiAocm8tPmNudCA9PSAtMSkgewotICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJsZW4oKSBvZiB1bnNpemVkIG9iamVjdCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0gICAgICAgIHJldHVybiBQeUludF9Gcm9tU2l6ZV90KHJvLT5jbnQpOworICAgIGlmIChyby0+Y250ID09IC0xKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJsZW4oKSBvZiB1bnNpemVkIG9iamVjdCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIFB5SW50X0Zyb21TaXplX3Qocm8tPmNudCk7CiB9CiAKIFB5RG9jX1NUUlZBUihsZW5ndGhfaGludF9kb2MsICJQcml2YXRlIG1ldGhvZCByZXR1cm5pbmcgYW4gZXN0aW1hdGUgb2YgbGVuKGxpc3QoaXQpKS4iKTsKIAogc3RhdGljIFB5TWV0aG9kRGVmIHJlcGVhdF9tZXRob2RzW10gPSB7Ci0JeyJfX2xlbmd0aF9oaW50X18iLCAoUHlDRnVuY3Rpb24pcmVwZWF0X2xlbiwgTUVUSF9OT0FSR1MsIGxlbmd0aF9oaW50X2RvY30sCi0gCXtOVUxMLAkJTlVMTH0JCS8qIHNlbnRpbmVsICovCisgICAgeyJfX2xlbmd0aF9oaW50X18iLCAoUHlDRnVuY3Rpb24pcmVwZWF0X2xlbiwgTUVUSF9OT0FSR1MsIGxlbmd0aF9oaW50X2RvY30sCisgICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIFB5RG9jX1NUUlZBUihyZXBlYXRfZG9jLApAQCAtMzI2MSw0NyArMzI2MSw0NyBAQAogZW5kbGVzc2x5LiIpOwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IHJlcGVhdF90eXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotCSJpdGVydG9vbHMucmVwZWF0IiwJCS8qIHRwX25hbWUgKi8KLQlzaXplb2YocmVwZWF0b2JqZWN0KSwJCS8qIHRwX2Jhc2ljc2l6ZSAqLwotCTAsCQkJCS8qIHRwX2l0ZW1zaXplICovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKXJlcGVhdF9kZWFsbG9jLAkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkocmVwcmZ1bmMpcmVwZWF0X3JlcHIsCQkvKiB0cF9yZXByICovCi0JMCwJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkvKiB0cF9zdHIgKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQyB8Ci0JCVB5X1RQRkxBR1NfQkFTRVRZUEUsCS8qIHRwX2ZsYWdzICovCi0JcmVwZWF0X2RvYywJCQkvKiB0cF9kb2MgKi8KLQkodHJhdmVyc2Vwcm9jKXJlcGVhdF90cmF2ZXJzZSwJLyogdHBfdHJhdmVyc2UgKi8KLQkwLAkJCQkvKiB0cF9jbGVhciAqLwotCTAsCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQlQeU9iamVjdF9TZWxmSXRlciwJCS8qIHRwX2l0ZXIgKi8KLQkoaXRlcm5leHRmdW5jKXJlcGVhdF9uZXh0LAkvKiB0cF9pdGVybmV4dCAqLwotCXJlcGVhdF9tZXRob2RzLAkJCS8qIHRwX21ldGhvZHMgKi8KLQkwLAkJCQkvKiB0cF9tZW1iZXJzICovCi0JMCwJCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCS8qIHRwX2RpY3QgKi8KLQkwLAkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KLQkwLAkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCi0JMCwJCQkJLyogdHBfaW5pdCAqLwotCTAsCQkJCS8qIHRwX2FsbG9jICovCi0JcmVwZWF0X25ldywJCQkvKiB0cF9uZXcgKi8KLQlQeU9iamVjdF9HQ19EZWwsCQkvKiB0cF9mcmVlICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisgICAgIml0ZXJ0b29scy5yZXBlYXQiLCAgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgIHNpemVvZihyZXBlYXRvYmplY3QpLCAgICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKXJlcGVhdF9kZWFsbG9jLCAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIChyZXByZnVuYylyZXBlYXRfcmVwciwgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MgfAorICAgICAgICBQeV9UUEZMQUdTX0JBU0VUWVBFLCAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCisgICAgcmVwZWF0X2RvYywgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgKHRyYXZlcnNlcHJvYylyZXBlYXRfdHJhdmVyc2UsICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICBQeU9iamVjdF9TZWxmSXRlciwgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgKGl0ZXJuZXh0ZnVuYylyZXBlYXRfbmV4dCwgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICByZXBlYXRfbWV0aG9kcywgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIHJlcGVhdF9uZXcsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworICAgIFB5T2JqZWN0X0dDX0RlbCwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KIH07CiAKIC8qIGl6aXBsb25nZXN0IG9iamVjdCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0zMzA5LDEyICszMzA5LDEyIEBACiAjaW5jbHVkZSAiUHl0aG9uLmgiCiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JUHlfc3NpemVfdCB0dXBsZXNpemU7Ci0JUHlfc3NpemVfdCBudW1hY3RpdmU7CQotCVB5T2JqZWN0ICppdHR1cGxlOwkJLyogdHVwbGUgb2YgaXRlcmF0b3JzICovCi0JUHlPYmplY3QgKnJlc3VsdDsKLQlQeU9iamVjdCAqZmlsbHZhbHVlOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBQeV9zc2l6ZV90IHR1cGxlc2l6ZTsKKyAgICBQeV9zc2l6ZV90IG51bWFjdGl2ZTsKKyAgICBQeU9iamVjdCAqaXR0dXBsZTsgICAgICAgICAgICAgICAgICAvKiB0dXBsZSBvZiBpdGVyYXRvcnMgKi8KKyAgICBQeU9iamVjdCAqcmVzdWx0OworICAgIFB5T2JqZWN0ICpmaWxsdmFsdWU7CiB9IGl6aXBsb25nZXN0b2JqZWN0OwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IGl6aXBsb25nZXN0X3R5cGU7CkBAIC0zMzIyLDE2MSArMzMyMiwxNjEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBpemlwX2xvbmdlc3RfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCWl6aXBsb25nZXN0b2JqZWN0ICpsejsKLQlQeV9zc2l6ZV90IGk7Ci0JUHlPYmplY3QgKml0dHVwbGU7ICAvKiB0dXBsZSBvZiBpdGVyYXRvcnMgKi8KLQlQeU9iamVjdCAqcmVzdWx0OwotCVB5T2JqZWN0ICpmaWxsdmFsdWUgPSBQeV9Ob25lOwotCVB5X3NzaXplX3QgdHVwbGVzaXplID0gUHlTZXF1ZW5jZV9MZW5ndGgoYXJncyk7CisgICAgaXppcGxvbmdlc3RvYmplY3QgKmx6OworICAgIFB5X3NzaXplX3QgaTsKKyAgICBQeU9iamVjdCAqaXR0dXBsZTsgIC8qIHR1cGxlIG9mIGl0ZXJhdG9ycyAqLworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisgICAgUHlPYmplY3QgKmZpbGx2YWx1ZSA9IFB5X05vbmU7CisgICAgUHlfc3NpemVfdCB0dXBsZXNpemUgPSBQeVNlcXVlbmNlX0xlbmd0aChhcmdzKTsKIAotICAgICAgICBpZiAoa3dkcyAhPSBOVUxMICYmIFB5RGljdF9DaGVja0V4YWN0KGt3ZHMpICYmIFB5RGljdF9TaXplKGt3ZHMpID4gMCkgewotICAgICAgICAgICAgICAgIGZpbGx2YWx1ZSA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKGt3ZHMsICJmaWxsdmFsdWUiKTsKLSAgICAgICAgICAgICAgICBpZiAoZmlsbHZhbHVlID09IE5VTEwgIHx8ICBQeURpY3RfU2l6ZShrd2RzKSA+IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJIml6aXBfbG9uZ2VzdCgpIGdvdCBhbiB1bmV4cGVjdGVkIGtleXdvcmQgYXJndW1lbnQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB9CisgICAgaWYgKGt3ZHMgIT0gTlVMTCAmJiBQeURpY3RfQ2hlY2tFeGFjdChrd2RzKSAmJiBQeURpY3RfU2l6ZShrd2RzKSA+IDApIHsKKyAgICAgICAgZmlsbHZhbHVlID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoa3dkcywgImZpbGx2YWx1ZSIpOworICAgICAgICBpZiAoZmlsbHZhbHVlID09IE5VTEwgIHx8ICBQeURpY3RfU2l6ZShrd2RzKSA+IDEpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgIml6aXBfbG9uZ2VzdCgpIGdvdCBhbiB1bmV4cGVjdGVkIGtleXdvcmQgYXJndW1lbnQiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9CisgICAgfQogCi0JLyogYXJncyBtdXN0IGJlIGEgdHVwbGUgKi8KLQlhc3NlcnQoUHlUdXBsZV9DaGVjayhhcmdzKSk7CisgICAgLyogYXJncyBtdXN0IGJlIGEgdHVwbGUgKi8KKyAgICBhc3NlcnQoUHlUdXBsZV9DaGVjayhhcmdzKSk7CiAKLQkvKiBvYnRhaW4gaXRlcmF0b3JzICovCi0JaXR0dXBsZSA9IFB5VHVwbGVfTmV3KHR1cGxlc2l6ZSk7Ci0JaWYgKGl0dHVwbGUgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JZm9yIChpPTA7IGkgPCB0dXBsZXNpemU7ICsraSkgewotCQlQeU9iamVjdCAqaXRlbSA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgaSk7Ci0JCVB5T2JqZWN0ICppdCA9IFB5T2JqZWN0X0dldEl0ZXIoaXRlbSk7Ci0JCWlmIChpdCA9PSBOVUxMKSB7Ci0JCQlpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19UeXBlRXJyb3IpKQotCQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkJICAgICJpemlwX2xvbmdlc3QgYXJndW1lbnQgIyV6ZCBtdXN0IHN1cHBvcnQgaXRlcmF0aW9uIiwKLQkJCQkgICAgaSsxKTsKLQkJCVB5X0RFQ1JFRihpdHR1cGxlKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCVB5VHVwbGVfU0VUX0lURU0oaXR0dXBsZSwgaSwgaXQpOwotCX0KKyAgICAvKiBvYnRhaW4gaXRlcmF0b3JzICovCisgICAgaXR0dXBsZSA9IFB5VHVwbGVfTmV3KHR1cGxlc2l6ZSk7CisgICAgaWYgKGl0dHVwbGUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZm9yIChpPTA7IGkgPCB0dXBsZXNpemU7ICsraSkgeworICAgICAgICBQeU9iamVjdCAqaXRlbSA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgaSk7CisgICAgICAgIFB5T2JqZWN0ICppdCA9IFB5T2JqZWN0X0dldEl0ZXIoaXRlbSk7CisgICAgICAgIGlmIChpdCA9PSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19UeXBlRXJyb3IpKQorICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICJpemlwX2xvbmdlc3QgYXJndW1lbnQgIyV6ZCBtdXN0IHN1cHBvcnQgaXRlcmF0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgaSsxKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihpdHR1cGxlKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIFB5VHVwbGVfU0VUX0lURU0oaXR0dXBsZSwgaSwgaXQpOworICAgIH0KIAotCS8qIGNyZWF0ZSBhIHJlc3VsdCBob2xkZXIgKi8KLQlyZXN1bHQgPSBQeVR1cGxlX05ldyh0dXBsZXNpemUpOwotCWlmIChyZXN1bHQgPT0gTlVMTCkgewotCQlQeV9ERUNSRUYoaXR0dXBsZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlmb3IgKGk9MCA7IGkgPCB0dXBsZXNpemUgOyBpKyspIHsKLQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQlQeVR1cGxlX1NFVF9JVEVNKHJlc3VsdCwgaSwgUHlfTm9uZSk7Ci0JfQorICAgIC8qIGNyZWF0ZSBhIHJlc3VsdCBob2xkZXIgKi8KKyAgICByZXN1bHQgPSBQeVR1cGxlX05ldyh0dXBsZXNpemUpOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYoaXR0dXBsZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBmb3IgKGk9MCA7IGkgPCB0dXBsZXNpemUgOyBpKyspIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKHJlc3VsdCwgaSwgUHlfTm9uZSk7CisgICAgfQogCi0JLyogY3JlYXRlIGl6aXBsb25nZXN0b2JqZWN0IHN0cnVjdHVyZSAqLwotCWx6ID0gKGl6aXBsb25nZXN0b2JqZWN0ICopdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7Ci0JaWYgKGx6ID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKGl0dHVwbGUpOwotCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWx6LT5pdHR1cGxlID0gaXR0dXBsZTsKLQlsei0+dHVwbGVzaXplID0gdHVwbGVzaXplOwotCWx6LT5udW1hY3RpdmUgPSB0dXBsZXNpemU7Ci0JbHotPnJlc3VsdCA9IHJlc3VsdDsKLQlQeV9JTkNSRUYoZmlsbHZhbHVlKTsKLQlsei0+ZmlsbHZhbHVlID0gZmlsbHZhbHVlOwotCXJldHVybiAoUHlPYmplY3QgKilsejsKKyAgICAvKiBjcmVhdGUgaXppcGxvbmdlc3RvYmplY3Qgc3RydWN0dXJlICovCisgICAgbHogPSAoaXppcGxvbmdlc3RvYmplY3QgKil0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKKyAgICBpZiAobHogPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYoaXR0dXBsZSk7CisgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgbHotPml0dHVwbGUgPSBpdHR1cGxlOworICAgIGx6LT50dXBsZXNpemUgPSB0dXBsZXNpemU7CisgICAgbHotPm51bWFjdGl2ZSA9IHR1cGxlc2l6ZTsKKyAgICBsei0+cmVzdWx0ID0gcmVzdWx0OworICAgIFB5X0lOQ1JFRihmaWxsdmFsdWUpOworICAgIGx6LT5maWxsdmFsdWUgPSBmaWxsdmFsdWU7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWx6OwogfQogCiBzdGF0aWMgdm9pZAogaXppcF9sb25nZXN0X2RlYWxsb2MoaXppcGxvbmdlc3RvYmplY3QgKmx6KQogewotCVB5T2JqZWN0X0dDX1VuVHJhY2sobHopOwotCVB5X1hERUNSRUYobHotPml0dHVwbGUpOwotCVB5X1hERUNSRUYobHotPnJlc3VsdCk7Ci0JUHlfWERFQ1JFRihsei0+ZmlsbHZhbHVlKTsKLQlQeV9UWVBFKGx6KS0+dHBfZnJlZShseik7CisgICAgUHlPYmplY3RfR0NfVW5UcmFjayhseik7CisgICAgUHlfWERFQ1JFRihsei0+aXR0dXBsZSk7CisgICAgUHlfWERFQ1JFRihsei0+cmVzdWx0KTsKKyAgICBQeV9YREVDUkVGKGx6LT5maWxsdmFsdWUpOworICAgIFB5X1RZUEUobHopLT50cF9mcmVlKGx6KTsKIH0KIAogc3RhdGljIGludAogaXppcF9sb25nZXN0X3RyYXZlcnNlKGl6aXBsb25nZXN0b2JqZWN0ICpseiwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JUHlfVklTSVQobHotPml0dHVwbGUpOwotCVB5X1ZJU0lUKGx6LT5yZXN1bHQpOwotCVB5X1ZJU0lUKGx6LT5maWxsdmFsdWUpOwotCXJldHVybiAwOworICAgIFB5X1ZJU0lUKGx6LT5pdHR1cGxlKTsKKyAgICBQeV9WSVNJVChsei0+cmVzdWx0KTsKKyAgICBQeV9WSVNJVChsei0+ZmlsbHZhbHVlKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGl6aXBfbG9uZ2VzdF9uZXh0KGl6aXBsb25nZXN0b2JqZWN0ICpseikKIHsKLSAgICAgICAgUHlfc3NpemVfdCBpOwotICAgICAgICBQeV9zc2l6ZV90IHR1cGxlc2l6ZSA9IGx6LT50dXBsZXNpemU7Ci0gICAgICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBsei0+cmVzdWx0OwotICAgICAgICBQeU9iamVjdCAqaXQ7Ci0gICAgICAgIFB5T2JqZWN0ICppdGVtOwotICAgICAgICBQeU9iamVjdCAqb2xkaXRlbTsKKyAgICBQeV9zc2l6ZV90IGk7CisgICAgUHlfc3NpemVfdCB0dXBsZXNpemUgPSBsei0+dHVwbGVzaXplOworICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBsei0+cmVzdWx0OworICAgIFB5T2JqZWN0ICppdDsKKyAgICBQeU9iamVjdCAqaXRlbTsKKyAgICBQeU9iamVjdCAqb2xkaXRlbTsKIAotICAgICAgICBpZiAodHVwbGVzaXplID09IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIGlmIChsei0+bnVtYWN0aXZlID09IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIGlmIChQeV9SRUZDTlQocmVzdWx0KSA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgUHlfSU5DUkVGKHJlc3VsdCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpPTAgOyBpIDwgdHVwbGVzaXplIDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpdCA9IFB5VHVwbGVfR0VUX0lURU0obHotPml0dHVwbGUsIGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfSU5DUkVGKGx6LT5maWxsdmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtID0gbHotPmZpbGx2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydChQeUl0ZXJfQ2hlY2soaXQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSA9IFB5SXRlcl9OZXh0KGl0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0gPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx6LT5udW1hY3RpdmUgLT0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobHotPm51bWFjdGl2ZSA9PSAwIHx8IFB5RXJyX09jY3VycmVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx6LT5udW1hY3RpdmUgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfSU5DUkVGKGx6LT5maWxsdmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSA9IGx6LT5maWxsdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShsei0+aXR0dXBsZSwgaSwgTlVMTCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoaXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgb2xkaXRlbSA9IFB5VHVwbGVfR0VUX0lURU0ocmVzdWx0LCBpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFB5VHVwbGVfU0VUX0lURU0ocmVzdWx0LCBpLCBpdGVtKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihvbGRpdGVtKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gUHlUdXBsZV9OZXcodHVwbGVzaXplKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgaWYgKHR1cGxlc2l6ZSA9PSAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAobHotPm51bWFjdGl2ZSA9PSAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoUHlfUkVGQ05UKHJlc3VsdCkgPT0gMSkgeworICAgICAgICBQeV9JTkNSRUYocmVzdWx0KTsKKyAgICAgICAgZm9yIChpPTAgOyBpIDwgdHVwbGVzaXplIDsgaSsrKSB7CisgICAgICAgICAgICBpdCA9IFB5VHVwbGVfR0VUX0lURU0obHotPml0dHVwbGUsIGkpOworICAgICAgICAgICAgaWYgKGl0ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeV9JTkNSRUYobHotPmZpbGx2YWx1ZSk7CisgICAgICAgICAgICAgICAgaXRlbSA9IGx6LT5maWxsdmFsdWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGFzc2VydChQeUl0ZXJfQ2hlY2soaXQpKTsKKyAgICAgICAgICAgICAgICBpdGVtID0gUHlJdGVyX05leHQoaXQpOworICAgICAgICAgICAgICAgIGlmIChpdGVtID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgbHotPm51bWFjdGl2ZSAtPSAxOworICAgICAgICAgICAgICAgICAgICBpZiAobHotPm51bWFjdGl2ZSA9PSAwIHx8IFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGx6LT5udW1hY3RpdmUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgICAgICBmb3IgKGk9MCA7IGkgPCB0dXBsZXNpemUgOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGl0ID0gUHlUdXBsZV9HRVRfSVRFTShsei0+aXR0dXBsZSwgaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXQgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9JTkNSRUYobHotPmZpbGx2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0gPSBsei0+ZmlsbHZhbHVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KFB5SXRlcl9DaGVjayhpdCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtID0gUHlJdGVyX05leHQoaXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHotPm51bWFjdGl2ZSAtPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsei0+bnVtYWN0aXZlID09IDAgfHwgUHlFcnJfT2NjdXJyZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHotPm51bWFjdGl2ZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9JTkNSRUYobHotPmZpbGx2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtID0gbHotPmZpbGx2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKGx6LT5pdHR1cGxlLCBpLCBOVUxMKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihpdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKHJlc3VsdCwgaSwgaXRlbSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBQeV9JTkNSRUYobHotPmZpbGx2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpdGVtID0gbHotPmZpbGx2YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5VHVwbGVfU0VUX0lURU0obHotPml0dHVwbGUsIGksIE5VTEwpOworICAgICAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGl0KTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9sZGl0ZW0gPSBQeVR1cGxlX0dFVF9JVEVNKHJlc3VsdCwgaSk7CisgICAgICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKHJlc3VsdCwgaSwgaXRlbSk7CisgICAgICAgICAgICBQeV9ERUNSRUYob2xkaXRlbSk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9IGVsc2UgeworICAgICAgICByZXN1bHQgPSBQeVR1cGxlX05ldyh0dXBsZXNpemUpOworICAgICAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgZm9yIChpPTAgOyBpIDwgdHVwbGVzaXplIDsgaSsrKSB7CisgICAgICAgICAgICBpdCA9IFB5VHVwbGVfR0VUX0lURU0obHotPml0dHVwbGUsIGkpOworICAgICAgICAgICAgaWYgKGl0ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeV9JTkNSRUYobHotPmZpbGx2YWx1ZSk7CisgICAgICAgICAgICAgICAgaXRlbSA9IGx6LT5maWxsdmFsdWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGFzc2VydChQeUl0ZXJfQ2hlY2soaXQpKTsKKyAgICAgICAgICAgICAgICBpdGVtID0gUHlJdGVyX05leHQoaXQpOworICAgICAgICAgICAgICAgIGlmIChpdGVtID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgbHotPm51bWFjdGl2ZSAtPSAxOworICAgICAgICAgICAgICAgICAgICBpZiAobHotPm51bWFjdGl2ZSA9PSAwIHx8IFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGx6LT5udW1hY3RpdmUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihsei0+ZmlsbHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0gPSBsei0+ZmlsbHZhbHVlOworICAgICAgICAgICAgICAgICAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShsei0+aXR0dXBsZSwgaSwgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoaXQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIGksIGl0ZW0pOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIFB5RG9jX1NUUlZBUihpemlwX2xvbmdlc3RfZG9jLApAQCAtMzQ5MSw0NyArMzQ5MSw0NyBAQAogIik7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgaXppcGxvbmdlc3RfdHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKLQkiaXRlcnRvb2xzLml6aXBfbG9uZ2VzdCIsCS8qIHRwX25hbWUgKi8KLQlzaXplb2YoaXppcGxvbmdlc3RvYmplY3QpLAkvKiB0cF9iYXNpY3NpemUgKi8KLQkwLAkJCQkvKiB0cF9pdGVtc2l6ZSAqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcilpemlwX2xvbmdlc3RfZGVhbGxvYywJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkvKiB0cF9jb21wYXJlICovCi0JMCwJCQkJLyogdHBfcmVwciAqLwotCTAsCQkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCS8qIHRwX2hhc2ggKi8KLQkwLAkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MgfAotCQlQeV9UUEZMQUdTX0JBU0VUWVBFLAkvKiB0cF9mbGFncyAqLwotCWl6aXBfbG9uZ2VzdF9kb2MsCQkJLyogdHBfZG9jICovCi0JKHRyYXZlcnNlcHJvYylpemlwX2xvbmdlc3RfdHJhdmVyc2UsICAgIC8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JUHlPYmplY3RfU2VsZkl0ZXIsCQkvKiB0cF9pdGVyICovCi0JKGl0ZXJuZXh0ZnVuYylpemlwX2xvbmdlc3RfbmV4dCwJLyogdHBfaXRlcm5leHQgKi8KLQkwLAkJCQkvKiB0cF9tZXRob2RzICovCi0JMCwJCQkJLyogdHBfbWVtYmVycyAqLwotCTAsCQkJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkvKiB0cF9kaWN0ICovCi0JMCwJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJCQkJLyogdHBfZGljdG9mZnNldCAqLwotCTAsCQkJCS8qIHRwX2luaXQgKi8KLQkwLAkJCQkvKiB0cF9hbGxvYyAqLwotCWl6aXBfbG9uZ2VzdF9uZXcsCQkJLyogdHBfbmV3ICovCi0JUHlPYmplY3RfR0NfRGVsLAkJLyogdHBfZnJlZSAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQorICAgICJpdGVydG9vbHMuaXppcF9sb25nZXN0IiwgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICBzaXplb2YoaXppcGxvbmdlc3RvYmplY3QpLCAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcilpemlwX2xvbmdlc3RfZGVhbGxvYywgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MgfAorICAgICAgICBQeV9UUEZMQUdTX0JBU0VUWVBFLCAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCisgICAgaXppcF9sb25nZXN0X2RvYywgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAodHJhdmVyc2Vwcm9jKWl6aXBfbG9uZ2VzdF90cmF2ZXJzZSwgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICBQeU9iamVjdF9TZWxmSXRlciwgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgKGl0ZXJuZXh0ZnVuYylpemlwX2xvbmdlc3RfbmV4dCwgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgaXppcF9sb25nZXN0X25ldywgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICBQeU9iamVjdF9HQ19EZWwsICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCiB9OwogCiAvKiBtb2R1bGUgbGV2ZWwgY29kZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTM1NjcsNTUgKzM1NjcsNTUgQEAKIAogCiBzdGF0aWMgUHlNZXRob2REZWYgbW9kdWxlX21ldGhvZHNbXSA9IHsKLQl7InRlZSIsCShQeUNGdW5jdGlvbil0ZWUsCU1FVEhfVkFSQVJHUywgdGVlX2RvY30sCi0gCXtOVUxMLAkJTlVMTH0JCS8qIHNlbnRpbmVsICovCisgICAgeyJ0ZWUiLCAgICAgKFB5Q0Z1bmN0aW9uKXRlZSwgICAgICAgTUVUSF9WQVJBUkdTLCB0ZWVfZG9jfSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogUHlNT0RJTklUX0ZVTkMKIGluaXRpdGVydG9vbHModm9pZCkKIHsKLQlpbnQgaTsKLQlQeU9iamVjdCAqbTsKLQljaGFyICpuYW1lOwotCVB5VHlwZU9iamVjdCAqdHlwZWxpc3RbXSA9IHsKLQkJJmNvbWJpbmF0aW9uc190eXBlLAotCQkmY3ljbGVfdHlwZSwKLQkJJmRyb3B3aGlsZV90eXBlLAotCQkmdGFrZXdoaWxlX3R5cGUsCi0JCSZpc2xpY2VfdHlwZSwKLQkJJnN0YXJtYXBfdHlwZSwKLQkJJmltYXBfdHlwZSwKLQkJJmNoYWluX3R5cGUsCi0JCSZpZmlsdGVyX3R5cGUsCi0JCSZpZmlsdGVyZmFsc2VfdHlwZSwKLQkJJmNvdW50X3R5cGUsCi0JCSZpemlwX3R5cGUsCi0JCSZpemlwbG9uZ2VzdF90eXBlLAotCQkmcGVybXV0YXRpb25zX3R5cGUsCi0JCSZwcm9kdWN0X3R5cGUsCi0JCSZyZXBlYXRfdHlwZSwKLQkJJmdyb3VwYnlfdHlwZSwKLQkJTlVMTAotCX07CisgICAgaW50IGk7CisgICAgUHlPYmplY3QgKm07CisgICAgY2hhciAqbmFtZTsKKyAgICBQeVR5cGVPYmplY3QgKnR5cGVsaXN0W10gPSB7CisgICAgICAgICZjb21iaW5hdGlvbnNfdHlwZSwKKyAgICAgICAgJmN5Y2xlX3R5cGUsCisgICAgICAgICZkcm9wd2hpbGVfdHlwZSwKKyAgICAgICAgJnRha2V3aGlsZV90eXBlLAorICAgICAgICAmaXNsaWNlX3R5cGUsCisgICAgICAgICZzdGFybWFwX3R5cGUsCisgICAgICAgICZpbWFwX3R5cGUsCisgICAgICAgICZjaGFpbl90eXBlLAorICAgICAgICAmaWZpbHRlcl90eXBlLAorICAgICAgICAmaWZpbHRlcmZhbHNlX3R5cGUsCisgICAgICAgICZjb3VudF90eXBlLAorICAgICAgICAmaXppcF90eXBlLAorICAgICAgICAmaXppcGxvbmdlc3RfdHlwZSwKKyAgICAgICAgJnBlcm11dGF0aW9uc190eXBlLAorICAgICAgICAmcHJvZHVjdF90eXBlLAorICAgICAgICAmcmVwZWF0X3R5cGUsCisgICAgICAgICZncm91cGJ5X3R5cGUsCisgICAgICAgIE5VTEwKKyAgICB9OwogCi0JUHlfVFlQRSgmdGVlZGF0YW9iamVjdF90eXBlKSA9ICZQeVR5cGVfVHlwZTsKLQltID0gUHlfSW5pdE1vZHVsZTMoIml0ZXJ0b29scyIsIG1vZHVsZV9tZXRob2RzLCBtb2R1bGVfZG9jKTsKLQlpZiAobSA9PSBOVUxMKQotCQlyZXR1cm47CisgICAgUHlfVFlQRSgmdGVlZGF0YW9iamVjdF90eXBlKSA9ICZQeVR5cGVfVHlwZTsKKyAgICBtID0gUHlfSW5pdE1vZHVsZTMoIml0ZXJ0b29scyIsIG1vZHVsZV9tZXRob2RzLCBtb2R1bGVfZG9jKTsKKyAgICBpZiAobSA9PSBOVUxMKQorICAgICAgICByZXR1cm47CiAKLQlmb3IgKGk9MCA7IHR5cGVsaXN0W2ldICE9IE5VTEwgOyBpKyspIHsKLQkJaWYgKFB5VHlwZV9SZWFkeSh0eXBlbGlzdFtpXSkgPCAwKQotCQkJcmV0dXJuOwotCQluYW1lID0gc3RyY2hyKHR5cGVsaXN0W2ldLT50cF9uYW1lLCAnLicpOwotCQlhc3NlcnQgKG5hbWUgIT0gTlVMTCk7Ci0JCVB5X0lOQ1JFRih0eXBlbGlzdFtpXSk7Ci0JCVB5TW9kdWxlX0FkZE9iamVjdChtLCBuYW1lKzEsIChQeU9iamVjdCAqKXR5cGVsaXN0W2ldKTsKLQl9CisgICAgZm9yIChpPTAgOyB0eXBlbGlzdFtpXSAhPSBOVUxMIDsgaSsrKSB7CisgICAgICAgIGlmIChQeVR5cGVfUmVhZHkodHlwZWxpc3RbaV0pIDwgMCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgbmFtZSA9IHN0cmNocih0eXBlbGlzdFtpXS0+dHBfbmFtZSwgJy4nKTsKKyAgICAgICAgYXNzZXJ0IChuYW1lICE9IE5VTEwpOworICAgICAgICBQeV9JTkNSRUYodHlwZWxpc3RbaV0pOworICAgICAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgbmFtZSsxLCAoUHlPYmplY3QgKil0eXBlbGlzdFtpXSk7CisgICAgfQogCi0JaWYgKFB5VHlwZV9SZWFkeSgmdGVlZGF0YW9iamVjdF90eXBlKSA8IDApCi0JCXJldHVybjsKLQlpZiAoUHlUeXBlX1JlYWR5KCZ0ZWVfdHlwZSkgPCAwKQotCQlyZXR1cm47Ci0JaWYgKFB5VHlwZV9SZWFkeSgmX2dyb3VwZXJfdHlwZSkgPCAwKQotCQlyZXR1cm47CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmdGVlZGF0YW9iamVjdF90eXBlKSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZ0ZWVfdHlwZSkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmX2dyb3VwZXJfdHlwZSkgPCAwKQorICAgICAgICByZXR1cm47CiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL2xpbnV4YXVkaW9kZXYuYyBiL01vZHVsZXMvbGludXhhdWRpb2Rldi5jCmluZGV4IDgwMDc3YzYuLjdmZTIwYWUgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvbGludXhhdWRpb2Rldi5jCisrKyBiL01vZHVsZXMvbGludXhhdWRpb2Rldi5jCkBAIC0xLDE0ICsxLDE0IEBACi0vKiBIZXkgRW1hY3MsIHRoaXMgaXMgLSotQy0qLSAKKy8qIEhleSBFbWFjcywgdGhpcyBpcyAtKi1DLSotCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBsaW51eGF1ZGlvZGV2LmMgLS0gTGludXggYXVkaW8gZGV2aWNlIGZvciBweXRob24uCi0gKiAKKyAqCiAgKiBBdXRob3IgICAgICAgICAgOiBQZXRlciBCb3NjaAogICogQ3JlYXRlZCBPbiAgICAgIDogVGh1IE1hciAgMiAyMToxMDozMyAyMDAwCiAgKiBTdGF0dXMgICAgICAgICAgOiBVbmtub3duLCBVc2Ugd2l0aCBjYXV0aW9uIQotICogCisgKgogICogVW5sZXNzIG90aGVyIG5vdGljZXMgYXJlIHByZXNlbnQgaW4gYW55IHBhcnQgb2YgdGhpcyBmaWxlCi0gKiBleHBsaWNpdGx5IGNsYWltaW5nIGNvcHlyaWdodHMgZm9yIG90aGVyIHBlb3BsZSBhbmQvb3IgCi0gKiBvcmdhbml6YXRpb25zLCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGlzIGZ1bGx5IGNvcHlyaWdodCAKKyAqIGV4cGxpY2l0bHkgY2xhaW1pbmcgY29weXJpZ2h0cyBmb3Igb3RoZXIgcGVvcGxlIGFuZC9vcgorICogb3JnYW5pemF0aW9ucywgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBpcyBmdWxseSBjb3B5cmlnaHQKICAqIChDKSAyMDAwIFBldGVyIEJvc2NoLCBhbGwgcmlnaHRzIHJlc2VydmVkLgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICovCkBAIC00MywxMSArNDMsMTEgQEAKIAogdHlwZWRlZiBzdHJ1Y3QgewogICAgIFB5T2JqZWN0X0hFQUQKLSAgICBpbnQJCXhfZmQ7CQkvKiBUaGUgb3BlbiBmaWxlICovCisgICAgaW50ICAgICAgICAgeF9mZDsgICAgICAgICAgIC8qIFRoZSBvcGVuIGZpbGUgKi8KICAgICBpbnQgICAgICAgICB4X21vZGU7ICAgICAgICAgICAvKiBmaWxlIG1vZGUgKi8KLSAgICBpbnQJCXhfaWNvdW50OwkvKiBJbnB1dCBjb3VudCAqLwotICAgIGludAkJeF9vY291bnQ7CS8qIE91dHB1dCBjb3VudCAqLwotICAgIHVpbnQzMl90CXhfYWZtdHM7CS8qIEF1ZGlvIGZvcm1hdHMgc3VwcG9ydGVkIGJ5IGhhcmR3YXJlKi8KKyAgICBpbnQgICAgICAgICB4X2ljb3VudDsgICAgICAgLyogSW5wdXQgY291bnQgKi8KKyAgICBpbnQgICAgICAgICB4X29jb3VudDsgICAgICAgLyogT3V0cHV0IGNvdW50ICovCisgICAgdWludDMyX3QgICAgeF9hZm10czsgICAgICAgIC8qIEF1ZGlvIGZvcm1hdHMgc3VwcG9ydGVkIGJ5IGhhcmR3YXJlKi8KIH0gbGFkX3Q7CiAKIC8qIFhYWCBzZXZlcmFsIGZvcm1hdCBkZWZpbmVkIGluIHNvdW5kY2FyZC5oIGFyZSBub3Qgc3VwcG9ydGVkLApAQCAtNTUsMTkgKzU1LDE5IEBACiAqLwogCiBzdGF0aWMgc3RydWN0IHsKLSAgICBpbnQJCWFfYnBzOwotICAgIHVpbnQzMl90CWFfZm10OworICAgIGludCAgICAgICAgIGFfYnBzOworICAgIHVpbnQzMl90ICAgIGFfZm10OwogICAgIGNoYXIgICAgICAgKmFfbmFtZTsKIH0gYXVkaW9fdHlwZXNbXSA9IHsKLSAgICB7ICA4LCAJQUZNVF9NVV9MQVcsICJsb2dhcml0aG1pYyBtdS1sYXcgOC1iaXQgYXVkaW8iIH0sCi0gICAgeyAgOCwgCUFGTVRfQV9MQVcsICAibG9nYXJpdGhtaWMgQS1sYXcgOC1iaXQgYXVkaW8iIH0sCi0gICAgeyAgOCwJQUZNVF9VOCwgICAgICJsaW5lYXIgdW5zaWduZWQgOC1iaXQgYXVkaW8iIH0sCi0gICAgeyAgOCwgCUFGTVRfUzgsICAgICAibGluZWFyIHNpZ25lZCA4LWJpdCBhdWRpbyIgfSwKLSAgICB7IDE2LCAJQUZNVF9VMTZfQkUsICJsaW5lYXIgdW5zaWduZWQgMTYtYml0IGJpZy1lbmRpYW4gYXVkaW8iIH0sCi0gICAgeyAxNiwgCUFGTVRfVTE2X0xFLCAibGluZWFyIHVuc2lnbmVkIDE2LWJpdCBsaXR0bGUtZW5kaWFuIGF1ZGlvIiB9LAotICAgIHsgMTYsIAlBRk1UX1MxNl9CRSwgImxpbmVhciBzaWduZWQgMTYtYml0IGJpZy1lbmRpYW4gYXVkaW8iIH0sCi0gICAgeyAxNiwgCUFGTVRfUzE2X0xFLCAibGluZWFyIHNpZ25lZCAxNi1iaXQgbGl0dGxlLWVuZGlhbiBhdWRpbyIgfSwKLSAgICB7IDE2LCAJQUZNVF9TMTZfTkUsICJsaW5lYXIgc2lnbmVkIDE2LWJpdCBuYXRpdmUtZW5kaWFuIGF1ZGlvIiB9LAorICAgIHsgIDgsICAgICAgIEFGTVRfTVVfTEFXLCAibG9nYXJpdGhtaWMgbXUtbGF3IDgtYml0IGF1ZGlvIiB9LAorICAgIHsgIDgsICAgICAgIEFGTVRfQV9MQVcsICAibG9nYXJpdGhtaWMgQS1sYXcgOC1iaXQgYXVkaW8iIH0sCisgICAgeyAgOCwgICAgICAgQUZNVF9VOCwgICAgICJsaW5lYXIgdW5zaWduZWQgOC1iaXQgYXVkaW8iIH0sCisgICAgeyAgOCwgICAgICAgQUZNVF9TOCwgICAgICJsaW5lYXIgc2lnbmVkIDgtYml0IGF1ZGlvIiB9LAorICAgIHsgMTYsICAgICAgIEFGTVRfVTE2X0JFLCAibGluZWFyIHVuc2lnbmVkIDE2LWJpdCBiaWctZW5kaWFuIGF1ZGlvIiB9LAorICAgIHsgMTYsICAgICAgIEFGTVRfVTE2X0xFLCAibGluZWFyIHVuc2lnbmVkIDE2LWJpdCBsaXR0bGUtZW5kaWFuIGF1ZGlvIiB9LAorICAgIHsgMTYsICAgICAgIEFGTVRfUzE2X0JFLCAibGluZWFyIHNpZ25lZCAxNi1iaXQgYmlnLWVuZGlhbiBhdWRpbyIgfSwKKyAgICB7IDE2LCAgICAgICBBRk1UX1MxNl9MRSwgImxpbmVhciBzaWduZWQgMTYtYml0IGxpdHRsZS1lbmRpYW4gYXVkaW8iIH0sCisgICAgeyAxNiwgICAgICAgQUZNVF9TMTZfTkUsICJsaW5lYXIgc2lnbmVkIDE2LWJpdCBuYXRpdmUtZW5kaWFuIGF1ZGlvIiB9LAogfTsKIAogc3RhdGljIGludCBuX2F1ZGlvX3R5cGVzID0gc2l6ZW9mKGF1ZGlvX3R5cGVzKSAvIHNpemVvZihhdWRpb190eXBlc1swXSk7CkBAIC0xMDgsNyArMTA4LDcgQEAKICAgICAvKiBPcGVuIHRoZSBjb3JyZWN0IGRldmljZS4gIFRoZSBiYXNlIGRldmljZSBuYW1lIGNvbWVzIGZyb20gdGhlCiAgICAgICogQVVESU9ERVYgZW52aXJvbm1lbnQgdmFyaWFibGUgZmlyc3QsIHRoZW4gL2Rldi9kc3AuICBUaGUKICAgICAgKiBjb250cm9sIGRldmljZSB0YWNrcyAiY3RsIiBvbnRvIHRoZSBiYXNlIGRldmljZSBuYW1lLgotICAgICAqIAorICAgICAqCiAgICAgICogTm90ZSB0aGF0IHRoZSBvbmx5IGRpZmZlcmVuY2UgYmV0d2VlbiAvZGV2L2F1ZGlvIGFuZCAvZGV2L2RzcAogICAgICAqIGlzIHRoYXQgdGhlIGZvcm1lciB1c2VzIGxvZ2FyaXRobWljIG11LWxhdyBlbmNvZGluZyBhbmQgdGhlCiAgICAgICogbGF0dGVyIHVzZXMgOC1iaXQgdW5zaWduZWQgZW5jb2RpbmcuCkBAIC0xNDksNyArMTQ5LDcgQEAKIHsKICAgICAvKiBpZiBhbHJlYWR5IGNsb3NlZCwgZG9uJ3QgcmVjbG9zZSBpdCAqLwogICAgIGlmICh4cC0+eF9mZCAhPSAtMSkKLQljbG9zZSh4cC0+eF9mZCk7CisgICAgICAgIGNsb3NlKHhwLT54X2ZkKTsKICAgICBQeU9iamVjdF9EZWwoeHApOwogfQogCkBAIC0xNTksNyArMTU5LDcgQEAKICAgICBpbnQgc2l6ZSwgY291bnQ7CiAgICAgY2hhciAqY3A7CiAgICAgUHlPYmplY3QgKnJ2OwotCQorCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOnJlYWQiLCAmc2l6ZSkpCiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIHJ2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgc2l6ZSk7CkBAIC0xODQsMzYgKzE4NCwzNiBAQAogICAgIGZkX3NldCB3cml0ZV9zZXRfZmRzOwogICAgIHN0cnVjdCB0aW1ldmFsIHR2OwogICAgIGludCBzZWxlY3RfcmV0dmFsOwotICAgIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyM6d3JpdGUiLCAmY3AsICZzaXplKSkgCi0JcmV0dXJuIE5VTEw7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjOndyaXRlIiwgJmNwLCAmc2l6ZSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgLyogdXNlIHNlbGVjdCB0byB3YWl0IGZvciBhdWRpbyBkZXZpY2UgdG8gYmUgYXZhaWxhYmxlICovCiAgICAgRkRfWkVSTygmd3JpdGVfc2V0X2Zkcyk7CiAgICAgRkRfU0VUKHNlbGYtPnhfZmQsICZ3cml0ZV9zZXRfZmRzKTsKICAgICB0di50dl9zZWMgPSA0OyAvKiB0aW1lb3V0IHZhbHVlcyAqLwotICAgIHR2LnR2X3VzZWMgPSAwOyAKKyAgICB0di50dl91c2VjID0gMDsKIAogICAgIHdoaWxlIChzaXplID4gMCkgewogICAgICAgc2VsZWN0X3JldHZhbCA9IHNlbGVjdChzZWxmLT54X2ZkKzEsIE5VTEwsICZ3cml0ZV9zZXRfZmRzLCBOVUxMLCAmdHYpOwogICAgICAgdHYudHZfc2VjID0gMTsgdHYudHZfdXNlYyA9IDA7IC8qIHdpbGxpbmcgdG8gd2FpdCB0aGlzIGxvbmcgbmV4dCB0aW1lKi8KICAgICAgIGlmIChzZWxlY3RfcmV0dmFsKSB7CiAgICAgICAgIGlmICgocnYgPSB3cml0ZShzZWxmLT54X2ZkLCBjcCwgc2l6ZSkpID09IC0xKSB7Ci0JICBpZiAoZXJybm8gIT0gRUFHQUlOKSB7Ci0JICAgIFB5RXJyX1NldEZyb21FcnJubyhMaW51eEF1ZGlvRXJyb3IpOwotCSAgICByZXR1cm4gTlVMTDsKLQkgIH0gZWxzZSB7Ci0JICAgIGVycm5vID0gMDsgLyogRUFHQUlOOiBidWZmZXIgaXMgZnVsbCwgdHJ5IGFnYWluICovCi0JICB9CisgICAgICAgICAgaWYgKGVycm5vICE9IEVBR0FJTikgeworICAgICAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKExpbnV4QXVkaW9FcnJvcik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZXJybm8gPSAwOyAvKiBFQUdBSU46IGJ1ZmZlciBpcyBmdWxsLCB0cnkgYWdhaW4gKi8KKyAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7Ci0JICBzZWxmLT54X29jb3VudCArPSBydjsKLQkgIHNpemUgLT0gcnY7Ci0JICBjcCArPSBydjsKLQl9CisgICAgICAgICAgc2VsZi0+eF9vY291bnQgKz0gcnY7CisgICAgICAgICAgc2l6ZSAtPSBydjsKKyAgICAgICAgICBjcCArPSBydjsKKyAgICAgICAgfQogICAgICAgfSBlbHNlIHsKLQkvKiBwcmludGYoIk5vdCBhYmxlIHRvIHdyaXRlIHRvIGxpbnV4IGF1ZGlvIGRldmljZSB3aXRoaW4gJWxkIHNlY29uZHNcbiIsIHR2LnR2X3NlYyk7ICovCi0JUHlFcnJfU2V0RnJvbUVycm5vKExpbnV4QXVkaW9FcnJvcik7Ci0JcmV0dXJuIE5VTEw7CisgICAgICAgIC8qIHByaW50ZigiTm90IGFibGUgdG8gd3JpdGUgdG8gbGludXggYXVkaW8gZGV2aWNlIHdpdGhpbiAlbGQgc2Vjb25kc1xuIiwgdHYudHZfc2VjKTsgKi8KKyAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKExpbnV4QXVkaW9FcnJvcik7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgfQogICAgIH0KICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CkBAIC0yNDQsNDcgKzI0NCw0NyBAQAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaWlpaXxpOnNldHBhcmFtZXRlcnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAmcmF0ZSwgJnNzaXplLCAmbmNoYW5uZWxzLCAmZm10LCAmZW11bGF0ZSkpCiAgICAgICAgIHJldHVybiBOVUxMOwotICAKKwogICAgIGlmIChyYXRlIDwgMCkgewotCVB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLCAiZXhwZWN0ZWQgcmF0ZSA+PSAwLCBub3QgJWQiLAotCQkgICAgIHJhdGUpOyAKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsICJleHBlY3RlZCByYXRlID49IDAsIG5vdCAlZCIsCisgICAgICAgICAgICAgICAgICAgICByYXRlKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogICAgIGlmIChzc2l6ZSA8IDApIHsKLQlQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwgImV4cGVjdGVkIHNhbXBsZSBzaXplID49IDAsIG5vdCAlZCIsCi0JCSAgICAgc3NpemUpOwotCXJldHVybiBOVUxMOworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwgImV4cGVjdGVkIHNhbXBsZSBzaXplID49IDAsIG5vdCAlZCIsCisgICAgICAgICAgICAgICAgICAgICBzc2l6ZSk7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICBpZiAobmNoYW5uZWxzICE9IDEgJiYgbmNoYW5uZWxzICE9IDIpIHsKLQlQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwgIm5jaGFubmVscyBtdXN0IGJlIDEgb3IgMiwgbm90ICVkIiwKLQkJICAgICBuY2hhbm5lbHMpOwotCXJldHVybiBOVUxMOworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwgIm5jaGFubmVscyBtdXN0IGJlIDEgb3IgMiwgbm90ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgIG5jaGFubmVscyk7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAogICAgIGZvciAobiA9IDA7IG4gPCBuX2F1ZGlvX3R5cGVzOyBuKyspCiAgICAgICAgIGlmIChmbXQgPT0gYXVkaW9fdHlwZXNbbl0uYV9mbXQpCiAgICAgICAgICAgICBicmVhazsKICAgICBpZiAobiA9PSBuX2F1ZGlvX3R5cGVzKSB7Ci0JUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsICJ1bmtub3duIGF1ZGlvIGVuY29kaW5nOiAlZCIsIGZtdCk7Ci0JcmV0dXJuIE5VTEw7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLCAidW5rbm93biBhdWRpbyBlbmNvZGluZzogJWQiLCBmbXQpOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAgICAgaWYgKGF1ZGlvX3R5cGVzW25dLmFfYnBzICE9IHNzaXplKSB7Ci0JUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsIAotCQkgICAgICJmb3IgJXMsIGV4cGVjdGVkIHNhbXBsZSBzaXplICVkLCBub3QgJWQiLAotCQkgICAgIGF1ZGlvX3R5cGVzW25dLmFfbmFtZSwgYXVkaW9fdHlwZXNbbl0uYV9icHMsIHNzaXplKTsKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiZm9yICVzLCBleHBlY3RlZCBzYW1wbGUgc2l6ZSAlZCwgbm90ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3R5cGVzW25dLmFfbmFtZSwgYXVkaW9fdHlwZXNbbl0uYV9icHMsIHNzaXplKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCiAgICAgaWYgKGVtdWxhdGUgPT0gMCkgewotCWlmICgoc2VsZi0+eF9hZm10cyAmIGF1ZGlvX3R5cGVzW25dLmFfZm10KSA9PSAwKSB7Ci0JICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLCAKLQkJCSAiJXMgZm9ybWF0IG5vdCBzdXBwb3J0ZWQgYnkgZGV2aWNlIiwKLQkJCSBhdWRpb190eXBlc1tuXS5hX25hbWUpOwotCSAgICByZXR1cm4gTlVMTDsKLQl9CisgICAgICAgIGlmICgoc2VsZi0+eF9hZm10cyAmIGF1ZGlvX3R5cGVzW25dLmFfZm10KSA9PSAwKSB7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiJXMgZm9ybWF0IG5vdCBzdXBwb3J0ZWQgYnkgZGV2aWNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb190eXBlc1tuXS5hX25hbWUpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KICAgICB9Ci0gICAgaWYgKGlvY3RsKHNlbGYtPnhfZmQsIFNORENUTF9EU1BfU0VURk1ULCAKLQkgICAgICAmYXVkaW9fdHlwZXNbbl0uYV9mbXQpID09IC0xKSB7CisgICAgaWYgKGlvY3RsKHNlbGYtPnhfZmQsIFNORENUTF9EU1BfU0VURk1ULAorICAgICAgICAgICAgICAmYXVkaW9fdHlwZXNbbl0uYV9mbXQpID09IC0xKSB7CiAgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhMaW51eEF1ZGlvRXJyb3IpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CkBAIC0zMDcsNyArMzA3LDcgQEAKICAgICBpbnQgZm10OwogCiAgICAgZm10ID0gMDsKLSAgICBpZiAoaW9jdGwoc2VsZi0+eF9mZCwgU05EQ1RMX0RTUF9TRVRGTVQsICZmbXQpIDwgMCkgCisgICAgaWYgKGlvY3RsKHNlbGYtPnhfZmQsIFNORENUTF9EU1BfU0VURk1ULCAmZm10KSA8IDApCiAgICAgICAgIHJldHVybiAtZXJybm87CiAKICAgICBzd2l0Y2ggKGZtdCkgewpAQCAtMzM0LDcgKzMzNCw3IEBACiB9CiAKIAotLyogYnVmc2l6ZSByZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBoYXJkd2FyZSBhdWRpbyBidWZmZXIgaW4gbnVtYmVyIAorLyogYnVmc2l6ZSByZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBoYXJkd2FyZSBhdWRpbyBidWZmZXIgaW4gbnVtYmVyCiAgICBvZiBzYW1wbGVzICovCiBzdGF0aWMgUHlPYmplY3QgKgogbGFkX2J1ZnNpemUobGFkX3QgKnNlbGYsIFB5T2JqZWN0ICp1bnVzZWQpCkBAIC0zNTMsNyArMzUzLDcgQEAKICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGFpLmZyYWdzdG90YWwgKiBhaS5mcmFnc2l6ZSkgLyAobmNoYW5uZWxzICogc3NpemUpKTsKIH0KIAotLyogb2J1ZmNvdW50IHJldHVybnMgdGhlIG51bWJlciBvZiBzYW1wbGVzIHRoYXQgYXJlIGF2YWlsYWJsZSBpbiB0aGUgCisvKiBvYnVmY291bnQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgdGhhdCBhcmUgYXZhaWxhYmxlIGluIHRoZQogICAgaGFyZHdhcmUgZm9yIHBsYXlpbmcgKi8KIHN0YXRpYyBQeU9iamVjdCAqCiBsYWRfb2J1ZmNvdW50KGxhZF90ICpzZWxmLCBQeU9iamVjdCAqdW51c2VkKQpAQCAtMzY5LDcgKzM2OSw3IEBACiAgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhMaW51eEF1ZGlvRXJyb3IpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChhaS5mcmFnc3RvdGFsICogYWkuZnJhZ3NpemUgLSBhaS5ieXRlcykgLyAKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGFpLmZyYWdzdG90YWwgKiBhaS5mcmFnc2l6ZSAtIGFpLmJ5dGVzKSAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgIChzc2l6ZSAqIG5jaGFubmVscykpOwogfQogCkBAIC00MTAsOSArNDEwLDkgQEAKICAgICBpbnQgcmVxOwogCiAgICAgaWYgKHNlbGYtPnhfbW9kZSA9PSBPX1JET05MWSkKLQlyZXEgPSBTTkRDVExfRFNQX0dFVElQVFI7CisgICAgICAgIHJlcSA9IFNORENUTF9EU1BfR0VUSVBUUjsKICAgICBlbHNlCi0JcmVxID0gU05EQ1RMX0RTUF9HRVRPUFRSOworICAgICAgICByZXEgPSBTTkRDVExfRFNQX0dFVE9QVFI7CiAgICAgaWYgKGlvY3RsKHNlbGYtPnhfZmQsIHJlcSwgJmluZm8pID09IC0xKSB7CiAgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhMaW51eEF1ZGlvRXJyb3IpOwogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTQyMSwxNyArNDIxLDE3IEBACiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBsYWRfbWV0aG9kc1tdID0gewotICAgIHsgInJlYWQiLAkJKFB5Q0Z1bmN0aW9uKWxhZF9yZWFkLCBNRVRIX1ZBUkFSR1MgfSwKLSAgICB7ICJ3cml0ZSIsCQkoUHlDRnVuY3Rpb24pbGFkX3dyaXRlLCBNRVRIX1ZBUkFSR1MgfSwKLSAgICB7ICJzZXRwYXJhbWV0ZXJzIiwJKFB5Q0Z1bmN0aW9uKWxhZF9zZXRwYXJhbWV0ZXJzLCBNRVRIX1ZBUkFSR1MgfSwKLSAgICB7ICJidWZzaXplIiwJKFB5Q0Z1bmN0aW9uKWxhZF9idWZzaXplLCBNRVRIX1ZBUkFSR1MgfSwKLSAgICB7ICJvYnVmY291bnQiLAkoUHlDRnVuY3Rpb24pbGFkX29idWZjb3VudCwgTUVUSF9OT0FSR1MgfSwKLSAgICB7ICJvYnVmZnJlZSIsCShQeUNGdW5jdGlvbilsYWRfb2J1ZmZyZWUsIE1FVEhfTk9BUkdTIH0sCi0gICAgeyAiZmx1c2giLAkJKFB5Q0Z1bmN0aW9uKWxhZF9mbHVzaCwgTUVUSF9OT0FSR1MgfSwKLSAgICB7ICJjbG9zZSIsCQkoUHlDRnVuY3Rpb24pbGFkX2Nsb3NlLCBNRVRIX05PQVJHUyB9LAotICAgIHsgImZpbGVubyIsICAgICAJKFB5Q0Z1bmN0aW9uKWxhZF9maWxlbm8sIE1FVEhfTk9BUkdTIH0sCisgICAgeyAicmVhZCIsICAgICAgICAgICAoUHlDRnVuY3Rpb24pbGFkX3JlYWQsIE1FVEhfVkFSQVJHUyB9LAorICAgIHsgIndyaXRlIiwgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWxhZF93cml0ZSwgTUVUSF9WQVJBUkdTIH0sCisgICAgeyAic2V0cGFyYW1ldGVycyIsICAoUHlDRnVuY3Rpb24pbGFkX3NldHBhcmFtZXRlcnMsIE1FVEhfVkFSQVJHUyB9LAorICAgIHsgImJ1ZnNpemUiLCAgICAgICAgKFB5Q0Z1bmN0aW9uKWxhZF9idWZzaXplLCBNRVRIX1ZBUkFSR1MgfSwKKyAgICB7ICJvYnVmY291bnQiLCAgICAgIChQeUNGdW5jdGlvbilsYWRfb2J1ZmNvdW50LCBNRVRIX05PQVJHUyB9LAorICAgIHsgIm9idWZmcmVlIiwgICAgICAgKFB5Q0Z1bmN0aW9uKWxhZF9vYnVmZnJlZSwgTUVUSF9OT0FSR1MgfSwKKyAgICB7ICJmbHVzaCIsICAgICAgICAgIChQeUNGdW5jdGlvbilsYWRfZmx1c2gsIE1FVEhfTk9BUkdTIH0sCisgICAgeyAiY2xvc2UiLCAgICAgICAgICAoUHlDRnVuY3Rpb24pbGFkX2Nsb3NlLCBNRVRIX05PQVJHUyB9LAorICAgIHsgImZpbGVubyIsICAgICAgICAgKFB5Q0Z1bmN0aW9uKWxhZF9maWxlbm8sIE1FVEhfTk9BUkdTIH0sCiAgICAgeyAiZ2V0cHRyIiwgICAgICAgICAoUHlDRnVuY3Rpb24pbGFkX2dldHB0ciwgTUVUSF9OT0FSR1MgfSwKLSAgICB7IE5VTEwsCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7IE5VTEwsICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogc3RhdGljIFB5T2JqZWN0ICoKQEAgLTQ0MywxNSArNDQzLDE1IEBACiBzdGF0aWMgUHlUeXBlT2JqZWN0IExhZHR5cGUgPSB7CiAgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKICAgICAibGludXhhdWRpb2Rldi5saW51eF9hdWRpb19kZXZpY2UiLCAvKnRwX25hbWUqLwotICAgIHNpemVvZihsYWRfdCksCQkvKnRwX3NpemUqLwotICAgIDAsCQkJCS8qdHBfaXRlbXNpemUqLworICAgIHNpemVvZihsYWRfdCksICAgICAgICAgICAgICAvKnRwX3NpemUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZW1zaXplKi8KICAgICAvKiBtZXRob2RzICovCi0gICAgKGRlc3RydWN0b3IpbGFkX2RlYWxsb2MsCS8qdHBfZGVhbGxvYyovCi0gICAgMCwJCQkJLyp0cF9wcmludCovCi0gICAgKGdldGF0dHJmdW5jKWxhZF9nZXRhdHRyLAkvKnRwX2dldGF0dHIqLwotICAgIDAsCQkJCS8qdHBfc2V0YXR0ciovCi0gICAgMCwJCQkJLyp0cF9jb21wYXJlKi8KLSAgICAwLAkJCQkvKnRwX3JlcHIqLworICAgIChkZXN0cnVjdG9yKWxhZF9kZWFsbG9jLCAgICAvKnRwX2RlYWxsb2MqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpbGFkX2dldGF0dHIsICAgLyp0cF9nZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jb21wYXJlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9yZXByKi8KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC00NjksMzcgKzQ2OSwzNyBAQAogaW5pdGxpbnV4YXVkaW9kZXYodm9pZCkKIHsKICAgICBQeU9iamVjdCAqbTsKLSAgICAKKwogICAgIGlmIChQeUVycl9XYXJuUHkzaygidGhlIGxpbnV4YXVkaW9kZXYgbW9kdWxlIGhhcyBiZWVuIHJlbW92ZWQgaW4gIgogICAgICAgICAgICAgICAgICAgICAiUHl0aG9uIDMuMDsgdXNlIHRoZSBvc3NhdWRpb2RldiBtb2R1bGUgaW5zdGVhZCIsIDIpIDwgMCkKICAgICAgICAgcmV0dXJuOwotICAKKwogICAgIG0gPSBQeV9Jbml0TW9kdWxlKCJsaW51eGF1ZGlvZGV2IiwgbGludXhhdWRpb2Rldl9tZXRob2RzKTsKICAgICBpZiAobSA9PSBOVUxMKQotCXJldHVybjsKKyAgICAgICAgcmV0dXJuOwogCiAgICAgTGludXhBdWRpb0Vycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJsaW51eGF1ZGlvZGV2LmVycm9yIiwgTlVMTCwgTlVMTCk7CiAgICAgaWYgKExpbnV4QXVkaW9FcnJvcikKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgImVycm9yIiwgTGludXhBdWRpb0Vycm9yKTsKKyAgICAgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJlcnJvciIsIExpbnV4QXVkaW9FcnJvcik7CiAKICAgICBpZiAoUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFGTVRfTVVfTEFXIiwgKGxvbmcpQUZNVF9NVV9MQVcpID09IC0xKQotCXJldHVybjsKKyAgICAgICAgcmV0dXJuOwogICAgIGlmIChQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUZNVF9BX0xBVyIsIChsb25nKUFGTVRfQV9MQVcpID09IC0xKQotCXJldHVybjsKKyAgICAgICAgcmV0dXJuOwogICAgIGlmIChQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUZNVF9VOCIsIChsb25nKUFGTVRfVTgpID09IC0xKQotCXJldHVybjsKKyAgICAgICAgcmV0dXJuOwogICAgIGlmIChQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUZNVF9TOCIsIChsb25nKUFGTVRfUzgpID09IC0xKQotCXJldHVybjsKKyAgICAgICAgcmV0dXJuOwogICAgIGlmIChQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUZNVF9VMTZfQkUiLCAobG9uZylBRk1UX1UxNl9CRSkgPT0gLTEpCi0JcmV0dXJuOworICAgICAgICByZXR1cm47CiAgICAgaWYgKFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBRk1UX1UxNl9MRSIsIChsb25nKUFGTVRfVTE2X0xFKSA9PSAtMSkKLQlyZXR1cm47CisgICAgICAgIHJldHVybjsKICAgICBpZiAoUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFGTVRfUzE2X0JFIiwgKGxvbmcpQUZNVF9TMTZfQkUpID09IC0xKQotCXJldHVybjsKKyAgICAgICAgcmV0dXJuOwogICAgIGlmIChQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUZNVF9TMTZfTEUiLCAobG9uZylBRk1UX1MxNl9MRSkgPT0gLTEpCi0JcmV0dXJuOworICAgICAgICByZXR1cm47CiAgICAgaWYgKFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBRk1UX1MxNl9ORSIsIChsb25nKUFGTVRfUzE2X05FKSA9PSAtMSkKLQlyZXR1cm47CisgICAgICAgIHJldHVybjsKIAogICAgIHJldHVybjsKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvbWFpbi5jIGIvTW9kdWxlcy9tYWluLmMKaW5kZXggYTExNTliNy4uZGQxOTZlZiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9tYWluLmMKKysrIGIvTW9kdWxlcy9tYWluLmMKQEAgLTEwNiwxMTkgKzEwNiwxMTkgQEAKIHN0YXRpYyBpbnQKIHVzYWdlKGludCBleGl0Y29kZSwgY2hhciogcHJvZ3JhbSkKIHsKLQlGSUxFICpmID0gZXhpdGNvZGUgPyBzdGRlcnIgOiBzdGRvdXQ7CisgICAgRklMRSAqZiA9IGV4aXRjb2RlID8gc3RkZXJyIDogc3Rkb3V0OwogCi0JZnByaW50ZihmLCB1c2FnZV9saW5lLCBwcm9ncmFtKTsKLQlpZiAoZXhpdGNvZGUpCi0JCWZwcmludGYoZiwgIlRyeSBgcHl0aG9uIC1oJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiIpOwotCWVsc2UgewotCQlmcHV0cyh1c2FnZV8xLCBmKTsKLQkJZnB1dHModXNhZ2VfMiwgZik7Ci0JCWZwdXRzKHVzYWdlXzMsIGYpOwotCQlmcHJpbnRmKGYsIHVzYWdlXzQsIERFTElNKTsKLQkJZnByaW50ZihmLCB1c2FnZV81LCBERUxJTSwgUFlUSE9OSE9NRUhFTFApOwotCX0KKyAgICBmcHJpbnRmKGYsIHVzYWdlX2xpbmUsIHByb2dyYW0pOworICAgIGlmIChleGl0Y29kZSkKKyAgICAgICAgZnByaW50ZihmLCAiVHJ5IGBweXRob24gLWgnIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuIik7CisgICAgZWxzZSB7CisgICAgICAgIGZwdXRzKHVzYWdlXzEsIGYpOworICAgICAgICBmcHV0cyh1c2FnZV8yLCBmKTsKKyAgICAgICAgZnB1dHModXNhZ2VfMywgZik7CisgICAgICAgIGZwcmludGYoZiwgdXNhZ2VfNCwgREVMSU0pOworICAgICAgICBmcHJpbnRmKGYsIHVzYWdlXzUsIERFTElNLCBQWVRIT05IT01FSEVMUCk7CisgICAgfQogI2lmIGRlZmluZWQoX19WTVMpCi0JaWYgKGV4aXRjb2RlID09IDApIHsKLQkJLyogc3VwcHJlc3MgJ2Vycm9yJyBtZXNzYWdlICovCi0JCXJldHVybiAxOwotCX0KLQllbHNlIHsKLQkJLyogU1RTJE1fSU5ISUJfTVNHICsgU1MkX0FCT1JUICovCi0JCXJldHVybiAweDEwMDAwMDJjOwotCX0KKyAgICBpZiAoZXhpdGNvZGUgPT0gMCkgeworICAgICAgICAvKiBzdXBwcmVzcyAnZXJyb3InIG1lc3NhZ2UgKi8KKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvKiBTVFMkTV9JTkhJQl9NU0cgKyBTUyRfQUJPUlQgKi8KKyAgICAgICAgcmV0dXJuIDB4MTAwMDAwMmM7CisgICAgfQogI2Vsc2UKLQlyZXR1cm4gZXhpdGNvZGU7CisgICAgcmV0dXJuIGV4aXRjb2RlOwogI2VuZGlmCi0JLypOT1RSRUFDSEVEKi8KKyAgICAvKk5PVFJFQUNIRUQqLwogfQogCiBzdGF0aWMgdm9pZCBSdW5TdGFydHVwRmlsZShQeUNvbXBpbGVyRmxhZ3MgKmNmKQogewotCWNoYXIgKnN0YXJ0dXAgPSBQeV9HRVRFTlYoIlBZVEhPTlNUQVJUVVAiKTsKLQlpZiAoc3RhcnR1cCAhPSBOVUxMICYmIHN0YXJ0dXBbMF0gIT0gJ1wwJykgewotCQlGSUxFICpmcCA9IGZvcGVuKHN0YXJ0dXAsICJyIik7Ci0JCWlmIChmcCAhPSBOVUxMKSB7Ci0JCQkodm9pZCkgUHlSdW5fU2ltcGxlRmlsZUV4RmxhZ3MoZnAsIHN0YXJ0dXAsIDAsIGNmKTsKLQkJCVB5RXJyX0NsZWFyKCk7Ci0JCQlmY2xvc2UoZnApOwotICAgICAgICAgICAgICAgfSBlbHNlIHsKLQkJCWludCBzYXZlX2Vycm5vOwotCQkJc2F2ZV9lcnJubyA9IGVycm5vOwotCQkJUHlTeXNfV3JpdGVTdGRlcnIoIkNvdWxkIG5vdCBvcGVuIFBZVEhPTlNUQVJUVVBcbiIpOwotCQkJZXJybm8gPSBzYXZlX2Vycm5vOwotCQkJUHlFcnJfU2V0RnJvbUVycm5vV2l0aEZpbGVuYW1lKFB5RXhjX0lPRXJyb3IsCi0JCQkJCQkgICAgICAgc3RhcnR1cCk7Ci0JCQlQeUVycl9QcmludCgpOwotCQkJUHlFcnJfQ2xlYXIoKTsKLQkJfQotCX0KKyAgICBjaGFyICpzdGFydHVwID0gUHlfR0VURU5WKCJQWVRIT05TVEFSVFVQIik7CisgICAgaWYgKHN0YXJ0dXAgIT0gTlVMTCAmJiBzdGFydHVwWzBdICE9ICdcMCcpIHsKKyAgICAgICAgRklMRSAqZnAgPSBmb3BlbihzdGFydHVwLCAiciIpOworICAgICAgICBpZiAoZnAgIT0gTlVMTCkgeworICAgICAgICAgICAgKHZvaWQpIFB5UnVuX1NpbXBsZUZpbGVFeEZsYWdzKGZwLCBzdGFydHVwLCAwLCBjZik7CisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgZmNsb3NlKGZwKTsKKyAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHNhdmVfZXJybm87CisgICAgICAgICAgICAgICAgICAgIHNhdmVfZXJybm8gPSBlcnJubzsKKyAgICAgICAgICAgICAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoIkNvdWxkIG5vdCBvcGVuIFBZVEhPTlNUQVJUVVBcbiIpOworICAgICAgICAgICAgICAgICAgICBlcnJubyA9IHNhdmVfZXJybm87CisgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldEZyb21FcnJub1dpdGhGaWxlbmFtZShQeUV4Y19JT0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnR1cCk7CisgICAgICAgICAgICAgICAgICAgIFB5RXJyX1ByaW50KCk7CisgICAgICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIH0KKyAgICB9CiB9CiAKIAogc3RhdGljIGludCBSdW5Nb2R1bGUoY2hhciAqbW9kdWxlLCBpbnQgc2V0X2FyZ3YwKQogewotCVB5T2JqZWN0ICpydW5weSwgKnJ1bm1vZHVsZSwgKnJ1bmFyZ3MsICpyZXN1bHQ7Ci0JcnVucHkgPSBQeUltcG9ydF9JbXBvcnRNb2R1bGUoInJ1bnB5Iik7Ci0JaWYgKHJ1bnB5ID09IE5VTEwpIHsKLQkJZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3QgaW1wb3J0IHJ1bnB5IG1vZHVsZVxuIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JcnVubW9kdWxlID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhydW5weSwgIl9ydW5fbW9kdWxlX2FzX21haW4iKTsKLQlpZiAocnVubW9kdWxlID09IE5VTEwpIHsKLQkJZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3QgYWNjZXNzIHJ1bnB5Ll9ydW5fbW9kdWxlX2FzX21haW5cbiIpOwotCQlQeV9ERUNSRUYocnVucHkpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXJ1bmFyZ3MgPSBQeV9CdWlsZFZhbHVlKCIoc2kpIiwgbW9kdWxlLCBzZXRfYXJndjApOwotCWlmIChydW5hcmdzID09IE5VTEwpIHsKLQkJZnByaW50ZihzdGRlcnIsCi0JCQkiQ291bGQgbm90IGNyZWF0ZSBhcmd1bWVudHMgZm9yIHJ1bnB5Ll9ydW5fbW9kdWxlX2FzX21haW5cbiIpOwotCQlQeV9ERUNSRUYocnVucHkpOwotCQlQeV9ERUNSRUYocnVubW9kdWxlKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlyZXN1bHQgPSBQeU9iamVjdF9DYWxsKHJ1bm1vZHVsZSwgcnVuYXJncywgTlVMTCk7Ci0JaWYgKHJlc3VsdCA9PSBOVUxMKSB7Ci0JCVB5RXJyX1ByaW50KCk7Ci0JfQotCVB5X0RFQ1JFRihydW5weSk7Ci0JUHlfREVDUkVGKHJ1bm1vZHVsZSk7Ci0JUHlfREVDUkVGKHJ1bmFyZ3MpOwotCWlmIChyZXN1bHQgPT0gTlVMTCkgewotCQlyZXR1cm4gLTE7Ci0JfQotCVB5X0RFQ1JFRihyZXN1bHQpOwotCXJldHVybiAwOworICAgIFB5T2JqZWN0ICpydW5weSwgKnJ1bm1vZHVsZSwgKnJ1bmFyZ3MsICpyZXN1bHQ7CisgICAgcnVucHkgPSBQeUltcG9ydF9JbXBvcnRNb2R1bGUoInJ1bnB5Iik7CisgICAgaWYgKHJ1bnB5ID09IE5VTEwpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3QgaW1wb3J0IHJ1bnB5IG1vZHVsZVxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcnVubW9kdWxlID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhydW5weSwgIl9ydW5fbW9kdWxlX2FzX21haW4iKTsKKyAgICBpZiAocnVubW9kdWxlID09IE5VTEwpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3QgYWNjZXNzIHJ1bnB5Ll9ydW5fbW9kdWxlX2FzX21haW5cbiIpOworICAgICAgICBQeV9ERUNSRUYocnVucHkpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJ1bmFyZ3MgPSBQeV9CdWlsZFZhbHVlKCIoc2kpIiwgbW9kdWxlLCBzZXRfYXJndjApOworICAgIGlmIChydW5hcmdzID09IE5VTEwpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAiQ291bGQgbm90IGNyZWF0ZSBhcmd1bWVudHMgZm9yIHJ1bnB5Ll9ydW5fbW9kdWxlX2FzX21haW5cbiIpOworICAgICAgICBQeV9ERUNSRUYocnVucHkpOworICAgICAgICBQeV9ERUNSRUYocnVubW9kdWxlKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXN1bHQgPSBQeU9iamVjdF9DYWxsKHJ1bm1vZHVsZSwgcnVuYXJncywgTlVMTCk7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1ByaW50KCk7CisgICAgfQorICAgIFB5X0RFQ1JFRihydW5weSk7CisgICAgUHlfREVDUkVGKHJ1bm1vZHVsZSk7CisgICAgUHlfREVDUkVGKHJ1bmFyZ3MpOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IFJ1bk1haW5Gcm9tSW1wb3J0ZXIoY2hhciAqZmlsZW5hbWUpCiB7Ci0JUHlPYmplY3QgKmFyZ3YwID0gTlVMTCwgKmltcG9ydGVyID0gTlVMTDsKKyAgICBQeU9iamVjdCAqYXJndjAgPSBOVUxMLCAqaW1wb3J0ZXIgPSBOVUxMOwogCi0JaWYgKChhcmd2MCA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoZmlsZW5hbWUpKSAmJiAKLQkgICAgKGltcG9ydGVyID0gUHlJbXBvcnRfR2V0SW1wb3J0ZXIoYXJndjApKSAmJgotCSAgICAoaW1wb3J0ZXItPm9iX3R5cGUgIT0gJlB5TnVsbEltcG9ydGVyX1R5cGUpKQotCXsKLQkJIC8qIGFyZ3YwIGlzIHVzYWJsZSBhcyBhbiBpbXBvcnQgc291cmNlLCBzbwotCQkJcHV0IGl0IGluIHN5cy5wYXRoWzBdIGFuZCBpbXBvcnQgX19tYWluX18gKi8KLQkJUHlPYmplY3QgKnN5c19wYXRoID0gTlVMTDsKLQkJaWYgKChzeXNfcGF0aCA9IFB5U3lzX0dldE9iamVjdCgicGF0aCIpKSAmJgotCQkgICAgIVB5TGlzdF9TZXRJdGVtKHN5c19wYXRoLCAwLCBhcmd2MCkpCi0JCXsKLQkJCVB5X0lOQ1JFRihhcmd2MCk7Ci0JCQlQeV9ERUNSRUYoaW1wb3J0ZXIpOwotCQkJc3lzX3BhdGggPSBOVUxMOwotCQkJcmV0dXJuIFJ1bk1vZHVsZSgiX19tYWluX18iLCAwKSAhPSAwOwotCQl9Ci0JfQotCVB5X1hERUNSRUYoYXJndjApOwotCVB5X1hERUNSRUYoaW1wb3J0ZXIpOwotCWlmIChQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCVB5RXJyX1ByaW50KCk7Ci0JCXJldHVybiAxOwotCX0KLQlyZXR1cm4gLTE7CisgICAgaWYgKChhcmd2MCA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoZmlsZW5hbWUpKSAmJgorICAgICAgICAoaW1wb3J0ZXIgPSBQeUltcG9ydF9HZXRJbXBvcnRlcihhcmd2MCkpICYmCisgICAgICAgIChpbXBvcnRlci0+b2JfdHlwZSAhPSAmUHlOdWxsSW1wb3J0ZXJfVHlwZSkpCisgICAgeworICAgICAgICAgICAgIC8qIGFyZ3YwIGlzIHVzYWJsZSBhcyBhbiBpbXBvcnQgc291cmNlLCBzbworICAgICAgICAgICAgICAgICAgICBwdXQgaXQgaW4gc3lzLnBhdGhbMF0gYW5kIGltcG9ydCBfX21haW5fXyAqLworICAgICAgICBQeU9iamVjdCAqc3lzX3BhdGggPSBOVUxMOworICAgICAgICBpZiAoKHN5c19wYXRoID0gUHlTeXNfR2V0T2JqZWN0KCJwYXRoIikpICYmCisgICAgICAgICAgICAhUHlMaXN0X1NldEl0ZW0oc3lzX3BhdGgsIDAsIGFyZ3YwKSkKKyAgICAgICAgeworICAgICAgICAgICAgUHlfSU5DUkVGKGFyZ3YwKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihpbXBvcnRlcik7CisgICAgICAgICAgICBzeXNfcGF0aCA9IE5VTEw7CisgICAgICAgICAgICByZXR1cm4gUnVuTW9kdWxlKCJfX21haW5fXyIsIDApICE9IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgUHlfWERFQ1JFRihhcmd2MCk7CisgICAgUHlfWERFQ1JFRihpbXBvcnRlcik7CisgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgUHlFcnJfUHJpbnQoKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHJldHVybiAtMTsKIH0KIAogCkBAIC0yMjcsMzk4ICsyMjcsMzk4IEBACiBpbnQKIFB5X01haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogewotCWludCBjOwotCWludCBzdHM7Ci0JY2hhciAqY29tbWFuZCA9IE5VTEw7Ci0JY2hhciAqZmlsZW5hbWUgPSBOVUxMOwotCWNoYXIgKm1vZHVsZSA9IE5VTEw7Ci0JRklMRSAqZnAgPSBzdGRpbjsKLQljaGFyICpwOwotCWludCB1bmJ1ZmZlcmVkID0gMDsKLQlpbnQgc2tpcGZpcnN0bGluZSA9IDA7Ci0JaW50IHN0ZGluX2lzX2ludGVyYWN0aXZlID0gMDsKLQlpbnQgaGVscCA9IDA7Ci0JaW50IHZlcnNpb24gPSAwOwotCWludCBzYXdfdW5idWZmZXJlZF9mbGFnID0gMDsKLQlQeUNvbXBpbGVyRmxhZ3MgY2Y7CisgICAgaW50IGM7CisgICAgaW50IHN0czsKKyAgICBjaGFyICpjb21tYW5kID0gTlVMTDsKKyAgICBjaGFyICpmaWxlbmFtZSA9IE5VTEw7CisgICAgY2hhciAqbW9kdWxlID0gTlVMTDsKKyAgICBGSUxFICpmcCA9IHN0ZGluOworICAgIGNoYXIgKnA7CisgICAgaW50IHVuYnVmZmVyZWQgPSAwOworICAgIGludCBza2lwZmlyc3RsaW5lID0gMDsKKyAgICBpbnQgc3RkaW5faXNfaW50ZXJhY3RpdmUgPSAwOworICAgIGludCBoZWxwID0gMDsKKyAgICBpbnQgdmVyc2lvbiA9IDA7CisgICAgaW50IHNhd191bmJ1ZmZlcmVkX2ZsYWcgPSAwOworICAgIFB5Q29tcGlsZXJGbGFncyBjZjsKIAotCWNmLmNmX2ZsYWdzID0gMDsKKyAgICBjZi5jZl9mbGFncyA9IDA7CiAKLQlvcmlnX2FyZ2MgPSBhcmdjOwkvKiBGb3IgUHlfR2V0QXJnY0FyZ3YoKSAqLwotCW9yaWdfYXJndiA9IGFyZ3Y7CisgICAgb3JpZ19hcmdjID0gYXJnYzsgICAgICAgICAgIC8qIEZvciBQeV9HZXRBcmdjQXJndigpICovCisgICAgb3JpZ19hcmd2ID0gYXJndjsKIAogI2lmZGVmIFJJU0NPUwotCVB5X1JJU0NPU1dpbXBGbGFnID0gMDsKKyAgICBQeV9SSVNDT1NXaW1wRmxhZyA9IDA7CiAjZW5kaWYKIAotCVB5U3lzX1Jlc2V0V2Fybk9wdGlvbnMoKTsKKyAgICBQeVN5c19SZXNldFdhcm5PcHRpb25zKCk7CiAKLQl3aGlsZSAoKGMgPSBfUHlPU19HZXRPcHQoYXJnYywgYXJndiwgUFJPR1JBTV9PUFRTKSkgIT0gRU9GKSB7Ci0JCWlmIChjID09ICdjJykgewotCQkJLyogLWMgaXMgdGhlIGxhc3Qgb3B0aW9uOyBmb2xsb3dpbmcgYXJndW1lbnRzCi0JCQkgICB0aGF0IGxvb2sgbGlrZSBvcHRpb25zIGFyZSBsZWZ0IGZvciB0aGUKLQkJCSAgIGNvbW1hbmQgdG8gaW50ZXJwcmV0LiAqLwotCQkJY29tbWFuZCA9IChjaGFyICopbWFsbG9jKHN0cmxlbihfUHlPU19vcHRhcmcpICsgMik7Ci0JCQlpZiAoY29tbWFuZCA9PSBOVUxMKQotCQkJCVB5X0ZhdGFsRXJyb3IoCi0JCQkJICAgIm5vdCBlbm91Z2ggbWVtb3J5IHRvIGNvcHkgLWMgYXJndW1lbnQiKTsKLQkJCXN0cmNweShjb21tYW5kLCBfUHlPU19vcHRhcmcpOwotCQkJc3RyY2F0KGNvbW1hbmQsICJcbiIpOwotCQkJYnJlYWs7Ci0JCX0KKyAgICB3aGlsZSAoKGMgPSBfUHlPU19HZXRPcHQoYXJnYywgYXJndiwgUFJPR1JBTV9PUFRTKSkgIT0gRU9GKSB7CisgICAgICAgIGlmIChjID09ICdjJykgeworICAgICAgICAgICAgLyogLWMgaXMgdGhlIGxhc3Qgb3B0aW9uOyBmb2xsb3dpbmcgYXJndW1lbnRzCisgICAgICAgICAgICAgICB0aGF0IGxvb2sgbGlrZSBvcHRpb25zIGFyZSBsZWZ0IGZvciB0aGUKKyAgICAgICAgICAgICAgIGNvbW1hbmQgdG8gaW50ZXJwcmV0LiAqLworICAgICAgICAgICAgY29tbWFuZCA9IChjaGFyICopbWFsbG9jKHN0cmxlbihfUHlPU19vcHRhcmcpICsgMik7CisgICAgICAgICAgICBpZiAoY29tbWFuZCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIFB5X0ZhdGFsRXJyb3IoCisgICAgICAgICAgICAgICAgICAgIm5vdCBlbm91Z2ggbWVtb3J5IHRvIGNvcHkgLWMgYXJndW1lbnQiKTsKKyAgICAgICAgICAgIHN0cmNweShjb21tYW5kLCBfUHlPU19vcHRhcmcpOworICAgICAgICAgICAgc3RyY2F0KGNvbW1hbmQsICJcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KIAotCQlpZiAoYyA9PSAnbScpIHsKLQkJCS8qIC1tIGlzIHRoZSBsYXN0IG9wdGlvbjsgZm9sbG93aW5nIGFyZ3VtZW50cwotCQkJICAgdGhhdCBsb29rIGxpa2Ugb3B0aW9ucyBhcmUgbGVmdCBmb3IgdGhlCi0JCQkgICBtb2R1bGUgdG8gaW50ZXJwcmV0LiAqLwotCQkJbW9kdWxlID0gKGNoYXIgKiltYWxsb2Moc3RybGVuKF9QeU9TX29wdGFyZykgKyAyKTsKLQkJCWlmIChtb2R1bGUgPT0gTlVMTCkKLQkJCQlQeV9GYXRhbEVycm9yKAotCQkJCSAgICJub3QgZW5vdWdoIG1lbW9yeSB0byBjb3B5IC1tIGFyZ3VtZW50Iik7Ci0JCQlzdHJjcHkobW9kdWxlLCBfUHlPU19vcHRhcmcpOwotCQkJYnJlYWs7Ci0JCX0KKyAgICAgICAgaWYgKGMgPT0gJ20nKSB7CisgICAgICAgICAgICAvKiAtbSBpcyB0aGUgbGFzdCBvcHRpb247IGZvbGxvd2luZyBhcmd1bWVudHMKKyAgICAgICAgICAgICAgIHRoYXQgbG9vayBsaWtlIG9wdGlvbnMgYXJlIGxlZnQgZm9yIHRoZQorICAgICAgICAgICAgICAgbW9kdWxlIHRvIGludGVycHJldC4gKi8KKyAgICAgICAgICAgIG1vZHVsZSA9IChjaGFyICopbWFsbG9jKHN0cmxlbihfUHlPU19vcHRhcmcpICsgMik7CisgICAgICAgICAgICBpZiAobW9kdWxlID09IE5VTEwpCisgICAgICAgICAgICAgICAgUHlfRmF0YWxFcnJvcigKKyAgICAgICAgICAgICAgICAgICAibm90IGVub3VnaCBtZW1vcnkgdG8gY29weSAtbSBhcmd1bWVudCIpOworICAgICAgICAgICAgc3RyY3B5KG1vZHVsZSwgX1B5T1Nfb3B0YXJnKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CiAKLQkJc3dpdGNoIChjKSB7Ci0JCWNhc2UgJ2InOgotCQkJUHlfQnl0ZXNXYXJuaW5nRmxhZysrOwotCQkJYnJlYWs7CisgICAgICAgIHN3aXRjaCAoYykgeworICAgICAgICBjYXNlICdiJzoKKyAgICAgICAgICAgIFB5X0J5dGVzV2FybmluZ0ZsYWcrKzsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgJ2QnOgotCQkJUHlfRGVidWdGbGFnKys7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSAnZCc6CisgICAgICAgICAgICBQeV9EZWJ1Z0ZsYWcrKzsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgJzMnOgotCQkJUHlfUHkza1dhcm5pbmdGbGFnKys7Ci0JCQlpZiAoIVB5X0RpdmlzaW9uV2FybmluZ0ZsYWcpCi0JCQkJUHlfRGl2aXNpb25XYXJuaW5nRmxhZyA9IDE7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSAnMyc6CisgICAgICAgICAgICBQeV9QeTNrV2FybmluZ0ZsYWcrKzsKKyAgICAgICAgICAgIGlmICghUHlfRGl2aXNpb25XYXJuaW5nRmxhZykKKyAgICAgICAgICAgICAgICBQeV9EaXZpc2lvbldhcm5pbmdGbGFnID0gMTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgJ1EnOgotCQkJaWYgKHN0cmNtcChfUHlPU19vcHRhcmcsICJvbGQiKSA9PSAwKSB7Ci0JCQkJUHlfRGl2aXNpb25XYXJuaW5nRmxhZyA9IDA7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoc3RyY21wKF9QeU9TX29wdGFyZywgIndhcm4iKSA9PSAwKSB7Ci0JCQkJUHlfRGl2aXNpb25XYXJuaW5nRmxhZyA9IDE7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoc3RyY21wKF9QeU9TX29wdGFyZywgIndhcm5hbGwiKSA9PSAwKSB7Ci0JCQkJUHlfRGl2aXNpb25XYXJuaW5nRmxhZyA9IDI7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoc3RyY21wKF9QeU9TX29wdGFyZywgIm5ldyIpID09IDApIHsKLQkJCQkvKiBUaGlzIG9ubHkgYWZmZWN0cyBfX21haW5fXyAqLwotCQkJCWNmLmNmX2ZsYWdzIHw9IENPX0ZVVFVSRV9ESVZJU0lPTjsKLQkJCQkvKiBBbmQgdGhpcyB0ZWxscyB0aGUgZXZhbCBsb29wIHRvIHRyZWF0Ci0JCQkJICAgQklOQVJZX0RJVklERSBhcyBCSU5BUllfVFJVRV9ESVZJREUgKi8KLQkJCQlfUHlfUW5ld0ZsYWcgPSAxOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZnByaW50ZihzdGRlcnIsCi0JCQkJIi1RIG9wdGlvbiBzaG91bGQgYmUgYC1Rb2xkJywgIgotCQkJCSJgLVF3YXJuJywgYC1Rd2FybmFsbCcsIG9yIGAtUW5ldycgb25seVxuIik7Ci0JCQlyZXR1cm4gdXNhZ2UoMiwgYXJndlswXSk7Ci0JCQkvKiBOT1RSRUFDSEVEICovCisgICAgICAgIGNhc2UgJ1EnOgorICAgICAgICAgICAgaWYgKHN0cmNtcChfUHlPU19vcHRhcmcsICJvbGQiKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgUHlfRGl2aXNpb25XYXJuaW5nRmxhZyA9IDA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3RyY21wKF9QeU9TX29wdGFyZywgIndhcm4iKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgUHlfRGl2aXNpb25XYXJuaW5nRmxhZyA9IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3RyY21wKF9QeU9TX29wdGFyZywgIndhcm5hbGwiKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgUHlfRGl2aXNpb25XYXJuaW5nRmxhZyA9IDI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3RyY21wKF9QeU9TX29wdGFyZywgIm5ldyIpID09IDApIHsKKyAgICAgICAgICAgICAgICAvKiBUaGlzIG9ubHkgYWZmZWN0cyBfX21haW5fXyAqLworICAgICAgICAgICAgICAgIGNmLmNmX2ZsYWdzIHw9IENPX0ZVVFVSRV9ESVZJU0lPTjsKKyAgICAgICAgICAgICAgICAvKiBBbmQgdGhpcyB0ZWxscyB0aGUgZXZhbCBsb29wIHRvIHRyZWF0CisgICAgICAgICAgICAgICAgICAgQklOQVJZX0RJVklERSBhcyBCSU5BUllfVFJVRV9ESVZJREUgKi8KKyAgICAgICAgICAgICAgICBfUHlfUW5ld0ZsYWcgPSAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAgICAgIi1RIG9wdGlvbiBzaG91bGQgYmUgYC1Rb2xkJywgIgorICAgICAgICAgICAgICAgICJgLVF3YXJuJywgYC1Rd2FybmFsbCcsIG9yIGAtUW5ldycgb25seVxuIik7CisgICAgICAgICAgICByZXR1cm4gdXNhZ2UoMiwgYXJndlswXSk7CisgICAgICAgICAgICAvKiBOT1RSRUFDSEVEICovCiAKLQkJY2FzZSAnaSc6Ci0JCQlQeV9JbnNwZWN0RmxhZysrOwotCQkJUHlfSW50ZXJhY3RpdmVGbGFnKys7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSAnaSc6CisgICAgICAgICAgICBQeV9JbnNwZWN0RmxhZysrOworICAgICAgICAgICAgUHlfSW50ZXJhY3RpdmVGbGFnKys7CisgICAgICAgICAgICBicmVhazsKIAotCQkvKiBjYXNlICdKJzogcmVzZXJ2ZWQgZm9yIEp5dGhvbiAqLworICAgICAgICAvKiBjYXNlICdKJzogcmVzZXJ2ZWQgZm9yIEp5dGhvbiAqLwogCi0JCWNhc2UgJ08nOgotCQkJUHlfT3B0aW1pemVGbGFnKys7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSAnTyc6CisgICAgICAgICAgICBQeV9PcHRpbWl6ZUZsYWcrKzsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgJ0InOgotCQkJUHlfRG9udFdyaXRlQnl0ZWNvZGVGbGFnKys7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSAnQic6CisgICAgICAgICAgICBQeV9Eb250V3JpdGVCeXRlY29kZUZsYWcrKzsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgJ3MnOgotCQkJUHlfTm9Vc2VyU2l0ZURpcmVjdG9yeSsrOwotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgJ3MnOgorICAgICAgICAgICAgUHlfTm9Vc2VyU2l0ZURpcmVjdG9yeSsrOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSAnUyc6Ci0JCQlQeV9Ob1NpdGVGbGFnKys7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSAnUyc6CisgICAgICAgICAgICBQeV9Ob1NpdGVGbGFnKys7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlICdFJzoKLQkJCVB5X0lnbm9yZUVudmlyb25tZW50RmxhZysrOwotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgJ0UnOgorICAgICAgICAgICAgUHlfSWdub3JlRW52aXJvbm1lbnRGbGFnKys7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlICd0JzoKLQkJCVB5X1RhYmNoZWNrRmxhZysrOwotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgJ3QnOgorICAgICAgICAgICAgUHlfVGFiY2hlY2tGbGFnKys7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlICd1JzoKLQkJCXVuYnVmZmVyZWQrKzsKLQkJCXNhd191bmJ1ZmZlcmVkX2ZsYWcgPSAxOwotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgJ3UnOgorICAgICAgICAgICAgdW5idWZmZXJlZCsrOworICAgICAgICAgICAgc2F3X3VuYnVmZmVyZWRfZmxhZyA9IDE7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlICd2JzoKLQkJCVB5X1ZlcmJvc2VGbGFnKys7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSAndic6CisgICAgICAgICAgICBQeV9WZXJib3NlRmxhZysrOworICAgICAgICAgICAgYnJlYWs7CiAKICNpZmRlZiBSSVNDT1MKLQkJY2FzZSAndyc6Ci0JCQlQeV9SSVNDT1NXaW1wRmxhZyA9IDE7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSAndyc6CisgICAgICAgICAgICBQeV9SSVNDT1NXaW1wRmxhZyA9IDE7CisgICAgICAgICAgICBicmVhazsKICNlbmRpZgogCi0JCWNhc2UgJ3gnOgotCQkJc2tpcGZpcnN0bGluZSA9IDE7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSAneCc6CisgICAgICAgICAgICBza2lwZmlyc3RsaW5lID0gMTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCS8qIGNhc2UgJ1gnOiByZXNlcnZlZCBmb3IgaW1wbGVtZW50YXRpb24tc3BlY2lmaWMgYXJndW1lbnRzICovCisgICAgICAgIC8qIGNhc2UgJ1gnOiByZXNlcnZlZCBmb3IgaW1wbGVtZW50YXRpb24tc3BlY2lmaWMgYXJndW1lbnRzICovCiAKLQkJY2FzZSAnVSc6Ci0JCQlQeV9Vbmljb2RlRmxhZysrOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ2gnOgotCQljYXNlICc/JzoKLQkJCWhlbHArKzsKLQkJCWJyZWFrOwotCQljYXNlICdWJzoKLQkJCXZlcnNpb24rKzsKLQkJCWJyZWFrOworICAgICAgICBjYXNlICdVJzoKKyAgICAgICAgICAgIFB5X1VuaWNvZGVGbGFnKys7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnaCc6CisgICAgICAgIGNhc2UgJz8nOgorICAgICAgICAgICAgaGVscCsrOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ1YnOgorICAgICAgICAgICAgdmVyc2lvbisrOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSAnVyc6Ci0JCQlQeVN5c19BZGRXYXJuT3B0aW9uKF9QeU9TX29wdGFyZyk7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSAnVyc6CisgICAgICAgICAgICBQeVN5c19BZGRXYXJuT3B0aW9uKF9QeU9TX29wdGFyZyk7CisgICAgICAgICAgICBicmVhazsKIAotCQkvKiBUaGlzIHNwYWNlIHJlc2VydmVkIGZvciBvdGhlciBvcHRpb25zICovCisgICAgICAgIC8qIFRoaXMgc3BhY2UgcmVzZXJ2ZWQgZm9yIG90aGVyIG9wdGlvbnMgKi8KIAotCQlkZWZhdWx0OgotCQkJcmV0dXJuIHVzYWdlKDIsIGFyZ3ZbMF0pOwotCQkJLypOT1RSRUFDSEVEKi8KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiB1c2FnZSgyLCBhcmd2WzBdKTsKKyAgICAgICAgICAgIC8qTk9UUkVBQ0hFRCovCiAKLQkJfQotCX0KKyAgICAgICAgfQorICAgIH0KIAotCWlmIChoZWxwKQotCQlyZXR1cm4gdXNhZ2UoMCwgYXJndlswXSk7CisgICAgaWYgKGhlbHApCisgICAgICAgIHJldHVybiB1c2FnZSgwLCBhcmd2WzBdKTsKIAotCWlmICh2ZXJzaW9uKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAiUHl0aG9uICVzXG4iLCBQWV9WRVJTSU9OKTsKLQkJcmV0dXJuIDA7Ci0JfQorICAgIGlmICh2ZXJzaW9uKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiUHl0aG9uICVzXG4iLCBQWV9WRVJTSU9OKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCi0JaWYgKCFQeV9JbnNwZWN0RmxhZyAmJgotCSAgICAocCA9IFB5X0dFVEVOVigiUFlUSE9OSU5TUEVDVCIpKSAmJiAqcCAhPSAnXDAnKQotCQlQeV9JbnNwZWN0RmxhZyA9IDE7Ci0JaWYgKCFzYXdfdW5idWZmZXJlZF9mbGFnICYmCi0JICAgIChwID0gUHlfR0VURU5WKCJQWVRIT05VTkJVRkZFUkVEIikpICYmICpwICE9ICdcMCcpCi0JCXVuYnVmZmVyZWQgPSAxOworICAgIGlmICghUHlfSW5zcGVjdEZsYWcgJiYKKyAgICAgICAgKHAgPSBQeV9HRVRFTlYoIlBZVEhPTklOU1BFQ1QiKSkgJiYgKnAgIT0gJ1wwJykKKyAgICAgICAgUHlfSW5zcGVjdEZsYWcgPSAxOworICAgIGlmICghc2F3X3VuYnVmZmVyZWRfZmxhZyAmJgorICAgICAgICAocCA9IFB5X0dFVEVOVigiUFlUSE9OVU5CVUZGRVJFRCIpKSAmJiAqcCAhPSAnXDAnKQorICAgICAgICB1bmJ1ZmZlcmVkID0gMTsKIAotCWlmICghUHlfTm9Vc2VyU2l0ZURpcmVjdG9yeSAmJgotCSAgICAocCA9IFB5X0dFVEVOVigiUFlUSE9OTk9VU0VSU0lURSIpKSAmJiAqcCAhPSAnXDAnKQotCQlQeV9Ob1VzZXJTaXRlRGlyZWN0b3J5ID0gMTsKKyAgICBpZiAoIVB5X05vVXNlclNpdGVEaXJlY3RvcnkgJiYKKyAgICAgICAgKHAgPSBQeV9HRVRFTlYoIlBZVEhPTk5PVVNFUlNJVEUiKSkgJiYgKnAgIT0gJ1wwJykKKyAgICAgICAgUHlfTm9Vc2VyU2l0ZURpcmVjdG9yeSA9IDE7CiAKLQlpZiAoY29tbWFuZCA9PSBOVUxMICYmIG1vZHVsZSA9PSBOVUxMICYmIF9QeU9TX29wdGluZCA8IGFyZ2MgJiYKLQkgICAgc3RyY21wKGFyZ3ZbX1B5T1Nfb3B0aW5kXSwgIi0iKSAhPSAwKQotCXsKKyAgICBpZiAoY29tbWFuZCA9PSBOVUxMICYmIG1vZHVsZSA9PSBOVUxMICYmIF9QeU9TX29wdGluZCA8IGFyZ2MgJiYKKyAgICAgICAgc3RyY21wKGFyZ3ZbX1B5T1Nfb3B0aW5kXSwgIi0iKSAhPSAwKQorICAgIHsKICNpZmRlZiBfX1ZNUwotCQlmaWxlbmFtZSA9IGRlY2MkdHJhbnNsYXRlX3Ztcyhhcmd2W19QeU9TX29wdGluZF0pOwotCQlpZiAoZmlsZW5hbWUgPT0gKGNoYXIgKikwIHx8IGZpbGVuYW1lID09IChjaGFyICopLTEpCi0JCQlmaWxlbmFtZSA9IGFyZ3ZbX1B5T1Nfb3B0aW5kXTsKKyAgICAgICAgZmlsZW5hbWUgPSBkZWNjJHRyYW5zbGF0ZV92bXMoYXJndltfUHlPU19vcHRpbmRdKTsKKyAgICAgICAgaWYgKGZpbGVuYW1lID09IChjaGFyICopMCB8fCBmaWxlbmFtZSA9PSAoY2hhciAqKS0xKQorICAgICAgICAgICAgZmlsZW5hbWUgPSBhcmd2W19QeU9TX29wdGluZF07CiAKICNlbHNlCi0JCWZpbGVuYW1lID0gYXJndltfUHlPU19vcHRpbmRdOworICAgICAgICBmaWxlbmFtZSA9IGFyZ3ZbX1B5T1Nfb3B0aW5kXTsKICNlbmRpZgotCX0KKyAgICB9CiAKLQlzdGRpbl9pc19pbnRlcmFjdGl2ZSA9IFB5X0ZkSXNJbnRlcmFjdGl2ZShzdGRpbiwgKGNoYXIgKikwKTsKKyAgICBzdGRpbl9pc19pbnRlcmFjdGl2ZSA9IFB5X0ZkSXNJbnRlcmFjdGl2ZShzdGRpbiwgKGNoYXIgKikwKTsKIAotCWlmICh1bmJ1ZmZlcmVkKSB7CisgICAgaWYgKHVuYnVmZmVyZWQpIHsKICNpZiBkZWZpbmVkKE1TX1dJTkRPV1MpIHx8IGRlZmluZWQoX19DWUdXSU5fXykKLQkJX3NldG1vZGUoZmlsZW5vKHN0ZGluKSwgT19CSU5BUlkpOwotCQlfc2V0bW9kZShmaWxlbm8oc3Rkb3V0KSwgT19CSU5BUlkpOworICAgICAgICBfc2V0bW9kZShmaWxlbm8oc3RkaW4pLCBPX0JJTkFSWSk7CisgICAgICAgIF9zZXRtb2RlKGZpbGVubyhzdGRvdXQpLCBPX0JJTkFSWSk7CiAjZW5kaWYKICNpZmRlZiBIQVZFX1NFVFZCVUYKLQkJc2V0dmJ1ZihzdGRpbiwgIChjaGFyICopTlVMTCwgX0lPTkJGLCBCVUZTSVopOwotCQlzZXR2YnVmKHN0ZG91dCwgKGNoYXIgKilOVUxMLCBfSU9OQkYsIEJVRlNJWik7Ci0JCXNldHZidWYoc3RkZXJyLCAoY2hhciAqKU5VTEwsIF9JT05CRiwgQlVGU0laKTsKKyAgICAgICAgc2V0dmJ1ZihzdGRpbiwgIChjaGFyICopTlVMTCwgX0lPTkJGLCBCVUZTSVopOworICAgICAgICBzZXR2YnVmKHN0ZG91dCwgKGNoYXIgKilOVUxMLCBfSU9OQkYsIEJVRlNJWik7CisgICAgICAgIHNldHZidWYoc3RkZXJyLCAoY2hhciAqKU5VTEwsIF9JT05CRiwgQlVGU0laKTsKICNlbHNlIC8qICFIQVZFX1NFVFZCVUYgKi8KLQkJc2V0YnVmKHN0ZGluLCAgKGNoYXIgKilOVUxMKTsKLQkJc2V0YnVmKHN0ZG91dCwgKGNoYXIgKilOVUxMKTsKLQkJc2V0YnVmKHN0ZGVyciwgKGNoYXIgKilOVUxMKTsKKyAgICAgICAgc2V0YnVmKHN0ZGluLCAgKGNoYXIgKilOVUxMKTsKKyAgICAgICAgc2V0YnVmKHN0ZG91dCwgKGNoYXIgKilOVUxMKTsKKyAgICAgICAgc2V0YnVmKHN0ZGVyciwgKGNoYXIgKilOVUxMKTsKICNlbmRpZiAvKiAhSEFWRV9TRVRWQlVGICovCi0JfQotCWVsc2UgaWYgKFB5X0ludGVyYWN0aXZlRmxhZykgeworICAgIH0KKyAgICBlbHNlIGlmIChQeV9JbnRlcmFjdGl2ZUZsYWcpIHsKICNpZmRlZiBNU19XSU5ET1dTCi0JCS8qIERvZXNuJ3QgaGF2ZSB0byBoYXZlIGxpbmUtYnVmZmVyZWQgLS0gdXNlIHVuYnVmZmVyZWQgKi8KLQkJLyogQW55IHNldFt2XWJ1ZihzdGRpbiwgLi4uKSBzY3Jld3MgdXAgVGtpbnRlciA6LSggKi8KLQkJc2V0dmJ1ZihzdGRvdXQsIChjaGFyICopTlVMTCwgX0lPTkJGLCBCVUZTSVopOworICAgICAgICAvKiBEb2Vzbid0IGhhdmUgdG8gaGF2ZSBsaW5lLWJ1ZmZlcmVkIC0tIHVzZSB1bmJ1ZmZlcmVkICovCisgICAgICAgIC8qIEFueSBzZXRbdl1idWYoc3RkaW4sIC4uLikgc2NyZXdzIHVwIFRraW50ZXIgOi0oICovCisgICAgICAgIHNldHZidWYoc3Rkb3V0LCAoY2hhciAqKU5VTEwsIF9JT05CRiwgQlVGU0laKTsKICNlbHNlIC8qICFNU19XSU5ET1dTICovCiAjaWZkZWYgSEFWRV9TRVRWQlVGCi0JCXNldHZidWYoc3RkaW4sICAoY2hhciAqKU5VTEwsIF9JT0xCRiwgQlVGU0laKTsKLQkJc2V0dmJ1ZihzdGRvdXQsIChjaGFyICopTlVMTCwgX0lPTEJGLCBCVUZTSVopOworICAgICAgICBzZXR2YnVmKHN0ZGluLCAgKGNoYXIgKilOVUxMLCBfSU9MQkYsIEJVRlNJWik7CisgICAgICAgIHNldHZidWYoc3Rkb3V0LCAoY2hhciAqKU5VTEwsIF9JT0xCRiwgQlVGU0laKTsKICNlbmRpZiAvKiBIQVZFX1NFVFZCVUYgKi8KICNlbmRpZiAvKiAhTVNfV0lORE9XUyAqLwotCQkvKiBMZWF2ZSBzdGRlcnIgYWxvbmUgLSBpdCBzaG91bGQgYmUgdW5idWZmZXJlZCBhbnl3YXkuICovCi0gIAl9CisgICAgICAgIC8qIExlYXZlIHN0ZGVyciBhbG9uZSAtIGl0IHNob3VsZCBiZSB1bmJ1ZmZlcmVkIGFueXdheS4gKi8KKyAgICB9CiAjaWZkZWYgX19WTVMKLQllbHNlIHsKLQkJc2V0dmJ1ZiAoc3Rkb3V0LCAoY2hhciAqKU5VTEwsIF9JT0xCRiwgQlVGU0laKTsKLQl9CisgICAgZWxzZSB7CisgICAgICAgIHNldHZidWYgKHN0ZG91dCwgKGNoYXIgKilOVUxMLCBfSU9MQkYsIEJVRlNJWik7CisgICAgfQogI2VuZGlmIC8qIF9fVk1TICovCiAKICNpZmRlZiBfX0FQUExFX18KLQkvKiBPbiBNYWNPUyBYLCB3aGVuIHRoZSBQeXRob24gaW50ZXJwcmV0ZXIgaXMgZW1iZWRkZWQgaW4gYW4KLQkgICBhcHBsaWNhdGlvbiBidW5kbGUsIGl0IGdldHMgZXhlY3V0ZWQgYnkgYSBib290c3RyYXBwaW5nIHNjcmlwdAotCSAgIHRoYXQgZG9lcyBvcy5leGVjdmUoKSB3aXRoIGFuIGFyZ3ZbMF0gdGhhdCdzIGRpZmZlcmVudCBmcm9tIHRoZQotCSAgIGFjdHVhbCBQeXRob24gZXhlY3V0YWJsZS4gVGhpcyBpcyBuZWVkZWQgdG8ga2VlcCB0aGUgRmluZGVyIGhhcHB5LAotCSAgIG9yIHJhdGhlciwgdG8gd29yayBhcm91bmQgQXBwbGUncyBvdmVybHkgc3RyaWN0IHJlcXVpcmVtZW50cyBvZgotCSAgIHRoZSBwcm9jZXNzIG5hbWUuIEhvd2V2ZXIsIHdlIHN0aWxsIG5lZWQgYSB1c2FibGUgc3lzLmV4ZWN1dGFibGUsCi0JICAgc28gdGhlIGFjdHVhbCBleGVjdXRhYmxlIHBhdGggaXMgcGFzc2VkIGluIGFuIGVudmlyb25tZW50IHZhcmlhYmxlLgotCSAgIFNlZSBMaWIvcGxhdC1tYWMvYnVuZGxlYnVpbGVyLnB5IGZvciBkZXRhaWxzIGFib3V0IHRoZSBib290c3RyYXAKLQkgICBzY3JpcHQuICovCi0JaWYgKChwID0gUHlfR0VURU5WKCJQWVRIT05FWEVDVVRBQkxFIikpICYmICpwICE9ICdcMCcpCi0JCVB5X1NldFByb2dyYW1OYW1lKHApOwotCWVsc2UKLQkJUHlfU2V0UHJvZ3JhbU5hbWUoYXJndlswXSk7CisgICAgLyogT24gTWFjT1MgWCwgd2hlbiB0aGUgUHl0aG9uIGludGVycHJldGVyIGlzIGVtYmVkZGVkIGluIGFuCisgICAgICAgYXBwbGljYXRpb24gYnVuZGxlLCBpdCBnZXRzIGV4ZWN1dGVkIGJ5IGEgYm9vdHN0cmFwcGluZyBzY3JpcHQKKyAgICAgICB0aGF0IGRvZXMgb3MuZXhlY3ZlKCkgd2l0aCBhbiBhcmd2WzBdIHRoYXQncyBkaWZmZXJlbnQgZnJvbSB0aGUKKyAgICAgICBhY3R1YWwgUHl0aG9uIGV4ZWN1dGFibGUuIFRoaXMgaXMgbmVlZGVkIHRvIGtlZXAgdGhlIEZpbmRlciBoYXBweSwKKyAgICAgICBvciByYXRoZXIsIHRvIHdvcmsgYXJvdW5kIEFwcGxlJ3Mgb3Zlcmx5IHN0cmljdCByZXF1aXJlbWVudHMgb2YKKyAgICAgICB0aGUgcHJvY2VzcyBuYW1lLiBIb3dldmVyLCB3ZSBzdGlsbCBuZWVkIGEgdXNhYmxlIHN5cy5leGVjdXRhYmxlLAorICAgICAgIHNvIHRoZSBhY3R1YWwgZXhlY3V0YWJsZSBwYXRoIGlzIHBhc3NlZCBpbiBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZS4KKyAgICAgICBTZWUgTGliL3BsYXQtbWFjL2J1bmRsZWJ1aWxlci5weSBmb3IgZGV0YWlscyBhYm91dCB0aGUgYm9vdHN0cmFwCisgICAgICAgc2NyaXB0LiAqLworICAgIGlmICgocCA9IFB5X0dFVEVOVigiUFlUSE9ORVhFQ1VUQUJMRSIpKSAmJiAqcCAhPSAnXDAnKQorICAgICAgICBQeV9TZXRQcm9ncmFtTmFtZShwKTsKKyAgICBlbHNlCisgICAgICAgIFB5X1NldFByb2dyYW1OYW1lKGFyZ3ZbMF0pOwogI2Vsc2UKLQlQeV9TZXRQcm9ncmFtTmFtZShhcmd2WzBdKTsKKyAgICBQeV9TZXRQcm9ncmFtTmFtZShhcmd2WzBdKTsKICNlbmRpZgotCVB5X0luaXRpYWxpemUoKTsKKyAgICBQeV9Jbml0aWFsaXplKCk7CiAKLQlpZiAoUHlfVmVyYm9zZUZsYWcgfHwKLQkgICAgKGNvbW1hbmQgPT0gTlVMTCAmJiBmaWxlbmFtZSA9PSBOVUxMICYmIG1vZHVsZSA9PSBOVUxMICYmIHN0ZGluX2lzX2ludGVyYWN0aXZlKSkgewotCQlmcHJpbnRmKHN0ZGVyciwgIlB5dGhvbiAlcyBvbiAlc1xuIiwKLQkJCVB5X0dldFZlcnNpb24oKSwgUHlfR2V0UGxhdGZvcm0oKSk7Ci0gCQlpZiAoIVB5X05vU2l0ZUZsYWcpCi0gCQkJZnByaW50ZihzdGRlcnIsICIlc1xuIiwgQ09QWVJJR0hUKTsKLQl9CisgICAgaWYgKFB5X1ZlcmJvc2VGbGFnIHx8CisgICAgICAgIChjb21tYW5kID09IE5VTEwgJiYgZmlsZW5hbWUgPT0gTlVMTCAmJiBtb2R1bGUgPT0gTlVMTCAmJiBzdGRpbl9pc19pbnRlcmFjdGl2ZSkpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJQeXRob24gJXMgb24gJXNcbiIsCisgICAgICAgICAgICBQeV9HZXRWZXJzaW9uKCksIFB5X0dldFBsYXRmb3JtKCkpOworICAgICAgICBpZiAoIVB5X05vU2l0ZUZsYWcpCisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzXG4iLCBDT1BZUklHSFQpOworICAgIH0KIAotCWlmIChjb21tYW5kICE9IE5VTEwpIHsKLQkJLyogQmFja3VwIF9QeU9TX29wdGluZCBhbmQgZm9yY2Ugc3lzLmFyZ3ZbMF0gPSAnLWMnICovCi0JCV9QeU9TX29wdGluZC0tOwotCQlhcmd2W19QeU9TX29wdGluZF0gPSAiLWMiOwotCX0KKyAgICBpZiAoY29tbWFuZCAhPSBOVUxMKSB7CisgICAgICAgIC8qIEJhY2t1cCBfUHlPU19vcHRpbmQgYW5kIGZvcmNlIHN5cy5hcmd2WzBdID0gJy1jJyAqLworICAgICAgICBfUHlPU19vcHRpbmQtLTsKKyAgICAgICAgYXJndltfUHlPU19vcHRpbmRdID0gIi1jIjsKKyAgICB9CiAKLQlpZiAobW9kdWxlICE9IE5VTEwpIHsKLQkJLyogQmFja3VwIF9QeU9TX29wdGluZCBhbmQgZm9yY2Ugc3lzLmFyZ3ZbMF0gPSAnLWMnCi0JCSAgIHNvIHRoYXQgUHlTeXNfU2V0QXJndiBjb3JyZWN0bHkgc2V0cyBzeXMucGF0aFswXSB0byAnJyovCi0JCV9QeU9TX29wdGluZC0tOwotCQlhcmd2W19QeU9TX29wdGluZF0gPSAiLWMiOwotCX0KKyAgICBpZiAobW9kdWxlICE9IE5VTEwpIHsKKyAgICAgICAgLyogQmFja3VwIF9QeU9TX29wdGluZCBhbmQgZm9yY2Ugc3lzLmFyZ3ZbMF0gPSAnLWMnCisgICAgICAgICAgIHNvIHRoYXQgUHlTeXNfU2V0QXJndiBjb3JyZWN0bHkgc2V0cyBzeXMucGF0aFswXSB0byAnJyovCisgICAgICAgIF9QeU9TX29wdGluZC0tOworICAgICAgICBhcmd2W19QeU9TX29wdGluZF0gPSAiLWMiOworICAgIH0KIAotCVB5U3lzX1NldEFyZ3YoYXJnYy1fUHlPU19vcHRpbmQsIGFyZ3YrX1B5T1Nfb3B0aW5kKTsKKyAgICBQeVN5c19TZXRBcmd2KGFyZ2MtX1B5T1Nfb3B0aW5kLCBhcmd2K19QeU9TX29wdGluZCk7CiAKLQlpZiAoKFB5X0luc3BlY3RGbGFnIHx8IChjb21tYW5kID09IE5VTEwgJiYgZmlsZW5hbWUgPT0gTlVMTCAmJiBtb2R1bGUgPT0gTlVMTCkpICYmCi0JICAgIGlzYXR0eShmaWxlbm8oc3RkaW4pKSkgewotCQlQeU9iamVjdCAqdjsKLQkJdiA9IFB5SW1wb3J0X0ltcG9ydE1vZHVsZSgicmVhZGxpbmUiKTsKLQkJaWYgKHYgPT0gTlVMTCkKLQkJCVB5RXJyX0NsZWFyKCk7Ci0JCWVsc2UKLQkJCVB5X0RFQ1JFRih2KTsKLQl9CisgICAgaWYgKChQeV9JbnNwZWN0RmxhZyB8fCAoY29tbWFuZCA9PSBOVUxMICYmIGZpbGVuYW1lID09IE5VTEwgJiYgbW9kdWxlID09IE5VTEwpKSAmJgorICAgICAgICBpc2F0dHkoZmlsZW5vKHN0ZGluKSkpIHsKKyAgICAgICAgUHlPYmplY3QgKnY7CisgICAgICAgIHYgPSBQeUltcG9ydF9JbXBvcnRNb2R1bGUoInJlYWRsaW5lIik7CisgICAgICAgIGlmICh2ID09IE5VTEwpCisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgfQogCi0JaWYgKGNvbW1hbmQpIHsKLQkJc3RzID0gUHlSdW5fU2ltcGxlU3RyaW5nRmxhZ3MoY29tbWFuZCwgJmNmKSAhPSAwOwotCQlmcmVlKGNvbW1hbmQpOwotCX0gZWxzZSBpZiAobW9kdWxlKSB7Ci0JCXN0cyA9IFJ1bk1vZHVsZShtb2R1bGUsIDEpOwotCQlmcmVlKG1vZHVsZSk7Ci0JfQotCWVsc2UgeworICAgIGlmIChjb21tYW5kKSB7CisgICAgICAgIHN0cyA9IFB5UnVuX1NpbXBsZVN0cmluZ0ZsYWdzKGNvbW1hbmQsICZjZikgIT0gMDsKKyAgICAgICAgZnJlZShjb21tYW5kKTsKKyAgICB9IGVsc2UgaWYgKG1vZHVsZSkgeworICAgICAgICBzdHMgPSBSdW5Nb2R1bGUobW9kdWxlLCAxKTsKKyAgICAgICAgZnJlZShtb2R1bGUpOworICAgIH0KKyAgICBlbHNlIHsKIAotCQlpZiAoZmlsZW5hbWUgPT0gTlVMTCAmJiBzdGRpbl9pc19pbnRlcmFjdGl2ZSkgewotCQkJUHlfSW5zcGVjdEZsYWcgPSAwOyAvKiBkbyBleGl0IG9uIFN5c3RlbUV4aXQgKi8KLQkJCVJ1blN0YXJ0dXBGaWxlKCZjZik7Ci0JCX0KLQkJLyogWFhYICovCisgICAgICAgIGlmIChmaWxlbmFtZSA9PSBOVUxMICYmIHN0ZGluX2lzX2ludGVyYWN0aXZlKSB7CisgICAgICAgICAgICBQeV9JbnNwZWN0RmxhZyA9IDA7IC8qIGRvIGV4aXQgb24gU3lzdGVtRXhpdCAqLworICAgICAgICAgICAgUnVuU3RhcnR1cEZpbGUoJmNmKTsKKyAgICAgICAgfQorICAgICAgICAvKiBYWFggKi8KIAotCQlzdHMgPSAtMTsJLyoga2VlcCB0cmFjayBvZiB3aGV0aGVyIHdlJ3ZlIGFscmVhZHkgcnVuIF9fbWFpbl9fICovCisgICAgICAgIHN0cyA9IC0xOyAgICAgICAgICAgICAgIC8qIGtlZXAgdHJhY2sgb2Ygd2hldGhlciB3ZSd2ZSBhbHJlYWR5IHJ1biBfX21haW5fXyAqLwogCi0JCWlmIChmaWxlbmFtZSAhPSBOVUxMKSB7Ci0JCQlzdHMgPSBSdW5NYWluRnJvbUltcG9ydGVyKGZpbGVuYW1lKTsKLQkJfQorICAgICAgICBpZiAoZmlsZW5hbWUgIT0gTlVMTCkgeworICAgICAgICAgICAgc3RzID0gUnVuTWFpbkZyb21JbXBvcnRlcihmaWxlbmFtZSk7CisgICAgICAgIH0KIAotCQlpZiAoc3RzPT0tMSAmJiBmaWxlbmFtZSE9TlVMTCkgewotCQkJaWYgKChmcCA9IGZvcGVuKGZpbGVuYW1lLCAiciIpKSA9PSBOVUxMKSB7Ci0JCQkJZnByaW50ZihzdGRlcnIsICIlczogY2FuJ3Qgb3BlbiBmaWxlICclcyc6IFtFcnJubyAlZF0gJXNcbiIsCi0JCQkJCWFyZ3ZbMF0sIGZpbGVuYW1lLCBlcnJubywgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgaWYgKHN0cz09LTEgJiYgZmlsZW5hbWUhPU5VTEwpIHsKKyAgICAgICAgICAgIGlmICgoZnAgPSBmb3BlbihmaWxlbmFtZSwgInIiKSkgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IGNhbid0IG9wZW4gZmlsZSAnJXMnOiBbRXJybm8gJWRdICVzXG4iLAorICAgICAgICAgICAgICAgICAgICBhcmd2WzBdLCBmaWxlbmFtZSwgZXJybm8sIHN0cmVycm9yKGVycm5vKSk7CiAKLQkJCQlyZXR1cm4gMjsKLQkJCX0KLQkJCWVsc2UgaWYgKHNraXBmaXJzdGxpbmUpIHsKLQkJCQlpbnQgY2g7Ci0JCQkJLyogUHVzaCBiYWNrIGZpcnN0IG5ld2xpbmUgc28gbGluZSBudW1iZXJzCi0JCQkJICAgcmVtYWluIHRoZSBzYW1lICovCi0JCQkJd2hpbGUgKChjaCA9IGdldGMoZnApKSAhPSBFT0YpIHsKLQkJCQkJaWYgKGNoID09ICdcbicpIHsKLQkJCQkJCSh2b2lkKXVuZ2V0YyhjaCwgZnApOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQl7Ci0JCQkJLyogWFhYOiBkb2VzIHRoaXMgd29yayBvbiBXaW4vV2luNjQ/IChzZWUgcG9zaXhfZnN0YXQpICovCi0JCQkJc3RydWN0IHN0YXQgc2I7Ci0JCQkJaWYgKGZzdGF0KGZpbGVubyhmcCksICZzYikgPT0gMCAmJgotCQkJCSAgICBTX0lTRElSKHNiLnN0X21vZGUpKSB7Ci0JCQkJCWZwcmludGYoc3RkZXJyLCAiJXM6ICclcycgaXMgYSBkaXJlY3RvcnksIGNhbm5vdCBjb250aW51ZVxuIiwgYXJndlswXSwgZmlsZW5hbWUpOwotCQkJCQlmY2xvc2UoZnApOwotCQkJCQlyZXR1cm4gMTsKLQkJCQl9Ci0JCQl9Ci0JCX0KKyAgICAgICAgICAgICAgICByZXR1cm4gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHNraXBmaXJzdGxpbmUpIHsKKyAgICAgICAgICAgICAgICBpbnQgY2g7CisgICAgICAgICAgICAgICAgLyogUHVzaCBiYWNrIGZpcnN0IG5ld2xpbmUgc28gbGluZSBudW1iZXJzCisgICAgICAgICAgICAgICAgICAgcmVtYWluIHRoZSBzYW1lICovCisgICAgICAgICAgICAgICAgd2hpbGUgKChjaCA9IGdldGMoZnApKSAhPSBFT0YpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09ICdcbicpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKXVuZ2V0YyhjaCwgZnApOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogWFhYOiBkb2VzIHRoaXMgd29yayBvbiBXaW4vV2luNjQ/IChzZWUgcG9zaXhfZnN0YXQpICovCisgICAgICAgICAgICAgICAgc3RydWN0IHN0YXQgc2I7CisgICAgICAgICAgICAgICAgaWYgKGZzdGF0KGZpbGVubyhmcCksICZzYikgPT0gMCAmJgorICAgICAgICAgICAgICAgICAgICBTX0lTRElSKHNiLnN0X21vZGUpKSB7CisgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6ICclcycgaXMgYSBkaXJlY3RvcnksIGNhbm5vdCBjb250aW51ZVxuIiwgYXJndlswXSwgZmlsZW5hbWUpOworICAgICAgICAgICAgICAgICAgICBmY2xvc2UoZnApOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQlpZiAoc3RzPT0tMSkgewotCQkJLyogY2FsbCBwZW5kaW5nIGNhbGxzIGxpa2Ugc2lnbmFsIGhhbmRsZXJzIChTSUdJTlQpICovCi0JCQlpZiAoUHlfTWFrZVBlbmRpbmdDYWxscygpID09IC0xKSB7Ci0JCQkJUHlFcnJfUHJpbnQoKTsKLQkJCQlzdHMgPSAxOwotCQkJfSBlbHNlIHsKLQkJCQlzdHMgPSBQeVJ1bl9BbnlGaWxlRXhGbGFncygKLQkJCQkJZnAsCi0JCQkJCWZpbGVuYW1lID09IE5VTEwgPyAiPHN0ZGluPiIgOiBmaWxlbmFtZSwKLQkJCQkJZmlsZW5hbWUgIT0gTlVMTCwgJmNmKSAhPSAwOwotCQkJfQotCQl9Ci0JCQotCX0KKyAgICAgICAgaWYgKHN0cz09LTEpIHsKKyAgICAgICAgICAgIC8qIGNhbGwgcGVuZGluZyBjYWxscyBsaWtlIHNpZ25hbCBoYW5kbGVycyAoU0lHSU5UKSAqLworICAgICAgICAgICAgaWYgKFB5X01ha2VQZW5kaW5nQ2FsbHMoKSA9PSAtMSkgeworICAgICAgICAgICAgICAgIFB5RXJyX1ByaW50KCk7CisgICAgICAgICAgICAgICAgc3RzID0gMTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3RzID0gUHlSdW5fQW55RmlsZUV4RmxhZ3MoCisgICAgICAgICAgICAgICAgICAgIGZwLAorICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSA9PSBOVUxMID8gIjxzdGRpbj4iIDogZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lICE9IE5VTEwsICZjZikgIT0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JLyogQ2hlY2sgdGhpcyBlbnZpcm9ubWVudCB2YXJpYWJsZSBhdCB0aGUgZW5kLCB0byBnaXZlIHByb2dyYW1zIHRoZQotCSAqIG9wcG9ydHVuaXR5IHRvIHNldCBpdCBmcm9tIFB5dGhvbi4KLQkgKi8KLQlpZiAoIVB5X0luc3BlY3RGbGFnICYmCi0JICAgIChwID0gUHlfR0VURU5WKCJQWVRIT05JTlNQRUNUIikpICYmICpwICE9ICdcMCcpCi0JewotCQlQeV9JbnNwZWN0RmxhZyA9IDE7Ci0JfQorICAgIH0KIAotCWlmIChQeV9JbnNwZWN0RmxhZyAmJiBzdGRpbl9pc19pbnRlcmFjdGl2ZSAmJgotCSAgICAoZmlsZW5hbWUgIT0gTlVMTCB8fCBjb21tYW5kICE9IE5VTEwgfHwgbW9kdWxlICE9IE5VTEwpKSB7Ci0JCVB5X0luc3BlY3RGbGFnID0gMDsKLQkJLyogWFhYICovCi0JCXN0cyA9IFB5UnVuX0FueUZpbGVGbGFncyhzdGRpbiwgIjxzdGRpbj4iLCAmY2YpICE9IDA7Ci0JfQorICAgIC8qIENoZWNrIHRoaXMgZW52aXJvbm1lbnQgdmFyaWFibGUgYXQgdGhlIGVuZCwgdG8gZ2l2ZSBwcm9ncmFtcyB0aGUKKyAgICAgKiBvcHBvcnR1bml0eSB0byBzZXQgaXQgZnJvbSBQeXRob24uCisgICAgICovCisgICAgaWYgKCFQeV9JbnNwZWN0RmxhZyAmJgorICAgICAgICAocCA9IFB5X0dFVEVOVigiUFlUSE9OSU5TUEVDVCIpKSAmJiAqcCAhPSAnXDAnKQorICAgIHsKKyAgICAgICAgUHlfSW5zcGVjdEZsYWcgPSAxOworICAgIH0KIAotCVB5X0ZpbmFsaXplKCk7CisgICAgaWYgKFB5X0luc3BlY3RGbGFnICYmIHN0ZGluX2lzX2ludGVyYWN0aXZlICYmCisgICAgICAgIChmaWxlbmFtZSAhPSBOVUxMIHx8IGNvbW1hbmQgIT0gTlVMTCB8fCBtb2R1bGUgIT0gTlVMTCkpIHsKKyAgICAgICAgUHlfSW5zcGVjdEZsYWcgPSAwOworICAgICAgICAvKiBYWFggKi8KKyAgICAgICAgc3RzID0gUHlSdW5fQW55RmlsZUZsYWdzKHN0ZGluLCAiPHN0ZGluPiIsICZjZikgIT0gMDsKKyAgICB9CisKKyAgICBQeV9GaW5hbGl6ZSgpOwogI2lmZGVmIFJJU0NPUwotCWlmIChQeV9SSVNDT1NXaW1wRmxhZykKLSAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlx4MGNxXHgwYyIpOyAvKiBtYWtlIGZyb250ZW5kIHF1aXQgKi8KKyAgICBpZiAoUHlfUklTQ09TV2ltcEZsYWcpCisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiXHgwY3FceDBjIik7IC8qIG1ha2UgZnJvbnRlbmQgcXVpdCAqLwogI2VuZGlmCiAKICNpZmRlZiBfX0lOU1VSRV9fCi0JLyogSW5zdXJlKysgaXMgYSBtZW1vcnkgYW5hbHlzaXMgdG9vbCB0aGF0IGFpZHMgaW4gZGlzY292ZXJpbmcKLQkgKiBtZW1vcnkgbGVha3MgYW5kIG90aGVyIG1lbW9yeSBwcm9ibGVtcy4gIE9uIFB5dGhvbiBleGl0LCB0aGUKLQkgKiBpbnRlcm5lZCBzdHJpbmcgZGljdGlvbmFyeSBpcyBmbGFnZ2VkIGFzIGJlaW5nIGluIHVzZSBhdCBleGl0Ci0JICogKHdoaWNoIGl0IGlzKS4gIFVuZGVyIG5vcm1hbCBjaXJjdW1zdGFuY2VzLCB0aGlzIGlzIGZpbmUgYmVjYXVzZQotCSAqIHRoZSBtZW1vcnkgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHJlY2xhaW1lZCBieSB0aGUgc3lzdGVtLiAgVW5kZXIKLQkgKiBtZW1vcnkgZGVidWdnaW5nLCBpdCdzIGEgaHVnZSBzb3VyY2Ugb2YgdXNlbGVzcyBub2lzZSwgc28gd2UKLQkgKiB0cmFkZSBvZmYgc2xvd2VyIHNodXRkb3duIGZvciBsZXNzIGRpc3RyYWN0aW9uIGluIHRoZSBtZW1vcnkKLQkgKiByZXBvcnRzLiAgLWJhdwotCSAqLwotCV9QeV9SZWxlYXNlSW50ZXJuZWRTdHJpbmdzKCk7CisgICAgLyogSW5zdXJlKysgaXMgYSBtZW1vcnkgYW5hbHlzaXMgdG9vbCB0aGF0IGFpZHMgaW4gZGlzY292ZXJpbmcKKyAgICAgKiBtZW1vcnkgbGVha3MgYW5kIG90aGVyIG1lbW9yeSBwcm9ibGVtcy4gIE9uIFB5dGhvbiBleGl0LCB0aGUKKyAgICAgKiBpbnRlcm5lZCBzdHJpbmcgZGljdGlvbmFyeSBpcyBmbGFnZ2VkIGFzIGJlaW5nIGluIHVzZSBhdCBleGl0CisgICAgICogKHdoaWNoIGl0IGlzKS4gIFVuZGVyIG5vcm1hbCBjaXJjdW1zdGFuY2VzLCB0aGlzIGlzIGZpbmUgYmVjYXVzZQorICAgICAqIHRoZSBtZW1vcnkgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHJlY2xhaW1lZCBieSB0aGUgc3lzdGVtLiAgVW5kZXIKKyAgICAgKiBtZW1vcnkgZGVidWdnaW5nLCBpdCdzIGEgaHVnZSBzb3VyY2Ugb2YgdXNlbGVzcyBub2lzZSwgc28gd2UKKyAgICAgKiB0cmFkZSBvZmYgc2xvd2VyIHNodXRkb3duIGZvciBsZXNzIGRpc3RyYWN0aW9uIGluIHRoZSBtZW1vcnkKKyAgICAgKiByZXBvcnRzLiAgLWJhdworICAgICAqLworICAgIF9QeV9SZWxlYXNlSW50ZXJuZWRTdHJpbmdzKCk7CiAjZW5kaWYgLyogX19JTlNVUkVfXyAqLwogCi0JcmV0dXJuIHN0czsKKyAgICByZXR1cm4gc3RzOwogfQogCiAvKiB0aGlzIGlzIGdvbm5hIHNlZW0gKnJlYWwgd2VpcmQqLCBidXQgaWYgeW91IHB1dCBzb21lIG90aGVyIGNvZGUgYmV0d2VlbgpAQCAtNjMxLDggKzYzMSw4IEBACiB2b2lkCiBQeV9HZXRBcmdjQXJndihpbnQgKmFyZ2MsIGNoYXIgKioqYXJndikKIHsKLQkqYXJnYyA9IG9yaWdfYXJnYzsKLQkqYXJndiA9IG9yaWdfYXJndjsKKyAgICAqYXJnYyA9IG9yaWdfYXJnYzsKKyAgICAqYXJndiA9IG9yaWdfYXJndjsKIH0KIAogI2lmZGVmIF9fY3BsdXNwbHVzCmRpZmYgLS1naXQgYS9Nb2R1bGVzL21hdGhtb2R1bGUuYyBiL01vZHVsZXMvbWF0aG1vZHVsZS5jCmluZGV4IDIwZDY2ZTAuLjEzZDZlNjIgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvbWF0aG1vZHVsZS5jCisrKyBiL01vZHVsZXMvbWF0aG1vZHVsZS5jCkBAIC02NywzNyArNjcsMzcgQEAKIHN0YXRpYyBpbnQKIGlzX2Vycm9yKGRvdWJsZSB4KQogewotCWludCByZXN1bHQgPSAxOwkvKiBwcmVzdW1wdGlvbiBvZiBndWlsdCAqLwotCWFzc2VydChlcnJubyk7CS8qIG5vbi16ZXJvIGVycm5vIGlzIGEgcHJlY29uZGl0aW9uIGZvciBjYWxsaW5nICovCi0JaWYgKGVycm5vID09IEVET00pCi0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAibWF0aCBkb21haW4gZXJyb3IiKTsKKyAgICBpbnQgcmVzdWx0ID0gMTsgICAgIC8qIHByZXN1bXB0aW9uIG9mIGd1aWx0ICovCisgICAgYXNzZXJ0KGVycm5vKTsgICAgICAvKiBub24temVybyBlcnJubyBpcyBhIHByZWNvbmRpdGlvbiBmb3IgY2FsbGluZyAqLworICAgIGlmIChlcnJubyA9PSBFRE9NKQorICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIm1hdGggZG9tYWluIGVycm9yIik7CiAKLQllbHNlIGlmIChlcnJubyA9PSBFUkFOR0UpIHsKLQkJLyogQU5TSSBDIGdlbmVyYWxseSByZXF1aXJlcyBsaWJtIGZ1bmN0aW9ucyB0byBzZXQgRVJBTkdFCi0JCSAqIG9uIG92ZXJmbG93LCBidXQgYWxzbyBnZW5lcmFsbHkgKmFsbG93cyogdGhlbSB0byBzZXQKLQkJICogRVJBTkdFIG9uIHVuZGVyZmxvdyB0b28uICBUaGVyZSdzIG5vIGNvbnNpc3RlbmN5IGFib3V0Ci0JCSAqIHRoZSBsYXR0ZXIgYWNyb3NzIHBsYXRmb3Jtcy4KLQkJICogQWxhcywgQzk5IG5ldmVyIHJlcXVpcmVzIHRoYXQgZXJybm8gYmUgc2V0LgotCQkgKiBIZXJlIHdlIHN1cHByZXNzIHRoZSB1bmRlcmZsb3cgZXJyb3JzIChsaWJtIGZ1bmN0aW9ucwotCQkgKiBzaG91bGQgcmV0dXJuIGEgemVybyBvbiB1bmRlcmZsb3csIGFuZCArLSBIVUdFX1ZBTCBvbgotCQkgKiBvdmVyZmxvdywgc28gdGVzdGluZyB0aGUgcmVzdWx0IGZvciB6ZXJvIHN1ZmZpY2VzIHRvCi0JCSAqIGRpc3Rpbmd1aXNoIHRoZSBjYXNlcykuCi0JCSAqCi0JCSAqIE9uIHNvbWUgcGxhdGZvcm1zIChVYnVudHUvaWE2NCkgaXQgc2VlbXMgdGhhdCBlcnJubyBjYW4gYmUKLQkJICogc2V0IHRvIEVSQU5HRSBmb3Igc3Vibm9ybWFsIHJlc3VsdHMgdGhhdCBkbyAqbm90KiB1bmRlcmZsb3cKLQkJICogdG8gemVyby4gIFNvIHRvIGJlIHNhZmUsIHdlJ2xsIGlnbm9yZSBFUkFOR0Ugd2hlbmV2ZXIgdGhlCi0JCSAqIGZ1bmN0aW9uIHJlc3VsdCBpcyBsZXNzIHRoYW4gb25lIGluIGFic29sdXRlIHZhbHVlLgotCQkgKi8KLQkJaWYgKGZhYnMoeCkgPCAxLjApCi0JCQlyZXN1bHQgPSAwOwotCQllbHNlCi0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJCQkJIm1hdGggcmFuZ2UgZXJyb3IiKTsKLQl9Ci0JZWxzZQotICAgICAgICAgICAgICAgIC8qIFVuZXhwZWN0ZWQgbWF0aCBlcnJvciAqLwotCQlQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfVmFsdWVFcnJvcik7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBlbHNlIGlmIChlcnJubyA9PSBFUkFOR0UpIHsKKyAgICAgICAgLyogQU5TSSBDIGdlbmVyYWxseSByZXF1aXJlcyBsaWJtIGZ1bmN0aW9ucyB0byBzZXQgRVJBTkdFCisgICAgICAgICAqIG9uIG92ZXJmbG93LCBidXQgYWxzbyBnZW5lcmFsbHkgKmFsbG93cyogdGhlbSB0byBzZXQKKyAgICAgICAgICogRVJBTkdFIG9uIHVuZGVyZmxvdyB0b28uICBUaGVyZSdzIG5vIGNvbnNpc3RlbmN5IGFib3V0CisgICAgICAgICAqIHRoZSBsYXR0ZXIgYWNyb3NzIHBsYXRmb3Jtcy4KKyAgICAgICAgICogQWxhcywgQzk5IG5ldmVyIHJlcXVpcmVzIHRoYXQgZXJybm8gYmUgc2V0LgorICAgICAgICAgKiBIZXJlIHdlIHN1cHByZXNzIHRoZSB1bmRlcmZsb3cgZXJyb3JzIChsaWJtIGZ1bmN0aW9ucworICAgICAgICAgKiBzaG91bGQgcmV0dXJuIGEgemVybyBvbiB1bmRlcmZsb3csIGFuZCArLSBIVUdFX1ZBTCBvbgorICAgICAgICAgKiBvdmVyZmxvdywgc28gdGVzdGluZyB0aGUgcmVzdWx0IGZvciB6ZXJvIHN1ZmZpY2VzIHRvCisgICAgICAgICAqIGRpc3Rpbmd1aXNoIHRoZSBjYXNlcykuCisgICAgICAgICAqCisgICAgICAgICAqIE9uIHNvbWUgcGxhdGZvcm1zIChVYnVudHUvaWE2NCkgaXQgc2VlbXMgdGhhdCBlcnJubyBjYW4gYmUKKyAgICAgICAgICogc2V0IHRvIEVSQU5HRSBmb3Igc3Vibm9ybWFsIHJlc3VsdHMgdGhhdCBkbyAqbm90KiB1bmRlcmZsb3cKKyAgICAgICAgICogdG8gemVyby4gIFNvIHRvIGJlIHNhZmUsIHdlJ2xsIGlnbm9yZSBFUkFOR0Ugd2hlbmV2ZXIgdGhlCisgICAgICAgICAqIGZ1bmN0aW9uIHJlc3VsdCBpcyBsZXNzIHRoYW4gb25lIGluIGFic29sdXRlIHZhbHVlLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKGZhYnMoeCkgPCAxLjApCisgICAgICAgICAgICByZXN1bHQgPSAwOworICAgICAgICBlbHNlCisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWF0aCByYW5nZSBlcnJvciIpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIC8qIFVuZXhwZWN0ZWQgbWF0aCBlcnJvciAqLworICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfVmFsdWVFcnJvcik7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogLyoKQEAgLTExMSwyOSArMTExLDI5IEBACiBzdGF0aWMgZG91YmxlCiBtX2F0YW4yKGRvdWJsZSB5LCBkb3VibGUgeCkKIHsKLQlpZiAoUHlfSVNfTkFOKHgpIHx8IFB5X0lTX05BTih5KSkKLQkJcmV0dXJuIFB5X05BTjsKLQlpZiAoUHlfSVNfSU5GSU5JVFkoeSkpIHsKLQkJaWYgKFB5X0lTX0lORklOSVRZKHgpKSB7Ci0JCQlpZiAoY29weXNpZ24oMS4sIHgpID09IDEuKQotCQkJCS8qIGF0YW4yKCstaW5mLCAraW5mKSA9PSArLXBpLzQgKi8KLQkJCQlyZXR1cm4gY29weXNpZ24oMC4yNSpQeV9NQVRIX1BJLCB5KTsKLQkJCWVsc2UKLQkJCQkvKiBhdGFuMigrLWluZiwgLWluZikgPT0gKy1waSozLzQgKi8KLQkJCQlyZXR1cm4gY29weXNpZ24oMC43NSpQeV9NQVRIX1BJLCB5KTsKLQkJfQotCQkvKiBhdGFuMigrLWluZiwgeCkgPT0gKy1waS8yIGZvciBmaW5pdGUgeCAqLwotCQlyZXR1cm4gY29weXNpZ24oMC41KlB5X01BVEhfUEksIHkpOwotCX0KLQlpZiAoUHlfSVNfSU5GSU5JVFkoeCkgfHwgeSA9PSAwLikgewotCQlpZiAoY29weXNpZ24oMS4sIHgpID09IDEuKQotCQkJLyogYXRhbjIoKy15LCAraW5mKSA9IGF0YW4yKCstMCwgK3gpID0gKy0wLiAqLwotCQkJcmV0dXJuIGNvcHlzaWduKDAuLCB5KTsKLQkJZWxzZQotCQkJLyogYXRhbjIoKy15LCAtaW5mKSA9IGF0YW4yKCstMC4sIC14KSA9ICstcGkuICovCi0JCQlyZXR1cm4gY29weXNpZ24oUHlfTUFUSF9QSSwgeSk7Ci0JfQotCXJldHVybiBhdGFuMih5LCB4KTsKKyAgICBpZiAoUHlfSVNfTkFOKHgpIHx8IFB5X0lTX05BTih5KSkKKyAgICAgICAgcmV0dXJuIFB5X05BTjsKKyAgICBpZiAoUHlfSVNfSU5GSU5JVFkoeSkpIHsKKyAgICAgICAgaWYgKFB5X0lTX0lORklOSVRZKHgpKSB7CisgICAgICAgICAgICBpZiAoY29weXNpZ24oMS4sIHgpID09IDEuKQorICAgICAgICAgICAgICAgIC8qIGF0YW4yKCstaW5mLCAraW5mKSA9PSArLXBpLzQgKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gY29weXNpZ24oMC4yNSpQeV9NQVRIX1BJLCB5KTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAvKiBhdGFuMigrLWluZiwgLWluZikgPT0gKy1waSozLzQgKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gY29weXNpZ24oMC43NSpQeV9NQVRIX1BJLCB5KTsKKyAgICAgICAgfQorICAgICAgICAvKiBhdGFuMigrLWluZiwgeCkgPT0gKy1waS8yIGZvciBmaW5pdGUgeCAqLworICAgICAgICByZXR1cm4gY29weXNpZ24oMC41KlB5X01BVEhfUEksIHkpOworICAgIH0KKyAgICBpZiAoUHlfSVNfSU5GSU5JVFkoeCkgfHwgeSA9PSAwLikgeworICAgICAgICBpZiAoY29weXNpZ24oMS4sIHgpID09IDEuKQorICAgICAgICAgICAgLyogYXRhbjIoKy15LCAraW5mKSA9IGF0YW4yKCstMCwgK3gpID0gKy0wLiAqLworICAgICAgICAgICAgcmV0dXJuIGNvcHlzaWduKDAuLCB5KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgLyogYXRhbjIoKy15LCAtaW5mKSA9IGF0YW4yKCstMC4sIC14KSA9ICstcGkuICovCisgICAgICAgICAgICByZXR1cm4gY29weXNpZ24oUHlfTUFUSF9QSSwgeSk7CisgICAgfQorICAgIHJldHVybiBhdGFuMih5LCB4KTsKIH0KIAogLyoKQEAgLTE0Niw0NSArMTQ2LDQ1IEBACiBzdGF0aWMgZG91YmxlCiBtX2xvZyhkb3VibGUgeCkKIHsKLQlpZiAoUHlfSVNfRklOSVRFKHgpKSB7Ci0JCWlmICh4ID4gMC4wKQotCQkJcmV0dXJuIGxvZyh4KTsKLQkJZXJybm8gPSBFRE9NOwotCQlpZiAoeCA9PSAwLjApCi0JCQlyZXR1cm4gLVB5X0hVR0VfVkFMOyAvKiBsb2coMCkgPSAtaW5mICovCi0JCWVsc2UKLQkJCXJldHVybiBQeV9OQU47IC8qIGxvZygtdmUpID0gbmFuICovCi0JfQotCWVsc2UgaWYgKFB5X0lTX05BTih4KSkKLQkJcmV0dXJuIHg7IC8qIGxvZyhuYW4pID0gbmFuICovCi0JZWxzZSBpZiAoeCA+IDAuMCkKLQkJcmV0dXJuIHg7IC8qIGxvZyhpbmYpID0gaW5mICovCi0JZWxzZSB7Ci0JCWVycm5vID0gRURPTTsKLQkJcmV0dXJuIFB5X05BTjsgLyogbG9nKC1pbmYpID0gbmFuICovCi0JfQorICAgIGlmIChQeV9JU19GSU5JVEUoeCkpIHsKKyAgICAgICAgaWYgKHggPiAwLjApCisgICAgICAgICAgICByZXR1cm4gbG9nKHgpOworICAgICAgICBlcnJubyA9IEVET007CisgICAgICAgIGlmICh4ID09IDAuMCkKKyAgICAgICAgICAgIHJldHVybiAtUHlfSFVHRV9WQUw7IC8qIGxvZygwKSA9IC1pbmYgKi8KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIFB5X05BTjsgLyogbG9nKC12ZSkgPSBuYW4gKi8KKyAgICB9CisgICAgZWxzZSBpZiAoUHlfSVNfTkFOKHgpKQorICAgICAgICByZXR1cm4geDsgLyogbG9nKG5hbikgPSBuYW4gKi8KKyAgICBlbHNlIGlmICh4ID4gMC4wKQorICAgICAgICByZXR1cm4geDsgLyogbG9nKGluZikgPSBpbmYgKi8KKyAgICBlbHNlIHsKKyAgICAgICAgZXJybm8gPSBFRE9NOworICAgICAgICByZXR1cm4gUHlfTkFOOyAvKiBsb2coLWluZikgPSBuYW4gKi8KKyAgICB9CiB9CiAKIHN0YXRpYyBkb3VibGUKIG1fbG9nMTAoZG91YmxlIHgpCiB7Ci0JaWYgKFB5X0lTX0ZJTklURSh4KSkgewotCQlpZiAoeCA+IDAuMCkKLQkJCXJldHVybiBsb2cxMCh4KTsKLQkJZXJybm8gPSBFRE9NOwotCQlpZiAoeCA9PSAwLjApCi0JCQlyZXR1cm4gLVB5X0hVR0VfVkFMOyAvKiBsb2cxMCgwKSA9IC1pbmYgKi8KLQkJZWxzZQotCQkJcmV0dXJuIFB5X05BTjsgLyogbG9nMTAoLXZlKSA9IG5hbiAqLwotCX0KLQllbHNlIGlmIChQeV9JU19OQU4oeCkpCi0JCXJldHVybiB4OyAvKiBsb2cxMChuYW4pID0gbmFuICovCi0JZWxzZSBpZiAoeCA+IDAuMCkKLQkJcmV0dXJuIHg7IC8qIGxvZzEwKGluZikgPSBpbmYgKi8KLQllbHNlIHsKLQkJZXJybm8gPSBFRE9NOwotCQlyZXR1cm4gUHlfTkFOOyAvKiBsb2cxMCgtaW5mKSA9IG5hbiAqLwotCX0KKyAgICBpZiAoUHlfSVNfRklOSVRFKHgpKSB7CisgICAgICAgIGlmICh4ID4gMC4wKQorICAgICAgICAgICAgcmV0dXJuIGxvZzEwKHgpOworICAgICAgICBlcnJubyA9IEVET007CisgICAgICAgIGlmICh4ID09IDAuMCkKKyAgICAgICAgICAgIHJldHVybiAtUHlfSFVHRV9WQUw7IC8qIGxvZzEwKDApID0gLWluZiAqLworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gUHlfTkFOOyAvKiBsb2cxMCgtdmUpID0gbmFuICovCisgICAgfQorICAgIGVsc2UgaWYgKFB5X0lTX05BTih4KSkKKyAgICAgICAgcmV0dXJuIHg7IC8qIGxvZzEwKG5hbikgPSBuYW4gKi8KKyAgICBlbHNlIGlmICh4ID4gMC4wKQorICAgICAgICByZXR1cm4geDsgLyogbG9nMTAoaW5mKSA9IGluZiAqLworICAgIGVsc2UgeworICAgICAgICBlcnJubyA9IEVET007CisgICAgICAgIHJldHVybiBQeV9OQU47IC8qIGxvZzEwKC1pbmYpID0gbmFuICovCisgICAgfQogfQogCiAKQEAgLTIyMSwzMCArMjIxLDMwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogbWF0aF8xKFB5T2JqZWN0ICphcmcsIGRvdWJsZSAoKmZ1bmMpIChkb3VibGUpLCBpbnQgY2FuX292ZXJmbG93KQogewotCWRvdWJsZSB4LCByOwotCXggPSBQeUZsb2F0X0FzRG91YmxlKGFyZyk7Ci0JaWYgKHggPT0gLTEuMCAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gTlVMTDsKLQllcnJubyA9IDA7Ci0JUHlGUEVfU1RBUlRfUFJPVEVDVCgiaW4gbWF0aF8xIiwgcmV0dXJuIDApOwotCXIgPSAoKmZ1bmMpKHgpOwotCVB5RlBFX0VORF9QUk9URUNUKHIpOwotCWlmIChQeV9JU19OQU4ocikpIHsKLQkJaWYgKCFQeV9JU19OQU4oeCkpCi0JCQllcnJubyA9IEVET007Ci0JCWVsc2UKLQkJCWVycm5vID0gMDsKLQl9Ci0JZWxzZSBpZiAoUHlfSVNfSU5GSU5JVFkocikpIHsKLQkJaWYgKFB5X0lTX0ZJTklURSh4KSkKLQkJCWVycm5vID0gY2FuX292ZXJmbG93ID8gRVJBTkdFIDogRURPTTsKLQkJZWxzZQotCQkJZXJybm8gPSAwOwotCX0KLQlpZiAoZXJybm8gJiYgaXNfZXJyb3IocikpCi0JCXJldHVybiBOVUxMOwotCWVsc2UKLQkJcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShyKTsKKyAgICBkb3VibGUgeCwgcjsKKyAgICB4ID0gUHlGbG9hdF9Bc0RvdWJsZShhcmcpOworICAgIGlmICh4ID09IC0xLjAgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZXJybm8gPSAwOworICAgIFB5RlBFX1NUQVJUX1BST1RFQ1QoImluIG1hdGhfMSIsIHJldHVybiAwKTsKKyAgICByID0gKCpmdW5jKSh4KTsKKyAgICBQeUZQRV9FTkRfUFJPVEVDVChyKTsKKyAgICBpZiAoUHlfSVNfTkFOKHIpKSB7CisgICAgICAgIGlmICghUHlfSVNfTkFOKHgpKQorICAgICAgICAgICAgZXJybm8gPSBFRE9NOworICAgICAgICBlbHNlCisgICAgICAgICAgICBlcnJubyA9IDA7CisgICAgfQorICAgIGVsc2UgaWYgKFB5X0lTX0lORklOSVRZKHIpKSB7CisgICAgICAgIGlmIChQeV9JU19GSU5JVEUoeCkpCisgICAgICAgICAgICBlcnJubyA9IGNhbl9vdmVyZmxvdyA/IEVSQU5HRSA6IEVET007CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVycm5vID0gMDsKKyAgICB9CisgICAgaWYgKGVycm5vICYmIGlzX2Vycm9yKHIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUocik7CiB9CiAKIC8qCkBAIC0yNzcsNDcgKzI3Nyw0NyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIG1hdGhfMihQeU9iamVjdCAqYXJncywgZG91YmxlICgqZnVuYykgKGRvdWJsZSwgZG91YmxlKSwgY2hhciAqZnVuY25hbWUpCiB7Ci0JUHlPYmplY3QgKm94LCAqb3k7Ci0JZG91YmxlIHgsIHksIHI7Ci0JaWYgKCEgUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgZnVuY25hbWUsIDIsIDIsICZveCwgJm95KSkKLQkJcmV0dXJuIE5VTEw7Ci0JeCA9IFB5RmxvYXRfQXNEb3VibGUob3gpOwotCXkgPSBQeUZsb2F0X0FzRG91YmxlKG95KTsKLQlpZiAoKHggPT0gLTEuMCB8fCB5ID09IC0xLjApICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiBOVUxMOwotCWVycm5vID0gMDsKLQlQeUZQRV9TVEFSVF9QUk9URUNUKCJpbiBtYXRoXzIiLCByZXR1cm4gMCk7Ci0JciA9ICgqZnVuYykoeCwgeSk7Ci0JUHlGUEVfRU5EX1BST1RFQ1Qocik7Ci0JaWYgKFB5X0lTX05BTihyKSkgewotCQlpZiAoIVB5X0lTX05BTih4KSAmJiAhUHlfSVNfTkFOKHkpKQotCQkJZXJybm8gPSBFRE9NOwotCQllbHNlCi0JCQllcnJubyA9IDA7Ci0JfQotCWVsc2UgaWYgKFB5X0lTX0lORklOSVRZKHIpKSB7Ci0JCWlmIChQeV9JU19GSU5JVEUoeCkgJiYgUHlfSVNfRklOSVRFKHkpKQotCQkJZXJybm8gPSBFUkFOR0U7Ci0JCWVsc2UKLQkJCWVycm5vID0gMDsKLQl9Ci0JaWYgKGVycm5vICYmIGlzX2Vycm9yKHIpKQotCQlyZXR1cm4gTlVMTDsKLQllbHNlCi0JCXJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUocik7CisgICAgUHlPYmplY3QgKm94LCAqb3k7CisgICAgZG91YmxlIHgsIHksIHI7CisgICAgaWYgKCEgUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgZnVuY25hbWUsIDIsIDIsICZveCwgJm95KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgeCA9IFB5RmxvYXRfQXNEb3VibGUob3gpOworICAgIHkgPSBQeUZsb2F0X0FzRG91YmxlKG95KTsKKyAgICBpZiAoKHggPT0gLTEuMCB8fCB5ID09IC0xLjApICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGVycm5vID0gMDsKKyAgICBQeUZQRV9TVEFSVF9QUk9URUNUKCJpbiBtYXRoXzIiLCByZXR1cm4gMCk7CisgICAgciA9ICgqZnVuYykoeCwgeSk7CisgICAgUHlGUEVfRU5EX1BST1RFQ1Qocik7CisgICAgaWYgKFB5X0lTX05BTihyKSkgeworICAgICAgICBpZiAoIVB5X0lTX05BTih4KSAmJiAhUHlfSVNfTkFOKHkpKQorICAgICAgICAgICAgZXJybm8gPSBFRE9NOworICAgICAgICBlbHNlCisgICAgICAgICAgICBlcnJubyA9IDA7CisgICAgfQorICAgIGVsc2UgaWYgKFB5X0lTX0lORklOSVRZKHIpKSB7CisgICAgICAgIGlmIChQeV9JU19GSU5JVEUoeCkgJiYgUHlfSVNfRklOSVRFKHkpKQorICAgICAgICAgICAgZXJybm8gPSBFUkFOR0U7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVycm5vID0gMDsKKyAgICB9CisgICAgaWYgKGVycm5vICYmIGlzX2Vycm9yKHIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUocik7CiB9CiAKLSNkZWZpbmUgRlVOQzEoZnVuY25hbWUsIGZ1bmMsIGNhbl9vdmVyZmxvdywgZG9jc3RyaW5nKQkJCVwKLQlzdGF0aWMgUHlPYmplY3QgKiBtYXRoXyMjZnVuY25hbWUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKSB7IFwKLQkJcmV0dXJuIG1hdGhfMShhcmdzLCBmdW5jLCBjYW5fb3ZlcmZsb3cpOwkJICAgIFwKLQl9XAotICAgICAgICBQeURvY19TVFJWQVIobWF0aF8jI2Z1bmNuYW1lIyNfZG9jLCBkb2NzdHJpbmcpOworI2RlZmluZSBGVU5DMShmdW5jbmFtZSwgZnVuYywgY2FuX292ZXJmbG93LCBkb2NzdHJpbmcpICAgICAgICAgICAgICAgICAgXAorICAgIHN0YXRpYyBQeU9iamVjdCAqIG1hdGhfIyNmdW5jbmFtZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpIHsgXAorICAgICAgICByZXR1cm4gbWF0aF8xKGFyZ3MsIGZ1bmMsIGNhbl9vdmVyZmxvdyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9XAorICAgIFB5RG9jX1NUUlZBUihtYXRoXyMjZnVuY25hbWUjI19kb2MsIGRvY3N0cmluZyk7CiAKICNkZWZpbmUgRlVOQzIoZnVuY25hbWUsIGZ1bmMsIGRvY3N0cmluZykgXAotCXN0YXRpYyBQeU9iamVjdCAqIG1hdGhfIyNmdW5jbmFtZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpIHsgXAotCQlyZXR1cm4gbWF0aF8yKGFyZ3MsIGZ1bmMsICNmdW5jbmFtZSk7IFwKLQl9XAotICAgICAgICBQeURvY19TVFJWQVIobWF0aF8jI2Z1bmNuYW1lIyNfZG9jLCBkb2NzdHJpbmcpOworICAgIHN0YXRpYyBQeU9iamVjdCAqIG1hdGhfIyNmdW5jbmFtZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpIHsgXAorICAgICAgICByZXR1cm4gbWF0aF8yKGFyZ3MsIGZ1bmMsICNmdW5jbmFtZSk7IFwKKyAgICB9XAorICAgIFB5RG9jX1NUUlZBUihtYXRoXyMjZnVuY25hbWUjI19kb2MsIGRvY3N0cmluZyk7CiAKIEZVTkMxKGFjb3MsIGFjb3MsIDAsCiAgICAgICAiYWNvcyh4KVxuXG5SZXR1cm4gdGhlIGFyYyBjb3NpbmUgKG1lYXN1cmVkIGluIHJhZGlhbnMpIG9mIHguIikKQEAgLTM4NCw3ICszODQsNyBAQAogICAgQWxzbywgdGhlIHZvbGF0aWxlIGRlY2xhcmF0aW9uIGZvcmNlcyB0aGUgdmFsdWVzIHRvIGJlIHN0b3JlZCBpbiBtZW1vcnkgYXMKICAgIHJlZ3VsYXIgZG91YmxlcyBpbnN0ZWFkIG9mIGV4dGVuZGVkIGxvbmcgcHJlY2lzaW9uICg4MC1iaXQpIHZhbHVlcy4gIFRoaXMKICAgIHByZXZlbnRzIGRvdWJsZSByb3VuZGluZyBiZWNhdXNlIGFueSBhZGRpdGlvbiBvciBzdWJ0cmFjdGlvbiBvZiB0d28gZG91YmxlcwotICAgY2FuIGJlIHJlc29sdmVkIGV4YWN0bHkgaW50byBkb3VibGUtc2l6ZWQgaGkgYW5kIGxvIHZhbHVlcy4gIEFzIGxvbmcgYXMgdGhlIAorICAgY2FuIGJlIHJlc29sdmVkIGV4YWN0bHkgaW50byBkb3VibGUtc2l6ZWQgaGkgYW5kIGxvIHZhbHVlcy4gIEFzIGxvbmcgYXMgdGhlCiAgICBoaSB2YWx1ZSBnZXRzIGZvcmNlZCBpbnRvIGEgZG91YmxlIGJlZm9yZSB5ciBhbmQgbG8gYXJlIGNvbXB1dGVkLCB0aGUgZXh0cmEKICAgIGJpdHMgaW4gZG93bnN0cmVhbSBleHRlbmRlZCBwcmVjaXNpb24gb3BlcmF0aW9ucyAoeDg3IGZvciBleGFtcGxlKSB3aWxsIGJlCiAgICBleGFjdGx5IHplcm8gYW5kIHRoZXJlZm9yZSBjYW4gYmUgbG9zc2xlc3NseSBzdG9yZWQgYmFjayBpbnRvIGEgZG91YmxlLApAQCAtNDA3LDI3ICs0MDcsMjcgQEAKIF9mc3VtX3JlYWxsb2MoZG91YmxlICoqcF9wdHIsIFB5X3NzaXplX3QgIG4sCiAgICAgICAgICAgICAgZG91YmxlICAqcHMsICAgIFB5X3NzaXplX3QgKm1fcHRyKQogewotCXZvaWQgKnYgPSBOVUxMOwotCVB5X3NzaXplX3QgbSA9ICptX3B0cjsKKyAgICB2b2lkICp2ID0gTlVMTDsKKyAgICBQeV9zc2l6ZV90IG0gPSAqbV9wdHI7CiAKLQltICs9IG07ICAvKiBkb3VibGUgKi8KLQlpZiAobiA8IG0gJiYgbSA8IChQWV9TU0laRV9UX01BWCAvIHNpemVvZihkb3VibGUpKSkgewotCQlkb3VibGUgKnAgPSAqcF9wdHI7Ci0JCWlmIChwID09IHBzKSB7Ci0JCQl2ID0gUHlNZW1fTWFsbG9jKHNpemVvZihkb3VibGUpICogbSk7Ci0JCQlpZiAodiAhPSBOVUxMKQotCQkJCW1lbWNweSh2LCBwcywgc2l6ZW9mKGRvdWJsZSkgKiBuKTsKLQkJfQotCQllbHNlCi0JCQl2ID0gUHlNZW1fUmVhbGxvYyhwLCBzaXplb2YoZG91YmxlKSAqIG0pOwotCX0KLQlpZiAodiA9PSBOVUxMKSB7ICAgICAgICAvKiBzaXplIG92ZXJmbG93IG9yIG5vIG1lbW9yeSAqLwotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfTWVtb3J5RXJyb3IsICJtYXRoLmZzdW0gcGFydGlhbHMiKTsKLQkJcmV0dXJuIDE7Ci0JfQotCSpwX3B0ciA9IChkb3VibGUqKSB2OwotCSptX3B0ciA9IG07Ci0JcmV0dXJuIDA7CisgICAgbSArPSBtOyAgLyogZG91YmxlICovCisgICAgaWYgKG4gPCBtICYmIG0gPCAoUFlfU1NJWkVfVF9NQVggLyBzaXplb2YoZG91YmxlKSkpIHsKKyAgICAgICAgZG91YmxlICpwID0gKnBfcHRyOworICAgICAgICBpZiAocCA9PSBwcykgeworICAgICAgICAgICAgdiA9IFB5TWVtX01hbGxvYyhzaXplb2YoZG91YmxlKSAqIG0pOworICAgICAgICAgICAgaWYgKHYgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICBtZW1jcHkodiwgcHMsIHNpemVvZihkb3VibGUpICogbik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdiA9IFB5TWVtX1JlYWxsb2MocCwgc2l6ZW9mKGRvdWJsZSkgKiBtKTsKKyAgICB9CisgICAgaWYgKHYgPT0gTlVMTCkgeyAgICAgICAgLyogc2l6ZSBvdmVyZmxvdyBvciBubyBtZW1vcnkgKi8KKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX01lbW9yeUVycm9yLCAibWF0aC5mc3VtIHBhcnRpYWxzIik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICAqcF9wdHIgPSAoZG91YmxlKikgdjsKKyAgICAqbV9wdHIgPSBtOworICAgIHJldHVybiAwOwogfQogCiAvKiBGdWxsIHByZWNpc2lvbiBzdW1tYXRpb24gb2YgYSBzZXF1ZW5jZSBvZiBmbG9hdHMuCkBAIC00MzUsMTcgKzQzNSwxNyBAQAogICAgZGVmIG1zdW0oaXRlcmFibGUpOgogICAgICAgIHBhcnRpYWxzID0gW10gICMgc29ydGVkLCBub24tb3ZlcmxhcHBpbmcgcGFydGlhbCBzdW1zCiAgICAgICAgZm9yIHggaW4gaXRlcmFibGU6Ci0gICAgICAgICAgIGkgPSAwCi0gICAgICAgICAgIGZvciB5IGluIHBhcnRpYWxzOgotICAgICAgICAgICAgICAgaWYgYWJzKHgpIDwgYWJzKHkpOgotICAgICAgICAgICAgICAgICAgIHgsIHkgPSB5LCB4Ci0gICAgICAgICAgICAgICBoaSA9IHggKyB5Ci0gICAgICAgICAgICAgICBsbyA9IHkgLSAoaGkgLSB4KQotICAgICAgICAgICAgICAgaWYgbG86Ci0gICAgICAgICAgICAgICAgICAgcGFydGlhbHNbaV0gPSBsbwotICAgICAgICAgICAgICAgICAgIGkgKz0gMQotICAgICAgICAgICAgICAgeCA9IGhpCi0gICAgICAgICAgIHBhcnRpYWxzW2k6XSA9IFt4XQorICAgICAgIGkgPSAwCisgICAgICAgZm9yIHkgaW4gcGFydGlhbHM6CisgICAgICAgICAgIGlmIGFicyh4KSA8IGFicyh5KToKKyAgICAgICAgICAgeCwgeSA9IHksIHgKKyAgICAgICAgICAgaGkgPSB4ICsgeQorICAgICAgICAgICBsbyA9IHkgLSAoaGkgLSB4KQorICAgICAgICAgICBpZiBsbzoKKyAgICAgICAgICAgcGFydGlhbHNbaV0gPSBsbworICAgICAgICAgICBpICs9IDEKKyAgICAgICAgICAgeCA9IGhpCisgICAgICAgcGFydGlhbHNbaTpdID0gW3hdCiAgICAgICAgcmV0dXJuIHN1bV9leGFjdChwYXJ0aWFscykKIAogICAgUm91bmRlZCB4K3kgc3RvcmVkIGluIGhpIHdpdGggdGhlIHJvdW5kb2ZmIHN0b3JlZCBpbiBsby4gIFRvZ2V0aGVyIGhpK2xvCkBAIC00NjMsMTE5ICs0NjMsMTE5IEBACiBzdGF0aWMgUHlPYmplY3QqCiBtYXRoX2ZzdW0oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpzZXEpCiB7Ci0JUHlPYmplY3QgKml0ZW0sICppdGVyLCAqc3VtID0gTlVMTDsKLQlQeV9zc2l6ZV90IGksIGosIG4gPSAwLCBtID0gTlVNX1BBUlRJQUxTOwotCWRvdWJsZSB4LCB5LCB0LCBwc1tOVU1fUEFSVElBTFNdLCAqcCA9IHBzOwotCWRvdWJsZSB4c2F2ZSwgc3BlY2lhbF9zdW0gPSAwLjAsIGluZl9zdW0gPSAwLjA7Ci0Jdm9sYXRpbGUgZG91YmxlIGhpLCB5ciwgbG87CisgICAgUHlPYmplY3QgKml0ZW0sICppdGVyLCAqc3VtID0gTlVMTDsKKyAgICBQeV9zc2l6ZV90IGksIGosIG4gPSAwLCBtID0gTlVNX1BBUlRJQUxTOworICAgIGRvdWJsZSB4LCB5LCB0LCBwc1tOVU1fUEFSVElBTFNdLCAqcCA9IHBzOworICAgIGRvdWJsZSB4c2F2ZSwgc3BlY2lhbF9zdW0gPSAwLjAsIGluZl9zdW0gPSAwLjA7CisgICAgdm9sYXRpbGUgZG91YmxlIGhpLCB5ciwgbG87CiAKLQlpdGVyID0gUHlPYmplY3RfR2V0SXRlcihzZXEpOwotCWlmIChpdGVyID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIGl0ZXIgPSBQeU9iamVjdF9HZXRJdGVyKHNlcSk7CisgICAgaWYgKGl0ZXIgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlQeUZQRV9TVEFSVF9QUk9URUNUKCJmc3VtIiwgUHlfREVDUkVGKGl0ZXIpOyByZXR1cm4gTlVMTCkKKyAgICBQeUZQRV9TVEFSVF9QUk9URUNUKCJmc3VtIiwgUHlfREVDUkVGKGl0ZXIpOyByZXR1cm4gTlVMTCkKIAotCWZvcig7OykgeyAgICAgICAgICAgLyogZm9yIHggaW4gaXRlcmFibGUgKi8KLQkJYXNzZXJ0KDAgPD0gbiAmJiBuIDw9IG0pOwotCQlhc3NlcnQoKG0gPT0gTlVNX1BBUlRJQUxTICYmIHAgPT0gcHMpIHx8Ci0JCSAgICAgICAobSA+ICBOVU1fUEFSVElBTFMgJiYgcCAhPSBOVUxMKSk7CisgICAgZm9yKDs7KSB7ICAgICAgICAgICAvKiBmb3IgeCBpbiBpdGVyYWJsZSAqLworICAgICAgICBhc3NlcnQoMCA8PSBuICYmIG4gPD0gbSk7CisgICAgICAgIGFzc2VydCgobSA9PSBOVU1fUEFSVElBTFMgJiYgcCA9PSBwcykgfHwKKyAgICAgICAgICAgICAgIChtID4gIE5VTV9QQVJUSUFMUyAmJiBwICE9IE5VTEwpKTsKIAotCQlpdGVtID0gUHlJdGVyX05leHQoaXRlcik7Ci0JCWlmIChpdGVtID09IE5VTEwpIHsKLQkJCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQkJCWdvdG8gX2ZzdW1fZXJyb3I7Ci0JCQlicmVhazsKLQkJfQotCQl4ID0gUHlGbG9hdF9Bc0RvdWJsZShpdGVtKTsKLQkJUHlfREVDUkVGKGl0ZW0pOwotCQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkKLQkJCWdvdG8gX2ZzdW1fZXJyb3I7CisgICAgICAgIGl0ZW0gPSBQeUl0ZXJfTmV4dChpdGVyKTsKKyAgICAgICAgaWYgKGl0ZW0gPT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICAgICAgZ290byBfZnN1bV9lcnJvcjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHggPSBQeUZsb2F0X0FzRG91YmxlKGl0ZW0pOworICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CisgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgZ290byBfZnN1bV9lcnJvcjsKIAotCQl4c2F2ZSA9IHg7Ci0JCWZvciAoaSA9IGogPSAwOyBqIDwgbjsgaisrKSB7ICAgICAgIC8qIGZvciB5IGluIHBhcnRpYWxzICovCi0JCQl5ID0gcFtqXTsKLQkJCWlmIChmYWJzKHgpIDwgZmFicyh5KSkgewotCQkJCXQgPSB4OyB4ID0geTsgeSA9IHQ7Ci0JCQl9Ci0JCQloaSA9IHggKyB5OwotCQkJeXIgPSBoaSAtIHg7Ci0JCQlsbyA9IHkgLSB5cjsKLQkJCWlmIChsbyAhPSAwLjApCi0JCQkJcFtpKytdID0gbG87Ci0JCQl4ID0gaGk7Ci0JCX0KKyAgICAgICAgeHNhdmUgPSB4OworICAgICAgICBmb3IgKGkgPSBqID0gMDsgaiA8IG47IGorKykgeyAgICAgICAvKiBmb3IgeSBpbiBwYXJ0aWFscyAqLworICAgICAgICAgICAgeSA9IHBbal07CisgICAgICAgICAgICBpZiAoZmFicyh4KSA8IGZhYnMoeSkpIHsKKyAgICAgICAgICAgICAgICB0ID0geDsgeCA9IHk7IHkgPSB0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaGkgPSB4ICsgeTsKKyAgICAgICAgICAgIHlyID0gaGkgLSB4OworICAgICAgICAgICAgbG8gPSB5IC0geXI7CisgICAgICAgICAgICBpZiAobG8gIT0gMC4wKQorICAgICAgICAgICAgICAgIHBbaSsrXSA9IGxvOworICAgICAgICAgICAgeCA9IGhpOworICAgICAgICB9CiAKLQkJbiA9IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHNbaTpdID0gW3hdICovCi0JCWlmICh4ICE9IDAuMCkgewotCQkJaWYgKCEgUHlfSVNfRklOSVRFKHgpKSB7Ci0JCQkJLyogYSBub25maW5pdGUgeCBjb3VsZCBhcmlzZSBlaXRoZXIgYXMKLQkJCQkgICBhIHJlc3VsdCBvZiBpbnRlcm1lZGlhdGUgb3ZlcmZsb3csIG9yCi0JCQkJICAgYXMgYSByZXN1bHQgb2YgYSBuYW4gb3IgaW5mIGluIHRoZQotCQkJCSAgIHN1bW1hbmRzICovCi0JCQkJaWYgKFB5X0lTX0ZJTklURSh4c2F2ZSkpIHsKLQkJCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0JCQkJCSAgICAgICJpbnRlcm1lZGlhdGUgb3ZlcmZsb3cgaW4gZnN1bSIpOwotCQkJCQlnb3RvIF9mc3VtX2Vycm9yOwotCQkJCX0KLQkJCQlpZiAoUHlfSVNfSU5GSU5JVFkoeHNhdmUpKQotCQkJCQlpbmZfc3VtICs9IHhzYXZlOwotCQkJCXNwZWNpYWxfc3VtICs9IHhzYXZlOwotCQkJCS8qIHJlc2V0IHBhcnRpYWxzICovCi0JCQkJbiA9IDA7Ci0JCQl9Ci0JCQllbHNlIGlmIChuID49IG0gJiYgX2ZzdW1fcmVhbGxvYygmcCwgbiwgcHMsICZtKSkKLQkJCQlnb3RvIF9mc3VtX2Vycm9yOwotCQkJZWxzZQotCQkJCXBbbisrXSA9IHg7Ci0JCX0KLQl9CisgICAgICAgIG4gPSBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBzW2k6XSA9IFt4XSAqLworICAgICAgICBpZiAoeCAhPSAwLjApIHsKKyAgICAgICAgICAgIGlmICghIFB5X0lTX0ZJTklURSh4KSkgeworICAgICAgICAgICAgICAgIC8qIGEgbm9uZmluaXRlIHggY291bGQgYXJpc2UgZWl0aGVyIGFzCisgICAgICAgICAgICAgICAgICAgYSByZXN1bHQgb2YgaW50ZXJtZWRpYXRlIG92ZXJmbG93LCBvcgorICAgICAgICAgICAgICAgICAgIGFzIGEgcmVzdWx0IG9mIGEgbmFuIG9yIGluZiBpbiB0aGUKKyAgICAgICAgICAgICAgICAgICBzdW1tYW5kcyAqLworICAgICAgICAgICAgICAgIGlmIChQeV9JU19GSU5JVEUoeHNhdmUpKSB7CisgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiaW50ZXJtZWRpYXRlIG92ZXJmbG93IGluIGZzdW0iKTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBfZnN1bV9lcnJvcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKFB5X0lTX0lORklOSVRZKHhzYXZlKSkKKyAgICAgICAgICAgICAgICAgICAgaW5mX3N1bSArPSB4c2F2ZTsKKyAgICAgICAgICAgICAgICBzcGVjaWFsX3N1bSArPSB4c2F2ZTsKKyAgICAgICAgICAgICAgICAvKiByZXNldCBwYXJ0aWFscyAqLworICAgICAgICAgICAgICAgIG4gPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAobiA+PSBtICYmIF9mc3VtX3JlYWxsb2MoJnAsIG4sIHBzLCAmbSkpCisgICAgICAgICAgICAgICAgZ290byBfZnN1bV9lcnJvcjsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBwW24rK10gPSB4OworICAgICAgICB9CisgICAgfQogCi0JaWYgKHNwZWNpYWxfc3VtICE9IDAuMCkgewotCQlpZiAoUHlfSVNfTkFOKGluZl9zdW0pKQotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJCSItaW5mICsgaW5mIGluIGZzdW0iKTsKLQkJZWxzZQotCQkJc3VtID0gUHlGbG9hdF9Gcm9tRG91YmxlKHNwZWNpYWxfc3VtKTsKLQkJZ290byBfZnN1bV9lcnJvcjsKLQl9CisgICAgaWYgKHNwZWNpYWxfc3VtICE9IDAuMCkgeworICAgICAgICBpZiAoUHlfSVNfTkFOKGluZl9zdW0pKQorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi1pbmYgKyBpbmYgaW4gZnN1bSIpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzdW0gPSBQeUZsb2F0X0Zyb21Eb3VibGUoc3BlY2lhbF9zdW0pOworICAgICAgICBnb3RvIF9mc3VtX2Vycm9yOworICAgIH0KIAotCWhpID0gMC4wOwotCWlmIChuID4gMCkgewotCQloaSA9IHBbLS1uXTsKLQkJLyogc3VtX2V4YWN0KHBzLCBoaSkgZnJvbSB0aGUgdG9wLCBzdG9wIHdoZW4gdGhlIHN1bSBiZWNvbWVzCi0JCSAgIGluZXhhY3QuICovCi0JCXdoaWxlIChuID4gMCkgewotCQkJeCA9IGhpOwotCQkJeSA9IHBbLS1uXTsKLQkJCWFzc2VydChmYWJzKHkpIDwgZmFicyh4KSk7Ci0JCQloaSA9IHggKyB5OwotCQkJeXIgPSBoaSAtIHg7Ci0JCQlsbyA9IHkgLSB5cjsKLQkJCWlmIChsbyAhPSAwLjApCi0JCQkJYnJlYWs7Ci0JCX0KLQkJLyogTWFrZSBoYWxmLWV2ZW4gcm91bmRpbmcgd29yayBhY3Jvc3MgbXVsdGlwbGUgcGFydGlhbHMuCi0JCSAgIE5lZWRlZCBzbyB0aGF0IHN1bShbMWUtMTYsIDEsIDFlMTZdKSB3aWxsIHJvdW5kLXVwIHRoZSBsYXN0Ci0JCSAgIGRpZ2l0IHRvIHR3byBpbnN0ZWFkIG9mIGRvd24gdG8gemVybyAodGhlIDFlLTE2IG1ha2VzIHRoZSAxCi0JCSAgIHNsaWdodGx5IGNsb3NlciB0byB0d28pLiAgV2l0aCBhIHBvdGVudGlhbCAxIFVMUCByb3VuZGluZwotCQkgICBlcnJvciBmaXhlZC11cCwgbWF0aC5mc3VtKCkgY2FuIGd1YXJhbnRlZSBjb21tdXRhdGl2aXR5LiAqLwotCQlpZiAobiA+IDAgJiYgKChsbyA8IDAuMCAmJiBwW24tMV0gPCAwLjApIHx8Ci0JCQkgICAgICAobG8gPiAwLjAgJiYgcFtuLTFdID4gMC4wKSkpIHsKLQkJCXkgPSBsbyAqIDIuMDsKLQkJCXggPSBoaSArIHk7Ci0JCQl5ciA9IHggLSBoaTsKLQkJCWlmICh5ID09IHlyKQotCQkJCWhpID0geDsKLQkJfQotCX0KLQlzdW0gPSBQeUZsb2F0X0Zyb21Eb3VibGUoaGkpOworICAgIGhpID0gMC4wOworICAgIGlmIChuID4gMCkgeworICAgICAgICBoaSA9IHBbLS1uXTsKKyAgICAgICAgLyogc3VtX2V4YWN0KHBzLCBoaSkgZnJvbSB0aGUgdG9wLCBzdG9wIHdoZW4gdGhlIHN1bSBiZWNvbWVzCisgICAgICAgICAgIGluZXhhY3QuICovCisgICAgICAgIHdoaWxlIChuID4gMCkgeworICAgICAgICAgICAgeCA9IGhpOworICAgICAgICAgICAgeSA9IHBbLS1uXTsKKyAgICAgICAgICAgIGFzc2VydChmYWJzKHkpIDwgZmFicyh4KSk7CisgICAgICAgICAgICBoaSA9IHggKyB5OworICAgICAgICAgICAgeXIgPSBoaSAtIHg7CisgICAgICAgICAgICBsbyA9IHkgLSB5cjsKKyAgICAgICAgICAgIGlmIChsbyAhPSAwLjApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgLyogTWFrZSBoYWxmLWV2ZW4gcm91bmRpbmcgd29yayBhY3Jvc3MgbXVsdGlwbGUgcGFydGlhbHMuCisgICAgICAgICAgIE5lZWRlZCBzbyB0aGF0IHN1bShbMWUtMTYsIDEsIDFlMTZdKSB3aWxsIHJvdW5kLXVwIHRoZSBsYXN0CisgICAgICAgICAgIGRpZ2l0IHRvIHR3byBpbnN0ZWFkIG9mIGRvd24gdG8gemVybyAodGhlIDFlLTE2IG1ha2VzIHRoZSAxCisgICAgICAgICAgIHNsaWdodGx5IGNsb3NlciB0byB0d28pLiAgV2l0aCBhIHBvdGVudGlhbCAxIFVMUCByb3VuZGluZworICAgICAgICAgICBlcnJvciBmaXhlZC11cCwgbWF0aC5mc3VtKCkgY2FuIGd1YXJhbnRlZSBjb21tdXRhdGl2aXR5LiAqLworICAgICAgICBpZiAobiA+IDAgJiYgKChsbyA8IDAuMCAmJiBwW24tMV0gPCAwLjApIHx8CisgICAgICAgICAgICAgICAgICAgICAgKGxvID4gMC4wICYmIHBbbi0xXSA+IDAuMCkpKSB7CisgICAgICAgICAgICB5ID0gbG8gKiAyLjA7CisgICAgICAgICAgICB4ID0gaGkgKyB5OworICAgICAgICAgICAgeXIgPSB4IC0gaGk7CisgICAgICAgICAgICBpZiAoeSA9PSB5cikKKyAgICAgICAgICAgICAgICBoaSA9IHg7CisgICAgICAgIH0KKyAgICB9CisgICAgc3VtID0gUHlGbG9hdF9Gcm9tRG91YmxlKGhpKTsKIAogX2ZzdW1fZXJyb3I6Ci0JUHlGUEVfRU5EX1BST1RFQ1QoaGkpCi0JUHlfREVDUkVGKGl0ZXIpOwotCWlmIChwICE9IHBzKQotCQlQeU1lbV9GcmVlKHApOwotCXJldHVybiBzdW07CisgICAgUHlGUEVfRU5EX1BST1RFQ1QoaGkpCisgICAgUHlfREVDUkVGKGl0ZXIpOworICAgIGlmIChwICE9IHBzKQorICAgICAgICBQeU1lbV9GcmVlKHApOworICAgIHJldHVybiBzdW07CiB9CiAKICN1bmRlZiBOVU1fUEFSVElBTFMKQEAgLTU4OCw0NiArNTg4LDQ2IEBACiBzdGF0aWMgUHlPYmplY3QgKgogbWF0aF9mYWN0b3JpYWwoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmcpCiB7Ci0JbG9uZyBpLCB4OwotCVB5T2JqZWN0ICpyZXN1bHQsICppb2JqLCAqbmV3cmVzdWx0OworICAgIGxvbmcgaSwgeDsKKyAgICBQeU9iamVjdCAqcmVzdWx0LCAqaW9iaiwgKm5ld3Jlc3VsdDsKIAotCWlmIChQeUZsb2F0X0NoZWNrKGFyZykpIHsKLQkJZG91YmxlIGR4ID0gUHlGbG9hdF9BU19ET1VCTEUoKFB5RmxvYXRPYmplY3QgKilhcmcpOwotCQlpZiAoZHggIT0gZmxvb3IoZHgpKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgCi0JCQkJImZhY3RvcmlhbCgpIG9ubHkgYWNjZXB0cyBpbnRlZ3JhbCB2YWx1ZXMiKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQorICAgIGlmIChQeUZsb2F0X0NoZWNrKGFyZykpIHsKKyAgICAgICAgZG91YmxlIGR4ID0gUHlGbG9hdF9BU19ET1VCTEUoKFB5RmxvYXRPYmplY3QgKilhcmcpOworICAgICAgICBpZiAoZHggIT0gZmxvb3IoZHgpKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAiZmFjdG9yaWFsKCkgb25seSBhY2NlcHRzIGludGVncmFsIHZhbHVlcyIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CiAKLQl4ID0gUHlJbnRfQXNMb25nKGFyZyk7Ci0JaWYgKHggPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKHggPCAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAKLQkJCSJmYWN0b3JpYWwoKSBub3QgZGVmaW5lZCBmb3IgbmVnYXRpdmUgdmFsdWVzIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICB4ID0gUHlJbnRfQXNMb25nKGFyZyk7CisgICAgaWYgKHggPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKHggPCAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgImZhY3RvcmlhbCgpIG5vdCBkZWZpbmVkIGZvciBuZWdhdGl2ZSB2YWx1ZXMiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JcmVzdWx0ID0gKFB5T2JqZWN0ICopUHlJbnRfRnJvbUxvbmcoMSk7Ci0JaWYgKHJlc3VsdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlmb3IgKGk9MSA7IGk8PXggOyBpKyspIHsKLQkJaW9iaiA9IChQeU9iamVjdCAqKVB5SW50X0Zyb21Mb25nKGkpOwotCQlpZiAoaW9iaiA9PSBOVUxMKQotCQkJZ290byBlcnJvcjsKLQkJbmV3cmVzdWx0ID0gUHlOdW1iZXJfTXVsdGlwbHkocmVzdWx0LCBpb2JqKTsKLQkJUHlfREVDUkVGKGlvYmopOwotCQlpZiAobmV3cmVzdWx0ID09IE5VTEwpCi0JCQlnb3RvIGVycm9yOwotCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJcmVzdWx0ID0gbmV3cmVzdWx0OwotCX0KLQlyZXR1cm4gcmVzdWx0OworICAgIHJlc3VsdCA9IChQeU9iamVjdCAqKVB5SW50X0Zyb21Mb25nKDEpOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZm9yIChpPTEgOyBpPD14IDsgaSsrKSB7CisgICAgICAgIGlvYmogPSAoUHlPYmplY3QgKilQeUludF9Gcm9tTG9uZyhpKTsKKyAgICAgICAgaWYgKGlvYmogPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIG5ld3Jlc3VsdCA9IFB5TnVtYmVyX011bHRpcGx5KHJlc3VsdCwgaW9iaik7CisgICAgICAgIFB5X0RFQ1JFRihpb2JqKTsKKyAgICAgICAgaWYgKG5ld3Jlc3VsdCA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgIHJlc3VsdCA9IG5ld3Jlc3VsdDsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKIAogZXJyb3I6Ci0JUHlfREVDUkVGKHJlc3VsdCk7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIFB5RG9jX1NUUlZBUihtYXRoX2ZhY3RvcmlhbF9kb2MsCkBAIC02MzgsNyArNjM4LDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBtYXRoX3RydW5jKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqbnVtYmVyKQogewotCXJldHVybiBQeU9iamVjdF9DYWxsTWV0aG9kKG51bWJlciwgIl9fdHJ1bmNfXyIsIE5VTEwpOworICAgIHJldHVybiBQeU9iamVjdF9DYWxsTWV0aG9kKG51bWJlciwgIl9fdHJ1bmNfXyIsIE5VTEwpOwogfQogCiBQeURvY19TVFJWQVIobWF0aF90cnVuY19kb2MsCkBAIC02NDksMjEgKzY0OSwyMSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIG1hdGhfZnJleHAoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmcpCiB7Ci0JaW50IGk7Ci0JZG91YmxlIHggPSBQeUZsb2F0X0FzRG91YmxlKGFyZyk7Ci0JaWYgKHggPT0gLTEuMCAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gTlVMTDsKLQkvKiBkZWFsIHdpdGggc3BlY2lhbCBjYXNlcyBkaXJlY3RseSwgdG8gc2lkZXN0ZXAgcGxhdGZvcm0KLQkgICBkaWZmZXJlbmNlcyAqLwotCWlmIChQeV9JU19OQU4oeCkgfHwgUHlfSVNfSU5GSU5JVFkoeCkgfHwgIXgpIHsKLQkJaSA9IDA7Ci0JfQotCWVsc2UgewotCQlQeUZQRV9TVEFSVF9QUk9URUNUKCJpbiBtYXRoX2ZyZXhwIiwgcmV0dXJuIDApOwotCQl4ID0gZnJleHAoeCwgJmkpOwotCQlQeUZQRV9FTkRfUFJPVEVDVCh4KTsKLQl9Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihkaSkiLCB4LCBpKTsKKyAgICBpbnQgaTsKKyAgICBkb3VibGUgeCA9IFB5RmxvYXRfQXNEb3VibGUoYXJnKTsKKyAgICBpZiAoeCA9PSAtMS4wICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIC8qIGRlYWwgd2l0aCBzcGVjaWFsIGNhc2VzIGRpcmVjdGx5LCB0byBzaWRlc3RlcCBwbGF0Zm9ybQorICAgICAgIGRpZmZlcmVuY2VzICovCisgICAgaWYgKFB5X0lTX05BTih4KSB8fCBQeV9JU19JTkZJTklUWSh4KSB8fCAheCkgeworICAgICAgICBpID0gMDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5RlBFX1NUQVJUX1BST1RFQ1QoImluIG1hdGhfZnJleHAiLCByZXR1cm4gMCk7CisgICAgICAgIHggPSBmcmV4cCh4LCAmaSk7CisgICAgICAgIFB5RlBFX0VORF9QUk9URUNUKHgpOworICAgIH0KKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKGRpKSIsIHgsIGkpOwogfQogCiBQeURvY19TVFJWQVIobWF0aF9mcmV4cF9kb2MsCkBAIC02NzYsNjYgKzY3Niw2NiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIG1hdGhfbGRleHAoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWRvdWJsZSB4LCByOwotCVB5T2JqZWN0ICpvZXhwOwotCWxvbmcgZXhwOwotCWlmICghIFB5QXJnX1BhcnNlVHVwbGUoYXJncywgImRPOmxkZXhwIiwgJngsICZvZXhwKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgZG91YmxlIHgsIHI7CisgICAgUHlPYmplY3QgKm9leHA7CisgICAgbG9uZyBleHA7CisgICAgaWYgKCEgUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiZE86bGRleHAiLCAmeCwgJm9leHApKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChQeUxvbmdfQ2hlY2sob2V4cCkpIHsKLQkJLyogb24gb3ZlcmZsb3csIHJlcGxhY2UgZXhwb25lbnQgd2l0aCBlaXRoZXIgTE9OR19NQVgKLQkJICAgb3IgTE9OR19NSU4sIGRlcGVuZGluZyBvbiB0aGUgc2lnbi4gKi8KLQkJZXhwID0gUHlMb25nX0FzTG9uZyhvZXhwKTsKLQkJaWYgKGV4cCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCQlpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19PdmVyZmxvd0Vycm9yKSkgewotCQkJCWlmIChQeV9TSVpFKG9leHApIDwgMCkgewotCQkJCQlleHAgPSBMT05HX01JTjsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWV4cCA9IExPTkdfTUFYOwotCQkJCX0KLQkJCQlQeUVycl9DbGVhcigpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLyogcHJvcGFnYXRlIGFueSB1bmV4cGVjdGVkIGV4Y2VwdGlvbiAqLwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQl9Ci0JfQotCWVsc2UgaWYgKFB5SW50X0NoZWNrKG9leHApKSB7Ci0JCWV4cCA9IFB5SW50X0FTX0xPTkcob2V4cCk7Ci0JfQotCWVsc2UgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJFeHBlY3RlZCBhbiBpbnQgb3IgbG9uZyBhcyBzZWNvbmQgYXJndW1lbnQgIgotCQkJCSJ0byBsZGV4cC4iKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChQeUxvbmdfQ2hlY2sob2V4cCkpIHsKKyAgICAgICAgLyogb24gb3ZlcmZsb3csIHJlcGxhY2UgZXhwb25lbnQgd2l0aCBlaXRoZXIgTE9OR19NQVgKKyAgICAgICAgICAgb3IgTE9OR19NSU4sIGRlcGVuZGluZyBvbiB0aGUgc2lnbi4gKi8KKyAgICAgICAgZXhwID0gUHlMb25nX0FzTG9uZyhvZXhwKTsKKyAgICAgICAgaWYgKGV4cCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgICAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19PdmVyZmxvd0Vycm9yKSkgeworICAgICAgICAgICAgICAgIGlmIChQeV9TSVpFKG9leHApIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBleHAgPSBMT05HX01JTjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGV4cCA9IExPTkdfTUFYOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgLyogcHJvcGFnYXRlIGFueSB1bmV4cGVjdGVkIGV4Y2VwdGlvbiAqLworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKFB5SW50X0NoZWNrKG9leHApKSB7CisgICAgICAgIGV4cCA9IFB5SW50X0FTX0xPTkcob2V4cCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGFuIGludCBvciBsb25nIGFzIHNlY29uZCBhcmd1bWVudCAiCisgICAgICAgICAgICAgICAgICAgICAgICAidG8gbGRleHAuIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWlmICh4ID09IDAuIHx8ICFQeV9JU19GSU5JVEUoeCkpIHsKLQkJLyogTmFOcywgemVyb3MgYW5kIGluZmluaXRpZXMgYXJlIHJldHVybmVkIHVuY2hhbmdlZCAqLwotCQlyID0geDsKLQkJZXJybm8gPSAwOwotCX0gZWxzZSBpZiAoZXhwID4gSU5UX01BWCkgewotCQkvKiBvdmVyZmxvdyAqLwotCQlyID0gY29weXNpZ24oUHlfSFVHRV9WQUwsIHgpOwotCQllcnJubyA9IEVSQU5HRTsKLQl9IGVsc2UgaWYgKGV4cCA8IElOVF9NSU4pIHsKLQkJLyogdW5kZXJmbG93IHRvICstMCAqLwotCQlyID0gY29weXNpZ24oMC4sIHgpOwotCQllcnJubyA9IDA7Ci0JfSBlbHNlIHsKLQkJZXJybm8gPSAwOwotCQlQeUZQRV9TVEFSVF9QUk9URUNUKCJpbiBtYXRoX2xkZXhwIiwgcmV0dXJuIDApOwotCQlyID0gbGRleHAoeCwgKGludClleHApOwotCQlQeUZQRV9FTkRfUFJPVEVDVChyKTsKLQkJaWYgKFB5X0lTX0lORklOSVRZKHIpKQotCQkJZXJybm8gPSBFUkFOR0U7Ci0JfQorICAgIGlmICh4ID09IDAuIHx8ICFQeV9JU19GSU5JVEUoeCkpIHsKKyAgICAgICAgLyogTmFOcywgemVyb3MgYW5kIGluZmluaXRpZXMgYXJlIHJldHVybmVkIHVuY2hhbmdlZCAqLworICAgICAgICByID0geDsKKyAgICAgICAgZXJybm8gPSAwOworICAgIH0gZWxzZSBpZiAoZXhwID4gSU5UX01BWCkgeworICAgICAgICAvKiBvdmVyZmxvdyAqLworICAgICAgICByID0gY29weXNpZ24oUHlfSFVHRV9WQUwsIHgpOworICAgICAgICBlcnJubyA9IEVSQU5HRTsKKyAgICB9IGVsc2UgaWYgKGV4cCA8IElOVF9NSU4pIHsKKyAgICAgICAgLyogdW5kZXJmbG93IHRvICstMCAqLworICAgICAgICByID0gY29weXNpZ24oMC4sIHgpOworICAgICAgICBlcnJubyA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZXJybm8gPSAwOworICAgICAgICBQeUZQRV9TVEFSVF9QUk9URUNUKCJpbiBtYXRoX2xkZXhwIiwgcmV0dXJuIDApOworICAgICAgICByID0gbGRleHAoeCwgKGludClleHApOworICAgICAgICBQeUZQRV9FTkRfUFJPVEVDVChyKTsKKyAgICAgICAgaWYgKFB5X0lTX0lORklOSVRZKHIpKQorICAgICAgICAgICAgZXJybm8gPSBFUkFOR0U7CisgICAgfQogCi0JaWYgKGVycm5vICYmIGlzX2Vycm9yKHIpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKHIpOworICAgIGlmIChlcnJubyAmJiBpc19lcnJvcihyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShyKTsKIH0KIAogUHlEb2NfU1RSVkFSKG1hdGhfbGRleHBfZG9jLApAQCAtNzQ1LDIzICs3NDUsMjMgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBtYXRoX21vZGYoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmcpCiB7Ci0JZG91YmxlIHksIHggPSBQeUZsb2F0X0FzRG91YmxlKGFyZyk7Ci0JaWYgKHggPT0gLTEuMCAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gTlVMTDsKLQkvKiBzb21lIHBsYXRmb3JtcyBkb24ndCBkbyB0aGUgcmlnaHQgdGhpbmcgZm9yIE5hTnMgYW5kCi0JICAgaW5maW5pdGllcywgc28gd2UgdGFrZSBjYXJlIG9mIHNwZWNpYWwgY2FzZXMgZGlyZWN0bHkuICovCi0JaWYgKCFQeV9JU19GSU5JVEUoeCkpIHsKLQkJaWYgKFB5X0lTX0lORklOSVRZKHgpKQotCQkJcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihkZCkiLCBjb3B5c2lnbigwLiwgeCksIHgpOwotCQllbHNlIGlmIChQeV9JU19OQU4oeCkpCi0JCQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKGRkKSIsIHgsIHgpOwotCX0gICAgICAgICAgCisgICAgZG91YmxlIHksIHggPSBQeUZsb2F0X0FzRG91YmxlKGFyZyk7CisgICAgaWYgKHggPT0gLTEuMCAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAvKiBzb21lIHBsYXRmb3JtcyBkb24ndCBkbyB0aGUgcmlnaHQgdGhpbmcgZm9yIE5hTnMgYW5kCisgICAgICAgaW5maW5pdGllcywgc28gd2UgdGFrZSBjYXJlIG9mIHNwZWNpYWwgY2FzZXMgZGlyZWN0bHkuICovCisgICAgaWYgKCFQeV9JU19GSU5JVEUoeCkpIHsKKyAgICAgICAgaWYgKFB5X0lTX0lORklOSVRZKHgpKQorICAgICAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihkZCkiLCBjb3B5c2lnbigwLiwgeCksIHgpOworICAgICAgICBlbHNlIGlmIChQeV9JU19OQU4oeCkpCisgICAgICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKGRkKSIsIHgsIHgpOworICAgIH0KIAotCWVycm5vID0gMDsKLQlQeUZQRV9TVEFSVF9QUk9URUNUKCJpbiBtYXRoX21vZGYiLCByZXR1cm4gMCk7Ci0JeCA9IG1vZGYoeCwgJnkpOwotCVB5RlBFX0VORF9QUk9URUNUKHgpOwotCXJldHVybiBQeV9CdWlsZFZhbHVlKCIoZGQpIiwgeCwgeSk7CisgICAgZXJybm8gPSAwOworICAgIFB5RlBFX1NUQVJUX1BST1RFQ1QoImluIG1hdGhfbW9kZiIsIHJldHVybiAwKTsKKyAgICB4ID0gbW9kZih4LCAmeSk7CisgICAgUHlGUEVfRU5EX1BST1RFQ1QoeCk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihkZCkiLCB4LCB5KTsKIH0KIAogUHlEb2NfU1RSVkFSKG1hdGhfbW9kZl9kb2MsCkBAIC03ODEsNTMgKzc4MSw1MyBAQAogc3RhdGljIFB5T2JqZWN0KgogbG9naGVscGVyKFB5T2JqZWN0KiBhcmcsIGRvdWJsZSAoKmZ1bmMpKGRvdWJsZSksIGNoYXIgKmZ1bmNuYW1lKQogewotCS8qIElmIGl0IGlzIGxvbmcsIGRvIGl0IG91cnNlbHZlcy4gKi8KLQlpZiAoUHlMb25nX0NoZWNrKGFyZykpIHsKLQkJZG91YmxlIHg7Ci0JCWludCBlOwotCQl4ID0gX1B5TG9uZ19Bc1NjYWxlZERvdWJsZShhcmcsICZlKTsKLQkJaWYgKHggPD0gMC4wKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkJIm1hdGggZG9tYWluIGVycm9yIik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQkvKiBWYWx1ZSBpcyB+PSB4ICogMioqKGUqUHlMb25nX1NISUZUKSwgc28gdGhlIGxvZyB+PQotCQkgICBsb2coeCkgKyBsb2coMikgKiBlICogUHlMb25nX1NISUZULgotCQkgICBDQVVUSU9OOiAgZSpQeUxvbmdfU0hJRlQgbWF5IG92ZXJmbG93IHVzaW5nIGludCBhcml0aG1ldGljLAotCQkgICBzbyBmb3JjZSB1c2Ugb2YgZG91YmxlLiAqLwotCQl4ID0gZnVuYyh4KSArIChlICogKGRvdWJsZSlQeUxvbmdfU0hJRlQpICogZnVuYygyLjApOwotCQlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKHgpOwotCX0KKyAgICAvKiBJZiBpdCBpcyBsb25nLCBkbyBpdCBvdXJzZWx2ZXMuICovCisgICAgaWYgKFB5TG9uZ19DaGVjayhhcmcpKSB7CisgICAgICAgIGRvdWJsZSB4OworICAgICAgICBpbnQgZTsKKyAgICAgICAgeCA9IF9QeUxvbmdfQXNTY2FsZWREb3VibGUoYXJnLCAmZSk7CisgICAgICAgIGlmICh4IDw9IDAuMCkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hdGggZG9tYWluIGVycm9yIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICAvKiBWYWx1ZSBpcyB+PSB4ICogMioqKGUqUHlMb25nX1NISUZUKSwgc28gdGhlIGxvZyB+PQorICAgICAgICAgICBsb2coeCkgKyBsb2coMikgKiBlICogUHlMb25nX1NISUZULgorICAgICAgICAgICBDQVVUSU9OOiAgZSpQeUxvbmdfU0hJRlQgbWF5IG92ZXJmbG93IHVzaW5nIGludCBhcml0aG1ldGljLAorICAgICAgICAgICBzbyBmb3JjZSB1c2Ugb2YgZG91YmxlLiAqLworICAgICAgICB4ID0gZnVuYyh4KSArIChlICogKGRvdWJsZSlQeUxvbmdfU0hJRlQpICogZnVuYygyLjApOworICAgICAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKHgpOworICAgIH0KIAotCS8qIEVsc2UgbGV0IGxpYm0gaGFuZGxlIGl0IGJ5IGl0c2VsZi4gKi8KLQlyZXR1cm4gbWF0aF8xKGFyZywgZnVuYywgMCk7CisgICAgLyogRWxzZSBsZXQgbGlibSBoYW5kbGUgaXQgYnkgaXRzZWxmLiAqLworICAgIHJldHVybiBtYXRoXzEoYXJnLCBmdW5jLCAwKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG1hdGhfbG9nKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqYXJnOwotCVB5T2JqZWN0ICpiYXNlID0gTlVMTDsKLQlQeU9iamVjdCAqbnVtLCAqZGVuOwotCVB5T2JqZWN0ICphbnM7CisgICAgUHlPYmplY3QgKmFyZzsKKyAgICBQeU9iamVjdCAqYmFzZSA9IE5VTEw7CisgICAgUHlPYmplY3QgKm51bSwgKmRlbjsKKyAgICBQeU9iamVjdCAqYW5zOwogCi0JaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAibG9nIiwgMSwgMiwgJmFyZywgJmJhc2UpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJsb2ciLCAxLCAyLCAmYXJnLCAmYmFzZSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JbnVtID0gbG9naGVscGVyKGFyZywgbV9sb2csICJsb2ciKTsKLQlpZiAobnVtID09IE5VTEwgfHwgYmFzZSA9PSBOVUxMKQotCQlyZXR1cm4gbnVtOworICAgIG51bSA9IGxvZ2hlbHBlcihhcmcsIG1fbG9nLCAibG9nIik7CisgICAgaWYgKG51bSA9PSBOVUxMIHx8IGJhc2UgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIG51bTsKIAotCWRlbiA9IGxvZ2hlbHBlcihiYXNlLCBtX2xvZywgImxvZyIpOwotCWlmIChkZW4gPT0gTlVMTCkgewotCQlQeV9ERUNSRUYobnVtKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGRlbiA9IGxvZ2hlbHBlcihiYXNlLCBtX2xvZywgImxvZyIpOworICAgIGlmIChkZW4gPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYobnVtKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JYW5zID0gUHlOdW1iZXJfRGl2aWRlKG51bSwgZGVuKTsKLQlQeV9ERUNSRUYobnVtKTsKLQlQeV9ERUNSRUYoZGVuKTsKLQlyZXR1cm4gYW5zOworICAgIGFucyA9IFB5TnVtYmVyX0RpdmlkZShudW0sIGRlbik7CisgICAgUHlfREVDUkVGKG51bSk7CisgICAgUHlfREVDUkVGKGRlbik7CisgICAgcmV0dXJuIGFuczsKIH0KIAogUHlEb2NfU1RSVkFSKG1hdGhfbG9nX2RvYywKQEAgLTgzOCw3ICs4MzgsNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIG1hdGhfbG9nMTAoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmcpCiB7Ci0JcmV0dXJuIGxvZ2hlbHBlcihhcmcsIG1fbG9nMTAsICJsb2cxMCIpOworICAgIHJldHVybiBsb2doZWxwZXIoYXJnLCBtX2xvZzEwLCAibG9nMTAiKTsKIH0KIAogUHlEb2NfU1RSVkFSKG1hdGhfbG9nMTBfZG9jLApAQCAtODQ3LDMxICs4NDcsMzEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBtYXRoX2Ztb2QoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICpveCwgKm95OwotCWRvdWJsZSByLCB4LCB5OwotCWlmICghIFB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJmbW9kIiwgMiwgMiwgJm94LCAmb3kpKQotCQlyZXR1cm4gTlVMTDsKLQl4ID0gUHlGbG9hdF9Bc0RvdWJsZShveCk7Ci0JeSA9IFB5RmxvYXRfQXNEb3VibGUob3kpOwotCWlmICgoeCA9PSAtMS4wIHx8IHkgPT0gLTEuMCkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JLyogZm1vZCh4LCArLy1JbmYpIHJldHVybnMgeCBmb3IgZmluaXRlIHguICovCi0JaWYgKFB5X0lTX0lORklOSVRZKHkpICYmIFB5X0lTX0ZJTklURSh4KSkKLQkJcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZSh4KTsKLQllcnJubyA9IDA7Ci0JUHlGUEVfU1RBUlRfUFJPVEVDVCgiaW4gbWF0aF9mbW9kIiwgcmV0dXJuIDApOwotCXIgPSBmbW9kKHgsIHkpOwotCVB5RlBFX0VORF9QUk9URUNUKHIpOwotCWlmIChQeV9JU19OQU4ocikpIHsKLQkJaWYgKCFQeV9JU19OQU4oeCkgJiYgIVB5X0lTX05BTih5KSkKLQkJCWVycm5vID0gRURPTTsKLQkJZWxzZQotCQkJZXJybm8gPSAwOwotCX0KLQlpZiAoZXJybm8gJiYgaXNfZXJyb3IocikpCi0JCXJldHVybiBOVUxMOwotCWVsc2UKLQkJcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShyKTsKKyAgICBQeU9iamVjdCAqb3gsICpveTsKKyAgICBkb3VibGUgciwgeCwgeTsKKyAgICBpZiAoISBQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiZm1vZCIsIDIsIDIsICZveCwgJm95KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgeCA9IFB5RmxvYXRfQXNEb3VibGUob3gpOworICAgIHkgPSBQeUZsb2F0X0FzRG91YmxlKG95KTsKKyAgICBpZiAoKHggPT0gLTEuMCB8fCB5ID09IC0xLjApICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIC8qIGZtb2QoeCwgKy8tSW5mKSByZXR1cm5zIHggZm9yIGZpbml0ZSB4LiAqLworICAgIGlmIChQeV9JU19JTkZJTklUWSh5KSAmJiBQeV9JU19GSU5JVEUoeCkpCisgICAgICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoeCk7CisgICAgZXJybm8gPSAwOworICAgIFB5RlBFX1NUQVJUX1BST1RFQ1QoImluIG1hdGhfZm1vZCIsIHJldHVybiAwKTsKKyAgICByID0gZm1vZCh4LCB5KTsKKyAgICBQeUZQRV9FTkRfUFJPVEVDVChyKTsKKyAgICBpZiAoUHlfSVNfTkFOKHIpKSB7CisgICAgICAgIGlmICghUHlfSVNfTkFOKHgpICYmICFQeV9JU19OQU4oeSkpCisgICAgICAgICAgICBlcnJubyA9IEVET007CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVycm5vID0gMDsKKyAgICB9CisgICAgaWYgKGVycm5vICYmIGlzX2Vycm9yKHIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUocik7CiB9CiAKIFB5RG9jX1NUUlZBUihtYXRoX2Ztb2RfZG9jLApAQCAtODgxLDM5ICs4ODEsMzkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBtYXRoX2h5cG90KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqb3gsICpveTsKLQlkb3VibGUgciwgeCwgeTsKLQlpZiAoISBQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiaHlwb3QiLCAyLCAyLCAmb3gsICZveSkpCi0JCXJldHVybiBOVUxMOwotCXggPSBQeUZsb2F0X0FzRG91YmxlKG94KTsKLQl5ID0gUHlGbG9hdF9Bc0RvdWJsZShveSk7Ci0JaWYgKCh4ID09IC0xLjAgfHwgeSA9PSAtMS4wKSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gTlVMTDsKLQkvKiBoeXBvdCh4LCArLy1JbmYpIHJldHVybnMgSW5mLCBldmVuIGlmIHggaXMgYSBOYU4uICovCi0JaWYgKFB5X0lTX0lORklOSVRZKHgpKQotCQlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKGZhYnMoeCkpOwotCWlmIChQeV9JU19JTkZJTklUWSh5KSkKLQkJcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShmYWJzKHkpKTsKLQllcnJubyA9IDA7Ci0JUHlGUEVfU1RBUlRfUFJPVEVDVCgiaW4gbWF0aF9oeXBvdCIsIHJldHVybiAwKTsKLQlyID0gaHlwb3QoeCwgeSk7Ci0JUHlGUEVfRU5EX1BST1RFQ1Qocik7Ci0JaWYgKFB5X0lTX05BTihyKSkgewotCQlpZiAoIVB5X0lTX05BTih4KSAmJiAhUHlfSVNfTkFOKHkpKQotCQkJZXJybm8gPSBFRE9NOwotCQllbHNlCi0JCQllcnJubyA9IDA7Ci0JfQotCWVsc2UgaWYgKFB5X0lTX0lORklOSVRZKHIpKSB7Ci0JCWlmIChQeV9JU19GSU5JVEUoeCkgJiYgUHlfSVNfRklOSVRFKHkpKQotCQkJZXJybm8gPSBFUkFOR0U7Ci0JCWVsc2UKLQkJCWVycm5vID0gMDsKLQl9Ci0JaWYgKGVycm5vICYmIGlzX2Vycm9yKHIpKQotCQlyZXR1cm4gTlVMTDsKLQllbHNlCi0JCXJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUocik7CisgICAgUHlPYmplY3QgKm94LCAqb3k7CisgICAgZG91YmxlIHIsIHgsIHk7CisgICAgaWYgKCEgUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImh5cG90IiwgMiwgMiwgJm94LCAmb3kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB4ID0gUHlGbG9hdF9Bc0RvdWJsZShveCk7CisgICAgeSA9IFB5RmxvYXRfQXNEb3VibGUob3kpOworICAgIGlmICgoeCA9PSAtMS4wIHx8IHkgPT0gLTEuMCkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgLyogaHlwb3QoeCwgKy8tSW5mKSByZXR1cm5zIEluZiwgZXZlbiBpZiB4IGlzIGEgTmFOLiAqLworICAgIGlmIChQeV9JU19JTkZJTklUWSh4KSkKKyAgICAgICAgcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShmYWJzKHgpKTsKKyAgICBpZiAoUHlfSVNfSU5GSU5JVFkoeSkpCisgICAgICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoZmFicyh5KSk7CisgICAgZXJybm8gPSAwOworICAgIFB5RlBFX1NUQVJUX1BST1RFQ1QoImluIG1hdGhfaHlwb3QiLCByZXR1cm4gMCk7CisgICAgciA9IGh5cG90KHgsIHkpOworICAgIFB5RlBFX0VORF9QUk9URUNUKHIpOworICAgIGlmIChQeV9JU19OQU4ocikpIHsKKyAgICAgICAgaWYgKCFQeV9JU19OQU4oeCkgJiYgIVB5X0lTX05BTih5KSkKKyAgICAgICAgICAgIGVycm5vID0gRURPTTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZXJybm8gPSAwOworICAgIH0KKyAgICBlbHNlIGlmIChQeV9JU19JTkZJTklUWShyKSkgeworICAgICAgICBpZiAoUHlfSVNfRklOSVRFKHgpICYmIFB5X0lTX0ZJTklURSh5KSkKKyAgICAgICAgICAgIGVycm5vID0gRVJBTkdFOworICAgICAgICBlbHNlCisgICAgICAgICAgICBlcnJubyA9IDA7CisgICAgfQorICAgIGlmIChlcnJubyAmJiBpc19lcnJvcihyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKHIpOwogfQogCiBQeURvY19TVFJWQVIobWF0aF9oeXBvdF9kb2MsCkBAIC05MjgsNzkgKzkyOCw3OSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIG1hdGhfcG93KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqb3gsICpveTsKLQlkb3VibGUgciwgeCwgeTsKLQlpbnQgb2RkX3k7CisgICAgUHlPYmplY3QgKm94LCAqb3k7CisgICAgZG91YmxlIHIsIHgsIHk7CisgICAgaW50IG9kZF95OwogCi0JaWYgKCEgUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInBvdyIsIDIsIDIsICZveCwgJm95KSkKLQkJcmV0dXJuIE5VTEw7Ci0JeCA9IFB5RmxvYXRfQXNEb3VibGUob3gpOwotCXkgPSBQeUZsb2F0X0FzRG91YmxlKG95KTsKLQlpZiAoKHggPT0gLTEuMCB8fCB5ID09IC0xLjApICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghIFB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJwb3ciLCAyLCAyLCAmb3gsICZveSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHggPSBQeUZsb2F0X0FzRG91YmxlKG94KTsKKyAgICB5ID0gUHlGbG9hdF9Bc0RvdWJsZShveSk7CisgICAgaWYgKCh4ID09IC0xLjAgfHwgeSA9PSAtMS4wKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCS8qIGRlYWwgZGlyZWN0bHkgd2l0aCBJRUVFIHNwZWNpYWxzLCB0byBjb3BlIHdpdGggcHJvYmxlbXMgb24gdmFyaW91cwotCSAgIHBsYXRmb3JtcyB3aG9zZSBzZW1hbnRpY3MgZG9uJ3QgZXhhY3RseSBtYXRjaCBDOTkgKi8KLQlyID0gMC47IC8qIHNpbGVuY2UgY29tcGlsZXIgd2FybmluZyAqLwotCWlmICghUHlfSVNfRklOSVRFKHgpIHx8ICFQeV9JU19GSU5JVEUoeSkpIHsKLQkJZXJybm8gPSAwOwotCQlpZiAoUHlfSVNfTkFOKHgpKQotCQkJciA9IHkgPT0gMC4gPyAxLiA6IHg7IC8qIE5hTioqMCA9IDEgKi8KLQkJZWxzZSBpZiAoUHlfSVNfTkFOKHkpKQotCQkJciA9IHggPT0gMS4gPyAxLiA6IHk7IC8qIDEqKk5hTiA9IDEgKi8KLQkJZWxzZSBpZiAoUHlfSVNfSU5GSU5JVFkoeCkpIHsKLQkJCW9kZF95ID0gUHlfSVNfRklOSVRFKHkpICYmIGZtb2QoZmFicyh5KSwgMi4wKSA9PSAxLjA7Ci0JCQlpZiAoeSA+IDAuKQotCQkJCXIgPSBvZGRfeSA/IHggOiBmYWJzKHgpOwotCQkJZWxzZSBpZiAoeSA9PSAwLikKLQkJCQlyID0gMS47Ci0JCQllbHNlIC8qIHkgPCAwLiAqLwotCQkJCXIgPSBvZGRfeSA/IGNvcHlzaWduKDAuLCB4KSA6IDAuOwotCQl9Ci0JCWVsc2UgaWYgKFB5X0lTX0lORklOSVRZKHkpKSB7Ci0JCQlpZiAoZmFicyh4KSA9PSAxLjApCi0JCQkJciA9IDEuOwotCQkJZWxzZSBpZiAoeSA+IDAuICYmIGZhYnMoeCkgPiAxLjApCi0JCQkJciA9IHk7Ci0JCQllbHNlIGlmICh5IDwgMC4gJiYgZmFicyh4KSA8IDEuMCkgewotCQkJCXIgPSAteTsgLyogcmVzdWx0IGlzICtpbmYgKi8KLQkJCQlpZiAoeCA9PSAwLikgLyogMCoqLWluZjogZGl2aWRlLWJ5LXplcm8gKi8KLQkJCQkJZXJybm8gPSBFRE9NOwotCQkJfQotCQkJZWxzZQotCQkJCXIgPSAwLjsKLQkJfQotCX0KLQllbHNlIHsKLQkJLyogbGV0IGxpYm0gaGFuZGxlIGZpbml0ZSoqZmluaXRlICovCi0JCWVycm5vID0gMDsKLQkJUHlGUEVfU1RBUlRfUFJPVEVDVCgiaW4gbWF0aF9wb3ciLCByZXR1cm4gMCk7Ci0JCXIgPSBwb3coeCwgeSk7Ci0JCVB5RlBFX0VORF9QUk9URUNUKHIpOwotCQkvKiBhIE5hTiByZXN1bHQgc2hvdWxkIGFyaXNlIG9ubHkgZnJvbSAoLXZlKSoqKGZpbml0ZQotCQkgICBub24taW50ZWdlcik7IGluIHRoaXMgY2FzZSB3ZSB3YW50IHRvIHJhaXNlIFZhbHVlRXJyb3IuICovCi0JCWlmICghUHlfSVNfRklOSVRFKHIpKSB7Ci0JCQlpZiAoUHlfSVNfTkFOKHIpKSB7Ci0JCQkJZXJybm8gPSBFRE9NOwotCQkJfQotCQkJLyogCi0JCQkgICBhbiBpbmZpbml0ZSByZXN1bHQgaGVyZSBhcmlzZXMgZWl0aGVyIGZyb206Ci0JCQkgICAoQSkgKCsvLTAuKSoqbmVnYXRpdmUgKC0+IGRpdmlkZS1ieS16ZXJvKQotCQkJICAgKEIpIG92ZXJmbG93IG9mIHgqKnkgd2l0aCB4IGFuZCB5IGZpbml0ZQotCQkJKi8KLQkJCWVsc2UgaWYgKFB5X0lTX0lORklOSVRZKHIpKSB7Ci0JCQkJaWYgKHggPT0gMC4pCi0JCQkJCWVycm5vID0gRURPTTsKLQkJCQllbHNlCi0JCQkJCWVycm5vID0gRVJBTkdFOwotCQkJfQotCQl9Ci0JfQorICAgIC8qIGRlYWwgZGlyZWN0bHkgd2l0aCBJRUVFIHNwZWNpYWxzLCB0byBjb3BlIHdpdGggcHJvYmxlbXMgb24gdmFyaW91cworICAgICAgIHBsYXRmb3JtcyB3aG9zZSBzZW1hbnRpY3MgZG9uJ3QgZXhhY3RseSBtYXRjaCBDOTkgKi8KKyAgICByID0gMC47IC8qIHNpbGVuY2UgY29tcGlsZXIgd2FybmluZyAqLworICAgIGlmICghUHlfSVNfRklOSVRFKHgpIHx8ICFQeV9JU19GSU5JVEUoeSkpIHsKKyAgICAgICAgZXJybm8gPSAwOworICAgICAgICBpZiAoUHlfSVNfTkFOKHgpKQorICAgICAgICAgICAgciA9IHkgPT0gMC4gPyAxLiA6IHg7IC8qIE5hTioqMCA9IDEgKi8KKyAgICAgICAgZWxzZSBpZiAoUHlfSVNfTkFOKHkpKQorICAgICAgICAgICAgciA9IHggPT0gMS4gPyAxLiA6IHk7IC8qIDEqKk5hTiA9IDEgKi8KKyAgICAgICAgZWxzZSBpZiAoUHlfSVNfSU5GSU5JVFkoeCkpIHsKKyAgICAgICAgICAgIG9kZF95ID0gUHlfSVNfRklOSVRFKHkpICYmIGZtb2QoZmFicyh5KSwgMi4wKSA9PSAxLjA7CisgICAgICAgICAgICBpZiAoeSA+IDAuKQorICAgICAgICAgICAgICAgIHIgPSBvZGRfeSA/IHggOiBmYWJzKHgpOworICAgICAgICAgICAgZWxzZSBpZiAoeSA9PSAwLikKKyAgICAgICAgICAgICAgICByID0gMS47CisgICAgICAgICAgICBlbHNlIC8qIHkgPCAwLiAqLworICAgICAgICAgICAgICAgIHIgPSBvZGRfeSA/IGNvcHlzaWduKDAuLCB4KSA6IDAuOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKFB5X0lTX0lORklOSVRZKHkpKSB7CisgICAgICAgICAgICBpZiAoZmFicyh4KSA9PSAxLjApCisgICAgICAgICAgICAgICAgciA9IDEuOworICAgICAgICAgICAgZWxzZSBpZiAoeSA+IDAuICYmIGZhYnMoeCkgPiAxLjApCisgICAgICAgICAgICAgICAgciA9IHk7CisgICAgICAgICAgICBlbHNlIGlmICh5IDwgMC4gJiYgZmFicyh4KSA8IDEuMCkgeworICAgICAgICAgICAgICAgIHIgPSAteTsgLyogcmVzdWx0IGlzICtpbmYgKi8KKyAgICAgICAgICAgICAgICBpZiAoeCA9PSAwLikgLyogMCoqLWluZjogZGl2aWRlLWJ5LXplcm8gKi8KKyAgICAgICAgICAgICAgICAgICAgZXJybm8gPSBFRE9NOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHIgPSAwLjsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLyogbGV0IGxpYm0gaGFuZGxlIGZpbml0ZSoqZmluaXRlICovCisgICAgICAgIGVycm5vID0gMDsKKyAgICAgICAgUHlGUEVfU1RBUlRfUFJPVEVDVCgiaW4gbWF0aF9wb3ciLCByZXR1cm4gMCk7CisgICAgICAgIHIgPSBwb3coeCwgeSk7CisgICAgICAgIFB5RlBFX0VORF9QUk9URUNUKHIpOworICAgICAgICAvKiBhIE5hTiByZXN1bHQgc2hvdWxkIGFyaXNlIG9ubHkgZnJvbSAoLXZlKSoqKGZpbml0ZQorICAgICAgICAgICBub24taW50ZWdlcik7IGluIHRoaXMgY2FzZSB3ZSB3YW50IHRvIHJhaXNlIFZhbHVlRXJyb3IuICovCisgICAgICAgIGlmICghUHlfSVNfRklOSVRFKHIpKSB7CisgICAgICAgICAgICBpZiAoUHlfSVNfTkFOKHIpKSB7CisgICAgICAgICAgICAgICAgZXJybm8gPSBFRE9NOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgIGFuIGluZmluaXRlIHJlc3VsdCBoZXJlIGFyaXNlcyBlaXRoZXIgZnJvbToKKyAgICAgICAgICAgICAgIChBKSAoKy8tMC4pKipuZWdhdGl2ZSAoLT4gZGl2aWRlLWJ5LXplcm8pCisgICAgICAgICAgICAgICAoQikgb3ZlcmZsb3cgb2YgeCoqeSB3aXRoIHggYW5kIHkgZmluaXRlCisgICAgICAgICAgICAqLworICAgICAgICAgICAgZWxzZSBpZiAoUHlfSVNfSU5GSU5JVFkocikpIHsKKyAgICAgICAgICAgICAgICBpZiAoeCA9PSAwLikKKyAgICAgICAgICAgICAgICAgICAgZXJybm8gPSBFRE9NOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgZXJybm8gPSBFUkFOR0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAKLQlpZiAoZXJybm8gJiYgaXNfZXJyb3IocikpCi0JCXJldHVybiBOVUxMOwotCWVsc2UKLQkJcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShyKTsKKyAgICBpZiAoZXJybm8gJiYgaXNfZXJyb3IocikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShyKTsKIH0KIAogUHlEb2NfU1RSVkFSKG1hdGhfcG93X2RvYywKQEAgLTEwMTIsMTAgKzEwMTIsMTAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBtYXRoX2RlZ3JlZXMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmcpCiB7Ci0JZG91YmxlIHggPSBQeUZsb2F0X0FzRG91YmxlKGFyZyk7Ci0JaWYgKHggPT0gLTEuMCAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKHggKiByYWRUb0RlZyk7CisgICAgZG91YmxlIHggPSBQeUZsb2F0X0FzRG91YmxlKGFyZyk7CisgICAgaWYgKHggPT0gLTEuMCAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKHggKiByYWRUb0RlZyk7CiB9CiAKIFB5RG9jX1NUUlZBUihtYXRoX2RlZ3JlZXNfZG9jLApAQCAtMTAyNSwxMCArMTAyNSwxMCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIG1hdGhfcmFkaWFucyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZykKIHsKLQlkb3VibGUgeCA9IFB5RmxvYXRfQXNEb3VibGUoYXJnKTsKLQlpZiAoeCA9PSAtMS4wICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoeCAqIGRlZ1RvUmFkKTsKKyAgICBkb3VibGUgeCA9IFB5RmxvYXRfQXNEb3VibGUoYXJnKTsKKyAgICBpZiAoeCA9PSAtMS4wICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoeCAqIGRlZ1RvUmFkKTsKIH0KIAogUHlEb2NfU1RSVkFSKG1hdGhfcmFkaWFuc19kb2MsCkBAIC0xMDM4LDEwICsxMDM4LDEwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogbWF0aF9pc25hbihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZykKIHsKLQlkb3VibGUgeCA9IFB5RmxvYXRfQXNEb3VibGUoYXJnKTsKLQlpZiAoeCA9PSAtMS4wICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBQeUJvb2xfRnJvbUxvbmcoKGxvbmcpUHlfSVNfTkFOKHgpKTsKKyAgICBkb3VibGUgeCA9IFB5RmxvYXRfQXNEb3VibGUoYXJnKTsKKyAgICBpZiAoeCA9PSAtMS4wICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoKGxvbmcpUHlfSVNfTkFOKHgpKTsKIH0KIAogUHlEb2NfU1RSVkFSKG1hdGhfaXNuYW5fZG9jLApAQCAtMTA1MSwxMCArMTA1MSwxMCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIG1hdGhfaXNpbmYoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmcpCiB7Ci0JZG91YmxlIHggPSBQeUZsb2F0X0FzRG91YmxlKGFyZyk7Ci0JaWYgKHggPT0gLTEuMCAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKChsb25nKVB5X0lTX0lORklOSVRZKHgpKTsKKyAgICBkb3VibGUgeCA9IFB5RmxvYXRfQXNEb3VibGUoYXJnKTsKKyAgICBpZiAoeCA9PSAtMS4wICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoKGxvbmcpUHlfSVNfSU5GSU5JVFkoeCkpOwogfQogCiBQeURvY19TVFJWQVIobWF0aF9pc2luZl9kb2MsCkBAIC0xMDYyLDQyICsxMDYyLDQyIEBACiBDaGVjayBpZiBmbG9hdCB4IGlzIGluZmluaXRlIChwb3NpdGl2ZSBvciBuZWdhdGl2ZSkuIik7CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBtYXRoX21ldGhvZHNbXSA9IHsKLQl7ImFjb3MiLAltYXRoX2Fjb3MsCU1FVEhfTywJCW1hdGhfYWNvc19kb2N9LAotCXsiYWNvc2giLAltYXRoX2Fjb3NoLAlNRVRIX08sCQltYXRoX2Fjb3NoX2RvY30sCi0JeyJhc2luIiwJbWF0aF9hc2luLAlNRVRIX08sCQltYXRoX2FzaW5fZG9jfSwKLQl7ImFzaW5oIiwJbWF0aF9hc2luaCwJTUVUSF9PLAkJbWF0aF9hc2luaF9kb2N9LAotCXsiYXRhbiIsCW1hdGhfYXRhbiwJTUVUSF9PLAkJbWF0aF9hdGFuX2RvY30sCi0JeyJhdGFuMiIsCW1hdGhfYXRhbjIsCU1FVEhfVkFSQVJHUywJbWF0aF9hdGFuMl9kb2N9LAotCXsiYXRhbmgiLAltYXRoX2F0YW5oLAlNRVRIX08sCQltYXRoX2F0YW5oX2RvY30sCi0JeyJjZWlsIiwJbWF0aF9jZWlsLAlNRVRIX08sCQltYXRoX2NlaWxfZG9jfSwKLQl7ImNvcHlzaWduIiwJbWF0aF9jb3B5c2lnbiwJTUVUSF9WQVJBUkdTLAltYXRoX2NvcHlzaWduX2RvY30sCi0JeyJjb3MiLAkJbWF0aF9jb3MsCU1FVEhfTywJCW1hdGhfY29zX2RvY30sCi0JeyJjb3NoIiwJbWF0aF9jb3NoLAlNRVRIX08sCQltYXRoX2Nvc2hfZG9jfSwKLQl7ImRlZ3JlZXMiLAltYXRoX2RlZ3JlZXMsCU1FVEhfTywJCW1hdGhfZGVncmVlc19kb2N9LAotCXsiZXhwIiwJCW1hdGhfZXhwLAlNRVRIX08sCQltYXRoX2V4cF9kb2N9LAotCXsiZmFicyIsCW1hdGhfZmFicywJTUVUSF9PLAkJbWF0aF9mYWJzX2RvY30sCi0JeyJmYWN0b3JpYWwiLAltYXRoX2ZhY3RvcmlhbCwJTUVUSF9PLAkJbWF0aF9mYWN0b3JpYWxfZG9jfSwKLQl7ImZsb29yIiwJbWF0aF9mbG9vciwJTUVUSF9PLAkJbWF0aF9mbG9vcl9kb2N9LAotCXsiZm1vZCIsCW1hdGhfZm1vZCwJTUVUSF9WQVJBUkdTLAltYXRoX2Ztb2RfZG9jfSwKLQl7ImZyZXhwIiwJbWF0aF9mcmV4cCwJTUVUSF9PLAkJbWF0aF9mcmV4cF9kb2N9LAotCXsiZnN1bSIsCW1hdGhfZnN1bSwJTUVUSF9PLAkJbWF0aF9mc3VtX2RvY30sCi0JeyJoeXBvdCIsCW1hdGhfaHlwb3QsCU1FVEhfVkFSQVJHUywJbWF0aF9oeXBvdF9kb2N9LAotCXsiaXNpbmYiLAltYXRoX2lzaW5mLAlNRVRIX08sCQltYXRoX2lzaW5mX2RvY30sCi0JeyJpc25hbiIsCW1hdGhfaXNuYW4sCU1FVEhfTywJCW1hdGhfaXNuYW5fZG9jfSwKLQl7ImxkZXhwIiwJbWF0aF9sZGV4cCwJTUVUSF9WQVJBUkdTLAltYXRoX2xkZXhwX2RvY30sCi0JeyJsb2ciLAkJbWF0aF9sb2csCU1FVEhfVkFSQVJHUywJbWF0aF9sb2dfZG9jfSwKLQl7ImxvZzFwIiwJbWF0aF9sb2cxcCwJTUVUSF9PLAkJbWF0aF9sb2cxcF9kb2N9LAotCXsibG9nMTAiLAltYXRoX2xvZzEwLAlNRVRIX08sCQltYXRoX2xvZzEwX2RvY30sCi0JeyJtb2RmIiwJbWF0aF9tb2RmLAlNRVRIX08sCQltYXRoX21vZGZfZG9jfSwKLQl7InBvdyIsCQltYXRoX3BvdywJTUVUSF9WQVJBUkdTLAltYXRoX3Bvd19kb2N9LAotCXsicmFkaWFucyIsCW1hdGhfcmFkaWFucywJTUVUSF9PLAkJbWF0aF9yYWRpYW5zX2RvY30sCi0JeyJzaW4iLAkJbWF0aF9zaW4sCU1FVEhfTywJCW1hdGhfc2luX2RvY30sCi0JeyJzaW5oIiwJbWF0aF9zaW5oLAlNRVRIX08sCQltYXRoX3NpbmhfZG9jfSwKLQl7InNxcnQiLAltYXRoX3NxcnQsCU1FVEhfTywJCW1hdGhfc3FydF9kb2N9LAotCXsidGFuIiwJCW1hdGhfdGFuLAlNRVRIX08sCQltYXRoX3Rhbl9kb2N9LAotCXsidGFuaCIsCW1hdGhfdGFuaCwJTUVUSF9PLAkJbWF0aF90YW5oX2RvY30sCi0JeyJ0cnVuYyIsCW1hdGhfdHJ1bmMsCU1FVEhfTywJCW1hdGhfdHJ1bmNfZG9jfSwKLQl7TlVMTCwJCU5VTEx9CQkvKiBzZW50aW5lbCAqLworICAgIHsiYWNvcyIsICAgICAgICAgICAgbWF0aF9hY29zLCAgICAgIE1FVEhfTywgICAgICAgICBtYXRoX2Fjb3NfZG9jfSwKKyAgICB7ImFjb3NoIiwgICAgICAgICAgIG1hdGhfYWNvc2gsICAgICBNRVRIX08sICAgICAgICAgbWF0aF9hY29zaF9kb2N9LAorICAgIHsiYXNpbiIsICAgICAgICAgICAgbWF0aF9hc2luLCAgICAgIE1FVEhfTywgICAgICAgICBtYXRoX2FzaW5fZG9jfSwKKyAgICB7ImFzaW5oIiwgICAgICAgICAgIG1hdGhfYXNpbmgsICAgICBNRVRIX08sICAgICAgICAgbWF0aF9hc2luaF9kb2N9LAorICAgIHsiYXRhbiIsICAgICAgICAgICAgbWF0aF9hdGFuLCAgICAgIE1FVEhfTywgICAgICAgICBtYXRoX2F0YW5fZG9jfSwKKyAgICB7ImF0YW4yIiwgICAgICAgICAgIG1hdGhfYXRhbjIsICAgICBNRVRIX1ZBUkFSR1MsICAgbWF0aF9hdGFuMl9kb2N9LAorICAgIHsiYXRhbmgiLCAgICAgICAgICAgbWF0aF9hdGFuaCwgICAgIE1FVEhfTywgICAgICAgICBtYXRoX2F0YW5oX2RvY30sCisgICAgeyJjZWlsIiwgICAgICAgICAgICBtYXRoX2NlaWwsICAgICAgTUVUSF9PLCAgICAgICAgIG1hdGhfY2VpbF9kb2N9LAorICAgIHsiY29weXNpZ24iLCAgICAgICAgbWF0aF9jb3B5c2lnbiwgIE1FVEhfVkFSQVJHUywgICBtYXRoX2NvcHlzaWduX2RvY30sCisgICAgeyJjb3MiLCAgICAgICAgICAgICBtYXRoX2NvcywgICAgICAgTUVUSF9PLCAgICAgICAgIG1hdGhfY29zX2RvY30sCisgICAgeyJjb3NoIiwgICAgICAgICAgICBtYXRoX2Nvc2gsICAgICAgTUVUSF9PLCAgICAgICAgIG1hdGhfY29zaF9kb2N9LAorICAgIHsiZGVncmVlcyIsICAgICAgICAgbWF0aF9kZWdyZWVzLCAgIE1FVEhfTywgICAgICAgICBtYXRoX2RlZ3JlZXNfZG9jfSwKKyAgICB7ImV4cCIsICAgICAgICAgICAgIG1hdGhfZXhwLCAgICAgICBNRVRIX08sICAgICAgICAgbWF0aF9leHBfZG9jfSwKKyAgICB7ImZhYnMiLCAgICAgICAgICAgIG1hdGhfZmFicywgICAgICBNRVRIX08sICAgICAgICAgbWF0aF9mYWJzX2RvY30sCisgICAgeyJmYWN0b3JpYWwiLCAgICAgICBtYXRoX2ZhY3RvcmlhbCwgTUVUSF9PLCAgICAgICAgIG1hdGhfZmFjdG9yaWFsX2RvY30sCisgICAgeyJmbG9vciIsICAgICAgICAgICBtYXRoX2Zsb29yLCAgICAgTUVUSF9PLCAgICAgICAgIG1hdGhfZmxvb3JfZG9jfSwKKyAgICB7ImZtb2QiLCAgICAgICAgICAgIG1hdGhfZm1vZCwgICAgICBNRVRIX1ZBUkFSR1MsICAgbWF0aF9mbW9kX2RvY30sCisgICAgeyJmcmV4cCIsICAgICAgICAgICBtYXRoX2ZyZXhwLCAgICAgTUVUSF9PLCAgICAgICAgIG1hdGhfZnJleHBfZG9jfSwKKyAgICB7ImZzdW0iLCAgICAgICAgICAgIG1hdGhfZnN1bSwgICAgICBNRVRIX08sICAgICAgICAgbWF0aF9mc3VtX2RvY30sCisgICAgeyJoeXBvdCIsICAgICAgICAgICBtYXRoX2h5cG90LCAgICAgTUVUSF9WQVJBUkdTLCAgIG1hdGhfaHlwb3RfZG9jfSwKKyAgICB7ImlzaW5mIiwgICAgICAgICAgIG1hdGhfaXNpbmYsICAgICBNRVRIX08sICAgICAgICAgbWF0aF9pc2luZl9kb2N9LAorICAgIHsiaXNuYW4iLCAgICAgICAgICAgbWF0aF9pc25hbiwgICAgIE1FVEhfTywgICAgICAgICBtYXRoX2lzbmFuX2RvY30sCisgICAgeyJsZGV4cCIsICAgICAgICAgICBtYXRoX2xkZXhwLCAgICAgTUVUSF9WQVJBUkdTLCAgIG1hdGhfbGRleHBfZG9jfSwKKyAgICB7ImxvZyIsICAgICAgICAgICAgIG1hdGhfbG9nLCAgICAgICBNRVRIX1ZBUkFSR1MsICAgbWF0aF9sb2dfZG9jfSwKKyAgICB7ImxvZzFwIiwgICAgICAgICAgIG1hdGhfbG9nMXAsICAgICBNRVRIX08sICAgICAgICAgbWF0aF9sb2cxcF9kb2N9LAorICAgIHsibG9nMTAiLCAgICAgICAgICAgbWF0aF9sb2cxMCwgICAgIE1FVEhfTywgICAgICAgICBtYXRoX2xvZzEwX2RvY30sCisgICAgeyJtb2RmIiwgICAgICAgICAgICBtYXRoX21vZGYsICAgICAgTUVUSF9PLCAgICAgICAgIG1hdGhfbW9kZl9kb2N9LAorICAgIHsicG93IiwgICAgICAgICAgICAgbWF0aF9wb3csICAgICAgIE1FVEhfVkFSQVJHUywgICBtYXRoX3Bvd19kb2N9LAorICAgIHsicmFkaWFucyIsICAgICAgICAgbWF0aF9yYWRpYW5zLCAgIE1FVEhfTywgICAgICAgICBtYXRoX3JhZGlhbnNfZG9jfSwKKyAgICB7InNpbiIsICAgICAgICAgICAgIG1hdGhfc2luLCAgICAgICBNRVRIX08sICAgICAgICAgbWF0aF9zaW5fZG9jfSwKKyAgICB7InNpbmgiLCAgICAgICAgICAgIG1hdGhfc2luaCwgICAgICBNRVRIX08sICAgICAgICAgbWF0aF9zaW5oX2RvY30sCisgICAgeyJzcXJ0IiwgICAgICAgICAgICBtYXRoX3NxcnQsICAgICAgTUVUSF9PLCAgICAgICAgIG1hdGhfc3FydF9kb2N9LAorICAgIHsidGFuIiwgICAgICAgICAgICAgbWF0aF90YW4sICAgICAgIE1FVEhfTywgICAgICAgICBtYXRoX3Rhbl9kb2N9LAorICAgIHsidGFuaCIsICAgICAgICAgICAgbWF0aF90YW5oLCAgICAgIE1FVEhfTywgICAgICAgICBtYXRoX3RhbmhfZG9jfSwKKyAgICB7InRydW5jIiwgICAgICAgICAgIG1hdGhfdHJ1bmMsICAgICBNRVRIX08sICAgICAgICAgbWF0aF90cnVuY19kb2N9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiAKQEAgLTExMDgsMTUgKzExMDgsMTUgQEAKIFB5TU9ESU5JVF9GVU5DCiBpbml0bWF0aCh2b2lkKQogewotCVB5T2JqZWN0ICptOworICAgIFB5T2JqZWN0ICptOwogCi0JbSA9IFB5X0luaXRNb2R1bGUzKCJtYXRoIiwgbWF0aF9tZXRob2RzLCBtb2R1bGVfZG9jKTsKLQlpZiAobSA9PSBOVUxMKQotCQlnb3RvIGZpbmFsbHk7CisgICAgbSA9IFB5X0luaXRNb2R1bGUzKCJtYXRoIiwgbWF0aF9tZXRob2RzLCBtb2R1bGVfZG9jKTsKKyAgICBpZiAobSA9PSBOVUxMKQorICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgInBpIiwgUHlGbG9hdF9Gcm9tRG91YmxlKFB5X01BVEhfUEkpKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgImUiLCBQeUZsb2F0X0Zyb21Eb3VibGUoUHlfTUFUSF9FKSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJwaSIsIFB5RmxvYXRfRnJvbURvdWJsZShQeV9NQVRIX1BJKSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJlIiwgUHlGbG9hdF9Gcm9tRG91YmxlKFB5X01BVEhfRSkpOwogCiAgICAgZmluYWxseToKLQlyZXR1cm47CisgICAgcmV0dXJuOwogfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9tZDUuYyBiL01vZHVsZXMvbWQ1LmMKaW5kZXggMGUxMDU4Zi4uOTgyZmQ3ZiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9tZDUuYworKysgYi9Nb2R1bGVzL21kNS5jCkBAIC0yNyw3ICsyNyw3IEBACiAKICAgVGhpcyBjb2RlIGltcGxlbWVudHMgdGhlIE1ENSBBbGdvcml0aG0gZGVmaW5lZCBpbiBSRkMgMTMyMSwgd2hvc2UKICAgdGV4dCBpcyBhdmFpbGFibGUgYXQKLQlodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMxMzIxLnR4dAorICAgICAgICBodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMxMzIxLnR4dAogICBUaGUgY29kZSBpcyBkZXJpdmVkIGZyb20gdGhlIHRleHQgb2YgdGhlIFJGQywgaW5jbHVkaW5nIHRoZSB0ZXN0IHN1aXRlCiAgIChzZWN0aW9uIEEuNSkgYnV0IGV4Y2x1ZGluZyB0aGUgcmVzdCBvZiBBcHBlbmRpeCBBLiAgSXQgZG9lcyBub3QgaW5jbHVkZQogICBhbnkgY29kZSBvciBkb2N1bWVudGF0aW9uIHRoYXQgaXMgaWRlbnRpZmllZCBpbiB0aGUgUkZDIGFzIGJlaW5nCkBAIC0zOCwxNCArMzgsMTQgQEAKICAgdGhhdCBmb2xsb3dzIChpbiByZXZlcnNlIGNocm9ub2xvZ2ljYWwgb3JkZXIpOgogCiAgIDIwMDItMDQtMTMgbHBkIENsYXJpZmllZCBkZXJpdmF0aW9uIGZyb20gUkZDIDEzMjE7IG5vdyBoYW5kbGVzIGJ5dGUgb3JkZXIKLQllaXRoZXIgc3RhdGljYWxseSBvciBkeW5hbWljYWxseTsgYWRkZWQgbWlzc2luZyAjaW5jbHVkZSA8c3RyaW5nLmg+Ci0JaW4gbGlicmFyeS4KKyAgICAgICAgZWl0aGVyIHN0YXRpY2FsbHkgb3IgZHluYW1pY2FsbHk7IGFkZGVkIG1pc3NpbmcgI2luY2x1ZGUgPHN0cmluZy5oPgorICAgICAgICBpbiBsaWJyYXJ5LgogICAyMDAyLTAzLTExIGxwZCBDb3JyZWN0ZWQgYXJndW1lbnQgbGlzdCBmb3IgbWFpbigpLCBhbmQgYWRkZWQgaW50IHJldHVybgotCXR5cGUsIGluIHRlc3QgcHJvZ3JhbSBhbmQgVCB2YWx1ZSBwcm9ncmFtLgorICAgICAgICB0eXBlLCBpbiB0ZXN0IHByb2dyYW0gYW5kIFQgdmFsdWUgcHJvZ3JhbS4KICAgMjAwMi0wMi0yMSBscGQgQWRkZWQgbWlzc2luZyAjaW5jbHVkZSA8c3RkaW8uaD4gaW4gdGVzdCBwcm9ncmFtLgogICAyMDAwLTA3LTAzIGxwZCBQYXRjaGVkIHRvIGVsaW1pbmF0ZSB3YXJuaW5ncyBhYm91dCAiY29uc3RhbnQgaXMKLQl1bnNpZ25lZCBpbiBBTlNJIEMsIHNpZ25lZCBpbiB0cmFkaXRpb25hbCI7IG1hZGUgdGVzdCBwcm9ncmFtCi0Jc2VsZi1jaGVja2luZy4KKyAgICAgICAgdW5zaWduZWQgaW4gQU5TSSBDLCBzaWduZWQgaW4gdHJhZGl0aW9uYWwiOyBtYWRlIHRlc3QgcHJvZ3JhbQorICAgICAgICBzZWxmLWNoZWNraW5nLgogICAxOTk5LTExLTA0IGxwZCBFZGl0ZWQgY29tbWVudHMgc2xpZ2h0bHkgZm9yIGF1dG9tYXRpYyBUT0MgZXh0cmFjdGlvbi4KICAgMTk5OS0xMC0xOCBscGQgRml4ZWQgdHlwbyBpbiBoZWFkZXIgY29tbWVudCAoYW5zaTJrbnIgcmF0aGVyIHRoYW4gbWQ1KS4KICAgMTk5OS0wNS0wMyBscGQgT3JpZ2luYWwgdmVyc2lvbi4KQEAgLTU1LDcgKzU1LDcgQEAKICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxsaW1pdHMuaD4KIAotI3VuZGVmIEJZVEVfT1JERVIJLyogMSA9IGJpZy1lbmRpYW4sIC0xID0gbGl0dGxlLWVuZGlhbiwgMCA9IHVua25vd24gKi8KKyN1bmRlZiBCWVRFX09SREVSICAgICAgIC8qIDEgPSBiaWctZW5kaWFuLCAtMSA9IGxpdHRsZS1lbmRpYW4sIDAgPSB1bmtub3duICovCiAjaWZkZWYgQVJDSF9JU19CSUdfRU5ESUFOCiAjICBkZWZpbmUgQllURV9PUkRFUiAoQVJDSF9JU19CSUdfRU5ESUFOID8gMSA6IC0xKQogI2Vsc2UKQEAgLTEzMyw4ICsxMzMsOCBAQAogbWQ1X3Byb2Nlc3MobWQ1X3N0YXRlX3QgKnBtcywgY29uc3QgbWQ1X2J5dGVfdCAqZGF0YSAvKls2NF0qLykKIHsKICAgICBtZDVfd29yZF90Ci0JYSA9IHBtcy0+YWJjZFswXSwgYiA9IHBtcy0+YWJjZFsxXSwKLQljID0gcG1zLT5hYmNkWzJdLCBkID0gcG1zLT5hYmNkWzNdOworICAgICAgICBhID0gcG1zLT5hYmNkWzBdLCBiID0gcG1zLT5hYmNkWzFdLAorICAgICAgICBjID0gcG1zLT5hYmNkWzJdLCBkID0gcG1zLT5hYmNkWzNdOwogICAgIG1kNV93b3JkX3QgdDsKICNpZiBCWVRFX09SREVSID4gMAogICAgIC8qIERlZmluZSBzdG9yYWdlIG9ubHkgZm9yIGJpZy1lbmRpYW4gQ1BVcy4gKi8KQEAgLTE0Nyw1MSArMTQ3LDUxIEBACiAKICAgICB7CiAjaWYgQllURV9PUkRFUiA9PSAwCi0JLyoKLQkgKiBEZXRlcm1pbmUgZHluYW1pY2FsbHkgd2hldGhlciB0aGlzIGlzIGEgYmlnLWVuZGlhbiBvcgotCSAqIGxpdHRsZS1lbmRpYW4gbWFjaGluZSwgc2luY2Ugd2UgY2FuIHVzZSBhIG1vcmUgZWZmaWNpZW50Ci0JICogYWxnb3JpdGhtIG9uIHRoZSBsYXR0ZXIuCi0JICovCi0Jc3RhdGljIGNvbnN0IGludCB3ID0gMTsKKyAgICAgICAgLyoKKyAgICAgICAgICogRGV0ZXJtaW5lIGR5bmFtaWNhbGx5IHdoZXRoZXIgdGhpcyBpcyBhIGJpZy1lbmRpYW4gb3IKKyAgICAgICAgICogbGl0dGxlLWVuZGlhbiBtYWNoaW5lLCBzaW5jZSB3ZSBjYW4gdXNlIGEgbW9yZSBlZmZpY2llbnQKKyAgICAgICAgICogYWxnb3JpdGhtIG9uIHRoZSBsYXR0ZXIuCisgICAgICAgICAqLworICAgICAgICBzdGF0aWMgY29uc3QgaW50IHcgPSAxOwogCi0JaWYgKCooKGNvbnN0IG1kNV9ieXRlX3QgKikmdykpIC8qIGR5bmFtaWMgbGl0dGxlLWVuZGlhbiAqLworICAgICAgICBpZiAoKigoY29uc3QgbWQ1X2J5dGVfdCAqKSZ3KSkgLyogZHluYW1pYyBsaXR0bGUtZW5kaWFuICovCiAjZW5kaWYKLSNpZiBCWVRFX09SREVSIDw9IDAJCS8qIGxpdHRsZS1lbmRpYW4gKi8KLQl7Ci0JICAgIC8qCi0JICAgICAqIE9uIGxpdHRsZS1lbmRpYW4gbWFjaGluZXMsIHdlIGNhbiBwcm9jZXNzIHByb3Blcmx5IGFsaWduZWQKLQkgICAgICogZGF0YSB3aXRob3V0IGNvcHlpbmcgaXQuCi0JICAgICAqLwotCSAgICBpZiAoISgoZGF0YSAtIChjb25zdCBtZDVfYnl0ZV90ICopMCkgJiAzKSkgewotCQkvKiBkYXRhIGFyZSBwcm9wZXJseSBhbGlnbmVkICovCi0JCVggPSAoY29uc3QgbWQ1X3dvcmRfdCAqKWRhdGE7Ci0JICAgIH0gZWxzZSB7Ci0JCS8qIG5vdCBhbGlnbmVkICovCi0JCW1lbWNweSh4YnVmLCBkYXRhLCA2NCk7Ci0JCVggPSB4YnVmOwotCSAgICB9Ci0JfQorI2lmIEJZVEVfT1JERVIgPD0gMCAgICAgICAgICAgICAvKiBsaXR0bGUtZW5kaWFuICovCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBPbiBsaXR0bGUtZW5kaWFuIG1hY2hpbmVzLCB3ZSBjYW4gcHJvY2VzcyBwcm9wZXJseSBhbGlnbmVkCisgICAgICAgICAgICAgKiBkYXRhIHdpdGhvdXQgY29weWluZyBpdC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKCEoKGRhdGEgLSAoY29uc3QgbWQ1X2J5dGVfdCAqKTApICYgMykpIHsKKyAgICAgICAgICAgICAgICAvKiBkYXRhIGFyZSBwcm9wZXJseSBhbGlnbmVkICovCisgICAgICAgICAgICAgICAgWCA9IChjb25zdCBtZDVfd29yZF90ICopZGF0YTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyogbm90IGFsaWduZWQgKi8KKyAgICAgICAgICAgICAgICBtZW1jcHkoeGJ1ZiwgZGF0YSwgNjQpOworICAgICAgICAgICAgICAgIFggPSB4YnVmOworICAgICAgICAgICAgfQorICAgICAgICB9CiAjZW5kaWYKICNpZiBCWVRFX09SREVSID09IDAKLQllbHNlCQkJLyogZHluYW1pYyBiaWctZW5kaWFuICovCisgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgIC8qIGR5bmFtaWMgYmlnLWVuZGlhbiAqLwogI2VuZGlmCi0jaWYgQllURV9PUkRFUiA+PSAwCQkvKiBiaWctZW5kaWFuICovCi0JewotCSAgICAvKgotCSAgICAgKiBPbiBiaWctZW5kaWFuIG1hY2hpbmVzLCB3ZSBtdXN0IGFycmFuZ2UgdGhlIGJ5dGVzIGluIHRoZQotCSAgICAgKiByaWdodCBvcmRlci4KLQkgICAgICovCi0JICAgIGNvbnN0IG1kNV9ieXRlX3QgKnhwID0gZGF0YTsKLQkgICAgaW50IGk7CisjaWYgQllURV9PUkRFUiA+PSAwICAgICAgICAgICAgIC8qIGJpZy1lbmRpYW4gKi8KKyAgICAgICAgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIE9uIGJpZy1lbmRpYW4gbWFjaGluZXMsIHdlIG11c3QgYXJyYW5nZSB0aGUgYnl0ZXMgaW4gdGhlCisgICAgICAgICAgICAgKiByaWdodCBvcmRlci4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgY29uc3QgbWQ1X2J5dGVfdCAqeHAgPSBkYXRhOworICAgICAgICAgICAgaW50IGk7CiAKICMgIGlmIEJZVEVfT1JERVIgPT0gMAotCSAgICBYID0geGJ1ZjsJCS8qIChkeW5hbWljIG9ubHkpICovCisgICAgICAgICAgICBYID0geGJ1ZjsgICAgICAgICAgIC8qIChkeW5hbWljIG9ubHkpICovCiAjICBlbHNlCi0jICAgIGRlZmluZSB4YnVmIFgJCS8qIChzdGF0aWMgb25seSkgKi8KKyMgICAgZGVmaW5lIHhidWYgWCAgICAgICAgICAgICAgLyogKHN0YXRpYyBvbmx5KSAqLwogIyAgZW5kaWYKLQkgICAgZm9yIChpID0gMDsgaSA8IDE2OyArK2ksIHhwICs9IDQpCi0JCXhidWZbaV0gPSB4cFswXSArICh4cFsxXSA8PCA4KSArICh4cFsyXSA8PCAxNikgKyAoeHBbM10gPDwgMjQpOwotCX0KKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgKytpLCB4cCArPSA0KQorICAgICAgICAgICAgICAgIHhidWZbaV0gPSB4cFswXSArICh4cFsxXSA8PCA4KSArICh4cFsyXSA8PCAxNikgKyAoeHBbM10gPDwgMjQpOworICAgICAgICB9CiAjZW5kaWYKICAgICB9CiAKQEAgLTMyOSw3ICszMjksNyBAQAogICAgIG1kNV93b3JkX3QgbmJpdHMgPSAobWQ1X3dvcmRfdCkobmJ5dGVzIDw8IDMpOwogCiAgICAgaWYgKG5ieXRlcyA8PSAwKQotCXJldHVybjsKKyAgICAgICAgcmV0dXJuOwogCiAgICAgLyogdGhpcyBzcGVjaWFsIGNhc2UgaXMgaGFuZGxlZCByZWN1cnNpdmVseSAqLwogICAgIGlmIChuYnl0ZXMgPiBJTlRfTUFYIC0gb2Zmc2V0KSB7CkBAIC0zMzksNyArMzM5LDcgQEAKICAgICAgICAgb3ZlcmxhcCA9IDY0IC0gb2Zmc2V0OwogCiAgICAgICAgIG1kNV9hcHBlbmQocG1zLCBkYXRhLCBvdmVybGFwKTsKLSAgICAgICAgbWQ1X2FwcGVuZChwbXMsIGRhdGEgKyBvdmVybGFwLCBuYnl0ZXMgLSBvdmVybGFwKTsgCisgICAgICAgIG1kNV9hcHBlbmQocG1zLCBkYXRhICsgb3ZlcmxhcCwgbmJ5dGVzIC0gb3ZlcmxhcCk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKQEAgLTM0Nyw0OCArMzQ3LDQ4IEBACiAgICAgcG1zLT5jb3VudFsxXSArPSBuYnl0ZXMgPj4gMjk7CiAgICAgcG1zLT5jb3VudFswXSArPSBuYml0czsKICAgICBpZiAocG1zLT5jb3VudFswXSA8IG5iaXRzKQotCXBtcy0+Y291bnRbMV0rKzsKKyAgICAgICAgcG1zLT5jb3VudFsxXSsrOwogCiAgICAgLyogUHJvY2VzcyBhbiBpbml0aWFsIHBhcnRpYWwgYmxvY2suICovCiAgICAgaWYgKG9mZnNldCkgewotCWludCBjb3B5ID0gKG9mZnNldCArIG5ieXRlcyA+IDY0ID8gNjQgLSBvZmZzZXQgOiBuYnl0ZXMpOworICAgICAgICBpbnQgY29weSA9IChvZmZzZXQgKyBuYnl0ZXMgPiA2NCA/IDY0IC0gb2Zmc2V0IDogbmJ5dGVzKTsKIAotCW1lbWNweShwbXMtPmJ1ZiArIG9mZnNldCwgcCwgY29weSk7Ci0JaWYgKG9mZnNldCArIGNvcHkgPCA2NCkKLQkgICAgcmV0dXJuOwotCXAgKz0gY29weTsKLQlsZWZ0IC09IGNvcHk7Ci0JbWQ1X3Byb2Nlc3MocG1zLCBwbXMtPmJ1Zik7CisgICAgICAgIG1lbWNweShwbXMtPmJ1ZiArIG9mZnNldCwgcCwgY29weSk7CisgICAgICAgIGlmIChvZmZzZXQgKyBjb3B5IDwgNjQpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIHAgKz0gY29weTsKKyAgICAgICAgbGVmdCAtPSBjb3B5OworICAgICAgICBtZDVfcHJvY2VzcyhwbXMsIHBtcy0+YnVmKTsKICAgICB9CiAKICAgICAvKiBQcm9jZXNzIGZ1bGwgYmxvY2tzLiAqLwogICAgIGZvciAoOyBsZWZ0ID49IDY0OyBwICs9IDY0LCBsZWZ0IC09IDY0KQotCW1kNV9wcm9jZXNzKHBtcywgcCk7CisgICAgICAgIG1kNV9wcm9jZXNzKHBtcywgcCk7CiAKICAgICAvKiBQcm9jZXNzIGEgZmluYWwgcGFydGlhbCBibG9jay4gKi8KICAgICBpZiAobGVmdCkKLQltZW1jcHkocG1zLT5idWYsIHAsIGxlZnQpOworICAgICAgICBtZW1jcHkocG1zLT5idWYsIHAsIGxlZnQpOwogfQogCiB2b2lkCiBtZDVfZmluaXNoKG1kNV9zdGF0ZV90ICpwbXMsIG1kNV9ieXRlX3QgZGlnZXN0WzE2XSkKIHsKICAgICBzdGF0aWMgY29uc3QgbWQ1X2J5dGVfdCBwYWRbNjRdID0gewotCTB4ODAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0JMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLQkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAKKyAgICAgICAgMHg4MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAgICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAgICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAgICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMAogICAgIH07CiAgICAgbWQ1X2J5dGVfdCBkYXRhWzhdOwogICAgIGludCBpOwogCiAgICAgLyogU2F2ZSB0aGUgbGVuZ3RoIGJlZm9yZSBwYWRkaW5nLiAqLwogICAgIGZvciAoaSA9IDA7IGkgPCA4OyArK2kpCi0JZGF0YVtpXSA9IChtZDVfYnl0ZV90KShwbXMtPmNvdW50W2kgPj4gMl0gPj4gKChpICYgMykgPDwgMykpOworICAgICAgICBkYXRhW2ldID0gKG1kNV9ieXRlX3QpKHBtcy0+Y291bnRbaSA+PiAyXSA+PiAoKGkgJiAzKSA8PCAzKSk7CiAgICAgLyogUGFkIHRvIDU2IGJ5dGVzIG1vZCA2NC4gKi8KICAgICBtZDVfYXBwZW5kKHBtcywgcGFkLCAoKDU1IC0gKHBtcy0+Y291bnRbMF0gPj4gMykpICYgNjMpICsgMSk7CiAgICAgLyogQXBwZW5kIHRoZSBsZW5ndGguICovCiAgICAgbWQ1X2FwcGVuZChwbXMsIGRhdGEsIDgpOwogICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgKytpKQotCWRpZ2VzdFtpXSA9IChtZDVfYnl0ZV90KShwbXMtPmFiY2RbaSA+PiAyXSA+PiAoKGkgJiAzKSA8PCAzKSk7CisgICAgICAgIGRpZ2VzdFtpXSA9IChtZDVfYnl0ZV90KShwbXMtPmFiY2RbaSA+PiAyXSA+PiAoKGkgJiAzKSA8PCAzKSk7CiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL21kNW1vZHVsZS5jIGIvTW9kdWxlcy9tZDVtb2R1bGUuYwppbmRleCAxZTJlNmUzLi5jZTk0ZmI1IDEwMDY0NAotLS0gYS9Nb2R1bGVzL21kNW1vZHVsZS5jCisrKyBiL01vZHVsZXMvbWQ1bW9kdWxlLmMKQEAgLTE0LDI1ICsxNCwyNSBAQAogI2luY2x1ZGUgIm1kNS5oIgogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotICAgICAgICBtZDVfc3RhdGVfdAltZDU7CQkvKiB0aGUgY29udGV4dCBob2xkZXIgKi8KKyAgICBQeU9iamVjdF9IRUFECisgICAgbWQ1X3N0YXRlX3QgICAgICAgICBtZDU7ICAgICAgICAgICAgLyogdGhlIGNvbnRleHQgaG9sZGVyICovCiB9IG1kNW9iamVjdDsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBNRDV0eXBlOwogCi0jZGVmaW5lIGlzX21kNW9iamVjdCh2KQkJKCh2KS0+b2JfdHlwZSA9PSAmTUQ1dHlwZSkKKyNkZWZpbmUgaXNfbWQ1b2JqZWN0KHYpICAgICAgICAgKCh2KS0+b2JfdHlwZSA9PSAmTUQ1dHlwZSkKIAogc3RhdGljIG1kNW9iamVjdCAqCiBuZXdtZDVvYmplY3Qodm9pZCkKIHsKLQltZDVvYmplY3QgKm1kNXA7CisgICAgbWQ1b2JqZWN0ICptZDVwOwogCi0JbWQ1cCA9IFB5T2JqZWN0X05ldyhtZDVvYmplY3QsICZNRDV0eXBlKTsKLQlpZiAobWQ1cCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBtZDVwID0gUHlPYmplY3RfTmV3KG1kNW9iamVjdCwgJk1ENXR5cGUpOworICAgIGlmIChtZDVwID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JbWQ1X2luaXQoJm1kNXAtPm1kNSk7CS8qIGFjdHVhbCBpbml0aWFsaXNhdGlvbiAqLwotCXJldHVybiBtZDVwOworICAgIG1kNV9pbml0KCZtZDVwLT5tZDUpOyAgICAgICAvKiBhY3R1YWwgaW5pdGlhbGlzYXRpb24gKi8KKyAgICByZXR1cm4gbWQ1cDsKIH0KIAogCkBAIC00MSw3ICs0MSw3IEBACiBzdGF0aWMgdm9pZAogbWQ1X2RlYWxsb2MobWQ1b2JqZWN0ICptZDVwKQogewotCVB5T2JqZWN0X0RlbChtZDVwKTsKKyAgICBQeU9iamVjdF9EZWwobWQ1cCk7CiB9CiAKIApAQCAtNTAsMTYgKzUwLDE2IEBACiBzdGF0aWMgUHlPYmplY3QgKgogbWQ1X3VwZGF0ZShtZDVvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXVuc2lnbmVkIGNoYXIgKmNwOwotCWludCBsZW47CisgICAgdW5zaWduZWQgY2hhciAqY3A7CisgICAgaW50IGxlbjsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyM6dXBkYXRlIiwgJmNwLCAmbGVuKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIzp1cGRhdGUiLCAmY3AsICZsZW4pKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCW1kNV9hcHBlbmQoJnNlbGYtPm1kNSwgY3AsIGxlbik7CisgICAgbWQ1X2FwcGVuZCgmc2VsZi0+bWQ1LCBjcCwgbGVuKTsKIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIFB5RG9jX1NUUlZBUih1cGRhdGVfZG9jLApAQCAtNzMsMTQgKzczLDE0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogbWQ1X2RpZ2VzdChtZDVvYmplY3QgKnNlbGYpCiB7Ci0gCW1kNV9zdGF0ZV90IG1kQ29udGV4dDsKLQl1bnNpZ25lZCBjaGFyIGFEaWdlc3RbMTZdOworICAgIG1kNV9zdGF0ZV90IG1kQ29udGV4dDsKKyAgICB1bnNpZ25lZCBjaGFyIGFEaWdlc3RbMTZdOwogCi0JLyogbWFrZSBhIHRlbXBvcmFyeSBjb3B5LCBhbmQgcGVyZm9ybSB0aGUgZmluYWwgKi8KLQltZENvbnRleHQgPSBzZWxmLT5tZDU7Ci0JbWQ1X2ZpbmlzaCgmbWRDb250ZXh0LCBhRGlnZXN0KTsKKyAgICAvKiBtYWtlIGEgdGVtcG9yYXJ5IGNvcHksIGFuZCBwZXJmb3JtIHRoZSBmaW5hbCAqLworICAgIG1kQ29udGV4dCA9IHNlbGYtPm1kNTsKKyAgICBtZDVfZmluaXNoKCZtZENvbnRleHQsIGFEaWdlc3QpOwogCi0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopYURpZ2VzdCwgMTYpOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKWFEaWdlc3QsIDE2KTsKIH0KIAogUHlEb2NfU1RSVkFSKGRpZ2VzdF9kb2MsCkBAIC05NCwyNiArOTQsMjYgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBtZDVfaGV4ZGlnZXN0KG1kNW9iamVjdCAqc2VsZikKIHsKLSAJbWQ1X3N0YXRlX3QgbWRDb250ZXh0OwotCXVuc2lnbmVkIGNoYXIgZGlnZXN0WzE2XTsKLQl1bnNpZ25lZCBjaGFyIGhleGRpZ2VzdFszMl07Ci0JaW50IGksIGo7CisgICAgbWQ1X3N0YXRlX3QgbWRDb250ZXh0OworICAgIHVuc2lnbmVkIGNoYXIgZGlnZXN0WzE2XTsKKyAgICB1bnNpZ25lZCBjaGFyIGhleGRpZ2VzdFszMl07CisgICAgaW50IGksIGo7CiAKLQkvKiBtYWtlIGEgdGVtcG9yYXJ5IGNvcHksIGFuZCBwZXJmb3JtIHRoZSBmaW5hbCAqLwotCW1kQ29udGV4dCA9IHNlbGYtPm1kNTsKLQltZDVfZmluaXNoKCZtZENvbnRleHQsIGRpZ2VzdCk7CisgICAgLyogbWFrZSBhIHRlbXBvcmFyeSBjb3B5LCBhbmQgcGVyZm9ybSB0aGUgZmluYWwgKi8KKyAgICBtZENvbnRleHQgPSBzZWxmLT5tZDU7CisgICAgbWQ1X2ZpbmlzaCgmbWRDb250ZXh0LCBkaWdlc3QpOwogCi0JLyogTWFrZSBoZXggdmVyc2lvbiBvZiB0aGUgZGlnZXN0ICovCi0JZm9yKGk9aj0wOyBpPDE2OyBpKyspIHsKLQkJY2hhciBjOwotCQljID0gKGRpZ2VzdFtpXSA+PiA0KSAmIDB4ZjsKLQkJYyA9IChjPjkpID8gYysnYSctMTAgOiBjICsgJzAnOwotCQloZXhkaWdlc3RbaisrXSA9IGM7Ci0JCWMgPSAoZGlnZXN0W2ldICYgMHhmKTsKLQkJYyA9IChjPjkpID8gYysnYSctMTAgOiBjICsgJzAnOwotCQloZXhkaWdlc3RbaisrXSA9IGM7Ci0JfQotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciopaGV4ZGlnZXN0LCAzMik7CisgICAgLyogTWFrZSBoZXggdmVyc2lvbiBvZiB0aGUgZGlnZXN0ICovCisgICAgZm9yKGk9aj0wOyBpPDE2OyBpKyspIHsKKyAgICAgICAgY2hhciBjOworICAgICAgICBjID0gKGRpZ2VzdFtpXSA+PiA0KSAmIDB4ZjsKKyAgICAgICAgYyA9IChjPjkpID8gYysnYSctMTAgOiBjICsgJzAnOworICAgICAgICBoZXhkaWdlc3RbaisrXSA9IGM7CisgICAgICAgIGMgPSAoZGlnZXN0W2ldICYgMHhmKTsKKyAgICAgICAgYyA9IChjPjkpID8gYysnYSctMTAgOiBjICsgJzAnOworICAgICAgICBoZXhkaWdlc3RbaisrXSA9IGM7CisgICAgfQorICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciopaGV4ZGlnZXN0LCAzMik7CiB9CiAKIApAQCAtMTI2LDE0ICsxMjYsMTQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBtZDVfY29weShtZDVvYmplY3QgKnNlbGYpCiB7Ci0JbWQ1b2JqZWN0ICptZDVwOworICAgIG1kNW9iamVjdCAqbWQ1cDsKIAotCWlmICgobWQ1cCA9IG5ld21kNW9iamVjdCgpKSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoKG1kNXAgPSBuZXdtZDVvYmplY3QoKSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQltZDVwLT5tZDUgPSBzZWxmLT5tZDU7CisgICAgbWQ1cC0+bWQ1ID0gc2VsZi0+bWQ1OwogCi0JcmV0dXJuIChQeU9iamVjdCAqKW1kNXA7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKW1kNXA7CiB9CiAKIFB5RG9jX1NUUlZBUihjb3B5X2RvYywKQEAgLTE0MywxMSArMTQzLDExIEBACiAKIAogc3RhdGljIFB5TWV0aG9kRGVmIG1kNV9tZXRob2RzW10gPSB7Ci0JeyJ1cGRhdGUiLCAgICAoUHlDRnVuY3Rpb24pbWQ1X3VwZGF0ZSwgICAgTUVUSF9WQVJBUkdTLCB1cGRhdGVfZG9jfSwKLQl7ImRpZ2VzdCIsICAgIChQeUNGdW5jdGlvbiltZDVfZGlnZXN0LCAgICBNRVRIX05PQVJHUywgIGRpZ2VzdF9kb2N9LAotCXsiaGV4ZGlnZXN0IiwgKFB5Q0Z1bmN0aW9uKW1kNV9oZXhkaWdlc3QsIE1FVEhfTk9BUkdTLCAgaGV4ZGlnZXN0X2RvY30sCi0JeyJjb3B5IiwgICAgICAoUHlDRnVuY3Rpb24pbWQ1X2NvcHksICAgICAgTUVUSF9OT0FSR1MsICBjb3B5X2RvY30sCi0Je05VTEwsIE5VTEx9CQkJICAgICAvKiBzZW50aW5lbCAqLworICAgIHsidXBkYXRlIiwgICAgKFB5Q0Z1bmN0aW9uKW1kNV91cGRhdGUsICAgIE1FVEhfVkFSQVJHUywgdXBkYXRlX2RvY30sCisgICAgeyJkaWdlc3QiLCAgICAoUHlDRnVuY3Rpb24pbWQ1X2RpZ2VzdCwgICAgTUVUSF9OT0FSR1MsICBkaWdlc3RfZG9jfSwKKyAgICB7ImhleGRpZ2VzdCIsIChQeUNGdW5jdGlvbiltZDVfaGV4ZGlnZXN0LCBNRVRIX05PQVJHUywgIGhleGRpZ2VzdF9kb2N9LAorICAgIHsiY29weSIsICAgICAgKFB5Q0Z1bmN0aW9uKW1kNV9jb3B5LCAgICAgIE1FVEhfTk9BUkdTLCAgY29weV9kb2N9LAorICAgIHtOVUxMLCBOVUxMfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC0yMjEsMzcgKzIyMSwzNyBAQAogY29weSgpIC0tIHJldHVybiBhIGNvcHkgb2YgdGhlIGN1cnJlbnQgbWQ1IG9iamVjdCIpOwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IE1ENXR5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JIl9tZDUubWQ1IiwJCSAgLyp0cF9uYW1lKi8KLQlzaXplb2YobWQ1b2JqZWN0KSwJICAvKnRwX3NpemUqLwotCTAsCQkJICAvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpbWQ1X2RlYWxsb2MsICAvKnRwX2RlYWxsb2MqLwotCTAsCQkJICAvKnRwX3ByaW50Ki8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0YXR0ciovCi0JMCwJCQkgIC8qdHBfc2V0YXR0ciovCi0JMCwJCQkgIC8qdHBfY29tcGFyZSovCi0JMCwJCQkgIC8qdHBfcmVwciovCi0gICAgICAgIDAsCQkJICAvKnRwX2FzX251bWJlciovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX3NlcXVlbmNlKi8KLQkwLAkJCSAgLyp0cF9hc19tYXBwaW5nKi8KLQkwLCAJCQkgIC8qdHBfaGFzaCovCi0JMCwJCQkgIC8qdHBfY2FsbCovCi0JMCwJCQkgIC8qdHBfc3RyKi8KLQkwLAkJCSAgLyp0cF9nZXRhdHRybyovCi0JMCwJCQkgIC8qdHBfc2V0YXR0cm8qLwotCTAsCSAgICAgICAgICAgICAgICAgIC8qdHBfYXNfYnVmZmVyKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQsCSAgLyp0cF9mbGFncyovCi0JbWQ1dHlwZV9kb2MsCQkgIC8qdHBfZG9jKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3RyYXZlcnNlKi8KLSAgICAgICAgMCwJCQkgIC8qdHBfY2xlYXIqLwotICAgICAgICAwLAkJCSAgLyp0cF9yaWNoY29tcGFyZSovCi0gICAgICAgIDAsCQkJICAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLSAgICAgICAgMCwJCQkgIC8qdHBfaXRlciovCi0gICAgICAgIDAsCQkJICAvKnRwX2l0ZXJuZXh0Ki8KLSAgICAgICAgbWQ1X21ldGhvZHMsCSAgICAgICAgICAvKnRwX21ldGhvZHMqLwotICAgICAgICAwLCAgICAgIAkgICAgICAgICAgLyp0cF9tZW1iZXJzKi8KLSAgICAgICAgbWQ1X2dldHNldGVycywgICAgICAgICAgICAvKnRwX2dldHNldCovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisgICAgIl9tZDUubWQ1IiwgICAgICAgICAgICAgICAgICAgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YobWQ1b2JqZWN0KSwgICAgICAgICAgICAvKnRwX3NpemUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvciltZDVfZGVhbGxvYywgIC8qdHBfZGVhbGxvYyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9wcmludCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc2V0YXR0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jb21wYXJlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3JlcHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbnVtYmVyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfc2VxdWVuY2UqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbWFwcGluZyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9oYXNoKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NhbGwqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc3RyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHJvKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHJvKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgICAgICAgLyp0cF9mbGFncyovCisgICAgbWQ1dHlwZV9kb2MsICAgICAgICAgICAgICAgICAgLyp0cF9kb2MqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF90cmF2ZXJzZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jbGVhciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZXJuZXh0Ki8KKyAgICBtZDVfbWV0aG9kcywgICAgICAgICAgICAgICAgICAvKnRwX21ldGhvZHMqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfbWVtYmVycyovCisgICAgbWQ1X2dldHNldGVycywgICAgICAgICAgICAvKnRwX2dldHNldCovCiB9OwogCiAKQEAgLTI2MCwyMCArMjYwLDIwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogTUQ1X25ldyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbWQ1b2JqZWN0ICptZDVwOwotCXVuc2lnbmVkIGNoYXIgKmNwID0gTlVMTDsKLQlpbnQgbGVuID0gMDsKKyAgICBtZDVvYmplY3QgKm1kNXA7CisgICAgdW5zaWduZWQgY2hhciAqY3AgPSBOVUxMOworICAgIGludCBsZW4gPSAwOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8cyM6bmV3IiwgJmNwLCAmbGVuKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8cyM6bmV3IiwgJmNwLCAmbGVuKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoKG1kNXAgPSBuZXdtZDVvYmplY3QoKSkgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKChtZDVwID0gbmV3bWQ1b2JqZWN0KCkpID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKGNwKQotCQltZDVfYXBwZW5kKCZtZDVwLT5tZDUsIGNwLCBsZW4pOworICAgIGlmIChjcCkKKyAgICAgICAgbWQ1X2FwcGVuZCgmbWQ1cC0+bWQ1LCBjcCwgbGVuKTsKIAotCXJldHVybiAoUHlPYmplY3QgKiltZDVwOworICAgIHJldHVybiAoUHlPYmplY3QgKiltZDVwOwogfQogCiBQeURvY19TVFJWQVIobmV3X2RvYywKQEAgLTI4Niw4ICsyODYsOCBAQAogLyogTGlzdCBvZiBmdW5jdGlvbnMgZXhwb3J0ZWQgYnkgdGhpcyBtb2R1bGUgKi8KIAogc3RhdGljIFB5TWV0aG9kRGVmIG1kNV9mdW5jdGlvbnNbXSA9IHsKLQl7Im5ldyIsCQkoUHlDRnVuY3Rpb24pTUQ1X25ldywgTUVUSF9WQVJBUkdTLCBuZXdfZG9jfSwKLQl7TlVMTCwJCU5VTEx9CS8qIFNlbnRpbmVsICovCisgICAgeyJuZXciLCAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pTUQ1X25ldywgTUVUSF9WQVJBUkdTLCBuZXdfZG9jfSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgLyogU2VudGluZWwgKi8KIH07CiAKIApAQCAtMjk2LDE2ICsyOTYsMTYgQEAKIFB5TU9ESU5JVF9GVU5DCiBpbml0X21kNSh2b2lkKQogewotCVB5T2JqZWN0ICptLCAqZDsKKyAgICBQeU9iamVjdCAqbSwgKmQ7CiAKLSAgICAgICAgUHlfVFlQRSgmTUQ1dHlwZSkgPSAmUHlUeXBlX1R5cGU7Ci0gICAgICAgIGlmIChQeVR5cGVfUmVhZHkoJk1ENXR5cGUpIDwgMCkKLSAgICAgICAgICAgIHJldHVybjsKLQltID0gUHlfSW5pdE1vZHVsZTMoIl9tZDUiLCBtZDVfZnVuY3Rpb25zLCBtb2R1bGVfZG9jKTsKLQlpZiAobSA9PSBOVUxMKQotCSAgICByZXR1cm47Ci0JZCA9IFB5TW9kdWxlX0dldERpY3QobSk7Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1ENVR5cGUiLCAoUHlPYmplY3QgKikmTUQ1dHlwZSk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgImRpZ2VzdF9zaXplIiwgMTYpOwotCS8qIE5vIG5lZWQgdG8gY2hlY2sgdGhlIGVycm9yIGhlcmUsIHRoZSBjYWxsZXIgd2lsbCBkbyB0aGF0ICovCisgICAgUHlfVFlQRSgmTUQ1dHlwZSkgPSAmUHlUeXBlX1R5cGU7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmTUQ1dHlwZSkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgbSA9IFB5X0luaXRNb2R1bGUzKCJfbWQ1IiwgbWQ1X2Z1bmN0aW9ucywgbW9kdWxlX2RvYyk7CisgICAgaWYgKG0gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOworICAgIGQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNRDVUeXBlIiwgKFB5T2JqZWN0ICopJk1ENXR5cGUpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJkaWdlc3Rfc2l6ZSIsIDE2KTsKKyAgICAvKiBObyBuZWVkIHRvIGNoZWNrIHRoZSBlcnJvciBoZXJlLCB0aGUgY2FsbGVyIHdpbGwgZG8gdGhhdCAqLwogfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9tbWFwbW9kdWxlLmMgYi9Nb2R1bGVzL21tYXBtb2R1bGUuYwppbmRleCBhYzU3MmQyLi4yNGY3ODUxIDEwMDY0NAotLS0gYS9Nb2R1bGVzL21tYXBtb2R1bGUuYworKysgYi9Nb2R1bGVzL21tYXBtb2R1bGUuYwpAQCAtMzAsMTggKzMwLDE4IEBACiBzdGF0aWMgaW50CiBteV9nZXRwYWdlc2l6ZSh2b2lkKQogewotCVNZU1RFTV9JTkZPIHNpOwotCUdldFN5c3RlbUluZm8oJnNpKTsKLQlyZXR1cm4gc2kuZHdQYWdlU2l6ZTsKKyAgICBTWVNURU1fSU5GTyBzaTsKKyAgICBHZXRTeXN0ZW1JbmZvKCZzaSk7CisgICAgcmV0dXJuIHNpLmR3UGFnZVNpemU7CiB9CiAKIHN0YXRpYyBpbnQKIG15X2dldGFsbG9jYXRpb25ncmFudWxhcml0eSAodm9pZCkKIHsKIAotCVNZU1RFTV9JTkZPIHNpOwotCUdldFN5c3RlbUluZm8oJnNpKTsKLQlyZXR1cm4gc2kuZHdBbGxvY2F0aW9uR3JhbnVsYXJpdHk7CisgICAgU1lTVEVNX0lORk8gc2k7CisgICAgR2V0U3lzdGVtSW5mbygmc2kpOworICAgIHJldHVybiBzaS5kd0FsbG9jYXRpb25HcmFudWxhcml0eTsKIH0KIAogI2VuZGlmCkBAIC01NCw3ICs1NCw3IEBACiBzdGF0aWMgaW50CiBteV9nZXRwYWdlc2l6ZSh2b2lkKQogewotCXJldHVybiBzeXNjb25mKF9TQ19QQUdFU0laRSk7CisgICAgcmV0dXJuIHN5c2NvbmYoX1NDX1BBR0VTSVpFKTsKIH0KIAogI2RlZmluZSBteV9nZXRhbGxvY2F0aW9uZ3JhbnVsYXJpdHkgbXlfZ2V0cGFnZXNpemUKQEAgLTc5LDMwICs3OSwzMCBAQAogCiB0eXBlZGVmIGVudW0KIHsKLQlBQ0NFU1NfREVGQVVMVCwKLQlBQ0NFU1NfUkVBRCwKLQlBQ0NFU1NfV1JJVEUsCi0JQUNDRVNTX0NPUFkKKyAgICBBQ0NFU1NfREVGQVVMVCwKKyAgICBBQ0NFU1NfUkVBRCwKKyAgICBBQ0NFU1NfV1JJVEUsCisgICAgQUNDRVNTX0NPUFkKIH0gYWNjZXNzX21vZGU7CiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JY2hhciAqCWRhdGE7Ci0Jc2l6ZV90CXNpemU7Ci0Jc2l6ZV90CXBvczsgICAgLyogcmVsYXRpdmUgdG8gb2Zmc2V0ICovCi0Jc2l6ZV90CW9mZnNldDsgCisgICAgUHlPYmplY3RfSEVBRAorICAgIGNoYXIgKiAgICAgIGRhdGE7CisgICAgc2l6ZV90ICAgICAgc2l6ZTsKKyAgICBzaXplX3QgICAgICBwb3M7ICAgIC8qIHJlbGF0aXZlIHRvIG9mZnNldCAqLworICAgIHNpemVfdCAgICAgIG9mZnNldDsKIAogI2lmZGVmIE1TX1dJTkRPV1MKLQlIQU5ETEUJbWFwX2hhbmRsZTsKLQlIQU5ETEUJZmlsZV9oYW5kbGU7Ci0JY2hhciAqCXRhZ25hbWU7CisgICAgSEFORExFICAgICAgbWFwX2hhbmRsZTsKKyAgICBIQU5ETEUgICAgICBmaWxlX2hhbmRsZTsKKyAgICBjaGFyICogICAgICB0YWduYW1lOwogI2VuZGlmCiAKICNpZmRlZiBVTklYCi0gICAgICAgIGludCBmZDsKKyAgICBpbnQgZmQ7CiAjZW5kaWYKIAotICAgICAgICBhY2Nlc3NfbW9kZSBhY2Nlc3M7CisgICAgYWNjZXNzX21vZGUgYWNjZXNzOwogfSBtbWFwX29iamVjdDsKIAogCkBAIC0xMTAsMzIxICsxMTAsMzIxIEBACiBtbWFwX29iamVjdF9kZWFsbG9jKG1tYXBfb2JqZWN0ICptX29iaikKIHsKICNpZmRlZiBNU19XSU5ET1dTCi0JaWYgKG1fb2JqLT5kYXRhICE9IE5VTEwpCi0JCVVubWFwVmlld09mRmlsZSAobV9vYmotPmRhdGEpOwotCWlmIChtX29iai0+bWFwX2hhbmRsZSAhPSBOVUxMKQotCQlDbG9zZUhhbmRsZSAobV9vYmotPm1hcF9oYW5kbGUpOwotCWlmIChtX29iai0+ZmlsZV9oYW5kbGUgIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpCi0JCUNsb3NlSGFuZGxlIChtX29iai0+ZmlsZV9oYW5kbGUpOwotCWlmIChtX29iai0+dGFnbmFtZSkKLQkJUHlNZW1fRnJlZShtX29iai0+dGFnbmFtZSk7CisgICAgaWYgKG1fb2JqLT5kYXRhICE9IE5VTEwpCisgICAgICAgIFVubWFwVmlld09mRmlsZSAobV9vYmotPmRhdGEpOworICAgIGlmIChtX29iai0+bWFwX2hhbmRsZSAhPSBOVUxMKQorICAgICAgICBDbG9zZUhhbmRsZSAobV9vYmotPm1hcF9oYW5kbGUpOworICAgIGlmIChtX29iai0+ZmlsZV9oYW5kbGUgIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpCisgICAgICAgIENsb3NlSGFuZGxlIChtX29iai0+ZmlsZV9oYW5kbGUpOworICAgIGlmIChtX29iai0+dGFnbmFtZSkKKyAgICAgICAgUHlNZW1fRnJlZShtX29iai0+dGFnbmFtZSk7CiAjZW5kaWYgLyogTVNfV0lORE9XUyAqLwogCiAjaWZkZWYgVU5JWAotCWlmIChtX29iai0+ZmQgPj0gMCkKLQkJKHZvaWQpIGNsb3NlKG1fb2JqLT5mZCk7Ci0JaWYgKG1fb2JqLT5kYXRhIT1OVUxMKSB7Ci0JCW1zeW5jKG1fb2JqLT5kYXRhLCBtX29iai0+c2l6ZSwgTVNfU1lOQyk7Ci0JCW11bm1hcChtX29iai0+ZGF0YSwgbV9vYmotPnNpemUpOwotCX0KKyAgICBpZiAobV9vYmotPmZkID49IDApCisgICAgICAgICh2b2lkKSBjbG9zZShtX29iai0+ZmQpOworICAgIGlmIChtX29iai0+ZGF0YSE9TlVMTCkgeworICAgICAgICBtc3luYyhtX29iai0+ZGF0YSwgbV9vYmotPnNpemUsIE1TX1NZTkMpOworICAgICAgICBtdW5tYXAobV9vYmotPmRhdGEsIG1fb2JqLT5zaXplKTsKKyAgICB9CiAjZW5kaWYgLyogVU5JWCAqLwogCi0JUHlfVFlQRShtX29iaiktPnRwX2ZyZWUoKFB5T2JqZWN0KiltX29iaik7CisgICAgUHlfVFlQRShtX29iaiktPnRwX2ZyZWUoKFB5T2JqZWN0KiltX29iaik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBtbWFwX2Nsb3NlX21ldGhvZChtbWFwX29iamVjdCAqc2VsZiwgUHlPYmplY3QgKnVudXNlZCkKIHsKICNpZmRlZiBNU19XSU5ET1dTCi0JLyogRm9yIGVhY2ggcmVzb3VyY2Ugd2UgbWFpbnRhaW4sIHdlIG5lZWQgdG8gY2hlY2sKLQkgICB0aGUgdmFsdWUgaXMgdmFsaWQsIGFuZCBpZiBzbywgZnJlZSB0aGUgcmVzb3VyY2UKLQkgICBhbmQgc2V0IHRoZSBtZW1iZXIgdmFsdWUgdG8gYW4gaW52YWxpZCB2YWx1ZSBzbwotCSAgIHRoZSBkZWFsbG9jIGRvZXMgbm90IGF0dGVtcHQgdG8gcmVzb3VyY2UgY2xlYXJpbmcKLQkgICBhZ2Fpbi4KLQkgICBUT0RPIC0gc2hvdWxkIHdlIGNoZWNrIGZvciBlcnJvcnMgaW4gdGhlIGNsb3NlIG9wZXJhdGlvbnM/Pz8KLQkqLwotCWlmIChzZWxmLT5kYXRhICE9IE5VTEwpIHsKLQkJVW5tYXBWaWV3T2ZGaWxlKHNlbGYtPmRhdGEpOwotCQlzZWxmLT5kYXRhID0gTlVMTDsKLQl9Ci0JaWYgKHNlbGYtPm1hcF9oYW5kbGUgIT0gTlVMTCkgewotCQlDbG9zZUhhbmRsZShzZWxmLT5tYXBfaGFuZGxlKTsKLQkJc2VsZi0+bWFwX2hhbmRsZSA9IE5VTEw7Ci0JfQotCWlmIChzZWxmLT5maWxlX2hhbmRsZSAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgewotCQlDbG9zZUhhbmRsZShzZWxmLT5maWxlX2hhbmRsZSk7Ci0JCXNlbGYtPmZpbGVfaGFuZGxlID0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7Ci0JfQorICAgIC8qIEZvciBlYWNoIHJlc291cmNlIHdlIG1haW50YWluLCB3ZSBuZWVkIHRvIGNoZWNrCisgICAgICAgdGhlIHZhbHVlIGlzIHZhbGlkLCBhbmQgaWYgc28sIGZyZWUgdGhlIHJlc291cmNlCisgICAgICAgYW5kIHNldCB0aGUgbWVtYmVyIHZhbHVlIHRvIGFuIGludmFsaWQgdmFsdWUgc28KKyAgICAgICB0aGUgZGVhbGxvYyBkb2VzIG5vdCBhdHRlbXB0IHRvIHJlc291cmNlIGNsZWFyaW5nCisgICAgICAgYWdhaW4uCisgICAgICAgVE9ETyAtIHNob3VsZCB3ZSBjaGVjayBmb3IgZXJyb3JzIGluIHRoZSBjbG9zZSBvcGVyYXRpb25zPz8/CisgICAgKi8KKyAgICBpZiAoc2VsZi0+ZGF0YSAhPSBOVUxMKSB7CisgICAgICAgIFVubWFwVmlld09mRmlsZShzZWxmLT5kYXRhKTsKKyAgICAgICAgc2VsZi0+ZGF0YSA9IE5VTEw7CisgICAgfQorICAgIGlmIChzZWxmLT5tYXBfaGFuZGxlICE9IE5VTEwpIHsKKyAgICAgICAgQ2xvc2VIYW5kbGUoc2VsZi0+bWFwX2hhbmRsZSk7CisgICAgICAgIHNlbGYtPm1hcF9oYW5kbGUgPSBOVUxMOworICAgIH0KKyAgICBpZiAoc2VsZi0+ZmlsZV9oYW5kbGUgIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKKyAgICAgICAgQ2xvc2VIYW5kbGUoc2VsZi0+ZmlsZV9oYW5kbGUpOworICAgICAgICBzZWxmLT5maWxlX2hhbmRsZSA9IElOVkFMSURfSEFORExFX1ZBTFVFOworICAgIH0KICNlbmRpZiAvKiBNU19XSU5ET1dTICovCiAKICNpZmRlZiBVTklYCi0JaWYgKDAgPD0gc2VsZi0+ZmQpCi0JCSh2b2lkKSBjbG9zZShzZWxmLT5mZCk7Ci0Jc2VsZi0+ZmQgPSAtMTsKLQlpZiAoc2VsZi0+ZGF0YSAhPSBOVUxMKSB7Ci0JCW11bm1hcChzZWxmLT5kYXRhLCBzZWxmLT5zaXplKTsKLQkJc2VsZi0+ZGF0YSA9IE5VTEw7Ci0JfQorICAgIGlmICgwIDw9IHNlbGYtPmZkKQorICAgICAgICAodm9pZCkgY2xvc2Uoc2VsZi0+ZmQpOworICAgIHNlbGYtPmZkID0gLTE7CisgICAgaWYgKHNlbGYtPmRhdGEgIT0gTlVMTCkgeworICAgICAgICBtdW5tYXAoc2VsZi0+ZGF0YSwgc2VsZi0+c2l6ZSk7CisgICAgICAgIHNlbGYtPmRhdGEgPSBOVUxMOworICAgIH0KICNlbmRpZgogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogI2lmZGVmIE1TX1dJTkRPV1MKLSNkZWZpbmUgQ0hFQ0tfVkFMSUQoZXJyKQkJCQkJCVwKLWRvIHsJCQkJCQkJCQlcCi0gICAgaWYgKHNlbGYtPm1hcF9oYW5kbGUgPT0gTlVMTCkgewkJCQkJXAotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAibW1hcCBjbG9zZWQgb3IgaW52YWxpZCIpOwlcCi0JcmV0dXJuIGVycjsJCQkJCQkJXAotICAgIH0JCQkJCQkJCQlcCisjZGVmaW5lIENIRUNLX1ZBTElEKGVycikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKHNlbGYtPm1hcF9oYW5kbGUgPT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJtbWFwIGNsb3NlZCBvciBpbnZhbGlkIik7ICAgICAgICBcCisgICAgcmV0dXJuIGVycjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiB9IHdoaWxlICgwKQogI2VuZGlmIC8qIE1TX1dJTkRPV1MgKi8KIAogI2lmZGVmIFVOSVgKLSNkZWZpbmUgQ0hFQ0tfVkFMSUQoZXJyKQkJCQkJCVwKLWRvIHsJCQkJCQkJCQlcCi0gICAgaWYgKHNlbGYtPmRhdGEgPT0gTlVMTCkgewkJCQkJCVwKLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIm1tYXAgY2xvc2VkIG9yIGludmFsaWQiKTsJXAotCXJldHVybiBlcnI7CQkJCQkJCVwKLQl9CQkJCQkJCQlcCisjZGVmaW5lIENIRUNLX1ZBTElEKGVycikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKHNlbGYtPmRhdGEgPT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJtbWFwIGNsb3NlZCBvciBpbnZhbGlkIik7ICAgICAgICBcCisgICAgcmV0dXJuIGVycjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiB9IHdoaWxlICgwKQogI2VuZGlmIC8qIFVOSVggKi8KIAogc3RhdGljIFB5T2JqZWN0ICoKIG1tYXBfcmVhZF9ieXRlX21ldGhvZChtbWFwX29iamVjdCAqc2VsZiwKLQkJICAgICAgUHlPYmplY3QgKnVudXNlZCkKKyAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqdW51c2VkKQogewotCUNIRUNLX1ZBTElEKE5VTEwpOwotCWlmIChzZWxmLT5wb3MgPCBzZWxmLT5zaXplKSB7Ci0JICAgICAgICBjaGFyIHZhbHVlID0gc2VsZi0+ZGF0YVtzZWxmLT5wb3NdOwotCQlzZWxmLT5wb3MgKz0gMTsKLQkJcmV0dXJuIFB5X0J1aWxkVmFsdWUoImMiLCB2YWx1ZSk7Ci0JfSBlbHNlIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJyZWFkIGJ5dGUgb3V0IG9mIHJhbmdlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBDSEVDS19WQUxJRChOVUxMKTsKKyAgICBpZiAoc2VsZi0+cG9zIDwgc2VsZi0+c2l6ZSkgeworICAgICAgICBjaGFyIHZhbHVlID0gc2VsZi0+ZGF0YVtzZWxmLT5wb3NdOworICAgICAgICBzZWxmLT5wb3MgKz0gMTsKKyAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImMiLCB2YWx1ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJyZWFkIGJ5dGUgb3V0IG9mIHJhbmdlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG1tYXBfcmVhZF9saW5lX21ldGhvZChtbWFwX29iamVjdCAqc2VsZiwKLQkJICAgICAgUHlPYmplY3QgKnVudXNlZCkKKyAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqdW51c2VkKQogewotCWNoYXIgKnN0YXJ0ID0gc2VsZi0+ZGF0YStzZWxmLT5wb3M7Ci0JY2hhciAqZW9mID0gc2VsZi0+ZGF0YStzZWxmLT5zaXplOwotCWNoYXIgKmVvbDsKLQlQeU9iamVjdCAqcmVzdWx0OworICAgIGNoYXIgKnN0YXJ0ID0gc2VsZi0+ZGF0YStzZWxmLT5wb3M7CisgICAgY2hhciAqZW9mID0gc2VsZi0+ZGF0YStzZWxmLT5zaXplOworICAgIGNoYXIgKmVvbDsKKyAgICBQeU9iamVjdCAqcmVzdWx0OwogCi0JQ0hFQ0tfVkFMSUQoTlVMTCk7CisgICAgQ0hFQ0tfVkFMSUQoTlVMTCk7CiAKLQllb2wgPSBtZW1jaHIoc3RhcnQsICdcbicsIHNlbGYtPnNpemUgLSBzZWxmLT5wb3MpOwotCWlmICghZW9sKQotCQllb2wgPSBlb2Y7Ci0JZWxzZQotCQkrK2VvbDsJCS8qIHdlJ3JlIGludGVyZXN0ZWQgaW4gdGhlIHBvc2l0aW9uIGFmdGVyIHRoZQotCQkJCSAgIG5ld2xpbmUuICovCi0JcmVzdWx0ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoc3RhcnQsIChlb2wgLSBzdGFydCkpOwotCXNlbGYtPnBvcyArPSAoZW9sIC0gc3RhcnQpOwotCXJldHVybiByZXN1bHQ7CisgICAgZW9sID0gbWVtY2hyKHN0YXJ0LCAnXG4nLCBzZWxmLT5zaXplIC0gc2VsZi0+cG9zKTsKKyAgICBpZiAoIWVvbCkKKyAgICAgICAgZW9sID0gZW9mOworICAgIGVsc2UKKyAgICAgICAgKytlb2w7ICAgICAgICAgICAgICAgICAgLyogd2UncmUgaW50ZXJlc3RlZCBpbiB0aGUgcG9zaXRpb24gYWZ0ZXIgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdsaW5lLiAqLworICAgIHJlc3VsdCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHN0YXJ0LCAoZW9sIC0gc3RhcnQpKTsKKyAgICBzZWxmLT5wb3MgKz0gKGVvbCAtIHN0YXJ0KTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbW1hcF9yZWFkX21ldGhvZChtbWFwX29iamVjdCAqc2VsZiwKLQkJIFB5T2JqZWN0ICphcmdzKQorICAgICAgICAgICAgICAgICBQeU9iamVjdCAqYXJncykKIHsKLQlQeV9zc2l6ZV90IG51bV9ieXRlcywgbjsKLQlQeU9iamVjdCAqcmVzdWx0OworICAgIFB5X3NzaXplX3QgbnVtX2J5dGVzLCBuOworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CiAKLQlDSEVDS19WQUxJRChOVUxMKTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIm46cmVhZCIsICZudW1fYnl0ZXMpKQotCQlyZXR1cm4oTlVMTCk7CisgICAgQ0hFQ0tfVkFMSUQoTlVMTCk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJuOnJlYWQiLCAmbnVtX2J5dGVzKSkKKyAgICAgICAgcmV0dXJuKE5VTEwpOwogCi0JLyogc2lsZW50bHkgJ2FkanVzdCcgb3V0LW9mLXJhbmdlIHJlcXVlc3RzICovCi0JYXNzZXJ0KHNlbGYtPnNpemUgPj0gc2VsZi0+cG9zKTsKLQluID0gc2VsZi0+c2l6ZSAtIHNlbGYtPnBvczsKLQkvKiBUaGUgZGlmZmVyZW5jZSBjYW4gb3ZlcmZsb3csIG9ubHkgaWYgc2VsZi0+c2l6ZSBpcyBncmVhdGVyIHRoYW4KLQkgKiBQWV9TU0laRV9UX01BWC4gIEJ1dCB0aGVuIHRoZSBvcGVyYXRpb24gY2Fubm90IHBvc3NpYmx5IHN1Y2NlZWQsCi0JICogYmVjYXVzZSB0aGUgbWFwcGVkIGFyZWEgYW5kIHRoZSByZXR1cm5lZCBzdHJpbmcgZWFjaCBuZWVkIG1vcmUgCi0JICogdGhhbiBoYWxmIG9mIHRoZSBhZGRyZXNzYWJsZSBtZW1vcnkuICBTbyB3ZSBjbGlwIHRoZSBzaXplLCBhbmQgbGV0Ci0JICogdGhlIGNvZGUgYmVsb3cgcmFpc2UgTWVtb3J5RXJyb3IuCi0JICovCi0JaWYgKG4gPCAwKQotCQluID0gUFlfU1NJWkVfVF9NQVg7Ci0JaWYgKG51bV9ieXRlcyA8IDAgfHwgbnVtX2J5dGVzID4gbikgewotCQludW1fYnl0ZXMgPSBuOwotCX0KLQlyZXN1bHQgPSBQeV9CdWlsZFZhbHVlKCJzIyIsIHNlbGYtPmRhdGErc2VsZi0+cG9zLCBudW1fYnl0ZXMpOwotCXNlbGYtPnBvcyArPSBudW1fYnl0ZXM7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICAvKiBzaWxlbnRseSAnYWRqdXN0JyBvdXQtb2YtcmFuZ2UgcmVxdWVzdHMgKi8KKyAgICBhc3NlcnQoc2VsZi0+c2l6ZSA+PSBzZWxmLT5wb3MpOworICAgIG4gPSBzZWxmLT5zaXplIC0gc2VsZi0+cG9zOworICAgIC8qIFRoZSBkaWZmZXJlbmNlIGNhbiBvdmVyZmxvdywgb25seSBpZiBzZWxmLT5zaXplIGlzIGdyZWF0ZXIgdGhhbgorICAgICAqIFBZX1NTSVpFX1RfTUFYLiAgQnV0IHRoZW4gdGhlIG9wZXJhdGlvbiBjYW5ub3QgcG9zc2libHkgc3VjY2VlZCwKKyAgICAgKiBiZWNhdXNlIHRoZSBtYXBwZWQgYXJlYSBhbmQgdGhlIHJldHVybmVkIHN0cmluZyBlYWNoIG5lZWQgbW9yZQorICAgICAqIHRoYW4gaGFsZiBvZiB0aGUgYWRkcmVzc2FibGUgbWVtb3J5LiAgU28gd2UgY2xpcCB0aGUgc2l6ZSwgYW5kIGxldAorICAgICAqIHRoZSBjb2RlIGJlbG93IHJhaXNlIE1lbW9yeUVycm9yLgorICAgICAqLworICAgIGlmIChuIDwgMCkKKyAgICAgICAgbiA9IFBZX1NTSVpFX1RfTUFYOworICAgIGlmIChudW1fYnl0ZXMgPCAwIHx8IG51bV9ieXRlcyA+IG4pIHsKKyAgICAgICAgbnVtX2J5dGVzID0gbjsKKyAgICB9CisgICAgcmVzdWx0ID0gUHlfQnVpbGRWYWx1ZSgicyMiLCBzZWxmLT5kYXRhK3NlbGYtPnBvcywgbnVtX2J5dGVzKTsKKyAgICBzZWxmLT5wb3MgKz0gbnVtX2J5dGVzOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBtbWFwX2dmaW5kKG1tYXBfb2JqZWN0ICpzZWxmLAotCSAgIFB5T2JqZWN0ICphcmdzLAotCSAgIGludCByZXZlcnNlKQorICAgICAgICAgICBQeU9iamVjdCAqYXJncywKKyAgICAgICAgICAgaW50IHJldmVyc2UpCiB7Ci0JUHlfc3NpemVfdCBzdGFydCA9IHNlbGYtPnBvczsKLQlQeV9zc2l6ZV90IGVuZCA9IHNlbGYtPnNpemU7Ci0JY29uc3QgY2hhciAqbmVlZGxlOwotCVB5X3NzaXplX3QgbGVuOworICAgIFB5X3NzaXplX3Qgc3RhcnQgPSBzZWxmLT5wb3M7CisgICAgUHlfc3NpemVfdCBlbmQgPSBzZWxmLT5zaXplOworICAgIGNvbnN0IGNoYXIgKm5lZWRsZTsKKyAgICBQeV9zc2l6ZV90IGxlbjsKIAotCUNIRUNLX1ZBTElEKE5VTEwpOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCByZXZlcnNlID8gInMjfG5uOnJmaW5kIiA6ICJzI3xubjpmaW5kIiwKLQkJCSAgICAgICZuZWVkbGUsICZsZW4sICZzdGFydCwgJmVuZCkpIHsKLQkJcmV0dXJuIE5VTEw7Ci0JfSBlbHNlIHsKLQkJY29uc3QgY2hhciAqcCwgKnN0YXJ0X3AsICplbmRfcDsKLQkJaW50IHNpZ24gPSByZXZlcnNlID8gLTEgOiAxOworICAgIENIRUNLX1ZBTElEKE5VTEwpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCByZXZlcnNlID8gInMjfG5uOnJmaW5kIiA6ICJzI3xubjpmaW5kIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm5lZWRsZSwgJmxlbiwgJnN0YXJ0LCAmZW5kKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9IGVsc2UgeworICAgICAgICBjb25zdCBjaGFyICpwLCAqc3RhcnRfcCwgKmVuZF9wOworICAgICAgICBpbnQgc2lnbiA9IHJldmVyc2UgPyAtMSA6IDE7CiAKLSAgICAgICAgICAgICAgICBpZiAoc3RhcnQgPCAwKQotCQkJc3RhcnQgKz0gc2VsZi0+c2l6ZTsKLSAgICAgICAgICAgICAgICBpZiAoc3RhcnQgPCAwKQotCQkJc3RhcnQgPSAwOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKChzaXplX3Qpc3RhcnQgPiBzZWxmLT5zaXplKQotCQkJc3RhcnQgPSBzZWxmLT5zaXplOworICAgICAgICBpZiAoc3RhcnQgPCAwKQorICAgICAgICAgICAgc3RhcnQgKz0gc2VsZi0+c2l6ZTsKKyAgICAgICAgaWYgKHN0YXJ0IDwgMCkKKyAgICAgICAgICAgIHN0YXJ0ID0gMDsKKyAgICAgICAgZWxzZSBpZiAoKHNpemVfdClzdGFydCA+IHNlbGYtPnNpemUpCisgICAgICAgICAgICBzdGFydCA9IHNlbGYtPnNpemU7CiAKLSAgICAgICAgICAgICAgICBpZiAoZW5kIDwgMCkKLQkJCWVuZCArPSBzZWxmLT5zaXplOwotCQlpZiAoZW5kIDwgMCkKLQkJCWVuZCA9IDA7Ci0JCWVsc2UgaWYgKChzaXplX3QpZW5kID4gc2VsZi0+c2l6ZSkKLQkJCWVuZCA9IHNlbGYtPnNpemU7CisgICAgICAgIGlmIChlbmQgPCAwKQorICAgICAgICAgICAgZW5kICs9IHNlbGYtPnNpemU7CisgICAgICAgIGlmIChlbmQgPCAwKQorICAgICAgICAgICAgZW5kID0gMDsKKyAgICAgICAgZWxzZSBpZiAoKHNpemVfdCllbmQgPiBzZWxmLT5zaXplKQorICAgICAgICAgICAgZW5kID0gc2VsZi0+c2l6ZTsKIAotCQlzdGFydF9wID0gc2VsZi0+ZGF0YSArIHN0YXJ0OwotCQllbmRfcCA9IHNlbGYtPmRhdGEgKyBlbmQ7CisgICAgICAgIHN0YXJ0X3AgPSBzZWxmLT5kYXRhICsgc3RhcnQ7CisgICAgICAgIGVuZF9wID0gc2VsZi0+ZGF0YSArIGVuZDsKIAotCQlmb3IgKHAgPSAocmV2ZXJzZSA/IGVuZF9wIC0gbGVuIDogc3RhcnRfcCk7Ci0JCSAgICAgKHAgPj0gc3RhcnRfcCkgJiYgKHAgKyBsZW4gPD0gZW5kX3ApOyBwICs9IHNpZ24pIHsKLQkJCVB5X3NzaXplX3QgaTsKLQkJCWZvciAoaSA9IDA7IGkgPCBsZW4gJiYgbmVlZGxlW2ldID09IHBbaV07ICsraSkKLQkJCQkvKiBub3RoaW5nICovOwotCQkJaWYgKGkgPT0gbGVuKSB7Ci0JCQkJcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KHAgLSBzZWxmLT5kYXRhKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoLTEpOwotCX0KKyAgICAgICAgZm9yIChwID0gKHJldmVyc2UgPyBlbmRfcCAtIGxlbiA6IHN0YXJ0X3ApOworICAgICAgICAgICAgIChwID49IHN0YXJ0X3ApICYmIChwICsgbGVuIDw9IGVuZF9wKTsgcCArPSBzaWduKSB7CisgICAgICAgICAgICBQeV9zc2l6ZV90IGk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuICYmIG5lZWRsZVtpXSA9PSBwW2ldOyArK2kpCisgICAgICAgICAgICAgICAgLyogbm90aGluZyAqLzsKKyAgICAgICAgICAgIGlmIChpID09IGxlbikgeworICAgICAgICAgICAgICAgIHJldHVybiBQeUludF9Gcm9tU3NpemVfdChwIC0gc2VsZi0+ZGF0YSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKC0xKTsKKyAgICB9CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBtbWFwX2ZpbmRfbWV0aG9kKG1tYXBfb2JqZWN0ICpzZWxmLAotCQkgUHlPYmplY3QgKmFyZ3MpCisgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBtbWFwX2dmaW5kKHNlbGYsIGFyZ3MsIDApOworICAgIHJldHVybiBtbWFwX2dmaW5kKHNlbGYsIGFyZ3MsIDApOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbW1hcF9yZmluZF9tZXRob2QobW1hcF9vYmplY3QgKnNlbGYsCi0JCSBQeU9iamVjdCAqYXJncykKKyAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIG1tYXBfZ2ZpbmQoc2VsZiwgYXJncywgMSk7CisgICAgcmV0dXJuIG1tYXBfZ2ZpbmQoc2VsZiwgYXJncywgMSk7CiB9CiAKIHN0YXRpYyBpbnQKIGlzX3dyaXRlYWJsZShtbWFwX29iamVjdCAqc2VsZikKIHsKLQlpZiAoc2VsZi0+YWNjZXNzICE9IEFDQ0VTU19SRUFEKQotCQlyZXR1cm4gMTsKLQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAibW1hcCBjYW4ndCBtb2RpZnkgYSByZWFkb25seSBtZW1vcnkgbWFwLiIpOwotCXJldHVybiAwOworICAgIGlmIChzZWxmLT5hY2Nlc3MgIT0gQUNDRVNTX1JFQUQpCisgICAgICAgIHJldHVybiAxOworICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICJtbWFwIGNhbid0IG1vZGlmeSBhIHJlYWRvbmx5IG1lbW9yeSBtYXAuIik7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIGlzX3Jlc2l6ZWFibGUobW1hcF9vYmplY3QgKnNlbGYpCiB7Ci0JaWYgKChzZWxmLT5hY2Nlc3MgPT0gQUNDRVNTX1dSSVRFKSB8fCAoc2VsZi0+YWNjZXNzID09IEFDQ0VTU19ERUZBVUxUKSkKLQkJcmV0dXJuIDE7Ci0JUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJICAgICAibW1hcCBjYW4ndCByZXNpemUgYSByZWFkb25seSBvciBjb3B5LW9uLXdyaXRlIG1lbW9yeSBtYXAuIik7Ci0JcmV0dXJuIDA7CisgICAgaWYgKChzZWxmLT5hY2Nlc3MgPT0gQUNDRVNTX1dSSVRFKSB8fCAoc2VsZi0+YWNjZXNzID09IEFDQ0VTU19ERUZBVUxUKSkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgIm1tYXAgY2FuJ3QgcmVzaXplIGEgcmVhZG9ubHkgb3IgY29weS1vbi13cml0ZSBtZW1vcnkgbWFwLiIpOworICAgIHJldHVybiAwOwogfQogCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBtbWFwX3dyaXRlX21ldGhvZChtbWFwX29iamVjdCAqc2VsZiwKLQkJICBQeU9iamVjdCAqYXJncykKKyAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICphcmdzKQogewotCVB5X3NzaXplX3QgbGVuZ3RoOwotCWNoYXIgKmRhdGE7CisgICAgUHlfc3NpemVfdCBsZW5ndGg7CisgICAgY2hhciAqZGF0YTsKIAotCUNIRUNLX1ZBTElEKE5VTEwpOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyM6d3JpdGUiLCAmZGF0YSwgJmxlbmd0aCkpCi0JCXJldHVybihOVUxMKTsKKyAgICBDSEVDS19WQUxJRChOVUxMKTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjOndyaXRlIiwgJmRhdGEsICZsZW5ndGgpKQorICAgICAgICByZXR1cm4oTlVMTCk7CiAKLQlpZiAoIWlzX3dyaXRlYWJsZShzZWxmKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFpc193cml0ZWFibGUoc2VsZikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKChzZWxmLT5wb3MgKyBsZW5ndGgpID4gc2VsZi0+c2l6ZSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImRhdGEgb3V0IG9mIHJhbmdlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQltZW1jcHkoc2VsZi0+ZGF0YStzZWxmLT5wb3MsIGRhdGEsIGxlbmd0aCk7Ci0Jc2VsZi0+cG9zID0gc2VsZi0+cG9zK2xlbmd0aDsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKChzZWxmLT5wb3MgKyBsZW5ndGgpID4gc2VsZi0+c2l6ZSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImRhdGEgb3V0IG9mIHJhbmdlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBtZW1jcHkoc2VsZi0+ZGF0YStzZWxmLT5wb3MsIGRhdGEsIGxlbmd0aCk7CisgICAgc2VsZi0+cG9zID0gc2VsZi0+cG9zK2xlbmd0aDsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBtbWFwX3dyaXRlX2J5dGVfbWV0aG9kKG1tYXBfb2JqZWN0ICpzZWxmLAotCQkgICAgICAgUHlPYmplY3QgKmFyZ3MpCisgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgdmFsdWU7CisgICAgY2hhciB2YWx1ZTsKIAotCUNIRUNLX1ZBTElEKE5VTEwpOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiYzp3cml0ZV9ieXRlIiwgJnZhbHVlKSkKLQkJcmV0dXJuKE5VTEwpOworICAgIENIRUNLX1ZBTElEKE5VTEwpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiYzp3cml0ZV9ieXRlIiwgJnZhbHVlKSkKKyAgICAgICAgcmV0dXJuKE5VTEwpOwogCi0JaWYgKCFpc193cml0ZWFibGUoc2VsZikpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghaXNfd3JpdGVhYmxlKHNlbGYpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChzZWxmLT5wb3MgPCBzZWxmLT5zaXplKSB7Ci0JCSooc2VsZi0+ZGF0YStzZWxmLT5wb3MpID0gdmFsdWU7Ci0JCXNlbGYtPnBvcyArPSAxOwotCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCXJldHVybiBQeV9Ob25lOwotCX0KLQllbHNlIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJ3cml0ZSBieXRlIG91dCBvZiByYW5nZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKHNlbGYtPnBvcyA8IHNlbGYtPnNpemUpIHsKKyAgICAgICAgKihzZWxmLT5kYXRhK3NlbGYtPnBvcykgPSB2YWx1ZTsKKyAgICAgICAgc2VsZi0+cG9zICs9IDE7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIndyaXRlIGJ5dGUgb3V0IG9mIHJhbmdlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG1tYXBfc2l6ZV9tZXRob2QobW1hcF9vYmplY3QgKnNlbGYsCi0JCSBQeU9iamVjdCAqdW51c2VkKQorICAgICAgICAgICAgICAgICBQeU9iamVjdCAqdW51c2VkKQogewotCUNIRUNLX1ZBTElEKE5VTEwpOworICAgIENIRUNLX1ZBTElEKE5VTEwpOwogCiAjaWZkZWYgTVNfV0lORE9XUwotCWlmIChzZWxmLT5maWxlX2hhbmRsZSAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgewotCQlEV09SRCBsb3csaGlnaDsKLQkJUFlfTE9OR19MT05HIHNpemU7Ci0JCWxvdyA9IEdldEZpbGVTaXplKHNlbGYtPmZpbGVfaGFuZGxlLCAmaGlnaCk7Ci0JCWlmIChsb3cgPT0gSU5WQUxJRF9GSUxFX1NJWkUpIHsKLQkJCS8qIEl0IG1pZ2h0IGJlIHRoYXQgdGhlIGZ1bmN0aW9uIGFwcGVhcnMgdG8gaGF2ZSBmYWlsZWQsCi0JCQkgICB3aGVuIGluZGVlZCBpdHMgc2l6ZSBlcXVhbHMgSU5WQUxJRF9GSUxFX1NJWkUgKi8KLQkJCURXT1JEIGVycm9yID0gR2V0TGFzdEVycm9yKCk7Ci0JCQlpZiAoZXJyb3IgIT0gTk9fRVJST1IpCi0JCQkJcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyKGVycm9yKTsKLQkJfQotCQlpZiAoIWhpZ2ggJiYgbG93IDwgTE9OR19NQVgpCi0JCQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpbG93KTsKLQkJc2l6ZSA9ICgoKFBZX0xPTkdfTE9ORyloaWdoKTw8MzIpICsgbG93OwotCQlyZXR1cm4gUHlMb25nX0Zyb21Mb25nTG9uZyhzaXplKTsKLQl9IGVsc2UgewotCQlyZXR1cm4gUHlJbnRfRnJvbVNzaXplX3Qoc2VsZi0+c2l6ZSk7Ci0JfQorICAgIGlmIChzZWxmLT5maWxlX2hhbmRsZSAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgeworICAgICAgICBEV09SRCBsb3csaGlnaDsKKyAgICAgICAgUFlfTE9OR19MT05HIHNpemU7CisgICAgICAgIGxvdyA9IEdldEZpbGVTaXplKHNlbGYtPmZpbGVfaGFuZGxlLCAmaGlnaCk7CisgICAgICAgIGlmIChsb3cgPT0gSU5WQUxJRF9GSUxFX1NJWkUpIHsKKyAgICAgICAgICAgIC8qIEl0IG1pZ2h0IGJlIHRoYXQgdGhlIGZ1bmN0aW9uIGFwcGVhcnMgdG8gaGF2ZSBmYWlsZWQsCisgICAgICAgICAgICAgICB3aGVuIGluZGVlZCBpdHMgc2l6ZSBlcXVhbHMgSU5WQUxJRF9GSUxFX1NJWkUgKi8KKyAgICAgICAgICAgIERXT1JEIGVycm9yID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgICAgICBpZiAoZXJyb3IgIT0gTk9fRVJST1IpCisgICAgICAgICAgICAgICAgcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyKGVycm9yKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWhpZ2ggJiYgbG93IDwgTE9OR19NQVgpCisgICAgICAgICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpbG93KTsKKyAgICAgICAgc2l6ZSA9ICgoKFBZX0xPTkdfTE9ORyloaWdoKTw8MzIpICsgbG93OworICAgICAgICByZXR1cm4gUHlMb25nX0Zyb21Mb25nTG9uZyhzaXplKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gUHlJbnRfRnJvbVNzaXplX3Qoc2VsZi0+c2l6ZSk7CisgICAgfQogI2VuZGlmIC8qIE1TX1dJTkRPV1MgKi8KIAogI2lmZGVmIFVOSVgKLQl7Ci0JCXN0cnVjdCBzdGF0IGJ1ZjsKLQkJaWYgKC0xID09IGZzdGF0KHNlbGYtPmZkLCAmYnVmKSkgewotCQkJUHlFcnJfU2V0RnJvbUVycm5vKG1tYXBfbW9kdWxlX2Vycm9yKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCXJldHVybiBQeUludF9Gcm9tU3NpemVfdChidWYuc3Rfc2l6ZSk7Ci0JfQorICAgIHsKKyAgICAgICAgc3RydWN0IHN0YXQgYnVmOworICAgICAgICBpZiAoLTEgPT0gZnN0YXQoc2VsZi0+ZmQsICZidWYpKSB7CisgICAgICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8obW1hcF9tb2R1bGVfZXJyb3IpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KGJ1Zi5zdF9zaXplKTsKKyAgICB9CiAjZW5kaWYgLyogVU5JWCAqLwogfQogCkBAIC00MzksMjIzICs0MzksMjIzIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqCiBtbWFwX3Jlc2l6ZV9tZXRob2QobW1hcF9vYmplY3QgKnNlbGYsCi0JCSAgIFB5T2JqZWN0ICphcmdzKQorICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICphcmdzKQogewotCVB5X3NzaXplX3QgbmV3X3NpemU7Ci0JQ0hFQ0tfVkFMSUQoTlVMTCk7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJuOnJlc2l6ZSIsICZuZXdfc2l6ZSkgfHwKLQkgICAgIWlzX3Jlc2l6ZWFibGUoc2VsZikpIHsKLQkJcmV0dXJuIE5VTEw7CisgICAgUHlfc3NpemVfdCBuZXdfc2l6ZTsKKyAgICBDSEVDS19WQUxJRChOVUxMKTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIm46cmVzaXplIiwgJm5ld19zaXplKSB8fAorICAgICAgICAhaXNfcmVzaXplYWJsZShzZWxmKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKICNpZmRlZiBNU19XSU5ET1dTCi0JfSBlbHNlIHsKLQkJRFdPUkQgZHdFcnJDb2RlID0gMDsKLQkJRFdPUkQgb2ZmX2hpLCBvZmZfbG8sIG5ld1NpemVMb3csIG5ld1NpemVIaWdoOwotCQkvKiBGaXJzdCwgdW5tYXAgdGhlIGZpbGUgdmlldyAqLwotCQlVbm1hcFZpZXdPZkZpbGUoc2VsZi0+ZGF0YSk7Ci0JCXNlbGYtPmRhdGEgPSBOVUxMOwotCQkvKiBDbG9zZSB0aGUgbWFwcGluZyBvYmplY3QgKi8KLQkJQ2xvc2VIYW5kbGUoc2VsZi0+bWFwX2hhbmRsZSk7Ci0JCXNlbGYtPm1hcF9oYW5kbGUgPSBOVUxMOwotCQkvKiBNb3ZlIHRvIHRoZSBkZXNpcmVkIEVPRiBwb3NpdGlvbiAqLworICAgIH0gZWxzZSB7CisgICAgICAgIERXT1JEIGR3RXJyQ29kZSA9IDA7CisgICAgICAgIERXT1JEIG9mZl9oaSwgb2ZmX2xvLCBuZXdTaXplTG93LCBuZXdTaXplSGlnaDsKKyAgICAgICAgLyogRmlyc3QsIHVubWFwIHRoZSBmaWxlIHZpZXcgKi8KKyAgICAgICAgVW5tYXBWaWV3T2ZGaWxlKHNlbGYtPmRhdGEpOworICAgICAgICBzZWxmLT5kYXRhID0gTlVMTDsKKyAgICAgICAgLyogQ2xvc2UgdGhlIG1hcHBpbmcgb2JqZWN0ICovCisgICAgICAgIENsb3NlSGFuZGxlKHNlbGYtPm1hcF9oYW5kbGUpOworICAgICAgICBzZWxmLT5tYXBfaGFuZGxlID0gTlVMTDsKKyAgICAgICAgLyogTW92ZSB0byB0aGUgZGVzaXJlZCBFT0YgcG9zaXRpb24gKi8KICNpZiBTSVpFT0ZfU0laRV9UID4gNAotCQluZXdTaXplSGlnaCA9IChEV09SRCkoKHNlbGYtPm9mZnNldCArIG5ld19zaXplKSA+PiAzMik7Ci0JCW5ld1NpemVMb3cgPSAoRFdPUkQpKChzZWxmLT5vZmZzZXQgKyBuZXdfc2l6ZSkgJiAweEZGRkZGRkZGKTsKLQkJb2ZmX2hpID0gKERXT1JEKShzZWxmLT5vZmZzZXQgPj4gMzIpOwotCQlvZmZfbG8gPSAoRFdPUkQpKHNlbGYtPm9mZnNldCAmIDB4RkZGRkZGRkYpOworICAgICAgICBuZXdTaXplSGlnaCA9IChEV09SRCkoKHNlbGYtPm9mZnNldCArIG5ld19zaXplKSA+PiAzMik7CisgICAgICAgIG5ld1NpemVMb3cgPSAoRFdPUkQpKChzZWxmLT5vZmZzZXQgKyBuZXdfc2l6ZSkgJiAweEZGRkZGRkZGKTsKKyAgICAgICAgb2ZmX2hpID0gKERXT1JEKShzZWxmLT5vZmZzZXQgPj4gMzIpOworICAgICAgICBvZmZfbG8gPSAoRFdPUkQpKHNlbGYtPm9mZnNldCAmIDB4RkZGRkZGRkYpOwogI2Vsc2UKLQkJbmV3U2l6ZUhpZ2ggPSAwOwotCQluZXdTaXplTG93ID0gKERXT1JEKShzZWxmLT5vZmZzZXQgKyBuZXdfc2l6ZSk7Ci0JCW9mZl9oaSA9IDA7Ci0JCW9mZl9sbyA9IChEV09SRClzZWxmLT5vZmZzZXQ7CisgICAgICAgIG5ld1NpemVIaWdoID0gMDsKKyAgICAgICAgbmV3U2l6ZUxvdyA9IChEV09SRCkoc2VsZi0+b2Zmc2V0ICsgbmV3X3NpemUpOworICAgICAgICBvZmZfaGkgPSAwOworICAgICAgICBvZmZfbG8gPSAoRFdPUkQpc2VsZi0+b2Zmc2V0OwogI2VuZGlmCi0JCVNldEZpbGVQb2ludGVyKHNlbGYtPmZpbGVfaGFuZGxlLAotCQkJICAgICAgIG5ld1NpemVMb3csICZuZXdTaXplSGlnaCwgRklMRV9CRUdJTik7Ci0JCS8qIENoYW5nZSB0aGUgc2l6ZSBvZiB0aGUgZmlsZSAqLwotCQlTZXRFbmRPZkZpbGUoc2VsZi0+ZmlsZV9oYW5kbGUpOwotCQkvKiBDcmVhdGUgYW5vdGhlciBtYXBwaW5nIG9iamVjdCBhbmQgcmVtYXAgdGhlIGZpbGUgdmlldyAqLwotCQlzZWxmLT5tYXBfaGFuZGxlID0gQ3JlYXRlRmlsZU1hcHBpbmcoCi0JCQlzZWxmLT5maWxlX2hhbmRsZSwKLQkJCU5VTEwsCi0JCQlQQUdFX1JFQURXUklURSwKLQkJCTAsCi0JCQkwLAotCQkJc2VsZi0+dGFnbmFtZSk7Ci0JCWlmIChzZWxmLT5tYXBfaGFuZGxlICE9IE5VTEwpIHsKLQkJCXNlbGYtPmRhdGEgPSAoY2hhciAqKSBNYXBWaWV3T2ZGaWxlKHNlbGYtPm1hcF9oYW5kbGUsCi0JCQkJCQkJICAgIEZJTEVfTUFQX1dSSVRFLAotCQkJCQkJCSAgICBvZmZfaGksCi0JCQkJCQkJICAgIG9mZl9sbywKLQkJCQkJCQkgICAgbmV3X3NpemUpOwotCQkJaWYgKHNlbGYtPmRhdGEgIT0gTlVMTCkgewotCQkJCXNlbGYtPnNpemUgPSBuZXdfc2l6ZTsKLQkJCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCQkJcmV0dXJuIFB5X05vbmU7Ci0JCQl9IGVsc2UgewotCQkJCWR3RXJyQ29kZSA9IEdldExhc3RFcnJvcigpOwotCQkJCUNsb3NlSGFuZGxlKHNlbGYtPm1hcF9oYW5kbGUpOwotCQkJCXNlbGYtPm1hcF9oYW5kbGUgPSBOVUxMOwotCQkJfQotCQl9IGVsc2UgewotCQkJZHdFcnJDb2RlID0gR2V0TGFzdEVycm9yKCk7Ci0JCX0KLQkJUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnIoZHdFcnJDb2RlKTsKLQkJcmV0dXJuIE5VTEw7CisgICAgICAgIFNldEZpbGVQb2ludGVyKHNlbGYtPmZpbGVfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICBuZXdTaXplTG93LCAmbmV3U2l6ZUhpZ2gsIEZJTEVfQkVHSU4pOworICAgICAgICAvKiBDaGFuZ2UgdGhlIHNpemUgb2YgdGhlIGZpbGUgKi8KKyAgICAgICAgU2V0RW5kT2ZGaWxlKHNlbGYtPmZpbGVfaGFuZGxlKTsKKyAgICAgICAgLyogQ3JlYXRlIGFub3RoZXIgbWFwcGluZyBvYmplY3QgYW5kIHJlbWFwIHRoZSBmaWxlIHZpZXcgKi8KKyAgICAgICAgc2VsZi0+bWFwX2hhbmRsZSA9IENyZWF0ZUZpbGVNYXBwaW5nKAorICAgICAgICAgICAgc2VsZi0+ZmlsZV9oYW5kbGUsCisgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgUEFHRV9SRUFEV1JJVEUsCisgICAgICAgICAgICAwLAorICAgICAgICAgICAgMCwKKyAgICAgICAgICAgIHNlbGYtPnRhZ25hbWUpOworICAgICAgICBpZiAoc2VsZi0+bWFwX2hhbmRsZSAhPSBOVUxMKSB7CisgICAgICAgICAgICBzZWxmLT5kYXRhID0gKGNoYXIgKikgTWFwVmlld09mRmlsZShzZWxmLT5tYXBfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklMRV9NQVBfV1JJVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZfaGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZfbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfc2l6ZSk7CisgICAgICAgICAgICBpZiAoc2VsZi0+ZGF0YSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgc2VsZi0+c2l6ZSA9IG5ld19zaXplOworICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZHdFcnJDb2RlID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgICAgICAgICAgQ2xvc2VIYW5kbGUoc2VsZi0+bWFwX2hhbmRsZSk7CisgICAgICAgICAgICAgICAgc2VsZi0+bWFwX2hhbmRsZSA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkd0VyckNvZGUgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgfQorICAgICAgICBQeUVycl9TZXRGcm9tV2luZG93c0Vycihkd0VyckNvZGUpOworICAgICAgICByZXR1cm4gTlVMTDsKICNlbmRpZiAvKiBNU19XSU5ET1dTICovCiAKICNpZmRlZiBVTklYCiAjaWZuZGVmIEhBVkVfTVJFTUFQCi0JfSBlbHNlIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAotCQkJCSJtbWFwOiByZXNpemluZyBub3QgYXZhaWxhYmxlLS1ubyBtcmVtYXAoKSIpOwotCQlyZXR1cm4gTlVMTDsKKyAgICB9IGVsc2UgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAibW1hcDogcmVzaXppbmcgbm90IGF2YWlsYWJsZS0tbm8gbXJlbWFwKCkiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAjZWxzZQotCX0gZWxzZSB7Ci0JCXZvaWQgKm5ld21hcDsKKyAgICB9IGVsc2UgeworICAgICAgICB2b2lkICpuZXdtYXA7CiAKLQkJaWYgKGZ0cnVuY2F0ZShzZWxmLT5mZCwgc2VsZi0+b2Zmc2V0ICsgbmV3X3NpemUpID09IC0xKSB7Ci0JCQlQeUVycl9TZXRGcm9tRXJybm8obW1hcF9tb2R1bGVfZXJyb3IpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KKyAgICAgICAgaWYgKGZ0cnVuY2F0ZShzZWxmLT5mZCwgc2VsZi0+b2Zmc2V0ICsgbmV3X3NpemUpID09IC0xKSB7CisgICAgICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8obW1hcF9tb2R1bGVfZXJyb3IpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KIAogI2lmZGVmIE1SRU1BUF9NQVlNT1ZFCi0JCW5ld21hcCA9IG1yZW1hcChzZWxmLT5kYXRhLCBzZWxmLT5zaXplLCBuZXdfc2l6ZSwgTVJFTUFQX01BWU1PVkUpOworICAgICAgICBuZXdtYXAgPSBtcmVtYXAoc2VsZi0+ZGF0YSwgc2VsZi0+c2l6ZSwgbmV3X3NpemUsIE1SRU1BUF9NQVlNT1ZFKTsKICNlbHNlCi0JCSNpZiBkZWZpbmVkKF9fTmV0QlNEX18pCi0JCQluZXdtYXAgPSBtcmVtYXAoc2VsZi0+ZGF0YSwgc2VsZi0+c2l6ZSwgc2VsZi0+ZGF0YSwgbmV3X3NpemUsIDApOwotCQkjZWxzZQotCQkJbmV3bWFwID0gbXJlbWFwKHNlbGYtPmRhdGEsIHNlbGYtPnNpemUsIG5ld19zaXplLCAwKTsKLQkJI2VuZGlmIC8qIF9fTmV0QlNEX18gKi8KKyAgICAgICAgI2lmIGRlZmluZWQoX19OZXRCU0RfXykKKyAgICAgICAgICAgIG5ld21hcCA9IG1yZW1hcChzZWxmLT5kYXRhLCBzZWxmLT5zaXplLCBzZWxmLT5kYXRhLCBuZXdfc2l6ZSwgMCk7CisgICAgICAgICNlbHNlCisgICAgICAgICAgICBuZXdtYXAgPSBtcmVtYXAoc2VsZi0+ZGF0YSwgc2VsZi0+c2l6ZSwgbmV3X3NpemUsIDApOworICAgICAgICAjZW5kaWYgLyogX19OZXRCU0RfXyAqLwogI2VuZGlmCi0JCWlmIChuZXdtYXAgPT0gKHZvaWQgKiktMSkKLQkJewotCQkJUHlFcnJfU2V0RnJvbUVycm5vKG1tYXBfbW9kdWxlX2Vycm9yKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCXNlbGYtPmRhdGEgPSBuZXdtYXA7Ci0JCXNlbGYtPnNpemUgPSBuZXdfc2l6ZTsKLQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQlyZXR1cm4gUHlfTm9uZTsKKyAgICAgICAgaWYgKG5ld21hcCA9PSAodm9pZCAqKS0xKQorICAgICAgICB7CisgICAgICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8obW1hcF9tb2R1bGVfZXJyb3IpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgc2VsZi0+ZGF0YSA9IG5ld21hcDsKKyAgICAgICAgc2VsZi0+c2l6ZSA9IG5ld19zaXplOworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIHJldHVybiBQeV9Ob25lOwogI2VuZGlmIC8qIEhBVkVfTVJFTUFQICovCiAjZW5kaWYgLyogVU5JWCAqLwotCX0KKyAgICB9CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBtbWFwX3RlbGxfbWV0aG9kKG1tYXBfb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdW51c2VkKQogewotCUNIRUNLX1ZBTElEKE5VTEwpOwotCXJldHVybiBQeUludF9Gcm9tU2l6ZV90KHNlbGYtPnBvcyk7CisgICAgQ0hFQ0tfVkFMSUQoTlVMTCk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21TaXplX3Qoc2VsZi0+cG9zKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG1tYXBfZmx1c2hfbWV0aG9kKG1tYXBfb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeV9zc2l6ZV90IG9mZnNldCA9IDA7Ci0JUHlfc3NpemVfdCBzaXplID0gc2VsZi0+c2l6ZTsKLQlDSEVDS19WQUxJRChOVUxMKTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxubjpmbHVzaCIsICZvZmZzZXQsICZzaXplKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKChzaXplX3QpKG9mZnNldCArIHNpemUpID4gc2VsZi0+c2l6ZSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImZsdXNoIHZhbHVlcyBvdXQgb2YgcmFuZ2UiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIFB5X3NzaXplX3Qgb2Zmc2V0ID0gMDsKKyAgICBQeV9zc2l6ZV90IHNpemUgPSBzZWxmLT5zaXplOworICAgIENIRUNLX1ZBTElEKE5VTEwpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifG5uOmZsdXNoIiwgJm9mZnNldCwgJnNpemUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoKHNpemVfdCkob2Zmc2V0ICsgc2l6ZSkgPiBzZWxmLT5zaXplKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiZmx1c2ggdmFsdWVzIG91dCBvZiByYW5nZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAjaWZkZWYgTVNfV0lORE9XUwotCXJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZykgRmx1c2hWaWV3T2ZGaWxlKHNlbGYtPmRhdGErb2Zmc2V0LCBzaXplKSk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKSBGbHVzaFZpZXdPZkZpbGUoc2VsZi0+ZGF0YStvZmZzZXQsIHNpemUpKTsKICNlbGlmIGRlZmluZWQoVU5JWCkKLQkvKiBYWFggc2VtYW50aWNzIG9mIHJldHVybiB2YWx1ZT8gKi8KLQkvKiBYWFggZmxhZ3MgZm9yIG1zeW5jPyAqLwotCWlmICgtMSA9PSBtc3luYyhzZWxmLT5kYXRhICsgb2Zmc2V0LCBzaXplLCBNU19TWU5DKSkgewotCQlQeUVycl9TZXRGcm9tRXJybm8obW1hcF9tb2R1bGVfZXJyb3IpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKDApOworICAgIC8qIFhYWCBzZW1hbnRpY3Mgb2YgcmV0dXJuIHZhbHVlPyAqLworICAgIC8qIFhYWCBmbGFncyBmb3IgbXN5bmM/ICovCisgICAgaWYgKC0xID09IG1zeW5jKHNlbGYtPmRhdGEgKyBvZmZzZXQsIHNpemUsIE1TX1NZTkMpKSB7CisgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhtbWFwX21vZHVsZV9lcnJvcik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoMCk7CiAjZWxzZQotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiZmx1c2ggbm90IHN1cHBvcnRlZCBvbiB0aGlzIHN5c3RlbSIpOwotCXJldHVybiBOVUxMOworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiZmx1c2ggbm90IHN1cHBvcnRlZCBvbiB0aGlzIHN5c3RlbSIpOworICAgIHJldHVybiBOVUxMOwogI2VuZGlmCiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBtbWFwX3NlZWtfbWV0aG9kKG1tYXBfb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeV9zc2l6ZV90IGRpc3Q7Ci0JaW50IGhvdz0wOwotCUNIRUNLX1ZBTElEKE5VTEwpOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibnxpOnNlZWsiLCAmZGlzdCwgJmhvdykpCi0JCXJldHVybiBOVUxMOwotCWVsc2UgewotCQlzaXplX3Qgd2hlcmU7Ci0JCXN3aXRjaCAoaG93KSB7Ci0JCWNhc2UgMDogLyogcmVsYXRpdmUgdG8gc3RhcnQgKi8KLQkJCWlmIChkaXN0IDwgMCkKLQkJCQlnb3RvIG9ub3V0b2ZyYW5nZTsKLQkJCXdoZXJlID0gZGlzdDsKLQkJCWJyZWFrOwotCQljYXNlIDE6IC8qIHJlbGF0aXZlIHRvIGN1cnJlbnQgcG9zaXRpb24gKi8KLQkJCWlmICgoUHlfc3NpemVfdClzZWxmLT5wb3MgKyBkaXN0IDwgMCkKLQkJCQlnb3RvIG9ub3V0b2ZyYW5nZTsKLQkJCXdoZXJlID0gc2VsZi0+cG9zICsgZGlzdDsKLQkJCWJyZWFrOwotCQljYXNlIDI6IC8qIHJlbGF0aXZlIHRvIGVuZCAqLwotCQkJaWYgKChQeV9zc2l6ZV90KXNlbGYtPnNpemUgKyBkaXN0IDwgMCkKLQkJCQlnb3RvIG9ub3V0b2ZyYW5nZTsKLQkJCXdoZXJlID0gc2VsZi0+c2l6ZSArIGRpc3Q7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAidW5rbm93biBzZWVrIHR5cGUiKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWlmICh3aGVyZSA+IHNlbGYtPnNpemUpCi0JCQlnb3RvIG9ub3V0b2ZyYW5nZTsKLQkJc2VsZi0+cG9zID0gd2hlcmU7Ci0JCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJcmV0dXJuIFB5X05vbmU7Ci0JfQorICAgIFB5X3NzaXplX3QgZGlzdDsKKyAgICBpbnQgaG93PTA7CisgICAgQ0hFQ0tfVkFMSUQoTlVMTCk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJufGk6c2VlayIsICZkaXN0LCAmaG93KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZWxzZSB7CisgICAgICAgIHNpemVfdCB3aGVyZTsKKyAgICAgICAgc3dpdGNoIChob3cpIHsKKyAgICAgICAgY2FzZSAwOiAvKiByZWxhdGl2ZSB0byBzdGFydCAqLworICAgICAgICAgICAgaWYgKGRpc3QgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gb25vdXRvZnJhbmdlOworICAgICAgICAgICAgd2hlcmUgPSBkaXN0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTogLyogcmVsYXRpdmUgdG8gY3VycmVudCBwb3NpdGlvbiAqLworICAgICAgICAgICAgaWYgKChQeV9zc2l6ZV90KXNlbGYtPnBvcyArIGRpc3QgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gb25vdXRvZnJhbmdlOworICAgICAgICAgICAgd2hlcmUgPSBzZWxmLT5wb3MgKyBkaXN0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjogLyogcmVsYXRpdmUgdG8gZW5kICovCisgICAgICAgICAgICBpZiAoKFB5X3NzaXplX3Qpc2VsZi0+c2l6ZSArIGRpc3QgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gb25vdXRvZnJhbmdlOworICAgICAgICAgICAgd2hlcmUgPSBzZWxmLT5zaXplICsgZGlzdDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJ1bmtub3duIHNlZWsgdHlwZSIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHdoZXJlID4gc2VsZi0+c2l6ZSkKKyAgICAgICAgICAgIGdvdG8gb25vdXRvZnJhbmdlOworICAgICAgICBzZWxmLT5wb3MgPSB3aGVyZTsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICB9CiAKICAgb25vdXRvZnJhbmdlOgotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAic2VlayBvdXQgb2YgcmFuZ2UiKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgInNlZWsgb3V0IG9mIHJhbmdlIik7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBtbWFwX21vdmVfbWV0aG9kKG1tYXBfb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQl1bnNpZ25lZCBsb25nIGRlc3QsIHNyYywgY291bnQ7Ci0JQ0hFQ0tfVkFMSUQoTlVMTCk7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJra2s6bW92ZSIsICZkZXN0LCAmc3JjLCAmY291bnQpIHx8Ci0JICAgICFpc193cml0ZWFibGUoc2VsZikpIHsKLQkJcmV0dXJuIE5VTEw7Ci0JfSBlbHNlIHsKLQkJLyogYm91bmRzIGNoZWNrIHRoZSB2YWx1ZXMgKi8KLQkJdW5zaWduZWQgbG9uZyBwb3MgPSBzcmMgPiBkZXN0ID8gc3JjIDogZGVzdDsKLQkJaWYgKHNlbGYtPnNpemUgPCBwb3MgfHwgY291bnQgPiBzZWxmLT5zaXplIC0gcG9zKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkJInNvdXJjZSBvciBkZXN0aW5hdGlvbiBvdXQgb2YgcmFuZ2UiKTsKLQkJCXJldHVybiBOVUxMOwotCQl9IGVsc2UgewotCQkJbWVtbW92ZShzZWxmLT5kYXRhK2Rlc3QsIHNlbGYtPmRhdGErc3JjLCBjb3VudCk7Ci0JCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCQlyZXR1cm4gUHlfTm9uZTsKLQkJfQotCX0KKyAgICB1bnNpZ25lZCBsb25nIGRlc3QsIHNyYywgY291bnQ7CisgICAgQ0hFQ0tfVkFMSUQoTlVMTCk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJra2s6bW92ZSIsICZkZXN0LCAmc3JjLCAmY291bnQpIHx8CisgICAgICAgICFpc193cml0ZWFibGUoc2VsZikpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogYm91bmRzIGNoZWNrIHRoZSB2YWx1ZXMgKi8KKyAgICAgICAgdW5zaWduZWQgbG9uZyBwb3MgPSBzcmMgPiBkZXN0ID8gc3JjIDogZGVzdDsKKyAgICAgICAgaWYgKHNlbGYtPnNpemUgPCBwb3MgfHwgY291bnQgPiBzZWxmLT5zaXplIC0gcG9zKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic291cmNlIG9yIGRlc3RpbmF0aW9uIG91dCBvZiByYW5nZSIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtZW1tb3ZlKHNlbGYtPmRhdGErZGVzdCwgc2VsZi0+ZGF0YStzcmMsIGNvdW50KTsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgICAgIHJldHVybiBQeV9Ob25lOworICAgICAgICB9CisgICAgfQogfQogCiBzdGF0aWMgc3RydWN0IFB5TWV0aG9kRGVmIG1tYXBfb2JqZWN0X21ldGhvZHNbXSA9IHsKLQl7ImNsb3NlIiwJKFB5Q0Z1bmN0aW9uKSBtbWFwX2Nsb3NlX21ldGhvZCwJTUVUSF9OT0FSR1N9LAotCXsiZmluZCIsCShQeUNGdW5jdGlvbikgbW1hcF9maW5kX21ldGhvZCwJCU1FVEhfVkFSQVJHU30sCi0JeyJyZmluZCIsCShQeUNGdW5jdGlvbikgbW1hcF9yZmluZF9tZXRob2QsCU1FVEhfVkFSQVJHU30sCi0JeyJmbHVzaCIsCShQeUNGdW5jdGlvbikgbW1hcF9mbHVzaF9tZXRob2QsCU1FVEhfVkFSQVJHU30sCi0JeyJtb3ZlIiwJKFB5Q0Z1bmN0aW9uKSBtbWFwX21vdmVfbWV0aG9kLAkJTUVUSF9WQVJBUkdTfSwKLQl7InJlYWQiLAkoUHlDRnVuY3Rpb24pIG1tYXBfcmVhZF9tZXRob2QsCQlNRVRIX1ZBUkFSR1N9LAotCXsicmVhZF9ieXRlIiwJKFB5Q0Z1bmN0aW9uKSBtbWFwX3JlYWRfYnl0ZV9tZXRob2QsICAJTUVUSF9OT0FSR1N9LAotCXsicmVhZGxpbmUiLAkoUHlDRnVuY3Rpb24pIG1tYXBfcmVhZF9saW5lX21ldGhvZCwJTUVUSF9OT0FSR1N9LAotCXsicmVzaXplIiwJKFB5Q0Z1bmN0aW9uKSBtbWFwX3Jlc2l6ZV9tZXRob2QsCU1FVEhfVkFSQVJHU30sCi0JeyJzZWVrIiwJKFB5Q0Z1bmN0aW9uKSBtbWFwX3NlZWtfbWV0aG9kLAkJTUVUSF9WQVJBUkdTfSwKLQl7InNpemUiLAkoUHlDRnVuY3Rpb24pIG1tYXBfc2l6ZV9tZXRob2QsCQlNRVRIX05PQVJHU30sCi0JeyJ0ZWxsIiwJKFB5Q0Z1bmN0aW9uKSBtbWFwX3RlbGxfbWV0aG9kLAkJTUVUSF9OT0FSR1N9LAotCXsid3JpdGUiLAkoUHlDRnVuY3Rpb24pIG1tYXBfd3JpdGVfbWV0aG9kLAlNRVRIX1ZBUkFSR1N9LAotCXsid3JpdGVfYnl0ZSIsCShQeUNGdW5jdGlvbikgbW1hcF93cml0ZV9ieXRlX21ldGhvZCwJTUVUSF9WQVJBUkdTfSwKLQl7TlVMTCwJICAgTlVMTH0gICAgICAgLyogc2VudGluZWwgKi8KKyAgICB7ImNsb3NlIiwgICAgICAgICAgIChQeUNGdW5jdGlvbikgbW1hcF9jbG9zZV9tZXRob2QsICAgICAgICBNRVRIX05PQVJHU30sCisgICAgeyJmaW5kIiwgICAgICAgICAgICAoUHlDRnVuY3Rpb24pIG1tYXBfZmluZF9tZXRob2QsICAgICAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7InJmaW5kIiwgICAgICAgICAgIChQeUNGdW5jdGlvbikgbW1hcF9yZmluZF9tZXRob2QsICAgICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsiZmx1c2giLCAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKSBtbWFwX2ZsdXNoX21ldGhvZCwgICAgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJtb3ZlIiwgICAgICAgICAgICAoUHlDRnVuY3Rpb24pIG1tYXBfbW92ZV9tZXRob2QsICAgICAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7InJlYWQiLCAgICAgICAgICAgIChQeUNGdW5jdGlvbikgbW1hcF9yZWFkX21ldGhvZCwgICAgICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsicmVhZF9ieXRlIiwgICAgICAgKFB5Q0Z1bmN0aW9uKSBtbWFwX3JlYWRfYnl0ZV9tZXRob2QsICAgIE1FVEhfTk9BUkdTfSwKKyAgICB7InJlYWRsaW5lIiwgICAgICAgIChQeUNGdW5jdGlvbikgbW1hcF9yZWFkX2xpbmVfbWV0aG9kLCAgICBNRVRIX05PQVJHU30sCisgICAgeyJyZXNpemUiLCAgICAgICAgICAoUHlDRnVuY3Rpb24pIG1tYXBfcmVzaXplX21ldGhvZCwgICAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7InNlZWsiLCAgICAgICAgICAgIChQeUNGdW5jdGlvbikgbW1hcF9zZWVrX21ldGhvZCwgICAgICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsic2l6ZSIsICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKSBtbWFwX3NpemVfbWV0aG9kLCAgICAgICAgIE1FVEhfTk9BUkdTfSwKKyAgICB7InRlbGwiLCAgICAgICAgICAgIChQeUNGdW5jdGlvbikgbW1hcF90ZWxsX21ldGhvZCwgICAgICAgICBNRVRIX05PQVJHU30sCisgICAgeyJ3cml0ZSIsICAgICAgICAgICAoUHlDRnVuY3Rpb24pIG1tYXBfd3JpdGVfbWV0aG9kLCAgICAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7IndyaXRlX2J5dGUiLCAgICAgIChQeUNGdW5jdGlvbikgbW1hcF93cml0ZV9ieXRlX21ldGhvZCwgICBNRVRIX1ZBUkFSR1N9LAorICAgIHtOVUxMLCAgICAgICAgIE5VTEx9ICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiAvKiBGdW5jdGlvbnMgZm9yIHRyZWF0aW5nIGFuIG1tYXAnZWQgZmlsZSBhcyBhIGJ1ZmZlciAqLwpAQCAtNjYzLDMzNyArNjYzLDMzNyBAQAogc3RhdGljIFB5X3NzaXplX3QKIG1tYXBfYnVmZmVyX2dldHJlYWRidWYobW1hcF9vYmplY3QgKnNlbGYsIFB5X3NzaXplX3QgaW5kZXgsIGNvbnN0IHZvaWQgKipwdHIpCiB7Ci0JQ0hFQ0tfVkFMSUQoLTEpOwotCWlmIChpbmRleCAhPSAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKLQkJCQkiQWNjZXNzaW5nIG5vbi1leGlzdGVudCBtbWFwIHNlZ21lbnQiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQkqcHRyID0gc2VsZi0+ZGF0YTsKLQlyZXR1cm4gc2VsZi0+c2l6ZTsKKyAgICBDSEVDS19WQUxJRCgtMSk7CisgICAgaWYgKGluZGV4ICE9IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIkFjY2Vzc2luZyBub24tZXhpc3RlbnQgbW1hcCBzZWdtZW50Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgKnB0ciA9IHNlbGYtPmRhdGE7CisgICAgcmV0dXJuIHNlbGYtPnNpemU7CiB9CiAKIHN0YXRpYyBQeV9zc2l6ZV90CiBtbWFwX2J1ZmZlcl9nZXR3cml0ZWJ1ZihtbWFwX29iamVjdCAqc2VsZiwgUHlfc3NpemVfdCBpbmRleCwgY29uc3Qgdm9pZCAqKnB0cikKIHsKLQlDSEVDS19WQUxJRCgtMSk7Ci0JaWYgKGluZGV4ICE9IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAotCQkJCSJBY2Nlc3Npbmcgbm9uLWV4aXN0ZW50IG1tYXAgc2VnbWVudCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmICghaXNfd3JpdGVhYmxlKHNlbGYpKQotCQlyZXR1cm4gLTE7Ci0JKnB0ciA9IHNlbGYtPmRhdGE7Ci0JcmV0dXJuIHNlbGYtPnNpemU7CisgICAgQ0hFQ0tfVkFMSUQoLTEpOworICAgIGlmIChpbmRleCAhPSAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJBY2Nlc3Npbmcgbm9uLWV4aXN0ZW50IG1tYXAgc2VnbWVudCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICghaXNfd3JpdGVhYmxlKHNlbGYpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgKnB0ciA9IHNlbGYtPmRhdGE7CisgICAgcmV0dXJuIHNlbGYtPnNpemU7CiB9CiAKIHN0YXRpYyBQeV9zc2l6ZV90CiBtbWFwX2J1ZmZlcl9nZXRzZWdjb3VudChtbWFwX29iamVjdCAqc2VsZiwgUHlfc3NpemVfdCAqbGVucCkKIHsKLQlDSEVDS19WQUxJRCgtMSk7Ci0JaWYgKGxlbnApCi0JCSpsZW5wID0gc2VsZi0+c2l6ZTsKLQlyZXR1cm4gMTsKKyAgICBDSEVDS19WQUxJRCgtMSk7CisgICAgaWYgKGxlbnApCisgICAgICAgICpsZW5wID0gc2VsZi0+c2l6ZTsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIFB5X3NzaXplX3QKIG1tYXBfYnVmZmVyX2dldGNoYXJidWZmZXIobW1hcF9vYmplY3QgKnNlbGYsIFB5X3NzaXplX3QgaW5kZXgsIGNvbnN0IHZvaWQgKipwdHIpCiB7Ci0JaWYgKGluZGV4ICE9IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAotCQkJCSJhY2Nlc3Npbmcgbm9uLWV4aXN0ZW50IGJ1ZmZlciBzZWdtZW50Iik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JKnB0ciA9IChjb25zdCBjaGFyICopc2VsZi0+ZGF0YTsKLQlyZXR1cm4gc2VsZi0+c2l6ZTsKKyAgICBpZiAoaW5kZXggIT0gMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiYWNjZXNzaW5nIG5vbi1leGlzdGVudCBidWZmZXIgc2VnbWVudCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgICpwdHIgPSAoY29uc3QgY2hhciAqKXNlbGYtPmRhdGE7CisgICAgcmV0dXJuIHNlbGYtPnNpemU7CiB9CiAKIHN0YXRpYyBQeV9zc2l6ZV90CiBtbWFwX2xlbmd0aChtbWFwX29iamVjdCAqc2VsZikKIHsKLQlDSEVDS19WQUxJRCgtMSk7Ci0JcmV0dXJuIHNlbGYtPnNpemU7CisgICAgQ0hFQ0tfVkFMSUQoLTEpOworICAgIHJldHVybiBzZWxmLT5zaXplOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbW1hcF9pdGVtKG1tYXBfb2JqZWN0ICpzZWxmLCBQeV9zc2l6ZV90IGkpCiB7Ci0JQ0hFQ0tfVkFMSUQoTlVMTCk7Ci0JaWYgKGkgPCAwIHx8IChzaXplX3QpaSA+PSBzZWxmLT5zaXplKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLCAibW1hcCBpbmRleCBvdXQgb2YgcmFuZ2UiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzZWxmLT5kYXRhICsgaSwgMSk7CisgICAgQ0hFQ0tfVkFMSUQoTlVMTCk7CisgICAgaWYgKGkgPCAwIHx8IChzaXplX3QpaSA+PSBzZWxmLT5zaXplKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLCAibW1hcCBpbmRleCBvdXQgb2YgcmFuZ2UiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzZWxmLT5kYXRhICsgaSwgMSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBtbWFwX3NsaWNlKG1tYXBfb2JqZWN0ICpzZWxmLCBQeV9zc2l6ZV90IGlsb3csIFB5X3NzaXplX3QgaWhpZ2gpCiB7Ci0JQ0hFQ0tfVkFMSUQoTlVMTCk7Ci0JaWYgKGlsb3cgPCAwKQotCQlpbG93ID0gMDsKLQllbHNlIGlmICgoc2l6ZV90KWlsb3cgPiBzZWxmLT5zaXplKQotCQlpbG93ID0gc2VsZi0+c2l6ZTsKLQlpZiAoaWhpZ2ggPCAwKQotCQlpaGlnaCA9IDA7Ci0JaWYgKGloaWdoIDwgaWxvdykKLQkJaWhpZ2ggPSBpbG93OwotCWVsc2UgaWYgKChzaXplX3QpaWhpZ2ggPiBzZWxmLT5zaXplKQotCQlpaGlnaCA9IHNlbGYtPnNpemU7CisgICAgQ0hFQ0tfVkFMSUQoTlVMTCk7CisgICAgaWYgKGlsb3cgPCAwKQorICAgICAgICBpbG93ID0gMDsKKyAgICBlbHNlIGlmICgoc2l6ZV90KWlsb3cgPiBzZWxmLT5zaXplKQorICAgICAgICBpbG93ID0gc2VsZi0+c2l6ZTsKKyAgICBpZiAoaWhpZ2ggPCAwKQorICAgICAgICBpaGlnaCA9IDA7CisgICAgaWYgKGloaWdoIDwgaWxvdykKKyAgICAgICAgaWhpZ2ggPSBpbG93OworICAgIGVsc2UgaWYgKChzaXplX3QpaWhpZ2ggPiBzZWxmLT5zaXplKQorICAgICAgICBpaGlnaCA9IHNlbGYtPnNpemU7CiAKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoc2VsZi0+ZGF0YSArIGlsb3csIGloaWdoLWlsb3cpOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzZWxmLT5kYXRhICsgaWxvdywgaWhpZ2gtaWxvdyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBtbWFwX3N1YnNjcmlwdChtbWFwX29iamVjdCAqc2VsZiwgUHlPYmplY3QgKml0ZW0pCiB7Ci0JQ0hFQ0tfVkFMSUQoTlVMTCk7Ci0JaWYgKFB5SW5kZXhfQ2hlY2soaXRlbSkpIHsKLQkJUHlfc3NpemVfdCBpID0gUHlOdW1iZXJfQXNTc2l6ZV90KGl0ZW0sIFB5RXhjX0luZGV4RXJyb3IpOwotCQlpZiAoaSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWlmIChpIDwgMCkKLQkJCWkgKz0gc2VsZi0+c2l6ZTsKLQkJaWYgKGkgPCAwIHx8IChzaXplX3QpaSA+PSBzZWxmLT5zaXplKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwKLQkJCQkibW1hcCBpbmRleCBvdXQgb2YgcmFuZ2UiKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzZWxmLT5kYXRhICsgaSwgMSk7Ci0JfQotCWVsc2UgaWYgKFB5U2xpY2VfQ2hlY2soaXRlbSkpIHsKLQkJUHlfc3NpemVfdCBzdGFydCwgc3RvcCwgc3RlcCwgc2xpY2VsZW47CisgICAgQ0hFQ0tfVkFMSUQoTlVMTCk7CisgICAgaWYgKFB5SW5kZXhfQ2hlY2soaXRlbSkpIHsKKyAgICAgICAgUHlfc3NpemVfdCBpID0gUHlOdW1iZXJfQXNTc2l6ZV90KGl0ZW0sIFB5RXhjX0luZGV4RXJyb3IpOworICAgICAgICBpZiAoaSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGlmIChpIDwgMCkKKyAgICAgICAgICAgIGkgKz0gc2VsZi0+c2l6ZTsKKyAgICAgICAgaWYgKGkgPCAwIHx8IChzaXplX3QpaSA+PSBzZWxmLT5zaXplKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwKKyAgICAgICAgICAgICAgICAibW1hcCBpbmRleCBvdXQgb2YgcmFuZ2UiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzZWxmLT5kYXRhICsgaSwgMSk7CisgICAgfQorICAgIGVsc2UgaWYgKFB5U2xpY2VfQ2hlY2soaXRlbSkpIHsKKyAgICAgICAgUHlfc3NpemVfdCBzdGFydCwgc3RvcCwgc3RlcCwgc2xpY2VsZW47CiAKLQkJaWYgKFB5U2xpY2VfR2V0SW5kaWNlc0V4KChQeVNsaWNlT2JqZWN0ICopaXRlbSwgc2VsZi0+c2l6ZSwKLQkJCQkgJnN0YXJ0LCAmc3RvcCwgJnN0ZXAsICZzbGljZWxlbikgPCAwKSB7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQkKLQkJaWYgKHNsaWNlbGVuIDw9IDApCi0JCQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoIiIsIDApOwotCQllbHNlIGlmIChzdGVwID09IDEpCi0JCQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoc2VsZi0+ZGF0YSArIHN0YXJ0LAotCQkJCQkJCSAgc2xpY2VsZW4pOwotCQllbHNlIHsKLQkJCWNoYXIgKnJlc3VsdF9idWYgPSAoY2hhciAqKVB5TWVtX01hbGxvYyhzbGljZWxlbik7Ci0JCQlQeV9zc2l6ZV90IGN1ciwgaTsKLQkJCVB5T2JqZWN0ICpyZXN1bHQ7CisgICAgICAgIGlmIChQeVNsaWNlX0dldEluZGljZXNFeCgoUHlTbGljZU9iamVjdCAqKWl0ZW0sIHNlbGYtPnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0LCAmc3RvcCwgJnN0ZXAsICZzbGljZWxlbikgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQogCi0JCQlpZiAocmVzdWx0X2J1ZiA9PSBOVUxMKQotCQkJCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCQkJZm9yIChjdXIgPSBzdGFydCwgaSA9IDA7IGkgPCBzbGljZWxlbjsKLQkJCSAgICAgY3VyICs9IHN0ZXAsIGkrKykgewotCQkJICAgICAJcmVzdWx0X2J1ZltpXSA9IHNlbGYtPmRhdGFbY3VyXTsKLQkJCX0KLQkJCXJlc3VsdCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHJlc3VsdF9idWYsCi0JCQkJCQkJICAgIHNsaWNlbGVuKTsKLQkJCVB5TWVtX0ZyZWUocmVzdWx0X2J1Zik7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JfQotCWVsc2UgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJtbWFwIGluZGljZXMgbXVzdCBiZSBpbnRlZ2VycyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgICAgIGlmIChzbGljZWxlbiA8PSAwKQorICAgICAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKCIiLCAwKTsKKyAgICAgICAgZWxzZSBpZiAoc3RlcCA9PSAxKQorICAgICAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHNlbGYtPmRhdGEgKyBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbGljZWxlbik7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgY2hhciAqcmVzdWx0X2J1ZiA9IChjaGFyICopUHlNZW1fTWFsbG9jKHNsaWNlbGVuKTsKKyAgICAgICAgICAgIFB5X3NzaXplX3QgY3VyLCBpOworICAgICAgICAgICAgUHlPYmplY3QgKnJlc3VsdDsKKworICAgICAgICAgICAgaWYgKHJlc3VsdF9idWYgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgICAgIGZvciAoY3VyID0gc3RhcnQsIGkgPSAwOyBpIDwgc2xpY2VsZW47CisgICAgICAgICAgICAgICAgIGN1ciArPSBzdGVwLCBpKyspIHsKKyAgICAgICAgICAgICAgICByZXN1bHRfYnVmW2ldID0gc2VsZi0+ZGF0YVtjdXJdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzdWx0ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocmVzdWx0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsaWNlbGVuKTsKKyAgICAgICAgICAgIFB5TWVtX0ZyZWUocmVzdWx0X2J1Zik7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIm1tYXAgaW5kaWNlcyBtdXN0IGJlIGludGVnZXJzIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG1tYXBfY29uY2F0KG1tYXBfb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYmIpCiB7Ci0JQ0hFQ0tfVkFMSUQoTlVMTCk7Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAotCQkJIm1tYXBzIGRvbid0IHN1cHBvcnQgY29uY2F0ZW5hdGlvbiIpOwotCXJldHVybiBOVUxMOworICAgIENIRUNLX1ZBTElEKE5VTEwpOworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgIm1tYXBzIGRvbid0IHN1cHBvcnQgY29uY2F0ZW5hdGlvbiIpOworICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbW1hcF9yZXBlYXQobW1hcF9vYmplY3QgKnNlbGYsIFB5X3NzaXplX3QgbikKIHsKLQlDSEVDS19WQUxJRChOVUxMKTsKLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCi0JCQkibW1hcHMgZG9uJ3Qgc3VwcG9ydCByZXBlYXQgb3BlcmF0aW9uIik7Ci0JcmV0dXJuIE5VTEw7CisgICAgQ0hFQ0tfVkFMSUQoTlVMTCk7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgICAgICAgICAibW1hcHMgZG9uJ3Qgc3VwcG9ydCByZXBlYXQgb3BlcmF0aW9uIik7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBpbnQKIG1tYXBfYXNzX3NsaWNlKG1tYXBfb2JqZWN0ICpzZWxmLCBQeV9zc2l6ZV90IGlsb3csIFB5X3NzaXplX3QgaWhpZ2gsIFB5T2JqZWN0ICp2KQogewotCWNvbnN0IGNoYXIgKmJ1ZjsKKyAgICBjb25zdCBjaGFyICpidWY7CiAKLQlDSEVDS19WQUxJRCgtMSk7Ci0JaWYgKGlsb3cgPCAwKQotCQlpbG93ID0gMDsKLQllbHNlIGlmICgoc2l6ZV90KWlsb3cgPiBzZWxmLT5zaXplKQotCQlpbG93ID0gc2VsZi0+c2l6ZTsKLQlpZiAoaWhpZ2ggPCAwKQotCQlpaGlnaCA9IDA7Ci0JaWYgKGloaWdoIDwgaWxvdykKLQkJaWhpZ2ggPSBpbG93OwotCWVsc2UgaWYgKChzaXplX3QpaWhpZ2ggPiBzZWxmLT5zaXplKQotCQlpaGlnaCA9IHNlbGYtPnNpemU7CisgICAgQ0hFQ0tfVkFMSUQoLTEpOworICAgIGlmIChpbG93IDwgMCkKKyAgICAgICAgaWxvdyA9IDA7CisgICAgZWxzZSBpZiAoKHNpemVfdClpbG93ID4gc2VsZi0+c2l6ZSkKKyAgICAgICAgaWxvdyA9IHNlbGYtPnNpemU7CisgICAgaWYgKGloaWdoIDwgMCkKKyAgICAgICAgaWhpZ2ggPSAwOworICAgIGlmIChpaGlnaCA8IGlsb3cpCisgICAgICAgIGloaWdoID0gaWxvdzsKKyAgICBlbHNlIGlmICgoc2l6ZV90KWloaWdoID4gc2VsZi0+c2l6ZSkKKyAgICAgICAgaWhpZ2ggPSBzZWxmLT5zaXplOwogCi0JaWYgKHYgPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJtbWFwIG9iamVjdCBkb2Vzbid0IHN1cHBvcnQgc2xpY2UgZGVsZXRpb24iKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoISAoUHlTdHJpbmdfQ2hlY2sodikpICkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwKLQkJCQkibW1hcCBzbGljZSBhc3NpZ25tZW50IG11c3QgYmUgYSBzdHJpbmciKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoUHlTdHJpbmdfU2l6ZSh2KSAhPSAoaWhpZ2ggLSBpbG93KSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwKLQkJCQkibW1hcCBzbGljZSBhc3NpZ25tZW50IGlzIHdyb25nIHNpemUiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoIWlzX3dyaXRlYWJsZShzZWxmKSkKLQkJcmV0dXJuIC0xOwotCWJ1ZiA9IFB5U3RyaW5nX0FzU3RyaW5nKHYpOwotCW1lbWNweShzZWxmLT5kYXRhICsgaWxvdywgYnVmLCBpaGlnaC1pbG93KTsKLQlyZXR1cm4gMDsKKyAgICBpZiAodiA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAibW1hcCBvYmplY3QgZG9lc24ndCBzdXBwb3J0IHNsaWNlIGRlbGV0aW9uIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKCEgKFB5U3RyaW5nX0NoZWNrKHYpKSApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAibW1hcCBzbGljZSBhc3NpZ25tZW50IG11c3QgYmUgYSBzdHJpbmciKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoUHlTdHJpbmdfU2l6ZSh2KSAhPSAoaWhpZ2ggLSBpbG93KSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJtbWFwIHNsaWNlIGFzc2lnbm1lbnQgaXMgd3Jvbmcgc2l6ZSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICghaXNfd3JpdGVhYmxlKHNlbGYpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgYnVmID0gUHlTdHJpbmdfQXNTdHJpbmcodik7CisgICAgbWVtY3B5KHNlbGYtPmRhdGEgKyBpbG93LCBidWYsIGloaWdoLWlsb3cpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBtbWFwX2Fzc19pdGVtKG1tYXBfb2JqZWN0ICpzZWxmLCBQeV9zc2l6ZV90IGksIFB5T2JqZWN0ICp2KQogewotCWNvbnN0IGNoYXIgKmJ1ZjsKKyAgICBjb25zdCBjaGFyICpidWY7CiAKLQlDSEVDS19WQUxJRCgtMSk7Ci0JaWYgKGkgPCAwIHx8IChzaXplX3QpaSA+PSBzZWxmLT5zaXplKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLCAibW1hcCBpbmRleCBvdXQgb2YgcmFuZ2UiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAodiA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJIm1tYXAgb2JqZWN0IGRvZXNuJ3Qgc3VwcG9ydCBpdGVtIGRlbGV0aW9uIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKCEgKFB5U3RyaW5nX0NoZWNrKHYpICYmIFB5U3RyaW5nX1NpemUodik9PTEpICkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwKLQkJCQkibW1hcCBhc3NpZ25tZW50IG11c3QgYmUgc2luZ2xlLWNoYXJhY3RlciBzdHJpbmciKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoIWlzX3dyaXRlYWJsZShzZWxmKSkKLQkJcmV0dXJuIC0xOwotCWJ1ZiA9IFB5U3RyaW5nX0FzU3RyaW5nKHYpOwotCXNlbGYtPmRhdGFbaV0gPSBidWZbMF07Ci0JcmV0dXJuIDA7CisgICAgQ0hFQ0tfVkFMSUQoLTEpOworICAgIGlmIChpIDwgMCB8fCAoc2l6ZV90KWkgPj0gc2VsZi0+c2l6ZSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwgIm1tYXAgaW5kZXggb3V0IG9mIHJhbmdlIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKHYgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIm1tYXAgb2JqZWN0IGRvZXNuJ3Qgc3VwcG9ydCBpdGVtIGRlbGV0aW9uIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKCEgKFB5U3RyaW5nX0NoZWNrKHYpICYmIFB5U3RyaW5nX1NpemUodik9PTEpICkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJtbWFwIGFzc2lnbm1lbnQgbXVzdCBiZSBzaW5nbGUtY2hhcmFjdGVyIHN0cmluZyIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICghaXNfd3JpdGVhYmxlKHNlbGYpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgYnVmID0gUHlTdHJpbmdfQXNTdHJpbmcodik7CisgICAgc2VsZi0+ZGF0YVtpXSA9IGJ1ZlswXTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogbW1hcF9hc3Nfc3Vic2NyaXB0KG1tYXBfb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqaXRlbSwgUHlPYmplY3QgKnZhbHVlKQogewotCUNIRUNLX1ZBTElEKC0xKTsKKyAgICBDSEVDS19WQUxJRCgtMSk7CiAKLQlpZiAoUHlJbmRleF9DaGVjayhpdGVtKSkgewotCQlQeV9zc2l6ZV90IGkgPSBQeU51bWJlcl9Bc1NzaXplX3QoaXRlbSwgUHlFeGNfSW5kZXhFcnJvcik7Ci0JCWNvbnN0IGNoYXIgKmJ1ZjsKKyAgICBpZiAoUHlJbmRleF9DaGVjayhpdGVtKSkgeworICAgICAgICBQeV9zc2l6ZV90IGkgPSBQeU51bWJlcl9Bc1NzaXplX3QoaXRlbSwgUHlFeGNfSW5kZXhFcnJvcik7CisgICAgICAgIGNvbnN0IGNoYXIgKmJ1ZjsKIAotCQlpZiAoaSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIC0xOwotCQlpZiAoaSA8IDApCi0JCQlpICs9IHNlbGYtPnNpemU7Ci0JCWlmIChpIDwgMCB8fCAoc2l6ZV90KWkgPj0gc2VsZi0+c2l6ZSkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsCi0JCQkJIm1tYXAgaW5kZXggb3V0IG9mIHJhbmdlIik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJaWYgKHZhbHVlID09IE5VTEwpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJIm1tYXAgb2JqZWN0IGRvZXNuJ3Qgc3VwcG9ydCBpdGVtIGRlbGV0aW9uIik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJaWYgKCFQeVN0cmluZ19DaGVjayh2YWx1ZSkgfHwgUHlTdHJpbmdfU2l6ZSh2YWx1ZSkgIT0gMSkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsCi0JCSAgICAgICAgICAibW1hcCBhc3NpZ25tZW50IG11c3QgYmUgc2luZ2xlLWNoYXJhY3RlciBzdHJpbmciKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlpZiAoIWlzX3dyaXRlYWJsZShzZWxmKSkKLQkJCXJldHVybiAtMTsKLQkJYnVmID0gUHlTdHJpbmdfQXNTdHJpbmcodmFsdWUpOwotCQlzZWxmLT5kYXRhW2ldID0gYnVmWzBdOwotCQlyZXR1cm4gMDsKLQl9Ci0JZWxzZSBpZiAoUHlTbGljZV9DaGVjayhpdGVtKSkgewotCQlQeV9zc2l6ZV90IHN0YXJ0LCBzdG9wLCBzdGVwLCBzbGljZWxlbjsKLQkJCi0JCWlmIChQeVNsaWNlX0dldEluZGljZXNFeCgoUHlTbGljZU9iamVjdCAqKWl0ZW0sCi0JCQkJCSBzZWxmLT5zaXplLCAmc3RhcnQsICZzdG9wLAotCQkJCQkgJnN0ZXAsICZzbGljZWxlbikgPCAwKSB7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJaWYgKHZhbHVlID09IE5VTEwpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJIm1tYXAgb2JqZWN0IGRvZXNuJ3Qgc3VwcG9ydCBzbGljZSBkZWxldGlvbiIpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWlmICghUHlTdHJpbmdfQ2hlY2sodmFsdWUpKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwKLQkJCQkibW1hcCBzbGljZSBhc3NpZ25tZW50IG11c3QgYmUgYSBzdHJpbmciKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlpZiAoUHlTdHJpbmdfU2l6ZSh2YWx1ZSkgIT0gc2xpY2VsZW4pIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLAotCQkJCSJtbWFwIHNsaWNlIGFzc2lnbm1lbnQgaXMgd3Jvbmcgc2l6ZSIpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWlmICghaXNfd3JpdGVhYmxlKHNlbGYpKQotCQkJcmV0dXJuIC0xOworICAgICAgICBpZiAoaSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBpZiAoaSA8IDApCisgICAgICAgICAgICBpICs9IHNlbGYtPnNpemU7CisgICAgICAgIGlmIChpIDwgMCB8fCAoc2l6ZV90KWkgPj0gc2VsZi0+c2l6ZSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsCisgICAgICAgICAgICAgICAgIm1tYXAgaW5kZXggb3V0IG9mIHJhbmdlIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZhbHVlID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgIm1tYXAgb2JqZWN0IGRvZXNuJ3Qgc3VwcG9ydCBpdGVtIGRlbGV0aW9uIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFQeVN0cmluZ19DaGVjayh2YWx1ZSkgfHwgUHlTdHJpbmdfU2l6ZSh2YWx1ZSkgIT0gMSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsCisgICAgICAgICAgICAgICJtbWFwIGFzc2lnbm1lbnQgbXVzdCBiZSBzaW5nbGUtY2hhcmFjdGVyIHN0cmluZyIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGlmICghaXNfd3JpdGVhYmxlKHNlbGYpKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBidWYgPSBQeVN0cmluZ19Bc1N0cmluZyh2YWx1ZSk7CisgICAgICAgIHNlbGYtPmRhdGFbaV0gPSBidWZbMF07CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBlbHNlIGlmIChQeVNsaWNlX0NoZWNrKGl0ZW0pKSB7CisgICAgICAgIFB5X3NzaXplX3Qgc3RhcnQsIHN0b3AsIHN0ZXAsIHNsaWNlbGVuOwogCi0JCWlmIChzbGljZWxlbiA9PSAwKQotCQkJcmV0dXJuIDA7Ci0JCWVsc2UgaWYgKHN0ZXAgPT0gMSkgewotCQkJY29uc3QgY2hhciAqYnVmID0gUHlTdHJpbmdfQXNTdHJpbmcodmFsdWUpOworICAgICAgICBpZiAoUHlTbGljZV9HZXRJbmRpY2VzRXgoKFB5U2xpY2VPYmplY3QgKilpdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+c2l6ZSwgJnN0YXJ0LCAmc3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGVwLCAmc2xpY2VsZW4pIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGlmICh2YWx1ZSA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICJtbWFwIG9iamVjdCBkb2Vzbid0IHN1cHBvcnQgc2xpY2UgZGVsZXRpb24iKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIVB5U3RyaW5nX0NoZWNrKHZhbHVlKSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsCisgICAgICAgICAgICAgICAgIm1tYXAgc2xpY2UgYXNzaWdubWVudCBtdXN0IGJlIGEgc3RyaW5nIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKFB5U3RyaW5nX1NpemUodmFsdWUpICE9IHNsaWNlbGVuKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwKKyAgICAgICAgICAgICAgICAibW1hcCBzbGljZSBhc3NpZ25tZW50IGlzIHdyb25nIHNpemUiKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWlzX3dyaXRlYWJsZShzZWxmKSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKIAotCQkJaWYgKGJ1ZiA9PSBOVUxMKQotCQkJCXJldHVybiAtMTsKLQkJCW1lbWNweShzZWxmLT5kYXRhICsgc3RhcnQsIGJ1Ziwgc2xpY2VsZW4pOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlQeV9zc2l6ZV90IGN1ciwgaTsKLQkJCWNvbnN0IGNoYXIgKmJ1ZiA9IFB5U3RyaW5nX0FzU3RyaW5nKHZhbHVlKTsKLQkJCQotCQkJaWYgKGJ1ZiA9PSBOVUxMKQotCQkJCXJldHVybiAtMTsKLQkJCWZvciAoY3VyID0gc3RhcnQsIGkgPSAwOyBpIDwgc2xpY2VsZW47Ci0JCQkgICAgIGN1ciArPSBzdGVwLCBpKyspIHsKLQkJCQlzZWxmLT5kYXRhW2N1cl0gPSBidWZbaV07Ci0JCQl9Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQllbHNlIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkibW1hcCBpbmRpY2VzIG11c3QgYmUgaW50ZWdlciIpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgICAgICBpZiAoc2xpY2VsZW4gPT0gMCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBlbHNlIGlmIChzdGVwID09IDEpIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmJ1ZiA9IFB5U3RyaW5nX0FzU3RyaW5nKHZhbHVlKTsKKworICAgICAgICAgICAgaWYgKGJ1ZiA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIG1lbWNweShzZWxmLT5kYXRhICsgc3RhcnQsIGJ1Ziwgc2xpY2VsZW4pOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBQeV9zc2l6ZV90IGN1ciwgaTsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmJ1ZiA9IFB5U3RyaW5nX0FzU3RyaW5nKHZhbHVlKTsKKworICAgICAgICAgICAgaWYgKGJ1ZiA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIGZvciAoY3VyID0gc3RhcnQsIGkgPSAwOyBpIDwgc2xpY2VsZW47CisgICAgICAgICAgICAgICAgIGN1ciArPSBzdGVwLCBpKyspIHsKKyAgICAgICAgICAgICAgICBzZWxmLT5kYXRhW2N1cl0gPSBidWZbaV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJtbWFwIGluZGljZXMgbXVzdCBiZSBpbnRlZ2VyIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiB9CiAKIHN0YXRpYyBQeVNlcXVlbmNlTWV0aG9kcyBtbWFwX2FzX3NlcXVlbmNlID0gewotCShsZW5mdW5jKW1tYXBfbGVuZ3RoLAkJICAgICAgIC8qc3FfbGVuZ3RoKi8KLQkoYmluYXJ5ZnVuYyltbWFwX2NvbmNhdCwJICAgICAgIC8qc3FfY29uY2F0Ki8KLQkoc3NpemVhcmdmdW5jKW1tYXBfcmVwZWF0LAkgICAgICAgLypzcV9yZXBlYXQqLwotCShzc2l6ZWFyZ2Z1bmMpbW1hcF9pdGVtLAkJICAgICAgIC8qc3FfaXRlbSovCi0JKHNzaXplc3NpemVhcmdmdW5jKW1tYXBfc2xpY2UsCSAgICAgICAvKnNxX3NsaWNlKi8KLQkoc3NpemVvYmphcmdwcm9jKW1tYXBfYXNzX2l0ZW0sCSAgICAgICAvKnNxX2Fzc19pdGVtKi8KLQkoc3NpemVzc2l6ZW9iamFyZ3Byb2MpbW1hcF9hc3Nfc2xpY2UsICAgICAgLypzcV9hc3Nfc2xpY2UqLworICAgIChsZW5mdW5jKW1tYXBfbGVuZ3RoLCAgICAgICAgICAgICAgICAgICAgICAvKnNxX2xlbmd0aCovCisgICAgKGJpbmFyeWZ1bmMpbW1hcF9jb25jYXQsICAgICAgICAgICAgICAgICAgIC8qc3FfY29uY2F0Ki8KKyAgICAoc3NpemVhcmdmdW5jKW1tYXBfcmVwZWF0LCAgICAgICAgICAgICAgICAgLypzcV9yZXBlYXQqLworICAgIChzc2l6ZWFyZ2Z1bmMpbW1hcF9pdGVtLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qc3FfaXRlbSovCisgICAgKHNzaXplc3NpemVhcmdmdW5jKW1tYXBfc2xpY2UsICAgICAgICAgICAgIC8qc3Ffc2xpY2UqLworICAgIChzc2l6ZW9iamFyZ3Byb2MpbW1hcF9hc3NfaXRlbSwgICAgICAgICAgICAvKnNxX2Fzc19pdGVtKi8KKyAgICAoc3NpemVzc2l6ZW9iamFyZ3Byb2MpbW1hcF9hc3Nfc2xpY2UsICAgICAgLypzcV9hc3Nfc2xpY2UqLwogfTsKIAogc3RhdGljIFB5TWFwcGluZ01ldGhvZHMgbW1hcF9hc19tYXBwaW5nID0gewotCShsZW5mdW5jKW1tYXBfbGVuZ3RoLAotCShiaW5hcnlmdW5jKW1tYXBfc3Vic2NyaXB0LAotCShvYmpvYmphcmdwcm9jKW1tYXBfYXNzX3N1YnNjcmlwdCwKKyAgICAobGVuZnVuYyltbWFwX2xlbmd0aCwKKyAgICAoYmluYXJ5ZnVuYyltbWFwX3N1YnNjcmlwdCwKKyAgICAob2Jqb2JqYXJncHJvYyltbWFwX2Fzc19zdWJzY3JpcHQsCiB9OwogCiBzdGF0aWMgUHlCdWZmZXJQcm9jcyBtbWFwX2FzX2J1ZmZlciA9IHsKLQkocmVhZGJ1ZmZlcnByb2MpbW1hcF9idWZmZXJfZ2V0cmVhZGJ1ZiwKLQkod3JpdGVidWZmZXJwcm9jKW1tYXBfYnVmZmVyX2dldHdyaXRlYnVmLAotCShzZWdjb3VudHByb2MpbW1hcF9idWZmZXJfZ2V0c2VnY291bnQsCi0JKGNoYXJidWZmZXJwcm9jKW1tYXBfYnVmZmVyX2dldGNoYXJidWZmZXIsCisgICAgKHJlYWRidWZmZXJwcm9jKW1tYXBfYnVmZmVyX2dldHJlYWRidWYsCisgICAgKHdyaXRlYnVmZmVycHJvYyltbWFwX2J1ZmZlcl9nZXR3cml0ZWJ1ZiwKKyAgICAoc2VnY291bnRwcm9jKW1tYXBfYnVmZmVyX2dldHNlZ2NvdW50LAorICAgIChjaGFyYnVmZmVycHJvYyltbWFwX2J1ZmZlcl9nZXRjaGFyYnVmZmVyLAogfTsKIAogc3RhdGljIFB5T2JqZWN0ICoKQEAgLTEwMjQsNDYgKzEwMjQsNDYgQEAKIAogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IG1tYXBfb2JqZWN0X3R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JIm1tYXAubW1hcCIsCQkJCS8qIHRwX25hbWUgKi8KLQlzaXplb2YobW1hcF9vYmplY3QpLAkJCS8qIHRwX3NpemUgKi8KLQkwLAkJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpIG1tYXBfb2JqZWN0X2RlYWxsb2MsCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfcmVwciAqLwotCTAsCQkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkmbW1hcF9hc19zZXF1ZW5jZSwJCQkvKnRwX2FzX3NlcXVlbmNlKi8KLQkmbW1hcF9hc19tYXBwaW5nLAkJCS8qdHBfYXNfbWFwcGluZyovCi0JMCwJCQkJCS8qdHBfaGFzaCovCi0JMCwJCQkJCS8qdHBfY2FsbCovCi0JMCwJCQkJCS8qdHBfc3RyKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJCS8qdHBfZ2V0YXR0cm8qLwotCTAsCQkJCQkvKnRwX3NldGF0dHJvKi8KLQkmbW1hcF9hc19idWZmZXIsCQkJLyp0cF9hc19idWZmZXIqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfQkFTRVRZUEUgfCBQeV9UUEZMQUdTX0hBVkVfR0VUQ0hBUkJVRkZFUiwJCS8qdHBfZmxhZ3MqLwotCW1tYXBfZG9jLAkJCQkvKnRwX2RvYyovCi0JMCwJCQkJCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JMCwJCSAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KLQkwLAkJICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KLQltbWFwX29iamVjdF9tZXRob2RzLAkJCS8qIHRwX21ldGhvZHMgKi8KLQkwLAkJCQkJLyogdHBfbWVtYmVycyAqLwotCTAsCQkJCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCQkvKiB0cF9kaWN0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KLQkwLAkJCQkJLyogdHBfZGljdG9mZnNldCAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCi0JUHlUeXBlX0dlbmVyaWNBbGxvYywJCQkvKiB0cF9hbGxvYyAqLwotCW5ld19tbWFwX29iamVjdCwJCQkvKiB0cF9uZXcgKi8KLQlQeU9iamVjdF9EZWwsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQorICAgICJtbWFwLm1tYXAiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgIHNpemVvZihtbWFwX29iamVjdCksICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpIG1tYXBfb2JqZWN0X2RlYWxsb2MsICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgJm1tYXBfYXNfc2VxdWVuY2UsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX3NlcXVlbmNlKi8KKyAgICAmbW1hcF9hc19tYXBwaW5nLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbWFwcGluZyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2hhc2gqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jYWxsKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc3RyKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0YXR0cm8qLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRybyovCisgICAgJm1tYXBfYXNfYnVmZmVyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19CQVNFVFlQRSB8IFB5X1RQRkxBR1NfSEFWRV9HRVRDSEFSQlVGRkVSLCAgICAgICAgICAgICAgICAgICAvKnRwX2ZsYWdzKi8KKyAgICBtbWFwX2RvYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZG9jKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIG1tYXBfb2JqZWN0X21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgUHlUeXBlX0dlbmVyaWNBbGxvYywgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIG5ld19tbWFwX29iamVjdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgUHlPYmplY3RfRGVsLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KIH07CiAKIApAQCAtMTA3NCwyMyArMTA3NCwyMyBAQAogc3RhdGljIFB5X3NzaXplX3QKIF9HZXRNYXBTaXplKFB5T2JqZWN0ICpvLCBjb25zdCBjaGFyKiBwYXJhbSkKIHsKLQlpZiAobyA9PSBOVUxMKQotCQlyZXR1cm4gMDsKLQlpZiAoUHlJbmRleF9DaGVjayhvKSkgewotCQlQeV9zc2l6ZV90IGkgPSBQeU51bWJlcl9Bc1NzaXplX3QobywgUHlFeGNfT3ZlcmZsb3dFcnJvcik7Ci0JCWlmIChpPT0tMSAmJiBQeUVycl9PY2N1cnJlZCgpKSAKLQkJCXJldHVybiAtMTsKLQkJaWYgKGkgPCAwKSB7CSAKLQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJCQkibWVtb3J5IG1hcHBlZCAlcyBtdXN0IGJlIHBvc2l0aXZlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbSk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJcmV0dXJuIGk7Ci0JfQorICAgIGlmIChvID09IE5VTEwpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChQeUluZGV4X0NoZWNrKG8pKSB7CisgICAgICAgIFB5X3NzaXplX3QgaSA9IFB5TnVtYmVyX0FzU3NpemVfdChvLCBQeUV4Y19PdmVyZmxvd0Vycm9yKTsKKyAgICAgICAgaWYgKGk9PS0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmIChpIDwgMCkgeworICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1lbW9yeSBtYXBwZWQgJXMgbXVzdCBiZSBwb3NpdGl2ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0pOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIHJldHVybiBpOworICAgIH0KIAotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJtYXAgc2l6ZSBtdXN0IGJlIGFuIGludGVncmFsIHZhbHVlIik7Ci0JcmV0dXJuIC0xOworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJtYXAgc2l6ZSBtdXN0IGJlIGFuIGludGVncmFsIHZhbHVlIik7CisgICAgcmV0dXJuIC0xOwogfQogCiAjaWZkZWYgVU5JWApAQCAtMTA5OCwxMjQgKzEwOTgsMTI0IEBACiBuZXdfbW1hcF9vYmplY3QoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZGljdCkKIHsKICNpZmRlZiBIQVZFX0ZTVEFUCi0Jc3RydWN0IHN0YXQgc3Q7CisgICAgc3RydWN0IHN0YXQgc3Q7CiAjZW5kaWYKLQltbWFwX29iamVjdCAqbV9vYmo7Ci0JUHlPYmplY3QgKm1hcF9zaXplX29iaiA9IE5VTEwsICpvZmZzZXRfb2JqID0gTlVMTDsKLQlQeV9zc2l6ZV90IG1hcF9zaXplLCBvZmZzZXQ7Ci0JaW50IGZkLCBmbGFncyA9IE1BUF9TSEFSRUQsIHByb3QgPSBQUk9UX1dSSVRFIHwgUFJPVF9SRUFEOwotCWludCBkZXZ6ZXJvID0gLTE7Ci0JaW50IGFjY2VzcyA9IChpbnQpQUNDRVNTX0RFRkFVTFQ7Ci0Jc3RhdGljIGNoYXIgKmtleXdvcmRzW10gPSB7ImZpbGVubyIsICJsZW5ndGgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmxhZ3MiLCAicHJvdCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhY2Nlc3MiLCAib2Zmc2V0IiwgTlVMTH07CisgICAgbW1hcF9vYmplY3QgKm1fb2JqOworICAgIFB5T2JqZWN0ICptYXBfc2l6ZV9vYmogPSBOVUxMLCAqb2Zmc2V0X29iaiA9IE5VTEw7CisgICAgUHlfc3NpemVfdCBtYXBfc2l6ZSwgb2Zmc2V0OworICAgIGludCBmZCwgZmxhZ3MgPSBNQVBfU0hBUkVELCBwcm90ID0gUFJPVF9XUklURSB8IFBST1RfUkVBRDsKKyAgICBpbnQgZGV2emVybyA9IC0xOworICAgIGludCBhY2Nlc3MgPSAoaW50KUFDQ0VTU19ERUZBVUxUOworICAgIHN0YXRpYyBjaGFyICprZXl3b3Jkc1tdID0geyJmaWxlbm8iLCAibGVuZ3RoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmxhZ3MiLCAicHJvdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFjY2VzcyIsICJvZmZzZXQiLCBOVUxMfTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZGljdCwgImlPfGlpaU8iLCBrZXl3b3JkcywKLQkJCQkJICZmZCwgJm1hcF9zaXplX29iaiwgJmZsYWdzLCAmcHJvdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFjY2VzcywgJm9mZnNldF9vYmopKQotCQlyZXR1cm4gTlVMTDsKLQltYXBfc2l6ZSA9IF9HZXRNYXBTaXplKG1hcF9zaXplX29iaiwgInNpemUiKTsKLQlpZiAobWFwX3NpemUgPCAwKQotCQlyZXR1cm4gTlVMTDsKLSAgICAgICAgb2Zmc2V0ID0gX0dldE1hcFNpemUob2Zmc2V0X29iaiwgIm9mZnNldCIpOwotICAgICAgICBpZiAob2Zmc2V0IDwgMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RpY3QsICJpT3xpaWlPIiwga2V5d29yZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZkLCAmbWFwX3NpemVfb2JqLCAmZmxhZ3MsICZwcm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhY2Nlc3MsICZvZmZzZXRfb2JqKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbWFwX3NpemUgPSBfR2V0TWFwU2l6ZShtYXBfc2l6ZV9vYmosICJzaXplIik7CisgICAgaWYgKG1hcF9zaXplIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgb2Zmc2V0ID0gX0dldE1hcFNpemUob2Zmc2V0X29iaiwgIm9mZnNldCIpOworICAgIGlmIChvZmZzZXQgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmICgoYWNjZXNzICE9IChpbnQpQUNDRVNTX0RFRkFVTFQpICYmCi0JICAgICgoZmxhZ3MgIT0gTUFQX1NIQVJFRCkgfHwgKHByb3QgIT0gKFBST1RfV1JJVEUgfCBQUk9UX1JFQUQpKSkpCi0JCXJldHVybiBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkgICAgIm1tYXAgY2FuJ3Qgc3BlY2lmeSBib3RoIGFjY2VzcyBhbmQgZmxhZ3MsIHByb3QuIik7Ci0Jc3dpdGNoICgoYWNjZXNzX21vZGUpYWNjZXNzKSB7Ci0JY2FzZSBBQ0NFU1NfUkVBRDoKLQkJZmxhZ3MgPSBNQVBfU0hBUkVEOwotCQlwcm90ID0gUFJPVF9SRUFEOwotCQlicmVhazsKLQljYXNlIEFDQ0VTU19XUklURToKLQkJZmxhZ3MgPSBNQVBfU0hBUkVEOwotCQlwcm90ID0gUFJPVF9SRUFEIHwgUFJPVF9XUklURTsKLQkJYnJlYWs7Ci0JY2FzZSBBQ0NFU1NfQ09QWToKLQkJZmxhZ3MgPSBNQVBfUFJJVkFURTsKLQkJcHJvdCA9IFBST1RfUkVBRCB8IFBST1RfV1JJVEU7Ci0JCWJyZWFrOwotCWNhc2UgQUNDRVNTX0RFRkFVTFQ6Ci0JCS8qIHVzZSB0aGUgc3BlY2lmaWVkIG9yIGRlZmF1bHQgdmFsdWVzIG9mIGZsYWdzIGFuZCBwcm90ICovCi0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkgICAgIm1tYXAgaW52YWxpZCBhY2Nlc3MgcGFyYW1ldGVyLiIpOwotCX0KKyAgICBpZiAoKGFjY2VzcyAhPSAoaW50KUFDQ0VTU19ERUZBVUxUKSAmJgorICAgICAgICAoKGZsYWdzICE9IE1BUF9TSEFSRUQpIHx8IChwcm90ICE9IChQUk9UX1dSSVRFIHwgUFJPVF9SRUFEKSkpKQorICAgICAgICByZXR1cm4gUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1tYXAgY2FuJ3Qgc3BlY2lmeSBib3RoIGFjY2VzcyBhbmQgZmxhZ3MsIHByb3QuIik7CisgICAgc3dpdGNoICgoYWNjZXNzX21vZGUpYWNjZXNzKSB7CisgICAgY2FzZSBBQ0NFU1NfUkVBRDoKKyAgICAgICAgZmxhZ3MgPSBNQVBfU0hBUkVEOworICAgICAgICBwcm90ID0gUFJPVF9SRUFEOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFDQ0VTU19XUklURToKKyAgICAgICAgZmxhZ3MgPSBNQVBfU0hBUkVEOworICAgICAgICBwcm90ID0gUFJPVF9SRUFEIHwgUFJPVF9XUklURTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBQ0NFU1NfQ09QWToKKyAgICAgICAgZmxhZ3MgPSBNQVBfUFJJVkFURTsKKyAgICAgICAgcHJvdCA9IFBST1RfUkVBRCB8IFBST1RfV1JJVEU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQUNDRVNTX0RFRkFVTFQ6CisgICAgICAgIC8qIHVzZSB0aGUgc3BlY2lmaWVkIG9yIGRlZmF1bHQgdmFsdWVzIG9mIGZsYWdzIGFuZCBwcm90ICovCisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibW1hcCBpbnZhbGlkIGFjY2VzcyBwYXJhbWV0ZXIuIik7CisgICAgfQogCiAgICAgaWYgKHByb3QgPT0gUFJPVF9SRUFEKSB7Ci0gICAgICAgIGFjY2VzcyA9IEFDQ0VTU19SRUFEOworICAgIGFjY2VzcyA9IEFDQ0VTU19SRUFEOwogICAgIH0KIAogI2lmZGVmIEhBVkVfRlNUQVQKICMgIGlmZGVmIF9fVk1TCi0JLyogb24gT3BlblZNUyB3ZSBtdXN0IGVuc3VyZSB0aGF0IGFsbCBieXRlcyBhcmUgd3JpdHRlbiB0byB0aGUgZmlsZSAqLwotCWlmIChmZCAhPSAtMSkgewotCSAgICAgICAgZnN5bmMoZmQpOwotCX0KKyAgICAvKiBvbiBPcGVuVk1TIHdlIG11c3QgZW5zdXJlIHRoYXQgYWxsIGJ5dGVzIGFyZSB3cml0dGVuIHRvIHRoZSBmaWxlICovCisgICAgaWYgKGZkICE9IC0xKSB7CisgICAgICAgIGZzeW5jKGZkKTsKKyAgICB9CiAjICBlbmRpZgotCWlmIChmZCAhPSAtMSAmJiBmc3RhdChmZCwgJnN0KSA9PSAwICYmIFNfSVNSRUcoc3Quc3RfbW9kZSkpIHsKLQkJaWYgKG1hcF9zaXplID09IDApIHsKLQkJCW1hcF9zaXplID0gc3Quc3Rfc2l6ZTsKLQkJfSBlbHNlIGlmICgoc2l6ZV90KW9mZnNldCArIChzaXplX3QpbWFwX3NpemUgPiBzdC5zdF9zaXplKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkJIm1tYXAgbGVuZ3RoIGlzIGdyZWF0ZXIgdGhhbiBmaWxlIHNpemUiKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQorICAgIGlmIChmZCAhPSAtMSAmJiBmc3RhdChmZCwgJnN0KSA9PSAwICYmIFNfSVNSRUcoc3Quc3RfbW9kZSkpIHsKKyAgICAgICAgaWYgKG1hcF9zaXplID09IDApIHsKKyAgICAgICAgICAgIG1hcF9zaXplID0gc3Quc3Rfc2l6ZTsKKyAgICAgICAgfSBlbHNlIGlmICgoc2l6ZV90KW9mZnNldCArIChzaXplX3QpbWFwX3NpemUgPiBzdC5zdF9zaXplKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibW1hcCBsZW5ndGggaXMgZ3JlYXRlciB0aGFuIGZpbGUgc2l6ZSIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CiAjZW5kaWYKLQltX29iaiA9IChtbWFwX29iamVjdCAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOwotCWlmIChtX29iaiA9PSBOVUxMKSB7cmV0dXJuIE5VTEw7fQotCW1fb2JqLT5kYXRhID0gTlVMTDsKLQltX29iai0+c2l6ZSA9IChzaXplX3QpIG1hcF9zaXplOwotCW1fb2JqLT5wb3MgPSAoc2l6ZV90KSAwOwotICAgICAgICBtX29iai0+b2Zmc2V0ID0gb2Zmc2V0OwotCWlmIChmZCA9PSAtMSkgewotCQltX29iai0+ZmQgPSAtMTsKLQkJLyogQXNzdW1lIHRoZSBjYWxsZXIgd2FudHMgdG8gbWFwIGFub255bW91cyBtZW1vcnkuCi0JCSAgIFRoaXMgaXMgdGhlIHNhbWUgYmVoYXZpb3VyIGFzIFdpbmRvd3MuICBtbWFwLm1tYXAoLTEsIHNpemUpCi0JCSAgIG9uIGJvdGggV2luZG93cyBhbmQgVW5peCBtYXAgYW5vbnltb3VzIG1lbW9yeS4KLQkJKi8KKyAgICBtX29iaiA9IChtbWFwX29iamVjdCAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOworICAgIGlmIChtX29iaiA9PSBOVUxMKSB7cmV0dXJuIE5VTEw7fQorICAgIG1fb2JqLT5kYXRhID0gTlVMTDsKKyAgICBtX29iai0+c2l6ZSA9IChzaXplX3QpIG1hcF9zaXplOworICAgIG1fb2JqLT5wb3MgPSAoc2l6ZV90KSAwOworICAgIG1fb2JqLT5vZmZzZXQgPSBvZmZzZXQ7CisgICAgaWYgKGZkID09IC0xKSB7CisgICAgICAgIG1fb2JqLT5mZCA9IC0xOworICAgICAgICAvKiBBc3N1bWUgdGhlIGNhbGxlciB3YW50cyB0byBtYXAgYW5vbnltb3VzIG1lbW9yeS4KKyAgICAgICAgICAgVGhpcyBpcyB0aGUgc2FtZSBiZWhhdmlvdXIgYXMgV2luZG93cy4gIG1tYXAubW1hcCgtMSwgc2l6ZSkKKyAgICAgICAgICAgb24gYm90aCBXaW5kb3dzIGFuZCBVbml4IG1hcCBhbm9ueW1vdXMgbWVtb3J5LgorICAgICAgICAqLwogI2lmZGVmIE1BUF9BTk9OWU1PVVMKLQkJLyogQlNEIHdheSB0byBtYXAgYW5vbnltb3VzIG1lbW9yeSAqLwotCQlmbGFncyB8PSBNQVBfQU5PTllNT1VTOworICAgICAgICAvKiBCU0Qgd2F5IHRvIG1hcCBhbm9ueW1vdXMgbWVtb3J5ICovCisgICAgICAgIGZsYWdzIHw9IE1BUF9BTk9OWU1PVVM7CiAjZWxzZQotCQkvKiBTVlI0IG1ldGhvZCB0byBtYXAgYW5vbnltb3VzIG1lbW9yeSBpcyB0byBvcGVuIC9kZXYvemVybyAqLwotCQlmZCA9IGRldnplcm8gPSBvcGVuKCIvZGV2L3plcm8iLCBPX1JEV1IpOwotCQlpZiAoZGV2emVybyA9PSAtMSkgewotCQkJUHlfREVDUkVGKG1fb2JqKTsKLQkJCVB5RXJyX1NldEZyb21FcnJubyhtbWFwX21vZHVsZV9lcnJvcik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQorICAgICAgICAvKiBTVlI0IG1ldGhvZCB0byBtYXAgYW5vbnltb3VzIG1lbW9yeSBpcyB0byBvcGVuIC9kZXYvemVybyAqLworICAgICAgICBmZCA9IGRldnplcm8gPSBvcGVuKCIvZGV2L3plcm8iLCBPX1JEV1IpOworICAgICAgICBpZiAoZGV2emVybyA9PSAtMSkgeworICAgICAgICAgICAgUHlfREVDUkVGKG1fb2JqKTsKKyAgICAgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhtbWFwX21vZHVsZV9lcnJvcik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQogI2VuZGlmCi0JfSBlbHNlIHsKLQkJbV9vYmotPmZkID0gZHVwKGZkKTsKLQkJaWYgKG1fb2JqLT5mZCA9PSAtMSkgewotCQkJUHlfREVDUkVGKG1fb2JqKTsKLQkJCVB5RXJyX1NldEZyb21FcnJubyhtbWFwX21vZHVsZV9lcnJvcik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KLQkKLQltX29iai0+ZGF0YSA9IG1tYXAoTlVMTCwgbWFwX3NpemUsCi0JCQkgICBwcm90LCBmbGFncywKLQkJCSAgIGZkLCBvZmZzZXQpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1fb2JqLT5mZCA9IGR1cChmZCk7CisgICAgICAgIGlmIChtX29iai0+ZmQgPT0gLTEpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihtX29iaik7CisgICAgICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8obW1hcF9tb2R1bGVfZXJyb3IpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CiAKLQlpZiAoZGV2emVybyAhPSAtMSkgewotCQljbG9zZShkZXZ6ZXJvKTsKLQl9CisgICAgbV9vYmotPmRhdGEgPSBtbWFwKE5VTEwsIG1hcF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICBwcm90LCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgZmQsIG9mZnNldCk7CiAKLQlpZiAobV9vYmotPmRhdGEgPT0gKGNoYXIgKiktMSkgewotCSAgICAgICAgbV9vYmotPmRhdGEgPSBOVUxMOwotCQlQeV9ERUNSRUYobV9vYmopOwotCQlQeUVycl9TZXRGcm9tRXJybm8obW1hcF9tb2R1bGVfZXJyb3IpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JbV9vYmotPmFjY2VzcyA9IChhY2Nlc3NfbW9kZSlhY2Nlc3M7Ci0JcmV0dXJuIChQeU9iamVjdCAqKW1fb2JqOworICAgIGlmIChkZXZ6ZXJvICE9IC0xKSB7CisgICAgICAgIGNsb3NlKGRldnplcm8pOworICAgIH0KKworICAgIGlmIChtX29iai0+ZGF0YSA9PSAoY2hhciAqKS0xKSB7CisgICAgICAgIG1fb2JqLT5kYXRhID0gTlVMTDsKKyAgICAgICAgUHlfREVDUkVGKG1fb2JqKTsKKyAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKG1tYXBfbW9kdWxlX2Vycm9yKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIG1fb2JqLT5hY2Nlc3MgPSAoYWNjZXNzX21vZGUpYWNjZXNzOworICAgIHJldHVybiAoUHlPYmplY3QgKiltX29iajsKIH0KICNlbmRpZiAvKiBVTklYICovCiAKQEAgLTEyMjMsMjUwICsxMjIzLDI1MCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIG5ld19tbWFwX29iamVjdChQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkaWN0KQogewotCW1tYXBfb2JqZWN0ICptX29iajsKLQlQeU9iamVjdCAqbWFwX3NpemVfb2JqID0gTlVMTCwgKm9mZnNldF9vYmogPSBOVUxMOwotCVB5X3NzaXplX3QgbWFwX3NpemUsIG9mZnNldDsKLQlEV09SRCBvZmZfaGk7CS8qIHVwcGVyIDMyIGJpdHMgb2Ygb2Zmc2V0ICovCi0JRFdPUkQgb2ZmX2xvOwkvKiBsb3dlciAzMiBiaXRzIG9mIG9mZnNldCAqLwotCURXT1JEIHNpemVfaGk7CS8qIHVwcGVyIDMyIGJpdHMgb2Ygc2l6ZSAqLwotCURXT1JEIHNpemVfbG87CS8qIGxvd2VyIDMyIGJpdHMgb2Ygc2l6ZSAqLwotCWNoYXIgKnRhZ25hbWUgPSAiIjsKLQlEV09SRCBkd0VyciA9IDA7Ci0JaW50IGZpbGVubzsKLQlIQU5ETEUgZmggPSAwOwotCWludCBhY2Nlc3MgPSAoYWNjZXNzX21vZGUpQUNDRVNTX0RFRkFVTFQ7Ci0JRFdPUkQgZmxQcm90ZWN0LCBkd0Rlc2lyZWRBY2Nlc3M7Ci0Jc3RhdGljIGNoYXIgKmtleXdvcmRzW10gPSB7ICJmaWxlbm8iLCAibGVuZ3RoIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YWduYW1lIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhY2Nlc3MiLCAib2Zmc2V0IiwgTlVMTCB9OworICAgIG1tYXBfb2JqZWN0ICptX29iajsKKyAgICBQeU9iamVjdCAqbWFwX3NpemVfb2JqID0gTlVMTCwgKm9mZnNldF9vYmogPSBOVUxMOworICAgIFB5X3NzaXplX3QgbWFwX3NpemUsIG9mZnNldDsKKyAgICBEV09SRCBvZmZfaGk7ICAgICAgIC8qIHVwcGVyIDMyIGJpdHMgb2Ygb2Zmc2V0ICovCisgICAgRFdPUkQgb2ZmX2xvOyAgICAgICAvKiBsb3dlciAzMiBiaXRzIG9mIG9mZnNldCAqLworICAgIERXT1JEIHNpemVfaGk7ICAgICAgLyogdXBwZXIgMzIgYml0cyBvZiBzaXplICovCisgICAgRFdPUkQgc2l6ZV9sbzsgICAgICAvKiBsb3dlciAzMiBiaXRzIG9mIHNpemUgKi8KKyAgICBjaGFyICp0YWduYW1lID0gIiI7CisgICAgRFdPUkQgZHdFcnIgPSAwOworICAgIGludCBmaWxlbm87CisgICAgSEFORExFIGZoID0gMDsKKyAgICBpbnQgYWNjZXNzID0gKGFjY2Vzc19tb2RlKUFDQ0VTU19ERUZBVUxUOworICAgIERXT1JEIGZsUHJvdGVjdCwgZHdEZXNpcmVkQWNjZXNzOworICAgIHN0YXRpYyBjaGFyICprZXl3b3Jkc1tdID0geyAiZmlsZW5vIiwgImxlbmd0aCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YWduYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFjY2VzcyIsICJvZmZzZXQiLCBOVUxMIH07CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RpY3QsICJpT3x6aU8iLCBrZXl3b3JkcywKLQkJCQkJICZmaWxlbm8sICZtYXBfc2l6ZV9vYmosCi0JCQkJCSAmdGFnbmFtZSwgJmFjY2VzcywgJm9mZnNldF9vYmopKSB7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RpY3QsICJpT3x6aU8iLCBrZXl3b3JkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlsZW5vLCAmbWFwX3NpemVfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0YWduYW1lLCAmYWNjZXNzLCAmb2Zmc2V0X29iaikpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0Jc3dpdGNoKChhY2Nlc3NfbW9kZSlhY2Nlc3MpIHsKLQljYXNlIEFDQ0VTU19SRUFEOgotCQlmbFByb3RlY3QgPSBQQUdFX1JFQURPTkxZOwotCQlkd0Rlc2lyZWRBY2Nlc3MgPSBGSUxFX01BUF9SRUFEOwotCQlicmVhazsKLQljYXNlIEFDQ0VTU19ERUZBVUxUOiAgY2FzZSBBQ0NFU1NfV1JJVEU6Ci0JCWZsUHJvdGVjdCA9IFBBR0VfUkVBRFdSSVRFOwotCQlkd0Rlc2lyZWRBY2Nlc3MgPSBGSUxFX01BUF9XUklURTsKLQkJYnJlYWs7Ci0JY2FzZSBBQ0NFU1NfQ09QWToKLQkJZmxQcm90ZWN0ID0gUEFHRV9XUklURUNPUFk7Ci0JCWR3RGVzaXJlZEFjY2VzcyA9IEZJTEVfTUFQX0NPUFk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkgICAgIm1tYXAgaW52YWxpZCBhY2Nlc3MgcGFyYW1ldGVyLiIpOwotCX0KKyAgICBzd2l0Y2goKGFjY2Vzc19tb2RlKWFjY2VzcykgeworICAgIGNhc2UgQUNDRVNTX1JFQUQ6CisgICAgICAgIGZsUHJvdGVjdCA9IFBBR0VfUkVBRE9OTFk7CisgICAgICAgIGR3RGVzaXJlZEFjY2VzcyA9IEZJTEVfTUFQX1JFQUQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQUNDRVNTX0RFRkFVTFQ6ICBjYXNlIEFDQ0VTU19XUklURToKKyAgICAgICAgZmxQcm90ZWN0ID0gUEFHRV9SRUFEV1JJVEU7CisgICAgICAgIGR3RGVzaXJlZEFjY2VzcyA9IEZJTEVfTUFQX1dSSVRFOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFDQ0VTU19DT1BZOgorICAgICAgICBmbFByb3RlY3QgPSBQQUdFX1dSSVRFQ09QWTsKKyAgICAgICAgZHdEZXNpcmVkQWNjZXNzID0gRklMRV9NQVBfQ09QWTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtbWFwIGludmFsaWQgYWNjZXNzIHBhcmFtZXRlci4iKTsKKyAgICB9CiAKLQltYXBfc2l6ZSA9IF9HZXRNYXBTaXplKG1hcF9zaXplX29iaiwgInNpemUiKTsKLQlpZiAobWFwX3NpemUgPCAwKQotCQlyZXR1cm4gTlVMTDsKLSAgICAgICAgb2Zmc2V0ID0gX0dldE1hcFNpemUob2Zmc2V0X29iaiwgIm9mZnNldCIpOwotICAgICAgICBpZiAob2Zmc2V0IDwgMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBtYXBfc2l6ZSA9IF9HZXRNYXBTaXplKG1hcF9zaXplX29iaiwgInNpemUiKTsKKyAgICBpZiAobWFwX3NpemUgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBvZmZzZXQgPSBfR2V0TWFwU2l6ZShvZmZzZXRfb2JqLCAib2Zmc2V0Iik7CisgICAgaWYgKG9mZnNldCA8IDApCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JLyogYXNzdW1lIC0xIGFuZCAwIGJvdGggbWVhbiBpbnZhbGlkIGZpbGVkZXNjcmlwdG9yCi0JICAgdG8gJ2Fub255bW91c2x5JyBtYXAgbWVtb3J5LgotCSAgIFhYWDogZmlsZW5vID09IDAgaXMgYSB2YWxpZCBmZCwgYnV0IHdhcyBhY2NlcHRlZCBwcmlvciB0byAyLjUuCi0JICAgWFhYOiBTaG91bGQgdGhpcyBjb2RlIGJlIGFkZGVkPwotCSAgIGlmIChmaWxlbm8gPT0gMCkKLQkgICAJUHlFcnJfV2FybihQeUV4Y19EZXByZWNhdGlvbldhcm5pbmcsCi0JCQkgICAiZG9uJ3QgdXNlIDAgZm9yIGFub255bW91cyBtZW1vcnkiKTsKLQkgKi8KLQlpZiAoZmlsZW5vICE9IC0xICYmIGZpbGVubyAhPSAwKSB7Ci0JCWZoID0gKEhBTkRMRSlfZ2V0X29zZmhhbmRsZShmaWxlbm8pOwotCQlpZiAoZmg9PShIQU5ETEUpLTEpIHsKLQkJCVB5RXJyX1NldEZyb21FcnJubyhtbWFwX21vZHVsZV9lcnJvcik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQkvKiBXaW45eCBhcHBlYXJzIHRvIG5lZWQgdXMgc2Vla2VkIHRvIHplcm8gKi8KLQkJbHNlZWsoZmlsZW5vLCAwLCBTRUVLX1NFVCk7Ci0JfQorICAgIC8qIGFzc3VtZSAtMSBhbmQgMCBib3RoIG1lYW4gaW52YWxpZCBmaWxlZGVzY3JpcHRvcgorICAgICAgIHRvICdhbm9ueW1vdXNseScgbWFwIG1lbW9yeS4KKyAgICAgICBYWFg6IGZpbGVubyA9PSAwIGlzIGEgdmFsaWQgZmQsIGJ1dCB3YXMgYWNjZXB0ZWQgcHJpb3IgdG8gMi41LgorICAgICAgIFhYWDogU2hvdWxkIHRoaXMgY29kZSBiZSBhZGRlZD8KKyAgICAgICBpZiAoZmlsZW5vID09IDApCisgICAgICAgIFB5RXJyX1dhcm4oUHlFeGNfRGVwcmVjYXRpb25XYXJuaW5nLAorICAgICAgICAgICAgICAgICAgICJkb24ndCB1c2UgMCBmb3IgYW5vbnltb3VzIG1lbW9yeSIpOworICAgICAqLworICAgIGlmIChmaWxlbm8gIT0gLTEgJiYgZmlsZW5vICE9IDApIHsKKyAgICAgICAgZmggPSAoSEFORExFKV9nZXRfb3NmaGFuZGxlKGZpbGVubyk7CisgICAgICAgIGlmIChmaD09KEhBTkRMRSktMSkgeworICAgICAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKG1tYXBfbW9kdWxlX2Vycm9yKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIC8qIFdpbjl4IGFwcGVhcnMgdG8gbmVlZCB1cyBzZWVrZWQgdG8gemVybyAqLworICAgICAgICBsc2VlayhmaWxlbm8sIDAsIFNFRUtfU0VUKTsKKyAgICB9CiAKLQltX29iaiA9IChtbWFwX29iamVjdCAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOwotCWlmIChtX29iaiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQkvKiBTZXQgZXZlcnkgZmllbGQgdG8gYW4gaW52YWxpZCBtYXJrZXIsIHNvIHdlIGNhbiBzYWZlbHkKLQkgICBkZXN0cnVjdCB0aGUgb2JqZWN0IGluIHRoZSBmYWNlIG9mIGZhaWx1cmUgKi8KLQltX29iai0+ZGF0YSA9IE5VTEw7Ci0JbV9vYmotPmZpbGVfaGFuZGxlID0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7Ci0JbV9vYmotPm1hcF9oYW5kbGUgPSBOVUxMOwotCW1fb2JqLT50YWduYW1lID0gTlVMTDsKLQltX29iai0+b2Zmc2V0ID0gb2Zmc2V0OworICAgIG1fb2JqID0gKG1tYXBfb2JqZWN0ICopdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7CisgICAgaWYgKG1fb2JqID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIC8qIFNldCBldmVyeSBmaWVsZCB0byBhbiBpbnZhbGlkIG1hcmtlciwgc28gd2UgY2FuIHNhZmVseQorICAgICAgIGRlc3RydWN0IHRoZSBvYmplY3QgaW4gdGhlIGZhY2Ugb2YgZmFpbHVyZSAqLworICAgIG1fb2JqLT5kYXRhID0gTlVMTDsKKyAgICBtX29iai0+ZmlsZV9oYW5kbGUgPSBJTlZBTElEX0hBTkRMRV9WQUxVRTsKKyAgICBtX29iai0+bWFwX2hhbmRsZSA9IE5VTEw7CisgICAgbV9vYmotPnRhZ25hbWUgPSBOVUxMOworICAgIG1fb2JqLT5vZmZzZXQgPSBvZmZzZXQ7CiAKLQlpZiAoZmgpIHsKLQkJLyogSXQgaXMgbmVjZXNzYXJ5IHRvIGR1cGxpY2F0ZSB0aGUgaGFuZGxlLCBzbyB0aGUKLQkJICAgUHl0aG9uIGNvZGUgY2FuIGNsb3NlIGl0IG9uIHVzICovCi0JCWlmICghRHVwbGljYXRlSGFuZGxlKAotCQkJR2V0Q3VycmVudFByb2Nlc3MoKSwgLyogc291cmNlIHByb2Nlc3MgaGFuZGxlICovCi0JCQlmaCwgLyogaGFuZGxlIHRvIGJlIGR1cGxpY2F0ZWQgKi8KLQkJCUdldEN1cnJlbnRQcm9jZXNzKCksIC8qIHRhcmdldCBwcm9jIGhhbmRsZSAqLwotCQkJKExQSEFORExFKSZtX29iai0+ZmlsZV9oYW5kbGUsIC8qIHJlc3VsdCAqLwotCQkJMCwgLyogYWNjZXNzIC0gaWdub3JlZCBkdWUgdG8gb3B0aW9ucyB2YWx1ZSAqLwotCQkJRkFMU0UsIC8qIGluaGVyaXRlZCBieSBjaGlsZCBwcm9jZXNzZXM/ICovCi0JCQlEVVBMSUNBVEVfU0FNRV9BQ0NFU1MpKSB7IC8qIG9wdGlvbnMgKi8KLQkJCWR3RXJyID0gR2V0TGFzdEVycm9yKCk7Ci0JCQlQeV9ERUNSRUYobV9vYmopOwotCQkJUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnIoZHdFcnIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJaWYgKCFtYXBfc2l6ZSkgewotCQkJRFdPUkQgbG93LGhpZ2g7Ci0JCQlsb3cgPSBHZXRGaWxlU2l6ZShmaCwgJmhpZ2gpOwotCQkJLyogbG93IG1pZ2h0IGp1c3QgaGFwcGVuIHRvIGhhdmUgdGhlIHZhbHVlIElOVkFMSURfRklMRV9TSVpFOwotICAgIAkJCSAgIHNvIHdlIG5lZWQgdG8gY2hlY2sgdGhlIGxhc3QgZXJyb3IgYWxzby4gKi8KLQkJCWlmIChsb3cgPT0gSU5WQUxJRF9GSUxFX1NJWkUgJiYKLQkJCSAgICAoZHdFcnIgPSBHZXRMYXN0RXJyb3IoKSkgIT0gTk9fRVJST1IpIHsKLQkJCQlQeV9ERUNSRUYobV9vYmopOwotCQkJCXJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0Vycihkd0Vycik7Ci0JCQl9CQotCQkJCSAgICAKKyAgICBpZiAoZmgpIHsKKyAgICAgICAgLyogSXQgaXMgbmVjZXNzYXJ5IHRvIGR1cGxpY2F0ZSB0aGUgaGFuZGxlLCBzbyB0aGUKKyAgICAgICAgICAgUHl0aG9uIGNvZGUgY2FuIGNsb3NlIGl0IG9uIHVzICovCisgICAgICAgIGlmICghRHVwbGljYXRlSGFuZGxlKAorICAgICAgICAgICAgR2V0Q3VycmVudFByb2Nlc3MoKSwgLyogc291cmNlIHByb2Nlc3MgaGFuZGxlICovCisgICAgICAgICAgICBmaCwgLyogaGFuZGxlIHRvIGJlIGR1cGxpY2F0ZWQgKi8KKyAgICAgICAgICAgIEdldEN1cnJlbnRQcm9jZXNzKCksIC8qIHRhcmdldCBwcm9jIGhhbmRsZSAqLworICAgICAgICAgICAgKExQSEFORExFKSZtX29iai0+ZmlsZV9oYW5kbGUsIC8qIHJlc3VsdCAqLworICAgICAgICAgICAgMCwgLyogYWNjZXNzIC0gaWdub3JlZCBkdWUgdG8gb3B0aW9ucyB2YWx1ZSAqLworICAgICAgICAgICAgRkFMU0UsIC8qIGluaGVyaXRlZCBieSBjaGlsZCBwcm9jZXNzZXM/ICovCisgICAgICAgICAgICBEVVBMSUNBVEVfU0FNRV9BQ0NFU1MpKSB7IC8qIG9wdGlvbnMgKi8KKyAgICAgICAgICAgIGR3RXJyID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgICAgICBQeV9ERUNSRUYobV9vYmopOworICAgICAgICAgICAgUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnIoZHdFcnIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtYXBfc2l6ZSkgeworICAgICAgICAgICAgRFdPUkQgbG93LGhpZ2g7CisgICAgICAgICAgICBsb3cgPSBHZXRGaWxlU2l6ZShmaCwgJmhpZ2gpOworICAgICAgICAgICAgLyogbG93IG1pZ2h0IGp1c3QgaGFwcGVuIHRvIGhhdmUgdGhlIHZhbHVlIElOVkFMSURfRklMRV9TSVpFOworICAgICAgICAgICAgICAgc28gd2UgbmVlZCB0byBjaGVjayB0aGUgbGFzdCBlcnJvciBhbHNvLiAqLworICAgICAgICAgICAgaWYgKGxvdyA9PSBJTlZBTElEX0ZJTEVfU0laRSAmJgorICAgICAgICAgICAgICAgIChkd0VyciA9IEdldExhc3RFcnJvcigpKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihtX29iaik7CisgICAgICAgICAgICAgICAgcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyKGR3RXJyKTsKKyAgICAgICAgICAgIH0KKwogI2lmIFNJWkVPRl9TSVpFX1QgPiA0Ci0JCQltX29iai0+c2l6ZSA9ICgoKHNpemVfdCloaWdoKTw8MzIpICsgbG93OworICAgICAgICAgICAgbV9vYmotPnNpemUgPSAoKChzaXplX3QpaGlnaCk8PDMyKSArIGxvdzsKICNlbHNlCi0JCQlpZiAoaGlnaCkKLQkJCQkvKiBGaWxlIGlzIHRvbyBsYXJnZSB0byBtYXAgY29tcGxldGVseSAqLwotCQkJCW1fb2JqLT5zaXplID0gKHNpemVfdCktMTsKLQkJCWVsc2UKLQkJCQltX29iai0+c2l6ZSA9IGxvdzsKKyAgICAgICAgICAgIGlmIChoaWdoKQorICAgICAgICAgICAgICAgIC8qIEZpbGUgaXMgdG9vIGxhcmdlIHRvIG1hcCBjb21wbGV0ZWx5ICovCisgICAgICAgICAgICAgICAgbV9vYmotPnNpemUgPSAoc2l6ZV90KS0xOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG1fb2JqLT5zaXplID0gbG93OwogI2VuZGlmCi0JCX0gZWxzZSB7Ci0JCQltX29iai0+c2l6ZSA9IG1hcF9zaXplOwotCQl9Ci0JfQotCWVsc2UgewotCQltX29iai0+c2l6ZSA9IG1hcF9zaXplOwotCX0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1fb2JqLT5zaXplID0gbWFwX3NpemU7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIG1fb2JqLT5zaXplID0gbWFwX3NpemU7CisgICAgfQogCi0JLyogc2V0IHRoZSBpbml0aWFsIHBvc2l0aW9uICovCi0JbV9vYmotPnBvcyA9IChzaXplX3QpIDA7CisgICAgLyogc2V0IHRoZSBpbml0aWFsIHBvc2l0aW9uICovCisgICAgbV9vYmotPnBvcyA9IChzaXplX3QpIDA7CiAKLQkvKiBzZXQgdGhlIHRhZyBuYW1lICovCi0JaWYgKHRhZ25hbWUgIT0gTlVMTCAmJiAqdGFnbmFtZSAhPSAnXDAnKSB7Ci0JCW1fb2JqLT50YWduYW1lID0gUHlNZW1fTWFsbG9jKHN0cmxlbih0YWduYW1lKSsxKTsKLQkJaWYgKG1fb2JqLT50YWduYW1lID09IE5VTEwpIHsKLQkJCVB5RXJyX05vTWVtb3J5KCk7Ci0JCQlQeV9ERUNSRUYobV9vYmopOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJc3RyY3B5KG1fb2JqLT50YWduYW1lLCB0YWduYW1lKTsKLQl9Ci0JZWxzZQotCQltX29iai0+dGFnbmFtZSA9IE5VTEw7CisgICAgLyogc2V0IHRoZSB0YWcgbmFtZSAqLworICAgIGlmICh0YWduYW1lICE9IE5VTEwgJiYgKnRhZ25hbWUgIT0gJ1wwJykgeworICAgICAgICBtX29iai0+dGFnbmFtZSA9IFB5TWVtX01hbGxvYyhzdHJsZW4odGFnbmFtZSkrMSk7CisgICAgICAgIGlmIChtX29iai0+dGFnbmFtZSA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICAgICAgUHlfREVDUkVGKG1fb2JqKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHN0cmNweShtX29iai0+dGFnbmFtZSwgdGFnbmFtZSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgbV9vYmotPnRhZ25hbWUgPSBOVUxMOwogCi0JbV9vYmotPmFjY2VzcyA9IChhY2Nlc3NfbW9kZSlhY2Nlc3M7Ci0JLyogRFdPUkQgaXMgYSA0LWJ5dGUgaW50LiAgSWYgd2UncmUgb24gYSBib3ggd2hlcmUgc2l6ZV90IGNvbnN1bWVzCi0JICogbW9yZSB0aGFuIDQgYnl0ZXMsIHdlIG5lZWQgdG8gYnJlYWsgaXQgYXBhcnQuICBFbHNlIChzaXplX3QKLQkgKiBjb25zdW1lcyA0IGJ5dGVzKSwgQyBkb2Vzbid0IGRlZmluZSB3aGF0IGhhcHBlbnMgaWYgd2Ugc2hpZnQKLQkgKiByaWdodCBieSAzMiwgc28gd2UgbmVlZCBkaWZmZXJlbnQgY29kZS4KLQkgKi8KKyAgICBtX29iai0+YWNjZXNzID0gKGFjY2Vzc19tb2RlKWFjY2VzczsKKyAgICAvKiBEV09SRCBpcyBhIDQtYnl0ZSBpbnQuICBJZiB3ZSdyZSBvbiBhIGJveCB3aGVyZSBzaXplX3QgY29uc3VtZXMKKyAgICAgKiBtb3JlIHRoYW4gNCBieXRlcywgd2UgbmVlZCB0byBicmVhayBpdCBhcGFydC4gIEVsc2UgKHNpemVfdAorICAgICAqIGNvbnN1bWVzIDQgYnl0ZXMpLCBDIGRvZXNuJ3QgZGVmaW5lIHdoYXQgaGFwcGVucyBpZiB3ZSBzaGlmdAorICAgICAqIHJpZ2h0IGJ5IDMyLCBzbyB3ZSBuZWVkIGRpZmZlcmVudCBjb2RlLgorICAgICAqLwogI2lmIFNJWkVPRl9TSVpFX1QgPiA0Ci0Jc2l6ZV9oaSA9IChEV09SRCkoKG9mZnNldCArIG1fb2JqLT5zaXplKSA+PiAzMik7Ci0Jc2l6ZV9sbyA9IChEV09SRCkoKG9mZnNldCArIG1fb2JqLT5zaXplKSAmIDB4RkZGRkZGRkYpOwotCW9mZl9oaSA9IChEV09SRCkob2Zmc2V0ID4+IDMyKTsKLQlvZmZfbG8gPSAoRFdPUkQpKG9mZnNldCAmIDB4RkZGRkZGRkYpOworICAgIHNpemVfaGkgPSAoRFdPUkQpKChvZmZzZXQgKyBtX29iai0+c2l6ZSkgPj4gMzIpOworICAgIHNpemVfbG8gPSAoRFdPUkQpKChvZmZzZXQgKyBtX29iai0+c2l6ZSkgJiAweEZGRkZGRkZGKTsKKyAgICBvZmZfaGkgPSAoRFdPUkQpKG9mZnNldCA+PiAzMik7CisgICAgb2ZmX2xvID0gKERXT1JEKShvZmZzZXQgJiAweEZGRkZGRkZGKTsKICNlbHNlCi0Jc2l6ZV9oaSA9IDA7Ci0Jc2l6ZV9sbyA9IChEV09SRCkob2Zmc2V0ICsgbV9vYmotPnNpemUpOwotCW9mZl9oaSA9IDA7Ci0Jb2ZmX2xvID0gKERXT1JEKW9mZnNldDsKKyAgICBzaXplX2hpID0gMDsKKyAgICBzaXplX2xvID0gKERXT1JEKShvZmZzZXQgKyBtX29iai0+c2l6ZSk7CisgICAgb2ZmX2hpID0gMDsKKyAgICBvZmZfbG8gPSAoRFdPUkQpb2Zmc2V0OwogI2VuZGlmCi0JLyogRm9yIGZpbGVzLCBpdCB3b3VsZCBiZSBzdWZmaWNpZW50IHRvIHBhc3MgMCBhcyBzaXplLgotCSAgIEZvciBhbm9ueW1vdXMgbWFwcywgd2UgaGF2ZSB0byBwYXNzIHRoZSBzaXplIGV4cGxpY2l0bHkuICovCi0JbV9vYmotPm1hcF9oYW5kbGUgPSBDcmVhdGVGaWxlTWFwcGluZyhtX29iai0+ZmlsZV9oYW5kbGUsCi0JCQkJCSAgICAgIE5VTEwsCi0JCQkJCSAgICAgIGZsUHJvdGVjdCwKLQkJCQkJICAgICAgc2l6ZV9oaSwKLQkJCQkJICAgICAgc2l6ZV9sbywKLQkJCQkJICAgICAgbV9vYmotPnRhZ25hbWUpOwotCWlmIChtX29iai0+bWFwX2hhbmRsZSAhPSBOVUxMKSB7Ci0JCW1fb2JqLT5kYXRhID0gKGNoYXIgKikgTWFwVmlld09mRmlsZShtX29iai0+bWFwX2hhbmRsZSwKLQkJCQkJCSAgICAgZHdEZXNpcmVkQWNjZXNzLAotCQkJCQkJICAgICBvZmZfaGksCi0JCQkJCQkgICAgIG9mZl9sbywKLQkJCQkJCSAgICAgbV9vYmotPnNpemUpOwotCQlpZiAobV9vYmotPmRhdGEgIT0gTlVMTCkKLQkJCXJldHVybiAoUHlPYmplY3QgKiltX29iajsKLQkJZWxzZSB7Ci0JCQlkd0VyciA9IEdldExhc3RFcnJvcigpOwotCQkJQ2xvc2VIYW5kbGUobV9vYmotPm1hcF9oYW5kbGUpOwotCQkJbV9vYmotPm1hcF9oYW5kbGUgPSBOVUxMOwotCQl9Ci0JfSBlbHNlCi0JCWR3RXJyID0gR2V0TGFzdEVycm9yKCk7Ci0JUHlfREVDUkVGKG1fb2JqKTsKLQlQeUVycl9TZXRGcm9tV2luZG93c0Vycihkd0Vycik7Ci0JcmV0dXJuIE5VTEw7CisgICAgLyogRm9yIGZpbGVzLCBpdCB3b3VsZCBiZSBzdWZmaWNpZW50IHRvIHBhc3MgMCBhcyBzaXplLgorICAgICAgIEZvciBhbm9ueW1vdXMgbWFwcywgd2UgaGF2ZSB0byBwYXNzIHRoZSBzaXplIGV4cGxpY2l0bHkuICovCisgICAgbV9vYmotPm1hcF9oYW5kbGUgPSBDcmVhdGVGaWxlTWFwcGluZyhtX29iai0+ZmlsZV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxQcm90ZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV9oaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX29iai0+dGFnbmFtZSk7CisgICAgaWYgKG1fb2JqLT5tYXBfaGFuZGxlICE9IE5VTEwpIHsKKyAgICAgICAgbV9vYmotPmRhdGEgPSAoY2hhciAqKSBNYXBWaWV3T2ZGaWxlKG1fb2JqLT5tYXBfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdEZXNpcmVkQWNjZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmX2hpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmX2xvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9vYmotPnNpemUpOworICAgICAgICBpZiAobV9vYmotPmRhdGEgIT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAoUHlPYmplY3QgKiltX29iajsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBkd0VyciA9IEdldExhc3RFcnJvcigpOworICAgICAgICAgICAgQ2xvc2VIYW5kbGUobV9vYmotPm1hcF9oYW5kbGUpOworICAgICAgICAgICAgbV9vYmotPm1hcF9oYW5kbGUgPSBOVUxMOworICAgICAgICB9CisgICAgfSBlbHNlCisgICAgICAgIGR3RXJyID0gR2V0TGFzdEVycm9yKCk7CisgICAgUHlfREVDUkVGKG1fb2JqKTsKKyAgICBQeUVycl9TZXRGcm9tV2luZG93c0Vycihkd0Vycik7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAjZW5kaWYgLyogTVNfV0lORE9XUyAqLwogCiBzdGF0aWMgdm9pZAogc2V0aW50KFB5T2JqZWN0ICpkLCBjb25zdCBjaGFyICpuYW1lLCBsb25nIHZhbHVlKQogewotCVB5T2JqZWN0ICpvID0gUHlJbnRfRnJvbUxvbmcodmFsdWUpOwotCWlmIChvICYmIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsIG5hbWUsIG8pID09IDApIHsKLQkJUHlfREVDUkVGKG8pOwotCX0KKyAgICBQeU9iamVjdCAqbyA9IFB5SW50X0Zyb21Mb25nKHZhbHVlKTsKKyAgICBpZiAobyAmJiBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCBuYW1lLCBvKSA9PSAwKSB7CisgICAgICAgIFB5X0RFQ1JFRihvKTsKKyAgICB9CiB9CiAKIFB5TU9ESU5JVF9GVU5DCiBpbml0bW1hcCh2b2lkKQogewotCVB5T2JqZWN0ICpkaWN0LCAqbW9kdWxlOworICAgIFB5T2JqZWN0ICpkaWN0LCAqbW9kdWxlOwogCi0JaWYgKFB5VHlwZV9SZWFkeSgmbW1hcF9vYmplY3RfdHlwZSkgPCAwKQotCQlyZXR1cm47CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmbW1hcF9vYmplY3RfdHlwZSkgPCAwKQorICAgICAgICByZXR1cm47CiAKLQltb2R1bGUgPSBQeV9Jbml0TW9kdWxlKCJtbWFwIiwgTlVMTCk7Ci0JaWYgKG1vZHVsZSA9PSBOVUxMKQotCQlyZXR1cm47Ci0JZGljdCA9IFB5TW9kdWxlX0dldERpY3QobW9kdWxlKTsKLQlpZiAoIWRpY3QpCi0JCXJldHVybjsKLQltbWFwX21vZHVsZV9lcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbigibW1hcC5lcnJvciIsCi0JCVB5RXhjX0Vudmlyb25tZW50RXJyb3IgLCBOVUxMKTsKLQlpZiAobW1hcF9tb2R1bGVfZXJyb3IgPT0gTlVMTCkKLQkJcmV0dXJuOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsICJlcnJvciIsIG1tYXBfbW9kdWxlX2Vycm9yKTsKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCAibW1hcCIsIChQeU9iamVjdCopICZtbWFwX29iamVjdF90eXBlKTsKKyAgICBtb2R1bGUgPSBQeV9Jbml0TW9kdWxlKCJtbWFwIiwgTlVMTCk7CisgICAgaWYgKG1vZHVsZSA9PSBOVUxMKQorICAgICAgICByZXR1cm47CisgICAgZGljdCA9IFB5TW9kdWxlX0dldERpY3QobW9kdWxlKTsKKyAgICBpZiAoIWRpY3QpCisgICAgICAgIHJldHVybjsKKyAgICBtbWFwX21vZHVsZV9lcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbigibW1hcC5lcnJvciIsCisgICAgICAgIFB5RXhjX0Vudmlyb25tZW50RXJyb3IgLCBOVUxMKTsKKyAgICBpZiAobW1hcF9tb2R1bGVfZXJyb3IgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsICJlcnJvciIsIG1tYXBfbW9kdWxlX2Vycm9yKTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCAibW1hcCIsIChQeU9iamVjdCopICZtbWFwX29iamVjdF90eXBlKTsKICNpZmRlZiBQUk9UX0VYRUMKLQlzZXRpbnQoZGljdCwgIlBST1RfRVhFQyIsIFBST1RfRVhFQyk7CisgICAgc2V0aW50KGRpY3QsICJQUk9UX0VYRUMiLCBQUk9UX0VYRUMpOwogI2VuZGlmCiAjaWZkZWYgUFJPVF9SRUFECi0Jc2V0aW50KGRpY3QsICJQUk9UX1JFQUQiLCBQUk9UX1JFQUQpOworICAgIHNldGludChkaWN0LCAiUFJPVF9SRUFEIiwgUFJPVF9SRUFEKTsKICNlbmRpZgogI2lmZGVmIFBST1RfV1JJVEUKLQlzZXRpbnQoZGljdCwgIlBST1RfV1JJVEUiLCBQUk9UX1dSSVRFKTsKKyAgICBzZXRpbnQoZGljdCwgIlBST1RfV1JJVEUiLCBQUk9UX1dSSVRFKTsKICNlbmRpZgogCiAjaWZkZWYgTUFQX1NIQVJFRAotCXNldGludChkaWN0LCAiTUFQX1NIQVJFRCIsIE1BUF9TSEFSRUQpOworICAgIHNldGludChkaWN0LCAiTUFQX1NIQVJFRCIsIE1BUF9TSEFSRUQpOwogI2VuZGlmCiAjaWZkZWYgTUFQX1BSSVZBVEUKLQlzZXRpbnQoZGljdCwgIk1BUF9QUklWQVRFIiwgTUFQX1BSSVZBVEUpOworICAgIHNldGludChkaWN0LCAiTUFQX1BSSVZBVEUiLCBNQVBfUFJJVkFURSk7CiAjZW5kaWYKICNpZmRlZiBNQVBfREVOWVdSSVRFCi0Jc2V0aW50KGRpY3QsICJNQVBfREVOWVdSSVRFIiwgTUFQX0RFTllXUklURSk7CisgICAgc2V0aW50KGRpY3QsICJNQVBfREVOWVdSSVRFIiwgTUFQX0RFTllXUklURSk7CiAjZW5kaWYKICNpZmRlZiBNQVBfRVhFQ1VUQUJMRQotCXNldGludChkaWN0LCAiTUFQX0VYRUNVVEFCTEUiLCBNQVBfRVhFQ1VUQUJMRSk7CisgICAgc2V0aW50KGRpY3QsICJNQVBfRVhFQ1VUQUJMRSIsIE1BUF9FWEVDVVRBQkxFKTsKICNlbmRpZgogI2lmZGVmIE1BUF9BTk9OWU1PVVMKLQlzZXRpbnQoZGljdCwgIk1BUF9BTk9OIiwgTUFQX0FOT05ZTU9VUyk7Ci0Jc2V0aW50KGRpY3QsICJNQVBfQU5PTllNT1VTIiwgTUFQX0FOT05ZTU9VUyk7CisgICAgc2V0aW50KGRpY3QsICJNQVBfQU5PTiIsIE1BUF9BTk9OWU1PVVMpOworICAgIHNldGludChkaWN0LCAiTUFQX0FOT05ZTU9VUyIsIE1BUF9BTk9OWU1PVVMpOwogI2VuZGlmCiAKLQlzZXRpbnQoZGljdCwgIlBBR0VTSVpFIiwgKGxvbmcpbXlfZ2V0cGFnZXNpemUoKSk7CisgICAgc2V0aW50KGRpY3QsICJQQUdFU0laRSIsIChsb25nKW15X2dldHBhZ2VzaXplKCkpOwogCi0Jc2V0aW50KGRpY3QsICJBTExPQ0FUSU9OR1JBTlVMQVJJVFkiLCAobG9uZylteV9nZXRhbGxvY2F0aW9uZ3JhbnVsYXJpdHkoKSk7IAorICAgIHNldGludChkaWN0LCAiQUxMT0NBVElPTkdSQU5VTEFSSVRZIiwgKGxvbmcpbXlfZ2V0YWxsb2NhdGlvbmdyYW51bGFyaXR5KCkpOwogCi0Jc2V0aW50KGRpY3QsICJBQ0NFU1NfUkVBRCIsIEFDQ0VTU19SRUFEKTsKLQlzZXRpbnQoZGljdCwgIkFDQ0VTU19XUklURSIsIEFDQ0VTU19XUklURSk7Ci0Jc2V0aW50KGRpY3QsICJBQ0NFU1NfQ09QWSIsIEFDQ0VTU19DT1BZKTsKKyAgICBzZXRpbnQoZGljdCwgIkFDQ0VTU19SRUFEIiwgQUNDRVNTX1JFQUQpOworICAgIHNldGludChkaWN0LCAiQUNDRVNTX1dSSVRFIiwgQUNDRVNTX1dSSVRFKTsKKyAgICBzZXRpbnQoZGljdCwgIkFDQ0VTU19DT1BZIiwgQUNDRVNTX0NPUFkpOwogfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9uaXNtb2R1bGUuYyBiL01vZHVsZXMvbmlzbW9kdWxlLmMKaW5kZXggOWZiYWI1YS4uMDRkODU3MCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9uaXNtb2R1bGUuYworKysgYi9Nb2R1bGVzL25pc21vZHVsZS5jCkBAIC0xLDExICsxLDExIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICBXcml0dGVuIGJ5OgotCUZyZWQgR2Fuc2V2bGVzIDxGcmVkLkdhbnNldmxlc0Bjcy51dHdlbnRlLm5sPgotCUImTyBncm91cCwKLQlGYWN1bHRlaXQgZGVyIEluZm9ybWF0aWNhLAotCVVuaXZlcnNpdGVpdCBUd2VudGUsCi0JRW5zY2hlZGUsCi0JdGhlIE5ldGhlcmxhbmRzLgorICAgIEZyZWQgR2Fuc2V2bGVzIDxGcmVkLkdhbnNldmxlc0Bjcy51dHdlbnRlLm5sPgorICAgIEImTyBncm91cCwKKyAgICBGYWN1bHRlaXQgZGVyIEluZm9ybWF0aWNhLAorICAgIFVuaXZlcnNpdGVpdCBUd2VudGUsCisgICAgRW5zY2hlZGUsCisgICAgdGhlIE5ldGhlcmxhbmRzLgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiBOSVMgbW9kdWxlIGltcGxlbWVudGF0aW9uICovCkBAIC0yMyw3ICsyMyw3IEBACiBleHRlcm4gaW50IHlwX2dldF9kZWZhdWx0X2RvbWFpbihjaGFyICoqKTsKICNlbmRpZgogCi1QeURvY19TVFJWQVIoZ2V0X2RlZmF1bHRfZG9tYWluX19kb2NfXywgCitQeURvY19TVFJWQVIoZ2V0X2RlZmF1bHRfZG9tYWluX19kb2NfXywKICJnZXRfZGVmYXVsdF9kb21haW4oKSAtPiBzdHJcblwKIENvcnJlc3BvbmRzIHRvIHRoZSBDIGxpYnJhcnkgeXBfZ2V0X2RlZmF1bHRfZG9tYWluKCkgY2FsbCwgcmV0dXJuaW5nXG5cCiB0aGUgZGVmYXVsdCBOSVMgZG9tYWluLlxuIik7CkBAIC00OSw0NCArNDksNDQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBuaXNfZXJyb3IgKGludCBlcnIpCiB7Ci0JUHlFcnJfU2V0U3RyaW5nKE5pc0Vycm9yLCB5cGVycl9zdHJpbmcoZXJyKSk7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlFcnJfU2V0U3RyaW5nKE5pc0Vycm9yLCB5cGVycl9zdHJpbmcoZXJyKSk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgbmlzX21hcCB7Ci0JY2hhciAqYWxpYXM7Ci0JY2hhciAqbWFwOwotCWludCAgZml4OworICAgIGNoYXIgKmFsaWFzOworICAgIGNoYXIgKm1hcDsKKyAgICBpbnQgIGZpeDsKIH0gYWxpYXNlcyBbXSA9IHsKLQl7InBhc3N3ZCIsCSJwYXNzd2QuYnluYW1lIiwJMH0sCi0JeyJncm91cCIsCSJncm91cC5ieW5hbWUiLAkJMH0sCi0JeyJuZXR3b3JrcyIsCSJuZXR3b3Jrcy5ieWFkZHIiLAkwfSwKLQl7Imhvc3RzIiwJImhvc3RzLmJ5bmFtZSIsCQkwfSwKLQl7InByb3RvY29scyIsCSJwcm90b2NvbHMuYnludW1iZXIiLAkwfSwKLQl7InNlcnZpY2VzIiwJInNlcnZpY2VzLmJ5bmFtZSIsCTB9LAotCXsiYWxpYXNlcyIsCSJtYWlsLmFsaWFzZXMiLAkJMX0sIC8qIGNyZWF0ZWQgd2l0aCAnbWFrZWRibSAtYScgKi8KLQl7ImV0aGVycyIsCSJldGhlcnMuYnluYW1lIiwJMH0sCi0JezBMLAkJMEwsCQkJMH0KKyAgICB7InBhc3N3ZCIsICAgICAgICAgICJwYXNzd2QuYnluYW1lIiwgICAgICAgIDB9LAorICAgIHsiZ3JvdXAiLCAgICAgICAgICAgImdyb3VwLmJ5bmFtZSIsICAgICAgICAgMH0sCisgICAgeyJuZXR3b3JrcyIsICAgICAgICAibmV0d29ya3MuYnlhZGRyIiwgICAgICAwfSwKKyAgICB7Imhvc3RzIiwgICAgICAgICAgICJob3N0cy5ieW5hbWUiLCAgICAgICAgIDB9LAorICAgIHsicHJvdG9jb2xzIiwgICAgICAgInByb3RvY29scy5ieW51bWJlciIsICAgMH0sCisgICAgeyJzZXJ2aWNlcyIsICAgICAgICAic2VydmljZXMuYnluYW1lIiwgICAgICAwfSwKKyAgICB7ImFsaWFzZXMiLCAgICAgICAgICJtYWlsLmFsaWFzZXMiLCAgICAgICAgIDF9LCAvKiBjcmVhdGVkIHdpdGggJ21ha2VkYm0gLWEnICovCisgICAgeyJldGhlcnMiLCAgICAgICAgICAiZXRoZXJzLmJ5bmFtZSIsICAgICAgICAwfSwKKyAgICB7MEwsICAgICAgICAgICAgICAgIDBMLCAgICAgICAgICAgICAgICAgICAgIDB9CiB9OwogCiBzdGF0aWMgY2hhciAqCiBuaXNfbWFwbmFtZSAoY2hhciAqbWFwLCBpbnQgKnBmaXgpCiB7Ci0JaW50IGk7CisgICAgaW50IGk7CiAKLQkqcGZpeCA9IDA7Ci0JZm9yIChpPTA7IGFsaWFzZXNbaV0uYWxpYXMgIT0gMEw7IGkrKykgewotCQlpZiAoIXN0cmNtcCAoYWxpYXNlc1tpXS5hbGlhcywgbWFwKSkgewotCQkJKnBmaXggPSBhbGlhc2VzW2ldLmZpeDsKLQkJCXJldHVybiBhbGlhc2VzW2ldLm1hcDsKLQkJfQotCQlpZiAoIXN0cmNtcCAoYWxpYXNlc1tpXS5tYXAsIG1hcCkpIHsKLQkJCSpwZml4ID0gYWxpYXNlc1tpXS5maXg7Ci0JCQlyZXR1cm4gYWxpYXNlc1tpXS5tYXA7Ci0JCX0KLQl9CisgICAgKnBmaXggPSAwOworICAgIGZvciAoaT0wOyBhbGlhc2VzW2ldLmFsaWFzICE9IDBMOyBpKyspIHsKKyAgICAgICAgaWYgKCFzdHJjbXAgKGFsaWFzZXNbaV0uYWxpYXMsIG1hcCkpIHsKKyAgICAgICAgICAgICpwZml4ID0gYWxpYXNlc1tpXS5maXg7CisgICAgICAgICAgICByZXR1cm4gYWxpYXNlc1tpXS5tYXA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFzdHJjbXAgKGFsaWFzZXNbaV0ubWFwLCBtYXApKSB7CisgICAgICAgICAgICAqcGZpeCA9IGFsaWFzZXNbaV0uZml4OworICAgICAgICAgICAgcmV0dXJuIGFsaWFzZXNbaV0ubWFwOworICAgICAgICB9CisgICAgfQogCi0JcmV0dXJuIG1hcDsKKyAgICByZXR1cm4gbWFwOwogfQogCiAjaWYgZGVmaW5lZChfX0FQUExFX18pIHx8IGRlZmluZWQoX19PcGVuQlNEX18pIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCkBAIC05NiwxNjggKzk2LDE2OCBAQAogI2VuZGlmCiAKIHN0cnVjdCB5cGNhbGxiYWNrX2RhdGEgewotCVB5T2JqZWN0CSpkaWN0OwotCWludAkJCWZpeDsKLQlQeVRocmVhZFN0YXRlICpzdGF0ZTsKKyAgICBQeU9iamVjdCAgICAgICAgICAgICpkaWN0OworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBmaXg7CisgICAgUHlUaHJlYWRTdGF0ZSAqc3RhdGU7CiB9OwogCiBzdGF0aWMgaW50CiBuaXNfZm9yZWFjaCAoaW50IGluc3RhdHVzLCBjaGFyICppbmtleSwgaW50IGlua2V5bGVuLCBjaGFyICppbnZhbCwKICAgICAgICAgICAgICBpbnQgaW52YWxsZW4sIHN0cnVjdCB5cGNhbGxiYWNrX2RhdGEgKmluZGF0YSkKIHsKLQlpZiAoaW5zdGF0dXMgPT0gWVBfVFJVRSkgewotCQlQeU9iamVjdCAqa2V5OwotCQlQeU9iamVjdCAqdmFsOwotCQlpbnQgZXJyOworICAgIGlmIChpbnN0YXR1cyA9PSBZUF9UUlVFKSB7CisgICAgICAgIFB5T2JqZWN0ICprZXk7CisgICAgICAgIFB5T2JqZWN0ICp2YWw7CisgICAgICAgIGludCBlcnI7CiAKLQkJUHlFdmFsX1Jlc3RvcmVUaHJlYWQoaW5kYXRhLT5zdGF0ZSk7Ci0JCWlmIChpbmRhdGEtPmZpeCkgewotCQkgICAgaWYgKGlua2V5bGVuID4gMCAmJiBpbmtleVtpbmtleWxlbi0xXSA9PSAnXDAnKQotCQkJaW5rZXlsZW4tLTsKLQkJICAgIGlmIChpbnZhbGxlbiA+IDAgJiYgaW52YWxbaW52YWxsZW4tMV0gPT0gJ1wwJykKLQkJCWludmFsbGVuLS07Ci0JCX0KLQkJa2V5ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoaW5rZXksIGlua2V5bGVuKTsKLQkJdmFsID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoaW52YWwsIGludmFsbGVuKTsKLQkJaWYgKGtleSA9PSBOVUxMIHx8IHZhbCA9PSBOVUxMKSB7Ci0JCQkvKiBYWFggZXJyb3IgLS0gZG9uJ3Qga25vdyBob3cgdG8gaGFuZGxlICovCi0JCQlQeUVycl9DbGVhcigpOwotCQkJUHlfWERFQ1JFRihrZXkpOwotCQkJUHlfWERFQ1JFRih2YWwpOwotCQkJcmV0dXJuIDE7Ci0JCX0KLQkJZXJyID0gUHlEaWN0X1NldEl0ZW0oaW5kYXRhLT5kaWN0LCBrZXksIHZhbCk7Ci0JCVB5X0RFQ1JFRihrZXkpOwotCQlQeV9ERUNSRUYodmFsKTsKLQkJaWYgKGVyciAhPSAwKQotCQkJUHlFcnJfQ2xlYXIoKTsKLQkJaW5kYXRhLT5zdGF0ZSA9IFB5RXZhbF9TYXZlVGhyZWFkKCk7Ci0JCWlmIChlcnIgIT0gMCkKLQkJICAJcmV0dXJuIDE7Ci0JCXJldHVybiAwOwotCX0KLQlyZXR1cm4gMTsKKyAgICAgICAgUHlFdmFsX1Jlc3RvcmVUaHJlYWQoaW5kYXRhLT5zdGF0ZSk7CisgICAgICAgIGlmIChpbmRhdGEtPmZpeCkgeworICAgICAgICAgICAgaWYgKGlua2V5bGVuID4gMCAmJiBpbmtleVtpbmtleWxlbi0xXSA9PSAnXDAnKQorICAgICAgICAgICAgaW5rZXlsZW4tLTsKKyAgICAgICAgICAgIGlmIChpbnZhbGxlbiA+IDAgJiYgaW52YWxbaW52YWxsZW4tMV0gPT0gJ1wwJykKKyAgICAgICAgICAgIGludmFsbGVuLS07CisgICAgICAgIH0KKyAgICAgICAga2V5ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoaW5rZXksIGlua2V5bGVuKTsKKyAgICAgICAgdmFsID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoaW52YWwsIGludmFsbGVuKTsKKyAgICAgICAgaWYgKGtleSA9PSBOVUxMIHx8IHZhbCA9PSBOVUxMKSB7CisgICAgICAgICAgICAvKiBYWFggZXJyb3IgLS0gZG9uJ3Qga25vdyBob3cgdG8gaGFuZGxlICovCisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgUHlfWERFQ1JFRihrZXkpOworICAgICAgICAgICAgUHlfWERFQ1JFRih2YWwpOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgZXJyID0gUHlEaWN0X1NldEl0ZW0oaW5kYXRhLT5kaWN0LCBrZXksIHZhbCk7CisgICAgICAgIFB5X0RFQ1JFRihrZXkpOworICAgICAgICBQeV9ERUNSRUYodmFsKTsKKyAgICAgICAgaWYgKGVyciAhPSAwKQorICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgaW5kYXRhLT5zdGF0ZSA9IFB5RXZhbF9TYXZlVGhyZWFkKCk7CisgICAgICAgIGlmIChlcnIgIT0gMCkKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBuaXNfZ2V0X2RlZmF1bHRfZG9tYWluIChQeU9iamVjdCAqc2VsZikKIHsKLQljaGFyICpkb21haW47Ci0JaW50IGVycjsKLQlQeU9iamVjdCAqcmVzOworICAgIGNoYXIgKmRvbWFpbjsKKyAgICBpbnQgZXJyOworICAgIFB5T2JqZWN0ICpyZXM7CiAKLQlpZiAoKGVyciA9IHlwX2dldF9kZWZhdWx0X2RvbWFpbigmZG9tYWluKSkgIT0gMCkKLQkJcmV0dXJuIG5pc19lcnJvcihlcnIpOworICAgIGlmICgoZXJyID0geXBfZ2V0X2RlZmF1bHRfZG9tYWluKCZkb21haW4pKSAhPSAwKQorICAgICAgICByZXR1cm4gbmlzX2Vycm9yKGVycik7CiAKLQlyZXMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSAoZG9tYWluLCBzdHJsZW4oZG9tYWluKSk7Ci0JcmV0dXJuIHJlczsKKyAgICByZXMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSAoZG9tYWluLCBzdHJsZW4oZG9tYWluKSk7CisgICAgcmV0dXJuIHJlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG5pc19tYXRjaCAoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkaWN0KQogewotCWNoYXIgKm1hdGNoOwotCWNoYXIgKmRvbWFpbiA9IE5VTEw7Ci0JaW50IGtleWxlbiwgbGVuOwotCWNoYXIgKmtleSwgKm1hcDsKLQlpbnQgZXJyOwotCVB5T2JqZWN0ICpyZXM7Ci0JaW50IGZpeDsKLQlzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7ImtleSIsICJtYXAiLCAiZG9tYWluIiwgTlVMTH07CisgICAgY2hhciAqbWF0Y2g7CisgICAgY2hhciAqZG9tYWluID0gTlVMTDsKKyAgICBpbnQga2V5bGVuLCBsZW47CisgICAgY2hhciAqa2V5LCAqbWFwOworICAgIGludCBlcnI7CisgICAgUHlPYmplY3QgKnJlczsKKyAgICBpbnQgZml4OworICAgIHN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsia2V5IiwgIm1hcCIsICJkb21haW4iLCBOVUxMfTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZGljdCwKLQkJCQkJICJ0I3N8czptYXRjaCIsIGt3bGlzdCwKLQkJCQkJICZrZXksICZrZXlsZW4sICZtYXAsICZkb21haW4pKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWRvbWFpbiAmJiAoKGVyciA9IHlwX2dldF9kZWZhdWx0X2RvbWFpbigmZG9tYWluKSkgIT0gMCkpCi0JCXJldHVybiBuaXNfZXJyb3IoZXJyKTsKLQltYXAgPSBuaXNfbWFwbmFtZSAobWFwLCAmZml4KTsKLQlpZiAoZml4KQotCSAgICBrZXlsZW4rKzsKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JZXJyID0geXBfbWF0Y2ggKGRvbWFpbiwgbWFwLCBrZXksIGtleWxlbiwgJm1hdGNoLCAmbGVuKTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCWlmIChmaXgpCi0JICAgIGxlbi0tOwotCWlmIChlcnIgIT0gMCkKLQkJcmV0dXJuIG5pc19lcnJvcihlcnIpOwotCXJlcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplIChtYXRjaCwgbGVuKTsKLQlmcmVlIChtYXRjaCk7Ci0JcmV0dXJuIHJlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RpY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInQjc3xzOm1hdGNoIiwga3dsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXksICZrZXlsZW4sICZtYXAsICZkb21haW4pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWRvbWFpbiAmJiAoKGVyciA9IHlwX2dldF9kZWZhdWx0X2RvbWFpbigmZG9tYWluKSkgIT0gMCkpCisgICAgICAgIHJldHVybiBuaXNfZXJyb3IoZXJyKTsKKyAgICBtYXAgPSBuaXNfbWFwbmFtZSAobWFwLCAmZml4KTsKKyAgICBpZiAoZml4KQorICAgICAgICBrZXlsZW4rKzsKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgZXJyID0geXBfbWF0Y2ggKGRvbWFpbiwgbWFwLCBrZXksIGtleWxlbiwgJm1hdGNoLCAmbGVuKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIGlmIChmaXgpCisgICAgICAgIGxlbi0tOworICAgIGlmIChlcnIgIT0gMCkKKyAgICAgICAgcmV0dXJuIG5pc19lcnJvcihlcnIpOworICAgIHJlcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplIChtYXRjaCwgbGVuKTsKKyAgICBmcmVlIChtYXRjaCk7CisgICAgcmV0dXJuIHJlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG5pc19jYXQgKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZGljdCkKIHsKLQljaGFyICpkb21haW4gPSBOVUxMOwotCWNoYXIgKm1hcDsKLQlzdHJ1Y3QgeXBhbGxfY2FsbGJhY2sgY2I7Ci0Jc3RydWN0IHlwY2FsbGJhY2tfZGF0YSBkYXRhOwotCVB5T2JqZWN0ICpkaWN0OwotCWludCBlcnI7Ci0Jc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJtYXAiLCAiZG9tYWluIiwgTlVMTH07CisgICAgY2hhciAqZG9tYWluID0gTlVMTDsKKyAgICBjaGFyICptYXA7CisgICAgc3RydWN0IHlwYWxsX2NhbGxiYWNrIGNiOworICAgIHN0cnVjdCB5cGNhbGxiYWNrX2RhdGEgZGF0YTsKKyAgICBQeU9iamVjdCAqZGljdDsKKyAgICBpbnQgZXJyOworICAgIHN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsibWFwIiwgImRvbWFpbiIsIE5VTEx9OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkaWN0LCAic3xzOmNhdCIsCi0JCQkJICAgICAgICAga3dsaXN0LCAmbWFwLCAmZG9tYWluKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFkb21haW4gJiYgKChlcnIgPSB5cF9nZXRfZGVmYXVsdF9kb21haW4oJmRvbWFpbikpICE9IDApKQotCQlyZXR1cm4gbmlzX2Vycm9yKGVycik7Ci0JZGljdCA9IFB5RGljdF9OZXcgKCk7Ci0JaWYgKGRpY3QgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JY2IuZm9yZWFjaCA9IChmb3JlYWNoZnVuYyluaXNfZm9yZWFjaDsKLQlkYXRhLmRpY3QgPSBkaWN0OwotCW1hcCA9IG5pc19tYXBuYW1lIChtYXAsICZkYXRhLmZpeCk7Ci0JY2IuZGF0YSA9IChjaGFyICopJmRhdGE7Ci0JZGF0YS5zdGF0ZSA9IFB5RXZhbF9TYXZlVGhyZWFkKCk7Ci0JZXJyID0geXBfYWxsIChkb21haW4sIG1hcCwgJmNiKTsKLQlQeUV2YWxfUmVzdG9yZVRocmVhZChkYXRhLnN0YXRlKTsKLQlpZiAoZXJyICE9IDApIHsKLQkJUHlfREVDUkVGKGRpY3QpOwotCQlyZXR1cm4gbmlzX2Vycm9yKGVycik7Ci0JfQotCXJldHVybiBkaWN0OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZGljdCwgInN8czpjYXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGt3bGlzdCwgJm1hcCwgJmRvbWFpbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZG9tYWluICYmICgoZXJyID0geXBfZ2V0X2RlZmF1bHRfZG9tYWluKCZkb21haW4pKSAhPSAwKSkKKyAgICAgICAgcmV0dXJuIG5pc19lcnJvcihlcnIpOworICAgIGRpY3QgPSBQeURpY3RfTmV3ICgpOworICAgIGlmIChkaWN0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGNiLmZvcmVhY2ggPSAoZm9yZWFjaGZ1bmMpbmlzX2ZvcmVhY2g7CisgICAgZGF0YS5kaWN0ID0gZGljdDsKKyAgICBtYXAgPSBuaXNfbWFwbmFtZSAobWFwLCAmZGF0YS5maXgpOworICAgIGNiLmRhdGEgPSAoY2hhciAqKSZkYXRhOworICAgIGRhdGEuc3RhdGUgPSBQeUV2YWxfU2F2ZVRocmVhZCgpOworICAgIGVyciA9IHlwX2FsbCAoZG9tYWluLCBtYXAsICZjYik7CisgICAgUHlFdmFsX1Jlc3RvcmVUaHJlYWQoZGF0YS5zdGF0ZSk7CisgICAgaWYgKGVyciAhPSAwKSB7CisgICAgICAgIFB5X0RFQ1JFRihkaWN0KTsKKyAgICAgICAgcmV0dXJuIG5pc19lcnJvcihlcnIpOworICAgIH0KKyAgICByZXR1cm4gZGljdDsKIH0KIAogLyogVGhlc2Ugc2hvdWxkIGJlIHVfbG9uZyBvbiBTdW4gaC93IGJ1dCBub3Qgb24gNjQtYml0IGgvdy4KICAgIFRoaXMgaXMgbm90IHBvcnRhYmxlIHRvIG1hY2hpbmVzIHdpdGggMTYtYml0IGludHMgYW5kIG5vIHByb3RvdHlwZXMgKi8KICNpZm5kZWYgWVBQUk9DX01BUExJU1QKLSNkZWZpbmUgWVBQUk9DX01BUExJU1QJMTEKKyNkZWZpbmUgWVBQUk9DX01BUExJU1QgIDExCiAjZW5kaWYKICNpZm5kZWYgWVBQUk9HCi0jZGVmaW5lIFlQUFJPRwkJMTAwMDA0CisjZGVmaW5lIFlQUFJPRyAgICAgICAgICAxMDAwMDQKICNlbmRpZgogI2lmbmRlZiBZUFZFUlMKLSNkZWZpbmUgWVBWRVJTCQkyCisjZGVmaW5lIFlQVkVSUyAgICAgICAgICAyCiAjZW5kaWYKIAogdHlwZWRlZiBjaGFyICpkb21haW5uYW1lOwogdHlwZWRlZiBjaGFyICptYXBuYW1lOwogCiBlbnVtIG5pc3N0YXQgewotCU5JU19UUlVFID0gMSwKLQlOSVNfTk9NT1JFID0gMiwKLQlOSVNfRkFMU0UgPSAwLAotCU5JU19OT01BUCA9IC0xLAotCU5JU19OT0RPTSA9IC0yLAotCU5JU19OT0tFWSA9IC0zLAotCU5JU19CQURPUCA9IC00LAotCU5JU19CQUREQiA9IC01LAotCU5JU19ZUEVSUiA9IC02LAotCU5JU19CQURBUkdTID0gLTcsCi0JTklTX1ZFUlMgPSAtOAorICAgIE5JU19UUlVFID0gMSwKKyAgICBOSVNfTk9NT1JFID0gMiwKKyAgICBOSVNfRkFMU0UgPSAwLAorICAgIE5JU19OT01BUCA9IC0xLAorICAgIE5JU19OT0RPTSA9IC0yLAorICAgIE5JU19OT0tFWSA9IC0zLAorICAgIE5JU19CQURPUCA9IC00LAorICAgIE5JU19CQUREQiA9IC01LAorICAgIE5JU19ZUEVSUiA9IC02LAorICAgIE5JU19CQURBUkdTID0gLTcsCisgICAgTklTX1ZFUlMgPSAtOAogfTsKIHR5cGVkZWYgZW51bSBuaXNzdGF0IG5pc3N0YXQ7CiAKIHN0cnVjdCBuaXNtYXBsaXN0IHsKLQltYXBuYW1lIG1hcDsKLQlzdHJ1Y3QgbmlzbWFwbGlzdCAqbmV4dDsKKyAgICBtYXBuYW1lIG1hcDsKKyAgICBzdHJ1Y3QgbmlzbWFwbGlzdCAqbmV4dDsKIH07CiB0eXBlZGVmIHN0cnVjdCBuaXNtYXBsaXN0IG5pc21hcGxpc3Q7CiAKIHN0cnVjdCBuaXNyZXNwX21hcGxpc3QgewotCW5pc3N0YXQgc3RhdDsKLQluaXNtYXBsaXN0ICptYXBzOworICAgIG5pc3N0YXQgc3RhdDsKKyAgICBuaXNtYXBsaXN0ICptYXBzOwogfTsKIHR5cGVkZWYgc3RydWN0IG5pc3Jlc3BfbWFwbGlzdCBuaXNyZXNwX21hcGxpc3Q7CiAKQEAgLTI2Nyw0NSArMjY3LDQ1IEBACiBib29sX3QKIG5pc194ZHJfZG9tYWlubmFtZShYRFIgKnhkcnMsIGRvbWFpbm5hbWUgKm9ianApCiB7Ci0JaWYgKCF4ZHJfc3RyaW5nKHhkcnMsIG9ianAsIFlQTUFYRE9NQUlOKSkgewotCQlyZXR1cm4gKEZBTFNFKTsKLQl9Ci0JcmV0dXJuIChUUlVFKTsKKyAgICBpZiAoIXhkcl9zdHJpbmcoeGRycywgb2JqcCwgWVBNQVhET01BSU4pKSB7CisgICAgICAgIHJldHVybiAoRkFMU0UpOworICAgIH0KKyAgICByZXR1cm4gKFRSVUUpOwogfQogCiBzdGF0aWMKIGJvb2xfdAogbmlzX3hkcl9tYXBuYW1lKFhEUiAqeGRycywgbWFwbmFtZSAqb2JqcCkKIHsKLQlpZiAoIXhkcl9zdHJpbmcoeGRycywgb2JqcCwgWVBNQVhNQVApKSB7Ci0JCXJldHVybiAoRkFMU0UpOwotCX0KLQlyZXR1cm4gKFRSVUUpOworICAgIGlmICgheGRyX3N0cmluZyh4ZHJzLCBvYmpwLCBZUE1BWE1BUCkpIHsKKyAgICAgICAgcmV0dXJuIChGQUxTRSk7CisgICAgfQorICAgIHJldHVybiAoVFJVRSk7CiB9CiAKIHN0YXRpYwogYm9vbF90CiBuaXNfeGRyX3lwbWFwbGlzdChYRFIgKnhkcnMsIG5pc21hcGxpc3QgKm9ianApCiB7Ci0JaWYgKCFuaXNfeGRyX21hcG5hbWUoeGRycywgJm9ianAtPm1hcCkpIHsKLQkJcmV0dXJuIChGQUxTRSk7Ci0JfQotCWlmICgheGRyX3BvaW50ZXIoeGRycywgKGNoYXIgKiopJm9ianAtPm5leHQsCi0JCQkgc2l6ZW9mKG5pc21hcGxpc3QpLCAoeGRycHJvY190KW5pc194ZHJfeXBtYXBsaXN0KSkKLQl7Ci0JCXJldHVybiAoRkFMU0UpOwotCX0KLQlyZXR1cm4gKFRSVUUpOworICAgIGlmICghbmlzX3hkcl9tYXBuYW1lKHhkcnMsICZvYmpwLT5tYXApKSB7CisgICAgICAgIHJldHVybiAoRkFMU0UpOworICAgIH0KKyAgICBpZiAoIXhkcl9wb2ludGVyKHhkcnMsIChjaGFyICoqKSZvYmpwLT5uZXh0LAorICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG5pc21hcGxpc3QpLCAoeGRycHJvY190KW5pc194ZHJfeXBtYXBsaXN0KSkKKyAgICB7CisgICAgICAgIHJldHVybiAoRkFMU0UpOworICAgIH0KKyAgICByZXR1cm4gKFRSVUUpOwogfQogCiBzdGF0aWMKIGJvb2xfdAogbmlzX3hkcl95cHN0YXQoWERSICp4ZHJzLCBuaXNzdGF0ICpvYmpwKQogewotCWlmICgheGRyX2VudW0oeGRycywgKGVudW1fdCAqKW9ianApKSB7Ci0JCXJldHVybiAoRkFMU0UpOwotCX0KLQlyZXR1cm4gKFRSVUUpOworICAgIGlmICgheGRyX2VudW0oeGRycywgKGVudW1fdCAqKW9ianApKSB7CisgICAgICAgIHJldHVybiAoRkFMU0UpOworICAgIH0KKyAgICByZXR1cm4gKFRSVUUpOwogfQogCiAKQEAgLTMxMywxNSArMzEzLDE1IEBACiBib29sX3QKIG5pc194ZHJfeXByZXNwX21hcGxpc3QoWERSICp4ZHJzLCBuaXNyZXNwX21hcGxpc3QgKm9ianApCiB7Ci0JaWYgKCFuaXNfeGRyX3lwc3RhdCh4ZHJzLCAmb2JqcC0+c3RhdCkpIHsKLQkJcmV0dXJuIChGQUxTRSk7Ci0JfQotCWlmICgheGRyX3BvaW50ZXIoeGRycywgKGNoYXIgKiopJm9ianAtPm1hcHMsCi0JCQkgc2l6ZW9mKG5pc21hcGxpc3QpLCAoeGRycHJvY190KW5pc194ZHJfeXBtYXBsaXN0KSkKLQl7Ci0JCXJldHVybiAoRkFMU0UpOwotCX0KLQlyZXR1cm4gKFRSVUUpOworICAgIGlmICghbmlzX3hkcl95cHN0YXQoeGRycywgJm9ianAtPnN0YXQpKSB7CisgICAgICAgIHJldHVybiAoRkFMU0UpOworICAgIH0KKyAgICBpZiAoIXhkcl9wb2ludGVyKHhkcnMsIChjaGFyICoqKSZvYmpwLT5tYXBzLAorICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG5pc21hcGxpc3QpLCAoeGRycHJvY190KW5pc194ZHJfeXBtYXBsaXN0KSkKKyAgICB7CisgICAgICAgIHJldHVybiAoRkFMU0UpOworICAgIH0KKyAgICByZXR1cm4gKFRSVUUpOwogfQogCiAKQEAgLTMyOSwxMDUgKzMyOSwxMDUgQEAKIG5pc3Jlc3BfbWFwbGlzdCAqCiBuaXNwcm9jX21hcGxpc3RfMihkb21haW5uYW1lICphcmdwLCBDTElFTlQgKmNsbnQpCiB7Ci0Jc3RhdGljIG5pc3Jlc3BfbWFwbGlzdCByZXM7CisgICAgc3RhdGljIG5pc3Jlc3BfbWFwbGlzdCByZXM7CiAKLQltZW1zZXQoJnJlcywgMCwgc2l6ZW9mKHJlcykpOwotCWlmIChjbG50X2NhbGwoY2xudCwgWVBQUk9DX01BUExJU1QsCi0JCSAgICAgICh4ZHJwcm9jX3QpbmlzX3hkcl9kb21haW5uYW1lLCAoY2FkZHJfdClhcmdwLAotCQkgICAgICAoeGRycHJvY190KW5pc194ZHJfeXByZXNwX21hcGxpc3QsIChjYWRkcl90KSZyZXMsCi0JCSAgICAgIFRJTUVPVVQpICE9IFJQQ19TVUNDRVNTKQotCXsKLQkJcmV0dXJuIChOVUxMKTsKLQl9Ci0JcmV0dXJuICgmcmVzKTsKKyAgICBtZW1zZXQoJnJlcywgMCwgc2l6ZW9mKHJlcykpOworICAgIGlmIChjbG50X2NhbGwoY2xudCwgWVBQUk9DX01BUExJU1QsCisgICAgICAgICAgICAgICAgICAoeGRycHJvY190KW5pc194ZHJfZG9tYWlubmFtZSwgKGNhZGRyX3QpYXJncCwKKyAgICAgICAgICAgICAgICAgICh4ZHJwcm9jX3QpbmlzX3hkcl95cHJlc3BfbWFwbGlzdCwgKGNhZGRyX3QpJnJlcywKKyAgICAgICAgICAgICAgICAgIFRJTUVPVVQpICE9IFJQQ19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChOVUxMKTsKKyAgICB9CisgICAgcmV0dXJuICgmcmVzKTsKIH0KIAogc3RhdGljCiBuaXNtYXBsaXN0ICoKIG5pc19tYXBsaXN0IChjaGFyICpkb20pCiB7Ci0JbmlzcmVzcF9tYXBsaXN0ICpsaXN0OwotCUNMSUVOVCAqY2w7Ci0JY2hhciAqc2VydmVyID0gTlVMTDsKLQlpbnQgbWFwaSA9IDA7CisgICAgbmlzcmVzcF9tYXBsaXN0ICpsaXN0OworICAgIENMSUVOVCAqY2w7CisgICAgY2hhciAqc2VydmVyID0gTlVMTDsKKyAgICBpbnQgbWFwaSA9IDA7CiAKLQl3aGlsZSAoIXNlcnZlciAmJiBhbGlhc2VzW21hcGldLm1hcCAhPSAwTCkgewotCQl5cF9tYXN0ZXIgKGRvbSwgYWxpYXNlc1ttYXBpXS5tYXAsICZzZXJ2ZXIpOwotCQltYXBpKys7Ci0JfQotICAgICAgICBpZiAoIXNlcnZlcikgewotICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKE5pc0Vycm9yLCAiTm8gTklTIG1hc3RlciBmb3VuZCBmb3IgYW55IG1hcCIpOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLQljbCA9IGNsbnRfY3JlYXRlKHNlcnZlciwgWVBQUk9HLCBZUFZFUlMsICJ0Y3AiKTsKLQlpZiAoY2wgPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoTmlzRXJyb3IsIGNsbnRfc3BjcmVhdGVlcnJvcihzZXJ2ZXIpKTsKLQkJZ290byBmaW5hbGx5OwotCX0KLQlsaXN0ID0gbmlzcHJvY19tYXBsaXN0XzIgKCZkb20sIGNsKTsKLQljbG50X2Rlc3Ryb3koY2wpOwotCWlmIChsaXN0ID09IE5VTEwpCi0JCWdvdG8gZmluYWxseTsKLQlpZiAobGlzdC0+c3RhdCAhPSBOSVNfVFJVRSkKLQkJZ290byBmaW5hbGx5OworICAgIHdoaWxlICghc2VydmVyICYmIGFsaWFzZXNbbWFwaV0ubWFwICE9IDBMKSB7CisgICAgICAgIHlwX21hc3RlciAoZG9tLCBhbGlhc2VzW21hcGldLm1hcCwgJnNlcnZlcik7CisgICAgICAgIG1hcGkrKzsKKyAgICB9CisgICAgaWYgKCFzZXJ2ZXIpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKE5pc0Vycm9yLCAiTm8gTklTIG1hc3RlciBmb3VuZCBmb3IgYW55IG1hcCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgY2wgPSBjbG50X2NyZWF0ZShzZXJ2ZXIsIFlQUFJPRywgWVBWRVJTLCAidGNwIik7CisgICAgaWYgKGNsID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKE5pc0Vycm9yLCBjbG50X3NwY3JlYXRlZXJyb3Ioc2VydmVyKSk7CisgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICB9CisgICAgbGlzdCA9IG5pc3Byb2NfbWFwbGlzdF8yICgmZG9tLCBjbCk7CisgICAgY2xudF9kZXN0cm95KGNsKTsKKyAgICBpZiAobGlzdCA9PSBOVUxMKQorICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgaWYgKGxpc3QtPnN0YXQgIT0gTklTX1RSVUUpCisgICAgICAgIGdvdG8gZmluYWxseTsKIAotCWZyZWUoc2VydmVyKTsKLQlyZXR1cm4gbGlzdC0+bWFwczsKKyAgICBmcmVlKHNlcnZlcik7CisgICAgcmV0dXJuIGxpc3QtPm1hcHM7CiAKICAgZmluYWxseToKLQlmcmVlKHNlcnZlcik7Ci0JcmV0dXJuIE5VTEw7CisgICAgZnJlZShzZXJ2ZXIpOworICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbmlzX21hcHMgKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZGljdCkKIHsKLQljaGFyICpkb21haW4gPSBOVUxMOwotCW5pc21hcGxpc3QgKm1hcHM7Ci0JUHlPYmplY3QgKmxpc3Q7Ci0gICAgICAgIGludCBlcnI7Ci0Jc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJkb21haW4iLCBOVUxMfTsKKyAgICBjaGFyICpkb21haW4gPSBOVUxMOworICAgIG5pc21hcGxpc3QgKm1hcHM7CisgICAgUHlPYmplY3QgKmxpc3Q7CisgICAgaW50IGVycjsKKyAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7ImRvbWFpbiIsIE5VTEx9OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkaWN0LAotCQkJCQkgInxzOm1hcHMiLCBrd2xpc3QsICZkb21haW4pKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWRvbWFpbiAmJiAoKGVyciA9IHlwX2dldF9kZWZhdWx0X2RvbWFpbiAoJmRvbWFpbikpICE9IDApKSB7Ci0JCW5pc19lcnJvcihlcnIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkaWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ8czptYXBzIiwga3dsaXN0LCAmZG9tYWluKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFkb21haW4gJiYgKChlcnIgPSB5cF9nZXRfZGVmYXVsdF9kb21haW4gKCZkb21haW4pKSAhPSAwKSkgeworICAgICAgICBuaXNfZXJyb3IoZXJyKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaWYgKChtYXBzID0gbmlzX21hcGxpc3QgKGRvbWFpbikpID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWlmICgobGlzdCA9IFB5TGlzdF9OZXcoMCkpID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWZvciAobWFwcyA9IG1hcHM7IG1hcHM7IG1hcHMgPSBtYXBzLT5uZXh0KSB7Ci0JCVB5T2JqZWN0ICpzdHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKG1hcHMtPm1hcCk7Ci0JCWlmICghc3RyIHx8IFB5TGlzdF9BcHBlbmQobGlzdCwgc3RyKSA8IDApCi0JCXsKLQkJCVB5X0RFQ1JFRihsaXN0KTsKLQkJCWxpc3QgPSBOVUxMOwotCQkJYnJlYWs7Ci0JCX0KLQkJUHlfREVDUkVGKHN0cik7Ci0JfQotCS8qIFhYWCBTaG91bGRuJ3Qgd2UgZnJlZSB0aGUgbGlzdCBvZiBtYXBzIG5vdz8gKi8KLQlyZXR1cm4gbGlzdDsKKyAgICBpZiAoKG1hcHMgPSBuaXNfbWFwbGlzdCAoZG9tYWluKSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKChsaXN0ID0gUHlMaXN0X05ldygwKSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZm9yIChtYXBzID0gbWFwczsgbWFwczsgbWFwcyA9IG1hcHMtPm5leHQpIHsKKyAgICAgICAgUHlPYmplY3QgKnN0ciA9IFB5U3RyaW5nX0Zyb21TdHJpbmcobWFwcy0+bWFwKTsKKyAgICAgICAgaWYgKCFzdHIgfHwgUHlMaXN0X0FwcGVuZChsaXN0LCBzdHIpIDwgMCkKKyAgICAgICAgeworICAgICAgICAgICAgUHlfREVDUkVGKGxpc3QpOworICAgICAgICAgICAgbGlzdCA9IE5VTEw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBQeV9ERUNSRUYoc3RyKTsKKyAgICB9CisgICAgLyogWFhYIFNob3VsZG4ndCB3ZSBmcmVlIHRoZSBsaXN0IG9mIG1hcHMgbm93PyAqLworICAgIHJldHVybiBsaXN0OwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgbmlzX21ldGhvZHNbXSA9IHsKLQl7Im1hdGNoIiwJCShQeUNGdW5jdGlvbiluaXNfbWF0Y2gsCi0JCQkJCU1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsCi0JCQkJCW1hdGNoX19kb2NfX30sCi0JeyJjYXQiLAkJCShQeUNGdW5jdGlvbiluaXNfY2F0LAotCQkJCQlNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLAotCQkJCQljYXRfX2RvY19ffSwKLQl7Im1hcHMiLAkJKFB5Q0Z1bmN0aW9uKW5pc19tYXBzLAotCQkJCQlNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLAotCQkJCQltYXBzX19kb2NfX30sCi0JeyJnZXRfZGVmYXVsdF9kb21haW4iLAkoUHlDRnVuY3Rpb24pbmlzX2dldF9kZWZhdWx0X2RvbWFpbiwKLSAJCQkJCU1FVEhfTk9BUkdTLAotCQkJCQlnZXRfZGVmYXVsdF9kb21haW5fX2RvY19ffSwKLQl7TlVMTCwJCQlOVUxMfQkJIC8qIFNlbnRpbmVsICovCisgICAgeyJtYXRjaCIsICAgICAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbiluaXNfbWF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hfX2RvY19ffSwKKyAgICB7ImNhdCIsICAgICAgICAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKW5pc19jYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0X19kb2NfX30sCisgICAgeyJtYXBzIiwgICAgICAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbiluaXNfbWFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBzX19kb2NfX30sCisgICAgeyJnZXRfZGVmYXVsdF9kb21haW4iLCAgICAgIChQeUNGdW5jdGlvbiluaXNfZ2V0X2RlZmF1bHRfZG9tYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVUSF9OT0FSR1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfZGVmYXVsdF9kb21haW5fX2RvY19ffSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgICAvKiBTZW50aW5lbCAqLwogfTsKIAogUHlEb2NfU1RSVkFSKG5pc19fZG9jX18sCkBAIC00MzYsMTIgKzQzNiwxMiBAQAogdm9pZAogaW5pdG5pcyAodm9pZCkKIHsKLQlQeU9iamVjdCAqbSwgKmQ7Ci0JbSA9IFB5X0luaXRNb2R1bGUzKCJuaXMiLCBuaXNfbWV0aG9kcywgbmlzX19kb2NfXyk7Ci0JaWYgKG0gPT0gTlVMTCkKLQkJcmV0dXJuOwotCWQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOwotCU5pc0Vycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJuaXMuZXJyb3IiLCBOVUxMLCBOVUxMKTsKLQlpZiAoTmlzRXJyb3IgIT0gTlVMTCkKLQkJUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgImVycm9yIiwgTmlzRXJyb3IpOworICAgIFB5T2JqZWN0ICptLCAqZDsKKyAgICBtID0gUHlfSW5pdE1vZHVsZTMoIm5pcyIsIG5pc19tZXRob2RzLCBuaXNfX2RvY19fKTsKKyAgICBpZiAobSA9PSBOVUxMKQorICAgICAgICByZXR1cm47CisgICAgZCA9IFB5TW9kdWxlX0dldERpY3QobSk7CisgICAgTmlzRXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oIm5pcy5lcnJvciIsIE5VTEwsIE5VTEwpOworICAgIGlmIChOaXNFcnJvciAhPSBOVUxMKQorICAgICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiZXJyb3IiLCBOaXNFcnJvcik7CiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL29wZXJhdG9yLmMgYi9Nb2R1bGVzL29wZXJhdG9yLmMKaW5kZXggM2VkNGJjNS4uNTkxYjVlYSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9vcGVyYXRvci5jCisrKyBiL01vZHVsZXMvb3BlcmF0b3IuYwpAQCAtMTIxLDg4ICsxMjEsODggQEAKIHN0YXRpYyBQeU9iamVjdCoKIG9wX3BvdyhQeU9iamVjdCAqcywgUHlPYmplY3QgKmEpCiB7Ci0JUHlPYmplY3QgKmExLCAqYTI7Ci0JaWYgKFB5QXJnX1VucGFja1R1cGxlKGEsInBvdyIsIDIsIDIsICZhMSwgJmEyKSkKLQkJcmV0dXJuIFB5TnVtYmVyX1Bvd2VyKGExLCBhMiwgUHlfTm9uZSk7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlPYmplY3QgKmExLCAqYTI7CisgICAgaWYgKFB5QXJnX1VucGFja1R1cGxlKGEsInBvdyIsIDIsIDIsICZhMSwgJmEyKSkKKyAgICAgICAgcmV0dXJuIFB5TnVtYmVyX1Bvd2VyKGExLCBhMiwgUHlfTm9uZSk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCoKIG9wX2lwb3coUHlPYmplY3QgKnMsIFB5T2JqZWN0ICphKQogewotCVB5T2JqZWN0ICphMSwgKmEyOwotCWlmIChQeUFyZ19VbnBhY2tUdXBsZShhLCJpcG93IiwgMiwgMiwgJmExLCAmYTIpKQotCQlyZXR1cm4gUHlOdW1iZXJfSW5QbGFjZVBvd2VyKGExLCBhMiwgUHlfTm9uZSk7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlPYmplY3QgKmExLCAqYTI7CisgICAgaWYgKFB5QXJnX1VucGFja1R1cGxlKGEsImlwb3ciLCAyLCAyLCAmYTEsICZhMikpCisgICAgICAgIHJldHVybiBQeU51bWJlcl9JblBsYWNlUG93ZXIoYTEsIGEyLCBQeV9Ob25lKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG9wX2luZGV4KFB5T2JqZWN0ICpzLCBQeU9iamVjdCAqYSkKIHsKLQlyZXR1cm4gUHlOdW1iZXJfSW5kZXgoYSk7CisgICAgcmV0dXJuIFB5TnVtYmVyX0luZGV4KGEpOwogfQogCiBzdGF0aWMgUHlPYmplY3QqCiBpc18oUHlPYmplY3QgKnMsIFB5T2JqZWN0ICphKQogewotCVB5T2JqZWN0ICphMSwgKmEyLCAqcmVzdWx0ID0gTlVMTDsKLQlpZiAoUHlBcmdfVW5wYWNrVHVwbGUoYSwiaXNfIiwgMiwgMiwgJmExLCAmYTIpKSB7Ci0JCXJlc3VsdCA9IChhMSA9PSBhMikgPyBQeV9UcnVlIDogUHlfRmFsc2U7Ci0JCVB5X0lOQ1JFRihyZXN1bHQpOwotCX0KLQlyZXR1cm4gcmVzdWx0OworICAgIFB5T2JqZWN0ICphMSwgKmEyLCAqcmVzdWx0ID0gTlVMTDsKKyAgICBpZiAoUHlBcmdfVW5wYWNrVHVwbGUoYSwiaXNfIiwgMiwgMiwgJmExLCAmYTIpKSB7CisgICAgICAgIHJlc3VsdCA9IChhMSA9PSBhMikgPyBQeV9UcnVlIDogUHlfRmFsc2U7CisgICAgICAgIFB5X0lOQ1JFRihyZXN1bHQpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgUHlPYmplY3QqCiBpc19ub3QoUHlPYmplY3QgKnMsIFB5T2JqZWN0ICphKQogewotCVB5T2JqZWN0ICphMSwgKmEyLCAqcmVzdWx0ID0gTlVMTDsKLQlpZiAoUHlBcmdfVW5wYWNrVHVwbGUoYSwiaXNfbm90IiwgMiwgMiwgJmExLCAmYTIpKSB7Ci0JCXJlc3VsdCA9IChhMSAhPSBhMikgPyBQeV9UcnVlIDogUHlfRmFsc2U7Ci0JCVB5X0lOQ1JFRihyZXN1bHQpOwotCX0KLQlyZXR1cm4gcmVzdWx0OworICAgIFB5T2JqZWN0ICphMSwgKmEyLCAqcmVzdWx0ID0gTlVMTDsKKyAgICBpZiAoUHlBcmdfVW5wYWNrVHVwbGUoYSwiaXNfbm90IiwgMiwgMiwgJmExLCAmYTIpKSB7CisgICAgICAgIHJlc3VsdCA9IChhMSAhPSBhMikgPyBQeV9UcnVlIDogUHlfRmFsc2U7CisgICAgICAgIFB5X0lOQ1JFRihyZXN1bHQpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgUHlPYmplY3QqCiBvcF9nZXRzbGljZShQeU9iamVjdCAqcywgUHlPYmplY3QgKmEpCiB7Ci0gICAgICAgIFB5T2JqZWN0ICphMTsKLSAgICAgICAgUHlfc3NpemVfdCBhMiwgYTM7CisgICAgUHlPYmplY3QgKmExOworICAgIFB5X3NzaXplX3QgYTIsIGEzOwogCi0gICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhLCAiT25uOmdldHNsaWNlIiwgJmExLCAmYTIsICZhMykpCi0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIHJldHVybiBQeVNlcXVlbmNlX0dldFNsaWNlKGExLCBhMiwgYTMpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhLCAiT25uOmdldHNsaWNlIiwgJmExLCAmYTIsICZhMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeVNlcXVlbmNlX0dldFNsaWNlKGExLCBhMiwgYTMpOwogfQogCiBzdGF0aWMgUHlPYmplY3QqCiBvcF9zZXRzbGljZShQeU9iamVjdCAqcywgUHlPYmplY3QgKmEpCiB7Ci0gICAgICAgIFB5T2JqZWN0ICphMSwgKmE0OwotICAgICAgICBQeV9zc2l6ZV90IGEyLCBhMzsKKyAgICBQeU9iamVjdCAqYTEsICphNDsKKyAgICBQeV9zc2l6ZV90IGEyLCBhMzsKIAotICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYSwgIk9ubk86c2V0c2xpY2UiLCAmYTEsICZhMiwgJmEzLCAmYTQpKQotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhLCAiT25uTzpzZXRzbGljZSIsICZhMSwgJmEyLCAmYTMsICZhNCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0gICAgICAgIGlmICgtMSA9PSBQeVNlcXVlbmNlX1NldFNsaWNlKGExLCBhMiwgYTMsIGE0KSkKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoLTEgPT0gUHlTZXF1ZW5jZV9TZXRTbGljZShhMSwgYTIsIGEzLCBhNCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JUHlfUkVUVVJOX05PTkU7CisgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCoKIG9wX2RlbHNsaWNlKFB5T2JqZWN0ICpzLCBQeU9iamVjdCAqYSkKIHsKLSAgICAgICAgUHlPYmplY3QgKmExOwotICAgICAgICBQeV9zc2l6ZV90IGEyLCBhMzsKKyAgICBQeU9iamVjdCAqYTE7CisgICAgUHlfc3NpemVfdCBhMiwgYTM7CiAKLSAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGEsICJPbm46ZGVsc2xpY2UiLCAmYTEsICZhMiwgJmEzKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYSwgIk9ubjpkZWxzbGljZSIsICZhMSwgJmEyLCAmYTMpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotICAgICAgICBpZiAoLTEgPT0gUHlTZXF1ZW5jZV9EZWxTbGljZShhMSwgYTIsIGEzKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoLTEgPT0gUHlTZXF1ZW5jZV9EZWxTbGljZShhMSwgYTIsIGEzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlQeV9SRVRVUk5fTk9ORTsKKyAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAogI3VuZGVmIHNwYW0xCkBAIC0yMTEsMTAgKzIxMSwxMCBAQAogI3VuZGVmIHNwYW0xbwogI2RlZmluZSBzcGFtMShPUCxET0MpIHsjT1AsIE9QLCBNRVRIX1ZBUkFSR1MsIFB5RG9jX1NUUihET0MpfSwKICNkZWZpbmUgc3BhbTIoT1AsQUxUT1AsRE9DKSB7I09QLCBvcF8jI09QLCBNRVRIX1ZBUkFSR1MsIFB5RG9jX1NUUihET0MpfSwgXAotCQkJICAgeyNBTFRPUCwgb3BfIyNPUCwgTUVUSF9WQVJBUkdTLCBQeURvY19TVFIoRE9DKX0sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgeyNBTFRPUCwgb3BfIyNPUCwgTUVUSF9WQVJBUkdTLCBQeURvY19TVFIoRE9DKX0sCiAjZGVmaW5lIHNwYW0xbyhPUCxET0MpIHsjT1AsIE9QLCBNRVRIX08sIFB5RG9jX1NUUihET0MpfSwKICNkZWZpbmUgc3BhbTJvKE9QLEFMVE9QLERPQykgeyNPUCwgb3BfIyNPUCwgTUVUSF9PLCBQeURvY19TVFIoRE9DKX0sIFwKLQkJCSAgIHsjQUxUT1AsIG9wXyMjT1AsIE1FVEhfTywgUHlEb2NfU1RSKERPQyl9LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsjQUxUT1AsIG9wXyMjT1AsIE1FVEhfTywgUHlEb2NfU1RSKERPQyl9LAogCiBzdGF0aWMgc3RydWN0IFB5TWV0aG9kRGVmIG9wZXJhdG9yX21ldGhvZHNbXSA9IHsKIApAQCAtMjk5LDE2ICsyOTksMTYgQEAKIHNwYW0yKGd0LF9fZ3RfXywgImd0KGEsIGIpIC0tIFNhbWUgYXMgYT5iLiIpCiBzcGFtMihnZSxfX2dlX18sICJnZShhLCBiKSAtLSBTYW1lIGFzIGE+PWIuIikKIAotCXtOVUxMLAkJTlVMTH0JCS8qIHNlbnRpbmVsICovCisgICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIAogfTsKIAogLyogaXRlbWdldHRlciBvYmplY3QgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewotCVB5T2JqZWN0X0hFQUQKLQlQeV9zc2l6ZV90IG5pdGVtczsKLQlQeU9iamVjdCAqaXRlbTsKKyAgICBQeU9iamVjdF9IRUFECisgICAgUHlfc3NpemVfdCBuaXRlbXM7CisgICAgUHlPYmplY3QgKml0ZW07CiB9IGl0ZW1nZXR0ZXJvYmplY3Q7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgaXRlbWdldHRlcl90eXBlOwpAQCAtMzE2LDc3ICszMTYsNzcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBpdGVtZ2V0dGVyX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlpdGVtZ2V0dGVyb2JqZWN0ICppZzsKLQlQeU9iamVjdCAqaXRlbTsKLQlQeV9zc2l6ZV90IG5pdGVtczsKKyAgICBpdGVtZ2V0dGVyb2JqZWN0ICppZzsKKyAgICBQeU9iamVjdCAqaXRlbTsKKyAgICBQeV9zc2l6ZV90IG5pdGVtczsKIAotCWlmICghX1B5QXJnX05vS2V5d29yZHMoIml0ZW1nZXR0ZXIoKSIsIGt3ZHMpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIV9QeUFyZ19Ob0tleXdvcmRzKCJpdGVtZ2V0dGVyKCkiLCBrd2RzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQluaXRlbXMgPSBQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpOwotCWlmIChuaXRlbXMgPD0gMSkgewotCQlpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJpdGVtZ2V0dGVyIiwgMSwgMSwgJml0ZW0pKQotCQkJcmV0dXJuIE5VTEw7Ci0JfSBlbHNlIAotCQlpdGVtID0gYXJnczsKKyAgICBuaXRlbXMgPSBQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpOworICAgIGlmIChuaXRlbXMgPD0gMSkgeworICAgICAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJpdGVtZ2V0dGVyIiwgMSwgMSwgJml0ZW0pKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfSBlbHNlCisgICAgICAgIGl0ZW0gPSBhcmdzOwogCi0JLyogY3JlYXRlIGl0ZW1nZXR0ZXJvYmplY3Qgc3RydWN0dXJlICovCi0JaWcgPSBQeU9iamVjdF9HQ19OZXcoaXRlbWdldHRlcm9iamVjdCwgJml0ZW1nZXR0ZXJfdHlwZSk7Ci0JaWYgKGlnID09IE5VTEwpIAotCQlyZXR1cm4gTlVMTDsJCi0JCi0JUHlfSU5DUkVGKGl0ZW0pOwotCWlnLT5pdGVtID0gaXRlbTsKLQlpZy0+bml0ZW1zID0gbml0ZW1zOworICAgIC8qIGNyZWF0ZSBpdGVtZ2V0dGVyb2JqZWN0IHN0cnVjdHVyZSAqLworICAgIGlnID0gUHlPYmplY3RfR0NfTmV3KGl0ZW1nZXR0ZXJvYmplY3QsICZpdGVtZ2V0dGVyX3R5cGUpOworICAgIGlmIChpZyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCVB5T2JqZWN0X0dDX1RyYWNrKGlnKTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaWc7CisgICAgUHlfSU5DUkVGKGl0ZW0pOworICAgIGlnLT5pdGVtID0gaXRlbTsKKyAgICBpZy0+bml0ZW1zID0gbml0ZW1zOworCisgICAgUHlPYmplY3RfR0NfVHJhY2soaWcpOworICAgIHJldHVybiAoUHlPYmplY3QgKilpZzsKIH0KIAogc3RhdGljIHZvaWQKIGl0ZW1nZXR0ZXJfZGVhbGxvYyhpdGVtZ2V0dGVyb2JqZWN0ICppZykKIHsKLQlQeU9iamVjdF9HQ19VblRyYWNrKGlnKTsKLQlQeV9YREVDUkVGKGlnLT5pdGVtKTsKLQlQeU9iamVjdF9HQ19EZWwoaWcpOworICAgIFB5T2JqZWN0X0dDX1VuVHJhY2soaWcpOworICAgIFB5X1hERUNSRUYoaWctPml0ZW0pOworICAgIFB5T2JqZWN0X0dDX0RlbChpZyk7CiB9CiAKIHN0YXRpYyBpbnQKIGl0ZW1nZXR0ZXJfdHJhdmVyc2UoaXRlbWdldHRlcm9iamVjdCAqaWcsIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotCVB5X1ZJU0lUKGlnLT5pdGVtKTsKLQlyZXR1cm4gMDsKKyAgICBQeV9WSVNJVChpZy0+aXRlbSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpdGVtZ2V0dGVyX2NhbGwoaXRlbWdldHRlcm9iamVjdCAqaWcsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3cpCiB7Ci0JUHlPYmplY3QgKm9iaiwgKnJlc3VsdDsKLQlQeV9zc2l6ZV90IGksIG5pdGVtcz1pZy0+bml0ZW1zOworICAgIFB5T2JqZWN0ICpvYmosICpyZXN1bHQ7CisgICAgUHlfc3NpemVfdCBpLCBuaXRlbXM9aWctPm5pdGVtczsKIAotCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgIml0ZW1nZXR0ZXIiLCAxLCAxLCAmb2JqKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKG5pdGVtcyA9PSAxKQotCQlyZXR1cm4gUHlPYmplY3RfR2V0SXRlbShvYmosIGlnLT5pdGVtKTsKKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJpdGVtZ2V0dGVyIiwgMSwgMSwgJm9iaikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChuaXRlbXMgPT0gMSkKKyAgICAgICAgcmV0dXJuIFB5T2JqZWN0X0dldEl0ZW0ob2JqLCBpZy0+aXRlbSk7CiAKLQlhc3NlcnQoUHlUdXBsZV9DaGVjayhpZy0+aXRlbSkpOwotCWFzc2VydChQeVR1cGxlX0dFVF9TSVpFKGlnLT5pdGVtKSA9PSBuaXRlbXMpOworICAgIGFzc2VydChQeVR1cGxlX0NoZWNrKGlnLT5pdGVtKSk7CisgICAgYXNzZXJ0KFB5VHVwbGVfR0VUX1NJWkUoaWctPml0ZW0pID09IG5pdGVtcyk7CiAKLQlyZXN1bHQgPSBQeVR1cGxlX05ldyhuaXRlbXMpOwotCWlmIChyZXN1bHQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgcmVzdWx0ID0gUHlUdXBsZV9OZXcobml0ZW1zKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JZm9yIChpPTAgOyBpIDwgbml0ZW1zIDsgaSsrKSB7Ci0JCVB5T2JqZWN0ICppdGVtLCAqdmFsOwotCQlpdGVtID0gUHlUdXBsZV9HRVRfSVRFTShpZy0+aXRlbSwgaSk7Ci0JCXZhbCA9IFB5T2JqZWN0X0dldEl0ZW0ob2JqLCBpdGVtKTsKLQkJaWYgKHZhbCA9PSBOVUxMKSB7Ci0JCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCVB5VHVwbGVfU0VUX0lURU0ocmVzdWx0LCBpLCB2YWwpOwotCX0KLQlyZXR1cm4gcmVzdWx0OworICAgIGZvciAoaT0wIDsgaSA8IG5pdGVtcyA7IGkrKykgeworICAgICAgICBQeU9iamVjdCAqaXRlbSwgKnZhbDsKKyAgICAgICAgaXRlbSA9IFB5VHVwbGVfR0VUX0lURU0oaWctPml0ZW0sIGkpOworICAgICAgICB2YWwgPSBQeU9iamVjdF9HZXRJdGVtKG9iaiwgaXRlbSk7CisgICAgICAgIGlmICh2YWwgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKHJlc3VsdCwgaSwgdmFsKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogUHlEb2NfU1RSVkFSKGl0ZW1nZXR0ZXJfZG9jLApAQCAtMzk3LDU1ICszOTcsNTUgQEAKIEFmdGVyLCBnPWl0ZW1nZXR0ZXIoMiw1LDMpLCB0aGUgY2FsbCBnKHIpIHJldHVybnMgKHJbMl0sIHJbNV0sIHJbM10pIik7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgaXRlbWdldHRlcl90eXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotCSJvcGVyYXRvci5pdGVtZ2V0dGVyIiwJCS8qIHRwX25hbWUgKi8KLQlzaXplb2YoaXRlbWdldHRlcm9iamVjdCksCS8qIHRwX2Jhc2ljc2l6ZSAqLwotCTAsCQkJCS8qIHRwX2l0ZW1zaXplICovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKWl0ZW1nZXR0ZXJfZGVhbGxvYywJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkvKiB0cF9jb21wYXJlICovCi0JMCwJCQkJLyogdHBfcmVwciAqLwotCTAsCQkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCS8qIHRwX2hhc2ggKi8KLQkodGVybmFyeWZ1bmMpaXRlbWdldHRlcl9jYWxsLAkvKiB0cF9jYWxsICovCi0JMCwJCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsCS8qIHRwX2ZsYWdzICovCi0JaXRlbWdldHRlcl9kb2MsCQkJLyogdHBfZG9jICovCi0JKHRyYXZlcnNlcHJvYylpdGVtZ2V0dGVyX3RyYXZlcnNlLAkvKiB0cF90cmF2ZXJzZSAqLwotCTAsCQkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCTAsCQkJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkvKiB0cF9pdGVybmV4dCAqLwotCTAsCQkJCS8qIHRwX21ldGhvZHMgKi8KLQkwLAkJCQkvKiB0cF9tZW1iZXJzICovCi0JMCwJCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCS8qIHRwX2RpY3QgKi8KLQkwLAkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KLQkwLAkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCi0JMCwJCQkJLyogdHBfaW5pdCAqLwotCTAsCQkJCS8qIHRwX2FsbG9jICovCi0JaXRlbWdldHRlcl9uZXcsCQkJLyogdHBfbmV3ICovCi0JMCwJCQkJLyogdHBfZnJlZSAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQorICAgICJvcGVyYXRvci5pdGVtZ2V0dGVyIiwgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICBzaXplb2YoaXRlbWdldHRlcm9iamVjdCksICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcilpdGVtZ2V0dGVyX2RlYWxsb2MsICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgICh0ZXJuYXJ5ZnVuYylpdGVtZ2V0dGVyX2NhbGwsICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDLCAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCisgICAgaXRlbWdldHRlcl9kb2MsICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgKHRyYXZlcnNlcHJvYylpdGVtZ2V0dGVyX3RyYXZlcnNlLCAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgaXRlbWdldHRlcl9uZXcsICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKIAogCiAvKiBhdHRyZ2V0dGVyIG9iamVjdCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCVB5X3NzaXplX3QgbmF0dHJzOwotCVB5T2JqZWN0ICphdHRyOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBQeV9zc2l6ZV90IG5hdHRyczsKKyAgICBQeU9iamVjdCAqYXR0cjsKIH0gYXR0cmdldHRlcm9iamVjdDsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBhdHRyZ2V0dGVyX3R5cGU7CkBAIC00NTMsMTIwICs0NTMsMTIwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogYXR0cmdldHRlcl9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JYXR0cmdldHRlcm9iamVjdCAqYWc7Ci0JUHlPYmplY3QgKmF0dHI7Ci0JUHlfc3NpemVfdCBuYXR0cnM7CisgICAgYXR0cmdldHRlcm9iamVjdCAqYWc7CisgICAgUHlPYmplY3QgKmF0dHI7CisgICAgUHlfc3NpemVfdCBuYXR0cnM7CiAKLQlpZiAoIV9QeUFyZ19Ob0tleXdvcmRzKCJhdHRyZ2V0dGVyKCkiLCBrd2RzKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFfUHlBcmdfTm9LZXl3b3JkcygiYXR0cmdldHRlcigpIiwga3dkcykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JbmF0dHJzID0gUHlUdXBsZV9HRVRfU0laRShhcmdzKTsKLQlpZiAobmF0dHJzIDw9IDEpIHsKLQkJaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiYXR0cmdldHRlciIsIDEsIDEsICZhdHRyKSkKLQkJCXJldHVybiBOVUxMOwotCX0gZWxzZSAKLQkJYXR0ciA9IGFyZ3M7CisgICAgbmF0dHJzID0gUHlUdXBsZV9HRVRfU0laRShhcmdzKTsKKyAgICBpZiAobmF0dHJzIDw9IDEpIHsKKyAgICAgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiYXR0cmdldHRlciIsIDEsIDEsICZhdHRyKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0gZWxzZQorICAgICAgICBhdHRyID0gYXJnczsKIAotCS8qIGNyZWF0ZSBhdHRyZ2V0dGVyb2JqZWN0IHN0cnVjdHVyZSAqLwotCWFnID0gUHlPYmplY3RfR0NfTmV3KGF0dHJnZXR0ZXJvYmplY3QsICZhdHRyZ2V0dGVyX3R5cGUpOwotCWlmIChhZyA9PSBOVUxMKSAKLQkJcmV0dXJuIE5VTEw7CQotCQotCVB5X0lOQ1JFRihhdHRyKTsKLQlhZy0+YXR0ciA9IGF0dHI7Ci0JYWctPm5hdHRycyA9IG5hdHRyczsKKyAgICAvKiBjcmVhdGUgYXR0cmdldHRlcm9iamVjdCBzdHJ1Y3R1cmUgKi8KKyAgICBhZyA9IFB5T2JqZWN0X0dDX05ldyhhdHRyZ2V0dGVyb2JqZWN0LCAmYXR0cmdldHRlcl90eXBlKTsKKyAgICBpZiAoYWcgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlQeU9iamVjdF9HQ19UcmFjayhhZyk7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWFnOworICAgIFB5X0lOQ1JFRihhdHRyKTsKKyAgICBhZy0+YXR0ciA9IGF0dHI7CisgICAgYWctPm5hdHRycyA9IG5hdHRyczsKKworICAgIFB5T2JqZWN0X0dDX1RyYWNrKGFnKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopYWc7CiB9CiAKIHN0YXRpYyB2b2lkCiBhdHRyZ2V0dGVyX2RlYWxsb2MoYXR0cmdldHRlcm9iamVjdCAqYWcpCiB7Ci0JUHlPYmplY3RfR0NfVW5UcmFjayhhZyk7Ci0JUHlfWERFQ1JFRihhZy0+YXR0cik7Ci0JUHlPYmplY3RfR0NfRGVsKGFnKTsKKyAgICBQeU9iamVjdF9HQ19VblRyYWNrKGFnKTsKKyAgICBQeV9YREVDUkVGKGFnLT5hdHRyKTsKKyAgICBQeU9iamVjdF9HQ19EZWwoYWcpOwogfQogCiBzdGF0aWMgaW50CiBhdHRyZ2V0dGVyX3RyYXZlcnNlKGF0dHJnZXR0ZXJvYmplY3QgKmFnLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlQeV9WSVNJVChhZy0+YXR0cik7Ci0JcmV0dXJuIDA7CisgICAgUHlfVklTSVQoYWctPmF0dHIpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZG90dGVkX2dldGF0dHIoUHlPYmplY3QgKm9iaiwgUHlPYmplY3QgKmF0dHIpCiB7Ci0JY2hhciAqcywgKnA7CisgICAgY2hhciAqcywgKnA7CiAKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JaWYgKFB5VW5pY29kZV9DaGVjayhhdHRyKSkgewotCQlhdHRyID0gX1B5VW5pY29kZV9Bc0RlZmF1bHRFbmNvZGVkU3RyaW5nKGF0dHIsIE5VTEwpOwotCQlpZiAoYXR0ciA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChQeVVuaWNvZGVfQ2hlY2soYXR0cikpIHsKKyAgICAgICAgYXR0ciA9IF9QeVVuaWNvZGVfQXNEZWZhdWx0RW5jb2RlZFN0cmluZyhhdHRyLCBOVUxMKTsKKyAgICAgICAgaWYgKGF0dHIgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KICNlbmRpZgotCQotCWlmICghUHlTdHJpbmdfQ2hlY2soYXR0cikpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiYXR0cmlidXRlIG5hbWUgbXVzdCBiZSBhIHN0cmluZyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CiAKLQlzID0gUHlTdHJpbmdfQVNfU1RSSU5HKGF0dHIpOwotCVB5X0lOQ1JFRihvYmopOwotCWZvciAoOzspIHsKLQkJUHlPYmplY3QgKm5ld29iaiwgKnN0cjsKLQkJcCA9IHN0cmNocihzLCAnLicpOwotCQlzdHIgPSBwID8gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocywgKHAtcykpIDogCi0JCQkgIFB5U3RyaW5nX0Zyb21TdHJpbmcocyk7Ci0JCWlmIChzdHIgPT0gTlVMTCkgewotCQkJUHlfREVDUkVGKG9iaik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQluZXdvYmogPSBQeU9iamVjdF9HZXRBdHRyKG9iaiwgc3RyKTsKLQkJUHlfREVDUkVGKHN0cik7Ci0JCVB5X0RFQ1JFRihvYmopOwotCQlpZiAobmV3b2JqID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQkJb2JqID0gbmV3b2JqOwotCQlpZiAocCA9PSBOVUxMKSBicmVhazsKLQkJcyA9IHArMTsKLQl9CisgICAgaWYgKCFQeVN0cmluZ19DaGVjayhhdHRyKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImF0dHJpYnV0ZSBuYW1lIG11c3QgYmUgYSBzdHJpbmciKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JcmV0dXJuIG9iajsKKyAgICBzID0gUHlTdHJpbmdfQVNfU1RSSU5HKGF0dHIpOworICAgIFB5X0lOQ1JFRihvYmopOworICAgIGZvciAoOzspIHsKKyAgICAgICAgUHlPYmplY3QgKm5ld29iaiwgKnN0cjsKKyAgICAgICAgcCA9IHN0cmNocihzLCAnLicpOworICAgICAgICBzdHIgPSBwID8gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocywgKHAtcykpIDoKKyAgICAgICAgICAgICAgUHlTdHJpbmdfRnJvbVN0cmluZyhzKTsKKyAgICAgICAgaWYgKHN0ciA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYob2JqKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIG5ld29iaiA9IFB5T2JqZWN0X0dldEF0dHIob2JqLCBzdHIpOworICAgICAgICBQeV9ERUNSRUYoc3RyKTsKKyAgICAgICAgUHlfREVDUkVGKG9iaik7CisgICAgICAgIGlmIChuZXdvYmogPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBvYmogPSBuZXdvYmo7CisgICAgICAgIGlmIChwID09IE5VTEwpIGJyZWFrOworICAgICAgICBzID0gcCsxOworICAgIH0KKworICAgIHJldHVybiBvYmo7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhdHRyZ2V0dGVyX2NhbGwoYXR0cmdldHRlcm9iamVjdCAqYWcsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3cpCiB7Ci0JUHlPYmplY3QgKm9iaiwgKnJlc3VsdDsKLQlQeV9zc2l6ZV90IGksIG5hdHRycz1hZy0+bmF0dHJzOworICAgIFB5T2JqZWN0ICpvYmosICpyZXN1bHQ7CisgICAgUHlfc3NpemVfdCBpLCBuYXR0cnM9YWctPm5hdHRyczsKIAotCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImF0dHJnZXR0ZXIiLCAxLCAxLCAmb2JqKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKGFnLT5uYXR0cnMgPT0gMSkKLQkJcmV0dXJuIGRvdHRlZF9nZXRhdHRyKG9iaiwgYWctPmF0dHIpOworICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImF0dHJnZXR0ZXIiLCAxLCAxLCAmb2JqKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKGFnLT5uYXR0cnMgPT0gMSkKKyAgICAgICAgcmV0dXJuIGRvdHRlZF9nZXRhdHRyKG9iaiwgYWctPmF0dHIpOwogCi0JYXNzZXJ0KFB5VHVwbGVfQ2hlY2soYWctPmF0dHIpKTsKLQlhc3NlcnQoUHlUdXBsZV9HRVRfU0laRShhZy0+YXR0cikgPT0gbmF0dHJzKTsKKyAgICBhc3NlcnQoUHlUdXBsZV9DaGVjayhhZy0+YXR0cikpOworICAgIGFzc2VydChQeVR1cGxlX0dFVF9TSVpFKGFnLT5hdHRyKSA9PSBuYXR0cnMpOwogCi0JcmVzdWx0ID0gUHlUdXBsZV9OZXcobmF0dHJzKTsKLQlpZiAocmVzdWx0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIHJlc3VsdCA9IFB5VHVwbGVfTmV3KG5hdHRycyk7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWZvciAoaT0wIDsgaSA8IG5hdHRycyA7IGkrKykgewotCQlQeU9iamVjdCAqYXR0ciwgKnZhbDsKLQkJYXR0ciA9IFB5VHVwbGVfR0VUX0lURU0oYWctPmF0dHIsIGkpOwotCQl2YWwgPSBkb3R0ZWRfZ2V0YXR0cihvYmosIGF0dHIpOwotCQlpZiAodmFsID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRihyZXN1bHQpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIGksIHZhbCk7Ci0JfQotCXJldHVybiByZXN1bHQ7CisgICAgZm9yIChpPTAgOyBpIDwgbmF0dHJzIDsgaSsrKSB7CisgICAgICAgIFB5T2JqZWN0ICphdHRyLCAqdmFsOworICAgICAgICBhdHRyID0gUHlUdXBsZV9HRVRfSVRFTShhZy0+YXR0ciwgaSk7CisgICAgICAgIHZhbCA9IGRvdHRlZF9nZXRhdHRyKG9iaiwgYXR0cik7CisgICAgICAgIGlmICh2YWwgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKHJlc3VsdCwgaSwgdmFsKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogUHlEb2NfU1RSVkFSKGF0dHJnZXR0ZXJfZG9jLApAQCAtNTc5LDU2ICs1NzksNTYgQEAKIChyLm5hbWUuZmlyc3QsIHIubmFtZS5sYXN0KS4iKTsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBhdHRyZ2V0dGVyX3R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JIm9wZXJhdG9yLmF0dHJnZXR0ZXIiLAkJLyogdHBfbmFtZSAqLwotCXNpemVvZihhdHRyZ2V0dGVyb2JqZWN0KSwJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpYXR0cmdldHRlcl9kZWFsbG9jLAkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkwLAkJCQkvKiB0cF9yZXByICovCi0JMCwJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJCQkJLyogdHBfaGFzaCAqLwotCSh0ZXJuYXJ5ZnVuYylhdHRyZ2V0dGVyX2NhbGwsCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkvKiB0cF9zdHIgKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQywJLyogdHBfZmxhZ3MgKi8KLQlhdHRyZ2V0dGVyX2RvYywJCQkvKiB0cF9kb2MgKi8KLQkodHJhdmVyc2Vwcm9jKWF0dHJnZXR0ZXJfdHJhdmVyc2UsCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JMCwJCQkJLyogdHBfaXRlciAqLwotCTAsCQkJCS8qIHRwX2l0ZXJuZXh0ICovCi0JMCwJCQkJLyogdHBfbWV0aG9kcyAqLwotCTAsCQkJCS8qIHRwX21lbWJlcnMgKi8KLQkwLAkJCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQkwLAkJCQkvKiB0cF9pbml0ICovCi0JMCwJCQkJLyogdHBfYWxsb2MgKi8KLQlhdHRyZ2V0dGVyX25ldywJCQkvKiB0cF9uZXcgKi8KLQkwLAkJCQkvKiB0cF9mcmVlICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisgICAgIm9wZXJhdG9yLmF0dHJnZXR0ZXIiLCAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgIHNpemVvZihhdHRyZ2V0dGVyb2JqZWN0KSwgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKWF0dHJnZXR0ZXJfZGVhbGxvYywgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgKHRlcm5hcnlmdW5jKWF0dHJnZXR0ZXJfY2FsbCwgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICBhdHRyZ2V0dGVyX2RvYywgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAodHJhdmVyc2Vwcm9jKWF0dHJnZXR0ZXJfdHJhdmVyc2UsICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBhdHRyZ2V0dGVyX25ldywgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCiB9OwogCiAKIC8qIG1ldGhvZGNhbGxlciBvYmplY3QgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewotCVB5T2JqZWN0X0hFQUQKLQlQeU9iamVjdCAqbmFtZTsKLQlQeU9iamVjdCAqYXJnczsKLQlQeU9iamVjdCAqa3dkczsKKyAgICBQeU9iamVjdF9IRUFECisgICAgUHlPYmplY3QgKm5hbWU7CisgICAgUHlPYmplY3QgKmFyZ3M7CisgICAgUHlPYmplY3QgKmt3ZHM7CiB9IG1ldGhvZGNhbGxlcm9iamVjdDsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBtZXRob2RjYWxsZXJfdHlwZTsKQEAgLTYzNiw2OSArNjM2LDY5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogbWV0aG9kY2FsbGVyX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQltZXRob2RjYWxsZXJvYmplY3QgKm1jOwotCVB5T2JqZWN0ICpuYW1lLCAqbmV3YXJnczsKKyAgICBtZXRob2RjYWxsZXJvYmplY3QgKm1jOworICAgIFB5T2JqZWN0ICpuYW1lLCAqbmV3YXJnczsKIAotCWlmIChQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpIDwgMSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAibWV0aG9kY2FsbGVyIG5lZWRzIGF0IGxlYXN0ICIKLQkJCQkib25lIGFyZ3VtZW50LCB0aGUgbWV0aG9kIG5hbWUiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpIDwgMSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAibWV0aG9kY2FsbGVyIG5lZWRzIGF0IGxlYXN0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJvbmUgYXJndW1lbnQsIHRoZSBtZXRob2QgbmFtZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQkvKiBjcmVhdGUgbWV0aG9kY2FsbGVyb2JqZWN0IHN0cnVjdHVyZSAqLwotCW1jID0gUHlPYmplY3RfR0NfTmV3KG1ldGhvZGNhbGxlcm9iamVjdCwgJm1ldGhvZGNhbGxlcl90eXBlKTsKLQlpZiAobWMgPT0gTlVMTCkgCi0JCXJldHVybiBOVUxMOwkKKyAgICAvKiBjcmVhdGUgbWV0aG9kY2FsbGVyb2JqZWN0IHN0cnVjdHVyZSAqLworICAgIG1jID0gUHlPYmplY3RfR0NfTmV3KG1ldGhvZGNhbGxlcm9iamVjdCwgJm1ldGhvZGNhbGxlcl90eXBlKTsKKyAgICBpZiAobWMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQluZXdhcmdzID0gUHlUdXBsZV9HZXRTbGljZShhcmdzLCAxLCBQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpKTsKLQlpZiAobmV3YXJncyA9PSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRihtYyk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQltYy0+YXJncyA9IG5ld2FyZ3M7CisgICAgbmV3YXJncyA9IFB5VHVwbGVfR2V0U2xpY2UoYXJncywgMSwgUHlUdXBsZV9HRVRfU0laRShhcmdzKSk7CisgICAgaWYgKG5ld2FyZ3MgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYobWMpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgbWMtPmFyZ3MgPSBuZXdhcmdzOwogCi0JbmFtZSA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgMCk7Ci0JUHlfSU5DUkVGKG5hbWUpOwotCW1jLT5uYW1lID0gbmFtZTsKKyAgICBuYW1lID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCAwKTsKKyAgICBQeV9JTkNSRUYobmFtZSk7CisgICAgbWMtPm5hbWUgPSBuYW1lOwogCi0JUHlfWElOQ1JFRihrd2RzKTsKLQltYy0+a3dkcyA9IGt3ZHM7CisgICAgUHlfWElOQ1JFRihrd2RzKTsKKyAgICBtYy0+a3dkcyA9IGt3ZHM7CiAKLQlQeU9iamVjdF9HQ19UcmFjayhtYyk7Ci0JcmV0dXJuIChQeU9iamVjdCAqKW1jOworICAgIFB5T2JqZWN0X0dDX1RyYWNrKG1jKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopbWM7CiB9CiAKIHN0YXRpYyB2b2lkCiBtZXRob2RjYWxsZXJfZGVhbGxvYyhtZXRob2RjYWxsZXJvYmplY3QgKm1jKQogewotCVB5T2JqZWN0X0dDX1VuVHJhY2sobWMpOwotCVB5X1hERUNSRUYobWMtPm5hbWUpOwotCVB5X1hERUNSRUYobWMtPmFyZ3MpOwotCVB5X1hERUNSRUYobWMtPmt3ZHMpOwotCVB5T2JqZWN0X0dDX0RlbChtYyk7CisgICAgUHlPYmplY3RfR0NfVW5UcmFjayhtYyk7CisgICAgUHlfWERFQ1JFRihtYy0+bmFtZSk7CisgICAgUHlfWERFQ1JFRihtYy0+YXJncyk7CisgICAgUHlfWERFQ1JFRihtYy0+a3dkcyk7CisgICAgUHlPYmplY3RfR0NfRGVsKG1jKTsKIH0KIAogc3RhdGljIGludAogbWV0aG9kY2FsbGVyX3RyYXZlcnNlKG1ldGhvZGNhbGxlcm9iamVjdCAqbWMsIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotCVB5X1ZJU0lUKG1jLT5hcmdzKTsKLQlQeV9WSVNJVChtYy0+a3dkcyk7Ci0JcmV0dXJuIDA7CisgICAgUHlfVklTSVQobWMtPmFyZ3MpOworICAgIFB5X1ZJU0lUKG1jLT5rd2RzKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG1ldGhvZGNhbGxlcl9jYWxsKG1ldGhvZGNhbGxlcm9iamVjdCAqbWMsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3cpCiB7Ci0JUHlPYmplY3QgKm1ldGhvZCwgKm9iaiwgKnJlc3VsdDsKKyAgICBQeU9iamVjdCAqbWV0aG9kLCAqb2JqLCAqcmVzdWx0OwogCi0JaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAibWV0aG9kY2FsbGVyIiwgMSwgMSwgJm9iaikpCi0JCXJldHVybiBOVUxMOwotCW1ldGhvZCA9IFB5T2JqZWN0X0dldEF0dHIob2JqLCBtYy0+bmFtZSk7Ci0JaWYgKG1ldGhvZCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlyZXN1bHQgPSBQeU9iamVjdF9DYWxsKG1ldGhvZCwgbWMtPmFyZ3MsIG1jLT5rd2RzKTsKLQlQeV9ERUNSRUYobWV0aG9kKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgIm1ldGhvZGNhbGxlciIsIDEsIDEsICZvYmopKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBtZXRob2QgPSBQeU9iamVjdF9HZXRBdHRyKG9iaiwgbWMtPm5hbWUpOworICAgIGlmIChtZXRob2QgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmVzdWx0ID0gUHlPYmplY3RfQ2FsbChtZXRob2QsIG1jLT5hcmdzLCBtYy0+a3dkcyk7CisgICAgUHlfREVDUkVGKG1ldGhvZCk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogUHlEb2NfU1RSVkFSKG1ldGhvZGNhbGxlcl9kb2MsCkBAIC03MTAsNDYgKzcxMCw0NiBAQAogci5uYW1lKCdkYXRlJywgZm9vPTEpLiIpOwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IG1ldGhvZGNhbGxlcl90eXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotCSJvcGVyYXRvci5tZXRob2RjYWxsZXIiLAkvKiB0cF9uYW1lICovCi0Jc2l6ZW9mKG1ldGhvZGNhbGxlcm9iamVjdCksCS8qIHRwX2Jhc2ljc2l6ZSAqLwotCTAsCQkJCS8qIHRwX2l0ZW1zaXplICovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKW1ldGhvZGNhbGxlcl9kZWFsbG9jLCAvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkwLAkJCQkvKiB0cF9yZXByICovCi0JMCwJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJCQkJLyogdHBfaGFzaCAqLwotCSh0ZXJuYXJ5ZnVuYyltZXRob2RjYWxsZXJfY2FsbCwJLyogdHBfY2FsbCAqLwotCTAsCQkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDLC8qIHRwX2ZsYWdzICovCi0JbWV0aG9kY2FsbGVyX2RvYywJCQkvKiB0cF9kb2MgKi8KLQkodHJhdmVyc2Vwcm9jKW1ldGhvZGNhbGxlcl90cmF2ZXJzZSwJLyogdHBfdHJhdmVyc2UgKi8KLQkwLAkJCQkvKiB0cF9jbGVhciAqLwotCTAsCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQkwLAkJCQkvKiB0cF9pdGVyICovCi0JMCwJCQkJLyogdHBfaXRlcm5leHQgKi8KLQkwLAkJCQkvKiB0cF9tZXRob2RzICovCi0JMCwJCQkJLyogdHBfbWVtYmVycyAqLwotCTAsCQkJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkvKiB0cF9kaWN0ICovCi0JMCwJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJCQkJLyogdHBfZGljdG9mZnNldCAqLwotCTAsCQkJCS8qIHRwX2luaXQgKi8KLQkwLAkJCQkvKiB0cF9hbGxvYyAqLwotCW1ldGhvZGNhbGxlcl9uZXcsCQkvKiB0cF9uZXcgKi8KLQkwLAkJCQkvKiB0cF9mcmVlICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisgICAgIm9wZXJhdG9yLm1ldGhvZGNhbGxlciIsICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgIHNpemVvZihtZXRob2RjYWxsZXJvYmplY3QpLCAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKW1ldGhvZGNhbGxlcl9kZWFsbG9jLCAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgICh0ZXJuYXJ5ZnVuYyltZXRob2RjYWxsZXJfY2FsbCwgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDLC8qIHRwX2ZsYWdzICovCisgICAgbWV0aG9kY2FsbGVyX2RvYywgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAodHJhdmVyc2Vwcm9jKW1ldGhvZGNhbGxlcl90cmF2ZXJzZSwgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBtZXRob2RjYWxsZXJfbmV3LCAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCiB9OwogCiAKQEAgLTc1OCwyNiArNzU4LDI2IEBACiBQeU1PRElOSVRfRlVOQwogaW5pdG9wZXJhdG9yKHZvaWQpCiB7Ci0JUHlPYmplY3QgKm07Ci0gICAgICAgIAotCS8qIENyZWF0ZSB0aGUgbW9kdWxlIGFuZCBhZGQgdGhlIGZ1bmN0aW9ucyAqLwotICAgICAgICBtID0gUHlfSW5pdE1vZHVsZTQoIm9wZXJhdG9yIiwgb3BlcmF0b3JfbWV0aG9kcywgb3BlcmF0b3JfZG9jLAotCQkgICAgICAgKFB5T2JqZWN0KilOVUxMLCBQWVRIT05fQVBJX1ZFUlNJT04pOwotCWlmIChtID09IE5VTEwpCi0JCXJldHVybjsKKyAgICBQeU9iamVjdCAqbTsKIAotCWlmIChQeVR5cGVfUmVhZHkoJml0ZW1nZXR0ZXJfdHlwZSkgPCAwKQotCQlyZXR1cm47Ci0JUHlfSU5DUkVGKCZpdGVtZ2V0dGVyX3R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiaXRlbWdldHRlciIsIChQeU9iamVjdCAqKSZpdGVtZ2V0dGVyX3R5cGUpOworICAgIC8qIENyZWF0ZSB0aGUgbW9kdWxlIGFuZCBhZGQgdGhlIGZ1bmN0aW9ucyAqLworICAgIG0gPSBQeV9Jbml0TW9kdWxlNCgib3BlcmF0b3IiLCBvcGVyYXRvcl9tZXRob2RzLCBvcGVyYXRvcl9kb2MsCisgICAgICAgICAgICAgICAgICAgKFB5T2JqZWN0KilOVUxMLCBQWVRIT05fQVBJX1ZFUlNJT04pOworICAgIGlmIChtID09IE5VTEwpCisgICAgICAgIHJldHVybjsKIAotCWlmIChQeVR5cGVfUmVhZHkoJmF0dHJnZXR0ZXJfdHlwZSkgPCAwKQotCQlyZXR1cm47Ci0JUHlfSU5DUkVGKCZhdHRyZ2V0dGVyX3R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiYXR0cmdldHRlciIsIChQeU9iamVjdCAqKSZhdHRyZ2V0dGVyX3R5cGUpOworICAgIGlmIChQeVR5cGVfUmVhZHkoJml0ZW1nZXR0ZXJfdHlwZSkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfSU5DUkVGKCZpdGVtZ2V0dGVyX3R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiaXRlbWdldHRlciIsIChQeU9iamVjdCAqKSZpdGVtZ2V0dGVyX3R5cGUpOwogCi0JaWYgKFB5VHlwZV9SZWFkeSgmbWV0aG9kY2FsbGVyX3R5cGUpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0lOQ1JFRigmbWV0aG9kY2FsbGVyX3R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAibWV0aG9kY2FsbGVyIiwgKFB5T2JqZWN0ICopJm1ldGhvZGNhbGxlcl90eXBlKTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZhdHRyZ2V0dGVyX3R5cGUpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0lOQ1JFRigmYXR0cmdldHRlcl90eXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgImF0dHJnZXR0ZXIiLCAoUHlPYmplY3QgKikmYXR0cmdldHRlcl90eXBlKTsKKworICAgIGlmIChQeVR5cGVfUmVhZHkoJm1ldGhvZGNhbGxlcl90eXBlKSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9JTkNSRUYoJm1ldGhvZGNhbGxlcl90eXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIm1ldGhvZGNhbGxlciIsIChQeU9iamVjdCAqKSZtZXRob2RjYWxsZXJfdHlwZSk7CiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3BhcnNlcm1vZHVsZS5jIGIvTW9kdWxlcy9wYXJzZXJtb2R1bGUuYwppbmRleCAxMmI3ZmMzLi4wZGQ2OWNkIDEwMDY0NAotLS0gYS9Nb2R1bGVzL3BhcnNlcm1vZHVsZS5jCisrKyBiL01vZHVsZXMvcGFyc2VybW9kdWxlLmMKQEAgLTU1NSw4ICs1NTUsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBldmFsX2lucHV0IDogZmlsZV9pbnB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnIsICZmbGFncyk7CiAKLQlpZiAobikgewotCSAgICByZXMgPSBwYXJzZXJfbmV3c3RvYmplY3QobiwgdHlwZSk7CisgICAgICAgIGlmIChuKSB7CisgICAgICAgICAgICByZXMgPSBwYXJzZXJfbmV3c3RvYmplY3QobiwgdHlwZSk7CiAgICAgICAgICAgICBpZiAocmVzKQogICAgICAgICAgICAgICAgICgoUHlTVF9PYmplY3QgKilyZXMpLT5zdF9mbGFncy5jZl9mbGFncyA9IGZsYWdzICYgUHlDRl9NQVNLOwogICAgICAgICB9CkBAIC03NjcsNyArNzY3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChwYXJzZXJfZXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXJkIGl0ZW0gaW4gdGVybWluYWwgbm9kZSBtdXN0IGJlIGFuIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgaW50ZWdlciwgZm91bmQgJXMiLAotCQkJCSAgICAgUHlfVFlQRSh0ZW1wKS0+dHBfbmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRSh0ZW1wKS0+dHBfbmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYobyk7CiAgICAgICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYodGVtcCk7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKQEAgLTk0MCw5ICs5NDAsOSBAQAogVkFMSURBVEVSKGxpc3RtYWtlcik7ICAgICAgICAgICBWQUxJREFURVIoeWllbGRfc3RtdCk7CiBWQUxJREFURVIodGVzdGxpc3QxKTsgICAgICAgICAgIFZBTElEQVRFUihnZW5fZm9yKTsKIFZBTElEQVRFUihnZW5faXRlcik7ICAgICAgICAgICAgVkFMSURBVEVSKGdlbl9pZik7Ci1WQUxJREFURVIodGVzdGxpc3RfZ2V4cCk7CVZBTElEQVRFUih5aWVsZF9leHByKTsKLVZBTElEQVRFUih5aWVsZF9vcl90ZXN0bGlzdCk7CVZBTElEQVRFUihvcl90ZXN0KTsKLVZBTElEQVRFUihvbGRfdGVzdCk7IAkJVkFMSURBVEVSKG9sZF9sYW1iZGVmKTsKK1ZBTElEQVRFUih0ZXN0bGlzdF9nZXhwKTsgICAgICAgVkFMSURBVEVSKHlpZWxkX2V4cHIpOworVkFMSURBVEVSKHlpZWxkX29yX3Rlc3RsaXN0KTsgICBWQUxJREFURVIob3JfdGVzdCk7CitWQUxJREFURVIob2xkX3Rlc3QpOyAgICAgICAgICAgIFZBTElEQVRFUihvbGRfbGFtYmRlZik7CiAKICN1bmRlZiBWQUxJREFURVIKIApAQCAtMTAzMSw3ICsxMDMxLDcgQEAKIHsKICAgICBpbnQgbmNoID0gTkNIKHRyZWUpOwogICAgIGludCByZXMgPSAodmFsaWRhdGVfbnR5cGUodHJlZSwgY2xhc3NkZWYpICYmCi0JICAgICAgIAkoKG5jaCA9PSA0KSB8fCAobmNoID09IDYpIHx8IChuY2ggPT0gNykpKTsKKyAgICAgICAgICAgICAgICAoKG5jaCA9PSA0KSB8fCAobmNoID09IDYpIHx8IChuY2ggPT0gNykpKTsKIAogICAgIGlmIChyZXMpIHsKICAgICAgICAgcmVzID0gKHZhbGlkYXRlX25hbWUoQ0hJTEQodHJlZSwgMCksICJjbGFzcyIpCkBAIC0xMDQyLDE3ICsxMDQyLDE3IEBACiAgICAgZWxzZSB7CiAgICAgICAgICh2b2lkKSB2YWxpZGF0ZV9udW1ub2Rlcyh0cmVlLCA0LCAiY2xhc3MiKTsKICAgICB9Ci0JCisKICAgICBpZiAocmVzKSB7Ci0JaWYgKG5jaCA9PSA3KSB7Ci0JCXJlcyA9ICgodmFsaWRhdGVfbHBhcmVuKENISUxEKHRyZWUsIDIpKSAmJgotCQkJdmFsaWRhdGVfdGVzdGxpc3QoQ0hJTEQodHJlZSwgMykpICYmCi0JCQl2YWxpZGF0ZV9ycGFyZW4oQ0hJTEQodHJlZSwgNCkpKSk7Ci0JfQotCWVsc2UgaWYgKG5jaCA9PSA2KSB7Ci0JCXJlcyA9ICh2YWxpZGF0ZV9scGFyZW4oQ0hJTEQodHJlZSwyKSkgJiYKLQkJCXZhbGlkYXRlX3JwYXJlbihDSElMRCh0cmVlLDMpKSk7Ci0JfQorICAgICAgICBpZiAobmNoID09IDcpIHsKKyAgICAgICAgICAgICAgICByZXMgPSAoKHZhbGlkYXRlX2xwYXJlbihDSElMRCh0cmVlLCAyKSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlX3Rlc3RsaXN0KENISUxEKHRyZWUsIDMpKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVfcnBhcmVuKENISUxEKHRyZWUsIDQpKSkpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKG5jaCA9PSA2KSB7CisgICAgICAgICAgICAgICAgcmVzID0gKHZhbGlkYXRlX2xwYXJlbihDSElMRCh0cmVlLDIpKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVfcnBhcmVuKENISUxEKHRyZWUsMykpKTsKKyAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gKHJlcyk7CiB9CkBAIC0xNDMzLDcgKzE0MzMsNyBAQAogICAgICAgICByZXMgPSB2YWxpZGF0ZV9nZW5faXRlcihDSElMRCh0cmVlLCAyKSk7CiAgICAgZWxzZQogICAgICAgICByZXMgPSB2YWxpZGF0ZV9udW1ub2Rlcyh0cmVlLCAyLCAiZ2VuX2lmIik7Ci0gICAgCisKICAgICBpZiAocmVzKQogICAgICAgICByZXMgPSAodmFsaWRhdGVfbmFtZShDSElMRCh0cmVlLCAwKSwgImlmIikKICAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX29sZF90ZXN0KENISUxEKHRyZWUsIDEpKSk7CkBAIC0xNTkzLDEwICsxNTkzLDEwIEBACiBzdGF0aWMgaW50CiB2YWxpZGF0ZV95aWVsZF9vcl90ZXN0bGlzdChub2RlICp0cmVlKQogewotCWlmIChUWVBFKHRyZWUpID09IHlpZWxkX2V4cHIpIAotCQlyZXR1cm4gdmFsaWRhdGVfeWllbGRfZXhwcih0cmVlKTsKLQllbHNlCi0JCXJldHVybiB2YWxpZGF0ZV90ZXN0bGlzdCh0cmVlKTsKKyAgICAgICAgaWYgKFRZUEUodHJlZSkgPT0geWllbGRfZXhwcikKKyAgICAgICAgICAgICAgICByZXR1cm4gdmFsaWRhdGVfeWllbGRfZXhwcih0cmVlKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiB2YWxpZGF0ZV90ZXN0bGlzdCh0cmVlKTsKIH0KIAogc3RhdGljIGludApAQCAtMTYxMSw3ICsxNjExLDcgQEAKICAgICBpZiAocmVzICYmIG5jaCA9PSAzCiAgICAgICAgICYmIFRZUEUoQ0hJTEQodHJlZSwgMSkpID09IGF1Z2Fzc2lnbikgewogICAgICAgICByZXMgPSB2YWxpZGF0ZV9udW1ub2RlcyhDSElMRCh0cmVlLCAxKSwgMSwgImF1Z2Fzc2lnbiIpCi0JCSYmIHZhbGlkYXRlX3lpZWxkX29yX3Rlc3RsaXN0KENISUxEKHRyZWUsIDIpKTsKKyAgICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV95aWVsZF9vcl90ZXN0bGlzdChDSElMRCh0cmVlLCAyKSk7CiAKICAgICAgICAgaWYgKHJlcykgewogICAgICAgICAgICAgY2hhciAqcyA9IFNUUihDSElMRChDSElMRCh0cmVlLCAxKSwgMCkpOwpAQCAtMTgzNywxNCArMTgzNywxNCBAQAogc3RhdGljIGludAogdmFsaWRhdGVfZG90dGVkX2FzX25hbWVzKG5vZGUgKnRyZWUpCiB7Ci0JaW50IG5jaCA9IE5DSCh0cmVlKTsKLQlpbnQgcmVzID0gaXNfb2RkKG5jaCkgJiYgdmFsaWRhdGVfZG90dGVkX2FzX25hbWUoQ0hJTEQodHJlZSwgMCkpOwotCWludCBpOworICAgICAgICBpbnQgbmNoID0gTkNIKHRyZWUpOworICAgICAgICBpbnQgcmVzID0gaXNfb2RkKG5jaCkgJiYgdmFsaWRhdGVfZG90dGVkX2FzX25hbWUoQ0hJTEQodHJlZSwgMCkpOworICAgICAgICBpbnQgaTsKIAotCWZvciAoaSA9IDE7IHJlcyAmJiAoaSA8IG5jaCk7IGkgKz0gMikKLQkgICAgcmVzID0gKHZhbGlkYXRlX2NvbW1hKENISUxEKHRyZWUsIGkpKQotCQkgICAmJiB2YWxpZGF0ZV9kb3R0ZWRfYXNfbmFtZShDSElMRCh0cmVlLCBpICsgMSkpKTsKLQlyZXR1cm4gKHJlcyk7CisgICAgICAgIGZvciAoaSA9IDE7IHJlcyAmJiAoaSA8IG5jaCk7IGkgKz0gMikKKyAgICAgICAgICAgIHJlcyA9ICh2YWxpZGF0ZV9jb21tYShDSElMRCh0cmVlLCBpKSkKKyAgICAgICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9kb3R0ZWRfYXNfbmFtZShDSElMRCh0cmVlLCBpICsgMSkpKTsKKyAgICAgICAgcmV0dXJuIChyZXMpOwogfQogCiAKQEAgLTE4NTcsOCArMTg1Nyw4IEBACiAgICAgaW50IGk7CiAKICAgICBmb3IgKGkgPSAxOyByZXMgJiYgKGkgKyAxIDwgbmNoKTsgaSArPSAyKQotCXJlcyA9ICh2YWxpZGF0ZV9jb21tYShDSElMRCh0cmVlLCBpKSkKLQkgICAgICAgJiYgdmFsaWRhdGVfaW1wb3J0X2FzX25hbWUoQ0hJTEQodHJlZSwgaSArIDEpKSk7CisgICAgICAgIHJlcyA9ICh2YWxpZGF0ZV9jb21tYShDSElMRCh0cmVlLCBpKSkKKyAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX2ltcG9ydF9hc19uYW1lKENISUxEKHRyZWUsIGkgKyAxKSkpOwogICAgIHJldHVybiAocmVzKTsKIH0KIApAQCAtMTg2NywxMyArMTg2NywxMyBAQAogc3RhdGljIGludAogdmFsaWRhdGVfaW1wb3J0X25hbWUobm9kZSAqdHJlZSkKIHsKLQlyZXR1cm4gKHZhbGlkYXRlX250eXBlKHRyZWUsIGltcG9ydF9uYW1lKQotCQkmJiB2YWxpZGF0ZV9udW1ub2Rlcyh0cmVlLCAyLCAiaW1wb3J0X25hbWUiKQotCQkmJiB2YWxpZGF0ZV9uYW1lKENISUxEKHRyZWUsIDApLCAiaW1wb3J0IikKLQkJJiYgdmFsaWRhdGVfZG90dGVkX2FzX25hbWVzKENISUxEKHRyZWUsIDEpKSk7CisgICAgICAgIHJldHVybiAodmFsaWRhdGVfbnR5cGUodHJlZSwgaW1wb3J0X25hbWUpCisgICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfbnVtbm9kZXModHJlZSwgMiwgImltcG9ydF9uYW1lIikKKyAgICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9uYW1lKENISUxEKHRyZWUsIDApLCAiaW1wb3J0IikKKyAgICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9kb3R0ZWRfYXNfbmFtZXMoQ0hJTEQodHJlZSwgMSkpKTsKIH0KIAotLyogSGVscGVyIGZ1bmN0aW9uIHRvIGNvdW50IHRoZSBudW1iZXIgb2YgbGVhZGluZyBkb3RzIGluIAorLyogSGVscGVyIGZ1bmN0aW9uIHRvIGNvdW50IHRoZSBudW1iZXIgb2YgbGVhZGluZyBkb3RzIGluCiAgKiAnZnJvbSAuLi5tb2R1bGUgaW1wb3J0IG5hbWUnCiAgKi8KIHN0YXRpYyBpbnQKQEAgLTE4ODEsOCArMTg4MSw4IEBACiB7CiAgICAgICAgIGludCBpOwogICAgICAgICBmb3IgKGkgPSAxOyBpIDwgTkNIKHRyZWUpOyBpKyspCi0JCWlmIChUWVBFKENISUxEKHRyZWUsIGkpKSAhPSBET1QpCi0JCQlicmVhazsKKyAgICAgICAgICAgICAgICBpZiAoVFlQRShDSElMRCh0cmVlLCBpKSkgIT0gRE9UKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIHJldHVybiBpLTE7CiB9CiAKQEAgLTE4OTIsMjQgKzE4OTIsMjQgQEAKIHN0YXRpYyBpbnQKIHZhbGlkYXRlX2ltcG9ydF9mcm9tKG5vZGUgKnRyZWUpCiB7Ci0JaW50IG5jaCA9IE5DSCh0cmVlKTsKLQlpbnQgbmRvdHMgPSBjb3VudF9mcm9tX2RvdHModHJlZSk7Ci0JaW50IGhhdmVuYW1lID0gKFRZUEUoQ0hJTEQodHJlZSwgbmRvdHMgKyAxKSkgPT0gZG90dGVkX25hbWUpOwotCWludCBvZmZzZXQgPSBuZG90cyArIGhhdmVuYW1lOwotCWludCByZXMgPSB2YWxpZGF0ZV9udHlwZSh0cmVlLCBpbXBvcnRfZnJvbSkKLQkJJiYgKG5jaCA+PSA0ICsgbmRvdHMpCi0JCSYmIHZhbGlkYXRlX25hbWUoQ0hJTEQodHJlZSwgMCksICJmcm9tIikKLQkJJiYgKCFoYXZlbmFtZSB8fCB2YWxpZGF0ZV9kb3R0ZWRfbmFtZShDSElMRCh0cmVlLCBuZG90cyArIDEpKSkKLQkJJiYgdmFsaWRhdGVfbmFtZShDSElMRCh0cmVlLCBvZmZzZXQgKyAxKSwgImltcG9ydCIpOworICAgICAgICBpbnQgbmNoID0gTkNIKHRyZWUpOworICAgICAgICBpbnQgbmRvdHMgPSBjb3VudF9mcm9tX2RvdHModHJlZSk7CisgICAgICAgIGludCBoYXZlbmFtZSA9IChUWVBFKENISUxEKHRyZWUsIG5kb3RzICsgMSkpID09IGRvdHRlZF9uYW1lKTsKKyAgICAgICAgaW50IG9mZnNldCA9IG5kb3RzICsgaGF2ZW5hbWU7CisgICAgICAgIGludCByZXMgPSB2YWxpZGF0ZV9udHlwZSh0cmVlLCBpbXBvcnRfZnJvbSkKKyAgICAgICAgICAgICAgICAmJiAobmNoID49IDQgKyBuZG90cykKKyAgICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9uYW1lKENISUxEKHRyZWUsIDApLCAiZnJvbSIpCisgICAgICAgICAgICAgICAgJiYgKCFoYXZlbmFtZSB8fCB2YWxpZGF0ZV9kb3R0ZWRfbmFtZShDSElMRCh0cmVlLCBuZG90cyArIDEpKSkKKyAgICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9uYW1lKENISUxEKHRyZWUsIG9mZnNldCArIDEpLCAiaW1wb3J0Iik7CiAKLQlpZiAocmVzICYmIFRZUEUoQ0hJTEQodHJlZSwgb2Zmc2V0ICsgMikpID09IExQQVIpCi0JICAgIHJlcyA9ICgobmNoID09IG9mZnNldCArIDUpCi0JCSAgICYmIHZhbGlkYXRlX2xwYXJlbihDSElMRCh0cmVlLCBvZmZzZXQgKyAyKSkKLQkJICAgJiYgdmFsaWRhdGVfaW1wb3J0X2FzX25hbWVzKENISUxEKHRyZWUsIG9mZnNldCArIDMpKQotCQkgICAmJiB2YWxpZGF0ZV9ycGFyZW4oQ0hJTEQodHJlZSwgb2Zmc2V0ICsgNCkpKTsKLQllbHNlIGlmIChyZXMgJiYgVFlQRShDSElMRCh0cmVlLCBvZmZzZXQgKyAyKSkgIT0gU1RBUikKLQkgICAgcmVzID0gdmFsaWRhdGVfaW1wb3J0X2FzX25hbWVzKENISUxEKHRyZWUsIG9mZnNldCArIDIpKTsKLQlyZXR1cm4gKHJlcyk7CisgICAgICAgIGlmIChyZXMgJiYgVFlQRShDSElMRCh0cmVlLCBvZmZzZXQgKyAyKSkgPT0gTFBBUikKKyAgICAgICAgICAgIHJlcyA9ICgobmNoID09IG9mZnNldCArIDUpCisgICAgICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfbHBhcmVuKENISUxEKHRyZWUsIG9mZnNldCArIDIpKQorICAgICAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX2ltcG9ydF9hc19uYW1lcyhDSElMRCh0cmVlLCBvZmZzZXQgKyAzKSkKKyAgICAgICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9ycGFyZW4oQ0hJTEQodHJlZSwgb2Zmc2V0ICsgNCkpKTsKKyAgICAgICAgZWxzZSBpZiAocmVzICYmIFRZUEUoQ0hJTEQodHJlZSwgb2Zmc2V0ICsgMikpICE9IFNUQVIpCisgICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV9pbXBvcnRfYXNfbmFtZXMoQ0hJTEQodHJlZSwgb2Zmc2V0ICsgMikpOworICAgICAgICByZXR1cm4gKHJlcyk7CiB9CiAKIApAQCAtMTkyMSw5ICsxOTIxLDkgQEAKICAgICBpbnQgcmVzID0gdmFsaWRhdGVfbnVtbm9kZXModHJlZSwgMSwgImltcG9ydF9zdG10Iik7CiAKICAgICBpZiAocmVzKSB7Ci0JaW50IG50eXBlID0gVFlQRShDSElMRCh0cmVlLCAwKSk7CisgICAgICAgIGludCBudHlwZSA9IFRZUEUoQ0hJTEQodHJlZSwgMCkpOwogCi0JaWYgKG50eXBlID09IGltcG9ydF9uYW1lIHx8IG50eXBlID09IGltcG9ydF9mcm9tKQorICAgICAgICBpZiAobnR5cGUgPT0gaW1wb3J0X25hbWUgfHwgbnR5cGUgPT0gaW1wb3J0X2Zyb20pCiAgICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV9ub2RlKENISUxEKHRyZWUsIDApKTsKICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICByZXMgPSAwOwpAQCAtMjQ1NiwxMSArMjQ1NiwxMSBAQAogICAgICAgICAgICAgICAgICAgICYmICh2YWxpZGF0ZV9ycGFyZW4oQ0hJTEQodHJlZSwgbmNoIC0gMSkpKSk7CiAKICAgICAgICAgICAgIGlmIChyZXMgJiYgKG5jaCA9PSAzKSkgewotCQlpZiAoVFlQRShDSElMRCh0cmVlLCAxKSk9PXlpZWxkX2V4cHIpCi0JCQlyZXMgPSB2YWxpZGF0ZV95aWVsZF9leHByKENISUxEKHRyZWUsIDEpKTsKLQkJZWxzZQotICAgICAgICAgICAgICAgIAlyZXMgPSB2YWxpZGF0ZV90ZXN0bGlzdF9nZXhwKENISUxEKHRyZWUsIDEpKTsKLQkgICAgfQorICAgICAgICAgICAgICAgIGlmIChUWVBFKENISUxEKHRyZWUsIDEpKT09eWllbGRfZXhwcikKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX3lpZWxkX2V4cHIoQ0hJTEQodHJlZSwgMSkpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX3Rlc3RsaXN0X2dleHAoQ0hJTEQodHJlZSwgMSkpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgY2FzZSBMU1FCOgogICAgICAgICAgICAgaWYgKG5jaCA9PSAyKQpAQCAtMjU4NiwxNyArMjU4NiwxNyBAQAogICAgIGludCBvazsKICAgICBpbnQgbmNoID0gTkNIKHRyZWUpOwogICAgIG9rID0gKHZhbGlkYXRlX250eXBlKHRyZWUsIGRlY29yYXRvcikgJiYKLQkgIChuY2ggPT0gMyB8fCBuY2ggPT0gNSB8fCBuY2ggPT0gNikgJiYKLQkgIHZhbGlkYXRlX2F0KENISUxEKHRyZWUsIDApKSAmJgotCSAgdmFsaWRhdGVfZG90dGVkX25hbWUoQ0hJTEQodHJlZSwgMSkpICYmCi0JICB2YWxpZGF0ZV9uZXdsaW5lKFJDSElMRCh0cmVlLCAtMSkpKTsKKyAgICAgICAgICAobmNoID09IDMgfHwgbmNoID09IDUgfHwgbmNoID09IDYpICYmCisgICAgICAgICAgdmFsaWRhdGVfYXQoQ0hJTEQodHJlZSwgMCkpICYmCisgICAgICAgICAgdmFsaWRhdGVfZG90dGVkX25hbWUoQ0hJTEQodHJlZSwgMSkpICYmCisgICAgICAgICAgdmFsaWRhdGVfbmV3bGluZShSQ0hJTEQodHJlZSwgLTEpKSk7CiAKICAgICBpZiAob2sgJiYgbmNoICE9IDMpIHsKLQlvayA9ICh2YWxpZGF0ZV9scGFyZW4oQ0hJTEQodHJlZSwgMikpICYmCi0JICAgICAgdmFsaWRhdGVfcnBhcmVuKFJDSElMRCh0cmVlLCAtMikpKTsKKyAgICAgICAgb2sgPSAodmFsaWRhdGVfbHBhcmVuKENISUxEKHRyZWUsIDIpKSAmJgorICAgICAgICAgICAgICB2YWxpZGF0ZV9ycGFyZW4oUkNISUxEKHRyZWUsIC0yKSkpOwogCi0JaWYgKG9rICYmIG5jaCA9PSA2KQotCSAgICBvayA9IHZhbGlkYXRlX2FyZ2xpc3QoQ0hJTEQodHJlZSwgMykpOworICAgICAgICBpZiAob2sgJiYgbmNoID09IDYpCisgICAgICAgICAgICBvayA9IHZhbGlkYXRlX2FyZ2xpc3QoQ0hJTEQodHJlZSwgMykpOwogICAgIH0KIAogICAgIHJldHVybiBvazsKQEAgLTI2MDgsMTIgKzI2MDgsMTIgQEAKIHN0YXRpYyBpbnQKIHZhbGlkYXRlX2RlY29yYXRvcnMobm9kZSAqdHJlZSkKIHsKLSAgICBpbnQgaSwgbmNoLCBvazsgCisgICAgaW50IGksIG5jaCwgb2s7CiAgICAgbmNoID0gTkNIKHRyZWUpOwogICAgIG9rID0gdmFsaWRhdGVfbnR5cGUodHJlZSwgZGVjb3JhdG9ycykgJiYgbmNoID49IDE7CiAKICAgICBmb3IgKGkgPSAwOyBvayAmJiBpIDwgbmNoOyArK2kpCi0Jb2sgPSB2YWxpZGF0ZV9kZWNvcmF0b3IoQ0hJTEQodHJlZSwgaSkpOworICAgICAgICBvayA9IHZhbGlkYXRlX2RlY29yYXRvcihDSElMRCh0cmVlLCBpKSk7CiAKICAgICByZXR1cm4gb2s7CiB9CkBAIC0yNjQ0LDE0ICsyNjQ0LDE0IEBACiAgICAgICAgICYmICgobmNoID09IDQpIHx8IChuY2ggPT0gNSkpCiAgICAgICAgICYmIHZhbGlkYXRlX25hbWUoQ0hJTEQodHJlZSwgMCksICJ3aXRoIikKICAgICAgICAgJiYgdmFsaWRhdGVfdGVzdChDSElMRCh0cmVlLCAxKSkKLSAgICAgICAgJiYgKG5jaCA9PSA0IHx8IHZhbGlkYXRlX3dpdGhfdmFyKENISUxEKHRyZWUsIDIpKSkgCisgICAgICAgICYmIChuY2ggPT0gNCB8fCB2YWxpZGF0ZV93aXRoX3ZhcihDSElMRCh0cmVlLCAyKSkpCiAgICAgICAgICYmIHZhbGlkYXRlX2NvbG9uKFJDSElMRCh0cmVlLCAtMikpCiAgICAgICAgICYmIHZhbGlkYXRlX3N1aXRlKFJDSElMRCh0cmVlLCAtMSkpKTsKICAgIHJldHVybiBvazsKIH0KIAogLyogIGZ1bmNkZWY6Ci0gKiAgICAgIAorICoKICAqICAgICAtNSAgIC00ICAgICAgICAgLTMgIC0yICAgIC0xCiAgKiAgJ2RlZicgTkFNRSBwYXJhbWV0ZXJzICc6JyBzdWl0ZQogICovCkBAIC0yNjYwLDEyICsyNjYwLDEyIEBACiB7CiAgICAgaW50IG5jaCA9IE5DSCh0cmVlKTsKICAgICBpbnQgb2sgPSAodmFsaWRhdGVfbnR5cGUodHJlZSwgZnVuY2RlZikKLQkgICAgICAgJiYgKG5jaCA9PSA1KQotCSAgICAgICAmJiB2YWxpZGF0ZV9uYW1lKFJDSElMRCh0cmVlLCAtNSksICJkZWYiKQotCSAgICAgICAmJiB2YWxpZGF0ZV9udHlwZShSQ0hJTEQodHJlZSwgLTQpLCBOQU1FKQotCSAgICAgICAmJiB2YWxpZGF0ZV9jb2xvbihSQ0hJTEQodHJlZSwgLTIpKQotCSAgICAgICAmJiB2YWxpZGF0ZV9wYXJhbWV0ZXJzKFJDSElMRCh0cmVlLCAtMykpCi0JICAgICAgICYmIHZhbGlkYXRlX3N1aXRlKFJDSElMRCh0cmVlLCAtMSkpKTsKKyAgICAgICAgICAgICAgICYmIChuY2ggPT0gNSkKKyAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX25hbWUoUkNISUxEKHRyZWUsIC01KSwgImRlZiIpCisgICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9udHlwZShSQ0hJTEQodHJlZSwgLTQpLCBOQU1FKQorICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfY29sb24oUkNISUxEKHRyZWUsIC0yKSkKKyAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX3BhcmFtZXRlcnMoUkNISUxEKHRyZWUsIC0zKSkKKyAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX3N1aXRlKFJDSElMRCh0cmVlLCAtMSkpKTsKICAgICByZXR1cm4gb2s7CiB9CiAKQEAgLTI2NzgsMTEgKzI2NzgsMTEgQEAKIHsKICAgaW50IG5jaCA9IE5DSCh0cmVlKTsKICAgaW50IG9rID0gKHZhbGlkYXRlX250eXBlKHRyZWUsIGRlY29yYXRlZCkKLQkgICAgJiYgKG5jaCA9PSAyKQotCSAgICAmJiB2YWxpZGF0ZV9kZWNvcmF0b3JzKFJDSElMRCh0cmVlLCAtMikpCi0JICAgICYmICh2YWxpZGF0ZV9mdW5jZGVmKFJDSElMRCh0cmVlLCAtMSkpCi0JCXx8IHZhbGlkYXRlX2NsYXNzKFJDSElMRCh0cmVlLCAtMSkpKQotCSAgICApOworICAgICAgICAgICAgJiYgKG5jaCA9PSAyKQorICAgICAgICAgICAgJiYgdmFsaWRhdGVfZGVjb3JhdG9ycyhSQ0hJTEQodHJlZSwgLTIpKQorICAgICAgICAgICAgJiYgKHZhbGlkYXRlX2Z1bmNkZWYoUkNISUxEKHRyZWUsIC0xKSkKKyAgICAgICAgICAgICAgICB8fCB2YWxpZGF0ZV9jbGFzcyhSQ0hJTEQodHJlZSwgLTEpKSkKKyAgICAgICAgICAgICk7CiAgIHJldHVybiBvazsKIH0KIApAQCAtMzAzMiw5ICszMDMyLDkgQEAKICAgICAgICAgICBjYXNlIGNsYXNzZGVmOgogICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfY2xhc3ModHJlZSk7CiAgICAgICAgICAgICBicmVhazsKLQkgIGNhc2UgZGVjb3JhdGVkOgotCSAgICByZXMgPSB2YWxpZGF0ZV9kZWNvcmF0ZWQodHJlZSk7Ci0JICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgZGVjb3JhdGVkOgorICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfZGVjb3JhdGVkKHRyZWUpOworICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogICJUcml2aWFsIiBwYXJzZSB0cmVlIG5vZGVzLgogICAgICAgICAgICAgICogIChXaHkgZGlkIEkgY2FsbCB0aGVzZSB0cml2aWFsPykKQEAgLTMxMDYsMTIgKzMxMDYsMTIgQEAKICAgICAgICAgICBjYXNlIGltcG9ydF9zdG10OgogICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfaW1wb3J0X3N0bXQodHJlZSk7CiAgICAgICAgICAgICBicmVhazsKLQkgIGNhc2UgaW1wb3J0X25hbWU6Ci0JICAgIHJlcyA9IHZhbGlkYXRlX2ltcG9ydF9uYW1lKHRyZWUpOwotCSAgICBicmVhazsKLQkgIGNhc2UgaW1wb3J0X2Zyb206Ci0JICAgIHJlcyA9IHZhbGlkYXRlX2ltcG9ydF9mcm9tKHRyZWUpOwotCSAgICBicmVhazsKKyAgICAgICAgICBjYXNlIGltcG9ydF9uYW1lOgorICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfaW1wb3J0X25hbWUodHJlZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIGltcG9ydF9mcm9tOgorICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfaW1wb3J0X2Zyb20odHJlZSk7CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgICBjYXNlIGdsb2JhbF9zdG10OgogICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfZ2xvYmFsX3N0bXQodHJlZSk7CiAgICAgICAgICAgICBicmVhazsKQEAgLTMzNDcsNyArMzM0Nyw3IEBACiAgICAgUHlfVFlQRSgmUHlTVF9UeXBlKSA9ICZQeVR5cGVfVHlwZTsKICAgICBtb2R1bGUgPSBQeV9Jbml0TW9kdWxlKCJwYXJzZXIiLCBwYXJzZXJfZnVuY3Rpb25zKTsKICAgICBpZiAobW9kdWxlID09IE5VTEwpCi0gICAgCXJldHVybjsKKyAgICAgICAgcmV0dXJuOwogCiAgICAgaWYgKHBhcnNlcl9lcnJvciA9PSAwKQogICAgICAgICBwYXJzZXJfZXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oInBhcnNlci5QYXJzZXJFcnJvciIsIE5VTEwsIE5VTEwpOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9wdXJlbW9kdWxlLmMgYi9Nb2R1bGVzL3B1cmVtb2R1bGUuYwppbmRleCBlZGU2M2FiLi5iODlmMTcyIDEwMDY0NAotLS0gYS9Nb2R1bGVzL3B1cmVtb2R1bGUuYworKysgYi9Nb2R1bGVzL3B1cmVtb2R1bGUuYwpAQCAtNTgsMTA3ICs1OCwxMDcgQEAKIHR5cGVkZWYgaW50ICgqU3RyaW5nSW50QXJnRnVuYykoY29uc3QgY2hhciosIGludCk7CiAKIAotDAorCiBzdGF0aWMgUHlPYmplY3QqCiBjYWxsX3ZvaWRhcmdfZnVuY3Rpb24oVm9pZEFyZ0Z1bmMgZnVuYywgUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBzdGF0dXM7CisgICAgaW50IHN0YXR1czsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0Jc3RhdHVzID0gZnVuYygpOwotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJpIiwgc3RhdHVzKTsKKyAgICBzdGF0dXMgPSBmdW5jKCk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLCBzdGF0dXMpOwogfQogCiBzdGF0aWMgUHlPYmplY3QqCiBjYWxsX3N0cmluZ2FyZ19mdW5jdGlvbihTdHJpbmdBcmdGdW5jIGZ1bmMsIFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgc3RhdHVzOwotCWNoYXIqIHN0cmluZ2FyZzsKKyAgICBpbnQgc3RhdHVzOworICAgIGNoYXIqIHN0cmluZ2FyZzsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyIsICZzdHJpbmdhcmcpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMiLCAmc3RyaW5nYXJnKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlzdGF0dXMgPSBmdW5jKHN0cmluZ2FyZyk7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLCBzdGF0dXMpOworICAgIHN0YXR1cyA9IGZ1bmMoc3RyaW5nYXJnKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIHN0YXR1cyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCoKIGNhbGxfc3RyaW5nb3JpbnRfZnVuY3Rpb24oU3RyaW5nQXJnRnVuYyBmdW5jLCBQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IHN0YXR1czsKLQlpbnQgaW50YXJnOwotCWNoYXIqIHN0cmluZ2FyZzsKKyAgICBpbnQgc3RhdHVzOworICAgIGludCBpbnRhcmc7CisgICAgY2hhciogc3RyaW5nYXJnOwogCi0gICAgICAgIC8qIGFjY29yZGluZyB0byB0aGUgcXVhbnRpZnkuaCBmaWxlLCB0aGUgYXJndW1lbnQgdG8KLSAgICAgICAgICogcXVhbnRpZnlfKl9yZWNvcmRpbmdfc3lzdGVtX2NhbGwgY2FuIGJlIGFuIGludGVnZXIgb3IgYSBzdHJpbmcsCi0JICogYnV0IHRoZSBmdW5jdGlvbnMgYXJlIHByb3RvdHlwZWQgYXMgdGFraW5nIGEgc2luZ2xlIGNoYXIqCi0JICogYXJndW1lbnQuIFlpa2VzIQorICAgIC8qIGFjY29yZGluZyB0byB0aGUgcXVhbnRpZnkuaCBmaWxlLCB0aGUgYXJndW1lbnQgdG8KKyAgICAgKiBxdWFudGlmeV8qX3JlY29yZGluZ19zeXN0ZW1fY2FsbCBjYW4gYmUgYW4gaW50ZWdlciBvciBhIHN0cmluZywKKyAgICAgKiBidXQgdGhlIGZ1bmN0aW9ucyBhcmUgcHJvdG90eXBlZCBhcyB0YWtpbmcgYSBzaW5nbGUgY2hhcioKKyAgICAgKiBhcmd1bWVudC4gWWlrZXMhCisgICAgICovCisgICAgaWYgKFB5QXJnX1BhcnNlVHVwbGUoYXJncywgImkiLCAmaW50YXJnKSkKKyAgICAgICAgLyogZnVuYyBpcyBwcm90b3R5cGVkIGFzIGludCgqKShjaGFyKikKKyAgICAgICAgICogYmV0dGVyIHNodXQgdXAgdGhlIGNvbXBpbGVyCiAgICAgICAgICAqLwotCWlmIChQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpIiwgJmludGFyZykpCi0JCS8qIGZ1bmMgaXMgcHJvdG90eXBlZCBhcyBpbnQoKikoY2hhciopCi0JCSAqIGJldHRlciBzaHV0IHVwIHRoZSBjb21waWxlcgotCQkgKi8KLQkJc3RhdHVzID0gZnVuYygoY2hhciopaW50YXJnKTsKKyAgICAgICAgc3RhdHVzID0gZnVuYygoY2hhciopaW50YXJnKTsKIAotCWVsc2UgewotCQlQeUVycl9DbGVhcigpOwotCQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMiLCAmc3RyaW5nYXJnKSkKLQkJCXJldHVybiBOVUxMOwotCQllbHNlCi0JCQlzdGF0dXMgPSBmdW5jKHN0cmluZ2FyZyk7Ci0JfQotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJpIiwgc3RhdHVzKTsKKyAgICBlbHNlIHsKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIiwgJnN0cmluZ2FyZykpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc3RhdHVzID0gZnVuYyhzdHJpbmdhcmcpOworICAgIH0KKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIHN0YXR1cyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCoKIGNhbGxfcHJpbnRmaXNoX2Z1bmN0aW9uKFByaW50ZmlzaEZ1bmMgZnVuYywgUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCS8qIHdlIHN1cHBvcnQgdGhlIHByaW50ZigpIHN0eWxlIHZhcmFyZyBmdW5jdGlvbnMgYnkgcmVxdWlyaW5nIHRoZQotICAgICAgICAgKiBmb3JtYXR0aW5nIGJlIGRvbmUgaW4gUHl0aG9uLiAgQXQgdGhlIEMgbGV2ZWwgd2UgcGFzcyBqdXN0IGEgc3RyaW5nCi0gICAgICAgICAqIHRvIHRoZSBwcmludGYoKSBzdHlsZSBmdW5jdGlvbi4KLSAgICAgICAgICovCi0JaW50IHN0YXR1czsKLQljaGFyKiBhcmdzdHJpbmc7CisgICAgLyogd2Ugc3VwcG9ydCB0aGUgcHJpbnRmKCkgc3R5bGUgdmFyYXJnIGZ1bmN0aW9ucyBieSByZXF1aXJpbmcgdGhlCisgICAgICogZm9ybWF0dGluZyBiZSBkb25lIGluIFB5dGhvbi4gIEF0IHRoZSBDIGxldmVsIHdlIHBhc3MganVzdCBhIHN0cmluZworICAgICAqIHRvIHRoZSBwcmludGYoKSBzdHlsZSBmdW5jdGlvbi4KKyAgICAgKi8KKyAgICBpbnQgc3RhdHVzOworICAgIGNoYXIqIGFyZ3N0cmluZzsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyIsICZhcmdzdHJpbmcpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMiLCAmYXJnc3RyaW5nKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlzdGF0dXMgPSBmdW5jKCIlcyIsIGFyZ3N0cmluZyk7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLCBzdGF0dXMpOworICAgIHN0YXR1cyA9IGZ1bmMoIiVzIiwgYXJnc3RyaW5nKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIHN0YXR1cyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCoKIGNhbGxfaW50YXNhZGRyX2Z1bmN0aW9uKFN0cmluZ0FyZ0Z1bmMgZnVuYywgUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgbWVtcmVwOwotCWludCBpZDsKKyAgICBsb25nIG1lbXJlcDsKKyAgICBpbnQgaWQ7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImwiLCAmbWVtcmVwKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsIiwgJm1lbXJlcCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWQgPSBmdW5jKChjaGFyKiltZW1yZXApOwotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJpIiwgaWQpOworICAgIGlkID0gZnVuYygoY2hhciopbWVtcmVwKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIGlkKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0KgogY2FsbF9zdHJpbmdhbmRpbnRfZnVuY3Rpb24oU3RyaW5nSW50QXJnRnVuYyBmdW5jLCBQeU9iamVjdCAqc2VsZiwKLQkJCSAgIFB5T2JqZWN0ICphcmdzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBzcmNyZXA7Ci0JaW50IHNpemU7Ci0JaW50IHN0YXR1czsKKyAgICBsb25nIHNyY3JlcDsKKyAgICBpbnQgc2l6ZTsKKyAgICBpbnQgc3RhdHVzOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsaSIsICZzcmNyZXAsICZzaXplKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsaSIsICZzcmNyZXAsICZzaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlzdGF0dXMgPSBmdW5jKChjaGFyKilzcmNyZXAsIHNpemUpOwotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJpIiwgc3RhdHVzKTsKKyAgICBzdGF0dXMgPSBmdW5jKChjaGFyKilzcmNyZXAsIHNpemUpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJpIiwgc3RhdHVzKTsKIH0KIAogCi0MCisKIC8qIGZ1bmN0aW9ucyBjb21tb24gdG8gYWxsIHByb2R1Y3RzCiAgKgogICogTi5CLiBUaGVzZSBwcmludGYoKSBzdHlsZSBmdW5jdGlvbnMgYXJlIGEgYml0IG9mIGEga2x1ZGdlLiAgU2luY2UgdGhlCkBAIC0xNzQsMjYgKzE3NCwyNiBAQAogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9wdXJlX2xvZ2ZpbGVfcHJpbnRmKFB5T2JqZWN0KiBzZWxmLCBQeU9iamVjdCogYXJncykKIHsKLQlyZXR1cm4gY2FsbF9wcmludGZpc2hfZnVuY3Rpb24ocHVyZV9sb2dmaWxlX3ByaW50Ziwgc2VsZiwgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfcHJpbnRmaXNoX2Z1bmN0aW9uKHB1cmVfbG9nZmlsZV9wcmludGYsIHNlbGYsIGFyZ3MpOwogfQogCiBzdGF0aWMgUHlPYmplY3QqCiBwdXJlX3B1cmVfcHJpbnRmKFB5T2JqZWN0KiBzZWxmLCBQeU9iamVjdCogYXJncykKIHsKLQlyZXR1cm4gY2FsbF9wcmludGZpc2hfZnVuY3Rpb24ocHVyZV9wcmludGYsIHNlbGYsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX3ByaW50ZmlzaF9mdW5jdGlvbihwdXJlX3ByaW50Ziwgc2VsZiwgYXJncyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCoKIHB1cmVfcHVyZV9wcmludGZfd2l0aF9iYW5uZXIoUHlPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKQogewotCXJldHVybiBjYWxsX3ByaW50ZmlzaF9mdW5jdGlvbihwdXJlX3ByaW50Zl93aXRoX2Jhbm5lciwgc2VsZiwgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfcHJpbnRmaXNoX2Z1bmN0aW9uKHB1cmVfcHJpbnRmX3dpdGhfYmFubmVyLCBzZWxmLCBhcmdzKTsKIH0KIAogCiAjZW5kaWYgLyogQ09NTU9OX1BVUkVfRlVOQ1RJT05TICovCiAKIAotDAorCiAvKiBQdXJpZnkgZnVuY3Rpb25zCiAgKgogICogTi5CLiBUaGVyZSBhcmUgc29tZSBpbnRlcmZhY2VzIGRlc2NyaWJlZCBpbiB0aGUgcHVyaWZ5LmggZmlsZSB0aGF0IGFyZQpAQCAtMjM1LDk3ICsyMzUsOTcgQEAKIHN0YXRpYyBQeU9iamVjdCoKIHB1cmVfcHVyaWZ5X2FsbF9pbnVzZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfdm9pZGFyZ19mdW5jdGlvbihwdXJpZnlfYWxsX2ludXNlLCBzZWxmLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF92b2lkYXJnX2Z1bmN0aW9uKHB1cmlmeV9hbGxfaW51c2UsIHNlbGYsIGFyZ3MpOwogfQogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9wdXJpZnlfYWxsX2xlYWtzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gY2FsbF92b2lkYXJnX2Z1bmN0aW9uKHB1cmlmeV9hbGxfbGVha3MsIHNlbGYsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX3ZvaWRhcmdfZnVuY3Rpb24ocHVyaWZ5X2FsbF9sZWFrcywgc2VsZiwgYXJncyk7CiB9CiBzdGF0aWMgUHlPYmplY3QqCiBwdXJlX3B1cmlmeV9uZXdfaW51c2UoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX3ZvaWRhcmdfZnVuY3Rpb24ocHVyaWZ5X25ld19pbnVzZSwgc2VsZiwgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfdm9pZGFyZ19mdW5jdGlvbihwdXJpZnlfbmV3X2ludXNlLCBzZWxmLCBhcmdzKTsKIH0KIHN0YXRpYyBQeU9iamVjdCoKIHB1cmVfcHVyaWZ5X25ld19sZWFrcyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfdm9pZGFyZ19mdW5jdGlvbihwdXJpZnlfbmV3X2xlYWtzLCBzZWxmLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF92b2lkYXJnX2Z1bmN0aW9uKHB1cmlmeV9uZXdfbGVha3MsIHNlbGYsIGFyZ3MpOwogfQogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9wdXJpZnlfY2xlYXJfaW51c2UoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX3ZvaWRhcmdfZnVuY3Rpb24ocHVyaWZ5X2NsZWFyX2ludXNlLCBzZWxmLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF92b2lkYXJnX2Z1bmN0aW9uKHB1cmlmeV9jbGVhcl9pbnVzZSwgc2VsZiwgYXJncyk7CiB9CiBzdGF0aWMgUHlPYmplY3QqCiBwdXJlX3B1cmlmeV9jbGVhcl9sZWFrcyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfdm9pZGFyZ19mdW5jdGlvbihwdXJpZnlfY2xlYXJfbGVha3MsIHNlbGYsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX3ZvaWRhcmdfZnVuY3Rpb24ocHVyaWZ5X2NsZWFyX2xlYWtzLCBzZWxmLCBhcmdzKTsKIH0KIHN0YXRpYyBQeU9iamVjdCoKIHB1cmVfcHVyaWZ5X2FsbF9mZHNfaW51c2UoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX3ZvaWRhcmdfZnVuY3Rpb24ocHVyaWZ5X2FsbF9mZHNfaW51c2UsIHNlbGYsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX3ZvaWRhcmdfZnVuY3Rpb24ocHVyaWZ5X2FsbF9mZHNfaW51c2UsIHNlbGYsIGFyZ3MpOwogfQogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9wdXJpZnlfbmV3X2Zkc19pbnVzZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfdm9pZGFyZ19mdW5jdGlvbihwdXJpZnlfbmV3X2Zkc19pbnVzZSwgc2VsZiwgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfdm9pZGFyZ19mdW5jdGlvbihwdXJpZnlfbmV3X2Zkc19pbnVzZSwgc2VsZiwgYXJncyk7CiB9CiBzdGF0aWMgUHlPYmplY3QqCiBwdXJlX3B1cmlmeV9wcmludGZfd2l0aF9jYWxsX2NoYWluKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gY2FsbF9wcmludGZpc2hfZnVuY3Rpb24ocHVyaWZ5X3ByaW50Zl93aXRoX2NhbGxfY2hhaW4sCi0JCQkJICAgICAgIHNlbGYsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX3ByaW50ZmlzaF9mdW5jdGlvbihwdXJpZnlfcHJpbnRmX3dpdGhfY2FsbF9jaGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZiwgYXJncyk7CiB9CiBzdGF0aWMgUHlPYmplY3QqCiBwdXJlX3B1cmlmeV9zZXRfcG9vbF9pZChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBtZW1yZXA7Ci0JaW50IGlkOworICAgIGxvbmcgbWVtcmVwOworICAgIGludCBpZDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibGk6cHVyaWZ5X3NldF9wb29sX2lkIiwgJm1lbXJlcCwgJmlkKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsaTpwdXJpZnlfc2V0X3Bvb2xfaWQiLCAmbWVtcmVwLCAmaWQpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXB1cmlmeV9zZXRfcG9vbF9pZCgoY2hhciopbWVtcmVwLCBpZCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHB1cmlmeV9zZXRfcG9vbF9pZCgoY2hhciopbWVtcmVwLCBpZCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9wdXJpZnlfZ2V0X3Bvb2xfaWQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX2ludGFzYWRkcl9mdW5jdGlvbihwdXJpZnlfZ2V0X3Bvb2xfaWQsIHNlbGYsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX2ludGFzYWRkcl9mdW5jdGlvbihwdXJpZnlfZ2V0X3Bvb2xfaWQsIHNlbGYsIGFyZ3MpOwogfQogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9wdXJpZnlfc2V0X3VzZXJfZGF0YShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBtZW1yZXA7Ci0JbG9uZyBkYXRhcmVwOworICAgIGxvbmcgbWVtcmVwOworICAgIGxvbmcgZGF0YXJlcDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibGw6cHVyaWZ5X3NldF91c2VyX2RhdGEiLCAmbWVtcmVwLCAmZGF0YXJlcCkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibGw6cHVyaWZ5X3NldF91c2VyX2RhdGEiLCAmbWVtcmVwLCAmZGF0YXJlcCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JcHVyaWZ5X3NldF91c2VyX2RhdGEoKGNoYXIqKW1lbXJlcCwgKHZvaWQqKWRhdGFyZXApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBwdXJpZnlfc2V0X3VzZXJfZGF0YSgoY2hhciopbWVtcmVwLCAodm9pZCopZGF0YXJlcCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9wdXJpZnlfZ2V0X3VzZXJfZGF0YShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0gICAgICAgIC8qIGNhbid0IHVzZSBjYWxsX2ludGFzYWRkcl9mdW5jdGlvbigpIHNpbmNlIHB1cmlmeV9nZXRfdXNlcl9kYXRhKCkKLSAgICAgICAgICogcmV0dXJucyBhIHZvaWQqCi0gICAgICAgICAqLwotCWxvbmcgbWVtcmVwOwotCXZvaWQqIGRhdGE7CisgICAgLyogY2FuJ3QgdXNlIGNhbGxfaW50YXNhZGRyX2Z1bmN0aW9uKCkgc2luY2UgcHVyaWZ5X2dldF91c2VyX2RhdGEoKQorICAgICAqIHJldHVybnMgYSB2b2lkKgorICAgICAqLworICAgIGxvbmcgbWVtcmVwOworICAgIHZvaWQqIGRhdGE7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImw6cHVyaWZ5X2dldF91c2VyX2RhdGEiLCAmbWVtcmVwKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsOnB1cmlmeV9nZXRfdXNlcl9kYXRhIiwgJm1lbXJlcCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JZGF0YSA9IHB1cmlmeV9nZXRfdXNlcl9kYXRhKChjaGFyKiltZW1yZXApOwotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJsIiwgKGxvbmcpZGF0YSk7CisgICAgZGF0YSA9IHB1cmlmeV9nZXRfdXNlcl9kYXRhKChjaGFyKiltZW1yZXApOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJsIiwgKGxvbmcpZGF0YSk7CiB9CiAKLQwKKwogLyogdGhpcyBnbG9iYWwgdmFyaWFibGUgaXMgc2hhcmVkIGJ5IGJvdGggbWFwcGluZyBmdW5jdGlvbnM6CiAgKiBwdXJlX3B1cmlmeV9tYXBfcG9vbCgpIGFuZCBwdXJlX3B1cmlmeV9tYXBfcG9vbF9pZCgpLiAgU2luY2UgdGhleSBjYWNoZQogICogdGhpcyB2YXJpYWJsZSBpdCBzaG91bGQgYmUgc2FmZSBpbiB0aGUgZmFjZSBvZiByZWN1cnNpb24gb3IgY3Jvc3MKQEAgLTM0MSwzMDMgKzM0MSwzMDMgQEAKIHN0YXRpYyB2b2lkCiBtYXBfcG9vbF9jYWxsYmFjayhjaGFyKiBtZW0sIGludCB1c2VyX3NpemUsIHZvaWQgKnVzZXJfYXV4X2RhdGEpCiB7Ci0JbG9uZyBtZW1yZXAgPSAobG9uZyltZW07Ci0JbG9uZyB1c2VyX2F1eF9kYXRhX3JlcCA9IChsb25nKXVzZXJfYXV4X2RhdGE7Ci0JUHlPYmplY3QqIHJlc3VsdDsKLQlQeU9iamVjdCogbWVtb2JqID0gUHlfQnVpbGRWYWx1ZSgibGlsIiwgbWVtcmVwLCB1c2VyX3NpemUsCi0JCQkJCSB1c2VyX2F1eF9kYXRhX3JlcCk7CisgICAgbG9uZyBtZW1yZXAgPSAobG9uZyltZW07CisgICAgbG9uZyB1c2VyX2F1eF9kYXRhX3JlcCA9IChsb25nKXVzZXJfYXV4X2RhdGE7CisgICAgUHlPYmplY3QqIHJlc3VsdDsKKyAgICBQeU9iamVjdCogbWVtb2JqID0gUHlfQnVpbGRWYWx1ZSgibGlsIiwgbWVtcmVwLCB1c2VyX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlcl9hdXhfZGF0YV9yZXApOwogCi0JaWYgKG1lbW9iaiA9PSBOVUxMKQotCQlyZXR1cm47CisgICAgaWYgKG1lbW9iaiA9PSBOVUxMKQorICAgICAgICByZXR1cm47CiAKLQlyZXN1bHQgPSBQeUV2YWxfQ2FsbE9iamVjdChNYXBDYWxsYWJsZSwgbWVtb2JqKTsKLQlQeV9ERUNSRUYocmVzdWx0KTsKLQlQeV9ERUNSRUYobWVtb2JqKTsKKyAgICByZXN1bHQgPSBQeUV2YWxfQ2FsbE9iamVjdChNYXBDYWxsYWJsZSwgbWVtb2JqKTsKKyAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICBQeV9ERUNSRUYobWVtb2JqKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9wdXJpZnlfbWFwX3Bvb2woUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotICAgICAgICAvKiBjYWNoZSBnbG9iYWwgdmFyaWFibGUgaW4gY2FzZSBvZiByZWN1cnNpb24gKi8KLQlQeU9iamVjdCogc2F2ZWRfY2FsbGFibGUgPSBNYXBDYWxsYWJsZTsKLQlQeU9iamVjdCogYXJnX2NhbGxhYmxlOwotCWludCBpZDsKKyAgICAvKiBjYWNoZSBnbG9iYWwgdmFyaWFibGUgaW4gY2FzZSBvZiByZWN1cnNpb24gKi8KKyAgICBQeU9iamVjdCogc2F2ZWRfY2FsbGFibGUgPSBNYXBDYWxsYWJsZTsKKyAgICBQeU9iamVjdCogYXJnX2NhbGxhYmxlOworICAgIGludCBpZDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaU86cHVyaWZ5X21hcF9wb29sIiwgJmlkLCAmYXJnX2NhbGxhYmxlKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpTzpwdXJpZnlfbWFwX3Bvb2wiLCAmaWQsICZhcmdfY2FsbGFibGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmICghUHlDYWxsYWJsZV9DaGVjayhhcmdfY2FsbGFibGUpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJIlNlY29uZCBhcmd1bWVudCBtdXN0IGJlIGNhbGxhYmxlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlNYXBDYWxsYWJsZSA9IGFyZ19jYWxsYWJsZTsKLQlwdXJpZnlfbWFwX3Bvb2woaWQsIG1hcF9wb29sX2NhbGxiYWNrKTsKLQlNYXBDYWxsYWJsZSA9IHNhdmVkX2NhbGxhYmxlOworICAgIGlmICghUHlDYWxsYWJsZV9DaGVjayhhcmdfY2FsbGFibGUpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiU2Vjb25kIGFyZ3VtZW50IG11c3QgYmUgY2FsbGFibGUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIE1hcENhbGxhYmxlID0gYXJnX2NhbGxhYmxlOworICAgIHB1cmlmeV9tYXBfcG9vbChpZCwgbWFwX3Bvb2xfY2FsbGJhY2spOworICAgIE1hcENhbGxhYmxlID0gc2F2ZWRfY2FsbGFibGU7CiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgdm9pZAogUHVyaWZ5TWFwUG9vbElkQ2FsbGJhY2soaW50IGlkKQogewotCVB5T2JqZWN0KiByZXN1bHQ7Ci0JUHlPYmplY3QqIGludG9iaiA9IFB5X0J1aWxkVmFsdWUoImkiLCBpZCk7CisgICAgUHlPYmplY3QqIHJlc3VsdDsKKyAgICBQeU9iamVjdCogaW50b2JqID0gUHlfQnVpbGRWYWx1ZSgiaSIsIGlkKTsKIAotCWlmIChpbnRvYmogPT0gTlVMTCkKLQkJcmV0dXJuOworICAgIGlmIChpbnRvYmogPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOwogCi0JcmVzdWx0ID0gUHlFdmFsX0NhbGxPYmplY3QoTWFwQ2FsbGFibGUsIGludG9iaik7Ci0JUHlfREVDUkVGKHJlc3VsdCk7Ci0JUHlfREVDUkVGKGludG9iaik7CisgICAgcmVzdWx0ID0gUHlFdmFsX0NhbGxPYmplY3QoTWFwQ2FsbGFibGUsIGludG9iaik7CisgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgUHlfREVDUkVGKGludG9iaik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCoKIHB1cmVfcHVyaWZ5X21hcF9wb29sX2lkKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLSAgICAgICAgLyogY2FjaGUgZ2xvYmFsIHZhcmlhYmxlIGluIGNhc2Ugb2YgcmVjdXJzaW9uICovCi0JUHlPYmplY3QqIHNhdmVkX2NhbGxhYmxlID0gTWFwQ2FsbGFibGU7Ci0JUHlPYmplY3QqIGFyZ19jYWxsYWJsZTsKKyAgICAvKiBjYWNoZSBnbG9iYWwgdmFyaWFibGUgaW4gY2FzZSBvZiByZWN1cnNpb24gKi8KKyAgICBQeU9iamVjdCogc2F2ZWRfY2FsbGFibGUgPSBNYXBDYWxsYWJsZTsKKyAgICBQeU9iamVjdCogYXJnX2NhbGxhYmxlOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPOnB1cmlmeV9tYXBfcG9vbF9pZCIsICZhcmdfY2FsbGFibGUpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk86cHVyaWZ5X21hcF9wb29sX2lkIiwgJmFyZ19jYWxsYWJsZSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKCFQeUNhbGxhYmxlX0NoZWNrKGFyZ19jYWxsYWJsZSkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkFyZ3VtZW50IG11c3QgYmUgY2FsbGFibGUuIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoIVB5Q2FsbGFibGVfQ2hlY2soYXJnX2NhbGxhYmxlKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiQXJndW1lbnQgbXVzdCBiZSBjYWxsYWJsZS4iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JTWFwQ2FsbGFibGUgPSBhcmdfY2FsbGFibGU7Ci0JcHVyaWZ5X21hcF9wb29sX2lkKFB1cmlmeU1hcFBvb2xJZENhbGxiYWNrKTsKLQlNYXBDYWxsYWJsZSA9IHNhdmVkX2NhbGxhYmxlOworICAgIE1hcENhbGxhYmxlID0gYXJnX2NhbGxhYmxlOworICAgIHB1cmlmeV9tYXBfcG9vbF9pZChQdXJpZnlNYXBQb29sSWRDYWxsYmFjayk7CisgICAgTWFwQ2FsbGFibGUgPSBzYXZlZF9jYWxsYWJsZTsKIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIAotDAorCiBzdGF0aWMgUHlPYmplY3QqCiBwdXJlX3B1cmlmeV9uZXdfbWVzc2FnZXMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX3ZvaWRhcmdfZnVuY3Rpb24ocHVyaWZ5X25ld19tZXNzYWdlcywgc2VsZiwgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfdm9pZGFyZ19mdW5jdGlvbihwdXJpZnlfbmV3X21lc3NhZ2VzLCBzZWxmLCBhcmdzKTsKIH0KIHN0YXRpYyBQeU9iamVjdCoKIHB1cmVfcHVyaWZ5X2FsbF9tZXNzYWdlcyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfdm9pZGFyZ19mdW5jdGlvbihwdXJpZnlfYWxsX21lc3NhZ2VzLCBzZWxmLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF92b2lkYXJnX2Z1bmN0aW9uKHB1cmlmeV9hbGxfbWVzc2FnZXMsIHNlbGYsIGFyZ3MpOwogfQogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9wdXJpZnlfY2xlYXJfbWVzc2FnZXMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX3ZvaWRhcmdfZnVuY3Rpb24ocHVyaWZ5X2NsZWFyX21lc3NhZ2VzLCBzZWxmLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF92b2lkYXJnX2Z1bmN0aW9uKHB1cmlmeV9jbGVhcl9tZXNzYWdlcywgc2VsZiwgYXJncyk7CiB9CiBzdGF0aWMgUHlPYmplY3QqCiBwdXJlX3B1cmlmeV9jbGVhcl9uZXdfbWVzc2FnZXMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX3ZvaWRhcmdfZnVuY3Rpb24ocHVyaWZ5X2NsZWFyX25ld19tZXNzYWdlcywgc2VsZiwgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfdm9pZGFyZ19mdW5jdGlvbihwdXJpZnlfY2xlYXJfbmV3X21lc3NhZ2VzLCBzZWxmLCBhcmdzKTsKIH0KIHN0YXRpYyBQeU9iamVjdCoKIHB1cmVfcHVyaWZ5X3N0YXJ0X2JhdGNoKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gY2FsbF92b2lkYXJnX2Z1bmN0aW9uKHB1cmlmeV9zdGFydF9iYXRjaCwgc2VsZiwgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfdm9pZGFyZ19mdW5jdGlvbihwdXJpZnlfc3RhcnRfYmF0Y2gsIHNlbGYsIGFyZ3MpOwogfQogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9wdXJpZnlfc3RhcnRfYmF0Y2hfc2hvd19maXJzdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfdm9pZGFyZ19mdW5jdGlvbihwdXJpZnlfc3RhcnRfYmF0Y2hfc2hvd19maXJzdCwKLQkJCQkgICAgIHNlbGYsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX3ZvaWRhcmdfZnVuY3Rpb24ocHVyaWZ5X3N0YXJ0X2JhdGNoX3Nob3dfZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLCBhcmdzKTsKIH0KIHN0YXRpYyBQeU9iamVjdCoKIHB1cmVfcHVyaWZ5X3N0b3BfYmF0Y2goUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX3ZvaWRhcmdfZnVuY3Rpb24ocHVyaWZ5X3N0b3BfYmF0Y2gsIHNlbGYsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX3ZvaWRhcmdfZnVuY3Rpb24ocHVyaWZ5X3N0b3BfYmF0Y2gsIHNlbGYsIGFyZ3MpOwogfQogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9wdXJpZnlfbmFtZV90aHJlYWQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotICAgICAgICAvKiBjYW4ndCBzdHJpY3RseSB1c2UgY2FsbF9zdHJpbmdhcmdfZnVuY3Rpb24gc2luY2UKLSAgICAgICAgICogcHVyaWZ5X25hbWVfdGhyZWFkIHRha2VzIGEgY29uc3QgY2hhciosIG5vdCBhIGNoYXIqCi0gICAgICAgICAqLwotCWludCBzdGF0dXM7Ci0JY2hhciogc3RyaW5nYXJnOworICAgIC8qIGNhbid0IHN0cmljdGx5IHVzZSBjYWxsX3N0cmluZ2FyZ19mdW5jdGlvbiBzaW5jZQorICAgICAqIHB1cmlmeV9uYW1lX3RocmVhZCB0YWtlcyBhIGNvbnN0IGNoYXIqLCBub3QgYSBjaGFyKgorICAgICAqLworICAgIGludCBzdGF0dXM7CisgICAgY2hhciogc3RyaW5nYXJnOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOnB1cmlmeV9uYW1lX3RocmVhZCIsICZzdHJpbmdhcmcpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6cHVyaWZ5X25hbWVfdGhyZWFkIiwgJnN0cmluZ2FyZykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0Jc3RhdHVzID0gcHVyaWZ5X25hbWVfdGhyZWFkKHN0cmluZ2FyZyk7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLCBzdGF0dXMpOworICAgIHN0YXR1cyA9IHB1cmlmeV9uYW1lX3RocmVhZChzdHJpbmdhcmcpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJpIiwgc3RhdHVzKTsKIH0KIHN0YXRpYyBQeU9iamVjdCoKIHB1cmVfcHVyaWZ5X3dhdGNoKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gY2FsbF9pbnRhc2FkZHJfZnVuY3Rpb24ocHVyaWZ5X3dhdGNoLCBzZWxmLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF9pbnRhc2FkZHJfZnVuY3Rpb24ocHVyaWZ5X3dhdGNoLCBzZWxmLCBhcmdzKTsKIH0KIHN0YXRpYyBQeU9iamVjdCoKIHB1cmVfcHVyaWZ5X3dhdGNoXzEoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX2ludGFzYWRkcl9mdW5jdGlvbihwdXJpZnlfd2F0Y2hfMSwgc2VsZiwgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfaW50YXNhZGRyX2Z1bmN0aW9uKHB1cmlmeV93YXRjaF8xLCBzZWxmLCBhcmdzKTsKIH0KIHN0YXRpYyBQeU9iamVjdCoKIHB1cmVfcHVyaWZ5X3dhdGNoXzIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX2ludGFzYWRkcl9mdW5jdGlvbihwdXJpZnlfd2F0Y2hfMiwgc2VsZiwgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfaW50YXNhZGRyX2Z1bmN0aW9uKHB1cmlmeV93YXRjaF8yLCBzZWxmLCBhcmdzKTsKIH0KIHN0YXRpYyBQeU9iamVjdCoKIHB1cmVfcHVyaWZ5X3dhdGNoXzQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX2ludGFzYWRkcl9mdW5jdGlvbihwdXJpZnlfd2F0Y2hfNCwgc2VsZiwgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfaW50YXNhZGRyX2Z1bmN0aW9uKHB1cmlmeV93YXRjaF80LCBzZWxmLCBhcmdzKTsKIH0KIHN0YXRpYyBQeU9iamVjdCoKIHB1cmVfcHVyaWZ5X3dhdGNoXzgoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX2ludGFzYWRkcl9mdW5jdGlvbihwdXJpZnlfd2F0Y2hfOCwgc2VsZiwgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfaW50YXNhZGRyX2Z1bmN0aW9uKHB1cmlmeV93YXRjaF84LCBzZWxmLCBhcmdzKTsKIH0KIHN0YXRpYyBQeU9iamVjdCoKIHB1cmVfcHVyaWZ5X3dhdGNoX3dfMShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfaW50YXNhZGRyX2Z1bmN0aW9uKHB1cmlmeV93YXRjaF93XzEsIHNlbGYsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX2ludGFzYWRkcl9mdW5jdGlvbihwdXJpZnlfd2F0Y2hfd18xLCBzZWxmLCBhcmdzKTsKIH0KIHN0YXRpYyBQeU9iamVjdCoKIHB1cmVfcHVyaWZ5X3dhdGNoX3dfMihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfaW50YXNhZGRyX2Z1bmN0aW9uKHB1cmlmeV93YXRjaF93XzIsIHNlbGYsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX2ludGFzYWRkcl9mdW5jdGlvbihwdXJpZnlfd2F0Y2hfd18yLCBzZWxmLCBhcmdzKTsKIH0KIHN0YXRpYyBQeU9iamVjdCoKIHB1cmVfcHVyaWZ5X3dhdGNoX3dfNChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfaW50YXNhZGRyX2Z1bmN0aW9uKHB1cmlmeV93YXRjaF93XzQsIHNlbGYsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX2ludGFzYWRkcl9mdW5jdGlvbihwdXJpZnlfd2F0Y2hfd180LCBzZWxmLCBhcmdzKTsKIH0KIHN0YXRpYyBQeU9iamVjdCoKIHB1cmVfcHVyaWZ5X3dhdGNoX3dfOChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfaW50YXNhZGRyX2Z1bmN0aW9uKHB1cmlmeV93YXRjaF93XzgsIHNlbGYsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX2ludGFzYWRkcl9mdW5jdGlvbihwdXJpZnlfd2F0Y2hfd184LCBzZWxmLCBhcmdzKTsKIH0KIHN0YXRpYyBQeU9iamVjdCoKIHB1cmVfcHVyaWZ5X3dhdGNoX3JfMShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfaW50YXNhZGRyX2Z1bmN0aW9uKHB1cmlmeV93YXRjaF9yXzEsIHNlbGYsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX2ludGFzYWRkcl9mdW5jdGlvbihwdXJpZnlfd2F0Y2hfcl8xLCBzZWxmLCBhcmdzKTsKIH0KIHN0YXRpYyBQeU9iamVjdCoKIHB1cmVfcHVyaWZ5X3dhdGNoX3JfMihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfaW50YXNhZGRyX2Z1bmN0aW9uKHB1cmlmeV93YXRjaF9yXzIsIHNlbGYsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX2ludGFzYWRkcl9mdW5jdGlvbihwdXJpZnlfd2F0Y2hfcl8yLCBzZWxmLCBhcmdzKTsKIH0KIHN0YXRpYyBQeU9iamVjdCoKIHB1cmVfcHVyaWZ5X3dhdGNoX3JfNChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfaW50YXNhZGRyX2Z1bmN0aW9uKHB1cmlmeV93YXRjaF9yXzQsIHNlbGYsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX2ludGFzYWRkcl9mdW5jdGlvbihwdXJpZnlfd2F0Y2hfcl80LCBzZWxmLCBhcmdzKTsKIH0KIHN0YXRpYyBQeU9iamVjdCoKIHB1cmVfcHVyaWZ5X3dhdGNoX3JfOChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfaW50YXNhZGRyX2Z1bmN0aW9uKHB1cmlmeV93YXRjaF9yXzgsIHNlbGYsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX2ludGFzYWRkcl9mdW5jdGlvbihwdXJpZnlfd2F0Y2hfcl84LCBzZWxmLCBhcmdzKTsKIH0KIHN0YXRpYyBQeU9iamVjdCoKIHB1cmVfcHVyaWZ5X3dhdGNoX3J3XzEoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX2ludGFzYWRkcl9mdW5jdGlvbihwdXJpZnlfd2F0Y2hfcndfMSwgc2VsZiwgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfaW50YXNhZGRyX2Z1bmN0aW9uKHB1cmlmeV93YXRjaF9yd18xLCBzZWxmLCBhcmdzKTsKIH0KIHN0YXRpYyBQeU9iamVjdCoKIHB1cmVfcHVyaWZ5X3dhdGNoX3J3XzIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX2ludGFzYWRkcl9mdW5jdGlvbihwdXJpZnlfd2F0Y2hfcndfMiwgc2VsZiwgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfaW50YXNhZGRyX2Z1bmN0aW9uKHB1cmlmeV93YXRjaF9yd18yLCBzZWxmLCBhcmdzKTsKIH0KIHN0YXRpYyBQeU9iamVjdCoKIHB1cmVfcHVyaWZ5X3dhdGNoX3J3XzQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX2ludGFzYWRkcl9mdW5jdGlvbihwdXJpZnlfd2F0Y2hfcndfNCwgc2VsZiwgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfaW50YXNhZGRyX2Z1bmN0aW9uKHB1cmlmeV93YXRjaF9yd180LCBzZWxmLCBhcmdzKTsKIH0KIHN0YXRpYyBQeU9iamVjdCoKIHB1cmVfcHVyaWZ5X3dhdGNoX3J3XzgoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX2ludGFzYWRkcl9mdW5jdGlvbihwdXJpZnlfd2F0Y2hfcndfOCwgc2VsZiwgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfaW50YXNhZGRyX2Z1bmN0aW9uKHB1cmlmeV93YXRjaF9yd184LCBzZWxmLCBhcmdzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9wdXJpZnlfd2F0Y2hfbihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhZGRycmVwOwotCXVuc2lnbmVkIGludCBzaXplOwotCWNoYXIqIHR5cGU7Ci0JaW50IHN0YXR1czsKKyAgICBsb25nIGFkZHJyZXA7CisgICAgdW5zaWduZWQgaW50IHNpemU7CisgICAgY2hhciogdHlwZTsKKyAgICBpbnQgc3RhdHVzOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsaXM6cHVyaWZ5X3dhdGNoX24iLCAmYWRkcnJlcCwgJnNpemUsICZ0eXBlKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsaXM6cHVyaWZ5X3dhdGNoX24iLCAmYWRkcnJlcCwgJnNpemUsICZ0eXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlzdGF0dXMgPSBwdXJpZnlfd2F0Y2hfbigoY2hhciopYWRkcnJlcCwgc2l6ZSwgdHlwZSk7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLCBzdGF0dXMpOworICAgIHN0YXR1cyA9IHB1cmlmeV93YXRjaF9uKChjaGFyKilhZGRycmVwLCBzaXplLCB0eXBlKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIHN0YXR1cyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCoKIHB1cmVfcHVyaWZ5X3dhdGNoX2luZm8oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX3ZvaWRhcmdfZnVuY3Rpb24ocHVyaWZ5X3dhdGNoX2luZm8sIHNlbGYsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX3ZvaWRhcmdfZnVuY3Rpb24ocHVyaWZ5X3dhdGNoX2luZm8sIHNlbGYsIGFyZ3MpOwogfQogCiBzdGF0aWMgUHlPYmplY3QqCiBwdXJlX3B1cmlmeV93YXRjaF9yZW1vdmUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCB3YXRjaG5vOwotCWludCBzdGF0dXM7CisgICAgaW50IHdhdGNobm87CisgICAgaW50IHN0YXR1czsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpwdXJpZnlfd2F0Y2hfcmVtb3ZlIiwgJndhdGNobm8pKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6cHVyaWZ5X3dhdGNoX3JlbW92ZSIsICZ3YXRjaG5vKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlzdGF0dXMgPSBwdXJpZnlfd2F0Y2hfcmVtb3ZlKHdhdGNobm8pOwotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJpIiwgc3RhdHVzKTsKKyAgICBzdGF0dXMgPSBwdXJpZnlfd2F0Y2hfcmVtb3ZlKHdhdGNobm8pOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJpIiwgc3RhdHVzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9wdXJpZnlfd2F0Y2hfcmVtb3ZlX2FsbChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfdm9pZGFyZ19mdW5jdGlvbihwdXJpZnlfd2F0Y2hfcmVtb3ZlX2FsbCwgc2VsZiwgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfdm9pZGFyZ19mdW5jdGlvbihwdXJpZnlfd2F0Y2hfcmVtb3ZlX2FsbCwgc2VsZiwgYXJncyk7CiB9CiBzdGF0aWMgUHlPYmplY3QqCiBwdXJlX3B1cmlmeV9kZXNjcmliZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhZGRycmVwOwotCWNoYXIqIHJ0bjsKKyAgICBsb25nIGFkZHJyZXA7CisgICAgY2hhciogcnRuOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsOnB1cmlmeV9kZXNjcmliZSIsICZhZGRycmVwKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsOnB1cmlmeV9kZXNjcmliZSIsICZhZGRycmVwKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlydG4gPSBwdXJpZnlfZGVzY3JpYmUoKGNoYXIqKWFkZHJyZXApOwotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJsIiwgKGxvbmcpcnRuKTsKKyAgICBydG4gPSBwdXJpZnlfZGVzY3JpYmUoKGNoYXIqKWFkZHJyZXApOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJsIiwgKGxvbmcpcnRuKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9wdXJpZnlfd2hhdF9jb2xvcnMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYWRkcnJlcDsKLQl1bnNpZ25lZCBpbnQgc2l6ZTsKLQlpbnQgc3RhdHVzOwotICAgIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibGk6cHVyaWZ5X3doYXRfY29sb3JzIiwgJmFkZHJyZXAsICZzaXplKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgbG9uZyBhZGRycmVwOworICAgIHVuc2lnbmVkIGludCBzaXplOworICAgIGludCBzdGF0dXM7CiAKLQlzdGF0dXMgPSBwdXJpZnlfd2hhdF9jb2xvcnMoKGNoYXIqKWFkZHJyZXAsIHNpemUpOwotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJpIiwgc3RhdHVzKTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImxpOnB1cmlmeV93aGF0X2NvbG9ycyIsICZhZGRycmVwLCAmc2l6ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgc3RhdHVzID0gcHVyaWZ5X3doYXRfY29sb3JzKChjaGFyKilhZGRycmVwLCBzaXplKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIHN0YXR1cyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCoKIHB1cmVfcHVyaWZ5X2lzX3J1bm5pbmcoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX3ZvaWRhcmdfZnVuY3Rpb24ocHVyaWZ5X2lzX3J1bm5pbmcsIHNlbGYsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX3ZvaWRhcmdfZnVuY3Rpb24ocHVyaWZ5X2lzX3J1bm5pbmcsIHNlbGYsIGFyZ3MpOwogfQogCiBzdGF0aWMgUHlPYmplY3QqCiBwdXJlX3B1cmlmeV9hc3NlcnRfaXNfcmVhZGFibGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX3N0cmluZ2FuZGludF9mdW5jdGlvbihwdXJpZnlfYXNzZXJ0X2lzX3JlYWRhYmxlLAotCQkJCQkgIHNlbGYsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX3N0cmluZ2FuZGludF9mdW5jdGlvbihwdXJpZnlfYXNzZXJ0X2lzX3JlYWRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLCBhcmdzKTsKIH0KIHN0YXRpYyBQeU9iamVjdCoKIHB1cmVfcHVyaWZ5X2Fzc2VydF9pc193cml0YWJsZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfc3RyaW5nYW5kaW50X2Z1bmN0aW9uKHB1cmlmeV9hc3NlcnRfaXNfd3JpdGFibGUsCi0JCQkJCSAgc2VsZiwgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfc3RyaW5nYW5kaW50X2Z1bmN0aW9uKHB1cmlmeV9hc3NlcnRfaXNfd3JpdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYsIGFyZ3MpOwogfQogCiAjaWYgSEFTX1BVUklGWV9FWElUCkBAIC02NDksMjIgKzY0OSwyMiBAQAogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9wdXJpZnlfZXhpdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IHN0YXR1czsKKyAgICBpbnQgc3RhdHVzOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOnB1cmlmeV9leGl0IiwgJnN0YXR1cykpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpwdXJpZnlfZXhpdCIsICZzdGF0dXMpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotICAgICAgICAvKiBwdXJpZnlfZXhpdCBkb2Vzbid0IGFsd2F5cyBhY3QgbGlrZSBleGl0KCkuIFNlZSB0aGUgbWFudWFsICovCi0JcHVyaWZ5X2V4aXQoc3RhdHVzKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgLyogcHVyaWZ5X2V4aXQgZG9lc24ndCBhbHdheXMgYWN0IGxpa2UgZXhpdCgpLiBTZWUgdGhlIG1hbnVhbCAqLworICAgIHB1cmlmeV9leGl0KHN0YXR1cyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogI2VuZGlmIC8qIEhBU19QVVJJRllfRVhJVCAqLwogCiAjZW5kaWYgLyogUFVSSUZZX0ggKi8KIAogCi0MCisKIC8qIFF1YW50aWZ5IGZ1bmN0aW9ucwogICoKICAqIE4uQi4gU29tZSBvZiB0aGVzZSBmdW5jdGlvbnMgYXJlIG9ubHkgZGVzY3JpYmVkIGluIHRoZSBxdWFudGlmeS5oIGZpbGUsCkBAIC02ODAsMTQ0ICs2ODAsMTQ0IEBACiBzdGF0aWMgUHlPYmplY3QqCiBwdXJlX3F1YW50aWZ5X2lzX3J1bm5pbmcoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX3ZvaWRhcmdfZnVuY3Rpb24ocXVhbnRpZnlfaXNfcnVubmluZywgc2VsZiwgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfdm9pZGFyZ19mdW5jdGlvbihxdWFudGlmeV9pc19ydW5uaW5nLCBzZWxmLCBhcmdzKTsKIH0KIHN0YXRpYyBQeU9iamVjdCoKIHB1cmVfcXVhbnRpZnlfaGVscChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfdm9pZGFyZ19mdW5jdGlvbihxdWFudGlmeV9oZWxwLCBzZWxmLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF92b2lkYXJnX2Z1bmN0aW9uKHF1YW50aWZ5X2hlbHAsIHNlbGYsIGFyZ3MpOwogfQogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9xdWFudGlmeV9wcmludF9yZWNvcmRpbmdfc3RhdGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX3ZvaWRhcmdfZnVuY3Rpb24ocXVhbnRpZnlfcHJpbnRfcmVjb3JkaW5nX3N0YXRlLAotCQkJCSAgICAgc2VsZiwgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfdm9pZGFyZ19mdW5jdGlvbihxdWFudGlmeV9wcmludF9yZWNvcmRpbmdfc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLCBhcmdzKTsKIH0KIHN0YXRpYyBQeU9iamVjdCoKIHB1cmVfcXVhbnRpZnlfc3RhcnRfcmVjb3JkaW5nX2RhdGEoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX3ZvaWRhcmdfZnVuY3Rpb24ocXVhbnRpZnlfc3RhcnRfcmVjb3JkaW5nX2RhdGEsCi0JCQkJICAgICBzZWxmLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF92b2lkYXJnX2Z1bmN0aW9uKHF1YW50aWZ5X3N0YXJ0X3JlY29yZGluZ19kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZiwgYXJncyk7CiB9CiBzdGF0aWMgUHlPYmplY3QqCiBwdXJlX3F1YW50aWZ5X3N0b3BfcmVjb3JkaW5nX2RhdGEoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX3ZvaWRhcmdfZnVuY3Rpb24ocXVhbnRpZnlfc3RvcF9yZWNvcmRpbmdfZGF0YSwgc2VsZiwgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfdm9pZGFyZ19mdW5jdGlvbihxdWFudGlmeV9zdG9wX3JlY29yZGluZ19kYXRhLCBzZWxmLCBhcmdzKTsKIH0KIHN0YXRpYyBQeU9iamVjdCoKIHB1cmVfcXVhbnRpZnlfaXNfcmVjb3JkaW5nX2RhdGEoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX3ZvaWRhcmdfZnVuY3Rpb24ocXVhbnRpZnlfaXNfcmVjb3JkaW5nX2RhdGEsIHNlbGYsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX3ZvaWRhcmdfZnVuY3Rpb24ocXVhbnRpZnlfaXNfcmVjb3JkaW5nX2RhdGEsIHNlbGYsIGFyZ3MpOwogfQogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9xdWFudGlmeV9zdGFydF9yZWNvcmRpbmdfc3lzdGVtX2NhbGxzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gY2FsbF92b2lkYXJnX2Z1bmN0aW9uKHF1YW50aWZ5X3N0YXJ0X3JlY29yZGluZ19zeXN0ZW1fY2FsbHMsCi0JCQkJICAgICBzZWxmLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF92b2lkYXJnX2Z1bmN0aW9uKHF1YW50aWZ5X3N0YXJ0X3JlY29yZGluZ19zeXN0ZW1fY2FsbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLCBhcmdzKTsKIH0KIHN0YXRpYyBQeU9iamVjdCoKIHB1cmVfcXVhbnRpZnlfc3RvcF9yZWNvcmRpbmdfc3lzdGVtX2NhbGxzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gY2FsbF92b2lkYXJnX2Z1bmN0aW9uKHF1YW50aWZ5X3N0b3BfcmVjb3JkaW5nX3N5c3RlbV9jYWxscywKLQkJCQkgICAgIHNlbGYsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX3ZvaWRhcmdfZnVuY3Rpb24ocXVhbnRpZnlfc3RvcF9yZWNvcmRpbmdfc3lzdGVtX2NhbGxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZiwgYXJncyk7CiB9CiBzdGF0aWMgUHlPYmplY3QqCiBwdXJlX3F1YW50aWZ5X2lzX3JlY29yZGluZ19zeXN0ZW1fY2FsbHMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX3ZvaWRhcmdfZnVuY3Rpb24ocXVhbnRpZnlfaXNfcmVjb3JkaW5nX3N5c3RlbV9jYWxscywKLQkJCQkgICAgIHNlbGYsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX3ZvaWRhcmdfZnVuY3Rpb24ocXVhbnRpZnlfaXNfcmVjb3JkaW5nX3N5c3RlbV9jYWxscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYsIGFyZ3MpOwogfQogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9xdWFudGlmeV9zdGFydF9yZWNvcmRpbmdfc3lzdGVtX2NhbGwoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX3N0cmluZ29yaW50X2Z1bmN0aW9uKHF1YW50aWZ5X3N0YXJ0X3JlY29yZGluZ19zeXN0ZW1fY2FsbCwKLQkJCQkJICAgc2VsZiwgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfc3RyaW5nb3JpbnRfZnVuY3Rpb24ocXVhbnRpZnlfc3RhcnRfcmVjb3JkaW5nX3N5c3RlbV9jYWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZiwgYXJncyk7CiB9CiBzdGF0aWMgUHlPYmplY3QqCiBwdXJlX3F1YW50aWZ5X3N0b3BfcmVjb3JkaW5nX3N5c3RlbV9jYWxsKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gY2FsbF9zdHJpbmdvcmludF9mdW5jdGlvbihxdWFudGlmeV9zdG9wX3JlY29yZGluZ19zeXN0ZW1fY2FsbCwKLQkJCQkJIHNlbGYsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX3N0cmluZ29yaW50X2Z1bmN0aW9uKHF1YW50aWZ5X3N0b3BfcmVjb3JkaW5nX3N5c3RlbV9jYWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYsIGFyZ3MpOwogfQogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9xdWFudGlmeV9pc19yZWNvcmRpbmdfc3lzdGVtX2NhbGwoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX3N0cmluZ29yaW50X2Z1bmN0aW9uKHF1YW50aWZ5X2lzX3JlY29yZGluZ19zeXN0ZW1fY2FsbCwKLQkJCQkJIHNlbGYsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX3N0cmluZ29yaW50X2Z1bmN0aW9uKHF1YW50aWZ5X2lzX3JlY29yZGluZ19zeXN0ZW1fY2FsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLCBhcmdzKTsKIH0KIHN0YXRpYyBQeU9iamVjdCoKIHB1cmVfcXVhbnRpZnlfc3RhcnRfcmVjb3JkaW5nX2R5bmFtaWNfbGlicmFyeV9kYXRhKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gY2FsbF92b2lkYXJnX2Z1bmN0aW9uKAotCQlxdWFudGlmeV9zdGFydF9yZWNvcmRpbmdfZHluYW1pY19saWJyYXJ5X2RhdGEsCi0JCXNlbGYsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX3ZvaWRhcmdfZnVuY3Rpb24oCisgICAgICAgIHF1YW50aWZ5X3N0YXJ0X3JlY29yZGluZ19keW5hbWljX2xpYnJhcnlfZGF0YSwKKyAgICAgICAgc2VsZiwgYXJncyk7CiB9CiBzdGF0aWMgUHlPYmplY3QqCiBwdXJlX3F1YW50aWZ5X3N0b3BfcmVjb3JkaW5nX2R5bmFtaWNfbGlicmFyeV9kYXRhKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gY2FsbF92b2lkYXJnX2Z1bmN0aW9uKAotCQlxdWFudGlmeV9zdG9wX3JlY29yZGluZ19keW5hbWljX2xpYnJhcnlfZGF0YSwKLQkJc2VsZiwgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfdm9pZGFyZ19mdW5jdGlvbigKKyAgICAgICAgcXVhbnRpZnlfc3RvcF9yZWNvcmRpbmdfZHluYW1pY19saWJyYXJ5X2RhdGEsCisgICAgICAgIHNlbGYsIGFyZ3MpOwogfQogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9xdWFudGlmeV9pc19yZWNvcmRpbmdfZHluYW1pY19saWJyYXJ5X2RhdGEoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX3ZvaWRhcmdfZnVuY3Rpb24oCi0JCXF1YW50aWZ5X2lzX3JlY29yZGluZ19keW5hbWljX2xpYnJhcnlfZGF0YSwKLQkJc2VsZiwgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfdm9pZGFyZ19mdW5jdGlvbigKKyAgICAgICAgcXVhbnRpZnlfaXNfcmVjb3JkaW5nX2R5bmFtaWNfbGlicmFyeV9kYXRhLAorICAgICAgICBzZWxmLCBhcmdzKTsKIH0KIHN0YXRpYyBQeU9iamVjdCoKIHB1cmVfcXVhbnRpZnlfc3RhcnRfcmVjb3JkaW5nX3JlZ2lzdGVyX3dpbmRvd190cmFwcyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfdm9pZGFyZ19mdW5jdGlvbigKLQkJcXVhbnRpZnlfc3RhcnRfcmVjb3JkaW5nX3JlZ2lzdGVyX3dpbmRvd190cmFwcywKLQkJc2VsZiwgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfdm9pZGFyZ19mdW5jdGlvbigKKyAgICAgICAgcXVhbnRpZnlfc3RhcnRfcmVjb3JkaW5nX3JlZ2lzdGVyX3dpbmRvd190cmFwcywKKyAgICAgICAgc2VsZiwgYXJncyk7CiB9CiBzdGF0aWMgUHlPYmplY3QqCiBwdXJlX3F1YW50aWZ5X3N0b3BfcmVjb3JkaW5nX3JlZ2lzdGVyX3dpbmRvd190cmFwcyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfdm9pZGFyZ19mdW5jdGlvbigKLQkJcXVhbnRpZnlfc3RvcF9yZWNvcmRpbmdfcmVnaXN0ZXJfd2luZG93X3RyYXBzLAotCQlzZWxmLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF92b2lkYXJnX2Z1bmN0aW9uKAorICAgICAgICBxdWFudGlmeV9zdG9wX3JlY29yZGluZ19yZWdpc3Rlcl93aW5kb3dfdHJhcHMsCisgICAgICAgIHNlbGYsIGFyZ3MpOwogfQogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9xdWFudGlmeV9pc19yZWNvcmRpbmdfcmVnaXN0ZXJfd2luZG93X3RyYXBzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gY2FsbF92b2lkYXJnX2Z1bmN0aW9uKAotCQlxdWFudGlmeV9pc19yZWNvcmRpbmdfcmVnaXN0ZXJfd2luZG93X3RyYXBzLAotCQlzZWxmLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF92b2lkYXJnX2Z1bmN0aW9uKAorICAgICAgICBxdWFudGlmeV9pc19yZWNvcmRpbmdfcmVnaXN0ZXJfd2luZG93X3RyYXBzLAorICAgICAgICBzZWxmLCBhcmdzKTsKIH0KIHN0YXRpYyBQeU9iamVjdCoKIHB1cmVfcXVhbnRpZnlfZGlzYWJsZV9yZWNvcmRpbmdfZGF0YShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfdm9pZGFyZ19mdW5jdGlvbihxdWFudGlmeV9kaXNhYmxlX3JlY29yZGluZ19kYXRhLAotCQkJCSAgICAgc2VsZiwgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfdm9pZGFyZ19mdW5jdGlvbihxdWFudGlmeV9kaXNhYmxlX3JlY29yZGluZ19kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZiwgYXJncyk7CiB9CiBzdGF0aWMgUHlPYmplY3QqCiBwdXJlX3F1YW50aWZ5X2NsZWFyX2RhdGEoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX3ZvaWRhcmdfZnVuY3Rpb24ocXVhbnRpZnlfY2xlYXJfZGF0YSwgc2VsZiwgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfdm9pZGFyZ19mdW5jdGlvbihxdWFudGlmeV9jbGVhcl9kYXRhLCBzZWxmLCBhcmdzKTsKIH0KIHN0YXRpYyBQeU9iamVjdCoKIHB1cmVfcXVhbnRpZnlfc2F2ZV9kYXRhKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gY2FsbF92b2lkYXJnX2Z1bmN0aW9uKHF1YW50aWZ5X3NhdmVfZGF0YSwgc2VsZiwgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfdm9pZGFyZ19mdW5jdGlvbihxdWFudGlmeV9zYXZlX2RhdGEsIHNlbGYsIGFyZ3MpOwogfQogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9xdWFudGlmeV9zYXZlX2RhdGFfdG9fZmlsZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfc3RyaW5nYXJnX2Z1bmN0aW9uKHF1YW50aWZ5X3NhdmVfZGF0YV90b19maWxlLCBzZWxmLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF9zdHJpbmdhcmdfZnVuY3Rpb24ocXVhbnRpZnlfc2F2ZV9kYXRhX3RvX2ZpbGUsIHNlbGYsIGFyZ3MpOwogfQogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9xdWFudGlmeV9hZGRfYW5ub3RhdGlvbihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfc3RyaW5nYXJnX2Z1bmN0aW9uKHF1YW50aWZ5X2FkZF9hbm5vdGF0aW9uLCBzZWxmLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF9zdHJpbmdhcmdfZnVuY3Rpb24ocXVhbnRpZnlfYWRkX2Fubm90YXRpb24sIHNlbGYsIGFyZ3MpOwogfQogCiAjZW5kaWYgLyogUVVBTlRJRllfSCAqLwogCiAKLQwKKwogLyogZXh0ZXJuYWwgaW50ZXJmYWNlCiAgKi8KIHN0YXRpYyBzdHJ1Y3QgUHlNZXRob2REZWYKQEAgLTkyNyw2NiArOTI3LDY2IEBACiAgICAgeyJxdWFudGlmeV9zYXZlX2RhdGFfdG9fZmlsZSIsIHB1cmVfcXVhbnRpZnlfc2F2ZV9kYXRhX3RvX2ZpbGUsIE1FVEhfVkFSQVJHU30sCiAgICAgeyJxdWFudGlmeV9hZGRfYW5ub3RhdGlvbiIsICAgIHB1cmVfcXVhbnRpZnlfYWRkX2Fubm90YXRpb24sICAgIE1FVEhfVkFSQVJHU30sCiAjZW5kaWYgLyogUVVBTlRJRllfSCAqLwotICAgIHtOVUxMLCAgTlVMTH0JCQkgICAgIC8qIHNlbnRpbmVsICovCisgICAge05VTEwsICBOVUxMfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogCi0MCisKIHN0YXRpYyB2b2lkCiBpbnMoZCwgbmFtZSwgdmFsKQotCVB5T2JqZWN0ICpkOwotCWNoYXIqIG5hbWU7Ci0JbG9uZyB2YWw7CisgICAgUHlPYmplY3QgKmQ7CisgICAgY2hhciogbmFtZTsKKyAgICBsb25nIHZhbDsKIHsKLQlQeU9iamVjdCAqdiA9IFB5SW50X0Zyb21Mb25nKHZhbCk7Ci0JaWYgKHYpIHsKLQkJKHZvaWQpUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgbmFtZSwgdik7Ci0JCVB5X0RFQ1JFRih2KTsKLQl9CisgICAgUHlPYmplY3QgKnYgPSBQeUludF9Gcm9tTG9uZyh2YWwpOworICAgIGlmICh2KSB7CisgICAgICAgICh2b2lkKVB5RGljdF9TZXRJdGVtU3RyaW5nKGQsIG5hbWUsIHYpOworICAgICAgICBQeV9ERUNSRUYodik7CisgICAgfQogfQogCiAKIHZvaWQKIGluaXRwdXJlKCkKIHsKLQlQeU9iamVjdCAqbSwgKmQ7CisgICAgUHlPYmplY3QgKm0sICpkOwogCi0JaWYgKFB5RXJyX1dhcm5QeTNrKCJ0aGUgcHVyZSBtb2R1bGUgaGFzIGJlZW4gcmVtb3ZlZCBpbiAiCi0JICAgICAgICAgICAgICAgICAgICJQeXRob24gMy4wIiwgMikgPCAwKQotCSAgICByZXR1cm47CQorICAgIGlmIChQeUVycl9XYXJuUHkzaygidGhlIHB1cmUgbW9kdWxlIGhhcyBiZWVuIHJlbW92ZWQgaW4gIgorICAgICAgICAgICAgICAgICAgICAgICAiUHl0aG9uIDMuMCIsIDIpIDwgMCkKKyAgICAgICAgcmV0dXJuOwogCi0JbSA9IFB5X0luaXRNb2R1bGUoInB1cmUiLCBwdXJlX21ldGhvZHMpOwotCWlmIChtID09IE5VTEwpCi0gICAgCQlyZXR1cm47Ci0JZCA9IFB5TW9kdWxlX0dldERpY3QobSk7CisgICAgbSA9IFB5X0luaXRNb2R1bGUoInB1cmUiLCBwdXJlX21ldGhvZHMpOworICAgIGlmIChtID09IE5VTEwpCisgICAgICAgIHJldHVybjsKKyAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKIAotICAgICAgICAvKiB0aGlzIGlzIGJvZ3VzIGJlY2F1c2Ugd2Ugc2hvdWxkIGJlIGFibGUgdG8gZmluZCB0aGlzIGluZm9ybWF0aW9uCi0gICAgICAgICAqIG91dCBmcm9tIHRoZSBoZWFkZXIgZmlsZXMuICBQdXJlJ3MgY3VycmVudCB2ZXJzaW9ucyBkb24ndAotICAgICAgICAgKiBpbmNsdWRlIHRoaXMgaW5mb3JtYXRpb24hCi0gICAgICAgICAqLworICAgIC8qIHRoaXMgaXMgYm9ndXMgYmVjYXVzZSB3ZSBzaG91bGQgYmUgYWJsZSB0byBmaW5kIHRoaXMgaW5mb3JtYXRpb24KKyAgICAgKiBvdXQgZnJvbSB0aGUgaGVhZGVyIGZpbGVzLiAgUHVyZSdzIGN1cnJlbnQgdmVyc2lvbnMgZG9uJ3QKKyAgICAgKiBpbmNsdWRlIHRoaXMgaW5mb3JtYXRpb24hCisgICAgICovCiAjaWZkZWYgUFVSRV9QVVJJRllfVkVSU0lPTgotCWlucyhkLCAiUFVSSUZZX1ZFUlNJT04iLCBQVVJFX1BVUklGWV9WRVJTSU9OKTsKKyAgICBpbnMoZCwgIlBVUklGWV9WRVJTSU9OIiwgUFVSRV9QVVJJRllfVkVSU0lPTik7CiAjZWxzZQotCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJQVVJJRllfVkVSU0lPTiIsIFB5X05vbmUpOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJQVVJJRllfVkVSU0lPTiIsIFB5X05vbmUpOwogI2VuZGlmCiAKLSAgICAgICAgLyogdGhlc2UgYXJlbid0IHRlcnJpYmx5IHVzZWZ1bCBiZWNhdXNlIHB1cmlmeV9leGl0KCkgaXNuJ3QKLSAgICAgICAgICogZXhwb3J0ZWQgY29ycmVjdGx5LiAgU2VlIHRoZSBub3RlIGF0IHRoZSB0b3Agb2YgdGhlIGZpbGUuCi0gICAgICAgICAqLworICAgIC8qIHRoZXNlIGFyZW4ndCB0ZXJyaWJseSB1c2VmdWwgYmVjYXVzZSBwdXJpZnlfZXhpdCgpIGlzbid0CisgICAgICogZXhwb3J0ZWQgY29ycmVjdGx5LiAgU2VlIHRoZSBub3RlIGF0IHRoZSB0b3Agb2YgdGhlIGZpbGUuCisgICAgICovCiAjaWZkZWYgUFVSSUZZX0VYSVRfRVJST1JTCi0JaW5zKGQsICJQVVJJRllfRVhJVF9FUlJPUlMiLCBQVVJJRllfRVhJVF9FUlJPUlMpOworICAgIGlucyhkLCAiUFVSSUZZX0VYSVRfRVJST1JTIiwgUFVSSUZZX0VYSVRfRVJST1JTKTsKICNlbmRpZgogI2lmZGVmIFBVUklGWV9FWElUX0xFQUtTCi0JaW5zKGQsICJQVVJJRllfRVhJVF9MRUFLUyIsICBQVVJJRllfRVhJVF9MRUFLUyk7CisgICAgaW5zKGQsICJQVVJJRllfRVhJVF9MRUFLUyIsICBQVVJJRllfRVhJVF9MRUFLUyk7CiAjZW5kaWYKICNpZmRlZiBQVVJJRllfRVhJVF9QTEVBS1MKLQlpbnMoZCwgIlBVUklGWV9FWElUX1BMRUFLUyIsIFBVUklGWV9FWElUX1BMRUFLUyk7CisgICAgaW5zKGQsICJQVVJJRllfRVhJVF9QTEVBS1MiLCBQVVJJRllfRVhJVF9QTEVBS1MpOwogI2VuZGlmCiAKIAogI2lmZGVmIFBVUkVfUVVBTlRJRllfVkVSU0lPTgotCWlucyhkLCAiUVVBTlRJRllfVkVSU0lPTiIsIFBVUkVfUVVBTlRJRllfVkVSU0lPTik7CisgICAgaW5zKGQsICJRVUFOVElGWV9WRVJTSU9OIiwgUFVSRV9RVUFOVElGWV9WRVJTSU9OKTsKICNlbHNlCi0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlFVQU5USUZZX1ZFUlNJT04iLCBQeV9Ob25lKTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUVVBTlRJRllfVkVSU0lPTiIsIFB5X05vbmUpOwogI2VuZGlmCiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3B3ZG1vZHVsZS5jIGIvTW9kdWxlcy9wd2Rtb2R1bGUuYwppbmRleCAyODY1ZGM2Li5hZTM1OGUwIDEwMDY0NAotLS0gYS9Nb2R1bGVzL3B3ZG1vZHVsZS5jCisrKyBiL01vZHVsZXMvcHdkbW9kdWxlLmMKQEAgLTgsMTQgKzgsMTQgQEAKICNpbmNsdWRlIDxwd2QuaD4KIAogc3RhdGljIFB5U3RydWN0U2VxdWVuY2VfRmllbGQgc3RydWN0X3B3ZF90eXBlX2ZpZWxkc1tdID0gewotCXsicHdfbmFtZSIsICJ1c2VyIG5hbWUifSwKLQl7InB3X3Bhc3N3ZCIsICJwYXNzd29yZCJ9LAotCXsicHdfdWlkIiwgInVzZXIgaWQifSwKLQl7InB3X2dpZCIsICJncm91cCBpZCJ9LCAKLQl7InB3X2dlY29zIiwgInJlYWwgbmFtZSJ9LCAKLQl7InB3X2RpciIsICJob21lIGRpcmVjdG9yeSJ9LAotCXsicHdfc2hlbGwiLCAic2hlbGwgcHJvZ3JhbSJ9LAotCXswfQorICAgIHsicHdfbmFtZSIsICJ1c2VyIG5hbWUifSwKKyAgICB7InB3X3Bhc3N3ZCIsICJwYXNzd29yZCJ9LAorICAgIHsicHdfdWlkIiwgInVzZXIgaWQifSwKKyAgICB7InB3X2dpZCIsICJncm91cCBpZCJ9LAorICAgIHsicHdfZ2Vjb3MiLCAicmVhbCBuYW1lIn0sCisgICAgeyJwd19kaXIiLCAiaG9tZSBkaXJlY3RvcnkifSwKKyAgICB7InB3X3NoZWxsIiwgInNoZWxsIHByb2dyYW0ifSwKKyAgICB7MH0KIH07CiAKIFB5RG9jX1NUUlZBUihzdHJ1Y3RfcGFzc3dkX19kb2NfXywKQEAgLTI1LDEwICsyNSwxMCBAQAogb3IgdmlhIHRoZSBvYmplY3QgYXR0cmlidXRlcyBhcyBuYW1lZCBpbiB0aGUgYWJvdmUgdHVwbGUuIik7CiAKIHN0YXRpYyBQeVN0cnVjdFNlcXVlbmNlX0Rlc2Mgc3RydWN0X3B3ZF90eXBlX2Rlc2MgPSB7Ci0JInB3ZC5zdHJ1Y3RfcGFzc3dkIiwKLQlzdHJ1Y3RfcGFzc3dkX19kb2NfXywKLQlzdHJ1Y3RfcHdkX3R5cGVfZmllbGRzLAotCTcsCisgICAgInB3ZC5zdHJ1Y3RfcGFzc3dkIiwKKyAgICBzdHJ1Y3RfcGFzc3dkX19kb2NfXywKKyAgICBzdHJ1Y3RfcHdkX3R5cGVfZmllbGRzLAorICAgIDcsCiB9OwogCiBQeURvY19TVFJWQVIocHdkX19kb2NfXywKQEAgLTQxLDcgKzQxLDcgQEAKIFRoZSB1aWQgYW5kIGdpZCBpdGVtcyBhcmUgaW50ZWdlcnMsIGFsbCBvdGhlcnMgYXJlIHN0cmluZ3MuIEFuXG5cCiBleGNlcHRpb24gaXMgcmFpc2VkIGlmIHRoZSBlbnRyeSBhc2tlZCBmb3IgY2Fubm90IGJlIGZvdW5kLiIpOwogCi0gICAgICAKKwogc3RhdGljIGludCBpbml0aWFsaXplZDsKIHN0YXRpYyBQeVR5cGVPYmplY3QgU3RydWN0UHdkVHlwZTsKIApAQCAtNDksNDkgKzQ5LDQ5IEBACiBzZXRzKFB5T2JqZWN0ICp2LCBpbnQgaSwgY2hhciogdmFsKQogewogICBpZiAodmFsKQotCSAgUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTSh2LCBpLCBQeVN0cmluZ19Gcm9tU3RyaW5nKHZhbCkpOworICAgICAgUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTSh2LCBpLCBQeVN0cmluZ19Gcm9tU3RyaW5nKHZhbCkpOwogICBlbHNlIHsKLQkgIFB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0odiwgaSwgUHlfTm9uZSk7Ci0JICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICBQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHYsIGksIFB5X05vbmUpOworICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwogICB9CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBta3B3ZW50KHN0cnVjdCBwYXNzd2QgKnApCiB7Ci0JaW50IHNldEluZGV4ID0gMDsKLQlQeU9iamVjdCAqdiA9IFB5U3RydWN0U2VxdWVuY2VfTmV3KCZTdHJ1Y3RQd2RUeXBlKTsKLQlpZiAodiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpbnQgc2V0SW5kZXggPSAwOworICAgIFB5T2JqZWN0ICp2ID0gUHlTdHJ1Y3RTZXF1ZW5jZV9OZXcoJlN0cnVjdFB3ZFR5cGUpOworICAgIGlmICh2ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCiAjZGVmaW5lIFNFVEkoaSx2YWwpIFB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0odiwgaSwgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIHZhbCkpCiAjZGVmaW5lIFNFVFMoaSx2YWwpIHNldHModiwgaSwgdmFsKQogCi0JU0VUUyhzZXRJbmRleCsrLCBwLT5wd19uYW1lKTsKKyAgICBTRVRTKHNldEluZGV4KyssIHAtPnB3X25hbWUpOwogI2lmZGVmIF9fVk1TCi0JU0VUUyhzZXRJbmRleCsrLCAiIik7CisgICAgU0VUUyhzZXRJbmRleCsrLCAiIik7CiAjZWxzZQotCVNFVFMoc2V0SW5kZXgrKywgcC0+cHdfcGFzc3dkKTsKKyAgICBTRVRTKHNldEluZGV4KyssIHAtPnB3X3Bhc3N3ZCk7CiAjZW5kaWYKLQlTRVRJKHNldEluZGV4KyssIHAtPnB3X3VpZCk7Ci0JU0VUSShzZXRJbmRleCsrLCBwLT5wd19naWQpOworICAgIFNFVEkoc2V0SW5kZXgrKywgcC0+cHdfdWlkKTsKKyAgICBTRVRJKHNldEluZGV4KyssIHAtPnB3X2dpZCk7CiAjaWZkZWYgX19WTVMKLQlTRVRTKHNldEluZGV4KyssICIiKTsKKyAgICBTRVRTKHNldEluZGV4KyssICIiKTsKICNlbHNlCi0JU0VUUyhzZXRJbmRleCsrLCBwLT5wd19nZWNvcyk7CisgICAgU0VUUyhzZXRJbmRleCsrLCBwLT5wd19nZWNvcyk7CiAjZW5kaWYKLQlTRVRTKHNldEluZGV4KyssIHAtPnB3X2Rpcik7Ci0JU0VUUyhzZXRJbmRleCsrLCBwLT5wd19zaGVsbCk7CisgICAgU0VUUyhzZXRJbmRleCsrLCBwLT5wd19kaXIpOworICAgIFNFVFMoc2V0SW5kZXgrKywgcC0+cHdfc2hlbGwpOwogCiAjdW5kZWYgU0VUUwogI3VuZGVmIFNFVEkKIAotCWlmIChQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCVB5X1hERUNSRUYodik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICBQeV9YREVDUkVGKHYpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlyZXR1cm4gdjsKKyAgICByZXR1cm4gdjsKIH0KIAogUHlEb2NfU1RSVkFSKHB3ZF9nZXRwd3VpZF9fZG9jX18sCkBAIC0xMDMsMTYgKzEwMywxNiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHB3ZF9nZXRwd3VpZChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JdW5zaWduZWQgaW50IHVpZDsKLQlzdHJ1Y3QgcGFzc3dkICpwOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiSTpnZXRwd3VpZCIsICZ1aWQpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoKHAgPSBnZXRwd3VpZCh1aWQpKSA9PSBOVUxMKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19LZXlFcnJvciwKLQkJCSAgICAgImdldHB3dWlkKCk6IHVpZCBub3QgZm91bmQ6ICVkIiwgdWlkKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBta3B3ZW50KHApOworICAgIHVuc2lnbmVkIGludCB1aWQ7CisgICAgc3RydWN0IHBhc3N3ZCAqcDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIkk6Z2V0cHd1aWQiLCAmdWlkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKChwID0gZ2V0cHd1aWQodWlkKSkgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfS2V5RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiZ2V0cHd1aWQoKTogdWlkIG5vdCBmb3VuZDogJWQiLCB1aWQpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIG1rcHdlbnQocCk7CiB9CiAKIFB5RG9jX1NUUlZBUihwd2RfZ2V0cHduYW1fX2RvY19fLApAQCAtMTI0LDE2ICsxMjQsMTYgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBwd2RfZ2V0cHduYW0oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKm5hbWU7Ci0Jc3RydWN0IHBhc3N3ZCAqcDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6Z2V0cHduYW0iLCAmbmFtZSkpCi0JCXJldHVybiBOVUxMOwotCWlmICgocCA9IGdldHB3bmFtKG5hbWUpKSA9PSBOVUxMKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19LZXlFcnJvciwKLQkJCSAgICAgImdldHB3bmFtKCk6IG5hbWUgbm90IGZvdW5kOiAlcyIsIG5hbWUpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIG1rcHdlbnQocCk7CisgICAgY2hhciAqbmFtZTsKKyAgICBzdHJ1Y3QgcGFzc3dkICpwOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczpnZXRwd25hbSIsICZuYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKChwID0gZ2V0cHduYW0obmFtZSkpID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX0tleUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgImdldHB3bmFtKCk6IG5hbWUgbm90IGZvdW5kOiAlcyIsIG5hbWUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIG1rcHdlbnQocCk7CiB9CiAKICNpZmRlZiBIQVZFX0dFVFBXRU5UCkBAIC0xNDYsNTUgKzE0Niw1NSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHB3ZF9nZXRwd2FsbChQeU9iamVjdCAqc2VsZikKIHsKLQlQeU9iamVjdCAqZDsKLQlzdHJ1Y3QgcGFzc3dkICpwOwotCWlmICgoZCA9IFB5TGlzdF9OZXcoMCkpID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIFB5T2JqZWN0ICpkOworICAgIHN0cnVjdCBwYXNzd2QgKnA7CisgICAgaWYgKChkID0gUHlMaXN0X05ldygwKSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAjaWYgZGVmaW5lZChQWU9TX09TMikgJiYgZGVmaW5lZChQWUNDX0dDQykKLQlpZiAoKHAgPSBnZXRwd3VpZCgwKSkgIT0gTlVMTCkgeworICAgIGlmICgocCA9IGdldHB3dWlkKDApKSAhPSBOVUxMKSB7CiAjZWxzZQotCXNldHB3ZW50KCk7Ci0Jd2hpbGUgKChwID0gZ2V0cHdlbnQoKSkgIT0gTlVMTCkgeworICAgIHNldHB3ZW50KCk7CisgICAgd2hpbGUgKChwID0gZ2V0cHdlbnQoKSkgIT0gTlVMTCkgewogI2VuZGlmCi0JCVB5T2JqZWN0ICp2ID0gbWtwd2VudChwKTsKLQkJaWYgKHYgPT0gTlVMTCB8fCBQeUxpc3RfQXBwZW5kKGQsIHYpICE9IDApIHsKLQkJCVB5X1hERUNSRUYodik7Ci0JCQlQeV9ERUNSRUYoZCk7Ci0JCQllbmRwd2VudCgpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJUHlfREVDUkVGKHYpOwotCX0KLQllbmRwd2VudCgpOwotCXJldHVybiBkOworICAgICAgICBQeU9iamVjdCAqdiA9IG1rcHdlbnQocCk7CisgICAgICAgIGlmICh2ID09IE5VTEwgfHwgUHlMaXN0X0FwcGVuZChkLCB2KSAhPSAwKSB7CisgICAgICAgICAgICBQeV9YREVDUkVGKHYpOworICAgICAgICAgICAgUHlfREVDUkVGKGQpOworICAgICAgICAgICAgZW5kcHdlbnQoKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICB9CisgICAgZW5kcHdlbnQoKTsKKyAgICByZXR1cm4gZDsKIH0KICNlbmRpZgogCiBzdGF0aWMgUHlNZXRob2REZWYgcHdkX21ldGhvZHNbXSA9IHsKLQl7ImdldHB3dWlkIiwJcHdkX2dldHB3dWlkLCBNRVRIX1ZBUkFSR1MsIHB3ZF9nZXRwd3VpZF9fZG9jX199LAotCXsiZ2V0cHduYW0iLAlwd2RfZ2V0cHduYW0sIE1FVEhfVkFSQVJHUywgcHdkX2dldHB3bmFtX19kb2NfX30sCisgICAgeyJnZXRwd3VpZCIsICAgICAgICBwd2RfZ2V0cHd1aWQsIE1FVEhfVkFSQVJHUywgcHdkX2dldHB3dWlkX19kb2NfX30sCisgICAgeyJnZXRwd25hbSIsICAgICAgICBwd2RfZ2V0cHduYW0sIE1FVEhfVkFSQVJHUywgcHdkX2dldHB3bmFtX19kb2NfX30sCiAjaWZkZWYgSEFWRV9HRVRQV0VOVAotCXsiZ2V0cHdhbGwiLAkoUHlDRnVuY3Rpb24pcHdkX2dldHB3YWxsLAotCQlNRVRIX05PQVJHUywgIHB3ZF9nZXRwd2FsbF9fZG9jX199LAorICAgIHsiZ2V0cHdhbGwiLCAgICAgICAgKFB5Q0Z1bmN0aW9uKXB3ZF9nZXRwd2FsbCwKKyAgICAgICAgTUVUSF9OT0FSR1MsICBwd2RfZ2V0cHdhbGxfX2RvY19ffSwKICNlbmRpZgotCXtOVUxMLAkJTlVMTH0JCS8qIHNlbnRpbmVsICovCisgICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIFB5TU9ESU5JVF9GVU5DCiBpbml0cHdkKHZvaWQpCiB7Ci0JUHlPYmplY3QgKm07Ci0JbSA9IFB5X0luaXRNb2R1bGUzKCJwd2QiLCBwd2RfbWV0aG9kcywgcHdkX19kb2NfXyk7Ci0JaWYgKG0gPT0gTlVMTCkKLSAgICAJCXJldHVybjsKKyAgICBQeU9iamVjdCAqbTsKKyAgICBtID0gUHlfSW5pdE1vZHVsZTMoInB3ZCIsIHB3ZF9tZXRob2RzLCBwd2RfX2RvY19fKTsKKyAgICBpZiAobSA9PSBOVUxMKQorICAgICAgICByZXR1cm47CiAKLQlpZiAoIWluaXRpYWxpemVkKQotCQlQeVN0cnVjdFNlcXVlbmNlX0luaXRUeXBlKCZTdHJ1Y3RQd2RUeXBlLCAKLQkJCQkJICAmc3RydWN0X3B3ZF90eXBlX2Rlc2MpOwotCVB5X0lOQ1JFRigoUHlPYmplY3QgKikgJlN0cnVjdFB3ZFR5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAic3RydWN0X3Bhc3N3ZCIsIChQeU9iamVjdCAqKSAmU3RydWN0UHdkVHlwZSk7Ci0JLyogQW5kIGZvciBiL3cgY29tcGF0aWJpbGl0eSAodGhpcyB3YXMgZGVmaW5lZCBieSBtaXN0YWtlKTogKi8KLSAgICAgICAgUHlfSU5DUkVGKChQeU9iamVjdCAqKSAmU3RydWN0UHdkVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJzdHJ1Y3RfcHdlbnQiLCAoUHlPYmplY3QgKikgJlN0cnVjdFB3ZFR5cGUpOwotCWluaXRpYWxpemVkID0gMTsKKyAgICBpZiAoIWluaXRpYWxpemVkKQorICAgICAgICBQeVN0cnVjdFNlcXVlbmNlX0luaXRUeXBlKCZTdHJ1Y3RQd2RUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHJ1Y3RfcHdkX3R5cGVfZGVzYyk7CisgICAgUHlfSU5DUkVGKChQeU9iamVjdCAqKSAmU3RydWN0UHdkVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJzdHJ1Y3RfcGFzc3dkIiwgKFB5T2JqZWN0ICopICZTdHJ1Y3RQd2RUeXBlKTsKKyAgICAvKiBBbmQgZm9yIGIvdyBjb21wYXRpYmlsaXR5ICh0aGlzIHdhcyBkZWZpbmVkIGJ5IG1pc3Rha2UpOiAqLworICAgIFB5X0lOQ1JFRigoUHlPYmplY3QgKikgJlN0cnVjdFB3ZFR5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAic3RydWN0X3B3ZW50IiwgKFB5T2JqZWN0ICopICZTdHJ1Y3RQd2RUeXBlKTsKKyAgICBpbml0aWFsaXplZCA9IDE7CiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3B5ZXhwYXQuYyBiL01vZHVsZXMvcHlleHBhdC5jCmluZGV4IDAxOTcxYjcuLjFlOWI4OWYgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvcHlleHBhdC5jCisrKyBiL01vZHVsZXMvcHlleHBhdC5jCkBAIC0yNDUsNyArMjQ1LDcgQEAKICAgIHVzZWQgb25seSBmcm9tIHRoZSBjaGFyYWN0ZXIgZGF0YSBoYW5kbGVyIHRyYW1wb2xpbmUsIGFuZCBtdXN0IGJlCiAgICB1c2VkIHJpZ2h0IGFmdGVyIGBmbGFnX2Vycm9yKClgIGlzIGNhbGxlZC4gKi8KIHN0YXRpYyB2b2lkCi1ub29wX2NoYXJhY3Rlcl9kYXRhX2hhbmRsZXIodm9pZCAqdXNlckRhdGEsIGNvbnN0IFhNTF9DaGFyICpkYXRhLCBpbnQgbGVuKSAKK25vb3BfY2hhcmFjdGVyX2RhdGFfaGFuZGxlcih2b2lkICp1c2VyRGF0YSwgY29uc3QgWE1MX0NoYXIgKmRhdGEsIGludCBsZW4pCiB7CiAgICAgLyogRG8gbm90aGluZy4gKi8KIH0KQEAgLTI3OCwyMiArMjc4LDIyIEBACiAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKICAgICAgICAgZmlsZW5hbWUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKF9fRklMRV9fKTsKICAgICAgICAgaGFuZGxlcl9pbmZvW3Nsb3RdLnRiX2NvZGUgPQotICAgICAgICAgICAgUHlDb2RlX05ldygwLAkJLyogYXJnY291bnQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgMCwJCS8qIG5sb2NhbHMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgMCwJCS8qIHN0YWNrc2l6ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAwLAkJLyogZmxhZ3MgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgY29kZSwJCS8qIGNvZGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgbnVsbHR1cGxlLAkvKiBjb25zdHMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgbnVsbHR1cGxlLAkvKiBuYW1lcyAqLwotICAgICAgICAgICAgICAgICAgICAgICBudWxsdHVwbGUsCS8qIHZhcm5hbWVzICovCisgICAgICAgICAgICBQeUNvZGVfTmV3KDAsICAgICAgICAgICAgICAgLyogYXJnY291bnQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAvKiBubG9jYWxzICovCisgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgLyogc3RhY2tzaXplICovCisgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgLyogZmxhZ3MgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgY29kZSwgICAgICAgICAgICAvKiBjb2RlICovCisgICAgICAgICAgICAgICAgICAgICAgIG51bGx0dXBsZSwgICAgICAgLyogY29uc3RzICovCisgICAgICAgICAgICAgICAgICAgICAgIG51bGx0dXBsZSwgICAgICAgLyogbmFtZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgbnVsbHR1cGxlLCAgICAgICAvKiB2YXJuYW1lcyAqLwogI2lmIFBZVEhPTl9BUElfVkVSU0lPTiA+PSAxMDEwCi0gICAgICAgICAgICAgICAgICAgICAgIG51bGx0dXBsZSwJLyogZnJlZXZhcnMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgbnVsbHR1cGxlLAkvKiBjZWxsdmFycyAqLworICAgICAgICAgICAgICAgICAgICAgICBudWxsdHVwbGUsICAgICAgIC8qIGZyZWV2YXJzICovCisgICAgICAgICAgICAgICAgICAgICAgIG51bGx0dXBsZSwgICAgICAgLyogY2VsbHZhcnMgKi8KICNlbmRpZgotICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSwJLyogZmlsZW5hbWUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwJCS8qIG5hbWUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgbGluZW5vLAkJLyogZmlyc3RsaW5lbm8gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgY29kZQkJLyogbG5vdGFiICovCisgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lLCAgICAgICAgLyogZmlsZW5hbWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgICAgICAgICAgICAvKiBuYW1lICovCisgICAgICAgICAgICAgICAgICAgICAgIGxpbmVubywgICAgICAgICAgLyogZmlyc3RsaW5lbm8gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgY29kZSAgICAgICAgICAgICAvKiBsbm90YWIgKi8KICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgaWYgKGhhbmRsZXJfaW5mb1tzbG90XS50Yl9jb2RlID09IE5VTEwpCiAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKQEAgLTMxNSwyNSArMzE1LDI1IEBACiB7CiAgICAgaW50IHJlc3VsdCA9IDA7CiAgICAgaWYgKCF0c3RhdGUtPnVzZV90cmFjaW5nIHx8IHRzdGF0ZS0+dHJhY2luZykKLQlyZXR1cm4gMDsKKyAgICAgICAgcmV0dXJuIDA7CiAgICAgaWYgKHRzdGF0ZS0+Y19wcm9maWxlZnVuYyAhPSBOVUxMKSB7Ci0JdHN0YXRlLT50cmFjaW5nKys7Ci0JcmVzdWx0ID0gdHN0YXRlLT5jX3Byb2ZpbGVmdW5jKHRzdGF0ZS0+Y19wcm9maWxlb2JqLAotCQkJCSAgICAgICBmLCBjb2RlICwgdmFsKTsKLQl0c3RhdGUtPnVzZV90cmFjaW5nID0gKCh0c3RhdGUtPmNfdHJhY2VmdW5jICE9IE5VTEwpCi0JCQkgICAgICAgfHwgKHRzdGF0ZS0+Y19wcm9maWxlZnVuYyAhPSBOVUxMKSk7Ci0JdHN0YXRlLT50cmFjaW5nLS07Ci0JaWYgKHJlc3VsdCkKLQkgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgdHN0YXRlLT50cmFjaW5nKys7CisgICAgICAgIHJlc3VsdCA9IHRzdGF0ZS0+Y19wcm9maWxlZnVuYyh0c3RhdGUtPmNfcHJvZmlsZW9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYsIGNvZGUgLCB2YWwpOworICAgICAgICB0c3RhdGUtPnVzZV90cmFjaW5nID0gKCh0c3RhdGUtPmNfdHJhY2VmdW5jICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKHRzdGF0ZS0+Y19wcm9maWxlZnVuYyAhPSBOVUxMKSk7CisgICAgICAgIHRzdGF0ZS0+dHJhY2luZy0tOworICAgICAgICBpZiAocmVzdWx0KQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAgICAgaWYgKHRzdGF0ZS0+Y190cmFjZWZ1bmMgIT0gTlVMTCkgewotCXRzdGF0ZS0+dHJhY2luZysrOwotCXJlc3VsdCA9IHRzdGF0ZS0+Y190cmFjZWZ1bmModHN0YXRlLT5jX3RyYWNlb2JqLAotCQkJCSAgICAgZiwgY29kZSAsIHZhbCk7Ci0JdHN0YXRlLT51c2VfdHJhY2luZyA9ICgodHN0YXRlLT5jX3RyYWNlZnVuYyAhPSBOVUxMKQotCQkJICAgICAgIHx8ICh0c3RhdGUtPmNfcHJvZmlsZWZ1bmMgIT0gTlVMTCkpOwotCXRzdGF0ZS0+dHJhY2luZy0tOwotICAgIH0JCisgICAgICAgIHRzdGF0ZS0+dHJhY2luZysrOworICAgICAgICByZXN1bHQgPSB0c3RhdGUtPmNfdHJhY2VmdW5jKHRzdGF0ZS0+Y190cmFjZW9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLCBjb2RlICwgdmFsKTsKKyAgICAgICAgdHN0YXRlLT51c2VfdHJhY2luZyA9ICgodHN0YXRlLT5jX3RyYWNlZnVuYyAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICh0c3RhdGUtPmNfcHJvZmlsZWZ1bmMgIT0gTlVMTCkpOworICAgICAgICB0c3RhdGUtPnRyYWNpbmctLTsKKyAgICB9CiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIApAQCAtMzQ0LDEyICszNDQsMTIgQEAKICAgICBpbnQgZXJyOwogCiAgICAgaWYgKHRzdGF0ZS0+Y190cmFjZWZ1bmMgPT0gTlVMTCkKLQlyZXR1cm4gMDsKKyAgICAgICAgcmV0dXJuIDA7CiAKICAgICBQeUVycl9GZXRjaCgmdHlwZSwgJnZhbHVlLCAmdHJhY2ViYWNrKTsKICAgICBpZiAodmFsdWUgPT0gTlVMTCkgewotCXZhbHVlID0gUHlfTm9uZTsKLQlQeV9JTkNSRUYodmFsdWUpOworICAgICAgICB2YWx1ZSA9IFB5X05vbmU7CisgICAgICAgIFB5X0lOQ1JFRih2YWx1ZSk7CiAgICAgfQogI2lmIFBZX1ZFUlNJT05fSEVYIDwgMHgwMjA0MDAwMAogICAgIGFyZyA9IFB5X0J1aWxkVmFsdWUoIihPT08pIiwgdHlwZSwgdmFsdWUsIHRyYWNlYmFjayk7CkBAIC0zNTcsMTcgKzM1NywxNyBAQAogICAgIGFyZyA9IFB5VHVwbGVfUGFjaygzLCB0eXBlLCB2YWx1ZSwgdHJhY2ViYWNrKTsKICNlbmRpZgogICAgIGlmIChhcmcgPT0gTlVMTCkgewotCVB5RXJyX1Jlc3RvcmUodHlwZSwgdmFsdWUsIHRyYWNlYmFjayk7Ci0JcmV0dXJuIDA7CisgICAgICAgIFB5RXJyX1Jlc3RvcmUodHlwZSwgdmFsdWUsIHRyYWNlYmFjayk7CisgICAgICAgIHJldHVybiAwOwogICAgIH0KICAgICBlcnIgPSB0cmFjZV9mcmFtZSh0c3RhdGUsIGYsIFB5VHJhY2VfRVhDRVBUSU9OLCBhcmcpOwogICAgIFB5X0RFQ1JFRihhcmcpOwogICAgIGlmIChlcnIgPT0gMCkKLQlQeUVycl9SZXN0b3JlKHR5cGUsIHZhbHVlLCB0cmFjZWJhY2spOworICAgICAgICBQeUVycl9SZXN0b3JlKHR5cGUsIHZhbHVlLCB0cmFjZWJhY2spOwogICAgIGVsc2UgewotCVB5X1hERUNSRUYodHlwZSk7Ci0JUHlfWERFQ1JFRih2YWx1ZSk7Ci0JUHlfWERFQ1JFRih0cmFjZWJhY2spOworICAgICAgICBQeV9YREVDUkVGKHR5cGUpOworICAgICAgICBQeV9YREVDUkVGKHZhbHVlKTsKKyAgICAgICAgUHlfWERFQ1JFRih0cmFjZWJhY2spOwogICAgIH0KICAgICByZXR1cm4gZXJyOwogfQpAQCAtMzgzLDMxICszODMsMzEgQEAKIAogICAgIGlmIChjID09IE5VTEwpCiAgICAgICAgIHJldHVybiBOVUxMOwotICAgIAorCiAgICAgZiA9IFB5RnJhbWVfTmV3KHRzdGF0ZSwgYywgUHlFdmFsX0dldEdsb2JhbHMoKSwgTlVMTCk7CiAgICAgaWYgKGYgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgdHN0YXRlLT5mcmFtZSA9IGY7CiAjaWZkZWYgRklYX1RSQUNFCiAgICAgaWYgKHRyYWNlX2ZyYW1lKHRzdGF0ZSwgZiwgUHlUcmFjZV9DQUxMLCBQeV9Ob25lKSA8IDApIHsKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogI2VuZGlmCiAgICAgcmVzID0gUHlFdmFsX0NhbGxPYmplY3QoZnVuYywgYXJncyk7CiAgICAgaWYgKHJlcyA9PSBOVUxMKSB7Ci0JaWYgKHRzdGF0ZS0+Y3VyZXhjX3RyYWNlYmFjayA9PSBOVUxMKQotCSAgICBQeVRyYWNlQmFja19IZXJlKGYpOworICAgICAgICBpZiAodHN0YXRlLT5jdXJleGNfdHJhY2ViYWNrID09IE5VTEwpCisgICAgICAgICAgICBQeVRyYWNlQmFja19IZXJlKGYpOwogICAgICAgICBYTUxfU3RvcFBhcnNlcihzZWxmLT5pdHNlbGYsIFhNTF9GQUxTRSk7CiAjaWZkZWYgRklYX1RSQUNFCi0JaWYgKHRyYWNlX2ZyYW1lX2V4Yyh0c3RhdGUsIGYpIDwgMCkgewotCSAgICByZXR1cm4gTlVMTDsKLQl9CisgICAgICAgIGlmICh0cmFjZV9mcmFtZV9leGModHN0YXRlLCBmKSA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CiAgICAgfQogICAgIGVsc2UgewotCWlmICh0cmFjZV9mcmFtZSh0c3RhdGUsIGYsIFB5VHJhY2VfUkVUVVJOLCByZXMpIDwgMCkgewotCSAgICBQeV9YREVDUkVGKHJlcyk7Ci0JICAgIHJlcyA9IE5VTEw7Ci0JfQorICAgICAgICBpZiAodHJhY2VfZnJhbWUodHN0YXRlLCBmLCBQeVRyYWNlX1JFVFVSTiwgcmVzKSA8IDApIHsKKyAgICAgICAgICAgIFB5X1hERUNSRUYocmVzKTsKKyAgICAgICAgICAgIHJlcyA9IE5VTEw7CisgICAgICAgIH0KICAgICB9CiAjZWxzZQogICAgIH0KQEAgLTQzMiwxMiArNDMyLDEyIEBACiAgICAgUHlPYmplY3QgKnZhbHVlOwogICAgIC8qIHJlc3VsdCBjYW4gYmUgTlVMTCBpZiB0aGUgdW5pY29kZSBjb252ZXJzaW9uIGZhaWxlZC4gKi8KICAgICBpZiAoIXJlc3VsdCkKLQlyZXR1cm4gcmVzdWx0OworICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIGlmICghc2VsZi0+aW50ZXJuKQotCXJldHVybiByZXN1bHQ7CisgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgdmFsdWUgPSBQeURpY3RfR2V0SXRlbShzZWxmLT5pbnRlcm4sIHJlc3VsdCk7CiAgICAgaWYgKCF2YWx1ZSkgewotCWlmIChQeURpY3RfU2V0SXRlbShzZWxmLT5pbnRlcm4sIHJlc3VsdCwgcmVzdWx0KSA9PSAwKQorICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW0oc2VsZi0+aW50ZXJuLCByZXN1bHQsIHJlc3VsdCkgPT0gMCkKICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgIGVsc2UKICAgICAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtNDYwLDggKzQ2MCw4IEBACiAgICAgaWYgKGFyZ3MgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIC0xOwogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLSAgICB0ZW1wID0gKHNlbGYtPnJldHVybnNfdW5pY29kZSAKLSAgICAgICAgICAgID8gY29udl9zdHJpbmdfbGVuX3RvX3VuaWNvZGUoYnVmZmVyLCBsZW4pIAorICAgIHRlbXAgPSAoc2VsZi0+cmV0dXJuc191bmljb2RlCisgICAgICAgICAgICA/IGNvbnZfc3RyaW5nX2xlbl90b191bmljb2RlKGJ1ZmZlciwgbGVuKQogICAgICAgICAgICAgOiBjb252X3N0cmluZ19sZW5fdG9fdXRmOChidWZmZXIsIGxlbikpOwogI2Vsc2UKICAgICB0ZW1wID0gY29udl9zdHJpbmdfbGVuX3RvX3V0ZjgoYnVmZmVyLCBsZW4pOwpAQCAtNTAzLDcgKzUwMyw3IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1teV9DaGFyYWN0ZXJEYXRhSGFuZGxlcih2b2lkICp1c2VyRGF0YSwgY29uc3QgWE1MX0NoYXIgKmRhdGEsIGludCBsZW4pIAorbXlfQ2hhcmFjdGVyRGF0YUhhbmRsZXIodm9pZCAqdXNlckRhdGEsIGNvbnN0IFhNTF9DaGFyICpkYXRhLCBpbnQgbGVuKQogewogICAgIHhtbHBhcnNlb2JqZWN0ICpzZWxmID0gKHhtbHBhcnNlb2JqZWN0ICopIHVzZXJEYXRhOwogICAgIGlmIChzZWxmLT5idWZmZXIgPT0gTlVMTCkKQEAgLTY0MywxMyArNjQzLDEzIEBACiB9CiAKICNkZWZpbmUgVk9JRF9IQU5ETEVSKE5BTUUsIFBBUkFNUywgUEFSQU1fRk9STUFUKSBcCi0JUkNfSEFORExFUih2b2lkLCBOQU1FLCBQQVJBTVMsIDssIFBBUkFNX0ZPUk1BVCwgOywgOyxcCi0JKHhtbHBhcnNlb2JqZWN0ICopdXNlckRhdGEpCisgICAgICAgIFJDX0hBTkRMRVIodm9pZCwgTkFNRSwgUEFSQU1TLCA7LCBQQVJBTV9GT1JNQVQsIDssIDssXAorICAgICAgICAoeG1scGFyc2VvYmplY3QgKil1c2VyRGF0YSkKIAogI2RlZmluZSBJTlRfSEFORExFUihOQU1FLCBQQVJBTVMsIFBBUkFNX0ZPUk1BVClcCi0JUkNfSEFORExFUihpbnQsIE5BTUUsIFBBUkFNUywgaW50IHJjPTA7LCBQQVJBTV9GT1JNQVQsIFwKLQkJCXJjID0gUHlJbnRfQXNMb25nKHJ2KTssIHJjLCBcCi0JKHhtbHBhcnNlb2JqZWN0ICopdXNlckRhdGEpCisgICAgICAgIFJDX0hBTkRMRVIoaW50LCBOQU1FLCBQQVJBTVMsIGludCByYz0wOywgUEFSQU1fRk9STUFULCBcCisgICAgICAgICAgICAgICAgICAgICAgICByYyA9IFB5SW50X0FzTG9uZyhydik7LCByYywgXAorICAgICAgICAoeG1scGFyc2VvYmplY3QgKil1c2VyRGF0YSkKIAogVk9JRF9IQU5ETEVSKEVuZEVsZW1lbnQsCiAgICAgICAgICAgICAgKHZvaWQgKnVzZXJEYXRhLCBjb25zdCBYTUxfQ2hhciAqbmFtZSksCkBAIC04MjIsMjUgKzgyMiwyNSBAQAogI2VuZGlmCiAKIFZPSURfSEFORExFUihOb3RhdGlvbkRlY2wsCi0JCSh2b2lkICp1c2VyRGF0YSwKLQkJCWNvbnN0IFhNTF9DaGFyICpub3RhdGlvbk5hbWUsCi0JCQljb25zdCBYTUxfQ2hhciAqYmFzZSwKLQkJCWNvbnN0IFhNTF9DaGFyICpzeXN0ZW1JZCwKLQkJCWNvbnN0IFhNTF9DaGFyICpwdWJsaWNJZCksCisgICAgICAgICAgICAgICAgKHZvaWQgKnVzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKm5vdGF0aW9uTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKnN5c3RlbUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKnB1YmxpY0lkKSwKICAgICAgICAgICAgICAgICAoIihOTk5OKSIsCi0JCSBzdHJpbmdfaW50ZXJuKHNlbGYsIG5vdGF0aW9uTmFtZSksIHN0cmluZ19pbnRlcm4oc2VsZiwgYmFzZSksCi0JCSBzdHJpbmdfaW50ZXJuKHNlbGYsIHN5c3RlbUlkKSwgc3RyaW5nX2ludGVybihzZWxmLCBwdWJsaWNJZCkpKQorICAgICAgICAgICAgICAgICBzdHJpbmdfaW50ZXJuKHNlbGYsIG5vdGF0aW9uTmFtZSksIHN0cmluZ19pbnRlcm4oc2VsZiwgYmFzZSksCisgICAgICAgICAgICAgICAgIHN0cmluZ19pbnRlcm4oc2VsZiwgc3lzdGVtSWQpLCBzdHJpbmdfaW50ZXJuKHNlbGYsIHB1YmxpY0lkKSkpCiAKIFZPSURfSEFORExFUihTdGFydE5hbWVzcGFjZURlY2wsCi0JCSh2b2lkICp1c2VyRGF0YSwKLQkJICAgICAgY29uc3QgWE1MX0NoYXIgKnByZWZpeCwKLQkJICAgICAgY29uc3QgWE1MX0NoYXIgKnVyaSksCisgICAgICAgICAgICAgICAgKHZvaWQgKnVzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKnVyaSksCiAgICAgICAgICAgICAgICAgKCIoTk4pIiwKICAgICAgICAgICAgICAgICAgc3RyaW5nX2ludGVybihzZWxmLCBwcmVmaXgpLCBzdHJpbmdfaW50ZXJuKHNlbGYsIHVyaSkpKQogCiBWT0lEX0hBTkRMRVIoRW5kTmFtZXNwYWNlRGVjbCwKLQkJKHZvaWQgKnVzZXJEYXRhLAotCQkgICAgY29uc3QgWE1MX0NoYXIgKnByZWZpeCksCisgICAgICAgICAgICAgICAgKHZvaWQgKnVzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqcHJlZml4KSwKICAgICAgICAgICAgICAgICAoIihOKSIsIHN0cmluZ19pbnRlcm4oc2VsZiwgcHJlZml4KSkpCiAKIFZPSURfSEFORExFUihDb21tZW50LApAQCAtODQ5LDUwICs4NDksNTAgQEAKIAogVk9JRF9IQU5ETEVSKFN0YXJ0Q2RhdGFTZWN0aW9uLAogICAgICAgICAgICAgICAgKHZvaWQgKnVzZXJEYXRhKSwKLQkJKCIoKSIpKQorICAgICAgICAgICAgICAgICgiKCkiKSkKIAogVk9JRF9IQU5ETEVSKEVuZENkYXRhU2VjdGlvbiwKICAgICAgICAgICAgICAgICh2b2lkICp1c2VyRGF0YSksCi0JCSgiKCkiKSkKKyAgICAgICAgICAgICAgICAoIigpIikpCiAKICNpZm5kZWYgUHlfVVNJTkdfVU5JQ09ERQogVk9JRF9IQU5ETEVSKERlZmF1bHQsCi0JICAgICAgKHZvaWQgKnVzZXJEYXRhLCBjb25zdCBYTUxfQ2hhciAqcywgaW50IGxlbiksCi0JICAgICAgKCIoTikiLCBjb252X3N0cmluZ19sZW5fdG9fdXRmOChzLGxlbikpKQorICAgICAgICAgICAgICAodm9pZCAqdXNlckRhdGEsIGNvbnN0IFhNTF9DaGFyICpzLCBpbnQgbGVuKSwKKyAgICAgICAgICAgICAgKCIoTikiLCBjb252X3N0cmluZ19sZW5fdG9fdXRmOChzLGxlbikpKQogCiBWT0lEX0hBTkRMRVIoRGVmYXVsdEhhbmRsZXJFeHBhbmQsCi0JICAgICAgKHZvaWQgKnVzZXJEYXRhLCBjb25zdCBYTUxfQ2hhciAqcywgaW50IGxlbiksCi0JICAgICAgKCIoTikiLCBjb252X3N0cmluZ19sZW5fdG9fdXRmOChzLGxlbikpKQorICAgICAgICAgICAgICAodm9pZCAqdXNlckRhdGEsIGNvbnN0IFhNTF9DaGFyICpzLCBpbnQgbGVuKSwKKyAgICAgICAgICAgICAgKCIoTikiLCBjb252X3N0cmluZ19sZW5fdG9fdXRmOChzLGxlbikpKQogI2Vsc2UKIFZPSURfSEFORExFUihEZWZhdWx0LAotCSAgICAgICh2b2lkICp1c2VyRGF0YSwgY29uc3QgWE1MX0NoYXIgKnMsIGludCBsZW4pLAotCSAgICAgICgiKE4pIiwgKHNlbGYtPnJldHVybnNfdW5pY29kZQotCQkgICAgICAgPyBjb252X3N0cmluZ19sZW5fdG9fdW5pY29kZShzLGxlbikKLQkJICAgICAgIDogY29udl9zdHJpbmdfbGVuX3RvX3V0ZjgocyxsZW4pKSkpCisgICAgICAgICAgICAgICh2b2lkICp1c2VyRGF0YSwgY29uc3QgWE1MX0NoYXIgKnMsIGludCBsZW4pLAorICAgICAgICAgICAgICAoIihOKSIsIChzZWxmLT5yZXR1cm5zX3VuaWNvZGUKKyAgICAgICAgICAgICAgICAgICAgICAgPyBjb252X3N0cmluZ19sZW5fdG9fdW5pY29kZShzLGxlbikKKyAgICAgICAgICAgICAgICAgICAgICAgOiBjb252X3N0cmluZ19sZW5fdG9fdXRmOChzLGxlbikpKSkKIAogVk9JRF9IQU5ETEVSKERlZmF1bHRIYW5kbGVyRXhwYW5kLAotCSAgICAgICh2b2lkICp1c2VyRGF0YSwgY29uc3QgWE1MX0NoYXIgKnMsIGludCBsZW4pLAotCSAgICAgICgiKE4pIiwgKHNlbGYtPnJldHVybnNfdW5pY29kZQotCQkgICAgICAgPyBjb252X3N0cmluZ19sZW5fdG9fdW5pY29kZShzLGxlbikKLQkJICAgICAgIDogY29udl9zdHJpbmdfbGVuX3RvX3V0ZjgocyxsZW4pKSkpCisgICAgICAgICAgICAgICh2b2lkICp1c2VyRGF0YSwgY29uc3QgWE1MX0NoYXIgKnMsIGludCBsZW4pLAorICAgICAgICAgICAgICAoIihOKSIsIChzZWxmLT5yZXR1cm5zX3VuaWNvZGUKKyAgICAgICAgICAgICAgICAgICAgICAgPyBjb252X3N0cmluZ19sZW5fdG9fdW5pY29kZShzLGxlbikKKyAgICAgICAgICAgICAgICAgICAgICAgOiBjb252X3N0cmluZ19sZW5fdG9fdXRmOChzLGxlbikpKSkKICNlbmRpZgogCiBJTlRfSEFORExFUihOb3RTdGFuZGFsb25lLAotCQkodm9pZCAqdXNlckRhdGEpLAotCQkoIigpIikpCisgICAgICAgICAgICAgICAgKHZvaWQgKnVzZXJEYXRhKSwKKyAgICAgICAgICAgICAgICAoIigpIikpCiAKIFJDX0hBTkRMRVIoaW50LCBFeHRlcm5hbEVudGl0eVJlZiwKLQkJKFhNTF9QYXJzZXIgcGFyc2VyLAotCQkgICAgY29uc3QgWE1MX0NoYXIgKmNvbnRleHQsCi0JCSAgICBjb25zdCBYTUxfQ2hhciAqYmFzZSwKLQkJICAgIGNvbnN0IFhNTF9DaGFyICpzeXN0ZW1JZCwKLQkJICAgIGNvbnN0IFhNTF9DaGFyICpwdWJsaWNJZCksCi0JCWludCByYz0wOywKKyAgICAgICAgICAgICAgICAoWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKnN5c3RlbUlkLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqcHVibGljSWQpLAorICAgICAgICAgICAgICAgIGludCByYz0wOywKICAgICAgICAgICAgICAgICAoIihPJk5OTikiLAotCQkgU1RSSU5HX0NPTlZfRlVOQyxjb250ZXh0LCBzdHJpbmdfaW50ZXJuKHNlbGYsIGJhc2UpLAotCQkgc3RyaW5nX2ludGVybihzZWxmLCBzeXN0ZW1JZCksIHN0cmluZ19pbnRlcm4oc2VsZiwgcHVibGljSWQpKSwKLQkJcmMgPSBQeUludF9Bc0xvbmcocnYpOywgcmMsCi0JCVhNTF9HZXRVc2VyRGF0YShwYXJzZXIpKQorICAgICAgICAgICAgICAgICBTVFJJTkdfQ09OVl9GVU5DLGNvbnRleHQsIHN0cmluZ19pbnRlcm4oc2VsZiwgYmFzZSksCisgICAgICAgICAgICAgICAgIHN0cmluZ19pbnRlcm4oc2VsZiwgc3lzdGVtSWQpLCBzdHJpbmdfaW50ZXJuKHNlbGYsIHB1YmxpY0lkKSksCisgICAgICAgICAgICAgICAgcmMgPSBQeUludF9Bc0xvbmcocnYpOywgcmMsCisgICAgICAgICAgICAgICAgWE1MX0dldFVzZXJEYXRhKHBhcnNlcikpCiAKIC8qIFhYWCBVbmtub3duRW5jb2RpbmdIYW5kbGVyICovCiAKQEAgLTEwNjMsNyArMTA2Myw3IEBACiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOlNldEJhc2UiLCAmYmFzZSkpCiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIGlmICghWE1MX1NldEJhc2Uoc2VsZi0+aXRzZWxmLCBiYXNlKSkgewotCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKICAgICB9CiAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwogICAgIHJldHVybiBQeV9Ob25lOwpAQCAtMTE1NCw3ICsxMTU0LDcgQEAKICAgICBuZXdfcGFyc2VyLT5pbl9jYWxsYmFjayA9IDA7CiAgICAgbmV3X3BhcnNlci0+bnNfcHJlZml4ZXMgPSBzZWxmLT5uc19wcmVmaXhlczsKICAgICBuZXdfcGFyc2VyLT5pdHNlbGYgPSBYTUxfRXh0ZXJuYWxFbnRpdHlQYXJzZXJDcmVhdGUoc2VsZi0+aXRzZWxmLCBjb250ZXh0LAotCQkJCQkJCWVuY29kaW5nKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcpOwogICAgIG5ld19wYXJzZXItPmhhbmRsZXJzID0gMDsKICAgICBuZXdfcGFyc2VyLT5pbnRlcm4gPSBzZWxmLT5pbnRlcm47CiAgICAgUHlfWElOQ1JFRihuZXdfcGFyc2VyLT5pbnRlcm4pOwpAQCAtMTI0MywyNSArMTI0MywyNSBAQAogI2VuZGlmCiAKIHN0YXRpYyBzdHJ1Y3QgUHlNZXRob2REZWYgeG1scGFyc2VfbWV0aG9kc1tdID0gewotICAgIHsiUGFyc2UiLAkgIChQeUNGdW5jdGlvbil4bWxwYXJzZV9QYXJzZSwKLQkJICBNRVRIX1ZBUkFSR1MsCXhtbHBhcnNlX1BhcnNlX19kb2NfX30sCisgICAgeyJQYXJzZSIsICAgICAoUHlDRnVuY3Rpb24peG1scGFyc2VfUGFyc2UsCisgICAgICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1MsIHhtbHBhcnNlX1BhcnNlX19kb2NfX30sCiAgICAgeyJQYXJzZUZpbGUiLCAoUHlDRnVuY3Rpb24peG1scGFyc2VfUGFyc2VGaWxlLAotCQkgIE1FVEhfTywJeG1scGFyc2VfUGFyc2VGaWxlX19kb2NfX30sCisgICAgICAgICAgICAgICAgICBNRVRIX08sICAgICAgIHhtbHBhcnNlX1BhcnNlRmlsZV9fZG9jX199LAogICAgIHsiU2V0QmFzZSIsICAgKFB5Q0Z1bmN0aW9uKXhtbHBhcnNlX1NldEJhc2UsCi0JCSAgTUVUSF9WQVJBUkdTLCB4bWxwYXJzZV9TZXRCYXNlX19kb2NfX30sCisgICAgICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1MsIHhtbHBhcnNlX1NldEJhc2VfX2RvY19ffSwKICAgICB7IkdldEJhc2UiLCAgIChQeUNGdW5jdGlvbil4bWxwYXJzZV9HZXRCYXNlLAotCQkgIE1FVEhfTk9BUkdTLCB4bWxwYXJzZV9HZXRCYXNlX19kb2NfX30sCisgICAgICAgICAgICAgICAgICBNRVRIX05PQVJHUywgeG1scGFyc2VfR2V0QmFzZV9fZG9jX199LAogICAgIHsiRXh0ZXJuYWxFbnRpdHlQYXJzZXJDcmVhdGUiLCAoUHlDRnVuY3Rpb24peG1scGFyc2VfRXh0ZXJuYWxFbnRpdHlQYXJzZXJDcmVhdGUsCi0JIAkgIE1FVEhfVkFSQVJHUywgeG1scGFyc2VfRXh0ZXJuYWxFbnRpdHlQYXJzZXJDcmVhdGVfX2RvY19ffSwKKyAgICAgICAgICAgICAgICAgIE1FVEhfVkFSQVJHUywgeG1scGFyc2VfRXh0ZXJuYWxFbnRpdHlQYXJzZXJDcmVhdGVfX2RvY19ffSwKICAgICB7IlNldFBhcmFtRW50aXR5UGFyc2luZyIsIChQeUNGdW5jdGlvbil4bWxwYXJzZV9TZXRQYXJhbUVudGl0eVBhcnNpbmcsCi0JCSAgTUVUSF9WQVJBUkdTLCB4bWxwYXJzZV9TZXRQYXJhbUVudGl0eVBhcnNpbmdfX2RvY19ffSwKKyAgICAgICAgICAgICAgICAgIE1FVEhfVkFSQVJHUywgeG1scGFyc2VfU2V0UGFyYW1FbnRpdHlQYXJzaW5nX19kb2NfX30sCiAgICAgeyJHZXRJbnB1dENvbnRleHQiLCAoUHlDRnVuY3Rpb24peG1scGFyc2VfR2V0SW5wdXRDb250ZXh0LAotCQkgIE1FVEhfTk9BUkdTLCB4bWxwYXJzZV9HZXRJbnB1dENvbnRleHRfX2RvY19ffSwKKyAgICAgICAgICAgICAgICAgIE1FVEhfTk9BUkdTLCB4bWxwYXJzZV9HZXRJbnB1dENvbnRleHRfX2RvY19ffSwKICNpZiBYTUxfQ09NQklORURfVkVSU0lPTiA+PSAxOTUwNQogICAgIHsiVXNlRm9yZWlnbkRURCIsIChQeUNGdW5jdGlvbil4bWxwYXJzZV9Vc2VGb3JlaWduRFRELAotCQkgIE1FVEhfVkFSQVJHUywgeG1scGFyc2VfVXNlRm9yZWlnbkRURF9fZG9jX199LAorICAgICAgICAgICAgICAgICAgTUVUSF9WQVJBUkdTLCB4bWxwYXJzZV9Vc2VGb3JlaWduRFREX19kb2NfX30sCiAjZW5kaWYKLSAgICB7TlVMTCwJICBOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7TlVMTCwgICAgICAgIE5VTEx9ICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIC8qIC0tLS0tLS0tLS0gKi8KQEAgLTEyODEsNyArMTI4MSw3IEBACiB7CiAgICAgaW50IGk7CiAgICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7Ci0JdGVtcGxhdGVfYnVmZmVyW2ldID0gaTsKKyAgICAgICAgdGVtcGxhdGVfYnVmZmVyW2ldID0gaTsKICAgICB9CiAgICAgdGVtcGxhdGVfYnVmZmVyWzI1Nl0gPSAwOwogfQpAQCAtMTMwMCwxNSArMTMwMCwxNSBAQAogICAgICAgICBQeVVuaWNvZGVfRGVjb2RlKHRlbXBsYXRlX2J1ZmZlciwgMjU2LCBuYW1lLCAicmVwbGFjZSIpOwogCiAgICAgaWYgKF91X3N0cmluZyA9PSBOVUxMKQotCXJldHVybiByZXN1bHQ7CisgICAgICAgIHJldHVybiByZXN1bHQ7CiAKICAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKLQkvKiBTdHVwaWQgdG8gYWNjZXNzIGRpcmVjdGx5LCBidXQgZmFzdCAqLwotCVB5X1VOSUNPREUgYyA9IF91X3N0cmluZy0+c3RyW2ldOwotCWlmIChjID09IFB5X1VOSUNPREVfUkVQTEFDRU1FTlRfQ0hBUkFDVEVSKQotCSAgICBpbmZvLT5tYXBbaV0gPSAtMTsKLQllbHNlCi0JICAgIGluZm8tPm1hcFtpXSA9IGM7CisgICAgICAgIC8qIFN0dXBpZCB0byBhY2Nlc3MgZGlyZWN0bHksIGJ1dCBmYXN0ICovCisgICAgICAgIFB5X1VOSUNPREUgYyA9IF91X3N0cmluZy0+c3RyW2ldOworICAgICAgICBpZiAoYyA9PSBQeV9VTklDT0RFX1JFUExBQ0VNRU5UX0NIQVJBQ1RFUikKKyAgICAgICAgICAgIGluZm8tPm1hcFtpXSA9IC0xOworICAgICAgICBlbHNlCisgICAgICAgICAgICBpbmZvLT5tYXBbaV0gPSBjOwogICAgIH0KICAgICBpbmZvLT5kYXRhID0gTlVMTDsKICAgICBpbmZvLT5jb252ZXJ0ID0gTlVMTDsKQEAgLTE1MDksMTkgKzE1MDksMTkgQEAKICAgICAgICAgfQogICAgIH0KIAotI2RlZmluZSBBUFBFTkQobGlzdCwgc3RyKQkJCQlcCi0gICAgICAgIGRvIHsJCQkJCQlcCi0gICAgICAgICAgICAgICAgUHlPYmplY3QgKm8gPSBQeVN0cmluZ19Gcm9tU3RyaW5nKHN0cik7CVwKLSAgICAgICAgICAgICAgICBpZiAobyAhPSBOVUxMKQkJCQlcCi0gICAgICAgIAkgICAgICAgIFB5TGlzdF9BcHBlbmQobGlzdCwgbyk7CQlcCi0gICAgICAgICAgICAgICAgUHlfWERFQ1JFRihvKTsJCQkJXAorI2RlZmluZSBBUFBFTkQobGlzdCwgc3RyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBQeU9iamVjdCAqbyA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoc3RyKTsgXAorICAgICAgICAgICAgICAgIGlmIChvICE9IE5VTEwpICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBQeUxpc3RfQXBwZW5kKGxpc3QsIG8pOyAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBQeV9YREVDUkVGKG8pOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICB9IHdoaWxlICgwKQogCiAgICAgaWYgKHN0cmNtcChuYW1lLCAiX19tZW1iZXJzX18iKSA9PSAwKSB7CiAgICAgICAgIGludCBpOwogICAgICAgICBQeU9iamVjdCAqcmMgPSBQeUxpc3RfTmV3KDApOwotCWlmICghcmMpCi0JCXJldHVybiBOVUxMOworICAgICAgICBpZiAoIXJjKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICBmb3IgKGkgPSAwOyBoYW5kbGVyX2luZm9baV0ubmFtZSAhPSBOVUxMOyBpKyspIHsKICAgICAgICAgICAgIFB5T2JqZWN0ICpvID0gZ2V0X2hhbmRsZXJfbmFtZSgmaGFuZGxlcl9pbmZvW2ldKTsKICAgICAgICAgICAgIGlmIChvICE9IE5VTEwpCkBAIC0xNjUzLDQyICsxNjUzLDQyIEBACiAgICAgaWYgKHN0cmNtcChuYW1lLCAiYnVmZmVyX3NpemUiKSA9PSAwKSB7CiAgICAgICBsb25nIG5ld19idWZmZXJfc2l6ZTsKICAgICAgIGlmICghUHlJbnRfQ2hlY2sodikpIHsKLSAgICAgIAlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYnVmZmVyX3NpemUgbXVzdCBiZSBhbiBpbnRlZ2VyIik7Ci0gICAgICAJcmV0dXJuIC0xOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYnVmZmVyX3NpemUgbXVzdCBiZSBhbiBpbnRlZ2VyIik7CisgICAgICAgIHJldHVybiAtMTsKICAgICAgIH0KIAogICAgICAgbmV3X2J1ZmZlcl9zaXplPVB5SW50X0FTX0xPTkcodik7CiAgICAgICAvKiB0cml2aWFsIGNhc2UgLS0gbm8gY2hhbmdlICovCiAgICAgICBpZiAobmV3X2J1ZmZlcl9zaXplID09IHNlbGYtPmJ1ZmZlcl9zaXplKSB7Ci0JcmV0dXJuIDA7CisgICAgICAgIHJldHVybiAwOwogICAgICAgfQogCiAgICAgICBpZiAobmV3X2J1ZmZlcl9zaXplIDw9IDApIHsKLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImJ1ZmZlcl9zaXplIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8iKTsKLQlyZXR1cm4gLTE7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiYnVmZmVyX3NpemUgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVybyIpOworICAgICAgICByZXR1cm4gLTE7CiAgICAgICB9CiAKICAgICAgIC8qIGNoZWNrIG1heGltdW0gKi8KICAgICAgIGlmIChuZXdfYnVmZmVyX3NpemUgPiBJTlRfTUFYKSB7Ci0JY2hhciBlcnJtc2dbMTAwXTsKLQlzcHJpbnRmKGVycm1zZywgImJ1ZmZlcl9zaXplIG11c3Qgbm90IGJlIGdyZWF0ZXIgdGhhbiAlaSIsIElOVF9NQVgpOwotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCBlcnJtc2cpOwotCXJldHVybiAtMTsJCisgICAgICAgIGNoYXIgZXJybXNnWzEwMF07CisgICAgICAgIHNwcmludGYoZXJybXNnLCAiYnVmZmVyX3NpemUgbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuICVpIiwgSU5UX01BWCk7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCBlcnJtc2cpOworICAgICAgICByZXR1cm4gLTE7CiAgICAgICB9CiAKICAgICAgIGlmIChzZWxmLT5idWZmZXIgIT0gTlVMTCkgewotCS8qIHRoZXJlIGlzIGFscmVhZHkgYSBidWZmZXIgKi8KLQlpZiAoc2VsZi0+YnVmZmVyX3VzZWQgIT0gMCkgewotCSAgZmx1c2hfY2hhcmFjdGVyX2J1ZmZlcihzZWxmKTsKLQl9Ci0JLyogZnJlZSBleGlzdGluZyBidWZmZXIgKi8KLQlmcmVlKHNlbGYtPmJ1ZmZlcik7CisgICAgICAgIC8qIHRoZXJlIGlzIGFscmVhZHkgYSBidWZmZXIgKi8KKyAgICAgICAgaWYgKHNlbGYtPmJ1ZmZlcl91c2VkICE9IDApIHsKKyAgICAgICAgICBmbHVzaF9jaGFyYWN0ZXJfYnVmZmVyKHNlbGYpOworICAgICAgICB9CisgICAgICAgIC8qIGZyZWUgZXhpc3RpbmcgYnVmZmVyICovCisgICAgICAgIGZyZWUoc2VsZi0+YnVmZmVyKTsKICAgICAgIH0KICAgICAgIHNlbGYtPmJ1ZmZlciA9IG1hbGxvYyhuZXdfYnVmZmVyX3NpemUpOwogICAgICAgaWYgKHNlbGYtPmJ1ZmZlciA9PSBOVUxMKSB7Ci0JUHlFcnJfTm9NZW1vcnkoKTsKLQlyZXR1cm4gLTE7Ci0gICAgICB9CSAgCisgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KICAgICAgIHNlbGYtPmJ1ZmZlcl9zaXplID0gbmV3X2J1ZmZlcl9zaXplOwogICAgICAgcmV0dXJuIDA7CiAgICAgfQpAQCAtMTczMSwzNyArMTczMSwzNyBAQAogUHlEb2NfU1RSVkFSKFhtbHBhcnNldHlwZV9fZG9jX18sICJYTUwgcGFyc2VyIik7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgWG1scGFyc2V0eXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotCSJweWV4cGF0LnhtbHBhcnNlciIsCQkvKnRwX25hbWUqLwotCXNpemVvZih4bWxwYXJzZW9iamVjdCkgKyBQeUdDX0hFQURfU0laRSwvKnRwX2Jhc2ljc2l6ZSovCi0JMCwJCQkJLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKXhtbHBhcnNlX2RlYWxsb2MsCS8qdHBfZGVhbGxvYyovCi0JKHByaW50ZnVuYykwLAkJLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKXhtbHBhcnNlX2dldGF0dHIsCS8qdHBfZ2V0YXR0ciovCi0JKHNldGF0dHJmdW5jKXhtbHBhcnNlX3NldGF0dHIsCS8qdHBfc2V0YXR0ciovCi0JKGNtcGZ1bmMpMCwJCS8qdHBfY29tcGFyZSovCi0JKHJlcHJmdW5jKTAsCQkvKnRwX3JlcHIqLwotCTAsCQkJLyp0cF9hc19udW1iZXIqLwotCTAsCQkvKnRwX2FzX3NlcXVlbmNlKi8KLQkwLAkJLyp0cF9hc19tYXBwaW5nKi8KLQkoaGFzaGZ1bmMpMCwJCS8qdHBfaGFzaCovCi0JKHRlcm5hcnlmdW5jKTAsCQkvKnRwX2NhbGwqLwotCShyZXByZnVuYykwLAkJLyp0cF9zdHIqLwotCTAsCQkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkvKiB0cF9hc19idWZmZXIgKi8KKyAgICAgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisgICAgICAgICJweWV4cGF0LnhtbHBhcnNlciIsICAgICAgICAgICAgLyp0cF9uYW1lKi8KKyAgICAgICAgc2l6ZW9mKHhtbHBhcnNlb2JqZWN0KSArIFB5R0NfSEVBRF9TSVpFLC8qdHBfYmFzaWNzaXplKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZW1zaXplKi8KKyAgICAgICAgLyogbWV0aG9kcyAqLworICAgICAgICAoZGVzdHJ1Y3Rvcil4bWxwYXJzZV9kZWFsbG9jLCAgIC8qdHBfZGVhbGxvYyovCisgICAgICAgIChwcmludGZ1bmMpMCwgICAgICAgICAgIC8qdHBfcHJpbnQqLworICAgICAgICAoZ2V0YXR0cmZ1bmMpeG1scGFyc2VfZ2V0YXR0ciwgIC8qdHBfZ2V0YXR0ciovCisgICAgICAgIChzZXRhdHRyZnVuYyl4bWxwYXJzZV9zZXRhdHRyLCAgLyp0cF9zZXRhdHRyKi8KKyAgICAgICAgKGNtcGZ1bmMpMCwgICAgICAgICAgICAgLyp0cF9jb21wYXJlKi8KKyAgICAgICAgKHJlcHJmdW5jKTAsICAgICAgICAgICAgLyp0cF9yZXByKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19udW1iZXIqLworICAgICAgICAwLCAgICAgICAgICAgICAgLyp0cF9hc19zZXF1ZW5jZSovCisgICAgICAgIDAsICAgICAgICAgICAgICAvKnRwX2FzX21hcHBpbmcqLworICAgICAgICAoaGFzaGZ1bmMpMCwgICAgICAgICAgICAvKnRwX2hhc2gqLworICAgICAgICAodGVybmFyeWZ1bmMpMCwgICAgICAgICAvKnRwX2NhbGwqLworICAgICAgICAocmVwcmZ1bmMpMCwgICAgICAgICAgICAvKnRwX3N0ciovCisgICAgICAgIDAsICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgICAgICAwLCAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLwogI2lmZGVmIFB5X1RQRkxBR1NfSEFWRV9HQwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQywgLyp0cF9mbGFncyovCisgICAgICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQywgLyp0cF9mbGFncyovCiAjZWxzZQotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfR0MsIC8qdHBfZmxhZ3MqLworICAgICAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0dDLCAvKnRwX2ZsYWdzKi8KICNlbmRpZgotCVhtbHBhcnNldHlwZV9fZG9jX18sIC8qIHRwX2RvYyAtIERvY3VtZW50YXRpb24gc3RyaW5nICovCisgICAgICAgIFhtbHBhcnNldHlwZV9fZG9jX18sIC8qIHRwX2RvYyAtIERvY3VtZW50YXRpb24gc3RyaW5nICovCiAjaWZkZWYgV0lUSF9DWUNMRV9HQwotCSh0cmF2ZXJzZXByb2MpeG1scGFyc2VfdHJhdmVyc2UsCS8qIHRwX3RyYXZlcnNlICovCi0JKGlucXVpcnkpeG1scGFyc2VfY2xlYXIJCS8qIHRwX2NsZWFyICovCisgICAgICAgICh0cmF2ZXJzZXByb2MpeG1scGFyc2VfdHJhdmVyc2UsICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgICAgICAoaW5xdWlyeSl4bWxwYXJzZV9jbGVhciAgICAgICAgIC8qIHRwX2NsZWFyICovCiAjZWxzZQotCTAsIDAKKyAgICAgICAgMCwgMAogI2VuZGlmCiB9OwogCkBAIC0xNzk2LDIxICsxNzk2LDIxIEBACiAgICAgLyogRXhwbGljaXRseSBwYXNzaW5nIE5vbmUgbWVhbnMgbm8gaW50ZXJuaW5nIGlzIGRlc2lyZWQuCiAgICAgICAgTm90IHBhc3NpbmcgYW55dGhpbmcgbWVhbnMgdGhhdCBhIG5ldyBkaWN0aW9uYXJ5IGlzIHVzZWQuICovCiAgICAgaWYgKGludGVybiA9PSBQeV9Ob25lKQotCWludGVybiA9IE5VTEw7CisgICAgICAgIGludGVybiA9IE5VTEw7CiAgICAgZWxzZSBpZiAoaW50ZXJuID09IE5VTEwpIHsKLQlpbnRlcm4gPSBQeURpY3RfTmV3KCk7Ci0JaWYgKCFpbnRlcm4pCi0JICAgIHJldHVybiBOVUxMOwotCWludGVybl9kZWNyZWYgPSAxOworICAgICAgICBpbnRlcm4gPSBQeURpY3RfTmV3KCk7CisgICAgICAgIGlmICghaW50ZXJuKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGludGVybl9kZWNyZWYgPSAxOwogICAgIH0KICAgICBlbHNlIGlmICghUHlEaWN0X0NoZWNrKGludGVybikpIHsKLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiaW50ZXJuIG11c3QgYmUgYSBkaWN0aW9uYXJ5Iik7Ci0JcmV0dXJuIE5VTEw7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJpbnRlcm4gbXVzdCBiZSBhIGRpY3Rpb25hcnkiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCiAgICAgcmVzdWx0ID0gbmV3eG1scGFyc2VvYmplY3QoZW5jb2RpbmcsIG5hbWVzcGFjZV9zZXBhcmF0b3IsIGludGVybik7CiAgICAgaWYgKGludGVybl9kZWNyZWYpIHsKLQlQeV9ERUNSRUYoaW50ZXJuKTsKKyAgICAgICAgUHlfREVDUkVGKGludGVybik7CiAgICAgfQogICAgIHJldHVybiByZXN1bHQ7CiB9CkBAIC0xODMyLDEyICsxODMyLDEyIEBACiAvKiBMaXN0IG9mIG1ldGhvZHMgZGVmaW5lZCBpbiB0aGUgbW9kdWxlICovCiAKIHN0YXRpYyBzdHJ1Y3QgUHlNZXRob2REZWYgcHlleHBhdF9tZXRob2RzW10gPSB7Ci0gICAgeyJQYXJzZXJDcmVhdGUiLAkoUHlDRnVuY3Rpb24pcHlleHBhdF9QYXJzZXJDcmVhdGUsCisgICAgeyJQYXJzZXJDcmVhdGUiLCAgICAoUHlDRnVuY3Rpb24pcHlleHBhdF9QYXJzZXJDcmVhdGUsCiAgICAgIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLCBweWV4cGF0X1BhcnNlckNyZWF0ZV9fZG9jX199LAotICAgIHsiRXJyb3JTdHJpbmciLAkoUHlDRnVuY3Rpb24pcHlleHBhdF9FcnJvclN0cmluZywKLSAgICAgTUVUSF9WQVJBUkdTLAlweWV4cGF0X0Vycm9yU3RyaW5nX19kb2NfX30sCisgICAgeyJFcnJvclN0cmluZyIsICAgICAoUHlDRnVuY3Rpb24pcHlleHBhdF9FcnJvclN0cmluZywKKyAgICAgTUVUSF9WQVJBUkdTLCAgICAgIHB5ZXhwYXRfRXJyb3JTdHJpbmdfX2RvY19ffSwKIAotICAgIHtOVUxMLAkgKFB5Q0Z1bmN0aW9uKU5VTEwsIDAsIE5VTEx9CQkvKiBzZW50aW5lbCAqLworICAgIHtOVUxMLCAgICAgICAoUHlDRnVuY3Rpb24pTlVMTCwgMCwgTlVMTH0gICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogLyogTW9kdWxlIGRvY3N0cmluZyAqLwpAQCAtMTkwOSw3ICsxOTA5LDcgQEAKICAgICBtID0gUHlfSW5pdE1vZHVsZTMoTU9EVUxFX05BTUUsIHB5ZXhwYXRfbWV0aG9kcywKICAgICAgICAgICAgICAgICAgICAgICAgcHlleHBhdF9tb2R1bGVfZG9jdW1lbnRhdGlvbik7CiAgICAgaWYgKG0gPT0gTlVMTCkKLQlyZXR1cm47CisgICAgICAgIHJldHVybjsKIAogICAgIC8qIEFkZCBzb21lIHN5bWJvbGljIGNvbnN0YW50cyB0byB0aGUgbW9kdWxlICovCiAgICAgaWYgKEVycm9yT2JqZWN0ID09IE5VTEwpIHsKQEAgLTE5NjgsNyArMTk2OCw3IEBACiAgICAgaWYgKGVycm9yc19tb2R1bGUgPT0gTlVMTCB8fCBtb2RlbF9tb2R1bGUgPT0gTlVMTCkKICAgICAgICAgLyogRG9uJ3QgY29yZSBkdW1wIGxhdGVyISAqLwogICAgICAgICByZXR1cm47Ci0gICAgCisKICNpZiBYTUxfQ09NQklORURfVkVSU0lPTiA+IDE5NTA1CiAgICAgewogICAgICAgICBjb25zdCBYTUxfRmVhdHVyZSAqZmVhdHVyZXMgPSBYTUxfR2V0RmVhdHVyZUxpc3QoKTsKQEAgLTIwOTMsNyArMjA5Myw3IEBACiAgICAgY2FwaS5TZXRQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25IYW5kbGVyID0gWE1MX1NldFByb2Nlc3NpbmdJbnN0cnVjdGlvbkhhbmRsZXI7CiAgICAgY2FwaS5TZXRVbmtub3duRW5jb2RpbmdIYW5kbGVyID0gWE1MX1NldFVua25vd25FbmNvZGluZ0hhbmRsZXI7CiAgICAgY2FwaS5TZXRVc2VyRGF0YSA9IFhNTF9TZXRVc2VyRGF0YTsKLSAgICAKKwogICAgIC8qIGV4cG9ydCBhcyBjb2JqZWN0ICovCiAgICAgY2FwaV9vYmplY3QgPSBQeUNPYmplY3RfRnJvbVZvaWRQdHIoJmNhcGksIE5VTEwpOwogICAgIGlmIChjYXBpX29iamVjdCkKQEAgLTIxMDgsMTIgKzIxMDgsMTIgQEAKIAogICAgIGZvciAoOyBoYW5kbGVyX2luZm9baV0ubmFtZSAhPSBOVUxMOyBpKyspIHsKICAgICAgICAgaWYgKGluaXRpYWwpCi0JICAgIHNlbGYtPmhhbmRsZXJzW2ldID0gTlVMTDsKLQllbHNlIHsKKyAgICAgICAgICAgIHNlbGYtPmhhbmRsZXJzW2ldID0gTlVMTDsKKyAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICB0ZW1wID0gc2VsZi0+aGFuZGxlcnNbaV07CiAgICAgICAgICAgICBzZWxmLT5oYW5kbGVyc1tpXSA9IE5VTEw7CiAgICAgICAgICAgICBQeV9YREVDUkVGKHRlbXApOwotCSAgICBoYW5kbGVyX2luZm9baV0uc2V0dGVyKHNlbGYtPml0c2VsZiwgTlVMTCk7CisgICAgICAgICAgICBoYW5kbGVyX2luZm9baV0uc2V0dGVyKHNlbGYtPml0c2VsZiwgTlVMTCk7CiAgICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3JlYWRsaW5lLmMgYi9Nb2R1bGVzL3JlYWRsaW5lLmMKaW5kZXggNzEyYjg1Ny4uMDM4YjRkNiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9yZWFkbGluZS5jCisrKyBiL01vZHVsZXMvcmVhZGxpbmUuYwpAQCAtMjMsNyArMjMsNyBAQAogI2lmZGVmIFNBVkVfTE9DQUxFCiAjICBkZWZpbmUgUkVTVE9SRV9MT0NBTEUoc2wpIHsgc2V0bG9jYWxlKExDX0NUWVBFLCBzbCk7IGZyZWUoc2wpOyB9CiAjZWxzZQotIyAgZGVmaW5lIFJFU1RPUkVfTE9DQUxFKHNsKSAKKyMgIGRlZmluZSBSRVNUT1JFX0xPQ0FMRShzbCkKICNlbmRpZgogCiAvKiBHTlUgcmVhZGxpbmUgZGVmaW5pdGlvbnMgKi8KQEAgLTMzLDcgKzMzLDcgQEAKIAogI2lmZGVmIEhBVkVfUkxfQ09NUExFVElPTl9NQVRDSEVTCiAjZGVmaW5lIGNvbXBsZXRpb25fbWF0Y2hlcyh4LCB5KSBcCi0JcmxfY29tcGxldGlvbl9tYXRjaGVzKCh4KSwgKChybF9jb21wZW50cnlfZnVuY190ICopKHkpKSkKKyAgICBybF9jb21wbGV0aW9uX21hdGNoZXMoKHgpLCAoKHJsX2NvbXBlbnRyeV9mdW5jX3QgKikoeSkpKQogI2Vsc2UKICNpZiBkZWZpbmVkKF9STF9GVU5DVElPTl9UWVBFREVGKQogZXh0ZXJuIGNoYXIgKipjb21wbGV0aW9uX21hdGNoZXMoY2hhciAqLCBybF9jb21wZW50cnlfZnVuY190ICopOwpAQCAtNDcsMTMgKzQ3LDEzIEBACiAjaWZkZWYgX19BUFBMRV9fCiAvKgogICogSXQgaXMgcG9zc2libGUgdG8gbGluayB0aGUgcmVhZGxpbmUgbW9kdWxlIHRvIHRoZSByZWFkbGluZQotICogZW11bGF0aW9uIGxpYnJhcnkgb2YgZWRpdGxpbmUvbGliZWRpdC4gCi0gKiAKKyAqIGVtdWxhdGlvbiBsaWJyYXJ5IG9mIGVkaXRsaW5lL2xpYmVkaXQuCisgKgogICogT24gT1NYIHRoaXMgZW11bGF0aW9uIGxpYnJhcnkgaXMgbm90IDEwMCUgQVBJIGNvbXBhdGlibGUKICAqIHdpdGggdGhlICJyZWFsIiByZWFkbGluZSBhbmQgY2Fubm90IGJlIGRldGVjdGVkIGF0IGNvbXBpbGUtdGltZSwKICAqIGhlbmNlIHdlIHVzZSBhIHJ1bnRpbWUgY2hlY2sgdG8gZGV0ZWN0IGlmIHdlJ3JlIHVzaW5nIGxpYmVkaXQKICAqCi0gKiBDdXJyZW50bHkgdGhlcmUgaXMgb25lIGtub3cgQVBJIGluY29tcGF0aWJpbGl0eTogCisgKiBDdXJyZW50bHkgdGhlcmUgaXMgb25lIGtub3cgQVBJIGluY29tcGF0aWJpbGl0eToKICAqIC0gJ2dldF9oaXN0b3J5JyBoYXMgYSAxLWJhc2VkIGluZGV4IHdpdGggR05VIHJlYWRsaW5lLCBhbmQgYSAwLWJhc2VkCiAgKiAgIGluZGV4IHdpdGggbGliZWRpdCdzIGVtdWxhdGlvbi4KICAqIC0gTm90ZSB0aGF0IHJlcGxhY2VfaGlzdG9yeSBhbmQgcmVtb3ZlX2hpc3RvcnkgdXNlIGEgMC1iYXNlZCBpbmRleApAQCAtNjUsNyArNjUsNyBAQAogCiBzdGF0aWMgdm9pZAogb25fY29tcGxldGlvbl9kaXNwbGF5X21hdGNoZXNfaG9vayhjaGFyICoqbWF0Y2hlcywKLQkJCQkgICBpbnQgbnVtX21hdGNoZXMsIGludCBtYXhfbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9tYXRjaGVzLCBpbnQgbWF4X2xlbmd0aCk7CiAKIAogLyogRXhwb3J0ZWQgZnVuY3Rpb24gdG8gc2VuZCBvbmUgbGluZSB0byByZWFkbGluZSdzIGluaXQgZmlsZSBwYXJzZXIgKi8KQEAgLTczLDE4ICs3MywxOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHBhcnNlX2FuZF9iaW5kKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpzLCAqY29weTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6cGFyc2VfYW5kX2JpbmQiLCAmcykpCi0JCXJldHVybiBOVUxMOwotCS8qIE1ha2UgYSBjb3B5IC0tIHJsX3BhcnNlX2FuZF9iaW5kKCkgbW9kaWZpZXMgaXRzIGFyZ3VtZW50ICovCi0JLyogQmVybmFyZCBIZXJ6b2cgKi8KLQljb3B5ID0gbWFsbG9jKDEgKyBzdHJsZW4ocykpOwotCWlmIChjb3B5ID09IE5VTEwpCi0JCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCXN0cmNweShjb3B5LCBzKTsKLQlybF9wYXJzZV9hbmRfYmluZChjb3B5KTsKLQlmcmVlKGNvcHkpOyAvKiBGcmVlIHRoZSBjb3B5ICovCi0JUHlfUkVUVVJOX05PTkU7CisgICAgY2hhciAqcywgKmNvcHk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOnBhcnNlX2FuZF9iaW5kIiwgJnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAvKiBNYWtlIGEgY29weSAtLSBybF9wYXJzZV9hbmRfYmluZCgpIG1vZGlmaWVzIGl0cyBhcmd1bWVudCAqLworICAgIC8qIEJlcm5hcmQgSGVyem9nICovCisgICAgY29weSA9IG1hbGxvYygxICsgc3RybGVuKHMpKTsKKyAgICBpZiAoY29weSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICBzdHJjcHkoY29weSwgcyk7CisgICAgcmxfcGFyc2VfYW5kX2JpbmQoY29weSk7CisgICAgZnJlZShjb3B5KTsgLyogRnJlZSB0aGUgY29weSAqLworICAgIFB5X1JFVFVSTl9OT05FOwogfQogCiBQeURvY19TVFJWQVIoZG9jX3BhcnNlX2FuZF9iaW5kLApAQCAtOTcsMTMgKzk3LDEzIEBACiBzdGF0aWMgUHlPYmplY3QgKgogcmVhZF9pbml0X2ZpbGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKnMgPSBOVUxMOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifHo6cmVhZF9pbml0X2ZpbGUiLCAmcykpCi0JCXJldHVybiBOVUxMOwotCWVycm5vID0gcmxfcmVhZF9pbml0X2ZpbGUocyk7Ci0JaWYgKGVycm5vKQotCQlyZXR1cm4gUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOwotCVB5X1JFVFVSTl9OT05FOworICAgIGNoYXIgKnMgPSBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifHo6cmVhZF9pbml0X2ZpbGUiLCAmcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGVycm5vID0gcmxfcmVhZF9pbml0X2ZpbGUocyk7CisgICAgaWYgKGVycm5vKQorICAgICAgICByZXR1cm4gUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOworICAgIFB5X1JFVFVSTl9OT05FOwogfQogCiBQeURvY19TVFJWQVIoZG9jX3JlYWRfaW5pdF9maWxlLApAQCAtMTE3LDEzICsxMTcsMTMgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiByZWFkX2hpc3RvcnlfZmlsZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqcyA9IE5VTEw7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8ejpyZWFkX2hpc3RvcnlfZmlsZSIsICZzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZXJybm8gPSByZWFkX2hpc3Rvcnkocyk7Ci0JaWYgKGVycm5vKQotCQlyZXR1cm4gUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOwotCVB5X1JFVFVSTl9OT05FOworICAgIGNoYXIgKnMgPSBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifHo6cmVhZF9oaXN0b3J5X2ZpbGUiLCAmcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGVycm5vID0gcmVhZF9oaXN0b3J5KHMpOworICAgIGlmIChlcnJubykKKyAgICAgICAgcmV0dXJuIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKKyAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAogc3RhdGljIGludCBfaGlzdG9yeV9sZW5ndGggPSAtMTsgLyogZG8gbm90IHRydW5jYXRlIGhpc3RvcnkgYnkgZGVmYXVsdCAqLwpAQCAtMTM4LDE1ICsxMzgsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiB3cml0ZV9oaXN0b3J5X2ZpbGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKnMgPSBOVUxMOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifHo6d3JpdGVfaGlzdG9yeV9maWxlIiwgJnMpKQotCQlyZXR1cm4gTlVMTDsKLQllcnJubyA9IHdyaXRlX2hpc3Rvcnkocyk7Ci0JaWYgKCFlcnJubyAmJiBfaGlzdG9yeV9sZW5ndGggPj0gMCkKLQkJaGlzdG9yeV90cnVuY2F0ZV9maWxlKHMsIF9oaXN0b3J5X2xlbmd0aCk7Ci0JaWYgKGVycm5vKQotCQlyZXR1cm4gUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOwotCVB5X1JFVFVSTl9OT05FOworICAgIGNoYXIgKnMgPSBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifHo6d3JpdGVfaGlzdG9yeV9maWxlIiwgJnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBlcnJubyA9IHdyaXRlX2hpc3Rvcnkocyk7CisgICAgaWYgKCFlcnJubyAmJiBfaGlzdG9yeV9sZW5ndGggPj0gMCkKKyAgICAgICAgaGlzdG9yeV90cnVuY2F0ZV9maWxlKHMsIF9oaXN0b3J5X2xlbmd0aCk7CisgICAgaWYgKGVycm5vKQorICAgICAgICByZXR1cm4gUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOworICAgIFB5X1JFVFVSTl9OT05FOwogfQogCiBQeURvY19TVFJWQVIoZG9jX3dyaXRlX2hpc3RvcnlfZmlsZSwKQEAgLTE2MCwxMSArMTYwLDExIEBACiBzdGF0aWMgUHlPYmplY3QqCiBzZXRfaGlzdG9yeV9sZW5ndGgoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBsZW5ndGggPSBfaGlzdG9yeV9sZW5ndGg7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOnNldF9oaXN0b3J5X2xlbmd0aCIsICZsZW5ndGgpKQotCQlyZXR1cm4gTlVMTDsKLQlfaGlzdG9yeV9sZW5ndGggPSBsZW5ndGg7Ci0JUHlfUkVUVVJOX05PTkU7CisgICAgaW50IGxlbmd0aCA9IF9oaXN0b3J5X2xlbmd0aDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6c2V0X2hpc3RvcnlfbGVuZ3RoIiwgJmxlbmd0aCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9oaXN0b3J5X2xlbmd0aCA9IGxlbmd0aDsKKyAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAogUHlEb2NfU1RSVkFSKHNldF9oaXN0b3J5X2xlbmd0aF9kb2MsCkBAIC0xNzksNyArMTc5LDcgQEAKIHN0YXRpYyBQeU9iamVjdCoKIGdldF9oaXN0b3J5X2xlbmd0aChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm5vYXJnKQogewotCXJldHVybiBQeUludF9Gcm9tTG9uZyhfaGlzdG9yeV9sZW5ndGgpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhfaGlzdG9yeV9sZW5ndGgpOwogfQogCiBQeURvY19TVFJWQVIoZ2V0X2hpc3RvcnlfbGVuZ3RoX2RvYywKQEAgLTE5MywyOSArMTkzLDI5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc2V0X2hvb2soY29uc3QgY2hhciAqZnVuY25hbWUsIFB5T2JqZWN0ICoqaG9va192YXIsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICpmdW5jdGlvbiA9IFB5X05vbmU7Ci0JY2hhciBidWZbODBdOwotCVB5T1Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgInxPOnNldF8lLjUwcyIsIGZ1bmNuYW1lKTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgYnVmLCAmZnVuY3Rpb24pKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoZnVuY3Rpb24gPT0gUHlfTm9uZSkgewotCQlQeV9YREVDUkVGKCpob29rX3Zhcik7Ci0JCSpob29rX3ZhciA9IE5VTEw7Ci0JfQotCWVsc2UgaWYgKFB5Q2FsbGFibGVfQ2hlY2soZnVuY3Rpb24pKSB7Ci0JCVB5T2JqZWN0ICp0bXAgPSAqaG9va192YXI7Ci0JCVB5X0lOQ1JFRihmdW5jdGlvbik7Ci0JCSpob29rX3ZhciA9IGZ1bmN0aW9uOwotCQlQeV9YREVDUkVGKHRtcCk7Ci0JfQotCWVsc2UgewotCQlQeU9TX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksCi0JCQkgICAgICAic2V0XyUuNTBzKGZ1bmMpOiBhcmd1bWVudCBub3QgY2FsbGFibGUiLAotCQkJICAgICAgZnVuY25hbWUpOwotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCBidWYpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JUHlfUkVUVVJOX05PTkU7CisgICAgUHlPYmplY3QgKmZ1bmN0aW9uID0gUHlfTm9uZTsKKyAgICBjaGFyIGJ1Zls4MF07CisgICAgUHlPU19zbnByaW50ZihidWYsIHNpemVvZihidWYpLCAifE86c2V0XyUuNTBzIiwgZnVuY25hbWUpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCBidWYsICZmdW5jdGlvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChmdW5jdGlvbiA9PSBQeV9Ob25lKSB7CisgICAgICAgIFB5X1hERUNSRUYoKmhvb2tfdmFyKTsKKyAgICAgICAgKmhvb2tfdmFyID0gTlVMTDsKKyAgICB9CisgICAgZWxzZSBpZiAoUHlDYWxsYWJsZV9DaGVjayhmdW5jdGlvbikpIHsKKyAgICAgICAgUHlPYmplY3QgKnRtcCA9ICpob29rX3ZhcjsKKyAgICAgICAgUHlfSU5DUkVGKGZ1bmN0aW9uKTsKKyAgICAgICAgKmhvb2tfdmFyID0gZnVuY3Rpb247CisgICAgICAgIFB5X1hERUNSRUYodG1wKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5T1Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwKKyAgICAgICAgICAgICAgICAgICAgICAic2V0XyUuNTBzKGZ1bmMpOiBhcmd1bWVudCBub3QgY2FsbGFibGUiLAorICAgICAgICAgICAgICAgICAgICAgIGZ1bmNuYW1lKTsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgYnVmKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5X1JFVFVSTl9OT05FOwogfQogCiAKQEAgLTIzMSwyMCArMjMxLDIwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogc2V0X2NvbXBsZXRpb25fZGlzcGxheV9tYXRjaGVzX2hvb2soUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICpyZXN1bHQgPSBzZXRfaG9vaygiY29tcGxldGlvbl9kaXNwbGF5X21hdGNoZXNfaG9vayIsCi0JCQkmY29tcGxldGlvbl9kaXNwbGF5X21hdGNoZXNfaG9vaywgYXJncyk7CisgICAgUHlPYmplY3QgKnJlc3VsdCA9IHNldF9ob29rKCJjb21wbGV0aW9uX2Rpc3BsYXlfbWF0Y2hlc19ob29rIiwKKyAgICAgICAgICAgICAgICAgICAgJmNvbXBsZXRpb25fZGlzcGxheV9tYXRjaGVzX2hvb2ssIGFyZ3MpOwogI2lmZGVmIEhBVkVfUkxfQ09NUExFVElPTl9ESVNQTEFZX01BVENIRVNfSE9PSwotCS8qIFdlIGNhbm5vdCBzZXQgdGhpcyBob29rIGdsb2JhbGx5LCBzaW5jZSBpdCByZXBsYWNlcyB0aGUKLQkgICBkZWZhdWx0IGNvbXBsZXRpb24gZGlzcGxheS4gKi8KLQlybF9jb21wbGV0aW9uX2Rpc3BsYXlfbWF0Y2hlc19ob29rID0KLQkJY29tcGxldGlvbl9kaXNwbGF5X21hdGNoZXNfaG9vayA/CisgICAgLyogV2UgY2Fubm90IHNldCB0aGlzIGhvb2sgZ2xvYmFsbHksIHNpbmNlIGl0IHJlcGxhY2VzIHRoZQorICAgICAgIGRlZmF1bHQgY29tcGxldGlvbiBkaXNwbGF5LiAqLworICAgIHJsX2NvbXBsZXRpb25fZGlzcGxheV9tYXRjaGVzX2hvb2sgPQorICAgICAgICBjb21wbGV0aW9uX2Rpc3BsYXlfbWF0Y2hlc19ob29rID8KICNpZiBkZWZpbmVkKF9STF9GVU5DVElPTl9UWVBFREVGKQotCQkocmxfY29tcGRpc3BfZnVuY190ICopb25fY29tcGxldGlvbl9kaXNwbGF5X21hdGNoZXNfaG9vayA6IDA7CisgICAgICAgIChybF9jb21wZGlzcF9mdW5jX3QgKilvbl9jb21wbGV0aW9uX2Rpc3BsYXlfbWF0Y2hlc19ob29rIDogMDsKICNlbHNlCi0JCShWRnVuY3Rpb24gKilvbl9jb21wbGV0aW9uX2Rpc3BsYXlfbWF0Y2hlc19ob29rIDogMDsKKyAgICAgICAgKFZGdW5jdGlvbiAqKW9uX2NvbXBsZXRpb25fZGlzcGxheV9tYXRjaGVzX2hvb2sgOiAwOwogI2VuZGlmCiAjZW5kaWYKLQlyZXR1cm4gcmVzdWx0OworICAgIHJldHVybiByZXN1bHQ7CiAKIH0KIApAQCAtMjU4LDcgKzI1OCw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc2V0X3N0YXJ0dXBfaG9vayhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIHNldF9ob29rKCJzdGFydHVwX2hvb2siLCAmc3RhcnR1cF9ob29rLCBhcmdzKTsKKyAgICByZXR1cm4gc2V0X2hvb2soInN0YXJ0dXBfaG9vayIsICZzdGFydHVwX2hvb2ssIGFyZ3MpOwogfQogCiBQeURvY19TVFJWQVIoZG9jX3NldF9zdGFydHVwX2hvb2ssCkBAIC0yNzUsNyArMjc1LDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZXRfcHJlX2lucHV0X2hvb2soUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBzZXRfaG9vaygicHJlX2lucHV0X2hvb2siLCAmcHJlX2lucHV0X2hvb2ssIGFyZ3MpOworICAgIHJldHVybiBzZXRfaG9vaygicHJlX2lucHV0X2hvb2siLCAmcHJlX2lucHV0X2hvb2ssIGFyZ3MpOwogfQogCiBQeURvY19TVFJWQVIoZG9jX3NldF9wcmVfaW5wdXRfaG9vaywKQEAgLTMxMyw4ICszMTMsOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdldF9iZWdpZHgoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpub2FyZykKIHsKLQlQeV9JTkNSRUYoYmVnaWR4KTsKLQlyZXR1cm4gYmVnaWR4OworICAgIFB5X0lOQ1JFRihiZWdpZHgpOworICAgIHJldHVybiBiZWdpZHg7CiB9CiAKIFB5RG9jX1NUUlZBUihkb2NfZ2V0X2JlZ2lkeCwKQEAgLTMyNyw4ICszMjcsOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdldF9lbmRpZHgoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpub2FyZykKIHsKLQlQeV9JTkNSRUYoZW5kaWR4KTsKLQlyZXR1cm4gZW5kaWR4OworICAgIFB5X0lOQ1JFRihlbmRpZHgpOworICAgIHJldHVybiBlbmRpZHg7CiB9CiAKIFB5RG9jX1NUUlZBUihkb2NfZ2V0X2VuZGlkeCwKQEAgLTM0MSwxNCArMzQxLDE0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc2V0X2NvbXBsZXRlcl9kZWxpbXMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKmJyZWFrX2NoYXJzOworICAgIGNoYXIgKmJyZWFrX2NoYXJzOwogCi0JaWYoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6c2V0X2NvbXBsZXRlcl9kZWxpbXMiLCAmYnJlYWtfY2hhcnMpKSB7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlmcmVlKCh2b2lkKilybF9jb21wbGV0ZXJfd29yZF9icmVha19jaGFyYWN0ZXJzKTsKLQlybF9jb21wbGV0ZXJfd29yZF9icmVha19jaGFyYWN0ZXJzID0gc3RyZHVwKGJyZWFrX2NoYXJzKTsKLQlQeV9SRVRVUk5fTk9ORTsKKyAgICBpZighUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczpzZXRfY29tcGxldGVyX2RlbGltcyIsICZicmVha19jaGFycykpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGZyZWUoKHZvaWQqKXJsX2NvbXBsZXRlcl93b3JkX2JyZWFrX2NoYXJhY3RlcnMpOworICAgIHJsX2NvbXBsZXRlcl93b3JkX2JyZWFrX2NoYXJhY3RlcnMgPSBzdHJkdXAoYnJlYWtfY2hhcnMpOworICAgIFB5X1JFVFVSTl9OT05FOwogfQogCiBQeURvY19TVFJWQVIoZG9jX3NldF9jb21wbGV0ZXJfZGVsaW1zLApAQCAtMzU4LDMxICszNTgsMzEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBweV9yZW1vdmVfaGlzdG9yeShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IGVudHJ5X251bWJlcjsKLQlISVNUX0VOVFJZICplbnRyeTsKKyAgICBpbnQgZW50cnlfbnVtYmVyOworICAgIEhJU1RfRU5UUlkgKmVudHJ5OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOnJlbW92ZV9oaXN0b3J5IiwgJmVudHJ5X251bWJlcikpCi0JCXJldHVybiBOVUxMOwotCWlmIChlbnRyeV9udW1iZXIgPCAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJIaXN0b3J5IGluZGV4IGNhbm5vdCBiZSBuZWdhdGl2ZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZW50cnkgPSByZW1vdmVfaGlzdG9yeShlbnRyeV9udW1iZXIpOwotCWlmICghZW50cnkpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkgICAgICJObyBoaXN0b3J5IGl0ZW0gYXQgcG9zaXRpb24gJWQiLAotCQkJICAgICAgZW50cnlfbnVtYmVyKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCS8qIGZyZWUgbWVtb3J5IGFsbG9jYXRlZCBmb3IgdGhlIGhpc3RvcnkgZW50cnkgKi8KLQlpZiAoZW50cnktPmxpbmUpCi0JCWZyZWUoZW50cnktPmxpbmUpOwotCWlmIChlbnRyeS0+ZGF0YSkKLQkJZnJlZShlbnRyeS0+ZGF0YSk7Ci0JZnJlZShlbnRyeSk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOnJlbW92ZV9oaXN0b3J5IiwgJmVudHJ5X251bWJlcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChlbnRyeV9udW1iZXIgPCAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIkhpc3RvcnkgaW5kZXggY2Fubm90IGJlIG5lZ2F0aXZlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBlbnRyeSA9IHJlbW92ZV9oaXN0b3J5KGVudHJ5X251bWJlcik7CisgICAgaWYgKCFlbnRyeSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJObyBoaXN0b3J5IGl0ZW0gYXQgcG9zaXRpb24gJWQiLAorICAgICAgICAgICAgICAgICAgICAgIGVudHJ5X251bWJlcik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICAvKiBmcmVlIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIHRoZSBoaXN0b3J5IGVudHJ5ICovCisgICAgaWYgKGVudHJ5LT5saW5lKQorICAgICAgICBmcmVlKGVudHJ5LT5saW5lKTsKKyAgICBpZiAoZW50cnktPmRhdGEpCisgICAgICAgIGZyZWUoZW50cnktPmRhdGEpOworICAgIGZyZWUoZW50cnkpOwogCi0JUHlfUkVUVVJOX05PTkU7CisgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKIFB5RG9jX1NUUlZBUihkb2NfcmVtb3ZlX2hpc3RvcnksCkBAIC0zOTIsMzQgKzM5MiwzNCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHB5X3JlcGxhY2VfaGlzdG9yeShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IGVudHJ5X251bWJlcjsKLQljaGFyICpsaW5lOwotCUhJU1RfRU5UUlkgKm9sZF9lbnRyeTsKKyAgICBpbnQgZW50cnlfbnVtYmVyOworICAgIGNoYXIgKmxpbmU7CisgICAgSElTVF9FTlRSWSAqb2xkX2VudHJ5OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpczpyZXBsYWNlX2hpc3RvcnkiLCAmZW50cnlfbnVtYmVyLAotCSAgICAgIAkJICAgICAgJmxpbmUpKSB7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoZW50cnlfbnVtYmVyIDwgMCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkiSGlzdG9yeSBpbmRleCBjYW5ub3QgYmUgbmVnYXRpdmUiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCW9sZF9lbnRyeSA9IHJlcGxhY2VfaGlzdG9yeV9lbnRyeShlbnRyeV9udW1iZXIsIGxpbmUsICh2b2lkICopTlVMTCk7Ci0JaWYgKCFvbGRfZW50cnkpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkgICAgICJObyBoaXN0b3J5IGl0ZW0gYXQgcG9zaXRpb24gJWQiLAotCQkJICAgICBlbnRyeV9udW1iZXIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JLyogZnJlZSBtZW1vcnkgYWxsb2NhdGVkIGZvciB0aGUgb2xkIGhpc3RvcnkgZW50cnkgKi8KLQlpZiAob2xkX2VudHJ5LT5saW5lKQotCSAgICBmcmVlKG9sZF9lbnRyeS0+bGluZSk7Ci0JaWYgKG9sZF9lbnRyeS0+ZGF0YSkKLQkgICAgZnJlZShvbGRfZW50cnktPmRhdGEpOwotCWZyZWUob2xkX2VudHJ5KTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlzOnJlcGxhY2VfaGlzdG9yeSIsICZlbnRyeV9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZsaW5lKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKGVudHJ5X251bWJlciA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiSGlzdG9yeSBpbmRleCBjYW5ub3QgYmUgbmVnYXRpdmUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIG9sZF9lbnRyeSA9IHJlcGxhY2VfaGlzdG9yeV9lbnRyeShlbnRyeV9udW1iZXIsIGxpbmUsICh2b2lkICopTlVMTCk7CisgICAgaWYgKCFvbGRfZW50cnkpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiTm8gaGlzdG9yeSBpdGVtIGF0IHBvc2l0aW9uICVkIiwKKyAgICAgICAgICAgICAgICAgICAgIGVudHJ5X251bWJlcik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICAvKiBmcmVlIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIHRoZSBvbGQgaGlzdG9yeSBlbnRyeSAqLworICAgIGlmIChvbGRfZW50cnktPmxpbmUpCisgICAgICAgIGZyZWUob2xkX2VudHJ5LT5saW5lKTsKKyAgICBpZiAob2xkX2VudHJ5LT5kYXRhKQorICAgICAgICBmcmVlKG9sZF9lbnRyeS0+ZGF0YSk7CisgICAgZnJlZShvbGRfZW50cnkpOwogCi0JUHlfUkVUVVJOX05PTkU7CisgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKIFB5RG9jX1NUUlZBUihkb2NfcmVwbGFjZV9oaXN0b3J5LApAQCAtNDMxLDEzICs0MzEsMTMgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBweV9hZGRfaGlzdG9yeShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqbGluZTsKKyAgICBjaGFyICpsaW5lOwogCi0JaWYoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6YWRkX2hpc3RvcnkiLCAmbGluZSkpIHsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWFkZF9oaXN0b3J5KGxpbmUpOwotCVB5X1JFVFVSTl9OT05FOworICAgIGlmKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOmFkZF9oaXN0b3J5IiwgJmxpbmUpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBhZGRfaGlzdG9yeShsaW5lKTsKKyAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAogUHlEb2NfU1RSVkFSKGRvY19hZGRfaGlzdG9yeSwKQEAgLTQ1MCw3ICs0NTAsNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdldF9jb21wbGV0ZXJfZGVsaW1zKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqbm9hcmcpCiB7Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcocmxfY29tcGxldGVyX3dvcmRfYnJlYWtfY2hhcmFjdGVycyk7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcocmxfY29tcGxldGVyX3dvcmRfYnJlYWtfY2hhcmFjdGVycyk7CiB9CiAKIFB5RG9jX1NUUlZBUihkb2NfZ2V0X2NvbXBsZXRlcl9kZWxpbXMsCkBAIC00NjMsNyArNDYzLDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZXRfY29tcGxldGVyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gc2V0X2hvb2soImNvbXBsZXRlciIsICZjb21wbGV0ZXIsIGFyZ3MpOworICAgIHJldHVybiBzZXRfaG9vaygiY29tcGxldGVyIiwgJmNvbXBsZXRlciwgYXJncyk7CiB9CiAKIFB5RG9jX1NUUlZBUihkb2Nfc2V0X2NvbXBsZXRlciwKQEAgLTQ3NywxMSArNDc3LDExIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2V0X2NvbXBsZXRlcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm5vYXJncykKIHsKLQlpZiAoY29tcGxldGVyID09IE5VTEwpIHsKLQkJUHlfUkVUVVJOX05PTkU7Ci0JfQotCVB5X0lOQ1JFRihjb21wbGV0ZXIpOwotCXJldHVybiBjb21wbGV0ZXI7CisgICAgaWYgKGNvbXBsZXRlciA9PSBOVUxMKSB7CisgICAgICAgIFB5X1JFVFVSTl9OT05FOworICAgIH0KKyAgICBQeV9JTkNSRUYoY29tcGxldGVyKTsKKyAgICByZXR1cm4gY29tcGxldGVyOwogfQogCiBQeURvY19TVFJWQVIoZG9jX2dldF9jb21wbGV0ZXIsCkBAIC00OTQsMzkgKzQ5NCwzOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdldF9oaXN0b3J5X2l0ZW0oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBpZHggPSAwOwotCUhJU1RfRU5UUlkgKmhpc3RfZW50OworICAgIGludCBpZHggPSAwOworICAgIEhJU1RfRU5UUlkgKmhpc3RfZW50OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOmluZGV4IiwgJmlkeCkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTppbmRleCIsICZpZHgpKQorICAgICAgICByZXR1cm4gTlVMTDsKICNpZmRlZiAgX19BUFBMRV9fCi0JaWYgKHVzaW5nX2xpYmVkaXRfZW11bGF0aW9uKSB7Ci0JCS8qIExpYmVkaXQgZW11bGF0aW9uIHVzZXMgMC1iYXNlZCBpbmRleGVzLAotCQkgKiB0aGUgcmVhbCBvbmUgdXNlcyAxLWJhc2VkIGluZGV4ZXMsCi0JCSAqIGFkanVzdCB0aGUgaW5kZXggdG8gZW5zdXJlIHRoYXQgUHl0aG9uCi0JCSAqIGNvZGUgZG9lc24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IHRoZQotCQkgKiBkaWZmZXJlbmNlLgotCQkgKi8KLQkJSElTVE9SWV9TVEFURSAqaGlzdF9zdDsKLQkJaGlzdF9zdCA9IGhpc3RvcnlfZ2V0X2hpc3Rvcnlfc3RhdGUoKTsKKyAgICBpZiAodXNpbmdfbGliZWRpdF9lbXVsYXRpb24pIHsKKyAgICAgICAgLyogTGliZWRpdCBlbXVsYXRpb24gdXNlcyAwLWJhc2VkIGluZGV4ZXMsCisgICAgICAgICAqIHRoZSByZWFsIG9uZSB1c2VzIDEtYmFzZWQgaW5kZXhlcywKKyAgICAgICAgICogYWRqdXN0IHRoZSBpbmRleCB0byBlbnN1cmUgdGhhdCBQeXRob24KKyAgICAgICAgICogY29kZSBkb2Vzbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgdGhlCisgICAgICAgICAqIGRpZmZlcmVuY2UuCisgICAgICAgICAqLworICAgICAgICBISVNUT1JZX1NUQVRFICpoaXN0X3N0OworICAgICAgICBoaXN0X3N0ID0gaGlzdG9yeV9nZXRfaGlzdG9yeV9zdGF0ZSgpOwogCi0JCWlkeCAtLTsKKyAgICAgICAgaWR4IC0tOwogCi0JCS8qCi0JCSAqIEFwcGxlJ3MgcmVhZGxpbmUgZW11bGF0aW9uIGNyYXNoZXMgd2hlbgotCQkgKiB0aGUgaW5kZXggaXMgb3V0IG9mIHJhbmdlLCB0aGVyZWZvcmUgCi0JCSAqIHRlc3QgZm9yIHRoYXQgYW5kIGZhaWwgZ3JhY2VmdWxseS4KLQkJICovCi0JCWlmIChpZHggPCAwIHx8IGlkeCA+PSBoaXN0X3N0LT5sZW5ndGgpIHsKLQkJCVB5X1JFVFVSTl9OT05FOwotCQl9Ci0JfQorICAgICAgICAvKgorICAgICAgICAgKiBBcHBsZSdzIHJlYWRsaW5lIGVtdWxhdGlvbiBjcmFzaGVzIHdoZW4KKyAgICAgICAgICogdGhlIGluZGV4IGlzIG91dCBvZiByYW5nZSwgdGhlcmVmb3JlCisgICAgICAgICAqIHRlc3QgZm9yIHRoYXQgYW5kIGZhaWwgZ3JhY2VmdWxseS4KKyAgICAgICAgICovCisgICAgICAgIGlmIChpZHggPCAwIHx8IGlkeCA+PSBoaXN0X3N0LT5sZW5ndGgpIHsKKyAgICAgICAgICAgIFB5X1JFVFVSTl9OT05FOworICAgICAgICB9CisgICAgfQogI2VuZGlmIC8qIF9fQVBQTEVfXyAqLwotCWlmICgoaGlzdF9lbnQgPSBoaXN0b3J5X2dldChpZHgpKSkKLQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoaGlzdF9lbnQtPmxpbmUpOwotCWVsc2UgewotCQlQeV9SRVRVUk5fTk9ORTsKLQl9CisgICAgaWYgKChoaXN0X2VudCA9IGhpc3RvcnlfZ2V0KGlkeCkpKQorICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhoaXN0X2VudC0+bGluZSk7CisgICAgZWxzZSB7CisgICAgICAgIFB5X1JFVFVSTl9OT05FOworICAgIH0KIH0KIAogUHlEb2NfU1RSVkFSKGRvY19nZXRfaGlzdG9yeV9pdGVtLApAQCAtNTM5LDEwICs1MzksMTAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZXRfY3VycmVudF9oaXN0b3J5X2xlbmd0aChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm5vYXJnKQogewotCUhJU1RPUllfU1RBVEUgKmhpc3Rfc3Q7CisgICAgSElTVE9SWV9TVEFURSAqaGlzdF9zdDsKIAotCWhpc3Rfc3QgPSBoaXN0b3J5X2dldF9oaXN0b3J5X3N0YXRlKCk7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKGhpc3Rfc3QgPyAobG9uZykgaGlzdF9zdC0+bGVuZ3RoIDogKGxvbmcpIDApOworICAgIGhpc3Rfc3QgPSBoaXN0b3J5X2dldF9oaXN0b3J5X3N0YXRlKCk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKGhpc3Rfc3QgPyAobG9uZykgaGlzdF9zdC0+bGVuZ3RoIDogKGxvbmcpIDApOwogfQogCiBQeURvY19TVFJWQVIoZG9jX2dldF9jdXJyZW50X2hpc3RvcnlfbGVuZ3RoLApAQCAtNTU1LDcgKzU1NSw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2V0X2xpbmVfYnVmZmVyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqbm9hcmcpCiB7Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcocmxfbGluZV9idWZmZXIpOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKHJsX2xpbmVfYnVmZmVyKTsKIH0KIAogUHlEb2NfU1RSVkFSKGRvY19nZXRfbGluZV9idWZmZXIsCkBAIC01NzAsOCArNTcwLDggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBweV9jbGVhcl9oaXN0b3J5KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqbm9hcmcpCiB7Ci0JY2xlYXJfaGlzdG9yeSgpOwotCVB5X1JFVFVSTl9OT05FOworICAgIGNsZWFyX2hpc3RvcnkoKTsKKyAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAogUHlEb2NfU1RSVkFSKGRvY19jbGVhcl9oaXN0b3J5LApAQCAtNTg1LDExICs1ODUsMTEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbnNlcnRfdGV4dChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqczsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6aW5zZXJ0X3RleHQiLCAmcykpCi0JCXJldHVybiBOVUxMOwotCXJsX2luc2VydF90ZXh0KHMpOwotCVB5X1JFVFVSTl9OT05FOworICAgIGNoYXIgKnM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOmluc2VydF90ZXh0IiwgJnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBybF9pbnNlcnRfdGV4dChzKTsKKyAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAogUHlEb2NfU1RSVkFSKGRvY19pbnNlcnRfdGV4dCwKQEAgLTYwMiw4ICs2MDIsOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHJlZGlzcGxheShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm5vYXJnKQogewotCXJsX3JlZGlzcGxheSgpOwotCVB5X1JFVFVSTl9OT05FOworICAgIHJsX3JlZGlzcGxheSgpOworICAgIFB5X1JFVFVSTl9OT05FOwogfQogCiBQeURvY19TVFJWQVIoZG9jX3JlZGlzcGxheSwKQEAgLTYxNiw1MCArNjE2LDUwIEBACiAKIHN0YXRpYyBzdHJ1Y3QgUHlNZXRob2REZWYgcmVhZGxpbmVfbWV0aG9kc1tdID0KIHsKLQl7InBhcnNlX2FuZF9iaW5kIiwgcGFyc2VfYW5kX2JpbmQsIE1FVEhfVkFSQVJHUywgZG9jX3BhcnNlX2FuZF9iaW5kfSwKLQl7ImdldF9saW5lX2J1ZmZlciIsIGdldF9saW5lX2J1ZmZlciwgTUVUSF9OT0FSR1MsIGRvY19nZXRfbGluZV9idWZmZXJ9LAotCXsiaW5zZXJ0X3RleHQiLCBpbnNlcnRfdGV4dCwgTUVUSF9WQVJBUkdTLCBkb2NfaW5zZXJ0X3RleHR9LAotCXsicmVkaXNwbGF5IiwgcmVkaXNwbGF5LCBNRVRIX05PQVJHUywgZG9jX3JlZGlzcGxheX0sCi0JeyJyZWFkX2luaXRfZmlsZSIsIHJlYWRfaW5pdF9maWxlLCBNRVRIX1ZBUkFSR1MsIGRvY19yZWFkX2luaXRfZmlsZX0sCi0JeyJyZWFkX2hpc3RvcnlfZmlsZSIsIHJlYWRfaGlzdG9yeV9maWxlLAotCSBNRVRIX1ZBUkFSR1MsIGRvY19yZWFkX2hpc3RvcnlfZmlsZX0sCi0JeyJ3cml0ZV9oaXN0b3J5X2ZpbGUiLCB3cml0ZV9oaXN0b3J5X2ZpbGUsCi0JIE1FVEhfVkFSQVJHUywgZG9jX3dyaXRlX2hpc3RvcnlfZmlsZX0sCi0JeyJnZXRfaGlzdG9yeV9pdGVtIiwgZ2V0X2hpc3RvcnlfaXRlbSwKLQkgTUVUSF9WQVJBUkdTLCBkb2NfZ2V0X2hpc3RvcnlfaXRlbX0sCi0JeyJnZXRfY3VycmVudF9oaXN0b3J5X2xlbmd0aCIsIChQeUNGdW5jdGlvbilnZXRfY3VycmVudF9oaXN0b3J5X2xlbmd0aCwKLQkgTUVUSF9OT0FSR1MsIGRvY19nZXRfY3VycmVudF9oaXN0b3J5X2xlbmd0aH0sCi0JeyJzZXRfaGlzdG9yeV9sZW5ndGgiLCBzZXRfaGlzdG9yeV9sZW5ndGgsCi0JIE1FVEhfVkFSQVJHUywgc2V0X2hpc3RvcnlfbGVuZ3RoX2RvY30sCi0JeyJnZXRfaGlzdG9yeV9sZW5ndGgiLCBnZXRfaGlzdG9yeV9sZW5ndGgsCi0JIE1FVEhfTk9BUkdTLCBnZXRfaGlzdG9yeV9sZW5ndGhfZG9jfSwKLQl7InNldF9jb21wbGV0ZXIiLCBzZXRfY29tcGxldGVyLCBNRVRIX1ZBUkFSR1MsIGRvY19zZXRfY29tcGxldGVyfSwKLQl7ImdldF9jb21wbGV0ZXIiLCBnZXRfY29tcGxldGVyLCBNRVRIX05PQVJHUywgZG9jX2dldF9jb21wbGV0ZXJ9LAotCXsiZ2V0X2NvbXBsZXRpb25fdHlwZSIsIGdldF9jb21wbGV0aW9uX3R5cGUsCi0JIE1FVEhfTk9BUkdTLCBkb2NfZ2V0X2NvbXBsZXRpb25fdHlwZX0sCi0JeyJnZXRfYmVnaWR4IiwgZ2V0X2JlZ2lkeCwgTUVUSF9OT0FSR1MsIGRvY19nZXRfYmVnaWR4fSwKLQl7ImdldF9lbmRpZHgiLCBnZXRfZW5kaWR4LCBNRVRIX05PQVJHUywgZG9jX2dldF9lbmRpZHh9LAorICAgIHsicGFyc2VfYW5kX2JpbmQiLCBwYXJzZV9hbmRfYmluZCwgTUVUSF9WQVJBUkdTLCBkb2NfcGFyc2VfYW5kX2JpbmR9LAorICAgIHsiZ2V0X2xpbmVfYnVmZmVyIiwgZ2V0X2xpbmVfYnVmZmVyLCBNRVRIX05PQVJHUywgZG9jX2dldF9saW5lX2J1ZmZlcn0sCisgICAgeyJpbnNlcnRfdGV4dCIsIGluc2VydF90ZXh0LCBNRVRIX1ZBUkFSR1MsIGRvY19pbnNlcnRfdGV4dH0sCisgICAgeyJyZWRpc3BsYXkiLCByZWRpc3BsYXksIE1FVEhfTk9BUkdTLCBkb2NfcmVkaXNwbGF5fSwKKyAgICB7InJlYWRfaW5pdF9maWxlIiwgcmVhZF9pbml0X2ZpbGUsIE1FVEhfVkFSQVJHUywgZG9jX3JlYWRfaW5pdF9maWxlfSwKKyAgICB7InJlYWRfaGlzdG9yeV9maWxlIiwgcmVhZF9oaXN0b3J5X2ZpbGUsCisgICAgIE1FVEhfVkFSQVJHUywgZG9jX3JlYWRfaGlzdG9yeV9maWxlfSwKKyAgICB7IndyaXRlX2hpc3RvcnlfZmlsZSIsIHdyaXRlX2hpc3RvcnlfZmlsZSwKKyAgICAgTUVUSF9WQVJBUkdTLCBkb2Nfd3JpdGVfaGlzdG9yeV9maWxlfSwKKyAgICB7ImdldF9oaXN0b3J5X2l0ZW0iLCBnZXRfaGlzdG9yeV9pdGVtLAorICAgICBNRVRIX1ZBUkFSR1MsIGRvY19nZXRfaGlzdG9yeV9pdGVtfSwKKyAgICB7ImdldF9jdXJyZW50X2hpc3RvcnlfbGVuZ3RoIiwgKFB5Q0Z1bmN0aW9uKWdldF9jdXJyZW50X2hpc3RvcnlfbGVuZ3RoLAorICAgICBNRVRIX05PQVJHUywgZG9jX2dldF9jdXJyZW50X2hpc3RvcnlfbGVuZ3RofSwKKyAgICB7InNldF9oaXN0b3J5X2xlbmd0aCIsIHNldF9oaXN0b3J5X2xlbmd0aCwKKyAgICAgTUVUSF9WQVJBUkdTLCBzZXRfaGlzdG9yeV9sZW5ndGhfZG9jfSwKKyAgICB7ImdldF9oaXN0b3J5X2xlbmd0aCIsIGdldF9oaXN0b3J5X2xlbmd0aCwKKyAgICAgTUVUSF9OT0FSR1MsIGdldF9oaXN0b3J5X2xlbmd0aF9kb2N9LAorICAgIHsic2V0X2NvbXBsZXRlciIsIHNldF9jb21wbGV0ZXIsIE1FVEhfVkFSQVJHUywgZG9jX3NldF9jb21wbGV0ZXJ9LAorICAgIHsiZ2V0X2NvbXBsZXRlciIsIGdldF9jb21wbGV0ZXIsIE1FVEhfTk9BUkdTLCBkb2NfZ2V0X2NvbXBsZXRlcn0sCisgICAgeyJnZXRfY29tcGxldGlvbl90eXBlIiwgZ2V0X2NvbXBsZXRpb25fdHlwZSwKKyAgICAgTUVUSF9OT0FSR1MsIGRvY19nZXRfY29tcGxldGlvbl90eXBlfSwKKyAgICB7ImdldF9iZWdpZHgiLCBnZXRfYmVnaWR4LCBNRVRIX05PQVJHUywgZG9jX2dldF9iZWdpZHh9LAorICAgIHsiZ2V0X2VuZGlkeCIsIGdldF9lbmRpZHgsIE1FVEhfTk9BUkdTLCBkb2NfZ2V0X2VuZGlkeH0sCiAKLQl7InNldF9jb21wbGV0ZXJfZGVsaW1zIiwgc2V0X2NvbXBsZXRlcl9kZWxpbXMsCi0JIE1FVEhfVkFSQVJHUywgZG9jX3NldF9jb21wbGV0ZXJfZGVsaW1zfSwKLQl7ImFkZF9oaXN0b3J5IiwgcHlfYWRkX2hpc3RvcnksIE1FVEhfVkFSQVJHUywgZG9jX2FkZF9oaXN0b3J5fSwKLQl7InJlbW92ZV9oaXN0b3J5X2l0ZW0iLCBweV9yZW1vdmVfaGlzdG9yeSwgTUVUSF9WQVJBUkdTLCBkb2NfcmVtb3ZlX2hpc3Rvcnl9LAotCXsicmVwbGFjZV9oaXN0b3J5X2l0ZW0iLCBweV9yZXBsYWNlX2hpc3RvcnksIE1FVEhfVkFSQVJHUywgZG9jX3JlcGxhY2VfaGlzdG9yeX0sCi0JeyJnZXRfY29tcGxldGVyX2RlbGltcyIsIGdldF9jb21wbGV0ZXJfZGVsaW1zLAotCSBNRVRIX05PQVJHUywgZG9jX2dldF9jb21wbGV0ZXJfZGVsaW1zfSwKKyAgICB7InNldF9jb21wbGV0ZXJfZGVsaW1zIiwgc2V0X2NvbXBsZXRlcl9kZWxpbXMsCisgICAgIE1FVEhfVkFSQVJHUywgZG9jX3NldF9jb21wbGV0ZXJfZGVsaW1zfSwKKyAgICB7ImFkZF9oaXN0b3J5IiwgcHlfYWRkX2hpc3RvcnksIE1FVEhfVkFSQVJHUywgZG9jX2FkZF9oaXN0b3J5fSwKKyAgICB7InJlbW92ZV9oaXN0b3J5X2l0ZW0iLCBweV9yZW1vdmVfaGlzdG9yeSwgTUVUSF9WQVJBUkdTLCBkb2NfcmVtb3ZlX2hpc3Rvcnl9LAorICAgIHsicmVwbGFjZV9oaXN0b3J5X2l0ZW0iLCBweV9yZXBsYWNlX2hpc3RvcnksIE1FVEhfVkFSQVJHUywgZG9jX3JlcGxhY2VfaGlzdG9yeX0sCisgICAgeyJnZXRfY29tcGxldGVyX2RlbGltcyIsIGdldF9jb21wbGV0ZXJfZGVsaW1zLAorICAgICBNRVRIX05PQVJHUywgZG9jX2dldF9jb21wbGV0ZXJfZGVsaW1zfSwKIAotCXsic2V0X2NvbXBsZXRpb25fZGlzcGxheV9tYXRjaGVzX2hvb2siLCBzZXRfY29tcGxldGlvbl9kaXNwbGF5X21hdGNoZXNfaG9vaywKLQkgTUVUSF9WQVJBUkdTLCBkb2Nfc2V0X2NvbXBsZXRpb25fZGlzcGxheV9tYXRjaGVzX2hvb2t9LAotCXsic2V0X3N0YXJ0dXBfaG9vayIsIHNldF9zdGFydHVwX2hvb2ssCi0JIE1FVEhfVkFSQVJHUywgZG9jX3NldF9zdGFydHVwX2hvb2t9LAorICAgIHsic2V0X2NvbXBsZXRpb25fZGlzcGxheV9tYXRjaGVzX2hvb2siLCBzZXRfY29tcGxldGlvbl9kaXNwbGF5X21hdGNoZXNfaG9vaywKKyAgICAgTUVUSF9WQVJBUkdTLCBkb2Nfc2V0X2NvbXBsZXRpb25fZGlzcGxheV9tYXRjaGVzX2hvb2t9LAorICAgIHsic2V0X3N0YXJ0dXBfaG9vayIsIHNldF9zdGFydHVwX2hvb2ssCisgICAgIE1FVEhfVkFSQVJHUywgZG9jX3NldF9zdGFydHVwX2hvb2t9LAogI2lmZGVmIEhBVkVfUkxfUFJFX0lOUFVUX0hPT0sKLQl7InNldF9wcmVfaW5wdXRfaG9vayIsIHNldF9wcmVfaW5wdXRfaG9vaywKLQkgTUVUSF9WQVJBUkdTLCBkb2Nfc2V0X3ByZV9pbnB1dF9ob29rfSwKKyAgICB7InNldF9wcmVfaW5wdXRfaG9vayIsIHNldF9wcmVfaW5wdXRfaG9vaywKKyAgICAgTUVUSF9WQVJBUkdTLCBkb2Nfc2V0X3ByZV9pbnB1dF9ob29rfSwKICNlbmRpZgogI2lmZGVmIEhBVkVfUkxfQ09NUExFVElPTl9BUFBFTkRfQ0hBUkFDVEVSCi0JeyJjbGVhcl9oaXN0b3J5IiwgcHlfY2xlYXJfaGlzdG9yeSwgTUVUSF9OT0FSR1MsIGRvY19jbGVhcl9oaXN0b3J5fSwKKyAgICB7ImNsZWFyX2hpc3RvcnkiLCBweV9jbGVhcl9oaXN0b3J5LCBNRVRIX05PQVJHUywgZG9jX2NsZWFyX2hpc3Rvcnl9LAogI2VuZGlmCi0JezAsIDB9CisgICAgezAsIDB9CiB9OwogCiAKQEAgLTY2OCw0NyArNjY4LDQ3IEBACiBzdGF0aWMgaW50CiBvbl9ob29rKFB5T2JqZWN0ICpmdW5jKQogewotCWludCByZXN1bHQgPSAwOwotCWlmIChmdW5jICE9IE5VTEwpIHsKLQkJUHlPYmplY3QgKnI7CisgICAgaW50IHJlc3VsdCA9IDA7CisgICAgaWYgKGZ1bmMgIT0gTlVMTCkgeworICAgICAgICBQeU9iamVjdCAqcjsKICNpZmRlZiBXSVRIX1RIUkVBRAotCQlQeUdJTFN0YXRlX1NUQVRFIGdpbHN0YXRlID0gUHlHSUxTdGF0ZV9FbnN1cmUoKTsKKyAgICAgICAgUHlHSUxTdGF0ZV9TVEFURSBnaWxzdGF0ZSA9IFB5R0lMU3RhdGVfRW5zdXJlKCk7CiAjZW5kaWYKLQkJciA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihmdW5jLCBOVUxMKTsKLQkJaWYgKHIgPT0gTlVMTCkKLQkJCWdvdG8gZXJyb3I7Ci0JCWlmIChyID09IFB5X05vbmUpCi0JCQlyZXN1bHQgPSAwOwotCQllbHNlIHsKLQkJCXJlc3VsdCA9IFB5SW50X0FzTG9uZyhyKTsKLQkJCWlmIChyZXN1bHQgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkgCi0JCQkJZ290byBlcnJvcjsKLQkJfQotCQlQeV9ERUNSRUYocik7Ci0JCWdvdG8gZG9uZTsKLQkgIGVycm9yOgotCQlQeUVycl9DbGVhcigpOwotCQlQeV9YREVDUkVGKHIpOwotCSAgZG9uZToKKyAgICAgICAgciA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihmdW5jLCBOVUxMKTsKKyAgICAgICAgaWYgKHIgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIGlmIChyID09IFB5X05vbmUpCisgICAgICAgICAgICByZXN1bHQgPSAwOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IFB5SW50X0FzTG9uZyhyKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgICAgIFB5X0RFQ1JFRihyKTsKKyAgICAgICAgZ290byBkb25lOworICAgICAgZXJyb3I6CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIFB5X1hERUNSRUYocik7CisgICAgICBkb25lOgogI2lmZGVmIFdJVEhfVEhSRUFECi0JCVB5R0lMU3RhdGVfUmVsZWFzZShnaWxzdGF0ZSk7CisgICAgICAgIFB5R0lMU3RhdGVfUmVsZWFzZShnaWxzdGF0ZSk7CiAjZW5kaWYKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIGludAogb25fc3RhcnR1cF9ob29rKHZvaWQpCiB7Ci0JcmV0dXJuIG9uX2hvb2soc3RhcnR1cF9ob29rKTsKKyAgICByZXR1cm4gb25faG9vayhzdGFydHVwX2hvb2spOwogfQogCiAjaWZkZWYgSEFWRV9STF9QUkVfSU5QVVRfSE9PSwogc3RhdGljIGludAogb25fcHJlX2lucHV0X2hvb2sodm9pZCkKIHsKLQlyZXR1cm4gb25faG9vayhwcmVfaW5wdXRfaG9vayk7CisgICAgcmV0dXJuIG9uX2hvb2socHJlX2lucHV0X2hvb2spOwogfQogI2VuZGlmCiAKQEAgLTcxNyw0MyArNzE3LDQzIEBACiAKIHN0YXRpYyB2b2lkCiBvbl9jb21wbGV0aW9uX2Rpc3BsYXlfbWF0Y2hlc19ob29rKGNoYXIgKiptYXRjaGVzLAotCQkJCSAgIGludCBudW1fbWF0Y2hlcywgaW50IG1heF9sZW5ndGgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fbWF0Y2hlcywgaW50IG1heF9sZW5ndGgpCiB7Ci0JaW50IGk7Ci0JUHlPYmplY3QgKm09TlVMTCwgKnM9TlVMTCwgKnI9TlVMTDsKKyAgICBpbnQgaTsKKyAgICBQeU9iamVjdCAqbT1OVUxMLCAqcz1OVUxMLCAqcj1OVUxMOwogI2lmZGVmIFdJVEhfVEhSRUFECi0JUHlHSUxTdGF0ZV9TVEFURSBnaWxzdGF0ZSA9IFB5R0lMU3RhdGVfRW5zdXJlKCk7CisgICAgUHlHSUxTdGF0ZV9TVEFURSBnaWxzdGF0ZSA9IFB5R0lMU3RhdGVfRW5zdXJlKCk7CiAjZW5kaWYKLQltID0gUHlMaXN0X05ldyhudW1fbWF0Y2hlcyk7Ci0JaWYgKG0gPT0gTlVMTCkKLQkJZ290byBlcnJvcjsKLQlmb3IgKGkgPSAwOyBpIDwgbnVtX21hdGNoZXM7IGkrKykgewotCQlzID0gUHlTdHJpbmdfRnJvbVN0cmluZyhtYXRjaGVzW2krMV0pOwotCQlpZiAocyA9PSBOVUxMKQotCQkJZ290byBlcnJvcjsKLQkJaWYgKFB5TGlzdF9TZXRJdGVtKG0sIGksIHMpID09IC0xKQotCQkJZ290byBlcnJvcjsKLQl9CisgICAgbSA9IFB5TGlzdF9OZXcobnVtX21hdGNoZXMpOworICAgIGlmIChtID09IE5VTEwpCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgZm9yIChpID0gMDsgaSA8IG51bV9tYXRjaGVzOyBpKyspIHsKKyAgICAgICAgcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmcobWF0Y2hlc1tpKzFdKTsKKyAgICAgICAgaWYgKHMgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIGlmIChQeUxpc3RfU2V0SXRlbShtLCBpLCBzKSA9PSAtMSkKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQogCi0JciA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihjb21wbGV0aW9uX2Rpc3BsYXlfbWF0Y2hlc19ob29rLAotCQkJCSAgInNPaSIsIG1hdGNoZXNbMF0sIG0sIG1heF9sZW5ndGgpOworICAgIHIgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oY29tcGxldGlvbl9kaXNwbGF5X21hdGNoZXNfaG9vaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzT2kiLCBtYXRjaGVzWzBdLCBtLCBtYXhfbGVuZ3RoKTsKIAotCVB5X0RFQ1JFRihtKSwgbT1OVUxMOwotCQotCWlmIChyID09IE5VTEwgfHwKLQkgICAgKHIgIT0gUHlfTm9uZSAmJiBQeUludF9Bc0xvbmcocikgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkpIHsKLQkJZ290byBlcnJvcjsKLQl9Ci0JUHlfWERFQ1JFRihyKSwgcj1OVUxMOworICAgIFB5X0RFQ1JFRihtKSwgbT1OVUxMOwogCi0JaWYgKDApIHsKLQllcnJvcjoKLQkJUHlFcnJfQ2xlYXIoKTsKLQkJUHlfWERFQ1JFRihtKTsKLQkJUHlfWERFQ1JFRihyKTsKLQl9CisgICAgaWYgKHIgPT0gTlVMTCB8fAorICAgICAgICAociAhPSBQeV9Ob25lICYmIFB5SW50X0FzTG9uZyhyKSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSkgeworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgICBQeV9YREVDUkVGKHIpLCByPU5VTEw7CisKKyAgICBpZiAoMCkgeworICAgIGVycm9yOgorICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBQeV9YREVDUkVGKG0pOworICAgICAgICBQeV9YREVDUkVGKHIpOworICAgIH0KICNpZmRlZiBXSVRIX1RIUkVBRAotCVB5R0lMU3RhdGVfUmVsZWFzZShnaWxzdGF0ZSk7CisgICAgUHlHSUxTdGF0ZV9SZWxlYXNlKGdpbHN0YXRlKTsKICNlbmRpZgogfQogCkBAIC03NjMsMzcgKzc2MywzNyBAQAogc3RhdGljIGNoYXIgKgogb25fY29tcGxldGlvbihjb25zdCBjaGFyICp0ZXh0LCBpbnQgc3RhdGUpCiB7Ci0JY2hhciAqcmVzdWx0ID0gTlVMTDsKLQlpZiAoY29tcGxldGVyICE9IE5VTEwpIHsKLQkJUHlPYmplY3QgKnI7Ci0jaWZkZWYgV0lUSF9USFJFQUQJICAgICAgCi0JCVB5R0lMU3RhdGVfU1RBVEUgZ2lsc3RhdGUgPSBQeUdJTFN0YXRlX0Vuc3VyZSgpOworICAgIGNoYXIgKnJlc3VsdCA9IE5VTEw7CisgICAgaWYgKGNvbXBsZXRlciAhPSBOVUxMKSB7CisgICAgICAgIFB5T2JqZWN0ICpyOworI2lmZGVmIFdJVEhfVEhSRUFECisgICAgICAgIFB5R0lMU3RhdGVfU1RBVEUgZ2lsc3RhdGUgPSBQeUdJTFN0YXRlX0Vuc3VyZSgpOwogI2VuZGlmCi0JCXJsX2F0dGVtcHRlZF9jb21wbGV0aW9uX292ZXIgPSAxOwotCQlyID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKGNvbXBsZXRlciwgInNpIiwgdGV4dCwgc3RhdGUpOwotCQlpZiAociA9PSBOVUxMKQotCQkJZ290byBlcnJvcjsKLQkJaWYgKHIgPT0gUHlfTm9uZSkgewotCQkJcmVzdWx0ID0gTlVMTDsKLQkJfQotCQllbHNlIHsKLQkJCWNoYXIgKnMgPSBQeVN0cmluZ19Bc1N0cmluZyhyKTsKLQkJCWlmIChzID09IE5VTEwpCi0JCQkJZ290byBlcnJvcjsKLQkJCXJlc3VsdCA9IHN0cmR1cChzKTsKLQkJfQotCQlQeV9ERUNSRUYocik7Ci0JCWdvdG8gZG9uZTsKLQkgIGVycm9yOgotCQlQeUVycl9DbGVhcigpOwotCQlQeV9YREVDUkVGKHIpOwotCSAgZG9uZToKLSNpZmRlZiBXSVRIX1RIUkVBRAkgICAgICAKLQkJUHlHSUxTdGF0ZV9SZWxlYXNlKGdpbHN0YXRlKTsKKyAgICAgICAgcmxfYXR0ZW1wdGVkX2NvbXBsZXRpb25fb3ZlciA9IDE7CisgICAgICAgIHIgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oY29tcGxldGVyLCAic2kiLCB0ZXh0LCBzdGF0ZSk7CisgICAgICAgIGlmIChyID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICBpZiAociA9PSBQeV9Ob25lKSB7CisgICAgICAgICAgICByZXN1bHQgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgY2hhciAqcyA9IFB5U3RyaW5nX0FzU3RyaW5nKHIpOworICAgICAgICAgICAgaWYgKHMgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgcmVzdWx0ID0gc3RyZHVwKHMpOworICAgICAgICB9CisgICAgICAgIFB5X0RFQ1JFRihyKTsKKyAgICAgICAgZ290byBkb25lOworICAgICAgZXJyb3I6CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIFB5X1hERUNSRUYocik7CisgICAgICBkb25lOgorI2lmZGVmIFdJVEhfVEhSRUFECisgICAgICAgIFB5R0lMU3RhdGVfUmVsZWFzZShnaWxzdGF0ZSk7CiAjZW5kaWYKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogCkBAIC04MDQsMTYgKzgwNCwxNiBAQAogZmxleF9jb21wbGV0ZShjaGFyICp0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQpCiB7CiAjaWZkZWYgSEFWRV9STF9DT01QTEVUSU9OX0FQUEVORF9DSEFSQUNURVIKLQlybF9jb21wbGV0aW9uX2FwcGVuZF9jaGFyYWN0ZXIgPSdcMCc7CisgICAgcmxfY29tcGxldGlvbl9hcHBlbmRfY2hhcmFjdGVyID0nXDAnOwogI2VuZGlmCiAjaWZkZWYgSEFWRV9STF9DT01QTEVUSU9OX1NVUFBSRVNTX0FQUEVORAotCXJsX2NvbXBsZXRpb25fc3VwcHJlc3NfYXBwZW5kID0gMDsKKyAgICBybF9jb21wbGV0aW9uX3N1cHByZXNzX2FwcGVuZCA9IDA7CiAjZW5kaWYKLQlQeV9YREVDUkVGKGJlZ2lkeCk7Ci0JUHlfWERFQ1JFRihlbmRpZHgpOwotCWJlZ2lkeCA9IFB5SW50X0Zyb21Mb25nKChsb25nKSBzdGFydCk7Ci0JZW5kaWR4ID0gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIGVuZCk7Ci0JcmV0dXJuIGNvbXBsZXRpb25fbWF0Y2hlcyh0ZXh0LCAqb25fY29tcGxldGlvbik7CisgICAgUHlfWERFQ1JFRihiZWdpZHgpOworICAgIFB5X1hERUNSRUYoZW5kaWR4KTsKKyAgICBiZWdpZHggPSBQeUludF9Gcm9tTG9uZygobG9uZykgc3RhcnQpOworICAgIGVuZGlkeCA9IFB5SW50X0Zyb21Mb25nKChsb25nKSBlbmQpOworICAgIHJldHVybiBjb21wbGV0aW9uX21hdGNoZXModGV4dCwgKm9uX2NvbXBsZXRpb24pOwogfQogCiAKQEAgLTgyMyw0NSArODIzLDQ1IEBACiBzZXR1cF9yZWFkbGluZSh2b2lkKQogewogI2lmZGVmIFNBVkVfTE9DQUxFCi0JY2hhciAqc2F2ZWRfbG9jYWxlID0gc3RyZHVwKHNldGxvY2FsZShMQ19DVFlQRSwgTlVMTCkpOwotCWlmICghc2F2ZWRfbG9jYWxlKQotCQlQeV9GYXRhbEVycm9yKCJub3QgZW5vdWdoIG1lbW9yeSB0byBzYXZlIGxvY2FsZSIpOworICAgIGNoYXIgKnNhdmVkX2xvY2FsZSA9IHN0cmR1cChzZXRsb2NhbGUoTENfQ1RZUEUsIE5VTEwpKTsKKyAgICBpZiAoIXNhdmVkX2xvY2FsZSkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigibm90IGVub3VnaCBtZW1vcnkgdG8gc2F2ZSBsb2NhbGUiKTsKICNlbmRpZgogCi0JdXNpbmdfaGlzdG9yeSgpOworICAgIHVzaW5nX2hpc3RvcnkoKTsKIAotCXJsX3JlYWRsaW5lX25hbWUgPSAicHl0aG9uIjsKKyAgICBybF9yZWFkbGluZV9uYW1lID0gInB5dGhvbiI7CiAjaWYgZGVmaW5lZChQWU9TX09TMikgJiYgZGVmaW5lZChQWUNDX0dDQykKLQkvKiBBbGxvdyAkaWYgdGVybT0gaW4gLmlucHV0cmMgdG8gd29yayAqLwotCXJsX3Rlcm1pbmFsX25hbWUgPSBnZXRlbnYoIlRFUk0iKTsKKyAgICAvKiBBbGxvdyAkaWYgdGVybT0gaW4gLmlucHV0cmMgdG8gd29yayAqLworICAgIHJsX3Rlcm1pbmFsX25hbWUgPSBnZXRlbnYoIlRFUk0iKTsKICNlbmRpZgotCS8qIEZvcmNlIHJlYmluZCBvZiBUQUIgdG8gaW5zZXJ0LXRhYiAqLwotCXJsX2JpbmRfa2V5KCdcdCcsIHJsX2luc2VydCk7Ci0JLyogQmluZCBib3RoIEVTQy1UQUIgYW5kIEVTQy1FU0MgdG8gdGhlIGNvbXBsZXRpb24gZnVuY3Rpb24gKi8KLQlybF9iaW5kX2tleV9pbl9tYXAgKCdcdCcsIHJsX2NvbXBsZXRlLCBlbWFjc19tZXRhX2tleW1hcCk7Ci0JcmxfYmluZF9rZXlfaW5fbWFwICgnXDAzMycsIHJsX2NvbXBsZXRlLCBlbWFjc19tZXRhX2tleW1hcCk7Ci0JLyogU2V0IG91ciBob29rIGZ1bmN0aW9ucyAqLwotCXJsX3N0YXJ0dXBfaG9vayA9IChGdW5jdGlvbiAqKW9uX3N0YXJ0dXBfaG9vazsKKyAgICAvKiBGb3JjZSByZWJpbmQgb2YgVEFCIHRvIGluc2VydC10YWIgKi8KKyAgICBybF9iaW5kX2tleSgnXHQnLCBybF9pbnNlcnQpOworICAgIC8qIEJpbmQgYm90aCBFU0MtVEFCIGFuZCBFU0MtRVNDIHRvIHRoZSBjb21wbGV0aW9uIGZ1bmN0aW9uICovCisgICAgcmxfYmluZF9rZXlfaW5fbWFwICgnXHQnLCBybF9jb21wbGV0ZSwgZW1hY3NfbWV0YV9rZXltYXApOworICAgIHJsX2JpbmRfa2V5X2luX21hcCAoJ1wwMzMnLCBybF9jb21wbGV0ZSwgZW1hY3NfbWV0YV9rZXltYXApOworICAgIC8qIFNldCBvdXIgaG9vayBmdW5jdGlvbnMgKi8KKyAgICBybF9zdGFydHVwX2hvb2sgPSAoRnVuY3Rpb24gKilvbl9zdGFydHVwX2hvb2s7CiAjaWZkZWYgSEFWRV9STF9QUkVfSU5QVVRfSE9PSwotCXJsX3ByZV9pbnB1dF9ob29rID0gKEZ1bmN0aW9uICopb25fcHJlX2lucHV0X2hvb2s7CisgICAgcmxfcHJlX2lucHV0X2hvb2sgPSAoRnVuY3Rpb24gKilvbl9wcmVfaW5wdXRfaG9vazsKICNlbmRpZgotCS8qIFNldCBvdXIgY29tcGxldGlvbiBmdW5jdGlvbiAqLwotCXJsX2F0dGVtcHRlZF9jb21wbGV0aW9uX2Z1bmN0aW9uID0gKENQUEZ1bmN0aW9uICopZmxleF9jb21wbGV0ZTsKLQkvKiBTZXQgUHl0aG9uIHdvcmQgYnJlYWsgY2hhcmFjdGVycyAqLwotCXJsX2NvbXBsZXRlcl93b3JkX2JyZWFrX2NoYXJhY3RlcnMgPQotCQlzdHJkdXAoIiBcdFxuYH4hQCMkJV4mKigpLT0rW3tdfVxcfDs6J1wiLDw+Lz8iKTsKLQkJLyogQWxsIG5vbmFscGhhbnVtcyBleGNlcHQgJy4nICovCisgICAgLyogU2V0IG91ciBjb21wbGV0aW9uIGZ1bmN0aW9uICovCisgICAgcmxfYXR0ZW1wdGVkX2NvbXBsZXRpb25fZnVuY3Rpb24gPSAoQ1BQRnVuY3Rpb24gKilmbGV4X2NvbXBsZXRlOworICAgIC8qIFNldCBQeXRob24gd29yZCBicmVhayBjaGFyYWN0ZXJzICovCisgICAgcmxfY29tcGxldGVyX3dvcmRfYnJlYWtfY2hhcmFjdGVycyA9CisgICAgICAgIHN0cmR1cCgiIFx0XG5gfiFAIyQlXiYqKCktPStbe119XFx8OzonXCIsPD4vPyIpOworICAgICAgICAvKiBBbGwgbm9uYWxwaGFudW1zIGV4Y2VwdCAnLicgKi8KIAotCWJlZ2lkeCA9IFB5SW50X0Zyb21Mb25nKDBMKTsKLQllbmRpZHggPSBQeUludF9Gcm9tTG9uZygwTCk7Ci0JLyogSW5pdGlhbGl6ZSAoYWxsb3dzIC5pbnB1dHJjIHRvIG92ZXJyaWRlKQotCSAqCi0JICogWFhYOiBBIGJ1ZyBpbiB0aGUgcmVhZGxpbmUtMi4yIGxpYnJhcnkgY2F1c2VzIGEgbWVtb3J5IGxlYWsKLQkgKiBpbnNpZGUgdGhpcyBmdW5jdGlvbi4gIE5vdGhpbmcgd2UgY2FuIGRvIGFib3V0IGl0LgotCSAqLwotCXJsX2luaXRpYWxpemUoKTsKKyAgICBiZWdpZHggPSBQeUludF9Gcm9tTG9uZygwTCk7CisgICAgZW5kaWR4ID0gUHlJbnRfRnJvbUxvbmcoMEwpOworICAgIC8qIEluaXRpYWxpemUgKGFsbG93cyAuaW5wdXRyYyB0byBvdmVycmlkZSkKKyAgICAgKgorICAgICAqIFhYWDogQSBidWcgaW4gdGhlIHJlYWRsaW5lLTIuMiBsaWJyYXJ5IGNhdXNlcyBhIG1lbW9yeSBsZWFrCisgICAgICogaW5zaWRlIHRoaXMgZnVuY3Rpb24uICBOb3RoaW5nIHdlIGNhbiBkbyBhYm91dCBpdC4KKyAgICAgKi8KKyAgICBybF9pbml0aWFsaXplKCk7CiAKLQlSRVNUT1JFX0xPQ0FMRShzYXZlZF9sb2NhbGUpCisgICAgUkVTVE9SRV9MT0NBTEUoc2F2ZWRfbG9jYWxlKQogfQogCiAvKiBXcmFwcGVyIGFyb3VuZCBHTlUgcmVhZGxpbmUgdGhhdCBoYW5kbGVzIHNpZ25hbHMgZGlmZmVyZW50bHkuICovCkBAIC04NjksMTIgKzg2OSwxMiBAQAogCiAjaWYgZGVmaW5lZChIQVZFX1JMX0NBTExCQUNLKSAmJiBkZWZpbmVkKEhBVkVfU0VMRUNUKQogCi1zdGF0aWMJY2hhciAqY29tcGxldGVkX2lucHV0X3N0cmluZzsKK3N0YXRpYyAgY2hhciAqY29tcGxldGVkX2lucHV0X3N0cmluZzsKIHN0YXRpYyB2b2lkCiBybGhhbmRsZXIoY2hhciAqdGV4dCkKIHsKLQljb21wbGV0ZWRfaW5wdXRfc3RyaW5nID0gdGV4dDsKLQlybF9jYWxsYmFja19oYW5kbGVyX3JlbW92ZSgpOworICAgIGNvbXBsZXRlZF9pbnB1dF9zdHJpbmcgPSB0ZXh0OworICAgIHJsX2NhbGxiYWNrX2hhbmRsZXJfcmVtb3ZlKCk7CiB9CiAKIGV4dGVybiBQeVRocmVhZFN0YXRlKiBfUHlPU19SZWFkbGluZVRTdGF0ZTsKQEAgLTg4Miw2MCArODgyLDYwIEBACiBzdGF0aWMgY2hhciAqCiByZWFkbGluZV91bnRpbF9lbnRlcl9vcl9zaWduYWwoY2hhciAqcHJvbXB0LCBpbnQgKnNpZ25hbCkKIHsKLQljaGFyICogbm90X2RvbmVfcmVhZGluZyA9ICIiOwotCWZkX3NldCBzZWxlY3RzZXQ7CisgICAgY2hhciAqIG5vdF9kb25lX3JlYWRpbmcgPSAiIjsKKyAgICBmZF9zZXQgc2VsZWN0c2V0OwogCi0JKnNpZ25hbCA9IDA7CisgICAgKnNpZ25hbCA9IDA7CiAjaWZkZWYgSEFWRV9STF9DQVRDSF9TSUdOQUwKLQlybF9jYXRjaF9zaWduYWxzID0gMDsKKyAgICBybF9jYXRjaF9zaWduYWxzID0gMDsKICNlbmRpZgogCi0JcmxfY2FsbGJhY2tfaGFuZGxlcl9pbnN0YWxsIChwcm9tcHQsIHJsaGFuZGxlcik7Ci0JRkRfWkVSTygmc2VsZWN0c2V0KTsKLQkKLQljb21wbGV0ZWRfaW5wdXRfc3RyaW5nID0gbm90X2RvbmVfcmVhZGluZzsKKyAgICBybF9jYWxsYmFja19oYW5kbGVyX2luc3RhbGwgKHByb21wdCwgcmxoYW5kbGVyKTsKKyAgICBGRF9aRVJPKCZzZWxlY3RzZXQpOwogCi0Jd2hpbGUgKGNvbXBsZXRlZF9pbnB1dF9zdHJpbmcgPT0gbm90X2RvbmVfcmVhZGluZykgewotCQlpbnQgaGFzX2lucHV0ID0gMDsKKyAgICBjb21wbGV0ZWRfaW5wdXRfc3RyaW5nID0gbm90X2RvbmVfcmVhZGluZzsKIAotCQl3aGlsZSAoIWhhc19pbnB1dCkKLQkJewlzdHJ1Y3QgdGltZXZhbCB0aW1lb3V0ID0gezAsIDEwMDAwMH07IC8qIDAuMSBzZWNvbmRzICovCisgICAgd2hpbGUgKGNvbXBsZXRlZF9pbnB1dF9zdHJpbmcgPT0gbm90X2RvbmVfcmVhZGluZykgeworICAgICAgICBpbnQgaGFzX2lucHV0ID0gMDsKIAotCQkJLyogW0J1ZyAjMTU1MjcyNl0gT25seSBsaW1pdCB0aGUgcGF1c2UgaWYgYW4gaW5wdXQgaG9vayBoYXMgYmVlbiAKLQkJCSAgIGRlZmluZWQuICAqLwotCQkgCXN0cnVjdCB0aW1ldmFsICp0aW1lb3V0cCA9IE5VTEw7Ci0JCQlpZiAoUHlPU19JbnB1dEhvb2spIAotCQkJCXRpbWVvdXRwID0gJnRpbWVvdXQ7Ci0JCQlGRF9TRVQoZmlsZW5vKHJsX2luc3RyZWFtKSwgJnNlbGVjdHNldCk7Ci0JCQkvKiBzZWxlY3QgcmVzZXRzIHNlbGVjdHNldCBpZiBubyBpbnB1dCB3YXMgYXZhaWxhYmxlICovCi0JCQloYXNfaW5wdXQgPSBzZWxlY3QoZmlsZW5vKHJsX2luc3RyZWFtKSArIDEsICZzZWxlY3RzZXQsCi0JCQkJCSAgIE5VTEwsIE5VTEwsIHRpbWVvdXRwKTsKLQkJCWlmKFB5T1NfSW5wdXRIb29rKSBQeU9TX0lucHV0SG9vaygpOwotCQl9CisgICAgICAgIHdoaWxlICghaGFzX2lucHV0KQorICAgICAgICB7ICAgICAgICAgICAgICAgc3RydWN0IHRpbWV2YWwgdGltZW91dCA9IHswLCAxMDAwMDB9OyAvKiAwLjEgc2Vjb25kcyAqLwogCi0JCWlmKGhhc19pbnB1dCA+IDApIHsKLQkJCXJsX2NhbGxiYWNrX3JlYWRfY2hhcigpOwotCQl9Ci0JCWVsc2UgaWYgKGVycm5vID09IEVJTlRSKSB7Ci0JCQlpbnQgczsKKyAgICAgICAgICAgIC8qIFtCdWcgIzE1NTI3MjZdIE9ubHkgbGltaXQgdGhlIHBhdXNlIGlmIGFuIGlucHV0IGhvb2sgaGFzIGJlZW4KKyAgICAgICAgICAgICAgIGRlZmluZWQuICAqLworICAgICAgICAgICAgc3RydWN0IHRpbWV2YWwgKnRpbWVvdXRwID0gTlVMTDsKKyAgICAgICAgICAgIGlmIChQeU9TX0lucHV0SG9vaykKKyAgICAgICAgICAgICAgICB0aW1lb3V0cCA9ICZ0aW1lb3V0OworICAgICAgICAgICAgRkRfU0VUKGZpbGVubyhybF9pbnN0cmVhbSksICZzZWxlY3RzZXQpOworICAgICAgICAgICAgLyogc2VsZWN0IHJlc2V0cyBzZWxlY3RzZXQgaWYgbm8gaW5wdXQgd2FzIGF2YWlsYWJsZSAqLworICAgICAgICAgICAgaGFzX2lucHV0ID0gc2VsZWN0KGZpbGVubyhybF9pbnN0cmVhbSkgKyAxLCAmc2VsZWN0c2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIHRpbWVvdXRwKTsKKyAgICAgICAgICAgIGlmKFB5T1NfSW5wdXRIb29rKSBQeU9TX0lucHV0SG9vaygpOworICAgICAgICB9CisKKyAgICAgICAgaWYoaGFzX2lucHV0ID4gMCkgeworICAgICAgICAgICAgcmxfY2FsbGJhY2tfcmVhZF9jaGFyKCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoZXJybm8gPT0gRUlOVFIpIHsKKyAgICAgICAgICAgIGludCBzOwogI2lmZGVmIFdJVEhfVEhSRUFECi0JCQlQeUV2YWxfUmVzdG9yZVRocmVhZChfUHlPU19SZWFkbGluZVRTdGF0ZSk7CisgICAgICAgICAgICBQeUV2YWxfUmVzdG9yZVRocmVhZChfUHlPU19SZWFkbGluZVRTdGF0ZSk7CiAjZW5kaWYKLQkJCXMgPSBQeUVycl9DaGVja1NpZ25hbHMoKTsKKyAgICAgICAgICAgIHMgPSBQeUVycl9DaGVja1NpZ25hbHMoKTsKICNpZmRlZiBXSVRIX1RIUkVBRAotCQkJUHlFdmFsX1NhdmVUaHJlYWQoKTsJCisgICAgICAgICAgICBQeUV2YWxfU2F2ZVRocmVhZCgpOwogI2VuZGlmCi0JCQlpZiAocyA8IDApIHsKLQkJCQlybF9mcmVlX2xpbmVfc3RhdGUoKTsKLQkJCQlybF9jbGVhbnVwX2FmdGVyX3NpZ25hbCgpOwotCQkJCXJsX2NhbGxiYWNrX2hhbmRsZXJfcmVtb3ZlKCk7Ci0JCQkJKnNpZ25hbCA9IDE7Ci0JCQkJY29tcGxldGVkX2lucHV0X3N0cmluZyA9IE5VTEw7Ci0JCQl9Ci0JCX0KLQl9CisgICAgICAgICAgICBpZiAocyA8IDApIHsKKyAgICAgICAgICAgICAgICBybF9mcmVlX2xpbmVfc3RhdGUoKTsKKyAgICAgICAgICAgICAgICBybF9jbGVhbnVwX2FmdGVyX3NpZ25hbCgpOworICAgICAgICAgICAgICAgIHJsX2NhbGxiYWNrX2hhbmRsZXJfcmVtb3ZlKCk7CisgICAgICAgICAgICAgICAgKnNpZ25hbCA9IDE7CisgICAgICAgICAgICAgICAgY29tcGxldGVkX2lucHV0X3N0cmluZyA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAKLQlyZXR1cm4gY29tcGxldGVkX2lucHV0X3N0cmluZzsKKyAgICByZXR1cm4gY29tcGxldGVkX2lucHV0X3N0cmluZzsKIH0KIAogCkBAIC05NDksMzEgKzk0OSwzMSBAQAogc3RhdGljIHZvaWQKIG9uaW50cihpbnQgc2lnKQogewotCWxvbmdqbXAoamJ1ZiwgMSk7CisgICAgbG9uZ2ptcChqYnVmLCAxKTsKIH0KIAogCiBzdGF0aWMgY2hhciAqCiByZWFkbGluZV91bnRpbF9lbnRlcl9vcl9zaWduYWwoY2hhciAqcHJvbXB0LCBpbnQgKnNpZ25hbCkKIHsKLQlQeU9TX3NpZ2hhbmRsZXJfdCBvbGRfaW50aGFuZGxlcjsKLQljaGFyICpwOwotICAgIAotCSpzaWduYWwgPSAwOworICAgIFB5T1Nfc2lnaGFuZGxlcl90IG9sZF9pbnRoYW5kbGVyOworICAgIGNoYXIgKnA7CiAKLQlvbGRfaW50aGFuZGxlciA9IFB5T1Nfc2V0c2lnKFNJR0lOVCwgb25pbnRyKTsKLQlpZiAoc2V0am1wKGpidWYpKSB7CisgICAgKnNpZ25hbCA9IDA7CisKKyAgICBvbGRfaW50aGFuZGxlciA9IFB5T1Nfc2V0c2lnKFNJR0lOVCwgb25pbnRyKTsKKyAgICBpZiAoc2V0am1wKGpidWYpKSB7CiAjaWZkZWYgSEFWRV9TSUdSRUxTRQotCQkvKiBUaGlzIHNlZW1zIG5lY2Vzc2FyeSBvbiBTdW5PUyA0LjEgKFJhc211cyBIYWhuKSAqLwotCQlzaWdyZWxzZShTSUdJTlQpOworICAgICAgICAvKiBUaGlzIHNlZW1zIG5lY2Vzc2FyeSBvbiBTdW5PUyA0LjEgKFJhc211cyBIYWhuKSAqLworICAgICAgICBzaWdyZWxzZShTSUdJTlQpOwogI2VuZGlmCi0JCVB5T1Nfc2V0c2lnKFNJR0lOVCwgb2xkX2ludGhhbmRsZXIpOwotCQkqc2lnbmFsID0gMTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJsX2V2ZW50X2hvb2sgPSBQeU9TX0lucHV0SG9vazsKLQlwID0gcmVhZGxpbmUocHJvbXB0KTsKLQlQeU9TX3NldHNpZyhTSUdJTlQsIG9sZF9pbnRoYW5kbGVyKTsKKyAgICAgICAgUHlPU19zZXRzaWcoU0lHSU5ULCBvbGRfaW50aGFuZGxlcik7CisgICAgICAgICpzaWduYWwgPSAxOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmxfZXZlbnRfaG9vayA9IFB5T1NfSW5wdXRIb29rOworICAgIHAgPSByZWFkbGluZShwcm9tcHQpOworICAgIFB5T1Nfc2V0c2lnKFNJR0lOVCwgb2xkX2ludGhhbmRsZXIpOwogCiAgICAgcmV0dXJuIHA7CiB9CkBAIC05ODMsODIgKzk4Myw4MiBAQAogc3RhdGljIGNoYXIgKgogY2FsbF9yZWFkbGluZShGSUxFICpzeXNfc3RkaW4sIEZJTEUgKnN5c19zdGRvdXQsIGNoYXIgKnByb21wdCkKIHsKLQlzaXplX3QgbjsKLQljaGFyICpwLCAqcTsKLQlpbnQgc2lnbmFsOworICAgIHNpemVfdCBuOworICAgIGNoYXIgKnAsICpxOworICAgIGludCBzaWduYWw7CiAKICNpZmRlZiBTQVZFX0xPQ0FMRQotCWNoYXIgKnNhdmVkX2xvY2FsZSA9IHN0cmR1cChzZXRsb2NhbGUoTENfQ1RZUEUsIE5VTEwpKTsKLQlpZiAoIXNhdmVkX2xvY2FsZSkKLQkJUHlfRmF0YWxFcnJvcigibm90IGVub3VnaCBtZW1vcnkgdG8gc2F2ZSBsb2NhbGUiKTsKLQlzZXRsb2NhbGUoTENfQ1RZUEUsICIiKTsKKyAgICBjaGFyICpzYXZlZF9sb2NhbGUgPSBzdHJkdXAoc2V0bG9jYWxlKExDX0NUWVBFLCBOVUxMKSk7CisgICAgaWYgKCFzYXZlZF9sb2NhbGUpCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIm5vdCBlbm91Z2ggbWVtb3J5IHRvIHNhdmUgbG9jYWxlIik7CisgICAgc2V0bG9jYWxlKExDX0NUWVBFLCAiIik7CiAjZW5kaWYKIAotCWlmIChzeXNfc3RkaW4gIT0gcmxfaW5zdHJlYW0gfHwgc3lzX3N0ZG91dCAhPSBybF9vdXRzdHJlYW0pIHsKLQkJcmxfaW5zdHJlYW0gPSBzeXNfc3RkaW47Ci0JCXJsX291dHN0cmVhbSA9IHN5c19zdGRvdXQ7CisgICAgaWYgKHN5c19zdGRpbiAhPSBybF9pbnN0cmVhbSB8fCBzeXNfc3Rkb3V0ICE9IHJsX291dHN0cmVhbSkgeworICAgICAgICBybF9pbnN0cmVhbSA9IHN5c19zdGRpbjsKKyAgICAgICAgcmxfb3V0c3RyZWFtID0gc3lzX3N0ZG91dDsKICNpZmRlZiBIQVZFX1JMX0NPTVBMRVRJT05fQVBQRU5EX0NIQVJBQ1RFUgotCQlybF9wcmVwX3Rlcm1pbmFsICgxKTsKKyAgICAgICAgcmxfcHJlcF90ZXJtaW5hbCAoMSk7CiAjZW5kaWYKLQl9CisgICAgfQogCi0JcCA9IHJlYWRsaW5lX3VudGlsX2VudGVyX29yX3NpZ25hbChwcm9tcHQsICZzaWduYWwpOwotCQotCS8qIHdlIGdvdCBhbiBpbnRlcnJ1cHQgc2lnbmFsICovCi0JaWYgKHNpZ25hbCkgewotCQlSRVNUT1JFX0xPQ0FMRShzYXZlZF9sb2NhbGUpCi0JCXJldHVybiBOVUxMOwotCX0KKyAgICBwID0gcmVhZGxpbmVfdW50aWxfZW50ZXJfb3Jfc2lnbmFsKHByb21wdCwgJnNpZ25hbCk7CiAKLQkvKiBXZSBnb3QgYW4gRU9GLCByZXR1cm4gYSBlbXB0eSBzdHJpbmcuICovCi0JaWYgKHAgPT0gTlVMTCkgewotCQlwID0gUHlNZW1fTWFsbG9jKDEpOwotCQlpZiAocCAhPSBOVUxMKQotCQkJKnAgPSAnXDAnOwotCQlSRVNUT1JFX0xPQ0FMRShzYXZlZF9sb2NhbGUpCi0JCXJldHVybiBwOwotCX0KKyAgICAvKiB3ZSBnb3QgYW4gaW50ZXJydXB0IHNpZ25hbCAqLworICAgIGlmIChzaWduYWwpIHsKKyAgICAgICAgUkVTVE9SRV9MT0NBTEUoc2F2ZWRfbG9jYWxlKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQkvKiB3ZSBoYXZlIGEgdmFsaWQgbGluZSAqLwotCW4gPSBzdHJsZW4ocCk7Ci0JaWYgKG4gPiAwKSB7Ci0JCWNoYXIgKmxpbmU7Ci0JCUhJU1RPUllfU1RBVEUgKnN0YXRlID0gaGlzdG9yeV9nZXRfaGlzdG9yeV9zdGF0ZSgpOwotCQlpZiAoc3RhdGUtPmxlbmd0aCA+IDApCisgICAgLyogV2UgZ290IGFuIEVPRiwgcmV0dXJuIGEgZW1wdHkgc3RyaW5nLiAqLworICAgIGlmIChwID09IE5VTEwpIHsKKyAgICAgICAgcCA9IFB5TWVtX01hbGxvYygxKTsKKyAgICAgICAgaWYgKHAgIT0gTlVMTCkKKyAgICAgICAgICAgICpwID0gJ1wwJzsKKyAgICAgICAgUkVTVE9SRV9MT0NBTEUoc2F2ZWRfbG9jYWxlKQorICAgICAgICByZXR1cm4gcDsKKyAgICB9CisKKyAgICAvKiB3ZSBoYXZlIGEgdmFsaWQgbGluZSAqLworICAgIG4gPSBzdHJsZW4ocCk7CisgICAgaWYgKG4gPiAwKSB7CisgICAgICAgIGNoYXIgKmxpbmU7CisgICAgICAgIEhJU1RPUllfU1RBVEUgKnN0YXRlID0gaGlzdG9yeV9nZXRfaGlzdG9yeV9zdGF0ZSgpOworICAgICAgICBpZiAoc3RhdGUtPmxlbmd0aCA+IDApCiAjaWZkZWYgX19BUFBMRV9fCi0JCQlpZiAodXNpbmdfbGliZWRpdF9lbXVsYXRpb24pIHsKLQkJCQkvKiAKLQkJCQkgKiBMaWJlZGl0J3MgZW11bGF0aW9uIHVzZXMgMC1iYXNlZCBpbmRleGVzLAotCQkJCSAqIHRoZSByZWFsIHJlYWRsaW5lIHVzZXMgMS1iYXNlZCBpbmRleGVzLgotCQkJCSAqLwotCQkJCWxpbmUgPSBoaXN0b3J5X2dldChzdGF0ZS0+bGVuZ3RoIC0gMSktPmxpbmU7Ci0JCQl9IGVsc2UgCisgICAgICAgICAgICBpZiAodXNpbmdfbGliZWRpdF9lbXVsYXRpb24pIHsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIExpYmVkaXQncyBlbXVsYXRpb24gdXNlcyAwLWJhc2VkIGluZGV4ZXMsCisgICAgICAgICAgICAgICAgICogdGhlIHJlYWwgcmVhZGxpbmUgdXNlcyAxLWJhc2VkIGluZGV4ZXMuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgbGluZSA9IGhpc3RvcnlfZ2V0KHN0YXRlLT5sZW5ndGggLSAxKS0+bGluZTsKKyAgICAgICAgICAgIH0gZWxzZQogI2VuZGlmIC8qIF9fQVBQTEVfXyAqLwotCQkJbGluZSA9IGhpc3RvcnlfZ2V0KHN0YXRlLT5sZW5ndGgpLT5saW5lOwotCQllbHNlCi0JCQlsaW5lID0gIiI7Ci0JCWlmIChzdHJjbXAocCwgbGluZSkpCi0JCQlhZGRfaGlzdG9yeShwKTsKLQkJLyogdGhlIGhpc3RvcnkgZG9jcyBkb24ndCBzYXkgc28sIGJ1dCB0aGUgYWRkcmVzcyBvZiBzdGF0ZQotCQkgICBjaGFuZ2VzIGVhY2ggdGltZSBoaXN0b3J5X2dldF9oaXN0b3J5X3N0YXRlIGlzIGNhbGxlZAotCQkgICB3aGljaCBtYWtlcyBtZSB0aGluayBpdCdzIGZyZXNobHkgbWFsbG9jJ2QgbWVtb3J5Li4uCi0JCSAgIG9uIHRoZSBvdGhlciBoYW5kLCB0aGUgYWRkcmVzcyBvZiB0aGUgbGFzdCBsaW5lIHN0YXlzIHRoZQotCQkgICBzYW1lIGFzIGxvbmcgYXMgaGlzdG9yeSBpc24ndCBleHRlbmRlZCwgc28gaXQgYXBwZWFycyB0bwotCQkgICBiZSBtYWxsb2MnZCBidXQgbWFuYWdlZCBieSB0aGUgaGlzdG9yeSBwYWNrYWdlLi4uICovCi0JCWZyZWUoc3RhdGUpOwotCX0KLQkvKiBDb3B5IHRoZSBtYWxsb2MnZWQgYnVmZmVyIGludG8gYSBQeU1lbV9NYWxsb2MnZWQgb25lIGFuZAotCSAgIHJlbGVhc2UgdGhlIG9yaWdpbmFsLiAqLwotCXEgPSBwOwotCXAgPSBQeU1lbV9NYWxsb2MobisyKTsKLQlpZiAocCAhPSBOVUxMKSB7Ci0JCXN0cm5jcHkocCwgcSwgbik7Ci0JCXBbbl0gPSAnXG4nOwotCQlwW24rMV0gPSAnXDAnOwotCX0KLQlmcmVlKHEpOwotCVJFU1RPUkVfTE9DQUxFKHNhdmVkX2xvY2FsZSkKLQlyZXR1cm4gcDsKKyAgICAgICAgICAgIGxpbmUgPSBoaXN0b3J5X2dldChzdGF0ZS0+bGVuZ3RoKS0+bGluZTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbGluZSA9ICIiOworICAgICAgICBpZiAoc3RyY21wKHAsIGxpbmUpKQorICAgICAgICAgICAgYWRkX2hpc3RvcnkocCk7CisgICAgICAgIC8qIHRoZSBoaXN0b3J5IGRvY3MgZG9uJ3Qgc2F5IHNvLCBidXQgdGhlIGFkZHJlc3Mgb2Ygc3RhdGUKKyAgICAgICAgICAgY2hhbmdlcyBlYWNoIHRpbWUgaGlzdG9yeV9nZXRfaGlzdG9yeV9zdGF0ZSBpcyBjYWxsZWQKKyAgICAgICAgICAgd2hpY2ggbWFrZXMgbWUgdGhpbmsgaXQncyBmcmVzaGx5IG1hbGxvYydkIG1lbW9yeS4uLgorICAgICAgICAgICBvbiB0aGUgb3RoZXIgaGFuZCwgdGhlIGFkZHJlc3Mgb2YgdGhlIGxhc3QgbGluZSBzdGF5cyB0aGUKKyAgICAgICAgICAgc2FtZSBhcyBsb25nIGFzIGhpc3RvcnkgaXNuJ3QgZXh0ZW5kZWQsIHNvIGl0IGFwcGVhcnMgdG8KKyAgICAgICAgICAgYmUgbWFsbG9jJ2QgYnV0IG1hbmFnZWQgYnkgdGhlIGhpc3RvcnkgcGFja2FnZS4uLiAqLworICAgICAgICBmcmVlKHN0YXRlKTsKKyAgICB9CisgICAgLyogQ29weSB0aGUgbWFsbG9jJ2VkIGJ1ZmZlciBpbnRvIGEgUHlNZW1fTWFsbG9jJ2VkIG9uZSBhbmQKKyAgICAgICByZWxlYXNlIHRoZSBvcmlnaW5hbC4gKi8KKyAgICBxID0gcDsKKyAgICBwID0gUHlNZW1fTWFsbG9jKG4rMik7CisgICAgaWYgKHAgIT0gTlVMTCkgeworICAgICAgICBzdHJuY3B5KHAsIHEsIG4pOworICAgICAgICBwW25dID0gJ1xuJzsKKyAgICAgICAgcFtuKzFdID0gJ1wwJzsKKyAgICB9CisgICAgZnJlZShxKTsKKyAgICBSRVNUT1JFX0xPQ0FMRShzYXZlZF9sb2NhbGUpCisgICAgcmV0dXJuIHA7CiB9CiAKIApAQCAtMTA3NSwyNyArMTA3NSwyNyBAQAogUHlNT0RJTklUX0ZVTkMKIGluaXRyZWFkbGluZSh2b2lkKQogewotCVB5T2JqZWN0ICptOworICAgIFB5T2JqZWN0ICptOwogCiAjaWZkZWYgX19BUFBMRV9fCi0JaWYgKHN0cm5jbXAocmxfbGlicmFyeV92ZXJzaW9uLCBsaWJlZGl0X3ZlcnNpb25fdGFnLCBzdHJsZW4obGliZWRpdF92ZXJzaW9uX3RhZykpID09IDApIHsKLQkJdXNpbmdfbGliZWRpdF9lbXVsYXRpb24gPSAxOwotCX0KKyAgICBpZiAoc3RybmNtcChybF9saWJyYXJ5X3ZlcnNpb24sIGxpYmVkaXRfdmVyc2lvbl90YWcsIHN0cmxlbihsaWJlZGl0X3ZlcnNpb25fdGFnKSkgPT0gMCkgeworICAgICAgICB1c2luZ19saWJlZGl0X2VtdWxhdGlvbiA9IDE7CisgICAgfQogCi0JaWYgKHVzaW5nX2xpYmVkaXRfZW11bGF0aW9uKSAKLQkJbSA9IFB5X0luaXRNb2R1bGU0KCJyZWFkbGluZSIsIHJlYWRsaW5lX21ldGhvZHMsIGRvY19tb2R1bGVfbGUsCi0JCQkgICAoUHlPYmplY3QgKilOVUxMLCBQWVRIT05fQVBJX1ZFUlNJT04pOwotCWVsc2UKKyAgICBpZiAodXNpbmdfbGliZWRpdF9lbXVsYXRpb24pCisgICAgICAgIG0gPSBQeV9Jbml0TW9kdWxlNCgicmVhZGxpbmUiLCByZWFkbGluZV9tZXRob2RzLCBkb2NfbW9kdWxlX2xlLAorICAgICAgICAgICAgICAgICAgIChQeU9iamVjdCAqKU5VTEwsIFBZVEhPTl9BUElfVkVSU0lPTik7CisgICAgZWxzZQogCiAjZW5kaWYgLyogX19BUFBMRV9fICovCiAKLQltID0gUHlfSW5pdE1vZHVsZTQoInJlYWRsaW5lIiwgcmVhZGxpbmVfbWV0aG9kcywgZG9jX21vZHVsZSwKLQkJCSAgIChQeU9iamVjdCAqKU5VTEwsIFBZVEhPTl9BUElfVkVSU0lPTik7Ci0JaWYgKG0gPT0gTlVMTCkKLQkJcmV0dXJuOworICAgIG0gPSBQeV9Jbml0TW9kdWxlNCgicmVhZGxpbmUiLCByZWFkbGluZV9tZXRob2RzLCBkb2NfbW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAoUHlPYmplY3QgKilOVUxMLCBQWVRIT05fQVBJX1ZFUlNJT04pOworICAgIGlmIChtID09IE5VTEwpCisgICAgICAgIHJldHVybjsKIAogCiAKLQlQeU9TX1JlYWRsaW5lRnVuY3Rpb25Qb2ludGVyID0gY2FsbF9yZWFkbGluZTsKLQlzZXR1cF9yZWFkbGluZSgpOworICAgIFB5T1NfUmVhZGxpbmVGdW5jdGlvblBvaW50ZXIgPSBjYWxsX3JlYWRsaW5lOworICAgIHNldHVwX3JlYWRsaW5lKCk7CiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3Jlc291cmNlLmMgYi9Nb2R1bGVzL3Jlc291cmNlLmMKaW5kZXggMzg5NzRmOS4uOTk5M2I5MyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9yZXNvdXJjZS5jCisrKyBiL01vZHVsZXMvcmVzb3VyY2UuYwpAQCAtMjksMzAgKzI5LDMwIEBACiAib3IgdmlhIHRoZSBhdHRyaWJ1dGVzIHJ1X3V0aW1lLCBydV9zdGltZSwgcnVfbWF4cnNzLCBhbmQgc28gb24uIik7CiAKIHN0YXRpYyBQeVN0cnVjdFNlcXVlbmNlX0ZpZWxkIHN0cnVjdF9ydXNhZ2VfZmllbGRzW10gPSB7Ci0JeyJydV91dGltZSIsCSJ1c2VyIHRpbWUgdXNlZCJ9LAotCXsicnVfc3RpbWUiLAkic3lzdGVtIHRpbWUgdXNlZCJ9LAotCXsicnVfbWF4cnNzIiwJIm1heC4gcmVzaWRlbnQgc2V0IHNpemUifSwKLQl7InJ1X2l4cnNzIiwJInNoYXJlZCBtZW1vcnkgc2l6ZSJ9LAotCXsicnVfaWRyc3MiLAkidW5zaGFyZWQgZGF0YSBzaXplIn0sCi0JeyJydV9pc3JzcyIsCSJ1bnNoYXJlZCBzdGFjayBzaXplIn0sCi0JeyJydV9taW5mbHQiLAkicGFnZSBmYXVsdHMgbm90IHJlcXVpcmluZyBJL08ifSwKLQl7InJ1X21hamZsdCIsCSJwYWdlIGZhdWx0cyByZXF1aXJpbmcgSS9PIn0sCi0JeyJydV9uc3dhcCIsCSJudW1iZXIgb2Ygc3dhcCBvdXRzIn0sCi0JeyJydV9pbmJsb2NrIiwJImJsb2NrIGlucHV0IG9wZXJhdGlvbnMifSwKLQl7InJ1X291YmxvY2siLAkiYmxvY2sgb3V0cHV0IG9wZXJhdGlvbnMifSwKLQl7InJ1X21zZ3NuZCIsCSJJUEMgbWVzc2FnZXMgc2VudCJ9LAotCXsicnVfbXNncmN2IiwJIklQQyBtZXNzYWdlcyByZWNlaXZlZCJ9LAotCXsicnVfbnNpZ25hbHMiLAkic2lnbmFscyByZWNlaXZlZCJ9LAotCXsicnVfbnZjc3ciLAkidm9sdW50YXJ5IGNvbnRleHQgc3dpdGNoZXMifSwKLQl7InJ1X25pdmNzdyIsCSJpbnZvbHVudGFyeSBjb250ZXh0IHN3aXRjaGVzIn0sCi0JezB9CisgICAgeyJydV91dGltZSIsICAgICAgICAidXNlciB0aW1lIHVzZWQifSwKKyAgICB7InJ1X3N0aW1lIiwgICAgICAgICJzeXN0ZW0gdGltZSB1c2VkIn0sCisgICAgeyJydV9tYXhyc3MiLCAgICAgICAibWF4LiByZXNpZGVudCBzZXQgc2l6ZSJ9LAorICAgIHsicnVfaXhyc3MiLCAgICAgICAgInNoYXJlZCBtZW1vcnkgc2l6ZSJ9LAorICAgIHsicnVfaWRyc3MiLCAgICAgICAgInVuc2hhcmVkIGRhdGEgc2l6ZSJ9LAorICAgIHsicnVfaXNyc3MiLCAgICAgICAgInVuc2hhcmVkIHN0YWNrIHNpemUifSwKKyAgICB7InJ1X21pbmZsdCIsICAgICAgICJwYWdlIGZhdWx0cyBub3QgcmVxdWlyaW5nIEkvTyJ9LAorICAgIHsicnVfbWFqZmx0IiwgICAgICAgInBhZ2UgZmF1bHRzIHJlcXVpcmluZyBJL08ifSwKKyAgICB7InJ1X25zd2FwIiwgICAgICAgICJudW1iZXIgb2Ygc3dhcCBvdXRzIn0sCisgICAgeyJydV9pbmJsb2NrIiwgICAgICAiYmxvY2sgaW5wdXQgb3BlcmF0aW9ucyJ9LAorICAgIHsicnVfb3VibG9jayIsICAgICAgImJsb2NrIG91dHB1dCBvcGVyYXRpb25zIn0sCisgICAgeyJydV9tc2dzbmQiLCAgICAgICAiSVBDIG1lc3NhZ2VzIHNlbnQifSwKKyAgICB7InJ1X21zZ3JjdiIsICAgICAgICJJUEMgbWVzc2FnZXMgcmVjZWl2ZWQifSwKKyAgICB7InJ1X25zaWduYWxzIiwgICAgICJzaWduYWxzIHJlY2VpdmVkIn0sCisgICAgeyJydV9udmNzdyIsICAgICAgICAidm9sdW50YXJ5IGNvbnRleHQgc3dpdGNoZXMifSwKKyAgICB7InJ1X25pdmNzdyIsICAgICAgICJpbnZvbHVudGFyeSBjb250ZXh0IHN3aXRjaGVzIn0sCisgICAgezB9CiB9OwogCiBzdGF0aWMgUHlTdHJ1Y3RTZXF1ZW5jZV9EZXNjIHN0cnVjdF9ydXNhZ2VfZGVzYyA9IHsKLQkicmVzb3VyY2Uuc3RydWN0X3J1c2FnZSIsCS8qIG5hbWUgKi8KLQlzdHJ1Y3RfcnVzYWdlX19kb2NfXywJLyogZG9jICovCi0Jc3RydWN0X3J1c2FnZV9maWVsZHMsCS8qIGZpZWxkcyAqLwotCTE2CS8qIG5faW5fc2VxdWVuY2UgKi8KKyAgICAicmVzb3VyY2Uuc3RydWN0X3J1c2FnZSIsICAgICAgICAgICAvKiBuYW1lICovCisgICAgc3RydWN0X3J1c2FnZV9fZG9jX18sICAgICAgIC8qIGRvYyAqLworICAgIHN0cnVjdF9ydXNhZ2VfZmllbGRzLCAgICAgICAvKiBmaWVsZHMgKi8KKyAgICAxNiAgICAgICAgICAvKiBuX2luX3NlcXVlbmNlICovCiB9OwogCiBzdGF0aWMgaW50IGluaXRpYWxpemVkOwpAQCAtNjEsMTUzICs2MSwxNTMgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiByZXNvdXJjZV9nZXRydXNhZ2UoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCB3aG87Ci0Jc3RydWN0IHJ1c2FnZSBydTsKLQlQeU9iamVjdCAqcmVzdWx0OworICAgIGludCB3aG87CisgICAgc3RydWN0IHJ1c2FnZSBydTsKKyAgICBQeU9iamVjdCAqcmVzdWx0OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOmdldHJ1c2FnZSIsICZ3aG8pKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6Z2V0cnVzYWdlIiwgJndobykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKGdldHJ1c2FnZSh3aG8sICZydSkgPT0gLTEpIHsKLQkJaWYgKGVycm5vID09IEVJTlZBTCkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJCSJpbnZhbGlkIHdobyBwYXJhbWV0ZXIiKTsKLQkJCXJldHVybiBOVUxMOwotCQl9IAotCQlQeUVycl9TZXRGcm9tRXJybm8oUmVzb3VyY2VFcnJvcik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoZ2V0cnVzYWdlKHdobywgJnJ1KSA9PSAtMSkgeworICAgICAgICBpZiAoZXJybm8gPT0gRUlOVkFMKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCB3aG8gcGFyYW1ldGVyIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oUmVzb3VyY2VFcnJvcik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXJlc3VsdCA9IFB5U3RydWN0U2VxdWVuY2VfTmV3KCZTdHJ1Y3RSVXNhZ2VUeXBlKTsKLQlpZiAoIXJlc3VsdCkKLQkJcmV0dXJuIE5VTEw7CisgICAgcmVzdWx0ID0gUHlTdHJ1Y3RTZXF1ZW5jZV9OZXcoJlN0cnVjdFJVc2FnZVR5cGUpOworICAgIGlmICghcmVzdWx0KQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCVB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0ocmVzdWx0LCAwLAotCQkJUHlGbG9hdF9Gcm9tRG91YmxlKGRvdWJsZXRpbWUocnUucnVfdXRpbWUpKSk7Ci0JUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTShyZXN1bHQsIDEsCi0JCQlQeUZsb2F0X0Zyb21Eb3VibGUoZG91YmxldGltZShydS5ydV9zdGltZSkpKTsKLQlQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHJlc3VsdCwgMiwgUHlJbnRfRnJvbUxvbmcocnUucnVfbWF4cnNzKSk7Ci0JUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTShyZXN1bHQsIDMsIFB5SW50X0Zyb21Mb25nKHJ1LnJ1X2l4cnNzKSk7Ci0JUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTShyZXN1bHQsIDQsIFB5SW50X0Zyb21Mb25nKHJ1LnJ1X2lkcnNzKSk7Ci0JUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTShyZXN1bHQsIDUsIFB5SW50X0Zyb21Mb25nKHJ1LnJ1X2lzcnNzKSk7Ci0JUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTShyZXN1bHQsIDYsIFB5SW50X0Zyb21Mb25nKHJ1LnJ1X21pbmZsdCkpOwotCVB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0ocmVzdWx0LCA3LCBQeUludF9Gcm9tTG9uZyhydS5ydV9tYWpmbHQpKTsKLQlQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHJlc3VsdCwgOCwgUHlJbnRfRnJvbUxvbmcocnUucnVfbnN3YXApKTsKLQlQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHJlc3VsdCwgOSwgUHlJbnRfRnJvbUxvbmcocnUucnVfaW5ibG9jaykpOwotCVB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0ocmVzdWx0LCAxMCwgUHlJbnRfRnJvbUxvbmcocnUucnVfb3VibG9jaykpOwotCVB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0ocmVzdWx0LCAxMSwgUHlJbnRfRnJvbUxvbmcocnUucnVfbXNnc25kKSk7Ci0JUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTShyZXN1bHQsIDEyLCBQeUludF9Gcm9tTG9uZyhydS5ydV9tc2dyY3YpKTsKLQlQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHJlc3VsdCwgMTMsIFB5SW50X0Zyb21Mb25nKHJ1LnJ1X25zaWduYWxzKSk7Ci0JUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTShyZXN1bHQsIDE0LCBQeUludF9Gcm9tTG9uZyhydS5ydV9udmNzdykpOwotCVB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0ocmVzdWx0LCAxNSwgUHlJbnRfRnJvbUxvbmcocnUucnVfbml2Y3N3KSk7CisgICAgUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTShyZXN1bHQsIDAsCisgICAgICAgICAgICAgICAgICAgIFB5RmxvYXRfRnJvbURvdWJsZShkb3VibGV0aW1lKHJ1LnJ1X3V0aW1lKSkpOworICAgIFB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0ocmVzdWx0LCAxLAorICAgICAgICAgICAgICAgICAgICBQeUZsb2F0X0Zyb21Eb3VibGUoZG91YmxldGltZShydS5ydV9zdGltZSkpKTsKKyAgICBQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHJlc3VsdCwgMiwgUHlJbnRfRnJvbUxvbmcocnUucnVfbWF4cnNzKSk7CisgICAgUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTShyZXN1bHQsIDMsIFB5SW50X0Zyb21Mb25nKHJ1LnJ1X2l4cnNzKSk7CisgICAgUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTShyZXN1bHQsIDQsIFB5SW50X0Zyb21Mb25nKHJ1LnJ1X2lkcnNzKSk7CisgICAgUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTShyZXN1bHQsIDUsIFB5SW50X0Zyb21Mb25nKHJ1LnJ1X2lzcnNzKSk7CisgICAgUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTShyZXN1bHQsIDYsIFB5SW50X0Zyb21Mb25nKHJ1LnJ1X21pbmZsdCkpOworICAgIFB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0ocmVzdWx0LCA3LCBQeUludF9Gcm9tTG9uZyhydS5ydV9tYWpmbHQpKTsKKyAgICBQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHJlc3VsdCwgOCwgUHlJbnRfRnJvbUxvbmcocnUucnVfbnN3YXApKTsKKyAgICBQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHJlc3VsdCwgOSwgUHlJbnRfRnJvbUxvbmcocnUucnVfaW5ibG9jaykpOworICAgIFB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0ocmVzdWx0LCAxMCwgUHlJbnRfRnJvbUxvbmcocnUucnVfb3VibG9jaykpOworICAgIFB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0ocmVzdWx0LCAxMSwgUHlJbnRfRnJvbUxvbmcocnUucnVfbXNnc25kKSk7CisgICAgUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTShyZXN1bHQsIDEyLCBQeUludF9Gcm9tTG9uZyhydS5ydV9tc2dyY3YpKTsKKyAgICBQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHJlc3VsdCwgMTMsIFB5SW50X0Zyb21Mb25nKHJ1LnJ1X25zaWduYWxzKSk7CisgICAgUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTShyZXN1bHQsIDE0LCBQeUludF9Gcm9tTG9uZyhydS5ydV9udmNzdykpOworICAgIFB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0ocmVzdWx0LCAxNSwgUHlJbnRfRnJvbUxvbmcocnUucnVfbml2Y3N3KSk7CiAKLQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkgewotCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlyZXR1cm4gcmVzdWx0OworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIAogc3RhdGljIFB5T2JqZWN0ICoKIHJlc291cmNlX2dldHJsaW1pdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc3RydWN0IHJsaW1pdCBybDsKLQlpbnQgcmVzb3VyY2U7CisgICAgc3RydWN0IHJsaW1pdCBybDsKKyAgICBpbnQgcmVzb3VyY2U7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6Z2V0cmxpbWl0IiwgJnJlc291cmNlKSkgCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpnZXRybGltaXQiLCAmcmVzb3VyY2UpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChyZXNvdXJjZSA8IDAgfHwgcmVzb3VyY2UgPj0gUkxJTV9OTElNSVRTKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJpbnZhbGlkIHJlc291cmNlIHNwZWNpZmllZCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKHJlc291cmNlIDwgMCB8fCByZXNvdXJjZSA+PSBSTElNX05MSU1JVFMpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCByZXNvdXJjZSBzcGVjaWZpZWQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaWYgKGdldHJsaW1pdChyZXNvdXJjZSwgJnJsKSA9PSAtMSkgewotCQlQeUVycl9TZXRGcm9tRXJybm8oUmVzb3VyY2VFcnJvcik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoZ2V0cmxpbWl0KHJlc291cmNlLCAmcmwpID09IC0xKSB7CisgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhSZXNvdXJjZUVycm9yKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCiAjaWYgZGVmaW5lZChIQVZFX0xPTkdfTE9ORykKLQlpZiAoc2l6ZW9mKHJsLnJsaW1fY3VyKSA+IHNpemVvZihsb25nKSkgewotCQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTEwiLAotCQkJCSAgICAgKFBZX0xPTkdfTE9ORykgcmwucmxpbV9jdXIsCi0JCQkJICAgICAoUFlfTE9OR19MT05HKSBybC5ybGltX21heCk7Ci0JfQorICAgIGlmIChzaXplb2YocmwucmxpbV9jdXIpID4gc2l6ZW9mKGxvbmcpKSB7CisgICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJMTCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQWV9MT05HX0xPTkcpIHJsLnJsaW1fY3VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUFlfTE9OR19MT05HKSBybC5ybGltX21heCk7CisgICAgfQogI2VuZGlmCi0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImxsIiwgKGxvbmcpIHJsLnJsaW1fY3VyLCAobG9uZykgcmwucmxpbV9tYXgpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJsbCIsIChsb25nKSBybC5ybGltX2N1ciwgKGxvbmcpIHJsLnJsaW1fbWF4KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHJlc291cmNlX3NldHJsaW1pdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc3RydWN0IHJsaW1pdCBybDsKLQlpbnQgcmVzb3VyY2U7Ci0JUHlPYmplY3QgKmN1cm9iaiwgKm1heG9iajsKKyAgICBzdHJ1Y3QgcmxpbWl0IHJsOworICAgIGludCByZXNvdXJjZTsKKyAgICBQeU9iamVjdCAqY3Vyb2JqLCAqbWF4b2JqOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpKE9PKTpzZXRybGltaXQiLAotCQkJICAgICAgJnJlc291cmNlLCAmY3Vyb2JqLCAmbWF4b2JqKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpKE9PKTpzZXRybGltaXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzb3VyY2UsICZjdXJvYmosICZtYXhvYmopKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChyZXNvdXJjZSA8IDAgfHwgcmVzb3VyY2UgPj0gUkxJTV9OTElNSVRTKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJpbnZhbGlkIHJlc291cmNlIHNwZWNpZmllZCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKHJlc291cmNlIDwgMCB8fCByZXNvdXJjZSA+PSBSTElNX05MSU1JVFMpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCByZXNvdXJjZSBzcGVjaWZpZWQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCiAjaWYgIWRlZmluZWQoSEFWRV9MQVJHRUZJTEVfU1VQUE9SVCkKLQlybC5ybGltX2N1ciA9IFB5SW50X0FzTG9uZyhjdXJvYmopOwotCWlmIChybC5ybGltX2N1ciA9PSAocmxpbV90KS0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JICAgIHJldHVybiBOVUxMOwotCXJsLnJsaW1fbWF4ID0gUHlJbnRfQXNMb25nKG1heG9iaik7Ci0JaWYgKHJsLnJsaW1fbWF4ID09IChybGltX3QpLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkgICAgcmV0dXJuIE5VTEw7CisgICAgcmwucmxpbV9jdXIgPSBQeUludF9Bc0xvbmcoY3Vyb2JqKTsKKyAgICBpZiAocmwucmxpbV9jdXIgPT0gKHJsaW1fdCktMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBybC5ybGltX21heCA9IFB5SW50X0FzTG9uZyhtYXhvYmopOworICAgIGlmIChybC5ybGltX21heCA9PSAocmxpbV90KS0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiBOVUxMOwogI2Vsc2UKLQkvKiBUaGUgbGltaXRzIGFyZSBwcm9iYWJseSBiaWdnZXIgdGhhbiBhIGxvbmcgKi8KLQlybC5ybGltX2N1ciA9IFB5TG9uZ19DaGVjayhjdXJvYmopID8KLQkJUHlMb25nX0FzTG9uZ0xvbmcoY3Vyb2JqKSA6IFB5SW50X0FzTG9uZyhjdXJvYmopOwotCWlmIChybC5ybGltX2N1ciA9PSAocmxpbV90KS0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JICAgIHJldHVybiBOVUxMOwotCXJsLnJsaW1fbWF4ID0gUHlMb25nX0NoZWNrKG1heG9iaikgPwotCQlQeUxvbmdfQXNMb25nTG9uZyhtYXhvYmopIDogUHlJbnRfQXNMb25nKG1heG9iaik7Ci0JaWYgKHJsLnJsaW1fbWF4ID09IChybGltX3QpLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkgICAgcmV0dXJuIE5VTEw7CisgICAgLyogVGhlIGxpbWl0cyBhcmUgcHJvYmFibHkgYmlnZ2VyIHRoYW4gYSBsb25nICovCisgICAgcmwucmxpbV9jdXIgPSBQeUxvbmdfQ2hlY2soY3Vyb2JqKSA/CisgICAgICAgIFB5TG9uZ19Bc0xvbmdMb25nKGN1cm9iaikgOiBQeUludF9Bc0xvbmcoY3Vyb2JqKTsKKyAgICBpZiAocmwucmxpbV9jdXIgPT0gKHJsaW1fdCktMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBybC5ybGltX21heCA9IFB5TG9uZ19DaGVjayhtYXhvYmopID8KKyAgICAgICAgUHlMb25nX0FzTG9uZ0xvbmcobWF4b2JqKSA6IFB5SW50X0FzTG9uZyhtYXhvYmopOworICAgIGlmIChybC5ybGltX21heCA9PSAocmxpbV90KS0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiBOVUxMOwogI2VuZGlmCiAKLQlybC5ybGltX2N1ciA9IHJsLnJsaW1fY3VyICYgUkxJTV9JTkZJTklUWTsKLQlybC5ybGltX21heCA9IHJsLnJsaW1fbWF4ICYgUkxJTV9JTkZJTklUWTsKLQlpZiAoc2V0cmxpbWl0KHJlc291cmNlLCAmcmwpID09IC0xKSB7Ci0JCWlmIChlcnJubyA9PSBFSU5WQUwpCi0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkJImN1cnJlbnQgbGltaXQgZXhjZWVkcyBtYXhpbXVtIGxpbWl0Iik7Ci0JCWVsc2UgaWYgKGVycm5vID09IEVQRVJNKQotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJCSJub3QgYWxsb3dlZCB0byByYWlzZSBtYXhpbXVtIGxpbWl0Iik7Ci0JCWVsc2UKLQkJCVB5RXJyX1NldEZyb21FcnJubyhSZXNvdXJjZUVycm9yKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBybC5ybGltX2N1ciA9IHJsLnJsaW1fY3VyICYgUkxJTV9JTkZJTklUWTsKKyAgICBybC5ybGltX21heCA9IHJsLnJsaW1fbWF4ICYgUkxJTV9JTkZJTklUWTsKKyAgICBpZiAoc2V0cmxpbWl0KHJlc291cmNlLCAmcmwpID09IC0xKSB7CisgICAgICAgIGlmIChlcnJubyA9PSBFSU5WQUwpCisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY3VycmVudCBsaW1pdCBleGNlZWRzIG1heGltdW0gbGltaXQiKTsKKyAgICAgICAgZWxzZSBpZiAoZXJybm8gPT0gRVBFUk0pCisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm90IGFsbG93ZWQgdG8gcmFpc2UgbWF4aW11bSBsaW1pdCIpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oUmVzb3VyY2VFcnJvcik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiByZXNvdXJjZV9nZXRwYWdlc2l6ZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnVudXNlZCkKIHsKLQlsb25nIHBhZ2VzaXplID0gMDsKKyAgICBsb25nIHBhZ2VzaXplID0gMDsKICNpZiBkZWZpbmVkKEhBVkVfR0VUUEFHRVNJWkUpCi0JcGFnZXNpemUgPSBnZXRwYWdlc2l6ZSgpOworICAgIHBhZ2VzaXplID0gZ2V0cGFnZXNpemUoKTsKICNlbGlmIGRlZmluZWQoSEFWRV9TWVNDT05GKQogI2lmIGRlZmluZWQoX1NDX1BBR0VfU0laRSkKLQlwYWdlc2l6ZSA9IHN5c2NvbmYoX1NDX1BBR0VfU0laRSk7CisgICAgcGFnZXNpemUgPSBzeXNjb25mKF9TQ19QQUdFX1NJWkUpOwogI2Vsc2UKLQkvKiBJcml4IDUuMyBoYXMgX1NDX1BBR0VTSVpFLCBidXQgbm90IF9TQ19QQUdFX1NJWkUgKi8KLQlwYWdlc2l6ZSA9IHN5c2NvbmYoX1NDX1BBR0VTSVpFKTsKKyAgICAvKiBJcml4IDUuMyBoYXMgX1NDX1BBR0VTSVpFLCBidXQgbm90IF9TQ19QQUdFX1NJWkUgKi8KKyAgICBwYWdlc2l6ZSA9IHN5c2NvbmYoX1NDX1BBR0VTSVpFKTsKICNlbmRpZgogI2VuZGlmCi0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLCBwYWdlc2l6ZSk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLCBwYWdlc2l6ZSk7CiAKIH0KIApAQCAtMjE1LDExICsyMTUsMTEgQEAKIAogc3RhdGljIHN0cnVjdCBQeU1ldGhvZERlZgogcmVzb3VyY2VfbWV0aG9kc1tdID0gewotCXsiZ2V0cnVzYWdlIiwgICAgcmVzb3VyY2VfZ2V0cnVzYWdlLCAgIE1FVEhfVkFSQVJHU30sCi0JeyJnZXRybGltaXQiLCAgICByZXNvdXJjZV9nZXRybGltaXQsICAgTUVUSF9WQVJBUkdTfSwKLQl7InNldHJsaW1pdCIsICAgIHJlc291cmNlX3NldHJsaW1pdCwgICBNRVRIX1ZBUkFSR1N9LAotCXsiZ2V0cGFnZXNpemUiLCAgcmVzb3VyY2VfZ2V0cGFnZXNpemUsIE1FVEhfTk9BUkdTfSwKLQl7TlVMTCwgTlVMTH0JCQkgICAgIC8qIHNlbnRpbmVsICovCisgICAgeyJnZXRydXNhZ2UiLCAgICByZXNvdXJjZV9nZXRydXNhZ2UsICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImdldHJsaW1pdCIsICAgIHJlc291cmNlX2dldHJsaW1pdCwgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsic2V0cmxpbWl0IiwgICAgcmVzb3VyY2Vfc2V0cmxpbWl0LCAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJnZXRwYWdlc2l6ZSIsICByZXNvdXJjZV9nZXRwYWdlc2l6ZSwgTUVUSF9OT0FSR1N9LAorICAgIHtOVUxMLCBOVUxMfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIApAQCAtMjI4LDEwMiArMjI4LDEwMiBAQAogUHlNT0RJTklUX0ZVTkMKIGluaXRyZXNvdXJjZSh2b2lkKQogewotCVB5T2JqZWN0ICptLCAqdjsKKyAgICBQeU9iamVjdCAqbSwgKnY7CiAKLQkvKiBDcmVhdGUgdGhlIG1vZHVsZSBhbmQgYWRkIHRoZSBmdW5jdGlvbnMgKi8KLQltID0gUHlfSW5pdE1vZHVsZSgicmVzb3VyY2UiLCByZXNvdXJjZV9tZXRob2RzKTsKLQlpZiAobSA9PSBOVUxMKQotCQlyZXR1cm47CisgICAgLyogQ3JlYXRlIHRoZSBtb2R1bGUgYW5kIGFkZCB0aGUgZnVuY3Rpb25zICovCisgICAgbSA9IFB5X0luaXRNb2R1bGUoInJlc291cmNlIiwgcmVzb3VyY2VfbWV0aG9kcyk7CisgICAgaWYgKG0gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOwogCi0JLyogQWRkIHNvbWUgc3ltYm9saWMgY29uc3RhbnRzIHRvIHRoZSBtb2R1bGUgKi8KLQlpZiAoUmVzb3VyY2VFcnJvciA9PSBOVUxMKSB7Ci0JCVJlc291cmNlRXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oInJlc291cmNlLmVycm9yIiwKLQkJCQkJCSAgIE5VTEwsIE5VTEwpOwotCX0KLQlQeV9JTkNSRUYoUmVzb3VyY2VFcnJvcik7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJlcnJvciIsIFJlc291cmNlRXJyb3IpOwotCWlmICghaW5pdGlhbGl6ZWQpCi0JCVB5U3RydWN0U2VxdWVuY2VfSW5pdFR5cGUoJlN0cnVjdFJVc2FnZVR5cGUsIAotCQkJCQkgICZzdHJ1Y3RfcnVzYWdlX2Rlc2MpOwotCVB5X0lOQ1JFRigmU3RydWN0UlVzYWdlVHlwZSk7Ci0gCVB5TW9kdWxlX0FkZE9iamVjdChtLCAic3RydWN0X3J1c2FnZSIsIAotCQkJICAgKFB5T2JqZWN0KikgJlN0cnVjdFJVc2FnZVR5cGUpOworICAgIC8qIEFkZCBzb21lIHN5bWJvbGljIGNvbnN0YW50cyB0byB0aGUgbW9kdWxlICovCisgICAgaWYgKFJlc291cmNlRXJyb3IgPT0gTlVMTCkgeworICAgICAgICBSZXNvdXJjZUVycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJyZXNvdXJjZS5lcnJvciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCk7CisgICAgfQorICAgIFB5X0lOQ1JFRihSZXNvdXJjZUVycm9yKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgImVycm9yIiwgUmVzb3VyY2VFcnJvcik7CisgICAgaWYgKCFpbml0aWFsaXplZCkKKyAgICAgICAgUHlTdHJ1Y3RTZXF1ZW5jZV9Jbml0VHlwZSgmU3RydWN0UlVzYWdlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RydWN0X3J1c2FnZV9kZXNjKTsKKyAgICBQeV9JTkNSRUYoJlN0cnVjdFJVc2FnZVR5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAic3RydWN0X3J1c2FnZSIsCisgICAgICAgICAgICAgICAgICAgICAgIChQeU9iamVjdCopICZTdHJ1Y3RSVXNhZ2VUeXBlKTsKIAotCS8qIGluc2VydCBjb25zdGFudHMgKi8KKyAgICAvKiBpbnNlcnQgY29uc3RhbnRzICovCiAjaWZkZWYgUkxJTUlUX0NQVQotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJSTElNSVRfQ1BVIiwgUkxJTUlUX0NQVSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlJMSU1JVF9DUFUiLCBSTElNSVRfQ1BVKTsKICNlbmRpZgogCiAjaWZkZWYgUkxJTUlUX0ZTSVpFCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlJMSU1JVF9GU0laRSIsIFJMSU1JVF9GU0laRSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlJMSU1JVF9GU0laRSIsIFJMSU1JVF9GU0laRSk7CiAjZW5kaWYKIAogI2lmZGVmIFJMSU1JVF9EQVRBCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlJMSU1JVF9EQVRBIiwgUkxJTUlUX0RBVEEpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJSTElNSVRfREFUQSIsIFJMSU1JVF9EQVRBKTsKICNlbmRpZgogCiAjaWZkZWYgUkxJTUlUX1NUQUNLCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlJMSU1JVF9TVEFDSyIsIFJMSU1JVF9TVEFDSyk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlJMSU1JVF9TVEFDSyIsIFJMSU1JVF9TVEFDSyk7CiAjZW5kaWYKIAogI2lmZGVmIFJMSU1JVF9DT1JFCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlJMSU1JVF9DT1JFIiwgUkxJTUlUX0NPUkUpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJSTElNSVRfQ09SRSIsIFJMSU1JVF9DT1JFKTsKICNlbmRpZgogCiAjaWZkZWYgUkxJTUlUX05PRklMRQotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJSTElNSVRfTk9GSUxFIiwgUkxJTUlUX05PRklMRSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlJMSU1JVF9OT0ZJTEUiLCBSTElNSVRfTk9GSUxFKTsKICNlbmRpZgogCiAjaWZkZWYgUkxJTUlUX09GSUxFCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlJMSU1JVF9PRklMRSIsIFJMSU1JVF9PRklMRSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlJMSU1JVF9PRklMRSIsIFJMSU1JVF9PRklMRSk7CiAjZW5kaWYKIAogI2lmZGVmIFJMSU1JVF9WTUVNCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlJMSU1JVF9WTUVNIiwgUkxJTUlUX1ZNRU0pOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJSTElNSVRfVk1FTSIsIFJMSU1JVF9WTUVNKTsKICNlbmRpZgogCiAjaWZkZWYgUkxJTUlUX0FTCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlJMSU1JVF9BUyIsIFJMSU1JVF9BUyk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlJMSU1JVF9BUyIsIFJMSU1JVF9BUyk7CiAjZW5kaWYKIAogI2lmZGVmIFJMSU1JVF9SU1MKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUkxJTUlUX1JTUyIsIFJMSU1JVF9SU1MpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJSTElNSVRfUlNTIiwgUkxJTUlUX1JTUyk7CiAjZW5kaWYKIAogI2lmZGVmIFJMSU1JVF9OUFJPQwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJSTElNSVRfTlBST0MiLCBSTElNSVRfTlBST0MpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJSTElNSVRfTlBST0MiLCBSTElNSVRfTlBST0MpOwogI2VuZGlmCiAKICNpZmRlZiBSTElNSVRfTUVNTE9DSwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJSTElNSVRfTUVNTE9DSyIsIFJMSU1JVF9NRU1MT0NLKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUkxJTUlUX01FTUxPQ0siLCBSTElNSVRfTUVNTE9DSyk7CiAjZW5kaWYKIAogI2lmZGVmIFJMSU1JVF9TQlNJWkUKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUkxJTUlUX1NCU0laRSIsIFJMSU1JVF9TQlNJWkUpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJSTElNSVRfU0JTSVpFIiwgUkxJTUlUX1NCU0laRSk7CiAjZW5kaWYKIAogI2lmZGVmIFJVU0FHRV9TRUxGCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlJVU0FHRV9TRUxGIiwgUlVTQUdFX1NFTEYpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJSVVNBR0VfU0VMRiIsIFJVU0FHRV9TRUxGKTsKICNlbmRpZgogCiAjaWZkZWYgUlVTQUdFX0NISUxEUkVOCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlJVU0FHRV9DSElMRFJFTiIsIFJVU0FHRV9DSElMRFJFTik7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlJVU0FHRV9DSElMRFJFTiIsIFJVU0FHRV9DSElMRFJFTik7CiAjZW5kaWYKIAogI2lmZGVmIFJVU0FHRV9CT1RICi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlJVU0FHRV9CT1RIIiwgUlVTQUdFX0JPVEgpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJSVVNBR0VfQk9USCIsIFJVU0FHRV9CT1RIKTsKICNlbmRpZgogCiAjaWYgZGVmaW5lZChIQVZFX0xPTkdfTE9ORykKLQlpZiAoc2l6ZW9mKFJMSU1fSU5GSU5JVFkpID4gc2l6ZW9mKGxvbmcpKSB7Ci0JCXYgPSBQeUxvbmdfRnJvbUxvbmdMb25nKChQWV9MT05HX0xPTkcpIFJMSU1fSU5GSU5JVFkpOwotCX0gZWxzZSAKKyAgICBpZiAoc2l6ZW9mKFJMSU1fSU5GSU5JVFkpID4gc2l6ZW9mKGxvbmcpKSB7CisgICAgICAgIHYgPSBQeUxvbmdfRnJvbUxvbmdMb25nKChQWV9MT05HX0xPTkcpIFJMSU1fSU5GSU5JVFkpOworICAgIH0gZWxzZQogI2VuZGlmCi0JewotCQl2ID0gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIFJMSU1fSU5GSU5JVFkpOwotCX0KLQlpZiAodikgewotCQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIlJMSU1fSU5GSU5JVFkiLCB2KTsKLQl9Ci0JaW5pdGlhbGl6ZWQgPSAxOworICAgIHsKKyAgICAgICAgdiA9IFB5SW50X0Zyb21Mb25nKChsb25nKSBSTElNX0lORklOSVRZKTsKKyAgICB9CisgICAgaWYgKHYpIHsKKyAgICAgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJSTElNX0lORklOSVRZIiwgdik7CisgICAgfQorICAgIGluaXRpYWxpemVkID0gMTsKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvcm90YXRpbmd0cmVlLmMgYi9Nb2R1bGVzL3JvdGF0aW5ndHJlZS5jCmluZGV4IDM5YzZkZDUuLjA3ZTA4YmMgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvcm90YXRpbmd0cmVlLmMKKysrIGIvTW9kdWxlcy9yb3RhdGluZ3RyZWUuYwpAQCAtMTQsMTQgKzE0LDE0IEBACiBzdGF0aWMgaW50CiByYW5kb21iaXRzKGludCBiaXRzKQogewotCWludCByZXN1bHQ7Ci0JaWYgKHJhbmRvbV9zdHJlYW0gPCAoMVUgPDwgYml0cykpIHsKLQkJcmFuZG9tX3ZhbHVlICo9IDEwODI1Mjc7Ci0JCXJhbmRvbV9zdHJlYW0gPSByYW5kb21fdmFsdWU7Ci0JfQotCXJlc3VsdCA9IHJhbmRvbV9zdHJlYW0gJiAoKDE8PGJpdHMpLTEpOwotCXJhbmRvbV9zdHJlYW0gPj49IGJpdHM7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBpbnQgcmVzdWx0OworICAgIGlmIChyYW5kb21fc3RyZWFtIDwgKDFVIDw8IGJpdHMpKSB7CisgICAgICAgIHJhbmRvbV92YWx1ZSAqPSAxMDgyNTI3OworICAgICAgICByYW5kb21fc3RyZWFtID0gcmFuZG9tX3ZhbHVlOworICAgIH0KKyAgICByZXN1bHQgPSByYW5kb21fc3RyZWFtICYgKCgxPDxiaXRzKS0xKTsKKyAgICByYW5kb21fc3RyZWFtID4+PSBiaXRzOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIApAQCAtMzAsMTUgKzMwLDE1IEBACiB2b2lkCiBSb3RhdGluZ1RyZWVfQWRkKHJvdGF0aW5nX25vZGVfdCAqKnJvb3QsIHJvdGF0aW5nX25vZGVfdCAqbm9kZSkKIHsKLQl3aGlsZSAoKnJvb3QgIT0gTlVMTCkgewotCQlpZiAoS0VZX0xPV0VSX1RIQU4obm9kZS0+a2V5LCAoKnJvb3QpLT5rZXkpKQotCQkJcm9vdCA9ICYoKCpyb290KS0+bGVmdCk7Ci0JCWVsc2UKLQkJCXJvb3QgPSAmKCgqcm9vdCktPnJpZ2h0KTsKLQl9Ci0Jbm9kZS0+bGVmdCA9IE5VTEw7Ci0Jbm9kZS0+cmlnaHQgPSBOVUxMOwotCSpyb290ID0gbm9kZTsKKyAgICB3aGlsZSAoKnJvb3QgIT0gTlVMTCkgeworICAgICAgICBpZiAoS0VZX0xPV0VSX1RIQU4obm9kZS0+a2V5LCAoKnJvb3QpLT5rZXkpKQorICAgICAgICAgICAgcm9vdCA9ICYoKCpyb290KS0+bGVmdCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJvb3QgPSAmKCgqcm9vdCktPnJpZ2h0KTsKKyAgICB9CisgICAgbm9kZS0+bGVmdCA9IE5VTEw7CisgICAgbm9kZS0+cmlnaHQgPSBOVUxMOworICAgICpyb290ID0gbm9kZTsKIH0KIAogLyogTG9jYXRlIHRoZSBub2RlIHdpdGggdGhlIGdpdmVuIGtleS4gIFRoaXMgaXMgdGhlIG1vc3QgY29tcGxpY2F0ZWQKQEAgLTQ3LDU3ICs0Nyw1NyBAQAogcm90YXRpbmdfbm9kZV90ICoKIFJvdGF0aW5nVHJlZV9HZXQocm90YXRpbmdfbm9kZV90ICoqcm9vdCwgdm9pZCAqa2V5KQogewotCWlmIChyYW5kb21iaXRzKDMpICE9IDQpIHsKLQkJLyogRmFzdCBwYXRoLCBubyByZWJhbGFuY2luZyAqLwotCQlyb3RhdGluZ19ub2RlX3QgKm5vZGUgPSAqcm9vdDsKLQkJd2hpbGUgKG5vZGUgIT0gTlVMTCkgewotCQkJaWYgKG5vZGUtPmtleSA9PSBrZXkpCi0JCQkJcmV0dXJuIG5vZGU7Ci0JCQlpZiAoS0VZX0xPV0VSX1RIQU4oa2V5LCBub2RlLT5rZXkpKQotCQkJCW5vZGUgPSBub2RlLT5sZWZ0OwotCQkJZWxzZQotCQkJCW5vZGUgPSBub2RlLT5yaWdodDsKLQkJfQotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZWxzZSB7Ci0JCXJvdGF0aW5nX25vZGVfdCAqKnBub2RlID0gcm9vdDsKLQkJcm90YXRpbmdfbm9kZV90ICpub2RlID0gKnBub2RlOwotCQlyb3RhdGluZ19ub2RlX3QgKm5leHQ7Ci0JCWludCByb3RhdGU7Ci0JCWlmIChub2RlID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQkJd2hpbGUgKDEpIHsKLQkJCWlmIChub2RlLT5rZXkgPT0ga2V5KQotCQkJCXJldHVybiBub2RlOwotCQkJcm90YXRlID0gIXJhbmRvbWJpdHMoMSk7Ci0JCQlpZiAoS0VZX0xPV0VSX1RIQU4oa2V5LCBub2RlLT5rZXkpKSB7Ci0JCQkJbmV4dCA9IG5vZGUtPmxlZnQ7Ci0JCQkJaWYgKG5leHQgPT0gTlVMTCkKLQkJCQkJcmV0dXJuIE5VTEw7Ci0JCQkJaWYgKHJvdGF0ZSkgewotCQkJCQlub2RlLT5sZWZ0ID0gbmV4dC0+cmlnaHQ7Ci0JCQkJCW5leHQtPnJpZ2h0ID0gbm9kZTsKLQkJCQkJKnBub2RlID0gbmV4dDsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCQlwbm9kZSA9ICYobm9kZS0+bGVmdCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQluZXh0ID0gbm9kZS0+cmlnaHQ7Ci0JCQkJaWYgKG5leHQgPT0gTlVMTCkKLQkJCQkJcmV0dXJuIE5VTEw7Ci0JCQkJaWYgKHJvdGF0ZSkgewotCQkJCQlub2RlLT5yaWdodCA9IG5leHQtPmxlZnQ7Ci0JCQkJCW5leHQtPmxlZnQgPSBub2RlOwotCQkJCQkqcG5vZGUgPSBuZXh0OwotCQkJCX0KLQkJCQllbHNlCi0JCQkJCXBub2RlID0gJihub2RlLT5yaWdodCk7Ci0JCQl9Ci0JCQlub2RlID0gbmV4dDsKLQkJfQotCX0KKyAgICBpZiAocmFuZG9tYml0cygzKSAhPSA0KSB7CisgICAgICAgIC8qIEZhc3QgcGF0aCwgbm8gcmViYWxhbmNpbmcgKi8KKyAgICAgICAgcm90YXRpbmdfbm9kZV90ICpub2RlID0gKnJvb3Q7CisgICAgICAgIHdoaWxlIChub2RlICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGlmIChub2RlLT5rZXkgPT0ga2V5KQorICAgICAgICAgICAgICAgIHJldHVybiBub2RlOworICAgICAgICAgICAgaWYgKEtFWV9MT1dFUl9USEFOKGtleSwgbm9kZS0+a2V5KSkKKyAgICAgICAgICAgICAgICBub2RlID0gbm9kZS0+bGVmdDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBub2RlID0gbm9kZS0+cmlnaHQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByb3RhdGluZ19ub2RlX3QgKipwbm9kZSA9IHJvb3Q7CisgICAgICAgIHJvdGF0aW5nX25vZGVfdCAqbm9kZSA9ICpwbm9kZTsKKyAgICAgICAgcm90YXRpbmdfbm9kZV90ICpuZXh0OworICAgICAgICBpbnQgcm90YXRlOworICAgICAgICBpZiAobm9kZSA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHdoaWxlICgxKSB7CisgICAgICAgICAgICBpZiAobm9kZS0+a2V5ID09IGtleSkKKyAgICAgICAgICAgICAgICByZXR1cm4gbm9kZTsKKyAgICAgICAgICAgIHJvdGF0ZSA9ICFyYW5kb21iaXRzKDEpOworICAgICAgICAgICAgaWYgKEtFWV9MT1dFUl9USEFOKGtleSwgbm9kZS0+a2V5KSkgeworICAgICAgICAgICAgICAgIG5leHQgPSBub2RlLT5sZWZ0OworICAgICAgICAgICAgICAgIGlmIChuZXh0ID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgIGlmIChyb3RhdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgbm9kZS0+bGVmdCA9IG5leHQtPnJpZ2h0OworICAgICAgICAgICAgICAgICAgICBuZXh0LT5yaWdodCA9IG5vZGU7CisgICAgICAgICAgICAgICAgICAgICpwbm9kZSA9IG5leHQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcG5vZGUgPSAmKG5vZGUtPmxlZnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgbmV4dCA9IG5vZGUtPnJpZ2h0OworICAgICAgICAgICAgICAgIGlmIChuZXh0ID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgIGlmIChyb3RhdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgbm9kZS0+cmlnaHQgPSBuZXh0LT5sZWZ0OworICAgICAgICAgICAgICAgICAgICBuZXh0LT5sZWZ0ID0gbm9kZTsKKyAgICAgICAgICAgICAgICAgICAgKnBub2RlID0gbmV4dDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBwbm9kZSA9ICYobm9kZS0+cmlnaHQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbm9kZSA9IG5leHQ7CisgICAgICAgIH0KKyAgICB9CiB9CiAKIC8qIEVudW1lcmF0ZSBhbGwgbm9kZXMgaW4gdGhlIHRyZWUuICBUaGUgY2FsbGJhY2sgZW51bWZuKCkgc2hvdWxkIHJldHVybgpAQCAtMTA1LDE3ICsxMDUsMTcgQEAKICAgIEEgbm9uLXplcm8gdmFsdWUgaXMgZGlyZWN0bHkgcmV0dXJuZWQgYnkgUm90YXRpbmdUcmVlX0VudW0oKS4gKi8KIGludAogUm90YXRpbmdUcmVlX0VudW0ocm90YXRpbmdfbm9kZV90ICpyb290LCByb3RhdGluZ190cmVlX2VudW1fZm4gZW51bWZuLAotCQkgIHZvaWQgKmFyZykKKyAgICAgICAgICAgICAgICAgIHZvaWQgKmFyZykKIHsKLQlpbnQgcmVzdWx0OwotCXJvdGF0aW5nX25vZGVfdCAqbm9kZTsKLQl3aGlsZSAocm9vdCAhPSBOVUxMKSB7Ci0JCXJlc3VsdCA9IFJvdGF0aW5nVHJlZV9FbnVtKHJvb3QtPmxlZnQsIGVudW1mbiwgYXJnKTsKLQkJaWYgKHJlc3VsdCAhPSAwKSByZXR1cm4gcmVzdWx0OwotCQlub2RlID0gcm9vdC0+cmlnaHQ7Ci0JCXJlc3VsdCA9IGVudW1mbihyb290LCBhcmcpOwotCQlpZiAocmVzdWx0ICE9IDApIHJldHVybiByZXN1bHQ7Ci0JCXJvb3QgPSBub2RlOwotCX0KLQlyZXR1cm4gMDsKKyAgICBpbnQgcmVzdWx0OworICAgIHJvdGF0aW5nX25vZGVfdCAqbm9kZTsKKyAgICB3aGlsZSAocm9vdCAhPSBOVUxMKSB7CisgICAgICAgIHJlc3VsdCA9IFJvdGF0aW5nVHJlZV9FbnVtKHJvb3QtPmxlZnQsIGVudW1mbiwgYXJnKTsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSAwKSByZXR1cm4gcmVzdWx0OworICAgICAgICBub2RlID0gcm9vdC0+cmlnaHQ7CisgICAgICAgIHJlc3VsdCA9IGVudW1mbihyb290LCBhcmcpOworICAgICAgICBpZiAocmVzdWx0ICE9IDApIHJldHVybiByZXN1bHQ7CisgICAgICAgIHJvb3QgPSBub2RlOworICAgIH0KKyAgICByZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvc2VsZWN0bW9kdWxlLmMgYi9Nb2R1bGVzL3NlbGVjdG1vZHVsZS5jCmluZGV4IDA5YzY4N2MuLmJhNWZkYjQgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvc2VsZWN0bW9kdWxlLmMKKysrIGIvTW9kdWxlcy9zZWxlY3Rtb2R1bGUuYwpAQCAtMjQsNyArMjQsNyBAQAogKi8KICNpZiBkZWZpbmVkKE1TX1dJTkRPV1MpICYmICFkZWZpbmVkKEZEX1NFVFNJWkUpCiAjZGVmaW5lIEZEX1NFVFNJWkUgNTEyCi0jZW5kaWYgCisjZW5kaWYKIAogI2lmIGRlZmluZWQoSEFWRV9QT0xMX0gpCiAjaW5jbHVkZSA8cG9sbC5oPgpAQCAtNjEsMjAgKzYxLDIwIEBACiAKIC8qIGxpc3Qgb2YgUHl0aG9uIG9iamVjdHMgYW5kIHRoZWlyIGZpbGUgZGVzY3JpcHRvciAqLwogdHlwZWRlZiBzdHJ1Y3QgewotCVB5T2JqZWN0ICpvYmo7CQkJICAgICAvKiBvd25lZCByZWZlcmVuY2UgKi8KLQlTT0NLRVQgZmQ7Ci0JaW50IHNlbnRpbmVsOwkJCSAgICAgLyogLTEgPT0gc2VudGluZWwgKi8KKyAgICBQeU9iamVjdCAqb2JqOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG93bmVkIHJlZmVyZW5jZSAqLworICAgIFNPQ0tFVCBmZDsKKyAgICBpbnQgc2VudGluZWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIC0xID09IHNlbnRpbmVsICovCiB9IHB5bGlzdDsKIAogc3RhdGljIHZvaWQKIHJlYXBfb2JqKHB5bGlzdCBmZDJvYmpbRkRfU0VUU0laRSArIDFdKQogewotCWludCBpOwotCWZvciAoaSA9IDA7IGkgPCBGRF9TRVRTSVpFICsgMSAmJiBmZDJvYmpbaV0uc2VudGluZWwgPj0gMDsgaSsrKSB7Ci0JCVB5X1hERUNSRUYoZmQyb2JqW2ldLm9iaik7Ci0JCWZkMm9ialtpXS5vYmogPSBOVUxMOwotCX0KLQlmZDJvYmpbMF0uc2VudGluZWwgPSAtMTsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgRkRfU0VUU0laRSArIDEgJiYgZmQyb2JqW2ldLnNlbnRpbmVsID49IDA7IGkrKykgeworICAgICAgICBQeV9YREVDUkVGKGZkMm9ialtpXS5vYmopOworICAgICAgICBmZDJvYmpbaV0ub2JqID0gTlVMTDsKKyAgICB9CisgICAgZmQyb2JqWzBdLnNlbnRpbmVsID0gLTE7CiB9CiAKIApAQCAtODQsMTA2ICs4NCwxMDYgQEAKIHN0YXRpYyBpbnQKIHNlcTJzZXQoUHlPYmplY3QgKnNlcSwgZmRfc2V0ICpzZXQsIHB5bGlzdCBmZDJvYmpbRkRfU0VUU0laRSArIDFdKQogewotCWludCBpOwotCWludCBtYXggPSAtMTsKLQlpbnQgaW5kZXggPSAwOwotICAgICAgICBpbnQgbGVuID0gLTE7Ci0gICAgICAgIFB5T2JqZWN0KiBmYXN0X3NlcSA9IE5VTEw7Ci0JUHlPYmplY3QqIG8gPSBOVUxMOworICAgIGludCBpOworICAgIGludCBtYXggPSAtMTsKKyAgICBpbnQgaW5kZXggPSAwOworICAgIGludCBsZW4gPSAtMTsKKyAgICBQeU9iamVjdCogZmFzdF9zZXEgPSBOVUxMOworICAgIFB5T2JqZWN0KiBvID0gTlVMTDsKIAotCWZkMm9ialswXS5vYmogPSAoUHlPYmplY3QqKTA7CSAgICAgLyogc2V0IGxpc3QgdG8gemVybyBzaXplICovCi0JRkRfWkVSTyhzZXQpOworICAgIGZkMm9ialswXS5vYmogPSAoUHlPYmplY3QqKTA7ICAgICAgICAgICAgLyogc2V0IGxpc3QgdG8gemVybyBzaXplICovCisgICAgRkRfWkVSTyhzZXQpOwogCi0gICAgICAgIGZhc3Rfc2VxPVB5U2VxdWVuY2VfRmFzdChzZXEsICJhcmd1bWVudHMgMS0zIG11c3QgYmUgc2VxdWVuY2VzIik7Ci0gICAgICAgIGlmICghZmFzdF9zZXEpCisgICAgZmFzdF9zZXE9UHlTZXF1ZW5jZV9GYXN0KHNlcSwgImFyZ3VtZW50cyAxLTMgbXVzdCBiZSBzZXF1ZW5jZXMiKTsKKyAgICBpZiAoIWZhc3Rfc2VxKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBsZW4gPSBQeVNlcXVlbmNlX0Zhc3RfR0VUX1NJWkUoZmFzdF9zZXEpOworCisgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSAgeworICAgICAgICBTT0NLRVQgdjsKKworICAgICAgICAvKiBhbnkgaW50ZXJ2ZW5pbmcgZmlsZW5vKCkgY2FsbHMgY291bGQgZGVjciB0aGlzIHJlZmNudCAqLworICAgICAgICBpZiAoIShvID0gUHlTZXF1ZW5jZV9GYXN0X0dFVF9JVEVNKGZhc3Rfc2VxLCBpKSkpCiAgICAgICAgICAgICByZXR1cm4gLTE7CiAKLSAgICAgICAgbGVuID0gUHlTZXF1ZW5jZV9GYXN0X0dFVF9TSVpFKGZhc3Rfc2VxKTsKLQotCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgIHsKLQkJU09DS0VUIHY7Ci0KLQkJLyogYW55IGludGVydmVuaW5nIGZpbGVubygpIGNhbGxzIGNvdWxkIGRlY3IgdGhpcyByZWZjbnQgKi8KLQkJaWYgKCEobyA9IFB5U2VxdWVuY2VfRmFzdF9HRVRfSVRFTShmYXN0X3NlcSwgaSkpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0KLQkJUHlfSU5DUkVGKG8pOwotCQl2ID0gUHlPYmplY3RfQXNGaWxlRGVzY3JpcHRvciggbyApOwotCQlpZiAodiA9PSAtMSkgZ290byBmaW5hbGx5OworICAgICAgICBQeV9JTkNSRUYobyk7CisgICAgICAgIHYgPSBQeU9iamVjdF9Bc0ZpbGVEZXNjcmlwdG9yKCBvICk7CisgICAgICAgIGlmICh2ID09IC0xKSBnb3RvIGZpbmFsbHk7CiAKICNpZiBkZWZpbmVkKF9NU0NfVkVSKQotCQltYXggPSAwOwkJICAgICAvKiBub3QgdXNlZCBmb3IgV2luMzIgKi8KKyAgICAgICAgbWF4ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vdCB1c2VkIGZvciBXaW4zMiAqLwogI2Vsc2UgIC8qICFfTVNDX1ZFUiAqLwotCQlpZiAodiA8IDAgfHwgdiA+PSBGRF9TRVRTSVpFKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkgICAgImZpbGVkZXNjcmlwdG9yIG91dCBvZiByYW5nZSBpbiBzZWxlY3QoKSIpOwotCQkJZ290byBmaW5hbGx5OwotCQl9Ci0JCWlmICh2ID4gbWF4KQotCQkJbWF4ID0gdjsKKyAgICAgICAgaWYgKHYgPCAwIHx8IHYgPj0gRkRfU0VUU0laRSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiZmlsZWRlc2NyaXB0b3Igb3V0IG9mIHJhbmdlIGluIHNlbGVjdCgpIik7CisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHYgPiBtYXgpCisgICAgICAgICAgICBtYXggPSB2OwogI2VuZGlmIC8qIF9NU0NfVkVSICovCi0JCUZEX1NFVCh2LCBzZXQpOworICAgICAgICBGRF9TRVQodiwgc2V0KTsKIAotCQkvKiBhZGQgb2JqZWN0IGFuZCBpdHMgZmlsZSBkZXNjcmlwdG9yIHRvIHRoZSBsaXN0ICovCi0JCWlmIChpbmRleCA+PSBGRF9TRVRTSVpFKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkgICAgICAidG9vIG1hbnkgZmlsZSBkZXNjcmlwdG9ycyBpbiBzZWxlY3QoKSIpOwotCQkJZ290byBmaW5hbGx5OwotCQl9Ci0JCWZkMm9ialtpbmRleF0ub2JqID0gbzsKLQkJZmQyb2JqW2luZGV4XS5mZCA9IHY7Ci0JCWZkMm9ialtpbmRleF0uc2VudGluZWwgPSAwOwotCQlmZDJvYmpbKytpbmRleF0uc2VudGluZWwgPSAtMTsKLQl9Ci0gICAgICAgIFB5X0RFQ1JFRihmYXN0X3NlcSk7Ci0JcmV0dXJuIG1heCsxOworICAgICAgICAvKiBhZGQgb2JqZWN0IGFuZCBpdHMgZmlsZSBkZXNjcmlwdG9yIHRvIHRoZSBsaXN0ICovCisgICAgICAgIGlmIChpbmRleCA+PSBGRF9TRVRTSVpFKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInRvbyBtYW55IGZpbGUgZGVzY3JpcHRvcnMgaW4gc2VsZWN0KCkiKTsKKyAgICAgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICAgICAgfQorICAgICAgICBmZDJvYmpbaW5kZXhdLm9iaiA9IG87CisgICAgICAgIGZkMm9ialtpbmRleF0uZmQgPSB2OworICAgICAgICBmZDJvYmpbaW5kZXhdLnNlbnRpbmVsID0gMDsKKyAgICAgICAgZmQyb2JqWysraW5kZXhdLnNlbnRpbmVsID0gLTE7CisgICAgfQorICAgIFB5X0RFQ1JFRihmYXN0X3NlcSk7CisgICAgcmV0dXJuIG1heCsxOwogCiAgIGZpbmFsbHk6Ci0JUHlfWERFQ1JFRihvKTsKLSAgICAgICAgUHlfREVDUkVGKGZhc3Rfc2VxKTsKLQlyZXR1cm4gLTE7CisgICAgUHlfWERFQ1JFRihvKTsKKyAgICBQeV9ERUNSRUYoZmFzdF9zZXEpOworICAgIHJldHVybiAtMTsKIH0KIAogLyogcmV0dXJucyBOVUxMIGFuZCBzZXRzIHRoZSBQeXRob24gZXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycmVkICovCiBzdGF0aWMgUHlPYmplY3QgKgogc2V0Mmxpc3QoZmRfc2V0ICpzZXQsIHB5bGlzdCBmZDJvYmpbRkRfU0VUU0laRSArIDFdKQogewotCWludCBpLCBqLCBjb3VudD0wOwotCVB5T2JqZWN0ICpsaXN0LCAqbzsKLQlTT0NLRVQgZmQ7CisgICAgaW50IGksIGosIGNvdW50PTA7CisgICAgUHlPYmplY3QgKmxpc3QsICpvOworICAgIFNPQ0tFVCBmZDsKIAotCWZvciAoaiA9IDA7IGZkMm9ialtqXS5zZW50aW5lbCA+PSAwOyBqKyspIHsKLQkJaWYgKEZEX0lTU0VUKGZkMm9ialtqXS5mZCwgc2V0KSkKLQkJCWNvdW50Kys7Ci0JfQotCWxpc3QgPSBQeUxpc3RfTmV3KGNvdW50KTsKLQlpZiAoIWxpc3QpCi0JCXJldHVybiBOVUxMOworICAgIGZvciAoaiA9IDA7IGZkMm9ialtqXS5zZW50aW5lbCA+PSAwOyBqKyspIHsKKyAgICAgICAgaWYgKEZEX0lTU0VUKGZkMm9ialtqXS5mZCwgc2V0KSkKKyAgICAgICAgICAgIGNvdW50Kys7CisgICAgfQorICAgIGxpc3QgPSBQeUxpc3RfTmV3KGNvdW50KTsKKyAgICBpZiAoIWxpc3QpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaSA9IDA7Ci0JZm9yIChqID0gMDsgZmQyb2JqW2pdLnNlbnRpbmVsID49IDA7IGorKykgewotCQlmZCA9IGZkMm9ialtqXS5mZDsKLQkJaWYgKEZEX0lTU0VUKGZkLCBzZXQpKSB7CisgICAgaSA9IDA7CisgICAgZm9yIChqID0gMDsgZmQyb2JqW2pdLnNlbnRpbmVsID49IDA7IGorKykgeworICAgICAgICBmZCA9IGZkMm9ialtqXS5mZDsKKyAgICAgICAgaWYgKEZEX0lTU0VUKGZkLCBzZXQpKSB7CiAjaWZuZGVmIF9NU0NfVkVSCi0JCQlpZiAoZmQgPiBGRF9TRVRTSVpFKSB7Ci0JCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAotCQkJICAgImZpbGVkZXNjcmlwdG9yIG91dCBvZiByYW5nZSByZXR1cm5lZCBpbiBzZWxlY3QoKSIpOwotCQkJCWdvdG8gZmluYWxseTsKLQkJCX0KKyAgICAgICAgICAgIGlmIChmZCA+IEZEX1NFVFNJWkUpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgICAgICAiZmlsZWRlc2NyaXB0b3Igb3V0IG9mIHJhbmdlIHJldHVybmVkIGluIHNlbGVjdCgpIik7CisgICAgICAgICAgICAgICAgZ290byBmaW5hbGx5OworICAgICAgICAgICAgfQogI2VuZGlmCi0JCQlvID0gZmQyb2JqW2pdLm9iajsKLQkJCWZkMm9ialtqXS5vYmogPSBOVUxMOwotCQkJLyogdHJhbnNmZXIgb3duZXJzaGlwICovCi0JCQlpZiAoUHlMaXN0X1NldEl0ZW0obGlzdCwgaSwgbykgPCAwKQotCQkJCWdvdG8gZmluYWxseTsKKyAgICAgICAgICAgIG8gPSBmZDJvYmpbal0ub2JqOworICAgICAgICAgICAgZmQyb2JqW2pdLm9iaiA9IE5VTEw7CisgICAgICAgICAgICAvKiB0cmFuc2ZlciBvd25lcnNoaXAgKi8KKyAgICAgICAgICAgIGlmIChQeUxpc3RfU2V0SXRlbShsaXN0LCBpLCBvKSA8IDApCisgICAgICAgICAgICAgICAgZ290byBmaW5hbGx5OwogCi0JCQlpKys7Ci0JCX0KLQl9Ci0JcmV0dXJuIGxpc3Q7CisgICAgICAgICAgICBpKys7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGxpc3Q7CiAgIGZpbmFsbHk6Ci0JUHlfREVDUkVGKGxpc3QpOwotCXJldHVybiBOVUxMOworICAgIFB5X0RFQ1JFRihsaXN0KTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogI3VuZGVmIFNFTEVDVF9VU0VTX0hFQVAKQEAgLTE5NSwxNzAgKzE5NSwxNzAgQEAKIHNlbGVjdF9zZWxlY3QoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewogI2lmZGVmIFNFTEVDVF9VU0VTX0hFQVAKLQlweWxpc3QgKnJmZDJvYmosICp3ZmQyb2JqLCAqZWZkMm9iajsKKyAgICBweWxpc3QgKnJmZDJvYmosICp3ZmQyb2JqLCAqZWZkMm9iajsKICNlbHNlICAvKiAhU0VMRUNUX1VTRVNfSEVBUCAqLwotCS8qIFhYWDogQWxsIHRoaXMgc2hvdWxkIHByb2JhYmx5IGJlIGltcGxlbWVudGVkIGFzIGZvbGxvd3M6Ci0JICogLSBmaW5kIHRoZSBoaWdoZXN0IGRlc2NyaXB0b3Igd2UncmUgaW50ZXJlc3RlZCBpbgotCSAqIC0gYWRkIG9uZQotCSAqIC0gdGhhdCdzIHRoZSBzaXplCi0JICogU2VlOiBTdGV2ZW5zLCBBUGl0VUUsICQxMi41LjEKLQkgKi8KLQlweWxpc3QgcmZkMm9ialtGRF9TRVRTSVpFICsgMV07Ci0JcHlsaXN0IHdmZDJvYmpbRkRfU0VUU0laRSArIDFdOwotCXB5bGlzdCBlZmQyb2JqW0ZEX1NFVFNJWkUgKyAxXTsKKyAgICAvKiBYWFg6IEFsbCB0aGlzIHNob3VsZCBwcm9iYWJseSBiZSBpbXBsZW1lbnRlZCBhcyBmb2xsb3dzOgorICAgICAqIC0gZmluZCB0aGUgaGlnaGVzdCBkZXNjcmlwdG9yIHdlJ3JlIGludGVyZXN0ZWQgaW4KKyAgICAgKiAtIGFkZCBvbmUKKyAgICAgKiAtIHRoYXQncyB0aGUgc2l6ZQorICAgICAqIFNlZTogU3RldmVucywgQVBpdFVFLCAkMTIuNS4xCisgICAgICovCisgICAgcHlsaXN0IHJmZDJvYmpbRkRfU0VUU0laRSArIDFdOworICAgIHB5bGlzdCB3ZmQyb2JqW0ZEX1NFVFNJWkUgKyAxXTsKKyAgICBweWxpc3QgZWZkMm9ialtGRF9TRVRTSVpFICsgMV07CiAjZW5kaWYgLyogU0VMRUNUX1VTRVNfSEVBUCAqLwotCVB5T2JqZWN0ICppZmRsaXN0LCAqb2ZkbGlzdCwgKmVmZGxpc3Q7Ci0JUHlPYmplY3QgKnJldCA9IE5VTEw7Ci0JUHlPYmplY3QgKnRvdXQgPSBQeV9Ob25lOwotCWZkX3NldCBpZmRzZXQsIG9mZHNldCwgZWZkc2V0OwotCWRvdWJsZSB0aW1lb3V0OwotCXN0cnVjdCB0aW1ldmFsIHR2LCAqdHZwOwotCWxvbmcgc2Vjb25kczsKLQlpbnQgaW1heCwgb21heCwgZW1heCwgbWF4OwotCWludCBuOworICAgIFB5T2JqZWN0ICppZmRsaXN0LCAqb2ZkbGlzdCwgKmVmZGxpc3Q7CisgICAgUHlPYmplY3QgKnJldCA9IE5VTEw7CisgICAgUHlPYmplY3QgKnRvdXQgPSBQeV9Ob25lOworICAgIGZkX3NldCBpZmRzZXQsIG9mZHNldCwgZWZkc2V0OworICAgIGRvdWJsZSB0aW1lb3V0OworICAgIHN0cnVjdCB0aW1ldmFsIHR2LCAqdHZwOworICAgIGxvbmcgc2Vjb25kczsKKyAgICBpbnQgaW1heCwgb21heCwgZW1heCwgbWF4OworICAgIGludCBuOwogCi0JLyogY29udmVydCBhcmd1bWVudHMgKi8KLQlpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJzZWxlY3QiLCAzLCA0LAotCQkJICAgICAgJmlmZGxpc3QsICZvZmRsaXN0LCAmZWZkbGlzdCwgJnRvdXQpKQotCQlyZXR1cm4gTlVMTDsKKyAgICAvKiBjb252ZXJ0IGFyZ3VtZW50cyAqLworICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInNlbGVjdCIsIDMsIDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpZmRsaXN0LCAmb2ZkbGlzdCwgJmVmZGxpc3QsICZ0b3V0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAodG91dCA9PSBQeV9Ob25lKQotCQl0dnAgPSAoc3RydWN0IHRpbWV2YWwgKikwOwotCWVsc2UgaWYgKCFQeU51bWJlcl9DaGVjayh0b3V0KSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJ0aW1lb3V0IG11c3QgYmUgYSBmbG9hdCBvciBOb25lIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQllbHNlIHsKLQkJdGltZW91dCA9IFB5RmxvYXRfQXNEb3VibGUodG91dCk7Ci0JCWlmICh0aW1lb3V0ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCQlyZXR1cm4gTlVMTDsKLQkJaWYgKHRpbWVvdXQgPiAoZG91YmxlKUxPTkdfTUFYKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJCQkJInRpbWVvdXQgcGVyaW9kIHRvbyBsb25nIik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlzZWNvbmRzID0gKGxvbmcpdGltZW91dDsKLQkJdGltZW91dCA9IHRpbWVvdXQgLSAoZG91YmxlKXNlY29uZHM7Ci0JCXR2LnR2X3NlYyA9IHNlY29uZHM7Ci0JCXR2LnR2X3VzZWMgPSAobG9uZykodGltZW91dCAqIDFFNik7Ci0JCXR2cCA9ICZ0djsKLQl9CisgICAgaWYgKHRvdXQgPT0gUHlfTm9uZSkKKyAgICAgICAgdHZwID0gKHN0cnVjdCB0aW1ldmFsICopMDsKKyAgICBlbHNlIGlmICghUHlOdW1iZXJfQ2hlY2sodG91dCkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0aW1lb3V0IG11c3QgYmUgYSBmbG9hdCBvciBOb25lIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgdGltZW91dCA9IFB5RmxvYXRfQXNEb3VibGUodG91dCk7CisgICAgICAgIGlmICh0aW1lb3V0ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKHRpbWVvdXQgPiAoZG91YmxlKUxPTkdfTUFYKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGltZW91dCBwZXJpb2QgdG9vIGxvbmciKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHNlY29uZHMgPSAobG9uZyl0aW1lb3V0OworICAgICAgICB0aW1lb3V0ID0gdGltZW91dCAtIChkb3VibGUpc2Vjb25kczsKKyAgICAgICAgdHYudHZfc2VjID0gc2Vjb25kczsKKyAgICAgICAgdHYudHZfdXNlYyA9IChsb25nKSh0aW1lb3V0ICogMUU2KTsKKyAgICAgICAgdHZwID0gJnR2OworICAgIH0KIAogCiAjaWZkZWYgU0VMRUNUX1VTRVNfSEVBUAotCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGxpc3RzICovCi0JcmZkMm9iaiA9IFB5TWVtX05FVyhweWxpc3QsIEZEX1NFVFNJWkUgKyAxKTsKLQl3ZmQyb2JqID0gUHlNZW1fTkVXKHB5bGlzdCwgRkRfU0VUU0laRSArIDEpOwotCWVmZDJvYmogPSBQeU1lbV9ORVcocHlsaXN0LCBGRF9TRVRTSVpFICsgMSk7Ci0JaWYgKHJmZDJvYmogPT0gTlVMTCB8fCB3ZmQyb2JqID09IE5VTEwgfHwgZWZkMm9iaiA9PSBOVUxMKSB7Ci0JCWlmIChyZmQyb2JqKSBQeU1lbV9ERUwocmZkMm9iaik7Ci0JCWlmICh3ZmQyb2JqKSBQeU1lbV9ERUwod2ZkMm9iaik7Ci0JCWlmIChlZmQyb2JqKSBQeU1lbV9ERUwoZWZkMm9iaik7Ci0JCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCX0KKyAgICAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBsaXN0cyAqLworICAgIHJmZDJvYmogPSBQeU1lbV9ORVcocHlsaXN0LCBGRF9TRVRTSVpFICsgMSk7CisgICAgd2ZkMm9iaiA9IFB5TWVtX05FVyhweWxpc3QsIEZEX1NFVFNJWkUgKyAxKTsKKyAgICBlZmQyb2JqID0gUHlNZW1fTkVXKHB5bGlzdCwgRkRfU0VUU0laRSArIDEpOworICAgIGlmIChyZmQyb2JqID09IE5VTEwgfHwgd2ZkMm9iaiA9PSBOVUxMIHx8IGVmZDJvYmogPT0gTlVMTCkgeworICAgICAgICBpZiAocmZkMm9iaikgUHlNZW1fREVMKHJmZDJvYmopOworICAgICAgICBpZiAod2ZkMm9iaikgUHlNZW1fREVMKHdmZDJvYmopOworICAgICAgICBpZiAoZWZkMm9iaikgUHlNZW1fREVMKGVmZDJvYmopOworICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICB9CiAjZW5kaWYgLyogU0VMRUNUX1VTRVNfSEVBUCAqLwotCS8qIENvbnZlcnQgc2VxdWVuY2VzIHRvIGZkX3NldHMsIGFuZCBnZXQgbWF4aW11bSBmZCBudW1iZXIKLQkgKiBwcm9wYWdhdGVzIHRoZSBQeXRob24gZXhjZXB0aW9uIHNldCBpbiBzZXEyc2V0KCkKLQkgKi8KLQlyZmQyb2JqWzBdLnNlbnRpbmVsID0gLTE7Ci0Jd2ZkMm9ialswXS5zZW50aW5lbCA9IC0xOwotCWVmZDJvYmpbMF0uc2VudGluZWwgPSAtMTsKLQlpZiAoKGltYXg9c2VxMnNldChpZmRsaXN0LCAmaWZkc2V0LCByZmQyb2JqKSkgPCAwKSAKLQkJZ290byBmaW5hbGx5OwotCWlmICgob21heD1zZXEyc2V0KG9mZGxpc3QsICZvZmRzZXQsIHdmZDJvYmopKSA8IDApIAotCQlnb3RvIGZpbmFsbHk7Ci0JaWYgKChlbWF4PXNlcTJzZXQoZWZkbGlzdCwgJmVmZHNldCwgZWZkMm9iaikpIDwgMCkgCi0JCWdvdG8gZmluYWxseTsKLQltYXggPSBpbWF4OwotCWlmIChvbWF4ID4gbWF4KSBtYXggPSBvbWF4OwotCWlmIChlbWF4ID4gbWF4KSBtYXggPSBlbWF4OworICAgIC8qIENvbnZlcnQgc2VxdWVuY2VzIHRvIGZkX3NldHMsIGFuZCBnZXQgbWF4aW11bSBmZCBudW1iZXIKKyAgICAgKiBwcm9wYWdhdGVzIHRoZSBQeXRob24gZXhjZXB0aW9uIHNldCBpbiBzZXEyc2V0KCkKKyAgICAgKi8KKyAgICByZmQyb2JqWzBdLnNlbnRpbmVsID0gLTE7CisgICAgd2ZkMm9ialswXS5zZW50aW5lbCA9IC0xOworICAgIGVmZDJvYmpbMF0uc2VudGluZWwgPSAtMTsKKyAgICBpZiAoKGltYXg9c2VxMnNldChpZmRsaXN0LCAmaWZkc2V0LCByZmQyb2JqKSkgPCAwKQorICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgaWYgKChvbWF4PXNlcTJzZXQob2ZkbGlzdCwgJm9mZHNldCwgd2ZkMm9iaikpIDwgMCkKKyAgICAgICAgZ290byBmaW5hbGx5OworICAgIGlmICgoZW1heD1zZXEyc2V0KGVmZGxpc3QsICZlZmRzZXQsIGVmZDJvYmopKSA8IDApCisgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICBtYXggPSBpbWF4OworICAgIGlmIChvbWF4ID4gbWF4KSBtYXggPSBvbWF4OworICAgIGlmIChlbWF4ID4gbWF4KSBtYXggPSBlbWF4OwogCi0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCW4gPSBzZWxlY3QobWF4LCAmaWZkc2V0LCAmb2Zkc2V0LCAmZWZkc2V0LCB0dnApOwotCVB5X0VORF9BTExPV19USFJFQURTCisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIG4gPSBzZWxlY3QobWF4LCAmaWZkc2V0LCAmb2Zkc2V0LCAmZWZkc2V0LCB0dnApOworICAgIFB5X0VORF9BTExPV19USFJFQURTCiAKICNpZmRlZiBNU19XSU5ET1dTCi0JaWYgKG4gPT0gU09DS0VUX0VSUk9SKSB7Ci0JCVB5RXJyX1NldEV4Y0Zyb21XaW5kb3dzRXJyKFNlbGVjdEVycm9yLCBXU0FHZXRMYXN0RXJyb3IoKSk7Ci0JfQorICAgIGlmIChuID09IFNPQ0tFVF9FUlJPUikgeworICAgICAgICBQeUVycl9TZXRFeGNGcm9tV2luZG93c0VycihTZWxlY3RFcnJvciwgV1NBR2V0TGFzdEVycm9yKCkpOworICAgIH0KICNlbHNlCi0JaWYgKG4gPCAwKSB7Ci0JCVB5RXJyX1NldEZyb21FcnJubyhTZWxlY3RFcnJvcik7Ci0JfQorICAgIGlmIChuIDwgMCkgeworICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oU2VsZWN0RXJyb3IpOworICAgIH0KICNlbmRpZgotCWVsc2UgewotCQkvKiBhbnkgb2YgdGhlc2UgdGhyZWUgY2FsbHMgY2FuIHJhaXNlIGFuIGV4Y2VwdGlvbi4gIGl0J3MgbW9yZQotCQkgICBjb252ZW5pZW50IHRvIHRlc3QgZm9yIHRoaXMgYWZ0ZXIgYWxsIHRocmVlIGNhbGxzLi4uIGJ1dAotCQkgICBpcyB0aGF0IGFjY2VwdGFibGU/Ci0JCSovCi0JCWlmZGxpc3QgPSBzZXQybGlzdCgmaWZkc2V0LCByZmQyb2JqKTsKLQkJb2ZkbGlzdCA9IHNldDJsaXN0KCZvZmRzZXQsIHdmZDJvYmopOwotCQllZmRsaXN0ID0gc2V0Mmxpc3QoJmVmZHNldCwgZWZkMm9iaik7Ci0JCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0ID0gTlVMTDsKLQkJZWxzZQotCQkJcmV0ID0gUHlUdXBsZV9QYWNrKDMsIGlmZGxpc3QsIG9mZGxpc3QsIGVmZGxpc3QpOworICAgIGVsc2UgeworICAgICAgICAvKiBhbnkgb2YgdGhlc2UgdGhyZWUgY2FsbHMgY2FuIHJhaXNlIGFuIGV4Y2VwdGlvbi4gIGl0J3MgbW9yZQorICAgICAgICAgICBjb252ZW5pZW50IHRvIHRlc3QgZm9yIHRoaXMgYWZ0ZXIgYWxsIHRocmVlIGNhbGxzLi4uIGJ1dAorICAgICAgICAgICBpcyB0aGF0IGFjY2VwdGFibGU/CisgICAgICAgICovCisgICAgICAgIGlmZGxpc3QgPSBzZXQybGlzdCgmaWZkc2V0LCByZmQyb2JqKTsKKyAgICAgICAgb2ZkbGlzdCA9IHNldDJsaXN0KCZvZmRzZXQsIHdmZDJvYmopOworICAgICAgICBlZmRsaXN0ID0gc2V0Mmxpc3QoJmVmZHNldCwgZWZkMm9iaik7CisgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgcmV0ID0gTlVMTDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0ID0gUHlUdXBsZV9QYWNrKDMsIGlmZGxpc3QsIG9mZGxpc3QsIGVmZGxpc3QpOwogCi0JCVB5X0RFQ1JFRihpZmRsaXN0KTsKLQkJUHlfREVDUkVGKG9mZGxpc3QpOwotCQlQeV9ERUNSRUYoZWZkbGlzdCk7Ci0JfQotCQorICAgICAgICBQeV9ERUNSRUYoaWZkbGlzdCk7CisgICAgICAgIFB5X0RFQ1JFRihvZmRsaXN0KTsKKyAgICAgICAgUHlfREVDUkVGKGVmZGxpc3QpOworICAgIH0KKwogICBmaW5hbGx5OgotCXJlYXBfb2JqKHJmZDJvYmopOwotCXJlYXBfb2JqKHdmZDJvYmopOwotCXJlYXBfb2JqKGVmZDJvYmopOworICAgIHJlYXBfb2JqKHJmZDJvYmopOworICAgIHJlYXBfb2JqKHdmZDJvYmopOworICAgIHJlYXBfb2JqKGVmZDJvYmopOwogI2lmZGVmIFNFTEVDVF9VU0VTX0hFQVAKLQlQeU1lbV9ERUwocmZkMm9iaik7Ci0JUHlNZW1fREVMKHdmZDJvYmopOwotCVB5TWVtX0RFTChlZmQyb2JqKTsKKyAgICBQeU1lbV9ERUwocmZkMm9iaik7CisgICAgUHlNZW1fREVMKHdmZDJvYmopOworICAgIFB5TWVtX0RFTChlZmQyb2JqKTsKICNlbmRpZiAvKiBTRUxFQ1RfVVNFU19IRUFQICovCi0JcmV0dXJuIHJldDsKKyAgICByZXR1cm4gcmV0OwogfQogCiAjaWYgZGVmaW5lZChIQVZFX1BPTEwpICYmICFkZWZpbmVkKEhBVkVfQlJPS0VOX1BPTEwpCi0vKiAKKy8qCiAgKiBwb2xsKCkgc3VwcG9ydAogICovCiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JUHlPYmplY3QgKmRpY3Q7Ci0JaW50IHVmZF91cHRvZGF0ZTsgCi0JaW50IHVmZF9sZW47Ci0gICAgICAgIHN0cnVjdCBwb2xsZmQgKnVmZHM7CisgICAgUHlPYmplY3RfSEVBRAorICAgIFB5T2JqZWN0ICpkaWN0OworICAgIGludCB1ZmRfdXB0b2RhdGU7CisgICAgaW50IHVmZF9sZW47CisgICAgc3RydWN0IHBvbGxmZCAqdWZkczsKIH0gcG9sbE9iamVjdDsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBwb2xsX1R5cGU7CiAKLS8qIFVwZGF0ZSB0aGUgbWFsbG9jJ2VkIGFycmF5IG9mIHBvbGxmZHMgdG8gbWF0Y2ggdGhlIGRpY3Rpb25hcnkgCisvKiBVcGRhdGUgdGhlIG1hbGxvYydlZCBhcnJheSBvZiBwb2xsZmRzIHRvIG1hdGNoIHRoZSBkaWN0aW9uYXJ5CiAgICBjb250YWluZWQgd2l0aGluIGEgcG9sbE9iamVjdC4gIFJldHVybiAxIG9uIHN1Y2Nlc3MsIDAgb24gYW4gZXJyb3IuCiAqLwogCiBzdGF0aWMgaW50CiB1cGRhdGVfdWZkX2FycmF5KHBvbGxPYmplY3QgKnNlbGYpCiB7Ci0JUHlfc3NpemVfdCBpLCBwb3M7Ci0JUHlPYmplY3QgKmtleSwgKnZhbHVlOwotICAgICAgICBzdHJ1Y3QgcG9sbGZkICpvbGRfdWZkcyA9IHNlbGYtPnVmZHM7CisgICAgUHlfc3NpemVfdCBpLCBwb3M7CisgICAgUHlPYmplY3QgKmtleSwgKnZhbHVlOworICAgIHN0cnVjdCBwb2xsZmQgKm9sZF91ZmRzID0gc2VsZi0+dWZkczsKIAotCXNlbGYtPnVmZF9sZW4gPSBQeURpY3RfU2l6ZShzZWxmLT5kaWN0KTsKLQlQeU1lbV9SRVNJWkUoc2VsZi0+dWZkcywgc3RydWN0IHBvbGxmZCwgc2VsZi0+dWZkX2xlbik7Ci0JaWYgKHNlbGYtPnVmZHMgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHNlbGYtPnVmZHMgPSBvbGRfdWZkczsKLQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJcmV0dXJuIDA7Ci0JfQorICAgIHNlbGYtPnVmZF9sZW4gPSBQeURpY3RfU2l6ZShzZWxmLT5kaWN0KTsKKyAgICBQeU1lbV9SRVNJWkUoc2VsZi0+dWZkcywgc3RydWN0IHBvbGxmZCwgc2VsZi0+dWZkX2xlbik7CisgICAgaWYgKHNlbGYtPnVmZHMgPT0gTlVMTCkgeworICAgICAgICBzZWxmLT51ZmRzID0gb2xkX3VmZHM7CisgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KIAotCWkgPSBwb3MgPSAwOwotCXdoaWxlIChQeURpY3RfTmV4dChzZWxmLT5kaWN0LCAmcG9zLCAma2V5LCAmdmFsdWUpKSB7Ci0JCXNlbGYtPnVmZHNbaV0uZmQgPSBQeUludF9Bc0xvbmcoa2V5KTsKLQkJc2VsZi0+dWZkc1tpXS5ldmVudHMgPSAoc2hvcnQpUHlJbnRfQXNMb25nKHZhbHVlKTsKLQkJaSsrOwotCX0KLQlzZWxmLT51ZmRfdXB0b2RhdGUgPSAxOwotCXJldHVybiAxOworICAgIGkgPSBwb3MgPSAwOworICAgIHdoaWxlIChQeURpY3RfTmV4dChzZWxmLT5kaWN0LCAmcG9zLCAma2V5LCAmdmFsdWUpKSB7CisgICAgICAgIHNlbGYtPnVmZHNbaV0uZmQgPSBQeUludF9Bc0xvbmcoa2V5KTsKKyAgICAgICAgc2VsZi0+dWZkc1tpXS5ldmVudHMgPSAoc2hvcnQpUHlJbnRfQXNMb25nKHZhbHVlKTsKKyAgICAgICAgaSsrOworICAgIH0KKyAgICBzZWxmLT51ZmRfdXB0b2RhdGUgPSAxOworICAgIHJldHVybiAxOwogfQogCiBQeURvY19TVFJWQVIocG9sbF9yZWdpc3Rlcl9kb2MsCkBAIC0zNjksMzkgKzM2OSwzOSBAQAogZXZlbnRzIC0tIGFuIG9wdGlvbmFsIGJpdG1hc2sgZGVzY3JpYmluZyB0aGUgdHlwZSBvZiBldmVudHMgdG8gY2hlY2sgZm9yIik7CiAKIHN0YXRpYyBQeU9iamVjdCAqCi1wb2xsX3JlZ2lzdGVyKHBvbGxPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKSAKK3BvbGxfcmVnaXN0ZXIocG9sbE9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKm8sICprZXksICp2YWx1ZTsKLQlpbnQgZmQsIGV2ZW50cyA9IFBPTExJTiB8IFBPTExQUkkgfCBQT0xMT1VUOwotCWludCBlcnI7CisgICAgUHlPYmplY3QgKm8sICprZXksICp2YWx1ZTsKKyAgICBpbnQgZmQsIGV2ZW50cyA9IFBPTExJTiB8IFBPTExQUkkgfCBQT0xMT1VUOworICAgIGludCBlcnI7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98aTpyZWdpc3RlciIsICZvLCAmZXZlbnRzKSkgewotCQlyZXR1cm4gTlVMTDsKLQl9Ci0gIAotCWZkID0gUHlPYmplY3RfQXNGaWxlRGVzY3JpcHRvcihvKTsKLQlpZiAoZmQgPT0gLTEpIHJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3xpOnJlZ2lzdGVyIiwgJm8sICZldmVudHMpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCS8qIEFkZCBlbnRyeSB0byB0aGUgaW50ZXJuYWwgZGljdGlvbmFyeTogdGhlIGtleSBpcyB0aGUgCi0JICAgZmlsZSBkZXNjcmlwdG9yLCBhbmQgdGhlIHZhbHVlIGlzIHRoZSBldmVudCBtYXNrLiAqLwotCWtleSA9IFB5SW50X0Zyb21Mb25nKGZkKTsKLQlpZiAoa2V5ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXZhbHVlID0gUHlJbnRfRnJvbUxvbmcoZXZlbnRzKTsKLQlpZiAodmFsdWUgPT0gTlVMTCkgewotCQlQeV9ERUNSRUYoa2V5KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWVyciA9IFB5RGljdF9TZXRJdGVtKHNlbGYtPmRpY3QsIGtleSwgdmFsdWUpOwotCVB5X0RFQ1JFRihrZXkpOwotCVB5X0RFQ1JFRih2YWx1ZSk7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBOVUxMOworICAgIGZkID0gUHlPYmplY3RfQXNGaWxlRGVzY3JpcHRvcihvKTsKKyAgICBpZiAoZmQgPT0gLTEpIHJldHVybiBOVUxMOwogCi0Jc2VsZi0+dWZkX3VwdG9kYXRlID0gMDsKKyAgICAvKiBBZGQgZW50cnkgdG8gdGhlIGludGVybmFsIGRpY3Rpb25hcnk6IHRoZSBrZXkgaXMgdGhlCisgICAgICAgZmlsZSBkZXNjcmlwdG9yLCBhbmQgdGhlIHZhbHVlIGlzIHRoZSBldmVudCBtYXNrLiAqLworICAgIGtleSA9IFB5SW50X0Zyb21Mb25nKGZkKTsKKyAgICBpZiAoa2V5ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHZhbHVlID0gUHlJbnRfRnJvbUxvbmcoZXZlbnRzKTsKKyAgICBpZiAodmFsdWUgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYoa2V5KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGVyciA9IFB5RGljdF9TZXRJdGVtKHNlbGYtPmRpY3QsIGtleSwgdmFsdWUpOworICAgIFB5X0RFQ1JFRihrZXkpOworICAgIFB5X0RFQ1JFRih2YWx1ZSk7CisgICAgaWYgKGVyciA8IDApCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNlbGYtPnVmZF91cHRvZGF0ZSA9IDA7CisKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIFB5RG9jX1NUUlZBUihwb2xsX21vZGlmeV9kb2MsCkBAIC00MTQsNDEgKzQxNCw0MSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHBvbGxfbW9kaWZ5KHBvbGxPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICpvLCAqa2V5LCAqdmFsdWU7Ci0JaW50IGZkLCBldmVudHM7Ci0JaW50IGVycjsKKyAgICBQeU9iamVjdCAqbywgKmtleSwgKnZhbHVlOworICAgIGludCBmZCwgZXZlbnRzOworICAgIGludCBlcnI7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9pOm1vZGlmeSIsICZvLCAmZXZlbnRzKSkgewotCQlyZXR1cm4gTlVMTDsKLQl9Ci0gIAotCWZkID0gUHlPYmplY3RfQXNGaWxlRGVzY3JpcHRvcihvKTsKLQlpZiAoZmQgPT0gLTEpIHJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT2k6bW9kaWZ5IiwgJm8sICZldmVudHMpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCS8qIE1vZGlmeSByZWdpc3RlcmVkIGZkICovCi0Ja2V5ID0gUHlJbnRfRnJvbUxvbmcoZmQpOwotCWlmIChrZXkgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKFB5RGljdF9HZXRJdGVtKHNlbGYtPmRpY3QsIGtleSkgPT0gTlVMTCkgewotCQllcnJubyA9IEVOT0VOVDsKLQkJUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JdmFsdWUgPSBQeUludF9Gcm9tTG9uZyhldmVudHMpOwotCWlmICh2YWx1ZSA9PSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRihrZXkpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZXJyID0gUHlEaWN0X1NldEl0ZW0oc2VsZi0+ZGljdCwga2V5LCB2YWx1ZSk7Ci0JUHlfREVDUkVGKGtleSk7Ci0JUHlfREVDUkVGKHZhbHVlKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIE5VTEw7CisgICAgZmQgPSBQeU9iamVjdF9Bc0ZpbGVEZXNjcmlwdG9yKG8pOworICAgIGlmIChmZCA9PSAtMSkgcmV0dXJuIE5VTEw7CiAKLQlzZWxmLT51ZmRfdXB0b2RhdGUgPSAwOworICAgIC8qIE1vZGlmeSByZWdpc3RlcmVkIGZkICovCisgICAga2V5ID0gUHlJbnRfRnJvbUxvbmcoZmQpOworICAgIGlmIChrZXkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKFB5RGljdF9HZXRJdGVtKHNlbGYtPmRpY3QsIGtleSkgPT0gTlVMTCkgeworICAgICAgICBlcnJubyA9IEVOT0VOVDsKKyAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgdmFsdWUgPSBQeUludF9Gcm9tTG9uZyhldmVudHMpOworICAgIGlmICh2YWx1ZSA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihrZXkpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZXJyID0gUHlEaWN0X1NldEl0ZW0oc2VsZi0+ZGljdCwga2V5LCB2YWx1ZSk7CisgICAgUHlfREVDUkVGKGtleSk7CisgICAgUHlfREVDUkVGKHZhbHVlKTsKKyAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2VsZi0+dWZkX3VwdG9kYXRlID0gMDsKKworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogCkBAIC00NTcsMzIgKzQ1NywzMiBAQAogUmVtb3ZlIGEgZmlsZSBkZXNjcmlwdG9yIGJlaW5nIHRyYWNrZWQgYnkgdGhlIHBvbGxpbmcgb2JqZWN0LiIpOwogCiBzdGF0aWMgUHlPYmplY3QgKgotcG9sbF91bnJlZ2lzdGVyKHBvbGxPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpvKSAKK3BvbGxfdW5yZWdpc3Rlcihwb2xsT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqbykKIHsKLQlQeU9iamVjdCAqa2V5OwotCWludCBmZDsKKyAgICBQeU9iamVjdCAqa2V5OworICAgIGludCBmZDsKIAotCWZkID0gUHlPYmplY3RfQXNGaWxlRGVzY3JpcHRvciggbyApOwotCWlmIChmZCA9PSAtMSkgCi0JCXJldHVybiBOVUxMOworICAgIGZkID0gUHlPYmplY3RfQXNGaWxlRGVzY3JpcHRvciggbyApOworICAgIGlmIChmZCA9PSAtMSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkvKiBDaGVjayB3aGV0aGVyIHRoZSBmZCBpcyBhbHJlYWR5IGluIHRoZSBhcnJheSAqLwotCWtleSA9IFB5SW50X0Zyb21Mb25nKGZkKTsKLQlpZiAoa2V5ID09IE5VTEwpIAotCQlyZXR1cm4gTlVMTDsKKyAgICAvKiBDaGVjayB3aGV0aGVyIHRoZSBmZCBpcyBhbHJlYWR5IGluIHRoZSBhcnJheSAqLworICAgIGtleSA9IFB5SW50X0Zyb21Mb25nKGZkKTsKKyAgICBpZiAoa2V5ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKFB5RGljdF9EZWxJdGVtKHNlbGYtPmRpY3QsIGtleSkgPT0gLTEpIHsKLQkJUHlfREVDUkVGKGtleSk7Ci0JCS8qIFRoaXMgd2lsbCBzaW1wbHkgcmFpc2UgdGhlIEtleUVycm9yIHNldCBieSBQeURpY3RfRGVsSXRlbQotCQkgICBpZiB0aGUgZmlsZSBkZXNjcmlwdG9yIGlzbid0IHJlZ2lzdGVyZWQuICovCi0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoUHlEaWN0X0RlbEl0ZW0oc2VsZi0+ZGljdCwga2V5KSA9PSAtMSkgeworICAgICAgICBQeV9ERUNSRUYoa2V5KTsKKyAgICAgICAgLyogVGhpcyB3aWxsIHNpbXBseSByYWlzZSB0aGUgS2V5RXJyb3Igc2V0IGJ5IFB5RGljdF9EZWxJdGVtCisgICAgICAgICAgIGlmIHRoZSBmaWxlIGRlc2NyaXB0b3IgaXNuJ3QgcmVnaXN0ZXJlZC4gKi8KKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JUHlfREVDUkVGKGtleSk7Ci0Jc2VsZi0+dWZkX3VwdG9kYXRlID0gMDsKKyAgICBQeV9ERUNSRUYoa2V5KTsKKyAgICBzZWxmLT51ZmRfdXB0b2RhdGUgPSAwOwogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogUHlEb2NfU1RSVkFSKHBvbGxfcG9sbF9kb2MsCkBAIC00OTEsMTYxICs0OTEsMTYxIEBACiBhbnkgZGVzY3JpcHRvcnMgdGhhdCBoYXZlIGV2ZW50cyBvciBlcnJvcnMgdG8gcmVwb3J0LiIpOwogCiBzdGF0aWMgUHlPYmplY3QgKgotcG9sbF9wb2xsKHBvbGxPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKSAKK3BvbGxfcG9sbChwb2xsT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqcmVzdWx0X2xpc3QgPSBOVUxMLCAqdG91dCA9IE5VTEw7Ci0JaW50IHRpbWVvdXQgPSAwLCBwb2xsX3Jlc3VsdCwgaSwgajsKLQlQeU9iamVjdCAqdmFsdWUgPSBOVUxMLCAqbnVtID0gTlVMTDsKKyAgICBQeU9iamVjdCAqcmVzdWx0X2xpc3QgPSBOVUxMLCAqdG91dCA9IE5VTEw7CisgICAgaW50IHRpbWVvdXQgPSAwLCBwb2xsX3Jlc3VsdCwgaSwgajsKKyAgICBQeU9iamVjdCAqdmFsdWUgPSBOVUxMLCAqbnVtID0gTlVMTDsKIAotCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInBvbGwiLCAwLCAxLCAmdG91dCkpIHsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInBvbGwiLCAwLCAxLCAmdG91dCkpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JLyogQ2hlY2sgdmFsdWVzIGZvciB0aW1lb3V0ICovCi0JaWYgKHRvdXQgPT0gTlVMTCB8fCB0b3V0ID09IFB5X05vbmUpCi0JCXRpbWVvdXQgPSAtMTsKLQllbHNlIGlmICghUHlOdW1iZXJfQ2hlY2sodG91dCkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkidGltZW91dCBtdXN0IGJlIGFuIGludGVnZXIgb3IgTm9uZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZWxzZSB7Ci0JCXRvdXQgPSBQeU51bWJlcl9JbnQodG91dCk7Ci0JCWlmICghdG91dCkKLQkJCXJldHVybiBOVUxMOwotCQl0aW1lb3V0ID0gUHlJbnRfQXNMb25nKHRvdXQpOwotCQlQeV9ERUNSRUYodG91dCk7Ci0JCWlmICh0aW1lb3V0ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgLyogQ2hlY2sgdmFsdWVzIGZvciB0aW1lb3V0ICovCisgICAgaWYgKHRvdXQgPT0gTlVMTCB8fCB0b3V0ID09IFB5X05vbmUpCisgICAgICAgIHRpbWVvdXQgPSAtMTsKKyAgICBlbHNlIGlmICghUHlOdW1iZXJfQ2hlY2sodG91dCkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0aW1lb3V0IG11c3QgYmUgYW4gaW50ZWdlciBvciBOb25lIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgdG91dCA9IFB5TnVtYmVyX0ludCh0b3V0KTsKKyAgICAgICAgaWYgKCF0b3V0KQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHRpbWVvdXQgPSBQeUludF9Bc0xvbmcodG91dCk7CisgICAgICAgIFB5X0RFQ1JFRih0b3V0KTsKKyAgICAgICAgaWYgKHRpbWVvdXQgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCS8qIEVuc3VyZSB0aGUgdWZkIGFycmF5IGlzIHVwIHRvIGRhdGUgKi8KLQlpZiAoIXNlbGYtPnVmZF91cHRvZGF0ZSkgCi0JCWlmICh1cGRhdGVfdWZkX2FycmF5KHNlbGYpID09IDApCi0JCQlyZXR1cm4gTlVMTDsKKyAgICAvKiBFbnN1cmUgdGhlIHVmZCBhcnJheSBpcyB1cCB0byBkYXRlICovCisgICAgaWYgKCFzZWxmLT51ZmRfdXB0b2RhdGUpCisgICAgICAgIGlmICh1cGRhdGVfdWZkX2FycmF5KHNlbGYpID09IDApCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKIAotCS8qIGNhbGwgcG9sbCgpICovCi0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCXBvbGxfcmVzdWx0ID0gcG9sbChzZWxmLT51ZmRzLCBzZWxmLT51ZmRfbGVuLCB0aW1lb3V0KTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotIAotCWlmIChwb2xsX3Jlc3VsdCA8IDApIHsKLQkJUHlFcnJfU2V0RnJvbUVycm5vKFNlbGVjdEVycm9yKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfSAKLSAgICAgICAKLQkvKiBidWlsZCB0aGUgcmVzdWx0IGxpc3QgKi8KLSAgCi0JcmVzdWx0X2xpc3QgPSBQeUxpc3RfTmV3KHBvbGxfcmVzdWx0KTsKLQlpZiAoIXJlc3VsdF9saXN0KSAKLQkJcmV0dXJuIE5VTEw7Ci0JZWxzZSB7Ci0JCWZvciAoaSA9IDAsIGogPSAwOyBqIDwgcG9sbF9yZXN1bHQ7IGorKykgewotIAkJCS8qIHNraXAgdG8gdGhlIG5leHQgZmlyZWQgZGVzY3JpcHRvciAqLwotIAkJCXdoaWxlICghc2VsZi0+dWZkc1tpXS5yZXZlbnRzKSB7Ci0gCQkJCWkrKzsKLSAJCQl9Ci0JCQkvKiBpZiB3ZSBoaXQgYSBOVUxMIHJldHVybiwgc2V0IHZhbHVlIHRvIE5VTEwKLQkJCSAgIGFuZCBicmVhayBvdXQgb2YgbG9vcDsgY29kZSBhdCBlbmQgd2lsbAotCQkJICAgY2xlYW4gdXAgcmVzdWx0X2xpc3QgKi8KLQkJCXZhbHVlID0gUHlUdXBsZV9OZXcoMik7Ci0JCQlpZiAodmFsdWUgPT0gTlVMTCkKLQkJCQlnb3RvIGVycm9yOwotCQkJbnVtID0gUHlJbnRfRnJvbUxvbmcoc2VsZi0+dWZkc1tpXS5mZCk7Ci0JCQlpZiAobnVtID09IE5VTEwpIHsKLQkJCQlQeV9ERUNSRUYodmFsdWUpOwotCQkJCWdvdG8gZXJyb3I7Ci0JCQl9Ci0JCQlQeVR1cGxlX1NFVF9JVEVNKHZhbHVlLCAwLCBudW0pOworICAgIC8qIGNhbGwgcG9sbCgpICovCisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIHBvbGxfcmVzdWx0ID0gcG9sbChzZWxmLT51ZmRzLCBzZWxmLT51ZmRfbGVuLCB0aW1lb3V0KTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogCi0JCQkvKiBUaGUgJjB4ZmZmZiBpcyBhIHdvcmthcm91bmQgZm9yIEFJWC4gICdyZXZlbnRzJwotCQkJICAgaXMgYSAxNi1iaXQgc2hvcnQsIGFuZCBJQk0gYXNzaWduZWQgUE9MTE5WQUwKLQkJCSAgIHRvIGJlIDB4ODAwMCwgc28gdGhlIGNvbnZlcnNpb24gdG8gaW50IHJlc3VsdHMKLQkJCSAgIGluIGEgbmVnYXRpdmUgbnVtYmVyLiBTZWUgU0YgYnVnICM5MjMzMTUuICovCi0JCQludW0gPSBQeUludF9Gcm9tTG9uZyhzZWxmLT51ZmRzW2ldLnJldmVudHMgJiAweGZmZmYpOwotCQkJaWYgKG51bSA9PSBOVUxMKSB7Ci0JCQkJUHlfREVDUkVGKHZhbHVlKTsKLQkJCQlnb3RvIGVycm9yOwotCQkJfQotCQkJUHlUdXBsZV9TRVRfSVRFTSh2YWx1ZSwgMSwgbnVtKTsKLSAJCQlpZiAoKFB5TGlzdF9TZXRJdGVtKHJlc3VsdF9saXN0LCBqLCB2YWx1ZSkpID09IC0xKSB7Ci0JCQkJUHlfREVDUkVGKHZhbHVlKTsKLQkJCQlnb3RvIGVycm9yOwotIAkJCX0KLSAJCQlpKys7Ci0gCQl9Ci0gCX0KLSAJcmV0dXJuIHJlc3VsdF9saXN0OworICAgIGlmIChwb2xsX3Jlc3VsdCA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKFNlbGVjdEVycm9yKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgLyogYnVpbGQgdGhlIHJlc3VsdCBsaXN0ICovCisKKyAgICByZXN1bHRfbGlzdCA9IFB5TGlzdF9OZXcocG9sbF9yZXN1bHQpOworICAgIGlmICghcmVzdWx0X2xpc3QpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGVsc2UgeworICAgICAgICBmb3IgKGkgPSAwLCBqID0gMDsgaiA8IHBvbGxfcmVzdWx0OyBqKyspIHsKKyAgICAgICAgICAgIC8qIHNraXAgdG8gdGhlIG5leHQgZmlyZWQgZGVzY3JpcHRvciAqLworICAgICAgICAgICAgd2hpbGUgKCFzZWxmLT51ZmRzW2ldLnJldmVudHMpIHsKKyAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBpZiB3ZSBoaXQgYSBOVUxMIHJldHVybiwgc2V0IHZhbHVlIHRvIE5VTEwKKyAgICAgICAgICAgICAgIGFuZCBicmVhayBvdXQgb2YgbG9vcDsgY29kZSBhdCBlbmQgd2lsbAorICAgICAgICAgICAgICAgY2xlYW4gdXAgcmVzdWx0X2xpc3QgKi8KKyAgICAgICAgICAgIHZhbHVlID0gUHlUdXBsZV9OZXcoMik7CisgICAgICAgICAgICBpZiAodmFsdWUgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgbnVtID0gUHlJbnRfRnJvbUxvbmcoc2VsZi0+dWZkc1tpXS5mZCk7CisgICAgICAgICAgICBpZiAobnVtID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYodmFsdWUpOworICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKHZhbHVlLCAwLCBudW0pOworCisgICAgICAgICAgICAvKiBUaGUgJjB4ZmZmZiBpcyBhIHdvcmthcm91bmQgZm9yIEFJWC4gICdyZXZlbnRzJworICAgICAgICAgICAgICAgaXMgYSAxNi1iaXQgc2hvcnQsIGFuZCBJQk0gYXNzaWduZWQgUE9MTE5WQUwKKyAgICAgICAgICAgICAgIHRvIGJlIDB4ODAwMCwgc28gdGhlIGNvbnZlcnNpb24gdG8gaW50IHJlc3VsdHMKKyAgICAgICAgICAgICAgIGluIGEgbmVnYXRpdmUgbnVtYmVyLiBTZWUgU0YgYnVnICM5MjMzMTUuICovCisgICAgICAgICAgICBudW0gPSBQeUludF9Gcm9tTG9uZyhzZWxmLT51ZmRzW2ldLnJldmVudHMgJiAweGZmZmYpOworICAgICAgICAgICAgaWYgKG51bSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHZhbHVlKTsKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlUdXBsZV9TRVRfSVRFTSh2YWx1ZSwgMSwgbnVtKTsKKyAgICAgICAgICAgIGlmICgoUHlMaXN0X1NldEl0ZW0ocmVzdWx0X2xpc3QsIGosIHZhbHVlKSkgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYodmFsdWUpOworICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpKys7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdF9saXN0OwogCiAgIGVycm9yOgotCVB5X0RFQ1JFRihyZXN1bHRfbGlzdCk7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlfREVDUkVGKHJlc3VsdF9saXN0KTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIHBvbGxfbWV0aG9kc1tdID0gewotCXsicmVnaXN0ZXIiLAkoUHlDRnVuY3Rpb24pcG9sbF9yZWdpc3RlciwJCi0JIE1FVEhfVkFSQVJHUywgIHBvbGxfcmVnaXN0ZXJfZG9jfSwKLQl7Im1vZGlmeSIsCShQeUNGdW5jdGlvbilwb2xsX21vZGlmeSwKLQkgTUVUSF9WQVJBUkdTLCAgcG9sbF9tb2RpZnlfZG9jfSwKLQl7InVucmVnaXN0ZXIiLAkoUHlDRnVuY3Rpb24pcG9sbF91bnJlZ2lzdGVyLAotCSBNRVRIX08sICAgICAgICBwb2xsX3VucmVnaXN0ZXJfZG9jfSwKLQl7InBvbGwiLAkoUHlDRnVuY3Rpb24pcG9sbF9wb2xsLAkKLQkgTUVUSF9WQVJBUkdTLCAgcG9sbF9wb2xsX2RvY30sCi0Je05VTEwsCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7InJlZ2lzdGVyIiwgICAgICAgIChQeUNGdW5jdGlvbilwb2xsX3JlZ2lzdGVyLAorICAgICBNRVRIX1ZBUkFSR1MsICBwb2xsX3JlZ2lzdGVyX2RvY30sCisgICAgeyJtb2RpZnkiLCAgICAgICAgICAoUHlDRnVuY3Rpb24pcG9sbF9tb2RpZnksCisgICAgIE1FVEhfVkFSQVJHUywgIHBvbGxfbW9kaWZ5X2RvY30sCisgICAgeyJ1bnJlZ2lzdGVyIiwgICAgICAoUHlDRnVuY3Rpb24pcG9sbF91bnJlZ2lzdGVyLAorICAgICBNRVRIX08sICAgICAgICBwb2xsX3VucmVnaXN0ZXJfZG9jfSwKKyAgICB7InBvbGwiLCAgICAgICAgICAgIChQeUNGdW5jdGlvbilwb2xsX3BvbGwsCisgICAgIE1FVEhfVkFSQVJHUywgIHBvbGxfcG9sbF9kb2N9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiBzdGF0aWMgcG9sbE9iamVjdCAqCiBuZXdQb2xsT2JqZWN0KHZvaWQpCiB7Ci0gICAgICAgIHBvbGxPYmplY3QgKnNlbGY7Ci0Jc2VsZiA9IFB5T2JqZWN0X05ldyhwb2xsT2JqZWN0LCAmcG9sbF9UeXBlKTsKLQlpZiAoc2VsZiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQkvKiB1ZmRfdXB0b2RhdGUgaXMgYSBCb29sZWFuLCBkZW5vdGluZyB3aGV0aGVyIHRoZSAKLQkgICBhcnJheSBwb2ludGVkIHRvIGJ5IHVmZHMgbWF0Y2hlcyB0aGUgY29udGVudHMgb2YgdGhlIGRpY3Rpb25hcnkuICovCi0Jc2VsZi0+dWZkX3VwdG9kYXRlID0gMDsKLQlzZWxmLT51ZmRzID0gTlVMTDsKLQlzZWxmLT5kaWN0ID0gUHlEaWN0X05ldygpOwotCWlmIChzZWxmLT5kaWN0ID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKHNlbGYpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIHNlbGY7CisgICAgcG9sbE9iamVjdCAqc2VsZjsKKyAgICBzZWxmID0gUHlPYmplY3RfTmV3KHBvbGxPYmplY3QsICZwb2xsX1R5cGUpOworICAgIGlmIChzZWxmID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIC8qIHVmZF91cHRvZGF0ZSBpcyBhIEJvb2xlYW4sIGRlbm90aW5nIHdoZXRoZXIgdGhlCisgICAgICAgYXJyYXkgcG9pbnRlZCB0byBieSB1ZmRzIG1hdGNoZXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBkaWN0aW9uYXJ5LiAqLworICAgIHNlbGYtPnVmZF91cHRvZGF0ZSA9IDA7CisgICAgc2VsZi0+dWZkcyA9IE5VTEw7CisgICAgc2VsZi0+ZGljdCA9IFB5RGljdF9OZXcoKTsKKyAgICBpZiAoc2VsZi0+ZGljdCA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihzZWxmKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBzZWxmOwogfQogCiBzdGF0aWMgdm9pZAogcG9sbF9kZWFsbG9jKHBvbGxPYmplY3QgKnNlbGYpCiB7Ci0JaWYgKHNlbGYtPnVmZHMgIT0gTlVMTCkKLQkJUHlNZW1fREVMKHNlbGYtPnVmZHMpOwotCVB5X1hERUNSRUYoc2VsZi0+ZGljdCk7Ci0gIAlQeU9iamVjdF9EZWwoc2VsZik7CisgICAgaWYgKHNlbGYtPnVmZHMgIT0gTlVMTCkKKyAgICAgICAgUHlNZW1fREVMKHNlbGYtPnVmZHMpOworICAgIFB5X1hERUNSRUYoc2VsZi0+ZGljdCk7CisgICAgUHlPYmplY3RfRGVsKHNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogcG9sbF9nZXRhdHRyKHBvbGxPYmplY3QgKnNlbGYsIGNoYXIgKm5hbWUpCiB7Ci0JcmV0dXJuIFB5X0ZpbmRNZXRob2QocG9sbF9tZXRob2RzLCAoUHlPYmplY3QgKilzZWxmLCBuYW1lKTsKKyAgICByZXR1cm4gUHlfRmluZE1ldGhvZChwb2xsX21ldGhvZHMsIChQeU9iamVjdCAqKXNlbGYsIG5hbWUpOwogfQogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IHBvbGxfVHlwZSA9IHsKLQkvKiBUaGUgb2JfdHlwZSBmaWVsZCBtdXN0IGJlIGluaXRpYWxpemVkIGluIHRoZSBtb2R1bGUgaW5pdCBmdW5jdGlvbgotCSAqIHRvIGJlIHBvcnRhYmxlIHRvIFdpbmRvd3Mgd2l0aG91dCB1c2luZyBDKysuICovCi0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JInNlbGVjdC5wb2xsIiwJCS8qdHBfbmFtZSovCi0Jc2l6ZW9mKHBvbGxPYmplY3QpLAkvKnRwX2Jhc2ljc2l6ZSovCi0JMCwJCQkvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpcG9sbF9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsCQkJLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKXBvbGxfZ2V0YXR0ciwgLyp0cF9nZXRhdHRyKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHIqLwotCTAsCQkJLyp0cF9jb21wYXJlKi8KLQkwLAkJCS8qdHBfcmVwciovCi0JMCwJCQkvKnRwX2FzX251bWJlciovCi0JMCwJCQkvKnRwX2FzX3NlcXVlbmNlKi8KLQkwLAkJCS8qdHBfYXNfbWFwcGluZyovCi0JMCwJCQkvKnRwX2hhc2gqLworICAgIC8qIFRoZSBvYl90eXBlIGZpZWxkIG11c3QgYmUgaW5pdGlhbGl6ZWQgaW4gdGhlIG1vZHVsZSBpbml0IGZ1bmN0aW9uCisgICAgICogdG8gYmUgcG9ydGFibGUgdG8gV2luZG93cyB3aXRob3V0IHVzaW5nIEMrKy4gKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAic2VsZWN0LnBvbGwiLCAgICAgICAgICAgICAgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YocG9sbE9iamVjdCksICAgICAgICAgLyp0cF9iYXNpY3NpemUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpcG9sbF9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpcG9sbF9nZXRhdHRyLCAvKnRwX2dldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc2V0YXR0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY29tcGFyZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmVwciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbnVtYmVyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19zZXF1ZW5jZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbWFwcGluZyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaGFzaCovCiB9OwogCiBQeURvY19TVFJWQVIocG9sbF9kb2MsCkBAIC02NTUsMzYgKzY1NSwzNiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNlbGVjdF9wb2xsKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdW51c2VkKQogewotCXJldHVybiAoUHlPYmplY3QgKiluZXdQb2xsT2JqZWN0KCk7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKW5ld1BvbGxPYmplY3QoKTsKIH0KIAogI2lmZGVmIF9fQVBQTEVfXwotLyogCisvKgogICogT24gc29tZSBzeXN0ZW1zIHBvbGwoKSBzZXRzIGVycm5vIG9uIGludmFsaWQgZmlsZSBkZXNjcmlwdG9ycy4gV2UgdGVzdAogICogZm9yIHRoaXMgYXQgcnVudGltZSBiZWNhdXNlIHRoaXMgYnVnIG1heSBiZSBmaXhlZCBvciBpbnRyb2R1Y2VkIGJldHdlZW4KICAqIE9TIHJlbGVhc2VzLgogICovCiBzdGF0aWMgaW50IHNlbGVjdF9oYXZlX2Jyb2tlbl9wb2xsKHZvaWQpCiB7Ci0JaW50IHBvbGxfdGVzdDsKLQlpbnQgZmlsZWRlc1syXTsKKyAgICBpbnQgcG9sbF90ZXN0OworICAgIGludCBmaWxlZGVzWzJdOwogCi0Jc3RydWN0IHBvbGxmZCBwb2xsX3N0cnVjdCA9IHsgMCwgUE9MTElOfFBPTExQUkl8UE9MTE9VVCwgMCB9OworICAgIHN0cnVjdCBwb2xsZmQgcG9sbF9zdHJ1Y3QgPSB7IDAsIFBPTExJTnxQT0xMUFJJfFBPTExPVVQsIDAgfTsKIAotCS8qIENyZWF0ZSBhIGZpbGUgZGVzY3JpcHRvciB0byBtYWtlIGludmFsaWQgKi8KLQlpZiAocGlwZShmaWxlZGVzKSA8IDApIHsKLQkJcmV0dXJuIDE7Ci0JfQotCXBvbGxfc3RydWN0LmZkID0gZmlsZWRlc1swXTsKLQljbG9zZShmaWxlZGVzWzBdKTsKLQljbG9zZShmaWxlZGVzWzFdKTsKLQlwb2xsX3Rlc3QgPSBwb2xsKCZwb2xsX3N0cnVjdCwgMSwgMCk7Ci0JaWYgKHBvbGxfdGVzdCA8IDApIHsKLQkJcmV0dXJuIDE7Ci0JfSBlbHNlIGlmIChwb2xsX3Rlc3QgPT0gMCAmJiBwb2xsX3N0cnVjdC5yZXZlbnRzICE9IFBPTExOVkFMKSB7Ci0JCXJldHVybiAxOwotCX0KLQlyZXR1cm4gMDsKKyAgICAvKiBDcmVhdGUgYSBmaWxlIGRlc2NyaXB0b3IgdG8gbWFrZSBpbnZhbGlkICovCisgICAgaWYgKHBpcGUoZmlsZWRlcykgPCAwKSB7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBwb2xsX3N0cnVjdC5mZCA9IGZpbGVkZXNbMF07CisgICAgY2xvc2UoZmlsZWRlc1swXSk7CisgICAgY2xvc2UoZmlsZWRlc1sxXSk7CisgICAgcG9sbF90ZXN0ID0gcG9sbCgmcG9sbF9zdHJ1Y3QsIDEsIDApOworICAgIGlmIChwb2xsX3Rlc3QgPCAwKSB7CisgICAgICAgIHJldHVybiAxOworICAgIH0gZWxzZSBpZiAocG9sbF90ZXN0ID09IDAgJiYgcG9sbF9zdHJ1Y3QucmV2ZW50cyAhPSBQT0xMTlZBTCkgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAjZW5kaWYgLyogX19BUFBMRV9fICovCiAKQEAgLTcwMyw4ICs3MDMsOCBAQAogI2VuZGlmCiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JU09DS0VUIGVwZmQ7CQkJLyogZXBvbGwgY29udHJvbCBmaWxlIGRlc2NyaXB0b3IgKi8KKyAgICBQeU9iamVjdF9IRUFECisgICAgU09DS0VUIGVwZmQ7ICAgICAgICAgICAgICAgICAgICAgICAgLyogZXBvbGwgY29udHJvbCBmaWxlIGRlc2NyaXB0b3IgKi8KIH0gcHlFcG9sbF9PYmplY3Q7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgcHlFcG9sbF9UeXBlOwpAQCAtNzEzLDkyICs3MTMsOTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBweWVwb2xsX2Vycl9jbG9zZWQodm9pZCkKIHsKLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIkkvTyBvcGVyYXRpb24gb24gY2xvc2VkIGVwb2xsIGZkIik7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJJL08gb3BlcmF0aW9uIG9uIGNsb3NlZCBlcG9sbCBmZCIpOworICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgaW50CiBweWVwb2xsX2ludGVybmFsX2Nsb3NlKHB5RXBvbGxfT2JqZWN0ICpzZWxmKQogewotCWludCBzYXZlX2Vycm5vID0gMDsKLQlpZiAoc2VsZi0+ZXBmZCA+PSAwKSB7Ci0JCWludCBlcGZkID0gc2VsZi0+ZXBmZDsKLQkJc2VsZi0+ZXBmZCA9IC0xOwotCQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JCWlmIChjbG9zZShlcGZkKSA8IDApCi0JCQlzYXZlX2Vycm5vID0gZXJybm87Ci0JCVB5X0VORF9BTExPV19USFJFQURTCi0JfQotCXJldHVybiBzYXZlX2Vycm5vOworICAgIGludCBzYXZlX2Vycm5vID0gMDsKKyAgICBpZiAoc2VsZi0+ZXBmZCA+PSAwKSB7CisgICAgICAgIGludCBlcGZkID0gc2VsZi0+ZXBmZDsKKyAgICAgICAgc2VsZi0+ZXBmZCA9IC0xOworICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgICAgIGlmIChjbG9zZShlcGZkKSA8IDApCisgICAgICAgICAgICBzYXZlX2Vycm5vID0gZXJybm87CisgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgfQorICAgIHJldHVybiBzYXZlX2Vycm5vOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbmV3UHlFcG9sbF9PYmplY3QoUHlUeXBlT2JqZWN0ICp0eXBlLCBpbnQgc2l6ZWhpbnQsIFNPQ0tFVCBmZCkKIHsKLQlweUVwb2xsX09iamVjdCAqc2VsZjsKLQkKLQlpZiAoc2l6ZWhpbnQgPT0gLTEpIHsKLQkJc2l6ZWhpbnQgPSBGRF9TRVRTSVpFLTE7Ci0JfQotCWVsc2UgaWYgKHNpemVoaW50IDwgMSkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKLQkJCSAgICAgInNpemVoaW50IG11c3QgYmUgZ3JlYXRlciB6ZXJvLCBnb3QgJWQiLAotCQkJICAgICBzaXplaGludCk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBweUVwb2xsX09iamVjdCAqc2VsZjsKIAotCWFzc2VydCh0eXBlICE9IE5VTEwgJiYgdHlwZS0+dHBfYWxsb2MgIT0gTlVMTCk7Ci0Jc2VsZiA9IChweUVwb2xsX09iamVjdCAqKSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKLQlpZiAoc2VsZiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoc2l6ZWhpbnQgPT0gLTEpIHsKKyAgICAgICAgc2l6ZWhpbnQgPSBGRF9TRVRTSVpFLTE7CisgICAgfQorICAgIGVsc2UgaWYgKHNpemVoaW50IDwgMSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJzaXplaGludCBtdXN0IGJlIGdyZWF0ZXIgemVybywgZ290ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgIHNpemVoaW50KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaWYgKGZkID09IC0xKSB7Ci0JCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQkJc2VsZi0+ZXBmZCA9IGVwb2xsX2NyZWF0ZShzaXplaGludCk7Ci0JCVB5X0VORF9BTExPV19USFJFQURTCi0JfQotCWVsc2UgewotCQlzZWxmLT5lcGZkID0gZmQ7Ci0JfQotCWlmIChzZWxmLT5lcGZkIDwgMCkgewotCQlQeV9ERUNSRUYoc2VsZik7Ci0JCVB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiAoUHlPYmplY3QgKilzZWxmOworICAgIGFzc2VydCh0eXBlICE9IE5VTEwgJiYgdHlwZS0+dHBfYWxsb2MgIT0gTlVMTCk7CisgICAgc2VsZiA9IChweUVwb2xsX09iamVjdCAqKSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKKyAgICBpZiAoc2VsZiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGlmIChmZCA9PSAtMSkgeworICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgICAgIHNlbGYtPmVwZmQgPSBlcG9sbF9jcmVhdGUoc2l6ZWhpbnQpOworICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgc2VsZi0+ZXBmZCA9IGZkOworICAgIH0KKyAgICBpZiAoc2VsZi0+ZXBmZCA8IDApIHsKKyAgICAgICAgUHlfREVDUkVGKHNlbGYpOworICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKIH0KIAogCiBzdGF0aWMgUHlPYmplY3QgKgogcHllcG9sbF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JaW50IHNpemVoaW50ID0gLTE7Ci0Jc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJzaXplaGludCIsIE5VTEx9OworICAgIGludCBzaXplaGludCA9IC0xOworICAgIHN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsic2l6ZWhpbnQiLCBOVUxMfTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJ8aTplcG9sbCIsIGt3bGlzdCwKLQkJCQkJICZzaXplaGludCkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJ8aTplcG9sbCIsIGt3bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZWhpbnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXJldHVybiBuZXdQeUVwb2xsX09iamVjdCh0eXBlLCBzaXplaGludCwgLTEpOworICAgIHJldHVybiBuZXdQeUVwb2xsX09iamVjdCh0eXBlLCBzaXplaGludCwgLTEpOwogfQogCiAKIHN0YXRpYyB2b2lkCiBweWVwb2xsX2RlYWxsb2MocHlFcG9sbF9PYmplY3QgKnNlbGYpCiB7Ci0JKHZvaWQpcHllcG9sbF9pbnRlcm5hbF9jbG9zZShzZWxmKTsKLQlQeV9UWVBFKHNlbGYpLT50cF9mcmVlKHNlbGYpOworICAgICh2b2lkKXB5ZXBvbGxfaW50ZXJuYWxfY2xvc2Uoc2VsZik7CisgICAgUHlfVFlQRShzZWxmKS0+dHBfZnJlZShzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0KgogcHllcG9sbF9jbG9zZShweUVwb2xsX09iamVjdCAqc2VsZikKIHsKLQllcnJubyA9IHB5ZXBvbGxfaW50ZXJuYWxfY2xvc2Uoc2VsZik7Ci0JaWYgKGVycm5vIDwgMCkgewotCQlQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlQeV9SRVRVUk5fTk9ORTsKKyAgICBlcnJubyA9IHB5ZXBvbGxfaW50ZXJuYWxfY2xvc2Uoc2VsZik7CisgICAgaWYgKGVycm5vIDwgMCkgeworICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAogUHlEb2NfU1RSVkFSKHB5ZXBvbGxfY2xvc2VfZG9jLApAQCAtODEwLDE4ICs4MTAsMTggQEAKIHN0YXRpYyBQeU9iamVjdCoKIHB5ZXBvbGxfZ2V0X2Nsb3NlZChweUVwb2xsX09iamVjdCAqc2VsZikKIHsKLQlpZiAoc2VsZi0+ZXBmZCA8IDApCi0JCVB5X1JFVFVSTl9UUlVFOwotCWVsc2UKLQkJUHlfUkVUVVJOX0ZBTFNFOworICAgIGlmIChzZWxmLT5lcGZkIDwgMCkKKyAgICAgICAgUHlfUkVUVVJOX1RSVUU7CisgICAgZWxzZQorICAgICAgICBQeV9SRVRVUk5fRkFMU0U7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCoKIHB5ZXBvbGxfZmlsZW5vKHB5RXBvbGxfT2JqZWN0ICpzZWxmKQogewotCWlmIChzZWxmLT5lcGZkIDwgMCkKLQkJcmV0dXJuIHB5ZXBvbGxfZXJyX2Nsb3NlZCgpOwotCXJldHVybiBQeUludF9Gcm9tTG9uZyhzZWxmLT5lcGZkKTsKKyAgICBpZiAoc2VsZi0+ZXBmZCA8IDApCisgICAgICAgIHJldHVybiBweWVwb2xsX2Vycl9jbG9zZWQoKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoc2VsZi0+ZXBmZCk7CiB9CiAKIFB5RG9jX1NUUlZBUihweWVwb2xsX2ZpbGVub19kb2MsCkBAIC04MzIsMTIgKzgzMiwxMiBAQAogc3RhdGljIFB5T2JqZWN0KgogcHllcG9sbF9mcm9tZmQoUHlPYmplY3QgKmNscywgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JU09DS0VUIGZkOworICAgIFNPQ0tFVCBmZDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpmcm9tZmQiLCAmZmQpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6ZnJvbWZkIiwgJmZkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlyZXR1cm4gbmV3UHlFcG9sbF9PYmplY3QoKFB5VHlwZU9iamVjdCopY2xzLCAtMSwgZmQpOworICAgIHJldHVybiBuZXdQeUVwb2xsX09iamVjdCgoUHlUeXBlT2JqZWN0KiljbHMsIC0xLCBmZCk7CiB9CiAKIFB5RG9jX1NUUlZBUihweWVwb2xsX2Zyb21mZF9kb2MsCkBAIC04NDgsNjUgKzg0OCw2NSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHB5ZXBvbGxfaW50ZXJuYWxfY3RsKGludCBlcGZkLCBpbnQgb3AsIFB5T2JqZWN0ICpwZmQsIHVuc2lnbmVkIGludCBldmVudHMpCiB7Ci0Jc3RydWN0IGVwb2xsX2V2ZW50IGV2OwotCWludCByZXN1bHQ7Ci0JaW50IGZkOworICAgIHN0cnVjdCBlcG9sbF9ldmVudCBldjsKKyAgICBpbnQgcmVzdWx0OworICAgIGludCBmZDsKIAotCWlmIChlcGZkIDwgMCkKLQkJcmV0dXJuIHB5ZXBvbGxfZXJyX2Nsb3NlZCgpOworICAgIGlmIChlcGZkIDwgMCkKKyAgICAgICAgcmV0dXJuIHB5ZXBvbGxfZXJyX2Nsb3NlZCgpOwogCi0JZmQgPSBQeU9iamVjdF9Bc0ZpbGVEZXNjcmlwdG9yKHBmZCk7Ci0JaWYgKGZkID09IC0xKSB7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBmZCA9IFB5T2JqZWN0X0FzRmlsZURlc2NyaXB0b3IocGZkKTsKKyAgICBpZiAoZmQgPT0gLTEpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0Jc3dpdGNoKG9wKSB7Ci0JICAgIGNhc2UgRVBPTExfQ1RMX0FERDoKLQkgICAgY2FzZSBFUE9MTF9DVExfTU9EOgotCQlldi5ldmVudHMgPSBldmVudHM7Ci0JCWV2LmRhdGEuZmQgPSBmZDsKLQkJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCQlyZXN1bHQgPSBlcG9sbF9jdGwoZXBmZCwgb3AsIGZkLCAmZXYpOwotCQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCQlicmVhazsKLQkgICAgY2FzZSBFUE9MTF9DVExfREVMOgotCQkvKiBJbiBrZXJuZWwgdmVyc2lvbnMgYmVmb3JlIDIuNi45LCB0aGUgRVBPTExfQ1RMX0RFTAotCQkgKiBvcGVyYXRpb24gcmVxdWlyZWQgYSBub24tTlVMTCBwb2ludGVyIGluIGV2ZW50LCBldmVuCi0JCSAqIHRob3VnaCB0aGlzIGFyZ3VtZW50IGlzIGlnbm9yZWQuICovCi0JCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQkJcmVzdWx0ID0gZXBvbGxfY3RsKGVwZmQsIG9wLCBmZCwgJmV2KTsKLQkJaWYgKGVycm5vID09IEVCQURGKSB7Ci0JCQkvKiBmZCBhbHJlYWR5IGNsb3NlZCAqLwotCQkJcmVzdWx0ID0gMDsKLQkJCWVycm5vID0gMDsKLQkJfQotCQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCQlicmVhazsKLQkgICAgZGVmYXVsdDoKLQkJcmVzdWx0ID0gLTE7Ci0JCWVycm5vID0gRUlOVkFMOwotCX0KKyAgICBzd2l0Y2gob3ApIHsKKyAgICAgICAgY2FzZSBFUE9MTF9DVExfQUREOgorICAgICAgICBjYXNlIEVQT0xMX0NUTF9NT0Q6CisgICAgICAgIGV2LmV2ZW50cyA9IGV2ZW50czsKKyAgICAgICAgZXYuZGF0YS5mZCA9IGZkOworICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgICAgIHJlc3VsdCA9IGVwb2xsX2N0bChlcGZkLCBvcCwgZmQsICZldik7CisgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVQT0xMX0NUTF9ERUw6CisgICAgICAgIC8qIEluIGtlcm5lbCB2ZXJzaW9ucyBiZWZvcmUgMi42LjksIHRoZSBFUE9MTF9DVExfREVMCisgICAgICAgICAqIG9wZXJhdGlvbiByZXF1aXJlZCBhIG5vbi1OVUxMIHBvaW50ZXIgaW4gZXZlbnQsIGV2ZW4KKyAgICAgICAgICogdGhvdWdoIHRoaXMgYXJndW1lbnQgaXMgaWdub3JlZC4gKi8KKyAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICByZXN1bHQgPSBlcG9sbF9jdGwoZXBmZCwgb3AsIGZkLCAmZXYpOworICAgICAgICBpZiAoZXJybm8gPT0gRUJBREYpIHsKKyAgICAgICAgICAgIC8qIGZkIGFscmVhZHkgY2xvc2VkICovCisgICAgICAgICAgICByZXN1bHQgPSAwOworICAgICAgICAgICAgZXJybm8gPSAwOworICAgICAgICB9CisgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICByZXN1bHQgPSAtMTsKKyAgICAgICAgZXJybm8gPSBFSU5WQUw7CisgICAgfQogCi0JaWYgKHJlc3VsdCA8IDApIHsKLQkJUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JUHlfUkVUVVJOX05PTkU7CisgICAgaWYgKHJlc3VsdCA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBweWVwb2xsX3JlZ2lzdGVyKHB5RXBvbGxfT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JUHlPYmplY3QgKnBmZDsKLQl1bnNpZ25lZCBpbnQgZXZlbnRzID0gRVBPTExJTiB8IEVQT0xMT1VUIHwgRVBPTExQUkk7Ci0Jc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJmZCIsICJldmVudG1hc2siLCBOVUxMfTsKKyAgICBQeU9iamVjdCAqcGZkOworICAgIHVuc2lnbmVkIGludCBldmVudHMgPSBFUE9MTElOIHwgRVBPTExPVVQgfCBFUE9MTFBSSTsKKyAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7ImZkIiwgImV2ZW50bWFzayIsIE5VTEx9OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgIk98STpyZWdpc3RlciIsIGt3bGlzdCwKLQkJCQkJICZwZmQsICZldmVudHMpKSB7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAiT3xJOnJlZ2lzdGVyIiwga3dsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwZmQsICZldmVudHMpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXJldHVybiBweWVwb2xsX2ludGVybmFsX2N0bChzZWxmLT5lcGZkLCBFUE9MTF9DVExfQURELCBwZmQsIGV2ZW50cyk7CisgICAgcmV0dXJuIHB5ZXBvbGxfaW50ZXJuYWxfY3RsKHNlbGYtPmVwZmQsIEVQT0xMX0NUTF9BREQsIHBmZCwgZXZlbnRzKTsKIH0KIAogUHlEb2NfU1RSVkFSKHB5ZXBvbGxfcmVnaXN0ZXJfZG9jLApAQCAtOTIzLDE2ICs5MjMsMTYgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBweWVwb2xsX21vZGlmeShweUVwb2xsX09iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCVB5T2JqZWN0ICpwZmQ7Ci0JdW5zaWduZWQgaW50IGV2ZW50czsKLQlzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7ImZkIiwgImV2ZW50bWFzayIsIE5VTEx9OworICAgIFB5T2JqZWN0ICpwZmQ7CisgICAgdW5zaWduZWQgaW50IGV2ZW50czsKKyAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7ImZkIiwgImV2ZW50bWFzayIsIE5VTEx9OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgIk9JOm1vZGlmeSIsIGt3bGlzdCwKLQkJCQkJICZwZmQsICZldmVudHMpKSB7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAiT0k6bW9kaWZ5Iiwga3dsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwZmQsICZldmVudHMpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXJldHVybiBweWVwb2xsX2ludGVybmFsX2N0bChzZWxmLT5lcGZkLCBFUE9MTF9DVExfTU9ELCBwZmQsIGV2ZW50cyk7CisgICAgcmV0dXJuIHB5ZXBvbGxfaW50ZXJuYWxfY3RsKHNlbGYtPmVwZmQsIEVQT0xMX0NUTF9NT0QsIHBmZCwgZXZlbnRzKTsKIH0KIAogUHlEb2NfU1RSVkFSKHB5ZXBvbGxfbW9kaWZ5X2RvYywKQEAgLTk0NCwxNSArOTQ0LDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogcHllcG9sbF91bnJlZ2lzdGVyKHB5RXBvbGxfT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JUHlPYmplY3QgKnBmZDsKLQlzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7ImZkIiwgTlVMTH07CisgICAgUHlPYmplY3QgKnBmZDsKKyAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7ImZkIiwgTlVMTH07CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAiTzp1bnJlZ2lzdGVyIiwga3dsaXN0LAotCQkJCQkgJnBmZCkpIHsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJPOnVucmVnaXN0ZXIiLCBrd2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBmZCkpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JcmV0dXJuIHB5ZXBvbGxfaW50ZXJuYWxfY3RsKHNlbGYtPmVwZmQsIEVQT0xMX0NUTF9ERUwsIHBmZCwgMCk7CisgICAgcmV0dXJuIHB5ZXBvbGxfaW50ZXJuYWxfY3RsKHNlbGYtPmVwZmQsIEVQT0xMX0NUTF9ERUwsIHBmZCwgMCk7CiB9CiAKIFB5RG9jX1NUUlZBUihweWVwb2xsX3VucmVnaXN0ZXJfZG9jLApAQCAtOTYzLDc2ICs5NjMsNzYgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBweWVwb2xsX3BvbGwocHlFcG9sbF9PYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlkb3VibGUgZHRpbWVvdXQgPSAtMS47Ci0JaW50IHRpbWVvdXQ7Ci0JaW50IG1heGV2ZW50cyA9IC0xOwotCWludCBuZmRzLCBpOwotCVB5T2JqZWN0ICplbGlzdCA9IE5VTEwsICpldHVwbGUgPSBOVUxMOwotCXN0cnVjdCBlcG9sbF9ldmVudCAqZXZzID0gTlVMTDsKLQlzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7InRpbWVvdXQiLCAibWF4ZXZlbnRzIiwgTlVMTH07CisgICAgZG91YmxlIGR0aW1lb3V0ID0gLTEuOworICAgIGludCB0aW1lb3V0OworICAgIGludCBtYXhldmVudHMgPSAtMTsKKyAgICBpbnQgbmZkcywgaTsKKyAgICBQeU9iamVjdCAqZWxpc3QgPSBOVUxMLCAqZXR1cGxlID0gTlVMTDsKKyAgICBzdHJ1Y3QgZXBvbGxfZXZlbnQgKmV2cyA9IE5VTEw7CisgICAgc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJ0aW1lb3V0IiwgIm1heGV2ZW50cyIsIE5VTEx9OwogCi0JaWYgKHNlbGYtPmVwZmQgPCAwKQotCQlyZXR1cm4gcHllcG9sbF9lcnJfY2xvc2VkKCk7CisgICAgaWYgKHNlbGYtPmVwZmQgPCAwKQorICAgICAgICByZXR1cm4gcHllcG9sbF9lcnJfY2xvc2VkKCk7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAifGRpOnBvbGwiLCBrd2xpc3QsCi0JCQkJCSAmZHRpbWVvdXQsICZtYXhldmVudHMpKSB7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAifGRpOnBvbGwiLCBrd2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmR0aW1lb3V0LCAmbWF4ZXZlbnRzKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlpZiAoZHRpbWVvdXQgPCAwKSB7Ci0JCXRpbWVvdXQgPSAtMTsKLQl9Ci0JZWxzZSBpZiAoZHRpbWVvdXQgKiAxMDAwLjAgPiBJTlRfTUFYKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJCSJ0aW1lb3V0IGlzIHRvbyBsYXJnZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZWxzZSB7Ci0JCXRpbWVvdXQgPSAoaW50KShkdGltZW91dCAqIDEwMDAuMCk7Ci0JfQorICAgIGlmIChkdGltZW91dCA8IDApIHsKKyAgICAgICAgdGltZW91dCA9IC0xOworICAgIH0KKyAgICBlbHNlIGlmIChkdGltZW91dCAqIDEwMDAuMCA+IElOVF9NQVgpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAidGltZW91dCBpcyB0b28gbGFyZ2UiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICB0aW1lb3V0ID0gKGludCkoZHRpbWVvdXQgKiAxMDAwLjApOworICAgIH0KIAotCWlmIChtYXhldmVudHMgPT0gLTEpIHsKLQkJbWF4ZXZlbnRzID0gRkRfU0VUU0laRS0xOwotCX0KLQllbHNlIGlmIChtYXhldmVudHMgPCAxKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAotCQkJICAgICAibWF4ZXZlbnRzIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAsIGdvdCAlZCIsCi0JCQkgICAgIG1heGV2ZW50cyk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAobWF4ZXZlbnRzID09IC0xKSB7CisgICAgICAgIG1heGV2ZW50cyA9IEZEX1NFVFNJWkUtMTsKKyAgICB9CisgICAgZWxzZSBpZiAobWF4ZXZlbnRzIDwgMSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJtYXhldmVudHMgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCwgZ290ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgIG1heGV2ZW50cyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWV2cyA9IFB5TWVtX05ldyhzdHJ1Y3QgZXBvbGxfZXZlbnQsIG1heGV2ZW50cyk7Ci0JaWYgKGV2cyA9PSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRihzZWxmKTsKLQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGV2cyA9IFB5TWVtX05ldyhzdHJ1Y3QgZXBvbGxfZXZlbnQsIG1heGV2ZW50cyk7CisgICAgaWYgKGV2cyA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihzZWxmKTsKKyAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCW5mZHMgPSBlcG9sbF93YWl0KHNlbGYtPmVwZmQsIGV2cywgbWF4ZXZlbnRzLCB0aW1lb3V0KTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCWlmIChuZmRzIDwgMCkgewotCQlQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7Ci0JCWdvdG8gZXJyb3I7Ci0JfQorICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICBuZmRzID0gZXBvbGxfd2FpdChzZWxmLT5lcGZkLCBldnMsIG1heGV2ZW50cywgdGltZW91dCk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBpZiAobmZkcyA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KIAotCWVsaXN0ID0gUHlMaXN0X05ldyhuZmRzKTsKLQlpZiAoZWxpc3QgPT0gTlVMTCkgewotCQlnb3RvIGVycm9yOwotCX0KKyAgICBlbGlzdCA9IFB5TGlzdF9OZXcobmZkcyk7CisgICAgaWYgKGVsaXN0ID09IE5VTEwpIHsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CiAKLQlmb3IgKGkgPSAwOyBpIDwgbmZkczsgaSsrKSB7Ci0JCWV0dXBsZSA9IFB5X0J1aWxkVmFsdWUoImlJIiwgZXZzW2ldLmRhdGEuZmQsIGV2c1tpXS5ldmVudHMpOwotCQlpZiAoZXR1cGxlID09IE5VTEwpIHsKLQkJCVB5X0NMRUFSKGVsaXN0KTsKLQkJCWdvdG8gZXJyb3I7Ci0JCX0KLQkJUHlMaXN0X1NFVF9JVEVNKGVsaXN0LCBpLCBldHVwbGUpOwotCX0KKyAgICBmb3IgKGkgPSAwOyBpIDwgbmZkczsgaSsrKSB7CisgICAgICAgIGV0dXBsZSA9IFB5X0J1aWxkVmFsdWUoImlJIiwgZXZzW2ldLmRhdGEuZmQsIGV2c1tpXS5ldmVudHMpOworICAgICAgICBpZiAoZXR1cGxlID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0NMRUFSKGVsaXN0KTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgUHlMaXN0X1NFVF9JVEVNKGVsaXN0LCBpLCBldHVwbGUpOworICAgIH0KIAogICAgIGVycm9yOgotCVB5TWVtX0ZyZWUoZXZzKTsKLQlyZXR1cm4gZWxpc3Q7CisgICAgUHlNZW1fRnJlZShldnMpOworICAgIHJldHVybiBlbGlzdDsKIH0KIAogUHlEb2NfU1RSVkFSKHB5ZXBvbGxfcG9sbF9kb2MsCkBAIC0xMDQzLDI3ICsxMDQzLDI3IEBACiBVcCB0byBtYXhldmVudHMgYXJlIHJldHVybmVkIHRvIHRoZSBjYWxsZXIuIik7CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBweWVwb2xsX21ldGhvZHNbXSA9IHsKLQl7ImZyb21mZCIsCShQeUNGdW5jdGlvbilweWVwb2xsX2Zyb21mZCwKLQkgTUVUSF9WQVJBUkdTIHwgTUVUSF9DTEFTUywgcHllcG9sbF9mcm9tZmRfZG9jfSwKLQl7ImNsb3NlIiwJKFB5Q0Z1bmN0aW9uKXB5ZXBvbGxfY2xvc2UsCU1FVEhfTk9BUkdTLAotCSBweWVwb2xsX2Nsb3NlX2RvY30sCi0JeyJmaWxlbm8iLAkoUHlDRnVuY3Rpb24pcHllcG9sbF9maWxlbm8sCU1FVEhfTk9BUkdTLAotCSBweWVwb2xsX2ZpbGVub19kb2N9LAotCXsibW9kaWZ5IiwJKFB5Q0Z1bmN0aW9uKXB5ZXBvbGxfbW9kaWZ5LAotCSBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLAlweWVwb2xsX21vZGlmeV9kb2N9LAotCXsicmVnaXN0ZXIiLAkoUHlDRnVuY3Rpb24pcHllcG9sbF9yZWdpc3RlciwKLQkgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywJcHllcG9sbF9yZWdpc3Rlcl9kb2N9LAotCXsidW5yZWdpc3RlciIsCShQeUNGdW5jdGlvbilweWVwb2xsX3VucmVnaXN0ZXIsCi0JIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsCXB5ZXBvbGxfdW5yZWdpc3Rlcl9kb2N9LAotCXsicG9sbCIsCShQeUNGdW5jdGlvbilweWVwb2xsX3BvbGwsCi0JIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsCXB5ZXBvbGxfcG9sbF9kb2N9LAotCXtOVUxMLAlOVUxMfSwKKyAgICB7ImZyb21mZCIsICAgICAgICAgIChQeUNGdW5jdGlvbilweWVwb2xsX2Zyb21mZCwKKyAgICAgTUVUSF9WQVJBUkdTIHwgTUVUSF9DTEFTUywgcHllcG9sbF9mcm9tZmRfZG9jfSwKKyAgICB7ImNsb3NlIiwgICAgICAgICAgIChQeUNGdW5jdGlvbilweWVwb2xsX2Nsb3NlLCAgICAgTUVUSF9OT0FSR1MsCisgICAgIHB5ZXBvbGxfY2xvc2VfZG9jfSwKKyAgICB7ImZpbGVubyIsICAgICAgICAgIChQeUNGdW5jdGlvbilweWVwb2xsX2ZpbGVubywgICAgTUVUSF9OT0FSR1MsCisgICAgIHB5ZXBvbGxfZmlsZW5vX2RvY30sCisgICAgeyJtb2RpZnkiLCAgICAgICAgICAoUHlDRnVuY3Rpb24pcHllcG9sbF9tb2RpZnksCisgICAgIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsICAgICAgcHllcG9sbF9tb2RpZnlfZG9jfSwKKyAgICB7InJlZ2lzdGVyIiwgICAgICAgIChQeUNGdW5jdGlvbilweWVwb2xsX3JlZ2lzdGVyLAorICAgICBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLCAgICAgIHB5ZXBvbGxfcmVnaXN0ZXJfZG9jfSwKKyAgICB7InVucmVnaXN0ZXIiLCAgICAgIChQeUNGdW5jdGlvbilweWVwb2xsX3VucmVnaXN0ZXIsCisgICAgIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsICAgICAgcHllcG9sbF91bnJlZ2lzdGVyX2RvY30sCisgICAgeyJwb2xsIiwgICAgICAgICAgICAoUHlDRnVuY3Rpb24pcHllcG9sbF9wb2xsLAorICAgICBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLCAgICAgIHB5ZXBvbGxfcG9sbF9kb2N9LAorICAgIHtOVUxMLCAgICAgIE5VTEx9LAogfTsKIAogc3RhdGljIFB5R2V0U2V0RGVmIHB5ZXBvbGxfZ2V0c2V0bGlzdFtdID0gewotCXsiY2xvc2VkIiwgKGdldHRlcilweWVwb2xsX2dldF9jbG9zZWQsIE5VTEwsCi0JICJUcnVlIGlmIHRoZSBlcG9sbCBoYW5kbGVyIGlzIGNsb3NlZCJ9LAotCXswfSwKKyAgICB7ImNsb3NlZCIsIChnZXR0ZXIpcHllcG9sbF9nZXRfY2xvc2VkLCBOVUxMLAorICAgICAiVHJ1ZSBpZiB0aGUgZXBvbGwgaGFuZGxlciBpcyBjbG9zZWQifSwKKyAgICB7MH0sCiB9OwogCiBQeURvY19TVFJWQVIocHllcG9sbF9kb2MsCkBAIC0xMDc2LDQ1ICsxMDc2LDQ1IEBACiB0aGUgbWF4aW11bSBudW1iZXIgb2YgbW9uaXRvcmVkIGV2ZW50cy4iKTsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBweUVwb2xsX1R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JInNlbGVjdC5lcG9sbCIsCQkJCQkvKiB0cF9uYW1lICovCi0Jc2l6ZW9mKHB5RXBvbGxfT2JqZWN0KSwJCQkJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJCQkvKiB0cF9pdGVtc2l6ZSAqLwotCShkZXN0cnVjdG9yKXB5ZXBvbGxfZGVhbGxvYywJCQkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCQkJLyogdHBfY29tcGFyZSAqLwotCTAsCQkJCQkJLyogdHBfcmVwciAqLwotCTAsCQkJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCQkJLyogdHBfaGFzaCAqLwotCTAsICAgICAgICAgICAgICAJCQkJLyogdHBfY2FsbCAqLwotCTAsCQkJCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCQkJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQsCQkJCS8qIHRwX2ZsYWdzICovCi0JcHllcG9sbF9kb2MsCQkJCQkvKiB0cF9kb2MgKi8KLQkwLAkJCQkJCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJCQkvKiB0cF9jbGVhciAqLwotCTAsCQkJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JMCwJCQkJCQkvKiB0cF9pdGVyICovCi0JMCwJCQkJCQkvKiB0cF9pdGVybmV4dCAqLwotCXB5ZXBvbGxfbWV0aG9kcywJCQkJLyogdHBfbWV0aG9kcyAqLwotCTAsCQkJCQkJLyogdHBfbWVtYmVycyAqLwotCXB5ZXBvbGxfZ2V0c2V0bGlzdCwJCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJCQkvKiB0cF9kaWN0ICovCi0JMCwJCQkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCQkJLyogdHBfZGljdG9mZnNldCAqLwotCTAsCQkJCQkJLyogdHBfaW5pdCAqLwotCTAsCQkJCQkJLyogdHBfYWxsb2MgKi8KLQlweWVwb2xsX25ldywJCQkJCS8qIHRwX25ldyAqLwotCTAsCQkJCQkJLyogdHBfZnJlZSAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQorICAgICJzZWxlY3QuZXBvbGwiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCisgICAgc2l6ZW9mKHB5RXBvbGxfT2JqZWN0KSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIChkZXN0cnVjdG9yKXB5ZXBvbGxfZGVhbGxvYywgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICBweWVwb2xsX2RvYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICBweWVwb2xsX21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgcHllcG9sbF9nZXRzZXRsaXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBweWVwb2xsX25ldywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KIH07CiAKICNlbmRpZiAvKiBIQVZFX0VQT0xMICovCkBAIC0xMTY5LDggKzExNjksOCBAQAogdWRhdGEtPm9iamVjdCBtYXBwaW5nLiIpOwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCXN0cnVjdCBrZXZlbnQgZTsKKyAgICBQeU9iamVjdF9IRUFECisgICAgc3RydWN0IGtldmVudCBlOwogfSBrcXVldWVfZXZlbnRfT2JqZWN0OwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IGtxdWV1ZV9ldmVudF9UeXBlOwpAQCAtMTE3OCw4ICsxMTc4LDggQEAKICNkZWZpbmUga3F1ZXVlX2V2ZW50X0NoZWNrKG9wKSAoUHlPYmplY3RfVHlwZUNoZWNrKChvcCksICZrcXVldWVfZXZlbnRfVHlwZSkpCiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JU09DS0VUIGtxZmQ7CQkvKiBrcXVldWUgY29udHJvbCBmZCAqLworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBTT0NLRVQga3FmZDsgICAgICAgICAgICAgICAgLyoga3F1ZXVlIGNvbnRyb2wgZmQgKi8KIH0ga3F1ZXVlX3F1ZXVlX09iamVjdDsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBrcXVldWVfcXVldWVfVHlwZTsKQEAgLTExOTMsMTMgKzExOTMsMTMgQEAKIAogI2RlZmluZSBLUV9PRkYoeCkgb2Zmc2V0b2Yoa3F1ZXVlX2V2ZW50X09iamVjdCwgeCkKIHN0YXRpYyBzdHJ1Y3QgUHlNZW1iZXJEZWYga3F1ZXVlX2V2ZW50X21lbWJlcnNbXSA9IHsKLQl7ImlkZW50IiwJVF9VSU5ULAkJS1FfT0ZGKGUuaWRlbnQpfSwKLQl7ImZpbHRlciIsCVRfU0hPUlQsCUtRX09GRihlLmZpbHRlcil9LAotCXsiZmxhZ3MiLAlUX1VTSE9SVCwJS1FfT0ZGKGUuZmxhZ3MpfSwKLQl7ImZmbGFncyIsCVRfVUlOVCwJCUtRX09GRihlLmZmbGFncyl9LAotCXsiZGF0YSIsCVRfSU5ULAkJS1FfT0ZGKGUuZGF0YSl9LAotCXsidWRhdGEiLAlUX0lOVCwJCUtRX09GRihlLnVkYXRhKX0sCi0Je05VTEx9IC8qIFNlbnRpbmVsICovCisgICAgeyJpZGVudCIsICAgICAgICAgICBUX1VJTlQsICAgICAgICAgS1FfT0ZGKGUuaWRlbnQpfSwKKyAgICB7ImZpbHRlciIsICAgICAgICAgIFRfU0hPUlQsICAgICAgICBLUV9PRkYoZS5maWx0ZXIpfSwKKyAgICB7ImZsYWdzIiwgICAgICAgICAgIFRfVVNIT1JULCAgICAgICBLUV9PRkYoZS5mbGFncyl9LAorICAgIHsiZmZsYWdzIiwgICAgICAgICAgVF9VSU5ULCAgICAgICAgIEtRX09GRihlLmZmbGFncyl9LAorICAgIHsiZGF0YSIsICAgICAgICAgICAgVF9JTlQsICAgICAgICAgIEtRX09GRihlLmRhdGEpfSwKKyAgICB7InVkYXRhIiwgICAgICAgICAgIFRfSU5ULCAgICAgICAgICBLUV9PRkYoZS51ZGF0YSl9LAorICAgIHtOVUxMfSAvKiBTZW50aW5lbCAqLwogfTsKICN1bmRlZiBLUV9PRkYKIApAQCAtMTIwNywyMDggKzEyMDcsMjA4IEBACiAKIGtxdWV1ZV9ldmVudF9yZXByKGtxdWV1ZV9ldmVudF9PYmplY3QgKnMpCiB7Ci0JY2hhciBidWZbMTAyNF07Ci0JUHlPU19zbnByaW50ZigKLQkJYnVmLCBzaXplb2YoYnVmKSwKLQkJIjxzZWxlY3Qua2V2ZW50IGlkZW50PSVsdSBmaWx0ZXI9JWQgZmxhZ3M9MHgleCBmZmxhZ3M9MHgleCAiCi0JCSJkYXRhPTB4JWx4IHVkYXRhPSVwPiIsCi0JCSh1bnNpZ25lZCBsb25nKShzLT5lLmlkZW50KSwgcy0+ZS5maWx0ZXIsIHMtPmUuZmxhZ3MsCi0JCXMtPmUuZmZsYWdzLCAobG9uZykocy0+ZS5kYXRhKSwgcy0+ZS51ZGF0YSk7Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmKTsKKyAgICBjaGFyIGJ1ZlsxMDI0XTsKKyAgICBQeU9TX3NucHJpbnRmKAorICAgICAgICBidWYsIHNpemVvZihidWYpLAorICAgICAgICAiPHNlbGVjdC5rZXZlbnQgaWRlbnQ9JWx1IGZpbHRlcj0lZCBmbGFncz0weCV4IGZmbGFncz0weCV4ICIKKyAgICAgICAgImRhdGE9MHglbHggdWRhdGE9JXA+IiwKKyAgICAgICAgKHVuc2lnbmVkIGxvbmcpKHMtPmUuaWRlbnQpLCBzLT5lLmZpbHRlciwgcy0+ZS5mbGFncywKKyAgICAgICAgcy0+ZS5mZmxhZ3MsIChsb25nKShzLT5lLmRhdGEpLCBzLT5lLnVkYXRhKTsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOwogfQogCiBzdGF0aWMgaW50CiBrcXVldWVfZXZlbnRfaW5pdChrcXVldWVfZXZlbnRfT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JUHlPYmplY3QgKnBmZDsKLQlzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7ImlkZW50IiwgImZpbHRlciIsICJmbGFncyIsICJmZmxhZ3MiLAotCQkJCSAiZGF0YSIsICJ1ZGF0YSIsIE5VTEx9OworICAgIFB5T2JqZWN0ICpwZmQ7CisgICAgc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJpZGVudCIsICJmaWx0ZXIiLCAiZmxhZ3MiLCAiZmZsYWdzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiLCAidWRhdGEiLCBOVUxMfTsKIAotCUVWX1NFVCgmKHNlbGYtPmUpLCAwLCBFVkZJTFRfUkVBRCwgRVZfQURELCAwLCAwLCAwKTsgLyogZGVmYXVsdHMgKi8KLQkKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAiT3xoaGlpaTprZXZlbnQiLCBrd2xpc3QsCi0JCSZwZmQsICYoc2VsZi0+ZS5maWx0ZXIpLCAmKHNlbGYtPmUuZmxhZ3MpLAotCQkmKHNlbGYtPmUuZmZsYWdzKSwgJihzZWxmLT5lLmRhdGEpLCAmKHNlbGYtPmUudWRhdGEpKSkgewotCQlyZXR1cm4gLTE7Ci0JfQorICAgIEVWX1NFVCgmKHNlbGYtPmUpLCAwLCBFVkZJTFRfUkVBRCwgRVZfQURELCAwLCAwLCAwKTsgLyogZGVmYXVsdHMgKi8KIAotCXNlbGYtPmUuaWRlbnQgPSBQeU9iamVjdF9Bc0ZpbGVEZXNjcmlwdG9yKHBmZCk7Ci0JaWYgKHNlbGYtPmUuaWRlbnQgPT0gLTEpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQlyZXR1cm4gMDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAiT3xoaGlpaTprZXZlbnQiLCBrd2xpc3QsCisgICAgICAgICZwZmQsICYoc2VsZi0+ZS5maWx0ZXIpLCAmKHNlbGYtPmUuZmxhZ3MpLAorICAgICAgICAmKHNlbGYtPmUuZmZsYWdzKSwgJihzZWxmLT5lLmRhdGEpLCAmKHNlbGYtPmUudWRhdGEpKSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgc2VsZi0+ZS5pZGVudCA9IFB5T2JqZWN0X0FzRmlsZURlc2NyaXB0b3IocGZkKTsKKyAgICBpZiAoc2VsZi0+ZS5pZGVudCA9PSAtMSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgoga3F1ZXVlX2V2ZW50X3JpY2hjb21wYXJlKGtxdWV1ZV9ldmVudF9PYmplY3QgKnMsIGtxdWV1ZV9ldmVudF9PYmplY3QgKm8sCi0JCQkgaW50IG9wKQorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvcCkKIHsKLQlpbnQgcmVzdWx0ID0gMDsKKyAgICBpbnQgcmVzdWx0ID0gMDsKIAotCWlmICgha3F1ZXVlX2V2ZW50X0NoZWNrKG8pKSB7Ci0JCWlmIChvcCA9PSBQeV9FUSB8fCBvcCA9PSBQeV9ORSkgewotICAgICAgICAgICAgICAgIAlQeU9iamVjdCAqcmVzID0gb3AgPT0gUHlfRVEgPyBQeV9GYWxzZSA6IFB5X1RydWU7Ci0JCQlQeV9JTkNSRUYocmVzKTsKLQkJCXJldHVybiByZXM7Ci0JCX0KLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSJjYW4ndCBjb21wYXJlICUuMjAwcyB0byAlLjIwMHMiLAotCQkJUHlfVFlQRShzKS0+dHBfbmFtZSwgUHlfVFlQRShvKS0+dHBfbmFtZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoKChyZXN1bHQgPSBzLT5lLmlkZW50IC0gby0+ZS5pZGVudCkgPT0gMCkgJiYKLQkgICAgKChyZXN1bHQgPSBzLT5lLmZpbHRlciAtIG8tPmUuZmlsdGVyKSA9PSAwKSAmJgotCSAgICAoKHJlc3VsdCA9IHMtPmUuZmxhZ3MgLSBvLT5lLmZsYWdzKSA9PSAwKSAmJgotCSAgICAoKHJlc3VsdCA9IHMtPmUuZmZsYWdzIC0gby0+ZS5mZmxhZ3MpID09IDApICYmCi0JICAgICgocmVzdWx0ID0gcy0+ZS5kYXRhIC0gby0+ZS5kYXRhKSA9PSAwKSAmJgotCSAgICAoKHJlc3VsdCA9IHMtPmUudWRhdGEgLSBvLT5lLnVkYXRhKSA9PSAwKQotCSAgICkgewotCQlyZXN1bHQgPSAwOwotCX0KKyAgICBpZiAoIWtxdWV1ZV9ldmVudF9DaGVjayhvKSkgeworICAgICAgICBpZiAob3AgPT0gUHlfRVEgfHwgb3AgPT0gUHlfTkUpIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpyZXMgPSBvcCA9PSBQeV9FUSA/IFB5X0ZhbHNlIDogUHlfVHJ1ZTsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihyZXMpOworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgImNhbid0IGNvbXBhcmUgJS4yMDBzIHRvICUuMjAwcyIsCisgICAgICAgICAgICBQeV9UWVBFKHMpLT50cF9uYW1lLCBQeV9UWVBFKG8pLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmICgoKHJlc3VsdCA9IHMtPmUuaWRlbnQgLSBvLT5lLmlkZW50KSA9PSAwKSAmJgorICAgICAgICAoKHJlc3VsdCA9IHMtPmUuZmlsdGVyIC0gby0+ZS5maWx0ZXIpID09IDApICYmCisgICAgICAgICgocmVzdWx0ID0gcy0+ZS5mbGFncyAtIG8tPmUuZmxhZ3MpID09IDApICYmCisgICAgICAgICgocmVzdWx0ID0gcy0+ZS5mZmxhZ3MgLSBvLT5lLmZmbGFncykgPT0gMCkgJiYKKyAgICAgICAgKChyZXN1bHQgPSBzLT5lLmRhdGEgLSBvLT5lLmRhdGEpID09IDApICYmCisgICAgICAgICgocmVzdWx0ID0gcy0+ZS51ZGF0YSAtIG8tPmUudWRhdGEpID09IDApCisgICAgICAgKSB7CisgICAgICAgIHJlc3VsdCA9IDA7CisgICAgfQogCi0Jc3dpdGNoIChvcCkgewotCSAgICBjYXNlIFB5X0VROgotCQlyZXN1bHQgPSAocmVzdWx0ID09IDApOwotCQlicmVhazsKLQkgICAgY2FzZSBQeV9ORToKLQkJcmVzdWx0ID0gKHJlc3VsdCAhPSAwKTsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgUHlfTEU6Ci0JCXJlc3VsdCA9IChyZXN1bHQgPD0gMCk7Ci0JCWJyZWFrOwotCSAgICBjYXNlIFB5X0dFOgotCQlyZXN1bHQgPSAocmVzdWx0ID49IDApOwotCQlicmVhazsKLQkgICAgY2FzZSBQeV9MVDoKLQkJcmVzdWx0ID0gKHJlc3VsdCA8IDApOwotCQlicmVhazsKLQkgICAgY2FzZSBQeV9HVDoKLQkJcmVzdWx0ID0gKHJlc3VsdCA+IDApOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZyhyZXN1bHQpOworICAgIHN3aXRjaCAob3ApIHsKKyAgICAgICAgY2FzZSBQeV9FUToKKyAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCA9PSAwKTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUHlfTkU6CisgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgIT0gMCk7CisgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFB5X0xFOgorICAgICAgICByZXN1bHQgPSAocmVzdWx0IDw9IDApOworICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQeV9HRToKKyAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCA+PSAwKTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUHlfTFQ6CisgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgPCAwKTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUHlfR1Q6CisgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgPiAwKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcocmVzdWx0KTsKIH0KIAogc3RhdGljIFB5VHlwZU9iamVjdCBrcXVldWVfZXZlbnRfVHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKLQkic2VsZWN0LmtldmVudCIsCQkJCS8qIHRwX25hbWUgKi8KLQlzaXplb2Yoa3F1ZXVlX2V2ZW50X09iamVjdCksCQkJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJCQkvKiB0cF9pdGVtc2l6ZSAqLwotCTAsCQkJCQkJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkocmVwcmZ1bmMpa3F1ZXVlX2V2ZW50X3JlcHIsCQkJLyogdHBfcmVwciAqLwotCTAsCQkJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCQkJLyogdHBfaGFzaCAqLwotCTAsICAgICAgICAgICAgICAJCQkJLyogdHBfY2FsbCAqLwotCTAsCQkJCQkJLyogdHBfc3RyICovCi0JMCwJCQkJCQkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCwJCQkJLyogdHBfZmxhZ3MgKi8KLQlrcXVldWVfZXZlbnRfZG9jLAkJCQkvKiB0cF9kb2MgKi8KLQkwLAkJCQkJCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJCQkvKiB0cF9jbGVhciAqLwotCShyaWNoY21wZnVuYylrcXVldWVfZXZlbnRfcmljaGNvbXBhcmUsCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQkwLAkJCQkJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkJCS8qIHRwX2l0ZXJuZXh0ICovCi0JMCwJCQkJCQkvKiB0cF9tZXRob2RzICovCi0Ja3F1ZXVlX2V2ZW50X21lbWJlcnMsCQkJCS8qIHRwX21lbWJlcnMgKi8KLQkwLAkJCQkJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KLQkwLAkJCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQkoaW5pdHByb2Mpa3F1ZXVlX2V2ZW50X2luaXQsCQkJLyogdHBfaW5pdCAqLwotCTAsCQkJCQkJLyogdHBfYWxsb2MgKi8KLQkwLAkJCQkJCS8qIHRwX25ldyAqLwotCTAsCQkJCQkJLyogdHBfZnJlZSAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQorICAgICJzZWxlY3Qua2V2ZW50IiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCisgICAgc2l6ZW9mKGtxdWV1ZV9ldmVudF9PYmplY3QpLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgKHJlcHJmdW5jKWtxdWV1ZV9ldmVudF9yZXByLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICBrcXVldWVfZXZlbnRfZG9jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgKHJpY2hjbXBmdW5jKWtxdWV1ZV9ldmVudF9yaWNoY29tcGFyZSwgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIGtxdWV1ZV9ldmVudF9tZW1iZXJzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgKGluaXRwcm9jKWtxdWV1ZV9ldmVudF9pbml0LCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBrcXVldWVfcXVldWVfZXJyX2Nsb3NlZCh2b2lkKQogewotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiSS9PIG9wZXJhdGlvbiBvbiBjbG9zZWQga3F1ZXVlIGZkIik7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJJL08gb3BlcmF0aW9uIG9uIGNsb3NlZCBrcXVldWUgZmQiKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIGludAoga3F1ZXVlX3F1ZXVlX2ludGVybmFsX2Nsb3NlKGtxdWV1ZV9xdWV1ZV9PYmplY3QgKnNlbGYpCiB7Ci0JaW50IHNhdmVfZXJybm8gPSAwOwotCWlmIChzZWxmLT5rcWZkID49IDApIHsKLQkJaW50IGtxZmQgPSBzZWxmLT5rcWZkOwotCQlzZWxmLT5rcWZkID0gLTE7Ci0JCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQkJaWYgKGNsb3NlKGtxZmQpIDwgMCkKLQkJCXNhdmVfZXJybm8gPSBlcnJubzsKLQkJUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQl9Ci0JcmV0dXJuIHNhdmVfZXJybm87CisgICAgaW50IHNhdmVfZXJybm8gPSAwOworICAgIGlmIChzZWxmLT5rcWZkID49IDApIHsKKyAgICAgICAgaW50IGtxZmQgPSBzZWxmLT5rcWZkOworICAgICAgICBzZWxmLT5rcWZkID0gLTE7CisgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgaWYgKGNsb3NlKGtxZmQpIDwgMCkKKyAgICAgICAgICAgIHNhdmVfZXJybm8gPSBlcnJubzsKKyAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICB9CisgICAgcmV0dXJuIHNhdmVfZXJybm87CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBuZXdLcXVldWVfT2JqZWN0KFB5VHlwZU9iamVjdCAqdHlwZSwgU09DS0VUIGZkKQogewotCWtxdWV1ZV9xdWV1ZV9PYmplY3QgKnNlbGY7Ci0JYXNzZXJ0KHR5cGUgIT0gTlVMTCAmJiB0eXBlLT50cF9hbGxvYyAhPSBOVUxMKTsKLQlzZWxmID0gKGtxdWV1ZV9xdWV1ZV9PYmplY3QgKikgdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7Ci0JaWYgKHNlbGYgPT0gTlVMTCkgewotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JCi0JaWYgKGZkID09IC0xKSB7Ci0JCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQkJc2VsZi0+a3FmZCA9IGtxdWV1ZSgpOwotCQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCX0KLQllbHNlIHsKLQkJc2VsZi0+a3FmZCA9IGZkOwotCX0KLQlpZiAoc2VsZi0+a3FmZCA8IDApIHsKLQkJUHlfREVDUkVGKHNlbGYpOwotCQlQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKKyAgICBrcXVldWVfcXVldWVfT2JqZWN0ICpzZWxmOworICAgIGFzc2VydCh0eXBlICE9IE5VTEwgJiYgdHlwZS0+dHBfYWxsb2MgIT0gTlVMTCk7CisgICAgc2VsZiA9IChrcXVldWVfcXVldWVfT2JqZWN0ICopIHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOworICAgIGlmIChzZWxmID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaWYgKGZkID09IC0xKSB7CisgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgc2VsZi0+a3FmZCA9IGtxdWV1ZSgpOworICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgc2VsZi0+a3FmZCA9IGZkOworICAgIH0KKyAgICBpZiAoc2VsZi0+a3FmZCA8IDApIHsKKyAgICAgICAgUHlfREVDUkVGKHNlbGYpOworICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGtxdWV1ZV9xdWV1ZV9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7CiAKLQlpZiAoKGFyZ3MgIT0gTlVMTCAmJiBQeU9iamVjdF9TaXplKGFyZ3MpKSB8fAotCQkJKGt3ZHMgIT0gTlVMTCAmJiBQeU9iamVjdF9TaXplKGt3ZHMpKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkic2VsZWN0LmtxdWV1ZSBkb2Vzbid0IGFjY2VwdCBhcmd1bWVudHMiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICgoYXJncyAhPSBOVUxMICYmIFB5T2JqZWN0X1NpemUoYXJncykpIHx8CisgICAgICAgICAgICAgICAgICAgIChrd2RzICE9IE5VTEwgJiYgUHlPYmplY3RfU2l6ZShrd2RzKSkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAic2VsZWN0LmtxdWV1ZSBkb2Vzbid0IGFjY2VwdCBhcmd1bWVudHMiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JcmV0dXJuIG5ld0txdWV1ZV9PYmplY3QodHlwZSwgLTEpOworICAgIHJldHVybiBuZXdLcXVldWVfT2JqZWN0KHR5cGUsIC0xKTsKIH0KIAogc3RhdGljIHZvaWQKIGtxdWV1ZV9xdWV1ZV9kZWFsbG9jKGtxdWV1ZV9xdWV1ZV9PYmplY3QgKnNlbGYpCiB7Ci0Ja3F1ZXVlX3F1ZXVlX2ludGVybmFsX2Nsb3NlKHNlbGYpOwotCVB5X1RZUEUoc2VsZiktPnRwX2ZyZWUoc2VsZik7CisgICAga3F1ZXVlX3F1ZXVlX2ludGVybmFsX2Nsb3NlKHNlbGYpOworICAgIFB5X1RZUEUoc2VsZiktPnRwX2ZyZWUoc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCoKIGtxdWV1ZV9xdWV1ZV9jbG9zZShrcXVldWVfcXVldWVfT2JqZWN0ICpzZWxmKQogewotCWVycm5vID0ga3F1ZXVlX3F1ZXVlX2ludGVybmFsX2Nsb3NlKHNlbGYpOwotCWlmIChlcnJubyA8IDApIHsKLQkJUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JUHlfUkVUVVJOX05PTkU7CisgICAgZXJybm8gPSBrcXVldWVfcXVldWVfaW50ZXJuYWxfY2xvc2Uoc2VsZik7CisgICAgaWYgKGVycm5vIDwgMCkgeworICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAogUHlEb2NfU1RSVkFSKGtxdWV1ZV9xdWV1ZV9jbG9zZV9kb2MsCkBAIC0xNDIwLDE4ICsxNDIwLDE4IEBACiBzdGF0aWMgUHlPYmplY3QqCiBrcXVldWVfcXVldWVfZ2V0X2Nsb3NlZChrcXVldWVfcXVldWVfT2JqZWN0ICpzZWxmKQogewotCWlmIChzZWxmLT5rcWZkIDwgMCkKLQkJUHlfUkVUVVJOX1RSVUU7Ci0JZWxzZQotCQlQeV9SRVRVUk5fRkFMU0U7CisgICAgaWYgKHNlbGYtPmtxZmQgPCAwKQorICAgICAgICBQeV9SRVRVUk5fVFJVRTsKKyAgICBlbHNlCisgICAgICAgIFB5X1JFVFVSTl9GQUxTRTsKIH0KIAogc3RhdGljIFB5T2JqZWN0Kgoga3F1ZXVlX3F1ZXVlX2ZpbGVubyhrcXVldWVfcXVldWVfT2JqZWN0ICpzZWxmKQogewotCWlmIChzZWxmLT5rcWZkIDwgMCkKLQkJcmV0dXJuIGtxdWV1ZV9xdWV1ZV9lcnJfY2xvc2VkKCk7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKHNlbGYtPmtxZmQpOworICAgIGlmIChzZWxmLT5rcWZkIDwgMCkKKyAgICAgICAgcmV0dXJuIGtxdWV1ZV9xdWV1ZV9lcnJfY2xvc2VkKCk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHNlbGYtPmtxZmQpOwogfQogCiBQeURvY19TVFJWQVIoa3F1ZXVlX3F1ZXVlX2ZpbGVub19kb2MsCkBAIC0xNDQyLDEyICsxNDQyLDEyIEBACiBzdGF0aWMgUHlPYmplY3QqCiBrcXVldWVfcXVldWVfZnJvbWZkKFB5T2JqZWN0ICpjbHMsIFB5T2JqZWN0ICphcmdzKQogewotCVNPQ0tFVCBmZDsKKyAgICBTT0NLRVQgZmQ7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6ZnJvbWZkIiwgJmZkKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOmZyb21mZCIsICZmZCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JcmV0dXJuIG5ld0txdWV1ZV9PYmplY3QoKFB5VHlwZU9iamVjdCopY2xzLCBmZCk7CisgICAgcmV0dXJuIG5ld0txdWV1ZV9PYmplY3QoKFB5VHlwZU9iamVjdCopY2xzLCBmZCk7CiB9CiAKIFB5RG9jX1NUUlZBUihrcXVldWVfcXVldWVfZnJvbWZkX2RvYywKQEAgLTE0NTgsMTQ0ICsxNDU4LDE0NCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGtxdWV1ZV9xdWV1ZV9jb250cm9sKGtxdWV1ZV9xdWV1ZV9PYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBuZXZlbnRzID0gMDsKLQlpbnQgZ290ZXZlbnRzID0gMDsKLQlpbnQgbmNoYW5nZXMgPSAwOwotCWludCBpID0gMDsKLQlQeU9iamVjdCAqb3RpbWVvdXQgPSBOVUxMOwotCVB5T2JqZWN0ICpjaCA9IE5VTEw7Ci0JUHlPYmplY3QgKml0ID0gTlVMTCwgKmVpID0gTlVMTDsKLQlQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKLQlzdHJ1Y3Qga2V2ZW50ICpldmwgPSBOVUxMOwotCXN0cnVjdCBrZXZlbnQgKmNobCA9IE5VTEw7Ci0Jc3RydWN0IHRpbWVzcGVjIHRpbWVvdXRzcGVjOwotCXN0cnVjdCB0aW1lc3BlYyAqcHRpbWVvdXRzcGVjOworICAgIGludCBuZXZlbnRzID0gMDsKKyAgICBpbnQgZ290ZXZlbnRzID0gMDsKKyAgICBpbnQgbmNoYW5nZXMgPSAwOworICAgIGludCBpID0gMDsKKyAgICBQeU9iamVjdCAqb3RpbWVvdXQgPSBOVUxMOworICAgIFB5T2JqZWN0ICpjaCA9IE5VTEw7CisgICAgUHlPYmplY3QgKml0ID0gTlVMTCwgKmVpID0gTlVMTDsKKyAgICBQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKKyAgICBzdHJ1Y3Qga2V2ZW50ICpldmwgPSBOVUxMOworICAgIHN0cnVjdCBrZXZlbnQgKmNobCA9IE5VTEw7CisgICAgc3RydWN0IHRpbWVzcGVjIHRpbWVvdXRzcGVjOworICAgIHN0cnVjdCB0aW1lc3BlYyAqcHRpbWVvdXRzcGVjOwogCi0JaWYgKHNlbGYtPmtxZmQgPCAwKQotCQlyZXR1cm4ga3F1ZXVlX3F1ZXVlX2Vycl9jbG9zZWQoKTsKKyAgICBpZiAoc2VsZi0+a3FmZCA8IDApCisgICAgICAgIHJldHVybiBrcXVldWVfcXVldWVfZXJyX2Nsb3NlZCgpOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPaXxPOmNvbnRyb2wiLCAmY2gsICZuZXZlbnRzLCAmb3RpbWVvdXQpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9pfE86Y29udHJvbCIsICZjaCwgJm5ldmVudHMsICZvdGltZW91dCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKG5ldmVudHMgPCAwKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAotCQkJIkxlbmd0aCBvZiBldmVudGxpc3QgbXVzdCBiZSAwIG9yIHBvc2l0aXZlLCBnb3QgJWQiLAotCQkJbmV2ZW50cyk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAobmV2ZW50cyA8IDApIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAiTGVuZ3RoIG9mIGV2ZW50bGlzdCBtdXN0IGJlIDAgb3IgcG9zaXRpdmUsIGdvdCAlZCIsCisgICAgICAgICAgICBuZXZlbnRzKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaWYgKG90aW1lb3V0ID09IFB5X05vbmUgfHwgb3RpbWVvdXQgPT0gTlVMTCkgewotCQlwdGltZW91dHNwZWMgPSBOVUxMOwotCX0KLQllbHNlIGlmIChQeU51bWJlcl9DaGVjayhvdGltZW91dCkpIHsKLQkJZG91YmxlIHRpbWVvdXQ7Ci0JCWxvbmcgc2Vjb25kczsKKyAgICBpZiAob3RpbWVvdXQgPT0gUHlfTm9uZSB8fCBvdGltZW91dCA9PSBOVUxMKSB7CisgICAgICAgIHB0aW1lb3V0c3BlYyA9IE5VTEw7CisgICAgfQorICAgIGVsc2UgaWYgKFB5TnVtYmVyX0NoZWNrKG90aW1lb3V0KSkgeworICAgICAgICBkb3VibGUgdGltZW91dDsKKyAgICAgICAgbG9uZyBzZWNvbmRzOwogCi0JCXRpbWVvdXQgPSBQeUZsb2F0X0FzRG91YmxlKG90aW1lb3V0KTsKLQkJaWYgKHRpbWVvdXQgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJCXJldHVybiBOVUxMOwotCQlpZiAodGltZW91dCA+IChkb3VibGUpTE9OR19NQVgpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJCQkidGltZW91dCBwZXJpb2QgdG9vIGxvbmciKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWlmICh0aW1lb3V0IDwgMCkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJCSJ0aW1lb3V0IG11c3QgYmUgcG9zaXRpdmUgb3IgTm9uZSIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KKyAgICAgICAgdGltZW91dCA9IFB5RmxvYXRfQXNEb3VibGUob3RpbWVvdXQpOworICAgICAgICBpZiAodGltZW91dCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGlmICh0aW1lb3V0ID4gKGRvdWJsZSlMT05HX01BWCkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpbWVvdXQgcGVyaW9kIHRvbyBsb25nIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAodGltZW91dCA8IDApIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aW1lb3V0IG11c3QgYmUgcG9zaXRpdmUgb3IgTm9uZSIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KIAotCQlzZWNvbmRzID0gKGxvbmcpdGltZW91dDsKLQkJdGltZW91dCA9IHRpbWVvdXQgLSAoZG91YmxlKXNlY29uZHM7Ci0JCXRpbWVvdXRzcGVjLnR2X3NlYyA9IHNlY29uZHM7Ci0JCXRpbWVvdXRzcGVjLnR2X25zZWMgPSAobG9uZykodGltZW91dCAqIDFFOSk7Ci0JCXB0aW1lb3V0c3BlYyA9ICZ0aW1lb3V0c3BlYzsKLQl9Ci0JZWxzZSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkidGltZW91dCBhcmd1bWVudCBtdXN0IGJlIGFuIG51bWJlciAiCi0JCQkib3IgTm9uZSwgZ290ICUuMjAwcyIsCi0JCQlQeV9UWVBFKG90aW1lb3V0KS0+dHBfbmFtZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICAgICAgc2Vjb25kcyA9IChsb25nKXRpbWVvdXQ7CisgICAgICAgIHRpbWVvdXQgPSB0aW1lb3V0IC0gKGRvdWJsZSlzZWNvbmRzOworICAgICAgICB0aW1lb3V0c3BlYy50dl9zZWMgPSBzZWNvbmRzOworICAgICAgICB0aW1lb3V0c3BlYy50dl9uc2VjID0gKGxvbmcpKHRpbWVvdXQgKiAxRTkpOworICAgICAgICBwdGltZW91dHNwZWMgPSAmdGltZW91dHNwZWM7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgInRpbWVvdXQgYXJndW1lbnQgbXVzdCBiZSBhbiBudW1iZXIgIgorICAgICAgICAgICAgIm9yIE5vbmUsIGdvdCAlLjIwMHMiLAorICAgICAgICAgICAgUHlfVFlQRShvdGltZW91dCktPnRwX25hbWUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlpZiAoY2ggIT0gTlVMTCAmJiBjaCAhPSBQeV9Ob25lKSB7Ci0JCWl0ID0gUHlPYmplY3RfR2V0SXRlcihjaCk7Ci0JCWlmIChpdCA9PSBOVUxMKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCQkiY2hhbmdlbGlzdCBpcyBub3QgaXRlcmFibGUiKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCW5jaGFuZ2VzID0gUHlPYmplY3RfU2l6ZShjaCk7Ci0JCWlmIChuY2hhbmdlcyA8IDApIHsKLQkJCWdvdG8gZXJyb3I7Ci0JCX0KKyAgICBpZiAoY2ggIT0gTlVMTCAmJiBjaCAhPSBQeV9Ob25lKSB7CisgICAgICAgIGl0ID0gUHlPYmplY3RfR2V0SXRlcihjaCk7CisgICAgICAgIGlmIChpdCA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjaGFuZ2VsaXN0IGlzIG5vdCBpdGVyYWJsZSIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgbmNoYW5nZXMgPSBQeU9iamVjdF9TaXplKGNoKTsKKyAgICAgICAgaWYgKG5jaGFuZ2VzIDwgMCkgeworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQogCi0JCWNobCA9IFB5TWVtX05ldyhzdHJ1Y3Qga2V2ZW50LCBuY2hhbmdlcyk7Ci0JCWlmIChjaGwgPT0gTlVMTCkgewotCQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJCWdvdG8gZXJyb3I7Ci0JCX0KLQkJaSA9IDA7Ci0JCXdoaWxlICgoZWkgPSBQeUl0ZXJfTmV4dChpdCkpICE9IE5VTEwpIHsKLQkJCWlmICgha3F1ZXVlX2V2ZW50X0NoZWNrKGVpKSkgewotCQkJCVB5X0RFQ1JFRihlaSk7Ci0JCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkJImNoYW5nZWxpc3QgbXVzdCBiZSBhbiBpdGVyYWJsZSBvZiAiCi0JCQkJIAkic2VsZWN0LmtldmVudCBvYmplY3RzIik7Ci0JCQkJZ290byBlcnJvcjsKLQkJCX0gZWxzZSB7Ci0JCQkJY2hsW2krK10gPSAoKGtxdWV1ZV9ldmVudF9PYmplY3QgKillaSktPmU7Ci0JCQl9Ci0JCQlQeV9ERUNSRUYoZWkpOwotCQl9Ci0JfQotCVB5X0NMRUFSKGl0KTsKKyAgICAgICAgY2hsID0gUHlNZW1fTmV3KHN0cnVjdCBrZXZlbnQsIG5jaGFuZ2VzKTsKKyAgICAgICAgaWYgKGNobCA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgICAgICBpID0gMDsKKyAgICAgICAgd2hpbGUgKChlaSA9IFB5SXRlcl9OZXh0KGl0KSkgIT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKCFrcXVldWVfZXZlbnRfQ2hlY2soZWkpKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGVpKTsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAiY2hhbmdlbGlzdCBtdXN0IGJlIGFuIGl0ZXJhYmxlIG9mICIKKyAgICAgICAgICAgICAgICAgICAgInNlbGVjdC5rZXZlbnQgb2JqZWN0cyIpOworICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNobFtpKytdID0gKChrcXVldWVfZXZlbnRfT2JqZWN0ICopZWkpLT5lOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlfREVDUkVGKGVpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBQeV9DTEVBUihpdCk7CiAKLQkvKiBldmVudCBsaXN0ICovCi0JaWYgKG5ldmVudHMpIHsKLQkJZXZsID0gUHlNZW1fTmV3KHN0cnVjdCBrZXZlbnQsIG5ldmVudHMpOwotCQlpZiAoZXZsID09IE5VTEwpIHsKLQkJCVB5RXJyX05vTWVtb3J5KCk7Ci0JCQlnb3RvIGVycm9yOwotCQl9Ci0JfQorICAgIC8qIGV2ZW50IGxpc3QgKi8KKyAgICBpZiAobmV2ZW50cykgeworICAgICAgICBldmwgPSBQeU1lbV9OZXcoc3RydWN0IGtldmVudCwgbmV2ZW50cyk7CisgICAgICAgIGlmIChldmwgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICB9CiAKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JZ290ZXZlbnRzID0ga2V2ZW50KHNlbGYtPmtxZmQsIGNobCwgbmNoYW5nZXMsCi0JCQkgICBldmwsIG5ldmVudHMsIHB0aW1lb3V0c3BlYyk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgZ290ZXZlbnRzID0ga2V2ZW50KHNlbGYtPmtxZmQsIGNobCwgbmNoYW5nZXMsCisgICAgICAgICAgICAgICAgICAgICAgIGV2bCwgbmV2ZW50cywgcHRpbWVvdXRzcGVjKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogCi0JaWYgKGdvdGV2ZW50cyA9PSAtMSkgewotCQlQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfT1NFcnJvcik7Ci0JCWdvdG8gZXJyb3I7Ci0JfQorICAgIGlmIChnb3RldmVudHMgPT0gLTEpIHsKKyAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX09TRXJyb3IpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KIAotCXJlc3VsdCA9IFB5TGlzdF9OZXcoZ290ZXZlbnRzKTsKLQlpZiAocmVzdWx0ID09IE5VTEwpIHsKLQkJZ290byBlcnJvcjsKLQl9CisgICAgcmVzdWx0ID0gUHlMaXN0X05ldyhnb3RldmVudHMpOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCkgeworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KIAotCWZvciAoaSA9IDA7IGkgPCBnb3RldmVudHM7IGkrKykgewotCQlrcXVldWVfZXZlbnRfT2JqZWN0ICpjaDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgZ290ZXZlbnRzOyBpKyspIHsKKyAgICAgICAga3F1ZXVlX2V2ZW50X09iamVjdCAqY2g7CiAKLQkJY2ggPSBQeU9iamVjdF9OZXcoa3F1ZXVlX2V2ZW50X09iamVjdCwgJmtxdWV1ZV9ldmVudF9UeXBlKTsKLQkJaWYgKGNoID09IE5VTEwpIHsKLQkJCWdvdG8gZXJyb3I7Ci0JCX0KLQkJY2gtPmUgPSBldmxbaV07Ci0JCVB5TGlzdF9TRVRfSVRFTShyZXN1bHQsIGksIChQeU9iamVjdCAqKWNoKTsKLQl9Ci0JUHlNZW1fRnJlZShjaGwpOwotCVB5TWVtX0ZyZWUoZXZsKTsKLQlyZXR1cm4gcmVzdWx0OworICAgICAgICBjaCA9IFB5T2JqZWN0X05ldyhrcXVldWVfZXZlbnRfT2JqZWN0LCAma3F1ZXVlX2V2ZW50X1R5cGUpOworICAgICAgICBpZiAoY2ggPT0gTlVMTCkgeworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgICAgICBjaC0+ZSA9IGV2bFtpXTsKKyAgICAgICAgUHlMaXN0X1NFVF9JVEVNKHJlc3VsdCwgaSwgKFB5T2JqZWN0ICopY2gpOworICAgIH0KKyAgICBQeU1lbV9GcmVlKGNobCk7CisgICAgUHlNZW1fRnJlZShldmwpOworICAgIHJldHVybiByZXN1bHQ7CiAKICAgICBlcnJvcjoKLQlQeU1lbV9GcmVlKGNobCk7Ci0JUHlNZW1fRnJlZShldmwpOwotCVB5X1hERUNSRUYocmVzdWx0KTsKLQlQeV9YREVDUkVGKGl0KTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeU1lbV9GcmVlKGNobCk7CisgICAgUHlNZW1fRnJlZShldmwpOworICAgIFB5X1hERUNSRUYocmVzdWx0KTsKKyAgICBQeV9YREVDUkVGKGl0KTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogUHlEb2NfU1RSVkFSKGtxdWV1ZV9xdWV1ZV9jb250cm9sX2RvYywKQEAgLTE2MTEsMjEgKzE2MTEsMjEgQEAKIAogCiBzdGF0aWMgUHlNZXRob2REZWYga3F1ZXVlX3F1ZXVlX21ldGhvZHNbXSA9IHsKLQl7ImZyb21mZCIsCShQeUNGdW5jdGlvbilrcXVldWVfcXVldWVfZnJvbWZkLAotCSBNRVRIX1ZBUkFSR1MgfCBNRVRIX0NMQVNTLCBrcXVldWVfcXVldWVfZnJvbWZkX2RvY30sCi0JeyJjbG9zZSIsCShQeUNGdW5jdGlvbilrcXVldWVfcXVldWVfY2xvc2UsCU1FVEhfTk9BUkdTLAotCSBrcXVldWVfcXVldWVfY2xvc2VfZG9jfSwKLQl7ImZpbGVubyIsCShQeUNGdW5jdGlvbilrcXVldWVfcXVldWVfZmlsZW5vLAlNRVRIX05PQVJHUywKLQkga3F1ZXVlX3F1ZXVlX2ZpbGVub19kb2N9LAotCXsiY29udHJvbCIsCShQeUNGdW5jdGlvbilrcXVldWVfcXVldWVfY29udHJvbCwKLQkgTUVUSF9WQVJBUkdTICwJa3F1ZXVlX3F1ZXVlX2NvbnRyb2xfZG9jfSwKLQl7TlVMTCwJTlVMTH0sCisgICAgeyJmcm9tZmQiLCAgICAgICAgICAoUHlDRnVuY3Rpb24pa3F1ZXVlX3F1ZXVlX2Zyb21mZCwKKyAgICAgTUVUSF9WQVJBUkdTIHwgTUVUSF9DTEFTUywga3F1ZXVlX3F1ZXVlX2Zyb21mZF9kb2N9LAorICAgIHsiY2xvc2UiLCAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWtxdWV1ZV9xdWV1ZV9jbG9zZSwgICAgICAgIE1FVEhfTk9BUkdTLAorICAgICBrcXVldWVfcXVldWVfY2xvc2VfZG9jfSwKKyAgICB7ImZpbGVubyIsICAgICAgICAgIChQeUNGdW5jdGlvbilrcXVldWVfcXVldWVfZmlsZW5vLCAgICAgICBNRVRIX05PQVJHUywKKyAgICAga3F1ZXVlX3F1ZXVlX2ZpbGVub19kb2N9LAorICAgIHsiY29udHJvbCIsICAgICAgICAgKFB5Q0Z1bmN0aW9uKWtxdWV1ZV9xdWV1ZV9jb250cm9sLAorICAgICBNRVRIX1ZBUkFSR1MgLCAgICAga3F1ZXVlX3F1ZXVlX2NvbnRyb2xfZG9jfSwKKyAgICB7TlVMTCwgICAgICBOVUxMfSwKIH07CiAKIHN0YXRpYyBQeUdldFNldERlZiBrcXVldWVfcXVldWVfZ2V0c2V0bGlzdFtdID0gewotCXsiY2xvc2VkIiwgKGdldHRlcilrcXVldWVfcXVldWVfZ2V0X2Nsb3NlZCwgTlVMTCwKLQkgIlRydWUgaWYgdGhlIGtxdWV1ZSBoYW5kbGVyIGlzIGNsb3NlZCJ9LAotCXswfSwKKyAgICB7ImNsb3NlZCIsIChnZXR0ZXIpa3F1ZXVlX3F1ZXVlX2dldF9jbG9zZWQsIE5VTEwsCisgICAgICJUcnVlIGlmIHRoZSBrcXVldWUgaGFuZGxlciBpcyBjbG9zZWQifSwKKyAgICB7MH0sCiB9OwogCiBQeURvY19TVFJWQVIoa3F1ZXVlX3F1ZXVlX2RvYywKQEAgLTE2NDQsNDUgKzE2NDQsNDUgQEAKID4+PiBrcS5jb250cm9sKFtrZXZlbnQoc29jaywgS1FfRklMVEVSX1dSSVRFLCBLUV9FVl9ERUxFVEUpXSwgMCkiKTsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBrcXVldWVfcXVldWVfVHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKLQkic2VsZWN0LmtxdWV1ZSIsCQkJCS8qIHRwX25hbWUgKi8KLQlzaXplb2Yoa3F1ZXVlX3F1ZXVlX09iamVjdCksCQkJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJCQkvKiB0cF9pdGVtc2l6ZSAqLwotCShkZXN0cnVjdG9yKWtxdWV1ZV9xdWV1ZV9kZWFsbG9jLAkJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkwLAkJCQkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkJCS8qIHRwX2hhc2ggKi8KLQkwLCAgICAgICAgICAgICAgCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkJCS8qIHRwX3N0ciAqLwotCTAsCQkJCQkJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQsCQkJCS8qIHRwX2ZsYWdzICovCi0Ja3F1ZXVlX3F1ZXVlX2RvYywJCQkJLyogdHBfZG9jICovCi0JMCwJCQkJCQkvKiB0cF90cmF2ZXJzZSAqLwotCTAsCQkJCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCTAsCQkJCQkJLyogdHBfaXRlciAqLwotCTAsCQkJCQkJLyogdHBfaXRlcm5leHQgKi8KLQlrcXVldWVfcXVldWVfbWV0aG9kcywJCQkJLyogdHBfbWV0aG9kcyAqLwotCTAsCQkJCQkJLyogdHBfbWVtYmVycyAqLwotCWtxdWV1ZV9xdWV1ZV9nZXRzZXRsaXN0LAkJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KLQkwLAkJCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQkwLAkJCQkJCS8qIHRwX2luaXQgKi8KLQkwLAkJCQkJCS8qIHRwX2FsbG9jICovCi0Ja3F1ZXVlX3F1ZXVlX25ldywJCQkJLyogdHBfbmV3ICovCi0JMCwJCQkJCQkvKiB0cF9mcmVlICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisgICAgInNlbGVjdC5rcXVldWUiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICBzaXplb2Yoa3F1ZXVlX3F1ZXVlX09iamVjdCksICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgKGRlc3RydWN0b3Ipa3F1ZXVlX3F1ZXVlX2RlYWxsb2MsICAgICAgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mbGFncyAqLworICAgIGtxdWV1ZV9xdWV1ZV9kb2MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIGtxdWV1ZV9xdWV1ZV9tZXRob2RzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICBrcXVldWVfcXVldWVfZ2V0c2V0bGlzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIGtxdWV1ZV9xdWV1ZV9uZXcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKIAogI2VuZGlmIC8qIEhBVkVfS1FVRVVFICovCkBAIC0xNzEzLDExICsxNzEzLDExIEBACiBkZXNjcmlwdG9ycyBjYW4gYmUgdXNlZC4iKTsKIAogc3RhdGljIFB5TWV0aG9kRGVmIHNlbGVjdF9tZXRob2RzW10gPSB7Ci0JeyJzZWxlY3QiLAlzZWxlY3Rfc2VsZWN0LAlNRVRIX1ZBUkFSR1MsCXNlbGVjdF9kb2N9LAorICAgIHsic2VsZWN0IiwgICAgICAgICAgc2VsZWN0X3NlbGVjdCwgIE1FVEhfVkFSQVJHUywgICBzZWxlY3RfZG9jfSwKICNpZmRlZiBIQVZFX1BPTEwKLQl7InBvbGwiLAlzZWxlY3RfcG9sbCwJTUVUSF9OT0FSR1MsCXBvbGxfZG9jfSwKKyAgICB7InBvbGwiLCAgICAgICAgICAgIHNlbGVjdF9wb2xsLCAgICBNRVRIX05PQVJHUywgICAgcG9sbF9kb2N9LAogI2VuZGlmIC8qIEhBVkVfUE9MTCAqLwotCXswLCAgCTB9LAkvKiBzZW50aW5lbCAqLworICAgIHswLCAgICAgICAgIDB9LCAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIFB5RG9jX1NUUlZBUihtb2R1bGVfZG9jLApAQCAtMTcyOSwxNDYgKzE3MjksMTQ2IEBACiBQeU1PRElOSVRfRlVOQwogaW5pdHNlbGVjdCh2b2lkKQogewotCVB5T2JqZWN0ICptOwotCW0gPSBQeV9Jbml0TW9kdWxlMygic2VsZWN0Iiwgc2VsZWN0X21ldGhvZHMsIG1vZHVsZV9kb2MpOwotCWlmIChtID09IE5VTEwpCi0JCXJldHVybjsKKyAgICBQeU9iamVjdCAqbTsKKyAgICBtID0gUHlfSW5pdE1vZHVsZTMoInNlbGVjdCIsIHNlbGVjdF9tZXRob2RzLCBtb2R1bGVfZG9jKTsKKyAgICBpZiAobSA9PSBOVUxMKQorICAgICAgICByZXR1cm47CiAKLQlTZWxlY3RFcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbigic2VsZWN0LmVycm9yIiwgTlVMTCwgTlVMTCk7Ci0JUHlfSU5DUkVGKFNlbGVjdEVycm9yKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgImVycm9yIiwgU2VsZWN0RXJyb3IpOworICAgIFNlbGVjdEVycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJzZWxlY3QuZXJyb3IiLCBOVUxMLCBOVUxMKTsKKyAgICBQeV9JTkNSRUYoU2VsZWN0RXJyb3IpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiZXJyb3IiLCBTZWxlY3RFcnJvcik7CiAKICNpZiBkZWZpbmVkKEhBVkVfUE9MTCkKICNpZmRlZiBfX0FQUExFX18KLQlpZiAoc2VsZWN0X2hhdmVfYnJva2VuX3BvbGwoKSkgewotCQlpZiAoUHlPYmplY3RfRGVsQXR0clN0cmluZyhtLCAicG9sbCIpID09IC0xKSB7Ci0JCQlQeUVycl9DbGVhcigpOwotCQl9Ci0JfSBlbHNlIHsKKyAgICBpZiAoc2VsZWN0X2hhdmVfYnJva2VuX3BvbGwoKSkgeworICAgICAgICBpZiAoUHlPYmplY3RfRGVsQXR0clN0cmluZyhtLCAicG9sbCIpID09IC0xKSB7CisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKICNlbHNlCi0JeworICAgIHsKICNlbmRpZgotCQlQeV9UWVBFKCZwb2xsX1R5cGUpID0gJlB5VHlwZV9UeXBlOwotCQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUE9MTElOIiwgUE9MTElOKTsKLQkJUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlBPTExQUkkiLCBQT0xMUFJJKTsKLQkJUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlBPTExPVVQiLCBQT0xMT1VUKTsKLQkJUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlBPTExFUlIiLCBQT0xMRVJSKTsKLQkJUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlBPTExIVVAiLCBQT0xMSFVQKTsKLQkJUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlBPTExOVkFMIiwgUE9MTE5WQUwpOworICAgICAgICBQeV9UWVBFKCZwb2xsX1R5cGUpID0gJlB5VHlwZV9UeXBlOworICAgICAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUE9MTElOIiwgUE9MTElOKTsKKyAgICAgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlBPTExQUkkiLCBQT0xMUFJJKTsKKyAgICAgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlBPTExPVVQiLCBQT0xMT1VUKTsKKyAgICAgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlBPTExFUlIiLCBQT0xMRVJSKTsKKyAgICAgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlBPTExIVVAiLCBQT0xMSFVQKTsKKyAgICAgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlBPTExOVkFMIiwgUE9MTE5WQUwpOwogCiAjaWZkZWYgUE9MTFJETk9STQotCQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUE9MTFJETk9STSIsIFBPTExSRE5PUk0pOworICAgICAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUE9MTFJETk9STSIsIFBPTExSRE5PUk0pOwogI2VuZGlmCiAjaWZkZWYgUE9MTFJEQkFORAotCQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUE9MTFJEQkFORCIsIFBPTExSREJBTkQpOworICAgICAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUE9MTFJEQkFORCIsIFBPTExSREJBTkQpOwogI2VuZGlmCiAjaWZkZWYgUE9MTFdSTk9STQotCQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUE9MTFdSTk9STSIsIFBPTExXUk5PUk0pOworICAgICAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUE9MTFdSTk9STSIsIFBPTExXUk5PUk0pOwogI2VuZGlmCiAjaWZkZWYgUE9MTFdSQkFORAotCQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUE9MTFdSQkFORCIsIFBPTExXUkJBTkQpOworICAgICAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUE9MTFdSQkFORCIsIFBPTExXUkJBTkQpOwogI2VuZGlmCiAjaWZkZWYgUE9MTE1TRwotCQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUE9MTE1TRyIsIFBPTExNU0cpOworICAgICAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUE9MTE1TRyIsIFBPTExNU0cpOwogI2VuZGlmCi0JfQorICAgIH0KICNlbmRpZiAvKiBIQVZFX1BPTEwgKi8KIAogI2lmZGVmIEhBVkVfRVBPTEwKLQlQeV9UWVBFKCZweUVwb2xsX1R5cGUpID0gJlB5VHlwZV9UeXBlOwotCWlmIChQeVR5cGVfUmVhZHkoJnB5RXBvbGxfVHlwZSkgPCAwKQotCQlyZXR1cm47CisgICAgUHlfVFlQRSgmcHlFcG9sbF9UeXBlKSA9ICZQeVR5cGVfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZweUVwb2xsX1R5cGUpIDwgMCkKKyAgICAgICAgcmV0dXJuOwogCi0JUHlfSU5DUkVGKCZweUVwb2xsX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiZXBvbGwiLCAoUHlPYmplY3QgKikgJnB5RXBvbGxfVHlwZSk7CisgICAgUHlfSU5DUkVGKCZweUVwb2xsX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiZXBvbGwiLCAoUHlPYmplY3QgKikgJnB5RXBvbGxfVHlwZSk7CiAKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiRVBPTExJTiIsIEVQT0xMSU4pOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJFUE9MTE9VVCIsIEVQT0xMT1VUKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiRVBPTExQUkkiLCBFUE9MTFBSSSk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkVQT0xMRVJSIiwgRVBPTExFUlIpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJFUE9MTEhVUCIsIEVQT0xMSFVQKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiRVBPTExFVCIsIEVQT0xMRVQpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJFUE9MTElOIiwgRVBPTExJTik7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkVQT0xMT1VUIiwgRVBPTExPVVQpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJFUE9MTFBSSSIsIEVQT0xMUFJJKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiRVBPTExFUlIiLCBFUE9MTEVSUik7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkVQT0xMSFVQIiwgRVBPTExIVVApOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJFUE9MTEVUIiwgRVBPTExFVCk7CiAjaWZkZWYgRVBPTExPTkVTSE9UCi0JLyogS2VybmVsIDIuNi4yKyAqLwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJFUE9MTE9ORVNIT1QiLCBFUE9MTE9ORVNIT1QpOworICAgIC8qIEtlcm5lbCAyLjYuMisgKi8KKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiRVBPTExPTkVTSE9UIiwgRVBPTExPTkVTSE9UKTsKICNlbmRpZgotCS8qIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJFUE9MTF9SREhVUCIsIEVQT0xMUkRIVVApOyAqLwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJFUE9MTFJETk9STSIsIEVQT0xMUkROT1JNKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiRVBPTExSREJBTkQiLCBFUE9MTFJEQkFORCk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkVQT0xMV1JOT1JNIiwgRVBPTExXUk5PUk0pOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJFUE9MTFdSQkFORCIsIEVQT0xMV1JCQU5EKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiRVBPTExNU0ciLCBFUE9MTE1TRyk7CisgICAgLyogUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkVQT0xMX1JESFVQIiwgRVBPTExSREhVUCk7ICovCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkVQT0xMUkROT1JNIiwgRVBPTExSRE5PUk0pOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJFUE9MTFJEQkFORCIsIEVQT0xMUkRCQU5EKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiRVBPTExXUk5PUk0iLCBFUE9MTFdSTk9STSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkVQT0xMV1JCQU5EIiwgRVBPTExXUkJBTkQpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJFUE9MTE1TRyIsIEVQT0xMTVNHKTsKICNlbmRpZiAvKiBIQVZFX0VQT0xMICovCiAKICNpZmRlZiBIQVZFX0tRVUVVRQotCWtxdWV1ZV9ldmVudF9UeXBlLnRwX25ldyA9IFB5VHlwZV9HZW5lcmljTmV3OwotCVB5X1RZUEUoJmtxdWV1ZV9ldmVudF9UeXBlKSA9ICZQeVR5cGVfVHlwZTsKLQlpZihQeVR5cGVfUmVhZHkoJmtxdWV1ZV9ldmVudF9UeXBlKSA8IDApCi0JCXJldHVybjsKKyAgICBrcXVldWVfZXZlbnRfVHlwZS50cF9uZXcgPSBQeVR5cGVfR2VuZXJpY05ldzsKKyAgICBQeV9UWVBFKCZrcXVldWVfZXZlbnRfVHlwZSkgPSAmUHlUeXBlX1R5cGU7CisgICAgaWYoUHlUeXBlX1JlYWR5KCZrcXVldWVfZXZlbnRfVHlwZSkgPCAwKQorICAgICAgICByZXR1cm47CiAKLQlQeV9JTkNSRUYoJmtxdWV1ZV9ldmVudF9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgImtldmVudCIsIChQeU9iamVjdCAqKSZrcXVldWVfZXZlbnRfVHlwZSk7CisgICAgUHlfSU5DUkVGKCZrcXVldWVfZXZlbnRfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJrZXZlbnQiLCAoUHlPYmplY3QgKikma3F1ZXVlX2V2ZW50X1R5cGUpOwogCi0JUHlfVFlQRSgma3F1ZXVlX3F1ZXVlX1R5cGUpID0gJlB5VHlwZV9UeXBlOwotCWlmKFB5VHlwZV9SZWFkeSgma3F1ZXVlX3F1ZXVlX1R5cGUpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0lOQ1JFRigma3F1ZXVlX3F1ZXVlX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAia3F1ZXVlIiwgKFB5T2JqZWN0ICopJmtxdWV1ZV9xdWV1ZV9UeXBlKTsKLQkKLQkvKiBldmVudCBmaWx0ZXJzICovCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIktRX0ZJTFRFUl9SRUFEIiwgRVZGSUxUX1JFQUQpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJLUV9GSUxURVJfV1JJVEUiLCBFVkZJTFRfV1JJVEUpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJLUV9GSUxURVJfQUlPIiwgRVZGSUxUX0FJTyk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIktRX0ZJTFRFUl9WTk9ERSIsIEVWRklMVF9WTk9ERSk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIktRX0ZJTFRFUl9QUk9DIiwgRVZGSUxUX1BST0MpOworICAgIFB5X1RZUEUoJmtxdWV1ZV9xdWV1ZV9UeXBlKSA9ICZQeVR5cGVfVHlwZTsKKyAgICBpZihQeVR5cGVfUmVhZHkoJmtxdWV1ZV9xdWV1ZV9UeXBlKSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9JTkNSRUYoJmtxdWV1ZV9xdWV1ZV9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgImtxdWV1ZSIsIChQeU9iamVjdCAqKSZrcXVldWVfcXVldWVfVHlwZSk7CisKKyAgICAvKiBldmVudCBmaWx0ZXJzICovCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIktRX0ZJTFRFUl9SRUFEIiwgRVZGSUxUX1JFQUQpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJLUV9GSUxURVJfV1JJVEUiLCBFVkZJTFRfV1JJVEUpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJLUV9GSUxURVJfQUlPIiwgRVZGSUxUX0FJTyk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIktRX0ZJTFRFUl9WTk9ERSIsIEVWRklMVF9WTk9ERSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIktRX0ZJTFRFUl9QUk9DIiwgRVZGSUxUX1BST0MpOwogI2lmZGVmIEVWRklMVF9ORVRERVYKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiS1FfRklMVEVSX05FVERFViIsIEVWRklMVF9ORVRERVYpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJLUV9GSUxURVJfTkVUREVWIiwgRVZGSUxUX05FVERFVik7CiAjZW5kaWYKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiS1FfRklMVEVSX1NJR05BTCIsIEVWRklMVF9TSUdOQUwpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJLUV9GSUxURVJfVElNRVIiLCBFVkZJTFRfVElNRVIpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJLUV9GSUxURVJfU0lHTkFMIiwgRVZGSUxUX1NJR05BTCk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIktRX0ZJTFRFUl9USU1FUiIsIEVWRklMVF9USU1FUik7CiAKLQkvKiBldmVudCBmbGFncyAqLwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJLUV9FVl9BREQiLCBFVl9BREQpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJLUV9FVl9ERUxFVEUiLCBFVl9ERUxFVEUpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJLUV9FVl9FTkFCTEUiLCBFVl9FTkFCTEUpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJLUV9FVl9ESVNBQkxFIiwgRVZfRElTQUJMRSk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIktRX0VWX09ORVNIT1QiLCBFVl9PTkVTSE9UKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiS1FfRVZfQ0xFQVIiLCBFVl9DTEVBUik7CisgICAgLyogZXZlbnQgZmxhZ3MgKi8KKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiS1FfRVZfQUREIiwgRVZfQUREKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiS1FfRVZfREVMRVRFIiwgRVZfREVMRVRFKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiS1FfRVZfRU5BQkxFIiwgRVZfRU5BQkxFKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiS1FfRVZfRElTQUJMRSIsIEVWX0RJU0FCTEUpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJLUV9FVl9PTkVTSE9UIiwgRVZfT05FU0hPVCk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIktRX0VWX0NMRUFSIiwgRVZfQ0xFQVIpOwogCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIktRX0VWX1NZU0ZMQUdTIiwgRVZfU1lTRkxBR1MpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJLUV9FVl9GTEFHMSIsIEVWX0ZMQUcxKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiS1FfRVZfU1lTRkxBR1MiLCBFVl9TWVNGTEFHUyk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIktRX0VWX0ZMQUcxIiwgRVZfRkxBRzEpOwogCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIktRX0VWX0VPRiIsIEVWX0VPRik7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIktRX0VWX0VSUk9SIiwgRVZfRVJST1IpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJLUV9FVl9FT0YiLCBFVl9FT0YpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJLUV9FVl9FUlJPUiIsIEVWX0VSUk9SKTsKIAotCS8qIFJFQUQgV1JJVEUgZmlsdGVyIGZsYWcgKi8KLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiS1FfTk9URV9MT1dBVCIsIE5PVEVfTE9XQVQpOwotCQotCS8qIFZOT0RFIGZpbHRlciBmbGFncyAgKi8KLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiS1FfTk9URV9ERUxFVEUiLCBOT1RFX0RFTEVURSk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIktRX05PVEVfV1JJVEUiLCBOT1RFX1dSSVRFKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiS1FfTk9URV9FWFRFTkQiLCBOT1RFX0VYVEVORCk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIktRX05PVEVfQVRUUklCIiwgTk9URV9BVFRSSUIpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJLUV9OT1RFX0xJTksiLCBOT1RFX0xJTkspOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJLUV9OT1RFX1JFTkFNRSIsIE5PVEVfUkVOQU1FKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiS1FfTk9URV9SRVZPS0UiLCBOT1RFX1JFVk9LRSk7CisgICAgLyogUkVBRCBXUklURSBmaWx0ZXIgZmxhZyAqLworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJLUV9OT1RFX0xPV0FUIiwgTk9URV9MT1dBVCk7CiAKLQkvKiBQUk9DIGZpbHRlciBmbGFncyAgKi8KLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiS1FfTk9URV9FWElUIiwgTk9URV9FWElUKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiS1FfTk9URV9GT1JLIiwgTk9URV9GT1JLKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiS1FfTk9URV9FWEVDIiwgTk9URV9FWEVDKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiS1FfTk9URV9QQ1RSTE1BU0siLCBOT1RFX1BDVFJMTUFTSyk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIktRX05PVEVfUERBVEFNQVNLIiwgTk9URV9QREFUQU1BU0spOworICAgIC8qIFZOT0RFIGZpbHRlciBmbGFncyAgKi8KKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiS1FfTk9URV9ERUxFVEUiLCBOT1RFX0RFTEVURSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIktRX05PVEVfV1JJVEUiLCBOT1RFX1dSSVRFKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiS1FfTk9URV9FWFRFTkQiLCBOT1RFX0VYVEVORCk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIktRX05PVEVfQVRUUklCIiwgTk9URV9BVFRSSUIpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJLUV9OT1RFX0xJTksiLCBOT1RFX0xJTkspOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJLUV9OT1RFX1JFTkFNRSIsIE5PVEVfUkVOQU1FKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiS1FfTk9URV9SRVZPS0UiLCBOT1RFX1JFVk9LRSk7CiAKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiS1FfTk9URV9UUkFDSyIsIE5PVEVfVFJBQ0spOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJLUV9OT1RFX0NISUxEIiwgTk9URV9DSElMRCk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIktRX05PVEVfVFJBQ0tFUlIiLCBOT1RFX1RSQUNLRVJSKTsKKyAgICAvKiBQUk9DIGZpbHRlciBmbGFncyAgKi8KKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiS1FfTk9URV9FWElUIiwgTk9URV9FWElUKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiS1FfTk9URV9GT1JLIiwgTk9URV9GT1JLKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiS1FfTk9URV9FWEVDIiwgTk9URV9FWEVDKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiS1FfTk9URV9QQ1RSTE1BU0siLCBOT1RFX1BDVFJMTUFTSyk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIktRX05PVEVfUERBVEFNQVNLIiwgTk9URV9QREFUQU1BU0spOwogCi0JLyogTkVUREVWIGZpbHRlciBmbGFncyAqLworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJLUV9OT1RFX1RSQUNLIiwgTk9URV9UUkFDSyk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIktRX05PVEVfQ0hJTEQiLCBOT1RFX0NISUxEKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiS1FfTk9URV9UUkFDS0VSUiIsIE5PVEVfVFJBQ0tFUlIpOworCisgICAgLyogTkVUREVWIGZpbHRlciBmbGFncyAqLwogI2lmZGVmIEVWRklMVF9ORVRERVYKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiS1FfTk9URV9MSU5LVVAiLCBOT1RFX0xJTktVUCk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIktRX05PVEVfTElOS0RPV04iLCBOT1RFX0xJTktET1dOKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiS1FfTk9URV9MSU5LSU5WIiwgTk9URV9MSU5LSU5WKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiS1FfTk9URV9MSU5LVVAiLCBOT1RFX0xJTktVUCk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIktRX05PVEVfTElOS0RPV04iLCBOT1RFX0xJTktET1dOKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiS1FfTk9URV9MSU5LSU5WIiwgTk9URV9MSU5LSU5WKTsKICNlbmRpZgogCiAjZW5kaWYgLyogSEFWRV9LUVVFVUUgKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvc2dpbW9kdWxlLmMgYi9Nb2R1bGVzL3NnaW1vZHVsZS5jCmluZGV4IGY3ZTEyNjMuLjBkMTMyNDggMTAwNjQ0Ci0tLSBhL01vZHVsZXMvc2dpbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9zZ2ltb2R1bGUuYwpAQCAtMTAsMTQgKzEwLDE0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc2dpX25hcChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyB0aWNrczsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImw6bmFwIiwgJnRpY2tzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCXNnaW5hcCh0aWNrcyk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyB0aWNrczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImw6bmFwIiwgJnRpY2tzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIHNnaW5hcCh0aWNrcyk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIGV4dGVybiBjaGFyICpfZ2V0cHR5KGludCAqLCBpbnQsIG1vZGVfdCwgaW50KTsKQEAgLTI1LDMxICsyNSwzMSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNnaV9fZ2V0cHR5KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgb2ZsYWc7Ci0JaW50IG1vZGU7Ci0JaW50IG5vZm9yazsKLQljaGFyICpuYW1lOwotCWludCBmaWxkZXM7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpaWk6X2dldHB0eSIsICZvZmxhZywgJm1vZGUsICZub2ZvcmspKQotCQlyZXR1cm4gTlVMTDsKLQllcnJubyA9IDA7Ci0JbmFtZSA9IF9nZXRwdHkoJmZpbGRlcywgb2ZsYWcsIChtb2RlX3QpbW9kZSwgbm9mb3JrKTsKLQlpZiAobmFtZSA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBQeV9CdWlsZFZhbHVlKCIoc2kpIiwgbmFtZSwgZmlsZGVzKTsKKyAgICBpbnQgb2ZsYWc7CisgICAgaW50IG1vZGU7CisgICAgaW50IG5vZm9yazsKKyAgICBjaGFyICpuYW1lOworICAgIGludCBmaWxkZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpaWk6X2dldHB0eSIsICZvZmxhZywgJm1vZGUsICZub2ZvcmspKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBlcnJubyA9IDA7CisgICAgbmFtZSA9IF9nZXRwdHkoJmZpbGRlcywgb2ZsYWcsIChtb2RlX3QpbW9kZSwgbm9mb3JrKTsKKyAgICBpZiAobmFtZSA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIoc2kpIiwgbmFtZSwgZmlsZGVzKTsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIHNnaV9tZXRob2RzW10gPSB7Ci0JeyJuYXAiLAkJc2dpX25hcCwJTUVUSF9WQVJBUkdTfSwKLQl7Il9nZXRwdHkiLAlzZ2lfX2dldHB0eSwJTUVUSF9WQVJBUkdTfSwKLQl7TlVMTCwJCU5VTEx9CQkvKiBzZW50aW5lbCAqLworICAgIHsibmFwIiwgICAgICAgICAgICAgc2dpX25hcCwgICAgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJfZ2V0cHR5IiwgICAgICAgICBzZ2lfX2dldHB0eSwgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogCiB2b2lkCiBpbml0c2dpKHZvaWQpCiB7Ci0JUHlfSW5pdE1vZHVsZSgic2dpIiwgc2dpX21ldGhvZHMpOworICAgIFB5X0luaXRNb2R1bGUoInNnaSIsIHNnaV9tZXRob2RzKTsKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvc2hhMjU2bW9kdWxlLmMgYi9Nb2R1bGVzL3NoYTI1Nm1vZHVsZS5jCmluZGV4IDdkNTY5MDAuLjAyOWYyOTggMTAwNjQ0Ci0tLSBhL01vZHVsZXMvc2hhMjU2bW9kdWxlLmMKKysrIGIvTW9kdWxlcy9zaGEyNTZtb2R1bGUuYwpAQCAtMjIsNyArMjIsNyBAQAogCiAvKiBFbmRpYW5uZXNzIHRlc3RpbmcgYW5kIGRlZmluaXRpb25zICovCiAjZGVmaW5lIFRlc3RFbmRpYW5uZXNzKHZhcmlhYmxlKSB7aW50IGk9MTsgdmFyaWFibGU9UENUX0JJR19FTkRJQU47XAotCWlmICgqKChjaGFyKikmaSk9PTEpIHZhcmlhYmxlPVBDVF9MSVRUTEVfRU5ESUFOO30KKyAgICAgICAgaWYgKCooKGNoYXIqKSZpKT09MSkgdmFyaWFibGU9UENUX0xJVFRMRV9FTkRJQU47fQogCiAjZGVmaW5lIFBDVF9MSVRUTEVfRU5ESUFOIDEKICNkZWZpbmUgUENUX0JJR19FTkRJQU4gMApAQCAtMzIsNyArMzIsNyBAQAogdHlwZWRlZiB1bnNpZ25lZCBjaGFyIFNIQV9CWVRFOwogCiAjaWYgU0laRU9GX0lOVCA9PSA0Ci10eXBlZGVmIHVuc2lnbmVkIGludCBTSEFfSU5UMzI7CS8qIDMyLWJpdCBpbnRlZ2VyICovCit0eXBlZGVmIHVuc2lnbmVkIGludCBTSEFfSU5UMzI7IC8qIDMyLWJpdCBpbnRlZ2VyICovCiAjZWxzZQogLyogbm90IGRlZmluZWQuIGNvbXBpbGF0aW9uIHdpbGwgZGllLiAqLwogI2VuZGlmCkBAIC00NiwxMSArNDYsMTEgQEAKIAogdHlwZWRlZiBzdHJ1Y3QgewogICAgIFB5T2JqZWN0X0hFQUQKLSAgICBTSEFfSU5UMzIgZGlnZXN0WzhdOwkJLyogTWVzc2FnZSBkaWdlc3QgKi8KLSAgICBTSEFfSU5UMzIgY291bnRfbG8sIGNvdW50X2hpOwkvKiA2NC1iaXQgYml0IGNvdW50ICovCi0gICAgU0hBX0JZVEUgZGF0YVtTSEFfQkxPQ0tTSVpFXTsJLyogU0hBIGRhdGEgYnVmZmVyICovCisgICAgU0hBX0lOVDMyIGRpZ2VzdFs4XTsgICAgICAgICAgICAgICAgLyogTWVzc2FnZSBkaWdlc3QgKi8KKyAgICBTSEFfSU5UMzIgY291bnRfbG8sIGNvdW50X2hpOyAgICAgICAvKiA2NC1iaXQgYml0IGNvdW50ICovCisgICAgU0hBX0JZVEUgZGF0YVtTSEFfQkxPQ0tTSVpFXTsgICAgICAgLyogU0hBIGRhdGEgYnVmZmVyICovCiAgICAgaW50IEVuZGlhbm5lc3M7Ci0gICAgaW50IGxvY2FsOwkJCQkvKiB1bnByb2Nlc3NlZCBhbW91bnQgaW4gZGF0YSAqLworICAgIGludCBsb2NhbDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHVucHJvY2Vzc2VkIGFtb3VudCBpbiBkYXRhICovCiAgICAgaW50IGRpZ2VzdHNpemU7CiB9IFNIQW9iamVjdDsKIApAQCAtNjIsNyArNjIsNyBAQAogICAgIFNIQV9JTlQzMiB2YWx1ZTsKIAogICAgIGlmICggRW5kaWFubmVzcyA9PSBQQ1RfQklHX0VORElBTiApCi0JcmV0dXJuOworICAgICAgICByZXR1cm47CiAKICAgICBieXRlQ291bnQgLz0gc2l6ZW9mKCpidWZmZXIpOwogICAgIHdoaWxlIChieXRlQ291bnQtLSkgewpAQCAtMTE0LDcgKzExNCw3IEBACiAoICgoKCh1bnNpZ25lZCBsb25nKSh4KSYweEZGRkZGRkZGVUwpPj4odW5zaWduZWQgbG9uZykoKHkpJjMxKSkgfCBcCiAoKHVuc2lnbmVkIGxvbmcpKHgpPDwodW5zaWduZWQgbG9uZykoMzItKCh5KSYzMSkpKSkgJiAweEZGRkZGRkZGVUwpCiAjZGVmaW5lIENoKHgseSx6KSAgICAgICAoeiBeICh4ICYgKHkgXiB6KSkpCi0jZGVmaW5lIE1haih4LHkseikgICAgICAoKCh4IHwgeSkgJiB6KSB8ICh4ICYgeSkpIAorI2RlZmluZSBNYWooeCx5LHopICAgICAgKCgoeCB8IHkpICYgeikgfCAoeCAmIHkpKQogI2RlZmluZSBTKHgsIG4pICAgICAgICAgUk9SKCh4KSwobikpCiAjZGVmaW5lIFIoeCwgbikgICAgICAgICAoKCh4KSYweEZGRkZGRkZGVUwpPj4obikpCiAjZGVmaW5lIFNpZ21hMCh4KSAgICAgICAoUyh4LCAyKSBeIFMoeCwgMTMpIF4gUyh4LCAyMikpCkBAIC0xMjcsMTMgKzEyNywxMyBAQAogc2hhX3RyYW5zZm9ybShTSEFvYmplY3QgKnNoYV9pbmZvKQogewogICAgIGludCBpOwotCVNIQV9JTlQzMiBTWzhdLCBXWzY0XSwgdDAsIHQxOworICAgICAgICBTSEFfSU5UMzIgU1s4XSwgV1s2NF0sIHQwLCB0MTsKIAogICAgIG1lbWNweShXLCBzaGFfaW5mby0+ZGF0YSwgc2l6ZW9mKHNoYV9pbmZvLT5kYXRhKSk7CiAgICAgbG9uZ1JldmVyc2UoVywgKGludClzaXplb2Yoc2hhX2luZm8tPmRhdGEpLCBzaGFfaW5mby0+RW5kaWFubmVzcyk7CiAKICAgICBmb3IgKGkgPSAxNjsgaSA8IDY0OyArK2kpIHsKLQkJV1tpXSA9IEdhbW1hMShXW2kgLSAyXSkgKyBXW2kgLSA3XSArIEdhbW1hMChXW2kgLSAxNV0pICsgV1tpIC0gMTZdOworICAgICAgICAgICAgICAgIFdbaV0gPSBHYW1tYTEoV1tpIC0gMl0pICsgV1tpIC0gN10gKyBHYW1tYTAoV1tpIC0gMTVdKSArIFdbaSAtIDE2XTsKICAgICB9CiAgICAgZm9yIChpID0gMDsgaSA8IDg7ICsraSkgewogICAgICAgICBTW2ldID0gc2hhX2luZm8tPmRpZ2VzdFtpXTsKQEAgLTIxMSw4ICsyMTEsOCBAQAogICAgIFJORChTWzJdLFNbM10sU1s0XSxTWzVdLFNbNl0sU1s3XSxTWzBdLFNbMV0sNjIsMHhiZWY5YTNmNyk7CiAgICAgUk5EKFNbMV0sU1syXSxTWzNdLFNbNF0sU1s1XSxTWzZdLFNbN10sU1swXSw2MywweGM2NzE3OGYyKTsKIAotI3VuZGVmIFJORCAgICAgCi0gICAgCisjdW5kZWYgUk5ECisKICAgICAvKiBmZWVkYmFjayAqLwogICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKICAgICAgICAgc2hhX2luZm8tPmRpZ2VzdFtpXSA9IHNoYV9pbmZvLT5kaWdlc3RbaV0gKyBTW2ldOwpAQCAtMzE0LDE0ICszMTQsMTQgQEAKICAgICBjb3VudCA9IChpbnQpICgobG9fYml0X2NvdW50ID4+IDMpICYgMHgzZik7CiAgICAgKChTSEFfQllURSAqKSBzaGFfaW5mby0+ZGF0YSlbY291bnQrK10gPSAweDgwOwogICAgIGlmIChjb3VudCA+IFNIQV9CTE9DS1NJWkUgLSA4KSB7Ci0JbWVtc2V0KCgoU0hBX0JZVEUgKikgc2hhX2luZm8tPmRhdGEpICsgY291bnQsIDAsCi0JICAgICAgIFNIQV9CTE9DS1NJWkUgLSBjb3VudCk7Ci0Jc2hhX3RyYW5zZm9ybShzaGFfaW5mbyk7Ci0JbWVtc2V0KChTSEFfQllURSAqKSBzaGFfaW5mby0+ZGF0YSwgMCwgU0hBX0JMT0NLU0laRSAtIDgpOworICAgICAgICBtZW1zZXQoKChTSEFfQllURSAqKSBzaGFfaW5mby0+ZGF0YSkgKyBjb3VudCwgMCwKKyAgICAgICAgICAgICAgIFNIQV9CTE9DS1NJWkUgLSBjb3VudCk7CisgICAgICAgIHNoYV90cmFuc2Zvcm0oc2hhX2luZm8pOworICAgICAgICBtZW1zZXQoKFNIQV9CWVRFICopIHNoYV9pbmZvLT5kYXRhLCAwLCBTSEFfQkxPQ0tTSVpFIC0gOCk7CiAgICAgfQogICAgIGVsc2UgewotCW1lbXNldCgoKFNIQV9CWVRFICopIHNoYV9pbmZvLT5kYXRhKSArIGNvdW50LCAwLAotCSAgICAgICBTSEFfQkxPQ0tTSVpFIC0gOCAtIGNvdW50KTsKKyAgICAgICAgbWVtc2V0KCgoU0hBX0JZVEUgKikgc2hhX2luZm8tPmRhdGEpICsgY291bnQsIDAsCisgICAgICAgICAgICAgICBTSEFfQkxPQ0tTSVpFIC0gOCAtIGNvdW50KTsKICAgICB9CiAKICAgICAvKiBHSlM6IG5vdGUgdGhhdCB3ZSBhZGQgdGhlIGhpL2xvIGluIGJpZy1lbmRpYW4uIHNoYV90cmFuc2Zvcm0gd2lsbApAQCAtNDU0LDIxICs0NTQsMjEgQEAKICAgICAvKiBDcmVhdGUgYSBuZXcgc3RyaW5nICovCiAgICAgcmV0dmFsID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgc2VsZi0+ZGlnZXN0c2l6ZSAqIDIpOwogICAgIGlmICghcmV0dmFsKQotCSAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgIGhleF9kaWdlc3QgPSBQeVN0cmluZ19Bc1N0cmluZyhyZXR2YWwpOwogICAgIGlmICghaGV4X2RpZ2VzdCkgewotCSAgICBQeV9ERUNSRUYocmV0dmFsKTsKLQkgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICBQeV9ERUNSRUYocmV0dmFsKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAogICAgIC8qIE1ha2UgaGV4IHZlcnNpb24gb2YgdGhlIGRpZ2VzdCAqLwogICAgIGZvcihpPWo9MDsgaTxzZWxmLT5kaWdlc3RzaXplOyBpKyspIHsKICAgICAgICAgY2hhciBjOwogICAgICAgICBjID0gKGRpZ2VzdFtpXSA+PiA0KSAmIDB4ZjsKLQljID0gKGM+OSkgPyBjKydhJy0xMCA6IGMgKyAnMCc7CisgICAgICAgIGMgPSAoYz45KSA/IGMrJ2EnLTEwIDogYyArICcwJzsKICAgICAgICAgaGV4X2RpZ2VzdFtqKytdID0gYzsKICAgICAgICAgYyA9IChkaWdlc3RbaV0gJiAweGYpOwotCWMgPSAoYz45KSA/IGMrJ2EnLTEwIDogYyArICcwJzsKKyAgICAgICAgYyA9IChjPjkpID8gYysnYSctMTAgOiBjICsgJzAnOwogICAgICAgICBoZXhfZGlnZXN0W2orK10gPSBjOwogICAgIH0KICAgICByZXR1cm4gcmV0dmFsOwpAQCAtNDkzLDExICs0OTMsMTEgQEAKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIFNIQV9tZXRob2RzW10gPSB7Ci0gICAgeyJjb3B5IiwJICAoUHlDRnVuY3Rpb24pU0hBMjU2X2NvcHksICAgICAgTUVUSF9OT0FSR1MsICBTSEEyNTZfY29weV9fZG9jX199LAotICAgIHsiZGlnZXN0IiwJICAoUHlDRnVuY3Rpb24pU0hBMjU2X2RpZ2VzdCwgICAgTUVUSF9OT0FSR1MsICBTSEEyNTZfZGlnZXN0X19kb2NfX30sCisgICAgeyJjb3B5IiwgICAgICAoUHlDRnVuY3Rpb24pU0hBMjU2X2NvcHksICAgICAgTUVUSF9OT0FSR1MsICBTSEEyNTZfY29weV9fZG9jX199LAorICAgIHsiZGlnZXN0IiwgICAgKFB5Q0Z1bmN0aW9uKVNIQTI1Nl9kaWdlc3QsICAgIE1FVEhfTk9BUkdTLCAgU0hBMjU2X2RpZ2VzdF9fZG9jX199LAogICAgIHsiaGV4ZGlnZXN0IiwgKFB5Q0Z1bmN0aW9uKVNIQTI1Nl9oZXhkaWdlc3QsIE1FVEhfTk9BUkdTLCAgU0hBMjU2X2hleGRpZ2VzdF9fZG9jX199LAotICAgIHsidXBkYXRlIiwJICAoUHlDRnVuY3Rpb24pU0hBMjU2X3VwZGF0ZSwgICAgTUVUSF9WQVJBUkdTLCBTSEEyNTZfdXBkYXRlX19kb2NfX30sCi0gICAge05VTEwsCSAgTlVMTH0JCS8qIHNlbnRpbmVsICovCisgICAgeyJ1cGRhdGUiLCAgICAoUHlDRnVuY3Rpb24pU0hBMjU2X3VwZGF0ZSwgICAgTUVUSF9WQVJBUkdTLCBTSEEyNTZfdXBkYXRlX19kb2NfX30sCisgICAge05VTEwsICAgICAgICBOVUxMfSAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKgpAQCAtNTM3LDEzICs1MzcsMTMgQEAKIAogc3RhdGljIFB5VHlwZU9iamVjdCBTSEEyMjR0eXBlID0gewogICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotICAgICJfc2hhMjU2LnNoYTIyNCIsCS8qdHBfbmFtZSovCi0gICAgc2l6ZW9mKFNIQW9iamVjdCksCS8qdHBfc2l6ZSovCi0gICAgMCwJCQkvKnRwX2l0ZW1zaXplKi8KKyAgICAiX3NoYTI1Ni5zaGEyMjQiLCAgIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKFNIQW9iamVjdCksICAvKnRwX3NpemUqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9pdGVtc2l6ZSovCiAgICAgLyogbWV0aG9kcyAqLwotICAgIFNIQV9kZWFsbG9jLAkvKnRwX2RlYWxsb2MqLwotICAgIDAsCQkJLyp0cF9wcmludCovCi0gICAgMCwgICAgICAgICAgCS8qdHBfZ2V0YXR0ciovCisgICAgU0hBX2RlYWxsb2MsICAgICAgICAvKnRwX2RlYWxsb2MqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9wcmludCovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHIqLwogICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRyKi8KICAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfY29tcGFyZSovCiAgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX3JlcHIqLwpAQCAtNTU5LDI1ICs1NTksMjUgQEAKICAgICBQeV9UUEZMQUdTX0RFRkFVTFQsIC8qdHBfZmxhZ3MqLwogICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9kb2MqLwogICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF90cmF2ZXJzZSovCi0gICAgMCwJCQkvKnRwX2NsZWFyKi8KLSAgICAwLAkJCS8qdHBfcmljaGNvbXBhcmUqLwotICAgIDAsCQkJLyp0cF93ZWFrbGlzdG9mZnNldCovCi0gICAgMCwJCQkvKnRwX2l0ZXIqLwotICAgIDAsCQkJLyp0cF9pdGVybmV4dCovCi0gICAgU0hBX21ldGhvZHMsCS8qIHRwX21ldGhvZHMgKi8KLSAgICBTSEFfbWVtYmVycywJLyogdHBfbWVtYmVycyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9jbGVhciovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX3JpY2hjb21wYXJlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9pdGVyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfaXRlcm5leHQqLworICAgIFNIQV9tZXRob2RzLCAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIFNIQV9tZW1iZXJzLCAgICAgICAgLyogdHBfbWVtYmVycyAqLwogICAgIFNIQV9nZXRzZXRlcnMsICAgICAgLyogdHBfZ2V0c2V0ICovCiB9OwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IFNIQTI1NnR5cGUgPSB7CiAgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0gICAgIl9zaGEyNTYuc2hhMjU2IiwJLyp0cF9uYW1lKi8KLSAgICBzaXplb2YoU0hBb2JqZWN0KSwJLyp0cF9zaXplKi8KLSAgICAwLAkJCS8qdHBfaXRlbXNpemUqLworICAgICJfc2hhMjU2LnNoYTI1NiIsICAgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoU0hBb2JqZWN0KSwgIC8qdHBfc2l6ZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX2l0ZW1zaXplKi8KICAgICAvKiBtZXRob2RzICovCi0gICAgU0hBX2RlYWxsb2MsCS8qdHBfZGVhbGxvYyovCi0gICAgMCwJCQkvKnRwX3ByaW50Ki8KLSAgICAwLCAgICAgICAgICAJLyp0cF9nZXRhdHRyKi8KKyAgICBTSEFfZGVhbGxvYywgICAgICAgIC8qdHBfZGVhbGxvYyovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX3ByaW50Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0YXR0ciovCiAgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHIqLwogICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9jb21wYXJlKi8KICAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfcmVwciovCkBAIC01OTMsMTMgKzU5MywxMyBAQAogICAgIFB5X1RQRkxBR1NfREVGQVVMVCwgLyp0cF9mbGFncyovCiAgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX2RvYyovCiAgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX3RyYXZlcnNlKi8KLSAgICAwLAkJCS8qdHBfY2xlYXIqLwotICAgIDAsCQkJLyp0cF9yaWNoY29tcGFyZSovCi0gICAgMCwJCQkvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLSAgICAwLAkJCS8qdHBfaXRlciovCi0gICAgMCwJCQkvKnRwX2l0ZXJuZXh0Ki8KLSAgICBTSEFfbWV0aG9kcywJLyogdHBfbWV0aG9kcyAqLwotICAgIFNIQV9tZW1iZXJzLAkvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX2NsZWFyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX2l0ZXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9pdGVybmV4dCovCisgICAgU0hBX21ldGhvZHMsICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgU0hBX21lbWJlcnMsICAgICAgICAvKiB0cF9tZW1iZXJzICovCiAgICAgU0hBX2dldHNldGVycywgICAgICAvKiB0cF9nZXRzZXQgKi8KIH07CiAKQEAgLTY3NCw3ICs2NzQsNyBAQAogc3RhdGljIHN0cnVjdCBQeU1ldGhvZERlZiBTSEFfZnVuY3Rpb25zW10gPSB7CiAgICAgeyJzaGEyNTYiLCAoUHlDRnVuY3Rpb24pU0hBMjU2X25ldywgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsIFNIQTI1Nl9uZXdfX2RvY19ffSwKICAgICB7InNoYTIyNCIsIChQeUNGdW5jdGlvbilTSEEyMjRfbmV3LCBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywgU0hBMjI0X25ld19fZG9jX199LAotICAgIHtOVUxMLAlOVUxMfQkJIC8qIFNlbnRpbmVsICovCisgICAge05VTEwsICAgICAgTlVMTH0gICAgICAgICAgICAvKiBTZW50aW5lbCAqLwogfTsKIAogCkBAIC02OTUsNSArNjk1LDUgQEAKICAgICAgICAgcmV0dXJuOwogICAgIG0gPSBQeV9Jbml0TW9kdWxlKCJfc2hhMjU2IiwgU0hBX2Z1bmN0aW9ucyk7CiAgICAgaWYgKG0gPT0gTlVMTCkKLQlyZXR1cm47CisgICAgICAgIHJldHVybjsKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvc2hhNTEybW9kdWxlLmMgYi9Nb2R1bGVzL3NoYTUxMm1vZHVsZS5jCmluZGV4IGYyYzIzMGIuLjQyNTQ4YmIgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvc2hhNTEybW9kdWxlLmMKKysrIGIvTW9kdWxlcy9zaGE1MTJtb2R1bGUuYwpAQCAtMjMsNyArMjMsNyBAQAogCiAvKiBFbmRpYW5uZXNzIHRlc3RpbmcgYW5kIGRlZmluaXRpb25zICovCiAjZGVmaW5lIFRlc3RFbmRpYW5uZXNzKHZhcmlhYmxlKSB7aW50IGk9MTsgdmFyaWFibGU9UENUX0JJR19FTkRJQU47XAotCWlmICgqKChjaGFyKikmaSk9PTEpIHZhcmlhYmxlPVBDVF9MSVRUTEVfRU5ESUFOO30KKyAgICAgICAgaWYgKCooKGNoYXIqKSZpKT09MSkgdmFyaWFibGU9UENUX0xJVFRMRV9FTkRJQU47fQogCiAjZGVmaW5lIFBDVF9MSVRUTEVfRU5ESUFOIDEKICNkZWZpbmUgUENUX0JJR19FTkRJQU4gMApAQCAtMzMsOCArMzMsOCBAQAogdHlwZWRlZiB1bnNpZ25lZCBjaGFyIFNIQV9CWVRFOwogCiAjaWYgU0laRU9GX0lOVCA9PSA0Ci10eXBlZGVmIHVuc2lnbmVkIGludCBTSEFfSU5UMzI7CS8qIDMyLWJpdCBpbnRlZ2VyICovCi10eXBlZGVmIHVuc2lnbmVkIFBZX0xPTkdfTE9ORyBTSEFfSU5UNjQ7CS8qIDY0LWJpdCBpbnRlZ2VyICovCit0eXBlZGVmIHVuc2lnbmVkIGludCBTSEFfSU5UMzI7IC8qIDMyLWJpdCBpbnRlZ2VyICovCit0eXBlZGVmIHVuc2lnbmVkIFBZX0xPTkdfTE9ORyBTSEFfSU5UNjQ7ICAgICAgICAvKiA2NC1iaXQgaW50ZWdlciAqLwogI2Vsc2UKIC8qIG5vdCBkZWZpbmVkLiBjb21waWxhdGlvbiB3aWxsIGRpZS4gKi8KICNlbmRpZgpAQCAtNDgsMTEgKzQ4LDExIEBACiAKIHR5cGVkZWYgc3RydWN0IHsKICAgICBQeU9iamVjdF9IRUFECi0gICAgU0hBX0lOVDY0IGRpZ2VzdFs4XTsJCS8qIE1lc3NhZ2UgZGlnZXN0ICovCi0gICAgU0hBX0lOVDMyIGNvdW50X2xvLCBjb3VudF9oaTsJLyogNjQtYml0IGJpdCBjb3VudCAqLwotICAgIFNIQV9CWVRFIGRhdGFbU0hBX0JMT0NLU0laRV07CS8qIFNIQSBkYXRhIGJ1ZmZlciAqLworICAgIFNIQV9JTlQ2NCBkaWdlc3RbOF07ICAgICAgICAgICAgICAgIC8qIE1lc3NhZ2UgZGlnZXN0ICovCisgICAgU0hBX0lOVDMyIGNvdW50X2xvLCBjb3VudF9oaTsgICAgICAgLyogNjQtYml0IGJpdCBjb3VudCAqLworICAgIFNIQV9CWVRFIGRhdGFbU0hBX0JMT0NLU0laRV07ICAgICAgIC8qIFNIQSBkYXRhIGJ1ZmZlciAqLwogICAgIGludCBFbmRpYW5uZXNzOwotICAgIGludCBsb2NhbDsJCQkJLyogdW5wcm9jZXNzZWQgYW1vdW50IGluIGRhdGEgKi8KKyAgICBpbnQgbG9jYWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1bnByb2Nlc3NlZCBhbW91bnQgaW4gZGF0YSAqLwogICAgIGludCBkaWdlc3RzaXplOwogfSBTSEFvYmplY3Q7CiAKQEAgLTY0LDIyICs2NCwyMiBAQAogICAgIFNIQV9JTlQ2NCB2YWx1ZTsKIAogICAgIGlmICggRW5kaWFubmVzcyA9PSBQQ1RfQklHX0VORElBTiApCi0JcmV0dXJuOworICAgICAgICByZXR1cm47CiAKICAgICBieXRlQ291bnQgLz0gc2l6ZW9mKCpidWZmZXIpOwogICAgIHdoaWxlIChieXRlQ291bnQtLSkgewogICAgICAgICB2YWx1ZSA9ICpidWZmZXI7CiAKLQkJKCh1bnNpZ25lZCBjaGFyKilidWZmZXIpWzBdID0gKHVuc2lnbmVkIGNoYXIpKHZhbHVlID4+IDU2KSAmIDB4ZmY7Ci0JCSgodW5zaWduZWQgY2hhciopYnVmZmVyKVsxXSA9ICh1bnNpZ25lZCBjaGFyKSh2YWx1ZSA+PiA0OCkgJiAweGZmOwotCQkoKHVuc2lnbmVkIGNoYXIqKWJ1ZmZlcilbMl0gPSAodW5zaWduZWQgY2hhcikodmFsdWUgPj4gNDApICYgMHhmZjsKLQkJKCh1bnNpZ25lZCBjaGFyKilidWZmZXIpWzNdID0gKHVuc2lnbmVkIGNoYXIpKHZhbHVlID4+IDMyKSAmIDB4ZmY7Ci0JCSgodW5zaWduZWQgY2hhciopYnVmZmVyKVs0XSA9ICh1bnNpZ25lZCBjaGFyKSh2YWx1ZSA+PiAyNCkgJiAweGZmOwotCQkoKHVuc2lnbmVkIGNoYXIqKWJ1ZmZlcilbNV0gPSAodW5zaWduZWQgY2hhcikodmFsdWUgPj4gMTYpICYgMHhmZjsKLQkJKCh1bnNpZ25lZCBjaGFyKilidWZmZXIpWzZdID0gKHVuc2lnbmVkIGNoYXIpKHZhbHVlID4+ICA4KSAmIDB4ZmY7Ci0JCSgodW5zaWduZWQgY2hhciopYnVmZmVyKVs3XSA9ICh1bnNpZ25lZCBjaGFyKSh2YWx1ZSAgICAgICkgJiAweGZmOwotICAgICAgICAKLQkJYnVmZmVyKys7CisgICAgICAgICAgICAgICAgKCh1bnNpZ25lZCBjaGFyKilidWZmZXIpWzBdID0gKHVuc2lnbmVkIGNoYXIpKHZhbHVlID4+IDU2KSAmIDB4ZmY7CisgICAgICAgICAgICAgICAgKCh1bnNpZ25lZCBjaGFyKilidWZmZXIpWzFdID0gKHVuc2lnbmVkIGNoYXIpKHZhbHVlID4+IDQ4KSAmIDB4ZmY7CisgICAgICAgICAgICAgICAgKCh1bnNpZ25lZCBjaGFyKilidWZmZXIpWzJdID0gKHVuc2lnbmVkIGNoYXIpKHZhbHVlID4+IDQwKSAmIDB4ZmY7CisgICAgICAgICAgICAgICAgKCh1bnNpZ25lZCBjaGFyKilidWZmZXIpWzNdID0gKHVuc2lnbmVkIGNoYXIpKHZhbHVlID4+IDMyKSAmIDB4ZmY7CisgICAgICAgICAgICAgICAgKCh1bnNpZ25lZCBjaGFyKilidWZmZXIpWzRdID0gKHVuc2lnbmVkIGNoYXIpKHZhbHVlID4+IDI0KSAmIDB4ZmY7CisgICAgICAgICAgICAgICAgKCh1bnNpZ25lZCBjaGFyKilidWZmZXIpWzVdID0gKHVuc2lnbmVkIGNoYXIpKHZhbHVlID4+IDE2KSAmIDB4ZmY7CisgICAgICAgICAgICAgICAgKCh1bnNpZ25lZCBjaGFyKilidWZmZXIpWzZdID0gKHVuc2lnbmVkIGNoYXIpKHZhbHVlID4+ICA4KSAmIDB4ZmY7CisgICAgICAgICAgICAgICAgKCh1bnNpZ25lZCBjaGFyKilidWZmZXIpWzddID0gKHVuc2lnbmVkIGNoYXIpKHZhbHVlICAgICAgKSAmIDB4ZmY7CisKKyAgICAgICAgICAgICAgICBidWZmZXIrKzsKICAgICB9CiB9CiAKQEAgLTEyNCw3ICsxMjQsNyBAQAogICAgICggKCgoKHgpICYgUHlfVUxMKDB4RkZGRkZGRkZGRkZGRkZGRikpPj4oKHVuc2lnbmVkIFBZX0xPTkdfTE9ORykoeSkgJiA2MykpIHwgXAogICAgICAgKCh4KTw8KCh1bnNpZ25lZCBQWV9MT05HX0xPTkcpKDY0LSgoeSkgJiA2MykpKSkpICYgUHlfVUxMKDB4RkZGRkZGRkZGRkZGRkZGRikpCiAjZGVmaW5lIENoKHgseSx6KSAgICAgICAoeiBeICh4ICYgKHkgXiB6KSkpCi0jZGVmaW5lIE1haih4LHkseikgICAgICAoKCh4IHwgeSkgJiB6KSB8ICh4ICYgeSkpIAorI2RlZmluZSBNYWooeCx5LHopICAgICAgKCgoeCB8IHkpICYgeikgfCAoeCAmIHkpKQogI2RlZmluZSBTKHgsIG4pICAgICAgICAgUk9SNjQoKHgpLChuKSkKICNkZWZpbmUgUih4LCBuKSAgICAgICAgICgoKHgpICYgUHlfVUxMKDB4RkZGRkZGRkZGRkZGRkZGRikpID4+ICgodW5zaWduZWQgUFlfTE9OR19MT05HKW4pKQogI2RlZmluZSBTaWdtYTAoeCkgICAgICAgKFMoeCwgMjgpIF4gUyh4LCAzNCkgXiBTKHgsIDM5KSkKQEAgLTE0Myw3ICsxNDMsNyBAQAogICAgIGxvbmdSZXZlcnNlKFcsIChpbnQpc2l6ZW9mKHNoYV9pbmZvLT5kYXRhKSwgc2hhX2luZm8tPkVuZGlhbm5lc3MpOwogCiAgICAgZm9yIChpID0gMTY7IGkgPCA4MDsgKytpKSB7Ci0JCVdbaV0gPSBHYW1tYTEoV1tpIC0gMl0pICsgV1tpIC0gN10gKyBHYW1tYTAoV1tpIC0gMTVdKSArIFdbaSAtIDE2XTsKKyAgICAgICAgICAgICAgICBXW2ldID0gR2FtbWExKFdbaSAtIDJdKSArIFdbaSAtIDddICsgR2FtbWEwKFdbaSAtIDE1XSkgKyBXW2kgLSAxNl07CiAgICAgfQogICAgIGZvciAoaSA9IDA7IGkgPCA4OyArK2kpIHsKICAgICAgICAgU1tpXSA9IHNoYV9pbmZvLT5kaWdlc3RbaV07CkBAIC0yMzcsOCArMjM3LDggQEAKICAgICBSTkQoU1syXSxTWzNdLFNbNF0sU1s1XSxTWzZdLFNbN10sU1swXSxTWzFdLDc4LFB5X1VMTCgweDVmY2I2ZmFiM2FkNmZhZWMpKTsKICAgICBSTkQoU1sxXSxTWzJdLFNbM10sU1s0XSxTWzVdLFNbNl0sU1s3XSxTWzBdLDc5LFB5X1VMTCgweDZjNDQxOThjNGE0NzU4MTcpKTsKIAotI3VuZGVmIFJORCAgICAgCi0gICAgCisjdW5kZWYgUk5ECisKICAgICAvKiBmZWVkYmFjayAqLwogICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKICAgICAgICAgc2hhX2luZm8tPmRpZ2VzdFtpXSA9IHNoYV9pbmZvLT5kaWdlc3RbaV0gKyBTW2ldOwpAQCAtMzQwLDE0ICszNDAsMTQgQEAKICAgICBjb3VudCA9IChpbnQpICgobG9fYml0X2NvdW50ID4+IDMpICYgMHg3Zik7CiAgICAgKChTSEFfQllURSAqKSBzaGFfaW5mby0+ZGF0YSlbY291bnQrK10gPSAweDgwOwogICAgIGlmIChjb3VudCA+IFNIQV9CTE9DS1NJWkUgLSAxNikgewotCW1lbXNldCgoKFNIQV9CWVRFICopIHNoYV9pbmZvLT5kYXRhKSArIGNvdW50LCAwLAotCSAgICAgICBTSEFfQkxPQ0tTSVpFIC0gY291bnQpOwotCXNoYTUxMl90cmFuc2Zvcm0oc2hhX2luZm8pOwotCW1lbXNldCgoU0hBX0JZVEUgKikgc2hhX2luZm8tPmRhdGEsIDAsIFNIQV9CTE9DS1NJWkUgLSAxNik7CisgICAgICAgIG1lbXNldCgoKFNIQV9CWVRFICopIHNoYV9pbmZvLT5kYXRhKSArIGNvdW50LCAwLAorICAgICAgICAgICAgICAgU0hBX0JMT0NLU0laRSAtIGNvdW50KTsKKyAgICAgICAgc2hhNTEyX3RyYW5zZm9ybShzaGFfaW5mbyk7CisgICAgICAgIG1lbXNldCgoU0hBX0JZVEUgKikgc2hhX2luZm8tPmRhdGEsIDAsIFNIQV9CTE9DS1NJWkUgLSAxNik7CiAgICAgfQogICAgIGVsc2UgewotCW1lbXNldCgoKFNIQV9CWVRFICopIHNoYV9pbmZvLT5kYXRhKSArIGNvdW50LCAwLAotCSAgICAgICBTSEFfQkxPQ0tTSVpFIC0gMTYgLSBjb3VudCk7CisgICAgICAgIG1lbXNldCgoKFNIQV9CWVRFICopIHNoYV9pbmZvLT5kYXRhKSArIGNvdW50LCAwLAorICAgICAgICAgICAgICAgU0hBX0JMT0NLU0laRSAtIDE2IC0gY291bnQpOwogICAgIH0KIAogICAgIC8qIEdKUzogbm90ZSB0aGF0IHdlIGFkZCB0aGUgaGkvbG8gaW4gYmlnLWVuZGlhbi4gc2hhNTEyX3RyYW5zZm9ybSB3aWxsCkBAIC01MjAsMjEgKzUyMCwyMSBAQAogICAgIC8qIENyZWF0ZSBhIG5ldyBzdHJpbmcgKi8KICAgICByZXR2YWwgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBzZWxmLT5kaWdlc3RzaXplICogMik7CiAgICAgaWYgKCFyZXR2YWwpCi0JICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgaGV4X2RpZ2VzdCA9IFB5U3RyaW5nX0FzU3RyaW5nKHJldHZhbCk7CiAgICAgaWYgKCFoZXhfZGlnZXN0KSB7Ci0JICAgIFB5X0RFQ1JFRihyZXR2YWwpOwotCSAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihyZXR2YWwpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCiAgICAgLyogTWFrZSBoZXggdmVyc2lvbiBvZiB0aGUgZGlnZXN0ICovCiAgICAgZm9yIChpPWo9MDsgaTxzZWxmLT5kaWdlc3RzaXplOyBpKyspIHsKICAgICAgICAgY2hhciBjOwogICAgICAgICBjID0gKGRpZ2VzdFtpXSA+PiA0KSAmIDB4ZjsKLQljID0gKGM+OSkgPyBjKydhJy0xMCA6IGMgKyAnMCc7CisgICAgICAgIGMgPSAoYz45KSA/IGMrJ2EnLTEwIDogYyArICcwJzsKICAgICAgICAgaGV4X2RpZ2VzdFtqKytdID0gYzsKICAgICAgICAgYyA9IChkaWdlc3RbaV0gJiAweGYpOwotCWMgPSAoYz45KSA/IGMrJ2EnLTEwIDogYyArICcwJzsKKyAgICAgICAgYyA9IChjPjkpID8gYysnYSctMTAgOiBjICsgJzAnOwogICAgICAgICBoZXhfZGlnZXN0W2orK10gPSBjOwogICAgIH0KICAgICByZXR1cm4gcmV0dmFsOwpAQCAtNTU5LDExICs1NTksMTEgQEAKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIFNIQV9tZXRob2RzW10gPSB7Ci0gICAgeyJjb3B5IiwJICAoUHlDRnVuY3Rpb24pU0hBNTEyX2NvcHksICAgICAgTUVUSF9OT0FSR1MsIFNIQTUxMl9jb3B5X19kb2NfX30sCi0gICAgeyJkaWdlc3QiLAkgIChQeUNGdW5jdGlvbilTSEE1MTJfZGlnZXN0LCAgICBNRVRIX05PQVJHUywgU0hBNTEyX2RpZ2VzdF9fZG9jX199LAorICAgIHsiY29weSIsICAgICAgKFB5Q0Z1bmN0aW9uKVNIQTUxMl9jb3B5LCAgICAgIE1FVEhfTk9BUkdTLCBTSEE1MTJfY29weV9fZG9jX199LAorICAgIHsiZGlnZXN0IiwgICAgKFB5Q0Z1bmN0aW9uKVNIQTUxMl9kaWdlc3QsICAgIE1FVEhfTk9BUkdTLCBTSEE1MTJfZGlnZXN0X19kb2NfX30sCiAgICAgeyJoZXhkaWdlc3QiLCAoUHlDRnVuY3Rpb24pU0hBNTEyX2hleGRpZ2VzdCwgTUVUSF9OT0FSR1MsIFNIQTUxMl9oZXhkaWdlc3RfX2RvY19ffSwKLSAgICB7InVwZGF0ZSIsCSAgKFB5Q0Z1bmN0aW9uKVNIQTUxMl91cGRhdGUsICAgIE1FVEhfVkFSQVJHUywgU0hBNTEyX3VwZGF0ZV9fZG9jX199LAotICAgIHtOVUxMLAkgIE5VTEx9CQkvKiBzZW50aW5lbCAqLworICAgIHsidXBkYXRlIiwgICAgKFB5Q0Z1bmN0aW9uKVNIQTUxMl91cGRhdGUsICAgIE1FVEhfVkFSQVJHUywgU0hBNTEyX3VwZGF0ZV9fZG9jX199LAorICAgIHtOVUxMLCAgICAgICAgTlVMTH0gICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogc3RhdGljIFB5T2JqZWN0ICoKQEAgLTYwMywxMyArNjAzLDEzIEBACiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgU0hBMzg0dHlwZSA9IHsKICAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKLSAgICAiX3NoYTUxMi5zaGEzODQiLAkvKnRwX25hbWUqLwotICAgIHNpemVvZihTSEFvYmplY3QpLAkvKnRwX3NpemUqLwotICAgIDAsCQkJLyp0cF9pdGVtc2l6ZSovCisgICAgIl9zaGE1MTIuc2hhMzg0IiwgICAvKnRwX25hbWUqLworICAgIHNpemVvZihTSEFvYmplY3QpLCAgLyp0cF9zaXplKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfaXRlbXNpemUqLwogICAgIC8qIG1ldGhvZHMgKi8KLSAgICBTSEE1MTJfZGVhbGxvYywJLyp0cF9kZWFsbG9jKi8KLSAgICAwLAkJCS8qdHBfcHJpbnQqLwotICAgIDAsICAgICAgICAgIAkvKnRwX2dldGF0dHIqLworICAgIFNIQTUxMl9kZWFsbG9jLCAgICAgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfcHJpbnQqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9nZXRhdHRyKi8KICAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfc2V0YXR0ciovCiAgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX2NvbXBhcmUqLwogICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9yZXByKi8KQEAgLTYyNSwyNSArNjI1LDI1IEBACiAgICAgUHlfVFBGTEFHU19ERUZBVUxULCAvKnRwX2ZsYWdzKi8KICAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfZG9jKi8KICAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfdHJhdmVyc2UqLwotICAgIDAsCQkJLyp0cF9jbGVhciovCi0gICAgMCwJCQkvKnRwX3JpY2hjb21wYXJlKi8KLSAgICAwLAkJCS8qdHBfd2Vha2xpc3RvZmZzZXQqLwotICAgIDAsCQkJLyp0cF9pdGVyKi8KLSAgICAwLAkJCS8qdHBfaXRlcm5leHQqLwotICAgIFNIQV9tZXRob2RzLAkvKiB0cF9tZXRob2RzICovCi0gICAgU0hBX21lbWJlcnMsCS8qIHRwX21lbWJlcnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfY2xlYXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfaXRlciovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX2l0ZXJuZXh0Ki8KKyAgICBTSEFfbWV0aG9kcywgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICBTSEFfbWVtYmVycywgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KICAgICBTSEFfZ2V0c2V0ZXJzLCAgICAgIC8qIHRwX2dldHNldCAqLwogfTsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBTSEE1MTJ0eXBlID0gewogICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotICAgICJfc2hhNTEyLnNoYTUxMiIsCS8qdHBfbmFtZSovCi0gICAgc2l6ZW9mKFNIQW9iamVjdCksCS8qdHBfc2l6ZSovCi0gICAgMCwJCQkvKnRwX2l0ZW1zaXplKi8KKyAgICAiX3NoYTUxMi5zaGE1MTIiLCAgIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKFNIQW9iamVjdCksICAvKnRwX3NpemUqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9pdGVtc2l6ZSovCiAgICAgLyogbWV0aG9kcyAqLwotICAgIFNIQTUxMl9kZWFsbG9jLAkvKnRwX2RlYWxsb2MqLwotICAgIDAsCQkJLyp0cF9wcmludCovCi0gICAgMCwgICAgICAgICAgCS8qdHBfZ2V0YXR0ciovCisgICAgU0hBNTEyX2RlYWxsb2MsICAgICAvKnRwX2RlYWxsb2MqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9wcmludCovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHIqLwogICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRyKi8KICAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfY29tcGFyZSovCiAgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX3JlcHIqLwpAQCAtNjU5LDEzICs2NTksMTMgQEAKICAgICBQeV9UUEZMQUdTX0RFRkFVTFQsIC8qdHBfZmxhZ3MqLwogICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9kb2MqLwogICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF90cmF2ZXJzZSovCi0gICAgMCwJCQkvKnRwX2NsZWFyKi8KLSAgICAwLAkJCS8qdHBfcmljaGNvbXBhcmUqLwotICAgIDAsCQkJLyp0cF93ZWFrbGlzdG9mZnNldCovCi0gICAgMCwJCQkvKnRwX2l0ZXIqLwotICAgIDAsCQkJLyp0cF9pdGVybmV4dCovCi0gICAgU0hBX21ldGhvZHMsCS8qIHRwX21ldGhvZHMgKi8KLSAgICBTSEFfbWVtYmVycywJLyogdHBfbWVtYmVycyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9jbGVhciovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX3JpY2hjb21wYXJlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9pdGVyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfaXRlcm5leHQqLworICAgIFNIQV9tZXRob2RzLCAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIFNIQV9tZW1iZXJzLCAgICAgICAgLyogdHBfbWVtYmVycyAqLwogICAgIFNIQV9nZXRzZXRlcnMsICAgICAgLyogdHBfZ2V0c2V0ICovCiB9OwogCkBAIC03NDAsNyArNzQwLDcgQEAKIHN0YXRpYyBzdHJ1Y3QgUHlNZXRob2REZWYgU0hBX2Z1bmN0aW9uc1tdID0gewogICAgIHsic2hhNTEyIiwgKFB5Q0Z1bmN0aW9uKVNIQTUxMl9uZXcsIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLCBTSEE1MTJfbmV3X19kb2NfX30sCiAgICAgeyJzaGEzODQiLCAoUHlDRnVuY3Rpb24pU0hBMzg0X25ldywgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsIFNIQTM4NF9uZXdfX2RvY19ffSwKLSAgICB7TlVMTCwJTlVMTH0JCSAvKiBTZW50aW5lbCAqLworICAgIHtOVUxMLCAgICAgIE5VTEx9ICAgICAgICAgICAgLyogU2VudGluZWwgKi8KIH07CiAKIApAQCAtNzYxLDcgKzc2MSw3IEBACiAgICAgICAgIHJldHVybjsKICAgICBtID0gUHlfSW5pdE1vZHVsZSgiX3NoYTUxMiIsIFNIQV9mdW5jdGlvbnMpOwogICAgIGlmIChtID09IE5VTEwpCi0JcmV0dXJuOworICAgICAgICByZXR1cm47CiB9CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9zaGFtb2R1bGUuYyBiL01vZHVsZXMvc2hhbW9kdWxlLmMKaW5kZXggMWE3ZmMyYy4uZWZkNzIwNCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9zaGFtb2R1bGUuYworKysgYi9Nb2R1bGVzL3NoYW1vZHVsZS5jCkBAIC0yMSw3ICsyMSw3IEBACiAKIC8qIEVuZGlhbm5lc3MgdGVzdGluZyBhbmQgZGVmaW5pdGlvbnMgKi8KICNkZWZpbmUgVGVzdEVuZGlhbm5lc3ModmFyaWFibGUpIHtpbnQgaT0xOyB2YXJpYWJsZT1QQ1RfQklHX0VORElBTjtcCi0JaWYgKCooKGNoYXIqKSZpKT09MSkgdmFyaWFibGU9UENUX0xJVFRMRV9FTkRJQU47fQorICAgICAgICBpZiAoKigoY2hhciopJmkpPT0xKSB2YXJpYWJsZT1QQ1RfTElUVExFX0VORElBTjt9CiAKICNkZWZpbmUgUENUX0xJVFRMRV9FTkRJQU4gMQogI2RlZmluZSBQQ1RfQklHX0VORElBTiAwCkBAIC0zMSw3ICszMSw3IEBACiB0eXBlZGVmIHVuc2lnbmVkIGNoYXIgU0hBX0JZVEU7CiAKICNpZiBTSVpFT0ZfSU5UID09IDQKLXR5cGVkZWYgdW5zaWduZWQgaW50IFNIQV9JTlQzMjsJLyogMzItYml0IGludGVnZXIgKi8KK3R5cGVkZWYgdW5zaWduZWQgaW50IFNIQV9JTlQzMjsgLyogMzItYml0IGludGVnZXIgKi8KICNlbHNlCiAvKiBub3QgZGVmaW5lZC4gY29tcGlsYXRpb24gd2lsbCBkaWUuICovCiAjZW5kaWYKQEAgLTQ1LDExICs0NSwxMSBAQAogCiB0eXBlZGVmIHN0cnVjdCB7CiAgICAgUHlPYmplY3RfSEVBRAotICAgIFNIQV9JTlQzMiBkaWdlc3RbNV07CQkvKiBNZXNzYWdlIGRpZ2VzdCAqLwotICAgIFNIQV9JTlQzMiBjb3VudF9sbywgY291bnRfaGk7CS8qIDY0LWJpdCBiaXQgY291bnQgKi8KLSAgICBTSEFfQllURSBkYXRhW1NIQV9CTE9DS1NJWkVdOwkvKiBTSEEgZGF0YSBidWZmZXIgKi8KKyAgICBTSEFfSU5UMzIgZGlnZXN0WzVdOyAgICAgICAgICAgICAgICAvKiBNZXNzYWdlIGRpZ2VzdCAqLworICAgIFNIQV9JTlQzMiBjb3VudF9sbywgY291bnRfaGk7ICAgICAgIC8qIDY0LWJpdCBiaXQgY291bnQgKi8KKyAgICBTSEFfQllURSBkYXRhW1NIQV9CTE9DS1NJWkVdOyAgICAgICAvKiBTSEEgZGF0YSBidWZmZXIgKi8KICAgICBpbnQgRW5kaWFubmVzczsKLSAgICBpbnQgbG9jYWw7CQkJCS8qIHVucHJvY2Vzc2VkIGFtb3VudCBpbiBkYXRhICovCisgICAgaW50IGxvY2FsOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdW5wcm9jZXNzZWQgYW1vdW50IGluIGRhdGEgKi8KIH0gU0hBb2JqZWN0OwogCiAvKiBXaGVuIHJ1biBvbiBhIGxpdHRsZS1lbmRpYW4gQ1BVIHdlIG5lZWQgdG8gcGVyZm9ybSBieXRlIHJldmVyc2FsIG9uIGFuCkBAIC02MCw3ICs2MCw3IEBACiAgICAgU0hBX0lOVDMyIHZhbHVlOwogCiAgICAgaWYgKCBFbmRpYW5uZXNzID09IFBDVF9CSUdfRU5ESUFOICkKLQlyZXR1cm47CisgICAgICAgIHJldHVybjsKIAogICAgIGJ5dGVDb3VudCAvPSBzaXplb2YoKmJ1ZmZlcik7CiAgICAgd2hpbGUgKGJ5dGVDb3VudC0tKSB7CkBAIC0xMTEsNDggKzExMSw0OCBAQAogICAgc2F2ZSBvbmUgYm9vbGVhbiBvcGVyYXRpb24gZWFjaCAtIHRoYW5rcyB0byBSaWNoIFNjaHJvZXBwZWwsCiAgICByY3NAY3MuYXJpem9uYS5lZHUgZm9yIGRpc2NvdmVyaW5nIHRoaXMgKi8KIAotLyojZGVmaW5lIGYxKHgseSx6KQkoKHggJiB5KSB8ICh+eCAmIHopKQkJLy8gUm91bmRzICAwLTE5ICovCi0jZGVmaW5lIGYxKHgseSx6KQkoeiBeICh4ICYgKHkgXiB6KSkpCQkvKiBSb3VuZHMgIDAtMTkgKi8KLSNkZWZpbmUgZjIoeCx5LHopCSh4IF4geSBeIHopCQkJLyogUm91bmRzIDIwLTM5ICovCi0vKiNkZWZpbmUgZjMoeCx5LHopCSgoeCAmIHkpIHwgKHggJiB6KSB8ICh5ICYgeikpCS8vIFJvdW5kcyA0MC01OSAqLwotI2RlZmluZSBmMyh4LHkseikJKCh4ICYgeSkgfCAoeiAmICh4IHwgeSkpKQkvKiBSb3VuZHMgNDAtNTkgKi8KLSNkZWZpbmUgZjQoeCx5LHopCSh4IF4geSBeIHopCQkJLyogUm91bmRzIDYwLTc5ICovCisvKiNkZWZpbmUgZjEoeCx5LHopICAgICAoKHggJiB5KSB8ICh+eCAmIHopKSAgICAgICAgICAgIC8vIFJvdW5kcyAgMC0xOSAqLworI2RlZmluZSBmMSh4LHkseikgICAgICAgKHogXiAoeCAmICh5IF4geikpKSAgICAgICAgICAgICAvKiBSb3VuZHMgIDAtMTkgKi8KKyNkZWZpbmUgZjIoeCx5LHopICAgICAgICh4IF4geSBeIHopICAgICAgICAgICAgICAgICAgICAgLyogUm91bmRzIDIwLTM5ICovCisvKiNkZWZpbmUgZjMoeCx5LHopICAgICAoKHggJiB5KSB8ICh4ICYgeikgfCAoeSAmIHopKSAgIC8vIFJvdW5kcyA0MC01OSAqLworI2RlZmluZSBmMyh4LHkseikgICAgICAgKCh4ICYgeSkgfCAoeiAmICh4IHwgeSkpKSAgICAgICAvKiBSb3VuZHMgNDAtNTkgKi8KKyNkZWZpbmUgZjQoeCx5LHopICAgICAgICh4IF4geSBeIHopICAgICAgICAgICAgICAgICAgICAgLyogUm91bmRzIDYwLTc5ICovCiAKIC8qIFNIQSBjb25zdGFudHMgKi8KIAotI2RlZmluZSBDT05TVDEJCTB4NWE4Mjc5OTlMCQkJLyogUm91bmRzICAwLTE5ICovCi0jZGVmaW5lIENPTlNUMgkJMHg2ZWQ5ZWJhMUwJCQkvKiBSb3VuZHMgMjAtMzkgKi8KLSNkZWZpbmUgQ09OU1QzCQkweDhmMWJiY2RjTAkJCS8qIFJvdW5kcyA0MC01OSAqLwotI2RlZmluZSBDT05TVDQJCTB4Y2E2MmMxZDZMCQkJLyogUm91bmRzIDYwLTc5ICovCisjZGVmaW5lIENPTlNUMSAgICAgICAgICAweDVhODI3OTk5TCAgICAgICAgICAgICAgICAgICAgIC8qIFJvdW5kcyAgMC0xOSAqLworI2RlZmluZSBDT05TVDIgICAgICAgICAgMHg2ZWQ5ZWJhMUwgICAgICAgICAgICAgICAgICAgICAvKiBSb3VuZHMgMjAtMzkgKi8KKyNkZWZpbmUgQ09OU1QzICAgICAgICAgIDB4OGYxYmJjZGNMICAgICAgICAgICAgICAgICAgICAgLyogUm91bmRzIDQwLTU5ICovCisjZGVmaW5lIENPTlNUNCAgICAgICAgICAweGNhNjJjMWQ2TCAgICAgICAgICAgICAgICAgICAgIC8qIFJvdW5kcyA2MC03OSAqLwogCiAvKiAzMi1iaXQgcm90YXRlICovCiAKLSNkZWZpbmUgUjMyKHgsbikJKCh4IDw8IG4pIHwgKHggPj4gKDMyIC0gbikpKQorI2RlZmluZSBSMzIoeCxuKSAgICAgICAgKCh4IDw8IG4pIHwgKHggPj4gKDMyIC0gbikpKQogCiAvKiB0aGUgZ2VuZXJpYyBjYXNlLCBmb3Igd2hlbiB0aGUgb3ZlcmFsbCByb3RhdGlvbiBpcyBub3QgdW5yYXZlbGVkICovCiAKLSNkZWZpbmUgRkcobikJXAotICAgIFQgPSBSMzIoQSw1KSArIGYjI24oQixDLEQpICsgRSArICpXUCsrICsgQ09OU1QjI247CVwKKyNkZWZpbmUgRkcobikgICBcCisgICAgVCA9IFIzMihBLDUpICsgZiMjbihCLEMsRCkgKyBFICsgKldQKysgKyBDT05TVCMjbjsgIFwKICAgICBFID0gRDsgRCA9IEM7IEMgPSBSMzIoQiwzMCk7IEIgPSBBOyBBID0gVAogCiAvKiBzcGVjaWZpYyBjYXNlcywgZm9yIHdoZW4gdGhlIG92ZXJhbGwgcm90YXRpb24gaXMgdW5yYXZlbGVkICovCiAKLSNkZWZpbmUgRkEobikJXAorI2RlZmluZSBGQShuKSAgIFwKICAgICBUID0gUjMyKEEsNSkgKyBmIyNuKEIsQyxEKSArIEUgKyAqV1ArKyArIENPTlNUIyNuOyBCID0gUjMyKEIsMzApCiAKLSNkZWZpbmUgRkIobikJXAorI2RlZmluZSBGQihuKSAgIFwKICAgICBFID0gUjMyKFQsNSkgKyBmIyNuKEEsQixDKSArIEQgKyAqV1ArKyArIENPTlNUIyNuOyBBID0gUjMyKEEsMzApCiAKLSNkZWZpbmUgRkMobikJXAorI2RlZmluZSBGQyhuKSAgIFwKICAgICBEID0gUjMyKEUsNSkgKyBmIyNuKFQsQSxCKSArIEMgKyAqV1ArKyArIENPTlNUIyNuOyBUID0gUjMyKFQsMzApCiAKLSNkZWZpbmUgRkQobikJXAorI2RlZmluZSBGRChuKSAgIFwKICAgICBDID0gUjMyKEQsNSkgKyBmIyNuKEUsVCxBKSArIEIgKyAqV1ArKyArIENPTlNUIyNuOyBFID0gUjMyKEUsMzApCiAKLSNkZWZpbmUgRkUobikJXAorI2RlZmluZSBGRShuKSAgIFwKICAgICBCID0gUjMyKEMsNSkgKyBmIyNuKEQsRSxUKSArIEEgKyAqV1ArKyArIENPTlNUIyNuOyBEID0gUjMyKEQsMzApCiAKLSNkZWZpbmUgRlQobikJXAorI2RlZmluZSBGVChuKSAgIFwKICAgICBBID0gUjMyKEIsNSkgKyBmIyNuKEMsRCxFKSArIFQgKyAqV1ArKyArIENPTlNUIyNuOyBDID0gUjMyKEMsMzApCiAKIC8qIGRvIFNIQSB0cmFuc2Zvcm1hdGlvbiAqLwpAQCAtMTY3LDEwICsxNjcsMTAgQEAKICAgICBsb25nUmV2ZXJzZShXLCAoaW50KXNpemVvZihzaGFfaW5mby0+ZGF0YSksIHNoYV9pbmZvLT5FbmRpYW5uZXNzKTsKIAogICAgIGZvciAoaSA9IDE2OyBpIDwgODA7ICsraSkgewotCVdbaV0gPSBXW2ktM10gXiBXW2ktOF0gXiBXW2ktMTRdIF4gV1tpLTE2XTsKKyAgICAgICAgV1tpXSA9IFdbaS0zXSBeIFdbaS04XSBeIFdbaS0xNF0gXiBXW2ktMTZdOwogCi0JLyogZXh0cmEgcm90YXRpb24gZml4ICovCi0JV1tpXSA9IFIzMihXW2ldLCAxKTsKKyAgICAgICAgLyogZXh0cmEgcm90YXRpb24gZml4ICovCisgICAgICAgIFdbaV0gPSBSMzIoV1tpXSwgMSk7CiAgICAgfQogICAgIEEgPSBzaGFfaW5mby0+ZGlnZXN0WzBdOwogICAgIEIgPSBzaGFfaW5mby0+ZGlnZXN0WzFdOwpAQCAtMjg2LDE0ICsyODYsMTQgQEAKICAgICBjb3VudCA9IChpbnQpICgobG9fYml0X2NvdW50ID4+IDMpICYgMHgzZik7CiAgICAgKChTSEFfQllURSAqKSBzaGFfaW5mby0+ZGF0YSlbY291bnQrK10gPSAweDgwOwogICAgIGlmIChjb3VudCA+IFNIQV9CTE9DS1NJWkUgLSA4KSB7Ci0JbWVtc2V0KCgoU0hBX0JZVEUgKikgc2hhX2luZm8tPmRhdGEpICsgY291bnQsIDAsCi0JICAgICAgIFNIQV9CTE9DS1NJWkUgLSBjb3VudCk7Ci0Jc2hhX3RyYW5zZm9ybShzaGFfaW5mbyk7Ci0JbWVtc2V0KChTSEFfQllURSAqKSBzaGFfaW5mby0+ZGF0YSwgMCwgU0hBX0JMT0NLU0laRSAtIDgpOworICAgICAgICBtZW1zZXQoKChTSEFfQllURSAqKSBzaGFfaW5mby0+ZGF0YSkgKyBjb3VudCwgMCwKKyAgICAgICAgICAgICAgIFNIQV9CTE9DS1NJWkUgLSBjb3VudCk7CisgICAgICAgIHNoYV90cmFuc2Zvcm0oc2hhX2luZm8pOworICAgICAgICBtZW1zZXQoKFNIQV9CWVRFICopIHNoYV9pbmZvLT5kYXRhLCAwLCBTSEFfQkxPQ0tTSVpFIC0gOCk7CiAgICAgfQogICAgIGVsc2UgewotCW1lbXNldCgoKFNIQV9CWVRFICopIHNoYV9pbmZvLT5kYXRhKSArIGNvdW50LCAwLAotCSAgICAgICBTSEFfQkxPQ0tTSVpFIC0gOCAtIGNvdW50KTsKKyAgICAgICAgbWVtc2V0KCgoU0hBX0JZVEUgKikgc2hhX2luZm8tPmRhdGEpICsgY291bnQsIDAsCisgICAgICAgICAgICAgICBTSEFfQkxPQ0tTSVpFIC0gOCAtIGNvdW50KTsKICAgICB9CiAKICAgICAvKiBHSlM6IG5vdGUgdGhhdCB3ZSBhZGQgdGhlIGhpL2xvIGluIGJpZy1lbmRpYW4uIHNoYV90cmFuc2Zvcm0gd2lsbApAQCAtNDAyLDIxICs0MDIsMjEgQEAKICAgICAvKiBDcmVhdGUgYSBuZXcgc3RyaW5nICovCiAgICAgcmV0dmFsID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgc2l6ZW9mKGRpZ2VzdCkgKiAyKTsKICAgICBpZiAoIXJldHZhbCkKLQkgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICBoZXhfZGlnZXN0ID0gUHlTdHJpbmdfQXNTdHJpbmcocmV0dmFsKTsKICAgICBpZiAoIWhleF9kaWdlc3QpIHsKLQkgICAgUHlfREVDUkVGKHJldHZhbCk7Ci0JICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgUHlfREVDUkVGKHJldHZhbCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKICAgICAvKiBNYWtlIGhleCB2ZXJzaW9uIG9mIHRoZSBkaWdlc3QgKi8KICAgICBmb3IoaT1qPTA7IGk8c2l6ZW9mKGRpZ2VzdCk7IGkrKykgewogICAgICAgICBjaGFyIGM7CiAgICAgICAgIGMgPSAoZGlnZXN0W2ldID4+IDQpICYgMHhmOwotCWMgPSAoYz45KSA/IGMrJ2EnLTEwIDogYyArICcwJzsKKyAgICAgICAgYyA9IChjPjkpID8gYysnYSctMTAgOiBjICsgJzAnOwogICAgICAgICBoZXhfZGlnZXN0W2orK10gPSBjOwogICAgICAgICBjID0gKGRpZ2VzdFtpXSAmIDB4Zik7Ci0JYyA9IChjPjkpID8gYysnYSctMTAgOiBjICsgJzAnOworICAgICAgICBjID0gKGM+OSkgPyBjKydhJy0xMCA6IGMgKyAnMCc7CiAgICAgICAgIGhleF9kaWdlc3RbaisrXSA9IGM7CiAgICAgfQogICAgIHJldHVybiByZXR2YWw7CkBAIC00NDEsMTEgKzQ0MSwxMSBAQAogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgU0hBX21ldGhvZHNbXSA9IHsKLSAgICB7ImNvcHkiLAkgIChQeUNGdW5jdGlvbilTSEFfY29weSwgICAgICBNRVRIX05PQVJHUywgIFNIQV9jb3B5X19kb2NfX30sCi0gICAgeyJkaWdlc3QiLAkgIChQeUNGdW5jdGlvbilTSEFfZGlnZXN0LCAgICBNRVRIX05PQVJHUywgIFNIQV9kaWdlc3RfX2RvY19ffSwKKyAgICB7ImNvcHkiLCAgICAgIChQeUNGdW5jdGlvbilTSEFfY29weSwgICAgICBNRVRIX05PQVJHUywgIFNIQV9jb3B5X19kb2NfX30sCisgICAgeyJkaWdlc3QiLCAgICAoUHlDRnVuY3Rpb24pU0hBX2RpZ2VzdCwgICAgTUVUSF9OT0FSR1MsICBTSEFfZGlnZXN0X19kb2NfX30sCiAgICAgeyJoZXhkaWdlc3QiLCAoUHlDRnVuY3Rpb24pU0hBX2hleGRpZ2VzdCwgTUVUSF9OT0FSR1MsICBTSEFfaGV4ZGlnZXN0X19kb2NfX30sCi0gICAgeyJ1cGRhdGUiLAkgIChQeUNGdW5jdGlvbilTSEFfdXBkYXRlLCAgICBNRVRIX1ZBUkFSR1MsIFNIQV91cGRhdGVfX2RvY19ffSwKLSAgICB7TlVMTCwJICBOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7InVwZGF0ZSIsICAgIChQeUNGdW5jdGlvbilTSEFfdXBkYXRlLCAgICBNRVRIX1ZBUkFSR1MsIFNIQV91cGRhdGVfX2RvY19ffSwKKyAgICB7TlVMTCwgICAgICAgIE5VTEx9ICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC00OTAsMTIgKzQ5MCwxMiBAQAogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IFNIQXR5cGUgPSB7CiAgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0gICAgIl9zaGEuc2hhIiwJCS8qdHBfbmFtZSovCi0gICAgc2l6ZW9mKFNIQW9iamVjdCksCS8qdHBfc2l6ZSovCi0gICAgMCwJCQkvKnRwX2l0ZW1zaXplKi8KKyAgICAiX3NoYS5zaGEiLCAgICAgICAgIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKFNIQW9iamVjdCksICAvKnRwX3NpemUqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9pdGVtc2l6ZSovCiAgICAgLyogbWV0aG9kcyAqLwotICAgIFNIQV9kZWFsbG9jLAkvKnRwX2RlYWxsb2MqLwotICAgIDAsCQkJLyp0cF9wcmludCovCisgICAgU0hBX2RlYWxsb2MsICAgICAgICAvKnRwX2RlYWxsb2MqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9wcmludCovCiAgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHIqLwogICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRyKi8KICAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfY29tcGFyZSovCkBAIC01MTIsMTIgKzUxMiwxMiBAQAogICAgIFB5X1RQRkxBR1NfREVGQVVMVCwgLyp0cF9mbGFncyovCiAgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX2RvYyovCiAgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX3RyYXZlcnNlKi8KLSAgICAwLAkJCS8qdHBfY2xlYXIqLwotICAgIDAsCQkJLyp0cF9yaWNoY29tcGFyZSovCi0gICAgMCwJCQkvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLSAgICAwLAkJCS8qdHBfaXRlciovCi0gICAgMCwJCQkvKnRwX2l0ZXJuZXh0Ki8KLSAgICBTSEFfbWV0aG9kcywJLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9jbGVhciovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX3JpY2hjb21wYXJlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9pdGVyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfaXRlcm5leHQqLworICAgIFNIQV9tZXRob2RzLCAgICAgICAgLyogdHBfbWV0aG9kcyAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLwogICAgIFNIQV9nZXRzZXRlcnMsICAgICAgLyogdHBfZ2V0c2V0ICovCiB9OwpAQCAtNTYzLDcgKzU2Myw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgUHlNZXRob2REZWYgU0hBX2Z1bmN0aW9uc1tdID0gewogICAgIHsibmV3IiwgKFB5Q0Z1bmN0aW9uKVNIQV9uZXcsIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLCBTSEFfbmV3X19kb2NfX30sCi0gICAge05VTEwsCU5VTEx9CQkgLyogU2VudGluZWwgKi8KKyAgICB7TlVMTCwgICAgICBOVUxMfSAgICAgICAgICAgIC8qIFNlbnRpbmVsICovCiB9OwogCiAKQEAgLTU4MSwxMiArNTgxLDEyIEBACiAgICAgICAgIHJldHVybjsKICAgICBtID0gUHlfSW5pdE1vZHVsZSgiX3NoYSIsIFNIQV9mdW5jdGlvbnMpOwogICAgIGlmIChtID09IE5VTEwpCi0JcmV0dXJuOworICAgICAgICByZXR1cm47CiAKICAgICAvKiBBZGQgc29tZSBzeW1ib2xpYyBjb25zdGFudHMgdG8gdGhlIG1vZHVsZSAqLwogICAgIGluc2ludCgiYmxvY2tzaXplIiwgMSk7ICAvKiBGb3IgZnV0dXJlIHVzZSwgaW4gY2FzZSBzb21lIGhhc2gKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25zIHJlcXVpcmUgYW4gaW50ZWdyYWwgbnVtYmVyIG9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrcyAqLyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tzICovCiAgICAgaW5zaW50KCJkaWdlc3RzaXplIiwgMjApOwogICAgIGluc2ludCgiZGlnZXN0X3NpemUiLCAyMCk7CiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3NpZ25hbG1vZHVsZS5jIGIvTW9kdWxlcy9zaWduYWxtb2R1bGUuYwppbmRleCBiYjM2NGFhLi44YjEzNzRiIDEwMDY0NAotLS0gYS9Nb2R1bGVzL3NpZ25hbG1vZHVsZS5jCisrKyBiL01vZHVsZXMvc2lnbmFsbW9kdWxlLmMKQEAgLTI4LDEzICsyOCwxMyBAQAogCiAjaWZuZGVmIE5TSUcKICMgaWYgZGVmaW5lZChfTlNJRykKLSMgIGRlZmluZSBOU0lHIF9OU0lHCQkvKiBGb3IgQlNEL1N5c1YgKi8KKyMgIGRlZmluZSBOU0lHIF9OU0lHICAgICAgICAgICAgLyogRm9yIEJTRC9TeXNWICovCiAjIGVsaWYgZGVmaW5lZChfU0lHTUFYKQotIyAgZGVmaW5lIE5TSUcgKF9TSUdNQVggKyAxKQkvKiBGb3IgUU5YICovCisjICBkZWZpbmUgTlNJRyAoX1NJR01BWCArIDEpICAgIC8qIEZvciBRTlggKi8KICMgZWxpZiBkZWZpbmVkKFNJR01BWCkKLSMgIGRlZmluZSBOU0lHIChTSUdNQVggKyAxKQkvKiBGb3IgZGpncHAgKi8KKyMgIGRlZmluZSBOU0lHIChTSUdNQVggKyAxKSAgICAgLyogRm9yIGRqZ3BwICovCiAjIGVsc2UKLSMgIGRlZmluZSBOU0lHIDY0CQkvKiBVc2UgYSByZWFzb25hYmxlIGRlZmF1bHQgdmFsdWUgKi8KKyMgIGRlZmluZSBOU0lHIDY0ICAgICAgICAgICAgICAgLyogVXNlIGEgcmVhc29uYWJsZSBkZWZhdWx0IHZhbHVlICovCiAjIGVuZGlmCiAjZW5kaWYKIApAQCAtNzYsOCArNzYsOCBAQAogI2VuZGlmCiAKIHN0YXRpYyBzdHJ1Y3QgewotICAgICAgICBpbnQgdHJpcHBlZDsKLSAgICAgICAgUHlPYmplY3QgKmZ1bmM7CisgICAgaW50IHRyaXBwZWQ7CisgICAgUHlPYmplY3QgKmZ1bmM7CiB9IEhhbmRsZXJzW05TSUddOwogCiBzdGF0aWMgc2lnX2F0b21pY190IHdha2V1cF9mZCA9IC0xOwpAQCAtMTIwLDE4ICsxMjAsMTggQEAKIAogICAgIHIgPSBQeVR1cGxlX05ldygyKTsKICAgICBpZiAociA9PSBOVUxMKQotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gTlVMTDsKIAogICAgIGlmKCEodiA9IFB5RmxvYXRfRnJvbURvdWJsZShkb3VibGVfZnJvbV90aW1ldmFsKCZpdi0+aXRfdmFsdWUpKSkpIHsKLSAgICAgICAgUHlfREVDUkVGKHIpOyAgIAotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQeV9ERUNSRUYocik7CisgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCiAgICAgUHlUdXBsZV9TRVRfSVRFTShyLCAwLCB2KTsKIAogICAgIGlmKCEodiA9IFB5RmxvYXRfRnJvbURvdWJsZShkb3VibGVfZnJvbV90aW1ldmFsKCZpdi0+aXRfaW50ZXJ2YWwpKSkpIHsKLSAgICAgICAgUHlfREVDUkVGKHIpOwotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQeV9ERUNSRUYocik7CisgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCiAgICAgUHlUdXBsZV9TRVRfSVRFTShyLCAxLCB2KTsKQEAgLTE0Myw4ICsxNDMsOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNpZ25hbF9kZWZhdWx0X2ludF9oYW5kbGVyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeUVycl9TZXROb25lKFB5RXhjX0tleWJvYXJkSW50ZXJydXB0KTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeUVycl9TZXROb25lKFB5RXhjX0tleWJvYXJkSW50ZXJydXB0KTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogUHlEb2NfU1RSVkFSKGRlZmF1bHRfaW50X2hhbmRsZXJfZG9jLApAQCAtMTU3LDcgKzE1Nyw3IEBACiBzdGF0aWMgaW50CiBjaGVja3NpZ25hbHNfd2l0aGFyZyh2b2lkICogdW51c2VkKQogewotCXJldHVybiBQeUVycl9DaGVja1NpZ25hbHMoKTsKKyAgICByZXR1cm4gUHlFcnJfQ2hlY2tTaWduYWxzKCk7CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC0xNjUsMzggKzE2NSwzOCBAQAogewogI2lmZGVmIFdJVEhfVEhSRUFECiAjaWZkZWYgV0lUSF9QVEgKLQlpZiAoUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpICE9IG1haW5fdGhyZWFkKSB7Ci0JCXB0aF9yYWlzZSgqKHB0aF90ICopIG1haW5fdGhyZWFkLCBzaWdfbnVtKTsKLQkJcmV0dXJuOwotCX0KKyAgICBpZiAoUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpICE9IG1haW5fdGhyZWFkKSB7CisgICAgICAgIHB0aF9yYWlzZSgqKHB0aF90ICopIG1haW5fdGhyZWFkLCBzaWdfbnVtKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KICNlbmRpZgotCS8qIFNlZSBOT1RFUyBzZWN0aW9uIGFib3ZlICovCi0JaWYgKGdldHBpZCgpID09IG1haW5fcGlkKSB7CisgICAgLyogU2VlIE5PVEVTIHNlY3Rpb24gYWJvdmUgKi8KKyAgICBpZiAoZ2V0cGlkKCkgPT0gbWFpbl9waWQpIHsKICNlbmRpZgotCQlIYW5kbGVyc1tzaWdfbnVtXS50cmlwcGVkID0gMTsKLSAgICAgICAgICAgICAgICAvKiBTZXQgaXNfdHJpcHBlZCBhZnRlciBzZXR0aW5nIC50cmlwcGVkLCBhcyBpdCBnZXRzCi0gICAgICAgICAgICAgICAgICAgY2xlYXJlZCBpbiBQeUVycl9DaGVja1NpZ25hbHMoKSBiZWZvcmUgLnRyaXBwZWQuICovCi0JCWlzX3RyaXBwZWQgPSAxOwotCQlQeV9BZGRQZW5kaW5nQ2FsbChjaGVja3NpZ25hbHNfd2l0aGFyZywgTlVMTCk7Ci0JCWlmICh3YWtldXBfZmQgIT0gLTEpCi0JCQl3cml0ZSh3YWtldXBfZmQsICJcMCIsIDEpOworICAgICAgICBIYW5kbGVyc1tzaWdfbnVtXS50cmlwcGVkID0gMTsKKyAgICAgICAgLyogU2V0IGlzX3RyaXBwZWQgYWZ0ZXIgc2V0dGluZyAudHJpcHBlZCwgYXMgaXQgZ2V0cworICAgICAgICAgICBjbGVhcmVkIGluIFB5RXJyX0NoZWNrU2lnbmFscygpIGJlZm9yZSAudHJpcHBlZC4gKi8KKyAgICAgICAgaXNfdHJpcHBlZCA9IDE7CisgICAgICAgIFB5X0FkZFBlbmRpbmdDYWxsKGNoZWNrc2lnbmFsc193aXRoYXJnLCBOVUxMKTsKKyAgICAgICAgaWYgKHdha2V1cF9mZCAhPSAtMSkKKyAgICAgICAgICAgIHdyaXRlKHdha2V1cF9mZCwgIlwwIiwgMSk7CiAjaWZkZWYgV0lUSF9USFJFQUQKLQl9CisgICAgfQogI2VuZGlmCiAjaWZkZWYgU0lHQ0hMRAotCWlmIChzaWdfbnVtID09IFNJR0NITEQpIHsKLQkJLyogVG8gYXZvaWQgaW5maW5pdGUgcmVjdXJzaW9uLCB0aGlzIHNpZ25hbCByZW1haW5zCi0JCSAgIHJlc2V0IHVudGlsIGV4cGxpY2l0IHJlLWluc3RhdGVkLgotCQkgICBEb24ndCBjbGVhciB0aGUgJ2Z1bmMnIGZpZWxkIGFzIGl0IGlzIG91ciBwb2ludGVyCi0JCSAgIHRvIHRoZSBQeXRob24gaGFuZGxlci4uLiAqLwotCQlyZXR1cm47Ci0JfQorICAgIGlmIChzaWdfbnVtID09IFNJR0NITEQpIHsKKyAgICAgICAgLyogVG8gYXZvaWQgaW5maW5pdGUgcmVjdXJzaW9uLCB0aGlzIHNpZ25hbCByZW1haW5zCisgICAgICAgICAgIHJlc2V0IHVudGlsIGV4cGxpY2l0IHJlLWluc3RhdGVkLgorICAgICAgICAgICBEb24ndCBjbGVhciB0aGUgJ2Z1bmMnIGZpZWxkIGFzIGl0IGlzIG91ciBwb2ludGVyCisgICAgICAgICAgIHRvIHRoZSBQeXRob24gaGFuZGxlci4uLiAqLworICAgICAgICByZXR1cm47CisgICAgfQogI2VuZGlmCiAjaWZuZGVmIEhBVkVfU0lHQUNUSU9OCi0JLyogSWYgdGhlIGhhbmRsZXIgd2FzIG5vdCBzZXQgdXAgd2l0aCBzaWdhY3Rpb24sIHJlaW5zdGFsbCBpdC4gIFNlZQotCSAqIFB5dGhvbi9weXRob25ydW4uYyBmb3IgdGhlIGltcGxlbWVudGF0aW9uIG9mIFB5T1Nfc2V0c2lnIHdoaWNoCi0JICogbWFrZXMgdGhpcyB0cnVlLiAgU2VlIGFsc28gaXNzdWU4MzU0LiAqLwotCVB5T1Nfc2V0c2lnKHNpZ19udW0sIHNpZ25hbF9oYW5kbGVyKTsKKyAgICAvKiBJZiB0aGUgaGFuZGxlciB3YXMgbm90IHNldCB1cCB3aXRoIHNpZ2FjdGlvbiwgcmVpbnN0YWxsIGl0LiAgU2VlCisgICAgICogUHl0aG9uL3B5dGhvbnJ1bi5jIGZvciB0aGUgaW1wbGVtZW50YXRpb24gb2YgUHlPU19zZXRzaWcgd2hpY2gKKyAgICAgKiBtYWtlcyB0aGlzIHRydWUuICBTZWUgYWxzbyBpc3N1ZTgzNTQuICovCisgICAgUHlPU19zZXRzaWcoc2lnX251bSwgc2lnbmFsX2hhbmRsZXIpOwogI2VuZGlmCiB9CiAKQEAgLTIwNSwxMSArMjA1LDExIEBACiBzdGF0aWMgUHlPYmplY3QgKgogc2lnbmFsX2FsYXJtKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgdDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6YWxhcm0iLCAmdCkpCi0JCXJldHVybiBOVUxMOwotCS8qIGFsYXJtKCkgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHNlY29uZHMgcmVtYWluaW5nICovCi0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKWFsYXJtKHQpKTsKKyAgICBpbnQgdDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6YWxhcm0iLCAmdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIC8qIGFsYXJtKCkgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHNlY29uZHMgcmVtYWluaW5nICovCisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKWFsYXJtKHQpKTsKIH0KIAogUHlEb2NfU1RSVkFSKGFsYXJtX2RvYywKQEAgLTIyMiwxNyArMjIyLDE3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc2lnbmFsX3BhdXNlKFB5T2JqZWN0ICpzZWxmKQogewotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQkodm9pZClwYXVzZSgpOwotCVB5X0VORF9BTExPV19USFJFQURTCi0JLyogbWFrZSBzdXJlIHRoYXQgYW55IGV4Y2VwdGlvbnMgdGhhdCBnb3QgcmFpc2VkIGFyZSBwcm9wYWdhdGVkCi0JICogYmFjayBpbnRvIFB5dGhvbgotCSAqLwotCWlmIChQeUVycl9DaGVja1NpZ25hbHMoKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICh2b2lkKXBhdXNlKCk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICAvKiBtYWtlIHN1cmUgdGhhdCBhbnkgZXhjZXB0aW9ucyB0aGF0IGdvdCByYWlzZWQgYXJlIHByb3BhZ2F0ZWQKKyAgICAgKiBiYWNrIGludG8gUHl0aG9uCisgICAgICovCisgICAgaWYgKFB5RXJyX0NoZWNrU2lnbmFscygpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiBQeURvY19TVFJWQVIocGF1c2VfZG9jLAogInBhdXNlKClcblwKQEAgLTI0NSw0NCArMjQ1LDQ0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc2lnbmFsX3NpZ25hbChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKm9iajsKLQlpbnQgc2lnX251bTsKLQlQeU9iamVjdCAqb2xkX2hhbmRsZXI7Ci0Jdm9pZCAoKmZ1bmMpKGludCk7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpTzpzaWduYWwiLCAmc2lnX251bSwgJm9iaikpCi0JCXJldHVybiBOVUxMOworICAgIFB5T2JqZWN0ICpvYmo7CisgICAgaW50IHNpZ19udW07CisgICAgUHlPYmplY3QgKm9sZF9oYW5kbGVyOworICAgIHZvaWQgKCpmdW5jKShpbnQpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaU86c2lnbmFsIiwgJnNpZ19udW0sICZvYmopKQorICAgICAgICByZXR1cm4gTlVMTDsKICNpZmRlZiBXSVRIX1RIUkVBRAotCWlmIChQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCkgIT0gbWFpbl90aHJlYWQpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJInNpZ25hbCBvbmx5IHdvcmtzIGluIG1haW4gdGhyZWFkIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpICE9IG1haW5fdGhyZWFkKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInNpZ25hbCBvbmx5IHdvcmtzIGluIG1haW4gdGhyZWFkIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KICNlbmRpZgotCWlmIChzaWdfbnVtIDwgMSB8fCBzaWdfbnVtID49IE5TSUcpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJInNpZ25hbCBudW1iZXIgb3V0IG9mIHJhbmdlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAob2JqID09IElnbm9yZUhhbmRsZXIpCi0JCWZ1bmMgPSBTSUdfSUdOOwotCWVsc2UgaWYgKG9iaiA9PSBEZWZhdWx0SGFuZGxlcikKLQkJZnVuYyA9IFNJR19ERkw7Ci0JZWxzZSBpZiAoIVB5Q2FsbGFibGVfQ2hlY2sob2JqKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgIGlmIChzaWdfbnVtIDwgMSB8fCBzaWdfbnVtID49IE5TSUcpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAic2lnbmFsIG51bWJlciBvdXQgb2YgcmFuZ2UiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChvYmogPT0gSWdub3JlSGFuZGxlcikKKyAgICAgICAgZnVuYyA9IFNJR19JR047CisgICAgZWxzZSBpZiAob2JqID09IERlZmF1bHRIYW5kbGVyKQorICAgICAgICBmdW5jID0gU0lHX0RGTDsKKyAgICBlbHNlIGlmICghUHlDYWxsYWJsZV9DaGVjayhvYmopKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCiAic2lnbmFsIGhhbmRsZXIgbXVzdCBiZSBzaWduYWwuU0lHX0lHTiwgc2lnbmFsLlNJR19ERkwsIG9yIGEgY2FsbGFibGUgb2JqZWN0Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQllbHNlCi0JCWZ1bmMgPSBzaWduYWxfaGFuZGxlcjsKLQlpZiAoUHlPU19zZXRzaWcoc2lnX251bSwgZnVuYykgPT0gU0lHX0VSUikgewotCQlQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfUnVudGltZUVycm9yKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCW9sZF9oYW5kbGVyID0gSGFuZGxlcnNbc2lnX251bV0uZnVuYzsKLQlIYW5kbGVyc1tzaWdfbnVtXS50cmlwcGVkID0gMDsKLQlQeV9JTkNSRUYob2JqKTsKLQlIYW5kbGVyc1tzaWdfbnVtXS5mdW5jID0gb2JqOwotCXJldHVybiBvbGRfaGFuZGxlcjsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBmdW5jID0gc2lnbmFsX2hhbmRsZXI7CisgICAgaWYgKFB5T1Nfc2V0c2lnKHNpZ19udW0sIGZ1bmMpID09IFNJR19FUlIpIHsKKyAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX1J1bnRpbWVFcnJvcik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBvbGRfaGFuZGxlciA9IEhhbmRsZXJzW3NpZ19udW1dLmZ1bmM7CisgICAgSGFuZGxlcnNbc2lnX251bV0udHJpcHBlZCA9IDA7CisgICAgUHlfSU5DUkVGKG9iaik7CisgICAgSGFuZGxlcnNbc2lnX251bV0uZnVuYyA9IG9iajsKKyAgICByZXR1cm4gb2xkX2hhbmRsZXI7CiB9CiAKIFB5RG9jX1NUUlZBUihzaWduYWxfZG9jLApAQCAtMzAwLDE4ICszMDAsMTggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzaWduYWxfZ2V0c2lnbmFsKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgc2lnX251bTsKLQlQeU9iamVjdCAqb2xkX2hhbmRsZXI7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOmdldHNpZ25hbCIsICZzaWdfbnVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKHNpZ19udW0gPCAxIHx8IHNpZ19udW0gPj0gTlNJRykgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkic2lnbmFsIG51bWJlciBvdXQgb2YgcmFuZ2UiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCW9sZF9oYW5kbGVyID0gSGFuZGxlcnNbc2lnX251bV0uZnVuYzsKLQlQeV9JTkNSRUYob2xkX2hhbmRsZXIpOwotCXJldHVybiBvbGRfaGFuZGxlcjsKKyAgICBpbnQgc2lnX251bTsKKyAgICBQeU9iamVjdCAqb2xkX2hhbmRsZXI7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOmdldHNpZ25hbCIsICZzaWdfbnVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKHNpZ19udW0gPCAxIHx8IHNpZ19udW0gPj0gTlNJRykgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJzaWduYWwgbnVtYmVyIG91dCBvZiByYW5nZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgb2xkX2hhbmRsZXIgPSBIYW5kbGVyc1tzaWdfbnVtXS5mdW5jOworICAgIFB5X0lOQ1JFRihvbGRfaGFuZGxlcik7CisgICAgcmV0dXJuIG9sZF9oYW5kbGVyOwogfQogCiBQeURvY19TVFJWQVIoZ2V0c2lnbmFsX2RvYywKQEAgLTMzMywyMyArMzMzLDIzIEBACiBzdGF0aWMgUHlPYmplY3QgKgogc2lnbmFsX3NpZ2ludGVycnVwdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IHNpZ19udW07Ci0JaW50IGZsYWc7CisgICAgaW50IHNpZ19udW07CisgICAgaW50IGZsYWc7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpOnNpZ2ludGVycnVwdCIsICZzaWdfbnVtLCAmZmxhZykpCi0JCXJldHVybiBOVUxMOwotCWlmIChzaWdfbnVtIDwgMSB8fCBzaWdfbnVtID49IE5TSUcpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJInNpZ25hbCBudW1iZXIgb3V0IG9mIHJhbmdlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoc2lnaW50ZXJydXB0KHNpZ19udW0sIGZsYWcpPDApIHsKLQkJUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX1J1bnRpbWVFcnJvcik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpOnNpZ2ludGVycnVwdCIsICZzaWdfbnVtLCAmZmxhZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChzaWdfbnVtIDwgMSB8fCBzaWdfbnVtID49IE5TSUcpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAic2lnbmFsIG51bWJlciBvdXQgb2YgcmFuZ2UiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChzaWdpbnRlcnJ1cHQoc2lnX251bSwgZmxhZyk8MCkgeworICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfUnVudGltZUVycm9yKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogI2VuZGlmCkBAIC0zNTcsMjQgKzM1NywyNCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNpZ25hbF9zZXRfd2FrZXVwX2ZkKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzdHJ1Y3Qgc3RhdCBidWY7Ci0JaW50IGZkLCBvbGRfZmQ7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOnNldF93YWtldXBfZmQiLCAmZmQpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBzdHJ1Y3Qgc3RhdCBidWY7CisgICAgaW50IGZkLCBvbGRfZmQ7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOnNldF93YWtldXBfZmQiLCAmZmQpKQorICAgICAgICByZXR1cm4gTlVMTDsKICNpZmRlZiBXSVRIX1RIUkVBRAotCWlmIChQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCkgIT0gbWFpbl90aHJlYWQpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJInNldF93YWtldXBfZmQgb25seSB3b3JrcyBpbiBtYWluIHRocmVhZCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSAhPSBtYWluX3RocmVhZCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJzZXRfd2FrZXVwX2ZkIG9ubHkgd29ya3MgaW4gbWFpbiB0aHJlYWQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogI2VuZGlmCi0JaWYgKGZkICE9IC0xICYmIGZzdGF0KGZkLCAmYnVmKSAhPSAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiaW52YWxpZCBmZCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0Jb2xkX2ZkID0gd2FrZXVwX2ZkOwotCXdha2V1cF9mZCA9IGZkOwotCXJldHVybiBQeUxvbmdfRnJvbUxvbmcob2xkX2ZkKTsKKyAgICBpZiAoZmQgIT0gLTEgJiYgZnN0YXQoZmQsICZidWYpICE9IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJpbnZhbGlkIGZkIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBvbGRfZmQgPSB3YWtldXBfZmQ7CisgICAgd2FrZXVwX2ZkID0gZmQ7CisgICAgcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZyhvbGRfZmQpOwogfQogCiBQeURvY19TVFJWQVIoc2V0X3dha2V1cF9mZF9kb2MsCkBAIC0zOTAsMTEgKzM5MCwxMSBAQAogaW50CiBQeVNpZ25hbF9TZXRXYWtldXBGZChpbnQgZmQpCiB7Ci0JaW50IG9sZF9mZCA9IHdha2V1cF9mZDsKLQlpZiAoZmQgPCAwKQotCQlmZCA9IC0xOwotCXdha2V1cF9mZCA9IGZkOwotCXJldHVybiBvbGRfZmQ7CisgICAgaW50IG9sZF9mZCA9IHdha2V1cF9mZDsKKyAgICBpZiAoZmQgPCAwKQorICAgICAgICBmZCA9IC0xOworICAgIHdha2V1cF9mZCA9IGZkOworICAgIHJldHVybiBvbGRfZmQ7CiB9CiAKIApAQCAtNDA4LDE0ICs0MDgsMTQgQEAKICAgICBzdHJ1Y3QgaXRpbWVydmFsIG5ldywgb2xkOwogCiAgICAgaWYoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlkfGQ6c2V0aXRpbWVyIiwgJndoaWNoLCAmZmlyc3QsICZpbnRlcnZhbCkpCi0gICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBOVUxMOwogCiAgICAgdGltZXZhbF9mcm9tX2RvdWJsZShmaXJzdCwgJm5ldy5pdF92YWx1ZSk7CiAgICAgdGltZXZhbF9mcm9tX2RvdWJsZShpbnRlcnZhbCwgJm5ldy5pdF9pbnRlcnZhbCk7CiAgICAgLyogTGV0IE9TIGNoZWNrICJ3aGljaCIgdmFsdWUgKi8KICAgICBpZiAoc2V0aXRpbWVyKHdoaWNoLCAmbmV3LCAmb2xkKSAhPSAwKSB7Ci0gICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhJdGltZXJFcnJvcik7Ci0gICAgICAgIHJldHVybiBOVUxMOworICAgIFB5RXJyX1NldEZyb21FcnJubyhJdGltZXJFcnJvcik7CisgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCiAgICAgcmV0dXJuIGl0aW1lcl9yZXR2YWwoJm9sZCk7CkBAIC00NDEsMTEgKzQ0MSwxMSBAQAogICAgIHN0cnVjdCBpdGltZXJ2YWwgb2xkOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOmdldGl0aW1lciIsICZ3aGljaCkpCi0gICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBOVUxMOwogCiAgICAgaWYgKGdldGl0aW1lcih3aGljaCwgJm9sZCkgIT0gMCkgewotICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oSXRpbWVyRXJyb3IpOwotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQeUVycl9TZXRGcm9tRXJybm8oSXRpbWVyRXJyb3IpOworICAgIHJldHVybiBOVUxMOwogICAgIH0KIAogICAgIHJldHVybiBpdGltZXJfcmV0dmFsKCZvbGQpOwpAQCAtNDYxLDI3ICs0NjEsMjcgQEAKIC8qIExpc3Qgb2YgZnVuY3Rpb25zIGRlZmluZWQgaW4gdGhlIG1vZHVsZSAqLwogc3RhdGljIFB5TWV0aG9kRGVmIHNpZ25hbF9tZXRob2RzW10gPSB7CiAjaWZkZWYgSEFWRV9BTEFSTQotCXsiYWxhcm0iLAkgICAgICAgIHNpZ25hbF9hbGFybSwgTUVUSF9WQVJBUkdTLCBhbGFybV9kb2N9LAorICAgIHsiYWxhcm0iLCAgICAgICAgICAgICAgICAgICBzaWduYWxfYWxhcm0sIE1FVEhfVkFSQVJHUywgYWxhcm1fZG9jfSwKICNlbmRpZgogI2lmZGVmIEhBVkVfU0VUSVRJTUVSCiAgICAgeyJzZXRpdGltZXIiLCAgICAgICBzaWduYWxfc2V0aXRpbWVyLCBNRVRIX1ZBUkFSR1MsIHNldGl0aW1lcl9kb2N9LAogI2VuZGlmCiAjaWZkZWYgSEFWRV9HRVRJVElNRVIKLQl7ImdldGl0aW1lciIsICAgICAgIHNpZ25hbF9nZXRpdGltZXIsIE1FVEhfVkFSQVJHUywgZ2V0aXRpbWVyX2RvY30sCisgICAgeyJnZXRpdGltZXIiLCAgICAgICBzaWduYWxfZ2V0aXRpbWVyLCBNRVRIX1ZBUkFSR1MsIGdldGl0aW1lcl9kb2N9LAogI2VuZGlmCi0JeyJzaWduYWwiLAkgICAgICAgIHNpZ25hbF9zaWduYWwsIE1FVEhfVkFSQVJHUywgc2lnbmFsX2RvY30sCi0JeyJnZXRzaWduYWwiLAkgICAgICAgIHNpZ25hbF9nZXRzaWduYWwsIE1FVEhfVkFSQVJHUywgZ2V0c2lnbmFsX2RvY30sCi0JeyJzZXRfd2FrZXVwX2ZkIiwJc2lnbmFsX3NldF93YWtldXBfZmQsIE1FVEhfVkFSQVJHUywgc2V0X3dha2V1cF9mZF9kb2N9LAorICAgIHsic2lnbmFsIiwgICAgICAgICAgICAgICAgICBzaWduYWxfc2lnbmFsLCBNRVRIX1ZBUkFSR1MsIHNpZ25hbF9kb2N9LAorICAgIHsiZ2V0c2lnbmFsIiwgICAgICAgICAgICAgICBzaWduYWxfZ2V0c2lnbmFsLCBNRVRIX1ZBUkFSR1MsIGdldHNpZ25hbF9kb2N9LAorICAgIHsic2V0X3dha2V1cF9mZCIsICAgICAgICAgICBzaWduYWxfc2V0X3dha2V1cF9mZCwgTUVUSF9WQVJBUkdTLCBzZXRfd2FrZXVwX2ZkX2RvY30sCiAjaWZkZWYgSEFWRV9TSUdJTlRFUlJVUFQKLSAJeyJzaWdpbnRlcnJ1cHQiLAlzaWduYWxfc2lnaW50ZXJydXB0LCBNRVRIX1ZBUkFSR1MsIHNpZ2ludGVycnVwdF9kb2N9LAorICAgIHsic2lnaW50ZXJydXB0IiwgICAgICAgICAgICBzaWduYWxfc2lnaW50ZXJydXB0LCBNRVRIX1ZBUkFSR1MsIHNpZ2ludGVycnVwdF9kb2N9LAogI2VuZGlmCiAjaWZkZWYgSEFWRV9QQVVTRQotCXsicGF1c2UiLAkgICAgICAgIChQeUNGdW5jdGlvbilzaWduYWxfcGF1c2UsCi0JIE1FVEhfTk9BUkdTLHBhdXNlX2RvY30sCisgICAgeyJwYXVzZSIsICAgICAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilzaWduYWxfcGF1c2UsCisgICAgIE1FVEhfTk9BUkdTLHBhdXNlX2RvY30sCiAjZW5kaWYKLQl7ImRlZmF1bHRfaW50X2hhbmRsZXIiLCBzaWduYWxfZGVmYXVsdF9pbnRfaGFuZGxlciwKLQkgTUVUSF9WQVJBUkdTLCBkZWZhdWx0X2ludF9oYW5kbGVyX2RvY30sCi0Je05VTEwsCQkJTlVMTH0JCS8qIHNlbnRpbmVsICovCisgICAgeyJkZWZhdWx0X2ludF9oYW5kbGVyIiwgc2lnbmFsX2RlZmF1bHRfaW50X2hhbmRsZXIsCisgICAgIE1FVEhfVkFSQVJHUywgZGVmYXVsdF9pbnRfaGFuZGxlcl9kb2N9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIApAQCAtNTI0LDI1MCArNTI0LDI1MCBAQAogUHlNT0RJTklUX0ZVTkMKIGluaXRzaWduYWwodm9pZCkKIHsKLQlQeU9iamVjdCAqbSwgKmQsICp4OwotCWludCBpOworICAgIFB5T2JqZWN0ICptLCAqZCwgKng7CisgICAgaW50IGk7CiAKICNpZmRlZiBXSVRIX1RIUkVBRAotCW1haW5fdGhyZWFkID0gUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpOwotCW1haW5fcGlkID0gZ2V0cGlkKCk7CisgICAgbWFpbl90aHJlYWQgPSBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCk7CisgICAgbWFpbl9waWQgPSBnZXRwaWQoKTsKICNlbmRpZgogCi0JLyogQ3JlYXRlIHRoZSBtb2R1bGUgYW5kIGFkZCB0aGUgZnVuY3Rpb25zICovCi0JbSA9IFB5X0luaXRNb2R1bGUzKCJzaWduYWwiLCBzaWduYWxfbWV0aG9kcywgbW9kdWxlX2RvYyk7Ci0JaWYgKG0gPT0gTlVMTCkKLQkJcmV0dXJuOworICAgIC8qIENyZWF0ZSB0aGUgbW9kdWxlIGFuZCBhZGQgdGhlIGZ1bmN0aW9ucyAqLworICAgIG0gPSBQeV9Jbml0TW9kdWxlMygic2lnbmFsIiwgc2lnbmFsX21ldGhvZHMsIG1vZHVsZV9kb2MpOworICAgIGlmIChtID09IE5VTEwpCisgICAgICAgIHJldHVybjsKIAotCS8qIEFkZCBzb21lIHN5bWJvbGljIGNvbnN0YW50cyB0byB0aGUgbW9kdWxlICovCi0JZCA9IFB5TW9kdWxlX0dldERpY3QobSk7CisgICAgLyogQWRkIHNvbWUgc3ltYm9saWMgY29uc3RhbnRzIHRvIHRoZSBtb2R1bGUgKi8KKyAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKIAotCXggPSBEZWZhdWx0SGFuZGxlciA9IFB5TG9uZ19Gcm9tVm9pZFB0cigodm9pZCAqKVNJR19ERkwpOwotICAgICAgICBpZiAoIXggfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR19ERkwiLCB4KSA8IDApCi0gICAgICAgICAgICAgICAgZ290byBmaW5hbGx5OworICAgIHggPSBEZWZhdWx0SGFuZGxlciA9IFB5TG9uZ19Gcm9tVm9pZFB0cigodm9pZCAqKVNJR19ERkwpOworICAgIGlmICgheCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHX0RGTCIsIHgpIDwgMCkKKyAgICAgICAgZ290byBmaW5hbGx5OwogCi0JeCA9IElnbm9yZUhhbmRsZXIgPSBQeUxvbmdfRnJvbVZvaWRQdHIoKHZvaWQgKilTSUdfSUdOKTsKLSAgICAgICAgaWYgKCF4IHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdfSUdOIiwgeCkgPCAwKQotICAgICAgICAgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICB4ID0gSWdub3JlSGFuZGxlciA9IFB5TG9uZ19Gcm9tVm9pZFB0cigodm9pZCAqKVNJR19JR04pOworICAgIGlmICgheCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHX0lHTiIsIHgpIDwgMCkKKyAgICAgICAgZ290byBmaW5hbGx5OwogCi0gICAgICAgIHggPSBQeUludF9Gcm9tTG9uZygobG9uZylOU0lHKTsKLSAgICAgICAgaWYgKCF4IHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJOU0lHIiwgeCkgPCAwKQotICAgICAgICAgICAgICAgIGdvdG8gZmluYWxseTsKLSAgICAgICAgUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZygobG9uZylOU0lHKTsKKyAgICBpZiAoIXggfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk5TSUciLCB4KSA8IDApCisgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICBQeV9ERUNSRUYoeCk7CiAKLQl4ID0gSW50SGFuZGxlciA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKGQsICJkZWZhdWx0X2ludF9oYW5kbGVyIik7Ci0gICAgICAgIGlmICgheCkKLSAgICAgICAgICAgICAgICBnb3RvIGZpbmFsbHk7Ci0JUHlfSU5DUkVGKEludEhhbmRsZXIpOworICAgIHggPSBJbnRIYW5kbGVyID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoZCwgImRlZmF1bHRfaW50X2hhbmRsZXIiKTsKKyAgICBpZiAoIXgpCisgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICBQeV9JTkNSRUYoSW50SGFuZGxlcik7CiAKLQlIYW5kbGVyc1swXS50cmlwcGVkID0gMDsKLQlmb3IgKGkgPSAxOyBpIDwgTlNJRzsgaSsrKSB7Ci0JCXZvaWQgKCp0KShpbnQpOwotCQl0ID0gUHlPU19nZXRzaWcoaSk7Ci0JCUhhbmRsZXJzW2ldLnRyaXBwZWQgPSAwOwotCQlpZiAodCA9PSBTSUdfREZMKQotCQkJSGFuZGxlcnNbaV0uZnVuYyA9IERlZmF1bHRIYW5kbGVyOwotCQllbHNlIGlmICh0ID09IFNJR19JR04pCi0JCQlIYW5kbGVyc1tpXS5mdW5jID0gSWdub3JlSGFuZGxlcjsKLQkJZWxzZQotCQkJSGFuZGxlcnNbaV0uZnVuYyA9IFB5X05vbmU7IC8qIE5vbmUgb2Ygb3VyIGJ1c2luZXNzICovCi0JCVB5X0lOQ1JFRihIYW5kbGVyc1tpXS5mdW5jKTsKLQl9Ci0JaWYgKEhhbmRsZXJzW1NJR0lOVF0uZnVuYyA9PSBEZWZhdWx0SGFuZGxlcikgewotCQkvKiBJbnN0YWxsIGRlZmF1bHQgaW50IGhhbmRsZXIgKi8KLQkJUHlfSU5DUkVGKEludEhhbmRsZXIpOwotCQlQeV9ERUNSRUYoSGFuZGxlcnNbU0lHSU5UXS5mdW5jKTsKLQkJSGFuZGxlcnNbU0lHSU5UXS5mdW5jID0gSW50SGFuZGxlcjsKLQkJb2xkX3NpZ2ludGhhbmRsZXIgPSBQeU9TX3NldHNpZyhTSUdJTlQsIHNpZ25hbF9oYW5kbGVyKTsKLQl9CisgICAgSGFuZGxlcnNbMF0udHJpcHBlZCA9IDA7CisgICAgZm9yIChpID0gMTsgaSA8IE5TSUc7IGkrKykgeworICAgICAgICB2b2lkICgqdCkoaW50KTsKKyAgICAgICAgdCA9IFB5T1NfZ2V0c2lnKGkpOworICAgICAgICBIYW5kbGVyc1tpXS50cmlwcGVkID0gMDsKKyAgICAgICAgaWYgKHQgPT0gU0lHX0RGTCkKKyAgICAgICAgICAgIEhhbmRsZXJzW2ldLmZ1bmMgPSBEZWZhdWx0SGFuZGxlcjsKKyAgICAgICAgZWxzZSBpZiAodCA9PSBTSUdfSUdOKQorICAgICAgICAgICAgSGFuZGxlcnNbaV0uZnVuYyA9IElnbm9yZUhhbmRsZXI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIEhhbmRsZXJzW2ldLmZ1bmMgPSBQeV9Ob25lOyAvKiBOb25lIG9mIG91ciBidXNpbmVzcyAqLworICAgICAgICBQeV9JTkNSRUYoSGFuZGxlcnNbaV0uZnVuYyk7CisgICAgfQorICAgIGlmIChIYW5kbGVyc1tTSUdJTlRdLmZ1bmMgPT0gRGVmYXVsdEhhbmRsZXIpIHsKKyAgICAgICAgLyogSW5zdGFsbCBkZWZhdWx0IGludCBoYW5kbGVyICovCisgICAgICAgIFB5X0lOQ1JFRihJbnRIYW5kbGVyKTsKKyAgICAgICAgUHlfREVDUkVGKEhhbmRsZXJzW1NJR0lOVF0uZnVuYyk7CisgICAgICAgIEhhbmRsZXJzW1NJR0lOVF0uZnVuYyA9IEludEhhbmRsZXI7CisgICAgICAgIG9sZF9zaWdpbnRoYW5kbGVyID0gUHlPU19zZXRzaWcoU0lHSU5ULCBzaWduYWxfaGFuZGxlcik7CisgICAgfQogCiAjaWZkZWYgU0lHSFVQCi0JeCA9IFB5SW50X0Zyb21Mb25nKFNJR0hVUCk7Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR0hVUCIsIHgpOwotICAgICAgICBQeV9YREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhTSUdIVVApOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdIVVAiLCB4KTsKKyAgICBQeV9YREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgU0lHSU5UCi0JeCA9IFB5SW50X0Zyb21Mb25nKFNJR0lOVCk7Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR0lOVCIsIHgpOwotICAgICAgICBQeV9YREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhTSUdJTlQpOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdJTlQiLCB4KTsKKyAgICBQeV9YREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgU0lHQlJFQUsKLQl4ID0gUHlJbnRfRnJvbUxvbmcoU0lHQlJFQUspOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdCUkVBSyIsIHgpOwotICAgICAgICBQeV9YREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhTSUdCUkVBSyk7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR0JSRUFLIiwgeCk7CisgICAgUHlfWERFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIFNJR1FVSVQKLQl4ID0gUHlJbnRfRnJvbUxvbmcoU0lHUVVJVCk7Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR1FVSVQiLCB4KTsKLSAgICAgICAgUHlfWERFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoU0lHUVVJVCk7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR1FVSVQiLCB4KTsKKyAgICBQeV9YREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgU0lHSUxMCi0JeCA9IFB5SW50X0Zyb21Mb25nKFNJR0lMTCk7Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR0lMTCIsIHgpOwotICAgICAgICBQeV9YREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhTSUdJTEwpOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdJTEwiLCB4KTsKKyAgICBQeV9YREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgU0lHVFJBUAotCXggPSBQeUludF9Gcm9tTG9uZyhTSUdUUkFQKTsKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHVFJBUCIsIHgpOwotICAgICAgICBQeV9YREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhTSUdUUkFQKTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHVFJBUCIsIHgpOworICAgIFB5X1hERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBTSUdJT1QKLQl4ID0gUHlJbnRfRnJvbUxvbmcoU0lHSU9UKTsKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHSU9UIiwgeCk7Ci0gICAgICAgIFB5X1hERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKFNJR0lPVCk7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR0lPVCIsIHgpOworICAgIFB5X1hERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBTSUdBQlJUCi0JeCA9IFB5SW50X0Zyb21Mb25nKFNJR0FCUlQpOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdBQlJUIiwgeCk7Ci0gICAgICAgIFB5X1hERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKFNJR0FCUlQpOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdBQlJUIiwgeCk7CisgICAgUHlfWERFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIFNJR0VNVAotCXggPSBQeUludF9Gcm9tTG9uZyhTSUdFTVQpOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdFTVQiLCB4KTsKLSAgICAgICAgUHlfWERFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoU0lHRU1UKTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHRU1UIiwgeCk7CisgICAgUHlfWERFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIFNJR0ZQRQotCXggPSBQeUludF9Gcm9tTG9uZyhTSUdGUEUpOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdGUEUiLCB4KTsKLSAgICAgICAgUHlfWERFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoU0lHRlBFKTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHRlBFIiwgeCk7CisgICAgUHlfWERFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIFNJR0tJTEwKLQl4ID0gUHlJbnRfRnJvbUxvbmcoU0lHS0lMTCk7Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR0tJTEwiLCB4KTsKLSAgICAgICAgUHlfWERFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoU0lHS0lMTCk7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR0tJTEwiLCB4KTsKKyAgICBQeV9YREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgU0lHQlVTCi0JeCA9IFB5SW50X0Zyb21Mb25nKFNJR0JVUyk7Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR0JVUyIsIHgpOwotICAgICAgICBQeV9YREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhTSUdCVVMpOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdCVVMiLCB4KTsKKyAgICBQeV9YREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgU0lHU0VHVgotCXggPSBQeUludF9Gcm9tTG9uZyhTSUdTRUdWKTsKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHU0VHViIsIHgpOwotICAgICAgICBQeV9YREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhTSUdTRUdWKTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHU0VHViIsIHgpOworICAgIFB5X1hERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBTSUdTWVMKLQl4ID0gUHlJbnRfRnJvbUxvbmcoU0lHU1lTKTsKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHU1lTIiwgeCk7Ci0gICAgICAgIFB5X1hERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKFNJR1NZUyk7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR1NZUyIsIHgpOworICAgIFB5X1hERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBTSUdQSVBFCi0JeCA9IFB5SW50X0Zyb21Mb25nKFNJR1BJUEUpOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdQSVBFIiwgeCk7Ci0gICAgICAgIFB5X1hERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKFNJR1BJUEUpOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdQSVBFIiwgeCk7CisgICAgUHlfWERFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIFNJR0FMUk0KLQl4ID0gUHlJbnRfRnJvbUxvbmcoU0lHQUxSTSk7Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR0FMUk0iLCB4KTsKLSAgICAgICAgUHlfWERFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoU0lHQUxSTSk7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR0FMUk0iLCB4KTsKKyAgICBQeV9YREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgU0lHVEVSTQotCXggPSBQeUludF9Gcm9tTG9uZyhTSUdURVJNKTsKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHVEVSTSIsIHgpOwotICAgICAgICBQeV9YREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhTSUdURVJNKTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHVEVSTSIsIHgpOworICAgIFB5X1hERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBTSUdVU1IxCi0JeCA9IFB5SW50X0Zyb21Mb25nKFNJR1VTUjEpOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdVU1IxIiwgeCk7Ci0gICAgICAgIFB5X1hERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKFNJR1VTUjEpOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdVU1IxIiwgeCk7CisgICAgUHlfWERFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIFNJR1VTUjIKLQl4ID0gUHlJbnRfRnJvbUxvbmcoU0lHVVNSMik7Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR1VTUjIiLCB4KTsKLSAgICAgICAgUHlfWERFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoU0lHVVNSMik7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR1VTUjIiLCB4KTsKKyAgICBQeV9YREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgU0lHQ0xECi0JeCA9IFB5SW50X0Zyb21Mb25nKFNJR0NMRCk7Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR0NMRCIsIHgpOwotICAgICAgICBQeV9YREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhTSUdDTEQpOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdDTEQiLCB4KTsKKyAgICBQeV9YREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgU0lHQ0hMRAotCXggPSBQeUludF9Gcm9tTG9uZyhTSUdDSExEKTsKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHQ0hMRCIsIHgpOwotICAgICAgICBQeV9YREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhTSUdDSExEKTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHQ0hMRCIsIHgpOworICAgIFB5X1hERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBTSUdQV1IKLQl4ID0gUHlJbnRfRnJvbUxvbmcoU0lHUFdSKTsKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHUFdSIiwgeCk7Ci0gICAgICAgIFB5X1hERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKFNJR1BXUik7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR1BXUiIsIHgpOworICAgIFB5X1hERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBTSUdJTwotCXggPSBQeUludF9Gcm9tTG9uZyhTSUdJTyk7Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR0lPIiwgeCk7Ci0gICAgICAgIFB5X1hERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKFNJR0lPKTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHSU8iLCB4KTsKKyAgICBQeV9YREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgU0lHVVJHCi0JeCA9IFB5SW50X0Zyb21Mb25nKFNJR1VSRyk7Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR1VSRyIsIHgpOwotICAgICAgICBQeV9YREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhTSUdVUkcpOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdVUkciLCB4KTsKKyAgICBQeV9YREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgU0lHV0lOQ0gKLQl4ID0gUHlJbnRfRnJvbUxvbmcoU0lHV0lOQ0gpOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdXSU5DSCIsIHgpOwotICAgICAgICBQeV9YREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhTSUdXSU5DSCk7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR1dJTkNIIiwgeCk7CisgICAgUHlfWERFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIFNJR1BPTEwKLQl4ID0gUHlJbnRfRnJvbUxvbmcoU0lHUE9MTCk7Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR1BPTEwiLCB4KTsKLSAgICAgICAgUHlfWERFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoU0lHUE9MTCk7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR1BPTEwiLCB4KTsKKyAgICBQeV9YREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgU0lHU1RPUAotCXggPSBQeUludF9Gcm9tTG9uZyhTSUdTVE9QKTsKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHU1RPUCIsIHgpOwotICAgICAgICBQeV9YREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhTSUdTVE9QKTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHU1RPUCIsIHgpOworICAgIFB5X1hERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBTSUdUU1RQCi0JeCA9IFB5SW50X0Zyb21Mb25nKFNJR1RTVFApOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdUU1RQIiwgeCk7Ci0gICAgICAgIFB5X1hERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKFNJR1RTVFApOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdUU1RQIiwgeCk7CisgICAgUHlfWERFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIFNJR0NPTlQKLQl4ID0gUHlJbnRfRnJvbUxvbmcoU0lHQ09OVCk7Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR0NPTlQiLCB4KTsKLSAgICAgICAgUHlfWERFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoU0lHQ09OVCk7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR0NPTlQiLCB4KTsKKyAgICBQeV9YREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgU0lHVFRJTgotCXggPSBQeUludF9Gcm9tTG9uZyhTSUdUVElOKTsKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHVFRJTiIsIHgpOwotICAgICAgICBQeV9YREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhTSUdUVElOKTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHVFRJTiIsIHgpOworICAgIFB5X1hERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBTSUdUVE9VCi0JeCA9IFB5SW50X0Zyb21Mb25nKFNJR1RUT1UpOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdUVE9VIiwgeCk7Ci0gICAgICAgIFB5X1hERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKFNJR1RUT1UpOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdUVE9VIiwgeCk7CisgICAgUHlfWERFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIFNJR1ZUQUxSTQotCXggPSBQeUludF9Gcm9tTG9uZyhTSUdWVEFMUk0pOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdWVEFMUk0iLCB4KTsKLSAgICAgICAgUHlfWERFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoU0lHVlRBTFJNKTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHVlRBTFJNIiwgeCk7CisgICAgUHlfWERFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIFNJR1BST0YKLQl4ID0gUHlJbnRfRnJvbUxvbmcoU0lHUFJPRik7Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR1BST0YiLCB4KTsKLSAgICAgICAgUHlfWERFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoU0lHUFJPRik7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR1BST0YiLCB4KTsKKyAgICBQeV9YREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgU0lHWENQVQotCXggPSBQeUludF9Gcm9tTG9uZyhTSUdYQ1BVKTsKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHWENQVSIsIHgpOwotICAgICAgICBQeV9YREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhTSUdYQ1BVKTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHWENQVSIsIHgpOworICAgIFB5X1hERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBTSUdYRlNaCi0JeCA9IFB5SW50X0Zyb21Mb25nKFNJR1hGU1opOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdYRlNaIiwgeCk7Ci0gICAgICAgIFB5X1hERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKFNJR1hGU1opOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdYRlNaIiwgeCk7CisgICAgUHlfWERFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIFNJR1JUTUlOCi0gICAgICAgIHggPSBQeUludF9Gcm9tTG9uZyhTSUdSVE1JTik7Ci0gICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdSVE1JTiIsIHgpOwotICAgICAgICBQeV9YREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhTSUdSVE1JTik7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR1JUTUlOIiwgeCk7CisgICAgUHlfWERFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIFNJR1JUTUFYCi0gICAgICAgIHggPSBQeUludF9Gcm9tTG9uZyhTSUdSVE1BWCk7Ci0gICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdSVE1BWCIsIHgpOwotICAgICAgICBQeV9YREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhTSUdSVE1BWCk7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR1JUTUFYIiwgeCk7CisgICAgUHlfWERFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIFNJR0lORk8KLQl4ID0gUHlJbnRfRnJvbUxvbmcoU0lHSU5GTyk7Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR0lORk8iLCB4KTsKLSAgICAgICAgUHlfWERFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoU0lHSU5GTyk7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR0lORk8iLCB4KTsKKyAgICBQeV9YREVDUkVGKHgpOwogI2VuZGlmCiAKICNpZmRlZiBJVElNRVJfUkVBTApAQCAtNzg3LDQ1ICs3ODcsNDUgQEAKICNlbmRpZgogCiAjaWYgZGVmaW5lZCAoSEFWRV9TRVRJVElNRVIpIHx8IGRlZmluZWQgKEhBVkVfR0VUSVRJTUVSKQotICAgIEl0aW1lckVycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJzaWduYWwuSXRpbWVyRXJyb3IiLCAKLSAgICAgICAgIFB5RXhjX0lPRXJyb3IsIE5VTEwpOworICAgIEl0aW1lckVycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJzaWduYWwuSXRpbWVyRXJyb3IiLAorICAgICBQeUV4Y19JT0Vycm9yLCBOVUxMKTsKICAgICBpZiAoSXRpbWVyRXJyb3IgIT0gTlVMTCkKLSAgICAJUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkl0aW1lckVycm9yIiwgSXRpbWVyRXJyb3IpOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJJdGltZXJFcnJvciIsIEl0aW1lckVycm9yKTsKICNlbmRpZgogCi0gICAgICAgIGlmICghUHlFcnJfT2NjdXJyZWQoKSkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0KLQkvKiBDaGVjayBmb3IgZXJyb3JzICovCi0gIGZpbmFsbHk6CisgICAgaWYgKCFQeUVycl9PY2N1cnJlZCgpKQogICAgICAgICByZXR1cm47CisKKyAgICAvKiBDaGVjayBmb3IgZXJyb3JzICovCisgIGZpbmFsbHk6CisgICAgcmV0dXJuOwogfQogCiBzdGF0aWMgdm9pZAogZmluaXNpZ25hbCh2b2lkKQogewotCWludCBpOwotCVB5T2JqZWN0ICpmdW5jOworICAgIGludCBpOworICAgIFB5T2JqZWN0ICpmdW5jOwogCi0JUHlPU19zZXRzaWcoU0lHSU5ULCBvbGRfc2lnaW50aGFuZGxlcik7Ci0Jb2xkX3NpZ2ludGhhbmRsZXIgPSBTSUdfREZMOworICAgIFB5T1Nfc2V0c2lnKFNJR0lOVCwgb2xkX3NpZ2ludGhhbmRsZXIpOworICAgIG9sZF9zaWdpbnRoYW5kbGVyID0gU0lHX0RGTDsKIAotCWZvciAoaSA9IDE7IGkgPCBOU0lHOyBpKyspIHsKLQkJZnVuYyA9IEhhbmRsZXJzW2ldLmZ1bmM7Ci0JCUhhbmRsZXJzW2ldLnRyaXBwZWQgPSAwOwotCQlIYW5kbGVyc1tpXS5mdW5jID0gTlVMTDsKLQkJaWYgKGkgIT0gU0lHSU5UICYmIGZ1bmMgIT0gTlVMTCAmJiBmdW5jICE9IFB5X05vbmUgJiYKLQkJICAgIGZ1bmMgIT0gRGVmYXVsdEhhbmRsZXIgJiYgZnVuYyAhPSBJZ25vcmVIYW5kbGVyKQotCQkJUHlPU19zZXRzaWcoaSwgU0lHX0RGTCk7Ci0JCVB5X1hERUNSRUYoZnVuYyk7Ci0JfQorICAgIGZvciAoaSA9IDE7IGkgPCBOU0lHOyBpKyspIHsKKyAgICAgICAgZnVuYyA9IEhhbmRsZXJzW2ldLmZ1bmM7CisgICAgICAgIEhhbmRsZXJzW2ldLnRyaXBwZWQgPSAwOworICAgICAgICBIYW5kbGVyc1tpXS5mdW5jID0gTlVMTDsKKyAgICAgICAgaWYgKGkgIT0gU0lHSU5UICYmIGZ1bmMgIT0gTlVMTCAmJiBmdW5jICE9IFB5X05vbmUgJiYKKyAgICAgICAgICAgIGZ1bmMgIT0gRGVmYXVsdEhhbmRsZXIgJiYgZnVuYyAhPSBJZ25vcmVIYW5kbGVyKQorICAgICAgICAgICAgUHlPU19zZXRzaWcoaSwgU0lHX0RGTCk7CisgICAgICAgIFB5X1hERUNSRUYoZnVuYyk7CisgICAgfQogCi0JUHlfWERFQ1JFRihJbnRIYW5kbGVyKTsKLQlJbnRIYW5kbGVyID0gTlVMTDsKLQlQeV9YREVDUkVGKERlZmF1bHRIYW5kbGVyKTsKLQlEZWZhdWx0SGFuZGxlciA9IE5VTEw7Ci0JUHlfWERFQ1JFRihJZ25vcmVIYW5kbGVyKTsKLQlJZ25vcmVIYW5kbGVyID0gTlVMTDsKKyAgICBQeV9YREVDUkVGKEludEhhbmRsZXIpOworICAgIEludEhhbmRsZXIgPSBOVUxMOworICAgIFB5X1hERUNSRUYoRGVmYXVsdEhhbmRsZXIpOworICAgIERlZmF1bHRIYW5kbGVyID0gTlVMTDsKKyAgICBQeV9YREVDUkVGKElnbm9yZUhhbmRsZXIpOworICAgIElnbm9yZUhhbmRsZXIgPSBOVUxMOwogfQogCiAKQEAgLTgzMyw1NSArODMzLDU1IEBACiBpbnQKIFB5RXJyX0NoZWNrU2lnbmFscyh2b2lkKQogewotCWludCBpOwotCVB5T2JqZWN0ICpmOworICAgIGludCBpOworICAgIFB5T2JqZWN0ICpmOwogCi0JaWYgKCFpc190cmlwcGVkKQotCQlyZXR1cm4gMDsKKyAgICBpZiAoIWlzX3RyaXBwZWQpCisgICAgICAgIHJldHVybiAwOwogCiAjaWZkZWYgV0lUSF9USFJFQUQKLQlpZiAoUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpICE9IG1haW5fdGhyZWFkKQotCQlyZXR1cm4gMDsKKyAgICBpZiAoUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpICE9IG1haW5fdGhyZWFkKQorICAgICAgICByZXR1cm4gMDsKICNlbmRpZgogCi0JLyoKLQkgKiBUaGUgaXNfc3RyaXBwZWQgdmFyaWFibGUgaXMgbWVhbnQgdG8gc3BlZWQgdXAgdGhlIGNhbGxzIHRvCi0JICogUHlFcnJfQ2hlY2tTaWduYWxzIChib3RoIGRpcmVjdGx5IG9yIHZpYSBwZW5kaW5nIGNhbGxzKSB3aGVuIG5vCi0JICogc2lnbmFsIGhhcyBhcnJpdmVkLiBUaGlzIHZhcmlhYmxlIGlzIHNldCB0byAxIHdoZW4gYSBzaWduYWwgYXJyaXZlcwotCSAqIGFuZCBpdCBpcyBzZXQgdG8gMCBoZXJlLCB3aGVuIHdlIGtub3cgc29tZSBzaWduYWxzIGFycml2ZWQuIFRoaXMgd2F5Ci0JICogd2UgY2FuIHJ1biB0aGUgcmVnaXN0ZXJlZCBoYW5kbGVycyB3aXRoIG5vIHNpZ25hbHMgYmxvY2tlZC4KLQkgKgotCSAqIE5PVEU6IHdpdGggdGhpcyBhcHByb2FjaCB3ZSBjYW4gaGF2ZSBhIHNpdHVhdGlvbiB3aGVyZSBpc190cmlwcGVkIGlzCi0JICogICAgICAgMSBidXQgd2UgaGF2ZSBubyBtb3JlIHNpZ25hbHMgdG8gaGFuZGxlIChIYW5kbGVyc1tpXS50cmlwcGVkCi0JICogICAgICAgaXMgMCBmb3IgZXZlcnkgc2lnbmFsIGkpLiBUaGlzIHdvbid0IGRvIHVzIGFueSBoYXJtIChleGNlcHQKLQkgKiAgICAgICB3ZSdyZSBnb25uYSBzcGVudCBzb21lIGN5Y2xlcyBmb3Igbm90aGluZykuIFRoaXMgaGFwcGVucyB3aGVuCi0JICogICAgICAgd2UgcmVjZWl2ZSBhIHNpZ25hbCBpIGFmdGVyIHdlIHplcm8gaXNfdHJpcHBlZCBhbmQgYmVmb3JlIHdlCi0JICogICAgICAgY2hlY2sgSGFuZGxlcnNbaV0udHJpcHBlZC4KLQkgKi8KLQlpc190cmlwcGVkID0gMDsKKyAgICAvKgorICAgICAqIFRoZSBpc19zdHJpcHBlZCB2YXJpYWJsZSBpcyBtZWFudCB0byBzcGVlZCB1cCB0aGUgY2FsbHMgdG8KKyAgICAgKiBQeUVycl9DaGVja1NpZ25hbHMgKGJvdGggZGlyZWN0bHkgb3IgdmlhIHBlbmRpbmcgY2FsbHMpIHdoZW4gbm8KKyAgICAgKiBzaWduYWwgaGFzIGFycml2ZWQuIFRoaXMgdmFyaWFibGUgaXMgc2V0IHRvIDEgd2hlbiBhIHNpZ25hbCBhcnJpdmVzCisgICAgICogYW5kIGl0IGlzIHNldCB0byAwIGhlcmUsIHdoZW4gd2Uga25vdyBzb21lIHNpZ25hbHMgYXJyaXZlZC4gVGhpcyB3YXkKKyAgICAgKiB3ZSBjYW4gcnVuIHRoZSByZWdpc3RlcmVkIGhhbmRsZXJzIHdpdGggbm8gc2lnbmFscyBibG9ja2VkLgorICAgICAqCisgICAgICogTk9URTogd2l0aCB0aGlzIGFwcHJvYWNoIHdlIGNhbiBoYXZlIGEgc2l0dWF0aW9uIHdoZXJlIGlzX3RyaXBwZWQgaXMKKyAgICAgKiAgICAgICAxIGJ1dCB3ZSBoYXZlIG5vIG1vcmUgc2lnbmFscyB0byBoYW5kbGUgKEhhbmRsZXJzW2ldLnRyaXBwZWQKKyAgICAgKiAgICAgICBpcyAwIGZvciBldmVyeSBzaWduYWwgaSkuIFRoaXMgd29uJ3QgZG8gdXMgYW55IGhhcm0gKGV4Y2VwdAorICAgICAqICAgICAgIHdlJ3JlIGdvbm5hIHNwZW50IHNvbWUgY3ljbGVzIGZvciBub3RoaW5nKS4gVGhpcyBoYXBwZW5zIHdoZW4KKyAgICAgKiAgICAgICB3ZSByZWNlaXZlIGEgc2lnbmFsIGkgYWZ0ZXIgd2UgemVybyBpc190cmlwcGVkIGFuZCBiZWZvcmUgd2UKKyAgICAgKiAgICAgICBjaGVjayBIYW5kbGVyc1tpXS50cmlwcGVkLgorICAgICAqLworICAgIGlzX3RyaXBwZWQgPSAwOwogCi0JaWYgKCEoZiA9IChQeU9iamVjdCAqKVB5RXZhbF9HZXRGcmFtZSgpKSkKLQkJZiA9IFB5X05vbmU7CisgICAgaWYgKCEoZiA9IChQeU9iamVjdCAqKVB5RXZhbF9HZXRGcmFtZSgpKSkKKyAgICAgICAgZiA9IFB5X05vbmU7CiAKLQlmb3IgKGkgPSAxOyBpIDwgTlNJRzsgaSsrKSB7Ci0JCWlmIChIYW5kbGVyc1tpXS50cmlwcGVkKSB7Ci0JCQlQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKLQkJCVB5T2JqZWN0ICphcmdsaXN0ID0gUHlfQnVpbGRWYWx1ZSgiKGlPKSIsIGksIGYpOwotCQkJSGFuZGxlcnNbaV0udHJpcHBlZCA9IDA7CisgICAgZm9yIChpID0gMTsgaSA8IE5TSUc7IGkrKykgeworICAgICAgICBpZiAoSGFuZGxlcnNbaV0udHJpcHBlZCkgeworICAgICAgICAgICAgUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7CisgICAgICAgICAgICBQeU9iamVjdCAqYXJnbGlzdCA9IFB5X0J1aWxkVmFsdWUoIihpTykiLCBpLCBmKTsKKyAgICAgICAgICAgIEhhbmRsZXJzW2ldLnRyaXBwZWQgPSAwOwogCi0JCQlpZiAoYXJnbGlzdCkgewotCQkJCXJlc3VsdCA9IFB5RXZhbF9DYWxsT2JqZWN0KEhhbmRsZXJzW2ldLmZ1bmMsCi0JCQkJCQkJICAgYXJnbGlzdCk7Ci0JCQkJUHlfREVDUkVGKGFyZ2xpc3QpOwotCQkJfQotCQkJaWYgKCFyZXN1bHQpCi0JCQkJcmV0dXJuIC0xOworICAgICAgICAgICAgaWYgKGFyZ2xpc3QpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBQeUV2YWxfQ2FsbE9iamVjdChIYW5kbGVyc1tpXS5mdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ2xpc3QpOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihhcmdsaXN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghcmVzdWx0KQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKIAotCQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCX0KLQl9CisgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgfQorICAgIH0KIAotCXJldHVybiAwOworICAgIHJldHVybiAwOwogfQogCiAKQEAgLTg5MSw0NiArODkxLDQ2IEBACiB2b2lkCiBQeUVycl9TZXRJbnRlcnJ1cHQodm9pZCkKIHsKLQlpc190cmlwcGVkID0gMTsKLQlIYW5kbGVyc1tTSUdJTlRdLnRyaXBwZWQgPSAxOwotCVB5X0FkZFBlbmRpbmdDYWxsKChpbnQgKCopKHZvaWQgKikpUHlFcnJfQ2hlY2tTaWduYWxzLCBOVUxMKTsKKyAgICBpc190cmlwcGVkID0gMTsKKyAgICBIYW5kbGVyc1tTSUdJTlRdLnRyaXBwZWQgPSAxOworICAgIFB5X0FkZFBlbmRpbmdDYWxsKChpbnQgKCopKHZvaWQgKikpUHlFcnJfQ2hlY2tTaWduYWxzLCBOVUxMKTsKIH0KIAogdm9pZAogUHlPU19Jbml0SW50ZXJydXB0cyh2b2lkKQogewotCWluaXRzaWduYWwoKTsKLQlfUHlJbXBvcnRfRml4dXBFeHRlbnNpb24oInNpZ25hbCIsICJzaWduYWwiKTsKKyAgICBpbml0c2lnbmFsKCk7CisgICAgX1B5SW1wb3J0X0ZpeHVwRXh0ZW5zaW9uKCJzaWduYWwiLCAic2lnbmFsIik7CiB9CiAKIHZvaWQKIFB5T1NfRmluaUludGVycnVwdHModm9pZCkKIHsKLQlmaW5pc2lnbmFsKCk7CisgICAgZmluaXNpZ25hbCgpOwogfQogCiBpbnQKIFB5T1NfSW50ZXJydXB0T2NjdXJyZWQodm9pZCkKIHsKLQlpZiAoSGFuZGxlcnNbU0lHSU5UXS50cmlwcGVkKSB7CisgICAgaWYgKEhhbmRsZXJzW1NJR0lOVF0udHJpcHBlZCkgewogI2lmZGVmIFdJVEhfVEhSRUFECi0JCWlmIChQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCkgIT0gbWFpbl90aHJlYWQpCi0JCQlyZXR1cm4gMDsKKyAgICAgICAgaWYgKFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSAhPSBtYWluX3RocmVhZCkKKyAgICAgICAgICAgIHJldHVybiAwOwogI2VuZGlmCi0JCUhhbmRsZXJzW1NJR0lOVF0udHJpcHBlZCA9IDA7Ci0JCXJldHVybiAxOwotCX0KLQlyZXR1cm4gMDsKKyAgICAgICAgSGFuZGxlcnNbU0lHSU5UXS50cmlwcGVkID0gMDsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHJldHVybiAwOwogfQogCiB2b2lkCiBQeU9TX0FmdGVyRm9yayh2b2lkKQogewogI2lmZGVmIFdJVEhfVEhSRUFECi0JUHlFdmFsX1JlSW5pdFRocmVhZHMoKTsKLQltYWluX3RocmVhZCA9IFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKTsKLQltYWluX3BpZCA9IGdldHBpZCgpOwotCV9QeUltcG9ydF9SZUluaXRMb2NrKCk7Ci0JUHlUaHJlYWRfUmVJbml0VExTKCk7CisgICAgUHlFdmFsX1JlSW5pdFRocmVhZHMoKTsKKyAgICBtYWluX3RocmVhZCA9IFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKTsKKyAgICBtYWluX3BpZCA9IGdldHBpZCgpOworICAgIF9QeUltcG9ydF9SZUluaXRMb2NrKCk7CisgICAgUHlUaHJlYWRfUmVJbml0VExTKCk7CiAjZW5kaWYKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvc29ja2V0bW9kdWxlLmMgYi9Nb2R1bGVzL3NvY2tldG1vZHVsZS5jCmluZGV4IDIwOWI3MmYuLmJmZTUzZjEgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvc29ja2V0bW9kdWxlLmMKKysrIGIvTW9kdWxlcy9zb2NrZXRtb2R1bGUuYwpAQCAtMTcsMTEgKzE3LDExIEBACiAKIC0gc29ja2V0LmVycm9yOiBleGNlcHRpb24gcmFpc2VkIGZvciBzb2NrZXQgc3BlY2lmaWMgZXJyb3JzCiAtIHNvY2tldC5nYWllcnJvcjogZXhjZXB0aW9uIHJhaXNlZCBmb3IgZ2V0YWRkcmluZm8vZ2V0bmFtZWluZm8gZXJyb3JzLAotCWEgc3ViY2xhc3Mgb2Ygc29ja2V0LmVycm9yCisgICAgYSBzdWJjbGFzcyBvZiBzb2NrZXQuZXJyb3IKIC0gc29ja2V0LmhlcnJvcjogZXhjZXB0aW9uIHJhaXNlZCBmb3IgZ2V0aG9zdGJ5KiBlcnJvcnMsCi0JYSBzdWJjbGFzcyBvZiBzb2NrZXQuZXJyb3IKKyAgICBhIHN1YmNsYXNzIG9mIHNvY2tldC5lcnJvcgogLSBzb2NrZXQuZnJvbWZkKGZkLCBmYW1pbHksIHR5cGVbLCBwcm90b10pIC0tPiBuZXcgc29ja2V0IG9iamVjdCAoY3JlYXRlZAotICAgICAgICBmcm9tIGFuIGV4aXN0aW5nIGZpbGUgZGVzY3JpcHRvcikKKyAgICBmcm9tIGFuIGV4aXN0aW5nIGZpbGUgZGVzY3JpcHRvcikKIC0gc29ja2V0LmdldGhvc3RieW5hbWUoaG9zdG5hbWUpIC0tPiBob3N0IElQIGFkZHJlc3MgKHN0cmluZzogJ2RkLmRkLmRkLmRkJykKIC0gc29ja2V0LmdldGhvc3RieWFkZHIoSVAgYWRkcmVzcykgLS0+IChob3N0bmFtZSwgW2FsaWFzLCAuLi5dLCBbSVAgYWRkciwgLi4uXSkKIC0gc29ja2V0LmdldGhvc3RuYW1lKCkgLS0+IGhvc3QgbmFtZSAoc3RyaW5nOiAnc3BhbScgb3IgJ3NwYW0uZG9tYWluLmNvbScpCkBAIC0zNSw3ICszNSw3IEBACiAtIHNvY2tldC5odG9ucygxNiBiaXQgdmFsdWUpIC0tPiBuZXcgaW50IG9iamVjdAogLSBzb2NrZXQuaHRvbmwoMzIgYml0IHZhbHVlKSAtLT4gbmV3IGludCBvYmplY3QKIC0gc29ja2V0LmdldGFkZHJpbmZvKGhvc3QsIHBvcnQgWywgZmFtaWx5LCBzb2NrdHlwZSwgcHJvdG8sIGZsYWdzXSkKLQktLT4gTGlzdCBvZiAoZmFtaWx5LCBzb2NrdHlwZSwgcHJvdG8sIGNhbm9ubmFtZSwgc29ja2FkZHIpCisgICAgLS0+IExpc3Qgb2YgKGZhbWlseSwgc29ja3R5cGUsIHByb3RvLCBjYW5vbm5hbWUsIHNvY2thZGRyKQogLSBzb2NrZXQuZ2V0bmFtZWluZm8oc29ja2FkZHIsIGZsYWdzKSAtLT4gKGhvc3QsIHBvcnQpCiAtIHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19TVFJFQU0sIGV0Yy46IGNvbnN0YW50cyBmcm9tIDxzb2NrZXQuaD4KIC0gc29ja2V0Lmhhc19pcHY2OiBib29sZWFuIHZhbHVlIGluZGljYXRpbmcgaWYgSVB2NiBpcyBzdXBwb3J0ZWQKQEAgLTU1LDIyICs1NSwyMiBAQAogICBzcGVjaWZ5IHBhY2tldC10eXBlIGFuZCBoYS10eXBlL2FkZHIuCiAtIGFuIEFGX1RJUEMgc29ja2V0IGFkZHJlc3MgaXMgZXhwcmVzc2VkIGFzCiAgKGFkZHJfdHlwZSwgdjEsIHYyLCB2MyBbLCBzY29wZV0pOyB3aGVyZSBhZGRyX3R5cGUgY2FuIGJlIG9uZSBvZjoKLQlUSVBDX0FERFJfTkFNRVNFUSwgVElQQ19BRERSX05BTUUsIGFuZCBUSVBDX0FERFJfSUQ7CisgICAgVElQQ19BRERSX05BTUVTRVEsIFRJUENfQUREUl9OQU1FLCBhbmQgVElQQ19BRERSX0lEOwogICBhbmQgc2NvcGUgY2FuIGJlIG9uZSBvZjoKLQlUSVBDX1pPTkVfU0NPUEUsIFRJUENfQ0xVU1RFUl9TQ09QRSwgYW5kIFRJUENfTk9ERV9TQ09QRS4KKyAgICBUSVBDX1pPTkVfU0NPUEUsIFRJUENfQ0xVU1RFUl9TQ09QRSwgYW5kIFRJUENfTk9ERV9TQ09QRS4KICAgVGhlIG1lYW5pbmcgb2YgdjEsIHYyIGFuZCB2MyBkZXBlbmRzIG9uIHRoZSB2YWx1ZSBvZiBhZGRyX3R5cGU6Ci0JaWYgYWRkcl90eXBlIGlzIFRJUENfQUREUl9OQU1FOgotCQl2MSBpcyB0aGUgc2VydmVyIHR5cGUKLQkJdjIgaXMgdGhlIHBvcnQgaWRlbnRpZmllcgotCQl2MyBpcyBpZ25vcmVkCi0JaWYgYWRkcl90eXBlIGlzIFRJUENfQUREUl9OQU1FU0VROgotCQl2MSBpcyB0aGUgc2VydmVyIHR5cGUKLQkJdjIgaXMgdGhlIGxvd2VyIHBvcnQgbnVtYmVyCi0JCXYzIGlzIHRoZSB1cHBlciBwb3J0IG51bWJlcgotCWlmIGFkZHJfdHlwZSBpcyBUSVBDX0FERFJfSUQ6Ci0JCXYxIGlzIHRoZSBub2RlCi0JCXYyIGlzIHRoZSByZWYKLQkJdjMgaXMgaWdub3JlZAorICAgIGlmIGFkZHJfdHlwZSBpcyBUSVBDX0FERFJfTkFNRToKKyAgICAgICAgdjEgaXMgdGhlIHNlcnZlciB0eXBlCisgICAgICAgIHYyIGlzIHRoZSBwb3J0IGlkZW50aWZpZXIKKyAgICAgICAgdjMgaXMgaWdub3JlZAorICAgIGlmIGFkZHJfdHlwZSBpcyBUSVBDX0FERFJfTkFNRVNFUToKKyAgICAgICAgdjEgaXMgdGhlIHNlcnZlciB0eXBlCisgICAgICAgIHYyIGlzIHRoZSBsb3dlciBwb3J0IG51bWJlcgorICAgICAgICB2MyBpcyB0aGUgdXBwZXIgcG9ydCBudW1iZXIKKyAgICBpZiBhZGRyX3R5cGUgaXMgVElQQ19BRERSX0lEOgorICAgICAgICB2MSBpcyB0aGUgbm9kZQorICAgICAgICB2MiBpcyB0aGUgcmVmCisgICAgICAgIHYzIGlzIGlnbm9yZWQKIAogCiBMb2NhbCBuYW1pbmcgY29udmVudGlvbnM6CkBAIC0yOTUsNyArMjk1LDcgQEAKICNpbmNsdWRlIDxzdGRkZWYuaD4KIAogI2lmbmRlZiBvZmZzZXRvZgotIyBkZWZpbmUgb2Zmc2V0b2YodHlwZSwgbWVtYmVyKQkoKHNpemVfdCkoJigodHlwZSAqKTApLT5tZW1iZXIpKQorIyBkZWZpbmUgb2Zmc2V0b2YodHlwZSwgbWVtYmVyKSAoKHNpemVfdCkoJigodHlwZSAqKTApLT5tZW1iZXIpKQogI2VuZGlmCiAKICNpZm5kZWYgT19OT05CTE9DSwpAQCAtNDE1LDcgKzQxNSw3IEBACiAjZGVmaW5lIFNFR01FTlRfU0laRSAoMzIgKiAxMDI0IC0xKQogI2VuZGlmCiAKLSNkZWZpbmUJU0FTMlNBKHgpCSgoc3RydWN0IHNvY2thZGRyICopKHgpKQorI2RlZmluZSBTQVMyU0EoeCkgICAgICAgKChzdHJ1Y3Qgc29ja2FkZHIgKikoeCkpCiAKIC8qCiAgKiBDb25zdGFudHMgZm9yIGdldG5hbWVpbmZvKCkKQEAgLTQ3MSw4ICs0NzEsOCBAQAogc3RhdGljIFB5T2JqZWN0Kgogc2VsZWN0X2Vycm9yKHZvaWQpCiB7Ci0JUHlFcnJfU2V0U3RyaW5nKHNvY2tldF9lcnJvciwgInVuYWJsZSB0byBzZWxlY3Qgb24gc29ja2V0Iik7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlFcnJfU2V0U3RyaW5nKHNvY2tldF9lcnJvciwgInVuYWJsZSB0byBzZWxlY3Qgb24gc29ja2V0Iik7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIC8qIENvbnZlbmllbmNlIGZ1bmN0aW9uIHRvIHJhaXNlIGFuIGVycm9yIGFjY29yZGluZyB0byBlcnJubwpAQCAtNDgyLDEwNyArNDgyLDEwNyBAQAogc2V0X2Vycm9yKHZvaWQpCiB7CiAjaWZkZWYgTVNfV0lORE9XUwotCWludCBlcnJfbm8gPSBXU0FHZXRMYXN0RXJyb3IoKTsKLQkvKiBQeUVycl9TZXRFeGNGcm9tV2luZG93c0VycigpIGludm9rZXMgRm9ybWF0TWVzc2FnZSgpIHdoaWNoCi0JICAgcmVjb2duaXplcyB0aGUgZXJyb3IgY29kZXMgdXNlZCBieSBib3RoIEdldExhc3RFcnJvcigpIGFuZAotCSAgIFdTQUdldExhc3RFcnJvciAqLwotCWlmIChlcnJfbm8pCi0JCXJldHVybiBQeUVycl9TZXRFeGNGcm9tV2luZG93c0Vycihzb2NrZXRfZXJyb3IsIGVycl9ubyk7CisgICAgaW50IGVycl9ubyA9IFdTQUdldExhc3RFcnJvcigpOworICAgIC8qIFB5RXJyX1NldEV4Y0Zyb21XaW5kb3dzRXJyKCkgaW52b2tlcyBGb3JtYXRNZXNzYWdlKCkgd2hpY2gKKyAgICAgICByZWNvZ25pemVzIHRoZSBlcnJvciBjb2RlcyB1c2VkIGJ5IGJvdGggR2V0TGFzdEVycm9yKCkgYW5kCisgICAgICAgV1NBR2V0TGFzdEVycm9yICovCisgICAgaWYgKGVycl9ubykKKyAgICAgICAgcmV0dXJuIFB5RXJyX1NldEV4Y0Zyb21XaW5kb3dzRXJyKHNvY2tldF9lcnJvciwgZXJyX25vKTsKICNlbmRpZgogCiAjaWYgZGVmaW5lZChQWU9TX09TMikgJiYgIWRlZmluZWQoUFlDQ19HQ0MpCi0JaWYgKHNvY2tfZXJybm8oKSAhPSBOT19FUlJPUikgewotCQlBUElSRVQgcmM7Ci0JCVVMT05HICBtc2dsZW47Ci0JCWNoYXIgb3V0YnVmWzEwMF07Ci0JCWludCBteWVycm9yY29kZSA9IHNvY2tfZXJybm8oKTsKKyAgICBpZiAoc29ja19lcnJubygpICE9IE5PX0VSUk9SKSB7CisgICAgICAgIEFQSVJFVCByYzsKKyAgICAgICAgVUxPTkcgIG1zZ2xlbjsKKyAgICAgICAgY2hhciBvdXRidWZbMTAwXTsKKyAgICAgICAgaW50IG15ZXJyb3Jjb2RlID0gc29ja19lcnJubygpOwogCi0JCS8qIFJldHJpZXZlIHNvY2tldC1yZWxhdGVkIGVycm9yIG1lc3NhZ2UgZnJvbSBNUFROLk1TRyBmaWxlICovCi0JCXJjID0gRG9zR2V0TWVzc2FnZShOVUxMLCAwLCBvdXRidWYsIHNpemVvZihvdXRidWYpLAotCQkJCSAgIG15ZXJyb3Jjb2RlIC0gU09DQkFTRUVSUiArIDI2LAotCQkJCSAgICJtcHRuLm1zZyIsCi0JCQkJICAgJm1zZ2xlbik7Ci0JCWlmIChyYyA9PSBOT19FUlJPUikgewotCQkJUHlPYmplY3QgKnY7CisgICAgICAgIC8qIFJldHJpZXZlIHNvY2tldC1yZWxhdGVkIGVycm9yIG1lc3NhZ2UgZnJvbSBNUFROLk1TRyBmaWxlICovCisgICAgICAgIHJjID0gRG9zR2V0TWVzc2FnZShOVUxMLCAwLCBvdXRidWYsIHNpemVvZihvdXRidWYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbXllcnJvcmNvZGUgLSBTT0NCQVNFRVJSICsgMjYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAibXB0bi5tc2ciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1zZ2xlbik7CisgICAgICAgIGlmIChyYyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgUHlPYmplY3QgKnY7CiAKLQkJCS8qIE9TLzIgZG9lc24ndCBndWFyYW50ZWUgYSB0ZXJtaW5hdG9yICovCi0JCQlvdXRidWZbbXNnbGVuXSA9ICdcMCc7Ci0JCQlpZiAoc3RybGVuKG91dGJ1ZikgPiAwKSB7Ci0JCQkJLyogSWYgbm9uLWVtcHR5IG1zZywgdHJpbSBDUkxGICovCi0JCQkJY2hhciAqbGFzdGMgPSAmb3V0YnVmWyBzdHJsZW4ob3V0YnVmKS0xIF07Ci0JCQkJd2hpbGUgKGxhc3RjID4gb3V0YnVmICYmCi0JCQkJICAgICAgIGlzc3BhY2UoUHlfQ0hBUk1BU0soKmxhc3RjKSkpIHsKLQkJCQkJLyogVHJpbSB0cmFpbGluZyB3aGl0ZXNwYWNlIChDUkxGKSAqLwotCQkJCQkqbGFzdGMtLSA9ICdcMCc7Ci0JCQkJfQotCQkJfQotCQkJdiA9IFB5X0J1aWxkVmFsdWUoIihpcykiLCBteWVycm9yY29kZSwgb3V0YnVmKTsKLQkJCWlmICh2ICE9IE5VTEwpIHsKLQkJCQlQeUVycl9TZXRPYmplY3Qoc29ja2V0X2Vycm9yLCB2KTsKLQkJCQlQeV9ERUNSRUYodik7Ci0JCQl9Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KKyAgICAgICAgICAgIC8qIE9TLzIgZG9lc24ndCBndWFyYW50ZWUgYSB0ZXJtaW5hdG9yICovCisgICAgICAgICAgICBvdXRidWZbbXNnbGVuXSA9ICdcMCc7CisgICAgICAgICAgICBpZiAoc3RybGVuKG91dGJ1ZikgPiAwKSB7CisgICAgICAgICAgICAgICAgLyogSWYgbm9uLWVtcHR5IG1zZywgdHJpbSBDUkxGICovCisgICAgICAgICAgICAgICAgY2hhciAqbGFzdGMgPSAmb3V0YnVmWyBzdHJsZW4ob3V0YnVmKS0xIF07CisgICAgICAgICAgICAgICAgd2hpbGUgKGxhc3RjID4gb3V0YnVmICYmCisgICAgICAgICAgICAgICAgICAgICAgIGlzc3BhY2UoUHlfQ0hBUk1BU0soKmxhc3RjKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogVHJpbSB0cmFpbGluZyB3aGl0ZXNwYWNlIChDUkxGKSAqLworICAgICAgICAgICAgICAgICAgICAqbGFzdGMtLSA9ICdcMCc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdiA9IFB5X0J1aWxkVmFsdWUoIihpcykiLCBteWVycm9yY29kZSwgb3V0YnVmKTsKKyAgICAgICAgICAgIGlmICh2ICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRPYmplY3Qoc29ja2V0X2Vycm9yLCB2KTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KICNlbmRpZgogCiAjaWYgZGVmaW5lZChSSVNDT1MpCi0JaWYgKF9pbmV0X2Vycm9yLmVycm51bSAhPSBOVUxMKSB7Ci0JCVB5T2JqZWN0ICp2OwotCQl2ID0gUHlfQnVpbGRWYWx1ZSgiKGlzKSIsIGVycm5vLCBfaW5ldF9lcnIoKSk7Ci0JCWlmICh2ICE9IE5VTEwpIHsKLQkJCVB5RXJyX1NldE9iamVjdChzb2NrZXRfZXJyb3IsIHYpOwotCQkJUHlfREVDUkVGKHYpOwotCQl9Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoX2luZXRfZXJyb3IuZXJybnVtICE9IE5VTEwpIHsKKyAgICAgICAgUHlPYmplY3QgKnY7CisgICAgICAgIHYgPSBQeV9CdWlsZFZhbHVlKCIoaXMpIiwgZXJybm8sIF9pbmV0X2VycigpKTsKKyAgICAgICAgaWYgKHYgIT0gTlVMTCkgeworICAgICAgICAgICAgUHlFcnJfU2V0T2JqZWN0KHNvY2tldF9lcnJvciwgdik7CisgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogI2VuZGlmCiAKLQlyZXR1cm4gUHlFcnJfU2V0RnJvbUVycm5vKHNvY2tldF9lcnJvcik7CisgICAgcmV0dXJuIFB5RXJyX1NldEZyb21FcnJubyhzb2NrZXRfZXJyb3IpOwogfQogCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZXRfaGVycm9yKGludCBoX2Vycm9yKQogewotCVB5T2JqZWN0ICp2OworICAgIFB5T2JqZWN0ICp2OwogCiAjaWZkZWYgSEFWRV9IU1RSRVJST1IKLQl2ID0gUHlfQnVpbGRWYWx1ZSgiKGlzKSIsIGhfZXJyb3IsIChjaGFyICopaHN0cmVycm9yKGhfZXJyb3IpKTsKKyAgICB2ID0gUHlfQnVpbGRWYWx1ZSgiKGlzKSIsIGhfZXJyb3IsIChjaGFyICopaHN0cmVycm9yKGhfZXJyb3IpKTsKICNlbHNlCi0JdiA9IFB5X0J1aWxkVmFsdWUoIihpcykiLCBoX2Vycm9yLCAiaG9zdCBub3QgZm91bmQiKTsKKyAgICB2ID0gUHlfQnVpbGRWYWx1ZSgiKGlzKSIsIGhfZXJyb3IsICJob3N0IG5vdCBmb3VuZCIpOwogI2VuZGlmCi0JaWYgKHYgIT0gTlVMTCkgewotCQlQeUVycl9TZXRPYmplY3Qoc29ja2V0X2hlcnJvciwgdik7Ci0JCVB5X0RFQ1JFRih2KTsKLQl9CisgICAgaWYgKHYgIT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRPYmplY3Qoc29ja2V0X2hlcnJvciwgdik7CisgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICB9CiAKLQlyZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogCiBzdGF0aWMgUHlPYmplY3QgKgogc2V0X2dhaWVycm9yKGludCBlcnJvcikKIHsKLQlQeU9iamVjdCAqdjsKKyAgICBQeU9iamVjdCAqdjsKIAogI2lmZGVmIEVBSV9TWVNURU0KLQkvKiBFQUlfU1lTVEVNIGlzIG5vdCBhdmFpbGFibGUgb24gV2luZG93cyBYUC4gKi8KLQlpZiAoZXJyb3IgPT0gRUFJX1NZU1RFTSkKLQkJcmV0dXJuIHNldF9lcnJvcigpOworICAgIC8qIEVBSV9TWVNURU0gaXMgbm90IGF2YWlsYWJsZSBvbiBXaW5kb3dzIFhQLiAqLworICAgIGlmIChlcnJvciA9PSBFQUlfU1lTVEVNKQorICAgICAgICByZXR1cm4gc2V0X2Vycm9yKCk7CiAjZW5kaWYKIAogI2lmZGVmIEhBVkVfR0FJX1NUUkVSUk9SCi0JdiA9IFB5X0J1aWxkVmFsdWUoIihpcykiLCBlcnJvciwgZ2FpX3N0cmVycm9yKGVycm9yKSk7CisgICAgdiA9IFB5X0J1aWxkVmFsdWUoIihpcykiLCBlcnJvciwgZ2FpX3N0cmVycm9yKGVycm9yKSk7CiAjZWxzZQotCXYgPSBQeV9CdWlsZFZhbHVlKCIoaXMpIiwgZXJyb3IsICJnZXRhZGRyaW5mbyBmYWlsZWQiKTsKKyAgICB2ID0gUHlfQnVpbGRWYWx1ZSgiKGlzKSIsIGVycm9yLCAiZ2V0YWRkcmluZm8gZmFpbGVkIik7CiAjZW5kaWYKLQlpZiAodiAhPSBOVUxMKSB7Ci0JCVB5RXJyX1NldE9iamVjdChzb2NrZXRfZ2FpZXJyb3IsIHYpOwotCQlQeV9ERUNSRUYodik7Ci0JfQorICAgIGlmICh2ICE9IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0T2JqZWN0KHNvY2tldF9nYWllcnJvciwgdik7CisgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICB9CiAKLQlyZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogI2lmZGVmIF9fVk1TCkBAIC01OTAsMjIgKzU5MCwyMiBAQAogc3RhdGljIGludAogc2VuZHNlZ21lbnRlZChpbnQgc29ja19mZCwgY2hhciAqYnVmLCBpbnQgbGVuLCBpbnQgZmxhZ3MpCiB7Ci0JaW50IG4gPSAwOwotCWludCByZW1haW5pbmcgPSBsZW47CisgICAgaW50IG4gPSAwOworICAgIGludCByZW1haW5pbmcgPSBsZW47CiAKLQl3aGlsZSAocmVtYWluaW5nID4gMCkgewotCQl1bnNpZ25lZCBpbnQgc2VnbWVudDsKKyAgICB3aGlsZSAocmVtYWluaW5nID4gMCkgeworICAgICAgICB1bnNpZ25lZCBpbnQgc2VnbWVudDsKIAotCQlzZWdtZW50ID0gKHJlbWFpbmluZyA+PSBTRUdNRU5UX1NJWkUgPyBTRUdNRU5UX1NJWkUgOiByZW1haW5pbmcpOwotCQluID0gc2VuZChzb2NrX2ZkLCBidWYsIHNlZ21lbnQsIGZsYWdzKTsKLQkJaWYgKG4gPCAwKSB7Ci0JCQlyZXR1cm4gbjsKLQkJfQotCQlyZW1haW5pbmcgLT0gc2VnbWVudDsKLQkJYnVmICs9IHNlZ21lbnQ7Ci0JfSAvKiBlbmQgd2hpbGUgKi8KKyAgICAgICAgc2VnbWVudCA9IChyZW1haW5pbmcgPj0gU0VHTUVOVF9TSVpFID8gU0VHTUVOVF9TSVpFIDogcmVtYWluaW5nKTsKKyAgICAgICAgbiA9IHNlbmQoc29ja19mZCwgYnVmLCBzZWdtZW50LCBmbGFncyk7CisgICAgICAgIGlmIChuIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIG47CisgICAgICAgIH0KKyAgICAgICAgcmVtYWluaW5nIC09IHNlZ21lbnQ7CisgICAgICAgIGJ1ZiArPSBzZWdtZW50OworICAgIH0gLyogZW5kIHdoaWxlICovCiAKLQlyZXR1cm4gbGVuOworICAgIHJldHVybiBsZW47CiB9CiAjZW5kaWYKIApAQCAtNjE2LDQ1ICs2MTYsNDUgQEAKIHsKICNpZm5kZWYgUklTQ09TCiAjaWZuZGVmIE1TX1dJTkRPV1MKLQlpbnQgZGVsYXlfZmxhZzsKKyAgICBpbnQgZGVsYXlfZmxhZzsKICNlbmRpZgogI2VuZGlmCiAKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwogI2lmZGVmIF9fQkVPU19fCi0JYmxvY2sgPSAhYmxvY2s7Ci0Jc2V0c29ja29wdChzLT5zb2NrX2ZkLCBTT0xfU09DS0VULCBTT19OT05CTE9DSywKLQkJICAgKHZvaWQgKikoJmJsb2NrKSwgc2l6ZW9mKGludCkpOworICAgIGJsb2NrID0gIWJsb2NrOworICAgIHNldHNvY2tvcHQocy0+c29ja19mZCwgU09MX1NPQ0tFVCwgU09fTk9OQkxPQ0ssCisgICAgICAgICAgICAgICAodm9pZCAqKSgmYmxvY2spLCBzaXplb2YoaW50KSk7CiAjZWxzZQogI2lmbmRlZiBSSVNDT1MKICNpZm5kZWYgTVNfV0lORE9XUwogI2lmIGRlZmluZWQoUFlPU19PUzIpICYmICFkZWZpbmVkKFBZQ0NfR0NDKQotCWJsb2NrID0gIWJsb2NrOwotCWlvY3RsKHMtPnNvY2tfZmQsIEZJT05CSU8sIChjYWRkcl90KSZibG9jaywgc2l6ZW9mKGJsb2NrKSk7CisgICAgYmxvY2sgPSAhYmxvY2s7CisgICAgaW9jdGwocy0+c29ja19mZCwgRklPTkJJTywgKGNhZGRyX3QpJmJsb2NrLCBzaXplb2YoYmxvY2spKTsKICNlbGlmIGRlZmluZWQoX19WTVMpCi0JYmxvY2sgPSAhYmxvY2s7Ci0JaW9jdGwocy0+c29ja19mZCwgRklPTkJJTywgKHVuc2lnbmVkIGludCAqKSZibG9jayk7CisgICAgYmxvY2sgPSAhYmxvY2s7CisgICAgaW9jdGwocy0+c29ja19mZCwgRklPTkJJTywgKHVuc2lnbmVkIGludCAqKSZibG9jayk7CiAjZWxzZSAgLyogIVBZT1NfT1MyICYmICFfX1ZNUyAqLwotCWRlbGF5X2ZsYWcgPSBmY250bChzLT5zb2NrX2ZkLCBGX0dFVEZMLCAwKTsKLQlpZiAoYmxvY2spCi0JCWRlbGF5X2ZsYWcgJj0gKH5PX05PTkJMT0NLKTsKLQllbHNlCi0JCWRlbGF5X2ZsYWcgfD0gT19OT05CTE9DSzsKLQlmY250bChzLT5zb2NrX2ZkLCBGX1NFVEZMLCBkZWxheV9mbGFnKTsKKyAgICBkZWxheV9mbGFnID0gZmNudGwocy0+c29ja19mZCwgRl9HRVRGTCwgMCk7CisgICAgaWYgKGJsb2NrKQorICAgICAgICBkZWxheV9mbGFnICY9ICh+T19OT05CTE9DSyk7CisgICAgZWxzZQorICAgICAgICBkZWxheV9mbGFnIHw9IE9fTk9OQkxPQ0s7CisgICAgZmNudGwocy0+c29ja19mZCwgRl9TRVRGTCwgZGVsYXlfZmxhZyk7CiAjZW5kaWYgLyogIVBZT1NfT1MyICovCiAjZWxzZSAvKiBNU19XSU5ET1dTICovCi0JYmxvY2sgPSAhYmxvY2s7Ci0JaW9jdGxzb2NrZXQocy0+c29ja19mZCwgRklPTkJJTywgKHVfbG9uZyopJmJsb2NrKTsKKyAgICBibG9jayA9ICFibG9jazsKKyAgICBpb2N0bHNvY2tldChzLT5zb2NrX2ZkLCBGSU9OQklPLCAodV9sb25nKikmYmxvY2spOwogI2VuZGlmIC8qIE1TX1dJTkRPV1MgKi8KICNlbHNlIC8qIFJJU0NPUyAqLwotCWJsb2NrID0gIWJsb2NrOwotCXNvY2tldGlvY3RsKHMtPnNvY2tfZmQsIEZJT05CSU8sICh1X2xvbmcqKSZibG9jayk7CisgICAgYmxvY2sgPSAhYmxvY2s7CisgICAgc29ja2V0aW9jdGwocy0+c29ja19mZCwgRklPTkJJTywgKHVfbG9uZyopJmJsb2NrKTsKICNlbmRpZiAvKiBSSVNDT1MgKi8KICNlbmRpZiAvKiBfX0JFT1NfXyAqLwotCVB5X0VORF9BTExPV19USFJFQURTCisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKIAotCS8qIFNpbmNlIHRoZXNlIGRvbid0IHJldHVybiBhbnl0aGluZyAqLwotCXJldHVybiAxOworICAgIC8qIFNpbmNlIHRoZXNlIGRvbid0IHJldHVybiBhbnl0aGluZyAqLworICAgIHJldHVybiAxOwogfQogCiAvKiBEbyBhIHNlbGVjdCgpL3BvbGwoKSBvbiB0aGUgc29ja2V0LCBpZiBuZWNlc3NhcnkgKHNvY2tfdGltZW91dCA+IDApLgpAQCAtNjY1LDUzICs2NjUsNTMgQEAKIHN0YXRpYyBpbnQKIGludGVybmFsX3NlbGVjdChQeVNvY2tldFNvY2tPYmplY3QgKnMsIGludCB3cml0aW5nKQogewotCWludCBuOworICAgIGludCBuOwogCi0JLyogTm90aGluZyB0byBkbyB1bmxlc3Mgd2UncmUgaW4gdGltZW91dCBtb2RlIChub3Qgbm9uLWJsb2NraW5nKSAqLwotCWlmIChzLT5zb2NrX3RpbWVvdXQgPD0gMC4wKQotCQlyZXR1cm4gMDsKKyAgICAvKiBOb3RoaW5nIHRvIGRvIHVubGVzcyB3ZSdyZSBpbiB0aW1lb3V0IG1vZGUgKG5vdCBub24tYmxvY2tpbmcpICovCisgICAgaWYgKHMtPnNvY2tfdGltZW91dCA8PSAwLjApCisgICAgICAgIHJldHVybiAwOwogCi0JLyogR3VhcmQgYWdhaW5zdCBjbG9zZWQgc29ja2V0ICovCi0JaWYgKHMtPnNvY2tfZmQgPCAwKQotCQlyZXR1cm4gMDsKKyAgICAvKiBHdWFyZCBhZ2FpbnN0IGNsb3NlZCBzb2NrZXQgKi8KKyAgICBpZiAocy0+c29ja19mZCA8IDApCisgICAgICAgIHJldHVybiAwOwogCi0JLyogUHJlZmVyIHBvbGwsIGlmIGF2YWlsYWJsZSwgc2luY2UgeW91IGNhbiBwb2xsKCkgYW55IGZkCi0JICogd2hpY2ggY2FuJ3QgYmUgZG9uZSB3aXRoIHNlbGVjdCgpLiAqLworICAgIC8qIFByZWZlciBwb2xsLCBpZiBhdmFpbGFibGUsIHNpbmNlIHlvdSBjYW4gcG9sbCgpIGFueSBmZAorICAgICAqIHdoaWNoIGNhbid0IGJlIGRvbmUgd2l0aCBzZWxlY3QoKS4gKi8KICNpZmRlZiBIQVZFX1BPTEwKLQl7Ci0JCXN0cnVjdCBwb2xsZmQgcG9sbGZkOwotCQlpbnQgdGltZW91dDsKKyAgICB7CisgICAgICAgIHN0cnVjdCBwb2xsZmQgcG9sbGZkOworICAgICAgICBpbnQgdGltZW91dDsKIAotCQlwb2xsZmQuZmQgPSBzLT5zb2NrX2ZkOwotCQlwb2xsZmQuZXZlbnRzID0gd3JpdGluZyA/IFBPTExPVVQgOiBQT0xMSU47CisgICAgICAgIHBvbGxmZC5mZCA9IHMtPnNvY2tfZmQ7CisgICAgICAgIHBvbGxmZC5ldmVudHMgPSB3cml0aW5nID8gUE9MTE9VVCA6IFBPTExJTjsKIAotCQkvKiBzLT5zb2NrX3RpbWVvdXQgaXMgaW4gc2Vjb25kcywgdGltZW91dCBpbiBtcyAqLwotCQl0aW1lb3V0ID0gKGludCkocy0+c29ja190aW1lb3V0ICogMTAwMCArIDAuNSk7IAotCQluID0gcG9sbCgmcG9sbGZkLCAxLCB0aW1lb3V0KTsKLQl9CisgICAgICAgIC8qIHMtPnNvY2tfdGltZW91dCBpcyBpbiBzZWNvbmRzLCB0aW1lb3V0IGluIG1zICovCisgICAgICAgIHRpbWVvdXQgPSAoaW50KShzLT5zb2NrX3RpbWVvdXQgKiAxMDAwICsgMC41KTsKKyAgICAgICAgbiA9IHBvbGwoJnBvbGxmZCwgMSwgdGltZW91dCk7CisgICAgfQogI2Vsc2UKLQl7Ci0JCS8qIENvbnN0cnVjdCB0aGUgYXJndW1lbnRzIHRvIHNlbGVjdCAqLwotCQlmZF9zZXQgZmRzOwotCQlzdHJ1Y3QgdGltZXZhbCB0djsKLQkJdHYudHZfc2VjID0gKGludClzLT5zb2NrX3RpbWVvdXQ7Ci0JCXR2LnR2X3VzZWMgPSAoaW50KSgocy0+c29ja190aW1lb3V0IC0gdHYudHZfc2VjKSAqIDFlNik7Ci0JCUZEX1pFUk8oJmZkcyk7Ci0JCUZEX1NFVChzLT5zb2NrX2ZkLCAmZmRzKTsKKyAgICB7CisgICAgICAgIC8qIENvbnN0cnVjdCB0aGUgYXJndW1lbnRzIHRvIHNlbGVjdCAqLworICAgICAgICBmZF9zZXQgZmRzOworICAgICAgICBzdHJ1Y3QgdGltZXZhbCB0djsKKyAgICAgICAgdHYudHZfc2VjID0gKGludClzLT5zb2NrX3RpbWVvdXQ7CisgICAgICAgIHR2LnR2X3VzZWMgPSAoaW50KSgocy0+c29ja190aW1lb3V0IC0gdHYudHZfc2VjKSAqIDFlNik7CisgICAgICAgIEZEX1pFUk8oJmZkcyk7CisgICAgICAgIEZEX1NFVChzLT5zb2NrX2ZkLCAmZmRzKTsKIAotCQkvKiBTZWUgaWYgdGhlIHNvY2tldCBpcyByZWFkeSAqLwotCQlpZiAod3JpdGluZykKLQkJCW4gPSBzZWxlY3Qocy0+c29ja19mZCsxLCBOVUxMLCAmZmRzLCBOVUxMLCAmdHYpOwotCQllbHNlCi0JCQluID0gc2VsZWN0KHMtPnNvY2tfZmQrMSwgJmZkcywgTlVMTCwgTlVMTCwgJnR2KTsKLQl9CisgICAgICAgIC8qIFNlZSBpZiB0aGUgc29ja2V0IGlzIHJlYWR5ICovCisgICAgICAgIGlmICh3cml0aW5nKQorICAgICAgICAgICAgbiA9IHNlbGVjdChzLT5zb2NrX2ZkKzEsIE5VTEwsICZmZHMsIE5VTEwsICZ0dik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG4gPSBzZWxlY3Qocy0+c29ja19mZCsxLCAmZmRzLCBOVUxMLCBOVUxMLCAmdHYpOworICAgIH0KICNlbmRpZgotCQotCWlmIChuIDwgMCkKLQkJcmV0dXJuIC0xOwotCWlmIChuID09IDApCi0JCXJldHVybiAxOwotCXJldHVybiAwOworCisgICAgaWYgKG4gPCAwKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKG4gPT0gMCkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgcmV0dXJuIDA7CiB9CiAKIC8qIEluaXRpYWxpemUgYSBuZXcgc29ja2V0IG9iamVjdC4gKi8KQEAgLTcyMCwyNSArNzIwLDI1IEBACiAKIFB5TU9ESU5JVF9GVU5DCiBpbml0X3NvY2tvYmplY3QoUHlTb2NrZXRTb2NrT2JqZWN0ICpzLAotCQlTT0NLRVRfVCBmZCwgaW50IGZhbWlseSwgaW50IHR5cGUsIGludCBwcm90bykKKyAgICAgICAgICAgICAgICBTT0NLRVRfVCBmZCwgaW50IGZhbWlseSwgaW50IHR5cGUsIGludCBwcm90bykKIHsKICNpZmRlZiBSSVNDT1MKLQlpbnQgYmxvY2sgPSAxOworICAgIGludCBibG9jayA9IDE7CiAjZW5kaWYKLQlzLT5zb2NrX2ZkID0gZmQ7Ci0Jcy0+c29ja19mYW1pbHkgPSBmYW1pbHk7Ci0Jcy0+c29ja190eXBlID0gdHlwZTsKLQlzLT5zb2NrX3Byb3RvID0gcHJvdG87Ci0Jcy0+c29ja190aW1lb3V0ID0gZGVmYXVsdHRpbWVvdXQ7CisgICAgcy0+c29ja19mZCA9IGZkOworICAgIHMtPnNvY2tfZmFtaWx5ID0gZmFtaWx5OworICAgIHMtPnNvY2tfdHlwZSA9IHR5cGU7CisgICAgcy0+c29ja19wcm90byA9IHByb3RvOworICAgIHMtPnNvY2tfdGltZW91dCA9IGRlZmF1bHR0aW1lb3V0OwogCi0Jcy0+ZXJyb3JoYW5kbGVyID0gJnNldF9lcnJvcjsKKyAgICBzLT5lcnJvcmhhbmRsZXIgPSAmc2V0X2Vycm9yOwogCi0JaWYgKGRlZmF1bHR0aW1lb3V0ID49IDAuMCkKLQkJaW50ZXJuYWxfc2V0YmxvY2tpbmcocywgMCk7CisgICAgaWYgKGRlZmF1bHR0aW1lb3V0ID49IDAuMCkKKyAgICAgICAgaW50ZXJuYWxfc2V0YmxvY2tpbmcocywgMCk7CiAKICNpZmRlZiBSSVNDT1MKLQlpZiAodGFza3dpbmRvdykKLQkJc29ja2V0aW9jdGwocy0+c29ja19mZCwgMHg4MDA0NjY3OSwgKHVfbG9uZyopJmJsb2NrKTsKKyAgICBpZiAodGFza3dpbmRvdykKKyAgICAgICAgc29ja2V0aW9jdGwocy0+c29ja19mZCwgMHg4MDA0NjY3OSwgKHVfbG9uZyopJmJsb2NrKTsKICNlbmRpZgogfQogCkBAIC03NTEsMTIgKzc1MSwxMiBAQAogc3RhdGljIFB5U29ja2V0U29ja09iamVjdCAqCiBuZXdfc29ja29iamVjdChTT0NLRVRfVCBmZCwgaW50IGZhbWlseSwgaW50IHR5cGUsIGludCBwcm90bykKIHsKLQlQeVNvY2tldFNvY2tPYmplY3QgKnM7Ci0JcyA9IChQeVNvY2tldFNvY2tPYmplY3QgKikKLQkJUHlUeXBlX0dlbmVyaWNOZXcoJnNvY2tfdHlwZSwgTlVMTCwgTlVMTCk7Ci0JaWYgKHMgIT0gTlVMTCkKLQkJaW5pdF9zb2Nrb2JqZWN0KHMsIGZkLCBmYW1pbHksIHR5cGUsIHByb3RvKTsKLQlyZXR1cm4gczsKKyAgICBQeVNvY2tldFNvY2tPYmplY3QgKnM7CisgICAgcyA9IChQeVNvY2tldFNvY2tPYmplY3QgKikKKyAgICAgICAgUHlUeXBlX0dlbmVyaWNOZXcoJnNvY2tfdHlwZSwgTlVMTCwgTlVMTCk7CisgICAgaWYgKHMgIT0gTlVMTCkKKyAgICAgICAgaW5pdF9zb2Nrb2JqZWN0KHMsIGZkLCBmYW1pbHksIHR5cGUsIHByb3RvKTsKKyAgICByZXR1cm4gczsKIH0KIAogCkBAIC03NzYsMTIyICs3NzYsMTIyIEBACiBzdGF0aWMgaW50CiBzZXRpcGFkZHIoY2hhciAqbmFtZSwgc3RydWN0IHNvY2thZGRyICphZGRyX3JldCwgc2l6ZV90IGFkZHJfcmV0X3NpemUsIGludCBhZikKIHsKLQlzdHJ1Y3QgYWRkcmluZm8gaGludHMsICpyZXM7Ci0JaW50IGVycm9yOwotCWludCBkMSwgZDIsIGQzLCBkNDsKLQljaGFyIGNoOworICAgIHN0cnVjdCBhZGRyaW5mbyBoaW50cywgKnJlczsKKyAgICBpbnQgZXJyb3I7CisgICAgaW50IGQxLCBkMiwgZDMsIGQ0OworICAgIGNoYXIgY2g7CiAKLQltZW1zZXQoKHZvaWQgKikgYWRkcl9yZXQsICdcMCcsIHNpemVvZigqYWRkcl9yZXQpKTsKLQlpZiAobmFtZVswXSA9PSAnXDAnKSB7Ci0JCWludCBzaXo7Ci0JCW1lbXNldCgmaGludHMsIDAsIHNpemVvZihoaW50cykpOwotCQloaW50cy5haV9mYW1pbHkgPSBhZjsKLQkJaGludHMuYWlfc29ja3R5cGUgPSBTT0NLX0RHUkFNOwkvKmR1bW15Ki8KLQkJaGludHMuYWlfZmxhZ3MgPSBBSV9QQVNTSVZFOwotCQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JCUFDUVVJUkVfR0VUQUREUklORk9fTE9DSwotCQllcnJvciA9IGdldGFkZHJpbmZvKE5VTEwsICIwIiwgJmhpbnRzLCAmcmVzKTsKLQkJUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQkJLyogV2UgYXNzdW1lIHRoYXQgdGhvc2UgdGhyZWFkLXVuc2FmZSBnZXRhZGRyaW5mbygpIHZlcnNpb25zCi0JCSAgICphcmUqIHNhZmUgcmVnYXJkaW5nIHRoZWlyIHJldHVybiB2YWx1ZSwgaWUuIHRoYXQgYQotCQkgICBzdWJzZXF1ZW50IGNhbGwgdG8gZ2V0YWRkcmluZm8oKSBkb2VzIG5vdCBkZXN0cm95IHRoZQotCQkgICBvdXRjb21lIG9mIHRoZSBmaXJzdCBjYWxsLiAqLwotCQlSRUxFQVNFX0dFVEFERFJJTkZPX0xPQ0sKLQkJaWYgKGVycm9yKSB7Ci0JCQlzZXRfZ2FpZXJyb3IoZXJyb3IpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCXN3aXRjaCAocmVzLT5haV9mYW1pbHkpIHsKLQkJY2FzZSBBRl9JTkVUOgotCQkJc2l6ID0gNDsKLQkJCWJyZWFrOworICAgIG1lbXNldCgodm9pZCAqKSBhZGRyX3JldCwgJ1wwJywgc2l6ZW9mKCphZGRyX3JldCkpOworICAgIGlmIChuYW1lWzBdID09ICdcMCcpIHsKKyAgICAgICAgaW50IHNpejsKKyAgICAgICAgbWVtc2V0KCZoaW50cywgMCwgc2l6ZW9mKGhpbnRzKSk7CisgICAgICAgIGhpbnRzLmFpX2ZhbWlseSA9IGFmOworICAgICAgICBoaW50cy5haV9zb2NrdHlwZSA9IFNPQ0tfREdSQU07ICAgICAgICAgLypkdW1teSovCisgICAgICAgIGhpbnRzLmFpX2ZsYWdzID0gQUlfUEFTU0lWRTsKKyAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICBBQ1FVSVJFX0dFVEFERFJJTkZPX0xPQ0sKKyAgICAgICAgZXJyb3IgPSBnZXRhZGRyaW5mbyhOVUxMLCAiMCIsICZoaW50cywgJnJlcyk7CisgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgICAgIC8qIFdlIGFzc3VtZSB0aGF0IHRob3NlIHRocmVhZC11bnNhZmUgZ2V0YWRkcmluZm8oKSB2ZXJzaW9ucworICAgICAgICAgICAqYXJlKiBzYWZlIHJlZ2FyZGluZyB0aGVpciByZXR1cm4gdmFsdWUsIGllLiB0aGF0IGEKKyAgICAgICAgICAgc3Vic2VxdWVudCBjYWxsIHRvIGdldGFkZHJpbmZvKCkgZG9lcyBub3QgZGVzdHJveSB0aGUKKyAgICAgICAgICAgb3V0Y29tZSBvZiB0aGUgZmlyc3QgY2FsbC4gKi8KKyAgICAgICAgUkVMRUFTRV9HRVRBRERSSU5GT19MT0NLCisgICAgICAgIGlmIChlcnJvcikgeworICAgICAgICAgICAgc2V0X2dhaWVycm9yKGVycm9yKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKHJlcy0+YWlfZmFtaWx5KSB7CisgICAgICAgIGNhc2UgQUZfSU5FVDoKKyAgICAgICAgICAgIHNpeiA9IDQ7CisgICAgICAgICAgICBicmVhazsKICNpZmRlZiBFTkFCTEVfSVBWNgotCQljYXNlIEFGX0lORVQ2OgotCQkJc2l6ID0gMTY7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBBRl9JTkVUNjoKKyAgICAgICAgICAgIHNpeiA9IDE2OworICAgICAgICAgICAgYnJlYWs7CiAjZW5kaWYKLQkJZGVmYXVsdDoKLQkJCWZyZWVhZGRyaW5mbyhyZXMpOwotCQkJUHlFcnJfU2V0U3RyaW5nKHNvY2tldF9lcnJvciwKLQkJCQkidW5zdXBwb3J0ZWQgYWRkcmVzcyBmYW1pbHkiKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlpZiAocmVzLT5haV9uZXh0KSB7Ci0JCQlmcmVlYWRkcmluZm8ocmVzKTsKLQkJCVB5RXJyX1NldFN0cmluZyhzb2NrZXRfZXJyb3IsCi0JCQkJIndpbGRjYXJkIHJlc29sdmVkIHRvIG11bHRpcGxlIGFkZHJlc3MiKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlpZiAocmVzLT5haV9hZGRybGVuIDwgYWRkcl9yZXRfc2l6ZSkKLQkJCWFkZHJfcmV0X3NpemUgPSByZXMtPmFpX2FkZHJsZW47Ci0JCW1lbWNweShhZGRyX3JldCwgcmVzLT5haV9hZGRyLCBhZGRyX3JldF9zaXplKTsKLQkJZnJlZWFkZHJpbmZvKHJlcyk7Ci0JCXJldHVybiBzaXo7Ci0JfQotCWlmIChuYW1lWzBdID09ICc8JyAmJiBzdHJjbXAobmFtZSwgIjxicm9hZGNhc3Q+IikgPT0gMCkgewotCQlzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNpbjsKLQkJaWYgKGFmICE9IEFGX0lORVQgJiYgYWYgIT0gQUZfVU5TUEVDKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoc29ja2V0X2Vycm9yLAotCQkJCSJhZGRyZXNzIGZhbWlseSBtaXNtYXRjaGVkIik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJc2luID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKWFkZHJfcmV0OwotCQltZW1zZXQoKHZvaWQgKikgc2luLCAnXDAnLCBzaXplb2YoKnNpbikpOwotCQlzaW4tPnNpbl9mYW1pbHkgPSBBRl9JTkVUOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZnJlZWFkZHJpbmZvKHJlcyk7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoc29ja2V0X2Vycm9yLAorICAgICAgICAgICAgICAgICJ1bnN1cHBvcnRlZCBhZGRyZXNzIGZhbWlseSIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGlmIChyZXMtPmFpX25leHQpIHsKKyAgICAgICAgICAgIGZyZWVhZGRyaW5mbyhyZXMpOworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHNvY2tldF9lcnJvciwKKyAgICAgICAgICAgICAgICAid2lsZGNhcmQgcmVzb2x2ZWQgdG8gbXVsdGlwbGUgYWRkcmVzcyIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGlmIChyZXMtPmFpX2FkZHJsZW4gPCBhZGRyX3JldF9zaXplKQorICAgICAgICAgICAgYWRkcl9yZXRfc2l6ZSA9IHJlcy0+YWlfYWRkcmxlbjsKKyAgICAgICAgbWVtY3B5KGFkZHJfcmV0LCByZXMtPmFpX2FkZHIsIGFkZHJfcmV0X3NpemUpOworICAgICAgICBmcmVlYWRkcmluZm8ocmVzKTsKKyAgICAgICAgcmV0dXJuIHNpejsKKyAgICB9CisgICAgaWYgKG5hbWVbMF0gPT0gJzwnICYmIHN0cmNtcChuYW1lLCAiPGJyb2FkY2FzdD4iKSA9PSAwKSB7CisgICAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbiAqc2luOworICAgICAgICBpZiAoYWYgIT0gQUZfSU5FVCAmJiBhZiAhPSBBRl9VTlNQRUMpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhzb2NrZXRfZXJyb3IsCisgICAgICAgICAgICAgICAgImFkZHJlc3MgZmFtaWx5IG1pc21hdGNoZWQiKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBzaW4gPSAoc3RydWN0IHNvY2thZGRyX2luICopYWRkcl9yZXQ7CisgICAgICAgIG1lbXNldCgodm9pZCAqKSBzaW4sICdcMCcsIHNpemVvZigqc2luKSk7CisgICAgICAgIHNpbi0+c2luX2ZhbWlseSA9IEFGX0lORVQ7CiAjaWZkZWYgSEFWRV9TT0NLQUREUl9TQV9MRU4KLQkJc2luLT5zaW5fbGVuID0gc2l6ZW9mKCpzaW4pOworICAgICAgICBzaW4tPnNpbl9sZW4gPSBzaXplb2YoKnNpbik7CiAjZW5kaWYKLQkJc2luLT5zaW5fYWRkci5zX2FkZHIgPSBJTkFERFJfQlJPQURDQVNUOwotCQlyZXR1cm4gc2l6ZW9mKHNpbi0+c2luX2FkZHIpOwotCX0KLQlpZiAoc3NjYW5mKG5hbWUsICIlZC4lZC4lZC4lZCVjIiwgJmQxLCAmZDIsICZkMywgJmQ0LCAmY2gpID09IDQgJiYKLQkgICAgMCA8PSBkMSAmJiBkMSA8PSAyNTUgJiYgMCA8PSBkMiAmJiBkMiA8PSAyNTUgJiYKLQkgICAgMCA8PSBkMyAmJiBkMyA8PSAyNTUgJiYgMCA8PSBkNCAmJiBkNCA8PSAyNTUpIHsKLQkJc3RydWN0IHNvY2thZGRyX2luICpzaW47Ci0JCXNpbiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKilhZGRyX3JldDsKLQkJc2luLT5zaW5fYWRkci5zX2FkZHIgPSBodG9ubCgKLQkJCSgobG9uZykgZDEgPDwgMjQpIHwgKChsb25nKSBkMiA8PCAxNikgfAotCQkJKChsb25nKSBkMyA8PCA4KSB8ICgobG9uZykgZDQgPDwgMCkpOwotCQlzaW4tPnNpbl9mYW1pbHkgPSBBRl9JTkVUOworICAgICAgICBzaW4tPnNpbl9hZGRyLnNfYWRkciA9IElOQUREUl9CUk9BRENBU1Q7CisgICAgICAgIHJldHVybiBzaXplb2Yoc2luLT5zaW5fYWRkcik7CisgICAgfQorICAgIGlmIChzc2NhbmYobmFtZSwgIiVkLiVkLiVkLiVkJWMiLCAmZDEsICZkMiwgJmQzLCAmZDQsICZjaCkgPT0gNCAmJgorICAgICAgICAwIDw9IGQxICYmIGQxIDw9IDI1NSAmJiAwIDw9IGQyICYmIGQyIDw9IDI1NSAmJgorICAgICAgICAwIDw9IGQzICYmIGQzIDw9IDI1NSAmJiAwIDw9IGQ0ICYmIGQ0IDw9IDI1NSkgeworICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNpbjsKKyAgICAgICAgc2luID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKWFkZHJfcmV0OworICAgICAgICBzaW4tPnNpbl9hZGRyLnNfYWRkciA9IGh0b25sKAorICAgICAgICAgICAgKChsb25nKSBkMSA8PCAyNCkgfCAoKGxvbmcpIGQyIDw8IDE2KSB8CisgICAgICAgICAgICAoKGxvbmcpIGQzIDw8IDgpIHwgKChsb25nKSBkNCA8PCAwKSk7CisgICAgICAgIHNpbi0+c2luX2ZhbWlseSA9IEFGX0lORVQ7CiAjaWZkZWYgSEFWRV9TT0NLQUREUl9TQV9MRU4KLQkJc2luLT5zaW5fbGVuID0gc2l6ZW9mKCpzaW4pOworICAgICAgICBzaW4tPnNpbl9sZW4gPSBzaXplb2YoKnNpbik7CiAjZW5kaWYKLQkJcmV0dXJuIDQ7Ci0JfQotCW1lbXNldCgmaGludHMsIDAsIHNpemVvZihoaW50cykpOwotCWhpbnRzLmFpX2ZhbWlseSA9IGFmOwotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlBQ1FVSVJFX0dFVEFERFJJTkZPX0xPQ0sKLQllcnJvciA9IGdldGFkZHJpbmZvKG5hbWUsIE5VTEwsICZoaW50cywgJnJlcyk7CisgICAgICAgIHJldHVybiA0OworICAgIH0KKyAgICBtZW1zZXQoJmhpbnRzLCAwLCBzaXplb2YoaGludHMpKTsKKyAgICBoaW50cy5haV9mYW1pbHkgPSBhZjsKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgQUNRVUlSRV9HRVRBRERSSU5GT19MT0NLCisgICAgZXJyb3IgPSBnZXRhZGRyaW5mbyhuYW1lLCBOVUxMLCAmaGludHMsICZyZXMpOwogI2lmIGRlZmluZWQoX19kaWdpdGFsX18pICYmIGRlZmluZWQoX191bml4X18pCi0JaWYgKGVycm9yID09IEVBSV9OT05BTUUgJiYgYWYgPT0gQUZfVU5TUEVDKSB7Ci0JCS8qIE9uIFRydTY0IFY1LjEsIG51bWVyaWMtdG8tYWRkciBjb252ZXJzaW9uIGZhaWxzCi0JCSAgIGlmIG5vIGFkZHJlc3MgZmFtaWx5IGlzIGdpdmVuLiBBc3N1bWUgSVB2NCBmb3Igbm93LiovCi0JCWhpbnRzLmFpX2ZhbWlseSA9IEFGX0lORVQ7Ci0JCWVycm9yID0gZ2V0YWRkcmluZm8obmFtZSwgTlVMTCwgJmhpbnRzLCAmcmVzKTsKLQl9CisgICAgaWYgKGVycm9yID09IEVBSV9OT05BTUUgJiYgYWYgPT0gQUZfVU5TUEVDKSB7CisgICAgICAgIC8qIE9uIFRydTY0IFY1LjEsIG51bWVyaWMtdG8tYWRkciBjb252ZXJzaW9uIGZhaWxzCisgICAgICAgICAgIGlmIG5vIGFkZHJlc3MgZmFtaWx5IGlzIGdpdmVuLiBBc3N1bWUgSVB2NCBmb3Igbm93LiovCisgICAgICAgIGhpbnRzLmFpX2ZhbWlseSA9IEFGX0lORVQ7CisgICAgICAgIGVycm9yID0gZ2V0YWRkcmluZm8obmFtZSwgTlVMTCwgJmhpbnRzLCAmcmVzKTsKKyAgICB9CiAjZW5kaWYKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCVJFTEVBU0VfR0VUQUREUklORk9fTE9DSyAgLyogc2VlIGNvbW1lbnQgaW4gc2V0aXBhZGRyKCkgKi8KLQlpZiAoZXJyb3IpIHsKLQkJc2V0X2dhaWVycm9yKGVycm9yKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAocmVzLT5haV9hZGRybGVuIDwgYWRkcl9yZXRfc2l6ZSkKLQkJYWRkcl9yZXRfc2l6ZSA9IHJlcy0+YWlfYWRkcmxlbjsKLQltZW1jcHkoKGNoYXIgKikgYWRkcl9yZXQsIHJlcy0+YWlfYWRkciwgYWRkcl9yZXRfc2l6ZSk7Ci0JZnJlZWFkZHJpbmZvKHJlcyk7Ci0Jc3dpdGNoIChhZGRyX3JldC0+c2FfZmFtaWx5KSB7Ci0JY2FzZSBBRl9JTkVUOgotCQlyZXR1cm4gNDsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIFJFTEVBU0VfR0VUQUREUklORk9fTE9DSyAgLyogc2VlIGNvbW1lbnQgaW4gc2V0aXBhZGRyKCkgKi8KKyAgICBpZiAoZXJyb3IpIHsKKyAgICAgICAgc2V0X2dhaWVycm9yKGVycm9yKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAocmVzLT5haV9hZGRybGVuIDwgYWRkcl9yZXRfc2l6ZSkKKyAgICAgICAgYWRkcl9yZXRfc2l6ZSA9IHJlcy0+YWlfYWRkcmxlbjsKKyAgICBtZW1jcHkoKGNoYXIgKikgYWRkcl9yZXQsIHJlcy0+YWlfYWRkciwgYWRkcl9yZXRfc2l6ZSk7CisgICAgZnJlZWFkZHJpbmZvKHJlcyk7CisgICAgc3dpdGNoIChhZGRyX3JldC0+c2FfZmFtaWx5KSB7CisgICAgY2FzZSBBRl9JTkVUOgorICAgICAgICByZXR1cm4gNDsKICNpZmRlZiBFTkFCTEVfSVBWNgotCWNhc2UgQUZfSU5FVDY6Ci0JCXJldHVybiAxNjsKKyAgICBjYXNlIEFGX0lORVQ2OgorICAgICAgICByZXR1cm4gMTY7CiAjZW5kaWYKLQlkZWZhdWx0OgotCQlQeUVycl9TZXRTdHJpbmcoc29ja2V0X2Vycm9yLCAidW5rbm93biBhZGRyZXNzIGZhbWlseSIpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIGRlZmF1bHQ6CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhzb2NrZXRfZXJyb3IsICJ1bmtub3duIGFkZHJlc3MgZmFtaWx5Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiB9CiAKIApAQCAtOTAyLDE2ICs5MDIsMTYgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBtYWtlaXBhZGRyKHN0cnVjdCBzb2NrYWRkciAqYWRkciwgaW50IGFkZHJsZW4pCiB7Ci0JY2hhciBidWZbTklfTUFYSE9TVF07Ci0JaW50IGVycm9yOworICAgIGNoYXIgYnVmW05JX01BWEhPU1RdOworICAgIGludCBlcnJvcjsKIAotCWVycm9yID0gZ2V0bmFtZWluZm8oYWRkciwgYWRkcmxlbiwgYnVmLCBzaXplb2YoYnVmKSwgTlVMTCwgMCwKLQkJTklfTlVNRVJJQ0hPU1QpOwotCWlmIChlcnJvcikgewotCQlzZXRfZ2FpZXJyb3IoZXJyb3IpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmKTsKKyAgICBlcnJvciA9IGdldG5hbWVpbmZvKGFkZHIsIGFkZHJsZW4sIGJ1Ziwgc2l6ZW9mKGJ1ZiksIE5VTEwsIDAsCisgICAgICAgIE5JX05VTUVSSUNIT1NUKTsKKyAgICBpZiAoZXJyb3IpIHsKKyAgICAgICAgc2V0X2dhaWVycm9yKGVycm9yKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CiB9CiAKIApAQCAtOTIzLDI0ICs5MjMsMjQgQEAKIHN0YXRpYyBpbnQKIHNldGJkYWRkcihjaGFyICpuYW1lLCBiZGFkZHJfdCAqYmRhZGRyKQogewotCXVuc2lnbmVkIGludCBiMCwgYjEsIGIyLCBiMywgYjQsIGI1OwotCWNoYXIgY2g7Ci0JaW50IG47CisgICAgdW5zaWduZWQgaW50IGIwLCBiMSwgYjIsIGIzLCBiNCwgYjU7CisgICAgY2hhciBjaDsKKyAgICBpbnQgbjsKIAotCW4gPSBzc2NhbmYobmFtZSwgIiVYOiVYOiVYOiVYOiVYOiVYJWMiLAotCQkgICAmYjUsICZiNCwgJmIzLCAmYjIsICZiMSwgJmIwLCAmY2gpOwotCWlmIChuID09IDYgJiYgKGIwIHwgYjEgfCBiMiB8IGIzIHwgYjQgfCBiNSkgPCAyNTYpIHsKLQkJYmRhZGRyLT5iWzBdID0gYjA7Ci0JCWJkYWRkci0+YlsxXSA9IGIxOwotCQliZGFkZHItPmJbMl0gPSBiMjsKLQkJYmRhZGRyLT5iWzNdID0gYjM7Ci0JCWJkYWRkci0+Yls0XSA9IGI0OwotCQliZGFkZHItPmJbNV0gPSBiNTsKLQkJcmV0dXJuIDY7Ci0JfSBlbHNlIHsKLQkJUHlFcnJfU2V0U3RyaW5nKHNvY2tldF9lcnJvciwgImJhZCBibHVldG9vdGggYWRkcmVzcyIpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIG4gPSBzc2NhbmYobmFtZSwgIiVYOiVYOiVYOiVYOiVYOiVYJWMiLAorICAgICAgICAgICAgICAgJmI1LCAmYjQsICZiMywgJmIyLCAmYjEsICZiMCwgJmNoKTsKKyAgICBpZiAobiA9PSA2ICYmIChiMCB8IGIxIHwgYjIgfCBiMyB8IGI0IHwgYjUpIDwgMjU2KSB7CisgICAgICAgIGJkYWRkci0+YlswXSA9IGIwOworICAgICAgICBiZGFkZHItPmJbMV0gPSBiMTsKKyAgICAgICAgYmRhZGRyLT5iWzJdID0gYjI7CisgICAgICAgIGJkYWRkci0+YlszXSA9IGIzOworICAgICAgICBiZGFkZHItPmJbNF0gPSBiNDsKKyAgICAgICAgYmRhZGRyLT5iWzVdID0gYjU7CisgICAgICAgIHJldHVybiA2OworICAgIH0gZWxzZSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhzb2NrZXRfZXJyb3IsICJiYWQgYmx1ZXRvb3RoIGFkZHJlc3MiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIH0KIAogLyogQ3JlYXRlIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBCbHVldG9vdGggYWRkcmVzcy4gIFRoaXMgaXMgYWx3YXlzIGEKQEAgLTk1MCwxMiArOTUwLDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogbWFrZWJkYWRkcihiZGFkZHJfdCAqYmRhZGRyKQogewotCWNoYXIgYnVmWyg2ICogMikgKyA1ICsgMV07CisgICAgY2hhciBidWZbKDYgKiAyKSArIDUgKyAxXTsKIAotCXNwcmludGYoYnVmLCAiJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlgiLAotCQliZGFkZHItPmJbNV0sIGJkYWRkci0+Yls0XSwgYmRhZGRyLT5iWzNdLAotCQliZGFkZHItPmJbMl0sIGJkYWRkci0+YlsxXSwgYmRhZGRyLT5iWzBdKTsKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOworICAgIHNwcmludGYoYnVmLCAiJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlgiLAorICAgICAgICBiZGFkZHItPmJbNV0sIGJkYWRkci0+Yls0XSwgYmRhZGRyLT5iWzNdLAorICAgICAgICBiZGFkZHItPmJbMl0sIGJkYWRkci0+YlsxXSwgYmRhZGRyLT5iWzBdKTsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOwogfQogI2VuZGlmCiAKQEAgLTk2OSwxOTkgKzk2OSwxOTkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBtYWtlc29ja2FkZHIoaW50IHNvY2tmZCwgc3RydWN0IHNvY2thZGRyICphZGRyLCBpbnQgYWRkcmxlbiwgaW50IHByb3RvKQogewotCWlmIChhZGRybGVuID09IDApIHsKLQkJLyogTm8gYWRkcmVzcyAtLSBtYXkgYmUgcmVjdmZyb20oKSBmcm9tIGtub3duIHNvY2tldCAqLwotCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCXJldHVybiBQeV9Ob25lOwotCX0KKyAgICBpZiAoYWRkcmxlbiA9PSAwKSB7CisgICAgICAgIC8qIE5vIGFkZHJlc3MgLS0gbWF5IGJlIHJlY3Zmcm9tKCkgZnJvbSBrbm93biBzb2NrZXQgKi8KKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICB9CiAKICNpZmRlZiBfX0JFT1NfXwotCS8qIFhYWDogQmVPUyB2ZXJzaW9uIG9mIGFjY2VwdCgpIGRvZXNuJ3Qgc2V0IGZhbWlseSBjb3JyZWN0bHkgKi8KLQlhZGRyLT5zYV9mYW1pbHkgPSBBRl9JTkVUOworICAgIC8qIFhYWDogQmVPUyB2ZXJzaW9uIG9mIGFjY2VwdCgpIGRvZXNuJ3Qgc2V0IGZhbWlseSBjb3JyZWN0bHkgKi8KKyAgICBhZGRyLT5zYV9mYW1pbHkgPSBBRl9JTkVUOwogI2VuZGlmCiAKLQlzd2l0Y2ggKGFkZHItPnNhX2ZhbWlseSkgeworICAgIHN3aXRjaCAoYWRkci0+c2FfZmFtaWx5KSB7CiAKLQljYXNlIEFGX0lORVQ6Ci0JewotCQlzdHJ1Y3Qgc29ja2FkZHJfaW4gKmE7Ci0JCVB5T2JqZWN0ICphZGRyb2JqID0gbWFrZWlwYWRkcihhZGRyLCBzaXplb2YoKmEpKTsKLQkJUHlPYmplY3QgKnJldCA9IE5VTEw7Ci0JCWlmIChhZGRyb2JqKSB7Ci0JCQlhID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKWFkZHI7Ci0JCQlyZXQgPSBQeV9CdWlsZFZhbHVlKCJPaSIsIGFkZHJvYmosIG50b2hzKGEtPnNpbl9wb3J0KSk7Ci0JCQlQeV9ERUNSRUYoYWRkcm9iaik7Ci0JCX0KLQkJcmV0dXJuIHJldDsKLQl9CisgICAgY2FzZSBBRl9JTkVUOgorICAgIHsKKyAgICAgICAgc3RydWN0IHNvY2thZGRyX2luICphOworICAgICAgICBQeU9iamVjdCAqYWRkcm9iaiA9IG1ha2VpcGFkZHIoYWRkciwgc2l6ZW9mKCphKSk7CisgICAgICAgIFB5T2JqZWN0ICpyZXQgPSBOVUxMOworICAgICAgICBpZiAoYWRkcm9iaikgeworICAgICAgICAgICAgYSA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKilhZGRyOworICAgICAgICAgICAgcmV0ID0gUHlfQnVpbGRWYWx1ZSgiT2kiLCBhZGRyb2JqLCBudG9ocyhhLT5zaW5fcG9ydCkpOworICAgICAgICAgICAgUHlfREVDUkVGKGFkZHJvYmopOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQogCiAjaWYgZGVmaW5lZChBRl9VTklYKQotCWNhc2UgQUZfVU5JWDoKLQl7Ci0JCXN0cnVjdCBzb2NrYWRkcl91biAqYSA9IChzdHJ1Y3Qgc29ja2FkZHJfdW4gKikgYWRkcjsKKyAgICBjYXNlIEFGX1VOSVg6CisgICAgeworICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfdW4gKmEgPSAoc3RydWN0IHNvY2thZGRyX3VuICopIGFkZHI7CiAjaWZkZWYgbGludXgKLQkJaWYgKGEtPnN1bl9wYXRoWzBdID09IDApIHsgIC8qIExpbnV4IGFic3RyYWN0IG5hbWVzcGFjZSAqLwotCQkJYWRkcmxlbiAtPSBvZmZzZXRvZihzdHJ1Y3Qgc29ja2FkZHJfdW4sIHN1bl9wYXRoKTsKLQkJCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShhLT5zdW5fcGF0aCwKLQkJCQkJCQkgIGFkZHJsZW4pOwotCQl9Ci0JCWVsc2UKKyAgICAgICAgaWYgKGEtPnN1bl9wYXRoWzBdID09IDApIHsgIC8qIExpbnV4IGFic3RyYWN0IG5hbWVzcGFjZSAqLworICAgICAgICAgICAgYWRkcmxlbiAtPSBvZmZzZXRvZihzdHJ1Y3Qgc29ja2FkZHJfdW4sIHN1bl9wYXRoKTsKKyAgICAgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShhLT5zdW5fcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRybGVuKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCiAjZW5kaWYgLyogbGludXggKi8KLQkJewotCQkJLyogcmVndWxhciBOVUxMLXRlcm1pbmF0ZWQgc3RyaW5nICovCi0JCQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhhLT5zdW5fcGF0aCk7Ci0JCX0KLQl9CisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIHJlZ3VsYXIgTlVMTC10ZXJtaW5hdGVkIHN0cmluZyAqLworICAgICAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoYS0+c3VuX3BhdGgpOworICAgICAgICB9CisgICAgfQogI2VuZGlmIC8qIEFGX1VOSVggKi8KIAogI2lmIGRlZmluZWQoQUZfTkVUTElOSykKICAgICAgICBjYXNlIEFGX05FVExJTks6CiAgICAgICAgewotICAgICAgICAgICAgICAgc3RydWN0IHNvY2thZGRyX25sICphID0gKHN0cnVjdCBzb2NrYWRkcl9ubCAqKSBhZGRyOwotICAgICAgICAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIklJIiwgYS0+bmxfcGlkLCBhLT5ubF9ncm91cHMpOworICAgICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfbmwgKmEgPSAoc3RydWN0IHNvY2thZGRyX25sICopIGFkZHI7CisgICAgICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJJSSIsIGEtPm5sX3BpZCwgYS0+bmxfZ3JvdXBzKTsKICAgICAgICB9CiAjZW5kaWYgLyogQUZfTkVUTElOSyAqLwogCiAjaWZkZWYgRU5BQkxFX0lQVjYKLQljYXNlIEFGX0lORVQ2OgotCXsKLQkJc3RydWN0IHNvY2thZGRyX2luNiAqYTsKLQkJUHlPYmplY3QgKmFkZHJvYmogPSBtYWtlaXBhZGRyKGFkZHIsIHNpemVvZigqYSkpOwotCQlQeU9iamVjdCAqcmV0ID0gTlVMTDsKLQkJaWYgKGFkZHJvYmopIHsKLQkJCWEgPSAoc3RydWN0IHNvY2thZGRyX2luNiAqKWFkZHI7Ci0JCQlyZXQgPSBQeV9CdWlsZFZhbHVlKCJPaWlpIiwKLQkJCQkJICAgIGFkZHJvYmosCi0JCQkJCSAgICBudG9ocyhhLT5zaW42X3BvcnQpLAotCQkJCQkgICAgYS0+c2luNl9mbG93aW5mbywKLQkJCQkJICAgIGEtPnNpbjZfc2NvcGVfaWQpOwotCQkJUHlfREVDUkVGKGFkZHJvYmopOwotCQl9Ci0JCXJldHVybiByZXQ7Ci0JfQorICAgIGNhc2UgQUZfSU5FVDY6CisgICAgeworICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW42ICphOworICAgICAgICBQeU9iamVjdCAqYWRkcm9iaiA9IG1ha2VpcGFkZHIoYWRkciwgc2l6ZW9mKCphKSk7CisgICAgICAgIFB5T2JqZWN0ICpyZXQgPSBOVUxMOworICAgICAgICBpZiAoYWRkcm9iaikgeworICAgICAgICAgICAgYSA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopYWRkcjsKKyAgICAgICAgICAgIHJldCA9IFB5X0J1aWxkVmFsdWUoIk9paWkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudG9ocyhhLT5zaW42X3BvcnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLT5zaW42X2Zsb3dpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLT5zaW42X3Njb3BlX2lkKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihhZGRyb2JqKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0OworICAgIH0KICNlbmRpZgogCiAjaWZkZWYgVVNFX0JMVUVUT09USAotCWNhc2UgQUZfQkxVRVRPT1RIOgotCQlzd2l0Y2ggKHByb3RvKSB7CisgICAgY2FzZSBBRl9CTFVFVE9PVEg6CisgICAgICAgIHN3aXRjaCAocHJvdG8pIHsKIAotCQljYXNlIEJUUFJPVE9fTDJDQVA6Ci0JCXsKLQkJCXN0cnVjdCBzb2NrYWRkcl9sMiAqYSA9IChzdHJ1Y3Qgc29ja2FkZHJfbDIgKikgYWRkcjsKLQkJCVB5T2JqZWN0ICphZGRyb2JqID0gbWFrZWJkYWRkcigmX0JUX0wyX01FTUIoYSwgYmRhZGRyKSk7Ci0JCQlQeU9iamVjdCAqcmV0ID0gTlVMTDsKLQkJCWlmIChhZGRyb2JqKSB7Ci0JCQkJcmV0ID0gUHlfQnVpbGRWYWx1ZSgiT2kiLAotCQkJCQkJICAgIGFkZHJvYmosCi0JCQkJCQkgICAgX0JUX0wyX01FTUIoYSwgcHNtKSk7Ci0JCQkJUHlfREVDUkVGKGFkZHJvYmopOwotCQkJfQotCQkJcmV0dXJuIHJldDsKLQkJfQorICAgICAgICBjYXNlIEJUUFJPVE9fTDJDQVA6CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cnVjdCBzb2NrYWRkcl9sMiAqYSA9IChzdHJ1Y3Qgc29ja2FkZHJfbDIgKikgYWRkcjsKKyAgICAgICAgICAgIFB5T2JqZWN0ICphZGRyb2JqID0gbWFrZWJkYWRkcigmX0JUX0wyX01FTUIoYSwgYmRhZGRyKSk7CisgICAgICAgICAgICBQeU9iamVjdCAqcmV0ID0gTlVMTDsKKyAgICAgICAgICAgIGlmIChhZGRyb2JqKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gUHlfQnVpbGRWYWx1ZSgiT2kiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcm9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9CVF9MMl9NRU1CKGEsIHBzbSkpOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihhZGRyb2JqKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KIAotCQljYXNlIEJUUFJPVE9fUkZDT01NOgotCQl7Ci0JCQlzdHJ1Y3Qgc29ja2FkZHJfcmMgKmEgPSAoc3RydWN0IHNvY2thZGRyX3JjICopIGFkZHI7Ci0JCQlQeU9iamVjdCAqYWRkcm9iaiA9IG1ha2ViZGFkZHIoJl9CVF9SQ19NRU1CKGEsIGJkYWRkcikpOwotCQkJUHlPYmplY3QgKnJldCA9IE5VTEw7Ci0JCQlpZiAoYWRkcm9iaikgewotCQkJCXJldCA9IFB5X0J1aWxkVmFsdWUoIk9pIiwKLQkJCQkJCSAgICBhZGRyb2JqLAotCQkJCQkJICAgIF9CVF9SQ19NRU1CKGEsIGNoYW5uZWwpKTsKLQkJCQlQeV9ERUNSRUYoYWRkcm9iaik7Ci0JCQl9Ci0JCQlyZXR1cm4gcmV0OwotCQl9CisgICAgICAgIGNhc2UgQlRQUk9UT19SRkNPTU06CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cnVjdCBzb2NrYWRkcl9yYyAqYSA9IChzdHJ1Y3Qgc29ja2FkZHJfcmMgKikgYWRkcjsKKyAgICAgICAgICAgIFB5T2JqZWN0ICphZGRyb2JqID0gbWFrZWJkYWRkcigmX0JUX1JDX01FTUIoYSwgYmRhZGRyKSk7CisgICAgICAgICAgICBQeU9iamVjdCAqcmV0ID0gTlVMTDsKKyAgICAgICAgICAgIGlmIChhZGRyb2JqKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gUHlfQnVpbGRWYWx1ZSgiT2kiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcm9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9CVF9SQ19NRU1CKGEsIGNoYW5uZWwpKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoYWRkcm9iaik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CiAKLQkJY2FzZSBCVFBST1RPX0hDSToKLQkJewotCQkJc3RydWN0IHNvY2thZGRyX2hjaSAqYSA9IChzdHJ1Y3Qgc29ja2FkZHJfaGNpICopIGFkZHI7Ci0JCQlQeU9iamVjdCAqcmV0ID0gTlVMTDsKLQkJCXJldCA9IFB5X0J1aWxkVmFsdWUoImkiLCBfQlRfSENJX01FTUIoYSwgZGV2KSk7Ci0JCQlyZXR1cm4gcmV0OwotCQl9CisgICAgICAgIGNhc2UgQlRQUk9UT19IQ0k6CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cnVjdCBzb2NrYWRkcl9oY2kgKmEgPSAoc3RydWN0IHNvY2thZGRyX2hjaSAqKSBhZGRyOworICAgICAgICAgICAgUHlPYmplY3QgKnJldCA9IE5VTEw7CisgICAgICAgICAgICByZXQgPSBQeV9CdWlsZFZhbHVlKCJpIiwgX0JUX0hDSV9NRU1CKGEsIGRldikpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQogCiAjaWYgIWRlZmluZWQoX19GcmVlQlNEX18pCi0JCWNhc2UgQlRQUk9UT19TQ086Ci0JCXsKLQkJCXN0cnVjdCBzb2NrYWRkcl9zY28gKmEgPSAoc3RydWN0IHNvY2thZGRyX3NjbyAqKSBhZGRyOwotCQkJcmV0dXJuIG1ha2ViZGFkZHIoJl9CVF9TQ09fTUVNQihhLCBiZGFkZHIpKTsKLQkJfQorICAgICAgICBjYXNlIEJUUFJPVE9fU0NPOgorICAgICAgICB7CisgICAgICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfc2NvICphID0gKHN0cnVjdCBzb2NrYWRkcl9zY28gKikgYWRkcjsKKyAgICAgICAgICAgIHJldHVybiBtYWtlYmRhZGRyKCZfQlRfU0NPX01FTUIoYSwgYmRhZGRyKSk7CisgICAgICAgIH0KICNlbmRpZgogCi0JCWRlZmF1bHQ6Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkJIlVua25vd24gQmx1ZXRvb3RoIHByb3RvY29sIik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVua25vd24gQmx1ZXRvb3RoIHByb3RvY29sIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQogI2VuZGlmCiAKICNpZmRlZiBIQVZFX05FVFBBQ0tFVF9QQUNLRVRfSAotCWNhc2UgQUZfUEFDS0VUOgotCXsKLQkJc3RydWN0IHNvY2thZGRyX2xsICphID0gKHN0cnVjdCBzb2NrYWRkcl9sbCAqKWFkZHI7Ci0JCWNoYXIgKmlmbmFtZSA9ICIiOwotCQlzdHJ1Y3QgaWZyZXEgaWZyOwotCQkvKiBuZWVkIHRvIGxvb2sgdXAgaW50ZXJmYWNlIG5hbWUgZ2l2ZSBpbmRleCAqLwotCQlpZiAoYS0+c2xsX2lmaW5kZXgpIHsKLQkJCWlmci5pZnJfaWZpbmRleCA9IGEtPnNsbF9pZmluZGV4OwotCQkJaWYgKGlvY3RsKHNvY2tmZCwgU0lPQ0dJRk5BTUUsICZpZnIpID09IDApCi0JCQkJaWZuYW1lID0gaWZyLmlmcl9uYW1lOwotCQl9Ci0JCXJldHVybiBQeV9CdWlsZFZhbHVlKCJzaGJocyMiLAotCQkJCSAgICAgaWZuYW1lLAotCQkJCSAgICAgbnRvaHMoYS0+c2xsX3Byb3RvY29sKSwKLQkJCQkgICAgIGEtPnNsbF9wa3R0eXBlLAotCQkJCSAgICAgYS0+c2xsX2hhdHlwZSwKLQkJCQkgICAgIGEtPnNsbF9hZGRyLAotCQkJCSAgICAgYS0+c2xsX2hhbGVuKTsKLQl9CisgICAgY2FzZSBBRl9QQUNLRVQ6CisgICAgeworICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfbGwgKmEgPSAoc3RydWN0IHNvY2thZGRyX2xsICopYWRkcjsKKyAgICAgICAgY2hhciAqaWZuYW1lID0gIiI7CisgICAgICAgIHN0cnVjdCBpZnJlcSBpZnI7CisgICAgICAgIC8qIG5lZWQgdG8gbG9vayB1cCBpbnRlcmZhY2UgbmFtZSBnaXZlIGluZGV4ICovCisgICAgICAgIGlmIChhLT5zbGxfaWZpbmRleCkgeworICAgICAgICAgICAgaWZyLmlmcl9pZmluZGV4ID0gYS0+c2xsX2lmaW5kZXg7CisgICAgICAgICAgICBpZiAoaW9jdGwoc29ja2ZkLCBTSU9DR0lGTkFNRSwgJmlmcikgPT0gMCkKKyAgICAgICAgICAgICAgICBpZm5hbWUgPSBpZnIuaWZyX25hbWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoInNoYmhzIyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnRvaHMoYS0+c2xsX3Byb3RvY29sKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS0+c2xsX3BrdHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEtPnNsbF9oYXR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEtPnNsbF9hZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLT5zbGxfaGFsZW4pOworICAgIH0KICNlbmRpZgogCiAjaWZkZWYgSEFWRV9MSU5VWF9USVBDX0gKLQljYXNlIEFGX1RJUEM6Ci0JewotCQlzdHJ1Y3Qgc29ja2FkZHJfdGlwYyAqYSA9IChzdHJ1Y3Qgc29ja2FkZHJfdGlwYyAqKSBhZGRyOwotCQlpZiAoYS0+YWRkcnR5cGUgPT0gVElQQ19BRERSX05BTUVTRVEpIHsKLQkJCXJldHVybiBQeV9CdWlsZFZhbHVlKCJJSUlJSSIsCi0JCQkJCWEtPmFkZHJ0eXBlLAotCQkJCQlhLT5hZGRyLm5hbWVzZXEudHlwZSwKLQkJCQkJYS0+YWRkci5uYW1lc2VxLmxvd2VyLAotCQkJCQlhLT5hZGRyLm5hbWVzZXEudXBwZXIsCi0JCQkJCWEtPnNjb3BlKTsKLQkJfSBlbHNlIGlmIChhLT5hZGRydHlwZSA9PSBUSVBDX0FERFJfTkFNRSkgewotCQkJcmV0dXJuIFB5X0J1aWxkVmFsdWUoIklJSUlJIiwKLQkJCQkJYS0+YWRkcnR5cGUsCi0JCQkJCWEtPmFkZHIubmFtZS5uYW1lLnR5cGUsCi0JCQkJCWEtPmFkZHIubmFtZS5uYW1lLmluc3RhbmNlLAotCQkJCQlhLT5hZGRyLm5hbWUubmFtZS5pbnN0YW5jZSwKLQkJCQkJYS0+c2NvcGUpOwotCQl9IGVsc2UgaWYgKGEtPmFkZHJ0eXBlID09IFRJUENfQUREUl9JRCkgewotCQkJcmV0dXJuIFB5X0J1aWxkVmFsdWUoIklJSUlJIiwKLQkJCQkJYS0+YWRkcnR5cGUsCi0JCQkJCWEtPmFkZHIuaWQubm9kZSwKLQkJCQkJYS0+YWRkci5pZC5yZWYsCi0JCQkJCTAsCi0JCQkJCWEtPnNjb3BlKTsKLQkJfSBlbHNlIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCQkiSW52YWxpZCBhZGRyZXNzIHR5cGUiKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQorICAgIGNhc2UgQUZfVElQQzoKKyAgICB7CisgICAgICAgIHN0cnVjdCBzb2NrYWRkcl90aXBjICphID0gKHN0cnVjdCBzb2NrYWRkcl90aXBjICopIGFkZHI7CisgICAgICAgIGlmIChhLT5hZGRydHlwZSA9PSBUSVBDX0FERFJfTkFNRVNFUSkgeworICAgICAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIklJSUlJIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLT5hZGRydHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLT5hZGRyLm5hbWVzZXEudHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLT5hZGRyLm5hbWVzZXEubG93ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS0+YWRkci5uYW1lc2VxLnVwcGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEtPnNjb3BlKTsKKyAgICAgICAgfSBlbHNlIGlmIChhLT5hZGRydHlwZSA9PSBUSVBDX0FERFJfTkFNRSkgeworICAgICAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIklJSUlJIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLT5hZGRydHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLT5hZGRyLm5hbWUubmFtZS50eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEtPmFkZHIubmFtZS5uYW1lLmluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEtPmFkZHIubmFtZS5uYW1lLmluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEtPnNjb3BlKTsKKyAgICAgICAgfSBlbHNlIGlmIChhLT5hZGRydHlwZSA9PSBUSVBDX0FERFJfSUQpIHsKKyAgICAgICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJJSUlJSSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS0+YWRkcnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS0+YWRkci5pZC5ub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEtPmFkZHIuaWQucmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS0+c2NvcGUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgYWRkcmVzcyB0eXBlIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KICNlbmRpZgogCi0JLyogTW9yZSBjYXNlcyBoZXJlLi4uICovCisgICAgLyogTW9yZSBjYXNlcyBoZXJlLi4uICovCiAKLQlkZWZhdWx0OgotCQkvKiBJZiB3ZSBkb24ndCBrbm93IHRoZSBhZGRyZXNzIGZhbWlseSwgZG9uJ3QgcmFpc2UgYW4KLQkJICAgZXhjZXB0aW9uIC0tIHJldHVybiBpdCBhcyBhIHR1cGxlLiAqLwotCQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaXMjIiwKLQkJCQkgICAgIGFkZHItPnNhX2ZhbWlseSwKLQkJCQkgICAgIGFkZHItPnNhX2RhdGEsCi0JCQkJICAgICBzaXplb2YoYWRkci0+c2FfZGF0YSkpOworICAgIGRlZmF1bHQ6CisgICAgICAgIC8qIElmIHdlIGRvbid0IGtub3cgdGhlIGFkZHJlc3MgZmFtaWx5LCBkb24ndCByYWlzZSBhbgorICAgICAgICAgICBleGNlcHRpb24gLS0gcmV0dXJuIGl0IGFzIGEgdHVwbGUuICovCisgICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJpcyMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyLT5zYV9mYW1pbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHItPnNhX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihhZGRyLT5zYV9kYXRhKSk7CiAKLQl9CisgICAgfQogfQogCiAKQEAgLTExNzIsMzI4ICsxMTcyLDMyOCBAQAogCiBzdGF0aWMgaW50CiBnZXRzb2NrYWRkcmFyZyhQeVNvY2tldFNvY2tPYmplY3QgKnMsIFB5T2JqZWN0ICphcmdzLAotCSAgICAgICBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHJfcmV0LCBpbnQgKmxlbl9yZXQpCisgICAgICAgICAgICAgICBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHJfcmV0LCBpbnQgKmxlbl9yZXQpCiB7Ci0Jc3dpdGNoIChzLT5zb2NrX2ZhbWlseSkgeworICAgIHN3aXRjaCAocy0+c29ja19mYW1pbHkpIHsKIAogI2lmIGRlZmluZWQoQUZfVU5JWCkKLQljYXNlIEFGX1VOSVg6Ci0JewotCQlzdHJ1Y3Qgc29ja2FkZHJfdW4qIGFkZHI7Ci0JCWNoYXIgKnBhdGg7Ci0JCWludCBsZW47Ci0JCWlmICghUHlBcmdfUGFyc2UoYXJncywgInQjIiwgJnBhdGgsICZsZW4pKQotCQkJcmV0dXJuIDA7CisgICAgY2FzZSBBRl9VTklYOgorICAgIHsKKyAgICAgICAgc3RydWN0IHNvY2thZGRyX3VuKiBhZGRyOworICAgICAgICBjaGFyICpwYXRoOworICAgICAgICBpbnQgbGVuOworICAgICAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICJ0IyIsICZwYXRoLCAmbGVuKSkKKyAgICAgICAgICAgIHJldHVybiAwOwogCi0JCWFkZHIgPSAoc3RydWN0IHNvY2thZGRyX3VuKilhZGRyX3JldDsKKyAgICAgICAgYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHJfdW4qKWFkZHJfcmV0OwogI2lmZGVmIGxpbnV4Ci0JCWlmIChsZW4gPiAwICYmIHBhdGhbMF0gPT0gMCkgewotCQkJLyogTGludXggYWJzdHJhY3QgbmFtZXNwYWNlIGV4dGVuc2lvbiAqLwotCQkJaWYgKGxlbiA+IHNpemVvZiBhZGRyLT5zdW5fcGF0aCkgewotCQkJCVB5RXJyX1NldFN0cmluZyhzb2NrZXRfZXJyb3IsCi0JCQkJCQkiQUZfVU5JWCBwYXRoIHRvbyBsb25nIik7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCX0KLQkJZWxzZQorICAgICAgICBpZiAobGVuID4gMCAmJiBwYXRoWzBdID09IDApIHsKKyAgICAgICAgICAgIC8qIExpbnV4IGFic3RyYWN0IG5hbWVzcGFjZSBleHRlbnNpb24gKi8KKyAgICAgICAgICAgIGlmIChsZW4gPiBzaXplb2YgYWRkci0+c3VuX3BhdGgpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoc29ja2V0X2Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQUZfVU5JWCBwYXRoIHRvbyBsb25nIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQogI2VuZGlmIC8qIGxpbnV4ICovCi0gICAgICAgICAgICAgICAgewotCQkJLyogcmVndWxhciBOVUxMLXRlcm1pbmF0ZWQgc3RyaW5nICovCi0JCQlpZiAobGVuID49IHNpemVvZiBhZGRyLT5zdW5fcGF0aCkgewotCQkJCVB5RXJyX1NldFN0cmluZyhzb2NrZXRfZXJyb3IsCi0JCQkJCQkiQUZfVU5JWCBwYXRoIHRvbyBsb25nIik7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQlhZGRyLT5zdW5fcGF0aFtsZW5dID0gMDsKLQkJfQotCQlhZGRyLT5zdW5fZmFtaWx5ID0gcy0+c29ja19mYW1pbHk7Ci0JCW1lbWNweShhZGRyLT5zdW5fcGF0aCwgcGF0aCwgbGVuKTsKKyAgICAgICAgeworICAgICAgICAgICAgLyogcmVndWxhciBOVUxMLXRlcm1pbmF0ZWQgc3RyaW5nICovCisgICAgICAgICAgICBpZiAobGVuID49IHNpemVvZiBhZGRyLT5zdW5fcGF0aCkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhzb2NrZXRfZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBRl9VTklYIHBhdGggdG9vIGxvbmciKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFkZHItPnN1bl9wYXRoW2xlbl0gPSAwOworICAgICAgICB9CisgICAgICAgIGFkZHItPnN1bl9mYW1pbHkgPSBzLT5zb2NrX2ZhbWlseTsKKyAgICAgICAgbWVtY3B5KGFkZHItPnN1bl9wYXRoLCBwYXRoLCBsZW4pOwogI2lmIGRlZmluZWQoUFlPU19PUzIpCi0JCSpsZW5fcmV0ID0gc2l6ZW9mKCphZGRyKTsKKyAgICAgICAgKmxlbl9yZXQgPSBzaXplb2YoKmFkZHIpOwogI2Vsc2UKLQkJKmxlbl9yZXQgPSBsZW4gKyBvZmZzZXRvZihzdHJ1Y3Qgc29ja2FkZHJfdW4sIHN1bl9wYXRoKTsKKyAgICAgICAgKmxlbl9yZXQgPSBsZW4gKyBvZmZzZXRvZihzdHJ1Y3Qgc29ja2FkZHJfdW4sIHN1bl9wYXRoKTsKICNlbmRpZgotCQlyZXR1cm4gMTsKLQl9CisgICAgICAgIHJldHVybiAxOworICAgIH0KICNlbmRpZiAvKiBBRl9VTklYICovCiAKICNpZiBkZWZpbmVkKEFGX05FVExJTkspCi0JY2FzZSBBRl9ORVRMSU5LOgotCXsKLQkJc3RydWN0IHNvY2thZGRyX25sKiBhZGRyOwotCQlpbnQgcGlkLCBncm91cHM7Ci0JCWFkZHIgPSAoc3RydWN0IHNvY2thZGRyX25sICopYWRkcl9yZXQ7Ci0JCWlmICghUHlUdXBsZV9DaGVjayhhcmdzKSkgewotCQkJUHlFcnJfRm9ybWF0KAotCQkJCVB5RXhjX1R5cGVFcnJvciwKLQkJCQkiZ2V0c29ja2FkZHJhcmc6ICIKLQkJCQkiQUZfTkVUTElOSyBhZGRyZXNzIG11c3QgYmUgdHVwbGUsIG5vdCAlLjUwMHMiLAotCQkJCVB5X1RZUEUoYXJncyktPnRwX25hbWUpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJJSTpnZXRzb2NrYWRkcmFyZyIsICZwaWQsICZncm91cHMpKQotCQkJcmV0dXJuIDA7Ci0JCWFkZHItPm5sX2ZhbWlseSA9IEFGX05FVExJTks7Ci0JCWFkZHItPm5sX3BpZCA9IHBpZDsKLQkJYWRkci0+bmxfZ3JvdXBzID0gZ3JvdXBzOwotCQkqbGVuX3JldCA9IHNpemVvZigqYWRkcik7Ci0JCXJldHVybiAxOwotCX0KKyAgICBjYXNlIEFGX05FVExJTks6CisgICAgeworICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfbmwqIGFkZHI7CisgICAgICAgIGludCBwaWQsIGdyb3VwczsKKyAgICAgICAgYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHJfbmwgKilhZGRyX3JldDsKKyAgICAgICAgaWYgKCFQeVR1cGxlX0NoZWNrKGFyZ3MpKSB7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoCisgICAgICAgICAgICAgICAgUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICJnZXRzb2NrYWRkcmFyZzogIgorICAgICAgICAgICAgICAgICJBRl9ORVRMSU5LIGFkZHJlc3MgbXVzdCBiZSB0dXBsZSwgbm90ICUuNTAwcyIsCisgICAgICAgICAgICAgICAgUHlfVFlQRShhcmdzKS0+dHBfbmFtZSk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIklJOmdldHNvY2thZGRyYXJnIiwgJnBpZCwgJmdyb3VwcykpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgYWRkci0+bmxfZmFtaWx5ID0gQUZfTkVUTElOSzsKKyAgICAgICAgYWRkci0+bmxfcGlkID0gcGlkOworICAgICAgICBhZGRyLT5ubF9ncm91cHMgPSBncm91cHM7CisgICAgICAgICpsZW5fcmV0ID0gc2l6ZW9mKCphZGRyKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQogI2VuZGlmCiAKLQljYXNlIEFGX0lORVQ6Ci0JewotCQlzdHJ1Y3Qgc29ja2FkZHJfaW4qIGFkZHI7Ci0JCWNoYXIgKmhvc3Q7Ci0JCWludCBwb3J0LCByZXN1bHQ7Ci0JCWlmICghUHlUdXBsZV9DaGVjayhhcmdzKSkgewotCQkJUHlFcnJfRm9ybWF0KAotCQkJCVB5RXhjX1R5cGVFcnJvciwKLQkJCQkiZ2V0c29ja2FkZHJhcmc6ICIKLQkJCQkiQUZfSU5FVCBhZGRyZXNzIG11c3QgYmUgdHVwbGUsIG5vdCAlLjUwMHMiLAotCQkJCVB5X1RZUEUoYXJncyktPnRwX25hbWUpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJldGk6Z2V0c29ja2FkZHJhcmciLAotCQkJCSAgICAgICJpZG5hIiwgJmhvc3QsICZwb3J0KSkKLQkJCXJldHVybiAwOwotCQlhZGRyPShzdHJ1Y3Qgc29ja2FkZHJfaW4qKWFkZHJfcmV0OwotICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNldGlwYWRkcihob3N0LCAoc3RydWN0IHNvY2thZGRyICopYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCphZGRyKSwgIEFGX0lORVQpOwotICAgICAgICAgICAgICAgIFB5TWVtX0ZyZWUoaG9zdCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA8IDApCi0JCQlyZXR1cm4gMDsKLQkJYWRkci0+c2luX2ZhbWlseSA9IEFGX0lORVQ7Ci0JCWFkZHItPnNpbl9wb3J0ID0gaHRvbnMoKHNob3J0KXBvcnQpOwotCQkqbGVuX3JldCA9IHNpemVvZiAqYWRkcjsKLQkJcmV0dXJuIDE7Ci0JfQorICAgIGNhc2UgQUZfSU5FVDoKKyAgICB7CisgICAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbiogYWRkcjsKKyAgICAgICAgY2hhciAqaG9zdDsKKyAgICAgICAgaW50IHBvcnQsIHJlc3VsdDsKKyAgICAgICAgaWYgKCFQeVR1cGxlX0NoZWNrKGFyZ3MpKSB7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoCisgICAgICAgICAgICAgICAgUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICJnZXRzb2NrYWRkcmFyZzogIgorICAgICAgICAgICAgICAgICJBRl9JTkVUIGFkZHJlc3MgbXVzdCBiZSB0dXBsZSwgbm90ICUuNTAwcyIsCisgICAgICAgICAgICAgICAgUHlfVFlQRShhcmdzKS0+dHBfbmFtZSk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImV0aTpnZXRzb2NrYWRkcmFyZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaWRuYSIsICZob3N0LCAmcG9ydCkpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgYWRkcj0oc3RydWN0IHNvY2thZGRyX2luKilhZGRyX3JldDsKKyAgICAgICAgcmVzdWx0ID0gc2V0aXBhZGRyKGhvc3QsIChzdHJ1Y3Qgc29ja2FkZHIgKilhZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCphZGRyKSwgIEFGX0lORVQpOworICAgICAgICBQeU1lbV9GcmVlKGhvc3QpOworICAgICAgICBpZiAocmVzdWx0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBhZGRyLT5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKyAgICAgICAgYWRkci0+c2luX3BvcnQgPSBodG9ucygoc2hvcnQpcG9ydCk7CisgICAgICAgICpsZW5fcmV0ID0gc2l6ZW9mICphZGRyOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CiAKICNpZmRlZiBFTkFCTEVfSVBWNgotCWNhc2UgQUZfSU5FVDY6Ci0JewotCQlzdHJ1Y3Qgc29ja2FkZHJfaW42KiBhZGRyOwotCQljaGFyICpob3N0OwotCQlpbnQgcG9ydCwgZmxvd2luZm8sIHNjb3BlX2lkLCByZXN1bHQ7Ci0JCWZsb3dpbmZvID0gc2NvcGVfaWQgPSAwOwotCQlpZiAoIVB5VHVwbGVfQ2hlY2soYXJncykpIHsKLQkJCVB5RXJyX0Zvcm1hdCgKLQkJCQlQeUV4Y19UeXBlRXJyb3IsCi0JCQkJImdldHNvY2thZGRyYXJnOiAiCi0JCQkJIkFGX0lORVQ2IGFkZHJlc3MgbXVzdCBiZSB0dXBsZSwgbm90ICUuNTAwcyIsCi0JCQkJUHlfVFlQRShhcmdzKS0+dHBfbmFtZSk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImV0aXxpaSIsCi0JCQkJICAgICAgImlkbmEiLCAmaG9zdCwgJnBvcnQsICZmbG93aW5mbywKLQkJCQkgICAgICAmc2NvcGVfaWQpKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlhZGRyID0gKHN0cnVjdCBzb2NrYWRkcl9pbjYqKWFkZHJfcmV0OwotICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNldGlwYWRkcihob3N0LCAoc3RydWN0IHNvY2thZGRyICopYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCphZGRyKSwgQUZfSU5FVDYpOwotICAgICAgICAgICAgICAgIFB5TWVtX0ZyZWUoaG9zdCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA8IDApCi0JCQlyZXR1cm4gMDsKLQkJYWRkci0+c2luNl9mYW1pbHkgPSBzLT5zb2NrX2ZhbWlseTsKLQkJYWRkci0+c2luNl9wb3J0ID0gaHRvbnMoKHNob3J0KXBvcnQpOwotCQlhZGRyLT5zaW42X2Zsb3dpbmZvID0gZmxvd2luZm87Ci0JCWFkZHItPnNpbjZfc2NvcGVfaWQgPSBzY29wZV9pZDsKLQkJKmxlbl9yZXQgPSBzaXplb2YgKmFkZHI7Ci0JCXJldHVybiAxOwotCX0KKyAgICBjYXNlIEFGX0lORVQ2OgorICAgIHsKKyAgICAgICAgc3RydWN0IHNvY2thZGRyX2luNiogYWRkcjsKKyAgICAgICAgY2hhciAqaG9zdDsKKyAgICAgICAgaW50IHBvcnQsIGZsb3dpbmZvLCBzY29wZV9pZCwgcmVzdWx0OworICAgICAgICBmbG93aW5mbyA9IHNjb3BlX2lkID0gMDsKKyAgICAgICAgaWYgKCFQeVR1cGxlX0NoZWNrKGFyZ3MpKSB7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoCisgICAgICAgICAgICAgICAgUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICJnZXRzb2NrYWRkcmFyZzogIgorICAgICAgICAgICAgICAgICJBRl9JTkVUNiBhZGRyZXNzIG11c3QgYmUgdHVwbGUsIG5vdCAlLjUwMHMiLAorICAgICAgICAgICAgICAgIFB5X1RZUEUoYXJncyktPnRwX25hbWUpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJldGl8aWkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlkbmEiLCAmaG9zdCwgJnBvcnQsICZmbG93aW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzY29wZV9pZCkpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGFkZHIgPSAoc3RydWN0IHNvY2thZGRyX2luNiopYWRkcl9yZXQ7CisgICAgICAgIHJlc3VsdCA9IHNldGlwYWRkcihob3N0LCAoc3RydWN0IHNvY2thZGRyICopYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqYWRkciksIEFGX0lORVQ2KTsKKyAgICAgICAgUHlNZW1fRnJlZShob3N0KTsKKyAgICAgICAgaWYgKHJlc3VsdCA8IDApCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgYWRkci0+c2luNl9mYW1pbHkgPSBzLT5zb2NrX2ZhbWlseTsKKyAgICAgICAgYWRkci0+c2luNl9wb3J0ID0gaHRvbnMoKHNob3J0KXBvcnQpOworICAgICAgICBhZGRyLT5zaW42X2Zsb3dpbmZvID0gZmxvd2luZm87CisgICAgICAgIGFkZHItPnNpbjZfc2NvcGVfaWQgPSBzY29wZV9pZDsKKyAgICAgICAgKmxlbl9yZXQgPSBzaXplb2YgKmFkZHI7CisgICAgICAgIHJldHVybiAxOworICAgIH0KICNlbmRpZgogCiAjaWZkZWYgVVNFX0JMVUVUT09USAotCWNhc2UgQUZfQkxVRVRPT1RIOgotCXsKLQkJc3dpdGNoIChzLT5zb2NrX3Byb3RvKSB7Ci0JCWNhc2UgQlRQUk9UT19MMkNBUDoKLQkJewotCQkJc3RydWN0IHNvY2thZGRyX2wyICphZGRyOwotCQkJY2hhciAqc3RyYWRkcjsKKyAgICBjYXNlIEFGX0JMVUVUT09USDoKKyAgICB7CisgICAgICAgIHN3aXRjaCAocy0+c29ja19wcm90bykgeworICAgICAgICBjYXNlIEJUUFJPVE9fTDJDQVA6CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cnVjdCBzb2NrYWRkcl9sMiAqYWRkcjsKKyAgICAgICAgICAgIGNoYXIgKnN0cmFkZHI7CiAKLQkJCWFkZHIgPSAoc3RydWN0IHNvY2thZGRyX2wyICopYWRkcl9yZXQ7Ci0JCQltZW1zZXQoYWRkciwgMCwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9sMikpOwotCQkJX0JUX0wyX01FTUIoYWRkciwgZmFtaWx5KSA9IEFGX0JMVUVUT09USDsKLQkJCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic2kiLCAmc3RyYWRkciwKLQkJCQkJICAgICAgJl9CVF9MMl9NRU1CKGFkZHIsIHBzbSkpKSB7Ci0JCQkJUHlFcnJfU2V0U3RyaW5nKHNvY2tldF9lcnJvciwgImdldHNvY2thZGRyYXJnOiAiCi0JCQkJCQkid3JvbmcgZm9ybWF0Iik7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQlpZiAoc2V0YmRhZGRyKHN0cmFkZHIsICZfQlRfTDJfTUVNQihhZGRyLCBiZGFkZHIpKSA8IDApCi0JCQkJcmV0dXJuIDA7CisgICAgICAgICAgICBhZGRyID0gKHN0cnVjdCBzb2NrYWRkcl9sMiAqKWFkZHJfcmV0OworICAgICAgICAgICAgbWVtc2V0KGFkZHIsIDAsIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfbDIpKTsKKyAgICAgICAgICAgIF9CVF9MMl9NRU1CKGFkZHIsIGZhbWlseSkgPSBBRl9CTFVFVE9PVEg7CisgICAgICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInNpIiwgJnN0cmFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJl9CVF9MMl9NRU1CKGFkZHIsIHBzbSkpKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHNvY2tldF9lcnJvciwgImdldHNvY2thZGRyYXJnOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3cm9uZyBmb3JtYXQiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzZXRiZGFkZHIoc3RyYWRkciwgJl9CVF9MMl9NRU1CKGFkZHIsIGJkYWRkcikpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKIAotCQkJKmxlbl9yZXQgPSBzaXplb2YgKmFkZHI7Ci0JCQlyZXR1cm4gMTsKLQkJfQotCQljYXNlIEJUUFJPVE9fUkZDT01NOgotCQl7Ci0JCQlzdHJ1Y3Qgc29ja2FkZHJfcmMgKmFkZHI7Ci0JCQljaGFyICpzdHJhZGRyOworICAgICAgICAgICAgKmxlbl9yZXQgPSBzaXplb2YgKmFkZHI7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEJUUFJPVE9fUkZDT01NOgorICAgICAgICB7CisgICAgICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfcmMgKmFkZHI7CisgICAgICAgICAgICBjaGFyICpzdHJhZGRyOwogCi0JCQlhZGRyID0gKHN0cnVjdCBzb2NrYWRkcl9yYyAqKWFkZHJfcmV0OwotCQkJX0JUX1JDX01FTUIoYWRkciwgZmFtaWx5KSA9IEFGX0JMVUVUT09USDsKLQkJCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic2kiLCAmc3RyYWRkciwKLQkJCQkJICAgICAgJl9CVF9SQ19NRU1CKGFkZHIsIGNoYW5uZWwpKSkgewotCQkJCVB5RXJyX1NldFN0cmluZyhzb2NrZXRfZXJyb3IsICJnZXRzb2NrYWRkcmFyZzogIgotCQkJCQkJIndyb25nIGZvcm1hdCIpOwotCQkJCXJldHVybiAwOwotCQkJfQotCQkJaWYgKHNldGJkYWRkcihzdHJhZGRyLCAmX0JUX1JDX01FTUIoYWRkciwgYmRhZGRyKSkgPCAwKQotCQkJCXJldHVybiAwOworICAgICAgICAgICAgYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHJfcmMgKilhZGRyX3JldDsKKyAgICAgICAgICAgIF9CVF9SQ19NRU1CKGFkZHIsIGZhbWlseSkgPSBBRl9CTFVFVE9PVEg7CisgICAgICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInNpIiwgJnN0cmFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJl9CVF9SQ19NRU1CKGFkZHIsIGNoYW5uZWwpKSkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhzb2NrZXRfZXJyb3IsICJnZXRzb2NrYWRkcmFyZzogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid3JvbmcgZm9ybWF0Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2V0YmRhZGRyKHN0cmFkZHIsICZfQlRfUkNfTUVNQihhZGRyLCBiZGFkZHIpKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAKLQkJCSpsZW5fcmV0ID0gc2l6ZW9mICphZGRyOwotCQkJcmV0dXJuIDE7Ci0JCX0KLQkJY2FzZSBCVFBST1RPX0hDSToKLQkJewotCQkJc3RydWN0IHNvY2thZGRyX2hjaSAqYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHJfaGNpICopYWRkcl9yZXQ7Ci0JCQlfQlRfSENJX01FTUIoYWRkciwgZmFtaWx5KSA9IEFGX0JMVUVUT09USDsKLQkJCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaSIsICZfQlRfSENJX01FTUIoYWRkciwgZGV2KSkpIHsKLQkJCQlQeUVycl9TZXRTdHJpbmcoc29ja2V0X2Vycm9yLCAiZ2V0c29ja2FkZHJhcmc6ICIKLQkJCQkJCSJ3cm9uZyBmb3JtYXQiKTsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJCSpsZW5fcmV0ID0gc2l6ZW9mICphZGRyOwotCQkJcmV0dXJuIDE7Ci0JCX0KKyAgICAgICAgICAgICpsZW5fcmV0ID0gc2l6ZW9mICphZGRyOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBCVFBST1RPX0hDSToKKyAgICAgICAgeworICAgICAgICAgICAgc3RydWN0IHNvY2thZGRyX2hjaSAqYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHJfaGNpICopYWRkcl9yZXQ7CisgICAgICAgICAgICBfQlRfSENJX01FTUIoYWRkciwgZmFtaWx5KSA9IEFGX0JMVUVUT09USDsKKyAgICAgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaSIsICZfQlRfSENJX01FTUIoYWRkciwgZGV2KSkpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoc29ja2V0X2Vycm9yLCAiZ2V0c29ja2FkZHJhcmc6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndyb25nIGZvcm1hdCIpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKmxlbl9yZXQgPSBzaXplb2YgKmFkZHI7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQogI2lmICFkZWZpbmVkKF9fRnJlZUJTRF9fKQotCQljYXNlIEJUUFJPVE9fU0NPOgotCQl7Ci0JCQlzdHJ1Y3Qgc29ja2FkZHJfc2NvICphZGRyOwotCQkJY2hhciAqc3RyYWRkcjsKKyAgICAgICAgY2FzZSBCVFBST1RPX1NDTzoKKyAgICAgICAgeworICAgICAgICAgICAgc3RydWN0IHNvY2thZGRyX3NjbyAqYWRkcjsKKyAgICAgICAgICAgIGNoYXIgKnN0cmFkZHI7CiAKLQkJCWFkZHIgPSAoc3RydWN0IHNvY2thZGRyX3NjbyAqKWFkZHJfcmV0OwotCQkJX0JUX1NDT19NRU1CKGFkZHIsIGZhbWlseSkgPSBBRl9CTFVFVE9PVEg7Ci0JCQlzdHJhZGRyID0gUHlTdHJpbmdfQXNTdHJpbmcoYXJncyk7Ci0JCQlpZiAoc3RyYWRkciA9PSBOVUxMKSB7Ci0JCQkJUHlFcnJfU2V0U3RyaW5nKHNvY2tldF9lcnJvciwgImdldHNvY2thZGRyYXJnOiAiCi0JCQkJCQkid3JvbmcgZm9ybWF0Iik7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQlpZiAoc2V0YmRhZGRyKHN0cmFkZHIsICZfQlRfU0NPX01FTUIoYWRkciwgYmRhZGRyKSkgPCAwKQotCQkJCXJldHVybiAwOworICAgICAgICAgICAgYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHJfc2NvICopYWRkcl9yZXQ7CisgICAgICAgICAgICBfQlRfU0NPX01FTUIoYWRkciwgZmFtaWx5KSA9IEFGX0JMVUVUT09USDsKKyAgICAgICAgICAgIHN0cmFkZHIgPSBQeVN0cmluZ19Bc1N0cmluZyhhcmdzKTsKKyAgICAgICAgICAgIGlmIChzdHJhZGRyID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoc29ja2V0X2Vycm9yLCAiZ2V0c29ja2FkZHJhcmc6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndyb25nIGZvcm1hdCIpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNldGJkYWRkcihzdHJhZGRyLCAmX0JUX1NDT19NRU1CKGFkZHIsIGJkYWRkcikpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKIAotCQkJKmxlbl9yZXQgPSBzaXplb2YgKmFkZHI7Ci0JCQlyZXR1cm4gMTsKLQkJfQorICAgICAgICAgICAgKmxlbl9yZXQgPSBzaXplb2YgKmFkZHI7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQogI2VuZGlmCi0JCWRlZmF1bHQ6Ci0JCQlQeUVycl9TZXRTdHJpbmcoc29ja2V0X2Vycm9yLCAiZ2V0c29ja2FkZHJhcmc6IHVua25vd24gQmx1ZXRvb3RoIHByb3RvY29sIik7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhzb2NrZXRfZXJyb3IsICJnZXRzb2NrYWRkcmFyZzogdW5rbm93biBCbHVldG9vdGggcHJvdG9jb2wiKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQogI2VuZGlmCiAKICNpZmRlZiBIQVZFX05FVFBBQ0tFVF9QQUNLRVRfSAotCWNhc2UgQUZfUEFDS0VUOgotCXsKLQkJc3RydWN0IHNvY2thZGRyX2xsKiBhZGRyOwotCQlzdHJ1Y3QgaWZyZXEgaWZyOwotCQljaGFyICppbnRlcmZhY2VOYW1lOwotCQlpbnQgcHJvdG9OdW1iZXI7Ci0JCWludCBoYXR5cGUgPSAwOwotCQlpbnQgcGt0dHlwZSA9IDA7Ci0JCWNoYXIgKmhhZGRyID0gTlVMTDsKLQkJdW5zaWduZWQgaW50IGhhbGVuID0gMDsKKyAgICBjYXNlIEFGX1BBQ0tFVDoKKyAgICB7CisgICAgICAgIHN0cnVjdCBzb2NrYWRkcl9sbCogYWRkcjsKKyAgICAgICAgc3RydWN0IGlmcmVxIGlmcjsKKyAgICAgICAgY2hhciAqaW50ZXJmYWNlTmFtZTsKKyAgICAgICAgaW50IHByb3RvTnVtYmVyOworICAgICAgICBpbnQgaGF0eXBlID0gMDsKKyAgICAgICAgaW50IHBrdHR5cGUgPSAwOworICAgICAgICBjaGFyICpoYWRkciA9IE5VTEw7CisgICAgICAgIHVuc2lnbmVkIGludCBoYWxlbiA9IDA7CiAKLQkJaWYgKCFQeVR1cGxlX0NoZWNrKGFyZ3MpKSB7Ci0JCQlQeUVycl9Gb3JtYXQoCi0JCQkJUHlFeGNfVHlwZUVycm9yLAotCQkJCSJnZXRzb2NrYWRkcmFyZzogIgotCQkJCSJBRl9QQUNLRVQgYWRkcmVzcyBtdXN0IGJlIHR1cGxlLCBub3QgJS41MDBzIiwKLQkJCQlQeV9UWVBFKGFyZ3MpLT50cF9uYW1lKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic2l8aWlzIyIsICZpbnRlcmZhY2VOYW1lLAotCQkJCSAgICAgICZwcm90b051bWJlciwgJnBrdHR5cGUsICZoYXR5cGUsCi0JCQkJICAgICAgJmhhZGRyLCAmaGFsZW4pKQotCQkJcmV0dXJuIDA7Ci0JCXN0cm5jcHkoaWZyLmlmcl9uYW1lLCBpbnRlcmZhY2VOYW1lLCBzaXplb2YoaWZyLmlmcl9uYW1lKSk7Ci0JCWlmci5pZnJfbmFtZVsoc2l6ZW9mKGlmci5pZnJfbmFtZSkpLTFdID0gJ1wwJzsKLQkJaWYgKGlvY3RsKHMtPnNvY2tfZmQsIFNJT0NHSUZJTkRFWCwgJmlmcikgPCAwKSB7Ci0JCSAgICAgICAgcy0+ZXJyb3JoYW5kbGVyKCk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlpZiAoaGFsZW4gPiA4KSB7Ci0JCSAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJICAiSGFyZHdhcmUgYWRkcmVzcyBtdXN0IGJlIDggYnl0ZXMgb3IgbGVzcyIpOwotCQkgIHJldHVybiAwOwotCQl9Ci0JCWFkZHIgPSAoc3RydWN0IHNvY2thZGRyX2xsKilhZGRyX3JldDsKLQkJYWRkci0+c2xsX2ZhbWlseSA9IEFGX1BBQ0tFVDsKLQkJYWRkci0+c2xsX3Byb3RvY29sID0gaHRvbnMoKHNob3J0KXByb3RvTnVtYmVyKTsKLQkJYWRkci0+c2xsX2lmaW5kZXggPSBpZnIuaWZyX2lmaW5kZXg7Ci0JCWFkZHItPnNsbF9wa3R0eXBlID0gcGt0dHlwZTsKLQkJYWRkci0+c2xsX2hhdHlwZSA9IGhhdHlwZTsKLQkJaWYgKGhhbGVuICE9IDApIHsKLQkJICBtZW1jcHkoJmFkZHItPnNsbF9hZGRyLCBoYWRkciwgaGFsZW4pOwotCQl9Ci0JCWFkZHItPnNsbF9oYWxlbiA9IGhhbGVuOwotCQkqbGVuX3JldCA9IHNpemVvZiAqYWRkcjsKLQkJcmV0dXJuIDE7Ci0JfQorICAgICAgICBpZiAoIVB5VHVwbGVfQ2hlY2soYXJncykpIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdCgKKyAgICAgICAgICAgICAgICBQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgImdldHNvY2thZGRyYXJnOiAiCisgICAgICAgICAgICAgICAgIkFGX1BBQ0tFVCBhZGRyZXNzIG11c3QgYmUgdHVwbGUsIG5vdCAlLjUwMHMiLAorICAgICAgICAgICAgICAgIFB5X1RZUEUoYXJncyktPnRwX25hbWUpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzaXxpaXMjIiwgJmludGVyZmFjZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJvdG9OdW1iZXIsICZwa3R0eXBlLCAmaGF0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhhZGRyLCAmaGFsZW4pKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHN0cm5jcHkoaWZyLmlmcl9uYW1lLCBpbnRlcmZhY2VOYW1lLCBzaXplb2YoaWZyLmlmcl9uYW1lKSk7CisgICAgICAgIGlmci5pZnJfbmFtZVsoc2l6ZW9mKGlmci5pZnJfbmFtZSkpLTFdID0gJ1wwJzsKKyAgICAgICAgaWYgKGlvY3RsKHMtPnNvY2tfZmQsIFNJT0NHSUZJTkRFWCwgJmlmcikgPCAwKSB7CisgICAgICAgICAgICBzLT5lcnJvcmhhbmRsZXIoKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGlmIChoYWxlbiA+IDgpIHsKKyAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkhhcmR3YXJlIGFkZHJlc3MgbXVzdCBiZSA4IGJ5dGVzIG9yIGxlc3MiKTsKKyAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBhZGRyID0gKHN0cnVjdCBzb2NrYWRkcl9sbCopYWRkcl9yZXQ7CisgICAgICAgIGFkZHItPnNsbF9mYW1pbHkgPSBBRl9QQUNLRVQ7CisgICAgICAgIGFkZHItPnNsbF9wcm90b2NvbCA9IGh0b25zKChzaG9ydClwcm90b051bWJlcik7CisgICAgICAgIGFkZHItPnNsbF9pZmluZGV4ID0gaWZyLmlmcl9pZmluZGV4OworICAgICAgICBhZGRyLT5zbGxfcGt0dHlwZSA9IHBrdHR5cGU7CisgICAgICAgIGFkZHItPnNsbF9oYXR5cGUgPSBoYXR5cGU7CisgICAgICAgIGlmIChoYWxlbiAhPSAwKSB7CisgICAgICAgICAgbWVtY3B5KCZhZGRyLT5zbGxfYWRkciwgaGFkZHIsIGhhbGVuKTsKKyAgICAgICAgfQorICAgICAgICBhZGRyLT5zbGxfaGFsZW4gPSBoYWxlbjsKKyAgICAgICAgKmxlbl9yZXQgPSBzaXplb2YgKmFkZHI7CisgICAgICAgIHJldHVybiAxOworICAgIH0KICNlbmRpZgogCiAjaWZkZWYgSEFWRV9MSU5VWF9USVBDX0gKLQljYXNlIEFGX1RJUEM6Ci0JewotCQl1bnNpZ25lZCBpbnQgYXR5cGUsIHYxLCB2MiwgdjM7Ci0JCXVuc2lnbmVkIGludCBzY29wZSA9IFRJUENfQ0xVU1RFUl9TQ09QRTsKLQkJc3RydWN0IHNvY2thZGRyX3RpcGMgKmFkZHI7CisgICAgY2FzZSBBRl9USVBDOgorICAgIHsKKyAgICAgICAgdW5zaWduZWQgaW50IGF0eXBlLCB2MSwgdjIsIHYzOworICAgICAgICB1bnNpZ25lZCBpbnQgc2NvcGUgPSBUSVBDX0NMVVNURVJfU0NPUEU7CisgICAgICAgIHN0cnVjdCBzb2NrYWRkcl90aXBjICphZGRyOwogCi0JCWlmICghUHlUdXBsZV9DaGVjayhhcmdzKSkgewotCQkJUHlFcnJfRm9ybWF0KAotCQkJCVB5RXhjX1R5cGVFcnJvciwKLQkJCQkiZ2V0c29ja2FkZHJhcmc6ICIKLQkJCQkiQUZfVElQQyBhZGRyZXNzIG11c3QgYmUgdHVwbGUsIG5vdCAlLjUwMHMiLAotCQkJCVB5X1RZUEUoYXJncyktPnRwX25hbWUpOwotCQkJcmV0dXJuIDA7Ci0JCX0KKyAgICAgICAgaWYgKCFQeVR1cGxlX0NoZWNrKGFyZ3MpKSB7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoCisgICAgICAgICAgICAgICAgUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICJnZXRzb2NrYWRkcmFyZzogIgorICAgICAgICAgICAgICAgICJBRl9USVBDIGFkZHJlc3MgbXVzdCBiZSB0dXBsZSwgbm90ICUuNTAwcyIsCisgICAgICAgICAgICAgICAgUHlfVFlQRShhcmdzKS0+dHBfbmFtZSk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQogCi0JCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLAotCQkJCQkiSUlJSXxJO0ludmFsaWQgVElQQyBhZGRyZXNzIGZvcm1hdCIsCi0JCQkJCSZhdHlwZSwgJnYxLCAmdjIsICZ2MywgJnNjb3BlKSkKLQkJCXJldHVybiAwOworICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklJSUl8STtJbnZhbGlkIFRJUEMgYWRkcmVzcyBmb3JtYXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXR5cGUsICZ2MSwgJnYyLCAmdjMsICZzY29wZSkpCisgICAgICAgICAgICByZXR1cm4gMDsKIAotCQlhZGRyID0gKHN0cnVjdCBzb2NrYWRkcl90aXBjICopIGFkZHJfcmV0OwotCQltZW1zZXQoYWRkciwgMCwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl90aXBjKSk7CisgICAgICAgIGFkZHIgPSAoc3RydWN0IHNvY2thZGRyX3RpcGMgKikgYWRkcl9yZXQ7CisgICAgICAgIG1lbXNldChhZGRyLCAwLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX3RpcGMpKTsKIAotCQlhZGRyLT5mYW1pbHkgPSBBRl9USVBDOwotCQlhZGRyLT5zY29wZSA9IHNjb3BlOwotCQlhZGRyLT5hZGRydHlwZSA9IGF0eXBlOworICAgICAgICBhZGRyLT5mYW1pbHkgPSBBRl9USVBDOworICAgICAgICBhZGRyLT5zY29wZSA9IHNjb3BlOworICAgICAgICBhZGRyLT5hZGRydHlwZSA9IGF0eXBlOwogCi0JCWlmIChhdHlwZSA9PSBUSVBDX0FERFJfTkFNRVNFUSkgewotCQkJYWRkci0+YWRkci5uYW1lc2VxLnR5cGUgPSB2MTsKLQkJCWFkZHItPmFkZHIubmFtZXNlcS5sb3dlciA9IHYyOwotCQkJYWRkci0+YWRkci5uYW1lc2VxLnVwcGVyID0gdjM7Ci0JCX0gZWxzZSBpZiAoYXR5cGUgPT0gVElQQ19BRERSX05BTUUpIHsKLQkJCWFkZHItPmFkZHIubmFtZS5uYW1lLnR5cGUgPSB2MTsKLQkJCWFkZHItPmFkZHIubmFtZS5uYW1lLmluc3RhbmNlID0gdjI7Ci0JCX0gZWxzZSBpZiAoYXR5cGUgPT0gVElQQ19BRERSX0lEKSB7Ci0JCQlhZGRyLT5hZGRyLmlkLm5vZGUgPSB2MTsKLQkJCWFkZHItPmFkZHIuaWQucmVmID0gdjI7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBTaG91bGRuJ3QgaGFwcGVuICovCi0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiSW52YWxpZCBhZGRyZXNzIHR5cGUiKTsKLQkJCXJldHVybiAwOwotCQl9CisgICAgICAgIGlmIChhdHlwZSA9PSBUSVBDX0FERFJfTkFNRVNFUSkgeworICAgICAgICAgICAgYWRkci0+YWRkci5uYW1lc2VxLnR5cGUgPSB2MTsKKyAgICAgICAgICAgIGFkZHItPmFkZHIubmFtZXNlcS5sb3dlciA9IHYyOworICAgICAgICAgICAgYWRkci0+YWRkci5uYW1lc2VxLnVwcGVyID0gdjM7CisgICAgICAgIH0gZWxzZSBpZiAoYXR5cGUgPT0gVElQQ19BRERSX05BTUUpIHsKKyAgICAgICAgICAgIGFkZHItPmFkZHIubmFtZS5uYW1lLnR5cGUgPSB2MTsKKyAgICAgICAgICAgIGFkZHItPmFkZHIubmFtZS5uYW1lLmluc3RhbmNlID0gdjI7CisgICAgICAgIH0gZWxzZSBpZiAoYXR5cGUgPT0gVElQQ19BRERSX0lEKSB7CisgICAgICAgICAgICBhZGRyLT5hZGRyLmlkLm5vZGUgPSB2MTsKKyAgICAgICAgICAgIGFkZHItPmFkZHIuaWQucmVmID0gdjI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBTaG91bGRuJ3QgaGFwcGVuICovCisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiSW52YWxpZCBhZGRyZXNzIHR5cGUiKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CiAKLQkJKmxlbl9yZXQgPSBzaXplb2YoKmFkZHIpOworICAgICAgICAqbGVuX3JldCA9IHNpemVvZigqYWRkcik7CiAKLQkJcmV0dXJuIDE7Ci0JfQorICAgICAgICByZXR1cm4gMTsKKyAgICB9CiAjZW5kaWYKIAotCS8qIE1vcmUgY2FzZXMgaGVyZS4uLiAqLworICAgIC8qIE1vcmUgY2FzZXMgaGVyZS4uLiAqLwogCi0JZGVmYXVsdDoKLQkJUHlFcnJfU2V0U3RyaW5nKHNvY2tldF9lcnJvciwgImdldHNvY2thZGRyYXJnOiBiYWQgZmFtaWx5Iik7Ci0JCXJldHVybiAwOworICAgIGRlZmF1bHQ6CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhzb2NrZXRfZXJyb3IsICJnZXRzb2NrYWRkcmFyZzogYmFkIGZhbWlseSIpOworICAgICAgICByZXR1cm4gMDsKIAotCX0KKyAgICB9CiB9CiAKIApAQCAtMTUwNCw4OSArMTUwNCw4OSBAQAogc3RhdGljIGludAogZ2V0c29ja2FkZHJsZW4oUHlTb2NrZXRTb2NrT2JqZWN0ICpzLCBzb2NrbGVuX3QgKmxlbl9yZXQpCiB7Ci0Jc3dpdGNoIChzLT5zb2NrX2ZhbWlseSkgeworICAgIHN3aXRjaCAocy0+c29ja19mYW1pbHkpIHsKIAogI2lmIGRlZmluZWQoQUZfVU5JWCkKLQljYXNlIEFGX1VOSVg6Ci0JewotCQkqbGVuX3JldCA9IHNpemVvZiAoc3RydWN0IHNvY2thZGRyX3VuKTsKLQkJcmV0dXJuIDE7Ci0JfQorICAgIGNhc2UgQUZfVU5JWDoKKyAgICB7CisgICAgICAgICpsZW5fcmV0ID0gc2l6ZW9mIChzdHJ1Y3Qgc29ja2FkZHJfdW4pOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CiAjZW5kaWYgLyogQUZfVU5JWCAqLwogI2lmIGRlZmluZWQoQUZfTkVUTElOSykKICAgICAgICBjYXNlIEFGX05FVExJTks6CiAgICAgICAgewotICAgICAgICAgICAgICAgKmxlbl9yZXQgPSBzaXplb2YgKHN0cnVjdCBzb2NrYWRkcl9ubCk7Ci0gICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgKmxlbl9yZXQgPSBzaXplb2YgKHN0cnVjdCBzb2NrYWRkcl9ubCk7CisgICAgICAgICAgIHJldHVybiAxOwogICAgICAgIH0KICNlbmRpZgogCi0JY2FzZSBBRl9JTkVUOgotCXsKLQkJKmxlbl9yZXQgPSBzaXplb2YgKHN0cnVjdCBzb2NrYWRkcl9pbik7Ci0JCXJldHVybiAxOwotCX0KKyAgICBjYXNlIEFGX0lORVQ6CisgICAgeworICAgICAgICAqbGVuX3JldCA9IHNpemVvZiAoc3RydWN0IHNvY2thZGRyX2luKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQogCiAjaWZkZWYgRU5BQkxFX0lQVjYKLQljYXNlIEFGX0lORVQ2OgotCXsKLQkJKmxlbl9yZXQgPSBzaXplb2YgKHN0cnVjdCBzb2NrYWRkcl9pbjYpOwotCQlyZXR1cm4gMTsKLQl9CisgICAgY2FzZSBBRl9JTkVUNjoKKyAgICB7CisgICAgICAgICpsZW5fcmV0ID0gc2l6ZW9mIChzdHJ1Y3Qgc29ja2FkZHJfaW42KTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQogI2VuZGlmCiAKICNpZmRlZiBVU0VfQkxVRVRPT1RICi0JY2FzZSBBRl9CTFVFVE9PVEg6Ci0JewotCQlzd2l0Y2gocy0+c29ja19wcm90bykKLQkJeworICAgIGNhc2UgQUZfQkxVRVRPT1RIOgorICAgIHsKKyAgICAgICAgc3dpdGNoKHMtPnNvY2tfcHJvdG8pCisgICAgICAgIHsKIAotCQljYXNlIEJUUFJPVE9fTDJDQVA6Ci0JCQkqbGVuX3JldCA9IHNpemVvZiAoc3RydWN0IHNvY2thZGRyX2wyKTsKLQkJCXJldHVybiAxOwotCQljYXNlIEJUUFJPVE9fUkZDT01NOgotCQkJKmxlbl9yZXQgPSBzaXplb2YgKHN0cnVjdCBzb2NrYWRkcl9yYyk7Ci0JCQlyZXR1cm4gMTsKLQkJY2FzZSBCVFBST1RPX0hDSToKLQkJCSpsZW5fcmV0ID0gc2l6ZW9mIChzdHJ1Y3Qgc29ja2FkZHJfaGNpKTsKLQkJCXJldHVybiAxOworICAgICAgICBjYXNlIEJUUFJPVE9fTDJDQVA6CisgICAgICAgICAgICAqbGVuX3JldCA9IHNpemVvZiAoc3RydWN0IHNvY2thZGRyX2wyKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICBjYXNlIEJUUFJPVE9fUkZDT01NOgorICAgICAgICAgICAgKmxlbl9yZXQgPSBzaXplb2YgKHN0cnVjdCBzb2NrYWRkcl9yYyk7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgY2FzZSBCVFBST1RPX0hDSToKKyAgICAgICAgICAgICpsZW5fcmV0ID0gc2l6ZW9mIChzdHJ1Y3Qgc29ja2FkZHJfaGNpKTsKKyAgICAgICAgICAgIHJldHVybiAxOwogI2lmICFkZWZpbmVkKF9fRnJlZUJTRF9fKQotCQljYXNlIEJUUFJPVE9fU0NPOgotCQkJKmxlbl9yZXQgPSBzaXplb2YgKHN0cnVjdCBzb2NrYWRkcl9zY28pOwotCQkJcmV0dXJuIDE7CisgICAgICAgIGNhc2UgQlRQUk9UT19TQ086CisgICAgICAgICAgICAqbGVuX3JldCA9IHNpemVvZiAoc3RydWN0IHNvY2thZGRyX3Njbyk7CisgICAgICAgICAgICByZXR1cm4gMTsKICNlbmRpZgotCQlkZWZhdWx0OgotCQkJUHlFcnJfU2V0U3RyaW5nKHNvY2tldF9lcnJvciwgImdldHNvY2thZGRybGVuOiAiCi0JCQkJCSJ1bmtub3duIEJUIHByb3RvY29sIik7Ci0JCQlyZXR1cm4gMDsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhzb2NrZXRfZXJyb3IsICJnZXRzb2NrYWRkcmxlbjogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmtub3duIEJUIHByb3RvY29sIik7CisgICAgICAgICAgICByZXR1cm4gMDsKIAotCQl9Ci0JfQorICAgICAgICB9CisgICAgfQogI2VuZGlmCiAKICNpZmRlZiBIQVZFX05FVFBBQ0tFVF9QQUNLRVRfSAotCWNhc2UgQUZfUEFDS0VUOgotCXsKLQkJKmxlbl9yZXQgPSBzaXplb2YgKHN0cnVjdCBzb2NrYWRkcl9sbCk7Ci0JCXJldHVybiAxOwotCX0KKyAgICBjYXNlIEFGX1BBQ0tFVDoKKyAgICB7CisgICAgICAgICpsZW5fcmV0ID0gc2l6ZW9mIChzdHJ1Y3Qgc29ja2FkZHJfbGwpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CiAjZW5kaWYKIAogI2lmZGVmIEhBVkVfTElOVVhfVElQQ19ICi0JY2FzZSBBRl9USVBDOgotCXsKLQkJKmxlbl9yZXQgPSBzaXplb2YgKHN0cnVjdCBzb2NrYWRkcl90aXBjKTsKLQkJcmV0dXJuIDE7Ci0JfQorICAgIGNhc2UgQUZfVElQQzoKKyAgICB7CisgICAgICAgICpsZW5fcmV0ID0gc2l6ZW9mIChzdHJ1Y3Qgc29ja2FkZHJfdGlwYyk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KICNlbmRpZgogCi0JLyogTW9yZSBjYXNlcyBoZXJlLi4uICovCisgICAgLyogTW9yZSBjYXNlcyBoZXJlLi4uICovCiAKLQlkZWZhdWx0OgotCQlQeUVycl9TZXRTdHJpbmcoc29ja2V0X2Vycm9yLCAiZ2V0c29ja2FkZHJsZW46IGJhZCBmYW1pbHkiKTsKLQkJcmV0dXJuIDA7CisgICAgZGVmYXVsdDoKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHNvY2tldF9lcnJvciwgImdldHNvY2thZGRybGVuOiBiYWQgZmFtaWx5Iik7CisgICAgICAgIHJldHVybiAwOwogCi0JfQorICAgIH0KIH0KIAogCkBAIC0xNTk1LDY3ICsxNTk1LDY3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc29ja19hY2NlcHQoUHlTb2NrZXRTb2NrT2JqZWN0ICpzKQogewotCXNvY2tfYWRkcl90IGFkZHJidWY7Ci0JU09DS0VUX1QgbmV3ZmQ7Ci0Jc29ja2xlbl90IGFkZHJsZW47Ci0JUHlPYmplY3QgKnNvY2sgPSBOVUxMOwotCVB5T2JqZWN0ICphZGRyID0gTlVMTDsKLQlQeU9iamVjdCAqcmVzID0gTlVMTDsKLQlpbnQgdGltZW91dDsKKyAgICBzb2NrX2FkZHJfdCBhZGRyYnVmOworICAgIFNPQ0tFVF9UIG5ld2ZkOworICAgIHNvY2tsZW5fdCBhZGRybGVuOworICAgIFB5T2JqZWN0ICpzb2NrID0gTlVMTDsKKyAgICBQeU9iamVjdCAqYWRkciA9IE5VTEw7CisgICAgUHlPYmplY3QgKnJlcyA9IE5VTEw7CisgICAgaW50IHRpbWVvdXQ7CiAKLQlpZiAoIWdldHNvY2thZGRybGVuKHMsICZhZGRybGVuKSkKLQkJcmV0dXJuIE5VTEw7Ci0JbWVtc2V0KCZhZGRyYnVmLCAwLCBhZGRybGVuKTsKKyAgICBpZiAoIWdldHNvY2thZGRybGVuKHMsICZhZGRybGVuKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbWVtc2V0KCZhZGRyYnVmLCAwLCBhZGRybGVuKTsKIAogI2lmZGVmIE1TX1dJTkRPV1MKLQluZXdmZCA9IElOVkFMSURfU09DS0VUOworICAgIG5ld2ZkID0gSU5WQUxJRF9TT0NLRVQ7CiAjZWxzZQotCW5ld2ZkID0gLTE7CisgICAgbmV3ZmQgPSAtMTsKICNlbmRpZgogCi0JaWYgKCFJU19TRUxFQ1RBQkxFKHMpKQotCQlyZXR1cm4gc2VsZWN0X2Vycm9yKCk7CisgICAgaWYgKCFJU19TRUxFQ1RBQkxFKHMpKQorICAgICAgICByZXR1cm4gc2VsZWN0X2Vycm9yKCk7CiAKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JdGltZW91dCA9IGludGVybmFsX3NlbGVjdChzLCAwKTsKLQlpZiAoIXRpbWVvdXQpCi0JCW5ld2ZkID0gYWNjZXB0KHMtPnNvY2tfZmQsIFNBUzJTQSgmYWRkcmJ1ZiksICZhZGRybGVuKTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICB0aW1lb3V0ID0gaW50ZXJuYWxfc2VsZWN0KHMsIDApOworICAgIGlmICghdGltZW91dCkKKyAgICAgICAgbmV3ZmQgPSBhY2NlcHQocy0+c29ja19mZCwgU0FTMlNBKCZhZGRyYnVmKSwgJmFkZHJsZW4pOworICAgIFB5X0VORF9BTExPV19USFJFQURTCiAKLQlpZiAodGltZW91dCA9PSAxKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhzb2NrZXRfdGltZW91dCwgInRpbWVkIG91dCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKHRpbWVvdXQgPT0gMSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoc29ja2V0X3RpbWVvdXQsICJ0aW1lZCBvdXQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCiAjaWZkZWYgTVNfV0lORE9XUwotCWlmIChuZXdmZCA9PSBJTlZBTElEX1NPQ0tFVCkKKyAgICBpZiAobmV3ZmQgPT0gSU5WQUxJRF9TT0NLRVQpCiAjZWxzZQotCWlmIChuZXdmZCA8IDApCisgICAgaWYgKG5ld2ZkIDwgMCkKICNlbmRpZgotCQlyZXR1cm4gcy0+ZXJyb3JoYW5kbGVyKCk7CisgICAgICAgIHJldHVybiBzLT5lcnJvcmhhbmRsZXIoKTsKIAotCS8qIENyZWF0ZSB0aGUgbmV3IG9iamVjdCB3aXRoIHVuc3BlY2lmaWVkIGZhbWlseSwKLQkgICB0byBhdm9pZCBjYWxscyB0byBiaW5kKCkgZXRjLiBvbiBpdC4gKi8KLQlzb2NrID0gKFB5T2JqZWN0ICopIG5ld19zb2Nrb2JqZWN0KG5ld2ZkLAotCQkJCQkgICBzLT5zb2NrX2ZhbWlseSwKLQkJCQkJICAgcy0+c29ja190eXBlLAotCQkJCQkgICBzLT5zb2NrX3Byb3RvKTsKKyAgICAvKiBDcmVhdGUgdGhlIG5ldyBvYmplY3Qgd2l0aCB1bnNwZWNpZmllZCBmYW1pbHksCisgICAgICAgdG8gYXZvaWQgY2FsbHMgdG8gYmluZCgpIGV0Yy4gb24gaXQuICovCisgICAgc29jayA9IChQeU9iamVjdCAqKSBuZXdfc29ja29iamVjdChuZXdmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnNvY2tfZmFtaWx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+c29ja190eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+c29ja19wcm90byk7CiAKLQlpZiAoc29jayA9PSBOVUxMKSB7Ci0JCVNPQ0tFVENMT1NFKG5ld2ZkKTsKLQkJZ290byBmaW5hbGx5OwotCX0KLQlhZGRyID0gbWFrZXNvY2thZGRyKHMtPnNvY2tfZmQsIFNBUzJTQSgmYWRkcmJ1ZiksCi0JCQkgICAgYWRkcmxlbiwgcy0+c29ja19wcm90byk7Ci0JaWYgKGFkZHIgPT0gTlVMTCkKLQkJZ290byBmaW5hbGx5OworICAgIGlmIChzb2NrID09IE5VTEwpIHsKKyAgICAgICAgU09DS0VUQ0xPU0UobmV3ZmQpOworICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgfQorICAgIGFkZHIgPSBtYWtlc29ja2FkZHIocy0+c29ja19mZCwgU0FTMlNBKCZhZGRyYnVmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJsZW4sIHMtPnNvY2tfcHJvdG8pOworICAgIGlmIChhZGRyID09IE5VTEwpCisgICAgICAgIGdvdG8gZmluYWxseTsKIAotCXJlcyA9IFB5VHVwbGVfUGFjaygyLCBzb2NrLCBhZGRyKTsKKyAgICByZXMgPSBQeVR1cGxlX1BhY2soMiwgc29jaywgYWRkcik7CiAKIGZpbmFsbHk6Ci0JUHlfWERFQ1JFRihzb2NrKTsKLQlQeV9YREVDUkVGKGFkZHIpOwotCXJldHVybiByZXM7CisgICAgUHlfWERFQ1JFRihzb2NrKTsKKyAgICBQeV9YREVDUkVGKGFkZHIpOworICAgIHJldHVybiByZXM7CiB9CiAKIFB5RG9jX1NUUlZBUihhY2NlcHRfZG9jLApAQCAtMTY3MywxNyArMTY3MywxNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNvY2tfc2V0YmxvY2tpbmcoUHlTb2NrZXRTb2NrT2JqZWN0ICpzLCBQeU9iamVjdCAqYXJnKQogewotCWludCBibG9jazsKKyAgICBpbnQgYmxvY2s7CiAKLQlibG9jayA9IFB5SW50X0FzTG9uZyhhcmcpOwotCWlmIChibG9jayA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBibG9jayA9IFB5SW50X0FzTG9uZyhhcmcpOworICAgIGlmIChibG9jayA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXMtPnNvY2tfdGltZW91dCA9IGJsb2NrID8gLTEuMCA6IDAuMDsKLQlpbnRlcm5hbF9zZXRibG9ja2luZyhzLCBibG9jayk7CisgICAgcy0+c29ja190aW1lb3V0ID0gYmxvY2sgPyAtMS4wIDogMC4wOworICAgIGludGVybmFsX3NldGJsb2NraW5nKHMsIGJsb2NrKTsKIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIFB5RG9jX1NUUlZBUihzZXRibG9ja2luZ19kb2MsCkBAIC0xNzAyLDI1ICsxNzAyLDI1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc29ja19zZXR0aW1lb3V0KFB5U29ja2V0U29ja09iamVjdCAqcywgUHlPYmplY3QgKmFyZykKIHsKLQlkb3VibGUgdGltZW91dDsKKyAgICBkb3VibGUgdGltZW91dDsKIAotCWlmIChhcmcgPT0gUHlfTm9uZSkKLQkJdGltZW91dCA9IC0xLjA7Ci0JZWxzZSB7Ci0JCXRpbWVvdXQgPSBQeUZsb2F0X0FzRG91YmxlKGFyZyk7Ci0JCWlmICh0aW1lb3V0IDwgMC4wKSB7Ci0JCQlpZiAoIVB5RXJyX09jY3VycmVkKCkpCi0JCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJCQkiVGltZW91dCB2YWx1ZSBvdXQgb2YgcmFuZ2UiKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQorICAgIGlmIChhcmcgPT0gUHlfTm9uZSkKKyAgICAgICAgdGltZW91dCA9IC0xLjA7CisgICAgZWxzZSB7CisgICAgICAgIHRpbWVvdXQgPSBQeUZsb2F0X0FzRG91YmxlKGFyZyk7CisgICAgICAgIGlmICh0aW1lb3V0IDwgMC4wKSB7CisgICAgICAgICAgICBpZiAoIVB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaW1lb3V0IHZhbHVlIG91dCBvZiByYW5nZSIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CiAKLQlzLT5zb2NrX3RpbWVvdXQgPSB0aW1lb3V0OwotCWludGVybmFsX3NldGJsb2NraW5nKHMsIHRpbWVvdXQgPCAwLjApOworICAgIHMtPnNvY2tfdGltZW91dCA9IHRpbWVvdXQ7CisgICAgaW50ZXJuYWxfc2V0YmxvY2tpbmcocywgdGltZW91dCA8IDAuMCk7CiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBQeURvY19TVFJWQVIoc2V0dGltZW91dF9kb2MsCkBAIC0xNzM2LDEyICsxNzM2LDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogc29ja19nZXR0aW1lb3V0KFB5U29ja2V0U29ja09iamVjdCAqcykKIHsKLQlpZiAocy0+c29ja190aW1lb3V0IDwgMC4wKSB7Ci0JCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJcmV0dXJuIFB5X05vbmU7Ci0JfQotCWVsc2UKLQkJcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShzLT5zb2NrX3RpbWVvdXQpOworICAgIGlmIChzLT5zb2NrX3RpbWVvdXQgPCAwLjApIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKHMtPnNvY2tfdGltZW91dCk7CiB9CiAKIFB5RG9jX1NUUlZBUihnZXR0aW1lb3V0X2RvYywKQEAgLTE3NTcsMTYgKzE3NTcsMTYgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzb2NrX3NsZWVwdGFza3coUHlTb2NrZXRTb2NrT2JqZWN0ICpzLFB5T2JqZWN0ICphcmcpCiB7Ci0JaW50IGJsb2NrOwotCWJsb2NrID0gUHlJbnRfQXNMb25nKGFyZyk7Ci0JaWYgKGJsb2NrID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiBOVUxMOwotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlzb2NrZXRpb2N0bChzLT5zb2NrX2ZkLCAweDgwMDQ2Njc5LCAodV9sb25nKikmYmxvY2spOwotCVB5X0VORF9BTExPV19USFJFQURTCisgICAgaW50IGJsb2NrOworICAgIGJsb2NrID0gUHlJbnRfQXNMb25nKGFyZyk7CisgICAgaWYgKGJsb2NrID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICBzb2NrZXRpb2N0bChzLT5zb2NrX2ZkLCAweDgwMDQ2Njc5LCAodV9sb25nKikmYmxvY2spOworICAgIFB5X0VORF9BTExPV19USFJFQURTCiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogUHlEb2NfU1RSVkFSKHNsZWVwdGFza3dfZG9jLAogInNsZWVwdGFza3coZmxhZylcblwKQEAgLTE3ODMsMjkgKzE3ODMsMjkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzb2NrX3NldHNvY2tvcHQoUHlTb2NrZXRTb2NrT2JqZWN0ICpzLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgbGV2ZWw7Ci0JaW50IG9wdG5hbWU7Ci0JaW50IHJlczsKLQljaGFyICpidWY7Ci0JaW50IGJ1ZmxlbjsKLQlpbnQgZmxhZzsKKyAgICBpbnQgbGV2ZWw7CisgICAgaW50IG9wdG5hbWU7CisgICAgaW50IHJlczsKKyAgICBjaGFyICpidWY7CisgICAgaW50IGJ1ZmxlbjsKKyAgICBpbnQgZmxhZzsKIAotCWlmIChQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpaWk6c2V0c29ja29wdCIsCi0JCQkgICAgICZsZXZlbCwgJm9wdG5hbWUsICZmbGFnKSkgewotCQlidWYgPSAoY2hhciAqKSAmZmxhZzsKLQkJYnVmbGVuID0gc2l6ZW9mIGZsYWc7Ci0JfQotCWVsc2UgewotCQlQeUVycl9DbGVhcigpOwotCQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpcyM6c2V0c29ja29wdCIsCi0JCQkJICAgICAgJmxldmVsLCAmb3B0bmFtZSwgJmJ1ZiwgJmJ1ZmxlbikpCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmVzID0gc2V0c29ja29wdChzLT5zb2NrX2ZkLCBsZXZlbCwgb3B0bmFtZSwgKHZvaWQgKilidWYsIGJ1Zmxlbik7Ci0JaWYgKHJlcyA8IDApCi0JCXJldHVybiBzLT5lcnJvcmhhbmRsZXIoKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKFB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpaTpzZXRzb2Nrb3B0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmbGV2ZWwsICZvcHRuYW1lLCAmZmxhZykpIHsKKyAgICAgICAgYnVmID0gKGNoYXIgKikgJmZsYWc7CisgICAgICAgIGJ1ZmxlbiA9IHNpemVvZiBmbGFnOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpaXMjOnNldHNvY2tvcHQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxldmVsLCAmb3B0bmFtZSwgJmJ1ZiwgJmJ1ZmxlbikpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmVzID0gc2V0c29ja29wdChzLT5zb2NrX2ZkLCBsZXZlbCwgb3B0bmFtZSwgKHZvaWQgKilidWYsIGJ1Zmxlbik7CisgICAgaWYgKHJlcyA8IDApCisgICAgICAgIHJldHVybiBzLT5lcnJvcmhhbmRsZXIoKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIFB5RG9jX1NUUlZBUihzZXRzb2Nrb3B0X2RvYywKQEAgLTE4MjMsNTMgKzE4MjMsNTMgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzb2NrX2dldHNvY2tvcHQoUHlTb2NrZXRTb2NrT2JqZWN0ICpzLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgbGV2ZWw7Ci0JaW50IG9wdG5hbWU7Ci0JaW50IHJlczsKLQlQeU9iamVjdCAqYnVmOwotCXNvY2tsZW5fdCBidWZsZW4gPSAwOworICAgIGludCBsZXZlbDsKKyAgICBpbnQgb3B0bmFtZTsKKyAgICBpbnQgcmVzOworICAgIFB5T2JqZWN0ICpidWY7CisgICAgc29ja2xlbl90IGJ1ZmxlbiA9IDA7CiAKICNpZmRlZiBfX0JFT1NfXwotCS8qIFdlIGhhdmUgaW5jb21wbGV0ZSBzb2NrZXQgc3VwcG9ydC4gKi8KLQlQeUVycl9TZXRTdHJpbmcoc29ja2V0X2Vycm9yLCAiZ2V0c29ja29wdCBub3Qgc3VwcG9ydGVkIik7Ci0JcmV0dXJuIE5VTEw7CisgICAgLyogV2UgaGF2ZSBpbmNvbXBsZXRlIHNvY2tldCBzdXBwb3J0LiAqLworICAgIFB5RXJyX1NldFN0cmluZyhzb2NrZXRfZXJyb3IsICJnZXRzb2Nrb3B0IG5vdCBzdXBwb3J0ZWQiKTsKKyAgICByZXR1cm4gTlVMTDsKICNlbHNlCiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpfGk6Z2V0c29ja29wdCIsCi0JCQkgICAgICAmbGV2ZWwsICZvcHRuYW1lLCAmYnVmbGVuKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpaXxpOmdldHNvY2tvcHQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbGV2ZWwsICZvcHRuYW1lLCAmYnVmbGVuKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoYnVmbGVuID09IDApIHsKLQkJaW50IGZsYWcgPSAwOwotCQlzb2NrbGVuX3QgZmxhZ3NpemUgPSBzaXplb2YgZmxhZzsKLQkJcmVzID0gZ2V0c29ja29wdChzLT5zb2NrX2ZkLCBsZXZlbCwgb3B0bmFtZSwKLQkJCQkgKHZvaWQgKikmZmxhZywgJmZsYWdzaXplKTsKLQkJaWYgKHJlcyA8IDApCi0JCQlyZXR1cm4gcy0+ZXJyb3JoYW5kbGVyKCk7Ci0JCXJldHVybiBQeUludF9Gcm9tTG9uZyhmbGFnKTsKLQl9CisgICAgaWYgKGJ1ZmxlbiA9PSAwKSB7CisgICAgICAgIGludCBmbGFnID0gMDsKKyAgICAgICAgc29ja2xlbl90IGZsYWdzaXplID0gc2l6ZW9mIGZsYWc7CisgICAgICAgIHJlcyA9IGdldHNvY2tvcHQocy0+c29ja19mZCwgbGV2ZWwsIG9wdG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikmZmxhZywgJmZsYWdzaXplKTsKKyAgICAgICAgaWYgKHJlcyA8IDApCisgICAgICAgICAgICByZXR1cm4gcy0+ZXJyb3JoYW5kbGVyKCk7CisgICAgICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhmbGFnKTsKKyAgICB9CiAjaWZkZWYgX19WTVMKLQkvKiBzb2NrbGVuX3QgaXMgdW5zaWduZWQgc28gbm8gbmVnYXRpdmUgdGVzdCBpcyBuZWVkZWQsCi0JICAgdGVzdCBidWZsZW4gPT0gMCBpcyBwcmV2aW91c2x5IGRvbmUgKi8KLQlpZiAoYnVmbGVuID4gMTAyNCkgeworICAgIC8qIHNvY2tsZW5fdCBpcyB1bnNpZ25lZCBzbyBubyBuZWdhdGl2ZSB0ZXN0IGlzIG5lZWRlZCwKKyAgICAgICB0ZXN0IGJ1ZmxlbiA9PSAwIGlzIHByZXZpb3VzbHkgZG9uZSAqLworICAgIGlmIChidWZsZW4gPiAxMDI0KSB7CiAjZWxzZQotCWlmIChidWZsZW4gPD0gMCB8fCBidWZsZW4gPiAxMDI0KSB7CisgICAgaWYgKGJ1ZmxlbiA8PSAwIHx8IGJ1ZmxlbiA+IDEwMjQpIHsKICNlbmRpZgotCQlQeUVycl9TZXRTdHJpbmcoc29ja2V0X2Vycm9yLAotCQkJCSJnZXRzb2Nrb3B0IGJ1ZmxlbiBvdXQgb2YgcmFuZ2UiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWJ1ZiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopTlVMTCwgYnVmbGVuKTsKLQlpZiAoYnVmID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXJlcyA9IGdldHNvY2tvcHQocy0+c29ja19mZCwgbGV2ZWwsIG9wdG5hbWUsCi0JCQkgKHZvaWQgKilQeVN0cmluZ19BU19TVFJJTkcoYnVmKSwgJmJ1Zmxlbik7Ci0JaWYgKHJlcyA8IDApIHsKLQkJUHlfREVDUkVGKGJ1Zik7Ci0JCXJldHVybiBzLT5lcnJvcmhhbmRsZXIoKTsKLQl9Ci0JX1B5U3RyaW5nX1Jlc2l6ZSgmYnVmLCBidWZsZW4pOwotCXJldHVybiBidWY7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhzb2NrZXRfZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiZ2V0c29ja29wdCBidWZsZW4gb3V0IG9mIHJhbmdlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBidWYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKU5VTEwsIGJ1Zmxlbik7CisgICAgaWYgKGJ1ZiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXMgPSBnZXRzb2Nrb3B0KHMtPnNvY2tfZmQsIGxldmVsLCBvcHRuYW1lLAorICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilQeVN0cmluZ19BU19TVFJJTkcoYnVmKSwgJmJ1Zmxlbik7CisgICAgaWYgKHJlcyA8IDApIHsKKyAgICAgICAgUHlfREVDUkVGKGJ1Zik7CisgICAgICAgIHJldHVybiBzLT5lcnJvcmhhbmRsZXIoKTsKKyAgICB9CisgICAgX1B5U3RyaW5nX1Jlc2l6ZSgmYnVmLCBidWZsZW4pOworICAgIHJldHVybiBidWY7CiAjZW5kaWYgLyogX19CRU9TX18gKi8KIH0KIApAQCAtMTg4NiwxOSArMTg4NiwxOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNvY2tfYmluZChQeVNvY2tldFNvY2tPYmplY3QgKnMsIFB5T2JqZWN0ICphZGRybykKIHsKLQlzb2NrX2FkZHJfdCBhZGRyYnVmOwotCWludCBhZGRybGVuOwotCWludCByZXM7CisgICAgc29ja19hZGRyX3QgYWRkcmJ1ZjsKKyAgICBpbnQgYWRkcmxlbjsKKyAgICBpbnQgcmVzOwogCi0JaWYgKCFnZXRzb2NrYWRkcmFyZyhzLCBhZGRybywgU0FTMlNBKCZhZGRyYnVmKSwgJmFkZHJsZW4pKQotCQlyZXR1cm4gTlVMTDsKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JcmVzID0gYmluZChzLT5zb2NrX2ZkLCBTQVMyU0EoJmFkZHJidWYpLCBhZGRybGVuKTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCWlmIChyZXMgPCAwKQotCQlyZXR1cm4gcy0+ZXJyb3JoYW5kbGVyKCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGlmICghZ2V0c29ja2FkZHJhcmcocywgYWRkcm8sIFNBUzJTQSgmYWRkcmJ1ZiksICZhZGRybGVuKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIHJlcyA9IGJpbmQocy0+c29ja19mZCwgU0FTMlNBKCZhZGRyYnVmKSwgYWRkcmxlbik7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBpZiAocmVzIDwgMCkKKyAgICAgICAgcmV0dXJuIHMtPmVycm9yaGFuZGxlcigpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogUHlEb2NfU1RSVkFSKGJpbmRfZG9jLApAQCAtMTkxNiwxNiArMTkxNiwxNiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNvY2tfY2xvc2UoUHlTb2NrZXRTb2NrT2JqZWN0ICpzKQogewotCVNPQ0tFVF9UIGZkOworICAgIFNPQ0tFVF9UIGZkOwogCi0JaWYgKChmZCA9IHMtPnNvY2tfZmQpICE9IC0xKSB7Ci0JCXMtPnNvY2tfZmQgPSAtMTsKLQkJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCQkodm9pZCkgU09DS0VUQ0xPU0UoZmQpOwotCQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCX0KLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKChmZCA9IHMtPnNvY2tfZmQpICE9IC0xKSB7CisgICAgICAgIHMtPnNvY2tfZmQgPSAtMTsKKyAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICAodm9pZCkgU09DS0VUQ0xPU0UoZmQpOworICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIH0KKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIFB5RG9jX1NUUlZBUihjbG9zZV9kb2MsCkBAIC0xOTM1LDkwICsxOTM1LDkwIEBACiAKIHN0YXRpYyBpbnQKIGludGVybmFsX2Nvbm5lY3QoUHlTb2NrZXRTb2NrT2JqZWN0ICpzLCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIsIGludCBhZGRybGVuLAotCQkgaW50ICp0aW1lb3V0cCkKKyAgICAgICAgICAgICAgICAgaW50ICp0aW1lb3V0cCkKIHsKLQlpbnQgcmVzLCB0aW1lb3V0OworICAgIGludCByZXMsIHRpbWVvdXQ7CiAKLQl0aW1lb3V0ID0gMDsKLQlyZXMgPSBjb25uZWN0KHMtPnNvY2tfZmQsIGFkZHIsIGFkZHJsZW4pOworICAgIHRpbWVvdXQgPSAwOworICAgIHJlcyA9IGNvbm5lY3Qocy0+c29ja19mZCwgYWRkciwgYWRkcmxlbik7CiAKICNpZmRlZiBNU19XSU5ET1dTCiAKLQlpZiAocy0+c29ja190aW1lb3V0ID4gMC4wKSB7Ci0JCWlmIChyZXMgPCAwICYmIFdTQUdldExhc3RFcnJvcigpID09IFdTQUVXT1VMREJMT0NLICYmCi0JCSAgICBJU19TRUxFQ1RBQkxFKHMpKSB7Ci0JCQkvKiBUaGlzIGlzIGEgbWVzcy4gIEJlc3Qgc29sdXRpb246IHRydXN0IHNlbGVjdCAqLwotCQkJZmRfc2V0IGZkczsKLQkJCWZkX3NldCBmZHNfZXhjOwotCQkJc3RydWN0IHRpbWV2YWwgdHY7Ci0JCQl0di50dl9zZWMgPSAoaW50KXMtPnNvY2tfdGltZW91dDsKLQkJCXR2LnR2X3VzZWMgPSAoaW50KSgocy0+c29ja190aW1lb3V0IC0gdHYudHZfc2VjKSAqIDFlNik7Ci0JCQlGRF9aRVJPKCZmZHMpOwotCQkJRkRfU0VUKHMtPnNvY2tfZmQsICZmZHMpOwotCQkJRkRfWkVSTygmZmRzX2V4Yyk7Ci0JCQlGRF9TRVQocy0+c29ja19mZCwgJmZkc19leGMpOwotCQkJcmVzID0gc2VsZWN0KHMtPnNvY2tfZmQrMSwgTlVMTCwgJmZkcywgJmZkc19leGMsICZ0dik7Ci0JCQlpZiAocmVzID09IDApIHsKLQkJCQlyZXMgPSBXU0FFV09VTERCTE9DSzsKLQkJCQl0aW1lb3V0ID0gMTsKLQkJCX0gZWxzZSBpZiAocmVzID4gMCkgewotCQkJCWlmIChGRF9JU1NFVChzLT5zb2NrX2ZkLCAmZmRzKSkKLQkJCQkJLyogVGhlIHNvY2tldCBpcyBpbiB0aGUgd3JpdGVhYmxlIHNldCAtIHRoaXMKLQkJCQkJICAgbWVhbnMgY29ubmVjdGVkICovCi0JCQkJCXJlcyA9IDA7Ci0JCQkJZWxzZSB7Ci0JCQkJCS8qIEFzIHBlciBNUyBkb2NzLCB3ZSBuZWVkIHRvIGNhbGwgZ2V0c29ja29wdCgpCi0JCQkJCSAgIHRvIGdldCB0aGUgdW5kZXJseWluZyBlcnJvciAqLwotCQkJCQlpbnQgcmVzX3NpemUgPSBzaXplb2YgcmVzOwotCQkJCQkvKiBJdCBtdXN0IGJlIGluIHRoZSBleGNlcHRpb24gc2V0ICovCi0JCQkJCWFzc2VydChGRF9JU1NFVChzLT5zb2NrX2ZkLCAmZmRzX2V4YykpOwotCQkJCQlpZiAoMCA9PSBnZXRzb2Nrb3B0KHMtPnNvY2tfZmQsIFNPTF9TT0NLRVQsIFNPX0VSUk9SLAotCQkJCQkgICAgICAgICAgICAgICAgICAgIChjaGFyICopJnJlcywgJnJlc19zaXplKSkKLQkJCQkJCS8qIGdldHNvY2tvcHQgYWxzbyBjbGVhcnMgV1NBR2V0TGFzdEVycm9yLAotCQkJCQkJICAgc28gcmVzZXQgaXQgYmFjay4gKi8KLQkJCQkJCVdTQVNldExhc3RFcnJvcihyZXMpOwotCQkJCQllbHNlCi0JCQkJCQlyZXMgPSBXU0FHZXRMYXN0RXJyb3IoKTsKLQkJCQl9Ci0JCQl9Ci0JCQkvKiBlbHNlIGlmIChyZXMgPCAwKSBhbiBlcnJvciBvY2N1cnJlZCAqLwotCQl9Ci0JfQorICAgIGlmIChzLT5zb2NrX3RpbWVvdXQgPiAwLjApIHsKKyAgICAgICAgaWYgKHJlcyA8IDAgJiYgV1NBR2V0TGFzdEVycm9yKCkgPT0gV1NBRVdPVUxEQkxPQ0sgJiYKKyAgICAgICAgICAgIElTX1NFTEVDVEFCTEUocykpIHsKKyAgICAgICAgICAgIC8qIFRoaXMgaXMgYSBtZXNzLiAgQmVzdCBzb2x1dGlvbjogdHJ1c3Qgc2VsZWN0ICovCisgICAgICAgICAgICBmZF9zZXQgZmRzOworICAgICAgICAgICAgZmRfc2V0IGZkc19leGM7CisgICAgICAgICAgICBzdHJ1Y3QgdGltZXZhbCB0djsKKyAgICAgICAgICAgIHR2LnR2X3NlYyA9IChpbnQpcy0+c29ja190aW1lb3V0OworICAgICAgICAgICAgdHYudHZfdXNlYyA9IChpbnQpKChzLT5zb2NrX3RpbWVvdXQgLSB0di50dl9zZWMpICogMWU2KTsKKyAgICAgICAgICAgIEZEX1pFUk8oJmZkcyk7CisgICAgICAgICAgICBGRF9TRVQocy0+c29ja19mZCwgJmZkcyk7CisgICAgICAgICAgICBGRF9aRVJPKCZmZHNfZXhjKTsKKyAgICAgICAgICAgIEZEX1NFVChzLT5zb2NrX2ZkLCAmZmRzX2V4Yyk7CisgICAgICAgICAgICByZXMgPSBzZWxlY3Qocy0+c29ja19mZCsxLCBOVUxMLCAmZmRzLCAmZmRzX2V4YywgJnR2KTsKKyAgICAgICAgICAgIGlmIChyZXMgPT0gMCkgeworICAgICAgICAgICAgICAgIHJlcyA9IFdTQUVXT1VMREJMT0NLOworICAgICAgICAgICAgICAgIHRpbWVvdXQgPSAxOworICAgICAgICAgICAgfSBlbHNlIGlmIChyZXMgPiAwKSB7CisgICAgICAgICAgICAgICAgaWYgKEZEX0lTU0VUKHMtPnNvY2tfZmQsICZmZHMpKQorICAgICAgICAgICAgICAgICAgICAvKiBUaGUgc29ja2V0IGlzIGluIHRoZSB3cml0ZWFibGUgc2V0IC0gdGhpcworICAgICAgICAgICAgICAgICAgICAgICBtZWFucyBjb25uZWN0ZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgcmVzID0gMDsKKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLyogQXMgcGVyIE1TIGRvY3MsIHdlIG5lZWQgdG8gY2FsbCBnZXRzb2Nrb3B0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgdG8gZ2V0IHRoZSB1bmRlcmx5aW5nIGVycm9yICovCisgICAgICAgICAgICAgICAgICAgIGludCByZXNfc2l6ZSA9IHNpemVvZiByZXM7CisgICAgICAgICAgICAgICAgICAgIC8qIEl0IG11c3QgYmUgaW4gdGhlIGV4Y2VwdGlvbiBzZXQgKi8KKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KEZEX0lTU0VUKHMtPnNvY2tfZmQsICZmZHNfZXhjKSk7CisgICAgICAgICAgICAgICAgICAgIGlmICgwID09IGdldHNvY2tvcHQocy0+c29ja19mZCwgU09MX1NPQ0tFVCwgU09fRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikmcmVzLCAmcmVzX3NpemUpKQorICAgICAgICAgICAgICAgICAgICAgICAgLyogZ2V0c29ja29wdCBhbHNvIGNsZWFycyBXU0FHZXRMYXN0RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzbyByZXNldCBpdCBiYWNrLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgV1NBU2V0TGFzdEVycm9yKHJlcyk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IFdTQUdldExhc3RFcnJvcigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIGVsc2UgaWYgKHJlcyA8IDApIGFuIGVycm9yIG9jY3VycmVkICovCisgICAgICAgIH0KKyAgICB9CiAKLQlpZiAocmVzIDwgMCkKLQkJcmVzID0gV1NBR2V0TGFzdEVycm9yKCk7CisgICAgaWYgKHJlcyA8IDApCisgICAgICAgIHJlcyA9IFdTQUdldExhc3RFcnJvcigpOwogCiAjZWxzZQogCi0JaWYgKHMtPnNvY2tfdGltZW91dCA+IDAuMCkgewotICAgICAgICAgICAgICAgIGlmIChyZXMgPCAwICYmIGVycm5vID09IEVJTlBST0dSRVNTICYmIElTX1NFTEVDVEFCTEUocykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQgPSBpbnRlcm5hbF9zZWxlY3QocywgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGltZW91dCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJ1ZyAjMTAxOTgwODogaW4gY2FzZSBvZiBhbiBFSU5QUk9HUkVTUywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZSBnZXRzb2Nrb3B0KFNPX0VSUk9SKSB0byBnZXQgdGhlIHJlYWwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2NrbGVuX3QgcmVzX3NpemUgPSBzaXplb2YgcmVzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZClnZXRzb2Nrb3B0KHMtPnNvY2tfZmQsIFNPTF9TT0NLRVQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPX0VSUk9SLCAmcmVzLCAmcmVzX3NpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzID09IEVJU0NPTk4pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJybm8gPSByZXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0aW1lb3V0ID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IGVycm5vOyAgICAgICAgICAgIC8qIGhhZCBlcnJvciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCQkJZWxzZQotCQkJCXJlcyA9IEVXT1VMREJMT0NLOwkvKiB0aW1lZCBvdXQgKi8KLQkJfQotCX0KKyAgICBpZiAocy0+c29ja190aW1lb3V0ID4gMC4wKSB7CisgICAgICAgIGlmIChyZXMgPCAwICYmIGVycm5vID09IEVJTlBST0dSRVNTICYmIElTX1NFTEVDVEFCTEUocykpIHsKKyAgICAgICAgICAgIHRpbWVvdXQgPSBpbnRlcm5hbF9zZWxlY3QocywgMSk7CisgICAgICAgICAgICBpZiAodGltZW91dCA9PSAwKSB7CisgICAgICAgICAgICAgICAgLyogQnVnICMxMDE5ODA4OiBpbiBjYXNlIG9mIGFuIEVJTlBST0dSRVNTLAorICAgICAgICAgICAgICAgICAgIHVzZSBnZXRzb2Nrb3B0KFNPX0VSUk9SKSB0byBnZXQgdGhlIHJlYWwKKyAgICAgICAgICAgICAgICAgICBlcnJvci4gKi8KKyAgICAgICAgICAgICAgICBzb2NrbGVuX3QgcmVzX3NpemUgPSBzaXplb2YgcmVzOworICAgICAgICAgICAgICAgICh2b2lkKWdldHNvY2tvcHQocy0+c29ja19mZCwgU09MX1NPQ0tFVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPX0VSUk9SLCAmcmVzLCAmcmVzX3NpemUpOworICAgICAgICAgICAgICAgIGlmIChyZXMgPT0gRUlTQ09OTikKKyAgICAgICAgICAgICAgICAgICAgcmVzID0gMDsKKyAgICAgICAgICAgICAgICBlcnJubyA9IHJlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHRpbWVvdXQgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICByZXMgPSBlcnJubzsgICAgICAgICAgICAvKiBoYWQgZXJyb3IgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXMgPSBFV09VTERCTE9DSzsgICAgICAgICAgICAgICAgICAgICAgLyogdGltZWQgb3V0ICovCisgICAgICAgIH0KKyAgICB9CiAKLQlpZiAocmVzIDwgMCkKLQkJcmVzID0gZXJybm87CisgICAgaWYgKHJlcyA8IDApCisgICAgICAgIHJlcyA9IGVycm5vOwogCiAjZW5kaWYKLQkqdGltZW91dHAgPSB0aW1lb3V0OworICAgICp0aW1lb3V0cCA9IHRpbWVvdXQ7CiAKLQlyZXR1cm4gcmVzOworICAgIHJldHVybiByZXM7CiB9CiAKIC8qIHMuY29ubmVjdChzb2NrYWRkcikgbWV0aG9kICovCkBAIC0yMDI2LDI2ICsyMDI2LDI2IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc29ja19jb25uZWN0KFB5U29ja2V0U29ja09iamVjdCAqcywgUHlPYmplY3QgKmFkZHJvKQogewotCXNvY2tfYWRkcl90IGFkZHJidWY7Ci0JaW50IGFkZHJsZW47Ci0JaW50IHJlczsKLQlpbnQgdGltZW91dDsKKyAgICBzb2NrX2FkZHJfdCBhZGRyYnVmOworICAgIGludCBhZGRybGVuOworICAgIGludCByZXM7CisgICAgaW50IHRpbWVvdXQ7CiAKLQlpZiAoIWdldHNvY2thZGRyYXJnKHMsIGFkZHJvLCBTQVMyU0EoJmFkZHJidWYpLCAmYWRkcmxlbikpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghZ2V0c29ja2FkZHJhcmcocywgYWRkcm8sIFNBUzJTQSgmYWRkcmJ1ZiksICZhZGRybGVuKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JcmVzID0gaW50ZXJuYWxfY29ubmVjdChzLCBTQVMyU0EoJmFkZHJidWYpLCBhZGRybGVuLCAmdGltZW91dCk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgcmVzID0gaW50ZXJuYWxfY29ubmVjdChzLCBTQVMyU0EoJmFkZHJidWYpLCBhZGRybGVuLCAmdGltZW91dCk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKIAotCWlmICh0aW1lb3V0ID09IDEpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKHNvY2tldF90aW1lb3V0LCAidGltZWQgb3V0Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAocmVzICE9IDApCi0JCXJldHVybiBzLT5lcnJvcmhhbmRsZXIoKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKHRpbWVvdXQgPT0gMSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoc29ja2V0X3RpbWVvdXQsICJ0aW1lZCBvdXQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChyZXMgIT0gMCkKKyAgICAgICAgcmV0dXJuIHMtPmVycm9yaGFuZGxlcigpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogUHlEb2NfU1RSVkFSKGNvbm5lY3RfZG9jLApAQCAtMjA2MCwyNiArMjA2MCwyNiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNvY2tfY29ubmVjdF9leChQeVNvY2tldFNvY2tPYmplY3QgKnMsIFB5T2JqZWN0ICphZGRybykKIHsKLQlzb2NrX2FkZHJfdCBhZGRyYnVmOwotCWludCBhZGRybGVuOwotCWludCByZXM7Ci0JaW50IHRpbWVvdXQ7CisgICAgc29ja19hZGRyX3QgYWRkcmJ1ZjsKKyAgICBpbnQgYWRkcmxlbjsKKyAgICBpbnQgcmVzOworICAgIGludCB0aW1lb3V0OwogCi0JaWYgKCFnZXRzb2NrYWRkcmFyZyhzLCBhZGRybywgU0FTMlNBKCZhZGRyYnVmKSwgJmFkZHJsZW4pKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldHNvY2thZGRyYXJnKHMsIGFkZHJvLCBTQVMyU0EoJmFkZHJidWYpLCAmYWRkcmxlbikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCXJlcyA9IGludGVybmFsX2Nvbm5lY3QocywgU0FTMlNBKCZhZGRyYnVmKSwgYWRkcmxlbiwgJnRpbWVvdXQpOwotCVB5X0VORF9BTExPV19USFJFQURTCisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIHJlcyA9IGludGVybmFsX2Nvbm5lY3QocywgU0FTMlNBKCZhZGRyYnVmKSwgYWRkcmxlbiwgJnRpbWVvdXQpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCiAKLQkvKiBTaWduYWxzIGFyZSBub3QgZXJyb3JzICh0aG91Z2ggdGhleSBtYXkgcmFpc2UgZXhjZXB0aW9ucykuICBBZGFwdGVkCi0JICAgZnJvbSBQeUVycl9TZXRGcm9tRXJybm9XaXRoRmlsZW5hbWVPYmplY3QoKS4gKi8KKyAgICAvKiBTaWduYWxzIGFyZSBub3QgZXJyb3JzICh0aG91Z2ggdGhleSBtYXkgcmFpc2UgZXhjZXB0aW9ucykuICBBZGFwdGVkCisgICAgICAgZnJvbSBQeUVycl9TZXRGcm9tRXJybm9XaXRoRmlsZW5hbWVPYmplY3QoKS4gKi8KICNpZmRlZiBFSU5UUgotCWlmIChyZXMgPT0gRUlOVFIgJiYgUHlFcnJfQ2hlY2tTaWduYWxzKCkpCi0JCXJldHVybiBOVUxMOworICAgIGlmIChyZXMgPT0gRUlOVFIgJiYgUHlFcnJfQ2hlY2tTaWduYWxzKCkpCisgICAgICAgIHJldHVybiBOVUxMOwogI2VuZGlmCiAKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIHJlcyk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKSByZXMpOwogfQogCiBQeURvY19TVFJWQVIoY29ubmVjdF9leF9kb2MsCkBAIC0yMDk1LDkgKzIwOTUsOSBAQAogc29ja19maWxlbm8oUHlTb2NrZXRTb2NrT2JqZWN0ICpzKQogewogI2lmIFNJWkVPRl9TT0NLRVRfVCA8PSBTSVpFT0ZfTE9ORwotCXJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZykgcy0+c29ja19mZCk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKSBzLT5zb2NrX2ZkKTsKICNlbHNlCi0JcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZ0xvbmcoKFBZX0xPTkdfTE9ORylzLT5zb2NrX2ZkKTsKKyAgICByZXR1cm4gUHlMb25nX0Zyb21Mb25nTG9uZygoUFlfTE9OR19MT05HKXMtPnNvY2tfZmQpOwogI2VuZGlmCiB9CiAKQEAgLTIxMTMsMTkgKzIxMTMsMTkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzb2NrX2R1cChQeVNvY2tldFNvY2tPYmplY3QgKnMpCiB7Ci0JU09DS0VUX1QgbmV3ZmQ7Ci0JUHlPYmplY3QgKnNvY2s7CisgICAgU09DS0VUX1QgbmV3ZmQ7CisgICAgUHlPYmplY3QgKnNvY2s7CiAKLQluZXdmZCA9IGR1cChzLT5zb2NrX2ZkKTsKLQlpZiAobmV3ZmQgPCAwKQotCQlyZXR1cm4gcy0+ZXJyb3JoYW5kbGVyKCk7Ci0Jc29jayA9IChQeU9iamVjdCAqKSBuZXdfc29ja29iamVjdChuZXdmZCwKLQkJCQkJICAgcy0+c29ja19mYW1pbHksCi0JCQkJCSAgIHMtPnNvY2tfdHlwZSwKLQkJCQkJICAgcy0+c29ja19wcm90byk7Ci0JaWYgKHNvY2sgPT0gTlVMTCkKLQkJU09DS0VUQ0xPU0UobmV3ZmQpOwotCXJldHVybiBzb2NrOworICAgIG5ld2ZkID0gZHVwKHMtPnNvY2tfZmQpOworICAgIGlmIChuZXdmZCA8IDApCisgICAgICAgIHJldHVybiBzLT5lcnJvcmhhbmRsZXIoKTsKKyAgICBzb2NrID0gKFB5T2JqZWN0ICopIG5ld19zb2Nrb2JqZWN0KG5ld2ZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+c29ja19mYW1pbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5zb2NrX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5zb2NrX3Byb3RvKTsKKyAgICBpZiAoc29jayA9PSBOVUxMKQorICAgICAgICBTT0NLRVRDTE9TRShuZXdmZCk7CisgICAgcmV0dXJuIHNvY2s7CiB9CiAKIFB5RG9jX1NUUlZBUihkdXBfZG9jLApAQCAtMjE0MSwyMCArMjE0MSwyMCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNvY2tfZ2V0c29ja25hbWUoUHlTb2NrZXRTb2NrT2JqZWN0ICpzKQogewotCXNvY2tfYWRkcl90IGFkZHJidWY7Ci0JaW50IHJlczsKLQlzb2NrbGVuX3QgYWRkcmxlbjsKKyAgICBzb2NrX2FkZHJfdCBhZGRyYnVmOworICAgIGludCByZXM7CisgICAgc29ja2xlbl90IGFkZHJsZW47CiAKLQlpZiAoIWdldHNvY2thZGRybGVuKHMsICZhZGRybGVuKSkKLQkJcmV0dXJuIE5VTEw7Ci0JbWVtc2V0KCZhZGRyYnVmLCAwLCBhZGRybGVuKTsKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JcmVzID0gZ2V0c29ja25hbWUocy0+c29ja19mZCwgU0FTMlNBKCZhZGRyYnVmKSwgJmFkZHJsZW4pOwotCVB5X0VORF9BTExPV19USFJFQURTCi0JaWYgKHJlcyA8IDApCi0JCXJldHVybiBzLT5lcnJvcmhhbmRsZXIoKTsKLQlyZXR1cm4gbWFrZXNvY2thZGRyKHMtPnNvY2tfZmQsIFNBUzJTQSgmYWRkcmJ1ZiksIGFkZHJsZW4sCi0JCQkgICAgcy0+c29ja19wcm90byk7CisgICAgaWYgKCFnZXRzb2NrYWRkcmxlbihzLCAmYWRkcmxlbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG1lbXNldCgmYWRkcmJ1ZiwgMCwgYWRkcmxlbik7CisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIHJlcyA9IGdldHNvY2tuYW1lKHMtPnNvY2tfZmQsIFNBUzJTQSgmYWRkcmJ1ZiksICZhZGRybGVuKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIGlmIChyZXMgPCAwKQorICAgICAgICByZXR1cm4gcy0+ZXJyb3JoYW5kbGVyKCk7CisgICAgcmV0dXJuIG1ha2Vzb2NrYWRkcihzLT5zb2NrX2ZkLCBTQVMyU0EoJmFkZHJidWYpLCBhZGRybGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgcy0+c29ja19wcm90byk7CiB9CiAKIFB5RG9jX1NUUlZBUihnZXRzb2NrbmFtZV9kb2MsCkBAIC0yMTY0LDI2ICsyMTY0LDI2IEBACiBpbmZvIGlzIGEgcGFpciAoaG9zdGFkZHIsIHBvcnQpLiIpOwogCiAKLSNpZmRlZiBIQVZFX0dFVFBFRVJOQU1FCQkvKiBDcmF5IEFQUCBkb2Vzbid0IGhhdmUgdGhpcyA6LSggKi8KKyNpZmRlZiBIQVZFX0dFVFBFRVJOQU1FICAgICAgICAgLyogQ3JheSBBUFAgZG9lc24ndCBoYXZlIHRoaXMgOi0oICovCiAvKiBzLmdldHBlZXJuYW1lKCkgbWV0aG9kICovCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzb2NrX2dldHBlZXJuYW1lKFB5U29ja2V0U29ja09iamVjdCAqcykKIHsKLQlzb2NrX2FkZHJfdCBhZGRyYnVmOwotCWludCByZXM7Ci0Jc29ja2xlbl90IGFkZHJsZW47CisgICAgc29ja19hZGRyX3QgYWRkcmJ1ZjsKKyAgICBpbnQgcmVzOworICAgIHNvY2tsZW5fdCBhZGRybGVuOwogCi0JaWYgKCFnZXRzb2NrYWRkcmxlbihzLCAmYWRkcmxlbikpCi0JCXJldHVybiBOVUxMOwotCW1lbXNldCgmYWRkcmJ1ZiwgMCwgYWRkcmxlbik7Ci0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCXJlcyA9IGdldHBlZXJuYW1lKHMtPnNvY2tfZmQsIFNBUzJTQSgmYWRkcmJ1ZiksICZhZGRybGVuKTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCWlmIChyZXMgPCAwKQotCQlyZXR1cm4gcy0+ZXJyb3JoYW5kbGVyKCk7Ci0JcmV0dXJuIG1ha2Vzb2NrYWRkcihzLT5zb2NrX2ZkLCBTQVMyU0EoJmFkZHJidWYpLCBhZGRybGVuLAotCQkJICAgIHMtPnNvY2tfcHJvdG8pOworICAgIGlmICghZ2V0c29ja2FkZHJsZW4ocywgJmFkZHJsZW4pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBtZW1zZXQoJmFkZHJidWYsIDAsIGFkZHJsZW4pOworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICByZXMgPSBnZXRwZWVybmFtZShzLT5zb2NrX2ZkLCBTQVMyU0EoJmFkZHJidWYpLCAmYWRkcmxlbik7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBpZiAocmVzIDwgMCkKKyAgICAgICAgcmV0dXJuIHMtPmVycm9yaGFuZGxlcigpOworICAgIHJldHVybiBtYWtlc29ja2FkZHIocy0+c29ja19mZCwgU0FTMlNBKCZhZGRyYnVmKSwgYWRkcmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPnNvY2tfcHJvdG8pOwogfQogCiBQeURvY19TVFJWQVIoZ2V0cGVlcm5hbWVfZG9jLApAQCAtMjIwMCwyMSArMjIwMCwyMSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNvY2tfbGlzdGVuKFB5U29ja2V0U29ja09iamVjdCAqcywgUHlPYmplY3QgKmFyZykKIHsKLQlpbnQgYmFja2xvZzsKLQlpbnQgcmVzOworICAgIGludCBiYWNrbG9nOworICAgIGludCByZXM7CiAKLQliYWNrbG9nID0gUHlJbnRfQXNMb25nKGFyZyk7Ci0JaWYgKGJhY2tsb2cgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCWlmIChiYWNrbG9nIDwgMSkKLQkJYmFja2xvZyA9IDE7Ci0JcmVzID0gbGlzdGVuKHMtPnNvY2tfZmQsIGJhY2tsb2cpOwotCVB5X0VORF9BTExPV19USFJFQURTCi0JaWYgKHJlcyA8IDApCi0JCXJldHVybiBzLT5lcnJvcmhhbmRsZXIoKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgYmFja2xvZyA9IFB5SW50X0FzTG9uZyhhcmcpOworICAgIGlmIChiYWNrbG9nID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICBpZiAoYmFja2xvZyA8IDEpCisgICAgICAgIGJhY2tsb2cgPSAxOworICAgIHJlcyA9IGxpc3RlbihzLT5zb2NrX2ZkLCBiYWNrbG9nKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIGlmIChyZXMgPCAwKQorICAgICAgICByZXR1cm4gcy0+ZXJyb3JoYW5kbGVyKCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBQeURvY19TVFJWQVIobGlzdGVuX2RvYywKQEAgLTIyMzYsNDggKzIyMzYsNDggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzb2NrX21ha2VmaWxlKFB5U29ja2V0U29ja09iamVjdCAqcywgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZXh0ZXJuIGludCBmY2xvc2UoRklMRSAqKTsKLQljaGFyICptb2RlID0gInIiOwotCWludCBidWZzaXplID0gLTE7CisgICAgZXh0ZXJuIGludCBmY2xvc2UoRklMRSAqKTsKKyAgICBjaGFyICptb2RlID0gInIiOworICAgIGludCBidWZzaXplID0gLTE7CiAjaWZkZWYgTVNfV0lOMzIKLQlQeV9pbnRwdHJfdCBmZDsKKyAgICBQeV9pbnRwdHJfdCBmZDsKICNlbHNlCi0JaW50IGZkOworICAgIGludCBmZDsKICNlbmRpZgotCUZJTEUgKmZwOwotCVB5T2JqZWN0ICpmOworICAgIEZJTEUgKmZwOworICAgIFB5T2JqZWN0ICpmOwogI2lmZGVmIF9fVk1TCi0JY2hhciAqbW9kZV9yID0gInIiOwotCWNoYXIgKm1vZGVfdyA9ICJ3IjsKKyAgICBjaGFyICptb2RlX3IgPSAiciI7CisgICAgY2hhciAqbW9kZV93ID0gInciOwogI2VuZGlmCiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxzaTptYWtlZmlsZSIsICZtb2RlLCAmYnVmc2l6ZSkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifHNpOm1ha2VmaWxlIiwgJm1vZGUsICZidWZzaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAjaWZkZWYgX19WTVMKLQlpZiAoc3RyY21wKG1vZGUsInJiIikgPT0gMCkgewotCSAgICBtb2RlID0gbW9kZV9yOwotCX0KLQllbHNlIHsKLQkJaWYgKHN0cmNtcChtb2RlLCJ3YiIpID09IDApIHsKLQkJCW1vZGUgPSBtb2RlX3c7Ci0JCX0KLQl9CisgICAgaWYgKHN0cmNtcChtb2RlLCJyYiIpID09IDApIHsKKyAgICAgICAgbW9kZSA9IG1vZGVfcjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGlmIChzdHJjbXAobW9kZSwid2IiKSA9PSAwKSB7CisgICAgICAgICAgICBtb2RlID0gbW9kZV93OworICAgICAgICB9CisgICAgfQogI2VuZGlmCiAjaWZkZWYgTVNfV0lOMzIKLQlpZiAoKChmZCA9IF9vcGVuX29zZmhhbmRsZShzLT5zb2NrX2ZkLCBfT19CSU5BUlkpKSA8IDApIHx8Ci0JICAgICgoZmQgPSBkdXAoZmQpKSA8IDApIHx8ICgoZnAgPSBmZG9wZW4oZmQsIG1vZGUpKSA9PSBOVUxMKSkKKyAgICBpZiAoKChmZCA9IF9vcGVuX29zZmhhbmRsZShzLT5zb2NrX2ZkLCBfT19CSU5BUlkpKSA8IDApIHx8CisgICAgICAgICgoZmQgPSBkdXAoZmQpKSA8IDApIHx8ICgoZnAgPSBmZG9wZW4oZmQsIG1vZGUpKSA9PSBOVUxMKSkKICNlbHNlCi0JaWYgKChmZCA9IGR1cChzLT5zb2NrX2ZkKSkgPCAwIHx8IChmcCA9IGZkb3BlbihmZCwgbW9kZSkpID09IE5VTEwpCisgICAgaWYgKChmZCA9IGR1cChzLT5zb2NrX2ZkKSkgPCAwIHx8IChmcCA9IGZkb3BlbihmZCwgbW9kZSkpID09IE5VTEwpCiAjZW5kaWYKLQl7Ci0JCWlmIChmZCA+PSAwKQotCQkJU09DS0VUQ0xPU0UoZmQpOwotCQlyZXR1cm4gcy0+ZXJyb3JoYW5kbGVyKCk7Ci0JfQotCWYgPSBQeUZpbGVfRnJvbUZpbGUoZnAsICI8c29ja2V0PiIsIG1vZGUsIGZjbG9zZSk7Ci0JaWYgKGYgIT0gTlVMTCkKLQkJUHlGaWxlX1NldEJ1ZlNpemUoZiwgYnVmc2l6ZSk7Ci0JcmV0dXJuIGY7CisgICAgeworICAgICAgICBpZiAoZmQgPj0gMCkKKyAgICAgICAgICAgIFNPQ0tFVENMT1NFKGZkKTsKKyAgICAgICAgcmV0dXJuIHMtPmVycm9yaGFuZGxlcigpOworICAgIH0KKyAgICBmID0gUHlGaWxlX0Zyb21GaWxlKGZwLCAiPHNvY2tldD4iLCBtb2RlLCBmY2xvc2UpOworICAgIGlmIChmICE9IE5VTEwpCisgICAgICAgIFB5RmlsZV9TZXRCdWZTaXplKGYsIGJ1ZnNpemUpOworICAgIHJldHVybiBmOwogfQogCiBQeURvY19TVFJWQVIobWFrZWZpbGVfZG9jLApAQCAtMjI5OSw3NiArMjI5OSw3NiBAQAogc3RhdGljIHNzaXplX3QKIHNvY2tfcmVjdl9ndXRzKFB5U29ja2V0U29ja09iamVjdCAqcywgY2hhciogY2J1ZiwgaW50IGxlbiwgaW50IGZsYWdzKQogewotICAgICAgICBzc2l6ZV90IG91dGxlbiA9IC0xOwotICAgICAgICBpbnQgdGltZW91dDsKKyAgICBzc2l6ZV90IG91dGxlbiA9IC0xOworICAgIGludCB0aW1lb3V0OwogI2lmZGVmIF9fVk1TCi0JaW50IHJlbWFpbmluZzsKLQljaGFyICpyZWFkX2J1ZjsKKyAgICBpbnQgcmVtYWluaW5nOworICAgIGNoYXIgKnJlYWRfYnVmOwogI2VuZGlmCiAKLQlpZiAoIUlTX1NFTEVDVEFCTEUocykpIHsKLQkJc2VsZWN0X2Vycm9yKCk7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgaWYgKCFJU19TRUxFQ1RBQkxFKHMpKSB7CisgICAgICAgIHNlbGVjdF9lcnJvcigpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCiAjaWZuZGVmIF9fVk1TCi0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCXRpbWVvdXQgPSBpbnRlcm5hbF9zZWxlY3QocywgMCk7Ci0JaWYgKCF0aW1lb3V0KQotCQlvdXRsZW4gPSByZWN2KHMtPnNvY2tfZmQsIGNidWYsIGxlbiwgZmxhZ3MpOwotCVB5X0VORF9BTExPV19USFJFQURTCisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIHRpbWVvdXQgPSBpbnRlcm5hbF9zZWxlY3QocywgMCk7CisgICAgaWYgKCF0aW1lb3V0KQorICAgICAgICBvdXRsZW4gPSByZWN2KHMtPnNvY2tfZmQsIGNidWYsIGxlbiwgZmxhZ3MpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCiAKLQlpZiAodGltZW91dCA9PSAxKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhzb2NrZXRfdGltZW91dCwgInRpbWVkIG91dCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmIChvdXRsZW4gPCAwKSB7Ci0JCS8qIE5vdGU6IHRoZSBjYWxsIHRvIGVycm9yaGFuZGxlcigpIEFMV0FZUyBpbmRpcmVjdGx5IHJldHVybmVkCi0JCSAgIE5VTEwsIHNvIGlnbm9yZSBpdHMgcmV0dXJuIHZhbHVlICovCi0JCXMtPmVycm9yaGFuZGxlcigpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIGlmICh0aW1lb3V0ID09IDEpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHNvY2tldF90aW1lb3V0LCAidGltZWQgb3V0Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKG91dGxlbiA8IDApIHsKKyAgICAgICAgLyogTm90ZTogdGhlIGNhbGwgdG8gZXJyb3JoYW5kbGVyKCkgQUxXQVlTIGluZGlyZWN0bHkgcmV0dXJuZWQKKyAgICAgICAgICAgTlVMTCwgc28gaWdub3JlIGl0cyByZXR1cm4gdmFsdWUgKi8KKyAgICAgICAgcy0+ZXJyb3JoYW5kbGVyKCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAjZWxzZQotCXJlYWRfYnVmID0gY2J1ZjsKLQlyZW1haW5pbmcgPSBsZW47Ci0Jd2hpbGUgKHJlbWFpbmluZyAhPSAwKSB7Ci0JCXVuc2lnbmVkIGludCBzZWdtZW50OwotCQlpbnQgbnJlYWQgPSAtMTsKKyAgICByZWFkX2J1ZiA9IGNidWY7CisgICAgcmVtYWluaW5nID0gbGVuOworICAgIHdoaWxlIChyZW1haW5pbmcgIT0gMCkgeworICAgICAgICB1bnNpZ25lZCBpbnQgc2VnbWVudDsKKyAgICAgICAgaW50IG5yZWFkID0gLTE7CiAKLQkJc2VnbWVudCA9IHJlbWFpbmluZyAvU0VHTUVOVF9TSVpFOwotCQlpZiAoc2VnbWVudCAhPSAwKSB7Ci0JCQlzZWdtZW50ID0gU0VHTUVOVF9TSVpFOwotCQl9Ci0JCWVsc2UgewotCQkJc2VnbWVudCA9IHJlbWFpbmluZzsKLQkJfQorICAgICAgICBzZWdtZW50ID0gcmVtYWluaW5nIC9TRUdNRU5UX1NJWkU7CisgICAgICAgIGlmIChzZWdtZW50ICE9IDApIHsKKyAgICAgICAgICAgIHNlZ21lbnQgPSBTRUdNRU5UX1NJWkU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBzZWdtZW50ID0gcmVtYWluaW5nOworICAgICAgICB9CiAKLQkJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCQl0aW1lb3V0ID0gaW50ZXJuYWxfc2VsZWN0KHMsIDApOwotCQlpZiAoIXRpbWVvdXQpCi0JCQlucmVhZCA9IHJlY3Yocy0+c29ja19mZCwgcmVhZF9idWYsIHNlZ21lbnQsIGZsYWdzKTsKLQkJUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICB0aW1lb3V0ID0gaW50ZXJuYWxfc2VsZWN0KHMsIDApOworICAgICAgICBpZiAoIXRpbWVvdXQpCisgICAgICAgICAgICBucmVhZCA9IHJlY3Yocy0+c29ja19mZCwgcmVhZF9idWYsIHNlZ21lbnQsIGZsYWdzKTsKKyAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKIAotCQlpZiAodGltZW91dCA9PSAxKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoc29ja2V0X3RpbWVvdXQsICJ0aW1lZCBvdXQiKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlpZiAobnJlYWQgPCAwKSB7Ci0JCQlzLT5lcnJvcmhhbmRsZXIoKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlpZiAobnJlYWQgIT0gcmVtYWluaW5nKSB7Ci0JCQlyZWFkX2J1ZiArPSBucmVhZDsKLQkJCWJyZWFrOwotCQl9CisgICAgICAgIGlmICh0aW1lb3V0ID09IDEpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhzb2NrZXRfdGltZW91dCwgInRpbWVkIG91dCIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGlmIChucmVhZCA8IDApIHsKKyAgICAgICAgICAgIHMtPmVycm9yaGFuZGxlcigpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGlmIChucmVhZCAhPSByZW1haW5pbmcpIHsKKyAgICAgICAgICAgIHJlYWRfYnVmICs9IG5yZWFkOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KIAotCQlyZW1haW5pbmcgLT0gc2VnbWVudDsKLQkJcmVhZF9idWYgKz0gc2VnbWVudDsKLQl9Ci0Jb3V0bGVuID0gcmVhZF9idWYgLSBjYnVmOworICAgICAgICByZW1haW5pbmcgLT0gc2VnbWVudDsKKyAgICAgICAgcmVhZF9idWYgKz0gc2VnbWVudDsKKyAgICB9CisgICAgb3V0bGVuID0gcmVhZF9idWYgLSBjYnVmOwogI2VuZGlmIC8qICFfX1ZNUyAqLwogCi0JcmV0dXJuIG91dGxlbjsKKyAgICByZXR1cm4gb3V0bGVuOwogfQogCiAKQEAgLTIzNzcsNDEgKzIzNzcsNDEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzb2NrX3JlY3YoUHlTb2NrZXRTb2NrT2JqZWN0ICpzLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgcmVjdmxlbiwgZmxhZ3MgPSAwOwotICAgICAgICBzc2l6ZV90IG91dGxlbjsKLQlQeU9iamVjdCAqYnVmOworICAgIGludCByZWN2bGVuLCBmbGFncyA9IDA7CisgICAgc3NpemVfdCBvdXRsZW47CisgICAgUHlPYmplY3QgKmJ1ZjsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaXxpOnJlY3YiLCAmcmVjdmxlbiwgJmZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpfGk6cmVjdiIsICZyZWN2bGVuLCAmZmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChyZWN2bGVuIDwgMCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkibmVnYXRpdmUgYnVmZmVyc2l6ZSBpbiByZWN2Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAocmVjdmxlbiA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAibmVnYXRpdmUgYnVmZmVyc2l6ZSBpbiByZWN2Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCS8qIEFsbG9jYXRlIGEgbmV3IHN0cmluZy4gKi8KLQlidWYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKSAwLCByZWN2bGVuKTsKLQlpZiAoYnVmID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIC8qIEFsbG9jYXRlIGEgbmV3IHN0cmluZy4gKi8KKyAgICBidWYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKSAwLCByZWN2bGVuKTsKKyAgICBpZiAoYnVmID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JLyogQ2FsbCB0aGUgZ3V0cyAqLwotCW91dGxlbiA9IHNvY2tfcmVjdl9ndXRzKHMsIFB5U3RyaW5nX0FTX1NUUklORyhidWYpLCByZWN2bGVuLCBmbGFncyk7Ci0JaWYgKG91dGxlbiA8IDApIHsKLQkJLyogQW4gZXJyb3Igb2NjdXJyZWQsIHJlbGVhc2UgdGhlIHN0cmluZyBhbmQgcmV0dXJuIGFuCi0JCSAgIGVycm9yLiAqLwotCQlQeV9ERUNSRUYoYnVmKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChvdXRsZW4gIT0gcmVjdmxlbikgewotCQkvKiBXZSBkaWQgbm90IHJlYWQgYXMgbWFueSBieXRlcyBhcyB3ZSBhbnRpY2lwYXRlZCwgcmVzaXplIHRoZQotCQkgICBzdHJpbmcgaWYgcG9zc2libGUgYW5kIGJlIHN1Y2Nlc2Z1bC4gKi8KLQkJaWYgKF9QeVN0cmluZ19SZXNpemUoJmJ1Ziwgb3V0bGVuKSA8IDApCi0JCQkvKiBPb3BzeSwgbm90IHNvIHN1Y2Nlc2Z1bCBhZnRlciBhbGwuICovCi0JCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgLyogQ2FsbCB0aGUgZ3V0cyAqLworICAgIG91dGxlbiA9IHNvY2tfcmVjdl9ndXRzKHMsIFB5U3RyaW5nX0FTX1NUUklORyhidWYpLCByZWN2bGVuLCBmbGFncyk7CisgICAgaWYgKG91dGxlbiA8IDApIHsKKyAgICAgICAgLyogQW4gZXJyb3Igb2NjdXJyZWQsIHJlbGVhc2UgdGhlIHN0cmluZyBhbmQgcmV0dXJuIGFuCisgICAgICAgICAgIGVycm9yLiAqLworICAgICAgICBQeV9ERUNSRUYoYnVmKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChvdXRsZW4gIT0gcmVjdmxlbikgeworICAgICAgICAvKiBXZSBkaWQgbm90IHJlYWQgYXMgbWFueSBieXRlcyBhcyB3ZSBhbnRpY2lwYXRlZCwgcmVzaXplIHRoZQorICAgICAgICAgICBzdHJpbmcgaWYgcG9zc2libGUgYW5kIGJlIHN1Y2Nlc2Z1bC4gKi8KKyAgICAgICAgaWYgKF9QeVN0cmluZ19SZXNpemUoJmJ1Ziwgb3V0bGVuKSA8IDApCisgICAgICAgICAgICAvKiBPb3BzeSwgbm90IHNvIHN1Y2Nlc2Z1bCBhZnRlciBhbGwuICovCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlyZXR1cm4gYnVmOworICAgIHJldHVybiBidWY7CiB9CiAKIFB5RG9jX1NUUlZBUihyZWN2X2RvYywKQEAgLTI0MjgsNDYgKzI0MjgsNDYgQEAKIHN0YXRpYyBQeU9iamVjdCoKIHNvY2tfcmVjdl9pbnRvKFB5U29ja2V0U29ja09iamVjdCAqcywgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCXN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsiYnVmZmVyIiwgIm5ieXRlcyIsICJmbGFncyIsIDB9OworICAgIHN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsiYnVmZmVyIiwgIm5ieXRlcyIsICJmbGFncyIsIDB9OwogCi0JaW50IHJlY3ZsZW4gPSAwLCBmbGFncyA9IDA7Ci0gICAgICAgIHNzaXplX3QgcmVhZGxlbjsKLQljaGFyICpidWY7Ci0JaW50IGJ1ZmxlbjsKKyAgICBpbnQgcmVjdmxlbiA9IDAsIGZsYWdzID0gMDsKKyAgICBzc2l6ZV90IHJlYWRsZW47CisgICAgY2hhciAqYnVmOworICAgIGludCBidWZsZW47CiAKLQkvKiBHZXQgdGhlIGJ1ZmZlcidzIG1lbW9yeSAqLwotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJ3I3xpaTpyZWN2X2ludG8iLCBrd2xpc3QsCi0JCQkJCSAmYnVmLCAmYnVmbGVuLCAmcmVjdmxlbiwgJmZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JYXNzZXJ0KGJ1ZiAhPSAwICYmIGJ1ZmxlbiA+IDApOworICAgIC8qIEdldCB0aGUgYnVmZmVyJ3MgbWVtb3J5ICovCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgIncjfGlpOnJlY3ZfaW50byIsIGt3bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnVmLCAmYnVmbGVuLCAmcmVjdmxlbiwgJmZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYXNzZXJ0KGJ1ZiAhPSAwICYmIGJ1ZmxlbiA+IDApOwogCi0JaWYgKHJlY3ZsZW4gPCAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJuZWdhdGl2ZSBidWZmZXJzaXplIGluIHJlY3ZfaW50byIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKHJlY3ZsZW4gPT0gMCkgewotICAgICAgICAgICAgLyogSWYgbmJ5dGVzIHdhcyBub3Qgc3BlY2lmaWVkLCB1c2UgdGhlIGJ1ZmZlcidzIGxlbmd0aCAqLwotICAgICAgICAgICAgcmVjdmxlbiA9IGJ1ZmxlbjsKLQl9CisgICAgaWYgKHJlY3ZsZW4gPCAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIm5lZ2F0aXZlIGJ1ZmZlcnNpemUgaW4gcmVjdl9pbnRvIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAocmVjdmxlbiA9PSAwKSB7CisgICAgICAgIC8qIElmIG5ieXRlcyB3YXMgbm90IHNwZWNpZmllZCwgdXNlIHRoZSBidWZmZXIncyBsZW5ndGggKi8KKyAgICAgICAgcmVjdmxlbiA9IGJ1ZmxlbjsKKyAgICB9CiAKLQkvKiBDaGVjayBpZiB0aGUgYnVmZmVyIGlzIGxhcmdlIGVub3VnaCAqLwotCWlmIChidWZsZW4gPCByZWN2bGVuKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJidWZmZXIgdG9vIHNtYWxsIGZvciByZXF1ZXN0ZWQgYnl0ZXMiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIC8qIENoZWNrIGlmIHRoZSBidWZmZXIgaXMgbGFyZ2UgZW5vdWdoICovCisgICAgaWYgKGJ1ZmxlbiA8IHJlY3ZsZW4pIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiYnVmZmVyIHRvbyBzbWFsbCBmb3IgcmVxdWVzdGVkIGJ5dGVzIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCS8qIENhbGwgdGhlIGd1dHMgKi8KLQlyZWFkbGVuID0gc29ja19yZWN2X2d1dHMocywgYnVmLCByZWN2bGVuLCBmbGFncyk7Ci0JaWYgKHJlYWRsZW4gPCAwKSB7Ci0JCS8qIFJldHVybiBhbiBlcnJvci4gKi8KLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIC8qIENhbGwgdGhlIGd1dHMgKi8KKyAgICByZWFkbGVuID0gc29ja19yZWN2X2d1dHMocywgYnVmLCByZWN2bGVuLCBmbGFncyk7CisgICAgaWYgKHJlYWRsZW4gPCAwKSB7CisgICAgICAgIC8qIFJldHVybiBhbiBlcnJvci4gKi8KKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JLyogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZC4gIE5vdGUgdGhhdCB3ZSBkbyBub3QgZG8gYW55dGhpbmcKLQkgICBzcGVjaWFsIGhlcmUgaW4gdGhlIGNhc2UgdGhhdCByZWFkbGVuIDwgcmVjdmxlbi4gKi8KLQlyZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QocmVhZGxlbik7CisgICAgLyogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZC4gIE5vdGUgdGhhdCB3ZSBkbyBub3QgZG8gYW55dGhpbmcKKyAgICAgICBzcGVjaWFsIGhlcmUgaW4gdGhlIGNhc2UgdGhhdCByZWFkbGVuIDwgcmVjdmxlbi4gKi8KKyAgICByZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QocmVhZGxlbik7CiB9CiAKIFB5RG9jX1NUUlZBUihyZWN2X2ludG9fZG9jLApAQCAtMjQ5Myw1NiArMjQ5Myw1NiBAQAogICovCiBzdGF0aWMgc3NpemVfdAogc29ja19yZWN2ZnJvbV9ndXRzKFB5U29ja2V0U29ja09iamVjdCAqcywgY2hhciogY2J1ZiwgaW50IGxlbiwgaW50IGZsYWdzLAotCQkgICBQeU9iamVjdCoqIGFkZHIpCisgICAgICAgICAgICAgICAgICAgUHlPYmplY3QqKiBhZGRyKQogewotCXNvY2tfYWRkcl90IGFkZHJidWY7Ci0JaW50IHRpbWVvdXQ7Ci0Jc3NpemVfdCBuID0gLTE7Ci0Jc29ja2xlbl90IGFkZHJsZW47CisgICAgc29ja19hZGRyX3QgYWRkcmJ1ZjsKKyAgICBpbnQgdGltZW91dDsKKyAgICBzc2l6ZV90IG4gPSAtMTsKKyAgICBzb2NrbGVuX3QgYWRkcmxlbjsKIAotCSphZGRyID0gTlVMTDsKKyAgICAqYWRkciA9IE5VTEw7CiAKLQlpZiAoIWdldHNvY2thZGRybGVuKHMsICZhZGRybGVuKSkKLQkJcmV0dXJuIC0xOworICAgIGlmICghZ2V0c29ja2FkZHJsZW4ocywgJmFkZHJsZW4pKQorICAgICAgICByZXR1cm4gLTE7CiAKLQlpZiAoIUlTX1NFTEVDVEFCTEUocykpIHsKLQkJc2VsZWN0X2Vycm9yKCk7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgaWYgKCFJU19TRUxFQ1RBQkxFKHMpKSB7CisgICAgICAgIHNlbGVjdF9lcnJvcigpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCW1lbXNldCgmYWRkcmJ1ZiwgMCwgYWRkcmxlbik7Ci0JdGltZW91dCA9IGludGVybmFsX3NlbGVjdChzLCAwKTsKLQlpZiAoIXRpbWVvdXQpIHsKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgbWVtc2V0KCZhZGRyYnVmLCAwLCBhZGRybGVuKTsKKyAgICB0aW1lb3V0ID0gaW50ZXJuYWxfc2VsZWN0KHMsIDApOworICAgIGlmICghdGltZW91dCkgewogI2lmbmRlZiBNU19XSU5ET1dTCiAjaWYgZGVmaW5lZChQWU9TX09TMikgJiYgIWRlZmluZWQoUFlDQ19HQ0MpCi0JCW4gPSByZWN2ZnJvbShzLT5zb2NrX2ZkLCBjYnVmLCBsZW4sIGZsYWdzLAotCQkJICAgICBTQVMyU0EoJmFkZHJidWYpLCAmYWRkcmxlbik7CisgICAgICAgIG4gPSByZWN2ZnJvbShzLT5zb2NrX2ZkLCBjYnVmLCBsZW4sIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgU0FTMlNBKCZhZGRyYnVmKSwgJmFkZHJsZW4pOwogI2Vsc2UKLQkJbiA9IHJlY3Zmcm9tKHMtPnNvY2tfZmQsIGNidWYsIGxlbiwgZmxhZ3MsCi0JCQkgICAgICh2b2lkICopICZhZGRyYnVmLCAmYWRkcmxlbik7CisgICAgICAgIG4gPSByZWN2ZnJvbShzLT5zb2NrX2ZkLCBjYnVmLCBsZW4sIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikgJmFkZHJidWYsICZhZGRybGVuKTsKICNlbmRpZgogI2Vsc2UKLQkJbiA9IHJlY3Zmcm9tKHMtPnNvY2tfZmQsIGNidWYsIGxlbiwgZmxhZ3MsCi0JCQkgICAgIFNBUzJTQSgmYWRkcmJ1ZiksICZhZGRybGVuKTsKKyAgICAgICAgbiA9IHJlY3Zmcm9tKHMtPnNvY2tfZmQsIGNidWYsIGxlbiwgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICBTQVMyU0EoJmFkZHJidWYpLCAmYWRkcmxlbik7CiAjZW5kaWYKLQl9Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICB9CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKIAotCWlmICh0aW1lb3V0ID09IDEpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKHNvY2tldF90aW1lb3V0LCAidGltZWQgb3V0Iik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKG4gPCAwKSB7Ci0JCXMtPmVycm9yaGFuZGxlcigpOwotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLQl9CisgICAgaWYgKHRpbWVvdXQgPT0gMSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoc29ja2V0X3RpbWVvdXQsICJ0aW1lZCBvdXQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAobiA8IDApIHsKKyAgICAgICAgcy0+ZXJyb3JoYW5kbGVyKCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQlpZiAoISgqYWRkciA9IG1ha2Vzb2NrYWRkcihzLT5zb2NrX2ZkLCBTQVMyU0EoJmFkZHJidWYpLAotCQkJCSAgIGFkZHJsZW4sIHMtPnNvY2tfcHJvdG8pKSkKLQkJcmV0dXJuIC0xOworICAgIGlmICghKCphZGRyID0gbWFrZXNvY2thZGRyKHMtPnNvY2tfZmQsIFNBUzJTQSgmYWRkcmJ1ZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmxlbiwgcy0+c29ja19wcm90bykpKQorICAgICAgICByZXR1cm4gLTE7CiAKLQlyZXR1cm4gbjsKKyAgICByZXR1cm4gbjsKIH0KIAogLyogcy5yZWN2ZnJvbShuYnl0ZXMgWyxmbGFnc10pIG1ldGhvZCAqLwpAQCAtMjU1MCw0NSArMjU1MCw0NSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNvY2tfcmVjdmZyb20oUHlTb2NrZXRTb2NrT2JqZWN0ICpzLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqYnVmID0gTlVMTDsKLQlQeU9iamVjdCAqYWRkciA9IE5VTEw7Ci0JUHlPYmplY3QgKnJldCA9IE5VTEw7Ci0JaW50IHJlY3ZsZW4sIGZsYWdzID0gMDsKLSAgICAgICAgc3NpemVfdCBvdXRsZW47CisgICAgUHlPYmplY3QgKmJ1ZiA9IE5VTEw7CisgICAgUHlPYmplY3QgKmFkZHIgPSBOVUxMOworICAgIFB5T2JqZWN0ICpyZXQgPSBOVUxMOworICAgIGludCByZWN2bGVuLCBmbGFncyA9IDA7CisgICAgc3NpemVfdCBvdXRsZW47CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIml8aTpyZWN2ZnJvbSIsICZyZWN2bGVuLCAmZmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIml8aTpyZWN2ZnJvbSIsICZyZWN2bGVuLCAmZmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChyZWN2bGVuIDwgMCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkibmVnYXRpdmUgYnVmZmVyc2l6ZSBpbiByZWN2ZnJvbSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKHJlY3ZsZW4gPCAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIm5lZ2F0aXZlIGJ1ZmZlcnNpemUgaW4gcmVjdmZyb20iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JYnVmID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKikgMCwgcmVjdmxlbik7Ci0JaWYgKGJ1ZiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBidWYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKSAwLCByZWN2bGVuKTsKKyAgICBpZiAoYnVmID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0Jb3V0bGVuID0gc29ja19yZWN2ZnJvbV9ndXRzKHMsIFB5U3RyaW5nX0FTX1NUUklORyhidWYpLAotCQkJCSAgICByZWN2bGVuLCBmbGFncywgJmFkZHIpOwotCWlmIChvdXRsZW4gPCAwKSB7Ci0JCWdvdG8gZmluYWxseTsKLQl9CisgICAgb3V0bGVuID0gc29ja19yZWN2ZnJvbV9ndXRzKHMsIFB5U3RyaW5nX0FTX1NUUklORyhidWYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN2bGVuLCBmbGFncywgJmFkZHIpOworICAgIGlmIChvdXRsZW4gPCAwKSB7CisgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICB9CiAKLQlpZiAob3V0bGVuICE9IHJlY3ZsZW4pIHsKLQkJLyogV2UgZGlkIG5vdCByZWFkIGFzIG1hbnkgYnl0ZXMgYXMgd2UgYW50aWNpcGF0ZWQsIHJlc2l6ZSB0aGUKLQkJICAgc3RyaW5nIGlmIHBvc3NpYmxlIGFuZCBiZSBzdWNjZXNmdWwuICovCi0JCWlmIChfUHlTdHJpbmdfUmVzaXplKCZidWYsIG91dGxlbikgPCAwKQotCQkJLyogT29wc3ksIG5vdCBzbyBzdWNjZXNmdWwgYWZ0ZXIgYWxsLiAqLwotCQkJZ290byBmaW5hbGx5OwotCX0KKyAgICBpZiAob3V0bGVuICE9IHJlY3ZsZW4pIHsKKyAgICAgICAgLyogV2UgZGlkIG5vdCByZWFkIGFzIG1hbnkgYnl0ZXMgYXMgd2UgYW50aWNpcGF0ZWQsIHJlc2l6ZSB0aGUKKyAgICAgICAgICAgc3RyaW5nIGlmIHBvc3NpYmxlIGFuZCBiZSBzdWNjZXNmdWwuICovCisgICAgICAgIGlmIChfUHlTdHJpbmdfUmVzaXplKCZidWYsIG91dGxlbikgPCAwKQorICAgICAgICAgICAgLyogT29wc3ksIG5vdCBzbyBzdWNjZXNmdWwgYWZ0ZXIgYWxsLiAqLworICAgICAgICAgICAgZ290byBmaW5hbGx5OworICAgIH0KIAotCXJldCA9IFB5VHVwbGVfUGFjaygyLCBidWYsIGFkZHIpOworICAgIHJldCA9IFB5VHVwbGVfUGFjaygyLCBidWYsIGFkZHIpOwogCiBmaW5hbGx5OgotCVB5X1hERUNSRUYoYnVmKTsKLQlQeV9YREVDUkVGKGFkZHIpOwotCXJldHVybiByZXQ7CisgICAgUHlfWERFQ1JFRihidWYpOworICAgIFB5X1hERUNSRUYoYWRkcik7CisgICAgcmV0dXJuIHJldDsKIH0KIAogUHlEb2NfU1RSVkFSKHJlY3Zmcm9tX2RvYywKQEAgLTI2MDIsNDEgKzI2MDIsNDEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzb2NrX3JlY3Zmcm9tX2ludG8oUHlTb2NrZXRTb2NrT2JqZWN0ICpzLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QqIGt3ZHMpCiB7Ci0Jc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJidWZmZXIiLCAibmJ5dGVzIiwgImZsYWdzIiwgMH07CisgICAgc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJidWZmZXIiLCAibmJ5dGVzIiwgImZsYWdzIiwgMH07CiAKLQlpbnQgcmVjdmxlbiA9IDAsIGZsYWdzID0gMDsKLSAgICAgICAgc3NpemVfdCByZWFkbGVuOwotCWNoYXIgKmJ1ZjsKLQlpbnQgYnVmbGVuOworICAgIGludCByZWN2bGVuID0gMCwgZmxhZ3MgPSAwOworICAgIHNzaXplX3QgcmVhZGxlbjsKKyAgICBjaGFyICpidWY7CisgICAgaW50IGJ1ZmxlbjsKIAotCVB5T2JqZWN0ICphZGRyID0gTlVMTDsKKyAgICBQeU9iamVjdCAqYWRkciA9IE5VTEw7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAidyN8aWk6cmVjdmZyb21faW50byIsCi0JCQkJCSBrd2xpc3QsICZidWYsICZidWZsZW4sCi0JCQkJCSAmcmVjdmxlbiwgJmZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JYXNzZXJ0KGJ1ZiAhPSAwICYmIGJ1ZmxlbiA+IDApOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJ3I3xpaTpyZWN2ZnJvbV9pbnRvIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrd2xpc3QsICZidWYsICZidWZsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlY3ZsZW4sICZmbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGFzc2VydChidWYgIT0gMCAmJiBidWZsZW4gPiAwKTsKIAotCWlmIChyZWN2bGVuIDwgMCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkibmVnYXRpdmUgYnVmZmVyc2l6ZSBpbiByZWN2ZnJvbV9pbnRvIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAocmVjdmxlbiA9PSAwKSB7Ci0gICAgICAgICAgICAvKiBJZiBuYnl0ZXMgd2FzIG5vdCBzcGVjaWZpZWQsIHVzZSB0aGUgYnVmZmVyJ3MgbGVuZ3RoICovCi0gICAgICAgICAgICByZWN2bGVuID0gYnVmbGVuOwotCX0KKyAgICBpZiAocmVjdmxlbiA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAibmVnYXRpdmUgYnVmZmVyc2l6ZSBpbiByZWN2ZnJvbV9pbnRvIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAocmVjdmxlbiA9PSAwKSB7CisgICAgICAgIC8qIElmIG5ieXRlcyB3YXMgbm90IHNwZWNpZmllZCwgdXNlIHRoZSBidWZmZXIncyBsZW5ndGggKi8KKyAgICAgICAgcmVjdmxlbiA9IGJ1ZmxlbjsKKyAgICB9CiAKLQlyZWFkbGVuID0gc29ja19yZWN2ZnJvbV9ndXRzKHMsIGJ1ZiwgcmVjdmxlbiwgZmxhZ3MsICZhZGRyKTsKLQlpZiAocmVhZGxlbiA8IDApIHsKLQkJLyogUmV0dXJuIGFuIGVycm9yICovCi0JCVB5X1hERUNSRUYoYWRkcik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICByZWFkbGVuID0gc29ja19yZWN2ZnJvbV9ndXRzKHMsIGJ1ZiwgcmVjdmxlbiwgZmxhZ3MsICZhZGRyKTsKKyAgICBpZiAocmVhZGxlbiA8IDApIHsKKyAgICAgICAgLyogUmV0dXJuIGFuIGVycm9yICovCisgICAgICAgIFB5X1hERUNSRUYoYWRkcik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCS8qIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgYW5kIHRoZSBhZGRyZXNzLiAgTm90ZSB0aGF0IHdlIGRvCi0JICAgbm90IGRvIGFueXRoaW5nIHNwZWNpYWwgaGVyZSBpbiB0aGUgY2FzZSB0aGF0IHJlYWRsZW4gPCByZWN2bGVuLiAqLwotIAlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgibE4iLCByZWFkbGVuLCBhZGRyKTsKKyAgICAvKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyByZWFkIGFuZCB0aGUgYWRkcmVzcy4gIE5vdGUgdGhhdCB3ZSBkbworICAgICAgIG5vdCBkbyBhbnl0aGluZyBzcGVjaWFsIGhlcmUgaW4gdGhlIGNhc2UgdGhhdCByZWFkbGVuIDwgcmVjdmxlbi4gKi8KKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgibE4iLCByZWFkbGVuLCBhZGRyKTsKIH0KIAogUHlEb2NfU1RSVkFSKHJlY3Zmcm9tX2ludG9fZG9jLApAQCAtMjY1MCwzOSArMjY1MCwzOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNvY2tfc2VuZChQeVNvY2tldFNvY2tPYmplY3QgKnMsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKmJ1ZjsKLQlpbnQgbGVuLCBuID0gLTEsIGZsYWdzID0gMCwgdGltZW91dDsKLQlQeV9idWZmZXIgcGJ1ZjsKKyAgICBjaGFyICpidWY7CisgICAgaW50IGxlbiwgbiA9IC0xLCBmbGFncyA9IDAsIHRpbWVvdXQ7CisgICAgUHlfYnVmZmVyIHBidWY7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMqfGk6c2VuZCIsICZwYnVmLCAmZmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMqfGk6c2VuZCIsICZwYnVmLCAmZmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmICghSVNfU0VMRUNUQUJMRShzKSkgewotCQlQeUJ1ZmZlcl9SZWxlYXNlKCZwYnVmKTsKLQkJcmV0dXJuIHNlbGVjdF9lcnJvcigpOwotCX0KLQlidWYgPSBwYnVmLmJ1ZjsKLQlsZW4gPSBwYnVmLmxlbjsKKyAgICBpZiAoIUlTX1NFTEVDVEFCTEUocykpIHsKKyAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmcGJ1Zik7CisgICAgICAgIHJldHVybiBzZWxlY3RfZXJyb3IoKTsKKyAgICB9CisgICAgYnVmID0gcGJ1Zi5idWY7CisgICAgbGVuID0gcGJ1Zi5sZW47CiAKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JdGltZW91dCA9IGludGVybmFsX3NlbGVjdChzLCAxKTsKLQlpZiAoIXRpbWVvdXQpCisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIHRpbWVvdXQgPSBpbnRlcm5hbF9zZWxlY3QocywgMSk7CisgICAgaWYgKCF0aW1lb3V0KQogI2lmZGVmIF9fVk1TCi0JCW4gPSBzZW5kc2VnbWVudGVkKHMtPnNvY2tfZmQsIGJ1ZiwgbGVuLCBmbGFncyk7CisgICAgICAgIG4gPSBzZW5kc2VnbWVudGVkKHMtPnNvY2tfZmQsIGJ1ZiwgbGVuLCBmbGFncyk7CiAjZWxzZQotCQluID0gc2VuZChzLT5zb2NrX2ZkLCBidWYsIGxlbiwgZmxhZ3MpOworICAgICAgICBuID0gc2VuZChzLT5zb2NrX2ZkLCBidWYsIGxlbiwgZmxhZ3MpOwogI2VuZGlmCi0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogCi0JUHlCdWZmZXJfUmVsZWFzZSgmcGJ1Zik7CisgICAgUHlCdWZmZXJfUmVsZWFzZSgmcGJ1Zik7CiAKLQlpZiAodGltZW91dCA9PSAxKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhzb2NrZXRfdGltZW91dCwgInRpbWVkIG91dCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKG4gPCAwKQotCQlyZXR1cm4gcy0+ZXJyb3JoYW5kbGVyKCk7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKW4pOworICAgIGlmICh0aW1lb3V0ID09IDEpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHNvY2tldF90aW1lb3V0LCAidGltZWQgb3V0Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAobiA8IDApCisgICAgICAgIHJldHVybiBzLT5lcnJvcmhhbmRsZXIoKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpbik7CiB9CiAKIFB5RG9jX1NUUlZBUihzZW5kX2RvYywKQEAgLTI2OTgsNDggKzI2OTgsNDggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzb2NrX3NlbmRhbGwoUHlTb2NrZXRTb2NrT2JqZWN0ICpzLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpidWY7Ci0JaW50IGxlbiwgbiA9IC0xLCBmbGFncyA9IDAsIHRpbWVvdXQ7Ci0JUHlfYnVmZmVyIHBidWY7CisgICAgY2hhciAqYnVmOworICAgIGludCBsZW4sIG4gPSAtMSwgZmxhZ3MgPSAwLCB0aW1lb3V0OworICAgIFB5X2J1ZmZlciBwYnVmOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzKnxpOnNlbmRhbGwiLCAmcGJ1ZiwgJmZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JYnVmID0gcGJ1Zi5idWY7Ci0JbGVuID0gcGJ1Zi5sZW47CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzKnxpOnNlbmRhbGwiLCAmcGJ1ZiwgJmZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYnVmID0gcGJ1Zi5idWY7CisgICAgbGVuID0gcGJ1Zi5sZW47CiAKLQlpZiAoIUlTX1NFTEVDVEFCTEUocykpIHsKLQkJUHlCdWZmZXJfUmVsZWFzZSgmcGJ1Zik7Ci0JCXJldHVybiBzZWxlY3RfZXJyb3IoKTsKLQl9CisgICAgaWYgKCFJU19TRUxFQ1RBQkxFKHMpKSB7CisgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnBidWYpOworICAgICAgICByZXR1cm4gc2VsZWN0X2Vycm9yKCk7CisgICAgfQogCi0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCWRvIHsKLQkJdGltZW91dCA9IGludGVybmFsX3NlbGVjdChzLCAxKTsKLQkJbiA9IC0xOwotCQlpZiAodGltZW91dCkKLQkJCWJyZWFrOworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICBkbyB7CisgICAgICAgIHRpbWVvdXQgPSBpbnRlcm5hbF9zZWxlY3QocywgMSk7CisgICAgICAgIG4gPSAtMTsKKyAgICAgICAgaWYgKHRpbWVvdXQpCisgICAgICAgICAgICBicmVhazsKICNpZmRlZiBfX1ZNUwotCQluID0gc2VuZHNlZ21lbnRlZChzLT5zb2NrX2ZkLCBidWYsIGxlbiwgZmxhZ3MpOworICAgICAgICBuID0gc2VuZHNlZ21lbnRlZChzLT5zb2NrX2ZkLCBidWYsIGxlbiwgZmxhZ3MpOwogI2Vsc2UKLQkJbiA9IHNlbmQocy0+c29ja19mZCwgYnVmLCBsZW4sIGZsYWdzKTsKKyAgICAgICAgbiA9IHNlbmQocy0+c29ja19mZCwgYnVmLCBsZW4sIGZsYWdzKTsKICNlbmRpZgotCQlpZiAobiA8IDApCi0JCQlicmVhazsKLQkJYnVmICs9IG47Ci0JCWxlbiAtPSBuOwotCX0gd2hpbGUgKGxlbiA+IDApOwotCVB5X0VORF9BTExPV19USFJFQURTCi0JUHlCdWZmZXJfUmVsZWFzZSgmcGJ1Zik7CisgICAgICAgIGlmIChuIDwgMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBidWYgKz0gbjsKKyAgICAgICAgbGVuIC09IG47CisgICAgfSB3aGlsZSAobGVuID4gMCk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZwYnVmKTsKIAotCWlmICh0aW1lb3V0ID09IDEpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKHNvY2tldF90aW1lb3V0LCAidGltZWQgb3V0Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAobiA8IDApCi0JCXJldHVybiBzLT5lcnJvcmhhbmRsZXIoKTsKKyAgICBpZiAodGltZW91dCA9PSAxKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhzb2NrZXRfdGltZW91dCwgInRpbWVkIG91dCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKG4gPCAwKQorICAgICAgICByZXR1cm4gcy0+ZXJyb3JoYW5kbGVyKCk7CiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBQeURvY19TVFJWQVIoc2VuZGFsbF9kb2MsCkBAIC0yNzU2LDQ3ICsyNzU2LDQ3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc29ja19zZW5kdG8oUHlTb2NrZXRTb2NrT2JqZWN0ICpzLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeV9idWZmZXIgcGJ1ZjsKLQlQeU9iamVjdCAqYWRkcm87Ci0JY2hhciAqYnVmOwotCVB5X3NzaXplX3QgbGVuOwotCXNvY2tfYWRkcl90IGFkZHJidWY7Ci0JaW50IGFkZHJsZW4sIG4gPSAtMSwgZmxhZ3MsIHRpbWVvdXQ7CisgICAgUHlfYnVmZmVyIHBidWY7CisgICAgUHlPYmplY3QgKmFkZHJvOworICAgIGNoYXIgKmJ1ZjsKKyAgICBQeV9zc2l6ZV90IGxlbjsKKyAgICBzb2NrX2FkZHJfdCBhZGRyYnVmOworICAgIGludCBhZGRybGVuLCBuID0gLTEsIGZsYWdzLCB0aW1lb3V0OwogCi0JZmxhZ3MgPSAwOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicypPOnNlbmR0byIsICZwYnVmLCAmYWRkcm8pKSB7Ci0JCVB5RXJyX0NsZWFyKCk7Ci0JCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyppTzpzZW5kdG8iLAotCQkJCSAgICAgICZwYnVmLCAmZmxhZ3MsICZhZGRybykpCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0JYnVmID0gcGJ1Zi5idWY7Ci0JbGVuID0gcGJ1Zi5sZW47CisgICAgZmxhZ3MgPSAwOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicypPOnNlbmR0byIsICZwYnVmLCAmYWRkcm8pKSB7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyppTzpzZW5kdG8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBidWYsICZmbGFncywgJmFkZHJvKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBidWYgPSBwYnVmLmJ1ZjsKKyAgICBsZW4gPSBwYnVmLmxlbjsKIAotCWlmICghSVNfU0VMRUNUQUJMRShzKSkgewotCQlQeUJ1ZmZlcl9SZWxlYXNlKCZwYnVmKTsKLQkJcmV0dXJuIHNlbGVjdF9lcnJvcigpOwotCX0KKyAgICBpZiAoIUlTX1NFTEVDVEFCTEUocykpIHsKKyAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmcGJ1Zik7CisgICAgICAgIHJldHVybiBzZWxlY3RfZXJyb3IoKTsKKyAgICB9CiAKLQlpZiAoIWdldHNvY2thZGRyYXJnKHMsIGFkZHJvLCBTQVMyU0EoJmFkZHJidWYpLCAmYWRkcmxlbikpIHsKLQkJUHlCdWZmZXJfUmVsZWFzZSgmcGJ1Zik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoIWdldHNvY2thZGRyYXJnKHMsIGFkZHJvLCBTQVMyU0EoJmFkZHJidWYpLCAmYWRkcmxlbikpIHsKKyAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmcGJ1Zik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQl0aW1lb3V0ID0gaW50ZXJuYWxfc2VsZWN0KHMsIDEpOwotCWlmICghdGltZW91dCkKLQkJbiA9IHNlbmR0byhzLT5zb2NrX2ZkLCBidWYsIGxlbiwgZmxhZ3MsIFNBUzJTQSgmYWRkcmJ1ZiksIGFkZHJsZW4pOwotCVB5X0VORF9BTExPV19USFJFQURTCisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIHRpbWVvdXQgPSBpbnRlcm5hbF9zZWxlY3QocywgMSk7CisgICAgaWYgKCF0aW1lb3V0KQorICAgICAgICBuID0gc2VuZHRvKHMtPnNvY2tfZmQsIGJ1ZiwgbGVuLCBmbGFncywgU0FTMlNBKCZhZGRyYnVmKSwgYWRkcmxlbik7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKIAotCVB5QnVmZmVyX1JlbGVhc2UoJnBidWYpOwotCWlmICh0aW1lb3V0ID09IDEpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKHNvY2tldF90aW1lb3V0LCAidGltZWQgb3V0Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAobiA8IDApCi0JCXJldHVybiBzLT5lcnJvcmhhbmRsZXIoKTsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpbik7CisgICAgUHlCdWZmZXJfUmVsZWFzZSgmcGJ1Zik7CisgICAgaWYgKHRpbWVvdXQgPT0gMSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoc29ja2V0X3RpbWVvdXQsICJ0aW1lZCBvdXQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChuIDwgMCkKKyAgICAgICAgcmV0dXJuIHMtPmVycm9yaGFuZGxlcigpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZyluKTsKIH0KIAogUHlEb2NfU1RSVkFSKHNlbmR0b19kb2MsCkBAIC0yODExLDE5ICsyODExLDE5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc29ja19zaHV0ZG93bihQeVNvY2tldFNvY2tPYmplY3QgKnMsIFB5T2JqZWN0ICphcmcpCiB7Ci0JaW50IGhvdzsKLQlpbnQgcmVzOworICAgIGludCBob3c7CisgICAgaW50IHJlczsKIAotCWhvdyA9IFB5SW50X0FzTG9uZyhhcmcpOwotCWlmIChob3cgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCXJlcyA9IHNodXRkb3duKHMtPnNvY2tfZmQsIGhvdyk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQlpZiAocmVzIDwgMCkKLQkJcmV0dXJuIHMtPmVycm9yaGFuZGxlcigpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBob3cgPSBQeUludF9Bc0xvbmcoYXJnKTsKKyAgICBpZiAoaG93ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICByZXMgPSBzaHV0ZG93bihzLT5zb2NrX2ZkLCBob3cpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgaWYgKHJlcyA8IDApCisgICAgICAgIHJldHVybiBzLT5lcnJvcmhhbmRsZXIoKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIFB5RG9jX1NUUlZBUihzaHV0ZG93bl9kb2MsCkBAIC0yODM2LDE4ICsyODM2LDE4IEBACiBzdGF0aWMgUHlPYmplY3QqCiBzb2NrX2lvY3RsKFB5U29ja2V0U29ja09iamVjdCAqcywgUHlPYmplY3QgKmFyZykKIHsKLQl1bnNpZ25lZCBsb25nIGNtZCA9IFNJT19SQ1ZBTEw7Ci0JdW5zaWduZWQgaW50IG9wdGlvbiA9IFJDVkFMTF9PTjsKLSAgICAgICAgRFdPUkQgcmVjdjsKKyAgICB1bnNpZ25lZCBsb25nIGNtZCA9IFNJT19SQ1ZBTEw7CisgICAgdW5zaWduZWQgaW50IG9wdGlvbiA9IFJDVkFMTF9PTjsKKyAgICBEV09SRCByZWN2OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZywgImtJOmlvY3RsIiwgJmNtZCwgJm9wdGlvbikpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmcsICJrSTppb2N0bCIsICZjbWQsICZvcHRpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChXU0FJb2N0bChzLT5zb2NrX2ZkLCBjbWQsICZvcHRpb24sIHNpemVvZihvcHRpb24pLCAKLQkJICAgICBOVUxMLCAwLCAmcmVjdiwgTlVMTCwgTlVMTCkgPT0gU09DS0VUX0VSUk9SKSB7Ci0JCXJldHVybiBzZXRfZXJyb3IoKTsKLQl9Ci0JcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKHJlY3YpOworICAgIGlmIChXU0FJb2N0bChzLT5zb2NrX2ZkLCBjbWQsICZvcHRpb24sIHNpemVvZihvcHRpb24pLAorICAgICAgICAgICAgICAgICBOVUxMLCAwLCAmcmVjdiwgTlVMTCwgTlVMTCkgPT0gU09DS0VUX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBzZXRfZXJyb3IoKTsKKyAgICB9CisgICAgcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKHJlY3YpOwogfQogUHlEb2NfU1RSVkFSKHNvY2tfaW9jdGxfZG9jLAogImlvY3RsKGNtZCwgb3B0aW9uKSAtPiBsb25nXG5cCkBAIC0yODYxLDY5ICsyODYxLDY5IEBACiAvKiBMaXN0IG9mIG1ldGhvZHMgZm9yIHNvY2tldCBvYmplY3RzICovCiAKIHN0YXRpYyBQeU1ldGhvZERlZiBzb2NrX21ldGhvZHNbXSA9IHsKLQl7ImFjY2VwdCIsCSAgKFB5Q0Z1bmN0aW9uKXNvY2tfYWNjZXB0LCBNRVRIX05PQVJHUywKLQkJCSAgYWNjZXB0X2RvY30sCi0JeyJiaW5kIiwJICAoUHlDRnVuY3Rpb24pc29ja19iaW5kLCBNRVRIX08sCi0JCQkgIGJpbmRfZG9jfSwKLQl7ImNsb3NlIiwJICAoUHlDRnVuY3Rpb24pc29ja19jbG9zZSwgTUVUSF9OT0FSR1MsCi0JCQkgIGNsb3NlX2RvY30sCi0JeyJjb25uZWN0IiwJICAoUHlDRnVuY3Rpb24pc29ja19jb25uZWN0LCBNRVRIX08sCi0JCQkgIGNvbm5lY3RfZG9jfSwKLQl7ImNvbm5lY3RfZXgiLAkgIChQeUNGdW5jdGlvbilzb2NrX2Nvbm5lY3RfZXgsIE1FVEhfTywKLQkJCSAgY29ubmVjdF9leF9kb2N9LAorICAgIHsiYWNjZXB0IiwgICAgICAgICAgICAoUHlDRnVuY3Rpb24pc29ja19hY2NlcHQsIE1FVEhfTk9BUkdTLAorICAgICAgICAgICAgICAgICAgICAgIGFjY2VwdF9kb2N9LAorICAgIHsiYmluZCIsICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pc29ja19iaW5kLCBNRVRIX08sCisgICAgICAgICAgICAgICAgICAgICAgYmluZF9kb2N9LAorICAgIHsiY2xvc2UiLCAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pc29ja19jbG9zZSwgTUVUSF9OT0FSR1MsCisgICAgICAgICAgICAgICAgICAgICAgY2xvc2VfZG9jfSwKKyAgICB7ImNvbm5lY3QiLCAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXNvY2tfY29ubmVjdCwgTUVUSF9PLAorICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RfZG9jfSwKKyAgICB7ImNvbm5lY3RfZXgiLCAgICAgICAgKFB5Q0Z1bmN0aW9uKXNvY2tfY29ubmVjdF9leCwgTUVUSF9PLAorICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RfZXhfZG9jfSwKICNpZm5kZWYgTk9fRFVQCi0JeyJkdXAiLAkJICAoUHlDRnVuY3Rpb24pc29ja19kdXAsIE1FVEhfTk9BUkdTLAotCQkJICBkdXBfZG9jfSwKKyAgICB7ImR1cCIsICAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXNvY2tfZHVwLCBNRVRIX05PQVJHUywKKyAgICAgICAgICAgICAgICAgICAgICBkdXBfZG9jfSwKICNlbmRpZgotCXsiZmlsZW5vIiwJICAoUHlDRnVuY3Rpb24pc29ja19maWxlbm8sIE1FVEhfTk9BUkdTLAotCQkJICBmaWxlbm9fZG9jfSwKKyAgICB7ImZpbGVubyIsICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXNvY2tfZmlsZW5vLCBNRVRIX05PQVJHUywKKyAgICAgICAgICAgICAgICAgICAgICBmaWxlbm9fZG9jfSwKICNpZmRlZiBIQVZFX0dFVFBFRVJOQU1FCi0JeyJnZXRwZWVybmFtZSIsCSAgKFB5Q0Z1bmN0aW9uKXNvY2tfZ2V0cGVlcm5hbWUsCi0JCQkgIE1FVEhfTk9BUkdTLCBnZXRwZWVybmFtZV9kb2N9LAorICAgIHsiZ2V0cGVlcm5hbWUiLCAgICAgICAoUHlDRnVuY3Rpb24pc29ja19nZXRwZWVybmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBNRVRIX05PQVJHUywgZ2V0cGVlcm5hbWVfZG9jfSwKICNlbmRpZgotCXsiZ2V0c29ja25hbWUiLAkgIChQeUNGdW5jdGlvbilzb2NrX2dldHNvY2tuYW1lLAotCQkJICBNRVRIX05PQVJHUywgZ2V0c29ja25hbWVfZG9jfSwKLQl7ImdldHNvY2tvcHQiLAkgIChQeUNGdW5jdGlvbilzb2NrX2dldHNvY2tvcHQsIE1FVEhfVkFSQVJHUywKLQkJCSAgZ2V0c29ja29wdF9kb2N9LAorICAgIHsiZ2V0c29ja25hbWUiLCAgICAgICAoUHlDRnVuY3Rpb24pc29ja19nZXRzb2NrbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBNRVRIX05PQVJHUywgZ2V0c29ja25hbWVfZG9jfSwKKyAgICB7ImdldHNvY2tvcHQiLCAgICAgICAgKFB5Q0Z1bmN0aW9uKXNvY2tfZ2V0c29ja29wdCwgTUVUSF9WQVJBUkdTLAorICAgICAgICAgICAgICAgICAgICAgIGdldHNvY2tvcHRfZG9jfSwKICNpZiBkZWZpbmVkKE1TX1dJTkRPV1MpICYmIGRlZmluZWQoU0lPX1JDVkFMTCkKLQl7ImlvY3RsIiwJICAoUHlDRnVuY3Rpb24pc29ja19pb2N0bCwgTUVUSF9WQVJBUkdTLAotCQkJICBzb2NrX2lvY3RsX2RvY30sCisgICAgeyJpb2N0bCIsICAgICAgICAgICAgIChQeUNGdW5jdGlvbilzb2NrX2lvY3RsLCBNRVRIX1ZBUkFSR1MsCisgICAgICAgICAgICAgICAgICAgICAgc29ja19pb2N0bF9kb2N9LAogI2VuZGlmCi0JeyJsaXN0ZW4iLAkgIChQeUNGdW5jdGlvbilzb2NrX2xpc3RlbiwgTUVUSF9PLAotCQkJICBsaXN0ZW5fZG9jfSwKKyAgICB7Imxpc3RlbiIsICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXNvY2tfbGlzdGVuLCBNRVRIX08sCisgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuX2RvY30sCiAjaWZuZGVmIE5PX0RVUAotCXsibWFrZWZpbGUiLAkgIChQeUNGdW5jdGlvbilzb2NrX21ha2VmaWxlLCBNRVRIX1ZBUkFSR1MsCi0JCQkgIG1ha2VmaWxlX2RvY30sCisgICAgeyJtYWtlZmlsZSIsICAgICAgICAgIChQeUNGdW5jdGlvbilzb2NrX21ha2VmaWxlLCBNRVRIX1ZBUkFSR1MsCisgICAgICAgICAgICAgICAgICAgICAgbWFrZWZpbGVfZG9jfSwKICNlbmRpZgotCXsicmVjdiIsCSAgKFB5Q0Z1bmN0aW9uKXNvY2tfcmVjdiwgTUVUSF9WQVJBUkdTLAotCQkJICByZWN2X2RvY30sCi0JeyJyZWN2X2ludG8iLAkgIChQeUNGdW5jdGlvbilzb2NrX3JlY3ZfaW50bywgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywKLQkJCSAgcmVjdl9pbnRvX2RvY30sCi0JeyJyZWN2ZnJvbSIsCSAgKFB5Q0Z1bmN0aW9uKXNvY2tfcmVjdmZyb20sIE1FVEhfVkFSQVJHUywKLQkJCSAgcmVjdmZyb21fZG9jfSwKLQl7InJlY3Zmcm9tX2ludG8iLCAgKFB5Q0Z1bmN0aW9uKXNvY2tfcmVjdmZyb21faW50bywgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywKLQkJCSAgcmVjdmZyb21faW50b19kb2N9LAotCXsic2VuZCIsCSAgKFB5Q0Z1bmN0aW9uKXNvY2tfc2VuZCwgTUVUSF9WQVJBUkdTLAotCQkJICBzZW5kX2RvY30sCi0JeyJzZW5kYWxsIiwJICAoUHlDRnVuY3Rpb24pc29ja19zZW5kYWxsLCBNRVRIX1ZBUkFSR1MsCi0JCQkgIHNlbmRhbGxfZG9jfSwKLQl7InNlbmR0byIsCSAgKFB5Q0Z1bmN0aW9uKXNvY2tfc2VuZHRvLCBNRVRIX1ZBUkFSR1MsCi0JCQkgIHNlbmR0b19kb2N9LAotCXsic2V0YmxvY2tpbmciLAkgIChQeUNGdW5jdGlvbilzb2NrX3NldGJsb2NraW5nLCBNRVRIX08sCi0JCQkgIHNldGJsb2NraW5nX2RvY30sCi0JeyJzZXR0aW1lb3V0IiwgICAgKFB5Q0Z1bmN0aW9uKXNvY2tfc2V0dGltZW91dCwgTUVUSF9PLAotCQkJICBzZXR0aW1lb3V0X2RvY30sCi0JeyJnZXR0aW1lb3V0IiwgICAgKFB5Q0Z1bmN0aW9uKXNvY2tfZ2V0dGltZW91dCwgTUVUSF9OT0FSR1MsCi0JCQkgIGdldHRpbWVvdXRfZG9jfSwKLQl7InNldHNvY2tvcHQiLAkgIChQeUNGdW5jdGlvbilzb2NrX3NldHNvY2tvcHQsIE1FVEhfVkFSQVJHUywKLQkJCSAgc2V0c29ja29wdF9kb2N9LAotCXsic2h1dGRvd24iLAkgIChQeUNGdW5jdGlvbilzb2NrX3NodXRkb3duLCBNRVRIX08sCi0JCQkgIHNodXRkb3duX2RvY30sCisgICAgeyJyZWN2IiwgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilzb2NrX3JlY3YsIE1FVEhfVkFSQVJHUywKKyAgICAgICAgICAgICAgICAgICAgICByZWN2X2RvY30sCisgICAgeyJyZWN2X2ludG8iLCAgICAgICAgIChQeUNGdW5jdGlvbilzb2NrX3JlY3ZfaW50bywgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywKKyAgICAgICAgICAgICAgICAgICAgICByZWN2X2ludG9fZG9jfSwKKyAgICB7InJlY3Zmcm9tIiwgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXNvY2tfcmVjdmZyb20sIE1FVEhfVkFSQVJHUywKKyAgICAgICAgICAgICAgICAgICAgICByZWN2ZnJvbV9kb2N9LAorICAgIHsicmVjdmZyb21faW50byIsICAoUHlDRnVuY3Rpb24pc29ja19yZWN2ZnJvbV9pbnRvLCBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLAorICAgICAgICAgICAgICAgICAgICAgIHJlY3Zmcm9tX2ludG9fZG9jfSwKKyAgICB7InNlbmQiLCAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXNvY2tfc2VuZCwgTUVUSF9WQVJBUkdTLAorICAgICAgICAgICAgICAgICAgICAgIHNlbmRfZG9jfSwKKyAgICB7InNlbmRhbGwiLCAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXNvY2tfc2VuZGFsbCwgTUVUSF9WQVJBUkdTLAorICAgICAgICAgICAgICAgICAgICAgIHNlbmRhbGxfZG9jfSwKKyAgICB7InNlbmR0byIsICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXNvY2tfc2VuZHRvLCBNRVRIX1ZBUkFSR1MsCisgICAgICAgICAgICAgICAgICAgICAgc2VuZHRvX2RvY30sCisgICAgeyJzZXRibG9ja2luZyIsICAgICAgIChQeUNGdW5jdGlvbilzb2NrX3NldGJsb2NraW5nLCBNRVRIX08sCisgICAgICAgICAgICAgICAgICAgICAgc2V0YmxvY2tpbmdfZG9jfSwKKyAgICB7InNldHRpbWVvdXQiLCAgICAoUHlDRnVuY3Rpb24pc29ja19zZXR0aW1lb3V0LCBNRVRIX08sCisgICAgICAgICAgICAgICAgICAgICAgc2V0dGltZW91dF9kb2N9LAorICAgIHsiZ2V0dGltZW91dCIsICAgIChQeUNGdW5jdGlvbilzb2NrX2dldHRpbWVvdXQsIE1FVEhfTk9BUkdTLAorICAgICAgICAgICAgICAgICAgICAgIGdldHRpbWVvdXRfZG9jfSwKKyAgICB7InNldHNvY2tvcHQiLCAgICAgICAgKFB5Q0Z1bmN0aW9uKXNvY2tfc2V0c29ja29wdCwgTUVUSF9WQVJBUkdTLAorICAgICAgICAgICAgICAgICAgICAgIHNldHNvY2tvcHRfZG9jfSwKKyAgICB7InNodXRkb3duIiwgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXNvY2tfc2h1dGRvd24sIE1FVEhfTywKKyAgICAgICAgICAgICAgICAgICAgICBzaHV0ZG93bl9kb2N9LAogI2lmZGVmIFJJU0NPUwotCXsic2xlZXB0YXNrdyIsCSAgKFB5Q0Z1bmN0aW9uKXNvY2tfc2xlZXB0YXNrdywgTUVUSF9PLAotCSAJCSAgc2xlZXB0YXNrd19kb2N9LAorICAgIHsic2xlZXB0YXNrdyIsICAgICAgICAoUHlDRnVuY3Rpb24pc29ja19zbGVlcHRhc2t3LCBNRVRIX08sCisgICAgICAgICAgICAgICAgICAgICAgc2xlZXB0YXNrd19kb2N9LAogI2VuZGlmCi0Je05VTEwsCQkJTlVMTH0JCS8qIHNlbnRpbmVsICovCisgICAge05VTEwsICAgICAgICAgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogLyogU29ja09iamVjdCBtZW1iZXJzICovCkBAIC0yOTQxLDM0ICsyOTQxLDM0IEBACiBzdGF0aWMgdm9pZAogc29ja19kZWFsbG9jKFB5U29ja2V0U29ja09iamVjdCAqcykKIHsKLQlpZiAocy0+c29ja19mZCAhPSAtMSkKLQkJKHZvaWQpIFNPQ0tFVENMT1NFKHMtPnNvY2tfZmQpOwotCVB5X1RZUEUocyktPnRwX2ZyZWUoKFB5T2JqZWN0ICopcyk7CisgICAgaWYgKHMtPnNvY2tfZmQgIT0gLTEpCisgICAgICAgICh2b2lkKSBTT0NLRVRDTE9TRShzLT5zb2NrX2ZkKTsKKyAgICBQeV9UWVBFKHMpLT50cF9mcmVlKChQeU9iamVjdCAqKXMpOwogfQogCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzb2NrX3JlcHIoUHlTb2NrZXRTb2NrT2JqZWN0ICpzKQogewotCWNoYXIgYnVmWzUxMl07CisgICAgY2hhciBidWZbNTEyXTsKICNpZiBTSVpFT0ZfU09DS0VUX1QgPiBTSVpFT0ZfTE9ORwotCWlmIChzLT5zb2NrX2ZkID4gTE9OR19NQVgpIHsKLQkJLyogdGhpcyBjYW4gb2NjdXIgb24gV2luNjQsIGFuZCBhY3R1YWxseSB0aGVyZSBpcyBhIHNwZWNpYWwKLQkJICAgdWdseSBwcmludGYgZm9ybWF0dGVyIGZvciBkZWNpbWFsIHBvaW50ZXIgbGVuZ3RoIGludGVnZXIKLQkJICAgcHJpbnRpbmcsIG9ubHkgYm90aGVyIGlmIG5lY2Vzc2FyeSovCi0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJCSJubyBwcmludGYgZm9ybWF0dGVyIHRvIGRpc3BsYXkgIgotCQkJCSJ0aGUgc29ja2V0IGRlc2NyaXB0b3IgaW4gZGVjaW1hbCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKHMtPnNvY2tfZmQgPiBMT05HX01BWCkgeworICAgICAgICAvKiB0aGlzIGNhbiBvY2N1ciBvbiBXaW42NCwgYW5kIGFjdHVhbGx5IHRoZXJlIGlzIGEgc3BlY2lhbAorICAgICAgICAgICB1Z2x5IHByaW50ZiBmb3JtYXR0ZXIgZm9yIGRlY2ltYWwgcG9pbnRlciBsZW5ndGggaW50ZWdlcgorICAgICAgICAgICBwcmludGluZywgb25seSBib3RoZXIgaWYgbmVjZXNzYXJ5Ki8KKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAibm8gcHJpbnRmIGZvcm1hdHRlciB0byBkaXNwbGF5ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0aGUgc29ja2V0IGRlc2NyaXB0b3IgaW4gZGVjaW1hbCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAjZW5kaWYKLQlQeU9TX3NucHJpbnRmKAotCQlidWYsIHNpemVvZihidWYpLAotCQkiPHNvY2tldCBvYmplY3QsIGZkPSVsZCwgZmFtaWx5PSVkLCB0eXBlPSVkLCBwcm90b2NvbD0lZD4iLAotCQkobG9uZylzLT5zb2NrX2ZkLCBzLT5zb2NrX2ZhbWlseSwKLQkJcy0+c29ja190eXBlLAotCQlzLT5zb2NrX3Byb3RvKTsKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOworICAgIFB5T1Nfc25wcmludGYoCisgICAgICAgIGJ1Ziwgc2l6ZW9mKGJ1ZiksCisgICAgICAgICI8c29ja2V0IG9iamVjdCwgZmQ9JWxkLCBmYW1pbHk9JWQsIHR5cGU9JWQsIHByb3RvY29sPSVkPiIsCisgICAgICAgIChsb25nKXMtPnNvY2tfZmQsIHMtPnNvY2tfZmFtaWx5LAorICAgICAgICBzLT5zb2NrX3R5cGUsCisgICAgICAgIHMtPnNvY2tfcHJvdG8pOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CiB9CiAKIApAQCAtMjk3NywxNSArMjk3NywxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNvY2tfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCVB5T2JqZWN0ICpuZXc7CisgICAgUHlPYmplY3QgKm5ldzsKIAotCW5ldyA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOwotCWlmIChuZXcgIT0gTlVMTCkgewotCQkoKFB5U29ja2V0U29ja09iamVjdCAqKW5ldyktPnNvY2tfZmQgPSAtMTsKLQkJKChQeVNvY2tldFNvY2tPYmplY3QgKiluZXcpLT5zb2NrX3RpbWVvdXQgPSAtMS4wOwotCQkoKFB5U29ja2V0U29ja09iamVjdCAqKW5ldyktPmVycm9yaGFuZGxlciA9ICZzZXRfZXJyb3I7Ci0JfQotCXJldHVybiBuZXc7CisgICAgbmV3ID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7CisgICAgaWYgKG5ldyAhPSBOVUxMKSB7CisgICAgICAgICgoUHlTb2NrZXRTb2NrT2JqZWN0ICopbmV3KS0+c29ja19mZCA9IC0xOworICAgICAgICAoKFB5U29ja2V0U29ja09iamVjdCAqKW5ldyktPnNvY2tfdGltZW91dCA9IC0xLjA7CisgICAgICAgICgoUHlTb2NrZXRTb2NrT2JqZWN0ICopbmV3KS0+ZXJyb3JoYW5kbGVyID0gJnNldF9lcnJvcjsKKyAgICB9CisgICAgcmV0dXJuIG5ldzsKIH0KIAogCkBAIC0yOTk1LDMyICsyOTk1LDMyIEBACiBzdGF0aWMgaW50CiBzb2NrX2luaXRvYmooUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlQeVNvY2tldFNvY2tPYmplY3QgKnMgPSAoUHlTb2NrZXRTb2NrT2JqZWN0ICopc2VsZjsKLQlTT0NLRVRfVCBmZDsKLQlpbnQgZmFtaWx5ID0gQUZfSU5FVCwgdHlwZSA9IFNPQ0tfU1RSRUFNLCBwcm90byA9IDA7Ci0Jc3RhdGljIGNoYXIgKmtleXdvcmRzW10gPSB7ImZhbWlseSIsICJ0eXBlIiwgInByb3RvIiwgMH07CisgICAgUHlTb2NrZXRTb2NrT2JqZWN0ICpzID0gKFB5U29ja2V0U29ja09iamVjdCAqKXNlbGY7CisgICAgU09DS0VUX1QgZmQ7CisgICAgaW50IGZhbWlseSA9IEFGX0lORVQsIHR5cGUgPSBTT0NLX1NUUkVBTSwgcHJvdG8gPSAwOworICAgIHN0YXRpYyBjaGFyICprZXl3b3Jkc1tdID0geyJmYW1pbHkiLCAidHlwZSIsICJwcm90byIsIDB9OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywKLQkJCQkJICJ8aWlpOnNvY2tldCIsIGtleXdvcmRzLAotCQkJCQkgJmZhbWlseSwgJnR5cGUsICZwcm90bykpCi0JCXJldHVybiAtMTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ8aWlpOnNvY2tldCIsIGtleXdvcmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmYW1pbHksICZ0eXBlLCAmcHJvdG8pKQorICAgICAgICByZXR1cm4gLTE7CiAKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JZmQgPSBzb2NrZXQoZmFtaWx5LCB0eXBlLCBwcm90byk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgZmQgPSBzb2NrZXQoZmFtaWx5LCB0eXBlLCBwcm90byk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKIAogI2lmZGVmIE1TX1dJTkRPV1MKLQlpZiAoZmQgPT0gSU5WQUxJRF9TT0NLRVQpCisgICAgaWYgKGZkID09IElOVkFMSURfU09DS0VUKQogI2Vsc2UKLQlpZiAoZmQgPCAwKQorICAgIGlmIChmZCA8IDApCiAjZW5kaWYKLQl7Ci0JCXNldF9lcnJvcigpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWluaXRfc29ja29iamVjdChzLCBmZCwgZmFtaWx5LCB0eXBlLCBwcm90byk7CisgICAgeworICAgICAgICBzZXRfZXJyb3IoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpbml0X3NvY2tvYmplY3QocywgZmQsIGZhbWlseSwgdHlwZSwgcHJvdG8pOwogCi0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiAKIH0KIApAQCAtMzAyOCw0NSArMzAyOCw0NSBAQAogLyogVHlwZSBvYmplY3QgZm9yIHNvY2tldCBvYmplY3RzLiAqLwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IHNvY2tfdHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoMCwgMCkJLyogTXVzdCBmaWxsIGluIHR5cGUgdmFsdWUgbGF0ZXIgKi8KLQkiX3NvY2tldC5zb2NrZXQiLAkJCS8qIHRwX25hbWUgKi8KLQlzaXplb2YoUHlTb2NrZXRTb2NrT2JqZWN0KSwJCS8qIHRwX2Jhc2ljc2l6ZSAqLwotCTAsCQkJCQkvKiB0cF9pdGVtc2l6ZSAqLwotCShkZXN0cnVjdG9yKXNvY2tfZGVhbGxvYywJCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkocmVwcmZ1bmMpc29ja19yZXByLAkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQlzb2NrX2RvYywJCQkJLyogdHBfZG9jICovCi0JMCwJCQkJCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkJLyogdHBfaXRlcm5leHQgKi8KLQlzb2NrX21ldGhvZHMsCQkJCS8qIHRwX21ldGhvZHMgKi8KLQlzb2NrX21lbWJlcmxpc3QsCQkJLyogdHBfbWVtYmVycyAqLwotCTAsCQkJCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCQkvKiB0cF9kaWN0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KLQkwLAkJCQkJLyogdHBfZGljdG9mZnNldCAqLwotCXNvY2tfaW5pdG9iaiwJCQkJLyogdHBfaW5pdCAqLwotCVB5VHlwZV9HZW5lcmljQWxsb2MsCQkJLyogdHBfYWxsb2MgKi8KLQlzb2NrX25ldywJCQkJLyogdHBfbmV3ICovCi0JUHlPYmplY3RfRGVsLAkJCQkvKiB0cF9mcmVlICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKDAsIDApICAgICAgICAgLyogTXVzdCBmaWxsIGluIHR5cGUgdmFsdWUgbGF0ZXIgKi8KKyAgICAiX3NvY2tldC5zb2NrZXQiLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICBzaXplb2YoUHlTb2NrZXRTb2NrT2JqZWN0KSwgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAoZGVzdHJ1Y3Rvcilzb2NrX2RlYWxsb2MsICAgICAgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgKHJlcHJmdW5jKXNvY2tfcmVwciwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KKyAgICBzb2NrX2RvYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgc29ja19tZXRob2RzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgc29ja19tZW1iZXJsaXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgc29ja19pbml0b2JqLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgUHlUeXBlX0dlbmVyaWNBbGxvYywgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIHNvY2tfbmV3LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgUHlPYmplY3RfRGVsLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCiB9OwogCiAKQEAgLTMwNzYsMTUgKzMwNzYsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzb2NrZXRfZ2V0aG9zdG5hbWUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp1bnVzZWQpCiB7Ci0JY2hhciBidWZbMTAyNF07Ci0JaW50IHJlczsKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JcmVzID0gZ2V0aG9zdG5hbWUoYnVmLCAoaW50KSBzaXplb2YgYnVmIC0gMSk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQlpZiAocmVzIDwgMCkKLQkJcmV0dXJuIHNldF9lcnJvcigpOwotCWJ1ZltzaXplb2YgYnVmIC0gMV0gPSAnXDAnOwotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CisgICAgY2hhciBidWZbMTAyNF07CisgICAgaW50IHJlczsKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgcmVzID0gZ2V0aG9zdG5hbWUoYnVmLCAoaW50KSBzaXplb2YgYnVmIC0gMSk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBpZiAocmVzIDwgMCkKKyAgICAgICAgcmV0dXJuIHNldF9lcnJvcigpOworICAgIGJ1ZltzaXplb2YgYnVmIC0gMV0gPSAnXDAnOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CiB9CiAKIFB5RG9jX1NUUlZBUihnZXRob3N0bmFtZV9kb2MsCkBAIC0zMDk5LDE0ICszMDk5LDE0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc29ja2V0X2dldGhvc3RieW5hbWUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKm5hbWU7Ci0Jc29ja19hZGRyX3QgYWRkcmJ1ZjsKKyAgICBjaGFyICpuYW1lOworICAgIHNvY2tfYWRkcl90IGFkZHJidWY7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6Z2V0aG9zdGJ5bmFtZSIsICZuYW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKHNldGlwYWRkcihuYW1lLCBTQVMyU0EoJmFkZHJidWYpLCAgc2l6ZW9mKGFkZHJidWYpLCBBRl9JTkVUKSA8IDApCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBtYWtlaXBhZGRyKFNBUzJTQSgmYWRkcmJ1ZiksIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pKTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6Z2V0aG9zdGJ5bmFtZSIsICZuYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKHNldGlwYWRkcihuYW1lLCBTQVMyU0EoJmFkZHJidWYpLCAgc2l6ZW9mKGFkZHJidWYpLCBBRl9JTkVUKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBtYWtlaXBhZGRyKFNBUzJTQSgmYWRkcmJ1ZiksIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pKTsKIH0KIAogUHlEb2NfU1RSVkFSKGdldGhvc3RieW5hbWVfZG9jLApAQCAtMzEyMCwxMzAgKzMxMjAsMTMwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2V0aG9zdF9jb21tb24oc3RydWN0IGhvc3RlbnQgKmgsIHN0cnVjdCBzb2NrYWRkciAqYWRkciwgaW50IGFsZW4sIGludCBhZikKIHsKLQljaGFyICoqcGNoOwotCVB5T2JqZWN0ICpydG5fdHVwbGUgPSAoUHlPYmplY3QgKilOVUxMOwotCVB5T2JqZWN0ICpuYW1lX2xpc3QgPSAoUHlPYmplY3QgKilOVUxMOwotCVB5T2JqZWN0ICphZGRyX2xpc3QgPSAoUHlPYmplY3QgKilOVUxMOwotCVB5T2JqZWN0ICp0bXA7CisgICAgY2hhciAqKnBjaDsKKyAgICBQeU9iamVjdCAqcnRuX3R1cGxlID0gKFB5T2JqZWN0ICopTlVMTDsKKyAgICBQeU9iamVjdCAqbmFtZV9saXN0ID0gKFB5T2JqZWN0ICopTlVMTDsKKyAgICBQeU9iamVjdCAqYWRkcl9saXN0ID0gKFB5T2JqZWN0ICopTlVMTDsKKyAgICBQeU9iamVjdCAqdG1wOwogCi0JaWYgKGggPT0gTlVMTCkgewotCQkvKiBMZXQncyBnZXQgcmVhbCBlcnJvciBtZXNzYWdlIHRvIHJldHVybiAqLworICAgIGlmIChoID09IE5VTEwpIHsKKyAgICAgICAgLyogTGV0J3MgZ2V0IHJlYWwgZXJyb3IgbWVzc2FnZSB0byByZXR1cm4gKi8KICNpZm5kZWYgUklTQ09TCi0JCXNldF9oZXJyb3IoaF9lcnJubyk7CisgICAgICAgIHNldF9oZXJyb3IoaF9lcnJubyk7CiAjZWxzZQotCQlQeUVycl9TZXRTdHJpbmcoc29ja2V0X2Vycm9yLCAiaG9zdCBub3QgZm91bmQiKTsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHNvY2tldF9lcnJvciwgImhvc3Qgbm90IGZvdW5kIik7CiAjZW5kaWYKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlpZiAoaC0+aF9hZGRydHlwZSAhPSBhZikgewotCQkvKiBMZXQncyBnZXQgcmVhbCBlcnJvciBtZXNzYWdlIHRvIHJldHVybiAqLwotCQlQeUVycl9TZXRTdHJpbmcoc29ja2V0X2Vycm9yLAotCQkJCShjaGFyICopc3RyZXJyb3IoRUFGTk9TVVBQT1JUKSk7CisgICAgaWYgKGgtPmhfYWRkcnR5cGUgIT0gYWYpIHsKKyAgICAgICAgLyogTGV0J3MgZ2V0IHJlYWwgZXJyb3IgbWVzc2FnZSB0byByZXR1cm4gKi8KKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHNvY2tldF9lcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopc3RyZXJyb3IoRUFGTk9TVVBQT1JUKSk7CiAKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlzd2l0Y2ggKGFmKSB7CisgICAgc3dpdGNoIChhZikgewogCi0JY2FzZSBBRl9JTkVUOgotCQlpZiAoYWxlbiA8IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWJyZWFrOworICAgIGNhc2UgQUZfSU5FVDoKKyAgICAgICAgaWYgKGFsZW4gPCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBicmVhazsKIAogI2lmZGVmIEVOQUJMRV9JUFY2Ci0JY2FzZSBBRl9JTkVUNjoKLQkJaWYgKGFsZW4gPCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNikpCi0JCQlyZXR1cm4gTlVMTDsKLQkJYnJlYWs7CisgICAgY2FzZSBBRl9JTkVUNjoKKyAgICAgICAgaWYgKGFsZW4gPCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNikpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgYnJlYWs7CiAjZW5kaWYKIAotCX0KKyAgICB9CiAKLQlpZiAoKG5hbWVfbGlzdCA9IFB5TGlzdF9OZXcoMCkpID09IE5VTEwpCi0JCWdvdG8gZXJyOworICAgIGlmICgobmFtZV9saXN0ID0gUHlMaXN0X05ldygwKSkgPT0gTlVMTCkKKyAgICAgICAgZ290byBlcnI7CiAKLQlpZiAoKGFkZHJfbGlzdCA9IFB5TGlzdF9OZXcoMCkpID09IE5VTEwpCi0JCWdvdG8gZXJyOworICAgIGlmICgoYWRkcl9saXN0ID0gUHlMaXN0X05ldygwKSkgPT0gTlVMTCkKKyAgICAgICAgZ290byBlcnI7CiAKLQkvKiBTRiAjMTUxMTMxNzogaF9hbGlhc2VzIGNhbiBiZSBOVUxMICovCi0JaWYgKGgtPmhfYWxpYXNlcykgewotCQlmb3IgKHBjaCA9IGgtPmhfYWxpYXNlczsgKnBjaCAhPSBOVUxMOyBwY2grKykgewotCQkJaW50IHN0YXR1czsKLQkJCXRtcCA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoKnBjaCk7Ci0JCQlpZiAodG1wID09IE5VTEwpCi0JCQkJZ290byBlcnI7CisgICAgLyogU0YgIzE1MTEzMTc6IGhfYWxpYXNlcyBjYW4gYmUgTlVMTCAqLworICAgIGlmIChoLT5oX2FsaWFzZXMpIHsKKyAgICAgICAgZm9yIChwY2ggPSBoLT5oX2FsaWFzZXM7ICpwY2ggIT0gTlVMTDsgcGNoKyspIHsKKyAgICAgICAgICAgIGludCBzdGF0dXM7CisgICAgICAgICAgICB0bXAgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCpwY2gpOworICAgICAgICAgICAgaWYgKHRtcCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGdvdG8gZXJyOwogCi0JCQlzdGF0dXMgPSBQeUxpc3RfQXBwZW5kKG5hbWVfbGlzdCwgdG1wKTsKLQkJCVB5X0RFQ1JFRih0bXApOworICAgICAgICAgICAgc3RhdHVzID0gUHlMaXN0X0FwcGVuZChuYW1lX2xpc3QsIHRtcCk7CisgICAgICAgICAgICBQeV9ERUNSRUYodG1wKTsKIAotCQkJaWYgKHN0YXR1cykKLQkJCQlnb3RvIGVycjsKLQkJfQotCX0KKyAgICAgICAgICAgIGlmIChzdGF0dXMpCisgICAgICAgICAgICAgICAgZ290byBlcnI7CisgICAgICAgIH0KKyAgICB9CiAKLQlmb3IgKHBjaCA9IGgtPmhfYWRkcl9saXN0OyAqcGNoICE9IE5VTEw7IHBjaCsrKSB7Ci0JCWludCBzdGF0dXM7CisgICAgZm9yIChwY2ggPSBoLT5oX2FkZHJfbGlzdDsgKnBjaCAhPSBOVUxMOyBwY2grKykgeworICAgICAgICBpbnQgc3RhdHVzOwogCi0JCXN3aXRjaCAoYWYpIHsKKyAgICAgICAgc3dpdGNoIChhZikgewogCi0JCWNhc2UgQUZfSU5FVDoKLQkJICAgIHsKLQkJCXN0cnVjdCBzb2NrYWRkcl9pbiBzaW47Ci0JCQltZW1zZXQoJnNpbiwgMCwgc2l6ZW9mKHNpbikpOwotCQkJc2luLnNpbl9mYW1pbHkgPSBhZjsKKyAgICAgICAgY2FzZSBBRl9JTkVUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgc3RydWN0IHNvY2thZGRyX2luIHNpbjsKKyAgICAgICAgICAgIG1lbXNldCgmc2luLCAwLCBzaXplb2Yoc2luKSk7CisgICAgICAgICAgICBzaW4uc2luX2ZhbWlseSA9IGFmOwogI2lmZGVmIEhBVkVfU09DS0FERFJfU0FfTEVOCi0JCQlzaW4uc2luX2xlbiA9IHNpemVvZihzaW4pOworICAgICAgICAgICAgc2luLnNpbl9sZW4gPSBzaXplb2Yoc2luKTsKICNlbmRpZgotCQkJbWVtY3B5KCZzaW4uc2luX2FkZHIsICpwY2gsIHNpemVvZihzaW4uc2luX2FkZHIpKTsKLQkJCXRtcCA9IG1ha2VpcGFkZHIoKHN0cnVjdCBzb2NrYWRkciAqKSZzaW4sIHNpemVvZihzaW4pKTsKKyAgICAgICAgICAgIG1lbWNweSgmc2luLnNpbl9hZGRyLCAqcGNoLCBzaXplb2Yoc2luLnNpbl9hZGRyKSk7CisgICAgICAgICAgICB0bXAgPSBtYWtlaXBhZGRyKChzdHJ1Y3Qgc29ja2FkZHIgKikmc2luLCBzaXplb2Yoc2luKSk7CiAKLQkJCWlmIChwY2ggPT0gaC0+aF9hZGRyX2xpc3QgJiYgYWxlbiA+PSBzaXplb2Yoc2luKSkKLQkJCQltZW1jcHkoKGNoYXIgKikgYWRkciwgJnNpbiwgc2l6ZW9mKHNpbikpOwotCQkJYnJlYWs7Ci0JCSAgICB9CisgICAgICAgICAgICBpZiAocGNoID09IGgtPmhfYWRkcl9saXN0ICYmIGFsZW4gPj0gc2l6ZW9mKHNpbikpCisgICAgICAgICAgICAgICAgbWVtY3B5KChjaGFyICopIGFkZHIsICZzaW4sIHNpemVvZihzaW4pKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQogCiAjaWZkZWYgRU5BQkxFX0lQVjYKLQkJY2FzZSBBRl9JTkVUNjoKLQkJICAgIHsKLQkJCXN0cnVjdCBzb2NrYWRkcl9pbjYgc2luNjsKLQkJCW1lbXNldCgmc2luNiwgMCwgc2l6ZW9mKHNpbjYpKTsKLQkJCXNpbjYuc2luNl9mYW1pbHkgPSBhZjsKKyAgICAgICAgY2FzZSBBRl9JTkVUNjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbjYgc2luNjsKKyAgICAgICAgICAgIG1lbXNldCgmc2luNiwgMCwgc2l6ZW9mKHNpbjYpKTsKKyAgICAgICAgICAgIHNpbjYuc2luNl9mYW1pbHkgPSBhZjsKICNpZmRlZiBIQVZFX1NPQ0tBRERSX1NBX0xFTgotCQkJc2luNi5zaW42X2xlbiA9IHNpemVvZihzaW42KTsKKyAgICAgICAgICAgIHNpbjYuc2luNl9sZW4gPSBzaXplb2Yoc2luNik7CiAjZW5kaWYKLQkJCW1lbWNweSgmc2luNi5zaW42X2FkZHIsICpwY2gsIHNpemVvZihzaW42LnNpbjZfYWRkcikpOwotCQkJdG1wID0gbWFrZWlwYWRkcigoc3RydWN0IHNvY2thZGRyICopJnNpbjYsCi0JCQkJc2l6ZW9mKHNpbjYpKTsKKyAgICAgICAgICAgIG1lbWNweSgmc2luNi5zaW42X2FkZHIsICpwY2gsIHNpemVvZihzaW42LnNpbjZfYWRkcikpOworICAgICAgICAgICAgdG1wID0gbWFrZWlwYWRkcigoc3RydWN0IHNvY2thZGRyICopJnNpbjYsCisgICAgICAgICAgICAgICAgc2l6ZW9mKHNpbjYpKTsKIAotCQkJaWYgKHBjaCA9PSBoLT5oX2FkZHJfbGlzdCAmJiBhbGVuID49IHNpemVvZihzaW42KSkKLQkJCQltZW1jcHkoKGNoYXIgKikgYWRkciwgJnNpbjYsIHNpemVvZihzaW42KSk7Ci0JCQlicmVhazsKLQkJICAgIH0KKyAgICAgICAgICAgIGlmIChwY2ggPT0gaC0+aF9hZGRyX2xpc3QgJiYgYWxlbiA+PSBzaXplb2Yoc2luNikpCisgICAgICAgICAgICAgICAgbWVtY3B5KChjaGFyICopIGFkZHIsICZzaW42LCBzaXplb2Yoc2luNikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CiAjZW5kaWYKIAotCQlkZWZhdWx0OgkvKiBjYW4ndCBoYXBwZW4gKi8KLQkJCVB5RXJyX1NldFN0cmluZyhzb2NrZXRfZXJyb3IsCi0JCQkJCSJ1bnN1cHBvcnRlZCBhZGRyZXNzIGZhbWlseSIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgLyogY2FuJ3QgaGFwcGVuICovCisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoc29ja2V0X2Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bnN1cHBvcnRlZCBhZGRyZXNzIGZhbWlseSIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KIAotCQlpZiAodG1wID09IE5VTEwpCi0JCQlnb3RvIGVycjsKKyAgICAgICAgaWYgKHRtcCA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBlcnI7CiAKLQkJc3RhdHVzID0gUHlMaXN0X0FwcGVuZChhZGRyX2xpc3QsIHRtcCk7Ci0JCVB5X0RFQ1JFRih0bXApOworICAgICAgICBzdGF0dXMgPSBQeUxpc3RfQXBwZW5kKGFkZHJfbGlzdCwgdG1wKTsKKyAgICAgICAgUHlfREVDUkVGKHRtcCk7CiAKLQkJaWYgKHN0YXR1cykKLQkJCWdvdG8gZXJyOwotCX0KKyAgICAgICAgaWYgKHN0YXR1cykKKyAgICAgICAgICAgIGdvdG8gZXJyOworICAgIH0KIAotCXJ0bl90dXBsZSA9IFB5X0J1aWxkVmFsdWUoInNPTyIsIGgtPmhfbmFtZSwgbmFtZV9saXN0LCBhZGRyX2xpc3QpOworICAgIHJ0bl90dXBsZSA9IFB5X0J1aWxkVmFsdWUoInNPTyIsIGgtPmhfbmFtZSwgbmFtZV9saXN0LCBhZGRyX2xpc3QpOwogCiAgZXJyOgotCVB5X1hERUNSRUYobmFtZV9saXN0KTsKLQlQeV9YREVDUkVGKGFkZHJfbGlzdCk7Ci0JcmV0dXJuIHJ0bl90dXBsZTsKKyAgICBQeV9YREVDUkVGKG5hbWVfbGlzdCk7CisgICAgUHlfWERFQ1JFRihhZGRyX2xpc3QpOworICAgIHJldHVybiBydG5fdHVwbGU7CiB9CiAKIApAQCAtMzI1Myw2MyArMzI1Myw2MyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNvY2tldF9nZXRob3N0YnluYW1lX2V4KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpuYW1lOwotCXN0cnVjdCBob3N0ZW50ICpoOworICAgIGNoYXIgKm5hbWU7CisgICAgc3RydWN0IGhvc3RlbnQgKmg7CiAjaWZkZWYgRU5BQkxFX0lQVjYKLSAgICAgICAgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgYWRkcjsKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBhZGRyOwogI2Vsc2UKLSAgICAgICAgc3RydWN0IHNvY2thZGRyX2luIGFkZHI7CisgICAgc3RydWN0IHNvY2thZGRyX2luIGFkZHI7CiAjZW5kaWYKLQlzdHJ1Y3Qgc29ja2FkZHIgKnNhOwotCVB5T2JqZWN0ICpyZXQ7CisgICAgc3RydWN0IHNvY2thZGRyICpzYTsKKyAgICBQeU9iamVjdCAqcmV0OwogI2lmZGVmIEhBVkVfR0VUSE9TVEJZTkFNRV9SCi0Jc3RydWN0IGhvc3RlbnQgaHBfYWxsb2NhdGVkOworICAgIHN0cnVjdCBob3N0ZW50IGhwX2FsbG9jYXRlZDsKICNpZmRlZiBIQVZFX0dFVEhPU1RCWU5BTUVfUl8zX0FSRwotCXN0cnVjdCBob3N0ZW50X2RhdGEgZGF0YTsKKyAgICBzdHJ1Y3QgaG9zdGVudF9kYXRhIGRhdGE7CiAjZWxzZQotCWNoYXIgYnVmWzE2Mzg0XTsKLQlpbnQgYnVmX2xlbiA9IChzaXplb2YgYnVmKSAtIDE7Ci0JaW50IGVycm5vcDsKKyAgICBjaGFyIGJ1ZlsxNjM4NF07CisgICAgaW50IGJ1Zl9sZW4gPSAoc2l6ZW9mIGJ1ZikgLSAxOworICAgIGludCBlcnJub3A7CiAjZW5kaWYKICNpZiBkZWZpbmVkKEhBVkVfR0VUSE9TVEJZTkFNRV9SXzNfQVJHKSB8fCBkZWZpbmVkKEhBVkVfR0VUSE9TVEJZTkFNRV9SXzZfQVJHKQotCWludCByZXN1bHQ7CisgICAgaW50IHJlc3VsdDsKICNlbmRpZgogI2VuZGlmIC8qIEhBVkVfR0VUSE9TVEJZTkFNRV9SICovCiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6Z2V0aG9zdGJ5bmFtZV9leCIsICZuYW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKHNldGlwYWRkcihuYW1lLCAoc3RydWN0IHNvY2thZGRyICopJmFkZHIsIHNpemVvZihhZGRyKSwgQUZfSU5FVCkgPCAwKQotCQlyZXR1cm4gTlVMTDsKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOmdldGhvc3RieW5hbWVfZXgiLCAmbmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChzZXRpcGFkZHIobmFtZSwgKHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyLCBzaXplb2YoYWRkciksIEFGX0lORVQpIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwogI2lmZGVmIEhBVkVfR0VUSE9TVEJZTkFNRV9SCiAjaWYgICBkZWZpbmVkKEhBVkVfR0VUSE9TVEJZTkFNRV9SXzZfQVJHKQotCXJlc3VsdCA9IGdldGhvc3RieW5hbWVfcihuYW1lLCAmaHBfYWxsb2NhdGVkLCBidWYsIGJ1Zl9sZW4sCi0JCQkJICZoLCAmZXJybm9wKTsKKyAgICByZXN1bHQgPSBnZXRob3N0YnluYW1lX3IobmFtZSwgJmhwX2FsbG9jYXRlZCwgYnVmLCBidWZfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaCwgJmVycm5vcCk7CiAjZWxpZiBkZWZpbmVkKEhBVkVfR0VUSE9TVEJZTkFNRV9SXzVfQVJHKQotCWggPSBnZXRob3N0YnluYW1lX3IobmFtZSwgJmhwX2FsbG9jYXRlZCwgYnVmLCBidWZfbGVuLCAmZXJybm9wKTsKKyAgICBoID0gZ2V0aG9zdGJ5bmFtZV9yKG5hbWUsICZocF9hbGxvY2F0ZWQsIGJ1ZiwgYnVmX2xlbiwgJmVycm5vcCk7CiAjZWxzZSAvKiBIQVZFX0dFVEhPU1RCWU5BTUVfUl8zX0FSRyAqLwotCW1lbXNldCgodm9pZCAqKSAmZGF0YSwgJ1wwJywgc2l6ZW9mKGRhdGEpKTsKLQlyZXN1bHQgPSBnZXRob3N0YnluYW1lX3IobmFtZSwgJmhwX2FsbG9jYXRlZCwgJmRhdGEpOwotCWggPSAocmVzdWx0ICE9IDApID8gTlVMTCA6ICZocF9hbGxvY2F0ZWQ7CisgICAgbWVtc2V0KCh2b2lkICopICZkYXRhLCAnXDAnLCBzaXplb2YoZGF0YSkpOworICAgIHJlc3VsdCA9IGdldGhvc3RieW5hbWVfcihuYW1lLCAmaHBfYWxsb2NhdGVkLCAmZGF0YSk7CisgICAgaCA9IChyZXN1bHQgIT0gMCkgPyBOVUxMIDogJmhwX2FsbG9jYXRlZDsKICNlbmRpZgogI2Vsc2UgLyogbm90IEhBVkVfR0VUSE9TVEJZTkFNRV9SICovCiAjaWZkZWYgVVNFX0dFVEhPU1RCWU5BTUVfTE9DSwotCVB5VGhyZWFkX2FjcXVpcmVfbG9jayhuZXRkYl9sb2NrLCAxKTsKKyAgICBQeVRocmVhZF9hY3F1aXJlX2xvY2sobmV0ZGJfbG9jaywgMSk7CiAjZW5kaWYKLQloID0gZ2V0aG9zdGJ5bmFtZShuYW1lKTsKKyAgICBoID0gZ2V0aG9zdGJ5bmFtZShuYW1lKTsKICNlbmRpZiAvKiBIQVZFX0dFVEhPU1RCWU5BTUVfUiAqLwotCVB5X0VORF9BTExPV19USFJFQURTCi0JLyogU29tZSBDIGxpYnJhcmllcyB3b3VsZCByZXF1aXJlIGFkZHIuX19zc19mYW1pbHkgaW5zdGVhZCBvZgotCSAgIGFkZHIuc3NfZmFtaWx5LgotCSAgIFRoZXJlZm9yZSwgd2UgY2FzdCB0aGUgc29ja2FkZHJfc3RvcmFnZSBpbnRvIHNvY2thZGRyIHRvCi0JICAgYWNjZXNzIHNhX2ZhbWlseS4gKi8KLQlzYSA9IChzdHJ1Y3Qgc29ja2FkZHIqKSZhZGRyOwotCXJldCA9IGdldGhvc3RfY29tbW9uKGgsIChzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkciwgc2l6ZW9mKGFkZHIpLAotCQkJICAgICBzYS0+c2FfZmFtaWx5KTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIC8qIFNvbWUgQyBsaWJyYXJpZXMgd291bGQgcmVxdWlyZSBhZGRyLl9fc3NfZmFtaWx5IGluc3RlYWQgb2YKKyAgICAgICBhZGRyLnNzX2ZhbWlseS4KKyAgICAgICBUaGVyZWZvcmUsIHdlIGNhc3QgdGhlIHNvY2thZGRyX3N0b3JhZ2UgaW50byBzb2NrYWRkciB0bworICAgICAgIGFjY2VzcyBzYV9mYW1pbHkuICovCisgICAgc2EgPSAoc3RydWN0IHNvY2thZGRyKikmYWRkcjsKKyAgICByZXQgPSBnZXRob3N0X2NvbW1vbihoLCAoc3RydWN0IHNvY2thZGRyICopJmFkZHIsIHNpemVvZihhZGRyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzYS0+c2FfZmFtaWx5KTsKICNpZmRlZiBVU0VfR0VUSE9TVEJZTkFNRV9MT0NLCi0JUHlUaHJlYWRfcmVsZWFzZV9sb2NrKG5ldGRiX2xvY2spOworICAgIFB5VGhyZWFkX3JlbGVhc2VfbG9jayhuZXRkYl9sb2NrKTsKICNlbmRpZgotCXJldHVybiByZXQ7CisgICAgcmV0dXJuIHJldDsKIH0KIAogUHlEb2NfU1RSVkFSKGdoYm5fZXhfZG9jLApAQCAtMzMyNiw4NCArMzMyNiw4NCBAQAogc29ja2V0X2dldGhvc3RieWFkZHIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewogI2lmZGVmIEVOQUJMRV9JUFY2Ci0Jc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgYWRkcjsKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBhZGRyOwogI2Vsc2UKLQlzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcjsKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcjsKICNlbmRpZgotCXN0cnVjdCBzb2NrYWRkciAqc2EgPSAoc3RydWN0IHNvY2thZGRyICopJmFkZHI7Ci0JY2hhciAqaXBfbnVtOwotCXN0cnVjdCBob3N0ZW50ICpoOwotCVB5T2JqZWN0ICpyZXQ7CisgICAgc3RydWN0IHNvY2thZGRyICpzYSA9IChzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkcjsKKyAgICBjaGFyICppcF9udW07CisgICAgc3RydWN0IGhvc3RlbnQgKmg7CisgICAgUHlPYmplY3QgKnJldDsKICNpZmRlZiBIQVZFX0dFVEhPU1RCWU5BTUVfUgotCXN0cnVjdCBob3N0ZW50IGhwX2FsbG9jYXRlZDsKKyAgICBzdHJ1Y3QgaG9zdGVudCBocF9hbGxvY2F0ZWQ7CiAjaWZkZWYgSEFWRV9HRVRIT1NUQllOQU1FX1JfM19BUkcKLQlzdHJ1Y3QgaG9zdGVudF9kYXRhIGRhdGE7CisgICAgc3RydWN0IGhvc3RlbnRfZGF0YSBkYXRhOwogI2Vsc2UKLQkvKiBnbGliY3MgdXAgdG8gMi4xMCBhc3N1bWUgdGhhdCB0aGUgYnVmIGFyZ3VtZW50IHRvCi0JICAgZ2V0aG9zdGJ5YWRkcl9yIGlzIDgtYnl0ZSBhbGlnbmVkLCB3aGljaCBhdCBsZWFzdCBsbHZtLWdjYwotCSAgIGRvZXMgbm90IGVuc3VyZS4gVGhlIGF0dHJpYnV0ZSBiZWxvdyBpbnN0cnVjdHMgdGhlIGNvbXBpbGVyCi0JICAgdG8gbWFpbnRhaW4gdGhpcyBhbGlnbm1lbnQuICovCi0JY2hhciBidWZbMTYzODRdIFB5X0FMSUdORUQoOCk7Ci0JaW50IGJ1Zl9sZW4gPSAoc2l6ZW9mIGJ1ZikgLSAxOwotCWludCBlcnJub3A7CisgICAgLyogZ2xpYmNzIHVwIHRvIDIuMTAgYXNzdW1lIHRoYXQgdGhlIGJ1ZiBhcmd1bWVudCB0bworICAgICAgIGdldGhvc3RieWFkZHJfciBpcyA4LWJ5dGUgYWxpZ25lZCwgd2hpY2ggYXQgbGVhc3QgbGx2bS1nY2MKKyAgICAgICBkb2VzIG5vdCBlbnN1cmUuIFRoZSBhdHRyaWJ1dGUgYmVsb3cgaW5zdHJ1Y3RzIHRoZSBjb21waWxlcgorICAgICAgIHRvIG1haW50YWluIHRoaXMgYWxpZ25tZW50LiAqLworICAgIGNoYXIgYnVmWzE2Mzg0XSBQeV9BTElHTkVEKDgpOworICAgIGludCBidWZfbGVuID0gKHNpemVvZiBidWYpIC0gMTsKKyAgICBpbnQgZXJybm9wOwogI2VuZGlmCiAjaWYgZGVmaW5lZChIQVZFX0dFVEhPU1RCWU5BTUVfUl8zX0FSRykgfHwgZGVmaW5lZChIQVZFX0dFVEhPU1RCWU5BTUVfUl82X0FSRykKLQlpbnQgcmVzdWx0OworICAgIGludCByZXN1bHQ7CiAjZW5kaWYKICNlbmRpZiAvKiBIQVZFX0dFVEhPU1RCWU5BTUVfUiAqLwotCWNoYXIgKmFwOwotCWludCBhbDsKLQlpbnQgYWY7CisgICAgY2hhciAqYXA7CisgICAgaW50IGFsOworICAgIGludCBhZjsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczpnZXRob3N0YnlhZGRyIiwgJmlwX251bSkpCi0JCXJldHVybiBOVUxMOwotCWFmID0gQUZfVU5TUEVDOwotCWlmIChzZXRpcGFkZHIoaXBfbnVtLCBzYSwgc2l6ZW9mKGFkZHIpLCBhZikgPCAwKQotCQlyZXR1cm4gTlVMTDsKLQlhZiA9IHNhLT5zYV9mYW1pbHk7Ci0JYXAgPSBOVUxMOwotCWFsID0gMDsKLQlzd2l0Y2ggKGFmKSB7Ci0JY2FzZSBBRl9JTkVUOgotCQlhcCA9IChjaGFyICopJigoc3RydWN0IHNvY2thZGRyX2luICopc2EpLT5zaW5fYWRkcjsKLQkJYWwgPSBzaXplb2YoKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKilzYSktPnNpbl9hZGRyKTsKLQkJYnJlYWs7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOmdldGhvc3RieWFkZHIiLCAmaXBfbnVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYWYgPSBBRl9VTlNQRUM7CisgICAgaWYgKHNldGlwYWRkcihpcF9udW0sIHNhLCBzaXplb2YoYWRkciksIGFmKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGFmID0gc2EtPnNhX2ZhbWlseTsKKyAgICBhcCA9IE5VTEw7CisgICAgYWwgPSAwOworICAgIHN3aXRjaCAoYWYpIHsKKyAgICBjYXNlIEFGX0lORVQ6CisgICAgICAgIGFwID0gKGNoYXIgKikmKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKilzYSktPnNpbl9hZGRyOworICAgICAgICBhbCA9IHNpemVvZigoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKXNhKS0+c2luX2FkZHIpOworICAgICAgICBicmVhazsKICNpZmRlZiBFTkFCTEVfSVBWNgotCWNhc2UgQUZfSU5FVDY6Ci0JCWFwID0gKGNoYXIgKikmKChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopc2EpLT5zaW42X2FkZHI7Ci0JCWFsID0gc2l6ZW9mKCgoc3RydWN0IHNvY2thZGRyX2luNiAqKXNhKS0+c2luNl9hZGRyKTsKLQkJYnJlYWs7CisgICAgY2FzZSBBRl9JTkVUNjoKKyAgICAgICAgYXAgPSAoY2hhciAqKSYoKHN0cnVjdCBzb2NrYWRkcl9pbjYgKilzYSktPnNpbjZfYWRkcjsKKyAgICAgICAgYWwgPSBzaXplb2YoKChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopc2EpLT5zaW42X2FkZHIpOworICAgICAgICBicmVhazsKICNlbmRpZgotCWRlZmF1bHQ6Ci0JCVB5RXJyX1NldFN0cmluZyhzb2NrZXRfZXJyb3IsICJ1bnN1cHBvcnRlZCBhZGRyZXNzIGZhbWlseSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIGRlZmF1bHQ6CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhzb2NrZXRfZXJyb3IsICJ1bnN1cHBvcnRlZCBhZGRyZXNzIGZhbWlseSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwogI2lmZGVmIEhBVkVfR0VUSE9TVEJZTkFNRV9SCiAjaWYgICBkZWZpbmVkKEhBVkVfR0VUSE9TVEJZTkFNRV9SXzZfQVJHKQotCXJlc3VsdCA9IGdldGhvc3RieWFkZHJfcihhcCwgYWwsIGFmLAotCQkmaHBfYWxsb2NhdGVkLCBidWYsIGJ1Zl9sZW4sCi0JCSZoLCAmZXJybm9wKTsKKyAgICByZXN1bHQgPSBnZXRob3N0YnlhZGRyX3IoYXAsIGFsLCBhZiwKKyAgICAgICAgJmhwX2FsbG9jYXRlZCwgYnVmLCBidWZfbGVuLAorICAgICAgICAmaCwgJmVycm5vcCk7CiAjZWxpZiBkZWZpbmVkKEhBVkVfR0VUSE9TVEJZTkFNRV9SXzVfQVJHKQotCWggPSBnZXRob3N0YnlhZGRyX3IoYXAsIGFsLCBhZiwKLQkJCSAgICAmaHBfYWxsb2NhdGVkLCBidWYsIGJ1Zl9sZW4sICZlcnJub3ApOworICAgIGggPSBnZXRob3N0YnlhZGRyX3IoYXAsIGFsLCBhZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICZocF9hbGxvY2F0ZWQsIGJ1ZiwgYnVmX2xlbiwgJmVycm5vcCk7CiAjZWxzZSAvKiBIQVZFX0dFVEhPU1RCWU5BTUVfUl8zX0FSRyAqLwotCW1lbXNldCgodm9pZCAqKSAmZGF0YSwgJ1wwJywgc2l6ZW9mKGRhdGEpKTsKLQlyZXN1bHQgPSBnZXRob3N0YnlhZGRyX3IoYXAsIGFsLCBhZiwgJmhwX2FsbG9jYXRlZCwgJmRhdGEpOwotCWggPSAocmVzdWx0ICE9IDApID8gTlVMTCA6ICZocF9hbGxvY2F0ZWQ7CisgICAgbWVtc2V0KCh2b2lkICopICZkYXRhLCAnXDAnLCBzaXplb2YoZGF0YSkpOworICAgIHJlc3VsdCA9IGdldGhvc3RieWFkZHJfcihhcCwgYWwsIGFmLCAmaHBfYWxsb2NhdGVkLCAmZGF0YSk7CisgICAgaCA9IChyZXN1bHQgIT0gMCkgPyBOVUxMIDogJmhwX2FsbG9jYXRlZDsKICNlbmRpZgogI2Vsc2UgLyogbm90IEhBVkVfR0VUSE9TVEJZTkFNRV9SICovCiAjaWZkZWYgVVNFX0dFVEhPU1RCWU5BTUVfTE9DSwotCVB5VGhyZWFkX2FjcXVpcmVfbG9jayhuZXRkYl9sb2NrLCAxKTsKKyAgICBQeVRocmVhZF9hY3F1aXJlX2xvY2sobmV0ZGJfbG9jaywgMSk7CiAjZW5kaWYKLQloID0gZ2V0aG9zdGJ5YWRkcihhcCwgYWwsIGFmKTsKKyAgICBoID0gZ2V0aG9zdGJ5YWRkcihhcCwgYWwsIGFmKTsKICNlbmRpZiAvKiBIQVZFX0dFVEhPU1RCWU5BTUVfUiAqLwotCVB5X0VORF9BTExPV19USFJFQURTCi0JcmV0ID0gZ2V0aG9zdF9jb21tb24oaCwgKHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyLCBzaXplb2YoYWRkciksIGFmKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIHJldCA9IGdldGhvc3RfY29tbW9uKGgsIChzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkciwgc2l6ZW9mKGFkZHIpLCBhZik7CiAjaWZkZWYgVVNFX0dFVEhPU1RCWU5BTUVfTE9DSwotCVB5VGhyZWFkX3JlbGVhc2VfbG9jayhuZXRkYl9sb2NrKTsKKyAgICBQeVRocmVhZF9yZWxlYXNlX2xvY2sobmV0ZGJfbG9jayk7CiAjZW5kaWYKLQlyZXR1cm4gcmV0OworICAgIHJldHVybiByZXQ7CiB9CiAKIFB5RG9jX1NUUlZBUihnZXRob3N0YnlhZGRyX2RvYywKQEAgLTM0MjEsMTggKzM0MjEsMTggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzb2NrZXRfZ2V0c2VydmJ5bmFtZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqbmFtZSwgKnByb3RvPU5VTEw7Ci0Jc3RydWN0IHNlcnZlbnQgKnNwOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic3xzOmdldHNlcnZieW5hbWUiLCAmbmFtZSwgJnByb3RvKSkKLQkJcmV0dXJuIE5VTEw7Ci0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCXNwID0gZ2V0c2VydmJ5bmFtZShuYW1lLCBwcm90byk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQlpZiAoc3AgPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoc29ja2V0X2Vycm9yLCAic2VydmljZS9wcm90byBub3QgZm91bmQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZykgbnRvaHMoc3AtPnNfcG9ydCkpOworICAgIGNoYXIgKm5hbWUsICpwcm90bz1OVUxMOworICAgIHN0cnVjdCBzZXJ2ZW50ICpzcDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInN8czpnZXRzZXJ2YnluYW1lIiwgJm5hbWUsICZwcm90bykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICBzcCA9IGdldHNlcnZieW5hbWUobmFtZSwgcHJvdG8pOworICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgaWYgKHNwID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHNvY2tldF9lcnJvciwgInNlcnZpY2UvcHJvdG8gbm90IGZvdW5kIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIG50b2hzKHNwLT5zX3BvcnQpKTsKIH0KIAogUHlEb2NfU1RSVkFSKGdldHNlcnZieW5hbWVfZG9jLApAQCAtMzQ1MSwxOSArMzQ1MSwxOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNvY2tldF9nZXRzZXJ2Ynlwb3J0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQl1bnNpZ25lZCBzaG9ydCBwb3J0OwotCWNoYXIgKnByb3RvPU5VTEw7Ci0Jc3RydWN0IHNlcnZlbnQgKnNwOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiSHxzOmdldHNlcnZieXBvcnQiLCAmcG9ydCwgJnByb3RvKSkKLQkJcmV0dXJuIE5VTEw7Ci0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCXNwID0gZ2V0c2VydmJ5cG9ydChodG9ucyhwb3J0KSwgcHJvdG8pOwotCVB5X0VORF9BTExPV19USFJFQURTCi0JaWYgKHNwID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKHNvY2tldF9lcnJvciwgInBvcnQvcHJvdG8gbm90IGZvdW5kIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhzcC0+c19uYW1lKTsKKyAgICB1bnNpZ25lZCBzaG9ydCBwb3J0OworICAgIGNoYXIgKnByb3RvPU5VTEw7CisgICAgc3RydWN0IHNlcnZlbnQgKnNwOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiSHxzOmdldHNlcnZieXBvcnQiLCAmcG9ydCwgJnByb3RvKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIHNwID0gZ2V0c2VydmJ5cG9ydChodG9ucyhwb3J0KSwgcHJvdG8pOworICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgaWYgKHNwID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHNvY2tldF9lcnJvciwgInBvcnQvcHJvdG8gbm90IGZvdW5kIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhzcC0+c19uYW1lKTsKIH0KIAogUHlEb2NfU1RSVkFSKGdldHNlcnZieXBvcnRfZG9jLApAQCAtMzQ4MSwyMyArMzQ4MSwyMyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNvY2tldF9nZXRwcm90b2J5bmFtZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqbmFtZTsKLQlzdHJ1Y3QgcHJvdG9lbnQgKnNwOworICAgIGNoYXIgKm5hbWU7CisgICAgc3RydWN0IHByb3RvZW50ICpzcDsKICNpZmRlZiBfX0JFT1NfXwogLyogTm90IGF2YWlsYWJsZSBpbiBCZU9TIHlldC4gLSBbY2poXSAqLwotCVB5RXJyX1NldFN0cmluZyhzb2NrZXRfZXJyb3IsICJnZXRwcm90b2J5bmFtZSBub3Qgc3VwcG9ydGVkIik7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlFcnJfU2V0U3RyaW5nKHNvY2tldF9lcnJvciwgImdldHByb3RvYnluYW1lIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICByZXR1cm4gTlVMTDsKICNlbHNlCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOmdldHByb3RvYnluYW1lIiwgJm5hbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0Jc3AgPSBnZXRwcm90b2J5bmFtZShuYW1lKTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCWlmIChzcCA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhzb2NrZXRfZXJyb3IsICJwcm90b2NvbCBub3QgZm91bmQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZykgc3AtPnBfcHJvdG8pOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczpnZXRwcm90b2J5bmFtZSIsICZuYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIHNwID0gZ2V0cHJvdG9ieW5hbWUobmFtZSk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBpZiAoc3AgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoc29ja2V0X2Vycm9yLCAicHJvdG9jb2wgbm90IGZvdW5kIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIHNwLT5wX3Byb3RvKTsKICNlbmRpZgogfQogCkBAIC0zNTE2LDQwICszNTE2LDQwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogc29ja2V0X3NvY2tldHBhaXIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5U29ja2V0U29ja09iamVjdCAqczAgPSBOVUxMLCAqczEgPSBOVUxMOwotCVNPQ0tFVF9UIHN2WzJdOwotCWludCBmYW1pbHksIHR5cGUgPSBTT0NLX1NUUkVBTSwgcHJvdG8gPSAwOwotCVB5T2JqZWN0ICpyZXMgPSBOVUxMOworICAgIFB5U29ja2V0U29ja09iamVjdCAqczAgPSBOVUxMLCAqczEgPSBOVUxMOworICAgIFNPQ0tFVF9UIHN2WzJdOworICAgIGludCBmYW1pbHksIHR5cGUgPSBTT0NLX1NUUkVBTSwgcHJvdG8gPSAwOworICAgIFB5T2JqZWN0ICpyZXMgPSBOVUxMOwogCiAjaWYgZGVmaW5lZChBRl9VTklYKQotCWZhbWlseSA9IEFGX1VOSVg7CisgICAgZmFtaWx5ID0gQUZfVU5JWDsKICNlbHNlCi0JZmFtaWx5ID0gQUZfSU5FVDsKKyAgICBmYW1pbHkgPSBBRl9JTkVUOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8aWlpOnNvY2tldHBhaXIiLAotCQkJICAgICAgJmZhbWlseSwgJnR5cGUsICZwcm90bykpCi0JCXJldHVybiBOVUxMOwotCS8qIENyZWF0ZSBhIHBhaXIgb2Ygc29ja2V0IGZkcyAqLwotCWlmIChzb2NrZXRwYWlyKGZhbWlseSwgdHlwZSwgcHJvdG8sIHN2KSA8IDApCi0JCXJldHVybiBzZXRfZXJyb3IoKTsKLQlzMCA9IG5ld19zb2Nrb2JqZWN0KHN2WzBdLCBmYW1pbHksIHR5cGUsIHByb3RvKTsKLQlpZiAoczAgPT0gTlVMTCkKLQkJZ290byBmaW5hbGx5OwotCXMxID0gbmV3X3NvY2tvYmplY3Qoc3ZbMV0sIGZhbWlseSwgdHlwZSwgcHJvdG8pOwotCWlmIChzMSA9PSBOVUxMKQotCQlnb3RvIGZpbmFsbHk7Ci0JcmVzID0gUHlUdXBsZV9QYWNrKDIsIHMwLCBzMSk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8aWlpOnNvY2tldHBhaXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmFtaWx5LCAmdHlwZSwgJnByb3RvKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgLyogQ3JlYXRlIGEgcGFpciBvZiBzb2NrZXQgZmRzICovCisgICAgaWYgKHNvY2tldHBhaXIoZmFtaWx5LCB0eXBlLCBwcm90bywgc3YpIDwgMCkKKyAgICAgICAgcmV0dXJuIHNldF9lcnJvcigpOworICAgIHMwID0gbmV3X3NvY2tvYmplY3Qoc3ZbMF0sIGZhbWlseSwgdHlwZSwgcHJvdG8pOworICAgIGlmIChzMCA9PSBOVUxMKQorICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgczEgPSBuZXdfc29ja29iamVjdChzdlsxXSwgZmFtaWx5LCB0eXBlLCBwcm90byk7CisgICAgaWYgKHMxID09IE5VTEwpCisgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICByZXMgPSBQeVR1cGxlX1BhY2soMiwgczAsIHMxKTsKIAogZmluYWxseToKLQlpZiAocmVzID09IE5VTEwpIHsKLQkJaWYgKHMwID09IE5VTEwpCi0JCQlTT0NLRVRDTE9TRShzdlswXSk7Ci0JCWlmIChzMSA9PSBOVUxMKQotCQkJU09DS0VUQ0xPU0Uoc3ZbMV0pOwotCX0KLQlQeV9YREVDUkVGKHMwKTsKLQlQeV9YREVDUkVGKHMxKTsKLQlyZXR1cm4gcmVzOworICAgIGlmIChyZXMgPT0gTlVMTCkgeworICAgICAgICBpZiAoczAgPT0gTlVMTCkKKyAgICAgICAgICAgIFNPQ0tFVENMT1NFKHN2WzBdKTsKKyAgICAgICAgaWYgKHMxID09IE5VTEwpCisgICAgICAgICAgICBTT0NLRVRDTE9TRShzdlsxXSk7CisgICAgfQorICAgIFB5X1hERUNSRUYoczApOworICAgIFB5X1hERUNSRUYoczEpOworICAgIHJldHVybiByZXM7CiB9CiAKIFB5RG9jX1NUUlZBUihzb2NrZXRwYWlyX2RvYywKQEAgLTM1NzIsMTggKzM1NzIsMTggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzb2NrZXRfZnJvbWZkKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeVNvY2tldFNvY2tPYmplY3QgKnM7Ci0JU09DS0VUX1QgZmQ7Ci0JaW50IGZhbWlseSwgdHlwZSwgcHJvdG8gPSAwOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaWlpfGk6ZnJvbWZkIiwKLQkJCSAgICAgICZmZCwgJmZhbWlseSwgJnR5cGUsICZwcm90bykpCi0JCXJldHVybiBOVUxMOwotCS8qIER1cCB0aGUgZmQgc28gaXQgYW5kIHRoZSBzb2NrZXQgY2FuIGJlIGNsb3NlZCBpbmRlcGVuZGVudGx5ICovCi0JZmQgPSBkdXAoZmQpOwotCWlmIChmZCA8IDApCi0JCXJldHVybiBzZXRfZXJyb3IoKTsKLQlzID0gbmV3X3NvY2tvYmplY3QoZmQsIGZhbWlseSwgdHlwZSwgcHJvdG8pOwotCXJldHVybiAoUHlPYmplY3QgKikgczsKKyAgICBQeVNvY2tldFNvY2tPYmplY3QgKnM7CisgICAgU09DS0VUX1QgZmQ7CisgICAgaW50IGZhbWlseSwgdHlwZSwgcHJvdG8gPSAwOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaWlpfGk6ZnJvbWZkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZkLCAmZmFtaWx5LCAmdHlwZSwgJnByb3RvKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgLyogRHVwIHRoZSBmZCBzbyBpdCBhbmQgdGhlIHNvY2tldCBjYW4gYmUgY2xvc2VkIGluZGVwZW5kZW50bHkgKi8KKyAgICBmZCA9IGR1cChmZCk7CisgICAgaWYgKGZkIDwgMCkKKyAgICAgICAgcmV0dXJuIHNldF9lcnJvcigpOworICAgIHMgPSBuZXdfc29ja29iamVjdChmZCwgZmFtaWx5LCB0eXBlLCBwcm90byk7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKSBzOwogfQogCiBQeURvY19TVFJWQVIoZnJvbWZkX2RvYywKQEAgLTM1OTksMTggKzM1OTksMTggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzb2NrZXRfbnRvaHMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCB4MSwgeDI7CisgICAgaW50IHgxLCB4MjsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpudG9ocyIsICZ4MSkpIHsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmICh4MSA8IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0JCQkiY2FuJ3QgY29udmVydCBuZWdhdGl2ZSBudW1iZXIgdG8gdW5zaWduZWQgbG9uZyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JeDIgPSAodW5zaWduZWQgaW50KW50b2hzKCh1bnNpZ25lZCBzaG9ydCl4MSk7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKHgyKTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6bnRvaHMiLCAmeDEpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoeDEgPCAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgImNhbid0IGNvbnZlcnQgbmVnYXRpdmUgbnVtYmVyIHRvIHVuc2lnbmVkIGxvbmciKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHgyID0gKHVuc2lnbmVkIGludCludG9ocygodW5zaWduZWQgc2hvcnQpeDEpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyh4Mik7CiB9CiAKIFB5RG9jX1NUUlZBUihudG9oc19kb2MsCkBAIC0zNjIyLDQxICszNjIyLDQxIEBACiBzdGF0aWMgUHlPYmplY3QgKgogc29ja2V0X250b2hsKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJnKQogewotCXVuc2lnbmVkIGxvbmcgeDsKKyAgICB1bnNpZ25lZCBsb25nIHg7CiAKLQlpZiAoUHlJbnRfQ2hlY2soYXJnKSkgewotCQl4ID0gUHlJbnRfQVNfTE9ORyhhcmcpOwotCQlpZiAoeCA9PSAodW5zaWduZWQgbG9uZykgLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJCXJldHVybiBOVUxMOwotCQlpZiAoKGxvbmcpeCA8IDApIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJICAiY2FuJ3QgY29udmVydCBuZWdhdGl2ZSBudW1iZXIgdG8gdW5zaWduZWQgbG9uZyIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9Ci0JZWxzZSBpZiAoUHlMb25nX0NoZWNrKGFyZykpIHsKLQkJeCA9IFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZyhhcmcpOwotCQlpZiAoeCA9PSAodW5zaWduZWQgbG9uZykgLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJCXJldHVybiBOVUxMOworICAgIGlmIChQeUludF9DaGVjayhhcmcpKSB7CisgICAgICAgIHggPSBQeUludF9BU19MT05HKGFyZyk7CisgICAgICAgIGlmICh4ID09ICh1bnNpZ25lZCBsb25nKSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGlmICgobG9uZyl4IDwgMCkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICJjYW4ndCBjb252ZXJ0IG5lZ2F0aXZlIG51bWJlciB0byB1bnNpZ25lZCBsb25nIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChQeUxvbmdfQ2hlY2soYXJnKSkgeworICAgICAgICB4ID0gUHlMb25nX0FzVW5zaWduZWRMb25nKGFyZyk7CisgICAgICAgIGlmICh4ID09ICh1bnNpZ25lZCBsb25nKSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAjaWYgU0laRU9GX0xPTkcgPiA0Ci0JCXsKLQkJCXVuc2lnbmVkIGxvbmcgeTsKLQkJCS8qIG9ubHkgd2FudCB0aGUgdHJhaWxpbmcgMzIgYml0cyAqLwotCQkJeSA9IHggJiAweEZGRkZGRkZGVUw7Ci0JCQlpZiAoeSBeIHgpCi0JCQkJcmV0dXJuIFB5RXJyX0Zvcm1hdChQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJCQkgICAgImxvbmcgaW50IGxhcmdlciB0aGFuIDMyIGJpdHMiKTsKLQkJCXggPSB5OwotCQl9CisgICAgICAgIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgeTsKKyAgICAgICAgICAgIC8qIG9ubHkgd2FudCB0aGUgdHJhaWxpbmcgMzIgYml0cyAqLworICAgICAgICAgICAgeSA9IHggJiAweEZGRkZGRkZGVUw7CisgICAgICAgICAgICBpZiAoeSBeIHgpCisgICAgICAgICAgICAgICAgcmV0dXJuIFB5RXJyX0Zvcm1hdChQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsb25nIGludCBsYXJnZXIgdGhhbiAzMiBiaXRzIik7CisgICAgICAgICAgICB4ID0geTsKKyAgICAgICAgfQogI2VuZGlmCi0JfQotCWVsc2UKLQkJcmV0dXJuIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkJICAgICJleHBlY3RlZCBpbnQvbG9uZywgJXMgZm91bmQiLAotCQkJCSAgICBQeV9UWVBFKGFyZyktPnRwX25hbWUpOwotCWlmICh4ID09ICh1bnNpZ25lZCBsb25nKSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gUHlMb25nX0Zyb21VbnNpZ25lZExvbmcobnRvaGwoeCkpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBpbnQvbG9uZywgJXMgZm91bmQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X1RZUEUoYXJnKS0+dHBfbmFtZSk7CisgICAgaWYgKHggPT0gKHVuc2lnbmVkIGxvbmcpIC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZyhudG9obCh4KSk7CiB9CiAKIFB5RG9jX1NUUlZBUihudG9obF9kb2MsCkBAIC0zNjY4LDE4ICszNjY4LDE4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc29ja2V0X2h0b25zKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgeDEsIHgyOworICAgIGludCB4MSwgeDI7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6aHRvbnMiLCAmeDEpKSB7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoeDEgPCAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJImNhbid0IGNvbnZlcnQgbmVnYXRpdmUgbnVtYmVyIHRvIHVuc2lnbmVkIGxvbmciKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXgyID0gKHVuc2lnbmVkIGludClodG9ucygodW5zaWduZWQgc2hvcnQpeDEpOwotCXJldHVybiBQeUludF9Gcm9tTG9uZyh4Mik7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOmh0b25zIiwgJngxKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKHgxIDwgMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICJjYW4ndCBjb252ZXJ0IG5lZ2F0aXZlIG51bWJlciB0byB1bnNpZ25lZCBsb25nIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICB4MiA9ICh1bnNpZ25lZCBpbnQpaHRvbnMoKHVuc2lnbmVkIHNob3J0KXgxKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoeDIpOwogfQogCiBQeURvY19TVFJWQVIoaHRvbnNfZG9jLApAQCAtMzY5MSwzOSArMzY5MSwzOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNvY2tldF9odG9ubChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZykKIHsKLQl1bnNpZ25lZCBsb25nIHg7CisgICAgdW5zaWduZWQgbG9uZyB4OwogCi0JaWYgKFB5SW50X0NoZWNrKGFyZykpIHsKLQkJeCA9IFB5SW50X0FTX0xPTkcoYXJnKTsKLQkJaWYgKHggPT0gKHVuc2lnbmVkIGxvbmcpIC0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCQlyZXR1cm4gTlVMTDsKLQkJaWYgKChsb25nKXggPCAwKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJCSAgImNhbid0IGNvbnZlcnQgbmVnYXRpdmUgbnVtYmVyIHRvIHVuc2lnbmVkIGxvbmciKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQotCWVsc2UgaWYgKFB5TG9uZ19DaGVjayhhcmcpKSB7Ci0JCXggPSBQeUxvbmdfQXNVbnNpZ25lZExvbmcoYXJnKTsKLQkJaWYgKHggPT0gKHVuc2lnbmVkIGxvbmcpIC0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoUHlJbnRfQ2hlY2soYXJnKSkgeworICAgICAgICB4ID0gUHlJbnRfQVNfTE9ORyhhcmcpOworICAgICAgICBpZiAoeCA9PSAodW5zaWduZWQgbG9uZykgLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBpZiAoKGxvbmcpeCA8IDApIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAiY2FuJ3QgY29udmVydCBuZWdhdGl2ZSBudW1iZXIgdG8gdW5zaWduZWQgbG9uZyIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoUHlMb25nX0NoZWNrKGFyZykpIHsKKyAgICAgICAgeCA9IFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZyhhcmcpOworICAgICAgICBpZiAoeCA9PSAodW5zaWduZWQgbG9uZykgLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogI2lmIFNJWkVPRl9MT05HID4gNAotCQl7Ci0JCQl1bnNpZ25lZCBsb25nIHk7Ci0JCQkvKiBvbmx5IHdhbnQgdGhlIHRyYWlsaW5nIDMyIGJpdHMgKi8KLQkJCXkgPSB4ICYgMHhGRkZGRkZGRlVMOwotCQkJaWYgKHkgXiB4KQotCQkJCXJldHVybiBQeUVycl9Gb3JtYXQoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJCQkJICAgICJsb25nIGludCBsYXJnZXIgdGhhbiAzMiBiaXRzIik7Ci0JCQl4ID0geTsKLQkJfQorICAgICAgICB7CisgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHk7CisgICAgICAgICAgICAvKiBvbmx5IHdhbnQgdGhlIHRyYWlsaW5nIDMyIGJpdHMgKi8KKyAgICAgICAgICAgIHkgPSB4ICYgMHhGRkZGRkZGRlVMOworICAgICAgICAgICAgaWYgKHkgXiB4KQorICAgICAgICAgICAgICAgIHJldHVybiBQeUVycl9Gb3JtYXQoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibG9uZyBpbnQgbGFyZ2VyIHRoYW4gMzIgYml0cyIpOworICAgICAgICAgICAgeCA9IHk7CisgICAgICAgIH0KICNlbmRpZgotCX0KLQllbHNlCi0JCXJldHVybiBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJCSAgICAiZXhwZWN0ZWQgaW50L2xvbmcsICVzIGZvdW5kIiwKLQkJCQkgICAgUHlfVFlQRShhcmcpLT50cF9uYW1lKTsKLQlyZXR1cm4gUHlMb25nX0Zyb21VbnNpZ25lZExvbmcoaHRvbmwoKHVuc2lnbmVkIGxvbmcpeCkpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBpbnQvbG9uZywgJXMgZm91bmQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X1RZUEUoYXJnKS0+dHBfbmFtZSk7CisgICAgcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKGh0b25sKCh1bnNpZ25lZCBsb25nKXgpKTsKIH0KIAogUHlEb2NfU1RSVkFSKGh0b25sX2RvYywKQEAgLTM3NDYsMjAgKzM3NDYsMjAgQEAKICNkZWZpbmUgSU5BRERSX05PTkUgKC0xKQogI2VuZGlmCiAjaWZkZWYgSEFWRV9JTkVUX0FUT04KLQlzdHJ1Y3QgaW5fYWRkciBidWY7CisgICAgc3RydWN0IGluX2FkZHIgYnVmOwogI2VuZGlmCiAKICNpZiAhZGVmaW5lZChIQVZFX0lORVRfQVRPTikgfHwgZGVmaW5lZChVU0VfSU5FVF9BVE9OX1dFQUtMSU5LKQogI2lmIChTSVpFT0ZfSU5UICE9IDQpCiAjZXJyb3IgIk5vdCBzdXJlIGlmIGluX2FkZHJfdCBleGlzdHMgYW5kIGludCBpcyBub3QgMzItYml0cy4iCiAjZW5kaWYKLQkvKiBIYXZlIHRvIHVzZSBpbmV0X2FkZHIoKSBpbnN0ZWFkICovCi0JdW5zaWduZWQgaW50IHBhY2tlZF9hZGRyOworICAgIC8qIEhhdmUgdG8gdXNlIGluZXRfYWRkcigpIGluc3RlYWQgKi8KKyAgICB1bnNpZ25lZCBpbnQgcGFja2VkX2FkZHI7CiAjZW5kaWYKLQljaGFyICppcF9hZGRyOworICAgIGNoYXIgKmlwX2FkZHI7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6aW5ldF9hdG9uIiwgJmlwX2FkZHIpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6aW5ldF9hdG9uIiwgJmlwX2FkZHIpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAogCiAjaWZkZWYgSEFWRV9JTkVUX0FUT04KQEAgLTM3NjcsMTMgKzM3NjcsMTMgQEAKICNpZmRlZiBVU0VfSU5FVF9BVE9OX1dFQUtMSU5LCiAgICAgaWYgKGluZXRfYXRvbiAhPSBOVUxMKSB7CiAjZW5kaWYKLQlpZiAoaW5ldF9hdG9uKGlwX2FkZHIsICZidWYpKQotCQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKikoJmJ1ZiksCi0JCQkJCQkgIHNpemVvZihidWYpKTsKKyAgICBpZiAoaW5ldF9hdG9uKGlwX2FkZHIsICZidWYpKQorICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKikoJmJ1ZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoYnVmKSk7CiAKLQlQeUVycl9TZXRTdHJpbmcoc29ja2V0X2Vycm9yLAotCQkJImlsbGVnYWwgSVAgYWRkcmVzcyBzdHJpbmcgcGFzc2VkIHRvIGluZXRfYXRvbiIpOwotCXJldHVybiBOVUxMOworICAgIFB5RXJyX1NldFN0cmluZyhzb2NrZXRfZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICJpbGxlZ2FsIElQIGFkZHJlc3Mgc3RyaW5nIHBhc3NlZCB0byBpbmV0X2F0b24iKTsKKyAgICByZXR1cm4gTlVMTDsKIAogI2lmZGVmIFVTRV9JTkVUX0FUT05fV0VBS0xJTksKICAgIH0gZWxzZSB7CkBAIC0zNzgzLDIyICszNzgzLDIyIEBACiAKICNpZiAhZGVmaW5lZChIQVZFX0lORVRfQVRPTikgfHwgZGVmaW5lZChVU0VfSU5FVF9BVE9OX1dFQUtMSU5LKQogCi0JLyogc3BlY2lhbC1jYXNlIHRoaXMgYWRkcmVzcyBhcyBpbmV0X2FkZHIgbWlnaHQgcmV0dXJuIElOQUREUl9OT05FCi0JICogZm9yIHRoaXMgKi8KLQlpZiAoc3RyY21wKGlwX2FkZHIsICIyNTUuMjU1LjI1NS4yNTUiKSA9PSAwKSB7Ci0JCXBhY2tlZF9hZGRyID0gMHhGRkZGRkZGRjsKLQl9IGVsc2UgeworICAgIC8qIHNwZWNpYWwtY2FzZSB0aGlzIGFkZHJlc3MgYXMgaW5ldF9hZGRyIG1pZ2h0IHJldHVybiBJTkFERFJfTk9ORQorICAgICAqIGZvciB0aGlzICovCisgICAgaWYgKHN0cmNtcChpcF9hZGRyLCAiMjU1LjI1NS4yNTUuMjU1IikgPT0gMCkgeworICAgICAgICBwYWNrZWRfYWRkciA9IDB4RkZGRkZGRkY7CisgICAgfSBlbHNlIHsKIAotCQlwYWNrZWRfYWRkciA9IGluZXRfYWRkcihpcF9hZGRyKTsKKyAgICAgICAgcGFja2VkX2FkZHIgPSBpbmV0X2FkZHIoaXBfYWRkcik7CiAKLQkJaWYgKHBhY2tlZF9hZGRyID09IElOQUREUl9OT05FKSB7CS8qIGludmFsaWQgYWRkcmVzcyAqLwotCQkJUHlFcnJfU2V0U3RyaW5nKHNvY2tldF9lcnJvciwKLQkJCQkiaWxsZWdhbCBJUCBhZGRyZXNzIHN0cmluZyBwYXNzZWQgdG8gaW5ldF9hdG9uIik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKikgJnBhY2tlZF9hZGRyLAotCQkJCQkgIHNpemVvZihwYWNrZWRfYWRkcikpOworICAgICAgICBpZiAocGFja2VkX2FkZHIgPT0gSU5BRERSX05PTkUpIHsgICAgICAgICAgICAgICAvKiBpbnZhbGlkIGFkZHJlc3MgKi8KKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhzb2NrZXRfZXJyb3IsCisgICAgICAgICAgICAgICAgImlsbGVnYWwgSVAgYWRkcmVzcyBzdHJpbmcgcGFzc2VkIHRvIGluZXRfYXRvbiIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopICZwYWNrZWRfYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHBhY2tlZF9hZGRyKSk7CiAKICNpZmRlZiBVU0VfSU5FVF9BVE9OX1dFQUtMSU5LCiAgICB9CkBAIC0zODE1LDIzICszODE1LDIzIEBACiBzdGF0aWMgUHlPYmplY3QqCiBzb2NrZXRfaW5ldF9udG9hKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpwYWNrZWRfc3RyOwotCWludCBhZGRyX2xlbjsKLQlzdHJ1Y3QgaW5fYWRkciBwYWNrZWRfYWRkcjsKKyAgICBjaGFyICpwYWNrZWRfc3RyOworICAgIGludCBhZGRyX2xlbjsKKyAgICBzdHJ1Y3QgaW5fYWRkciBwYWNrZWRfYWRkcjsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyM6aW5ldF9udG9hIiwgJnBhY2tlZF9zdHIsICZhZGRyX2xlbikpIHsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyM6aW5ldF9udG9hIiwgJnBhY2tlZF9zdHIsICZhZGRyX2xlbikpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaWYgKGFkZHJfbGVuICE9IHNpemVvZihwYWNrZWRfYWRkcikpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKHNvY2tldF9lcnJvciwKLQkJCSJwYWNrZWQgSVAgd3JvbmcgbGVuZ3RoIGZvciBpbmV0X250b2EiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChhZGRyX2xlbiAhPSBzaXplb2YocGFja2VkX2FkZHIpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhzb2NrZXRfZXJyb3IsCisgICAgICAgICAgICAicGFja2VkIElQIHdyb25nIGxlbmd0aCBmb3IgaW5ldF9udG9hIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCW1lbWNweSgmcGFja2VkX2FkZHIsIHBhY2tlZF9zdHIsIGFkZHJfbGVuKTsKKyAgICBtZW1jcHkoJnBhY2tlZF9hZGRyLCBwYWNrZWRfc3RyLCBhZGRyX2xlbik7CiAKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhpbmV0X250b2EocGFja2VkX2FkZHIpKTsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhpbmV0X250b2EocGFja2VkX2FkZHIpKTsKIH0KIAogI2lmZGVmIEhBVkVfSU5FVF9QVE9OCkBAIC0zODQ1LDQ2ICszODQ1LDQ2IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc29ja2V0X2luZXRfcHRvbihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IGFmOwotCWNoYXIqIGlwOwotCWludCByZXR2YWw7CisgICAgaW50IGFmOworICAgIGNoYXIqIGlwOworICAgIGludCByZXR2YWw7CiAjaWZkZWYgRU5BQkxFX0lQVjYKLQljaGFyIHBhY2tlZFtNQVgoc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSwgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikpXTsKKyAgICBjaGFyIHBhY2tlZFtNQVgoc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSwgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikpXTsKICNlbHNlCi0JY2hhciBwYWNrZWRbc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKV07CisgICAgY2hhciBwYWNrZWRbc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKV07CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlzOmluZXRfcHRvbiIsICZhZiwgJmlwKSkgewotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpczppbmV0X3B0b24iLCAmYWYsICZpcCkpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCiAjaWYgIWRlZmluZWQoRU5BQkxFX0lQVjYpICYmIGRlZmluZWQoQUZfSU5FVDYpCi0JaWYoYWYgPT0gQUZfSU5FVDYpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKHNvY2tldF9lcnJvciwKLQkJCQkiY2FuJ3QgdXNlIEFGX0lORVQ2LCBJUHY2IGlzIGRpc2FibGVkIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZihhZiA9PSBBRl9JTkVUNikgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoc29ja2V0X2Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImNhbid0IHVzZSBBRl9JTkVUNiwgSVB2NiBpcyBkaXNhYmxlZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAjZW5kaWYKIAotCXJldHZhbCA9IGluZXRfcHRvbihhZiwgaXAsIHBhY2tlZCk7Ci0JaWYgKHJldHZhbCA8IDApIHsKLQkJUHlFcnJfU2V0RnJvbUVycm5vKHNvY2tldF9lcnJvcik7Ci0JCXJldHVybiBOVUxMOwotCX0gZWxzZSBpZiAocmV0dmFsID09IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKHNvY2tldF9lcnJvciwKLQkJCSJpbGxlZ2FsIElQIGFkZHJlc3Mgc3RyaW5nIHBhc3NlZCB0byBpbmV0X3B0b24iKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfSBlbHNlIGlmIChhZiA9PSBBRl9JTkVUKSB7Ci0JCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShwYWNrZWQsCi0JCQlzaXplb2Yoc3RydWN0IGluX2FkZHIpKTsKKyAgICByZXR2YWwgPSBpbmV0X3B0b24oYWYsIGlwLCBwYWNrZWQpOworICAgIGlmIChyZXR2YWwgPCAwKSB7CisgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhzb2NrZXRfZXJyb3IpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9IGVsc2UgaWYgKHJldHZhbCA9PSAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhzb2NrZXRfZXJyb3IsCisgICAgICAgICAgICAiaWxsZWdhbCBJUCBhZGRyZXNzIHN0cmluZyBwYXNzZWQgdG8gaW5ldF9wdG9uIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0gZWxzZSBpZiAoYWYgPT0gQUZfSU5FVCkgeworICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocGFja2VkLAorICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSk7CiAjaWZkZWYgRU5BQkxFX0lQVjYKLQl9IGVsc2UgaWYgKGFmID09IEFGX0lORVQ2KSB7Ci0JCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShwYWNrZWQsCi0JCQlzaXplb2Yoc3RydWN0IGluNl9hZGRyKSk7CisgICAgfSBlbHNlIGlmIChhZiA9PSBBRl9JTkVUNikgeworICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocGFja2VkLAorICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikpOwogI2VuZGlmCi0JfSBlbHNlIHsKLQkJUHlFcnJfU2V0U3RyaW5nKHNvY2tldF9lcnJvciwgInVua25vd24gYWRkcmVzcyBmYW1pbHkiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIH0gZWxzZSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhzb2NrZXRfZXJyb3IsICJ1bmtub3duIGFkZHJlc3MgZmFtaWx5Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIH0KIAogUHlEb2NfU1RSVkFSKGluZXRfbnRvcF9kb2MsCkBAIC0zODk1LDU0ICszODk1LDU0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc29ja2V0X2luZXRfbnRvcChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IGFmOwotCWNoYXIqIHBhY2tlZDsKLQlpbnQgbGVuOwotCWNvbnN0IGNoYXIqIHJldHZhbDsKKyAgICBpbnQgYWY7CisgICAgY2hhciogcGFja2VkOworICAgIGludCBsZW47CisgICAgY29uc3QgY2hhciogcmV0dmFsOwogI2lmZGVmIEVOQUJMRV9JUFY2Ci0JY2hhciBpcFtNQVgoSU5FVF9BRERSU1RSTEVOLCBJTkVUNl9BRERSU1RSTEVOKSArIDFdOworICAgIGNoYXIgaXBbTUFYKElORVRfQUREUlNUUkxFTiwgSU5FVDZfQUREUlNUUkxFTikgKyAxXTsKICNlbHNlCi0JY2hhciBpcFtJTkVUX0FERFJTVFJMRU4gKyAxXTsKKyAgICBjaGFyIGlwW0lORVRfQUREUlNUUkxFTiArIDFdOwogI2VuZGlmCiAKLQkvKiBHdWFyYW50ZWUgTlVMLXRlcm1pbmF0aW9uIGZvciBQeVN0cmluZ19Gcm9tU3RyaW5nKCkgYmVsb3cgKi8KLQltZW1zZXQoKHZvaWQgKikgJmlwWzBdLCAnXDAnLCBzaXplb2YoaXApKTsKKyAgICAvKiBHdWFyYW50ZWUgTlVMLXRlcm1pbmF0aW9uIGZvciBQeVN0cmluZ19Gcm9tU3RyaW5nKCkgYmVsb3cgKi8KKyAgICBtZW1zZXQoKHZvaWQgKikgJmlwWzBdLCAnXDAnLCBzaXplb2YoaXApKTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaXMjOmluZXRfbnRvcCIsICZhZiwgJnBhY2tlZCwgJmxlbikpIHsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaXMjOmluZXRfbnRvcCIsICZhZiwgJnBhY2tlZCwgJmxlbikpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaWYgKGFmID09IEFGX0lORVQpIHsKLQkJaWYgKGxlbiAhPSBzaXplb2Yoc3RydWN0IGluX2FkZHIpKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkiaW52YWxpZCBsZW5ndGggb2YgcGFja2VkIElQIGFkZHJlc3Mgc3RyaW5nIik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQorICAgIGlmIChhZiA9PSBBRl9JTkVUKSB7CisgICAgICAgIGlmIChsZW4gIT0gc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgImludmFsaWQgbGVuZ3RoIG9mIHBhY2tlZCBJUCBhZGRyZXNzIHN0cmluZyIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KICNpZmRlZiBFTkFCTEVfSVBWNgotCX0gZWxzZSBpZiAoYWYgPT0gQUZfSU5FVDYpIHsKLQkJaWYgKGxlbiAhPSBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJImludmFsaWQgbGVuZ3RoIG9mIHBhY2tlZCBJUCBhZGRyZXNzIHN0cmluZyIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KKyAgICB9IGVsc2UgaWYgKGFmID09IEFGX0lORVQ2KSB7CisgICAgICAgIGlmIChsZW4gIT0gc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICJpbnZhbGlkIGxlbmd0aCBvZiBwYWNrZWQgSVAgYWRkcmVzcyBzdHJpbmciKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CiAjZW5kaWYKLQl9IGVsc2UgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKLQkJCSJ1bmtub3duIGFkZHJlc3MgZmFtaWx5ICVkIiwgYWYpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgfSBlbHNlIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAidW5rbm93biBhZGRyZXNzIGZhbWlseSAlZCIsIGFmKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JcmV0dmFsID0gaW5ldF9udG9wKGFmLCBwYWNrZWQsIGlwLCBzaXplb2YoaXApKTsKLQlpZiAoIXJldHZhbCkgewotCQlQeUVycl9TZXRGcm9tRXJybm8oc29ja2V0X2Vycm9yKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfSBlbHNlIHsKLQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcocmV0dmFsKTsKLQl9CisgICAgcmV0dmFsID0gaW5ldF9udG9wKGFmLCBwYWNrZWQsIGlwLCBzaXplb2YoaXApKTsKKyAgICBpZiAoIXJldHZhbCkgeworICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oc29ja2V0X2Vycm9yKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcocmV0dmFsKTsKKyAgICB9CiAKLQkvKiBOT1RSRUFDSEVEICovCi0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgImludmFsaWQgaGFuZGxpbmcgb2YgaW5ldF9udG9wIik7Ci0JcmV0dXJuIE5VTEw7CisgICAgLyogTk9UUkVBQ0hFRCAqLworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJpbnZhbGlkIGhhbmRsaW5nIG9mIGluZXRfbnRvcCIpOworICAgIHJldHVybiBOVUxMOwogfQogCiAjZW5kaWYgLyogSEFWRV9JTkVUX1BUT04gKi8KQEAgLTM5NTMsOTUgKzM5NTMsOTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzb2NrZXRfZ2V0YWRkcmluZm8oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXN0cnVjdCBhZGRyaW5mbyBoaW50cywgKnJlczsKLQlzdHJ1Y3QgYWRkcmluZm8gKnJlczAgPSBOVUxMOwotCVB5T2JqZWN0ICpob2JqID0gTlVMTDsKLQlQeU9iamVjdCAqcG9iaiA9IChQeU9iamVjdCAqKU5VTEw7Ci0JY2hhciBwYnVmWzMwXTsKLQljaGFyICpocHRyLCAqcHB0cjsKLQlpbnQgZmFtaWx5LCBzb2NrdHlwZSwgcHJvdG9jb2wsIGZsYWdzOwotCWludCBlcnJvcjsKLQlQeU9iamVjdCAqYWxsID0gKFB5T2JqZWN0ICopTlVMTDsKLQlQeU9iamVjdCAqc2luZ2xlID0gKFB5T2JqZWN0ICopTlVMTDsKLQlQeU9iamVjdCAqaWRuYSA9IE5VTEw7CisgICAgc3RydWN0IGFkZHJpbmZvIGhpbnRzLCAqcmVzOworICAgIHN0cnVjdCBhZGRyaW5mbyAqcmVzMCA9IE5VTEw7CisgICAgUHlPYmplY3QgKmhvYmogPSBOVUxMOworICAgIFB5T2JqZWN0ICpwb2JqID0gKFB5T2JqZWN0ICopTlVMTDsKKyAgICBjaGFyIHBidWZbMzBdOworICAgIGNoYXIgKmhwdHIsICpwcHRyOworICAgIGludCBmYW1pbHksIHNvY2t0eXBlLCBwcm90b2NvbCwgZmxhZ3M7CisgICAgaW50IGVycm9yOworICAgIFB5T2JqZWN0ICphbGwgPSAoUHlPYmplY3QgKilOVUxMOworICAgIFB5T2JqZWN0ICpzaW5nbGUgPSAoUHlPYmplY3QgKilOVUxMOworICAgIFB5T2JqZWN0ICppZG5hID0gTlVMTDsKIAotCWZhbWlseSA9IHNvY2t0eXBlID0gcHJvdG9jb2wgPSBmbGFncyA9IDA7Ci0JZmFtaWx5ID0gQUZfVU5TUEVDOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT098aWlpaTpnZXRhZGRyaW5mbyIsCi0JCQkgICAgICAmaG9iaiwgJnBvYmosICZmYW1pbHksICZzb2NrdHlwZSwKLQkJCSAgICAgICZwcm90b2NvbCwgJmZsYWdzKSkgewotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKGhvYmogPT0gUHlfTm9uZSkgewotCQlocHRyID0gTlVMTDsKLQl9IGVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayhob2JqKSkgewotCQlpZG5hID0gUHlPYmplY3RfQ2FsbE1ldGhvZChob2JqLCAiZW5jb2RlIiwgInMiLCAiaWRuYSIpOwotCQlpZiAoIWlkbmEpCi0JCQlyZXR1cm4gTlVMTDsKLQkJaHB0ciA9IFB5U3RyaW5nX0FzU3RyaW5nKGlkbmEpOwotCX0gZWxzZSBpZiAoUHlTdHJpbmdfQ2hlY2soaG9iaikpIHsKLQkJaHB0ciA9IFB5U3RyaW5nX0FzU3RyaW5nKGhvYmopOwotCX0gZWxzZSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJImdldGFkZHJpbmZvKCkgYXJndW1lbnQgMSBtdXN0IGJlIHN0cmluZyBvciBOb25lIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoUHlJbnRfQ2hlY2socG9iaikpIHsKLQkJUHlPU19zbnByaW50ZihwYnVmLCBzaXplb2YocGJ1ZiksICIlbGQiLCBQeUludF9Bc0xvbmcocG9iaikpOwotCQlwcHRyID0gcGJ1ZjsKLQl9IGVsc2UgaWYgKFB5U3RyaW5nX0NoZWNrKHBvYmopKSB7Ci0JCXBwdHIgPSBQeVN0cmluZ19Bc1N0cmluZyhwb2JqKTsKLQl9IGVsc2UgaWYgKHBvYmogPT0gUHlfTm9uZSkgewotCQlwcHRyID0gKGNoYXIgKilOVUxMOwotCX0gZWxzZSB7Ci0JCVB5RXJyX1NldFN0cmluZyhzb2NrZXRfZXJyb3IsICJJbnQgb3IgU3RyaW5nIGV4cGVjdGVkIik7Ci0gICAgICAgICAgICAgICAgZ290byBlcnI7Ci0JfQotCW1lbXNldCgmaGludHMsIDAsIHNpemVvZihoaW50cykpOwotCWhpbnRzLmFpX2ZhbWlseSA9IGZhbWlseTsKLQloaW50cy5haV9zb2NrdHlwZSA9IHNvY2t0eXBlOwotCWhpbnRzLmFpX3Byb3RvY29sID0gcHJvdG9jb2w7Ci0JaGludHMuYWlfZmxhZ3MgPSBmbGFnczsKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JQUNRVUlSRV9HRVRBRERSSU5GT19MT0NLCi0JZXJyb3IgPSBnZXRhZGRyaW5mbyhocHRyLCBwcHRyLCAmaGludHMsICZyZXMwKTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCVJFTEVBU0VfR0VUQUREUklORk9fTE9DSyAgLyogc2VlIGNvbW1lbnQgaW4gc2V0aXBhZGRyKCkgKi8KLQlpZiAoZXJyb3IpIHsKLQkJc2V0X2dhaWVycm9yKGVycm9yKTsKLQkJZ290byBlcnI7Ci0JfQorICAgIGZhbWlseSA9IHNvY2t0eXBlID0gcHJvdG9jb2wgPSBmbGFncyA9IDA7CisgICAgZmFtaWx5ID0gQUZfVU5TUEVDOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT098aWlpaTpnZXRhZGRyaW5mbyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZob2JqLCAmcG9iaiwgJmZhbWlseSwgJnNvY2t0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJvdG9jb2wsICZmbGFncykpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChob2JqID09IFB5X05vbmUpIHsKKyAgICAgICAgaHB0ciA9IE5VTEw7CisgICAgfSBlbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2soaG9iaikpIHsKKyAgICAgICAgaWRuYSA9IFB5T2JqZWN0X0NhbGxNZXRob2QoaG9iaiwgImVuY29kZSIsICJzIiwgImlkbmEiKTsKKyAgICAgICAgaWYgKCFpZG5hKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGhwdHIgPSBQeVN0cmluZ19Bc1N0cmluZyhpZG5hKTsKKyAgICB9IGVsc2UgaWYgKFB5U3RyaW5nX0NoZWNrKGhvYmopKSB7CisgICAgICAgIGhwdHIgPSBQeVN0cmluZ19Bc1N0cmluZyhob2JqKTsKKyAgICB9IGVsc2UgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImdldGFkZHJpbmZvKCkgYXJndW1lbnQgMSBtdXN0IGJlIHN0cmluZyBvciBOb25lIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoUHlJbnRfQ2hlY2socG9iaikpIHsKKyAgICAgICAgUHlPU19zbnByaW50ZihwYnVmLCBzaXplb2YocGJ1ZiksICIlbGQiLCBQeUludF9Bc0xvbmcocG9iaikpOworICAgICAgICBwcHRyID0gcGJ1ZjsKKyAgICB9IGVsc2UgaWYgKFB5U3RyaW5nX0NoZWNrKHBvYmopKSB7CisgICAgICAgIHBwdHIgPSBQeVN0cmluZ19Bc1N0cmluZyhwb2JqKTsKKyAgICB9IGVsc2UgaWYgKHBvYmogPT0gUHlfTm9uZSkgeworICAgICAgICBwcHRyID0gKGNoYXIgKilOVUxMOworICAgIH0gZWxzZSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhzb2NrZXRfZXJyb3IsICJJbnQgb3IgU3RyaW5nIGV4cGVjdGVkIik7CisgICAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgICBtZW1zZXQoJmhpbnRzLCAwLCBzaXplb2YoaGludHMpKTsKKyAgICBoaW50cy5haV9mYW1pbHkgPSBmYW1pbHk7CisgICAgaGludHMuYWlfc29ja3R5cGUgPSBzb2NrdHlwZTsKKyAgICBoaW50cy5haV9wcm90b2NvbCA9IHByb3RvY29sOworICAgIGhpbnRzLmFpX2ZsYWdzID0gZmxhZ3M7CisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIEFDUVVJUkVfR0VUQUREUklORk9fTE9DSworICAgIGVycm9yID0gZ2V0YWRkcmluZm8oaHB0ciwgcHB0ciwgJmhpbnRzLCAmcmVzMCk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBSRUxFQVNFX0dFVEFERFJJTkZPX0xPQ0sgIC8qIHNlZSBjb21tZW50IGluIHNldGlwYWRkcigpICovCisgICAgaWYgKGVycm9yKSB7CisgICAgICAgIHNldF9nYWllcnJvcihlcnJvcik7CisgICAgICAgIGdvdG8gZXJyOworICAgIH0KIAotCWlmICgoYWxsID0gUHlMaXN0X05ldygwKSkgPT0gTlVMTCkKLQkJZ290byBlcnI7Ci0JZm9yIChyZXMgPSByZXMwOyByZXM7IHJlcyA9IHJlcy0+YWlfbmV4dCkgewotCQlQeU9iamVjdCAqYWRkciA9Ci0JCQltYWtlc29ja2FkZHIoLTEsIHJlcy0+YWlfYWRkciwgcmVzLT5haV9hZGRybGVuLCBwcm90b2NvbCk7Ci0JCWlmIChhZGRyID09IE5VTEwpCi0JCQlnb3RvIGVycjsKLQkJc2luZ2xlID0gUHlfQnVpbGRWYWx1ZSgiaWlpc08iLCByZXMtPmFpX2ZhbWlseSwKLQkJCXJlcy0+YWlfc29ja3R5cGUsIHJlcy0+YWlfcHJvdG9jb2wsCi0JCQlyZXMtPmFpX2Nhbm9ubmFtZSA/IHJlcy0+YWlfY2Fub25uYW1lIDogIiIsCi0JCQlhZGRyKTsKLQkJUHlfREVDUkVGKGFkZHIpOwotCQlpZiAoc2luZ2xlID09IE5VTEwpCi0JCQlnb3RvIGVycjsKKyAgICBpZiAoKGFsbCA9IFB5TGlzdF9OZXcoMCkpID09IE5VTEwpCisgICAgICAgIGdvdG8gZXJyOworICAgIGZvciAocmVzID0gcmVzMDsgcmVzOyByZXMgPSByZXMtPmFpX25leHQpIHsKKyAgICAgICAgUHlPYmplY3QgKmFkZHIgPQorICAgICAgICAgICAgbWFrZXNvY2thZGRyKC0xLCByZXMtPmFpX2FkZHIsIHJlcy0+YWlfYWRkcmxlbiwgcHJvdG9jb2wpOworICAgICAgICBpZiAoYWRkciA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBlcnI7CisgICAgICAgIHNpbmdsZSA9IFB5X0J1aWxkVmFsdWUoImlpaXNPIiwgcmVzLT5haV9mYW1pbHksCisgICAgICAgICAgICByZXMtPmFpX3NvY2t0eXBlLCByZXMtPmFpX3Byb3RvY29sLAorICAgICAgICAgICAgcmVzLT5haV9jYW5vbm5hbWUgPyByZXMtPmFpX2Nhbm9ubmFtZSA6ICIiLAorICAgICAgICAgICAgYWRkcik7CisgICAgICAgIFB5X0RFQ1JFRihhZGRyKTsKKyAgICAgICAgaWYgKHNpbmdsZSA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBlcnI7CiAKLQkJaWYgKFB5TGlzdF9BcHBlbmQoYWxsLCBzaW5nbGUpKQotCQkJZ290byBlcnI7Ci0JCVB5X1hERUNSRUYoc2luZ2xlKTsKLQl9Ci0JUHlfWERFQ1JFRihpZG5hKTsKLQlpZiAocmVzMCkKLQkJZnJlZWFkZHJpbmZvKHJlczApOwotCXJldHVybiBhbGw7CisgICAgICAgIGlmIChQeUxpc3RfQXBwZW5kKGFsbCwgc2luZ2xlKSkKKyAgICAgICAgICAgIGdvdG8gZXJyOworICAgICAgICBQeV9YREVDUkVGKHNpbmdsZSk7CisgICAgfQorICAgIFB5X1hERUNSRUYoaWRuYSk7CisgICAgaWYgKHJlczApCisgICAgICAgIGZyZWVhZGRyaW5mbyhyZXMwKTsKKyAgICByZXR1cm4gYWxsOwogIGVycjoKLQlQeV9YREVDUkVGKHNpbmdsZSk7Ci0JUHlfWERFQ1JFRihhbGwpOwotCVB5X1hERUNSRUYoaWRuYSk7Ci0JaWYgKHJlczApCi0JCWZyZWVhZGRyaW5mbyhyZXMwKTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopTlVMTDsKKyAgICBQeV9YREVDUkVGKHNpbmdsZSk7CisgICAgUHlfWERFQ1JFRihhbGwpOworICAgIFB5X1hERUNSRUYoaWRuYSk7CisgICAgaWYgKHJlczApCisgICAgICAgIGZyZWVhZGRyaW5mbyhyZXMwKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopTlVMTDsKIH0KIAogUHlEb2NfU1RSVkFSKGdldGFkZHJpbmZvX2RvYywKQEAgLTQwNTYsNzcgKzQwNTYsNzcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzb2NrZXRfZ2V0bmFtZWluZm8oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICpzYSA9IChQeU9iamVjdCAqKU5VTEw7Ci0JaW50IGZsYWdzOwotCWNoYXIgKmhvc3RwOwotCWludCBwb3J0LCBmbG93aW5mbywgc2NvcGVfaWQ7Ci0JY2hhciBoYnVmW05JX01BWEhPU1RdLCBwYnVmW05JX01BWFNFUlZdOwotCXN0cnVjdCBhZGRyaW5mbyBoaW50cywgKnJlcyA9IE5VTEw7Ci0JaW50IGVycm9yOwotCVB5T2JqZWN0ICpyZXQgPSAoUHlPYmplY3QgKilOVUxMOworICAgIFB5T2JqZWN0ICpzYSA9IChQeU9iamVjdCAqKU5VTEw7CisgICAgaW50IGZsYWdzOworICAgIGNoYXIgKmhvc3RwOworICAgIGludCBwb3J0LCBmbG93aW5mbywgc2NvcGVfaWQ7CisgICAgY2hhciBoYnVmW05JX01BWEhPU1RdLCBwYnVmW05JX01BWFNFUlZdOworICAgIHN0cnVjdCBhZGRyaW5mbyBoaW50cywgKnJlcyA9IE5VTEw7CisgICAgaW50IGVycm9yOworICAgIFB5T2JqZWN0ICpyZXQgPSAoUHlPYmplY3QgKilOVUxMOwogCi0JZmxhZ3MgPSBmbG93aW5mbyA9IHNjb3BlX2lkID0gMDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9pOmdldG5hbWVpbmZvIiwgJnNhLCAmZmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIVB5VHVwbGVfQ2hlY2soc2EpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJImdldG5hbWVpbmZvKCkgYXJndW1lbnQgMSBtdXN0IGJlIGEgdHVwbGUiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmICghUHlBcmdfUGFyc2VUdXBsZShzYSwgInNpfGlpIiwKLQkJCSAgICAgICZob3N0cCwgJnBvcnQsICZmbG93aW5mbywgJnNjb3BlX2lkKSkKLQkJcmV0dXJuIE5VTEw7Ci0JUHlPU19zbnByaW50ZihwYnVmLCBzaXplb2YocGJ1ZiksICIlZCIsIHBvcnQpOwotCW1lbXNldCgmaGludHMsIDAsIHNpemVvZihoaW50cykpOwotCWhpbnRzLmFpX2ZhbWlseSA9IEFGX1VOU1BFQzsKLQloaW50cy5haV9zb2NrdHlwZSA9IFNPQ0tfREdSQU07CS8qIG1ha2UgbnVtZXJpYyBwb3J0IGhhcHB5ICovCi0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCUFDUVVJUkVfR0VUQUREUklORk9fTE9DSwotCWVycm9yID0gZ2V0YWRkcmluZm8oaG9zdHAsIHBidWYsICZoaW50cywgJnJlcyk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQlSRUxFQVNFX0dFVEFERFJJTkZPX0xPQ0sgIC8qIHNlZSBjb21tZW50IGluIHNldGlwYWRkcigpICovCi0JaWYgKGVycm9yKSB7Ci0JCXNldF9nYWllcnJvcihlcnJvcik7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0JaWYgKHJlcy0+YWlfbmV4dCkgewotCQlQeUVycl9TZXRTdHJpbmcoc29ja2V0X2Vycm9yLAotCQkJInNvY2thZGRyIHJlc29sdmVkIHRvIG11bHRpcGxlIGFkZHJlc3NlcyIpOwotCQlnb3RvIGZhaWw7Ci0JfQotCXN3aXRjaCAocmVzLT5haV9mYW1pbHkpIHsKLQljYXNlIEFGX0lORVQ6Ci0JICAgIHsKLQkJaWYgKFB5VHVwbGVfR0VUX1NJWkUoc2EpICE9IDIpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhzb2NrZXRfZXJyb3IsCi0JCQkJIklQdjQgc29ja2FkZHIgbXVzdCBiZSAyIHR1cGxlIik7Ci0JCQlnb3RvIGZhaWw7Ci0JCX0KLQkJYnJlYWs7Ci0JICAgIH0KKyAgICBmbGFncyA9IGZsb3dpbmZvID0gc2NvcGVfaWQgPSAwOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT2k6Z2V0bmFtZWluZm8iLCAmc2EsICZmbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHlUdXBsZV9DaGVjayhzYSkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJnZXRuYW1laW5mbygpIGFyZ3VtZW50IDEgbXVzdCBiZSBhIHR1cGxlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoc2EsICJzaXxpaSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZob3N0cCwgJnBvcnQsICZmbG93aW5mbywgJnNjb3BlX2lkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlPU19zbnByaW50ZihwYnVmLCBzaXplb2YocGJ1ZiksICIlZCIsIHBvcnQpOworICAgIG1lbXNldCgmaGludHMsIDAsIHNpemVvZihoaW50cykpOworICAgIGhpbnRzLmFpX2ZhbWlseSA9IEFGX1VOU1BFQzsKKyAgICBoaW50cy5haV9zb2NrdHlwZSA9IFNPQ0tfREdSQU07ICAgICAvKiBtYWtlIG51bWVyaWMgcG9ydCBoYXBweSAqLworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICBBQ1FVSVJFX0dFVEFERFJJTkZPX0xPQ0sKKyAgICBlcnJvciA9IGdldGFkZHJpbmZvKGhvc3RwLCBwYnVmLCAmaGludHMsICZyZXMpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgUkVMRUFTRV9HRVRBRERSSU5GT19MT0NLICAvKiBzZWUgY29tbWVudCBpbiBzZXRpcGFkZHIoKSAqLworICAgIGlmIChlcnJvcikgeworICAgICAgICBzZXRfZ2FpZXJyb3IoZXJyb3IpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorICAgIGlmIChyZXMtPmFpX25leHQpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHNvY2tldF9lcnJvciwKKyAgICAgICAgICAgICJzb2NrYWRkciByZXNvbHZlZCB0byBtdWx0aXBsZSBhZGRyZXNzZXMiKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKyAgICBzd2l0Y2ggKHJlcy0+YWlfZmFtaWx5KSB7CisgICAgY2FzZSBBRl9JTkVUOgorICAgICAgICB7CisgICAgICAgIGlmIChQeVR1cGxlX0dFVF9TSVpFKHNhKSAhPSAyKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoc29ja2V0X2Vycm9yLAorICAgICAgICAgICAgICAgICJJUHY0IHNvY2thZGRyIG11c3QgYmUgMiB0dXBsZSIpOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgICB9CiAjaWZkZWYgRU5BQkxFX0lQVjYKLQljYXNlIEFGX0lORVQ2OgotCSAgICB7Ci0JCXN0cnVjdCBzb2NrYWRkcl9pbjYgKnNpbjY7Ci0JCXNpbjYgPSAoc3RydWN0IHNvY2thZGRyX2luNiAqKXJlcy0+YWlfYWRkcjsKLQkJc2luNi0+c2luNl9mbG93aW5mbyA9IGZsb3dpbmZvOwotCQlzaW42LT5zaW42X3Njb3BlX2lkID0gc2NvcGVfaWQ7Ci0JCWJyZWFrOwotCSAgICB9CisgICAgY2FzZSBBRl9JTkVUNjoKKyAgICAgICAgeworICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW42ICpzaW42OworICAgICAgICBzaW42ID0gKHN0cnVjdCBzb2NrYWRkcl9pbjYgKilyZXMtPmFpX2FkZHI7CisgICAgICAgIHNpbjYtPnNpbjZfZmxvd2luZm8gPSBmbG93aW5mbzsKKyAgICAgICAgc2luNi0+c2luNl9zY29wZV9pZCA9IHNjb3BlX2lkOworICAgICAgICBicmVhazsKKyAgICAgICAgfQogI2VuZGlmCi0JfQotCWVycm9yID0gZ2V0bmFtZWluZm8ocmVzLT5haV9hZGRyLCByZXMtPmFpX2FkZHJsZW4sCi0JCQloYnVmLCBzaXplb2YoaGJ1ZiksIHBidWYsIHNpemVvZihwYnVmKSwgZmxhZ3MpOwotCWlmIChlcnJvcikgewotCQlzZXRfZ2FpZXJyb3IoZXJyb3IpOwotCQlnb3RvIGZhaWw7Ci0JfQotCXJldCA9IFB5X0J1aWxkVmFsdWUoInNzIiwgaGJ1ZiwgcGJ1Zik7CisgICAgfQorICAgIGVycm9yID0gZ2V0bmFtZWluZm8ocmVzLT5haV9hZGRyLCByZXMtPmFpX2FkZHJsZW4sCisgICAgICAgICAgICAgICAgICAgIGhidWYsIHNpemVvZihoYnVmKSwgcGJ1Ziwgc2l6ZW9mKHBidWYpLCBmbGFncyk7CisgICAgaWYgKGVycm9yKSB7CisgICAgICAgIHNldF9nYWllcnJvcihlcnJvcik7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisgICAgcmV0ID0gUHlfQnVpbGRWYWx1ZSgic3MiLCBoYnVmLCBwYnVmKTsKIAogZmFpbDoKLQlpZiAocmVzKQotCQlmcmVlYWRkcmluZm8ocmVzKTsKLQlyZXR1cm4gcmV0OworICAgIGlmIChyZXMpCisgICAgICAgIGZyZWVhZGRyaW5mbyhyZXMpOworICAgIHJldHVybiByZXQ7CiB9CiAKIFB5RG9jX1NUUlZBUihnZXRuYW1laW5mb19kb2MsCkBAIC00MTQwLDEyICs0MTQwLDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogc29ja2V0X2dldGRlZmF1bHR0aW1lb3V0KFB5T2JqZWN0ICpzZWxmKQogewotCWlmIChkZWZhdWx0dGltZW91dCA8IDAuMCkgewotCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCXJldHVybiBQeV9Ob25lOwotCX0KLQllbHNlCi0JCXJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoZGVmYXVsdHRpbWVvdXQpOworICAgIGlmIChkZWZhdWx0dGltZW91dCA8IDAuMCkgeworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIHJldHVybiBQeV9Ob25lOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoZGVmYXVsdHRpbWVvdXQpOwogfQogCiBQeURvY19TVFJWQVIoZ2V0ZGVmYXVsdHRpbWVvdXRfZG9jLApAQCAtNDE1OCwyNCArNDE1OCwyNCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNvY2tldF9zZXRkZWZhdWx0dGltZW91dChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZykKIHsKLQlkb3VibGUgdGltZW91dDsKKyAgICBkb3VibGUgdGltZW91dDsKIAotCWlmIChhcmcgPT0gUHlfTm9uZSkKLQkJdGltZW91dCA9IC0xLjA7Ci0JZWxzZSB7Ci0JCXRpbWVvdXQgPSBQeUZsb2F0X0FzRG91YmxlKGFyZyk7Ci0JCWlmICh0aW1lb3V0IDwgMC4wKSB7Ci0JCQlpZiAoIVB5RXJyX09jY3VycmVkKCkpCi0JCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJCQkiVGltZW91dCB2YWx1ZSBvdXQgb2YgcmFuZ2UiKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQorICAgIGlmIChhcmcgPT0gUHlfTm9uZSkKKyAgICAgICAgdGltZW91dCA9IC0xLjA7CisgICAgZWxzZSB7CisgICAgICAgIHRpbWVvdXQgPSBQeUZsb2F0X0FzRG91YmxlKGFyZyk7CisgICAgICAgIGlmICh0aW1lb3V0IDwgMC4wKSB7CisgICAgICAgICAgICBpZiAoIVB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaW1lb3V0IHZhbHVlIG91dCBvZiByYW5nZSIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CiAKLQlkZWZhdWx0dGltZW91dCA9IHRpbWVvdXQ7CisgICAgZGVmYXVsdHRpbWVvdXQgPSB0aW1lb3V0OwogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogUHlEb2NfU1RSVkFSKHNldGRlZmF1bHR0aW1lb3V0X2RvYywKQEAgLTQxODksNTUgKzQxODksNTUgQEAKIC8qIExpc3Qgb2YgZnVuY3Rpb25zIGV4cG9ydGVkIGJ5IHRoaXMgbW9kdWxlLiAqLwogCiBzdGF0aWMgUHlNZXRob2REZWYgc29ja2V0X21ldGhvZHNbXSA9IHsKLQl7ImdldGhvc3RieW5hbWUiLAlzb2NrZXRfZ2V0aG9zdGJ5bmFtZSwKLQkgTUVUSF9WQVJBUkdTLCBnZXRob3N0YnluYW1lX2RvY30sCi0JeyJnZXRob3N0YnluYW1lX2V4IiwJc29ja2V0X2dldGhvc3RieW5hbWVfZXgsCi0JIE1FVEhfVkFSQVJHUywgZ2hibl9leF9kb2N9LAotCXsiZ2V0aG9zdGJ5YWRkciIsCXNvY2tldF9nZXRob3N0YnlhZGRyLAotCSBNRVRIX1ZBUkFSR1MsIGdldGhvc3RieWFkZHJfZG9jfSwKLQl7ImdldGhvc3RuYW1lIiwJCXNvY2tldF9nZXRob3N0bmFtZSwKLQkgTUVUSF9OT0FSR1MsICBnZXRob3N0bmFtZV9kb2N9LAotCXsiZ2V0c2VydmJ5bmFtZSIsCXNvY2tldF9nZXRzZXJ2YnluYW1lLAotCSBNRVRIX1ZBUkFSR1MsIGdldHNlcnZieW5hbWVfZG9jfSwKLQl7ImdldHNlcnZieXBvcnQiLAlzb2NrZXRfZ2V0c2VydmJ5cG9ydCwKLQkgTUVUSF9WQVJBUkdTLCBnZXRzZXJ2Ynlwb3J0X2RvY30sCi0JeyJnZXRwcm90b2J5bmFtZSIsCXNvY2tldF9nZXRwcm90b2J5bmFtZSwKLQkgTUVUSF9WQVJBUkdTLCBnZXRwcm90b2J5bmFtZV9kb2N9LAorICAgIHsiZ2V0aG9zdGJ5bmFtZSIsICAgICAgICAgICBzb2NrZXRfZ2V0aG9zdGJ5bmFtZSwKKyAgICAgTUVUSF9WQVJBUkdTLCBnZXRob3N0YnluYW1lX2RvY30sCisgICAgeyJnZXRob3N0YnluYW1lX2V4IiwgICAgICAgIHNvY2tldF9nZXRob3N0YnluYW1lX2V4LAorICAgICBNRVRIX1ZBUkFSR1MsIGdoYm5fZXhfZG9jfSwKKyAgICB7ImdldGhvc3RieWFkZHIiLCAgICAgICAgICAgc29ja2V0X2dldGhvc3RieWFkZHIsCisgICAgIE1FVEhfVkFSQVJHUywgZ2V0aG9zdGJ5YWRkcl9kb2N9LAorICAgIHsiZ2V0aG9zdG5hbWUiLCAgICAgICAgICAgICBzb2NrZXRfZ2V0aG9zdG5hbWUsCisgICAgIE1FVEhfTk9BUkdTLCAgZ2V0aG9zdG5hbWVfZG9jfSwKKyAgICB7ImdldHNlcnZieW5hbWUiLCAgICAgICAgICAgc29ja2V0X2dldHNlcnZieW5hbWUsCisgICAgIE1FVEhfVkFSQVJHUywgZ2V0c2VydmJ5bmFtZV9kb2N9LAorICAgIHsiZ2V0c2VydmJ5cG9ydCIsICAgICAgICAgICBzb2NrZXRfZ2V0c2VydmJ5cG9ydCwKKyAgICAgTUVUSF9WQVJBUkdTLCBnZXRzZXJ2Ynlwb3J0X2RvY30sCisgICAgeyJnZXRwcm90b2J5bmFtZSIsICAgICAgICAgIHNvY2tldF9nZXRwcm90b2J5bmFtZSwKKyAgICAgTUVUSF9WQVJBUkdTLCBnZXRwcm90b2J5bmFtZV9kb2N9LAogI2lmbmRlZiBOT19EVVAKLQl7ImZyb21mZCIsCQlzb2NrZXRfZnJvbWZkLAotCSBNRVRIX1ZBUkFSR1MsIGZyb21mZF9kb2N9LAorICAgIHsiZnJvbWZkIiwgICAgICAgICAgICAgICAgICBzb2NrZXRfZnJvbWZkLAorICAgICBNRVRIX1ZBUkFSR1MsIGZyb21mZF9kb2N9LAogI2VuZGlmCiAjaWZkZWYgSEFWRV9TT0NLRVRQQUlSCi0JeyJzb2NrZXRwYWlyIiwJCXNvY2tldF9zb2NrZXRwYWlyLAotCSBNRVRIX1ZBUkFSR1MsIHNvY2tldHBhaXJfZG9jfSwKKyAgICB7InNvY2tldHBhaXIiLCAgICAgICAgICAgICAgc29ja2V0X3NvY2tldHBhaXIsCisgICAgIE1FVEhfVkFSQVJHUywgc29ja2V0cGFpcl9kb2N9LAogI2VuZGlmCi0JeyJudG9ocyIsCQlzb2NrZXRfbnRvaHMsCi0JIE1FVEhfVkFSQVJHUywgbnRvaHNfZG9jfSwKLQl7Im50b2hsIiwJCXNvY2tldF9udG9obCwKLQkgTUVUSF9PLCBudG9obF9kb2N9LAotCXsiaHRvbnMiLAkJc29ja2V0X2h0b25zLAotCSBNRVRIX1ZBUkFSR1MsIGh0b25zX2RvY30sCi0JeyJodG9ubCIsCQlzb2NrZXRfaHRvbmwsCi0JIE1FVEhfTywgaHRvbmxfZG9jfSwKLQl7ImluZXRfYXRvbiIsCQlzb2NrZXRfaW5ldF9hdG9uLAotCSBNRVRIX1ZBUkFSR1MsIGluZXRfYXRvbl9kb2N9LAotCXsiaW5ldF9udG9hIiwJCXNvY2tldF9pbmV0X250b2EsCi0JIE1FVEhfVkFSQVJHUywgaW5ldF9udG9hX2RvY30sCisgICAgeyJudG9ocyIsICAgICAgICAgICAgICAgICAgIHNvY2tldF9udG9ocywKKyAgICAgTUVUSF9WQVJBUkdTLCBudG9oc19kb2N9LAorICAgIHsibnRvaGwiLCAgICAgICAgICAgICAgICAgICBzb2NrZXRfbnRvaGwsCisgICAgIE1FVEhfTywgbnRvaGxfZG9jfSwKKyAgICB7Imh0b25zIiwgICAgICAgICAgICAgICAgICAgc29ja2V0X2h0b25zLAorICAgICBNRVRIX1ZBUkFSR1MsIGh0b25zX2RvY30sCisgICAgeyJodG9ubCIsICAgICAgICAgICAgICAgICAgIHNvY2tldF9odG9ubCwKKyAgICAgTUVUSF9PLCBodG9ubF9kb2N9LAorICAgIHsiaW5ldF9hdG9uIiwgICAgICAgICAgICAgICBzb2NrZXRfaW5ldF9hdG9uLAorICAgICBNRVRIX1ZBUkFSR1MsIGluZXRfYXRvbl9kb2N9LAorICAgIHsiaW5ldF9udG9hIiwgICAgICAgICAgICAgICBzb2NrZXRfaW5ldF9udG9hLAorICAgICBNRVRIX1ZBUkFSR1MsIGluZXRfbnRvYV9kb2N9LAogI2lmZGVmIEhBVkVfSU5FVF9QVE9OCi0JeyJpbmV0X3B0b24iLAkJc29ja2V0X2luZXRfcHRvbiwKLQkgTUVUSF9WQVJBUkdTLCBpbmV0X3B0b25fZG9jfSwKLQl7ImluZXRfbnRvcCIsCQlzb2NrZXRfaW5ldF9udG9wLAotCSBNRVRIX1ZBUkFSR1MsIGluZXRfbnRvcF9kb2N9LAorICAgIHsiaW5ldF9wdG9uIiwgICAgICAgICAgICAgICBzb2NrZXRfaW5ldF9wdG9uLAorICAgICBNRVRIX1ZBUkFSR1MsIGluZXRfcHRvbl9kb2N9LAorICAgIHsiaW5ldF9udG9wIiwgICAgICAgICAgICAgICBzb2NrZXRfaW5ldF9udG9wLAorICAgICBNRVRIX1ZBUkFSR1MsIGluZXRfbnRvcF9kb2N9LAogI2VuZGlmCi0JeyJnZXRhZGRyaW5mbyIsCQlzb2NrZXRfZ2V0YWRkcmluZm8sCi0JIE1FVEhfVkFSQVJHUywgZ2V0YWRkcmluZm9fZG9jfSwKLQl7ImdldG5hbWVpbmZvIiwJCXNvY2tldF9nZXRuYW1laW5mbywKLQkgTUVUSF9WQVJBUkdTLCBnZXRuYW1laW5mb19kb2N9LAotCXsiZ2V0ZGVmYXVsdHRpbWVvdXQiLAkoUHlDRnVuY3Rpb24pc29ja2V0X2dldGRlZmF1bHR0aW1lb3V0LAotCSBNRVRIX05PQVJHUywgZ2V0ZGVmYXVsdHRpbWVvdXRfZG9jfSwKLQl7InNldGRlZmF1bHR0aW1lb3V0IiwJc29ja2V0X3NldGRlZmF1bHR0aW1lb3V0LAotCSBNRVRIX08sIHNldGRlZmF1bHR0aW1lb3V0X2RvY30sCi0Je05VTEwsCQkJTlVMTH0JCSAvKiBTZW50aW5lbCAqLworICAgIHsiZ2V0YWRkcmluZm8iLCAgICAgICAgICAgICBzb2NrZXRfZ2V0YWRkcmluZm8sCisgICAgIE1FVEhfVkFSQVJHUywgZ2V0YWRkcmluZm9fZG9jfSwKKyAgICB7ImdldG5hbWVpbmZvIiwgICAgICAgICAgICAgc29ja2V0X2dldG5hbWVpbmZvLAorICAgICBNRVRIX1ZBUkFSR1MsIGdldG5hbWVpbmZvX2RvY30sCisgICAgeyJnZXRkZWZhdWx0dGltZW91dCIsICAgICAgIChQeUNGdW5jdGlvbilzb2NrZXRfZ2V0ZGVmYXVsdHRpbWVvdXQsCisgICAgIE1FVEhfTk9BUkdTLCBnZXRkZWZhdWx0dGltZW91dF9kb2N9LAorICAgIHsic2V0ZGVmYXVsdHRpbWVvdXQiLCAgICAgICBzb2NrZXRfc2V0ZGVmYXVsdHRpbWVvdXQsCisgICAgIE1FVEhfTywgc2V0ZGVmYXVsdHRpbWVvdXRfZG9jfSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgICAvKiBTZW50aW5lbCAqLwogfTsKIAogCkBAIC00MjQ3LDEzICs0MjQ3LDEzIEBACiBzdGF0aWMgaW50CiBvc19pbml0KHZvaWQpCiB7Ci0JX2tlcm5lbF9zd2lfcmVncyByOworICAgIF9rZXJuZWxfc3dpX3JlZ3MgcjsKIAotCXIuclswXSA9IDA7Ci0JX2tlcm5lbF9zd2koMHg0MzM4MCwgJnIsICZyKTsKLQl0YXNrd2luZG93ID0gci5yWzBdOworICAgIHIuclswXSA9IDA7CisgICAgX2tlcm5lbF9zd2koMHg0MzM4MCwgJnIsICZyKTsKKyAgICB0YXNrd2luZG93ID0gci5yWzBdOwogCi0JcmV0dXJuIDE7CisgICAgcmV0dXJuIDE7CiB9CiAKICNlbmRpZiAvKiBSSVNDT1MgKi8KQEAgLTQyNjcsMzcgKzQyNjcsMzcgQEAKIHN0YXRpYyB2b2lkCiBvc19jbGVhbnVwKHZvaWQpCiB7Ci0JV1NBQ2xlYW51cCgpOworICAgIFdTQUNsZWFudXAoKTsKIH0KIAogc3RhdGljIGludAogb3NfaW5pdCh2b2lkKQogewotCVdTQURBVEEgV1NBRGF0YTsKLQlpbnQgcmV0OwotCWNoYXIgYnVmWzEwMF07Ci0JcmV0ID0gV1NBU3RhcnR1cCgweDAxMDEsICZXU0FEYXRhKTsKLQlzd2l0Y2ggKHJldCkgewotCWNhc2UgMDoJLyogTm8gZXJyb3IgKi8KLQkJUHlfQXRFeGl0KG9zX2NsZWFudXApOwotCQlyZXR1cm4gMTsgLyogU3VjY2VzcyAqLwotCWNhc2UgV1NBU1lTTk9UUkVBRFk6Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwKLQkJCQkiV1NBU3RhcnR1cCBmYWlsZWQ6IG5ldHdvcmsgbm90IHJlYWR5Iik7Ci0JCWJyZWFrOwotCWNhc2UgV1NBVkVSTk9UU1VQUE9SVEVEOgotCWNhc2UgV1NBRUlOVkFMOgotCQlQeUVycl9TZXRTdHJpbmcoCi0JCQlQeUV4Y19JbXBvcnRFcnJvciwKLQkJCSJXU0FTdGFydHVwIGZhaWxlZDogcmVxdWVzdGVkIHZlcnNpb24gbm90IHN1cHBvcnRlZCIpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlQeU9TX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksCi0JCQkgICAgICAiV1NBU3RhcnR1cCBmYWlsZWQ6IGVycm9yIGNvZGUgJWQiLCByZXQpOwotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW1wb3J0RXJyb3IsIGJ1Zik7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gMDsgLyogRmFpbHVyZSAqLworICAgIFdTQURBVEEgV1NBRGF0YTsKKyAgICBpbnQgcmV0OworICAgIGNoYXIgYnVmWzEwMF07CisgICAgcmV0ID0gV1NBU3RhcnR1cCgweDAxMDEsICZXU0FEYXRhKTsKKyAgICBzd2l0Y2ggKHJldCkgeworICAgIGNhc2UgMDogICAgIC8qIE5vIGVycm9yICovCisgICAgICAgIFB5X0F0RXhpdChvc19jbGVhbnVwKTsKKyAgICAgICAgcmV0dXJuIDE7IC8qIFN1Y2Nlc3MgKi8KKyAgICBjYXNlIFdTQVNZU05PVFJFQURZOgorICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW1wb3J0RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiV1NBU3RhcnR1cCBmYWlsZWQ6IG5ldHdvcmsgbm90IHJlYWR5Iik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgV1NBVkVSTk9UU1VQUE9SVEVEOgorICAgIGNhc2UgV1NBRUlOVkFMOgorICAgICAgICBQeUVycl9TZXRTdHJpbmcoCisgICAgICAgICAgICBQeUV4Y19JbXBvcnRFcnJvciwKKyAgICAgICAgICAgICJXU0FTdGFydHVwIGZhaWxlZDogcmVxdWVzdGVkIHZlcnNpb24gbm90IHN1cHBvcnRlZCIpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBQeU9TX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksCisgICAgICAgICAgICAgICAgICAgICAgIldTQVN0YXJ0dXAgZmFpbGVkOiBlcnJvciBjb2RlICVkIiwgcmV0KTsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0ltcG9ydEVycm9yLCBidWYpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIDA7IC8qIEZhaWx1cmUgKi8KIH0KIAogI2VuZGlmIC8qIE1TX1dJTkRPV1MgKi8KQEAgLTQzMTIsMjEgKzQzMTIsMjEgQEAKIG9zX2luaXQodm9pZCkKIHsKICNpZm5kZWYgUFlDQ19HQ0MKLQljaGFyIHJlYXNvbls2NF07Ci0JaW50IHJjID0gc29ja19pbml0KCk7CisgICAgY2hhciByZWFzb25bNjRdOworICAgIGludCByYyA9IHNvY2tfaW5pdCgpOwogCi0JaWYgKHJjID09IDApIHsKLQkJcmV0dXJuIDE7IC8qIFN1Y2Nlc3MgKi8KLQl9CisgICAgaWYgKHJjID09IDApIHsKKyAgICAgICAgcmV0dXJuIDE7IC8qIFN1Y2Nlc3MgKi8KKyAgICB9CiAKLQlQeU9TX3NucHJpbnRmKHJlYXNvbiwgc2l6ZW9mKHJlYXNvbiksCi0JCSAgICAgICJPUy8yIFRDUC9JUCBFcnJvciMgJWQiLCBzb2NrX2Vycm5vKCkpOwotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwgcmVhc29uKTsKKyAgICBQeU9TX3NucHJpbnRmKHJlYXNvbiwgc2l6ZW9mKHJlYXNvbiksCisgICAgICAgICAgICAgICAgICAiT1MvMiBUQ1AvSVAgRXJyb3IjICVkIiwgc29ja19lcnJubygpKTsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW1wb3J0RXJyb3IsIHJlYXNvbik7CiAKLQlyZXR1cm4gMDsgIC8qIEZhaWx1cmUgKi8KKyAgICByZXR1cm4gMDsgIC8qIEZhaWx1cmUgKi8KICNlbHNlCi0JLyogTm8gbmVlZCB0byBpbml0aWFsaXNlIHNvY2tldHMgd2l0aCBHQ0MvRU1YICovCi0JcmV0dXJuIDE7IC8qIFN1Y2Nlc3MgKi8KKyAgICAvKiBObyBuZWVkIHRvIGluaXRpYWxpc2Ugc29ja2V0cyB3aXRoIEdDQy9FTVggKi8KKyAgICByZXR1cm4gMTsgLyogU3VjY2VzcyAqLwogI2VuZGlmCiB9CiAKQEAgLTQzMzcsNyArNDMzNyw3IEBACiBzdGF0aWMgaW50CiBvc19pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIDE7IC8qIFN1Y2Nlc3MgKi8KKyAgICByZXR1cm4gMTsgLyogU3VjY2VzcyAqLwogfQogI2VuZGlmCiAKQEAgLTQzNDcsOCArNDM0Nyw4IEBACiBzdGF0aWMKIFB5U29ja2V0TW9kdWxlX0FQSU9iamVjdCBQeVNvY2tldE1vZHVsZUFQSSA9CiB7Ci0JJnNvY2tfdHlwZSwKLSAgICAgICAgTlVMTAorICAgICZzb2NrX3R5cGUsCisgICAgTlVMTAogfTsKIAogCkBAIC00MzczLDkxMSArNDM3Myw5MTEgQEAKIFB5TU9ESU5JVF9GVU5DCiBpbml0X3NvY2tldCh2b2lkKQogewotCVB5T2JqZWN0ICptLCAqaGFzX2lwdjY7CisgICAgUHlPYmplY3QgKm0sICpoYXNfaXB2NjsKIAotCWlmICghb3NfaW5pdCgpKQotCQlyZXR1cm47CisgICAgaWYgKCFvc19pbml0KCkpCisgICAgICAgIHJldHVybjsKIAotCVB5X1RZUEUoJnNvY2tfdHlwZSkgPSAmUHlUeXBlX1R5cGU7Ci0JbSA9IFB5X0luaXRNb2R1bGUzKFB5U29ja2V0X01PRFVMRV9OQU1FLAotCQkJICAgc29ja2V0X21ldGhvZHMsCi0JCQkgICBzb2NrZXRfZG9jKTsKLQlpZiAobSA9PSBOVUxMKQotCQlyZXR1cm47CisgICAgUHlfVFlQRSgmc29ja190eXBlKSA9ICZQeVR5cGVfVHlwZTsKKyAgICBtID0gUHlfSW5pdE1vZHVsZTMoUHlTb2NrZXRfTU9EVUxFX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgIHNvY2tldF9tZXRob2RzLAorICAgICAgICAgICAgICAgICAgICAgICBzb2NrZXRfZG9jKTsKKyAgICBpZiAobSA9PSBOVUxMKQorICAgICAgICByZXR1cm47CiAKLQlzb2NrZXRfZXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oInNvY2tldC5lcnJvciIsCi0JCQkJCSAgUHlFeGNfSU9FcnJvciwgTlVMTCk7Ci0JaWYgKHNvY2tldF9lcnJvciA9PSBOVUxMKQotCQlyZXR1cm47Ci0gICAgICAgIFB5U29ja2V0TW9kdWxlQVBJLmVycm9yID0gc29ja2V0X2Vycm9yOwotCVB5X0lOQ1JFRihzb2NrZXRfZXJyb3IpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiZXJyb3IiLCBzb2NrZXRfZXJyb3IpOwotCXNvY2tldF9oZXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oInNvY2tldC5oZXJyb3IiLAotCQkJCQkgICBzb2NrZXRfZXJyb3IsIE5VTEwpOwotCWlmIChzb2NrZXRfaGVycm9yID09IE5VTEwpCi0JCXJldHVybjsKLQlQeV9JTkNSRUYoc29ja2V0X2hlcnJvcik7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJoZXJyb3IiLCBzb2NrZXRfaGVycm9yKTsKLQlzb2NrZXRfZ2FpZXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oInNvY2tldC5nYWllcnJvciIsIHNvY2tldF9lcnJvciwKLQkgICAgTlVMTCk7Ci0JaWYgKHNvY2tldF9nYWllcnJvciA9PSBOVUxMKQotCQlyZXR1cm47Ci0JUHlfSU5DUkVGKHNvY2tldF9nYWllcnJvcik7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJnYWllcnJvciIsIHNvY2tldF9nYWllcnJvcik7Ci0Jc29ja2V0X3RpbWVvdXQgPSBQeUVycl9OZXdFeGNlcHRpb24oInNvY2tldC50aW1lb3V0IiwKLQkJCQkJICAgIHNvY2tldF9lcnJvciwgTlVMTCk7Ci0JaWYgKHNvY2tldF90aW1lb3V0ID09IE5VTEwpCi0JCXJldHVybjsKLQlQeV9JTkNSRUYoc29ja2V0X3RpbWVvdXQpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAidGltZW91dCIsIHNvY2tldF90aW1lb3V0KTsKLQlQeV9JTkNSRUYoKFB5T2JqZWN0ICopJnNvY2tfdHlwZSk7Ci0JaWYgKFB5TW9kdWxlX0FkZE9iamVjdChtLCAiU29ja2V0VHlwZSIsCi0JCQkgICAgICAgKFB5T2JqZWN0ICopJnNvY2tfdHlwZSkgIT0gMCkKLQkJcmV0dXJuOwotCVB5X0lOQ1JFRigoUHlPYmplY3QgKikmc29ja190eXBlKTsKLQlpZiAoUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJzb2NrZXQiLAotCQkJICAgICAgIChQeU9iamVjdCAqKSZzb2NrX3R5cGUpICE9IDApCi0JCXJldHVybjsKKyAgICBzb2NrZXRfZXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oInNvY2tldC5lcnJvciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXhjX0lPRXJyb3IsIE5VTEwpOworICAgIGlmIChzb2NrZXRfZXJyb3IgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5U29ja2V0TW9kdWxlQVBJLmVycm9yID0gc29ja2V0X2Vycm9yOworICAgIFB5X0lOQ1JFRihzb2NrZXRfZXJyb3IpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiZXJyb3IiLCBzb2NrZXRfZXJyb3IpOworICAgIHNvY2tldF9oZXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oInNvY2tldC5oZXJyb3IiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0X2Vycm9yLCBOVUxMKTsKKyAgICBpZiAoc29ja2V0X2hlcnJvciA9PSBOVUxMKQorICAgICAgICByZXR1cm47CisgICAgUHlfSU5DUkVGKHNvY2tldF9oZXJyb3IpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiaGVycm9yIiwgc29ja2V0X2hlcnJvcik7CisgICAgc29ja2V0X2dhaWVycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJzb2NrZXQuZ2FpZXJyb3IiLCBzb2NrZXRfZXJyb3IsCisgICAgICAgIE5VTEwpOworICAgIGlmIChzb2NrZXRfZ2FpZXJyb3IgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0lOQ1JFRihzb2NrZXRfZ2FpZXJyb3IpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiZ2FpZXJyb3IiLCBzb2NrZXRfZ2FpZXJyb3IpOworICAgIHNvY2tldF90aW1lb3V0ID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJzb2NrZXQudGltZW91dCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0X2Vycm9yLCBOVUxMKTsKKyAgICBpZiAoc29ja2V0X3RpbWVvdXQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0lOQ1JFRihzb2NrZXRfdGltZW91dCk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJ0aW1lb3V0Iiwgc29ja2V0X3RpbWVvdXQpOworICAgIFB5X0lOQ1JFRigoUHlPYmplY3QgKikmc29ja190eXBlKTsKKyAgICBpZiAoUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJTb2NrZXRUeXBlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChQeU9iamVjdCAqKSZzb2NrX3R5cGUpICE9IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9JTkNSRUYoKFB5T2JqZWN0ICopJnNvY2tfdHlwZSk7CisgICAgaWYgKFB5TW9kdWxlX0FkZE9iamVjdChtLCAic29ja2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChQeU9iamVjdCAqKSZzb2NrX3R5cGUpICE9IDApCisgICAgICAgIHJldHVybjsKIAogI2lmZGVmIEVOQUJMRV9JUFY2Ci0JaGFzX2lwdjYgPSBQeV9UcnVlOworICAgIGhhc19pcHY2ID0gUHlfVHJ1ZTsKICNlbHNlCi0JaGFzX2lwdjYgPSBQeV9GYWxzZTsKKyAgICBoYXNfaXB2NiA9IFB5X0ZhbHNlOwogI2VuZGlmCi0JUHlfSU5DUkVGKGhhc19pcHY2KTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgImhhc19pcHY2IiwgaGFzX2lwdjYpOworICAgIFB5X0lOQ1JFRihoYXNfaXB2Nik7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJoYXNfaXB2NiIsIGhhc19pcHY2KTsKIAotCS8qIEV4cG9ydCBDIEFQSSAqLwotCWlmIChQeU1vZHVsZV9BZGRPYmplY3QobSwgUHlTb2NrZXRfQ0FQSV9OQU1FLAotCSAgICAgICBQeUNPYmplY3RfRnJvbVZvaWRQdHIoKHZvaWQgKikmUHlTb2NrZXRNb2R1bGVBUEksIE5VTEwpCi0JCQkJICkgIT0gMCkKLQkJcmV0dXJuOworICAgIC8qIEV4cG9ydCBDIEFQSSAqLworICAgIGlmIChQeU1vZHVsZV9BZGRPYmplY3QobSwgUHlTb2NrZXRfQ0FQSV9OQU1FLAorICAgICAgICAgICBQeUNPYmplY3RfRnJvbVZvaWRQdHIoKHZvaWQgKikmUHlTb2NrZXRNb2R1bGVBUEksIE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgIT0gMCkKKyAgICAgICAgcmV0dXJuOwogCi0JLyogQWRkcmVzcyBmYW1pbGllcyAod2Ugb25seSBzdXBwb3J0IEFGX0lORVQgYW5kIEFGX1VOSVgpICovCisgICAgLyogQWRkcmVzcyBmYW1pbGllcyAod2Ugb25seSBzdXBwb3J0IEFGX0lORVQgYW5kIEFGX1VOSVgpICovCiAjaWZkZWYgQUZfVU5TUEVDCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFGX1VOU1BFQyIsIEFGX1VOU1BFQyk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFGX1VOU1BFQyIsIEFGX1VOU1BFQyk7CiAjZW5kaWYKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUZfSU5FVCIsIEFGX0lORVQpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBRl9JTkVUIiwgQUZfSU5FVCk7CiAjaWZkZWYgQUZfSU5FVDYKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUZfSU5FVDYiLCBBRl9JTkVUNik7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFGX0lORVQ2IiwgQUZfSU5FVDYpOwogI2VuZGlmIC8qIEFGX0lORVQ2ICovCiAjaWYgZGVmaW5lZChBRl9VTklYKQotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBRl9VTklYIiwgQUZfVU5JWCk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFGX1VOSVgiLCBBRl9VTklYKTsKICNlbmRpZiAvKiBBRl9VTklYICovCiAjaWZkZWYgQUZfQVgyNQotCS8qIEFtYXRldXIgUmFkaW8gQVguMjUgKi8KLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUZfQVgyNSIsIEFGX0FYMjUpOworICAgIC8qIEFtYXRldXIgUmFkaW8gQVguMjUgKi8KKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUZfQVgyNSIsIEFGX0FYMjUpOwogI2VuZGlmCiAjaWZkZWYgQUZfSVBYCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFGX0lQWCIsIEFGX0lQWCk7IC8qIE5vdmVsbCBJUFggKi8KKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUZfSVBYIiwgQUZfSVBYKTsgLyogTm92ZWxsIElQWCAqLwogI2VuZGlmCiAjaWZkZWYgQUZfQVBQTEVUQUxLCi0JLyogQXBwbGV0YWxrIEREUCAqLwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBRl9BUFBMRVRBTEsiLCBBRl9BUFBMRVRBTEspOworICAgIC8qIEFwcGxldGFsayBERFAgKi8KKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUZfQVBQTEVUQUxLIiwgQUZfQVBQTEVUQUxLKTsKICNlbmRpZgogI2lmZGVmIEFGX05FVFJPTQotCS8qIEFtYXRldXIgcmFkaW8gTmV0Uk9NICovCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFGX05FVFJPTSIsIEFGX05FVFJPTSk7CisgICAgLyogQW1hdGV1ciByYWRpbyBOZXRST00gKi8KKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUZfTkVUUk9NIiwgQUZfTkVUUk9NKTsKICNlbmRpZgogI2lmZGVmIEFGX0JSSURHRQotCS8qIE11bHRpcHJvdG9jb2wgYnJpZGdlICovCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFGX0JSSURHRSIsIEFGX0JSSURHRSk7CisgICAgLyogTXVsdGlwcm90b2NvbCBicmlkZ2UgKi8KKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUZfQlJJREdFIiwgQUZfQlJJREdFKTsKICNlbmRpZgogI2lmZGVmIEFGX0FUTVBWQwotCS8qIEFUTSBQVkNzICovCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFGX0FUTVBWQyIsIEFGX0FUTVBWQyk7CisgICAgLyogQVRNIFBWQ3MgKi8KKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUZfQVRNUFZDIiwgQUZfQVRNUFZDKTsKICNlbmRpZgogI2lmZGVmIEFGX0FBTDUKLQkvKiBSZXNlcnZlZCBmb3IgV2VybmVyJ3MgQVRNICovCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFGX0FBTDUiLCBBRl9BQUw1KTsKKyAgICAvKiBSZXNlcnZlZCBmb3IgV2VybmVyJ3MgQVRNICovCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFGX0FBTDUiLCBBRl9BQUw1KTsKICNlbmRpZgogI2lmZGVmIEFGX1gyNQotCS8qIFJlc2VydmVkIGZvciBYLjI1IHByb2plY3QgKi8KLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUZfWDI1IiwgQUZfWDI1KTsKKyAgICAvKiBSZXNlcnZlZCBmb3IgWC4yNSBwcm9qZWN0ICovCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFGX1gyNSIsIEFGX1gyNSk7CiAjZW5kaWYKICNpZmRlZiBBRl9JTkVUNgotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBRl9JTkVUNiIsIEFGX0lORVQ2KTsgLyogSVAgdmVyc2lvbiA2ICovCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFGX0lORVQ2IiwgQUZfSU5FVDYpOyAvKiBJUCB2ZXJzaW9uIDYgKi8KICNlbmRpZgogI2lmZGVmIEFGX1JPU0UKLQkvKiBBbWF0ZXVyIFJhZGlvIFguMjUgUExQICovCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFGX1JPU0UiLCBBRl9ST1NFKTsKKyAgICAvKiBBbWF0ZXVyIFJhZGlvIFguMjUgUExQICovCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFGX1JPU0UiLCBBRl9ST1NFKTsKICNlbmRpZgogI2lmZGVmIEFGX0RFQ25ldAotCS8qIFJlc2VydmVkIGZvciBERUNuZXQgcHJvamVjdCAqLwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBRl9ERUNuZXQiLCBBRl9ERUNuZXQpOworICAgIC8qIFJlc2VydmVkIGZvciBERUNuZXQgcHJvamVjdCAqLworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBRl9ERUNuZXQiLCBBRl9ERUNuZXQpOwogI2VuZGlmCiAjaWZkZWYgQUZfTkVUQkVVSQotCS8qIFJlc2VydmVkIGZvciA4MDIuMkxMQyBwcm9qZWN0ICovCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFGX05FVEJFVUkiLCBBRl9ORVRCRVVJKTsKKyAgICAvKiBSZXNlcnZlZCBmb3IgODAyLjJMTEMgcHJvamVjdCAqLworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBRl9ORVRCRVVJIiwgQUZfTkVUQkVVSSk7CiAjZW5kaWYKICNpZmRlZiBBRl9TRUNVUklUWQotCS8qIFNlY3VyaXR5IGNhbGxiYWNrIHBzZXVkbyBBRiAqLwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBRl9TRUNVUklUWSIsIEFGX1NFQ1VSSVRZKTsKKyAgICAvKiBTZWN1cml0eSBjYWxsYmFjayBwc2V1ZG8gQUYgKi8KKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUZfU0VDVVJJVFkiLCBBRl9TRUNVUklUWSk7CiAjZW5kaWYKICNpZmRlZiBBRl9LRVkKLQkvKiBQRl9LRVkga2V5IG1hbmFnZW1lbnQgQVBJICovCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFGX0tFWSIsIEFGX0tFWSk7CisgICAgLyogUEZfS0VZIGtleSBtYW5hZ2VtZW50IEFQSSAqLworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBRl9LRVkiLCBBRl9LRVkpOwogI2VuZGlmCiAjaWZkZWYgQUZfTkVUTElOSwotCS8qICAqLwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBRl9ORVRMSU5LIiwgQUZfTkVUTElOSyk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk5FVExJTktfUk9VVEUiLCBORVRMSU5LX1JPVVRFKTsKKyAgICAvKiAgKi8KKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUZfTkVUTElOSyIsIEFGX05FVExJTkspOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJORVRMSU5LX1JPVVRFIiwgTkVUTElOS19ST1VURSk7CiAjaWZkZWYgTkVUTElOS19TS0lQCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk5FVExJTktfU0tJUCIsIE5FVExJTktfU0tJUCk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk5FVExJTktfU0tJUCIsIE5FVExJTktfU0tJUCk7CiAjZW5kaWYKICNpZmRlZiBORVRMSU5LX1cxCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk5FVExJTktfVzEiLCBORVRMSU5LX1cxKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTkVUTElOS19XMSIsIE5FVExJTktfVzEpOwogI2VuZGlmCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk5FVExJTktfVVNFUlNPQ0siLCBORVRMSU5LX1VTRVJTT0NLKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTkVUTElOS19GSVJFV0FMTCIsIE5FVExJTktfRklSRVdBTEwpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJORVRMSU5LX1VTRVJTT0NLIiwgTkVUTElOS19VU0VSU09DSyk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk5FVExJTktfRklSRVdBTEwiLCBORVRMSU5LX0ZJUkVXQUxMKTsKICNpZmRlZiBORVRMSU5LX1RDUERJQUcKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTkVUTElOS19UQ1BESUFHIiwgTkVUTElOS19UQ1BESUFHKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTkVUTElOS19UQ1BESUFHIiwgTkVUTElOS19UQ1BESUFHKTsKICNlbmRpZgogI2lmZGVmIE5FVExJTktfTkZMT0cKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTkVUTElOS19ORkxPRyIsIE5FVExJTktfTkZMT0cpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJORVRMSU5LX05GTE9HIiwgTkVUTElOS19ORkxPRyk7CiAjZW5kaWYKICNpZmRlZiBORVRMSU5LX1hGUk0KLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTkVUTElOS19YRlJNIiwgTkVUTElOS19YRlJNKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTkVUTElOS19YRlJNIiwgTkVUTElOS19YRlJNKTsKICNlbmRpZgogI2lmZGVmIE5FVExJTktfQVJQRAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJORVRMSU5LX0FSUEQiLCBORVRMSU5LX0FSUEQpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJORVRMSU5LX0FSUEQiLCBORVRMSU5LX0FSUEQpOwogI2VuZGlmCiAjaWZkZWYgTkVUTElOS19ST1VURTYKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTkVUTElOS19ST1VURTYiLCBORVRMSU5LX1JPVVRFNik7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk5FVExJTktfUk9VVEU2IiwgTkVUTElOS19ST1VURTYpOwogI2VuZGlmCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk5FVExJTktfSVA2X0ZXIiwgTkVUTElOS19JUDZfRlcpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJORVRMSU5LX0lQNl9GVyIsIE5FVExJTktfSVA2X0ZXKTsKICNpZmRlZiBORVRMSU5LX0ROUlRNU0cKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTkVUTElOS19ETlJUTVNHIiwgTkVUTElOS19ETlJUTVNHKTsKLSNlbmRpZiAKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTkVUTElOS19ETlJUTVNHIiwgTkVUTElOS19ETlJUTVNHKTsKKyNlbmRpZgogI2lmZGVmIE5FVExJTktfVEFQQkFTRQotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJORVRMSU5LX1RBUEJBU0UiLCBORVRMSU5LX1RBUEJBU0UpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJORVRMSU5LX1RBUEJBU0UiLCBORVRMSU5LX1RBUEJBU0UpOwogI2VuZGlmCiAjZW5kaWYgLyogQUZfTkVUTElOSyAqLwogI2lmZGVmIEFGX1JPVVRFCi0JLyogQWxpYXMgdG8gZW11bGF0ZSA0LjRCU0QgKi8KLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUZfUk9VVEUiLCBBRl9ST1VURSk7CisgICAgLyogQWxpYXMgdG8gZW11bGF0ZSA0LjRCU0QgKi8KKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUZfUk9VVEUiLCBBRl9ST1VURSk7CiAjZW5kaWYKICNpZmRlZiBBRl9BU0gKLQkvKiBBc2ggKi8KLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUZfQVNIIiwgQUZfQVNIKTsKKyAgICAvKiBBc2ggKi8KKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUZfQVNIIiwgQUZfQVNIKTsKICNlbmRpZgogI2lmZGVmIEFGX0VDT05FVAotCS8qIEFjb3JuIEVjb25ldCAqLwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBRl9FQ09ORVQiLCBBRl9FQ09ORVQpOworICAgIC8qIEFjb3JuIEVjb25ldCAqLworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBRl9FQ09ORVQiLCBBRl9FQ09ORVQpOwogI2VuZGlmCiAjaWZkZWYgQUZfQVRNU1ZDCi0JLyogQVRNIFNWQ3MgKi8KLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUZfQVRNU1ZDIiwgQUZfQVRNU1ZDKTsKKyAgICAvKiBBVE0gU1ZDcyAqLworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBRl9BVE1TVkMiLCBBRl9BVE1TVkMpOwogI2VuZGlmCiAjaWZkZWYgQUZfU05BCi0JLyogTGludXggU05BIFByb2plY3QgKG51dHRlcnMhKSAqLwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBRl9TTkEiLCBBRl9TTkEpOworICAgIC8qIExpbnV4IFNOQSBQcm9qZWN0IChudXR0ZXJzISkgKi8KKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUZfU05BIiwgQUZfU05BKTsKICNlbmRpZgogI2lmZGVmIEFGX0lSREEKLQkvKiBJUkRBIHNvY2tldHMgKi8KLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUZfSVJEQSIsIEFGX0lSREEpOworICAgIC8qIElSREEgc29ja2V0cyAqLworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBRl9JUkRBIiwgQUZfSVJEQSk7CiAjZW5kaWYKICNpZmRlZiBBRl9QUFBPWAotCS8qIFBQUG9YIHNvY2tldHMgKi8KLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUZfUFBQT1giLCBBRl9QUFBPWCk7CisgICAgLyogUFBQb1ggc29ja2V0cyAqLworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBRl9QUFBPWCIsIEFGX1BQUE9YKTsKICNlbmRpZgogI2lmZGVmIEFGX1dBTlBJUEUKLQkvKiBXYW5waXBlIEFQSSBTb2NrZXRzICovCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFGX1dBTlBJUEUiLCBBRl9XQU5QSVBFKTsKKyAgICAvKiBXYW5waXBlIEFQSSBTb2NrZXRzICovCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFGX1dBTlBJUEUiLCBBRl9XQU5QSVBFKTsKICNlbmRpZgogI2lmZGVmIEFGX0xMQwotCS8qIExpbnV4IExMQyAqLwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBRl9MTEMiLCBBRl9MTEMpOworICAgIC8qIExpbnV4IExMQyAqLworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBRl9MTEMiLCBBRl9MTEMpOwogI2VuZGlmCiAKICNpZmRlZiBVU0VfQkxVRVRPT1RICi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFGX0JMVUVUT09USCIsIEFGX0JMVUVUT09USCk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkJUUFJPVE9fTDJDQVAiLCBCVFBST1RPX0wyQ0FQKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQlRQUk9UT19IQ0kiLCBCVFBST1RPX0hDSSk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNPTF9IQ0kiLCBTT0xfSENJKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSENJX0ZJTFRFUiIsIEhDSV9GSUxURVIpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBRl9CTFVFVE9PVEgiLCBBRl9CTFVFVE9PVEgpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJCVFBST1RPX0wyQ0FQIiwgQlRQUk9UT19MMkNBUCk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkJUUFJPVE9fSENJIiwgQlRQUk9UT19IQ0kpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTT0xfSENJIiwgU09MX0hDSSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkhDSV9GSUxURVIiLCBIQ0lfRklMVEVSKTsKICNpZiAhZGVmaW5lZChfX0ZyZWVCU0RfXykKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSENJX1RJTUVfU1RBTVAiLCBIQ0lfVElNRV9TVEFNUCk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkhDSV9EQVRBX0RJUiIsIEhDSV9EQVRBX0RJUik7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkJUUFJPVE9fU0NPIiwgQlRQUk9UT19TQ08pOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJIQ0lfVElNRV9TVEFNUCIsIEhDSV9USU1FX1NUQU1QKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSENJX0RBVEFfRElSIiwgSENJX0RBVEFfRElSKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQlRQUk9UT19TQ08iLCBCVFBST1RPX1NDTyk7CiAjZW5kaWYKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQlRQUk9UT19SRkNPTU0iLCBCVFBST1RPX1JGQ09NTSk7Ci0JUHlNb2R1bGVfQWRkU3RyaW5nQ29uc3RhbnQobSwgIkJEQUREUl9BTlkiLCAiMDA6MDA6MDA6MDA6MDA6MDAiKTsKLQlQeU1vZHVsZV9BZGRTdHJpbmdDb25zdGFudChtLCAiQkRBRERSX0xPQ0FMIiwgIjAwOjAwOjAwOkZGOkZGOkZGIik7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkJUUFJPVE9fUkZDT01NIiwgQlRQUk9UT19SRkNPTU0pOworICAgIFB5TW9kdWxlX0FkZFN0cmluZ0NvbnN0YW50KG0sICJCREFERFJfQU5ZIiwgIjAwOjAwOjAwOjAwOjAwOjAwIik7CisgICAgUHlNb2R1bGVfQWRkU3RyaW5nQ29uc3RhbnQobSwgIkJEQUREUl9MT0NBTCIsICIwMDowMDowMDpGRjpGRjpGRiIpOwogI2VuZGlmCiAKICNpZmRlZiBIQVZFX05FVFBBQ0tFVF9QQUNLRVRfSAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBRl9QQUNLRVQiLCBBRl9QQUNLRVQpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJQRl9QQUNLRVQiLCBQRl9QQUNLRVQpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJQQUNLRVRfSE9TVCIsIFBBQ0tFVF9IT1NUKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUEFDS0VUX0JST0FEQ0FTVCIsIFBBQ0tFVF9CUk9BRENBU1QpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJQQUNLRVRfTVVMVElDQVNUIiwgUEFDS0VUX01VTFRJQ0FTVCk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlBBQ0tFVF9PVEhFUkhPU1QiLCBQQUNLRVRfT1RIRVJIT1NUKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUEFDS0VUX09VVEdPSU5HIiwgUEFDS0VUX09VVEdPSU5HKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUEFDS0VUX0xPT1BCQUNLIiwgUEFDS0VUX0xPT1BCQUNLKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUEFDS0VUX0ZBU1RST1VURSIsIFBBQ0tFVF9GQVNUUk9VVEUpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBRl9QQUNLRVQiLCBBRl9QQUNLRVQpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJQRl9QQUNLRVQiLCBQRl9QQUNLRVQpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJQQUNLRVRfSE9TVCIsIFBBQ0tFVF9IT1NUKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUEFDS0VUX0JST0FEQ0FTVCIsIFBBQ0tFVF9CUk9BRENBU1QpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJQQUNLRVRfTVVMVElDQVNUIiwgUEFDS0VUX01VTFRJQ0FTVCk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlBBQ0tFVF9PVEhFUkhPU1QiLCBQQUNLRVRfT1RIRVJIT1NUKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUEFDS0VUX09VVEdPSU5HIiwgUEFDS0VUX09VVEdPSU5HKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUEFDS0VUX0xPT1BCQUNLIiwgUEFDS0VUX0xPT1BCQUNLKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUEFDS0VUX0ZBU1RST1VURSIsIFBBQ0tFVF9GQVNUUk9VVEUpOwogI2VuZGlmCiAKICNpZmRlZiBIQVZFX0xJTlVYX1RJUENfSAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBRl9USVBDIiwgQUZfVElQQyk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFGX1RJUEMiLCBBRl9USVBDKTsKIAotCS8qIGZvciBhZGRyZXNzZXMgKi8KLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiVElQQ19BRERSX05BTUVTRVEiLCBUSVBDX0FERFJfTkFNRVNFUSk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlRJUENfQUREUl9OQU1FIiwgVElQQ19BRERSX05BTUUpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJUSVBDX0FERFJfSUQiLCBUSVBDX0FERFJfSUQpOworICAgIC8qIGZvciBhZGRyZXNzZXMgKi8KKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiVElQQ19BRERSX05BTUVTRVEiLCBUSVBDX0FERFJfTkFNRVNFUSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlRJUENfQUREUl9OQU1FIiwgVElQQ19BRERSX05BTUUpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJUSVBDX0FERFJfSUQiLCBUSVBDX0FERFJfSUQpOwogCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlRJUENfWk9ORV9TQ09QRSIsIFRJUENfWk9ORV9TQ09QRSk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlRJUENfQ0xVU1RFUl9TQ09QRSIsIFRJUENfQ0xVU1RFUl9TQ09QRSk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlRJUENfTk9ERV9TQ09QRSIsIFRJUENfTk9ERV9TQ09QRSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlRJUENfWk9ORV9TQ09QRSIsIFRJUENfWk9ORV9TQ09QRSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlRJUENfQ0xVU1RFUl9TQ09QRSIsIFRJUENfQ0xVU1RFUl9TQ09QRSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlRJUENfTk9ERV9TQ09QRSIsIFRJUENfTk9ERV9TQ09QRSk7CiAKLQkvKiBmb3Igc2V0c29ja29wdCgpICovCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNPTF9USVBDIiwgU09MX1RJUEMpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJUSVBDX0lNUE9SVEFOQ0UiLCBUSVBDX0lNUE9SVEFOQ0UpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJUSVBDX1NSQ19EUk9QUEFCTEUiLCBUSVBDX1NSQ19EUk9QUEFCTEUpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJUSVBDX0RFU1RfRFJPUFBBQkxFIiwKLQkJCVRJUENfREVTVF9EUk9QUEFCTEUpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJUSVBDX0NPTk5fVElNRU9VVCIsIFRJUENfQ09OTl9USU1FT1VUKTsKKyAgICAvKiBmb3Igc2V0c29ja29wdCgpICovCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNPTF9USVBDIiwgU09MX1RJUEMpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJUSVBDX0lNUE9SVEFOQ0UiLCBUSVBDX0lNUE9SVEFOQ0UpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJUSVBDX1NSQ19EUk9QUEFCTEUiLCBUSVBDX1NSQ19EUk9QUEFCTEUpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJUSVBDX0RFU1RfRFJPUFBBQkxFIiwKKyAgICAgICAgICAgICAgICAgICAgVElQQ19ERVNUX0RST1BQQUJMRSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlRJUENfQ09OTl9USU1FT1VUIiwgVElQQ19DT05OX1RJTUVPVVQpOwogCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlRJUENfTE9XX0lNUE9SVEFOQ0UiLAotCQkJVElQQ19MT1dfSU1QT1JUQU5DRSk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlRJUENfTUVESVVNX0lNUE9SVEFOQ0UiLAotCQkJVElQQ19NRURJVU1fSU1QT1JUQU5DRSk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlRJUENfSElHSF9JTVBPUlRBTkNFIiwKLQkJCVRJUENfSElHSF9JTVBPUlRBTkNFKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiVElQQ19DUklUSUNBTF9JTVBPUlRBTkNFIiwKLQkJCVRJUENfQ1JJVElDQUxfSU1QT1JUQU5DRSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlRJUENfTE9XX0lNUE9SVEFOQ0UiLAorICAgICAgICAgICAgICAgICAgICBUSVBDX0xPV19JTVBPUlRBTkNFKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiVElQQ19NRURJVU1fSU1QT1JUQU5DRSIsCisgICAgICAgICAgICAgICAgICAgIFRJUENfTUVESVVNX0lNUE9SVEFOQ0UpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJUSVBDX0hJR0hfSU1QT1JUQU5DRSIsCisgICAgICAgICAgICAgICAgICAgIFRJUENfSElHSF9JTVBPUlRBTkNFKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiVElQQ19DUklUSUNBTF9JTVBPUlRBTkNFIiwKKyAgICAgICAgICAgICAgICAgICAgVElQQ19DUklUSUNBTF9JTVBPUlRBTkNFKTsKIAotCS8qIGZvciBzdWJzY3JpcHRpb25zICovCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlRJUENfU1VCX1BPUlRTIiwgVElQQ19TVUJfUE9SVFMpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJUSVBDX1NVQl9TRVJWSUNFIiwgVElQQ19TVUJfU0VSVklDRSk7CisgICAgLyogZm9yIHN1YnNjcmlwdGlvbnMgKi8KKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiVElQQ19TVUJfUE9SVFMiLCBUSVBDX1NVQl9QT1JUUyk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlRJUENfU1VCX1NFUlZJQ0UiLCBUSVBDX1NVQl9TRVJWSUNFKTsKICNpZmRlZiBUSVBDX1NVQl9DQU5DRUwKLQkvKiBkb2Vzbid0IHNlZW0gdG8gYmUgYXZhaWxhYmxlIGV2ZXJ5d2hlcmUgKi8KLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiVElQQ19TVUJfQ0FOQ0VMIiwgVElQQ19TVUJfQ0FOQ0VMKTsKKyAgICAvKiBkb2Vzbid0IHNlZW0gdG8gYmUgYXZhaWxhYmxlIGV2ZXJ5d2hlcmUgKi8KKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiVElQQ19TVUJfQ0FOQ0VMIiwgVElQQ19TVUJfQ0FOQ0VMKTsKICNlbmRpZgotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJUSVBDX1dBSVRfRk9SRVZFUiIsIFRJUENfV0FJVF9GT1JFVkVSKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiVElQQ19QVUJMSVNIRUQiLCBUSVBDX1BVQkxJU0hFRCk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlRJUENfV0lUSERSQVdOIiwgVElQQ19XSVRIRFJBV04pOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJUSVBDX1NVQlNDUl9USU1FT1VUIiwgVElQQ19TVUJTQ1JfVElNRU9VVCk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlRJUENfQ0ZHX1NSViIsIFRJUENfQ0ZHX1NSVik7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlRJUENfVE9QX1NSViIsIFRJUENfVE9QX1NSVik7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlRJUENfV0FJVF9GT1JFVkVSIiwgVElQQ19XQUlUX0ZPUkVWRVIpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJUSVBDX1BVQkxJU0hFRCIsIFRJUENfUFVCTElTSEVEKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiVElQQ19XSVRIRFJBV04iLCBUSVBDX1dJVEhEUkFXTik7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlRJUENfU1VCU0NSX1RJTUVPVVQiLCBUSVBDX1NVQlNDUl9USU1FT1VUKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiVElQQ19DRkdfU1JWIiwgVElQQ19DRkdfU1JWKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiVElQQ19UT1BfU1JWIiwgVElQQ19UT1BfU1JWKTsKICNlbmRpZgogCi0JLyogU29ja2V0IHR5cGVzICovCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNPQ0tfU1RSRUFNIiwgU09DS19TVFJFQU0pOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTT0NLX0RHUkFNIiwgU09DS19ER1JBTSk7CisgICAgLyogU29ja2V0IHR5cGVzICovCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNPQ0tfU1RSRUFNIiwgU09DS19TVFJFQU0pOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTT0NLX0RHUkFNIiwgU09DS19ER1JBTSk7CiAjaWZuZGVmIF9fQkVPU19fCiAvKiBXZSBoYXZlIGluY29tcGxldGUgc29ja2V0IHN1cHBvcnQuICovCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNPQ0tfUkFXIiwgU09DS19SQVcpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTT0NLX1NFUVBBQ0tFVCIsIFNPQ0tfU0VRUEFDS0VUKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09DS19SQVciLCBTT0NLX1JBVyk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNPQ0tfU0VRUEFDS0VUIiwgU09DS19TRVFQQUNLRVQpOwogI2lmIGRlZmluZWQoU09DS19SRE0pCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNPQ0tfUkRNIiwgU09DS19SRE0pOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTT0NLX1JETSIsIFNPQ0tfUkRNKTsKICNlbmRpZgogI2VuZGlmCiAKLSNpZmRlZglTT19ERUJVRwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTT19ERUJVRyIsIFNPX0RFQlVHKTsKKyNpZmRlZiAgU09fREVCVUcKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09fREVCVUciLCBTT19ERUJVRyk7CiAjZW5kaWYKLSNpZmRlZglTT19BQ0NFUFRDT05OCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNPX0FDQ0VQVENPTk4iLCBTT19BQ0NFUFRDT05OKTsKKyNpZmRlZiAgU09fQUNDRVBUQ09OTgorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTT19BQ0NFUFRDT05OIiwgU09fQUNDRVBUQ09OTik7CiAjZW5kaWYKLSNpZmRlZglTT19SRVVTRUFERFIKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09fUkVVU0VBRERSIiwgU09fUkVVU0VBRERSKTsKKyNpZmRlZiAgU09fUkVVU0VBRERSCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNPX1JFVVNFQUREUiIsIFNPX1JFVVNFQUREUik7CiAjZW5kaWYKICNpZmRlZiBTT19FWENMVVNJVkVBRERSVVNFCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNPX0VYQ0xVU0lWRUFERFJVU0UiLCBTT19FWENMVVNJVkVBRERSVVNFKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09fRVhDTFVTSVZFQUREUlVTRSIsIFNPX0VYQ0xVU0lWRUFERFJVU0UpOwogI2VuZGlmCiAKLSNpZmRlZglTT19LRUVQQUxJVkUKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09fS0VFUEFMSVZFIiwgU09fS0VFUEFMSVZFKTsKKyNpZmRlZiAgU09fS0VFUEFMSVZFCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNPX0tFRVBBTElWRSIsIFNPX0tFRVBBTElWRSk7CiAjZW5kaWYKLSNpZmRlZglTT19ET05UUk9VVEUKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09fRE9OVFJPVVRFIiwgU09fRE9OVFJPVVRFKTsKKyNpZmRlZiAgU09fRE9OVFJPVVRFCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNPX0RPTlRST1VURSIsIFNPX0RPTlRST1VURSk7CiAjZW5kaWYKLSNpZmRlZglTT19CUk9BRENBU1QKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09fQlJPQURDQVNUIiwgU09fQlJPQURDQVNUKTsKKyNpZmRlZiAgU09fQlJPQURDQVNUCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNPX0JST0FEQ0FTVCIsIFNPX0JST0FEQ0FTVCk7CiAjZW5kaWYKLSNpZmRlZglTT19VU0VMT09QQkFDSwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTT19VU0VMT09QQkFDSyIsIFNPX1VTRUxPT1BCQUNLKTsKKyNpZmRlZiAgU09fVVNFTE9PUEJBQ0sKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09fVVNFTE9PUEJBQ0siLCBTT19VU0VMT09QQkFDSyk7CiAjZW5kaWYKLSNpZmRlZglTT19MSU5HRVIKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09fTElOR0VSIiwgU09fTElOR0VSKTsKKyNpZmRlZiAgU09fTElOR0VSCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNPX0xJTkdFUiIsIFNPX0xJTkdFUik7CiAjZW5kaWYKLSNpZmRlZglTT19PT0JJTkxJTkUKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09fT09CSU5MSU5FIiwgU09fT09CSU5MSU5FKTsKKyNpZmRlZiAgU09fT09CSU5MSU5FCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNPX09PQklOTElORSIsIFNPX09PQklOTElORSk7CiAjZW5kaWYKLSNpZmRlZglTT19SRVVTRVBPUlQKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09fUkVVU0VQT1JUIiwgU09fUkVVU0VQT1JUKTsKKyNpZmRlZiAgU09fUkVVU0VQT1JUCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNPX1JFVVNFUE9SVCIsIFNPX1JFVVNFUE9SVCk7CiAjZW5kaWYKLSNpZmRlZglTT19TTkRCVUYKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09fU05EQlVGIiwgU09fU05EQlVGKTsKKyNpZmRlZiAgU09fU05EQlVGCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNPX1NOREJVRiIsIFNPX1NOREJVRik7CiAjZW5kaWYKLSNpZmRlZglTT19SQ1ZCVUYKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09fUkNWQlVGIiwgU09fUkNWQlVGKTsKKyNpZmRlZiAgU09fUkNWQlVGCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNPX1JDVkJVRiIsIFNPX1JDVkJVRik7CiAjZW5kaWYKLSNpZmRlZglTT19TTkRMT1dBVAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTT19TTkRMT1dBVCIsIFNPX1NORExPV0FUKTsKKyNpZmRlZiAgU09fU05ETE9XQVQKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09fU05ETE9XQVQiLCBTT19TTkRMT1dBVCk7CiAjZW5kaWYKLSNpZmRlZglTT19SQ1ZMT1dBVAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTT19SQ1ZMT1dBVCIsIFNPX1JDVkxPV0FUKTsKKyNpZmRlZiAgU09fUkNWTE9XQVQKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09fUkNWTE9XQVQiLCBTT19SQ1ZMT1dBVCk7CiAjZW5kaWYKLSNpZmRlZglTT19TTkRUSU1FTwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTT19TTkRUSU1FTyIsIFNPX1NORFRJTUVPKTsKKyNpZmRlZiAgU09fU05EVElNRU8KKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09fU05EVElNRU8iLCBTT19TTkRUSU1FTyk7CiAjZW5kaWYKLSNpZmRlZglTT19SQ1ZUSU1FTwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTT19SQ1ZUSU1FTyIsIFNPX1JDVlRJTUVPKTsKKyNpZmRlZiAgU09fUkNWVElNRU8KKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09fUkNWVElNRU8iLCBTT19SQ1ZUSU1FTyk7CiAjZW5kaWYKLSNpZmRlZglTT19FUlJPUgotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTT19FUlJPUiIsIFNPX0VSUk9SKTsKKyNpZmRlZiAgU09fRVJST1IKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09fRVJST1IiLCBTT19FUlJPUik7CiAjZW5kaWYKLSNpZmRlZglTT19UWVBFCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNPX1RZUEUiLCBTT19UWVBFKTsKKyNpZmRlZiAgU09fVFlQRQorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTT19UWVBFIiwgU09fVFlQRSk7CiAjZW5kaWYKIAotCS8qIE1heGltdW0gbnVtYmVyIG9mIGNvbm5lY3Rpb25zIGZvciAibGlzdGVuIiAqLwotI2lmZGVmCVNPTUFYQ09OTgotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTT01BWENPTk4iLCBTT01BWENPTk4pOworICAgIC8qIE1heGltdW0gbnVtYmVyIG9mIGNvbm5lY3Rpb25zIGZvciAibGlzdGVuIiAqLworI2lmZGVmICBTT01BWENPTk4KKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09NQVhDT05OIiwgU09NQVhDT05OKTsKICNlbHNlCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNPTUFYQ09OTiIsIDUpOyAvKiBDb21tb24gdmFsdWUgKi8KKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09NQVhDT05OIiwgNSk7IC8qIENvbW1vbiB2YWx1ZSAqLwogI2VuZGlmCiAKLQkvKiBGbGFncyBmb3Igc2VuZCwgcmVjdiAqLwotI2lmZGVmCU1TR19PT0IKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTVNHX09PQiIsIE1TR19PT0IpOworICAgIC8qIEZsYWdzIGZvciBzZW5kLCByZWN2ICovCisjaWZkZWYgIE1TR19PT0IKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTVNHX09PQiIsIE1TR19PT0IpOwogI2VuZGlmCi0jaWZkZWYJTVNHX1BFRUsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTVNHX1BFRUsiLCBNU0dfUEVFSyk7CisjaWZkZWYgIE1TR19QRUVLCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk1TR19QRUVLIiwgTVNHX1BFRUspOwogI2VuZGlmCi0jaWZkZWYJTVNHX0RPTlRST1VURQotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJNU0dfRE9OVFJPVVRFIiwgTVNHX0RPTlRST1VURSk7CisjaWZkZWYgIE1TR19ET05UUk9VVEUKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTVNHX0RPTlRST1VURSIsIE1TR19ET05UUk9VVEUpOwogI2VuZGlmCi0jaWZkZWYJTVNHX0RPTlRXQUlUCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk1TR19ET05UV0FJVCIsIE1TR19ET05UV0FJVCk7CisjaWZkZWYgIE1TR19ET05UV0FJVAorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJNU0dfRE9OVFdBSVQiLCBNU0dfRE9OVFdBSVQpOwogI2VuZGlmCi0jaWZkZWYJTVNHX0VPUgotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJNU0dfRU9SIiwgTVNHX0VPUik7CisjaWZkZWYgIE1TR19FT1IKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTVNHX0VPUiIsIE1TR19FT1IpOwogI2VuZGlmCi0jaWZkZWYJTVNHX1RSVU5DCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk1TR19UUlVOQyIsIE1TR19UUlVOQyk7CisjaWZkZWYgIE1TR19UUlVOQworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJNU0dfVFJVTkMiLCBNU0dfVFJVTkMpOwogI2VuZGlmCi0jaWZkZWYJTVNHX0NUUlVOQwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJNU0dfQ1RSVU5DIiwgTVNHX0NUUlVOQyk7CisjaWZkZWYgIE1TR19DVFJVTkMKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTVNHX0NUUlVOQyIsIE1TR19DVFJVTkMpOwogI2VuZGlmCi0jaWZkZWYJTVNHX1dBSVRBTEwKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTVNHX1dBSVRBTEwiLCBNU0dfV0FJVEFMTCk7CisjaWZkZWYgIE1TR19XQUlUQUxMCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk1TR19XQUlUQUxMIiwgTVNHX1dBSVRBTEwpOwogI2VuZGlmCi0jaWZkZWYJTVNHX0JUQUcKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTVNHX0JUQUciLCBNU0dfQlRBRyk7CisjaWZkZWYgIE1TR19CVEFHCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk1TR19CVEFHIiwgTVNHX0JUQUcpOwogI2VuZGlmCi0jaWZkZWYJTVNHX0VUQUcKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTVNHX0VUQUciLCBNU0dfRVRBRyk7CisjaWZkZWYgIE1TR19FVEFHCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk1TR19FVEFHIiwgTVNHX0VUQUcpOwogI2VuZGlmCiAKLQkvKiBQcm90b2NvbCBsZXZlbCBhbmQgbnVtYmVycywgdXNhYmxlIGZvciBbZ3NdZXRzb2Nrb3B0ICovCi0jaWZkZWYJU09MX1NPQ0tFVAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTT0xfU09DS0VUIiwgU09MX1NPQ0tFVCk7CisgICAgLyogUHJvdG9jb2wgbGV2ZWwgYW5kIG51bWJlcnMsIHVzYWJsZSBmb3IgW2dzXWV0c29ja29wdCAqLworI2lmZGVmICBTT0xfU09DS0VUCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNPTF9TT0NLRVQiLCBTT0xfU09DS0VUKTsKICNlbmRpZgotI2lmZGVmCVNPTF9JUAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTT0xfSVAiLCBTT0xfSVApOworI2lmZGVmICBTT0xfSVAKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09MX0lQIiwgU09MX0lQKTsKICNlbHNlCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNPTF9JUCIsIDApOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTT0xfSVAiLCAwKTsKICNlbmRpZgotI2lmZGVmCVNPTF9JUFgKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09MX0lQWCIsIFNPTF9JUFgpOworI2lmZGVmICBTT0xfSVBYCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNPTF9JUFgiLCBTT0xfSVBYKTsKICNlbmRpZgotI2lmZGVmCVNPTF9BWDI1Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNPTF9BWDI1IiwgU09MX0FYMjUpOworI2lmZGVmICBTT0xfQVgyNQorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTT0xfQVgyNSIsIFNPTF9BWDI1KTsKICNlbmRpZgotI2lmZGVmCVNPTF9BVEFMSwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTT0xfQVRBTEsiLCBTT0xfQVRBTEspOworI2lmZGVmICBTT0xfQVRBTEsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09MX0FUQUxLIiwgU09MX0FUQUxLKTsKICNlbmRpZgotI2lmZGVmCVNPTF9ORVRST00KLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09MX05FVFJPTSIsIFNPTF9ORVRST00pOworI2lmZGVmICBTT0xfTkVUUk9NCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNPTF9ORVRST00iLCBTT0xfTkVUUk9NKTsKICNlbmRpZgotI2lmZGVmCVNPTF9ST1NFCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNPTF9ST1NFIiwgU09MX1JPU0UpOworI2lmZGVmICBTT0xfUk9TRQorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTT0xfUk9TRSIsIFNPTF9ST1NFKTsKICNlbmRpZgotI2lmZGVmCVNPTF9UQ1AKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09MX1RDUCIsIFNPTF9UQ1ApOworI2lmZGVmICBTT0xfVENQCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNPTF9UQ1AiLCBTT0xfVENQKTsKICNlbHNlCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNPTF9UQ1AiLCA2KTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09MX1RDUCIsIDYpOwogI2VuZGlmCi0jaWZkZWYJU09MX1VEUAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTT0xfVURQIiwgU09MX1VEUCk7CisjaWZkZWYgIFNPTF9VRFAKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09MX1VEUCIsIFNPTF9VRFApOwogI2Vsc2UKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09MX1VEUCIsIDE3KTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09MX1VEUCIsIDE3KTsKICNlbmRpZgotI2lmZGVmCUlQUFJPVE9fSVAKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBQUk9UT19JUCIsIElQUFJPVE9fSVApOworI2lmZGVmICBJUFBST1RPX0lQCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fSVAiLCBJUFBST1RPX0lQKTsKICNlbHNlCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fSVAiLCAwKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBQUk9UT19JUCIsIDApOwogI2VuZGlmCi0jaWZkZWYJSVBQUk9UT19IT1BPUFRTCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fSE9QT1BUUyIsIElQUFJPVE9fSE9QT1BUUyk7CisjaWZkZWYgIElQUFJPVE9fSE9QT1BUUworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBST1RPX0hPUE9QVFMiLCBJUFBST1RPX0hPUE9QVFMpOwogI2VuZGlmCi0jaWZkZWYJSVBQUk9UT19JQ01QCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fSUNNUCIsIElQUFJPVE9fSUNNUCk7CisjaWZkZWYgIElQUFJPVE9fSUNNUAorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBST1RPX0lDTVAiLCBJUFBST1RPX0lDTVApOwogI2Vsc2UKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBQUk9UT19JQ01QIiwgMSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fSUNNUCIsIDEpOwogI2VuZGlmCi0jaWZkZWYJSVBQUk9UT19JR01QCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fSUdNUCIsIElQUFJPVE9fSUdNUCk7CisjaWZkZWYgIElQUFJPVE9fSUdNUAorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBST1RPX0lHTVAiLCBJUFBST1RPX0lHTVApOwogI2VuZGlmCi0jaWZkZWYJSVBQUk9UT19HR1AKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBQUk9UT19HR1AiLCBJUFBST1RPX0dHUCk7CisjaWZkZWYgIElQUFJPVE9fR0dQCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fR0dQIiwgSVBQUk9UT19HR1ApOwogI2VuZGlmCi0jaWZkZWYJSVBQUk9UT19JUFY0Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fSVBWNCIsIElQUFJPVE9fSVBWNCk7CisjaWZkZWYgIElQUFJPVE9fSVBWNAorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBST1RPX0lQVjQiLCBJUFBST1RPX0lQVjQpOwogI2VuZGlmCi0jaWZkZWYJSVBQUk9UT19JUFY2Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fSVBWNiIsIElQUFJPVE9fSVBWNik7CisjaWZkZWYgIElQUFJPVE9fSVBWNgorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBST1RPX0lQVjYiLCBJUFBST1RPX0lQVjYpOwogI2VuZGlmCi0jaWZkZWYJSVBQUk9UT19JUElQCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fSVBJUCIsIElQUFJPVE9fSVBJUCk7CisjaWZkZWYgIElQUFJPVE9fSVBJUAorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBST1RPX0lQSVAiLCBJUFBST1RPX0lQSVApOwogI2VuZGlmCi0jaWZkZWYJSVBQUk9UT19UQ1AKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBQUk9UT19UQ1AiLCBJUFBST1RPX1RDUCk7CisjaWZkZWYgIElQUFJPVE9fVENQCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fVENQIiwgSVBQUk9UT19UQ1ApOwogI2Vsc2UKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBQUk9UT19UQ1AiLCA2KTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBQUk9UT19UQ1AiLCA2KTsKICNlbmRpZgotI2lmZGVmCUlQUFJPVE9fRUdQCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fRUdQIiwgSVBQUk9UT19FR1ApOworI2lmZGVmICBJUFBST1RPX0VHUAorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBST1RPX0VHUCIsIElQUFJPVE9fRUdQKTsKICNlbmRpZgotI2lmZGVmCUlQUFJPVE9fUFVQCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fUFVQIiwgSVBQUk9UT19QVVApOworI2lmZGVmICBJUFBST1RPX1BVUAorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBST1RPX1BVUCIsIElQUFJPVE9fUFVQKTsKICNlbmRpZgotI2lmZGVmCUlQUFJPVE9fVURQCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fVURQIiwgSVBQUk9UT19VRFApOworI2lmZGVmICBJUFBST1RPX1VEUAorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBST1RPX1VEUCIsIElQUFJPVE9fVURQKTsKICNlbHNlCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fVURQIiwgMTcpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBST1RPX1VEUCIsIDE3KTsKICNlbmRpZgotI2lmZGVmCUlQUFJPVE9fSURQCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fSURQIiwgSVBQUk9UT19JRFApOworI2lmZGVmICBJUFBST1RPX0lEUAorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBST1RPX0lEUCIsIElQUFJPVE9fSURQKTsKICNlbmRpZgotI2lmZGVmCUlQUFJPVE9fSEVMTE8KLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBQUk9UT19IRUxMTyIsIElQUFJPVE9fSEVMTE8pOworI2lmZGVmICBJUFBST1RPX0hFTExPCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fSEVMTE8iLCBJUFBST1RPX0hFTExPKTsKICNlbmRpZgotI2lmZGVmCUlQUFJPVE9fTkQKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBQUk9UT19ORCIsIElQUFJPVE9fTkQpOworI2lmZGVmICBJUFBST1RPX05ECisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fTkQiLCBJUFBST1RPX05EKTsKICNlbmRpZgotI2lmZGVmCUlQUFJPVE9fVFAKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBQUk9UT19UUCIsIElQUFJPVE9fVFApOworI2lmZGVmICBJUFBST1RPX1RQCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fVFAiLCBJUFBST1RPX1RQKTsKICNlbmRpZgotI2lmZGVmCUlQUFJPVE9fSVBWNgotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBST1RPX0lQVjYiLCBJUFBST1RPX0lQVjYpOworI2lmZGVmICBJUFBST1RPX0lQVjYKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBQUk9UT19JUFY2IiwgSVBQUk9UT19JUFY2KTsKICNlbmRpZgotI2lmZGVmCUlQUFJPVE9fUk9VVElORwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBST1RPX1JPVVRJTkciLCBJUFBST1RPX1JPVVRJTkcpOworI2lmZGVmICBJUFBST1RPX1JPVVRJTkcKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBQUk9UT19ST1VUSU5HIiwgSVBQUk9UT19ST1VUSU5HKTsKICNlbmRpZgotI2lmZGVmCUlQUFJPVE9fRlJBR01FTlQKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBQUk9UT19GUkFHTUVOVCIsIElQUFJPVE9fRlJBR01FTlQpOworI2lmZGVmICBJUFBST1RPX0ZSQUdNRU5UCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fRlJBR01FTlQiLCBJUFBST1RPX0ZSQUdNRU5UKTsKICNlbmRpZgotI2lmZGVmCUlQUFJPVE9fUlNWUAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBST1RPX1JTVlAiLCBJUFBST1RPX1JTVlApOworI2lmZGVmICBJUFBST1RPX1JTVlAKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBQUk9UT19SU1ZQIiwgSVBQUk9UT19SU1ZQKTsKICNlbmRpZgotI2lmZGVmCUlQUFJPVE9fR1JFCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fR1JFIiwgSVBQUk9UT19HUkUpOworI2lmZGVmICBJUFBST1RPX0dSRQorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBST1RPX0dSRSIsIElQUFJPVE9fR1JFKTsKICNlbmRpZgotI2lmZGVmCUlQUFJPVE9fRVNQCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fRVNQIiwgSVBQUk9UT19FU1ApOworI2lmZGVmICBJUFBST1RPX0VTUAorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBST1RPX0VTUCIsIElQUFJPVE9fRVNQKTsKICNlbmRpZgotI2lmZGVmCUlQUFJPVE9fQUgKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBQUk9UT19BSCIsIElQUFJPVE9fQUgpOworI2lmZGVmICBJUFBST1RPX0FICisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fQUgiLCBJUFBST1RPX0FIKTsKICNlbmRpZgotI2lmZGVmCUlQUFJPVE9fTU9CSUxFCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fTU9CSUxFIiwgSVBQUk9UT19NT0JJTEUpOworI2lmZGVmICBJUFBST1RPX01PQklMRQorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBST1RPX01PQklMRSIsIElQUFJPVE9fTU9CSUxFKTsKICNlbmRpZgotI2lmZGVmCUlQUFJPVE9fSUNNUFY2Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fSUNNUFY2IiwgSVBQUk9UT19JQ01QVjYpOworI2lmZGVmICBJUFBST1RPX0lDTVBWNgorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBST1RPX0lDTVBWNiIsIElQUFJPVE9fSUNNUFY2KTsKICNlbmRpZgotI2lmZGVmCUlQUFJPVE9fTk9ORQotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBST1RPX05PTkUiLCBJUFBST1RPX05PTkUpOworI2lmZGVmICBJUFBST1RPX05PTkUKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBQUk9UT19OT05FIiwgSVBQUk9UT19OT05FKTsKICNlbmRpZgotI2lmZGVmCUlQUFJPVE9fRFNUT1BUUwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBST1RPX0RTVE9QVFMiLCBJUFBST1RPX0RTVE9QVFMpOworI2lmZGVmICBJUFBST1RPX0RTVE9QVFMKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBQUk9UT19EU1RPUFRTIiwgSVBQUk9UT19EU1RPUFRTKTsKICNlbmRpZgotI2lmZGVmCUlQUFJPVE9fWFRQCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fWFRQIiwgSVBQUk9UT19YVFApOworI2lmZGVmICBJUFBST1RPX1hUUAorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBST1RPX1hUUCIsIElQUFJPVE9fWFRQKTsKICNlbmRpZgotI2lmZGVmCUlQUFJPVE9fRU9OCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fRU9OIiwgSVBQUk9UT19FT04pOworI2lmZGVmICBJUFBST1RPX0VPTgorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBST1RPX0VPTiIsIElQUFJPVE9fRU9OKTsKICNlbmRpZgotI2lmZGVmCUlQUFJPVE9fUElNCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fUElNIiwgSVBQUk9UT19QSU0pOworI2lmZGVmICBJUFBST1RPX1BJTQorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBST1RPX1BJTSIsIElQUFJPVE9fUElNKTsKICNlbmRpZgotI2lmZGVmCUlQUFJPVE9fSVBDT01QCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fSVBDT01QIiwgSVBQUk9UT19JUENPTVApOworI2lmZGVmICBJUFBST1RPX0lQQ09NUAorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBST1RPX0lQQ09NUCIsIElQUFJPVE9fSVBDT01QKTsKICNlbmRpZgotI2lmZGVmCUlQUFJPVE9fVlJSUAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBST1RPX1ZSUlAiLCBJUFBST1RPX1ZSUlApOworI2lmZGVmICBJUFBST1RPX1ZSUlAKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBQUk9UT19WUlJQIiwgSVBQUk9UT19WUlJQKTsKICNlbmRpZgotI2lmZGVmCUlQUFJPVE9fQklQCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fQklQIiwgSVBQUk9UT19CSVApOworI2lmZGVmICBJUFBST1RPX0JJUAorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBST1RPX0JJUCIsIElQUFJPVE9fQklQKTsKICNlbmRpZgogLyoqLwotI2lmZGVmCUlQUFJPVE9fUkFXCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fUkFXIiwgSVBQUk9UT19SQVcpOworI2lmZGVmICBJUFBST1RPX1JBVworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBST1RPX1JBVyIsIElQUFJPVE9fUkFXKTsKICNlbHNlCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fUkFXIiwgMjU1KTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBQUk9UT19SQVciLCAyNTUpOwogI2VuZGlmCi0jaWZkZWYJSVBQUk9UT19NQVgKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBQUk9UT19NQVgiLCBJUFBST1RPX01BWCk7CisjaWZkZWYgIElQUFJPVE9fTUFYCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fTUFYIiwgSVBQUk9UT19NQVgpOwogI2VuZGlmCiAKLQkvKiBTb21lIHBvcnQgY29uZmlndXJhdGlvbiAqLwotI2lmZGVmCUlQUE9SVF9SRVNFUlZFRAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBPUlRfUkVTRVJWRUQiLCBJUFBPUlRfUkVTRVJWRUQpOworICAgIC8qIFNvbWUgcG9ydCBjb25maWd1cmF0aW9uICovCisjaWZkZWYgIElQUE9SVF9SRVNFUlZFRAorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBPUlRfUkVTRVJWRUQiLCBJUFBPUlRfUkVTRVJWRUQpOwogI2Vsc2UKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBQT1JUX1JFU0VSVkVEIiwgMTAyNCk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUE9SVF9SRVNFUlZFRCIsIDEwMjQpOwogI2VuZGlmCi0jaWZkZWYJSVBQT1JUX1VTRVJSRVNFUlZFRAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBPUlRfVVNFUlJFU0VSVkVEIiwgSVBQT1JUX1VTRVJSRVNFUlZFRCk7CisjaWZkZWYgIElQUE9SVF9VU0VSUkVTRVJWRUQKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBQT1JUX1VTRVJSRVNFUlZFRCIsIElQUE9SVF9VU0VSUkVTRVJWRUQpOwogI2Vsc2UKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBQT1JUX1VTRVJSRVNFUlZFRCIsIDUwMDApOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBPUlRfVVNFUlJFU0VSVkVEIiwgNTAwMCk7CiAjZW5kaWYKIAotCS8qIFNvbWUgcmVzZXJ2ZWQgSVAgdi40IGFkZHJlc3NlcyAqLwotI2lmZGVmCUlOQUREUl9BTlkKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSU5BRERSX0FOWSIsIElOQUREUl9BTlkpOworICAgIC8qIFNvbWUgcmVzZXJ2ZWQgSVAgdi40IGFkZHJlc3NlcyAqLworI2lmZGVmICBJTkFERFJfQU5ZCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklOQUREUl9BTlkiLCBJTkFERFJfQU5ZKTsKICNlbHNlCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklOQUREUl9BTlkiLCAweDAwMDAwMDAwKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSU5BRERSX0FOWSIsIDB4MDAwMDAwMDApOwogI2VuZGlmCi0jaWZkZWYJSU5BRERSX0JST0FEQ0FTVAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJTkFERFJfQlJPQURDQVNUIiwgSU5BRERSX0JST0FEQ0FTVCk7CisjaWZkZWYgIElOQUREUl9CUk9BRENBU1QKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSU5BRERSX0JST0FEQ0FTVCIsIElOQUREUl9CUk9BRENBU1QpOwogI2Vsc2UKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSU5BRERSX0JST0FEQ0FTVCIsIDB4ZmZmZmZmZmYpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJTkFERFJfQlJPQURDQVNUIiwgMHhmZmZmZmZmZik7CiAjZW5kaWYKLSNpZmRlZglJTkFERFJfTE9PUEJBQ0sKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSU5BRERSX0xPT1BCQUNLIiwgSU5BRERSX0xPT1BCQUNLKTsKKyNpZmRlZiAgSU5BRERSX0xPT1BCQUNLCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklOQUREUl9MT09QQkFDSyIsIElOQUREUl9MT09QQkFDSyk7CiAjZWxzZQotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJTkFERFJfTE9PUEJBQ0siLCAweDdGMDAwMDAxKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSU5BRERSX0xPT1BCQUNLIiwgMHg3RjAwMDAwMSk7CiAjZW5kaWYKLSNpZmRlZglJTkFERFJfVU5TUEVDX0dST1VQCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklOQUREUl9VTlNQRUNfR1JPVVAiLCBJTkFERFJfVU5TUEVDX0dST1VQKTsKKyNpZmRlZiAgSU5BRERSX1VOU1BFQ19HUk9VUAorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJTkFERFJfVU5TUEVDX0dST1VQIiwgSU5BRERSX1VOU1BFQ19HUk9VUCk7CiAjZWxzZQotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJTkFERFJfVU5TUEVDX0dST1VQIiwgMHhlMDAwMDAwMCk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklOQUREUl9VTlNQRUNfR1JPVVAiLCAweGUwMDAwMDAwKTsKICNlbmRpZgotI2lmZGVmCUlOQUREUl9BTExIT1NUU19HUk9VUAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJTkFERFJfQUxMSE9TVFNfR1JPVVAiLAotCQkJCUlOQUREUl9BTExIT1NUU19HUk9VUCk7CisjaWZkZWYgIElOQUREUl9BTExIT1NUU19HUk9VUAorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJTkFERFJfQUxMSE9TVFNfR1JPVVAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOQUREUl9BTExIT1NUU19HUk9VUCk7CiAjZWxzZQotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJTkFERFJfQUxMSE9TVFNfR1JPVVAiLCAweGUwMDAwMDAxKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSU5BRERSX0FMTEhPU1RTX0dST1VQIiwgMHhlMDAwMDAwMSk7CiAjZW5kaWYKLSNpZmRlZglJTkFERFJfTUFYX0xPQ0FMX0dST1VQCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklOQUREUl9NQVhfTE9DQUxfR1JPVVAiLAotCQkJCUlOQUREUl9NQVhfTE9DQUxfR1JPVVApOworI2lmZGVmICBJTkFERFJfTUFYX0xPQ0FMX0dST1VQCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklOQUREUl9NQVhfTE9DQUxfR1JPVVAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOQUREUl9NQVhfTE9DQUxfR1JPVVApOwogI2Vsc2UKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSU5BRERSX01BWF9MT0NBTF9HUk9VUCIsIDB4ZTAwMDAwZmYpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJTkFERFJfTUFYX0xPQ0FMX0dST1VQIiwgMHhlMDAwMDBmZik7CiAjZW5kaWYKLSNpZmRlZglJTkFERFJfTk9ORQotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJTkFERFJfTk9ORSIsIElOQUREUl9OT05FKTsKKyNpZmRlZiAgSU5BRERSX05PTkUKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSU5BRERSX05PTkUiLCBJTkFERFJfTk9ORSk7CiAjZWxzZQotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJTkFERFJfTk9ORSIsIDB4ZmZmZmZmZmYpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJTkFERFJfTk9ORSIsIDB4ZmZmZmZmZmYpOwogI2VuZGlmCiAKLQkvKiBJUHY0IFtnc11ldHNvY2tvcHQgb3B0aW9ucyAqLwotI2lmZGVmCUlQX09QVElPTlMKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBfT1BUSU9OUyIsIElQX09QVElPTlMpOworICAgIC8qIElQdjQgW2dzXWV0c29ja29wdCBvcHRpb25zICovCisjaWZkZWYgIElQX09QVElPTlMKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBfT1BUSU9OUyIsIElQX09QVElPTlMpOwogI2VuZGlmCi0jaWZkZWYJSVBfSERSSU5DTAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUF9IRFJJTkNMIiwgSVBfSERSSU5DTCk7CisjaWZkZWYgIElQX0hEUklOQ0wKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBfSERSSU5DTCIsIElQX0hEUklOQ0wpOwogI2VuZGlmCi0jaWZkZWYJSVBfVE9TCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQX1RPUyIsIElQX1RPUyk7CisjaWZkZWYgIElQX1RPUworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUF9UT1MiLCBJUF9UT1MpOwogI2VuZGlmCi0jaWZkZWYJSVBfVFRMCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQX1RUTCIsIElQX1RUTCk7CisjaWZkZWYgIElQX1RUTAorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUF9UVEwiLCBJUF9UVEwpOwogI2VuZGlmCi0jaWZkZWYJSVBfUkVDVk9QVFMKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBfUkVDVk9QVFMiLCBJUF9SRUNWT1BUUyk7CisjaWZkZWYgIElQX1JFQ1ZPUFRTCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQX1JFQ1ZPUFRTIiwgSVBfUkVDVk9QVFMpOwogI2VuZGlmCi0jaWZkZWYJSVBfUkVDVlJFVE9QVFMKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBfUkVDVlJFVE9QVFMiLCBJUF9SRUNWUkVUT1BUUyk7CisjaWZkZWYgIElQX1JFQ1ZSRVRPUFRTCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQX1JFQ1ZSRVRPUFRTIiwgSVBfUkVDVlJFVE9QVFMpOwogI2VuZGlmCi0jaWZkZWYJSVBfUkVDVkRTVEFERFIKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBfUkVDVkRTVEFERFIiLCBJUF9SRUNWRFNUQUREUik7CisjaWZkZWYgIElQX1JFQ1ZEU1RBRERSCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQX1JFQ1ZEU1RBRERSIiwgSVBfUkVDVkRTVEFERFIpOwogI2VuZGlmCi0jaWZkZWYJSVBfUkVUT1BUUwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUF9SRVRPUFRTIiwgSVBfUkVUT1BUUyk7CisjaWZkZWYgIElQX1JFVE9QVFMKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBfUkVUT1BUUyIsIElQX1JFVE9QVFMpOwogI2VuZGlmCi0jaWZkZWYJSVBfTVVMVElDQVNUX0lGCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQX01VTFRJQ0FTVF9JRiIsIElQX01VTFRJQ0FTVF9JRik7CisjaWZkZWYgIElQX01VTFRJQ0FTVF9JRgorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUF9NVUxUSUNBU1RfSUYiLCBJUF9NVUxUSUNBU1RfSUYpOwogI2VuZGlmCi0jaWZkZWYJSVBfTVVMVElDQVNUX1RUTAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUF9NVUxUSUNBU1RfVFRMIiwgSVBfTVVMVElDQVNUX1RUTCk7CisjaWZkZWYgIElQX01VTFRJQ0FTVF9UVEwKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBfTVVMVElDQVNUX1RUTCIsIElQX01VTFRJQ0FTVF9UVEwpOwogI2VuZGlmCi0jaWZkZWYJSVBfTVVMVElDQVNUX0xPT1AKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBfTVVMVElDQVNUX0xPT1AiLCBJUF9NVUxUSUNBU1RfTE9PUCk7CisjaWZkZWYgIElQX01VTFRJQ0FTVF9MT09QCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQX01VTFRJQ0FTVF9MT09QIiwgSVBfTVVMVElDQVNUX0xPT1ApOwogI2VuZGlmCi0jaWZkZWYJSVBfQUREX01FTUJFUlNISVAKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBfQUREX01FTUJFUlNISVAiLCBJUF9BRERfTUVNQkVSU0hJUCk7CisjaWZkZWYgIElQX0FERF9NRU1CRVJTSElQCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQX0FERF9NRU1CRVJTSElQIiwgSVBfQUREX01FTUJFUlNISVApOwogI2VuZGlmCi0jaWZkZWYJSVBfRFJPUF9NRU1CRVJTSElQCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQX0RST1BfTUVNQkVSU0hJUCIsIElQX0RST1BfTUVNQkVSU0hJUCk7CisjaWZkZWYgIElQX0RST1BfTUVNQkVSU0hJUAorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUF9EUk9QX01FTUJFUlNISVAiLCBJUF9EUk9QX01FTUJFUlNISVApOwogI2VuZGlmCi0jaWZkZWYJSVBfREVGQVVMVF9NVUxUSUNBU1RfVFRMCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQX0RFRkFVTFRfTVVMVElDQVNUX1RUTCIsCi0JCQkJSVBfREVGQVVMVF9NVUxUSUNBU1RfVFRMKTsKKyNpZmRlZiAgSVBfREVGQVVMVF9NVUxUSUNBU1RfVFRMCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQX0RFRkFVTFRfTVVMVElDQVNUX1RUTCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBfREVGQVVMVF9NVUxUSUNBU1RfVFRMKTsKICNlbmRpZgotI2lmZGVmCUlQX0RFRkFVTFRfTVVMVElDQVNUX0xPT1AKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBfREVGQVVMVF9NVUxUSUNBU1RfTE9PUCIsCi0JCQkJSVBfREVGQVVMVF9NVUxUSUNBU1RfTE9PUCk7CisjaWZkZWYgIElQX0RFRkFVTFRfTVVMVElDQVNUX0xPT1AKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBfREVGQVVMVF9NVUxUSUNBU1RfTE9PUCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBfREVGQVVMVF9NVUxUSUNBU1RfTE9PUCk7CiAjZW5kaWYKLSNpZmRlZglJUF9NQVhfTUVNQkVSU0hJUFMKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBfTUFYX01FTUJFUlNISVBTIiwgSVBfTUFYX01FTUJFUlNISVBTKTsKKyNpZmRlZiAgSVBfTUFYX01FTUJFUlNISVBTCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQX01BWF9NRU1CRVJTSElQUyIsIElQX01BWF9NRU1CRVJTSElQUyk7CiAjZW5kaWYKIAotCS8qIElQdjYgW2dzXWV0c29ja29wdCBvcHRpb25zLCBkZWZpbmVkIGluIFJGQzI1NTMgKi8KLSNpZmRlZglJUFY2X0pPSU5fR1JPVVAKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBWNl9KT0lOX0dST1VQIiwgSVBWNl9KT0lOX0dST1VQKTsKKyAgICAvKiBJUHY2IFtnc11ldHNvY2tvcHQgb3B0aW9ucywgZGVmaW5lZCBpbiBSRkMyNTUzICovCisjaWZkZWYgIElQVjZfSk9JTl9HUk9VUAorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFY2X0pPSU5fR1JPVVAiLCBJUFY2X0pPSU5fR1JPVVApOwogI2VuZGlmCi0jaWZkZWYJSVBWNl9MRUFWRV9HUk9VUAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFY2X0xFQVZFX0dST1VQIiwgSVBWNl9MRUFWRV9HUk9VUCk7CisjaWZkZWYgIElQVjZfTEVBVkVfR1JPVVAKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBWNl9MRUFWRV9HUk9VUCIsIElQVjZfTEVBVkVfR1JPVVApOwogI2VuZGlmCi0jaWZkZWYJSVBWNl9NVUxUSUNBU1RfSE9QUwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFY2X01VTFRJQ0FTVF9IT1BTIiwgSVBWNl9NVUxUSUNBU1RfSE9QUyk7CisjaWZkZWYgIElQVjZfTVVMVElDQVNUX0hPUFMKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBWNl9NVUxUSUNBU1RfSE9QUyIsIElQVjZfTVVMVElDQVNUX0hPUFMpOwogI2VuZGlmCi0jaWZkZWYJSVBWNl9NVUxUSUNBU1RfSUYKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBWNl9NVUxUSUNBU1RfSUYiLCBJUFY2X01VTFRJQ0FTVF9JRik7CisjaWZkZWYgIElQVjZfTVVMVElDQVNUX0lGCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQVjZfTVVMVElDQVNUX0lGIiwgSVBWNl9NVUxUSUNBU1RfSUYpOwogI2VuZGlmCi0jaWZkZWYJSVBWNl9NVUxUSUNBU1RfTE9PUAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFY2X01VTFRJQ0FTVF9MT09QIiwgSVBWNl9NVUxUSUNBU1RfTE9PUCk7CisjaWZkZWYgIElQVjZfTVVMVElDQVNUX0xPT1AKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBWNl9NVUxUSUNBU1RfTE9PUCIsIElQVjZfTVVMVElDQVNUX0xPT1ApOwogI2VuZGlmCi0jaWZkZWYJSVBWNl9VTklDQVNUX0hPUFMKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBWNl9VTklDQVNUX0hPUFMiLCBJUFY2X1VOSUNBU1RfSE9QUyk7CisjaWZkZWYgIElQVjZfVU5JQ0FTVF9IT1BTCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQVjZfVU5JQ0FTVF9IT1BTIiwgSVBWNl9VTklDQVNUX0hPUFMpOwogI2VuZGlmCi0gICAgICAgIC8qIEFkZGl0aW9uYWwgSVBWNiBzb2NrZXQgb3B0aW9ucywgZGVmaW5lZCBpbiBSRkMgMzQ5MyAqLworICAgIC8qIEFkZGl0aW9uYWwgSVBWNiBzb2NrZXQgb3B0aW9ucywgZGVmaW5lZCBpbiBSRkMgMzQ5MyAqLwogI2lmZGVmIElQVjZfVjZPTkxZCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQVjZfVjZPTkxZIiwgSVBWNl9WNk9OTFkpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFY2X1Y2T05MWSIsIElQVjZfVjZPTkxZKTsKICNlbmRpZgotCS8qIEFkdmFuY2VkIElQVjYgc29ja2V0IG9wdGlvbnMsIGZyb20gUkZDIDM1NDIgKi8KKyAgICAvKiBBZHZhbmNlZCBJUFY2IHNvY2tldCBvcHRpb25zLCBmcm9tIFJGQyAzNTQyICovCiAjaWZkZWYgSVBWNl9DSEVDS1NVTQotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFY2X0NIRUNLU1VNIiwgSVBWNl9DSEVDS1NVTSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQVjZfQ0hFQ0tTVU0iLCBJUFY2X0NIRUNLU1VNKTsKICNlbmRpZgogI2lmZGVmIElQVjZfRE9OVEZSQUcKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBWNl9ET05URlJBRyIsIElQVjZfRE9OVEZSQUcpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFY2X0RPTlRGUkFHIiwgSVBWNl9ET05URlJBRyk7CiAjZW5kaWYKICNpZmRlZiBJUFY2X0RTVE9QVFMKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBWNl9EU1RPUFRTIiwgSVBWNl9EU1RPUFRTKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBWNl9EU1RPUFRTIiwgSVBWNl9EU1RPUFRTKTsKICNlbmRpZgogI2lmZGVmIElQVjZfSE9QTElNSVQKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBWNl9IT1BMSU1JVCIsIElQVjZfSE9QTElNSVQpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFY2X0hPUExJTUlUIiwgSVBWNl9IT1BMSU1JVCk7CiAjZW5kaWYKICNpZmRlZiBJUFY2X0hPUE9QVFMKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBWNl9IT1BPUFRTIiwgSVBWNl9IT1BPUFRTKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBWNl9IT1BPUFRTIiwgSVBWNl9IT1BPUFRTKTsKICNlbmRpZgogI2lmZGVmIElQVjZfTkVYVEhPUAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFY2X05FWFRIT1AiLCBJUFY2X05FWFRIT1ApOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFY2X05FWFRIT1AiLCBJUFY2X05FWFRIT1ApOwogI2VuZGlmCiAjaWZkZWYgSVBWNl9QQVRITVRVCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQVjZfUEFUSE1UVSIsIElQVjZfUEFUSE1UVSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQVjZfUEFUSE1UVSIsIElQVjZfUEFUSE1UVSk7CiAjZW5kaWYKICNpZmRlZiBJUFY2X1BLVElORk8KLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBWNl9QS1RJTkZPIiwgSVBWNl9QS1RJTkZPKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBWNl9QS1RJTkZPIiwgSVBWNl9QS1RJTkZPKTsKICNlbmRpZgogI2lmZGVmIElQVjZfUkVDVkRTVE9QVFMKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBWNl9SRUNWRFNUT1BUUyIsIElQVjZfUkVDVkRTVE9QVFMpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFY2X1JFQ1ZEU1RPUFRTIiwgSVBWNl9SRUNWRFNUT1BUUyk7CiAjZW5kaWYKICNpZmRlZiBJUFY2X1JFQ1ZIT1BMSU1JVAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFY2X1JFQ1ZIT1BMSU1JVCIsIElQVjZfUkVDVkhPUExJTUlUKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBWNl9SRUNWSE9QTElNSVQiLCBJUFY2X1JFQ1ZIT1BMSU1JVCk7CiAjZW5kaWYKICNpZmRlZiBJUFY2X1JFQ1ZIT1BPUFRTCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQVjZfUkVDVkhPUE9QVFMiLCBJUFY2X1JFQ1ZIT1BPUFRTKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBWNl9SRUNWSE9QT1BUUyIsIElQVjZfUkVDVkhPUE9QVFMpOwogI2VuZGlmCiAjaWZkZWYgSVBWNl9SRUNWUEtUSU5GTwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFY2X1JFQ1ZQS1RJTkZPIiwgSVBWNl9SRUNWUEtUSU5GTyk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQVjZfUkVDVlBLVElORk8iLCBJUFY2X1JFQ1ZQS1RJTkZPKTsKICNlbmRpZgogI2lmZGVmIElQVjZfUkVDVlJUSERSCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQVjZfUkVDVlJUSERSIiwgSVBWNl9SRUNWUlRIRFIpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFY2X1JFQ1ZSVEhEUiIsIElQVjZfUkVDVlJUSERSKTsKICNlbmRpZgogI2lmZGVmIElQVjZfUkVDVlRDTEFTUwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFY2X1JFQ1ZUQ0xBU1MiLCBJUFY2X1JFQ1ZUQ0xBU1MpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFY2X1JFQ1ZUQ0xBU1MiLCBJUFY2X1JFQ1ZUQ0xBU1MpOwogI2VuZGlmCiAjaWZkZWYgSVBWNl9SVEhEUgotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFY2X1JUSERSIiwgSVBWNl9SVEhEUik7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQVjZfUlRIRFIiLCBJUFY2X1JUSERSKTsKICNlbmRpZgogI2lmZGVmIElQVjZfUlRIRFJEU1RPUFRTCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQVjZfUlRIRFJEU1RPUFRTIiwgSVBWNl9SVEhEUkRTVE9QVFMpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFY2X1JUSERSRFNUT1BUUyIsIElQVjZfUlRIRFJEU1RPUFRTKTsKICNlbmRpZgogI2lmZGVmIElQVjZfUlRIRFJfVFlQRV8wCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQVjZfUlRIRFJfVFlQRV8wIiwgSVBWNl9SVEhEUl9UWVBFXzApOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFY2X1JUSERSX1RZUEVfMCIsIElQVjZfUlRIRFJfVFlQRV8wKTsKICNlbmRpZgogI2lmZGVmIElQVjZfUkVDVlBBVEhNVFUKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBWNl9SRUNWUEFUSE1UVSIsIElQVjZfUkVDVlBBVEhNVFUpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFY2X1JFQ1ZQQVRITVRVIiwgSVBWNl9SRUNWUEFUSE1UVSk7CiAjZW5kaWYKICNpZmRlZiBJUFY2X1RDTEFTUwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFY2X1RDTEFTUyIsIElQVjZfVENMQVNTKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBWNl9UQ0xBU1MiLCBJUFY2X1RDTEFTUyk7CiAjZW5kaWYKICNpZmRlZiBJUFY2X1VTRV9NSU5fTVRVCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQVjZfVVNFX01JTl9NVFUiLCBJUFY2X1VTRV9NSU5fTVRVKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBWNl9VU0VfTUlOX01UVSIsIElQVjZfVVNFX01JTl9NVFUpOwogI2VuZGlmCiAKLQkvKiBUQ1Agb3B0aW9ucyAqLwotI2lmZGVmCVRDUF9OT0RFTEFZCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlRDUF9OT0RFTEFZIiwgVENQX05PREVMQVkpOworICAgIC8qIFRDUCBvcHRpb25zICovCisjaWZkZWYgIFRDUF9OT0RFTEFZCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlRDUF9OT0RFTEFZIiwgVENQX05PREVMQVkpOwogI2VuZGlmCi0jaWZkZWYJVENQX01BWFNFRwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJUQ1BfTUFYU0VHIiwgVENQX01BWFNFRyk7CisjaWZkZWYgIFRDUF9NQVhTRUcKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiVENQX01BWFNFRyIsIFRDUF9NQVhTRUcpOwogI2VuZGlmCi0jaWZkZWYJVENQX0NPUksKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiVENQX0NPUksiLCBUQ1BfQ09SSyk7CisjaWZkZWYgIFRDUF9DT1JLCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlRDUF9DT1JLIiwgVENQX0NPUkspOwogI2VuZGlmCi0jaWZkZWYJVENQX0tFRVBJRExFCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlRDUF9LRUVQSURMRSIsIFRDUF9LRUVQSURMRSk7CisjaWZkZWYgIFRDUF9LRUVQSURMRQorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJUQ1BfS0VFUElETEUiLCBUQ1BfS0VFUElETEUpOwogI2VuZGlmCi0jaWZkZWYJVENQX0tFRVBJTlRWTAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJUQ1BfS0VFUElOVFZMIiwgVENQX0tFRVBJTlRWTCk7CisjaWZkZWYgIFRDUF9LRUVQSU5UVkwKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiVENQX0tFRVBJTlRWTCIsIFRDUF9LRUVQSU5UVkwpOwogI2VuZGlmCi0jaWZkZWYJVENQX0tFRVBDTlQKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiVENQX0tFRVBDTlQiLCBUQ1BfS0VFUENOVCk7CisjaWZkZWYgIFRDUF9LRUVQQ05UCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlRDUF9LRUVQQ05UIiwgVENQX0tFRVBDTlQpOwogI2VuZGlmCi0jaWZkZWYJVENQX1NZTkNOVAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJUQ1BfU1lOQ05UIiwgVENQX1NZTkNOVCk7CisjaWZkZWYgIFRDUF9TWU5DTlQKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiVENQX1NZTkNOVCIsIFRDUF9TWU5DTlQpOwogI2VuZGlmCi0jaWZkZWYJVENQX0xJTkdFUjIKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiVENQX0xJTkdFUjIiLCBUQ1BfTElOR0VSMik7CisjaWZkZWYgIFRDUF9MSU5HRVIyCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlRDUF9MSU5HRVIyIiwgVENQX0xJTkdFUjIpOwogI2VuZGlmCi0jaWZkZWYJVENQX0RFRkVSX0FDQ0VQVAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJUQ1BfREVGRVJfQUNDRVBUIiwgVENQX0RFRkVSX0FDQ0VQVCk7CisjaWZkZWYgIFRDUF9ERUZFUl9BQ0NFUFQKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiVENQX0RFRkVSX0FDQ0VQVCIsIFRDUF9ERUZFUl9BQ0NFUFQpOwogI2VuZGlmCi0jaWZkZWYJVENQX1dJTkRPV19DTEFNUAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJUQ1BfV0lORE9XX0NMQU1QIiwgVENQX1dJTkRPV19DTEFNUCk7CisjaWZkZWYgIFRDUF9XSU5ET1dfQ0xBTVAKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiVENQX1dJTkRPV19DTEFNUCIsIFRDUF9XSU5ET1dfQ0xBTVApOwogI2VuZGlmCi0jaWZkZWYJVENQX0lORk8KLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiVENQX0lORk8iLCBUQ1BfSU5GTyk7CisjaWZkZWYgIFRDUF9JTkZPCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlRDUF9JTkZPIiwgVENQX0lORk8pOwogI2VuZGlmCi0jaWZkZWYJVENQX1FVSUNLQUNLCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlRDUF9RVUlDS0FDSyIsIFRDUF9RVUlDS0FDSyk7CisjaWZkZWYgIFRDUF9RVUlDS0FDSworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJUQ1BfUVVJQ0tBQ0siLCBUQ1BfUVVJQ0tBQ0spOwogI2VuZGlmCiAKIAotCS8qIElQWCBvcHRpb25zICovCi0jaWZkZWYJSVBYX1RZUEUKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBYX1RZUEUiLCBJUFhfVFlQRSk7CisgICAgLyogSVBYIG9wdGlvbnMgKi8KKyNpZmRlZiAgSVBYX1RZUEUKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBYX1RZUEUiLCBJUFhfVFlQRSk7CiAjZW5kaWYKIAotCS8qIGdldHthZGRyLG5hbWV9aW5mbyBwYXJhbWV0ZXJzICovCisgICAgLyogZ2V0e2FkZHIsbmFtZX1pbmZvIHBhcmFtZXRlcnMgKi8KICNpZmRlZiBFQUlfQUREUkZBTUlMWQotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJFQUlfQUREUkZBTUlMWSIsIEVBSV9BRERSRkFNSUxZKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiRUFJX0FERFJGQU1JTFkiLCBFQUlfQUREUkZBTUlMWSk7CiAjZW5kaWYKICNpZmRlZiBFQUlfQUdBSU4KLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiRUFJX0FHQUlOIiwgRUFJX0FHQUlOKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiRUFJX0FHQUlOIiwgRUFJX0FHQUlOKTsKICNlbmRpZgogI2lmZGVmIEVBSV9CQURGTEFHUwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJFQUlfQkFERkxBR1MiLCBFQUlfQkFERkxBR1MpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJFQUlfQkFERkxBR1MiLCBFQUlfQkFERkxBR1MpOwogI2VuZGlmCiAjaWZkZWYgRUFJX0ZBSUwKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiRUFJX0ZBSUwiLCBFQUlfRkFJTCk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkVBSV9GQUlMIiwgRUFJX0ZBSUwpOwogI2VuZGlmCiAjaWZkZWYgRUFJX0ZBTUlMWQotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJFQUlfRkFNSUxZIiwgRUFJX0ZBTUlMWSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkVBSV9GQU1JTFkiLCBFQUlfRkFNSUxZKTsKICNlbmRpZgogI2lmZGVmIEVBSV9NRU1PUlkKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiRUFJX01FTU9SWSIsIEVBSV9NRU1PUlkpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJFQUlfTUVNT1JZIiwgRUFJX01FTU9SWSk7CiAjZW5kaWYKICNpZmRlZiBFQUlfTk9EQVRBCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkVBSV9OT0RBVEEiLCBFQUlfTk9EQVRBKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiRUFJX05PREFUQSIsIEVBSV9OT0RBVEEpOwogI2VuZGlmCiAjaWZkZWYgRUFJX05PTkFNRQotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJFQUlfTk9OQU1FIiwgRUFJX05PTkFNRSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkVBSV9OT05BTUUiLCBFQUlfTk9OQU1FKTsKICNlbmRpZgogI2lmZGVmIEVBSV9PVkVSRkxPVwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJFQUlfT1ZFUkZMT1ciLCBFQUlfT1ZFUkZMT1cpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJFQUlfT1ZFUkZMT1ciLCBFQUlfT1ZFUkZMT1cpOwogI2VuZGlmCiAjaWZkZWYgRUFJX1NFUlZJQ0UKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiRUFJX1NFUlZJQ0UiLCBFQUlfU0VSVklDRSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkVBSV9TRVJWSUNFIiwgRUFJX1NFUlZJQ0UpOwogI2VuZGlmCiAjaWZkZWYgRUFJX1NPQ0tUWVBFCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkVBSV9TT0NLVFlQRSIsIEVBSV9TT0NLVFlQRSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkVBSV9TT0NLVFlQRSIsIEVBSV9TT0NLVFlQRSk7CiAjZW5kaWYKICNpZmRlZiBFQUlfU1lTVEVNCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkVBSV9TWVNURU0iLCBFQUlfU1lTVEVNKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiRUFJX1NZU1RFTSIsIEVBSV9TWVNURU0pOwogI2VuZGlmCiAjaWZkZWYgRUFJX0JBREhJTlRTCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkVBSV9CQURISU5UUyIsIEVBSV9CQURISU5UUyk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkVBSV9CQURISU5UUyIsIEVBSV9CQURISU5UUyk7CiAjZW5kaWYKICNpZmRlZiBFQUlfUFJPVE9DT0wKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiRUFJX1BST1RPQ09MIiwgRUFJX1BST1RPQ09MKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiRUFJX1BST1RPQ09MIiwgRUFJX1BST1RPQ09MKTsKICNlbmRpZgogI2lmZGVmIEVBSV9NQVgKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiRUFJX01BWCIsIEVBSV9NQVgpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJFQUlfTUFYIiwgRUFJX01BWCk7CiAjZW5kaWYKICNpZmRlZiBBSV9QQVNTSVZFCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFJX1BBU1NJVkUiLCBBSV9QQVNTSVZFKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUlfUEFTU0lWRSIsIEFJX1BBU1NJVkUpOwogI2VuZGlmCiAjaWZkZWYgQUlfQ0FOT05OQU1FCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFJX0NBTk9OTkFNRSIsIEFJX0NBTk9OTkFNRSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFJX0NBTk9OTkFNRSIsIEFJX0NBTk9OTkFNRSk7CiAjZW5kaWYKICNpZmRlZiBBSV9OVU1FUklDSE9TVAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBSV9OVU1FUklDSE9TVCIsIEFJX05VTUVSSUNIT1NUKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUlfTlVNRVJJQ0hPU1QiLCBBSV9OVU1FUklDSE9TVCk7CiAjZW5kaWYKICNpZmRlZiBBSV9OVU1FUklDU0VSVgotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBSV9OVU1FUklDU0VSViIsIEFJX05VTUVSSUNTRVJWKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUlfTlVNRVJJQ1NFUlYiLCBBSV9OVU1FUklDU0VSVik7CiAjZW5kaWYKICNpZmRlZiBBSV9NQVNLCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFJX01BU0siLCBBSV9NQVNLKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUlfTUFTSyIsIEFJX01BU0spOwogI2VuZGlmCiAjaWZkZWYgQUlfQUxMCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFJX0FMTCIsIEFJX0FMTCk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFJX0FMTCIsIEFJX0FMTCk7CiAjZW5kaWYKICNpZmRlZiBBSV9WNE1BUFBFRF9DRkcKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUlfVjRNQVBQRURfQ0ZHIiwgQUlfVjRNQVBQRURfQ0ZHKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUlfVjRNQVBQRURfQ0ZHIiwgQUlfVjRNQVBQRURfQ0ZHKTsKICNlbmRpZgogI2lmZGVmIEFJX0FERFJDT05GSUcKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUlfQUREUkNPTkZJRyIsIEFJX0FERFJDT05GSUcpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBSV9BRERSQ09ORklHIiwgQUlfQUREUkNPTkZJRyk7CiAjZW5kaWYKICNpZmRlZiBBSV9WNE1BUFBFRAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBSV9WNE1BUFBFRCIsIEFJX1Y0TUFQUEVEKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUlfVjRNQVBQRUQiLCBBSV9WNE1BUFBFRCk7CiAjZW5kaWYKICNpZmRlZiBBSV9ERUZBVUxUCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFJX0RFRkFVTFQiLCBBSV9ERUZBVUxUKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUlfREVGQVVMVCIsIEFJX0RFRkFVTFQpOwogI2VuZGlmCiAjaWZkZWYgTklfTUFYSE9TVAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJOSV9NQVhIT1NUIiwgTklfTUFYSE9TVCk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk5JX01BWEhPU1QiLCBOSV9NQVhIT1NUKTsKICNlbmRpZgogI2lmZGVmIE5JX01BWFNFUlYKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTklfTUFYU0VSViIsIE5JX01BWFNFUlYpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJOSV9NQVhTRVJWIiwgTklfTUFYU0VSVik7CiAjZW5kaWYKICNpZmRlZiBOSV9OT0ZRRE4KLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTklfTk9GUUROIiwgTklfTk9GUUROKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTklfTk9GUUROIiwgTklfTk9GUUROKTsKICNlbmRpZgogI2lmZGVmIE5JX05VTUVSSUNIT1NUCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk5JX05VTUVSSUNIT1NUIiwgTklfTlVNRVJJQ0hPU1QpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJOSV9OVU1FUklDSE9TVCIsIE5JX05VTUVSSUNIT1NUKTsKICNlbmRpZgogI2lmZGVmIE5JX05BTUVSRVFECi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk5JX05BTUVSRVFEIiwgTklfTkFNRVJFUUQpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJOSV9OQU1FUkVRRCIsIE5JX05BTUVSRVFEKTsKICNlbmRpZgogI2lmZGVmIE5JX05VTUVSSUNTRVJWCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk5JX05VTUVSSUNTRVJWIiwgTklfTlVNRVJJQ1NFUlYpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJOSV9OVU1FUklDU0VSViIsIE5JX05VTUVSSUNTRVJWKTsKICNlbmRpZgogI2lmZGVmIE5JX0RHUkFNCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk5JX0RHUkFNIiwgTklfREdSQU0pOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJOSV9ER1JBTSIsIE5JX0RHUkFNKTsKICNlbmRpZgogCi0JLyogc2h1dGRvd24oKSBwYXJhbWV0ZXJzICovCisgICAgLyogc2h1dGRvd24oKSBwYXJhbWV0ZXJzICovCiAjaWZkZWYgU0hVVF9SRAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTSFVUX1JEIiwgU0hVVF9SRCk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNIVVRfUkQiLCBTSFVUX1JEKTsKICNlbGlmIGRlZmluZWQoU0RfUkVDRUlWRSkKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU0hVVF9SRCIsIFNEX1JFQ0VJVkUpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTSFVUX1JEIiwgU0RfUkVDRUlWRSk7CiAjZWxzZQotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTSFVUX1JEIiwgMCk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNIVVRfUkQiLCAwKTsKICNlbmRpZgogI2lmZGVmIFNIVVRfV1IKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU0hVVF9XUiIsIFNIVVRfV1IpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTSFVUX1dSIiwgU0hVVF9XUik7CiAjZWxpZiBkZWZpbmVkKFNEX1NFTkQpCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNIVVRfV1IiLCBTRF9TRU5EKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU0hVVF9XUiIsIFNEX1NFTkQpOwogI2Vsc2UKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU0hVVF9XUiIsIDEpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTSFVUX1dSIiwgMSk7CiAjZW5kaWYKICNpZmRlZiBTSFVUX1JEV1IKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU0hVVF9SRFdSIiwgU0hVVF9SRFdSKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU0hVVF9SRFdSIiwgU0hVVF9SRFdSKTsKICNlbGlmIGRlZmluZWQoU0RfQk9USCkKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU0hVVF9SRFdSIiwgU0RfQk9USCk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNIVVRfUkRXUiIsIFNEX0JPVEgpOwogI2Vsc2UKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU0hVVF9SRFdSIiwgMik7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNIVVRfUkRXUiIsIDIpOwogI2VuZGlmCiAKICNpZmRlZiBTSU9fUkNWQUxMCi0JewotCQlQeU9iamVjdCAqdG1wOwotCQl0bXAgPSBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZyhTSU9fUkNWQUxMKTsKLQkJaWYgKHRtcCA9PSBOVUxMKQotCQkJcmV0dXJuOwotCQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIlNJT19SQ1ZBTEwiLCB0bXApOwotCX0KLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUkNWQUxMX09GRiIsIFJDVkFMTF9PRkYpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJSQ1ZBTExfT04iLCBSQ1ZBTExfT04pOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJSQ1ZBTExfU09DS0VUTEVWRUxPTkxZIiwgUkNWQUxMX1NPQ0tFVExFVkVMT05MWSk7CisgICAgeworICAgICAgICBQeU9iamVjdCAqdG1wOworICAgICAgICB0bXAgPSBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZyhTSU9fUkNWQUxMKTsKKyAgICAgICAgaWYgKHRtcCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIlNJT19SQ1ZBTEwiLCB0bXApOworICAgIH0KKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUkNWQUxMX09GRiIsIFJDVkFMTF9PRkYpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJSQ1ZBTExfT04iLCBSQ1ZBTExfT04pOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJSQ1ZBTExfU09DS0VUTEVWRUxPTkxZIiwgUkNWQUxMX1NPQ0tFVExFVkVMT05MWSk7CiAjaWZkZWYgUkNWQUxMX0lQTEVWRUwKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUkNWQUxMX0lQTEVWRUwiLCBSQ1ZBTExfSVBMRVZFTCk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlJDVkFMTF9JUExFVkVMIiwgUkNWQUxMX0lQTEVWRUwpOwogI2VuZGlmCiAjaWZkZWYgUkNWQUxMX01BWAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJSQ1ZBTExfTUFYIiwgUkNWQUxMX01BWCk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlJDVkFMTF9NQVgiLCBSQ1ZBTExfTUFYKTsKICNlbmRpZgogI2VuZGlmIC8qIF9NU1RDUElQXyAqLwogCi0JLyogSW5pdGlhbGl6ZSBnZXRob3N0YnluYW1lIGxvY2sgKi8KKyAgICAvKiBJbml0aWFsaXplIGdldGhvc3RieW5hbWUgbG9jayAqLwogI2lmIGRlZmluZWQoVVNFX0dFVEhPU1RCWU5BTUVfTE9DSykgfHwgZGVmaW5lZChVU0VfR0VUQUREUklORk9fTE9DSykKLQluZXRkYl9sb2NrID0gUHlUaHJlYWRfYWxsb2NhdGVfbG9jaygpOworICAgIG5ldGRiX2xvY2sgPSBQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKCk7CiAjZW5kaWYKIH0KIApAQCAtNTI5MSwzNCArNTI5MSwzNCBAQAogaW50CiBpbmV0X3B0b24oaW50IGFmLCBjb25zdCBjaGFyICpzcmMsIHZvaWQgKmRzdCkKIHsKLQlpZiAoYWYgPT0gQUZfSU5FVCkgeworICAgIGlmIChhZiA9PSBBRl9JTkVUKSB7CiAjaWYgKFNJWkVPRl9JTlQgIT0gNCkKICNlcnJvciAiTm90IHN1cmUgaWYgaW5fYWRkcl90IGV4aXN0cyBhbmQgaW50IGlzIG5vdCAzMi1iaXRzLiIKICNlbmRpZgotCQl1bnNpZ25lZCBpbnQgcGFja2VkX2FkZHI7Ci0JCXBhY2tlZF9hZGRyID0gaW5ldF9hZGRyKHNyYyk7Ci0JCWlmIChwYWNrZWRfYWRkciA9PSBJTkFERFJfTk9ORSkKLQkJCXJldHVybiAwOwotCQltZW1jcHkoZHN0LCAmcGFja2VkX2FkZHIsIDQpOwotCQlyZXR1cm4gMTsKLQl9Ci0JLyogU2hvdWxkIHNldCBlcnJubyB0byBFQUZOT1NVUFBPUlQgKi8KLQlyZXR1cm4gLTE7CisgICAgICAgIHVuc2lnbmVkIGludCBwYWNrZWRfYWRkcjsKKyAgICAgICAgcGFja2VkX2FkZHIgPSBpbmV0X2FkZHIoc3JjKTsKKyAgICAgICAgaWYgKHBhY2tlZF9hZGRyID09IElOQUREUl9OT05FKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIG1lbWNweShkc3QsICZwYWNrZWRfYWRkciwgNCk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICAvKiBTaG91bGQgc2V0IGVycm5vIHRvIEVBRk5PU1VQUE9SVCAqLworICAgIHJldHVybiAtMTsKIH0KIAogY29uc3QgY2hhciAqCiBpbmV0X250b3AoaW50IGFmLCBjb25zdCB2b2lkICpzcmMsIGNoYXIgKmRzdCwgc29ja2xlbl90IHNpemUpCiB7Ci0JaWYgKGFmID09IEFGX0lORVQpIHsKLQkJc3RydWN0IGluX2FkZHIgcGFja2VkX2FkZHI7Ci0JCWlmIChzaXplIDwgMTYpCi0JCQkvKiBTaG91bGQgc2V0IGVycm5vIHRvIEVOT1NQQy4gKi8KLQkJCXJldHVybiBOVUxMOwotCQltZW1jcHkoJnBhY2tlZF9hZGRyLCBzcmMsIHNpemVvZihwYWNrZWRfYWRkcikpOwotCQlyZXR1cm4gc3RybmNweShkc3QsIGluZXRfbnRvYShwYWNrZWRfYWRkciksIHNpemUpOwotCX0KLQkvKiBTaG91bGQgc2V0IGVycm5vIHRvIEVBRk5PU1VQUE9SVCAqLwotCXJldHVybiBOVUxMOworICAgIGlmIChhZiA9PSBBRl9JTkVUKSB7CisgICAgICAgIHN0cnVjdCBpbl9hZGRyIHBhY2tlZF9hZGRyOworICAgICAgICBpZiAoc2l6ZSA8IDE2KQorICAgICAgICAgICAgLyogU2hvdWxkIHNldCBlcnJubyB0byBFTk9TUEMuICovCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgbWVtY3B5KCZwYWNrZWRfYWRkciwgc3JjLCBzaXplb2YocGFja2VkX2FkZHIpKTsKKyAgICAgICAgcmV0dXJuIHN0cm5jcHkoZHN0LCBpbmV0X250b2EocGFja2VkX2FkZHIpLCBzaXplKTsKKyAgICB9CisgICAgLyogU2hvdWxkIHNldCBlcnJubyB0byBFQUZOT1NVUFBPUlQgKi8KKyAgICByZXR1cm4gTlVMTDsKIH0KIAogI2VuZGlmCmRpZmYgLS1naXQgYS9Nb2R1bGVzL3NvY2tldG1vZHVsZS5oIGIvTW9kdWxlcy9zb2NrZXRtb2R1bGUuaAppbmRleCBlZjhkMGZjLi45Yjg1NzczIDEwMDY0NAotLS0gYS9Nb2R1bGVzL3NvY2tldG1vZHVsZS5oCisrKyBiL01vZHVsZXMvc29ja2V0bW9kdWxlLmgKQEAgLTE3LDcgKzE3LDcgQEAKICMgaW5jbHVkZSA8d3MydGNwaXAuaD4KIC8qIFZDNiBpcyBzaGlwcGVkIHdpdGggb2xkIHBsYXRmb3JtIGhlYWRlcnMsIGFuZCBkb2VzIG5vdCBoYXZlIE1TVGNwSVAuaAogICogU2VwYXJhdGUgU0RLcyBoYXZlIGFsbCB0aGUgZnVuY3Rpb25zIHdlIHdhbnQsIGJ1dCBvbGRlciBvbmVzIGRvbid0IGhhdmUKLSAqIGFueSB2ZXJzaW9uIGluZm9ybWF0aW9uLiAKKyAqIGFueSB2ZXJzaW9uIGluZm9ybWF0aW9uLgogICogSSB1c2UgU0lPX0dFVF9NVUxUSUNBU1RfRklMVEVSIHRvIGRldGVjdCBhIGRlY2VudCBTREsuCiAgKi8KICMgaWZkZWYgU0lPX0dFVF9NVUxUSUNBU1RfRklMVEVSCkBAIC03Niw0MyArNzYsNDMgQEAKICNlbmRpZgogCiAvKiBQeXRob24gbW9kdWxlIGFuZCBDIEFQSSBuYW1lICovCi0jZGVmaW5lIFB5U29ja2V0X01PRFVMRV9OQU1FCSJfc29ja2V0IgotI2RlZmluZSBQeVNvY2tldF9DQVBJX05BTUUJIkNBUEkiCisjZGVmaW5lIFB5U29ja2V0X01PRFVMRV9OQU1FICAgICJfc29ja2V0IgorI2RlZmluZSBQeVNvY2tldF9DQVBJX05BTUUgICAgICAiQ0FQSSIKIAogLyogQWJzdHJhY3QgdGhlIHNvY2tldCBmaWxlIGRlc2NyaXB0b3IgdHlwZSAqLwogI2lmZGVmIE1TX1dJTkRPV1MKIHR5cGVkZWYgU09DS0VUIFNPQ0tFVF9UOwotIwlpZmRlZiBNU19XSU42NAotIwkJZGVmaW5lIFNJWkVPRl9TT0NLRVRfVCA4Ci0jCWVsc2UKLSMJCWRlZmluZSBTSVpFT0ZfU09DS0VUX1QgNAotIwllbmRpZgorIyAgICAgICBpZmRlZiBNU19XSU42NAorIyAgICAgICAgICAgICAgIGRlZmluZSBTSVpFT0ZfU09DS0VUX1QgOAorIyAgICAgICBlbHNlCisjICAgICAgICAgICAgICAgZGVmaW5lIFNJWkVPRl9TT0NLRVRfVCA0CisjICAgICAgIGVuZGlmCiAjZWxzZQogdHlwZWRlZiBpbnQgU09DS0VUX1Q7Ci0jCWRlZmluZSBTSVpFT0ZfU09DS0VUX1QgU0laRU9GX0lOVAorIyAgICAgICBkZWZpbmUgU0laRU9GX1NPQ0tFVF9UIFNJWkVPRl9JTlQKICNlbmRpZgogCiAvKiBTb2NrZXQgYWRkcmVzcyAqLwogdHlwZWRlZiB1bmlvbiBzb2NrX2FkZHIgewotCXN0cnVjdCBzb2NrYWRkcl9pbiBpbjsKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gaW47CiAjaWZkZWYgQUZfVU5JWAotCXN0cnVjdCBzb2NrYWRkcl91biB1bjsKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfdW4gdW47CiAjZW5kaWYKICNpZmRlZiBBRl9ORVRMSU5LCi0Jc3RydWN0IHNvY2thZGRyX25sIG5sOworICAgIHN0cnVjdCBzb2NrYWRkcl9ubCBubDsKICNlbmRpZgogI2lmZGVmIEVOQUJMRV9JUFY2Ci0Jc3RydWN0IHNvY2thZGRyX2luNiBpbjY7Ci0Jc3RydWN0IHNvY2thZGRyX3N0b3JhZ2Ugc3RvcmFnZTsKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfaW42IGluNjsKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBzdG9yYWdlOwogI2VuZGlmCiAjaWZkZWYgSEFWRV9CTFVFVE9PVEhfQkxVRVRPT1RIX0gKLQlzdHJ1Y3Qgc29ja2FkZHJfbDIgYnRfbDI7Ci0Jc3RydWN0IHNvY2thZGRyX3JjIGJ0X3JjOwotCXN0cnVjdCBzb2NrYWRkcl9zY28gYnRfc2NvOwotCXN0cnVjdCBzb2NrYWRkcl9oY2kgYnRfaGNpOworICAgIHN0cnVjdCBzb2NrYWRkcl9sMiBidF9sMjsKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfcmMgYnRfcmM7CisgICAgc3RydWN0IHNvY2thZGRyX3NjbyBidF9zY287CisgICAgc3RydWN0IHNvY2thZGRyX2hjaSBidF9oY2k7CiAjZW5kaWYKICNpZmRlZiBIQVZFX05FVFBBQ0tFVF9QQUNLRVRfSAotCXN0cnVjdCBzb2NrYWRkcl9sbCBsbDsKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfbGwgbGw7CiAjZW5kaWYKIH0gc29ja19hZGRyX3Q7CiAKQEAgLTEyMSwxNiArMTIxLDE2IEBACiAgICBhcmd1bWVudHMgcHJvcGVybHkuICovCiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JU09DS0VUX1Qgc29ja19mZDsJLyogU29ja2V0IGZpbGUgZGVzY3JpcHRvciAqLwotCWludCBzb2NrX2ZhbWlseTsJLyogQWRkcmVzcyBmYW1pbHksIGUuZy4sIEFGX0lORVQgKi8KLQlpbnQgc29ja190eXBlOwkJLyogU29ja2V0IHR5cGUsIGUuZy4sIFNPQ0tfU1RSRUFNICovCi0JaW50IHNvY2tfcHJvdG87CQkvKiBQcm90b2NvbCB0eXBlLCB1c3VhbGx5IDAgKi8KLQlQeU9iamVjdCAqKCplcnJvcmhhbmRsZXIpKHZvaWQpOyAvKiBFcnJvciBoYW5kbGVyOyBjaGVja3MKLQkJCQkJICAgIGVycm5vLCByZXR1cm5zIE5VTEwgYW5kCi0JCQkJCSAgICBzZXRzIGEgUHl0aG9uIGV4Y2VwdGlvbiAqLwotCWRvdWJsZSBzb2NrX3RpbWVvdXQ7CQkgLyogT3BlcmF0aW9uIHRpbWVvdXQgaW4gc2Vjb25kczsKLQkJCQkJICAgIDAuMCBtZWFucyBub24tYmxvY2tpbmcgKi8KKyAgICBQeU9iamVjdF9IRUFECisgICAgU09DS0VUX1Qgc29ja19mZDsgICAgICAgICAgIC8qIFNvY2tldCBmaWxlIGRlc2NyaXB0b3IgKi8KKyAgICBpbnQgc29ja19mYW1pbHk7ICAgICAgICAgICAgLyogQWRkcmVzcyBmYW1pbHksIGUuZy4sIEFGX0lORVQgKi8KKyAgICBpbnQgc29ja190eXBlOyAgICAgICAgICAgICAgLyogU29ja2V0IHR5cGUsIGUuZy4sIFNPQ0tfU1RSRUFNICovCisgICAgaW50IHNvY2tfcHJvdG87ICAgICAgICAgICAgIC8qIFByb3RvY29sIHR5cGUsIHVzdWFsbHkgMCAqLworICAgIFB5T2JqZWN0ICooKmVycm9yaGFuZGxlcikodm9pZCk7IC8qIEVycm9yIGhhbmRsZXI7IGNoZWNrcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vLCByZXR1cm5zIE5VTEwgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0cyBhIFB5dGhvbiBleGNlcHRpb24gKi8KKyAgICBkb3VibGUgc29ja190aW1lb3V0OyAgICAgICAgICAgICAgICAgLyogT3BlcmF0aW9uIHRpbWVvdXQgaW4gc2Vjb25kczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAgbWVhbnMgbm9uLWJsb2NraW5nICovCiB9IFB5U29ja2V0U29ja09iamVjdDsKIAogLyogLS0tIEMgQVBJIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpAQCAtMTM4LDcgKzEzOCw3IEBACiAvKiBTaG9ydCBleHBsYW5hdGlvbiBvZiB3aGF0IHRoaXMgQyBBUEkgZXhwb3J0IG1lY2hhbmlzbSBkb2VzCiAgICBhbmQgaG93IGl0IHdvcmtzOgogCi0gICAgVGhlIF9zc2wgbW9kdWxlIG5lZWRzIGFjY2VzcyB0byB0aGUgdHlwZSBvYmplY3QgZGVmaW5lZCBpbiAKKyAgICBUaGUgX3NzbCBtb2R1bGUgbmVlZHMgYWNjZXNzIHRvIHRoZSB0eXBlIG9iamVjdCBkZWZpbmVkIGluCiAgICAgdGhlIF9zb2NrZXQgbW9kdWxlLiBTaW5jZSBjcm9zcy1ETEwgbGlua2luZyBpbnRyb2R1Y2VzIGEgbG90IG9mCiAgICAgcHJvYmxlbXMgb24gbWFueSBwbGF0Zm9ybXMsIHRoZSAidHJpY2siIGlzIHRvIHdyYXAgdGhlCiAgICAgQyBBUEkgb2YgYSBtb2R1bGUgaW4gYSBzdHJ1Y3Qgd2hpY2ggdGhlbiBnZXRzIGV4cG9ydGVkIHRvCkBAIC0xNjAsMjQgKzE2MCwyNCBAQAogCiAgICAgTG9hZCBfc29ja2V0IG1vZHVsZSBhbmQgaXRzIEMgQVBJOyB0aGlzIHNldHMgdXAgdGhlIGdsb2JhbAogICAgIFB5U29ja2V0TW9kdWxlOgotICAgIAotCWlmIChQeVNvY2tldE1vZHVsZV9JbXBvcnRNb2R1bGVBbmRBUEkoKSkKLQkgICAgcmV0dXJuOworCisgICAgaWYgKFB5U29ja2V0TW9kdWxlX0ltcG9ydE1vZHVsZUFuZEFQSSgpKQorICAgICAgICByZXR1cm47CiAKIAogICAgIE5vdyB1c2UgdGhlIEMgQVBJIGFzIGlmIGl0IHdlcmUgZGVmaW5lZCBpbiB0aGUgdXNpbmcKICAgICBtb2R1bGU6CiAKLSAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPIXx6ejpzc2wiLAorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyF8eno6c3NsIiwKIAotCQkJICAgICAgUHlTb2NrZXRNb2R1bGUuU29ja19UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeVNvY2tldE1vZHVsZS5Tb2NrX1R5cGUsCiAKLQkJCSAgICAgIChQeU9iamVjdCopJlNvY2ssCi0JCQkgICAgICAma2V5X2ZpbGUsICZjZXJ0X2ZpbGUpKQotCSAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKFB5T2JqZWN0KikmU29jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmtleV9maWxlLCAmY2VydF9maWxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICBTdXBwb3J0IGNvdWxkIGVhc2lseSBiZSBleHRlbmRlZCB0byBleHBvcnQgbW9yZSBDIEFQSXMvc3ltYm9scwotICAgIHRoaXMgd2F5LiBDdXJyZW50bHksIG9ubHkgdGhlIHR5cGUgb2JqZWN0IGlzIGV4cG9ydGVkLCAKKyAgICB0aGlzIHdheS4gQ3VycmVudGx5LCBvbmx5IHRoZSB0eXBlIG9iamVjdCBpcyBleHBvcnRlZCwKICAgICBvdGhlciBjYW5kaWRhdGVzIHdvdWxkIGJlIHNvY2tldCBjb25zdHJ1Y3RvcnMgYW5kIHNvY2tldAogICAgIGFjY2VzcyBmdW5jdGlvbnMuCiAKQEAgLTE4NSwxMyArMTg1LDEzIEBACiAKIC8qIEMgQVBJIGZvciB1c2FnZSBieSBvdGhlciBQeXRob24gbW9kdWxlcyAqLwogdHlwZWRlZiBzdHJ1Y3QgewotCVB5VHlwZU9iamVjdCAqU29ja19UeXBlOwotICAgICAgICBQeU9iamVjdCAqZXJyb3I7CisgICAgUHlUeXBlT2JqZWN0ICpTb2NrX1R5cGU7CisgICAgUHlPYmplY3QgKmVycm9yOwogfSBQeVNvY2tldE1vZHVsZV9BUElPYmplY3Q7CiAKIC8qIFhYWCBUaGUgbmV0IGVmZmVjdCBvZiB0aGUgZm9sbG93aW5nIGFwcGVhcnMgdG8gYmUgdG8gZGVmaW5lIGEgZnVuY3Rpb24KICAgIFhYWCBuYW1lZCBQeVNvY2tldE1vZHVsZV9BUElPYmplY3QgaW4gX3NzbC5jLiAgSXQncyB1bmNsZWFyIHdoeSBpdCBpc24ndAotICAgWFhYIGRlZmluZWQgdGhlcmUgZGlyZWN0bHkuIAorICAgWFhYIGRlZmluZWQgdGhlcmUgZGlyZWN0bHkuCiAKICAgID4+PiBJdCdzIGRlZmluZWQgaGVyZSBiZWNhdXNlIG90aGVyIG1vZHVsZXMgbWlnaHQgYWxzbyB3YW50IHRvIHVzZQogICAgPj4+IHRoZSBDIEFQSS4KQEAgLTIwNyw4ICsyMDcsOCBAQAogCiAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8hfHp6OnNzbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgJlB5U29ja2V0TW9kdWxlLlNvY2tfVHlwZSwgKFB5T2JqZWN0KikmU29jaywKLQkgCQkgJmtleV9maWxlLCAmY2VydF9maWxlKSkKLSAJIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICZrZXlfZmlsZSwgJmNlcnRfZmlsZSkpCisgICAgIHJldHVybiBOVUxMOwogICAgLi4uCiAqLwogCkBAIC0yMjYsMzQgKzIyNiwzNCBAQAogc3RhdGljCiBpbnQgUHlTb2NrZXRNb2R1bGVfSW1wb3J0TW9kdWxlQW5kQVBJKHZvaWQpCiB7Ci0JUHlPYmplY3QgKm1vZCA9IDAsICp2ID0gMDsKLQljaGFyICphcGltb2R1bGUgPSBQeVNvY2tldF9NT0RVTEVfTkFNRTsKLQljaGFyICphcGluYW1lID0gUHlTb2NrZXRfQ0FQSV9OQU1FOwotCXZvaWQgKmFwaTsKKyAgICBQeU9iamVjdCAqbW9kID0gMCwgKnYgPSAwOworICAgIGNoYXIgKmFwaW1vZHVsZSA9IFB5U29ja2V0X01PRFVMRV9OQU1FOworICAgIGNoYXIgKmFwaW5hbWUgPSBQeVNvY2tldF9DQVBJX05BTUU7CisgICAgdm9pZCAqYXBpOwogCi0JRFBSSU5URigiSW1wb3J0aW5nIHRoZSAlcyBDIEFQSS4uLlxuIiwgYXBpbW9kdWxlKTsKLQltb2QgPSBQeUltcG9ydF9JbXBvcnRNb2R1bGVOb0Jsb2NrKGFwaW1vZHVsZSk7Ci0JaWYgKG1vZCA9PSBOVUxMKQotCQlnb3RvIG9uRXJyb3I7Ci0JRFBSSU5URigiICVzIHBhY2thZ2UgZm91bmRcbiIsIGFwaW1vZHVsZSk7Ci0JdiA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcobW9kLCBhcGluYW1lKTsKLQlpZiAodiA9PSBOVUxMKQotCQlnb3RvIG9uRXJyb3I7Ci0JUHlfREVDUkVGKG1vZCk7Ci0JRFBSSU5URigiIEFQSSBvYmplY3QgJXMgZm91bmRcbiIsIGFwaW5hbWUpOwotCWFwaSA9IFB5Q09iamVjdF9Bc1ZvaWRQdHIodik7Ci0JaWYgKGFwaSA9PSBOVUxMKQotCQlnb3RvIG9uRXJyb3I7Ci0JUHlfREVDUkVGKHYpOwotCW1lbWNweSgmUHlTb2NrZXRNb2R1bGUsIGFwaSwgc2l6ZW9mKFB5U29ja2V0TW9kdWxlKSk7Ci0JRFBSSU5URigiIEFQSSBvYmplY3QgbG9hZGVkIGFuZCBpbml0aWFsaXplZC5cbiIpOwotCXJldHVybiAwOworICAgIERQUklOVEYoIkltcG9ydGluZyB0aGUgJXMgQyBBUEkuLi5cbiIsIGFwaW1vZHVsZSk7CisgICAgbW9kID0gUHlJbXBvcnRfSW1wb3J0TW9kdWxlTm9CbG9jayhhcGltb2R1bGUpOworICAgIGlmIChtb2QgPT0gTlVMTCkKKyAgICAgICAgZ290byBvbkVycm9yOworICAgIERQUklOVEYoIiAlcyBwYWNrYWdlIGZvdW5kXG4iLCBhcGltb2R1bGUpOworICAgIHYgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKG1vZCwgYXBpbmFtZSk7CisgICAgaWYgKHYgPT0gTlVMTCkKKyAgICAgICAgZ290byBvbkVycm9yOworICAgIFB5X0RFQ1JFRihtb2QpOworICAgIERQUklOVEYoIiBBUEkgb2JqZWN0ICVzIGZvdW5kXG4iLCBhcGluYW1lKTsKKyAgICBhcGkgPSBQeUNPYmplY3RfQXNWb2lkUHRyKHYpOworICAgIGlmIChhcGkgPT0gTlVMTCkKKyAgICAgICAgZ290byBvbkVycm9yOworICAgIFB5X0RFQ1JFRih2KTsKKyAgICBtZW1jcHkoJlB5U29ja2V0TW9kdWxlLCBhcGksIHNpemVvZihQeVNvY2tldE1vZHVsZSkpOworICAgIERQUklOVEYoIiBBUEkgb2JqZWN0IGxvYWRlZCBhbmQgaW5pdGlhbGl6ZWQuXG4iKTsKKyAgICByZXR1cm4gMDsKIAogIG9uRXJyb3I6Ci0JRFBSSU5URigiIG5vdCBmb3VuZC5cbiIpOwotCVB5X1hERUNSRUYobW9kKTsKLQlQeV9YREVDUkVGKHYpOwotCXJldHVybiAtMTsKKyAgICBEUFJJTlRGKCIgbm90IGZvdW5kLlxuIik7CisgICAgUHlfWERFQ1JFRihtb2QpOworICAgIFB5X1hERUNSRUYodik7CisgICAgcmV0dXJuIC0xOwogfQogCiAjZW5kaWYgLyogIVB5U29ja2V0X0JVSUxESU5HX1NPQ0tFVCAqLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9zcHdkbW9kdWxlLmMgYi9Nb2R1bGVzL3Nwd2Rtb2R1bGUuYwppbmRleCBkM2YzMDlhLi45NTdkZTU4IDEwMDY0NAotLS0gYS9Nb2R1bGVzL3Nwd2Rtb2R1bGUuYworKysgYi9Nb2R1bGVzL3Nwd2Rtb2R1bGUuYwpAQCAtMjcsMTYgKzI3LDE2IEBACiAjaWYgZGVmaW5lZChIQVZFX0dFVFNQTkFNKSB8fCBkZWZpbmVkKEhBVkVfR0VUU1BFTlQpCiAKIHN0YXRpYyBQeVN0cnVjdFNlcXVlbmNlX0ZpZWxkIHN0cnVjdF9zcHdkX3R5cGVfZmllbGRzW10gPSB7Ci0JeyJzcF9uYW0iLCAibG9naW4gbmFtZSJ9LAotCXsic3BfcHdkIiwgImVuY3J5cHRlZCBwYXNzd29yZCJ9LAotCXsic3BfbHN0Y2hnIiwgImRhdGUgb2YgbGFzdCBjaGFuZ2UifSwKLQl7InNwX21pbiIsICJtaW4gI2RheXMgYmV0d2VlbiBjaGFuZ2VzIn0sIAotCXsic3BfbWF4IiwgIm1heCAjZGF5cyBiZXR3ZWVuIGNoYW5nZXMifSwgCi0JeyJzcF93YXJuIiwgIiNkYXlzIGJlZm9yZSBwdyBleHBpcmVzIHRvIHdhcm4gdXNlciBhYm91dCBpdCJ9LCAKLQl7InNwX2luYWN0IiwgIiNkYXlzIGFmdGVyIHB3IGV4cGlyZXMgdW50aWwgYWNjb3VudCBpcyBibG9ja2VkIn0sCi0JeyJzcF9leHBpcmUiLCAiI2RheXMgc2luY2UgMTk3MC0wMS0wMSB1bnRpbCBhY2NvdW50IGlzIGRpc2FibGVkIn0sCi0JeyJzcF9mbGFnIiwgInJlc2VydmVkIn0sCi0JezB9CisgICAgeyJzcF9uYW0iLCAibG9naW4gbmFtZSJ9LAorICAgIHsic3BfcHdkIiwgImVuY3J5cHRlZCBwYXNzd29yZCJ9LAorICAgIHsic3BfbHN0Y2hnIiwgImRhdGUgb2YgbGFzdCBjaGFuZ2UifSwKKyAgICB7InNwX21pbiIsICJtaW4gI2RheXMgYmV0d2VlbiBjaGFuZ2VzIn0sCisgICAgeyJzcF9tYXgiLCAibWF4ICNkYXlzIGJldHdlZW4gY2hhbmdlcyJ9LAorICAgIHsic3Bfd2FybiIsICIjZGF5cyBiZWZvcmUgcHcgZXhwaXJlcyB0byB3YXJuIHVzZXIgYWJvdXQgaXQifSwKKyAgICB7InNwX2luYWN0IiwgIiNkYXlzIGFmdGVyIHB3IGV4cGlyZXMgdW50aWwgYWNjb3VudCBpcyBibG9ja2VkIn0sCisgICAgeyJzcF9leHBpcmUiLCAiI2RheXMgc2luY2UgMTk3MC0wMS0wMSB1bnRpbCBhY2NvdW50IGlzIGRpc2FibGVkIn0sCisgICAgeyJzcF9mbGFnIiwgInJlc2VydmVkIn0sCisgICAgezB9CiB9OwogCiBQeURvY19TVFJWQVIoc3RydWN0X3Nwd2RfX2RvY19fLApAQCAtNDYsMTAgKzQ2LDEwIEBACiBvciB2aWEgdGhlIG9iamVjdCBhdHRyaWJ1dGVzIGFzIG5hbWVkIGluIHRoZSBhYm92ZSB0dXBsZS4iKTsKIAogc3RhdGljIFB5U3RydWN0U2VxdWVuY2VfRGVzYyBzdHJ1Y3Rfc3B3ZF90eXBlX2Rlc2MgPSB7Ci0JInNwd2Quc3RydWN0X3Nwd2QiLAotCXN0cnVjdF9zcHdkX19kb2NfXywKLQlzdHJ1Y3Rfc3B3ZF90eXBlX2ZpZWxkcywKLQk5LAorICAgICJzcHdkLnN0cnVjdF9zcHdkIiwKKyAgICBzdHJ1Y3Rfc3B3ZF9fZG9jX18sCisgICAgc3RydWN0X3Nwd2RfdHlwZV9maWVsZHMsCisgICAgOSwKIH07CiAKIHN0YXRpYyBpbnQgaW5pdGlhbGl6ZWQ7CkBAIC02MCw0MiArNjAsNDIgQEAKIHNldHMoUHlPYmplY3QgKnYsIGludCBpLCBjaGFyKiB2YWwpCiB7CiAgIGlmICh2YWwpCi0JICBQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHYsIGksIFB5U3RyaW5nX0Zyb21TdHJpbmcodmFsKSk7CisgICAgICBQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHYsIGksIFB5U3RyaW5nX0Zyb21TdHJpbmcodmFsKSk7CiAgIGVsc2UgewotCSAgUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTSh2LCBpLCBQeV9Ob25lKTsKLQkgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgIFB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0odiwgaSwgUHlfTm9uZSk7CisgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CiAgIH0KIH0KIAogc3RhdGljIFB5T2JqZWN0ICpta3NwZW50KHN0cnVjdCBzcHdkICpwKQogewotCWludCBzZXRJbmRleCA9IDA7Ci0JUHlPYmplY3QgKnYgPSBQeVN0cnVjdFNlcXVlbmNlX05ldygmU3RydWN0U3B3ZFR5cGUpOwotCWlmICh2ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIGludCBzZXRJbmRleCA9IDA7CisgICAgUHlPYmplY3QgKnYgPSBQeVN0cnVjdFNlcXVlbmNlX05ldygmU3RydWN0U3B3ZFR5cGUpOworICAgIGlmICh2ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCiAjZGVmaW5lIFNFVEkoaSx2YWwpIFB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0odiwgaSwgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIHZhbCkpCiAjZGVmaW5lIFNFVFMoaSx2YWwpIHNldHModiwgaSwgdmFsKQogCi0JU0VUUyhzZXRJbmRleCsrLCBwLT5zcF9uYW1wKTsKLQlTRVRTKHNldEluZGV4KyssIHAtPnNwX3B3ZHApOwotCVNFVEkoc2V0SW5kZXgrKywgcC0+c3BfbHN0Y2hnKTsKLQlTRVRJKHNldEluZGV4KyssIHAtPnNwX21pbik7Ci0JU0VUSShzZXRJbmRleCsrLCBwLT5zcF9tYXgpOwotCVNFVEkoc2V0SW5kZXgrKywgcC0+c3Bfd2Fybik7Ci0JU0VUSShzZXRJbmRleCsrLCBwLT5zcF9pbmFjdCk7Ci0JU0VUSShzZXRJbmRleCsrLCBwLT5zcF9leHBpcmUpOwotCVNFVEkoc2V0SW5kZXgrKywgcC0+c3BfZmxhZyk7CisgICAgU0VUUyhzZXRJbmRleCsrLCBwLT5zcF9uYW1wKTsKKyAgICBTRVRTKHNldEluZGV4KyssIHAtPnNwX3B3ZHApOworICAgIFNFVEkoc2V0SW5kZXgrKywgcC0+c3BfbHN0Y2hnKTsKKyAgICBTRVRJKHNldEluZGV4KyssIHAtPnNwX21pbik7CisgICAgU0VUSShzZXRJbmRleCsrLCBwLT5zcF9tYXgpOworICAgIFNFVEkoc2V0SW5kZXgrKywgcC0+c3Bfd2Fybik7CisgICAgU0VUSShzZXRJbmRleCsrLCBwLT5zcF9pbmFjdCk7CisgICAgU0VUSShzZXRJbmRleCsrLCBwLT5zcF9leHBpcmUpOworICAgIFNFVEkoc2V0SW5kZXgrKywgcC0+c3BfZmxhZyk7CiAKICN1bmRlZiBTRVRTCiAjdW5kZWYgU0VUSQogCi0JaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKLQkJUHlfREVDUkVGKHYpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlyZXR1cm4gdjsKKyAgICByZXR1cm4gdjsKIH0KIAogI2VuZGlmICAvKiBIQVZFX0dFVFNQTkFNIHx8IEhBVkVfR0VUU1BFTlQgKi8KQEAgLTExMSwxNSArMTExLDE1IEBACiAKIHN0YXRpYyBQeU9iamVjdCogc3B3ZF9nZXRzcG5hbShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqbmFtZTsKLQlzdHJ1Y3Qgc3B3ZCAqcDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6Z2V0c3BuYW0iLCAmbmFtZSkpCi0JCXJldHVybiBOVUxMOwotCWlmICgocCA9IGdldHNwbmFtKG5hbWUpKSA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19LZXlFcnJvciwgImdldHNwbmFtKCk6IG5hbWUgbm90IGZvdW5kIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gbWtzcGVudChwKTsKKyAgICBjaGFyICpuYW1lOworICAgIHN0cnVjdCBzcHdkICpwOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczpnZXRzcG5hbSIsICZuYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKChwID0gZ2V0c3BuYW0obmFtZSkpID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0tleUVycm9yLCAiZ2V0c3BuYW0oKTogbmFtZSBub3QgZm91bmQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBta3NwZW50KHApOwogfQogCiAjZW5kaWYgLyogSEFWRV9HRVRTUE5BTSAqLwpAQCAtMTM1LDQ5ICsxMzUsNDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzcHdkX2dldHNwYWxsKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqZDsKLQlzdHJ1Y3Qgc3B3ZCAqcDsKLQlpZiAoKGQgPSBQeUxpc3RfTmV3KDApKSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlzZXRzcGVudCgpOwotCXdoaWxlICgocCA9IGdldHNwZW50KCkpICE9IE5VTEwpIHsKLQkJUHlPYmplY3QgKnYgPSBta3NwZW50KHApOwotCQlpZiAodiA9PSBOVUxMIHx8IFB5TGlzdF9BcHBlbmQoZCwgdikgIT0gMCkgewotCQkJUHlfWERFQ1JFRih2KTsKLQkJCVB5X0RFQ1JFRihkKTsKLQkJCWVuZHNwZW50KCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlQeV9ERUNSRUYodik7Ci0JfQotCWVuZHNwZW50KCk7Ci0JcmV0dXJuIGQ7CisgICAgUHlPYmplY3QgKmQ7CisgICAgc3RydWN0IHNwd2QgKnA7CisgICAgaWYgKChkID0gUHlMaXN0X05ldygwKSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgc2V0c3BlbnQoKTsKKyAgICB3aGlsZSAoKHAgPSBnZXRzcGVudCgpKSAhPSBOVUxMKSB7CisgICAgICAgIFB5T2JqZWN0ICp2ID0gbWtzcGVudChwKTsKKyAgICAgICAgaWYgKHYgPT0gTlVMTCB8fCBQeUxpc3RfQXBwZW5kKGQsIHYpICE9IDApIHsKKyAgICAgICAgICAgIFB5X1hERUNSRUYodik7CisgICAgICAgICAgICBQeV9ERUNSRUYoZCk7CisgICAgICAgICAgICBlbmRzcGVudCgpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgUHlfREVDUkVGKHYpOworICAgIH0KKyAgICBlbmRzcGVudCgpOworICAgIHJldHVybiBkOwogfQogCiAjZW5kaWYgLyogSEFWRV9HRVRTUEVOVCAqLwogCiBzdGF0aWMgUHlNZXRob2REZWYgc3B3ZF9tZXRob2RzW10gPSB7Ci0jaWZkZWYgSEFWRV9HRVRTUE5BTQkKLQl7ImdldHNwbmFtIiwJc3B3ZF9nZXRzcG5hbSwgTUVUSF9WQVJBUkdTLCBzcHdkX2dldHNwbmFtX19kb2NfX30sCisjaWZkZWYgSEFWRV9HRVRTUE5BTQorICAgIHsiZ2V0c3BuYW0iLCAgICAgICAgc3B3ZF9nZXRzcG5hbSwgTUVUSF9WQVJBUkdTLCBzcHdkX2dldHNwbmFtX19kb2NfX30sCiAjZW5kaWYKICNpZmRlZiBIQVZFX0dFVFNQRU5UCi0JeyJnZXRzcGFsbCIsCXNwd2RfZ2V0c3BhbGwsIE1FVEhfTk9BUkdTLCBzcHdkX2dldHNwYWxsX19kb2NfX30sCisgICAgeyJnZXRzcGFsbCIsICAgICAgICBzcHdkX2dldHNwYWxsLCBNRVRIX05PQVJHUywgc3B3ZF9nZXRzcGFsbF9fZG9jX199LAogI2VuZGlmCi0Je05VTEwsCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogCiBQeU1PRElOSVRfRlVOQwogaW5pdHNwd2Qodm9pZCkKIHsKLQlQeU9iamVjdCAqbTsKLQltPVB5X0luaXRNb2R1bGUzKCJzcHdkIiwgc3B3ZF9tZXRob2RzLCBzcHdkX19kb2NfXyk7Ci0JaWYgKG0gPT0gTlVMTCkKLQkJcmV0dXJuOwotCWlmICghaW5pdGlhbGl6ZWQpCi0JCVB5U3RydWN0U2VxdWVuY2VfSW5pdFR5cGUoJlN0cnVjdFNwd2RUeXBlLCAKLQkJCQkJICAmc3RydWN0X3Nwd2RfdHlwZV9kZXNjKTsKLQlQeV9JTkNSRUYoKFB5T2JqZWN0ICopICZTdHJ1Y3RTcHdkVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJzdHJ1Y3Rfc3B3ZCIsIChQeU9iamVjdCAqKSAmU3RydWN0U3B3ZFR5cGUpOwotCWluaXRpYWxpemVkID0gMTsKKyAgICBQeU9iamVjdCAqbTsKKyAgICBtPVB5X0luaXRNb2R1bGUzKCJzcHdkIiwgc3B3ZF9tZXRob2RzLCBzcHdkX19kb2NfXyk7CisgICAgaWYgKG0gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOworICAgIGlmICghaW5pdGlhbGl6ZWQpCisgICAgICAgIFB5U3RydWN0U2VxdWVuY2VfSW5pdFR5cGUoJlN0cnVjdFNwd2RUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHJ1Y3Rfc3B3ZF90eXBlX2Rlc2MpOworICAgIFB5X0lOQ1JFRigoUHlPYmplY3QgKikgJlN0cnVjdFNwd2RUeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgInN0cnVjdF9zcHdkIiwgKFB5T2JqZWN0ICopICZTdHJ1Y3RTcHdkVHlwZSk7CisgICAgaW5pdGlhbGl6ZWQgPSAxOwogfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9zdHJvcG1vZHVsZS5jIGIvTW9kdWxlcy9zdHJvcG1vZHVsZS5jCmluZGV4IDJkODg0NzQuLjA5MGIwN2UgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvc3Ryb3Btb2R1bGUuYworKysgYi9Nb2R1bGVzL3N0cm9wbW9kdWxlLmMKQEAgLTE0LDggKzE0LDggQEAKICAgIFhYWCBhcmUgZGVmaW5lZCBmb3IgYWxsIDgtYml0IGNoYXJhY3RlcnMhICovCiAKICNkZWZpbmUgV0FSTiBpZiAoUHlFcnJfV2FybihQeUV4Y19EZXByZWNhdGlvbldhcm5pbmcsIFwKLQkJICAgICAgICJzdHJvcCBmdW5jdGlvbnMgYXJlIG9ic29sZXRlOyB1c2Ugc3RyaW5nIG1ldGhvZHMiKSkgXAotCSAgICAgcmV0dXJuIE5VTEwKKyAgICAgICAgICAgICAgICJzdHJvcCBmdW5jdGlvbnMgYXJlIG9ic29sZXRlOyB1c2Ugc3RyaW5nIG1ldGhvZHMiKSkgXAorICAgICAgICAgcmV0dXJuIE5VTEwKIAogLyogVGhlIGxzdHJpcCgpLCByc3RyaXAoKSBhbmQgc3RyaXAoKSBmdW5jdGlvbnMgYXJlIGltcGxlbWVudGVkCiAgICBpbiBkb19zdHJpcCgpLCB3aGljaCB1c2VzIGFuIGFkZGl0aW9uYWwgcGFyYW1ldGVyIHRvIGluZGljYXRlIHdoYXQKQEAgLTI5LDU2ICsyOSw1NiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNwbGl0X3doaXRlc3BhY2UoY2hhciAqcywgUHlfc3NpemVfdCBsZW4sIFB5X3NzaXplX3QgbWF4c3BsaXQpCiB7Ci0JUHlfc3NpemVfdCBpID0gMCwgajsKLQlpbnQgZXJyOwotCVB5X3NzaXplX3QgY291bnRzcGxpdCA9IDA7Ci0JUHlPYmplY3QqIGl0ZW07Ci0JUHlPYmplY3QgKmxpc3QgPSBQeUxpc3RfTmV3KDApOworICAgIFB5X3NzaXplX3QgaSA9IDAsIGo7CisgICAgaW50IGVycjsKKyAgICBQeV9zc2l6ZV90IGNvdW50c3BsaXQgPSAwOworICAgIFB5T2JqZWN0KiBpdGVtOworICAgIFB5T2JqZWN0ICpsaXN0ID0gUHlMaXN0X05ldygwKTsKIAotCWlmIChsaXN0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIGlmIChsaXN0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0Jd2hpbGUgKGkgPCBsZW4pIHsKLQkJd2hpbGUgKGkgPCBsZW4gJiYgaXNzcGFjZShQeV9DSEFSTUFTSyhzW2ldKSkpIHsKLQkJCWkgPSBpKzE7Ci0JCX0KLQkJaiA9IGk7Ci0JCXdoaWxlIChpIDwgbGVuICYmICFpc3NwYWNlKFB5X0NIQVJNQVNLKHNbaV0pKSkgewotCQkJaSA9IGkrMTsKLQkJfQotCQlpZiAoaiA8IGkpIHsKLQkJCWl0ZW0gPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzK2osIGktaik7Ci0JCQlpZiAoaXRlbSA9PSBOVUxMKQotCQkJCWdvdG8gZmluYWxseTsKKyAgICB3aGlsZSAoaSA8IGxlbikgeworICAgICAgICB3aGlsZSAoaSA8IGxlbiAmJiBpc3NwYWNlKFB5X0NIQVJNQVNLKHNbaV0pKSkgeworICAgICAgICAgICAgaSA9IGkrMTsKKyAgICAgICAgfQorICAgICAgICBqID0gaTsKKyAgICAgICAgd2hpbGUgKGkgPCBsZW4gJiYgIWlzc3BhY2UoUHlfQ0hBUk1BU0soc1tpXSkpKSB7CisgICAgICAgICAgICBpID0gaSsxOworICAgICAgICB9CisgICAgICAgIGlmIChqIDwgaSkgeworICAgICAgICAgICAgaXRlbSA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHMraiwgaS1qKTsKKyAgICAgICAgICAgIGlmIChpdGVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgZ290byBmaW5hbGx5OwogCi0JCQllcnIgPSBQeUxpc3RfQXBwZW5kKGxpc3QsIGl0ZW0pOwotCQkJUHlfREVDUkVGKGl0ZW0pOwotCQkJaWYgKGVyciA8IDApCi0JCQkJZ290byBmaW5hbGx5OworICAgICAgICAgICAgZXJyID0gUHlMaXN0X0FwcGVuZChsaXN0LCBpdGVtKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICAgICAgICAgIGlmIChlcnIgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gZmluYWxseTsKIAotCQkJY291bnRzcGxpdCsrOwotCQkJd2hpbGUgKGkgPCBsZW4gJiYgaXNzcGFjZShQeV9DSEFSTUFTSyhzW2ldKSkpIHsKLQkJCQlpID0gaSsxOwotCQkJfQotCQkJaWYgKG1heHNwbGl0ICYmIChjb3VudHNwbGl0ID49IG1heHNwbGl0KSAmJiBpIDwgbGVuKSB7Ci0JCQkJaXRlbSA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMraSwgbGVuIC0gaSk7Ci0JCQkJaWYgKGl0ZW0gPT0gTlVMTCkKLQkJCQkJZ290byBmaW5hbGx5OworICAgICAgICAgICAgY291bnRzcGxpdCsrOworICAgICAgICAgICAgd2hpbGUgKGkgPCBsZW4gJiYgaXNzcGFjZShQeV9DSEFSTUFTSyhzW2ldKSkpIHsKKyAgICAgICAgICAgICAgICBpID0gaSsxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1heHNwbGl0ICYmIChjb3VudHNwbGl0ID49IG1heHNwbGl0KSAmJiBpIDwgbGVuKSB7CisgICAgICAgICAgICAgICAgaXRlbSA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKAorICAgICAgICAgICAgICAgICAgICBzK2ksIGxlbiAtIGkpOworICAgICAgICAgICAgICAgIGlmIChpdGVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmluYWxseTsKIAotCQkJCWVyciA9IFB5TGlzdF9BcHBlbmQobGlzdCwgaXRlbSk7Ci0JCQkJUHlfREVDUkVGKGl0ZW0pOwotCQkJCWlmIChlcnIgPCAwKQotCQkJCQlnb3RvIGZpbmFsbHk7CisgICAgICAgICAgICAgICAgZXJyID0gUHlMaXN0X0FwcGVuZChsaXN0LCBpdGVtKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CisgICAgICAgICAgICAgICAgaWYgKGVyciA8IDApCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmluYWxseTsKIAotCQkJCWkgPSBsZW47Ci0JCQl9Ci0JCX0KLQl9Ci0JcmV0dXJuIGxpc3Q7CisgICAgICAgICAgICAgICAgaSA9IGxlbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbGlzdDsKICAgZmluYWxseToKLQlQeV9ERUNSRUYobGlzdCk7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlfREVDUkVGKGxpc3QpOworICAgIHJldHVybiBOVUxMOwogfQogCiAKQEAgLTk2LDYwICs5Niw2MCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHN0cm9wX3NwbGl0ZmllbGRzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeV9zc2l6ZV90IGxlbiwgbiwgaSwgaiwgZXJyOwotCVB5X3NzaXplX3Qgc3BsaXRjb3VudCwgbWF4c3BsaXQ7Ci0JY2hhciAqcywgKnN1YjsKLQlQeU9iamVjdCAqbGlzdCwgKml0ZW07CisgICAgUHlfc3NpemVfdCBsZW4sIG4sIGksIGosIGVycjsKKyAgICBQeV9zc2l6ZV90IHNwbGl0Y291bnQsIG1heHNwbGl0OworICAgIGNoYXIgKnMsICpzdWI7CisgICAgUHlPYmplY3QgKmxpc3QsICppdGVtOwogCi0JV0FSTjsKLQlzdWIgPSBOVUxMOwotCW4gPSAwOwotCXNwbGl0Y291bnQgPSAwOwotCW1heHNwbGl0ID0gMDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInQjfHojbjpzcGxpdCIsICZzLCAmbGVuLCAmc3ViLCAmbiwgJm1heHNwbGl0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKHN1YiA9PSBOVUxMKQotCQlyZXR1cm4gc3BsaXRfd2hpdGVzcGFjZShzLCBsZW4sIG1heHNwbGl0KTsKLQlpZiAobiA9PSAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiZW1wdHkgc2VwYXJhdG9yIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBXQVJOOworICAgIHN1YiA9IE5VTEw7CisgICAgbiA9IDA7CisgICAgc3BsaXRjb3VudCA9IDA7CisgICAgbWF4c3BsaXQgPSAwOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAidCN8eiNuOnNwbGl0IiwgJnMsICZsZW4sICZzdWIsICZuLCAmbWF4c3BsaXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoc3ViID09IE5VTEwpCisgICAgICAgIHJldHVybiBzcGxpdF93aGl0ZXNwYWNlKHMsIGxlbiwgbWF4c3BsaXQpOworICAgIGlmIChuID09IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJlbXB0eSBzZXBhcmF0b3IiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JbGlzdCA9IFB5TGlzdF9OZXcoMCk7Ci0JaWYgKGxpc3QgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgbGlzdCA9IFB5TGlzdF9OZXcoMCk7CisgICAgaWYgKGxpc3QgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpID0gaiA9IDA7Ci0Jd2hpbGUgKGkrbiA8PSBsZW4pIHsKLQkJaWYgKHNbaV0gPT0gc3ViWzBdICYmIChuID09IDEgfHwgbWVtY21wKHMraSwgc3ViLCBuKSA9PSAwKSkgewotCQkJaXRlbSA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHMraiwgaS1qKTsKLQkJCWlmIChpdGVtID09IE5VTEwpCi0JCQkJZ290byBmYWlsOwotCQkJZXJyID0gUHlMaXN0X0FwcGVuZChsaXN0LCBpdGVtKTsKLQkJCVB5X0RFQ1JFRihpdGVtKTsKLQkJCWlmIChlcnIgPCAwKQotCQkJCWdvdG8gZmFpbDsKLQkJCWkgPSBqID0gaSArIG47Ci0JCQlzcGxpdGNvdW50Kys7Ci0JCQlpZiAobWF4c3BsaXQgJiYgKHNwbGl0Y291bnQgPj0gbWF4c3BsaXQpKQotCQkJCWJyZWFrOwotCQl9Ci0JCWVsc2UKLQkJCWkrKzsKLQl9Ci0JaXRlbSA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHMraiwgbGVuLWopOwotCWlmIChpdGVtID09IE5VTEwpCi0JCWdvdG8gZmFpbDsKLQllcnIgPSBQeUxpc3RfQXBwZW5kKGxpc3QsIGl0ZW0pOwotCVB5X0RFQ1JFRihpdGVtKTsKLQlpZiAoZXJyIDwgMCkKLQkJZ290byBmYWlsOworICAgIGkgPSBqID0gMDsKKyAgICB3aGlsZSAoaStuIDw9IGxlbikgeworICAgICAgICBpZiAoc1tpXSA9PSBzdWJbMF0gJiYgKG4gPT0gMSB8fCBtZW1jbXAocytpLCBzdWIsIG4pID09IDApKSB7CisgICAgICAgICAgICBpdGVtID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocytqLCBpLWopOworICAgICAgICAgICAgaWYgKGl0ZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICBlcnIgPSBQeUxpc3RfQXBwZW5kKGxpc3QsIGl0ZW0pOworICAgICAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgICAgICAgICAgaWYgKGVyciA8IDApCisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgaSA9IGogPSBpICsgbjsKKyAgICAgICAgICAgIHNwbGl0Y291bnQrKzsKKyAgICAgICAgICAgIGlmIChtYXhzcGxpdCAmJiAoc3BsaXRjb3VudCA+PSBtYXhzcGxpdCkpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaSsrOworICAgIH0KKyAgICBpdGVtID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocytqLCBsZW4taik7CisgICAgaWYgKGl0ZW0gPT0gTlVMTCkKKyAgICAgICAgZ290byBmYWlsOworICAgIGVyciA9IFB5TGlzdF9BcHBlbmQobGlzdCwgaXRlbSk7CisgICAgUHlfREVDUkVGKGl0ZW0pOworICAgIGlmIChlcnIgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CiAKLQlyZXR1cm4gbGlzdDsKKyAgICByZXR1cm4gbGlzdDsKIAogIGZhaWw6Ci0JUHlfREVDUkVGKGxpc3QpOwotCXJldHVybiBOVUxMOworICAgIFB5X0RFQ1JFRihsaXN0KTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogCkBAIC0xNjYsMTI4ICsxNjYsMTI4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3Ryb3Bfam9pbmZpZWxkcyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKnNlcTsKLQljaGFyICpzZXAgPSBOVUxMOwotCVB5X3NzaXplX3Qgc2VxbGVuLCBzZXBsZW4gPSAwOwotCVB5X3NzaXplX3QgaSwgcmVzbGVuID0gMCwgc2xlbiA9IDAsIHN6ID0gMTAwOwotCVB5T2JqZWN0ICpyZXMgPSBOVUxMOwotCWNoYXIqIHAgPSBOVUxMOwotCXNzaXplYXJnZnVuYyBnZXRpdGVtZnVuYzsKKyAgICBQeU9iamVjdCAqc2VxOworICAgIGNoYXIgKnNlcCA9IE5VTEw7CisgICAgUHlfc3NpemVfdCBzZXFsZW4sIHNlcGxlbiA9IDA7CisgICAgUHlfc3NpemVfdCBpLCByZXNsZW4gPSAwLCBzbGVuID0gMCwgc3ogPSAxMDA7CisgICAgUHlPYmplY3QgKnJlcyA9IE5VTEw7CisgICAgY2hhciogcCA9IE5VTEw7CisgICAgc3NpemVhcmdmdW5jIGdldGl0ZW1mdW5jOwogCi0JV0FSTjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98dCM6am9pbiIsICZzZXEsICZzZXAsICZzZXBsZW4pKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoc2VwID09IE5VTEwpIHsKLQkJc2VwID0gIiAiOwotCQlzZXBsZW4gPSAxOwotCX0KKyAgICBXQVJOOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3x0Izpqb2luIiwgJnNlcSwgJnNlcCwgJnNlcGxlbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChzZXAgPT0gTlVMTCkgeworICAgICAgICBzZXAgPSAiICI7CisgICAgICAgIHNlcGxlbiA9IDE7CisgICAgfQogCi0Jc2VxbGVuID0gUHlTZXF1ZW5jZV9TaXplKHNlcSk7Ci0JaWYgKHNlcWxlbiA8IDAgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgc2VxbGVuID0gUHlTZXF1ZW5jZV9TaXplKHNlcSk7CisgICAgaWYgKHNlcWxlbiA8IDAgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoc2VxbGVuID09IDEpIHsKLQkJLyogT3B0aW1pemF0aW9uIGlmIHRoZXJlJ3Mgb25seSBvbmUgaXRlbSAqLwotCQlQeU9iamVjdCAqaXRlbSA9IFB5U2VxdWVuY2VfR2V0SXRlbShzZXEsIDApOwotCQlpZiAoaXRlbSAmJiAhUHlTdHJpbmdfQ2hlY2soaXRlbSkpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJICJmaXJzdCBhcmd1bWVudCBtdXN0IGJlIHNlcXVlbmNlIG9mIHN0cmluZ3MiKTsKLQkJCVB5X0RFQ1JFRihpdGVtKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCXJldHVybiBpdGVtOwotCX0KKyAgICBpZiAoc2VxbGVuID09IDEpIHsKKyAgICAgICAgLyogT3B0aW1pemF0aW9uIGlmIHRoZXJlJ3Mgb25seSBvbmUgaXRlbSAqLworICAgICAgICBQeU9iamVjdCAqaXRlbSA9IFB5U2VxdWVuY2VfR2V0SXRlbShzZXEsIDApOworICAgICAgICBpZiAoaXRlbSAmJiAhUHlTdHJpbmdfQ2hlY2soaXRlbSkpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBzZXF1ZW5jZSBvZiBzdHJpbmdzIik7CisgICAgICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaXRlbTsKKyAgICB9CiAKLQlpZiAoIShyZXMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciopTlVMTCwgc3opKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcCA9IFB5U3RyaW5nX0FzU3RyaW5nKHJlcyk7CisgICAgaWYgKCEocmVzID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIqKU5VTEwsIHN6KSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHAgPSBQeVN0cmluZ19Bc1N0cmluZyhyZXMpOwogCi0JLyogb3B0aW1pemUgZm9yIGxpc3RzLCBzaW5jZSBpdCdzIHRoZSBtb3N0IGNvbW1vbiBjYXNlLiAgYWxsIG90aGVycwotCSAqICh0dXBsZXMgYW5kIGFyYml0cmFyeSBzZXF1ZW5jZXMpIGp1c3QgdXNlIHRoZSBzZXF1ZW5jZSBhYnN0cmFjdAotCSAqIGludGVyZmFjZS4KLQkgKi8KLQlpZiAoUHlMaXN0X0NoZWNrKHNlcSkpIHsKLQkJZm9yIChpID0gMDsgaSA8IHNlcWxlbjsgaSsrKSB7Ci0JCQlQeU9iamVjdCAqaXRlbSA9IFB5TGlzdF9HRVRfSVRFTShzZXEsIGkpOwotCQkJaWYgKCFQeVN0cmluZ19DaGVjayhpdGVtKSkgewotCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJImZpcnN0IGFyZ3VtZW50IG11c3QgYmUgc2VxdWVuY2Ugb2Ygc3RyaW5ncyIpOwotCQkJCVB5X0RFQ1JFRihyZXMpOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQkJc2xlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKGl0ZW0pOwotCQkJaWYgKHNsZW4gPiBQWV9TU0laRV9UX01BWCAtIHJlc2xlbiB8fAotCQkJICAgIHNlcGxlbiA+IFBZX1NTSVpFX1RfTUFYIC0gcmVzbGVuIC0gc2VwbGVuKSB7Ci0JCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0JCQkJCQkiaW5wdXQgdG9vIGxvbmciKTsKLQkJCQlQeV9ERUNSRUYocmVzKTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJCXdoaWxlIChyZXNsZW4gKyBzbGVuICsgc2VwbGVuID49IHN6KSB7Ci0JCQkJaWYgKF9QeVN0cmluZ19SZXNpemUoJnJlcywgc3ogKiAyKSA8IDApCi0JCQkJCXJldHVybiBOVUxMOwotCQkJCXN6ICo9IDI7Ci0JCQkJcCA9IFB5U3RyaW5nX0FzU3RyaW5nKHJlcykgKyByZXNsZW47Ci0JCQl9Ci0JCQlpZiAoaSA+IDApIHsKLQkJCQltZW1jcHkocCwgc2VwLCBzZXBsZW4pOwotCQkJCXAgKz0gc2VwbGVuOwotCQkJCXJlc2xlbiArPSBzZXBsZW47Ci0JCQl9Ci0JCQltZW1jcHkocCwgUHlTdHJpbmdfQVNfU1RSSU5HKGl0ZW0pLCBzbGVuKTsKLQkJCXAgKz0gc2xlbjsKLQkJCXJlc2xlbiArPSBzbGVuOwotCQl9Ci0JCV9QeVN0cmluZ19SZXNpemUoJnJlcywgcmVzbGVuKTsKLQkJcmV0dXJuIHJlczsKLQl9CisgICAgLyogb3B0aW1pemUgZm9yIGxpc3RzLCBzaW5jZSBpdCdzIHRoZSBtb3N0IGNvbW1vbiBjYXNlLiAgYWxsIG90aGVycworICAgICAqICh0dXBsZXMgYW5kIGFyYml0cmFyeSBzZXF1ZW5jZXMpIGp1c3QgdXNlIHRoZSBzZXF1ZW5jZSBhYnN0cmFjdAorICAgICAqIGludGVyZmFjZS4KKyAgICAgKi8KKyAgICBpZiAoUHlMaXN0X0NoZWNrKHNlcSkpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHNlcWxlbjsgaSsrKSB7CisgICAgICAgICAgICBQeU9iamVjdCAqaXRlbSA9IFB5TGlzdF9HRVRfSVRFTShzZXEsIGkpOworICAgICAgICAgICAgaWYgKCFQeVN0cmluZ19DaGVjayhpdGVtKSkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgImZpcnN0IGFyZ3VtZW50IG11c3QgYmUgc2VxdWVuY2Ugb2Ygc3RyaW5ncyIpOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihyZXMpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2xlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKGl0ZW0pOworICAgICAgICAgICAgaWYgKHNsZW4gPiBQWV9TU0laRV9UX01BWCAtIHJlc2xlbiB8fAorICAgICAgICAgICAgICAgIHNlcGxlbiA+IFBZX1NTSVpFX1RfTUFYIC0gcmVzbGVuIC0gc2VwbGVuKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnB1dCB0b28gbG9uZyIpOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihyZXMpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd2hpbGUgKHJlc2xlbiArIHNsZW4gKyBzZXBsZW4gPj0gc3opIHsKKyAgICAgICAgICAgICAgICBpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmcmVzLCBzeiAqIDIpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgc3ogKj0gMjsKKyAgICAgICAgICAgICAgICBwID0gUHlTdHJpbmdfQXNTdHJpbmcocmVzKSArIHJlc2xlbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpID4gMCkgeworICAgICAgICAgICAgICAgIG1lbWNweShwLCBzZXAsIHNlcGxlbik7CisgICAgICAgICAgICAgICAgcCArPSBzZXBsZW47CisgICAgICAgICAgICAgICAgcmVzbGVuICs9IHNlcGxlbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1lbWNweShwLCBQeVN0cmluZ19BU19TVFJJTkcoaXRlbSksIHNsZW4pOworICAgICAgICAgICAgcCArPSBzbGVuOworICAgICAgICAgICAgcmVzbGVuICs9IHNsZW47CisgICAgICAgIH0KKyAgICAgICAgX1B5U3RyaW5nX1Jlc2l6ZSgmcmVzLCByZXNsZW4pOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KIAotCWlmIChzZXEtPm9iX3R5cGUtPnRwX2FzX3NlcXVlbmNlID09IE5VTEwgfHwKLQkJIChnZXRpdGVtZnVuYyA9IHNlcS0+b2JfdHlwZS0+dHBfYXNfc2VxdWVuY2UtPnNxX2l0ZW0pID09IE5VTEwpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJmaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgc2VxdWVuY2UiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCS8qIFRoaXMgaXMgbm93IHR5cGUgc2FmZSAqLwotCWZvciAoaSA9IDA7IGkgPCBzZXFsZW47IGkrKykgewotCQlQeU9iamVjdCAqaXRlbSA9IGdldGl0ZW1mdW5jKHNlcSwgaSk7Ci0JCWlmICghaXRlbSB8fCAhUHlTdHJpbmdfQ2hlY2soaXRlbSkpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJICJmaXJzdCBhcmd1bWVudCBtdXN0IGJlIHNlcXVlbmNlIG9mIHN0cmluZ3MiKTsKLQkJCVB5X0RFQ1JFRihyZXMpOwotCQkJUHlfWERFQ1JFRihpdGVtKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCXNsZW4gPSBQeVN0cmluZ19HRVRfU0laRShpdGVtKTsKLQkJaWYgKHNsZW4gPiBQWV9TU0laRV9UX01BWCAtIHJlc2xlbiB8fAotCQkgICAgc2VwbGVuID4gUFlfU1NJWkVfVF9NQVggLSByZXNsZW4gLSBzZXBsZW4pIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJCQkiaW5wdXQgdG9vIGxvbmciKTsKLQkJCVB5X0RFQ1JFRihyZXMpOwotCQkJUHlfWERFQ1JFRihpdGVtKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCXdoaWxlIChyZXNsZW4gKyBzbGVuICsgc2VwbGVuID49IHN6KSB7Ci0JCQlpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmcmVzLCBzeiAqIDIpIDwgMCkgewotCQkJCVB5X0RFQ1JFRihpdGVtKTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJCXN6ICo9IDI7Ci0JCQlwID0gUHlTdHJpbmdfQXNTdHJpbmcocmVzKSArIHJlc2xlbjsKLQkJfQotCQlpZiAoaSA+IDApIHsKLQkJCW1lbWNweShwLCBzZXAsIHNlcGxlbik7Ci0JCQlwICs9IHNlcGxlbjsKLQkJCXJlc2xlbiArPSBzZXBsZW47Ci0JCX0KLQkJbWVtY3B5KHAsIFB5U3RyaW5nX0FTX1NUUklORyhpdGVtKSwgc2xlbik7Ci0JCXAgKz0gc2xlbjsKLQkJcmVzbGVuICs9IHNsZW47Ci0JCVB5X0RFQ1JFRihpdGVtKTsKLQl9Ci0JX1B5U3RyaW5nX1Jlc2l6ZSgmcmVzLCByZXNsZW4pOwotCXJldHVybiByZXM7CisgICAgaWYgKHNlcS0+b2JfdHlwZS0+dHBfYXNfc2VxdWVuY2UgPT0gTlVMTCB8fAorICAgICAgICAgICAgIChnZXRpdGVtZnVuYyA9IHNlcS0+b2JfdHlwZS0+dHBfYXNfc2VxdWVuY2UtPnNxX2l0ZW0pID09IE5VTEwpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBzZXF1ZW5jZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgLyogVGhpcyBpcyBub3cgdHlwZSBzYWZlICovCisgICAgZm9yIChpID0gMDsgaSA8IHNlcWxlbjsgaSsrKSB7CisgICAgICAgIFB5T2JqZWN0ICppdGVtID0gZ2V0aXRlbWZ1bmMoc2VxLCBpKTsKKyAgICAgICAgaWYgKCFpdGVtIHx8ICFQeVN0cmluZ19DaGVjayhpdGVtKSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJmaXJzdCBhcmd1bWVudCBtdXN0IGJlIHNlcXVlbmNlIG9mIHN0cmluZ3MiKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihyZXMpOworICAgICAgICAgICAgUHlfWERFQ1JFRihpdGVtKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHNsZW4gPSBQeVN0cmluZ19HRVRfU0laRShpdGVtKTsKKyAgICAgICAgaWYgKHNsZW4gPiBQWV9TU0laRV9UX01BWCAtIHJlc2xlbiB8fAorICAgICAgICAgICAgc2VwbGVuID4gUFlfU1NJWkVfVF9NQVggLSByZXNsZW4gLSBzZXBsZW4pIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnB1dCB0b28gbG9uZyIpOworICAgICAgICAgICAgUHlfREVDUkVGKHJlcyk7CisgICAgICAgICAgICBQeV9YREVDUkVGKGl0ZW0pOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKHJlc2xlbiArIHNsZW4gKyBzZXBsZW4gPj0gc3opIHsKKyAgICAgICAgICAgIGlmIChfUHlTdHJpbmdfUmVzaXplKCZyZXMsIHN6ICogMikgPCAwKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3ogKj0gMjsKKyAgICAgICAgICAgIHAgPSBQeVN0cmluZ19Bc1N0cmluZyhyZXMpICsgcmVzbGVuOworICAgICAgICB9CisgICAgICAgIGlmIChpID4gMCkgeworICAgICAgICAgICAgbWVtY3B5KHAsIHNlcCwgc2VwbGVuKTsKKyAgICAgICAgICAgIHAgKz0gc2VwbGVuOworICAgICAgICAgICAgcmVzbGVuICs9IHNlcGxlbjsKKyAgICAgICAgfQorICAgICAgICBtZW1jcHkocCwgUHlTdHJpbmdfQVNfU1RSSU5HKGl0ZW0pLCBzbGVuKTsKKyAgICAgICAgcCArPSBzbGVuOworICAgICAgICByZXNsZW4gKz0gc2xlbjsKKyAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgIH0KKyAgICBfUHlTdHJpbmdfUmVzaXplKCZyZXMsIHJlc2xlbik7CisgICAgcmV0dXJuIHJlczsKIH0KIAogCkBAIC0zMDMsMzQgKzMwMywzNCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHN0cm9wX2ZpbmQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKnMsICpzdWI7Ci0JUHlfc3NpemVfdCBsZW4sIG4sIGkgPSAwLCBsYXN0ID0gUFlfU1NJWkVfVF9NQVg7CisgICAgY2hhciAqcywgKnN1YjsKKyAgICBQeV9zc2l6ZV90IGxlbiwgbiwgaSA9IDAsIGxhc3QgPSBQWV9TU0laRV9UX01BWDsKIAotCVdBUk47Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ0I3QjfG5uOmZpbmQiLCAmcywgJmxlbiwgJnN1YiwgJm4sICZpLCAmbGFzdCkpCi0JCXJldHVybiBOVUxMOworICAgIFdBUk47CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ0I3QjfG5uOmZpbmQiLCAmcywgJmxlbiwgJnN1YiwgJm4sICZpLCAmbGFzdCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKGxhc3QgPiBsZW4pCi0JCWxhc3QgPSBsZW47Ci0JaWYgKGxhc3QgPCAwKQotCQlsYXN0ICs9IGxlbjsKLQlpZiAobGFzdCA8IDApCi0JCWxhc3QgPSAwOwotCWlmIChpIDwgMCkKLQkJaSArPSBsZW47Ci0JaWYgKGkgPCAwKQotCQlpID0gMDsKKyAgICBpZiAobGFzdCA+IGxlbikKKyAgICAgICAgbGFzdCA9IGxlbjsKKyAgICBpZiAobGFzdCA8IDApCisgICAgICAgIGxhc3QgKz0gbGVuOworICAgIGlmIChsYXN0IDwgMCkKKyAgICAgICAgbGFzdCA9IDA7CisgICAgaWYgKGkgPCAwKQorICAgICAgICBpICs9IGxlbjsKKyAgICBpZiAoaSA8IDApCisgICAgICAgIGkgPSAwOwogCi0JaWYgKG4gPT0gMCAmJiBpIDw9IGxhc3QpCi0JCXJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZylpKTsKKyAgICBpZiAobiA9PSAwICYmIGkgPD0gbGFzdCkKKyAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKWkpOwogCi0JbGFzdCAtPSBuOwotCWZvciAoOyBpIDw9IGxhc3Q7ICsraSkKLQkJaWYgKHNbaV0gPT0gc3ViWzBdICYmCi0JCSAgICAobiA9PSAxIHx8IG1lbWNtcCgmc1tpKzFdLCAmc3ViWzFdLCBuLTEpID09IDApKQotCQkJcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKWkpOworICAgIGxhc3QgLT0gbjsKKyAgICBmb3IgKDsgaSA8PSBsYXN0OyArK2kpCisgICAgICAgIGlmIChzW2ldID09IHN1YlswXSAmJgorICAgICAgICAgICAgKG4gPT0gMSB8fCBtZW1jbXAoJnNbaSsxXSwgJnN1YlsxXSwgbi0xKSA9PSAwKSkKKyAgICAgICAgICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZylpKTsKIAotCXJldHVybiBQeUludF9Gcm9tTG9uZygtMUwpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygtMUwpOwogfQogCiAKQEAgLTM0Niw2OCArMzQ2LDY4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3Ryb3BfcmZpbmQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKnMsICpzdWI7Ci0JUHlfc3NpemVfdCBsZW4sIG4sIGo7Ci0JUHlfc3NpemVfdCBpID0gMCwgbGFzdCA9IFBZX1NTSVpFX1RfTUFYOworICAgIGNoYXIgKnMsICpzdWI7CisgICAgUHlfc3NpemVfdCBsZW4sIG4sIGo7CisgICAgUHlfc3NpemVfdCBpID0gMCwgbGFzdCA9IFBZX1NTSVpFX1RfTUFYOwogCi0JV0FSTjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInQjdCN8bm46cmZpbmQiLCAmcywgJmxlbiwgJnN1YiwgJm4sICZpLCAmbGFzdCkpCi0JCXJldHVybiBOVUxMOworICAgIFdBUk47CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ0I3QjfG5uOnJmaW5kIiwgJnMsICZsZW4sICZzdWIsICZuLCAmaSwgJmxhc3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChsYXN0ID4gbGVuKQotCQlsYXN0ID0gbGVuOwotCWlmIChsYXN0IDwgMCkKLQkJbGFzdCArPSBsZW47Ci0JaWYgKGxhc3QgPCAwKQotCQlsYXN0ID0gMDsKLQlpZiAoaSA8IDApCi0JCWkgKz0gbGVuOwotCWlmIChpIDwgMCkKLQkJaSA9IDA7CisgICAgaWYgKGxhc3QgPiBsZW4pCisgICAgICAgIGxhc3QgPSBsZW47CisgICAgaWYgKGxhc3QgPCAwKQorICAgICAgICBsYXN0ICs9IGxlbjsKKyAgICBpZiAobGFzdCA8IDApCisgICAgICAgIGxhc3QgPSAwOworICAgIGlmIChpIDwgMCkKKyAgICAgICAgaSArPSBsZW47CisgICAgaWYgKGkgPCAwKQorICAgICAgICBpID0gMDsKIAotCWlmIChuID09IDAgJiYgaSA8PSBsYXN0KQotCQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpbGFzdCk7CisgICAgaWYgKG4gPT0gMCAmJiBpIDw9IGxhc3QpCisgICAgICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZylsYXN0KTsKIAotCWZvciAoaiA9IGxhc3QtbjsgaiA+PSBpOyAtLWopCi0JCWlmIChzW2pdID09IHN1YlswXSAmJgotCQkgICAgKG4gPT0gMSB8fCBtZW1jbXAoJnNbaisxXSwgJnN1YlsxXSwgbi0xKSA9PSAwKSkKLQkJCXJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZylqKTsKKyAgICBmb3IgKGogPSBsYXN0LW47IGogPj0gaTsgLS1qKQorICAgICAgICBpZiAoc1tqXSA9PSBzdWJbMF0gJiYKKyAgICAgICAgICAgIChuID09IDEgfHwgbWVtY21wKCZzW2orMV0sICZzdWJbMV0sIG4tMSkgPT0gMCkpCisgICAgICAgICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpaik7CiAKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoLTFMKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoLTFMKTsKIH0KIAogCiBzdGF0aWMgUHlPYmplY3QgKgogZG9fc3RyaXAoUHlPYmplY3QgKmFyZ3MsIGludCBzdHJpcHR5cGUpCiB7Ci0JY2hhciAqczsKLQlQeV9zc2l6ZV90IGxlbiwgaSwgajsKKyAgICBjaGFyICpzOworICAgIFB5X3NzaXplX3QgbGVuLCBpLCBqOwogCiAKLQlpZiAoUHlTdHJpbmdfQXNTdHJpbmdBbmRTaXplKGFyZ3MsICZzLCAmbGVuKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKFB5U3RyaW5nX0FzU3RyaW5nQW5kU2l6ZShhcmdzLCAmcywgJmxlbikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaSA9IDA7Ci0JaWYgKHN0cmlwdHlwZSAhPSBSSUdIVFNUUklQKSB7Ci0JCXdoaWxlIChpIDwgbGVuICYmIGlzc3BhY2UoUHlfQ0hBUk1BU0soc1tpXSkpKSB7Ci0JCQlpKys7Ci0JCX0KLQl9CisgICAgaSA9IDA7CisgICAgaWYgKHN0cmlwdHlwZSAhPSBSSUdIVFNUUklQKSB7CisgICAgICAgIHdoaWxlIChpIDwgbGVuICYmIGlzc3BhY2UoUHlfQ0hBUk1BU0soc1tpXSkpKSB7CisgICAgICAgICAgICBpKys7CisgICAgICAgIH0KKyAgICB9CiAKLQlqID0gbGVuOwotCWlmIChzdHJpcHR5cGUgIT0gTEVGVFNUUklQKSB7Ci0JCWRvIHsKLQkJCWotLTsKLQkJfSB3aGlsZSAoaiA+PSBpICYmIGlzc3BhY2UoUHlfQ0hBUk1BU0soc1tqXSkpKTsKLQkJaisrOwotCX0KKyAgICBqID0gbGVuOworICAgIGlmIChzdHJpcHR5cGUgIT0gTEVGVFNUUklQKSB7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGotLTsKKyAgICAgICAgfSB3aGlsZSAoaiA+PSBpICYmIGlzc3BhY2UoUHlfQ0hBUk1BU0soc1tqXSkpKTsKKyAgICAgICAgaisrOworICAgIH0KIAotCWlmIChpID09IDAgJiYgaiA9PSBsZW4pIHsKLQkJUHlfSU5DUkVGKGFyZ3MpOwotCQlyZXR1cm4gYXJnczsKLQl9Ci0JZWxzZQotCQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocytpLCBqLWkpOworICAgIGlmIChpID09IDAgJiYgaiA9PSBsZW4pIHsKKyAgICAgICAgUHlfSU5DUkVGKGFyZ3MpOworICAgICAgICByZXR1cm4gYXJnczsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocytpLCBqLWkpOwogfQogCiAKQEAgLTQyMCw4ICs0MjAsOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHN0cm9wX3N0cmlwKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlXQVJOOwotCXJldHVybiBkb19zdHJpcChhcmdzLCBCT1RIU1RSSVApOworICAgIFdBUk47CisgICAgcmV0dXJuIGRvX3N0cmlwKGFyZ3MsIEJPVEhTVFJJUCk7CiB9CiAKIApAQCAtNDMzLDggKzQzMyw4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3Ryb3BfbHN0cmlwKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlXQVJOOwotCXJldHVybiBkb19zdHJpcChhcmdzLCBMRUZUU1RSSVApOworICAgIFdBUk47CisgICAgcmV0dXJuIGRvX3N0cmlwKGFyZ3MsIExFRlRTVFJJUCk7CiB9CiAKIApAQCAtNDQ2LDggKzQ0Niw4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3Ryb3BfcnN0cmlwKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlXQVJOOwotCXJldHVybiBkb19zdHJpcChhcmdzLCBSSUdIVFNUUklQKTsKKyAgICBXQVJOOworICAgIHJldHVybiBkb19zdHJpcChhcmdzLCBSSUdIVFNUUklQKTsKIH0KIAogCkBAIC00NTksMzQgKzQ1OSwzNCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHN0cm9wX2xvd2VyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpzLCAqc19uZXc7Ci0JUHlfc3NpemVfdCBpLCBuOwotCVB5T2JqZWN0ICpuZXdzdHI7Ci0JaW50IGNoYW5nZWQ7CisgICAgY2hhciAqcywgKnNfbmV3OworICAgIFB5X3NzaXplX3QgaSwgbjsKKyAgICBQeU9iamVjdCAqbmV3c3RyOworICAgIGludCBjaGFuZ2VkOwogCi0JV0FSTjsKLQlpZiAoUHlTdHJpbmdfQXNTdHJpbmdBbmRTaXplKGFyZ3MsICZzLCAmbikpCi0JCXJldHVybiBOVUxMOwotCW5ld3N0ciA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIG4pOwotCWlmIChuZXdzdHIgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0Jc19uZXcgPSBQeVN0cmluZ19Bc1N0cmluZyhuZXdzdHIpOwotCWNoYW5nZWQgPSAwOwotCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJaW50IGMgPSBQeV9DSEFSTUFTSygqcysrKTsKLQkJaWYgKGlzdXBwZXIoYykpIHsKLQkJCWNoYW5nZWQgPSAxOwotCQkJKnNfbmV3ID0gdG9sb3dlcihjKTsKLQkJfSBlbHNlCi0JCQkqc19uZXcgPSBjOwotCQlzX25ldysrOwotCX0KLQlpZiAoIWNoYW5nZWQpIHsKLQkJUHlfREVDUkVGKG5ld3N0cik7Ci0JCVB5X0lOQ1JFRihhcmdzKTsKLQkJcmV0dXJuIGFyZ3M7Ci0JfQotCXJldHVybiBuZXdzdHI7CisgICAgV0FSTjsKKyAgICBpZiAoUHlTdHJpbmdfQXNTdHJpbmdBbmRTaXplKGFyZ3MsICZzLCAmbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG5ld3N0ciA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIG4pOworICAgIGlmIChuZXdzdHIgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgc19uZXcgPSBQeVN0cmluZ19Bc1N0cmluZyhuZXdzdHIpOworICAgIGNoYW5nZWQgPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgaW50IGMgPSBQeV9DSEFSTUFTSygqcysrKTsKKyAgICAgICAgaWYgKGlzdXBwZXIoYykpIHsKKyAgICAgICAgICAgIGNoYW5nZWQgPSAxOworICAgICAgICAgICAgKnNfbmV3ID0gdG9sb3dlcihjKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAqc19uZXcgPSBjOworICAgICAgICBzX25ldysrOworICAgIH0KKyAgICBpZiAoIWNoYW5nZWQpIHsKKyAgICAgICAgUHlfREVDUkVGKG5ld3N0cik7CisgICAgICAgIFB5X0lOQ1JFRihhcmdzKTsKKyAgICAgICAgcmV0dXJuIGFyZ3M7CisgICAgfQorICAgIHJldHVybiBuZXdzdHI7CiB9CiAKIApAQCAtNDk4LDM0ICs0OTgsMzQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdHJvcF91cHBlcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqcywgKnNfbmV3OwotCVB5X3NzaXplX3QgaSwgbjsKLQlQeU9iamVjdCAqbmV3c3RyOwotCWludCBjaGFuZ2VkOworICAgIGNoYXIgKnMsICpzX25ldzsKKyAgICBQeV9zc2l6ZV90IGksIG47CisgICAgUHlPYmplY3QgKm5ld3N0cjsKKyAgICBpbnQgY2hhbmdlZDsKIAotCVdBUk47Ci0JaWYgKFB5U3RyaW5nX0FzU3RyaW5nQW5kU2l6ZShhcmdzLCAmcywgJm4pKQotCQlyZXR1cm4gTlVMTDsKLQluZXdzdHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBuKTsKLQlpZiAobmV3c3RyID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXNfbmV3ID0gUHlTdHJpbmdfQXNTdHJpbmcobmV3c3RyKTsKLQljaGFuZ2VkID0gMDsKLQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCWludCBjID0gUHlfQ0hBUk1BU0soKnMrKyk7Ci0JCWlmIChpc2xvd2VyKGMpKSB7Ci0JCQljaGFuZ2VkID0gMTsKLQkJCSpzX25ldyA9IHRvdXBwZXIoYyk7Ci0JCX0gZWxzZQotCQkJKnNfbmV3ID0gYzsKLQkJc19uZXcrKzsKLQl9Ci0JaWYgKCFjaGFuZ2VkKSB7Ci0JCVB5X0RFQ1JFRihuZXdzdHIpOwotCQlQeV9JTkNSRUYoYXJncyk7Ci0JCXJldHVybiBhcmdzOwotCX0KLQlyZXR1cm4gbmV3c3RyOworICAgIFdBUk47CisgICAgaWYgKFB5U3RyaW5nX0FzU3RyaW5nQW5kU2l6ZShhcmdzLCAmcywgJm4pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBuZXdzdHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBuKTsKKyAgICBpZiAobmV3c3RyID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHNfbmV3ID0gUHlTdHJpbmdfQXNTdHJpbmcobmV3c3RyKTsKKyAgICBjaGFuZ2VkID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIGludCBjID0gUHlfQ0hBUk1BU0soKnMrKyk7CisgICAgICAgIGlmIChpc2xvd2VyKGMpKSB7CisgICAgICAgICAgICBjaGFuZ2VkID0gMTsKKyAgICAgICAgICAgICpzX25ldyA9IHRvdXBwZXIoYyk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgKnNfbmV3ID0gYzsKKyAgICAgICAgc19uZXcrKzsKKyAgICB9CisgICAgaWYgKCFjaGFuZ2VkKSB7CisgICAgICAgIFB5X0RFQ1JFRihuZXdzdHIpOworICAgICAgICBQeV9JTkNSRUYoYXJncyk7CisgICAgICAgIHJldHVybiBhcmdzOworICAgIH0KKyAgICByZXR1cm4gbmV3c3RyOwogfQogCiAKQEAgLTUzOCw0MyArNTM4LDQzIEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3Ryb3BfY2FwaXRhbGl6ZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqcywgKnNfbmV3OwotCVB5X3NzaXplX3QgaSwgbjsKLQlQeU9iamVjdCAqbmV3c3RyOwotCWludCBjaGFuZ2VkOworICAgIGNoYXIgKnMsICpzX25ldzsKKyAgICBQeV9zc2l6ZV90IGksIG47CisgICAgUHlPYmplY3QgKm5ld3N0cjsKKyAgICBpbnQgY2hhbmdlZDsKIAotCVdBUk47Ci0JaWYgKFB5U3RyaW5nX0FzU3RyaW5nQW5kU2l6ZShhcmdzLCAmcywgJm4pKQotCQlyZXR1cm4gTlVMTDsKLQluZXdzdHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBuKTsKLQlpZiAobmV3c3RyID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXNfbmV3ID0gUHlTdHJpbmdfQXNTdHJpbmcobmV3c3RyKTsKLQljaGFuZ2VkID0gMDsKLQlpZiAoMCA8IG4pIHsKLQkJaW50IGMgPSBQeV9DSEFSTUFTSygqcysrKTsKLQkJaWYgKGlzbG93ZXIoYykpIHsKLQkJCWNoYW5nZWQgPSAxOwotCQkJKnNfbmV3ID0gdG91cHBlcihjKTsKLQkJfSBlbHNlCi0JCQkqc19uZXcgPSBjOwotCQlzX25ldysrOwotCX0KLQlmb3IgKGkgPSAxOyBpIDwgbjsgaSsrKSB7Ci0JCWludCBjID0gUHlfQ0hBUk1BU0soKnMrKyk7Ci0JCWlmIChpc3VwcGVyKGMpKSB7Ci0JCQljaGFuZ2VkID0gMTsKLQkJCSpzX25ldyA9IHRvbG93ZXIoYyk7Ci0JCX0gZWxzZQotCQkJKnNfbmV3ID0gYzsKLQkJc19uZXcrKzsKLQl9Ci0JaWYgKCFjaGFuZ2VkKSB7Ci0JCVB5X0RFQ1JFRihuZXdzdHIpOwotCQlQeV9JTkNSRUYoYXJncyk7Ci0JCXJldHVybiBhcmdzOwotCX0KLQlyZXR1cm4gbmV3c3RyOworICAgIFdBUk47CisgICAgaWYgKFB5U3RyaW5nX0FzU3RyaW5nQW5kU2l6ZShhcmdzLCAmcywgJm4pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBuZXdzdHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBuKTsKKyAgICBpZiAobmV3c3RyID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHNfbmV3ID0gUHlTdHJpbmdfQXNTdHJpbmcobmV3c3RyKTsKKyAgICBjaGFuZ2VkID0gMDsKKyAgICBpZiAoMCA8IG4pIHsKKyAgICAgICAgaW50IGMgPSBQeV9DSEFSTUFTSygqcysrKTsKKyAgICAgICAgaWYgKGlzbG93ZXIoYykpIHsKKyAgICAgICAgICAgIGNoYW5nZWQgPSAxOworICAgICAgICAgICAgKnNfbmV3ID0gdG91cHBlcihjKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAqc19uZXcgPSBjOworICAgICAgICBzX25ldysrOworICAgIH0KKyAgICBmb3IgKGkgPSAxOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIGludCBjID0gUHlfQ0hBUk1BU0soKnMrKyk7CisgICAgICAgIGlmIChpc3VwcGVyKGMpKSB7CisgICAgICAgICAgICBjaGFuZ2VkID0gMTsKKyAgICAgICAgICAgICpzX25ldyA9IHRvbG93ZXIoYyk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgKnNfbmV3ID0gYzsKKyAgICAgICAgc19uZXcrKzsKKyAgICB9CisgICAgaWYgKCFjaGFuZ2VkKSB7CisgICAgICAgIFB5X0RFQ1JFRihuZXdzdHIpOworICAgICAgICBQeV9JTkNSRUYoYXJncyk7CisgICAgICAgIHJldHVybiBhcmdzOworICAgIH0KKyAgICByZXR1cm4gbmV3c3RyOwogfQogCiAKQEAgLTU4OSw3NSArNTg5LDc1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3Ryb3BfZXhwYW5kdGFicyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JLyogT3JpZ2luYWwgYnkgRnJlZHJpayBMdW5kaCAqLwotCWNoYXIqIGU7Ci0JY2hhciogcDsKLQljaGFyKiBxOwotCVB5X3NzaXplX3QgaSwgaiwgb2xkX2o7Ci0JUHlPYmplY3QqIG91dDsKLQljaGFyKiBzdHJpbmc7Ci0JUHlfc3NpemVfdCBzdHJpbmdsZW47Ci0JaW50IHRhYnNpemUgPSA4OworICAgIC8qIE9yaWdpbmFsIGJ5IEZyZWRyaWsgTHVuZGggKi8KKyAgICBjaGFyKiBlOworICAgIGNoYXIqIHA7CisgICAgY2hhciogcTsKKyAgICBQeV9zc2l6ZV90IGksIGosIG9sZF9qOworICAgIFB5T2JqZWN0KiBvdXQ7CisgICAgY2hhciogc3RyaW5nOworICAgIFB5X3NzaXplX3Qgc3RyaW5nbGVuOworICAgIGludCB0YWJzaXplID0gODsKIAotCVdBUk47Ci0JLyogR2V0IGFyZ3VtZW50cyAqLwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyN8aTpleHBhbmR0YWJzIiwgJnN0cmluZywgJnN0cmluZ2xlbiwgJnRhYnNpemUpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAodGFic2l6ZSA8IDEpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJInRhYnNpemUgbXVzdCBiZSBhdCBsZWFzdCAxIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBXQVJOOworICAgIC8qIEdldCBhcmd1bWVudHMgKi8KKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjfGk6ZXhwYW5kdGFicyIsICZzdHJpbmcsICZzdHJpbmdsZW4sICZ0YWJzaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKHRhYnNpemUgPCAxKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInRhYnNpemUgbXVzdCBiZSBhdCBsZWFzdCAxIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCS8qIEZpcnN0IHBhc3M6IGRldGVybWluZSBzaXplIG9mIG91dHB1dCBzdHJpbmcgKi8KLQlpID0gaiA9IG9sZF9qID0gMDsgLyogajogY3VycmVudCBjb2x1bW47IGk6IHRvdGFsIG9mIHByZXZpb3VzIGxpbmVzICovCi0JZSA9IHN0cmluZyArIHN0cmluZ2xlbjsKLQlmb3IgKHAgPSBzdHJpbmc7IHAgPCBlOyBwKyspIHsKLQkJaWYgKCpwID09ICdcdCcpIHsKLQkJCWogKz0gdGFic2l6ZSAtIChqJXRhYnNpemUpOwotCQkJaWYgKG9sZF9qID4gaikgewotCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJCQkJIm5ldyBzdHJpbmcgaXMgdG9vIGxvbmciKTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJCW9sZF9qID0gajsKLQkJfSBlbHNlIHsKLQkJCWorKzsKLQkJCWlmICgqcCA9PSAnXG4nKSB7Ci0JCQkJaSArPSBqOwotCQkJCWogPSAwOwotCQkJfQotCQl9Ci0JfQorICAgIC8qIEZpcnN0IHBhc3M6IGRldGVybWluZSBzaXplIG9mIG91dHB1dCBzdHJpbmcgKi8KKyAgICBpID0gaiA9IG9sZF9qID0gMDsgLyogajogY3VycmVudCBjb2x1bW47IGk6IHRvdGFsIG9mIHByZXZpb3VzIGxpbmVzICovCisgICAgZSA9IHN0cmluZyArIHN0cmluZ2xlbjsKKyAgICBmb3IgKHAgPSBzdHJpbmc7IHAgPCBlOyBwKyspIHsKKyAgICAgICAgaWYgKCpwID09ICdcdCcpIHsKKyAgICAgICAgICAgIGogKz0gdGFic2l6ZSAtIChqJXRhYnNpemUpOworICAgICAgICAgICAgaWYgKG9sZF9qID4gaikgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmV3IHN0cmluZyBpcyB0b28gbG9uZyIpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb2xkX2ogPSBqOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaisrOworICAgICAgICAgICAgaWYgKCpwID09ICdcbicpIHsKKyAgICAgICAgICAgICAgICBpICs9IGo7CisgICAgICAgICAgICAgICAgaiA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAKLQlpZiAoKGkgKyBqKSA8IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsICJuZXcgc3RyaW5nIGlzIHRvbyBsb25nIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoKGkgKyBqKSA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsICJuZXcgc3RyaW5nIGlzIHRvbyBsb25nIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCS8qIFNlY29uZCBwYXNzOiBjcmVhdGUgb3V0cHV0IHN0cmluZyBhbmQgZmlsbCBpdCAqLwotCW91dCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGkraik7Ci0JaWYgKG91dCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICAvKiBTZWNvbmQgcGFzczogY3JlYXRlIG91dHB1dCBzdHJpbmcgYW5kIGZpbGwgaXQgKi8KKyAgICBvdXQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBpK2opOworICAgIGlmIChvdXQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpID0gMDsKLQlxID0gUHlTdHJpbmdfQVNfU1RSSU5HKG91dCk7CisgICAgaSA9IDA7CisgICAgcSA9IFB5U3RyaW5nX0FTX1NUUklORyhvdXQpOwogCi0JZm9yIChwID0gc3RyaW5nOyBwIDwgZTsgcCsrKSB7Ci0JCWlmICgqcCA9PSAnXHQnKSB7Ci0JCQlqID0gdGFic2l6ZSAtIChpJXRhYnNpemUpOwotCQkJaSArPSBqOwotCQkJd2hpbGUgKGotLSA+IDApCi0JCQkJKnErKyA9ICcgJzsKLQkJfSBlbHNlIHsKLQkJCSpxKysgPSAqcDsKLQkJCWkrKzsKLQkJCWlmICgqcCA9PSAnXG4nKQotCQkJCWkgPSAwOwotCQl9Ci0JfQorICAgIGZvciAocCA9IHN0cmluZzsgcCA8IGU7IHArKykgeworICAgICAgICBpZiAoKnAgPT0gJ1x0JykgeworICAgICAgICAgICAgaiA9IHRhYnNpemUgLSAoaSV0YWJzaXplKTsKKyAgICAgICAgICAgIGkgKz0gajsKKyAgICAgICAgICAgIHdoaWxlIChqLS0gPiAwKQorICAgICAgICAgICAgICAgICpxKysgPSAnICc7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqcSsrID0gKnA7CisgICAgICAgICAgICBpKys7CisgICAgICAgICAgICBpZiAoKnAgPT0gJ1xuJykKKyAgICAgICAgICAgICAgICBpID0gMDsKKyAgICAgICAgfQorICAgIH0KIAotCXJldHVybiBvdXQ7CisgICAgcmV0dXJuIG91dDsKIH0KIAogCkBAIC02NzEsMzggKzY3MSwzOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHN0cm9wX2NvdW50KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpzLCAqc3ViOwotCVB5X3NzaXplX3QgbGVuLCBuOwotCVB5X3NzaXplX3QgaSA9IDAsIGxhc3QgPSBQWV9TU0laRV9UX01BWDsKLQlQeV9zc2l6ZV90IG0sIHI7CisgICAgY2hhciAqcywgKnN1YjsKKyAgICBQeV9zc2l6ZV90IGxlbiwgbjsKKyAgICBQeV9zc2l6ZV90IGkgPSAwLCBsYXN0ID0gUFlfU1NJWkVfVF9NQVg7CisgICAgUHlfc3NpemVfdCBtLCByOwogCi0JV0FSTjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInQjdCN8bm46Y291bnQiLCAmcywgJmxlbiwgJnN1YiwgJm4sICZpLCAmbGFzdCkpCi0JCXJldHVybiBOVUxMOwotCWlmIChsYXN0ID4gbGVuKQotCQlsYXN0ID0gbGVuOwotCWlmIChsYXN0IDwgMCkKLQkJbGFzdCArPSBsZW47Ci0JaWYgKGxhc3QgPCAwKQotCQlsYXN0ID0gMDsKLQlpZiAoaSA8IDApCi0JCWkgKz0gbGVuOwotCWlmIChpIDwgMCkKLQkJaSA9IDA7Ci0JbSA9IGxhc3QgKyAxIC0gbjsKLQlpZiAobiA9PSAwKQotCQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIChtLWkpKTsKKyAgICBXQVJOOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAidCN0I3xubjpjb3VudCIsICZzLCAmbGVuLCAmc3ViLCAmbiwgJmksICZsYXN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKGxhc3QgPiBsZW4pCisgICAgICAgIGxhc3QgPSBsZW47CisgICAgaWYgKGxhc3QgPCAwKQorICAgICAgICBsYXN0ICs9IGxlbjsKKyAgICBpZiAobGFzdCA8IDApCisgICAgICAgIGxhc3QgPSAwOworICAgIGlmIChpIDwgMCkKKyAgICAgICAgaSArPSBsZW47CisgICAgaWYgKGkgPCAwKQorICAgICAgICBpID0gMDsKKyAgICBtID0gbGFzdCArIDEgLSBuOworICAgIGlmIChuID09IDApCisgICAgICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZykgKG0taSkpOwogCi0JciA9IDA7Ci0Jd2hpbGUgKGkgPCBtKSB7Ci0JCWlmICghbWVtY21wKHMraSwgc3ViLCBuKSkgewotCQkJcisrOwotCQkJaSArPSBuOwotCQl9IGVsc2UgewotCQkJaSsrOwotCQl9Ci0JfQotCXJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZykgcik7CisgICAgciA9IDA7CisgICAgd2hpbGUgKGkgPCBtKSB7CisgICAgICAgIGlmICghbWVtY21wKHMraSwgc3ViLCBuKSkgeworICAgICAgICAgICAgcisrOworICAgICAgICAgICAgaSArPSBuOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaSsrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZykgcik7CiB9CiAKIApAQCAtNzE1LDM5ICs3MTUsMzkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdHJvcF9zd2FwY2FzZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqcywgKnNfbmV3OwotCVB5X3NzaXplX3QgaSwgbjsKLQlQeU9iamVjdCAqbmV3c3RyOwotCWludCBjaGFuZ2VkOworICAgIGNoYXIgKnMsICpzX25ldzsKKyAgICBQeV9zc2l6ZV90IGksIG47CisgICAgUHlPYmplY3QgKm5ld3N0cjsKKyAgICBpbnQgY2hhbmdlZDsKIAotCVdBUk47Ci0JaWYgKFB5U3RyaW5nX0FzU3RyaW5nQW5kU2l6ZShhcmdzLCAmcywgJm4pKQotCQlyZXR1cm4gTlVMTDsKLQluZXdzdHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBuKTsKLQlpZiAobmV3c3RyID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXNfbmV3ID0gUHlTdHJpbmdfQXNTdHJpbmcobmV3c3RyKTsKLQljaGFuZ2VkID0gMDsKLQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCWludCBjID0gUHlfQ0hBUk1BU0soKnMrKyk7Ci0JCWlmIChpc2xvd2VyKGMpKSB7Ci0JCQljaGFuZ2VkID0gMTsKLQkJCSpzX25ldyA9IHRvdXBwZXIoYyk7Ci0JCX0KLQkJZWxzZSBpZiAoaXN1cHBlcihjKSkgewotCQkJY2hhbmdlZCA9IDE7Ci0JCQkqc19uZXcgPSB0b2xvd2VyKGMpOwotCQl9Ci0JCWVsc2UKLQkJCSpzX25ldyA9IGM7Ci0JCXNfbmV3Kys7Ci0JfQotCWlmICghY2hhbmdlZCkgewotCQlQeV9ERUNSRUYobmV3c3RyKTsKLQkJUHlfSU5DUkVGKGFyZ3MpOwotCQlyZXR1cm4gYXJnczsKLQl9Ci0JcmV0dXJuIG5ld3N0cjsKKyAgICBXQVJOOworICAgIGlmIChQeVN0cmluZ19Bc1N0cmluZ0FuZFNpemUoYXJncywgJnMsICZuKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbmV3c3RyID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbik7CisgICAgaWYgKG5ld3N0ciA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBzX25ldyA9IFB5U3RyaW5nX0FzU3RyaW5nKG5ld3N0cik7CisgICAgY2hhbmdlZCA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICBpbnQgYyA9IFB5X0NIQVJNQVNLKCpzKyspOworICAgICAgICBpZiAoaXNsb3dlcihjKSkgeworICAgICAgICAgICAgY2hhbmdlZCA9IDE7CisgICAgICAgICAgICAqc19uZXcgPSB0b3VwcGVyKGMpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGlzdXBwZXIoYykpIHsKKyAgICAgICAgICAgIGNoYW5nZWQgPSAxOworICAgICAgICAgICAgKnNfbmV3ID0gdG9sb3dlcihjKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICAqc19uZXcgPSBjOworICAgICAgICBzX25ldysrOworICAgIH0KKyAgICBpZiAoIWNoYW5nZWQpIHsKKyAgICAgICAgUHlfREVDUkVGKG5ld3N0cik7CisgICAgICAgIFB5X0lOQ1JFRihhcmdzKTsKKyAgICAgICAgcmV0dXJuIGFyZ3M7CisgICAgfQorICAgIHJldHVybiBuZXdzdHI7CiB9CiAKIApAQCAtNzY0LDQ1ICs3NjQsNDUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdHJvcF9hdG9pKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpzLCAqZW5kOwotCWludCBiYXNlID0gMTA7Ci0JbG9uZyB4OwotCWNoYXIgYnVmZmVyWzI1Nl07IC8qIEZvciBlcnJvcnMgKi8KKyAgICBjaGFyICpzLCAqZW5kOworICAgIGludCBiYXNlID0gMTA7CisgICAgbG9uZyB4OworICAgIGNoYXIgYnVmZmVyWzI1Nl07IC8qIEZvciBlcnJvcnMgKi8KIAotCVdBUk47Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzfGk6YXRvaSIsICZzLCAmYmFzZSkpCi0JCXJldHVybiBOVUxMOworICAgIFdBUk47CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzfGk6YXRvaSIsICZzLCAmYmFzZSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKChiYXNlICE9IDAgJiYgYmFzZSA8IDIpIHx8IGJhc2UgPiAzNikgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImludmFsaWQgYmFzZSBmb3IgYXRvaSgpIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoKGJhc2UgIT0gMCAmJiBiYXNlIDwgMikgfHwgYmFzZSA+IDM2KSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiaW52YWxpZCBiYXNlIGZvciBhdG9pKCkiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0Jd2hpbGUgKCpzICYmIGlzc3BhY2UoUHlfQ0hBUk1BU0soKnMpKSkKLQkJcysrOwotCWVycm5vID0gMDsKLQlpZiAoYmFzZSA9PSAwICYmIHNbMF0gPT0gJzAnKQotCQl4ID0gKGxvbmcpIFB5T1Nfc3RydG91bChzLCAmZW5kLCBiYXNlKTsKLQllbHNlCi0JCXggPSBQeU9TX3N0cnRvbChzLCAmZW5kLCBiYXNlKTsKLQlpZiAoZW5kID09IHMgfHwgIWlzYWxudW0oUHlfQ0hBUk1BU0soZW5kWy0xXSkpKQotCQlnb3RvIGJhZDsKLQl3aGlsZSAoKmVuZCAmJiBpc3NwYWNlKFB5X0NIQVJNQVNLKCplbmQpKSkKLQkJZW5kKys7Ci0JaWYgKCplbmQgIT0gJ1wwJykgeworICAgIHdoaWxlICgqcyAmJiBpc3NwYWNlKFB5X0NIQVJNQVNLKCpzKSkpCisgICAgICAgIHMrKzsKKyAgICBlcnJubyA9IDA7CisgICAgaWYgKGJhc2UgPT0gMCAmJiBzWzBdID09ICcwJykKKyAgICAgICAgeCA9IChsb25nKSBQeU9TX3N0cnRvdWwocywgJmVuZCwgYmFzZSk7CisgICAgZWxzZQorICAgICAgICB4ID0gUHlPU19zdHJ0b2wocywgJmVuZCwgYmFzZSk7CisgICAgaWYgKGVuZCA9PSBzIHx8ICFpc2FsbnVtKFB5X0NIQVJNQVNLKGVuZFstMV0pKSkKKyAgICAgICAgZ290byBiYWQ7CisgICAgd2hpbGUgKCplbmQgJiYgaXNzcGFjZShQeV9DSEFSTUFTSygqZW5kKSkpCisgICAgICAgIGVuZCsrOworICAgIGlmICgqZW5kICE9ICdcMCcpIHsKICAgYmFkOgotCQlQeU9TX3NucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksCi0JCQkgICAgICAiaW52YWxpZCBsaXRlcmFsIGZvciBhdG9pKCk6ICUuMjAwcyIsIHMpOwotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgYnVmZmVyKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWVsc2UgaWYgKGVycm5vICE9IDApIHsKLQkJUHlPU19zbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCAKLQkJCSAgICAgICJhdG9pKCkgbGl0ZXJhbCB0b28gbGFyZ2U6ICUuMjAwcyIsIHMpOwotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgYnVmZmVyKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBQeUludF9Gcm9tTG9uZyh4KTsKKyAgICAgICAgUHlPU19zbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLAorICAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIGxpdGVyYWwgZm9yIGF0b2koKTogJS4yMDBzIiwgcyk7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCBidWZmZXIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZWxzZSBpZiAoZXJybm8gIT0gMCkgeworICAgICAgICBQeU9TX3NucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksCisgICAgICAgICAgICAgICAgICAgICAgImF0b2koKSBsaXRlcmFsIHRvbyBsYXJnZTogJS4yMDBzIiwgcyk7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCBidWZmZXIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHgpOwogfQogCiAKQEAgLTgyMCw0MSArODIwLDQxIEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3Ryb3BfYXRvbChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqcywgKmVuZDsKLQlpbnQgYmFzZSA9IDEwOwotCVB5T2JqZWN0ICp4OwotCWNoYXIgYnVmZmVyWzI1Nl07IC8qIEZvciBlcnJvcnMgKi8KKyAgICBjaGFyICpzLCAqZW5kOworICAgIGludCBiYXNlID0gMTA7CisgICAgUHlPYmplY3QgKng7CisgICAgY2hhciBidWZmZXJbMjU2XTsgLyogRm9yIGVycm9ycyAqLwogCi0JV0FSTjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInN8aTphdG9sIiwgJnMsICZiYXNlKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgV0FSTjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInN8aTphdG9sIiwgJnMsICZiYXNlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoKGJhc2UgIT0gMCAmJiBiYXNlIDwgMikgfHwgYmFzZSA+IDM2KSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiaW52YWxpZCBiYXNlIGZvciBhdG9sKCkiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICgoYmFzZSAhPSAwICYmIGJhc2UgPCAyKSB8fCBiYXNlID4gMzYpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJpbnZhbGlkIGJhc2UgZm9yIGF0b2woKSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQl3aGlsZSAoKnMgJiYgaXNzcGFjZShQeV9DSEFSTUFTSygqcykpKQotCQlzKys7Ci0JaWYgKHNbMF0gPT0gJ1wwJykgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImVtcHR5IHN0cmluZyBmb3IgYXRvbCgpIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQl4ID0gUHlMb25nX0Zyb21TdHJpbmcocywgJmVuZCwgYmFzZSk7Ci0JaWYgKHggPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKGJhc2UgPT0gMCAmJiAoKmVuZCA9PSAnbCcgfHwgKmVuZCA9PSAnTCcpKQotCQllbmQrKzsKLQl3aGlsZSAoKmVuZCAmJiBpc3NwYWNlKFB5X0NIQVJNQVNLKCplbmQpKSkKLQkJZW5kKys7Ci0JaWYgKCplbmQgIT0gJ1wwJykgewotCQlQeU9TX3NucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksCi0JCQkgICAgICAiaW52YWxpZCBsaXRlcmFsIGZvciBhdG9sKCk6ICUuMjAwcyIsIHMpOwotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgYnVmZmVyKTsKLQkJUHlfREVDUkVGKHgpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIHg7CisgICAgd2hpbGUgKCpzICYmIGlzc3BhY2UoUHlfQ0hBUk1BU0soKnMpKSkKKyAgICAgICAgcysrOworICAgIGlmIChzWzBdID09ICdcMCcpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJlbXB0eSBzdHJpbmcgZm9yIGF0b2woKSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgeCA9IFB5TG9uZ19Gcm9tU3RyaW5nKHMsICZlbmQsIGJhc2UpOworICAgIGlmICh4ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChiYXNlID09IDAgJiYgKCplbmQgPT0gJ2wnIHx8ICplbmQgPT0gJ0wnKSkKKyAgICAgICAgZW5kKys7CisgICAgd2hpbGUgKCplbmQgJiYgaXNzcGFjZShQeV9DSEFSTUFTSygqZW5kKSkpCisgICAgICAgIGVuZCsrOworICAgIGlmICgqZW5kICE9ICdcMCcpIHsKKyAgICAgICAgUHlPU19zbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLAorICAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIGxpdGVyYWwgZm9yIGF0b2woKTogJS4yMDBzIiwgcyk7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCBidWZmZXIpOworICAgICAgICBQeV9ERUNSRUYoeCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4geDsKIH0KIAogCkBAIC04NjYsMzggKzg2NiwzOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHN0cm9wX2F0b2YoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKnMsICplbmQ7Ci0JZG91YmxlIHg7Ci0JY2hhciBidWZmZXJbMjU2XTsgLyogRm9yIGVycm9ycyAqLworICAgIGNoYXIgKnMsICplbmQ7CisgICAgZG91YmxlIHg7CisgICAgY2hhciBidWZmZXJbMjU2XTsgLyogRm9yIGVycm9ycyAqLwogCi0JV0FSTjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6YXRvZiIsICZzKSkKLQkJcmV0dXJuIE5VTEw7Ci0Jd2hpbGUgKCpzICYmIGlzc3BhY2UoUHlfQ0hBUk1BU0soKnMpKSkKLQkJcysrOwotCWlmIChzWzBdID09ICdcMCcpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJlbXB0eSBzdHJpbmcgZm9yIGF0b2YoKSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZXJybm8gPSAwOwotCVB5RlBFX1NUQVJUX1BST1RFQ1QoInN0cm9wX2F0b2YiLCByZXR1cm4gMCkKLQl4ID0gUHlPU19hc2NpaV9zdHJ0b2QocywgJmVuZCk7Ci0JUHlGUEVfRU5EX1BST1RFQ1QoeCkKLQl3aGlsZSAoKmVuZCAmJiBpc3NwYWNlKFB5X0NIQVJNQVNLKCplbmQpKSkKLQkJZW5kKys7Ci0JaWYgKCplbmQgIT0gJ1wwJykgewotCQlQeU9TX3NucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksCi0JCQkgICAgICAiaW52YWxpZCBsaXRlcmFsIGZvciBhdG9mKCk6ICUuMjAwcyIsIHMpOwotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgYnVmZmVyKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWVsc2UgaWYgKGVycm5vICE9IDApIHsKLQkJUHlPU19zbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCAKLQkJCSAgICAgICJhdG9mKCkgbGl0ZXJhbCB0b28gbGFyZ2U6ICUuMjAwcyIsIHMpOwotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgYnVmZmVyKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoeCk7CisgICAgV0FSTjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6YXRvZiIsICZzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgd2hpbGUgKCpzICYmIGlzc3BhY2UoUHlfQ0hBUk1BU0soKnMpKSkKKyAgICAgICAgcysrOworICAgIGlmIChzWzBdID09ICdcMCcpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJlbXB0eSBzdHJpbmcgZm9yIGF0b2YoKSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZXJybm8gPSAwOworICAgIFB5RlBFX1NUQVJUX1BST1RFQ1QoInN0cm9wX2F0b2YiLCByZXR1cm4gMCkKKyAgICB4ID0gUHlPU19hc2NpaV9zdHJ0b2QocywgJmVuZCk7CisgICAgUHlGUEVfRU5EX1BST1RFQ1QoeCkKKyAgICB3aGlsZSAoKmVuZCAmJiBpc3NwYWNlKFB5X0NIQVJNQVNLKCplbmQpKSkKKyAgICAgICAgZW5kKys7CisgICAgaWYgKCplbmQgIT0gJ1wwJykgeworICAgICAgICBQeU9TX3NucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksCisgICAgICAgICAgICAgICAgICAgICAgImludmFsaWQgbGl0ZXJhbCBmb3IgYXRvZigpOiAlLjIwMHMiLCBzKTsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsIGJ1ZmZlcik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBlbHNlIGlmIChlcnJubyAhPSAwKSB7CisgICAgICAgIFB5T1Nfc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAiYXRvZigpIGxpdGVyYWwgdG9vIGxhcmdlOiAlLjIwMHMiLCBzKTsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsIGJ1ZmZlcik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKHgpOwogfQogCiAKQEAgLTkxMSwyOSArOTExLDI5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3Ryb3BfbWFrZXRyYW5zKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQl1bnNpZ25lZCBjaGFyICpjLCAqZnJvbT1OVUxMLCAqdG89TlVMTDsKLQlQeV9zc2l6ZV90IGksIGZyb21sZW49MCwgdG9sZW49MDsKLQlQeU9iamVjdCAqcmVzdWx0OworICAgIHVuc2lnbmVkIGNoYXIgKmMsICpmcm9tPU5VTEwsICp0bz1OVUxMOworICAgIFB5X3NzaXplX3QgaSwgZnJvbWxlbj0wLCB0b2xlbj0wOworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInQjdCM6bWFrZXRyYW5zIiwgJmZyb20sICZmcm9tbGVuLCAmdG8sICZ0b2xlbikpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAidCN0IzptYWtldHJhbnMiLCAmZnJvbSwgJmZyb21sZW4sICZ0bywgJnRvbGVuKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoZnJvbWxlbiAhPSB0b2xlbikgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkibWFrZXRyYW5zIGFyZ3VtZW50cyBtdXN0IGhhdmUgc2FtZSBsZW5ndGgiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChmcm9tbGVuICE9IHRvbGVuKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIm1ha2V0cmFucyBhcmd1bWVudHMgbXVzdCBoYXZlIHNhbWUgbGVuZ3RoIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXJlc3VsdCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopTlVMTCwgMjU2KTsKLQlpZiAocmVzdWx0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWMgPSAodW5zaWduZWQgY2hhciAqKSBQeVN0cmluZ19BU19TVFJJTkcoKFB5U3RyaW5nT2JqZWN0ICopcmVzdWx0KTsKLQlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCi0JCWNbaV09KHVuc2lnbmVkIGNoYXIpaTsKLQlmb3IgKGkgPSAwOyBpIDwgZnJvbWxlbjsgaSsrKQotCQljW2Zyb21baV1dPXRvW2ldOworICAgIHJlc3VsdCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopTlVMTCwgMjU2KTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGMgPSAodW5zaWduZWQgY2hhciAqKSBQeVN0cmluZ19BU19TVFJJTkcoKFB5U3RyaW5nT2JqZWN0ICopcmVzdWx0KTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCisgICAgICAgIGNbaV09KHVuc2lnbmVkIGNoYXIpaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgZnJvbWxlbjsgaSsrKQorICAgICAgICBjW2Zyb21baV1dPXRvW2ldOwogCi0JcmV0dXJuIHJlc3VsdDsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiAKQEAgLTk0OCw2OSArOTQ4LDY5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3Ryb3BfdHJhbnNsYXRlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZWdpc3RlciBjaGFyICppbnB1dCwgKnRhYmxlLCAqb3V0cHV0OwotCVB5X3NzaXplX3QgaTsgCi0JaW50IGMsIGNoYW5nZWQgPSAwOwotCVB5T2JqZWN0ICppbnB1dF9vYmo7Ci0JY2hhciAqdGFibGUxLCAqb3V0cHV0X3N0YXJ0LCAqZGVsX3RhYmxlPU5VTEw7Ci0JUHlfc3NpemVfdCBpbmxlbiwgdGFibGVuLCBkZWxsZW4gPSAwOwotCVB5T2JqZWN0ICpyZXN1bHQ7Ci0JaW50IHRyYW5zX3RhYmxlWzI1Nl07CisgICAgcmVnaXN0ZXIgY2hhciAqaW5wdXQsICp0YWJsZSwgKm91dHB1dDsKKyAgICBQeV9zc2l6ZV90IGk7CisgICAgaW50IGMsIGNoYW5nZWQgPSAwOworICAgIFB5T2JqZWN0ICppbnB1dF9vYmo7CisgICAgY2hhciAqdGFibGUxLCAqb3V0cHV0X3N0YXJ0LCAqZGVsX3RhYmxlPU5VTEw7CisgICAgUHlfc3NpemVfdCBpbmxlbiwgdGFibGVuLCBkZWxsZW4gPSAwOworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisgICAgaW50IHRyYW5zX3RhYmxlWzI1Nl07CiAKLQlXQVJOOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiU3QjfHQjOnRyYW5zbGF0ZSIsICZpbnB1dF9vYmosCi0JCQkgICAgICAmdGFibGUxLCAmdGFibGVuLCAmZGVsX3RhYmxlLCAmZGVsbGVuKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKHRhYmxlbiAhPSAyNTYpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkgICAgICAidHJhbnNsYXRpb24gdGFibGUgbXVzdCBiZSAyNTYgY2hhcmFjdGVycyBsb25nIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBXQVJOOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiU3QjfHQjOnRyYW5zbGF0ZSIsICZpbnB1dF9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0YWJsZTEsICZ0YWJsZW4sICZkZWxfdGFibGUsICZkZWxsZW4pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAodGFibGVuICE9IDI1NikgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAidHJhbnNsYXRpb24gdGFibGUgbXVzdCBiZSAyNTYgY2hhcmFjdGVycyBsb25nIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXRhYmxlID0gdGFibGUxOwotCWlubGVuID0gUHlTdHJpbmdfR0VUX1NJWkUoaW5wdXRfb2JqKTsKLQlyZXN1bHQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKU5VTEwsIGlubGVuKTsKLQlpZiAocmVzdWx0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCW91dHB1dF9zdGFydCA9IG91dHB1dCA9IFB5U3RyaW5nX0FzU3RyaW5nKHJlc3VsdCk7Ci0JaW5wdXQgPSBQeVN0cmluZ19Bc1N0cmluZyhpbnB1dF9vYmopOworICAgIHRhYmxlID0gdGFibGUxOworICAgIGlubGVuID0gUHlTdHJpbmdfR0VUX1NJWkUoaW5wdXRfb2JqKTsKKyAgICByZXN1bHQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKU5VTEwsIGlubGVuKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG91dHB1dF9zdGFydCA9IG91dHB1dCA9IFB5U3RyaW5nX0FzU3RyaW5nKHJlc3VsdCk7CisgICAgaW5wdXQgPSBQeVN0cmluZ19Bc1N0cmluZyhpbnB1dF9vYmopOwogCi0JaWYgKGRlbGxlbiA9PSAwKSB7Ci0JCS8qIElmIG5vIGRlbGV0aW9ucyBhcmUgcmVxdWlyZWQsIHVzZSBmYXN0ZXIgY29kZSAqLwotCQlmb3IgKGkgPSBpbmxlbjsgLS1pID49IDA7ICkgewotCQkJYyA9IFB5X0NIQVJNQVNLKCppbnB1dCsrKTsKLQkJCWlmIChQeV9DSEFSTUFTSygoKm91dHB1dCsrID0gdGFibGVbY10pKSAhPSBjKQotCQkJCWNoYW5nZWQgPSAxOwotCQl9Ci0JCWlmIChjaGFuZ2VkKQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCVB5X0lOQ1JFRihpbnB1dF9vYmopOwotCQlyZXR1cm4gaW5wdXRfb2JqOwotCX0KKyAgICBpZiAoZGVsbGVuID09IDApIHsKKyAgICAgICAgLyogSWYgbm8gZGVsZXRpb25zIGFyZSByZXF1aXJlZCwgdXNlIGZhc3RlciBjb2RlICovCisgICAgICAgIGZvciAoaSA9IGlubGVuOyAtLWkgPj0gMDsgKSB7CisgICAgICAgICAgICBjID0gUHlfQ0hBUk1BU0soKmlucHV0KyspOworICAgICAgICAgICAgaWYgKFB5X0NIQVJNQVNLKCgqb3V0cHV0KysgPSB0YWJsZVtjXSkpICE9IGMpCisgICAgICAgICAgICAgICAgY2hhbmdlZCA9IDE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNoYW5nZWQpCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgUHlfSU5DUkVGKGlucHV0X29iaik7CisgICAgICAgIHJldHVybiBpbnB1dF9vYmo7CisgICAgfQogCi0JZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQotCQl0cmFuc190YWJsZVtpXSA9IFB5X0NIQVJNQVNLKHRhYmxlW2ldKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCisgICAgICAgIHRyYW5zX3RhYmxlW2ldID0gUHlfQ0hBUk1BU0sodGFibGVbaV0pOwogCi0JZm9yIChpID0gMDsgaSA8IGRlbGxlbjsgaSsrKQotCQl0cmFuc190YWJsZVsoaW50KSBQeV9DSEFSTUFTSyhkZWxfdGFibGVbaV0pXSA9IC0xOworICAgIGZvciAoaSA9IDA7IGkgPCBkZWxsZW47IGkrKykKKyAgICAgICAgdHJhbnNfdGFibGVbKGludCkgUHlfQ0hBUk1BU0soZGVsX3RhYmxlW2ldKV0gPSAtMTsKIAotCWZvciAoaSA9IGlubGVuOyAtLWkgPj0gMDsgKSB7Ci0JCWMgPSBQeV9DSEFSTUFTSygqaW5wdXQrKyk7Ci0JCWlmICh0cmFuc190YWJsZVtjXSAhPSAtMSkKLQkJCWlmIChQeV9DSEFSTUFTSygqb3V0cHV0KysgPSAoY2hhcil0cmFuc190YWJsZVtjXSkgPT0gYykKLQkJCQljb250aW51ZTsKLQkJY2hhbmdlZCA9IDE7Ci0JfQotCWlmICghY2hhbmdlZCkgewotCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJUHlfSU5DUkVGKGlucHV0X29iaik7Ci0JCXJldHVybiBpbnB1dF9vYmo7Ci0JfQotCS8qIEZpeCB0aGUgc2l6ZSBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZyAqLwotCWlmIChpbmxlbiA+IDApCi0JCV9QeVN0cmluZ19SZXNpemUoJnJlc3VsdCwgb3V0cHV0IC0gb3V0cHV0X3N0YXJ0KTsKLQlyZXR1cm4gcmVzdWx0OworICAgIGZvciAoaSA9IGlubGVuOyAtLWkgPj0gMDsgKSB7CisgICAgICAgIGMgPSBQeV9DSEFSTUFTSygqaW5wdXQrKyk7CisgICAgICAgIGlmICh0cmFuc190YWJsZVtjXSAhPSAtMSkKKyAgICAgICAgICAgIGlmIChQeV9DSEFSTUFTSygqb3V0cHV0KysgPSAoY2hhcil0cmFuc190YWJsZVtjXSkgPT0gYykKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgY2hhbmdlZCA9IDE7CisgICAgfQorICAgIGlmICghY2hhbmdlZCkgeworICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgUHlfSU5DUkVGKGlucHV0X29iaik7CisgICAgICAgIHJldHVybiBpbnB1dF9vYmo7CisgICAgfQorICAgIC8qIEZpeCB0aGUgc2l6ZSBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZyAqLworICAgIGlmIChpbmxlbiA+IDApCisgICAgICAgIF9QeVN0cmluZ19SZXNpemUoJnJlc3VsdCwgb3V0cHV0IC0gb3V0cHV0X3N0YXJ0KTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiAKQEAgLTEwMjYsMjIgKzEwMjYsMjIgQEAKICAgZm91bmQsIG9yIC0xIGlmIG5vdCBmb3VuZC4gIElmIGxlbiBvZiBQQVQgaXMgZ3JlYXRlciB0aGFuIGxlbmd0aCBvZgogICBNRU0sIHRoZSBmdW5jdGlvbiByZXR1cm5zIC0xLgogKi8KLXN0YXRpYyBQeV9zc2l6ZV90IAorc3RhdGljIFB5X3NzaXplX3QKIG15bWVtZmluZChjb25zdCBjaGFyICptZW0sIFB5X3NzaXplX3QgbGVuLCBjb25zdCBjaGFyICpwYXQsIFB5X3NzaXplX3QgcGF0X2xlbikKIHsKLQlyZWdpc3RlciBQeV9zc2l6ZV90IGlpOworICAgIHJlZ2lzdGVyIFB5X3NzaXplX3QgaWk7CiAKLQkvKiBwYXR0ZXJuIGNhbiBub3Qgb2NjdXIgaW4gdGhlIGxhc3QgcGF0X2xlbi0xIGNoYXJzICovCi0JbGVuIC09IHBhdF9sZW47CisgICAgLyogcGF0dGVybiBjYW4gbm90IG9jY3VyIGluIHRoZSBsYXN0IHBhdF9sZW4tMSBjaGFycyAqLworICAgIGxlbiAtPSBwYXRfbGVuOwogCi0JZm9yIChpaSA9IDA7IGlpIDw9IGxlbjsgaWkrKykgewotCQlpZiAobWVtW2lpXSA9PSBwYXRbMF0gJiYKLQkJICAgIChwYXRfbGVuID09IDEgfHwKLQkJICAgICBtZW1jbXAoJm1lbVtpaSsxXSwgJnBhdFsxXSwgcGF0X2xlbi0xKSA9PSAwKSkgewotCQkJcmV0dXJuIGlpOwotCQl9Ci0JfQotCXJldHVybiAtMTsKKyAgICBmb3IgKGlpID0gMDsgaWkgPD0gbGVuOyBpaSsrKSB7CisgICAgICAgIGlmIChtZW1baWldID09IHBhdFswXSAmJgorICAgICAgICAgICAgKHBhdF9sZW4gPT0gMSB8fAorICAgICAgICAgICAgIG1lbWNtcCgmbWVtW2lpKzFdLCAmcGF0WzFdLCBwYXRfbGVuLTEpID09IDApKSB7CisgICAgICAgICAgICByZXR1cm4gaWk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIC0xOwogfQogCiAvKgpAQCAtMTA0OSwyMyArMTA0OSwyMyBAQAogCiAgICBSZXR1cm4gdGhlIG51bWJlciBvZiBkaXN0aW5jdCB0aW1lcyBQQVQgaXMgZm91bmQgaW4gTUVNLgogICAgbWVhbmluZyBtZW09MTExMSBhbmQgcGF0PT0xMSByZXR1cm5zIDIuCi0gICAgICAgICAgIG1lbT0xMTExMSBhbmQgcGF0PT0xMSBhbHNvIHJldHVybiAyLgorICAgICAgIG1lbT0xMTExMSBhbmQgcGF0PT0xMSBhbHNvIHJldHVybiAyLgogICovCi1zdGF0aWMgUHlfc3NpemVfdCAKK3N0YXRpYyBQeV9zc2l6ZV90CiBteW1lbWNudChjb25zdCBjaGFyICptZW0sIFB5X3NzaXplX3QgbGVuLCBjb25zdCBjaGFyICpwYXQsIFB5X3NzaXplX3QgcGF0X2xlbikKIHsKLQlyZWdpc3RlciBQeV9zc2l6ZV90IG9mZnNldCA9IDA7Ci0JUHlfc3NpemVfdCBuZm91bmQgPSAwOworICAgIHJlZ2lzdGVyIFB5X3NzaXplX3Qgb2Zmc2V0ID0gMDsKKyAgICBQeV9zc2l6ZV90IG5mb3VuZCA9IDA7CiAKLQl3aGlsZSAobGVuID49IDApIHsKLQkJb2Zmc2V0ID0gbXltZW1maW5kKG1lbSwgbGVuLCBwYXQsIHBhdF9sZW4pOwotCQlpZiAob2Zmc2V0ID09IC0xKQotCQkJYnJlYWs7Ci0JCW1lbSArPSBvZmZzZXQgKyBwYXRfbGVuOwotCQlsZW4gLT0gb2Zmc2V0ICsgcGF0X2xlbjsKLQkJbmZvdW5kKys7Ci0JfQotCXJldHVybiBuZm91bmQ7CisgICAgd2hpbGUgKGxlbiA+PSAwKSB7CisgICAgICAgIG9mZnNldCA9IG15bWVtZmluZChtZW0sIGxlbiwgcGF0LCBwYXRfbGVuKTsKKyAgICAgICAgaWYgKG9mZnNldCA9PSAtMSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBtZW0gKz0gb2Zmc2V0ICsgcGF0X2xlbjsKKyAgICAgICAgbGVuIC09IG9mZnNldCArIHBhdF9sZW47CisgICAgICAgIG5mb3VuZCsrOworICAgIH0KKyAgICByZXR1cm4gbmZvdW5kOwogfQogCiAvKgpAQCAtMTA4OCw2OSArMTA4OCw2OSBAQAogICAgICAgIE5VTEwgaWYgYW4gZXJyb3Igb2NjdXJyZWQuCiAqLwogc3RhdGljIGNoYXIgKgotbXltZW1yZXBsYWNlKGNvbnN0IGNoYXIgKnN0ciwgUHlfc3NpemVfdCBsZW4sCQkvKiBpbnB1dCBzdHJpbmcgKi8KLSAgICAgICAgICAgICBjb25zdCBjaGFyICpwYXQsIFB5X3NzaXplX3QgcGF0X2xlbiwJLyogcGF0dGVybiBzdHJpbmcgdG8gZmluZCAqLwotICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnN1YiwgUHlfc3NpemVfdCBzdWJfbGVuLAkvKiBzdWJzdGl0dXRpb24gc3RyaW5nICovCi0gICAgICAgICAgICAgUHlfc3NpemVfdCBjb3VudCwJCQkJLyogbnVtYmVyIG9mIHJlcGxhY2VtZW50cyAqLwotCSAgICAgUHlfc3NpemVfdCAqb3V0X2xlbikKK215bWVtcmVwbGFjZShjb25zdCBjaGFyICpzdHIsIFB5X3NzaXplX3QgbGVuLCAgICAgICAgICAgLyogaW5wdXQgc3RyaW5nICovCisgICAgICAgICBjb25zdCBjaGFyICpwYXQsIFB5X3NzaXplX3QgcGF0X2xlbiwgICAgICAgICAgIC8qIHBhdHRlcm4gc3RyaW5nIHRvIGZpbmQgKi8KKyAgICAgICAgIGNvbnN0IGNoYXIgKnN1YiwgUHlfc3NpemVfdCBzdWJfbGVuLCAgICAgICAgICAgLyogc3Vic3RpdHV0aW9uIHN0cmluZyAqLworICAgICAgICAgUHlfc3NpemVfdCBjb3VudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgcmVwbGFjZW1lbnRzICovCisgICAgICAgICBQeV9zc2l6ZV90ICpvdXRfbGVuKQogewotCWNoYXIgKm91dF9zOwotCWNoYXIgKm5ld19zOwotCVB5X3NzaXplX3QgbmZvdW5kLCBvZmZzZXQsIG5ld19sZW47CisgICAgY2hhciAqb3V0X3M7CisgICAgY2hhciAqbmV3X3M7CisgICAgUHlfc3NpemVfdCBuZm91bmQsIG9mZnNldCwgbmV3X2xlbjsKIAotCWlmIChsZW4gPT0gMCB8fCBwYXRfbGVuID4gbGVuKQotCQlnb3RvIHJldHVybl9zYW1lOworICAgIGlmIChsZW4gPT0gMCB8fCBwYXRfbGVuID4gbGVuKQorICAgICAgICBnb3RvIHJldHVybl9zYW1lOwogCi0JLyogZmluZCBsZW5ndGggb2Ygb3V0cHV0IHN0cmluZyAqLwotCW5mb3VuZCA9IG15bWVtY250KHN0ciwgbGVuLCBwYXQsIHBhdF9sZW4pOwotCWlmIChjb3VudCA8IDApCi0JCWNvdW50ID0gUFlfU1NJWkVfVF9NQVg7Ci0JZWxzZSBpZiAobmZvdW5kID4gY291bnQpCi0JCW5mb3VuZCA9IGNvdW50OwotCWlmIChuZm91bmQgPT0gMCkKLQkJZ290byByZXR1cm5fc2FtZTsKKyAgICAvKiBmaW5kIGxlbmd0aCBvZiBvdXRwdXQgc3RyaW5nICovCisgICAgbmZvdW5kID0gbXltZW1jbnQoc3RyLCBsZW4sIHBhdCwgcGF0X2xlbik7CisgICAgaWYgKGNvdW50IDwgMCkKKyAgICAgICAgY291bnQgPSBQWV9TU0laRV9UX01BWDsKKyAgICBlbHNlIGlmIChuZm91bmQgPiBjb3VudCkKKyAgICAgICAgbmZvdW5kID0gY291bnQ7CisgICAgaWYgKG5mb3VuZCA9PSAwKQorICAgICAgICBnb3RvIHJldHVybl9zYW1lOwogCi0JbmV3X2xlbiA9IGxlbiArIG5mb3VuZCooc3ViX2xlbiAtIHBhdF9sZW4pOwotCWlmIChuZXdfbGVuID09IDApIHsKLQkJLyogSGF2ZSB0byBhbGxvY2F0ZSBzb21ldGhpbmcgZm9yIHRoZSBjYWxsZXIgdG8gZnJlZSgpLiAqLwotCQlvdXRfcyA9IChjaGFyICopUHlNZW1fTUFMTE9DKDEpOwotCQlpZiAob3V0X3MgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQlvdXRfc1swXSA9ICdcMCc7Ci0JfQotCWVsc2UgewotCQlhc3NlcnQobmV3X2xlbiA+IDApOwotCQluZXdfcyA9IChjaGFyICopUHlNZW1fTUFMTE9DKG5ld19sZW4pOwotCQlpZiAobmV3X3MgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQlvdXRfcyA9IG5ld19zOworICAgIG5ld19sZW4gPSBsZW4gKyBuZm91bmQqKHN1Yl9sZW4gLSBwYXRfbGVuKTsKKyAgICBpZiAobmV3X2xlbiA9PSAwKSB7CisgICAgICAgIC8qIEhhdmUgdG8gYWxsb2NhdGUgc29tZXRoaW5nIGZvciB0aGUgY2FsbGVyIHRvIGZyZWUoKS4gKi8KKyAgICAgICAgb3V0X3MgPSAoY2hhciAqKVB5TWVtX01BTExPQygxKTsKKyAgICAgICAgaWYgKG91dF9zID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgb3V0X3NbMF0gPSAnXDAnOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgYXNzZXJ0KG5ld19sZW4gPiAwKTsKKyAgICAgICAgbmV3X3MgPSAoY2hhciAqKVB5TWVtX01BTExPQyhuZXdfbGVuKTsKKyAgICAgICAgaWYgKG5ld19zID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgb3V0X3MgPSBuZXdfczsKIAotCQlmb3IgKDsgY291bnQgPiAwICYmIGxlbiA+IDA7IC0tY291bnQpIHsKLQkJCS8qIGZpbmQgaW5kZXggb2YgbmV4dCBpbnN0YW5jZSBvZiBwYXR0ZXJuICovCi0JCQlvZmZzZXQgPSBteW1lbWZpbmQoc3RyLCBsZW4sIHBhdCwgcGF0X2xlbik7Ci0JCQlpZiAob2Zmc2V0ID09IC0xKQotCQkJCWJyZWFrOworICAgICAgICBmb3IgKDsgY291bnQgPiAwICYmIGxlbiA+IDA7IC0tY291bnQpIHsKKyAgICAgICAgICAgIC8qIGZpbmQgaW5kZXggb2YgbmV4dCBpbnN0YW5jZSBvZiBwYXR0ZXJuICovCisgICAgICAgICAgICBvZmZzZXQgPSBteW1lbWZpbmQoc3RyLCBsZW4sIHBhdCwgcGF0X2xlbik7CisgICAgICAgICAgICBpZiAob2Zmc2V0ID09IC0xKQorICAgICAgICAgICAgICAgIGJyZWFrOwogCi0JCQkvKiBjb3B5IG5vbiBtYXRjaGluZyBwYXJ0IG9mIGlucHV0IHN0cmluZyAqLwotCQkJbWVtY3B5KG5ld19zLCBzdHIsIG9mZnNldCk7Ci0JCQlzdHIgKz0gb2Zmc2V0ICsgcGF0X2xlbjsKLQkJCWxlbiAtPSBvZmZzZXQgKyBwYXRfbGVuOworICAgICAgICAgICAgLyogY29weSBub24gbWF0Y2hpbmcgcGFydCBvZiBpbnB1dCBzdHJpbmcgKi8KKyAgICAgICAgICAgIG1lbWNweShuZXdfcywgc3RyLCBvZmZzZXQpOworICAgICAgICAgICAgc3RyICs9IG9mZnNldCArIHBhdF9sZW47CisgICAgICAgICAgICBsZW4gLT0gb2Zmc2V0ICsgcGF0X2xlbjsKIAotCQkJLyogY29weSBzdWJzdGl0dXRlIGludG8gdGhlIG91dHB1dCBzdHJpbmcgKi8KLQkJCW5ld19zICs9IG9mZnNldDsKLQkJCW1lbWNweShuZXdfcywgc3ViLCBzdWJfbGVuKTsKLQkJCW5ld19zICs9IHN1Yl9sZW47Ci0JCX0KLQkJLyogY29weSBhbnkgcmVtYWluaW5nIHZhbHVlcyBpbnRvIG91dHB1dCBzdHJpbmcgKi8KLQkJaWYgKGxlbiA+IDApCi0JCQltZW1jcHkobmV3X3MsIHN0ciwgbGVuKTsKLQl9Ci0JKm91dF9sZW4gPSBuZXdfbGVuOwotCXJldHVybiBvdXRfczsKKyAgICAgICAgICAgIC8qIGNvcHkgc3Vic3RpdHV0ZSBpbnRvIHRoZSBvdXRwdXQgc3RyaW5nICovCisgICAgICAgICAgICBuZXdfcyArPSBvZmZzZXQ7CisgICAgICAgICAgICBtZW1jcHkobmV3X3MsIHN1Yiwgc3ViX2xlbik7CisgICAgICAgICAgICBuZXdfcyArPSBzdWJfbGVuOworICAgICAgICB9CisgICAgICAgIC8qIGNvcHkgYW55IHJlbWFpbmluZyB2YWx1ZXMgaW50byBvdXRwdXQgc3RyaW5nICovCisgICAgICAgIGlmIChsZW4gPiAwKQorICAgICAgICAgICAgbWVtY3B5KG5ld19zLCBzdHIsIGxlbik7CisgICAgfQorICAgICpvdXRfbGVuID0gbmV3X2xlbjsKKyAgICByZXR1cm4gb3V0X3M7CiAKICAgcmV0dXJuX3NhbWU6Ci0JKm91dF9sZW4gPSAtMTsKLQlyZXR1cm4gKGNoYXIgKilzdHI7IC8qIGNhc3QgYXdheSBjb25zdCAqLworICAgICpvdXRfbGVuID0gLTE7CisgICAgcmV0dXJuIChjaGFyICopc3RyOyAvKiBjYXN0IGF3YXkgY29uc3QgKi8KIH0KIAogCkBAIC0xMTY0LDQxICsxMTY0LDQxIEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3Ryb3BfcmVwbGFjZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqc3RyLCAqcGF0LCpzdWIsKm5ld19zOwotCVB5X3NzaXplX3QgbGVuLHBhdF9sZW4sc3ViX2xlbixvdXRfbGVuOwotCVB5X3NzaXplX3QgY291bnQgPSAtMTsKLQlQeU9iamVjdCAqbmV3c3RyOworICAgIGNoYXIgKnN0ciwgKnBhdCwqc3ViLCpuZXdfczsKKyAgICBQeV9zc2l6ZV90IGxlbixwYXRfbGVuLHN1Yl9sZW4sb3V0X2xlbjsKKyAgICBQeV9zc2l6ZV90IGNvdW50ID0gLTE7CisgICAgUHlPYmplY3QgKm5ld3N0cjsKIAotCVdBUk47Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ0I3QjdCN8bjpyZXBsYWNlIiwKLQkJCSAgICAgICZzdHIsICZsZW4sICZwYXQsICZwYXRfbGVuLCAmc3ViLCAmc3ViX2xlbiwKLQkJCSAgICAgICZjb3VudCkpCi0JCXJldHVybiBOVUxMOwotCWlmIChwYXRfbGVuIDw9IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJlbXB0eSBwYXR0ZXJuIHN0cmluZyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JLyogQ0FVVElPTjogIHN0cm9wIHRyZWF0cyBhIHJlcGxhY2UgY291bnQgb2YgMCBhcyBpbmZpbml0eSwgdW5sa2UKLQkgKiBjdXJyZW50ICgyLjEpIHN0cmluZy5weSBhbmQgc3RyaW5nIG1ldGhvZHMuICBQcmVzZXJ2ZSB0aGlzIGZvcgotCSAqIC4uLiB3ZWxsLCBoYXJkIHRvIHNheSBmb3Igd2hhdCA8d2luaz4uCi0JICovCi0JaWYgKGNvdW50ID09IDApCi0JCWNvdW50ID0gLTE7Ci0JbmV3X3MgPSBteW1lbXJlcGxhY2Uoc3RyLGxlbixwYXQscGF0X2xlbixzdWIsc3ViX2xlbixjb3VudCwmb3V0X2xlbik7Ci0JaWYgKG5ld19zID09IE5VTEwpIHsKLQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChvdXRfbGVuID09IC0xKSB7Ci0JCS8qIHdlJ3JlIHJldHVybmluZyBhbm90aGVyIHJlZmVyZW5jZSB0byB0aGUgaW5wdXQgc3RyaW5nICovCi0JCW5ld3N0ciA9IFB5VHVwbGVfR2V0SXRlbShhcmdzLCAwKTsKLQkJUHlfWElOQ1JFRihuZXdzdHIpOwotCX0KLQllbHNlIHsKLQkJbmV3c3RyID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUobmV3X3MsIG91dF9sZW4pOwotCQlQeU1lbV9GUkVFKG5ld19zKTsKLQl9Ci0JcmV0dXJuIG5ld3N0cjsKKyAgICBXQVJOOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAidCN0I3QjfG46cmVwbGFjZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHIsICZsZW4sICZwYXQsICZwYXRfbGVuLCAmc3ViLCAmc3ViX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvdW50KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKHBhdF9sZW4gPD0gMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImVtcHR5IHBhdHRlcm4gc3RyaW5nIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICAvKiBDQVVUSU9OOiAgc3Ryb3AgdHJlYXRzIGEgcmVwbGFjZSBjb3VudCBvZiAwIGFzIGluZmluaXR5LCB1bmxrZQorICAgICAqIGN1cnJlbnQgKDIuMSkgc3RyaW5nLnB5IGFuZCBzdHJpbmcgbWV0aG9kcy4gIFByZXNlcnZlIHRoaXMgZm9yCisgICAgICogLi4uIHdlbGwsIGhhcmQgdG8gc2F5IGZvciB3aGF0IDx3aW5rPi4KKyAgICAgKi8KKyAgICBpZiAoY291bnQgPT0gMCkKKyAgICAgICAgY291bnQgPSAtMTsKKyAgICBuZXdfcyA9IG15bWVtcmVwbGFjZShzdHIsbGVuLHBhdCxwYXRfbGVuLHN1YixzdWJfbGVuLGNvdW50LCZvdXRfbGVuKTsKKyAgICBpZiAobmV3X3MgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKG91dF9sZW4gPT0gLTEpIHsKKyAgICAgICAgLyogd2UncmUgcmV0dXJuaW5nIGFub3RoZXIgcmVmZXJlbmNlIHRvIHRoZSBpbnB1dCBzdHJpbmcgKi8KKyAgICAgICAgbmV3c3RyID0gUHlUdXBsZV9HZXRJdGVtKGFyZ3MsIDApOworICAgICAgICBQeV9YSU5DUkVGKG5ld3N0cik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBuZXdzdHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShuZXdfcywgb3V0X2xlbik7CisgICAgICAgIFB5TWVtX0ZSRUUobmV3X3MpOworICAgIH0KKyAgICByZXR1cm4gbmV3c3RyOwogfQogCiAKQEAgLTEyMDYsNjkgKzEyMDYsNjkgQEAKIAogc3RhdGljIFB5TWV0aG9kRGVmCiBzdHJvcF9tZXRob2RzW10gPSB7Ci0JeyJhdG9mIiwJc3Ryb3BfYXRvZiwJICAgTUVUSF9WQVJBUkdTLCBhdG9mX19kb2NfX30sCi0JeyJhdG9pIiwJc3Ryb3BfYXRvaSwJICAgTUVUSF9WQVJBUkdTLCBhdG9pX19kb2NfX30sCi0JeyJhdG9sIiwJc3Ryb3BfYXRvbCwJICAgTUVUSF9WQVJBUkdTLCBhdG9sX19kb2NfX30sCi0JeyJjYXBpdGFsaXplIiwJc3Ryb3BfY2FwaXRhbGl6ZSwgIE1FVEhfTywgICAgICAgY2FwaXRhbGl6ZV9fZG9jX199LAotCXsiY291bnQiLAlzdHJvcF9jb3VudCwJICAgTUVUSF9WQVJBUkdTLCBjb3VudF9fZG9jX199LAotCXsiZXhwYW5kdGFicyIsCXN0cm9wX2V4cGFuZHRhYnMsICBNRVRIX1ZBUkFSR1MsIGV4cGFuZHRhYnNfX2RvY19ffSwKLQl7ImZpbmQiLAlzdHJvcF9maW5kLAkgICBNRVRIX1ZBUkFSR1MsIGZpbmRfX2RvY19ffSwKLQl7ImpvaW4iLAlzdHJvcF9qb2luZmllbGRzLCAgTUVUSF9WQVJBUkdTLCBqb2luZmllbGRzX19kb2NfX30sCi0JeyJqb2luZmllbGRzIiwJc3Ryb3Bfam9pbmZpZWxkcywgIE1FVEhfVkFSQVJHUywgam9pbmZpZWxkc19fZG9jX199LAotCXsibHN0cmlwIiwJc3Ryb3BfbHN0cmlwLAkgICBNRVRIX08sICAgICAgIGxzdHJpcF9fZG9jX199LAotCXsibG93ZXIiLAlzdHJvcF9sb3dlciwJICAgTUVUSF9PLCAgICAgICBsb3dlcl9fZG9jX199LAotCXsibWFrZXRyYW5zIiwJc3Ryb3BfbWFrZXRyYW5zLCAgIE1FVEhfVkFSQVJHUywgbWFrZXRyYW5zX19kb2NfX30sCi0JeyJyZXBsYWNlIiwJc3Ryb3BfcmVwbGFjZSwJICAgTUVUSF9WQVJBUkdTLCByZXBsYWNlX19kb2NfX30sCi0JeyJyZmluZCIsCXN0cm9wX3JmaW5kLAkgICBNRVRIX1ZBUkFSR1MsIHJmaW5kX19kb2NfX30sCi0JeyJyc3RyaXAiLAlzdHJvcF9yc3RyaXAsCSAgIE1FVEhfTywgICAgICAgcnN0cmlwX19kb2NfX30sCi0JeyJzcGxpdCIsCXN0cm9wX3NwbGl0ZmllbGRzLCBNRVRIX1ZBUkFSR1MsIHNwbGl0ZmllbGRzX19kb2NfX30sCi0JeyJzcGxpdGZpZWxkcyIsCXN0cm9wX3NwbGl0ZmllbGRzLCBNRVRIX1ZBUkFSR1MsIHNwbGl0ZmllbGRzX19kb2NfX30sCi0JeyJzdHJpcCIsCXN0cm9wX3N0cmlwLAkgICBNRVRIX08sICAgICAgIHN0cmlwX19kb2NfX30sCi0JeyJzd2FwY2FzZSIsCXN0cm9wX3N3YXBjYXNlLCAgICBNRVRIX08sICAgICAgIHN3YXBjYXNlX19kb2NfX30sCi0JeyJ0cmFuc2xhdGUiLAlzdHJvcF90cmFuc2xhdGUsICAgTUVUSF9WQVJBUkdTLCB0cmFuc2xhdGVfX2RvY19ffSwKLQl7InVwcGVyIiwJc3Ryb3BfdXBwZXIsCSAgIE1FVEhfTywgICAgICAgdXBwZXJfX2RvY19ffSwKLQl7TlVMTCwJCU5VTEx9CS8qIHNlbnRpbmVsICovCisgICAgeyJhdG9mIiwgICAgICAgICAgICBzdHJvcF9hdG9mLCAgICAgICAgTUVUSF9WQVJBUkdTLCBhdG9mX19kb2NfX30sCisgICAgeyJhdG9pIiwgICAgICAgICAgICBzdHJvcF9hdG9pLCAgICAgICAgTUVUSF9WQVJBUkdTLCBhdG9pX19kb2NfX30sCisgICAgeyJhdG9sIiwgICAgICAgICAgICBzdHJvcF9hdG9sLCAgICAgICAgTUVUSF9WQVJBUkdTLCBhdG9sX19kb2NfX30sCisgICAgeyJjYXBpdGFsaXplIiwgICAgICBzdHJvcF9jYXBpdGFsaXplLCAgTUVUSF9PLCAgICAgICBjYXBpdGFsaXplX19kb2NfX30sCisgICAgeyJjb3VudCIsICAgICAgICAgICBzdHJvcF9jb3VudCwgICAgICAgTUVUSF9WQVJBUkdTLCBjb3VudF9fZG9jX199LAorICAgIHsiZXhwYW5kdGFicyIsICAgICAgc3Ryb3BfZXhwYW5kdGFicywgIE1FVEhfVkFSQVJHUywgZXhwYW5kdGFic19fZG9jX199LAorICAgIHsiZmluZCIsICAgICAgICAgICAgc3Ryb3BfZmluZCwgICAgICAgIE1FVEhfVkFSQVJHUywgZmluZF9fZG9jX199LAorICAgIHsiam9pbiIsICAgICAgICAgICAgc3Ryb3Bfam9pbmZpZWxkcywgIE1FVEhfVkFSQVJHUywgam9pbmZpZWxkc19fZG9jX199LAorICAgIHsiam9pbmZpZWxkcyIsICAgICAgc3Ryb3Bfam9pbmZpZWxkcywgIE1FVEhfVkFSQVJHUywgam9pbmZpZWxkc19fZG9jX199LAorICAgIHsibHN0cmlwIiwgICAgICAgICAgc3Ryb3BfbHN0cmlwLCAgICAgIE1FVEhfTywgICAgICAgbHN0cmlwX19kb2NfX30sCisgICAgeyJsb3dlciIsICAgICAgICAgICBzdHJvcF9sb3dlciwgICAgICAgTUVUSF9PLCAgICAgICBsb3dlcl9fZG9jX199LAorICAgIHsibWFrZXRyYW5zIiwgICAgICAgc3Ryb3BfbWFrZXRyYW5zLCAgIE1FVEhfVkFSQVJHUywgbWFrZXRyYW5zX19kb2NfX30sCisgICAgeyJyZXBsYWNlIiwgICAgICAgICBzdHJvcF9yZXBsYWNlLCAgICAgTUVUSF9WQVJBUkdTLCByZXBsYWNlX19kb2NfX30sCisgICAgeyJyZmluZCIsICAgICAgICAgICBzdHJvcF9yZmluZCwgICAgICAgTUVUSF9WQVJBUkdTLCByZmluZF9fZG9jX199LAorICAgIHsicnN0cmlwIiwgICAgICAgICAgc3Ryb3BfcnN0cmlwLCAgICAgIE1FVEhfTywgICAgICAgcnN0cmlwX19kb2NfX30sCisgICAgeyJzcGxpdCIsICAgICAgICAgICBzdHJvcF9zcGxpdGZpZWxkcywgTUVUSF9WQVJBUkdTLCBzcGxpdGZpZWxkc19fZG9jX199LAorICAgIHsic3BsaXRmaWVsZHMiLCAgICAgc3Ryb3Bfc3BsaXRmaWVsZHMsIE1FVEhfVkFSQVJHUywgc3BsaXRmaWVsZHNfX2RvY19ffSwKKyAgICB7InN0cmlwIiwgICAgICAgICAgIHN0cm9wX3N0cmlwLCAgICAgICBNRVRIX08sICAgICAgIHN0cmlwX19kb2NfX30sCisgICAgeyJzd2FwY2FzZSIsICAgICAgICBzdHJvcF9zd2FwY2FzZSwgICAgTUVUSF9PLCAgICAgICBzd2FwY2FzZV9fZG9jX199LAorICAgIHsidHJhbnNsYXRlIiwgICAgICAgc3Ryb3BfdHJhbnNsYXRlLCAgIE1FVEhfVkFSQVJHUywgdHJhbnNsYXRlX19kb2NfX30sCisgICAgeyJ1cHBlciIsICAgICAgICAgICBzdHJvcF91cHBlciwgICAgICAgTUVUSF9PLCAgICAgICB1cHBlcl9fZG9jX199LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0gICAvKiBzZW50aW5lbCAqLwogfTsKIAogCiBQeU1PRElOSVRfRlVOQwogaW5pdHN0cm9wKHZvaWQpCiB7Ci0JUHlPYmplY3QgKm0sICpzOwotCWNoYXIgYnVmWzI1Nl07Ci0JaW50IGMsIG47Ci0JbSA9IFB5X0luaXRNb2R1bGU0KCJzdHJvcCIsIHN0cm9wX21ldGhvZHMsIHN0cm9wX21vZHVsZV9fZG9jX18sCi0JCQkgICAoUHlPYmplY3QqKU5VTEwsIFBZVEhPTl9BUElfVkVSU0lPTik7Ci0JaWYgKG0gPT0gTlVMTCkKLQkJcmV0dXJuOworICAgIFB5T2JqZWN0ICptLCAqczsKKyAgICBjaGFyIGJ1ZlsyNTZdOworICAgIGludCBjLCBuOworICAgIG0gPSBQeV9Jbml0TW9kdWxlNCgic3Ryb3AiLCBzdHJvcF9tZXRob2RzLCBzdHJvcF9tb2R1bGVfX2RvY19fLAorICAgICAgICAgICAgICAgICAgICAgICAoUHlPYmplY3QqKU5VTEwsIFBZVEhPTl9BUElfVkVSU0lPTik7CisgICAgaWYgKG0gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOwogCi0JLyogQ3JlYXRlICd3aGl0ZXNwYWNlJyBvYmplY3QgKi8KLQluID0gMDsKLQlmb3IgKGMgPSAwOyBjIDwgMjU2OyBjKyspIHsKLQkJaWYgKGlzc3BhY2UoYykpCi0JCQlidWZbbisrXSA9IGM7Ci0JfQotCXMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShidWYsIG4pOwotCWlmIChzKQotCQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIndoaXRlc3BhY2UiLCBzKTsKKyAgICAvKiBDcmVhdGUgJ3doaXRlc3BhY2UnIG9iamVjdCAqLworICAgIG4gPSAwOworICAgIGZvciAoYyA9IDA7IGMgPCAyNTY7IGMrKykgeworICAgICAgICBpZiAoaXNzcGFjZShjKSkKKyAgICAgICAgICAgIGJ1ZltuKytdID0gYzsKKyAgICB9CisgICAgcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGJ1Ziwgbik7CisgICAgaWYgKHMpCisgICAgICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAid2hpdGVzcGFjZSIsIHMpOwogCi0JLyogQ3JlYXRlICdsb3dlcmNhc2UnIG9iamVjdCAqLwotCW4gPSAwOwotCWZvciAoYyA9IDA7IGMgPCAyNTY7IGMrKykgewotCQlpZiAoaXNsb3dlcihjKSkKLQkJCWJ1ZltuKytdID0gYzsKLQl9Ci0JcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGJ1Ziwgbik7Ci0JaWYgKHMpCi0JCVB5TW9kdWxlX0FkZE9iamVjdChtLCAibG93ZXJjYXNlIiwgcyk7CisgICAgLyogQ3JlYXRlICdsb3dlcmNhc2UnIG9iamVjdCAqLworICAgIG4gPSAwOworICAgIGZvciAoYyA9IDA7IGMgPCAyNTY7IGMrKykgeworICAgICAgICBpZiAoaXNsb3dlcihjKSkKKyAgICAgICAgICAgIGJ1ZltuKytdID0gYzsKKyAgICB9CisgICAgcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGJ1Ziwgbik7CisgICAgaWYgKHMpCisgICAgICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAibG93ZXJjYXNlIiwgcyk7CiAKLQkvKiBDcmVhdGUgJ3VwcGVyY2FzZScgb2JqZWN0ICovCi0JbiA9IDA7Ci0JZm9yIChjID0gMDsgYyA8IDI1NjsgYysrKSB7Ci0JCWlmIChpc3VwcGVyKGMpKQotCQkJYnVmW24rK10gPSBjOwotCX0KLQlzID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoYnVmLCBuKTsKLQlpZiAocykKLQkJUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJ1cHBlcmNhc2UiLCBzKTsKKyAgICAvKiBDcmVhdGUgJ3VwcGVyY2FzZScgb2JqZWN0ICovCisgICAgbiA9IDA7CisgICAgZm9yIChjID0gMDsgYyA8IDI1NjsgYysrKSB7CisgICAgICAgIGlmIChpc3VwcGVyKGMpKQorICAgICAgICAgICAgYnVmW24rK10gPSBjOworICAgIH0KKyAgICBzID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoYnVmLCBuKTsKKyAgICBpZiAocykKKyAgICAgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJ1cHBlcmNhc2UiLCBzKTsKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvc3VuYXVkaW9kZXYuYyBiL01vZHVsZXMvc3VuYXVkaW9kZXYuYwppbmRleCAyODVkYzY2Li4wYzMyZmUzIDEwMDY0NAotLS0gYS9Nb2R1bGVzL3N1bmF1ZGlvZGV2LmMKKysrIGIvTW9kdWxlcy9zdW5hdWRpb2Rldi5jCkBAIC0yMyw5OCArMjMsOTggQEAKIC8qICNkZWZpbmUgb2Zmc2V0b2Yoc3RyLG1lbSkgKChpbnQpKCgoc3RyICopMCktPm1lbSkpICovCiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JaW50CXhfZmQ7CQkvKiBUaGUgb3BlbiBmaWxlICovCi0JaW50CXhfaWNvdW50OwkvKiAjIHNhbXBsZXMgcmVhZCAqLwotCWludAl4X29jb3VudDsJLyogIyBzYW1wbGVzIHdyaXR0ZW4gKi8KLQlpbnQJeF9pc2N0bDsJLyogVHJ1ZSBpZiBjb250cm9sIGRldmljZSAqLwotCQorICAgIFB5T2JqZWN0X0hFQUQKKyAgICBpbnQgICAgICAgICB4X2ZkOyAgICAgICAgICAgLyogVGhlIG9wZW4gZmlsZSAqLworICAgIGludCAgICAgICAgIHhfaWNvdW50OyAgICAgICAvKiAjIHNhbXBsZXMgcmVhZCAqLworICAgIGludCAgICAgICAgIHhfb2NvdW50OyAgICAgICAvKiAjIHNhbXBsZXMgd3JpdHRlbiAqLworICAgIGludCAgICAgICAgIHhfaXNjdGw7ICAgICAgICAvKiBUcnVlIGlmIGNvbnRyb2wgZGV2aWNlICovCisKIH0gc2Fkb2JqZWN0OwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCWF1ZGlvX2luZm9fdCBhaTsKKyAgICBQeU9iamVjdF9IRUFECisgICAgYXVkaW9faW5mb190IGFpOwogfSBzYWRzdGF0dXNvYmplY3Q7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgU2FkdHlwZTsKIHN0YXRpYyBQeVR5cGVPYmplY3QgU2Fkc3RhdHVzdHlwZTsKLXN0YXRpYyBzYWRzdGF0dXNvYmplY3QgKnNhZHNfYWxsb2Modm9pZCk7CS8qIEZvcndhcmQgKi8KK3N0YXRpYyBzYWRzdGF0dXNvYmplY3QgKnNhZHNfYWxsb2Modm9pZCk7ICAgICAgIC8qIEZvcndhcmQgKi8KIAogc3RhdGljIFB5T2JqZWN0ICpTdW5BdWRpb0Vycm9yOwogCi0jZGVmaW5lIGlzX3NhZG9iamVjdCh2KQkJKFB5X1RZUEUodikgPT0gJlNhZHR5cGUpCi0jZGVmaW5lIGlzX3NhZHN0YXR1c29iamVjdCh2KQkoUHlfVFlQRSh2KSA9PSAmU2Fkc3RhdHVzdHlwZSkKKyNkZWZpbmUgaXNfc2Fkb2JqZWN0KHYpICAgICAgICAgKFB5X1RZUEUodikgPT0gJlNhZHR5cGUpCisjZGVmaW5lIGlzX3NhZHN0YXR1c29iamVjdCh2KSAgIChQeV9UWVBFKHYpID09ICZTYWRzdGF0dXN0eXBlKQogCiAKIHN0YXRpYyBzYWRvYmplY3QgKgogbmV3c2Fkb2JqZWN0KFB5T2JqZWN0ICphcmdzKQogewotCXNhZG9iamVjdCAqeHA7Ci0JaW50IGZkOwotCWNoYXIgKm1vZGU7Ci0JaW50IGltb2RlOwotCWNoYXIqIGJhc2VkZXY7Ci0JY2hhciogY3RsZGV2OwotCWNoYXIqIG9wZW5kZXY7CisgICAgc2Fkb2JqZWN0ICp4cDsKKyAgICBpbnQgZmQ7CisgICAgY2hhciAqbW9kZTsKKyAgICBpbnQgaW1vZGU7CisgICAgY2hhciogYmFzZWRldjsKKyAgICBjaGFyKiBjdGxkZXY7CisgICAgY2hhciogb3BlbmRldjsKIAotCS8qIENoZWNrIGFyZyBmb3Igci93L3J3ICovCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIiwgJm1vZGUpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoc3RyY21wKG1vZGUsICJyIikgPT0gMCkKLQkJaW1vZGUgPSAwOwotCWVsc2UgaWYgKHN0cmNtcChtb2RlLCAidyIpID09IDApCi0JCWltb2RlID0gMTsKLQllbHNlIGlmIChzdHJjbXAobW9kZSwgInJ3IikgPT0gMCkKLQkJaW1vZGUgPSAyOwotCWVsc2UgaWYgKHN0cmNtcChtb2RlLCAiY29udHJvbCIpID09IDApCi0JCWltb2RlID0gLTE7Ci0JZWxzZSB7Ci0JCVB5RXJyX1NldFN0cmluZyhTdW5BdWRpb0Vycm9yLAotCQkJICAiTW9kZSBzaG91bGQgYmUgb25lIG9mICdyJywgJ3cnLCAncncnIG9yICdjb250cm9sJyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JCi0JLyogT3BlbiB0aGUgY29ycmVjdCBkZXZpY2UuICBUaGUgYmFzZSBkZXZpY2UgbmFtZSBjb21lcyBmcm9tIHRoZQotCSAqIEFVRElPREVWIGVudmlyb25tZW50IHZhcmlhYmxlIGZpcnN0LCB0aGVuIC9kZXYvYXVkaW8uICBUaGUKLQkgKiBjb250cm9sIGRldmljZSB0YWNrcyAiY3RsIiBvbnRvIHRoZSBiYXNlIGRldmljZSBuYW1lLgotCSAqLwotCWJhc2VkZXYgPSBnZXRlbnYoIkFVRElPREVWIik7Ci0JaWYgKCFiYXNlZGV2KQotCQliYXNlZGV2ID0gIi9kZXYvYXVkaW8iOwotCWN0bGRldiA9IFB5TWVtX05FVyhjaGFyLCBzdHJsZW4oYmFzZWRldikgKyA0KTsKLQlpZiAoIWN0bGRldikgewotCQlQeUVycl9Ob01lbW9yeSgpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0Jc3RyY3B5KGN0bGRldiwgYmFzZWRldik7Ci0Jc3RyY2F0KGN0bGRldiwgImN0bCIpOworICAgIC8qIENoZWNrIGFyZyBmb3Igci93L3J3ICovCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIiwgJm1vZGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoc3RyY21wKG1vZGUsICJyIikgPT0gMCkKKyAgICAgICAgaW1vZGUgPSAwOworICAgIGVsc2UgaWYgKHN0cmNtcChtb2RlLCAidyIpID09IDApCisgICAgICAgIGltb2RlID0gMTsKKyAgICBlbHNlIGlmIChzdHJjbXAobW9kZSwgInJ3IikgPT0gMCkKKyAgICAgICAgaW1vZGUgPSAyOworICAgIGVsc2UgaWYgKHN0cmNtcChtb2RlLCAiY29udHJvbCIpID09IDApCisgICAgICAgIGltb2RlID0gLTE7CisgICAgZWxzZSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhTdW5BdWRpb0Vycm9yLAorICAgICAgICAgICAgICAgICAgIk1vZGUgc2hvdWxkIGJlIG9uZSBvZiAncicsICd3JywgJ3J3JyBvciAnY29udHJvbCciKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaWYgKGltb2RlIDwgMCkgewotCQlvcGVuZGV2ID0gY3RsZGV2OwotCQlmZCA9IG9wZW4oY3RsZGV2LCAyKTsKLQl9Ci0JZWxzZSB7Ci0JCW9wZW5kZXYgPSBiYXNlZGV2OwotCQlmZCA9IG9wZW4oYmFzZWRldiwgaW1vZGUpOwotCX0KLQlpZiAoZmQgPCAwKSB7Ci0JCVB5RXJyX1NldEZyb21FcnJub1dpdGhGaWxlbmFtZShTdW5BdWRpb0Vycm9yLCBvcGVuZGV2KTsKLQkJUHlNZW1fREVMKGN0bGRldik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlQeU1lbV9ERUwoY3RsZGV2KTsKKyAgICAvKiBPcGVuIHRoZSBjb3JyZWN0IGRldmljZS4gIFRoZSBiYXNlIGRldmljZSBuYW1lIGNvbWVzIGZyb20gdGhlCisgICAgICogQVVESU9ERVYgZW52aXJvbm1lbnQgdmFyaWFibGUgZmlyc3QsIHRoZW4gL2Rldi9hdWRpby4gIFRoZQorICAgICAqIGNvbnRyb2wgZGV2aWNlIHRhY2tzICJjdGwiIG9udG8gdGhlIGJhc2UgZGV2aWNlIG5hbWUuCisgICAgICovCisgICAgYmFzZWRldiA9IGdldGVudigiQVVESU9ERVYiKTsKKyAgICBpZiAoIWJhc2VkZXYpCisgICAgICAgIGJhc2VkZXYgPSAiL2Rldi9hdWRpbyI7CisgICAgY3RsZGV2ID0gUHlNZW1fTkVXKGNoYXIsIHN0cmxlbihiYXNlZGV2KSArIDQpOworICAgIGlmICghY3RsZGV2KSB7CisgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBzdHJjcHkoY3RsZGV2LCBiYXNlZGV2KTsKKyAgICBzdHJjYXQoY3RsZGV2LCAiY3RsIik7CiAKLQkvKiBDcmVhdGUgYW5kIGluaXRpYWxpemUgdGhlIG9iamVjdCAqLwotCXhwID0gUHlPYmplY3RfTmV3KHNhZG9iamVjdCwgJlNhZHR5cGUpOwotCWlmICh4cCA9PSBOVUxMKSB7Ci0JCWNsb3NlKGZkKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXhwLT54X2ZkID0gZmQ7Ci0JeHAtPnhfaWNvdW50ID0geHAtPnhfb2NvdW50ID0gMDsKLQl4cC0+eF9pc2N0bCA9IChpbW9kZSA8IDApOwotCQotCXJldHVybiB4cDsKKyAgICBpZiAoaW1vZGUgPCAwKSB7CisgICAgICAgIG9wZW5kZXYgPSBjdGxkZXY7CisgICAgICAgIGZkID0gb3BlbihjdGxkZXYsIDIpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgb3BlbmRldiA9IGJhc2VkZXY7CisgICAgICAgIGZkID0gb3BlbihiYXNlZGV2LCBpbW9kZSk7CisgICAgfQorICAgIGlmIChmZCA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vV2l0aEZpbGVuYW1lKFN1bkF1ZGlvRXJyb3IsIG9wZW5kZXYpOworICAgICAgICBQeU1lbV9ERUwoY3RsZGV2KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5TWVtX0RFTChjdGxkZXYpOworCisgICAgLyogQ3JlYXRlIGFuZCBpbml0aWFsaXplIHRoZSBvYmplY3QgKi8KKyAgICB4cCA9IFB5T2JqZWN0X05ldyhzYWRvYmplY3QsICZTYWR0eXBlKTsKKyAgICBpZiAoeHAgPT0gTlVMTCkgeworICAgICAgICBjbG9zZShmZCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICB4cC0+eF9mZCA9IGZkOworICAgIHhwLT54X2ljb3VudCA9IHhwLT54X29jb3VudCA9IDA7CisgICAgeHAtPnhfaXNjdGwgPSAoaW1vZGUgPCAwKTsKKworICAgIHJldHVybiB4cDsKIH0KIAogLyogU2FkIG1ldGhvZHMgKi8KQEAgLTEyMiwzMjcgKzEyMiwzMjcgQEAKIHN0YXRpYyB2b2lkCiBzYWRfZGVhbGxvYyhzYWRvYmplY3QgKnhwKQogewotICAgICAgICBjbG9zZSh4cC0+eF9mZCk7Ci0JUHlPYmplY3RfRGVsKHhwKTsKKyAgICBjbG9zZSh4cC0+eF9mZCk7CisgICAgUHlPYmplY3RfRGVsKHhwKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNhZF9yZWFkKHNhZG9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0gICAgICAgIGludCBzaXplLCBjb3VudDsKLQljaGFyICpjcDsKLQlQeU9iamVjdCAqcnY7Ci0JCi0gICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpyZWFkIiwgJnNpemUpKQotCQlyZXR1cm4gTlVMTDsKLQlydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIHNpemUpOwotCWlmIChydiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpbnQgc2l6ZSwgY291bnQ7CisgICAgY2hhciAqY3A7CisgICAgUHlPYmplY3QgKnJ2OwogCi0JaWYgKCEoY3AgPSBQeVN0cmluZ19Bc1N0cmluZyhydikpKQotCQlnb3RvIGZpbmFsbHk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOnJlYWQiLCAmc2l6ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJ2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgc2l6ZSk7CisgICAgaWYgKHJ2ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JY291bnQgPSByZWFkKHNlbGYtPnhfZmQsIGNwLCBzaXplKTsKLQlpZiAoY291bnQgPCAwKSB7Ci0JCVB5RXJyX1NldEZyb21FcnJubyhTdW5BdWRpb0Vycm9yKTsKLQkJZ290byBmaW5hbGx5OwotCX0KKyAgICBpZiAoIShjcCA9IFB5U3RyaW5nX0FzU3RyaW5nKHJ2KSkpCisgICAgICAgIGdvdG8gZmluYWxseTsKKworICAgIGNvdW50ID0gcmVhZChzZWxmLT54X2ZkLCBjcCwgc2l6ZSk7CisgICAgaWYgKGNvdW50IDwgMCkgeworICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oU3VuQXVkaW9FcnJvcik7CisgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICB9CiAjaWYgMAotCS8qIFRCRDogd2h5IHByaW50IHRoaXMgbWVzc2FnZSBpZiB5b3UgY2FuIGhhbmRsZSB0aGUgY29uZGl0aW9uPwotCSAqIGFzc3VtZSBpdCdzIGRlYnVnZ2luZyBpbmZvIHdoaWNoIHdlIGNhbiBqdXN0IGFzIHdlbGwgZ2V0IHJpZAotCSAqIG9mLiAgaW4gYW55IGNhc2UgdGhpcyBtZXNzYWdlIHNob3VsZCAqbm90KiBiZSB1c2luZyBwcmludGYhCi0JICovCi0JaWYgKGNvdW50ICE9IHNpemUpCi0JCXByaW50Zigic3VuYXVkaW86IGZ1bm55IHJlYWQgcnYgJWQgd3RkICVkXG4iLCBjb3VudCwgc2l6ZSk7CisgICAgLyogVEJEOiB3aHkgcHJpbnQgdGhpcyBtZXNzYWdlIGlmIHlvdSBjYW4gaGFuZGxlIHRoZSBjb25kaXRpb24/CisgICAgICogYXNzdW1lIGl0J3MgZGVidWdnaW5nIGluZm8gd2hpY2ggd2UgY2FuIGp1c3QgYXMgd2VsbCBnZXQgcmlkCisgICAgICogb2YuICBpbiBhbnkgY2FzZSB0aGlzIG1lc3NhZ2Ugc2hvdWxkICpub3QqIGJlIHVzaW5nIHByaW50ZiEKKyAgICAgKi8KKyAgICBpZiAoY291bnQgIT0gc2l6ZSkKKyAgICAgICAgcHJpbnRmKCJzdW5hdWRpbzogZnVubnkgcmVhZCBydiAlZCB3dGQgJWRcbiIsIGNvdW50LCBzaXplKTsKICNlbmRpZgotCXNlbGYtPnhfaWNvdW50ICs9IGNvdW50OwotCXJldHVybiBydjsKKyAgICBzZWxmLT54X2ljb3VudCArPSBjb3VudDsKKyAgICByZXR1cm4gcnY7CiAKICAgZmluYWxseToKLQlQeV9ERUNSRUYocnYpOwotCXJldHVybiBOVUxMOworICAgIFB5X0RFQ1JFRihydik7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzYWRfd3JpdGUoc2Fkb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLSAgICAgICAgY2hhciAqY3A7Ci0JaW50IGNvdW50LCBzaXplOwotCQotICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjOndyaXRlIiwgJmNwLCAmc2l6ZSkpCi0JCXJldHVybiBOVUxMOworICAgIGNoYXIgKmNwOworICAgIGludCBjb3VudCwgc2l6ZTsKIAotCWNvdW50ID0gd3JpdGUoc2VsZi0+eF9mZCwgY3AsIHNpemUpOwotCWlmIChjb3VudCA8IDApIHsKLQkJUHlFcnJfU2V0RnJvbUVycm5vKFN1bkF1ZGlvRXJyb3IpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIzp3cml0ZSIsICZjcCwgJnNpemUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGNvdW50ID0gd3JpdGUoc2VsZi0+eF9mZCwgY3AsIHNpemUpOworICAgIGlmIChjb3VudCA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKFN1bkF1ZGlvRXJyb3IpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAjaWYgMAotCWlmIChjb3VudCAhPSBzaXplKQotCQlwcmludGYoInN1bmF1ZGlvOiBmdW5ueSB3cml0ZSBydiAlZCB3YW50ZWQgJWRcbiIsIGNvdW50LCBzaXplKTsKKyAgICBpZiAoY291bnQgIT0gc2l6ZSkKKyAgICAgICAgcHJpbnRmKCJzdW5hdWRpbzogZnVubnkgd3JpdGUgcnYgJWQgd2FudGVkICVkXG4iLCBjb3VudCwgc2l6ZSk7CiAjZW5kaWYKLQlzZWxmLT54X29jb3VudCArPSBjb3VudDsKLQkKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2VsZi0+eF9vY291bnQgKz0gY291bnQ7CisKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzYWRfZ2V0aW5mbyhzYWRvYmplY3QgKnNlbGYpCiB7Ci0Jc2Fkc3RhdHVzb2JqZWN0ICpydjsKKyAgICBzYWRzdGF0dXNvYmplY3QgKnJ2OwogCi0JaWYgKCEocnYgPSBzYWRzX2FsbG9jKCkpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIShydiA9IHNhZHNfYWxsb2MoKSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKGlvY3RsKHNlbGYtPnhfZmQsIEFVRElPX0dFVElORk8sICZydi0+YWkpIDwgMCkgewotCQlQeUVycl9TZXRGcm9tRXJybm8oU3VuQXVkaW9FcnJvcik7Ci0JCVB5X0RFQ1JFRihydik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gKFB5T2JqZWN0ICopcnY7CisgICAgaWYgKGlvY3RsKHNlbGYtPnhfZmQsIEFVRElPX0dFVElORk8sICZydi0+YWkpIDwgMCkgeworICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oU3VuQXVkaW9FcnJvcik7CisgICAgICAgIFB5X0RFQ1JFRihydik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gKFB5T2JqZWN0ICopcnY7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzYWRfc2V0aW5mbyhzYWRvYmplY3QgKnNlbGYsIHNhZHN0YXR1c29iamVjdCAqYXJnKQogewotCWlmICghaXNfc2Fkc3RhdHVzb2JqZWN0KGFyZykpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiTXVzdCBiZSBzdW4gYXVkaW8gc3RhdHVzIG9iamVjdCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKGlvY3RsKHNlbGYtPnhfZmQsIEFVRElPX1NFVElORk8sICZhcmctPmFpKSA8IDApIHsKLQkJUHlFcnJfU2V0RnJvbUVycm5vKFN1bkF1ZGlvRXJyb3IpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGlmICghaXNfc2Fkc3RhdHVzb2JqZWN0KGFyZykpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJNdXN0IGJlIHN1biBhdWRpbyBzdGF0dXMgb2JqZWN0Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoaW9jdGwoc2VsZi0+eF9mZCwgQVVESU9fU0VUSU5GTywgJmFyZy0+YWkpIDwgMCkgeworICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oU3VuQXVkaW9FcnJvcik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzYWRfaWJ1ZmNvdW50KHNhZG9iamVjdCAqc2VsZikKIHsKLQlhdWRpb19pbmZvX3QgYWk7Ci0gICAgCi0JaWYgKGlvY3RsKHNlbGYtPnhfZmQsIEFVRElPX0dFVElORk8sICZhaSkgPCAwKSB7Ci0JCVB5RXJyX1NldEZyb21FcnJubyhTdW5BdWRpb0Vycm9yKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBQeUludF9Gcm9tTG9uZyhhaS5yZWNvcmQuc2FtcGxlcyAtIHNlbGYtPnhfaWNvdW50KTsKKyAgICBhdWRpb19pbmZvX3QgYWk7CisKKyAgICBpZiAoaW9jdGwoc2VsZi0+eF9mZCwgQVVESU9fR0VUSU5GTywgJmFpKSA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKFN1bkF1ZGlvRXJyb3IpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKGFpLnJlY29yZC5zYW1wbGVzIC0gc2VsZi0+eF9pY291bnQpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc2FkX29idWZjb3VudChzYWRvYmplY3QgKnNlbGYpCiB7Ci0JYXVkaW9faW5mb190IGFpOwotICAgIAotCWlmIChpb2N0bChzZWxmLT54X2ZkLCBBVURJT19HRVRJTkZPLCAmYWkpIDwgMCkgewotCQlQeUVycl9TZXRGcm9tRXJybm8oU3VuQXVkaW9FcnJvcik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQkvKiB4X29jb3VudCBpcyBpbiBieXRlcywgd2hlcmVhcyBwbGF5LnNhbXBsZXMgaXMgaW4gZnJhbWVzICovCi0JLyogd2Ugd2FudCBmcmFtZXMgKi8KLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoc2VsZi0+eF9vY291bnQgLyAoYWkucGxheS5jaGFubmVscyAqCi0JCQkJCQlhaS5wbGF5LnByZWNpc2lvbiAvIDgpIC0KLQkJCSAgICAgIGFpLnBsYXkuc2FtcGxlcyk7CisgICAgYXVkaW9faW5mb190IGFpOworCisgICAgaWYgKGlvY3RsKHNlbGYtPnhfZmQsIEFVRElPX0dFVElORk8sICZhaSkgPCAwKSB7CisgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhTdW5BdWRpb0Vycm9yKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIC8qIHhfb2NvdW50IGlzIGluIGJ5dGVzLCB3aGVyZWFzIHBsYXkuc2FtcGxlcyBpcyBpbiBmcmFtZXMgKi8KKyAgICAvKiB3ZSB3YW50IGZyYW1lcyAqLworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhzZWxmLT54X29jb3VudCAvIChhaS5wbGF5LmNoYW5uZWxzICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWkucGxheS5wcmVjaXNpb24gLyA4KSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFpLnBsYXkuc2FtcGxlcyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzYWRfZHJhaW4oc2Fkb2JqZWN0ICpzZWxmKQogewotCWlmIChpb2N0bChzZWxmLT54X2ZkLCBBVURJT19EUkFJTiwgMCkgPCAwKSB7Ci0JCVB5RXJyX1NldEZyb21FcnJubyhTdW5BdWRpb0Vycm9yKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAoaW9jdGwoc2VsZi0+eF9mZCwgQVVESU9fRFJBSU4sIDApIDwgMCkgeworICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oU3VuQXVkaW9FcnJvcik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKICNpZmRlZiBTT0xBUklTCiBzdGF0aWMgUHlPYmplY3QgKgogc2FkX2dldGRldihzYWRvYmplY3QgKnNlbGYpCiB7Ci0Jc3RydWN0IGF1ZGlvX2RldmljZSBhZDsKKyAgICBzdHJ1Y3QgYXVkaW9fZGV2aWNlIGFkOwogCi0JaWYgKGlvY3RsKHNlbGYtPnhfZmQsIEFVRElPX0dFVERFViwgJmFkKSA8IDApIHsKLQkJUHlFcnJfU2V0RnJvbUVycm5vKFN1bkF1ZGlvRXJyb3IpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihzc3MpIiwgYWQubmFtZSwgYWQudmVyc2lvbiwgYWQuY29uZmlnKTsKKyAgICBpZiAoaW9jdGwoc2VsZi0+eF9mZCwgQVVESU9fR0VUREVWLCAmYWQpIDwgMCkgeworICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oU3VuQXVkaW9FcnJvcik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKHNzcykiLCBhZC5uYW1lLCBhZC52ZXJzaW9uLCBhZC5jb25maWcpOwogfQogI2VuZGlmCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzYWRfZmx1c2goc2Fkb2JqZWN0ICpzZWxmKQogewotCWlmIChpb2N0bChzZWxmLT54X2ZkLCBJX0ZMVVNILCBGTFVTSFcpIDwgMCkgewotCQlQeUVycl9TZXRGcm9tRXJybm8oU3VuQXVkaW9FcnJvcik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKGlvY3RsKHNlbGYtPnhfZmQsIElfRkxVU0gsIEZMVVNIVykgPCAwKSB7CisgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhTdW5BdWRpb0Vycm9yKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNhZF9jbG9zZShzYWRvYmplY3QgKnNlbGYpCiB7Ci0gICAgCi0JaWYgKHNlbGYtPnhfZmQgPj0gMCkgewotCQljbG9zZShzZWxmLT54X2ZkKTsKLQkJc2VsZi0+eF9mZCA9IC0xOwotCX0KLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisKKyAgICBpZiAoc2VsZi0+eF9mZCA+PSAwKSB7CisgICAgICAgIGNsb3NlKHNlbGYtPnhfZmQpOworICAgICAgICBzZWxmLT54X2ZkID0gLTE7CisgICAgfQorICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNhZF9maWxlbm8oc2Fkb2JqZWN0ICpzZWxmKQogewotCXJldHVybiBQeUludF9Gcm9tTG9uZyhzZWxmLT54X2ZkKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoc2VsZi0+eF9mZCk7CiB9CiAKIAogc3RhdGljIFB5TWV0aG9kRGVmIHNhZF9tZXRob2RzW10gPSB7Ci0gICAgICAgIHsgInJlYWQiLAkoUHlDRnVuY3Rpb24pc2FkX3JlYWQsIE1FVEhfVkFSQVJHUyB9LAotICAgICAgICB7ICJ3cml0ZSIsCShQeUNGdW5jdGlvbilzYWRfd3JpdGUsIE1FVEhfVkFSQVJHUyB9LAotICAgICAgICB7ICJpYnVmY291bnQiLAkoUHlDRnVuY3Rpb24pc2FkX2lidWZjb3VudCwgTUVUSF9OT0FSR1MgfSwKLSAgICAgICAgeyAib2J1ZmNvdW50IiwJKFB5Q0Z1bmN0aW9uKXNhZF9vYnVmY291bnQsIE1FVEhfTk9BUkdTIH0sCisgICAgeyAicmVhZCIsICAgICAgICAgICAoUHlDRnVuY3Rpb24pc2FkX3JlYWQsIE1FVEhfVkFSQVJHUyB9LAorICAgIHsgIndyaXRlIiwgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXNhZF93cml0ZSwgTUVUSF9WQVJBUkdTIH0sCisgICAgeyAiaWJ1ZmNvdW50IiwgICAgICAoUHlDRnVuY3Rpb24pc2FkX2lidWZjb3VudCwgTUVUSF9OT0FSR1MgfSwKKyAgICB7ICJvYnVmY291bnQiLCAgICAgIChQeUNGdW5jdGlvbilzYWRfb2J1ZmNvdW50LCBNRVRIX05PQVJHUyB9LAogI2RlZmluZSBDVExfTUVUSE9EUyA0Ci0gICAgICAgIHsgImdldGluZm8iLAkoUHlDRnVuY3Rpb24pc2FkX2dldGluZm8sIE1FVEhfTk9BUkdTIH0sCi0gICAgICAgIHsgInNldGluZm8iLAkoUHlDRnVuY3Rpb24pc2FkX3NldGluZm8sIE1FVEhfT30sCi0gICAgICAgIHsgImRyYWluIiwJKFB5Q0Z1bmN0aW9uKXNhZF9kcmFpbiwgTUVUSF9OT0FSR1MgfSwKLSAgICAgICAgeyAiZmx1c2giLAkoUHlDRnVuY3Rpb24pc2FkX2ZsdXNoLCBNRVRIX05PQVJHUyB9LAorICAgIHsgImdldGluZm8iLCAgICAgICAgKFB5Q0Z1bmN0aW9uKXNhZF9nZXRpbmZvLCBNRVRIX05PQVJHUyB9LAorICAgIHsgInNldGluZm8iLCAgICAgICAgKFB5Q0Z1bmN0aW9uKXNhZF9zZXRpbmZvLCBNRVRIX099LAorICAgIHsgImRyYWluIiwgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXNhZF9kcmFpbiwgTUVUSF9OT0FSR1MgfSwKKyAgICB7ICJmbHVzaCIsICAgICAgICAgIChQeUNGdW5jdGlvbilzYWRfZmx1c2gsIE1FVEhfTk9BUkdTIH0sCiAjaWZkZWYgU09MQVJJUwotCXsgImdldGRldiIsCShQeUNGdW5jdGlvbilzYWRfZ2V0ZGV2LCBNRVRIX05PQVJHUyB9LAorICAgIHsgImdldGRldiIsICAgICAgICAgKFB5Q0Z1bmN0aW9uKXNhZF9nZXRkZXYsIE1FVEhfTk9BUkdTIH0sCiAjZW5kaWYKLSAgICAgICAgeyAiY2xvc2UiLAkoUHlDRnVuY3Rpb24pc2FkX2Nsb3NlLCBNRVRIX05PQVJHUyB9LAotCXsgImZpbGVubyIsICAgICAoUHlDRnVuY3Rpb24pc2FkX2ZpbGVubywgTUVUSF9OT0FSR1MgfSwKLQl7TlVMTCwJCU5VTEx9CQkvKiBzZW50aW5lbCAqLworICAgIHsgImNsb3NlIiwgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXNhZF9jbG9zZSwgTUVUSF9OT0FSR1MgfSwKKyAgICB7ICJmaWxlbm8iLCAgICAgKFB5Q0Z1bmN0aW9uKXNhZF9maWxlbm8sIE1FVEhfTk9BUkdTIH0sCisgICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzYWRfZ2V0YXR0cihzYWRvYmplY3QgKnhwLCBjaGFyICpuYW1lKQogewotCWlmICh4cC0+eF9pc2N0bCkKLQkJcmV0dXJuIFB5X0ZpbmRNZXRob2Qoc2FkX21ldGhvZHMrQ1RMX01FVEhPRFMsCi0JCQkJICAgICAoUHlPYmplY3QgKil4cCwgbmFtZSk7Ci0JZWxzZQotCQlyZXR1cm4gUHlfRmluZE1ldGhvZChzYWRfbWV0aG9kcywgKFB5T2JqZWN0ICopeHAsIG5hbWUpOworICAgIGlmICh4cC0+eF9pc2N0bCkKKyAgICAgICAgcmV0dXJuIFB5X0ZpbmRNZXRob2Qoc2FkX21ldGhvZHMrQ1RMX01FVEhPRFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQeU9iamVjdCAqKXhwLCBuYW1lKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBQeV9GaW5kTWV0aG9kKHNhZF9tZXRob2RzLCAoUHlPYmplY3QgKil4cCwgbmFtZSk7CiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKIHN0YXRpYyBzYWRzdGF0dXNvYmplY3QgKgogc2Fkc19hbGxvYyh2b2lkKSB7Ci0JcmV0dXJuIFB5T2JqZWN0X05ldyhzYWRzdGF0dXNvYmplY3QsICZTYWRzdGF0dXN0eXBlKTsKKyAgICByZXR1cm4gUHlPYmplY3RfTmV3KHNhZHN0YXR1c29iamVjdCwgJlNhZHN0YXR1c3R5cGUpOwogfQogCiBzdGF0aWMgdm9pZAogc2Fkc19kZWFsbG9jKHNhZHN0YXR1c29iamVjdCAqeHApCiB7Ci0JUHlNZW1fREVMKHhwKTsKKyAgICBQeU1lbV9ERUwoeHApOwogfQogCiAjZGVmaW5lIE9GRih4KSBvZmZzZXRvZihhdWRpb19pbmZvX3QseCkKIHN0YXRpYyBzdHJ1Y3QgbWVtYmVybGlzdCBzYWRzX21sW10gPSB7Ci0JeyAiaV9zYW1wbGVfcmF0ZSIsCVRfVUlOVCwJCU9GRihyZWNvcmQuc2FtcGxlX3JhdGUpIH0sCi0JeyAiaV9jaGFubmVscyIsCQlUX1VJTlQsCQlPRkYocmVjb3JkLmNoYW5uZWxzKSB9LAotCXsgImlfcHJlY2lzaW9uIiwJVF9VSU5ULAkJT0ZGKHJlY29yZC5wcmVjaXNpb24pIH0sCi0JeyAiaV9lbmNvZGluZyIsCQlUX1VJTlQsCQlPRkYocmVjb3JkLmVuY29kaW5nKSB9LAotCXsgImlfZ2FpbiIsCQlUX1VJTlQsCQlPRkYocmVjb3JkLmdhaW4pIH0sCi0JeyAiaV9wb3J0IiwJCVRfVUlOVCwJCU9GRihyZWNvcmQucG9ydCkgfSwKLQl7ICJpX3NhbXBsZXMiLAkJVF9VSU5ULAkJT0ZGKHJlY29yZC5zYW1wbGVzKSB9LAotCXsgImlfZW9mIiwJCVRfVUlOVCwJCU9GRihyZWNvcmQuZW9mKSB9LAotCXsgImlfcGF1c2UiLAkJVF9VQllURSwJT0ZGKHJlY29yZC5wYXVzZSkgfSwKLQl7ICJpX2Vycm9yIiwJCVRfVUJZVEUsCU9GRihyZWNvcmQuZXJyb3IpIH0sCi0JeyAiaV93YWl0aW5nIiwJCVRfVUJZVEUsCU9GRihyZWNvcmQud2FpdGluZykgfSwKLQl7ICJpX29wZW4iLAkJVF9VQllURSwJT0ZGKHJlY29yZC5vcGVuKSAsCSBST30sCi0JeyAiaV9hY3RpdmUiLAkJVF9VQllURSwJT0ZGKHJlY29yZC5hY3RpdmUpICwJIFJPfSwKKyAgICB7ICJpX3NhbXBsZV9yYXRlIiwgICAgICAgICAgVF9VSU5ULCAgICAgICAgIE9GRihyZWNvcmQuc2FtcGxlX3JhdGUpIH0sCisgICAgeyAiaV9jaGFubmVscyIsICAgICAgICAgICAgIFRfVUlOVCwgICAgICAgICBPRkYocmVjb3JkLmNoYW5uZWxzKSB9LAorICAgIHsgImlfcHJlY2lzaW9uIiwgICAgICAgICAgICBUX1VJTlQsICAgICAgICAgT0ZGKHJlY29yZC5wcmVjaXNpb24pIH0sCisgICAgeyAiaV9lbmNvZGluZyIsICAgICAgICAgICAgIFRfVUlOVCwgICAgICAgICBPRkYocmVjb3JkLmVuY29kaW5nKSB9LAorICAgIHsgImlfZ2FpbiIsICAgICAgICAgICAgICAgICBUX1VJTlQsICAgICAgICAgT0ZGKHJlY29yZC5nYWluKSB9LAorICAgIHsgImlfcG9ydCIsICAgICAgICAgICAgICAgICBUX1VJTlQsICAgICAgICAgT0ZGKHJlY29yZC5wb3J0KSB9LAorICAgIHsgImlfc2FtcGxlcyIsICAgICAgICAgICAgICBUX1VJTlQsICAgICAgICAgT0ZGKHJlY29yZC5zYW1wbGVzKSB9LAorICAgIHsgImlfZW9mIiwgICAgICAgICAgICAgICAgICBUX1VJTlQsICAgICAgICAgT0ZGKHJlY29yZC5lb2YpIH0sCisgICAgeyAiaV9wYXVzZSIsICAgICAgICAgICAgICAgIFRfVUJZVEUsICAgICAgICBPRkYocmVjb3JkLnBhdXNlKSB9LAorICAgIHsgImlfZXJyb3IiLCAgICAgICAgICAgICAgICBUX1VCWVRFLCAgICAgICAgT0ZGKHJlY29yZC5lcnJvcikgfSwKKyAgICB7ICJpX3dhaXRpbmciLCAgICAgICAgICAgICAgVF9VQllURSwgICAgICAgIE9GRihyZWNvcmQud2FpdGluZykgfSwKKyAgICB7ICJpX29wZW4iLCAgICAgICAgICAgICAgICAgVF9VQllURSwgICAgICAgIE9GRihyZWNvcmQub3BlbikgLCAgICAgICBST30sCisgICAgeyAiaV9hY3RpdmUiLCAgICAgICAgICAgICAgIFRfVUJZVEUsICAgICAgICBPRkYocmVjb3JkLmFjdGl2ZSkgLCAgICAgUk99LAogI2lmZGVmIFNPTEFSSVMKLQl7ICJpX2J1ZmZlcl9zaXplIiwJVF9VSU5ULAkJT0ZGKHJlY29yZC5idWZmZXJfc2l6ZSkgfSwKLQl7ICJpX2JhbGFuY2UiLAkJVF9VQllURSwJT0ZGKHJlY29yZC5iYWxhbmNlKSB9LAotCXsgImlfYXZhaWxfcG9ydHMiLAlUX1VJTlQsCQlPRkYocmVjb3JkLmF2YWlsX3BvcnRzKSB9LAorICAgIHsgImlfYnVmZmVyX3NpemUiLCAgICAgICAgICBUX1VJTlQsICAgICAgICAgT0ZGKHJlY29yZC5idWZmZXJfc2l6ZSkgfSwKKyAgICB7ICJpX2JhbGFuY2UiLCAgICAgICAgICAgICAgVF9VQllURSwgICAgICAgIE9GRihyZWNvcmQuYmFsYW5jZSkgfSwKKyAgICB7ICJpX2F2YWlsX3BvcnRzIiwgICAgICAgICAgVF9VSU5ULCAgICAgICAgIE9GRihyZWNvcmQuYXZhaWxfcG9ydHMpIH0sCiAjZW5kaWYKIAotCXsgIm9fc2FtcGxlX3JhdGUiLAlUX1VJTlQsCQlPRkYocGxheS5zYW1wbGVfcmF0ZSkgfSwKLQl7ICJvX2NoYW5uZWxzIiwJCVRfVUlOVCwJCU9GRihwbGF5LmNoYW5uZWxzKSB9LAotCXsgIm9fcHJlY2lzaW9uIiwJVF9VSU5ULAkJT0ZGKHBsYXkucHJlY2lzaW9uKSB9LAotCXsgIm9fZW5jb2RpbmciLAkJVF9VSU5ULAkJT0ZGKHBsYXkuZW5jb2RpbmcpIH0sCi0JeyAib19nYWluIiwJCVRfVUlOVCwJCU9GRihwbGF5LmdhaW4pIH0sCi0JeyAib19wb3J0IiwJCVRfVUlOVCwJCU9GRihwbGF5LnBvcnQpIH0sCi0JeyAib19zYW1wbGVzIiwJCVRfVUlOVCwJCU9GRihwbGF5LnNhbXBsZXMpIH0sCi0JeyAib19lb2YiLAkJVF9VSU5ULAkJT0ZGKHBsYXkuZW9mKSB9LAotCXsgIm9fcGF1c2UiLAkJVF9VQllURSwJT0ZGKHBsYXkucGF1c2UpIH0sCi0JeyAib19lcnJvciIsCQlUX1VCWVRFLAlPRkYocGxheS5lcnJvcikgfSwKLQl7ICJvX3dhaXRpbmciLAkJVF9VQllURSwJT0ZGKHBsYXkud2FpdGluZykgfSwKLQl7ICJvX29wZW4iLAkJVF9VQllURSwJT0ZGKHBsYXkub3BlbikgLAkgUk99LAotCXsgIm9fYWN0aXZlIiwJCVRfVUJZVEUsCU9GRihwbGF5LmFjdGl2ZSkgLAkgUk99LAorICAgIHsgIm9fc2FtcGxlX3JhdGUiLCAgICAgICAgICBUX1VJTlQsICAgICAgICAgT0ZGKHBsYXkuc2FtcGxlX3JhdGUpIH0sCisgICAgeyAib19jaGFubmVscyIsICAgICAgICAgICAgIFRfVUlOVCwgICAgICAgICBPRkYocGxheS5jaGFubmVscykgfSwKKyAgICB7ICJvX3ByZWNpc2lvbiIsICAgICAgICAgICAgVF9VSU5ULCAgICAgICAgIE9GRihwbGF5LnByZWNpc2lvbikgfSwKKyAgICB7ICJvX2VuY29kaW5nIiwgICAgICAgICAgICAgVF9VSU5ULCAgICAgICAgIE9GRihwbGF5LmVuY29kaW5nKSB9LAorICAgIHsgIm9fZ2FpbiIsICAgICAgICAgICAgICAgICBUX1VJTlQsICAgICAgICAgT0ZGKHBsYXkuZ2FpbikgfSwKKyAgICB7ICJvX3BvcnQiLCAgICAgICAgICAgICAgICAgVF9VSU5ULCAgICAgICAgIE9GRihwbGF5LnBvcnQpIH0sCisgICAgeyAib19zYW1wbGVzIiwgICAgICAgICAgICAgIFRfVUlOVCwgICAgICAgICBPRkYocGxheS5zYW1wbGVzKSB9LAorICAgIHsgIm9fZW9mIiwgICAgICAgICAgICAgICAgICBUX1VJTlQsICAgICAgICAgT0ZGKHBsYXkuZW9mKSB9LAorICAgIHsgIm9fcGF1c2UiLCAgICAgICAgICAgICAgICBUX1VCWVRFLCAgICAgICAgT0ZGKHBsYXkucGF1c2UpIH0sCisgICAgeyAib19lcnJvciIsICAgICAgICAgICAgICAgIFRfVUJZVEUsICAgICAgICBPRkYocGxheS5lcnJvcikgfSwKKyAgICB7ICJvX3dhaXRpbmciLCAgICAgICAgICAgICAgVF9VQllURSwgICAgICAgIE9GRihwbGF5LndhaXRpbmcpIH0sCisgICAgeyAib19vcGVuIiwgICAgICAgICAgICAgICAgIFRfVUJZVEUsICAgICAgICBPRkYocGxheS5vcGVuKSAsICAgICAgICAgUk99LAorICAgIHsgIm9fYWN0aXZlIiwgICAgICAgICAgICAgICBUX1VCWVRFLCAgICAgICAgT0ZGKHBsYXkuYWN0aXZlKSAsICAgICAgIFJPfSwKICNpZmRlZiBTT0xBUklTCi0JeyAib19idWZmZXJfc2l6ZSIsCVRfVUlOVCwJCU9GRihwbGF5LmJ1ZmZlcl9zaXplKSB9LAotCXsgIm9fYmFsYW5jZSIsCQlUX1VCWVRFLAlPRkYocGxheS5iYWxhbmNlKSB9LAotCXsgIm9fYXZhaWxfcG9ydHMiLAlUX1VJTlQsCQlPRkYocGxheS5hdmFpbF9wb3J0cykgfSwKKyAgICB7ICJvX2J1ZmZlcl9zaXplIiwgICAgICAgICAgVF9VSU5ULCAgICAgICAgIE9GRihwbGF5LmJ1ZmZlcl9zaXplKSB9LAorICAgIHsgIm9fYmFsYW5jZSIsICAgICAgICAgICAgICBUX1VCWVRFLCAgICAgICAgT0ZGKHBsYXkuYmFsYW5jZSkgfSwKKyAgICB7ICJvX2F2YWlsX3BvcnRzIiwgICAgICAgICAgVF9VSU5ULCAgICAgICAgIE9GRihwbGF5LmF2YWlsX3BvcnRzKSB9LAogI2VuZGlmCiAKLQl7ICJtb25pdG9yX2dhaW4iLAlUX1VJTlQsCQlPRkYobW9uaXRvcl9nYWluKSB9LAotICAgICAgICB7IE5VTEwsICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgMH0sCisgICAgeyAibW9uaXRvcl9nYWluIiwgICAgICAgICAgIFRfVUlOVCwgICAgICAgICBPRkYobW9uaXRvcl9nYWluKSB9LAorICAgIHsgTlVMTCwgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAwfSwKIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzYWRzX2dldGF0dHIoc2Fkc3RhdHVzb2JqZWN0ICp4cCwgY2hhciAqbmFtZSkKIHsKLQlyZXR1cm4gUHlNZW1iZXJfR2V0KChjaGFyICopJnhwLT5haSwgc2Fkc19tbCwgbmFtZSk7CisgICAgcmV0dXJuIFB5TWVtYmVyX0dldCgoY2hhciAqKSZ4cC0+YWksIHNhZHNfbWwsIG5hbWUpOwogfQogCiBzdGF0aWMgaW50CiBzYWRzX3NldGF0dHIoc2Fkc3RhdHVzb2JqZWN0ICp4cCwgY2hhciAqbmFtZSwgUHlPYmplY3QgKnYpCiB7CiAKLQlpZiAodiA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJImNhbid0IGRlbGV0ZSBzdW4gYXVkaW8gc3RhdHVzIGF0dHJpYnV0ZXMiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlyZXR1cm4gUHlNZW1iZXJfU2V0KChjaGFyICopJnhwLT5haSwgc2Fkc19tbCwgbmFtZSwgdik7CisgICAgaWYgKHYgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImNhbid0IGRlbGV0ZSBzdW4gYXVkaW8gc3RhdHVzIGF0dHJpYnV0ZXMiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gUHlNZW1iZXJfU2V0KChjaGFyICopJnhwLT5haSwgc2Fkc19tbCwgbmFtZSwgdik7CiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IFNhZHR5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKLQkic3VuYXVkaW9kZXYuc3VuX2F1ZGlvX2RldmljZSIsCS8qdHBfbmFtZSovCi0Jc2l6ZW9mKHNhZG9iamVjdCksCQkvKnRwX3NpemUqLwotCTAsCQkJCS8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcilzYWRfZGVhbGxvYywJLyp0cF9kZWFsbG9jKi8KLQkwLAkJCQkvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpc2FkX2dldGF0dHIsCS8qdHBfZ2V0YXR0ciovCi0JMCwJCQkJLyp0cF9zZXRhdHRyKi8KLQkwLAkJCQkvKnRwX2NvbXBhcmUqLwotCTAsCQkJCS8qdHBfcmVwciovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKKyAgICAic3VuYXVkaW9kZXYuc3VuX2F1ZGlvX2RldmljZSIsICAgICAvKnRwX25hbWUqLworICAgIHNpemVvZihzYWRvYmplY3QpLCAgICAgICAgICAgICAgICAgIC8qdHBfc2l6ZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKXNhZF9kZWFsbG9jLCAgICAgICAgICAgIC8qdHBfZGVhbGxvYyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKXNhZF9nZXRhdHRyLCAgICAgICAgICAgLyp0cF9nZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY29tcGFyZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9yZXByKi8KIH07CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgU2Fkc3RhdHVzdHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQotCSJzdW5hdWRpb2Rldi5zdW5fYXVkaW9fZGV2aWNlX3N0YXR1cyIsIC8qdHBfbmFtZSovCi0Jc2l6ZW9mKHNhZHN0YXR1c29iamVjdCksCS8qdHBfc2l6ZSovCi0JMCwJCQkJLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKXNhZHNfZGVhbGxvYywJLyp0cF9kZWFsbG9jKi8KLQkwLAkJCQkvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpc2Fkc19nZXRhdHRyLAkvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYylzYWRzX3NldGF0dHIsCS8qdHBfc2V0YXR0ciovCi0JMCwJCQkJLyp0cF9jb21wYXJlKi8KLQkwLAkJCQkvKnRwX3JlcHIqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCisgICAgInN1bmF1ZGlvZGV2LnN1bl9hdWRpb19kZXZpY2Vfc3RhdHVzIiwgLyp0cF9uYW1lKi8KKyAgICBzaXplb2Yoc2Fkc3RhdHVzb2JqZWN0KSwgICAgICAgICAgICAvKnRwX3NpemUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcilzYWRzX2RlYWxsb2MsICAgICAgICAgICAvKnRwX2RlYWxsb2MqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYylzYWRzX2dldGF0dHIsICAgICAgICAgIC8qdHBfZ2V0YXR0ciovCisgICAgKHNldGF0dHJmdW5jKXNhZHNfc2V0YXR0ciwgICAgICAgICAgLyp0cF9zZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NvbXBhcmUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmVwciovCiB9OwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiBzdGF0aWMgUHlPYmplY3QgKgogc2Fkb3BlbihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIChQeU9iamVjdCAqKW5ld3NhZG9iamVjdChhcmdzKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopbmV3c2Fkb2JqZWN0KGFyZ3MpOwogfQotICAgIAorCiBzdGF0aWMgUHlNZXRob2REZWYgc3VuYXVkaW9kZXZfbWV0aG9kc1tdID0gewogICAgIHsgIm9wZW4iLCBzYWRvcGVuLCBNRVRIX1ZBUkFSR1MgfSwKICAgICB7IDAsIDAgfSwKQEAgLTQ1MSwxNyArNDUxLDE3IEBACiB2b2lkCiBpbml0c3VuYXVkaW9kZXYodm9pZCkKIHsKLQlQeU9iamVjdCAqbSwgKmQ7Ci0JCi0JaWYgKFB5RXJyX1dhcm5QeTNrKCJ0aGUgc3VuYXVkaW9kZXYgbW9kdWxlIGhhcyBiZWVuIHJlbW92ZWQgaW4gIgotCSAgICAgICAgICAgICAgICAgICAiUHl0aG9uIDMuMCIsIDIpIDwgMCkKLQkgICAgcmV0dXJuOworICAgIFB5T2JqZWN0ICptLCAqZDsKIAotCW0gPSBQeV9Jbml0TW9kdWxlKCJzdW5hdWRpb2RldiIsIHN1bmF1ZGlvZGV2X21ldGhvZHMpOwotCWlmIChtID09IE5VTEwpCi0JCXJldHVybjsKLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQlTdW5BdWRpb0Vycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJzdW5hdWRpb2Rldi5lcnJvciIsIE5VTEwsIE5VTEwpOwotCWlmIChTdW5BdWRpb0Vycm9yKQotCQlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiZXJyb3IiLCBTdW5BdWRpb0Vycm9yKTsKKyAgICBpZiAoUHlFcnJfV2FyblB5M2soInRoZSBzdW5hdWRpb2RldiBtb2R1bGUgaGFzIGJlZW4gcmVtb3ZlZCBpbiAiCisgICAgICAgICAgICAgICAgICAgICAgICJQeXRob24gMy4wIiwgMikgPCAwKQorICAgICAgICByZXR1cm47CisKKyAgICBtID0gUHlfSW5pdE1vZHVsZSgic3VuYXVkaW9kZXYiLCBzdW5hdWRpb2Rldl9tZXRob2RzKTsKKyAgICBpZiAobSA9PSBOVUxMKQorICAgICAgICByZXR1cm47CisgICAgZCA9IFB5TW9kdWxlX0dldERpY3QobSk7CisgICAgU3VuQXVkaW9FcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbigic3VuYXVkaW9kZXYuZXJyb3IiLCBOVUxMLCBOVUxMKTsKKyAgICBpZiAoU3VuQXVkaW9FcnJvcikKKyAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgImVycm9yIiwgU3VuQXVkaW9FcnJvcik7CiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3N2bW9kdWxlLmMgYi9Nb2R1bGVzL3N2bW9kdWxlLmMKaW5kZXggMzg0NWUyMC4uNmU0MTljZSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9zdm1vZHVsZS5jCisrKyBiL01vZHVsZXMvc3Ztb2R1bGUuYwpAQCAtOSwyMyArOSwyMyBAQAogI2luY2x1ZGUgPHN2aWRlby5oPgogI2luY2x1ZGUgIlB5dGhvbi5oIgogI2luY2x1ZGUgImNvbXBpbGUuaCIKLSNpbmNsdWRlICJ5dXYuaCIJCS8qIGZvciBZVVYgY29udmVyc2lvbiBmdW5jdGlvbnMgKi8KKyNpbmNsdWRlICJ5dXYuaCIgICAgICAgICAgICAgICAgLyogZm9yIFlVViBjb252ZXJzaW9uIGZ1bmN0aW9ucyAqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCVNWX25vZGVQIG9iX3N2aWRlbzsKLQlzdkNhcHR1cmVJbmZvIG9iX2luZm87CisgICAgUHlPYmplY3RfSEVBRAorICAgIFNWX25vZGVQIG9iX3N2aWRlbzsKKyAgICBzdkNhcHR1cmVJbmZvIG9iX2luZm87CiB9IHN2b2JqZWN0OwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCXZvaWQgKm9iX2NhcHR1cmU7Ci0JaW50IG9iX211c3R1bmxvY2s7Ci0Jc3ZDYXB0dXJlSW5mbyBvYl9pbmZvOwotCXN2b2JqZWN0ICpvYl9zdmlkZW87CisgICAgUHlPYmplY3RfSEVBRAorICAgIHZvaWQgKm9iX2NhcHR1cmU7CisgICAgaW50IG9iX211c3R1bmxvY2s7CisgICAgc3ZDYXB0dXJlSW5mbyBvYl9pbmZvOworICAgIHN2b2JqZWN0ICpvYl9zdmlkZW87CiB9IGNhcHR1cmVvYmplY3Q7CiAKLXN0YXRpYyBQeU9iamVjdCAqU3ZFcnJvcjsJCS8qIGV4Y2VwdGlvbiBzdi5lcnJvciAqLworc3RhdGljIFB5T2JqZWN0ICpTdkVycm9yOyAgICAgICAgICAgICAgIC8qIGV4Y2VwdGlvbiBzdi5lcnJvciAqLwogCiBzdGF0aWMgUHlPYmplY3QgKm5ld2NhcHR1cmVvYmplY3Qoc3ZvYmplY3QgKiwgdm9pZCAqLCBpbnQpOwogCkBAIC0zMywzNiArMzMsMzYgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdl9lcnJvcih2b2lkKQogewotCVB5RXJyX1NldFN0cmluZyhTdkVycm9yLCBzdlN0cmVycm9yKHN2aWRlb19lcnJubykpOwotCXJldHVybiBOVUxMOworICAgIFB5RXJyX1NldFN0cmluZyhTdkVycm9yLCBzdlN0cmVycm9yKHN2aWRlb19lcnJubykpOworICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgotc3ZjX2NvbnZlcnNpb24oY2FwdHVyZW9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIHZvaWQgKCpmdW5jdGlvbikoKSwJZmxvYXQgZmFjdG9yKQorc3ZjX2NvbnZlcnNpb24oY2FwdHVyZW9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIHZvaWQgKCpmdW5jdGlvbikoKSwgZmxvYXQgZmFjdG9yKQogewotCVB5T2JqZWN0ICpvdXRwdXQ7Ci0JaW50IGludmVydDsKLQljaGFyKiBvdXRzdHI7CisgICAgUHlPYmplY3QgKm91dHB1dDsKKyAgICBpbnQgaW52ZXJ0OworICAgIGNoYXIqIG91dHN0cjsKIAotCWlmICghUHlBcmdfUGFyc2UoYXJncywgImkiLCAmaW52ZXJ0KSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiaSIsICZpbnZlcnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmICghKG91dHB1dCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKAotCQlOVUxMLAotCQkoaW50KShzZWxmLT5vYl9pbmZvLndpZHRoICogc2VsZi0+b2JfaW5mby5oZWlnaHQgKiBmYWN0b3IpKSkpCi0JewotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKCEob3V0c3RyID0gUHlTdHJpbmdfQXNTdHJpbmcob3V0cHV0KSkpIHsKLQkJUHlfREVDUkVGKG91dHB1dCk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoIShvdXRwdXQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgKKyAgICAgICAgTlVMTCwKKyAgICAgICAgKGludCkoc2VsZi0+b2JfaW5mby53aWR0aCAqIHNlbGYtPm9iX2luZm8uaGVpZ2h0ICogZmFjdG9yKSkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmICghKG91dHN0ciA9IFB5U3RyaW5nX0FzU3RyaW5nKG91dHB1dCkpKSB7CisgICAgICAgIFB5X0RFQ1JFRihvdXRwdXQpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQkoKmZ1bmN0aW9uKSgoYm9vbGVhbilpbnZlcnQsIHNlbGYtPm9iX2NhcHR1cmUsCi0JCSAgICBvdXRzdHIsCi0JCSAgICBzZWxmLT5vYl9pbmZvLndpZHRoLCBzZWxmLT5vYl9pbmZvLmhlaWdodCk7CisgICAgKCpmdW5jdGlvbikoKGJvb2xlYW4paW52ZXJ0LCBzZWxmLT5vYl9jYXB0dXJlLAorICAgICAgICAgICAgICAgIG91dHN0ciwKKyAgICAgICAgICAgICAgICBzZWxmLT5vYl9pbmZvLndpZHRoLCBzZWxmLT5vYl9pbmZvLmhlaWdodCk7CiAKLQlyZXR1cm4gb3V0cHV0OworICAgIHJldHVybiBvdXRwdXQ7CiB9CiAKIC8qCkBAIC03MiwxMTcgKzcyLDExNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHN2Y19ZVVZ0b1lVVjQyMkRDKGNhcHR1cmVvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWlmIChzZWxmLT5vYl9pbmZvLmZvcm1hdCAhPSBTVl9ZVVY0MTFfRlJBTUVTKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhTdkVycm9yLCAiZGF0YSBoYXMgYmFkIGZvcm1hdCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIHN2Y19jb252ZXJzaW9uKHNlbGYsIGFyZ3MsIHl1dl9zdjQxMV90b19jbDQyMmRjLCAyLjApOworICAgIGlmIChzZWxmLT5vYl9pbmZvLmZvcm1hdCAhPSBTVl9ZVVY0MTFfRlJBTUVTKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhTdkVycm9yLCAiZGF0YSBoYXMgYmFkIGZvcm1hdCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIHN2Y19jb252ZXJzaW9uKHNlbGYsIGFyZ3MsIHl1dl9zdjQxMV90b19jbDQyMmRjLCAyLjApOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc3ZjX1lVVnRvWVVWNDIyRENfcXVhcnRlcihjYXB0dXJlb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpZiAoc2VsZi0+b2JfaW5mby5mb3JtYXQgIT0gU1ZfWVVWNDExX0ZSQU1FUykgewotCQlQeUVycl9TZXRTdHJpbmcoU3ZFcnJvciwgImRhdGEgaGFzIGJhZCBmb3JtYXQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBzdmNfY29udmVyc2lvbihzZWxmLCBhcmdzLAotCQkJICAgICAgeXV2X3N2NDExX3RvX2NsNDIyZGNfcXVhcnRlcnNpemUsIDAuNSk7CisgICAgaWYgKHNlbGYtPm9iX2luZm8uZm9ybWF0ICE9IFNWX1lVVjQxMV9GUkFNRVMpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFN2RXJyb3IsICJkYXRhIGhhcyBiYWQgZm9ybWF0Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gc3ZjX2NvbnZlcnNpb24oc2VsZiwgYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgeXV2X3N2NDExX3RvX2NsNDIyZGNfcXVhcnRlcnNpemUsIDAuNSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdmNfWVVWdG9ZVVY0MjJEQ19zaXh0ZWVudGgoY2FwdHVyZW9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaWYgKHNlbGYtPm9iX2luZm8uZm9ybWF0ICE9IFNWX1lVVjQxMV9GUkFNRVMpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFN2RXJyb3IsICJkYXRhIGhhcyBiYWQgZm9ybWF0Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gc3ZjX2NvbnZlcnNpb24oc2VsZiwgYXJncywKLQkJCSAgICAgIHl1dl9zdjQxMV90b19jbDQyMmRjX3NpeHRlZW50aHNpemUsIDAuMTI1KTsKKyAgICBpZiAoc2VsZi0+b2JfaW5mby5mb3JtYXQgIT0gU1ZfWVVWNDExX0ZSQU1FUykgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoU3ZFcnJvciwgImRhdGEgaGFzIGJhZCBmb3JtYXQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBzdmNfY29udmVyc2lvbihzZWxmLCBhcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICB5dXZfc3Y0MTFfdG9fY2w0MjJkY19zaXh0ZWVudGhzaXplLCAwLjEyNSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdmNfWVVWdG9SR0IoY2FwdHVyZW9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc3dpdGNoIChzZWxmLT5vYl9pbmZvLmZvcm1hdCkgewotCWNhc2UgU1ZfWVVWNDExX0ZSQU1FUzoKLQljYXNlIFNWX1lVVjQxMV9GUkFNRVNfQU5EX0JMQU5LSU5HX0JVRkZFUjoKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJUHlFcnJfU2V0U3RyaW5nKFN2RXJyb3IsICJkYXRhIGhhZCBiYWQgZm9ybWF0Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gc3ZjX2NvbnZlcnNpb24oc2VsZiwgYXJncywgc3ZZVVZ0b1JHQiwgKGZsb2F0KSBzaXplb2YobG9uZykpOworICAgIHN3aXRjaCAoc2VsZi0+b2JfaW5mby5mb3JtYXQpIHsKKyAgICBjYXNlIFNWX1lVVjQxMV9GUkFNRVM6CisgICAgY2FzZSBTVl9ZVVY0MTFfRlJBTUVTX0FORF9CTEFOS0lOR19CVUZGRVI6CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhTdkVycm9yLCAiZGF0YSBoYWQgYmFkIGZvcm1hdCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIHN2Y19jb252ZXJzaW9uKHNlbGYsIGFyZ3MsIHN2WVVWdG9SR0IsIChmbG9hdCkgc2l6ZW9mKGxvbmcpKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHN2Y19SR0I4dG9SR0IzMihjYXB0dXJlb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpZiAoc2VsZi0+b2JfaW5mby5mb3JtYXQgIT0gU1ZfUkdCOF9GUkFNRVMpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFN2RXJyb3IsICJkYXRhIGhhcyBiYWQgZm9ybWF0Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gc3ZjX2NvbnZlcnNpb24oc2VsZiwgYXJncywgc3ZSR0I4dG9SR0IzMiwgKGZsb2F0KSBzaXplb2YobG9uZykpOworICAgIGlmIChzZWxmLT5vYl9pbmZvLmZvcm1hdCAhPSBTVl9SR0I4X0ZSQU1FUykgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoU3ZFcnJvciwgImRhdGEgaGFzIGJhZCBmb3JtYXQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBzdmNfY29udmVyc2lvbihzZWxmLCBhcmdzLCBzdlJHQjh0b1JHQjMyLCAoZmxvYXQpIHNpemVvZihsb25nKSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdmNfSW50ZXJsZWF2ZUZpZWxkcyhjYXB0dXJlb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpZiAoc2VsZi0+b2JfaW5mby5mb3JtYXQgIT0gU1ZfUkdCOF9GUkFNRVMpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFN2RXJyb3IsICJkYXRhIGhhcyBiYWQgZm9ybWF0Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gc3ZjX2NvbnZlcnNpb24oc2VsZiwgYXJncywgc3ZJbnRlcmxlYXZlRmllbGRzLCAxLjApOworICAgIGlmIChzZWxmLT5vYl9pbmZvLmZvcm1hdCAhPSBTVl9SR0I4X0ZSQU1FUykgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoU3ZFcnJvciwgImRhdGEgaGFzIGJhZCBmb3JtYXQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBzdmNfY29udmVyc2lvbihzZWxmLCBhcmdzLCBzdkludGVybGVhdmVGaWVsZHMsIDEuMCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdmNfR2V0RmllbGRzKGNhcHR1cmVvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICpmMSA9IE5VTEw7Ci0JUHlPYmplY3QgKmYyID0gTlVMTDsKLQlQeU9iamVjdCAqcmV0ID0gTlVMTDsKLQlpbnQgZmllbGRzaXplOwotCWNoYXIqIG9iY2FwdHVyZTsKKyAgICBQeU9iamVjdCAqZjEgPSBOVUxMOworICAgIFB5T2JqZWN0ICpmMiA9IE5VTEw7CisgICAgUHlPYmplY3QgKnJldCA9IE5VTEw7CisgICAgaW50IGZpZWxkc2l6ZTsKKyAgICBjaGFyKiBvYmNhcHR1cmU7CiAKLQlpZiAoc2VsZi0+b2JfaW5mby5mb3JtYXQgIT0gU1ZfUkdCOF9GUkFNRVMpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFN2RXJyb3IsICJkYXRhIGhhcyBiYWQgZm9ybWF0Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoc2VsZi0+b2JfaW5mby5mb3JtYXQgIT0gU1ZfUkdCOF9GUkFNRVMpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFN2RXJyb3IsICJkYXRhIGhhcyBiYWQgZm9ybWF0Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWZpZWxkc2l6ZSA9IHNlbGYtPm9iX2luZm8ud2lkdGggKiBzZWxmLT5vYl9pbmZvLmhlaWdodCAvIDI7Ci0Jb2JjYXB0dXJlID0gKGNoYXIqKXNlbGYtPm9iX2NhcHR1cmU7Ci0JCi0JaWYgKCEoZjEgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShvYmNhcHR1cmUsIGZpZWxkc2l6ZSkpKQotCQlnb3RvIGZpbmFsbHk7Ci0JaWYgKCEoZjIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShvYmNhcHR1cmUgKyBmaWVsZHNpemUsCi0JCQkJCSAgICAgIGZpZWxkc2l6ZSkpKQotCQlnb3RvIGZpbmFsbHk7Ci0JcmV0ID0gUHlUdXBsZV9QYWNrKDIsIGYxLCBmMik7CisgICAgZmllbGRzaXplID0gc2VsZi0+b2JfaW5mby53aWR0aCAqIHNlbGYtPm9iX2luZm8uaGVpZ2h0IC8gMjsKKyAgICBvYmNhcHR1cmUgPSAoY2hhciopc2VsZi0+b2JfY2FwdHVyZTsKKworICAgIGlmICghKGYxID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUob2JjYXB0dXJlLCBmaWVsZHNpemUpKSkKKyAgICAgICAgZ290byBmaW5hbGx5OworICAgIGlmICghKGYyID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUob2JjYXB0dXJlICsgZmllbGRzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRzaXplKSkpCisgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICByZXQgPSBQeVR1cGxlX1BhY2soMiwgZjEsIGYyKTsKIAogICBmaW5hbGx5OgotCVB5X1hERUNSRUYoZjEpOwotCVB5X1hERUNSRUYoZjIpOwotCXJldHVybiByZXQ7CisgICAgUHlfWERFQ1JFRihmMSk7CisgICAgUHlfWERFQ1JFRihmMik7CisgICAgcmV0dXJuIHJldDsKIH0KLQkKKwogc3RhdGljIFB5T2JqZWN0ICoKIHN2Y19VbmxvY2tDYXB0dXJlRGF0YShjYXB0dXJlb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKCFzZWxmLT5vYl9tdXN0dW5sb2NrKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhTdkVycm9yLCAiYnVmZmVyIHNob3VsZCBub3QgYmUgdW5sb2NrZWQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICghc2VsZi0+b2JfbXVzdHVubG9jaykgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoU3ZFcnJvciwgImJ1ZmZlciBzaG91bGQgbm90IGJlIHVubG9ja2VkIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWlmIChzdlVubG9ja0NhcHR1cmVEYXRhKHNlbGYtPm9iX3N2aWRlby0+b2Jfc3ZpZGVvLCBzZWxmLT5vYl9jYXB0dXJlKSkKLQkJcmV0dXJuIHN2X2Vycm9yKCk7CisgICAgaWYgKHN2VW5sb2NrQ2FwdHVyZURhdGEoc2VsZi0+b2Jfc3ZpZGVvLT5vYl9zdmlkZW8sIHNlbGYtPm9iX2NhcHR1cmUpKQorICAgICAgICByZXR1cm4gc3ZfZXJyb3IoKTsKIAotCXNlbGYtPm9iX211c3R1bmxvY2sgPSAwOworICAgIHNlbGYtPm9iX211c3R1bmxvY2sgPSAwOwogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogI2lmZGVmIFVTRV9HTApAQCAtMTkxLDc4MCArMTkxLDc4MCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHN2Y19scmVjdHdyaXRlKGNhcHR1cmVvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVNjcmVlbmNvb3JkIHgxLCB4MiwgeTEsIHkyOworICAgIFNjcmVlbmNvb3JkIHgxLCB4MiwgeTEsIHkyOwogCi0JaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiKGhoaGgpIiwgJngxLCAmeDIsICZ5MSwgJnkyKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiKGhoaGgpIiwgJngxLCAmeDIsICZ5MSwgJnkyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlscmVjdHdyaXRlKHgxLCB4MiwgeTEsIHkyLCAodW5zaWduZWQgbG9uZyAqKSBzZWxmLT5vYl9jYXB0dXJlKTsKKyAgICBscmVjdHdyaXRlKHgxLCB4MiwgeTEsIHkyLCAodW5zaWduZWQgbG9uZyAqKSBzZWxmLT5vYl9jYXB0dXJlKTsKIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAjZW5kaWYKIAogc3RhdGljIFB5T2JqZWN0ICoKIHN2Y193cml0ZWZpbGUoY2FwdHVyZW9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKmZpbGU7Ci0JaW50IHNpemU7Ci0JRklMRSogZnA7CisgICAgUHlPYmplY3QgKmZpbGU7CisgICAgaW50IHNpemU7CisgICAgRklMRSogZnA7CiAKLQlpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICJPIiwgJmZpbGUpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICJPIiwgJmZpbGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmICghUHlGaWxlX0NoZWNrKGZpbGUpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhTdkVycm9yLCAibm90IGEgZmlsZSBvYmplY3QiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICghUHlGaWxlX0NoZWNrKGZpbGUpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhTdkVycm9yLCAibm90IGEgZmlsZSBvYmplY3QiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaWYgKCEoZnAgPSBQeUZpbGVfQXNGaWxlKGZpbGUpKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCEoZnAgPSBQeUZpbGVfQXNGaWxlKGZpbGUpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlzaXplID0gc2VsZi0+b2JfaW5mby53aWR0aCAqIHNlbGYtPm9iX2luZm8uaGVpZ2h0OworICAgIHNpemUgPSBzZWxmLT5vYl9pbmZvLndpZHRoICogc2VsZi0+b2JfaW5mby5oZWlnaHQ7CiAKLQlpZiAoZndyaXRlKHNlbGYtPm9iX2NhcHR1cmUsIHNpemVvZihsb25nKSwgc2l6ZSwgZnApICE9IHNpemUpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFN2RXJyb3IsICJ3cml0aW5nIGZhaWxlZCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKGZ3cml0ZShzZWxmLT5vYl9jYXB0dXJlLCBzaXplb2YobG9uZyksIHNpemUsIGZwKSAhPSBzaXplKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhTdkVycm9yLCAid3JpdGluZyBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHN2Y19GaW5kVmlzaWJsZVJlZ2lvbihjYXB0dXJlb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQl2b2lkICp2aXNpYmxlOwotCWludCB3aWR0aDsKKyAgICB2b2lkICp2aXNpYmxlOworICAgIGludCB3aWR0aDsKIAotCWlmICghUHlBcmdfUGFyc2UoYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoc3ZGaW5kVmlzaWJsZVJlZ2lvbihzZWxmLT5vYl9zdmlkZW8tPm9iX3N2aWRlbywKLQkJCQlzZWxmLT5vYl9jYXB0dXJlLCAmdmlzaWJsZSwKLQkJCQlzZWxmLT5vYl9pbmZvLndpZHRoKSkKLQkJcmV0dXJuIHN2X2Vycm9yKCk7CisgICAgaWYgKHN2RmluZFZpc2libGVSZWdpb24oc2VsZi0+b2Jfc3ZpZGVvLT5vYl9zdmlkZW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+b2JfY2FwdHVyZSwgJnZpc2libGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+b2JfaW5mby53aWR0aCkpCisgICAgICAgIHJldHVybiBzdl9lcnJvcigpOwogCi0JaWYgKHZpc2libGUgPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoU3ZFcnJvciwgImRhdGEgaW4gd3JvbmcgZm9ybWF0Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAodmlzaWJsZSA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhTdkVycm9yLCAiZGF0YSBpbiB3cm9uZyBmb3JtYXQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JcmV0dXJuIG5ld2NhcHR1cmVvYmplY3Qoc2VsZi0+b2Jfc3ZpZGVvLCB2aXNpYmxlLCAwKTsKKyAgICByZXR1cm4gbmV3Y2FwdHVyZW9iamVjdChzZWxmLT5vYl9zdmlkZW8sIHZpc2libGUsIDApOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgY2FwdHVyZV9tZXRob2RzW10gPSB7Ci0JeyJZVVZ0b1JHQiIsCQkoUHlDRnVuY3Rpb24pc3ZjX1lVVnRvUkdCLCBNRVRIX09MREFSR1N9LAotCXsiUkdCOHRvUkdCMzIiLAkJKFB5Q0Z1bmN0aW9uKXN2Y19SR0I4dG9SR0IzMiwgTUVUSF9PTERBUkdTfSwKLQl7IkludGVybGVhdmVGaWVsZHMiLAkoUHlDRnVuY3Rpb24pc3ZjX0ludGVybGVhdmVGaWVsZHMsIE1FVEhfT0xEQVJHU30sCi0JeyJVbmxvY2tDYXB0dXJlRGF0YSIsCShQeUNGdW5jdGlvbilzdmNfVW5sb2NrQ2FwdHVyZURhdGEsIE1FVEhfT0xEQVJHU30sCi0JeyJGaW5kVmlzaWJsZVJlZ2lvbiIsCShQeUNGdW5jdGlvbilzdmNfRmluZFZpc2libGVSZWdpb24sIE1FVEhfT0xEQVJHU30sCi0JeyJHZXRGaWVsZHMiLAkJKFB5Q0Z1bmN0aW9uKXN2Y19HZXRGaWVsZHMsIE1FVEhfT0xEQVJHU30sCi0JeyJZVVZ0b1lVVjQyMkRDIiwJKFB5Q0Z1bmN0aW9uKXN2Y19ZVVZ0b1lVVjQyMkRDLCBNRVRIX09MREFSR1N9LAotCXsiWVVWdG9ZVVY0MjJEQ19xdWFydGVyIiwoUHlDRnVuY3Rpb24pc3ZjX1lVVnRvWVVWNDIyRENfcXVhcnRlciwgTUVUSF9PTERBUkdTfSwKLQl7IllVVnRvWVVWNDIyRENfc2l4dGVlbnRoIiwoUHlDRnVuY3Rpb24pc3ZjX1lVVnRvWVVWNDIyRENfc2l4dGVlbnRoLCBNRVRIX09MREFSR1N9LAorICAgIHsiWVVWdG9SR0IiLCAgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pc3ZjX1lVVnRvUkdCLCBNRVRIX09MREFSR1N9LAorICAgIHsiUkdCOHRvUkdCMzIiLCAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pc3ZjX1JHQjh0b1JHQjMyLCBNRVRIX09MREFSR1N9LAorICAgIHsiSW50ZXJsZWF2ZUZpZWxkcyIsICAgICAgICAoUHlDRnVuY3Rpb24pc3ZjX0ludGVybGVhdmVGaWVsZHMsIE1FVEhfT0xEQVJHU30sCisgICAgeyJVbmxvY2tDYXB0dXJlRGF0YSIsICAgICAgIChQeUNGdW5jdGlvbilzdmNfVW5sb2NrQ2FwdHVyZURhdGEsIE1FVEhfT0xEQVJHU30sCisgICAgeyJGaW5kVmlzaWJsZVJlZ2lvbiIsICAgICAgIChQeUNGdW5jdGlvbilzdmNfRmluZFZpc2libGVSZWdpb24sIE1FVEhfT0xEQVJHU30sCisgICAgeyJHZXRGaWVsZHMiLCAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilzdmNfR2V0RmllbGRzLCBNRVRIX09MREFSR1N9LAorICAgIHsiWVVWdG9ZVVY0MjJEQyIsICAgICAgICAgICAoUHlDRnVuY3Rpb24pc3ZjX1lVVnRvWVVWNDIyREMsIE1FVEhfT0xEQVJHU30sCisgICAgeyJZVVZ0b1lVVjQyMkRDX3F1YXJ0ZXIiLChQeUNGdW5jdGlvbilzdmNfWVVWdG9ZVVY0MjJEQ19xdWFydGVyLCBNRVRIX09MREFSR1N9LAorICAgIHsiWVVWdG9ZVVY0MjJEQ19zaXh0ZWVudGgiLChQeUNGdW5jdGlvbilzdmNfWVVWdG9ZVVY0MjJEQ19zaXh0ZWVudGgsIE1FVEhfT0xEQVJHU30sCiAjaWZkZWYgVVNFX0dMCi0JeyJscmVjdHdyaXRlIiwJCShQeUNGdW5jdGlvbilzdmNfbHJlY3R3cml0ZSwgTUVUSF9PTERBUkdTfSwKKyAgICB7ImxyZWN0d3JpdGUiLCAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXN2Y19scmVjdHdyaXRlLCBNRVRIX09MREFSR1N9LAogI2VuZGlmCi0JeyJ3cml0ZWZpbGUiLAkJKFB5Q0Z1bmN0aW9uKXN2Y193cml0ZWZpbGUsIE1FVEhfT0xEQVJHU30sCi0Je05VTEwsCQkJTlVMTH0gCQkvKiBzZW50aW5lbCAqLworICAgIHsid3JpdGVmaWxlIiwgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pc3ZjX3dyaXRlZmlsZSwgTUVUSF9PTERBUkdTfSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiBzdGF0aWMgdm9pZAogY2FwdHVyZV9kZWFsbG9jKGNhcHR1cmVvYmplY3QgKnNlbGYpCiB7Ci0JaWYgKHNlbGYtPm9iX2NhcHR1cmUgIT0gTlVMTCkgewotCQlpZiAoc2VsZi0+b2JfbXVzdHVubG9jaykKLQkJCSh2b2lkKXN2VW5sb2NrQ2FwdHVyZURhdGEoc2VsZi0+b2Jfc3ZpZGVvLT5vYl9zdmlkZW8sCi0JCQkJCQkgIHNlbGYtPm9iX2NhcHR1cmUpOwotCQlzZWxmLT5vYl9jYXB0dXJlID0gTlVMTDsKLQkJUHlfREVDUkVGKHNlbGYtPm9iX3N2aWRlbyk7Ci0JCXNlbGYtPm9iX3N2aWRlbyA9IE5VTEw7Ci0JfQotCVB5T2JqZWN0X0RlbChzZWxmKTsKKyAgICBpZiAoc2VsZi0+b2JfY2FwdHVyZSAhPSBOVUxMKSB7CisgICAgICAgIGlmIChzZWxmLT5vYl9tdXN0dW5sb2NrKQorICAgICAgICAgICAgKHZvaWQpc3ZVbmxvY2tDYXB0dXJlRGF0YShzZWxmLT5vYl9zdmlkZW8tPm9iX3N2aWRlbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+b2JfY2FwdHVyZSk7CisgICAgICAgIHNlbGYtPm9iX2NhcHR1cmUgPSBOVUxMOworICAgICAgICBQeV9ERUNSRUYoc2VsZi0+b2Jfc3ZpZGVvKTsKKyAgICAgICAgc2VsZi0+b2Jfc3ZpZGVvID0gTlVMTDsKKyAgICB9CisgICAgUHlPYmplY3RfRGVsKHNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY2FwdHVyZV9nZXRhdHRyKHN2b2JqZWN0ICpzZWxmLCBjaGFyICpuYW1lKQogewotCXJldHVybiBQeV9GaW5kTWV0aG9kKGNhcHR1cmVfbWV0aG9kcywgKFB5T2JqZWN0ICopc2VsZiwgbmFtZSk7CisgICAgcmV0dXJuIFB5X0ZpbmRNZXRob2QoY2FwdHVyZV9tZXRob2RzLCAoUHlPYmplY3QgKilzZWxmLCBuYW1lKTsKIH0KIAogUHlUeXBlT2JqZWN0IENhcHR1cmV0eXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUpCi0JMCwJCQkJLypvYl9zaXplKi8KLQkic3YuY2FwdHVyZSIsCQkJLyp0cF9uYW1lKi8KLQlzaXplb2YoY2FwdHVyZW9iamVjdCksCQkvKnRwX3NpemUqLwotCTAsCQkJCS8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvciljYXB0dXJlX2RlYWxsb2MsCS8qdHBfZGVhbGxvYyovCi0JMCwJCQkJLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKWNhcHR1cmVfZ2V0YXR0ciwJLyp0cF9nZXRhdHRyKi8KLQkwLAkJCQkvKnRwX3NldGF0dHIqLwotCTAsCQkJCS8qdHBfY29tcGFyZSovCi0JMCwJCQkJLyp0cF9yZXByKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlKQorICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb2Jfc2l6ZSovCisgICAgInN2LmNhcHR1cmUiLCAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoY2FwdHVyZW9iamVjdCksICAgICAgICAgICAgICAvKnRwX3NpemUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvciljYXB0dXJlX2RlYWxsb2MsICAgICAgICAvKnRwX2RlYWxsb2MqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYyljYXB0dXJlX2dldGF0dHIsICAgICAgIC8qdHBfZ2V0YXR0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NvbXBhcmUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmVwciovCiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKgogbmV3Y2FwdHVyZW9iamVjdChzdm9iamVjdCAqc2VsZiwgdm9pZCAqcHRyLCBpbnQgbXVzdHVubG9jaykKIHsKLQljYXB0dXJlb2JqZWN0ICpwOworICAgIGNhcHR1cmVvYmplY3QgKnA7CiAKLQlwID0gUHlPYmplY3RfTmV3KGNhcHR1cmVvYmplY3QsICZDYXB0dXJldHlwZSk7Ci0JaWYgKHAgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JcC0+b2Jfc3ZpZGVvID0gc2VsZjsKLQlQeV9JTkNSRUYoc2VsZik7Ci0JcC0+b2JfY2FwdHVyZSA9IHB0cjsKLQlwLT5vYl9tdXN0dW5sb2NrID0gbXVzdHVubG9jazsKLQlwLT5vYl9pbmZvID0gc2VsZi0+b2JfaW5mbzsKLQlyZXR1cm4gKFB5T2JqZWN0ICopIHA7CisgICAgcCA9IFB5T2JqZWN0X05ldyhjYXB0dXJlb2JqZWN0LCAmQ2FwdHVyZXR5cGUpOworICAgIGlmIChwID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHAtPm9iX3N2aWRlbyA9IHNlbGY7CisgICAgUHlfSU5DUkVGKHNlbGYpOworICAgIHAtPm9iX2NhcHR1cmUgPSBwdHI7CisgICAgcC0+b2JfbXVzdHVubG9jayA9IG11c3R1bmxvY2s7CisgICAgcC0+b2JfaW5mbyA9IHNlbGYtPm9iX2luZm87CisgICAgcmV0dXJuIChQeU9iamVjdCAqKSBwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc3ZfR2V0Q2FwdHVyZURhdGEoc3ZvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXZvaWQgKnB0cjsKLQlsb25nIGZpZWxkSUQ7Ci0JUHlPYmplY3QgKnJlcywgKmM7CisgICAgdm9pZCAqcHRyOworICAgIGxvbmcgZmllbGRJRDsKKyAgICBQeU9iamVjdCAqcmVzLCAqYzsKIAotCWlmICghUHlBcmdfUGFyc2UoYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoc3ZHZXRDYXB0dXJlRGF0YShzZWxmLT5vYl9zdmlkZW8sICZwdHIsICZmaWVsZElEKSkKLQkJcmV0dXJuIHN2X2Vycm9yKCk7CisgICAgaWYgKHN2R2V0Q2FwdHVyZURhdGEoc2VsZi0+b2Jfc3ZpZGVvLCAmcHRyLCAmZmllbGRJRCkpCisgICAgICAgIHJldHVybiBzdl9lcnJvcigpOwogCi0JaWYgKHB0ciA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhTdkVycm9yLCAibm8gZGF0YSBhdmFpbGFibGUiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChwdHIgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoU3ZFcnJvciwgIm5vIGRhdGEgYXZhaWxhYmxlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWMgPSBuZXdjYXB0dXJlb2JqZWN0KHNlbGYsIHB0ciwgMSk7Ci0JaWYgKGMgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JcmVzID0gUHlfQnVpbGRWYWx1ZSgiKE9pKSIsIGMsIGZpZWxkSUQpOwotCVB5X0RFQ1JFRihjKTsKLQlyZXR1cm4gcmVzOworICAgIGMgPSBuZXdjYXB0dXJlb2JqZWN0KHNlbGYsIHB0ciwgMSk7CisgICAgaWYgKGMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmVzID0gUHlfQnVpbGRWYWx1ZSgiKE9pKSIsIGMsIGZpZWxkSUQpOworICAgIFB5X0RFQ1JFRihjKTsKKyAgICByZXR1cm4gcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc3ZfQmluZEdMV2luZG93KHN2b2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIHdpZDsKLQlpbnQgbW9kZTsKKyAgICBsb25nIHdpZDsKKyAgICBpbnQgbW9kZTsKIAotCWlmICghUHlBcmdfUGFyc2UoYXJncywgIihpaSkiLCAmd2lkLCAmbW9kZSkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2UoYXJncywgIihpaSkiLCAmd2lkLCAmbW9kZSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKHN2QmluZEdMV2luZG93KHNlbGYtPm9iX3N2aWRlbywgd2lkLCBtb2RlKSkKLQkJcmV0dXJuIHN2X2Vycm9yKCk7CisgICAgaWYgKHN2QmluZEdMV2luZG93KHNlbGYtPm9iX3N2aWRlbywgd2lkLCBtb2RlKSkKKyAgICAgICAgcmV0dXJuIHN2X2Vycm9yKCk7CiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc3ZfRW5kQ29udGludW91c0NhcHR1cmUoc3ZvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewogCi0JaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2UoYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChzdkVuZENvbnRpbnVvdXNDYXB0dXJlKHNlbGYtPm9iX3N2aWRlbykpCi0JCXJldHVybiBzdl9lcnJvcigpOworICAgIGlmIChzdkVuZENvbnRpbnVvdXNDYXB0dXJlKHNlbGYtPm9iX3N2aWRlbykpCisgICAgICAgIHJldHVybiBzdl9lcnJvcigpOwogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHN2X0lzVmlkZW9EaXNwbGF5ZWQoc3ZvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCB2OworICAgIGludCB2OwogCi0JaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2UoYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXYgPSBzdklzVmlkZW9EaXNwbGF5ZWQoc2VsZi0+b2Jfc3ZpZGVvKTsKLQlpZiAodiA9PSAtMSkKLQkJcmV0dXJuIHN2X2Vycm9yKCk7CisgICAgdiA9IHN2SXNWaWRlb0Rpc3BsYXllZChzZWxmLT5vYl9zdmlkZW8pOworICAgIGlmICh2ID09IC0xKQorICAgICAgICByZXR1cm4gc3ZfZXJyb3IoKTsKIAotCXJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZykgdik7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKSB2KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHN2X091dHB1dE9mZnNldChzdm9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IHhfb2Zmc2V0OwotCWludCB5X29mZnNldDsKKyAgICBpbnQgeF9vZmZzZXQ7CisgICAgaW50IHlfb2Zmc2V0OwogCi0JaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiKGlpKSIsICZ4X29mZnNldCwgJnlfb2Zmc2V0KSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiKGlpKSIsICZ4X29mZnNldCwgJnlfb2Zmc2V0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoc3ZPdXRwdXRPZmZzZXQoc2VsZi0+b2Jfc3ZpZGVvLCB4X29mZnNldCwgeV9vZmZzZXQpKQotCQlyZXR1cm4gc3ZfZXJyb3IoKTsKKyAgICBpZiAoc3ZPdXRwdXRPZmZzZXQoc2VsZi0+b2Jfc3ZpZGVvLCB4X29mZnNldCwgeV9vZmZzZXQpKQorICAgICAgICByZXR1cm4gc3ZfZXJyb3IoKTsKIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdl9QdXRGcmFtZShzdm9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqYnVmZmVyOworICAgIGNoYXIgKmJ1ZmZlcjsKIAotCWlmICghUHlBcmdfUGFyc2UoYXJncywgInMiLCAmYnVmZmVyKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAicyIsICZidWZmZXIpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChzdlB1dEZyYW1lKHNlbGYtPm9iX3N2aWRlbywgYnVmZmVyKSkKLQkJcmV0dXJuIHN2X2Vycm9yKCk7CisgICAgaWYgKHN2UHV0RnJhbWUoc2VsZi0+b2Jfc3ZpZGVvLCBidWZmZXIpKQorICAgICAgICByZXR1cm4gc3ZfZXJyb3IoKTsKIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdl9RdWVyeVNpemUoc3ZvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCB3OwotCWludCBoOwotCWludCBydzsKLQlpbnQgcmg7CisgICAgaW50IHc7CisgICAgaW50IGg7CisgICAgaW50IHJ3OworICAgIGludCByaDsKIAotCWlmICghUHlBcmdfUGFyc2UoYXJncywgIihpaSkiLCAmdywgJmgpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICIoaWkpIiwgJncsICZoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoc3ZRdWVyeVNpemUoc2VsZi0+b2Jfc3ZpZGVvLCB3LCBoLCAmcncsICZyaCkpCi0JCXJldHVybiBzdl9lcnJvcigpOworICAgIGlmIChzdlF1ZXJ5U2l6ZShzZWxmLT5vYl9zdmlkZW8sIHcsIGgsICZydywgJnJoKSkKKyAgICAgICAgcmV0dXJuIHN2X2Vycm9yKCk7CiAKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKGlpKSIsIChsb25nKSBydywgKGxvbmcpIHJoKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKGlpKSIsIChsb25nKSBydywgKGxvbmcpIHJoKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHN2X1NldFNpemUoc3ZvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCB3OwotCWludCBoOworICAgIGludCB3OworICAgIGludCBoOwogCi0JaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiKGlpKSIsICZ3LCAmaCkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2UoYXJncywgIihpaSkiLCAmdywgJmgpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChzdlNldFNpemUoc2VsZi0+b2Jfc3ZpZGVvLCB3LCBoKSkKLQkJcmV0dXJuIHN2X2Vycm9yKCk7CisgICAgaWYgKHN2U2V0U2l6ZShzZWxmLT5vYl9zdmlkZW8sIHcsIGgpKQorICAgICAgICByZXR1cm4gc3ZfZXJyb3IoKTsKIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdl9TZXRTdGREZWZhdWx0cyhzdm9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7CiAKLQlpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKHN2U2V0U3RkRGVmYXVsdHMoc2VsZi0+b2Jfc3ZpZGVvKSkKLQkJcmV0dXJuIHN2X2Vycm9yKCk7CisgICAgaWYgKHN2U2V0U3RkRGVmYXVsdHMoc2VsZi0+b2Jfc3ZpZGVvKSkKKyAgICAgICAgcmV0dXJuIHN2X2Vycm9yKCk7CiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc3ZfVXNlRXhjbHVzaXZlKHN2b2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlib29sZWFuIG9ub2ZmOwotCWludCBtb2RlOworICAgIGJvb2xlYW4gb25vZmY7CisgICAgaW50IG1vZGU7CiAKLQlpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICIoaWkpIiwgJm9ub2ZmLCAmbW9kZSkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2UoYXJncywgIihpaSkiLCAmb25vZmYsICZtb2RlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoc3ZVc2VFeGNsdXNpdmUoc2VsZi0+b2Jfc3ZpZGVvLCBvbm9mZiwgbW9kZSkpCi0JCXJldHVybiBzdl9lcnJvcigpOworICAgIGlmIChzdlVzZUV4Y2x1c2l2ZShzZWxmLT5vYl9zdmlkZW8sIG9ub2ZmLCBtb2RlKSkKKyAgICAgICAgcmV0dXJuIHN2X2Vycm9yKCk7CiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc3ZfV2luZG93T2Zmc2V0KHN2b2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgeF9vZmZzZXQ7Ci0JaW50IHlfb2Zmc2V0OworICAgIGludCB4X29mZnNldDsKKyAgICBpbnQgeV9vZmZzZXQ7CiAKLQlpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICIoaWkpIiwgJnhfb2Zmc2V0LCAmeV9vZmZzZXQpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICIoaWkpIiwgJnhfb2Zmc2V0LCAmeV9vZmZzZXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChzdldpbmRvd09mZnNldChzZWxmLT5vYl9zdmlkZW8sIHhfb2Zmc2V0LCB5X29mZnNldCkpCi0JCXJldHVybiBzdl9lcnJvcigpOworICAgIGlmIChzdldpbmRvd09mZnNldChzZWxmLT5vYl9zdmlkZW8sIHhfb2Zmc2V0LCB5X29mZnNldCkpCisgICAgICAgIHJldHVybiBzdl9lcnJvcigpOwogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHN2X0NhcHR1cmVCdXJzdChzdm9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IGJ5dGVzLCBpOwotCXN2Q2FwdHVyZUluZm8gaW5mbzsKLQl2b2lkICpiaXR2ZWN0b3IgPSBOVUxMOwotCVB5T2JqZWN0ICp2aWRlb2RhdGEgPSBOVUxMOwotCVB5T2JqZWN0ICpiaXR2ZWNvYmogPSBOVUxMOwotCVB5T2JqZWN0ICpyZXMgPSBOVUxMOwotCXN0YXRpYyBQeU9iamVjdCAqZXZlbml0ZW0sICpvZGRpdGVtOworICAgIGludCBieXRlcywgaTsKKyAgICBzdkNhcHR1cmVJbmZvIGluZm87CisgICAgdm9pZCAqYml0dmVjdG9yID0gTlVMTDsKKyAgICBQeU9iamVjdCAqdmlkZW9kYXRhID0gTlVMTDsKKyAgICBQeU9iamVjdCAqYml0dmVjb2JqID0gTlVMTDsKKyAgICBQeU9iamVjdCAqcmVzID0gTlVMTDsKKyAgICBzdGF0aWMgUHlPYmplY3QgKmV2ZW5pdGVtLCAqb2RkaXRlbTsKIAotCWlmICghUHlBcmdfUGFyc2UoYXJncywgIihpaWlpaSkiLCAmaW5mby5mb3JtYXQsCi0JCQkgJmluZm8ud2lkdGgsICZpbmZvLmhlaWdodCwKLQkJCSAmaW5mby5zaXplLCAmaW5mby5zYW1wbGluZ3JhdGUpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICIoaWlpaWkpIiwgJmluZm8uZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgJmluZm8ud2lkdGgsICZpbmZvLmhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICZpbmZvLnNpemUsICZpbmZvLnNhbXBsaW5ncmF0ZSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0Jc3dpdGNoIChpbmZvLmZvcm1hdCkgewotCWNhc2UgU1ZfUkdCOF9GUkFNRVM6Ci0JCWJpdHZlY3RvciA9IG1hbGxvYyhTVl9CSVRWRUNfU0laRShpbmZvLnNpemUpKTsKLQkJYnJlYWs7Ci0JY2FzZSBTVl9ZVVY0MTFfRlJBTUVTX0FORF9CTEFOS0lOR19CVUZGRVI6Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCVB5RXJyX1NldFN0cmluZyhTdkVycm9yLCAiaWxsZWdhbCBmb3JtYXQgc3BlY2lmaWVkIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBzd2l0Y2ggKGluZm8uZm9ybWF0KSB7CisgICAgY2FzZSBTVl9SR0I4X0ZSQU1FUzoKKyAgICAgICAgYml0dmVjdG9yID0gbWFsbG9jKFNWX0JJVFZFQ19TSVpFKGluZm8uc2l6ZSkpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFNWX1lVVjQxMV9GUkFNRVNfQU5EX0JMQU5LSU5HX0JVRkZFUjoKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFN2RXJyb3IsICJpbGxlZ2FsIGZvcm1hdCBzcGVjaWZpZWQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaWYgKHN2UXVlcnlDYXB0dXJlQnVmZmVyU2l6ZShzZWxmLT5vYl9zdmlkZW8sICZpbmZvLCAmYnl0ZXMpKSB7Ci0JCXJlcyA9IHN2X2Vycm9yKCk7Ci0JCWdvdG8gZmluYWxseTsKLQl9CisgICAgaWYgKHN2UXVlcnlDYXB0dXJlQnVmZmVyU2l6ZShzZWxmLT5vYl9zdmlkZW8sICZpbmZvLCAmYnl0ZXMpKSB7CisgICAgICAgIHJlcyA9IHN2X2Vycm9yKCk7CisgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICB9CiAKLQlpZiAoISh2aWRlb2RhdGEgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBieXRlcykpKQotCQlnb3RvIGZpbmFsbHk7CisgICAgaWYgKCEodmlkZW9kYXRhID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgYnl0ZXMpKSkKKyAgICAgICAgZ290byBmaW5hbGx5OwogCi0JLyogWFhYIC0tIG5lZWQgdG8gZG8gc29tZXRoaW5nIGFib3V0IHRoZSBiaXR2ZWN0b3IgKi8KLQl7Ci0JCWNoYXIqIHN0ciA9IFB5U3RyaW5nX0FzU3RyaW5nKHZpZGVvZGF0YSk7Ci0JCWlmICghc3RyKQotCQkJZ290byBmaW5hbGx5OwotCQkKLQkJaWYgKHN2Q2FwdHVyZUJ1cnN0KHNlbGYtPm9iX3N2aWRlbywgJmluZm8sIHN0ciwgYml0dmVjdG9yKSkgewotCQkJcmVzID0gc3ZfZXJyb3IoKTsKLQkJCWdvdG8gZmluYWxseTsKLQkJfQotCX0KKyAgICAvKiBYWFggLS0gbmVlZCB0byBkbyBzb21ldGhpbmcgYWJvdXQgdGhlIGJpdHZlY3RvciAqLworICAgIHsKKyAgICAgICAgY2hhciogc3RyID0gUHlTdHJpbmdfQXNTdHJpbmcodmlkZW9kYXRhKTsKKyAgICAgICAgaWYgKCFzdHIpCisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQlpZiAoYml0dmVjdG9yKSB7Ci0JCWlmIChldmVuaXRlbSA9PSBOVUxMKSB7Ci0JCQlpZiAoIShldmVuaXRlbSA9IFB5SW50X0Zyb21Mb25nKDApKSkKLQkJCQlnb3RvIGZpbmFsbHk7Ci0JCX0KLQkJaWYgKG9kZGl0ZW0gPT0gTlVMTCkgewotCQkJaWYgKCEob2RkaXRlbSA9IFB5SW50X0Zyb21Mb25nKDEpKSkKLQkJCQlnb3RvIGZpbmFsbHk7Ci0JCX0KLQkJaWYgKCEoYml0dmVjb2JqID0gUHlUdXBsZV9OZXcoMiAqIGluZm8uc2l6ZSkpKQotCQkJZ290byBmaW5hbGx5OworICAgICAgICBpZiAoc3ZDYXB0dXJlQnVyc3Qoc2VsZi0+b2Jfc3ZpZGVvLCAmaW5mbywgc3RyLCBiaXR2ZWN0b3IpKSB7CisgICAgICAgICAgICByZXMgPSBzdl9lcnJvcigpOworICAgICAgICAgICAgZ290byBmaW5hbGx5OworICAgICAgICB9CisgICAgfQogCi0JCWZvciAoaSA9IDA7IGkgPCAyICogaW5mby5zaXplOyBpKyspIHsKLQkJCWludCBzdHM7CisgICAgaWYgKGJpdHZlY3RvcikgeworICAgICAgICBpZiAoZXZlbml0ZW0gPT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKCEoZXZlbml0ZW0gPSBQeUludF9Gcm9tTG9uZygwKSkpCisgICAgICAgICAgICAgICAgZ290byBmaW5hbGx5OworICAgICAgICB9CisgICAgICAgIGlmIChvZGRpdGVtID09IE5VTEwpIHsKKyAgICAgICAgICAgIGlmICghKG9kZGl0ZW0gPSBQeUludF9Gcm9tTG9uZygxKSkpCisgICAgICAgICAgICAgICAgZ290byBmaW5hbGx5OworICAgICAgICB9CisgICAgICAgIGlmICghKGJpdHZlY29iaiA9IFB5VHVwbGVfTmV3KDIgKiBpbmZvLnNpemUpKSkKKyAgICAgICAgICAgIGdvdG8gZmluYWxseTsKIAotCQkJaWYgKFNWX0dFVF9GSUVMRChiaXR2ZWN0b3IsIGkpID09IFNWX0VWRU5fRklFTEQpIHsKLQkJCQlQeV9JTkNSRUYoZXZlbml0ZW0pOwotCQkJCXN0cyA9IFB5VHVwbGVfU2V0SXRlbShiaXR2ZWNvYmosIGksIGV2ZW5pdGVtKTsKLQkJCX0gZWxzZSB7Ci0JCQkJUHlfSU5DUkVGKG9kZGl0ZW0pOwotCQkJCXN0cyA9IFB5VHVwbGVfU2V0SXRlbShiaXR2ZWNvYmosIGksIG9kZGl0ZW0pOwotCQkJfQotCQkJaWYgKHN0cyA8IDApCi0JCQkJZ290byBmaW5hbGx5OwotCQl9Ci0JfSBlbHNlIHsKLQkJYml0dmVjb2JqID0gUHlfTm9uZTsKLQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCX0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDIgKiBpbmZvLnNpemU7IGkrKykgeworICAgICAgICAgICAgaW50IHN0czsKIAotCXJlcyA9IFB5X0J1aWxkVmFsdWUoIigoaWlpaWkpT08pIiwgaW5mby5mb3JtYXQsCi0JCQkgICAgaW5mby53aWR0aCwgaW5mby5oZWlnaHQsCi0JCQkgICAgaW5mby5zaXplLCBpbmZvLnNhbXBsaW5ncmF0ZSwKLQkJCSAgICB2aWRlb2RhdGEsIGJpdHZlY29iaik7CisgICAgICAgICAgICBpZiAoU1ZfR0VUX0ZJRUxEKGJpdHZlY3RvciwgaSkgPT0gU1ZfRVZFTl9GSUVMRCkgeworICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihldmVuaXRlbSk7CisgICAgICAgICAgICAgICAgc3RzID0gUHlUdXBsZV9TZXRJdGVtKGJpdHZlY29iaiwgaSwgZXZlbml0ZW0pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBQeV9JTkNSRUYob2RkaXRlbSk7CisgICAgICAgICAgICAgICAgc3RzID0gUHlUdXBsZV9TZXRJdGVtKGJpdHZlY29iaiwgaSwgb2RkaXRlbSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3RzIDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBiaXR2ZWNvYmogPSBQeV9Ob25lOworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgfQorCisgICAgcmVzID0gUHlfQnVpbGRWYWx1ZSgiKChpaWlpaSlPTykiLCBpbmZvLmZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm8ud2lkdGgsIGluZm8uaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgaW5mby5zaXplLCBpbmZvLnNhbXBsaW5ncmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvZGF0YSwgYml0dmVjb2JqKTsKIAogICBmaW5hbGx5OgotCWlmIChiaXR2ZWN0b3IpCi0JCWZyZWUoYml0dmVjdG9yKTsKKyAgICBpZiAoYml0dmVjdG9yKQorICAgICAgICBmcmVlKGJpdHZlY3Rvcik7CiAKLQlQeV9YREVDUkVGKHZpZGVvZGF0YSk7Ci0JUHlfWERFQ1JFRihiaXR2ZWNvYmopOwotCXJldHVybiByZXM7CisgICAgUHlfWERFQ1JFRih2aWRlb2RhdGEpOworICAgIFB5X1hERUNSRUYoYml0dmVjb2JqKTsKKyAgICByZXR1cm4gcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc3ZfQ2FwdHVyZU9uZUZyYW1lKHN2b2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzdkNhcHR1cmVJbmZvIGluZm87Ci0JaW50IGZvcm1hdCwgd2lkdGgsIGhlaWdodDsKLQlpbnQgYnl0ZXM7Ci0JUHlPYmplY3QgKnZpZGVvZGF0YSA9IE5VTEw7Ci0JUHlPYmplY3QgKnJlcyA9IE5VTEw7Ci0JY2hhciAqc3RyOwotCQotCWlmICghUHlBcmdfUGFyc2UoYXJncywgIihpaWkpIiwgJmZvcm1hdCwgJndpZHRoLCAmaGVpZ2h0KSkKLQkJcmV0dXJuIE5VTEw7CisgICAgc3ZDYXB0dXJlSW5mbyBpbmZvOworICAgIGludCBmb3JtYXQsIHdpZHRoLCBoZWlnaHQ7CisgICAgaW50IGJ5dGVzOworICAgIFB5T2JqZWN0ICp2aWRlb2RhdGEgPSBOVUxMOworICAgIFB5T2JqZWN0ICpyZXMgPSBOVUxMOworICAgIGNoYXIgKnN0cjsKIAotCWluZm8uZm9ybWF0ID0gZm9ybWF0OwotCWluZm8ud2lkdGggPSB3aWR0aDsKLQlpbmZvLmhlaWdodCA9IGhlaWdodDsKLQlpbmZvLnNpemUgPSAwOwotCWluZm8uc2FtcGxpbmdyYXRlID0gMDsKLQlpZiAoc3ZRdWVyeUNhcHR1cmVCdWZmZXJTaXplKHNlbGYtPm9iX3N2aWRlbywgJmluZm8sICZieXRlcykpCi0JCXJldHVybiBzdl9lcnJvcigpOworICAgIGlmICghUHlBcmdfUGFyc2UoYXJncywgIihpaWkpIiwgJmZvcm1hdCwgJndpZHRoLCAmaGVpZ2h0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoISh2aWRlb2RhdGEgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBieXRlcykpKQotCQlyZXR1cm4gTlVMTDsKLQkKLQlzdHIgPSBQeVN0cmluZ19Bc1N0cmluZyh2aWRlb2RhdGEpOwotCWlmICghc3RyKQotCQlnb3RvIGZpbmFsbHk7CisgICAgaW5mby5mb3JtYXQgPSBmb3JtYXQ7CisgICAgaW5mby53aWR0aCA9IHdpZHRoOworICAgIGluZm8uaGVpZ2h0ID0gaGVpZ2h0OworICAgIGluZm8uc2l6ZSA9IDA7CisgICAgaW5mby5zYW1wbGluZ3JhdGUgPSAwOworICAgIGlmIChzdlF1ZXJ5Q2FwdHVyZUJ1ZmZlclNpemUoc2VsZi0+b2Jfc3ZpZGVvLCAmaW5mbywgJmJ5dGVzKSkKKyAgICAgICAgcmV0dXJuIHN2X2Vycm9yKCk7CiAKLQlpZiAoc3ZDYXB0dXJlT25lRnJhbWUoc2VsZi0+b2Jfc3ZpZGVvLCBmb3JtYXQsICZ3aWR0aCwgJmhlaWdodCwgc3RyKSkgewotCQlyZXMgPSBzdl9lcnJvcigpOwotCQlnb3RvIGZpbmFsbHk7Ci0JfQorICAgIGlmICghKHZpZGVvZGF0YSA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGJ5dGVzKSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JcmVzID0gUHlfQnVpbGRWYWx1ZSgiKGlpTykiLCB3aWR0aCwgaGVpZ2h0LCB2aWRlb2RhdGEpOworICAgIHN0ciA9IFB5U3RyaW5nX0FzU3RyaW5nKHZpZGVvZGF0YSk7CisgICAgaWYgKCFzdHIpCisgICAgICAgIGdvdG8gZmluYWxseTsKKworICAgIGlmIChzdkNhcHR1cmVPbmVGcmFtZShzZWxmLT5vYl9zdmlkZW8sIGZvcm1hdCwgJndpZHRoLCAmaGVpZ2h0LCBzdHIpKSB7CisgICAgICAgIHJlcyA9IHN2X2Vycm9yKCk7CisgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICB9CisKKyAgICByZXMgPSBQeV9CdWlsZFZhbHVlKCIoaWlPKSIsIHdpZHRoLCBoZWlnaHQsIHZpZGVvZGF0YSk7CiAKICAgZmluYWxseToKLQlQeV9YREVDUkVGKHZpZGVvZGF0YSk7Ci0JcmV0dXJuIHJlczsKKyAgICBQeV9YREVDUkVGKHZpZGVvZGF0YSk7CisgICAgcmV0dXJuIHJlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHN2X0luaXRDb250aW51b3VzQ2FwdHVyZShzdm9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc3ZDYXB0dXJlSW5mbyBpbmZvOworICAgIHN2Q2FwdHVyZUluZm8gaW5mbzsKIAotCWlmICghUHlBcmdfUGFyc2UoYXJncywgIihpaWlpaSkiLCAmaW5mby5mb3JtYXQsCi0JCQkgJmluZm8ud2lkdGgsICZpbmZvLmhlaWdodCwKLQkJCSAmaW5mby5zaXplLCAmaW5mby5zYW1wbGluZ3JhdGUpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICIoaWlpaWkpIiwgJmluZm8uZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgJmluZm8ud2lkdGgsICZpbmZvLmhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICZpbmZvLnNpemUsICZpbmZvLnNhbXBsaW5ncmF0ZSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKHN2SW5pdENvbnRpbnVvdXNDYXB0dXJlKHNlbGYtPm9iX3N2aWRlbywgJmluZm8pKQotCQlyZXR1cm4gc3ZfZXJyb3IoKTsKKyAgICBpZiAoc3ZJbml0Q29udGludW91c0NhcHR1cmUoc2VsZi0+b2Jfc3ZpZGVvLCAmaW5mbykpCisgICAgICAgIHJldHVybiBzdl9lcnJvcigpOwogCi0Jc2VsZi0+b2JfaW5mbyA9IGluZm87CisgICAgc2VsZi0+b2JfaW5mbyA9IGluZm87CiAKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKGlpaWlpKSIsIGluZm8uZm9ybWF0LCBpbmZvLndpZHRoLCBpbmZvLmhlaWdodCwKLQkJCSAgICAgaW5mby5zaXplLCBpbmZvLnNhbXBsaW5ncmF0ZSk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihpaWlpaSkiLCBpbmZvLmZvcm1hdCwgaW5mby53aWR0aCwgaW5mby5oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby5zaXplLCBpbmZvLnNhbXBsaW5ncmF0ZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdl9Mb2FkTWFwKHN2b2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqcmdiOwotCVB5T2JqZWN0ICpyZXMgPSBOVUxMOwotCXJnYl90dXBsZSAqbWFwcCA9IE5VTEw7Ci0JaW50IG1hcHR5cGU7Ci0JaW50IGksIGo7CQkJICAgICAvKiBpbmRpY2VzICovCisgICAgUHlPYmplY3QgKnJnYjsKKyAgICBQeU9iamVjdCAqcmVzID0gTlVMTDsKKyAgICByZ2JfdHVwbGUgKm1hcHAgPSBOVUxMOworICAgIGludCBtYXB0eXBlOworICAgIGludCBpLCBqOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5kaWNlcyAqLwogCi0JaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiKGlPKSIsICZtYXB0eXBlLCAmcmdiKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiKGlPKSIsICZtYXB0eXBlLCAmcmdiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoIVB5TGlzdF9DaGVjayhyZ2IpIHx8IFB5TGlzdF9TaXplKHJnYikgIT0gMjU2KSB7Ci0JCVB5RXJyX0JhZEFyZ3VtZW50KCk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoIVB5TGlzdF9DaGVjayhyZ2IpIHx8IFB5TGlzdF9TaXplKHJnYikgIT0gMjU2KSB7CisgICAgICAgIFB5RXJyX0JhZEFyZ3VtZW50KCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWlmICghKG1hcHAgPSBQeU1lbV9ORVcocmdiX3R1cGxlLCAyNTYpKSkKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgaWYgKCEobWFwcCA9IFB5TWVtX05FVyhyZ2JfdHVwbGUsIDI1NikpKQorICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKIAotCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgewotCQlQeU9iamVjdCogdiA9IFB5TGlzdF9HZXRJdGVtKHJnYiwgaSk7Ci0JCWlmICghdikKLQkJCWdvdG8gZmluYWxseTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKyAgICAgICAgUHlPYmplY3QqIHYgPSBQeUxpc3RfR2V0SXRlbShyZ2IsIGkpOworICAgICAgICBpZiAoIXYpCisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQkJaWYgKCFQeVR1cGxlX0NoZWNrKHYpIHx8IFB5VHVwbGVfU2l6ZSh2KSAhPSAzKSB7Ci0JCQlQeUVycl9CYWRBcmd1bWVudCgpOwotCQkJZ290byBmaW5hbGx5OwotCQl9Ci0JCWZvciAoaiA9IDA7IGogPCAzOyBqKyspIHsKLQkJCVB5T2JqZWN0KiBjZWxsID0gUHlUdXBsZV9HZXRJdGVtKHYsIGopOwotCQkJaWYgKCFjZWxsKQotCQkJCWdvdG8gZmluYWxseTsKKyAgICAgICAgaWYgKCFQeVR1cGxlX0NoZWNrKHYpIHx8IFB5VHVwbGVfU2l6ZSh2KSAhPSAzKSB7CisgICAgICAgICAgICBQeUVycl9CYWRBcmd1bWVudCgpOworICAgICAgICAgICAgZ290byBmaW5hbGx5OworICAgICAgICB9CisgICAgICAgIGZvciAoaiA9IDA7IGogPCAzOyBqKyspIHsKKyAgICAgICAgICAgIFB5T2JqZWN0KiBjZWxsID0gUHlUdXBsZV9HZXRJdGVtKHYsIGopOworICAgICAgICAgICAgaWYgKCFjZWxsKQorICAgICAgICAgICAgICAgIGdvdG8gZmluYWxseTsKIAotCQkJaWYgKCFQeUludF9DaGVjayhjZWxsKSkgewotCQkJCVB5RXJyX0JhZEFyZ3VtZW50KCk7Ci0JCQkJZ290byBmaW5hbGx5OwotCQkJfQotCQkJc3dpdGNoIChqKSB7Ci0JCQljYXNlIDA6IG1hcHBbaV0ucmVkID0gUHlJbnRfQXNMb25nKGNlbGwpOyBicmVhazsKLQkJCWNhc2UgMTogbWFwcFtpXS5ibHVlID0gUHlJbnRfQXNMb25nKGNlbGwpOyBicmVhazsKLQkJCWNhc2UgMjogbWFwcFtpXS5ncmVlbiA9IFB5SW50X0FzTG9uZyhjZWxsKTsgYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkKLQkJCQlnb3RvIGZpbmFsbHk7Ci0JCX0KLQl9CisgICAgICAgICAgICBpZiAoIVB5SW50X0NoZWNrKGNlbGwpKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfQmFkQXJndW1lbnQoKTsKKyAgICAgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2ggKGopIHsKKyAgICAgICAgICAgIGNhc2UgMDogbWFwcFtpXS5yZWQgPSBQeUludF9Bc0xvbmcoY2VsbCk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAxOiBtYXBwW2ldLmJsdWUgPSBQeUludF9Bc0xvbmcoY2VsbCk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAyOiBtYXBwW2ldLmdyZWVuID0gUHlJbnRfQXNMb25nKGNlbGwpOyBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICAgICAgfQorICAgIH0KIAotCWlmIChzdkxvYWRNYXAoc2VsZi0+b2Jfc3ZpZGVvLCBtYXB0eXBlLCBtYXBwKSkgewotCQlyZXMgPSBzdl9lcnJvcigpOwotCQlnb3RvIGZpbmFsbHk7Ci0JfQorICAgIGlmIChzdkxvYWRNYXAoc2VsZi0+b2Jfc3ZpZGVvLCBtYXB0eXBlLCBtYXBwKSkgeworICAgICAgICByZXMgPSBzdl9lcnJvcigpOworICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgfQogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJlcyA9IFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJlcyA9IFB5X05vbmU7CiAKICAgZmluYWxseToKLQlQeU1lbV9ERUwobWFwcCk7Ci0JcmV0dXJuIHJlczsKKyAgICBQeU1lbV9ERUwobWFwcCk7CisgICAgcmV0dXJuIHJlczsKIH0KLQkJCisKIHN0YXRpYyBQeU9iamVjdCAqCiBzdl9DbG9zZVZpZGVvKHN2b2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKHN2Q2xvc2VWaWRlbyhzZWxmLT5vYl9zdmlkZW8pKQotCQlyZXR1cm4gc3ZfZXJyb3IoKTsKKyAgICBpZiAoc3ZDbG9zZVZpZGVvKHNlbGYtPm9iX3N2aWRlbykpCisgICAgICAgIHJldHVybiBzdl9lcnJvcigpOwogCi0Jc2VsZi0+b2Jfc3ZpZGVvID0gTlVMTDsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2VsZi0+b2Jfc3ZpZGVvID0gTlVMTDsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkb1BhcmFtcyhzdm9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsCiAgICAgICAgICBpbnQgKCpmdW5jKShTVl9ub2RlUCwgbG9uZyAqLCBpbnQpLCBpbnQgbW9kaWZpZWQpCiB7Ci0JUHlPYmplY3QgKmxpc3Q7Ci0JUHlPYmplY3QgKnJlcyA9IE5VTEw7Ci0JbG9uZyAqUFZidWZmZXIgPSBOVUxMOwotCWxvbmcgbGVuZ3RoOwotCWludCBpOwotCQotCWlmICghUHlBcmdfUGFyc2UoYXJncywgIk8iLCAmbGlzdCkpCi0JCXJldHVybiBOVUxMOworICAgIFB5T2JqZWN0ICpsaXN0OworICAgIFB5T2JqZWN0ICpyZXMgPSBOVUxMOworICAgIGxvbmcgKlBWYnVmZmVyID0gTlVMTDsKKyAgICBsb25nIGxlbmd0aDsKKyAgICBpbnQgaTsKIAotCWlmICghUHlMaXN0X0NoZWNrKGxpc3QpKSB7Ci0JCVB5RXJyX0JhZEFyZ3VtZW50KCk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICJPIiwgJmxpc3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmICgobGVuZ3RoID0gUHlMaXN0X1NpemUobGlzdCkpIDwgMCkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUxpc3RfQ2hlY2sobGlzdCkpIHsKKyAgICAgICAgUHlFcnJfQmFkQXJndW1lbnQoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JUFZidWZmZXIgPSBQeU1lbV9ORVcobG9uZywgbGVuZ3RoKTsKLQlpZiAoUFZidWZmZXIgPT0gTlVMTCkKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgaWYgKChsZW5ndGggPSBQeUxpc3RfU2l6ZShsaXN0KSkgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQlQeU9iamVjdCAqdiA9IFB5TGlzdF9HZXRJdGVtKGxpc3QsIGkpOwotCQlpZiAoIXYpCi0JCQlnb3RvIGZpbmFsbHk7CisgICAgUFZidWZmZXIgPSBQeU1lbV9ORVcobG9uZywgbGVuZ3RoKTsKKyAgICBpZiAoUFZidWZmZXIgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CiAKLQkJaWYgKCFQeUludF9DaGVjayh2KSkgewotCQkJUHlFcnJfQmFkQXJndW1lbnQoKTsKLQkJCWdvdG8gZmluYWxseTsKLQkJfQotCQlQVmJ1ZmZlcltpXSA9IFB5SW50X0FzTG9uZyh2KTsKLQkJLyogY2FuJ3QganVzdCB0ZXN0IHRoZSByZXR1cm4gdmFsdWUsIGJlY2F1c2Ugd2hhdCBpZiB0aGUKLQkJICAgdmFsdWUgd2FzIC0xPyEKLQkJKi8KLQkJaWYgKFBWYnVmZmVyW2ldID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCQlnb3RvIGZpbmFsbHk7Ci0JfQorICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworICAgICAgICBQeU9iamVjdCAqdiA9IFB5TGlzdF9HZXRJdGVtKGxpc3QsIGkpOworICAgICAgICBpZiAoIXYpCisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQlpZiAoKCpmdW5jKShzZWxmLT5vYl9zdmlkZW8sIFBWYnVmZmVyLCBsZW5ndGgpKSB7Ci0JCXJlcyA9IHN2X2Vycm9yKCk7Ci0JCWdvdG8gZmluYWxseTsKLQl9CisgICAgICAgIGlmICghUHlJbnRfQ2hlY2sodikpIHsKKyAgICAgICAgICAgIFB5RXJyX0JhZEFyZ3VtZW50KCk7CisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgICAgIH0KKyAgICAgICAgUFZidWZmZXJbaV0gPSBQeUludF9Bc0xvbmcodik7CisgICAgICAgIC8qIGNhbid0IGp1c3QgdGVzdCB0aGUgcmV0dXJuIHZhbHVlLCBiZWNhdXNlIHdoYXQgaWYgdGhlCisgICAgICAgICAgIHZhbHVlIHdhcyAtMT8hCisgICAgICAgICovCisgICAgICAgIGlmIChQVmJ1ZmZlcltpXSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgZ290byBmaW5hbGx5OworICAgIH0KIAotCWlmIChtb2RpZmllZCkgewotCQlmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCVB5T2JqZWN0KiB2ID0gUHlJbnRfRnJvbUxvbmcoUFZidWZmZXJbaV0pOwotCQkJaWYgKCF2IHx8IFB5TGlzdF9TZXRJdGVtKGxpc3QsIGksIHYpIDwgMCkKLQkJCQlnb3RvIGZpbmFsbHk7Ci0JCX0KLQl9CisgICAgaWYgKCgqZnVuYykoc2VsZi0+b2Jfc3ZpZGVvLCBQVmJ1ZmZlciwgbGVuZ3RoKSkgeworICAgICAgICByZXMgPSBzdl9lcnJvcigpOworICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgfQogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJlcyA9IFB5X05vbmU7CisgICAgaWYgKG1vZGlmaWVkKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworICAgICAgICAgICAgUHlPYmplY3QqIHYgPSBQeUludF9Gcm9tTG9uZyhQVmJ1ZmZlcltpXSk7CisgICAgICAgICAgICBpZiAoIXYgfHwgUHlMaXN0X1NldEl0ZW0obGlzdCwgaSwgdikgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICAgICAgfQorICAgIH0KKworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXMgPSBQeV9Ob25lOwogCiAgIGZpbmFsbHk6Ci0JUHlNZW1fREVMKFBWYnVmZmVyKTsKLQlyZXR1cm4gcmVzOworICAgIFB5TWVtX0RFTChQVmJ1ZmZlcik7CisgICAgcmV0dXJuIHJlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHN2X0dldFBhcmFtKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gZG9QYXJhbXMoc2VsZiwgYXJncywgc3ZHZXRQYXJhbSwgMSk7CisgICAgcmV0dXJuIGRvUGFyYW1zKHNlbGYsIGFyZ3MsIHN2R2V0UGFyYW0sIDEpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc3ZfR2V0UGFyYW1SYW5nZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGRvUGFyYW1zKHNlbGYsIGFyZ3MsIHN2R2V0UGFyYW1SYW5nZSwgMSk7CisgICAgcmV0dXJuIGRvUGFyYW1zKHNlbGYsIGFyZ3MsIHN2R2V0UGFyYW1SYW5nZSwgMSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdl9TZXRQYXJhbShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGRvUGFyYW1zKHNlbGYsIGFyZ3MsIHN2U2V0UGFyYW0sIDApOworICAgIHJldHVybiBkb1BhcmFtcyhzZWxmLCBhcmdzLCBzdlNldFBhcmFtLCAwKTsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIHN2aWRlb19tZXRob2RzW10gPSB7Ci0JeyJCaW5kR0xXaW5kb3ciLAkoUHlDRnVuY3Rpb24pc3ZfQmluZEdMV2luZG93LCBNRVRIX09MREFSR1N9LAotCXsiRW5kQ29udGludW91c0NhcHR1cmUiLChQeUNGdW5jdGlvbilzdl9FbmRDb250aW51b3VzQ2FwdHVyZSwgTUVUSF9PTERBUkdTfSwKLQl7IklzVmlkZW9EaXNwbGF5ZWQiLAkoUHlDRnVuY3Rpb24pc3ZfSXNWaWRlb0Rpc3BsYXllZCwgTUVUSF9PTERBUkdTfSwKLQl7Ik91dHB1dE9mZnNldCIsCShQeUNGdW5jdGlvbilzdl9PdXRwdXRPZmZzZXQsIE1FVEhfT0xEQVJHU30sCi0JeyJQdXRGcmFtZSIsCQkoUHlDRnVuY3Rpb24pc3ZfUHV0RnJhbWUsIE1FVEhfT0xEQVJHU30sCi0JeyJRdWVyeVNpemUiLAkJKFB5Q0Z1bmN0aW9uKXN2X1F1ZXJ5U2l6ZSwgTUVUSF9PTERBUkdTfSwKLQl7IlNldFNpemUiLAkJKFB5Q0Z1bmN0aW9uKXN2X1NldFNpemUsIE1FVEhfT0xEQVJHU30sCi0JeyJTZXRTdGREZWZhdWx0cyIsCShQeUNGdW5jdGlvbilzdl9TZXRTdGREZWZhdWx0cywgTUVUSF9PTERBUkdTfSwKLQl7IlVzZUV4Y2x1c2l2ZSIsCShQeUNGdW5jdGlvbilzdl9Vc2VFeGNsdXNpdmUsIE1FVEhfT0xEQVJHU30sCi0JeyJXaW5kb3dPZmZzZXQiLAkoUHlDRnVuY3Rpb24pc3ZfV2luZG93T2Zmc2V0LCBNRVRIX09MREFSR1N9LAotCXsiSW5pdENvbnRpbnVvdXNDYXB0dXJlIiwoUHlDRnVuY3Rpb24pc3ZfSW5pdENvbnRpbnVvdXNDYXB0dXJlLCBNRVRIX09MREFSR1N9LAotCXsiQ2FwdHVyZUJ1cnN0IiwJKFB5Q0Z1bmN0aW9uKXN2X0NhcHR1cmVCdXJzdCwgTUVUSF9PTERBUkdTfSwKLQl7IkNhcHR1cmVPbmVGcmFtZSIsCShQeUNGdW5jdGlvbilzdl9DYXB0dXJlT25lRnJhbWUsIE1FVEhfT0xEQVJHU30sCi0JeyJHZXRDYXB0dXJlRGF0YSIsCShQeUNGdW5jdGlvbilzdl9HZXRDYXB0dXJlRGF0YSwgTUVUSF9PTERBUkdTfSwKLQl7IkNsb3NlVmlkZW8iLAkJKFB5Q0Z1bmN0aW9uKXN2X0Nsb3NlVmlkZW8sIE1FVEhfT0xEQVJHU30sCi0JeyJMb2FkTWFwIiwJCShQeUNGdW5jdGlvbilzdl9Mb2FkTWFwLCBNRVRIX09MREFSR1N9LAotCXsiR2V0UGFyYW0iLAkJKFB5Q0Z1bmN0aW9uKXN2X0dldFBhcmFtLCBNRVRIX09MREFSR1N9LAotCXsiR2V0UGFyYW1SYW5nZSIsCShQeUNGdW5jdGlvbilzdl9HZXRQYXJhbVJhbmdlLCBNRVRIX09MREFSR1N9LAotCXsiU2V0UGFyYW0iLAkJKFB5Q0Z1bmN0aW9uKXN2X1NldFBhcmFtLCBNRVRIX09MREFSR1N9LAotCXtOVUxMLAkJCU5VTEx9IAkJLyogc2VudGluZWwgKi8KKyAgICB7IkJpbmRHTFdpbmRvdyIsICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXN2X0JpbmRHTFdpbmRvdywgTUVUSF9PTERBUkdTfSwKKyAgICB7IkVuZENvbnRpbnVvdXNDYXB0dXJlIiwoUHlDRnVuY3Rpb24pc3ZfRW5kQ29udGludW91c0NhcHR1cmUsIE1FVEhfT0xEQVJHU30sCisgICAgeyJJc1ZpZGVvRGlzcGxheWVkIiwgICAgICAgIChQeUNGdW5jdGlvbilzdl9Jc1ZpZGVvRGlzcGxheWVkLCBNRVRIX09MREFSR1N9LAorICAgIHsiT3V0cHV0T2Zmc2V0IiwgICAgICAgICAgICAoUHlDRnVuY3Rpb24pc3ZfT3V0cHV0T2Zmc2V0LCBNRVRIX09MREFSR1N9LAorICAgIHsiUHV0RnJhbWUiLCAgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pc3ZfUHV0RnJhbWUsIE1FVEhfT0xEQVJHU30sCisgICAgeyJRdWVyeVNpemUiLCAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilzdl9RdWVyeVNpemUsIE1FVEhfT0xEQVJHU30sCisgICAgeyJTZXRTaXplIiwgICAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilzdl9TZXRTaXplLCBNRVRIX09MREFSR1N9LAorICAgIHsiU2V0U3RkRGVmYXVsdHMiLCAgICAgICAgICAoUHlDRnVuY3Rpb24pc3ZfU2V0U3RkRGVmYXVsdHMsIE1FVEhfT0xEQVJHU30sCisgICAgeyJVc2VFeGNsdXNpdmUiLCAgICAgICAgICAgIChQeUNGdW5jdGlvbilzdl9Vc2VFeGNsdXNpdmUsIE1FVEhfT0xEQVJHU30sCisgICAgeyJXaW5kb3dPZmZzZXQiLCAgICAgICAgICAgIChQeUNGdW5jdGlvbilzdl9XaW5kb3dPZmZzZXQsIE1FVEhfT0xEQVJHU30sCisgICAgeyJJbml0Q29udGludW91c0NhcHR1cmUiLChQeUNGdW5jdGlvbilzdl9Jbml0Q29udGludW91c0NhcHR1cmUsIE1FVEhfT0xEQVJHU30sCisgICAgeyJDYXB0dXJlQnVyc3QiLCAgICAgICAgICAgIChQeUNGdW5jdGlvbilzdl9DYXB0dXJlQnVyc3QsIE1FVEhfT0xEQVJHU30sCisgICAgeyJDYXB0dXJlT25lRnJhbWUiLCAgICAgICAgIChQeUNGdW5jdGlvbilzdl9DYXB0dXJlT25lRnJhbWUsIE1FVEhfT0xEQVJHU30sCisgICAgeyJHZXRDYXB0dXJlRGF0YSIsICAgICAgICAgIChQeUNGdW5jdGlvbilzdl9HZXRDYXB0dXJlRGF0YSwgTUVUSF9PTERBUkdTfSwKKyAgICB7IkNsb3NlVmlkZW8iLCAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXN2X0Nsb3NlVmlkZW8sIE1FVEhfT0xEQVJHU30sCisgICAgeyJMb2FkTWFwIiwgICAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilzdl9Mb2FkTWFwLCBNRVRIX09MREFSR1N9LAorICAgIHsiR2V0UGFyYW0iLCAgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pc3ZfR2V0UGFyYW0sIE1FVEhfT0xEQVJHU30sCisgICAgeyJHZXRQYXJhbVJhbmdlIiwgICAgICAgICAgIChQeUNGdW5jdGlvbilzdl9HZXRQYXJhbVJhbmdlLCBNRVRIX09MREFSR1N9LAorICAgIHsiU2V0UGFyYW0iLCAgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pc3ZfU2V0UGFyYW0sIE1FVEhfT0xEQVJHU30sCisgICAge05VTEwsICAgICAgICAgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIHN2X2NvbnZlcnNpb24oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCB2b2lkICgqZnVuY3Rpb24pKCksCiAgICAgICAgICAgICAgIGludCBpbnB1dGZhY3RvciwgZmxvYXQgZmFjdG9yKQogewotCWludCBpbnZlcnQsIHdpZHRoLCBoZWlnaHQsIGlucHV0bGVuZ3RoOwotCWNoYXIgKmlucHV0LCAqc3RyOwotCVB5T2JqZWN0ICpvdXRwdXQ7CisgICAgaW50IGludmVydCwgd2lkdGgsIGhlaWdodCwgaW5wdXRsZW5ndGg7CisgICAgY2hhciAqaW5wdXQsICpzdHI7CisgICAgUHlPYmplY3QgKm91dHB1dDsKIAotCWlmICghUHlBcmdfUGFyc2UoYXJncywgIihpcyNpaSkiLCAmaW52ZXJ0LAotCQkJICZpbnB1dCwgJmlucHV0bGVuZ3RoLCAmd2lkdGgsICZoZWlnaHQpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICIoaXMjaWkpIiwgJmludmVydCwKKyAgICAgICAgICAgICAgICAgICAgICZpbnB1dCwgJmlucHV0bGVuZ3RoLCAmd2lkdGgsICZoZWlnaHQpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmICh3aWR0aCAqIGhlaWdodCAqIGlucHV0ZmFjdG9yID4gaW5wdXRsZW5ndGgpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFN2RXJyb3IsICJpbnB1dCBidWZmZXIgbm90IGxvbmcgZW5vdWdoIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAod2lkdGggKiBoZWlnaHQgKiBpbnB1dGZhY3RvciA+IGlucHV0bGVuZ3RoKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhTdkVycm9yLCAiaW5wdXQgYnVmZmVyIG5vdCBsb25nIGVub3VnaCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlpZiAoIShvdXRwdXQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLAotCQkJCQkgICAgICAoaW50KSh3aWR0aCAqIGhlaWdodCAqIGZhY3RvcikpKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCEob3V0cHV0ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKHdpZHRoICogaGVpZ2h0ICogZmFjdG9yKSkpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXN0ciA9IFB5U3RyaW5nX0FzU3RyaW5nKG91dHB1dCk7Ci0JaWYgKCFzdHIpIHsKLQkJUHlfREVDUkVGKG91dHB1dCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQkoKmZ1bmN0aW9uKShpbnZlcnQsIGlucHV0LCBzdHIsIHdpZHRoLCBoZWlnaHQpOworICAgIHN0ciA9IFB5U3RyaW5nX0FzU3RyaW5nKG91dHB1dCk7CisgICAgaWYgKCFzdHIpIHsKKyAgICAgICAgUHlfREVDUkVGKG91dHB1dCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICAoKmZ1bmN0aW9uKShpbnZlcnQsIGlucHV0LCBzdHIsIHdpZHRoLCBoZWlnaHQpOwogCi0JcmV0dXJuIG91dHB1dDsKKyAgICByZXR1cm4gb3V0cHV0OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc3ZfSW50ZXJsZWF2ZUZpZWxkcyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIHN2X2NvbnZlcnNpb24oc2VsZiwgYXJncywgc3ZJbnRlcmxlYXZlRmllbGRzLCAxLCAxLjApOworICAgIHJldHVybiBzdl9jb252ZXJzaW9uKHNlbGYsIGFyZ3MsIHN2SW50ZXJsZWF2ZUZpZWxkcywgMSwgMS4wKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHN2X1JHQjh0b1JHQjMyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gc3ZfY29udmVyc2lvbihzZWxmLCBhcmdzLCBzdlJHQjh0b1JHQjMyLCAxLCAoZmxvYXQpIHNpemVvZihsb25nKSk7CisgICAgcmV0dXJuIHN2X2NvbnZlcnNpb24oc2VsZiwgYXJncywgc3ZSR0I4dG9SR0IzMiwgMSwgKGZsb2F0KSBzaXplb2YobG9uZykpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc3ZfWVVWdG9SR0IoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBzdl9jb252ZXJzaW9uKHNlbGYsIGFyZ3MsIHN2WVVWdG9SR0IsIDIsIChmbG9hdCkgc2l6ZW9mKGxvbmcpKTsKKyAgICByZXR1cm4gc3ZfY29udmVyc2lvbihzZWxmLCBhcmdzLCBzdllVVnRvUkdCLCAyLCAoZmxvYXQpIHNpemVvZihsb25nKSk7CiB9CiAKIHN0YXRpYyB2b2lkCiBzdmlkZW9fZGVhbGxvYyhzdm9iamVjdCAqc2VsZikKIHsKLQlpZiAoc2VsZi0+b2Jfc3ZpZGVvICE9IE5VTEwpCi0JCSh2b2lkKSBzdkNsb3NlVmlkZW8oc2VsZi0+b2Jfc3ZpZGVvKTsKLQlQeU9iamVjdF9EZWwoc2VsZik7CisgICAgaWYgKHNlbGYtPm9iX3N2aWRlbyAhPSBOVUxMKQorICAgICAgICAodm9pZCkgc3ZDbG9zZVZpZGVvKHNlbGYtPm9iX3N2aWRlbyk7CisgICAgUHlPYmplY3RfRGVsKHNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc3ZpZGVvX2dldGF0dHIoc3ZvYmplY3QgKnNlbGYsIGNoYXIgKm5hbWUpCiB7Ci0JcmV0dXJuIFB5X0ZpbmRNZXRob2Qoc3ZpZGVvX21ldGhvZHMsIChQeU9iamVjdCAqKXNlbGYsIG5hbWUpOworICAgIHJldHVybiBQeV9GaW5kTWV0aG9kKHN2aWRlb19tZXRob2RzLCAoUHlPYmplY3QgKilzZWxmLCBuYW1lKTsKIH0KIAogUHlUeXBlT2JqZWN0IFN2dHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlKQotCTAsCQkJLypvYl9zaXplKi8KLQkic3Yuc3YiLAkJLyp0cF9uYW1lKi8KLQlzaXplb2Yoc3ZvYmplY3QpLAkvKnRwX3NpemUqLwotCTAsCQkJLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKXN2aWRlb19kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsCQkJLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKXN2aWRlb19nZXRhdHRyLCAvKnRwX2dldGF0dHIqLwotCTAsCQkJLyp0cF9zZXRhdHRyKi8KLQkwLAkJCS8qdHBfY29tcGFyZSovCi0JMCwJCQkvKnRwX3JlcHIqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUpCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb2Jfc2l6ZSovCisgICAgInN2LnN2IiwgICAgICAgICAgICAgICAgICAgIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKHN2b2JqZWN0KSwgICAgICAgICAgIC8qdHBfc2l6ZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcilzdmlkZW9fZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKXN2aWRlb19nZXRhdHRyLCAvKnRwX2dldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NvbXBhcmUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3JlcHIqLwogfTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIG5ld3N2b2JqZWN0KFNWX25vZGVQIHN2cCkKIHsKLQlzdm9iamVjdCAqcDsKKyAgICBzdm9iamVjdCAqcDsKIAotCXAgPSBQeU9iamVjdF9OZXcoc3ZvYmplY3QsICZTdnR5cGUpOwotCWlmIChwID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXAtPm9iX3N2aWRlbyA9IHN2cDsKLQlwLT5vYl9pbmZvLmZvcm1hdCA9IDA7Ci0JcC0+b2JfaW5mby5zaXplID0gMDsKLQlwLT5vYl9pbmZvLndpZHRoID0gMDsKLQlwLT5vYl9pbmZvLmhlaWdodCA9IDA7Ci0JcC0+b2JfaW5mby5zYW1wbGluZ3JhdGUgPSAwOwotCXJldHVybiAoUHlPYmplY3QgKikgcDsKKyAgICBwID0gUHlPYmplY3RfTmV3KHN2b2JqZWN0LCAmU3Z0eXBlKTsKKyAgICBpZiAocCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBwLT5vYl9zdmlkZW8gPSBzdnA7CisgICAgcC0+b2JfaW5mby5mb3JtYXQgPSAwOworICAgIHAtPm9iX2luZm8uc2l6ZSA9IDA7CisgICAgcC0+b2JfaW5mby53aWR0aCA9IDA7CisgICAgcC0+b2JfaW5mby5oZWlnaHQgPSAwOworICAgIHAtPm9iX2luZm8uc2FtcGxpbmdyYXRlID0gMDsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopIHA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdl9PcGVuVmlkZW8oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVNWX25vZGVQIHN2cDsKKyAgICBTVl9ub2RlUCBzdnA7CiAKLQlpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0Jc3ZwID0gc3ZPcGVuVmlkZW8oKTsKLQlpZiAoc3ZwID09IE5VTEwpCi0JCXJldHVybiBzdl9lcnJvcigpOworICAgIHN2cCA9IHN2T3BlblZpZGVvKCk7CisgICAgaWYgKHN2cCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gc3ZfZXJyb3IoKTsKIAotCXJldHVybiBuZXdzdm9iamVjdChzdnApOworICAgIHJldHVybiBuZXdzdm9iamVjdChzdnApOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgc3ZfbWV0aG9kc1tdID0gewotCXsiSW50ZXJsZWF2ZUZpZWxkcyIsCShQeUNGdW5jdGlvbilzdl9JbnRlcmxlYXZlRmllbGRzLCBNRVRIX09MREFSR1N9LAotCXsiUkdCOHRvUkdCMzIiLAkJKFB5Q0Z1bmN0aW9uKXN2X1JHQjh0b1JHQjMyLCBNRVRIX09MREFSR1N9LAotCXsiWVVWdG9SR0IiLAkJKFB5Q0Z1bmN0aW9uKXN2X1lVVnRvUkdCLCBNRVRIX09MREFSR1N9LAotCXsiT3BlblZpZGVvIiwJCShQeUNGdW5jdGlvbilzdl9PcGVuVmlkZW8sIE1FVEhfT0xEQVJHU30sCi0Je05VTEwsCQkJTlVMTH0JLyogU2VudGluZWwgKi8KKyAgICB7IkludGVybGVhdmVGaWVsZHMiLCAgICAgICAgKFB5Q0Z1bmN0aW9uKXN2X0ludGVybGVhdmVGaWVsZHMsIE1FVEhfT0xEQVJHU30sCisgICAgeyJSR0I4dG9SR0IzMiIsICAgICAgICAgICAgIChQeUNGdW5jdGlvbilzdl9SR0I4dG9SR0IzMiwgTUVUSF9PTERBUkdTfSwKKyAgICB7IllVVnRvUkdCIiwgICAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXN2X1lVVnRvUkdCLCBNRVRIX09MREFSR1N9LAorICAgIHsiT3BlblZpZGVvIiwgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pc3ZfT3BlblZpZGVvLCBNRVRIX09MREFSR1N9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgICAgICAgICBOVUxMfSAgIC8qIFNlbnRpbmVsICovCiB9OwogCiB2b2lkCiBpbml0c3Yodm9pZCkKIHsKLQlQeU9iamVjdCAqbSwgKmQ7Ci0JCi0JaWYgKFB5RXJyX1dhcm5QeTNrKCJ0aGUgc3YgbW9kdWxlIGhhcyBiZWVuIHJlbW92ZWQgaW4gIgotCSAgICAgICAgICAgICAgICAgICAiUHl0aG9uIDMuMCIsIDIpIDwgMCkKLQkgICAgcmV0dXJuOworICAgIFB5T2JqZWN0ICptLCAqZDsKIAotCW0gPSBQeV9Jbml0TW9kdWxlKCJzdiIsIHN2X21ldGhvZHMpOwotCWlmIChtID09IE5VTEwpCi0JCXJldHVybjsKLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICBpZiAoUHlFcnJfV2FyblB5M2soInRoZSBzdiBtb2R1bGUgaGFzIGJlZW4gcmVtb3ZlZCBpbiAiCisgICAgICAgICAgICAgICAgICAgICAgICJQeXRob24gMy4wIiwgMikgPCAwKQorICAgICAgICByZXR1cm47CiAKLQlTdkVycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJzdi5lcnJvciIsIE5VTEwsIE5VTEwpOwotCWlmIChTdkVycm9yID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgImVycm9yIiwgU3ZFcnJvcikgIT0gMCkKLQkJcmV0dXJuOworICAgIG0gPSBQeV9Jbml0TW9kdWxlKCJzdiIsIHN2X21ldGhvZHMpOworICAgIGlmIChtID09IE5VTEwpCisgICAgICAgIHJldHVybjsKKyAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKworICAgIFN2RXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oInN2LmVycm9yIiwgTlVMTCwgTlVMTCk7CisgICAgaWYgKFN2RXJyb3IgPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiZXJyb3IiLCBTdkVycm9yKSAhPSAwKQorICAgICAgICByZXR1cm47CiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3N5bXRhYmxlbW9kdWxlLmMgYi9Nb2R1bGVzL3N5bXRhYmxlbW9kdWxlLmMKaW5kZXggNTNlOTg3ZS4uODZjNjQ4MSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9zeW10YWJsZW1vZHVsZS5jCisrKyBiL01vZHVsZXMvc3ltdGFibGVtb2R1bGUuYwpAQCAtOCw4MCArOCw4MCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHN5bXRhYmxlX3N5bXRhYmxlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzdHJ1Y3Qgc3ltdGFibGUgKnN0OwotCVB5T2JqZWN0ICp0OworICAgIHN0cnVjdCBzeW10YWJsZSAqc3Q7CisgICAgUHlPYmplY3QgKnQ7CiAKLQljaGFyICpzdHI7Ci0JY2hhciAqZmlsZW5hbWU7Ci0JY2hhciAqc3RhcnRzdHI7Ci0JaW50IHN0YXJ0OworICAgIGNoYXIgKnN0cjsKKyAgICBjaGFyICpmaWxlbmFtZTsKKyAgICBjaGFyICpzdGFydHN0cjsKKyAgICBpbnQgc3RhcnQ7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInNzczpzeW10YWJsZSIsICZzdHIsICZmaWxlbmFtZSwgCi0JCQkgICAgICAmc3RhcnRzdHIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoc3RyY21wKHN0YXJ0c3RyLCAiZXhlYyIpID09IDApCi0JCXN0YXJ0ID0gUHlfZmlsZV9pbnB1dDsKLQllbHNlIGlmIChzdHJjbXAoc3RhcnRzdHIsICJldmFsIikgPT0gMCkKLQkJc3RhcnQgPSBQeV9ldmFsX2lucHV0OwotCWVsc2UgaWYgKHN0cmNtcChzdGFydHN0ciwgInNpbmdsZSIpID09IDApCi0JCXN0YXJ0ID0gUHlfc2luZ2xlX2lucHV0OwotCWVsc2UgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJICAgInN5bXRhYmxlKCkgYXJnIDMgbXVzdCBiZSAnZXhlYycgb3IgJ2V2YWwnIG9yICdzaW5nbGUnIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlzdCA9IFB5X1N5bXRhYmxlU3RyaW5nKHN0ciwgZmlsZW5hbWUsIHN0YXJ0KTsKLQlpZiAoc3QgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JdCA9IHN0LT5zdF9zeW1ib2xzOwotCVB5X0lOQ1JFRih0KTsKLQlQeU1lbV9GcmVlKCh2b2lkICopc3QtPnN0X2Z1dHVyZSk7Ci0JUHlTeW10YWJsZV9GcmVlKHN0KTsKLQlyZXR1cm4gdDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInNzczpzeW10YWJsZSIsICZzdHIsICZmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0c3RyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKHN0cmNtcChzdGFydHN0ciwgImV4ZWMiKSA9PSAwKQorICAgICAgICBzdGFydCA9IFB5X2ZpbGVfaW5wdXQ7CisgICAgZWxzZSBpZiAoc3RyY21wKHN0YXJ0c3RyLCAiZXZhbCIpID09IDApCisgICAgICAgIHN0YXJ0ID0gUHlfZXZhbF9pbnB1dDsKKyAgICBlbHNlIGlmIChzdHJjbXAoc3RhcnRzdHIsICJzaW5nbGUiKSA9PSAwKQorICAgICAgICBzdGFydCA9IFB5X3NpbmdsZV9pbnB1dDsKKyAgICBlbHNlIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICJzeW10YWJsZSgpIGFyZyAzIG11c3QgYmUgJ2V4ZWMnIG9yICdldmFsJyBvciAnc2luZ2xlJyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgc3QgPSBQeV9TeW10YWJsZVN0cmluZyhzdHIsIGZpbGVuYW1lLCBzdGFydCk7CisgICAgaWYgKHN0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHQgPSBzdC0+c3Rfc3ltYm9sczsKKyAgICBQeV9JTkNSRUYodCk7CisgICAgUHlNZW1fRnJlZSgodm9pZCAqKXN0LT5zdF9mdXR1cmUpOworICAgIFB5U3ltdGFibGVfRnJlZShzdCk7CisgICAgcmV0dXJuIHQ7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBzeW10YWJsZV9tZXRob2RzW10gPSB7Ci0JeyJzeW10YWJsZSIsCXN5bXRhYmxlX3N5bXRhYmxlLAlNRVRIX1ZBUkFSR1MsCi0JIFB5RG9jX1NUUigiUmV0dXJuIHN5bWJvbCBhbmQgc2NvcGUgZGljdGlvbmFyaWVzIgotCSAJICAgIiB1c2VkIGludGVybmFsbHkgYnkgY29tcGlsZXIuIil9LAotCXtOVUxMLAkJTlVMTH0JCS8qIHNlbnRpbmVsICovCisgICAgeyJzeW10YWJsZSIsICAgICAgICBzeW10YWJsZV9zeW10YWJsZSwgICAgICBNRVRIX1ZBUkFSR1MsCisgICAgIFB5RG9jX1NUUigiUmV0dXJuIHN5bWJvbCBhbmQgc2NvcGUgZGljdGlvbmFyaWVzIgorICAgICAgICAgICAgICAgIiB1c2VkIGludGVybmFsbHkgYnkgY29tcGlsZXIuIil9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiBQeU1PRElOSVRfRlVOQwogaW5pdF9zeW10YWJsZSh2b2lkKQogewotCVB5T2JqZWN0ICptOworICAgIFB5T2JqZWN0ICptOwogCi0JbSA9IFB5X0luaXRNb2R1bGUoIl9zeW10YWJsZSIsIHN5bXRhYmxlX21ldGhvZHMpOwotCWlmIChtID09IE5VTEwpCi0JCXJldHVybjsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiVVNFIiwgVVNFKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiREVGX0dMT0JBTCIsIERFRl9HTE9CQUwpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJERUZfTE9DQUwiLCBERUZfTE9DQUwpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJERUZfUEFSQU0iLCBERUZfUEFSQU0pOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJERUZfU1RBUiIsIERFRl9TVEFSKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiREVGX0RPVUJMRVNUQVIiLCBERUZfRE9VQkxFU1RBUik7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkRFRl9JTlRVUExFIiwgREVGX0lOVFVQTEUpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJERUZfRlJFRSIsIERFRl9GUkVFKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiREVGX0ZSRUVfR0xPQkFMIiwgREVGX0ZSRUVfR0xPQkFMKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiREVGX0ZSRUVfQ0xBU1MiLCBERUZfRlJFRV9DTEFTUyk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkRFRl9JTVBPUlQiLCBERUZfSU1QT1JUKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiREVGX0JPVU5EIiwgREVGX0JPVU5EKTsKKyAgICBtID0gUHlfSW5pdE1vZHVsZSgiX3N5bXRhYmxlIiwgc3ltdGFibGVfbWV0aG9kcyk7CisgICAgaWYgKG0gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJVU0UiLCBVU0UpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJERUZfR0xPQkFMIiwgREVGX0dMT0JBTCk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkRFRl9MT0NBTCIsIERFRl9MT0NBTCk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkRFRl9QQVJBTSIsIERFRl9QQVJBTSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkRFRl9TVEFSIiwgREVGX1NUQVIpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJERUZfRE9VQkxFU1RBUiIsIERFRl9ET1VCTEVTVEFSKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiREVGX0lOVFVQTEUiLCBERUZfSU5UVVBMRSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkRFRl9GUkVFIiwgREVGX0ZSRUUpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJERUZfRlJFRV9HTE9CQUwiLCBERUZfRlJFRV9HTE9CQUwpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJERUZfRlJFRV9DTEFTUyIsIERFRl9GUkVFX0NMQVNTKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiREVGX0lNUE9SVCIsIERFRl9JTVBPUlQpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJERUZfQk9VTkQiLCBERUZfQk9VTkQpOwogCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlRZUEVfRlVOQ1RJT04iLCBGdW5jdGlvbkJsb2NrKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiVFlQRV9DTEFTUyIsIENsYXNzQmxvY2spOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJUWVBFX01PRFVMRSIsIE1vZHVsZUJsb2NrKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiVFlQRV9GVU5DVElPTiIsIEZ1bmN0aW9uQmxvY2spOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJUWVBFX0NMQVNTIiwgQ2xhc3NCbG9jayk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlRZUEVfTU9EVUxFIiwgTW9kdWxlQmxvY2spOwogCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk9QVF9JTVBPUlRfU1RBUiIsIE9QVF9JTVBPUlRfU1RBUik7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk9QVF9FWEVDIiwgT1BUX0VYRUMpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJPUFRfQkFSRV9FWEVDIiwgT1BUX0JBUkVfRVhFQyk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk9QVF9JTVBPUlRfU1RBUiIsIE9QVF9JTVBPUlRfU1RBUik7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk9QVF9FWEVDIiwgT1BUX0VYRUMpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJPUFRfQkFSRV9FWEVDIiwgT1BUX0JBUkVfRVhFQyk7CiAKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTE9DQUwiLCBMT0NBTCk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkdMT0JBTF9FWFBMSUNJVCIsIEdMT0JBTF9FWFBMSUNJVCk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkdMT0JBTF9JTVBMSUNJVCIsIEdMT0JBTF9JTVBMSUNJVCk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkZSRUUiLCBGUkVFKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQ0VMTCIsIENFTEwpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJMT0NBTCIsIExPQ0FMKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiR0xPQkFMX0VYUExJQ0lUIiwgR0xPQkFMX0VYUExJQ0lUKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiR0xPQkFMX0lNUExJQ0lUIiwgR0xPQkFMX0lNUExJQ0lUKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiRlJFRSIsIEZSRUUpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJDRUxMIiwgQ0VMTCk7CiAKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU0NPUEVfT0ZGIiwgU0NPUEVfT0ZGKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU0NPUEVfTUFTSyIsIFNDT1BFX01BU0spOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTQ09QRV9PRkYiLCBTQ09QRV9PRkYpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTQ09QRV9NQVNLIiwgU0NPUEVfTUFTSyk7CiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3N5c2xvZ21vZHVsZS5jIGIvTW9kdWxlcy9zeXNsb2dtb2R1bGUuYwppbmRleCA5ZTFlZDA2Li5lMGZjYTBkIDEwMDY0NAotLS0gYS9Nb2R1bGVzL3N5c2xvZ21vZHVsZS5jCisrKyBiL01vZHVsZXMvc3lzbG9nbW9kdWxlLmMKQEAgLTQsMjAgKzQsMjAgQEAKIAogICAgICAgICAgICAgICAgICAgICAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAogCi1QZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMgCi1kb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIAorUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsCiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0Ci1ib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gCitib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgTGFuY2UgRWxsaW5naG91c2UKLW5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiAKK25vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbgogb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4KIAogTEFOQ0UgRUxMSU5HSE9VU0UgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPCiBUSElTIFNPRlRXQVJFLCBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5ECi1GSVRORVNTLCBJTiBOTyBFVkVOVCBTSEFMTCBMQU5DRSBFTExJTkdIT1VTRSBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCAKLUlORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyAKLUZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIAotTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gCitGSVRORVNTLCBJTiBOTyBFVkVOVCBTSEFMTCBMQU5DRSBFTExJTkdIT1VTRSBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLAorSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HCitGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAorTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC00OSwxMDkgKzQ5LDEwOSBAQAogI2luY2x1ZGUgPHN5c2xvZy5oPgogCiAvKiAgb25seSBvbmUgaW5zdGFuY2UsIG9ubHkgb25lIHN5c2xvZywgc28gZ2xvYmFscyBzaG91bGQgYmUgb2sgICovCi1zdGF0aWMgUHlPYmplY3QgKlNfaWRlbnRfbyA9IE5VTEw7CQkJLyogIGlkZW50aWZpZXIsIGhlbGQgYnkgb3BlbmxvZygpICAqLworc3RhdGljIFB5T2JqZWN0ICpTX2lkZW50X28gPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAvKiAgaWRlbnRpZmllciwgaGVsZCBieSBvcGVubG9nKCkgICovCiAKIAotc3RhdGljIFB5T2JqZWN0ICogCitzdGF0aWMgUHlPYmplY3QgKgogc3lzbG9nX29wZW5sb2coUHlPYmplY3QgKiBzZWxmLCBQeU9iamVjdCAqIGFyZ3MpCiB7Ci0JbG9uZyBsb2dvcHQgPSAwOwotCWxvbmcgZmFjaWxpdHkgPSBMT0dfVVNFUjsKLQlQeU9iamVjdCAqbmV3X1NfaWRlbnRfbzsKKyAgICBsb25nIGxvZ29wdCA9IDA7CisgICAgbG9uZyBmYWNpbGl0eSA9IExPR19VU0VSOworICAgIFB5T2JqZWN0ICpuZXdfU19pZGVudF9vOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsCi0JCQkgICAgICAiU3xsbDtpZGVudCBzdHJpbmcgWywgbG9nb3B0aW9uIFssIGZhY2lsaXR5XV0iLAotCQkJICAgICAgJm5ld19TX2lkZW50X28sICZsb2dvcHQsICZmYWNpbGl0eSkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiU3xsbDtpZGVudCBzdHJpbmcgWywgbG9nb3B0aW9uIFssIGZhY2lsaXR5XV0iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbmV3X1NfaWRlbnRfbywgJmxvZ29wdCwgJmZhY2lsaXR5KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkvKiBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIG9wZW5sb2coKSBkb2VzIE5PVCBtYWtlIGEgY29weQotCSAqIGFuZCBzeXNsb2coKSBsYXRlciB1c2VzIGl0Li4gY2Fubm90IHRyYXNoIGl0LgotCSAqLwotCVB5X1hERUNSRUYoU19pZGVudF9vKTsKLQlTX2lkZW50X28gPSBuZXdfU19pZGVudF9vOwotCVB5X0lOQ1JFRihTX2lkZW50X28pOworICAgIC8qIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2Ugb3BlbmxvZygpIGRvZXMgTk9UIG1ha2UgYSBjb3B5CisgICAgICogYW5kIHN5c2xvZygpIGxhdGVyIHVzZXMgaXQuLiBjYW5ub3QgdHJhc2ggaXQuCisgICAgICovCisgICAgUHlfWERFQ1JFRihTX2lkZW50X28pOworICAgIFNfaWRlbnRfbyA9IG5ld19TX2lkZW50X287CisgICAgUHlfSU5DUkVGKFNfaWRlbnRfbyk7CiAKLQlvcGVubG9nKFB5U3RyaW5nX0FzU3RyaW5nKFNfaWRlbnRfbyksIGxvZ29wdCwgZmFjaWxpdHkpOworICAgIG9wZW5sb2coUHlTdHJpbmdfQXNTdHJpbmcoU19pZGVudF9vKSwgbG9nb3B0LCBmYWNpbGl0eSk7CiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAKLXN0YXRpYyBQeU9iamVjdCAqIAorc3RhdGljIFB5T2JqZWN0ICoKIHN5c2xvZ19zeXNsb2coUHlPYmplY3QgKiBzZWxmLCBQeU9iamVjdCAqIGFyZ3MpCiB7Ci0JY2hhciAqbWVzc2FnZTsKLQlpbnQgICBwcmlvcml0eSA9IExPR19JTkZPOworICAgIGNoYXIgKm1lc3NhZ2U7CisgICAgaW50ICAgcHJpb3JpdHkgPSBMT0dfSU5GTzsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaXM7W3ByaW9yaXR5LF0gbWVzc2FnZSBzdHJpbmciLAotCQkJICAgICAgJnByaW9yaXR5LCAmbWVzc2FnZSkpIHsKLQkJUHlFcnJfQ2xlYXIoKTsKLQkJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzO1twcmlvcml0eSxdIG1lc3NhZ2Ugc3RyaW5nIiwKLQkJCQkgICAgICAmbWVzc2FnZSkpCi0JCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpcztbcHJpb3JpdHksXSBtZXNzYWdlIHN0cmluZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwcmlvcml0eSwgJm1lc3NhZ2UpKSB7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicztbcHJpb3JpdHksXSBtZXNzYWdlIHN0cmluZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVzc2FnZSkpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlQeV9CRUdJTl9BTExPV19USFJFQURTOwotCXN5c2xvZyhwcmlvcml0eSwgIiVzIiwgbWVzc2FnZSk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFM7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFM7CisgICAgc3lzbG9nKHByaW9yaXR5LCAiJXMiLCBtZXNzYWdlKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUzsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKLXN0YXRpYyBQeU9iamVjdCAqIAorc3RhdGljIFB5T2JqZWN0ICoKIHN5c2xvZ19jbG9zZWxvZyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnVudXNlZCkKIHsKLQljbG9zZWxvZygpOwotCVB5X1hERUNSRUYoU19pZGVudF9vKTsKLQlTX2lkZW50X28gPSBOVUxMOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBjbG9zZWxvZygpOworICAgIFB5X1hERUNSRUYoU19pZGVudF9vKTsKKyAgICBTX2lkZW50X28gPSBOVUxMOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAotc3RhdGljIFB5T2JqZWN0ICogCitzdGF0aWMgUHlPYmplY3QgKgogc3lzbG9nX3NldGxvZ21hc2soUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgbWFza3ByaSwgb21hc2twcmk7CisgICAgbG9uZyBtYXNrcHJpLCBvbWFza3ByaTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibDttYXNrIGZvciBwcmlvcml0eSIsICZtYXNrcHJpKSkKLQkJcmV0dXJuIE5VTEw7Ci0Jb21hc2twcmkgPSBzZXRsb2dtYXNrKG1hc2twcmkpOwotCXJldHVybiBQeUludF9Gcm9tTG9uZyhvbWFza3ByaSk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsO21hc2sgZm9yIHByaW9yaXR5IiwgJm1hc2twcmkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBvbWFza3ByaSA9IHNldGxvZ21hc2sobWFza3ByaSk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKG9tYXNrcHJpKTsKIH0KIAotc3RhdGljIFB5T2JqZWN0ICogCitzdGF0aWMgUHlPYmplY3QgKgogc3lzbG9nX2xvZ19tYXNrKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIG1hc2s7Ci0JbG9uZyBwcmk7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsOkxPR19NQVNLIiwgJnByaSkpCi0JCXJldHVybiBOVUxMOwotCW1hc2sgPSBMT0dfTUFTSyhwcmkpOwotCXJldHVybiBQeUludF9Gcm9tTG9uZyhtYXNrKTsKKyAgICBsb25nIG1hc2s7CisgICAgbG9uZyBwcmk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsOkxPR19NQVNLIiwgJnByaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG1hc2sgPSBMT0dfTUFTSyhwcmkpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhtYXNrKTsKIH0KIAotc3RhdGljIFB5T2JqZWN0ICogCitzdGF0aWMgUHlPYmplY3QgKgogc3lzbG9nX2xvZ191cHRvKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIG1hc2s7Ci0JbG9uZyBwcmk7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsOkxPR19VUFRPIiwgJnByaSkpCi0JCXJldHVybiBOVUxMOwotCW1hc2sgPSBMT0dfVVBUTyhwcmkpOwotCXJldHVybiBQeUludF9Gcm9tTG9uZyhtYXNrKTsKKyAgICBsb25nIG1hc2s7CisgICAgbG9uZyBwcmk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsOkxPR19VUFRPIiwgJnByaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG1hc2sgPSBMT0dfVVBUTyhwcmkpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhtYXNrKTsKIH0KIAogLyogTGlzdCBvZiBmdW5jdGlvbnMgZGVmaW5lZCBpbiB0aGUgbW9kdWxlICovCiAKIHN0YXRpYyBQeU1ldGhvZERlZiBzeXNsb2dfbWV0aG9kc1tdID0gewotCXsib3BlbmxvZyIsCXN5c2xvZ19vcGVubG9nLAkJTUVUSF9WQVJBUkdTfSwKLQl7ImNsb3NlbG9nIiwJc3lzbG9nX2Nsb3NlbG9nLAlNRVRIX05PQVJHU30sCi0JeyJzeXNsb2ciLAlzeXNsb2dfc3lzbG9nLAkJTUVUSF9WQVJBUkdTfSwKLQl7InNldGxvZ21hc2siLAlzeXNsb2dfc2V0bG9nbWFzaywJTUVUSF9WQVJBUkdTfSwKLQl7IkxPR19NQVNLIiwJc3lzbG9nX2xvZ19tYXNrLAlNRVRIX1ZBUkFSR1N9LAotCXsiTE9HX1VQVE8iLAlzeXNsb2dfbG9nX3VwdG8sCU1FVEhfVkFSQVJHU30sCi0Je05VTEwsCQlOVUxMLAkJCTB9CisgICAgeyJvcGVubG9nIiwgICAgICAgICBzeXNsb2dfb3BlbmxvZywgICAgICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsiY2xvc2Vsb2ciLCAgICAgICAgc3lzbG9nX2Nsb3NlbG9nLCAgICAgICAgTUVUSF9OT0FSR1N9LAorICAgIHsic3lzbG9nIiwgICAgICAgICAgc3lzbG9nX3N5c2xvZywgICAgICAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7InNldGxvZ21hc2siLCAgICAgIHN5c2xvZ19zZXRsb2dtYXNrLCAgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJMT0dfTUFTSyIsICAgICAgICBzeXNsb2dfbG9nX21hc2ssICAgICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsiTE9HX1VQVE8iLCAgICAgICAgc3lzbG9nX2xvZ191cHRvLCAgICAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgIDB9CiB9OwogCiAvKiBJbml0aWFsaXphdGlvbiBmdW5jdGlvbiBmb3IgdGhlIG1vZHVsZSAqLwpAQCAtMTU5LDY3ICsxNTksNjcgQEAKIFB5TU9ESU5JVF9GVU5DCiBpbml0c3lzbG9nKHZvaWQpCiB7Ci0JUHlPYmplY3QgKm07CisgICAgUHlPYmplY3QgKm07CiAKLQkvKiBDcmVhdGUgdGhlIG1vZHVsZSBhbmQgYWRkIHRoZSBmdW5jdGlvbnMgKi8KLQltID0gUHlfSW5pdE1vZHVsZSgic3lzbG9nIiwgc3lzbG9nX21ldGhvZHMpOwotCWlmIChtID09IE5VTEwpCi0JCXJldHVybjsKKyAgICAvKiBDcmVhdGUgdGhlIG1vZHVsZSBhbmQgYWRkIHRoZSBmdW5jdGlvbnMgKi8KKyAgICBtID0gUHlfSW5pdE1vZHVsZSgic3lzbG9nIiwgc3lzbG9nX21ldGhvZHMpOworICAgIGlmIChtID09IE5VTEwpCisgICAgICAgIHJldHVybjsKIAotCS8qIEFkZCBzb21lIHN5bWJvbGljIGNvbnN0YW50cyB0byB0aGUgbW9kdWxlICovCisgICAgLyogQWRkIHNvbWUgc3ltYm9saWMgY29uc3RhbnRzIHRvIHRoZSBtb2R1bGUgKi8KIAotCS8qIFByaW9yaXRpZXMgKi8KLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTE9HX0VNRVJHIiwJICBMT0dfRU1FUkcpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJMT0dfQUxFUlQiLAkgIExPR19BTEVSVCk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkxPR19DUklUIiwJICBMT0dfQ1JJVCk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkxPR19FUlIiLAkgIExPR19FUlIpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJMT0dfV0FSTklORyIsIExPR19XQVJOSU5HKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTE9HX05PVElDRSIsICBMT0dfTk9USUNFKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTE9HX0lORk8iLAkgIExPR19JTkZPKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTE9HX0RFQlVHIiwJICBMT0dfREVCVUcpOworICAgIC8qIFByaW9yaXRpZXMgKi8KKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTE9HX0VNRVJHIiwgICAgICAgTE9HX0VNRVJHKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTE9HX0FMRVJUIiwgICAgICAgTE9HX0FMRVJUKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTE9HX0NSSVQiLCAgICAgICAgTE9HX0NSSVQpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJMT0dfRVJSIiwgICAgICAgICBMT0dfRVJSKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTE9HX1dBUk5JTkciLCBMT0dfV0FSTklORyk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkxPR19OT1RJQ0UiLCAgTE9HX05PVElDRSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkxPR19JTkZPIiwgICAgICAgIExPR19JTkZPKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTE9HX0RFQlVHIiwgICAgICAgTE9HX0RFQlVHKTsKIAotCS8qIG9wZW5sb2coKSBvcHRpb24gZmxhZ3MgKi8KLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTE9HX1BJRCIsCSAgTE9HX1BJRCk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkxPR19DT05TIiwJICBMT0dfQ09OUyk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkxPR19OREVMQVkiLCAgTE9HX05ERUxBWSk7CisgICAgLyogb3BlbmxvZygpIG9wdGlvbiBmbGFncyAqLworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJMT0dfUElEIiwgICAgICAgICBMT0dfUElEKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTE9HX0NPTlMiLCAgICAgICAgTE9HX0NPTlMpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJMT0dfTkRFTEFZIiwgIExPR19OREVMQVkpOwogI2lmZGVmIExPR19OT1dBSVQKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTE9HX05PV0FJVCIsICBMT0dfTk9XQUlUKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTE9HX05PV0FJVCIsICBMT0dfTk9XQUlUKTsKICNlbmRpZgogI2lmZGVmIExPR19QRVJST1IKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTE9HX1BFUlJPUiIsICBMT0dfUEVSUk9SKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTE9HX1BFUlJPUiIsICBMT0dfUEVSUk9SKTsKICNlbmRpZgogCi0JLyogRmFjaWxpdGllcyAqLwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJMT0dfS0VSTiIsCSAgTE9HX0tFUk4pOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJMT0dfVVNFUiIsCSAgTE9HX1VTRVIpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJMT0dfTUFJTCIsCSAgTE9HX01BSUwpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJMT0dfREFFTU9OIiwgIExPR19EQUVNT04pOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJMT0dfQVVUSCIsCSAgTE9HX0FVVEgpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJMT0dfTFBSIiwJICBMT0dfTFBSKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTE9HX0xPQ0FMMCIsICBMT0dfTE9DQUwwKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTE9HX0xPQ0FMMSIsICBMT0dfTE9DQUwxKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTE9HX0xPQ0FMMiIsICBMT0dfTE9DQUwyKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTE9HX0xPQ0FMMyIsICBMT0dfTE9DQUwzKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTE9HX0xPQ0FMNCIsICBMT0dfTE9DQUw0KTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTE9HX0xPQ0FMNSIsICBMT0dfTE9DQUw1KTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTE9HX0xPQ0FMNiIsICBMT0dfTE9DQUw2KTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTE9HX0xPQ0FMNyIsICBMT0dfTE9DQUw3KTsKKyAgICAvKiBGYWNpbGl0aWVzICovCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkxPR19LRVJOIiwgICAgICAgIExPR19LRVJOKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTE9HX1VTRVIiLCAgICAgICAgTE9HX1VTRVIpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJMT0dfTUFJTCIsICAgICAgICBMT0dfTUFJTCk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkxPR19EQUVNT04iLCAgTE9HX0RBRU1PTik7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkxPR19BVVRIIiwgICAgICAgIExPR19BVVRIKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTE9HX0xQUiIsICAgICAgICAgTE9HX0xQUik7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkxPR19MT0NBTDAiLCAgTE9HX0xPQ0FMMCk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkxPR19MT0NBTDEiLCAgTE9HX0xPQ0FMMSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkxPR19MT0NBTDIiLCAgTE9HX0xPQ0FMMik7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkxPR19MT0NBTDMiLCAgTE9HX0xPQ0FMMyk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkxPR19MT0NBTDQiLCAgTE9HX0xPQ0FMNCk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkxPR19MT0NBTDUiLCAgTE9HX0xPQ0FMNSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkxPR19MT0NBTDYiLCAgTE9HX0xPQ0FMNik7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkxPR19MT0NBTDciLCAgTE9HX0xPQ0FMNyk7CiAKICNpZm5kZWYgTE9HX1NZU0xPRwotI2RlZmluZSBMT0dfU1lTTE9HCQlMT0dfREFFTU9OCisjZGVmaW5lIExPR19TWVNMT0cgICAgICAgICAgICAgIExPR19EQUVNT04KICNlbmRpZgogI2lmbmRlZiBMT0dfTkVXUwotI2RlZmluZSBMT0dfTkVXUwkJTE9HX01BSUwKKyNkZWZpbmUgTE9HX05FV1MgICAgICAgICAgICAgICAgTE9HX01BSUwKICNlbmRpZgogI2lmbmRlZiBMT0dfVVVDUAotI2RlZmluZSBMT0dfVVVDUAkJTE9HX01BSUwKKyNkZWZpbmUgTE9HX1VVQ1AgICAgICAgICAgICAgICAgTE9HX01BSUwKICNlbmRpZgogI2lmbmRlZiBMT0dfQ1JPTgotI2RlZmluZSBMT0dfQ1JPTgkJTE9HX0RBRU1PTgorI2RlZmluZSBMT0dfQ1JPTiAgICAgICAgICAgICAgICBMT0dfREFFTU9OCiAjZW5kaWYKIAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJMT0dfU1lTTE9HIiwgIExPR19TWVNMT0cpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJMT0dfQ1JPTiIsCSAgTE9HX0NST04pOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJMT0dfVVVDUCIsCSAgTE9HX1VVQ1ApOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJMT0dfTkVXUyIsCSAgTE9HX05FV1MpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJMT0dfU1lTTE9HIiwgIExPR19TWVNMT0cpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJMT0dfQ1JPTiIsICAgICAgICBMT0dfQ1JPTik7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkxPR19VVUNQIiwgICAgICAgIExPR19VVUNQKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTE9HX05FV1MiLCAgICAgICAgTE9HX05FV1MpOwogfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy90ZXJtaW9zLmMgYi9Nb2R1bGVzL3Rlcm1pb3MuYwppbmRleCBjNTM1NjZjLi44NDU5MjU3IDEwMDY0NAotLS0gYS9Nb2R1bGVzL3Rlcm1pb3MuYworKysgYi9Nb2R1bGVzL3Rlcm1pb3MuYwpAQCAtNDQsMTQgKzQ0LDE0IEBACiAKIHN0YXRpYyBpbnQgZmRjb252KFB5T2JqZWN0KiBvYmosIHZvaWQqIHApCiB7Ci0JaW50IGZkOworICAgIGludCBmZDsKIAotCWZkID0gUHlPYmplY3RfQXNGaWxlRGVzY3JpcHRvcihvYmopOwotCWlmIChmZCA+PSAwKSB7Ci0JCSooaW50KilwID0gZmQ7Ci0JCXJldHVybiAxOwotCX0KLQlyZXR1cm4gMDsKKyAgICBmZCA9IFB5T2JqZWN0X0FzRmlsZURlc2NyaXB0b3Iob2JqKTsKKyAgICBpZiAoZmQgPj0gMCkgeworICAgICAgICAqKGludCopcCA9IGZkOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIFB5RG9jX1NUUlZBUih0ZXJtaW9zX3RjZ2V0YXR0cl9fZG9jX18sCkBAIC02OCw2NyArNjgsNjcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiB0ZXJtaW9zX3RjZ2V0YXR0cihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IGZkOwotCXN0cnVjdCB0ZXJtaW9zIG1vZGU7Ci0JUHlPYmplY3QgKmNjOwotCXNwZWVkX3QgaXNwZWVkLCBvc3BlZWQ7Ci0JUHlPYmplY3QgKnY7Ci0JaW50IGk7Ci0JY2hhciBjaDsKKyAgICBpbnQgZmQ7CisgICAgc3RydWN0IHRlcm1pb3MgbW9kZTsKKyAgICBQeU9iamVjdCAqY2M7CisgICAgc3BlZWRfdCBpc3BlZWQsIG9zcGVlZDsKKyAgICBQeU9iamVjdCAqdjsKKyAgICBpbnQgaTsKKyAgICBjaGFyIGNoOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJjp0Y2dldGF0dHIiLCAKLQkJCSAgICAgIGZkY29udiwgKHZvaWQqKSZmZCkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyY6dGNnZXRhdHRyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmRjb252LCAodm9pZCopJmZkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAodGNnZXRhdHRyKGZkLCAmbW9kZSkgPT0gLTEpCi0JCXJldHVybiBQeUVycl9TZXRGcm9tRXJybm8oVGVybWlvc0Vycm9yKTsKKyAgICBpZiAodGNnZXRhdHRyKGZkLCAmbW9kZSkgPT0gLTEpCisgICAgICAgIHJldHVybiBQeUVycl9TZXRGcm9tRXJybm8oVGVybWlvc0Vycm9yKTsKIAotCWlzcGVlZCA9IGNmZ2V0aXNwZWVkKCZtb2RlKTsKLQlvc3BlZWQgPSBjZmdldG9zcGVlZCgmbW9kZSk7CisgICAgaXNwZWVkID0gY2ZnZXRpc3BlZWQoJm1vZGUpOworICAgIG9zcGVlZCA9IGNmZ2V0b3NwZWVkKCZtb2RlKTsKIAotCWNjID0gUHlMaXN0X05ldyhOQ0NTKTsKLQlpZiAoY2MgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JZm9yIChpID0gMDsgaSA8IE5DQ1M7IGkrKykgewotCQljaCA9IChjaGFyKW1vZGUuY19jY1tpXTsKLQkJdiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKCZjaCwgMSk7Ci0JCWlmICh2ID09IE5VTEwpCi0JCQlnb3RvIGVycjsKLQkJUHlMaXN0X1NldEl0ZW0oY2MsIGksIHYpOwotCX0KKyAgICBjYyA9IFB5TGlzdF9OZXcoTkNDUyk7CisgICAgaWYgKGNjID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGZvciAoaSA9IDA7IGkgPCBOQ0NTOyBpKyspIHsKKyAgICAgICAgY2ggPSAoY2hhciltb2RlLmNfY2NbaV07CisgICAgICAgIHYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgmY2gsIDEpOworICAgICAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBlcnI7CisgICAgICAgIFB5TGlzdF9TZXRJdGVtKGNjLCBpLCB2KTsKKyAgICB9CiAKLQkvKiBDb252ZXJ0IHRoZSBNSU4gYW5kIFRJTUUgc2xvdHMgdG8gaW50ZWdlci4gIE9uIHNvbWUgc3lzdGVtcywgdGhlCi0JICAgTUlOIGFuZCBUSU1FIHNsb3RzIGFyZSB0aGUgc2FtZSBhcyB0aGUgRU9GIGFuZCBFT0wgc2xvdHMuICBTbyB3ZQotCSAgIG9ubHkgZG8gdGhpcyBpbiBub25jYW5vbmljYWwgaW5wdXQgbW9kZS4gICovCi0JaWYgKChtb2RlLmNfbGZsYWcgJiBJQ0FOT04pID09IDApIHsKLQkJdiA9IFB5SW50X0Zyb21Mb25nKChsb25nKW1vZGUuY19jY1tWTUlOXSk7Ci0JCWlmICh2ID09IE5VTEwpCi0JCQlnb3RvIGVycjsKLQkJUHlMaXN0X1NldEl0ZW0oY2MsIFZNSU4sIHYpOwotCQl2ID0gUHlJbnRfRnJvbUxvbmcoKGxvbmcpbW9kZS5jX2NjW1ZUSU1FXSk7Ci0JCWlmICh2ID09IE5VTEwpCi0JCQlnb3RvIGVycjsKLQkJUHlMaXN0X1NldEl0ZW0oY2MsIFZUSU1FLCB2KTsKLQl9CisgICAgLyogQ29udmVydCB0aGUgTUlOIGFuZCBUSU1FIHNsb3RzIHRvIGludGVnZXIuICBPbiBzb21lIHN5c3RlbXMsIHRoZQorICAgICAgIE1JTiBhbmQgVElNRSBzbG90cyBhcmUgdGhlIHNhbWUgYXMgdGhlIEVPRiBhbmQgRU9MIHNsb3RzLiAgU28gd2UKKyAgICAgICBvbmx5IGRvIHRoaXMgaW4gbm9uY2Fub25pY2FsIGlucHV0IG1vZGUuICAqLworICAgIGlmICgobW9kZS5jX2xmbGFnICYgSUNBTk9OKSA9PSAwKSB7CisgICAgICAgIHYgPSBQeUludF9Gcm9tTG9uZygobG9uZyltb2RlLmNfY2NbVk1JTl0pOworICAgICAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBlcnI7CisgICAgICAgIFB5TGlzdF9TZXRJdGVtKGNjLCBWTUlOLCB2KTsKKyAgICAgICAgdiA9IFB5SW50X0Zyb21Mb25nKChsb25nKW1vZGUuY19jY1tWVElNRV0pOworICAgICAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBlcnI7CisgICAgICAgIFB5TGlzdF9TZXRJdGVtKGNjLCBWVElNRSwgdik7CisgICAgfQogCi0JaWYgKCEodiA9IFB5TGlzdF9OZXcoNykpKQotCQlnb3RvIGVycjsKKyAgICBpZiAoISh2ID0gUHlMaXN0X05ldyg3KSkpCisgICAgICAgIGdvdG8gZXJyOwogCi0JUHlMaXN0X1NldEl0ZW0odiwgMCwgUHlJbnRfRnJvbUxvbmcoKGxvbmcpbW9kZS5jX2lmbGFnKSk7Ci0JUHlMaXN0X1NldEl0ZW0odiwgMSwgUHlJbnRfRnJvbUxvbmcoKGxvbmcpbW9kZS5jX29mbGFnKSk7Ci0JUHlMaXN0X1NldEl0ZW0odiwgMiwgUHlJbnRfRnJvbUxvbmcoKGxvbmcpbW9kZS5jX2NmbGFnKSk7Ci0JUHlMaXN0X1NldEl0ZW0odiwgMywgUHlJbnRfRnJvbUxvbmcoKGxvbmcpbW9kZS5jX2xmbGFnKSk7Ci0JUHlMaXN0X1NldEl0ZW0odiwgNCwgUHlJbnRfRnJvbUxvbmcoKGxvbmcpaXNwZWVkKSk7Ci0JUHlMaXN0X1NldEl0ZW0odiwgNSwgUHlJbnRfRnJvbUxvbmcoKGxvbmcpb3NwZWVkKSk7Ci0JUHlMaXN0X1NldEl0ZW0odiwgNiwgY2MpOwotCWlmIChQeUVycl9PY2N1cnJlZCgpKXsKLQkJUHlfREVDUkVGKHYpOwotCQlnb3RvIGVycjsKLQl9Ci0JcmV0dXJuIHY7CisgICAgUHlMaXN0X1NldEl0ZW0odiwgMCwgUHlJbnRfRnJvbUxvbmcoKGxvbmcpbW9kZS5jX2lmbGFnKSk7CisgICAgUHlMaXN0X1NldEl0ZW0odiwgMSwgUHlJbnRfRnJvbUxvbmcoKGxvbmcpbW9kZS5jX29mbGFnKSk7CisgICAgUHlMaXN0X1NldEl0ZW0odiwgMiwgUHlJbnRfRnJvbUxvbmcoKGxvbmcpbW9kZS5jX2NmbGFnKSk7CisgICAgUHlMaXN0X1NldEl0ZW0odiwgMywgUHlJbnRfRnJvbUxvbmcoKGxvbmcpbW9kZS5jX2xmbGFnKSk7CisgICAgUHlMaXN0X1NldEl0ZW0odiwgNCwgUHlJbnRfRnJvbUxvbmcoKGxvbmcpaXNwZWVkKSk7CisgICAgUHlMaXN0X1NldEl0ZW0odiwgNSwgUHlJbnRfRnJvbUxvbmcoKGxvbmcpb3NwZWVkKSk7CisgICAgUHlMaXN0X1NldEl0ZW0odiwgNiwgY2MpOworICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKXsKKyAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICBnb3RvIGVycjsKKyAgICB9CisgICAgcmV0dXJuIHY7CiAgIGVycjoKLQlQeV9ERUNSRUYoY2MpOwotCXJldHVybiBOVUxMOworICAgIFB5X0RFQ1JFRihjYyk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIFB5RG9jX1NUUlZBUih0ZXJtaW9zX3Rjc2V0YXR0cl9fZG9jX18sCkBAIC0xNDUsNjQgKzE0NSw2NCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHRlcm1pb3NfdGNzZXRhdHRyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgZmQsIHdoZW47Ci0Jc3RydWN0IHRlcm1pb3MgbW9kZTsKLQlzcGVlZF90IGlzcGVlZCwgb3NwZWVkOwotCVB5T2JqZWN0ICp0ZXJtLCAqY2MsICp2OwotCWludCBpOworICAgIGludCBmZCwgd2hlbjsKKyAgICBzdHJ1Y3QgdGVybWlvcyBtb2RlOworICAgIHNwZWVkX3QgaXNwZWVkLCBvc3BlZWQ7CisgICAgUHlPYmplY3QgKnRlcm0sICpjYywgKnY7CisgICAgaW50IGk7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8maU86dGNzZXRhdHRyIiwgCi0JCQkgICAgICBmZGNvbnYsICZmZCwgJndoZW4sICZ0ZXJtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFQeUxpc3RfQ2hlY2sodGVybSkgfHwgUHlMaXN0X1NpemUodGVybSkgIT0gNykgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAKLQkJCSAgICAgInRjc2V0YXR0ciwgYXJnIDM6IG11c3QgYmUgNyBlbGVtZW50IGxpc3QiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyZpTzp0Y3NldGF0dHIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmZGNvbnYsICZmZCwgJndoZW4sICZ0ZXJtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUxpc3RfQ2hlY2sodGVybSkgfHwgUHlMaXN0X1NpemUodGVybSkgIT0gNykgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgInRjc2V0YXR0ciwgYXJnIDM6IG11c3QgYmUgNyBlbGVtZW50IGxpc3QiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JLyogR2V0IHRoZSBvbGQgbW9kZSwgaW4gY2FzZSB0aGVyZSBhcmUgYW55IGhpZGRlbiBmaWVsZHMuLi4gKi8KLQlpZiAodGNnZXRhdHRyKGZkLCAmbW9kZSkgPT0gLTEpCi0JCXJldHVybiBQeUVycl9TZXRGcm9tRXJybm8oVGVybWlvc0Vycm9yKTsKLQltb2RlLmNfaWZsYWcgPSAodGNmbGFnX3QpIFB5SW50X0FzTG9uZyhQeUxpc3RfR2V0SXRlbSh0ZXJtLCAwKSk7Ci0JbW9kZS5jX29mbGFnID0gKHRjZmxhZ190KSBQeUludF9Bc0xvbmcoUHlMaXN0X0dldEl0ZW0odGVybSwgMSkpOwotCW1vZGUuY19jZmxhZyA9ICh0Y2ZsYWdfdCkgUHlJbnRfQXNMb25nKFB5TGlzdF9HZXRJdGVtKHRlcm0sIDIpKTsKLQltb2RlLmNfbGZsYWcgPSAodGNmbGFnX3QpIFB5SW50X0FzTG9uZyhQeUxpc3RfR2V0SXRlbSh0ZXJtLCAzKSk7Ci0JaXNwZWVkID0gKHNwZWVkX3QpIFB5SW50X0FzTG9uZyhQeUxpc3RfR2V0SXRlbSh0ZXJtLCA0KSk7Ci0Jb3NwZWVkID0gKHNwZWVkX3QpIFB5SW50X0FzTG9uZyhQeUxpc3RfR2V0SXRlbSh0ZXJtLCA1KSk7Ci0JY2MgPSBQeUxpc3RfR2V0SXRlbSh0ZXJtLCA2KTsKLQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgLyogR2V0IHRoZSBvbGQgbW9kZSwgaW4gY2FzZSB0aGVyZSBhcmUgYW55IGhpZGRlbiBmaWVsZHMuLi4gKi8KKyAgICBpZiAodGNnZXRhdHRyKGZkLCAmbW9kZSkgPT0gLTEpCisgICAgICAgIHJldHVybiBQeUVycl9TZXRGcm9tRXJybm8oVGVybWlvc0Vycm9yKTsKKyAgICBtb2RlLmNfaWZsYWcgPSAodGNmbGFnX3QpIFB5SW50X0FzTG9uZyhQeUxpc3RfR2V0SXRlbSh0ZXJtLCAwKSk7CisgICAgbW9kZS5jX29mbGFnID0gKHRjZmxhZ190KSBQeUludF9Bc0xvbmcoUHlMaXN0X0dldEl0ZW0odGVybSwgMSkpOworICAgIG1vZGUuY19jZmxhZyA9ICh0Y2ZsYWdfdCkgUHlJbnRfQXNMb25nKFB5TGlzdF9HZXRJdGVtKHRlcm0sIDIpKTsKKyAgICBtb2RlLmNfbGZsYWcgPSAodGNmbGFnX3QpIFB5SW50X0FzTG9uZyhQeUxpc3RfR2V0SXRlbSh0ZXJtLCAzKSk7CisgICAgaXNwZWVkID0gKHNwZWVkX3QpIFB5SW50X0FzTG9uZyhQeUxpc3RfR2V0SXRlbSh0ZXJtLCA0KSk7CisgICAgb3NwZWVkID0gKHNwZWVkX3QpIFB5SW50X0FzTG9uZyhQeUxpc3RfR2V0SXRlbSh0ZXJtLCA1KSk7CisgICAgY2MgPSBQeUxpc3RfR2V0SXRlbSh0ZXJtLCA2KTsKKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoIVB5TGlzdF9DaGVjayhjYykgfHwgUHlMaXN0X1NpemUoY2MpICE9IE5DQ1MpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgCi0JCQkidGNzZXRhdHRyOiBhdHRyaWJ1dGVzWzZdIG11c3QgYmUgJWQgZWxlbWVudCBsaXN0IiwKLQkJCSAgICAgTkNDUyk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoIVB5TGlzdF9DaGVjayhjYykgfHwgUHlMaXN0X1NpemUoY2MpICE9IE5DQ1MpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICJ0Y3NldGF0dHI6IGF0dHJpYnV0ZXNbNl0gbXVzdCBiZSAlZCBlbGVtZW50IGxpc3QiLAorICAgICAgICAgICAgICAgICBOQ0NTKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JZm9yIChpID0gMDsgaSA8IE5DQ1M7IGkrKykgewotCQl2ID0gUHlMaXN0X0dldEl0ZW0oY2MsIGkpOworICAgIGZvciAoaSA9IDA7IGkgPCBOQ0NTOyBpKyspIHsKKyAgICAgICAgdiA9IFB5TGlzdF9HZXRJdGVtKGNjLCBpKTsKIAotCQlpZiAoUHlTdHJpbmdfQ2hlY2sodikgJiYgUHlTdHJpbmdfU2l6ZSh2KSA9PSAxKQotCQkJbW9kZS5jX2NjW2ldID0gKGNjX3QpICogUHlTdHJpbmdfQXNTdHJpbmcodik7Ci0JCWVsc2UgaWYgKFB5SW50X0NoZWNrKHYpKQotCQkJbW9kZS5jX2NjW2ldID0gKGNjX3QpIFB5SW50X0FzTG9uZyh2KTsKLQkJZWxzZSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAKKyAgICAgICAgaWYgKFB5U3RyaW5nX0NoZWNrKHYpICYmIFB5U3RyaW5nX1NpemUodikgPT0gMSkKKyAgICAgICAgICAgIG1vZGUuY19jY1tpXSA9IChjY190KSAqIFB5U3RyaW5nX0FzU3RyaW5nKHYpOworICAgICAgICBlbHNlIGlmIChQeUludF9DaGVjayh2KSkKKyAgICAgICAgICAgIG1vZGUuY19jY1tpXSA9IChjY190KSBQeUludF9Bc0xvbmcodik7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKICAgICAgInRjc2V0YXR0cjogZWxlbWVudHMgb2YgYXR0cmlidXRlcyBtdXN0IGJlIGNoYXJhY3RlcnMgb3IgaW50ZWdlcnMiKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgfQorICAgIH0KIAotCWlmIChjZnNldGlzcGVlZCgmbW9kZSwgKHNwZWVkX3QpIGlzcGVlZCkgPT0gLTEpCi0JCXJldHVybiBQeUVycl9TZXRGcm9tRXJybm8oVGVybWlvc0Vycm9yKTsKLQlpZiAoY2ZzZXRvc3BlZWQoJm1vZGUsIChzcGVlZF90KSBvc3BlZWQpID09IC0xKQotCQlyZXR1cm4gUHlFcnJfU2V0RnJvbUVycm5vKFRlcm1pb3NFcnJvcik7Ci0JaWYgKHRjc2V0YXR0cihmZCwgd2hlbiwgJm1vZGUpID09IC0xKQotCQlyZXR1cm4gUHlFcnJfU2V0RnJvbUVycm5vKFRlcm1pb3NFcnJvcik7CisgICAgaWYgKGNmc2V0aXNwZWVkKCZtb2RlLCAoc3BlZWRfdCkgaXNwZWVkKSA9PSAtMSkKKyAgICAgICAgcmV0dXJuIFB5RXJyX1NldEZyb21FcnJubyhUZXJtaW9zRXJyb3IpOworICAgIGlmIChjZnNldG9zcGVlZCgmbW9kZSwgKHNwZWVkX3QpIG9zcGVlZCkgPT0gLTEpCisgICAgICAgIHJldHVybiBQeUVycl9TZXRGcm9tRXJybm8oVGVybWlvc0Vycm9yKTsKKyAgICBpZiAodGNzZXRhdHRyKGZkLCB3aGVuLCAmbW9kZSkgPT0gLTEpCisgICAgICAgIHJldHVybiBQeUVycl9TZXRGcm9tRXJybm8oVGVybWlvc0Vycm9yKTsKIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIFB5RG9jX1NUUlZBUih0ZXJtaW9zX3Rjc2VuZGJyZWFrX19kb2NfXywKQEAgLTIxNSwxNiArMjE1LDE2IEBACiBzdGF0aWMgUHlPYmplY3QgKgogdGVybWlvc190Y3NlbmRicmVhayhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IGZkLCBkdXJhdGlvbjsKKyAgICBpbnQgZmQsIGR1cmF0aW9uOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJmk6dGNzZW5kYnJlYWsiLCAKLQkJCSAgICAgIGZkY29udiwgJmZkLCAmZHVyYXRpb24pKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAodGNzZW5kYnJlYWsoZmQsIGR1cmF0aW9uKSA9PSAtMSkKLQkJcmV0dXJuIFB5RXJyX1NldEZyb21FcnJubyhUZXJtaW9zRXJyb3IpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyZpOnRjc2VuZGJyZWFrIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmRjb252LCAmZmQsICZkdXJhdGlvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICh0Y3NlbmRicmVhayhmZCwgZHVyYXRpb24pID09IC0xKQorICAgICAgICByZXR1cm4gUHlFcnJfU2V0RnJvbUVycm5vKFRlcm1pb3NFcnJvcik7CiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBQeURvY19TVFJWQVIodGVybWlvc190Y2RyYWluX19kb2NfXywKQEAgLTIzNSwxNiArMjM1LDE2IEBACiBzdGF0aWMgUHlPYmplY3QgKgogdGVybWlvc190Y2RyYWluKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgZmQ7CisgICAgaW50IGZkOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJjp0Y2RyYWluIiwgCi0JCQkgICAgICBmZGNvbnYsICZmZCkpCi0JCXJldHVybiBOVUxMOwotCWlmICh0Y2RyYWluKGZkKSA9PSAtMSkKLQkJcmV0dXJuIFB5RXJyX1NldEZyb21FcnJubyhUZXJtaW9zRXJyb3IpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyY6dGNkcmFpbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZkY29udiwgJmZkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKHRjZHJhaW4oZmQpID09IC0xKQorICAgICAgICByZXR1cm4gUHlFcnJfU2V0RnJvbUVycm5vKFRlcm1pb3NFcnJvcik7CiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBQeURvY19TVFJWQVIodGVybWlvc190Y2ZsdXNoX19kb2NfXywKQEAgLTI1OCwxNiArMjU4LDE2IEBACiBzdGF0aWMgUHlPYmplY3QgKgogdGVybWlvc190Y2ZsdXNoKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgZmQsIHF1ZXVlOworICAgIGludCBmZCwgcXVldWU7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8maTp0Y2ZsdXNoIiwgCi0JCQkgICAgICBmZGNvbnYsICZmZCwgJnF1ZXVlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKHRjZmx1c2goZmQsIHF1ZXVlKSA9PSAtMSkKLQkJcmV0dXJuIFB5RXJyX1NldEZyb21FcnJubyhUZXJtaW9zRXJyb3IpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyZpOnRjZmx1c2giLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmZGNvbnYsICZmZCwgJnF1ZXVlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKHRjZmx1c2goZmQsIHF1ZXVlKSA9PSAtMSkKKyAgICAgICAgcmV0dXJuIFB5RXJyX1NldEZyb21FcnJubyhUZXJtaW9zRXJyb3IpOwogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogUHlEb2NfU1RSVkFSKHRlcm1pb3NfdGNmbG93X19kb2NfXywKQEAgLTI4MSwzMyArMjgxLDMzIEBACiBzdGF0aWMgUHlPYmplY3QgKgogdGVybWlvc190Y2Zsb3coUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBmZCwgYWN0aW9uOworICAgIGludCBmZCwgYWN0aW9uOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJmk6dGNmbG93IiwgCi0JCQkgICAgICBmZGNvbnYsICZmZCwgJmFjdGlvbikpCi0JCXJldHVybiBOVUxMOwotCWlmICh0Y2Zsb3coZmQsIGFjdGlvbikgPT0gLTEpCi0JCXJldHVybiBQeUVycl9TZXRGcm9tRXJybm8oVGVybWlvc0Vycm9yKTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8maTp0Y2Zsb3ciLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmZGNvbnYsICZmZCwgJmFjdGlvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICh0Y2Zsb3coZmQsIGFjdGlvbikgPT0gLTEpCisgICAgICAgIHJldHVybiBQeUVycl9TZXRGcm9tRXJybm8oVGVybWlvc0Vycm9yKTsKIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiB0ZXJtaW9zX21ldGhvZHNbXSA9CiB7Ci0JeyJ0Y2dldGF0dHIiLCB0ZXJtaW9zX3RjZ2V0YXR0ciwgCi0JIE1FVEhfVkFSQVJHUywgdGVybWlvc190Y2dldGF0dHJfX2RvY19ffSwKLQl7InRjc2V0YXR0ciIsIHRlcm1pb3NfdGNzZXRhdHRyLCAKLQkgTUVUSF9WQVJBUkdTLCB0ZXJtaW9zX3Rjc2V0YXR0cl9fZG9jX199LAotCXsidGNzZW5kYnJlYWsiLCB0ZXJtaW9zX3Rjc2VuZGJyZWFrLCAKLQkgTUVUSF9WQVJBUkdTLCB0ZXJtaW9zX3Rjc2VuZGJyZWFrX19kb2NfX30sCi0JeyJ0Y2RyYWluIiwgdGVybWlvc190Y2RyYWluLCAKLQkgTUVUSF9WQVJBUkdTLCB0ZXJtaW9zX3RjZHJhaW5fX2RvY19ffSwKLQl7InRjZmx1c2giLCB0ZXJtaW9zX3RjZmx1c2gsIAotCSBNRVRIX1ZBUkFSR1MsIHRlcm1pb3NfdGNmbHVzaF9fZG9jX199LAotCXsidGNmbG93IiwgdGVybWlvc190Y2Zsb3csIAotCSBNRVRIX1ZBUkFSR1MsIHRlcm1pb3NfdGNmbG93X19kb2NfX30sCi0Je05VTEwsIE5VTEx9CisgICAgeyJ0Y2dldGF0dHIiLCB0ZXJtaW9zX3RjZ2V0YXR0ciwKKyAgICAgTUVUSF9WQVJBUkdTLCB0ZXJtaW9zX3RjZ2V0YXR0cl9fZG9jX199LAorICAgIHsidGNzZXRhdHRyIiwgdGVybWlvc190Y3NldGF0dHIsCisgICAgIE1FVEhfVkFSQVJHUywgdGVybWlvc190Y3NldGF0dHJfX2RvY19ffSwKKyAgICB7InRjc2VuZGJyZWFrIiwgdGVybWlvc190Y3NlbmRicmVhaywKKyAgICAgTUVUSF9WQVJBUkdTLCB0ZXJtaW9zX3Rjc2VuZGJyZWFrX19kb2NfX30sCisgICAgeyJ0Y2RyYWluIiwgdGVybWlvc190Y2RyYWluLAorICAgICBNRVRIX1ZBUkFSR1MsIHRlcm1pb3NfdGNkcmFpbl9fZG9jX199LAorICAgIHsidGNmbHVzaCIsIHRlcm1pb3NfdGNmbHVzaCwKKyAgICAgTUVUSF9WQVJBUkdTLCB0ZXJtaW9zX3RjZmx1c2hfX2RvY19ffSwKKyAgICB7InRjZmxvdyIsIHRlcm1pb3NfdGNmbG93LAorICAgICBNRVRIX1ZBUkFSR1MsIHRlcm1pb3NfdGNmbG93X19kb2NfX30sCisgICAge05VTEwsIE5VTEx9CiB9OwogCiAKQEAgLTMyMCw2MDcgKzMyMCw2MDcgQEAKICNlbmRpZgogCiBzdGF0aWMgc3RydWN0IGNvbnN0YW50IHsKLQljaGFyICpuYW1lOwotCWxvbmcgdmFsdWU7CisgICAgY2hhciAqbmFtZTsKKyAgICBsb25nIHZhbHVlOwogfSB0ZXJtaW9zX2NvbnN0YW50c1tdID0gewotCS8qIGNmZ2V0b3NwZWVkKCksIGNmc2V0b3NwZWVkKCkgY29uc3RhbnRzICovCi0JeyJCMCIsIEIwfSwKLQl7IkI1MCIsIEI1MH0sCi0JeyJCNzUiLCBCNzV9LAotCXsiQjExMCIsIEIxMTB9LAotCXsiQjEzNCIsIEIxMzR9LAotCXsiQjE1MCIsIEIxNTB9LAotCXsiQjIwMCIsIEIyMDB9LAotCXsiQjMwMCIsIEIzMDB9LAotCXsiQjYwMCIsIEI2MDB9LAotCXsiQjEyMDAiLCBCMTIwMH0sCi0JeyJCMTgwMCIsIEIxODAwfSwKLQl7IkIyNDAwIiwgQjI0MDB9LAotCXsiQjQ4MDAiLCBCNDgwMH0sCi0JeyJCOTYwMCIsIEI5NjAwfSwKLQl7IkIxOTIwMCIsIEIxOTIwMH0sCi0JeyJCMzg0MDAiLCBCMzg0MDB9LAorICAgIC8qIGNmZ2V0b3NwZWVkKCksIGNmc2V0b3NwZWVkKCkgY29uc3RhbnRzICovCisgICAgeyJCMCIsIEIwfSwKKyAgICB7IkI1MCIsIEI1MH0sCisgICAgeyJCNzUiLCBCNzV9LAorICAgIHsiQjExMCIsIEIxMTB9LAorICAgIHsiQjEzNCIsIEIxMzR9LAorICAgIHsiQjE1MCIsIEIxNTB9LAorICAgIHsiQjIwMCIsIEIyMDB9LAorICAgIHsiQjMwMCIsIEIzMDB9LAorICAgIHsiQjYwMCIsIEI2MDB9LAorICAgIHsiQjEyMDAiLCBCMTIwMH0sCisgICAgeyJCMTgwMCIsIEIxODAwfSwKKyAgICB7IkIyNDAwIiwgQjI0MDB9LAorICAgIHsiQjQ4MDAiLCBCNDgwMH0sCisgICAgeyJCOTYwMCIsIEI5NjAwfSwKKyAgICB7IkIxOTIwMCIsIEIxOTIwMH0sCisgICAgeyJCMzg0MDAiLCBCMzg0MDB9LAogI2lmZGVmIEI1NzYwMAotCXsiQjU3NjAwIiwgQjU3NjAwfSwKKyAgICB7IkI1NzYwMCIsIEI1NzYwMH0sCiAjZW5kaWYKICNpZmRlZiBCMTE1MjAwCi0JeyJCMTE1MjAwIiwgQjExNTIwMH0sCisgICAgeyJCMTE1MjAwIiwgQjExNTIwMH0sCiAjZW5kaWYKICNpZmRlZiBCMjMwNDAwCi0JeyJCMjMwNDAwIiwgQjIzMDQwMH0sCisgICAgeyJCMjMwNDAwIiwgQjIzMDQwMH0sCiAjZW5kaWYKICNpZmRlZiBDQkFVREVYCi0JeyJDQkFVREVYIiwgQ0JBVURFWH0sCisgICAgeyJDQkFVREVYIiwgQ0JBVURFWH0sCiAjZW5kaWYKIAotCS8qIHRjc2V0YXR0cigpIGNvbnN0YW50cyAqLwotCXsiVENTQU5PVyIsIFRDU0FOT1d9LAotCXsiVENTQURSQUlOIiwgVENTQURSQUlOfSwKLQl7IlRDU0FGTFVTSCIsIFRDU0FGTFVTSH0sCisgICAgLyogdGNzZXRhdHRyKCkgY29uc3RhbnRzICovCisgICAgeyJUQ1NBTk9XIiwgVENTQU5PV30sCisgICAgeyJUQ1NBRFJBSU4iLCBUQ1NBRFJBSU59LAorICAgIHsiVENTQUZMVVNIIiwgVENTQUZMVVNIfSwKIAotCS8qIHRjZmx1c2goKSBjb25zdGFudHMgKi8KLQl7IlRDSUZMVVNIIiwgVENJRkxVU0h9LAotCXsiVENPRkxVU0giLCBUQ09GTFVTSH0sCi0JeyJUQ0lPRkxVU0giLCBUQ0lPRkxVU0h9LAorICAgIC8qIHRjZmx1c2goKSBjb25zdGFudHMgKi8KKyAgICB7IlRDSUZMVVNIIiwgVENJRkxVU0h9LAorICAgIHsiVENPRkxVU0giLCBUQ09GTFVTSH0sCisgICAgeyJUQ0lPRkxVU0giLCBUQ0lPRkxVU0h9LAogCi0JLyogdGNmbG93KCkgY29uc3RhbnRzICovCi0JeyJUQ09PRkYiLCBUQ09PRkZ9LAotCXsiVENPT04iLCBUQ09PTn0sCi0JeyJUQ0lPRkYiLCBUQ0lPRkZ9LAotCXsiVENJT04iLCBUQ0lPTn0sCisgICAgLyogdGNmbG93KCkgY29uc3RhbnRzICovCisgICAgeyJUQ09PRkYiLCBUQ09PRkZ9LAorICAgIHsiVENPT04iLCBUQ09PTn0sCisgICAgeyJUQ0lPRkYiLCBUQ0lPRkZ9LAorICAgIHsiVENJT04iLCBUQ0lPTn0sCiAKLQkvKiBzdHJ1Y3QgdGVybWlvcy5jX2lmbGFnIGNvbnN0YW50cyAqLwotCXsiSUdOQlJLIiwgSUdOQlJLfSwKLQl7IkJSS0lOVCIsIEJSS0lOVH0sCi0JeyJJR05QQVIiLCBJR05QQVJ9LAotCXsiUEFSTVJLIiwgUEFSTVJLfSwKLQl7IklOUENLIiwgSU5QQ0t9LAotCXsiSVNUUklQIiwgSVNUUklQfSwKLQl7IklOTENSIiwgSU5MQ1J9LAotCXsiSUdOQ1IiLCBJR05DUn0sCi0JeyJJQ1JOTCIsIElDUk5MfSwKKyAgICAvKiBzdHJ1Y3QgdGVybWlvcy5jX2lmbGFnIGNvbnN0YW50cyAqLworICAgIHsiSUdOQlJLIiwgSUdOQlJLfSwKKyAgICB7IkJSS0lOVCIsIEJSS0lOVH0sCisgICAgeyJJR05QQVIiLCBJR05QQVJ9LAorICAgIHsiUEFSTVJLIiwgUEFSTVJLfSwKKyAgICB7IklOUENLIiwgSU5QQ0t9LAorICAgIHsiSVNUUklQIiwgSVNUUklQfSwKKyAgICB7IklOTENSIiwgSU5MQ1J9LAorICAgIHsiSUdOQ1IiLCBJR05DUn0sCisgICAgeyJJQ1JOTCIsIElDUk5MfSwKICNpZmRlZiBJVUNMQwotCXsiSVVDTEMiLCBJVUNMQ30sCisgICAgeyJJVUNMQyIsIElVQ0xDfSwKICNlbmRpZgotCXsiSVhPTiIsIElYT059LAotCXsiSVhBTlkiLCBJWEFOWX0sCi0JeyJJWE9GRiIsIElYT0ZGfSwKKyAgICB7IklYT04iLCBJWE9OfSwKKyAgICB7IklYQU5ZIiwgSVhBTll9LAorICAgIHsiSVhPRkYiLCBJWE9GRn0sCiAjaWZkZWYgSU1BWEJFTAotCXsiSU1BWEJFTCIsIElNQVhCRUx9LAorICAgIHsiSU1BWEJFTCIsIElNQVhCRUx9LAogI2VuZGlmCiAKLQkvKiBzdHJ1Y3QgdGVybWlvcy5jX29mbGFnIGNvbnN0YW50cyAqLwotCXsiT1BPU1QiLCBPUE9TVH0sCisgICAgLyogc3RydWN0IHRlcm1pb3MuY19vZmxhZyBjb25zdGFudHMgKi8KKyAgICB7Ik9QT1NUIiwgT1BPU1R9LAogI2lmZGVmIE9MQ1VDCi0JeyJPTENVQyIsIE9MQ1VDfSwKKyAgICB7Ik9MQ1VDIiwgT0xDVUN9LAogI2VuZGlmCiAjaWZkZWYgT05MQ1IKLQl7Ik9OTENSIiwgT05MQ1J9LAorICAgIHsiT05MQ1IiLCBPTkxDUn0sCiAjZW5kaWYKICNpZmRlZiBPQ1JOTAotCXsiT0NSTkwiLCBPQ1JOTH0sCisgICAgeyJPQ1JOTCIsIE9DUk5MfSwKICNlbmRpZgogI2lmZGVmIE9OT0NSCi0JeyJPTk9DUiIsIE9OT0NSfSwKKyAgICB7Ik9OT0NSIiwgT05PQ1J9LAogI2VuZGlmCiAjaWZkZWYgT05MUkVUCi0JeyJPTkxSRVQiLCBPTkxSRVR9LAorICAgIHsiT05MUkVUIiwgT05MUkVUfSwKICNlbmRpZgogI2lmZGVmIE9GSUxMCi0JeyJPRklMTCIsIE9GSUxMfSwKKyAgICB7Ik9GSUxMIiwgT0ZJTEx9LAogI2VuZGlmCiAjaWZkZWYgT0ZERUwKLQl7Ik9GREVMIiwgT0ZERUx9LAorICAgIHsiT0ZERUwiLCBPRkRFTH0sCiAjZW5kaWYKICNpZmRlZiBOTERMWQotCXsiTkxETFkiLCBOTERMWX0sCisgICAgeyJOTERMWSIsIE5MRExZfSwKICNlbmRpZgogI2lmZGVmIENSRExZCi0JeyJDUkRMWSIsIENSRExZfSwKKyAgICB7IkNSRExZIiwgQ1JETFl9LAogI2VuZGlmCiAjaWZkZWYgVEFCRExZCi0JeyJUQUJETFkiLCBUQUJETFl9LAorICAgIHsiVEFCRExZIiwgVEFCRExZfSwKICNlbmRpZgogI2lmZGVmIEJTRExZCi0JeyJCU0RMWSIsIEJTRExZfSwKKyAgICB7IkJTRExZIiwgQlNETFl9LAogI2VuZGlmCiAjaWZkZWYgVlRETFkKLQl7IlZURExZIiwgVlRETFl9LAorICAgIHsiVlRETFkiLCBWVERMWX0sCiAjZW5kaWYKICNpZmRlZiBGRkRMWQotCXsiRkZETFkiLCBGRkRMWX0sCisgICAgeyJGRkRMWSIsIEZGRExZfSwKICNlbmRpZgogCi0JLyogc3RydWN0IHRlcm1pb3MuY19vZmxhZy1yZWxhdGVkIHZhbHVlcyAoZGVsYXkgbWFzaykgKi8KKyAgICAvKiBzdHJ1Y3QgdGVybWlvcy5jX29mbGFnLXJlbGF0ZWQgdmFsdWVzIChkZWxheSBtYXNrKSAqLwogI2lmZGVmIE5MMAotCXsiTkwwIiwgTkwwfSwKKyAgICB7Ik5MMCIsIE5MMH0sCiAjZW5kaWYKICNpZmRlZiBOTDEKLQl7Ik5MMSIsIE5MMX0sCisgICAgeyJOTDEiLCBOTDF9LAogI2VuZGlmCiAjaWZkZWYgQ1IwCi0JeyJDUjAiLCBDUjB9LAorICAgIHsiQ1IwIiwgQ1IwfSwKICNlbmRpZgogI2lmZGVmIENSMQotCXsiQ1IxIiwgQ1IxfSwKKyAgICB7IkNSMSIsIENSMX0sCiAjZW5kaWYKICNpZmRlZiBDUjIKLQl7IkNSMiIsIENSMn0sCisgICAgeyJDUjIiLCBDUjJ9LAogI2VuZGlmCiAjaWZkZWYgQ1IzCi0JeyJDUjMiLCBDUjN9LAorICAgIHsiQ1IzIiwgQ1IzfSwKICNlbmRpZgogI2lmZGVmIFRBQjAKLQl7IlRBQjAiLCBUQUIwfSwKKyAgICB7IlRBQjAiLCBUQUIwfSwKICNlbmRpZgogI2lmZGVmIFRBQjEKLQl7IlRBQjEiLCBUQUIxfSwKKyAgICB7IlRBQjEiLCBUQUIxfSwKICNlbmRpZgogI2lmZGVmIFRBQjIKLQl7IlRBQjIiLCBUQUIyfSwKKyAgICB7IlRBQjIiLCBUQUIyfSwKICNlbmRpZgogI2lmZGVmIFRBQjMKLQl7IlRBQjMiLCBUQUIzfSwKKyAgICB7IlRBQjMiLCBUQUIzfSwKICNlbmRpZgogI2lmZGVmIFhUQUJTCi0JeyJYVEFCUyIsIFhUQUJTfSwKKyAgICB7IlhUQUJTIiwgWFRBQlN9LAogI2VuZGlmCiAjaWZkZWYgQlMwCi0JeyJCUzAiLCBCUzB9LAorICAgIHsiQlMwIiwgQlMwfSwKICNlbmRpZgogI2lmZGVmIEJTMQotCXsiQlMxIiwgQlMxfSwKKyAgICB7IkJTMSIsIEJTMX0sCiAjZW5kaWYKICNpZmRlZiBWVDAKLQl7IlZUMCIsIFZUMH0sCisgICAgeyJWVDAiLCBWVDB9LAogI2VuZGlmCiAjaWZkZWYgVlQxCi0JeyJWVDEiLCBWVDF9LAorICAgIHsiVlQxIiwgVlQxfSwKICNlbmRpZgogI2lmZGVmIEZGMAotCXsiRkYwIiwgRkYwfSwKKyAgICB7IkZGMCIsIEZGMH0sCiAjZW5kaWYKICNpZmRlZiBGRjEKLQl7IkZGMSIsIEZGMX0sCisgICAgeyJGRjEiLCBGRjF9LAogI2VuZGlmCiAKLQkvKiBzdHJ1Y3QgdGVybWlvcy5jX2NmbGFnIGNvbnN0YW50cyAqLwotCXsiQ1NJWkUiLCBDU0laRX0sCi0JeyJDU1RPUEIiLCBDU1RPUEJ9LAotCXsiQ1JFQUQiLCBDUkVBRH0sCi0JeyJQQVJFTkIiLCBQQVJFTkJ9LAotCXsiUEFST0REIiwgUEFST0REfSwKLQl7IkhVUENMIiwgSFVQQ0x9LAotCXsiQ0xPQ0FMIiwgQ0xPQ0FMfSwKKyAgICAvKiBzdHJ1Y3QgdGVybWlvcy5jX2NmbGFnIGNvbnN0YW50cyAqLworICAgIHsiQ1NJWkUiLCBDU0laRX0sCisgICAgeyJDU1RPUEIiLCBDU1RPUEJ9LAorICAgIHsiQ1JFQUQiLCBDUkVBRH0sCisgICAgeyJQQVJFTkIiLCBQQVJFTkJ9LAorICAgIHsiUEFST0REIiwgUEFST0REfSwKKyAgICB7IkhVUENMIiwgSFVQQ0x9LAorICAgIHsiQ0xPQ0FMIiwgQ0xPQ0FMfSwKICNpZmRlZiBDSUJBVUQKLQl7IkNJQkFVRCIsIENJQkFVRH0sCisgICAgeyJDSUJBVUQiLCBDSUJBVUR9LAogI2VuZGlmCiAjaWZkZWYgQ1JUU0NUUwotCXsiQ1JUU0NUUyIsIChsb25nKUNSVFNDVFN9LAorICAgIHsiQ1JUU0NUUyIsIChsb25nKUNSVFNDVFN9LAogI2VuZGlmCiAKLQkvKiBzdHJ1Y3QgdGVybWlvcy5jX2NmbGFnLXJlbGF0ZWQgdmFsdWVzIChjaGFyYWN0ZXIgc2l6ZSkgKi8KLQl7IkNTNSIsIENTNX0sCi0JeyJDUzYiLCBDUzZ9LAotCXsiQ1M3IiwgQ1M3fSwKLQl7IkNTOCIsIENTOH0sCisgICAgLyogc3RydWN0IHRlcm1pb3MuY19jZmxhZy1yZWxhdGVkIHZhbHVlcyAoY2hhcmFjdGVyIHNpemUpICovCisgICAgeyJDUzUiLCBDUzV9LAorICAgIHsiQ1M2IiwgQ1M2fSwKKyAgICB7IkNTNyIsIENTN30sCisgICAgeyJDUzgiLCBDUzh9LAogCi0JLyogc3RydWN0IHRlcm1pb3MuY19sZmxhZyBjb25zdGFudHMgKi8KLQl7IklTSUciLCBJU0lHfSwKLQl7IklDQU5PTiIsIElDQU5PTn0sCisgICAgLyogc3RydWN0IHRlcm1pb3MuY19sZmxhZyBjb25zdGFudHMgKi8KKyAgICB7IklTSUciLCBJU0lHfSwKKyAgICB7IklDQU5PTiIsIElDQU5PTn0sCiAjaWZkZWYgWENBU0UKLQl7IlhDQVNFIiwgWENBU0V9LAorICAgIHsiWENBU0UiLCBYQ0FTRX0sCiAjZW5kaWYKLQl7IkVDSE8iLCBFQ0hPfSwKLQl7IkVDSE9FIiwgRUNIT0V9LAotCXsiRUNIT0siLCBFQ0hPS30sCi0JeyJFQ0hPTkwiLCBFQ0hPTkx9LAorICAgIHsiRUNITyIsIEVDSE99LAorICAgIHsiRUNIT0UiLCBFQ0hPRX0sCisgICAgeyJFQ0hPSyIsIEVDSE9LfSwKKyAgICB7IkVDSE9OTCIsIEVDSE9OTH0sCiAjaWZkZWYgRUNIT0NUTAotCXsiRUNIT0NUTCIsIEVDSE9DVEx9LAorICAgIHsiRUNIT0NUTCIsIEVDSE9DVEx9LAogI2VuZGlmCiAjaWZkZWYgRUNIT1BSVAotCXsiRUNIT1BSVCIsIEVDSE9QUlR9LAorICAgIHsiRUNIT1BSVCIsIEVDSE9QUlR9LAogI2VuZGlmCiAjaWZkZWYgRUNIT0tFCi0JeyJFQ0hPS0UiLCBFQ0hPS0V9LAorICAgIHsiRUNIT0tFIiwgRUNIT0tFfSwKICNlbmRpZgogI2lmZGVmIEZMVVNITwotCXsiRkxVU0hPIiwgRkxVU0hPfSwKKyAgICB7IkZMVVNITyIsIEZMVVNIT30sCiAjZW5kaWYKLQl7Ik5PRkxTSCIsIE5PRkxTSH0sCi0JeyJUT1NUT1AiLCBUT1NUT1B9LAorICAgIHsiTk9GTFNIIiwgTk9GTFNIfSwKKyAgICB7IlRPU1RPUCIsIFRPU1RPUH0sCiAjaWZkZWYgUEVORElOCi0JeyJQRU5ESU4iLCBQRU5ESU59LAorICAgIHsiUEVORElOIiwgUEVORElOfSwKICNlbmRpZgotCXsiSUVYVEVOIiwgSUVYVEVOfSwKKyAgICB7IklFWFRFTiIsIElFWFRFTn0sCiAKLQkvKiBpbmRleGVzIGludG8gdGhlIGNvbnRyb2wgY2hhcnMgYXJyYXkgcmV0dXJuZWQgYnkgdGNnZXRhdHRyKCkgKi8KLQl7IlZJTlRSIiwgVklOVFJ9LAotCXsiVlFVSVQiLCBWUVVJVH0sCi0JeyJWRVJBU0UiLCBWRVJBU0V9LAotCXsiVktJTEwiLCBWS0lMTH0sCi0JeyJWRU9GIiwgVkVPRn0sCi0JeyJWVElNRSIsIFZUSU1FfSwKLQl7IlZNSU4iLCBWTUlOfSwKKyAgICAvKiBpbmRleGVzIGludG8gdGhlIGNvbnRyb2wgY2hhcnMgYXJyYXkgcmV0dXJuZWQgYnkgdGNnZXRhdHRyKCkgKi8KKyAgICB7IlZJTlRSIiwgVklOVFJ9LAorICAgIHsiVlFVSVQiLCBWUVVJVH0sCisgICAgeyJWRVJBU0UiLCBWRVJBU0V9LAorICAgIHsiVktJTEwiLCBWS0lMTH0sCisgICAgeyJWRU9GIiwgVkVPRn0sCisgICAgeyJWVElNRSIsIFZUSU1FfSwKKyAgICB7IlZNSU4iLCBWTUlOfSwKICNpZmRlZiBWU1dUQwotCS8qIFRoZSAjZGVmaW5lcyBhYm92ZSBlbnN1cmUgdGhhdCBpZiBlaXRoZXIgaXMgZGVmaW5lZCwgYm90aCBhcmUsCi0gICAgICAgICAqIGJ1dCBib3RoIG1heSBiZSBvbWl0dGVkIGJ5IHRoZSBzeXN0ZW0gaGVhZGVycy4gIDstKCAgKi8KLQl7IlZTV1RDIiwgVlNXVEN9LAotCXsiVlNXVENIIiwgVlNXVENIfSwKKyAgICAvKiBUaGUgI2RlZmluZXMgYWJvdmUgZW5zdXJlIHRoYXQgaWYgZWl0aGVyIGlzIGRlZmluZWQsIGJvdGggYXJlLAorICAgICAqIGJ1dCBib3RoIG1heSBiZSBvbWl0dGVkIGJ5IHRoZSBzeXN0ZW0gaGVhZGVycy4gIDstKCAgKi8KKyAgICB7IlZTV1RDIiwgVlNXVEN9LAorICAgIHsiVlNXVENIIiwgVlNXVENIfSwKICNlbmRpZgotCXsiVlNUQVJUIiwgVlNUQVJUfSwKLQl7IlZTVE9QIiwgVlNUT1B9LAotCXsiVlNVU1AiLCBWU1VTUH0sCi0JeyJWRU9MIiwgVkVPTH0sCisgICAgeyJWU1RBUlQiLCBWU1RBUlR9LAorICAgIHsiVlNUT1AiLCBWU1RPUH0sCisgICAgeyJWU1VTUCIsIFZTVVNQfSwKKyAgICB7IlZFT0wiLCBWRU9MfSwKICNpZmRlZiBWUkVQUklOVAotCXsiVlJFUFJJTlQiLCBWUkVQUklOVH0sCisgICAgeyJWUkVQUklOVCIsIFZSRVBSSU5UfSwKICNlbmRpZgogI2lmZGVmIFZESVNDQVJECi0JeyJWRElTQ0FSRCIsIFZESVNDQVJEfSwKKyAgICB7IlZESVNDQVJEIiwgVkRJU0NBUkR9LAogI2VuZGlmCiAjaWZkZWYgVldFUkFTRQotCXsiVldFUkFTRSIsIFZXRVJBU0V9LAorICAgIHsiVldFUkFTRSIsIFZXRVJBU0V9LAogI2VuZGlmCiAjaWZkZWYgVkxORVhUCi0JeyJWTE5FWFQiLCBWTE5FWFR9LAorICAgIHsiVkxORVhUIiwgVkxORVhUfSwKICNlbmRpZgogI2lmZGVmIFZFT0wyCi0JeyJWRU9MMiIsIFZFT0wyfSwKKyAgICB7IlZFT0wyIiwgVkVPTDJ9LAogI2VuZGlmCiAKIAogI2lmZGVmIEI0NjA4MDAKLQl7IkI0NjA4MDAiLCBCNDYwODAwfSwKKyAgICB7IkI0NjA4MDAiLCBCNDYwODAwfSwKICNlbmRpZgogI2lmZGVmIENCQVVECi0JeyJDQkFVRCIsIENCQVVEfSwKKyAgICB7IkNCQVVEIiwgQ0JBVUR9LAogI2VuZGlmCiAjaWZkZWYgQ0RFTAotCXsiQ0RFTCIsIENERUx9LAorICAgIHsiQ0RFTCIsIENERUx9LAogI2VuZGlmCiAjaWZkZWYgQ0RTVVNQCi0JeyJDRFNVU1AiLCBDRFNVU1B9LAorICAgIHsiQ0RTVVNQIiwgQ0RTVVNQfSwKICNlbmRpZgogI2lmZGVmIENFT0YKLQl7IkNFT0YiLCBDRU9GfSwKKyAgICB7IkNFT0YiLCBDRU9GfSwKICNlbmRpZgogI2lmZGVmIENFT0wKLQl7IkNFT0wiLCBDRU9MfSwKKyAgICB7IkNFT0wiLCBDRU9MfSwKICNlbmRpZgogI2lmZGVmIENFT0wyCi0JeyJDRU9MMiIsIENFT0wyfSwKKyAgICB7IkNFT0wyIiwgQ0VPTDJ9LAogI2VuZGlmCiAjaWZkZWYgQ0VPVAotCXsiQ0VPVCIsIENFT1R9LAorICAgIHsiQ0VPVCIsIENFT1R9LAogI2VuZGlmCiAjaWZkZWYgQ0VSQVNFCi0JeyJDRVJBU0UiLCBDRVJBU0V9LAorICAgIHsiQ0VSQVNFIiwgQ0VSQVNFfSwKICNlbmRpZgogI2lmZGVmIENFU0MKLQl7IkNFU0MiLCBDRVNDfSwKKyAgICB7IkNFU0MiLCBDRVNDfSwKICNlbmRpZgogI2lmZGVmIENGTFVTSAotCXsiQ0ZMVVNIIiwgQ0ZMVVNIfSwKKyAgICB7IkNGTFVTSCIsIENGTFVTSH0sCiAjZW5kaWYKICNpZmRlZiBDSU5UUgotCXsiQ0lOVFIiLCBDSU5UUn0sCisgICAgeyJDSU5UUiIsIENJTlRSfSwKICNlbmRpZgogI2lmZGVmIENLSUxMCi0JeyJDS0lMTCIsIENLSUxMfSwKKyAgICB7IkNLSUxMIiwgQ0tJTEx9LAogI2VuZGlmCiAjaWZkZWYgQ0xORVhUCi0JeyJDTE5FWFQiLCBDTE5FWFR9LAorICAgIHsiQ0xORVhUIiwgQ0xORVhUfSwKICNlbmRpZgogI2lmZGVmIENOVUwKLQl7IkNOVUwiLCBDTlVMfSwKKyAgICB7IkNOVUwiLCBDTlVMfSwKICNlbmRpZgogI2lmZGVmIENPTU1PTgotCXsiQ09NTU9OIiwgQ09NTU9OfSwKKyAgICB7IkNPTU1PTiIsIENPTU1PTn0sCiAjZW5kaWYKICNpZmRlZiBDUVVJVAotCXsiQ1FVSVQiLCBDUVVJVH0sCisgICAgeyJDUVVJVCIsIENRVUlUfSwKICNlbmRpZgogI2lmZGVmIENSUFJOVAotCXsiQ1JQUk5UIiwgQ1JQUk5UfSwKKyAgICB7IkNSUFJOVCIsIENSUFJOVH0sCiAjZW5kaWYKICNpZmRlZiBDU1RBUlQKLQl7IkNTVEFSVCIsIENTVEFSVH0sCisgICAgeyJDU1RBUlQiLCBDU1RBUlR9LAogI2VuZGlmCiAjaWZkZWYgQ1NUT1AKLQl7IkNTVE9QIiwgQ1NUT1B9LAorICAgIHsiQ1NUT1AiLCBDU1RPUH0sCiAjZW5kaWYKICNpZmRlZiBDU1VTUAotCXsiQ1NVU1AiLCBDU1VTUH0sCisgICAgeyJDU1VTUCIsIENTVVNQfSwKICNlbmRpZgogI2lmZGVmIENTV1RDSAotCXsiQ1NXVENIIiwgQ1NXVENIfSwKKyAgICB7IkNTV1RDSCIsIENTV1RDSH0sCiAjZW5kaWYKICNpZmRlZiBDV0VSQVNFCi0JeyJDV0VSQVNFIiwgQ1dFUkFTRX0sCisgICAgeyJDV0VSQVNFIiwgQ1dFUkFTRX0sCiAjZW5kaWYKICNpZmRlZiBFWFRBCi0JeyJFWFRBIiwgRVhUQX0sCisgICAgeyJFWFRBIiwgRVhUQX0sCiAjZW5kaWYKICNpZmRlZiBFWFRCCi0JeyJFWFRCIiwgRVhUQn0sCisgICAgeyJFWFRCIiwgRVhUQn0sCiAjZW5kaWYKICNpZmRlZiBGSU9BU1lOQwotCXsiRklPQVNZTkMiLCBGSU9BU1lOQ30sCisgICAgeyJGSU9BU1lOQyIsIEZJT0FTWU5DfSwKICNlbmRpZgogI2lmZGVmIEZJT0NMRVgKLQl7IkZJT0NMRVgiLCBGSU9DTEVYfSwKKyAgICB7IkZJT0NMRVgiLCBGSU9DTEVYfSwKICNlbmRpZgogI2lmZGVmIEZJT05CSU8KLQl7IkZJT05CSU8iLCBGSU9OQklPfSwKKyAgICB7IkZJT05CSU8iLCBGSU9OQklPfSwKICNlbmRpZgogI2lmZGVmIEZJT05DTEVYCi0JeyJGSU9OQ0xFWCIsIEZJT05DTEVYfSwKKyAgICB7IkZJT05DTEVYIiwgRklPTkNMRVh9LAogI2VuZGlmCiAjaWZkZWYgRklPTlJFQUQKLQl7IkZJT05SRUFEIiwgRklPTlJFQUR9LAorICAgIHsiRklPTlJFQUQiLCBGSU9OUkVBRH0sCiAjZW5kaWYKICNpZmRlZiBJQlNISUZUCi0JeyJJQlNISUZUIiwgSUJTSElGVH0sCisgICAgeyJJQlNISUZUIiwgSUJTSElGVH0sCiAjZW5kaWYKICNpZmRlZiBJTklUX0NfQ0MKLQl7IklOSVRfQ19DQyIsIElOSVRfQ19DQ30sCisgICAgeyJJTklUX0NfQ0MiLCBJTklUX0NfQ0N9LAogI2VuZGlmCiAjaWZkZWYgSU9DU0laRV9NQVNLCi0JeyJJT0NTSVpFX01BU0siLCBJT0NTSVpFX01BU0t9LAorICAgIHsiSU9DU0laRV9NQVNLIiwgSU9DU0laRV9NQVNLfSwKICNlbmRpZgogI2lmZGVmIElPQ1NJWkVfU0hJRlQKLQl7IklPQ1NJWkVfU0hJRlQiLCBJT0NTSVpFX1NISUZUfSwKKyAgICB7IklPQ1NJWkVfU0hJRlQiLCBJT0NTSVpFX1NISUZUfSwKICNlbmRpZgogI2lmZGVmIE5DQwotCXsiTkNDIiwgTkNDfSwKKyAgICB7Ik5DQyIsIE5DQ30sCiAjZW5kaWYKICNpZmRlZiBOQ0NTCi0JeyJOQ0NTIiwgTkNDU30sCisgICAgeyJOQ0NTIiwgTkNDU30sCiAjZW5kaWYKICNpZmRlZiBOU1dUQ0gKLQl7Ik5TV1RDSCIsIE5TV1RDSH0sCisgICAgeyJOU1dUQ0giLCBOU1dUQ0h9LAogI2VuZGlmCiAjaWZkZWYgTl9NT1VTRQotCXsiTl9NT1VTRSIsIE5fTU9VU0V9LAorICAgIHsiTl9NT1VTRSIsIE5fTU9VU0V9LAogI2VuZGlmCiAjaWZkZWYgTl9QUFAKLQl7Ik5fUFBQIiwgTl9QUFB9LAorICAgIHsiTl9QUFAiLCBOX1BQUH0sCiAjZW5kaWYKICNpZmRlZiBOX1NMSVAKLQl7Ik5fU0xJUCIsIE5fU0xJUH0sCisgICAgeyJOX1NMSVAiLCBOX1NMSVB9LAogI2VuZGlmCiAjaWZkZWYgTl9TVFJJUAotCXsiTl9TVFJJUCIsIE5fU1RSSVB9LAorICAgIHsiTl9TVFJJUCIsIE5fU1RSSVB9LAogI2VuZGlmCiAjaWZkZWYgTl9UVFkKLQl7Ik5fVFRZIiwgTl9UVFl9LAorICAgIHsiTl9UVFkiLCBOX1RUWX0sCiAjZW5kaWYKICNpZmRlZiBUQ0ZMU0gKLQl7IlRDRkxTSCIsIFRDRkxTSH0sCisgICAgeyJUQ0ZMU0giLCBUQ0ZMU0h9LAogI2VuZGlmCiAjaWZkZWYgVENHRVRBCi0JeyJUQ0dFVEEiLCBUQ0dFVEF9LAorICAgIHsiVENHRVRBIiwgVENHRVRBfSwKICNlbmRpZgogI2lmZGVmIFRDR0VUUwotCXsiVENHRVRTIiwgVENHRVRTfSwKKyAgICB7IlRDR0VUUyIsIFRDR0VUU30sCiAjZW5kaWYKICNpZmRlZiBUQ1NCUksKLQl7IlRDU0JSSyIsIFRDU0JSS30sCisgICAgeyJUQ1NCUksiLCBUQ1NCUkt9LAogI2VuZGlmCiAjaWZkZWYgVENTQlJLUAotCXsiVENTQlJLUCIsIFRDU0JSS1B9LAorICAgIHsiVENTQlJLUCIsIFRDU0JSS1B9LAogI2VuZGlmCiAjaWZkZWYgVENTRVRBCi0JeyJUQ1NFVEEiLCBUQ1NFVEF9LAorICAgIHsiVENTRVRBIiwgVENTRVRBfSwKICNlbmRpZgogI2lmZGVmIFRDU0VUQUYKLQl7IlRDU0VUQUYiLCBUQ1NFVEFGfSwKKyAgICB7IlRDU0VUQUYiLCBUQ1NFVEFGfSwKICNlbmRpZgogI2lmZGVmIFRDU0VUQVcKLQl7IlRDU0VUQVciLCBUQ1NFVEFXfSwKKyAgICB7IlRDU0VUQVciLCBUQ1NFVEFXfSwKICNlbmRpZgogI2lmZGVmIFRDU0VUUwotCXsiVENTRVRTIiwgVENTRVRTfSwKKyAgICB7IlRDU0VUUyIsIFRDU0VUU30sCiAjZW5kaWYKICNpZmRlZiBUQ1NFVFNGCi0JeyJUQ1NFVFNGIiwgVENTRVRTRn0sCisgICAgeyJUQ1NFVFNGIiwgVENTRVRTRn0sCiAjZW5kaWYKICNpZmRlZiBUQ1NFVFNXCi0JeyJUQ1NFVFNXIiwgVENTRVRTV30sCisgICAgeyJUQ1NFVFNXIiwgVENTRVRTV30sCiAjZW5kaWYKICNpZmRlZiBUQ1hPTkMKLQl7IlRDWE9OQyIsIFRDWE9OQ30sCisgICAgeyJUQ1hPTkMiLCBUQ1hPTkN9LAogI2VuZGlmCiAjaWZkZWYgVElPQ0NPTlMKLQl7IlRJT0NDT05TIiwgVElPQ0NPTlN9LAorICAgIHsiVElPQ0NPTlMiLCBUSU9DQ09OU30sCiAjZW5kaWYKICNpZmRlZiBUSU9DRVhDTAotCXsiVElPQ0VYQ0wiLCBUSU9DRVhDTH0sCisgICAgeyJUSU9DRVhDTCIsIFRJT0NFWENMfSwKICNlbmRpZgogI2lmZGVmIFRJT0NHRVRECi0JeyJUSU9DR0VURCIsIFRJT0NHRVREfSwKKyAgICB7IlRJT0NHRVREIiwgVElPQ0dFVER9LAogI2VuZGlmCiAjaWZkZWYgVElPQ0dJQ09VTlQKLQl7IlRJT0NHSUNPVU5UIiwgVElPQ0dJQ09VTlR9LAorICAgIHsiVElPQ0dJQ09VTlQiLCBUSU9DR0lDT1VOVH0sCiAjZW5kaWYKICNpZmRlZiBUSU9DR0xDS1RSTUlPUwotCXsiVElPQ0dMQ0tUUk1JT1MiLCBUSU9DR0xDS1RSTUlPU30sCisgICAgeyJUSU9DR0xDS1RSTUlPUyIsIFRJT0NHTENLVFJNSU9TfSwKICNlbmRpZgogI2lmZGVmIFRJT0NHUEdSUAotCXsiVElPQ0dQR1JQIiwgVElPQ0dQR1JQfSwKKyAgICB7IlRJT0NHUEdSUCIsIFRJT0NHUEdSUH0sCiAjZW5kaWYKICNpZmRlZiBUSU9DR1NFUklBTAotCXsiVElPQ0dTRVJJQUwiLCBUSU9DR1NFUklBTH0sCisgICAgeyJUSU9DR1NFUklBTCIsIFRJT0NHU0VSSUFMfSwKICNlbmRpZgogI2lmZGVmIFRJT0NHU09GVENBUgotCXsiVElPQ0dTT0ZUQ0FSIiwgVElPQ0dTT0ZUQ0FSfSwKKyAgICB7IlRJT0NHU09GVENBUiIsIFRJT0NHU09GVENBUn0sCiAjZW5kaWYKICNpZmRlZiBUSU9DR1dJTlNaCi0JeyJUSU9DR1dJTlNaIiwgVElPQ0dXSU5TWn0sCisgICAgeyJUSU9DR1dJTlNaIiwgVElPQ0dXSU5TWn0sCiAjZW5kaWYKICNpZmRlZiBUSU9DSU5RCi0JeyJUSU9DSU5RIiwgVElPQ0lOUX0sCisgICAgeyJUSU9DSU5RIiwgVElPQ0lOUX0sCiAjZW5kaWYKICNpZmRlZiBUSU9DTElOVVgKLQl7IlRJT0NMSU5VWCIsIFRJT0NMSU5VWH0sCisgICAgeyJUSU9DTElOVVgiLCBUSU9DTElOVVh9LAogI2VuZGlmCiAjaWZkZWYgVElPQ01CSUMKLQl7IlRJT0NNQklDIiwgVElPQ01CSUN9LAorICAgIHsiVElPQ01CSUMiLCBUSU9DTUJJQ30sCiAjZW5kaWYKICNpZmRlZiBUSU9DTUJJUwotCXsiVElPQ01CSVMiLCBUSU9DTUJJU30sCisgICAgeyJUSU9DTUJJUyIsIFRJT0NNQklTfSwKICNlbmRpZgogI2lmZGVmIFRJT0NNR0VUCi0JeyJUSU9DTUdFVCIsIFRJT0NNR0VUfSwKKyAgICB7IlRJT0NNR0VUIiwgVElPQ01HRVR9LAogI2VuZGlmCiAjaWZkZWYgVElPQ01JV0FJVAotCXsiVElPQ01JV0FJVCIsIFRJT0NNSVdBSVR9LAorICAgIHsiVElPQ01JV0FJVCIsIFRJT0NNSVdBSVR9LAogI2VuZGlmCiAjaWZkZWYgVElPQ01TRVQKLQl7IlRJT0NNU0VUIiwgVElPQ01TRVR9LAorICAgIHsiVElPQ01TRVQiLCBUSU9DTVNFVH0sCiAjZW5kaWYKICNpZmRlZiBUSU9DTV9DQVIKLQl7IlRJT0NNX0NBUiIsIFRJT0NNX0NBUn0sCisgICAgeyJUSU9DTV9DQVIiLCBUSU9DTV9DQVJ9LAogI2VuZGlmCiAjaWZkZWYgVElPQ01fQ0QKLQl7IlRJT0NNX0NEIiwgVElPQ01fQ0R9LAorICAgIHsiVElPQ01fQ0QiLCBUSU9DTV9DRH0sCiAjZW5kaWYKICNpZmRlZiBUSU9DTV9DVFMKLQl7IlRJT0NNX0NUUyIsIFRJT0NNX0NUU30sCisgICAgeyJUSU9DTV9DVFMiLCBUSU9DTV9DVFN9LAogI2VuZGlmCiAjaWZkZWYgVElPQ01fRFNSCi0JeyJUSU9DTV9EU1IiLCBUSU9DTV9EU1J9LAorICAgIHsiVElPQ01fRFNSIiwgVElPQ01fRFNSfSwKICNlbmRpZgogI2lmZGVmIFRJT0NNX0RUUgotCXsiVElPQ01fRFRSIiwgVElPQ01fRFRSfSwKKyAgICB7IlRJT0NNX0RUUiIsIFRJT0NNX0RUUn0sCiAjZW5kaWYKICNpZmRlZiBUSU9DTV9MRQotCXsiVElPQ01fTEUiLCBUSU9DTV9MRX0sCisgICAgeyJUSU9DTV9MRSIsIFRJT0NNX0xFfSwKICNlbmRpZgogI2lmZGVmIFRJT0NNX1JJCi0JeyJUSU9DTV9SSSIsIFRJT0NNX1JJfSwKKyAgICB7IlRJT0NNX1JJIiwgVElPQ01fUkl9LAogI2VuZGlmCiAjaWZkZWYgVElPQ01fUk5HCi0JeyJUSU9DTV9STkciLCBUSU9DTV9STkd9LAorICAgIHsiVElPQ01fUk5HIiwgVElPQ01fUk5HfSwKICNlbmRpZgogI2lmZGVmIFRJT0NNX1JUUwotCXsiVElPQ01fUlRTIiwgVElPQ01fUlRTfSwKKyAgICB7IlRJT0NNX1JUUyIsIFRJT0NNX1JUU30sCiAjZW5kaWYKICNpZmRlZiBUSU9DTV9TUgotCXsiVElPQ01fU1IiLCBUSU9DTV9TUn0sCisgICAgeyJUSU9DTV9TUiIsIFRJT0NNX1NSfSwKICNlbmRpZgogI2lmZGVmIFRJT0NNX1NUCi0JeyJUSU9DTV9TVCIsIFRJT0NNX1NUfSwKKyAgICB7IlRJT0NNX1NUIiwgVElPQ01fU1R9LAogI2VuZGlmCiAjaWZkZWYgVElPQ05PVFRZCi0JeyJUSU9DTk9UVFkiLCBUSU9DTk9UVFl9LAorICAgIHsiVElPQ05PVFRZIiwgVElPQ05PVFRZfSwKICNlbmRpZgogI2lmZGVmIFRJT0NOWENMCi0JeyJUSU9DTlhDTCIsIFRJT0NOWENMfSwKKyAgICB7IlRJT0NOWENMIiwgVElPQ05YQ0x9LAogI2VuZGlmCiAjaWZkZWYgVElPQ09VVFEKLQl7IlRJT0NPVVRRIiwgVElPQ09VVFF9LAorICAgIHsiVElPQ09VVFEiLCBUSU9DT1VUUX0sCiAjZW5kaWYKICNpZmRlZiBUSU9DUEtUCi0JeyJUSU9DUEtUIiwgVElPQ1BLVH0sCisgICAgeyJUSU9DUEtUIiwgVElPQ1BLVH0sCiAjZW5kaWYKICNpZmRlZiBUSU9DUEtUX0RBVEEKLQl7IlRJT0NQS1RfREFUQSIsIFRJT0NQS1RfREFUQX0sCisgICAgeyJUSU9DUEtUX0RBVEEiLCBUSU9DUEtUX0RBVEF9LAogI2VuZGlmCiAjaWZkZWYgVElPQ1BLVF9ET1NUT1AKLQl7IlRJT0NQS1RfRE9TVE9QIiwgVElPQ1BLVF9ET1NUT1B9LAorICAgIHsiVElPQ1BLVF9ET1NUT1AiLCBUSU9DUEtUX0RPU1RPUH0sCiAjZW5kaWYKICNpZmRlZiBUSU9DUEtUX0ZMVVNIUkVBRAotCXsiVElPQ1BLVF9GTFVTSFJFQUQiLCBUSU9DUEtUX0ZMVVNIUkVBRH0sCisgICAgeyJUSU9DUEtUX0ZMVVNIUkVBRCIsIFRJT0NQS1RfRkxVU0hSRUFEfSwKICNlbmRpZgogI2lmZGVmIFRJT0NQS1RfRkxVU0hXUklURQotCXsiVElPQ1BLVF9GTFVTSFdSSVRFIiwgVElPQ1BLVF9GTFVTSFdSSVRFfSwKKyAgICB7IlRJT0NQS1RfRkxVU0hXUklURSIsIFRJT0NQS1RfRkxVU0hXUklURX0sCiAjZW5kaWYKICNpZmRlZiBUSU9DUEtUX05PU1RPUAotCXsiVElPQ1BLVF9OT1NUT1AiLCBUSU9DUEtUX05PU1RPUH0sCisgICAgeyJUSU9DUEtUX05PU1RPUCIsIFRJT0NQS1RfTk9TVE9QfSwKICNlbmRpZgogI2lmZGVmIFRJT0NQS1RfU1RBUlQKLQl7IlRJT0NQS1RfU1RBUlQiLCBUSU9DUEtUX1NUQVJUfSwKKyAgICB7IlRJT0NQS1RfU1RBUlQiLCBUSU9DUEtUX1NUQVJUfSwKICNlbmRpZgogI2lmZGVmIFRJT0NQS1RfU1RPUAotCXsiVElPQ1BLVF9TVE9QIiwgVElPQ1BLVF9TVE9QfSwKKyAgICB7IlRJT0NQS1RfU1RPUCIsIFRJT0NQS1RfU1RPUH0sCiAjZW5kaWYKICNpZmRlZiBUSU9DU0NUVFkKLQl7IlRJT0NTQ1RUWSIsIFRJT0NTQ1RUWX0sCisgICAgeyJUSU9DU0NUVFkiLCBUSU9DU0NUVFl9LAogI2VuZGlmCiAjaWZkZWYgVElPQ1NFUkNPTkZJRwotCXsiVElPQ1NFUkNPTkZJRyIsIFRJT0NTRVJDT05GSUd9LAorICAgIHsiVElPQ1NFUkNPTkZJRyIsIFRJT0NTRVJDT05GSUd9LAogI2VuZGlmCiAjaWZkZWYgVElPQ1NFUkdFVExTUgotCXsiVElPQ1NFUkdFVExTUiIsIFRJT0NTRVJHRVRMU1J9LAorICAgIHsiVElPQ1NFUkdFVExTUiIsIFRJT0NTRVJHRVRMU1J9LAogI2VuZGlmCiAjaWZkZWYgVElPQ1NFUkdFVE1VTFRJCi0JeyJUSU9DU0VSR0VUTVVMVEkiLCBUSU9DU0VSR0VUTVVMVEl9LAorICAgIHsiVElPQ1NFUkdFVE1VTFRJIiwgVElPQ1NFUkdFVE1VTFRJfSwKICNlbmRpZgogI2lmZGVmIFRJT0NTRVJHU1RSVUNUCi0JeyJUSU9DU0VSR1NUUlVDVCIsIFRJT0NTRVJHU1RSVUNUfSwKKyAgICB7IlRJT0NTRVJHU1RSVUNUIiwgVElPQ1NFUkdTVFJVQ1R9LAogI2VuZGlmCiAjaWZkZWYgVElPQ1NFUkdXSUxECi0JeyJUSU9DU0VSR1dJTEQiLCBUSU9DU0VSR1dJTER9LAorICAgIHsiVElPQ1NFUkdXSUxEIiwgVElPQ1NFUkdXSUxEfSwKICNlbmRpZgogI2lmZGVmIFRJT0NTRVJTRVRNVUxUSQotCXsiVElPQ1NFUlNFVE1VTFRJIiwgVElPQ1NFUlNFVE1VTFRJfSwKKyAgICB7IlRJT0NTRVJTRVRNVUxUSSIsIFRJT0NTRVJTRVRNVUxUSX0sCiAjZW5kaWYKICNpZmRlZiBUSU9DU0VSU1dJTEQKLQl7IlRJT0NTRVJTV0lMRCIsIFRJT0NTRVJTV0lMRH0sCisgICAgeyJUSU9DU0VSU1dJTEQiLCBUSU9DU0VSU1dJTER9LAogI2VuZGlmCiAjaWZkZWYgVElPQ1NFUl9URU1UCi0JeyJUSU9DU0VSX1RFTVQiLCBUSU9DU0VSX1RFTVR9LAorICAgIHsiVElPQ1NFUl9URU1UIiwgVElPQ1NFUl9URU1UfSwKICNlbmRpZgogI2lmZGVmIFRJT0NTRVRECi0JeyJUSU9DU0VURCIsIFRJT0NTRVREfSwKKyAgICB7IlRJT0NTRVREIiwgVElPQ1NFVER9LAogI2VuZGlmCiAjaWZkZWYgVElPQ1NMQ0tUUk1JT1MKLQl7IlRJT0NTTENLVFJNSU9TIiwgVElPQ1NMQ0tUUk1JT1N9LAorICAgIHsiVElPQ1NMQ0tUUk1JT1MiLCBUSU9DU0xDS1RSTUlPU30sCiAjZW5kaWYKICNpZmRlZiBUSU9DU1BHUlAKLQl7IlRJT0NTUEdSUCIsIFRJT0NTUEdSUH0sCisgICAgeyJUSU9DU1BHUlAiLCBUSU9DU1BHUlB9LAogI2VuZGlmCiAjaWZkZWYgVElPQ1NTRVJJQUwKLQl7IlRJT0NTU0VSSUFMIiwgVElPQ1NTRVJJQUx9LAorICAgIHsiVElPQ1NTRVJJQUwiLCBUSU9DU1NFUklBTH0sCiAjZW5kaWYKICNpZmRlZiBUSU9DU1NPRlRDQVIKLQl7IlRJT0NTU09GVENBUiIsIFRJT0NTU09GVENBUn0sCisgICAgeyJUSU9DU1NPRlRDQVIiLCBUSU9DU1NPRlRDQVJ9LAogI2VuZGlmCiAjaWZkZWYgVElPQ1NUSQotCXsiVElPQ1NUSSIsIFRJT0NTVEl9LAorICAgIHsiVElPQ1NUSSIsIFRJT0NTVEl9LAogI2VuZGlmCiAjaWZkZWYgVElPQ1NXSU5TWgotCXsiVElPQ1NXSU5TWiIsIFRJT0NTV0lOU1p9LAorICAgIHsiVElPQ1NXSU5TWiIsIFRJT0NTV0lOU1p9LAogI2VuZGlmCiAjaWZkZWYgVElPQ1RUWUdTVFJVQ1QKLQl7IlRJT0NUVFlHU1RSVUNUIiwgVElPQ1RUWUdTVFJVQ1R9LAorICAgIHsiVElPQ1RUWUdTVFJVQ1QiLCBUSU9DVFRZR1NUUlVDVH0sCiAjZW5kaWYKIAotCS8qIHNlbnRpbmVsICovCi0Je05VTEwsIDB9CisgICAgLyogc2VudGluZWwgKi8KKyAgICB7TlVMTCwgMH0KIH07CiAKIAogUHlNT0RJTklUX0ZVTkMKIFB5SW5pdF90ZXJtaW9zKHZvaWQpCiB7Ci0JUHlPYmplY3QgKm07Ci0Jc3RydWN0IGNvbnN0YW50ICpjb25zdGFudCA9IHRlcm1pb3NfY29uc3RhbnRzOworICAgIFB5T2JqZWN0ICptOworICAgIHN0cnVjdCBjb25zdGFudCAqY29uc3RhbnQgPSB0ZXJtaW9zX2NvbnN0YW50czsKIAotCW0gPSBQeV9Jbml0TW9kdWxlNCgidGVybWlvcyIsIHRlcm1pb3NfbWV0aG9kcywgdGVybWlvc19fZG9jX18sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAoUHlPYmplY3QgKilOVUxMLCBQWVRIT05fQVBJX1ZFUlNJT04pOwotCWlmIChtID09IE5VTEwpCi0JCXJldHVybjsKKyAgICBtID0gUHlfSW5pdE1vZHVsZTQoInRlcm1pb3MiLCB0ZXJtaW9zX21ldGhvZHMsIHRlcm1pb3NfX2RvY19fLAorICAgICAgICAgICAgICAgICAgICAgICAoUHlPYmplY3QgKilOVUxMLCBQWVRIT05fQVBJX1ZFUlNJT04pOworICAgIGlmIChtID09IE5VTEwpCisgICAgICAgIHJldHVybjsKIAotCWlmIChUZXJtaW9zRXJyb3IgPT0gTlVMTCkgewotCQlUZXJtaW9zRXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oInRlcm1pb3MuZXJyb3IiLCBOVUxMLCBOVUxMKTsKLQl9Ci0JUHlfSU5DUkVGKFRlcm1pb3NFcnJvcik7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJlcnJvciIsIFRlcm1pb3NFcnJvcik7CisgICAgaWYgKFRlcm1pb3NFcnJvciA9PSBOVUxMKSB7CisgICAgICAgIFRlcm1pb3NFcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbigidGVybWlvcy5lcnJvciIsIE5VTEwsIE5VTEwpOworICAgIH0KKyAgICBQeV9JTkNSRUYoVGVybWlvc0Vycm9yKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgImVycm9yIiwgVGVybWlvc0Vycm9yKTsKIAotCXdoaWxlIChjb25zdGFudC0+bmFtZSAhPSBOVUxMKSB7Ci0JCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sIGNvbnN0YW50LT5uYW1lLCBjb25zdGFudC0+dmFsdWUpOwotCQkrK2NvbnN0YW50OwotCX0KKyAgICB3aGlsZSAoY29uc3RhbnQtPm5hbWUgIT0gTlVMTCkgeworICAgICAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCBjb25zdGFudC0+bmFtZSwgY29uc3RhbnQtPnZhbHVlKTsKKyAgICAgICAgKytjb25zdGFudDsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3Rlc3RjYXBpX2xvbmcuaCBiL01vZHVsZXMvdGVzdGNhcGlfbG9uZy5oCmluZGV4IDhlZDZiMDIuLmQ5YjY2NjMgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvdGVzdGNhcGlfbG9uZy5oCisrKyBiL01vZHVsZXMvdGVzdGNhcGlfbG9uZy5oCkBAIC0xLDE2NiArMSwxNjYgQEAKIC8qIFBvb3ItbWFuJ3MgdGVtcGxhdGUuICBNYWNyb3MgdXNlZDoKLSAgIFRFU1ROQU1FCW5hbWUgb2YgdGhlIHRlc3QgKGxpa2UgdGVzdF9sb25nX2FwaV9pbm5lcikKLSAgIFRZUEVOQU1FCXRoZSBzaWduZWQgdHlwZSAobGlrZSBsb25nKQotICAgRl9TX1RPX1BZCWNvbnZlcnQgc2lnbmVkIHRvIHB5bG9uZzsgVFlQRU5BTUUgLT4gUHlPYmplY3QqCi0gICBGX1BZX1RPX1MJY29udmVydCBweWxvbmcgdG8gc2lnbmVkOyBQeU9iamVjdCogLT4gVFlQRU5BTUUKLSAgIEZfVV9UT19QWQljb252ZXJ0IHVuc2lnbmVkIHRvIHB5bG9uZzsgdW5zaWduZWQgVFlQRU5BTUUgLT4gUHlPYmplY3QqCisgICBURVNUTkFNRSAgICAgbmFtZSBvZiB0aGUgdGVzdCAobGlrZSB0ZXN0X2xvbmdfYXBpX2lubmVyKQorICAgVFlQRU5BTUUgICAgIHRoZSBzaWduZWQgdHlwZSAobGlrZSBsb25nKQorICAgRl9TX1RPX1BZICAgIGNvbnZlcnQgc2lnbmVkIHRvIHB5bG9uZzsgVFlQRU5BTUUgLT4gUHlPYmplY3QqCisgICBGX1BZX1RPX1MgICAgY29udmVydCBweWxvbmcgdG8gc2lnbmVkOyBQeU9iamVjdCogLT4gVFlQRU5BTUUKKyAgIEZfVV9UT19QWSAgICBjb252ZXJ0IHVuc2lnbmVkIHRvIHB5bG9uZzsgdW5zaWduZWQgVFlQRU5BTUUgLT4gUHlPYmplY3QqCiAgICBGX1BZX1RPX1UgICAgY29udmVydCBweWxvbmcgdG8gdW5zaWduZWQ7IFB5T2JqZWN0KiAtPiB1bnNpZ25lZCBUWVBFTkFNRQogKi8KIAogc3RhdGljIFB5T2JqZWN0ICoKIFRFU1ROQU1FKFB5T2JqZWN0ICplcnJvcihjb25zdCBjaGFyKikpCiB7Ci0JY29uc3QgaW50IE5CSVRTID0gc2l6ZW9mKFRZUEVOQU1FKSAqIDg7Ci0JdW5zaWduZWQgVFlQRU5BTUUgYmFzZTsKLQlQeU9iamVjdCAqcHlyZXN1bHQ7Ci0JaW50IGk7CisgICAgY29uc3QgaW50IE5CSVRTID0gc2l6ZW9mKFRZUEVOQU1FKSAqIDg7CisgICAgdW5zaWduZWQgVFlQRU5BTUUgYmFzZTsKKyAgICBQeU9iamVjdCAqcHlyZXN1bHQ7CisgICAgaW50IGk7CiAKLQkvKiBOb3RlOiAgVGhpcyB0ZXN0IGxldHMgUHlPYmplY3RzIGxlYWsgaWYgYW4gZXJyb3IgaXMgcmFpc2VkLiAgU2luY2UKLQkgICBhbiBlcnJvciBzaG91bGQgbmV2ZXIgYmUgcmFpc2VkLCBsZWFrcyBhcmUgaW1wb3NzaWJsZSA8d2luaz4uICovCisgICAgLyogTm90ZTogIFRoaXMgdGVzdCBsZXRzIFB5T2JqZWN0cyBsZWFrIGlmIGFuIGVycm9yIGlzIHJhaXNlZC4gIFNpbmNlCisgICAgICAgYW4gZXJyb3Igc2hvdWxkIG5ldmVyIGJlIHJhaXNlZCwgbGVha3MgYXJlIGltcG9zc2libGUgPHdpbms+LiAqLwogCi0JLyogVGVzdCBuYXRpdmUgLT4gUHlMb25nIC0+IG5hdGl2ZSByb3VuZHRyaXAgaWRlbnRpdHkuCi0JICogR2VuZXJhdGUgYWxsIHBvd2VycyBvZiAyLCBhbmQgdGVzdCB0aGVtIGFuZCB0aGVpciBuZWdhdGlvbnMsCi0JICogcGx1cyB0aGUgbnVtYmVycyArLTEgb2ZmIGZyb20gdGhlbS4KLQkgKi8KLQliYXNlID0gMTsKLQlmb3IgKGkgPSAwOwotCSAgICAgaSA8IE5CSVRTICsgMTsgIC8qIG9uIGxhc3QsIGJhc2Ugb3ZlcmZsb3dzIHRvIDAgKi8KLQkgICAgICsraSwgYmFzZSA8PD0gMSkKLQl7Ci0JCWludCBqOwotCQlmb3IgKGogPSAwOyBqIDwgNjsgKytqKSB7Ci0JCQlUWVBFTkFNRSBpbiwgb3V0OwotCQkJdW5zaWduZWQgVFlQRU5BTUUgdWluLCB1b3V0OworICAgIC8qIFRlc3QgbmF0aXZlIC0+IFB5TG9uZyAtPiBuYXRpdmUgcm91bmR0cmlwIGlkZW50aXR5LgorICAgICAqIEdlbmVyYXRlIGFsbCBwb3dlcnMgb2YgMiwgYW5kIHRlc3QgdGhlbSBhbmQgdGhlaXIgbmVnYXRpb25zLAorICAgICAqIHBsdXMgdGhlIG51bWJlcnMgKy0xIG9mZiBmcm9tIHRoZW0uCisgICAgICovCisgICAgYmFzZSA9IDE7CisgICAgZm9yIChpID0gMDsKKyAgICAgICAgIGkgPCBOQklUUyArIDE7ICAvKiBvbiBsYXN0LCBiYXNlIG92ZXJmbG93cyB0byAwICovCisgICAgICAgICArK2ksIGJhc2UgPDw9IDEpCisgICAgeworICAgICAgICBpbnQgajsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDY7ICsraikgeworICAgICAgICAgICAgVFlQRU5BTUUgaW4sIG91dDsKKyAgICAgICAgICAgIHVuc2lnbmVkIFRZUEVOQU1FIHVpbiwgdW91dDsKIAotCQkJLyogRm9yIDAsIDEsIDIgdXNlIGJhc2U7IGZvciAzLCA0LCA1IHVzZSAtYmFzZSAqLwotCQkJdWluID0gaiA8IDMgPyBiYXNlCi0JCQkJICAgIDogKHVuc2lnbmVkIFRZUEVOQU1FKSgtKFRZUEVOQU1FKWJhc2UpOworICAgICAgICAgICAgLyogRm9yIDAsIDEsIDIgdXNlIGJhc2U7IGZvciAzLCA0LCA1IHVzZSAtYmFzZSAqLworICAgICAgICAgICAgdWluID0gaiA8IDMgPyBiYXNlCisgICAgICAgICAgICAgICAgICAgICAgICA6ICh1bnNpZ25lZCBUWVBFTkFNRSkoLShUWVBFTkFNRSliYXNlKTsKIAotCQkJLyogRm9yIDAgJiAzLCBzdWJ0cmFjdCAxLgotCQkJICogRm9yIDEgJiA0LCBsZWF2ZSBhbG9uZS4KLQkJCSAqIEZvciAyICYgNSwgYWRkIDEuCi0JCQkgKi8KLQkJCXVpbiArPSAodW5zaWduZWQgVFlQRU5BTUUpKFRZUEVOQU1FKShqICUgMyAtIDEpOworICAgICAgICAgICAgLyogRm9yIDAgJiAzLCBzdWJ0cmFjdCAxLgorICAgICAgICAgICAgICogRm9yIDEgJiA0LCBsZWF2ZSBhbG9uZS4KKyAgICAgICAgICAgICAqIEZvciAyICYgNSwgYWRkIDEuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHVpbiArPSAodW5zaWduZWQgVFlQRU5BTUUpKFRZUEVOQU1FKShqICUgMyAtIDEpOwogCi0JCQlweXJlc3VsdCA9IEZfVV9UT19QWSh1aW4pOwotCQkJaWYgKHB5cmVzdWx0ID09IE5VTEwpCi0JCQkJcmV0dXJuIGVycm9yKAotCQkJCSAidW5zaWduZWQgdW5leHBlY3RlZCBudWxsIHJlc3VsdCIpOworICAgICAgICAgICAgcHlyZXN1bHQgPSBGX1VfVE9fUFkodWluKTsKKyAgICAgICAgICAgIGlmIChweXJlc3VsdCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcigKKyAgICAgICAgICAgICAgICAgInVuc2lnbmVkIHVuZXhwZWN0ZWQgbnVsbCByZXN1bHQiKTsKIAotCQkJdW91dCA9IEZfUFlfVE9fVShweXJlc3VsdCk7Ci0JCQlpZiAodW91dCA9PSAodW5zaWduZWQgVFlQRU5BTUUpLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJCQlyZXR1cm4gZXJyb3IoCi0JCQkJCSJ1bnNpZ25lZCB1bmV4cGVjdGVkIC0xIHJlc3VsdCIpOwotCQkJaWYgKHVvdXQgIT0gdWluKQotCQkJCXJldHVybiBlcnJvcigKLQkJCQkJInVuc2lnbmVkIG91dHB1dCAhPSBpbnB1dCIpOwotCQkJVU5CSU5EKHB5cmVzdWx0KTsKKyAgICAgICAgICAgIHVvdXQgPSBGX1BZX1RPX1UocHlyZXN1bHQpOworICAgICAgICAgICAgaWYgKHVvdXQgPT0gKHVuc2lnbmVkIFRZUEVOQU1FKS0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yKAorICAgICAgICAgICAgICAgICAgICAidW5zaWduZWQgdW5leHBlY3RlZCAtMSByZXN1bHQiKTsKKyAgICAgICAgICAgIGlmICh1b3V0ICE9IHVpbikKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IoCisgICAgICAgICAgICAgICAgICAgICJ1bnNpZ25lZCBvdXRwdXQgIT0gaW5wdXQiKTsKKyAgICAgICAgICAgIFVOQklORChweXJlc3VsdCk7CiAKLQkJCWluID0gKFRZUEVOQU1FKXVpbjsKLQkJCXB5cmVzdWx0ID0gRl9TX1RPX1BZKGluKTsKLQkJCWlmIChweXJlc3VsdCA9PSBOVUxMKQotCQkJCXJldHVybiBlcnJvcigKLQkJCQkJInNpZ25lZCB1bmV4cGVjdGVkIG51bGwgcmVzdWx0Iik7CisgICAgICAgICAgICBpbiA9IChUWVBFTkFNRSl1aW47CisgICAgICAgICAgICBweXJlc3VsdCA9IEZfU19UT19QWShpbik7CisgICAgICAgICAgICBpZiAocHlyZXN1bHQgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IoCisgICAgICAgICAgICAgICAgICAgICJzaWduZWQgdW5leHBlY3RlZCBudWxsIHJlc3VsdCIpOwogCi0JCQlvdXQgPSBGX1BZX1RPX1MocHlyZXN1bHQpOwotCQkJaWYgKG91dCA9PSAoVFlQRU5BTUUpLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJCQlyZXR1cm4gZXJyb3IoCi0JCQkJCSJzaWduZWQgdW5leHBlY3RlZCAtMSByZXN1bHQiKTsKLQkJCWlmIChvdXQgIT0gaW4pCi0JCQkJcmV0dXJuIGVycm9yKAotCQkJCQkic2lnbmVkIG91dHB1dCAhPSBpbnB1dCIpOwotCQkJVU5CSU5EKHB5cmVzdWx0KTsKLQkJfQotCX0KKyAgICAgICAgICAgIG91dCA9IEZfUFlfVE9fUyhweXJlc3VsdCk7CisgICAgICAgICAgICBpZiAob3V0ID09IChUWVBFTkFNRSktMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcigKKyAgICAgICAgICAgICAgICAgICAgInNpZ25lZCB1bmV4cGVjdGVkIC0xIHJlc3VsdCIpOworICAgICAgICAgICAgaWYgKG91dCAhPSBpbikKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IoCisgICAgICAgICAgICAgICAgICAgICJzaWduZWQgb3V0cHV0ICE9IGlucHV0Iik7CisgICAgICAgICAgICBVTkJJTkQocHlyZXN1bHQpOworICAgICAgICB9CisgICAgfQogCi0JLyogT3ZlcmZsb3cgdGVzdHMuICBUaGUgbG9vcCBhYm92ZSBlbnN1cmVkIHRoYXQgYWxsIGxpbWl0IGNhc2VzIHRoYXQKLQkgKiBzaG91bGQgbm90IG92ZXJmbG93IGRvbid0IG92ZXJmbG93LCBzbyBhbGwgd2UgbmVlZCB0byBkbyBoZXJlIGlzCi0JICogcHJvdm9rZSBvbmUtb3Zlci10aGUtbGltaXQgY2FzZXMgKG5vdCBleGhhdXN0aXZlLCBidXQgc2hhcnApLgotCSAqLwotCXsKLQkJUHlPYmplY3QgKm9uZSwgKngsICp5OwotCQlUWVBFTkFNRSBvdXQ7Ci0JCXVuc2lnbmVkIFRZUEVOQU1FIHVvdXQ7CisgICAgLyogT3ZlcmZsb3cgdGVzdHMuICBUaGUgbG9vcCBhYm92ZSBlbnN1cmVkIHRoYXQgYWxsIGxpbWl0IGNhc2VzIHRoYXQKKyAgICAgKiBzaG91bGQgbm90IG92ZXJmbG93IGRvbid0IG92ZXJmbG93LCBzbyBhbGwgd2UgbmVlZCB0byBkbyBoZXJlIGlzCisgICAgICogcHJvdm9rZSBvbmUtb3Zlci10aGUtbGltaXQgY2FzZXMgKG5vdCBleGhhdXN0aXZlLCBidXQgc2hhcnApLgorICAgICAqLworICAgIHsKKyAgICAgICAgUHlPYmplY3QgKm9uZSwgKngsICp5OworICAgICAgICBUWVBFTkFNRSBvdXQ7CisgICAgICAgIHVuc2lnbmVkIFRZUEVOQU1FIHVvdXQ7CiAKLQkJb25lID0gUHlMb25nX0Zyb21Mb25nKDEpOwotCQlpZiAob25lID09IE5VTEwpCi0JCQlyZXR1cm4gZXJyb3IoCi0JCQkJInVuZXhwZWN0ZWQgTlVMTCBmcm9tIFB5TG9uZ19Gcm9tTG9uZyIpOworICAgICAgICBvbmUgPSBQeUxvbmdfRnJvbUxvbmcoMSk7CisgICAgICAgIGlmIChvbmUgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBlcnJvcigKKyAgICAgICAgICAgICAgICAidW5leHBlY3RlZCBOVUxMIGZyb20gUHlMb25nX0Zyb21Mb25nIik7CiAKLQkJLyogVW5zaWduZWQgY29tcGxhaW5zIGFib3V0IC0xPyAqLwotCQl4ID0gUHlOdW1iZXJfTmVnYXRpdmUob25lKTsKLQkJaWYgKHggPT0gTlVMTCkKLQkJCXJldHVybiBlcnJvcigKLQkJCQkidW5leHBlY3RlZCBOVUxMIGZyb20gUHlOdW1iZXJfTmVnYXRpdmUiKTsKKyAgICAgICAgLyogVW5zaWduZWQgY29tcGxhaW5zIGFib3V0IC0xPyAqLworICAgICAgICB4ID0gUHlOdW1iZXJfTmVnYXRpdmUob25lKTsKKyAgICAgICAgaWYgKHggPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBlcnJvcigKKyAgICAgICAgICAgICAgICAidW5leHBlY3RlZCBOVUxMIGZyb20gUHlOdW1iZXJfTmVnYXRpdmUiKTsKIAotCQl1b3V0ID0gRl9QWV9UT19VKHgpOwotCQlpZiAodW91dCAhPSAodW5zaWduZWQgVFlQRU5BTUUpLTEgfHwgIVB5RXJyX09jY3VycmVkKCkpCi0JCQlyZXR1cm4gZXJyb3IoCi0JCQkJIlB5TG9uZ19Bc1Vuc2lnbmVkWFhYKC0xKSBkaWRuJ3QgY29tcGxhaW4iKTsKLQkJUHlFcnJfQ2xlYXIoKTsKLQkJVU5CSU5EKHgpOworICAgICAgICB1b3V0ID0gRl9QWV9UT19VKHgpOworICAgICAgICBpZiAodW91dCAhPSAodW5zaWduZWQgVFlQRU5BTUUpLTEgfHwgIVB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gZXJyb3IoCisgICAgICAgICAgICAgICAgIlB5TG9uZ19Bc1Vuc2lnbmVkWFhYKC0xKSBkaWRuJ3QgY29tcGxhaW4iKTsKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgVU5CSU5EKHgpOwogCi0JCS8qIFVuc2lnbmVkIGNvbXBsYWlucyBhYm91dCAyKipOQklUUz8gKi8KLQkJeSA9IFB5TG9uZ19Gcm9tTG9uZygobG9uZylOQklUUyk7Ci0JCWlmICh5ID09IE5VTEwpCi0JCQlyZXR1cm4gZXJyb3IoCi0JCQkJInVuZXhwZWN0ZWQgTlVMTCBmcm9tIFB5TG9uZ19Gcm9tTG9uZyIpOworICAgICAgICAvKiBVbnNpZ25lZCBjb21wbGFpbnMgYWJvdXQgMioqTkJJVFM/ICovCisgICAgICAgIHkgPSBQeUxvbmdfRnJvbUxvbmcoKGxvbmcpTkJJVFMpOworICAgICAgICBpZiAoeSA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIGVycm9yKAorICAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkIE5VTEwgZnJvbSBQeUxvbmdfRnJvbUxvbmciKTsKIAotCQl4ID0gUHlOdW1iZXJfTHNoaWZ0KG9uZSwgeSk7IC8qIDFMIDw8IE5CSVRTLCA9PSAyKipOQklUUyAqLwotCQlVTkJJTkQoeSk7Ci0JCWlmICh4ID09IE5VTEwpCi0JCQlyZXR1cm4gZXJyb3IoCi0JCQkJInVuZXhwZWN0ZWQgTlVMTCBmcm9tIFB5TnVtYmVyX0xzaGlmdCIpOworICAgICAgICB4ID0gUHlOdW1iZXJfTHNoaWZ0KG9uZSwgeSk7IC8qIDFMIDw8IE5CSVRTLCA9PSAyKipOQklUUyAqLworICAgICAgICBVTkJJTkQoeSk7CisgICAgICAgIGlmICh4ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gZXJyb3IoCisgICAgICAgICAgICAgICAgInVuZXhwZWN0ZWQgTlVMTCBmcm9tIFB5TnVtYmVyX0xzaGlmdCIpOwogCi0gIAkJdW91dCA9IEZfUFlfVE9fVSh4KTsKLQkJaWYgKHVvdXQgIT0gKHVuc2lnbmVkIFRZUEVOQU1FKS0xIHx8ICFQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIGVycm9yKAotCQkJCSJQeUxvbmdfQXNVbnNpZ25lZFhYWCgyKipOQklUUykgZGlkbid0ICIKLQkJCQkiY29tcGxhaW4iKTsKLQkJUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgdW91dCA9IEZfUFlfVE9fVSh4KTsKKyAgICAgICAgaWYgKHVvdXQgIT0gKHVuc2lnbmVkIFRZUEVOQU1FKS0xIHx8ICFQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgcmV0dXJuIGVycm9yKAorICAgICAgICAgICAgICAgICJQeUxvbmdfQXNVbnNpZ25lZFhYWCgyKipOQklUUykgZGlkbid0ICIKKyAgICAgICAgICAgICAgICAiY29tcGxhaW4iKTsKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKIAotCQkvKiBTaWduZWQgY29tcGxhaW5zIGFib3V0IDIqKihOQklUUy0xKT8KLQkJICAgeCBzdGlsbCBoYXMgMioqTkJJVFMuICovCi0JCXkgPSBQeU51bWJlcl9Sc2hpZnQoeCwgb25lKTsgLyogMioqKE5CSVRTLTEpICovCi0JCVVOQklORCh4KTsKLQkJaWYgKHkgPT0gTlVMTCkKLQkJCXJldHVybiBlcnJvcigKLQkJCQkidW5leHBlY3RlZCBOVUxMIGZyb20gUHlOdW1iZXJfUnNoaWZ0Iik7CisgICAgICAgIC8qIFNpZ25lZCBjb21wbGFpbnMgYWJvdXQgMioqKE5CSVRTLTEpPworICAgICAgICAgICB4IHN0aWxsIGhhcyAyKipOQklUUy4gKi8KKyAgICAgICAgeSA9IFB5TnVtYmVyX1JzaGlmdCh4LCBvbmUpOyAvKiAyKiooTkJJVFMtMSkgKi8KKyAgICAgICAgVU5CSU5EKHgpOworICAgICAgICBpZiAoeSA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIGVycm9yKAorICAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkIE5VTEwgZnJvbSBQeU51bWJlcl9Sc2hpZnQiKTsKIAotCQlvdXQgPSBGX1BZX1RPX1MoeSk7Ci0JCWlmIChvdXQgIT0gKFRZUEVOQU1FKS0xIHx8ICFQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIGVycm9yKAotCQkJCSJQeUxvbmdfQXNYWFgoMioqKE5CSVRTLTEpKSBkaWRuJ3QgIgotCQkJCSJjb21wbGFpbiIpOwotCQlQeUVycl9DbGVhcigpOworICAgICAgICBvdXQgPSBGX1BZX1RPX1MoeSk7CisgICAgICAgIGlmIChvdXQgIT0gKFRZUEVOQU1FKS0xIHx8ICFQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgcmV0dXJuIGVycm9yKAorICAgICAgICAgICAgICAgICJQeUxvbmdfQXNYWFgoMioqKE5CSVRTLTEpKSBkaWRuJ3QgIgorICAgICAgICAgICAgICAgICJjb21wbGFpbiIpOworICAgICAgICBQeUVycl9DbGVhcigpOwogCi0JCS8qIFNpZ25lZCBjb21wbGFpbnMgYWJvdXQgLTIqKihOQklUUy0xKS0xPzsKLQkJICAgeSBzdGlsbCBoYXMgMioqKE5CSVRTLTEpLiAqLwotCQl4ID0gUHlOdW1iZXJfTmVnYXRpdmUoeSk7ICAvKiAtKDIqKihOQklUUy0xKSkgKi8KLQkJVU5CSU5EKHkpOwotCQlpZiAoeCA9PSBOVUxMKQotCQkJcmV0dXJuIGVycm9yKAotCQkJCSJ1bmV4cGVjdGVkIE5VTEwgZnJvbSBQeU51bWJlcl9OZWdhdGl2ZSIpOworICAgICAgICAvKiBTaWduZWQgY29tcGxhaW5zIGFib3V0IC0yKiooTkJJVFMtMSktMT87CisgICAgICAgICAgIHkgc3RpbGwgaGFzIDIqKihOQklUUy0xKS4gKi8KKyAgICAgICAgeCA9IFB5TnVtYmVyX05lZ2F0aXZlKHkpOyAgLyogLSgyKiooTkJJVFMtMSkpICovCisgICAgICAgIFVOQklORCh5KTsKKyAgICAgICAgaWYgKHggPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBlcnJvcigKKyAgICAgICAgICAgICAgICAidW5leHBlY3RlZCBOVUxMIGZyb20gUHlOdW1iZXJfTmVnYXRpdmUiKTsKIAotCQl5ID0gUHlOdW1iZXJfU3VidHJhY3QoeCwgb25lKTsgLyogLSgyKiooTkJJVFMtMSkpLTEgKi8KLQkJVU5CSU5EKHgpOwotCQlpZiAoeSA9PSBOVUxMKQotCQkJcmV0dXJuIGVycm9yKAotCQkJCSJ1bmV4cGVjdGVkIE5VTEwgZnJvbSBQeU51bWJlcl9TdWJ0cmFjdCIpOworICAgICAgICB5ID0gUHlOdW1iZXJfU3VidHJhY3QoeCwgb25lKTsgLyogLSgyKiooTkJJVFMtMSkpLTEgKi8KKyAgICAgICAgVU5CSU5EKHgpOworICAgICAgICBpZiAoeSA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIGVycm9yKAorICAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkIE5VTEwgZnJvbSBQeU51bWJlcl9TdWJ0cmFjdCIpOwogCi0JCW91dCA9IEZfUFlfVE9fUyh5KTsKLQkJaWYgKG91dCAhPSAoVFlQRU5BTUUpLTEgfHwgIVB5RXJyX09jY3VycmVkKCkpCi0JCQlyZXR1cm4gZXJyb3IoCi0JCQkJIlB5TG9uZ19Bc1hYWCgtMioqKE5CSVRTLTEpLTEpIGRpZG4ndCAiCi0JCQkJImNvbXBsYWluIik7Ci0JCVB5RXJyX0NsZWFyKCk7Ci0JCVVOQklORCh5KTsKKyAgICAgICAgb3V0ID0gRl9QWV9UT19TKHkpOworICAgICAgICBpZiAob3V0ICE9IChUWVBFTkFNRSktMSB8fCAhUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIHJldHVybiBlcnJvcigKKyAgICAgICAgICAgICAgICAiUHlMb25nX0FzWFhYKC0yKiooTkJJVFMtMSktMSkgZGlkbid0ICIKKyAgICAgICAgICAgICAgICAiY29tcGxhaW4iKTsKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgVU5CSU5EKHkpOwogCi0JCVB5X1hERUNSRUYoeCk7Ci0JCVB5X1hERUNSRUYoeSk7Ci0JCVB5X0RFQ1JFRihvbmUpOwotCX0KKyAgICAgICAgUHlfWERFQ1JFRih4KTsKKyAgICAgICAgUHlfWERFQ1JFRih5KTsKKyAgICAgICAgUHlfREVDUkVGKG9uZSk7CisgICAgfQogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvdGhyZWFkbW9kdWxlLmMgYi9Nb2R1bGVzL3RocmVhZG1vZHVsZS5jCmluZGV4IGNjZDg4ZTAuLmRlMzRhZTIgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvdGhyZWFkbW9kdWxlLmMKKysrIGIvTW9kdWxlcy90aHJlYWRtb2R1bGUuYwpAQCAtMTgsMzYgKzE4LDM2IEBACiAvKiBMb2NrIG9iamVjdHMgKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewotCVB5T2JqZWN0X0hFQUQKLQlQeVRocmVhZF90eXBlX2xvY2sgbG9ja19sb2NrOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBQeVRocmVhZF90eXBlX2xvY2sgbG9ja19sb2NrOwogfSBsb2Nrb2JqZWN0OwogCiBzdGF0aWMgdm9pZAogbG9ja19kZWFsbG9jKGxvY2tvYmplY3QgKnNlbGYpCiB7Ci0JaWYgKHNlbGYtPmxvY2tfbG9jayAhPSBOVUxMKSB7Ci0JCS8qIFVubG9jayB0aGUgbG9jayBzbyBpdCdzIHNhZmUgdG8gZnJlZSBpdCAqLwotCQlQeVRocmVhZF9hY3F1aXJlX2xvY2soc2VsZi0+bG9ja19sb2NrLCAwKTsKLQkJUHlUaHJlYWRfcmVsZWFzZV9sb2NrKHNlbGYtPmxvY2tfbG9jayk7Ci0JCQotCQlQeVRocmVhZF9mcmVlX2xvY2soc2VsZi0+bG9ja19sb2NrKTsKLQl9Ci0JUHlPYmplY3RfRGVsKHNlbGYpOworICAgIGlmIChzZWxmLT5sb2NrX2xvY2sgIT0gTlVMTCkgeworICAgICAgICAvKiBVbmxvY2sgdGhlIGxvY2sgc28gaXQncyBzYWZlIHRvIGZyZWUgaXQgKi8KKyAgICAgICAgUHlUaHJlYWRfYWNxdWlyZV9sb2NrKHNlbGYtPmxvY2tfbG9jaywgMCk7CisgICAgICAgIFB5VGhyZWFkX3JlbGVhc2VfbG9jayhzZWxmLT5sb2NrX2xvY2spOworCisgICAgICAgIFB5VGhyZWFkX2ZyZWVfbG9jayhzZWxmLT5sb2NrX2xvY2spOworICAgIH0KKyAgICBQeU9iamVjdF9EZWwoc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBsb2NrX1B5VGhyZWFkX2FjcXVpcmVfbG9jayhsb2Nrb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgaSA9IDE7CisgICAgaW50IGkgPSAxOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8aTphY3F1aXJlIiwgJmkpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxpOmFjcXVpcmUiLCAmaSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCWkgPSBQeVRocmVhZF9hY3F1aXJlX2xvY2soc2VsZi0+bG9ja19sb2NrLCBpKTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICBpID0gUHlUaHJlYWRfYWNxdWlyZV9sb2NrKHNlbGYtPmxvY2tfbG9jaywgaSk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKIAotCXJldHVybiBQeUJvb2xfRnJvbUxvbmcoKGxvbmcpaSk7CisgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygobG9uZylpKTsKIH0KIAogUHlEb2NfU1RSVkFSKGFjcXVpcmVfZG9jLApAQCAtNjQsMTYgKzY0LDE2IEBACiBzdGF0aWMgUHlPYmplY3QgKgogbG9ja19QeVRocmVhZF9yZWxlYXNlX2xvY2sobG9ja29iamVjdCAqc2VsZikKIHsKLQkvKiBTYW5pdHkgY2hlY2s6IHRoZSBsb2NrIG11c3QgYmUgbG9ja2VkICovCi0JaWYgKFB5VGhyZWFkX2FjcXVpcmVfbG9jayhzZWxmLT5sb2NrX2xvY2ssIDApKSB7Ci0JCVB5VGhyZWFkX3JlbGVhc2VfbG9jayhzZWxmLT5sb2NrX2xvY2spOwotCQlQeUVycl9TZXRTdHJpbmcoVGhyZWFkRXJyb3IsICJyZWxlYXNlIHVubG9ja2VkIGxvY2siKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIC8qIFNhbml0eSBjaGVjazogdGhlIGxvY2sgbXVzdCBiZSBsb2NrZWQgKi8KKyAgICBpZiAoUHlUaHJlYWRfYWNxdWlyZV9sb2NrKHNlbGYtPmxvY2tfbG9jaywgMCkpIHsKKyAgICAgICAgUHlUaHJlYWRfcmVsZWFzZV9sb2NrKHNlbGYtPmxvY2tfbG9jayk7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhUaHJlYWRFcnJvciwgInJlbGVhc2UgdW5sb2NrZWQgbG9jayIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlQeVRocmVhZF9yZWxlYXNlX2xvY2soc2VsZi0+bG9ja19sb2NrKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlUaHJlYWRfcmVsZWFzZV9sb2NrKHNlbGYtPmxvY2tfbG9jayk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBQeURvY19TVFJWQVIocmVsZWFzZV9kb2MsCkBAIC04NywxMSArODcsMTEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBsb2NrX2xvY2tlZF9sb2NrKGxvY2tvYmplY3QgKnNlbGYpCiB7Ci0JaWYgKFB5VGhyZWFkX2FjcXVpcmVfbG9jayhzZWxmLT5sb2NrX2xvY2ssIDApKSB7Ci0JCVB5VGhyZWFkX3JlbGVhc2VfbG9jayhzZWxmLT5sb2NrX2xvY2spOwotCQlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKDBMKTsKLQl9Ci0JcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygxTCk7CisgICAgaWYgKFB5VGhyZWFkX2FjcXVpcmVfbG9jayhzZWxmLT5sb2NrX2xvY2ssIDApKSB7CisgICAgICAgIFB5VGhyZWFkX3JlbGVhc2VfbG9jayhzZWxmLT5sb2NrX2xvY2spOworICAgICAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKDBMKTsKKyAgICB9CisgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygxTCk7CiB9CiAKIFB5RG9jX1NUUlZBUihsb2NrZWRfZG9jLApAQCAtMTAxLDU5ICsxMDEsNTkgQEAKIFJldHVybiB3aGV0aGVyIHRoZSBsb2NrIGlzIGluIHRoZSBsb2NrZWQgc3RhdGUuIik7CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBsb2NrX21ldGhvZHNbXSA9IHsKLQl7ImFjcXVpcmVfbG9jayIsIChQeUNGdW5jdGlvbilsb2NrX1B5VGhyZWFkX2FjcXVpcmVfbG9jaywgCi0JIE1FVEhfVkFSQVJHUywgYWNxdWlyZV9kb2N9LAotCXsiYWNxdWlyZSIsICAgICAgKFB5Q0Z1bmN0aW9uKWxvY2tfUHlUaHJlYWRfYWNxdWlyZV9sb2NrLCAKLQkgTUVUSF9WQVJBUkdTLCBhY3F1aXJlX2RvY30sCi0JeyJyZWxlYXNlX2xvY2siLCAoUHlDRnVuY3Rpb24pbG9ja19QeVRocmVhZF9yZWxlYXNlX2xvY2ssIAotCSBNRVRIX05PQVJHUywgcmVsZWFzZV9kb2N9LAotCXsicmVsZWFzZSIsICAgICAgKFB5Q0Z1bmN0aW9uKWxvY2tfUHlUaHJlYWRfcmVsZWFzZV9sb2NrLCAKLQkgTUVUSF9OT0FSR1MsIHJlbGVhc2VfZG9jfSwKLQl7ImxvY2tlZF9sb2NrIiwgIChQeUNGdW5jdGlvbilsb2NrX2xvY2tlZF9sb2NrLCAgCi0JIE1FVEhfTk9BUkdTLCBsb2NrZWRfZG9jfSwKLQl7ImxvY2tlZCIsICAgICAgIChQeUNGdW5jdGlvbilsb2NrX2xvY2tlZF9sb2NrLCAgCi0JIE1FVEhfTk9BUkdTLCBsb2NrZWRfZG9jfSwKLQl7Il9fZW50ZXJfXyIsICAgIChQeUNGdW5jdGlvbilsb2NrX1B5VGhyZWFkX2FjcXVpcmVfbG9jaywKLQkgTUVUSF9WQVJBUkdTLCBhY3F1aXJlX2RvY30sCi0JeyJfX2V4aXRfXyIsICAgIChQeUNGdW5jdGlvbilsb2NrX1B5VGhyZWFkX3JlbGVhc2VfbG9jaywKLQkgTUVUSF9WQVJBUkdTLCByZWxlYXNlX2RvY30sCi0Je05VTEwsICAgICAgICAgICBOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7ImFjcXVpcmVfbG9jayIsIChQeUNGdW5jdGlvbilsb2NrX1B5VGhyZWFkX2FjcXVpcmVfbG9jaywKKyAgICAgTUVUSF9WQVJBUkdTLCBhY3F1aXJlX2RvY30sCisgICAgeyJhY3F1aXJlIiwgICAgICAoUHlDRnVuY3Rpb24pbG9ja19QeVRocmVhZF9hY3F1aXJlX2xvY2ssCisgICAgIE1FVEhfVkFSQVJHUywgYWNxdWlyZV9kb2N9LAorICAgIHsicmVsZWFzZV9sb2NrIiwgKFB5Q0Z1bmN0aW9uKWxvY2tfUHlUaHJlYWRfcmVsZWFzZV9sb2NrLAorICAgICBNRVRIX05PQVJHUywgcmVsZWFzZV9kb2N9LAorICAgIHsicmVsZWFzZSIsICAgICAgKFB5Q0Z1bmN0aW9uKWxvY2tfUHlUaHJlYWRfcmVsZWFzZV9sb2NrLAorICAgICBNRVRIX05PQVJHUywgcmVsZWFzZV9kb2N9LAorICAgIHsibG9ja2VkX2xvY2siLCAgKFB5Q0Z1bmN0aW9uKWxvY2tfbG9ja2VkX2xvY2ssCisgICAgIE1FVEhfTk9BUkdTLCBsb2NrZWRfZG9jfSwKKyAgICB7ImxvY2tlZCIsICAgICAgIChQeUNGdW5jdGlvbilsb2NrX2xvY2tlZF9sb2NrLAorICAgICBNRVRIX05PQVJHUywgbG9ja2VkX2RvY30sCisgICAgeyJfX2VudGVyX18iLCAgICAoUHlDRnVuY3Rpb24pbG9ja19QeVRocmVhZF9hY3F1aXJlX2xvY2ssCisgICAgIE1FVEhfVkFSQVJHUywgYWNxdWlyZV9kb2N9LAorICAgIHsiX19leGl0X18iLCAgICAoUHlDRnVuY3Rpb24pbG9ja19QeVRocmVhZF9yZWxlYXNlX2xvY2ssCisgICAgIE1FVEhfVkFSQVJHUywgcmVsZWFzZV9kb2N9LAorICAgIHtOVUxMLCAgICAgICAgICAgTlVMTH0gICAgICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKgogbG9ja19nZXRhdHRyKGxvY2tvYmplY3QgKnNlbGYsIGNoYXIgKm5hbWUpCiB7Ci0JcmV0dXJuIFB5X0ZpbmRNZXRob2QobG9ja19tZXRob2RzLCAoUHlPYmplY3QgKilzZWxmLCBuYW1lKTsKKyAgICByZXR1cm4gUHlfRmluZE1ldGhvZChsb2NrX21ldGhvZHMsIChQeU9iamVjdCAqKXNlbGYsIG5hbWUpOwogfQogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IExvY2t0eXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCi0JInRocmVhZC5sb2NrIiwJCQkvKnRwX25hbWUqLwotCXNpemVvZihsb2Nrb2JqZWN0KSwJCS8qdHBfc2l6ZSovCi0JMCwJCQkJLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKWxvY2tfZGVhbGxvYywJLyp0cF9kZWFsbG9jKi8KLQkwLAkJCQkvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpbG9ja19nZXRhdHRyLAkvKnRwX2dldGF0dHIqLwotCTAsCQkJCS8qdHBfc2V0YXR0ciovCi0JMCwJCQkJLyp0cF9jb21wYXJlKi8KLQkwLAkJCQkvKnRwX3JlcHIqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCisgICAgInRocmVhZC5sb2NrIiwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YobG9ja29iamVjdCksICAgICAgICAgICAgICAgICAvKnRwX3NpemUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3Rvcilsb2NrX2RlYWxsb2MsICAgICAgICAgICAvKnRwX2RlYWxsb2MqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYylsb2NrX2dldGF0dHIsICAgICAgICAgIC8qdHBfZ2V0YXR0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NvbXBhcmUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmVwciovCiB9OwogCiBzdGF0aWMgbG9ja29iamVjdCAqCiBuZXdsb2Nrb2JqZWN0KHZvaWQpCiB7Ci0JbG9ja29iamVjdCAqc2VsZjsKLQlzZWxmID0gUHlPYmplY3RfTmV3KGxvY2tvYmplY3QsICZMb2NrdHlwZSk7Ci0JaWYgKHNlbGYgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0Jc2VsZi0+bG9ja19sb2NrID0gUHlUaHJlYWRfYWxsb2NhdGVfbG9jaygpOwotCWlmIChzZWxmLT5sb2NrX2xvY2sgPT0gTlVMTCkgewotCQlQeV9ERUNSRUYoc2VsZik7Ci0JCVB5RXJyX1NldFN0cmluZyhUaHJlYWRFcnJvciwgImNhbid0IGFsbG9jYXRlIGxvY2siKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBzZWxmOworICAgIGxvY2tvYmplY3QgKnNlbGY7CisgICAgc2VsZiA9IFB5T2JqZWN0X05ldyhsb2Nrb2JqZWN0LCAmTG9ja3R5cGUpOworICAgIGlmIChzZWxmID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHNlbGYtPmxvY2tfbG9jayA9IFB5VGhyZWFkX2FsbG9jYXRlX2xvY2soKTsKKyAgICBpZiAoc2VsZi0+bG9ja19sb2NrID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKHNlbGYpOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoVGhyZWFkRXJyb3IsICJjYW4ndCBhbGxvY2F0ZSBsb2NrIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gc2VsZjsKIH0KIAogLyogVGhyZWFkLWxvY2FsIG9iamVjdHMgKi8KQEAgLTE2MSwzNTEgKzE2MSwzNTEgQEAKICNpbmNsdWRlICJzdHJ1Y3RtZW1iZXIuaCIKIAogdHlwZWRlZiBzdHJ1Y3QgewotCVB5T2JqZWN0X0hFQUQKLQlQeU9iamVjdCAqa2V5OwotCVB5T2JqZWN0ICphcmdzOwotCVB5T2JqZWN0ICprdzsKLQlQeU9iamVjdCAqZGljdDsKKyAgICBQeU9iamVjdF9IRUFECisgICAgUHlPYmplY3QgKmtleTsKKyAgICBQeU9iamVjdCAqYXJnczsKKyAgICBQeU9iamVjdCAqa3c7CisgICAgUHlPYmplY3QgKmRpY3Q7CiB9IGxvY2Fsb2JqZWN0OwogCiBzdGF0aWMgUHlPYmplY3QgKgogbG9jYWxfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprdykKIHsKLQlsb2NhbG9iamVjdCAqc2VsZjsKLQlQeU9iamVjdCAqdGRpY3Q7CisgICAgbG9jYWxvYmplY3QgKnNlbGY7CisgICAgUHlPYmplY3QgKnRkaWN0OwogCi0JaWYgKHR5cGUtPnRwX2luaXQgPT0gUHlCYXNlT2JqZWN0X1R5cGUudHBfaW5pdAotCSAgICAmJiAoKGFyZ3MgJiYgUHlPYmplY3RfSXNUcnVlKGFyZ3MpKQotCQl8fCAoa3cgJiYgUHlPYmplY3RfSXNUcnVlKGt3KSkpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICJJbml0aWFsaXphdGlvbiBhcmd1bWVudHMgYXJlIG5vdCBzdXBwb3J0ZWQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICh0eXBlLT50cF9pbml0ID09IFB5QmFzZU9iamVjdF9UeXBlLnRwX2luaXQKKyAgICAgICAgJiYgKChhcmdzICYmIFB5T2JqZWN0X0lzVHJ1ZShhcmdzKSkKKyAgICAgICAgfHwgKGt3ICYmIFB5T2JqZWN0X0lzVHJ1ZShrdykpKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgIkluaXRpYWxpemF0aW9uIGFyZ3VtZW50cyBhcmUgbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlzZWxmID0gKGxvY2Fsb2JqZWN0ICopdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7Ci0JaWYgKHNlbGYgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgc2VsZiA9IChsb2NhbG9iamVjdCAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOworICAgIGlmIChzZWxmID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JUHlfWElOQ1JFRihhcmdzKTsKLQlzZWxmLT5hcmdzID0gYXJnczsKLQlQeV9YSU5DUkVGKGt3KTsKLQlzZWxmLT5rdyA9IGt3OwotCXNlbGYtPmRpY3QgPSBOVUxMOwkvKiBtYWtpbmcgc3VyZSAqLwotCXNlbGYtPmtleSA9IFB5U3RyaW5nX0Zyb21Gb3JtYXQoInRocmVhZC5sb2NhbC4lcCIsIHNlbGYpOwotCWlmIChzZWxmLT5rZXkgPT0gTlVMTCkgCi0JCWdvdG8gZXJyOworICAgIFB5X1hJTkNSRUYoYXJncyk7CisgICAgc2VsZi0+YXJncyA9IGFyZ3M7CisgICAgUHlfWElOQ1JFRihrdyk7CisgICAgc2VsZi0+a3cgPSBrdzsKKyAgICBzZWxmLT5kaWN0ID0gTlVMTDsgICAgICAgICAgLyogbWFraW5nIHN1cmUgKi8KKyAgICBzZWxmLT5rZXkgPSBQeVN0cmluZ19Gcm9tRm9ybWF0KCJ0aHJlYWQubG9jYWwuJXAiLCBzZWxmKTsKKyAgICBpZiAoc2VsZi0+a2V5ID09IE5VTEwpCisgICAgICAgIGdvdG8gZXJyOwogCi0Jc2VsZi0+ZGljdCA9IFB5RGljdF9OZXcoKTsKLQlpZiAoc2VsZi0+ZGljdCA9PSBOVUxMKQotCQlnb3RvIGVycjsKKyAgICBzZWxmLT5kaWN0ID0gUHlEaWN0X05ldygpOworICAgIGlmIChzZWxmLT5kaWN0ID09IE5VTEwpCisgICAgICAgIGdvdG8gZXJyOwogCi0JdGRpY3QgPSBQeVRocmVhZFN0YXRlX0dldERpY3QoKTsKLQlpZiAodGRpY3QgPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCi0JCQkJIkNvdWxkbid0IGdldCB0aHJlYWQtc3RhdGUgZGljdGlvbmFyeSIpOwotCQlnb3RvIGVycjsKLQl9CisgICAgdGRpY3QgPSBQeVRocmVhZFN0YXRlX0dldERpY3QoKTsKKyAgICBpZiAodGRpY3QgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiQ291bGRuJ3QgZ2V0IHRocmVhZC1zdGF0ZSBkaWN0aW9uYXJ5Iik7CisgICAgICAgIGdvdG8gZXJyOworICAgIH0KIAotCWlmIChQeURpY3RfU2V0SXRlbSh0ZGljdCwgc2VsZi0+a2V5LCBzZWxmLT5kaWN0KSA8IDApCi0JCWdvdG8gZXJyOworICAgIGlmIChQeURpY3RfU2V0SXRlbSh0ZGljdCwgc2VsZi0+a2V5LCBzZWxmLT5kaWN0KSA8IDApCisgICAgICAgIGdvdG8gZXJyOwogCi0JcmV0dXJuIChQeU9iamVjdCAqKXNlbGY7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKXNlbGY7CiAKICAgZXJyOgotCVB5X0RFQ1JFRihzZWxmKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeV9ERUNSRUYoc2VsZik7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBpbnQKIGxvY2FsX3RyYXZlcnNlKGxvY2Fsb2JqZWN0ICpzZWxmLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlQeV9WSVNJVChzZWxmLT5hcmdzKTsKLQlQeV9WSVNJVChzZWxmLT5rdyk7Ci0JUHlfVklTSVQoc2VsZi0+ZGljdCk7Ci0JcmV0dXJuIDA7CisgICAgUHlfVklTSVQoc2VsZi0+YXJncyk7CisgICAgUHlfVklTSVQoc2VsZi0+a3cpOworICAgIFB5X1ZJU0lUKHNlbGYtPmRpY3QpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBsb2NhbF9jbGVhcihsb2NhbG9iamVjdCAqc2VsZikKIHsKLQlQeV9DTEVBUihzZWxmLT5hcmdzKTsKLQlQeV9DTEVBUihzZWxmLT5rdyk7Ci0JUHlfQ0xFQVIoc2VsZi0+ZGljdCk7Ci0JcmV0dXJuIDA7CisgICAgUHlfQ0xFQVIoc2VsZi0+YXJncyk7CisgICAgUHlfQ0xFQVIoc2VsZi0+a3cpOworICAgIFB5X0NMRUFSKHNlbGYtPmRpY3QpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZAogbG9jYWxfZGVhbGxvYyhsb2NhbG9iamVjdCAqc2VsZikKIHsKLQlQeVRocmVhZFN0YXRlICp0c3RhdGU7Ci0JaWYgKHNlbGYtPmtleQotCSAgICAmJiAodHN0YXRlID0gUHlUaHJlYWRTdGF0ZV9HZXQoKSkKLQkgICAgJiYgdHN0YXRlLT5pbnRlcnApIHsKLQkJZm9yKHRzdGF0ZSA9IFB5SW50ZXJwcmV0ZXJTdGF0ZV9UaHJlYWRIZWFkKHRzdGF0ZS0+aW50ZXJwKTsKLQkJICAgIHRzdGF0ZTsKLQkJICAgIHRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfTmV4dCh0c3RhdGUpKSAKLQkJCWlmICh0c3RhdGUtPmRpY3QgJiYKLQkJCSAgICBQeURpY3RfR2V0SXRlbSh0c3RhdGUtPmRpY3QsIHNlbGYtPmtleSkpCi0JCQkJUHlEaWN0X0RlbEl0ZW0odHN0YXRlLT5kaWN0LCBzZWxmLT5rZXkpOwotCX0KKyAgICBQeVRocmVhZFN0YXRlICp0c3RhdGU7CisgICAgaWYgKHNlbGYtPmtleQorICAgICAgICAmJiAodHN0YXRlID0gUHlUaHJlYWRTdGF0ZV9HZXQoKSkKKyAgICAgICAgJiYgdHN0YXRlLT5pbnRlcnApIHsKKyAgICAgICAgZm9yKHRzdGF0ZSA9IFB5SW50ZXJwcmV0ZXJTdGF0ZV9UaHJlYWRIZWFkKHRzdGF0ZS0+aW50ZXJwKTsKKyAgICAgICAgICAgIHRzdGF0ZTsKKyAgICAgICAgICAgIHRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfTmV4dCh0c3RhdGUpKQorICAgICAgICAgICAgaWYgKHRzdGF0ZS0+ZGljdCAmJgorICAgICAgICAgICAgICAgIFB5RGljdF9HZXRJdGVtKHRzdGF0ZS0+ZGljdCwgc2VsZi0+a2V5KSkKKyAgICAgICAgICAgICAgICBQeURpY3RfRGVsSXRlbSh0c3RhdGUtPmRpY3QsIHNlbGYtPmtleSk7CisgICAgfQogCi0JUHlfWERFQ1JFRihzZWxmLT5rZXkpOwotCWxvY2FsX2NsZWFyKHNlbGYpOwotCVB5X1RZUEUoc2VsZiktPnRwX2ZyZWUoKFB5T2JqZWN0KilzZWxmKTsKKyAgICBQeV9YREVDUkVGKHNlbGYtPmtleSk7CisgICAgbG9jYWxfY2xlYXIoc2VsZik7CisgICAgUHlfVFlQRShzZWxmKS0+dHBfZnJlZSgoUHlPYmplY3QqKXNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogX2xkaWN0KGxvY2Fsb2JqZWN0ICpzZWxmKQogewotCVB5T2JqZWN0ICp0ZGljdCwgKmxkaWN0OworICAgIFB5T2JqZWN0ICp0ZGljdCwgKmxkaWN0OwogCi0JdGRpY3QgPSBQeVRocmVhZFN0YXRlX0dldERpY3QoKTsKLQlpZiAodGRpY3QgPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCi0JCQkJIkNvdWxkbid0IGdldCB0aHJlYWQtc3RhdGUgZGljdGlvbmFyeSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgdGRpY3QgPSBQeVRocmVhZFN0YXRlX0dldERpY3QoKTsKKyAgICBpZiAodGRpY3QgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiQ291bGRuJ3QgZ2V0IHRocmVhZC1zdGF0ZSBkaWN0aW9uYXJ5Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWxkaWN0ID0gUHlEaWN0X0dldEl0ZW0odGRpY3QsIHNlbGYtPmtleSk7Ci0JaWYgKGxkaWN0ID09IE5VTEwpIHsKLQkJbGRpY3QgPSBQeURpY3RfTmV3KCk7IC8qIHdlIG93biBsZGljdCAqLworICAgIGxkaWN0ID0gUHlEaWN0X0dldEl0ZW0odGRpY3QsIHNlbGYtPmtleSk7CisgICAgaWYgKGxkaWN0ID09IE5VTEwpIHsKKyAgICAgICAgbGRpY3QgPSBQeURpY3RfTmV3KCk7IC8qIHdlIG93biBsZGljdCAqLwogCi0JCWlmIChsZGljdCA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWVsc2UgewotCQkJaW50IGkgPSBQeURpY3RfU2V0SXRlbSh0ZGljdCwgc2VsZi0+a2V5LCBsZGljdCk7Ci0JCQlQeV9ERUNSRUYobGRpY3QpOyAvKiBub3cgbGRpY3QgaXMgYm9ycm93ZWQgKi8KLQkJCWlmIChpIDwgMCkgCi0JCQkJcmV0dXJuIE5VTEw7Ci0JCX0KKyAgICAgICAgaWYgKGxkaWN0ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpbnQgaSA9IFB5RGljdF9TZXRJdGVtKHRkaWN0LCBzZWxmLT5rZXksIGxkaWN0KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihsZGljdCk7IC8qIG5vdyBsZGljdCBpcyBib3Jyb3dlZCAqLworICAgICAgICAgICAgaWYgKGkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CiAKLQkJUHlfQ0xFQVIoc2VsZi0+ZGljdCk7Ci0JCVB5X0lOQ1JFRihsZGljdCk7Ci0JCXNlbGYtPmRpY3QgPSBsZGljdDsgLyogc3RpbGwgYm9ycm93ZWQgKi8KKyAgICAgICAgUHlfQ0xFQVIoc2VsZi0+ZGljdCk7CisgICAgICAgIFB5X0lOQ1JFRihsZGljdCk7CisgICAgICAgIHNlbGYtPmRpY3QgPSBsZGljdDsgLyogc3RpbGwgYm9ycm93ZWQgKi8KIAotCQlpZiAoUHlfVFlQRShzZWxmKS0+dHBfaW5pdCAhPSBQeUJhc2VPYmplY3RfVHlwZS50cF9pbml0ICYmCi0JCSAgICBQeV9UWVBFKHNlbGYpLT50cF9pbml0KChQeU9iamVjdCopc2VsZiwgCi0JCQkJCSAgIHNlbGYtPmFyZ3MsIHNlbGYtPmt3KSA8IDApIHsKLQkJCS8qIHdlIG5lZWQgdG8gZ2V0IHJpZCBvZiBsZGljdCBmcm9tIHRocmVhZCBzbwotCQkJICAgd2UgY3JlYXRlIGEgbmV3IG9uZSB0aGUgbmV4dCB0aW1lIHdlIGRvIGFuIGF0dHIKLQkJCSAgIGFjY2VzICovCi0JCQlQeURpY3RfRGVsSXRlbSh0ZGljdCwgc2VsZi0+a2V5KTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCQotCX0KKyAgICAgICAgaWYgKFB5X1RZUEUoc2VsZiktPnRwX2luaXQgIT0gUHlCYXNlT2JqZWN0X1R5cGUudHBfaW5pdCAmJgorICAgICAgICAgICAgUHlfVFlQRShzZWxmKS0+dHBfaW5pdCgoUHlPYmplY3QqKXNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPmFyZ3MsIHNlbGYtPmt3KSA8IDApIHsKKyAgICAgICAgICAgIC8qIHdlIG5lZWQgdG8gZ2V0IHJpZCBvZiBsZGljdCBmcm9tIHRocmVhZCBzbworICAgICAgICAgICAgICAgd2UgY3JlYXRlIGEgbmV3IG9uZSB0aGUgbmV4dCB0aW1lIHdlIGRvIGFuIGF0dHIKKyAgICAgICAgICAgICAgIGFjY2VzICovCisgICAgICAgICAgICBQeURpY3RfRGVsSXRlbSh0ZGljdCwgc2VsZi0+a2V5KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CiAKLQkvKiBUaGUgY2FsbCB0byB0cF9pbml0IGFib3ZlIG1heSBoYXZlIGNhdXNlZCBhbm90aGVyIHRocmVhZCB0byBydW4uCi0JICAgSW5zdGFsbCBvdXIgbGRpY3QgYWdhaW4uICovCi0JaWYgKHNlbGYtPmRpY3QgIT0gbGRpY3QpIHsKLQkJUHlfQ0xFQVIoc2VsZi0+ZGljdCk7Ci0JCVB5X0lOQ1JFRihsZGljdCk7Ci0JCXNlbGYtPmRpY3QgPSBsZGljdDsKLQl9CisgICAgfQogCi0JcmV0dXJuIGxkaWN0OworICAgIC8qIFRoZSBjYWxsIHRvIHRwX2luaXQgYWJvdmUgbWF5IGhhdmUgY2F1c2VkIGFub3RoZXIgdGhyZWFkIHRvIHJ1bi4KKyAgICAgICBJbnN0YWxsIG91ciBsZGljdCBhZ2Fpbi4gKi8KKyAgICBpZiAoc2VsZi0+ZGljdCAhPSBsZGljdCkgeworICAgICAgICBQeV9DTEVBUihzZWxmLT5kaWN0KTsKKyAgICAgICAgUHlfSU5DUkVGKGxkaWN0KTsKKyAgICAgICAgc2VsZi0+ZGljdCA9IGxkaWN0OworICAgIH0KKworICAgIHJldHVybiBsZGljdDsKIH0KIAogc3RhdGljIGludAogbG9jYWxfc2V0YXR0cm8obG9jYWxvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpuYW1lLCBQeU9iamVjdCAqdikKIHsKLQlQeU9iamVjdCAqbGRpY3Q7Ci0JCi0JbGRpY3QgPSBfbGRpY3Qoc2VsZik7Ci0JaWYgKGxkaWN0ID09IE5VTEwpIAotCQlyZXR1cm4gLTE7CisgICAgUHlPYmplY3QgKmxkaWN0OwogCi0JcmV0dXJuIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyKChQeU9iamVjdCAqKXNlbGYsIG5hbWUsIHYpOworICAgIGxkaWN0ID0gX2xkaWN0KHNlbGYpOworICAgIGlmIChsZGljdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICByZXR1cm4gUHlPYmplY3RfR2VuZXJpY1NldEF0dHIoKFB5T2JqZWN0ICopc2VsZiwgbmFtZSwgdik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBsb2NhbF9nZXRkaWN0KGxvY2Fsb2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQogewotCWlmIChzZWxmLT5kaWN0ID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0F0dHJpYnV0ZUVycm9yLCAiX19kaWN0X18iKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChzZWxmLT5kaWN0ID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0F0dHJpYnV0ZUVycm9yLCAiX19kaWN0X18iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JUHlfSU5DUkVGKHNlbGYtPmRpY3QpOwotCXJldHVybiBzZWxmLT5kaWN0OworICAgIFB5X0lOQ1JFRihzZWxmLT5kaWN0KTsKKyAgICByZXR1cm4gc2VsZi0+ZGljdDsKIH0KIAogc3RhdGljIFB5R2V0U2V0RGVmIGxvY2FsX2dldHNldFtdID0gewotCXsiX19kaWN0X18iLCAoZ2V0dGVyKWxvY2FsX2dldGRpY3QsIChzZXR0ZXIpTlVMTCwKLQkgIkxvY2FsLWRhdGEgZGljdGlvbmFyeSIsIE5VTEx9LAotCXtOVUxMfSAgLyogU2VudGluZWwgKi8KKyAgICB7Il9fZGljdF9fIiwgKGdldHRlcilsb2NhbF9nZXRkaWN0LCAoc2V0dGVyKU5VTEwsCisgICAgICJMb2NhbC1kYXRhIGRpY3Rpb25hcnkiLCBOVUxMfSwKKyAgICB7TlVMTH0gIC8qIFNlbnRpbmVsICovCiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKmxvY2FsX2dldGF0dHJvKGxvY2Fsb2JqZWN0ICosIFB5T2JqZWN0ICopOwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IGxvY2FsdHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKLQkvKiB0cF9uYW1lICAgICAgICAgICAqLyAidGhyZWFkLl9sb2NhbCIsCi0JLyogdHBfYmFzaWNzaXplICAgICAgKi8gc2l6ZW9mKGxvY2Fsb2JqZWN0KSwKLQkvKiB0cF9pdGVtc2l6ZSAgICAgICAqLyAwLAotCS8qIHRwX2RlYWxsb2MgICAgICAgICovIChkZXN0cnVjdG9yKWxvY2FsX2RlYWxsb2MsCi0JLyogdHBfcHJpbnQgICAgICAgICAgKi8gMCwKLQkvKiB0cF9nZXRhdHRyICAgICAgICAqLyAwLAotCS8qIHRwX3NldGF0dHIgICAgICAgICovIDAsCi0JLyogdHBfY29tcGFyZSAgICAgICAgKi8gMCwKLQkvKiB0cF9yZXByICAgICAgICAgICAqLyAwLAotCS8qIHRwX2FzX251bWJlciAgICAgICovIDAsCi0JLyogdHBfYXNfc2VxdWVuY2UgICAgKi8gMCwKLQkvKiB0cF9hc19tYXBwaW5nICAgICAqLyAwLAotCS8qIHRwX2hhc2ggICAgICAgICAgICovIDAsCi0JLyogdHBfY2FsbCAgICAgICAgICAgKi8gMCwKLQkvKiB0cF9zdHIgICAgICAgICAgICAqLyAwLAotCS8qIHRwX2dldGF0dHJvICAgICAgICovIChnZXRhdHRyb2Z1bmMpbG9jYWxfZ2V0YXR0cm8sCi0JLyogdHBfc2V0YXR0cm8gICAgICAgKi8gKHNldGF0dHJvZnVuYylsb2NhbF9zZXRhdHRybywKLQkvKiB0cF9hc19idWZmZXIgICAgICAqLyAwLAotCS8qIHRwX2ZsYWdzICAgICAgICAgICovIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfQkFTRVRZUEUsCi0JLyogdHBfZG9jICAgICAgICAgICAgKi8gIlRocmVhZC1sb2NhbCBkYXRhIiwKLQkvKiB0cF90cmF2ZXJzZSAgICAgICAqLyAodHJhdmVyc2Vwcm9jKWxvY2FsX3RyYXZlcnNlLAotCS8qIHRwX2NsZWFyICAgICAgICAgICovIChpbnF1aXJ5KWxvY2FsX2NsZWFyLAotCS8qIHRwX3JpY2hjb21wYXJlICAgICovIDAsCi0JLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8gMCwKLQkvKiB0cF9pdGVyICAgICAgICAgICAqLyAwLAotCS8qIHRwX2l0ZXJuZXh0ICAgICAgICovIDAsCi0JLyogdHBfbWV0aG9kcyAgICAgICAgKi8gMCwKLQkvKiB0cF9tZW1iZXJzICAgICAgICAqLyAwLAotCS8qIHRwX2dldHNldCAgICAgICAgICovIGxvY2FsX2dldHNldCwKLQkvKiB0cF9iYXNlICAgICAgICAgICAqLyAwLAotCS8qIHRwX2RpY3QgICAgICAgICAgICovIDAsIC8qIGludGVybmFsIHVzZSAqLwotCS8qIHRwX2Rlc2NyX2dldCAgICAgICovIDAsCi0JLyogdHBfZGVzY3Jfc2V0ICAgICAgKi8gMCwKLQkvKiB0cF9kaWN0b2Zmc2V0ICAgICAqLyBvZmZzZXRvZihsb2NhbG9iamVjdCwgZGljdCksCi0JLyogdHBfaW5pdCAgICAgICAgICAgKi8gMCwKLQkvKiB0cF9hbGxvYyAgICAgICAgICAqLyAwLAotCS8qIHRwX25ldyAgICAgICAgICAgICovIGxvY2FsX25ldywKLQkvKiB0cF9mcmVlICAgICAgICAgICAqLyAwLCAvKiBMb3ctbGV2ZWwgZnJlZS1tZW0gcm91dGluZSAqLwotCS8qIHRwX2lzX2djICAgICAgICAgICovIDAsIC8qIEZvciBQeU9iamVjdF9JU19HQyAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQorICAgIC8qIHRwX25hbWUgICAgICAgICAgICovICJ0aHJlYWQuX2xvY2FsIiwKKyAgICAvKiB0cF9iYXNpY3NpemUgICAgICAqLyBzaXplb2YobG9jYWxvYmplY3QpLAorICAgIC8qIHRwX2l0ZW1zaXplICAgICAgICovIDAsCisgICAgLyogdHBfZGVhbGxvYyAgICAgICAgKi8gKGRlc3RydWN0b3IpbG9jYWxfZGVhbGxvYywKKyAgICAvKiB0cF9wcmludCAgICAgICAgICAqLyAwLAorICAgIC8qIHRwX2dldGF0dHIgICAgICAgICovIDAsCisgICAgLyogdHBfc2V0YXR0ciAgICAgICAgKi8gMCwKKyAgICAvKiB0cF9jb21wYXJlICAgICAgICAqLyAwLAorICAgIC8qIHRwX3JlcHIgICAgICAgICAgICovIDAsCisgICAgLyogdHBfYXNfbnVtYmVyICAgICAgKi8gMCwKKyAgICAvKiB0cF9hc19zZXF1ZW5jZSAgICAqLyAwLAorICAgIC8qIHRwX2FzX21hcHBpbmcgICAgICovIDAsCisgICAgLyogdHBfaGFzaCAgICAgICAgICAgKi8gMCwKKyAgICAvKiB0cF9jYWxsICAgICAgICAgICAqLyAwLAorICAgIC8qIHRwX3N0ciAgICAgICAgICAgICovIDAsCisgICAgLyogdHBfZ2V0YXR0cm8gICAgICAgKi8gKGdldGF0dHJvZnVuYylsb2NhbF9nZXRhdHRybywKKyAgICAvKiB0cF9zZXRhdHRybyAgICAgICAqLyAoc2V0YXR0cm9mdW5jKWxvY2FsX3NldGF0dHJvLAorICAgIC8qIHRwX2FzX2J1ZmZlciAgICAgICovIDAsCisgICAgLyogdHBfZmxhZ3MgICAgICAgICAgKi8gUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19CQVNFVFlQRSwKKyAgICAvKiB0cF9kb2MgICAgICAgICAgICAqLyAiVGhyZWFkLWxvY2FsIGRhdGEiLAorICAgIC8qIHRwX3RyYXZlcnNlICAgICAgICovICh0cmF2ZXJzZXByb2MpbG9jYWxfdHJhdmVyc2UsCisgICAgLyogdHBfY2xlYXIgICAgICAgICAgKi8gKGlucXVpcnkpbG9jYWxfY2xlYXIsCisgICAgLyogdHBfcmljaGNvbXBhcmUgICAgKi8gMCwKKyAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLyAwLAorICAgIC8qIHRwX2l0ZXIgICAgICAgICAgICovIDAsCisgICAgLyogdHBfaXRlcm5leHQgICAgICAgKi8gMCwKKyAgICAvKiB0cF9tZXRob2RzICAgICAgICAqLyAwLAorICAgIC8qIHRwX21lbWJlcnMgICAgICAgICovIDAsCisgICAgLyogdHBfZ2V0c2V0ICAgICAgICAgKi8gbG9jYWxfZ2V0c2V0LAorICAgIC8qIHRwX2Jhc2UgICAgICAgICAgICovIDAsCisgICAgLyogdHBfZGljdCAgICAgICAgICAgKi8gMCwgLyogaW50ZXJuYWwgdXNlICovCisgICAgLyogdHBfZGVzY3JfZ2V0ICAgICAgKi8gMCwKKyAgICAvKiB0cF9kZXNjcl9zZXQgICAgICAqLyAwLAorICAgIC8qIHRwX2RpY3RvZmZzZXQgICAgICovIG9mZnNldG9mKGxvY2Fsb2JqZWN0LCBkaWN0KSwKKyAgICAvKiB0cF9pbml0ICAgICAgICAgICAqLyAwLAorICAgIC8qIHRwX2FsbG9jICAgICAgICAgICovIDAsCisgICAgLyogdHBfbmV3ICAgICAgICAgICAgKi8gbG9jYWxfbmV3LAorICAgIC8qIHRwX2ZyZWUgICAgICAgICAgICovIDAsIC8qIExvdy1sZXZlbCBmcmVlLW1lbSByb3V0aW5lICovCisgICAgLyogdHBfaXNfZ2MgICAgICAgICAgKi8gMCwgLyogRm9yIFB5T2JqZWN0X0lTX0dDICovCiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKgogbG9jYWxfZ2V0YXR0cm8obG9jYWxvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpuYW1lKQogewotCVB5T2JqZWN0ICpsZGljdCwgKnZhbHVlOworICAgIFB5T2JqZWN0ICpsZGljdCwgKnZhbHVlOwogCi0JbGRpY3QgPSBfbGRpY3Qoc2VsZik7Ci0JaWYgKGxkaWN0ID09IE5VTEwpIAotCQlyZXR1cm4gTlVMTDsKKyAgICBsZGljdCA9IF9sZGljdChzZWxmKTsKKyAgICBpZiAobGRpY3QgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoUHlfVFlQRShzZWxmKSAhPSAmbG9jYWx0eXBlKQotCQkvKiB1c2UgZ2VuZXJpYyBsb29rdXAgZm9yIHN1YnR5cGVzICovCi0JCXJldHVybiBQeU9iamVjdF9HZW5lcmljR2V0QXR0cigoUHlPYmplY3QgKilzZWxmLCBuYW1lKTsKKyAgICBpZiAoUHlfVFlQRShzZWxmKSAhPSAmbG9jYWx0eXBlKQorICAgICAgICAvKiB1c2UgZ2VuZXJpYyBsb29rdXAgZm9yIHN1YnR5cGVzICovCisgICAgICAgIHJldHVybiBQeU9iamVjdF9HZW5lcmljR2V0QXR0cigoUHlPYmplY3QgKilzZWxmLCBuYW1lKTsKIAotCS8qIE9wdGltaXphdGlvbjoganVzdCBsb29rIGluIGRpY3Qgb3Vyc2VsdmVzICovCi0JdmFsdWUgPSBQeURpY3RfR2V0SXRlbShsZGljdCwgbmFtZSk7Ci0JaWYgKHZhbHVlID09IE5VTEwpIAotCQkvKiBGYWxsIGJhY2sgb24gZ2VuZXJpYyB0byBnZXQgX19jbGFzc19fIGFuZCBfX2RpY3RfXyAqLwotCQlyZXR1cm4gUHlPYmplY3RfR2VuZXJpY0dldEF0dHIoKFB5T2JqZWN0ICopc2VsZiwgbmFtZSk7CisgICAgLyogT3B0aW1pemF0aW9uOiBqdXN0IGxvb2sgaW4gZGljdCBvdXJzZWx2ZXMgKi8KKyAgICB2YWx1ZSA9IFB5RGljdF9HZXRJdGVtKGxkaWN0LCBuYW1lKTsKKyAgICBpZiAodmFsdWUgPT0gTlVMTCkKKyAgICAgICAgLyogRmFsbCBiYWNrIG9uIGdlbmVyaWMgdG8gZ2V0IF9fY2xhc3NfXyBhbmQgX19kaWN0X18gKi8KKyAgICAgICAgcmV0dXJuIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyKChQeU9iamVjdCAqKXNlbGYsIG5hbWUpOwogCi0JUHlfSU5DUkVGKHZhbHVlKTsKLQlyZXR1cm4gdmFsdWU7CisgICAgUHlfSU5DUkVGKHZhbHVlKTsKKyAgICByZXR1cm4gdmFsdWU7CiB9CiAKIC8qIE1vZHVsZSBmdW5jdGlvbnMgKi8KIAogc3RydWN0IGJvb3RzdGF0ZSB7Ci0JUHlJbnRlcnByZXRlclN0YXRlICppbnRlcnA7Ci0JUHlPYmplY3QgKmZ1bmM7Ci0JUHlPYmplY3QgKmFyZ3M7Ci0JUHlPYmplY3QgKmtleXc7Ci0JUHlUaHJlYWRTdGF0ZSAqdHN0YXRlOworICAgIFB5SW50ZXJwcmV0ZXJTdGF0ZSAqaW50ZXJwOworICAgIFB5T2JqZWN0ICpmdW5jOworICAgIFB5T2JqZWN0ICphcmdzOworICAgIFB5T2JqZWN0ICprZXl3OworICAgIFB5VGhyZWFkU3RhdGUgKnRzdGF0ZTsKIH07CiAKIHN0YXRpYyB2b2lkCiB0X2Jvb3RzdHJhcCh2b2lkICpib290X3JhdykKIHsKLQlzdHJ1Y3QgYm9vdHN0YXRlICpib290ID0gKHN0cnVjdCBib290c3RhdGUgKikgYm9vdF9yYXc7Ci0JUHlUaHJlYWRTdGF0ZSAqdHN0YXRlOwotCVB5T2JqZWN0ICpyZXM7CisgICAgc3RydWN0IGJvb3RzdGF0ZSAqYm9vdCA9IChzdHJ1Y3QgYm9vdHN0YXRlICopIGJvb3RfcmF3OworICAgIFB5VGhyZWFkU3RhdGUgKnRzdGF0ZTsKKyAgICBQeU9iamVjdCAqcmVzOwogCi0JdHN0YXRlID0gYm9vdC0+dHN0YXRlOwotCXRzdGF0ZS0+dGhyZWFkX2lkID0gUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpOwotCV9QeVRocmVhZFN0YXRlX0luaXQodHN0YXRlKTsKLQlQeUV2YWxfQWNxdWlyZVRocmVhZCh0c3RhdGUpOwotCXJlcyA9IFB5RXZhbF9DYWxsT2JqZWN0V2l0aEtleXdvcmRzKAotCQlib290LT5mdW5jLCBib290LT5hcmdzLCBib290LT5rZXl3KTsKLQlpZiAocmVzID09IE5VTEwpIHsKLQkJaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfU3lzdGVtRXhpdCkpCi0JCQlQeUVycl9DbGVhcigpOwotCQllbHNlIHsKLQkJCVB5T2JqZWN0ICpmaWxlOwotCQkJUHlTeXNfV3JpdGVTdGRlcnIoCi0JCQkJIlVuaGFuZGxlZCBleGNlcHRpb24gaW4gdGhyZWFkIHN0YXJ0ZWQgYnkgIik7Ci0JCQlmaWxlID0gUHlTeXNfR2V0T2JqZWN0KCJzdGRlcnIiKTsKLQkJCWlmIChmaWxlKQotCQkJCVB5RmlsZV9Xcml0ZU9iamVjdChib290LT5mdW5jLCBmaWxlLCAwKTsKLQkJCWVsc2UKLQkJCQlQeU9iamVjdF9QcmludChib290LT5mdW5jLCBzdGRlcnIsIDApOwotCQkJUHlTeXNfV3JpdGVTdGRlcnIoIlxuIik7Ci0JCQlQeUVycl9QcmludEV4KDApOwotCQl9Ci0JfQotCWVsc2UKLQkJUHlfREVDUkVGKHJlcyk7Ci0JUHlfREVDUkVGKGJvb3QtPmZ1bmMpOwotCVB5X0RFQ1JFRihib290LT5hcmdzKTsKLQlQeV9YREVDUkVGKGJvb3QtPmtleXcpOwotCVB5TWVtX0RFTChib290X3Jhdyk7Ci0JUHlUaHJlYWRTdGF0ZV9DbGVhcih0c3RhdGUpOwotCVB5VGhyZWFkU3RhdGVfRGVsZXRlQ3VycmVudCgpOwotCVB5VGhyZWFkX2V4aXRfdGhyZWFkKCk7CisgICAgdHN0YXRlID0gYm9vdC0+dHN0YXRlOworICAgIHRzdGF0ZS0+dGhyZWFkX2lkID0gUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpOworICAgIF9QeVRocmVhZFN0YXRlX0luaXQodHN0YXRlKTsKKyAgICBQeUV2YWxfQWNxdWlyZVRocmVhZCh0c3RhdGUpOworICAgIHJlcyA9IFB5RXZhbF9DYWxsT2JqZWN0V2l0aEtleXdvcmRzKAorICAgICAgICBib290LT5mdW5jLCBib290LT5hcmdzLCBib290LT5rZXl3KTsKKyAgICBpZiAocmVzID09IE5VTEwpIHsKKyAgICAgICAgaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfU3lzdGVtRXhpdCkpCisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpmaWxlOworICAgICAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoCisgICAgICAgICAgICAgICAgIlVuaGFuZGxlZCBleGNlcHRpb24gaW4gdGhyZWFkIHN0YXJ0ZWQgYnkgIik7CisgICAgICAgICAgICBmaWxlID0gUHlTeXNfR2V0T2JqZWN0KCJzdGRlcnIiKTsKKyAgICAgICAgICAgIGlmIChmaWxlKQorICAgICAgICAgICAgICAgIFB5RmlsZV9Xcml0ZU9iamVjdChib290LT5mdW5jLCBmaWxlLCAwKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBQeU9iamVjdF9QcmludChib290LT5mdW5jLCBzdGRlcnIsIDApOworICAgICAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoIlxuIik7CisgICAgICAgICAgICBQeUVycl9QcmludEV4KDApOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgUHlfREVDUkVGKHJlcyk7CisgICAgUHlfREVDUkVGKGJvb3QtPmZ1bmMpOworICAgIFB5X0RFQ1JFRihib290LT5hcmdzKTsKKyAgICBQeV9YREVDUkVGKGJvb3QtPmtleXcpOworICAgIFB5TWVtX0RFTChib290X3Jhdyk7CisgICAgUHlUaHJlYWRTdGF0ZV9DbGVhcih0c3RhdGUpOworICAgIFB5VGhyZWFkU3RhdGVfRGVsZXRlQ3VycmVudCgpOworICAgIFB5VGhyZWFkX2V4aXRfdGhyZWFkKCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB0aHJlYWRfUHlUaHJlYWRfc3RhcnRfbmV3X3RocmVhZChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmZhcmdzKQogewotCVB5T2JqZWN0ICpmdW5jLCAqYXJncywgKmtleXcgPSBOVUxMOwotCXN0cnVjdCBib290c3RhdGUgKmJvb3Q7Ci0JbG9uZyBpZGVudDsKKyAgICBQeU9iamVjdCAqZnVuYywgKmFyZ3MsICprZXl3ID0gTlVMTDsKKyAgICBzdHJ1Y3QgYm9vdHN0YXRlICpib290OworICAgIGxvbmcgaWRlbnQ7CiAKLQlpZiAoIVB5QXJnX1VucGFja1R1cGxlKGZhcmdzLCAic3RhcnRfbmV3X3RocmVhZCIsIDIsIDMsCi0JCSAgICAgICAgICAgICAgICZmdW5jLCAmYXJncywgJmtleXcpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIVB5Q2FsbGFibGVfQ2hlY2soZnVuYykpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiZmlyc3QgYXJnIG11c3QgYmUgY2FsbGFibGUiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmICghUHlUdXBsZV9DaGVjayhhcmdzKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSIybmQgYXJnIG11c3QgYmUgYSB0dXBsZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKGtleXcgIT0gTlVMTCAmJiAhUHlEaWN0X0NoZWNrKGtleXcpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJIm9wdGlvbmFsIDNyZCBhcmcgbXVzdCBiZSBhIGRpY3Rpb25hcnkiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWJvb3QgPSBQeU1lbV9ORVcoc3RydWN0IGJvb3RzdGF0ZSwgMSk7Ci0JaWYgKGJvb3QgPT0gTlVMTCkKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JYm9vdC0+aW50ZXJwID0gUHlUaHJlYWRTdGF0ZV9HRVQoKS0+aW50ZXJwOwotCWJvb3QtPmZ1bmMgPSBmdW5jOwotCWJvb3QtPmFyZ3MgPSBhcmdzOwotCWJvb3QtPmtleXcgPSBrZXl3OwotCWJvb3QtPnRzdGF0ZSA9IF9QeVRocmVhZFN0YXRlX1ByZWFsbG9jKGJvb3QtPmludGVycCk7Ci0JaWYgKGJvb3QtPnRzdGF0ZSA9PSBOVUxMKSB7Ci0JCVB5TWVtX0RFTChib290KTsKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JfQotCVB5X0lOQ1JFRihmdW5jKTsKLQlQeV9JTkNSRUYoYXJncyk7Ci0JUHlfWElOQ1JFRihrZXl3KTsKLQlQeUV2YWxfSW5pdFRocmVhZHMoKTsgLyogU3RhcnQgdGhlIGludGVycHJldGVyJ3MgdGhyZWFkLWF3YXJlbmVzcyAqLwotCWlkZW50ID0gUHlUaHJlYWRfc3RhcnRfbmV3X3RocmVhZCh0X2Jvb3RzdHJhcCwgKHZvaWQqKSBib290KTsKLQlpZiAoaWRlbnQgPT0gLTEpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFRocmVhZEVycm9yLCAiY2FuJ3Qgc3RhcnQgbmV3IHRocmVhZCIpOwotCQlQeV9ERUNSRUYoZnVuYyk7Ci0JCVB5X0RFQ1JFRihhcmdzKTsKLQkJUHlfWERFQ1JFRihrZXl3KTsKLQkJUHlUaHJlYWRTdGF0ZV9DbGVhcihib290LT50c3RhdGUpOwotCQlQeU1lbV9ERUwoYm9vdCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoaWRlbnQpOworICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoZmFyZ3MsICJzdGFydF9uZXdfdGhyZWFkIiwgMiwgMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZmdW5jLCAmYXJncywgJmtleXcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5Q2FsbGFibGVfQ2hlY2soZnVuYykpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJmaXJzdCBhcmcgbXVzdCBiZSBjYWxsYWJsZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKCFQeVR1cGxlX0NoZWNrKGFyZ3MpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiMm5kIGFyZyBtdXN0IGJlIGEgdHVwbGUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChrZXl3ICE9IE5VTEwgJiYgIVB5RGljdF9DaGVjayhrZXl3KSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIm9wdGlvbmFsIDNyZCBhcmcgbXVzdCBiZSBhIGRpY3Rpb25hcnkiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGJvb3QgPSBQeU1lbV9ORVcoc3RydWN0IGJvb3RzdGF0ZSwgMSk7CisgICAgaWYgKGJvb3QgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgYm9vdC0+aW50ZXJwID0gUHlUaHJlYWRTdGF0ZV9HRVQoKS0+aW50ZXJwOworICAgIGJvb3QtPmZ1bmMgPSBmdW5jOworICAgIGJvb3QtPmFyZ3MgPSBhcmdzOworICAgIGJvb3QtPmtleXcgPSBrZXl3OworICAgIGJvb3QtPnRzdGF0ZSA9IF9QeVRocmVhZFN0YXRlX1ByZWFsbG9jKGJvb3QtPmludGVycCk7CisgICAgaWYgKGJvb3QtPnRzdGF0ZSA9PSBOVUxMKSB7CisgICAgICAgIFB5TWVtX0RFTChib290KTsKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgfQorICAgIFB5X0lOQ1JFRihmdW5jKTsKKyAgICBQeV9JTkNSRUYoYXJncyk7CisgICAgUHlfWElOQ1JFRihrZXl3KTsKKyAgICBQeUV2YWxfSW5pdFRocmVhZHMoKTsgLyogU3RhcnQgdGhlIGludGVycHJldGVyJ3MgdGhyZWFkLWF3YXJlbmVzcyAqLworICAgIGlkZW50ID0gUHlUaHJlYWRfc3RhcnRfbmV3X3RocmVhZCh0X2Jvb3RzdHJhcCwgKHZvaWQqKSBib290KTsKKyAgICBpZiAoaWRlbnQgPT0gLTEpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFRocmVhZEVycm9yLCAiY2FuJ3Qgc3RhcnQgbmV3IHRocmVhZCIpOworICAgICAgICBQeV9ERUNSRUYoZnVuYyk7CisgICAgICAgIFB5X0RFQ1JFRihhcmdzKTsKKyAgICAgICAgUHlfWERFQ1JFRihrZXl3KTsKKyAgICAgICAgUHlUaHJlYWRTdGF0ZV9DbGVhcihib290LT50c3RhdGUpOworICAgICAgICBQeU1lbV9ERUwoYm9vdCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoaWRlbnQpOwogfQogCiBQeURvY19TVFJWQVIoc3RhcnRfbmV3X2RvYywKQEAgLTUyMiw4ICs1MjIsOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHRocmVhZF9QeVRocmVhZF9leGl0X3RocmVhZChQeU9iamVjdCAqc2VsZikKIHsKLQlQeUVycl9TZXROb25lKFB5RXhjX1N5c3RlbUV4aXQpOwotCXJldHVybiBOVUxMOworICAgIFB5RXJyX1NldE5vbmUoUHlFeGNfU3lzdGVtRXhpdCk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIFB5RG9jX1NUUlZBUihleGl0X2RvYywKQEAgLTUzNiw5ICs1MzYsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHRocmVhZF9QeVRocmVhZF9pbnRlcnJ1cHRfbWFpbihQeU9iamVjdCAqIHNlbGYpCiB7Ci0JUHlFcnJfU2V0SW50ZXJydXB0KCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5RXJyX1NldEludGVycnVwdCgpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogUHlEb2NfU1RSVkFSKGludGVycnVwdF9kb2MsCkBAIC01NTIsMTEgKzU1MiwxMSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHRocmVhZF9QeVRocmVhZF9leGl0X3Byb2coUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBzdHM7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOmV4aXRfcHJvZyIsICZzdHMpKQotCQlyZXR1cm4gTlVMTDsKLQlQeV9FeGl0KHN0cyk7IC8qIENhbGxzIFB5VGhyZWFkX2V4aXRfcHJvZyhzdHMpIG9yIF9QeVRocmVhZF9leGl0X3Byb2coc3RzKSAqLwotCWZvciAoOzspIHsgfSAvKiBTaG91bGQgbm90IGJlIHJlYWNoZWQgKi8KKyAgICBpbnQgc3RzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpleGl0X3Byb2ciLCAmc3RzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfRXhpdChzdHMpOyAvKiBDYWxscyBQeVRocmVhZF9leGl0X3Byb2coc3RzKSBvciBfUHlUaHJlYWRfZXhpdF9wcm9nKHN0cykgKi8KKyAgICBmb3IgKDs7KSB7IH0gLyogU2hvdWxkIG5vdCBiZSByZWFjaGVkICovCiB9CiAjZW5kaWYKIApAQCAtNTY1LDcgKzU2NSw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogdGhyZWFkX1B5VGhyZWFkX2FsbG9jYXRlX2xvY2soUHlPYmplY3QgKnNlbGYpCiB7Ci0JcmV0dXJuIChQeU9iamVjdCAqKSBuZXdsb2Nrb2JqZWN0KCk7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKSBuZXdsb2Nrb2JqZWN0KCk7CiB9CiAKIFB5RG9jX1NUUlZBUihhbGxvY2F0ZV9kb2MsCkBAIC01NzcsMTMgKzU3NywxMyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHRocmVhZF9nZXRfaWRlbnQoUHlPYmplY3QgKnNlbGYpCiB7Ci0JbG9uZyBpZGVudDsKLQlpZGVudCA9IFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKTsKLQlpZiAoaWRlbnQgPT0gLTEpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFRocmVhZEVycm9yLCAibm8gY3VycmVudCB0aHJlYWQgaWRlbnQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBQeUludF9Gcm9tTG9uZyhpZGVudCk7CisgICAgbG9uZyBpZGVudDsKKyAgICBpZGVudCA9IFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKTsKKyAgICBpZiAoaWRlbnQgPT0gLTEpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFRocmVhZEVycm9yLCAibm8gY3VycmVudCB0aHJlYWQgaWRlbnQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhpZGVudCk7CiB9CiAKIFB5RG9jX1NUUlZBUihnZXRfaWRlbnRfZG9jLApAQCAtNjAwLDM1ICs2MDAsMzUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiB0aHJlYWRfc3RhY2tfc2l6ZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2l6ZV90IG9sZF9zaXplOwotCVB5X3NzaXplX3QgbmV3X3NpemUgPSAwOwotCWludCByYzsKKyAgICBzaXplX3Qgb2xkX3NpemU7CisgICAgUHlfc3NpemVfdCBuZXdfc2l6ZSA9IDA7CisgICAgaW50IHJjOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8bjpzdGFja19zaXplIiwgJm5ld19zaXplKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8bjpzdGFja19zaXplIiwgJm5ld19zaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAobmV3X3NpemUgPCAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJzaXplIG11c3QgYmUgMCBvciBhIHBvc2l0aXZlIHZhbHVlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAobmV3X3NpemUgPCAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInNpemUgbXVzdCBiZSAwIG9yIGEgcG9zaXRpdmUgdmFsdWUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0Jb2xkX3NpemUgPSBQeVRocmVhZF9nZXRfc3RhY2tzaXplKCk7CisgICAgb2xkX3NpemUgPSBQeVRocmVhZF9nZXRfc3RhY2tzaXplKCk7CiAKLQlyYyA9IFB5VGhyZWFkX3NldF9zdGFja3NpemUoKHNpemVfdCkgbmV3X3NpemUpOwotCWlmIChyYyA9PSAtMSkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKLQkJCSAgICAgInNpemUgbm90IHZhbGlkOiAlemQgYnl0ZXMiLAotCQkJICAgICBuZXdfc2l6ZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAocmMgPT0gLTIpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFRocmVhZEVycm9yLAotCQkJCSJzZXR0aW5nIHN0YWNrIHNpemUgbm90IHN1cHBvcnRlZCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgcmMgPSBQeVRocmVhZF9zZXRfc3RhY2tzaXplKChzaXplX3QpIG5ld19zaXplKTsKKyAgICBpZiAocmMgPT0gLTEpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAic2l6ZSBub3QgdmFsaWQ6ICV6ZCBieXRlcyIsCisgICAgICAgICAgICAgICAgICAgICBuZXdfc2l6ZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAocmMgPT0gLTIpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFRocmVhZEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInNldHRpbmcgc3RhY2sgc2l6ZSBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXJldHVybiBQeUludF9Gcm9tU3NpemVfdCgoUHlfc3NpemVfdCkgb2xkX3NpemUpOworICAgIHJldHVybiBQeUludF9Gcm9tU3NpemVfdCgoUHlfc3NpemVfdCkgb2xkX3NpemUpOwogfQogCiBQeURvY19TVFJWQVIoc3RhY2tfc2l6ZV9kb2MsCkBAIC02NTIsMzIgKzY1MiwzMiBAQAogdGhlIHN1Z2dlc3RlZCBhcHByb2FjaCBpbiB0aGUgYWJzZW5jZSBvZiBtb3JlIHNwZWNpZmljIGluZm9ybWF0aW9uKS4iKTsKIAogc3RhdGljIFB5TWV0aG9kRGVmIHRocmVhZF9tZXRob2RzW10gPSB7Ci0JeyJzdGFydF9uZXdfdGhyZWFkIiwJKFB5Q0Z1bmN0aW9uKXRocmVhZF9QeVRocmVhZF9zdGFydF9uZXdfdGhyZWFkLAotCSAgICAgICAgICAgICAgICAgICAgICAgIE1FVEhfVkFSQVJHUywKLQkJCQlzdGFydF9uZXdfZG9jfSwKLQl7InN0YXJ0X25ldyIsCQkoUHlDRnVuY3Rpb24pdGhyZWFkX1B5VGhyZWFkX3N0YXJ0X25ld190aHJlYWQsIAotCSAgICAgICAgICAgICAgICAgICAgICAgIE1FVEhfVkFSQVJHUywKLQkJCQlzdGFydF9uZXdfZG9jfSwKLQl7ImFsbG9jYXRlX2xvY2siLAkoUHlDRnVuY3Rpb24pdGhyZWFkX1B5VGhyZWFkX2FsbG9jYXRlX2xvY2ssIAotCSBNRVRIX05PQVJHUywgYWxsb2NhdGVfZG9jfSwKLQl7ImFsbG9jYXRlIiwJCShQeUNGdW5jdGlvbil0aHJlYWRfUHlUaHJlYWRfYWxsb2NhdGVfbG9jaywgCi0JIE1FVEhfTk9BUkdTLCBhbGxvY2F0ZV9kb2N9LAotCXsiZXhpdF90aHJlYWQiLAkJKFB5Q0Z1bmN0aW9uKXRocmVhZF9QeVRocmVhZF9leGl0X3RocmVhZCwgCi0JIE1FVEhfTk9BUkdTLCBleGl0X2RvY30sCi0JeyJleGl0IiwJCShQeUNGdW5jdGlvbil0aHJlYWRfUHlUaHJlYWRfZXhpdF90aHJlYWQsIAotCSBNRVRIX05PQVJHUywgZXhpdF9kb2N9LAotCXsiaW50ZXJydXB0X21haW4iLAkoUHlDRnVuY3Rpb24pdGhyZWFkX1B5VGhyZWFkX2ludGVycnVwdF9tYWluLAotCSBNRVRIX05PQVJHUywgaW50ZXJydXB0X2RvY30sCi0JeyJnZXRfaWRlbnQiLAkJKFB5Q0Z1bmN0aW9uKXRocmVhZF9nZXRfaWRlbnQsIAotCSBNRVRIX05PQVJHUywgZ2V0X2lkZW50X2RvY30sCi0JeyJzdGFja19zaXplIiwJCShQeUNGdW5jdGlvbil0aHJlYWRfc3RhY2tfc2l6ZSwKLQkJCQlNRVRIX1ZBUkFSR1MsCi0JCQkJc3RhY2tfc2l6ZV9kb2N9LAorICAgIHsic3RhcnRfbmV3X3RocmVhZCIsICAgICAgICAoUHlDRnVuY3Rpb24pdGhyZWFkX1B5VGhyZWFkX3N0YXJ0X25ld190aHJlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVUSF9WQVJBUkdTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0X25ld19kb2N9LAorICAgIHsic3RhcnRfbmV3IiwgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pdGhyZWFkX1B5VGhyZWFkX3N0YXJ0X25ld190aHJlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVUSF9WQVJBUkdTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0X25ld19kb2N9LAorICAgIHsiYWxsb2NhdGVfbG9jayIsICAgICAgICAgICAoUHlDRnVuY3Rpb24pdGhyZWFkX1B5VGhyZWFkX2FsbG9jYXRlX2xvY2ssCisgICAgIE1FVEhfTk9BUkdTLCBhbGxvY2F0ZV9kb2N9LAorICAgIHsiYWxsb2NhdGUiLCAgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pdGhyZWFkX1B5VGhyZWFkX2FsbG9jYXRlX2xvY2ssCisgICAgIE1FVEhfTk9BUkdTLCBhbGxvY2F0ZV9kb2N9LAorICAgIHsiZXhpdF90aHJlYWQiLCAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pdGhyZWFkX1B5VGhyZWFkX2V4aXRfdGhyZWFkLAorICAgICBNRVRIX05PQVJHUywgZXhpdF9kb2N9LAorICAgIHsiZXhpdCIsICAgICAgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pdGhyZWFkX1B5VGhyZWFkX2V4aXRfdGhyZWFkLAorICAgICBNRVRIX05PQVJHUywgZXhpdF9kb2N9LAorICAgIHsiaW50ZXJydXB0X21haW4iLCAgICAgICAgICAoUHlDRnVuY3Rpb24pdGhyZWFkX1B5VGhyZWFkX2ludGVycnVwdF9tYWluLAorICAgICBNRVRIX05PQVJHUywgaW50ZXJydXB0X2RvY30sCisgICAgeyJnZXRfaWRlbnQiLCAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbil0aHJlYWRfZ2V0X2lkZW50LAorICAgICBNRVRIX05PQVJHUywgZ2V0X2lkZW50X2RvY30sCisgICAgeyJzdGFja19zaXplIiwgICAgICAgICAgICAgIChQeUNGdW5jdGlvbil0aHJlYWRfc3RhY2tfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2tfc2l6ZV9kb2N9LAogI2lmbmRlZiBOT19FWElUX1BST0cKLQl7ImV4aXRfcHJvZyIsCQkoUHlDRnVuY3Rpb24pdGhyZWFkX1B5VGhyZWFkX2V4aXRfcHJvZywKLQkgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImV4aXRfcHJvZyIsICAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXRocmVhZF9QeVRocmVhZF9leGl0X3Byb2csCisgICAgIE1FVEhfVkFSQVJHU30sCiAjZW5kaWYKLQl7TlVMTCwJCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7TlVMTCwgICAgICAgICAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiAKQEAgLTcwMiwyOSArNzAyLDI5IEBACiBQeU1PRElOSVRfRlVOQwogaW5pdHRocmVhZCh2b2lkKQogewotCVB5T2JqZWN0ICptLCAqZDsKLQkKLQkvKiBJbml0aWFsaXplIHR5cGVzOiAqLwotCWlmIChQeVR5cGVfUmVhZHkoJmxvY2FsdHlwZSkgPCAwKQotCQlyZXR1cm47CisgICAgUHlPYmplY3QgKm0sICpkOwogCi0JLyogQ3JlYXRlIHRoZSBtb2R1bGUgYW5kIGFkZCB0aGUgZnVuY3Rpb25zICovCi0JbSA9IFB5X0luaXRNb2R1bGUzKCJ0aHJlYWQiLCB0aHJlYWRfbWV0aG9kcywgdGhyZWFkX2RvYyk7Ci0JaWYgKG0gPT0gTlVMTCkKLQkJcmV0dXJuOworICAgIC8qIEluaXRpYWxpemUgdHlwZXM6ICovCisgICAgaWYgKFB5VHlwZV9SZWFkeSgmbG9jYWx0eXBlKSA8IDApCisgICAgICAgIHJldHVybjsKIAotCS8qIEFkZCBhIHN5bWJvbGljIGNvbnN0YW50ICovCi0JZCA9IFB5TW9kdWxlX0dldERpY3QobSk7Ci0JVGhyZWFkRXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oInRocmVhZC5lcnJvciIsIE5VTEwsIE5VTEwpOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJlcnJvciIsIFRocmVhZEVycm9yKTsKLQlMb2NrdHlwZS50cF9kb2MgPSBsb2NrX2RvYzsKLQlQeV9JTkNSRUYoJkxvY2t0eXBlKTsKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTG9ja1R5cGUiLCAoUHlPYmplY3QgKikmTG9ja3R5cGUpOworICAgIC8qIENyZWF0ZSB0aGUgbW9kdWxlIGFuZCBhZGQgdGhlIGZ1bmN0aW9ucyAqLworICAgIG0gPSBQeV9Jbml0TW9kdWxlMygidGhyZWFkIiwgdGhyZWFkX21ldGhvZHMsIHRocmVhZF9kb2MpOworICAgIGlmIChtID09IE5VTEwpCisgICAgICAgIHJldHVybjsKIAotCVB5X0lOQ1JFRigmbG9jYWx0eXBlKTsKLQlpZiAoUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJfbG9jYWwiLCAoUHlPYmplY3QgKikmbG9jYWx0eXBlKSA8IDApCi0JCXJldHVybjsKKyAgICAvKiBBZGQgYSBzeW1ib2xpYyBjb25zdGFudCAqLworICAgIGQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOworICAgIFRocmVhZEVycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJ0aHJlYWQuZXJyb3IiLCBOVUxMLCBOVUxMKTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiZXJyb3IiLCBUaHJlYWRFcnJvcik7CisgICAgTG9ja3R5cGUudHBfZG9jID0gbG9ja19kb2M7CisgICAgUHlfSU5DUkVGKCZMb2NrdHlwZSk7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkxvY2tUeXBlIiwgKFB5T2JqZWN0ICopJkxvY2t0eXBlKTsKIAotCS8qIEluaXRpYWxpemUgdGhlIEMgdGhyZWFkIGxpYnJhcnkgKi8KLQlQeVRocmVhZF9pbml0X3RocmVhZCgpOworICAgIFB5X0lOQ1JFRigmbG9jYWx0eXBlKTsKKyAgICBpZiAoUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJfbG9jYWwiLCAoUHlPYmplY3QgKikmbG9jYWx0eXBlKSA8IDApCisgICAgICAgIHJldHVybjsKKworICAgIC8qIEluaXRpYWxpemUgdGhlIEMgdGhyZWFkIGxpYnJhcnkgKi8KKyAgICBQeVRocmVhZF9pbml0X3RocmVhZCgpOwogfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy90aW1lbW9kdWxlLmMgYi9Nb2R1bGVzL3RpbWVtb2R1bGUuYwppbmRleCBlOGRlMmM1Li5kNmQ0MTYwIDEwMDY0NAotLS0gYS9Nb2R1bGVzL3RpbWVtb2R1bGUuYworKysgYi9Nb2R1bGVzL3RpbWVtb2R1bGUuYwpAQCAtNDYsMTIgKzQ2LDEyIEBACiBzdGF0aWMgSEFORExFIGhJbnRlcnJ1cHRFdmVudCA9IE5VTEw7CiBzdGF0aWMgQk9PTCBXSU5BUEkgUHlDdHJsSGFuZGxlcihEV09SRCBkd0N0cmxUeXBlKQogewotCVNldEV2ZW50KGhJbnRlcnJ1cHRFdmVudCk7Ci0JLyogYWxsb3cgb3RoZXIgZGVmYXVsdCBoYW5kbGVycyB0byBiZSBjYWxsZWQuCi0JICAgRGVmYXVsdCBQeXRob24gaGFuZGxlciB3aWxsIHNldHVwIHRoZQotCSAgIEtleWJvYXJkSW50ZXJydXB0IGV4Y2VwdGlvbi4KLQkqLwotCXJldHVybiBGQUxTRTsKKyAgICBTZXRFdmVudChoSW50ZXJydXB0RXZlbnQpOworICAgIC8qIGFsbG93IG90aGVyIGRlZmF1bHQgaGFuZGxlcnMgdG8gYmUgY2FsbGVkLgorICAgICAgIERlZmF1bHQgUHl0aG9uIGhhbmRsZXIgd2lsbCBzZXR1cCB0aGUKKyAgICAgICBLZXlib2FyZEludGVycnVwdCBleGNlcHRpb24uCisgICAgKi8KKyAgICByZXR1cm4gRkFMU0U7CiB9CiBzdGF0aWMgbG9uZyBtYWluX3RocmVhZDsKIApAQCAtMTAyLDM4ICsxMDIsMzggQEAKIHRpbWVfdAogX1B5VGltZV9Eb3VibGVUb1RpbWV0KGRvdWJsZSB4KQogewotCXRpbWVfdCByZXN1bHQ7Ci0JZG91YmxlIGRpZmY7CisgICAgdGltZV90IHJlc3VsdDsKKyAgICBkb3VibGUgZGlmZjsKIAotCXJlc3VsdCA9ICh0aW1lX3QpeDsKLQkvKiBIb3cgbXVjaCBpbmZvIGRpZCB3ZSBsb3NlPyAgdGltZV90IG1heSBiZSBhbiBpbnRlZ3JhbCBvcgotCSAqIGZsb2F0aW5nIHR5cGUsIGFuZCB3ZSBkb24ndCBrbm93IHdoaWNoLiAgSWYgaXQncyBpbnRlZ3JhbCwKLQkgKiB3ZSBkb24ndCBrbm93IHdoZXRoZXIgQyB0cnVuY2F0ZXMsIHJvdW5kcywgcmV0dXJucyB0aGUgZmxvb3IsCi0JICogZXRjLiAgSWYgd2UgbG9zdCBhIHNlY29uZCBvciBtb3JlLCB0aGUgQyByb3VuZGluZyBpcwotCSAqIHVucmVhc29uYWJsZSwgb3IgdGhlIGlucHV0IGp1c3QgZG9lc24ndCBmaXQgaW4gYSB0aW1lX3Q7Ci0JICogY2FsbCBpdCBhbiBlcnJvciByZWdhcmRsZXNzLiAgTm90ZSB0aGF0IHRoZSBvcmlnaW5hbCBjYXN0IHRvCi0JICogdGltZV90IGNhbiBjYXVzZSBhIEMgZXJyb3IgdG9vLCBidXQgbm90aGluZyB3ZSBjYW4gZG8gdG8KLQkgKiB3b3JtIGFyb3VuZCB0aGF0LgotCSAqLwotCWRpZmYgPSB4IC0gKGRvdWJsZSlyZXN1bHQ7Ci0JaWYgKGRpZmYgPD0gLTEuMCB8fCBkaWZmID49IDEuMCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJICAgICAgICAgICAgICAgICJ0aW1lc3RhbXAgb3V0IG9mIHJhbmdlIGZvciBwbGF0Zm9ybSB0aW1lX3QiKTsKLQkJcmVzdWx0ID0gKHRpbWVfdCktMTsKLQl9Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICByZXN1bHQgPSAodGltZV90KXg7CisgICAgLyogSG93IG11Y2ggaW5mbyBkaWQgd2UgbG9zZT8gIHRpbWVfdCBtYXkgYmUgYW4gaW50ZWdyYWwgb3IKKyAgICAgKiBmbG9hdGluZyB0eXBlLCBhbmQgd2UgZG9uJ3Qga25vdyB3aGljaC4gIElmIGl0J3MgaW50ZWdyYWwsCisgICAgICogd2UgZG9uJ3Qga25vdyB3aGV0aGVyIEMgdHJ1bmNhdGVzLCByb3VuZHMsIHJldHVybnMgdGhlIGZsb29yLAorICAgICAqIGV0Yy4gIElmIHdlIGxvc3QgYSBzZWNvbmQgb3IgbW9yZSwgdGhlIEMgcm91bmRpbmcgaXMKKyAgICAgKiB1bnJlYXNvbmFibGUsIG9yIHRoZSBpbnB1dCBqdXN0IGRvZXNuJ3QgZml0IGluIGEgdGltZV90OworICAgICAqIGNhbGwgaXQgYW4gZXJyb3IgcmVnYXJkbGVzcy4gIE5vdGUgdGhhdCB0aGUgb3JpZ2luYWwgY2FzdCB0bworICAgICAqIHRpbWVfdCBjYW4gY2F1c2UgYSBDIGVycm9yIHRvbywgYnV0IG5vdGhpbmcgd2UgY2FuIGRvIHRvCisgICAgICogd29ybSBhcm91bmQgdGhhdC4KKyAgICAgKi8KKyAgICBkaWZmID0geCAtIChkb3VibGUpcmVzdWx0OworICAgIGlmIChkaWZmIDw9IC0xLjAgfHwgZGlmZiA+PSAxLjApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAidGltZXN0YW1wIG91dCBvZiByYW5nZSBmb3IgcGxhdGZvcm0gdGltZV90Iik7CisgICAgICAgIHJlc3VsdCA9ICh0aW1lX3QpLTE7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB0aW1lX3RpbWUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp1bnVzZWQpCiB7Ci0JZG91YmxlIHNlY3M7Ci0Jc2VjcyA9IGZsb2F0dGltZSgpOwotCWlmIChzZWNzID09IDAuMCkgewotCQlQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKHNlY3MpOworICAgIGRvdWJsZSBzZWNzOworICAgIHNlY3MgPSBmbG9hdHRpbWUoKTsKKyAgICBpZiAoc2VjcyA9PSAwLjApIHsKKyAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShzZWNzKTsKIH0KIAogUHlEb2NfU1RSVkFSKHRpbWVfZG9jLApAQCAtMTU1LDcgKzE1NSw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogdGltZV9jbG9jayhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnVudXNlZCkKIHsKLQlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKCgoZG91YmxlKWNsb2NrKCkpIC8gQ0xPQ0tTX1BFUl9TRUMpOworICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoKChkb3VibGUpY2xvY2soKSkgLyBDTE9DS1NfUEVSX1NFQyk7CiB9CiAjZW5kaWYgLyogSEFWRV9DTE9DSyAqLwogCkBAIC0xNjQsMjUgKzE2NCwyNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHRpbWVfY2xvY2soUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp1bnVzZWQpCiB7Ci0Jc3RhdGljIExBUkdFX0lOVEVHRVIgY3RyU3RhcnQ7Ci0Jc3RhdGljIGRvdWJsZSBkaXZpc29yID0gMC4wOwotCUxBUkdFX0lOVEVHRVIgbm93OwotCWRvdWJsZSBkaWZmOworICAgIHN0YXRpYyBMQVJHRV9JTlRFR0VSIGN0clN0YXJ0OworICAgIHN0YXRpYyBkb3VibGUgZGl2aXNvciA9IDAuMDsKKyAgICBMQVJHRV9JTlRFR0VSIG5vdzsKKyAgICBkb3VibGUgZGlmZjsKIAotCWlmIChkaXZpc29yID09IDAuMCkgewotCQlMQVJHRV9JTlRFR0VSIGZyZXE7Ci0JCVF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyKCZjdHJTdGFydCk7Ci0JCWlmICghUXVlcnlQZXJmb3JtYW5jZUZyZXF1ZW5jeSgmZnJlcSkgfHwgZnJlcS5RdWFkUGFydCA9PSAwKSB7Ci0JCQkvKiBVbmxpa2VseSB0byBoYXBwZW4gLSB0aGlzIHdvcmtzIG9uIGFsbCBpbnRlbAotCQkJICAgbWFjaGluZXMgYXQgbGVhc3QhICBSZXZlcnQgdG8gY2xvY2soKSAqLwotCQkJcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZSgoKGRvdWJsZSljbG9jaygpKSAvCi0JCQkJCQkgIENMT0NLU19QRVJfU0VDKTsKLQkJfQotCQlkaXZpc29yID0gKGRvdWJsZSlmcmVxLlF1YWRQYXJ0OwotCX0KLQlRdWVyeVBlcmZvcm1hbmNlQ291bnRlcigmbm93KTsKLQlkaWZmID0gKGRvdWJsZSkobm93LlF1YWRQYXJ0IC0gY3RyU3RhcnQuUXVhZFBhcnQpOwotCXJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoZGlmZiAvIGRpdmlzb3IpOworICAgIGlmIChkaXZpc29yID09IDAuMCkgeworICAgICAgICBMQVJHRV9JTlRFR0VSIGZyZXE7CisgICAgICAgIFF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyKCZjdHJTdGFydCk7CisgICAgICAgIGlmICghUXVlcnlQZXJmb3JtYW5jZUZyZXF1ZW5jeSgmZnJlcSkgfHwgZnJlcS5RdWFkUGFydCA9PSAwKSB7CisgICAgICAgICAgICAvKiBVbmxpa2VseSB0byBoYXBwZW4gLSB0aGlzIHdvcmtzIG9uIGFsbCBpbnRlbAorICAgICAgICAgICAgICAgbWFjaGluZXMgYXQgbGVhc3QhICBSZXZlcnQgdG8gY2xvY2soKSAqLworICAgICAgICAgICAgcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZSgoKGRvdWJsZSljbG9jaygpKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENMT0NLU19QRVJfU0VDKTsKKyAgICAgICAgfQorICAgICAgICBkaXZpc29yID0gKGRvdWJsZSlmcmVxLlF1YWRQYXJ0OworICAgIH0KKyAgICBRdWVyeVBlcmZvcm1hbmNlQ291bnRlcigmbm93KTsKKyAgICBkaWZmID0gKGRvdWJsZSkobm93LlF1YWRQYXJ0IC0gY3RyU3RhcnQuUXVhZFBhcnQpOworICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoZGlmZiAvIGRpdmlzb3IpOwogfQogCiAjZGVmaW5lIEhBVkVfQ0xPQ0sgLyogU28gaXQgZ2V0cyBpbmNsdWRlZCBpbiB0aGUgbWV0aG9kcyAqLwpAQCAtMjAwLDEzICsyMDAsMTMgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiB0aW1lX3NsZWVwKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlkb3VibGUgc2VjczsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImQ6c2xlZXAiLCAmc2VjcykpCi0JCXJldHVybiBOVUxMOwotCWlmIChmbG9hdHNsZWVwKHNlY3MpICE9IDApCi0JCXJldHVybiBOVUxMOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBkb3VibGUgc2VjczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImQ6c2xlZXAiLCAmc2VjcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChmbG9hdHNsZWVwKHNlY3MpICE9IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogUHlEb2NfU1RSVkFSKHNsZWVwX2RvYywKQEAgLTIxNiwyMyArMjE2LDIzIEBACiBhIGZsb2F0aW5nIHBvaW50IG51bWJlciBmb3Igc3Vic2Vjb25kIHByZWNpc2lvbi4iKTsKIAogc3RhdGljIFB5U3RydWN0U2VxdWVuY2VfRmllbGQgc3RydWN0X3RpbWVfdHlwZV9maWVsZHNbXSA9IHsKLQl7InRtX3llYXIiLCBOVUxMfSwKLQl7InRtX21vbiIsIE5VTEx9LAotCXsidG1fbWRheSIsIE5VTEx9LAotCXsidG1faG91ciIsIE5VTEx9LAotCXsidG1fbWluIiwgTlVMTH0sCi0JeyJ0bV9zZWMiLCBOVUxMfSwKLQl7InRtX3dkYXkiLCBOVUxMfSwKLQl7InRtX3lkYXkiLCBOVUxMfSwKLQl7InRtX2lzZHN0IiwgTlVMTH0sCi0JezB9CisgICAgeyJ0bV95ZWFyIiwgTlVMTH0sCisgICAgeyJ0bV9tb24iLCBOVUxMfSwKKyAgICB7InRtX21kYXkiLCBOVUxMfSwKKyAgICB7InRtX2hvdXIiLCBOVUxMfSwKKyAgICB7InRtX21pbiIsIE5VTEx9LAorICAgIHsidG1fc2VjIiwgTlVMTH0sCisgICAgeyJ0bV93ZGF5IiwgTlVMTH0sCisgICAgeyJ0bV95ZGF5IiwgTlVMTH0sCisgICAgeyJ0bV9pc2RzdCIsIE5VTEx9LAorICAgIHswfQogfTsKIAogc3RhdGljIFB5U3RydWN0U2VxdWVuY2VfRGVzYyBzdHJ1Y3RfdGltZV90eXBlX2Rlc2MgPSB7Ci0JInRpbWUuc3RydWN0X3RpbWUiLAotCU5VTEwsCi0Jc3RydWN0X3RpbWVfdHlwZV9maWVsZHMsCi0JOSwKKyAgICAidGltZS5zdHJ1Y3RfdGltZSIsCisgICAgTlVMTCwKKyAgICBzdHJ1Y3RfdGltZV90eXBlX2ZpZWxkcywKKyAgICA5LAogfTsKIAogc3RhdGljIGludCBpbml0aWFsaXplZDsKQEAgLTI0MSw0OCArMjQxLDQ4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogdG10b3R1cGxlKHN0cnVjdCB0bSAqcCkKIHsKLQlQeU9iamVjdCAqdiA9IFB5U3RydWN0U2VxdWVuY2VfTmV3KCZTdHJ1Y3RUaW1lVHlwZSk7Ci0JaWYgKHYgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgUHlPYmplY3QgKnYgPSBQeVN0cnVjdFNlcXVlbmNlX05ldygmU3RydWN0VGltZVR5cGUpOworICAgIGlmICh2ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCiAjZGVmaW5lIFNFVChpLHZhbCkgUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTSh2LCBpLCBQeUludF9Gcm9tTG9uZygobG9uZykgdmFsKSkKIAotCVNFVCgwLCBwLT50bV95ZWFyICsgMTkwMCk7Ci0JU0VUKDEsIHAtPnRtX21vbiArIDEpOwkgICAvKiBXYW50IEphbnVhcnkgPT0gMSAqLwotCVNFVCgyLCBwLT50bV9tZGF5KTsKLQlTRVQoMywgcC0+dG1faG91cik7Ci0JU0VUKDQsIHAtPnRtX21pbik7Ci0JU0VUKDUsIHAtPnRtX3NlYyk7Ci0JU0VUKDYsIChwLT50bV93ZGF5ICsgNikgJSA3KTsgLyogV2FudCBNb25kYXkgPT0gMCAqLwotCVNFVCg3LCBwLT50bV95ZGF5ICsgMSk7CSAgIC8qIFdhbnQgSmFudWFyeSwgMSA9PSAxICovCi0JU0VUKDgsIHAtPnRtX2lzZHN0KTsKKyAgICBTRVQoMCwgcC0+dG1feWVhciArIDE5MDApOworICAgIFNFVCgxLCBwLT50bV9tb24gKyAxKTsgICAgICAgICAvKiBXYW50IEphbnVhcnkgPT0gMSAqLworICAgIFNFVCgyLCBwLT50bV9tZGF5KTsKKyAgICBTRVQoMywgcC0+dG1faG91cik7CisgICAgU0VUKDQsIHAtPnRtX21pbik7CisgICAgU0VUKDUsIHAtPnRtX3NlYyk7CisgICAgU0VUKDYsIChwLT50bV93ZGF5ICsgNikgJSA3KTsgLyogV2FudCBNb25kYXkgPT0gMCAqLworICAgIFNFVCg3LCBwLT50bV95ZGF5ICsgMSk7ICAgICAgICAvKiBXYW50IEphbnVhcnksIDEgPT0gMSAqLworICAgIFNFVCg4LCBwLT50bV9pc2RzdCk7CiAjdW5kZWYgU0VUCi0JaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKLQkJUHlfWERFQ1JFRih2KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgIFB5X1hERUNSRUYodik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXJldHVybiB2OworICAgIHJldHVybiB2OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogdGltZV9jb252ZXJ0KGRvdWJsZSB3aGVuLCBzdHJ1Y3QgdG0gKiAoKmZ1bmN0aW9uKShjb25zdCB0aW1lX3QgKikpCiB7Ci0Jc3RydWN0IHRtICpwOwotCXRpbWVfdCB3aGVudCA9IF9QeVRpbWVfRG91YmxlVG9UaW1ldCh3aGVuKTsKKyAgICBzdHJ1Y3QgdG0gKnA7CisgICAgdGltZV90IHdoZW50ID0gX1B5VGltZV9Eb3VibGVUb1RpbWV0KHdoZW4pOwogCi0JaWYgKHdoZW50ID09ICh0aW1lX3QpLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZXJybm8gPSAwOwotCXAgPSBmdW5jdGlvbigmd2hlbnQpOwotCWlmIChwID09IE5VTEwpIHsKKyAgICBpZiAod2hlbnQgPT0gKHRpbWVfdCktMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBlcnJubyA9IDA7CisgICAgcCA9IGZ1bmN0aW9uKCZ3aGVudCk7CisgICAgaWYgKHAgPT0gTlVMTCkgewogI2lmZGVmIEVJTlZBTAotCQlpZiAoZXJybm8gPT0gMCkKLQkJCWVycm5vID0gRUlOVkFMOworICAgICAgICBpZiAoZXJybm8gPT0gMCkKKyAgICAgICAgICAgIGVycm5vID0gRUlOVkFMOwogI2VuZGlmCi0JCXJldHVybiBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfVmFsdWVFcnJvcik7Ci0JfQotCXJldHVybiB0bXRvdHVwbGUocCk7CisgICAgICAgIHJldHVybiBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfVmFsdWVFcnJvcik7CisgICAgfQorICAgIHJldHVybiB0bXRvdHVwbGUocCk7CiB9CiAKIC8qIFBhcnNlIGFyZyB0dXBsZSB0aGF0IGNhbiBjb250YWluIGFuIG9wdGlvbmFsIGZsb2F0LW9yLU5vbmUgdmFsdWU7CkBAIC0yOTIsMjggKzI5MiwyOCBAQAogc3RhdGljIGludAogcGFyc2VfdGltZV9kb3VibGVfYXJncyhQeU9iamVjdCAqYXJncywgY2hhciAqZm9ybWF0LCBkb3VibGUgKnB3aGVuKQogewotCVB5T2JqZWN0ICpvdCA9IE5VTEw7CisgICAgUHlPYmplY3QgKm90ID0gTlVMTDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCBmb3JtYXQsICZvdCkpCi0JCXJldHVybiAwOwotCWlmIChvdCA9PSBOVUxMIHx8IG90ID09IFB5X05vbmUpCi0JCSpwd2hlbiA9IGZsb2F0dGltZSgpOwotCWVsc2UgewotCQlkb3VibGUgd2hlbiA9IFB5RmxvYXRfQXNEb3VibGUob3QpOwotCQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkKLQkJCXJldHVybiAwOwotCQkqcHdoZW4gPSB3aGVuOwotCX0KLQlyZXR1cm4gMTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgZm9ybWF0LCAmb3QpKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAob3QgPT0gTlVMTCB8fCBvdCA9PSBQeV9Ob25lKQorICAgICAgICAqcHdoZW4gPSBmbG9hdHRpbWUoKTsKKyAgICBlbHNlIHsKKyAgICAgICAgZG91YmxlIHdoZW4gPSBQeUZsb2F0X0FzRG91YmxlKG90KTsKKyAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgKnB3aGVuID0gd2hlbjsKKyAgICB9CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB0aW1lX2dtdGltZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZG91YmxlIHdoZW47Ci0JaWYgKCFwYXJzZV90aW1lX2RvdWJsZV9hcmdzKGFyZ3MsICJ8TzpnbXRpbWUiLCAmd2hlbikpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiB0aW1lX2NvbnZlcnQod2hlbiwgZ210aW1lKTsKKyAgICBkb3VibGUgd2hlbjsKKyAgICBpZiAoIXBhcnNlX3RpbWVfZG91YmxlX2FyZ3MoYXJncywgInxPOmdtdGltZSIsICZ3aGVuKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIHRpbWVfY29udmVydCh3aGVuLCBnbXRpbWUpOwogfQogCiBQeURvY19TVFJWQVIoZ210aW1lX2RvYywKQEAgLTMyNiwxNSArMzI2LDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogdGltZV9sb2NhbHRpbWUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWRvdWJsZSB3aGVuOwotCWlmICghcGFyc2VfdGltZV9kb3VibGVfYXJncyhhcmdzLCAifE86bG9jYWx0aW1lIiwgJndoZW4pKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gdGltZV9jb252ZXJ0KHdoZW4sIGxvY2FsdGltZSk7CisgICAgZG91YmxlIHdoZW47CisgICAgaWYgKCFwYXJzZV90aW1lX2RvdWJsZV9hcmdzKGFyZ3MsICJ8Tzpsb2NhbHRpbWUiLCAmd2hlbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiB0aW1lX2NvbnZlcnQod2hlbiwgbG9jYWx0aW1lKTsKIH0KIAogUHlEb2NfU1RSVkFSKGxvY2FsdGltZV9kb2MsCiAibG9jYWx0aW1lKFtzZWNvbmRzXSkgLT4gKHRtX3llYXIsdG1fbW9uLHRtX21kYXksdG1faG91cix0bV9taW4sXG5cCi0JCQkgIHRtX3NlYyx0bV93ZGF5LHRtX3lkYXksdG1faXNkc3QpXG5cCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRtX3NlYyx0bV93ZGF5LHRtX3lkYXksdG1faXNkc3QpXG5cCiBcblwKIENvbnZlcnQgc2Vjb25kcyBzaW5jZSB0aGUgRXBvY2ggdG8gYSB0aW1lIHR1cGxlIGV4cHJlc3NpbmcgbG9jYWwgdGltZS5cblwKIFdoZW4gJ3NlY29uZHMnIGlzIG5vdCBwYXNzZWQgaW4sIGNvbnZlcnQgdGhlIGN1cnJlbnQgdGltZSBpbnN0ZWFkLiIpOwpAQCAtMzQyLDE2NiArMzQyLDE2NiBAQAogc3RhdGljIGludAogZ2V0dG1hcmcoUHlPYmplY3QgKmFyZ3MsIHN0cnVjdCB0bSAqcCkKIHsKLQlpbnQgeTsKLQltZW1zZXQoKHZvaWQgKikgcCwgJ1wwJywgc2l6ZW9mKHN0cnVjdCB0bSkpOworICAgIGludCB5OworICAgIG1lbXNldCgodm9pZCAqKSBwLCAnXDAnLCBzaXplb2Yoc3RydWN0IHRtKSk7CiAKLQlpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICIoaWlpaWlpaWlpKSIsCi0JCQkgJnksCi0JCQkgJnAtPnRtX21vbiwKLQkJCSAmcC0+dG1fbWRheSwKLQkJCSAmcC0+dG1faG91ciwKLQkJCSAmcC0+dG1fbWluLAotCQkJICZwLT50bV9zZWMsCi0JCQkgJnAtPnRtX3dkYXksCi0JCQkgJnAtPnRtX3lkYXksCi0JCQkgJnAtPnRtX2lzZHN0KSkKLQkJcmV0dXJuIDA7Ci0JaWYgKHkgPCAxOTAwKSB7Ci0JCVB5T2JqZWN0ICphY2NlcHQgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhtb2RkaWN0LAotCQkJCQkJCSJhY2NlcHQyZHllYXIiKTsKLQkJaWYgKGFjY2VwdCA9PSBOVUxMIHx8ICFQeUludF9DaGVjayhhY2NlcHQpIHx8Ci0JCSAgICBQeUludF9Bc0xvbmcoYWNjZXB0KSA9PSAwKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkJInllYXIgPj0gMTkwMCByZXF1aXJlZCIpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJaWYgKDY5IDw9IHkgJiYgeSA8PSA5OSkKLQkJCXkgKz0gMTkwMDsKLQkJZWxzZSBpZiAoMCA8PSB5ICYmIHkgPD0gNjgpCi0JCQl5ICs9IDIwMDA7Ci0JCWVsc2UgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJCSJ5ZWFyIG91dCBvZiByYW5nZSIpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0JcC0+dG1feWVhciA9IHkgLSAxOTAwOwotCXAtPnRtX21vbi0tOwotCXAtPnRtX3dkYXkgPSAocC0+dG1fd2RheSArIDEpICUgNzsKLQlwLT50bV95ZGF5LS07Ci0JcmV0dXJuIDE7CisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiKGlpaWlpaWlpaSkiLAorICAgICAgICAgICAgICAgICAgICAgJnksCisgICAgICAgICAgICAgICAgICAgICAmcC0+dG1fbW9uLAorICAgICAgICAgICAgICAgICAgICAgJnAtPnRtX21kYXksCisgICAgICAgICAgICAgICAgICAgICAmcC0+dG1faG91ciwKKyAgICAgICAgICAgICAgICAgICAgICZwLT50bV9taW4sCisgICAgICAgICAgICAgICAgICAgICAmcC0+dG1fc2VjLAorICAgICAgICAgICAgICAgICAgICAgJnAtPnRtX3dkYXksCisgICAgICAgICAgICAgICAgICAgICAmcC0+dG1feWRheSwKKyAgICAgICAgICAgICAgICAgICAgICZwLT50bV9pc2RzdCkpCisgICAgICAgIHJldHVybiAwOworICAgIGlmICh5IDwgMTkwMCkgeworICAgICAgICBQeU9iamVjdCAqYWNjZXB0ID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcobW9kZGljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhY2NlcHQyZHllYXIiKTsKKyAgICAgICAgaWYgKGFjY2VwdCA9PSBOVUxMIHx8ICFQeUludF9DaGVjayhhY2NlcHQpIHx8CisgICAgICAgICAgICBQeUludF9Bc0xvbmcoYWNjZXB0KSA9PSAwKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAieWVhciA+PSAxOTAwIHJlcXVpcmVkIik7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAoNjkgPD0geSAmJiB5IDw9IDk5KQorICAgICAgICAgICAgeSArPSAxOTAwOworICAgICAgICBlbHNlIGlmICgwIDw9IHkgJiYgeSA8PSA2OCkKKyAgICAgICAgICAgIHkgKz0gMjAwMDsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAieWVhciBvdXQgb2YgcmFuZ2UiKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorICAgIHAtPnRtX3llYXIgPSB5IC0gMTkwMDsKKyAgICBwLT50bV9tb24tLTsKKyAgICBwLT50bV93ZGF5ID0gKHAtPnRtX3dkYXkgKyAxKSAlIDc7CisgICAgcC0+dG1feWRheS0tOworICAgIHJldHVybiAxOwogfQogCiAjaWZkZWYgSEFWRV9TVFJGVElNRQogc3RhdGljIFB5T2JqZWN0ICoKIHRpbWVfc3RyZnRpbWUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICp0dXAgPSBOVUxMOwotCXN0cnVjdCB0bSBidWY7Ci0JY29uc3QgY2hhciAqZm10OwotCXNpemVfdCBmbXRsZW4sIGJ1ZmxlbjsKLQljaGFyICpvdXRidWYgPSAwOwotCXNpemVfdCBpOworICAgIFB5T2JqZWN0ICp0dXAgPSBOVUxMOworICAgIHN0cnVjdCB0bSBidWY7CisgICAgY29uc3QgY2hhciAqZm10OworICAgIHNpemVfdCBmbXRsZW4sIGJ1ZmxlbjsKKyAgICBjaGFyICpvdXRidWYgPSAwOworICAgIHNpemVfdCBpOwogCi0JbWVtc2V0KCh2b2lkICopICZidWYsICdcMCcsIHNpemVvZihidWYpKTsKKyAgICBtZW1zZXQoKHZvaWQgKikgJmJ1ZiwgJ1wwJywgc2l6ZW9mKGJ1ZikpOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzfE86c3RyZnRpbWUiLCAmZm10LCAmdHVwKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzfE86c3RyZnRpbWUiLCAmZm10LCAmdHVwKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAodHVwID09IE5VTEwpIHsKLQkJdGltZV90IHR0ID0gdGltZShOVUxMKTsKLQkJYnVmID0gKmxvY2FsdGltZSgmdHQpOwotCX0gZWxzZSBpZiAoIWdldHRtYXJnKHR1cCwgJmJ1ZikpCi0JCXJldHVybiBOVUxMOworICAgIGlmICh0dXAgPT0gTlVMTCkgeworICAgICAgICB0aW1lX3QgdHQgPSB0aW1lKE5VTEwpOworICAgICAgICBidWYgPSAqbG9jYWx0aW1lKCZ0dCk7CisgICAgfSBlbHNlIGlmICghZ2V0dG1hcmcodHVwLCAmYnVmKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLSAgICAgICAgLyogQ2hlY2tzIGFkZGVkIHRvIG1ha2Ugc3VyZSBzdHJmdGltZSgpIGRvZXMgbm90IGNyYXNoIFB5dGhvbiBieQotICAgICAgICAgICAgaW5kZXhpbmcgYmxpbmRseSBpbnRvIHNvbWUgYXJyYXkgZm9yIGEgdGV4dHVhbCByZXByZXNlbnRhdGlvbgotICAgICAgICAgICAgYnkgc29tZSBiYWQgaW5kZXggKGZpeGVzIGJ1ZyAjODk3NjI1KS4KKyAgICAvKiBDaGVja3MgYWRkZWQgdG8gbWFrZSBzdXJlIHN0cmZ0aW1lKCkgZG9lcyBub3QgY3Jhc2ggUHl0aG9uIGJ5CisgICAgICAgIGluZGV4aW5nIGJsaW5kbHkgaW50byBzb21lIGFycmF5IGZvciBhIHRleHR1YWwgcmVwcmVzZW50YXRpb24KKyAgICAgICAgYnkgc29tZSBiYWQgaW5kZXggKGZpeGVzIGJ1ZyAjODk3NjI1KS4KIAotCSAgICBBbHNvIHN1cHBvcnQgdmFsdWVzIG9mIHplcm8gZnJvbSBQeXRob24gY29kZSBmb3IgYXJndW1lbnRzIGluIHdoaWNoCi0JICAgIHRoYXQgaXMgb3V0IG9mIHJhbmdlIGJ5IGZvcmNpbmcgdGhhdCB2YWx1ZSB0byB0aGUgbG93ZXN0IHZhbHVlIHRoYXQKLQkgICAgaXMgdmFsaWQgKGZpeGVkIGJ1ZyAjMTUyMDkxNCkuCisgICAgICAgIEFsc28gc3VwcG9ydCB2YWx1ZXMgb2YgemVybyBmcm9tIFB5dGhvbiBjb2RlIGZvciBhcmd1bWVudHMgaW4gd2hpY2gKKyAgICAgICAgdGhhdCBpcyBvdXQgb2YgcmFuZ2UgYnkgZm9yY2luZyB0aGF0IHZhbHVlIHRvIHRoZSBsb3dlc3QgdmFsdWUgdGhhdAorICAgICAgICBpcyB2YWxpZCAoZml4ZWQgYnVnICMxNTIwOTE0KS4KIAotCSAgICBWYWxpZCByYW5nZXMgYmFzZWQgb24gd2hhdCBpcyBhbGxvd2VkIGluIHN0cnVjdCB0bToKKyAgICAgICAgVmFsaWQgcmFuZ2VzIGJhc2VkIG9uIHdoYXQgaXMgYWxsb3dlZCBpbiBzdHJ1Y3QgdG06CiAKLQkgICAgLSB0bV95ZWFyOiBbMCwgbWF4KGludCldICgxKQotCSAgICAtIHRtX21vbjogWzAsIDExXSAoMikKLQkgICAgLSB0bV9tZGF5OiBbMSwgMzFdCi0JICAgIC0gdG1faG91cjogWzAsIDIzXQotCSAgICAtIHRtX21pbjogWzAsIDU5XQotCSAgICAtIHRtX3NlYzogWzAsIDYwXQotCSAgICAtIHRtX3dkYXk6IFswLCA2XSAoMSkKLQkgICAgLSB0bV95ZGF5OiBbMCwgMzY1XSAoMikKLQkgICAgLSB0bV9pc2RzdDogWy1tYXgoaW50KSwgbWF4KGludCldCisgICAgICAgIC0gdG1feWVhcjogWzAsIG1heChpbnQpXSAoMSkKKyAgICAgICAgLSB0bV9tb246IFswLCAxMV0gKDIpCisgICAgICAgIC0gdG1fbWRheTogWzEsIDMxXQorICAgICAgICAtIHRtX2hvdXI6IFswLCAyM10KKyAgICAgICAgLSB0bV9taW46IFswLCA1OV0KKyAgICAgICAgLSB0bV9zZWM6IFswLCA2MF0KKyAgICAgICAgLSB0bV93ZGF5OiBbMCwgNl0gKDEpCisgICAgICAgIC0gdG1feWRheTogWzAsIDM2NV0gKDIpCisgICAgICAgIC0gdG1faXNkc3Q6IFstbWF4KGludCksIG1heChpbnQpXQogCi0JICAgICgxKSBnZXR0bWFyZygpIGhhbmRsZXMgYm91bmRzLWNoZWNraW5nLgotCSAgICAoMikgUHl0aG9uJ3MgYWNjZXB0YWJsZSByYW5nZSBpcyBvbmUgZ3JlYXRlciB0aGFuIHRoZSByYW5nZSBpbiBDLAotCSAgICAgICAgdGh1cyBuZWVkIHRvIGNoZWNrIGFnYWluc3QgYXV0b21hdGljIGRlY3JlbWVudCBieSBnZXR0bWFyZygpLgotICAgICAgICAqLwotCWlmIChidWYudG1fbW9uID09IC0xKQotCSAgICBidWYudG1fbW9uID0gMDsKLQllbHNlIGlmIChidWYudG1fbW9uIDwgMCB8fCBidWYudG1fbW9uID4gMTEpIHsKLSAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAibW9udGggb3V0IG9mIHJhbmdlIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgKDEpIGdldHRtYXJnKCkgaGFuZGxlcyBib3VuZHMtY2hlY2tpbmcuCisgICAgICAgICgyKSBQeXRob24ncyBhY2NlcHRhYmxlIHJhbmdlIGlzIG9uZSBncmVhdGVyIHRoYW4gdGhlIHJhbmdlIGluIEMsCisgICAgICAgIHRodXMgbmVlZCB0byBjaGVjayBhZ2FpbnN0IGF1dG9tYXRpYyBkZWNyZW1lbnQgYnkgZ2V0dG1hcmcoKS4KKyAgICAqLworICAgIGlmIChidWYudG1fbW9uID09IC0xKQorICAgICAgICBidWYudG1fbW9uID0gMDsKKyAgICBlbHNlIGlmIChidWYudG1fbW9uIDwgMCB8fCBidWYudG1fbW9uID4gMTEpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJtb250aCBvdXQgb2YgcmFuZ2UiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChidWYudG1fbWRheSA9PSAwKQorICAgICAgICBidWYudG1fbWRheSA9IDE7CisgICAgZWxzZSBpZiAoYnVmLnRtX21kYXkgPCAwIHx8IGJ1Zi50bV9tZGF5ID4gMzEpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJkYXkgb2YgbW9udGggb3V0IG9mIHJhbmdlIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoYnVmLnRtX2hvdXIgPCAwIHx8IGJ1Zi50bV9ob3VyID4gMjMpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJob3VyIG91dCBvZiByYW5nZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKGJ1Zi50bV9taW4gPCAwIHx8IGJ1Zi50bV9taW4gPiA1OSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIm1pbnV0ZSBvdXQgb2YgcmFuZ2UiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChidWYudG1fc2VjIDwgMCB8fCBidWYudG1fc2VjID4gNjEpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJzZWNvbmRzIG91dCBvZiByYW5nZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgLyogdG1fd2RheSBkb2VzIG5vdCBuZWVkIGNoZWNraW5nIG9mIGl0cyB1cHBlci1ib3VuZCBzaW5jZSB0YWtpbmcKKyAgICBgYCUgN2BgIGluIGdldHRtYXJnKCkgYXV0b21hdGljYWxseSByZXN0cmljdHMgdGhlIHJhbmdlLiAqLworICAgIGlmIChidWYudG1fd2RheSA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJkYXkgb2Ygd2VlayBvdXQgb2YgcmFuZ2UiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChidWYudG1feWRheSA9PSAtMSkKKyAgICAgICAgYnVmLnRtX3lkYXkgPSAwOworICAgIGVsc2UgaWYgKGJ1Zi50bV95ZGF5IDwgMCB8fCBidWYudG1feWRheSA+IDM2NSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImRheSBvZiB5ZWFyIG91dCBvZiByYW5nZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKGJ1Zi50bV9pc2RzdCA8IC0xIHx8IGJ1Zi50bV9pc2RzdCA+IDEpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiZGF5bGlnaHQgc2F2aW5ncyBmbGFnIG91dCBvZiByYW5nZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBmbXRsZW4gPSBzdHJsZW4oZm10KTsKKworICAgIC8qIEkgaGF0ZSB0aGVzZSBmdW5jdGlvbnMgdGhhdCBwcmVzdW1lIHlvdSBrbm93IGhvdyBiaWcgdGhlIG91dHB1dAorICAgICAqIHdpbGwgYmUgYWhlYWQgb2YgdGltZS4uLgorICAgICAqLworICAgIGZvciAoaSA9IDEwMjQ7IDsgaSArPSBpKSB7CisgICAgICAgIG91dGJ1ZiA9IChjaGFyICopbWFsbG9jKGkpOworICAgICAgICBpZiAob3V0YnVmID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOwogICAgICAgICB9Ci0JaWYgKGJ1Zi50bV9tZGF5ID09IDApCi0JICAgIGJ1Zi50bV9tZGF5ID0gMTsKLQllbHNlIGlmIChidWYudG1fbWRheSA8IDAgfHwgYnVmLnRtX21kYXkgPiAzMSkgewotICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJkYXkgb2YgbW9udGggb3V0IG9mIHJhbmdlIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgYnVmbGVuID0gc3RyZnRpbWUob3V0YnVmLCBpLCBmbXQsICZidWYpOworICAgICAgICBpZiAoYnVmbGVuID4gMCB8fCBpID49IDI1NiAqIGZtdGxlbikgeworICAgICAgICAgICAgLyogSWYgdGhlIGJ1ZmZlciBpcyAyNTYgdGltZXMgYXMgbG9uZyBhcyB0aGUgZm9ybWF0LAorICAgICAgICAgICAgICAgaXQncyBwcm9iYWJseSBub3QgZmFpbGluZyBmb3IgbGFjayBvZiByb29tIQorICAgICAgICAgICAgICAgTW9yZSBsaWtlbHksIHRoZSBmb3JtYXQgeWllbGRzIGFuIGVtcHR5IHJlc3VsdCwKKyAgICAgICAgICAgICAgIGUuZy4gYW4gZW1wdHkgZm9ybWF0LCBvciAlWiB3aGVuIHRoZSB0aW1lem9uZQorICAgICAgICAgICAgICAgaXMgdW5rbm93bi4gKi8KKyAgICAgICAgICAgIFB5T2JqZWN0ICpyZXQ7CisgICAgICAgICAgICByZXQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShvdXRidWYsIGJ1Zmxlbik7CisgICAgICAgICAgICBmcmVlKG91dGJ1Zik7CisgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICB9Ci0gICAgICAgIGlmIChidWYudG1faG91ciA8IDAgfHwgYnVmLnRtX2hvdXIgPiAyMykgewotICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJob3VyIG91dCBvZiByYW5nZSIpOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJ1Zi50bV9taW4gPCAwIHx8IGJ1Zi50bV9taW4gPiA1OSkgewotICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJtaW51dGUgb3V0IG9mIHJhbmdlIik7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBpZiAoYnVmLnRtX3NlYyA8IDAgfHwgYnVmLnRtX3NlYyA+IDYxKSB7Ci0gICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgInNlY29uZHMgb3V0IG9mIHJhbmdlIik7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICAvKiB0bV93ZGF5IGRvZXMgbm90IG5lZWQgY2hlY2tpbmcgb2YgaXRzIHVwcGVyLWJvdW5kIHNpbmNlIHRha2luZwotICAgICAgICBgYCUgN2BgIGluIGdldHRtYXJnKCkgYXV0b21hdGljYWxseSByZXN0cmljdHMgdGhlIHJhbmdlLiAqLwotICAgICAgICBpZiAoYnVmLnRtX3dkYXkgPCAwKSB7Ci0gICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImRheSBvZiB3ZWVrIG91dCBvZiByYW5nZSIpOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLQlpZiAoYnVmLnRtX3lkYXkgPT0gLTEpCi0JICAgIGJ1Zi50bV95ZGF5ID0gMDsKLQllbHNlIGlmIChidWYudG1feWRheSA8IDAgfHwgYnVmLnRtX3lkYXkgPiAzNjUpIHsKLSAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiZGF5IG9mIHllYXIgb3V0IG9mIHJhbmdlIik7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBpZiAoYnVmLnRtX2lzZHN0IDwgLTEgfHwgYnVmLnRtX2lzZHN0ID4gMSkgewotICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgImRheWxpZ2h0IHNhdmluZ3MgZmxhZyBvdXQgb2YgcmFuZ2UiKTsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0KLQlmbXRsZW4gPSBzdHJsZW4oZm10KTsKLQotCS8qIEkgaGF0ZSB0aGVzZSBmdW5jdGlvbnMgdGhhdCBwcmVzdW1lIHlvdSBrbm93IGhvdyBiaWcgdGhlIG91dHB1dAotCSAqIHdpbGwgYmUgYWhlYWQgb2YgdGltZS4uLgotCSAqLwotCWZvciAoaSA9IDEwMjQ7IDsgaSArPSBpKSB7Ci0JCW91dGJ1ZiA9IChjaGFyICopbWFsbG9jKGkpOwotCQlpZiAob3V0YnVmID09IE5VTEwpIHsKLQkJCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCQl9Ci0JCWJ1ZmxlbiA9IHN0cmZ0aW1lKG91dGJ1ZiwgaSwgZm10LCAmYnVmKTsKLQkJaWYgKGJ1ZmxlbiA+IDAgfHwgaSA+PSAyNTYgKiBmbXRsZW4pIHsKLQkJCS8qIElmIHRoZSBidWZmZXIgaXMgMjU2IHRpbWVzIGFzIGxvbmcgYXMgdGhlIGZvcm1hdCwKLQkJCSAgIGl0J3MgcHJvYmFibHkgbm90IGZhaWxpbmcgZm9yIGxhY2sgb2Ygcm9vbSEKLQkJCSAgIE1vcmUgbGlrZWx5LCB0aGUgZm9ybWF0IHlpZWxkcyBhbiBlbXB0eSByZXN1bHQsCi0JCQkgICBlLmcuIGFuIGVtcHR5IGZvcm1hdCwgb3IgJVogd2hlbiB0aGUgdGltZXpvbmUKLQkJCSAgIGlzIHVua25vd24uICovCi0JCQlQeU9iamVjdCAqcmV0OwotCQkJcmV0ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUob3V0YnVmLCBidWZsZW4pOwotCQkJZnJlZShvdXRidWYpOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCQlmcmVlKG91dGJ1Zik7CisgICAgICAgIGZyZWUob3V0YnVmKTsKICNpZiBkZWZpbmVkIF9NU0NfVkVSICYmIF9NU0NfVkVSID49IDE0MDAgJiYgZGVmaW5lZChfX1NURENfU0VDVVJFX0xJQl9fKQotCQkvKiBWaXN1YWxTdHVkaW8gLk5FVCAyMDA1IGRvZXMgdGhpcyBwcm9wZXJseSAqLwotCQlpZiAoYnVmbGVuID09IDAgJiYgZXJybm8gPT0gRUlOVkFMKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIkludmFsaWQgZm9ybWF0IHN0cmluZyIpOwotCQkJcmV0dXJuIDA7Ci0JCX0KKyAgICAgICAgLyogVmlzdWFsU3R1ZGlvIC5ORVQgMjAwNSBkb2VzIHRoaXMgcHJvcGVybHkgKi8KKyAgICAgICAgaWYgKGJ1ZmxlbiA9PSAwICYmIGVycm5vID09IEVJTlZBTCkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJJbnZhbGlkIGZvcm1hdCBzdHJpbmciKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CiAjZW5kaWYKLQkJCi0JfQorCisgICAgfQogfQogCiBQeURvY19TVFJWQVIoc3RyZnRpbWVfZG9jLApAQCAtNTE5LDcgKzUxOSw3IEBACiAgICAgUHlPYmplY3QgKnN0cnB0aW1lX3Jlc3VsdDsKIAogICAgIGlmICghc3RycHRpbWVfbW9kdWxlKQotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gTlVMTDsKICAgICBzdHJwdGltZV9yZXN1bHQgPSBQeU9iamVjdF9DYWxsTWV0aG9kKHN0cnB0aW1lX21vZHVsZSwgIl9zdHJwdGltZV90aW1lIiwgIk8iLCBhcmdzKTsKICAgICBQeV9ERUNSRUYoc3RycHRpbWVfbW9kdWxlKTsKICAgICByZXR1cm4gc3RycHRpbWVfcmVzdWx0OwpAQCAtNTM1LDIwICs1MzUsMjAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiB0aW1lX2FzY3RpbWUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICp0dXAgPSBOVUxMOwotCXN0cnVjdCB0bSBidWY7Ci0JY2hhciAqcDsKLQlpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJhc2N0aW1lIiwgMCwgMSwgJnR1cCkpCi0JCXJldHVybiBOVUxMOwotCWlmICh0dXAgPT0gTlVMTCkgewotCQl0aW1lX3QgdHQgPSB0aW1lKE5VTEwpOwotCQlidWYgPSAqbG9jYWx0aW1lKCZ0dCk7Ci0JfSBlbHNlIGlmICghZ2V0dG1hcmcodHVwLCAmYnVmKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcCA9IGFzY3RpbWUoJmJ1Zik7Ci0JaWYgKHBbMjRdID09ICdcbicpCi0JCXBbMjRdID0gJ1wwJzsKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhwKTsKKyAgICBQeU9iamVjdCAqdHVwID0gTlVMTDsKKyAgICBzdHJ1Y3QgdG0gYnVmOworICAgIGNoYXIgKnA7CisgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiYXNjdGltZSIsIDAsIDEsICZ0dXApKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAodHVwID09IE5VTEwpIHsKKyAgICAgICAgdGltZV90IHR0ID0gdGltZShOVUxMKTsKKyAgICAgICAgYnVmID0gKmxvY2FsdGltZSgmdHQpOworICAgIH0gZWxzZSBpZiAoIWdldHRtYXJnKHR1cCwgJmJ1ZikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHAgPSBhc2N0aW1lKCZidWYpOworICAgIGlmIChwWzI0XSA9PSAnXG4nKQorICAgICAgICBwWzI0XSA9ICdcMCc7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcocCk7CiB9CiAKIFB5RG9jX1NUUlZBUihhc2N0aW1lX2RvYywKQEAgLTU2MSwzMCArNTYxLDMwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogdGltZV9jdGltZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKm90ID0gTlVMTDsKLQl0aW1lX3QgdHQ7Ci0JY2hhciAqcDsKKyAgICBQeU9iamVjdCAqb3QgPSBOVUxMOworICAgIHRpbWVfdCB0dDsKKyAgICBjaGFyICpwOwogCi0JaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiY3RpbWUiLCAwLCAxLCAmb3QpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAob3QgPT0gTlVMTCB8fCBvdCA9PSBQeV9Ob25lKQotCQl0dCA9IHRpbWUoTlVMTCk7Ci0JZWxzZSB7Ci0JCWRvdWJsZSBkdCA9IFB5RmxvYXRfQXNEb3VibGUob3QpOwotCQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkKLQkJCXJldHVybiBOVUxMOwotCQl0dCA9IF9QeVRpbWVfRG91YmxlVG9UaW1ldChkdCk7Ci0JCWlmICh0dCA9PSAodGltZV90KS0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcCA9IGN0aW1lKCZ0dCk7Ci0JaWYgKHAgPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgInVuY29udmVydGlibGUgdGltZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKHBbMjRdID09ICdcbicpCi0JCXBbMjRdID0gJ1wwJzsKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhwKTsKKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJjdGltZSIsIDAsIDEsICZvdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChvdCA9PSBOVUxMIHx8IG90ID09IFB5X05vbmUpCisgICAgICAgIHR0ID0gdGltZShOVUxMKTsKKyAgICBlbHNlIHsKKyAgICAgICAgZG91YmxlIGR0ID0gUHlGbG9hdF9Bc0RvdWJsZShvdCk7CisgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHR0ID0gX1B5VGltZV9Eb3VibGVUb1RpbWV0KGR0KTsKKyAgICAgICAgaWYgKHR0ID09ICh0aW1lX3QpLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBwID0gY3RpbWUoJnR0KTsKKyAgICBpZiAocCA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAidW5jb252ZXJ0aWJsZSB0aW1lIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAocFsyNF0gPT0gJ1xuJykKKyAgICAgICAgcFsyNF0gPSAnXDAnOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKHApOwogfQogCiBQeURvY19TVFJWQVIoY3RpbWVfZG9jLApAQCAtNTk4LDE3ICs1OTgsMTcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiB0aW1lX21rdGltZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnR1cCkKIHsKLQlzdHJ1Y3QgdG0gYnVmOwotCXRpbWVfdCB0dDsKLQlpZiAoIWdldHRtYXJnKHR1cCwgJmJ1ZikpCi0JCXJldHVybiBOVUxMOwotCXR0ID0gbWt0aW1lKCZidWYpOwotCWlmICh0dCA9PSAodGltZV90KSgtMSkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0JCQkJIm1rdGltZSBhcmd1bWVudCBvdXQgb2YgcmFuZ2UiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoKGRvdWJsZSl0dCk7CisgICAgc3RydWN0IHRtIGJ1ZjsKKyAgICB0aW1lX3QgdHQ7CisgICAgaWYgKCFnZXR0bWFyZyh0dXAsICZidWYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB0dCA9IG1rdGltZSgmYnVmKTsKKyAgICBpZiAodHQgPT0gKHRpbWVfdCkoLTEpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIm1rdGltZSBhcmd1bWVudCBvdXQgb2YgcmFuZ2UiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoKGRvdWJsZSl0dCk7CiB9CiAKIFB5RG9jX1NUUlZBUihta3RpbWVfZG9jLApAQCAtNjIzLDIxICs2MjMsMjEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiB0aW1lX3R6c2V0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdW51c2VkKQogewotCVB5T2JqZWN0KiBtOworICAgIFB5T2JqZWN0KiBtOwogCi0JbSA9IFB5SW1wb3J0X0ltcG9ydE1vZHVsZU5vQmxvY2soInRpbWUiKTsKLQlpZiAobSA9PSBOVUxMKSB7Ci0JICAgIHJldHVybiBOVUxMOwotCX0KKyAgICBtID0gUHlJbXBvcnRfSW1wb3J0TW9kdWxlTm9CbG9jaygidGltZSIpOworICAgIGlmIChtID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JdHpzZXQoKTsKKyAgICB0enNldCgpOwogCi0JLyogUmVzZXQgdGltZXpvbmUsIGFsdHpvbmUsIGRheWxpZ2h0IGFuZCB0em5hbWUgKi8KLQlpbml0dGltZXpvbmUobSk7Ci0JUHlfREVDUkVGKG0pOworICAgIC8qIFJlc2V0IHRpbWV6b25lLCBhbHR6b25lLCBkYXlsaWdodCBhbmQgdHpuYW1lICovCisgICAgaW5pdHRpbWV6b25lKG0pOworICAgIFB5X0RFQ1JFRihtKTsKIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIFB5RG9jX1NUUlZBUih0enNldF9kb2MsCkBAIC02NTcsMTEzICs2NTcsMTEzIEBACiBzdGF0aWMgdm9pZAogaW5pdHRpbWV6b25lKFB5T2JqZWN0ICptKSB7CiAgICAgLyogVGhpcyBjb2RlIG1vdmVkIGZyb20gaW5pdHRpbWUgd2hvbGVzYWxlIHRvIGFsbG93IGNhbGxpbmcgaXQgZnJvbQotCXRpbWVfdHpzZXQuIEluIHRoZSBmdXR1cmUsIHNvbWUgcGFydHMgb2YgaXQgY2FuIGJlIG1vdmVkIGJhY2sKLQkoZm9yIHBsYXRmb3JtcyB0aGF0IGRvbid0IEhBVkVfV09SS0lOR19UWlNFVCwgd2hlbiB3ZSBrbm93IHdoYXQgdGhleQotCWFyZSksIGFuZCB0aGUgZXh0cmFuZW91cyBjYWxscyB0byB0enNldCgzKSBzaG91bGQgYmUgcmVtb3ZlZC4KLQlJIGhhdmVuJ3QgZG9uZSB0aGlzIHlldCwgYXMgSSBkb24ndCB3YW50IHRvIGNoYW5nZSB0aGlzIGNvZGUgYXMKLQlsaXR0bGUgYXMgcG9zc2libGUgd2hlbiBpbnRyb2R1Y2luZyB0aGUgdGltZS50enNldCBhbmQgdGltZS50enNldHdhbGwKLQltZXRob2RzLiBUaGlzIHNob3VsZCBzaW1wbHkgYmUgYSBtZXRob2Qgb2YgZG9pbmcgdGhlIGZvbGxvd2luZyBvbmNlLAotCWF0IHRoZSB0b3Agb2YgdGhpcyBmdW5jdGlvbiBhbmQgcmVtb3ZpbmcgdGhlIGNhbGwgdG8gdHpzZXQoKSBmcm9tCi0JdGltZV90enNldCgpOgorICAgIHRpbWVfdHpzZXQuIEluIHRoZSBmdXR1cmUsIHNvbWUgcGFydHMgb2YgaXQgY2FuIGJlIG1vdmVkIGJhY2sKKyAgICAoZm9yIHBsYXRmb3JtcyB0aGF0IGRvbid0IEhBVkVfV09SS0lOR19UWlNFVCwgd2hlbiB3ZSBrbm93IHdoYXQgdGhleQorICAgIGFyZSksIGFuZCB0aGUgZXh0cmFuZW91cyBjYWxscyB0byB0enNldCgzKSBzaG91bGQgYmUgcmVtb3ZlZC4KKyAgICBJIGhhdmVuJ3QgZG9uZSB0aGlzIHlldCwgYXMgSSBkb24ndCB3YW50IHRvIGNoYW5nZSB0aGlzIGNvZGUgYXMKKyAgICBsaXR0bGUgYXMgcG9zc2libGUgd2hlbiBpbnRyb2R1Y2luZyB0aGUgdGltZS50enNldCBhbmQgdGltZS50enNldHdhbGwKKyAgICBtZXRob2RzLiBUaGlzIHNob3VsZCBzaW1wbHkgYmUgYSBtZXRob2Qgb2YgZG9pbmcgdGhlIGZvbGxvd2luZyBvbmNlLAorICAgIGF0IHRoZSB0b3Agb2YgdGhpcyBmdW5jdGlvbiBhbmQgcmVtb3ZpbmcgdGhlIGNhbGwgdG8gdHpzZXQoKSBmcm9tCisgICAgdGltZV90enNldCgpOgogCi0JICAgICNpZmRlZiBIQVZFX1RaU0VUCi0JICAgIHR6c2V0KCkKLQkgICAgI2VuZGlmCisgICAgICAgICNpZmRlZiBIQVZFX1RaU0VUCisgICAgICAgIHR6c2V0KCkKKyAgICAgICAgI2VuZGlmCiAKLQlBbmQgSSdtIGxhenkgYW5kIGhhdGUgQyBzbyBueWVyLgorICAgIEFuZCBJJ20gbGF6eSBhbmQgaGF0ZSBDIHNvIG55ZXIuCiAgICAgICovCiAjaWYgZGVmaW5lZChIQVZFX1RaTkFNRSkgJiYgIWRlZmluZWQoX19HTElCQ19fKSAmJiAhZGVmaW5lZChfX0NZR1dJTl9fKQotCXR6c2V0KCk7CisgICAgdHpzZXQoKTsKICNpZmRlZiBQWU9TX09TMgotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJ0aW1lem9uZSIsIF90aW1lem9uZSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgInRpbWV6b25lIiwgX3RpbWV6b25lKTsKICNlbHNlIC8qICFQWU9TX09TMiAqLwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJ0aW1lem9uZSIsIHRpbWV6b25lKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAidGltZXpvbmUiLCB0aW1lem9uZSk7CiAjZW5kaWYgLyogUFlPU19PUzIgKi8KICNpZmRlZiBIQVZFX0FMVFpPTkUKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiYWx0em9uZSIsIGFsdHpvbmUpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJhbHR6b25lIiwgYWx0em9uZSk7CiAjZWxzZQogI2lmZGVmIFBZT1NfT1MyCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgImFsdHpvbmUiLCBfdGltZXpvbmUtMzYwMCk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgImFsdHpvbmUiLCBfdGltZXpvbmUtMzYwMCk7CiAjZWxzZSAvKiAhUFlPU19PUzIgKi8KLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiYWx0em9uZSIsIHRpbWV6b25lLTM2MDApOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJhbHR6b25lIiwgdGltZXpvbmUtMzYwMCk7CiAjZW5kaWYgLyogUFlPU19PUzIgKi8KICNlbmRpZgotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJkYXlsaWdodCIsIGRheWxpZ2h0KTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgInR6bmFtZSIsCi0JCQkgICBQeV9CdWlsZFZhbHVlKCIoenopIiwgdHpuYW1lWzBdLCB0em5hbWVbMV0pKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiZGF5bGlnaHQiLCBkYXlsaWdodCk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJ0em5hbWUiLAorICAgICAgICAgICAgICAgICAgICAgICBQeV9CdWlsZFZhbHVlKCIoenopIiwgdHpuYW1lWzBdLCB0em5hbWVbMV0pKTsKICNlbHNlIC8qICFIQVZFX1RaTkFNRSB8fCBfX0dMSUJDX18gfHwgX19DWUdXSU5fXyovCiAjaWZkZWYgSEFWRV9TVFJVQ1RfVE1fVE1fWk9ORQotCXsKKyAgICB7CiAjZGVmaW5lIFlFQVIgKCh0aW1lX3QpKCgzNjUgKiAyNCArIDYpICogMzYwMCkpCi0JCXRpbWVfdCB0OwotCQlzdHJ1Y3QgdG0gKnA7Ci0JCWxvbmcgamFuem9uZSwganVseXpvbmU7Ci0JCWNoYXIgamFubmFtZVsxMF0sIGp1bHluYW1lWzEwXTsKLQkJdCA9ICh0aW1lKCh0aW1lX3QgKikwKSAvIFlFQVIpICogWUVBUjsKLQkJcCA9IGxvY2FsdGltZSgmdCk7Ci0JCWphbnpvbmUgPSAtcC0+dG1fZ210b2ZmOwotCQlzdHJuY3B5KGphbm5hbWUsIHAtPnRtX3pvbmUgPyBwLT50bV96b25lIDogIiAgICIsIDkpOwotCQlqYW5uYW1lWzldID0gJ1wwJzsKLQkJdCArPSBZRUFSLzI7Ci0JCXAgPSBsb2NhbHRpbWUoJnQpOwotCQlqdWx5em9uZSA9IC1wLT50bV9nbXRvZmY7Ci0JCXN0cm5jcHkoanVseW5hbWUsIHAtPnRtX3pvbmUgPyBwLT50bV96b25lIDogIiAgICIsIDkpOwotCQlqdWx5bmFtZVs5XSA9ICdcMCc7CisgICAgICAgIHRpbWVfdCB0OworICAgICAgICBzdHJ1Y3QgdG0gKnA7CisgICAgICAgIGxvbmcgamFuem9uZSwganVseXpvbmU7CisgICAgICAgIGNoYXIgamFubmFtZVsxMF0sIGp1bHluYW1lWzEwXTsKKyAgICAgICAgdCA9ICh0aW1lKCh0aW1lX3QgKikwKSAvIFlFQVIpICogWUVBUjsKKyAgICAgICAgcCA9IGxvY2FsdGltZSgmdCk7CisgICAgICAgIGphbnpvbmUgPSAtcC0+dG1fZ210b2ZmOworICAgICAgICBzdHJuY3B5KGphbm5hbWUsIHAtPnRtX3pvbmUgPyBwLT50bV96b25lIDogIiAgICIsIDkpOworICAgICAgICBqYW5uYW1lWzldID0gJ1wwJzsKKyAgICAgICAgdCArPSBZRUFSLzI7CisgICAgICAgIHAgPSBsb2NhbHRpbWUoJnQpOworICAgICAgICBqdWx5em9uZSA9IC1wLT50bV9nbXRvZmY7CisgICAgICAgIHN0cm5jcHkoanVseW5hbWUsIHAtPnRtX3pvbmUgPyBwLT50bV96b25lIDogIiAgICIsIDkpOworICAgICAgICBqdWx5bmFtZVs5XSA9ICdcMCc7CiAKLQkJaWYoIGphbnpvbmUgPCBqdWx5em9uZSApIHsKLQkJCS8qIERTVCBpcyByZXZlcnNlZCBpbiB0aGUgc291dGhlcm4gaGVtaXNwaGVyZSAqLwotCQkJUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgInRpbWV6b25lIiwganVseXpvbmUpOwotCQkJUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgImFsdHpvbmUiLCBqYW56b25lKTsKLQkJCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJkYXlsaWdodCIsCi0JCQkJCQlqYW56b25lICE9IGp1bHl6b25lKTsKLQkJCVB5TW9kdWxlX0FkZE9iamVjdChtLCAidHpuYW1lIiwKLQkJCQkJICAgUHlfQnVpbGRWYWx1ZSgiKHp6KSIsCi0JCQkJCQkJIGp1bHluYW1lLCBqYW5uYW1lKSk7Ci0JCX0gZWxzZSB7Ci0JCQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAidGltZXpvbmUiLCBqYW56b25lKTsKLQkJCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJhbHR6b25lIiwganVseXpvbmUpOwotCQkJUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgImRheWxpZ2h0IiwKLQkJCQkJCWphbnpvbmUgIT0ganVseXpvbmUpOwotCQkJUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJ0em5hbWUiLAotCQkJCQkgICBQeV9CdWlsZFZhbHVlKCIoenopIiwKLQkJCQkJCQkgamFubmFtZSwganVseW5hbWUpKTsKLQkJfQotCX0KKyAgICAgICAgaWYoIGphbnpvbmUgPCBqdWx5em9uZSApIHsKKyAgICAgICAgICAgIC8qIERTVCBpcyByZXZlcnNlZCBpbiB0aGUgc291dGhlcm4gaGVtaXNwaGVyZSAqLworICAgICAgICAgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgInRpbWV6b25lIiwganVseXpvbmUpOworICAgICAgICAgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgImFsdHpvbmUiLCBqYW56b25lKTsKKyAgICAgICAgICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJkYXlsaWdodCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYW56b25lICE9IGp1bHl6b25lKTsKKyAgICAgICAgICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAidHpuYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9CdWlsZFZhbHVlKCIoenopIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGp1bHluYW1lLCBqYW5uYW1lKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAidGltZXpvbmUiLCBqYW56b25lKTsKKyAgICAgICAgICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJhbHR6b25lIiwganVseXpvbmUpOworICAgICAgICAgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgImRheWxpZ2h0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphbnpvbmUgIT0ganVseXpvbmUpOworICAgICAgICAgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJ0em5hbWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X0J1aWxkVmFsdWUoIih6eikiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamFubmFtZSwganVseW5hbWUpKTsKKyAgICAgICAgfQorICAgIH0KICNlbHNlCiAjZW5kaWYgLyogSEFWRV9TVFJVQ1RfVE1fVE1fWk9ORSAqLwogI2lmZGVmIF9fQ1lHV0lOX18KLQl0enNldCgpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJ0aW1lem9uZSIsIF90aW1lem9uZSk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgImFsdHpvbmUiLCBfdGltZXpvbmUtMzYwMCk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgImRheWxpZ2h0IiwgX2RheWxpZ2h0KTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgInR6bmFtZSIsCi0JCQkgICBQeV9CdWlsZFZhbHVlKCIoenopIiwgX3R6bmFtZVswXSwgX3R6bmFtZVsxXSkpOworICAgIHR6c2V0KCk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgInRpbWV6b25lIiwgX3RpbWV6b25lKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiYWx0em9uZSIsIF90aW1lem9uZS0zNjAwKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiZGF5bGlnaHQiLCBfZGF5bGlnaHQpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAidHpuYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgUHlfQnVpbGRWYWx1ZSgiKHp6KSIsIF90em5hbWVbMF0sIF90em5hbWVbMV0pKTsKICNlbmRpZiAvKiBfX0NZR1dJTl9fICovCiAjZW5kaWYgLyogIUhBVkVfVFpOQU1FIHx8IF9fR0xJQkNfXyB8fCBfX0NZR1dJTl9fKi8KIH0KIAogCiBzdGF0aWMgUHlNZXRob2REZWYgdGltZV9tZXRob2RzW10gPSB7Ci0JeyJ0aW1lIiwJdGltZV90aW1lLCBNRVRIX05PQVJHUywgdGltZV9kb2N9LAorICAgIHsidGltZSIsICAgICAgICAgICAgdGltZV90aW1lLCBNRVRIX05PQVJHUywgdGltZV9kb2N9LAogI2lmZGVmIEhBVkVfQ0xPQ0sKLQl7ImNsb2NrIiwJdGltZV9jbG9jaywgTUVUSF9OT0FSR1MsIGNsb2NrX2RvY30sCisgICAgeyJjbG9jayIsICAgICAgICAgICB0aW1lX2Nsb2NrLCBNRVRIX05PQVJHUywgY2xvY2tfZG9jfSwKICNlbmRpZgotCXsic2xlZXAiLAl0aW1lX3NsZWVwLCBNRVRIX1ZBUkFSR1MsIHNsZWVwX2RvY30sCi0JeyJnbXRpbWUiLAl0aW1lX2dtdGltZSwgTUVUSF9WQVJBUkdTLCBnbXRpbWVfZG9jfSwKLQl7ImxvY2FsdGltZSIsCXRpbWVfbG9jYWx0aW1lLCBNRVRIX1ZBUkFSR1MsIGxvY2FsdGltZV9kb2N9LAotCXsiYXNjdGltZSIsCXRpbWVfYXNjdGltZSwgTUVUSF9WQVJBUkdTLCBhc2N0aW1lX2RvY30sCi0JeyJjdGltZSIsCXRpbWVfY3RpbWUsIE1FVEhfVkFSQVJHUywgY3RpbWVfZG9jfSwKKyAgICB7InNsZWVwIiwgICAgICAgICAgIHRpbWVfc2xlZXAsIE1FVEhfVkFSQVJHUywgc2xlZXBfZG9jfSwKKyAgICB7ImdtdGltZSIsICAgICAgICAgIHRpbWVfZ210aW1lLCBNRVRIX1ZBUkFSR1MsIGdtdGltZV9kb2N9LAorICAgIHsibG9jYWx0aW1lIiwgICAgICAgdGltZV9sb2NhbHRpbWUsIE1FVEhfVkFSQVJHUywgbG9jYWx0aW1lX2RvY30sCisgICAgeyJhc2N0aW1lIiwgICAgICAgICB0aW1lX2FzY3RpbWUsIE1FVEhfVkFSQVJHUywgYXNjdGltZV9kb2N9LAorICAgIHsiY3RpbWUiLCAgICAgICAgICAgdGltZV9jdGltZSwgTUVUSF9WQVJBUkdTLCBjdGltZV9kb2N9LAogI2lmZGVmIEhBVkVfTUtUSU1FCi0JeyJta3RpbWUiLAl0aW1lX21rdGltZSwgTUVUSF9PLCBta3RpbWVfZG9jfSwKKyAgICB7Im1rdGltZSIsICAgICAgICAgIHRpbWVfbWt0aW1lLCBNRVRIX08sIG1rdGltZV9kb2N9LAogI2VuZGlmCiAjaWZkZWYgSEFWRV9TVFJGVElNRQotCXsic3RyZnRpbWUiLAl0aW1lX3N0cmZ0aW1lLCBNRVRIX1ZBUkFSR1MsIHN0cmZ0aW1lX2RvY30sCisgICAgeyJzdHJmdGltZSIsICAgICAgICB0aW1lX3N0cmZ0aW1lLCBNRVRIX1ZBUkFSR1MsIHN0cmZ0aW1lX2RvY30sCiAjZW5kaWYKLQl7InN0cnB0aW1lIiwJdGltZV9zdHJwdGltZSwgTUVUSF9WQVJBUkdTLCBzdHJwdGltZV9kb2N9LAorICAgIHsic3RycHRpbWUiLCAgICAgICAgdGltZV9zdHJwdGltZSwgTUVUSF9WQVJBUkdTLCBzdHJwdGltZV9kb2N9LAogI2lmZGVmIEhBVkVfV09SS0lOR19UWlNFVAotCXsidHpzZXQiLAl0aW1lX3R6c2V0LCBNRVRIX05PQVJHUywgdHpzZXRfZG9jfSwKKyAgICB7InR6c2V0IiwgICAgICAgICAgIHRpbWVfdHpzZXQsIE1FVEhfTk9BUkdTLCB0enNldF9kb2N9LAogI2VuZGlmCi0Je05VTEwsCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogCkBAIC04MTYsMzggKzgxNiwzOCBAQAogUHlNT0RJTklUX0ZVTkMKIGluaXR0aW1lKHZvaWQpCiB7Ci0JUHlPYmplY3QgKm07Ci0JY2hhciAqcDsKLQltID0gUHlfSW5pdE1vZHVsZTMoInRpbWUiLCB0aW1lX21ldGhvZHMsIG1vZHVsZV9kb2MpOwotCWlmIChtID09IE5VTEwpCi0JCXJldHVybjsKKyAgICBQeU9iamVjdCAqbTsKKyAgICBjaGFyICpwOworICAgIG0gPSBQeV9Jbml0TW9kdWxlMygidGltZSIsIHRpbWVfbWV0aG9kcywgbW9kdWxlX2RvYyk7CisgICAgaWYgKG0gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOwogCi0JLyogQWNjZXB0IDItZGlnaXQgZGF0ZXMgdW5sZXNzIFBZVEhPTlkySyBpcyBzZXQgYW5kIG5vbi1lbXB0eSAqLwotCXAgPSBQeV9HRVRFTlYoIlBZVEhPTlkySyIpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJhY2NlcHQyZHllYXIiLCAobG9uZykgKCFwIHx8ICEqcCkpOwotCS8qIFNxdWlycmVsIGF3YXkgdGhlIG1vZHVsZSdzIGRpY3Rpb25hcnkgZm9yIHRoZSB5MmsgY2hlY2sgKi8KLQltb2RkaWN0ID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQlQeV9JTkNSRUYobW9kZGljdCk7CisgICAgLyogQWNjZXB0IDItZGlnaXQgZGF0ZXMgdW5sZXNzIFBZVEhPTlkySyBpcyBzZXQgYW5kIG5vbi1lbXB0eSAqLworICAgIHAgPSBQeV9HRVRFTlYoIlBZVEhPTlkySyIpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJhY2NlcHQyZHllYXIiLCAobG9uZykgKCFwIHx8ICEqcCkpOworICAgIC8qIFNxdWlycmVsIGF3YXkgdGhlIG1vZHVsZSdzIGRpY3Rpb25hcnkgZm9yIHRoZSB5MmsgY2hlY2sgKi8KKyAgICBtb2RkaWN0ID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICBQeV9JTkNSRUYobW9kZGljdCk7CiAKLQkvKiBTZXQsIG9yIHJlc2V0LCBtb2R1bGUgdmFyaWFibGVzIGxpa2UgdGltZS50aW1lem9uZSAqLwotCWluaXR0aW1lem9uZShtKTsKKyAgICAvKiBTZXQsIG9yIHJlc2V0LCBtb2R1bGUgdmFyaWFibGVzIGxpa2UgdGltZS50aW1lem9uZSAqLworICAgIGluaXR0aW1lem9uZShtKTsKIAogI2lmZGVmIE1TX1dJTkRPV1MKLQkvKiBIZWxwZXIgdG8gYWxsb3cgaW50ZXJydXB0cyBmb3IgV2luZG93cy4KLQkgICBJZiBDdHJsK0MgZXZlbnQgZGVsaXZlcmVkIHdoaWxlIG5vdCBzbGVlcGluZwotCSAgIGl0IHdpbGwgYmUgaWdub3JlZC4KLQkqLwotCW1haW5fdGhyZWFkID0gUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpOwotCWhJbnRlcnJ1cHRFdmVudCA9IENyZWF0ZUV2ZW50KE5VTEwsIFRSVUUsIEZBTFNFLCBOVUxMKTsKLQlTZXRDb25zb2xlQ3RybEhhbmRsZXIoIFB5Q3RybEhhbmRsZXIsIFRSVUUpOworICAgIC8qIEhlbHBlciB0byBhbGxvdyBpbnRlcnJ1cHRzIGZvciBXaW5kb3dzLgorICAgICAgIElmIEN0cmwrQyBldmVudCBkZWxpdmVyZWQgd2hpbGUgbm90IHNsZWVwaW5nCisgICAgICAgaXQgd2lsbCBiZSBpZ25vcmVkLgorICAgICovCisgICAgbWFpbl90aHJlYWQgPSBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCk7CisgICAgaEludGVycnVwdEV2ZW50ID0gQ3JlYXRlRXZlbnQoTlVMTCwgVFJVRSwgRkFMU0UsIE5VTEwpOworICAgIFNldENvbnNvbGVDdHJsSGFuZGxlciggUHlDdHJsSGFuZGxlciwgVFJVRSk7CiAjZW5kaWYgLyogTVNfV0lORE9XUyAqLwotCWlmICghaW5pdGlhbGl6ZWQpIHsKLQkJUHlTdHJ1Y3RTZXF1ZW5jZV9Jbml0VHlwZSgmU3RydWN0VGltZVR5cGUsCi0JCQkJCSAgJnN0cnVjdF90aW1lX3R5cGVfZGVzYyk7Ci0JfQotCVB5X0lOQ1JFRigmU3RydWN0VGltZVR5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAic3RydWN0X3RpbWUiLCAoUHlPYmplY3QqKSAmU3RydWN0VGltZVR5cGUpOwotCWluaXRpYWxpemVkID0gMTsKKyAgICBpZiAoIWluaXRpYWxpemVkKSB7CisgICAgICAgIFB5U3RydWN0U2VxdWVuY2VfSW5pdFR5cGUoJlN0cnVjdFRpbWVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHJ1Y3RfdGltZV90eXBlX2Rlc2MpOworICAgIH0KKyAgICBQeV9JTkNSRUYoJlN0cnVjdFRpbWVUeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgInN0cnVjdF90aW1lIiwgKFB5T2JqZWN0KikgJlN0cnVjdFRpbWVUeXBlKTsKKyAgICBpbml0aWFsaXplZCA9IDE7CiB9CiAKIApAQCAtODU2LDM4ICs4NTYsMzggQEAKIHN0YXRpYyBkb3VibGUKIGZsb2F0dGltZSh2b2lkKQogewotCS8qIFRoZXJlIGFyZSB0aHJlZSB3YXlzIHRvIGdldCB0aGUgdGltZToKLQkgICgxKSBnZXR0aW1lb2ZkYXkoKSAtLSByZXNvbHV0aW9uIGluIG1pY3Jvc2Vjb25kcwotCSAgKDIpIGZ0aW1lKCkgLS0gcmVzb2x1dGlvbiBpbiBtaWxsaXNlY29uZHMKLQkgICgzKSB0aW1lKCkgLS0gcmVzb2x1dGlvbiBpbiBzZWNvbmRzCi0JICBJbiBhbGwgY2FzZXMgdGhlIHJldHVybiB2YWx1ZSBpcyBhIGZsb2F0IGluIHNlY29uZHMuCi0JICBTaW5jZSBvbiBzb21lIHN5c3RlbXMgKGUuZy4gU0NPIE9EVCAzLjApIGdldHRpbWVvZmRheSgpIG1heQotCSAgZmFpbCwgc28gd2UgZmFsbCBiYWNrIG9uIGZ0aW1lKCkgb3IgdGltZSgpLgotCSAgTm90ZTogY2xvY2sgcmVzb2x1dGlvbiBkb2VzIG5vdCBpbXBseSBjbG9jayBhY2N1cmFjeSEgKi8KKyAgICAvKiBUaGVyZSBhcmUgdGhyZWUgd2F5cyB0byBnZXQgdGhlIHRpbWU6CisgICAgICAoMSkgZ2V0dGltZW9mZGF5KCkgLS0gcmVzb2x1dGlvbiBpbiBtaWNyb3NlY29uZHMKKyAgICAgICgyKSBmdGltZSgpIC0tIHJlc29sdXRpb24gaW4gbWlsbGlzZWNvbmRzCisgICAgICAoMykgdGltZSgpIC0tIHJlc29sdXRpb24gaW4gc2Vjb25kcworICAgICAgSW4gYWxsIGNhc2VzIHRoZSByZXR1cm4gdmFsdWUgaXMgYSBmbG9hdCBpbiBzZWNvbmRzLgorICAgICAgU2luY2Ugb24gc29tZSBzeXN0ZW1zIChlLmcuIFNDTyBPRFQgMy4wKSBnZXR0aW1lb2ZkYXkoKSBtYXkKKyAgICAgIGZhaWwsIHNvIHdlIGZhbGwgYmFjayBvbiBmdGltZSgpIG9yIHRpbWUoKS4KKyAgICAgIE5vdGU6IGNsb2NrIHJlc29sdXRpb24gZG9lcyBub3QgaW1wbHkgY2xvY2sgYWNjdXJhY3khICovCiAjaWZkZWYgSEFWRV9HRVRUSU1FT0ZEQVkKLQl7Ci0JCXN0cnVjdCB0aW1ldmFsIHQ7CisgICAgeworICAgICAgICBzdHJ1Y3QgdGltZXZhbCB0OwogI2lmZGVmIEdFVFRJTUVPRkRBWV9OT19UWgotCQlpZiAoZ2V0dGltZW9mZGF5KCZ0KSA9PSAwKQotCQkJcmV0dXJuIChkb3VibGUpdC50dl9zZWMgKyB0LnR2X3VzZWMqMC4wMDAwMDE7CisgICAgICAgIGlmIChnZXR0aW1lb2ZkYXkoJnQpID09IDApCisgICAgICAgICAgICByZXR1cm4gKGRvdWJsZSl0LnR2X3NlYyArIHQudHZfdXNlYyowLjAwMDAwMTsKICNlbHNlIC8qICFHRVRUSU1FT0ZEQVlfTk9fVFogKi8KLQkJaWYgKGdldHRpbWVvZmRheSgmdCwgKHN0cnVjdCB0aW1lem9uZSAqKU5VTEwpID09IDApCi0JCQlyZXR1cm4gKGRvdWJsZSl0LnR2X3NlYyArIHQudHZfdXNlYyowLjAwMDAwMTsKKyAgICAgICAgaWYgKGdldHRpbWVvZmRheSgmdCwgKHN0cnVjdCB0aW1lem9uZSAqKU5VTEwpID09IDApCisgICAgICAgICAgICByZXR1cm4gKGRvdWJsZSl0LnR2X3NlYyArIHQudHZfdXNlYyowLjAwMDAwMTsKICNlbmRpZiAvKiAhR0VUVElNRU9GREFZX05PX1RaICovCi0JfQorICAgIH0KIAogI2VuZGlmIC8qICFIQVZFX0dFVFRJTUVPRkRBWSAqLwotCXsKKyAgICB7CiAjaWYgZGVmaW5lZChIQVZFX0ZUSU1FKQotCQlzdHJ1Y3QgdGltZWIgdDsKLQkJZnRpbWUoJnQpOwotCQlyZXR1cm4gKGRvdWJsZSl0LnRpbWUgKyAoZG91YmxlKXQubWlsbGl0bSAqIChkb3VibGUpMC4wMDE7CisgICAgICAgIHN0cnVjdCB0aW1lYiB0OworICAgICAgICBmdGltZSgmdCk7CisgICAgICAgIHJldHVybiAoZG91YmxlKXQudGltZSArIChkb3VibGUpdC5taWxsaXRtICogKGRvdWJsZSkwLjAwMTsKICNlbHNlIC8qICFIQVZFX0ZUSU1FICovCi0JCXRpbWVfdCBzZWNzOwotCQl0aW1lKCZzZWNzKTsKLQkJcmV0dXJuIChkb3VibGUpc2VjczsKKyAgICAgICAgdGltZV90IHNlY3M7CisgICAgICAgIHRpbWUoJnNlY3MpOworICAgICAgICByZXR1cm4gKGRvdWJsZSlzZWNzOwogI2VuZGlmIC8qICFIQVZFX0ZUSU1FICovCi0JfQorICAgIH0KIH0KIAogCkBAIC05MDAsMTIyICs5MDAsMTIyIEBACiB7CiAvKiBYWFggU2hvdWxkIHRlc3QgZm9yIE1TX1dJTkRPV1MgZmlyc3QhICovCiAjaWYgZGVmaW5lZChIQVZFX1NFTEVDVCkgJiYgIWRlZmluZWQoX19CRU9TX18pICYmICFkZWZpbmVkKF9fRU1YX18pCi0Jc3RydWN0IHRpbWV2YWwgdDsKLQlkb3VibGUgZnJhYzsKLQlmcmFjID0gZm1vZChzZWNzLCAxLjApOwotCXNlY3MgPSBmbG9vcihzZWNzKTsKLQl0LnR2X3NlYyA9IChsb25nKXNlY3M7Ci0JdC50dl91c2VjID0gKGxvbmcpKGZyYWMqMTAwMDAwMC4wKTsKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JaWYgKHNlbGVjdCgwLCAoZmRfc2V0ICopMCwgKGZkX3NldCAqKTAsIChmZF9zZXQgKikwLCAmdCkgIT0gMCkgeworICAgIHN0cnVjdCB0aW1ldmFsIHQ7CisgICAgZG91YmxlIGZyYWM7CisgICAgZnJhYyA9IGZtb2Qoc2VjcywgMS4wKTsKKyAgICBzZWNzID0gZmxvb3Ioc2Vjcyk7CisgICAgdC50dl9zZWMgPSAobG9uZylzZWNzOworICAgIHQudHZfdXNlYyA9IChsb25nKShmcmFjKjEwMDAwMDAuMCk7CisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIGlmIChzZWxlY3QoMCwgKGZkX3NldCAqKTAsIChmZF9zZXQgKikwLCAoZmRfc2V0ICopMCwgJnQpICE9IDApIHsKICNpZmRlZiBFSU5UUgotCQlpZiAoZXJybm8gIT0gRUlOVFIpIHsKKyAgICAgICAgaWYgKGVycm5vICE9IEVJTlRSKSB7CiAjZWxzZQotCQlpZiAoMSkgeworICAgICAgICBpZiAoMSkgewogI2VuZGlmCi0JCQlQeV9CTE9DS19USFJFQURTCi0JCQlQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgICAgIFB5X0JMT0NLX1RIUkVBRFMKKyAgICAgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogI2VsaWYgZGVmaW5lZChfX1dBVENPTUNfXykgJiYgIWRlZmluZWQoX19RTlhfXykKLQkvKiBYWFggQ2FuJ3QgaW50ZXJydXB0IHRoaXMgc2xlZXAgKi8KLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JZGVsYXkoKGludCkoc2VjcyAqIDEwMDAgKyAwLjUpKTsgIC8qIGRlbGF5KCkgdXNlcyBtaWxsaXNlY29uZHMgKi8KLQlQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIC8qIFhYWCBDYW4ndCBpbnRlcnJ1cHQgdGhpcyBzbGVlcCAqLworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICBkZWxheSgoaW50KShzZWNzICogMTAwMCArIDAuNSkpOyAgLyogZGVsYXkoKSB1c2VzIG1pbGxpc2Vjb25kcyAqLworICAgIFB5X0VORF9BTExPV19USFJFQURTCiAjZWxpZiBkZWZpbmVkKE1TX1dJTkRPV1MpCi0JewotCQlkb3VibGUgbWlsbGlzZWNzID0gc2VjcyAqIDEwMDAuMDsKLQkJdW5zaWduZWQgbG9uZyB1bF9taWxsaXM7CisgICAgeworICAgICAgICBkb3VibGUgbWlsbGlzZWNzID0gc2VjcyAqIDEwMDAuMDsKKyAgICAgICAgdW5zaWduZWQgbG9uZyB1bF9taWxsaXM7CiAKLQkJaWYgKG1pbGxpc2VjcyA+IChkb3VibGUpVUxPTkdfTUFYKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJCQkJInNsZWVwIGxlbmd0aCBpcyB0b28gbGFyZ2UiKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JCS8qIEFsbG93IHNsZWVwKDApIHRvIG1haW50YWluIHdpbjMyIHNlbWFudGljcywgYW5kIGFzIGRlY3JlZWQKLQkJICogYnkgR3VpZG8sIG9ubHkgdGhlIG1haW4gdGhyZWFkIGNhbiBiZSBpbnRlcnJ1cHRlZC4KLQkJICovCi0JCXVsX21pbGxpcyA9ICh1bnNpZ25lZCBsb25nKW1pbGxpc2VjczsKLQkJaWYgKHVsX21pbGxpcyA9PSAwIHx8Ci0JCSAgICBtYWluX3RocmVhZCAhPSBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCkpCi0JCQlTbGVlcCh1bF9taWxsaXMpOwotCQllbHNlIHsKLQkJCURXT1JEIHJjOwotCQkJUmVzZXRFdmVudChoSW50ZXJydXB0RXZlbnQpOwotCQkJcmMgPSBXYWl0Rm9yU2luZ2xlT2JqZWN0KGhJbnRlcnJ1cHRFdmVudCwgdWxfbWlsbGlzKTsKLQkJCWlmIChyYyA9PSBXQUlUX09CSkVDVF8wKSB7Ci0JCQkJLyogWWllbGQgdG8gbWFrZSBzdXJlIHJlYWwgUHl0aG9uIHNpZ25hbAotCQkJCSAqIGhhbmRsZXIgY2FsbGVkLgotCQkJCSAqLwotCQkJCVNsZWVwKDEpOwotCQkJCVB5X0JMT0NLX1RIUkVBRFMKLQkJCQllcnJubyA9IEVJTlRSOwotCQkJCVB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQl9CisgICAgICAgIGlmIChtaWxsaXNlY3MgPiAoZG91YmxlKVVMT05HX01BWCkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNsZWVwIGxlbmd0aCBpcyB0b28gbGFyZ2UiKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgICAgIC8qIEFsbG93IHNsZWVwKDApIHRvIG1haW50YWluIHdpbjMyIHNlbWFudGljcywgYW5kIGFzIGRlY3JlZWQKKyAgICAgICAgICogYnkgR3VpZG8sIG9ubHkgdGhlIG1haW4gdGhyZWFkIGNhbiBiZSBpbnRlcnJ1cHRlZC4KKyAgICAgICAgICovCisgICAgICAgIHVsX21pbGxpcyA9ICh1bnNpZ25lZCBsb25nKW1pbGxpc2VjczsKKyAgICAgICAgaWYgKHVsX21pbGxpcyA9PSAwIHx8CisgICAgICAgICAgICBtYWluX3RocmVhZCAhPSBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCkpCisgICAgICAgICAgICBTbGVlcCh1bF9taWxsaXMpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIERXT1JEIHJjOworICAgICAgICAgICAgUmVzZXRFdmVudChoSW50ZXJydXB0RXZlbnQpOworICAgICAgICAgICAgcmMgPSBXYWl0Rm9yU2luZ2xlT2JqZWN0KGhJbnRlcnJ1cHRFdmVudCwgdWxfbWlsbGlzKTsKKyAgICAgICAgICAgIGlmIChyYyA9PSBXQUlUX09CSkVDVF8wKSB7CisgICAgICAgICAgICAgICAgLyogWWllbGQgdG8gbWFrZSBzdXJlIHJlYWwgUHl0aG9uIHNpZ25hbAorICAgICAgICAgICAgICAgICAqIGhhbmRsZXIgY2FsbGVkLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIFNsZWVwKDEpOworICAgICAgICAgICAgICAgIFB5X0JMT0NLX1RIUkVBRFMKKyAgICAgICAgICAgICAgICBlcnJubyA9IEVJTlRSOworICAgICAgICAgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICB9CiAjZWxpZiBkZWZpbmVkKFBZT1NfT1MyKQotCS8qIFRoaXMgU2xlZXAgKklTKiBJbnRlcnJ1cHRhYmxlIGJ5IEV4Y2VwdGlvbnMgKi8KLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JaWYgKERvc1NsZWVwKHNlY3MgKiAxMDAwKSAhPSBOT19FUlJPUikgewotCQlQeV9CTE9DS19USFJFQURTCi0JCVB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIC8qIFRoaXMgU2xlZXAgKklTKiBJbnRlcnJ1cHRhYmxlIGJ5IEV4Y2VwdGlvbnMgKi8KKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgaWYgKERvc1NsZWVwKHNlY3MgKiAxMDAwKSAhPSBOT19FUlJPUikgeworICAgICAgICBQeV9CTE9DS19USFJFQURTCisgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogI2VsaWYgZGVmaW5lZChfX0JFT1NfXykKLQkvKiBUaGlzIHNsZWVwICpDQU4gQkUqIGludGVycnVwdGVkLiAqLwotCXsKLQkJaWYoIHNlY3MgPD0gMC4wICkgewotCQkJcmV0dXJuOwotCQl9CisgICAgLyogVGhpcyBzbGVlcCAqQ0FOIEJFKiBpbnRlcnJ1cHRlZC4gKi8KKyAgICB7CisgICAgICAgIGlmKCBzZWNzIDw9IDAuMCApIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQogCi0JCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQkJLyogQmVPUyBzbm9vemUoKSBpcyBpbiBtaWNyb3NlY29uZHMuLi4gKi8KLQkJaWYoIHNub296ZSggKGJpZ3RpbWVfdCkoIHNlY3MgKiAxMDAwLjAgKiAxMDAwLjAgKSApID09IEJfSU5URVJSVVBURUQgKSB7Ci0JCQlQeV9CTE9DS19USFJFQURTCi0JCQlQeUVycl9TZXRGcm9tRXJybm8oIFB5RXhjX0lPRXJyb3IgKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCX0KKyAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICAvKiBCZU9TIHNub296ZSgpIGlzIGluIG1pY3Jvc2Vjb25kcy4uLiAqLworICAgICAgICBpZiggc25vb3plKCAoYmlndGltZV90KSggc2VjcyAqIDEwMDAuMCAqIDEwMDAuMCApICkgPT0gQl9JTlRFUlJVUFRFRCApIHsKKyAgICAgICAgICAgIFB5X0JMT0NLX1RIUkVBRFMKKyAgICAgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyggUHlFeGNfSU9FcnJvciApOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgfQogI2VsaWYgZGVmaW5lZChSSVNDT1MpCi0JaWYgKHNlY3MgPD0gMC4wKQotCQlyZXR1cm4gMDsKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JLyogVGhpcyBzbGVlcCAqQ0FOIEJFKiBpbnRlcnJ1cHRlZC4gKi8KLQlpZiAoIHJpc2Nvc19zbGVlcChzZWNzKSApCi0JCXJldHVybiAtMTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIGlmIChzZWNzIDw9IDAuMCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIC8qIFRoaXMgc2xlZXAgKkNBTiBCRSogaW50ZXJydXB0ZWQuICovCisgICAgaWYgKCByaXNjb3Nfc2xlZXAoc2VjcykgKQorICAgICAgICByZXR1cm4gLTE7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKICNlbGlmIGRlZmluZWQoUExBTjkpCi0JewotCQlkb3VibGUgbWlsbGlzZWNzID0gc2VjcyAqIDEwMDAuMDsKLQkJaWYgKG1pbGxpc2VjcyA+IChkb3VibGUpTE9OR19NQVgpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLCAic2xlZXAgbGVuZ3RoIGlzIHRvbyBsYXJnZSIpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCS8qIFRoaXMgc2xlZXAgKkNBTiBCRSogaW50ZXJydXB0ZWQuICovCi0JCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQkJaWYoc2xlZXAoKGxvbmcpbWlsbGlzZWNzKSA8IDApewotCQkJUHlfQkxPQ0tfVEhSRUFEUwotCQkJUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCVB5X0VORF9BTExPV19USFJFQURTCi0JfQorICAgIHsKKyAgICAgICAgZG91YmxlIG1pbGxpc2VjcyA9IHNlY3MgKiAxMDAwLjA7CisgICAgICAgIGlmIChtaWxsaXNlY3MgPiAoZG91YmxlKUxPTkdfTUFYKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwgInNsZWVwIGxlbmd0aCBpcyB0b28gbGFyZ2UiKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICAvKiBUaGlzIHNsZWVwICpDQU4gQkUqIGludGVycnVwdGVkLiAqLworICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgICAgIGlmKHNsZWVwKChsb25nKW1pbGxpc2VjcykgPCAwKXsKKyAgICAgICAgICAgIFB5X0JMT0NLX1RIUkVBRFMKKyAgICAgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIH0KICNlbHNlCi0JLyogWFhYIENhbid0IGludGVycnVwdCB0aGlzIHNsZWVwICovCi0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCXNsZWVwKChpbnQpc2Vjcyk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICAvKiBYWFggQ2FuJ3QgaW50ZXJydXB0IHRoaXMgc2xlZXAgKi8KKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgc2xlZXAoKGludClzZWNzKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogI2VuZGlmCiAKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKIH0KIAogCmRpZmYgLS1naXQgYS9Nb2R1bGVzL3RpbWluZ21vZHVsZS5jIGIvTW9kdWxlcy90aW1pbmdtb2R1bGUuYwppbmRleCAwZGE1YzZiLi5hNGUyYzdlIDEwMDY0NAotLS0gYS9Nb2R1bGVzL3RpbWluZ21vZHVsZS5jCisrKyBiL01vZHVsZXMvdGltaW5nbW9kdWxlLmMKQEAgLTEwLDQ1ICsxMCw0NSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHN0YXJ0X3RpbWluZyhQeU9iamVjdCAqc2VsZikKIHsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JQkVHSU5USU1JTkc7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIEJFR0lOVElNSU5HOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZmluaXNoX3RpbWluZyhQeU9iamVjdCAqc2VsZikKIHsKLQlFTkRUSU1JTkcgICAgCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIEVORFRJTUlORworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNlY29uZHMoUHlPYmplY3QgKnNlbGYpCiB7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKFRJTUlOR1MpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhUSU1JTkdTKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG1pbGxpKFB5T2JqZWN0ICpzZWxmKQogewotCXJldHVybiBQeUludF9Gcm9tTG9uZyhUSU1JTkdNUyk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKFRJTUlOR01TKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG1pY3JvKFB5T2JqZWN0ICpzZWxmKQogewotCXJldHVybiBQeUludF9Gcm9tTG9uZyhUSU1JTkdVUyk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKFRJTUlOR1VTKTsKIH0KIAogCiBzdGF0aWMgUHlNZXRob2REZWYgdGltaW5nX21ldGhvZHNbXSA9IHsKLQl7InN0YXJ0IiwgICAoUHlDRnVuY3Rpb24pc3RhcnRfdGltaW5nLCBNRVRIX05PQVJHU30sCi0JeyJmaW5pc2giLCAgKFB5Q0Z1bmN0aW9uKWZpbmlzaF90aW1pbmcsIE1FVEhfTk9BUkdTfSwKLQl7InNlY29uZHMiLCAoUHlDRnVuY3Rpb24pc2Vjb25kcywgTUVUSF9OT0FSR1N9LAotCXsibWlsbGkiLCAgIChQeUNGdW5jdGlvbiltaWxsaSwgTUVUSF9OT0FSR1N9LAotCXsibWljcm8iLCAgIChQeUNGdW5jdGlvbiltaWNybywgTUVUSF9OT0FSR1N9LAotCXtOVUxMLCAgICAgIE5VTEx9CisgICAgeyJzdGFydCIsICAgKFB5Q0Z1bmN0aW9uKXN0YXJ0X3RpbWluZywgTUVUSF9OT0FSR1N9LAorICAgIHsiZmluaXNoIiwgIChQeUNGdW5jdGlvbilmaW5pc2hfdGltaW5nLCBNRVRIX05PQVJHU30sCisgICAgeyJzZWNvbmRzIiwgKFB5Q0Z1bmN0aW9uKXNlY29uZHMsIE1FVEhfTk9BUkdTfSwKKyAgICB7Im1pbGxpIiwgICAoUHlDRnVuY3Rpb24pbWlsbGksIE1FVEhfTk9BUkdTfSwKKyAgICB7Im1pY3JvIiwgICAoUHlDRnVuY3Rpb24pbWljcm8sIE1FVEhfTk9BUkdTfSwKKyAgICB7TlVMTCwgICAgICBOVUxMfQogfTsKIAogCkBAIC01Niw3ICs1Niw3IEBACiB7CiAgICAgaWYgKFB5RXJyX1dhcm5QeTNrKCJ0aGUgdGltaW5nIG1vZHVsZSBoYXMgYmVlbiByZW1vdmVkIGluICIKICAgICAgICAgICAgICAgICAgICAgICAgICJQeXRob24gMy4wOyB1c2UgdGltZS5jbG9jaygpIGluc3RlYWQiLCAyKSA8IDApCi0gICAgICAgIHJldHVybjsKLSAgICAKLQkodm9pZClQeV9Jbml0TW9kdWxlKCJ0aW1pbmciLCB0aW1pbmdfbWV0aG9kcyk7CisgICAgcmV0dXJuOworCisgICAgKHZvaWQpUHlfSW5pdE1vZHVsZSgidGltaW5nIiwgdGltaW5nX21ldGhvZHMpOwogfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy90a2FwcGluaXQuYyBiL01vZHVsZXMvdGthcHBpbml0LmMKaW5kZXggZGUwNGIwZC4uMDVjNDhhNCAxMDA2NDQKLS0tIGEvTW9kdWxlcy90a2FwcGluaXQuYworKysgYi9Nb2R1bGVzL3RrYXBwaW5pdC5jCkBAIC0xOSwxMzEgKzE5LDEzMSBAQAogaW50CiBUY2xfQXBwSW5pdChUY2xfSW50ZXJwICppbnRlcnApCiB7Ci0JVGtfV2luZG93IG1haW5fd2luZG93OwotCWNvbnN0IGNoYXIgKiBfdGtpbnRlcl9za2lwX3RrX2luaXQ7CisgICAgVGtfV2luZG93IG1haW5fd2luZG93OworICAgIGNvbnN0IGNoYXIgKiBfdGtpbnRlcl9za2lwX3RrX2luaXQ7CiAKICNpZmRlZiBUS19BUVVBCiAjaWZuZGVmIE1BWF9QQVRIX0xFTgogI2RlZmluZSBNQVhfUEFUSF9MRU4gMTAyNAogI2VuZGlmCi0JY2hhciB0Y2xMaWJQYXRoW01BWF9QQVRIX0xFTl0sIHRrTGliUGF0aFtNQVhfUEFUSF9MRU5dOwotCVRjbF9PYmoqCXBhdGhQdHI7CisgICAgY2hhciB0Y2xMaWJQYXRoW01BWF9QQVRIX0xFTl0sIHRrTGliUGF0aFtNQVhfUEFUSF9MRU5dOworICAgIFRjbF9PYmoqICAgICAgICAgICAgcGF0aFB0cjsKIAotICAgICAgICAvKiBwcmUtIFRjbF9Jbml0IGNvZGUgY29waWVkIGZyb20gdGtNYWNPU1hBcHBJbml0LmMgKi8KLQlUa19NYWNPU1hPcGVuQnVuZGxlUmVzb3VyY2VzIChpbnRlcnAsICJjb20udGNsdGsudGNsbGlicmFyeSIsCi0gICAgICAgCXRjbExpYlBhdGgsIE1BWF9QQVRIX0xFTiwgMCk7CisgICAgLyogcHJlLSBUY2xfSW5pdCBjb2RlIGNvcGllZCBmcm9tIHRrTWFjT1NYQXBwSW5pdC5jICovCisgICAgVGtfTWFjT1NYT3BlbkJ1bmRsZVJlc291cmNlcyAoaW50ZXJwLCAiY29tLnRjbHRrLnRjbGxpYnJhcnkiLAorICAgIHRjbExpYlBhdGgsIE1BWF9QQVRIX0xFTiwgMCk7CiAKLQlpZiAodGNsTGliUGF0aFswXSAhPSAnXDAnKSB7Ci0gICAgICAgCVRjbF9TZXRWYXIoaW50ZXJwLCAidGNsX2xpYnJhcnkiLCB0Y2xMaWJQYXRoLCBUQ0xfR0xPQkFMX09OTFkpOwotCQlUY2xfU2V0VmFyKGludGVycCwgInRjbERlZmF1bHRMaWJyYXJ5IiwgdGNsTGliUGF0aCwgVENMX0dMT0JBTF9PTkxZKTsKLQkJVGNsX1NldFZhcihpbnRlcnAsICJ0Y2xfcGtnUGF0aCIsIHRjbExpYlBhdGgsIFRDTF9HTE9CQUxfT05MWSk7Ci0JfQotCQotICAgCWlmICh0Y2xMaWJQYXRoWzBdICE9ICdcMCcpIHsKLQkJVGNsX1NldFZhcihpbnRlcnAsICJ0Y2xfbGlicmFyeSIsIHRjbExpYlBhdGgsIFRDTF9HTE9CQUxfT05MWSk7Ci0JCVRjbF9TZXRWYXIoaW50ZXJwLCAidGNsRGVmYXVsdExpYnJhcnkiLCB0Y2xMaWJQYXRoLCBUQ0xfR0xPQkFMX09OTFkpOwotCQlUY2xfU2V0VmFyKGludGVycCwgInRjbF9wa2dQYXRoIiwgdGNsTGliUGF0aCwgVENMX0dMT0JBTF9PTkxZKTsKLQl9CisgICAgaWYgKHRjbExpYlBhdGhbMF0gIT0gJ1wwJykgeworICAgIFRjbF9TZXRWYXIoaW50ZXJwLCAidGNsX2xpYnJhcnkiLCB0Y2xMaWJQYXRoLCBUQ0xfR0xPQkFMX09OTFkpOworICAgICAgICBUY2xfU2V0VmFyKGludGVycCwgInRjbERlZmF1bHRMaWJyYXJ5IiwgdGNsTGliUGF0aCwgVENMX0dMT0JBTF9PTkxZKTsKKyAgICAgICAgVGNsX1NldFZhcihpbnRlcnAsICJ0Y2xfcGtnUGF0aCIsIHRjbExpYlBhdGgsIFRDTF9HTE9CQUxfT05MWSk7CisgICAgfQorCisgICAgaWYgKHRjbExpYlBhdGhbMF0gIT0gJ1wwJykgeworICAgICAgICBUY2xfU2V0VmFyKGludGVycCwgInRjbF9saWJyYXJ5IiwgdGNsTGliUGF0aCwgVENMX0dMT0JBTF9PTkxZKTsKKyAgICAgICAgVGNsX1NldFZhcihpbnRlcnAsICJ0Y2xEZWZhdWx0TGlicmFyeSIsIHRjbExpYlBhdGgsIFRDTF9HTE9CQUxfT05MWSk7CisgICAgICAgIFRjbF9TZXRWYXIoaW50ZXJwLCAidGNsX3BrZ1BhdGgiLCB0Y2xMaWJQYXRoLCBUQ0xfR0xPQkFMX09OTFkpOworICAgIH0KICNlbmRpZgotCWlmIChUY2xfSW5pdCAoaW50ZXJwKSA9PSBUQ0xfRVJST1IpCi0JCXJldHVybiBUQ0xfRVJST1I7CisgICAgaWYgKFRjbF9Jbml0IChpbnRlcnApID09IFRDTF9FUlJPUikKKyAgICAgICAgcmV0dXJuIFRDTF9FUlJPUjsKIAogI2lmZGVmIFRLX0FRVUEKLSAgICAgICAgLyogcHJlLSBUa19Jbml0IGNvZGUgY29waWVkIGZyb20gdGtNYWNPU1hBcHBJbml0LmMgKi8KLQlUa19NYWNPU1hPcGVuQnVuZGxlUmVzb3VyY2VzIChpbnRlcnAsICJjb20udGNsdGsudGtsaWJyYXJ5IiwKLSAgICAgICAgICAgIHRrTGliUGF0aCwgTUFYX1BBVEhfTEVOLCAxKTsKKyAgICAvKiBwcmUtIFRrX0luaXQgY29kZSBjb3BpZWQgZnJvbSB0a01hY09TWEFwcEluaXQuYyAqLworICAgIFRrX01hY09TWE9wZW5CdW5kbGVSZXNvdXJjZXMgKGludGVycCwgImNvbS50Y2x0ay50a2xpYnJhcnkiLAorICAgICAgICB0a0xpYlBhdGgsIE1BWF9QQVRIX0xFTiwgMSk7CiAKLQlpZiAodGNsTGliUGF0aFswXSAhPSAnXDAnKSB7Ci0JCXBhdGhQdHIgPSBUY2xfTmV3U3RyaW5nT2JqKHRjbExpYlBhdGgsIC0xKTsKLQl9IGVsc2UgewotCQlUY2xfT2JqICpwYXRoUHRyID0gVGNsR2V0TGlicmFyeVBhdGgoKTsKLQl9CisgICAgaWYgKHRjbExpYlBhdGhbMF0gIT0gJ1wwJykgeworICAgICAgICBwYXRoUHRyID0gVGNsX05ld1N0cmluZ09iaih0Y2xMaWJQYXRoLCAtMSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgVGNsX09iaiAqcGF0aFB0ciA9IFRjbEdldExpYnJhcnlQYXRoKCk7CisgICAgfQogCi0JaWYgKHRrTGliUGF0aFswXSAhPSAnXDAnKSB7Ci0JCVRjbF9PYmogKm9ialB0cjsKKyAgICBpZiAodGtMaWJQYXRoWzBdICE9ICdcMCcpIHsKKyAgICAgICAgVGNsX09iaiAqb2JqUHRyOwogCi0JCVRjbF9TZXRWYXIoaW50ZXJwLCAidGtfbGlicmFyeSIsIHRrTGliUGF0aCwgVENMX0dMT0JBTF9PTkxZKTsKLQkJb2JqUHRyID0gVGNsX05ld1N0cmluZ09iaih0a0xpYlBhdGgsIC0xKTsKLQkJVGNsX0xpc3RPYmpBcHBlbmRFbGVtZW50KE5VTEwsIHBhdGhQdHIsIG9ialB0cik7Ci0JfQorICAgICAgICBUY2xfU2V0VmFyKGludGVycCwgInRrX2xpYnJhcnkiLCB0a0xpYlBhdGgsIFRDTF9HTE9CQUxfT05MWSk7CisgICAgICAgIG9ialB0ciA9IFRjbF9OZXdTdHJpbmdPYmoodGtMaWJQYXRoLCAtMSk7CisgICAgICAgIFRjbF9MaXN0T2JqQXBwZW5kRWxlbWVudChOVUxMLCBwYXRoUHRyLCBvYmpQdHIpOworICAgIH0KIAotCVRjbFNldExpYnJhcnlQYXRoKHBhdGhQdHIpOworICAgIFRjbFNldExpYnJhcnlQYXRoKHBhdGhQdHIpOwogI2VuZGlmCiAKICNpZmRlZiBXSVRIX1hYWAotCQkvKiBJbml0aWFsaXplIG1vZHVsZXMgdGhhdCBkb24ndCByZXF1aXJlIFRrICovCisgICAgICAgIC8qIEluaXRpYWxpemUgbW9kdWxlcyB0aGF0IGRvbid0IHJlcXVpcmUgVGsgKi8KICNlbmRpZgogCi0JX3RraW50ZXJfc2tpcF90a19pbml0ID0JVGNsX0dldFZhcihpbnRlcnAsICJfdGtpbnRlcl9za2lwX3RrX2luaXQiLCBUQ0xfR0xPQkFMX09OTFkpOwotCWlmIChfdGtpbnRlcl9za2lwX3RrX2luaXQgIT0gTlVMTCAmJiBzdHJjbXAoX3RraW50ZXJfc2tpcF90a19pbml0LCAiMSIpCT09IDApIHsKLQkJcmV0dXJuIFRDTF9PSzsKLQl9Ci0JaWYgKFRrX0luaXQoaW50ZXJwKSA9PSBUQ0xfRVJST1IpCi0JCXJldHVybiBUQ0xfRVJST1I7CisgICAgX3RraW50ZXJfc2tpcF90a19pbml0ID0gICAgIFRjbF9HZXRWYXIoaW50ZXJwLCAiX3RraW50ZXJfc2tpcF90a19pbml0IiwgVENMX0dMT0JBTF9PTkxZKTsKKyAgICBpZiAoX3RraW50ZXJfc2tpcF90a19pbml0ICE9IE5VTEwgJiYgc3RyY21wKF90a2ludGVyX3NraXBfdGtfaW5pdCwgIjEiKSAgICAgPT0gMCkgeworICAgICAgICByZXR1cm4gVENMX09LOworICAgIH0KKyAgICBpZiAoVGtfSW5pdChpbnRlcnApID09IFRDTF9FUlJPUikKKyAgICAgICAgcmV0dXJuIFRDTF9FUlJPUjsKIAotCW1haW5fd2luZG93ID0gVGtfTWFpbldpbmRvdyhpbnRlcnApOworICAgIG1haW5fd2luZG93ID0gVGtfTWFpbldpbmRvdyhpbnRlcnApOwogCiAjaWZkZWYgVEtfQVFVQQotCVRrTWFjT1NYSW5pdEFwcGxlRXZlbnRzKGludGVycCk7Ci0JVGtNYWNPU1hJbml0TWVudXMoaW50ZXJwKTsKKyAgICBUa01hY09TWEluaXRBcHBsZUV2ZW50cyhpbnRlcnApOworICAgIFRrTWFjT1NYSW5pdE1lbnVzKGludGVycCk7CiAjZW5kaWYKLSAgICAKLSNpZmRlZiBXSVRIX01PUkVCVVRUT05TCi0JewotCQlleHRlcm4gVGNsX0NtZFByb2Mgc3R1ZEJ1dHRvbkNtZDsKLQkJZXh0ZXJuIFRjbF9DbWRQcm9jIHRyaUJ1dHRvbkNtZDsKIAotCQlUY2xfQ3JlYXRlQ29tbWFuZChpbnRlcnAsICJzdHVkYnV0dG9uIiwgc3R1ZEJ1dHRvbkNtZCwKLQkJCQkgIChDbGllbnREYXRhKSBtYWluX3dpbmRvdywgTlVMTCk7Ci0JCVRjbF9DcmVhdGVDb21tYW5kKGludGVycCwgInRyaWJ1dHRvbiIsIHRyaUJ1dHRvbkNtZCwKLQkJCQkgIChDbGllbnREYXRhKSBtYWluX3dpbmRvdywgTlVMTCk7Ci0JfQorI2lmZGVmIFdJVEhfTU9SRUJVVFRPTlMKKyAgICB7CisgICAgICAgIGV4dGVybiBUY2xfQ21kUHJvYyBzdHVkQnV0dG9uQ21kOworICAgICAgICBleHRlcm4gVGNsX0NtZFByb2MgdHJpQnV0dG9uQ21kOworCisgICAgICAgIFRjbF9DcmVhdGVDb21tYW5kKGludGVycCwgInN0dWRidXR0b24iLCBzdHVkQnV0dG9uQ21kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoQ2xpZW50RGF0YSkgbWFpbl93aW5kb3csIE5VTEwpOworICAgICAgICBUY2xfQ3JlYXRlQ29tbWFuZChpbnRlcnAsICJ0cmlidXR0b24iLCB0cmlCdXR0b25DbWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChDbGllbnREYXRhKSBtYWluX3dpbmRvdywgTlVMTCk7CisgICAgfQogI2VuZGlmCiAKICNpZmRlZiBXSVRIX1BJTCAvKiAwLjJiNSBhbmQgbGF0ZXIgLS0gbm90IHlldCByZWxlYXNlZCBhcyBvZiBNYXkgMTQgKi8KLQl7Ci0JCWV4dGVybiB2b2lkIFRrSW1hZ2luZ19Jbml0KFRjbF9JbnRlcnAgKik7Ci0JCVRrSW1hZ2luZ19Jbml0KGludGVycCk7Ci0JCS8qIFhYWCBUa0ltYWdpbmdfSW5pdCgpIGRvZXNuJ3QgaGF2ZSB0aGUgcmlnaHQgcmV0dXJuIHR5cGUgKi8KLQkJLypUY2xfU3RhdGljUGFja2FnZShpbnRlcnAsICJJbWFnaW5nIiwgVGtJbWFnaW5nX0luaXQsIE5VTEwpOyovCi0JfQorICAgIHsKKyAgICAgICAgZXh0ZXJuIHZvaWQgVGtJbWFnaW5nX0luaXQoVGNsX0ludGVycCAqKTsKKyAgICAgICAgVGtJbWFnaW5nX0luaXQoaW50ZXJwKTsKKyAgICAgICAgLyogWFhYIFRrSW1hZ2luZ19Jbml0KCkgZG9lc24ndCBoYXZlIHRoZSByaWdodCByZXR1cm4gdHlwZSAqLworICAgICAgICAvKlRjbF9TdGF0aWNQYWNrYWdlKGludGVycCwgIkltYWdpbmciLCBUa0ltYWdpbmdfSW5pdCwgTlVMTCk7Ki8KKyAgICB9CiAjZW5kaWYKIAogI2lmZGVmIFdJVEhfUElMX09MRCAvKiAwLjJiNCBhbmQgZWFybGllciAqLwotCXsKLQkJZXh0ZXJuIHZvaWQgVGtJbWFnaW5nX0luaXQodm9pZCk7Ci0JCS8qIFhYWCBUa0ltYWdpbmdfSW5pdCgpIGRvZXNuJ3QgaGF2ZSB0aGUgcmlnaHQgcHJvdG90eXBlICovCi0JCS8qVGNsX1N0YXRpY1BhY2thZ2UoaW50ZXJwLCAiSW1hZ2luZyIsIFRrSW1hZ2luZ19Jbml0LCBOVUxMKTsqLwotCX0KKyAgICB7CisgICAgICAgIGV4dGVybiB2b2lkIFRrSW1hZ2luZ19Jbml0KHZvaWQpOworICAgICAgICAvKiBYWFggVGtJbWFnaW5nX0luaXQoKSBkb2Vzbid0IGhhdmUgdGhlIHJpZ2h0IHByb3RvdHlwZSAqLworICAgICAgICAvKlRjbF9TdGF0aWNQYWNrYWdlKGludGVycCwgIkltYWdpbmciLCBUa0ltYWdpbmdfSW5pdCwgTlVMTCk7Ki8KKyAgICB9CiAjZW5kaWYKIAogI2lmZGVmIFdJVEhfVElYCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICBleHRlcm4gaW50IFRpeF9Jbml0KFRjbF9JbnRlcnAgKmludGVycCk7Ci0gICAgICAgICAgICAgICAgZXh0ZXJuIGludCBUaXhfU2FmZUluaXQoVGNsX0ludGVycCAqaW50ZXJwKTsKLSAgICAgICAgICAgICAgICBUY2xfU3RhdGljUGFja2FnZShOVUxMLCAiVGl4IiwgVGl4X0luaXQsIFRpeF9TYWZlSW5pdCk7Ci0gICAgICAgIH0KKyAgICB7CisgICAgICAgIGV4dGVybiBpbnQgVGl4X0luaXQoVGNsX0ludGVycCAqaW50ZXJwKTsKKyAgICAgICAgZXh0ZXJuIGludCBUaXhfU2FmZUluaXQoVGNsX0ludGVycCAqaW50ZXJwKTsKKyAgICAgICAgVGNsX1N0YXRpY1BhY2thZ2UoTlVMTCwgIlRpeCIsIFRpeF9Jbml0LCBUaXhfU2FmZUluaXQpOworICAgIH0KICNlbmRpZgogCiAjaWZkZWYgV0lUSF9CTFQKLQl7Ci0JCWV4dGVybiBpbnQgQmx0X0luaXQoVGNsX0ludGVycCAqKTsKLQkJZXh0ZXJuIGludCBCbHRfU2FmZUluaXQoVGNsX0ludGVycCAqKTsKLQkJVGNsX1N0YXRpY1BhY2thZ2UoTlVMTCwgIkJsdCIsIEJsdF9Jbml0LCBCbHRfU2FmZUluaXQpOwotCX0KKyAgICB7CisgICAgICAgIGV4dGVybiBpbnQgQmx0X0luaXQoVGNsX0ludGVycCAqKTsKKyAgICAgICAgZXh0ZXJuIGludCBCbHRfU2FmZUluaXQoVGNsX0ludGVycCAqKTsKKyAgICAgICAgVGNsX1N0YXRpY1BhY2thZ2UoTlVMTCwgIkJsdCIsIEJsdF9Jbml0LCBCbHRfU2FmZUluaXQpOworICAgIH0KICNlbmRpZgogCiAjaWZkZWYgV0lUSF9UT0dMCi0JewotCQkvKiBYWFggSSd2ZSBoZWFyZCBydW1vcnMgdGhhdCB0aGlzIGRvZXNuJ3Qgd29yayAqLwotCQlleHRlcm4gaW50IFRvZ2xfSW5pdChUY2xfSW50ZXJwICopOwotCQkvKiBYWFggSXMgdGhlcmUgbm8gVG9nbF9TYWZlSW5pdD8gKi8KLQkJVGNsX1N0YXRpY1BhY2thZ2UoTlVMTCwgIlRvZ2wiLCBUb2dsX0luaXQsIE5VTEwpOwotCX0KKyAgICB7CisgICAgICAgIC8qIFhYWCBJJ3ZlIGhlYXJkIHJ1bW9ycyB0aGF0IHRoaXMgZG9lc24ndCB3b3JrICovCisgICAgICAgIGV4dGVybiBpbnQgVG9nbF9Jbml0KFRjbF9JbnRlcnAgKik7CisgICAgICAgIC8qIFhYWCBJcyB0aGVyZSBubyBUb2dsX1NhZmVJbml0PyAqLworICAgICAgICBUY2xfU3RhdGljUGFja2FnZShOVUxMLCAiVG9nbCIsIFRvZ2xfSW5pdCwgTlVMTCk7CisgICAgfQogI2VuZGlmCiAKICNpZmRlZiBXSVRIX1hYWAogCiAjZW5kaWYKLQlyZXR1cm4gVENMX09LOworICAgIHJldHVybiBUQ0xfT0s7CiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3VuaWNvZGVkYXRhLmMgYi9Nb2R1bGVzL3VuaWNvZGVkYXRhLmMKaW5kZXggMGU2MTg3Ny4uODI5MWQ1OCAxMDA2NDQKLS0tIGEvTW9kdWxlcy91bmljb2RlZGF0YS5jCisrKyBiL01vZHVsZXMvdW5pY29kZWRhdGEuYwpAQCAtMTksMTQgKzE5LDE0IEBACiAvKiBjaGFyYWN0ZXIgcHJvcGVydGllcyAqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0gICAgY29uc3QgdW5zaWduZWQgY2hhciBjYXRlZ29yeTsJLyogaW5kZXggaW50bwotCQkJCQkgICBfUHlVbmljb2RlX0NhdGVnb3J5TmFtZXMgKi8KLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyCWNvbWJpbmluZzsgCS8qIGNvbWJpbmluZyBjbGFzcyB2YWx1ZSAwIC0gMjU1ICovCi0gICAgY29uc3QgdW5zaWduZWQgY2hhcgliaWRpcmVjdGlvbmFsOyAJLyogaW5kZXggaW50bwotCQkJCQkgICBfUHlVbmljb2RlX0JpZGlyZWN0aW9uYWxOYW1lcyAqLwotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgbWlycm9yZWQ7CS8qIHRydWUgaWYgbWlycm9yZWQgaW4gYmlkaXIgbW9kZSAqLwotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgZWFzdF9hc2lhbl93aWR0aDsJLyogaW5kZXggaW50bwotCQkJCQkJICAgX1B5VW5pY29kZV9FYXN0QXNpYW5XaWR0aCAqLworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgY2F0ZWdvcnk7ICAgICAgIC8qIGluZGV4IGludG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUHlVbmljb2RlX0NhdGVnb3J5TmFtZXMgKi8KKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyIGNvbWJpbmluZzsgICAgICAvKiBjb21iaW5pbmcgY2xhc3MgdmFsdWUgMCAtIDI1NSAqLworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgYmlkaXJlY3Rpb25hbDsgIC8qIGluZGV4IGludG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUHlVbmljb2RlX0JpZGlyZWN0aW9uYWxOYW1lcyAqLworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgbWlycm9yZWQ7ICAgICAgIC8qIHRydWUgaWYgbWlycm9yZWQgaW4gYmlkaXIgbW9kZSAqLworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgZWFzdF9hc2lhbl93aWR0aDsgICAgICAgLyogaW5kZXggaW50bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1B5VW5pY29kZV9FYXN0QXNpYW5XaWR0aCAqLwogfSBfUHlVbmljb2RlX0RhdGFiYXNlUmVjb3JkOwogCiB0eXBlZGVmIHN0cnVjdCBjaGFuZ2VfcmVjb3JkIHsKQEAgLTY2LDcgKzY2LDcgQEAKICNkZWZpbmUgZ2V0X29sZF9yZWNvcmQoc2VsZiwgdikgICAgKCgoKFByZXZpb3VzREJWZXJzaW9uKilzZWxmKS0+Z2V0cmVjb3JkKSh2KSkKIAogc3RhdGljIFB5TWVtYmVyRGVmIERCX21lbWJlcnNbXSA9IHsKLQl7InVuaWRhdGFfdmVyc2lvbiIsIFRfU1RSSU5HLCBvZmZzZXRvZihQcmV2aW91c0RCVmVyc2lvbiwgbmFtZSksIFJFQURPTkxZfSwKKyAgICAgICAgeyJ1bmlkYXRhX3ZlcnNpb24iLCBUX1NUUklORywgb2Zmc2V0b2YoUHJldmlvdXNEQlZlcnNpb24sIG5hbWUpLCBSRUFET05MWX0sCiAgICAgICAgIHtOVUxMfQogfTsKIApAQCAtNzcsMTQgKzc3LDE0IEBACiBuZXdfcHJldmlvdXNfdmVyc2lvbihjb25zdCBjaGFyKm5hbWUsIGNvbnN0IGNoYW5nZV9yZWNvcmQqICgqZ2V0cmVjb3JkKShQeV9VQ1M0KSwKICAgICAgICAgICAgICAgICAgICAgIFB5X1VDUzQgKCpub3JtYWxpemF0aW9uKShQeV9VQ1M0KSkKIHsKLQlQcmV2aW91c0RCVmVyc2lvbiAqc2VsZjsKLQlzZWxmID0gUHlPYmplY3RfTmV3KFByZXZpb3VzREJWZXJzaW9uLCAmVUNEX1R5cGUpOwotCWlmIChzZWxmID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXNlbGYtPm5hbWUgPSBuYW1lOwotCXNlbGYtPmdldHJlY29yZCA9IGdldHJlY29yZDsKKyAgICAgICAgUHJldmlvdXNEQlZlcnNpb24gKnNlbGY7CisgICAgICAgIHNlbGYgPSBQeU9iamVjdF9OZXcoUHJldmlvdXNEQlZlcnNpb24sICZVQ0RfVHlwZSk7CisgICAgICAgIGlmIChzZWxmID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHNlbGYtPm5hbWUgPSBuYW1lOworICAgICAgICBzZWxmLT5nZXRyZWNvcmQgPSBnZXRyZWNvcmQ7CiAgICAgICAgIHNlbGYtPm5vcm1hbGl6YXRpb24gPSBub3JtYWxpemF0aW9uOwotCXJldHVybiAoUHlPYmplY3QqKXNlbGY7CisgICAgICAgIHJldHVybiAoUHlPYmplY3QqKXNlbGY7CiB9CiAKIApAQCAtOTMsMTIgKzkzLDEyIEBACiAgICAgUHlfVU5JQ09ERSAqdiA9IFB5VW5pY29kZV9BU19VTklDT0RFKG9iaik7CiAKICAgICBpZiAoUHlVbmljb2RlX0dFVF9TSVpFKG9iaikgPT0gMSkKLQlyZXR1cm4gKnY7CisgICAgICAgIHJldHVybiAqdjsKICNpZm5kZWYgUHlfVU5JQ09ERV9XSURFCiAgICAgZWxzZSBpZiAoKFB5VW5pY29kZV9HRVRfU0laRShvYmopID09IDIpICYmCiAgICAgICAgICAgICAgKDB4RDgwMCA8PSB2WzBdICYmIHZbMF0gPD0gMHhEQkZGKSAmJgogICAgICAgICAgICAgICgweERDMDAgPD0gdlsxXSAmJiB2WzFdIDw9IDB4REZGRikpCi0JcmV0dXJuICgoKHZbMF0gJiAweDNGRik8PDEwKSB8ICh2WzFdICYgMHgzRkYpKSArIDB4MTAwMDA7CisgICAgICAgIHJldHVybiAoKCh2WzBdICYgMHgzRkYpPDwxMCkgfCAodlsxXSAmIDB4M0ZGKSkgKyAweDEwMDAwOwogI2VuZGlmCiAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKICAgICAgICAgICAgICAgICAgICAgIm5lZWQgYSBzaW5nbGUgVW5pY29kZSBjaGFyYWN0ZXIgYXMgcGFyYW1ldGVyIik7CkBAIC0xMzUsNyArMTM1LDcgQEAKICAgICAgICAgICAgIC8qIHVuYXNzaWduZWQgKi8KICAgICAgICAgICAgIGhhdmVfb2xkID0gMTsKICAgICAgICAgICAgIHJjID0gLTE7Ci0gICAgICAgIH0gCisgICAgICAgIH0KICAgICAgICAgZWxzZSBpZiAob2xkLT5kZWNpbWFsX2NoYW5nZWQgIT0gMHhGRikgewogICAgICAgICAgICAgaGF2ZV9vbGQgPSAxOwogICAgICAgICAgICAgcmMgPSBvbGQtPmRlY2ltYWxfY2hhbmdlZDsKQEAgLTE0NSwxNSArMTQ1LDE1IEBACiAgICAgaWYgKCFoYXZlX29sZCkKICAgICAgICAgcmMgPSBQeV9VTklDT0RFX1RPREVDSU1BTChjKTsKICAgICBpZiAocmMgPCAwKSB7Ci0JaWYgKGRlZm9iaiA9PSBOVUxMKSB7Ci0JICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJICAgICJub3QgYSBkZWNpbWFsIik7CisgICAgICAgIGlmIChkZWZvYmogPT0gTlVMTCkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vdCBhIGRlY2ltYWwiKTsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwotCX0KLQllbHNlIHsKLQkgICAgUHlfSU5DUkVGKGRlZm9iaik7Ci0JICAgIHJldHVybiBkZWZvYmo7Ci0JfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgUHlfSU5DUkVGKGRlZm9iaik7CisgICAgICAgICAgICByZXR1cm4gZGVmb2JqOworICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhyYyk7CiB9CkBAIC0xODAsMTQgKzE4MCwxNCBAQAogICAgICAgICByZXR1cm4gTlVMTDsKICAgICByYyA9IFB5X1VOSUNPREVfVE9ESUdJVChjKTsKICAgICBpZiAocmMgPCAwKSB7Ci0JaWYgKGRlZm9iaiA9PSBOVUxMKSB7Ci0JICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAibm90IGEgZGlnaXQiKTsKKyAgICAgICAgaWYgKGRlZm9iaiA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIm5vdCBhIGRpZ2l0Iik7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLQl9Ci0JZWxzZSB7Ci0JICAgIFB5X0lOQ1JFRihkZWZvYmopOwotCSAgICByZXR1cm4gZGVmb2JqOwotCX0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihkZWZvYmopOworICAgICAgICAgICAgcmV0dXJuIGRlZm9iajsKKyAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcocmMpOwogfQpAQCAtMjIwLDcgKzIyMCw3IEBACiAgICAgICAgICAgICAvKiB1bmFzc2lnbmVkICovCiAgICAgICAgICAgICBoYXZlX29sZCA9IDE7CiAgICAgICAgICAgICByYyA9IC0xLjA7Ci0gICAgICAgIH0gCisgICAgICAgIH0KICAgICAgICAgZWxzZSBpZiAob2xkLT5kZWNpbWFsX2NoYW5nZWQgIT0gMHhGRikgewogICAgICAgICAgICAgaGF2ZV9vbGQgPSAxOwogICAgICAgICAgICAgcmMgPSBvbGQtPmRlY2ltYWxfY2hhbmdlZDsKQEAgLTIzMCwxNCArMjMwLDE0IEBACiAgICAgaWYgKCFoYXZlX29sZCkKICAgICAgICAgcmMgPSBQeV9VTklDT0RFX1RPTlVNRVJJQyhjKTsKICAgICBpZiAocmMgPT0gLTEuMCkgewotCWlmIChkZWZvYmogPT0gTlVMTCkgewotCSAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIm5vdCBhIG51bWVyaWMgY2hhcmFjdGVyIik7Ci0JICAgIHJldHVybiBOVUxMOwotCX0KLQllbHNlIHsKLQkgICAgUHlfSU5DUkVGKGRlZm9iaik7Ci0JICAgIHJldHVybiBkZWZvYmo7Ci0JfQorICAgICAgICBpZiAoZGVmb2JqID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAibm90IGEgbnVtZXJpYyBjaGFyYWN0ZXIiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgUHlfSU5DUkVGKGRlZm9iaik7CisgICAgICAgICAgICByZXR1cm4gZGVmb2JqOworICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUocmMpOwogfQpAQCAtMjU2LDggKzI1Niw4IEBACiAgICAgUHlfVUNTNCBjOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPITpjYXRlZ29yeSIsCi0JCQkgICZQeVVuaWNvZGVfVHlwZSwgJnYpKQotCXJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAmUHlVbmljb2RlX1R5cGUsICZ2KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgYyA9IGdldHVjaGFyKHYpOwogICAgIGlmIChjID09IChQeV9VQ1M0KS0xKQogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTI4NSw4ICsyODUsOCBAQAogICAgIFB5X1VDUzQgYzsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyE6YmlkaXJlY3Rpb25hbCIsCi0JCQkgICZQeVVuaWNvZGVfVHlwZSwgJnYpKQotCXJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAmUHlVbmljb2RlX1R5cGUsICZ2KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgYyA9IGdldHVjaGFyKHYpOwogICAgIGlmIChjID09IChQeV9VQ1M0KS0xKQogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTMxNiw4ICszMTYsOCBAQAogICAgIFB5X1VDUzQgYzsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyE6Y29tYmluaW5nIiwKLQkJCSAgJlB5VW5pY29kZV9UeXBlLCAmdikpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICZQeVVuaWNvZGVfVHlwZSwgJnYpKQorICAgICAgICByZXR1cm4gTlVMTDsKICAgICBjID0gZ2V0dWNoYXIodik7CiAgICAgaWYgKGMgPT0gKFB5X1VDUzQpLTEpCiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtMzQ1LDggKzM0NSw4IEBACiAgICAgUHlfVUNTNCBjOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPITptaXJyb3JlZCIsCi0JCQkgICZQeVVuaWNvZGVfVHlwZSwgJnYpKQotCXJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAmUHlVbmljb2RlX1R5cGUsICZ2KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgYyA9IGdldHVjaGFyKHYpOwogICAgIGlmIChjID09IChQeV9VQ1M0KS0xKQogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTM3NSw4ICszNzUsOCBAQAogICAgIFB5X1VDUzQgYzsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyE6ZWFzdF9hc2lhbl93aWR0aCIsCi0JCQkgICZQeVVuaWNvZGVfVHlwZSwgJnYpKQotCXJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAmUHlVbmljb2RlX1R5cGUsICZ2KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgYyA9IGdldHVjaGFyKHYpOwogICAgIGlmIChjID09IChQeV9VQ1M0KS0xKQogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTQwNiw4ICs0MDYsOCBAQAogICAgIFB5X1VDUzQgYzsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyE6ZGVjb21wb3NpdGlvbiIsCi0JCQkgICZQeVVuaWNvZGVfVHlwZSwgJnYpKQotCXJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAmUHlVbmljb2RlX1R5cGUsICZ2KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgYyA9IGdldHVjaGFyKHYpOwogICAgIGlmIChjID09IChQeV9VQ1M0KS0xKQogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTQ1Myw3ICs0NTMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgIGRlY29tcF9kYXRhWysraW5kZXhdKTsKICAgICAgICAgaSArPSBzdHJsZW4oZGVjb21wICsgaSk7CiAgICAgfQotICAgIAorCiAgICAgZGVjb21wW2ldID0gJ1wwJzsKIAogICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGRlY29tcCk7CkBAIC00NzMsNyArNDczLDcgQEAKICAgICAgICAgKmluZGV4ID0gZGVjb21wX2luZGV4MlsoKmluZGV4PDxERUNPTVBfU0hJRlQpKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb2RlJigoMTw8REVDT01QX1NISUZUKS0xKSldOwogICAgIH0KLQkKKwogICAgIC8qIGhpZ2ggYnl0ZSBpcyBudW1iZXIgb2YgaGV4IGJ5dGVzICh1c3VhbGx5IG9uZSBvciB0d28pLCBsb3cgYnl0ZQogICAgICAgIGlzIHByZWZpeCBjb2RlIChmcm9tKi8KICAgICAqY291bnQgPSBkZWNvbXBfZGF0YVsqaW5kZXhdID4+IDg7CkBAIC00OTgsMTEgKzQ5OCwxMSBAQAogICAgIFB5T2JqZWN0ICpyZXN1bHQ7CiAgICAgUHlfVU5JQ09ERSAqaSwgKmVuZCwgKm87CiAgICAgLyogTG9uZ2VzdCBkZWNvbXBvc2l0aW9uIGluIFVuaWNvZGUgMy4yOiBVK0ZERkEgKi8KLSAgICBQeV9VTklDT0RFIHN0YWNrWzIwXTsgCisgICAgUHlfVU5JQ09ERSBzdGFja1syMF07CiAgICAgUHlfc3NpemVfdCBzcGFjZSwgaXNpemU7CiAgICAgaW50IGluZGV4LCBwcmVmaXgsIGNvdW50LCBzdGFja3B0cjsKICAgICB1bnNpZ25lZCBjaGFyIHByZXYsIGN1cjsKLQkKKwogICAgIHN0YWNrcHRyID0gMDsKICAgICBpc2l6ZSA9IFB5VW5pY29kZV9HRVRfU0laRShpbnB1dCk7CiAgICAgLyogT3ZlcmFsbG9jYXRlIGF0bW9zdCAxMCBjaGFyYWN0ZXJzLiAqLwpAQCAtNjM5LDEyICs2MzksMTIgQEAKICAgICBpID0gUHlVbmljb2RlX0FTX1VOSUNPREUocmVzdWx0KTsKICAgICBlbmQgPSBpICsgUHlVbmljb2RlX0dFVF9TSVpFKHJlc3VsdCk7CiAgICAgbyA9IFB5VW5pY29kZV9BU19VTklDT0RFKHJlc3VsdCk7Ci0JCisKICAgYWdhaW46CiAgICAgd2hpbGUgKGkgPCBlbmQpIHsKICAgICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IGNza2lwcGVkOyBpbmRleCsrKSB7CiAgICAgICAgICAgaWYgKHNraXBwZWRbaW5kZXhdID09IGkpIHsKLSAgICAgICAgICAgICAgLyogKmkgY2hhcmFjdGVyIGlzIHNraXBwZWQuIAorICAgICAgICAgICAgICAvKiAqaSBjaGFyYWN0ZXIgaXMgc2tpcHBlZC4KICAgICAgICAgICAgICAgICAgUmVtb3ZlIGZyb20gbGlzdC4gKi8KICAgICAgICAgICAgICAgc2tpcHBlZFtpbmRleF0gPSBza2lwcGVkW2Nza2lwcGVkLTFdOwogICAgICAgICAgICAgICBjc2tpcHBlZC0tOwpAQCAtNjU1LDcgKzY1NSw3IEBACiAgICAgICAvKiBIYW5ndWwgQ29tcG9zaXRpb24uIFdlIGRvbid0IG5lZWQgdG8gY2hlY2sgZm9yIDxMVixUPgogICAgICAgICAgcGFpcnMsIHNpbmNlIHdlIGFsd2F5cyBoYXZlIGRlY29tcG9zZWQgZGF0YS4gKi8KICAgICAgIGlmIChMQmFzZSA8PSAqaSAmJiAqaSA8IChMQmFzZStMQ291bnQpICYmCi0gICAgICAgICAgaSArIDEgPCBlbmQgJiYgCisgICAgICAgICAgaSArIDEgPCBlbmQgJiYKICAgICAgICAgICBWQmFzZSA8PSBpWzFdICYmIGlbMV0gPD0gKFZCYXNlK1ZDb3VudCkpIHsKICAgICAgICAgICBpbnQgTEluZGV4LCBWSW5kZXg7CiAgICAgICAgICAgTEluZGV4ID0gaVswXSAtIExCYXNlOwpAQCAtNzA0LDcgKzcwNCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5kZXgmKCgxPDxDT01QX1NISUZUKS0xKSldOwogICAgICAgICAgIGlmIChjb2RlID09IDApCiAgICAgICAgICAgICAgIGdvdG8gbm90X2NvbWJpbmFibGU7Ci0JCQkKKwogICAgICAgICAgIC8qIFJlcGxhY2UgdGhlIG9yaWdpbmFsIGNoYXJhY3Rlci4gKi8KICAgICAgICAgICAqaSA9IGNvZGU7CiAgICAgICAgICAgLyogTWFyayB0aGUgc2Vjb25kIGNoYXJhY3RlciB1bnVzZWQuICovCkBAIC03MjAsNyArNzIwLDcgQEAKICAgICAgICAgUHlVbmljb2RlX1Jlc2l6ZSgmcmVzdWx0LCBvIC0gUHlVbmljb2RlX0FTX1VOSUNPREUocmVzdWx0KSk7CiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KLQkJCisKIFB5RG9jX1NUUlZBUih1bmljb2RlZGF0YV9ub3JtYWxpemVfX2RvY19fLAogIm5vcm1hbGl6ZShmb3JtLCB1bmlzdHIpXG5cCiBcblwKQEAgLTgzNiwyOSArODM2LDI5IEBACiAgICAgICAgIGlmIChvbGQtPmNhdGVnb3J5X2NoYW5nZWQgPT0gMCkgewogICAgICAgICAgICAgLyogdW5hc3NpZ25lZCAqLwogICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0gCisgICAgICAgIH0KICAgICB9CiAKICAgICBpZiAoU0Jhc2UgPD0gY29kZSAmJiBjb2RlIDwgU0Jhc2UrU0NvdW50KSB7Ci0JLyogSGFuZ3VsIHN5bGxhYmxlLiAqLwotCWludCBTSW5kZXggPSBjb2RlIC0gU0Jhc2U7Ci0JaW50IEwgPSBTSW5kZXggLyBOQ291bnQ7Ci0JaW50IFYgPSAoU0luZGV4ICUgTkNvdW50KSAvIFRDb3VudDsKLQlpbnQgVCA9IFNJbmRleCAlIFRDb3VudDsKKyAgICAgICAgLyogSGFuZ3VsIHN5bGxhYmxlLiAqLworICAgICAgICBpbnQgU0luZGV4ID0gY29kZSAtIFNCYXNlOworICAgICAgICBpbnQgTCA9IFNJbmRleCAvIE5Db3VudDsKKyAgICAgICAgaW50IFYgPSAoU0luZGV4ICUgTkNvdW50KSAvIFRDb3VudDsKKyAgICAgICAgaW50IFQgPSBTSW5kZXggJSBUQ291bnQ7CiAKLQlpZiAoYnVmbGVuIDwgMjcpCi0JICAgIC8qIFdvcnN0IGNhc2U6IEhBTkdVTCBTWUxMQUJMRSA8MTBjaGFycz4uICovCi0JICAgIHJldHVybiAwOwotCXN0cmNweShidWZmZXIsICJIQU5HVUwgU1lMTEFCTEUgIik7Ci0JYnVmZmVyICs9IDE2OwotCXN0cmNweShidWZmZXIsIGhhbmd1bF9zeWxsYWJsZXNbTF1bMF0pOwotCWJ1ZmZlciArPSBzdHJsZW4oaGFuZ3VsX3N5bGxhYmxlc1tMXVswXSk7Ci0Jc3RyY3B5KGJ1ZmZlciwgaGFuZ3VsX3N5bGxhYmxlc1tWXVsxXSk7Ci0JYnVmZmVyICs9IHN0cmxlbihoYW5ndWxfc3lsbGFibGVzW1ZdWzFdKTsKLQlzdHJjcHkoYnVmZmVyLCBoYW5ndWxfc3lsbGFibGVzW1RdWzJdKTsKLQlidWZmZXIgKz0gc3RybGVuKGhhbmd1bF9zeWxsYWJsZXNbVF1bMl0pOwotCSpidWZmZXIgPSAnXDAnOwotCXJldHVybiAxOworICAgICAgICBpZiAoYnVmbGVuIDwgMjcpCisgICAgICAgICAgICAvKiBXb3JzdCBjYXNlOiBIQU5HVUwgU1lMTEFCTEUgPDEwY2hhcnM+LiAqLworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHN0cmNweShidWZmZXIsICJIQU5HVUwgU1lMTEFCTEUgIik7CisgICAgICAgIGJ1ZmZlciArPSAxNjsKKyAgICAgICAgc3RyY3B5KGJ1ZmZlciwgaGFuZ3VsX3N5bGxhYmxlc1tMXVswXSk7CisgICAgICAgIGJ1ZmZlciArPSBzdHJsZW4oaGFuZ3VsX3N5bGxhYmxlc1tMXVswXSk7CisgICAgICAgIHN0cmNweShidWZmZXIsIGhhbmd1bF9zeWxsYWJsZXNbVl1bMV0pOworICAgICAgICBidWZmZXIgKz0gc3RybGVuKGhhbmd1bF9zeWxsYWJsZXNbVl1bMV0pOworICAgICAgICBzdHJjcHkoYnVmZmVyLCBoYW5ndWxfc3lsbGFibGVzW1RdWzJdKTsKKyAgICAgICAgYnVmZmVyICs9IHN0cmxlbihoYW5ndWxfc3lsbGFibGVzW1RdWzJdKTsKKyAgICAgICAgKmJ1ZmZlciA9ICdcMCc7CisgICAgICAgIHJldHVybiAxOwogICAgIH0KIAogICAgIGlmIChpc191bmlmaWVkX2lkZW9ncmFwaChjb2RlKSkgewpAQCAtOTI1LDIzICs5MjUsMjMgQEAKICAgICByZXR1cm4gYnVmZmVyW25hbWVsZW5dID09ICdcMCc7CiB9CiAKLXN0YXRpYyB2b2lkIAorc3RhdGljIHZvaWQKIGZpbmRfc3lsbGFibGUoY29uc3QgY2hhciAqc3RyLCBpbnQgKmxlbiwgaW50ICpwb3MsIGludCBjb3VudCwgaW50IGNvbHVtbikKIHsKICAgICBpbnQgaSwgbGVuMTsKICAgICAqbGVuID0gLTE7CiAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQljaGFyICpzID0gaGFuZ3VsX3N5bGxhYmxlc1tpXVtjb2x1bW5dOwotCWxlbjEgPSBzdHJsZW4ocyk7Ci0JaWYgKGxlbjEgPD0gKmxlbikKLQkgICAgY29udGludWU7Ci0JaWYgKHN0cm5jbXAoc3RyLCBzLCBsZW4xKSA9PSAwKSB7Ci0JICAgICpsZW4gPSBsZW4xOwotCSAgICAqcG9zID0gaTsKLQl9CisgICAgICAgIGNoYXIgKnMgPSBoYW5ndWxfc3lsbGFibGVzW2ldW2NvbHVtbl07CisgICAgICAgIGxlbjEgPSBzdHJsZW4ocyk7CisgICAgICAgIGlmIChsZW4xIDw9ICpsZW4pCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKHN0cm5jbXAoc3RyLCBzLCBsZW4xKSA9PSAwKSB7CisgICAgICAgICAgICAqbGVuID0gbGVuMTsKKyAgICAgICAgICAgICpwb3MgPSBpOworICAgICAgICB9CiAgICAgfQogICAgIGlmICgqbGVuID09IC0xKSB7Ci0JKmxlbiA9IDA7CisgICAgICAgICpsZW4gPSAwOwogICAgIH0KIH0KIApAQCAtOTU0LDE4ICs5NTQsMTggQEAKIAogICAgIC8qIENoZWNrIGZvciBoYW5ndWwgc3lsbGFibGVzLiAqLwogICAgIGlmIChzdHJuY21wKG5hbWUsICJIQU5HVUwgU1lMTEFCTEUgIiwgMTYpID09IDApIHsKLQlpbnQgbGVuLCBMID0gLTEsIFYgPSAtMSwgVCA9IC0xOwotCWNvbnN0IGNoYXIgKnBvcyA9IG5hbWUgKyAxNjsKLQlmaW5kX3N5bGxhYmxlKHBvcywgJmxlbiwgJkwsIExDb3VudCwgMCk7Ci0JcG9zICs9IGxlbjsKLQlmaW5kX3N5bGxhYmxlKHBvcywgJmxlbiwgJlYsIFZDb3VudCwgMSk7Ci0JcG9zICs9IGxlbjsKLQlmaW5kX3N5bGxhYmxlKHBvcywgJmxlbiwgJlQsIFRDb3VudCwgMik7Ci0JcG9zICs9IGxlbjsKLQlpZiAoTCAhPSAtMSAmJiBWICE9IC0xICYmIFQgIT0gLTEgJiYgcG9zLW5hbWUgPT0gbmFtZWxlbikgewotCSAgICAqY29kZSA9IFNCYXNlICsgKEwqVkNvdW50K1YpKlRDb3VudCArIFQ7Ci0JICAgIHJldHVybiAxOwotCX0KKyAgICAgICAgaW50IGxlbiwgTCA9IC0xLCBWID0gLTEsIFQgPSAtMTsKKyAgICAgICAgY29uc3QgY2hhciAqcG9zID0gbmFtZSArIDE2OworICAgICAgICBmaW5kX3N5bGxhYmxlKHBvcywgJmxlbiwgJkwsIExDb3VudCwgMCk7CisgICAgICAgIHBvcyArPSBsZW47CisgICAgICAgIGZpbmRfc3lsbGFibGUocG9zLCAmbGVuLCAmViwgVkNvdW50LCAxKTsKKyAgICAgICAgcG9zICs9IGxlbjsKKyAgICAgICAgZmluZF9zeWxsYWJsZShwb3MsICZsZW4sICZULCBUQ291bnQsIDIpOworICAgICAgICBwb3MgKz0gbGVuOworICAgICAgICBpZiAoTCAhPSAtMSAmJiBWICE9IC0xICYmIFQgIT0gLTEgJiYgcG9zLW5hbWUgPT0gbmFtZWxlbikgeworICAgICAgICAgICAgKmNvZGUgPSBTQmFzZSArIChMKlZDb3VudCtWKSpUQ291bnQgKyBUOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KICAgICAgICAgLyogT3RoZXJ3aXNlLCBpdCdzIGFuIGlsbGVnYWwgc3lsbGFibGUgbmFtZS4gKi8KICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQpAQCAtMTAyNSw3ICsxMDI1LDcgQEAKICAgICB9CiB9CiAKLXN0YXRpYyBjb25zdCBfUHlVbmljb2RlX05hbWVfQ0FQSSBoYXNoQVBJID0gCitzdGF0aWMgY29uc3QgX1B5VW5pY29kZV9OYW1lX0NBUEkgaGFzaEFQSSA9CiB7CiAgICAgc2l6ZW9mKF9QeVVuaWNvZGVfTmFtZV9DQVBJKSwKICAgICBfZ2V0dWNuYW1lLApAQCAtMTA1NywxNCArMTA1NywxNCBAQAogICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIGlmICghX2dldHVjbmFtZShzZWxmLCBjLCBuYW1lLCBzaXplb2YobmFtZSkpKSB7Ci0JaWYgKGRlZm9iaiA9PSBOVUxMKSB7Ci0JICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAibm8gc3VjaCBuYW1lIik7CisgICAgICAgIGlmIChkZWZvYmogPT0gTlVMTCkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJubyBzdWNoIG5hbWUiKTsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwotCX0KLQllbHNlIHsKLQkgICAgUHlfSU5DUkVGKGRlZm9iaik7Ci0JICAgIHJldHVybiBkZWZvYmo7Ci0JfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgUHlfSU5DUkVGKGRlZm9iaik7CisgICAgICAgICAgICByZXR1cm4gZGVmb2JqOworICAgICAgICB9CiAgICAgfQogCiAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoInMiLCBuYW1lKTsKQEAgLTExMDIsNyArMTEwMiw3IEBACiAgICAgfQogI2VuZGlmCiAgICAgc3RyWzBdID0gKFB5X1VOSUNPREUpIGNvZGU7Ci0gICAgcmV0dXJuIFB5VW5pY29kZV9Gcm9tVW5pY29kZShzdHIsIDEpOyAgICAKKyAgICByZXR1cm4gUHlVbmljb2RlX0Zyb21Vbmljb2RlKHN0ciwgMSk7CiB9CiAKIC8qIFhYWCBBZGQgZG9jIHN0cmluZ3MuICovCkBAIC0xMTI3LDI3ICsxMTI3LDI3IEBACiAgICAgeyJsb29rdXAiLCB1bmljb2RlZGF0YV9sb29rdXAsIE1FVEhfVkFSQVJHUywgdW5pY29kZWRhdGFfbG9va3VwX19kb2NfX30sCiAgICAgeyJub3JtYWxpemUiLCB1bmljb2RlZGF0YV9ub3JtYWxpemUsIE1FVEhfVkFSQVJHUywKICAgICAgICAgICAgICAgICAgIHVuaWNvZGVkYXRhX25vcm1hbGl6ZV9fZG9jX199LAotICAgIHtOVUxMLCBOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7TlVMTCwgTlVMTH0gICAgICAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgVUNEX1R5cGUgPSB7Ci0JLyogVGhlIG9iX3R5cGUgZmllbGQgbXVzdCBiZSBpbml0aWFsaXplZCBpbiB0aGUgbW9kdWxlIGluaXQgZnVuY3Rpb24KLQkgKiB0byBiZSBwb3J0YWJsZSB0byBXaW5kb3dzIHdpdGhvdXQgdXNpbmcgQysrLiAqLwotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotCSJ1bmljb2RlZGF0YS5VQ0QiLAkJLyp0cF9uYW1lKi8KLQlzaXplb2YoUHJldmlvdXNEQlZlcnNpb24pLAkvKnRwX2Jhc2ljc2l6ZSovCi0JMCwJCQkvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpUHlPYmplY3RfRGVsLCAvKnRwX2RlYWxsb2MqLwotCTAsCQkJLyp0cF9wcmludCovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRhdHRyKi8KLQkwLAkJCS8qdHBfc2V0YXR0ciovCi0JMCwJCQkvKnRwX2NvbXBhcmUqLwotCTAsCQkJLyp0cF9yZXByKi8KLQkwLAkJCS8qdHBfYXNfbnVtYmVyKi8KLQkwLAkJCS8qdHBfYXNfc2VxdWVuY2UqLwotCTAsCQkJLyp0cF9hc19tYXBwaW5nKi8KLQkwLAkJCS8qdHBfaGFzaCovCisgICAgICAgIC8qIFRoZSBvYl90eXBlIGZpZWxkIG11c3QgYmUgaW5pdGlhbGl6ZWQgaW4gdGhlIG1vZHVsZSBpbml0IGZ1bmN0aW9uCisgICAgICAgICAqIHRvIGJlIHBvcnRhYmxlIHRvIFdpbmRvd3Mgd2l0aG91dCB1c2luZyBDKysuICovCisgICAgICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQorICAgICAgICAidW5pY29kZWRhdGEuVUNEIiwgICAgICAgICAgICAgIC8qdHBfbmFtZSovCisgICAgICAgIHNpemVvZihQcmV2aW91c0RCVmVyc2lvbiksICAgICAgLyp0cF9iYXNpY3NpemUqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZW1zaXplKi8KKyAgICAgICAgLyogbWV0aG9kcyAqLworICAgICAgICAoZGVzdHJ1Y3RvcilQeU9iamVjdF9EZWwsIC8qdHBfZGVhbGxvYyovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcHJpbnQqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHIqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHIqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NvbXBhcmUqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3JlcHIqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX251bWJlciovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfc2VxdWVuY2UqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX21hcHBpbmcqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2hhc2gqLwogICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NhbGwqLwogICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3N0ciovCiAgICAgICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLC8qdHBfZ2V0YXR0cm8qLwpAQCAtMTIxMyw3ICsxMjEzLDcgQEAKICAgICAgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJ1Y25oYXNoX0NBUEkiLCB2KTsKIH0KIAotLyogCisvKgogTG9jYWwgdmFyaWFibGVzOgogYy1iYXNpYy1vZmZzZXQ6IDQKIGluZGVudC10YWJzLW1vZGU6IG5pbApkaWZmIC0tZ2l0IGEvTW9kdWxlcy94eG1vZHVsZS5jIGIvTW9kdWxlcy94eG1vZHVsZS5jCmluZGV4IDZiNDk4ZGQuLjFkOWIwOGEgMTAwNjQ0Ci0tLSBhL01vZHVsZXMveHhtb2R1bGUuYworKysgYi9Nb2R1bGVzL3h4bW9kdWxlLmMKQEAgLTE5LDIzICsxOSwyMyBAQAogc3RhdGljIFB5T2JqZWN0ICpFcnJvck9iamVjdDsKIAogdHlwZWRlZiBzdHJ1Y3QgewotCVB5T2JqZWN0X0hFQUQKLQlQeU9iamVjdAkqeF9hdHRyOwkvKiBBdHRyaWJ1dGVzIGRpY3Rpb25hcnkgKi8KKyAgICBQeU9iamVjdF9IRUFECisgICAgUHlPYmplY3QgICAgICAgICAgICAqeF9hdHRyOyAgICAgICAgLyogQXR0cmlidXRlcyBkaWN0aW9uYXJ5ICovCiB9IFh4b09iamVjdDsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBYeG9fVHlwZTsKIAotI2RlZmluZSBYeG9PYmplY3RfQ2hlY2sodikJKFB5X1RZUEUodikgPT0gJlh4b19UeXBlKQorI2RlZmluZSBYeG9PYmplY3RfQ2hlY2sodikgICAgICAoUHlfVFlQRSh2KSA9PSAmWHhvX1R5cGUpCiAKIHN0YXRpYyBYeG9PYmplY3QgKgogbmV3WHhvT2JqZWN0KFB5T2JqZWN0ICphcmcpCiB7Ci0JWHhvT2JqZWN0ICpzZWxmOwotCXNlbGYgPSBQeU9iamVjdF9OZXcoWHhvT2JqZWN0LCAmWHhvX1R5cGUpOwotCWlmIChzZWxmID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXNlbGYtPnhfYXR0ciA9IE5VTEw7Ci0JcmV0dXJuIHNlbGY7CisgICAgWHhvT2JqZWN0ICpzZWxmOworICAgIHNlbGYgPSBQeU9iamVjdF9OZXcoWHhvT2JqZWN0LCAmWHhvX1R5cGUpOworICAgIGlmIChzZWxmID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHNlbGYtPnhfYXR0ciA9IE5VTEw7CisgICAgcmV0dXJuIHNlbGY7CiB9CiAKIC8qIFh4byBtZXRob2RzICovCkBAIC00MywxMDEgKzQzLDEwMSBAQAogc3RhdGljIHZvaWQKIFh4b19kZWFsbG9jKFh4b09iamVjdCAqc2VsZikKIHsKLQlQeV9YREVDUkVGKHNlbGYtPnhfYXR0cik7Ci0JUHlPYmplY3RfRGVsKHNlbGYpOworICAgIFB5X1hERUNSRUYoc2VsZi0+eF9hdHRyKTsKKyAgICBQeU9iamVjdF9EZWwoc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBYeG9fZGVtbyhYeG9PYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOmRlbW8iKSkKLQkJcmV0dXJuIE5VTEw7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOmRlbW8iKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgWHhvX21ldGhvZHNbXSA9IHsKLQl7ImRlbW8iLAkoUHlDRnVuY3Rpb24pWHhvX2RlbW8sCU1FVEhfVkFSQVJHUywKLQkJUHlEb2NfU1RSKCJkZW1vKCkgLT4gTm9uZSIpfSwKLQl7TlVMTCwJCU5VTEx9CQkvKiBzZW50aW5lbCAqLworICAgIHsiZGVtbyIsICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKVh4b19kZW1vLCAgTUVUSF9WQVJBUkdTLAorICAgICAgICBQeURvY19TVFIoImRlbW8oKSAtPiBOb25lIil9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKgogWHhvX2dldGF0dHIoWHhvT2JqZWN0ICpzZWxmLCBjaGFyICpuYW1lKQogewotCWlmIChzZWxmLT54X2F0dHIgIT0gTlVMTCkgewotCQlQeU9iamVjdCAqdiA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKHNlbGYtPnhfYXR0ciwgbmFtZSk7Ci0JCWlmICh2ICE9IE5VTEwpIHsKLQkJCVB5X0lOQ1JFRih2KTsKLQkJCXJldHVybiB2OwotCQl9Ci0JfQotCXJldHVybiBQeV9GaW5kTWV0aG9kKFh4b19tZXRob2RzLCAoUHlPYmplY3QgKilzZWxmLCBuYW1lKTsKKyAgICBpZiAoc2VsZi0+eF9hdHRyICE9IE5VTEwpIHsKKyAgICAgICAgUHlPYmplY3QgKnYgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhzZWxmLT54X2F0dHIsIG5hbWUpOworICAgICAgICBpZiAodiAhPSBOVUxMKSB7CisgICAgICAgICAgICBQeV9JTkNSRUYodik7CisgICAgICAgICAgICByZXR1cm4gdjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gUHlfRmluZE1ldGhvZChYeG9fbWV0aG9kcywgKFB5T2JqZWN0ICopc2VsZiwgbmFtZSk7CiB9CiAKIHN0YXRpYyBpbnQKIFh4b19zZXRhdHRyKFh4b09iamVjdCAqc2VsZiwgY2hhciAqbmFtZSwgUHlPYmplY3QgKnYpCiB7Ci0JaWYgKHNlbGYtPnhfYXR0ciA9PSBOVUxMKSB7Ci0JCXNlbGYtPnhfYXR0ciA9IFB5RGljdF9OZXcoKTsKLQkJaWYgKHNlbGYtPnhfYXR0ciA9PSBOVUxMKQotCQkJcmV0dXJuIC0xOwotCX0KLQlpZiAodiA9PSBOVUxMKSB7Ci0JCWludCBydiA9IFB5RGljdF9EZWxJdGVtU3RyaW5nKHNlbGYtPnhfYXR0ciwgbmFtZSk7Ci0JCWlmIChydiA8IDApCi0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfQXR0cmlidXRlRXJyb3IsCi0JCQkgICAgICAgICJkZWxldGUgbm9uLWV4aXN0aW5nIFh4byBhdHRyaWJ1dGUiKTsKLQkJcmV0dXJuIHJ2OwotCX0KLQllbHNlCi0JCXJldHVybiBQeURpY3RfU2V0SXRlbVN0cmluZyhzZWxmLT54X2F0dHIsIG5hbWUsIHYpOworICAgIGlmIChzZWxmLT54X2F0dHIgPT0gTlVMTCkgeworICAgICAgICBzZWxmLT54X2F0dHIgPSBQeURpY3RfTmV3KCk7CisgICAgICAgIGlmIChzZWxmLT54X2F0dHIgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKHYgPT0gTlVMTCkgeworICAgICAgICBpbnQgcnYgPSBQeURpY3RfRGVsSXRlbVN0cmluZyhzZWxmLT54X2F0dHIsIG5hbWUpOworICAgICAgICBpZiAocnYgPCAwKQorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0F0dHJpYnV0ZUVycm9yLAorICAgICAgICAgICAgICAgICJkZWxldGUgbm9uLWV4aXN0aW5nIFh4byBhdHRyaWJ1dGUiKTsKKyAgICAgICAgcmV0dXJuIHJ2OworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiBQeURpY3RfU2V0SXRlbVN0cmluZyhzZWxmLT54X2F0dHIsIG5hbWUsIHYpOwogfQogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IFh4b19UeXBlID0gewotCS8qIFRoZSBvYl90eXBlIGZpZWxkIG11c3QgYmUgaW5pdGlhbGl6ZWQgaW4gdGhlIG1vZHVsZSBpbml0IGZ1bmN0aW9uCi0JICogdG8gYmUgcG9ydGFibGUgdG8gV2luZG93cyB3aXRob3V0IHVzaW5nIEMrKy4gKi8KLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKLQkieHhtb2R1bGUuWHhvIiwJCS8qdHBfbmFtZSovCi0Jc2l6ZW9mKFh4b09iamVjdCksCS8qdHBfYmFzaWNzaXplKi8KLQkwLAkJCS8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcilYeG9fZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KLQkwLAkJCS8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYylYeG9fZ2V0YXR0ciwgLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpWHhvX3NldGF0dHIsIC8qdHBfc2V0YXR0ciovCi0JMCwJCQkvKnRwX2NvbXBhcmUqLwotCTAsCQkJLyp0cF9yZXByKi8KLQkwLAkJCS8qdHBfYXNfbnVtYmVyKi8KLQkwLAkJCS8qdHBfYXNfc2VxdWVuY2UqLwotCTAsCQkJLyp0cF9hc19tYXBwaW5nKi8KLQkwLAkJCS8qdHBfaGFzaCovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY2FsbCovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc3RyKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRhdHRybyovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc2V0YXR0cm8qLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX2J1ZmZlciovCi0gICAgICAgIFB5X1RQRkxBR1NfREVGQVVMVCwgICAgIC8qdHBfZmxhZ3MqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2RvYyovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfdHJhdmVyc2UqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NsZWFyKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9yaWNoY29tcGFyZSovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfd2Vha2xpc3RvZmZzZXQqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZXIqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZXJuZXh0Ki8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9tZXRob2RzKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9tZW1iZXJzKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRzZXQqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2Jhc2UqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2RpY3QqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2Rlc2NyX2dldCovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGVzY3Jfc2V0Ki8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kaWN0b2Zmc2V0Ki8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pbml0Ki8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hbGxvYyovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfbmV3Ki8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9mcmVlKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pc19nYyovCisgICAgLyogVGhlIG9iX3R5cGUgZmllbGQgbXVzdCBiZSBpbml0aWFsaXplZCBpbiB0aGUgbW9kdWxlIGluaXQgZnVuY3Rpb24KKyAgICAgKiB0byBiZSBwb3J0YWJsZSB0byBXaW5kb3dzIHdpdGhvdXQgdXNpbmcgQysrLiAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQorICAgICJ4eG1vZHVsZS5YeG8iLCAgICAgICAgICAgICAvKnRwX25hbWUqLworICAgIHNpemVvZihYeG9PYmplY3QpLCAgICAgICAgICAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcilYeG9fZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKVh4b19nZXRhdHRyLCAvKnRwX2dldGF0dHIqLworICAgIChzZXRhdHRyZnVuYylYeG9fc2V0YXR0ciwgLyp0cF9zZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jb21wYXJlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9yZXByKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19udW1iZXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX3NlcXVlbmNlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19tYXBwaW5nKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9oYXNoKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NhbGwqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc3RyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHJvKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHJvKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgLyp0cF9mbGFncyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kb2MqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfdHJhdmVyc2UqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY2xlYXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVybmV4dCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9tZXRob2RzKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX21lbWJlcnMqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0c2V0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2Jhc2UqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGljdCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kZXNjcl9nZXQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGVzY3Jfc2V0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2RpY3RvZmZzZXQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaW5pdCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hbGxvYyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9uZXcqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZnJlZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pc19nYyovCiB9OwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKQEAgLTE1MSwxMiArMTUxLDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogeHhfZm9vKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGksIGo7Ci0JbG9uZyByZXM7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsbDpmb28iLCAmaSwgJmopKQotCQlyZXR1cm4gTlVMTDsKLQlyZXMgPSBpK2o7IC8qIFhYWCBEbyBzb21ldGhpbmcgaGVyZSAqLwotCXJldHVybiBQeUludF9Gcm9tTG9uZyhyZXMpOworICAgIGxvbmcgaSwgajsKKyAgICBsb25nIHJlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImxsOmZvbyIsICZpLCAmaikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJlcyA9IGkrajsgLyogWFhYIERvIHNvbWV0aGluZyBoZXJlICovCisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHJlcyk7CiB9CiAKIApAQCAtMTY1LDE0ICsxNjUsMTQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiB4eF9uZXcoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVh4b09iamVjdCAqcnY7CisgICAgWHhvT2JqZWN0ICpydjsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOm5ldyIpKQotCQlyZXR1cm4gTlVMTDsKLQlydiA9IG5ld1h4b09iamVjdChhcmdzKTsKLQlpZiAocnYgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIChQeU9iamVjdCAqKXJ2OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOm5ldyIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBydiA9IG5ld1h4b09iamVjdChhcmdzKTsKKyAgICBpZiAocnYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKXJ2OwogfQogCiAvKiBFeGFtcGxlIHdpdGggc3VidGxlIGJ1ZyBmcm9tIGV4dGVuc2lvbnMgbWFudWFsICgiVGhpbiBJY2UiKS4gKi8KQEAgLTE4MCwyMCArMTgwLDIwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogeHhfYnVnKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqbGlzdCwgKml0ZW07CisgICAgUHlPYmplY3QgKmxpc3QsICppdGVtOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPOmJ1ZyIsICZsaXN0KSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPOmJ1ZyIsICZsaXN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpdGVtID0gUHlMaXN0X0dldEl0ZW0obGlzdCwgMCk7Ci0JLyogUHlfSU5DUkVGKGl0ZW0pOyAqLwotCVB5TGlzdF9TZXRJdGVtKGxpc3QsIDEsIFB5SW50X0Zyb21Mb25nKDBMKSk7Ci0JUHlPYmplY3RfUHJpbnQoaXRlbSwgc3Rkb3V0LCAwKTsKLQlwcmludGYoIlxuIik7Ci0JLyogUHlfREVDUkVGKGl0ZW0pOyAqLworICAgIGl0ZW0gPSBQeUxpc3RfR2V0SXRlbShsaXN0LCAwKTsKKyAgICAvKiBQeV9JTkNSRUYoaXRlbSk7ICovCisgICAgUHlMaXN0X1NldEl0ZW0obGlzdCwgMSwgUHlJbnRfRnJvbUxvbmcoMEwpKTsKKyAgICBQeU9iamVjdF9QcmludChpdGVtLCBzdGRvdXQsIDApOworICAgIHByaW50ZigiXG4iKTsKKyAgICAvKiBQeV9ERUNSRUYoaXRlbSk7ICovCiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiBUZXN0IGJhZCBmb3JtYXQgY2hhcmFjdGVyICovCkBAIC0yMDEsNjEgKzIwMSw2MSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHh4X3JvaihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKmE7Ci0JbG9uZyBiOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyM6cm9qIiwgJmEsICZiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5T2JqZWN0ICphOworICAgIGxvbmcgYjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8jOnJvaiIsICZhLCAmYikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogCiAvKiAtLS0tLS0tLS0tICovCiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgU3RyX1R5cGUgPSB7Ci0JLyogVGhlIG9iX3R5cGUgZmllbGQgbXVzdCBiZSBpbml0aWFsaXplZCBpbiB0aGUgbW9kdWxlIGluaXQgZnVuY3Rpb24KLQkgKiB0byBiZSBwb3J0YWJsZSB0byBXaW5kb3dzIHdpdGhvdXQgdXNpbmcgQysrLiAqLwotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotCSJ4eG1vZHVsZS5TdHIiLAkJLyp0cF9uYW1lKi8KLQkwLAkJCS8qdHBfYmFzaWNzaXplKi8KLQkwLAkJCS8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkwLAkJCS8qdHBfZGVhbGxvYyovCi0JMCwJCQkvKnRwX3ByaW50Ki8KLQkwLAkJCS8qdHBfZ2V0YXR0ciovCi0JMCwJCQkvKnRwX3NldGF0dHIqLwotCTAsCQkJLyp0cF9jb21wYXJlKi8KLQkwLAkJCS8qdHBfcmVwciovCi0JMCwJCQkvKnRwX2FzX251bWJlciovCi0JMCwJCQkvKnRwX2FzX3NlcXVlbmNlKi8KLQkwLAkJCS8qdHBfYXNfbWFwcGluZyovCi0JMCwJCQkvKnRwX2hhc2gqLwotCTAsCQkJLyp0cF9jYWxsKi8KLQkwLAkJCS8qdHBfc3RyKi8KLQkwLAkJCS8qdHBfZ2V0YXR0cm8qLwotCTAsCQkJLyp0cF9zZXRhdHRybyovCi0JMCwJCQkvKnRwX2FzX2J1ZmZlciovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19CQVNFVFlQRSwgLyp0cF9mbGFncyovCi0JMCwJCQkvKnRwX2RvYyovCi0JMCwJCQkvKnRwX3RyYXZlcnNlKi8KLQkwLAkJCS8qdHBfY2xlYXIqLwotCTAsCQkJLyp0cF9yaWNoY29tcGFyZSovCi0JMCwJCQkvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLQkwLAkJCS8qdHBfaXRlciovCi0JMCwJCQkvKnRwX2l0ZXJuZXh0Ki8KLQkwLAkJCS8qdHBfbWV0aG9kcyovCi0JMCwJCQkvKnRwX21lbWJlcnMqLwotCTAsCQkJLyp0cF9nZXRzZXQqLwotCTAsIC8qIHNlZSBpbml0eHggKi8JLyp0cF9iYXNlKi8KLQkwLAkJCS8qdHBfZGljdCovCi0JMCwJCQkvKnRwX2Rlc2NyX2dldCovCi0JMCwJCQkvKnRwX2Rlc2NyX3NldCovCi0JMCwJCQkvKnRwX2RpY3RvZmZzZXQqLwotCTAsCQkJLyp0cF9pbml0Ki8KLQkwLAkJCS8qdHBfYWxsb2MqLwotCTAsCQkJLyp0cF9uZXcqLwotCTAsCQkJLyp0cF9mcmVlKi8KLQkwLAkJCS8qdHBfaXNfZ2MqLworICAgIC8qIFRoZSBvYl90eXBlIGZpZWxkIG11c3QgYmUgaW5pdGlhbGl6ZWQgaW4gdGhlIG1vZHVsZSBpbml0IGZ1bmN0aW9uCisgICAgICogdG8gYmUgcG9ydGFibGUgdG8gV2luZG93cyB3aXRob3V0IHVzaW5nIEMrKy4gKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAieHhtb2R1bGUuU3RyIiwgICAgICAgICAgICAgLyp0cF9uYW1lKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9iYXNpY3NpemUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGVhbGxvYyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcHJpbnQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NvbXBhcmUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3JlcHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX251bWJlciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfc2VxdWVuY2UqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX21hcHBpbmcqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2hhc2gqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NhbGwqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3N0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0YXR0cm8qLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHJvKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qdHBfZmxhZ3MqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2RvYyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfdHJhdmVyc2UqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NsZWFyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZXJuZXh0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9tZXRob2RzKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9tZW1iZXJzKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRzZXQqLworICAgIDAsIC8qIHNlZSBpbml0eHggKi8gICAgICAgICAvKnRwX2Jhc2UqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2RpY3QqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2Rlc2NyX2dldCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGVzY3Jfc2V0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pbml0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hbGxvYyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfbmV3Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9mcmVlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pc19nYyovCiB9OwogCiAvKiAtLS0tLS0tLS0tICovCkBAIC0yNjMsNTQgKzI2Myw1NCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIG51bGxfcmljaGNvbXBhcmUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpvdGhlciwgaW50IG9wKQogewotCVB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7Ci0JcmV0dXJuIFB5X05vdEltcGxlbWVudGVkOworICAgIFB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7CisgICAgcmV0dXJuIFB5X05vdEltcGxlbWVudGVkOwogfQogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IE51bGxfVHlwZSA9IHsKLQkvKiBUaGUgb2JfdHlwZSBmaWVsZCBtdXN0IGJlIGluaXRpYWxpemVkIGluIHRoZSBtb2R1bGUgaW5pdCBmdW5jdGlvbgotCSAqIHRvIGJlIHBvcnRhYmxlIHRvIFdpbmRvd3Mgd2l0aG91dCB1c2luZyBDKysuICovCi0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JInh4bW9kdWxlLk51bGwiLAkvKnRwX25hbWUqLwotCTAsCQkJLyp0cF9iYXNpY3NpemUqLwotCTAsCQkJLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCTAsCQkJLyp0cF9kZWFsbG9jKi8KLQkwLAkJCS8qdHBfcHJpbnQqLwotCTAsCQkJLyp0cF9nZXRhdHRyKi8KLQkwLAkJCS8qdHBfc2V0YXR0ciovCi0JMCwJCQkvKnRwX2NvbXBhcmUqLwotCTAsCQkJLyp0cF9yZXByKi8KLQkwLAkJCS8qdHBfYXNfbnVtYmVyKi8KLQkwLAkJCS8qdHBfYXNfc2VxdWVuY2UqLwotCTAsCQkJLyp0cF9hc19tYXBwaW5nKi8KLQkwLAkJCS8qdHBfaGFzaCovCi0JMCwJCQkvKnRwX2NhbGwqLwotCTAsCQkJLyp0cF9zdHIqLwotCTAsCQkJLyp0cF9nZXRhdHRybyovCi0JMCwJCQkvKnRwX3NldGF0dHJvKi8KLQkwLAkJCS8qdHBfYXNfYnVmZmVyKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKnRwX2ZsYWdzKi8KLQkwLAkJCS8qdHBfZG9jKi8KLQkwLAkJCS8qdHBfdHJhdmVyc2UqLwotCTAsCQkJLyp0cF9jbGVhciovCi0JbnVsbF9yaWNoY29tcGFyZSwJLyp0cF9yaWNoY29tcGFyZSovCi0JMCwJCQkvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLQkwLAkJCS8qdHBfaXRlciovCi0JMCwJCQkvKnRwX2l0ZXJuZXh0Ki8KLQkwLAkJCS8qdHBfbWV0aG9kcyovCi0JMCwJCQkvKnRwX21lbWJlcnMqLwotCTAsCQkJLyp0cF9nZXRzZXQqLwotCTAsIC8qIHNlZSBpbml0eHggKi8JLyp0cF9iYXNlKi8KLQkwLAkJCS8qdHBfZGljdCovCi0JMCwJCQkvKnRwX2Rlc2NyX2dldCovCi0JMCwJCQkvKnRwX2Rlc2NyX3NldCovCi0JMCwJCQkvKnRwX2RpY3RvZmZzZXQqLwotCTAsCQkJLyp0cF9pbml0Ki8KLQkwLAkJCS8qdHBfYWxsb2MqLwotCTAsIC8qIHNlZSBpbml0eHggKi8JLyp0cF9uZXcqLwotCTAsCQkJLyp0cF9mcmVlKi8KLQkwLAkJCS8qdHBfaXNfZ2MqLworICAgIC8qIFRoZSBvYl90eXBlIGZpZWxkIG11c3QgYmUgaW5pdGlhbGl6ZWQgaW4gdGhlIG1vZHVsZSBpbml0IGZ1bmN0aW9uCisgICAgICogdG8gYmUgcG9ydGFibGUgdG8gV2luZG93cyB3aXRob3V0IHVzaW5nIEMrKy4gKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAieHhtb2R1bGUuTnVsbCIsICAgICAgICAgICAgLyp0cF9uYW1lKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9iYXNpY3NpemUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGVhbGxvYyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcHJpbnQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NvbXBhcmUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3JlcHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX251bWJlciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfc2VxdWVuY2UqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX21hcHBpbmcqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2hhc2gqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NhbGwqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3N0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0YXR0cm8qLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHJvKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qdHBfZmxhZ3MqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2RvYyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfdHJhdmVyc2UqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NsZWFyKi8KKyAgICBudWxsX3JpY2hjb21wYXJlLCAgICAgICAgICAgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZXJuZXh0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9tZXRob2RzKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9tZW1iZXJzKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRzZXQqLworICAgIDAsIC8qIHNlZSBpbml0eHggKi8gICAgICAgICAvKnRwX2Jhc2UqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2RpY3QqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2Rlc2NyX2dldCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGVzY3Jfc2V0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pbml0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hbGxvYyovCisgICAgMCwgLyogc2VlIGluaXR4eCAqLyAgICAgICAgIC8qdHBfbmV3Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9mcmVlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pc19nYyovCiB9OwogCiAKQEAgLTMyMCwxNSArMzIwLDE1IEBACiAvKiBMaXN0IG9mIGZ1bmN0aW9ucyBkZWZpbmVkIGluIHRoZSBtb2R1bGUgKi8KIAogc3RhdGljIFB5TWV0aG9kRGVmIHh4X21ldGhvZHNbXSA9IHsKLQl7InJvaiIsCQl4eF9yb2osCQlNRVRIX1ZBUkFSR1MsCi0JCVB5RG9jX1NUUigicm9qKGEsYikgLT4gTm9uZSIpfSwKLQl7ImZvbyIsCQl4eF9mb28sCQlNRVRIX1ZBUkFSR1MsCi0JIAl4eF9mb29fZG9jfSwKLQl7Im5ldyIsCQl4eF9uZXcsCQlNRVRIX1ZBUkFSR1MsCi0JCVB5RG9jX1NUUigibmV3KCkgLT4gbmV3IFh4IG9iamVjdCIpfSwKLQl7ImJ1ZyIsCQl4eF9idWcsCQlNRVRIX1ZBUkFSR1MsCi0JCVB5RG9jX1NUUigiYnVnKG8pIC0+IE5vbmUiKX0sCi0Je05VTEwsCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7InJvaiIsICAgICAgICAgICAgIHh4X3JvaiwgICAgICAgICBNRVRIX1ZBUkFSR1MsCisgICAgICAgIFB5RG9jX1NUUigicm9qKGEsYikgLT4gTm9uZSIpfSwKKyAgICB7ImZvbyIsICAgICAgICAgICAgIHh4X2ZvbywgICAgICAgICBNRVRIX1ZBUkFSR1MsCisgICAgICAgIHh4X2Zvb19kb2N9LAorICAgIHsibmV3IiwgICAgICAgICAgICAgeHhfbmV3LCAgICAgICAgIE1FVEhfVkFSQVJHUywKKyAgICAgICAgUHlEb2NfU1RSKCJuZXcoKSAtPiBuZXcgWHggb2JqZWN0Iil9LAorICAgIHsiYnVnIiwgICAgICAgICAgICAgeHhfYnVnLCAgICAgICAgIE1FVEhfVkFSQVJHUywKKyAgICAgICAgUHlEb2NfU1RSKCJidWcobykgLT4gTm9uZSIpfSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogUHlEb2NfU1RSVkFSKG1vZHVsZV9kb2MsCkBAIC0zMzksNDEgKzMzOSw0MSBAQAogUHlNT0RJTklUX0ZVTkMKIGluaXR4eCh2b2lkKQogewotCVB5T2JqZWN0ICptOworICAgIFB5T2JqZWN0ICptOwogCi0JLyogRHVlIHRvIGNyb3NzIHBsYXRmb3JtIGNvbXBpbGVyIGlzc3VlcyB0aGUgc2xvdHMgbXVzdCBiZSBmaWxsZWQKLQkgKiBoZXJlLiBJdCdzIHJlcXVpcmVkIGZvciBwb3J0YWJpbGl0eSB0byBXaW5kb3dzIHdpdGhvdXQgcmVxdWlyaW5nCi0JICogQysrLiAqLwotCU51bGxfVHlwZS50cF9iYXNlID0gJlB5QmFzZU9iamVjdF9UeXBlOwotCU51bGxfVHlwZS50cF9uZXcgPSBQeVR5cGVfR2VuZXJpY05ldzsKLQlTdHJfVHlwZS50cF9iYXNlID0gJlB5VW5pY29kZV9UeXBlOworICAgIC8qIER1ZSB0byBjcm9zcyBwbGF0Zm9ybSBjb21waWxlciBpc3N1ZXMgdGhlIHNsb3RzIG11c3QgYmUgZmlsbGVkCisgICAgICogaGVyZS4gSXQncyByZXF1aXJlZCBmb3IgcG9ydGFiaWxpdHkgdG8gV2luZG93cyB3aXRob3V0IHJlcXVpcmluZworICAgICAqIEMrKy4gKi8KKyAgICBOdWxsX1R5cGUudHBfYmFzZSA9ICZQeUJhc2VPYmplY3RfVHlwZTsKKyAgICBOdWxsX1R5cGUudHBfbmV3ID0gUHlUeXBlX0dlbmVyaWNOZXc7CisgICAgU3RyX1R5cGUudHBfYmFzZSA9ICZQeVVuaWNvZGVfVHlwZTsKIAotCS8qIEZpbmFsaXplIHRoZSB0eXBlIG9iamVjdCBpbmNsdWRpbmcgc2V0dGluZyB0eXBlIG9mIHRoZSBuZXcgdHlwZQotCSAqIG9iamVjdDsgZG9pbmcgaXQgaGVyZSBpcyByZXF1aXJlZCBmb3IgcG9ydGFiaWxpdHksIHRvby4gKi8KLQlpZiAoUHlUeXBlX1JlYWR5KCZYeG9fVHlwZSkgPCAwKQotCQlyZXR1cm47CisgICAgLyogRmluYWxpemUgdGhlIHR5cGUgb2JqZWN0IGluY2x1ZGluZyBzZXR0aW5nIHR5cGUgb2YgdGhlIG5ldyB0eXBlCisgICAgICogb2JqZWN0OyBkb2luZyBpdCBoZXJlIGlzIHJlcXVpcmVkIGZvciBwb3J0YWJpbGl0eSwgdG9vLiAqLworICAgIGlmIChQeVR5cGVfUmVhZHkoJlh4b19UeXBlKSA8IDApCisgICAgICAgIHJldHVybjsKIAotCS8qIENyZWF0ZSB0aGUgbW9kdWxlIGFuZCBhZGQgdGhlIGZ1bmN0aW9ucyAqLwotCW0gPSBQeV9Jbml0TW9kdWxlMygieHgiLCB4eF9tZXRob2RzLCBtb2R1bGVfZG9jKTsKLQlpZiAobSA9PSBOVUxMKQotCQlyZXR1cm47CisgICAgLyogQ3JlYXRlIHRoZSBtb2R1bGUgYW5kIGFkZCB0aGUgZnVuY3Rpb25zICovCisgICAgbSA9IFB5X0luaXRNb2R1bGUzKCJ4eCIsIHh4X21ldGhvZHMsIG1vZHVsZV9kb2MpOworICAgIGlmIChtID09IE5VTEwpCisgICAgICAgIHJldHVybjsKIAotCS8qIEFkZCBzb21lIHN5bWJvbGljIGNvbnN0YW50cyB0byB0aGUgbW9kdWxlICovCi0JaWYgKEVycm9yT2JqZWN0ID09IE5VTEwpIHsKLQkJRXJyb3JPYmplY3QgPSBQeUVycl9OZXdFeGNlcHRpb24oInh4LmVycm9yIiwgTlVMTCwgTlVMTCk7Ci0JCWlmIChFcnJvck9iamVjdCA9PSBOVUxMKQotCQkJcmV0dXJuOwotCX0KLQlQeV9JTkNSRUYoRXJyb3JPYmplY3QpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiZXJyb3IiLCBFcnJvck9iamVjdCk7CisgICAgLyogQWRkIHNvbWUgc3ltYm9saWMgY29uc3RhbnRzIHRvIHRoZSBtb2R1bGUgKi8KKyAgICBpZiAoRXJyb3JPYmplY3QgPT0gTlVMTCkgeworICAgICAgICBFcnJvck9iamVjdCA9IFB5RXJyX05ld0V4Y2VwdGlvbigieHguZXJyb3IiLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgaWYgKEVycm9yT2JqZWN0ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm47CisgICAgfQorICAgIFB5X0lOQ1JFRihFcnJvck9iamVjdCk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJlcnJvciIsIEVycm9yT2JqZWN0KTsKIAotCS8qIEFkZCBTdHIgKi8KLQlpZiAoUHlUeXBlX1JlYWR5KCZTdHJfVHlwZSkgPCAwKQotCQlyZXR1cm47Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJTdHIiLCAoUHlPYmplY3QgKikmU3RyX1R5cGUpOworICAgIC8qIEFkZCBTdHIgKi8KKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZTdHJfVHlwZSkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJTdHIiLCAoUHlPYmplY3QgKikmU3RyX1R5cGUpOwogCi0JLyogQWRkIE51bGwgKi8KLQlpZiAoUHlUeXBlX1JlYWR5KCZOdWxsX1R5cGUpIDwgMCkKLQkJcmV0dXJuOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiTnVsbCIsIChQeU9iamVjdCAqKSZOdWxsX1R5cGUpOworICAgIC8qIEFkZCBOdWxsICovCisgICAgaWYgKFB5VHlwZV9SZWFkeSgmTnVsbF9UeXBlKSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIk51bGwiLCAoUHlPYmplY3QgKikmTnVsbF9UeXBlKTsKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMveHhzdWJ0eXBlLmMgYi9Nb2R1bGVzL3h4c3VidHlwZS5jCmluZGV4IDBjZjBiODEuLmQ0MzE2ZTcgMTAwNjQ0Ci0tLSBhL01vZHVsZXMveHhzdWJ0eXBlLmMKKysrIGIvTW9kdWxlcy94eHN1YnR5cGUuYwpAQCAtMTksMjc5ICsxOSwyNzkgQEAKIC8qIHNwYW1saXN0IC0tIGEgbGlzdCBzdWJ0eXBlICovCiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeUxpc3RPYmplY3QgbGlzdDsKLQlpbnQgc3RhdGU7CisgICAgUHlMaXN0T2JqZWN0IGxpc3Q7CisgICAgaW50IHN0YXRlOwogfSBzcGFtbGlzdG9iamVjdDsKIAogc3RhdGljIFB5T2JqZWN0ICoKIHNwYW1saXN0X2dldHN0YXRlKHNwYW1saXN0b2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpnZXRzdGF0ZSIpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoc2VsZi0+c3RhdGUpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOmdldHN0YXRlIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhzZWxmLT5zdGF0ZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzcGFtbGlzdF9zZXRzdGF0ZShzcGFtbGlzdG9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IHN0YXRlOworICAgIGludCBzdGF0ZTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpzZXRzdGF0ZSIsICZzdGF0ZSkpCi0JCXJldHVybiBOVUxMOwotCXNlbGYtPnN0YXRlID0gc3RhdGU7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpzZXRzdGF0ZSIsICZzdGF0ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHNlbGYtPnN0YXRlID0gc3RhdGU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc3BhbWxpc3Rfc3BlY2lhbG1ldGgoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3cpCiB7Ci0JUHlPYmplY3QgKnJlc3VsdCA9IFB5VHVwbGVfTmV3KDMpOworICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBQeVR1cGxlX05ldygzKTsKIAotCWlmIChyZXN1bHQgIT0gTlVMTCkgewotCQlpZiAoc2VsZiA9PSBOVUxMKQotCQkJc2VsZiA9IFB5X05vbmU7Ci0JCWlmIChrdyA9PSBOVUxMKQotCQkJa3cgPSBQeV9Ob25lOwotCQlQeV9JTkNSRUYoc2VsZik7Ci0JCVB5VHVwbGVfU0VUX0lURU0ocmVzdWx0LCAwLCBzZWxmKTsKLQkJUHlfSU5DUkVGKGFyZ3MpOwotCQlQeVR1cGxlX1NFVF9JVEVNKHJlc3VsdCwgMSwgYXJncyk7Ci0JCVB5X0lOQ1JFRihrdyk7Ci0JCVB5VHVwbGVfU0VUX0lURU0ocmVzdWx0LCAyLCBrdyk7Ci0JfQotCXJldHVybiByZXN1bHQ7CisgICAgaWYgKHJlc3VsdCAhPSBOVUxMKSB7CisgICAgICAgIGlmIChzZWxmID09IE5VTEwpCisgICAgICAgICAgICBzZWxmID0gUHlfTm9uZTsKKyAgICAgICAgaWYgKGt3ID09IE5VTEwpCisgICAgICAgICAgICBrdyA9IFB5X05vbmU7CisgICAgICAgIFB5X0lOQ1JFRihzZWxmKTsKKyAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIDAsIHNlbGYpOworICAgICAgICBQeV9JTkNSRUYoYXJncyk7CisgICAgICAgIFB5VHVwbGVfU0VUX0lURU0ocmVzdWx0LCAxLCBhcmdzKTsKKyAgICAgICAgUHlfSU5DUkVGKGt3KTsKKyAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIDIsIGt3KTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIHNwYW1saXN0X21ldGhvZHNbXSA9IHsKLQl7ImdldHN0YXRlIiwgKFB5Q0Z1bmN0aW9uKXNwYW1saXN0X2dldHN0YXRlLCBNRVRIX1ZBUkFSR1MsCi0JIAlQeURvY19TVFIoImdldHN0YXRlKCkgLT4gc3RhdGUiKX0sCi0JeyJzZXRzdGF0ZSIsIChQeUNGdW5jdGlvbilzcGFtbGlzdF9zZXRzdGF0ZSwgTUVUSF9WQVJBUkdTLAotCSAJUHlEb2NfU1RSKCJzZXRzdGF0ZShzdGF0ZSkiKX0sCi0JLyogVGhlc2UgZW50cmllcyBkaWZmZXIgb25seSBpbiB0aGUgZmxhZ3M7IHRoZXkgYXJlIHVzZWQgYnkgdGhlIHRlc3RzCi0JICAgaW4gdGVzdC50ZXN0X2Rlc2NyLiAqLwotCXsiY2xhc3NtZXRoIiwgKFB5Q0Z1bmN0aW9uKXNwYW1saXN0X3NwZWNpYWxtZXRoLAotCQlNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTIHwgTUVUSF9DTEFTUywKLQkgCVB5RG9jX1NUUigiY2xhc3NtZXRoKCphcmdzLCAqKmt3KSIpfSwKLQl7InN0YXRpY21ldGgiLCAoUHlDRnVuY3Rpb24pc3BhbWxpc3Rfc3BlY2lhbG1ldGgsCi0JCU1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMgfCBNRVRIX1NUQVRJQywKLQkgCVB5RG9jX1NUUigic3RhdGljbWV0aCgqYXJncywgKiprdykiKX0sCi0Je05VTEwsCU5VTEx9LAorICAgIHsiZ2V0c3RhdGUiLCAoUHlDRnVuY3Rpb24pc3BhbWxpc3RfZ2V0c3RhdGUsIE1FVEhfVkFSQVJHUywKKyAgICAgICAgUHlEb2NfU1RSKCJnZXRzdGF0ZSgpIC0+IHN0YXRlIil9LAorICAgIHsic2V0c3RhdGUiLCAoUHlDRnVuY3Rpb24pc3BhbWxpc3Rfc2V0c3RhdGUsIE1FVEhfVkFSQVJHUywKKyAgICAgICAgUHlEb2NfU1RSKCJzZXRzdGF0ZShzdGF0ZSkiKX0sCisgICAgLyogVGhlc2UgZW50cmllcyBkaWZmZXIgb25seSBpbiB0aGUgZmxhZ3M7IHRoZXkgYXJlIHVzZWQgYnkgdGhlIHRlc3RzCisgICAgICAgaW4gdGVzdC50ZXN0X2Rlc2NyLiAqLworICAgIHsiY2xhc3NtZXRoIiwgKFB5Q0Z1bmN0aW9uKXNwYW1saXN0X3NwZWNpYWxtZXRoLAorICAgICAgICBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTIHwgTUVUSF9DTEFTUywKKyAgICAgICAgUHlEb2NfU1RSKCJjbGFzc21ldGgoKmFyZ3MsICoqa3cpIil9LAorICAgIHsic3RhdGljbWV0aCIsIChQeUNGdW5jdGlvbilzcGFtbGlzdF9zcGVjaWFsbWV0aCwKKyAgICAgICAgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUyB8IE1FVEhfU1RBVElDLAorICAgICAgICBQeURvY19TVFIoInN0YXRpY21ldGgoKmFyZ3MsICoqa3cpIil9LAorICAgIHtOVUxMLCAgICAgIE5VTEx9LAogfTsKIAogc3RhdGljIGludAogc3BhbWxpc3RfaW5pdChzcGFtbGlzdG9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCWlmIChQeUxpc3RfVHlwZS50cF9pbml0KChQeU9iamVjdCAqKXNlbGYsIGFyZ3MsIGt3ZHMpIDwgMCkKLQkJcmV0dXJuIC0xOwotCXNlbGYtPnN0YXRlID0gMDsKLQlyZXR1cm4gMDsKKyAgICBpZiAoUHlMaXN0X1R5cGUudHBfaW5pdCgoUHlPYmplY3QgKilzZWxmLCBhcmdzLCBrd2RzKSA8IDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICBzZWxmLT5zdGF0ZSA9IDA7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzcGFtbGlzdF9zdGF0ZV9nZXQoc3BhbWxpc3RvYmplY3QgKnNlbGYpCiB7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKHNlbGYtPnN0YXRlKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoc2VsZi0+c3RhdGUpOwogfQogCiBzdGF0aWMgUHlHZXRTZXREZWYgc3BhbWxpc3RfZ2V0c2V0c1tdID0gewotCXsic3RhdGUiLCAoZ2V0dGVyKXNwYW1saXN0X3N0YXRlX2dldCwgTlVMTCwKLQkgUHlEb2NfU1RSKCJhbiBpbnQgdmFyaWFibGUgZm9yIGRlbW9uc3RyYXRpb24gcHVycG9zZXMiKX0sCi0JezB9CisgICAgeyJzdGF0ZSIsIChnZXR0ZXIpc3BhbWxpc3Rfc3RhdGVfZ2V0LCBOVUxMLAorICAgICBQeURvY19TVFIoImFuIGludCB2YXJpYWJsZSBmb3IgZGVtb25zdHJhdGlvbiBwdXJwb3NlcyIpfSwKKyAgICB7MH0KIH07CiAKIHN0YXRpYyBQeVR5cGVPYmplY3Qgc3BhbWxpc3RfdHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoREVGRVJSRURfQUREUkVTUygmUHlUeXBlX1R5cGUpLCAwKQotCSJ4eHN1YnR5cGUuc3BhbWxpc3QiLAotCXNpemVvZihzcGFtbGlzdG9iamVjdCksCi0JMCwKLQkwLAkJCQkJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfY29tcGFyZSAqLwotCTAsCQkJCQkvKiB0cF9yZXByICovCi0JMCwJCQkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJCQkJCS8qIHRwX2hhc2ggKi8KLQkwLAkJCQkJLyogdHBfY2FsbCAqLwotCTAsCQkJCQkvKiB0cF9zdHIgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQkwLAkJCQkJLyogdHBfZG9jICovCi0JMCwJCQkJCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkJLyogdHBfaXRlcm5leHQgKi8KLQlzcGFtbGlzdF9tZXRob2RzLAkJCS8qIHRwX21ldGhvZHMgKi8KLQkwLAkJCQkJLyogdHBfbWVtYmVycyAqLwotCXNwYW1saXN0X2dldHNldHMsCQkJLyogdHBfZ2V0c2V0ICovCi0JREVGRVJSRURfQUREUkVTUygmUHlMaXN0X1R5cGUpLAkJLyogdHBfYmFzZSAqLwotCTAsCQkJCQkvKiB0cF9kaWN0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KLQkwLAkJCQkJLyogdHBfZGljdG9mZnNldCAqLwotCShpbml0cHJvYylzcGFtbGlzdF9pbml0LAkJLyogdHBfaW5pdCAqLwotCTAsCQkJCQkvKiB0cF9hbGxvYyAqLwotCTAsCQkJCQkvKiB0cF9uZXcgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoREVGRVJSRURfQUREUkVTUygmUHlUeXBlX1R5cGUpLCAwKQorICAgICJ4eHN1YnR5cGUuc3BhbWxpc3QiLAorICAgIHNpemVvZihzcGFtbGlzdG9iamVjdCksCisgICAgMCwKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgc3BhbWxpc3RfbWV0aG9kcywgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgc3BhbWxpc3RfZ2V0c2V0cywgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICBERUZFUlJFRF9BRERSRVNTKCZQeUxpc3RfVHlwZSksICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgKGluaXRwcm9jKXNwYW1saXN0X2luaXQsICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCiB9OwogCiAvKiBzcGFtZGljdCAtLSBhIGRpY3Qgc3VidHlwZSAqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlEaWN0T2JqZWN0IGRpY3Q7Ci0JaW50IHN0YXRlOworICAgIFB5RGljdE9iamVjdCBkaWN0OworICAgIGludCBzdGF0ZTsKIH0gc3BhbWRpY3RvYmplY3Q7CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzcGFtZGljdF9nZXRzdGF0ZShzcGFtZGljdG9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6Z2V0c3RhdGUiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKHNlbGYtPnN0YXRlKTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpnZXRzdGF0ZSIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoc2VsZi0+c3RhdGUpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc3BhbWRpY3Rfc2V0c3RhdGUoc3BhbWRpY3RvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBzdGF0ZTsKKyAgICBpbnQgc3RhdGU7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6c2V0c3RhdGUiLCAmc3RhdGUpKQotCQlyZXR1cm4gTlVMTDsKLQlzZWxmLT5zdGF0ZSA9IHN0YXRlOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6c2V0c3RhdGUiLCAmc3RhdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBzZWxmLT5zdGF0ZSA9IHN0YXRlOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIHNwYW1kaWN0X21ldGhvZHNbXSA9IHsKLQl7ImdldHN0YXRlIiwgKFB5Q0Z1bmN0aW9uKXNwYW1kaWN0X2dldHN0YXRlLCBNRVRIX1ZBUkFSR1MsCi0JIAlQeURvY19TVFIoImdldHN0YXRlKCkgLT4gc3RhdGUiKX0sCi0JeyJzZXRzdGF0ZSIsIChQeUNGdW5jdGlvbilzcGFtZGljdF9zZXRzdGF0ZSwgTUVUSF9WQVJBUkdTLAotCSAJUHlEb2NfU1RSKCJzZXRzdGF0ZShzdGF0ZSkiKX0sCi0Je05VTEwsCU5VTEx9LAorICAgIHsiZ2V0c3RhdGUiLCAoUHlDRnVuY3Rpb24pc3BhbWRpY3RfZ2V0c3RhdGUsIE1FVEhfVkFSQVJHUywKKyAgICAgICAgUHlEb2NfU1RSKCJnZXRzdGF0ZSgpIC0+IHN0YXRlIil9LAorICAgIHsic2V0c3RhdGUiLCAoUHlDRnVuY3Rpb24pc3BhbWRpY3Rfc2V0c3RhdGUsIE1FVEhfVkFSQVJHUywKKyAgICAgICAgUHlEb2NfU1RSKCJzZXRzdGF0ZShzdGF0ZSkiKX0sCisgICAge05VTEwsICAgICAgTlVMTH0sCiB9OwogCiBzdGF0aWMgaW50CiBzcGFtZGljdF9pbml0KHNwYW1kaWN0b2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JaWYgKFB5RGljdF9UeXBlLnRwX2luaXQoKFB5T2JqZWN0ICopc2VsZiwgYXJncywga3dkcykgPCAwKQotCQlyZXR1cm4gLTE7Ci0Jc2VsZi0+c3RhdGUgPSAwOwotCXJldHVybiAwOworICAgIGlmIChQeURpY3RfVHlwZS50cF9pbml0KChQeU9iamVjdCAqKXNlbGYsIGFyZ3MsIGt3ZHMpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHNlbGYtPnN0YXRlID0gMDsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5TWVtYmVyRGVmIHNwYW1kaWN0X21lbWJlcnNbXSA9IHsKLQl7InN0YXRlIiwgVF9JTlQsIG9mZnNldG9mKHNwYW1kaWN0b2JqZWN0LCBzdGF0ZSksIFJFQURPTkxZLAotCSBQeURvY19TVFIoImFuIGludCB2YXJpYWJsZSBmb3IgZGVtb25zdHJhdGlvbiBwdXJwb3NlcyIpfSwKLQl7MH0KKyAgICB7InN0YXRlIiwgVF9JTlQsIG9mZnNldG9mKHNwYW1kaWN0b2JqZWN0LCBzdGF0ZSksIFJFQURPTkxZLAorICAgICBQeURvY19TVFIoImFuIGludCB2YXJpYWJsZSBmb3IgZGVtb25zdHJhdGlvbiBwdXJwb3NlcyIpfSwKKyAgICB7MH0KIH07CiAKIHN0YXRpYyBQeVR5cGVPYmplY3Qgc3BhbWRpY3RfdHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoREVGRVJSRURfQUREUkVTUygmUHlUeXBlX1R5cGUpLCAwKQotCSJ4eHN1YnR5cGUuc3BhbWRpY3QiLAotCXNpemVvZihzcGFtZGljdG9iamVjdCksCi0JMCwKLQkwLAkJCQkJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfY29tcGFyZSAqLwotCTAsCQkJCQkvKiB0cF9yZXByICovCi0JMCwJCQkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJCQkJCS8qIHRwX2hhc2ggKi8KLQkwLAkJCQkJLyogdHBfY2FsbCAqLwotCTAsCQkJCQkvKiB0cF9zdHIgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQkwLAkJCQkJLyogdHBfZG9jICovCi0JMCwJCQkJCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkJLyogdHBfaXRlcm5leHQgKi8KLQlzcGFtZGljdF9tZXRob2RzLAkJCS8qIHRwX21ldGhvZHMgKi8KLQlzcGFtZGljdF9tZW1iZXJzLAkJCS8qIHRwX21lbWJlcnMgKi8KLQkwLAkJCQkJLyogdHBfZ2V0c2V0ICovCi0JREVGRVJSRURfQUREUkVTUygmUHlEaWN0X1R5cGUpLAkJLyogdHBfYmFzZSAqLwotCTAsCQkJCQkvKiB0cF9kaWN0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KLQkwLAkJCQkJLyogdHBfZGljdG9mZnNldCAqLwotCShpbml0cHJvYylzcGFtZGljdF9pbml0LAkJLyogdHBfaW5pdCAqLwotCTAsCQkJCQkvKiB0cF9hbGxvYyAqLwotCTAsCQkJCQkvKiB0cF9uZXcgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoREVGRVJSRURfQUREUkVTUygmUHlUeXBlX1R5cGUpLCAwKQorICAgICJ4eHN1YnR5cGUuc3BhbWRpY3QiLAorICAgIHNpemVvZihzcGFtZGljdG9iamVjdCksCisgICAgMCwKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgc3BhbWRpY3RfbWV0aG9kcywgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgc3BhbWRpY3RfbWVtYmVycywgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICBERUZFUlJFRF9BRERSRVNTKCZQeURpY3RfVHlwZSksICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgKGluaXRwcm9jKXNwYW1kaWN0X2luaXQsICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKgogc3BhbV9iZW5jaChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKm9iaiwgKm5hbWUsICpyZXM7Ci0JaW50IG4gPSAxMDAwOwotCXRpbWVfdCB0MCwgdDE7CisgICAgUHlPYmplY3QgKm9iaiwgKm5hbWUsICpyZXM7CisgICAgaW50IG4gPSAxMDAwOworICAgIHRpbWVfdCB0MCwgdDE7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9TfGkiLCAmb2JqLCAmbmFtZSwgJm4pKQotCQlyZXR1cm4gTlVMTDsKLQl0MCA9IGNsb2NrKCk7Ci0Jd2hpbGUgKC0tbiA+PSAwKSB7Ci0JCXJlcyA9IFB5T2JqZWN0X0dldEF0dHIob2JqLCBuYW1lKTsKLQkJaWYgKHJlcyA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCVB5X0RFQ1JFRihyZXMpOwotCX0KLQl0MSA9IGNsb2NrKCk7Ci0JcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZSgoZG91YmxlKSh0MS10MCkgLyBDTE9DS1NfUEVSX1NFQyk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPU3xpIiwgJm9iaiwgJm5hbWUsICZuKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgdDAgPSBjbG9jaygpOworICAgIHdoaWxlICgtLW4gPj0gMCkgeworICAgICAgICByZXMgPSBQeU9iamVjdF9HZXRBdHRyKG9iaiwgbmFtZSk7CisgICAgICAgIGlmIChyZXMgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBQeV9ERUNSRUYocmVzKTsKKyAgICB9CisgICAgdDEgPSBjbG9jaygpOworICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoKGRvdWJsZSkodDEtdDApIC8gQ0xPQ0tTX1BFUl9TRUMpOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgeHhzdWJ0eXBlX2Z1bmN0aW9uc1tdID0gewotCXsiYmVuY2giLAlzcGFtX2JlbmNoLCAJTUVUSF9WQVJBUkdTfSwKLQl7TlVMTCwJCU5VTEx9CQkvKiBzZW50aW5lbCAqLworICAgIHsiYmVuY2giLCAgICAgICAgICAgc3BhbV9iZW5jaCwgICAgIE1FVEhfVkFSQVJHU30sCisgICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIFB5TU9ESU5JVF9GVU5DCiBpbml0eHhzdWJ0eXBlKHZvaWQpCiB7Ci0JUHlPYmplY3QgKm07CisgICAgUHlPYmplY3QgKm07CiAKLQkvKiBGaWxsIGluIGRlZmVycmVkIGRhdGEgYWRkcmVzc2VzLiAgVGhpcyBtdXN0IGJlIGRvbmUgYmVmb3JlCi0JICAgUHlUeXBlX1JlYWR5KCkgaXMgY2FsbGVkLiAgTm90ZSB0aGF0IFB5VHlwZV9SZWFkeSgpIGF1dG9tYXRpY2FsbHkKLQkgICBpbml0aWFsaXplcyB0aGUgb2Iub2JfdHlwZSBmaWVsZCB0byAmUHlUeXBlX1R5cGUgaWYgaXQncyBOVUxMLAotCSAgIHNvIGl0J3Mgbm90IG5lY2Vzc2FyeSB0byBmaWxsIGluIG9iX3R5cGUgZmlyc3QuICovCi0Jc3BhbWRpY3RfdHlwZS50cF9iYXNlID0gJlB5RGljdF9UeXBlOwotCWlmIChQeVR5cGVfUmVhZHkoJnNwYW1kaWN0X3R5cGUpIDwgMCkKLQkJcmV0dXJuOworICAgIC8qIEZpbGwgaW4gZGVmZXJyZWQgZGF0YSBhZGRyZXNzZXMuICBUaGlzIG11c3QgYmUgZG9uZSBiZWZvcmUKKyAgICAgICBQeVR5cGVfUmVhZHkoKSBpcyBjYWxsZWQuICBOb3RlIHRoYXQgUHlUeXBlX1JlYWR5KCkgYXV0b21hdGljYWxseQorICAgICAgIGluaXRpYWxpemVzIHRoZSBvYi5vYl90eXBlIGZpZWxkIHRvICZQeVR5cGVfVHlwZSBpZiBpdCdzIE5VTEwsCisgICAgICAgc28gaXQncyBub3QgbmVjZXNzYXJ5IHRvIGZpbGwgaW4gb2JfdHlwZSBmaXJzdC4gKi8KKyAgICBzcGFtZGljdF90eXBlLnRwX2Jhc2UgPSAmUHlEaWN0X1R5cGU7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmc3BhbWRpY3RfdHlwZSkgPCAwKQorICAgICAgICByZXR1cm47CiAKLQlzcGFtbGlzdF90eXBlLnRwX2Jhc2UgPSAmUHlMaXN0X1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmc3BhbWxpc3RfdHlwZSkgPCAwKQotCQlyZXR1cm47CisgICAgc3BhbWxpc3RfdHlwZS50cF9iYXNlID0gJlB5TGlzdF9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJnNwYW1saXN0X3R5cGUpIDwgMCkKKyAgICAgICAgcmV0dXJuOwogCi0JbSA9IFB5X0luaXRNb2R1bGUzKCJ4eHN1YnR5cGUiLAotCQkJICAgeHhzdWJ0eXBlX2Z1bmN0aW9ucywKLQkJCSAgIHh4c3VidHlwZV9fZG9jX18pOwotCWlmIChtID09IE5VTEwpCi0JCXJldHVybjsKKyAgICBtID0gUHlfSW5pdE1vZHVsZTMoInh4c3VidHlwZSIsCisgICAgICAgICAgICAgICAgICAgICAgIHh4c3VidHlwZV9mdW5jdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgIHh4c3VidHlwZV9fZG9jX18pOworICAgIGlmIChtID09IE5VTEwpCisgICAgICAgIHJldHVybjsKIAotCWlmIChQeVR5cGVfUmVhZHkoJnNwYW1saXN0X3R5cGUpIDwgMCkKLQkJcmV0dXJuOwotCWlmIChQeVR5cGVfUmVhZHkoJnNwYW1kaWN0X3R5cGUpIDwgMCkKLQkJcmV0dXJuOworICAgIGlmIChQeVR5cGVfUmVhZHkoJnNwYW1saXN0X3R5cGUpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIGlmIChQeVR5cGVfUmVhZHkoJnNwYW1kaWN0X3R5cGUpIDwgMCkKKyAgICAgICAgcmV0dXJuOwogCi0JUHlfSU5DUkVGKCZzcGFtbGlzdF90eXBlKTsKLQlpZiAoUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJzcGFtbGlzdCIsCi0JCQkgICAgICAgKFB5T2JqZWN0ICopICZzcGFtbGlzdF90eXBlKSA8IDApCi0JCXJldHVybjsKKyAgICBQeV9JTkNSRUYoJnNwYW1saXN0X3R5cGUpOworICAgIGlmIChQeU1vZHVsZV9BZGRPYmplY3QobSwgInNwYW1saXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChQeU9iamVjdCAqKSAmc3BhbWxpc3RfdHlwZSkgPCAwKQorICAgICAgICByZXR1cm47CiAKLQlQeV9JTkNSRUYoJnNwYW1kaWN0X3R5cGUpOwotCWlmIChQeU1vZHVsZV9BZGRPYmplY3QobSwgInNwYW1kaWN0IiwKLQkJCSAgICAgICAoUHlPYmplY3QgKikgJnNwYW1kaWN0X3R5cGUpIDwgMCkKLQkJcmV0dXJuOworICAgIFB5X0lOQ1JFRigmc3BhbWRpY3RfdHlwZSk7CisgICAgaWYgKFB5TW9kdWxlX0FkZE9iamVjdChtLCAic3BhbWRpY3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKFB5T2JqZWN0ICopICZzcGFtZGljdF90eXBlKSA8IDApCisgICAgICAgIHJldHVybjsKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMveXV2LmggYi9Nb2R1bGVzL3l1di5oCmluZGV4IDczOGM0ZTUuLjFlNWZkMjggMTAwNjQ0Ci0tLSBhL01vZHVsZXMveXV2LmgKKysrIGIvTW9kdWxlcy95dXYuaApAQCAtMTksNDEgKzE5LDQxIEBACiAgKiArLS0tLS0tLS0tLS0tLS0tLS0tLSsKICAqLwogc3RydWN0IHl1djQxMSB7Ci0Jc3RydWN0IHsKLQkJdW5zaWduZWQgaW50IGR1bW15Ojg7Ci0JCXVuc2lnbmVkIGludCB5MDo4OwotCQl1bnNpZ25lZCBpbnQgdTA6MjsKLQkJdW5zaWduZWQgaW50IHYwOjI7Ci0JCXVuc2lnbmVkIGludCB5MTo4OwotCQl1bnNpZ25lZCBpbnQgdTE6MjsKLQkJdW5zaWduZWQgaW50IHYxOjI7Ci0JfSB2WzRdOworICAgIHN0cnVjdCB7CisgICAgICAgIHVuc2lnbmVkIGludCBkdW1teTo4OworICAgICAgICB1bnNpZ25lZCBpbnQgeTA6ODsKKyAgICAgICAgdW5zaWduZWQgaW50IHUwOjI7CisgICAgICAgIHVuc2lnbmVkIGludCB2MDoyOworICAgICAgICB1bnNpZ25lZCBpbnQgeTE6ODsKKyAgICAgICAgdW5zaWduZWQgaW50IHUxOjI7CisgICAgICAgIHVuc2lnbmVkIGludCB2MToyOworICAgIH0gdls0XTsKIH07CiAKLSNkZWZpbmUgWVVWNDExX1kwMCh5KQkoeSkudlswXS55MAotI2RlZmluZSBZVVY0MTFfWTAxKHkpCSh5KS52WzFdLnkwCi0jZGVmaW5lIFlVVjQxMV9ZMDIoeSkJKHkpLnZbMl0ueTAKLSNkZWZpbmUgWVVWNDExX1kwMyh5KQkoeSkudlszXS55MAotI2RlZmluZSBZVVY0MTFfWTEwKHkpCSh5KS52WzBdLnkxCi0jZGVmaW5lIFlVVjQxMV9ZMTEoeSkJKHkpLnZbMV0ueTEKLSNkZWZpbmUgWVVWNDExX1kxMih5KQkoeSkudlsyXS55MQotI2RlZmluZSBZVVY0MTFfWTEzKHkpCSh5KS52WzNdLnkxCi0jZGVmaW5lIFlVVjQxMV9VMDAoeSkJKCh5KS52WzBdLnUwPDw2fCh5KS52WzFdLnUwPDw0fCh5KS52WzJdLnUwPDwyfCh5KS52WzNdLnUwKQotI2RlZmluZSBZVVY0MTFfVTAxKHkpCVlVVjQxMV9VMDAoeSkKLSNkZWZpbmUgWVVWNDExX1UwMih5KQlZVVY0MTFfVTAwKHkpCi0jZGVmaW5lIFlVVjQxMV9VMDMoeSkJWVVWNDExX1UwMCh5KQotI2RlZmluZSBZVVY0MTFfVTEwKHkpCSgoeSkudlswXS51MTw8NnwoeSkudlsxXS51MTw8NHwoeSkudlsyXS51MTw8MnwoeSkudlszXS51MSkKLSNkZWZpbmUgWVVWNDExX1UxMSh5KQlZVVY0MTFfVTEwKHkpCi0jZGVmaW5lIFlVVjQxMV9VMTIoeSkJWVVWNDExX1UxMCh5KQotI2RlZmluZSBZVVY0MTFfVTEzKHkpCVlVVjQxMV9VMTAoeSkKLSNkZWZpbmUgWVVWNDExX1YwMCh5KQkoKHkpLnZbMF0udjA8PDZ8KHkpLnZbMV0udjA8PDR8KHkpLnZbMl0udjA8PDJ8KHkpLnZbM10udjApCi0jZGVmaW5lIFlVVjQxMV9WMDEoeSkJWVVWNDExX1YwMCh5KQotI2RlZmluZSBZVVY0MTFfVjAyKHkpCVlVVjQxMV9WMDAoeSkKLSNkZWZpbmUgWVVWNDExX1YwMyh5KQlZVVY0MTFfVjAwKHkpCi0jZGVmaW5lIFlVVjQxMV9WMTAoeSkJKCh5KS52WzBdLnYxPDw2fCh5KS52WzFdLnYxPDw0fCh5KS52WzJdLnYxPDwyfCh5KS52WzNdLnYxKQotI2RlZmluZSBZVVY0MTFfVjExKHkpCVlVVjQxMV9WMTAoeSkKLSNkZWZpbmUgWVVWNDExX1YxMih5KQlZVVY0MTFfVjEwKHkpCi0jZGVmaW5lIFlVVjQxMV9WMTMoeSkJWVVWNDExX1YxMCh5KQorI2RlZmluZSBZVVY0MTFfWTAwKHkpICAgKHkpLnZbMF0ueTAKKyNkZWZpbmUgWVVWNDExX1kwMSh5KSAgICh5KS52WzFdLnkwCisjZGVmaW5lIFlVVjQxMV9ZMDIoeSkgICAoeSkudlsyXS55MAorI2RlZmluZSBZVVY0MTFfWTAzKHkpICAgKHkpLnZbM10ueTAKKyNkZWZpbmUgWVVWNDExX1kxMCh5KSAgICh5KS52WzBdLnkxCisjZGVmaW5lIFlVVjQxMV9ZMTEoeSkgICAoeSkudlsxXS55MQorI2RlZmluZSBZVVY0MTFfWTEyKHkpICAgKHkpLnZbMl0ueTEKKyNkZWZpbmUgWVVWNDExX1kxMyh5KSAgICh5KS52WzNdLnkxCisjZGVmaW5lIFlVVjQxMV9VMDAoeSkgICAoKHkpLnZbMF0udTA8PDZ8KHkpLnZbMV0udTA8PDR8KHkpLnZbMl0udTA8PDJ8KHkpLnZbM10udTApCisjZGVmaW5lIFlVVjQxMV9VMDEoeSkgICBZVVY0MTFfVTAwKHkpCisjZGVmaW5lIFlVVjQxMV9VMDIoeSkgICBZVVY0MTFfVTAwKHkpCisjZGVmaW5lIFlVVjQxMV9VMDMoeSkgICBZVVY0MTFfVTAwKHkpCisjZGVmaW5lIFlVVjQxMV9VMTAoeSkgICAoKHkpLnZbMF0udTE8PDZ8KHkpLnZbMV0udTE8PDR8KHkpLnZbMl0udTE8PDJ8KHkpLnZbM10udTEpCisjZGVmaW5lIFlVVjQxMV9VMTEoeSkgICBZVVY0MTFfVTEwKHkpCisjZGVmaW5lIFlVVjQxMV9VMTIoeSkgICBZVVY0MTFfVTEwKHkpCisjZGVmaW5lIFlVVjQxMV9VMTMoeSkgICBZVVY0MTFfVTEwKHkpCisjZGVmaW5lIFlVVjQxMV9WMDAoeSkgICAoKHkpLnZbMF0udjA8PDZ8KHkpLnZbMV0udjA8PDR8KHkpLnZbMl0udjA8PDJ8KHkpLnZbM10udjApCisjZGVmaW5lIFlVVjQxMV9WMDEoeSkgICBZVVY0MTFfVjAwKHkpCisjZGVmaW5lIFlVVjQxMV9WMDIoeSkgICBZVVY0MTFfVjAwKHkpCisjZGVmaW5lIFlVVjQxMV9WMDMoeSkgICBZVVY0MTFfVjAwKHkpCisjZGVmaW5lIFlVVjQxMV9WMTAoeSkgICAoKHkpLnZbMF0udjE8PDZ8KHkpLnZbMV0udjE8PDR8KHkpLnZbMl0udjE8PDJ8KHkpLnZbM10udjEpCisjZGVmaW5lIFlVVjQxMV9WMTEoeSkgICBZVVY0MTFfVjEwKHkpCisjZGVmaW5lIFlVVjQxMV9WMTIoeSkgICBZVVY0MTFfVjEwKHkpCisjZGVmaW5lIFlVVjQxMV9WMTMoeSkgICBZVVY0MTFfVjEwKHkpCiAKIC8qCiAgKiBDb21wcmVzc2lvbiBMaWJyYXJ5IFlVViA0OjI6MiBmb3JtYXQuCkBAIC02NSwxNyArNjUsMTcgQEAKICAqICstLS0tLS0tKwogICovCiBzdHJ1Y3QgeXV2NDIyIHsKLQl1bnNpZ25lZCBpbnQgdTo4OwotCXVuc2lnbmVkIGludCB5MDo4OwotCXVuc2lnbmVkIGludCB2Ojg7Ci0JdW5zaWduZWQgaW50IHkxOjg7CisgICAgdW5zaWduZWQgaW50IHU6ODsKKyAgICB1bnNpZ25lZCBpbnQgeTA6ODsKKyAgICB1bnNpZ25lZCBpbnQgdjo4OworICAgIHVuc2lnbmVkIGludCB5MTo4OwogfTsKLSNkZWZpbmUgWVVWNDIyX1kwKHkpCSh5KS55MAotI2RlZmluZSBZVVY0MjJfWTEoeSkJKHkpLnkxCi0jZGVmaW5lIFlVVjQyMl9VMCh5KQkoeSkudQotI2RlZmluZSBZVVY0MjJfVTEoeSkJKHkpLnUKLSNkZWZpbmUgWVVWNDIyX1YwKHkpCSh5KS52Ci0jZGVmaW5lIFlVVjQyMl9WMSh5KQkoeSkudgorI2RlZmluZSBZVVY0MjJfWTAoeSkgICAgKHkpLnkwCisjZGVmaW5lIFlVVjQyMl9ZMSh5KSAgICAoeSkueTEKKyNkZWZpbmUgWVVWNDIyX1UwKHkpICAgICh5KS51CisjZGVmaW5lIFlVVjQyMl9VMSh5KSAgICAoeSkudQorI2RlZmluZSBZVVY0MjJfVjAoeSkgICAgKHkpLnYKKyNkZWZpbmUgWVVWNDIyX1YxKHkpICAgICh5KS52CiAKIC8qCiAgKiBDb21wcmVzc2lvbiBsaWJyYXJ5IFlVViA0OjI6MiBEdXBsaWNhdGUgQ2hyb21hIGZvcm1hdC4KZGlmZiAtLWdpdCBhL01vZHVsZXMveXV2Y29udmVydC5jIGIvTW9kdWxlcy95dXZjb252ZXJ0LmMKaW5kZXggZTUzMzNkOS4uYTBmYTYzOSAxMDA2NDQKLS0tIGEvTW9kdWxlcy95dXZjb252ZXJ0LmMKKysrIGIvTW9kdWxlcy95dXZjb252ZXJ0LmMKQEAgLTQsMTE1ICs0LDExNSBAQAogdm9pZAogeXV2X3N2NDExX3RvX2NsNDIyZGMoaW50IGludmVydCwgdm9pZCAqZGF0YSwgdm9pZCAqeXV2LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCiB7Ci0Jc3RydWN0IHl1djQxMSAqaW4gPSBkYXRhOwotCXN0cnVjdCB5dXY0MjIgKm91dF9ldmVuID0geXV2OwotCXN0cnVjdCB5dXY0MjIgKm91dF9vZGQgPSBvdXRfZXZlbiArIHdpZHRoIC8gMjsKLQlpbnQgaSwgajsJCS8qIGNvdW50ZXJzICovCisgICAgc3RydWN0IHl1djQxMSAqaW4gPSBkYXRhOworICAgIHN0cnVjdCB5dXY0MjIgKm91dF9ldmVuID0geXV2OworICAgIHN0cnVjdCB5dXY0MjIgKm91dF9vZGQgPSBvdXRfZXZlbiArIHdpZHRoIC8gMjsKKyAgICBpbnQgaSwgajsgICAgICAgICAgICAgICAgICAgLyogY291bnRlcnMgKi8KIAotCWZvciAoaSA9IGhlaWdodCAvIDI7IGktLTsgKSB7Ci0JCWZvciAoaiA9IHdpZHRoIC8gNDsgai0tOyApIHsKLQkJCVlVVjQyMl9ZMCgqb3V0X2V2ZW4pID0gWVVWNDExX1kwMCgqaW4pOwotCQkJWVVWNDIyX1UwKCpvdXRfZXZlbikgPSBZVVY0MTFfVTAwKCppbik7Ci0JCQlZVVY0MjJfVjAoKm91dF9ldmVuKSA9IFlVVjQxMV9WMDAoKmluKTsKLQkJCVlVVjQyMl9ZMSgqb3V0X2V2ZW4pID0gWVVWNDExX1kwMSgqaW4pOwotCQkJb3V0X2V2ZW4rKzsKLQkJCVlVVjQyMl9ZMCgqb3V0X2V2ZW4pID0gWVVWNDExX1kwMigqaW4pOwotCQkJWVVWNDIyX1UwKCpvdXRfZXZlbikgPSBZVVY0MTFfVTAyKCppbik7Ci0JCQlZVVY0MjJfVjAoKm91dF9ldmVuKSA9IFlVVjQxMV9WMDIoKmluKTsKLQkJCVlVVjQyMl9ZMSgqb3V0X2V2ZW4pID0gWVVWNDExX1kwMygqaW4pOwotCQkJb3V0X2V2ZW4rKzsKLQkJCVlVVjQyMl9ZMCgqb3V0X29kZCkgPSBZVVY0MTFfWTEwKCppbik7Ci0JCQlZVVY0MjJfVTAoKm91dF9vZGQpID0gWVVWNDExX1UxMCgqaW4pOwotCQkJWVVWNDIyX1YwKCpvdXRfb2RkKSA9IFlVVjQxMV9WMTAoKmluKTsKLQkJCVlVVjQyMl9ZMSgqb3V0X29kZCkgPSBZVVY0MTFfWTExKCppbik7Ci0JCQlvdXRfb2RkKys7Ci0JCQlZVVY0MjJfWTAoKm91dF9vZGQpID0gWVVWNDExX1kxMigqaW4pOwotCQkJWVVWNDIyX1UwKCpvdXRfb2RkKSA9IFlVVjQxMV9VMTIoKmluKTsKLQkJCVlVVjQyMl9WMCgqb3V0X29kZCkgPSBZVVY0MTFfVjEyKCppbik7Ci0JCQlZVVY0MjJfWTEoKm91dF9vZGQpID0gWVVWNDExX1kxMygqaW4pOwotCQkJb3V0X29kZCsrOwotCQkJaW4rKzsKLQkJfQotCQlvdXRfZXZlbiArPSB3aWR0aCAvIDI7Ci0JCW91dF9vZGQgKz0gd2lkdGggLyAyOwotCX0KKyAgICBmb3IgKGkgPSBoZWlnaHQgLyAyOyBpLS07ICkgeworICAgICAgICBmb3IgKGogPSB3aWR0aCAvIDQ7IGotLTsgKSB7CisgICAgICAgICAgICBZVVY0MjJfWTAoKm91dF9ldmVuKSA9IFlVVjQxMV9ZMDAoKmluKTsKKyAgICAgICAgICAgIFlVVjQyMl9VMCgqb3V0X2V2ZW4pID0gWVVWNDExX1UwMCgqaW4pOworICAgICAgICAgICAgWVVWNDIyX1YwKCpvdXRfZXZlbikgPSBZVVY0MTFfVjAwKCppbik7CisgICAgICAgICAgICBZVVY0MjJfWTEoKm91dF9ldmVuKSA9IFlVVjQxMV9ZMDEoKmluKTsKKyAgICAgICAgICAgIG91dF9ldmVuKys7CisgICAgICAgICAgICBZVVY0MjJfWTAoKm91dF9ldmVuKSA9IFlVVjQxMV9ZMDIoKmluKTsKKyAgICAgICAgICAgIFlVVjQyMl9VMCgqb3V0X2V2ZW4pID0gWVVWNDExX1UwMigqaW4pOworICAgICAgICAgICAgWVVWNDIyX1YwKCpvdXRfZXZlbikgPSBZVVY0MTFfVjAyKCppbik7CisgICAgICAgICAgICBZVVY0MjJfWTEoKm91dF9ldmVuKSA9IFlVVjQxMV9ZMDMoKmluKTsKKyAgICAgICAgICAgIG91dF9ldmVuKys7CisgICAgICAgICAgICBZVVY0MjJfWTAoKm91dF9vZGQpID0gWVVWNDExX1kxMCgqaW4pOworICAgICAgICAgICAgWVVWNDIyX1UwKCpvdXRfb2RkKSA9IFlVVjQxMV9VMTAoKmluKTsKKyAgICAgICAgICAgIFlVVjQyMl9WMCgqb3V0X29kZCkgPSBZVVY0MTFfVjEwKCppbik7CisgICAgICAgICAgICBZVVY0MjJfWTEoKm91dF9vZGQpID0gWVVWNDExX1kxMSgqaW4pOworICAgICAgICAgICAgb3V0X29kZCsrOworICAgICAgICAgICAgWVVWNDIyX1kwKCpvdXRfb2RkKSA9IFlVVjQxMV9ZMTIoKmluKTsKKyAgICAgICAgICAgIFlVVjQyMl9VMCgqb3V0X29kZCkgPSBZVVY0MTFfVTEyKCppbik7CisgICAgICAgICAgICBZVVY0MjJfVjAoKm91dF9vZGQpID0gWVVWNDExX1YxMigqaW4pOworICAgICAgICAgICAgWVVWNDIyX1kxKCpvdXRfb2RkKSA9IFlVVjQxMV9ZMTMoKmluKTsKKyAgICAgICAgICAgIG91dF9vZGQrKzsKKyAgICAgICAgICAgIGluKys7CisgICAgICAgIH0KKyAgICAgICAgb3V0X2V2ZW4gKz0gd2lkdGggLyAyOworICAgICAgICBvdXRfb2RkICs9IHdpZHRoIC8gMjsKKyAgICB9CiB9CiAKIHZvaWQKIHl1dl9zdjQxMV90b19jbDQyMmRjX3F1YXJ0ZXJzaXplKGludCBpbnZlcnQsIHZvaWQgKmRhdGEsIHZvaWQgKnl1diwKLQkJCQkgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQogewotCWludCB3NCA9IHdpZHRoIC8gNDsJLyogcXVhcnRlciBvZiB3aWR0aCBpcyB1c2VkIG9mdGVuICovCi0Jc3RydWN0IHl1djQxMSAqaW5fZXZlbiA9IGRhdGE7Ci0Jc3RydWN0IHl1djQxMSAqaW5fb2RkID0gaW5fZXZlbiArIHc0OwotCXN0cnVjdCB5dXY0MjIgKm91dF9ldmVuID0geXV2OwotCXN0cnVjdCB5dXY0MjIgKm91dF9vZGQgPSBvdXRfZXZlbiArIHc0OwotCWludCBpLCBqOwkJLyogY291bnRlcnMgKi8KLQlpbnQgdSwgdjsJCS8qIFUgYW5kIFYgdmFsdWVzICovCisgICAgaW50IHc0ID0gd2lkdGggLyA0OyAgICAgICAgIC8qIHF1YXJ0ZXIgb2Ygd2lkdGggaXMgdXNlZCBvZnRlbiAqLworICAgIHN0cnVjdCB5dXY0MTEgKmluX2V2ZW4gPSBkYXRhOworICAgIHN0cnVjdCB5dXY0MTEgKmluX29kZCA9IGluX2V2ZW4gKyB3NDsKKyAgICBzdHJ1Y3QgeXV2NDIyICpvdXRfZXZlbiA9IHl1djsKKyAgICBzdHJ1Y3QgeXV2NDIyICpvdXRfb2RkID0gb3V0X2V2ZW4gKyB3NDsKKyAgICBpbnQgaSwgajsgICAgICAgICAgICAgICAgICAgLyogY291bnRlcnMgKi8KKyAgICBpbnQgdSwgdjsgICAgICAgICAgICAgICAgICAgLyogVSBhbmQgViB2YWx1ZXMgKi8KIAotCWZvciAoaSA9IGhlaWdodCAvIDQ7IGktLTsgKSB7Ci0JCWZvciAoaiA9IHc0OyBqLS07ICkgewotCQkJdSA9IFlVVjQxMV9VMDAoKmluX2V2ZW4pOwotCQkJdiA9IFlVVjQxMV9WMDAoKmluX2V2ZW4pOworICAgIGZvciAoaSA9IGhlaWdodCAvIDQ7IGktLTsgKSB7CisgICAgICAgIGZvciAoaiA9IHc0OyBqLS07ICkgeworICAgICAgICAgICAgdSA9IFlVVjQxMV9VMDAoKmluX2V2ZW4pOworICAgICAgICAgICAgdiA9IFlVVjQxMV9WMDAoKmluX2V2ZW4pOwogCi0JCQlZVVY0MjJfWTAoKm91dF9ldmVuKSA9IFlVVjQxMV9ZMDAoKmluX2V2ZW4pOwotCQkJWVVWNDIyX1UwKCpvdXRfZXZlbikgPSB1OwotCQkJWVVWNDIyX1YwKCpvdXRfZXZlbikgPSB2OwotCQkJWVVWNDIyX1kxKCpvdXRfZXZlbikgPSBZVVY0MTFfWTAyKCppbl9ldmVuKTsKKyAgICAgICAgICAgIFlVVjQyMl9ZMCgqb3V0X2V2ZW4pID0gWVVWNDExX1kwMCgqaW5fZXZlbik7CisgICAgICAgICAgICBZVVY0MjJfVTAoKm91dF9ldmVuKSA9IHU7CisgICAgICAgICAgICBZVVY0MjJfVjAoKm91dF9ldmVuKSA9IHY7CisgICAgICAgICAgICBZVVY0MjJfWTEoKm91dF9ldmVuKSA9IFlVVjQxMV9ZMDIoKmluX2V2ZW4pOwogCi0JCQlZVVY0MjJfWTAoKm91dF9vZGQpID0gWVVWNDExX1kxMCgqaW5fb2RkKTsKLQkJCVlVVjQyMl9VMCgqb3V0X29kZCkgPSB1OwotCQkJWVVWNDIyX1YwKCpvdXRfb2RkKSA9IHY7Ci0JCQlZVVY0MjJfWTEoKm91dF9vZGQpID0gWVVWNDExX1kxMigqaW5fb2RkKTsKKyAgICAgICAgICAgIFlVVjQyMl9ZMCgqb3V0X29kZCkgPSBZVVY0MTFfWTEwKCppbl9vZGQpOworICAgICAgICAgICAgWVVWNDIyX1UwKCpvdXRfb2RkKSA9IHU7CisgICAgICAgICAgICBZVVY0MjJfVjAoKm91dF9vZGQpID0gdjsKKyAgICAgICAgICAgIFlVVjQyMl9ZMSgqb3V0X29kZCkgPSBZVVY0MTFfWTEyKCppbl9vZGQpOwogCi0JCQlpbl9ldmVuKys7Ci0JCQlpbl9vZGQrKzsKLQkJCW91dF9ldmVuKys7Ci0JCQlvdXRfb2RkKys7Ci0JCX0KLQkJaW5fZXZlbiArPSB3NDsKLQkJaW5fb2RkICs9IHc0OwotCQlvdXRfZXZlbiArPSB3NDsKLQkJb3V0X29kZCArPSB3NDsKLQl9CisgICAgICAgICAgICBpbl9ldmVuKys7CisgICAgICAgICAgICBpbl9vZGQrKzsKKyAgICAgICAgICAgIG91dF9ldmVuKys7CisgICAgICAgICAgICBvdXRfb2RkKys7CisgICAgICAgIH0KKyAgICAgICAgaW5fZXZlbiArPSB3NDsKKyAgICAgICAgaW5fb2RkICs9IHc0OworICAgICAgICBvdXRfZXZlbiArPSB3NDsKKyAgICAgICAgb3V0X29kZCArPSB3NDsKKyAgICB9CiB9CiAKIHZvaWQKIHl1dl9zdjQxMV90b19jbDQyMmRjX3NpeHRlZW50aHNpemUoaW50IGludmVydCwgdm9pZCAqZGF0YSwgdm9pZCAqeXV2LAotCQkJCSAgIGludCB3aWR0aCwgaW50IGhlaWdodCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQogewotCWludCB3NF8zID0gMyAqIHdpZHRoIC8gNDsgLyogdGhyZWUgcXVhcnRlcnMgb2Ygd2lkdGggaXMgdXNlZCBvZnRlbiAqLwotCWludCB3OCA9IHdpZHRoIC8gODsJLyogYW5kIHNvIGlzIG9uZSBlaWdodGggKi8KLQlzdHJ1Y3QgeXV2NDExICppbl9ldmVuID0gZGF0YTsKLQlzdHJ1Y3QgeXV2NDExICppbl9vZGQgPSBpbl9ldmVuICsgd2lkdGggLyAyOwotCXN0cnVjdCB5dXY0MjIgKm91dF9ldmVuID0geXV2OwotCXN0cnVjdCB5dXY0MjIgKm91dF9vZGQgPSBvdXRfZXZlbiArIHc4OwotCWludCBpLCBqOwkJLyogY291bnRlcnMgKi8KLQlpbnQgdSwgdjsJCS8qIFUgYW5kIFYgdmFsdWVzICovCisgICAgaW50IHc0XzMgPSAzICogd2lkdGggLyA0OyAvKiB0aHJlZSBxdWFydGVycyBvZiB3aWR0aCBpcyB1c2VkIG9mdGVuICovCisgICAgaW50IHc4ID0gd2lkdGggLyA4OyAgICAgICAgIC8qIGFuZCBzbyBpcyBvbmUgZWlnaHRoICovCisgICAgc3RydWN0IHl1djQxMSAqaW5fZXZlbiA9IGRhdGE7CisgICAgc3RydWN0IHl1djQxMSAqaW5fb2RkID0gaW5fZXZlbiArIHdpZHRoIC8gMjsKKyAgICBzdHJ1Y3QgeXV2NDIyICpvdXRfZXZlbiA9IHl1djsKKyAgICBzdHJ1Y3QgeXV2NDIyICpvdXRfb2RkID0gb3V0X2V2ZW4gKyB3ODsKKyAgICBpbnQgaSwgajsgICAgICAgICAgICAgICAgICAgLyogY291bnRlcnMgKi8KKyAgICBpbnQgdSwgdjsgICAgICAgICAgICAgICAgICAgLyogVSBhbmQgViB2YWx1ZXMgKi8KIAotCWZvciAoaSA9IGhlaWdodCAvIDg7IGktLTsgKSB7Ci0JCWZvciAoaiA9IHc4OyBqLS07ICkgewotCQkJdSA9IFlVVjQxMV9VMDAoaW5fZXZlblswXSk7Ci0JCQl2ID0gWVVWNDExX1YwMChpbl9ldmVuWzBdKTsKKyAgICBmb3IgKGkgPSBoZWlnaHQgLyA4OyBpLS07ICkgeworICAgICAgICBmb3IgKGogPSB3ODsgai0tOyApIHsKKyAgICAgICAgICAgIHUgPSBZVVY0MTFfVTAwKGluX2V2ZW5bMF0pOworICAgICAgICAgICAgdiA9IFlVVjQxMV9WMDAoaW5fZXZlblswXSk7CiAKLQkJCVlVVjQyMl9ZMCgqb3V0X2V2ZW4pID0gWVVWNDExX1kwMChpbl9ldmVuWzBdKTsKLQkJCVlVVjQyMl9VMCgqb3V0X2V2ZW4pID0gdTsKLQkJCVlVVjQyMl9WMCgqb3V0X2V2ZW4pID0gdjsKLQkJCVlVVjQyMl9ZMSgqb3V0X2V2ZW4pID0gWVVWNDExX1kwMChpbl9ldmVuWzFdKTsKKyAgICAgICAgICAgIFlVVjQyMl9ZMCgqb3V0X2V2ZW4pID0gWVVWNDExX1kwMChpbl9ldmVuWzBdKTsKKyAgICAgICAgICAgIFlVVjQyMl9VMCgqb3V0X2V2ZW4pID0gdTsKKyAgICAgICAgICAgIFlVVjQyMl9WMCgqb3V0X2V2ZW4pID0gdjsKKyAgICAgICAgICAgIFlVVjQyMl9ZMSgqb3V0X2V2ZW4pID0gWVVWNDExX1kwMChpbl9ldmVuWzFdKTsKIAotCQkJWVVWNDIyX1kwKCpvdXRfb2RkKSA9IFlVVjQxMV9ZMDAoaW5fb2RkWzBdKTsKLQkJCVlVVjQyMl9VMCgqb3V0X29kZCkgPSB1OwotCQkJWVVWNDIyX1YwKCpvdXRfb2RkKSA9IHY7Ci0JCQlZVVY0MjJfWTEoKm91dF9vZGQpID0gWVVWNDExX1kwMChpbl9ldmVuWzFdKTsKKyAgICAgICAgICAgIFlVVjQyMl9ZMCgqb3V0X29kZCkgPSBZVVY0MTFfWTAwKGluX29kZFswXSk7CisgICAgICAgICAgICBZVVY0MjJfVTAoKm91dF9vZGQpID0gdTsKKyAgICAgICAgICAgIFlVVjQyMl9WMCgqb3V0X29kZCkgPSB2OworICAgICAgICAgICAgWVVWNDIyX1kxKCpvdXRfb2RkKSA9IFlVVjQxMV9ZMDAoaW5fZXZlblsxXSk7CiAKLQkJCWluX2V2ZW4gKz0gMjsKLQkJCWluX29kZCArPSAyOwotCQkJb3V0X2V2ZW4rKzsKLQkJCW91dF9vZGQrKzsKLQkJfQotCQlpbl9ldmVuICs9IHc0XzM7Ci0JCWluX29kZCArPSB3NF8zOwotCQlvdXRfZXZlbiArPSB3ODsKLQkJb3V0X29kZCArPSB3ODsKLQl9CisgICAgICAgICAgICBpbl9ldmVuICs9IDI7CisgICAgICAgICAgICBpbl9vZGQgKz0gMjsKKyAgICAgICAgICAgIG91dF9ldmVuKys7CisgICAgICAgICAgICBvdXRfb2RkKys7CisgICAgICAgIH0KKyAgICAgICAgaW5fZXZlbiArPSB3NF8zOworICAgICAgICBpbl9vZGQgKz0gdzRfMzsKKyAgICAgICAgb3V0X2V2ZW4gKz0gdzg7CisgICAgICAgIG91dF9vZGQgKz0gdzg7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy96aXBpbXBvcnQuYyBiL01vZHVsZXMvemlwaW1wb3J0LmMKaW5kZXggZTMyMGRkOS4uMThjNWE3ZCAxMDA2NDQKLS0tIGEvTW9kdWxlcy96aXBpbXBvcnQuYworKysgYi9Nb2R1bGVzL3ppcGltcG9ydC5jCkBAIC0xMCw4ICsxMCw4IEBACiAjZGVmaW5lIElTX1BBQ0tBR0UgIDB4MgogCiBzdHJ1Y3Qgc3RfemlwX3NlYXJjaG9yZGVyIHsKLQljaGFyIHN1ZmZpeFsxNF07Ci0JaW50IHR5cGU7CisgICAgY2hhciBzdWZmaXhbMTRdOworICAgIGludCB0eXBlOwogfTsKIAogLyogemlwX3NlYXJjaG9yZGVyIGRlZmluZXMgaG93IHdlIHNlYXJjaCBmb3IgYSBtb2R1bGUgaW4gdGhlIFppcApAQCAtMjAsMTMgKzIwLDEzIEBACiAgICBhcmUgc3dhcHBlZCBieSBpbml0emlwaW1wb3J0KCkgaWYgd2UgcnVuIGluIG9wdGltaXplZCBtb2RlLiBBbHNvLAogICAgJy8nIGlzIHJlcGxhY2VkIGJ5IFNFUCB0aGVyZS4gKi8KIHN0YXRpYyBzdHJ1Y3Qgc3RfemlwX3NlYXJjaG9yZGVyIHppcF9zZWFyY2hvcmRlcltdID0gewotCXsiL19faW5pdF9fLnB5YyIsIElTX1BBQ0tBR0UgfCBJU19CWVRFQ09ERX0sCi0JeyIvX19pbml0X18ucHlvIiwgSVNfUEFDS0FHRSB8IElTX0JZVEVDT0RFfSwKLQl7Ii9fX2luaXRfXy5weSIsIElTX1BBQ0tBR0UgfCBJU19TT1VSQ0V9LAotCXsiLnB5YyIsIElTX0JZVEVDT0RFfSwKLQl7Ii5weW8iLCBJU19CWVRFQ09ERX0sCi0JeyIucHkiLCBJU19TT1VSQ0V9LAotCXsiIiwgMH0KKyAgICB7Ii9fX2luaXRfXy5weWMiLCBJU19QQUNLQUdFIHwgSVNfQllURUNPREV9LAorICAgIHsiL19faW5pdF9fLnB5byIsIElTX1BBQ0tBR0UgfCBJU19CWVRFQ09ERX0sCisgICAgeyIvX19pbml0X18ucHkiLCBJU19QQUNLQUdFIHwgSVNfU09VUkNFfSwKKyAgICB7Ii5weWMiLCBJU19CWVRFQ09ERX0sCisgICAgeyIucHlvIiwgSVNfQllURUNPREV9LAorICAgIHsiLnB5IiwgSVNfU09VUkNFfSwKKyAgICB7IiIsIDB9CiB9OwogCiAvKiB6aXBpbXBvcnRlciBvYmplY3QgZGVmaW5pdGlvbiBhbmQgc3VwcG9ydCAqLwpAQCAtMzQsMTAgKzM0LDEwIEBACiB0eXBlZGVmIHN0cnVjdCBfemlwaW1wb3J0ZXIgWmlwSW1wb3J0ZXI7CiAKIHN0cnVjdCBfemlwaW1wb3J0ZXIgewotCVB5T2JqZWN0X0hFQUQKLQlQeU9iamVjdCAqYXJjaGl2ZTsgIC8qIHBhdGhuYW1lIG9mIHRoZSBaaXAgYXJjaGl2ZSAqLwotCVB5T2JqZWN0ICpwcmVmaXg7ICAgLyogZmlsZSBwcmVmaXg6ICJhL3N1Yi9kaXJlY3RvcnkvIiAqLwotCVB5T2JqZWN0ICpmaWxlczsgICAgLyogZGljdCB3aXRoIGZpbGUgaW5mbyB7cGF0aDogdG9jX2VudHJ5fSAqLworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBQeU9iamVjdCAqYXJjaGl2ZTsgIC8qIHBhdGhuYW1lIG9mIHRoZSBaaXAgYXJjaGl2ZSAqLworICAgIFB5T2JqZWN0ICpwcmVmaXg7ICAgLyogZmlsZSBwcmVmaXg6ICJhL3N1Yi9kaXJlY3RvcnkvIiAqLworICAgIFB5T2JqZWN0ICpmaWxlczsgICAgLyogZGljdCB3aXRoIGZpbGUgaW5mbyB7cGF0aDogdG9jX2VudHJ5fSAqLwogfTsKIAogc3RhdGljIFB5T2JqZWN0ICpaaXBJbXBvcnRFcnJvcjsKQEAgLTQ3LDcgKzQ3LDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqcmVhZF9kaXJlY3RvcnkoY2hhciAqYXJjaGl2ZSk7CiBzdGF0aWMgUHlPYmplY3QgKmdldF9kYXRhKGNoYXIgKmFyY2hpdmUsIFB5T2JqZWN0ICp0b2NfZW50cnkpOwogc3RhdGljIFB5T2JqZWN0ICpnZXRfbW9kdWxlX2NvZGUoWmlwSW1wb3J0ZXIgKnNlbGYsIGNoYXIgKmZ1bGxuYW1lLAotCQkJCSBpbnQgKnBfaXNwYWNrYWdlLCBjaGFyICoqcF9tb2RwYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqcF9pc3BhY2thZ2UsIGNoYXIgKipwX21vZHBhdGgpOwogCiAKICNkZWZpbmUgWmlwSW1wb3J0ZXJfQ2hlY2sob3ApIFB5T2JqZWN0X1R5cGVDaGVjayhvcCwgJlppcEltcG9ydGVyX1R5cGUpCkBAIC02MCwxNjIgKzYwLDE2MiBAQAogc3RhdGljIGludAogemlwaW1wb3J0ZXJfaW5pdChaaXBJbXBvcnRlciAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCWNoYXIgKnBhdGgsICpwLCAqcHJlZml4LCBidWZbTUFYUEFUSExFTisyXTsKLQlzaXplX3QgbGVuOworICAgIGNoYXIgKnBhdGgsICpwLCAqcHJlZml4LCBidWZbTUFYUEFUSExFTisyXTsKKyAgICBzaXplX3QgbGVuOwogCi0JaWYgKCFfUHlBcmdfTm9LZXl3b3JkcygiemlwaW1wb3J0ZXIoKSIsIGt3ZHMpKQotCQlyZXR1cm4gLTE7CisgICAgaWYgKCFfUHlBcmdfTm9LZXl3b3JkcygiemlwaW1wb3J0ZXIoKSIsIGt3ZHMpKQorICAgICAgICByZXR1cm4gLTE7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6emlwaW1wb3J0ZXIiLAotCQkJICAgICAgJnBhdGgpKQotCQlyZXR1cm4gLTE7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOnppcGltcG9ydGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhdGgpKQorICAgICAgICByZXR1cm4gLTE7CiAKLQlsZW4gPSBzdHJsZW4ocGF0aCk7Ci0JaWYgKGxlbiA9PSAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhaaXBJbXBvcnRFcnJvciwgImFyY2hpdmUgcGF0aCBpcyBlbXB0eSIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmIChsZW4gPj0gTUFYUEFUSExFTikgewotCQlQeUVycl9TZXRTdHJpbmcoWmlwSW1wb3J0RXJyb3IsCi0JCQkJImFyY2hpdmUgcGF0aCB0b28gbG9uZyIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXN0cmNweShidWYsIHBhdGgpOworICAgIGxlbiA9IHN0cmxlbihwYXRoKTsKKyAgICBpZiAobGVuID09IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFppcEltcG9ydEVycm9yLCAiYXJjaGl2ZSBwYXRoIGlzIGVtcHR5Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKGxlbiA+PSBNQVhQQVRITEVOKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhaaXBJbXBvcnRFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJhcmNoaXZlIHBhdGggdG9vIGxvbmciKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBzdHJjcHkoYnVmLCBwYXRoKTsKIAogI2lmZGVmIEFMVFNFUAotCWZvciAocCA9IGJ1ZjsgKnA7IHArKykgewotCQlpZiAoKnAgPT0gQUxUU0VQKQotCQkJKnAgPSBTRVA7Ci0JfQorICAgIGZvciAocCA9IGJ1ZjsgKnA7IHArKykgeworICAgICAgICBpZiAoKnAgPT0gQUxUU0VQKQorICAgICAgICAgICAgKnAgPSBTRVA7CisgICAgfQogI2VuZGlmCiAKLQlwYXRoID0gTlVMTDsKLQlwcmVmaXggPSBOVUxMOwotCWZvciAoOzspIHsKKyAgICBwYXRoID0gTlVMTDsKKyAgICBwcmVmaXggPSBOVUxMOworICAgIGZvciAoOzspIHsKICNpZm5kZWYgUklTQ09TCi0JCXN0cnVjdCBzdGF0IHN0YXRidWY7Ci0JCWludCBydjsKKyAgICAgICAgc3RydWN0IHN0YXQgc3RhdGJ1ZjsKKyAgICAgICAgaW50IHJ2OwogCi0JCXJ2ID0gc3RhdChidWYsICZzdGF0YnVmKTsKLQkJaWYgKHJ2ID09IDApIHsKLQkJCS8qIGl0IGV4aXN0cyAqLwotCQkJaWYgKFNfSVNSRUcoc3RhdGJ1Zi5zdF9tb2RlKSkKLQkJCQkvKiBpdCdzIGEgZmlsZSAqLwotCQkJCXBhdGggPSBidWY7Ci0JCQlicmVhazsKLQkJfQorICAgICAgICBydiA9IHN0YXQoYnVmLCAmc3RhdGJ1Zik7CisgICAgICAgIGlmIChydiA9PSAwKSB7CisgICAgICAgICAgICAvKiBpdCBleGlzdHMgKi8KKyAgICAgICAgICAgIGlmIChTX0lTUkVHKHN0YXRidWYuc3RfbW9kZSkpCisgICAgICAgICAgICAgICAgLyogaXQncyBhIGZpbGUgKi8KKyAgICAgICAgICAgICAgICBwYXRoID0gYnVmOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KICNlbHNlCi0JCWlmIChvYmplY3RfZXhpc3RzKGJ1ZikpIHsKLQkJCS8qIGl0IGV4aXN0cyAqLwotCQkJaWYgKGlzZmlsZShidWYpKQotCQkJCS8qIGl0J3MgYSBmaWxlICovCi0JCQkJcGF0aCA9IGJ1ZjsKLQkJCWJyZWFrOwotCQl9CisgICAgICAgIGlmIChvYmplY3RfZXhpc3RzKGJ1ZikpIHsKKyAgICAgICAgICAgIC8qIGl0IGV4aXN0cyAqLworICAgICAgICAgICAgaWYgKGlzZmlsZShidWYpKQorICAgICAgICAgICAgICAgIC8qIGl0J3MgYSBmaWxlICovCisgICAgICAgICAgICAgICAgcGF0aCA9IGJ1ZjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CiAjZW5kaWYKLQkJLyogYmFjayB1cCBvbmUgcGF0aCBlbGVtZW50ICovCi0JCXAgPSBzdHJyY2hyKGJ1ZiwgU0VQKTsKLQkJaWYgKHByZWZpeCAhPSBOVUxMKQotCQkJKnByZWZpeCA9IFNFUDsKLQkJaWYgKHAgPT0gTlVMTCkKLQkJCWJyZWFrOwotCQkqcCA9ICdcMCc7Ci0JCXByZWZpeCA9IHA7Ci0JfQotCWlmIChwYXRoICE9IE5VTEwpIHsKLQkJUHlPYmplY3QgKmZpbGVzOwotCQlmaWxlcyA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKHppcF9kaXJlY3RvcnlfY2FjaGUsIHBhdGgpOwotCQlpZiAoZmlsZXMgPT0gTlVMTCkgewotCQkJZmlsZXMgPSByZWFkX2RpcmVjdG9yeShidWYpOwotCQkJaWYgKGZpbGVzID09IE5VTEwpCi0JCQkJcmV0dXJuIC0xOwotCQkJaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKHppcF9kaXJlY3RvcnlfY2FjaGUsIHBhdGgsCi0JCQkJCQkgZmlsZXMpICE9IDApCi0JCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWVsc2UKLQkJCVB5X0lOQ1JFRihmaWxlcyk7Ci0JCXNlbGYtPmZpbGVzID0gZmlsZXM7Ci0JfQotCWVsc2UgewotCQlQeUVycl9TZXRTdHJpbmcoWmlwSW1wb3J0RXJyb3IsICJub3QgYSBaaXAgZmlsZSIpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgICAgICAvKiBiYWNrIHVwIG9uZSBwYXRoIGVsZW1lbnQgKi8KKyAgICAgICAgcCA9IHN0cnJjaHIoYnVmLCBTRVApOworICAgICAgICBpZiAocHJlZml4ICE9IE5VTEwpCisgICAgICAgICAgICAqcHJlZml4ID0gU0VQOworICAgICAgICBpZiAocCA9PSBOVUxMKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICpwID0gJ1wwJzsKKyAgICAgICAgcHJlZml4ID0gcDsKKyAgICB9CisgICAgaWYgKHBhdGggIT0gTlVMTCkgeworICAgICAgICBQeU9iamVjdCAqZmlsZXM7CisgICAgICAgIGZpbGVzID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoemlwX2RpcmVjdG9yeV9jYWNoZSwgcGF0aCk7CisgICAgICAgIGlmIChmaWxlcyA9PSBOVUxMKSB7CisgICAgICAgICAgICBmaWxlcyA9IHJlYWRfZGlyZWN0b3J5KGJ1Zik7CisgICAgICAgICAgICBpZiAoZmlsZXMgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoemlwX2RpcmVjdG9yeV9jYWNoZSwgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlcykgIT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgUHlfSU5DUkVGKGZpbGVzKTsKKyAgICAgICAgc2VsZi0+ZmlsZXMgPSBmaWxlczsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhaaXBJbXBvcnRFcnJvciwgIm5vdCBhIFppcCBmaWxlIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQlpZiAocHJlZml4ID09IE5VTEwpCi0JCXByZWZpeCA9ICIiOwotCWVsc2UgewotCQlwcmVmaXgrKzsKLQkJbGVuID0gc3RybGVuKHByZWZpeCk7Ci0JCWlmIChwcmVmaXhbbGVuLTFdICE9IFNFUCkgewotCQkJLyogYWRkIHRyYWlsaW5nIFNFUCAqLwotCQkJcHJlZml4W2xlbl0gPSBTRVA7Ci0JCQlwcmVmaXhbbGVuICsgMV0gPSAnXDAnOwotCQl9Ci0JfQorICAgIGlmIChwcmVmaXggPT0gTlVMTCkKKyAgICAgICAgcHJlZml4ID0gIiI7CisgICAgZWxzZSB7CisgICAgICAgIHByZWZpeCsrOworICAgICAgICBsZW4gPSBzdHJsZW4ocHJlZml4KTsKKyAgICAgICAgaWYgKHByZWZpeFtsZW4tMV0gIT0gU0VQKSB7CisgICAgICAgICAgICAvKiBhZGQgdHJhaWxpbmcgU0VQICovCisgICAgICAgICAgICBwcmVmaXhbbGVuXSA9IFNFUDsKKyAgICAgICAgICAgIHByZWZpeFtsZW4gKyAxXSA9ICdcMCc7CisgICAgICAgIH0KKyAgICB9CiAKLQlzZWxmLT5hcmNoaXZlID0gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOwotCWlmIChzZWxmLT5hcmNoaXZlID09IE5VTEwpCi0JCXJldHVybiAtMTsKKyAgICBzZWxmLT5hcmNoaXZlID0gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOworICAgIGlmIChzZWxmLT5hcmNoaXZlID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKIAotCXNlbGYtPnByZWZpeCA9IFB5U3RyaW5nX0Zyb21TdHJpbmcocHJlZml4KTsKLQlpZiAoc2VsZi0+cHJlZml4ID09IE5VTEwpCi0JCXJldHVybiAtMTsKKyAgICBzZWxmLT5wcmVmaXggPSBQeVN0cmluZ19Gcm9tU3RyaW5nKHByZWZpeCk7CisgICAgaWYgKHNlbGYtPnByZWZpeCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CiAKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKIH0KIAogLyogR0Mgc3VwcG9ydC4gKi8KIHN0YXRpYyBpbnQKIHppcGltcG9ydGVyX3RyYXZlcnNlKFB5T2JqZWN0ICpvYmosIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotCVppcEltcG9ydGVyICpzZWxmID0gKFppcEltcG9ydGVyICopb2JqOwotCVB5X1ZJU0lUKHNlbGYtPmZpbGVzKTsKLQlyZXR1cm4gMDsKKyAgICBaaXBJbXBvcnRlciAqc2VsZiA9IChaaXBJbXBvcnRlciAqKW9iajsKKyAgICBQeV9WSVNJVChzZWxmLT5maWxlcyk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkCiB6aXBpbXBvcnRlcl9kZWFsbG9jKFppcEltcG9ydGVyICpzZWxmKQogewotCVB5T2JqZWN0X0dDX1VuVHJhY2soc2VsZik7Ci0JUHlfWERFQ1JFRihzZWxmLT5hcmNoaXZlKTsKLQlQeV9YREVDUkVGKHNlbGYtPnByZWZpeCk7Ci0JUHlfWERFQ1JFRihzZWxmLT5maWxlcyk7Ci0JUHlfVFlQRShzZWxmKS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKKyAgICBQeU9iamVjdF9HQ19VblRyYWNrKHNlbGYpOworICAgIFB5X1hERUNSRUYoc2VsZi0+YXJjaGl2ZSk7CisgICAgUHlfWERFQ1JFRihzZWxmLT5wcmVmaXgpOworICAgIFB5X1hERUNSRUYoc2VsZi0+ZmlsZXMpOworICAgIFB5X1RZUEUoc2VsZiktPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB6aXBpbXBvcnRlcl9yZXByKFppcEltcG9ydGVyICpzZWxmKQogewotCWNoYXIgYnVmWzUwMF07Ci0JY2hhciAqYXJjaGl2ZSA9ICI/Pz8iOwotCWNoYXIgKnByZWZpeCA9ICIiOworICAgIGNoYXIgYnVmWzUwMF07CisgICAgY2hhciAqYXJjaGl2ZSA9ICI/Pz8iOworICAgIGNoYXIgKnByZWZpeCA9ICIiOwogCi0JaWYgKHNlbGYtPmFyY2hpdmUgIT0gTlVMTCAmJiBQeVN0cmluZ19DaGVjayhzZWxmLT5hcmNoaXZlKSkKLQkJYXJjaGl2ZSA9IFB5U3RyaW5nX0FzU3RyaW5nKHNlbGYtPmFyY2hpdmUpOwotCWlmIChzZWxmLT5wcmVmaXggIT0gTlVMTCAmJiBQeVN0cmluZ19DaGVjayhzZWxmLT5wcmVmaXgpKQotCQlwcmVmaXggPSBQeVN0cmluZ19Bc1N0cmluZyhzZWxmLT5wcmVmaXgpOwotCWlmIChwcmVmaXggIT0gTlVMTCAmJiAqcHJlZml4KQotCQlQeU9TX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksCi0JCQkgICAgICAiPHppcGltcG9ydGVyIG9iamVjdCBcIiUuMzAwcyVjJS4xNTBzXCI+IiwKLQkJCSAgICAgIGFyY2hpdmUsIFNFUCwgcHJlZml4KTsKLQllbHNlCi0JCVB5T1Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwKLQkJCSAgICAgICI8emlwaW1wb3J0ZXIgb2JqZWN0IFwiJS4zMDBzXCI+IiwKLQkJCSAgICAgIGFyY2hpdmUpOwotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CisgICAgaWYgKHNlbGYtPmFyY2hpdmUgIT0gTlVMTCAmJiBQeVN0cmluZ19DaGVjayhzZWxmLT5hcmNoaXZlKSkKKyAgICAgICAgYXJjaGl2ZSA9IFB5U3RyaW5nX0FzU3RyaW5nKHNlbGYtPmFyY2hpdmUpOworICAgIGlmIChzZWxmLT5wcmVmaXggIT0gTlVMTCAmJiBQeVN0cmluZ19DaGVjayhzZWxmLT5wcmVmaXgpKQorICAgICAgICBwcmVmaXggPSBQeVN0cmluZ19Bc1N0cmluZyhzZWxmLT5wcmVmaXgpOworICAgIGlmIChwcmVmaXggIT0gTlVMTCAmJiAqcHJlZml4KQorICAgICAgICBQeU9TX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksCisgICAgICAgICAgICAgICAgICAgICAgIjx6aXBpbXBvcnRlciBvYmplY3QgXCIlLjMwMHMlYyUuMTUwc1wiPiIsCisgICAgICAgICAgICAgICAgICAgICAgYXJjaGl2ZSwgU0VQLCBwcmVmaXgpOworICAgIGVsc2UKKyAgICAgICAgUHlPU19zbnByaW50ZihidWYsIHNpemVvZihidWYpLAorICAgICAgICAgICAgICAgICAgICAgICI8emlwaW1wb3J0ZXIgb2JqZWN0IFwiJS4zMDBzXCI+IiwKKyAgICAgICAgICAgICAgICAgICAgICBhcmNoaXZlKTsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOwogfQogCiAvKiByZXR1cm4gZnVsbG5hbWUuc3BsaXQoIi4iKVstMV0gKi8KIHN0YXRpYyBjaGFyICoKIGdldF9zdWJuYW1lKGNoYXIgKmZ1bGxuYW1lKQogewotCWNoYXIgKnN1Ym5hbWUgPSBzdHJyY2hyKGZ1bGxuYW1lLCAnLicpOwotCWlmIChzdWJuYW1lID09IE5VTEwpCi0JCXN1Ym5hbWUgPSBmdWxsbmFtZTsKLQllbHNlCi0JCXN1Ym5hbWUrKzsKLQlyZXR1cm4gc3VibmFtZTsKKyAgICBjaGFyICpzdWJuYW1lID0gc3RycmNocihmdWxsbmFtZSwgJy4nKTsKKyAgICBpZiAoc3VibmFtZSA9PSBOVUxMKQorICAgICAgICBzdWJuYW1lID0gZnVsbG5hbWU7CisgICAgZWxzZQorICAgICAgICBzdWJuYW1lKys7CisgICAgcmV0dXJuIHN1Ym5hbWU7CiB9CiAKIC8qIEdpdmVuIGEgKHN1Yiltb2R1bGVuYW1lLCB3cml0ZSB0aGUgcG90ZW50aWFsIGZpbGUgcGF0aCBpbiB0aGUKQEAgLTIyNCw1OSArMjI0LDU5IEBACiBzdGF0aWMgaW50CiBtYWtlX2ZpbGVuYW1lKGNoYXIgKnByZWZpeCwgY2hhciAqbmFtZSwgY2hhciAqcGF0aCkKIHsKLQlzaXplX3QgbGVuOwotCWNoYXIgKnA7CisgICAgc2l6ZV90IGxlbjsKKyAgICBjaGFyICpwOwogCi0JbGVuID0gc3RybGVuKHByZWZpeCk7CisgICAgbGVuID0gc3RybGVuKHByZWZpeCk7CiAKLQkvKiBzZWxmLnByZWZpeCArIG5hbWUgWysgU0VQICsgIl9faW5pdF9fIl0gKyAiLnB5W2NvXSIgKi8KLQlpZiAobGVuICsgc3RybGVuKG5hbWUpICsgMTMgPj0gTUFYUEFUSExFTikgewotCQlQeUVycl9TZXRTdHJpbmcoWmlwSW1wb3J0RXJyb3IsICJwYXRoIHRvbyBsb25nIik7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgLyogc2VsZi5wcmVmaXggKyBuYW1lIFsrIFNFUCArICJfX2luaXRfXyJdICsgIi5weVtjb10iICovCisgICAgaWYgKGxlbiArIHN0cmxlbihuYW1lKSArIDEzID49IE1BWFBBVEhMRU4pIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFppcEltcG9ydEVycm9yLCAicGF0aCB0b28gbG9uZyIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0Jc3RyY3B5KHBhdGgsIHByZWZpeCk7Ci0Jc3RyY3B5KHBhdGggKyBsZW4sIG5hbWUpOwotCWZvciAocCA9IHBhdGggKyBsZW47ICpwOyBwKyspIHsKLQkJaWYgKCpwID09ICcuJykKLQkJCSpwID0gU0VQOwotCX0KLQlsZW4gKz0gc3RybGVuKG5hbWUpOwotCWFzc2VydChsZW4gPCBJTlRfTUFYKTsKLQlyZXR1cm4gKGludClsZW47CisgICAgc3RyY3B5KHBhdGgsIHByZWZpeCk7CisgICAgc3RyY3B5KHBhdGggKyBsZW4sIG5hbWUpOworICAgIGZvciAocCA9IHBhdGggKyBsZW47ICpwOyBwKyspIHsKKyAgICAgICAgaWYgKCpwID09ICcuJykKKyAgICAgICAgICAgICpwID0gU0VQOworICAgIH0KKyAgICBsZW4gKz0gc3RybGVuKG5hbWUpOworICAgIGFzc2VydChsZW4gPCBJTlRfTUFYKTsKKyAgICByZXR1cm4gKGludClsZW47CiB9CiAKIGVudW0gemlfbW9kdWxlX2luZm8gewotCU1JX0VSUk9SLAotCU1JX05PVF9GT1VORCwKLQlNSV9NT0RVTEUsCi0JTUlfUEFDS0FHRQorICAgIE1JX0VSUk9SLAorICAgIE1JX05PVF9GT1VORCwKKyAgICBNSV9NT0RVTEUsCisgICAgTUlfUEFDS0FHRQogfTsKIAogLyogUmV0dXJuIHNvbWUgaW5mb3JtYXRpb24gYWJvdXQgYSBtb2R1bGUuICovCiBzdGF0aWMgZW51bSB6aV9tb2R1bGVfaW5mbwogZ2V0X21vZHVsZV9pbmZvKFppcEltcG9ydGVyICpzZWxmLCBjaGFyICpmdWxsbmFtZSkKIHsKLQljaGFyICpzdWJuYW1lLCBwYXRoW01BWFBBVEhMRU4gKyAxXTsKLQlpbnQgbGVuOwotCXN0cnVjdCBzdF96aXBfc2VhcmNob3JkZXIgKnpzbzsKKyAgICBjaGFyICpzdWJuYW1lLCBwYXRoW01BWFBBVEhMRU4gKyAxXTsKKyAgICBpbnQgbGVuOworICAgIHN0cnVjdCBzdF96aXBfc2VhcmNob3JkZXIgKnpzbzsKIAotCXN1Ym5hbWUgPSBnZXRfc3VibmFtZShmdWxsbmFtZSk7CisgICAgc3VibmFtZSA9IGdldF9zdWJuYW1lKGZ1bGxuYW1lKTsKIAotCWxlbiA9IG1ha2VfZmlsZW5hbWUoUHlTdHJpbmdfQXNTdHJpbmcoc2VsZi0+cHJlZml4KSwgc3VibmFtZSwgcGF0aCk7Ci0JaWYgKGxlbiA8IDApCi0JCXJldHVybiBNSV9FUlJPUjsKKyAgICBsZW4gPSBtYWtlX2ZpbGVuYW1lKFB5U3RyaW5nX0FzU3RyaW5nKHNlbGYtPnByZWZpeCksIHN1Ym5hbWUsIHBhdGgpOworICAgIGlmIChsZW4gPCAwKQorICAgICAgICByZXR1cm4gTUlfRVJST1I7CiAKLQlmb3IgKHpzbyA9IHppcF9zZWFyY2hvcmRlcjsgKnpzby0+c3VmZml4OyB6c28rKykgewotCQlzdHJjcHkocGF0aCArIGxlbiwgenNvLT5zdWZmaXgpOwotCQlpZiAoUHlEaWN0X0dldEl0ZW1TdHJpbmcoc2VsZi0+ZmlsZXMsIHBhdGgpICE9IE5VTEwpIHsKLQkJCWlmICh6c28tPnR5cGUgJiBJU19QQUNLQUdFKQotCQkJCXJldHVybiBNSV9QQUNLQUdFOwotCQkJZWxzZQotCQkJCXJldHVybiBNSV9NT0RVTEU7Ci0JCX0KLQl9Ci0JcmV0dXJuIE1JX05PVF9GT1VORDsKKyAgICBmb3IgKHpzbyA9IHppcF9zZWFyY2hvcmRlcjsgKnpzby0+c3VmZml4OyB6c28rKykgeworICAgICAgICBzdHJjcHkocGF0aCArIGxlbiwgenNvLT5zdWZmaXgpOworICAgICAgICBpZiAoUHlEaWN0X0dldEl0ZW1TdHJpbmcoc2VsZi0+ZmlsZXMsIHBhdGgpICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGlmICh6c28tPnR5cGUgJiBJU19QQUNLQUdFKQorICAgICAgICAgICAgICAgIHJldHVybiBNSV9QQUNLQUdFOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBNSV9NT0RVTEU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE1JX05PVF9GT1VORDsKIH0KIAogLyogQ2hlY2sgd2hldGhlciB3ZSBjYW4gc2F0aXNmeSB0aGUgaW1wb3J0IG9mIHRoZSBtb2R1bGUgbmFtZWQgYnkKQEAgLTI4NCw4OSArMjg0LDg5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogemlwaW1wb3J0ZXJfZmluZF9tb2R1bGUoUHlPYmplY3QgKm9iaiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JWmlwSW1wb3J0ZXIgKnNlbGYgPSAoWmlwSW1wb3J0ZXIgKilvYmo7Ci0JUHlPYmplY3QgKnBhdGggPSBOVUxMOwotCWNoYXIgKmZ1bGxuYW1lOwotCWVudW0gemlfbW9kdWxlX2luZm8gbWk7CisgICAgWmlwSW1wb3J0ZXIgKnNlbGYgPSAoWmlwSW1wb3J0ZXIgKilvYmo7CisgICAgUHlPYmplY3QgKnBhdGggPSBOVUxMOworICAgIGNoYXIgKmZ1bGxuYW1lOworICAgIGVudW0gemlfbW9kdWxlX2luZm8gbWk7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInN8Tzp6aXBpbXBvcnRlci5maW5kX21vZHVsZSIsCi0JCQkgICAgICAmZnVsbG5hbWUsICZwYXRoKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzfE86emlwaW1wb3J0ZXIuZmluZF9tb2R1bGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZnVsbG5hbWUsICZwYXRoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQltaSA9IGdldF9tb2R1bGVfaW5mbyhzZWxmLCBmdWxsbmFtZSk7Ci0JaWYgKG1pID09IE1JX0VSUk9SKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAobWkgPT0gTUlfTk9UX0ZPVU5EKSB7Ci0JCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJcmV0dXJuIFB5X05vbmU7Ci0JfQotCVB5X0lOQ1JFRihzZWxmKTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKKyAgICBtaSA9IGdldF9tb2R1bGVfaW5mbyhzZWxmLCBmdWxsbmFtZSk7CisgICAgaWYgKG1pID09IE1JX0VSUk9SKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAobWkgPT0gTUlfTk9UX0ZPVU5EKSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgfQorICAgIFB5X0lOQ1JFRihzZWxmKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKIH0KIAogLyogTG9hZCBhbmQgcmV0dXJuIHRoZSBtb2R1bGUgbmFtZWQgYnkgJ2Z1bGxuYW1lJy4gKi8KIHN0YXRpYyBQeU9iamVjdCAqCiB6aXBpbXBvcnRlcl9sb2FkX21vZHVsZShQeU9iamVjdCAqb2JqLCBQeU9iamVjdCAqYXJncykKIHsKLQlaaXBJbXBvcnRlciAqc2VsZiA9IChaaXBJbXBvcnRlciAqKW9iajsKLQlQeU9iamVjdCAqY29kZSwgKm1vZCwgKmRpY3Q7Ci0JY2hhciAqZnVsbG5hbWUsICptb2RwYXRoOwotCWludCBpc3BhY2thZ2U7CisgICAgWmlwSW1wb3J0ZXIgKnNlbGYgPSAoWmlwSW1wb3J0ZXIgKilvYmo7CisgICAgUHlPYmplY3QgKmNvZGUsICptb2QsICpkaWN0OworICAgIGNoYXIgKmZ1bGxuYW1lLCAqbW9kcGF0aDsKKyAgICBpbnQgaXNwYWNrYWdlOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOnppcGltcG9ydGVyLmxvYWRfbW9kdWxlIiwKLQkJCSAgICAgICZmdWxsbmFtZSkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczp6aXBpbXBvcnRlci5sb2FkX21vZHVsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmdWxsbmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JY29kZSA9IGdldF9tb2R1bGVfY29kZShzZWxmLCBmdWxsbmFtZSwgJmlzcGFja2FnZSwgJm1vZHBhdGgpOwotCWlmIChjb2RlID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIGNvZGUgPSBnZXRfbW9kdWxlX2NvZGUoc2VsZiwgZnVsbG5hbWUsICZpc3BhY2thZ2UsICZtb2RwYXRoKTsKKyAgICBpZiAoY29kZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCW1vZCA9IFB5SW1wb3J0X0FkZE1vZHVsZShmdWxsbmFtZSk7Ci0JaWYgKG1vZCA9PSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRihjb2RlKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWRpY3QgPSBQeU1vZHVsZV9HZXREaWN0KG1vZCk7CisgICAgbW9kID0gUHlJbXBvcnRfQWRkTW9kdWxlKGZ1bGxuYW1lKTsKKyAgICBpZiAobW9kID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKGNvZGUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZGljdCA9IFB5TW9kdWxlX0dldERpY3QobW9kKTsKIAotCS8qIG1vZC5fX2xvYWRlcl9fID0gc2VsZiAqLwotCWlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCAiX19sb2FkZXJfXyIsIChQeU9iamVjdCAqKXNlbGYpICE9IDApCi0JCWdvdG8gZXJyb3I7CisgICAgLyogbW9kLl9fbG9hZGVyX18gPSBzZWxmICovCisgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsICJfX2xvYWRlcl9fIiwgKFB5T2JqZWN0ICopc2VsZikgIT0gMCkKKyAgICAgICAgZ290byBlcnJvcjsKIAotCWlmIChpc3BhY2thZ2UpIHsKLQkJLyogYWRkIF9fcGF0aF9fIHRvIHRoZSBtb2R1bGUgKmJlZm9yZSogdGhlIGNvZGUgZ2V0cwotCQkgICBleGVjdXRlZCAqLwotCQlQeU9iamVjdCAqcGtncGF0aCwgKmZ1bGxwYXRoOwotCQljaGFyICpwcmVmaXggPSBQeVN0cmluZ19Bc1N0cmluZyhzZWxmLT5wcmVmaXgpOwotCQljaGFyICpzdWJuYW1lID0gZ2V0X3N1Ym5hbWUoZnVsbG5hbWUpOwotCQlpbnQgZXJyOworICAgIGlmIChpc3BhY2thZ2UpIHsKKyAgICAgICAgLyogYWRkIF9fcGF0aF9fIHRvIHRoZSBtb2R1bGUgKmJlZm9yZSogdGhlIGNvZGUgZ2V0cworICAgICAgICAgICBleGVjdXRlZCAqLworICAgICAgICBQeU9iamVjdCAqcGtncGF0aCwgKmZ1bGxwYXRoOworICAgICAgICBjaGFyICpwcmVmaXggPSBQeVN0cmluZ19Bc1N0cmluZyhzZWxmLT5wcmVmaXgpOworICAgICAgICBjaGFyICpzdWJuYW1lID0gZ2V0X3N1Ym5hbWUoZnVsbG5hbWUpOworICAgICAgICBpbnQgZXJyOwogCi0JCWZ1bGxwYXRoID0gUHlTdHJpbmdfRnJvbUZvcm1hdCgiJXMlYyVzJXMiLAotCQkJCQlQeVN0cmluZ19Bc1N0cmluZyhzZWxmLT5hcmNoaXZlKSwKLQkJCQkJU0VQLAotCQkJCQkqcHJlZml4ID8gcHJlZml4IDogIiIsCi0JCQkJCXN1Ym5hbWUpOwotCQlpZiAoZnVsbHBhdGggPT0gTlVMTCkKLQkJCWdvdG8gZXJyb3I7CisgICAgICAgIGZ1bGxwYXRoID0gUHlTdHJpbmdfRnJvbUZvcm1hdCgiJXMlYyVzJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19Bc1N0cmluZyhzZWxmLT5hcmNoaXZlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHJlZml4ID8gcHJlZml4IDogIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Ym5hbWUpOworICAgICAgICBpZiAoZnVsbHBhdGggPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAKLQkJcGtncGF0aCA9IFB5X0J1aWxkVmFsdWUoIltPXSIsIGZ1bGxwYXRoKTsKLQkJUHlfREVDUkVGKGZ1bGxwYXRoKTsKLQkJaWYgKHBrZ3BhdGggPT0gTlVMTCkKLQkJCWdvdG8gZXJyb3I7Ci0JCWVyciA9IFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsICJfX3BhdGhfXyIsIHBrZ3BhdGgpOwotCQlQeV9ERUNSRUYocGtncGF0aCk7Ci0JCWlmIChlcnIgIT0gMCkKLQkJCWdvdG8gZXJyb3I7Ci0JfQotCW1vZCA9IFB5SW1wb3J0X0V4ZWNDb2RlTW9kdWxlRXgoZnVsbG5hbWUsIGNvZGUsIG1vZHBhdGgpOwotCVB5X0RFQ1JFRihjb2RlKTsKLQlpZiAoUHlfVmVyYm9zZUZsYWcpCi0JCVB5U3lzX1dyaXRlU3RkZXJyKCJpbXBvcnQgJXMgIyBsb2FkZWQgZnJvbSBaaXAgJXNcbiIsCi0JCQkJICBmdWxsbmFtZSwgbW9kcGF0aCk7Ci0JcmV0dXJuIG1vZDsKKyAgICAgICAgcGtncGF0aCA9IFB5X0J1aWxkVmFsdWUoIltPXSIsIGZ1bGxwYXRoKTsKKyAgICAgICAgUHlfREVDUkVGKGZ1bGxwYXRoKTsKKyAgICAgICAgaWYgKHBrZ3BhdGggPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIGVyciA9IFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsICJfX3BhdGhfXyIsIHBrZ3BhdGgpOworICAgICAgICBQeV9ERUNSRUYocGtncGF0aCk7CisgICAgICAgIGlmIChlcnIgIT0gMCkKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorICAgIG1vZCA9IFB5SW1wb3J0X0V4ZWNDb2RlTW9kdWxlRXgoZnVsbG5hbWUsIGNvZGUsIG1vZHBhdGgpOworICAgIFB5X0RFQ1JFRihjb2RlKTsKKyAgICBpZiAoUHlfVmVyYm9zZUZsYWcpCisgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCJpbXBvcnQgJXMgIyBsb2FkZWQgZnJvbSBaaXAgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGxuYW1lLCBtb2RwYXRoKTsKKyAgICByZXR1cm4gbW9kOwogZXJyb3I6Ci0JUHlfREVDUkVGKGNvZGUpOwotCVB5X0RFQ1JFRihtb2QpOwotCXJldHVybiBOVUxMOworICAgIFB5X0RFQ1JFRihjb2RlKTsKKyAgICBQeV9ERUNSRUYobW9kKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogLyogUmV0dXJuIGEgc3RyaW5nIG1hdGNoaW5nIF9fZmlsZV9fIGZvciB0aGUgbmFtZWQgbW9kdWxlICovCkBAIC0zODAsMTMgKzM4MCwxMyBAQAogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOnppcGltcG9ydGVyLl9nZXRfZmlsZW5hbWUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICZmdWxsbmFtZSkpCi0gICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBOVUxMOwogCiAgICAgLyogRGVjaWRpbmcgdGhlIGZpbGVuYW1lIHJlcXVpcmVzIHdvcmtpbmcgb3V0IHdoZXJlIHRoZSBjb2RlCiAgICAgICAgd291bGQgY29tZSBmcm9tIGlmIHRoZSBtb2R1bGUgd2FzIGFjdHVhbGx5IGxvYWRlZCAqLwogICAgIGNvZGUgPSBnZXRfbW9kdWxlX2NvZGUoc2VsZiwgZnVsbG5hbWUsICZpc3BhY2thZ2UsICZtb2RwYXRoKTsKICAgICBpZiAoY29kZSA9PSBOVUxMKQotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gTlVMTDsKICAgICBQeV9ERUNSRUYoY29kZSk7IC8qIE9ubHkgbmVlZCB0aGUgcGF0aCBpbmZvICovCiAKICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhtb2RwYXRoKTsKQEAgLTM5NiwxMTggKzM5NiwxMTggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiB6aXBpbXBvcnRlcl9pc19wYWNrYWdlKFB5T2JqZWN0ICpvYmosIFB5T2JqZWN0ICphcmdzKQogewotCVppcEltcG9ydGVyICpzZWxmID0gKFppcEltcG9ydGVyICopb2JqOwotCWNoYXIgKmZ1bGxuYW1lOwotCWVudW0gemlfbW9kdWxlX2luZm8gbWk7CisgICAgWmlwSW1wb3J0ZXIgKnNlbGYgPSAoWmlwSW1wb3J0ZXIgKilvYmo7CisgICAgY2hhciAqZnVsbG5hbWU7CisgICAgZW51bSB6aV9tb2R1bGVfaW5mbyBtaTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczp6aXBpbXBvcnRlci5pc19wYWNrYWdlIiwKLQkJCSAgICAgICZmdWxsbmFtZSkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczp6aXBpbXBvcnRlci5pc19wYWNrYWdlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZ1bGxuYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQltaSA9IGdldF9tb2R1bGVfaW5mbyhzZWxmLCBmdWxsbmFtZSk7Ci0JaWYgKG1pID09IE1JX0VSUk9SKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAobWkgPT0gTUlfTk9UX0ZPVU5EKSB7Ci0JCVB5RXJyX0Zvcm1hdChaaXBJbXBvcnRFcnJvciwgImNhbid0IGZpbmQgbW9kdWxlICclLjIwMHMnIiwKLQkJCSAgICAgZnVsbG5hbWUpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZyhtaSA9PSBNSV9QQUNLQUdFKTsKKyAgICBtaSA9IGdldF9tb2R1bGVfaW5mbyhzZWxmLCBmdWxsbmFtZSk7CisgICAgaWYgKG1pID09IE1JX0VSUk9SKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAobWkgPT0gTUlfTk9UX0ZPVU5EKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChaaXBJbXBvcnRFcnJvciwgImNhbid0IGZpbmQgbW9kdWxlICclLjIwMHMnIiwKKyAgICAgICAgICAgICAgICAgICAgIGZ1bGxuYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcobWkgPT0gTUlfUEFDS0FHRSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB6aXBpbXBvcnRlcl9nZXRfZGF0YShQeU9iamVjdCAqb2JqLCBQeU9iamVjdCAqYXJncykKIHsKLQlaaXBJbXBvcnRlciAqc2VsZiA9IChaaXBJbXBvcnRlciAqKW9iajsKLQljaGFyICpwYXRoOworICAgIFppcEltcG9ydGVyICpzZWxmID0gKFppcEltcG9ydGVyICopb2JqOworICAgIGNoYXIgKnBhdGg7CiAjaWZkZWYgQUxUU0VQCi0JY2hhciAqcCwgYnVmW01BWFBBVEhMRU4gKyAxXTsKKyAgICBjaGFyICpwLCBidWZbTUFYUEFUSExFTiArIDFdOwogI2VuZGlmCi0JUHlPYmplY3QgKnRvY19lbnRyeTsKLQlQeV9zc2l6ZV90IGxlbjsKKyAgICBQeU9iamVjdCAqdG9jX2VudHJ5OworICAgIFB5X3NzaXplX3QgbGVuOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOnppcGltcG9ydGVyLmdldF9kYXRhIiwgJnBhdGgpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6emlwaW1wb3J0ZXIuZ2V0X2RhdGEiLCAmcGF0aCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCiAjaWZkZWYgQUxUU0VQCi0JaWYgKHN0cmxlbihwYXRoKSA+PSBNQVhQQVRITEVOKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhaaXBJbXBvcnRFcnJvciwgInBhdGggdG9vIGxvbmciKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXN0cmNweShidWYsIHBhdGgpOwotCWZvciAocCA9IGJ1ZjsgKnA7IHArKykgewotCQlpZiAoKnAgPT0gQUxUU0VQKQotCQkJKnAgPSBTRVA7Ci0JfQotCXBhdGggPSBidWY7CisgICAgaWYgKHN0cmxlbihwYXRoKSA+PSBNQVhQQVRITEVOKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhaaXBJbXBvcnRFcnJvciwgInBhdGggdG9vIGxvbmciKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHN0cmNweShidWYsIHBhdGgpOworICAgIGZvciAocCA9IGJ1ZjsgKnA7IHArKykgeworICAgICAgICBpZiAoKnAgPT0gQUxUU0VQKQorICAgICAgICAgICAgKnAgPSBTRVA7CisgICAgfQorICAgIHBhdGggPSBidWY7CiAjZW5kaWYKLQlsZW4gPSBQeVN0cmluZ19TaXplKHNlbGYtPmFyY2hpdmUpOwotCWlmICgoc2l6ZV90KWxlbiA8IHN0cmxlbihwYXRoKSAmJgotCSAgICBzdHJuY21wKHBhdGgsIFB5U3RyaW5nX0FzU3RyaW5nKHNlbGYtPmFyY2hpdmUpLCBsZW4pID09IDAgJiYKLQkgICAgcGF0aFtsZW5dID09IFNFUCkgewotCQlwYXRoID0gcGF0aCArIGxlbiArIDE7Ci0JfQorICAgIGxlbiA9IFB5U3RyaW5nX1NpemUoc2VsZi0+YXJjaGl2ZSk7CisgICAgaWYgKChzaXplX3QpbGVuIDwgc3RybGVuKHBhdGgpICYmCisgICAgICAgIHN0cm5jbXAocGF0aCwgUHlTdHJpbmdfQXNTdHJpbmcoc2VsZi0+YXJjaGl2ZSksIGxlbikgPT0gMCAmJgorICAgICAgICBwYXRoW2xlbl0gPT0gU0VQKSB7CisgICAgICAgIHBhdGggPSBwYXRoICsgbGVuICsgMTsKKyAgICB9CiAKLQl0b2NfZW50cnkgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhzZWxmLT5maWxlcywgcGF0aCk7Ci0JaWYgKHRvY19lbnRyeSA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldEZyb21FcnJub1dpdGhGaWxlbmFtZShQeUV4Y19JT0Vycm9yLCBwYXRoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBnZXRfZGF0YShQeVN0cmluZ19Bc1N0cmluZyhzZWxmLT5hcmNoaXZlKSwgdG9jX2VudHJ5KTsKKyAgICB0b2NfZW50cnkgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhzZWxmLT5maWxlcywgcGF0aCk7CisgICAgaWYgKHRvY19lbnRyeSA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldEZyb21FcnJub1dpdGhGaWxlbmFtZShQeUV4Y19JT0Vycm9yLCBwYXRoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBnZXRfZGF0YShQeVN0cmluZ19Bc1N0cmluZyhzZWxmLT5hcmNoaXZlKSwgdG9jX2VudHJ5KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHppcGltcG9ydGVyX2dldF9jb2RlKFB5T2JqZWN0ICpvYmosIFB5T2JqZWN0ICphcmdzKQogewotCVppcEltcG9ydGVyICpzZWxmID0gKFppcEltcG9ydGVyICopb2JqOwotCWNoYXIgKmZ1bGxuYW1lOworICAgIFppcEltcG9ydGVyICpzZWxmID0gKFppcEltcG9ydGVyICopb2JqOworICAgIGNoYXIgKmZ1bGxuYW1lOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOnppcGltcG9ydGVyLmdldF9jb2RlIiwgJmZ1bGxuYW1lKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOnppcGltcG9ydGVyLmdldF9jb2RlIiwgJmZ1bGxuYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlyZXR1cm4gZ2V0X21vZHVsZV9jb2RlKHNlbGYsIGZ1bGxuYW1lLCBOVUxMLCBOVUxMKTsKKyAgICByZXR1cm4gZ2V0X21vZHVsZV9jb2RlKHNlbGYsIGZ1bGxuYW1lLCBOVUxMLCBOVUxMKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHppcGltcG9ydGVyX2dldF9zb3VyY2UoUHlPYmplY3QgKm9iaiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JWmlwSW1wb3J0ZXIgKnNlbGYgPSAoWmlwSW1wb3J0ZXIgKilvYmo7Ci0JUHlPYmplY3QgKnRvY19lbnRyeTsKLQljaGFyICpmdWxsbmFtZSwgKnN1Ym5hbWUsIHBhdGhbTUFYUEFUSExFTisxXTsKLQlpbnQgbGVuOwotCWVudW0gemlfbW9kdWxlX2luZm8gbWk7CisgICAgWmlwSW1wb3J0ZXIgKnNlbGYgPSAoWmlwSW1wb3J0ZXIgKilvYmo7CisgICAgUHlPYmplY3QgKnRvY19lbnRyeTsKKyAgICBjaGFyICpmdWxsbmFtZSwgKnN1Ym5hbWUsIHBhdGhbTUFYUEFUSExFTisxXTsKKyAgICBpbnQgbGVuOworICAgIGVudW0gemlfbW9kdWxlX2luZm8gbWk7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6emlwaW1wb3J0ZXIuZ2V0X3NvdXJjZSIsICZmdWxsbmFtZSkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczp6aXBpbXBvcnRlci5nZXRfc291cmNlIiwgJmZ1bGxuYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQltaSA9IGdldF9tb2R1bGVfaW5mbyhzZWxmLCBmdWxsbmFtZSk7Ci0JaWYgKG1pID09IE1JX0VSUk9SKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAobWkgPT0gTUlfTk9UX0ZPVU5EKSB7Ci0JCVB5RXJyX0Zvcm1hdChaaXBJbXBvcnRFcnJvciwgImNhbid0IGZpbmQgbW9kdWxlICclLjIwMHMnIiwKLQkJCSAgICAgZnVsbG5hbWUpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0Jc3VibmFtZSA9IGdldF9zdWJuYW1lKGZ1bGxuYW1lKTsKKyAgICBtaSA9IGdldF9tb2R1bGVfaW5mbyhzZWxmLCBmdWxsbmFtZSk7CisgICAgaWYgKG1pID09IE1JX0VSUk9SKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAobWkgPT0gTUlfTk9UX0ZPVU5EKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChaaXBJbXBvcnRFcnJvciwgImNhbid0IGZpbmQgbW9kdWxlICclLjIwMHMnIiwKKyAgICAgICAgICAgICAgICAgICAgIGZ1bGxuYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHN1Ym5hbWUgPSBnZXRfc3VibmFtZShmdWxsbmFtZSk7CiAKLQlsZW4gPSBtYWtlX2ZpbGVuYW1lKFB5U3RyaW5nX0FzU3RyaW5nKHNlbGYtPnByZWZpeCksIHN1Ym5hbWUsIHBhdGgpOwotCWlmIChsZW4gPCAwKQotCQlyZXR1cm4gTlVMTDsKKyAgICBsZW4gPSBtYWtlX2ZpbGVuYW1lKFB5U3RyaW5nX0FzU3RyaW5nKHNlbGYtPnByZWZpeCksIHN1Ym5hbWUsIHBhdGgpOworICAgIGlmIChsZW4gPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChtaSA9PSBNSV9QQUNLQUdFKSB7Ci0JCXBhdGhbbGVuXSA9IFNFUDsKLQkJc3RyY3B5KHBhdGggKyBsZW4gKyAxLCAiX19pbml0X18ucHkiKTsKLQl9Ci0JZWxzZQotCQlzdHJjcHkocGF0aCArIGxlbiwgIi5weSIpOworICAgIGlmIChtaSA9PSBNSV9QQUNLQUdFKSB7CisgICAgICAgIHBhdGhbbGVuXSA9IFNFUDsKKyAgICAgICAgc3RyY3B5KHBhdGggKyBsZW4gKyAxLCAiX19pbml0X18ucHkiKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBzdHJjcHkocGF0aCArIGxlbiwgIi5weSIpOwogCi0JdG9jX2VudHJ5ID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoc2VsZi0+ZmlsZXMsIHBhdGgpOwotCWlmICh0b2NfZW50cnkgIT0gTlVMTCkKLQkJcmV0dXJuIGdldF9kYXRhKFB5U3RyaW5nX0FzU3RyaW5nKHNlbGYtPmFyY2hpdmUpLCB0b2NfZW50cnkpOworICAgIHRvY19lbnRyeSA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKHNlbGYtPmZpbGVzLCBwYXRoKTsKKyAgICBpZiAodG9jX2VudHJ5ICE9IE5VTEwpCisgICAgICAgIHJldHVybiBnZXRfZGF0YShQeVN0cmluZ19Bc1N0cmluZyhzZWxmLT5hcmNoaXZlKSwgdG9jX2VudHJ5KTsKIAotCS8qIHdlIGhhdmUgdGhlIG1vZHVsZSwgYnV0IG5vIHNvdXJjZSAqLwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICAvKiB3ZSBoYXZlIHRoZSBtb2R1bGUsIGJ1dCBubyBzb3VyY2UgKi8KKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIFB5RG9jX1NUUlZBUihkb2NfZmluZF9tb2R1bGUsCkBAIC01NTgsMjggKzU1OCwyOCBAQAogUmV0dXJuIHRoZSBmaWxlbmFtZSBmb3IgdGhlIHNwZWNpZmllZCBtb2R1bGUuIik7CiAKIHN0YXRpYyBQeU1ldGhvZERlZiB6aXBpbXBvcnRlcl9tZXRob2RzW10gPSB7Ci0JeyJmaW5kX21vZHVsZSIsIHppcGltcG9ydGVyX2ZpbmRfbW9kdWxlLCBNRVRIX1ZBUkFSR1MsCi0JIGRvY19maW5kX21vZHVsZX0sCi0JeyJsb2FkX21vZHVsZSIsIHppcGltcG9ydGVyX2xvYWRfbW9kdWxlLCBNRVRIX1ZBUkFSR1MsCi0JIGRvY19sb2FkX21vZHVsZX0sCi0JeyJnZXRfZGF0YSIsIHppcGltcG9ydGVyX2dldF9kYXRhLCBNRVRIX1ZBUkFSR1MsCi0JIGRvY19nZXRfZGF0YX0sCi0JeyJnZXRfY29kZSIsIHppcGltcG9ydGVyX2dldF9jb2RlLCBNRVRIX1ZBUkFSR1MsCi0JIGRvY19nZXRfY29kZX0sCi0JeyJnZXRfc291cmNlIiwgemlwaW1wb3J0ZXJfZ2V0X3NvdXJjZSwgTUVUSF9WQVJBUkdTLAotCSBkb2NfZ2V0X3NvdXJjZX0sCi0JeyJfZ2V0X2ZpbGVuYW1lIiwgemlwaW1wb3J0ZXJfZ2V0X2ZpbGVuYW1lLCBNRVRIX1ZBUkFSR1MsCi0JIGRvY19nZXRfZmlsZW5hbWV9LAotCXsiaXNfcGFja2FnZSIsIHppcGltcG9ydGVyX2lzX3BhY2thZ2UsIE1FVEhfVkFSQVJHUywKLQkgZG9jX2lzX3BhY2thZ2V9LAotCXtOVUxMLAkJTlVMTH0JLyogc2VudGluZWwgKi8KKyAgICB7ImZpbmRfbW9kdWxlIiwgemlwaW1wb3J0ZXJfZmluZF9tb2R1bGUsIE1FVEhfVkFSQVJHUywKKyAgICAgZG9jX2ZpbmRfbW9kdWxlfSwKKyAgICB7ImxvYWRfbW9kdWxlIiwgemlwaW1wb3J0ZXJfbG9hZF9tb2R1bGUsIE1FVEhfVkFSQVJHUywKKyAgICAgZG9jX2xvYWRfbW9kdWxlfSwKKyAgICB7ImdldF9kYXRhIiwgemlwaW1wb3J0ZXJfZ2V0X2RhdGEsIE1FVEhfVkFSQVJHUywKKyAgICAgZG9jX2dldF9kYXRhfSwKKyAgICB7ImdldF9jb2RlIiwgemlwaW1wb3J0ZXJfZ2V0X2NvZGUsIE1FVEhfVkFSQVJHUywKKyAgICAgZG9jX2dldF9jb2RlfSwKKyAgICB7ImdldF9zb3VyY2UiLCB6aXBpbXBvcnRlcl9nZXRfc291cmNlLCBNRVRIX1ZBUkFSR1MsCisgICAgIGRvY19nZXRfc291cmNlfSwKKyAgICB7Il9nZXRfZmlsZW5hbWUiLCB6aXBpbXBvcnRlcl9nZXRfZmlsZW5hbWUsIE1FVEhfVkFSQVJHUywKKyAgICAgZG9jX2dldF9maWxlbmFtZX0sCisgICAgeyJpc19wYWNrYWdlIiwgemlwaW1wb3J0ZXJfaXNfcGFja2FnZSwgTUVUSF9WQVJBUkdTLAorICAgICBkb2NfaXNfcGFja2FnZX0sCisgICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSAgIC8qIHNlbnRpbmVsICovCiB9OwogCiBzdGF0aWMgUHlNZW1iZXJEZWYgemlwaW1wb3J0ZXJfbWVtYmVyc1tdID0gewotCXsiYXJjaGl2ZSIsICBUX09CSkVDVCwgb2Zmc2V0b2YoWmlwSW1wb3J0ZXIsIGFyY2hpdmUpLCAgUkVBRE9OTFl9LAotCXsicHJlZml4IiwgICBUX09CSkVDVCwgb2Zmc2V0b2YoWmlwSW1wb3J0ZXIsIHByZWZpeCksICAgUkVBRE9OTFl9LAotCXsiX2ZpbGVzIiwgICBUX09CSkVDVCwgb2Zmc2V0b2YoWmlwSW1wb3J0ZXIsIGZpbGVzKSwgICAgUkVBRE9OTFl9LAotCXtOVUxMfQorICAgIHsiYXJjaGl2ZSIsICBUX09CSkVDVCwgb2Zmc2V0b2YoWmlwSW1wb3J0ZXIsIGFyY2hpdmUpLCAgUkVBRE9OTFl9LAorICAgIHsicHJlZml4IiwgICBUX09CSkVDVCwgb2Zmc2V0b2YoWmlwSW1wb3J0ZXIsIHByZWZpeCksICAgUkVBRE9OTFl9LAorICAgIHsiX2ZpbGVzIiwgICBUX09CSkVDVCwgb2Zmc2V0b2YoWmlwSW1wb3J0ZXIsIGZpbGVzKSwgICAgUkVBRE9OTFl9LAorICAgIHtOVUxMfQogfTsKIAogUHlEb2NfU1RSVkFSKHppcGltcG9ydGVyX2RvYywKQEAgLTU5OSw0NiArNTk5LDQ2IEBACiAjZGVmaW5lIERFRkVSUkVEX0FERFJFU1MoQUREUikgMAogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IFppcEltcG9ydGVyX1R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKERFRkVSUkVEX0FERFJFU1MoJlB5VHlwZV9UeXBlKSwgMCkKLQkiemlwaW1wb3J0LnppcGltcG9ydGVyIiwKLQlzaXplb2YoWmlwSW1wb3J0ZXIpLAotCTAsCQkJCQkvKiB0cF9pdGVtc2l6ZSAqLwotCShkZXN0cnVjdG9yKXppcGltcG9ydGVyX2RlYWxsb2MsCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkocmVwcmZ1bmMpemlwaW1wb3J0ZXJfcmVwciwJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19CQVNFVFlQRSB8Ci0JCVB5X1RQRkxBR1NfSEFWRV9HQywJCS8qIHRwX2ZsYWdzICovCi0JemlwaW1wb3J0ZXJfZG9jLAkJCS8qIHRwX2RvYyAqLwotCXppcGltcG9ydGVyX3RyYXZlcnNlLAkJCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkJLyogdHBfaXRlcm5leHQgKi8KLQl6aXBpbXBvcnRlcl9tZXRob2RzLAkJCS8qIHRwX21ldGhvZHMgKi8KLQl6aXBpbXBvcnRlcl9tZW1iZXJzLAkJCS8qIHRwX21lbWJlcnMgKi8KLQkwLAkJCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQkoaW5pdHByb2MpemlwaW1wb3J0ZXJfaW5pdCwJCS8qIHRwX2luaXQgKi8KLQlQeVR5cGVfR2VuZXJpY0FsbG9jLAkJCS8qIHRwX2FsbG9jICovCi0JUHlUeXBlX0dlbmVyaWNOZXcsCQkJLyogdHBfbmV3ICovCi0JUHlPYmplY3RfR0NfRGVsLAkJCS8qIHRwX2ZyZWUgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoREVGRVJSRURfQUREUkVTUygmUHlUeXBlX1R5cGUpLCAwKQorICAgICJ6aXBpbXBvcnQuemlwaW1wb3J0ZXIiLAorICAgIHNpemVvZihaaXBJbXBvcnRlciksCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIChkZXN0cnVjdG9yKXppcGltcG9ydGVyX2RlYWxsb2MsICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAocmVwcmZ1bmMpemlwaW1wb3J0ZXJfcmVwciwgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFIHwKKyAgICAgICAgUHlfVFBGTEFHU19IQVZFX0dDLCAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCisgICAgemlwaW1wb3J0ZXJfZG9jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICB6aXBpbXBvcnRlcl90cmF2ZXJzZSwgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIHppcGltcG9ydGVyX21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIHppcGltcG9ydGVyX21lbWJlcnMsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIChpbml0cHJvYyl6aXBpbXBvcnRlcl9pbml0LCAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIFB5VHlwZV9HZW5lcmljQWxsb2MsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBQeVR5cGVfR2VuZXJpY05ldywgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworICAgIFB5T2JqZWN0X0dDX0RlbCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKIAogCkBAIC02NDksMTYgKzY0OSwxNiBAQAogICAgbWFyc2hhbC5jOnJfbG9uZygpICovCiBzdGF0aWMgbG9uZwogZ2V0X2xvbmcodW5zaWduZWQgY2hhciAqYnVmKSB7Ci0JbG9uZyB4OwotCXggPSAgYnVmWzBdOwotCXggfD0gKGxvbmcpYnVmWzFdIDw8ICA4OwotCXggfD0gKGxvbmcpYnVmWzJdIDw8IDE2OwotCXggfD0gKGxvbmcpYnVmWzNdIDw8IDI0OworICAgIGxvbmcgeDsKKyAgICB4ID0gIGJ1ZlswXTsKKyAgICB4IHw9IChsb25nKWJ1ZlsxXSA8PCAgODsKKyAgICB4IHw9IChsb25nKWJ1ZlsyXSA8PCAxNjsKKyAgICB4IHw9IChsb25nKWJ1ZlszXSA8PCAyNDsKICNpZiBTSVpFT0ZfTE9ORyA+IDQKLQkvKiBTaWduIGV4dGVuc2lvbiBmb3IgNjQtYml0IG1hY2hpbmVzICovCi0JeCB8PSAtKHggJiAweDgwMDAwMDAwTCk7CisgICAgLyogU2lnbiBleHRlbnNpb24gZm9yIDY0LWJpdCBtYWNoaW5lcyAqLworICAgIHggfD0gLSh4ICYgMHg4MDAwMDAwMEwpOwogI2VuZGlmCi0JcmV0dXJuIHg7CisgICAgcmV0dXJuIHg7CiB9CiAKIC8qCkBAIC02NzAsMTMgKzY3MCwxMyBAQAogICAgQSB0b2NfZW50cnkgaXMgYSB0dXBsZToKIAogICAgICAgIChfX2ZpbGVfXywgICAgICAjIHZhbHVlIHRvIHVzZSBmb3IgX19maWxlX18sIGF2YWlsYWJsZSBmb3IgYWxsIGZpbGVzCi0gICAgICAgIGNvbXByZXNzLCAgICAgICMgY29tcHJlc3Npb24ga2luZDsgMCBmb3IgdW5jb21wcmVzc2VkCi0gICAgICAgIGRhdGFfc2l6ZSwgICAgICMgc2l6ZSBvZiBjb21wcmVzc2VkIGRhdGEgb24gZGlzawotICAgICAgICBmaWxlX3NpemUsICAgICAjIHNpemUgb2YgZGVjb21wcmVzc2VkIGRhdGEKLSAgICAgICAgZmlsZV9vZmZzZXQsICAgIyBvZmZzZXQgb2YgZmlsZSBoZWFkZXIgZnJvbSBzdGFydCBvZiBhcmNoaXZlCi0gICAgICAgIHRpbWUsICAgICAgICAgICMgbW9kIHRpbWUgb2YgZmlsZSAoaW4gZG9zIGZvcm1hdCkKLSAgICAgICAgZGF0ZSwgICAgICAgICAgIyBtb2QgZGF0YSBvZiBmaWxlIChpbiBkb3MgZm9ybWF0KQotICAgICAgICBjcmMsICAgICAgICAgICAjIGNyYyBjaGVja3N1bSBvZiB0aGUgZGF0YQorICAgIGNvbXByZXNzLCAgICAgICMgY29tcHJlc3Npb24ga2luZDsgMCBmb3IgdW5jb21wcmVzc2VkCisgICAgZGF0YV9zaXplLCAgICAgIyBzaXplIG9mIGNvbXByZXNzZWQgZGF0YSBvbiBkaXNrCisgICAgZmlsZV9zaXplLCAgICAgIyBzaXplIG9mIGRlY29tcHJlc3NlZCBkYXRhCisgICAgZmlsZV9vZmZzZXQsICAgIyBvZmZzZXQgb2YgZmlsZSBoZWFkZXIgZnJvbSBzdGFydCBvZiBhcmNoaXZlCisgICAgdGltZSwgICAgICAgICAgIyBtb2QgdGltZSBvZiBmaWxlIChpbiBkb3MgZm9ybWF0KQorICAgIGRhdGUsICAgICAgICAgICMgbW9kIGRhdGEgb2YgZmlsZSAoaW4gZG9zIGZvcm1hdCkKKyAgICBjcmMsICAgICAgICAgICAjIGNyYyBjaGVja3N1bSBvZiB0aGUgZGF0YQogICAgICAgICkKIAogICAgRGlyZWN0b3JpZXMgY2FuIGJlIHJlY29nbml6ZWQgYnkgdGhlIHRyYWlsaW5nIFNFUCBpbiB0aGUgbmFtZSwKQEAgLTY4NSwxMTUgKzY4NSwxMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiByZWFkX2RpcmVjdG9yeShjaGFyICphcmNoaXZlKQogewotCVB5T2JqZWN0ICpmaWxlcyA9IE5VTEw7Ci0JRklMRSAqZnA7Ci0JbG9uZyBjb21wcmVzcywgY3JjLCBkYXRhX3NpemUsIGZpbGVfc2l6ZSwgZmlsZV9vZmZzZXQsIGRhdGUsIHRpbWU7Ci0JbG9uZyBoZWFkZXJfb2Zmc2V0LCBuYW1lX3NpemUsIGhlYWRlcl9zaXplLCBoZWFkZXJfcG9zaXRpb247Ci0JbG9uZyBpLCBsLCBjb3VudDsKLQlzaXplX3QgbGVuZ3RoOwotCWNoYXIgcGF0aFtNQVhQQVRITEVOICsgNV07Ci0JY2hhciBuYW1lW01BWFBBVEhMRU4gKyA1XTsKLQljaGFyICpwLCBlbmRvZl9jZW50cmFsX2RpclsyMl07Ci0JbG9uZyBhcmNfb2Zmc2V0OyAvKiBvZmZzZXQgZnJvbSBiZWdpbm5pbmcgb2YgZmlsZSB0byBzdGFydCBvZiB6aXAtYXJjaGl2ZSAqLworICAgIFB5T2JqZWN0ICpmaWxlcyA9IE5VTEw7CisgICAgRklMRSAqZnA7CisgICAgbG9uZyBjb21wcmVzcywgY3JjLCBkYXRhX3NpemUsIGZpbGVfc2l6ZSwgZmlsZV9vZmZzZXQsIGRhdGUsIHRpbWU7CisgICAgbG9uZyBoZWFkZXJfb2Zmc2V0LCBuYW1lX3NpemUsIGhlYWRlcl9zaXplLCBoZWFkZXJfcG9zaXRpb247CisgICAgbG9uZyBpLCBsLCBjb3VudDsKKyAgICBzaXplX3QgbGVuZ3RoOworICAgIGNoYXIgcGF0aFtNQVhQQVRITEVOICsgNV07CisgICAgY2hhciBuYW1lW01BWFBBVEhMRU4gKyA1XTsKKyAgICBjaGFyICpwLCBlbmRvZl9jZW50cmFsX2RpclsyMl07CisgICAgbG9uZyBhcmNfb2Zmc2V0OyAvKiBvZmZzZXQgZnJvbSBiZWdpbm5pbmcgb2YgZmlsZSB0byBzdGFydCBvZiB6aXAtYXJjaGl2ZSAqLwogCi0JaWYgKHN0cmxlbihhcmNoaXZlKSA+IE1BWFBBVEhMRU4pIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0JCQkJIlppcCBwYXRoIG5hbWUgaXMgdG9vIGxvbmciKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXN0cmNweShwYXRoLCBhcmNoaXZlKTsKKyAgICBpZiAoc3RybGVuKGFyY2hpdmUpID4gTUFYUEFUSExFTikgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJaaXAgcGF0aCBuYW1lIGlzIHRvbyBsb25nIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBzdHJjcHkocGF0aCwgYXJjaGl2ZSk7CiAKLQlmcCA9IGZvcGVuKGFyY2hpdmUsICJyYiIpOwotCWlmIChmcCA9PSBOVUxMKSB7Ci0JCVB5RXJyX0Zvcm1hdChaaXBJbXBvcnRFcnJvciwgImNhbid0IG9wZW4gWmlwIGZpbGU6ICIKLQkJCSAgICAgIiclLjIwMHMnIiwgYXJjaGl2ZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlmc2VlayhmcCwgLTIyLCBTRUVLX0VORCk7Ci0JaGVhZGVyX3Bvc2l0aW9uID0gZnRlbGwoZnApOwotCWlmIChmcmVhZChlbmRvZl9jZW50cmFsX2RpciwgMSwgMjIsIGZwKSAhPSAyMikgewotCQlmY2xvc2UoZnApOwotCQlQeUVycl9Gb3JtYXQoWmlwSW1wb3J0RXJyb3IsICJjYW4ndCByZWFkIFppcCBmaWxlOiAiCi0JCQkgICAgICInJS4yMDBzJyIsIGFyY2hpdmUpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKGdldF9sb25nKCh1bnNpZ25lZCBjaGFyICopZW5kb2ZfY2VudHJhbF9kaXIpICE9IDB4MDYwNTRCNTApIHsKLQkJLyogQmFkOiBFbmQgb2YgQ2VudHJhbCBEaXIgc2lnbmF0dXJlICovCi0JCWZjbG9zZShmcCk7Ci0JCVB5RXJyX0Zvcm1hdChaaXBJbXBvcnRFcnJvciwgIm5vdCBhIFppcCBmaWxlOiAiCi0JCQkgICAgICInJS4yMDBzJyIsIGFyY2hpdmUpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgZnAgPSBmb3BlbihhcmNoaXZlLCAicmIiKTsKKyAgICBpZiAoZnAgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9Gb3JtYXQoWmlwSW1wb3J0RXJyb3IsICJjYW4ndCBvcGVuIFppcCBmaWxlOiAiCisgICAgICAgICAgICAgICAgICAgICAiJyUuMjAwcyciLCBhcmNoaXZlKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGZzZWVrKGZwLCAtMjIsIFNFRUtfRU5EKTsKKyAgICBoZWFkZXJfcG9zaXRpb24gPSBmdGVsbChmcCk7CisgICAgaWYgKGZyZWFkKGVuZG9mX2NlbnRyYWxfZGlyLCAxLCAyMiwgZnApICE9IDIyKSB7CisgICAgICAgIGZjbG9zZShmcCk7CisgICAgICAgIFB5RXJyX0Zvcm1hdChaaXBJbXBvcnRFcnJvciwgImNhbid0IHJlYWQgWmlwIGZpbGU6ICIKKyAgICAgICAgICAgICAgICAgICAgICInJS4yMDBzJyIsIGFyY2hpdmUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKGdldF9sb25nKCh1bnNpZ25lZCBjaGFyICopZW5kb2ZfY2VudHJhbF9kaXIpICE9IDB4MDYwNTRCNTApIHsKKyAgICAgICAgLyogQmFkOiBFbmQgb2YgQ2VudHJhbCBEaXIgc2lnbmF0dXJlICovCisgICAgICAgIGZjbG9zZShmcCk7CisgICAgICAgIFB5RXJyX0Zvcm1hdChaaXBJbXBvcnRFcnJvciwgIm5vdCBhIFppcCBmaWxlOiAiCisgICAgICAgICAgICAgICAgICAgICAiJyUuMjAwcyciLCBhcmNoaXZlKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaGVhZGVyX3NpemUgPSBnZXRfbG9uZygodW5zaWduZWQgY2hhciAqKWVuZG9mX2NlbnRyYWxfZGlyICsgMTIpOwotCWhlYWRlcl9vZmZzZXQgPSBnZXRfbG9uZygodW5zaWduZWQgY2hhciAqKWVuZG9mX2NlbnRyYWxfZGlyICsgMTYpOwotCWFyY19vZmZzZXQgPSBoZWFkZXJfcG9zaXRpb24gLSBoZWFkZXJfb2Zmc2V0IC0gaGVhZGVyX3NpemU7Ci0JaGVhZGVyX29mZnNldCArPSBhcmNfb2Zmc2V0OworICAgIGhlYWRlcl9zaXplID0gZ2V0X2xvbmcoKHVuc2lnbmVkIGNoYXIgKillbmRvZl9jZW50cmFsX2RpciArIDEyKTsKKyAgICBoZWFkZXJfb2Zmc2V0ID0gZ2V0X2xvbmcoKHVuc2lnbmVkIGNoYXIgKillbmRvZl9jZW50cmFsX2RpciArIDE2KTsKKyAgICBhcmNfb2Zmc2V0ID0gaGVhZGVyX3Bvc2l0aW9uIC0gaGVhZGVyX29mZnNldCAtIGhlYWRlcl9zaXplOworICAgIGhlYWRlcl9vZmZzZXQgKz0gYXJjX29mZnNldDsKIAotCWZpbGVzID0gUHlEaWN0X05ldygpOwotCWlmIChmaWxlcyA9PSBOVUxMKQotCQlnb3RvIGVycm9yOworICAgIGZpbGVzID0gUHlEaWN0X05ldygpOworICAgIGlmIChmaWxlcyA9PSBOVUxMKQorICAgICAgICBnb3RvIGVycm9yOwogCi0JbGVuZ3RoID0gKGxvbmcpc3RybGVuKHBhdGgpOwotCXBhdGhbbGVuZ3RoXSA9IFNFUDsKKyAgICBsZW5ndGggPSAobG9uZylzdHJsZW4ocGF0aCk7CisgICAgcGF0aFtsZW5ndGhdID0gU0VQOwogCi0JLyogU3RhcnQgb2YgQ2VudHJhbCBEaXJlY3RvcnkgKi8KLQljb3VudCA9IDA7Ci0JZm9yICg7OykgewotCQlQeU9iamVjdCAqdDsKLQkJaW50IGVycjsKKyAgICAvKiBTdGFydCBvZiBDZW50cmFsIERpcmVjdG9yeSAqLworICAgIGNvdW50ID0gMDsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIFB5T2JqZWN0ICp0OworICAgICAgICBpbnQgZXJyOwogCi0JCWZzZWVrKGZwLCBoZWFkZXJfb2Zmc2V0LCAwKTsgIC8qIFN0YXJ0IG9mIGZpbGUgaGVhZGVyICovCi0JCWwgPSBQeU1hcnNoYWxfUmVhZExvbmdGcm9tRmlsZShmcCk7Ci0JCWlmIChsICE9IDB4MDIwMTRCNTApCi0JCQlicmVhazsJLyogQmFkOiBDZW50cmFsIERpciBGaWxlIEhlYWRlciAqLwotCQlmc2VlayhmcCwgaGVhZGVyX29mZnNldCArIDEwLCAwKTsKLQkJY29tcHJlc3MgPSBQeU1hcnNoYWxfUmVhZFNob3J0RnJvbUZpbGUoZnApOwotCQl0aW1lID0gUHlNYXJzaGFsX1JlYWRTaG9ydEZyb21GaWxlKGZwKTsKLQkJZGF0ZSA9IFB5TWFyc2hhbF9SZWFkU2hvcnRGcm9tRmlsZShmcCk7Ci0JCWNyYyA9IFB5TWFyc2hhbF9SZWFkTG9uZ0Zyb21GaWxlKGZwKTsKLQkJZGF0YV9zaXplID0gUHlNYXJzaGFsX1JlYWRMb25nRnJvbUZpbGUoZnApOwotCQlmaWxlX3NpemUgPSBQeU1hcnNoYWxfUmVhZExvbmdGcm9tRmlsZShmcCk7Ci0JCW5hbWVfc2l6ZSA9IFB5TWFyc2hhbF9SZWFkU2hvcnRGcm9tRmlsZShmcCk7Ci0JCWhlYWRlcl9zaXplID0gNDYgKyBuYW1lX3NpemUgKwotCQkgICBQeU1hcnNoYWxfUmVhZFNob3J0RnJvbUZpbGUoZnApICsKLQkJICAgUHlNYXJzaGFsX1JlYWRTaG9ydEZyb21GaWxlKGZwKTsKLQkJZnNlZWsoZnAsIGhlYWRlcl9vZmZzZXQgKyA0MiwgMCk7Ci0JCWZpbGVfb2Zmc2V0ID0gUHlNYXJzaGFsX1JlYWRMb25nRnJvbUZpbGUoZnApICsgYXJjX29mZnNldDsKLQkJaWYgKG5hbWVfc2l6ZSA+IE1BWFBBVEhMRU4pCi0JCQluYW1lX3NpemUgPSBNQVhQQVRITEVOOworICAgICAgICBmc2VlayhmcCwgaGVhZGVyX29mZnNldCwgMCk7ICAvKiBTdGFydCBvZiBmaWxlIGhlYWRlciAqLworICAgICAgICBsID0gUHlNYXJzaGFsX1JlYWRMb25nRnJvbUZpbGUoZnApOworICAgICAgICBpZiAobCAhPSAweDAyMDE0QjUwKQorICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAvKiBCYWQ6IENlbnRyYWwgRGlyIEZpbGUgSGVhZGVyICovCisgICAgICAgIGZzZWVrKGZwLCBoZWFkZXJfb2Zmc2V0ICsgMTAsIDApOworICAgICAgICBjb21wcmVzcyA9IFB5TWFyc2hhbF9SZWFkU2hvcnRGcm9tRmlsZShmcCk7CisgICAgICAgIHRpbWUgPSBQeU1hcnNoYWxfUmVhZFNob3J0RnJvbUZpbGUoZnApOworICAgICAgICBkYXRlID0gUHlNYXJzaGFsX1JlYWRTaG9ydEZyb21GaWxlKGZwKTsKKyAgICAgICAgY3JjID0gUHlNYXJzaGFsX1JlYWRMb25nRnJvbUZpbGUoZnApOworICAgICAgICBkYXRhX3NpemUgPSBQeU1hcnNoYWxfUmVhZExvbmdGcm9tRmlsZShmcCk7CisgICAgICAgIGZpbGVfc2l6ZSA9IFB5TWFyc2hhbF9SZWFkTG9uZ0Zyb21GaWxlKGZwKTsKKyAgICAgICAgbmFtZV9zaXplID0gUHlNYXJzaGFsX1JlYWRTaG9ydEZyb21GaWxlKGZwKTsKKyAgICAgICAgaGVhZGVyX3NpemUgPSA0NiArIG5hbWVfc2l6ZSArCisgICAgICAgICAgIFB5TWFyc2hhbF9SZWFkU2hvcnRGcm9tRmlsZShmcCkgKworICAgICAgICAgICBQeU1hcnNoYWxfUmVhZFNob3J0RnJvbUZpbGUoZnApOworICAgICAgICBmc2VlayhmcCwgaGVhZGVyX29mZnNldCArIDQyLCAwKTsKKyAgICAgICAgZmlsZV9vZmZzZXQgPSBQeU1hcnNoYWxfUmVhZExvbmdGcm9tRmlsZShmcCkgKyBhcmNfb2Zmc2V0OworICAgICAgICBpZiAobmFtZV9zaXplID4gTUFYUEFUSExFTikKKyAgICAgICAgICAgIG5hbWVfc2l6ZSA9IE1BWFBBVEhMRU47CiAKLQkJcCA9IG5hbWU7Ci0JCWZvciAoaSA9IDA7IGkgPCBuYW1lX3NpemU7IGkrKykgewotCQkJKnAgPSAoY2hhcilnZXRjKGZwKTsKLQkJCWlmICgqcCA9PSAnLycpCi0JCQkJKnAgPSBTRVA7Ci0JCQlwKys7Ci0JCX0KLQkJKnAgPSAwOwkvKiBBZGQgdGVybWluYXRpbmcgbnVsbCBieXRlICovCi0JCWhlYWRlcl9vZmZzZXQgKz0gaGVhZGVyX3NpemU7CisgICAgICAgIHAgPSBuYW1lOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbmFtZV9zaXplOyBpKyspIHsKKyAgICAgICAgICAgICpwID0gKGNoYXIpZ2V0YyhmcCk7CisgICAgICAgICAgICBpZiAoKnAgPT0gJy8nKQorICAgICAgICAgICAgICAgICpwID0gU0VQOworICAgICAgICAgICAgcCsrOworICAgICAgICB9CisgICAgICAgICpwID0gMDsgICAgICAgICAvKiBBZGQgdGVybWluYXRpbmcgbnVsbCBieXRlICovCisgICAgICAgIGhlYWRlcl9vZmZzZXQgKz0gaGVhZGVyX3NpemU7CiAKLQkJc3RybmNweShwYXRoICsgbGVuZ3RoICsgMSwgbmFtZSwgTUFYUEFUSExFTiAtIGxlbmd0aCAtIDEpOworICAgICAgICBzdHJuY3B5KHBhdGggKyBsZW5ndGggKyAxLCBuYW1lLCBNQVhQQVRITEVOIC0gbGVuZ3RoIC0gMSk7CiAKLQkJdCA9IFB5X0J1aWxkVmFsdWUoInNpaWlpaWlpIiwgcGF0aCwgY29tcHJlc3MsIGRhdGFfc2l6ZSwKLQkJCQkgIGZpbGVfc2l6ZSwgZmlsZV9vZmZzZXQsIHRpbWUsIGRhdGUsIGNyYyk7Ci0JCWlmICh0ID09IE5VTEwpCi0JCQlnb3RvIGVycm9yOwotCQllcnIgPSBQeURpY3RfU2V0SXRlbVN0cmluZyhmaWxlcywgbmFtZSwgdCk7Ci0JCVB5X0RFQ1JFRih0KTsKLQkJaWYgKGVyciAhPSAwKQotCQkJZ290byBlcnJvcjsKLQkJY291bnQrKzsKLQl9Ci0JZmNsb3NlKGZwKTsKLQlpZiAoUHlfVmVyYm9zZUZsYWcpCi0JCVB5U3lzX1dyaXRlU3RkZXJyKCIjIHppcGltcG9ydDogZm91bmQgJWxkIG5hbWVzIGluICVzXG4iLAotCQkJY291bnQsIGFyY2hpdmUpOwotCXJldHVybiBmaWxlczsKKyAgICAgICAgdCA9IFB5X0J1aWxkVmFsdWUoInNpaWlpaWlpIiwgcGF0aCwgY29tcHJlc3MsIGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9zaXplLCBmaWxlX29mZnNldCwgdGltZSwgZGF0ZSwgY3JjKTsKKyAgICAgICAgaWYgKHQgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIGVyciA9IFB5RGljdF9TZXRJdGVtU3RyaW5nKGZpbGVzLCBuYW1lLCB0KTsKKyAgICAgICAgUHlfREVDUkVGKHQpOworICAgICAgICBpZiAoZXJyICE9IDApCisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICBjb3VudCsrOworICAgIH0KKyAgICBmY2xvc2UoZnApOworICAgIGlmIChQeV9WZXJib3NlRmxhZykKKyAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoIiMgemlwaW1wb3J0OiBmb3VuZCAlbGQgbmFtZXMgaW4gJXNcbiIsCisgICAgICAgICAgICBjb3VudCwgYXJjaGl2ZSk7CisgICAgcmV0dXJuIGZpbGVzOwogZXJyb3I6Ci0JZmNsb3NlKGZwKTsKLQlQeV9YREVDUkVGKGZpbGVzKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBmY2xvc2UoZnApOworICAgIFB5X1hERUNSRUYoZmlsZXMpOworICAgIHJldHVybiBOVUxMOwogfQogCiAvKiBSZXR1cm4gdGhlIHpsaWIuZGVjb21wcmVzcyBmdW5jdGlvbiBvYmplY3QsIG9yIE5VTEwgaWYgemxpYiBjb3VsZG4ndApAQCAtODAzLDMxICs4MDMsMzEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZXRfZGVjb21wcmVzc19mdW5jKHZvaWQpCiB7Ci0Jc3RhdGljIFB5T2JqZWN0ICpkZWNvbXByZXNzID0gTlVMTDsKKyAgICBzdGF0aWMgUHlPYmplY3QgKmRlY29tcHJlc3MgPSBOVUxMOwogCi0JaWYgKGRlY29tcHJlc3MgPT0gTlVMTCkgewotCQlQeU9iamVjdCAqemxpYjsKLQkJc3RhdGljIGludCBpbXBvcnRpbmdfemxpYiA9IDA7CisgICAgaWYgKGRlY29tcHJlc3MgPT0gTlVMTCkgeworICAgICAgICBQeU9iamVjdCAqemxpYjsKKyAgICAgICAgc3RhdGljIGludCBpbXBvcnRpbmdfemxpYiA9IDA7CiAKLQkJaWYgKGltcG9ydGluZ196bGliICE9IDApCi0JCQkvKiBTb21lb25lIGhhcyBhIHpsaWIucHlbY29dIGluIHRoZWlyIFppcCBmaWxlOwotCQkJICAgbGV0J3MgYXZvaWQgYSBzdGFjayBvdmVyZmxvdy4gKi8KLQkJCXJldHVybiBOVUxMOwotCQlpbXBvcnRpbmdfemxpYiA9IDE7Ci0JCXpsaWIgPSBQeUltcG9ydF9JbXBvcnRNb2R1bGVOb0Jsb2NrKCJ6bGliIik7Ci0JCWltcG9ydGluZ196bGliID0gMDsKLQkJaWYgKHpsaWIgIT0gTlVMTCkgewotCQkJZGVjb21wcmVzcyA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoemxpYiwKLQkJCQkJCQkgICAgImRlY29tcHJlc3MiKTsKLQkJCVB5X0RFQ1JFRih6bGliKTsKLQkJfQotCQllbHNlCi0JCQlQeUVycl9DbGVhcigpOwotCQlpZiAoUHlfVmVyYm9zZUZsYWcpCi0JCQlQeVN5c19Xcml0ZVN0ZGVycigiIyB6aXBpbXBvcnQ6IHpsaWIgJXNcbiIsCi0JCQkJemxpYiAhPSBOVUxMID8gImF2YWlsYWJsZSI6ICJVTkFWQUlMQUJMRSIpOwotCX0KLQlyZXR1cm4gZGVjb21wcmVzczsKKyAgICAgICAgaWYgKGltcG9ydGluZ196bGliICE9IDApCisgICAgICAgICAgICAvKiBTb21lb25lIGhhcyBhIHpsaWIucHlbY29dIGluIHRoZWlyIFppcCBmaWxlOworICAgICAgICAgICAgICAgbGV0J3MgYXZvaWQgYSBzdGFjayBvdmVyZmxvdy4gKi8KKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBpbXBvcnRpbmdfemxpYiA9IDE7CisgICAgICAgIHpsaWIgPSBQeUltcG9ydF9JbXBvcnRNb2R1bGVOb0Jsb2NrKCJ6bGliIik7CisgICAgICAgIGltcG9ydGluZ196bGliID0gMDsKKyAgICAgICAgaWYgKHpsaWIgIT0gTlVMTCkgeworICAgICAgICAgICAgZGVjb21wcmVzcyA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoemxpYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZWNvbXByZXNzIik7CisgICAgICAgICAgICBQeV9ERUNSRUYoemxpYik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgaWYgKFB5X1ZlcmJvc2VGbGFnKQorICAgICAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoIiMgemlwaW1wb3J0OiB6bGliICVzXG4iLAorICAgICAgICAgICAgICAgIHpsaWIgIT0gTlVMTCA/ICJhdmFpbGFibGUiOiAiVU5BVkFJTEFCTEUiKTsKKyAgICB9CisgICAgcmV0dXJuIGRlY29tcHJlc3M7CiB9CiAKIC8qIEdpdmVuIGEgcGF0aCB0byBhIFppcCBmaWxlIGFuZCBhIHRvY19lbnRyeSwgcmV0dXJuIHRoZSAodW5jb21wcmVzc2VkKQpAQCAtODM1LDg1ICs4MzUsODUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZXRfZGF0YShjaGFyICphcmNoaXZlLCBQeU9iamVjdCAqdG9jX2VudHJ5KQogewotCVB5T2JqZWN0ICpyYXdfZGF0YSwgKmRhdGEgPSBOVUxMLCAqZGVjb21wcmVzczsKLQljaGFyICpidWY7Ci0JRklMRSAqZnA7Ci0JaW50IGVycjsKLQlQeV9zc2l6ZV90IGJ5dGVzX3JlYWQgPSAwOwotCWxvbmcgbDsKLQljaGFyICpkYXRhcGF0aDsKLQlsb25nIGNvbXByZXNzLCBkYXRhX3NpemUsIGZpbGVfc2l6ZSwgZmlsZV9vZmZzZXQ7Ci0JbG9uZyB0aW1lLCBkYXRlLCBjcmM7CisgICAgUHlPYmplY3QgKnJhd19kYXRhLCAqZGF0YSA9IE5VTEwsICpkZWNvbXByZXNzOworICAgIGNoYXIgKmJ1ZjsKKyAgICBGSUxFICpmcDsKKyAgICBpbnQgZXJyOworICAgIFB5X3NzaXplX3QgYnl0ZXNfcmVhZCA9IDA7CisgICAgbG9uZyBsOworICAgIGNoYXIgKmRhdGFwYXRoOworICAgIGxvbmcgY29tcHJlc3MsIGRhdGFfc2l6ZSwgZmlsZV9zaXplLCBmaWxlX29mZnNldDsKKyAgICBsb25nIHRpbWUsIGRhdGUsIGNyYzsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZSh0b2NfZW50cnksICJzbGxsbGxsbCIsICZkYXRhcGF0aCwgJmNvbXByZXNzLAotCQkJICAgICAgJmRhdGFfc2l6ZSwgJmZpbGVfc2l6ZSwgJmZpbGVfb2Zmc2V0LCAmdGltZSwKLQkJCSAgICAgICZkYXRlLCAmY3JjKSkgewotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKHRvY19lbnRyeSwgInNsbGxsbGxsIiwgJmRhdGFwYXRoLCAmY29tcHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhX3NpemUsICZmaWxlX3NpemUsICZmaWxlX29mZnNldCwgJnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRlLCAmY3JjKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlmcCA9IGZvcGVuKGFyY2hpdmUsICJyYiIpOwotCWlmICghZnApIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX0lPRXJyb3IsCi0JCSAgICJ6aXBpbXBvcnQ6IGNhbiBub3Qgb3BlbiBmaWxlICVzIiwgYXJjaGl2ZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBmcCA9IGZvcGVuKGFyY2hpdmUsICJyYiIpOworICAgIGlmICghZnApIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX0lPRXJyb3IsCisgICAgICAgICAgICJ6aXBpbXBvcnQ6IGNhbiBub3Qgb3BlbiBmaWxlICVzIiwgYXJjaGl2ZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCS8qIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgbG9jYWwgZmlsZSBoZWFkZXIgaXMgY29ycmVjdCAqLwotCWZzZWVrKGZwLCBmaWxlX29mZnNldCwgMCk7Ci0JbCA9IFB5TWFyc2hhbF9SZWFkTG9uZ0Zyb21GaWxlKGZwKTsKLQlpZiAobCAhPSAweDA0MDM0QjUwKSB7Ci0JCS8qIEJhZDogTG9jYWwgRmlsZSBIZWFkZXIgKi8KLQkJUHlFcnJfRm9ybWF0KFppcEltcG9ydEVycm9yLAotCQkJICAgICAiYmFkIGxvY2FsIGZpbGUgaGVhZGVyIGluICVzIiwKLQkJCSAgICAgYXJjaGl2ZSk7Ci0JCWZjbG9zZShmcCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlmc2VlayhmcCwgZmlsZV9vZmZzZXQgKyAyNiwgMCk7Ci0JbCA9IDMwICsgUHlNYXJzaGFsX1JlYWRTaG9ydEZyb21GaWxlKGZwKSArCi0JICAgIFB5TWFyc2hhbF9SZWFkU2hvcnRGcm9tRmlsZShmcCk7CS8qIGxvY2FsIGhlYWRlciBzaXplICovCi0JZmlsZV9vZmZzZXQgKz0gbDsJLyogU3RhcnQgb2YgZmlsZSBkYXRhICovCisgICAgLyogQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBsb2NhbCBmaWxlIGhlYWRlciBpcyBjb3JyZWN0ICovCisgICAgZnNlZWsoZnAsIGZpbGVfb2Zmc2V0LCAwKTsKKyAgICBsID0gUHlNYXJzaGFsX1JlYWRMb25nRnJvbUZpbGUoZnApOworICAgIGlmIChsICE9IDB4MDQwMzRCNTApIHsKKyAgICAgICAgLyogQmFkOiBMb2NhbCBGaWxlIEhlYWRlciAqLworICAgICAgICBQeUVycl9Gb3JtYXQoWmlwSW1wb3J0RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiYmFkIGxvY2FsIGZpbGUgaGVhZGVyIGluICVzIiwKKyAgICAgICAgICAgICAgICAgICAgIGFyY2hpdmUpOworICAgICAgICBmY2xvc2UoZnApOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZnNlZWsoZnAsIGZpbGVfb2Zmc2V0ICsgMjYsIDApOworICAgIGwgPSAzMCArIFB5TWFyc2hhbF9SZWFkU2hvcnRGcm9tRmlsZShmcCkgKworICAgICAgICBQeU1hcnNoYWxfUmVhZFNob3J0RnJvbUZpbGUoZnApOyAgICAgICAgLyogbG9jYWwgaGVhZGVyIHNpemUgKi8KKyAgICBmaWxlX29mZnNldCArPSBsOyAgICAgICAgICAgLyogU3RhcnQgb2YgZmlsZSBkYXRhICovCiAKLQlyYXdfZGF0YSA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopTlVMTCwgY29tcHJlc3MgPT0gMCA/Ci0JCQkJCSAgICAgIGRhdGFfc2l6ZSA6IGRhdGFfc2l6ZSArIDEpOwotCWlmIChyYXdfZGF0YSA9PSBOVUxMKSB7Ci0JCWZjbG9zZShmcCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlidWYgPSBQeVN0cmluZ19Bc1N0cmluZyhyYXdfZGF0YSk7CisgICAgcmF3X2RhdGEgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKU5VTEwsIGNvbXByZXNzID09IDAgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9zaXplIDogZGF0YV9zaXplICsgMSk7CisgICAgaWYgKHJhd19kYXRhID09IE5VTEwpIHsKKyAgICAgICAgZmNsb3NlKGZwKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGJ1ZiA9IFB5U3RyaW5nX0FzU3RyaW5nKHJhd19kYXRhKTsKIAotCWVyciA9IGZzZWVrKGZwLCBmaWxlX29mZnNldCwgMCk7Ci0JaWYgKGVyciA9PSAwKQotCQlieXRlc19yZWFkID0gZnJlYWQoYnVmLCAxLCBkYXRhX3NpemUsIGZwKTsKLQlmY2xvc2UoZnApOwotCWlmIChlcnIgfHwgYnl0ZXNfcmVhZCAhPSBkYXRhX3NpemUpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0lPRXJyb3IsCi0JCQkJInppcGltcG9ydDogY2FuJ3QgcmVhZCBkYXRhIik7Ci0JCVB5X0RFQ1JFRihyYXdfZGF0YSk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBlcnIgPSBmc2VlayhmcCwgZmlsZV9vZmZzZXQsIDApOworICAgIGlmIChlcnIgPT0gMCkKKyAgICAgICAgYnl0ZXNfcmVhZCA9IGZyZWFkKGJ1ZiwgMSwgZGF0YV9zaXplLCBmcCk7CisgICAgZmNsb3NlKGZwKTsKKyAgICBpZiAoZXJyIHx8IGJ5dGVzX3JlYWQgIT0gZGF0YV9zaXplKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JT0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInppcGltcG9ydDogY2FuJ3QgcmVhZCBkYXRhIik7CisgICAgICAgIFB5X0RFQ1JFRihyYXdfZGF0YSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWlmIChjb21wcmVzcyAhPSAwKSB7Ci0JCWJ1ZltkYXRhX3NpemVdID0gJ1onOyAgLyogc2F3IHRoaXMgaW4gemlwZmlsZS5weSAqLwotCQlkYXRhX3NpemUrKzsKLQl9Ci0JYnVmW2RhdGFfc2l6ZV0gPSAnXDAnOworICAgIGlmIChjb21wcmVzcyAhPSAwKSB7CisgICAgICAgIGJ1ZltkYXRhX3NpemVdID0gJ1onOyAgLyogc2F3IHRoaXMgaW4gemlwZmlsZS5weSAqLworICAgICAgICBkYXRhX3NpemUrKzsKKyAgICB9CisgICAgYnVmW2RhdGFfc2l6ZV0gPSAnXDAnOwogCi0JaWYgKGNvbXByZXNzID09IDApICAvKiBkYXRhIGlzIG5vdCBjb21wcmVzc2VkICovCi0JCXJldHVybiByYXdfZGF0YTsKKyAgICBpZiAoY29tcHJlc3MgPT0gMCkgIC8qIGRhdGEgaXMgbm90IGNvbXByZXNzZWQgKi8KKyAgICAgICAgcmV0dXJuIHJhd19kYXRhOwogCi0JLyogRGVjb21wcmVzcyB3aXRoIHpsaWIgKi8KLQlkZWNvbXByZXNzID0gZ2V0X2RlY29tcHJlc3NfZnVuYygpOwotCWlmIChkZWNvbXByZXNzID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFppcEltcG9ydEVycm9yLAotCQkJCSJjYW4ndCBkZWNvbXByZXNzIGRhdGE7ICIKLQkJCQkiemxpYiBub3QgYXZhaWxhYmxlIik7Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCWRhdGEgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oZGVjb21wcmVzcywgIk9pIiwgcmF3X2RhdGEsIC0xNSk7CisgICAgLyogRGVjb21wcmVzcyB3aXRoIHpsaWIgKi8KKyAgICBkZWNvbXByZXNzID0gZ2V0X2RlY29tcHJlc3NfZnVuYygpOworICAgIGlmIChkZWNvbXByZXNzID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFppcEltcG9ydEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImNhbid0IGRlY29tcHJlc3MgZGF0YTsgIgorICAgICAgICAgICAgICAgICAgICAgICAgInpsaWIgbm90IGF2YWlsYWJsZSIpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgICBkYXRhID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKGRlY29tcHJlc3MsICJPaSIsIHJhd19kYXRhLCAtMTUpOwogZXJyb3I6Ci0JUHlfREVDUkVGKHJhd19kYXRhKTsKLQlyZXR1cm4gZGF0YTsKKyAgICBQeV9ERUNSRUYocmF3X2RhdGEpOworICAgIHJldHVybiBkYXRhOwogfQogCiAvKiBMZW5pZW50IGRhdGUvdGltZSBjb21wYXJpc29uIGZ1bmN0aW9uLiBUaGUgcHJlY2lzaW9uIG9mIHRoZSBtdGltZQpAQCAtOTIyLDExICs5MjIsMTEgQEAKIHN0YXRpYyBpbnQKIGVxX210aW1lKHRpbWVfdCB0MSwgdGltZV90IHQyKQogewotCXRpbWVfdCBkID0gdDEgLSB0MjsKLQlpZiAoZCA8IDApCi0JCWQgPSAtZDsKLQkvKiBkb3N0aW1lIG9ubHkgc3RvcmVzIGV2ZW4gc2Vjb25kcywgc28gYmUgbGVuaWVudCAqLwotCXJldHVybiBkIDw9IDE7CisgICAgdGltZV90IGQgPSB0MSAtIHQyOworICAgIGlmIChkIDwgMCkKKyAgICAgICAgZCA9IC1kOworICAgIC8qIGRvc3RpbWUgb25seSBzdG9yZXMgZXZlbiBzZWNvbmRzLCBzbyBiZSBsZW5pZW50ICovCisgICAgcmV0dXJuIGQgPD0gMTsKIH0KIAogLyogR2l2ZW4gdGhlIGNvbnRlbnRzIG9mIGEgLnB5W2NvXSBmaWxlIGluIGEgYnVmZmVyLCB1bm1hcnNoYWwgdGhlIGRhdGEKQEAgLTkzNyw0NCArOTM3LDQ0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogdW5tYXJzaGFsX2NvZGUoY2hhciAqcGF0aG5hbWUsIFB5T2JqZWN0ICpkYXRhLCB0aW1lX3QgbXRpbWUpCiB7Ci0JUHlPYmplY3QgKmNvZGU7Ci0JY2hhciAqYnVmID0gUHlTdHJpbmdfQXNTdHJpbmcoZGF0YSk7Ci0JUHlfc3NpemVfdCBzaXplID0gUHlTdHJpbmdfU2l6ZShkYXRhKTsKKyAgICBQeU9iamVjdCAqY29kZTsKKyAgICBjaGFyICpidWYgPSBQeVN0cmluZ19Bc1N0cmluZyhkYXRhKTsKKyAgICBQeV9zc2l6ZV90IHNpemUgPSBQeVN0cmluZ19TaXplKGRhdGEpOwogCi0JaWYgKHNpemUgPD0gOSkgewotCQlQeUVycl9TZXRTdHJpbmcoWmlwSW1wb3J0RXJyb3IsCi0JCQkJImJhZCBweWMgZGF0YSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKHNpemUgPD0gOSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoWmlwSW1wb3J0RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiYmFkIHB5YyBkYXRhIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWlmIChnZXRfbG9uZygodW5zaWduZWQgY2hhciAqKWJ1ZikgIT0gUHlJbXBvcnRfR2V0TWFnaWNOdW1iZXIoKSkgewotCQlpZiAoUHlfVmVyYm9zZUZsYWcpCi0JCQlQeVN5c19Xcml0ZVN0ZGVycigiIyAlcyBoYXMgYmFkIG1hZ2ljXG4iLAotCQkJCQkgIHBhdGhuYW1lKTsKLQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQlyZXR1cm4gUHlfTm9uZTsgIC8qIHNpZ25hbCBjYWxsZXIgdG8gdHJ5IGFsdGVybmF0aXZlICovCi0JfQorICAgIGlmIChnZXRfbG9uZygodW5zaWduZWQgY2hhciAqKWJ1ZikgIT0gUHlJbXBvcnRfR2V0TWFnaWNOdW1iZXIoKSkgeworICAgICAgICBpZiAoUHlfVmVyYm9zZUZsYWcpCisgICAgICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigiIyAlcyBoYXMgYmFkIG1hZ2ljXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aG5hbWUpOworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIHJldHVybiBQeV9Ob25lOyAgLyogc2lnbmFsIGNhbGxlciB0byB0cnkgYWx0ZXJuYXRpdmUgKi8KKyAgICB9CiAKLQlpZiAobXRpbWUgIT0gMCAmJiAhZXFfbXRpbWUoZ2V0X2xvbmcoKHVuc2lnbmVkIGNoYXIgKilidWYgKyA0KSwKLQkJCQkgICAgbXRpbWUpKSB7Ci0JCWlmIChQeV9WZXJib3NlRmxhZykKLQkJCVB5U3lzX1dyaXRlU3RkZXJyKCIjICVzIGhhcyBiYWQgbXRpbWVcbiIsCi0JCQkJCSAgcGF0aG5hbWUpOwotCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCXJldHVybiBQeV9Ob25lOyAgLyogc2lnbmFsIGNhbGxlciB0byB0cnkgYWx0ZXJuYXRpdmUgKi8KLQl9CisgICAgaWYgKG10aW1lICE9IDAgJiYgIWVxX210aW1lKGdldF9sb25nKCh1bnNpZ25lZCBjaGFyICopYnVmICsgNCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG10aW1lKSkgeworICAgICAgICBpZiAoUHlfVmVyYm9zZUZsYWcpCisgICAgICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigiIyAlcyBoYXMgYmFkIG10aW1lXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aG5hbWUpOworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIHJldHVybiBQeV9Ob25lOyAgLyogc2lnbmFsIGNhbGxlciB0byB0cnkgYWx0ZXJuYXRpdmUgKi8KKyAgICB9CiAKLQljb2RlID0gUHlNYXJzaGFsX1JlYWRPYmplY3RGcm9tU3RyaW5nKGJ1ZiArIDgsIHNpemUgLSA4KTsKLQlpZiAoY29kZSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIVB5Q29kZV9DaGVjayhjb2RlKSkgewotCQlQeV9ERUNSRUYoY29kZSk7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCSAgICAgImNvbXBpbGVkIG1vZHVsZSAlLjIwMHMgaXMgbm90IGEgY29kZSBvYmplY3QiLAotCQkgICAgIHBhdGhuYW1lKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBjb2RlOworICAgIGNvZGUgPSBQeU1hcnNoYWxfUmVhZE9iamVjdEZyb21TdHJpbmcoYnVmICsgOCwgc2l6ZSAtIDgpOworICAgIGlmIChjb2RlID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHlDb2RlX0NoZWNrKGNvZGUpKSB7CisgICAgICAgIFB5X0RFQ1JFRihjb2RlKTsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAiY29tcGlsZWQgbW9kdWxlICUuMjAwcyBpcyBub3QgYSBjb2RlIG9iamVjdCIsCisgICAgICAgICAgICAgcGF0aG5hbWUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIGNvZGU7CiB9CiAKIC8qIFJlcGxhY2UgYW55IG9jY3VyYW5jZXMgb2YgIlxyXG4/IiBpbiB0aGUgaW5wdXQgc3RyaW5nIHdpdGggIlxuIi4KQEAgLTk4NCwzNSArOTg0LDM1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogbm9ybWFsaXplX2xpbmVfZW5kaW5ncyhQeU9iamVjdCAqc291cmNlKQogewotCWNoYXIgKmJ1ZiwgKnEsICpwID0gUHlTdHJpbmdfQXNTdHJpbmcoc291cmNlKTsKLQlQeU9iamVjdCAqZml4ZWRfc291cmNlOworICAgIGNoYXIgKmJ1ZiwgKnEsICpwID0gUHlTdHJpbmdfQXNTdHJpbmcoc291cmNlKTsKKyAgICBQeU9iamVjdCAqZml4ZWRfc291cmNlOwogCi0JaWYgKCFwKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIXApCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JLyogb25lIGNoYXIgZXh0cmEgZm9yIHRyYWlsaW5nIFxuIGFuZCBvbmUgZm9yIHRlcm1pbmF0aW5nIFwwICovCi0JYnVmID0gKGNoYXIgKilQeU1lbV9NYWxsb2MoUHlTdHJpbmdfU2l6ZShzb3VyY2UpICsgMik7Ci0JaWYgKGJ1ZiA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19NZW1vcnlFcnJvciwKLQkJCQkiemlwaW1wb3J0OiBubyBtZW1vcnkgdG8gYWxsb2NhdGUgIgotCQkJCSJzb3VyY2UgYnVmZmVyIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQkvKiByZXBsYWNlICJcclxuPyIgYnkgIlxuIiAqLwotCWZvciAocSA9IGJ1ZjsgKnAgIT0gJ1wwJzsgcCsrKSB7Ci0JCWlmICgqcCA9PSAnXHInKSB7Ci0JCQkqcSsrID0gJ1xuJzsKLQkJCWlmICgqKHAgKyAxKSA9PSAnXG4nKQotCQkJCXArKzsKLQkJfQotCQllbHNlCi0JCQkqcSsrID0gKnA7Ci0JfQotCSpxKysgPSAnXG4nOyAgLyogYWRkIHRyYWlsaW5nIFxuICovCi0JKnEgPSAnXDAnOwotCWZpeGVkX3NvdXJjZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmKTsKLQlQeU1lbV9GcmVlKGJ1Zik7Ci0JcmV0dXJuIGZpeGVkX3NvdXJjZTsKKyAgICAvKiBvbmUgY2hhciBleHRyYSBmb3IgdHJhaWxpbmcgXG4gYW5kIG9uZSBmb3IgdGVybWluYXRpbmcgXDAgKi8KKyAgICBidWYgPSAoY2hhciAqKVB5TWVtX01hbGxvYyhQeVN0cmluZ19TaXplKHNvdXJjZSkgKyAyKTsKKyAgICBpZiAoYnVmID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX01lbW9yeUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInppcGltcG9ydDogbm8gbWVtb3J5IHRvIGFsbG9jYXRlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2UgYnVmZmVyIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICAvKiByZXBsYWNlICJcclxuPyIgYnkgIlxuIiAqLworICAgIGZvciAocSA9IGJ1ZjsgKnAgIT0gJ1wwJzsgcCsrKSB7CisgICAgICAgIGlmICgqcCA9PSAnXHInKSB7CisgICAgICAgICAgICAqcSsrID0gJ1xuJzsKKyAgICAgICAgICAgIGlmICgqKHAgKyAxKSA9PSAnXG4nKQorICAgICAgICAgICAgICAgIHArKzsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICAqcSsrID0gKnA7CisgICAgfQorICAgICpxKysgPSAnXG4nOyAgLyogYWRkIHRyYWlsaW5nIFxuICovCisgICAgKnEgPSAnXDAnOworICAgIGZpeGVkX3NvdXJjZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmKTsKKyAgICBQeU1lbV9GcmVlKGJ1Zik7CisgICAgcmV0dXJuIGZpeGVkX3NvdXJjZTsKIH0KIAogLyogR2l2ZW4gYSBzdHJpbmcgYnVmZmVyIGNvbnRhaW5pbmcgUHl0aG9uIHNvdXJjZSBjb2RlLCBjb21waWxlIGl0CkBAIC0xMDIwLDE2ICsxMDIwLDE2IEBACiBzdGF0aWMgUHlPYmplY3QgKgogY29tcGlsZV9zb3VyY2UoY2hhciAqcGF0aG5hbWUsIFB5T2JqZWN0ICpzb3VyY2UpCiB7Ci0JUHlPYmplY3QgKmNvZGUsICpmaXhlZF9zb3VyY2U7CisgICAgUHlPYmplY3QgKmNvZGUsICpmaXhlZF9zb3VyY2U7CiAKLQlmaXhlZF9zb3VyY2UgPSBub3JtYWxpemVfbGluZV9lbmRpbmdzKHNvdXJjZSk7Ci0JaWYgKGZpeGVkX3NvdXJjZSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBmaXhlZF9zb3VyY2UgPSBub3JtYWxpemVfbGluZV9lbmRpbmdzKHNvdXJjZSk7CisgICAgaWYgKGZpeGVkX3NvdXJjZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWNvZGUgPSBQeV9Db21waWxlU3RyaW5nKFB5U3RyaW5nX0FzU3RyaW5nKGZpeGVkX3NvdXJjZSksIHBhdGhuYW1lLAotCQkJCVB5X2ZpbGVfaW5wdXQpOwotCVB5X0RFQ1JFRihmaXhlZF9zb3VyY2UpOwotCXJldHVybiBjb2RlOworICAgIGNvZGUgPSBQeV9Db21waWxlU3RyaW5nKFB5U3RyaW5nX0FzU3RyaW5nKGZpeGVkX3NvdXJjZSksIHBhdGhuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X2ZpbGVfaW5wdXQpOworICAgIFB5X0RFQ1JFRihmaXhlZF9zb3VyY2UpOworICAgIHJldHVybiBjb2RlOwogfQogCiAvKiBDb252ZXJ0IHRoZSBkYXRlL3RpbWUgdmFsdWVzIGZvdW5kIGluIHRoZSBaaXAgYXJjaGl2ZSB0byBhIHZhbHVlCkBAIC0xMDM3LDE5ICsxMDM3LDE5IEBACiBzdGF0aWMgdGltZV90CiBwYXJzZV9kb3N0aW1lKGludCBkb3N0aW1lLCBpbnQgZG9zZGF0ZSkKIHsKLQlzdHJ1Y3QgdG0gc3RtOworICAgIHN0cnVjdCB0bSBzdG07CiAKLQltZW1zZXQoKHZvaWQgKikgJnN0bSwgJ1wwJywgc2l6ZW9mKHN0bSkpOworICAgIG1lbXNldCgodm9pZCAqKSAmc3RtLCAnXDAnLCBzaXplb2Yoc3RtKSk7CiAKLQlzdG0udG1fc2VjICAgPSAgKGRvc3RpbWUgICAgICAgICYgMHgxZikgKiAyOwotCXN0bS50bV9taW4gICA9ICAoZG9zdGltZSA+PiA1KSAgJiAweDNmOwotCXN0bS50bV9ob3VyICA9ICAoZG9zdGltZSA+PiAxMSkgJiAweDFmOwotCXN0bS50bV9tZGF5ICA9ICAgZG9zZGF0ZSAgICAgICAgJiAweDFmOwotCXN0bS50bV9tb24gICA9ICgoZG9zZGF0ZSA+PiA1KSAgJiAweDBmKSAtIDE7Ci0Jc3RtLnRtX3llYXIgID0gKChkb3NkYXRlID4+IDkpICAmIDB4N2YpICsgODA7Ci0Jc3RtLnRtX2lzZHN0ID0gICAtMTsgLyogd2RheS95ZGF5IGlzIGlnbm9yZWQgKi8KKyAgICBzdG0udG1fc2VjICAgPSAgKGRvc3RpbWUgICAgICAgICYgMHgxZikgKiAyOworICAgIHN0bS50bV9taW4gICA9ICAoZG9zdGltZSA+PiA1KSAgJiAweDNmOworICAgIHN0bS50bV9ob3VyICA9ICAoZG9zdGltZSA+PiAxMSkgJiAweDFmOworICAgIHN0bS50bV9tZGF5ICA9ICAgZG9zZGF0ZSAgICAgICAgJiAweDFmOworICAgIHN0bS50bV9tb24gICA9ICgoZG9zZGF0ZSA+PiA1KSAgJiAweDBmKSAtIDE7CisgICAgc3RtLnRtX3llYXIgID0gKChkb3NkYXRlID4+IDkpICAmIDB4N2YpICsgODA7CisgICAgc3RtLnRtX2lzZHN0ID0gICAtMTsgLyogd2RheS95ZGF5IGlzIGlnbm9yZWQgKi8KIAotCXJldHVybiBta3RpbWUoJnN0bSk7CisgICAgcmV0dXJuIG1rdGltZSgmc3RtKTsKIH0KIAogLyogR2l2ZW4gYSBwYXRoIHRvIGEgLnB5YyBvciAucHlvIGZpbGUgaW4gdGhlIGFyY2hpdmUsIHJldHVybiB0aGUKQEAgLTEwNTgsMTA2ICsxMDU4LDEwNiBAQAogc3RhdGljIHRpbWVfdAogZ2V0X210aW1lX29mX3NvdXJjZShaaXBJbXBvcnRlciAqc2VsZiwgY2hhciAqcGF0aCkKIHsKLQlQeU9iamVjdCAqdG9jX2VudHJ5OwotCXRpbWVfdCBtdGltZSA9IDA7Ci0JUHlfc3NpemVfdCBsYXN0Y2hhciA9IHN0cmxlbihwYXRoKSAtIDE7Ci0JY2hhciBzYXZlY2hhciA9IHBhdGhbbGFzdGNoYXJdOwotCXBhdGhbbGFzdGNoYXJdID0gJ1wwJzsgIC8qIHN0cmlwICdjJyBvciAnbycgZnJvbSAqLnB5W2NvXSAqLwotCXRvY19lbnRyeSA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKHNlbGYtPmZpbGVzLCBwYXRoKTsKLQlpZiAodG9jX2VudHJ5ICE9IE5VTEwgJiYgUHlUdXBsZV9DaGVjayh0b2NfZW50cnkpICYmCi0JICAgIFB5VHVwbGVfU2l6ZSh0b2NfZW50cnkpID09IDgpIHsKLQkJLyogZmV0Y2ggdGhlIHRpbWUgc3RhbXAgb2YgdGhlIC5weSBmaWxlIGZvciBjb21wYXJpc29uCi0JCSAgIHdpdGggYW4gZW1iZWRkZWQgcHljIHRpbWUgc3RhbXAgKi8KLQkJaW50IHRpbWUsIGRhdGU7Ci0JCXRpbWUgPSBQeUludF9Bc0xvbmcoUHlUdXBsZV9HZXRJdGVtKHRvY19lbnRyeSwgNSkpOwotCQlkYXRlID0gUHlJbnRfQXNMb25nKFB5VHVwbGVfR2V0SXRlbSh0b2NfZW50cnksIDYpKTsKLQkJbXRpbWUgPSBwYXJzZV9kb3N0aW1lKHRpbWUsIGRhdGUpOwotCX0KLQlwYXRoW2xhc3RjaGFyXSA9IHNhdmVjaGFyOwotCXJldHVybiBtdGltZTsKKyAgICBQeU9iamVjdCAqdG9jX2VudHJ5OworICAgIHRpbWVfdCBtdGltZSA9IDA7CisgICAgUHlfc3NpemVfdCBsYXN0Y2hhciA9IHN0cmxlbihwYXRoKSAtIDE7CisgICAgY2hhciBzYXZlY2hhciA9IHBhdGhbbGFzdGNoYXJdOworICAgIHBhdGhbbGFzdGNoYXJdID0gJ1wwJzsgIC8qIHN0cmlwICdjJyBvciAnbycgZnJvbSAqLnB5W2NvXSAqLworICAgIHRvY19lbnRyeSA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKHNlbGYtPmZpbGVzLCBwYXRoKTsKKyAgICBpZiAodG9jX2VudHJ5ICE9IE5VTEwgJiYgUHlUdXBsZV9DaGVjayh0b2NfZW50cnkpICYmCisgICAgICAgIFB5VHVwbGVfU2l6ZSh0b2NfZW50cnkpID09IDgpIHsKKyAgICAgICAgLyogZmV0Y2ggdGhlIHRpbWUgc3RhbXAgb2YgdGhlIC5weSBmaWxlIGZvciBjb21wYXJpc29uCisgICAgICAgICAgIHdpdGggYW4gZW1iZWRkZWQgcHljIHRpbWUgc3RhbXAgKi8KKyAgICAgICAgaW50IHRpbWUsIGRhdGU7CisgICAgICAgIHRpbWUgPSBQeUludF9Bc0xvbmcoUHlUdXBsZV9HZXRJdGVtKHRvY19lbnRyeSwgNSkpOworICAgICAgICBkYXRlID0gUHlJbnRfQXNMb25nKFB5VHVwbGVfR2V0SXRlbSh0b2NfZW50cnksIDYpKTsKKyAgICAgICAgbXRpbWUgPSBwYXJzZV9kb3N0aW1lKHRpbWUsIGRhdGUpOworICAgIH0KKyAgICBwYXRoW2xhc3RjaGFyXSA9IHNhdmVjaGFyOworICAgIHJldHVybiBtdGltZTsKIH0KIAogLyogUmV0dXJuIHRoZSBjb2RlIG9iamVjdCBmb3IgdGhlIG1vZHVsZSBuYW1lZCBieSAnZnVsbG5hbWUnIGZyb20gdGhlCiAgICBaaXAgYXJjaGl2ZSBhcyBhIG5ldyByZWZlcmVuY2UuICovCiBzdGF0aWMgUHlPYmplY3QgKgogZ2V0X2NvZGVfZnJvbV9kYXRhKFppcEltcG9ydGVyICpzZWxmLCBpbnQgaXNwYWNrYWdlLCBpbnQgaXNieXRlY29kZSwKLQkJICAgdGltZV90IG10aW1lLCBQeU9iamVjdCAqdG9jX2VudHJ5KQorICAgICAgICAgICAgICAgICAgIHRpbWVfdCBtdGltZSwgUHlPYmplY3QgKnRvY19lbnRyeSkKIHsKLQlQeU9iamVjdCAqZGF0YSwgKmNvZGU7Ci0JY2hhciAqbW9kcGF0aDsKLQljaGFyICphcmNoaXZlID0gUHlTdHJpbmdfQXNTdHJpbmcoc2VsZi0+YXJjaGl2ZSk7CisgICAgUHlPYmplY3QgKmRhdGEsICpjb2RlOworICAgIGNoYXIgKm1vZHBhdGg7CisgICAgY2hhciAqYXJjaGl2ZSA9IFB5U3RyaW5nX0FzU3RyaW5nKHNlbGYtPmFyY2hpdmUpOwogCi0JaWYgKGFyY2hpdmUgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKGFyY2hpdmUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlkYXRhID0gZ2V0X2RhdGEoYXJjaGl2ZSwgdG9jX2VudHJ5KTsKLQlpZiAoZGF0YSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBkYXRhID0gZ2V0X2RhdGEoYXJjaGl2ZSwgdG9jX2VudHJ5KTsKKyAgICBpZiAoZGF0YSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCW1vZHBhdGggPSBQeVN0cmluZ19Bc1N0cmluZyhQeVR1cGxlX0dldEl0ZW0odG9jX2VudHJ5LCAwKSk7CisgICAgbW9kcGF0aCA9IFB5U3RyaW5nX0FzU3RyaW5nKFB5VHVwbGVfR2V0SXRlbSh0b2NfZW50cnksIDApKTsKIAotCWlmIChpc2J5dGVjb2RlKSB7Ci0JCWNvZGUgPSB1bm1hcnNoYWxfY29kZShtb2RwYXRoLCBkYXRhLCBtdGltZSk7Ci0JfQotCWVsc2UgewotCQljb2RlID0gY29tcGlsZV9zb3VyY2UobW9kcGF0aCwgZGF0YSk7Ci0JfQotCVB5X0RFQ1JFRihkYXRhKTsKLQlyZXR1cm4gY29kZTsKKyAgICBpZiAoaXNieXRlY29kZSkgeworICAgICAgICBjb2RlID0gdW5tYXJzaGFsX2NvZGUobW9kcGF0aCwgZGF0YSwgbXRpbWUpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgY29kZSA9IGNvbXBpbGVfc291cmNlKG1vZHBhdGgsIGRhdGEpOworICAgIH0KKyAgICBQeV9ERUNSRUYoZGF0YSk7CisgICAgcmV0dXJuIGNvZGU7CiB9CiAKIC8qIEdldCB0aGUgY29kZSBvYmplY3QgYXNzb2ljaWF0ZWQgd2l0aCB0aGUgbW9kdWxlIHNwZWNpZmllZCBieQogICAgJ2Z1bGxuYW1lJy4gKi8KIHN0YXRpYyBQeU9iamVjdCAqCiBnZXRfbW9kdWxlX2NvZGUoWmlwSW1wb3J0ZXIgKnNlbGYsIGNoYXIgKmZ1bGxuYW1lLAotCQlpbnQgKnBfaXNwYWNrYWdlLCBjaGFyICoqcF9tb2RwYXRoKQorICAgICAgICAgICAgICAgIGludCAqcF9pc3BhY2thZ2UsIGNoYXIgKipwX21vZHBhdGgpCiB7Ci0JUHlPYmplY3QgKnRvY19lbnRyeTsKLQljaGFyICpzdWJuYW1lLCBwYXRoW01BWFBBVEhMRU4gKyAxXTsKLQlpbnQgbGVuOwotCXN0cnVjdCBzdF96aXBfc2VhcmNob3JkZXIgKnpzbzsKKyAgICBQeU9iamVjdCAqdG9jX2VudHJ5OworICAgIGNoYXIgKnN1Ym5hbWUsIHBhdGhbTUFYUEFUSExFTiArIDFdOworICAgIGludCBsZW47CisgICAgc3RydWN0IHN0X3ppcF9zZWFyY2hvcmRlciAqenNvOwogCi0Jc3VibmFtZSA9IGdldF9zdWJuYW1lKGZ1bGxuYW1lKTsKKyAgICBzdWJuYW1lID0gZ2V0X3N1Ym5hbWUoZnVsbG5hbWUpOwogCi0JbGVuID0gbWFrZV9maWxlbmFtZShQeVN0cmluZ19Bc1N0cmluZyhzZWxmLT5wcmVmaXgpLCBzdWJuYW1lLCBwYXRoKTsKLQlpZiAobGVuIDwgMCkKLQkJcmV0dXJuIE5VTEw7CisgICAgbGVuID0gbWFrZV9maWxlbmFtZShQeVN0cmluZ19Bc1N0cmluZyhzZWxmLT5wcmVmaXgpLCBzdWJuYW1lLCBwYXRoKTsKKyAgICBpZiAobGVuIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlmb3IgKHpzbyA9IHppcF9zZWFyY2hvcmRlcjsgKnpzby0+c3VmZml4OyB6c28rKykgewotCQlQeU9iamVjdCAqY29kZSA9IE5VTEw7CisgICAgZm9yICh6c28gPSB6aXBfc2VhcmNob3JkZXI7ICp6c28tPnN1ZmZpeDsgenNvKyspIHsKKyAgICAgICAgUHlPYmplY3QgKmNvZGUgPSBOVUxMOwogCi0JCXN0cmNweShwYXRoICsgbGVuLCB6c28tPnN1ZmZpeCk7Ci0JCWlmIChQeV9WZXJib3NlRmxhZyA+IDEpCi0JCQlQeVN5c19Xcml0ZVN0ZGVycigiIyB0cnlpbmcgJXMlYyVzXG4iLAotCQkJCQkgIFB5U3RyaW5nX0FzU3RyaW5nKHNlbGYtPmFyY2hpdmUpLAotCQkJCQkgIFNFUCwgcGF0aCk7Ci0JCXRvY19lbnRyeSA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKHNlbGYtPmZpbGVzLCBwYXRoKTsKLQkJaWYgKHRvY19lbnRyeSAhPSBOVUxMKSB7Ci0JCQl0aW1lX3QgbXRpbWUgPSAwOwotCQkJaW50IGlzcGFja2FnZSA9IHpzby0+dHlwZSAmIElTX1BBQ0tBR0U7Ci0JCQlpbnQgaXNieXRlY29kZSA9IHpzby0+dHlwZSAmIElTX0JZVEVDT0RFOworICAgICAgICBzdHJjcHkocGF0aCArIGxlbiwgenNvLT5zdWZmaXgpOworICAgICAgICBpZiAoUHlfVmVyYm9zZUZsYWcgPiAxKQorICAgICAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoIiMgdHJ5aW5nICVzJWMlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FzU3RyaW5nKHNlbGYtPmFyY2hpdmUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VQLCBwYXRoKTsKKyAgICAgICAgdG9jX2VudHJ5ID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoc2VsZi0+ZmlsZXMsIHBhdGgpOworICAgICAgICBpZiAodG9jX2VudHJ5ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHRpbWVfdCBtdGltZSA9IDA7CisgICAgICAgICAgICBpbnQgaXNwYWNrYWdlID0genNvLT50eXBlICYgSVNfUEFDS0FHRTsKKyAgICAgICAgICAgIGludCBpc2J5dGVjb2RlID0genNvLT50eXBlICYgSVNfQllURUNPREU7CiAKLQkJCWlmIChpc2J5dGVjb2RlKQotCQkJCW10aW1lID0gZ2V0X210aW1lX29mX3NvdXJjZShzZWxmLCBwYXRoKTsKLQkJCWlmIChwX2lzcGFja2FnZSAhPSBOVUxMKQotCQkJCSpwX2lzcGFja2FnZSA9IGlzcGFja2FnZTsKLQkJCWNvZGUgPSBnZXRfY29kZV9mcm9tX2RhdGEoc2VsZiwgaXNwYWNrYWdlLAotCQkJCQkJICBpc2J5dGVjb2RlLCBtdGltZSwKLQkJCQkJCSAgdG9jX2VudHJ5KTsKLQkJCWlmIChjb2RlID09IFB5X05vbmUpIHsKLQkJCQkvKiBiYWQgbWFnaWMgbnVtYmVyIG9yIG5vbi1tYXRjaGluZyBtdGltZQotCQkJCSAgIGluIGJ5dGUgY29kZSwgdHJ5IG5leHQgKi8KLQkJCQlQeV9ERUNSRUYoY29kZSk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAoY29kZSAhPSBOVUxMICYmIHBfbW9kcGF0aCAhPSBOVUxMKQotCQkJCSpwX21vZHBhdGggPSBQeVN0cmluZ19Bc1N0cmluZygKLQkJCQkJUHlUdXBsZV9HZXRJdGVtKHRvY19lbnRyeSwgMCkpOwotCQkJcmV0dXJuIGNvZGU7Ci0JCX0KLQl9Ci0JUHlFcnJfRm9ybWF0KFppcEltcG9ydEVycm9yLCAiY2FuJ3QgZmluZCBtb2R1bGUgJyUuMjAwcyciLCBmdWxsbmFtZSk7Ci0JcmV0dXJuIE5VTEw7CisgICAgICAgICAgICBpZiAoaXNieXRlY29kZSkKKyAgICAgICAgICAgICAgICBtdGltZSA9IGdldF9tdGltZV9vZl9zb3VyY2Uoc2VsZiwgcGF0aCk7CisgICAgICAgICAgICBpZiAocF9pc3BhY2thZ2UgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAqcF9pc3BhY2thZ2UgPSBpc3BhY2thZ2U7CisgICAgICAgICAgICBjb2RlID0gZ2V0X2NvZGVfZnJvbV9kYXRhKHNlbGYsIGlzcGFja2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNieXRlY29kZSwgbXRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvY19lbnRyeSk7CisgICAgICAgICAgICBpZiAoY29kZSA9PSBQeV9Ob25lKSB7CisgICAgICAgICAgICAgICAgLyogYmFkIG1hZ2ljIG51bWJlciBvciBub24tbWF0Y2hpbmcgbXRpbWUKKyAgICAgICAgICAgICAgICAgICBpbiBieXRlIGNvZGUsIHRyeSBuZXh0ICovCisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGNvZGUpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNvZGUgIT0gTlVMTCAmJiBwX21vZHBhdGggIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAqcF9tb2RwYXRoID0gUHlTdHJpbmdfQXNTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgIFB5VHVwbGVfR2V0SXRlbSh0b2NfZW50cnksIDApKTsKKyAgICAgICAgICAgIHJldHVybiBjb2RlOworICAgICAgICB9CisgICAgfQorICAgIFB5RXJyX0Zvcm1hdChaaXBJbXBvcnRFcnJvciwgImNhbid0IGZpbmQgbW9kdWxlICclLjIwMHMnIiwgZnVsbG5hbWUpOworICAgIHJldHVybiBOVUxMOwogfQogCiAKQEAgLTExODAsNTEgKzExODAsNTEgQEAKIFB5TU9ESU5JVF9GVU5DCiBpbml0emlwaW1wb3J0KHZvaWQpCiB7Ci0JUHlPYmplY3QgKm1vZDsKKyAgICBQeU9iamVjdCAqbW9kOwogCi0JaWYgKFB5VHlwZV9SZWFkeSgmWmlwSW1wb3J0ZXJfVHlwZSkgPCAwKQotCQlyZXR1cm47CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmWmlwSW1wb3J0ZXJfVHlwZSkgPCAwKQorICAgICAgICByZXR1cm47CiAKLQkvKiBDb3JyZWN0IGRpcmVjdG9yeSBzZXBhcmF0b3IgKi8KLQl6aXBfc2VhcmNob3JkZXJbMF0uc3VmZml4WzBdID0gU0VQOwotCXppcF9zZWFyY2hvcmRlclsxXS5zdWZmaXhbMF0gPSBTRVA7Ci0JemlwX3NlYXJjaG9yZGVyWzJdLnN1ZmZpeFswXSA9IFNFUDsKLQlpZiAoUHlfT3B0aW1pemVGbGFnKSB7Ci0JCS8qIFJldmVyc2UgKi5weWMgYW5kICoucHlvICovCi0JCXN0cnVjdCBzdF96aXBfc2VhcmNob3JkZXIgdG1wOwotCQl0bXAgPSB6aXBfc2VhcmNob3JkZXJbMF07Ci0JCXppcF9zZWFyY2hvcmRlclswXSA9IHppcF9zZWFyY2hvcmRlclsxXTsKLQkJemlwX3NlYXJjaG9yZGVyWzFdID0gdG1wOwotCQl0bXAgPSB6aXBfc2VhcmNob3JkZXJbM107Ci0JCXppcF9zZWFyY2hvcmRlclszXSA9IHppcF9zZWFyY2hvcmRlcls0XTsKLQkJemlwX3NlYXJjaG9yZGVyWzRdID0gdG1wOwotCX0KKyAgICAvKiBDb3JyZWN0IGRpcmVjdG9yeSBzZXBhcmF0b3IgKi8KKyAgICB6aXBfc2VhcmNob3JkZXJbMF0uc3VmZml4WzBdID0gU0VQOworICAgIHppcF9zZWFyY2hvcmRlclsxXS5zdWZmaXhbMF0gPSBTRVA7CisgICAgemlwX3NlYXJjaG9yZGVyWzJdLnN1ZmZpeFswXSA9IFNFUDsKKyAgICBpZiAoUHlfT3B0aW1pemVGbGFnKSB7CisgICAgICAgIC8qIFJldmVyc2UgKi5weWMgYW5kICoucHlvICovCisgICAgICAgIHN0cnVjdCBzdF96aXBfc2VhcmNob3JkZXIgdG1wOworICAgICAgICB0bXAgPSB6aXBfc2VhcmNob3JkZXJbMF07CisgICAgICAgIHppcF9zZWFyY2hvcmRlclswXSA9IHppcF9zZWFyY2hvcmRlclsxXTsKKyAgICAgICAgemlwX3NlYXJjaG9yZGVyWzFdID0gdG1wOworICAgICAgICB0bXAgPSB6aXBfc2VhcmNob3JkZXJbM107CisgICAgICAgIHppcF9zZWFyY2hvcmRlclszXSA9IHppcF9zZWFyY2hvcmRlcls0XTsKKyAgICAgICAgemlwX3NlYXJjaG9yZGVyWzRdID0gdG1wOworICAgIH0KIAotCW1vZCA9IFB5X0luaXRNb2R1bGU0KCJ6aXBpbXBvcnQiLCBOVUxMLCB6aXBpbXBvcnRfZG9jLAotCQkJICAgICBOVUxMLCBQWVRIT05fQVBJX1ZFUlNJT04pOwotCWlmIChtb2QgPT0gTlVMTCkKLQkJcmV0dXJuOworICAgIG1vZCA9IFB5X0luaXRNb2R1bGU0KCJ6aXBpbXBvcnQiLCBOVUxMLCB6aXBpbXBvcnRfZG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIFBZVEhPTl9BUElfVkVSU0lPTik7CisgICAgaWYgKG1vZCA9PSBOVUxMKQorICAgICAgICByZXR1cm47CiAKLQlaaXBJbXBvcnRFcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbigiemlwaW1wb3J0LlppcEltcG9ydEVycm9yIiwKLQkJCQkJICAgIFB5RXhjX0ltcG9ydEVycm9yLCBOVUxMKTsKLQlpZiAoWmlwSW1wb3J0RXJyb3IgPT0gTlVMTCkKLQkJcmV0dXJuOworICAgIFppcEltcG9ydEVycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJ6aXBpbXBvcnQuWmlwSW1wb3J0RXJyb3IiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXhjX0ltcG9ydEVycm9yLCBOVUxMKTsKKyAgICBpZiAoWmlwSW1wb3J0RXJyb3IgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOwogCi0JUHlfSU5DUkVGKFppcEltcG9ydEVycm9yKTsKLQlpZiAoUHlNb2R1bGVfQWRkT2JqZWN0KG1vZCwgIlppcEltcG9ydEVycm9yIiwKLQkJCSAgICAgICBaaXBJbXBvcnRFcnJvcikgPCAwKQotCQlyZXR1cm47CisgICAgUHlfSU5DUkVGKFppcEltcG9ydEVycm9yKTsKKyAgICBpZiAoUHlNb2R1bGVfQWRkT2JqZWN0KG1vZCwgIlppcEltcG9ydEVycm9yIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFppcEltcG9ydEVycm9yKSA8IDApCisgICAgICAgIHJldHVybjsKIAotCVB5X0lOQ1JFRigmWmlwSW1wb3J0ZXJfVHlwZSk7Ci0JaWYgKFB5TW9kdWxlX0FkZE9iamVjdChtb2QsICJ6aXBpbXBvcnRlciIsCi0JCQkgICAgICAgKFB5T2JqZWN0ICopJlppcEltcG9ydGVyX1R5cGUpIDwgMCkKLQkJcmV0dXJuOworICAgIFB5X0lOQ1JFRigmWmlwSW1wb3J0ZXJfVHlwZSk7CisgICAgaWYgKFB5TW9kdWxlX0FkZE9iamVjdChtb2QsICJ6aXBpbXBvcnRlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoUHlPYmplY3QgKikmWmlwSW1wb3J0ZXJfVHlwZSkgPCAwKQorICAgICAgICByZXR1cm47CiAKLQl6aXBfZGlyZWN0b3J5X2NhY2hlID0gUHlEaWN0X05ldygpOwotCWlmICh6aXBfZGlyZWN0b3J5X2NhY2hlID09IE5VTEwpCi0JCXJldHVybjsKLQlQeV9JTkNSRUYoemlwX2RpcmVjdG9yeV9jYWNoZSk7Ci0JaWYgKFB5TW9kdWxlX0FkZE9iamVjdChtb2QsICJfemlwX2RpcmVjdG9yeV9jYWNoZSIsCi0JCQkgICAgICAgemlwX2RpcmVjdG9yeV9jYWNoZSkgPCAwKQotCQlyZXR1cm47CisgICAgemlwX2RpcmVjdG9yeV9jYWNoZSA9IFB5RGljdF9OZXcoKTsKKyAgICBpZiAoemlwX2RpcmVjdG9yeV9jYWNoZSA9PSBOVUxMKQorICAgICAgICByZXR1cm47CisgICAgUHlfSU5DUkVGKHppcF9kaXJlY3RvcnlfY2FjaGUpOworICAgIGlmIChQeU1vZHVsZV9BZGRPYmplY3QobW9kLCAiX3ppcF9kaXJlY3RvcnlfY2FjaGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgemlwX2RpcmVjdG9yeV9jYWNoZSkgPCAwKQorICAgICAgICByZXR1cm47CiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3psaWJtb2R1bGUuYyBiL01vZHVsZXMvemxpYm1vZHVsZS5jCmluZGV4IDBjYjFlNjQuLmJiNTJmZGMgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvemxpYm1vZHVsZS5jCisrKyBiL01vZHVsZXMvemxpYm1vZHVsZS5jCkBAIC0yOCwxMiArMjgsMTIgQEAKIHN0YXRpYyBQeVRocmVhZF90eXBlX2xvY2sgemxpYl9sb2NrID0gTlVMTDsgLyogaW5pdGlhbGl6ZWQgb24gbW9kdWxlIGxvYWQgKi8KIAogI2RlZmluZSBFTlRFUl9aTElCIFwKLQlQeV9CRUdJTl9BTExPV19USFJFQURTIFwKLQlQeVRocmVhZF9hY3F1aXJlX2xvY2soemxpYl9sb2NrLCAxKTsgXAotCVB5X0VORF9BTExPV19USFJFQURTCisgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMgXAorICAgICAgICBQeVRocmVhZF9hY3F1aXJlX2xvY2soemxpYl9sb2NrLCAxKTsgXAorICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogCiAjZGVmaW5lIExFQVZFX1pMSUIgXAotCVB5VGhyZWFkX3JlbGVhc2VfbG9jayh6bGliX2xvY2spOworICAgICAgICBQeVRocmVhZF9yZWxlYXNlX2xvY2soemxpYl9sb2NrKTsKIAogI2Vsc2UKIApAQCAtNzMsOSArNzMsOSBAQAogemxpYl9lcnJvcih6X3N0cmVhbSB6c3QsIGludCBlcnIsIGNoYXIgKm1zZykKIHsKICAgICBpZiAoenN0Lm1zZyA9PSBaX05VTEwpCi0JUHlFcnJfRm9ybWF0KFpsaWJFcnJvciwgIkVycm9yICVkICVzIiwgZXJyLCBtc2cpOworICAgICAgICBQeUVycl9Gb3JtYXQoWmxpYkVycm9yLCAiRXJyb3IgJWQgJXMiLCBlcnIsIG1zZyk7CiAgICAgZWxzZQotCVB5RXJyX0Zvcm1hdChabGliRXJyb3IsICJFcnJvciAlZCAlczogJS4yMDBzIiwgZXJyLCBtc2csIHpzdC5tc2cpOworICAgICAgICBQeUVycl9Gb3JtYXQoWmxpYkVycm9yLCAiRXJyb3IgJWQgJXM6ICUuMjAwcyIsIGVyciwgbXNnLCB6c3QubXNnKTsKIH0KIAogUHlEb2NfU1RSVkFSKGNvbXByZXNzb2JqX19kb2NfXywKQEAgLTk0LDE3ICs5NCwxNyBAQAogICAgIGNvbXBvYmplY3QgKnNlbGY7CiAgICAgc2VsZiA9IFB5T2JqZWN0X05ldyhjb21wb2JqZWN0LCB0eXBlKTsKICAgICBpZiAoc2VsZiA9PSBOVUxMKQotCXJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICBzZWxmLT5pc19pbml0aWFsaXNlZCA9IDA7CiAgICAgc2VsZi0+dW51c2VkX2RhdGEgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCIiKTsKICAgICBpZiAoc2VsZi0+dW51c2VkX2RhdGEgPT0gTlVMTCkgewotCVB5X0RFQ1JFRihzZWxmKTsKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgUHlfREVDUkVGKHNlbGYpOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAgICAgc2VsZi0+dW5jb25zdW1lZF90YWlsID0gUHlTdHJpbmdfRnJvbVN0cmluZygiIik7CiAgICAgaWYgKHNlbGYtPnVuY29uc3VtZWRfdGFpbCA9PSBOVUxMKSB7Ci0JUHlfREVDUkVGKHNlbGYpOwotCXJldHVybiBOVUxMOworICAgICAgICBQeV9ERUNSRUYoc2VsZik7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICByZXR1cm4gc2VsZjsKIH0KQEAgLTEyNCwxNSArMTI0LDE1IEBACiAKICAgICAvKiByZXF1aXJlIFB5dGhvbiBzdHJpbmcgb2JqZWN0LCBvcHRpb25hbCAnbGV2ZWwnIGFyZyAqLwogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyN8aTpjb21wcmVzcyIsICZpbnB1dCwgJmxlbmd0aCwgJmxldmVsKSkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICB6c3QuYXZhaWxfb3V0ID0gbGVuZ3RoICsgbGVuZ3RoLzEwMDAgKyAxMiArIDE7CiAKICAgICBvdXRwdXQgPSAoQnl0ZSopbWFsbG9jKHpzdC5hdmFpbF9vdXQpOwogICAgIGlmIChvdXRwdXQgPT0gTlVMTCkgewotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19NZW1vcnlFcnJvciwKLQkJCSJDYW4ndCBhbGxvY2F0ZSBtZW1vcnkgdG8gY29tcHJlc3MgZGF0YSIpOwotCXJldHVybiBOVUxMOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTWVtb3J5RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiQ2FuJ3QgYWxsb2NhdGUgbWVtb3J5IHRvIGNvbXByZXNzIGRhdGEiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCiAgICAgLyogUGFzdCB0aGUgcG9pbnQgb2Ygbm8gcmV0dXJuLiAgRnJvbSBoZXJlIG9uIG91dCwgd2UgbmVlZCB0byBtYWtlIHN1cmUKQEAgLTE0NywxOSArMTQ3LDE5IEBACiAKICAgICBzd2l0Y2goZXJyKSB7CiAgICAgY2FzZShaX09LKToKLQlicmVhazsKKyAgICAgICAgYnJlYWs7CiAgICAgY2FzZShaX01FTV9FUlJPUik6Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX01lbW9yeUVycm9yLAotCQkJIk91dCBvZiBtZW1vcnkgd2hpbGUgY29tcHJlc3NpbmcgZGF0YSIpOwotCWdvdG8gZXJyb3I7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19NZW1vcnlFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJPdXQgb2YgbWVtb3J5IHdoaWxlIGNvbXByZXNzaW5nIGRhdGEiKTsKKyAgICAgICAgZ290byBlcnJvcjsKICAgICBjYXNlKFpfU1RSRUFNX0VSUk9SKToKLQlQeUVycl9TZXRTdHJpbmcoWmxpYkVycm9yLAotCQkJIkJhZCBjb21wcmVzc2lvbiBsZXZlbCIpOwotCWdvdG8gZXJyb3I7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhabGliRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiQmFkIGNvbXByZXNzaW9uIGxldmVsIik7CisgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgZGVmYXVsdDoKICAgICAgICAgZGVmbGF0ZUVuZCgmenN0KTsKLQl6bGliX2Vycm9yKHpzdCwgZXJyLCAid2hpbGUgY29tcHJlc3NpbmcgZGF0YSIpOwotCWdvdG8gZXJyb3I7CisgICAgICAgIHpsaWJfZXJyb3IoenN0LCBlcnIsICJ3aGlsZSBjb21wcmVzc2luZyBkYXRhIik7CisgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfQogCiAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUzsKQEAgLTE2NywxNyArMTY3LDE3IEBACiAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFM7CiAKICAgICBpZiAoZXJyICE9IFpfU1RSRUFNX0VORCkgewotCXpsaWJfZXJyb3IoenN0LCBlcnIsICJ3aGlsZSBjb21wcmVzc2luZyBkYXRhIik7Ci0JZGVmbGF0ZUVuZCgmenN0KTsKLQlnb3RvIGVycm9yOworICAgICAgICB6bGliX2Vycm9yKHpzdCwgZXJyLCAid2hpbGUgY29tcHJlc3NpbmcgZGF0YSIpOworICAgICAgICBkZWZsYXRlRW5kKCZ6c3QpOworICAgICAgICBnb3RvIGVycm9yOwogICAgIH0KIAogICAgIGVycj1kZWZsYXRlRW5kKCZ6c3QpOwogICAgIGlmIChlcnIgPT0gWl9PSykKLQlSZXR1cm5WYWwgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKW91dHB1dCwKLQkJCQkJICAgICAgIHpzdC50b3RhbF9vdXQpOworICAgICAgICBSZXR1cm5WYWwgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKW91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgenN0LnRvdGFsX291dCk7CiAgICAgZWxzZQotCXpsaWJfZXJyb3IoenN0LCBlcnIsICJ3aGlsZSBmaW5pc2hpbmcgY29tcHJlc3Npb24iKTsKKyAgICAgICAgemxpYl9lcnJvcih6c3QsIGVyciwgIndoaWxlIGZpbmlzaGluZyBjb21wcmVzc2lvbiIpOwogCiAgZXJyb3I6CiAgICAgZnJlZShvdXRwdXQpOwpAQCAtMjAyLDE3ICsyMDIsMTcgQEAKICAgICB6X3N0cmVhbSB6c3Q7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjfGluOmRlY29tcHJlc3MiLAotCQkJICAmaW5wdXQsICZsZW5ndGgsICZ3c2l6ZSwgJnJfc3RybGVuKSkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlucHV0LCAmbGVuZ3RoLCAmd3NpemUsICZyX3N0cmxlbikpCisgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgaWYgKHJfc3RybGVuIDw9IDApCi0Jcl9zdHJsZW4gPSAxOworICAgICAgICByX3N0cmxlbiA9IDE7CiAKICAgICB6c3QuYXZhaWxfaW4gPSBsZW5ndGg7CiAgICAgenN0LmF2YWlsX291dCA9IHJfc3RybGVuOwogCiAgICAgaWYgKCEocmVzdWx0X3N0ciA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIHJfc3RybGVuKSkpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgenN0LnphbGxvYyA9IChhbGxvY19mdW5jKU5VTEw7CiAgICAgenN0LnpmcmVlID0gKGZyZWVfZnVuYylaX05VTEw7CkBAIC0yMjIsNjAgKzIyMiw2MCBAQAogCiAgICAgc3dpdGNoKGVycikgewogICAgIGNhc2UoWl9PSyk6Ci0JYnJlYWs7CisgICAgICAgIGJyZWFrOwogICAgIGNhc2UoWl9NRU1fRVJST1IpOgotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19NZW1vcnlFcnJvciwKLQkJCSJPdXQgb2YgbWVtb3J5IHdoaWxlIGRlY29tcHJlc3NpbmcgZGF0YSIpOwotCWdvdG8gZXJyb3I7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19NZW1vcnlFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJPdXQgb2YgbWVtb3J5IHdoaWxlIGRlY29tcHJlc3NpbmcgZGF0YSIpOworICAgICAgICBnb3RvIGVycm9yOwogICAgIGRlZmF1bHQ6CiAgICAgICAgIGluZmxhdGVFbmQoJnpzdCk7Ci0JemxpYl9lcnJvcih6c3QsIGVyciwgIndoaWxlIHByZXBhcmluZyB0byBkZWNvbXByZXNzIGRhdGEiKTsKLQlnb3RvIGVycm9yOworICAgICAgICB6bGliX2Vycm9yKHpzdCwgZXJyLCAid2hpbGUgcHJlcGFyaW5nIHRvIGRlY29tcHJlc3MgZGF0YSIpOworICAgICAgICBnb3RvIGVycm9yOwogICAgIH0KIAogICAgIGRvIHsKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JZXJyPWluZmxhdGUoJnpzdCwgWl9GSU5JU0gpOwotCVB5X0VORF9BTExPV19USFJFQURTCisgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgZXJyPWluZmxhdGUoJnpzdCwgWl9GSU5JU0gpOworICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogCi0Jc3dpdGNoKGVycikgewotCWNhc2UoWl9TVFJFQU1fRU5EKToKLQkgICAgYnJlYWs7Ci0JY2FzZShaX0JVRl9FUlJPUik6Ci0JICAgIC8qCi0JICAgICAqIElmIHRoZXJlIGlzIGF0IGxlYXN0IDEgYnl0ZSBvZiByb29tIGFjY29yZGluZyB0byB6c3QuYXZhaWxfb3V0Ci0JICAgICAqIGFuZCB3ZSBnZXQgdGhpcyBlcnJvciwgYXNzdW1lIHRoYXQgaXQgbWVhbnMgemxpYiBjYW5ub3QKLQkgICAgICogcHJvY2VzcyB0aGUgaW5mbGF0ZSBjYWxsKCkgZHVlIHRvIGFuIGVycm9yIGluIHRoZSBkYXRhLgotCSAgICAgKi8KLQkgICAgaWYgKHpzdC5hdmFpbF9vdXQgPiAwKSB7Ci0JCVB5RXJyX0Zvcm1hdChabGliRXJyb3IsICJFcnJvciAlaSB3aGlsZSBkZWNvbXByZXNzaW5nIGRhdGEiLAotCQkJICAgICBlcnIpOwotCQlpbmZsYXRlRW5kKCZ6c3QpOwotCQlnb3RvIGVycm9yOwotCSAgICB9Ci0JICAgIC8qIGZhbGwgdGhyb3VnaCAqLwotCWNhc2UoWl9PSyk6Ci0JICAgIC8qIG5lZWQgbW9yZSBtZW1vcnkgKi8KLQkgICAgaWYgKF9QeVN0cmluZ19SZXNpemUoJnJlc3VsdF9zdHIsIHJfc3RybGVuIDw8IDEpIDwgMCkgewotCQlpbmZsYXRlRW5kKCZ6c3QpOwotCQlnb3RvIGVycm9yOwotCSAgICB9Ci0JICAgIHpzdC5uZXh0X291dCA9ICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQVNfU1RSSU5HKHJlc3VsdF9zdHIpIFwKLQkJKyByX3N0cmxlbjsKLQkgICAgenN0LmF2YWlsX291dCA9IHJfc3RybGVuOwotCSAgICByX3N0cmxlbiA9IHJfc3RybGVuIDw8IDE7Ci0JICAgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICAgIGluZmxhdGVFbmQoJnpzdCk7Ci0JICAgIHpsaWJfZXJyb3IoenN0LCBlcnIsICJ3aGlsZSBkZWNvbXByZXNzaW5nIGRhdGEiKTsKLQkgICAgZ290byBlcnJvcjsKLQl9CisgICAgICAgIHN3aXRjaChlcnIpIHsKKyAgICAgICAgY2FzZShaX1NUUkVBTV9FTkQpOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UoWl9CVUZfRVJST1IpOgorICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIElmIHRoZXJlIGlzIGF0IGxlYXN0IDEgYnl0ZSBvZiByb29tIGFjY29yZGluZyB0byB6c3QuYXZhaWxfb3V0CisgICAgICAgICAgICAgKiBhbmQgd2UgZ2V0IHRoaXMgZXJyb3IsIGFzc3VtZSB0aGF0IGl0IG1lYW5zIHpsaWIgY2Fubm90CisgICAgICAgICAgICAgKiBwcm9jZXNzIHRoZSBpbmZsYXRlIGNhbGwoKSBkdWUgdG8gYW4gZXJyb3IgaW4gdGhlIGRhdGEuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmICh6c3QuYXZhaWxfb3V0ID4gMCkgeworICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChabGliRXJyb3IsICJFcnJvciAlaSB3aGlsZSBkZWNvbXByZXNzaW5nIGRhdGEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOworICAgICAgICAgICAgICAgIGluZmxhdGVFbmQoJnpzdCk7CisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLworICAgICAgICBjYXNlKFpfT0spOgorICAgICAgICAgICAgLyogbmVlZCBtb3JlIG1lbW9yeSAqLworICAgICAgICAgICAgaWYgKF9QeVN0cmluZ19SZXNpemUoJnJlc3VsdF9zdHIsIHJfc3RybGVuIDw8IDEpIDwgMCkgeworICAgICAgICAgICAgICAgIGluZmxhdGVFbmQoJnpzdCk7CisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHpzdC5uZXh0X291dCA9ICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQVNfU1RSSU5HKHJlc3VsdF9zdHIpIFwKKyAgICAgICAgICAgICAgICArIHJfc3RybGVuOworICAgICAgICAgICAgenN0LmF2YWlsX291dCA9IHJfc3RybGVuOworICAgICAgICAgICAgcl9zdHJsZW4gPSByX3N0cmxlbiA8PCAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBpbmZsYXRlRW5kKCZ6c3QpOworICAgICAgICAgICAgemxpYl9lcnJvcih6c3QsIGVyciwgIndoaWxlIGRlY29tcHJlc3NpbmcgZGF0YSIpOworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQogICAgIH0gd2hpbGUgKGVyciAhPSBaX1NUUkVBTV9FTkQpOwogCiAgICAgZXJyID0gaW5mbGF0ZUVuZCgmenN0KTsKICAgICBpZiAoZXJyICE9IFpfT0spIHsKLQl6bGliX2Vycm9yKHpzdCwgZXJyLCAid2hpbGUgZmluaXNoaW5nIGRhdGEgZGVjb21wcmVzc2lvbiIpOwotCWdvdG8gZXJyb3I7CisgICAgICAgIHpsaWJfZXJyb3IoenN0LCBlcnIsICJ3aGlsZSBmaW5pc2hpbmcgZGF0YSBkZWNvbXByZXNzaW9uIik7CisgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfQogCiAgICAgX1B5U3RyaW5nX1Jlc2l6ZSgmcmVzdWx0X3N0ciwgenN0LnRvdGFsX291dCk7CkBAIC0yOTQsMTIgKzI5NCwxMiBAQAogICAgIGludCB3Yml0cz1NQVhfV0JJVFMsIG1lbUxldmVsPURFRl9NRU1fTEVWRUwsIHN0cmF0ZWd5PTAsIGVycjsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifGlpaWlpOmNvbXByZXNzb2JqIiwgJmxldmVsLCAmbWV0aG9kLCAmd2JpdHMsCi0JCQkgICZtZW1MZXZlbCwgJnN0cmF0ZWd5KSkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lbUxldmVsLCAmc3RyYXRlZ3kpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIHNlbGYgPSBuZXdjb21wb2JqZWN0KCZDb21wdHlwZSk7CiAgICAgaWYgKHNlbGY9PU5VTEwpCi0JcmV0dXJuKE5VTEwpOworICAgICAgICByZXR1cm4oTlVMTCk7CiAgICAgc2VsZi0+enN0LnphbGxvYyA9IChhbGxvY19mdW5jKU5VTEw7CiAgICAgc2VsZi0+enN0LnpmcmVlID0gKGZyZWVfZnVuYylaX05VTEw7CiAgICAgc2VsZi0+enN0Lm5leHRfaW4gPSBOVUxMOwpAQCAtMzA3LDIxICszMDcsMjEgQEAKICAgICBlcnIgPSBkZWZsYXRlSW5pdDIoJnNlbGYtPnpzdCwgbGV2ZWwsIG1ldGhvZCwgd2JpdHMsIG1lbUxldmVsLCBzdHJhdGVneSk7CiAgICAgc3dpdGNoKGVycikgewogICAgIGNhc2UgKFpfT0spOgotCXNlbGYtPmlzX2luaXRpYWxpc2VkID0gMTsKLQlyZXR1cm4gKFB5T2JqZWN0KilzZWxmOworICAgICAgICBzZWxmLT5pc19pbml0aWFsaXNlZCA9IDE7CisgICAgICAgIHJldHVybiAoUHlPYmplY3QqKXNlbGY7CiAgICAgY2FzZSAoWl9NRU1fRVJST1IpOgotCVB5X0RFQ1JFRihzZWxmKTsKLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfTWVtb3J5RXJyb3IsCi0JCQkiQ2FuJ3QgYWxsb2NhdGUgbWVtb3J5IGZvciBjb21wcmVzc2lvbiBvYmplY3QiKTsKLQlyZXR1cm4gTlVMTDsKLSAgICBjYXNlKFpfU1RSRUFNX0VSUk9SKToKLQlQeV9ERUNSRUYoc2VsZik7Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJJbnZhbGlkIGluaXRpYWxpemF0aW9uIG9wdGlvbiIpOwotCXJldHVybiBOVUxMOwotICAgIGRlZmF1bHQ6Ci0JemxpYl9lcnJvcihzZWxmLT56c3QsIGVyciwgIndoaWxlIGNyZWF0aW5nIGNvbXByZXNzaW9uIG9iamVjdCIpOwogICAgICAgICBQeV9ERUNSRUYoc2VsZik7Ci0JcmV0dXJuIE5VTEw7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19NZW1vcnlFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJDYW4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGNvbXByZXNzaW9uIG9iamVjdCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBjYXNlKFpfU1RSRUFNX0VSUk9SKToKKyAgICAgICAgUHlfREVDUkVGKHNlbGYpOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIkludmFsaWQgaW5pdGlhbGl6YXRpb24gb3B0aW9uIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIGRlZmF1bHQ6CisgICAgICAgIHpsaWJfZXJyb3Ioc2VsZi0+enN0LCBlcnIsICJ3aGlsZSBjcmVhdGluZyBjb21wcmVzc2lvbiBvYmplY3QiKTsKKyAgICAgICAgUHlfREVDUkVGKHNlbGYpOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiB9CiAKQEAgLTMzMSwxMSArMzMxLDExIEBACiAgICAgaW50IHdiaXRzPURFRl9XQklUUywgZXJyOwogICAgIGNvbXBvYmplY3QgKnNlbGY7CiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8aTpkZWNvbXByZXNzb2JqIiwgJndiaXRzKSkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICBzZWxmID0gbmV3Y29tcG9iamVjdCgmRGVjb21wdHlwZSk7CiAgICAgaWYgKHNlbGYgPT0gTlVMTCkKLQlyZXR1cm4oTlVMTCk7CisgICAgICAgIHJldHVybihOVUxMKTsKICAgICBzZWxmLT56c3QuemFsbG9jID0gKGFsbG9jX2Z1bmMpTlVMTDsKICAgICBzZWxmLT56c3QuemZyZWUgPSAoZnJlZV9mdW5jKVpfTlVMTDsKICAgICBzZWxmLT56c3QubmV4dF9pbiA9IE5VTEw7CkBAIC0zNDMsMjEgKzM0MywyMSBAQAogICAgIGVyciA9IGluZmxhdGVJbml0Migmc2VsZi0+enN0LCB3Yml0cyk7CiAgICAgc3dpdGNoKGVycikgewogICAgIGNhc2UgKFpfT0spOgotCXNlbGYtPmlzX2luaXRpYWxpc2VkID0gMTsKLQlyZXR1cm4gKFB5T2JqZWN0KilzZWxmOworICAgICAgICBzZWxmLT5pc19pbml0aWFsaXNlZCA9IDE7CisgICAgICAgIHJldHVybiAoUHlPYmplY3QqKXNlbGY7CiAgICAgY2FzZShaX1NUUkVBTV9FUlJPUik6Ci0JUHlfREVDUkVGKHNlbGYpOwotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiSW52YWxpZCBpbml0aWFsaXphdGlvbiBvcHRpb24iKTsKLQlyZXR1cm4gTlVMTDsKLSAgICBjYXNlIChaX01FTV9FUlJPUik6Ci0JUHlfREVDUkVGKHNlbGYpOwotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19NZW1vcnlFcnJvciwKLQkJCSJDYW4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGRlY29tcHJlc3Npb24gb2JqZWN0Iik7Ci0JcmV0dXJuIE5VTEw7Ci0gICAgZGVmYXVsdDoKLQl6bGliX2Vycm9yKHNlbGYtPnpzdCwgZXJyLCAid2hpbGUgY3JlYXRpbmcgZGVjb21wcmVzc2lvbiBvYmplY3QiKTsKICAgICAgICAgUHlfREVDUkVGKHNlbGYpOwotCXJldHVybiBOVUxMOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIkludmFsaWQgaW5pdGlhbGl6YXRpb24gb3B0aW9uIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIGNhc2UgKFpfTUVNX0VSUk9SKToKKyAgICAgICAgUHlfREVDUkVGKHNlbGYpOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTWVtb3J5RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiQ2FuJ3QgYWxsb2NhdGUgbWVtb3J5IGZvciBkZWNvbXByZXNzaW9uIG9iamVjdCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBkZWZhdWx0OgorICAgICAgICB6bGliX2Vycm9yKHNlbGYtPnpzdCwgZXJyLCAid2hpbGUgY3JlYXRpbmcgZGVjb21wcmVzc2lvbiBvYmplY3QiKTsKKyAgICAgICAgUHlfREVDUkVGKHNlbGYpOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiB9CiAKQEAgLTM2NSw3ICszNjUsNyBAQAogQ29tcF9kZWFsbG9jKGNvbXBvYmplY3QgKnNlbGYpCiB7CiAgICAgaWYgKHNlbGYtPmlzX2luaXRpYWxpc2VkKQotCWRlZmxhdGVFbmQoJnNlbGYtPnpzdCk7CisgICAgICAgIGRlZmxhdGVFbmQoJnNlbGYtPnpzdCk7CiAgICAgUHlfWERFQ1JFRihzZWxmLT51bnVzZWRfZGF0YSk7CiAgICAgUHlfWERFQ1JFRihzZWxmLT51bmNvbnN1bWVkX3RhaWwpOwogICAgIFB5T2JqZWN0X0RlbChzZWxmKTsKQEAgLTM3NSw3ICszNzUsNyBAQAogRGVjb21wX2RlYWxsb2MoY29tcG9iamVjdCAqc2VsZikKIHsKICAgICBpZiAoc2VsZi0+aXNfaW5pdGlhbGlzZWQpCi0JaW5mbGF0ZUVuZCgmc2VsZi0+enN0KTsKKyAgICAgICAgaW5mbGF0ZUVuZCgmc2VsZi0+enN0KTsKICAgICBQeV9YREVDUkVGKHNlbGYtPnVudXNlZF9kYXRhKTsKICAgICBQeV9YREVDUkVGKHNlbGYtPnVuY29uc3VtZWRfdGFpbCk7CiAgICAgUHlPYmplY3RfRGVsKHNlbGYpOwpAQCAtMzk5LDEwICszOTksMTAgQEAKICAgICB1bnNpZ25lZCBsb25nIHN0YXJ0X3RvdGFsX291dDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyM6Y29tcHJlc3MiLCAmaW5wdXQsICZpbnBsZW4pKQotCXJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIGlmICghKFJldFZhbCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGxlbmd0aCkpKQotCXJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIEVOVEVSX1pMSUIKIApAQCAtNDE5LDE2ICs0MTksMTYgQEAKICAgICAvKiB3aGlsZSBaX09LIGFuZCB0aGUgb3V0cHV0IGJ1ZmZlciBpcyBmdWxsLCB0aGVyZSBtaWdodCBiZSBtb3JlIG91dHB1dCwKICAgICAgICBzbyBleHRlbmQgdGhlIG91dHB1dCBidWZmZXIgYW5kIHRyeSBhZ2FpbiAqLwogICAgIHdoaWxlIChlcnIgPT0gWl9PSyAmJiBzZWxmLT56c3QuYXZhaWxfb3V0ID09IDApIHsKLQlpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmUmV0VmFsLCBsZW5ndGggPDwgMSkgPCAwKQotCSAgICBnb3RvIGVycm9yOwotCXNlbGYtPnpzdC5uZXh0X291dCA9ICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQVNfU1RSSU5HKFJldFZhbCkgXAotCSAgICArIGxlbmd0aDsKLQlzZWxmLT56c3QuYXZhaWxfb3V0ID0gbGVuZ3RoOwotCWxlbmd0aCA9IGxlbmd0aCA8PCAxOworICAgICAgICBpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmUmV0VmFsLCBsZW5ndGggPDwgMSkgPCAwKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgc2VsZi0+enN0Lm5leHRfb3V0ID0gKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19BU19TVFJJTkcoUmV0VmFsKSBcCisgICAgICAgICAgICArIGxlbmd0aDsKKyAgICAgICAgc2VsZi0+enN0LmF2YWlsX291dCA9IGxlbmd0aDsKKyAgICAgICAgbGVuZ3RoID0gbGVuZ3RoIDw8IDE7CiAKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JZXJyID0gZGVmbGF0ZSgmKHNlbGYtPnpzdCksIFpfTk9fRkxVU0gpOwotCVB5X0VORF9BTExPV19USFJFQURTCisgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgZXJyID0gZGVmbGF0ZSgmKHNlbGYtPnpzdCksIFpfTk9fRkxVU0gpOworICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogICAgIH0KICAgICAvKiBXZSB3aWxsIG9ubHkgZ2V0IFpfQlVGX0VSUk9SIGlmIHRoZSBvdXRwdXQgYnVmZmVyIHdhcyBmdWxsIGJ1dAogICAgICAgIHRoZXJlIHdhc24ndCBtb3JlIG91dHB1dCB3aGVuIHdlIHRyaWVkIGFnYWluLCBzbyBpdCBpcyBub3QgYW4gZXJyb3IKQEAgLTQzNiwxMCArNDM2LDEwIEBACiAgICAgKi8KIAogICAgIGlmIChlcnIgIT0gWl9PSyAmJiBlcnIgIT0gWl9CVUZfRVJST1IpIHsKLQl6bGliX2Vycm9yKHNlbGYtPnpzdCwgZXJyLCAid2hpbGUgY29tcHJlc3NpbmciKTsKLQlQeV9ERUNSRUYoUmV0VmFsKTsKLQlSZXRWYWwgPSBOVUxMOwotCWdvdG8gZXJyb3I7CisgICAgICAgIHpsaWJfZXJyb3Ioc2VsZi0+enN0LCBlcnIsICJ3aGlsZSBjb21wcmVzc2luZyIpOworICAgICAgICBQeV9ERUNSRUYoUmV0VmFsKTsKKyAgICAgICAgUmV0VmFsID0gTlVMTDsKKyAgICAgICAgZ290byBlcnJvcjsKICAgICB9CiAgICAgX1B5U3RyaW5nX1Jlc2l6ZSgmUmV0VmFsLCBzZWxmLT56c3QudG90YWxfb3V0IC0gc3RhcnRfdG90YWxfb3V0KTsKIApAQCAtNDY5LDE5ICs0NjksMTkgQEAKICAgICB1bnNpZ25lZCBsb25nIHN0YXJ0X3RvdGFsX291dDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyN8aTpkZWNvbXByZXNzIiwgJmlucHV0LAotCQkJICAmaW5wbGVuLCAmbWF4X2xlbmd0aCkpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnBsZW4sICZtYXhfbGVuZ3RoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgaWYgKG1heF9sZW5ndGggPCAwKSB7Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkibWF4X2xlbmd0aCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvIik7Ci0JcmV0dXJuIE5VTEw7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIm1heF9sZW5ndGggbXVzdCBiZSBncmVhdGVyIHRoYW4gemVybyIpOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKICAgICAvKiBsaW1pdCBhbW91bnQgb2YgZGF0YSBhbGxvY2F0ZWQgdG8gbWF4X2xlbmd0aCAqLwogICAgIGlmIChtYXhfbGVuZ3RoICYmIGxlbmd0aCA+IG1heF9sZW5ndGgpCi0JbGVuZ3RoID0gbWF4X2xlbmd0aDsKKyAgICAgICAgbGVuZ3RoID0gbWF4X2xlbmd0aDsKICAgICBpZiAoIShSZXRWYWwgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBsZW5ndGgpKSkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICBFTlRFUl9aTElCCiAKQEAgLTQ5OSw0MCArNDk5LDQwIEBACiAgICAgICAgU28gZXh0ZW5kIHRoZSBvdXRwdXQgYnVmZmVyIGFuZCB0cnkgYWdhaW4uCiAgICAgKi8KICAgICB3aGlsZSAoZXJyID09IFpfT0sgJiYgc2VsZi0+enN0LmF2YWlsX291dCA9PSAwKSB7Ci0JLyogSWYgbWF4X2xlbmd0aCBzZXQsIGRvbid0IGNvbnRpbnVlIGRlY29tcHJlc3NpbmcgaWYgd2UndmUgYWxyZWFkeQotCSAgIHJlYWNoZWQgdGhlIGxpbWl0LgotCSovCi0JaWYgKG1heF9sZW5ndGggJiYgbGVuZ3RoID49IG1heF9sZW5ndGgpCi0JICAgIGJyZWFrOworICAgICAgICAvKiBJZiBtYXhfbGVuZ3RoIHNldCwgZG9uJ3QgY29udGludWUgZGVjb21wcmVzc2luZyBpZiB3ZSd2ZSBhbHJlYWR5CisgICAgICAgICAgIHJlYWNoZWQgdGhlIGxpbWl0LgorICAgICAgICAqLworICAgICAgICBpZiAobWF4X2xlbmd0aCAmJiBsZW5ndGggPj0gbWF4X2xlbmd0aCkKKyAgICAgICAgICAgIGJyZWFrOwogCi0JLyogb3RoZXJ3aXNlLCAuLi4gKi8KLQlvbGRfbGVuZ3RoID0gbGVuZ3RoOwotCWxlbmd0aCA9IGxlbmd0aCA8PCAxOwotCWlmIChtYXhfbGVuZ3RoICYmIGxlbmd0aCA+IG1heF9sZW5ndGgpCi0JICAgIGxlbmd0aCA9IG1heF9sZW5ndGg7CisgICAgICAgIC8qIG90aGVyd2lzZSwgLi4uICovCisgICAgICAgIG9sZF9sZW5ndGggPSBsZW5ndGg7CisgICAgICAgIGxlbmd0aCA9IGxlbmd0aCA8PCAxOworICAgICAgICBpZiAobWF4X2xlbmd0aCAmJiBsZW5ndGggPiBtYXhfbGVuZ3RoKQorICAgICAgICAgICAgbGVuZ3RoID0gbWF4X2xlbmd0aDsKIAotCWlmIChfUHlTdHJpbmdfUmVzaXplKCZSZXRWYWwsIGxlbmd0aCkgPCAwKQotCSAgICBnb3RvIGVycm9yOwotCXNlbGYtPnpzdC5uZXh0X291dCA9ICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQVNfU1RSSU5HKFJldFZhbCkgXAotCSAgICArIG9sZF9sZW5ndGg7Ci0Jc2VsZi0+enN0LmF2YWlsX291dCA9IGxlbmd0aCAtIG9sZF9sZW5ndGg7CisgICAgICAgIGlmIChfUHlTdHJpbmdfUmVzaXplKCZSZXRWYWwsIGxlbmd0aCkgPCAwKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgc2VsZi0+enN0Lm5leHRfb3V0ID0gKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19BU19TVFJJTkcoUmV0VmFsKSBcCisgICAgICAgICAgICArIG9sZF9sZW5ndGg7CisgICAgICAgIHNlbGYtPnpzdC5hdmFpbF9vdXQgPSBsZW5ndGggLSBvbGRfbGVuZ3RoOwogCi0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCWVyciA9IGluZmxhdGUoJihzZWxmLT56c3QpLCBaX1NZTkNfRkxVU0gpOwotCVB5X0VORF9BTExPV19USFJFQURTCisgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgZXJyID0gaW5mbGF0ZSgmKHNlbGYtPnpzdCksIFpfU1lOQ19GTFVTSCk7CisgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCiAgICAgfQogCiAgICAgLyogTm90IGFsbCBvZiB0aGUgY29tcHJlc3NlZCBkYXRhIGNvdWxkIGJlIGFjY29tbW9kYXRlZCBpbiB0aGUgb3V0cHV0IGJ1ZmZlcgogICAgICAgIG9mIHNwZWNpZmllZCBzaXplLiBSZXR1cm4gdGhlIHVuY29uc3VtZWQgdGFpbCBpbiBhbiBhdHRyaWJ1dGUuKi8KICAgICBpZihtYXhfbGVuZ3RoKSB7Ci0JUHlfREVDUkVGKHNlbGYtPnVuY29uc3VtZWRfdGFpbCk7Ci0Jc2VsZi0+dW5jb25zdW1lZF90YWlsID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilzZWxmLT56c3QubmV4dF9pbiwKLQkJCQkJCQkgICBzZWxmLT56c3QuYXZhaWxfaW4pOwotCWlmKCFzZWxmLT51bmNvbnN1bWVkX3RhaWwpIHsKLQkgICAgUHlfREVDUkVGKFJldFZhbCk7Ci0JICAgIFJldFZhbCA9IE5VTEw7Ci0JICAgIGdvdG8gZXJyb3I7Ci0JfQorICAgICAgICBQeV9ERUNSRUYoc2VsZi0+dW5jb25zdW1lZF90YWlsKTsKKyAgICAgICAgc2VsZi0+dW5jb25zdW1lZF90YWlsID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilzZWxmLT56c3QubmV4dF9pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+enN0LmF2YWlsX2luKTsKKyAgICAgICAgaWYoIXNlbGYtPnVuY29uc3VtZWRfdGFpbCkgeworICAgICAgICAgICAgUHlfREVDUkVGKFJldFZhbCk7CisgICAgICAgICAgICBSZXRWYWwgPSBOVUxMOworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qIFRoZSBlbmQgb2YgdGhlIGNvbXByZXNzZWQgZGF0YSBoYXMgYmVlbiByZWFjaGVkLCBzbyBzZXQgdGhlCkBAIC01NDIsMjIgKzU0MiwyMiBAQAogICAgICAgIHByZXNlcnZlZC4KICAgICAqLwogICAgIGlmIChlcnIgPT0gWl9TVFJFQU1fRU5EKSB7Ci0JUHlfWERFQ1JFRihzZWxmLT51bnVzZWRfZGF0YSk7ICAvKiBGcmVlIG9yaWdpbmFsIGVtcHR5IHN0cmluZyAqLwotCXNlbGYtPnVudXNlZF9kYXRhID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoCi0JICAgIChjaGFyICopc2VsZi0+enN0Lm5leHRfaW4sIHNlbGYtPnpzdC5hdmFpbF9pbik7Ci0JaWYgKHNlbGYtPnVudXNlZF9kYXRhID09IE5VTEwpIHsKLQkgICAgUHlfREVDUkVGKFJldFZhbCk7Ci0JICAgIGdvdG8gZXJyb3I7Ci0JfQotCS8qIFdlIHdpbGwgb25seSBnZXQgWl9CVUZfRVJST1IgaWYgdGhlIG91dHB1dCBidWZmZXIgd2FzIGZ1bGwKLQkgICBidXQgdGhlcmUgd2Fzbid0IG1vcmUgb3V0cHV0IHdoZW4gd2UgdHJpZWQgYWdhaW4sIHNvIGl0IGlzCi0JICAgbm90IGFuIGVycm9yIGNvbmRpdGlvbi4KLQkqLworICAgICAgICBQeV9YREVDUkVGKHNlbGYtPnVudXNlZF9kYXRhKTsgIC8qIEZyZWUgb3JpZ2luYWwgZW1wdHkgc3RyaW5nICovCisgICAgICAgIHNlbGYtPnVudXNlZF9kYXRhID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoCisgICAgICAgICAgICAoY2hhciAqKXNlbGYtPnpzdC5uZXh0X2luLCBzZWxmLT56c3QuYXZhaWxfaW4pOworICAgICAgICBpZiAoc2VsZi0+dW51c2VkX2RhdGEgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKFJldFZhbCk7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgICAgIC8qIFdlIHdpbGwgb25seSBnZXQgWl9CVUZfRVJST1IgaWYgdGhlIG91dHB1dCBidWZmZXIgd2FzIGZ1bGwKKyAgICAgICAgICAgYnV0IHRoZXJlIHdhc24ndCBtb3JlIG91dHB1dCB3aGVuIHdlIHRyaWVkIGFnYWluLCBzbyBpdCBpcworICAgICAgICAgICBub3QgYW4gZXJyb3IgY29uZGl0aW9uLgorICAgICAgICAqLwogICAgIH0gZWxzZSBpZiAoZXJyICE9IFpfT0sgJiYgZXJyICE9IFpfQlVGX0VSUk9SKSB7Ci0JemxpYl9lcnJvcihzZWxmLT56c3QsIGVyciwgIndoaWxlIGRlY29tcHJlc3NpbmciKTsKLQlQeV9ERUNSRUYoUmV0VmFsKTsKLQlSZXRWYWwgPSBOVUxMOwotCWdvdG8gZXJyb3I7CisgICAgICAgIHpsaWJfZXJyb3Ioc2VsZi0+enN0LCBlcnIsICJ3aGlsZSBkZWNvbXByZXNzaW5nIik7CisgICAgICAgIFB5X0RFQ1JFRihSZXRWYWwpOworICAgICAgICBSZXRWYWwgPSBOVUxMOworICAgICAgICBnb3RvIGVycm9yOwogICAgIH0KIAogICAgIF9QeVN0cmluZ19SZXNpemUoJlJldFZhbCwgc2VsZi0+enN0LnRvdGFsX291dCAtIHN0YXJ0X3RvdGFsX291dCk7CkBAIC01ODUsMTYgKzU4NSwxNiBAQAogICAgIHVuc2lnbmVkIGxvbmcgc3RhcnRfdG90YWxfb3V0OwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8aTpmbHVzaCIsICZmbHVzaG1vZGUpKQotCXJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIC8qIEZsdXNoaW5nIHdpdGggWl9OT19GTFVTSCBpcyBhIG5vLW9wLCBzbyB0aGVyZSdzIG5vIHBvaW50IGluCiAgICAgICAgZG9pbmcgYW55IHdvcmsgYXQgYWxsOyBqdXN0IHJldHVybiBhbiBlbXB0eSBzdHJpbmcuICovCiAgICAgaWYgKGZsdXNobW9kZSA9PSBaX05PX0ZMVVNIKSB7Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIDApOworICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgMCk7CiAgICAgfQogCiAgICAgaWYgKCEoUmV0VmFsID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbGVuZ3RoKSkpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgRU5URVJfWkxJQgogCkBAIC02MTAsNDEgKzYxMCw0MSBAQAogICAgIC8qIHdoaWxlIFpfT0sgYW5kIHRoZSBvdXRwdXQgYnVmZmVyIGlzIGZ1bGwsIHRoZXJlIG1pZ2h0IGJlIG1vcmUgb3V0cHV0LAogICAgICAgIHNvIGV4dGVuZCB0aGUgb3V0cHV0IGJ1ZmZlciBhbmQgdHJ5IGFnYWluICovCiAgICAgd2hpbGUgKGVyciA9PSBaX09LICYmIHNlbGYtPnpzdC5hdmFpbF9vdXQgPT0gMCkgewotCWlmIChfUHlTdHJpbmdfUmVzaXplKCZSZXRWYWwsIGxlbmd0aCA8PCAxKSA8IDApCi0JICAgIGdvdG8gZXJyb3I7Ci0Jc2VsZi0+enN0Lm5leHRfb3V0ID0gKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19BU19TVFJJTkcoUmV0VmFsKSBcCi0JICAgICsgbGVuZ3RoOwotCXNlbGYtPnpzdC5hdmFpbF9vdXQgPSBsZW5ndGg7Ci0JbGVuZ3RoID0gbGVuZ3RoIDw8IDE7CisgICAgICAgIGlmIChfUHlTdHJpbmdfUmVzaXplKCZSZXRWYWwsIGxlbmd0aCA8PCAxKSA8IDApCisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICBzZWxmLT56c3QubmV4dF9vdXQgPSAodW5zaWduZWQgY2hhciAqKVB5U3RyaW5nX0FTX1NUUklORyhSZXRWYWwpIFwKKyAgICAgICAgICAgICsgbGVuZ3RoOworICAgICAgICBzZWxmLT56c3QuYXZhaWxfb3V0ID0gbGVuZ3RoOworICAgICAgICBsZW5ndGggPSBsZW5ndGggPDwgMTsKIAotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQllcnIgPSBkZWZsYXRlKCYoc2VsZi0+enN0KSwgZmx1c2htb2RlKTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgICAgIGVyciA9IGRlZmxhdGUoJihzZWxmLT56c3QpLCBmbHVzaG1vZGUpOworICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogICAgIH0KIAogICAgIC8qIElmIGZsdXNobW9kZSBpcyBaX0ZJTklTSCwgd2UgYWxzbyBoYXZlIHRvIGNhbGwgZGVmbGF0ZUVuZCgpIHRvIGZyZWUKICAgICAgICB2YXJpb3VzIGRhdGEgc3RydWN0dXJlcy4gTm90ZSB3ZSBzaG91bGQgb25seSBnZXQgWl9TVFJFQU1fRU5EIHdoZW4KICAgICAgICBmbHVzaG1vZGUgaXMgWl9GSU5JU0gsIGJ1dCBjaGVja2luZyBib3RoIGZvciBzYWZldHkqLwogICAgIGlmIChlcnIgPT0gWl9TVFJFQU1fRU5EICYmIGZsdXNobW9kZSA9PSBaX0ZJTklTSCkgewotCWVyciA9IGRlZmxhdGVFbmQoJihzZWxmLT56c3QpKTsKLQlpZiAoZXJyICE9IFpfT0spIHsKLQkgICAgemxpYl9lcnJvcihzZWxmLT56c3QsIGVyciwgImZyb20gZGVmbGF0ZUVuZCgpIik7Ci0JICAgIFB5X0RFQ1JFRihSZXRWYWwpOwotCSAgICBSZXRWYWwgPSBOVUxMOwotCSAgICBnb3RvIGVycm9yOwotCX0KLQllbHNlCi0JICAgIHNlbGYtPmlzX2luaXRpYWxpc2VkID0gMDsKKyAgICAgICAgZXJyID0gZGVmbGF0ZUVuZCgmKHNlbGYtPnpzdCkpOworICAgICAgICBpZiAoZXJyICE9IFpfT0spIHsKKyAgICAgICAgICAgIHpsaWJfZXJyb3Ioc2VsZi0+enN0LCBlcnIsICJmcm9tIGRlZmxhdGVFbmQoKSIpOworICAgICAgICAgICAgUHlfREVDUkVGKFJldFZhbCk7CisgICAgICAgICAgICBSZXRWYWwgPSBOVUxMOworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBzZWxmLT5pc19pbml0aWFsaXNlZCA9IDA7CiAKLQkvKiBXZSB3aWxsIG9ubHkgZ2V0IFpfQlVGX0VSUk9SIGlmIHRoZSBvdXRwdXQgYnVmZmVyIHdhcyBmdWxsCi0JICAgYnV0IHRoZXJlIHdhc24ndCBtb3JlIG91dHB1dCB3aGVuIHdlIHRyaWVkIGFnYWluLCBzbyBpdCBpcwotCSAgIG5vdCBhbiBlcnJvciBjb25kaXRpb24uCi0JKi8KKyAgICAgICAgLyogV2Ugd2lsbCBvbmx5IGdldCBaX0JVRl9FUlJPUiBpZiB0aGUgb3V0cHV0IGJ1ZmZlciB3YXMgZnVsbAorICAgICAgICAgICBidXQgdGhlcmUgd2Fzbid0IG1vcmUgb3V0cHV0IHdoZW4gd2UgdHJpZWQgYWdhaW4sIHNvIGl0IGlzCisgICAgICAgICAgIG5vdCBhbiBlcnJvciBjb25kaXRpb24uCisgICAgICAgICovCiAgICAgfSBlbHNlIGlmIChlcnIhPVpfT0sgJiYgZXJyIT1aX0JVRl9FUlJPUikgewotCXpsaWJfZXJyb3Ioc2VsZi0+enN0LCBlcnIsICJ3aGlsZSBmbHVzaGluZyIpOwotCVB5X0RFQ1JFRihSZXRWYWwpOwotCVJldFZhbCA9IE5VTEw7Ci0JZ290byBlcnJvcjsKKyAgICAgICAgemxpYl9lcnJvcihzZWxmLT56c3QsIGVyciwgIndoaWxlIGZsdXNoaW5nIik7CisgICAgICAgIFB5X0RFQ1JFRihSZXRWYWwpOworICAgICAgICBSZXRWYWwgPSBOVUxMOworICAgICAgICBnb3RvIGVycm9yOwogICAgIH0KIAogICAgIF9QeVN0cmluZ19SZXNpemUoJlJldFZhbCwgc2VsZi0+enN0LnRvdGFsX291dCAtIHN0YXJ0X3RvdGFsX291dCk7CkBAIC03NzQsMTMgKzc3NCwxMyBAQAogICAgIHVuc2lnbmVkIGxvbmcgc3RhcnRfdG90YWxfb3V0OwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8aTpmbHVzaCIsICZsZW5ndGgpKQotCXJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICBpZiAobGVuZ3RoIDw9IDApIHsKLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImxlbmd0aCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvIik7Ci0JcmV0dXJuIE5VTEw7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAibGVuZ3RoIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogICAgIGlmICghKHJldHZhbCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGxlbmd0aCkpKQotCXJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKIAogCiAgICAgRU5URVJfWkxJQgpAQCAtNzk2LDI5ICs3OTYsMjkgQEAKICAgICAvKiB3aGlsZSBaX09LIGFuZCB0aGUgb3V0cHV0IGJ1ZmZlciBpcyBmdWxsLCB0aGVyZSBtaWdodCBiZSBtb3JlIG91dHB1dCwKICAgICAgICBzbyBleHRlbmQgdGhlIG91dHB1dCBidWZmZXIgYW5kIHRyeSBhZ2FpbiAqLwogICAgIHdoaWxlICgoZXJyID09IFpfT0sgfHwgZXJyID09IFpfQlVGX0VSUk9SKSAmJiBzZWxmLT56c3QuYXZhaWxfb3V0ID09IDApIHsKLQlpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmcmV0dmFsLCBsZW5ndGggPDwgMSkgPCAwKQotCSAgICBnb3RvIGVycm9yOwotCXNlbGYtPnpzdC5uZXh0X291dCA9IChCeXRlICopUHlTdHJpbmdfQVNfU1RSSU5HKHJldHZhbCkgKyBsZW5ndGg7Ci0Jc2VsZi0+enN0LmF2YWlsX291dCA9IGxlbmd0aDsKLQlsZW5ndGggPSBsZW5ndGggPDwgMTsKKyAgICAgICAgaWYgKF9QeVN0cmluZ19SZXNpemUoJnJldHZhbCwgbGVuZ3RoIDw8IDEpIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIHNlbGYtPnpzdC5uZXh0X291dCA9IChCeXRlICopUHlTdHJpbmdfQVNfU1RSSU5HKHJldHZhbCkgKyBsZW5ndGg7CisgICAgICAgIHNlbGYtPnpzdC5hdmFpbF9vdXQgPSBsZW5ndGg7CisgICAgICAgIGxlbmd0aCA9IGxlbmd0aCA8PCAxOwogCi0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCWVyciA9IGluZmxhdGUoJihzZWxmLT56c3QpLCBaX0ZJTklTSCk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICBlcnIgPSBpbmZsYXRlKCYoc2VsZi0+enN0KSwgWl9GSU5JU0gpOworICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogICAgIH0KIAogICAgIC8qIElmIGZsdXNobW9kZSBpcyBaX0ZJTklTSCwgd2UgYWxzbyBoYXZlIHRvIGNhbGwgZGVmbGF0ZUVuZCgpIHRvIGZyZWUKICAgICAgICB2YXJpb3VzIGRhdGEgc3RydWN0dXJlcy4gTm90ZSB3ZSBzaG91bGQgb25seSBnZXQgWl9TVFJFQU1fRU5EIHdoZW4KICAgICAgICBmbHVzaG1vZGUgaXMgWl9GSU5JU0ggKi8KICAgICBpZiAoZXJyID09IFpfU1RSRUFNX0VORCkgewotCWVyciA9IGluZmxhdGVFbmQoJihzZWxmLT56c3QpKTsKKyAgICAgICAgZXJyID0gaW5mbGF0ZUVuZCgmKHNlbGYtPnpzdCkpOwogICAgICAgICBzZWxmLT5pc19pbml0aWFsaXNlZCA9IDA7Ci0JaWYgKGVyciAhPSBaX09LKSB7Ci0JICAgIHpsaWJfZXJyb3Ioc2VsZi0+enN0LCBlcnIsICJmcm9tIGluZmxhdGVFbmQoKSIpOwotCSAgICBQeV9ERUNSRUYocmV0dmFsKTsKLQkgICAgcmV0dmFsID0gTlVMTDsKLQkgICAgZ290byBlcnJvcjsKLQl9CisgICAgICAgIGlmIChlcnIgIT0gWl9PSykgeworICAgICAgICAgICAgemxpYl9lcnJvcihzZWxmLT56c3QsIGVyciwgImZyb20gaW5mbGF0ZUVuZCgpIik7CisgICAgICAgICAgICBQeV9ERUNSRUYocmV0dmFsKTsKKyAgICAgICAgICAgIHJldHZhbCA9IE5VTEw7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CiAgICAgfQogICAgIF9QeVN0cmluZ19SZXNpemUoJnJldHZhbCwgc2VsZi0+enN0LnRvdGFsX291dCAtIHN0YXJ0X3RvdGFsX291dCk7CiAKQEAgLTg3MiwxMyArODcyLDEzIEBACiAgICAgRU5URVJfWkxJQgogCiAgICAgaWYgKHN0cmNtcChuYW1lLCAidW51c2VkX2RhdGEiKSA9PSAwKSB7Ci0JUHlfSU5DUkVGKHNlbGYtPnVudXNlZF9kYXRhKTsKLQlyZXR2YWwgPSBzZWxmLT51bnVzZWRfZGF0YTsKKyAgICAgICAgUHlfSU5DUkVGKHNlbGYtPnVudXNlZF9kYXRhKTsKKyAgICAgICAgcmV0dmFsID0gc2VsZi0+dW51c2VkX2RhdGE7CiAgICAgfSBlbHNlIGlmIChzdHJjbXAobmFtZSwgInVuY29uc3VtZWRfdGFpbCIpID09IDApIHsKLQlQeV9JTkNSRUYoc2VsZi0+dW5jb25zdW1lZF90YWlsKTsKLQlyZXR2YWwgPSBzZWxmLT51bmNvbnN1bWVkX3RhaWw7CisgICAgICAgIFB5X0lOQ1JFRihzZWxmLT51bmNvbnN1bWVkX3RhaWwpOworICAgICAgICByZXR2YWwgPSBzZWxmLT51bmNvbnN1bWVkX3RhaWw7CiAgICAgfSBlbHNlCi0JcmV0dmFsID0gUHlfRmluZE1ldGhvZChEZWNvbXBfbWV0aG9kcywgKFB5T2JqZWN0ICopc2VsZiwgbmFtZSk7CisgICAgICAgIHJldHZhbCA9IFB5X0ZpbmRNZXRob2QoRGVjb21wX21ldGhvZHMsIChQeU9iamVjdCAqKXNlbGYsIG5hbWUpOwogCiAgICAgTEVBVkVfWkxJQgogCkBAIC04OTksNyArODk5LDcgQEAKICAgICBpbnQgbGVuLCBzaWduZWRfdmFsOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI3xJOmFkbGVyMzIiLCAmYnVmLCAmbGVuLCAmYWRsZXIzMnZhbCkpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIC8qIEluIFB5dGhvbiAyLnggd2UgcmV0dXJuIGEgc2lnbmVkIGludGVnZXIgcmVnYXJkbGVzcyBvZiBuYXRpdmUgcGxhdGZvcm0KICAgICAgKiBsb25nIHNpemUgKHRoZSAzMmJpdCB1bnNpZ25lZCBsb25nIGlzIHRyZWF0ZWQgYXMgMzItYml0IHNpZ25lZCBhbmQgc2lnbgogICAgICAqIGV4dGVuZGVkIGludG8gYSA2NC1iaXQgbG9uZyBpbnNpZGUgdGhlIGludGVnZXIgb2JqZWN0KS4gIDMuMCBkb2VzIHRoZQpAQCAtOTIyLDcgKzkyMiw3IEBACiAgICAgaW50IGxlbiwgc2lnbmVkX3ZhbDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyN8STpjcmMzMiIsICZidWYsICZsZW4sICZjcmMzMnZhbCkpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIC8qIEluIFB5dGhvbiAyLnggd2UgcmV0dXJuIGEgc2lnbmVkIGludGVnZXIgcmVnYXJkbGVzcyBvZiBuYXRpdmUgcGxhdGZvcm0KICAgICAgKiBsb25nIHNpemUgKHRoZSAzMmJpdCB1bnNpZ25lZCBsb25nIGlzIHRyZWF0ZWQgYXMgMzItYml0IHNpZ25lZCBhbmQgc2lnbgogICAgICAqIGV4dGVuZGVkIGludG8gYSA2NC1iaXQgbG9uZyBpbnNpZGUgdGhlIGludGVnZXIgb2JqZWN0KS4gIDMuMCBkb2VzIHRoZQpAQCAtMTAwMywxNSArMTAwMywxNSBAQAogICAgIFB5X1RZUEUoJkNvbXB0eXBlKSA9ICZQeVR5cGVfVHlwZTsKICAgICBQeV9UWVBFKCZEZWNvbXB0eXBlKSA9ICZQeVR5cGVfVHlwZTsKICAgICBtID0gUHlfSW5pdE1vZHVsZTQoInpsaWIiLCB6bGliX21ldGhvZHMsCi0JCSAgICAgICB6bGliX21vZHVsZV9kb2N1bWVudGF0aW9uLAotCQkgICAgICAgKFB5T2JqZWN0KilOVUxMLFBZVEhPTl9BUElfVkVSU0lPTik7CisgICAgICAgICAgICAgICAgICAgICAgIHpsaWJfbW9kdWxlX2RvY3VtZW50YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgIChQeU9iamVjdCopTlVMTCxQWVRIT05fQVBJX1ZFUlNJT04pOwogICAgIGlmIChtID09IE5VTEwpCi0JcmV0dXJuOworICAgICAgICByZXR1cm47CiAKICAgICBabGliRXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oInpsaWIuZXJyb3IiLCBOVUxMLCBOVUxMKTsKICAgICBpZiAoWmxpYkVycm9yICE9IE5VTEwpIHsKICAgICAgICAgUHlfSU5DUkVGKFpsaWJFcnJvcik7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJlcnJvciIsIFpsaWJFcnJvcik7CisgICAgICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiZXJyb3IiLCBabGliRXJyb3IpOwogICAgIH0KICAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTUFYX1dCSVRTIiwgTUFYX1dCSVRTKTsKICAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiREVGTEFURUQiLCBERUZMQVRFRCk7CkBAIC0xMDMwLDcgKzEwMzAsNyBAQAogCiAgICAgdmVyID0gUHlTdHJpbmdfRnJvbVN0cmluZyhaTElCX1ZFUlNJT04pOwogICAgIGlmICh2ZXIgIT0gTlVMTCkKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIlpMSUJfVkVSU0lPTiIsIHZlcik7CisgICAgICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiWkxJQl9WRVJTSU9OIiwgdmVyKTsKIAogICAgIFB5TW9kdWxlX0FkZFN0cmluZ0NvbnN0YW50KG0sICJfX3ZlcnNpb25fXyIsICIxLjAiKTsKIApkaWZmIC0tZ2l0IGEvT2JqZWN0cy9hYnN0cmFjdC5jIGIvT2JqZWN0cy9hYnN0cmFjdC5jCmluZGV4IDIyYTcyZTEuLmQ1M2IxN2YgMTAwNjQ0Ci0tLSBhL09iamVjdHMvYWJzdHJhY3QuYworKysgYi9PYmplY3RzL2Fic3RyYWN0LmMKQEAgLTYsNyArNiw3IEBACiAjaW5jbHVkZSAibG9uZ2ludHJlcHIuaCIKIAogI2RlZmluZSBORVdfU1RZTEVfTlVNQkVSKG8pIFB5VHlwZV9IYXNGZWF0dXJlKChvKS0+b2JfdHlwZSwgXAotCQkJCVB5X1RQRkxBR1NfQ0hFQ0tUWVBFUykKKyAgICAgICAgICAgICAgICBQeV9UUEZMQUdTX0NIRUNLVFlQRVMpCiAKIAogLyogU2hvcnRoYW5kcyB0byByZXR1cm4gY2VydGFpbiBlcnJvcnMgKi8KQEAgLTE0LDE3ICsxNCwxNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHR5cGVfZXJyb3IoY29uc3QgY2hhciAqbXNnLCBQeU9iamVjdCAqb2JqKQogewotCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsIG1zZywgb2JqLT5vYl90eXBlLT50cF9uYW1lKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCBtc2csIG9iai0+b2JfdHlwZS0+dHBfbmFtZSk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBudWxsX2Vycm9yKHZvaWQpCiB7Ci0JaWYgKCFQeUVycl9PY2N1cnJlZCgpKQotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCi0JCQkJIm51bGwgYXJndW1lbnQgdG8gaW50ZXJuYWwgcm91dGluZSIpOwotCXJldHVybiBOVUxMOworICAgIGlmICghUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIm51bGwgYXJndW1lbnQgdG8gaW50ZXJuYWwgcm91dGluZSIpOworICAgIHJldHVybiBOVUxMOwogfQogCiAvKiBPcGVyYXRpb25zIG9uIGFueSBvYmplY3QgKi8KQEAgLTMyLDUzICszMiw1MyBAQAogaW50CiBQeU9iamVjdF9DbXAoUHlPYmplY3QgKm8xLCBQeU9iamVjdCAqbzIsIGludCAqcmVzdWx0KQogewotCWludCByOworICAgIGludCByOwogCi0JaWYgKG8xID09IE5VTEwgfHwgbzIgPT0gTlVMTCkgewotCQludWxsX2Vycm9yKCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JciA9IFB5T2JqZWN0X0NvbXBhcmUobzEsIG8yKTsKLQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIC0xOwotCSpyZXN1bHQgPSByOwotCXJldHVybiAwOworICAgIGlmIChvMSA9PSBOVUxMIHx8IG8yID09IE5VTEwpIHsKKyAgICAgICAgbnVsbF9lcnJvcigpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHIgPSBQeU9iamVjdF9Db21wYXJlKG8xLCBvMik7CisgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiAtMTsKKyAgICAqcmVzdWx0ID0gcjsKKyAgICByZXR1cm4gMDsKIH0KIAogUHlPYmplY3QgKgogUHlPYmplY3RfVHlwZShQeU9iamVjdCAqbykKIHsKLQlQeU9iamVjdCAqdjsKKyAgICBQeU9iamVjdCAqdjsKIAotCWlmIChvID09IE5VTEwpCi0JCXJldHVybiBudWxsX2Vycm9yKCk7Ci0JdiA9IChQeU9iamVjdCAqKW8tPm9iX3R5cGU7Ci0JUHlfSU5DUkVGKHYpOwotCXJldHVybiB2OworICAgIGlmIChvID09IE5VTEwpCisgICAgICAgIHJldHVybiBudWxsX2Vycm9yKCk7CisgICAgdiA9IChQeU9iamVjdCAqKW8tPm9iX3R5cGU7CisgICAgUHlfSU5DUkVGKHYpOworICAgIHJldHVybiB2OwogfQogCiBQeV9zc2l6ZV90CiBQeU9iamVjdF9TaXplKFB5T2JqZWN0ICpvKQogewotCVB5U2VxdWVuY2VNZXRob2RzICptOworICAgIFB5U2VxdWVuY2VNZXRob2RzICptOwogCi0JaWYgKG8gPT0gTlVMTCkgewotCQludWxsX2Vycm9yKCk7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgaWYgKG8gPT0gTlVMTCkgeworICAgICAgICBudWxsX2Vycm9yKCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQltID0gby0+b2JfdHlwZS0+dHBfYXNfc2VxdWVuY2U7Ci0JaWYgKG0gJiYgbS0+c3FfbGVuZ3RoKQotCQlyZXR1cm4gbS0+c3FfbGVuZ3RoKG8pOworICAgIG0gPSBvLT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZTsKKyAgICBpZiAobSAmJiBtLT5zcV9sZW5ndGgpCisgICAgICAgIHJldHVybiBtLT5zcV9sZW5ndGgobyk7CiAKLQlyZXR1cm4gUHlNYXBwaW5nX1NpemUobyk7CisgICAgcmV0dXJuIFB5TWFwcGluZ19TaXplKG8pOwogfQogCiAjdW5kZWYgUHlPYmplY3RfTGVuZ3RoCiBQeV9zc2l6ZV90CiBQeU9iamVjdF9MZW5ndGgoUHlPYmplY3QgKm8pCiB7Ci0JcmV0dXJuIFB5T2JqZWN0X1NpemUobyk7CisgICAgcmV0dXJuIFB5T2JqZWN0X1NpemUobyk7CiB9CiAjZGVmaW5lIFB5T2JqZWN0X0xlbmd0aCBQeU9iamVjdF9TaXplCiAKQEAgLTkyLDI2MyArOTIsMjYzIEBACiBQeV9zc2l6ZV90CiBfUHlPYmplY3RfTGVuZ3RoSGludChQeU9iamVjdCAqbywgUHlfc3NpemVfdCBkZWZhdWx0dmFsdWUpCiB7Ci0Jc3RhdGljIFB5T2JqZWN0ICpoaW50c3Ryb2JqID0gTlVMTDsKLQlQeU9iamVjdCAqcm87Ci0JUHlfc3NpemVfdCBydjsKKyAgICBzdGF0aWMgUHlPYmplY3QgKmhpbnRzdHJvYmogPSBOVUxMOworICAgIFB5T2JqZWN0ICpybzsKKyAgICBQeV9zc2l6ZV90IHJ2OwogCi0JLyogdHJ5IG8uX19sZW5fXygpICovCi0JcnYgPSBQeU9iamVjdF9TaXplKG8pOwotCWlmIChydiA+PSAwKQotCQlyZXR1cm4gcnY7Ci0JaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKLQkJaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1R5cGVFcnJvcikgJiYKLQkJCSFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkKLQkJCQlyZXR1cm4gLTE7Ci0JCVB5RXJyX0NsZWFyKCk7Ci0JfQorICAgIC8qIHRyeSBvLl9fbGVuX18oKSAqLworICAgIHJ2ID0gUHlPYmplY3RfU2l6ZShvKTsKKyAgICBpZiAocnYgPj0gMCkKKyAgICAgICAgcmV0dXJuIHJ2OworICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgIGlmICghUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19UeXBlRXJyb3IpICYmCisgICAgICAgICAgICAhUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19BdHRyaWJ1dGVFcnJvcikpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBQeUVycl9DbGVhcigpOworICAgIH0KIAotCS8qIGNhY2hlIGEgaGFzaGVkIHZlcnNpb24gb2YgdGhlIGF0dHJpYnV0ZSBzdHJpbmcgKi8KLQlpZiAoaGludHN0cm9iaiA9PSBOVUxMKSB7Ci0JCWhpbnRzdHJvYmogPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2xlbmd0aF9oaW50X18iKTsKLQkJaWYgKGhpbnRzdHJvYmogPT0gTlVMTCkKLQkJCXJldHVybiAtMTsKLQl9CisgICAgLyogY2FjaGUgYSBoYXNoZWQgdmVyc2lvbiBvZiB0aGUgYXR0cmlidXRlIHN0cmluZyAqLworICAgIGlmIChoaW50c3Ryb2JqID09IE5VTEwpIHsKKyAgICAgICAgaGludHN0cm9iaiA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fbGVuZ3RoX2hpbnRfXyIpOworICAgICAgICBpZiAoaGludHN0cm9iaiA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCS8qIHRyeSBvLl9fbGVuZ3RoX2hpbnRfXygpICovCi0Jcm8gPSBQeU9iamVjdF9DYWxsTWV0aG9kT2JqQXJncyhvLCBoaW50c3Ryb2JqLCBOVUxMKTsKLQlpZiAocm8gPT0gTlVMTCkgewotCQlpZiAoIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfVHlwZUVycm9yKSAmJgotCQkJIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfQXR0cmlidXRlRXJyb3IpKQotCQkJCXJldHVybiAtMTsKLQkJUHlFcnJfQ2xlYXIoKTsKLQkJcmV0dXJuIGRlZmF1bHR2YWx1ZTsKLQl9Ci0JcnYgPSBQeUxvbmdfQ2hlY2socm8pID8gUHlMb25nX0FzU3NpemVfdChybykgOiBkZWZhdWx0dmFsdWU7Ci0JUHlfREVDUkVGKHJvKTsKLQlyZXR1cm4gcnY7CisgICAgLyogdHJ5IG8uX19sZW5ndGhfaGludF9fKCkgKi8KKyAgICBybyA9IFB5T2JqZWN0X0NhbGxNZXRob2RPYmpBcmdzKG8sIGhpbnRzdHJvYmosIE5VTEwpOworICAgIGlmIChybyA9PSBOVUxMKSB7CisgICAgICAgIGlmICghUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19UeXBlRXJyb3IpICYmCisgICAgICAgICAgICAhUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19BdHRyaWJ1dGVFcnJvcikpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICByZXR1cm4gZGVmYXVsdHZhbHVlOworICAgIH0KKyAgICBydiA9IFB5TG9uZ19DaGVjayhybykgPyBQeUxvbmdfQXNTc2l6ZV90KHJvKSA6IGRlZmF1bHR2YWx1ZTsKKyAgICBQeV9ERUNSRUYocm8pOworICAgIHJldHVybiBydjsKIH0KIAogUHlPYmplY3QgKgogUHlPYmplY3RfR2V0SXRlbShQeU9iamVjdCAqbywgUHlPYmplY3QgKmtleSkKIHsKLQlQeU1hcHBpbmdNZXRob2RzICptOworICAgIFB5TWFwcGluZ01ldGhvZHMgKm07CiAKLQlpZiAobyA9PSBOVUxMIHx8IGtleSA9PSBOVUxMKQotCQlyZXR1cm4gbnVsbF9lcnJvcigpOworICAgIGlmIChvID09IE5VTEwgfHwga2V5ID09IE5VTEwpCisgICAgICAgIHJldHVybiBudWxsX2Vycm9yKCk7CiAKLQltID0gby0+b2JfdHlwZS0+dHBfYXNfbWFwcGluZzsKLQlpZiAobSAmJiBtLT5tcF9zdWJzY3JpcHQpCi0JCXJldHVybiBtLT5tcF9zdWJzY3JpcHQobywga2V5KTsKKyAgICBtID0gby0+b2JfdHlwZS0+dHBfYXNfbWFwcGluZzsKKyAgICBpZiAobSAmJiBtLT5tcF9zdWJzY3JpcHQpCisgICAgICAgIHJldHVybiBtLT5tcF9zdWJzY3JpcHQobywga2V5KTsKIAotCWlmIChvLT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZSkgewotCQlpZiAoUHlJbmRleF9DaGVjayhrZXkpKSB7Ci0JCQlQeV9zc2l6ZV90IGtleV92YWx1ZTsKLQkJCWtleV92YWx1ZSA9IFB5TnVtYmVyX0FzU3NpemVfdChrZXksIFB5RXhjX0luZGV4RXJyb3IpOwotCQkJaWYgKGtleV92YWx1ZSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJCXJldHVybiBOVUxMOwotCQkJcmV0dXJuIFB5U2VxdWVuY2VfR2V0SXRlbShvLCBrZXlfdmFsdWUpOwotCQl9Ci0JCWVsc2UgaWYgKG8tPm9iX3R5cGUtPnRwX2FzX3NlcXVlbmNlLT5zcV9pdGVtKQotCQkJcmV0dXJuIHR5cGVfZXJyb3IoInNlcXVlbmNlIGluZGV4IG11c3QgIgotCQkJCQkgICJiZSBpbnRlZ2VyLCBub3QgJyUuMjAwcyciLCBrZXkpOwotCX0KKyAgICBpZiAoby0+b2JfdHlwZS0+dHBfYXNfc2VxdWVuY2UpIHsKKyAgICAgICAgaWYgKFB5SW5kZXhfQ2hlY2soa2V5KSkgeworICAgICAgICAgICAgUHlfc3NpemVfdCBrZXlfdmFsdWU7CisgICAgICAgICAgICBrZXlfdmFsdWUgPSBQeU51bWJlcl9Bc1NzaXplX3Qoa2V5LCBQeUV4Y19JbmRleEVycm9yKTsKKyAgICAgICAgICAgIGlmIChrZXlfdmFsdWUgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIHJldHVybiBQeVNlcXVlbmNlX0dldEl0ZW0obywga2V5X3ZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChvLT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZS0+c3FfaXRlbSkKKyAgICAgICAgICAgIHJldHVybiB0eXBlX2Vycm9yKCJzZXF1ZW5jZSBpbmRleCBtdXN0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiZSBpbnRlZ2VyLCBub3QgJyUuMjAwcyciLCBrZXkpOworICAgIH0KIAotCXJldHVybiB0eXBlX2Vycm9yKCInJS4yMDBzJyBvYmplY3QgaXMgdW5zdWJzY3JpcHRhYmxlIiwgbyk7CisgICAgcmV0dXJuIHR5cGVfZXJyb3IoIiclLjIwMHMnIG9iamVjdCBpcyB1bnN1YnNjcmlwdGFibGUiLCBvKTsKIH0KIAogaW50CiBQeU9iamVjdF9TZXRJdGVtKFB5T2JqZWN0ICpvLCBQeU9iamVjdCAqa2V5LCBQeU9iamVjdCAqdmFsdWUpCiB7Ci0JUHlNYXBwaW5nTWV0aG9kcyAqbTsKKyAgICBQeU1hcHBpbmdNZXRob2RzICptOwogCi0JaWYgKG8gPT0gTlVMTCB8fCBrZXkgPT0gTlVMTCB8fCB2YWx1ZSA9PSBOVUxMKSB7Ci0JCW51bGxfZXJyb3IoKTsKLQkJcmV0dXJuIC0xOwotCX0KLQltID0gby0+b2JfdHlwZS0+dHBfYXNfbWFwcGluZzsKLQlpZiAobSAmJiBtLT5tcF9hc3Nfc3Vic2NyaXB0KQotCQlyZXR1cm4gbS0+bXBfYXNzX3N1YnNjcmlwdChvLCBrZXksIHZhbHVlKTsKKyAgICBpZiAobyA9PSBOVUxMIHx8IGtleSA9PSBOVUxMIHx8IHZhbHVlID09IE5VTEwpIHsKKyAgICAgICAgbnVsbF9lcnJvcigpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG0gPSBvLT5vYl90eXBlLT50cF9hc19tYXBwaW5nOworICAgIGlmIChtICYmIG0tPm1wX2Fzc19zdWJzY3JpcHQpCisgICAgICAgIHJldHVybiBtLT5tcF9hc3Nfc3Vic2NyaXB0KG8sIGtleSwgdmFsdWUpOwogCi0JaWYgKG8tPm9iX3R5cGUtPnRwX2FzX3NlcXVlbmNlKSB7Ci0JCWlmIChQeUluZGV4X0NoZWNrKGtleSkpIHsKLQkJCVB5X3NzaXplX3Qga2V5X3ZhbHVlOwotCQkJa2V5X3ZhbHVlID0gUHlOdW1iZXJfQXNTc2l6ZV90KGtleSwgUHlFeGNfSW5kZXhFcnJvcik7Ci0JCQlpZiAoa2V5X3ZhbHVlID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCQkJcmV0dXJuIC0xOwotCQkJcmV0dXJuIFB5U2VxdWVuY2VfU2V0SXRlbShvLCBrZXlfdmFsdWUsIHZhbHVlKTsKLQkJfQotCQllbHNlIGlmIChvLT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZS0+c3FfYXNzX2l0ZW0pIHsKLQkJCXR5cGVfZXJyb3IoInNlcXVlbmNlIGluZGV4IG11c3QgYmUgIgotCQkJCSAgICJpbnRlZ2VyLCBub3QgJyUuMjAwcyciLCBrZXkpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQorICAgIGlmIChvLT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZSkgeworICAgICAgICBpZiAoUHlJbmRleF9DaGVjayhrZXkpKSB7CisgICAgICAgICAgICBQeV9zc2l6ZV90IGtleV92YWx1ZTsKKyAgICAgICAgICAgIGtleV92YWx1ZSA9IFB5TnVtYmVyX0FzU3NpemVfdChrZXksIFB5RXhjX0luZGV4RXJyb3IpOworICAgICAgICAgICAgaWYgKGtleV92YWx1ZSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIHJldHVybiBQeVNlcXVlbmNlX1NldEl0ZW0obywga2V5X3ZhbHVlLCB2YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoby0+b2JfdHlwZS0+dHBfYXNfc2VxdWVuY2UtPnNxX2Fzc19pdGVtKSB7CisgICAgICAgICAgICB0eXBlX2Vycm9yKCJzZXF1ZW5jZSBpbmRleCBtdXN0IGJlICIKKyAgICAgICAgICAgICAgICAgICAgICAgImludGVnZXIsIG5vdCAnJS4yMDBzJyIsIGtleSk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CiAKLQl0eXBlX2Vycm9yKCInJS4yMDBzJyBvYmplY3QgZG9lcyBub3Qgc3VwcG9ydCBpdGVtIGFzc2lnbm1lbnQiLCBvKTsKLQlyZXR1cm4gLTE7CisgICAgdHlwZV9lcnJvcigiJyUuMjAwcycgb2JqZWN0IGRvZXMgbm90IHN1cHBvcnQgaXRlbSBhc3NpZ25tZW50Iiwgbyk7CisgICAgcmV0dXJuIC0xOwogfQogCiBpbnQKIFB5T2JqZWN0X0RlbEl0ZW0oUHlPYmplY3QgKm8sIFB5T2JqZWN0ICprZXkpCiB7Ci0JUHlNYXBwaW5nTWV0aG9kcyAqbTsKKyAgICBQeU1hcHBpbmdNZXRob2RzICptOwogCi0JaWYgKG8gPT0gTlVMTCB8fCBrZXkgPT0gTlVMTCkgewotCQludWxsX2Vycm9yKCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JbSA9IG8tPm9iX3R5cGUtPnRwX2FzX21hcHBpbmc7Ci0JaWYgKG0gJiYgbS0+bXBfYXNzX3N1YnNjcmlwdCkKLQkJcmV0dXJuIG0tPm1wX2Fzc19zdWJzY3JpcHQobywga2V5LCAoUHlPYmplY3QqKU5VTEwpOworICAgIGlmIChvID09IE5VTEwgfHwga2V5ID09IE5VTEwpIHsKKyAgICAgICAgbnVsbF9lcnJvcigpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG0gPSBvLT5vYl90eXBlLT50cF9hc19tYXBwaW5nOworICAgIGlmIChtICYmIG0tPm1wX2Fzc19zdWJzY3JpcHQpCisgICAgICAgIHJldHVybiBtLT5tcF9hc3Nfc3Vic2NyaXB0KG8sIGtleSwgKFB5T2JqZWN0KilOVUxMKTsKIAotCWlmIChvLT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZSkgewotCQlpZiAoUHlJbmRleF9DaGVjayhrZXkpKSB7Ci0JCQlQeV9zc2l6ZV90IGtleV92YWx1ZTsKLQkJCWtleV92YWx1ZSA9IFB5TnVtYmVyX0FzU3NpemVfdChrZXksIFB5RXhjX0luZGV4RXJyb3IpOwotCQkJaWYgKGtleV92YWx1ZSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJCXJldHVybiAtMTsKLQkJCXJldHVybiBQeVNlcXVlbmNlX0RlbEl0ZW0obywga2V5X3ZhbHVlKTsKLQkJfQotCQllbHNlIGlmIChvLT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZS0+c3FfYXNzX2l0ZW0pIHsKLQkJCXR5cGVfZXJyb3IoInNlcXVlbmNlIGluZGV4IG11c3QgYmUgIgotCQkJCSAgICJpbnRlZ2VyLCBub3QgJyUuMjAwcyciLCBrZXkpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQorICAgIGlmIChvLT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZSkgeworICAgICAgICBpZiAoUHlJbmRleF9DaGVjayhrZXkpKSB7CisgICAgICAgICAgICBQeV9zc2l6ZV90IGtleV92YWx1ZTsKKyAgICAgICAgICAgIGtleV92YWx1ZSA9IFB5TnVtYmVyX0FzU3NpemVfdChrZXksIFB5RXhjX0luZGV4RXJyb3IpOworICAgICAgICAgICAgaWYgKGtleV92YWx1ZSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIHJldHVybiBQeVNlcXVlbmNlX0RlbEl0ZW0obywga2V5X3ZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChvLT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZS0+c3FfYXNzX2l0ZW0pIHsKKyAgICAgICAgICAgIHR5cGVfZXJyb3IoInNlcXVlbmNlIGluZGV4IG11c3QgYmUgIgorICAgICAgICAgICAgICAgICAgICAgICAiaW50ZWdlciwgbm90ICclLjIwMHMnIiwga2V5KTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KIAotCXR5cGVfZXJyb3IoIiclLjIwMHMnIG9iamVjdCBkb2VzIG5vdCBzdXBwb3J0IGl0ZW0gZGVsZXRpb24iLCBvKTsKLQlyZXR1cm4gLTE7CisgICAgdHlwZV9lcnJvcigiJyUuMjAwcycgb2JqZWN0IGRvZXMgbm90IHN1cHBvcnQgaXRlbSBkZWxldGlvbiIsIG8pOworICAgIHJldHVybiAtMTsKIH0KIAogaW50CiBQeU9iamVjdF9EZWxJdGVtU3RyaW5nKFB5T2JqZWN0ICpvLCBjaGFyICprZXkpCiB7Ci0JUHlPYmplY3QgKm9rZXk7Ci0JaW50IHJldDsKKyAgICBQeU9iamVjdCAqb2tleTsKKyAgICBpbnQgcmV0OwogCi0JaWYgKG8gPT0gTlVMTCB8fCBrZXkgPT0gTlVMTCkgewotCQludWxsX2Vycm9yKCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0Jb2tleSA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoa2V5KTsKLQlpZiAob2tleSA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0JcmV0ID0gUHlPYmplY3RfRGVsSXRlbShvLCBva2V5KTsKLQlQeV9ERUNSRUYob2tleSk7Ci0JcmV0dXJuIHJldDsKKyAgICBpZiAobyA9PSBOVUxMIHx8IGtleSA9PSBOVUxMKSB7CisgICAgICAgIG51bGxfZXJyb3IoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBva2V5ID0gUHlTdHJpbmdfRnJvbVN0cmluZyhrZXkpOworICAgIGlmIChva2V5ID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKyAgICByZXQgPSBQeU9iamVjdF9EZWxJdGVtKG8sIG9rZXkpOworICAgIFB5X0RFQ1JFRihva2V5KTsKKyAgICByZXR1cm4gcmV0OwogfQogCiBpbnQKIFB5T2JqZWN0X0FzQ2hhckJ1ZmZlcihQeU9iamVjdCAqb2JqLAotCQkJICBjb25zdCBjaGFyICoqYnVmZmVyLAotCQkJICBQeV9zc2l6ZV90ICpidWZmZXJfbGVuKQorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90ICpidWZmZXJfbGVuKQogewotCVB5QnVmZmVyUHJvY3MgKnBiOwotCWNoYXIgKnBwOwotCVB5X3NzaXplX3QgbGVuOworICAgIFB5QnVmZmVyUHJvY3MgKnBiOworICAgIGNoYXIgKnBwOworICAgIFB5X3NzaXplX3QgbGVuOwogCi0JaWYgKG9iaiA9PSBOVUxMIHx8IGJ1ZmZlciA9PSBOVUxMIHx8IGJ1ZmZlcl9sZW4gPT0gTlVMTCkgewotCQludWxsX2Vycm9yKCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JcGIgPSBvYmotPm9iX3R5cGUtPnRwX2FzX2J1ZmZlcjsKLQlpZiAocGIgPT0gTlVMTCB8fAotCSAgICAgcGItPmJmX2dldGNoYXJidWZmZXIgPT0gTlVMTCB8fAotCSAgICAgcGItPmJmX2dldHNlZ2NvdW50ID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiZXhwZWN0ZWQgYSBjaGFyYWN0ZXIgYnVmZmVyIG9iamVjdCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmICgoKnBiLT5iZl9nZXRzZWdjb3VudCkob2JqLE5VTEwpICE9IDEpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiZXhwZWN0ZWQgYSBzaW5nbGUtc2VnbWVudCBidWZmZXIgb2JqZWN0Iik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JbGVuID0gKCpwYi0+YmZfZ2V0Y2hhcmJ1ZmZlcikob2JqLCAwLCAmcHApOwotCWlmIChsZW4gPCAwKQotCQlyZXR1cm4gLTE7Ci0JKmJ1ZmZlciA9IHBwOwotCSpidWZmZXJfbGVuID0gbGVuOwotCXJldHVybiAwOworICAgIGlmIChvYmogPT0gTlVMTCB8fCBidWZmZXIgPT0gTlVMTCB8fCBidWZmZXJfbGVuID09IE5VTEwpIHsKKyAgICAgICAgbnVsbF9lcnJvcigpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHBiID0gb2JqLT5vYl90eXBlLT50cF9hc19idWZmZXI7CisgICAgaWYgKHBiID09IE5VTEwgfHwKKyAgICAgICAgIHBiLT5iZl9nZXRjaGFyYnVmZmVyID09IE5VTEwgfHwKKyAgICAgICAgIHBiLT5iZl9nZXRzZWdjb3VudCA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgYSBjaGFyYWN0ZXIgYnVmZmVyIG9iamVjdCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICgoKnBiLT5iZl9nZXRzZWdjb3VudCkob2JqLE5VTEwpICE9IDEpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBhIHNpbmdsZS1zZWdtZW50IGJ1ZmZlciBvYmplY3QiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBsZW4gPSAoKnBiLT5iZl9nZXRjaGFyYnVmZmVyKShvYmosIDAsICZwcCk7CisgICAgaWYgKGxlbiA8IDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICAqYnVmZmVyID0gcHA7CisgICAgKmJ1ZmZlcl9sZW4gPSBsZW47CisgICAgcmV0dXJuIDA7CiB9CiAKIGludAogUHlPYmplY3RfQ2hlY2tSZWFkQnVmZmVyKFB5T2JqZWN0ICpvYmopCiB7Ci0JUHlCdWZmZXJQcm9jcyAqcGIgPSBvYmotPm9iX3R5cGUtPnRwX2FzX2J1ZmZlcjsKKyAgICBQeUJ1ZmZlclByb2NzICpwYiA9IG9iai0+b2JfdHlwZS0+dHBfYXNfYnVmZmVyOwogCi0JaWYgKHBiID09IE5VTEwgfHwKLQkgICAgcGItPmJmX2dldHJlYWRidWZmZXIgPT0gTlVMTCB8fAotCSAgICBwYi0+YmZfZ2V0c2VnY291bnQgPT0gTlVMTCB8fAotCSAgICAoKnBiLT5iZl9nZXRzZWdjb3VudCkob2JqLCBOVUxMKSAhPSAxKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gMTsKKyAgICBpZiAocGIgPT0gTlVMTCB8fAorICAgICAgICBwYi0+YmZfZ2V0cmVhZGJ1ZmZlciA9PSBOVUxMIHx8CisgICAgICAgIHBiLT5iZl9nZXRzZWdjb3VudCA9PSBOVUxMIHx8CisgICAgICAgICgqcGItPmJmX2dldHNlZ2NvdW50KShvYmosIE5VTEwpICE9IDEpCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiAxOwogfQogCiBpbnQgUHlPYmplY3RfQXNSZWFkQnVmZmVyKFB5T2JqZWN0ICpvYmosCi0JCQkgIGNvbnN0IHZvaWQgKipidWZmZXIsCi0JCQkgIFB5X3NzaXplX3QgKmJ1ZmZlcl9sZW4pCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKipidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgKmJ1ZmZlcl9sZW4pCiB7Ci0JUHlCdWZmZXJQcm9jcyAqcGI7Ci0Jdm9pZCAqcHA7Ci0JUHlfc3NpemVfdCBsZW47CisgICAgUHlCdWZmZXJQcm9jcyAqcGI7CisgICAgdm9pZCAqcHA7CisgICAgUHlfc3NpemVfdCBsZW47CiAKLQlpZiAob2JqID09IE5VTEwgfHwgYnVmZmVyID09IE5VTEwgfHwgYnVmZmVyX2xlbiA9PSBOVUxMKSB7Ci0JCW51bGxfZXJyb3IoKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlwYiA9IG9iai0+b2JfdHlwZS0+dHBfYXNfYnVmZmVyOwotCWlmIChwYiA9PSBOVUxMIHx8Ci0JICAgICBwYi0+YmZfZ2V0cmVhZGJ1ZmZlciA9PSBOVUxMIHx8Ci0JICAgICBwYi0+YmZfZ2V0c2VnY291bnQgPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJleHBlY3RlZCBhIHJlYWRhYmxlIGJ1ZmZlciBvYmplY3QiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoKCpwYi0+YmZfZ2V0c2VnY291bnQpKG9iaiwgTlVMTCkgIT0gMSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJleHBlY3RlZCBhIHNpbmdsZS1zZWdtZW50IGJ1ZmZlciBvYmplY3QiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlsZW4gPSAoKnBiLT5iZl9nZXRyZWFkYnVmZmVyKShvYmosIDAsICZwcCk7Ci0JaWYgKGxlbiA8IDApCi0JCXJldHVybiAtMTsKLQkqYnVmZmVyID0gcHA7Ci0JKmJ1ZmZlcl9sZW4gPSBsZW47Ci0JcmV0dXJuIDA7CisgICAgaWYgKG9iaiA9PSBOVUxMIHx8IGJ1ZmZlciA9PSBOVUxMIHx8IGJ1ZmZlcl9sZW4gPT0gTlVMTCkgeworICAgICAgICBudWxsX2Vycm9yKCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcGIgPSBvYmotPm9iX3R5cGUtPnRwX2FzX2J1ZmZlcjsKKyAgICBpZiAocGIgPT0gTlVMTCB8fAorICAgICAgICAgcGItPmJmX2dldHJlYWRidWZmZXIgPT0gTlVMTCB8fAorICAgICAgICAgcGItPmJmX2dldHNlZ2NvdW50ID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBhIHJlYWRhYmxlIGJ1ZmZlciBvYmplY3QiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoKCpwYi0+YmZfZ2V0c2VnY291bnQpKG9iaiwgTlVMTCkgIT0gMSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIGEgc2luZ2xlLXNlZ21lbnQgYnVmZmVyIG9iamVjdCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGxlbiA9ICgqcGItPmJmX2dldHJlYWRidWZmZXIpKG9iaiwgMCwgJnBwKTsKKyAgICBpZiAobGVuIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgICpidWZmZXIgPSBwcDsKKyAgICAqYnVmZmVyX2xlbiA9IGxlbjsKKyAgICByZXR1cm4gMDsKIH0KIAogaW50IFB5T2JqZWN0X0FzV3JpdGVCdWZmZXIoUHlPYmplY3QgKm9iaiwKLQkJCSAgIHZvaWQgKipidWZmZXIsCi0JCQkgICBQeV9zc2l6ZV90ICpidWZmZXJfbGVuKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgKmJ1ZmZlcl9sZW4pCiB7Ci0JUHlCdWZmZXJQcm9jcyAqcGI7Ci0Jdm9pZCpwcDsKLQlQeV9zc2l6ZV90IGxlbjsKKyAgICBQeUJ1ZmZlclByb2NzICpwYjsKKyAgICB2b2lkKnBwOworICAgIFB5X3NzaXplX3QgbGVuOwogCi0JaWYgKG9iaiA9PSBOVUxMIHx8IGJ1ZmZlciA9PSBOVUxMIHx8IGJ1ZmZlcl9sZW4gPT0gTlVMTCkgewotCQludWxsX2Vycm9yKCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JcGIgPSBvYmotPm9iX3R5cGUtPnRwX2FzX2J1ZmZlcjsKLQlpZiAocGIgPT0gTlVMTCB8fAotCSAgICAgcGItPmJmX2dldHdyaXRlYnVmZmVyID09IE5VTEwgfHwKLQkgICAgIHBiLT5iZl9nZXRzZWdjb3VudCA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJImV4cGVjdGVkIGEgd3JpdGVhYmxlIGJ1ZmZlciBvYmplY3QiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoKCpwYi0+YmZfZ2V0c2VnY291bnQpKG9iaiwgTlVMTCkgIT0gMSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJleHBlY3RlZCBhIHNpbmdsZS1zZWdtZW50IGJ1ZmZlciBvYmplY3QiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlsZW4gPSAoKnBiLT5iZl9nZXR3cml0ZWJ1ZmZlcikob2JqLDAsJnBwKTsKLQlpZiAobGVuIDwgMCkKLQkJcmV0dXJuIC0xOwotCSpidWZmZXIgPSBwcDsKLQkqYnVmZmVyX2xlbiA9IGxlbjsKLQlyZXR1cm4gMDsKKyAgICBpZiAob2JqID09IE5VTEwgfHwgYnVmZmVyID09IE5VTEwgfHwgYnVmZmVyX2xlbiA9PSBOVUxMKSB7CisgICAgICAgIG51bGxfZXJyb3IoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBwYiA9IG9iai0+b2JfdHlwZS0+dHBfYXNfYnVmZmVyOworICAgIGlmIChwYiA9PSBOVUxMIHx8CisgICAgICAgICBwYi0+YmZfZ2V0d3JpdGVidWZmZXIgPT0gTlVMTCB8fAorICAgICAgICAgcGItPmJmX2dldHNlZ2NvdW50ID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBhIHdyaXRlYWJsZSBidWZmZXIgb2JqZWN0Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKCgqcGItPmJmX2dldHNlZ2NvdW50KShvYmosIE5VTEwpICE9IDEpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBhIHNpbmdsZS1zZWdtZW50IGJ1ZmZlciBvYmplY3QiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBsZW4gPSAoKnBiLT5iZl9nZXR3cml0ZWJ1ZmZlcikob2JqLDAsJnBwKTsKKyAgICBpZiAobGVuIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgICpidWZmZXIgPSBwcDsKKyAgICAqYnVmZmVyX2xlbiA9IGxlbjsKKyAgICByZXR1cm4gMDsKIH0KIAogLyogQnVmZmVyIEMtQVBJIGZvciBQeXRob24gMy4wICovCkBAIC0zNTYsMTE5ICszNTYsMTE5IEBACiBpbnQKIFB5T2JqZWN0X0dldEJ1ZmZlcihQeU9iamVjdCAqb2JqLCBQeV9idWZmZXIgKnZpZXcsIGludCBmbGFncykKIHsKLQlpZiAoIVB5T2JqZWN0X0NoZWNrQnVmZmVyKG9iaikpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiclMTAwcycgZG9lcyBub3QgaGF2ZSB0aGUgYnVmZmVyIGludGVyZmFjZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X1RZUEUob2JqKS0+dHBfbmFtZSk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JcmV0dXJuICgqKG9iai0+b2JfdHlwZS0+dHBfYXNfYnVmZmVyLT5iZl9nZXRidWZmZXIpKShvYmosIHZpZXcsIGZsYWdzKTsKKyAgICBpZiAoIVB5T2JqZWN0X0NoZWNrQnVmZmVyKG9iaikpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICInJTEwMHMnIGRvZXMgbm90IGhhdmUgdGhlIGJ1ZmZlciBpbnRlcmZhY2UiLAorICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRShvYmopLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gKCoob2JqLT5vYl90eXBlLT50cF9hc19idWZmZXItPmJmX2dldGJ1ZmZlcikpKG9iaiwgdmlldywgZmxhZ3MpOwogfQogCiBzdGF0aWMgaW50CiBfSXNGb3J0cmFuQ29udGlndW91cyhQeV9idWZmZXIgKnZpZXcpCiB7Ci0JUHlfc3NpemVfdCBzZCwgZGltOwotCWludCBpOworICAgIFB5X3NzaXplX3Qgc2QsIGRpbTsKKyAgICBpbnQgaTsKIAotCWlmICh2aWV3LT5uZGltID09IDApIHJldHVybiAxOwotCWlmICh2aWV3LT5zdHJpZGVzID09IE5VTEwpIHJldHVybiAodmlldy0+bmRpbSA9PSAxKTsKKyAgICBpZiAodmlldy0+bmRpbSA9PSAwKSByZXR1cm4gMTsKKyAgICBpZiAodmlldy0+c3RyaWRlcyA9PSBOVUxMKSByZXR1cm4gKHZpZXctPm5kaW0gPT0gMSk7CiAKLQlzZCA9IHZpZXctPml0ZW1zaXplOwotCWlmICh2aWV3LT5uZGltID09IDEpIHJldHVybiAodmlldy0+c2hhcGVbMF0gPT0gMSB8fAotCQkJCSAgIHNkID09IHZpZXctPnN0cmlkZXNbMF0pOwotCWZvciAoaT0wOyBpPHZpZXctPm5kaW07IGkrKykgewotCQlkaW0gPSB2aWV3LT5zaGFwZVtpXTsKLQkJaWYgKGRpbSA9PSAwKSByZXR1cm4gMTsKLQkJaWYgKHZpZXctPnN0cmlkZXNbaV0gIT0gc2QpIHJldHVybiAwOwotCQlzZCAqPSBkaW07Ci0JfQotCXJldHVybiAxOworICAgIHNkID0gdmlldy0+aXRlbXNpemU7CisgICAgaWYgKHZpZXctPm5kaW0gPT0gMSkgcmV0dXJuICh2aWV3LT5zaGFwZVswXSA9PSAxIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2QgPT0gdmlldy0+c3RyaWRlc1swXSk7CisgICAgZm9yIChpPTA7IGk8dmlldy0+bmRpbTsgaSsrKSB7CisgICAgICAgIGRpbSA9IHZpZXctPnNoYXBlW2ldOworICAgICAgICBpZiAoZGltID09IDApIHJldHVybiAxOworICAgICAgICBpZiAodmlldy0+c3RyaWRlc1tpXSAhPSBzZCkgcmV0dXJuIDA7CisgICAgICAgIHNkICo9IGRpbTsKKyAgICB9CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyBpbnQKIF9Jc0NDb250aWd1b3VzKFB5X2J1ZmZlciAqdmlldykKIHsKLQlQeV9zc2l6ZV90IHNkLCBkaW07Ci0JaW50IGk7CisgICAgUHlfc3NpemVfdCBzZCwgZGltOworICAgIGludCBpOwogCi0JaWYgKHZpZXctPm5kaW0gPT0gMCkgcmV0dXJuIDE7Ci0JaWYgKHZpZXctPnN0cmlkZXMgPT0gTlVMTCkgcmV0dXJuIDE7CisgICAgaWYgKHZpZXctPm5kaW0gPT0gMCkgcmV0dXJuIDE7CisgICAgaWYgKHZpZXctPnN0cmlkZXMgPT0gTlVMTCkgcmV0dXJuIDE7CiAKLQlzZCA9IHZpZXctPml0ZW1zaXplOwotCWlmICh2aWV3LT5uZGltID09IDEpIHJldHVybiAodmlldy0+c2hhcGVbMF0gPT0gMSB8fAotCQkJCSAgIHNkID09IHZpZXctPnN0cmlkZXNbMF0pOwotCWZvciAoaT12aWV3LT5uZGltLTE7IGk+PTA7IGktLSkgewotCQlkaW0gPSB2aWV3LT5zaGFwZVtpXTsKLQkJaWYgKGRpbSA9PSAwKSByZXR1cm4gMTsKLQkJaWYgKHZpZXctPnN0cmlkZXNbaV0gIT0gc2QpIHJldHVybiAwOwotCQlzZCAqPSBkaW07Ci0JfQotCXJldHVybiAxOworICAgIHNkID0gdmlldy0+aXRlbXNpemU7CisgICAgaWYgKHZpZXctPm5kaW0gPT0gMSkgcmV0dXJuICh2aWV3LT5zaGFwZVswXSA9PSAxIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2QgPT0gdmlldy0+c3RyaWRlc1swXSk7CisgICAgZm9yIChpPXZpZXctPm5kaW0tMTsgaT49MDsgaS0tKSB7CisgICAgICAgIGRpbSA9IHZpZXctPnNoYXBlW2ldOworICAgICAgICBpZiAoZGltID09IDApIHJldHVybiAxOworICAgICAgICBpZiAodmlldy0+c3RyaWRlc1tpXSAhPSBzZCkgcmV0dXJuIDA7CisgICAgICAgIHNkICo9IGRpbTsKKyAgICB9CisgICAgcmV0dXJuIDE7CiB9CiAKIGludAogUHlCdWZmZXJfSXNDb250aWd1b3VzKFB5X2J1ZmZlciAqdmlldywgY2hhciBmb3J0KQogewogCi0JaWYgKHZpZXctPnN1Ym9mZnNldHMgIT0gTlVMTCkgcmV0dXJuIDA7CisgICAgaWYgKHZpZXctPnN1Ym9mZnNldHMgIT0gTlVMTCkgcmV0dXJuIDA7CiAKLQlpZiAoZm9ydCA9PSAnQycpCi0JCXJldHVybiBfSXNDQ29udGlndW91cyh2aWV3KTsKLQllbHNlIGlmIChmb3J0ID09ICdGJykKLQkJcmV0dXJuIF9Jc0ZvcnRyYW5Db250aWd1b3VzKHZpZXcpOwotCWVsc2UgaWYgKGZvcnQgPT0gJ0EnKQotCQlyZXR1cm4gKF9Jc0NDb250aWd1b3VzKHZpZXcpIHx8IF9Jc0ZvcnRyYW5Db250aWd1b3VzKHZpZXcpKTsKLQlyZXR1cm4gMDsKKyAgICBpZiAoZm9ydCA9PSAnQycpCisgICAgICAgIHJldHVybiBfSXNDQ29udGlndW91cyh2aWV3KTsKKyAgICBlbHNlIGlmIChmb3J0ID09ICdGJykKKyAgICAgICAgcmV0dXJuIF9Jc0ZvcnRyYW5Db250aWd1b3VzKHZpZXcpOworICAgIGVsc2UgaWYgKGZvcnQgPT0gJ0EnKQorICAgICAgICByZXR1cm4gKF9Jc0NDb250aWd1b3VzKHZpZXcpIHx8IF9Jc0ZvcnRyYW5Db250aWd1b3VzKHZpZXcpKTsKKyAgICByZXR1cm4gMDsKIH0KIAogCiB2b2lkKgogUHlCdWZmZXJfR2V0UG9pbnRlcihQeV9idWZmZXIgKnZpZXcsIFB5X3NzaXplX3QgKmluZGljZXMpCiB7Ci0JY2hhciogcG9pbnRlcjsKLQlpbnQgaTsKLQlwb2ludGVyID0gKGNoYXIgKil2aWV3LT5idWY7Ci0JZm9yIChpID0gMDsgaSA8IHZpZXctPm5kaW07IGkrKykgewotCQlwb2ludGVyICs9IHZpZXctPnN0cmlkZXNbaV0qaW5kaWNlc1tpXTsKLQkJaWYgKCh2aWV3LT5zdWJvZmZzZXRzICE9IE5VTEwpICYmICh2aWV3LT5zdWJvZmZzZXRzW2ldID49IDApKSB7Ci0JCQlwb2ludGVyID0gKigoY2hhcioqKXBvaW50ZXIpICsgdmlldy0+c3Vib2Zmc2V0c1tpXTsKLQkJfQotCX0KLQlyZXR1cm4gKHZvaWQqKXBvaW50ZXI7CisgICAgY2hhciogcG9pbnRlcjsKKyAgICBpbnQgaTsKKyAgICBwb2ludGVyID0gKGNoYXIgKil2aWV3LT5idWY7CisgICAgZm9yIChpID0gMDsgaSA8IHZpZXctPm5kaW07IGkrKykgeworICAgICAgICBwb2ludGVyICs9IHZpZXctPnN0cmlkZXNbaV0qaW5kaWNlc1tpXTsKKyAgICAgICAgaWYgKCh2aWV3LT5zdWJvZmZzZXRzICE9IE5VTEwpICYmICh2aWV3LT5zdWJvZmZzZXRzW2ldID49IDApKSB7CisgICAgICAgICAgICBwb2ludGVyID0gKigoY2hhcioqKXBvaW50ZXIpICsgdmlldy0+c3Vib2Zmc2V0c1tpXTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gKHZvaWQqKXBvaW50ZXI7CiB9CiAKIAogc3RhdGljIHZvaWQKIF9hZGRfb25lX3RvX2luZGV4X0YoaW50IG5kLCBQeV9zc2l6ZV90ICppbmRleCwgUHlfc3NpemVfdCAqc2hhcGUpCiB7Ci0JaW50IGs7CisgICAgaW50IGs7CiAKLQlmb3IgKGs9MDsgazxuZDsgaysrKSB7Ci0JCWlmIChpbmRleFtrXSA8IHNoYXBlW2tdLTEpIHsKLQkJCWluZGV4W2tdKys7Ci0JCQlicmVhazsKLQkJfQotCQllbHNlIHsKLQkJCWluZGV4W2tdID0gMDsKLQkJfQotCX0KKyAgICBmb3IgKGs9MDsgazxuZDsgaysrKSB7CisgICAgICAgIGlmIChpbmRleFtrXSA8IHNoYXBlW2tdLTEpIHsKKyAgICAgICAgICAgIGluZGV4W2tdKys7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGluZGV4W2tdID0gMDsKKyAgICAgICAgfQorICAgIH0KIH0KIAogc3RhdGljIHZvaWQKIF9hZGRfb25lX3RvX2luZGV4X0MoaW50IG5kLCBQeV9zc2l6ZV90ICppbmRleCwgUHlfc3NpemVfdCAqc2hhcGUpCiB7Ci0JaW50IGs7CisgICAgaW50IGs7CiAKLQlmb3IgKGs9bmQtMTsgaz49MDsgay0tKSB7Ci0JCWlmIChpbmRleFtrXSA8IHNoYXBlW2tdLTEpIHsKLQkJCWluZGV4W2tdKys7Ci0JCQlicmVhazsKLQkJfQotCQllbHNlIHsKLQkJCWluZGV4W2tdID0gMDsKLQkJfQotCX0KKyAgICBmb3IgKGs9bmQtMTsgaz49MDsgay0tKSB7CisgICAgICAgIGlmIChpbmRleFtrXSA8IHNoYXBlW2tdLTEpIHsKKyAgICAgICAgICAgIGluZGV4W2tdKys7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGluZGV4W2tdID0gMDsKKyAgICAgICAgfQorICAgIH0KIH0KIAogICAvKiB2aWV3IGlzIG5vdCBjaGVja2VkIGZvciBjb25zaXN0ZW5jeSBpbiBlaXRoZXIgb2YgdGhlc2UuICBJdCBpcwpAQCAtNDc5LDM3NCArNDc5LDM3NCBAQAogaW50CiBQeUJ1ZmZlcl9Ub0NvbnRpZ3VvdXModm9pZCAqYnVmLCBQeV9idWZmZXIgKnZpZXcsIFB5X3NzaXplX3QgbGVuLCBjaGFyIGZvcnQpCiB7Ci0JaW50IGs7Ci0Jdm9pZCAoKmFkZG9uZSkoaW50LCBQeV9zc2l6ZV90ICosIFB5X3NzaXplX3QgKik7Ci0JUHlfc3NpemVfdCAqaW5kaWNlcywgZWxlbWVudHM7Ci0JY2hhciAqZGVzdCwgKnB0cjsKKyAgICBpbnQgazsKKyAgICB2b2lkICgqYWRkb25lKShpbnQsIFB5X3NzaXplX3QgKiwgUHlfc3NpemVfdCAqKTsKKyAgICBQeV9zc2l6ZV90ICppbmRpY2VzLCBlbGVtZW50czsKKyAgICBjaGFyICpkZXN0LCAqcHRyOwogCi0JaWYgKGxlbiA+IHZpZXctPmxlbikgewotCQlsZW4gPSB2aWV3LT5sZW47Ci0JfQorICAgIGlmIChsZW4gPiB2aWV3LT5sZW4pIHsKKyAgICAgICAgbGVuID0gdmlldy0+bGVuOworICAgIH0KIAotCWlmIChQeUJ1ZmZlcl9Jc0NvbnRpZ3VvdXModmlldywgZm9ydCkpIHsKLQkJLyogc2ltcGxlc3QgY29weSBpcyBhbGwgdGhhdCBpcyBuZWVkZWQgKi8KLQkJbWVtY3B5KGJ1Ziwgdmlldy0+YnVmLCBsZW4pOwotCQlyZXR1cm4gMDsKLQl9CisgICAgaWYgKFB5QnVmZmVyX0lzQ29udGlndW91cyh2aWV3LCBmb3J0KSkgeworICAgICAgICAvKiBzaW1wbGVzdCBjb3B5IGlzIGFsbCB0aGF0IGlzIG5lZWRlZCAqLworICAgICAgICBtZW1jcHkoYnVmLCB2aWV3LT5idWYsIGxlbik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KIAotCS8qIE90aGVyd2lzZSBhIG1vcmUgZWxhYm9yYXRlIHNjaGVtZSBpcyBuZWVkZWQgKi8KKyAgICAvKiBPdGhlcndpc2UgYSBtb3JlIGVsYWJvcmF0ZSBzY2hlbWUgaXMgbmVlZGVkICovCiAKLQkvKiBYWFgobm5vcndpdHopOiBuZWVkIHRvIGNoZWNrIGZvciBvdmVyZmxvdyEgKi8KLQlpbmRpY2VzID0gKFB5X3NzaXplX3QgKilQeU1lbV9NYWxsb2Moc2l6ZW9mKFB5X3NzaXplX3QpKih2aWV3LT5uZGltKSk7Ci0JaWYgKGluZGljZXMgPT0gTlVMTCkgewotCQlQeUVycl9Ob01lbW9yeSgpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWZvciAoaz0wOyBrPHZpZXctPm5kaW07aysrKSB7Ci0JCWluZGljZXNba10gPSAwOwotCX0KKyAgICAvKiBYWFgobm5vcndpdHopOiBuZWVkIHRvIGNoZWNrIGZvciBvdmVyZmxvdyEgKi8KKyAgICBpbmRpY2VzID0gKFB5X3NzaXplX3QgKilQeU1lbV9NYWxsb2Moc2l6ZW9mKFB5X3NzaXplX3QpKih2aWV3LT5uZGltKSk7CisgICAgaWYgKGluZGljZXMgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGZvciAoaz0wOyBrPHZpZXctPm5kaW07aysrKSB7CisgICAgICAgIGluZGljZXNba10gPSAwOworICAgIH0KIAotCWlmIChmb3J0ID09ICdGJykgewotCQlhZGRvbmUgPSBfYWRkX29uZV90b19pbmRleF9GOwotCX0KLQllbHNlIHsKLQkJYWRkb25lID0gX2FkZF9vbmVfdG9faW5kZXhfQzsKLQl9Ci0JZGVzdCA9IGJ1ZjsKLQkvKiBYWFggOiBUaGlzIGlzIG5vdCBnb2luZyB0byBiZSB0aGUgZmFzdGVzdCBjb2RlIGluIHRoZSB3b3JsZAotCQkgc2V2ZXJhbCBvcHRpbWl6YXRpb25zIGFyZSBwb3NzaWJsZS4KLQkgKi8KLQllbGVtZW50cyA9IGxlbiAvIHZpZXctPml0ZW1zaXplOwotCXdoaWxlIChlbGVtZW50cy0tKSB7Ci0JCWFkZG9uZSh2aWV3LT5uZGltLCBpbmRpY2VzLCB2aWV3LT5zaGFwZSk7Ci0JCXB0ciA9IFB5QnVmZmVyX0dldFBvaW50ZXIodmlldywgaW5kaWNlcyk7Ci0JCW1lbWNweShkZXN0LCBwdHIsIHZpZXctPml0ZW1zaXplKTsKLQkJZGVzdCArPSB2aWV3LT5pdGVtc2l6ZTsKLQl9Ci0JUHlNZW1fRnJlZShpbmRpY2VzKTsKLQlyZXR1cm4gMDsKKyAgICBpZiAoZm9ydCA9PSAnRicpIHsKKyAgICAgICAgYWRkb25lID0gX2FkZF9vbmVfdG9faW5kZXhfRjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGFkZG9uZSA9IF9hZGRfb25lX3RvX2luZGV4X0M7CisgICAgfQorICAgIGRlc3QgPSBidWY7CisgICAgLyogWFhYIDogVGhpcyBpcyBub3QgZ29pbmcgdG8gYmUgdGhlIGZhc3Rlc3QgY29kZSBpbiB0aGUgd29ybGQKKyAgICAgICAgICAgICBzZXZlcmFsIG9wdGltaXphdGlvbnMgYXJlIHBvc3NpYmxlLgorICAgICAqLworICAgIGVsZW1lbnRzID0gbGVuIC8gdmlldy0+aXRlbXNpemU7CisgICAgd2hpbGUgKGVsZW1lbnRzLS0pIHsKKyAgICAgICAgYWRkb25lKHZpZXctPm5kaW0sIGluZGljZXMsIHZpZXctPnNoYXBlKTsKKyAgICAgICAgcHRyID0gUHlCdWZmZXJfR2V0UG9pbnRlcih2aWV3LCBpbmRpY2VzKTsKKyAgICAgICAgbWVtY3B5KGRlc3QsIHB0ciwgdmlldy0+aXRlbXNpemUpOworICAgICAgICBkZXN0ICs9IHZpZXctPml0ZW1zaXplOworICAgIH0KKyAgICBQeU1lbV9GcmVlKGluZGljZXMpOworICAgIHJldHVybiAwOwogfQogCiBpbnQKIFB5QnVmZmVyX0Zyb21Db250aWd1b3VzKFB5X2J1ZmZlciAqdmlldywgdm9pZCAqYnVmLCBQeV9zc2l6ZV90IGxlbiwgY2hhciBmb3J0KQogewotCWludCBrOwotCXZvaWQgKCphZGRvbmUpKGludCwgUHlfc3NpemVfdCAqLCBQeV9zc2l6ZV90ICopOwotCVB5X3NzaXplX3QgKmluZGljZXMsIGVsZW1lbnRzOwotCWNoYXIgKnNyYywgKnB0cjsKKyAgICBpbnQgazsKKyAgICB2b2lkICgqYWRkb25lKShpbnQsIFB5X3NzaXplX3QgKiwgUHlfc3NpemVfdCAqKTsKKyAgICBQeV9zc2l6ZV90ICppbmRpY2VzLCBlbGVtZW50czsKKyAgICBjaGFyICpzcmMsICpwdHI7CiAKLQlpZiAobGVuID4gdmlldy0+bGVuKSB7Ci0JCWxlbiA9IHZpZXctPmxlbjsKLQl9CisgICAgaWYgKGxlbiA+IHZpZXctPmxlbikgeworICAgICAgICBsZW4gPSB2aWV3LT5sZW47CisgICAgfQogCi0JaWYgKFB5QnVmZmVyX0lzQ29udGlndW91cyh2aWV3LCBmb3J0KSkgewotCQkvKiBzaW1wbGVzdCBjb3B5IGlzIGFsbCB0aGF0IGlzIG5lZWRlZCAqLwotCQltZW1jcHkodmlldy0+YnVmLCBidWYsIGxlbik7Ci0JCXJldHVybiAwOwotCX0KKyAgICBpZiAoUHlCdWZmZXJfSXNDb250aWd1b3VzKHZpZXcsIGZvcnQpKSB7CisgICAgICAgIC8qIHNpbXBsZXN0IGNvcHkgaXMgYWxsIHRoYXQgaXMgbmVlZGVkICovCisgICAgICAgIG1lbWNweSh2aWV3LT5idWYsIGJ1ZiwgbGVuKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCi0JLyogT3RoZXJ3aXNlIGEgbW9yZSBlbGFib3JhdGUgc2NoZW1lIGlzIG5lZWRlZCAqLworICAgIC8qIE90aGVyd2lzZSBhIG1vcmUgZWxhYm9yYXRlIHNjaGVtZSBpcyBuZWVkZWQgKi8KIAotCS8qIFhYWChubm9yd2l0eik6IG5lZWQgdG8gY2hlY2sgZm9yIG92ZXJmbG93ISAqLwotCWluZGljZXMgPSAoUHlfc3NpemVfdCAqKVB5TWVtX01hbGxvYyhzaXplb2YoUHlfc3NpemVfdCkqKHZpZXctPm5kaW0pKTsKLQlpZiAoaW5kaWNlcyA9PSBOVUxMKSB7Ci0JCVB5RXJyX05vTWVtb3J5KCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JZm9yIChrPTA7IGs8dmlldy0+bmRpbTtrKyspIHsKLQkJaW5kaWNlc1trXSA9IDA7Ci0JfQorICAgIC8qIFhYWChubm9yd2l0eik6IG5lZWQgdG8gY2hlY2sgZm9yIG92ZXJmbG93ISAqLworICAgIGluZGljZXMgPSAoUHlfc3NpemVfdCAqKVB5TWVtX01hbGxvYyhzaXplb2YoUHlfc3NpemVfdCkqKHZpZXctPm5kaW0pKTsKKyAgICBpZiAoaW5kaWNlcyA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgZm9yIChrPTA7IGs8dmlldy0+bmRpbTtrKyspIHsKKyAgICAgICAgaW5kaWNlc1trXSA9IDA7CisgICAgfQogCi0JaWYgKGZvcnQgPT0gJ0YnKSB7Ci0JCWFkZG9uZSA9IF9hZGRfb25lX3RvX2luZGV4X0Y7Ci0JfQotCWVsc2UgewotCQlhZGRvbmUgPSBfYWRkX29uZV90b19pbmRleF9DOwotCX0KLQlzcmMgPSBidWY7Ci0JLyogWFhYIDogVGhpcyBpcyBub3QgZ29pbmcgdG8gYmUgdGhlIGZhc3Rlc3QgY29kZSBpbiB0aGUgd29ybGQKLQkJIHNldmVyYWwgb3B0aW1pemF0aW9ucyBhcmUgcG9zc2libGUuCi0JICovCi0JZWxlbWVudHMgPSBsZW4gLyB2aWV3LT5pdGVtc2l6ZTsKLQl3aGlsZSAoZWxlbWVudHMtLSkgewotCQlhZGRvbmUodmlldy0+bmRpbSwgaW5kaWNlcywgdmlldy0+c2hhcGUpOwotCQlwdHIgPSBQeUJ1ZmZlcl9HZXRQb2ludGVyKHZpZXcsIGluZGljZXMpOwotCQltZW1jcHkocHRyLCBzcmMsIHZpZXctPml0ZW1zaXplKTsKLQkJc3JjICs9IHZpZXctPml0ZW1zaXplOwotCX0KKyAgICBpZiAoZm9ydCA9PSAnRicpIHsKKyAgICAgICAgYWRkb25lID0gX2FkZF9vbmVfdG9faW5kZXhfRjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGFkZG9uZSA9IF9hZGRfb25lX3RvX2luZGV4X0M7CisgICAgfQorICAgIHNyYyA9IGJ1ZjsKKyAgICAvKiBYWFggOiBUaGlzIGlzIG5vdCBnb2luZyB0byBiZSB0aGUgZmFzdGVzdCBjb2RlIGluIHRoZSB3b3JsZAorICAgICAgICAgICAgIHNldmVyYWwgb3B0aW1pemF0aW9ucyBhcmUgcG9zc2libGUuCisgICAgICovCisgICAgZWxlbWVudHMgPSBsZW4gLyB2aWV3LT5pdGVtc2l6ZTsKKyAgICB3aGlsZSAoZWxlbWVudHMtLSkgeworICAgICAgICBhZGRvbmUodmlldy0+bmRpbSwgaW5kaWNlcywgdmlldy0+c2hhcGUpOworICAgICAgICBwdHIgPSBQeUJ1ZmZlcl9HZXRQb2ludGVyKHZpZXcsIGluZGljZXMpOworICAgICAgICBtZW1jcHkocHRyLCBzcmMsIHZpZXctPml0ZW1zaXplKTsKKyAgICAgICAgc3JjICs9IHZpZXctPml0ZW1zaXplOworICAgIH0KIAotCVB5TWVtX0ZyZWUoaW5kaWNlcyk7Ci0JcmV0dXJuIDA7CisgICAgUHlNZW1fRnJlZShpbmRpY2VzKTsKKyAgICByZXR1cm4gMDsKIH0KIAogaW50IFB5T2JqZWN0X0NvcHlEYXRhKFB5T2JqZWN0ICpkZXN0LCBQeU9iamVjdCAqc3JjKQogewotCVB5X2J1ZmZlciB2aWV3X2Rlc3QsIHZpZXdfc3JjOwotCWludCBrOwotCVB5X3NzaXplX3QgKmluZGljZXMsIGVsZW1lbnRzOwotCWNoYXIgKmRwdHIsICpzcHRyOworICAgIFB5X2J1ZmZlciB2aWV3X2Rlc3QsIHZpZXdfc3JjOworICAgIGludCBrOworICAgIFB5X3NzaXplX3QgKmluZGljZXMsIGVsZW1lbnRzOworICAgIGNoYXIgKmRwdHIsICpzcHRyOwogCi0JaWYgKCFQeU9iamVjdF9DaGVja0J1ZmZlcihkZXN0KSB8fAotCSAgICAhUHlPYmplY3RfQ2hlY2tCdWZmZXIoc3JjKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJib3RoIGRlc3RpbmF0aW9uIGFuZCBzb3VyY2UgbXVzdCBoYXZlIHRoZSAiXAotCQkJCSJidWZmZXIgaW50ZXJmYWNlIik7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgaWYgKCFQeU9iamVjdF9DaGVja0J1ZmZlcihkZXN0KSB8fAorICAgICAgICAhUHlPYmplY3RfQ2hlY2tCdWZmZXIoc3JjKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImJvdGggZGVzdGluYXRpb24gYW5kIHNvdXJjZSBtdXN0IGhhdmUgdGhlICJcCisgICAgICAgICAgICAgICAgICAgICAgICAiYnVmZmVyIGludGVyZmFjZSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JaWYgKFB5T2JqZWN0X0dldEJ1ZmZlcihkZXN0LCAmdmlld19kZXN0LCBQeUJVRl9GVUxMKSAhPSAwKSByZXR1cm4gLTE7Ci0JaWYgKFB5T2JqZWN0X0dldEJ1ZmZlcihzcmMsICZ2aWV3X3NyYywgUHlCVUZfRlVMTF9STykgIT0gMCkgewotCQlQeUJ1ZmZlcl9SZWxlYXNlKCZ2aWV3X2Rlc3QpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIGlmIChQeU9iamVjdF9HZXRCdWZmZXIoZGVzdCwgJnZpZXdfZGVzdCwgUHlCVUZfRlVMTCkgIT0gMCkgcmV0dXJuIC0xOworICAgIGlmIChQeU9iamVjdF9HZXRCdWZmZXIoc3JjLCAmdmlld19zcmMsIFB5QlVGX0ZVTExfUk8pICE9IDApIHsKKyAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmdmlld19kZXN0KTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCWlmICh2aWV3X2Rlc3QubGVuIDwgdmlld19zcmMubGVuKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19CdWZmZXJFcnJvciwKLQkJCQkiZGVzdGluYXRpb24gaXMgdG9vIHNtYWxsIHRvIHJlY2VpdmUgZGF0YSBmcm9tIHNvdXJjZSIpOwotCQlQeUJ1ZmZlcl9SZWxlYXNlKCZ2aWV3X2Rlc3QpOwotCQlQeUJ1ZmZlcl9SZWxlYXNlKCZ2aWV3X3NyYyk7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgaWYgKHZpZXdfZGVzdC5sZW4gPCB2aWV3X3NyYy5sZW4pIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0J1ZmZlckVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImRlc3RpbmF0aW9uIGlzIHRvbyBzbWFsbCB0byByZWNlaXZlIGRhdGEgZnJvbSBzb3VyY2UiKTsKKyAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmdmlld19kZXN0KTsKKyAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmdmlld19zcmMpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JaWYgKChQeUJ1ZmZlcl9Jc0NvbnRpZ3VvdXMoJnZpZXdfZGVzdCwgJ0MnKSAmJgotCSAgICAgUHlCdWZmZXJfSXNDb250aWd1b3VzKCZ2aWV3X3NyYywgJ0MnKSkgfHwKLQkgICAgKFB5QnVmZmVyX0lzQ29udGlndW91cygmdmlld19kZXN0LCAnRicpICYmCi0JICAgICBQeUJ1ZmZlcl9Jc0NvbnRpZ3VvdXMoJnZpZXdfc3JjLCAnRicpKSkgewotCQkvKiBzaW1wbGVzdCBjb3B5IGlzIGFsbCB0aGF0IGlzIG5lZWRlZCAqLwotCQltZW1jcHkodmlld19kZXN0LmJ1Ziwgdmlld19zcmMuYnVmLCB2aWV3X3NyYy5sZW4pOwotCQlQeUJ1ZmZlcl9SZWxlYXNlKCZ2aWV3X2Rlc3QpOwotCQlQeUJ1ZmZlcl9SZWxlYXNlKCZ2aWV3X3NyYyk7Ci0JCXJldHVybiAwOwotCX0KKyAgICBpZiAoKFB5QnVmZmVyX0lzQ29udGlndW91cygmdmlld19kZXN0LCAnQycpICYmCisgICAgICAgICBQeUJ1ZmZlcl9Jc0NvbnRpZ3VvdXMoJnZpZXdfc3JjLCAnQycpKSB8fAorICAgICAgICAoUHlCdWZmZXJfSXNDb250aWd1b3VzKCZ2aWV3X2Rlc3QsICdGJykgJiYKKyAgICAgICAgIFB5QnVmZmVyX0lzQ29udGlndW91cygmdmlld19zcmMsICdGJykpKSB7CisgICAgICAgIC8qIHNpbXBsZXN0IGNvcHkgaXMgYWxsIHRoYXQgaXMgbmVlZGVkICovCisgICAgICAgIG1lbWNweSh2aWV3X2Rlc3QuYnVmLCB2aWV3X3NyYy5idWYsIHZpZXdfc3JjLmxlbik7CisgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnZpZXdfZGVzdCk7CisgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnZpZXdfc3JjKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCi0JLyogT3RoZXJ3aXNlIGEgbW9yZSBlbGFib3JhdGUgY29weSBzY2hlbWUgaXMgbmVlZGVkICovCisgICAgLyogT3RoZXJ3aXNlIGEgbW9yZSBlbGFib3JhdGUgY29weSBzY2hlbWUgaXMgbmVlZGVkICovCiAKLQkvKiBYWFgobm5vcndpdHopOiBuZWVkIHRvIGNoZWNrIGZvciBvdmVyZmxvdyEgKi8KLQlpbmRpY2VzID0gKFB5X3NzaXplX3QgKilQeU1lbV9NYWxsb2Moc2l6ZW9mKFB5X3NzaXplX3QpKnZpZXdfc3JjLm5kaW0pOwotCWlmIChpbmRpY2VzID09IE5VTEwpIHsKLQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJUHlCdWZmZXJfUmVsZWFzZSgmdmlld19kZXN0KTsKLQkJUHlCdWZmZXJfUmVsZWFzZSgmdmlld19zcmMpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWZvciAoaz0wOyBrPHZpZXdfc3JjLm5kaW07aysrKSB7Ci0JCWluZGljZXNba10gPSAwOwotCX0KLQllbGVtZW50cyA9IDE7Ci0JZm9yIChrPTA7IGs8dmlld19zcmMubmRpbTsgaysrKSB7Ci0JCS8qIFhYWChubm9yd2l0eik6IGNhbiB0aGlzIG92ZXJmbG93PyAqLwotCQllbGVtZW50cyAqPSB2aWV3X3NyYy5zaGFwZVtrXTsKLQl9Ci0Jd2hpbGUgKGVsZW1lbnRzLS0pIHsKLQkJX2FkZF9vbmVfdG9faW5kZXhfQyh2aWV3X3NyYy5uZGltLCBpbmRpY2VzLCB2aWV3X3NyYy5zaGFwZSk7Ci0JCWRwdHIgPSBQeUJ1ZmZlcl9HZXRQb2ludGVyKCZ2aWV3X2Rlc3QsIGluZGljZXMpOwotCQlzcHRyID0gUHlCdWZmZXJfR2V0UG9pbnRlcigmdmlld19zcmMsIGluZGljZXMpOwotCQltZW1jcHkoZHB0ciwgc3B0ciwgdmlld19zcmMuaXRlbXNpemUpOwotCX0KLQlQeU1lbV9GcmVlKGluZGljZXMpOwotCVB5QnVmZmVyX1JlbGVhc2UoJnZpZXdfZGVzdCk7Ci0JUHlCdWZmZXJfUmVsZWFzZSgmdmlld19zcmMpOwotCXJldHVybiAwOworICAgIC8qIFhYWChubm9yd2l0eik6IG5lZWQgdG8gY2hlY2sgZm9yIG92ZXJmbG93ISAqLworICAgIGluZGljZXMgPSAoUHlfc3NpemVfdCAqKVB5TWVtX01hbGxvYyhzaXplb2YoUHlfc3NpemVfdCkqdmlld19zcmMubmRpbSk7CisgICAgaWYgKGluZGljZXMgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZ2aWV3X2Rlc3QpOworICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZ2aWV3X3NyYyk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgZm9yIChrPTA7IGs8dmlld19zcmMubmRpbTtrKyspIHsKKyAgICAgICAgaW5kaWNlc1trXSA9IDA7CisgICAgfQorICAgIGVsZW1lbnRzID0gMTsKKyAgICBmb3IgKGs9MDsgazx2aWV3X3NyYy5uZGltOyBrKyspIHsKKyAgICAgICAgLyogWFhYKG5ub3J3aXR6KTogY2FuIHRoaXMgb3ZlcmZsb3c/ICovCisgICAgICAgIGVsZW1lbnRzICo9IHZpZXdfc3JjLnNoYXBlW2tdOworICAgIH0KKyAgICB3aGlsZSAoZWxlbWVudHMtLSkgeworICAgICAgICBfYWRkX29uZV90b19pbmRleF9DKHZpZXdfc3JjLm5kaW0sIGluZGljZXMsIHZpZXdfc3JjLnNoYXBlKTsKKyAgICAgICAgZHB0ciA9IFB5QnVmZmVyX0dldFBvaW50ZXIoJnZpZXdfZGVzdCwgaW5kaWNlcyk7CisgICAgICAgIHNwdHIgPSBQeUJ1ZmZlcl9HZXRQb2ludGVyKCZ2aWV3X3NyYywgaW5kaWNlcyk7CisgICAgICAgIG1lbWNweShkcHRyLCBzcHRyLCB2aWV3X3NyYy5pdGVtc2l6ZSk7CisgICAgfQorICAgIFB5TWVtX0ZyZWUoaW5kaWNlcyk7CisgICAgUHlCdWZmZXJfUmVsZWFzZSgmdmlld19kZXN0KTsKKyAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZ2aWV3X3NyYyk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHZvaWQKIFB5QnVmZmVyX0ZpbGxDb250aWd1b3VzU3RyaWRlcyhpbnQgbmQsIFB5X3NzaXplX3QgKnNoYXBlLAotCQkJICAgICAgIFB5X3NzaXplX3QgKnN0cmlkZXMsIGludCBpdGVtc2l6ZSwKLQkJCSAgICAgICBjaGFyIGZvcnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCAqc3RyaWRlcywgaW50IGl0ZW1zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgZm9ydCkKIHsKLQlpbnQgazsKLQlQeV9zc2l6ZV90IHNkOworICAgIGludCBrOworICAgIFB5X3NzaXplX3Qgc2Q7CiAKLQlzZCA9IGl0ZW1zaXplOwotCWlmIChmb3J0ID09ICdGJykgewotCQlmb3IgKGs9MDsgazxuZDsgaysrKSB7Ci0JCQlzdHJpZGVzW2tdID0gc2Q7Ci0JCQlzZCAqPSBzaGFwZVtrXTsKLQkJfQotCX0KLQllbHNlIHsKLQkJZm9yIChrPW5kLTE7IGs+PTA7IGstLSkgewotCQkJc3RyaWRlc1trXSA9IHNkOwotCQkJc2QgKj0gc2hhcGVba107Ci0JCX0KLQl9Ci0JcmV0dXJuOworICAgIHNkID0gaXRlbXNpemU7CisgICAgaWYgKGZvcnQgPT0gJ0YnKSB7CisgICAgICAgIGZvciAoaz0wOyBrPG5kOyBrKyspIHsKKyAgICAgICAgICAgIHN0cmlkZXNba10gPSBzZDsKKyAgICAgICAgICAgIHNkICo9IHNoYXBlW2tdOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBmb3IgKGs9bmQtMTsgaz49MDsgay0tKSB7CisgICAgICAgICAgICBzdHJpZGVzW2tdID0gc2Q7CisgICAgICAgICAgICBzZCAqPSBzaGFwZVtrXTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm47CiB9CiAKIGludAogUHlCdWZmZXJfRmlsbEluZm8oUHlfYnVmZmVyICp2aWV3LCBQeU9iamVjdCAqb2JqLCB2b2lkICpidWYsIFB5X3NzaXplX3QgbGVuLAotCSAgICAgIGludCByZWFkb25seSwgaW50IGZsYWdzKQorICAgICAgICAgICAgICBpbnQgcmVhZG9ubHksIGludCBmbGFncykKIHsKLQlpZiAodmlldyA9PSBOVUxMKSByZXR1cm4gMDsKLQlpZiAoKChmbGFncyAmIFB5QlVGX1dSSVRBQkxFKSA9PSBQeUJVRl9XUklUQUJMRSkgJiYKLQkgICAgKHJlYWRvbmx5ID09IDEpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19CdWZmZXJFcnJvciwKLQkJCQkiT2JqZWN0IGlzIG5vdCB3cml0YWJsZS4iKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICBpZiAodmlldyA9PSBOVUxMKSByZXR1cm4gMDsKKyAgICBpZiAoKChmbGFncyAmIFB5QlVGX1dSSVRBQkxFKSA9PSBQeUJVRl9XUklUQUJMRSkgJiYKKyAgICAgICAgKHJlYWRvbmx5ID09IDEpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19CdWZmZXJFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJPYmplY3QgaXMgbm90IHdyaXRhYmxlLiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0Jdmlldy0+b2JqID0gb2JqOwotCWlmIChvYmopCi0JCVB5X0lOQ1JFRihvYmopOwotCXZpZXctPmJ1ZiA9IGJ1ZjsKLQl2aWV3LT5sZW4gPSBsZW47Ci0Jdmlldy0+cmVhZG9ubHkgPSByZWFkb25seTsKLQl2aWV3LT5pdGVtc2l6ZSA9IDE7Ci0Jdmlldy0+Zm9ybWF0ID0gTlVMTDsKLQlpZiAoKGZsYWdzICYgUHlCVUZfRk9STUFUKSA9PSBQeUJVRl9GT1JNQVQpCi0JCXZpZXctPmZvcm1hdCA9ICJCIjsKLQl2aWV3LT5uZGltID0gMTsKLQl2aWV3LT5zaGFwZSA9IE5VTEw7Ci0JaWYgKChmbGFncyAmIFB5QlVGX05EKSA9PSBQeUJVRl9ORCkKLQkJdmlldy0+c2hhcGUgPSAmKHZpZXctPmxlbik7Ci0Jdmlldy0+c3RyaWRlcyA9IE5VTEw7Ci0JaWYgKChmbGFncyAmIFB5QlVGX1NUUklERVMpID09IFB5QlVGX1NUUklERVMpCi0JCXZpZXctPnN0cmlkZXMgPSAmKHZpZXctPml0ZW1zaXplKTsKLQl2aWV3LT5zdWJvZmZzZXRzID0gTlVMTDsKLQl2aWV3LT5pbnRlcm5hbCA9IE5VTEw7Ci0JcmV0dXJuIDA7CisgICAgdmlldy0+b2JqID0gb2JqOworICAgIGlmIChvYmopCisgICAgICAgIFB5X0lOQ1JFRihvYmopOworICAgIHZpZXctPmJ1ZiA9IGJ1ZjsKKyAgICB2aWV3LT5sZW4gPSBsZW47CisgICAgdmlldy0+cmVhZG9ubHkgPSByZWFkb25seTsKKyAgICB2aWV3LT5pdGVtc2l6ZSA9IDE7CisgICAgdmlldy0+Zm9ybWF0ID0gTlVMTDsKKyAgICBpZiAoKGZsYWdzICYgUHlCVUZfRk9STUFUKSA9PSBQeUJVRl9GT1JNQVQpCisgICAgICAgIHZpZXctPmZvcm1hdCA9ICJCIjsKKyAgICB2aWV3LT5uZGltID0gMTsKKyAgICB2aWV3LT5zaGFwZSA9IE5VTEw7CisgICAgaWYgKChmbGFncyAmIFB5QlVGX05EKSA9PSBQeUJVRl9ORCkKKyAgICAgICAgdmlldy0+c2hhcGUgPSAmKHZpZXctPmxlbik7CisgICAgdmlldy0+c3RyaWRlcyA9IE5VTEw7CisgICAgaWYgKChmbGFncyAmIFB5QlVGX1NUUklERVMpID09IFB5QlVGX1NUUklERVMpCisgICAgICAgIHZpZXctPnN0cmlkZXMgPSAmKHZpZXctPml0ZW1zaXplKTsKKyAgICB2aWV3LT5zdWJvZmZzZXRzID0gTlVMTDsKKyAgICB2aWV3LT5pbnRlcm5hbCA9IE5VTEw7CisgICAgcmV0dXJuIDA7CiB9CiAKIHZvaWQKIFB5QnVmZmVyX1JlbGVhc2UoUHlfYnVmZmVyICp2aWV3KQogewotCVB5T2JqZWN0ICpvYmogPSB2aWV3LT5vYmo7Ci0JaWYgKG9iaiAmJiBQeV9UWVBFKG9iaiktPnRwX2FzX2J1ZmZlciAmJiBQeV9UWVBFKG9iaiktPnRwX2FzX2J1ZmZlci0+YmZfcmVsZWFzZWJ1ZmZlcikKLQkJUHlfVFlQRShvYmopLT50cF9hc19idWZmZXItPmJmX3JlbGVhc2VidWZmZXIob2JqLCB2aWV3KTsKLQlQeV9YREVDUkVGKG9iaik7Ci0Jdmlldy0+b2JqID0gTlVMTDsKKyAgICBQeU9iamVjdCAqb2JqID0gdmlldy0+b2JqOworICAgIGlmIChvYmogJiYgUHlfVFlQRShvYmopLT50cF9hc19idWZmZXIgJiYgUHlfVFlQRShvYmopLT50cF9hc19idWZmZXItPmJmX3JlbGVhc2VidWZmZXIpCisgICAgICAgIFB5X1RZUEUob2JqKS0+dHBfYXNfYnVmZmVyLT5iZl9yZWxlYXNlYnVmZmVyKG9iaiwgdmlldyk7CisgICAgUHlfWERFQ1JFRihvYmopOworICAgIHZpZXctPm9iaiA9IE5VTEw7CiB9CiAKIFB5T2JqZWN0ICoKIFB5T2JqZWN0X0Zvcm1hdChQeU9iamVjdCogb2JqLCBQeU9iamVjdCAqZm9ybWF0X3NwZWMpCiB7Ci0Jc3RhdGljIFB5T2JqZWN0ICogc3RyX19mb3JtYXRfXyA9IE5VTEw7Ci0JUHlPYmplY3QgKmVtcHR5ID0gTlVMTDsKLQlQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKLQlpbnQgc3BlY19pc191bmljb2RlOwotCWludCByZXN1bHRfaXNfdW5pY29kZTsKKyAgICBzdGF0aWMgUHlPYmplY3QgKiBzdHJfX2Zvcm1hdF9fID0gTlVMTDsKKyAgICBQeU9iamVjdCAqZW1wdHkgPSBOVUxMOworICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOworICAgIGludCBzcGVjX2lzX3VuaWNvZGU7CisgICAgaW50IHJlc3VsdF9pc191bmljb2RlOwogCi0JLyogSW5pdGlhbGl6ZSBjYWNoZWQgdmFsdWUgKi8KLQlpZiAoc3RyX19mb3JtYXRfXyA9PSBOVUxMKSB7Ci0JCS8qIEluaXRpYWxpemUgc3RhdGljIHZhcmlhYmxlIG5lZWRlZCBieSBfUHlUeXBlX0xvb2t1cCAqLwotCQlzdHJfX2Zvcm1hdF9fID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19mb3JtYXRfXyIpOwotCQlpZiAoc3RyX19mb3JtYXRfXyA9PSBOVUxMKQotCQkJZ290byBkb25lOwotCX0KKyAgICAvKiBJbml0aWFsaXplIGNhY2hlZCB2YWx1ZSAqLworICAgIGlmIChzdHJfX2Zvcm1hdF9fID09IE5VTEwpIHsKKyAgICAgICAgLyogSW5pdGlhbGl6ZSBzdGF0aWMgdmFyaWFibGUgbmVlZGVkIGJ5IF9QeVR5cGVfTG9va3VwICovCisgICAgICAgIHN0cl9fZm9ybWF0X18gPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2Zvcm1hdF9fIik7CisgICAgICAgIGlmIChzdHJfX2Zvcm1hdF9fID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGRvbmU7CisgICAgfQogCi0JLyogSWYgbm8gZm9ybWF0X3NwZWMgaXMgcHJvdmlkZWQsIHVzZSBhbiBlbXB0eSBzdHJpbmcgKi8KLQlpZiAoZm9ybWF0X3NwZWMgPT0gTlVMTCkgewotCQllbXB0eSA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIDApOwotCQlmb3JtYXRfc3BlYyA9IGVtcHR5OwotCX0KKyAgICAvKiBJZiBubyBmb3JtYXRfc3BlYyBpcyBwcm92aWRlZCwgdXNlIGFuIGVtcHR5IHN0cmluZyAqLworICAgIGlmIChmb3JtYXRfc3BlYyA9PSBOVUxMKSB7CisgICAgICAgIGVtcHR5ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgMCk7CisgICAgICAgIGZvcm1hdF9zcGVjID0gZW1wdHk7CisgICAgfQogCi0JLyogQ2hlY2sgdGhlIGZvcm1hdF9zcGVjIHR5cGUsIGFuZCBtYWtlIHN1cmUgaXQncyBzdHIgb3IgdW5pY29kZSAqLwotCWlmIChQeVVuaWNvZGVfQ2hlY2soZm9ybWF0X3NwZWMpKQotCQlzcGVjX2lzX3VuaWNvZGUgPSAxOwotCWVsc2UgaWYgKFB5U3RyaW5nX0NoZWNrKGZvcm1hdF9zcGVjKSkKLQkJc3BlY19pc191bmljb2RlID0gMDsKLQllbHNlIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAgImZvcm1hdCBleHBlY3RzIGFyZyAyIHRvIGJlIHN0cmluZyAiCi0JCQkgICAgICJvciB1bmljb2RlLCBub3QgJS4xMDBzIiwgUHlfVFlQRShmb3JtYXRfc3BlYyktPnRwX25hbWUpOwotCQlnb3RvIGRvbmU7Ci0JfQorICAgIC8qIENoZWNrIHRoZSBmb3JtYXRfc3BlYyB0eXBlLCBhbmQgbWFrZSBzdXJlIGl0J3Mgc3RyIG9yIHVuaWNvZGUgKi8KKyAgICBpZiAoUHlVbmljb2RlX0NoZWNrKGZvcm1hdF9zcGVjKSkKKyAgICAgICAgc3BlY19pc191bmljb2RlID0gMTsKKyAgICBlbHNlIGlmIChQeVN0cmluZ19DaGVjayhmb3JtYXRfc3BlYykpCisgICAgICAgIHNwZWNfaXNfdW5pY29kZSA9IDA7CisgICAgZWxzZSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IGV4cGVjdHMgYXJnIDIgdG8gYmUgc3RyaW5nICIKKyAgICAgICAgICAgICAgICAgICAgICJvciB1bmljb2RlLCBub3QgJS4xMDBzIiwgUHlfVFlQRShmb3JtYXRfc3BlYyktPnRwX25hbWUpOworICAgICAgICBnb3RvIGRvbmU7CisgICAgfQogCi0JLyogTWFrZSBzdXJlIHRoZSB0eXBlIGlzIGluaXRpYWxpemVkLiAgZmxvYXQgZ2V0cyBpbml0aWFsaXplZCBsYXRlICovCi0JaWYgKFB5X1RZUEUob2JqKS0+dHBfZGljdCA9PSBOVUxMKQotCQlpZiAoUHlUeXBlX1JlYWR5KFB5X1RZUEUob2JqKSkgPCAwKQotCQkJZ290byBkb25lOworICAgIC8qIE1ha2Ugc3VyZSB0aGUgdHlwZSBpcyBpbml0aWFsaXplZC4gIGZsb2F0IGdldHMgaW5pdGlhbGl6ZWQgbGF0ZSAqLworICAgIGlmIChQeV9UWVBFKG9iaiktPnRwX2RpY3QgPT0gTlVMTCkKKyAgICAgICAgaWYgKFB5VHlwZV9SZWFkeShQeV9UWVBFKG9iaikpIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZG9uZTsKIAotCS8qIENoZWNrIGZvciBhIF9fZm9ybWF0X18gbWV0aG9kIGFuZCBjYWxsIGl0LiAqLwotCWlmIChQeUluc3RhbmNlX0NoZWNrKG9iaikpIHsKLQkJLyogV2UncmUgYW4gaW5zdGFuY2Ugb2YgYSBjbGFzc2ljIGNsYXNzICovCi0JCVB5T2JqZWN0ICpib3VuZF9tZXRob2QgPSBQeU9iamVjdF9HZXRBdHRyKG9iaiwKLQkJCQkJCQkgIHN0cl9fZm9ybWF0X18pOwotCQlpZiAoYm91bmRfbWV0aG9kICE9IE5VTEwpIHsKLQkJCXJlc3VsdCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoYm91bmRfbWV0aG9kLAotCQkJCQkJCSAgICAgIGZvcm1hdF9zcGVjLAotCQkJCQkJCSAgICAgIE5VTEwpOwotCQkJUHlfREVDUkVGKGJvdW5kX21ldGhvZCk7Ci0JCX0gZWxzZSB7Ci0JCQlQeU9iamVjdCAqc2VsZl9hc19zdHI7Ci0JCQlQeU9iamVjdCAqZm9ybWF0X21ldGhvZDsKKyAgICAvKiBDaGVjayBmb3IgYSBfX2Zvcm1hdF9fIG1ldGhvZCBhbmQgY2FsbCBpdC4gKi8KKyAgICBpZiAoUHlJbnN0YW5jZV9DaGVjayhvYmopKSB7CisgICAgICAgIC8qIFdlJ3JlIGFuIGluc3RhbmNlIG9mIGEgY2xhc3NpYyBjbGFzcyAqLworICAgICAgICBQeU9iamVjdCAqYm91bmRfbWV0aG9kID0gUHlPYmplY3RfR2V0QXR0cihvYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9fZm9ybWF0X18pOworICAgICAgICBpZiAoYm91bmRfbWV0aG9kICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoYm91bmRfbWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRfc3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAgICAgICBQeV9ERUNSRUYoYm91bmRfbWV0aG9kKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpzZWxmX2FzX3N0cjsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpmb3JtYXRfbWV0aG9kOwogCi0JCQlQeUVycl9DbGVhcigpOwotCQkJLyogUGVyIHRoZSBQRVAsIGNvbnZlcnQgdG8gc3RyIChvciB1bmljb2RlLAotCQkJICAgZGVwZW5kaW5nIG9uIHRoZSB0eXBlIG9mIHRoZSBmb3JtYXQKLQkJCSAgIHNwZWNpZmllcikuICBGb3IgbmV3LXN0eWxlIGNsYXNzZXMsIHRoaXMKLQkJCSAgIGxvZ2ljIGlzIGRvbmUgYnkgb2JqZWN0Ll9fZm9ybWF0X18oKS4gKi8KLQkJCWlmIChzcGVjX2lzX3VuaWNvZGUpCi0JCQkJc2VsZl9hc19zdHIgPSBQeU9iamVjdF9Vbmljb2RlKG9iaik7Ci0JCQllbHNlCi0JCQkJc2VsZl9hc19zdHIgPSBQeU9iamVjdF9TdHIob2JqKTsKLQkJCWlmIChzZWxmX2FzX3N0ciA9PSBOVUxMKQotCQkJCWdvdG8gZG9uZTsKKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICAvKiBQZXIgdGhlIFBFUCwgY29udmVydCB0byBzdHIgKG9yIHVuaWNvZGUsCisgICAgICAgICAgICAgICBkZXBlbmRpbmcgb24gdGhlIHR5cGUgb2YgdGhlIGZvcm1hdAorICAgICAgICAgICAgICAgc3BlY2lmaWVyKS4gIEZvciBuZXctc3R5bGUgY2xhc3NlcywgdGhpcworICAgICAgICAgICAgICAgbG9naWMgaXMgZG9uZSBieSBvYmplY3QuX19mb3JtYXRfXygpLiAqLworICAgICAgICAgICAgaWYgKHNwZWNfaXNfdW5pY29kZSkKKyAgICAgICAgICAgICAgICBzZWxmX2FzX3N0ciA9IFB5T2JqZWN0X1VuaWNvZGUob2JqKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBzZWxmX2FzX3N0ciA9IFB5T2JqZWN0X1N0cihvYmopOworICAgICAgICAgICAgaWYgKHNlbGZfYXNfc3RyID09IE5VTEwpCisgICAgICAgICAgICAgICAgZ290byBkb25lOwogCi0JCQkvKiBUaGVuIGNhbGwgc3RyLl9fZm9ybWF0X18gb24gdGhhdCByZXN1bHQgKi8KLQkJCWZvcm1hdF9tZXRob2QgPSBQeU9iamVjdF9HZXRBdHRyKHNlbGZfYXNfc3RyLAotCQkJCQkJCSBzdHJfX2Zvcm1hdF9fKTsKLQkJCWlmIChmb3JtYXRfbWV0aG9kID09IE5VTEwpIHsKLQkJCQlQeV9ERUNSRUYoc2VsZl9hc19zdHIpOwotCQkJCWdvdG8gZG9uZTsKLQkJCX0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoZm9ybWF0X21ldGhvZCwKLQkJCQkJCQkgICAgICBmb3JtYXRfc3BlYywKLQkJCQkJCQkgICAgICBOVUxMKTsKLQkJCVB5X0RFQ1JFRihzZWxmX2FzX3N0cik7Ci0JCQlQeV9ERUNSRUYoZm9ybWF0X21ldGhvZCk7Ci0JCQlpZiAocmVzdWx0ID09IE5VTEwpCi0JCQkJZ290byBkb25lOwotICAgICAgICAgICAgICAgIH0KLQl9IGVsc2UgewotCQkvKiBOb3QgYW4gaW5zdGFuY2Ugb2YgYSBjbGFzc2ljIGNsYXNzLCB1c2UgdGhlIGNvZGUKLQkJICAgZnJvbSBweTNrICovCisgICAgICAgICAgICAvKiBUaGVuIGNhbGwgc3RyLl9fZm9ybWF0X18gb24gdGhhdCByZXN1bHQgKi8KKyAgICAgICAgICAgIGZvcm1hdF9tZXRob2QgPSBQeU9iamVjdF9HZXRBdHRyKHNlbGZfYXNfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX19mb3JtYXRfXyk7CisgICAgICAgICAgICBpZiAoZm9ybWF0X21ldGhvZCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHNlbGZfYXNfc3RyKTsKKyAgICAgICAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXN1bHQgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGZvcm1hdF9tZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdF9zcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihzZWxmX2FzX3N0cik7CisgICAgICAgICAgICBQeV9ERUNSRUYoZm9ybWF0X21ldGhvZCk7CisgICAgICAgICAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgICAgICAgICAgZ290byBkb25lOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogTm90IGFuIGluc3RhbmNlIG9mIGEgY2xhc3NpYyBjbGFzcywgdXNlIHRoZSBjb2RlCisgICAgICAgICAgIGZyb20gcHkzayAqLwogCi0JCS8qIEZpbmQgdGhlICh1bmJvdW5kISkgX19mb3JtYXRfXyBtZXRob2QgKGEgYm9ycm93ZWQKLQkJICAgcmVmZXJlbmNlKSAqLwotCQlQeU9iamVjdCAqbWV0aG9kID0gX1B5VHlwZV9Mb29rdXAoUHlfVFlQRShvYmopLAotCQkJCQkJICBzdHJfX2Zvcm1hdF9fKTsKLQkJaWYgKG1ldGhvZCA9PSBOVUxMKSB7Ci0JCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJCSAgICAgIlR5cGUgJS4xMDBzIGRvZXNuJ3QgZGVmaW5lIF9fZm9ybWF0X18iLAotCQkJCSAgICAgUHlfVFlQRShvYmopLT50cF9uYW1lKTsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCQkvKiBBbmQgY2FsbCBpdCwgYmluZGluZyBpdCB0byB0aGUgdmFsdWUgKi8KLQkJcmVzdWx0ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhtZXRob2QsIG9iaiwKLQkJCQkJCSAgICAgIGZvcm1hdF9zcGVjLCBOVUxMKTsKLQl9CisgICAgICAgIC8qIEZpbmQgdGhlICh1bmJvdW5kISkgX19mb3JtYXRfXyBtZXRob2QgKGEgYm9ycm93ZWQKKyAgICAgICAgICAgcmVmZXJlbmNlKSAqLworICAgICAgICBQeU9iamVjdCAqbWV0aG9kID0gX1B5VHlwZV9Mb29rdXAoUHlfVFlQRShvYmopLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX19mb3JtYXRfXyk7CisgICAgICAgIGlmIChtZXRob2QgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiVHlwZSAlLjEwMHMgZG9lc24ndCBkZWZpbmUgX19mb3JtYXRfXyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRShvYmopLT50cF9uYW1lKTsKKyAgICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgICAgfQorICAgICAgICAvKiBBbmQgY2FsbCBpdCwgYmluZGluZyBpdCB0byB0aGUgdmFsdWUgKi8KKyAgICAgICAgcmVzdWx0ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhtZXRob2QsIG9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRfc3BlYywgTlVMTCk7CisgICAgfQogCi0JaWYgKHJlc3VsdCA9PSBOVUxMKQotCQlnb3RvIGRvbmU7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgICAgICBnb3RvIGRvbmU7CiAKLQkvKiBDaGVjayB0aGUgcmVzdWx0IHR5cGUsIGFuZCBtYWtlIHN1cmUgaXQncyBzdHIgb3IgdW5pY29kZSAqLwotCWlmIChQeVVuaWNvZGVfQ2hlY2socmVzdWx0KSkKLQkJcmVzdWx0X2lzX3VuaWNvZGUgPSAxOwotCWVsc2UgaWYgKFB5U3RyaW5nX0NoZWNrKHJlc3VsdCkpCi0JCXJlc3VsdF9pc191bmljb2RlID0gMDsKLQllbHNlIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAgIiUuMTAwcy5fX2Zvcm1hdF9fIG11c3QgcmV0dXJuIHN0cmluZyBvciAiCi0JCQkgICAgICJ1bmljb2RlLCBub3QgJS4xMDBzIiwgUHlfVFlQRShvYmopLT50cF9uYW1lLAotCQkJICAgICBQeV9UWVBFKHJlc3VsdCktPnRwX25hbWUpOwotCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJcmVzdWx0ID0gTlVMTDsKLQkJZ290byBkb25lOwotCX0KKyAgICAvKiBDaGVjayB0aGUgcmVzdWx0IHR5cGUsIGFuZCBtYWtlIHN1cmUgaXQncyBzdHIgb3IgdW5pY29kZSAqLworICAgIGlmIChQeVVuaWNvZGVfQ2hlY2socmVzdWx0KSkKKyAgICAgICAgcmVzdWx0X2lzX3VuaWNvZGUgPSAxOworICAgIGVsc2UgaWYgKFB5U3RyaW5nX0NoZWNrKHJlc3VsdCkpCisgICAgICAgIHJlc3VsdF9pc191bmljb2RlID0gMDsKKyAgICBlbHNlIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICIlLjEwMHMuX19mb3JtYXRfXyBtdXN0IHJldHVybiBzdHJpbmcgb3IgIgorICAgICAgICAgICAgICAgICAgICAgInVuaWNvZGUsIG5vdCAlLjEwMHMiLCBQeV9UWVBFKG9iaiktPnRwX25hbWUsCisgICAgICAgICAgICAgICAgICAgICBQeV9UWVBFKHJlc3VsdCktPnRwX25hbWUpOworICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgcmVzdWx0ID0gTlVMTDsKKyAgICAgICAgZ290byBkb25lOworICAgIH0KIAotCS8qIENvbnZlcnQgdG8gdW5pY29kZSwgaWYgbmVlZGVkLiAgUmVxdWlyZWQgaWYgc3BlYyBpcyB1bmljb2RlCi0JICAgYW5kIHJlc3VsdCBpcyBzdHIgKi8KLQlpZiAoc3BlY19pc191bmljb2RlICYmICFyZXN1bHRfaXNfdW5pY29kZSkgewotCQlQeU9iamVjdCAqdG1wID0gUHlPYmplY3RfVW5pY29kZShyZXN1bHQpOwotCQkvKiBUaGlzIGxvZ2ljIHdvcmtzIHdoZXRoZXIgb3Igbm90IHRtcCBpcyBOVUxMICovCi0JCVB5X0RFQ1JFRihyZXN1bHQpOwotCQlyZXN1bHQgPSB0bXA7Ci0JfQorICAgIC8qIENvbnZlcnQgdG8gdW5pY29kZSwgaWYgbmVlZGVkLiAgUmVxdWlyZWQgaWYgc3BlYyBpcyB1bmljb2RlCisgICAgICAgYW5kIHJlc3VsdCBpcyBzdHIgKi8KKyAgICBpZiAoc3BlY19pc191bmljb2RlICYmICFyZXN1bHRfaXNfdW5pY29kZSkgeworICAgICAgICBQeU9iamVjdCAqdG1wID0gUHlPYmplY3RfVW5pY29kZShyZXN1bHQpOworICAgICAgICAvKiBUaGlzIGxvZ2ljIHdvcmtzIHdoZXRoZXIgb3Igbm90IHRtcCBpcyBOVUxMICovCisgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICByZXN1bHQgPSB0bXA7CisgICAgfQogCiBkb25lOgotCVB5X1hERUNSRUYoZW1wdHkpOwotCXJldHVybiByZXN1bHQ7CisgICAgUHlfWERFQ1JFRihlbXB0eSk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogLyogT3BlcmF0aW9ucyBvbiBudW1iZXJzICovCkBAIC04NTQsOSArODU0LDkgQEAKIGludAogUHlOdW1iZXJfQ2hlY2soUHlPYmplY3QgKm8pCiB7Ci0JcmV0dXJuIG8gJiYgby0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyICYmCi0JICAgICAgIChvLT5vYl90eXBlLT50cF9hc19udW1iZXItPm5iX2ludCB8fAotCQlvLT5vYl90eXBlLT50cF9hc19udW1iZXItPm5iX2Zsb2F0KTsKKyAgICByZXR1cm4gbyAmJiBvLT5vYl90eXBlLT50cF9hc19udW1iZXIgJiYKKyAgICAgICAgICAgKG8tPm9iX3R5cGUtPnRwX2FzX251bWJlci0+bmJfaW50IHx8CisgICAgICAgIG8tPm9iX3R5cGUtPnRwX2FzX251bWJlci0+bmJfZmxvYXQpOwogfQogCiAvKiBCaW5hcnkgb3BlcmF0b3JzICovCkBAIC04NjUsMTkgKzg2NSwxOSBAQAogCiAjZGVmaW5lIE5CX1NMT1QoeCkgb2Zmc2V0b2YoUHlOdW1iZXJNZXRob2RzLCB4KQogI2RlZmluZSBOQl9CSU5PUChuYl9tZXRob2RzLCBzbG90KSBcCi0JCSgqKGJpbmFyeWZ1bmMqKSgmICgoY2hhciopbmJfbWV0aG9kcylbc2xvdF0pKQorICAgICAgICAoKihiaW5hcnlmdW5jKikoJiAoKGNoYXIqKW5iX21ldGhvZHMpW3Nsb3RdKSkKICNkZWZpbmUgTkJfVEVSTk9QKG5iX21ldGhvZHMsIHNsb3QpIFwKLQkJKCoodGVybmFyeWZ1bmMqKSgmICgoY2hhciopbmJfbWV0aG9kcylbc2xvdF0pKQorICAgICAgICAoKih0ZXJuYXJ5ZnVuYyopKCYgKChjaGFyKiluYl9tZXRob2RzKVtzbG90XSkpCiAKIC8qCiAgIENhbGxpbmcgc2NoZW1lIHVzZWQgZm9yIGJpbmFyeSBvcGVyYXRpb25zOgogCi0gIHYJdwlBY3Rpb24KKyAgdiAgICAgdyAgICAgICBBY3Rpb24KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICBuZXcJbmV3CXcub3Aodix3KVsqXSwgdi5vcCh2LHcpLCB3Lm9wKHYsdykKLSAgbmV3CW9sZAl2Lm9wKHYsdyksIGNvZXJjZSh2LHcpLCB2Lm9wKHYsdykKLSAgb2xkCW5ldwl3Lm9wKHYsdyksIGNvZXJjZSh2LHcpLCB2Lm9wKHYsdykKLSAgb2xkCW9sZAljb2VyY2Uodix3KSwgdi5vcCh2LHcpCisgIG5ldyAgIG5ldyAgICAgdy5vcCh2LHcpWypdLCB2Lm9wKHYsdyksIHcub3Aodix3KQorICBuZXcgICBvbGQgICAgIHYub3Aodix3KSwgY29lcmNlKHYsdyksIHYub3Aodix3KQorICBvbGQgICBuZXcgICAgIHcub3Aodix3KSwgY29lcmNlKHYsdyksIHYub3Aodix3KQorICBvbGQgICBvbGQgICAgIGNvZXJjZSh2LHcpLCB2Lm9wKHYsdykKIAogICBbKl0gb25seSB3aGVuIHYtPm9iX3R5cGUgIT0gdy0+b2JfdHlwZSAmJiB3LT5vYl90eXBlIGlzIGEgc3ViY2xhc3Mgb2YKICAgICAgIHYtPm9iX3R5cGUKQEAgLTg5NCw4NCArODk0LDg0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYmluYXJ5X29wMShQeU9iamVjdCAqdiwgUHlPYmplY3QgKncsIGNvbnN0IGludCBvcF9zbG90KQogewotCVB5T2JqZWN0ICp4OwotCWJpbmFyeWZ1bmMgc2xvdHYgPSBOVUxMOwotCWJpbmFyeWZ1bmMgc2xvdHcgPSBOVUxMOworICAgIFB5T2JqZWN0ICp4OworICAgIGJpbmFyeWZ1bmMgc2xvdHYgPSBOVUxMOworICAgIGJpbmFyeWZ1bmMgc2xvdHcgPSBOVUxMOwogCi0JaWYgKHYtPm9iX3R5cGUtPnRwX2FzX251bWJlciAhPSBOVUxMICYmIE5FV19TVFlMRV9OVU1CRVIodikpCi0JCXNsb3R2ID0gTkJfQklOT1Aodi0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyLCBvcF9zbG90KTsKLQlpZiAody0+b2JfdHlwZSAhPSB2LT5vYl90eXBlICYmCi0JICAgIHctPm9iX3R5cGUtPnRwX2FzX251bWJlciAhPSBOVUxMICYmIE5FV19TVFlMRV9OVU1CRVIodykpIHsKLQkJc2xvdHcgPSBOQl9CSU5PUCh3LT5vYl90eXBlLT50cF9hc19udW1iZXIsIG9wX3Nsb3QpOwotCQlpZiAoc2xvdHcgPT0gc2xvdHYpCi0JCQlzbG90dyA9IE5VTEw7Ci0JfQotCWlmIChzbG90dikgewotCQlpZiAoc2xvdHcgJiYgUHlUeXBlX0lzU3VidHlwZSh3LT5vYl90eXBlLCB2LT5vYl90eXBlKSkgewotCQkJeCA9IHNsb3R3KHYsIHcpOwotCQkJaWYgKHggIT0gUHlfTm90SW1wbGVtZW50ZWQpCi0JCQkJcmV0dXJuIHg7Ci0JCQlQeV9ERUNSRUYoeCk7IC8qIGNhbid0IGRvIGl0ICovCi0JCQlzbG90dyA9IE5VTEw7Ci0JCX0KLQkJeCA9IHNsb3R2KHYsIHcpOwotCQlpZiAoeCAhPSBQeV9Ob3RJbXBsZW1lbnRlZCkKLQkJCXJldHVybiB4OwotCQlQeV9ERUNSRUYoeCk7IC8qIGNhbid0IGRvIGl0ICovCi0JfQotCWlmIChzbG90dykgewotCQl4ID0gc2xvdHcodiwgdyk7Ci0JCWlmICh4ICE9IFB5X05vdEltcGxlbWVudGVkKQotCQkJcmV0dXJuIHg7Ci0JCVB5X0RFQ1JFRih4KTsgLyogY2FuJ3QgZG8gaXQgKi8KLQl9Ci0JaWYgKCFORVdfU1RZTEVfTlVNQkVSKHYpIHx8ICFORVdfU1RZTEVfTlVNQkVSKHcpKSB7Ci0JCWludCBlcnIgPSBQeU51bWJlcl9Db2VyY2VFeCgmdiwgJncpOwotCQlpZiAoZXJyIDwgMCkgewotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJaWYgKGVyciA9PSAwKSB7Ci0JCQlQeU51bWJlck1ldGhvZHMgKm12ID0gdi0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyOwotCQkJaWYgKG12KSB7Ci0JCQkJYmluYXJ5ZnVuYyBzbG90OwotCQkJCXNsb3QgPSBOQl9CSU5PUChtdiwgb3Bfc2xvdCk7Ci0JCQkJaWYgKHNsb3QpIHsKLQkJCQkJeCA9IHNsb3Qodiwgdyk7Ci0JCQkJCVB5X0RFQ1JFRih2KTsKLQkJCQkJUHlfREVDUkVGKHcpOwotCQkJCQlyZXR1cm4geDsKLQkJCQl9Ci0JCQl9Ci0JCQkvKiBDb2VyY2VFeCBpbmNyZW1lbnRlZCB0aGUgcmVmZXJlbmNlIGNvdW50cyAqLwotCQkJUHlfREVDUkVGKHYpOwotCQkJUHlfREVDUkVGKHcpOwotCQl9Ci0JfQotCVB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7Ci0JcmV0dXJuIFB5X05vdEltcGxlbWVudGVkOworICAgIGlmICh2LT5vYl90eXBlLT50cF9hc19udW1iZXIgIT0gTlVMTCAmJiBORVdfU1RZTEVfTlVNQkVSKHYpKQorICAgICAgICBzbG90diA9IE5CX0JJTk9QKHYtPm9iX3R5cGUtPnRwX2FzX251bWJlciwgb3Bfc2xvdCk7CisgICAgaWYgKHctPm9iX3R5cGUgIT0gdi0+b2JfdHlwZSAmJgorICAgICAgICB3LT5vYl90eXBlLT50cF9hc19udW1iZXIgIT0gTlVMTCAmJiBORVdfU1RZTEVfTlVNQkVSKHcpKSB7CisgICAgICAgIHNsb3R3ID0gTkJfQklOT1Aody0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyLCBvcF9zbG90KTsKKyAgICAgICAgaWYgKHNsb3R3ID09IHNsb3R2KQorICAgICAgICAgICAgc2xvdHcgPSBOVUxMOworICAgIH0KKyAgICBpZiAoc2xvdHYpIHsKKyAgICAgICAgaWYgKHNsb3R3ICYmIFB5VHlwZV9Jc1N1YnR5cGUody0+b2JfdHlwZSwgdi0+b2JfdHlwZSkpIHsKKyAgICAgICAgICAgIHggPSBzbG90dyh2LCB3KTsKKyAgICAgICAgICAgIGlmICh4ICE9IFB5X05vdEltcGxlbWVudGVkKQorICAgICAgICAgICAgICAgIHJldHVybiB4OworICAgICAgICAgICAgUHlfREVDUkVGKHgpOyAvKiBjYW4ndCBkbyBpdCAqLworICAgICAgICAgICAgc2xvdHcgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIHggPSBzbG90dih2LCB3KTsKKyAgICAgICAgaWYgKHggIT0gUHlfTm90SW1wbGVtZW50ZWQpCisgICAgICAgICAgICByZXR1cm4geDsKKyAgICAgICAgUHlfREVDUkVGKHgpOyAvKiBjYW4ndCBkbyBpdCAqLworICAgIH0KKyAgICBpZiAoc2xvdHcpIHsKKyAgICAgICAgeCA9IHNsb3R3KHYsIHcpOworICAgICAgICBpZiAoeCAhPSBQeV9Ob3RJbXBsZW1lbnRlZCkKKyAgICAgICAgICAgIHJldHVybiB4OworICAgICAgICBQeV9ERUNSRUYoeCk7IC8qIGNhbid0IGRvIGl0ICovCisgICAgfQorICAgIGlmICghTkVXX1NUWUxFX05VTUJFUih2KSB8fCAhTkVXX1NUWUxFX05VTUJFUih3KSkgeworICAgICAgICBpbnQgZXJyID0gUHlOdW1iZXJfQ29lcmNlRXgoJnYsICZ3KTsKKyAgICAgICAgaWYgKGVyciA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGlmIChlcnIgPT0gMCkgeworICAgICAgICAgICAgUHlOdW1iZXJNZXRob2RzICptdiA9IHYtPm9iX3R5cGUtPnRwX2FzX251bWJlcjsKKyAgICAgICAgICAgIGlmIChtdikgeworICAgICAgICAgICAgICAgIGJpbmFyeWZ1bmMgc2xvdDsKKyAgICAgICAgICAgICAgICBzbG90ID0gTkJfQklOT1AobXYsIG9wX3Nsb3QpOworICAgICAgICAgICAgICAgIGlmIChzbG90KSB7CisgICAgICAgICAgICAgICAgICAgIHggPSBzbG90KHYsIHcpOworICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih3KTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogQ29lcmNlRXggaW5jcmVtZW50ZWQgdGhlIHJlZmVyZW5jZSBjb3VudHMgKi8KKyAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih3KTsKKyAgICAgICAgfQorICAgIH0KKyAgICBQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOworICAgIHJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGJpbm9wX3R5cGVfZXJyb3IoUHlPYmplY3QgKnYsIFB5T2JqZWN0ICp3LCBjb25zdCBjaGFyICpvcF9uYW1lKQogewotCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCSAgICAgInVuc3VwcG9ydGVkIG9wZXJhbmQgdHlwZShzKSBmb3IgJS4xMDBzOiAiCi0JCSAgICAgIiclLjEwMHMnIGFuZCAnJS4xMDBzJyIsCi0JCSAgICAgb3BfbmFtZSwKLQkJICAgICB2LT5vYl90eXBlLT50cF9uYW1lLAotCQkgICAgIHctPm9iX3R5cGUtPnRwX25hbWUpOwotCXJldHVybiBOVUxMOworICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICJ1bnN1cHBvcnRlZCBvcGVyYW5kIHR5cGUocykgZm9yICUuMTAwczogIgorICAgICAgICAgICAgICAgICAiJyUuMTAwcycgYW5kICclLjEwMHMnIiwKKyAgICAgICAgICAgICAgICAgb3BfbmFtZSwKKyAgICAgICAgICAgICAgICAgdi0+b2JfdHlwZS0+dHBfbmFtZSwKKyAgICAgICAgICAgICAgICAgdy0+b2JfdHlwZS0+dHBfbmFtZSk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBiaW5hcnlfb3AoUHlPYmplY3QgKnYsIFB5T2JqZWN0ICp3LCBjb25zdCBpbnQgb3Bfc2xvdCwgY29uc3QgY2hhciAqb3BfbmFtZSkKIHsKLQlQeU9iamVjdCAqcmVzdWx0ID0gYmluYXJ5X29wMSh2LCB3LCBvcF9zbG90KTsKLQlpZiAocmVzdWx0ID09IFB5X05vdEltcGxlbWVudGVkKSB7Ci0JCVB5X0RFQ1JFRihyZXN1bHQpOwotCQlyZXR1cm4gYmlub3BfdHlwZV9lcnJvcih2LCB3LCBvcF9uYW1lKTsKLQl9Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBQeU9iamVjdCAqcmVzdWx0ID0gYmluYXJ5X29wMSh2LCB3LCBvcF9zbG90KTsKKyAgICBpZiAocmVzdWx0ID09IFB5X05vdEltcGxlbWVudGVkKSB7CisgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICByZXR1cm4gYmlub3BfdHlwZV9lcnJvcih2LCB3LCBvcF9uYW1lKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogCkBAIC05ODAsMTYgKzk4MCwxNiBAQAogCiAgICoqKiBJbiBzb21lIGNhc2VzLCB3Lm9wIGlzIGNhbGxlZCBiZWZvcmUgdi5vcDsgc2VlIGJpbmFyeV9vcDEuICoqKgogCi0gIHYJdwl6CUFjdGlvbgorICB2ICAgICB3ICAgICAgIHogICAgICAgQWN0aW9uCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgbmV3CW5ldwluZXcJdi5vcCh2LHcseiksIHcub3Aodix3LHopLCB6Lm9wKHYsdyx6KQotICBuZXcJb2xkCW5ldwl2Lm9wKHYsdyx6KSwgei5vcCh2LHcseiksIGNvZXJjZSh2LHcseiksIHYub3Aodix3LHopCi0gIG9sZAluZXcJbmV3CXcub3Aodix3LHopLCB6Lm9wKHYsdyx6KSwgY29lcmNlKHYsdyx6KSwgdi5vcCh2LHcseikKLSAgb2xkCW9sZAluZXcJei5vcCh2LHcseiksIGNvZXJjZSh2LHcseiksIHYub3Aodix3LHopCi0gIG5ldwluZXcJb2xkCXYub3Aodix3LHopLCB3Lm9wKHYsdyx6KSwgY29lcmNlKHYsdyx6KSwgdi5vcCh2LHcseikKLSAgbmV3CW9sZAlvbGQJdi5vcCh2LHcseiksIGNvZXJjZSh2LHcseiksIHYub3Aodix3LHopCi0gIG9sZAluZXcJb2xkCXcub3Aodix3LHopLCBjb2VyY2Uodix3LHopLCB2Lm9wKHYsdyx6KQotICBvbGQJb2xkCW9sZAljb2VyY2Uodix3LHopLCB2Lm9wKHYsdyx6KQorICBuZXcgICBuZXcgICAgIG5ldyAgICAgdi5vcCh2LHcseiksIHcub3Aodix3LHopLCB6Lm9wKHYsdyx6KQorICBuZXcgICBvbGQgICAgIG5ldyAgICAgdi5vcCh2LHcseiksIHoub3Aodix3LHopLCBjb2VyY2Uodix3LHopLCB2Lm9wKHYsdyx6KQorICBvbGQgICBuZXcgICAgIG5ldyAgICAgdy5vcCh2LHcseiksIHoub3Aodix3LHopLCBjb2VyY2Uodix3LHopLCB2Lm9wKHYsdyx6KQorICBvbGQgICBvbGQgICAgIG5ldyAgICAgei5vcCh2LHcseiksIGNvZXJjZSh2LHcseiksIHYub3Aodix3LHopCisgIG5ldyAgIG5ldyAgICAgb2xkICAgICB2Lm9wKHYsdyx6KSwgdy5vcCh2LHcseiksIGNvZXJjZSh2LHcseiksIHYub3Aodix3LHopCisgIG5ldyAgIG9sZCAgICAgb2xkICAgICB2Lm9wKHYsdyx6KSwgY29lcmNlKHYsdyx6KSwgdi5vcCh2LHcseikKKyAgb2xkICAgbmV3ICAgICBvbGQgICAgIHcub3Aodix3LHopLCBjb2VyY2Uodix3LHopLCB2Lm9wKHYsdyx6KQorICBvbGQgICBvbGQgICAgIG9sZCAgICAgY29lcmNlKHYsdyx6KSwgdi5vcCh2LHcseikKIAogICBMZWdlbmQ6CiAgIC0tLS0tLS0KQEAgLTEwMDUsMTQxICsxMDA1LDE0MSBAQAogCiBzdGF0aWMgUHlPYmplY3QgKgogdGVybmFyeV9vcChQeU9iamVjdCAqdiwKLQkgICBQeU9iamVjdCAqdywKLQkgICBQeU9iamVjdCAqeiwKLQkgICBjb25zdCBpbnQgb3Bfc2xvdCwKLQkgICBjb25zdCBjaGFyICpvcF9uYW1lKQorICAgICAgICAgICBQeU9iamVjdCAqdywKKyAgICAgICAgICAgUHlPYmplY3QgKnosCisgICAgICAgICAgIGNvbnN0IGludCBvcF9zbG90LAorICAgICAgICAgICBjb25zdCBjaGFyICpvcF9uYW1lKQogewotCVB5TnVtYmVyTWV0aG9kcyAqbXYsICptdywgKm16OwotCVB5T2JqZWN0ICp4ID0gTlVMTDsKLQl0ZXJuYXJ5ZnVuYyBzbG90diA9IE5VTEw7Ci0JdGVybmFyeWZ1bmMgc2xvdHcgPSBOVUxMOwotCXRlcm5hcnlmdW5jIHNsb3R6ID0gTlVMTDsKKyAgICBQeU51bWJlck1ldGhvZHMgKm12LCAqbXcsICptejsKKyAgICBQeU9iamVjdCAqeCA9IE5VTEw7CisgICAgdGVybmFyeWZ1bmMgc2xvdHYgPSBOVUxMOworICAgIHRlcm5hcnlmdW5jIHNsb3R3ID0gTlVMTDsKKyAgICB0ZXJuYXJ5ZnVuYyBzbG90eiA9IE5VTEw7CiAKLQltdiA9IHYtPm9iX3R5cGUtPnRwX2FzX251bWJlcjsKLQltdyA9IHctPm9iX3R5cGUtPnRwX2FzX251bWJlcjsKLQlpZiAobXYgIT0gTlVMTCAmJiBORVdfU1RZTEVfTlVNQkVSKHYpKQotCQlzbG90diA9IE5CX1RFUk5PUChtdiwgb3Bfc2xvdCk7Ci0JaWYgKHctPm9iX3R5cGUgIT0gdi0+b2JfdHlwZSAmJgotCSAgICBtdyAhPSBOVUxMICYmIE5FV19TVFlMRV9OVU1CRVIodykpIHsKLQkJc2xvdHcgPSBOQl9URVJOT1AobXcsIG9wX3Nsb3QpOwotCQlpZiAoc2xvdHcgPT0gc2xvdHYpCi0JCQlzbG90dyA9IE5VTEw7Ci0JfQotCWlmIChzbG90dikgewotCQlpZiAoc2xvdHcgJiYgUHlUeXBlX0lzU3VidHlwZSh3LT5vYl90eXBlLCB2LT5vYl90eXBlKSkgewotCQkJeCA9IHNsb3R3KHYsIHcsIHopOwotCQkJaWYgKHggIT0gUHlfTm90SW1wbGVtZW50ZWQpCi0JCQkJcmV0dXJuIHg7Ci0JCQlQeV9ERUNSRUYoeCk7IC8qIGNhbid0IGRvIGl0ICovCi0JCQlzbG90dyA9IE5VTEw7Ci0JCX0KLQkJeCA9IHNsb3R2KHYsIHcsIHopOwotCQlpZiAoeCAhPSBQeV9Ob3RJbXBsZW1lbnRlZCkKLQkJCXJldHVybiB4OwotCQlQeV9ERUNSRUYoeCk7IC8qIGNhbid0IGRvIGl0ICovCi0JfQotCWlmIChzbG90dykgewotCQl4ID0gc2xvdHcodiwgdywgeik7Ci0JCWlmICh4ICE9IFB5X05vdEltcGxlbWVudGVkKQotCQkJcmV0dXJuIHg7Ci0JCVB5X0RFQ1JFRih4KTsgLyogY2FuJ3QgZG8gaXQgKi8KLQl9Ci0JbXogPSB6LT5vYl90eXBlLT50cF9hc19udW1iZXI7Ci0JaWYgKG16ICE9IE5VTEwgJiYgTkVXX1NUWUxFX05VTUJFUih6KSkgewotCQlzbG90eiA9IE5CX1RFUk5PUChteiwgb3Bfc2xvdCk7Ci0JCWlmIChzbG90eiA9PSBzbG90diB8fCBzbG90eiA9PSBzbG90dykKLQkJCXNsb3R6ID0gTlVMTDsKLQkJaWYgKHNsb3R6KSB7Ci0JCQl4ID0gc2xvdHoodiwgdywgeik7Ci0JCQlpZiAoeCAhPSBQeV9Ob3RJbXBsZW1lbnRlZCkKLQkJCQlyZXR1cm4geDsKLQkJCVB5X0RFQ1JFRih4KTsgLyogY2FuJ3QgZG8gaXQgKi8KLQkJfQotCX0KKyAgICBtdiA9IHYtPm9iX3R5cGUtPnRwX2FzX251bWJlcjsKKyAgICBtdyA9IHctPm9iX3R5cGUtPnRwX2FzX251bWJlcjsKKyAgICBpZiAobXYgIT0gTlVMTCAmJiBORVdfU1RZTEVfTlVNQkVSKHYpKQorICAgICAgICBzbG90diA9IE5CX1RFUk5PUChtdiwgb3Bfc2xvdCk7CisgICAgaWYgKHctPm9iX3R5cGUgIT0gdi0+b2JfdHlwZSAmJgorICAgICAgICBtdyAhPSBOVUxMICYmIE5FV19TVFlMRV9OVU1CRVIodykpIHsKKyAgICAgICAgc2xvdHcgPSBOQl9URVJOT1AobXcsIG9wX3Nsb3QpOworICAgICAgICBpZiAoc2xvdHcgPT0gc2xvdHYpCisgICAgICAgICAgICBzbG90dyA9IE5VTEw7CisgICAgfQorICAgIGlmIChzbG90dikgeworICAgICAgICBpZiAoc2xvdHcgJiYgUHlUeXBlX0lzU3VidHlwZSh3LT5vYl90eXBlLCB2LT5vYl90eXBlKSkgeworICAgICAgICAgICAgeCA9IHNsb3R3KHYsIHcsIHopOworICAgICAgICAgICAgaWYgKHggIT0gUHlfTm90SW1wbGVtZW50ZWQpCisgICAgICAgICAgICAgICAgcmV0dXJuIHg7CisgICAgICAgICAgICBQeV9ERUNSRUYoeCk7IC8qIGNhbid0IGRvIGl0ICovCisgICAgICAgICAgICBzbG90dyA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgeCA9IHNsb3R2KHYsIHcsIHopOworICAgICAgICBpZiAoeCAhPSBQeV9Ob3RJbXBsZW1lbnRlZCkKKyAgICAgICAgICAgIHJldHVybiB4OworICAgICAgICBQeV9ERUNSRUYoeCk7IC8qIGNhbid0IGRvIGl0ICovCisgICAgfQorICAgIGlmIChzbG90dykgeworICAgICAgICB4ID0gc2xvdHcodiwgdywgeik7CisgICAgICAgIGlmICh4ICE9IFB5X05vdEltcGxlbWVudGVkKQorICAgICAgICAgICAgcmV0dXJuIHg7CisgICAgICAgIFB5X0RFQ1JFRih4KTsgLyogY2FuJ3QgZG8gaXQgKi8KKyAgICB9CisgICAgbXogPSB6LT5vYl90eXBlLT50cF9hc19udW1iZXI7CisgICAgaWYgKG16ICE9IE5VTEwgJiYgTkVXX1NUWUxFX05VTUJFUih6KSkgeworICAgICAgICBzbG90eiA9IE5CX1RFUk5PUChteiwgb3Bfc2xvdCk7CisgICAgICAgIGlmIChzbG90eiA9PSBzbG90diB8fCBzbG90eiA9PSBzbG90dykKKyAgICAgICAgICAgIHNsb3R6ID0gTlVMTDsKKyAgICAgICAgaWYgKHNsb3R6KSB7CisgICAgICAgICAgICB4ID0gc2xvdHoodiwgdywgeik7CisgICAgICAgICAgICBpZiAoeCAhPSBQeV9Ob3RJbXBsZW1lbnRlZCkKKyAgICAgICAgICAgICAgICByZXR1cm4geDsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih4KTsgLyogY2FuJ3QgZG8gaXQgKi8KKyAgICAgICAgfQorICAgIH0KIAotCWlmICghTkVXX1NUWUxFX05VTUJFUih2KSB8fCAhTkVXX1NUWUxFX05VTUJFUih3KSB8fAotCQkJKHogIT0gUHlfTm9uZSAmJiAhTkVXX1NUWUxFX05VTUJFUih6KSkpIHsKLQkJLyogd2UgaGF2ZSBhbiBvbGQgc3R5bGUgb3BlcmFuZCwgY29lcmNlICovCi0JCVB5T2JqZWN0ICp2MSwgKnoxLCAqdzIsICp6MjsKLQkJaW50IGM7CisgICAgaWYgKCFORVdfU1RZTEVfTlVNQkVSKHYpIHx8ICFORVdfU1RZTEVfTlVNQkVSKHcpIHx8CisgICAgICAgICAgICAgICAgICAgICh6ICE9IFB5X05vbmUgJiYgIU5FV19TVFlMRV9OVU1CRVIoeikpKSB7CisgICAgICAgIC8qIHdlIGhhdmUgYW4gb2xkIHN0eWxlIG9wZXJhbmQsIGNvZXJjZSAqLworICAgICAgICBQeU9iamVjdCAqdjEsICp6MSwgKncyLCAqejI7CisgICAgICAgIGludCBjOwogCi0JCWMgPSBQeU51bWJlcl9Db2VyY2UoJnYsICZ3KTsKLQkJaWYgKGMgIT0gMCkKLQkJCWdvdG8gZXJyb3IzOworICAgICAgICBjID0gUHlOdW1iZXJfQ29lcmNlKCZ2LCAmdyk7CisgICAgICAgIGlmIChjICE9IDApCisgICAgICAgICAgICBnb3RvIGVycm9yMzsKIAotCQkvKiBTcGVjaWFsIGNhc2U6IGlmIHRoZSB0aGlyZCBhcmd1bWVudCBpcyBOb25lLCBpdCBpcwotCQkgICB0cmVhdGVkIGFzIGFic2VudCBhcmd1bWVudCBhbmQgbm90IGNvZXJjZWQuICovCi0JCWlmICh6ID09IFB5X05vbmUpIHsKLQkJCWlmICh2LT5vYl90eXBlLT50cF9hc19udW1iZXIpIHsKLQkJCQlzbG90eiA9IE5CX1RFUk5PUCh2LT5vYl90eXBlLT50cF9hc19udW1iZXIsCi0JCQkJCQkgIG9wX3Nsb3QpOwotCQkJCWlmIChzbG90eikKLQkJCQkJeCA9IHNsb3R6KHYsIHcsIHopOwotCQkJCWVsc2UKLQkJCQkJYyA9IC0xOwotCQkJfQotCQkJZWxzZQotCQkJCWMgPSAtMTsKLQkJCWdvdG8gZXJyb3IyOwotCQl9Ci0JCXYxID0gdjsKLQkJejEgPSB6OwotCQljID0gUHlOdW1iZXJfQ29lcmNlKCZ2MSwgJnoxKTsKLQkJaWYgKGMgIT0gMCkKLQkJCWdvdG8gZXJyb3IyOwotCQl3MiA9IHc7Ci0JCXoyID0gejE7Ci0JCWMgPSBQeU51bWJlcl9Db2VyY2UoJncyLCAmejIpOwotCQlpZiAoYyAhPSAwKQotCQkJZ290byBlcnJvcjE7CisgICAgICAgIC8qIFNwZWNpYWwgY2FzZTogaWYgdGhlIHRoaXJkIGFyZ3VtZW50IGlzIE5vbmUsIGl0IGlzCisgICAgICAgICAgIHRyZWF0ZWQgYXMgYWJzZW50IGFyZ3VtZW50IGFuZCBub3QgY29lcmNlZC4gKi8KKyAgICAgICAgaWYgKHogPT0gUHlfTm9uZSkgeworICAgICAgICAgICAgaWYgKHYtPm9iX3R5cGUtPnRwX2FzX251bWJlcikgeworICAgICAgICAgICAgICAgIHNsb3R6ID0gTkJfVEVSTk9QKHYtPm9iX3R5cGUtPnRwX2FzX251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcF9zbG90KTsKKyAgICAgICAgICAgICAgICBpZiAoc2xvdHopCisgICAgICAgICAgICAgICAgICAgIHggPSBzbG90eih2LCB3LCB6KTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGMgPSAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBjID0gLTE7CisgICAgICAgICAgICBnb3RvIGVycm9yMjsKKyAgICAgICAgfQorICAgICAgICB2MSA9IHY7CisgICAgICAgIHoxID0gejsKKyAgICAgICAgYyA9IFB5TnVtYmVyX0NvZXJjZSgmdjEsICZ6MSk7CisgICAgICAgIGlmIChjICE9IDApCisgICAgICAgICAgICBnb3RvIGVycm9yMjsKKyAgICAgICAgdzIgPSB3OworICAgICAgICB6MiA9IHoxOworICAgICAgICBjID0gUHlOdW1iZXJfQ29lcmNlKCZ3MiwgJnoyKTsKKyAgICAgICAgaWYgKGMgIT0gMCkKKyAgICAgICAgICAgIGdvdG8gZXJyb3IxOwogCi0JCWlmICh2MS0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyICE9IE5VTEwpIHsKLQkJCXNsb3R2ID0gTkJfVEVSTk9QKHYxLT5vYl90eXBlLT50cF9hc19udW1iZXIsCi0JCQkJCSAgb3Bfc2xvdCk7Ci0JCQlpZiAoc2xvdHYpCi0JCQkJeCA9IHNsb3R2KHYxLCB3MiwgejIpOwotCQkJZWxzZQotCQkJCWMgPSAtMTsKLQkJfQotCQllbHNlCi0JCQljID0gLTE7CisgICAgICAgIGlmICh2MS0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHNsb3R2ID0gTkJfVEVSTk9QKHYxLT5vYl90eXBlLT50cF9hc19udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcF9zbG90KTsKKyAgICAgICAgICAgIGlmIChzbG90dikKKyAgICAgICAgICAgICAgICB4ID0gc2xvdHYodjEsIHcyLCB6Mik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYyA9IC0xOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGMgPSAtMTsKIAotCQlQeV9ERUNSRUYodzIpOwotCQlQeV9ERUNSRUYoejIpOwotCWVycm9yMToKLQkJUHlfREVDUkVGKHYxKTsKLQkJUHlfREVDUkVGKHoxKTsKLQllcnJvcjI6Ci0JCVB5X0RFQ1JFRih2KTsKLQkJUHlfREVDUkVGKHcpOwotCWVycm9yMzoKLQkJaWYgKGMgPj0gMCkKLQkJCXJldHVybiB4OwotCX0KKyAgICAgICAgUHlfREVDUkVGKHcyKTsKKyAgICAgICAgUHlfREVDUkVGKHoyKTsKKyAgICBlcnJvcjE6CisgICAgICAgIFB5X0RFQ1JFRih2MSk7CisgICAgICAgIFB5X0RFQ1JFRih6MSk7CisgICAgZXJyb3IyOgorICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgIFB5X0RFQ1JFRih3KTsKKyAgICBlcnJvcjM6CisgICAgICAgIGlmIChjID49IDApCisgICAgICAgICAgICByZXR1cm4geDsKKyAgICB9CiAKLQlpZiAoeiA9PSBQeV9Ob25lKQotCQlQeUVycl9Gb3JtYXQoCi0JCQlQeUV4Y19UeXBlRXJyb3IsCi0JCQkidW5zdXBwb3J0ZWQgb3BlcmFuZCB0eXBlKHMpIGZvciAqKiBvciBwb3coKTogIgotCQkJIiclLjEwMHMnIGFuZCAnJS4xMDBzJyIsCi0JCQl2LT5vYl90eXBlLT50cF9uYW1lLAotCQkJdy0+b2JfdHlwZS0+dHBfbmFtZSk7Ci0JZWxzZQotCQlQeUVycl9Gb3JtYXQoCi0JCQlQeUV4Y19UeXBlRXJyb3IsCi0JCQkidW5zdXBwb3J0ZWQgb3BlcmFuZCB0eXBlKHMpIGZvciBwb3coKTogIgotCQkJIiclLjEwMHMnLCAnJS4xMDBzJywgJyUuMTAwcyciLAotCQkJdi0+b2JfdHlwZS0+dHBfbmFtZSwKLQkJCXctPm9iX3R5cGUtPnRwX25hbWUsCi0JCQl6LT5vYl90eXBlLT50cF9uYW1lKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoeiA9PSBQeV9Ob25lKQorICAgICAgICBQeUVycl9Gb3JtYXQoCisgICAgICAgICAgICBQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAidW5zdXBwb3J0ZWQgb3BlcmFuZCB0eXBlKHMpIGZvciAqKiBvciBwb3coKTogIgorICAgICAgICAgICAgIiclLjEwMHMnIGFuZCAnJS4xMDBzJyIsCisgICAgICAgICAgICB2LT5vYl90eXBlLT50cF9uYW1lLAorICAgICAgICAgICAgdy0+b2JfdHlwZS0+dHBfbmFtZSk7CisgICAgZWxzZQorICAgICAgICBQeUVycl9Gb3JtYXQoCisgICAgICAgICAgICBQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAidW5zdXBwb3J0ZWQgb3BlcmFuZCB0eXBlKHMpIGZvciBwb3coKTogIgorICAgICAgICAgICAgIiclLjEwMHMnLCAnJS4xMDBzJywgJyUuMTAwcyciLAorICAgICAgICAgICAgdi0+b2JfdHlwZS0+dHBfbmFtZSwKKyAgICAgICAgICAgIHctPm9iX3R5cGUtPnRwX25hbWUsCisgICAgICAgICAgICB6LT5vYl90eXBlLT50cF9uYW1lKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogI2RlZmluZSBCSU5BUllfRlVOQyhmdW5jLCBvcCwgb3BfbmFtZSkgXAogICAgIFB5T2JqZWN0ICogXAogICAgIGZ1bmMoUHlPYmplY3QgKnYsIFB5T2JqZWN0ICp3KSB7IFwKLQkgICAgcmV0dXJuIGJpbmFyeV9vcCh2LCB3LCBOQl9TTE9UKG9wKSwgb3BfbmFtZSk7IFwKKyAgICAgICAgcmV0dXJuIGJpbmFyeV9vcCh2LCB3LCBOQl9TTE9UKG9wKSwgb3BfbmFtZSk7IFwKICAgICB9CiAKIEJJTkFSWV9GVU5DKFB5TnVtYmVyX09yLCBuYl9vciwgInwiKQpAQCAtMTE1NCw3NyArMTE1NCw3NyBAQAogUHlPYmplY3QgKgogUHlOdW1iZXJfQWRkKFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdykKIHsKLQlQeU9iamVjdCAqcmVzdWx0ID0gYmluYXJ5X29wMSh2LCB3LCBOQl9TTE9UKG5iX2FkZCkpOwotCWlmIChyZXN1bHQgPT0gUHlfTm90SW1wbGVtZW50ZWQpIHsKLQkJUHlTZXF1ZW5jZU1ldGhvZHMgKm0gPSB2LT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZTsKLQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCWlmIChtICYmIG0tPnNxX2NvbmNhdCkgewotCQkJcmV0dXJuICgqbS0+c3FfY29uY2F0KSh2LCB3KTsKLQkJfQotCQlyZXN1bHQgPSBiaW5vcF90eXBlX2Vycm9yKHYsIHcsICIrIik7Ci0JfQotCXJldHVybiByZXN1bHQ7CisgICAgUHlPYmplY3QgKnJlc3VsdCA9IGJpbmFyeV9vcDEodiwgdywgTkJfU0xPVChuYl9hZGQpKTsKKyAgICBpZiAocmVzdWx0ID09IFB5X05vdEltcGxlbWVudGVkKSB7CisgICAgICAgIFB5U2VxdWVuY2VNZXRob2RzICptID0gdi0+b2JfdHlwZS0+dHBfYXNfc2VxdWVuY2U7CisgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICBpZiAobSAmJiBtLT5zcV9jb25jYXQpIHsKKyAgICAgICAgICAgIHJldHVybiAoKm0tPnNxX2NvbmNhdCkodiwgdyk7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0ID0gYmlub3BfdHlwZV9lcnJvcih2LCB3LCAiKyIpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc2VxdWVuY2VfcmVwZWF0KHNzaXplYXJnZnVuYyByZXBlYXRmdW5jLCBQeU9iamVjdCAqc2VxLCBQeU9iamVjdCAqbikKIHsKLQlQeV9zc2l6ZV90IGNvdW50OwotCWlmIChQeUluZGV4X0NoZWNrKG4pKSB7Ci0JCWNvdW50ID0gUHlOdW1iZXJfQXNTc2l6ZV90KG4sIFB5RXhjX092ZXJmbG93RXJyb3IpOwotCQlpZiAoY291bnQgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJCXJldHVybiBOVUxMOwotCX0KLQllbHNlIHsKLQkJcmV0dXJuIHR5cGVfZXJyb3IoImNhbid0IG11bHRpcGx5IHNlcXVlbmNlIGJ5ICIKLQkJCQkgICJub24taW50IG9mIHR5cGUgJyUuMjAwcyciLCBuKTsKLQl9Ci0JcmV0dXJuICgqcmVwZWF0ZnVuYykoc2VxLCBjb3VudCk7CisgICAgUHlfc3NpemVfdCBjb3VudDsKKyAgICBpZiAoUHlJbmRleF9DaGVjayhuKSkgeworICAgICAgICBjb3VudCA9IFB5TnVtYmVyX0FzU3NpemVfdChuLCBQeUV4Y19PdmVyZmxvd0Vycm9yKTsKKyAgICAgICAgaWYgKGNvdW50ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJldHVybiB0eXBlX2Vycm9yKCJjYW4ndCBtdWx0aXBseSBzZXF1ZW5jZSBieSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJub24taW50IG9mIHR5cGUgJyUuMjAwcyciLCBuKTsKKyAgICB9CisgICAgcmV0dXJuICgqcmVwZWF0ZnVuYykoc2VxLCBjb3VudCk7CiB9CiAKIFB5T2JqZWN0ICoKIFB5TnVtYmVyX011bHRpcGx5KFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdykKIHsKLQlQeU9iamVjdCAqcmVzdWx0ID0gYmluYXJ5X29wMSh2LCB3LCBOQl9TTE9UKG5iX211bHRpcGx5KSk7Ci0JaWYgKHJlc3VsdCA9PSBQeV9Ob3RJbXBsZW1lbnRlZCkgewotCQlQeVNlcXVlbmNlTWV0aG9kcyAqbXYgPSB2LT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZTsKLQkJUHlTZXF1ZW5jZU1ldGhvZHMgKm13ID0gdy0+b2JfdHlwZS0+dHBfYXNfc2VxdWVuY2U7Ci0JCVB5X0RFQ1JFRihyZXN1bHQpOwotCQlpZiAgKG12ICYmIG12LT5zcV9yZXBlYXQpIHsKLQkJCXJldHVybiBzZXF1ZW5jZV9yZXBlYXQobXYtPnNxX3JlcGVhdCwgdiwgdyk7Ci0JCX0KLQkJZWxzZSBpZiAobXcgJiYgbXctPnNxX3JlcGVhdCkgewotCQkJcmV0dXJuIHNlcXVlbmNlX3JlcGVhdChtdy0+c3FfcmVwZWF0LCB3LCB2KTsKLQkJfQotCQlyZXN1bHQgPSBiaW5vcF90eXBlX2Vycm9yKHYsIHcsICIqIik7Ci0JfQotCXJldHVybiByZXN1bHQ7CisgICAgUHlPYmplY3QgKnJlc3VsdCA9IGJpbmFyeV9vcDEodiwgdywgTkJfU0xPVChuYl9tdWx0aXBseSkpOworICAgIGlmIChyZXN1bHQgPT0gUHlfTm90SW1wbGVtZW50ZWQpIHsKKyAgICAgICAgUHlTZXF1ZW5jZU1ldGhvZHMgKm12ID0gdi0+b2JfdHlwZS0+dHBfYXNfc2VxdWVuY2U7CisgICAgICAgIFB5U2VxdWVuY2VNZXRob2RzICptdyA9IHctPm9iX3R5cGUtPnRwX2FzX3NlcXVlbmNlOworICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgaWYgIChtdiAmJiBtdi0+c3FfcmVwZWF0KSB7CisgICAgICAgICAgICByZXR1cm4gc2VxdWVuY2VfcmVwZWF0KG12LT5zcV9yZXBlYXQsIHYsIHcpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKG13ICYmIG13LT5zcV9yZXBlYXQpIHsKKyAgICAgICAgICAgIHJldHVybiBzZXF1ZW5jZV9yZXBlYXQobXctPnNxX3JlcGVhdCwgdywgdik7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0ID0gYmlub3BfdHlwZV9lcnJvcih2LCB3LCAiKiIpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBQeU9iamVjdCAqCiBQeU51bWJlcl9GbG9vckRpdmlkZShQeU9iamVjdCAqdiwgUHlPYmplY3QgKncpCiB7Ci0JLyogWFhYIHRwX2ZsYWdzIHRlc3QgKi8KLQlyZXR1cm4gYmluYXJ5X29wKHYsIHcsIE5CX1NMT1QobmJfZmxvb3JfZGl2aWRlKSwgIi8vIik7CisgICAgLyogWFhYIHRwX2ZsYWdzIHRlc3QgKi8KKyAgICByZXR1cm4gYmluYXJ5X29wKHYsIHcsIE5CX1NMT1QobmJfZmxvb3JfZGl2aWRlKSwgIi8vIik7CiB9CiAKIFB5T2JqZWN0ICoKIFB5TnVtYmVyX1RydWVEaXZpZGUoUHlPYmplY3QgKnYsIFB5T2JqZWN0ICp3KQogewotCS8qIFhYWCB0cF9mbGFncyB0ZXN0ICovCi0JcmV0dXJuIGJpbmFyeV9vcCh2LCB3LCBOQl9TTE9UKG5iX3RydWVfZGl2aWRlKSwgIi8iKTsKKyAgICAvKiBYWFggdHBfZmxhZ3MgdGVzdCAqLworICAgIHJldHVybiBiaW5hcnlfb3AodiwgdywgTkJfU0xPVChuYl90cnVlX2RpdmlkZSksICIvIik7CiB9CiAKIFB5T2JqZWN0ICoKIFB5TnVtYmVyX1JlbWFpbmRlcihQeU9iamVjdCAqdiwgUHlPYmplY3QgKncpCiB7Ci0JcmV0dXJuIGJpbmFyeV9vcCh2LCB3LCBOQl9TTE9UKG5iX3JlbWFpbmRlciksICIlIik7CisgICAgcmV0dXJuIGJpbmFyeV9vcCh2LCB3LCBOQl9TTE9UKG5iX3JlbWFpbmRlciksICIlIik7CiB9CiAKIFB5T2JqZWN0ICoKIFB5TnVtYmVyX1Bvd2VyKFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdywgUHlPYmplY3QgKnopCiB7Ci0JcmV0dXJuIHRlcm5hcnlfb3AodiwgdywgeiwgTkJfU0xPVChuYl9wb3dlciksICIqKiBvciBwb3coKSIpOworICAgIHJldHVybiB0ZXJuYXJ5X29wKHYsIHcsIHosIE5CX1NMT1QobmJfcG93ZXIpLCAiKiogb3IgcG93KCkiKTsKIH0KIAogLyogQmluYXJ5IGluLXBsYWNlIG9wZXJhdG9ycyAqLwpAQCAtMTI0NCw0MiArMTI0NCw0MiBAQAogICAgKi8KIAogI2RlZmluZSBIQVNJTlBMQUNFKHQpIFwKLQlQeVR5cGVfSGFzRmVhdHVyZSgodCktPm9iX3R5cGUsIFB5X1RQRkxBR1NfSEFWRV9JTlBMQUNFT1BTKQorICAgIFB5VHlwZV9IYXNGZWF0dXJlKCh0KS0+b2JfdHlwZSwgUHlfVFBGTEFHU19IQVZFX0lOUExBQ0VPUFMpCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBiaW5hcnlfaW9wMShQeU9iamVjdCAqdiwgUHlPYmplY3QgKncsIGNvbnN0IGludCBpb3Bfc2xvdCwgY29uc3QgaW50IG9wX3Nsb3QpCiB7Ci0JUHlOdW1iZXJNZXRob2RzICptdiA9IHYtPm9iX3R5cGUtPnRwX2FzX251bWJlcjsKLQlpZiAobXYgIT0gTlVMTCAmJiBIQVNJTlBMQUNFKHYpKSB7Ci0JCWJpbmFyeWZ1bmMgc2xvdCA9IE5CX0JJTk9QKG12LCBpb3Bfc2xvdCk7Ci0JCWlmIChzbG90KSB7Ci0JCQlQeU9iamVjdCAqeCA9IChzbG90KSh2LCB3KTsKLQkJCWlmICh4ICE9IFB5X05vdEltcGxlbWVudGVkKSB7Ci0JCQkJcmV0dXJuIHg7Ci0JCQl9Ci0JCQlQeV9ERUNSRUYoeCk7Ci0JCX0KLQl9Ci0JcmV0dXJuIGJpbmFyeV9vcDEodiwgdywgb3Bfc2xvdCk7CisgICAgUHlOdW1iZXJNZXRob2RzICptdiA9IHYtPm9iX3R5cGUtPnRwX2FzX251bWJlcjsKKyAgICBpZiAobXYgIT0gTlVMTCAmJiBIQVNJTlBMQUNFKHYpKSB7CisgICAgICAgIGJpbmFyeWZ1bmMgc2xvdCA9IE5CX0JJTk9QKG12LCBpb3Bfc2xvdCk7CisgICAgICAgIGlmIChzbG90KSB7CisgICAgICAgICAgICBQeU9iamVjdCAqeCA9IChzbG90KSh2LCB3KTsKKyAgICAgICAgICAgIGlmICh4ICE9IFB5X05vdEltcGxlbWVudGVkKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQeV9ERUNSRUYoeCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGJpbmFyeV9vcDEodiwgdywgb3Bfc2xvdCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBiaW5hcnlfaW9wKFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdywgY29uc3QgaW50IGlvcF9zbG90LCBjb25zdCBpbnQgb3Bfc2xvdCwKLQkJY29uc3QgY2hhciAqb3BfbmFtZSkKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpvcF9uYW1lKQogewotCVB5T2JqZWN0ICpyZXN1bHQgPSBiaW5hcnlfaW9wMSh2LCB3LCBpb3Bfc2xvdCwgb3Bfc2xvdCk7Ci0JaWYgKHJlc3VsdCA9PSBQeV9Ob3RJbXBsZW1lbnRlZCkgewotCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJcmV0dXJuIGJpbm9wX3R5cGVfZXJyb3Iodiwgdywgb3BfbmFtZSk7Ci0JfQotCXJldHVybiByZXN1bHQ7CisgICAgUHlPYmplY3QgKnJlc3VsdCA9IGJpbmFyeV9pb3AxKHYsIHcsIGlvcF9zbG90LCBvcF9zbG90KTsKKyAgICBpZiAocmVzdWx0ID09IFB5X05vdEltcGxlbWVudGVkKSB7CisgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICByZXR1cm4gYmlub3BfdHlwZV9lcnJvcih2LCB3LCBvcF9uYW1lKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogI2RlZmluZSBJTlBMQUNFX0JJTk9QKGZ1bmMsIGlvcCwgb3AsIG9wX25hbWUpIFwKLQlQeU9iamVjdCAqIFwKLQlmdW5jKFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdykgeyBcCi0JCXJldHVybiBiaW5hcnlfaW9wKHYsIHcsIE5CX1NMT1QoaW9wKSwgTkJfU0xPVChvcCksIG9wX25hbWUpOyBcCi0JfQorICAgIFB5T2JqZWN0ICogXAorICAgIGZ1bmMoUHlPYmplY3QgKnYsIFB5T2JqZWN0ICp3KSB7IFwKKyAgICAgICAgcmV0dXJuIGJpbmFyeV9pb3AodiwgdywgTkJfU0xPVChpb3ApLCBOQl9TTE9UKG9wKSwgb3BfbmFtZSk7IFwKKyAgICB9CiAKIElOUExBQ0VfQklOT1AoUHlOdW1iZXJfSW5QbGFjZU9yLCBuYl9pbnBsYWNlX29yLCBuYl9vciwgInw9IikKIElOUExBQ0VfQklOT1AoUHlOdW1iZXJfSW5QbGFjZVhvciwgbmJfaW5wbGFjZV94b3IsIG5iX3hvciwgIl49IikKQEAgLTEyOTIsODggKzEyOTIsODggQEAKIFB5T2JqZWN0ICoKIFB5TnVtYmVyX0luUGxhY2VGbG9vckRpdmlkZShQeU9iamVjdCAqdiwgUHlPYmplY3QgKncpCiB7Ci0JLyogWFhYIHRwX2ZsYWdzIHRlc3QgKi8KLQlyZXR1cm4gYmluYXJ5X2lvcCh2LCB3LCBOQl9TTE9UKG5iX2lucGxhY2VfZmxvb3JfZGl2aWRlKSwKLQkJCSAgTkJfU0xPVChuYl9mbG9vcl9kaXZpZGUpLCAiLy89Iik7CisgICAgLyogWFhYIHRwX2ZsYWdzIHRlc3QgKi8KKyAgICByZXR1cm4gYmluYXJ5X2lvcCh2LCB3LCBOQl9TTE9UKG5iX2lucGxhY2VfZmxvb3JfZGl2aWRlKSwKKyAgICAgICAgICAgICAgICAgICAgICBOQl9TTE9UKG5iX2Zsb29yX2RpdmlkZSksICIvLz0iKTsKIH0KIAogUHlPYmplY3QgKgogUHlOdW1iZXJfSW5QbGFjZVRydWVEaXZpZGUoUHlPYmplY3QgKnYsIFB5T2JqZWN0ICp3KQogewotCS8qIFhYWCB0cF9mbGFncyB0ZXN0ICovCi0JcmV0dXJuIGJpbmFyeV9pb3AodiwgdywgTkJfU0xPVChuYl9pbnBsYWNlX3RydWVfZGl2aWRlKSwKLQkJCSAgTkJfU0xPVChuYl90cnVlX2RpdmlkZSksICIvPSIpOworICAgIC8qIFhYWCB0cF9mbGFncyB0ZXN0ICovCisgICAgcmV0dXJuIGJpbmFyeV9pb3AodiwgdywgTkJfU0xPVChuYl9pbnBsYWNlX3RydWVfZGl2aWRlKSwKKyAgICAgICAgICAgICAgICAgICAgICBOQl9TTE9UKG5iX3RydWVfZGl2aWRlKSwgIi89Iik7CiB9CiAKIFB5T2JqZWN0ICoKIFB5TnVtYmVyX0luUGxhY2VBZGQoUHlPYmplY3QgKnYsIFB5T2JqZWN0ICp3KQogewotCVB5T2JqZWN0ICpyZXN1bHQgPSBiaW5hcnlfaW9wMSh2LCB3LCBOQl9TTE9UKG5iX2lucGxhY2VfYWRkKSwKLQkJCQkgICAgICAgTkJfU0xPVChuYl9hZGQpKTsKLQlpZiAocmVzdWx0ID09IFB5X05vdEltcGxlbWVudGVkKSB7Ci0JCVB5U2VxdWVuY2VNZXRob2RzICptID0gdi0+b2JfdHlwZS0+dHBfYXNfc2VxdWVuY2U7Ci0JCVB5X0RFQ1JFRihyZXN1bHQpOwotCQlpZiAobSAhPSBOVUxMKSB7Ci0JCQliaW5hcnlmdW5jIGYgPSBOVUxMOwotCQkJaWYgKEhBU0lOUExBQ0UodikpCi0JCQkJZiA9IG0tPnNxX2lucGxhY2VfY29uY2F0OwotCQkJaWYgKGYgPT0gTlVMTCkKLQkJCQlmID0gbS0+c3FfY29uY2F0OwotCQkJaWYgKGYgIT0gTlVMTCkKLQkJCQlyZXR1cm4gKCpmKSh2LCB3KTsKLQkJfQotCQlyZXN1bHQgPSBiaW5vcF90eXBlX2Vycm9yKHYsIHcsICIrPSIpOwotCX0KLQlyZXR1cm4gcmVzdWx0OworICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBiaW5hcnlfaW9wMSh2LCB3LCBOQl9TTE9UKG5iX2lucGxhY2VfYWRkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkJfU0xPVChuYl9hZGQpKTsKKyAgICBpZiAocmVzdWx0ID09IFB5X05vdEltcGxlbWVudGVkKSB7CisgICAgICAgIFB5U2VxdWVuY2VNZXRob2RzICptID0gdi0+b2JfdHlwZS0+dHBfYXNfc2VxdWVuY2U7CisgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICBpZiAobSAhPSBOVUxMKSB7CisgICAgICAgICAgICBiaW5hcnlmdW5jIGYgPSBOVUxMOworICAgICAgICAgICAgaWYgKEhBU0lOUExBQ0UodikpCisgICAgICAgICAgICAgICAgZiA9IG0tPnNxX2lucGxhY2VfY29uY2F0OworICAgICAgICAgICAgaWYgKGYgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBmID0gbS0+c3FfY29uY2F0OworICAgICAgICAgICAgaWYgKGYgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gKCpmKSh2LCB3KTsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQgPSBiaW5vcF90eXBlX2Vycm9yKHYsIHcsICIrPSIpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBQeU9iamVjdCAqCiBQeU51bWJlcl9JblBsYWNlTXVsdGlwbHkoUHlPYmplY3QgKnYsIFB5T2JqZWN0ICp3KQogewotCVB5T2JqZWN0ICpyZXN1bHQgPSBiaW5hcnlfaW9wMSh2LCB3LCBOQl9TTE9UKG5iX2lucGxhY2VfbXVsdGlwbHkpLAotCQkJCSAgICAgICBOQl9TTE9UKG5iX211bHRpcGx5KSk7Ci0JaWYgKHJlc3VsdCA9PSBQeV9Ob3RJbXBsZW1lbnRlZCkgewotCQlzc2l6ZWFyZ2Z1bmMgZiA9IE5VTEw7Ci0JCVB5U2VxdWVuY2VNZXRob2RzICptdiA9IHYtPm9iX3R5cGUtPnRwX2FzX3NlcXVlbmNlOwotCQlQeVNlcXVlbmNlTWV0aG9kcyAqbXcgPSB3LT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZTsKLQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCWlmIChtdiAhPSBOVUxMKSB7Ci0JCQlpZiAoSEFTSU5QTEFDRSh2KSkKLQkJCQlmID0gbXYtPnNxX2lucGxhY2VfcmVwZWF0OwotCQkJaWYgKGYgPT0gTlVMTCkKLQkJCQlmID0gbXYtPnNxX3JlcGVhdDsKLQkJCWlmIChmICE9IE5VTEwpCi0JCQkJcmV0dXJuIHNlcXVlbmNlX3JlcGVhdChmLCB2LCB3KTsKLQkJfQotCQllbHNlIGlmIChtdyAhPSBOVUxMKSB7Ci0JCQkvKiBOb3RlIHRoYXQgdGhlIHJpZ2h0IGhhbmQgb3BlcmFuZCBzaG91bGQgbm90IGJlCi0JCQkgKiBtdXRhdGVkIGluIHRoaXMgY2FzZSBzbyBzcV9pbnBsYWNlX3JlcGVhdCBpcyBub3QKLQkJCSAqIHVzZWQuICovCi0JCQlpZiAobXctPnNxX3JlcGVhdCkKLQkJCQlyZXR1cm4gc2VxdWVuY2VfcmVwZWF0KG13LT5zcV9yZXBlYXQsIHcsIHYpOwotCQl9Ci0JCXJlc3VsdCA9IGJpbm9wX3R5cGVfZXJyb3IodiwgdywgIio9Iik7Ci0JfQotCXJldHVybiByZXN1bHQ7CisgICAgUHlPYmplY3QgKnJlc3VsdCA9IGJpbmFyeV9pb3AxKHYsIHcsIE5CX1NMT1QobmJfaW5wbGFjZV9tdWx0aXBseSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5CX1NMT1QobmJfbXVsdGlwbHkpKTsKKyAgICBpZiAocmVzdWx0ID09IFB5X05vdEltcGxlbWVudGVkKSB7CisgICAgICAgIHNzaXplYXJnZnVuYyBmID0gTlVMTDsKKyAgICAgICAgUHlTZXF1ZW5jZU1ldGhvZHMgKm12ID0gdi0+b2JfdHlwZS0+dHBfYXNfc2VxdWVuY2U7CisgICAgICAgIFB5U2VxdWVuY2VNZXRob2RzICptdyA9IHctPm9iX3R5cGUtPnRwX2FzX3NlcXVlbmNlOworICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgaWYgKG12ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGlmIChIQVNJTlBMQUNFKHYpKQorICAgICAgICAgICAgICAgIGYgPSBtdi0+c3FfaW5wbGFjZV9yZXBlYXQ7CisgICAgICAgICAgICBpZiAoZiA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGYgPSBtdi0+c3FfcmVwZWF0OworICAgICAgICAgICAgaWYgKGYgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VxdWVuY2VfcmVwZWF0KGYsIHYsIHcpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKG13ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIC8qIE5vdGUgdGhhdCB0aGUgcmlnaHQgaGFuZCBvcGVyYW5kIHNob3VsZCBub3QgYmUKKyAgICAgICAgICAgICAqIG11dGF0ZWQgaW4gdGhpcyBjYXNlIHNvIHNxX2lucGxhY2VfcmVwZWF0IGlzIG5vdAorICAgICAgICAgICAgICogdXNlZC4gKi8KKyAgICAgICAgICAgIGlmIChtdy0+c3FfcmVwZWF0KQorICAgICAgICAgICAgICAgIHJldHVybiBzZXF1ZW5jZV9yZXBlYXQobXctPnNxX3JlcGVhdCwgdywgdik7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0ID0gYmlub3BfdHlwZV9lcnJvcih2LCB3LCAiKj0iKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogUHlPYmplY3QgKgogUHlOdW1iZXJfSW5QbGFjZVJlbWFpbmRlcihQeU9iamVjdCAqdiwgUHlPYmplY3QgKncpCiB7Ci0JcmV0dXJuIGJpbmFyeV9pb3AodiwgdywgTkJfU0xPVChuYl9pbnBsYWNlX3JlbWFpbmRlciksCi0JCQkJTkJfU0xPVChuYl9yZW1haW5kZXIpLCAiJT0iKTsKKyAgICByZXR1cm4gYmluYXJ5X2lvcCh2LCB3LCBOQl9TTE9UKG5iX2lucGxhY2VfcmVtYWluZGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQl9TTE9UKG5iX3JlbWFpbmRlciksICIlPSIpOwogfQogCiBQeU9iamVjdCAqCiBQeU51bWJlcl9JblBsYWNlUG93ZXIoUHlPYmplY3QgKnYsIFB5T2JqZWN0ICp3LCBQeU9iamVjdCAqeikKIHsKLQlpZiAoSEFTSU5QTEFDRSh2KSAmJiB2LT5vYl90eXBlLT50cF9hc19udW1iZXIgJiYKLQkgICAgdi0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyLT5uYl9pbnBsYWNlX3Bvd2VyICE9IE5VTEwpIHsKLQkJcmV0dXJuIHRlcm5hcnlfb3AodiwgdywgeiwgTkJfU0xPVChuYl9pbnBsYWNlX3Bvd2VyKSwgIioqPSIpOwotCX0KLQllbHNlIHsKLQkJcmV0dXJuIHRlcm5hcnlfb3AodiwgdywgeiwgTkJfU0xPVChuYl9wb3dlciksICIqKj0iKTsKLQl9CisgICAgaWYgKEhBU0lOUExBQ0UodikgJiYgdi0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyICYmCisgICAgICAgIHYtPm9iX3R5cGUtPnRwX2FzX251bWJlci0+bmJfaW5wbGFjZV9wb3dlciAhPSBOVUxMKSB7CisgICAgICAgIHJldHVybiB0ZXJuYXJ5X29wKHYsIHcsIHosIE5CX1NMT1QobmJfaW5wbGFjZV9wb3dlciksICIqKj0iKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJldHVybiB0ZXJuYXJ5X29wKHYsIHcsIHosIE5CX1NMT1QobmJfcG93ZXIpLCAiKio9Iik7CisgICAgfQogfQogCiAKQEAgLTEzODIsMTEwICsxMzgyLDExMCBAQAogUHlPYmplY3QgKgogUHlOdW1iZXJfTmVnYXRpdmUoUHlPYmplY3QgKm8pCiB7Ci0JUHlOdW1iZXJNZXRob2RzICptOworICAgIFB5TnVtYmVyTWV0aG9kcyAqbTsKIAotCWlmIChvID09IE5VTEwpCi0JCXJldHVybiBudWxsX2Vycm9yKCk7Ci0JbSA9IG8tPm9iX3R5cGUtPnRwX2FzX251bWJlcjsKLQlpZiAobSAmJiBtLT5uYl9uZWdhdGl2ZSkKLQkJcmV0dXJuICgqbS0+bmJfbmVnYXRpdmUpKG8pOworICAgIGlmIChvID09IE5VTEwpCisgICAgICAgIHJldHVybiBudWxsX2Vycm9yKCk7CisgICAgbSA9IG8tPm9iX3R5cGUtPnRwX2FzX251bWJlcjsKKyAgICBpZiAobSAmJiBtLT5uYl9uZWdhdGl2ZSkKKyAgICAgICAgcmV0dXJuICgqbS0+bmJfbmVnYXRpdmUpKG8pOwogCi0JcmV0dXJuIHR5cGVfZXJyb3IoImJhZCBvcGVyYW5kIHR5cGUgZm9yIHVuYXJ5IC06ICclLjIwMHMnIiwgbyk7CisgICAgcmV0dXJuIHR5cGVfZXJyb3IoImJhZCBvcGVyYW5kIHR5cGUgZm9yIHVuYXJ5IC06ICclLjIwMHMnIiwgbyk7CiB9CiAKIFB5T2JqZWN0ICoKIFB5TnVtYmVyX1Bvc2l0aXZlKFB5T2JqZWN0ICpvKQogewotCVB5TnVtYmVyTWV0aG9kcyAqbTsKKyAgICBQeU51bWJlck1ldGhvZHMgKm07CiAKLQlpZiAobyA9PSBOVUxMKQotCQlyZXR1cm4gbnVsbF9lcnJvcigpOwotCW0gPSBvLT5vYl90eXBlLT50cF9hc19udW1iZXI7Ci0JaWYgKG0gJiYgbS0+bmJfcG9zaXRpdmUpCi0JCXJldHVybiAoKm0tPm5iX3Bvc2l0aXZlKShvKTsKKyAgICBpZiAobyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gbnVsbF9lcnJvcigpOworICAgIG0gPSBvLT5vYl90eXBlLT50cF9hc19udW1iZXI7CisgICAgaWYgKG0gJiYgbS0+bmJfcG9zaXRpdmUpCisgICAgICAgIHJldHVybiAoKm0tPm5iX3Bvc2l0aXZlKShvKTsKIAotCXJldHVybiB0eXBlX2Vycm9yKCJiYWQgb3BlcmFuZCB0eXBlIGZvciB1bmFyeSArOiAnJS4yMDBzJyIsIG8pOworICAgIHJldHVybiB0eXBlX2Vycm9yKCJiYWQgb3BlcmFuZCB0eXBlIGZvciB1bmFyeSArOiAnJS4yMDBzJyIsIG8pOwogfQogCiBQeU9iamVjdCAqCiBQeU51bWJlcl9JbnZlcnQoUHlPYmplY3QgKm8pCiB7Ci0JUHlOdW1iZXJNZXRob2RzICptOworICAgIFB5TnVtYmVyTWV0aG9kcyAqbTsKIAotCWlmIChvID09IE5VTEwpCi0JCXJldHVybiBudWxsX2Vycm9yKCk7Ci0JbSA9IG8tPm9iX3R5cGUtPnRwX2FzX251bWJlcjsKLQlpZiAobSAmJiBtLT5uYl9pbnZlcnQpCi0JCXJldHVybiAoKm0tPm5iX2ludmVydCkobyk7CisgICAgaWYgKG8gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIG51bGxfZXJyb3IoKTsKKyAgICBtID0gby0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyOworICAgIGlmIChtICYmIG0tPm5iX2ludmVydCkKKyAgICAgICAgcmV0dXJuICgqbS0+bmJfaW52ZXJ0KShvKTsKIAotCXJldHVybiB0eXBlX2Vycm9yKCJiYWQgb3BlcmFuZCB0eXBlIGZvciB1bmFyeSB+OiAnJS4yMDBzJyIsIG8pOworICAgIHJldHVybiB0eXBlX2Vycm9yKCJiYWQgb3BlcmFuZCB0eXBlIGZvciB1bmFyeSB+OiAnJS4yMDBzJyIsIG8pOwogfQogCiBQeU9iamVjdCAqCiBQeU51bWJlcl9BYnNvbHV0ZShQeU9iamVjdCAqbykKIHsKLQlQeU51bWJlck1ldGhvZHMgKm07CisgICAgUHlOdW1iZXJNZXRob2RzICptOwogCi0JaWYgKG8gPT0gTlVMTCkKLQkJcmV0dXJuIG51bGxfZXJyb3IoKTsKLQltID0gby0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyOwotCWlmIChtICYmIG0tPm5iX2Fic29sdXRlKQotCQlyZXR1cm4gbS0+bmJfYWJzb2x1dGUobyk7CisgICAgaWYgKG8gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIG51bGxfZXJyb3IoKTsKKyAgICBtID0gby0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyOworICAgIGlmIChtICYmIG0tPm5iX2Fic29sdXRlKQorICAgICAgICByZXR1cm4gbS0+bmJfYWJzb2x1dGUobyk7CiAKLQlyZXR1cm4gdHlwZV9lcnJvcigiYmFkIG9wZXJhbmQgdHlwZSBmb3IgYWJzKCk6ICclLjIwMHMnIiwgbyk7CisgICAgcmV0dXJuIHR5cGVfZXJyb3IoImJhZCBvcGVyYW5kIHR5cGUgZm9yIGFicygpOiAnJS4yMDBzJyIsIG8pOwogfQogCiAvKiBBZGQgYSBjaGVjayBmb3IgZW1iZWRkZWQgTlVMTC1ieXRlcyBpbiB0aGUgYXJndW1lbnQuICovCiBzdGF0aWMgUHlPYmplY3QgKgogaW50X2Zyb21fc3RyaW5nKGNvbnN0IGNoYXIgKnMsIFB5X3NzaXplX3QgbGVuKQogewotCWNoYXIgKmVuZDsKLQlQeU9iamVjdCAqeDsKKyAgICBjaGFyICplbmQ7CisgICAgUHlPYmplY3QgKng7CiAKLQl4ID0gUHlJbnRfRnJvbVN0cmluZygoY2hhciopcywgJmVuZCwgMTApOwotCWlmICh4ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWlmIChlbmQgIT0gcyArIGxlbikgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkibnVsbCBieXRlIGluIGFyZ3VtZW50IGZvciBpbnQoKSIpOwotCQlQeV9ERUNSRUYoeCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4geDsKKyAgICB4ID0gUHlJbnRfRnJvbVN0cmluZygoY2hhciopcywgJmVuZCwgMTApOworICAgIGlmICh4ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChlbmQgIT0gcyArIGxlbikgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJudWxsIGJ5dGUgaW4gYXJndW1lbnQgZm9yIGludCgpIik7CisgICAgICAgIFB5X0RFQ1JFRih4KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiB4OwogfQogCi0vKiBSZXR1cm4gYSBQeXRob24gSW50IG9yIExvbmcgZnJvbSB0aGUgb2JqZWN0IGl0ZW0gCisvKiBSZXR1cm4gYSBQeXRob24gSW50IG9yIExvbmcgZnJvbSB0aGUgb2JqZWN0IGl0ZW0KICAgIFJhaXNlIFR5cGVFcnJvciBpZiB0aGUgcmVzdWx0IGlzIG5vdCBhbiBpbnQtb3ItbG9uZwotICAgb3IgaWYgdGhlIG9iamVjdCBjYW5ub3QgYmUgaW50ZXJwcmV0ZWQgYXMgYW4gaW5kZXguIAorICAgb3IgaWYgdGhlIG9iamVjdCBjYW5ub3QgYmUgaW50ZXJwcmV0ZWQgYXMgYW4gaW5kZXguCiAqLwogUHlPYmplY3QgKgogUHlOdW1iZXJfSW5kZXgoUHlPYmplY3QgKml0ZW0pCiB7Ci0JUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7Ci0JaWYgKGl0ZW0gPT0gTlVMTCkKLQkJcmV0dXJuIG51bGxfZXJyb3IoKTsKLQlpZiAoUHlJbnRfQ2hlY2soaXRlbSkgfHwgUHlMb25nX0NoZWNrKGl0ZW0pKSB7Ci0JCVB5X0lOQ1JFRihpdGVtKTsKLQkJcmV0dXJuIGl0ZW07Ci0JfQotCWlmIChQeUluZGV4X0NoZWNrKGl0ZW0pKSB7Ci0JCXJlc3VsdCA9IGl0ZW0tPm9iX3R5cGUtPnRwX2FzX251bWJlci0+bmJfaW5kZXgoaXRlbSk7Ci0JCWlmIChyZXN1bHQgJiYKLQkJICAgICFQeUludF9DaGVjayhyZXN1bHQpICYmICFQeUxvbmdfQ2hlY2socmVzdWx0KSkgewotCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCQkgICAgICJfX2luZGV4X18gcmV0dXJuZWQgbm9uLShpbnQsbG9uZykgIiBcCi0JCQkJICAgICAiKHR5cGUgJS4yMDBzKSIsCi0JCQkJICAgICByZXN1bHQtPm9iX3R5cGUtPnRwX25hbWUpOwotCQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KLQllbHNlIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAgIiclLjIwMHMnIG9iamVjdCBjYW5ub3QgYmUgaW50ZXJwcmV0ZWQgIgotCQkJICAgICAiYXMgYW4gaW5kZXgiLCBpdGVtLT5vYl90eXBlLT50cF9uYW1lKTsKLQl9Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKKyAgICBpZiAoaXRlbSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gbnVsbF9lcnJvcigpOworICAgIGlmIChQeUludF9DaGVjayhpdGVtKSB8fCBQeUxvbmdfQ2hlY2soaXRlbSkpIHsKKyAgICAgICAgUHlfSU5DUkVGKGl0ZW0pOworICAgICAgICByZXR1cm4gaXRlbTsKKyAgICB9CisgICAgaWYgKFB5SW5kZXhfQ2hlY2soaXRlbSkpIHsKKyAgICAgICAgcmVzdWx0ID0gaXRlbS0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyLT5uYl9pbmRleChpdGVtKTsKKyAgICAgICAgaWYgKHJlc3VsdCAmJgorICAgICAgICAgICAgIVB5SW50X0NoZWNrKHJlc3VsdCkgJiYgIVB5TG9uZ19DaGVjayhyZXN1bHQpKSB7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICJfX2luZGV4X18gcmV0dXJuZWQgbm9uLShpbnQsbG9uZykgIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIih0eXBlICUuMjAwcykiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC0+b2JfdHlwZS0+dHBfbmFtZSk7CisgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIiclLjIwMHMnIG9iamVjdCBjYW5ub3QgYmUgaW50ZXJwcmV0ZWQgIgorICAgICAgICAgICAgICAgICAgICAgImFzIGFuIGluZGV4IiwgaXRlbS0+b2JfdHlwZS0+dHBfbmFtZSk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIC8qIFJldHVybiBhbiBlcnJvciBvbiBPdmVyZmxvdyBvbmx5IGlmIGVyciBpcyBub3QgTlVMTCovCkBAIC0xNDkzLDI5NiArMTQ5MywyOTYgQEAKIFB5X3NzaXplX3QKIFB5TnVtYmVyX0FzU3NpemVfdChQeU9iamVjdCAqaXRlbSwgUHlPYmplY3QgKmVycikKIHsKLQlQeV9zc2l6ZV90IHJlc3VsdDsKLQlQeU9iamVjdCAqcnVuZXJyOwotCVB5T2JqZWN0ICp2YWx1ZSA9IFB5TnVtYmVyX0luZGV4KGl0ZW0pOwotCWlmICh2YWx1ZSA9PSBOVUxMKQotCQlyZXR1cm4gLTE7CisgICAgUHlfc3NpemVfdCByZXN1bHQ7CisgICAgUHlPYmplY3QgKnJ1bmVycjsKKyAgICBQeU9iamVjdCAqdmFsdWUgPSBQeU51bWJlcl9JbmRleChpdGVtKTsKKyAgICBpZiAodmFsdWUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0JLyogV2UncmUgZG9uZSBpZiBQeUludF9Bc1NzaXplX3QoKSByZXR1cm5zIHdpdGhvdXQgZXJyb3IuICovCi0JcmVzdWx0ID0gUHlJbnRfQXNTc2l6ZV90KHZhbHVlKTsKLQlpZiAocmVzdWx0ICE9IC0xIHx8ICEocnVuZXJyID0gUHlFcnJfT2NjdXJyZWQoKSkpCi0JCWdvdG8gZmluaXNoOworICAgIC8qIFdlJ3JlIGRvbmUgaWYgUHlJbnRfQXNTc2l6ZV90KCkgcmV0dXJucyB3aXRob3V0IGVycm9yLiAqLworICAgIHJlc3VsdCA9IFB5SW50X0FzU3NpemVfdCh2YWx1ZSk7CisgICAgaWYgKHJlc3VsdCAhPSAtMSB8fCAhKHJ1bmVyciA9IFB5RXJyX09jY3VycmVkKCkpKQorICAgICAgICBnb3RvIGZpbmlzaDsKIAotCS8qIEVycm9yIGhhbmRsaW5nIGNvZGUgLS0gb25seSBtYW5hZ2UgT3ZlcmZsb3dFcnJvciBkaWZmZXJlbnRseSAqLwotCWlmICghUHlFcnJfR2l2ZW5FeGNlcHRpb25NYXRjaGVzKHJ1bmVyciwgUHlFeGNfT3ZlcmZsb3dFcnJvcikpIAotCQlnb3RvIGZpbmlzaDsKKyAgICAvKiBFcnJvciBoYW5kbGluZyBjb2RlIC0tIG9ubHkgbWFuYWdlIE92ZXJmbG93RXJyb3IgZGlmZmVyZW50bHkgKi8KKyAgICBpZiAoIVB5RXJyX0dpdmVuRXhjZXB0aW9uTWF0Y2hlcyhydW5lcnIsIFB5RXhjX092ZXJmbG93RXJyb3IpKQorICAgICAgICBnb3RvIGZpbmlzaDsKIAotCVB5RXJyX0NsZWFyKCk7Ci0JLyogSWYgbm8gZXJyb3ItaGFuZGxpbmcgZGVzaXJlZCB0aGVuIHRoZSBkZWZhdWx0IGNsaXBwaW5nIAotCSAgIGlzIHN1ZmZpY2llbnQuCi0JICovCi0JaWYgKCFlcnIpIHsKLQkJYXNzZXJ0KFB5TG9uZ19DaGVjayh2YWx1ZSkpOwotCQkvKiBXaGV0aGVyIG9yIG5vdCBpdCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gCi0JCSAgIHplcm8gaXMgZGV0ZXJtaW5lZCBieSB0aGUgc2lnbiBvZiBvYl9zaXplCi0JCSovCi0JCWlmIChfUHlMb25nX1NpZ24odmFsdWUpIDwgMCkgCi0JCQlyZXN1bHQgPSBQWV9TU0laRV9UX01JTjsKLQkJZWxzZQotCQkJcmVzdWx0ID0gUFlfU1NJWkVfVF9NQVg7Ci0JfQotCWVsc2UgewotCQkvKiBPdGhlcndpc2UgcmVwbGFjZSB0aGUgZXJyb3Igd2l0aCBjYWxsZXIncyBlcnJvciBvYmplY3QuICovCi0JCVB5RXJyX0Zvcm1hdChlcnIsCi0JCQkgICAgICJjYW5ub3QgZml0ICclLjIwMHMnIGludG8gYW4gaW5kZXgtc2l6ZWQgaW50ZWdlciIsIAotCQkJICAgICBpdGVtLT5vYl90eXBlLT50cF9uYW1lKTsgCi0JfQotCQorICAgIFB5RXJyX0NsZWFyKCk7CisgICAgLyogSWYgbm8gZXJyb3ItaGFuZGxpbmcgZGVzaXJlZCB0aGVuIHRoZSBkZWZhdWx0IGNsaXBwaW5nCisgICAgICAgaXMgc3VmZmljaWVudC4KKyAgICAgKi8KKyAgICBpZiAoIWVycikgeworICAgICAgICBhc3NlcnQoUHlMb25nX0NoZWNrKHZhbHVlKSk7CisgICAgICAgIC8qIFdoZXRoZXIgb3Igbm90IGl0IGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0bworICAgICAgICAgICB6ZXJvIGlzIGRldGVybWluZWQgYnkgdGhlIHNpZ24gb2Ygb2Jfc2l6ZQorICAgICAgICAqLworICAgICAgICBpZiAoX1B5TG9uZ19TaWduKHZhbHVlKSA8IDApCisgICAgICAgICAgICByZXN1bHQgPSBQWV9TU0laRV9UX01JTjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmVzdWx0ID0gUFlfU1NJWkVfVF9NQVg7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvKiBPdGhlcndpc2UgcmVwbGFjZSB0aGUgZXJyb3Igd2l0aCBjYWxsZXIncyBlcnJvciBvYmplY3QuICovCisgICAgICAgIFB5RXJyX0Zvcm1hdChlcnIsCisgICAgICAgICAgICAgICAgICAgICAiY2Fubm90IGZpdCAnJS4yMDBzJyBpbnRvIGFuIGluZGV4LXNpemVkIGludGVnZXIiLAorICAgICAgICAgICAgICAgICAgICAgaXRlbS0+b2JfdHlwZS0+dHBfbmFtZSk7CisgICAgfQorCiAgZmluaXNoOgotCVB5X0RFQ1JFRih2YWx1ZSk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBQeV9ERUNSRUYodmFsdWUpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIAogUHlPYmplY3QgKgogX1B5TnVtYmVyX0NvbnZlcnRJbnRlZ3JhbFRvSW50KFB5T2JqZWN0ICppbnRlZ3JhbCwgY29uc3QgY2hhciogZXJyb3JfZm9ybWF0KQogewotCWNvbnN0IGNoYXIgKnR5cGVfbmFtZTsKLQlzdGF0aWMgUHlPYmplY3QgKmludF9uYW1lID0gTlVMTDsKLQlpZiAoaW50X25hbWUgPT0gTlVMTCkgewotCQlpbnRfbmFtZSA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9faW50X18iKTsKLQkJaWYgKGludF9uYW1lID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgY29uc3QgY2hhciAqdHlwZV9uYW1lOworICAgIHN0YXRpYyBQeU9iamVjdCAqaW50X25hbWUgPSBOVUxMOworICAgIGlmIChpbnRfbmFtZSA9PSBOVUxMKSB7CisgICAgICAgIGludF9uYW1lID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19pbnRfXyIpOworICAgICAgICBpZiAoaW50X25hbWUgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWlmIChpbnRlZ3JhbCAmJiAoIVB5SW50X0NoZWNrKGludGVncmFsKSAmJgotCQkJICFQeUxvbmdfQ2hlY2soaW50ZWdyYWwpKSkgewotCQkvKiBEb24ndCBnbyB0aHJvdWdoIHRwX2FzX251bWJlci0+bmJfaW50IHRvIGF2b2lkCi0JCSAgIGhpdHRpbmcgdGhlIGNsYXNzaWMgY2xhc3MgZmFsbGJhY2sgdG8gX190cnVuY19fLiAqLwotCQlQeU9iamVjdCAqaW50X2Z1bmMgPSBQeU9iamVjdF9HZXRBdHRyKGludGVncmFsLCBpbnRfbmFtZSk7Ci0JCWlmIChpbnRfZnVuYyA9PSBOVUxMKSB7Ci0JCQlQeUVycl9DbGVhcigpOyAvKiBSYWlzZSBhIGRpZmZlcmVudCBlcnJvci4gKi8KLQkJCWdvdG8gbm9uX2ludGVncmFsX2Vycm9yOwotCQl9Ci0JCVB5X0RFQ1JFRihpbnRlZ3JhbCk7Ci0JCWludGVncmFsID0gUHlFdmFsX0NhbGxPYmplY3QoaW50X2Z1bmMsIE5VTEwpOwotCQlQeV9ERUNSRUYoaW50X2Z1bmMpOwotCQlpZiAoaW50ZWdyYWwgJiYgKCFQeUludF9DaGVjayhpbnRlZ3JhbCkgJiYKLQkJCQkgICFQeUxvbmdfQ2hlY2soaW50ZWdyYWwpKSkgewotCQkJZ290byBub25faW50ZWdyYWxfZXJyb3I7Ci0JCX0KLQl9Ci0JcmV0dXJuIGludGVncmFsOworICAgIGlmIChpbnRlZ3JhbCAmJiAoIVB5SW50X0NoZWNrKGludGVncmFsKSAmJgorICAgICAgICAgICAgICAgICAgICAgIVB5TG9uZ19DaGVjayhpbnRlZ3JhbCkpKSB7CisgICAgICAgIC8qIERvbid0IGdvIHRocm91Z2ggdHBfYXNfbnVtYmVyLT5uYl9pbnQgdG8gYXZvaWQKKyAgICAgICAgICAgaGl0dGluZyB0aGUgY2xhc3NpYyBjbGFzcyBmYWxsYmFjayB0byBfX3RydW5jX18uICovCisgICAgICAgIFB5T2JqZWN0ICppbnRfZnVuYyA9IFB5T2JqZWN0X0dldEF0dHIoaW50ZWdyYWwsIGludF9uYW1lKTsKKyAgICAgICAgaWYgKGludF9mdW5jID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7IC8qIFJhaXNlIGEgZGlmZmVyZW50IGVycm9yLiAqLworICAgICAgICAgICAgZ290byBub25faW50ZWdyYWxfZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgUHlfREVDUkVGKGludGVncmFsKTsKKyAgICAgICAgaW50ZWdyYWwgPSBQeUV2YWxfQ2FsbE9iamVjdChpbnRfZnVuYywgTlVMTCk7CisgICAgICAgIFB5X0RFQ1JFRihpbnRfZnVuYyk7CisgICAgICAgIGlmIChpbnRlZ3JhbCAmJiAoIVB5SW50X0NoZWNrKGludGVncmFsKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAhUHlMb25nX0NoZWNrKGludGVncmFsKSkpIHsKKyAgICAgICAgICAgIGdvdG8gbm9uX2ludGVncmFsX2Vycm9yOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBpbnRlZ3JhbDsKIAogbm9uX2ludGVncmFsX2Vycm9yOgotCWlmIChQeUluc3RhbmNlX0NoZWNrKGludGVncmFsKSkgewotCQl0eXBlX25hbWUgPSBQeVN0cmluZ19BU19TVFJJTkcoKChQeUluc3RhbmNlT2JqZWN0ICopaW50ZWdyYWwpCi0JCQkJCSAgICAgICAtPmluX2NsYXNzLT5jbF9uYW1lKTsKLQl9Ci0JZWxzZSB7Ci0JCXR5cGVfbmFtZSA9IGludGVncmFsLT5vYl90eXBlLT50cF9uYW1lOwotCX0KLQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCBlcnJvcl9mb3JtYXQsIHR5cGVfbmFtZSk7Ci0JUHlfREVDUkVGKGludGVncmFsKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoUHlJbnN0YW5jZV9DaGVjayhpbnRlZ3JhbCkpIHsKKyAgICAgICAgdHlwZV9uYW1lID0gUHlTdHJpbmdfQVNfU1RSSU5HKCgoUHlJbnN0YW5jZU9iamVjdCAqKWludGVncmFsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5pbl9jbGFzcy0+Y2xfbmFtZSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICB0eXBlX25hbWUgPSBpbnRlZ3JhbC0+b2JfdHlwZS0+dHBfbmFtZTsKKyAgICB9CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgZXJyb3JfZm9ybWF0LCB0eXBlX25hbWUpOworICAgIFB5X0RFQ1JFRihpbnRlZ3JhbCk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIAogUHlPYmplY3QgKgogUHlOdW1iZXJfSW50KFB5T2JqZWN0ICpvKQogewotCVB5TnVtYmVyTWV0aG9kcyAqbTsKLQlzdGF0aWMgUHlPYmplY3QgKnRydW5jX25hbWUgPSBOVUxMOwotCVB5T2JqZWN0ICp0cnVuY19mdW5jOwotCWNvbnN0IGNoYXIgKmJ1ZmZlcjsKLQlQeV9zc2l6ZV90IGJ1ZmZlcl9sZW47CisgICAgUHlOdW1iZXJNZXRob2RzICptOworICAgIHN0YXRpYyBQeU9iamVjdCAqdHJ1bmNfbmFtZSA9IE5VTEw7CisgICAgUHlPYmplY3QgKnRydW5jX2Z1bmM7CisgICAgY29uc3QgY2hhciAqYnVmZmVyOworICAgIFB5X3NzaXplX3QgYnVmZmVyX2xlbjsKIAotCWlmICh0cnVuY19uYW1lID09IE5VTEwpIHsKLQkJdHJ1bmNfbmFtZSA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fdHJ1bmNfXyIpOwotCQlpZiAodHJ1bmNfbmFtZSA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICh0cnVuY19uYW1lID09IE5VTEwpIHsKKyAgICAgICAgdHJ1bmNfbmFtZSA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fdHJ1bmNfXyIpOworICAgICAgICBpZiAodHJ1bmNfbmFtZSA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaWYgKG8gPT0gTlVMTCkKLQkJcmV0dXJuIG51bGxfZXJyb3IoKTsKLQlpZiAoUHlJbnRfQ2hlY2tFeGFjdChvKSkgewotCQlQeV9JTkNSRUYobyk7Ci0JCXJldHVybiBvOwotCX0KLQltID0gby0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyOwotCWlmIChtICYmIG0tPm5iX2ludCkgeyAvKiBUaGlzIHNob3VsZCBpbmNsdWRlIHN1YmNsYXNzZXMgb2YgaW50ICovCi0JCS8qIENsYXNzaWMgY2xhc3NlcyBhbHdheXMgdGFrZSB0aGlzIGJyYW5jaC4gKi8KLQkJUHlPYmplY3QgKnJlcyA9IG0tPm5iX2ludChvKTsKLQkJaWYgKHJlcyAmJiAoIVB5SW50X0NoZWNrKHJlcykgJiYgIVB5TG9uZ19DaGVjayhyZXMpKSkgewotCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCQkgICAgICJfX2ludF9fIHJldHVybmVkIG5vbi1pbnQgKHR5cGUgJS4yMDBzKSIsCi0JCQkJICAgICByZXMtPm9iX3R5cGUtPnRwX25hbWUpOwotCQkJUHlfREVDUkVGKHJlcyk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlyZXR1cm4gcmVzOwotCX0KLQlpZiAoUHlJbnRfQ2hlY2sobykpIHsgLyogQSBpbnQgc3ViY2xhc3Mgd2l0aG91dCBuYl9pbnQgKi8KLQkJUHlJbnRPYmplY3QgKmlvID0gKFB5SW50T2JqZWN0KilvOwotCQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoaW8tPm9iX2l2YWwpOwotCX0KLQl0cnVuY19mdW5jID0gUHlPYmplY3RfR2V0QXR0cihvLCB0cnVuY19uYW1lKTsKLQlpZiAodHJ1bmNfZnVuYykgewotCQlQeU9iamVjdCAqdHJ1bmNhdGVkID0gUHlFdmFsX0NhbGxPYmplY3QodHJ1bmNfZnVuYywgTlVMTCk7Ci0JCVB5X0RFQ1JFRih0cnVuY19mdW5jKTsKLQkJLyogX190cnVuY19fIGlzIHNwZWNpZmllZCB0byByZXR1cm4gYW4gSW50ZWdyYWwgdHlwZSwgYnV0Ci0JCSAgIGludCgpIG5lZWRzIHRvIHJldHVybiBhbiBpbnQuICovCi0JCXJldHVybiBfUHlOdW1iZXJfQ29udmVydEludGVncmFsVG9JbnQoCi0JCQl0cnVuY2F0ZWQsCi0JCQkiX190cnVuY19fIHJldHVybmVkIG5vbi1JbnRlZ3JhbCAodHlwZSAlLjIwMHMpIik7Ci0JfQotCVB5RXJyX0NsZWFyKCk7ICAvKiBJdCdzIG5vdCBhbiBlcnJvciBpZiAgby5fX3RydW5jX18gZG9lc24ndCBleGlzdC4gKi8KKyAgICBpZiAobyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gbnVsbF9lcnJvcigpOworICAgIGlmIChQeUludF9DaGVja0V4YWN0KG8pKSB7CisgICAgICAgIFB5X0lOQ1JFRihvKTsKKyAgICAgICAgcmV0dXJuIG87CisgICAgfQorICAgIG0gPSBvLT5vYl90eXBlLT50cF9hc19udW1iZXI7CisgICAgaWYgKG0gJiYgbS0+bmJfaW50KSB7IC8qIFRoaXMgc2hvdWxkIGluY2x1ZGUgc3ViY2xhc3NlcyBvZiBpbnQgKi8KKyAgICAgICAgLyogQ2xhc3NpYyBjbGFzc2VzIGFsd2F5cyB0YWtlIHRoaXMgYnJhbmNoLiAqLworICAgICAgICBQeU9iamVjdCAqcmVzID0gbS0+bmJfaW50KG8pOworICAgICAgICBpZiAocmVzICYmICghUHlJbnRfQ2hlY2socmVzKSAmJiAhUHlMb25nX0NoZWNrKHJlcykpKSB7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICJfX2ludF9fIHJldHVybmVkIG5vbi1pbnQgKHR5cGUgJS4yMDBzKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVzLT5vYl90eXBlLT50cF9uYW1lKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihyZXMpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisgICAgaWYgKFB5SW50X0NoZWNrKG8pKSB7IC8qIEEgaW50IHN1YmNsYXNzIHdpdGhvdXQgbmJfaW50ICovCisgICAgICAgIFB5SW50T2JqZWN0ICppbyA9IChQeUludE9iamVjdCopbzsKKyAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKGlvLT5vYl9pdmFsKTsKKyAgICB9CisgICAgdHJ1bmNfZnVuYyA9IFB5T2JqZWN0X0dldEF0dHIobywgdHJ1bmNfbmFtZSk7CisgICAgaWYgKHRydW5jX2Z1bmMpIHsKKyAgICAgICAgUHlPYmplY3QgKnRydW5jYXRlZCA9IFB5RXZhbF9DYWxsT2JqZWN0KHRydW5jX2Z1bmMsIE5VTEwpOworICAgICAgICBQeV9ERUNSRUYodHJ1bmNfZnVuYyk7CisgICAgICAgIC8qIF9fdHJ1bmNfXyBpcyBzcGVjaWZpZWQgdG8gcmV0dXJuIGFuIEludGVncmFsIHR5cGUsIGJ1dAorICAgICAgICAgICBpbnQoKSBuZWVkcyB0byByZXR1cm4gYW4gaW50LiAqLworICAgICAgICByZXR1cm4gX1B5TnVtYmVyX0NvbnZlcnRJbnRlZ3JhbFRvSW50KAorICAgICAgICAgICAgdHJ1bmNhdGVkLAorICAgICAgICAgICAgIl9fdHJ1bmNfXyByZXR1cm5lZCBub24tSW50ZWdyYWwgKHR5cGUgJS4yMDBzKSIpOworICAgIH0KKyAgICBQeUVycl9DbGVhcigpOyAgLyogSXQncyBub3QgYW4gZXJyb3IgaWYgIG8uX190cnVuY19fIGRvZXNuJ3QgZXhpc3QuICovCiAKLQlpZiAoUHlTdHJpbmdfQ2hlY2sobykpCi0JCXJldHVybiBpbnRfZnJvbV9zdHJpbmcoUHlTdHJpbmdfQVNfU1RSSU5HKG8pLAotCQkJCSAgICAgICBQeVN0cmluZ19HRVRfU0laRShvKSk7CisgICAgaWYgKFB5U3RyaW5nX0NoZWNrKG8pKQorICAgICAgICByZXR1cm4gaW50X2Zyb21fc3RyaW5nKFB5U3RyaW5nX0FTX1NUUklORyhvKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19HRVRfU0laRShvKSk7CiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCWlmIChQeVVuaWNvZGVfQ2hlY2sobykpCi0JCXJldHVybiBQeUludF9Gcm9tVW5pY29kZShQeVVuaWNvZGVfQVNfVU5JQ09ERShvKSwKLQkJCQkJIFB5VW5pY29kZV9HRVRfU0laRShvKSwKLQkJCQkJIDEwKTsKKyAgICBpZiAoUHlVbmljb2RlX0NoZWNrKG8pKQorICAgICAgICByZXR1cm4gUHlJbnRfRnJvbVVuaWNvZGUoUHlVbmljb2RlX0FTX1VOSUNPREUobyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX1NJWkUobyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMCk7CiAjZW5kaWYKLQlpZiAoIVB5T2JqZWN0X0FzQ2hhckJ1ZmZlcihvLCAmYnVmZmVyLCAmYnVmZmVyX2xlbikpCi0JCXJldHVybiBpbnRfZnJvbV9zdHJpbmcoKGNoYXIqKWJ1ZmZlciwgYnVmZmVyX2xlbik7CisgICAgaWYgKCFQeU9iamVjdF9Bc0NoYXJCdWZmZXIobywgJmJ1ZmZlciwgJmJ1ZmZlcl9sZW4pKQorICAgICAgICByZXR1cm4gaW50X2Zyb21fc3RyaW5nKChjaGFyKilidWZmZXIsIGJ1ZmZlcl9sZW4pOwogCi0JcmV0dXJuIHR5cGVfZXJyb3IoImludCgpIGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcgb3IgYSAiCi0JCQkgICJudW1iZXIsIG5vdCAnJS4yMDBzJyIsIG8pOworICAgIHJldHVybiB0eXBlX2Vycm9yKCJpbnQoKSBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nIG9yIGEgIgorICAgICAgICAgICAgICAgICAgICAgICJudW1iZXIsIG5vdCAnJS4yMDBzJyIsIG8pOwogfQogCiAvKiBBZGQgYSBjaGVjayBmb3IgZW1iZWRkZWQgTlVMTC1ieXRlcyBpbiB0aGUgYXJndW1lbnQuICovCiBzdGF0aWMgUHlPYmplY3QgKgogbG9uZ19mcm9tX3N0cmluZyhjb25zdCBjaGFyICpzLCBQeV9zc2l6ZV90IGxlbikKIHsKLQljaGFyICplbmQ7Ci0JUHlPYmplY3QgKng7CisgICAgY2hhciAqZW5kOworICAgIFB5T2JqZWN0ICp4OwogCi0JeCA9IFB5TG9uZ19Gcm9tU3RyaW5nKChjaGFyKilzLCAmZW5kLCAxMCk7Ci0JaWYgKHggPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKGVuZCAhPSBzICsgbGVuKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJudWxsIGJ5dGUgaW4gYXJndW1lbnQgZm9yIGxvbmcoKSIpOwotCQlQeV9ERUNSRUYoeCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4geDsKKyAgICB4ID0gUHlMb25nX0Zyb21TdHJpbmcoKGNoYXIqKXMsICZlbmQsIDEwKTsKKyAgICBpZiAoeCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoZW5kICE9IHMgKyBsZW4pIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAibnVsbCBieXRlIGluIGFyZ3VtZW50IGZvciBsb25nKCkiKTsKKyAgICAgICAgUHlfREVDUkVGKHgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIHg7CiB9CiAKIFB5T2JqZWN0ICoKIFB5TnVtYmVyX0xvbmcoUHlPYmplY3QgKm8pCiB7Ci0JUHlOdW1iZXJNZXRob2RzICptOwotCXN0YXRpYyBQeU9iamVjdCAqdHJ1bmNfbmFtZSA9IE5VTEw7Ci0JUHlPYmplY3QgKnRydW5jX2Z1bmM7Ci0JY29uc3QgY2hhciAqYnVmZmVyOwotCVB5X3NzaXplX3QgYnVmZmVyX2xlbjsKKyAgICBQeU51bWJlck1ldGhvZHMgKm07CisgICAgc3RhdGljIFB5T2JqZWN0ICp0cnVuY19uYW1lID0gTlVMTDsKKyAgICBQeU9iamVjdCAqdHJ1bmNfZnVuYzsKKyAgICBjb25zdCBjaGFyICpidWZmZXI7CisgICAgUHlfc3NpemVfdCBidWZmZXJfbGVuOwogCi0JaWYgKHRydW5jX25hbWUgPT0gTlVMTCkgewotCQl0cnVuY19uYW1lID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX190cnVuY19fIik7Ci0JCWlmICh0cnVuY19uYW1lID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKHRydW5jX25hbWUgPT0gTlVMTCkgeworICAgICAgICB0cnVuY19uYW1lID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX190cnVuY19fIik7CisgICAgICAgIGlmICh0cnVuY19uYW1lID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlpZiAobyA9PSBOVUxMKQotCQlyZXR1cm4gbnVsbF9lcnJvcigpOwotCW0gPSBvLT5vYl90eXBlLT50cF9hc19udW1iZXI7Ci0JaWYgKG0gJiYgbS0+bmJfbG9uZykgeyAvKiBUaGlzIHNob3VsZCBpbmNsdWRlIHN1YmNsYXNzZXMgb2YgbG9uZyAqLwotCQkvKiBDbGFzc2ljIGNsYXNzZXMgYWx3YXlzIHRha2UgdGhpcyBicmFuY2guICovCi0JCVB5T2JqZWN0ICpyZXMgPSBtLT5uYl9sb25nKG8pOwotCQlpZiAocmVzICYmICghUHlJbnRfQ2hlY2socmVzKSAmJiAhUHlMb25nX0NoZWNrKHJlcykpKSB7Ci0JCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJCSAgICAgIl9fbG9uZ19fIHJldHVybmVkIG5vbi1sb25nICh0eXBlICUuMjAwcykiLAotCQkJCSAgICAgcmVzLT5vYl90eXBlLT50cF9uYW1lKTsKLQkJCVB5X0RFQ1JFRihyZXMpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJcmV0dXJuIHJlczsKLQl9Ci0JaWYgKFB5TG9uZ19DaGVjayhvKSkgLyogQSBsb25nIHN1YmNsYXNzIHdpdGhvdXQgbmJfbG9uZyAqLwotCQlyZXR1cm4gX1B5TG9uZ19Db3B5KChQeUxvbmdPYmplY3QgKilvKTsKLQl0cnVuY19mdW5jID0gUHlPYmplY3RfR2V0QXR0cihvLCB0cnVuY19uYW1lKTsKLQlpZiAodHJ1bmNfZnVuYykgewotCQlQeU9iamVjdCAqdHJ1bmNhdGVkID0gUHlFdmFsX0NhbGxPYmplY3QodHJ1bmNfZnVuYywgTlVMTCk7Ci0JCVB5T2JqZWN0ICppbnRfaW5zdGFuY2U7Ci0JCVB5X0RFQ1JFRih0cnVuY19mdW5jKTsKLQkJLyogX190cnVuY19fIGlzIHNwZWNpZmllZCB0byByZXR1cm4gYW4gSW50ZWdyYWwgdHlwZSwKLQkJICAgYnV0IGxvbmcoKSBuZWVkcyB0byByZXR1cm4gYSBsb25nLiAqLwotCQlpbnRfaW5zdGFuY2UgPSBfUHlOdW1iZXJfQ29udmVydEludGVncmFsVG9JbnQoCi0JCQl0cnVuY2F0ZWQsCi0JCQkiX190cnVuY19fIHJldHVybmVkIG5vbi1JbnRlZ3JhbCAodHlwZSAlLjIwMHMpIik7Ci0JCWlmIChpbnRfaW5zdGFuY2UgJiYgUHlJbnRfQ2hlY2soaW50X2luc3RhbmNlKSkgewotCQkJLyogTWFrZSBzdXJlIHRoYXQgbG9uZygpIHJldHVybnMgYSBsb25nIGluc3RhbmNlLiAqLwotCQkJbG9uZyB2YWx1ZSA9IFB5SW50X0FTX0xPTkcoaW50X2luc3RhbmNlKTsKLQkJCVB5X0RFQ1JFRihpbnRfaW5zdGFuY2UpOwotCQkJcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZyh2YWx1ZSk7Ci0JCX0KLQkJcmV0dXJuIGludF9pbnN0YW5jZTsKLQl9Ci0JUHlFcnJfQ2xlYXIoKTsgIC8qIEl0J3Mgbm90IGFuIGVycm9yIGlmICBvLl9fdHJ1bmNfXyBkb2Vzbid0IGV4aXN0LiAqLworICAgIGlmIChvID09IE5VTEwpCisgICAgICAgIHJldHVybiBudWxsX2Vycm9yKCk7CisgICAgbSA9IG8tPm9iX3R5cGUtPnRwX2FzX251bWJlcjsKKyAgICBpZiAobSAmJiBtLT5uYl9sb25nKSB7IC8qIFRoaXMgc2hvdWxkIGluY2x1ZGUgc3ViY2xhc3NlcyBvZiBsb25nICovCisgICAgICAgIC8qIENsYXNzaWMgY2xhc3NlcyBhbHdheXMgdGFrZSB0aGlzIGJyYW5jaC4gKi8KKyAgICAgICAgUHlPYmplY3QgKnJlcyA9IG0tPm5iX2xvbmcobyk7CisgICAgICAgIGlmIChyZXMgJiYgKCFQeUludF9DaGVjayhyZXMpICYmICFQeUxvbmdfQ2hlY2socmVzKSkpIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIl9fbG9uZ19fIHJldHVybmVkIG5vbi1sb25nICh0eXBlICUuMjAwcykiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlcy0+b2JfdHlwZS0+dHBfbmFtZSk7CisgICAgICAgICAgICBQeV9ERUNSRUYocmVzKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorICAgIGlmIChQeUxvbmdfQ2hlY2sobykpIC8qIEEgbG9uZyBzdWJjbGFzcyB3aXRob3V0IG5iX2xvbmcgKi8KKyAgICAgICAgcmV0dXJuIF9QeUxvbmdfQ29weSgoUHlMb25nT2JqZWN0ICopbyk7CisgICAgdHJ1bmNfZnVuYyA9IFB5T2JqZWN0X0dldEF0dHIobywgdHJ1bmNfbmFtZSk7CisgICAgaWYgKHRydW5jX2Z1bmMpIHsKKyAgICAgICAgUHlPYmplY3QgKnRydW5jYXRlZCA9IFB5RXZhbF9DYWxsT2JqZWN0KHRydW5jX2Z1bmMsIE5VTEwpOworICAgICAgICBQeU9iamVjdCAqaW50X2luc3RhbmNlOworICAgICAgICBQeV9ERUNSRUYodHJ1bmNfZnVuYyk7CisgICAgICAgIC8qIF9fdHJ1bmNfXyBpcyBzcGVjaWZpZWQgdG8gcmV0dXJuIGFuIEludGVncmFsIHR5cGUsCisgICAgICAgICAgIGJ1dCBsb25nKCkgbmVlZHMgdG8gcmV0dXJuIGEgbG9uZy4gKi8KKyAgICAgICAgaW50X2luc3RhbmNlID0gX1B5TnVtYmVyX0NvbnZlcnRJbnRlZ3JhbFRvSW50KAorICAgICAgICAgICAgdHJ1bmNhdGVkLAorICAgICAgICAgICAgIl9fdHJ1bmNfXyByZXR1cm5lZCBub24tSW50ZWdyYWwgKHR5cGUgJS4yMDBzKSIpOworICAgICAgICBpZiAoaW50X2luc3RhbmNlICYmIFB5SW50X0NoZWNrKGludF9pbnN0YW5jZSkpIHsKKyAgICAgICAgICAgIC8qIE1ha2Ugc3VyZSB0aGF0IGxvbmcoKSByZXR1cm5zIGEgbG9uZyBpbnN0YW5jZS4gKi8KKyAgICAgICAgICAgIGxvbmcgdmFsdWUgPSBQeUludF9BU19MT05HKGludF9pbnN0YW5jZSk7CisgICAgICAgICAgICBQeV9ERUNSRUYoaW50X2luc3RhbmNlKTsKKyAgICAgICAgICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmcodmFsdWUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBpbnRfaW5zdGFuY2U7CisgICAgfQorICAgIFB5RXJyX0NsZWFyKCk7ICAvKiBJdCdzIG5vdCBhbiBlcnJvciBpZiAgby5fX3RydW5jX18gZG9lc24ndCBleGlzdC4gKi8KIAotCWlmIChQeVN0cmluZ19DaGVjayhvKSkKLQkJLyogbmVlZCB0byBkbyBleHRyYSBlcnJvciBjaGVja2luZyB0aGF0IFB5TG9uZ19Gcm9tU3RyaW5nKCkKLQkJICogZG9lc24ndCBkby4gIEluIHBhcnRpY3VsYXIgbG9uZygnOS41JykgbXVzdCByYWlzZSBhbgotCQkgKiBleGNlcHRpb24sIG5vdCB0cnVuY2F0ZSB0aGUgZmxvYXQuCi0JCSAqLwotCQlyZXR1cm4gbG9uZ19mcm9tX3N0cmluZyhQeVN0cmluZ19BU19TVFJJTkcobyksCi0JCQkJCVB5U3RyaW5nX0dFVF9TSVpFKG8pKTsKKyAgICBpZiAoUHlTdHJpbmdfQ2hlY2sobykpCisgICAgICAgIC8qIG5lZWQgdG8gZG8gZXh0cmEgZXJyb3IgY2hlY2tpbmcgdGhhdCBQeUxvbmdfRnJvbVN0cmluZygpCisgICAgICAgICAqIGRvZXNuJ3QgZG8uICBJbiBwYXJ0aWN1bGFyIGxvbmcoJzkuNScpIG11c3QgcmFpc2UgYW4KKyAgICAgICAgICogZXhjZXB0aW9uLCBub3QgdHJ1bmNhdGUgdGhlIGZsb2F0LgorICAgICAgICAgKi8KKyAgICAgICAgcmV0dXJuIGxvbmdfZnJvbV9zdHJpbmcoUHlTdHJpbmdfQVNfU1RSSU5HKG8pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19HRVRfU0laRShvKSk7CiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCWlmIChQeVVuaWNvZGVfQ2hlY2sobykpCi0JCS8qIFRoZSBhYm92ZSBjaGVjayBpcyBkb25lIGluIFB5TG9uZ19Gcm9tVW5pY29kZSgpLiAqLwotCQlyZXR1cm4gUHlMb25nX0Zyb21Vbmljb2RlKFB5VW5pY29kZV9BU19VTklDT0RFKG8pLAotCQkJCQkgIFB5VW5pY29kZV9HRVRfU0laRShvKSwKLQkJCQkJICAxMCk7CisgICAgaWYgKFB5VW5pY29kZV9DaGVjayhvKSkKKyAgICAgICAgLyogVGhlIGFib3ZlIGNoZWNrIGlzIGRvbmUgaW4gUHlMb25nX0Zyb21Vbmljb2RlKCkuICovCisgICAgICAgIHJldHVybiBQeUxvbmdfRnJvbVVuaWNvZGUoUHlVbmljb2RlX0FTX1VOSUNPREUobyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0dFVF9TSVpFKG8pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwKTsKICNlbmRpZgotCWlmICghUHlPYmplY3RfQXNDaGFyQnVmZmVyKG8sICZidWZmZXIsICZidWZmZXJfbGVuKSkKLQkJcmV0dXJuIGxvbmdfZnJvbV9zdHJpbmcoYnVmZmVyLCBidWZmZXJfbGVuKTsKKyAgICBpZiAoIVB5T2JqZWN0X0FzQ2hhckJ1ZmZlcihvLCAmYnVmZmVyLCAmYnVmZmVyX2xlbikpCisgICAgICAgIHJldHVybiBsb25nX2Zyb21fc3RyaW5nKGJ1ZmZlciwgYnVmZmVyX2xlbik7CiAKLQlyZXR1cm4gdHlwZV9lcnJvcigibG9uZygpIGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcgb3IgYSAiCi0JCQkgICJudW1iZXIsIG5vdCAnJS4yMDBzJyIsIG8pOworICAgIHJldHVybiB0eXBlX2Vycm9yKCJsb25nKCkgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZyBvciBhICIKKyAgICAgICAgICAgICAgICAgICAgICAibnVtYmVyLCBub3QgJyUuMjAwcyciLCBvKTsKIH0KIAogUHlPYmplY3QgKgogUHlOdW1iZXJfRmxvYXQoUHlPYmplY3QgKm8pCiB7Ci0JUHlOdW1iZXJNZXRob2RzICptOworICAgIFB5TnVtYmVyTWV0aG9kcyAqbTsKIAotCWlmIChvID09IE5VTEwpCi0JCXJldHVybiBudWxsX2Vycm9yKCk7Ci0JbSA9IG8tPm9iX3R5cGUtPnRwX2FzX251bWJlcjsKLQlpZiAobSAmJiBtLT5uYl9mbG9hdCkgeyAvKiBUaGlzIHNob3VsZCBpbmNsdWRlIHN1YmNsYXNzZXMgb2YgZmxvYXQgKi8KLQkJUHlPYmplY3QgKnJlcyA9IG0tPm5iX2Zsb2F0KG8pOwotCQlpZiAocmVzICYmICFQeUZsb2F0X0NoZWNrKHJlcykpIHsKLQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCSAgICAgICAgICAiX19mbG9hdF9fIHJldHVybmVkIG5vbi1mbG9hdCAodHlwZSAlLjIwMHMpIiwKLQkJICAgICAgICAgIHJlcy0+b2JfdHlwZS0+dHBfbmFtZSk7Ci0JCQlQeV9ERUNSRUYocmVzKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCXJldHVybiByZXM7Ci0JfQotCWlmIChQeUZsb2F0X0NoZWNrKG8pKSB7IC8qIEEgZmxvYXQgc3ViY2xhc3Mgd2l0aCBuYl9mbG9hdCA9PSBOVUxMICovCi0JCVB5RmxvYXRPYmplY3QgKnBvID0gKFB5RmxvYXRPYmplY3QgKilvOwotCQlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKHBvLT5vYl9mdmFsKTsKLQl9Ci0JcmV0dXJuIFB5RmxvYXRfRnJvbVN0cmluZyhvLCBOVUxMKTsKKyAgICBpZiAobyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gbnVsbF9lcnJvcigpOworICAgIG0gPSBvLT5vYl90eXBlLT50cF9hc19udW1iZXI7CisgICAgaWYgKG0gJiYgbS0+bmJfZmxvYXQpIHsgLyogVGhpcyBzaG91bGQgaW5jbHVkZSBzdWJjbGFzc2VzIG9mIGZsb2F0ICovCisgICAgICAgIFB5T2JqZWN0ICpyZXMgPSBtLT5uYl9mbG9hdChvKTsKKyAgICAgICAgaWYgKHJlcyAmJiAhUHlGbG9hdF9DaGVjayhyZXMpKSB7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAiX19mbG9hdF9fIHJldHVybmVkIG5vbi1mbG9hdCAodHlwZSAlLjIwMHMpIiwKKyAgICAgICAgICAgICAgcmVzLT5vYl90eXBlLT50cF9uYW1lKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihyZXMpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisgICAgaWYgKFB5RmxvYXRfQ2hlY2sobykpIHsgLyogQSBmbG9hdCBzdWJjbGFzcyB3aXRoIG5iX2Zsb2F0ID09IE5VTEwgKi8KKyAgICAgICAgUHlGbG9hdE9iamVjdCAqcG8gPSAoUHlGbG9hdE9iamVjdCAqKW87CisgICAgICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUocG8tPm9iX2Z2YWwpOworICAgIH0KKyAgICByZXR1cm4gUHlGbG9hdF9Gcm9tU3RyaW5nKG8sIE5VTEwpOwogfQogCiBQeU9iamVjdCAqCiBQeU51bWJlcl9Ub0Jhc2UoUHlPYmplY3QgKm4sIGludCBiYXNlKQogewotCVB5T2JqZWN0ICpyZXMgPSBOVUxMOwotCVB5T2JqZWN0ICppbmRleCA9IFB5TnVtYmVyX0luZGV4KG4pOworICAgIFB5T2JqZWN0ICpyZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICppbmRleCA9IFB5TnVtYmVyX0luZGV4KG4pOwogCi0JaWYgKCFpbmRleCkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKFB5TG9uZ19DaGVjayhpbmRleCkpCi0JCXJlcyA9IF9QeUxvbmdfRm9ybWF0KGluZGV4LCBiYXNlLCAwLCAxKTsKLQllbHNlIGlmIChQeUludF9DaGVjayhpbmRleCkpCi0JICAJcmVzID0gX1B5SW50X0Zvcm1hdCgoUHlJbnRPYmplY3QqKWluZGV4LCBiYXNlLCAxKTsKLQllbHNlCi0JCS8qIEl0IHNob3VsZCBub3QgYmUgcG9zc2libGUgdG8gZ2V0IGhlcmUsIGFzCi0JCSAgIFB5TnVtYmVyX0luZGV4IGFscmVhZHkgaGFzIGEgY2hlY2sgZm9yIHRoZSBzYW1lCi0JCSAgIGNvbmRpdGlvbiAqLwotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIlB5TnVtYmVyX1RvQmFzZTogaW5kZXggbm90ICIKLQkJCQkiaW50IG9yIGxvbmciKTsKLQlQeV9ERUNSRUYoaW5kZXgpOwotCXJldHVybiByZXM7CisgICAgaWYgKCFpbmRleCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKFB5TG9uZ19DaGVjayhpbmRleCkpCisgICAgICAgIHJlcyA9IF9QeUxvbmdfRm9ybWF0KGluZGV4LCBiYXNlLCAwLCAxKTsKKyAgICBlbHNlIGlmIChQeUludF9DaGVjayhpbmRleCkpCisgICAgICAgIHJlcyA9IF9QeUludF9Gb3JtYXQoKFB5SW50T2JqZWN0KilpbmRleCwgYmFzZSwgMSk7CisgICAgZWxzZQorICAgICAgICAvKiBJdCBzaG91bGQgbm90IGJlIHBvc3NpYmxlIHRvIGdldCBoZXJlLCBhcworICAgICAgICAgICBQeU51bWJlcl9JbmRleCBhbHJlYWR5IGhhcyBhIGNoZWNrIGZvciB0aGUgc2FtZQorICAgICAgICAgICBjb25kaXRpb24gKi8KKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJQeU51bWJlcl9Ub0Jhc2U6IGluZGV4IG5vdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAiaW50IG9yIGxvbmciKTsKKyAgICBQeV9ERUNSRUYoaW5kZXgpOworICAgIHJldHVybiByZXM7CiB9CiAKIApAQCAtMTc5MSw1NDIgKzE3OTEsNTQyIEBACiBpbnQKIFB5U2VxdWVuY2VfQ2hlY2soUHlPYmplY3QgKnMpCiB7Ci0JaWYgKHMgJiYgUHlJbnN0YW5jZV9DaGVjayhzKSkKLQkJcmV0dXJuIFB5T2JqZWN0X0hhc0F0dHJTdHJpbmcocywgIl9fZ2V0aXRlbV9fIik7Ci0JaWYgKFB5T2JqZWN0X0lzSW5zdGFuY2UocywgKFB5T2JqZWN0ICopJlB5RGljdF9UeXBlKSkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIHMgIT0gTlVMTCAmJiBzLT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZSAmJgotCQlzLT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZS0+c3FfaXRlbSAhPSBOVUxMOworICAgIGlmIChzICYmIFB5SW5zdGFuY2VfQ2hlY2socykpCisgICAgICAgIHJldHVybiBQeU9iamVjdF9IYXNBdHRyU3RyaW5nKHMsICJfX2dldGl0ZW1fXyIpOworICAgIGlmIChQeU9iamVjdF9Jc0luc3RhbmNlKHMsIChQeU9iamVjdCAqKSZQeURpY3RfVHlwZSkpCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiBzICE9IE5VTEwgJiYgcy0+b2JfdHlwZS0+dHBfYXNfc2VxdWVuY2UgJiYKKyAgICAgICAgcy0+b2JfdHlwZS0+dHBfYXNfc2VxdWVuY2UtPnNxX2l0ZW0gIT0gTlVMTDsKIH0KIAogUHlfc3NpemVfdAogUHlTZXF1ZW5jZV9TaXplKFB5T2JqZWN0ICpzKQogewotCVB5U2VxdWVuY2VNZXRob2RzICptOworICAgIFB5U2VxdWVuY2VNZXRob2RzICptOwogCi0JaWYgKHMgPT0gTlVMTCkgewotCQludWxsX2Vycm9yKCk7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgaWYgKHMgPT0gTlVMTCkgeworICAgICAgICBudWxsX2Vycm9yKCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQltID0gcy0+b2JfdHlwZS0+dHBfYXNfc2VxdWVuY2U7Ci0JaWYgKG0gJiYgbS0+c3FfbGVuZ3RoKQotCQlyZXR1cm4gbS0+c3FfbGVuZ3RoKHMpOworICAgIG0gPSBzLT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZTsKKyAgICBpZiAobSAmJiBtLT5zcV9sZW5ndGgpCisgICAgICAgIHJldHVybiBtLT5zcV9sZW5ndGgocyk7CiAKLQl0eXBlX2Vycm9yKCJvYmplY3Qgb2YgdHlwZSAnJS4yMDBzJyBoYXMgbm8gbGVuKCkiLCBzKTsKLQlyZXR1cm4gLTE7CisgICAgdHlwZV9lcnJvcigib2JqZWN0IG9mIHR5cGUgJyUuMjAwcycgaGFzIG5vIGxlbigpIiwgcyk7CisgICAgcmV0dXJuIC0xOwogfQogCiAjdW5kZWYgUHlTZXF1ZW5jZV9MZW5ndGgKIFB5X3NzaXplX3QKIFB5U2VxdWVuY2VfTGVuZ3RoKFB5T2JqZWN0ICpzKQogewotCXJldHVybiBQeVNlcXVlbmNlX1NpemUocyk7CisgICAgcmV0dXJuIFB5U2VxdWVuY2VfU2l6ZShzKTsKIH0KICNkZWZpbmUgUHlTZXF1ZW5jZV9MZW5ndGggUHlTZXF1ZW5jZV9TaXplCiAKIFB5T2JqZWN0ICoKIFB5U2VxdWVuY2VfQ29uY2F0KFB5T2JqZWN0ICpzLCBQeU9iamVjdCAqbykKIHsKLQlQeVNlcXVlbmNlTWV0aG9kcyAqbTsKKyAgICBQeVNlcXVlbmNlTWV0aG9kcyAqbTsKIAotCWlmIChzID09IE5VTEwgfHwgbyA9PSBOVUxMKQotCQlyZXR1cm4gbnVsbF9lcnJvcigpOworICAgIGlmIChzID09IE5VTEwgfHwgbyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gbnVsbF9lcnJvcigpOwogCi0JbSA9IHMtPm9iX3R5cGUtPnRwX2FzX3NlcXVlbmNlOwotCWlmIChtICYmIG0tPnNxX2NvbmNhdCkKLQkJcmV0dXJuIG0tPnNxX2NvbmNhdChzLCBvKTsKKyAgICBtID0gcy0+b2JfdHlwZS0+dHBfYXNfc2VxdWVuY2U7CisgICAgaWYgKG0gJiYgbS0+c3FfY29uY2F0KQorICAgICAgICByZXR1cm4gbS0+c3FfY29uY2F0KHMsIG8pOwogCi0JLyogSW5zdGFuY2VzIG9mIHVzZXIgY2xhc3NlcyBkZWZpbmluZyBhbiBfX2FkZF9fKCkgbWV0aG9kIG9ubHkKLQkgICBoYXZlIGFuIG5iX2FkZCBzbG90LCBub3QgYW4gc3FfY29uY2F0IHNsb3QuICBTbyB3ZSBmYWxsIGJhY2sKLQkgICB0byBuYl9hZGQgaWYgYm90aCBhcmd1bWVudHMgYXBwZWFyIHRvIGJlIHNlcXVlbmNlcy4gKi8KLQlpZiAoUHlTZXF1ZW5jZV9DaGVjayhzKSAmJiBQeVNlcXVlbmNlX0NoZWNrKG8pKSB7Ci0JCVB5T2JqZWN0ICpyZXN1bHQgPSBiaW5hcnlfb3AxKHMsIG8sIE5CX1NMT1QobmJfYWRkKSk7Ci0JCWlmIChyZXN1bHQgIT0gUHlfTm90SW1wbGVtZW50ZWQpCi0JCQlyZXR1cm4gcmVzdWx0OwotCQlQeV9ERUNSRUYocmVzdWx0KTsKLQl9Ci0JcmV0dXJuIHR5cGVfZXJyb3IoIiclLjIwMHMnIG9iamVjdCBjYW4ndCBiZSBjb25jYXRlbmF0ZWQiLCBzKTsKKyAgICAvKiBJbnN0YW5jZXMgb2YgdXNlciBjbGFzc2VzIGRlZmluaW5nIGFuIF9fYWRkX18oKSBtZXRob2Qgb25seQorICAgICAgIGhhdmUgYW4gbmJfYWRkIHNsb3QsIG5vdCBhbiBzcV9jb25jYXQgc2xvdC4gIFNvIHdlIGZhbGwgYmFjaworICAgICAgIHRvIG5iX2FkZCBpZiBib3RoIGFyZ3VtZW50cyBhcHBlYXIgdG8gYmUgc2VxdWVuY2VzLiAqLworICAgIGlmIChQeVNlcXVlbmNlX0NoZWNrKHMpICYmIFB5U2VxdWVuY2VfQ2hlY2sobykpIHsKKyAgICAgICAgUHlPYmplY3QgKnJlc3VsdCA9IGJpbmFyeV9vcDEocywgbywgTkJfU0xPVChuYl9hZGQpKTsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBQeV9Ob3RJbXBsZW1lbnRlZCkKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgIH0KKyAgICByZXR1cm4gdHlwZV9lcnJvcigiJyUuMjAwcycgb2JqZWN0IGNhbid0IGJlIGNvbmNhdGVuYXRlZCIsIHMpOwogfQogCiBQeU9iamVjdCAqCiBQeVNlcXVlbmNlX1JlcGVhdChQeU9iamVjdCAqbywgUHlfc3NpemVfdCBjb3VudCkKIHsKLQlQeVNlcXVlbmNlTWV0aG9kcyAqbTsKKyAgICBQeVNlcXVlbmNlTWV0aG9kcyAqbTsKIAotCWlmIChvID09IE5VTEwpCi0JCXJldHVybiBudWxsX2Vycm9yKCk7CisgICAgaWYgKG8gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIG51bGxfZXJyb3IoKTsKIAotCW0gPSBvLT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZTsKLQlpZiAobSAmJiBtLT5zcV9yZXBlYXQpCi0JCXJldHVybiBtLT5zcV9yZXBlYXQobywgY291bnQpOworICAgIG0gPSBvLT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZTsKKyAgICBpZiAobSAmJiBtLT5zcV9yZXBlYXQpCisgICAgICAgIHJldHVybiBtLT5zcV9yZXBlYXQobywgY291bnQpOwogCi0JLyogSW5zdGFuY2VzIG9mIHVzZXIgY2xhc3NlcyBkZWZpbmluZyBhIF9fbXVsX18oKSBtZXRob2Qgb25seQotCSAgIGhhdmUgYW4gbmJfbXVsdGlwbHkgc2xvdCwgbm90IGFuIHNxX3JlcGVhdCBzbG90LiBzbyB3ZSBmYWxsIGJhY2sKLQkgICB0byBuYl9tdWx0aXBseSBpZiBvIGFwcGVhcnMgdG8gYmUgYSBzZXF1ZW5jZS4gKi8KLQlpZiAoUHlTZXF1ZW5jZV9DaGVjayhvKSkgewotCQlQeU9iamVjdCAqbiwgKnJlc3VsdDsKLQkJbiA9IFB5SW50X0Zyb21Tc2l6ZV90KGNvdW50KTsKLQkJaWYgKG4gPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQlyZXN1bHQgPSBiaW5hcnlfb3AxKG8sIG4sIE5CX1NMT1QobmJfbXVsdGlwbHkpKTsKLQkJUHlfREVDUkVGKG4pOwotCQlpZiAocmVzdWx0ICE9IFB5X05vdEltcGxlbWVudGVkKQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JfQotCXJldHVybiB0eXBlX2Vycm9yKCInJS4yMDBzJyBvYmplY3QgY2FuJ3QgYmUgcmVwZWF0ZWQiLCBvKTsKKyAgICAvKiBJbnN0YW5jZXMgb2YgdXNlciBjbGFzc2VzIGRlZmluaW5nIGEgX19tdWxfXygpIG1ldGhvZCBvbmx5CisgICAgICAgaGF2ZSBhbiBuYl9tdWx0aXBseSBzbG90LCBub3QgYW4gc3FfcmVwZWF0IHNsb3QuIHNvIHdlIGZhbGwgYmFjaworICAgICAgIHRvIG5iX211bHRpcGx5IGlmIG8gYXBwZWFycyB0byBiZSBhIHNlcXVlbmNlLiAqLworICAgIGlmIChQeVNlcXVlbmNlX0NoZWNrKG8pKSB7CisgICAgICAgIFB5T2JqZWN0ICpuLCAqcmVzdWx0OworICAgICAgICBuID0gUHlJbnRfRnJvbVNzaXplX3QoY291bnQpOworICAgICAgICBpZiAobiA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHJlc3VsdCA9IGJpbmFyeV9vcDEobywgbiwgTkJfU0xPVChuYl9tdWx0aXBseSkpOworICAgICAgICBQeV9ERUNSRUYobik7CisgICAgICAgIGlmIChyZXN1bHQgIT0gUHlfTm90SW1wbGVtZW50ZWQpCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICB9CisgICAgcmV0dXJuIHR5cGVfZXJyb3IoIiclLjIwMHMnIG9iamVjdCBjYW4ndCBiZSByZXBlYXRlZCIsIG8pOwogfQogCiBQeU9iamVjdCAqCiBQeVNlcXVlbmNlX0luUGxhY2VDb25jYXQoUHlPYmplY3QgKnMsIFB5T2JqZWN0ICpvKQogewotCVB5U2VxdWVuY2VNZXRob2RzICptOworICAgIFB5U2VxdWVuY2VNZXRob2RzICptOwogCi0JaWYgKHMgPT0gTlVMTCB8fCBvID09IE5VTEwpCi0JCXJldHVybiBudWxsX2Vycm9yKCk7CisgICAgaWYgKHMgPT0gTlVMTCB8fCBvID09IE5VTEwpCisgICAgICAgIHJldHVybiBudWxsX2Vycm9yKCk7CiAKLQltID0gcy0+b2JfdHlwZS0+dHBfYXNfc2VxdWVuY2U7Ci0JaWYgKG0gJiYgSEFTSU5QTEFDRShzKSAmJiBtLT5zcV9pbnBsYWNlX2NvbmNhdCkKLQkJcmV0dXJuIG0tPnNxX2lucGxhY2VfY29uY2F0KHMsIG8pOwotCWlmIChtICYmIG0tPnNxX2NvbmNhdCkKLQkJcmV0dXJuIG0tPnNxX2NvbmNhdChzLCBvKTsKKyAgICBtID0gcy0+b2JfdHlwZS0+dHBfYXNfc2VxdWVuY2U7CisgICAgaWYgKG0gJiYgSEFTSU5QTEFDRShzKSAmJiBtLT5zcV9pbnBsYWNlX2NvbmNhdCkKKyAgICAgICAgcmV0dXJuIG0tPnNxX2lucGxhY2VfY29uY2F0KHMsIG8pOworICAgIGlmIChtICYmIG0tPnNxX2NvbmNhdCkKKyAgICAgICAgcmV0dXJuIG0tPnNxX2NvbmNhdChzLCBvKTsKIAotCWlmIChQeVNlcXVlbmNlX0NoZWNrKHMpICYmIFB5U2VxdWVuY2VfQ2hlY2sobykpIHsKLQkJUHlPYmplY3QgKnJlc3VsdCA9IGJpbmFyeV9pb3AxKHMsIG8sIE5CX1NMT1QobmJfaW5wbGFjZV9hZGQpLAotCQkJCQkgICAgICAgTkJfU0xPVChuYl9hZGQpKTsKLQkJaWYgKHJlc3VsdCAhPSBQeV9Ob3RJbXBsZW1lbnRlZCkKLQkJCXJldHVybiByZXN1bHQ7Ci0JCVB5X0RFQ1JFRihyZXN1bHQpOwotCX0KLQlyZXR1cm4gdHlwZV9lcnJvcigiJyUuMjAwcycgb2JqZWN0IGNhbid0IGJlIGNvbmNhdGVuYXRlZCIsIHMpOworICAgIGlmIChQeVNlcXVlbmNlX0NoZWNrKHMpICYmIFB5U2VxdWVuY2VfQ2hlY2sobykpIHsKKyAgICAgICAgUHlPYmplY3QgKnJlc3VsdCA9IGJpbmFyeV9pb3AxKHMsIG8sIE5CX1NMT1QobmJfaW5wbGFjZV9hZGQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkJfU0xPVChuYl9hZGQpKTsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBQeV9Ob3RJbXBsZW1lbnRlZCkKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgIH0KKyAgICByZXR1cm4gdHlwZV9lcnJvcigiJyUuMjAwcycgb2JqZWN0IGNhbid0IGJlIGNvbmNhdGVuYXRlZCIsIHMpOwogfQogCiBQeU9iamVjdCAqCiBQeVNlcXVlbmNlX0luUGxhY2VSZXBlYXQoUHlPYmplY3QgKm8sIFB5X3NzaXplX3QgY291bnQpCiB7Ci0JUHlTZXF1ZW5jZU1ldGhvZHMgKm07CisgICAgUHlTZXF1ZW5jZU1ldGhvZHMgKm07CiAKLQlpZiAobyA9PSBOVUxMKQotCQlyZXR1cm4gbnVsbF9lcnJvcigpOworICAgIGlmIChvID09IE5VTEwpCisgICAgICAgIHJldHVybiBudWxsX2Vycm9yKCk7CiAKLQltID0gby0+b2JfdHlwZS0+dHBfYXNfc2VxdWVuY2U7Ci0JaWYgKG0gJiYgSEFTSU5QTEFDRShvKSAmJiBtLT5zcV9pbnBsYWNlX3JlcGVhdCkKLQkJcmV0dXJuIG0tPnNxX2lucGxhY2VfcmVwZWF0KG8sIGNvdW50KTsKLQlpZiAobSAmJiBtLT5zcV9yZXBlYXQpCi0JCXJldHVybiBtLT5zcV9yZXBlYXQobywgY291bnQpOworICAgIG0gPSBvLT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZTsKKyAgICBpZiAobSAmJiBIQVNJTlBMQUNFKG8pICYmIG0tPnNxX2lucGxhY2VfcmVwZWF0KQorICAgICAgICByZXR1cm4gbS0+c3FfaW5wbGFjZV9yZXBlYXQobywgY291bnQpOworICAgIGlmIChtICYmIG0tPnNxX3JlcGVhdCkKKyAgICAgICAgcmV0dXJuIG0tPnNxX3JlcGVhdChvLCBjb3VudCk7CiAKLQlpZiAoUHlTZXF1ZW5jZV9DaGVjayhvKSkgewotCQlQeU9iamVjdCAqbiwgKnJlc3VsdDsKLQkJbiA9IFB5SW50X0Zyb21Tc2l6ZV90KGNvdW50KTsKLQkJaWYgKG4gPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQlyZXN1bHQgPSBiaW5hcnlfaW9wMShvLCBuLCBOQl9TTE9UKG5iX2lucGxhY2VfbXVsdGlwbHkpLAotCQkJCSAgICAgTkJfU0xPVChuYl9tdWx0aXBseSkpOwotCQlQeV9ERUNSRUYobik7Ci0JCWlmIChyZXN1bHQgIT0gUHlfTm90SW1wbGVtZW50ZWQpCi0JCQlyZXR1cm4gcmVzdWx0OwotCQlQeV9ERUNSRUYocmVzdWx0KTsKLQl9Ci0JcmV0dXJuIHR5cGVfZXJyb3IoIiclLjIwMHMnIG9iamVjdCBjYW4ndCBiZSByZXBlYXRlZCIsIG8pOworICAgIGlmIChQeVNlcXVlbmNlX0NoZWNrKG8pKSB7CisgICAgICAgIFB5T2JqZWN0ICpuLCAqcmVzdWx0OworICAgICAgICBuID0gUHlJbnRfRnJvbVNzaXplX3QoY291bnQpOworICAgICAgICBpZiAobiA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHJlc3VsdCA9IGJpbmFyeV9pb3AxKG8sIG4sIE5CX1NMT1QobmJfaW5wbGFjZV9tdWx0aXBseSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5CX1NMT1QobmJfbXVsdGlwbHkpKTsKKyAgICAgICAgUHlfREVDUkVGKG4pOworICAgICAgICBpZiAocmVzdWx0ICE9IFB5X05vdEltcGxlbWVudGVkKQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgfQorICAgIHJldHVybiB0eXBlX2Vycm9yKCInJS4yMDBzJyBvYmplY3QgY2FuJ3QgYmUgcmVwZWF0ZWQiLCBvKTsKIH0KIAogUHlPYmplY3QgKgogUHlTZXF1ZW5jZV9HZXRJdGVtKFB5T2JqZWN0ICpzLCBQeV9zc2l6ZV90IGkpCiB7Ci0JUHlTZXF1ZW5jZU1ldGhvZHMgKm07CisgICAgUHlTZXF1ZW5jZU1ldGhvZHMgKm07CiAKLQlpZiAocyA9PSBOVUxMKQotCQlyZXR1cm4gbnVsbF9lcnJvcigpOworICAgIGlmIChzID09IE5VTEwpCisgICAgICAgIHJldHVybiBudWxsX2Vycm9yKCk7CiAKLQltID0gcy0+b2JfdHlwZS0+dHBfYXNfc2VxdWVuY2U7Ci0JaWYgKG0gJiYgbS0+c3FfaXRlbSkgewotCQlpZiAoaSA8IDApIHsKLQkJCWlmIChtLT5zcV9sZW5ndGgpIHsKLQkJCQlQeV9zc2l6ZV90IGwgPSAoKm0tPnNxX2xlbmd0aCkocyk7Ci0JCQkJaWYgKGwgPCAwKQotCQkJCQlyZXR1cm4gTlVMTDsKLQkJCQlpICs9IGw7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG0tPnNxX2l0ZW0ocywgaSk7Ci0JfQorICAgIG0gPSBzLT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZTsKKyAgICBpZiAobSAmJiBtLT5zcV9pdGVtKSB7CisgICAgICAgIGlmIChpIDwgMCkgeworICAgICAgICAgICAgaWYgKG0tPnNxX2xlbmd0aCkgeworICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgbCA9ICgqbS0+c3FfbGVuZ3RoKShzKTsKKyAgICAgICAgICAgICAgICBpZiAobCA8IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgIGkgKz0gbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbS0+c3FfaXRlbShzLCBpKTsKKyAgICB9CiAKLQlyZXR1cm4gdHlwZV9lcnJvcigiJyUuMjAwcycgb2JqZWN0IGRvZXMgbm90IHN1cHBvcnQgaW5kZXhpbmciLCBzKTsKKyAgICByZXR1cm4gdHlwZV9lcnJvcigiJyUuMjAwcycgb2JqZWN0IGRvZXMgbm90IHN1cHBvcnQgaW5kZXhpbmciLCBzKTsKIH0KIAogUHlPYmplY3QgKgogUHlTZXF1ZW5jZV9HZXRTbGljZShQeU9iamVjdCAqcywgUHlfc3NpemVfdCBpMSwgUHlfc3NpemVfdCBpMikKIHsKLQlQeVNlcXVlbmNlTWV0aG9kcyAqbTsKLQlQeU1hcHBpbmdNZXRob2RzICptcDsKKyAgICBQeVNlcXVlbmNlTWV0aG9kcyAqbTsKKyAgICBQeU1hcHBpbmdNZXRob2RzICptcDsKIAotCWlmICghcykgcmV0dXJuIG51bGxfZXJyb3IoKTsKKyAgICBpZiAoIXMpIHJldHVybiBudWxsX2Vycm9yKCk7CiAKLQltID0gcy0+b2JfdHlwZS0+dHBfYXNfc2VxdWVuY2U7Ci0JaWYgKG0gJiYgbS0+c3Ffc2xpY2UpIHsKLQkJaWYgKGkxIDwgMCB8fCBpMiA8IDApIHsKLQkJCWlmIChtLT5zcV9sZW5ndGgpIHsKLQkJCQlQeV9zc2l6ZV90IGwgPSAoKm0tPnNxX2xlbmd0aCkocyk7Ci0JCQkJaWYgKGwgPCAwKQotCQkJCQlyZXR1cm4gTlVMTDsKLQkJCQlpZiAoaTEgPCAwKQotCQkJCQlpMSArPSBsOwotCQkJCWlmIChpMiA8IDApCi0JCQkJCWkyICs9IGw7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG0tPnNxX3NsaWNlKHMsIGkxLCBpMik7Ci0JfSBlbHNlIGlmICgobXAgPSBzLT5vYl90eXBlLT50cF9hc19tYXBwaW5nKSAmJiBtcC0+bXBfc3Vic2NyaXB0KSB7Ci0JCVB5T2JqZWN0ICpyZXM7Ci0JCVB5T2JqZWN0ICpzbGljZSA9IF9QeVNsaWNlX0Zyb21JbmRpY2VzKGkxLCBpMik7Ci0JCWlmICghc2xpY2UpCi0JCQlyZXR1cm4gTlVMTDsKLQkJcmVzID0gbXAtPm1wX3N1YnNjcmlwdChzLCBzbGljZSk7Ci0JCVB5X0RFQ1JFRihzbGljZSk7Ci0JCXJldHVybiByZXM7Ci0JfQorICAgIG0gPSBzLT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZTsKKyAgICBpZiAobSAmJiBtLT5zcV9zbGljZSkgeworICAgICAgICBpZiAoaTEgPCAwIHx8IGkyIDwgMCkgeworICAgICAgICAgICAgaWYgKG0tPnNxX2xlbmd0aCkgeworICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgbCA9ICgqbS0+c3FfbGVuZ3RoKShzKTsKKyAgICAgICAgICAgICAgICBpZiAobCA8IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgIGlmIChpMSA8IDApCisgICAgICAgICAgICAgICAgICAgIGkxICs9IGw7CisgICAgICAgICAgICAgICAgaWYgKGkyIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgaTIgKz0gbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbS0+c3Ffc2xpY2UocywgaTEsIGkyKTsKKyAgICB9IGVsc2UgaWYgKChtcCA9IHMtPm9iX3R5cGUtPnRwX2FzX21hcHBpbmcpICYmIG1wLT5tcF9zdWJzY3JpcHQpIHsKKyAgICAgICAgUHlPYmplY3QgKnJlczsKKyAgICAgICAgUHlPYmplY3QgKnNsaWNlID0gX1B5U2xpY2VfRnJvbUluZGljZXMoaTEsIGkyKTsKKyAgICAgICAgaWYgKCFzbGljZSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICByZXMgPSBtcC0+bXBfc3Vic2NyaXB0KHMsIHNsaWNlKTsKKyAgICAgICAgUHlfREVDUkVGKHNsaWNlKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CiAKLQlyZXR1cm4gdHlwZV9lcnJvcigiJyUuMjAwcycgb2JqZWN0IGlzIHVuc2xpY2VhYmxlIiwgcyk7CisgICAgcmV0dXJuIHR5cGVfZXJyb3IoIiclLjIwMHMnIG9iamVjdCBpcyB1bnNsaWNlYWJsZSIsIHMpOwogfQogCiBpbnQKIFB5U2VxdWVuY2VfU2V0SXRlbShQeU9iamVjdCAqcywgUHlfc3NpemVfdCBpLCBQeU9iamVjdCAqbykKIHsKLQlQeVNlcXVlbmNlTWV0aG9kcyAqbTsKKyAgICBQeVNlcXVlbmNlTWV0aG9kcyAqbTsKIAotCWlmIChzID09IE5VTEwpIHsKLQkJbnVsbF9lcnJvcigpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIGlmIChzID09IE5VTEwpIHsKKyAgICAgICAgbnVsbF9lcnJvcigpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JbSA9IHMtPm9iX3R5cGUtPnRwX2FzX3NlcXVlbmNlOwotCWlmIChtICYmIG0tPnNxX2Fzc19pdGVtKSB7Ci0JCWlmIChpIDwgMCkgewotCQkJaWYgKG0tPnNxX2xlbmd0aCkgewotCQkJCVB5X3NzaXplX3QgbCA9ICgqbS0+c3FfbGVuZ3RoKShzKTsKLQkJCQlpZiAobCA8IDApCi0JCQkJCXJldHVybiAtMTsKLQkJCQlpICs9IGw7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG0tPnNxX2Fzc19pdGVtKHMsIGksIG8pOwotCX0KKyAgICBtID0gcy0+b2JfdHlwZS0+dHBfYXNfc2VxdWVuY2U7CisgICAgaWYgKG0gJiYgbS0+c3FfYXNzX2l0ZW0pIHsKKyAgICAgICAgaWYgKGkgPCAwKSB7CisgICAgICAgICAgICBpZiAobS0+c3FfbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBsID0gKCptLT5zcV9sZW5ndGgpKHMpOworICAgICAgICAgICAgICAgIGlmIChsIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIGkgKz0gbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbS0+c3FfYXNzX2l0ZW0ocywgaSwgbyk7CisgICAgfQogCi0JdHlwZV9lcnJvcigiJyUuMjAwcycgb2JqZWN0IGRvZXMgbm90IHN1cHBvcnQgaXRlbSBhc3NpZ25tZW50Iiwgcyk7Ci0JcmV0dXJuIC0xOworICAgIHR5cGVfZXJyb3IoIiclLjIwMHMnIG9iamVjdCBkb2VzIG5vdCBzdXBwb3J0IGl0ZW0gYXNzaWdubWVudCIsIHMpOworICAgIHJldHVybiAtMTsKIH0KIAogaW50CiBQeVNlcXVlbmNlX0RlbEl0ZW0oUHlPYmplY3QgKnMsIFB5X3NzaXplX3QgaSkKIHsKLQlQeVNlcXVlbmNlTWV0aG9kcyAqbTsKKyAgICBQeVNlcXVlbmNlTWV0aG9kcyAqbTsKIAotCWlmIChzID09IE5VTEwpIHsKLQkJbnVsbF9lcnJvcigpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIGlmIChzID09IE5VTEwpIHsKKyAgICAgICAgbnVsbF9lcnJvcigpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JbSA9IHMtPm9iX3R5cGUtPnRwX2FzX3NlcXVlbmNlOwotCWlmIChtICYmIG0tPnNxX2Fzc19pdGVtKSB7Ci0JCWlmIChpIDwgMCkgewotCQkJaWYgKG0tPnNxX2xlbmd0aCkgewotCQkJCVB5X3NzaXplX3QgbCA9ICgqbS0+c3FfbGVuZ3RoKShzKTsKLQkJCQlpZiAobCA8IDApCi0JCQkJCXJldHVybiAtMTsKLQkJCQlpICs9IGw7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG0tPnNxX2Fzc19pdGVtKHMsIGksIChQeU9iamVjdCAqKU5VTEwpOwotCX0KKyAgICBtID0gcy0+b2JfdHlwZS0+dHBfYXNfc2VxdWVuY2U7CisgICAgaWYgKG0gJiYgbS0+c3FfYXNzX2l0ZW0pIHsKKyAgICAgICAgaWYgKGkgPCAwKSB7CisgICAgICAgICAgICBpZiAobS0+c3FfbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBsID0gKCptLT5zcV9sZW5ndGgpKHMpOworICAgICAgICAgICAgICAgIGlmIChsIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIGkgKz0gbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbS0+c3FfYXNzX2l0ZW0ocywgaSwgKFB5T2JqZWN0ICopTlVMTCk7CisgICAgfQogCi0JdHlwZV9lcnJvcigiJyUuMjAwcycgb2JqZWN0IGRvZXNuJ3Qgc3VwcG9ydCBpdGVtIGRlbGV0aW9uIiwgcyk7Ci0JcmV0dXJuIC0xOworICAgIHR5cGVfZXJyb3IoIiclLjIwMHMnIG9iamVjdCBkb2Vzbid0IHN1cHBvcnQgaXRlbSBkZWxldGlvbiIsIHMpOworICAgIHJldHVybiAtMTsKIH0KIAogaW50CiBQeVNlcXVlbmNlX1NldFNsaWNlKFB5T2JqZWN0ICpzLCBQeV9zc2l6ZV90IGkxLCBQeV9zc2l6ZV90IGkyLCBQeU9iamVjdCAqbykKIHsKLQlQeVNlcXVlbmNlTWV0aG9kcyAqbTsKLQlQeU1hcHBpbmdNZXRob2RzICptcDsKKyAgICBQeVNlcXVlbmNlTWV0aG9kcyAqbTsKKyAgICBQeU1hcHBpbmdNZXRob2RzICptcDsKIAotCWlmIChzID09IE5VTEwpIHsKLQkJbnVsbF9lcnJvcigpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIGlmIChzID09IE5VTEwpIHsKKyAgICAgICAgbnVsbF9lcnJvcigpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JbSA9IHMtPm9iX3R5cGUtPnRwX2FzX3NlcXVlbmNlOwotCWlmIChtICYmIG0tPnNxX2Fzc19zbGljZSkgewotCQlpZiAoaTEgPCAwIHx8IGkyIDwgMCkgewotCQkJaWYgKG0tPnNxX2xlbmd0aCkgewotCQkJCVB5X3NzaXplX3QgbCA9ICgqbS0+c3FfbGVuZ3RoKShzKTsKLQkJCQlpZiAobCA8IDApCi0JCQkJCXJldHVybiAtMTsKLQkJCQlpZiAoaTEgPCAwKQotCQkJCQlpMSArPSBsOwotCQkJCWlmIChpMiA8IDApCi0JCQkJCWkyICs9IGw7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG0tPnNxX2Fzc19zbGljZShzLCBpMSwgaTIsIG8pOwotCX0gZWxzZSBpZiAoKG1wID0gcy0+b2JfdHlwZS0+dHBfYXNfbWFwcGluZykgJiYgbXAtPm1wX2Fzc19zdWJzY3JpcHQpIHsKLQkJaW50IHJlczsKLQkJUHlPYmplY3QgKnNsaWNlID0gX1B5U2xpY2VfRnJvbUluZGljZXMoaTEsIGkyKTsKLQkJaWYgKCFzbGljZSkKLQkJCXJldHVybiAtMTsKLQkJcmVzID0gbXAtPm1wX2Fzc19zdWJzY3JpcHQocywgc2xpY2UsIG8pOwotCQlQeV9ERUNSRUYoc2xpY2UpOwotCQlyZXR1cm4gcmVzOwotCX0KKyAgICBtID0gcy0+b2JfdHlwZS0+dHBfYXNfc2VxdWVuY2U7CisgICAgaWYgKG0gJiYgbS0+c3FfYXNzX3NsaWNlKSB7CisgICAgICAgIGlmIChpMSA8IDAgfHwgaTIgPCAwKSB7CisgICAgICAgICAgICBpZiAobS0+c3FfbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBsID0gKCptLT5zcV9sZW5ndGgpKHMpOworICAgICAgICAgICAgICAgIGlmIChsIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIGlmIChpMSA8IDApCisgICAgICAgICAgICAgICAgICAgIGkxICs9IGw7CisgICAgICAgICAgICAgICAgaWYgKGkyIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgaTIgKz0gbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbS0+c3FfYXNzX3NsaWNlKHMsIGkxLCBpMiwgbyk7CisgICAgfSBlbHNlIGlmICgobXAgPSBzLT5vYl90eXBlLT50cF9hc19tYXBwaW5nKSAmJiBtcC0+bXBfYXNzX3N1YnNjcmlwdCkgeworICAgICAgICBpbnQgcmVzOworICAgICAgICBQeU9iamVjdCAqc2xpY2UgPSBfUHlTbGljZV9Gcm9tSW5kaWNlcyhpMSwgaTIpOworICAgICAgICBpZiAoIXNsaWNlKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICByZXMgPSBtcC0+bXBfYXNzX3N1YnNjcmlwdChzLCBzbGljZSwgbyk7CisgICAgICAgIFB5X0RFQ1JFRihzbGljZSk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQogCi0JdHlwZV9lcnJvcigiJyUuMjAwcycgb2JqZWN0IGRvZXNuJ3Qgc3VwcG9ydCBzbGljZSBhc3NpZ25tZW50Iiwgcyk7Ci0JcmV0dXJuIC0xOworICAgIHR5cGVfZXJyb3IoIiclLjIwMHMnIG9iamVjdCBkb2Vzbid0IHN1cHBvcnQgc2xpY2UgYXNzaWdubWVudCIsIHMpOworICAgIHJldHVybiAtMTsKIH0KIAogaW50CiBQeVNlcXVlbmNlX0RlbFNsaWNlKFB5T2JqZWN0ICpzLCBQeV9zc2l6ZV90IGkxLCBQeV9zc2l6ZV90IGkyKQogewotCVB5U2VxdWVuY2VNZXRob2RzICptOworICAgIFB5U2VxdWVuY2VNZXRob2RzICptOwogCi0JaWYgKHMgPT0gTlVMTCkgewotCQludWxsX2Vycm9yKCk7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgaWYgKHMgPT0gTlVMTCkgeworICAgICAgICBudWxsX2Vycm9yKCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQltID0gcy0+b2JfdHlwZS0+dHBfYXNfc2VxdWVuY2U7Ci0JaWYgKG0gJiYgbS0+c3FfYXNzX3NsaWNlKSB7Ci0JCWlmIChpMSA8IDAgfHwgaTIgPCAwKSB7Ci0JCQlpZiAobS0+c3FfbGVuZ3RoKSB7Ci0JCQkJUHlfc3NpemVfdCBsID0gKCptLT5zcV9sZW5ndGgpKHMpOwotCQkJCWlmIChsIDwgMCkKLQkJCQkJcmV0dXJuIC0xOwotCQkJCWlmIChpMSA8IDApCi0JCQkJCWkxICs9IGw7Ci0JCQkJaWYgKGkyIDwgMCkKLQkJCQkJaTIgKz0gbDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbS0+c3FfYXNzX3NsaWNlKHMsIGkxLCBpMiwgKFB5T2JqZWN0ICopTlVMTCk7Ci0JfQotCXR5cGVfZXJyb3IoIiclLjIwMHMnIG9iamVjdCBkb2Vzbid0IHN1cHBvcnQgc2xpY2UgZGVsZXRpb24iLCBzKTsKLQlyZXR1cm4gLTE7CisgICAgbSA9IHMtPm9iX3R5cGUtPnRwX2FzX3NlcXVlbmNlOworICAgIGlmIChtICYmIG0tPnNxX2Fzc19zbGljZSkgeworICAgICAgICBpZiAoaTEgPCAwIHx8IGkyIDwgMCkgeworICAgICAgICAgICAgaWYgKG0tPnNxX2xlbmd0aCkgeworICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgbCA9ICgqbS0+c3FfbGVuZ3RoKShzKTsKKyAgICAgICAgICAgICAgICBpZiAobCA8IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICBpZiAoaTEgPCAwKQorICAgICAgICAgICAgICAgICAgICBpMSArPSBsOworICAgICAgICAgICAgICAgIGlmIChpMiA8IDApCisgICAgICAgICAgICAgICAgICAgIGkyICs9IGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG0tPnNxX2Fzc19zbGljZShzLCBpMSwgaTIsIChQeU9iamVjdCAqKU5VTEwpOworICAgIH0KKyAgICB0eXBlX2Vycm9yKCInJS4yMDBzJyBvYmplY3QgZG9lc24ndCBzdXBwb3J0IHNsaWNlIGRlbGV0aW9uIiwgcyk7CisgICAgcmV0dXJuIC0xOwogfQogCiBQeU9iamVjdCAqCiBQeVNlcXVlbmNlX1R1cGxlKFB5T2JqZWN0ICp2KQogewotCVB5T2JqZWN0ICppdDsgIC8qIGl0ZXIodikgKi8KLQlQeV9zc2l6ZV90IG47ICAgICAgICAgLyogZ3Vlc3MgZm9yIHJlc3VsdCB0dXBsZSBzaXplICovCi0JUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7Ci0JUHlfc3NpemVfdCBqOworICAgIFB5T2JqZWN0ICppdDsgIC8qIGl0ZXIodikgKi8KKyAgICBQeV9zc2l6ZV90IG47ICAgICAgICAgLyogZ3Vlc3MgZm9yIHJlc3VsdCB0dXBsZSBzaXplICovCisgICAgUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7CisgICAgUHlfc3NpemVfdCBqOwogCi0JaWYgKHYgPT0gTlVMTCkKLQkJcmV0dXJuIG51bGxfZXJyb3IoKTsKKyAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gbnVsbF9lcnJvcigpOwogCi0JLyogU3BlY2lhbC1jYXNlIHRoZSBjb21tb24gdHVwbGUgYW5kIGxpc3QgY2FzZXMsIGZvciBlZmZpY2llbmN5LiAqLwotCWlmIChQeVR1cGxlX0NoZWNrRXhhY3QodikpIHsKLQkJLyogTm90ZSB0aGF0IHdlIGNhbid0IGtub3cgd2hldGhlciBpdCdzIHNhZmUgdG8gcmV0dXJuCi0JCSAgIGEgdHVwbGUgKnN1YmNsYXNzKiBpbnN0YW5jZSBhcy1pcywgaGVuY2UgdGhlIHJlc3RyaWN0aW9uCi0JCSAgIHRvIGV4YWN0IHR1cGxlcyBoZXJlLiAgSW4gY29udHJhc3QsIGxpc3RzIGFsd2F5cyBtYWtlCi0JCSAgIGEgY29weSwgc28gdGhlcmUncyBubyBuZWVkIGZvciBleGFjdG5lc3MgYmVsb3cuICovCi0JCVB5X0lOQ1JFRih2KTsKLQkJcmV0dXJuIHY7Ci0JfQotCWlmIChQeUxpc3RfQ2hlY2sodikpCi0JCXJldHVybiBQeUxpc3RfQXNUdXBsZSh2KTsKKyAgICAvKiBTcGVjaWFsLWNhc2UgdGhlIGNvbW1vbiB0dXBsZSBhbmQgbGlzdCBjYXNlcywgZm9yIGVmZmljaWVuY3kuICovCisgICAgaWYgKFB5VHVwbGVfQ2hlY2tFeGFjdCh2KSkgeworICAgICAgICAvKiBOb3RlIHRoYXQgd2UgY2FuJ3Qga25vdyB3aGV0aGVyIGl0J3Mgc2FmZSB0byByZXR1cm4KKyAgICAgICAgICAgYSB0dXBsZSAqc3ViY2xhc3MqIGluc3RhbmNlIGFzLWlzLCBoZW5jZSB0aGUgcmVzdHJpY3Rpb24KKyAgICAgICAgICAgdG8gZXhhY3QgdHVwbGVzIGhlcmUuICBJbiBjb250cmFzdCwgbGlzdHMgYWx3YXlzIG1ha2UKKyAgICAgICAgICAgYSBjb3B5LCBzbyB0aGVyZSdzIG5vIG5lZWQgZm9yIGV4YWN0bmVzcyBiZWxvdy4gKi8KKyAgICAgICAgUHlfSU5DUkVGKHYpOworICAgICAgICByZXR1cm4gdjsKKyAgICB9CisgICAgaWYgKFB5TGlzdF9DaGVjayh2KSkKKyAgICAgICAgcmV0dXJuIFB5TGlzdF9Bc1R1cGxlKHYpOwogCi0JLyogR2V0IGl0ZXJhdG9yLiAqLwotCWl0ID0gUHlPYmplY3RfR2V0SXRlcih2KTsKLQlpZiAoaXQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgLyogR2V0IGl0ZXJhdG9yLiAqLworICAgIGl0ID0gUHlPYmplY3RfR2V0SXRlcih2KTsKKyAgICBpZiAoaXQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkvKiBHdWVzcyByZXN1bHQgc2l6ZSBhbmQgYWxsb2NhdGUgc3BhY2UuICovCi0JbiA9IF9QeU9iamVjdF9MZW5ndGhIaW50KHYsIDEwKTsKLQlpZiAobiA9PSAtMSkKLQkJZ290byBGYWlsOwotCXJlc3VsdCA9IFB5VHVwbGVfTmV3KG4pOwotCWlmIChyZXN1bHQgPT0gTlVMTCkKLQkJZ290byBGYWlsOworICAgIC8qIEd1ZXNzIHJlc3VsdCBzaXplIGFuZCBhbGxvY2F0ZSBzcGFjZS4gKi8KKyAgICBuID0gX1B5T2JqZWN0X0xlbmd0aEhpbnQodiwgMTApOworICAgIGlmIChuID09IC0xKQorICAgICAgICBnb3RvIEZhaWw7CisgICAgcmVzdWx0ID0gUHlUdXBsZV9OZXcobik7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgICAgICBnb3RvIEZhaWw7CiAKLQkvKiBGaWxsIHRoZSB0dXBsZS4gKi8KLQlmb3IgKGogPSAwOyA7ICsraikgewotCQlQeU9iamVjdCAqaXRlbSA9IFB5SXRlcl9OZXh0KGl0KTsKLQkJaWYgKGl0ZW0gPT0gTlVMTCkgewotCQkJaWYgKFB5RXJyX09jY3VycmVkKCkpCi0JCQkJZ290byBGYWlsOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGogPj0gbikgewotCQkJUHlfc3NpemVfdCBvbGRuID0gbjsKLQkJCS8qIFRoZSBvdmVyLWFsbG9jYXRpb24gc3RyYXRlZ3kgY2FuIGdyb3cgYSBiaXQgZmFzdGVyCi0JCQkgICB0aGFuIGZvciBsaXN0cyBiZWNhdXNlIHVubGlrZSBsaXN0cyB0aGUgCi0JCQkgICBvdmVyLWFsbG9jYXRpb24gaXNuJ3QgcGVybWFuZW50IC0tIHdlIHJlY2xhaW0KLQkJCSAgIHRoZSBleGNlc3MgYmVmb3JlIHRoZSBlbmQgb2YgdGhpcyByb3V0aW5lLgotCQkJICAgU28sIGdyb3cgYnkgdGVuIGFuZCB0aGVuIGFkZCAyNSUuCi0JCQkqLwotCQkJbiArPSAxMDsKLQkJCW4gKz0gbiA+PiAyOwotCQkJaWYgKG4gPCBvbGRuKSB7Ci0JCQkJLyogQ2hlY2sgZm9yIG92ZXJmbG93ICovCi0JCQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJCQlQeV9ERUNSRUYoaXRlbSk7Ci0JCQkJZ290byBGYWlsOyAKLQkJCX0KLQkJCWlmIChfUHlUdXBsZV9SZXNpemUoJnJlc3VsdCwgbikgIT0gMCkgewotCQkJCVB5X0RFQ1JFRihpdGVtKTsKLQkJCQlnb3RvIEZhaWw7Ci0JCQl9Ci0JCX0KLQkJUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIGosIGl0ZW0pOwotCX0KKyAgICAvKiBGaWxsIHRoZSB0dXBsZS4gKi8KKyAgICBmb3IgKGogPSAwOyA7ICsraikgeworICAgICAgICBQeU9iamVjdCAqaXRlbSA9IFB5SXRlcl9OZXh0KGl0KTsKKyAgICAgICAgaWYgKGl0ZW0gPT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICAgICAgZ290byBGYWlsOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGogPj0gbikgeworICAgICAgICAgICAgUHlfc3NpemVfdCBvbGRuID0gbjsKKyAgICAgICAgICAgIC8qIFRoZSBvdmVyLWFsbG9jYXRpb24gc3RyYXRlZ3kgY2FuIGdyb3cgYSBiaXQgZmFzdGVyCisgICAgICAgICAgICAgICB0aGFuIGZvciBsaXN0cyBiZWNhdXNlIHVubGlrZSBsaXN0cyB0aGUKKyAgICAgICAgICAgICAgIG92ZXItYWxsb2NhdGlvbiBpc24ndCBwZXJtYW5lbnQgLS0gd2UgcmVjbGFpbQorICAgICAgICAgICAgICAgdGhlIGV4Y2VzcyBiZWZvcmUgdGhlIGVuZCBvZiB0aGlzIHJvdXRpbmUuCisgICAgICAgICAgICAgICBTbywgZ3JvdyBieSB0ZW4gYW5kIHRoZW4gYWRkIDI1JS4KKyAgICAgICAgICAgICovCisgICAgICAgICAgICBuICs9IDEwOworICAgICAgICAgICAgbiArPSBuID4+IDI7CisgICAgICAgICAgICBpZiAobiA8IG9sZG4pIHsKKyAgICAgICAgICAgICAgICAvKiBDaGVjayBmb3Igb3ZlcmZsb3cgKi8KKyAgICAgICAgICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICAgICAgICAgICAgICBnb3RvIEZhaWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoX1B5VHVwbGVfUmVzaXplKCZyZXN1bHQsIG4pICE9IDApIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CisgICAgICAgICAgICAgICAgZ290byBGYWlsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFB5VHVwbGVfU0VUX0lURU0ocmVzdWx0LCBqLCBpdGVtKTsKKyAgICB9CiAKLQkvKiBDdXQgdHVwbGUgYmFjayBpZiBndWVzcyB3YXMgdG9vIGxhcmdlLiAqLwotCWlmIChqIDwgbiAmJgotCSAgICBfUHlUdXBsZV9SZXNpemUoJnJlc3VsdCwgaikgIT0gMCkKLQkJZ290byBGYWlsOworICAgIC8qIEN1dCB0dXBsZSBiYWNrIGlmIGd1ZXNzIHdhcyB0b28gbGFyZ2UuICovCisgICAgaWYgKGogPCBuICYmCisgICAgICAgIF9QeVR1cGxlX1Jlc2l6ZSgmcmVzdWx0LCBqKSAhPSAwKQorICAgICAgICBnb3RvIEZhaWw7CiAKLQlQeV9ERUNSRUYoaXQpOwotCXJldHVybiByZXN1bHQ7CisgICAgUHlfREVDUkVGKGl0KTsKKyAgICByZXR1cm4gcmVzdWx0OwogCiBGYWlsOgotCVB5X1hERUNSRUYocmVzdWx0KTsKLQlQeV9ERUNSRUYoaXQpOwotCXJldHVybiBOVUxMOworICAgIFB5X1hERUNSRUYocmVzdWx0KTsKKyAgICBQeV9ERUNSRUYoaXQpOworICAgIHJldHVybiBOVUxMOwogfQogCiBQeU9iamVjdCAqCiBQeVNlcXVlbmNlX0xpc3QoUHlPYmplY3QgKnYpCiB7Ci0JUHlPYmplY3QgKnJlc3VsdDsgIC8qIHJlc3VsdCBsaXN0ICovCi0JUHlPYmplY3QgKnJ2OyAgICAgIC8qIHJldHVybiB2YWx1ZSBmcm9tIFB5TGlzdF9FeHRlbmQgKi8KKyAgICBQeU9iamVjdCAqcmVzdWx0OyAgLyogcmVzdWx0IGxpc3QgKi8KKyAgICBQeU9iamVjdCAqcnY7ICAgICAgLyogcmV0dXJuIHZhbHVlIGZyb20gUHlMaXN0X0V4dGVuZCAqLwogCi0JaWYgKHYgPT0gTlVMTCkKLQkJcmV0dXJuIG51bGxfZXJyb3IoKTsKKyAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gbnVsbF9lcnJvcigpOwogCi0JcmVzdWx0ID0gUHlMaXN0X05ldygwKTsKLQlpZiAocmVzdWx0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIHJlc3VsdCA9IFB5TGlzdF9OZXcoMCk7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXJ2ID0gX1B5TGlzdF9FeHRlbmQoKFB5TGlzdE9iamVjdCAqKXJlc3VsdCwgdik7Ci0JaWYgKHJ2ID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlQeV9ERUNSRUYocnYpOwotCXJldHVybiByZXN1bHQ7CisgICAgcnYgPSBfUHlMaXN0X0V4dGVuZCgoUHlMaXN0T2JqZWN0ICopcmVzdWx0LCB2KTsKKyAgICBpZiAocnYgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5X0RFQ1JFRihydik7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogUHlPYmplY3QgKgogUHlTZXF1ZW5jZV9GYXN0KFB5T2JqZWN0ICp2LCBjb25zdCBjaGFyICptKQogewotCVB5T2JqZWN0ICppdDsKKyAgICBQeU9iamVjdCAqaXQ7CiAKLQlpZiAodiA9PSBOVUxMKQotCQlyZXR1cm4gbnVsbF9lcnJvcigpOworICAgIGlmICh2ID09IE5VTEwpCisgICAgICAgIHJldHVybiBudWxsX2Vycm9yKCk7CiAKLQlpZiAoUHlMaXN0X0NoZWNrRXhhY3QodikgfHwgUHlUdXBsZV9DaGVja0V4YWN0KHYpKSB7Ci0JCVB5X0lOQ1JFRih2KTsKLQkJcmV0dXJuIHY7Ci0JfQorICAgIGlmIChQeUxpc3RfQ2hlY2tFeGFjdCh2KSB8fCBQeVR1cGxlX0NoZWNrRXhhY3QodikpIHsKKyAgICAgICAgUHlfSU5DUkVGKHYpOworICAgICAgICByZXR1cm4gdjsKKyAgICB9CiAKLSAJaXQgPSBQeU9iamVjdF9HZXRJdGVyKHYpOwotCWlmIChpdCA9PSBOVUxMKSB7Ci0JCWlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1R5cGVFcnJvcikpCi0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCBtKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGl0ID0gUHlPYmplY3RfR2V0SXRlcih2KTsKKyAgICBpZiAoaXQgPT0gTlVMTCkgeworICAgICAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19UeXBlRXJyb3IpKQorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgbSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXYgPSBQeVNlcXVlbmNlX0xpc3QoaXQpOwotCVB5X0RFQ1JFRihpdCk7CisgICAgdiA9IFB5U2VxdWVuY2VfTGlzdChpdCk7CisgICAgUHlfREVDUkVGKGl0KTsKIAotCXJldHVybiB2OworICAgIHJldHVybiB2OwogfQogCiAvKiBJdGVyYXRlIG92ZXIgc2VxLiAgUmVzdWx0IGRlcGVuZHMgb24gdGhlIG9wZXJhdGlvbjoKICAgIFBZX0lURVJTRUFSQ0hfQ09VTlQ6ICAtMSBpZiBlcnJvciwgZWxzZSAjIG9mIHRpbWVzIG9iaiBhcHBlYXJzIGluIHNlcS4KICAgIFBZX0lURVJTRUFSQ0hfSU5ERVg6ICAwLWJhc2VkIGluZGV4IG9mIGZpcnN0IG9jY3VycmVuY2Ugb2Ygb2JqIGluIHNlcTsKLSAgIAlzZXQgVmFsdWVFcnJvciBhbmQgcmV0dXJuIC0xIGlmIG5vbmUgZm91bmQ7IGFsc28gcmV0dXJuIC0xIG9uIGVycm9yLgorICAgIHNldCBWYWx1ZUVycm9yIGFuZCByZXR1cm4gLTEgaWYgbm9uZSBmb3VuZDsgYWxzbyByZXR1cm4gLTEgb24gZXJyb3IuCiAgICBQeV9JVEVSU0VBUkNIX0NPTlRBSU5TOiAgcmV0dXJuIDEgaWYgb2JqIGluIHNlcSwgZWxzZSAwOyAtMSBvbiBlcnJvci4KICovCiBQeV9zc2l6ZV90CiBfUHlTZXF1ZW5jZV9JdGVyU2VhcmNoKFB5T2JqZWN0ICpzZXEsIFB5T2JqZWN0ICpvYmosIGludCBvcGVyYXRpb24pCiB7Ci0JUHlfc3NpemVfdCBuOwotCWludCB3cmFwcGVkOyAgLyogZm9yIFBZX0lURVJTRUFSQ0hfSU5ERVgsIHRydWUgaWZmIG4gd3JhcHBlZCBhcm91bmQgKi8KLQlQeU9iamVjdCAqaXQ7ICAvKiBpdGVyKHNlcSkgKi8KKyAgICBQeV9zc2l6ZV90IG47CisgICAgaW50IHdyYXBwZWQ7ICAvKiBmb3IgUFlfSVRFUlNFQVJDSF9JTkRFWCwgdHJ1ZSBpZmYgbiB3cmFwcGVkIGFyb3VuZCAqLworICAgIFB5T2JqZWN0ICppdDsgIC8qIGl0ZXIoc2VxKSAqLwogCi0JaWYgKHNlcSA9PSBOVUxMIHx8IG9iaiA9PSBOVUxMKSB7Ci0JCW51bGxfZXJyb3IoKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICBpZiAoc2VxID09IE5VTEwgfHwgb2JqID09IE5VTEwpIHsKKyAgICAgICAgbnVsbF9lcnJvcigpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JaXQgPSBQeU9iamVjdF9HZXRJdGVyKHNlcSk7Ci0JaWYgKGl0ID09IE5VTEwpIHsKLQkJdHlwZV9lcnJvcigiYXJndW1lbnQgb2YgdHlwZSAnJS4yMDBzJyBpcyBub3QgaXRlcmFibGUiLCBzZXEpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIGl0ID0gUHlPYmplY3RfR2V0SXRlcihzZXEpOworICAgIGlmIChpdCA9PSBOVUxMKSB7CisgICAgICAgIHR5cGVfZXJyb3IoImFyZ3VtZW50IG9mIHR5cGUgJyUuMjAwcycgaXMgbm90IGl0ZXJhYmxlIiwgc2VxKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCW4gPSB3cmFwcGVkID0gMDsKLQlmb3IgKDs7KSB7Ci0JCWludCBjbXA7Ci0JCVB5T2JqZWN0ICppdGVtID0gUHlJdGVyX05leHQoaXQpOwotCQlpZiAoaXRlbSA9PSBOVUxMKSB7Ci0JCQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkKLQkJCQlnb3RvIEZhaWw7Ci0JCQlicmVhazsKLQkJfQorICAgIG4gPSB3cmFwcGVkID0gMDsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGludCBjbXA7CisgICAgICAgIFB5T2JqZWN0ICppdGVtID0gUHlJdGVyX05leHQoaXQpOworICAgICAgICBpZiAoaXRlbSA9PSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgICAgICBnb3RvIEZhaWw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogCi0JCWNtcCA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChvYmosIGl0ZW0sIFB5X0VRKTsKLQkJUHlfREVDUkVGKGl0ZW0pOwotCQlpZiAoY21wIDwgMCkKLQkJCWdvdG8gRmFpbDsKLQkJaWYgKGNtcCA+IDApIHsKLQkJCXN3aXRjaCAob3BlcmF0aW9uKSB7Ci0JCQljYXNlIFBZX0lURVJTRUFSQ0hfQ09VTlQ6Ci0JCQkJaWYgKG4gPT0gUFlfU1NJWkVfVF9NQVgpIHsKLQkJCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0JCQkJCSAgICAgICAiY291bnQgZXhjZWVkcyBDIGludGVnZXIgc2l6ZSIpOwotCQkJCQlnb3RvIEZhaWw7Ci0JCQkJfQotCQkJCSsrbjsKLQkJCQlicmVhazsKKyAgICAgICAgY21wID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKG9iaiwgaXRlbSwgUHlfRVEpOworICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CisgICAgICAgIGlmIChjbXAgPCAwKQorICAgICAgICAgICAgZ290byBGYWlsOworICAgICAgICBpZiAoY21wID4gMCkgeworICAgICAgICAgICAgc3dpdGNoIChvcGVyYXRpb24pIHsKKyAgICAgICAgICAgIGNhc2UgUFlfSVRFUlNFQVJDSF9DT1VOVDoKKyAgICAgICAgICAgICAgICBpZiAobiA9PSBQWV9TU0laRV9UX01BWCkgeworICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb3VudCBleGNlZWRzIEMgaW50ZWdlciBzaXplIik7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gRmFpbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKytuOworICAgICAgICAgICAgICAgIGJyZWFrOwogCi0JCQljYXNlIFBZX0lURVJTRUFSQ0hfSU5ERVg6Ci0JCQkJaWYgKHdyYXBwZWQpIHsKLQkJCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0JCQkJCSAgICAgICAiaW5kZXggZXhjZWVkcyBDIGludGVnZXIgc2l6ZSIpOwotCQkJCQlnb3RvIEZhaWw7Ci0JCQkJfQotCQkJCWdvdG8gRG9uZTsKKyAgICAgICAgICAgIGNhc2UgUFlfSVRFUlNFQVJDSF9JTkRFWDoKKyAgICAgICAgICAgICAgICBpZiAod3JhcHBlZCkgeworICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbmRleCBleGNlZWRzIEMgaW50ZWdlciBzaXplIik7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gRmFpbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZ290byBEb25lOwogCi0JCQljYXNlIFBZX0lURVJTRUFSQ0hfQ09OVEFJTlM6Ci0JCQkJbiA9IDE7Ci0JCQkJZ290byBEb25lOworICAgICAgICAgICAgY2FzZSBQWV9JVEVSU0VBUkNIX0NPTlRBSU5TOgorICAgICAgICAgICAgICAgIG4gPSAxOworICAgICAgICAgICAgICAgIGdvdG8gRG9uZTsKIAotCQkJZGVmYXVsdDoKLQkJCQlhc3NlcnQoISJ1bmtub3duIG9wZXJhdGlvbiIpOwotCQkJfQotCQl9CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGFzc2VydCghInVua25vd24gb3BlcmF0aW9uIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQlpZiAob3BlcmF0aW9uID09IFBZX0lURVJTRUFSQ0hfSU5ERVgpIHsKLQkJCWlmIChuID09IFBZX1NTSVpFX1RfTUFYKQotCQkJCXdyYXBwZWQgPSAxOwotCQkJKytuOwotCQl9Ci0JfQorICAgICAgICBpZiAob3BlcmF0aW9uID09IFBZX0lURVJTRUFSQ0hfSU5ERVgpIHsKKyAgICAgICAgICAgIGlmIChuID09IFBZX1NTSVpFX1RfTUFYKQorICAgICAgICAgICAgICAgIHdyYXBwZWQgPSAxOworICAgICAgICAgICAgKytuOworICAgICAgICB9CisgICAgfQogCi0JaWYgKG9wZXJhdGlvbiAhPSBQWV9JVEVSU0VBUkNIX0lOREVYKQotCQlnb3RvIERvbmU7CisgICAgaWYgKG9wZXJhdGlvbiAhPSBQWV9JVEVSU0VBUkNIX0lOREVYKQorICAgICAgICBnb3RvIERvbmU7CiAKLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJICAgICAgICAic2VxdWVuY2UuaW5kZXgoeCk6IHggbm90IGluIHNlcXVlbmNlIik7Ci0JLyogZmFsbCBpbnRvIGZhaWx1cmUgY29kZSAqLworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAic2VxdWVuY2UuaW5kZXgoeCk6IHggbm90IGluIHNlcXVlbmNlIik7CisgICAgLyogZmFsbCBpbnRvIGZhaWx1cmUgY29kZSAqLwogRmFpbDoKLQluID0gLTE7Ci0JLyogZmFsbCB0aHJvdWdoICovCisgICAgbiA9IC0xOworICAgIC8qIGZhbGwgdGhyb3VnaCAqLwogRG9uZToKLQlQeV9ERUNSRUYoaXQpOwotCXJldHVybiBuOworICAgIFB5X0RFQ1JFRihpdCk7CisgICAgcmV0dXJuIG47CiAKIH0KIApAQCAtMjMzNCw3ICsyMzM0LDcgQEAKIFB5X3NzaXplX3QKIFB5U2VxdWVuY2VfQ291bnQoUHlPYmplY3QgKnMsIFB5T2JqZWN0ICpvKQogewotCXJldHVybiBfUHlTZXF1ZW5jZV9JdGVyU2VhcmNoKHMsIG8sIFBZX0lURVJTRUFSQ0hfQ09VTlQpOworICAgIHJldHVybiBfUHlTZXF1ZW5jZV9JdGVyU2VhcmNoKHMsIG8sIFBZX0lURVJTRUFSQ0hfQ09VTlQpOwogfQogCiAvKiBSZXR1cm4gLTEgaWYgZXJyb3I7IDEgaWYgb2IgaW4gc2VxOyAwIGlmIG9iIG5vdCBpbiBzZXEuCkBAIC0yMzQzLDE0ICsyMzQzLDE0IEBACiBpbnQKIFB5U2VxdWVuY2VfQ29udGFpbnMoUHlPYmplY3QgKnNlcSwgUHlPYmplY3QgKm9iKQogewotCVB5X3NzaXplX3QgcmVzdWx0OwotCWlmIChQeVR5cGVfSGFzRmVhdHVyZShzZXEtPm9iX3R5cGUsIFB5X1RQRkxBR1NfSEFWRV9TRVFVRU5DRV9JTikpIHsKLQkJUHlTZXF1ZW5jZU1ldGhvZHMgKnNxbSA9IHNlcS0+b2JfdHlwZS0+dHBfYXNfc2VxdWVuY2U7Ci0JICAgICAgICBpZiAoc3FtICE9IE5VTEwgJiYgc3FtLT5zcV9jb250YWlucyAhPSBOVUxMKQotCQkJcmV0dXJuICgqc3FtLT5zcV9jb250YWlucykoc2VxLCBvYik7Ci0JfQotCXJlc3VsdCA9IF9QeVNlcXVlbmNlX0l0ZXJTZWFyY2goc2VxLCBvYiwgUFlfSVRFUlNFQVJDSF9DT05UQUlOUyk7Ci0JcmV0dXJuIFB5X1NBRkVfRE9XTkNBU1QocmVzdWx0LCBQeV9zc2l6ZV90LCBpbnQpOworICAgIFB5X3NzaXplX3QgcmVzdWx0OworICAgIGlmIChQeVR5cGVfSGFzRmVhdHVyZShzZXEtPm9iX3R5cGUsIFB5X1RQRkxBR1NfSEFWRV9TRVFVRU5DRV9JTikpIHsKKyAgICAgICAgUHlTZXF1ZW5jZU1ldGhvZHMgKnNxbSA9IHNlcS0+b2JfdHlwZS0+dHBfYXNfc2VxdWVuY2U7CisgICAgICAgIGlmIChzcW0gIT0gTlVMTCAmJiBzcW0tPnNxX2NvbnRhaW5zICE9IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gKCpzcW0tPnNxX2NvbnRhaW5zKShzZXEsIG9iKTsKKyAgICB9CisgICAgcmVzdWx0ID0gX1B5U2VxdWVuY2VfSXRlclNlYXJjaChzZXEsIG9iLCBQWV9JVEVSU0VBUkNIX0NPTlRBSU5TKTsKKyAgICByZXR1cm4gUHlfU0FGRV9ET1dOQ0FTVChyZXN1bHQsIFB5X3NzaXplX3QsIGludCk7CiB9CiAKIC8qIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5ICovCkBAIC0yMzU4LDEzICsyMzU4LDEzIEBACiBpbnQKIFB5U2VxdWVuY2VfSW4oUHlPYmplY3QgKncsIFB5T2JqZWN0ICp2KQogewotCXJldHVybiBQeVNlcXVlbmNlX0NvbnRhaW5zKHcsIHYpOworICAgIHJldHVybiBQeVNlcXVlbmNlX0NvbnRhaW5zKHcsIHYpOwogfQogCiBQeV9zc2l6ZV90CiBQeVNlcXVlbmNlX0luZGV4KFB5T2JqZWN0ICpzLCBQeU9iamVjdCAqbykKIHsKLQlyZXR1cm4gX1B5U2VxdWVuY2VfSXRlclNlYXJjaChzLCBvLCBQWV9JVEVSU0VBUkNIX0lOREVYKTsKKyAgICByZXR1cm4gX1B5U2VxdWVuY2VfSXRlclNlYXJjaChzLCBvLCBQWV9JVEVSU0VBUkNIX0lOREVYKTsKIH0KIAogLyogT3BlcmF0aW9ucyBvbiBtYXBwaW5ncyAqLwpAQCAtMjM3MiwxMDIgKzIzNzIsMTAyIEBACiBpbnQKIFB5TWFwcGluZ19DaGVjayhQeU9iamVjdCAqbykKIHsKLQlpZiAobyAmJiBQeUluc3RhbmNlX0NoZWNrKG8pKQotCQlyZXR1cm4gUHlPYmplY3RfSGFzQXR0clN0cmluZyhvLCAiX19nZXRpdGVtX18iKTsKKyAgICBpZiAobyAmJiBQeUluc3RhbmNlX0NoZWNrKG8pKQorICAgICAgICByZXR1cm4gUHlPYmplY3RfSGFzQXR0clN0cmluZyhvLCAiX19nZXRpdGVtX18iKTsKIAotCXJldHVybiAgbyAmJiBvLT5vYl90eXBlLT50cF9hc19tYXBwaW5nICYmCi0JCW8tPm9iX3R5cGUtPnRwX2FzX21hcHBpbmctPm1wX3N1YnNjcmlwdCAmJgotCQkhKG8tPm9iX3R5cGUtPnRwX2FzX3NlcXVlbmNlICYmIAotCQkgIG8tPm9iX3R5cGUtPnRwX2FzX3NlcXVlbmNlLT5zcV9zbGljZSk7CisgICAgcmV0dXJuICBvICYmIG8tPm9iX3R5cGUtPnRwX2FzX21hcHBpbmcgJiYKKyAgICAgICAgby0+b2JfdHlwZS0+dHBfYXNfbWFwcGluZy0+bXBfc3Vic2NyaXB0ICYmCisgICAgICAgICEoby0+b2JfdHlwZS0+dHBfYXNfc2VxdWVuY2UgJiYKKyAgICAgICAgICBvLT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZS0+c3Ffc2xpY2UpOwogfQogCiBQeV9zc2l6ZV90CiBQeU1hcHBpbmdfU2l6ZShQeU9iamVjdCAqbykKIHsKLQlQeU1hcHBpbmdNZXRob2RzICptOworICAgIFB5TWFwcGluZ01ldGhvZHMgKm07CiAKLQlpZiAobyA9PSBOVUxMKSB7Ci0JCW51bGxfZXJyb3IoKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICBpZiAobyA9PSBOVUxMKSB7CisgICAgICAgIG51bGxfZXJyb3IoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCW0gPSBvLT5vYl90eXBlLT50cF9hc19tYXBwaW5nOwotCWlmIChtICYmIG0tPm1wX2xlbmd0aCkKLQkJcmV0dXJuIG0tPm1wX2xlbmd0aChvKTsKKyAgICBtID0gby0+b2JfdHlwZS0+dHBfYXNfbWFwcGluZzsKKyAgICBpZiAobSAmJiBtLT5tcF9sZW5ndGgpCisgICAgICAgIHJldHVybiBtLT5tcF9sZW5ndGgobyk7CiAKLQl0eXBlX2Vycm9yKCJvYmplY3Qgb2YgdHlwZSAnJS4yMDBzJyBoYXMgbm8gbGVuKCkiLCBvKTsKLQlyZXR1cm4gLTE7CisgICAgdHlwZV9lcnJvcigib2JqZWN0IG9mIHR5cGUgJyUuMjAwcycgaGFzIG5vIGxlbigpIiwgbyk7CisgICAgcmV0dXJuIC0xOwogfQogCiAjdW5kZWYgUHlNYXBwaW5nX0xlbmd0aAogUHlfc3NpemVfdAogUHlNYXBwaW5nX0xlbmd0aChQeU9iamVjdCAqbykKIHsKLQlyZXR1cm4gUHlNYXBwaW5nX1NpemUobyk7CisgICAgcmV0dXJuIFB5TWFwcGluZ19TaXplKG8pOwogfQogI2RlZmluZSBQeU1hcHBpbmdfTGVuZ3RoIFB5TWFwcGluZ19TaXplCiAKIFB5T2JqZWN0ICoKIFB5TWFwcGluZ19HZXRJdGVtU3RyaW5nKFB5T2JqZWN0ICpvLCBjaGFyICprZXkpCiB7Ci0JUHlPYmplY3QgKm9rZXksICpyOworICAgIFB5T2JqZWN0ICpva2V5LCAqcjsKIAotCWlmIChrZXkgPT0gTlVMTCkKLQkJcmV0dXJuIG51bGxfZXJyb3IoKTsKKyAgICBpZiAoa2V5ID09IE5VTEwpCisgICAgICAgIHJldHVybiBudWxsX2Vycm9yKCk7CiAKLQlva2V5ID0gUHlTdHJpbmdfRnJvbVN0cmluZyhrZXkpOwotCWlmIChva2V5ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXIgPSBQeU9iamVjdF9HZXRJdGVtKG8sIG9rZXkpOwotCVB5X0RFQ1JFRihva2V5KTsKLQlyZXR1cm4gcjsKKyAgICBva2V5ID0gUHlTdHJpbmdfRnJvbVN0cmluZyhrZXkpOworICAgIGlmIChva2V5ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHIgPSBQeU9iamVjdF9HZXRJdGVtKG8sIG9rZXkpOworICAgIFB5X0RFQ1JFRihva2V5KTsKKyAgICByZXR1cm4gcjsKIH0KIAogaW50CiBQeU1hcHBpbmdfU2V0SXRlbVN0cmluZyhQeU9iamVjdCAqbywgY2hhciAqa2V5LCBQeU9iamVjdCAqdmFsdWUpCiB7Ci0JUHlPYmplY3QgKm9rZXk7Ci0JaW50IHI7CisgICAgUHlPYmplY3QgKm9rZXk7CisgICAgaW50IHI7CiAKLQlpZiAoa2V5ID09IE5VTEwpIHsKLQkJbnVsbF9lcnJvcigpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIGlmIChrZXkgPT0gTlVMTCkgeworICAgICAgICBudWxsX2Vycm9yKCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQlva2V5ID0gUHlTdHJpbmdfRnJvbVN0cmluZyhrZXkpOwotCWlmIChva2V5ID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQlyID0gUHlPYmplY3RfU2V0SXRlbShvLCBva2V5LCB2YWx1ZSk7Ci0JUHlfREVDUkVGKG9rZXkpOwotCXJldHVybiByOworICAgIG9rZXkgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGtleSk7CisgICAgaWYgKG9rZXkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHIgPSBQeU9iamVjdF9TZXRJdGVtKG8sIG9rZXksIHZhbHVlKTsKKyAgICBQeV9ERUNSRUYob2tleSk7CisgICAgcmV0dXJuIHI7CiB9CiAKIGludAogUHlNYXBwaW5nX0hhc0tleVN0cmluZyhQeU9iamVjdCAqbywgY2hhciAqa2V5KQogewotCVB5T2JqZWN0ICp2OworICAgIFB5T2JqZWN0ICp2OwogCi0JdiA9IFB5TWFwcGluZ19HZXRJdGVtU3RyaW5nKG8sIGtleSk7Ci0JaWYgKHYpIHsKLQkJUHlfREVDUkVGKHYpOwotCQlyZXR1cm4gMTsKLQl9Ci0JUHlFcnJfQ2xlYXIoKTsKLQlyZXR1cm4gMDsKKyAgICB2ID0gUHlNYXBwaW5nX0dldEl0ZW1TdHJpbmcobywga2V5KTsKKyAgICBpZiAodikgeworICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBQeUVycl9DbGVhcigpOworICAgIHJldHVybiAwOwogfQogCiBpbnQKIFB5TWFwcGluZ19IYXNLZXkoUHlPYmplY3QgKm8sIFB5T2JqZWN0ICprZXkpCiB7Ci0JUHlPYmplY3QgKnY7CisgICAgUHlPYmplY3QgKnY7CiAKLQl2ID0gUHlPYmplY3RfR2V0SXRlbShvLCBrZXkpOwotCWlmICh2KSB7Ci0JCVB5X0RFQ1JFRih2KTsKLQkJcmV0dXJuIDE7Ci0JfQotCVB5RXJyX0NsZWFyKCk7Ci0JcmV0dXJuIDA7CisgICAgdiA9IFB5T2JqZWN0X0dldEl0ZW0obywga2V5KTsKKyAgICBpZiAodikgeworICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBQeUVycl9DbGVhcigpOworICAgIHJldHVybiAwOwogfQogCiAvKiBPcGVyYXRpb25zIG9uIGNhbGxhYmxlIG9iamVjdHMgKi8KQEAgLTI0NzcsMjUzICsyNDc3LDI1MyBAQAogUHlPYmplY3QgKgogUHlPYmplY3RfQ2FsbE9iamVjdChQeU9iamVjdCAqbywgUHlPYmplY3QgKmEpCiB7Ci0JcmV0dXJuIFB5RXZhbF9DYWxsT2JqZWN0V2l0aEtleXdvcmRzKG8sIGEsIE5VTEwpOworICAgIHJldHVybiBQeUV2YWxfQ2FsbE9iamVjdFdpdGhLZXl3b3JkcyhvLCBhLCBOVUxMKTsKIH0KIAogUHlPYmplY3QgKgogUHlPYmplY3RfQ2FsbChQeU9iamVjdCAqZnVuYywgUHlPYmplY3QgKmFyZywgUHlPYmplY3QgKmt3KQogewotICAgICAgICB0ZXJuYXJ5ZnVuYyBjYWxsOworICAgIHRlcm5hcnlmdW5jIGNhbGw7CiAKLQlpZiAoKGNhbGwgPSBmdW5jLT5vYl90eXBlLT50cF9jYWxsKSAhPSBOVUxMKSB7Ci0JCVB5T2JqZWN0ICpyZXN1bHQ7Ci0JCWlmIChQeV9FbnRlclJlY3Vyc2l2ZUNhbGwoIiB3aGlsZSBjYWxsaW5nIGEgUHl0aG9uIG9iamVjdCIpKQotCQkgICAgcmV0dXJuIE5VTEw7Ci0JCXJlc3VsdCA9ICgqY2FsbCkoZnVuYywgYXJnLCBrdyk7Ci0JCVB5X0xlYXZlUmVjdXJzaXZlQ2FsbCgpOwotCQlpZiAocmVzdWx0ID09IE5VTEwgJiYgIVB5RXJyX09jY3VycmVkKCkpCi0JCQlQeUVycl9TZXRTdHJpbmcoCi0JCQkJUHlFeGNfU3lzdGVtRXJyb3IsCi0JCQkJIk5VTEwgcmVzdWx0IHdpdGhvdXQgZXJyb3IgaW4gUHlPYmplY3RfQ2FsbCIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAiJyUuMjAwcycgb2JqZWN0IGlzIG5vdCBjYWxsYWJsZSIsCi0JCSAgICAgZnVuYy0+b2JfdHlwZS0+dHBfbmFtZSk7Ci0JcmV0dXJuIE5VTEw7CisgICAgaWYgKChjYWxsID0gZnVuYy0+b2JfdHlwZS0+dHBfY2FsbCkgIT0gTlVMTCkgeworICAgICAgICBQeU9iamVjdCAqcmVzdWx0OworICAgICAgICBpZiAoUHlfRW50ZXJSZWN1cnNpdmVDYWxsKCIgd2hpbGUgY2FsbGluZyBhIFB5dGhvbiBvYmplY3QiKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICByZXN1bHQgPSAoKmNhbGwpKGZ1bmMsIGFyZywga3cpOworICAgICAgICBQeV9MZWF2ZVJlY3Vyc2l2ZUNhbGwoKTsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBOVUxMICYmICFQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKAorICAgICAgICAgICAgICAgIFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgICAgICJOVUxMIHJlc3VsdCB3aXRob3V0IGVycm9yIGluIFB5T2JqZWN0X0NhbGwiKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgIiclLjIwMHMnIG9iamVjdCBpcyBub3QgY2FsbGFibGUiLAorICAgICAgICAgICAgICAgICBmdW5jLT5vYl90eXBlLT50cF9uYW1lKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIFB5T2JqZWN0KgogY2FsbF9mdW5jdGlvbl90YWlsKFB5T2JqZWN0ICpjYWxsYWJsZSwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKnJldHZhbDsKKyAgICBQeU9iamVjdCAqcmV0dmFsOwogCi0JaWYgKGFyZ3MgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKGFyZ3MgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoIVB5VHVwbGVfQ2hlY2soYXJncykpIHsKLQkJUHlPYmplY3QgKmE7CisgICAgaWYgKCFQeVR1cGxlX0NoZWNrKGFyZ3MpKSB7CisgICAgICAgIFB5T2JqZWN0ICphOwogCi0JCWEgPSBQeVR1cGxlX05ldygxKTsKLQkJaWYgKGEgPT0gTlVMTCkgewotCQkJUHlfREVDUkVGKGFyZ3MpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJUHlUdXBsZV9TRVRfSVRFTShhLCAwLCBhcmdzKTsKLQkJYXJncyA9IGE7Ci0JfQotCXJldHZhbCA9IFB5T2JqZWN0X0NhbGwoY2FsbGFibGUsIGFyZ3MsIE5VTEwpOworICAgICAgICBhID0gUHlUdXBsZV9OZXcoMSk7CisgICAgICAgIGlmIChhID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihhcmdzKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIFB5VHVwbGVfU0VUX0lURU0oYSwgMCwgYXJncyk7CisgICAgICAgIGFyZ3MgPSBhOworICAgIH0KKyAgICByZXR2YWwgPSBQeU9iamVjdF9DYWxsKGNhbGxhYmxlLCBhcmdzLCBOVUxMKTsKIAotCVB5X0RFQ1JFRihhcmdzKTsKKyAgICBQeV9ERUNSRUYoYXJncyk7CiAKLQlyZXR1cm4gcmV0dmFsOworICAgIHJldHVybiByZXR2YWw7CiB9CiAKIFB5T2JqZWN0ICoKIFB5T2JqZWN0X0NhbGxGdW5jdGlvbihQeU9iamVjdCAqY2FsbGFibGUsIGNoYXIgKmZvcm1hdCwgLi4uKQogewotCXZhX2xpc3QgdmE7Ci0JUHlPYmplY3QgKmFyZ3M7CisgICAgdmFfbGlzdCB2YTsKKyAgICBQeU9iamVjdCAqYXJnczsKIAotCWlmIChjYWxsYWJsZSA9PSBOVUxMKQotCQlyZXR1cm4gbnVsbF9lcnJvcigpOworICAgIGlmIChjYWxsYWJsZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gbnVsbF9lcnJvcigpOwogCi0JaWYgKGZvcm1hdCAmJiAqZm9ybWF0KSB7Ci0JCXZhX3N0YXJ0KHZhLCBmb3JtYXQpOwotCQlhcmdzID0gUHlfVmFCdWlsZFZhbHVlKGZvcm1hdCwgdmEpOwotCQl2YV9lbmQodmEpOwotCX0KLQllbHNlCi0JCWFyZ3MgPSBQeVR1cGxlX05ldygwKTsKKyAgICBpZiAoZm9ybWF0ICYmICpmb3JtYXQpIHsKKyAgICAgICAgdmFfc3RhcnQodmEsIGZvcm1hdCk7CisgICAgICAgIGFyZ3MgPSBQeV9WYUJ1aWxkVmFsdWUoZm9ybWF0LCB2YSk7CisgICAgICAgIHZhX2VuZCh2YSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgYXJncyA9IFB5VHVwbGVfTmV3KDApOwogCi0JcmV0dXJuIGNhbGxfZnVuY3Rpb25fdGFpbChjYWxsYWJsZSwgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfZnVuY3Rpb25fdGFpbChjYWxsYWJsZSwgYXJncyk7CiB9CiAKIFB5T2JqZWN0ICoKIF9QeU9iamVjdF9DYWxsRnVuY3Rpb25fU2l6ZVQoUHlPYmplY3QgKmNhbGxhYmxlLCBjaGFyICpmb3JtYXQsIC4uLikKIHsKLQl2YV9saXN0IHZhOwotCVB5T2JqZWN0ICphcmdzOworICAgIHZhX2xpc3QgdmE7CisgICAgUHlPYmplY3QgKmFyZ3M7CiAKLQlpZiAoY2FsbGFibGUgPT0gTlVMTCkKLQkJcmV0dXJuIG51bGxfZXJyb3IoKTsKKyAgICBpZiAoY2FsbGFibGUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIG51bGxfZXJyb3IoKTsKIAotCWlmIChmb3JtYXQgJiYgKmZvcm1hdCkgewotCQl2YV9zdGFydCh2YSwgZm9ybWF0KTsKLQkJYXJncyA9IF9QeV9WYUJ1aWxkVmFsdWVfU2l6ZVQoZm9ybWF0LCB2YSk7Ci0JCXZhX2VuZCh2YSk7Ci0JfQotCWVsc2UKLQkJYXJncyA9IFB5VHVwbGVfTmV3KDApOworICAgIGlmIChmb3JtYXQgJiYgKmZvcm1hdCkgeworICAgICAgICB2YV9zdGFydCh2YSwgZm9ybWF0KTsKKyAgICAgICAgYXJncyA9IF9QeV9WYUJ1aWxkVmFsdWVfU2l6ZVQoZm9ybWF0LCB2YSk7CisgICAgICAgIHZhX2VuZCh2YSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgYXJncyA9IFB5VHVwbGVfTmV3KDApOwogCi0JcmV0dXJuIGNhbGxfZnVuY3Rpb25fdGFpbChjYWxsYWJsZSwgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfZnVuY3Rpb25fdGFpbChjYWxsYWJsZSwgYXJncyk7CiB9CiAKIFB5T2JqZWN0ICoKIFB5T2JqZWN0X0NhbGxNZXRob2QoUHlPYmplY3QgKm8sIGNoYXIgKm5hbWUsIGNoYXIgKmZvcm1hdCwgLi4uKQogewotCXZhX2xpc3QgdmE7Ci0JUHlPYmplY3QgKmFyZ3M7Ci0JUHlPYmplY3QgKmZ1bmMgPSBOVUxMOwotCVB5T2JqZWN0ICpyZXR2YWwgPSBOVUxMOworICAgIHZhX2xpc3QgdmE7CisgICAgUHlPYmplY3QgKmFyZ3M7CisgICAgUHlPYmplY3QgKmZ1bmMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpyZXR2YWwgPSBOVUxMOwogCi0JaWYgKG8gPT0gTlVMTCB8fCBuYW1lID09IE5VTEwpCi0JCXJldHVybiBudWxsX2Vycm9yKCk7CisgICAgaWYgKG8gPT0gTlVMTCB8fCBuYW1lID09IE5VTEwpCisgICAgICAgIHJldHVybiBudWxsX2Vycm9yKCk7CiAKLQlmdW5jID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhvLCBuYW1lKTsKLQlpZiAoZnVuYyA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19BdHRyaWJ1dGVFcnJvciwgbmFtZSk7Ci0JCXJldHVybiAwOwotCX0KKyAgICBmdW5jID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhvLCBuYW1lKTsKKyAgICBpZiAoZnVuYyA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19BdHRyaWJ1dGVFcnJvciwgbmFtZSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KIAotCWlmICghUHlDYWxsYWJsZV9DaGVjayhmdW5jKSkgewotCQl0eXBlX2Vycm9yKCJhdHRyaWJ1dGUgb2YgdHlwZSAnJS4yMDBzJyBpcyBub3QgY2FsbGFibGUiLCBmdW5jKTsgCi0JCWdvdG8gZXhpdDsKLQl9CisgICAgaWYgKCFQeUNhbGxhYmxlX0NoZWNrKGZ1bmMpKSB7CisgICAgICAgIHR5cGVfZXJyb3IoImF0dHJpYnV0ZSBvZiB0eXBlICclLjIwMHMnIGlzIG5vdCBjYWxsYWJsZSIsIGZ1bmMpOworICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogCi0JaWYgKGZvcm1hdCAmJiAqZm9ybWF0KSB7Ci0JCXZhX3N0YXJ0KHZhLCBmb3JtYXQpOwotCQlhcmdzID0gUHlfVmFCdWlsZFZhbHVlKGZvcm1hdCwgdmEpOwotCQl2YV9lbmQodmEpOwotCX0KLQllbHNlCi0JCWFyZ3MgPSBQeVR1cGxlX05ldygwKTsKKyAgICBpZiAoZm9ybWF0ICYmICpmb3JtYXQpIHsKKyAgICAgICAgdmFfc3RhcnQodmEsIGZvcm1hdCk7CisgICAgICAgIGFyZ3MgPSBQeV9WYUJ1aWxkVmFsdWUoZm9ybWF0LCB2YSk7CisgICAgICAgIHZhX2VuZCh2YSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgYXJncyA9IFB5VHVwbGVfTmV3KDApOwogCi0JcmV0dmFsID0gY2FsbF9mdW5jdGlvbl90YWlsKGZ1bmMsIGFyZ3MpOworICAgIHJldHZhbCA9IGNhbGxfZnVuY3Rpb25fdGFpbChmdW5jLCBhcmdzKTsKIAogICBleGl0OgotCS8qIGFyZ3MgZ2V0cyBjb25zdW1lZCBpbiBjYWxsX2Z1bmN0aW9uX3RhaWwgKi8KLQlQeV9YREVDUkVGKGZ1bmMpOworICAgIC8qIGFyZ3MgZ2V0cyBjb25zdW1lZCBpbiBjYWxsX2Z1bmN0aW9uX3RhaWwgKi8KKyAgICBQeV9YREVDUkVGKGZ1bmMpOwogCi0JcmV0dXJuIHJldHZhbDsKKyAgICByZXR1cm4gcmV0dmFsOwogfQogCiBQeU9iamVjdCAqCiBfUHlPYmplY3RfQ2FsbE1ldGhvZF9TaXplVChQeU9iamVjdCAqbywgY2hhciAqbmFtZSwgY2hhciAqZm9ybWF0LCAuLi4pCiB7Ci0JdmFfbGlzdCB2YTsKLQlQeU9iamVjdCAqYXJnczsKLQlQeU9iamVjdCAqZnVuYyA9IE5VTEw7Ci0JUHlPYmplY3QgKnJldHZhbCA9IE5VTEw7CisgICAgdmFfbGlzdCB2YTsKKyAgICBQeU9iamVjdCAqYXJnczsKKyAgICBQeU9iamVjdCAqZnVuYyA9IE5VTEw7CisgICAgUHlPYmplY3QgKnJldHZhbCA9IE5VTEw7CiAKLQlpZiAobyA9PSBOVUxMIHx8IG5hbWUgPT0gTlVMTCkKLQkJcmV0dXJuIG51bGxfZXJyb3IoKTsKKyAgICBpZiAobyA9PSBOVUxMIHx8IG5hbWUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIG51bGxfZXJyb3IoKTsKIAotCWZ1bmMgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKG8sIG5hbWUpOwotCWlmIChmdW5jID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0F0dHJpYnV0ZUVycm9yLCBuYW1lKTsKLQkJcmV0dXJuIDA7Ci0JfQorICAgIGZ1bmMgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKG8sIG5hbWUpOworICAgIGlmIChmdW5jID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0F0dHJpYnV0ZUVycm9yLCBuYW1lKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCi0JaWYgKCFQeUNhbGxhYmxlX0NoZWNrKGZ1bmMpKSB7Ci0JCXR5cGVfZXJyb3IoImF0dHJpYnV0ZSBvZiB0eXBlICclLjIwMHMnIGlzIG5vdCBjYWxsYWJsZSIsIGZ1bmMpOyAKLQkJZ290byBleGl0OwotCX0KKyAgICBpZiAoIVB5Q2FsbGFibGVfQ2hlY2soZnVuYykpIHsKKyAgICAgICAgdHlwZV9lcnJvcigiYXR0cmlidXRlIG9mIHR5cGUgJyUuMjAwcycgaXMgbm90IGNhbGxhYmxlIiwgZnVuYyk7CisgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAKLQlpZiAoZm9ybWF0ICYmICpmb3JtYXQpIHsKLQkJdmFfc3RhcnQodmEsIGZvcm1hdCk7Ci0JCWFyZ3MgPSBfUHlfVmFCdWlsZFZhbHVlX1NpemVUKGZvcm1hdCwgdmEpOwotCQl2YV9lbmQodmEpOwotCX0KLQllbHNlCi0JCWFyZ3MgPSBQeVR1cGxlX05ldygwKTsKKyAgICBpZiAoZm9ybWF0ICYmICpmb3JtYXQpIHsKKyAgICAgICAgdmFfc3RhcnQodmEsIGZvcm1hdCk7CisgICAgICAgIGFyZ3MgPSBfUHlfVmFCdWlsZFZhbHVlX1NpemVUKGZvcm1hdCwgdmEpOworICAgICAgICB2YV9lbmQodmEpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIGFyZ3MgPSBQeVR1cGxlX05ldygwKTsKIAotCXJldHZhbCA9IGNhbGxfZnVuY3Rpb25fdGFpbChmdW5jLCBhcmdzKTsKKyAgICByZXR2YWwgPSBjYWxsX2Z1bmN0aW9uX3RhaWwoZnVuYywgYXJncyk7CiAKICAgZXhpdDoKLQkvKiBhcmdzIGdldHMgY29uc3VtZWQgaW4gY2FsbF9mdW5jdGlvbl90YWlsICovCi0JUHlfWERFQ1JFRihmdW5jKTsKKyAgICAvKiBhcmdzIGdldHMgY29uc3VtZWQgaW4gY2FsbF9mdW5jdGlvbl90YWlsICovCisgICAgUHlfWERFQ1JFRihmdW5jKTsKIAotCXJldHVybiByZXR2YWw7CisgICAgcmV0dXJuIHJldHZhbDsKIH0KIAogCiBzdGF0aWMgUHlPYmplY3QgKgogb2JqYXJnc19ta3R1cGxlKHZhX2xpc3QgdmEpCiB7Ci0JaW50IGksIG4gPSAwOwotCXZhX2xpc3QgY291bnR2YTsKLQlQeU9iamVjdCAqcmVzdWx0LCAqdG1wOworICAgIGludCBpLCBuID0gMDsKKyAgICB2YV9saXN0IGNvdW50dmE7CisgICAgUHlPYmplY3QgKnJlc3VsdCwgKnRtcDsKIAogI2lmZGVmIFZBX0xJU1RfSVNfQVJSQVkKLQltZW1jcHkoY291bnR2YSwgdmEsIHNpemVvZih2YV9saXN0KSk7CisgICAgbWVtY3B5KGNvdW50dmEsIHZhLCBzaXplb2YodmFfbGlzdCkpOwogI2Vsc2UKICNpZmRlZiBfX3ZhX2NvcHkKLQlfX3ZhX2NvcHkoY291bnR2YSwgdmEpOworICAgIF9fdmFfY29weShjb3VudHZhLCB2YSk7CiAjZWxzZQotCWNvdW50dmEgPSB2YTsKKyAgICBjb3VudHZhID0gdmE7CiAjZW5kaWYKICNlbmRpZgogCi0Jd2hpbGUgKCgoUHlPYmplY3QgKil2YV9hcmcoY291bnR2YSwgUHlPYmplY3QgKikpICE9IE5VTEwpCi0JCSsrbjsKLQlyZXN1bHQgPSBQeVR1cGxlX05ldyhuKTsKLQlpZiAocmVzdWx0ICE9IE5VTEwgJiYgbiA+IDApIHsKLQkJZm9yIChpID0gMDsgaSA8IG47ICsraSkgewotCQkJdG1wID0gKFB5T2JqZWN0ICopdmFfYXJnKHZhLCBQeU9iamVjdCAqKTsKLQkJCVB5VHVwbGVfU0VUX0lURU0ocmVzdWx0LCBpLCB0bXApOwotCQkJUHlfSU5DUkVGKHRtcCk7Ci0JCX0KLQl9Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICB3aGlsZSAoKChQeU9iamVjdCAqKXZhX2FyZyhjb3VudHZhLCBQeU9iamVjdCAqKSkgIT0gTlVMTCkKKyAgICAgICAgKytuOworICAgIHJlc3VsdCA9IFB5VHVwbGVfTmV3KG4pOworICAgIGlmIChyZXN1bHQgIT0gTlVMTCAmJiBuID4gMCkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CisgICAgICAgICAgICB0bXAgPSAoUHlPYmplY3QgKil2YV9hcmcodmEsIFB5T2JqZWN0ICopOworICAgICAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIGksIHRtcCk7CisgICAgICAgICAgICBQeV9JTkNSRUYodG1wKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBQeU9iamVjdCAqCiBQeU9iamVjdF9DYWxsTWV0aG9kT2JqQXJncyhQeU9iamVjdCAqY2FsbGFibGUsIFB5T2JqZWN0ICpuYW1lLCAuLi4pCiB7Ci0JUHlPYmplY3QgKmFyZ3MsICp0bXA7Ci0JdmFfbGlzdCB2YXJnczsKKyAgICBQeU9iamVjdCAqYXJncywgKnRtcDsKKyAgICB2YV9saXN0IHZhcmdzOwogCi0JaWYgKGNhbGxhYmxlID09IE5VTEwgfHwgbmFtZSA9PSBOVUxMKQotCQlyZXR1cm4gbnVsbF9lcnJvcigpOworICAgIGlmIChjYWxsYWJsZSA9PSBOVUxMIHx8IG5hbWUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIG51bGxfZXJyb3IoKTsKIAotCWNhbGxhYmxlID0gUHlPYmplY3RfR2V0QXR0cihjYWxsYWJsZSwgbmFtZSk7Ci0JaWYgKGNhbGxhYmxlID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIGNhbGxhYmxlID0gUHlPYmplY3RfR2V0QXR0cihjYWxsYWJsZSwgbmFtZSk7CisgICAgaWYgKGNhbGxhYmxlID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JLyogY291bnQgdGhlIGFyZ3MgKi8KLQl2YV9zdGFydCh2YXJncywgbmFtZSk7Ci0JYXJncyA9IG9iamFyZ3NfbWt0dXBsZSh2YXJncyk7Ci0JdmFfZW5kKHZhcmdzKTsKLQlpZiAoYXJncyA9PSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRihjYWxsYWJsZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQl0bXAgPSBQeU9iamVjdF9DYWxsKGNhbGxhYmxlLCBhcmdzLCBOVUxMKTsKLQlQeV9ERUNSRUYoYXJncyk7Ci0JUHlfREVDUkVGKGNhbGxhYmxlKTsKKyAgICAvKiBjb3VudCB0aGUgYXJncyAqLworICAgIHZhX3N0YXJ0KHZhcmdzLCBuYW1lKTsKKyAgICBhcmdzID0gb2JqYXJnc19ta3R1cGxlKHZhcmdzKTsKKyAgICB2YV9lbmQodmFyZ3MpOworICAgIGlmIChhcmdzID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKGNhbGxhYmxlKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHRtcCA9IFB5T2JqZWN0X0NhbGwoY2FsbGFibGUsIGFyZ3MsIE5VTEwpOworICAgIFB5X0RFQ1JFRihhcmdzKTsKKyAgICBQeV9ERUNSRUYoY2FsbGFibGUpOwogCi0JcmV0dXJuIHRtcDsKKyAgICByZXR1cm4gdG1wOwogfQogCiBQeU9iamVjdCAqCiBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKFB5T2JqZWN0ICpjYWxsYWJsZSwgLi4uKQogewotCVB5T2JqZWN0ICphcmdzLCAqdG1wOwotCXZhX2xpc3QgdmFyZ3M7CisgICAgUHlPYmplY3QgKmFyZ3MsICp0bXA7CisgICAgdmFfbGlzdCB2YXJnczsKIAotCWlmIChjYWxsYWJsZSA9PSBOVUxMKQotCQlyZXR1cm4gbnVsbF9lcnJvcigpOworICAgIGlmIChjYWxsYWJsZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gbnVsbF9lcnJvcigpOwogCi0JLyogY291bnQgdGhlIGFyZ3MgKi8KLQl2YV9zdGFydCh2YXJncywgY2FsbGFibGUpOwotCWFyZ3MgPSBvYmphcmdzX21rdHVwbGUodmFyZ3MpOwotCXZhX2VuZCh2YXJncyk7Ci0JaWYgKGFyZ3MgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JdG1wID0gUHlPYmplY3RfQ2FsbChjYWxsYWJsZSwgYXJncywgTlVMTCk7Ci0JUHlfREVDUkVGKGFyZ3MpOworICAgIC8qIGNvdW50IHRoZSBhcmdzICovCisgICAgdmFfc3RhcnQodmFyZ3MsIGNhbGxhYmxlKTsKKyAgICBhcmdzID0gb2JqYXJnc19ta3R1cGxlKHZhcmdzKTsKKyAgICB2YV9lbmQodmFyZ3MpOworICAgIGlmIChhcmdzID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHRtcCA9IFB5T2JqZWN0X0NhbGwoY2FsbGFibGUsIGFyZ3MsIE5VTEwpOworICAgIFB5X0RFQ1JFRihhcmdzKTsKIAotCXJldHVybiB0bXA7CisgICAgcmV0dXJuIHRtcDsKIH0KIAogCkBAIC0yNzU4LDMwNyArMjc1OCwzMDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBhYnN0cmFjdF9nZXRfYmFzZXMoUHlPYmplY3QgKmNscykKIHsKLQlzdGF0aWMgUHlPYmplY3QgKl9fYmFzZXNfXyA9IE5VTEw7Ci0JUHlPYmplY3QgKmJhc2VzOworICAgIHN0YXRpYyBQeU9iamVjdCAqX19iYXNlc19fID0gTlVMTDsKKyAgICBQeU9iamVjdCAqYmFzZXM7CiAKLQlpZiAoX19iYXNlc19fID09IE5VTEwpIHsKLQkJX19iYXNlc19fID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19iYXNlc19fIik7Ci0JCWlmIChfX2Jhc2VzX18gPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCX0KLQliYXNlcyA9IFB5T2JqZWN0X0dldEF0dHIoY2xzLCBfX2Jhc2VzX18pOwotCWlmIChiYXNlcyA9PSBOVUxMKSB7Ci0JCWlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkKLQkJCVB5RXJyX0NsZWFyKCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoIVB5VHVwbGVfQ2hlY2soYmFzZXMpKSB7Ci0JICAgICAgICBQeV9ERUNSRUYoYmFzZXMpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIGJhc2VzOworICAgIGlmIChfX2Jhc2VzX18gPT0gTlVMTCkgeworICAgICAgICBfX2Jhc2VzX18gPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2Jhc2VzX18iKTsKKyAgICAgICAgaWYgKF9fYmFzZXNfXyA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGJhc2VzID0gUHlPYmplY3RfR2V0QXR0cihjbHMsIF9fYmFzZXNfXyk7CisgICAgaWYgKGJhc2VzID09IE5VTEwpIHsKKyAgICAgICAgaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfQXR0cmlidXRlRXJyb3IpKQorICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmICghUHlUdXBsZV9DaGVjayhiYXNlcykpIHsKKyAgICAgICAgUHlfREVDUkVGKGJhc2VzKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBiYXNlczsKIH0KIAogCiBzdGF0aWMgaW50CiBhYnN0cmFjdF9pc3N1YmNsYXNzKFB5T2JqZWN0ICpkZXJpdmVkLCBQeU9iamVjdCAqY2xzKQogewotCVB5T2JqZWN0ICpiYXNlcyA9IE5VTEw7Ci0JUHlfc3NpemVfdCBpLCBuOwotCWludCByID0gMDsKKyAgICBQeU9iamVjdCAqYmFzZXMgPSBOVUxMOworICAgIFB5X3NzaXplX3QgaSwgbjsKKyAgICBpbnQgciA9IDA7CiAKLQl3aGlsZSAoMSkgewotCQlpZiAoZGVyaXZlZCA9PSBjbHMpCi0JCQlyZXR1cm4gMTsKLQkJYmFzZXMgPSBhYnN0cmFjdF9nZXRfYmFzZXMoZGVyaXZlZCk7Ci0JCWlmIChiYXNlcyA9PSBOVUxMKSB7Ci0JCQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkKLQkJCQlyZXR1cm4gLTE7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQluID0gUHlUdXBsZV9HRVRfU0laRShiYXNlcyk7Ci0JCWlmIChuID09IDApIHsKLQkJCVB5X0RFQ1JFRihiYXNlcyk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQkvKiBBdm9pZCByZWN1cnNpdml0eSBpbiB0aGUgc2luZ2xlIGluaGVyaXRhbmNlIGNhc2UgKi8KLQkJaWYgKG4gPT0gMSkgewotCQkJZGVyaXZlZCA9IFB5VHVwbGVfR0VUX0lURU0oYmFzZXMsIDApOwotCQkJUHlfREVDUkVGKGJhc2VzKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJCXIgPSBhYnN0cmFjdF9pc3N1YmNsYXNzKFB5VHVwbGVfR0VUX0lURU0oYmFzZXMsIGkpLCBjbHMpOwotCQkJaWYgKHIgIT0gMCkKLQkJCQlicmVhazsKLQkJfQotCQlQeV9ERUNSRUYoYmFzZXMpOwotCQlyZXR1cm4gcjsKLQl9CisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgaWYgKGRlcml2ZWQgPT0gY2xzKQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIGJhc2VzID0gYWJzdHJhY3RfZ2V0X2Jhc2VzKGRlcml2ZWQpOworICAgICAgICBpZiAoYmFzZXMgPT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgbiA9IFB5VHVwbGVfR0VUX1NJWkUoYmFzZXMpOworICAgICAgICBpZiAobiA9PSAwKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoYmFzZXMpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgLyogQXZvaWQgcmVjdXJzaXZpdHkgaW4gdGhlIHNpbmdsZSBpbmhlcml0YW5jZSBjYXNlICovCisgICAgICAgIGlmIChuID09IDEpIHsKKyAgICAgICAgICAgIGRlcml2ZWQgPSBQeVR1cGxlX0dFVF9JVEVNKGJhc2VzLCAwKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihiYXNlcyk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgICAgICByID0gYWJzdHJhY3RfaXNzdWJjbGFzcyhQeVR1cGxlX0dFVF9JVEVNKGJhc2VzLCBpKSwgY2xzKTsKKyAgICAgICAgICAgIGlmIChyICE9IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgUHlfREVDUkVGKGJhc2VzKTsKKyAgICAgICAgcmV0dXJuIHI7CisgICAgfQogfQogCiBzdGF0aWMgaW50CiBjaGVja19jbGFzcyhQeU9iamVjdCAqY2xzLCBjb25zdCBjaGFyICplcnJvcikKIHsKLQlQeU9iamVjdCAqYmFzZXMgPSBhYnN0cmFjdF9nZXRfYmFzZXMoY2xzKTsKLQlpZiAoYmFzZXMgPT0gTlVMTCkgewotCQkvKiBEbyBub3QgbWFzayBlcnJvcnMuICovCi0JCWlmICghUHlFcnJfT2NjdXJyZWQoKSkKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsIGVycm9yKTsKLQkJcmV0dXJuIDA7Ci0JfQotCVB5X0RFQ1JFRihiYXNlcyk7Ci0JcmV0dXJuIC0xOworICAgIFB5T2JqZWN0ICpiYXNlcyA9IGFic3RyYWN0X2dldF9iYXNlcyhjbHMpOworICAgIGlmIChiYXNlcyA9PSBOVUxMKSB7CisgICAgICAgIC8qIERvIG5vdCBtYXNrIGVycm9ycy4gKi8KKyAgICAgICAgaWYgKCFQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgZXJyb3IpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgUHlfREVDUkVGKGJhc2VzKTsKKyAgICByZXR1cm4gLTE7CiB9CiAKIHN0YXRpYyBpbnQKIHJlY3Vyc2l2ZV9pc2luc3RhbmNlKFB5T2JqZWN0ICppbnN0LCBQeU9iamVjdCAqY2xzKQogewotCVB5T2JqZWN0ICppY2xzOwotCXN0YXRpYyBQeU9iamVjdCAqX19jbGFzc19fID0gTlVMTDsKLQlpbnQgcmV0dmFsID0gMDsKKyAgICBQeU9iamVjdCAqaWNsczsKKyAgICBzdGF0aWMgUHlPYmplY3QgKl9fY2xhc3NfXyA9IE5VTEw7CisgICAgaW50IHJldHZhbCA9IDA7CiAKLQlpZiAoX19jbGFzc19fID09IE5VTEwpIHsKLQkJX19jbGFzc19fID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19jbGFzc19fIik7Ci0JCWlmIChfX2NsYXNzX18gPT0gTlVMTCkKLQkJCXJldHVybiAtMTsKLQl9CisgICAgaWYgKF9fY2xhc3NfXyA9PSBOVUxMKSB7CisgICAgICAgIF9fY2xhc3NfXyA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fY2xhc3NfXyIpOworICAgICAgICBpZiAoX19jbGFzc19fID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JaWYgKFB5Q2xhc3NfQ2hlY2soY2xzKSAmJiBQeUluc3RhbmNlX0NoZWNrKGluc3QpKSB7Ci0JCVB5T2JqZWN0ICppbmNsYXNzID0KLQkJCShQeU9iamVjdCopKChQeUluc3RhbmNlT2JqZWN0KilpbnN0KS0+aW5fY2xhc3M7Ci0JCXJldHZhbCA9IFB5Q2xhc3NfSXNTdWJjbGFzcyhpbmNsYXNzLCBjbHMpOwotCX0KLQllbHNlIGlmIChQeVR5cGVfQ2hlY2soY2xzKSkgewotCQlyZXR2YWwgPSBQeU9iamVjdF9UeXBlQ2hlY2soaW5zdCwgKFB5VHlwZU9iamVjdCAqKWNscyk7Ci0JCWlmIChyZXR2YWwgPT0gMCkgewotCQkJUHlPYmplY3QgKmMgPSBQeU9iamVjdF9HZXRBdHRyKGluc3QsIF9fY2xhc3NfXyk7Ci0JCQlpZiAoYyA9PSBOVUxMKSB7Ci0JCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmIChjICE9IChQeU9iamVjdCAqKShpbnN0LT5vYl90eXBlKSAmJgotCQkJCSAgICBQeVR5cGVfQ2hlY2soYykpCi0JCQkJCXJldHZhbCA9IFB5VHlwZV9Jc1N1YnR5cGUoCi0JCQkJCQkoUHlUeXBlT2JqZWN0ICopYywKLQkJCQkJCShQeVR5cGVPYmplY3QgKiljbHMpOwotCQkJCVB5X0RFQ1JFRihjKTsKLQkJCX0KLQkJfQotCX0KLQllbHNlIHsKLQkJaWYgKCFjaGVja19jbGFzcyhjbHMsCi0JCQkiaXNpbnN0YW5jZSgpIGFyZyAyIG11c3QgYmUgYSBjbGFzcywgdHlwZSwiCi0JCQkiIG9yIHR1cGxlIG9mIGNsYXNzZXMgYW5kIHR5cGVzIikpCi0JCQlyZXR1cm4gLTE7Ci0JCWljbHMgPSBQeU9iamVjdF9HZXRBdHRyKGluc3QsIF9fY2xhc3NfXyk7Ci0JCWlmIChpY2xzID09IE5VTEwpIHsKLQkJCVB5RXJyX0NsZWFyKCk7Ci0JCQlyZXR2YWwgPSAwOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dmFsID0gYWJzdHJhY3RfaXNzdWJjbGFzcyhpY2xzLCBjbHMpOwotCQkJUHlfREVDUkVGKGljbHMpOwotCQl9Ci0JfQorICAgIGlmIChQeUNsYXNzX0NoZWNrKGNscykgJiYgUHlJbnN0YW5jZV9DaGVjayhpbnN0KSkgeworICAgICAgICBQeU9iamVjdCAqaW5jbGFzcyA9CisgICAgICAgICAgICAoUHlPYmplY3QqKSgoUHlJbnN0YW5jZU9iamVjdCopaW5zdCktPmluX2NsYXNzOworICAgICAgICByZXR2YWwgPSBQeUNsYXNzX0lzU3ViY2xhc3MoaW5jbGFzcywgY2xzKTsKKyAgICB9CisgICAgZWxzZSBpZiAoUHlUeXBlX0NoZWNrKGNscykpIHsKKyAgICAgICAgcmV0dmFsID0gUHlPYmplY3RfVHlwZUNoZWNrKGluc3QsIChQeVR5cGVPYmplY3QgKiljbHMpOworICAgICAgICBpZiAocmV0dmFsID09IDApIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpjID0gUHlPYmplY3RfR2V0QXR0cihpbnN0LCBfX2NsYXNzX18pOworICAgICAgICAgICAgaWYgKGMgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoYyAhPSAoUHlPYmplY3QgKikoaW5zdC0+b2JfdHlwZSkgJiYKKyAgICAgICAgICAgICAgICAgICAgUHlUeXBlX0NoZWNrKGMpKQorICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSBQeVR5cGVfSXNTdWJ0eXBlKAorICAgICAgICAgICAgICAgICAgICAgICAgKFB5VHlwZU9iamVjdCAqKWMsCisgICAgICAgICAgICAgICAgICAgICAgICAoUHlUeXBlT2JqZWN0ICopY2xzKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoYyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGlmICghY2hlY2tfY2xhc3MoY2xzLAorICAgICAgICAgICAgImlzaW5zdGFuY2UoKSBhcmcgMiBtdXN0IGJlIGEgY2xhc3MsIHR5cGUsIgorICAgICAgICAgICAgIiBvciB0dXBsZSBvZiBjbGFzc2VzIGFuZCB0eXBlcyIpKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBpY2xzID0gUHlPYmplY3RfR2V0QXR0cihpbnN0LCBfX2NsYXNzX18pOworICAgICAgICBpZiAoaWNscyA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgcmV0dmFsID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHJldHZhbCA9IGFic3RyYWN0X2lzc3ViY2xhc3MoaWNscywgY2xzKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihpY2xzKTsKKyAgICAgICAgfQorICAgIH0KIAotCXJldHVybiByZXR2YWw7CisgICAgcmV0dXJuIHJldHZhbDsKIH0KIAogaW50CiBQeU9iamVjdF9Jc0luc3RhbmNlKFB5T2JqZWN0ICppbnN0LCBQeU9iamVjdCAqY2xzKQogewotCXN0YXRpYyBQeU9iamVjdCAqbmFtZSA9IE5VTEw7Ci0JUHlPYmplY3QgKmNoZWNrZXI7CisgICAgc3RhdGljIFB5T2JqZWN0ICpuYW1lID0gTlVMTDsKKyAgICBQeU9iamVjdCAqY2hlY2tlcjsKIAotCS8qIFF1aWNrIHRlc3QgZm9yIGFuIGV4YWN0IG1hdGNoICovCi0JaWYgKFB5X1RZUEUoaW5zdCkgPT0gKFB5VHlwZU9iamVjdCAqKWNscykKLQkJcmV0dXJuIDE7CisgICAgLyogUXVpY2sgdGVzdCBmb3IgYW4gZXhhY3QgbWF0Y2ggKi8KKyAgICBpZiAoUHlfVFlQRShpbnN0KSA9PSAoUHlUeXBlT2JqZWN0ICopY2xzKQorICAgICAgICByZXR1cm4gMTsKIAotCWlmIChQeVR1cGxlX0NoZWNrKGNscykpIHsKLQkJUHlfc3NpemVfdCBpOwotCQlQeV9zc2l6ZV90IG47Ci0JCWludCByID0gMDsKKyAgICBpZiAoUHlUdXBsZV9DaGVjayhjbHMpKSB7CisgICAgICAgIFB5X3NzaXplX3QgaTsKKyAgICAgICAgUHlfc3NpemVfdCBuOworICAgICAgICBpbnQgciA9IDA7CiAKLQkJaWYgKFB5X0VudGVyUmVjdXJzaXZlQ2FsbCgiIGluIF9faW5zdGFuY2VjaGVja19fIikpCi0JCQlyZXR1cm4gLTE7Ci0JCW4gPSBQeVR1cGxlX0dFVF9TSVpFKGNscyk7Ci0JCWZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKLQkJCVB5T2JqZWN0ICppdGVtID0gUHlUdXBsZV9HRVRfSVRFTShjbHMsIGkpOwotCQkJciA9IFB5T2JqZWN0X0lzSW5zdGFuY2UoaW5zdCwgaXRlbSk7Ci0JCQlpZiAociAhPSAwKQotCQkJCS8qIGVpdGhlciBmb3VuZCBpdCwgb3IgZ290IGFuIGVycm9yICovCi0JCQkJYnJlYWs7Ci0JCX0KLQkJUHlfTGVhdmVSZWN1cnNpdmVDYWxsKCk7Ci0JCXJldHVybiByOwotCX0KLQlpZiAobmFtZSA9PSBOVUxMKSB7Ci0JCW5hbWUgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2luc3RhbmNlY2hlY2tfXyIpOwotCQlpZiAobmFtZSA9PSBOVUxMKQotCQkJcmV0dXJuIC0xOwotCX0KLQljaGVja2VyID0gUHlPYmplY3RfR2V0QXR0cihjbHMsIG5hbWUpOwotCWlmIChjaGVja2VyID09IE5VTEwgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJUHlFcnJfQ2xlYXIoKTsKLQlpZiAoY2hlY2tlciAhPSBOVUxMKSB7Ci0JCVB5T2JqZWN0ICpyZXM7Ci0JCWludCBvayA9IC0xOwotCQlpZiAoUHlfRW50ZXJSZWN1cnNpdmVDYWxsKCIgaW4gX19pbnN0YW5jZWNoZWNrX18iKSkgewotCQkJUHlfREVDUkVGKGNoZWNrZXIpOwotCQkJcmV0dXJuIG9rOwotCQl9Ci0JCXJlcyA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoY2hlY2tlciwgaW5zdCwgTlVMTCk7Ci0JCVB5X0xlYXZlUmVjdXJzaXZlQ2FsbCgpOwotCQlQeV9ERUNSRUYoY2hlY2tlcik7Ci0JCWlmIChyZXMgIT0gTlVMTCkgewotCQkJb2sgPSBQeU9iamVjdF9Jc1RydWUocmVzKTsKLQkJCVB5X0RFQ1JFRihyZXMpOwotCQl9Ci0JCXJldHVybiBvazsKLQl9Ci0JcmV0dXJuIHJlY3Vyc2l2ZV9pc2luc3RhbmNlKGluc3QsIGNscyk7CisgICAgICAgIGlmIChQeV9FbnRlclJlY3Vyc2l2ZUNhbGwoIiBpbiBfX2luc3RhbmNlY2hlY2tfXyIpKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBuID0gUHlUdXBsZV9HRVRfU0laRShjbHMpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CisgICAgICAgICAgICBQeU9iamVjdCAqaXRlbSA9IFB5VHVwbGVfR0VUX0lURU0oY2xzLCBpKTsKKyAgICAgICAgICAgIHIgPSBQeU9iamVjdF9Jc0luc3RhbmNlKGluc3QsIGl0ZW0pOworICAgICAgICAgICAgaWYgKHIgIT0gMCkKKyAgICAgICAgICAgICAgICAvKiBlaXRoZXIgZm91bmQgaXQsIG9yIGdvdCBhbiBlcnJvciAqLworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIFB5X0xlYXZlUmVjdXJzaXZlQ2FsbCgpOworICAgICAgICByZXR1cm4gcjsKKyAgICB9CisgICAgaWYgKG5hbWUgPT0gTlVMTCkgeworICAgICAgICBuYW1lID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19pbnN0YW5jZWNoZWNrX18iKTsKKyAgICAgICAgaWYgKG5hbWUgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgY2hlY2tlciA9IFB5T2JqZWN0X0dldEF0dHIoY2xzLCBuYW1lKTsKKyAgICBpZiAoY2hlY2tlciA9PSBOVUxMICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgaWYgKGNoZWNrZXIgIT0gTlVMTCkgeworICAgICAgICBQeU9iamVjdCAqcmVzOworICAgICAgICBpbnQgb2sgPSAtMTsKKyAgICAgICAgaWYgKFB5X0VudGVyUmVjdXJzaXZlQ2FsbCgiIGluIF9faW5zdGFuY2VjaGVja19fIikpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihjaGVja2VyKTsKKyAgICAgICAgICAgIHJldHVybiBvazsKKyAgICAgICAgfQorICAgICAgICByZXMgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGNoZWNrZXIsIGluc3QsIE5VTEwpOworICAgICAgICBQeV9MZWF2ZVJlY3Vyc2l2ZUNhbGwoKTsKKyAgICAgICAgUHlfREVDUkVGKGNoZWNrZXIpOworICAgICAgICBpZiAocmVzICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG9rID0gUHlPYmplY3RfSXNUcnVlKHJlcyk7CisgICAgICAgICAgICBQeV9ERUNSRUYocmVzKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gb2s7CisgICAgfQorICAgIHJldHVybiByZWN1cnNpdmVfaXNpbnN0YW5jZShpbnN0LCBjbHMpOwogfQogCiBzdGF0aWMgIGludAogcmVjdXJzaXZlX2lzc3ViY2xhc3MoUHlPYmplY3QgKmRlcml2ZWQsIFB5T2JqZWN0ICpjbHMpCiB7Ci0JaW50IHJldHZhbDsKKyAgICBpbnQgcmV0dmFsOwogCi0gCWlmIChQeVR5cGVfQ2hlY2soY2xzKSAmJiBQeVR5cGVfQ2hlY2soZGVyaXZlZCkpIHsKLSAJCS8qIEZhc3QgcGF0aCAobm9uLXJlY3Vyc2l2ZSkgKi8KLSAJCXJldHVybiBQeVR5cGVfSXNTdWJ0eXBlKAotCQkJKFB5VHlwZU9iamVjdCAqKWRlcml2ZWQsIChQeVR5cGVPYmplY3QgKiljbHMpOwotIAl9Ci0JaWYgKCFQeUNsYXNzX0NoZWNrKGRlcml2ZWQpIHx8ICFQeUNsYXNzX0NoZWNrKGNscykpIHsKLQkJaWYgKCFjaGVja19jbGFzcyhkZXJpdmVkLAotCQkJCSAiaXNzdWJjbGFzcygpIGFyZyAxIG11c3QgYmUgYSBjbGFzcyIpKQotCQkJcmV0dXJuIC0xOworICAgIGlmIChQeVR5cGVfQ2hlY2soY2xzKSAmJiBQeVR5cGVfQ2hlY2soZGVyaXZlZCkpIHsKKyAgICAgICAgLyogRmFzdCBwYXRoIChub24tcmVjdXJzaXZlKSAqLworICAgICAgICByZXR1cm4gUHlUeXBlX0lzU3VidHlwZSgKKyAgICAgICAgICAgIChQeVR5cGVPYmplY3QgKilkZXJpdmVkLCAoUHlUeXBlT2JqZWN0ICopY2xzKTsKKyAgICB9CisgICAgaWYgKCFQeUNsYXNzX0NoZWNrKGRlcml2ZWQpIHx8ICFQeUNsYXNzX0NoZWNrKGNscykpIHsKKyAgICAgICAgaWYgKCFjaGVja19jbGFzcyhkZXJpdmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICJpc3N1YmNsYXNzKCkgYXJnIDEgbXVzdCBiZSBhIGNsYXNzIikpCisgICAgICAgICAgICByZXR1cm4gLTE7CiAKLQkJaWYgKCFjaGVja19jbGFzcyhjbHMsCi0JCQkJImlzc3ViY2xhc3MoKSBhcmcgMiBtdXN0IGJlIGEgY2xhc3MiCi0JCQkJIiBvciB0dXBsZSBvZiBjbGFzc2VzIikpCi0JCQlyZXR1cm4gLTE7Ci0JCXJldHZhbCA9IGFic3RyYWN0X2lzc3ViY2xhc3MoZGVyaXZlZCwgY2xzKTsKLQl9Ci0JZWxzZSB7Ci0JCS8qIHNob3J0Y3V0ICovCi0JICAJaWYgKCEocmV0dmFsID0gKGRlcml2ZWQgPT0gY2xzKSkpCi0JCQlyZXR2YWwgPSBQeUNsYXNzX0lzU3ViY2xhc3MoZGVyaXZlZCwgY2xzKTsKLQl9CisgICAgICAgIGlmICghY2hlY2tfY2xhc3MoY2xzLAorICAgICAgICAgICAgICAgICAgICAgICAgImlzc3ViY2xhc3MoKSBhcmcgMiBtdXN0IGJlIGEgY2xhc3MiCisgICAgICAgICAgICAgICAgICAgICAgICAiIG9yIHR1cGxlIG9mIGNsYXNzZXMiKSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgcmV0dmFsID0gYWJzdHJhY3RfaXNzdWJjbGFzcyhkZXJpdmVkLCBjbHMpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLyogc2hvcnRjdXQgKi8KKyAgICAgICAgaWYgKCEocmV0dmFsID0gKGRlcml2ZWQgPT0gY2xzKSkpCisgICAgICAgICAgICByZXR2YWwgPSBQeUNsYXNzX0lzU3ViY2xhc3MoZGVyaXZlZCwgY2xzKTsKKyAgICB9CiAKLQlyZXR1cm4gcmV0dmFsOworICAgIHJldHVybiByZXR2YWw7CiB9CiAKIGludAogUHlPYmplY3RfSXNTdWJjbGFzcyhQeU9iamVjdCAqZGVyaXZlZCwgUHlPYmplY3QgKmNscykKIHsKLQlzdGF0aWMgUHlPYmplY3QgKm5hbWUgPSBOVUxMOwotCVB5T2JqZWN0ICp0LCAqdiwgKnRiOwotCVB5T2JqZWN0ICpjaGVja2VyOwotCQotIAlpZiAoUHlUdXBsZV9DaGVjayhjbHMpKSB7Ci0gCQlQeV9zc2l6ZV90IGk7Ci0gCQlQeV9zc2l6ZV90IG47Ci0gCQlpbnQgciA9IDA7Ci0gCi0gCQlpZiAoUHlfRW50ZXJSZWN1cnNpdmVDYWxsKCIgaW4gX19zdWJjbGFzc2NoZWNrX18iKSkKLSAJCQlyZXR1cm4gLTE7Ci0gCQluID0gUHlUdXBsZV9HRVRfU0laRShjbHMpOwotIAkJZm9yIChpID0gMDsgaSA8IG47ICsraSkgewotIAkJCVB5T2JqZWN0ICppdGVtID0gUHlUdXBsZV9HRVRfSVRFTShjbHMsIGkpOwotIAkJCXIgPSBQeU9iamVjdF9Jc1N1YmNsYXNzKGRlcml2ZWQsIGl0ZW0pOwotIAkJCWlmIChyICE9IDApCi0gCQkJCS8qIGVpdGhlciBmb3VuZCBpdCwgb3IgZ290IGFuIGVycm9yICovCi0gCQkJCWJyZWFrOwotIAkJfQotIAkJUHlfTGVhdmVSZWN1cnNpdmVDYWxsKCk7Ci0gCQlyZXR1cm4gcjsKLSAJfQotCWlmIChuYW1lID09IE5VTEwpIHsKLQkJbmFtZSA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fc3ViY2xhc3NjaGVja19fIik7Ci0JCWlmIChuYW1lID09IE5VTEwpCi0JCQlyZXR1cm4gLTE7Ci0JfQotCVB5RXJyX0ZldGNoKCZ0LCAmdiwgJnRiKTsKLQljaGVja2VyID0gUHlPYmplY3RfR2V0QXR0cihjbHMsIG5hbWUpOwotCVB5RXJyX1Jlc3RvcmUodCwgdiwgdGIpOwotCWlmIChjaGVja2VyICE9IE5VTEwpIHsKLQkJUHlPYmplY3QgKnJlczsKLQkJaW50IG9rID0gLTE7Ci0JCWlmIChQeV9FbnRlclJlY3Vyc2l2ZUNhbGwoIiBpbiBfX3N1YmNsYXNzY2hlY2tfXyIpKSB7Ci0JCQlQeV9ERUNSRUYoY2hlY2tlcik7Ci0JCQlyZXR1cm4gb2s7Ci0JCX0KLQkJcmVzID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhjaGVja2VyLCBkZXJpdmVkLCBOVUxMKTsKLQkJUHlfTGVhdmVSZWN1cnNpdmVDYWxsKCk7Ci0JCVB5X0RFQ1JFRihjaGVja2VyKTsKLQkJaWYgKHJlcyAhPSBOVUxMKSB7Ci0JCQlvayA9IFB5T2JqZWN0X0lzVHJ1ZShyZXMpOwotCQkJUHlfREVDUkVGKHJlcyk7Ci0JCX0KLQkJcmV0dXJuIG9rOwotCX0KLQlyZXR1cm4gcmVjdXJzaXZlX2lzc3ViY2xhc3MoZGVyaXZlZCwgY2xzKTsKKyAgICBzdGF0aWMgUHlPYmplY3QgKm5hbWUgPSBOVUxMOworICAgIFB5T2JqZWN0ICp0LCAqdiwgKnRiOworICAgIFB5T2JqZWN0ICpjaGVja2VyOworCisgICAgaWYgKFB5VHVwbGVfQ2hlY2soY2xzKSkgeworICAgICAgICBQeV9zc2l6ZV90IGk7CisgICAgICAgIFB5X3NzaXplX3QgbjsKKyAgICAgICAgaW50IHIgPSAwOworCisgICAgICAgIGlmIChQeV9FbnRlclJlY3Vyc2l2ZUNhbGwoIiBpbiBfX3N1YmNsYXNzY2hlY2tfXyIpKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBuID0gUHlUdXBsZV9HRVRfU0laRShjbHMpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CisgICAgICAgICAgICBQeU9iamVjdCAqaXRlbSA9IFB5VHVwbGVfR0VUX0lURU0oY2xzLCBpKTsKKyAgICAgICAgICAgIHIgPSBQeU9iamVjdF9Jc1N1YmNsYXNzKGRlcml2ZWQsIGl0ZW0pOworICAgICAgICAgICAgaWYgKHIgIT0gMCkKKyAgICAgICAgICAgICAgICAvKiBlaXRoZXIgZm91bmQgaXQsIG9yIGdvdCBhbiBlcnJvciAqLworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIFB5X0xlYXZlUmVjdXJzaXZlQ2FsbCgpOworICAgICAgICByZXR1cm4gcjsKKyAgICB9CisgICAgaWYgKG5hbWUgPT0gTlVMTCkgeworICAgICAgICBuYW1lID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19zdWJjbGFzc2NoZWNrX18iKTsKKyAgICAgICAgaWYgKG5hbWUgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgUHlFcnJfRmV0Y2goJnQsICZ2LCAmdGIpOworICAgIGNoZWNrZXIgPSBQeU9iamVjdF9HZXRBdHRyKGNscywgbmFtZSk7CisgICAgUHlFcnJfUmVzdG9yZSh0LCB2LCB0Yik7CisgICAgaWYgKGNoZWNrZXIgIT0gTlVMTCkgeworICAgICAgICBQeU9iamVjdCAqcmVzOworICAgICAgICBpbnQgb2sgPSAtMTsKKyAgICAgICAgaWYgKFB5X0VudGVyUmVjdXJzaXZlQ2FsbCgiIGluIF9fc3ViY2xhc3NjaGVja19fIikpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihjaGVja2VyKTsKKyAgICAgICAgICAgIHJldHVybiBvazsKKyAgICAgICAgfQorICAgICAgICByZXMgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGNoZWNrZXIsIGRlcml2ZWQsIE5VTEwpOworICAgICAgICBQeV9MZWF2ZVJlY3Vyc2l2ZUNhbGwoKTsKKyAgICAgICAgUHlfREVDUkVGKGNoZWNrZXIpOworICAgICAgICBpZiAocmVzICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG9rID0gUHlPYmplY3RfSXNUcnVlKHJlcyk7CisgICAgICAgICAgICBQeV9ERUNSRUYocmVzKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gb2s7CisgICAgfQorICAgIHJldHVybiByZWN1cnNpdmVfaXNzdWJjbGFzcyhkZXJpdmVkLCBjbHMpOwogfQogCiBpbnQKIF9QeU9iamVjdF9SZWFsSXNJbnN0YW5jZShQeU9iamVjdCAqaW5zdCwgUHlPYmplY3QgKmNscykKIHsKLQlyZXR1cm4gcmVjdXJzaXZlX2lzaW5zdGFuY2UoaW5zdCwgY2xzKTsKKyAgICByZXR1cm4gcmVjdXJzaXZlX2lzaW5zdGFuY2UoaW5zdCwgY2xzKTsKIH0KIAogaW50CiBfUHlPYmplY3RfUmVhbElzU3ViY2xhc3MoUHlPYmplY3QgKmRlcml2ZWQsIFB5T2JqZWN0ICpjbHMpCiB7Ci0JcmV0dXJuIHJlY3Vyc2l2ZV9pc3N1YmNsYXNzKGRlcml2ZWQsIGNscyk7CisgICAgcmV0dXJuIHJlY3Vyc2l2ZV9pc3N1YmNsYXNzKGRlcml2ZWQsIGNscyk7CiB9CiAKIAogUHlPYmplY3QgKgogUHlPYmplY3RfR2V0SXRlcihQeU9iamVjdCAqbykKIHsKLQlQeVR5cGVPYmplY3QgKnQgPSBvLT5vYl90eXBlOwotCWdldGl0ZXJmdW5jIGYgPSBOVUxMOwotCWlmIChQeVR5cGVfSGFzRmVhdHVyZSh0LCBQeV9UUEZMQUdTX0hBVkVfSVRFUikpCi0JCWYgPSB0LT50cF9pdGVyOwotCWlmIChmID09IE5VTEwpIHsKLQkJaWYgKFB5U2VxdWVuY2VfQ2hlY2sobykpCi0JCQlyZXR1cm4gUHlTZXFJdGVyX05ldyhvKTsKLQkJcmV0dXJuIHR5cGVfZXJyb3IoIiclLjIwMHMnIG9iamVjdCBpcyBub3QgaXRlcmFibGUiLCBvKTsKLQl9Ci0JZWxzZSB7Ci0JCVB5T2JqZWN0ICpyZXMgPSAoKmYpKG8pOwotCQlpZiAocmVzICE9IE5VTEwgJiYgIVB5SXRlcl9DaGVjayhyZXMpKSB7Ci0JCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJCSAgICAgIml0ZXIoKSByZXR1cm5lZCBub24taXRlcmF0b3IgIgotCQkJCSAgICAgIm9mIHR5cGUgJyUuMTAwcyciLAotCQkJCSAgICAgcmVzLT5vYl90eXBlLT50cF9uYW1lKTsKLQkJCVB5X0RFQ1JFRihyZXMpOwotCQkJcmVzID0gTlVMTDsKLQkJfQotCQlyZXR1cm4gcmVzOwotCX0KKyAgICBQeVR5cGVPYmplY3QgKnQgPSBvLT5vYl90eXBlOworICAgIGdldGl0ZXJmdW5jIGYgPSBOVUxMOworICAgIGlmIChQeVR5cGVfSGFzRmVhdHVyZSh0LCBQeV9UUEZMQUdTX0hBVkVfSVRFUikpCisgICAgICAgIGYgPSB0LT50cF9pdGVyOworICAgIGlmIChmID09IE5VTEwpIHsKKyAgICAgICAgaWYgKFB5U2VxdWVuY2VfQ2hlY2sobykpCisgICAgICAgICAgICByZXR1cm4gUHlTZXFJdGVyX05ldyhvKTsKKyAgICAgICAgcmV0dXJuIHR5cGVfZXJyb3IoIiclLjIwMHMnIG9iamVjdCBpcyBub3QgaXRlcmFibGUiLCBvKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5T2JqZWN0ICpyZXMgPSAoKmYpKG8pOworICAgICAgICBpZiAocmVzICE9IE5VTEwgJiYgIVB5SXRlcl9DaGVjayhyZXMpKSB7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICJpdGVyKCkgcmV0dXJuZWQgbm9uLWl0ZXJhdG9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAib2YgdHlwZSAnJS4xMDBzJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVzLT5vYl90eXBlLT50cF9uYW1lKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihyZXMpOworICAgICAgICAgICAgcmVzID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzOworICAgIH0KIH0KIAogLyogUmV0dXJuIG5leHQgaXRlbS4KQEAgLTMwNzEsMTIgKzMwNzEsMTIgQEAKIFB5T2JqZWN0ICoKIFB5SXRlcl9OZXh0KFB5T2JqZWN0ICppdGVyKQogewotCVB5T2JqZWN0ICpyZXN1bHQ7Ci0JYXNzZXJ0KFB5SXRlcl9DaGVjayhpdGVyKSk7Ci0JcmVzdWx0ID0gKCppdGVyLT5vYl90eXBlLT50cF9pdGVybmV4dCkoaXRlcik7Ci0JaWYgKHJlc3VsdCA9PSBOVUxMICYmCi0JICAgIFB5RXJyX09jY3VycmVkKCkgJiYKLQkgICAgUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19TdG9wSXRlcmF0aW9uKSkKLQkJUHlFcnJfQ2xlYXIoKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisgICAgYXNzZXJ0KFB5SXRlcl9DaGVjayhpdGVyKSk7CisgICAgcmVzdWx0ID0gKCppdGVyLT5vYl90eXBlLT50cF9pdGVybmV4dCkoaXRlcik7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMICYmCisgICAgICAgIFB5RXJyX09jY3VycmVkKCkgJiYKKyAgICAgICAgUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19TdG9wSXRlcmF0aW9uKSkKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9ib29sb2JqZWN0LmMgYi9PYmplY3RzL2Jvb2xvYmplY3QuYwppbmRleCBmZDczZDI4Li41OTU4MzJhIDEwMDY0NAotLS0gYS9PYmplY3RzL2Jvb2xvYmplY3QuYworKysgYi9PYmplY3RzL2Jvb2xvYmplY3QuYwpAQCAtNywxMCArNywxMCBAQAogc3RhdGljIGludAogYm9vbF9wcmludChQeUJvb2xPYmplY3QgKnNlbGYsIEZJTEUgKmZwLCBpbnQgZmxhZ3MpCiB7Ci0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCWZwdXRzKHNlbGYtPm9iX2l2YWwgPT0gMCA/ICJGYWxzZSIgOiAiVHJ1ZSIsIGZwKTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCXJldHVybiAwOworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICBmcHV0cyhzZWxmLT5vYl9pdmFsID09IDAgPyAiRmFsc2UiIDogIlRydWUiLCBmcCk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICByZXR1cm4gMDsKIH0KIAogLyogV2UgZGVmaW5lIGJvb2xfcmVwciB0byByZXR1cm4gIkZhbHNlIiBvciAiVHJ1ZSIgKi8KQEAgLTIxLDMwICsyMSwzMCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGJvb2xfcmVwcihQeUJvb2xPYmplY3QgKnNlbGYpCiB7Ci0JUHlPYmplY3QgKnM7CisgICAgUHlPYmplY3QgKnM7CiAKLQlpZiAoc2VsZi0+b2JfaXZhbCkKLQkJcyA9IHRydWVfc3RyID8gdHJ1ZV9zdHIgOgotCQkJKHRydWVfc3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiVHJ1ZSIpKTsKLQllbHNlCi0JCXMgPSBmYWxzZV9zdHIgPyBmYWxzZV9zdHIgOgotCQkJKGZhbHNlX3N0ciA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIkZhbHNlIikpOwotCVB5X1hJTkNSRUYocyk7Ci0JcmV0dXJuIHM7CisgICAgaWYgKHNlbGYtPm9iX2l2YWwpCisgICAgICAgIHMgPSB0cnVlX3N0ciA/IHRydWVfc3RyIDoKKyAgICAgICAgICAgICh0cnVlX3N0ciA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIlRydWUiKSk7CisgICAgZWxzZQorICAgICAgICBzID0gZmFsc2Vfc3RyID8gZmFsc2Vfc3RyIDoKKyAgICAgICAgICAgIChmYWxzZV9zdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJGYWxzZSIpKTsKKyAgICBQeV9YSU5DUkVGKHMpOworICAgIHJldHVybiBzOwogfQogCiAvKiBGdW5jdGlvbiB0byByZXR1cm4gYSBib29sIGZyb20gYSBDIGxvbmcgKi8KIAogUHlPYmplY3QgKlB5Qm9vbF9Gcm9tTG9uZyhsb25nIG9rKQogewotCVB5T2JqZWN0ICpyZXN1bHQ7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKIAotCWlmIChvaykKLQkJcmVzdWx0ID0gUHlfVHJ1ZTsKLQllbHNlCi0JCXJlc3VsdCA9IFB5X0ZhbHNlOwotCVB5X0lOQ1JFRihyZXN1bHQpOwotCXJldHVybiByZXN1bHQ7CisgICAgaWYgKG9rKQorICAgICAgICByZXN1bHQgPSBQeV9UcnVlOworICAgIGVsc2UKKyAgICAgICAgcmVzdWx0ID0gUHlfRmFsc2U7CisgICAgUHlfSU5DUkVGKHJlc3VsdCk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogLyogV2UgZGVmaW5lIGJvb2xfbmV3IHRvIGFsd2F5cyByZXR1cm4gZWl0aGVyIFB5X1RydWUgb3IgUHlfRmFsc2UgKi8KQEAgLTUyLDE2ICs1MiwxNiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGJvb2xfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCXN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsieCIsIDB9OwotCVB5T2JqZWN0ICp4ID0gUHlfRmFsc2U7Ci0JbG9uZyBvazsKKyAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7IngiLCAwfTsKKyAgICBQeU9iamVjdCAqeCA9IFB5X0ZhbHNlOworICAgIGxvbmcgb2s7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAifE86Ym9vbCIsIGt3bGlzdCwgJngpKQotCQlyZXR1cm4gTlVMTDsKLQlvayA9IFB5T2JqZWN0X0lzVHJ1ZSh4KTsKLQlpZiAob2sgPCAwKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKG9rKTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAifE86Ym9vbCIsIGt3bGlzdCwgJngpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBvayA9IFB5T2JqZWN0X0lzVHJ1ZSh4KTsKKyAgICBpZiAob2sgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKG9rKTsKIH0KIAogLyogQXJpdGhtZXRpYyBvcGVyYXRpb25zIHJlZGVmaW5lZCB0byByZXR1cm4gYm9vbCBpZiBib3RoIGFyZ3MgYXJlIGJvb2wuICovCkBAIC02OSwyOCArNjksMjggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBib29sX2FuZChQeU9iamVjdCAqYSwgUHlPYmplY3QgKmIpCiB7Ci0JaWYgKCFQeUJvb2xfQ2hlY2soYSkgfHwgIVB5Qm9vbF9DaGVjayhiKSkKLQkJcmV0dXJuIFB5SW50X1R5cGUudHBfYXNfbnVtYmVyLT5uYl9hbmQoYSwgYik7Ci0JcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygKLQkJKChQeUJvb2xPYmplY3QgKilhKS0+b2JfaXZhbCAmICgoUHlCb29sT2JqZWN0ICopYiktPm9iX2l2YWwpOworICAgIGlmICghUHlCb29sX0NoZWNrKGEpIHx8ICFQeUJvb2xfQ2hlY2soYikpCisgICAgICAgIHJldHVybiBQeUludF9UeXBlLnRwX2FzX251bWJlci0+bmJfYW5kKGEsIGIpOworICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoCisgICAgICAgICgoUHlCb29sT2JqZWN0ICopYSktPm9iX2l2YWwgJiAoKFB5Qm9vbE9iamVjdCAqKWIpLT5vYl9pdmFsKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGJvb2xfb3IoUHlPYmplY3QgKmEsIFB5T2JqZWN0ICpiKQogewotCWlmICghUHlCb29sX0NoZWNrKGEpIHx8ICFQeUJvb2xfQ2hlY2soYikpCi0JCXJldHVybiBQeUludF9UeXBlLnRwX2FzX251bWJlci0+bmJfb3IoYSwgYik7Ci0JcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygKLQkJKChQeUJvb2xPYmplY3QgKilhKS0+b2JfaXZhbCB8ICgoUHlCb29sT2JqZWN0ICopYiktPm9iX2l2YWwpOworICAgIGlmICghUHlCb29sX0NoZWNrKGEpIHx8ICFQeUJvb2xfQ2hlY2soYikpCisgICAgICAgIHJldHVybiBQeUludF9UeXBlLnRwX2FzX251bWJlci0+bmJfb3IoYSwgYik7CisgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygKKyAgICAgICAgKChQeUJvb2xPYmplY3QgKilhKS0+b2JfaXZhbCB8ICgoUHlCb29sT2JqZWN0ICopYiktPm9iX2l2YWwpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYm9vbF94b3IoUHlPYmplY3QgKmEsIFB5T2JqZWN0ICpiKQogewotCWlmICghUHlCb29sX0NoZWNrKGEpIHx8ICFQeUJvb2xfQ2hlY2soYikpCi0JCXJldHVybiBQeUludF9UeXBlLnRwX2FzX251bWJlci0+bmJfeG9yKGEsIGIpOwotCXJldHVybiBQeUJvb2xfRnJvbUxvbmcoCi0JCSgoUHlCb29sT2JqZWN0ICopYSktPm9iX2l2YWwgXiAoKFB5Qm9vbE9iamVjdCAqKWIpLT5vYl9pdmFsKTsKKyAgICBpZiAoIVB5Qm9vbF9DaGVjayhhKSB8fCAhUHlCb29sX0NoZWNrKGIpKQorICAgICAgICByZXR1cm4gUHlJbnRfVHlwZS50cF9hc19udW1iZXItPm5iX3hvcihhLCBiKTsKKyAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKAorICAgICAgICAoKFB5Qm9vbE9iamVjdCAqKWEpLT5vYl9pdmFsIF4gKChQeUJvb2xPYmplY3QgKiliKS0+b2JfaXZhbCk7CiB9CiAKIC8qIERvYyBzdHJpbmcgKi8KQEAgLTEwNSw5OCArMTA1LDk4IEBACiAvKiBBcml0aG1ldGljIG1ldGhvZHMgLS0gb25seSBzbyB3ZSBjYW4gb3ZlcnJpZGUgJiwgfCwgXi4gKi8KIAogc3RhdGljIFB5TnVtYmVyTWV0aG9kcyBib29sX2FzX251bWJlciA9IHsKLQkwLAkJCS8qIG5iX2FkZCAqLwotCTAsCQkJLyogbmJfc3VidHJhY3QgKi8KLQkwLAkJCS8qIG5iX211bHRpcGx5ICovCi0JMCwJCQkvKiBuYl9kaXZpZGUgKi8KLQkwLAkJCS8qIG5iX3JlbWFpbmRlciAqLwotCTAsCQkJLyogbmJfZGl2bW9kICovCi0JMCwJCQkvKiBuYl9wb3dlciAqLwotCTAsCQkJLyogbmJfbmVnYXRpdmUgKi8KLQkwLAkJCS8qIG5iX3Bvc2l0aXZlICovCi0JMCwJCQkvKiBuYl9hYnNvbHV0ZSAqLwotCTAsCQkJLyogbmJfbm9uemVybyAqLwotCTAsCQkJLyogbmJfaW52ZXJ0ICovCi0JMCwJCQkvKiBuYl9sc2hpZnQgKi8KLQkwLAkJCS8qIG5iX3JzaGlmdCAqLwotCWJvb2xfYW5kLAkJLyogbmJfYW5kICovCi0JYm9vbF94b3IsCQkvKiBuYl94b3IgKi8KLQlib29sX29yLAkJLyogbmJfb3IgKi8KLQkwLAkJCS8qIG5iX2NvZXJjZSAqLwotCTAsCQkJLyogbmJfaW50ICovCi0JMCwJCQkvKiBuYl9sb25nICovCi0JMCwJCQkvKiBuYl9mbG9hdCAqLwotCTAsCQkJLyogbmJfb2N0ICovCi0JMCwJCSAJLyogbmJfaGV4ICovCi0JMCwJCQkvKiBuYl9pbnBsYWNlX2FkZCAqLwotCTAsCQkJLyogbmJfaW5wbGFjZV9zdWJ0cmFjdCAqLwotCTAsCQkJLyogbmJfaW5wbGFjZV9tdWx0aXBseSAqLwotCTAsCQkJLyogbmJfaW5wbGFjZV9kaXZpZGUgKi8KLQkwLAkJCS8qIG5iX2lucGxhY2VfcmVtYWluZGVyICovCi0JMCwJCQkvKiBuYl9pbnBsYWNlX3Bvd2VyICovCi0JMCwJCQkvKiBuYl9pbnBsYWNlX2xzaGlmdCAqLwotCTAsCQkJLyogbmJfaW5wbGFjZV9yc2hpZnQgKi8KLQkwLAkJCS8qIG5iX2lucGxhY2VfYW5kICovCi0JMCwJCQkvKiBuYl9pbnBsYWNlX3hvciAqLwotCTAsCQkJLyogbmJfaW5wbGFjZV9vciAqLwotCTAsCQkJLyogbmJfZmxvb3JfZGl2aWRlICovCi0JMCwJCQkvKiBuYl90cnVlX2RpdmlkZSAqLwotCTAsCQkJLyogbmJfaW5wbGFjZV9mbG9vcl9kaXZpZGUgKi8KLQkwLAkJCS8qIG5iX2lucGxhY2VfdHJ1ZV9kaXZpZGUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfYWRkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX3N1YnRyYWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX211bHRpcGx5ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2RpdmlkZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9yZW1haW5kZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfZGl2bW9kICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX3Bvd2VyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX25lZ2F0aXZlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX3Bvc2l0aXZlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2Fic29sdXRlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX25vbnplcm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfaW52ZXJ0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2xzaGlmdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9yc2hpZnQgKi8KKyAgICBib29sX2FuZCwgICAgICAgICAgICAgICAgICAgLyogbmJfYW5kICovCisgICAgYm9vbF94b3IsICAgICAgICAgICAgICAgICAgIC8qIG5iX3hvciAqLworICAgIGJvb2xfb3IsICAgICAgICAgICAgICAgICAgICAvKiBuYl9vciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9jb2VyY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2xvbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfZmxvYXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfb2N0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2hleCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9pbnBsYWNlX2FkZCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9pbnBsYWNlX3N1YnRyYWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2lucGxhY2VfbXVsdGlwbHkgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfaW5wbGFjZV9kaXZpZGUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfaW5wbGFjZV9yZW1haW5kZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfaW5wbGFjZV9wb3dlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9pbnBsYWNlX2xzaGlmdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9pbnBsYWNlX3JzaGlmdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9pbnBsYWNlX2FuZCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9pbnBsYWNlX3hvciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9pbnBsYWNlX29yICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2Zsb29yX2RpdmlkZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl90cnVlX2RpdmlkZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9pbnBsYWNlX2Zsb29yX2RpdmlkZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9pbnBsYWNlX3RydWVfZGl2aWRlICovCiB9OwogCiAvKiBUaGUgdHlwZSBvYmplY3QgZm9yIGJvb2wuICBOb3RlIHRoYXQgdGhpcyBjYW5ub3QgYmUgc3ViY2xhc3NlZCEgKi8KIAogUHlUeXBlT2JqZWN0IFB5Qm9vbF9UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCi0JImJvb2wiLAotCXNpemVvZihQeUludE9iamVjdCksCi0JMCwKLQkwLAkJCQkJLyogdHBfZGVhbGxvYyAqLwotCShwcmludGZ1bmMpYm9vbF9wcmludCwJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfY29tcGFyZSAqLwotCShyZXByZnVuYylib29sX3JlcHIsCQkJLyogdHBfcmVwciAqLwotCSZib29sX2FzX251bWJlciwJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCQkvKiB0cF9oYXNoICovCi0gICAgICAgIDAsCQkJCQkvKiB0cF9jYWxsICovCi0gICAgICAgIChyZXByZnVuYylib29sX3JlcHIsCQkJLyogdHBfc3RyICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfQ0hFQ0tUWVBFUywgLyogdHBfZmxhZ3MgKi8KLQlib29sX2RvYywJCQkJLyogdHBfZG9jICovCi0JMCwJCQkJCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkJLyogdHBfaXRlcm5leHQgKi8KLQkwLAkJCQkJLyogdHBfbWV0aG9kcyAqLwotCTAsCQkJCQkvKiB0cF9tZW1iZXJzICovCi0JMCwJCQkJCS8qIHRwX2dldHNldCAqLwotCSZQeUludF9UeXBlLAkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJCS8qIHRwX2RpY3QgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2luaXQgKi8KLQkwLAkJCQkJLyogdHBfYWxsb2MgKi8KLQlib29sX25ldywJCQkJLyogdHBfbmV3ICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKKyAgICAiYm9vbCIsCisgICAgc2l6ZW9mKFB5SW50T2JqZWN0KSwKKyAgICAwLAorICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIChwcmludGZ1bmMpYm9vbF9wcmludCwgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAocmVwcmZ1bmMpYm9vbF9yZXByLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAmYm9vbF9hc19udW1iZXIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAocmVwcmZ1bmMpYm9vbF9yZXByLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0NIRUNLVFlQRVMsIC8qIHRwX2ZsYWdzICovCisgICAgYm9vbF9kb2MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgJlB5SW50X1R5cGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBib29sX25ldywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLwogfTsKIAogLyogVGhlIG9iamVjdHMgcmVwcmVzZW50aW5nIGJvb2wgdmFsdWVzIEZhbHNlIGFuZCBUcnVlICovCiAKIC8qIE5hbWVkIFplcm8gZm9yIGxpbmstbGV2ZWwgY29tcGF0aWJpbGl0eSAqLwogUHlJbnRPYmplY3QgX1B5X1plcm9TdHJ1Y3QgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKCZQeUJvb2xfVHlwZSkKLQkwCisgICAgUHlPYmplY3RfSEVBRF9JTklUKCZQeUJvb2xfVHlwZSkKKyAgICAwCiB9OwogCiBQeUludE9iamVjdCBfUHlfVHJ1ZVN0cnVjdCA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoJlB5Qm9vbF9UeXBlKQotCTEKKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoJlB5Qm9vbF9UeXBlKQorICAgIDEKIH07CmRpZmYgLS1naXQgYS9PYmplY3RzL2J1ZmZlcm9iamVjdC5jIGIvT2JqZWN0cy9idWZmZXJvYmplY3QuYwppbmRleCA1YjA4ZTFlLi4wZjdlNzYzIDEwMDY0NAotLS0gYS9PYmplY3RzL2J1ZmZlcm9iamVjdC5jCisrKyBiL09iamVjdHMvYnVmZmVyb2JqZWN0LmMKQEAgLTUsMTMgKzUsMTMgQEAKIAogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCVB5T2JqZWN0ICpiX2Jhc2U7Ci0Jdm9pZCAqYl9wdHI7Ci0JUHlfc3NpemVfdCBiX3NpemU7Ci0JUHlfc3NpemVfdCBiX29mZnNldDsKLQlpbnQgYl9yZWFkb25seTsKLQlsb25nIGJfaGFzaDsKKyAgICBQeU9iamVjdF9IRUFECisgICAgUHlPYmplY3QgKmJfYmFzZTsKKyAgICB2b2lkICpiX3B0cjsKKyAgICBQeV9zc2l6ZV90IGJfc2l6ZTsKKyAgICBQeV9zc2l6ZV90IGJfb2Zmc2V0OworICAgIGludCBiX3JlYWRvbmx5OworICAgIGxvbmcgYl9oYXNoOwogfSBQeUJ1ZmZlck9iamVjdDsKIAogCkBAIC0yNCwyMDcgKzI0LDIwNyBAQAogCiBzdGF0aWMgaW50CiBnZXRfYnVmKFB5QnVmZmVyT2JqZWN0ICpzZWxmLCB2b2lkICoqcHRyLCBQeV9zc2l6ZV90ICpzaXplLAotCWVudW0gYnVmZmVyX3QgYnVmZmVyX3R5cGUpCisgICAgZW51bSBidWZmZXJfdCBidWZmZXJfdHlwZSkKIHsKLQlpZiAoc2VsZi0+Yl9iYXNlID09IE5VTEwpIHsKLQkJYXNzZXJ0IChwdHIgIT0gTlVMTCk7Ci0JCSpwdHIgPSBzZWxmLT5iX3B0cjsKLQkJKnNpemUgPSBzZWxmLT5iX3NpemU7Ci0JfQotCWVsc2UgewotCQlQeV9zc2l6ZV90IGNvdW50LCBvZmZzZXQ7Ci0JCXJlYWRidWZmZXJwcm9jIHByb2MgPSAwOwotCQlQeUJ1ZmZlclByb2NzICpicCA9IHNlbGYtPmJfYmFzZS0+b2JfdHlwZS0+dHBfYXNfYnVmZmVyOwotCQlpZiAoKCpicC0+YmZfZ2V0c2VnY291bnQpKHNlbGYtPmJfYmFzZSwgTlVMTCkgIT0gMSkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkic2luZ2xlLXNlZ21lbnQgYnVmZmVyIG9iamVjdCBleHBlY3RlZCIpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJaWYgKChidWZmZXJfdHlwZSA9PSBSRUFEX0JVRkZFUikgfHwKLQkJCSgoYnVmZmVyX3R5cGUgPT0gQU5ZX0JVRkZFUikgJiYgc2VsZi0+Yl9yZWFkb25seSkpCi0JCSAgICBwcm9jID0gYnAtPmJmX2dldHJlYWRidWZmZXI7Ci0JCWVsc2UgaWYgKChidWZmZXJfdHlwZSA9PSBXUklURV9CVUZGRVIpIHx8Ci0JCQkoYnVmZmVyX3R5cGUgPT0gQU5ZX0JVRkZFUikpCi0gICAgCQkgICAgcHJvYyA9IChyZWFkYnVmZmVycHJvYylicC0+YmZfZ2V0d3JpdGVidWZmZXI7Ci0JCWVsc2UgaWYgKGJ1ZmZlcl90eXBlID09IENIQVJfQlVGRkVSKSB7Ci0JCSAgICBpZiAoIVB5VHlwZV9IYXNGZWF0dXJlKHNlbGYtPm9iX3R5cGUsCi0JCQkJUHlfVFBGTEFHU19IQVZFX0dFVENIQVJCVUZGRVIpKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJQeV9UUEZMQUdTX0hBVkVfR0VUQ0hBUkJVRkZFUiBuZWVkZWQiKTsKLQkJCXJldHVybiAwOwotCQkgICAgfQotCQkgICAgcHJvYyA9IChyZWFkYnVmZmVycHJvYylicC0+YmZfZ2V0Y2hhcmJ1ZmZlcjsKLQkJfQotCQlpZiAoIXByb2MpIHsKLQkJICAgIGNoYXIgKmJ1ZmZlcl90eXBlX25hbWU7Ci0JCSAgICBzd2l0Y2ggKGJ1ZmZlcl90eXBlKSB7Ci0JCQljYXNlIFJFQURfQlVGRkVSOgotCQkJICAgIGJ1ZmZlcl90eXBlX25hbWUgPSAicmVhZCI7Ci0JCQkgICAgYnJlYWs7Ci0JCQljYXNlIFdSSVRFX0JVRkZFUjoKLQkJCSAgICBidWZmZXJfdHlwZV9uYW1lID0gIndyaXRlIjsKLQkJCSAgICBicmVhazsKLQkJCWNhc2UgQ0hBUl9CVUZGRVI6Ci0JCQkgICAgYnVmZmVyX3R5cGVfbmFtZSA9ICJjaGFyIjsKLQkJCSAgICBicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkgICAgYnVmZmVyX3R5cGVfbmFtZSA9ICJubyI7Ci0JCQkgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCSAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJICAgICIlcyBidWZmZXIgdHlwZSBub3QgYXZhaWxhYmxlIiwKLQkJCSAgICBidWZmZXJfdHlwZV9uYW1lKTsKLQkJICAgIHJldHVybiAwOwotCQl9Ci0JCWlmICgoY291bnQgPSAoKnByb2MpKHNlbGYtPmJfYmFzZSwgMCwgcHRyKSkgPCAwKQotCQkJcmV0dXJuIDA7Ci0JCS8qIGFwcGx5IGNvbnN0cmFpbnRzIHRvIHRoZSBzdGFydC9lbmQgKi8KLQkJaWYgKHNlbGYtPmJfb2Zmc2V0ID4gY291bnQpCi0JCQlvZmZzZXQgPSBjb3VudDsKLQkJZWxzZQotCQkJb2Zmc2V0ID0gc2VsZi0+Yl9vZmZzZXQ7Ci0JCSooY2hhciAqKilwdHIgPSAqKGNoYXIgKiopcHRyICsgb2Zmc2V0OwotCQlpZiAoc2VsZi0+Yl9zaXplID09IFB5X0VORF9PRl9CVUZGRVIpCi0JCQkqc2l6ZSA9IGNvdW50OwotCQllbHNlCi0JCQkqc2l6ZSA9IHNlbGYtPmJfc2l6ZTsKLQkJaWYgKG9mZnNldCArICpzaXplID4gY291bnQpCi0JCQkqc2l6ZSA9IGNvdW50IC0gb2Zmc2V0OwotCX0KLQlyZXR1cm4gMTsKKyAgICBpZiAoc2VsZi0+Yl9iYXNlID09IE5VTEwpIHsKKyAgICAgICAgYXNzZXJ0IChwdHIgIT0gTlVMTCk7CisgICAgICAgICpwdHIgPSBzZWxmLT5iX3B0cjsKKyAgICAgICAgKnNpemUgPSBzZWxmLT5iX3NpemU7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeV9zc2l6ZV90IGNvdW50LCBvZmZzZXQ7CisgICAgICAgIHJlYWRidWZmZXJwcm9jIHByb2MgPSAwOworICAgICAgICBQeUJ1ZmZlclByb2NzICpicCA9IHNlbGYtPmJfYmFzZS0+b2JfdHlwZS0+dHBfYXNfYnVmZmVyOworICAgICAgICBpZiAoKCpicC0+YmZfZ2V0c2VnY291bnQpKHNlbGYtPmJfYmFzZSwgTlVMTCkgIT0gMSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAic2luZ2xlLXNlZ21lbnQgYnVmZmVyIG9iamVjdCBleHBlY3RlZCIpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChidWZmZXJfdHlwZSA9PSBSRUFEX0JVRkZFUikgfHwKKyAgICAgICAgICAgICgoYnVmZmVyX3R5cGUgPT0gQU5ZX0JVRkZFUikgJiYgc2VsZi0+Yl9yZWFkb25seSkpCisgICAgICAgICAgICBwcm9jID0gYnAtPmJmX2dldHJlYWRidWZmZXI7CisgICAgICAgIGVsc2UgaWYgKChidWZmZXJfdHlwZSA9PSBXUklURV9CVUZGRVIpIHx8CisgICAgICAgICAgICAoYnVmZmVyX3R5cGUgPT0gQU5ZX0JVRkZFUikpCisgICAgICAgICAgICBwcm9jID0gKHJlYWRidWZmZXJwcm9jKWJwLT5iZl9nZXR3cml0ZWJ1ZmZlcjsKKyAgICAgICAgZWxzZSBpZiAoYnVmZmVyX3R5cGUgPT0gQ0hBUl9CVUZGRVIpIHsKKyAgICAgICAgICAgIGlmICghUHlUeXBlX0hhc0ZlYXR1cmUoc2VsZi0+b2JfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5X1RQRkxBR1NfSEFWRV9HRVRDSEFSQlVGRkVSKSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAiUHlfVFBGTEFHU19IQVZFX0dFVENIQVJCVUZGRVIgbmVlZGVkIik7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByb2MgPSAocmVhZGJ1ZmZlcnByb2MpYnAtPmJmX2dldGNoYXJidWZmZXI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFwcm9jKSB7CisgICAgICAgICAgICBjaGFyICpidWZmZXJfdHlwZV9uYW1lOworICAgICAgICAgICAgc3dpdGNoIChidWZmZXJfdHlwZSkgeworICAgICAgICAgICAgY2FzZSBSRUFEX0JVRkZFUjoKKyAgICAgICAgICAgICAgICBidWZmZXJfdHlwZV9uYW1lID0gInJlYWQiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBXUklURV9CVUZGRVI6CisgICAgICAgICAgICAgICAgYnVmZmVyX3R5cGVfbmFtZSA9ICJ3cml0ZSI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENIQVJfQlVGRkVSOgorICAgICAgICAgICAgICAgIGJ1ZmZlcl90eXBlX25hbWUgPSAiY2hhciI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJ1ZmZlcl90eXBlX25hbWUgPSAibm8iOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAiJXMgYnVmZmVyIHR5cGUgbm90IGF2YWlsYWJsZSIsCisgICAgICAgICAgICAgICAgYnVmZmVyX3R5cGVfbmFtZSk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGNvdW50ID0gKCpwcm9jKShzZWxmLT5iX2Jhc2UsIDAsIHB0cikpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAvKiBhcHBseSBjb25zdHJhaW50cyB0byB0aGUgc3RhcnQvZW5kICovCisgICAgICAgIGlmIChzZWxmLT5iX29mZnNldCA+IGNvdW50KQorICAgICAgICAgICAgb2Zmc2V0ID0gY291bnQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG9mZnNldCA9IHNlbGYtPmJfb2Zmc2V0OworICAgICAgICAqKGNoYXIgKiopcHRyID0gKihjaGFyICoqKXB0ciArIG9mZnNldDsKKyAgICAgICAgaWYgKHNlbGYtPmJfc2l6ZSA9PSBQeV9FTkRfT0ZfQlVGRkVSKQorICAgICAgICAgICAgKnNpemUgPSBjb3VudDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgKnNpemUgPSBzZWxmLT5iX3NpemU7CisgICAgICAgIGlmIChvZmZzZXQgKyAqc2l6ZSA+IGNvdW50KQorICAgICAgICAgICAgKnNpemUgPSBjb3VudCAtIG9mZnNldDsKKyAgICB9CisgICAgcmV0dXJuIDE7CiB9CiAKIAogc3RhdGljIFB5T2JqZWN0ICoKIGJ1ZmZlcl9mcm9tX21lbW9yeShQeU9iamVjdCAqYmFzZSwgUHlfc3NpemVfdCBzaXplLCBQeV9zc2l6ZV90IG9mZnNldCwgdm9pZCAqcHRyLAotCQkgICBpbnQgcmVhZG9ubHkpCisgICAgICAgICAgICAgICAgICAgaW50IHJlYWRvbmx5KQogewotCVB5QnVmZmVyT2JqZWN0ICogYjsKKyAgICBQeUJ1ZmZlck9iamVjdCAqIGI7CiAKLQlpZiAoc2l6ZSA8IDAgJiYgc2l6ZSAhPSBQeV9FTkRfT0ZfQlVGRkVSKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJzaXplIG11c3QgYmUgemVybyBvciBwb3NpdGl2ZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKG9mZnNldCA8IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJIm9mZnNldCBtdXN0IGJlIHplcm8gb3IgcG9zaXRpdmUiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChzaXplIDwgMCAmJiBzaXplICE9IFB5X0VORF9PRl9CVUZGRVIpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAic2l6ZSBtdXN0IGJlIHplcm8gb3IgcG9zaXRpdmUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChvZmZzZXQgPCAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIm9mZnNldCBtdXN0IGJlIHplcm8gb3IgcG9zaXRpdmUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JYiA9IFB5T2JqZWN0X05FVyhQeUJ1ZmZlck9iamVjdCwgJlB5QnVmZmVyX1R5cGUpOwotCWlmICggYiA9PSBOVUxMICkKLQkJcmV0dXJuIE5VTEw7CisgICAgYiA9IFB5T2JqZWN0X05FVyhQeUJ1ZmZlck9iamVjdCwgJlB5QnVmZmVyX1R5cGUpOworICAgIGlmICggYiA9PSBOVUxMICkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlQeV9YSU5DUkVGKGJhc2UpOwotCWItPmJfYmFzZSA9IGJhc2U7Ci0JYi0+Yl9wdHIgPSBwdHI7Ci0JYi0+Yl9zaXplID0gc2l6ZTsKLQliLT5iX29mZnNldCA9IG9mZnNldDsKLQliLT5iX3JlYWRvbmx5ID0gcmVhZG9ubHk7Ci0JYi0+Yl9oYXNoID0gLTE7CisgICAgUHlfWElOQ1JFRihiYXNlKTsKKyAgICBiLT5iX2Jhc2UgPSBiYXNlOworICAgIGItPmJfcHRyID0gcHRyOworICAgIGItPmJfc2l6ZSA9IHNpemU7CisgICAgYi0+Yl9vZmZzZXQgPSBvZmZzZXQ7CisgICAgYi0+Yl9yZWFkb25seSA9IHJlYWRvbmx5OworICAgIGItPmJfaGFzaCA9IC0xOwogCi0JcmV0dXJuIChQeU9iamVjdCAqKSBiOworICAgIHJldHVybiAoUHlPYmplY3QgKikgYjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGJ1ZmZlcl9mcm9tX29iamVjdChQeU9iamVjdCAqYmFzZSwgUHlfc3NpemVfdCBzaXplLCBQeV9zc2l6ZV90IG9mZnNldCwgaW50IHJlYWRvbmx5KQogewotCWlmIChvZmZzZXQgPCAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJvZmZzZXQgbXVzdCBiZSB6ZXJvIG9yIHBvc2l0aXZlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoIFB5QnVmZmVyX0NoZWNrKGJhc2UpICYmICgoKFB5QnVmZmVyT2JqZWN0ICopYmFzZSktPmJfYmFzZSkgKSB7Ci0JCS8qIGFub3RoZXIgYnVmZmVyLCByZWZlciB0byB0aGUgYmFzZSBvYmplY3QgKi8KLQkJUHlCdWZmZXJPYmplY3QgKmIgPSAoUHlCdWZmZXJPYmplY3QgKiliYXNlOwotCQlpZiAoYi0+Yl9zaXplICE9IFB5X0VORF9PRl9CVUZGRVIpIHsKLQkJCVB5X3NzaXplX3QgYmFzZV9zaXplID0gYi0+Yl9zaXplIC0gb2Zmc2V0OwotCQkJaWYgKGJhc2Vfc2l6ZSA8IDApCi0JCQkJYmFzZV9zaXplID0gMDsKLQkJCWlmIChzaXplID09IFB5X0VORF9PRl9CVUZGRVIgfHwgc2l6ZSA+IGJhc2Vfc2l6ZSkKLQkJCQlzaXplID0gYmFzZV9zaXplOwotCQl9Ci0JCW9mZnNldCArPSBiLT5iX29mZnNldDsKLQkJYmFzZSA9IGItPmJfYmFzZTsKLQl9Ci0JcmV0dXJuIGJ1ZmZlcl9mcm9tX21lbW9yeShiYXNlLCBzaXplLCBvZmZzZXQsIE5VTEwsIHJlYWRvbmx5KTsKKyAgICBpZiAob2Zmc2V0IDwgMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJvZmZzZXQgbXVzdCBiZSB6ZXJvIG9yIHBvc2l0aXZlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoIFB5QnVmZmVyX0NoZWNrKGJhc2UpICYmICgoKFB5QnVmZmVyT2JqZWN0ICopYmFzZSktPmJfYmFzZSkgKSB7CisgICAgICAgIC8qIGFub3RoZXIgYnVmZmVyLCByZWZlciB0byB0aGUgYmFzZSBvYmplY3QgKi8KKyAgICAgICAgUHlCdWZmZXJPYmplY3QgKmIgPSAoUHlCdWZmZXJPYmplY3QgKiliYXNlOworICAgICAgICBpZiAoYi0+Yl9zaXplICE9IFB5X0VORF9PRl9CVUZGRVIpIHsKKyAgICAgICAgICAgIFB5X3NzaXplX3QgYmFzZV9zaXplID0gYi0+Yl9zaXplIC0gb2Zmc2V0OworICAgICAgICAgICAgaWYgKGJhc2Vfc2l6ZSA8IDApCisgICAgICAgICAgICAgICAgYmFzZV9zaXplID0gMDsKKyAgICAgICAgICAgIGlmIChzaXplID09IFB5X0VORF9PRl9CVUZGRVIgfHwgc2l6ZSA+IGJhc2Vfc2l6ZSkKKyAgICAgICAgICAgICAgICBzaXplID0gYmFzZV9zaXplOworICAgICAgICB9CisgICAgICAgIG9mZnNldCArPSBiLT5iX29mZnNldDsKKyAgICAgICAgYmFzZSA9IGItPmJfYmFzZTsKKyAgICB9CisgICAgcmV0dXJuIGJ1ZmZlcl9mcm9tX21lbW9yeShiYXNlLCBzaXplLCBvZmZzZXQsIE5VTEwsIHJlYWRvbmx5KTsKIH0KIAogCiBQeU9iamVjdCAqCiBQeUJ1ZmZlcl9Gcm9tT2JqZWN0KFB5T2JqZWN0ICpiYXNlLCBQeV9zc2l6ZV90IG9mZnNldCwgUHlfc3NpemVfdCBzaXplKQogewotCVB5QnVmZmVyUHJvY3MgKnBiID0gYmFzZS0+b2JfdHlwZS0+dHBfYXNfYnVmZmVyOworICAgIFB5QnVmZmVyUHJvY3MgKnBiID0gYmFzZS0+b2JfdHlwZS0+dHBfYXNfYnVmZmVyOwogCi0JaWYgKCBwYiA9PSBOVUxMIHx8Ci0JICAgICBwYi0+YmZfZ2V0cmVhZGJ1ZmZlciA9PSBOVUxMIHx8Ci0JICAgICBwYi0+YmZfZ2V0c2VnY291bnQgPT0gTlVMTCApCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYnVmZmVyIG9iamVjdCBleHBlY3RlZCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKCBwYiA9PSBOVUxMIHx8CisgICAgICAgICBwYi0+YmZfZ2V0cmVhZGJ1ZmZlciA9PSBOVUxMIHx8CisgICAgICAgICBwYi0+YmZfZ2V0c2VnY291bnQgPT0gTlVMTCApCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYnVmZmVyIG9iamVjdCBleHBlY3RlZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlyZXR1cm4gYnVmZmVyX2Zyb21fb2JqZWN0KGJhc2UsIHNpemUsIG9mZnNldCwgMSk7CisgICAgcmV0dXJuIGJ1ZmZlcl9mcm9tX29iamVjdChiYXNlLCBzaXplLCBvZmZzZXQsIDEpOwogfQogCiBQeU9iamVjdCAqCiBQeUJ1ZmZlcl9Gcm9tUmVhZFdyaXRlT2JqZWN0KFB5T2JqZWN0ICpiYXNlLCBQeV9zc2l6ZV90IG9mZnNldCwgUHlfc3NpemVfdCBzaXplKQogewotCVB5QnVmZmVyUHJvY3MgKnBiID0gYmFzZS0+b2JfdHlwZS0+dHBfYXNfYnVmZmVyOworICAgIFB5QnVmZmVyUHJvY3MgKnBiID0gYmFzZS0+b2JfdHlwZS0+dHBfYXNfYnVmZmVyOwogCi0JaWYgKCBwYiA9PSBOVUxMIHx8Ci0JICAgICBwYi0+YmZfZ2V0d3JpdGVidWZmZXIgPT0gTlVMTCB8fAotCSAgICAgcGItPmJmX2dldHNlZ2NvdW50ID09IE5VTEwgKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImJ1ZmZlciBvYmplY3QgZXhwZWN0ZWQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICggcGIgPT0gTlVMTCB8fAorICAgICAgICAgcGItPmJmX2dldHdyaXRlYnVmZmVyID09IE5VTEwgfHwKKyAgICAgICAgIHBiLT5iZl9nZXRzZWdjb3VudCA9PSBOVUxMICkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJidWZmZXIgb2JqZWN0IGV4cGVjdGVkIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXJldHVybiBidWZmZXJfZnJvbV9vYmplY3QoYmFzZSwgc2l6ZSwgIG9mZnNldCwgMCk7CisgICAgcmV0dXJuIGJ1ZmZlcl9mcm9tX29iamVjdChiYXNlLCBzaXplLCAgb2Zmc2V0LCAwKTsKIH0KIAogUHlPYmplY3QgKgogUHlCdWZmZXJfRnJvbU1lbW9yeSh2b2lkICpwdHIsIFB5X3NzaXplX3Qgc2l6ZSkKIHsKLQlyZXR1cm4gYnVmZmVyX2Zyb21fbWVtb3J5KE5VTEwsIHNpemUsIDAsIHB0ciwgMSk7CisgICAgcmV0dXJuIGJ1ZmZlcl9mcm9tX21lbW9yeShOVUxMLCBzaXplLCAwLCBwdHIsIDEpOwogfQogCiBQeU9iamVjdCAqCiBQeUJ1ZmZlcl9Gcm9tUmVhZFdyaXRlTWVtb3J5KHZvaWQgKnB0ciwgUHlfc3NpemVfdCBzaXplKQogewotCXJldHVybiBidWZmZXJfZnJvbV9tZW1vcnkoTlVMTCwgc2l6ZSwgMCwgcHRyLCAwKTsKKyAgICByZXR1cm4gYnVmZmVyX2Zyb21fbWVtb3J5KE5VTEwsIHNpemUsIDAsIHB0ciwgMCk7CiB9CiAKIFB5T2JqZWN0ICoKIFB5QnVmZmVyX05ldyhQeV9zc2l6ZV90IHNpemUpCiB7Ci0JUHlPYmplY3QgKm87Ci0JUHlCdWZmZXJPYmplY3QgKiBiOworICAgIFB5T2JqZWN0ICpvOworICAgIFB5QnVmZmVyT2JqZWN0ICogYjsKIAotCWlmIChzaXplIDwgMCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkic2l6ZSBtdXN0IGJlIHplcm8gb3IgcG9zaXRpdmUiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChzaXplb2YoKmIpID4gUFlfU1NJWkVfVF9NQVggLSBzaXplKSB7Ci0JCS8qIHVubGlrZWx5ICovCi0JCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCX0KLQkvKiBJbmxpbmUgUHlPYmplY3RfTmV3ICovCi0JbyA9IChQeU9iamVjdCAqKVB5T2JqZWN0X01BTExPQyhzaXplb2YoKmIpICsgc2l6ZSk7Ci0JaWYgKCBvID09IE5VTEwgKQotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQliID0gKFB5QnVmZmVyT2JqZWN0ICopIFB5T2JqZWN0X0lOSVQobywgJlB5QnVmZmVyX1R5cGUpOworICAgIGlmIChzaXplIDwgMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJzaXplIG11c3QgYmUgemVybyBvciBwb3NpdGl2ZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKHNpemVvZigqYikgPiBQWV9TU0laRV9UX01BWCAtIHNpemUpIHsKKyAgICAgICAgLyogdW5saWtlbHkgKi8KKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgfQorICAgIC8qIElubGluZSBQeU9iamVjdF9OZXcgKi8KKyAgICBvID0gKFB5T2JqZWN0ICopUHlPYmplY3RfTUFMTE9DKHNpemVvZigqYikgKyBzaXplKTsKKyAgICBpZiAoIG8gPT0gTlVMTCApCisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIGIgPSAoUHlCdWZmZXJPYmplY3QgKikgUHlPYmplY3RfSU5JVChvLCAmUHlCdWZmZXJfVHlwZSk7CiAKLQliLT5iX2Jhc2UgPSBOVUxMOwotCWItPmJfcHRyID0gKHZvaWQgKikoYiArIDEpOwotCWItPmJfc2l6ZSA9IHNpemU7Ci0JYi0+Yl9vZmZzZXQgPSAwOwotCWItPmJfcmVhZG9ubHkgPSAwOwotCWItPmJfaGFzaCA9IC0xOworICAgIGItPmJfYmFzZSA9IE5VTEw7CisgICAgYi0+Yl9wdHIgPSAodm9pZCAqKShiICsgMSk7CisgICAgYi0+Yl9zaXplID0gc2l6ZTsKKyAgICBiLT5iX29mZnNldCA9IDA7CisgICAgYi0+Yl9yZWFkb25seSA9IDA7CisgICAgYi0+Yl9oYXNoID0gLTE7CiAKLQlyZXR1cm4gbzsKKyAgICByZXR1cm4gbzsKIH0KIAogLyogTWV0aG9kcyAqLwpAQCAtMjMyLDE5ICsyMzIsMTkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBidWZmZXJfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprdykKIHsKLQlQeU9iamVjdCAqb2I7Ci0JUHlfc3NpemVfdCBvZmZzZXQgPSAwOwotCVB5X3NzaXplX3Qgc2l6ZSA9IFB5X0VORF9PRl9CVUZGRVI7CisgICAgUHlPYmplY3QgKm9iOworICAgIFB5X3NzaXplX3Qgb2Zmc2V0ID0gMDsKKyAgICBQeV9zc2l6ZV90IHNpemUgPSBQeV9FTkRfT0ZfQlVGRkVSOwogCi0JaWYgKFB5RXJyX1dhcm5QeTNrKCJidWZmZXIoKSBub3Qgc3VwcG9ydGVkIGluIDMueCIsIDEpIDwgMCkKLQkJcmV0dXJuIE5VTEw7Ci0JCi0JaWYgKCFfUHlBcmdfTm9LZXl3b3JkcygiYnVmZmVyKCkiLCBrdykpCi0JCXJldHVybiBOVUxMOworICAgIGlmIChQeUVycl9XYXJuUHkzaygiYnVmZmVyKCkgbm90IHN1cHBvcnRlZCBpbiAzLngiLCAxKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfG5uOmJ1ZmZlciIsICZvYiwgJm9mZnNldCwgJnNpemUpKQotCSAgICByZXR1cm4gTlVMTDsKLQlyZXR1cm4gUHlCdWZmZXJfRnJvbU9iamVjdChvYiwgb2Zmc2V0LCBzaXplKTsKKyAgICBpZiAoIV9QeUFyZ19Ob0tleXdvcmRzKCJidWZmZXIoKSIsIGt3KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98bm46YnVmZmVyIiwgJm9iLCAmb2Zmc2V0LCAmc2l6ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeUJ1ZmZlcl9Gcm9tT2JqZWN0KG9iLCBvZmZzZXQsIHNpemUpOwogfQogCiBQeURvY19TVFJWQVIoYnVmZmVyX2RvYywKQEAgLTI1OSw5OSArMjU5LDk5IEBACiBzdGF0aWMgdm9pZAogYnVmZmVyX2RlYWxsb2MoUHlCdWZmZXJPYmplY3QgKnNlbGYpCiB7Ci0JUHlfWERFQ1JFRihzZWxmLT5iX2Jhc2UpOwotCVB5T2JqZWN0X0RFTChzZWxmKTsKKyAgICBQeV9YREVDUkVGKHNlbGYtPmJfYmFzZSk7CisgICAgUHlPYmplY3RfREVMKHNlbGYpOwogfQogCiBzdGF0aWMgaW50CiBidWZmZXJfY29tcGFyZShQeUJ1ZmZlck9iamVjdCAqc2VsZiwgUHlCdWZmZXJPYmplY3QgKm90aGVyKQogewotCXZvaWQgKnAxLCAqcDI7Ci0JUHlfc3NpemVfdCBsZW5fc2VsZiwgbGVuX290aGVyLCBtaW5fbGVuOwotCWludCBjbXA7CisgICAgdm9pZCAqcDEsICpwMjsKKyAgICBQeV9zc2l6ZV90IGxlbl9zZWxmLCBsZW5fb3RoZXIsIG1pbl9sZW47CisgICAgaW50IGNtcDsKIAotCWlmICghZ2V0X2J1ZihzZWxmLCAmcDEsICZsZW5fc2VsZiwgQU5ZX0JVRkZFUikpCi0JCXJldHVybiAtMTsKLQlpZiAoIWdldF9idWYob3RoZXIsICZwMiwgJmxlbl9vdGhlciwgQU5ZX0JVRkZFUikpCi0JCXJldHVybiAtMTsKLQltaW5fbGVuID0gKGxlbl9zZWxmIDwgbGVuX290aGVyKSA/IGxlbl9zZWxmIDogbGVuX290aGVyOwotCWlmIChtaW5fbGVuID4gMCkgewotCQljbXAgPSBtZW1jbXAocDEsIHAyLCBtaW5fbGVuKTsKLQkJaWYgKGNtcCAhPSAwKQotCQkJcmV0dXJuIGNtcCA8IDAgPyAtMSA6IDE7Ci0JfQotCXJldHVybiAobGVuX3NlbGYgPCBsZW5fb3RoZXIpID8gLTEgOiAobGVuX3NlbGYgPiBsZW5fb3RoZXIpID8gMSA6IDA7CisgICAgaWYgKCFnZXRfYnVmKHNlbGYsICZwMSwgJmxlbl9zZWxmLCBBTllfQlVGRkVSKSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmICghZ2V0X2J1ZihvdGhlciwgJnAyLCAmbGVuX290aGVyLCBBTllfQlVGRkVSKSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIG1pbl9sZW4gPSAobGVuX3NlbGYgPCBsZW5fb3RoZXIpID8gbGVuX3NlbGYgOiBsZW5fb3RoZXI7CisgICAgaWYgKG1pbl9sZW4gPiAwKSB7CisgICAgICAgIGNtcCA9IG1lbWNtcChwMSwgcDIsIG1pbl9sZW4pOworICAgICAgICBpZiAoY21wICE9IDApCisgICAgICAgICAgICByZXR1cm4gY21wIDwgMCA/IC0xIDogMTsKKyAgICB9CisgICAgcmV0dXJuIChsZW5fc2VsZiA8IGxlbl9vdGhlcikgPyAtMSA6IChsZW5fc2VsZiA+IGxlbl9vdGhlcikgPyAxIDogMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGJ1ZmZlcl9yZXByKFB5QnVmZmVyT2JqZWN0ICpzZWxmKQogewotCWNvbnN0IGNoYXIgKnN0YXR1cyA9IHNlbGYtPmJfcmVhZG9ubHkgPyAicmVhZC1vbmx5IiA6ICJyZWFkLXdyaXRlIjsKKyAgICBjb25zdCBjaGFyICpzdGF0dXMgPSBzZWxmLT5iX3JlYWRvbmx5ID8gInJlYWQtb25seSIgOiAicmVhZC13cml0ZSI7CiAKLQlpZiAoIHNlbGYtPmJfYmFzZSA9PSBOVUxMICkKLQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21Gb3JtYXQoIjwlcyBidWZmZXIgcHRyICVwLCBzaXplICV6ZCBhdCAlcD4iLAotCQkJCQkgICBzdGF0dXMsCi0JCQkJCSAgIHNlbGYtPmJfcHRyLAotCQkJCQkgICBzZWxmLT5iX3NpemUsCi0JCQkJCSAgIHNlbGYpOwotCWVsc2UKLQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21Gb3JtYXQoCi0JCQkiPCVzIGJ1ZmZlciBmb3IgJXAsIHNpemUgJXpkLCBvZmZzZXQgJXpkIGF0ICVwPiIsCi0JCQlzdGF0dXMsCi0JCQlzZWxmLT5iX2Jhc2UsCi0JCQlzZWxmLT5iX3NpemUsCi0JCQlzZWxmLT5iX29mZnNldCwKLQkJCXNlbGYpOworICAgIGlmICggc2VsZi0+Yl9iYXNlID09IE5VTEwgKQorICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbUZvcm1hdCgiPCVzIGJ1ZmZlciBwdHIgJXAsIHNpemUgJXpkIGF0ICVwPiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+Yl9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPmJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZik7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbUZvcm1hdCgKKyAgICAgICAgICAgICI8JXMgYnVmZmVyIGZvciAlcCwgc2l6ZSAlemQsIG9mZnNldCAlemQgYXQgJXA+IiwKKyAgICAgICAgICAgIHN0YXR1cywKKyAgICAgICAgICAgIHNlbGYtPmJfYmFzZSwKKyAgICAgICAgICAgIHNlbGYtPmJfc2l6ZSwKKyAgICAgICAgICAgIHNlbGYtPmJfb2Zmc2V0LAorICAgICAgICAgICAgc2VsZik7CiB9CiAKIHN0YXRpYyBsb25nCiBidWZmZXJfaGFzaChQeUJ1ZmZlck9iamVjdCAqc2VsZikKIHsKLQl2b2lkICpwdHI7Ci0JUHlfc3NpemVfdCBzaXplOwotCXJlZ2lzdGVyIFB5X3NzaXplX3QgbGVuOwotCXJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgKnA7Ci0JcmVnaXN0ZXIgbG9uZyB4OworICAgIHZvaWQgKnB0cjsKKyAgICBQeV9zc2l6ZV90IHNpemU7CisgICAgcmVnaXN0ZXIgUHlfc3NpemVfdCBsZW47CisgICAgcmVnaXN0ZXIgdW5zaWduZWQgY2hhciAqcDsKKyAgICByZWdpc3RlciBsb25nIHg7CiAKLQlpZiAoIHNlbGYtPmJfaGFzaCAhPSAtMSApCi0JCXJldHVybiBzZWxmLT5iX2hhc2g7CisgICAgaWYgKCBzZWxmLT5iX2hhc2ggIT0gLTEgKQorICAgICAgICByZXR1cm4gc2VsZi0+Yl9oYXNoOwogCi0JLyogWFhYIHBvdGVudGlhbCBidWdzIGhlcmUsIGEgcmVhZG9ubHkgYnVmZmVyIGRvZXMgbm90IGltcGx5IHRoYXQgdGhlCi0JICogdW5kZXJseWluZyBtZW1vcnkgaXMgaW1tdXRhYmxlLiAgYl9yZWFkb25seSBpcyBhIG5lY2Vzc2FyeSBidXQgbm90Ci0JICogc3VmZmljaWVudCBjb25kaXRpb24gZm9yIGEgYnVmZmVyIHRvIGJlIGhhc2hhYmxlLiAgUGVyaGFwcyBpdCB3b3VsZAotCSAqIGJlIGJldHRlciB0byBvbmx5IGFsbG93IGhhc2hpbmcgaWYgdGhlIHVuZGVybHlpbmcgb2JqZWN0IGlzIGtub3duIHRvCi0JICogYmUgaW1tdXRhYmxlIChlLmcuIFB5U3RyaW5nX0NoZWNrKCkgaXMgdHJ1ZSkuICBBbm90aGVyIGlkZWEgd291bGQKLQkgKiBiZSB0byBjYWxsIHRwX2hhc2ggb24gdGhlIHVuZGVybHlpbmcgb2JqZWN0IGFuZCBzZWUgaWYgaXQgcmFpc2VzCi0JICogYW4gZXJyb3IuICovCi0JaWYgKCAhc2VsZi0+Yl9yZWFkb25seSApCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJ3cml0YWJsZSBidWZmZXJzIGFyZSBub3QgaGFzaGFibGUiKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICAvKiBYWFggcG90ZW50aWFsIGJ1Z3MgaGVyZSwgYSByZWFkb25seSBidWZmZXIgZG9lcyBub3QgaW1wbHkgdGhhdCB0aGUKKyAgICAgKiB1bmRlcmx5aW5nIG1lbW9yeSBpcyBpbW11dGFibGUuICBiX3JlYWRvbmx5IGlzIGEgbmVjZXNzYXJ5IGJ1dCBub3QKKyAgICAgKiBzdWZmaWNpZW50IGNvbmRpdGlvbiBmb3IgYSBidWZmZXIgdG8gYmUgaGFzaGFibGUuICBQZXJoYXBzIGl0IHdvdWxkCisgICAgICogYmUgYmV0dGVyIHRvIG9ubHkgYWxsb3cgaGFzaGluZyBpZiB0aGUgdW5kZXJseWluZyBvYmplY3QgaXMga25vd24gdG8KKyAgICAgKiBiZSBpbW11dGFibGUgKGUuZy4gUHlTdHJpbmdfQ2hlY2soKSBpcyB0cnVlKS4gIEFub3RoZXIgaWRlYSB3b3VsZAorICAgICAqIGJlIHRvIGNhbGwgdHBfaGFzaCBvbiB0aGUgdW5kZXJseWluZyBvYmplY3QgYW5kIHNlZSBpZiBpdCByYWlzZXMKKyAgICAgKiBhbiBlcnJvci4gKi8KKyAgICBpZiAoICFzZWxmLT5iX3JlYWRvbmx5ICkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAid3JpdGFibGUgYnVmZmVycyBhcmUgbm90IGhhc2hhYmxlIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQlpZiAoIWdldF9idWYoc2VsZiwgJnB0ciwgJnNpemUsIEFOWV9CVUZGRVIpKQotCQlyZXR1cm4gLTE7Ci0JcCA9ICh1bnNpZ25lZCBjaGFyICopIHB0cjsKLQlsZW4gPSBzaXplOwotCXggPSAqcCA8PCA3OwotCXdoaWxlICgtLWxlbiA+PSAwKQotCQl4ID0gKDEwMDAwMDMqeCkgXiAqcCsrOwotCXggXj0gc2l6ZTsKLQlpZiAoeCA9PSAtMSkKLQkJeCA9IC0yOwotCXNlbGYtPmJfaGFzaCA9IHg7Ci0JcmV0dXJuIHg7CisgICAgaWYgKCFnZXRfYnVmKHNlbGYsICZwdHIsICZzaXplLCBBTllfQlVGRkVSKSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHAgPSAodW5zaWduZWQgY2hhciAqKSBwdHI7CisgICAgbGVuID0gc2l6ZTsKKyAgICB4ID0gKnAgPDwgNzsKKyAgICB3aGlsZSAoLS1sZW4gPj0gMCkKKyAgICAgICAgeCA9ICgxMDAwMDAzKngpIF4gKnArKzsKKyAgICB4IF49IHNpemU7CisgICAgaWYgKHggPT0gLTEpCisgICAgICAgIHggPSAtMjsKKyAgICBzZWxmLT5iX2hhc2ggPSB4OworICAgIHJldHVybiB4OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYnVmZmVyX3N0cihQeUJ1ZmZlck9iamVjdCAqc2VsZikKIHsKLQl2b2lkICpwdHI7Ci0JUHlfc3NpemVfdCBzaXplOwotCWlmICghZ2V0X2J1ZihzZWxmLCAmcHRyLCAmc2l6ZSwgQU5ZX0JVRkZFUikpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY29uc3QgY2hhciAqKXB0ciwgc2l6ZSk7CisgICAgdm9pZCAqcHRyOworICAgIFB5X3NzaXplX3Qgc2l6ZTsKKyAgICBpZiAoIWdldF9idWYoc2VsZiwgJnB0ciwgJnNpemUsIEFOWV9CVUZGRVIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNvbnN0IGNoYXIgKilwdHIsIHNpemUpOwogfQogCiAvKiBTZXF1ZW5jZSBtZXRob2RzICovCkBAIC0zNTksMzcyICszNTksMzcyIEBACiBzdGF0aWMgUHlfc3NpemVfdAogYnVmZmVyX2xlbmd0aChQeUJ1ZmZlck9iamVjdCAqc2VsZikKIHsKLQl2b2lkICpwdHI7Ci0JUHlfc3NpemVfdCBzaXplOwotCWlmICghZ2V0X2J1ZihzZWxmLCAmcHRyLCAmc2l6ZSwgQU5ZX0JVRkZFUikpCi0JCXJldHVybiAtMTsKLQlyZXR1cm4gc2l6ZTsKKyAgICB2b2lkICpwdHI7CisgICAgUHlfc3NpemVfdCBzaXplOworICAgIGlmICghZ2V0X2J1ZihzZWxmLCAmcHRyLCAmc2l6ZSwgQU5ZX0JVRkZFUikpCisgICAgICAgIHJldHVybiAtMTsKKyAgICByZXR1cm4gc2l6ZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGJ1ZmZlcl9jb25jYXQoUHlCdWZmZXJPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpvdGhlcikKIHsKLQlQeUJ1ZmZlclByb2NzICpwYiA9IG90aGVyLT5vYl90eXBlLT50cF9hc19idWZmZXI7Ci0Jdm9pZCAqcHRyMSwgKnB0cjI7Ci0JY2hhciAqcDsKLQlQeU9iamVjdCAqb2I7Ci0JUHlfc3NpemVfdCBzaXplLCBjb3VudDsKKyAgICBQeUJ1ZmZlclByb2NzICpwYiA9IG90aGVyLT5vYl90eXBlLT50cF9hc19idWZmZXI7CisgICAgdm9pZCAqcHRyMSwgKnB0cjI7CisgICAgY2hhciAqcDsKKyAgICBQeU9iamVjdCAqb2I7CisgICAgUHlfc3NpemVfdCBzaXplLCBjb3VudDsKIAotCWlmICggcGIgPT0gTlVMTCB8fAotCSAgICAgcGItPmJmX2dldHJlYWRidWZmZXIgPT0gTlVMTCB8fAotCSAgICAgcGItPmJmX2dldHNlZ2NvdW50ID09IE5VTEwgKQotCXsKLQkJUHlFcnJfQmFkQXJndW1lbnQoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmICggKCpwYi0+YmZfZ2V0c2VnY291bnQpKG90aGVyLCBOVUxMKSAhPSAxICkKLQl7Ci0JCS8qICMjIyB1c2UgYSBkaWZmZXJlbnQgZXhjZXB0aW9uIHR5cGUvbWVzc2FnZT8gKi8KLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkic2luZ2xlLXNlZ21lbnQgYnVmZmVyIG9iamVjdCBleHBlY3RlZCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKCBwYiA9PSBOVUxMIHx8CisgICAgICAgICBwYi0+YmZfZ2V0cmVhZGJ1ZmZlciA9PSBOVUxMIHx8CisgICAgICAgICBwYi0+YmZfZ2V0c2VnY291bnQgPT0gTlVMTCApCisgICAgeworICAgICAgICBQeUVycl9CYWRBcmd1bWVudCgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKCAoKnBiLT5iZl9nZXRzZWdjb3VudCkob3RoZXIsIE5VTEwpICE9IDEgKQorICAgIHsKKyAgICAgICAgLyogIyMjIHVzZSBhIGRpZmZlcmVudCBleGNlcHRpb24gdHlwZS9tZXNzYWdlPyAqLworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInNpbmdsZS1zZWdtZW50IGJ1ZmZlciBvYmplY3QgZXhwZWN0ZWQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0gCWlmICghZ2V0X2J1ZihzZWxmLCAmcHRyMSwgJnNpemUsIEFOWV9CVUZGRVIpKQotIAkJcmV0dXJuIE5VTEw7Ci0gCi0JLyogb3B0aW1pemUgc3BlY2lhbCBjYXNlICovCi0JaWYgKCBzaXplID09IDAgKQotCXsKLQkgICAgUHlfSU5DUkVGKG90aGVyKTsKLQkgICAgcmV0dXJuIG90aGVyOwotCX0KKyAgICBpZiAoIWdldF9idWYoc2VsZiwgJnB0cjEsICZzaXplLCBBTllfQlVGRkVSKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoIChjb3VudCA9ICgqcGItPmJmX2dldHJlYWRidWZmZXIpKG90aGVyLCAwLCAmcHRyMikpIDwgMCApCi0JCXJldHVybiBOVUxMOworICAgIC8qIG9wdGltaXplIHNwZWNpYWwgY2FzZSAqLworICAgIGlmICggc2l6ZSA9PSAwICkKKyAgICB7CisgICAgICAgIFB5X0lOQ1JFRihvdGhlcik7CisgICAgICAgIHJldHVybiBvdGhlcjsKKyAgICB9CiAKLQlhc3NlcnQoY291bnQgPD0gUFlfU0laRV9NQVggLSBzaXplKTsKKyAgICBpZiAoIChjb3VudCA9ICgqcGItPmJmX2dldHJlYWRidWZmZXIpKG90aGVyLCAwLCAmcHRyMikpIDwgMCApCisgICAgICAgIHJldHVybiBOVUxMOwogCi0gCW9iID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgc2l6ZSArIGNvdW50KTsKLQlpZiAoIG9iID09IE5VTEwgKQotCQlyZXR1cm4gTlVMTDsKLSAJcCA9IFB5U3RyaW5nX0FTX1NUUklORyhvYik7Ci0gCW1lbWNweShwLCBwdHIxLCBzaXplKTsKLSAJbWVtY3B5KHAgKyBzaXplLCBwdHIyLCBjb3VudCk7CisgICAgYXNzZXJ0KGNvdW50IDw9IFBZX1NJWkVfTUFYIC0gc2l6ZSk7CiAKLQkvKiB0aGVyZSBpcyBhbiBleHRyYSBieXRlIGluIHRoZSBzdHJpbmcgb2JqZWN0LCBzbyB0aGlzIGlzIHNhZmUgKi8KLQlwW3NpemUgKyBjb3VudF0gPSAnXDAnOworICAgIG9iID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgc2l6ZSArIGNvdW50KTsKKyAgICBpZiAoIG9iID09IE5VTEwgKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBwID0gUHlTdHJpbmdfQVNfU1RSSU5HKG9iKTsKKyAgICBtZW1jcHkocCwgcHRyMSwgc2l6ZSk7CisgICAgbWVtY3B5KHAgKyBzaXplLCBwdHIyLCBjb3VudCk7CiAKLQlyZXR1cm4gb2I7CisgICAgLyogdGhlcmUgaXMgYW4gZXh0cmEgYnl0ZSBpbiB0aGUgc3RyaW5nIG9iamVjdCwgc28gdGhpcyBpcyBzYWZlICovCisgICAgcFtzaXplICsgY291bnRdID0gJ1wwJzsKKworICAgIHJldHVybiBvYjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGJ1ZmZlcl9yZXBlYXQoUHlCdWZmZXJPYmplY3QgKnNlbGYsIFB5X3NzaXplX3QgY291bnQpCiB7Ci0JUHlPYmplY3QgKm9iOwotCXJlZ2lzdGVyIGNoYXIgKnA7Ci0Jdm9pZCAqcHRyOwotCVB5X3NzaXplX3Qgc2l6ZTsKKyAgICBQeU9iamVjdCAqb2I7CisgICAgcmVnaXN0ZXIgY2hhciAqcDsKKyAgICB2b2lkICpwdHI7CisgICAgUHlfc3NpemVfdCBzaXplOwogCi0JaWYgKCBjb3VudCA8IDAgKQotCQljb3VudCA9IDA7Ci0JaWYgKCFnZXRfYnVmKHNlbGYsICZwdHIsICZzaXplLCBBTllfQlVGRkVSKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKGNvdW50ID4gUFlfU1NJWkVfVF9NQVggLyBzaXplKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19NZW1vcnlFcnJvciwgInJlc3VsdCB0b28gbGFyZ2UiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCW9iID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgc2l6ZSAqIGNvdW50KTsKLQlpZiAoIG9iID09IE5VTEwgKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIGNvdW50IDwgMCApCisgICAgICAgIGNvdW50ID0gMDsKKyAgICBpZiAoIWdldF9idWYoc2VsZiwgJnB0ciwgJnNpemUsIEFOWV9CVUZGRVIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoY291bnQgPiBQWV9TU0laRV9UX01BWCAvIHNpemUpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX01lbW9yeUVycm9yLCAicmVzdWx0IHRvbyBsYXJnZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgb2IgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBzaXplICogY291bnQpOworICAgIGlmICggb2IgPT0gTlVMTCApCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JcCA9IFB5U3RyaW5nX0FTX1NUUklORyhvYik7Ci0Jd2hpbGUgKCBjb3VudC0tICkKLQl7Ci0JICAgIG1lbWNweShwLCBwdHIsIHNpemUpOwotCSAgICBwICs9IHNpemU7Ci0JfQorICAgIHAgPSBQeVN0cmluZ19BU19TVFJJTkcob2IpOworICAgIHdoaWxlICggY291bnQtLSApCisgICAgeworICAgICAgICBtZW1jcHkocCwgcHRyLCBzaXplKTsKKyAgICAgICAgcCArPSBzaXplOworICAgIH0KIAotCS8qIHRoZXJlIGlzIGFuIGV4dHJhIGJ5dGUgaW4gdGhlIHN0cmluZyBvYmplY3QsIHNvIHRoaXMgaXMgc2FmZSAqLwotCSpwID0gJ1wwJzsKKyAgICAvKiB0aGVyZSBpcyBhbiBleHRyYSBieXRlIGluIHRoZSBzdHJpbmcgb2JqZWN0LCBzbyB0aGlzIGlzIHNhZmUgKi8KKyAgICAqcCA9ICdcMCc7CiAKLQlyZXR1cm4gb2I7CisgICAgcmV0dXJuIG9iOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYnVmZmVyX2l0ZW0oUHlCdWZmZXJPYmplY3QgKnNlbGYsIFB5X3NzaXplX3QgaWR4KQogewotCXZvaWQgKnB0cjsKLQlQeV9zc2l6ZV90IHNpemU7Ci0JaWYgKCFnZXRfYnVmKHNlbGYsICZwdHIsICZzaXplLCBBTllfQlVGRkVSKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCBpZHggPCAwIHx8IGlkeCA+PSBzaXplICkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwgImJ1ZmZlciBpbmRleCBvdXQgb2YgcmFuZ2UiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKXB0ciArIGlkeCwgMSk7CisgICAgdm9pZCAqcHRyOworICAgIFB5X3NzaXplX3Qgc2l6ZTsKKyAgICBpZiAoIWdldF9idWYoc2VsZiwgJnB0ciwgJnNpemUsIEFOWV9CVUZGRVIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIGlkeCA8IDAgfHwgaWR4ID49IHNpemUgKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLCAiYnVmZmVyIGluZGV4IG91dCBvZiByYW5nZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopcHRyICsgaWR4LCAxKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGJ1ZmZlcl9zbGljZShQeUJ1ZmZlck9iamVjdCAqc2VsZiwgUHlfc3NpemVfdCBsZWZ0LCBQeV9zc2l6ZV90IHJpZ2h0KQogewotCXZvaWQgKnB0cjsKLQlQeV9zc2l6ZV90IHNpemU7Ci0JaWYgKCFnZXRfYnVmKHNlbGYsICZwdHIsICZzaXplLCBBTllfQlVGRkVSKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCBsZWZ0IDwgMCApCi0JCWxlZnQgPSAwOwotCWlmICggcmlnaHQgPCAwICkKLQkJcmlnaHQgPSAwOwotCWlmICggcmlnaHQgPiBzaXplICkKLQkJcmlnaHQgPSBzaXplOwotCWlmICggcmlnaHQgPCBsZWZ0ICkKLQkJcmlnaHQgPSBsZWZ0OwotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKXB0ciArIGxlZnQsCi0JCQkJCSAgcmlnaHQgLSBsZWZ0KTsKKyAgICB2b2lkICpwdHI7CisgICAgUHlfc3NpemVfdCBzaXplOworICAgIGlmICghZ2V0X2J1ZihzZWxmLCAmcHRyLCAmc2l6ZSwgQU5ZX0JVRkZFUikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICggbGVmdCA8IDAgKQorICAgICAgICBsZWZ0ID0gMDsKKyAgICBpZiAoIHJpZ2h0IDwgMCApCisgICAgICAgIHJpZ2h0ID0gMDsKKyAgICBpZiAoIHJpZ2h0ID4gc2l6ZSApCisgICAgICAgIHJpZ2h0ID0gc2l6ZTsKKyAgICBpZiAoIHJpZ2h0IDwgbGVmdCApCisgICAgICAgIHJpZ2h0ID0gbGVmdDsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilwdHIgKyBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWdodCAtIGxlZnQpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYnVmZmVyX3N1YnNjcmlwdChQeUJ1ZmZlck9iamVjdCAqc2VsZiwgUHlPYmplY3QgKml0ZW0pCiB7Ci0Jdm9pZCAqcDsKLQlQeV9zc2l6ZV90IHNpemU7Ci0JCi0JaWYgKCFnZXRfYnVmKHNlbGYsICZwLCAmc2l6ZSwgQU5ZX0JVRkZFUikpCi0JCXJldHVybiBOVUxMOwotCWlmIChQeUluZGV4X0NoZWNrKGl0ZW0pKSB7Ci0JCVB5X3NzaXplX3QgaSA9IFB5TnVtYmVyX0FzU3NpemVfdChpdGVtLCBQeUV4Y19JbmRleEVycm9yKTsKLQkJaWYgKGkgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJCXJldHVybiBOVUxMOwotCQlpZiAoaSA8IDApCi0JCQlpICs9IHNpemU7Ci0JCXJldHVybiBidWZmZXJfaXRlbShzZWxmLCBpKTsKLQl9Ci0JZWxzZSBpZiAoUHlTbGljZV9DaGVjayhpdGVtKSkgewotCQlQeV9zc2l6ZV90IHN0YXJ0LCBzdG9wLCBzdGVwLCBzbGljZWxlbmd0aCwgY3VyLCBpOworICAgIHZvaWQgKnA7CisgICAgUHlfc3NpemVfdCBzaXplOwogCi0JCWlmIChQeVNsaWNlX0dldEluZGljZXNFeCgoUHlTbGljZU9iamVjdCopaXRlbSwgc2l6ZSwKLQkJCQkgJnN0YXJ0LCAmc3RvcCwgJnN0ZXAsICZzbGljZWxlbmd0aCkgPCAwKSB7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQorICAgIGlmICghZ2V0X2J1ZihzZWxmLCAmcCwgJnNpemUsIEFOWV9CVUZGRVIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoUHlJbmRleF9DaGVjayhpdGVtKSkgeworICAgICAgICBQeV9zc2l6ZV90IGkgPSBQeU51bWJlcl9Bc1NzaXplX3QoaXRlbSwgUHlFeGNfSW5kZXhFcnJvcik7CisgICAgICAgIGlmIChpID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKGkgPCAwKQorICAgICAgICAgICAgaSArPSBzaXplOworICAgICAgICByZXR1cm4gYnVmZmVyX2l0ZW0oc2VsZiwgaSk7CisgICAgfQorICAgIGVsc2UgaWYgKFB5U2xpY2VfQ2hlY2soaXRlbSkpIHsKKyAgICAgICAgUHlfc3NpemVfdCBzdGFydCwgc3RvcCwgc3RlcCwgc2xpY2VsZW5ndGgsIGN1ciwgaTsKIAotCQlpZiAoc2xpY2VsZW5ndGggPD0gMCkKLQkJCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgiIiwgMCk7Ci0JCWVsc2UgaWYgKHN0ZXAgPT0gMSkKLQkJCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKXAgKyBzdGFydCwKLQkJCQkJCQkgIHN0b3AgLSBzdGFydCk7Ci0JCWVsc2UgewotCQkJUHlPYmplY3QgKnJlc3VsdDsKLQkJCWNoYXIgKnNvdXJjZV9idWYgPSAoY2hhciAqKXA7Ci0JCQljaGFyICpyZXN1bHRfYnVmID0gKGNoYXIgKilQeU1lbV9NYWxsb2Moc2xpY2VsZW5ndGgpOworICAgICAgICBpZiAoUHlTbGljZV9HZXRJbmRpY2VzRXgoKFB5U2xpY2VPYmplY3QqKWl0ZW0sIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0LCAmc3RvcCwgJnN0ZXAsICZzbGljZWxlbmd0aCkgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQogCi0JCQlpZiAocmVzdWx0X2J1ZiA9PSBOVUxMKQotCQkJCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICBpZiAoc2xpY2VsZW5ndGggPD0gMCkKKyAgICAgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgiIiwgMCk7CisgICAgICAgIGVsc2UgaWYgKHN0ZXAgPT0gMSkKKyAgICAgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKXAgKyBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9wIC0gc3RhcnQpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisgICAgICAgICAgICBjaGFyICpzb3VyY2VfYnVmID0gKGNoYXIgKilwOworICAgICAgICAgICAgY2hhciAqcmVzdWx0X2J1ZiA9IChjaGFyICopUHlNZW1fTWFsbG9jKHNsaWNlbGVuZ3RoKTsKIAotCQkJZm9yIChjdXIgPSBzdGFydCwgaSA9IDA7IGkgPCBzbGljZWxlbmd0aDsKLQkJCSAgICAgY3VyICs9IHN0ZXAsIGkrKykgewotCQkJCXJlc3VsdF9idWZbaV0gPSBzb3VyY2VfYnVmW2N1cl07Ci0JCQl9CisgICAgICAgICAgICBpZiAocmVzdWx0X2J1ZiA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOwogCi0JCQlyZXN1bHQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShyZXN1bHRfYnVmLAotCQkJCQkJCSAgICBzbGljZWxlbmd0aCk7Ci0JCQlQeU1lbV9GcmVlKHJlc3VsdF9idWYpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCX0KLQllbHNlIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkic2VxdWVuY2UgaW5kZXggbXVzdCBiZSBpbnRlZ2VyIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICAgICAgICAgIGZvciAoY3VyID0gc3RhcnQsIGkgPSAwOyBpIDwgc2xpY2VsZW5ndGg7CisgICAgICAgICAgICAgICAgIGN1ciArPSBzdGVwLCBpKyspIHsKKyAgICAgICAgICAgICAgICByZXN1bHRfYnVmW2ldID0gc291cmNlX2J1ZltjdXJdOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXN1bHQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShyZXN1bHRfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xpY2VsZW5ndGgpOworICAgICAgICAgICAgUHlNZW1fRnJlZShyZXN1bHRfYnVmKTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAic2VxdWVuY2UgaW5kZXggbXVzdCBiZSBpbnRlZ2VyIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIH0KIAogc3RhdGljIGludAogYnVmZmVyX2Fzc19pdGVtKFB5QnVmZmVyT2JqZWN0ICpzZWxmLCBQeV9zc2l6ZV90IGlkeCwgUHlPYmplY3QgKm90aGVyKQogewotCVB5QnVmZmVyUHJvY3MgKnBiOwotCXZvaWQgKnB0cjEsICpwdHIyOwotCVB5X3NzaXplX3Qgc2l6ZTsKLQlQeV9zc2l6ZV90IGNvdW50OworICAgIFB5QnVmZmVyUHJvY3MgKnBiOworICAgIHZvaWQgKnB0cjEsICpwdHIyOworICAgIFB5X3NzaXplX3Qgc2l6ZTsKKyAgICBQeV9zc2l6ZV90IGNvdW50OwogCi0JaWYgKCBzZWxmLT5iX3JlYWRvbmx5ICkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJidWZmZXIgaXMgcmVhZC1vbmx5Iik7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgaWYgKCBzZWxmLT5iX3JlYWRvbmx5ICkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImJ1ZmZlciBpcyByZWFkLW9ubHkiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCWlmICghZ2V0X2J1ZihzZWxmLCAmcHRyMSwgJnNpemUsIEFOWV9CVUZGRVIpKQotCQlyZXR1cm4gLTE7CisgICAgaWYgKCFnZXRfYnVmKHNlbGYsICZwdHIxLCAmc2l6ZSwgQU5ZX0JVRkZFUikpCisgICAgICAgIHJldHVybiAtMTsKIAotCWlmIChpZHggPCAwIHx8IGlkeCA+PSBzaXplKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLAotCQkJCSJidWZmZXIgYXNzaWdubWVudCBpbmRleCBvdXQgb2YgcmFuZ2UiKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICBpZiAoaWR4IDwgMCB8fCBpZHggPj0gc2l6ZSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJidWZmZXIgYXNzaWdubWVudCBpbmRleCBvdXQgb2YgcmFuZ2UiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCXBiID0gb3RoZXIgPyBvdGhlci0+b2JfdHlwZS0+dHBfYXNfYnVmZmVyIDogTlVMTDsKLQlpZiAoIHBiID09IE5VTEwgfHwKLQkgICAgIHBiLT5iZl9nZXRyZWFkYnVmZmVyID09IE5VTEwgfHwKLQkgICAgIHBiLT5iZl9nZXRzZWdjb3VudCA9PSBOVUxMICkKLQl7Ci0JCVB5RXJyX0JhZEFyZ3VtZW50KCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKCAoKnBiLT5iZl9nZXRzZWdjb3VudCkob3RoZXIsIE5VTEwpICE9IDEgKQotCXsKLQkJLyogIyMjIHVzZSBhIGRpZmZlcmVudCBleGNlcHRpb24gdHlwZS9tZXNzYWdlPyAqLwotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJzaW5nbGUtc2VnbWVudCBidWZmZXIgb2JqZWN0IGV4cGVjdGVkIik7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgcGIgPSBvdGhlciA/IG90aGVyLT5vYl90eXBlLT50cF9hc19idWZmZXIgOiBOVUxMOworICAgIGlmICggcGIgPT0gTlVMTCB8fAorICAgICAgICAgcGItPmJmX2dldHJlYWRidWZmZXIgPT0gTlVMTCB8fAorICAgICAgICAgcGItPmJmX2dldHNlZ2NvdW50ID09IE5VTEwgKQorICAgIHsKKyAgICAgICAgUHlFcnJfQmFkQXJndW1lbnQoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoICgqcGItPmJmX2dldHNlZ2NvdW50KShvdGhlciwgTlVMTCkgIT0gMSApCisgICAgeworICAgICAgICAvKiAjIyMgdXNlIGEgZGlmZmVyZW50IGV4Y2VwdGlvbiB0eXBlL21lc3NhZ2U/ICovCisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAic2luZ2xlLXNlZ21lbnQgYnVmZmVyIG9iamVjdCBleHBlY3RlZCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JaWYgKCAoY291bnQgPSAoKnBiLT5iZl9nZXRyZWFkYnVmZmVyKShvdGhlciwgMCwgJnB0cjIpKSA8IDAgKQotCQlyZXR1cm4gLTE7Ci0JaWYgKCBjb3VudCAhPSAxICkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJyaWdodCBvcGVyYW5kIG11c3QgYmUgYSBzaW5nbGUgYnl0ZSIpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIGlmICggKGNvdW50ID0gKCpwYi0+YmZfZ2V0cmVhZGJ1ZmZlcikob3RoZXIsIDAsICZwdHIyKSkgPCAwICkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmICggY291bnQgIT0gMSApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodCBvcGVyYW5kIG11c3QgYmUgYSBzaW5nbGUgYnl0ZSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JKChjaGFyICopcHRyMSlbaWR4XSA9ICooY2hhciAqKXB0cjI7Ci0JcmV0dXJuIDA7CisgICAgKChjaGFyICopcHRyMSlbaWR4XSA9ICooY2hhciAqKXB0cjI7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIGJ1ZmZlcl9hc3Nfc2xpY2UoUHlCdWZmZXJPYmplY3QgKnNlbGYsIFB5X3NzaXplX3QgbGVmdCwgUHlfc3NpemVfdCByaWdodCwgUHlPYmplY3QgKm90aGVyKQogewotCVB5QnVmZmVyUHJvY3MgKnBiOwotCXZvaWQgKnB0cjEsICpwdHIyOwotCVB5X3NzaXplX3Qgc2l6ZTsKLQlQeV9zc2l6ZV90IHNsaWNlX2xlbjsKLQlQeV9zc2l6ZV90IGNvdW50OworICAgIFB5QnVmZmVyUHJvY3MgKnBiOworICAgIHZvaWQgKnB0cjEsICpwdHIyOworICAgIFB5X3NzaXplX3Qgc2l6ZTsKKyAgICBQeV9zc2l6ZV90IHNsaWNlX2xlbjsKKyAgICBQeV9zc2l6ZV90IGNvdW50OwogCi0JaWYgKCBzZWxmLT5iX3JlYWRvbmx5ICkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJidWZmZXIgaXMgcmVhZC1vbmx5Iik7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgaWYgKCBzZWxmLT5iX3JlYWRvbmx5ICkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImJ1ZmZlciBpcyByZWFkLW9ubHkiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCXBiID0gb3RoZXIgPyBvdGhlci0+b2JfdHlwZS0+dHBfYXNfYnVmZmVyIDogTlVMTDsKLQlpZiAoIHBiID09IE5VTEwgfHwKLQkgICAgIHBiLT5iZl9nZXRyZWFkYnVmZmVyID09IE5VTEwgfHwKLQkgICAgIHBiLT5iZl9nZXRzZWdjb3VudCA9PSBOVUxMICkKLQl7Ci0JCVB5RXJyX0JhZEFyZ3VtZW50KCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKCAoKnBiLT5iZl9nZXRzZWdjb3VudCkob3RoZXIsIE5VTEwpICE9IDEgKQotCXsKLQkJLyogIyMjIHVzZSBhIGRpZmZlcmVudCBleGNlcHRpb24gdHlwZS9tZXNzYWdlPyAqLwotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJzaW5nbGUtc2VnbWVudCBidWZmZXIgb2JqZWN0IGV4cGVjdGVkIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKCFnZXRfYnVmKHNlbGYsICZwdHIxLCAmc2l6ZSwgQU5ZX0JVRkZFUikpCi0JCXJldHVybiAtMTsKLQlpZiAoIChjb3VudCA9ICgqcGItPmJmX2dldHJlYWRidWZmZXIpKG90aGVyLCAwLCAmcHRyMikpIDwgMCApCi0JCXJldHVybiAtMTsKKyAgICBwYiA9IG90aGVyID8gb3RoZXItPm9iX3R5cGUtPnRwX2FzX2J1ZmZlciA6IE5VTEw7CisgICAgaWYgKCBwYiA9PSBOVUxMIHx8CisgICAgICAgICBwYi0+YmZfZ2V0cmVhZGJ1ZmZlciA9PSBOVUxMIHx8CisgICAgICAgICBwYi0+YmZfZ2V0c2VnY291bnQgPT0gTlVMTCApCisgICAgeworICAgICAgICBQeUVycl9CYWRBcmd1bWVudCgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICggKCpwYi0+YmZfZ2V0c2VnY291bnQpKG90aGVyLCBOVUxMKSAhPSAxICkKKyAgICB7CisgICAgICAgIC8qICMjIyB1c2UgYSBkaWZmZXJlbnQgZXhjZXB0aW9uIHR5cGUvbWVzc2FnZT8gKi8KKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJzaW5nbGUtc2VnbWVudCBidWZmZXIgb2JqZWN0IGV4cGVjdGVkIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKCFnZXRfYnVmKHNlbGYsICZwdHIxLCAmc2l6ZSwgQU5ZX0JVRkZFUikpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAoIChjb3VudCA9ICgqcGItPmJmX2dldHJlYWRidWZmZXIpKG90aGVyLCAwLCAmcHRyMikpIDwgMCApCisgICAgICAgIHJldHVybiAtMTsKIAotCWlmICggbGVmdCA8IDAgKQotCQlsZWZ0ID0gMDsKLQllbHNlIGlmICggbGVmdCA+IHNpemUgKQotCQlsZWZ0ID0gc2l6ZTsKLQlpZiAoIHJpZ2h0IDwgbGVmdCApCi0JCXJpZ2h0ID0gbGVmdDsKLQllbHNlIGlmICggcmlnaHQgPiBzaXplICkKLQkJcmlnaHQgPSBzaXplOwotCXNsaWNlX2xlbiA9IHJpZ2h0IC0gbGVmdDsKKyAgICBpZiAoIGxlZnQgPCAwICkKKyAgICAgICAgbGVmdCA9IDA7CisgICAgZWxzZSBpZiAoIGxlZnQgPiBzaXplICkKKyAgICAgICAgbGVmdCA9IHNpemU7CisgICAgaWYgKCByaWdodCA8IGxlZnQgKQorICAgICAgICByaWdodCA9IGxlZnQ7CisgICAgZWxzZSBpZiAoIHJpZ2h0ID4gc2l6ZSApCisgICAgICAgIHJpZ2h0ID0gc2l6ZTsKKyAgICBzbGljZV9sZW4gPSByaWdodCAtIGxlZnQ7CiAKLQlpZiAoIGNvdW50ICE9IHNsaWNlX2xlbiApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKAotCQkJUHlFeGNfVHlwZUVycm9yLAotCQkJInJpZ2h0IG9wZXJhbmQgbGVuZ3RoIG11c3QgbWF0Y2ggc2xpY2UgbGVuZ3RoIik7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgaWYgKCBjb3VudCAhPSBzbGljZV9sZW4gKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZygKKyAgICAgICAgICAgIFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICJyaWdodCBvcGVyYW5kIGxlbmd0aCBtdXN0IG1hdGNoIHNsaWNlIGxlbmd0aCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JaWYgKCBzbGljZV9sZW4gKQotCSAgICBtZW1jcHkoKGNoYXIgKilwdHIxICsgbGVmdCwgcHRyMiwgc2xpY2VfbGVuKTsKKyAgICBpZiAoIHNsaWNlX2xlbiApCisgICAgICAgIG1lbWNweSgoY2hhciAqKXB0cjEgKyBsZWZ0LCBwdHIyLCBzbGljZV9sZW4pOwogCi0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIGJ1ZmZlcl9hc3Nfc3Vic2NyaXB0KFB5QnVmZmVyT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqaXRlbSwgUHlPYmplY3QgKnZhbHVlKQogewotCVB5QnVmZmVyUHJvY3MgKnBiOwotCXZvaWQgKnB0cjEsICpwdHIyOwotCVB5X3NzaXplX3Qgc2VsZnNpemU7Ci0JUHlfc3NpemVfdCBvdGhlcnNpemU7CisgICAgUHlCdWZmZXJQcm9jcyAqcGI7CisgICAgdm9pZCAqcHRyMSwgKnB0cjI7CisgICAgUHlfc3NpemVfdCBzZWxmc2l6ZTsKKyAgICBQeV9zc2l6ZV90IG90aGVyc2l6ZTsKIAotCWlmICggc2VsZi0+Yl9yZWFkb25seSApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiYnVmZmVyIGlzIHJlYWQtb25seSIpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIGlmICggc2VsZi0+Yl9yZWFkb25seSApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJidWZmZXIgaXMgcmVhZC1vbmx5Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQlwYiA9IHZhbHVlID8gdmFsdWUtPm9iX3R5cGUtPnRwX2FzX2J1ZmZlciA6IE5VTEw7Ci0JaWYgKCBwYiA9PSBOVUxMIHx8Ci0JICAgICBwYi0+YmZfZ2V0cmVhZGJ1ZmZlciA9PSBOVUxMIHx8Ci0JICAgICBwYi0+YmZfZ2V0c2VnY291bnQgPT0gTlVMTCApCi0JewotCQlQeUVycl9CYWRBcmd1bWVudCgpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmICggKCpwYi0+YmZfZ2V0c2VnY291bnQpKHZhbHVlLCBOVUxMKSAhPSAxICkKLQl7Ci0JCS8qICMjIyB1c2UgYSBkaWZmZXJlbnQgZXhjZXB0aW9uIHR5cGUvbWVzc2FnZT8gKi8KLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkic2luZ2xlLXNlZ21lbnQgYnVmZmVyIG9iamVjdCBleHBlY3RlZCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmICghZ2V0X2J1ZihzZWxmLCAmcHRyMSwgJnNlbGZzaXplLCBBTllfQlVGRkVSKSkKLQkJcmV0dXJuIC0xOwotCWlmIChQeUluZGV4X0NoZWNrKGl0ZW0pKSB7Ci0JCVB5X3NzaXplX3QgaSA9IFB5TnVtYmVyX0FzU3NpemVfdChpdGVtLCBQeUV4Y19JbmRleEVycm9yKTsKLQkJaWYgKGkgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJCXJldHVybiAtMTsKLQkJaWYgKGkgPCAwKQotCQkJaSArPSBzZWxmc2l6ZTsKLQkJcmV0dXJuIGJ1ZmZlcl9hc3NfaXRlbShzZWxmLCBpLCB2YWx1ZSk7Ci0JfQotCWVsc2UgaWYgKFB5U2xpY2VfQ2hlY2soaXRlbSkpIHsKLQkJUHlfc3NpemVfdCBzdGFydCwgc3RvcCwgc3RlcCwgc2xpY2VsZW5ndGg7Ci0JCQotCQlpZiAoUHlTbGljZV9HZXRJbmRpY2VzRXgoKFB5U2xpY2VPYmplY3QgKilpdGVtLCBzZWxmc2l6ZSwKLQkJCQkmc3RhcnQsICZzdG9wLCAmc3RlcCwgJnNsaWNlbGVuZ3RoKSA8IDApCi0JCQlyZXR1cm4gLTE7CisgICAgcGIgPSB2YWx1ZSA/IHZhbHVlLT5vYl90eXBlLT50cF9hc19idWZmZXIgOiBOVUxMOworICAgIGlmICggcGIgPT0gTlVMTCB8fAorICAgICAgICAgcGItPmJmX2dldHJlYWRidWZmZXIgPT0gTlVMTCB8fAorICAgICAgICAgcGItPmJmX2dldHNlZ2NvdW50ID09IE5VTEwgKQorICAgIHsKKyAgICAgICAgUHlFcnJfQmFkQXJndW1lbnQoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoICgqcGItPmJmX2dldHNlZ2NvdW50KSh2YWx1ZSwgTlVMTCkgIT0gMSApCisgICAgeworICAgICAgICAvKiAjIyMgdXNlIGEgZGlmZmVyZW50IGV4Y2VwdGlvbiB0eXBlL21lc3NhZ2U/ICovCisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAic2luZ2xlLXNlZ21lbnQgYnVmZmVyIG9iamVjdCBleHBlY3RlZCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICghZ2V0X2J1ZihzZWxmLCAmcHRyMSwgJnNlbGZzaXplLCBBTllfQlVGRkVSKSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmIChQeUluZGV4X0NoZWNrKGl0ZW0pKSB7CisgICAgICAgIFB5X3NzaXplX3QgaSA9IFB5TnVtYmVyX0FzU3NpemVfdChpdGVtLCBQeUV4Y19JbmRleEVycm9yKTsKKyAgICAgICAgaWYgKGkgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaWYgKGkgPCAwKQorICAgICAgICAgICAgaSArPSBzZWxmc2l6ZTsKKyAgICAgICAgcmV0dXJuIGJ1ZmZlcl9hc3NfaXRlbShzZWxmLCBpLCB2YWx1ZSk7CisgICAgfQorICAgIGVsc2UgaWYgKFB5U2xpY2VfQ2hlY2soaXRlbSkpIHsKKyAgICAgICAgUHlfc3NpemVfdCBzdGFydCwgc3RvcCwgc3RlcCwgc2xpY2VsZW5ndGg7CiAKLQkJaWYgKChvdGhlcnNpemUgPSAoKnBiLT5iZl9nZXRyZWFkYnVmZmVyKSh2YWx1ZSwgMCwgJnB0cjIpKSA8IDApCi0JCQlyZXR1cm4gLTE7CisgICAgICAgIGlmIChQeVNsaWNlX0dldEluZGljZXNFeCgoUHlTbGljZU9iamVjdCAqKWl0ZW0sIHNlbGZzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0LCAmc3RvcCwgJnN0ZXAsICZzbGljZWxlbmd0aCkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOwogCi0JCWlmIChvdGhlcnNpemUgIT0gc2xpY2VsZW5ndGgpIHsKLQkJCVB5RXJyX1NldFN0cmluZygKLQkJCQlQeUV4Y19UeXBlRXJyb3IsCi0JCQkJInJpZ2h0IG9wZXJhbmQgbGVuZ3RoIG11c3QgbWF0Y2ggc2xpY2UgbGVuZ3RoIik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KKyAgICAgICAgaWYgKChvdGhlcnNpemUgPSAoKnBiLT5iZl9nZXRyZWFkYnVmZmVyKSh2YWx1ZSwgMCwgJnB0cjIpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CiAKLQkJaWYgKHNsaWNlbGVuZ3RoID09IDApCi0JCQlyZXR1cm4gMDsKLQkJZWxzZSBpZiAoc3RlcCA9PSAxKSB7Ci0JCQltZW1jcHkoKGNoYXIgKilwdHIxICsgc3RhcnQsIHB0cjIsIHNsaWNlbGVuZ3RoKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JCWVsc2UgewotCQkJUHlfc3NpemVfdCBjdXIsIGk7Ci0JCQkKLQkJCWZvciAoY3VyID0gc3RhcnQsIGkgPSAwOyBpIDwgc2xpY2VsZW5ndGg7Ci0JCQkgICAgIGN1ciArPSBzdGVwLCBpKyspIHsKLQkJCQkoKGNoYXIgKilwdHIxKVtjdXJdID0gKChjaGFyICopcHRyMilbaV07Ci0JCQl9CisgICAgICAgIGlmIChvdGhlcnNpemUgIT0gc2xpY2VsZW5ndGgpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZygKKyAgICAgICAgICAgICAgICBQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgInJpZ2h0IG9wZXJhbmQgbGVuZ3RoIG11c3QgbWF0Y2ggc2xpY2UgbGVuZ3RoIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KIAotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9IGVsc2UgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJidWZmZXIgaW5kaWNlcyBtdXN0IGJlIGludGVnZXJzIik7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgICAgIGlmIChzbGljZWxlbmd0aCA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGVsc2UgaWYgKHN0ZXAgPT0gMSkgeworICAgICAgICAgICAgbWVtY3B5KChjaGFyICopcHRyMSArIHN0YXJ0LCBwdHIyLCBzbGljZWxlbmd0aCk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIFB5X3NzaXplX3QgY3VyLCBpOworCisgICAgICAgICAgICBmb3IgKGN1ciA9IHN0YXJ0LCBpID0gMDsgaSA8IHNsaWNlbGVuZ3RoOworICAgICAgICAgICAgICAgICBjdXIgKz0gc3RlcCwgaSsrKSB7CisgICAgICAgICAgICAgICAgKChjaGFyICopcHRyMSlbY3VyXSA9ICgoY2hhciAqKXB0cjIpW2ldOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiYnVmZmVyIGluZGljZXMgbXVzdCBiZSBpbnRlZ2VycyIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogfQogCiAvKiBCdWZmZXIgbWV0aG9kcyAqLwpAQCAtNzMyLDEyNiArNzMyLDEyNiBAQAogc3RhdGljIFB5X3NzaXplX3QKIGJ1ZmZlcl9nZXRyZWFkYnVmKFB5QnVmZmVyT2JqZWN0ICpzZWxmLCBQeV9zc2l6ZV90IGlkeCwgdm9pZCAqKnBwKQogewotCVB5X3NzaXplX3Qgc2l6ZTsKLQlpZiAoIGlkeCAhPSAwICkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCi0JCQkJImFjY2Vzc2luZyBub24tZXhpc3RlbnQgYnVmZmVyIHNlZ21lbnQiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoIWdldF9idWYoc2VsZiwgcHAsICZzaXplLCBSRUFEX0JVRkZFUikpCi0JCXJldHVybiAtMTsKLQlyZXR1cm4gc2l6ZTsKKyAgICBQeV9zc2l6ZV90IHNpemU7CisgICAgaWYgKCBpZHggIT0gMCApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImFjY2Vzc2luZyBub24tZXhpc3RlbnQgYnVmZmVyIHNlZ21lbnQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoIWdldF9idWYoc2VsZiwgcHAsICZzaXplLCBSRUFEX0JVRkZFUikpCisgICAgICAgIHJldHVybiAtMTsKKyAgICByZXR1cm4gc2l6ZTsKIH0KIAogc3RhdGljIFB5X3NzaXplX3QKIGJ1ZmZlcl9nZXR3cml0ZWJ1ZihQeUJ1ZmZlck9iamVjdCAqc2VsZiwgUHlfc3NpemVfdCBpZHgsIHZvaWQgKipwcCkKIHsKLQlQeV9zc2l6ZV90IHNpemU7CisgICAgUHlfc3NpemVfdCBzaXplOwogCi0JaWYgKCBzZWxmLT5iX3JlYWRvbmx5ICkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJidWZmZXIgaXMgcmVhZC1vbmx5Iik7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgaWYgKCBzZWxmLT5iX3JlYWRvbmx5ICkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJidWZmZXIgaXMgcmVhZC1vbmx5Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQlpZiAoIGlkeCAhPSAwICkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCi0JCQkJImFjY2Vzc2luZyBub24tZXhpc3RlbnQgYnVmZmVyIHNlZ21lbnQiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoIWdldF9idWYoc2VsZiwgcHAsICZzaXplLCBXUklURV9CVUZGRVIpKQotCQlyZXR1cm4gLTE7Ci0JcmV0dXJuIHNpemU7CisgICAgaWYgKCBpZHggIT0gMCApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImFjY2Vzc2luZyBub24tZXhpc3RlbnQgYnVmZmVyIHNlZ21lbnQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoIWdldF9idWYoc2VsZiwgcHAsICZzaXplLCBXUklURV9CVUZGRVIpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgcmV0dXJuIHNpemU7CiB9CiAKIHN0YXRpYyBQeV9zc2l6ZV90CiBidWZmZXJfZ2V0c2VnY291bnQoUHlCdWZmZXJPYmplY3QgKnNlbGYsIFB5X3NzaXplX3QgKmxlbnApCiB7Ci0Jdm9pZCAqcHRyOwotCVB5X3NzaXplX3Qgc2l6ZTsKLQlpZiAoIWdldF9idWYoc2VsZiwgJnB0ciwgJnNpemUsIEFOWV9CVUZGRVIpKQotCQlyZXR1cm4gLTE7Ci0JaWYgKGxlbnApCi0JCSpsZW5wID0gc2l6ZTsKLQlyZXR1cm4gMTsKKyAgICB2b2lkICpwdHI7CisgICAgUHlfc3NpemVfdCBzaXplOworICAgIGlmICghZ2V0X2J1ZihzZWxmLCAmcHRyLCAmc2l6ZSwgQU5ZX0JVRkZFUikpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAobGVucCkKKyAgICAgICAgKmxlbnAgPSBzaXplOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgUHlfc3NpemVfdAogYnVmZmVyX2dldGNoYXJidWYoUHlCdWZmZXJPYmplY3QgKnNlbGYsIFB5X3NzaXplX3QgaWR4LCBjb25zdCBjaGFyICoqcHApCiB7Ci0Jdm9pZCAqcHRyOwotCVB5X3NzaXplX3Qgc2l6ZTsKLQlpZiAoIGlkeCAhPSAwICkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCi0JCQkJImFjY2Vzc2luZyBub24tZXhpc3RlbnQgYnVmZmVyIHNlZ21lbnQiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoIWdldF9idWYoc2VsZiwgJnB0ciwgJnNpemUsIENIQVJfQlVGRkVSKSkKLQkJcmV0dXJuIC0xOwotCSpwcCA9IChjb25zdCBjaGFyICopcHRyOwotCXJldHVybiBzaXplOworICAgIHZvaWQgKnB0cjsKKyAgICBQeV9zc2l6ZV90IHNpemU7CisgICAgaWYgKCBpZHggIT0gMCApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImFjY2Vzc2luZyBub24tZXhpc3RlbnQgYnVmZmVyIHNlZ21lbnQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoIWdldF9idWYoc2VsZiwgJnB0ciwgJnNpemUsIENIQVJfQlVGRkVSKSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgICpwcCA9IChjb25zdCBjaGFyICopcHRyOworICAgIHJldHVybiBzaXplOwogfQogCiBzdGF0aWMgUHlTZXF1ZW5jZU1ldGhvZHMgYnVmZmVyX2FzX3NlcXVlbmNlID0gewotCShsZW5mdW5jKWJ1ZmZlcl9sZW5ndGgsIC8qc3FfbGVuZ3RoKi8KLQkoYmluYXJ5ZnVuYylidWZmZXJfY29uY2F0LCAvKnNxX2NvbmNhdCovCi0JKHNzaXplYXJnZnVuYylidWZmZXJfcmVwZWF0LCAvKnNxX3JlcGVhdCovCi0JKHNzaXplYXJnZnVuYylidWZmZXJfaXRlbSwgLypzcV9pdGVtKi8KLQkoc3NpemVzc2l6ZWFyZ2Z1bmMpYnVmZmVyX3NsaWNlLCAvKnNxX3NsaWNlKi8KLQkoc3NpemVvYmphcmdwcm9jKWJ1ZmZlcl9hc3NfaXRlbSwgLypzcV9hc3NfaXRlbSovCi0JKHNzaXplc3NpemVvYmphcmdwcm9jKWJ1ZmZlcl9hc3Nfc2xpY2UsIC8qc3FfYXNzX3NsaWNlKi8KKyAgICAobGVuZnVuYylidWZmZXJfbGVuZ3RoLCAvKnNxX2xlbmd0aCovCisgICAgKGJpbmFyeWZ1bmMpYnVmZmVyX2NvbmNhdCwgLypzcV9jb25jYXQqLworICAgIChzc2l6ZWFyZ2Z1bmMpYnVmZmVyX3JlcGVhdCwgLypzcV9yZXBlYXQqLworICAgIChzc2l6ZWFyZ2Z1bmMpYnVmZmVyX2l0ZW0sIC8qc3FfaXRlbSovCisgICAgKHNzaXplc3NpemVhcmdmdW5jKWJ1ZmZlcl9zbGljZSwgLypzcV9zbGljZSovCisgICAgKHNzaXplb2JqYXJncHJvYylidWZmZXJfYXNzX2l0ZW0sIC8qc3FfYXNzX2l0ZW0qLworICAgIChzc2l6ZXNzaXplb2JqYXJncHJvYylidWZmZXJfYXNzX3NsaWNlLCAvKnNxX2Fzc19zbGljZSovCiB9OwogCiBzdGF0aWMgUHlNYXBwaW5nTWV0aG9kcyBidWZmZXJfYXNfbWFwcGluZyA9IHsKLQkobGVuZnVuYylidWZmZXJfbGVuZ3RoLAotCShiaW5hcnlmdW5jKWJ1ZmZlcl9zdWJzY3JpcHQsCi0JKG9iam9iamFyZ3Byb2MpYnVmZmVyX2Fzc19zdWJzY3JpcHQsCisgICAgKGxlbmZ1bmMpYnVmZmVyX2xlbmd0aCwKKyAgICAoYmluYXJ5ZnVuYylidWZmZXJfc3Vic2NyaXB0LAorICAgIChvYmpvYmphcmdwcm9jKWJ1ZmZlcl9hc3Nfc3Vic2NyaXB0LAogfTsKIAogc3RhdGljIFB5QnVmZmVyUHJvY3MgYnVmZmVyX2FzX2J1ZmZlciA9IHsKLQkocmVhZGJ1ZmZlcnByb2MpYnVmZmVyX2dldHJlYWRidWYsCi0JKHdyaXRlYnVmZmVycHJvYylidWZmZXJfZ2V0d3JpdGVidWYsCi0JKHNlZ2NvdW50cHJvYylidWZmZXJfZ2V0c2VnY291bnQsCi0JKGNoYXJidWZmZXJwcm9jKWJ1ZmZlcl9nZXRjaGFyYnVmLAorICAgIChyZWFkYnVmZmVycHJvYylidWZmZXJfZ2V0cmVhZGJ1ZiwKKyAgICAod3JpdGVidWZmZXJwcm9jKWJ1ZmZlcl9nZXR3cml0ZWJ1ZiwKKyAgICAoc2VnY291bnRwcm9jKWJ1ZmZlcl9nZXRzZWdjb3VudCwKKyAgICAoY2hhcmJ1ZmZlcnByb2MpYnVmZmVyX2dldGNoYXJidWYsCiB9OwogCiBQeVR5cGVPYmplY3QgUHlCdWZmZXJfVHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQotCSJidWZmZXIiLAotCXNpemVvZihQeUJ1ZmZlck9iamVjdCksCi0JMCwKLQkoZGVzdHJ1Y3RvcilidWZmZXJfZGVhbGxvYywgCQkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0ciAqLwotCShjbXBmdW5jKWJ1ZmZlcl9jb21wYXJlLAkJLyogdHBfY29tcGFyZSAqLwotCShyZXByZnVuYylidWZmZXJfcmVwciwJCQkvKiB0cF9yZXByICovCi0JMCwJCQkJCS8qIHRwX2FzX251bWJlciAqLwotCSZidWZmZXJfYXNfc2VxdWVuY2UsCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkmYnVmZmVyX2FzX21hcHBpbmcsCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYylidWZmZXJfaGFzaCwJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJCS8qIHRwX2NhbGwgKi8KLQkocmVwcmZ1bmMpYnVmZmVyX3N0ciwJCQkvKiB0cF9zdHIgKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHJvICovCi0JJmJ1ZmZlcl9hc19idWZmZXIsCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dFVENIQVJCVUZGRVIsIC8qIHRwX2ZsYWdzICovCi0JYnVmZmVyX2RvYywJCQkJLyogdHBfZG9jICovCi0JMCwJCQkJCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkJLyogdHBfaXRlcm5leHQgKi8KLQkwLAkJCQkJLyogdHBfbWV0aG9kcyAqLwkKLQkwLAkJCQkJLyogdHBfbWVtYmVycyAqLwotCTAsCQkJCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCQkvKiB0cF9kaWN0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KLQkwLAkJCQkJLyogdHBfZGljdG9mZnNldCAqLwotCTAsCQkJCQkvKiB0cF9pbml0ICovCi0JMCwJCQkJCS8qIHRwX2FsbG9jICovCi0JYnVmZmVyX25ldywJCQkJLyogdHBfbmV3ICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKKyAgICAiYnVmZmVyIiwKKyAgICBzaXplb2YoUHlCdWZmZXJPYmplY3QpLAorICAgIDAsCisgICAgKGRlc3RydWN0b3IpYnVmZmVyX2RlYWxsb2MsICAgICAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIChjbXBmdW5jKWJ1ZmZlcl9jb21wYXJlLCAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIChyZXByZnVuYylidWZmZXJfcmVwciwgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgJmJ1ZmZlcl9hc19zZXF1ZW5jZSwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgICZidWZmZXJfYXNfbWFwcGluZywgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIChoYXNoZnVuYylidWZmZXJfaGFzaCwgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIChyZXByZnVuYylidWZmZXJfc3RyLCAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAmYnVmZmVyX2FzX2J1ZmZlciwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HRVRDSEFSQlVGRkVSLCAvKiB0cF9mbGFncyAqLworICAgIGJ1ZmZlcl9kb2MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgYnVmZmVyX25ldywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KIH07CmRpZmYgLS1naXQgYS9PYmplY3RzL2J5dGVzX21ldGhvZHMuYyBiL09iamVjdHMvYnl0ZXNfbWV0aG9kcy5jCmluZGV4IGRlODc5MDUuLjhjZTA4NTYgMTAwNjQ0Ci0tLSBhL09iamVjdHMvYnl0ZXNfbWV0aG9kcy5jCisrKyBiL09iamVjdHMvYnl0ZXNfbWV0aG9kcy5jCkBAIC0yMzcsNyArMjM3LDcgQEAKIAogICAgIGUgPSBwICsgbGVuOwogICAgIGZvciAoOyBwIDwgZTsgcCsrKSB7Ci0JaWYgKCFJU1NQQUNFKCpwKSkKKyAgICAgICAgaWYgKCFJU1NQQUNFKCpwKSkKICAgICAgICAgICAgIFB5X1JFVFVSTl9GQUxTRTsKICAgICB9CiAgICAgUHlfUkVUVVJOX1RSVUU7CkBAIC0yNTksMTYgKzI1OSwxNiBAQAogCiAgICAgLyogU2hvcnRjdXQgZm9yIHNpbmdsZSBjaGFyYWN0ZXIgc3RyaW5ncyAqLwogICAgIGlmIChsZW4gPT0gMSAmJiBJU0FMUEhBKCpwKSkKLQlQeV9SRVRVUk5fVFJVRTsKKyAgICAgICAgUHlfUkVUVVJOX1RSVUU7CiAKICAgICAvKiBTcGVjaWFsIGNhc2UgZm9yIGVtcHR5IHN0cmluZ3MgKi8KICAgICBpZiAobGVuID09IDApCi0JUHlfUkVUVVJOX0ZBTFNFOworICAgICAgICBQeV9SRVRVUk5fRkFMU0U7CiAKICAgICBlID0gcCArIGxlbjsKICAgICBmb3IgKDsgcCA8IGU7IHArKykgewotCWlmICghSVNBTFBIQSgqcCkpCi0JICAgIFB5X1JFVFVSTl9GQUxTRTsKKyAgICAgICAgaWYgKCFJU0FMUEhBKCpwKSkKKyAgICAgICAgICAgIFB5X1JFVFVSTl9GQUxTRTsKICAgICB9CiAgICAgUHlfUkVUVVJOX1RSVUU7CiB9CkBAIC0yODksMTYgKzI4OSwxNiBAQAogCiAgICAgLyogU2hvcnRjdXQgZm9yIHNpbmdsZSBjaGFyYWN0ZXIgc3RyaW5ncyAqLwogICAgIGlmIChsZW4gPT0gMSAmJiBJU0FMTlVNKCpwKSkKLQlQeV9SRVRVUk5fVFJVRTsKKyAgICAgICAgUHlfUkVUVVJOX1RSVUU7CiAKICAgICAvKiBTcGVjaWFsIGNhc2UgZm9yIGVtcHR5IHN0cmluZ3MgKi8KICAgICBpZiAobGVuID09IDApCi0JUHlfUkVUVVJOX0ZBTFNFOworICAgICAgICBQeV9SRVRVUk5fRkFMU0U7CiAKICAgICBlID0gcCArIGxlbjsKICAgICBmb3IgKDsgcCA8IGU7IHArKykgewotCWlmICghSVNBTE5VTSgqcCkpCi0JICAgIFB5X1JFVFVSTl9GQUxTRTsKKyAgICAgICAgaWYgKCFJU0FMTlVNKCpwKSkKKyAgICAgICAgICAgIFB5X1JFVFVSTl9GQUxTRTsKICAgICB9CiAgICAgUHlfUkVUVVJOX1RSVUU7CiB9CkBAIC0zMTksMTYgKzMxOSwxNiBAQAogCiAgICAgLyogU2hvcnRjdXQgZm9yIHNpbmdsZSBjaGFyYWN0ZXIgc3RyaW5ncyAqLwogICAgIGlmIChsZW4gPT0gMSAmJiBJU0RJR0lUKCpwKSkKLQlQeV9SRVRVUk5fVFJVRTsKKyAgICAgICAgUHlfUkVUVVJOX1RSVUU7CiAKICAgICAvKiBTcGVjaWFsIGNhc2UgZm9yIGVtcHR5IHN0cmluZ3MgKi8KICAgICBpZiAobGVuID09IDApCi0JUHlfUkVUVVJOX0ZBTFNFOworICAgICAgICBQeV9SRVRVUk5fRkFMU0U7CiAKICAgICBlID0gcCArIGxlbjsKICAgICBmb3IgKDsgcCA8IGU7IHArKykgewotCWlmICghSVNESUdJVCgqcCkpCi0JICAgIFB5X1JFVFVSTl9GQUxTRTsKKyAgICAgICAgaWYgKCFJU0RJR0lUKCpwKSkKKyAgICAgICAgICAgIFB5X1JFVFVSTl9GQUxTRTsKICAgICB9CiAgICAgUHlfUkVUVVJOX1RSVUU7CiB9CkBAIC0zNTAsMTkgKzM1MCwxOSBAQAogCiAgICAgLyogU2hvcnRjdXQgZm9yIHNpbmdsZSBjaGFyYWN0ZXIgc3RyaW5ncyAqLwogICAgIGlmIChsZW4gPT0gMSkKLQlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKElTTE9XRVIoKnApKTsKKyAgICAgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZyhJU0xPV0VSKCpwKSk7CiAKICAgICAvKiBTcGVjaWFsIGNhc2UgZm9yIGVtcHR5IHN0cmluZ3MgKi8KICAgICBpZiAobGVuID09IDApCi0JUHlfUkVUVVJOX0ZBTFNFOworICAgICAgICBQeV9SRVRVUk5fRkFMU0U7CiAKICAgICBlID0gcCArIGxlbjsKICAgICBjYXNlZCA9IDA7CiAgICAgZm9yICg7IHAgPCBlOyBwKyspIHsKLQlpZiAoSVNVUFBFUigqcCkpCi0JICAgIFB5X1JFVFVSTl9GQUxTRTsKLQllbHNlIGlmICghY2FzZWQgJiYgSVNMT1dFUigqcCkpCi0JICAgIGNhc2VkID0gMTsKKyAgICAgICAgaWYgKElTVVBQRVIoKnApKQorICAgICAgICAgICAgUHlfUkVUVVJOX0ZBTFNFOworICAgICAgICBlbHNlIGlmICghY2FzZWQgJiYgSVNMT1dFUigqcCkpCisgICAgICAgICAgICBjYXNlZCA9IDE7CiAgICAgfQogICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoY2FzZWQpOwogfQpAQCAtMzg0LDE5ICszODQsMTkgQEAKIAogICAgIC8qIFNob3J0Y3V0IGZvciBzaW5nbGUgY2hhcmFjdGVyIHN0cmluZ3MgKi8KICAgICBpZiAobGVuID09IDEpCi0JcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZyhJU1VQUEVSKCpwKSk7CisgICAgICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoSVNVUFBFUigqcCkpOwogCiAgICAgLyogU3BlY2lhbCBjYXNlIGZvciBlbXB0eSBzdHJpbmdzICovCiAgICAgaWYgKGxlbiA9PSAwKQotCVB5X1JFVFVSTl9GQUxTRTsKKyAgICAgICAgUHlfUkVUVVJOX0ZBTFNFOwogCiAgICAgZSA9IHAgKyBsZW47CiAgICAgY2FzZWQgPSAwOwogICAgIGZvciAoOyBwIDwgZTsgcCsrKSB7Ci0JaWYgKElTTE9XRVIoKnApKQotCSAgICBQeV9SRVRVUk5fRkFMU0U7Ci0JZWxzZSBpZiAoIWNhc2VkICYmIElTVVBQRVIoKnApKQotCSAgICBjYXNlZCA9IDE7CisgICAgICAgIGlmIChJU0xPV0VSKCpwKSkKKyAgICAgICAgICAgIFB5X1JFVFVSTl9GQUxTRTsKKyAgICAgICAgZWxzZSBpZiAoIWNhc2VkICYmIElTVVBQRVIoKnApKQorICAgICAgICAgICAgY2FzZWQgPSAxOwogICAgIH0KICAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKGNhc2VkKTsKIH0KQEAgLTQyMCwzMiArNDIwLDMyIEBACiAKICAgICAvKiBTaG9ydGN1dCBmb3Igc2luZ2xlIGNoYXJhY3RlciBzdHJpbmdzICovCiAgICAgaWYgKGxlbiA9PSAxKQotCXJldHVybiBQeUJvb2xfRnJvbUxvbmcoSVNVUFBFUigqcCkpOworICAgICAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKElTVVBQRVIoKnApKTsKIAogICAgIC8qIFNwZWNpYWwgY2FzZSBmb3IgZW1wdHkgc3RyaW5ncyAqLwogICAgIGlmIChsZW4gPT0gMCkKLQlQeV9SRVRVUk5fRkFMU0U7CisgICAgICAgIFB5X1JFVFVSTl9GQUxTRTsKIAogICAgIGUgPSBwICsgbGVuOwogICAgIGNhc2VkID0gMDsKICAgICBwcmV2aW91c19pc19jYXNlZCA9IDA7CiAgICAgZm9yICg7IHAgPCBlOyBwKyspIHsKLQlyZWdpc3RlciBjb25zdCB1bnNpZ25lZCBjaGFyIGNoID0gKnA7CisgICAgICAgIHJlZ2lzdGVyIGNvbnN0IHVuc2lnbmVkIGNoYXIgY2ggPSAqcDsKIAotCWlmIChJU1VQUEVSKGNoKSkgewotCSAgICBpZiAocHJldmlvdXNfaXNfY2FzZWQpCi0JCVB5X1JFVFVSTl9GQUxTRTsKLQkgICAgcHJldmlvdXNfaXNfY2FzZWQgPSAxOwotCSAgICBjYXNlZCA9IDE7Ci0JfQotCWVsc2UgaWYgKElTTE9XRVIoY2gpKSB7Ci0JICAgIGlmICghcHJldmlvdXNfaXNfY2FzZWQpCi0JCVB5X1JFVFVSTl9GQUxTRTsKLQkgICAgcHJldmlvdXNfaXNfY2FzZWQgPSAxOwotCSAgICBjYXNlZCA9IDE7Ci0JfQotCWVsc2UKLQkgICAgcHJldmlvdXNfaXNfY2FzZWQgPSAwOworICAgICAgICBpZiAoSVNVUFBFUihjaCkpIHsKKyAgICAgICAgICAgIGlmIChwcmV2aW91c19pc19jYXNlZCkKKyAgICAgICAgICAgICAgICBQeV9SRVRVUk5fRkFMU0U7CisgICAgICAgICAgICBwcmV2aW91c19pc19jYXNlZCA9IDE7CisgICAgICAgICAgICBjYXNlZCA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoSVNMT1dFUihjaCkpIHsKKyAgICAgICAgICAgIGlmICghcHJldmlvdXNfaXNfY2FzZWQpCisgICAgICAgICAgICAgICAgUHlfUkVUVVJOX0ZBTFNFOworICAgICAgICAgICAgcHJldmlvdXNfaXNfY2FzZWQgPSAxOworICAgICAgICAgICAgY2FzZWQgPSAxOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHByZXZpb3VzX2lzX2Nhc2VkID0gMDsKICAgICB9CiAgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZyhjYXNlZCk7CiB9CkBAIC00NTksMjMgKzQ1OSwyMyBAQAogdm9pZAogX1B5X2J5dGVzX2xvd2VyKGNoYXIgKnJlc3VsdCwgY29uc3QgY2hhciAqY3B0ciwgUHlfc3NpemVfdCBsZW4pCiB7Ci0JUHlfc3NpemVfdCBpOworICAgICAgICBQeV9zc2l6ZV90IGk7CiAKICAgICAgICAgLyoKLQluZXdvYmogPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBsZW4pOwotCWlmICghbmV3b2JqKQotCQlyZXR1cm4gTlVMTDsKKyAgICAgICAgbmV3b2JqID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbGVuKTsKKyAgICAgICAgaWYgKCFuZXdvYmopCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlzID0gUHlTdHJpbmdfQVNfU1RSSU5HKG5ld29iaik7CisgICAgICAgIHMgPSBQeVN0cmluZ19BU19TVFJJTkcobmV3b2JqKTsKICAgICAgICAgKi8KIAotCVB5X01FTUNQWShyZXN1bHQsIGNwdHIsIGxlbik7CisgICAgICAgIFB5X01FTUNQWShyZXN1bHQsIGNwdHIsIGxlbik7CiAKLQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJaW50IGMgPSBQeV9DSEFSTUFTSyhyZXN1bHRbaV0pOwotCQlpZiAoSVNVUFBFUihjKSkKLQkJCXJlc3VsdFtpXSA9IFRPTE9XRVIoYyk7Ci0JfQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpbnQgYyA9IFB5X0NIQVJNQVNLKHJlc3VsdFtpXSk7CisgICAgICAgICAgICAgICAgaWYgKElTVVBQRVIoYykpCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRbaV0gPSBUT0xPV0VSKGMpOworICAgICAgICB9CiB9CiAKIApAQCAtNDg3LDIzICs0ODcsMjMgQEAKIHZvaWQKIF9QeV9ieXRlc191cHBlcihjaGFyICpyZXN1bHQsIGNvbnN0IGNoYXIgKmNwdHIsIFB5X3NzaXplX3QgbGVuKQogewotCVB5X3NzaXplX3QgaTsKKyAgICAgICAgUHlfc3NpemVfdCBpOwogCiAgICAgICAgIC8qCi0JbmV3b2JqID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbGVuKTsKLQlpZiAoIW5ld29iaikKLQkJcmV0dXJuIE5VTEw7CisgICAgICAgIG5ld29iaiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGxlbik7CisgICAgICAgIGlmICghbmV3b2JqKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogCi0JcyA9IFB5U3RyaW5nX0FTX1NUUklORyhuZXdvYmopOworICAgICAgICBzID0gUHlTdHJpbmdfQVNfU1RSSU5HKG5ld29iaik7CiAgICAgICAgICovCiAKLQlQeV9NRU1DUFkocmVzdWx0LCBjcHRyLCBsZW4pOworICAgICAgICBQeV9NRU1DUFkocmVzdWx0LCBjcHRyLCBsZW4pOwogCi0JZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCWludCBjID0gUHlfQ0hBUk1BU0socmVzdWx0W2ldKTsKLQkJaWYgKElTTE9XRVIoYykpCi0JCQlyZXN1bHRbaV0gPSBUT1VQUEVSKGMpOwotCX0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgaW50IGMgPSBQeV9DSEFSTUFTSyhyZXN1bHRbaV0pOworICAgICAgICAgICAgICAgIGlmIChJU0xPV0VSKGMpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2ldID0gVE9VUFBFUihjKTsKKyAgICAgICAgfQogfQogCiAKQEAgLTUxNiwyOSArNTE2LDI5IEBACiB2b2lkCiBfUHlfYnl0ZXNfdGl0bGUoY2hhciAqcmVzdWx0LCBjaGFyICpzLCBQeV9zc2l6ZV90IGxlbikKIHsKLQlQeV9zc2l6ZV90IGk7Ci0JaW50IHByZXZpb3VzX2lzX2Nhc2VkID0gMDsKKyAgICAgICAgUHlfc3NpemVfdCBpOworICAgICAgICBpbnQgcHJldmlvdXNfaXNfY2FzZWQgPSAwOwogCiAgICAgICAgIC8qCi0JbmV3b2JqID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbGVuKTsKLQlpZiAobmV3b2JqID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXNfbmV3ID0gUHlTdHJpbmdfQXNTdHJpbmcobmV3b2JqKTsKKyAgICAgICAgbmV3b2JqID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbGVuKTsKKyAgICAgICAgaWYgKG5ld29iaiA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBzX25ldyA9IFB5U3RyaW5nX0FzU3RyaW5nKG5ld29iaik7CiAgICAgICAgICovCi0JZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCWludCBjID0gUHlfQ0hBUk1BU0soKnMrKyk7Ci0JCWlmIChJU0xPV0VSKGMpKSB7Ci0JCQlpZiAoIXByZXZpb3VzX2lzX2Nhc2VkKQotCQkJICAgIGMgPSBUT1VQUEVSKGMpOwotCQkJcHJldmlvdXNfaXNfY2FzZWQgPSAxOwotCQl9IGVsc2UgaWYgKElTVVBQRVIoYykpIHsKLQkJCWlmIChwcmV2aW91c19pc19jYXNlZCkKLQkJCSAgICBjID0gVE9MT1dFUihjKTsKLQkJCXByZXZpb3VzX2lzX2Nhc2VkID0gMTsKLQkJfSBlbHNlCi0JCQlwcmV2aW91c19pc19jYXNlZCA9IDA7Ci0JCSpyZXN1bHQrKyA9IGM7Ci0JfQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpbnQgYyA9IFB5X0NIQVJNQVNLKCpzKyspOworICAgICAgICAgICAgICAgIGlmIChJU0xPV0VSKGMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXByZXZpb3VzX2lzX2Nhc2VkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSBUT1VQUEVSKGMpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNfaXNfY2FzZWQgPSAxOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoSVNVUFBFUihjKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZpb3VzX2lzX2Nhc2VkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSBUT0xPV0VSKGMpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNfaXNfY2FzZWQgPSAxOworICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNfaXNfY2FzZWQgPSAwOworICAgICAgICAgICAgICAgICpyZXN1bHQrKyA9IGM7CisgICAgICAgIH0KIH0KIAogCkBAIC01NTAsMzAgKzU1MCwzMCBAQAogdm9pZAogX1B5X2J5dGVzX2NhcGl0YWxpemUoY2hhciAqcmVzdWx0LCBjaGFyICpzLCBQeV9zc2l6ZV90IGxlbikKIHsKLQlQeV9zc2l6ZV90IGk7CisgICAgICAgIFB5X3NzaXplX3QgaTsKIAogICAgICAgICAvKgotCW5ld29iaiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGxlbik7Ci0JaWYgKG5ld29iaiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlzX25ldyA9IFB5U3RyaW5nX0FzU3RyaW5nKG5ld29iaik7CisgICAgICAgIG5ld29iaiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGxlbik7CisgICAgICAgIGlmIChuZXdvYmogPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgc19uZXcgPSBQeVN0cmluZ19Bc1N0cmluZyhuZXdvYmopOwogICAgICAgICAqLwotCWlmICgwIDwgbGVuKSB7Ci0JCWludCBjID0gUHlfQ0hBUk1BU0soKnMrKyk7Ci0JCWlmIChJU0xPV0VSKGMpKQotCQkJKnJlc3VsdCA9IFRPVVBQRVIoYyk7Ci0JCWVsc2UKLQkJCSpyZXN1bHQgPSBjOwotCQlyZXN1bHQrKzsKLQl9Ci0JZm9yIChpID0gMTsgaSA8IGxlbjsgaSsrKSB7Ci0JCWludCBjID0gUHlfQ0hBUk1BU0soKnMrKyk7Ci0JCWlmIChJU1VQUEVSKGMpKQotCQkJKnJlc3VsdCA9IFRPTE9XRVIoYyk7Ci0JCWVsc2UKLQkJCSpyZXN1bHQgPSBjOwotCQlyZXN1bHQrKzsKLQl9CisgICAgICAgIGlmICgwIDwgbGVuKSB7CisgICAgICAgICAgICAgICAgaW50IGMgPSBQeV9DSEFSTUFTSygqcysrKTsKKyAgICAgICAgICAgICAgICBpZiAoSVNMT1dFUihjKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICpyZXN1bHQgPSBUT1VQUEVSKGMpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICpyZXN1bHQgPSBjOworICAgICAgICAgICAgICAgIHJlc3VsdCsrOworICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IDE7IGkgPCBsZW47IGkrKykgeworICAgICAgICAgICAgICAgIGludCBjID0gUHlfQ0hBUk1BU0soKnMrKyk7CisgICAgICAgICAgICAgICAgaWYgKElTVVBQRVIoYykpCisgICAgICAgICAgICAgICAgICAgICAgICAqcmVzdWx0ID0gVE9MT1dFUihjKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAqcmVzdWx0ID0gYzsKKyAgICAgICAgICAgICAgICByZXN1bHQrKzsKKyAgICAgICAgfQogfQogCiAKQEAgLTU4NiwyNSArNTg2LDI1IEBACiB2b2lkCiBfUHlfYnl0ZXNfc3dhcGNhc2UoY2hhciAqcmVzdWx0LCBjaGFyICpzLCBQeV9zc2l6ZV90IGxlbikKIHsKLQlQeV9zc2l6ZV90IGk7CisgICAgICAgIFB5X3NzaXplX3QgaTsKIAogICAgICAgICAvKgotCW5ld29iaiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGxlbik7Ci0JaWYgKG5ld29iaiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlzX25ldyA9IFB5U3RyaW5nX0FzU3RyaW5nKG5ld29iaik7CisgICAgICAgIG5ld29iaiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGxlbik7CisgICAgICAgIGlmIChuZXdvYmogPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgc19uZXcgPSBQeVN0cmluZ19Bc1N0cmluZyhuZXdvYmopOwogICAgICAgICAqLwotCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQlpbnQgYyA9IFB5X0NIQVJNQVNLKCpzKyspOwotCQlpZiAoSVNMT1dFUihjKSkgewotCQkJKnJlc3VsdCA9IFRPVVBQRVIoYyk7Ci0JCX0KLQkJZWxzZSBpZiAoSVNVUFBFUihjKSkgewotCQkJKnJlc3VsdCA9IFRPTE9XRVIoYyk7Ci0JCX0KLQkJZWxzZQotCQkJKnJlc3VsdCA9IGM7Ci0JCXJlc3VsdCsrOwotCX0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgaW50IGMgPSBQeV9DSEFSTUFTSygqcysrKTsKKyAgICAgICAgICAgICAgICBpZiAoSVNMT1dFUihjKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgKnJlc3VsdCA9IFRPVVBQRVIoYyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKElTVVBQRVIoYykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICpyZXN1bHQgPSBUT0xPV0VSKGMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAqcmVzdWx0ID0gYzsKKyAgICAgICAgICAgICAgICByZXN1bHQrKzsKKyAgICAgICAgfQogfQogCmRpZmYgLS1naXQgYS9PYmplY3RzL2NlbGxvYmplY3QuYyBiL09iamVjdHMvY2VsbG9iamVjdC5jCmluZGV4IDRlMGJjZjguLmQwZjZjZGEgMTAwNjQ0Ci0tLSBhL09iamVjdHMvY2VsbG9iamVjdC5jCisrKyBiL09iamVjdHMvY2VsbG9iamVjdC5jCkBAIC01LDE0MSArNSwxNDEgQEAKIFB5T2JqZWN0ICoKIFB5Q2VsbF9OZXcoUHlPYmplY3QgKm9iaikKIHsKLQlQeUNlbGxPYmplY3QgKm9wOworICAgIFB5Q2VsbE9iamVjdCAqb3A7CiAKLQlvcCA9IChQeUNlbGxPYmplY3QgKilQeU9iamVjdF9HQ19OZXcoUHlDZWxsT2JqZWN0LCAmUHlDZWxsX1R5cGUpOwotCWlmIChvcCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlvcC0+b2JfcmVmID0gb2JqOwotCVB5X1hJTkNSRUYob2JqKTsKKyAgICBvcCA9IChQeUNlbGxPYmplY3QgKilQeU9iamVjdF9HQ19OZXcoUHlDZWxsT2JqZWN0LCAmUHlDZWxsX1R5cGUpOworICAgIGlmIChvcCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBvcC0+b2JfcmVmID0gb2JqOworICAgIFB5X1hJTkNSRUYob2JqKTsKIAotCV9QeU9iamVjdF9HQ19UUkFDSyhvcCk7Ci0JcmV0dXJuIChQeU9iamVjdCAqKW9wOworICAgIF9QeU9iamVjdF9HQ19UUkFDSyhvcCk7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKW9wOwogfQogCiBQeU9iamVjdCAqCiBQeUNlbGxfR2V0KFB5T2JqZWN0ICpvcCkKIHsKLQlpZiAoIVB5Q2VsbF9DaGVjayhvcCkpIHsKLQkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlQeV9YSU5DUkVGKCgoUHlDZWxsT2JqZWN0KilvcCktPm9iX3JlZik7Ci0JcmV0dXJuIFB5Q2VsbF9HRVQob3ApOworICAgIGlmICghUHlDZWxsX0NoZWNrKG9wKSkgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5X1hJTkNSRUYoKChQeUNlbGxPYmplY3QqKW9wKS0+b2JfcmVmKTsKKyAgICByZXR1cm4gUHlDZWxsX0dFVChvcCk7CiB9CiAKIGludAogUHlDZWxsX1NldChQeU9iamVjdCAqb3AsIFB5T2JqZWN0ICpvYmopCiB7Ci0JUHlPYmplY3QqIG9sZG9iajsKLQlpZiAoIVB5Q2VsbF9DaGVjayhvcCkpIHsKLQkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0Jb2xkb2JqID0gUHlDZWxsX0dFVChvcCk7Ci0JUHlfWElOQ1JFRihvYmopOwotCVB5Q2VsbF9TRVQob3AsIG9iaik7Ci0JUHlfWERFQ1JFRihvbGRvYmopOwotCXJldHVybiAwOworICAgIFB5T2JqZWN0KiBvbGRvYmo7CisgICAgaWYgKCFQeUNlbGxfQ2hlY2sob3ApKSB7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG9sZG9iaiA9IFB5Q2VsbF9HRVQob3ApOworICAgIFB5X1hJTkNSRUYob2JqKTsKKyAgICBQeUNlbGxfU0VUKG9wLCBvYmopOworICAgIFB5X1hERUNSRUYob2xkb2JqKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQKIGNlbGxfZGVhbGxvYyhQeUNlbGxPYmplY3QgKm9wKQogewotCV9QeU9iamVjdF9HQ19VTlRSQUNLKG9wKTsKLQlQeV9YREVDUkVGKG9wLT5vYl9yZWYpOwotCVB5T2JqZWN0X0dDX0RlbChvcCk7CisgICAgX1B5T2JqZWN0X0dDX1VOVFJBQ0sob3ApOworICAgIFB5X1hERUNSRUYob3AtPm9iX3JlZik7CisgICAgUHlPYmplY3RfR0NfRGVsKG9wKTsKIH0KIAogc3RhdGljIGludAogY2VsbF9jb21wYXJlKFB5Q2VsbE9iamVjdCAqYSwgUHlDZWxsT2JqZWN0ICpiKQogewotCS8qIFB5M0sgd2FybmluZyBmb3IgY29tcGFyaXNvbnMgICovCi0JaWYgKFB5RXJyX1dhcm5QeTNrKCJjZWxsIGNvbXBhcmlzb25zIG5vdCBzdXBwb3J0ZWQgaW4gMy54IiwKLQkJCSAgIDEpIDwgMCkgewotCQlyZXR1cm4gLTI7Ci0JfQorICAgIC8qIFB5M0sgd2FybmluZyBmb3IgY29tcGFyaXNvbnMgICovCisgICAgaWYgKFB5RXJyX1dhcm5QeTNrKCJjZWxsIGNvbXBhcmlzb25zIG5vdCBzdXBwb3J0ZWQgaW4gMy54IiwKKyAgICAgICAgICAgICAgICAgICAgICAgMSkgPCAwKSB7CisgICAgICAgIHJldHVybiAtMjsKKyAgICB9CiAKLQlpZiAoYS0+b2JfcmVmID09IE5VTEwpIHsKLQkJaWYgKGItPm9iX3JlZiA9PSBOVUxMKQotCQkJcmV0dXJuIDA7Ci0JCXJldHVybiAtMTsKLQl9IGVsc2UgaWYgKGItPm9iX3JlZiA9PSBOVUxMKQotCQlyZXR1cm4gMTsKLQlyZXR1cm4gUHlPYmplY3RfQ29tcGFyZShhLT5vYl9yZWYsIGItPm9iX3JlZik7CisgICAgaWYgKGEtPm9iX3JlZiA9PSBOVUxMKSB7CisgICAgICAgIGlmIChiLT5vYl9yZWYgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICByZXR1cm4gLTE7CisgICAgfSBlbHNlIGlmIChiLT5vYl9yZWYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgcmV0dXJuIFB5T2JqZWN0X0NvbXBhcmUoYS0+b2JfcmVmLCBiLT5vYl9yZWYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY2VsbF9yZXByKFB5Q2VsbE9iamVjdCAqb3ApCiB7Ci0JaWYgKG9wLT5vYl9yZWYgPT0gTlVMTCkKLQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21Gb3JtYXQoIjxjZWxsIGF0ICVwOiBlbXB0eT4iLCBvcCk7CisgICAgaWYgKG9wLT5vYl9yZWYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21Gb3JtYXQoIjxjZWxsIGF0ICVwOiBlbXB0eT4iLCBvcCk7CiAKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbUZvcm1hdCgiPGNlbGwgYXQgJXA6ICUuODBzIG9iamVjdCBhdCAlcD4iLAotCQkJCSAgIG9wLCBvcC0+b2JfcmVmLT5vYl90eXBlLT50cF9uYW1lLAotCQkJCSAgIG9wLT5vYl9yZWYpOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tRm9ybWF0KCI8Y2VsbCBhdCAlcDogJS44MHMgb2JqZWN0IGF0ICVwPiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3AsIG9wLT5vYl9yZWYtPm9iX3R5cGUtPnRwX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3AtPm9iX3JlZik7CiB9CiAKIHN0YXRpYyBpbnQKIGNlbGxfdHJhdmVyc2UoUHlDZWxsT2JqZWN0ICpvcCwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JUHlfVklTSVQob3AtPm9iX3JlZik7Ci0JcmV0dXJuIDA7CisgICAgUHlfVklTSVQob3AtPm9iX3JlZik7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIGNlbGxfY2xlYXIoUHlDZWxsT2JqZWN0ICpvcCkKIHsKLQlQeV9DTEVBUihvcC0+b2JfcmVmKTsKLQlyZXR1cm4gMDsKKyAgICBQeV9DTEVBUihvcC0+b2JfcmVmKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNlbGxfZ2V0X2NvbnRlbnRzKFB5Q2VsbE9iamVjdCAqb3AsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JaWYgKG9wLT5vYl9yZWYgPT0gTlVMTCkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiQ2VsbCBpcyBlbXB0eSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JUHlfSU5DUkVGKG9wLT5vYl9yZWYpOwotCXJldHVybiBvcC0+b2JfcmVmOworICAgIGlmIChvcC0+b2JfcmVmID09IE5VTEwpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIkNlbGwgaXMgZW1wdHkiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5X0lOQ1JFRihvcC0+b2JfcmVmKTsKKyAgICByZXR1cm4gb3AtPm9iX3JlZjsKIH0KIAogc3RhdGljIFB5R2V0U2V0RGVmIGNlbGxfZ2V0c2V0bGlzdFtdID0gewotCXsiY2VsbF9jb250ZW50cyIsIChnZXR0ZXIpY2VsbF9nZXRfY29udGVudHMsIE5VTEx9LAotCXtOVUxMfSAvKiBzZW50aW5lbCAqLworICAgIHsiY2VsbF9jb250ZW50cyIsIChnZXR0ZXIpY2VsbF9nZXRfY29udGVudHMsIE5VTEx9LAorICAgIHtOVUxMfSAvKiBzZW50aW5lbCAqLwogfTsKIAogUHlUeXBlT2JqZWN0IFB5Q2VsbF9UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCi0JImNlbGwiLAotCXNpemVvZihQeUNlbGxPYmplY3QpLAotCTAsCi0JKGRlc3RydWN0b3IpY2VsbF9kZWFsbG9jLCAgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KLQkwLAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0ciAqLwotCShjbXBmdW5jKWNlbGxfY29tcGFyZSwJCQkvKiB0cF9jb21wYXJlICovCi0JKHJlcHJmdW5jKWNlbGxfcmVwciwJCQkvKiB0cF9yZXByICovCi0JMCwJCQkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDLC8qIHRwX2ZsYWdzICovCi0gCTAsCQkJCQkvKiB0cF9kb2MgKi8KLSAJKHRyYXZlcnNlcHJvYyljZWxsX3RyYXZlcnNlLAkJLyogdHBfdHJhdmVyc2UgKi8KLSAJKGlucXVpcnkpY2VsbF9jbGVhciwJCQkvKiB0cF9jbGVhciAqLwotCTAsCQkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCTAsIAkJCQkJLyogdHBfaXRlciAqLwotCTAsCQkJCQkvKiB0cF9pdGVybmV4dCAqLwotCTAsCQkJCQkvKiB0cF9tZXRob2RzICovCi0JMCwJCQkJCS8qIHRwX21lbWJlcnMgKi8KLQljZWxsX2dldHNldGxpc3QsCQkJLyogdHBfZ2V0c2V0ICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKKyAgICAiY2VsbCIsCisgICAgc2l6ZW9mKFB5Q2VsbE9iamVjdCksCisgICAgMCwKKyAgICAoZGVzdHJ1Y3RvciljZWxsX2RlYWxsb2MsICAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIChjbXBmdW5jKWNlbGxfY29tcGFyZSwgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIChyZXByZnVuYyljZWxsX3JlcHIsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQywvKiB0cF9mbGFncyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgKHRyYXZlcnNlcHJvYyljZWxsX3RyYXZlcnNlLCAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIChpbnF1aXJ5KWNlbGxfY2xlYXIsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICBjZWxsX2dldHNldGxpc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLwogfTsKZGlmZiAtLWdpdCBhL09iamVjdHMvY2xhc3NvYmplY3QuYyBiL09iamVjdHMvY2xhc3NvYmplY3QuYwppbmRleCA3ZDNkMDQ4Li44YzMzODIzIDEwMDY0NAotLS0gYS9PYmplY3RzL2NsYXNzb2JqZWN0LmMKKysrIGIvT2JqZWN0cy9jbGFzc29iamVjdC5jCkBAIC0xOCw3ICsxOCw3IEBACiAKIC8qIEZvcndhcmQgKi8KIHN0YXRpYyBQeU9iamVjdCAqY2xhc3NfbG9va3VwKFB5Q2xhc3NPYmplY3QgKiwgUHlPYmplY3QgKiwKLQkJCSAgICAgIFB5Q2xhc3NPYmplY3QgKiopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlDbGFzc09iamVjdCAqKik7CiBzdGF0aWMgUHlPYmplY3QgKmluc3RhbmNlX2dldGF0dHIxKFB5SW5zdGFuY2VPYmplY3QgKiwgUHlPYmplY3QgKik7CiBzdGF0aWMgUHlPYmplY3QgKmluc3RhbmNlX2dldGF0dHIyKFB5SW5zdGFuY2VPYmplY3QgKiwgUHlPYmplY3QgKik7CiAKQEAgLTI5LDEzOSArMjksMTM5IEBACiBQeUNsYXNzX05ldyhQeU9iamVjdCAqYmFzZXMsIFB5T2JqZWN0ICpkaWN0LCBQeU9iamVjdCAqbmFtZSkKICAgICAgLyogYmFzZXMgaXMgTlVMTCBvciB0dXBsZSBvZiBjbGFzc29iamVjdHMhICovCiB7Ci0JUHlDbGFzc09iamVjdCAqb3AsICpkdW1teTsKLQlzdGF0aWMgUHlPYmplY3QgKmRvY3N0ciwgKm1vZHN0ciwgKm5hbWVzdHI7Ci0JaWYgKGRvY3N0ciA9PSBOVUxMKSB7Ci0JCWRvY3N0cj0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19kb2NfXyIpOwotCQlpZiAoZG9jc3RyID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKG1vZHN0ciA9PSBOVUxMKSB7Ci0JCW1vZHN0cj0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19tb2R1bGVfXyIpOwotCQlpZiAobW9kc3RyID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKG5hbWVzdHIgPT0gTlVMTCkgewotCQluYW1lc3RyPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX25hbWVfXyIpOwotCQlpZiAobmFtZXN0ciA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChuYW1lID09IE5VTEwgfHwgIVB5U3RyaW5nX0NoZWNrKG5hbWUpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJIlB5Q2xhc3NfTmV3OiBuYW1lIG11c3QgYmUgYSBzdHJpbmciKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChkaWN0ID09IE5VTEwgfHwgIVB5RGljdF9DaGVjayhkaWN0KSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJQeUNsYXNzX05ldzogZGljdCBtdXN0IGJlIGEgZGljdGlvbmFyeSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKFB5RGljdF9HZXRJdGVtKGRpY3QsIGRvY3N0cikgPT0gTlVMTCkgewotCQlpZiAoUHlEaWN0X1NldEl0ZW0oZGljdCwgZG9jc3RyLCBQeV9Ob25lKSA8IDApCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKFB5RGljdF9HZXRJdGVtKGRpY3QsIG1vZHN0cikgPT0gTlVMTCkgewotCQlQeU9iamVjdCAqZ2xvYmFscyA9IFB5RXZhbF9HZXRHbG9iYWxzKCk7Ci0JCWlmIChnbG9iYWxzICE9IE5VTEwpIHsKLQkJCVB5T2JqZWN0ICptb2RuYW1lID0gUHlEaWN0X0dldEl0ZW0oZ2xvYmFscywgbmFtZXN0cik7Ci0JCQlpZiAobW9kbmFtZSAhPSBOVUxMKSB7Ci0JCQkJaWYgKFB5RGljdF9TZXRJdGVtKGRpY3QsIG1vZHN0ciwgbW9kbmFtZSkgPCAwKQotCQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJfQotCX0KLQlpZiAoYmFzZXMgPT0gTlVMTCkgewotCQliYXNlcyA9IFB5VHVwbGVfTmV3KDApOwotCQlpZiAoYmFzZXMgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCX0KLQllbHNlIHsKLQkJUHlfc3NpemVfdCBpLCBuOwotCQlQeU9iamVjdCAqYmFzZTsKLQkJaWYgKCFQeVR1cGxlX0NoZWNrKGJhc2VzKSkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkJIlB5Q2xhc3NfTmV3OiBiYXNlcyBtdXN0IGJlIGEgdHVwbGUiKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCW4gPSBQeVR1cGxlX1NpemUoYmFzZXMpOwotCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCQliYXNlID0gUHlUdXBsZV9HRVRfSVRFTShiYXNlcywgaSk7Ci0JCQlpZiAoIVB5Q2xhc3NfQ2hlY2soYmFzZSkpIHsKLQkJCQlpZiAoUHlDYWxsYWJsZV9DaGVjaygKLQkJCQkJKFB5T2JqZWN0ICopIGJhc2UtPm9iX3R5cGUpKQotCQkJCQlyZXR1cm4gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncygKLQkJCQkJCShQeU9iamVjdCAqKSBiYXNlLT5vYl90eXBlLAotCQkJCQkJbmFtZSwgYmFzZXMsIGRpY3QsIE5VTEwpOwotCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJCSJQeUNsYXNzX05ldzogYmFzZSBtdXN0IGJlIGEgY2xhc3MiKTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJfQotCQlQeV9JTkNSRUYoYmFzZXMpOwotCX0KKyAgICBQeUNsYXNzT2JqZWN0ICpvcCwgKmR1bW15OworICAgIHN0YXRpYyBQeU9iamVjdCAqZG9jc3RyLCAqbW9kc3RyLCAqbmFtZXN0cjsKKyAgICBpZiAoZG9jc3RyID09IE5VTEwpIHsKKyAgICAgICAgZG9jc3RyPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2RvY19fIik7CisgICAgICAgIGlmIChkb2NzdHIgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAobW9kc3RyID09IE5VTEwpIHsKKyAgICAgICAgbW9kc3RyPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX21vZHVsZV9fIik7CisgICAgICAgIGlmIChtb2RzdHIgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAobmFtZXN0ciA9PSBOVUxMKSB7CisgICAgICAgIG5hbWVzdHI9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fbmFtZV9fIik7CisgICAgICAgIGlmIChuYW1lc3RyID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKG5hbWUgPT0gTlVMTCB8fCAhUHlTdHJpbmdfQ2hlY2sobmFtZSkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJQeUNsYXNzX05ldzogbmFtZSBtdXN0IGJlIGEgc3RyaW5nIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoZGljdCA9PSBOVUxMIHx8ICFQeURpY3RfQ2hlY2soZGljdCkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJQeUNsYXNzX05ldzogZGljdCBtdXN0IGJlIGEgZGljdGlvbmFyeSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKFB5RGljdF9HZXRJdGVtKGRpY3QsIGRvY3N0cikgPT0gTlVMTCkgeworICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW0oZGljdCwgZG9jc3RyLCBQeV9Ob25lKSA8IDApCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKFB5RGljdF9HZXRJdGVtKGRpY3QsIG1vZHN0cikgPT0gTlVMTCkgeworICAgICAgICBQeU9iamVjdCAqZ2xvYmFscyA9IFB5RXZhbF9HZXRHbG9iYWxzKCk7CisgICAgICAgIGlmIChnbG9iYWxzICE9IE5VTEwpIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICptb2RuYW1lID0gUHlEaWN0X0dldEl0ZW0oZ2xvYmFscywgbmFtZXN0cik7CisgICAgICAgICAgICBpZiAobW9kbmFtZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtKGRpY3QsIG1vZHN0ciwgbW9kbmFtZSkgPCAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoYmFzZXMgPT0gTlVMTCkgeworICAgICAgICBiYXNlcyA9IFB5VHVwbGVfTmV3KDApOworICAgICAgICBpZiAoYmFzZXMgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgUHlfc3NpemVfdCBpLCBuOworICAgICAgICBQeU9iamVjdCAqYmFzZTsKKyAgICAgICAgaWYgKCFQeVR1cGxlX0NoZWNrKGJhc2VzKSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHlDbGFzc19OZXc6IGJhc2VzIG11c3QgYmUgYSB0dXBsZSIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgbiA9IFB5VHVwbGVfU2l6ZShiYXNlcyk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICAgIGJhc2UgPSBQeVR1cGxlX0dFVF9JVEVNKGJhc2VzLCBpKTsKKyAgICAgICAgICAgIGlmICghUHlDbGFzc19DaGVjayhiYXNlKSkgeworICAgICAgICAgICAgICAgIGlmIChQeUNhbGxhYmxlX0NoZWNrKAorICAgICAgICAgICAgICAgICAgICAoUHlPYmplY3QgKikgYmFzZS0+b2JfdHlwZSkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKAorICAgICAgICAgICAgICAgICAgICAgICAgKFB5T2JqZWN0ICopIGJhc2UtPm9iX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBiYXNlcywgZGljdCwgTlVMTCk7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgIlB5Q2xhc3NfTmV3OiBiYXNlIG11c3QgYmUgYSBjbGFzcyIpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFB5X0lOQ1JFRihiYXNlcyk7CisgICAgfQogCi0JaWYgKGdldGF0dHJzdHIgPT0gTlVMTCkgewotCQlnZXRhdHRyc3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19nZXRhdHRyX18iKTsKLQkJaWYgKGdldGF0dHJzdHIgPT0gTlVMTCkKLQkJCWdvdG8gYWxsb2NfZXJyb3I7Ci0JCXNldGF0dHJzdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX3NldGF0dHJfXyIpOwotCQlpZiAoc2V0YXR0cnN0ciA9PSBOVUxMKQotCQkJZ290byBhbGxvY19lcnJvcjsKLQkJZGVsYXR0cnN0ciA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fZGVsYXR0cl9fIik7Ci0JCWlmIChkZWxhdHRyc3RyID09IE5VTEwpCi0JCQlnb3RvIGFsbG9jX2Vycm9yOwotCX0KKyAgICBpZiAoZ2V0YXR0cnN0ciA9PSBOVUxMKSB7CisgICAgICAgIGdldGF0dHJzdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2dldGF0dHJfXyIpOworICAgICAgICBpZiAoZ2V0YXR0cnN0ciA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBhbGxvY19lcnJvcjsKKyAgICAgICAgc2V0YXR0cnN0ciA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fc2V0YXR0cl9fIik7CisgICAgICAgIGlmIChzZXRhdHRyc3RyID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGFsbG9jX2Vycm9yOworICAgICAgICBkZWxhdHRyc3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19kZWxhdHRyX18iKTsKKyAgICAgICAgaWYgKGRlbGF0dHJzdHIgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gYWxsb2NfZXJyb3I7CisgICAgfQogCi0Jb3AgPSBQeU9iamVjdF9HQ19OZXcoUHlDbGFzc09iamVjdCwgJlB5Q2xhc3NfVHlwZSk7Ci0JaWYgKG9wID09IE5VTEwpIHsKKyAgICBvcCA9IFB5T2JqZWN0X0dDX05ldyhQeUNsYXNzT2JqZWN0LCAmUHlDbGFzc19UeXBlKTsKKyAgICBpZiAob3AgPT0gTlVMTCkgewogYWxsb2NfZXJyb3I6Ci0JCVB5X0RFQ1JFRihiYXNlcyk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlvcC0+Y2xfYmFzZXMgPSBiYXNlczsKLQlQeV9JTkNSRUYoZGljdCk7Ci0Jb3AtPmNsX2RpY3QgPSBkaWN0OwotCVB5X1hJTkNSRUYobmFtZSk7Ci0Jb3AtPmNsX25hbWUgPSBuYW1lOworICAgICAgICBQeV9ERUNSRUYoYmFzZXMpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgb3AtPmNsX2Jhc2VzID0gYmFzZXM7CisgICAgUHlfSU5DUkVGKGRpY3QpOworICAgIG9wLT5jbF9kaWN0ID0gZGljdDsKKyAgICBQeV9YSU5DUkVGKG5hbWUpOworICAgIG9wLT5jbF9uYW1lID0gbmFtZTsKIAotCW9wLT5jbF9nZXRhdHRyID0gY2xhc3NfbG9va3VwKG9wLCBnZXRhdHRyc3RyLCAmZHVtbXkpOwotCW9wLT5jbF9zZXRhdHRyID0gY2xhc3NfbG9va3VwKG9wLCBzZXRhdHRyc3RyLCAmZHVtbXkpOwotCW9wLT5jbF9kZWxhdHRyID0gY2xhc3NfbG9va3VwKG9wLCBkZWxhdHRyc3RyLCAmZHVtbXkpOwotCVB5X1hJTkNSRUYob3AtPmNsX2dldGF0dHIpOwotCVB5X1hJTkNSRUYob3AtPmNsX3NldGF0dHIpOwotCVB5X1hJTkNSRUYob3AtPmNsX2RlbGF0dHIpOwotCV9QeU9iamVjdF9HQ19UUkFDSyhvcCk7Ci0JcmV0dXJuIChQeU9iamVjdCAqKSBvcDsKKyAgICBvcC0+Y2xfZ2V0YXR0ciA9IGNsYXNzX2xvb2t1cChvcCwgZ2V0YXR0cnN0ciwgJmR1bW15KTsKKyAgICBvcC0+Y2xfc2V0YXR0ciA9IGNsYXNzX2xvb2t1cChvcCwgc2V0YXR0cnN0ciwgJmR1bW15KTsKKyAgICBvcC0+Y2xfZGVsYXR0ciA9IGNsYXNzX2xvb2t1cChvcCwgZGVsYXR0cnN0ciwgJmR1bW15KTsKKyAgICBQeV9YSU5DUkVGKG9wLT5jbF9nZXRhdHRyKTsKKyAgICBQeV9YSU5DUkVGKG9wLT5jbF9zZXRhdHRyKTsKKyAgICBQeV9YSU5DUkVGKG9wLT5jbF9kZWxhdHRyKTsKKyAgICBfUHlPYmplY3RfR0NfVFJBQ0sob3ApOworICAgIHJldHVybiAoUHlPYmplY3QgKikgb3A7CiB9CiAKIFB5T2JqZWN0ICoKIFB5TWV0aG9kX0Z1bmN0aW9uKFB5T2JqZWN0ICppbSkKIHsKLQlpZiAoIVB5TWV0aG9kX0NoZWNrKGltKSkgewotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiAoKFB5TWV0aG9kT2JqZWN0ICopaW0pLT5pbV9mdW5jOworICAgIGlmICghUHlNZXRob2RfQ2hlY2soaW0pKSB7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuICgoUHlNZXRob2RPYmplY3QgKilpbSktPmltX2Z1bmM7CiB9CiAKIFB5T2JqZWN0ICoKIFB5TWV0aG9kX1NlbGYoUHlPYmplY3QgKmltKQogewotCWlmICghUHlNZXRob2RfQ2hlY2soaW0pKSB7Ci0JCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuICgoUHlNZXRob2RPYmplY3QgKilpbSktPmltX3NlbGY7CisgICAgaWYgKCFQeU1ldGhvZF9DaGVjayhpbSkpIHsKKyAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gKChQeU1ldGhvZE9iamVjdCAqKWltKS0+aW1fc2VsZjsKIH0KIAogUHlPYmplY3QgKgogUHlNZXRob2RfQ2xhc3MoUHlPYmplY3QgKmltKQogewotCWlmICghUHlNZXRob2RfQ2hlY2soaW0pKSB7Ci0JCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuICgoUHlNZXRob2RPYmplY3QgKilpbSktPmltX2NsYXNzOworICAgIGlmICghUHlNZXRob2RfQ2hlY2soaW0pKSB7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuICgoUHlNZXRob2RPYmplY3QgKilpbSktPmltX2NsYXNzOwogfQogCiBQeURvY19TVFJWQVIoY2xhc3NfZG9jLApAQCAtMTczLDEzICsxNzMsMTMgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBjbGFzc19uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JUHlPYmplY3QgKm5hbWUsICpiYXNlcywgKmRpY3Q7Ci0Jc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJuYW1lIiwgImJhc2VzIiwgImRpY3QiLCAwfTsKKyAgICBQeU9iamVjdCAqbmFtZSwgKmJhc2VzLCAqZGljdDsKKyAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7Im5hbWUiLCAiYmFzZXMiLCAiZGljdCIsIDB9OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgIlNPTyIsIGt3bGlzdCwKLQkJCQkJICZuYW1lLCAmYmFzZXMsICZkaWN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIFB5Q2xhc3NfTmV3KGJhc2VzLCBkaWN0LCBuYW1lKTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAiU09PIiwga3dsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lLCAmYmFzZXMsICZkaWN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFB5Q2xhc3NfTmV3KGJhc2VzLCBkaWN0LCBuYW1lKTsKIH0KIAogLyogQ2xhc3MgbWV0aG9kcyAqLwpAQCAtMTg3LDMxMyArMTg3LDMxMyBAQAogc3RhdGljIHZvaWQKIGNsYXNzX2RlYWxsb2MoUHlDbGFzc09iamVjdCAqb3ApCiB7Ci0JX1B5T2JqZWN0X0dDX1VOVFJBQ0sob3ApOwotCVB5X0RFQ1JFRihvcC0+Y2xfYmFzZXMpOwotCVB5X0RFQ1JFRihvcC0+Y2xfZGljdCk7Ci0JUHlfWERFQ1JFRihvcC0+Y2xfbmFtZSk7Ci0JUHlfWERFQ1JFRihvcC0+Y2xfZ2V0YXR0cik7Ci0JUHlfWERFQ1JFRihvcC0+Y2xfc2V0YXR0cik7Ci0JUHlfWERFQ1JFRihvcC0+Y2xfZGVsYXR0cik7Ci0JUHlPYmplY3RfR0NfRGVsKG9wKTsKKyAgICBfUHlPYmplY3RfR0NfVU5UUkFDSyhvcCk7CisgICAgUHlfREVDUkVGKG9wLT5jbF9iYXNlcyk7CisgICAgUHlfREVDUkVGKG9wLT5jbF9kaWN0KTsKKyAgICBQeV9YREVDUkVGKG9wLT5jbF9uYW1lKTsKKyAgICBQeV9YREVDUkVGKG9wLT5jbF9nZXRhdHRyKTsKKyAgICBQeV9YREVDUkVGKG9wLT5jbF9zZXRhdHRyKTsKKyAgICBQeV9YREVDUkVGKG9wLT5jbF9kZWxhdHRyKTsKKyAgICBQeU9iamVjdF9HQ19EZWwob3ApOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY2xhc3NfbG9va3VwKFB5Q2xhc3NPYmplY3QgKmNwLCBQeU9iamVjdCAqbmFtZSwgUHlDbGFzc09iamVjdCAqKnBjbGFzcykKIHsKLQlQeV9zc2l6ZV90IGksIG47Ci0JUHlPYmplY3QgKnZhbHVlID0gUHlEaWN0X0dldEl0ZW0oY3AtPmNsX2RpY3QsIG5hbWUpOwotCWlmICh2YWx1ZSAhPSBOVUxMKSB7Ci0JCSpwY2xhc3MgPSBjcDsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQluID0gUHlUdXBsZV9TaXplKGNwLT5jbF9iYXNlcyk7Ci0JZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQkvKiBYWFggV2hhdCBpZiBvbmUgb2YgdGhlIGJhc2VzIGlzIG5vdCBhIGNsYXNzPyAqLwotCQlQeU9iamVjdCAqdiA9IGNsYXNzX2xvb2t1cCgKLQkJCShQeUNsYXNzT2JqZWN0ICopCi0JCQlQeVR1cGxlX0dldEl0ZW0oY3AtPmNsX2Jhc2VzLCBpKSwgbmFtZSwgcGNsYXNzKTsKLQkJaWYgKHYgIT0gTlVMTCkKLQkJCXJldHVybiB2OwotCX0KLQlyZXR1cm4gTlVMTDsKKyAgICBQeV9zc2l6ZV90IGksIG47CisgICAgUHlPYmplY3QgKnZhbHVlID0gUHlEaWN0X0dldEl0ZW0oY3AtPmNsX2RpY3QsIG5hbWUpOworICAgIGlmICh2YWx1ZSAhPSBOVUxMKSB7CisgICAgICAgICpwY2xhc3MgPSBjcDsKKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKyAgICBuID0gUHlUdXBsZV9TaXplKGNwLT5jbF9iYXNlcyk7CisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICAvKiBYWFggV2hhdCBpZiBvbmUgb2YgdGhlIGJhc2VzIGlzIG5vdCBhIGNsYXNzPyAqLworICAgICAgICBQeU9iamVjdCAqdiA9IGNsYXNzX2xvb2t1cCgKKyAgICAgICAgICAgIChQeUNsYXNzT2JqZWN0ICopCisgICAgICAgICAgICBQeVR1cGxlX0dldEl0ZW0oY3AtPmNsX2Jhc2VzLCBpKSwgbmFtZSwgcGNsYXNzKTsKKyAgICAgICAgaWYgKHYgIT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiB2OworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNsYXNzX2dldGF0dHIocmVnaXN0ZXIgUHlDbGFzc09iamVjdCAqb3AsIFB5T2JqZWN0ICpuYW1lKQogewotCXJlZ2lzdGVyIFB5T2JqZWN0ICp2OwotCXJlZ2lzdGVyIGNoYXIgKnNuYW1lID0gUHlTdHJpbmdfQXNTdHJpbmcobmFtZSk7Ci0JUHlDbGFzc09iamVjdCAqa2xhc3M7Ci0JZGVzY3JnZXRmdW5jIGY7CisgICAgcmVnaXN0ZXIgUHlPYmplY3QgKnY7CisgICAgcmVnaXN0ZXIgY2hhciAqc25hbWUgPSBQeVN0cmluZ19Bc1N0cmluZyhuYW1lKTsKKyAgICBQeUNsYXNzT2JqZWN0ICprbGFzczsKKyAgICBkZXNjcmdldGZ1bmMgZjsKIAotCWlmIChzbmFtZVswXSA9PSAnXycgJiYgc25hbWVbMV0gPT0gJ18nKSB7Ci0JCWlmIChzdHJjbXAoc25hbWUsICJfX2RpY3RfXyIpID09IDApIHsKLQkJCWlmIChQeUV2YWxfR2V0UmVzdHJpY3RlZCgpKSB7Ci0JCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKLQkJCSAgICJjbGFzcy5fX2RpY3RfXyBub3QgYWNjZXNzaWJsZSBpbiByZXN0cmljdGVkIG1vZGUiKTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJCVB5X0lOQ1JFRihvcC0+Y2xfZGljdCk7Ci0JCQlyZXR1cm4gb3AtPmNsX2RpY3Q7Ci0JCX0KLQkJaWYgKHN0cmNtcChzbmFtZSwgIl9fYmFzZXNfXyIpID09IDApIHsKLQkJCVB5X0lOQ1JFRihvcC0+Y2xfYmFzZXMpOwotCQkJcmV0dXJuIG9wLT5jbF9iYXNlczsKLQkJfQotCQlpZiAoc3RyY21wKHNuYW1lLCAiX19uYW1lX18iKSA9PSAwKSB7Ci0JCQlpZiAob3AtPmNsX25hbWUgPT0gTlVMTCkKLQkJCQl2ID0gUHlfTm9uZTsKLQkJCWVsc2UKLQkJCQl2ID0gb3AtPmNsX25hbWU7Ci0JCQlQeV9JTkNSRUYodik7Ci0JCQlyZXR1cm4gdjsKLQkJfQotCX0KLQl2ID0gY2xhc3NfbG9va3VwKG9wLCBuYW1lLCAma2xhc3MpOwotCWlmICh2ID09IE5VTEwpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX0F0dHJpYnV0ZUVycm9yLAotCQkJICAgICAiY2xhc3MgJS41MHMgaGFzIG5vIGF0dHJpYnV0ZSAnJS40MDBzJyIsCi0JCQkgICAgIFB5U3RyaW5nX0FTX1NUUklORyhvcC0+Y2xfbmFtZSksIHNuYW1lKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWYgPSBUUF9ERVNDUl9HRVQodi0+b2JfdHlwZSk7Ci0JaWYgKGYgPT0gTlVMTCkKLQkJUHlfSU5DUkVGKHYpOwotCWVsc2UKLQkJdiA9IGYodiwgKFB5T2JqZWN0ICopTlVMTCwgKFB5T2JqZWN0ICopb3ApOwotCXJldHVybiB2OworICAgIGlmIChzbmFtZVswXSA9PSAnXycgJiYgc25hbWVbMV0gPT0gJ18nKSB7CisgICAgICAgIGlmIChzdHJjbXAoc25hbWUsICJfX2RpY3RfXyIpID09IDApIHsKKyAgICAgICAgICAgIGlmIChQeUV2YWxfR2V0UmVzdHJpY3RlZCgpKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICJjbGFzcy5fX2RpY3RfXyBub3QgYWNjZXNzaWJsZSBpbiByZXN0cmljdGVkIG1vZGUiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5X0lOQ1JFRihvcC0+Y2xfZGljdCk7CisgICAgICAgICAgICByZXR1cm4gb3AtPmNsX2RpY3Q7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0cmNtcChzbmFtZSwgIl9fYmFzZXNfXyIpID09IDApIHsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihvcC0+Y2xfYmFzZXMpOworICAgICAgICAgICAgcmV0dXJuIG9wLT5jbF9iYXNlczsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RyY21wKHNuYW1lLCAiX19uYW1lX18iKSA9PSAwKSB7CisgICAgICAgICAgICBpZiAob3AtPmNsX25hbWUgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICB2ID0gUHlfTm9uZTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB2ID0gb3AtPmNsX25hbWU7CisgICAgICAgICAgICBQeV9JTkNSRUYodik7CisgICAgICAgICAgICByZXR1cm4gdjsKKyAgICAgICAgfQorICAgIH0KKyAgICB2ID0gY2xhc3NfbG9va3VwKG9wLCBuYW1lLCAma2xhc3MpOworICAgIGlmICh2ID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX0F0dHJpYnV0ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgImNsYXNzICUuNTBzIGhhcyBubyBhdHRyaWJ1dGUgJyUuNDAwcyciLAorICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKG9wLT5jbF9uYW1lKSwgc25hbWUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZiA9IFRQX0RFU0NSX0dFVCh2LT5vYl90eXBlKTsKKyAgICBpZiAoZiA9PSBOVUxMKQorICAgICAgICBQeV9JTkNSRUYodik7CisgICAgZWxzZQorICAgICAgICB2ID0gZih2LCAoUHlPYmplY3QgKilOVUxMLCAoUHlPYmplY3QgKilvcCk7CisgICAgcmV0dXJuIHY7CiB9CiAKIHN0YXRpYyB2b2lkCiBzZXRfc2xvdChQeU9iamVjdCAqKnNsb3QsIFB5T2JqZWN0ICp2KQogewotCVB5T2JqZWN0ICp0ZW1wID0gKnNsb3Q7Ci0JUHlfWElOQ1JFRih2KTsKLQkqc2xvdCA9IHY7Ci0JUHlfWERFQ1JFRih0ZW1wKTsKKyAgICBQeU9iamVjdCAqdGVtcCA9ICpzbG90OworICAgIFB5X1hJTkNSRUYodik7CisgICAgKnNsb3QgPSB2OworICAgIFB5X1hERUNSRUYodGVtcCk7CiB9CiAKIHN0YXRpYyB2b2lkCiBzZXRfYXR0cl9zbG90cyhQeUNsYXNzT2JqZWN0ICpjKQogewotCVB5Q2xhc3NPYmplY3QgKmR1bW15OworICAgIFB5Q2xhc3NPYmplY3QgKmR1bW15OwogCi0Jc2V0X3Nsb3QoJmMtPmNsX2dldGF0dHIsIGNsYXNzX2xvb2t1cChjLCBnZXRhdHRyc3RyLCAmZHVtbXkpKTsKLQlzZXRfc2xvdCgmYy0+Y2xfc2V0YXR0ciwgY2xhc3NfbG9va3VwKGMsIHNldGF0dHJzdHIsICZkdW1teSkpOwotCXNldF9zbG90KCZjLT5jbF9kZWxhdHRyLCBjbGFzc19sb29rdXAoYywgZGVsYXR0cnN0ciwgJmR1bW15KSk7CisgICAgc2V0X3Nsb3QoJmMtPmNsX2dldGF0dHIsIGNsYXNzX2xvb2t1cChjLCBnZXRhdHRyc3RyLCAmZHVtbXkpKTsKKyAgICBzZXRfc2xvdCgmYy0+Y2xfc2V0YXR0ciwgY2xhc3NfbG9va3VwKGMsIHNldGF0dHJzdHIsICZkdW1teSkpOworICAgIHNldF9zbG90KCZjLT5jbF9kZWxhdHRyLCBjbGFzc19sb29rdXAoYywgZGVsYXR0cnN0ciwgJmR1bW15KSk7CiB9CiAKIHN0YXRpYyBjaGFyICoKIHNldF9kaWN0KFB5Q2xhc3NPYmplY3QgKmMsIFB5T2JqZWN0ICp2KQogewotCWlmICh2ID09IE5VTEwgfHwgIVB5RGljdF9DaGVjayh2KSkKLQkJcmV0dXJuICJfX2RpY3RfXyBtdXN0IGJlIGEgZGljdGlvbmFyeSBvYmplY3QiOwotCXNldF9zbG90KCZjLT5jbF9kaWN0LCB2KTsKLQlzZXRfYXR0cl9zbG90cyhjKTsKLQlyZXR1cm4gIiI7CisgICAgaWYgKHYgPT0gTlVMTCB8fCAhUHlEaWN0X0NoZWNrKHYpKQorICAgICAgICByZXR1cm4gIl9fZGljdF9fIG11c3QgYmUgYSBkaWN0aW9uYXJ5IG9iamVjdCI7CisgICAgc2V0X3Nsb3QoJmMtPmNsX2RpY3QsIHYpOworICAgIHNldF9hdHRyX3Nsb3RzKGMpOworICAgIHJldHVybiAiIjsKIH0KIAogc3RhdGljIGNoYXIgKgogc2V0X2Jhc2VzKFB5Q2xhc3NPYmplY3QgKmMsIFB5T2JqZWN0ICp2KQogewotCVB5X3NzaXplX3QgaSwgbjsKKyAgICBQeV9zc2l6ZV90IGksIG47CiAKLQlpZiAodiA9PSBOVUxMIHx8ICFQeVR1cGxlX0NoZWNrKHYpKQotCQlyZXR1cm4gIl9fYmFzZXNfXyBtdXN0IGJlIGEgdHVwbGUgb2JqZWN0IjsKLQluID0gUHlUdXBsZV9TaXplKHYpOwotCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJUHlPYmplY3QgKnggPSBQeVR1cGxlX0dFVF9JVEVNKHYsIGkpOwotCQlpZiAoIVB5Q2xhc3NfQ2hlY2soeCkpCi0JCQlyZXR1cm4gIl9fYmFzZXNfXyBpdGVtcyBtdXN0IGJlIGNsYXNzZXMiOwotCQlpZiAoUHlDbGFzc19Jc1N1YmNsYXNzKHgsIChQeU9iamVjdCAqKWMpKQotCQkJcmV0dXJuICJhIF9fYmFzZXNfXyBpdGVtIGNhdXNlcyBhbiBpbmhlcml0YW5jZSBjeWNsZSI7Ci0JfQotCXNldF9zbG90KCZjLT5jbF9iYXNlcywgdik7Ci0Jc2V0X2F0dHJfc2xvdHMoYyk7Ci0JcmV0dXJuICIiOworICAgIGlmICh2ID09IE5VTEwgfHwgIVB5VHVwbGVfQ2hlY2sodikpCisgICAgICAgIHJldHVybiAiX19iYXNlc19fIG11c3QgYmUgYSB0dXBsZSBvYmplY3QiOworICAgIG4gPSBQeVR1cGxlX1NpemUodik7CisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICBQeU9iamVjdCAqeCA9IFB5VHVwbGVfR0VUX0lURU0odiwgaSk7CisgICAgICAgIGlmICghUHlDbGFzc19DaGVjayh4KSkKKyAgICAgICAgICAgIHJldHVybiAiX19iYXNlc19fIGl0ZW1zIG11c3QgYmUgY2xhc3NlcyI7CisgICAgICAgIGlmIChQeUNsYXNzX0lzU3ViY2xhc3MoeCwgKFB5T2JqZWN0ICopYykpCisgICAgICAgICAgICByZXR1cm4gImEgX19iYXNlc19fIGl0ZW0gY2F1c2VzIGFuIGluaGVyaXRhbmNlIGN5Y2xlIjsKKyAgICB9CisgICAgc2V0X3Nsb3QoJmMtPmNsX2Jhc2VzLCB2KTsKKyAgICBzZXRfYXR0cl9zbG90cyhjKTsKKyAgICByZXR1cm4gIiI7CiB9CiAKIHN0YXRpYyBjaGFyICoKIHNldF9uYW1lKFB5Q2xhc3NPYmplY3QgKmMsIFB5T2JqZWN0ICp2KQogewotCWlmICh2ID09IE5VTEwgfHwgIVB5U3RyaW5nX0NoZWNrKHYpKQotCQlyZXR1cm4gIl9fbmFtZV9fIG11c3QgYmUgYSBzdHJpbmcgb2JqZWN0IjsKLQlpZiAoc3RybGVuKFB5U3RyaW5nX0FTX1NUUklORyh2KSkgIT0gKHNpemVfdClQeVN0cmluZ19HRVRfU0laRSh2KSkKLQkJcmV0dXJuICJfX25hbWVfXyBtdXN0IG5vdCBjb250YWluIG51bGwgYnl0ZXMiOwotCXNldF9zbG90KCZjLT5jbF9uYW1lLCB2KTsKLQlyZXR1cm4gIiI7CisgICAgaWYgKHYgPT0gTlVMTCB8fCAhUHlTdHJpbmdfQ2hlY2sodikpCisgICAgICAgIHJldHVybiAiX19uYW1lX18gbXVzdCBiZSBhIHN0cmluZyBvYmplY3QiOworICAgIGlmIChzdHJsZW4oUHlTdHJpbmdfQVNfU1RSSU5HKHYpKSAhPSAoc2l6ZV90KVB5U3RyaW5nX0dFVF9TSVpFKHYpKQorICAgICAgICByZXR1cm4gIl9fbmFtZV9fIG11c3Qgbm90IGNvbnRhaW4gbnVsbCBieXRlcyI7CisgICAgc2V0X3Nsb3QoJmMtPmNsX25hbWUsIHYpOworICAgIHJldHVybiAiIjsKIH0KIAogc3RhdGljIGludAogY2xhc3Nfc2V0YXR0cihQeUNsYXNzT2JqZWN0ICpvcCwgUHlPYmplY3QgKm5hbWUsIFB5T2JqZWN0ICp2KQogewotCWNoYXIgKnNuYW1lOwotCWlmIChQeUV2YWxfR2V0UmVzdHJpY3RlZCgpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCi0JCQkgICAiY2xhc3NlcyBhcmUgcmVhZC1vbmx5IGluIHJlc3RyaWN0ZWQgbW9kZSIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXNuYW1lID0gUHlTdHJpbmdfQXNTdHJpbmcobmFtZSk7Ci0JaWYgKHNuYW1lWzBdID09ICdfJyAmJiBzbmFtZVsxXSA9PSAnXycpIHsKLQkJUHlfc3NpemVfdCBuID0gUHlTdHJpbmdfU2l6ZShuYW1lKTsKLQkJaWYgKHNuYW1lW24tMV0gPT0gJ18nICYmIHNuYW1lW24tMl0gPT0gJ18nKSB7Ci0JCQljaGFyICplcnIgPSBOVUxMOwotCQkJaWYgKHN0cmNtcChzbmFtZSwgIl9fZGljdF9fIikgPT0gMCkKLQkJCQllcnIgPSBzZXRfZGljdChvcCwgdik7Ci0JCQllbHNlIGlmIChzdHJjbXAoc25hbWUsICJfX2Jhc2VzX18iKSA9PSAwKQotCQkJCWVyciA9IHNldF9iYXNlcyhvcCwgdik7Ci0JCQllbHNlIGlmIChzdHJjbXAoc25hbWUsICJfX25hbWVfXyIpID09IDApCi0JCQkJZXJyID0gc2V0X25hbWUob3AsIHYpOwotCQkJZWxzZSBpZiAoc3RyY21wKHNuYW1lLCAiX19nZXRhdHRyX18iKSA9PSAwKQotCQkJCXNldF9zbG90KCZvcC0+Y2xfZ2V0YXR0ciwgdik7Ci0JCQllbHNlIGlmIChzdHJjbXAoc25hbWUsICJfX3NldGF0dHJfXyIpID09IDApCi0JCQkJc2V0X3Nsb3QoJm9wLT5jbF9zZXRhdHRyLCB2KTsKLQkJCWVsc2UgaWYgKHN0cmNtcChzbmFtZSwgIl9fZGVsYXR0cl9fIikgPT0gMCkKLQkJCQlzZXRfc2xvdCgmb3AtPmNsX2RlbGF0dHIsIHYpOwotCQkJLyogRm9yIHRoZSBsYXN0IHRocmVlLCB3ZSBmYWxsIHRocm91Z2ggdG8gdXBkYXRlIHRoZQotCQkJICAgZGljdGlvbmFyeSBhcyB3ZWxsLiAqLwotCQkJaWYgKGVyciAhPSBOVUxMKSB7Ci0JCQkJaWYgKCplcnIgPT0gJ1wwJykKLQkJCQkJcmV0dXJuIDA7Ci0JCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgZXJyKTsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQl9Ci0JaWYgKHYgPT0gTlVMTCkgewotCQlpbnQgcnYgPSBQeURpY3RfRGVsSXRlbShvcC0+Y2xfZGljdCwgbmFtZSk7Ci0JCWlmIChydiA8IDApCi0JCQlQeUVycl9Gb3JtYXQoUHlFeGNfQXR0cmlidXRlRXJyb3IsCi0JCQkJICAgICAiY2xhc3MgJS41MHMgaGFzIG5vIGF0dHJpYnV0ZSAnJS40MDBzJyIsCi0JCQkJICAgICBQeVN0cmluZ19BU19TVFJJTkcob3AtPmNsX25hbWUpLCBzbmFtZSk7Ci0JCXJldHVybiBydjsKLQl9Ci0JZWxzZQotCQlyZXR1cm4gUHlEaWN0X1NldEl0ZW0ob3AtPmNsX2RpY3QsIG5hbWUsIHYpOworICAgIGNoYXIgKnNuYW1lOworICAgIGlmIChQeUV2YWxfR2V0UmVzdHJpY3RlZCgpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgICAgImNsYXNzZXMgYXJlIHJlYWQtb25seSBpbiByZXN0cmljdGVkIG1vZGUiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBzbmFtZSA9IFB5U3RyaW5nX0FzU3RyaW5nKG5hbWUpOworICAgIGlmIChzbmFtZVswXSA9PSAnXycgJiYgc25hbWVbMV0gPT0gJ18nKSB7CisgICAgICAgIFB5X3NzaXplX3QgbiA9IFB5U3RyaW5nX1NpemUobmFtZSk7CisgICAgICAgIGlmIChzbmFtZVtuLTFdID09ICdfJyAmJiBzbmFtZVtuLTJdID09ICdfJykgeworICAgICAgICAgICAgY2hhciAqZXJyID0gTlVMTDsKKyAgICAgICAgICAgIGlmIChzdHJjbXAoc25hbWUsICJfX2RpY3RfXyIpID09IDApCisgICAgICAgICAgICAgICAgZXJyID0gc2V0X2RpY3Qob3AsIHYpOworICAgICAgICAgICAgZWxzZSBpZiAoc3RyY21wKHNuYW1lLCAiX19iYXNlc19fIikgPT0gMCkKKyAgICAgICAgICAgICAgICBlcnIgPSBzZXRfYmFzZXMob3AsIHYpOworICAgICAgICAgICAgZWxzZSBpZiAoc3RyY21wKHNuYW1lLCAiX19uYW1lX18iKSA9PSAwKQorICAgICAgICAgICAgICAgIGVyciA9IHNldF9uYW1lKG9wLCB2KTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHN0cmNtcChzbmFtZSwgIl9fZ2V0YXR0cl9fIikgPT0gMCkKKyAgICAgICAgICAgICAgICBzZXRfc2xvdCgmb3AtPmNsX2dldGF0dHIsIHYpOworICAgICAgICAgICAgZWxzZSBpZiAoc3RyY21wKHNuYW1lLCAiX19zZXRhdHRyX18iKSA9PSAwKQorICAgICAgICAgICAgICAgIHNldF9zbG90KCZvcC0+Y2xfc2V0YXR0ciwgdik7CisgICAgICAgICAgICBlbHNlIGlmIChzdHJjbXAoc25hbWUsICJfX2RlbGF0dHJfXyIpID09IDApCisgICAgICAgICAgICAgICAgc2V0X3Nsb3QoJm9wLT5jbF9kZWxhdHRyLCB2KTsKKyAgICAgICAgICAgIC8qIEZvciB0aGUgbGFzdCB0aHJlZSwgd2UgZmFsbCB0aHJvdWdoIHRvIHVwZGF0ZSB0aGUKKyAgICAgICAgICAgICAgIGRpY3Rpb25hcnkgYXMgd2VsbC4gKi8KKyAgICAgICAgICAgIGlmIChlcnIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGlmICgqZXJyID09ICdcMCcpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsIGVycik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmICh2ID09IE5VTEwpIHsKKyAgICAgICAgaW50IHJ2ID0gUHlEaWN0X0RlbEl0ZW0ob3AtPmNsX2RpY3QsIG5hbWUpOworICAgICAgICBpZiAocnYgPCAwKQorICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX0F0dHJpYnV0ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICJjbGFzcyAlLjUwcyBoYXMgbm8gYXR0cmlidXRlICclLjQwMHMnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcob3AtPmNsX25hbWUpLCBzbmFtZSk7CisgICAgICAgIHJldHVybiBydjsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXR1cm4gUHlEaWN0X1NldEl0ZW0ob3AtPmNsX2RpY3QsIG5hbWUsIHYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY2xhc3NfcmVwcihQeUNsYXNzT2JqZWN0ICpvcCkKIHsKLQlQeU9iamVjdCAqbW9kID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcob3AtPmNsX2RpY3QsICJfX21vZHVsZV9fIik7Ci0JY2hhciAqbmFtZTsKLQlpZiAob3AtPmNsX25hbWUgPT0gTlVMTCB8fCAhUHlTdHJpbmdfQ2hlY2sob3AtPmNsX25hbWUpKQotCQluYW1lID0gIj8iOwotCWVsc2UKLQkJbmFtZSA9IFB5U3RyaW5nX0FzU3RyaW5nKG9wLT5jbF9uYW1lKTsKLQlpZiAobW9kID09IE5VTEwgfHwgIVB5U3RyaW5nX0NoZWNrKG1vZCkpCi0JCXJldHVybiBQeVN0cmluZ19Gcm9tRm9ybWF0KCI8Y2xhc3MgPy4lcyBhdCAlcD4iLCBuYW1lLCBvcCk7Ci0JZWxzZQotCQlyZXR1cm4gUHlTdHJpbmdfRnJvbUZvcm1hdCgiPGNsYXNzICVzLiVzIGF0ICVwPiIsCi0JCQkJCSAgIFB5U3RyaW5nX0FzU3RyaW5nKG1vZCksCi0JCQkJCSAgIG5hbWUsIG9wKTsKKyAgICBQeU9iamVjdCAqbW9kID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcob3AtPmNsX2RpY3QsICJfX21vZHVsZV9fIik7CisgICAgY2hhciAqbmFtZTsKKyAgICBpZiAob3AtPmNsX25hbWUgPT0gTlVMTCB8fCAhUHlTdHJpbmdfQ2hlY2sob3AtPmNsX25hbWUpKQorICAgICAgICBuYW1lID0gIj8iOworICAgIGVsc2UKKyAgICAgICAgbmFtZSA9IFB5U3RyaW5nX0FzU3RyaW5nKG9wLT5jbF9uYW1lKTsKKyAgICBpZiAobW9kID09IE5VTEwgfHwgIVB5U3RyaW5nX0NoZWNrKG1vZCkpCisgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tRm9ybWF0KCI8Y2xhc3MgPy4lcyBhdCAlcD4iLCBuYW1lLCBvcCk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbUZvcm1hdCgiPGNsYXNzICVzLiVzIGF0ICVwPiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FzU3RyaW5nKG1vZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIG9wKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNsYXNzX3N0cihQeUNsYXNzT2JqZWN0ICpvcCkKIHsKLQlQeU9iamVjdCAqbW9kID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcob3AtPmNsX2RpY3QsICJfX21vZHVsZV9fIik7Ci0JUHlPYmplY3QgKm5hbWUgPSBvcC0+Y2xfbmFtZTsKLQlQeU9iamVjdCAqcmVzOwotCVB5X3NzaXplX3QgbSwgbjsKKyAgICBQeU9iamVjdCAqbW9kID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcob3AtPmNsX2RpY3QsICJfX21vZHVsZV9fIik7CisgICAgUHlPYmplY3QgKm5hbWUgPSBvcC0+Y2xfbmFtZTsKKyAgICBQeU9iamVjdCAqcmVzOworICAgIFB5X3NzaXplX3QgbSwgbjsKIAotCWlmIChuYW1lID09IE5VTEwgfHwgIVB5U3RyaW5nX0NoZWNrKG5hbWUpKQotCQlyZXR1cm4gY2xhc3NfcmVwcihvcCk7Ci0JaWYgKG1vZCA9PSBOVUxMIHx8ICFQeVN0cmluZ19DaGVjayhtb2QpKSB7Ci0JCVB5X0lOQ1JFRihuYW1lKTsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCW0gPSBQeVN0cmluZ19HRVRfU0laRShtb2QpOwotCW4gPSBQeVN0cmluZ19HRVRfU0laRShuYW1lKTsKLQlyZXMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKU5VTEwsIG0rMStuKTsKLQlpZiAocmVzICE9IE5VTEwpIHsKLQkJY2hhciAqcyA9IFB5U3RyaW5nX0FTX1NUUklORyhyZXMpOwotCQltZW1jcHkocywgUHlTdHJpbmdfQVNfU1RSSU5HKG1vZCksIG0pOwotCQlzICs9IG07Ci0JCSpzKysgPSAnLic7Ci0JCW1lbWNweShzLCBQeVN0cmluZ19BU19TVFJJTkcobmFtZSksIG4pOwotCX0KLQlyZXR1cm4gcmVzOworICAgIGlmIChuYW1lID09IE5VTEwgfHwgIVB5U3RyaW5nX0NoZWNrKG5hbWUpKQorICAgICAgICByZXR1cm4gY2xhc3NfcmVwcihvcCk7CisgICAgaWYgKG1vZCA9PSBOVUxMIHx8ICFQeVN0cmluZ19DaGVjayhtb2QpKSB7CisgICAgICAgIFB5X0lOQ1JFRihuYW1lKTsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorICAgIG0gPSBQeVN0cmluZ19HRVRfU0laRShtb2QpOworICAgIG4gPSBQeVN0cmluZ19HRVRfU0laRShuYW1lKTsKKyAgICByZXMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKU5VTEwsIG0rMStuKTsKKyAgICBpZiAocmVzICE9IE5VTEwpIHsKKyAgICAgICAgY2hhciAqcyA9IFB5U3RyaW5nX0FTX1NUUklORyhyZXMpOworICAgICAgICBtZW1jcHkocywgUHlTdHJpbmdfQVNfU1RSSU5HKG1vZCksIG0pOworICAgICAgICBzICs9IG07CisgICAgICAgICpzKysgPSAnLic7CisgICAgICAgIG1lbWNweShzLCBQeVN0cmluZ19BU19TVFJJTkcobmFtZSksIG4pOworICAgIH0KKyAgICByZXR1cm4gcmVzOwogfQogCiBzdGF0aWMgaW50CiBjbGFzc190cmF2ZXJzZShQeUNsYXNzT2JqZWN0ICpvLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlQeV9WSVNJVChvLT5jbF9iYXNlcyk7Ci0JUHlfVklTSVQoby0+Y2xfZGljdCk7Ci0JUHlfVklTSVQoby0+Y2xfbmFtZSk7Ci0JUHlfVklTSVQoby0+Y2xfZ2V0YXR0cik7Ci0JUHlfVklTSVQoby0+Y2xfc2V0YXR0cik7Ci0JUHlfVklTSVQoby0+Y2xfZGVsYXR0cik7Ci0JcmV0dXJuIDA7CisgICAgUHlfVklTSVQoby0+Y2xfYmFzZXMpOworICAgIFB5X1ZJU0lUKG8tPmNsX2RpY3QpOworICAgIFB5X1ZJU0lUKG8tPmNsX25hbWUpOworICAgIFB5X1ZJU0lUKG8tPmNsX2dldGF0dHIpOworICAgIFB5X1ZJU0lUKG8tPmNsX3NldGF0dHIpOworICAgIFB5X1ZJU0lUKG8tPmNsX2RlbGF0dHIpOworICAgIHJldHVybiAwOwogfQogCiBQeVR5cGVPYmplY3QgUHlDbGFzc19UeXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUpCi0JMCwKLQkiY2xhc3NvYmoiLAotCXNpemVvZihQeUNsYXNzT2JqZWN0KSwKLQkwLAotCShkZXN0cnVjdG9yKWNsYXNzX2RlYWxsb2MsCQkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9jb21wYXJlICovCi0JKHJlcHJmdW5jKWNsYXNzX3JlcHIsCQkJLyogdHBfcmVwciAqLwotCTAsCQkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCQkvKiB0cF9oYXNoICovCi0JUHlJbnN0YW5jZV9OZXcsCQkJCS8qIHRwX2NhbGwgKi8KLQkocmVwcmZ1bmMpY2xhc3Nfc3RyLAkJCS8qIHRwX3N0ciAqLwotCShnZXRhdHRyb2Z1bmMpY2xhc3NfZ2V0YXR0ciwJCS8qIHRwX2dldGF0dHJvICovCi0JKHNldGF0dHJvZnVuYyljbGFzc19zZXRhdHRyLAkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDLC8qIHRwX2ZsYWdzICovCi0JY2xhc3NfZG9jLAkJCQkvKiB0cF9kb2MgKi8KLQkodHJhdmVyc2Vwcm9jKWNsYXNzX3RyYXZlcnNlLAkJLyogdHBfdHJhdmVyc2UgKi8KLSAJMCwJCQkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkJLyogdHBfaXRlcm5leHQgKi8KLQkwLAkJCQkJLyogdHBfbWV0aG9kcyAqLwotCTAsCQkJCQkvKiB0cF9tZW1iZXJzICovCi0JMCwJCQkJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJCS8qIHRwX2RpY3QgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2luaXQgKi8KLQkwLAkJCQkJLyogdHBfYWxsb2MgKi8KLQljbGFzc19uZXcsCQkJCS8qIHRwX25ldyAqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUpCisgICAgMCwKKyAgICAiY2xhc3NvYmoiLAorICAgIHNpemVvZihQeUNsYXNzT2JqZWN0KSwKKyAgICAwLAorICAgIChkZXN0cnVjdG9yKWNsYXNzX2RlYWxsb2MsICAgICAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAocmVwcmZ1bmMpY2xhc3NfcmVwciwgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICBQeUluc3RhbmNlX05ldywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAocmVwcmZ1bmMpY2xhc3Nfc3RyLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIChnZXRhdHRyb2Z1bmMpY2xhc3NfZ2V0YXR0ciwgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAoc2V0YXR0cm9mdW5jKWNsYXNzX3NldGF0dHIsICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsLyogdHBfZmxhZ3MgKi8KKyAgICBjbGFzc19kb2MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2MpY2xhc3NfdHJhdmVyc2UsICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIGNsYXNzX25ldywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCiB9OwogCiBpbnQKIFB5Q2xhc3NfSXNTdWJjbGFzcyhQeU9iamVjdCAqa2xhc3MsIFB5T2JqZWN0ICpiYXNlKQogewotCVB5X3NzaXplX3QgaSwgbjsKLQlQeUNsYXNzT2JqZWN0ICpjcDsKLQlpZiAoa2xhc3MgPT0gYmFzZSkKLQkJcmV0dXJuIDE7Ci0JaWYgKFB5VHVwbGVfQ2hlY2soYmFzZSkpIHsKLQkJbiA9IFB5VHVwbGVfR0VUX1NJWkUoYmFzZSk7Ci0JCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJCWlmIChQeUNsYXNzX0lzU3ViY2xhc3Moa2xhc3MsIFB5VHVwbGVfR0VUX0lURU0oYmFzZSwgaSkpKQotCQkJCXJldHVybiAxOwotCQl9Ci0JCXJldHVybiAwOwotCX0KLQlpZiAoa2xhc3MgPT0gTlVMTCB8fCAhUHlDbGFzc19DaGVjayhrbGFzcykpCi0JCXJldHVybiAwOwotCWNwID0gKFB5Q2xhc3NPYmplY3QgKilrbGFzczsKLQluID0gUHlUdXBsZV9TaXplKGNwLT5jbF9iYXNlcyk7Ci0JZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQlpZiAoUHlDbGFzc19Jc1N1YmNsYXNzKFB5VHVwbGVfR2V0SXRlbShjcC0+Y2xfYmFzZXMsIGkpLCBiYXNlKSkKLQkJCXJldHVybiAxOwotCX0KLQlyZXR1cm4gMDsKKyAgICBQeV9zc2l6ZV90IGksIG47CisgICAgUHlDbGFzc09iamVjdCAqY3A7CisgICAgaWYgKGtsYXNzID09IGJhc2UpCisgICAgICAgIHJldHVybiAxOworICAgIGlmIChQeVR1cGxlX0NoZWNrKGJhc2UpKSB7CisgICAgICAgIG4gPSBQeVR1cGxlX0dFVF9TSVpFKGJhc2UpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgICAgICBpZiAoUHlDbGFzc19Jc1N1YmNsYXNzKGtsYXNzLCBQeVR1cGxlX0dFVF9JVEVNKGJhc2UsIGkpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKGtsYXNzID09IE5VTEwgfHwgIVB5Q2xhc3NfQ2hlY2soa2xhc3MpKQorICAgICAgICByZXR1cm4gMDsKKyAgICBjcCA9IChQeUNsYXNzT2JqZWN0ICopa2xhc3M7CisgICAgbiA9IFB5VHVwbGVfU2l6ZShjcC0+Y2xfYmFzZXMpOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgaWYgKFB5Q2xhc3NfSXNTdWJjbGFzcyhQeVR1cGxlX0dldEl0ZW0oY3AtPmNsX2Jhc2VzLCBpKSwgYmFzZSkpCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIApAQCAtNTAyLDg2ICs1MDIsODYgQEAKIFB5T2JqZWN0ICoKIFB5SW5zdGFuY2VfTmV3UmF3KFB5T2JqZWN0ICprbGFzcywgUHlPYmplY3QgKmRpY3QpCiB7Ci0JUHlJbnN0YW5jZU9iamVjdCAqaW5zdDsKKyAgICBQeUluc3RhbmNlT2JqZWN0ICppbnN0OwogCi0JaWYgKCFQeUNsYXNzX0NoZWNrKGtsYXNzKSkgewotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChkaWN0ID09IE5VTEwpIHsKLQkJZGljdCA9IFB5RGljdF9OZXcoKTsKLQkJaWYgKGRpY3QgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCX0KLQllbHNlIHsKLQkJaWYgKCFQeURpY3RfQ2hlY2soZGljdCkpIHsKLQkJCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJUHlfSU5DUkVGKGRpY3QpOwotCX0KLQlpbnN0ID0gUHlPYmplY3RfR0NfTmV3KFB5SW5zdGFuY2VPYmplY3QsICZQeUluc3RhbmNlX1R5cGUpOwotCWlmIChpbnN0ID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKGRpY3QpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaW5zdC0+aW5fd2Vha3JlZmxpc3QgPSBOVUxMOwotCVB5X0lOQ1JFRihrbGFzcyk7Ci0JaW5zdC0+aW5fY2xhc3MgPSAoUHlDbGFzc09iamVjdCAqKWtsYXNzOwotCWluc3QtPmluX2RpY3QgPSBkaWN0OwotCV9QeU9iamVjdF9HQ19UUkFDSyhpbnN0KTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaW5zdDsKKyAgICBpZiAoIVB5Q2xhc3NfQ2hlY2soa2xhc3MpKSB7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKGRpY3QgPT0gTlVMTCkgeworICAgICAgICBkaWN0ID0gUHlEaWN0X05ldygpOworICAgICAgICBpZiAoZGljdCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZiAoIVB5RGljdF9DaGVjayhkaWN0KSkgeworICAgICAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBQeV9JTkNSRUYoZGljdCk7CisgICAgfQorICAgIGluc3QgPSBQeU9iamVjdF9HQ19OZXcoUHlJbnN0YW5jZU9iamVjdCwgJlB5SW5zdGFuY2VfVHlwZSk7CisgICAgaWYgKGluc3QgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYoZGljdCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpbnN0LT5pbl93ZWFrcmVmbGlzdCA9IE5VTEw7CisgICAgUHlfSU5DUkVGKGtsYXNzKTsKKyAgICBpbnN0LT5pbl9jbGFzcyA9IChQeUNsYXNzT2JqZWN0ICopa2xhc3M7CisgICAgaW5zdC0+aW5fZGljdCA9IGRpY3Q7CisgICAgX1B5T2JqZWN0X0dDX1RSQUNLKGluc3QpOworICAgIHJldHVybiAoUHlPYmplY3QgKilpbnN0OwogfQogCiBQeU9iamVjdCAqCiBQeUluc3RhbmNlX05ldyhQeU9iamVjdCAqa2xhc3MsIFB5T2JqZWN0ICphcmcsIFB5T2JqZWN0ICprdykKIHsKLQlyZWdpc3RlciBQeUluc3RhbmNlT2JqZWN0ICppbnN0OwotCVB5T2JqZWN0ICppbml0OwotCXN0YXRpYyBQeU9iamVjdCAqaW5pdHN0cjsKKyAgICByZWdpc3RlciBQeUluc3RhbmNlT2JqZWN0ICppbnN0OworICAgIFB5T2JqZWN0ICppbml0OworICAgIHN0YXRpYyBQeU9iamVjdCAqaW5pdHN0cjsKIAotCWlmIChpbml0c3RyID09IE5VTEwpIHsKLQkJaW5pdHN0ciA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9faW5pdF9fIik7Ci0JCWlmIChpbml0c3RyID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaW5zdCA9IChQeUluc3RhbmNlT2JqZWN0ICopIFB5SW5zdGFuY2VfTmV3UmF3KGtsYXNzLCBOVUxMKTsKLQlpZiAoaW5zdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlpbml0ID0gaW5zdGFuY2VfZ2V0YXR0cjIoaW5zdCwgaW5pdHN0cik7Ci0JaWYgKGluaXQgPT0gTlVMTCkgewotCQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkgewotCQkJUHlfREVDUkVGKGluc3QpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJaWYgKChhcmcgIT0gTlVMTCAmJiAoIVB5VHVwbGVfQ2hlY2soYXJnKSB8fAotCQkJCSAgICAgUHlUdXBsZV9TaXplKGFyZykgIT0gMCkpCi0JCSAgICB8fCAoa3cgIT0gTlVMTCAmJiAoIVB5RGljdF9DaGVjayhrdykgfHwKLQkJCQkgICAgICBQeURpY3RfU2l6ZShrdykgIT0gMCkpKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSAgICJ0aGlzIGNvbnN0cnVjdG9yIHRha2VzIG5vIGFyZ3VtZW50cyIpOwotCQkJUHlfREVDUkVGKGluc3QpOwotCQkJaW5zdCA9IE5VTEw7Ci0JCX0KLQl9Ci0JZWxzZSB7Ci0JCVB5T2JqZWN0ICpyZXMgPSBQeUV2YWxfQ2FsbE9iamVjdFdpdGhLZXl3b3Jkcyhpbml0LCBhcmcsIGt3KTsKLQkJUHlfREVDUkVGKGluaXQpOwotCQlpZiAocmVzID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRihpbnN0KTsKLQkJCWluc3QgPSBOVUxMOwotCQl9Ci0JCWVsc2UgewotCQkJaWYgKHJlcyAhPSBQeV9Ob25lKSB7Ci0JCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkJICAgIl9faW5pdF9fKCkgc2hvdWxkIHJldHVybiBOb25lIik7Ci0JCQkJUHlfREVDUkVGKGluc3QpOwotCQkJCWluc3QgPSBOVUxMOwotCQkJfQotCQkJUHlfREVDUkVGKHJlcyk7Ci0JCX0KLQl9Ci0JcmV0dXJuIChQeU9iamVjdCAqKWluc3Q7CisgICAgaWYgKGluaXRzdHIgPT0gTlVMTCkgeworICAgICAgICBpbml0c3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19pbml0X18iKTsKKyAgICAgICAgaWYgKGluaXRzdHIgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpbnN0ID0gKFB5SW5zdGFuY2VPYmplY3QgKikgUHlJbnN0YW5jZV9OZXdSYXcoa2xhc3MsIE5VTEwpOworICAgIGlmIChpbnN0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGluaXQgPSBpbnN0YW5jZV9nZXRhdHRyMihpbnN0LCBpbml0c3RyKTsKKyAgICBpZiAoaW5pdCA9PSBOVUxMKSB7CisgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoaW5zdCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGFyZyAhPSBOVUxMICYmICghUHlUdXBsZV9DaGVjayhhcmcpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5VHVwbGVfU2l6ZShhcmcpICE9IDApKQorICAgICAgICAgICAgfHwgKGt3ICE9IE5VTEwgJiYgKCFQeURpY3RfQ2hlY2soa3cpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeURpY3RfU2l6ZShrdykgIT0gMCkpKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBjb25zdHJ1Y3RvciB0YWtlcyBubyBhcmd1bWVudHMiKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihpbnN0KTsKKyAgICAgICAgICAgIGluc3QgPSBOVUxMOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeU9iamVjdCAqcmVzID0gUHlFdmFsX0NhbGxPYmplY3RXaXRoS2V5d29yZHMoaW5pdCwgYXJnLCBrdyk7CisgICAgICAgIFB5X0RFQ1JFRihpbml0KTsKKyAgICAgICAgaWYgKHJlcyA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoaW5zdCk7CisgICAgICAgICAgICBpbnN0ID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gUHlfTm9uZSkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiX19pbml0X18oKSBzaG91bGQgcmV0dXJuIE5vbmUiKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoaW5zdCk7CisgICAgICAgICAgICAgICAgaW5zdCA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQeV9ERUNSRUYocmVzKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaW5zdDsKIH0KIAogLyogSW5zdGFuY2UgbWV0aG9kcyAqLwpAQCAtNTk2LDE3NCArNTk2LDE3NCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGluc3RhbmNlX25ldyhQeVR5cGVPYmplY3QqIHR5cGUsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCAqa3cpCiB7Ci0JUHlPYmplY3QgKmtsYXNzOwotCVB5T2JqZWN0ICpkaWN0ID0gUHlfTm9uZTsKKyAgICBQeU9iamVjdCAqa2xhc3M7CisgICAgUHlPYmplY3QgKmRpY3QgPSBQeV9Ob25lOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPIXxPOmluc3RhbmNlIiwKLQkJCSAgICAgICZQeUNsYXNzX1R5cGUsICZrbGFzcywgJmRpY3QpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8hfE86aW5zdGFuY2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmUHlDbGFzc19UeXBlLCAma2xhc3MsICZkaWN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoZGljdCA9PSBQeV9Ob25lKQotCQlkaWN0ID0gTlVMTDsKLQllbHNlIGlmICghUHlEaWN0X0NoZWNrKGRpY3QpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCSAgICAgICJpbnN0YW5jZSgpIHNlY29uZCBhcmcgbXVzdCBiZSBkaWN0aW9uYXJ5IG9yIE5vbmUiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBQeUluc3RhbmNlX05ld1JhdyhrbGFzcywgZGljdCk7CisgICAgaWYgKGRpY3QgPT0gUHlfTm9uZSkKKyAgICAgICAgZGljdCA9IE5VTEw7CisgICAgZWxzZSBpZiAoIVB5RGljdF9DaGVjayhkaWN0KSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAiaW5zdGFuY2UoKSBzZWNvbmQgYXJnIG11c3QgYmUgZGljdGlvbmFyeSBvciBOb25lIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlJbnN0YW5jZV9OZXdSYXcoa2xhc3MsIGRpY3QpOwogfQogCiAKIHN0YXRpYyB2b2lkCiBpbnN0YW5jZV9kZWFsbG9jKHJlZ2lzdGVyIFB5SW5zdGFuY2VPYmplY3QgKmluc3QpCiB7Ci0JUHlPYmplY3QgKmVycm9yX3R5cGUsICplcnJvcl92YWx1ZSwgKmVycm9yX3RyYWNlYmFjazsKLQlQeU9iamVjdCAqZGVsOwotCXN0YXRpYyBQeU9iamVjdCAqZGVsc3RyOworICAgIFB5T2JqZWN0ICplcnJvcl90eXBlLCAqZXJyb3JfdmFsdWUsICplcnJvcl90cmFjZWJhY2s7CisgICAgUHlPYmplY3QgKmRlbDsKKyAgICBzdGF0aWMgUHlPYmplY3QgKmRlbHN0cjsKIAotCV9QeU9iamVjdF9HQ19VTlRSQUNLKGluc3QpOwotCWlmIChpbnN0LT5pbl93ZWFrcmVmbGlzdCAhPSBOVUxMKQotCQlQeU9iamVjdF9DbGVhcldlYWtSZWZzKChQeU9iamVjdCAqKSBpbnN0KTsKKyAgICBfUHlPYmplY3RfR0NfVU5UUkFDSyhpbnN0KTsKKyAgICBpZiAoaW5zdC0+aW5fd2Vha3JlZmxpc3QgIT0gTlVMTCkKKyAgICAgICAgUHlPYmplY3RfQ2xlYXJXZWFrUmVmcygoUHlPYmplY3QgKikgaW5zdCk7CiAKLQkvKiBUZW1wb3JhcmlseSByZXN1cnJlY3QgdGhlIG9iamVjdC4gKi8KLQlhc3NlcnQoaW5zdC0+b2JfdHlwZSA9PSAmUHlJbnN0YW5jZV9UeXBlKTsKLQlhc3NlcnQoaW5zdC0+b2JfcmVmY250ID09IDApOwotCWluc3QtPm9iX3JlZmNudCA9IDE7CisgICAgLyogVGVtcG9yYXJpbHkgcmVzdXJyZWN0IHRoZSBvYmplY3QuICovCisgICAgYXNzZXJ0KGluc3QtPm9iX3R5cGUgPT0gJlB5SW5zdGFuY2VfVHlwZSk7CisgICAgYXNzZXJ0KGluc3QtPm9iX3JlZmNudCA9PSAwKTsKKyAgICBpbnN0LT5vYl9yZWZjbnQgPSAxOwogCi0JLyogU2F2ZSB0aGUgY3VycmVudCBleGNlcHRpb24sIGlmIGFueS4gKi8KLQlQeUVycl9GZXRjaCgmZXJyb3JfdHlwZSwgJmVycm9yX3ZhbHVlLCAmZXJyb3JfdHJhY2ViYWNrKTsKLQkvKiBFeGVjdXRlIF9fZGVsX18gbWV0aG9kLCBpZiBhbnkuICovCi0JaWYgKGRlbHN0ciA9PSBOVUxMKSB7Ci0JCWRlbHN0ciA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fZGVsX18iKTsKLQkJaWYgKGRlbHN0ciA9PSBOVUxMKQotCQkJUHlFcnJfV3JpdGVVbnJhaXNhYmxlKChQeU9iamVjdCopaW5zdCk7Ci0JfQotCWlmIChkZWxzdHIgJiYgKGRlbCA9IGluc3RhbmNlX2dldGF0dHIyKGluc3QsIGRlbHN0cikpICE9IE5VTEwpIHsKLQkJUHlPYmplY3QgKnJlcyA9IFB5RXZhbF9DYWxsT2JqZWN0KGRlbCwgKFB5T2JqZWN0ICopTlVMTCk7Ci0JCWlmIChyZXMgPT0gTlVMTCkKLQkJCVB5RXJyX1dyaXRlVW5yYWlzYWJsZShkZWwpOwotCQllbHNlCi0JCQlQeV9ERUNSRUYocmVzKTsKLQkJUHlfREVDUkVGKGRlbCk7Ci0JfQotCS8qIFJlc3RvcmUgdGhlIHNhdmVkIGV4Y2VwdGlvbi4gKi8KLQlQeUVycl9SZXN0b3JlKGVycm9yX3R5cGUsIGVycm9yX3ZhbHVlLCBlcnJvcl90cmFjZWJhY2spOworICAgIC8qIFNhdmUgdGhlIGN1cnJlbnQgZXhjZXB0aW9uLCBpZiBhbnkuICovCisgICAgUHlFcnJfRmV0Y2goJmVycm9yX3R5cGUsICZlcnJvcl92YWx1ZSwgJmVycm9yX3RyYWNlYmFjayk7CisgICAgLyogRXhlY3V0ZSBfX2RlbF9fIG1ldGhvZCwgaWYgYW55LiAqLworICAgIGlmIChkZWxzdHIgPT0gTlVMTCkgeworICAgICAgICBkZWxzdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2RlbF9fIik7CisgICAgICAgIGlmIChkZWxzdHIgPT0gTlVMTCkKKyAgICAgICAgICAgIFB5RXJyX1dyaXRlVW5yYWlzYWJsZSgoUHlPYmplY3QqKWluc3QpOworICAgIH0KKyAgICBpZiAoZGVsc3RyICYmIChkZWwgPSBpbnN0YW5jZV9nZXRhdHRyMihpbnN0LCBkZWxzdHIpKSAhPSBOVUxMKSB7CisgICAgICAgIFB5T2JqZWN0ICpyZXMgPSBQeUV2YWxfQ2FsbE9iamVjdChkZWwsIChQeU9iamVjdCAqKU5VTEwpOworICAgICAgICBpZiAocmVzID09IE5VTEwpCisgICAgICAgICAgICBQeUVycl9Xcml0ZVVucmFpc2FibGUoZGVsKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgUHlfREVDUkVGKHJlcyk7CisgICAgICAgIFB5X0RFQ1JFRihkZWwpOworICAgIH0KKyAgICAvKiBSZXN0b3JlIHRoZSBzYXZlZCBleGNlcHRpb24uICovCisgICAgUHlFcnJfUmVzdG9yZShlcnJvcl90eXBlLCBlcnJvcl92YWx1ZSwgZXJyb3JfdHJhY2ViYWNrKTsKIAotCS8qIFVuZG8gdGhlIHRlbXBvcmFyeSByZXN1cnJlY3Rpb247IGNhbid0IHVzZSBERUNSRUYgaGVyZSwgaXQgd291bGQKLQkgKiBjYXVzZSBhIHJlY3Vyc2l2ZSBjYWxsLgotCSAqLwotCWFzc2VydChpbnN0LT5vYl9yZWZjbnQgPiAwKTsKLQlpZiAoLS1pbnN0LT5vYl9yZWZjbnQgPT0gMCkgeworICAgIC8qIFVuZG8gdGhlIHRlbXBvcmFyeSByZXN1cnJlY3Rpb247IGNhbid0IHVzZSBERUNSRUYgaGVyZSwgaXQgd291bGQKKyAgICAgKiBjYXVzZSBhIHJlY3Vyc2l2ZSBjYWxsLgorICAgICAqLworICAgIGFzc2VydChpbnN0LT5vYl9yZWZjbnQgPiAwKTsKKyAgICBpZiAoLS1pbnN0LT5vYl9yZWZjbnQgPT0gMCkgewogCi0JCS8qIE5ldyB3ZWFrcmVmcyBjb3VsZCBiZSBjcmVhdGVkIGR1cmluZyB0aGUgZmluYWxpemVyIGNhbGwuCi0JCSAgICBJZiB0aGlzIG9jY3VycywgY2xlYXIgdGhlbSBvdXQgd2l0aG91dCBjYWxsaW5nIHRoZWlyCi0JCSAgICBmaW5hbGl6ZXJzIHNpbmNlIHRoZXkgbWlnaHQgcmVseSBvbiBwYXJ0IG9mIHRoZSBvYmplY3QKLQkJICAgIGJlaW5nIGZpbmFsaXplZCB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gZGVzdHJveWVkLiAqLwotCQl3aGlsZSAoaW5zdC0+aW5fd2Vha3JlZmxpc3QgIT0gTlVMTCkgewotCQkJX1B5V2Vha3JlZl9DbGVhclJlZigoUHlXZWFrUmVmZXJlbmNlICopCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnN0LT5pbl93ZWFrcmVmbGlzdCkpOwotCQl9CisgICAgICAgIC8qIE5ldyB3ZWFrcmVmcyBjb3VsZCBiZSBjcmVhdGVkIGR1cmluZyB0aGUgZmluYWxpemVyIGNhbGwuCisgICAgICAgICAgICBJZiB0aGlzIG9jY3VycywgY2xlYXIgdGhlbSBvdXQgd2l0aG91dCBjYWxsaW5nIHRoZWlyCisgICAgICAgICAgICBmaW5hbGl6ZXJzIHNpbmNlIHRoZXkgbWlnaHQgcmVseSBvbiBwYXJ0IG9mIHRoZSBvYmplY3QKKyAgICAgICAgICAgIGJlaW5nIGZpbmFsaXplZCB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gZGVzdHJveWVkLiAqLworICAgICAgICB3aGlsZSAoaW5zdC0+aW5fd2Vha3JlZmxpc3QgIT0gTlVMTCkgeworICAgICAgICAgICAgX1B5V2Vha3JlZl9DbGVhclJlZigoUHlXZWFrUmVmZXJlbmNlICopCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnN0LT5pbl93ZWFrcmVmbGlzdCkpOworICAgICAgICB9CiAKLQkJUHlfREVDUkVGKGluc3QtPmluX2NsYXNzKTsKLQkJUHlfWERFQ1JFRihpbnN0LT5pbl9kaWN0KTsKLQkJUHlPYmplY3RfR0NfRGVsKGluc3QpOwotCX0KLQllbHNlIHsKLQkJUHlfc3NpemVfdCByZWZjbnQgPSBpbnN0LT5vYl9yZWZjbnQ7Ci0JCS8qIF9fZGVsX18gcmVzdXJyZWN0ZWQgaXQhICBNYWtlIGl0IGxvb2sgbGlrZSB0aGUgb3JpZ2luYWwKLQkJICogUHlfREVDUkVGIG5ldmVyIGhhcHBlbmVkLgotCQkgKi8KLQkJX1B5X05ld1JlZmVyZW5jZSgoUHlPYmplY3QgKilpbnN0KTsKLQkJaW5zdC0+b2JfcmVmY250ID0gcmVmY250OwotCQlfUHlPYmplY3RfR0NfVFJBQ0soaW5zdCk7Ci0JCS8qIElmIFB5X1JFRl9ERUJVRywgX1B5X05ld1JlZmVyZW5jZSBidW1wZWQgX1B5X1JlZlRvdGFsLCBzbwotCQkgKiB3ZSBuZWVkIHRvIHVuZG8gdGhhdC4gKi8KLQkJX1B5X0RFQ19SRUZUT1RBTDsKLQkJLyogSWYgUHlfVFJBQ0VfUkVGUywgX1B5X05ld1JlZmVyZW5jZSByZS1hZGRlZCBzZWxmIHRvIHRoZQotCQkgKiBvYmplY3QgY2hhaW4sIHNvIG5vIG1vcmUgdG8gZG8gdGhlcmUuCi0JCSAqIElmIENPVU5UX0FMTE9DUywgdGhlIG9yaWdpbmFsIGRlY3JlZiBidW1wZWQgdHBfZnJlZXMsIGFuZAotCQkgKiBfUHlfTmV3UmVmZXJlbmNlIGJ1bXBlZCB0cF9hbGxvY3M6IGJvdGggb2YgdGhvc2UgbmVlZCB0byBiZQotCQkgKiB1bmRvbmUuCi0JCSAqLworICAgICAgICBQeV9ERUNSRUYoaW5zdC0+aW5fY2xhc3MpOworICAgICAgICBQeV9YREVDUkVGKGluc3QtPmluX2RpY3QpOworICAgICAgICBQeU9iamVjdF9HQ19EZWwoaW5zdCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeV9zc2l6ZV90IHJlZmNudCA9IGluc3QtPm9iX3JlZmNudDsKKyAgICAgICAgLyogX19kZWxfXyByZXN1cnJlY3RlZCBpdCEgIE1ha2UgaXQgbG9vayBsaWtlIHRoZSBvcmlnaW5hbAorICAgICAgICAgKiBQeV9ERUNSRUYgbmV2ZXIgaGFwcGVuZWQuCisgICAgICAgICAqLworICAgICAgICBfUHlfTmV3UmVmZXJlbmNlKChQeU9iamVjdCAqKWluc3QpOworICAgICAgICBpbnN0LT5vYl9yZWZjbnQgPSByZWZjbnQ7CisgICAgICAgIF9QeU9iamVjdF9HQ19UUkFDSyhpbnN0KTsKKyAgICAgICAgLyogSWYgUHlfUkVGX0RFQlVHLCBfUHlfTmV3UmVmZXJlbmNlIGJ1bXBlZCBfUHlfUmVmVG90YWwsIHNvCisgICAgICAgICAqIHdlIG5lZWQgdG8gdW5kbyB0aGF0LiAqLworICAgICAgICBfUHlfREVDX1JFRlRPVEFMOworICAgICAgICAvKiBJZiBQeV9UUkFDRV9SRUZTLCBfUHlfTmV3UmVmZXJlbmNlIHJlLWFkZGVkIHNlbGYgdG8gdGhlCisgICAgICAgICAqIG9iamVjdCBjaGFpbiwgc28gbm8gbW9yZSB0byBkbyB0aGVyZS4KKyAgICAgICAgICogSWYgQ09VTlRfQUxMT0NTLCB0aGUgb3JpZ2luYWwgZGVjcmVmIGJ1bXBlZCB0cF9mcmVlcywgYW5kCisgICAgICAgICAqIF9QeV9OZXdSZWZlcmVuY2UgYnVtcGVkIHRwX2FsbG9jczogYm90aCBvZiB0aG9zZSBuZWVkIHRvIGJlCisgICAgICAgICAqIHVuZG9uZS4KKyAgICAgICAgICovCiAjaWZkZWYgQ09VTlRfQUxMT0NTCi0JCS0taW5zdC0+b2JfdHlwZS0+dHBfZnJlZXM7Ci0JCS0taW5zdC0+b2JfdHlwZS0+dHBfYWxsb2NzOworICAgICAgICAtLWluc3QtPm9iX3R5cGUtPnRwX2ZyZWVzOworICAgICAgICAtLWluc3QtPm9iX3R5cGUtPnRwX2FsbG9jczsKICNlbmRpZgotCX0KKyAgICB9CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbnN0YW5jZV9nZXRhdHRyMShyZWdpc3RlciBQeUluc3RhbmNlT2JqZWN0ICppbnN0LCBQeU9iamVjdCAqbmFtZSkKIHsKLQlyZWdpc3RlciBQeU9iamVjdCAqdjsKLQlyZWdpc3RlciBjaGFyICpzbmFtZSA9IFB5U3RyaW5nX0FzU3RyaW5nKG5hbWUpOwotCWlmIChzbmFtZVswXSA9PSAnXycgJiYgc25hbWVbMV0gPT0gJ18nKSB7Ci0JCWlmIChzdHJjbXAoc25hbWUsICJfX2RpY3RfXyIpID09IDApIHsKLQkJCWlmIChQeUV2YWxfR2V0UmVzdHJpY3RlZCgpKSB7Ci0JCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKLQkJCSJpbnN0YW5jZS5fX2RpY3RfXyBub3QgYWNjZXNzaWJsZSBpbiByZXN0cmljdGVkIG1vZGUiKTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJCVB5X0lOQ1JFRihpbnN0LT5pbl9kaWN0KTsKLQkJCXJldHVybiBpbnN0LT5pbl9kaWN0OwotCQl9Ci0JCWlmIChzdHJjbXAoc25hbWUsICJfX2NsYXNzX18iKSA9PSAwKSB7Ci0JCQlQeV9JTkNSRUYoaW5zdC0+aW5fY2xhc3MpOwotCQkJcmV0dXJuIChQeU9iamVjdCAqKWluc3QtPmluX2NsYXNzOwotCQl9Ci0JfQotCXYgPSBpbnN0YW5jZV9nZXRhdHRyMihpbnN0LCBuYW1lKTsKLQlpZiAodiA9PSBOVUxMICYmICFQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19BdHRyaWJ1dGVFcnJvciwKLQkJCSAgICAgIiUuNTBzIGluc3RhbmNlIGhhcyBubyBhdHRyaWJ1dGUgJyUuNDAwcyciLAotCQkJICAgICBQeVN0cmluZ19BU19TVFJJTkcoaW5zdC0+aW5fY2xhc3MtPmNsX25hbWUpLCBzbmFtZSk7Ci0JfQotCXJldHVybiB2OworICAgIHJlZ2lzdGVyIFB5T2JqZWN0ICp2OworICAgIHJlZ2lzdGVyIGNoYXIgKnNuYW1lID0gUHlTdHJpbmdfQXNTdHJpbmcobmFtZSk7CisgICAgaWYgKHNuYW1lWzBdID09ICdfJyAmJiBzbmFtZVsxXSA9PSAnXycpIHsKKyAgICAgICAgaWYgKHN0cmNtcChzbmFtZSwgIl9fZGljdF9fIikgPT0gMCkgeworICAgICAgICAgICAgaWYgKFB5RXZhbF9HZXRSZXN0cmljdGVkKCkpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAorICAgICAgICAgICAgImluc3RhbmNlLl9fZGljdF9fIG5vdCBhY2Nlc3NpYmxlIGluIHJlc3RyaWN0ZWQgbW9kZSIpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlfSU5DUkVGKGluc3QtPmluX2RpY3QpOworICAgICAgICAgICAgcmV0dXJuIGluc3QtPmluX2RpY3Q7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0cmNtcChzbmFtZSwgIl9fY2xhc3NfXyIpID09IDApIHsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihpbnN0LT5pbl9jbGFzcyk7CisgICAgICAgICAgICByZXR1cm4gKFB5T2JqZWN0ICopaW5zdC0+aW5fY2xhc3M7CisgICAgICAgIH0KKyAgICB9CisgICAgdiA9IGluc3RhbmNlX2dldGF0dHIyKGluc3QsIG5hbWUpOworICAgIGlmICh2ID09IE5VTEwgJiYgIVB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX0F0dHJpYnV0ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIiUuNTBzIGluc3RhbmNlIGhhcyBubyBhdHRyaWJ1dGUgJyUuNDAwcyciLAorICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKGluc3QtPmluX2NsYXNzLT5jbF9uYW1lKSwgc25hbWUpOworICAgIH0KKyAgICByZXR1cm4gdjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGluc3RhbmNlX2dldGF0dHIyKHJlZ2lzdGVyIFB5SW5zdGFuY2VPYmplY3QgKmluc3QsIFB5T2JqZWN0ICpuYW1lKQogewotCXJlZ2lzdGVyIFB5T2JqZWN0ICp2OwotCVB5Q2xhc3NPYmplY3QgKmtsYXNzOwotCWRlc2NyZ2V0ZnVuYyBmOworICAgIHJlZ2lzdGVyIFB5T2JqZWN0ICp2OworICAgIFB5Q2xhc3NPYmplY3QgKmtsYXNzOworICAgIGRlc2NyZ2V0ZnVuYyBmOwogCi0JdiA9IFB5RGljdF9HZXRJdGVtKGluc3QtPmluX2RpY3QsIG5hbWUpOwotCWlmICh2ICE9IE5VTEwpIHsKLQkJUHlfSU5DUkVGKHYpOwotCQlyZXR1cm4gdjsKLQl9Ci0JdiA9IGNsYXNzX2xvb2t1cChpbnN0LT5pbl9jbGFzcywgbmFtZSwgJmtsYXNzKTsKLQlpZiAodiAhPSBOVUxMKSB7Ci0JCVB5X0lOQ1JFRih2KTsKLQkJZiA9IFRQX0RFU0NSX0dFVCh2LT5vYl90eXBlKTsKLQkJaWYgKGYgIT0gTlVMTCkgewotCQkJUHlPYmplY3QgKncgPSBmKHYsIChQeU9iamVjdCAqKWluc3QsCi0JCQkJCShQeU9iamVjdCAqKShpbnN0LT5pbl9jbGFzcykpOwotCQkJUHlfREVDUkVGKHYpOwotCQkJdiA9IHc7Ci0JCX0KLQl9Ci0JcmV0dXJuIHY7CisgICAgdiA9IFB5RGljdF9HZXRJdGVtKGluc3QtPmluX2RpY3QsIG5hbWUpOworICAgIGlmICh2ICE9IE5VTEwpIHsKKyAgICAgICAgUHlfSU5DUkVGKHYpOworICAgICAgICByZXR1cm4gdjsKKyAgICB9CisgICAgdiA9IGNsYXNzX2xvb2t1cChpbnN0LT5pbl9jbGFzcywgbmFtZSwgJmtsYXNzKTsKKyAgICBpZiAodiAhPSBOVUxMKSB7CisgICAgICAgIFB5X0lOQ1JFRih2KTsKKyAgICAgICAgZiA9IFRQX0RFU0NSX0dFVCh2LT5vYl90eXBlKTsKKyAgICAgICAgaWYgKGYgIT0gTlVMTCkgeworICAgICAgICAgICAgUHlPYmplY3QgKncgPSBmKHYsIChQeU9iamVjdCAqKWluc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFB5T2JqZWN0ICopKGluc3QtPmluX2NsYXNzKSk7CisgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICB2ID0gdzsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGluc3RhbmNlX2dldGF0dHIocmVnaXN0ZXIgUHlJbnN0YW5jZU9iamVjdCAqaW5zdCwgUHlPYmplY3QgKm5hbWUpCiB7Ci0JcmVnaXN0ZXIgUHlPYmplY3QgKmZ1bmMsICpyZXM7Ci0JcmVzID0gaW5zdGFuY2VfZ2V0YXR0cjEoaW5zdCwgbmFtZSk7Ci0JaWYgKHJlcyA9PSBOVUxMICYmIChmdW5jID0gaW5zdC0+aW5fY2xhc3MtPmNsX2dldGF0dHIpICE9IE5VTEwpIHsKLQkJUHlPYmplY3QgKmFyZ3M7Ci0JCWlmICghUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19BdHRyaWJ1dGVFcnJvcikpCi0JCQlyZXR1cm4gTlVMTDsKLQkJUHlFcnJfQ2xlYXIoKTsKLQkJYXJncyA9IFB5VHVwbGVfUGFjaygyLCBpbnN0LCBuYW1lKTsKLQkJaWYgKGFyZ3MgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQlyZXMgPSBQeUV2YWxfQ2FsbE9iamVjdChmdW5jLCBhcmdzKTsKLQkJUHlfREVDUkVGKGFyZ3MpOwotCX0KLQlyZXR1cm4gcmVzOworICAgIHJlZ2lzdGVyIFB5T2JqZWN0ICpmdW5jLCAqcmVzOworICAgIHJlcyA9IGluc3RhbmNlX2dldGF0dHIxKGluc3QsIG5hbWUpOworICAgIGlmIChyZXMgPT0gTlVMTCAmJiAoZnVuYyA9IGluc3QtPmluX2NsYXNzLT5jbF9nZXRhdHRyKSAhPSBOVUxMKSB7CisgICAgICAgIFB5T2JqZWN0ICphcmdzOworICAgICAgICBpZiAoIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfQXR0cmlidXRlRXJyb3IpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIGFyZ3MgPSBQeVR1cGxlX1BhY2soMiwgaW5zdCwgbmFtZSk7CisgICAgICAgIGlmIChhcmdzID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgcmVzID0gUHlFdmFsX0NhbGxPYmplY3QoZnVuYywgYXJncyk7CisgICAgICAgIFB5X0RFQ1JFRihhcmdzKTsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKIH0KIAogLyogU2VlIGNsYXNzb2JqZWN0LmggY29tbWVudHM6ICB0aGlzIG9ubHkgZG9lcyBkaWN0IGxvb2t1cHMsIGFuZCBpcyBhbHdheXMKQEAgLTc3MiwyMzUgKzc3MiwyMzUgQEAKIFB5T2JqZWN0ICoKIF9QeUluc3RhbmNlX0xvb2t1cChQeU9iamVjdCAqcGluc3QsIFB5T2JqZWN0ICpuYW1lKQogewotCVB5T2JqZWN0ICp2OwotCVB5Q2xhc3NPYmplY3QgKmtsYXNzOwotCVB5SW5zdGFuY2VPYmplY3QgKmluc3Q7CS8qIHBpbnN0IGNhc3QgdG8gdGhlIHJpZ2h0IHR5cGUgKi8KKyAgICBQeU9iamVjdCAqdjsKKyAgICBQeUNsYXNzT2JqZWN0ICprbGFzczsKKyAgICBQeUluc3RhbmNlT2JqZWN0ICppbnN0OyAgICAgLyogcGluc3QgY2FzdCB0byB0aGUgcmlnaHQgdHlwZSAqLwogCi0JYXNzZXJ0KFB5SW5zdGFuY2VfQ2hlY2socGluc3QpKTsKLQlpbnN0ID0gKFB5SW5zdGFuY2VPYmplY3QgKilwaW5zdDsKKyAgICBhc3NlcnQoUHlJbnN0YW5jZV9DaGVjayhwaW5zdCkpOworICAgIGluc3QgPSAoUHlJbnN0YW5jZU9iamVjdCAqKXBpbnN0OwogCi0JYXNzZXJ0KFB5U3RyaW5nX0NoZWNrKG5hbWUpKTsKKyAgICBhc3NlcnQoUHlTdHJpbmdfQ2hlY2sobmFtZSkpOwogCi0gCXYgPSBQeURpY3RfR2V0SXRlbShpbnN0LT5pbl9kaWN0LCBuYW1lKTsKLQlpZiAodiA9PSBOVUxMKQotCQl2ID0gY2xhc3NfbG9va3VwKGluc3QtPmluX2NsYXNzLCBuYW1lLCAma2xhc3MpOwotCXJldHVybiB2OworICAgIHYgPSBQeURpY3RfR2V0SXRlbShpbnN0LT5pbl9kaWN0LCBuYW1lKTsKKyAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICB2ID0gY2xhc3NfbG9va3VwKGluc3QtPmluX2NsYXNzLCBuYW1lLCAma2xhc3MpOworICAgIHJldHVybiB2OwogfQogCiBzdGF0aWMgaW50CiBpbnN0YW5jZV9zZXRhdHRyMShQeUluc3RhbmNlT2JqZWN0ICppbnN0LCBQeU9iamVjdCAqbmFtZSwgUHlPYmplY3QgKnYpCiB7Ci0JaWYgKHYgPT0gTlVMTCkgewotCQlpbnQgcnYgPSBQeURpY3RfRGVsSXRlbShpbnN0LT5pbl9kaWN0LCBuYW1lKTsKLQkJaWYgKHJ2IDwgMCkKLQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19BdHRyaWJ1dGVFcnJvciwKLQkJCQkgICAgICIlLjUwcyBpbnN0YW5jZSBoYXMgbm8gYXR0cmlidXRlICclLjQwMHMnIiwKLQkJCQkgICAgIFB5U3RyaW5nX0FTX1NUUklORyhpbnN0LT5pbl9jbGFzcy0+Y2xfbmFtZSksCi0JCQkJICAgICBQeVN0cmluZ19BU19TVFJJTkcobmFtZSkpOwotCQlyZXR1cm4gcnY7Ci0JfQotCWVsc2UKLQkJcmV0dXJuIFB5RGljdF9TZXRJdGVtKGluc3QtPmluX2RpY3QsIG5hbWUsIHYpOworICAgIGlmICh2ID09IE5VTEwpIHsKKyAgICAgICAgaW50IHJ2ID0gUHlEaWN0X0RlbEl0ZW0oaW5zdC0+aW5fZGljdCwgbmFtZSk7CisgICAgICAgIGlmIChydiA8IDApCisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfQXR0cmlidXRlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIiUuNTBzIGluc3RhbmNlIGhhcyBubyBhdHRyaWJ1dGUgJyUuNDAwcyciLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FTX1NUUklORyhpbnN0LT5pbl9jbGFzcy0+Y2xfbmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKG5hbWUpKTsKKyAgICAgICAgcmV0dXJuIHJ2OworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiBQeURpY3RfU2V0SXRlbShpbnN0LT5pbl9kaWN0LCBuYW1lLCB2KTsKIH0KIAogc3RhdGljIGludAogaW5zdGFuY2Vfc2V0YXR0cihQeUluc3RhbmNlT2JqZWN0ICppbnN0LCBQeU9iamVjdCAqbmFtZSwgUHlPYmplY3QgKnYpCiB7Ci0JUHlPYmplY3QgKmZ1bmMsICphcmdzLCAqcmVzLCAqdG1wOwotCWNoYXIgKnNuYW1lID0gUHlTdHJpbmdfQXNTdHJpbmcobmFtZSk7Ci0JaWYgKHNuYW1lWzBdID09ICdfJyAmJiBzbmFtZVsxXSA9PSAnXycpIHsKLQkJUHlfc3NpemVfdCBuID0gUHlTdHJpbmdfU2l6ZShuYW1lKTsKLQkJaWYgKHNuYW1lW24tMV0gPT0gJ18nICYmIHNuYW1lW24tMl0gPT0gJ18nKSB7Ci0JCQlpZiAoc3RyY21wKHNuYW1lLCAiX19kaWN0X18iKSA9PSAwKSB7Ci0JCQkJaWYgKFB5RXZhbF9HZXRSZXN0cmljdGVkKCkpIHsKLQkJCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKLQkJCQkgIl9fZGljdF9fIG5vdCBhY2Nlc3NpYmxlIGluIHJlc3RyaWN0ZWQgbW9kZSIpOwotCQkJCQlyZXR1cm4gLTE7Ci0JCQkJfQotCQkJCWlmICh2ID09IE5VTEwgfHwgIVB5RGljdF9DaGVjayh2KSkgewotCQkJCSAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSAgICAgICAiX19kaWN0X18gbXVzdCBiZSBzZXQgdG8gYSBkaWN0aW9uYXJ5Iik7Ci0JCQkJICAgIHJldHVybiAtMTsKLQkJCQl9Ci0JCQkJdG1wID0gaW5zdC0+aW5fZGljdDsKLQkJCQlQeV9JTkNSRUYodik7Ci0JCQkJaW5zdC0+aW5fZGljdCA9IHY7Ci0JCQkJUHlfREVDUkVGKHRtcCk7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQlpZiAoc3RyY21wKHNuYW1lLCAiX19jbGFzc19fIikgPT0gMCkgewotCQkJCWlmIChQeUV2YWxfR2V0UmVzdHJpY3RlZCgpKSB7Ci0JCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCi0JCQkJIl9fY2xhc3NfXyBub3QgYWNjZXNzaWJsZSBpbiByZXN0cmljdGVkIG1vZGUiKTsKLQkJCQkJcmV0dXJuIC0xOwotCQkJCX0KLQkJCQlpZiAodiA9PSBOVUxMIHx8ICFQeUNsYXNzX0NoZWNrKHYpKSB7Ci0JCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJCSAgICJfX2NsYXNzX18gbXVzdCBiZSBzZXQgdG8gYSBjbGFzcyIpOwotCQkJCQlyZXR1cm4gLTE7Ci0JCQkJfQotCQkJCXRtcCA9IChQeU9iamVjdCAqKShpbnN0LT5pbl9jbGFzcyk7Ci0JCQkJUHlfSU5DUkVGKHYpOwotCQkJCWluc3QtPmluX2NsYXNzID0gKFB5Q2xhc3NPYmplY3QgKil2OwotCQkJCVB5X0RFQ1JFRih0bXApOwotCQkJCXJldHVybiAwOwotCQkJfQotCQl9Ci0JfQotCWlmICh2ID09IE5VTEwpCi0JCWZ1bmMgPSBpbnN0LT5pbl9jbGFzcy0+Y2xfZGVsYXR0cjsKLQllbHNlCi0JCWZ1bmMgPSBpbnN0LT5pbl9jbGFzcy0+Y2xfc2V0YXR0cjsKLQlpZiAoZnVuYyA9PSBOVUxMKQotCQlyZXR1cm4gaW5zdGFuY2Vfc2V0YXR0cjEoaW5zdCwgbmFtZSwgdik7Ci0JaWYgKHYgPT0gTlVMTCkKLQkJYXJncyA9IFB5VHVwbGVfUGFjaygyLCBpbnN0LCBuYW1lKTsKLQllbHNlCi0JCWFyZ3MgPSBQeVR1cGxlX1BhY2soMywgaW5zdCwgbmFtZSwgdik7Ci0JaWYgKGFyZ3MgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCXJlcyA9IFB5RXZhbF9DYWxsT2JqZWN0KGZ1bmMsIGFyZ3MpOwotCVB5X0RFQ1JFRihhcmdzKTsKLQlpZiAocmVzID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQlQeV9ERUNSRUYocmVzKTsKLQlyZXR1cm4gMDsKKyAgICBQeU9iamVjdCAqZnVuYywgKmFyZ3MsICpyZXMsICp0bXA7CisgICAgY2hhciAqc25hbWUgPSBQeVN0cmluZ19Bc1N0cmluZyhuYW1lKTsKKyAgICBpZiAoc25hbWVbMF0gPT0gJ18nICYmIHNuYW1lWzFdID09ICdfJykgeworICAgICAgICBQeV9zc2l6ZV90IG4gPSBQeVN0cmluZ19TaXplKG5hbWUpOworICAgICAgICBpZiAoc25hbWVbbi0xXSA9PSAnXycgJiYgc25hbWVbbi0yXSA9PSAnXycpIHsKKyAgICAgICAgICAgIGlmIChzdHJjbXAoc25hbWUsICJfX2RpY3RfXyIpID09IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoUHlFdmFsX0dldFJlc3RyaWN0ZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAorICAgICAgICAgICAgICAgICAiX19kaWN0X18gbm90IGFjY2Vzc2libGUgaW4gcmVzdHJpY3RlZCBtb2RlIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHYgPT0gTlVMTCB8fCAhUHlEaWN0X0NoZWNrKHYpKSB7CisgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICJfX2RpY3RfXyBtdXN0IGJlIHNldCB0byBhIGRpY3Rpb25hcnkiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0bXAgPSBpbnN0LT5pbl9kaWN0OworICAgICAgICAgICAgICAgIFB5X0lOQ1JFRih2KTsKKyAgICAgICAgICAgICAgICBpbnN0LT5pbl9kaWN0ID0gdjsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYodG1wKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdHJjbXAoc25hbWUsICJfX2NsYXNzX18iKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKFB5RXZhbF9HZXRSZXN0cmljdGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICAiX19jbGFzc19fIG5vdCBhY2Nlc3NpYmxlIGluIHJlc3RyaWN0ZWQgbW9kZSIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICh2ID09IE5VTEwgfHwgIVB5Q2xhc3NfQ2hlY2sodikpIHsKKyAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIl9fY2xhc3NfXyBtdXN0IGJlIHNldCB0byBhIGNsYXNzIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdG1wID0gKFB5T2JqZWN0ICopKGluc3QtPmluX2NsYXNzKTsKKyAgICAgICAgICAgICAgICBQeV9JTkNSRUYodik7CisgICAgICAgICAgICAgICAgaW5zdC0+aW5fY2xhc3MgPSAoUHlDbGFzc09iamVjdCAqKXY7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHRtcCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHYgPT0gTlVMTCkKKyAgICAgICAgZnVuYyA9IGluc3QtPmluX2NsYXNzLT5jbF9kZWxhdHRyOworICAgIGVsc2UKKyAgICAgICAgZnVuYyA9IGluc3QtPmluX2NsYXNzLT5jbF9zZXRhdHRyOworICAgIGlmIChmdW5jID09IE5VTEwpCisgICAgICAgIHJldHVybiBpbnN0YW5jZV9zZXRhdHRyMShpbnN0LCBuYW1lLCB2KTsKKyAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICBhcmdzID0gUHlUdXBsZV9QYWNrKDIsIGluc3QsIG5hbWUpOworICAgIGVsc2UKKyAgICAgICAgYXJncyA9IFB5VHVwbGVfUGFjaygzLCBpbnN0LCBuYW1lLCB2KTsKKyAgICBpZiAoYXJncyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAgcmVzID0gUHlFdmFsX0NhbGxPYmplY3QoZnVuYywgYXJncyk7CisgICAgUHlfREVDUkVGKGFyZ3MpOworICAgIGlmIChyZXMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIFB5X0RFQ1JFRihyZXMpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaW5zdGFuY2VfcmVwcihQeUluc3RhbmNlT2JqZWN0ICppbnN0KQogewotCVB5T2JqZWN0ICpmdW5jOwotCVB5T2JqZWN0ICpyZXM7Ci0Jc3RhdGljIFB5T2JqZWN0ICpyZXByc3RyOworICAgIFB5T2JqZWN0ICpmdW5jOworICAgIFB5T2JqZWN0ICpyZXM7CisgICAgc3RhdGljIFB5T2JqZWN0ICpyZXByc3RyOwogCi0JaWYgKHJlcHJzdHIgPT0gTlVMTCkgewotCQlyZXByc3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19yZXByX18iKTsKLQkJaWYgKHJlcHJzdHIgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCX0KLQlmdW5jID0gaW5zdGFuY2VfZ2V0YXR0cihpbnN0LCByZXByc3RyKTsKLQlpZiAoZnVuYyA9PSBOVUxMKSB7Ci0JCVB5T2JqZWN0ICpjbGFzc25hbWUsICptb2Q7Ci0JCWNoYXIgKmNuYW1lOwotCQlpZiAoIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfQXR0cmlidXRlRXJyb3IpKQotCQkJcmV0dXJuIE5VTEw7Ci0JCVB5RXJyX0NsZWFyKCk7Ci0JCWNsYXNzbmFtZSA9IGluc3QtPmluX2NsYXNzLT5jbF9uYW1lOwotCQltb2QgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhpbnN0LT5pbl9jbGFzcy0+Y2xfZGljdCwKLQkJCQkJICAgIl9fbW9kdWxlX18iKTsKLQkJaWYgKGNsYXNzbmFtZSAhPSBOVUxMICYmIFB5U3RyaW5nX0NoZWNrKGNsYXNzbmFtZSkpCi0JCQljbmFtZSA9IFB5U3RyaW5nX0FzU3RyaW5nKGNsYXNzbmFtZSk7Ci0JCWVsc2UKLQkJCWNuYW1lID0gIj8iOwotCQlpZiAobW9kID09IE5VTEwgfHwgIVB5U3RyaW5nX0NoZWNrKG1vZCkpCi0JCQlyZXR1cm4gUHlTdHJpbmdfRnJvbUZvcm1hdCgiPD8uJXMgaW5zdGFuY2UgYXQgJXA+IiwKLQkJCQkJCSAgIGNuYW1lLCBpbnN0KTsKLQkJZWxzZQotCQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21Gb3JtYXQoIjwlcy4lcyBpbnN0YW5jZSBhdCAlcD4iLAotCQkJCQkJICAgUHlTdHJpbmdfQXNTdHJpbmcobW9kKSwKLQkJCQkJCSAgIGNuYW1lLCBpbnN0KTsKLQl9Ci0JcmVzID0gUHlFdmFsX0NhbGxPYmplY3QoZnVuYywgKFB5T2JqZWN0ICopTlVMTCk7Ci0JUHlfREVDUkVGKGZ1bmMpOwotCXJldHVybiByZXM7CisgICAgaWYgKHJlcHJzdHIgPT0gTlVMTCkgeworICAgICAgICByZXByc3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19yZXByX18iKTsKKyAgICAgICAgaWYgKHJlcHJzdHIgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBmdW5jID0gaW5zdGFuY2VfZ2V0YXR0cihpbnN0LCByZXByc3RyKTsKKyAgICBpZiAoZnVuYyA9PSBOVUxMKSB7CisgICAgICAgIFB5T2JqZWN0ICpjbGFzc25hbWUsICptb2Q7CisgICAgICAgIGNoYXIgKmNuYW1lOworICAgICAgICBpZiAoIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfQXR0cmlidXRlRXJyb3IpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIGNsYXNzbmFtZSA9IGluc3QtPmluX2NsYXNzLT5jbF9uYW1lOworICAgICAgICBtb2QgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhpbnN0LT5pbl9jbGFzcy0+Y2xfZGljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9fbW9kdWxlX18iKTsKKyAgICAgICAgaWYgKGNsYXNzbmFtZSAhPSBOVUxMICYmIFB5U3RyaW5nX0NoZWNrKGNsYXNzbmFtZSkpCisgICAgICAgICAgICBjbmFtZSA9IFB5U3RyaW5nX0FzU3RyaW5nKGNsYXNzbmFtZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGNuYW1lID0gIj8iOworICAgICAgICBpZiAobW9kID09IE5VTEwgfHwgIVB5U3RyaW5nX0NoZWNrKG1vZCkpCisgICAgICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbUZvcm1hdCgiPD8uJXMgaW5zdGFuY2UgYXQgJXA+IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNuYW1lLCBpbnN0KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21Gb3JtYXQoIjwlcy4lcyBpbnN0YW5jZSBhdCAlcD4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQXNTdHJpbmcobW9kKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNuYW1lLCBpbnN0KTsKKyAgICB9CisgICAgcmVzID0gUHlFdmFsX0NhbGxPYmplY3QoZnVuYywgKFB5T2JqZWN0ICopTlVMTCk7CisgICAgUHlfREVDUkVGKGZ1bmMpOworICAgIHJldHVybiByZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbnN0YW5jZV9zdHIoUHlJbnN0YW5jZU9iamVjdCAqaW5zdCkKIHsKLQlQeU9iamVjdCAqZnVuYzsKLQlQeU9iamVjdCAqcmVzOwotCXN0YXRpYyBQeU9iamVjdCAqc3Ryc3RyOworICAgIFB5T2JqZWN0ICpmdW5jOworICAgIFB5T2JqZWN0ICpyZXM7CisgICAgc3RhdGljIFB5T2JqZWN0ICpzdHJzdHI7CiAKLQlpZiAoc3Ryc3RyID09IE5VTEwpIHsKLQkJc3Ryc3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19zdHJfXyIpOwotCQlpZiAoc3Ryc3RyID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZnVuYyA9IGluc3RhbmNlX2dldGF0dHIoaW5zdCwgc3Ryc3RyKTsKLQlpZiAoZnVuYyA9PSBOVUxMKSB7Ci0JCWlmICghUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19BdHRyaWJ1dGVFcnJvcikpCi0JCQlyZXR1cm4gTlVMTDsKLQkJUHlFcnJfQ2xlYXIoKTsKLQkJcmV0dXJuIGluc3RhbmNlX3JlcHIoaW5zdCk7Ci0JfQotCXJlcyA9IFB5RXZhbF9DYWxsT2JqZWN0KGZ1bmMsIChQeU9iamVjdCAqKU5VTEwpOwotCVB5X0RFQ1JFRihmdW5jKTsKLQlyZXR1cm4gcmVzOworICAgIGlmIChzdHJzdHIgPT0gTlVMTCkgeworICAgICAgICBzdHJzdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX3N0cl9fIik7CisgICAgICAgIGlmIChzdHJzdHIgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBmdW5jID0gaW5zdGFuY2VfZ2V0YXR0cihpbnN0LCBzdHJzdHIpOworICAgIGlmIChmdW5jID09IE5VTEwpIHsKKyAgICAgICAgaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICByZXR1cm4gaW5zdGFuY2VfcmVwcihpbnN0KTsKKyAgICB9CisgICAgcmVzID0gUHlFdmFsX0NhbGxPYmplY3QoZnVuYywgKFB5T2JqZWN0ICopTlVMTCk7CisgICAgUHlfREVDUkVGKGZ1bmMpOworICAgIHJldHVybiByZXM7CiB9CiAKIHN0YXRpYyBsb25nCiBpbnN0YW5jZV9oYXNoKFB5SW5zdGFuY2VPYmplY3QgKmluc3QpCiB7Ci0JUHlPYmplY3QgKmZ1bmM7Ci0JUHlPYmplY3QgKnJlczsKLQlsb25nIG91dGNvbWU7Ci0Jc3RhdGljIFB5T2JqZWN0ICpoYXNoc3RyLCAqZXFzdHIsICpjbXBzdHI7CisgICAgUHlPYmplY3QgKmZ1bmM7CisgICAgUHlPYmplY3QgKnJlczsKKyAgICBsb25nIG91dGNvbWU7CisgICAgc3RhdGljIFB5T2JqZWN0ICpoYXNoc3RyLCAqZXFzdHIsICpjbXBzdHI7CiAKLQlpZiAoaGFzaHN0ciA9PSBOVUxMKSB7Ci0JCWhhc2hzdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2hhc2hfXyIpOwotCQlpZiAoaGFzaHN0ciA9PSBOVUxMKQotCQkJcmV0dXJuIC0xOwotCX0KLQlmdW5jID0gaW5zdGFuY2VfZ2V0YXR0cihpbnN0LCBoYXNoc3RyKTsKLQlpZiAoZnVuYyA9PSBOVUxMKSB7Ci0JCWlmICghUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19BdHRyaWJ1dGVFcnJvcikpCi0JCQlyZXR1cm4gLTE7Ci0JCVB5RXJyX0NsZWFyKCk7Ci0JCS8qIElmIHRoZXJlIGlzIG5vIF9fZXFfXyBhbmQgbm8gX19jbXBfXyBtZXRob2QsIHdlIGhhc2ggb24gdGhlCi0JCSAgIGFkZHJlc3MuICBJZiBhbiBfX2VxX18gb3IgX19jbXBfXyBtZXRob2QgZXhpc3RzLCB0aGVyZSBtdXN0Ci0JCSAgIGJlIGEgX19oYXNoX18uICovCi0JCWlmIChlcXN0ciA9PSBOVUxMKSB7Ci0JCQllcXN0ciA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fZXFfXyIpOwotCQkJaWYgKGVxc3RyID09IE5VTEwpCi0JCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWZ1bmMgPSBpbnN0YW5jZV9nZXRhdHRyKGluc3QsIGVxc3RyKTsKLQkJaWYgKGZ1bmMgPT0gTlVMTCkgewotCQkJaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkKLQkJCQlyZXR1cm4gLTE7Ci0JCQlQeUVycl9DbGVhcigpOwotCQkJaWYgKGNtcHN0ciA9PSBOVUxMKSB7Ci0JCQkJY21wc3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19jbXBfXyIpOwotCQkJCWlmIChjbXBzdHIgPT0gTlVMTCkKLQkJCQkJcmV0dXJuIC0xOwotCQkJfQotCQkJZnVuYyA9IGluc3RhbmNlX2dldGF0dHIoaW5zdCwgY21wc3RyKTsKLQkJCWlmIChmdW5jID09IE5VTEwpIHsKLQkJCQlpZiAoIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoCi0JCQkJCVB5RXhjX0F0dHJpYnV0ZUVycm9yKSkKLQkJCQkJcmV0dXJuIC0xOwotCQkJCVB5RXJyX0NsZWFyKCk7Ci0JCQkJcmV0dXJuIF9QeV9IYXNoUG9pbnRlcihpbnN0KTsKLQkJCX0KLQkJfQotCQlQeV9YREVDUkVGKGZ1bmMpOwotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAidW5oYXNoYWJsZSBpbnN0YW5jZSIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXJlcyA9IFB5RXZhbF9DYWxsT2JqZWN0KGZ1bmMsIChQeU9iamVjdCAqKU5VTEwpOwotCVB5X0RFQ1JFRihmdW5jKTsKLQlpZiAocmVzID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQlpZiAoUHlJbnRfQ2hlY2socmVzKSB8fCBQeUxvbmdfQ2hlY2socmVzKSkKLQkJLyogVGhpcyBhbHJlYWR5IGNvbnZlcnRzIGEgLTEgcmVzdWx0IHRvIC0yLiAqLwotCQlvdXRjb21lID0gcmVzLT5vYl90eXBlLT50cF9oYXNoKHJlcyk7Ci0JZWxzZSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJIl9faGFzaF9fKCkgc2hvdWxkIHJldHVybiBhbiBpbnQiKTsKLQkJb3V0Y29tZSA9IC0xOwotCX0KLQlQeV9ERUNSRUYocmVzKTsKLQlyZXR1cm4gb3V0Y29tZTsKKyAgICBpZiAoaGFzaHN0ciA9PSBOVUxMKSB7CisgICAgICAgIGhhc2hzdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2hhc2hfXyIpOworICAgICAgICBpZiAoaGFzaHN0ciA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBmdW5jID0gaW5zdGFuY2VfZ2V0YXR0cihpbnN0LCBoYXNoc3RyKTsKKyAgICBpZiAoZnVuYyA9PSBOVUxMKSB7CisgICAgICAgIGlmICghUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19BdHRyaWJ1dGVFcnJvcikpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIC8qIElmIHRoZXJlIGlzIG5vIF9fZXFfXyBhbmQgbm8gX19jbXBfXyBtZXRob2QsIHdlIGhhc2ggb24gdGhlCisgICAgICAgICAgIGFkZHJlc3MuICBJZiBhbiBfX2VxX18gb3IgX19jbXBfXyBtZXRob2QgZXhpc3RzLCB0aGVyZSBtdXN0CisgICAgICAgICAgIGJlIGEgX19oYXNoX18uICovCisgICAgICAgIGlmIChlcXN0ciA9PSBOVUxMKSB7CisgICAgICAgICAgICBlcXN0ciA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fZXFfXyIpOworICAgICAgICAgICAgaWYgKGVxc3RyID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGZ1bmMgPSBpbnN0YW5jZV9nZXRhdHRyKGluc3QsIGVxc3RyKTsKKyAgICAgICAgaWYgKGZ1bmMgPT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgaWYgKGNtcHN0ciA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgY21wc3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19jbXBfXyIpOworICAgICAgICAgICAgICAgIGlmIChjbXBzdHIgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZnVuYyA9IGluc3RhbmNlX2dldGF0dHIoaW5zdCwgY21wc3RyKTsKKyAgICAgICAgICAgIGlmIChmdW5jID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpZiAoIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoCisgICAgICAgICAgICAgICAgICAgIFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9QeV9IYXNoUG9pbnRlcihpbnN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBQeV9YREVDUkVGKGZ1bmMpOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAidW5oYXNoYWJsZSBpbnN0YW5jZSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJlcyA9IFB5RXZhbF9DYWxsT2JqZWN0KGZ1bmMsIChQeU9iamVjdCAqKU5VTEwpOworICAgIFB5X0RFQ1JFRihmdW5jKTsKKyAgICBpZiAocmVzID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAoUHlJbnRfQ2hlY2socmVzKSB8fCBQeUxvbmdfQ2hlY2socmVzKSkKKyAgICAgICAgLyogVGhpcyBhbHJlYWR5IGNvbnZlcnRzIGEgLTEgcmVzdWx0IHRvIC0yLiAqLworICAgICAgICBvdXRjb21lID0gcmVzLT5vYl90eXBlLT50cF9oYXNoKHJlcyk7CisgICAgZWxzZSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiX19oYXNoX18oKSBzaG91bGQgcmV0dXJuIGFuIGludCIpOworICAgICAgICBvdXRjb21lID0gLTE7CisgICAgfQorICAgIFB5X0RFQ1JFRihyZXMpOworICAgIHJldHVybiBvdXRjb21lOwogfQogCiBzdGF0aWMgaW50CiBpbnN0YW5jZV90cmF2ZXJzZShQeUluc3RhbmNlT2JqZWN0ICpvLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlQeV9WSVNJVChvLT5pbl9jbGFzcyk7Ci0JUHlfVklTSVQoby0+aW5fZGljdCk7Ci0JcmV0dXJuIDA7CisgICAgUHlfVklTSVQoby0+aW5fY2xhc3MpOworICAgIFB5X1ZJU0lUKG8tPmluX2RpY3QpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKmdldGl0ZW1zdHIsICpzZXRpdGVtc3RyLCAqZGVsaXRlbXN0ciwgKmxlbnN0cjsKQEAgLTEwMDksNDEzICsxMDA5LDQxMyBAQAogc3RhdGljIFB5X3NzaXplX3QKIGluc3RhbmNlX2xlbmd0aChQeUluc3RhbmNlT2JqZWN0ICppbnN0KQogewotCVB5T2JqZWN0ICpmdW5jOwotCVB5T2JqZWN0ICpyZXM7Ci0JUHlfc3NpemVfdCBvdXRjb21lOworICAgIFB5T2JqZWN0ICpmdW5jOworICAgIFB5T2JqZWN0ICpyZXM7CisgICAgUHlfc3NpemVfdCBvdXRjb21lOwogCi0JaWYgKGxlbnN0ciA9PSBOVUxMKSB7Ci0JCWxlbnN0ciA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fbGVuX18iKTsKLQkJaWYgKGxlbnN0ciA9PSBOVUxMKQotCQkJcmV0dXJuIC0xOwotCX0KLQlmdW5jID0gaW5zdGFuY2VfZ2V0YXR0cihpbnN0LCBsZW5zdHIpOwotCWlmIChmdW5jID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQlyZXMgPSBQeUV2YWxfQ2FsbE9iamVjdChmdW5jLCAoUHlPYmplY3QgKilOVUxMKTsKLQlQeV9ERUNSRUYoZnVuYyk7Ci0JaWYgKHJlcyA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0JaWYgKFB5SW50X0NoZWNrKHJlcykpIHsKLQkJb3V0Y29tZSA9IFB5SW50X0FzU3NpemVfdChyZXMpOwotCQlpZiAob3V0Y29tZSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCQlQeV9ERUNSRUYocmVzKTsKLQkJCXJldHVybiAtMTsKLQkJfQorICAgIGlmIChsZW5zdHIgPT0gTlVMTCkgeworICAgICAgICBsZW5zdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2xlbl9fIik7CisgICAgICAgIGlmIChsZW5zdHIgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgZnVuYyA9IGluc3RhbmNlX2dldGF0dHIoaW5zdCwgbGVuc3RyKTsKKyAgICBpZiAoZnVuYyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAgcmVzID0gUHlFdmFsX0NhbGxPYmplY3QoZnVuYywgKFB5T2JqZWN0ICopTlVMTCk7CisgICAgUHlfREVDUkVGKGZ1bmMpOworICAgIGlmIChyZXMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmIChQeUludF9DaGVjayhyZXMpKSB7CisgICAgICAgIG91dGNvbWUgPSBQeUludF9Bc1NzaXplX3QocmVzKTsKKyAgICAgICAgaWYgKG91dGNvbWUgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICAgICAgUHlfREVDUkVGKHJlcyk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KICNpZiBTSVpFT0ZfU0laRV9UIDwgU0laRU9GX0lOVAotCQkvKiBPdmVyZmxvdyBjaGVjayAtLSByYW5nZSBvZiBQeUludCBpcyBtb3JlIHRoYW4gQyBpbnQgKi8KLQkJaWYgKG91dGNvbWUgIT0gKGludClvdXRjb21lKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJCSAiX19sZW5fXygpIHNob3VsZCByZXR1cm4gMCA8PSBvdXRjb21lIDwgMioqMzEiKTsKLQkJCW91dGNvbWUgPSAtMTsKLQkJfQotCQllbHNlCisgICAgICAgIC8qIE92ZXJmbG93IGNoZWNrIC0tIHJhbmdlIG9mIFB5SW50IGlzIG1vcmUgdGhhbiBDIGludCAqLworICAgICAgICBpZiAob3V0Y29tZSAhPSAoaW50KW91dGNvbWUpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICJfX2xlbl9fKCkgc2hvdWxkIHJldHVybiAwIDw9IG91dGNvbWUgPCAyKiozMSIpOworICAgICAgICAgICAgb3V0Y29tZSA9IC0xOworICAgICAgICB9CisgICAgICAgIGVsc2UKICNlbmRpZgotCQlpZiAob3V0Y29tZSA8IDApIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCQkiX19sZW5fXygpIHNob3VsZCByZXR1cm4gPj0gMCIpOwotCQkJb3V0Y29tZSA9IC0xOwotCQl9Ci0JfQotCWVsc2UgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJfX2xlbl9fKCkgc2hvdWxkIHJldHVybiBhbiBpbnQiKTsKLQkJb3V0Y29tZSA9IC0xOwotCX0KLQlQeV9ERUNSRUYocmVzKTsKLQlyZXR1cm4gb3V0Y29tZTsKKyAgICAgICAgaWYgKG91dGNvbWUgPCAwKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX19sZW5fXygpIHNob3VsZCByZXR1cm4gPj0gMCIpOworICAgICAgICAgICAgb3V0Y29tZSA9IC0xOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIl9fbGVuX18oKSBzaG91bGQgcmV0dXJuIGFuIGludCIpOworICAgICAgICBvdXRjb21lID0gLTE7CisgICAgfQorICAgIFB5X0RFQ1JFRihyZXMpOworICAgIHJldHVybiBvdXRjb21lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaW5zdGFuY2Vfc3Vic2NyaXB0KFB5SW5zdGFuY2VPYmplY3QgKmluc3QsIFB5T2JqZWN0ICprZXkpCiB7Ci0JUHlPYmplY3QgKmZ1bmM7Ci0JUHlPYmplY3QgKmFyZzsKLQlQeU9iamVjdCAqcmVzOworICAgIFB5T2JqZWN0ICpmdW5jOworICAgIFB5T2JqZWN0ICphcmc7CisgICAgUHlPYmplY3QgKnJlczsKIAotCWlmIChnZXRpdGVtc3RyID09IE5VTEwpIHsKLQkJZ2V0aXRlbXN0ciA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fZ2V0aXRlbV9fIik7Ci0JCWlmIChnZXRpdGVtc3RyID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZnVuYyA9IGluc3RhbmNlX2dldGF0dHIoaW5zdCwgZ2V0aXRlbXN0cik7Ci0JaWYgKGZ1bmMgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JYXJnID0gUHlUdXBsZV9QYWNrKDEsIGtleSk7Ci0JaWYgKGFyZyA9PSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRihmdW5jKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJlcyA9IFB5RXZhbF9DYWxsT2JqZWN0KGZ1bmMsIGFyZyk7Ci0JUHlfREVDUkVGKGZ1bmMpOwotCVB5X0RFQ1JFRihhcmcpOwotCXJldHVybiByZXM7CisgICAgaWYgKGdldGl0ZW1zdHIgPT0gTlVMTCkgeworICAgICAgICBnZXRpdGVtc3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19nZXRpdGVtX18iKTsKKyAgICAgICAgaWYgKGdldGl0ZW1zdHIgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBmdW5jID0gaW5zdGFuY2VfZ2V0YXR0cihpbnN0LCBnZXRpdGVtc3RyKTsKKyAgICBpZiAoZnVuYyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBhcmcgPSBQeVR1cGxlX1BhY2soMSwga2V5KTsKKyAgICBpZiAoYXJnID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKGZ1bmMpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmVzID0gUHlFdmFsX0NhbGxPYmplY3QoZnVuYywgYXJnKTsKKyAgICBQeV9ERUNSRUYoZnVuYyk7CisgICAgUHlfREVDUkVGKGFyZyk7CisgICAgcmV0dXJuIHJlczsKIH0KIAogc3RhdGljIGludAogaW5zdGFuY2VfYXNzX3N1YnNjcmlwdChQeUluc3RhbmNlT2JqZWN0ICppbnN0LCBQeU9iamVjdCAqa2V5LCBQeU9iamVjdCAqdmFsdWUpCiB7Ci0JUHlPYmplY3QgKmZ1bmM7Ci0JUHlPYmplY3QgKmFyZzsKLQlQeU9iamVjdCAqcmVzOworICAgIFB5T2JqZWN0ICpmdW5jOworICAgIFB5T2JqZWN0ICphcmc7CisgICAgUHlPYmplY3QgKnJlczsKIAotCWlmICh2YWx1ZSA9PSBOVUxMKSB7Ci0JCWlmIChkZWxpdGVtc3RyID09IE5VTEwpIHsKLQkJCWRlbGl0ZW1zdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2RlbGl0ZW1fXyIpOwotCQkJaWYgKGRlbGl0ZW1zdHIgPT0gTlVMTCkKLQkJCQlyZXR1cm4gLTE7Ci0JCX0KLQkJZnVuYyA9IGluc3RhbmNlX2dldGF0dHIoaW5zdCwgZGVsaXRlbXN0cik7Ci0JfQotCWVsc2UgewotCQlpZiAoc2V0aXRlbXN0ciA9PSBOVUxMKSB7Ci0JCQlzZXRpdGVtc3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19zZXRpdGVtX18iKTsKLQkJCWlmIChzZXRpdGVtc3RyID09IE5VTEwpCi0JCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWZ1bmMgPSBpbnN0YW5jZV9nZXRhdHRyKGluc3QsIHNldGl0ZW1zdHIpOwotCX0KLQlpZiAoZnVuYyA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0JaWYgKHZhbHVlID09IE5VTEwpCi0JCWFyZyA9IFB5VHVwbGVfUGFjaygxLCBrZXkpOwotCWVsc2UKLQkJYXJnID0gUHlUdXBsZV9QYWNrKDIsIGtleSwgdmFsdWUpOwotCWlmIChhcmcgPT0gTlVMTCkgewotCQlQeV9ERUNSRUYoZnVuYyk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JcmVzID0gUHlFdmFsX0NhbGxPYmplY3QoZnVuYywgYXJnKTsKLQlQeV9ERUNSRUYoZnVuYyk7Ci0JUHlfREVDUkVGKGFyZyk7Ci0JaWYgKHJlcyA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0JUHlfREVDUkVGKHJlcyk7Ci0JcmV0dXJuIDA7CisgICAgaWYgKHZhbHVlID09IE5VTEwpIHsKKyAgICAgICAgaWYgKGRlbGl0ZW1zdHIgPT0gTlVMTCkgeworICAgICAgICAgICAgZGVsaXRlbXN0ciA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fZGVsaXRlbV9fIik7CisgICAgICAgICAgICBpZiAoZGVsaXRlbXN0ciA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBmdW5jID0gaW5zdGFuY2VfZ2V0YXR0cihpbnN0LCBkZWxpdGVtc3RyKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGlmIChzZXRpdGVtc3RyID09IE5VTEwpIHsKKyAgICAgICAgICAgIHNldGl0ZW1zdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX3NldGl0ZW1fXyIpOworICAgICAgICAgICAgaWYgKHNldGl0ZW1zdHIgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgZnVuYyA9IGluc3RhbmNlX2dldGF0dHIoaW5zdCwgc2V0aXRlbXN0cik7CisgICAgfQorICAgIGlmIChmdW5jID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAodmFsdWUgPT0gTlVMTCkKKyAgICAgICAgYXJnID0gUHlUdXBsZV9QYWNrKDEsIGtleSk7CisgICAgZWxzZQorICAgICAgICBhcmcgPSBQeVR1cGxlX1BhY2soMiwga2V5LCB2YWx1ZSk7CisgICAgaWYgKGFyZyA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihmdW5jKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXMgPSBQeUV2YWxfQ2FsbE9iamVjdChmdW5jLCBhcmcpOworICAgIFB5X0RFQ1JFRihmdW5jKTsKKyAgICBQeV9ERUNSRUYoYXJnKTsKKyAgICBpZiAocmVzID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBQeV9ERUNSRUYocmVzKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5TWFwcGluZ01ldGhvZHMgaW5zdGFuY2VfYXNfbWFwcGluZyA9IHsKLQkobGVuZnVuYylpbnN0YW5jZV9sZW5ndGgsCQkvKiBtcF9sZW5ndGggKi8KLQkoYmluYXJ5ZnVuYylpbnN0YW5jZV9zdWJzY3JpcHQsCQkvKiBtcF9zdWJzY3JpcHQgKi8KLQkob2Jqb2JqYXJncHJvYylpbnN0YW5jZV9hc3Nfc3Vic2NyaXB0LAkvKiBtcF9hc3Nfc3Vic2NyaXB0ICovCisgICAgKGxlbmZ1bmMpaW5zdGFuY2VfbGVuZ3RoLCAgICAgICAgICAgICAgICAgICAvKiBtcF9sZW5ndGggKi8KKyAgICAoYmluYXJ5ZnVuYylpbnN0YW5jZV9zdWJzY3JpcHQsICAgICAgICAgICAgIC8qIG1wX3N1YnNjcmlwdCAqLworICAgIChvYmpvYmphcmdwcm9jKWluc3RhbmNlX2Fzc19zdWJzY3JpcHQsICAgICAgLyogbXBfYXNzX3N1YnNjcmlwdCAqLwogfTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIGluc3RhbmNlX2l0ZW0oUHlJbnN0YW5jZU9iamVjdCAqaW5zdCwgUHlfc3NpemVfdCBpKQogewotCVB5T2JqZWN0ICpmdW5jLCAqcmVzOworICAgIFB5T2JqZWN0ICpmdW5jLCAqcmVzOwogCi0JaWYgKGdldGl0ZW1zdHIgPT0gTlVMTCkgewotCQlnZXRpdGVtc3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19nZXRpdGVtX18iKTsKLQkJaWYgKGdldGl0ZW1zdHIgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCX0KLQlmdW5jID0gaW5zdGFuY2VfZ2V0YXR0cihpbnN0LCBnZXRpdGVtc3RyKTsKLQlpZiAoZnVuYyA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlyZXMgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oZnVuYywgIm4iLCBpKTsKLQlQeV9ERUNSRUYoZnVuYyk7Ci0JcmV0dXJuIHJlczsKKyAgICBpZiAoZ2V0aXRlbXN0ciA9PSBOVUxMKSB7CisgICAgICAgIGdldGl0ZW1zdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2dldGl0ZW1fXyIpOworICAgICAgICBpZiAoZ2V0aXRlbXN0ciA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGZ1bmMgPSBpbnN0YW5jZV9nZXRhdHRyKGluc3QsIGdldGl0ZW1zdHIpOworICAgIGlmIChmdW5jID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJlcyA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihmdW5jLCAibiIsIGkpOworICAgIFB5X0RFQ1JFRihmdW5jKTsKKyAgICByZXR1cm4gcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaW5zdGFuY2Vfc2xpY2UoUHlJbnN0YW5jZU9iamVjdCAqaW5zdCwgUHlfc3NpemVfdCBpLCBQeV9zc2l6ZV90IGopCiB7Ci0JUHlPYmplY3QgKmZ1bmMsICphcmcsICpyZXM7Ci0Jc3RhdGljIFB5T2JqZWN0ICpnZXRzbGljZXN0cjsKKyAgICBQeU9iamVjdCAqZnVuYywgKmFyZywgKnJlczsKKyAgICBzdGF0aWMgUHlPYmplY3QgKmdldHNsaWNlc3RyOwogCi0JaWYgKGdldHNsaWNlc3RyID09IE5VTEwpIHsKLQkJZ2V0c2xpY2VzdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2dldHNsaWNlX18iKTsKLQkJaWYgKGdldHNsaWNlc3RyID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZnVuYyA9IGluc3RhbmNlX2dldGF0dHIoaW5zdCwgZ2V0c2xpY2VzdHIpOworICAgIGlmIChnZXRzbGljZXN0ciA9PSBOVUxMKSB7CisgICAgICAgIGdldHNsaWNlc3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19nZXRzbGljZV9fIik7CisgICAgICAgIGlmIChnZXRzbGljZXN0ciA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGZ1bmMgPSBpbnN0YW5jZV9nZXRhdHRyKGluc3QsIGdldHNsaWNlc3RyKTsKIAotCWlmIChmdW5jID09IE5VTEwpIHsKLQkJaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkKLQkJCXJldHVybiBOVUxMOwotCQlQeUVycl9DbGVhcigpOworICAgIGlmIChmdW5jID09IE5VTEwpIHsKKyAgICAgICAgaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBQeUVycl9DbGVhcigpOwogCi0JCWlmIChnZXRpdGVtc3RyID09IE5VTEwpIHsKLQkJCWdldGl0ZW1zdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2dldGl0ZW1fXyIpOwotCQkJaWYgKGdldGl0ZW1zdHIgPT0gTlVMTCkKLQkJCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlmdW5jID0gaW5zdGFuY2VfZ2V0YXR0cihpbnN0LCBnZXRpdGVtc3RyKTsKLQkJaWYgKGZ1bmMgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQlhcmcgPSBQeV9CdWlsZFZhbHVlKCIoTikiLCBfUHlTbGljZV9Gcm9tSW5kaWNlcyhpLCBqKSk7Ci0JfQotCWVsc2UgewotCQlpZiAoUHlFcnJfV2FyblB5M2soImluIDMueCwgX19nZXRzbGljZV9fIGhhcyBiZWVuIHJlbW92ZWQ7ICIKLQkJCQkgICAidXNlIF9fZ2V0aXRlbV9fIiwgMSkgPCAwKSB7Ci0JCQlQeV9ERUNSRUYoZnVuYyk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlhcmcgPSBQeV9CdWlsZFZhbHVlKCIobm4pIiwgaSwgaik7Ci0JfQorICAgICAgICBpZiAoZ2V0aXRlbXN0ciA9PSBOVUxMKSB7CisgICAgICAgICAgICBnZXRpdGVtc3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19nZXRpdGVtX18iKTsKKyAgICAgICAgICAgIGlmIChnZXRpdGVtc3RyID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgZnVuYyA9IGluc3RhbmNlX2dldGF0dHIoaW5zdCwgZ2V0aXRlbXN0cik7CisgICAgICAgIGlmIChmdW5jID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgYXJnID0gUHlfQnVpbGRWYWx1ZSgiKE4pIiwgX1B5U2xpY2VfRnJvbUluZGljZXMoaSwgaikpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKFB5RXJyX1dhcm5QeTNrKCJpbiAzLngsIF9fZ2V0c2xpY2VfXyBoYXMgYmVlbiByZW1vdmVkOyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNlIF9fZ2V0aXRlbV9fIiwgMSkgPCAwKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoZnVuYyk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBhcmcgPSBQeV9CdWlsZFZhbHVlKCIobm4pIiwgaSwgaik7CisgICAgfQogCi0JaWYgKGFyZyA9PSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRihmdW5jKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJlcyA9IFB5RXZhbF9DYWxsT2JqZWN0KGZ1bmMsIGFyZyk7Ci0JUHlfREVDUkVGKGZ1bmMpOwotCVB5X0RFQ1JFRihhcmcpOwotCXJldHVybiByZXM7CisgICAgaWYgKGFyZyA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihmdW5jKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJlcyA9IFB5RXZhbF9DYWxsT2JqZWN0KGZ1bmMsIGFyZyk7CisgICAgUHlfREVDUkVGKGZ1bmMpOworICAgIFB5X0RFQ1JFRihhcmcpOworICAgIHJldHVybiByZXM7CiB9CiAKIHN0YXRpYyBpbnQKIGluc3RhbmNlX2Fzc19pdGVtKFB5SW5zdGFuY2VPYmplY3QgKmluc3QsIFB5X3NzaXplX3QgaSwgUHlPYmplY3QgKml0ZW0pCiB7Ci0JUHlPYmplY3QgKmZ1bmMsICphcmcsICpyZXM7CisgICAgUHlPYmplY3QgKmZ1bmMsICphcmcsICpyZXM7CiAKLQlpZiAoaXRlbSA9PSBOVUxMKSB7Ci0JCWlmIChkZWxpdGVtc3RyID09IE5VTEwpIHsKLQkJCWRlbGl0ZW1zdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2RlbGl0ZW1fXyIpOwotCQkJaWYgKGRlbGl0ZW1zdHIgPT0gTlVMTCkKLQkJCQlyZXR1cm4gLTE7Ci0JCX0KLQkJZnVuYyA9IGluc3RhbmNlX2dldGF0dHIoaW5zdCwgZGVsaXRlbXN0cik7Ci0JfQotCWVsc2UgewotCQlpZiAoc2V0aXRlbXN0ciA9PSBOVUxMKSB7Ci0JCQlzZXRpdGVtc3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19zZXRpdGVtX18iKTsKLQkJCWlmIChzZXRpdGVtc3RyID09IE5VTEwpCi0JCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWZ1bmMgPSBpbnN0YW5jZV9nZXRhdHRyKGluc3QsIHNldGl0ZW1zdHIpOwotCX0KLQlpZiAoZnVuYyA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0JaWYgKGl0ZW0gPT0gTlVMTCkKLQkJYXJnID0gUHlJbnRfRnJvbVNzaXplX3QoaSk7Ci0JZWxzZQotCQlhcmcgPSBQeV9CdWlsZFZhbHVlKCIobk8pIiwgaSwgaXRlbSk7Ci0JaWYgKGFyZyA9PSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRihmdW5jKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlyZXMgPSBQeUV2YWxfQ2FsbE9iamVjdChmdW5jLCBhcmcpOwotCVB5X0RFQ1JFRihmdW5jKTsKLQlQeV9ERUNSRUYoYXJnKTsKLQlpZiAocmVzID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQlQeV9ERUNSRUYocmVzKTsKLQlyZXR1cm4gMDsKKyAgICBpZiAoaXRlbSA9PSBOVUxMKSB7CisgICAgICAgIGlmIChkZWxpdGVtc3RyID09IE5VTEwpIHsKKyAgICAgICAgICAgIGRlbGl0ZW1zdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2RlbGl0ZW1fXyIpOworICAgICAgICAgICAgaWYgKGRlbGl0ZW1zdHIgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgZnVuYyA9IGluc3RhbmNlX2dldGF0dHIoaW5zdCwgZGVsaXRlbXN0cik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZiAoc2V0aXRlbXN0ciA9PSBOVUxMKSB7CisgICAgICAgICAgICBzZXRpdGVtc3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19zZXRpdGVtX18iKTsKKyAgICAgICAgICAgIGlmIChzZXRpdGVtc3RyID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGZ1bmMgPSBpbnN0YW5jZV9nZXRhdHRyKGluc3QsIHNldGl0ZW1zdHIpOworICAgIH0KKyAgICBpZiAoZnVuYyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKGl0ZW0gPT0gTlVMTCkKKyAgICAgICAgYXJnID0gUHlJbnRfRnJvbVNzaXplX3QoaSk7CisgICAgZWxzZQorICAgICAgICBhcmcgPSBQeV9CdWlsZFZhbHVlKCIobk8pIiwgaSwgaXRlbSk7CisgICAgaWYgKGFyZyA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihmdW5jKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXMgPSBQeUV2YWxfQ2FsbE9iamVjdChmdW5jLCBhcmcpOworICAgIFB5X0RFQ1JFRihmdW5jKTsKKyAgICBQeV9ERUNSRUYoYXJnKTsKKyAgICBpZiAocmVzID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBQeV9ERUNSRUYocmVzKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogaW5zdGFuY2VfYXNzX3NsaWNlKFB5SW5zdGFuY2VPYmplY3QgKmluc3QsIFB5X3NzaXplX3QgaSwgUHlfc3NpemVfdCBqLCBQeU9iamVjdCAqdmFsdWUpCiB7Ci0JUHlPYmplY3QgKmZ1bmMsICphcmcsICpyZXM7Ci0Jc3RhdGljIFB5T2JqZWN0ICpzZXRzbGljZXN0ciwgKmRlbHNsaWNlc3RyOworICAgIFB5T2JqZWN0ICpmdW5jLCAqYXJnLCAqcmVzOworICAgIHN0YXRpYyBQeU9iamVjdCAqc2V0c2xpY2VzdHIsICpkZWxzbGljZXN0cjsKIAotCWlmICh2YWx1ZSA9PSBOVUxMKSB7Ci0JCWlmIChkZWxzbGljZXN0ciA9PSBOVUxMKSB7Ci0JCQlkZWxzbGljZXN0ciA9Ci0JCQkJUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19kZWxzbGljZV9fIik7Ci0JCQlpZiAoZGVsc2xpY2VzdHIgPT0gTlVMTCkKLQkJCQlyZXR1cm4gLTE7Ci0JCX0KLQkJZnVuYyA9IGluc3RhbmNlX2dldGF0dHIoaW5zdCwgZGVsc2xpY2VzdHIpOwotCQlpZiAoZnVuYyA9PSBOVUxMKSB7Ci0JCQlpZiAoIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfQXR0cmlidXRlRXJyb3IpKQotCQkJCXJldHVybiAtMTsKLQkJCVB5RXJyX0NsZWFyKCk7Ci0JCQlpZiAoZGVsaXRlbXN0ciA9PSBOVUxMKSB7Ci0JCQkJZGVsaXRlbXN0ciA9Ci0JCQkJICAgIFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fZGVsaXRlbV9fIik7Ci0JCQkJaWYgKGRlbGl0ZW1zdHIgPT0gTlVMTCkKLQkJCQkJcmV0dXJuIC0xOwotCQkJfQotCQkJZnVuYyA9IGluc3RhbmNlX2dldGF0dHIoaW5zdCwgZGVsaXRlbXN0cik7Ci0JCQlpZiAoZnVuYyA9PSBOVUxMKQotCQkJCXJldHVybiAtMTsKKyAgICBpZiAodmFsdWUgPT0gTlVMTCkgeworICAgICAgICBpZiAoZGVsc2xpY2VzdHIgPT0gTlVMTCkgeworICAgICAgICAgICAgZGVsc2xpY2VzdHIgPQorICAgICAgICAgICAgICAgIFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fZGVsc2xpY2VfXyIpOworICAgICAgICAgICAgaWYgKGRlbHNsaWNlc3RyID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGZ1bmMgPSBpbnN0YW5jZV9nZXRhdHRyKGluc3QsIGRlbHNsaWNlc3RyKTsKKyAgICAgICAgaWYgKGZ1bmMgPT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgaWYgKGRlbGl0ZW1zdHIgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGRlbGl0ZW1zdHIgPQorICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2RlbGl0ZW1fXyIpOworICAgICAgICAgICAgICAgIGlmIChkZWxpdGVtc3RyID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZ1bmMgPSBpbnN0YW5jZV9nZXRhdHRyKGluc3QsIGRlbGl0ZW1zdHIpOworICAgICAgICAgICAgaWYgKGZ1bmMgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAKLQkJCWFyZyA9IFB5X0J1aWxkVmFsdWUoIihOKSIsCi0JCQkJCSAgICBfUHlTbGljZV9Gcm9tSW5kaWNlcyhpLCBqKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoUHlFcnJfV2FyblB5M2soImluIDMueCwgX19kZWxzbGljZV9fIGhhcyBiZWVuICIKLQkJCQkgICAgICAgICAgICAicmVtb3ZlZDsgdXNlIF9fZGVsaXRlbV9fIiwgMSkgPCAwKSB7Ci0JCQkJUHlfREVDUkVGKGZ1bmMpOwotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJCWFyZyA9IFB5X0J1aWxkVmFsdWUoIihubikiLCBpLCBqKTsKLQkJfQotCX0KLQllbHNlIHsKLQkJaWYgKHNldHNsaWNlc3RyID09IE5VTEwpIHsKLQkJCXNldHNsaWNlc3RyID0KLQkJCQlQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX3NldHNsaWNlX18iKTsKLQkJCWlmIChzZXRzbGljZXN0ciA9PSBOVUxMKQotCQkJCXJldHVybiAtMTsKLQkJfQotCQlmdW5jID0gaW5zdGFuY2VfZ2V0YXR0cihpbnN0LCBzZXRzbGljZXN0cik7Ci0JCWlmIChmdW5jID09IE5VTEwpIHsKLQkJCWlmICghUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19BdHRyaWJ1dGVFcnJvcikpCi0JCQkJcmV0dXJuIC0xOwotCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCWlmIChzZXRpdGVtc3RyID09IE5VTEwpIHsKLQkJCQlzZXRpdGVtc3RyID0KLQkJCQkgICAgUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19zZXRpdGVtX18iKTsKLQkJCQlpZiAoc2V0aXRlbXN0ciA9PSBOVUxMKQotCQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCQlmdW5jID0gaW5zdGFuY2VfZ2V0YXR0cihpbnN0LCBzZXRpdGVtc3RyKTsKLQkJCWlmIChmdW5jID09IE5VTEwpCi0JCQkJcmV0dXJuIC0xOworICAgICAgICAgICAgYXJnID0gUHlfQnVpbGRWYWx1ZSgiKE4pIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1B5U2xpY2VfRnJvbUluZGljZXMoaSwgaikpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKFB5RXJyX1dhcm5QeTNrKCJpbiAzLngsIF9fZGVsc2xpY2VfXyBoYXMgYmVlbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZW1vdmVkOyB1c2UgX19kZWxpdGVtX18iLCAxKSA8IDApIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoZnVuYyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXJnID0gUHlfQnVpbGRWYWx1ZSgiKG5uKSIsIGksIGopOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZiAoc2V0c2xpY2VzdHIgPT0gTlVMTCkgeworICAgICAgICAgICAgc2V0c2xpY2VzdHIgPQorICAgICAgICAgICAgICAgIFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fc2V0c2xpY2VfXyIpOworICAgICAgICAgICAgaWYgKHNldHNsaWNlc3RyID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGZ1bmMgPSBpbnN0YW5jZV9nZXRhdHRyKGluc3QsIHNldHNsaWNlc3RyKTsKKyAgICAgICAgaWYgKGZ1bmMgPT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgaWYgKHNldGl0ZW1zdHIgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHNldGl0ZW1zdHIgPQorICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX3NldGl0ZW1fXyIpOworICAgICAgICAgICAgICAgIGlmIChzZXRpdGVtc3RyID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZ1bmMgPSBpbnN0YW5jZV9nZXRhdHRyKGluc3QsIHNldGl0ZW1zdHIpOworICAgICAgICAgICAgaWYgKGZ1bmMgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAKLQkJCWFyZyA9IFB5X0J1aWxkVmFsdWUoIihOTykiLAotCQkJCQkgICAgX1B5U2xpY2VfRnJvbUluZGljZXMoaSwgaiksIHZhbHVlKTsKLQkJfQotCQllbHNlIHsKLQkJCWlmIChQeUVycl9XYXJuUHkzaygiaW4gMy54LCBfX3NldHNsaWNlX18gaGFzIGJlZW4gIgotCQkJCQkgICAicmVtb3ZlZDsgdXNlIF9fc2V0aXRlbV9fIiwgMSkgPCAwKSB7Ci0JCQkJUHlfREVDUkVGKGZ1bmMpOwotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJCWFyZyA9IFB5X0J1aWxkVmFsdWUoIihubk8pIiwgaSwgaiwgdmFsdWUpOwotCQl9Ci0JfQotCWlmIChhcmcgPT0gTlVMTCkgewotCQlQeV9ERUNSRUYoZnVuYyk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JcmVzID0gUHlFdmFsX0NhbGxPYmplY3QoZnVuYywgYXJnKTsKLQlQeV9ERUNSRUYoZnVuYyk7Ci0JUHlfREVDUkVGKGFyZyk7Ci0JaWYgKHJlcyA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0JUHlfREVDUkVGKHJlcyk7Ci0JcmV0dXJuIDA7CisgICAgICAgICAgICBhcmcgPSBQeV9CdWlsZFZhbHVlKCIoTk8pIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1B5U2xpY2VfRnJvbUluZGljZXMoaSwgaiksIHZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmIChQeUVycl9XYXJuUHkzaygiaW4gMy54LCBfX3NldHNsaWNlX18gaGFzIGJlZW4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZW1vdmVkOyB1c2UgX19zZXRpdGVtX18iLCAxKSA8IDApIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoZnVuYyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXJnID0gUHlfQnVpbGRWYWx1ZSgiKG5uTykiLCBpLCBqLCB2YWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGFyZyA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihmdW5jKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXMgPSBQeUV2YWxfQ2FsbE9iamVjdChmdW5jLCBhcmcpOworICAgIFB5X0RFQ1JFRihmdW5jKTsKKyAgICBQeV9ERUNSRUYoYXJnKTsKKyAgICBpZiAocmVzID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBQeV9ERUNSRUYocmVzKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogaW5zdGFuY2VfY29udGFpbnMoUHlJbnN0YW5jZU9iamVjdCAqaW5zdCwgUHlPYmplY3QgKm1lbWJlcikKIHsKLQlzdGF0aWMgUHlPYmplY3QgKl9fY29udGFpbnNfXzsKLQlQeU9iamVjdCAqZnVuYzsKKyAgICBzdGF0aWMgUHlPYmplY3QgKl9fY29udGFpbnNfXzsKKyAgICBQeU9iamVjdCAqZnVuYzsKIAotCS8qIFRyeSBfX2NvbnRhaW5zX18gZmlyc3QuCi0JICogSWYgdGhhdCBjYW4ndCBiZSBkb25lLCB0cnkgaXRlcmF0b3ItYmFzZWQgc2VhcmNoaW5nLgotCSAqLworICAgIC8qIFRyeSBfX2NvbnRhaW5zX18gZmlyc3QuCisgICAgICogSWYgdGhhdCBjYW4ndCBiZSBkb25lLCB0cnkgaXRlcmF0b3ItYmFzZWQgc2VhcmNoaW5nLgorICAgICAqLwogCi0JaWYoX19jb250YWluc19fID09IE5VTEwpIHsKLQkJX19jb250YWluc19fID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19jb250YWluc19fIik7Ci0JCWlmKF9fY29udGFpbnNfXyA9PSBOVUxMKQotCQkJcmV0dXJuIC0xOwotCX0KLQlmdW5jID0gaW5zdGFuY2VfZ2V0YXR0cihpbnN0LCBfX2NvbnRhaW5zX18pOwotCWlmIChmdW5jKSB7Ci0JCVB5T2JqZWN0ICpyZXM7Ci0JCWludCByZXQ7Ci0JCVB5T2JqZWN0ICphcmcgPSBQeVR1cGxlX1BhY2soMSwgbWVtYmVyKTsKLQkJaWYoYXJnID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRihmdW5jKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlyZXMgPSBQeUV2YWxfQ2FsbE9iamVjdChmdW5jLCBhcmcpOwotCQlQeV9ERUNSRUYoZnVuYyk7Ci0JCVB5X0RFQ1JFRihhcmcpOwotCQlpZihyZXMgPT0gTlVMTCkKLQkJCXJldHVybiAtMTsKLQkJcmV0ID0gUHlPYmplY3RfSXNUcnVlKHJlcyk7Ci0JCVB5X0RFQ1JFRihyZXMpOwotCQlyZXR1cm4gcmV0OwotCX0KKyAgICBpZihfX2NvbnRhaW5zX18gPT0gTlVMTCkgeworICAgICAgICBfX2NvbnRhaW5zX18gPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2NvbnRhaW5zX18iKTsKKyAgICAgICAgaWYoX19jb250YWluc19fID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGZ1bmMgPSBpbnN0YW5jZV9nZXRhdHRyKGluc3QsIF9fY29udGFpbnNfXyk7CisgICAgaWYgKGZ1bmMpIHsKKyAgICAgICAgUHlPYmplY3QgKnJlczsKKyAgICAgICAgaW50IHJldDsKKyAgICAgICAgUHlPYmplY3QgKmFyZyA9IFB5VHVwbGVfUGFjaygxLCBtZW1iZXIpOworICAgICAgICBpZihhcmcgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKGZ1bmMpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIHJlcyA9IFB5RXZhbF9DYWxsT2JqZWN0KGZ1bmMsIGFyZyk7CisgICAgICAgIFB5X0RFQ1JFRihmdW5jKTsKKyAgICAgICAgUHlfREVDUkVGKGFyZyk7CisgICAgICAgIGlmKHJlcyA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICByZXQgPSBQeU9iamVjdF9Jc1RydWUocmVzKTsKKyAgICAgICAgUHlfREVDUkVGKHJlcyk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQogCi0JLyogQ291bGRuJ3QgZmluZCBfX2NvbnRhaW5zX18uICovCi0JaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfQXR0cmlidXRlRXJyb3IpKSB7Ci0JCVB5X3NzaXplX3QgcmM7Ci0JCS8qIEFzc3VtZSB0aGUgZmFpbHVyZSB3YXMgc2ltcGx5IGR1ZSB0byB0aGF0IHRoZXJlIGlzIG5vCi0JCSAqIF9fY29udGFpbnNfXyBhdHRyaWJ1dGUsIGFuZCB0cnkgaXRlcmF0aW5nIGluc3RlYWQuCi0JCSAqLwotCQlQeUVycl9DbGVhcigpOwotCQlyYyA9IF9QeVNlcXVlbmNlX0l0ZXJTZWFyY2goKFB5T2JqZWN0ICopaW5zdCwgbWVtYmVyLAotCQkJCQkgICAgUFlfSVRFUlNFQVJDSF9DT05UQUlOUyk7Ci0JCWlmIChyYyA+PSAwKQotCQkJcmV0dXJuIHJjID4gMDsKLQl9Ci0JcmV0dXJuIC0xOworICAgIC8qIENvdWxkbid0IGZpbmQgX19jb250YWluc19fLiAqLworICAgIGlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkgeworICAgICAgICBQeV9zc2l6ZV90IHJjOworICAgICAgICAvKiBBc3N1bWUgdGhlIGZhaWx1cmUgd2FzIHNpbXBseSBkdWUgdG8gdGhhdCB0aGVyZSBpcyBubworICAgICAgICAgKiBfX2NvbnRhaW5zX18gYXR0cmlidXRlLCBhbmQgdHJ5IGl0ZXJhdGluZyBpbnN0ZWFkLgorICAgICAgICAgKi8KKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgcmMgPSBfUHlTZXF1ZW5jZV9JdGVyU2VhcmNoKChQeU9iamVjdCAqKWluc3QsIG1lbWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBZX0lURVJTRUFSQ0hfQ09OVEFJTlMpOworICAgICAgICBpZiAocmMgPj0gMCkKKyAgICAgICAgICAgIHJldHVybiByYyA+IDA7CisgICAgfQorICAgIHJldHVybiAtMTsKIH0KIAogc3RhdGljIFB5U2VxdWVuY2VNZXRob2RzCiBpbnN0YW5jZV9hc19zZXF1ZW5jZSA9IHsKLQkobGVuZnVuYylpbnN0YW5jZV9sZW5ndGgsCQkvKiBzcV9sZW5ndGggKi8KLQkwLAkJCQkJLyogc3FfY29uY2F0ICovCi0JMCwJCQkJCS8qIHNxX3JlcGVhdCAqLwotCShzc2l6ZWFyZ2Z1bmMpaW5zdGFuY2VfaXRlbSwJCS8qIHNxX2l0ZW0gKi8KLQkoc3NpemVzc2l6ZWFyZ2Z1bmMpaW5zdGFuY2Vfc2xpY2UsCS8qIHNxX3NsaWNlICovCi0JKHNzaXplb2JqYXJncHJvYylpbnN0YW5jZV9hc3NfaXRlbSwJLyogc3FfYXNzX2l0ZW0gKi8KLQkoc3NpemVzc2l6ZW9iamFyZ3Byb2MpaW5zdGFuY2VfYXNzX3NsaWNlLC8qIHNxX2Fzc19zbGljZSAqLwotCShvYmpvYmpwcm9jKWluc3RhbmNlX2NvbnRhaW5zLAkJLyogc3FfY29udGFpbnMgKi8KKyAgICAobGVuZnVuYylpbnN0YW5jZV9sZW5ndGgsICAgICAgICAgICAgICAgICAgIC8qIHNxX2xlbmd0aCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3FfY29uY2F0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzcV9yZXBlYXQgKi8KKyAgICAoc3NpemVhcmdmdW5jKWluc3RhbmNlX2l0ZW0sICAgICAgICAgICAgICAgIC8qIHNxX2l0ZW0gKi8KKyAgICAoc3NpemVzc2l6ZWFyZ2Z1bmMpaW5zdGFuY2Vfc2xpY2UsICAgICAgICAgIC8qIHNxX3NsaWNlICovCisgICAgKHNzaXplb2JqYXJncHJvYylpbnN0YW5jZV9hc3NfaXRlbSwgICAgICAgICAvKiBzcV9hc3NfaXRlbSAqLworICAgIChzc2l6ZXNzaXplb2JqYXJncHJvYylpbnN0YW5jZV9hc3Nfc2xpY2UsLyogc3FfYXNzX3NsaWNlICovCisgICAgKG9iam9ianByb2MpaW5zdGFuY2VfY29udGFpbnMsICAgICAgICAgICAgICAvKiBzcV9jb250YWlucyAqLwogfTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIGdlbmVyaWNfdW5hcnlfb3AoUHlJbnN0YW5jZU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm1ldGhvZG5hbWUpCiB7Ci0JUHlPYmplY3QgKmZ1bmMsICpyZXM7CisgICAgUHlPYmplY3QgKmZ1bmMsICpyZXM7CiAKLQlpZiAoKGZ1bmMgPSBpbnN0YW5jZV9nZXRhdHRyKHNlbGYsIG1ldGhvZG5hbWUpKSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlyZXMgPSBQeUV2YWxfQ2FsbE9iamVjdChmdW5jLCAoUHlPYmplY3QgKilOVUxMKTsKLQlQeV9ERUNSRUYoZnVuYyk7Ci0JcmV0dXJuIHJlczsKKyAgICBpZiAoKGZ1bmMgPSBpbnN0YW5jZV9nZXRhdHRyKHNlbGYsIG1ldGhvZG5hbWUpKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXMgPSBQeUV2YWxfQ2FsbE9iamVjdChmdW5jLCAoUHlPYmplY3QgKilOVUxMKTsKKyAgICBQeV9ERUNSRUYoZnVuYyk7CisgICAgcmV0dXJuIHJlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGdlbmVyaWNfYmluYXJ5X29wKFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdywgY2hhciAqb3BuYW1lKQogewotCVB5T2JqZWN0ICpyZXN1bHQ7Ci0JUHlPYmplY3QgKmFyZ3M7Ci0JUHlPYmplY3QgKmZ1bmMgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHYsIG9wbmFtZSk7Ci0JaWYgKGZ1bmMgPT0gTlVMTCkgewotCQlpZiAoIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfQXR0cmlidXRlRXJyb3IpKQotCQkJcmV0dXJuIE5VTEw7Ci0JCVB5RXJyX0NsZWFyKCk7Ci0JCVB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7Ci0JCXJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKLQl9Ci0JYXJncyA9IFB5VHVwbGVfUGFjaygxLCB3KTsKLQlpZiAoYXJncyA9PSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRihmdW5jKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJlc3VsdCA9IFB5RXZhbF9DYWxsT2JqZWN0KGZ1bmMsIGFyZ3MpOwotCVB5X0RFQ1JFRihhcmdzKTsKLQlQeV9ERUNSRUYoZnVuYyk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBQeU9iamVjdCAqcmVzdWx0OworICAgIFB5T2JqZWN0ICphcmdzOworICAgIFB5T2JqZWN0ICpmdW5jID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyh2LCBvcG5hbWUpOworICAgIGlmIChmdW5jID09IE5VTEwpIHsKKyAgICAgICAgaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOworICAgICAgICByZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7CisgICAgfQorICAgIGFyZ3MgPSBQeVR1cGxlX1BhY2soMSwgdyk7CisgICAgaWYgKGFyZ3MgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYoZnVuYyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXN1bHQgPSBQeUV2YWxfQ2FsbE9iamVjdChmdW5jLCBhcmdzKTsKKyAgICBQeV9ERUNSRUYoYXJncyk7CisgICAgUHlfREVDUkVGKGZ1bmMpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIApAQCAtMTQyNCw3MCArMTQyNCw3MCBAQAogLyogVHJ5IG9uZSBoYWxmIG9mIGEgYmluYXJ5IG9wZXJhdG9yIGludm9sdmluZyBhIGNsYXNzIGluc3RhbmNlLiAqLwogc3RhdGljIFB5T2JqZWN0ICoKIGhhbGZfYmlub3AoUHlPYmplY3QgKnYsIFB5T2JqZWN0ICp3LCBjaGFyICpvcG5hbWUsIGJpbmFyeWZ1bmMgdGhpc2Z1bmMsCi0JCWludCBzd2FwcGVkKQorICAgICAgICAgICAgICAgIGludCBzd2FwcGVkKQogewotCVB5T2JqZWN0ICphcmdzOwotCVB5T2JqZWN0ICpjb2VyY2VmdW5jOwotCVB5T2JqZWN0ICpjb2VyY2VkID0gTlVMTDsKLQlQeU9iamVjdCAqdjE7Ci0JUHlPYmplY3QgKnJlc3VsdDsKKyAgICBQeU9iamVjdCAqYXJnczsKKyAgICBQeU9iamVjdCAqY29lcmNlZnVuYzsKKyAgICBQeU9iamVjdCAqY29lcmNlZCA9IE5VTEw7CisgICAgUHlPYmplY3QgKnYxOworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CiAKLQlpZiAoIVB5SW5zdGFuY2VfQ2hlY2sodikpIHsKLQkJUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKLQkJcmV0dXJuIFB5X05vdEltcGxlbWVudGVkOwotCX0KKyAgICBpZiAoIVB5SW5zdGFuY2VfQ2hlY2sodikpIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKKyAgICAgICAgcmV0dXJuIFB5X05vdEltcGxlbWVudGVkOworICAgIH0KIAotCWlmIChjb2VyY2Vfb2JqID09IE5VTEwpIHsKLQkJY29lcmNlX29iaiA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fY29lcmNlX18iKTsKLQkJaWYgKGNvZXJjZV9vYmogPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCX0KLQljb2VyY2VmdW5jID0gUHlPYmplY3RfR2V0QXR0cih2LCBjb2VyY2Vfb2JqKTsKLQlpZiAoY29lcmNlZnVuYyA9PSBOVUxMKSB7Ci0JCWlmICghUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19BdHRyaWJ1dGVFcnJvcikpCi0JCQlyZXR1cm4gTlVMTDsKLQkJUHlFcnJfQ2xlYXIoKTsKLQkJcmV0dXJuIGdlbmVyaWNfYmluYXJ5X29wKHYsIHcsIG9wbmFtZSk7Ci0JfQorICAgIGlmIChjb2VyY2Vfb2JqID09IE5VTEwpIHsKKyAgICAgICAgY29lcmNlX29iaiA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fY29lcmNlX18iKTsKKyAgICAgICAgaWYgKGNvZXJjZV9vYmogPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBjb2VyY2VmdW5jID0gUHlPYmplY3RfR2V0QXR0cih2LCBjb2VyY2Vfb2JqKTsKKyAgICBpZiAoY29lcmNlZnVuYyA9PSBOVUxMKSB7CisgICAgICAgIGlmICghUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19BdHRyaWJ1dGVFcnJvcikpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgcmV0dXJuIGdlbmVyaWNfYmluYXJ5X29wKHYsIHcsIG9wbmFtZSk7CisgICAgfQogCi0JYXJncyA9IFB5VHVwbGVfUGFjaygxLCB3KTsKLQlpZiAoYXJncyA9PSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRihjb2VyY2VmdW5jKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWNvZXJjZWQgPSBQeUV2YWxfQ2FsbE9iamVjdChjb2VyY2VmdW5jLCBhcmdzKTsKLQlQeV9ERUNSRUYoYXJncyk7Ci0JUHlfREVDUkVGKGNvZXJjZWZ1bmMpOwotCWlmIChjb2VyY2VkID09IE5VTEwpIHsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChjb2VyY2VkID09IFB5X05vbmUgfHwgY29lcmNlZCA9PSBQeV9Ob3RJbXBsZW1lbnRlZCkgewotCQlQeV9ERUNSRUYoY29lcmNlZCk7Ci0JCXJldHVybiBnZW5lcmljX2JpbmFyeV9vcCh2LCB3LCBvcG5hbWUpOwotCX0KLQlpZiAoIVB5VHVwbGVfQ2hlY2soY29lcmNlZCkgfHwgUHlUdXBsZV9TaXplKGNvZXJjZWQpICE9IDIpIHsKLQkJUHlfREVDUkVGKGNvZXJjZWQpOwotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJjb2VyY2lvbiBzaG91bGQgcmV0dXJuIE5vbmUgb3IgMi10dXBsZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JdjEgPSBQeVR1cGxlX0dldEl0ZW0oY29lcmNlZCwgMCk7Ci0JdyA9IFB5VHVwbGVfR2V0SXRlbShjb2VyY2VkLCAxKTsKLQlpZiAodjEtPm9iX3R5cGUgPT0gdi0+b2JfdHlwZSAmJiBQeUluc3RhbmNlX0NoZWNrKHYpKSB7Ci0JCS8qIHByZXZlbnQgcmVjdXJzaW9uIGlmIF9fY29lcmNlX18gcmV0dXJucyBzZWxmIGFzIHRoZSBmaXJzdAotCQkgKiBhcmd1bWVudCAqLwotCQlyZXN1bHQgPSBnZW5lcmljX2JpbmFyeV9vcCh2MSwgdywgb3BuYW1lKTsKLQl9IGVsc2UgewotCQlpZiAoUHlfRW50ZXJSZWN1cnNpdmVDYWxsKCIgYWZ0ZXIgY29lcmNpb24iKSkKLQkJICAgIHJldHVybiBOVUxMOwotCQlpZiAoc3dhcHBlZCkKLQkJCXJlc3VsdCA9ICh0aGlzZnVuYykodywgdjEpOwotCQllbHNlCi0JCQlyZXN1bHQgPSAodGhpc2Z1bmMpKHYxLCB3KTsKLQkJUHlfTGVhdmVSZWN1cnNpdmVDYWxsKCk7Ci0JfQotCVB5X0RFQ1JFRihjb2VyY2VkKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIGFyZ3MgPSBQeVR1cGxlX1BhY2soMSwgdyk7CisgICAgaWYgKGFyZ3MgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYoY29lcmNlZnVuYyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBjb2VyY2VkID0gUHlFdmFsX0NhbGxPYmplY3QoY29lcmNlZnVuYywgYXJncyk7CisgICAgUHlfREVDUkVGKGFyZ3MpOworICAgIFB5X0RFQ1JFRihjb2VyY2VmdW5jKTsKKyAgICBpZiAoY29lcmNlZCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoY29lcmNlZCA9PSBQeV9Ob25lIHx8IGNvZXJjZWQgPT0gUHlfTm90SW1wbGVtZW50ZWQpIHsKKyAgICAgICAgUHlfREVDUkVGKGNvZXJjZWQpOworICAgICAgICByZXR1cm4gZ2VuZXJpY19iaW5hcnlfb3Aodiwgdywgb3BuYW1lKTsKKyAgICB9CisgICAgaWYgKCFQeVR1cGxlX0NoZWNrKGNvZXJjZWQpIHx8IFB5VHVwbGVfU2l6ZShjb2VyY2VkKSAhPSAyKSB7CisgICAgICAgIFB5X0RFQ1JFRihjb2VyY2VkKTsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjb2VyY2lvbiBzaG91bGQgcmV0dXJuIE5vbmUgb3IgMi10dXBsZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgdjEgPSBQeVR1cGxlX0dldEl0ZW0oY29lcmNlZCwgMCk7CisgICAgdyA9IFB5VHVwbGVfR2V0SXRlbShjb2VyY2VkLCAxKTsKKyAgICBpZiAodjEtPm9iX3R5cGUgPT0gdi0+b2JfdHlwZSAmJiBQeUluc3RhbmNlX0NoZWNrKHYpKSB7CisgICAgICAgIC8qIHByZXZlbnQgcmVjdXJzaW9uIGlmIF9fY29lcmNlX18gcmV0dXJucyBzZWxmIGFzIHRoZSBmaXJzdAorICAgICAgICAgKiBhcmd1bWVudCAqLworICAgICAgICByZXN1bHQgPSBnZW5lcmljX2JpbmFyeV9vcCh2MSwgdywgb3BuYW1lKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoUHlfRW50ZXJSZWN1cnNpdmVDYWxsKCIgYWZ0ZXIgY29lcmNpb24iKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBpZiAoc3dhcHBlZCkKKyAgICAgICAgICAgIHJlc3VsdCA9ICh0aGlzZnVuYykodywgdjEpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXN1bHQgPSAodGhpc2Z1bmMpKHYxLCB3KTsKKyAgICAgICAgUHlfTGVhdmVSZWN1cnNpdmVDYWxsKCk7CisgICAgfQorICAgIFB5X0RFQ1JFRihjb2VyY2VkKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiAvKiBJbXBsZW1lbnQgYSBiaW5hcnkgb3BlcmF0b3IgaW52b2x2aW5nIGF0IGxlYXN0IG9uZSBjbGFzcyBpbnN0YW5jZS4gKi8KQEAgLTE0OTUsMTEwICsxNDk1LDExMCBAQAogZG9fYmlub3AoUHlPYmplY3QgKnYsIFB5T2JqZWN0ICp3LCBjaGFyICpvcG5hbWUsIGNoYXIgKnJvcG5hbWUsCiAgICAgICAgICAgICAgICAgICAgYmluYXJ5ZnVuYyB0aGlzZnVuYykKIHsKLQlQeU9iamVjdCAqcmVzdWx0ID0gaGFsZl9iaW5vcCh2LCB3LCBvcG5hbWUsIHRoaXNmdW5jLCAwKTsKLQlpZiAocmVzdWx0ID09IFB5X05vdEltcGxlbWVudGVkKSB7Ci0JCVB5X0RFQ1JFRihyZXN1bHQpOwotCQlyZXN1bHQgPSBoYWxmX2Jpbm9wKHcsIHYsIHJvcG5hbWUsIHRoaXNmdW5jLCAxKTsKLQl9Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBQeU9iamVjdCAqcmVzdWx0ID0gaGFsZl9iaW5vcCh2LCB3LCBvcG5hbWUsIHRoaXNmdW5jLCAwKTsKKyAgICBpZiAocmVzdWx0ID09IFB5X05vdEltcGxlbWVudGVkKSB7CisgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICByZXN1bHQgPSBoYWxmX2Jpbm9wKHcsIHYsIHJvcG5hbWUsIHRoaXNmdW5jLCAxKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRvX2Jpbm9wX2lucGxhY2UoUHlPYmplY3QgKnYsIFB5T2JqZWN0ICp3LCBjaGFyICppb3BuYW1lLCBjaGFyICpvcG5hbWUsCi0JCQljaGFyICpyb3BuYW1lLCBiaW5hcnlmdW5jIHRoaXNmdW5jKQorICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqcm9wbmFtZSwgYmluYXJ5ZnVuYyB0aGlzZnVuYykKIHsKLQlQeU9iamVjdCAqcmVzdWx0ID0gaGFsZl9iaW5vcCh2LCB3LCBpb3BuYW1lLCB0aGlzZnVuYywgMCk7Ci0JaWYgKHJlc3VsdCA9PSBQeV9Ob3RJbXBsZW1lbnRlZCkgewotCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJcmVzdWx0ID0gZG9fYmlub3Aodiwgdywgb3BuYW1lLCByb3BuYW1lLCB0aGlzZnVuYyk7Ci0JfQotCXJldHVybiByZXN1bHQ7CisgICAgUHlPYmplY3QgKnJlc3VsdCA9IGhhbGZfYmlub3AodiwgdywgaW9wbmFtZSwgdGhpc2Z1bmMsIDApOworICAgIGlmIChyZXN1bHQgPT0gUHlfTm90SW1wbGVtZW50ZWQpIHsKKyAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgIHJlc3VsdCA9IGRvX2Jpbm9wKHYsIHcsIG9wbmFtZSwgcm9wbmFtZSwgdGhpc2Z1bmMpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgaW50CiBpbnN0YW5jZV9jb2VyY2UoUHlPYmplY3QgKipwdiwgUHlPYmplY3QgKipwdykKIHsKLQlQeU9iamVjdCAqdiA9ICpwdjsKLQlQeU9iamVjdCAqdyA9ICpwdzsKLQlQeU9iamVjdCAqY29lcmNlZnVuYzsKLQlQeU9iamVjdCAqYXJnczsKLQlQeU9iamVjdCAqY29lcmNlZDsKKyAgICBQeU9iamVjdCAqdiA9ICpwdjsKKyAgICBQeU9iamVjdCAqdyA9ICpwdzsKKyAgICBQeU9iamVjdCAqY29lcmNlZnVuYzsKKyAgICBQeU9iamVjdCAqYXJnczsKKyAgICBQeU9iamVjdCAqY29lcmNlZDsKIAotCWlmIChjb2VyY2Vfb2JqID09IE5VTEwpIHsKLQkJY29lcmNlX29iaiA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fY29lcmNlX18iKTsKLQkJaWYgKGNvZXJjZV9vYmogPT0gTlVMTCkKLQkJCXJldHVybiAtMTsKLQl9Ci0JY29lcmNlZnVuYyA9IFB5T2JqZWN0X0dldEF0dHIodiwgY29lcmNlX29iaik7Ci0JaWYgKGNvZXJjZWZ1bmMgPT0gTlVMTCkgewotCQkvKiBObyBfX2NvZXJjZV9fIG1ldGhvZCAqLwotCQlpZiAoIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfQXR0cmlidXRlRXJyb3IpKQotCQkJcmV0dXJuIC0xOwotCQlQeUVycl9DbGVhcigpOwotCQlyZXR1cm4gMTsKLQl9Ci0JLyogSGFzIF9fY29lcmNlX18gbWV0aG9kOiBjYWxsIGl0ICovCi0JYXJncyA9IFB5VHVwbGVfUGFjaygxLCB3KTsKLQlpZiAoYXJncyA9PSBOVUxMKSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0JY29lcmNlZCA9IFB5RXZhbF9DYWxsT2JqZWN0KGNvZXJjZWZ1bmMsIGFyZ3MpOwotCVB5X0RFQ1JFRihhcmdzKTsKLQlQeV9ERUNSRUYoY29lcmNlZnVuYyk7Ci0JaWYgKGNvZXJjZWQgPT0gTlVMTCkgewotCQkvKiBfX2NvZXJjZV9fIGNhbGwgcmFpc2VkIGFuIGV4Y2VwdGlvbiAqLwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmIChjb2VyY2VkID09IFB5X05vbmUgfHwgY29lcmNlZCA9PSBQeV9Ob3RJbXBsZW1lbnRlZCkgewotCQkvKiBfX2NvZXJjZV9fIHNheXMgIkkgY2FuJ3QgZG8gaXQiICovCi0JCVB5X0RFQ1JFRihjb2VyY2VkKTsKLQkJcmV0dXJuIDE7Ci0JfQotCWlmICghUHlUdXBsZV9DaGVjayhjb2VyY2VkKSB8fCBQeVR1cGxlX1NpemUoY29lcmNlZCkgIT0gMikgewotCQkvKiBfX2NvZXJjZV9fIHJldHVybiB2YWx1ZSBpcyBtYWxmb3JtZWQgKi8KLQkJUHlfREVDUkVGKGNvZXJjZWQpOwotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJICAgImNvZXJjaW9uIHNob3VsZCByZXR1cm4gTm9uZSBvciAyLXR1cGxlIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JLyogX19jb2VyY2VfXyByZXR1cm5lZCB0d28gbmV3IHZhbHVlcyAqLwotCSpwdiA9IFB5VHVwbGVfR2V0SXRlbShjb2VyY2VkLCAwKTsKLQkqcHcgPSBQeVR1cGxlX0dldEl0ZW0oY29lcmNlZCwgMSk7Ci0JUHlfSU5DUkVGKCpwdik7Ci0JUHlfSU5DUkVGKCpwdyk7Ci0JUHlfREVDUkVGKGNvZXJjZWQpOwotCXJldHVybiAwOworICAgIGlmIChjb2VyY2Vfb2JqID09IE5VTEwpIHsKKyAgICAgICAgY29lcmNlX29iaiA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fY29lcmNlX18iKTsKKyAgICAgICAgaWYgKGNvZXJjZV9vYmogPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgY29lcmNlZnVuYyA9IFB5T2JqZWN0X0dldEF0dHIodiwgY29lcmNlX29iaik7CisgICAgaWYgKGNvZXJjZWZ1bmMgPT0gTlVMTCkgeworICAgICAgICAvKiBObyBfX2NvZXJjZV9fIG1ldGhvZCAqLworICAgICAgICBpZiAoIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfQXR0cmlidXRlRXJyb3IpKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgLyogSGFzIF9fY29lcmNlX18gbWV0aG9kOiBjYWxsIGl0ICovCisgICAgYXJncyA9IFB5VHVwbGVfUGFjaygxLCB3KTsKKyAgICBpZiAoYXJncyA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgY29lcmNlZCA9IFB5RXZhbF9DYWxsT2JqZWN0KGNvZXJjZWZ1bmMsIGFyZ3MpOworICAgIFB5X0RFQ1JFRihhcmdzKTsKKyAgICBQeV9ERUNSRUYoY29lcmNlZnVuYyk7CisgICAgaWYgKGNvZXJjZWQgPT0gTlVMTCkgeworICAgICAgICAvKiBfX2NvZXJjZV9fIGNhbGwgcmFpc2VkIGFuIGV4Y2VwdGlvbiAqLworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChjb2VyY2VkID09IFB5X05vbmUgfHwgY29lcmNlZCA9PSBQeV9Ob3RJbXBsZW1lbnRlZCkgeworICAgICAgICAvKiBfX2NvZXJjZV9fIHNheXMgIkkgY2FuJ3QgZG8gaXQiICovCisgICAgICAgIFB5X0RFQ1JFRihjb2VyY2VkKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmICghUHlUdXBsZV9DaGVjayhjb2VyY2VkKSB8fCBQeVR1cGxlX1NpemUoY29lcmNlZCkgIT0gMikgeworICAgICAgICAvKiBfX2NvZXJjZV9fIHJldHVybiB2YWx1ZSBpcyBtYWxmb3JtZWQgKi8KKyAgICAgICAgUHlfREVDUkVGKGNvZXJjZWQpOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICJjb2VyY2lvbiBzaG91bGQgcmV0dXJuIE5vbmUgb3IgMi10dXBsZSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIC8qIF9fY29lcmNlX18gcmV0dXJuZWQgdHdvIG5ldyB2YWx1ZXMgKi8KKyAgICAqcHYgPSBQeVR1cGxlX0dldEl0ZW0oY29lcmNlZCwgMCk7CisgICAgKnB3ID0gUHlUdXBsZV9HZXRJdGVtKGNvZXJjZWQsIDEpOworICAgIFB5X0lOQ1JFRigqcHYpOworICAgIFB5X0lOQ1JFRigqcHcpOworICAgIFB5X0RFQ1JFRihjb2VyY2VkKTsKKyAgICByZXR1cm4gMDsKIH0KIAogI2RlZmluZSBVTkFSWShmdW5jbmFtZSwgbWV0aG9kbmFtZSkgXAogc3RhdGljIFB5T2JqZWN0ICpmdW5jbmFtZShQeUluc3RhbmNlT2JqZWN0ICpzZWxmKSB7IFwKLQlzdGF0aWMgUHlPYmplY3QgKm87IFwKLQlpZiAobyA9PSBOVUxMKSB7IG8gPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKG1ldGhvZG5hbWUpOyBcCi0JCQkgaWYgKG8gPT0gTlVMTCkgcmV0dXJuIE5VTEw7IH0gXAotCXJldHVybiBnZW5lcmljX3VuYXJ5X29wKHNlbGYsIG8pOyBcCisgICAgc3RhdGljIFB5T2JqZWN0ICpvOyBcCisgICAgaWYgKG8gPT0gTlVMTCkgeyBvID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZyhtZXRob2RuYW1lKTsgXAorICAgICAgICAgICAgICAgICAgICAgaWYgKG8gPT0gTlVMTCkgcmV0dXJuIE5VTEw7IH0gXAorICAgIHJldHVybiBnZW5lcmljX3VuYXJ5X29wKHNlbGYsIG8pOyBcCiB9CiAKIC8qIHVuYXJ5IGZ1bmN0aW9uIHdpdGggYSBmYWxsYmFjayAqLwogI2RlZmluZSBVTkFSWV9GQihmdW5jbmFtZSwgbWV0aG9kbmFtZSwgZnVuY25hbWVfZmIpIFwKIHN0YXRpYyBQeU9iamVjdCAqZnVuY25hbWUoUHlJbnN0YW5jZU9iamVjdCAqc2VsZikgeyBcCi0Jc3RhdGljIFB5T2JqZWN0ICpvOyBcCi0JaWYgKG8gPT0gTlVMTCkgeyBvID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZyhtZXRob2RuYW1lKTsgXAotCQkJIGlmIChvID09IE5VTEwpIHJldHVybiBOVUxMOyB9IFwKLQlpZiAoUHlPYmplY3RfSGFzQXR0cigoUHlPYmplY3QqKXNlbGYsIG8pKSBcCi0JCXJldHVybiBnZW5lcmljX3VuYXJ5X29wKHNlbGYsIG8pOyBcCi0JZWxzZSBcCi0JCXJldHVybiBmdW5jbmFtZV9mYihzZWxmKTsgXAorICAgIHN0YXRpYyBQeU9iamVjdCAqbzsgXAorICAgIGlmIChvID09IE5VTEwpIHsgbyA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcobWV0aG9kbmFtZSk7IFwKKyAgICAgICAgICAgICAgICAgICAgIGlmIChvID09IE5VTEwpIHJldHVybiBOVUxMOyB9IFwKKyAgICBpZiAoUHlPYmplY3RfSGFzQXR0cigoUHlPYmplY3QqKXNlbGYsIG8pKSBcCisgICAgICAgIHJldHVybiBnZW5lcmljX3VuYXJ5X29wKHNlbGYsIG8pOyBcCisgICAgZWxzZSBcCisgICAgICAgIHJldHVybiBmdW5jbmFtZV9mYihzZWxmKTsgXAogfQogCiAjZGVmaW5lIEJJTkFSWShmLCBtLCBuKSBcCiBzdGF0aWMgUHlPYmplY3QgKmYoUHlPYmplY3QgKnYsIFB5T2JqZWN0ICp3KSB7IFwKLQlyZXR1cm4gZG9fYmlub3AodiwgdywgIl9fIiBtICJfXyIsICJfX3IiIG0gIl9fIiwgbik7IFwKKyAgICByZXR1cm4gZG9fYmlub3AodiwgdywgIl9fIiBtICJfXyIsICJfX3IiIG0gIl9fIiwgbik7IFwKIH0KIAogI2RlZmluZSBCSU5BUllfSU5QTEFDRShmLCBtLCBuKSBcCiBzdGF0aWMgUHlPYmplY3QgKmYoUHlPYmplY3QgKnYsIFB5T2JqZWN0ICp3KSB7IFwKLQlyZXR1cm4gZG9fYmlub3BfaW5wbGFjZSh2LCB3LCAiX19pIiBtICJfXyIsICJfXyIgbSAiX18iLCBcCi0JCQkiX19yIiBtICJfXyIsIG4pOyBcCisgICAgcmV0dXJuIGRvX2Jpbm9wX2lucGxhY2UodiwgdywgIl9faSIgbSAiX18iLCAiX18iIG0gIl9fIiwgXAorICAgICAgICAgICAgICAgICAgICAiX19yIiBtICJfXyIsIG4pOyBcCiB9CiAKIFVOQVJZKGluc3RhbmNlX25lZywgIl9fbmVnX18iKQpAQCAtMTY0Miw1NSArMTY0Miw1NSBAQAogc3RhdGljIGludAogaGFsZl9jbXAoUHlPYmplY3QgKnYsIFB5T2JqZWN0ICp3KQogewotCXN0YXRpYyBQeU9iamVjdCAqY21wX29iajsKLQlQeU9iamVjdCAqYXJnczsKLQlQeU9iamVjdCAqY21wX2Z1bmM7Ci0JUHlPYmplY3QgKnJlc3VsdDsKLQlsb25nIGw7CisgICAgc3RhdGljIFB5T2JqZWN0ICpjbXBfb2JqOworICAgIFB5T2JqZWN0ICphcmdzOworICAgIFB5T2JqZWN0ICpjbXBfZnVuYzsKKyAgICBQeU9iamVjdCAqcmVzdWx0OworICAgIGxvbmcgbDsKIAotCWFzc2VydChQeUluc3RhbmNlX0NoZWNrKHYpKTsKKyAgICBhc3NlcnQoUHlJbnN0YW5jZV9DaGVjayh2KSk7CiAKLQlpZiAoY21wX29iaiA9PSBOVUxMKSB7Ci0JCWNtcF9vYmogPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2NtcF9fIik7Ci0JCWlmIChjbXBfb2JqID09IE5VTEwpCi0JCQlyZXR1cm4gLTI7Ci0JfQorICAgIGlmIChjbXBfb2JqID09IE5VTEwpIHsKKyAgICAgICAgY21wX29iaiA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fY21wX18iKTsKKyAgICAgICAgaWYgKGNtcF9vYmogPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAtMjsKKyAgICB9CiAKLQljbXBfZnVuYyA9IFB5T2JqZWN0X0dldEF0dHIodiwgY21wX29iaik7Ci0JaWYgKGNtcF9mdW5jID09IE5VTEwpIHsKLQkJaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkKLQkJCXJldHVybiAtMjsKLQkJUHlFcnJfQ2xlYXIoKTsKLQkJcmV0dXJuIDI7Ci0JfQorICAgIGNtcF9mdW5jID0gUHlPYmplY3RfR2V0QXR0cih2LCBjbXBfb2JqKTsKKyAgICBpZiAoY21wX2Z1bmMgPT0gTlVMTCkgeworICAgICAgICBpZiAoIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfQXR0cmlidXRlRXJyb3IpKQorICAgICAgICAgICAgcmV0dXJuIC0yOworICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICByZXR1cm4gMjsKKyAgICB9CiAKLQlhcmdzID0gUHlUdXBsZV9QYWNrKDEsIHcpOwotCWlmIChhcmdzID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKGNtcF9mdW5jKTsKLQkJcmV0dXJuIC0yOwotCX0KKyAgICBhcmdzID0gUHlUdXBsZV9QYWNrKDEsIHcpOworICAgIGlmIChhcmdzID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKGNtcF9mdW5jKTsKKyAgICAgICAgcmV0dXJuIC0yOworICAgIH0KIAotCXJlc3VsdCA9IFB5RXZhbF9DYWxsT2JqZWN0KGNtcF9mdW5jLCBhcmdzKTsKLQlQeV9ERUNSRUYoYXJncyk7Ci0JUHlfREVDUkVGKGNtcF9mdW5jKTsKKyAgICByZXN1bHQgPSBQeUV2YWxfQ2FsbE9iamVjdChjbXBfZnVuYywgYXJncyk7CisgICAgUHlfREVDUkVGKGFyZ3MpOworICAgIFB5X0RFQ1JFRihjbXBfZnVuYyk7CiAKLQlpZiAocmVzdWx0ID09IE5VTEwpCi0JCXJldHVybiAtMjsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMjsKIAotCWlmIChyZXN1bHQgPT0gUHlfTm90SW1wbGVtZW50ZWQpIHsKLQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCXJldHVybiAyOwotCX0KKyAgICBpZiAocmVzdWx0ID09IFB5X05vdEltcGxlbWVudGVkKSB7CisgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICByZXR1cm4gMjsKKyAgICB9CiAKLQlsID0gUHlJbnRfQXNMb25nKHJlc3VsdCk7Ci0JUHlfREVDUkVGKHJlc3VsdCk7Ci0JaWYgKGwgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJICAgICAiY29tcGFyaXNvbiBkaWQgbm90IHJldHVybiBhbiBpbnQiKTsKLQkJcmV0dXJuIC0yOwotCX0KKyAgICBsID0gUHlJbnRfQXNMb25nKHJlc3VsdCk7CisgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgaWYgKGwgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgImNvbXBhcmlzb24gZGlkIG5vdCByZXR1cm4gYW4gaW50Iik7CisgICAgICAgIHJldHVybiAtMjsKKyAgICB9CiAKLQlyZXR1cm4gbCA8IDAgPyAtMSA6IGwgPiAwID8gMSA6IDA7CisgICAgcmV0dXJuIGwgPCAwID8gLTEgOiBsID4gMCA/IDEgOiAwOwogfQogCiAvKiBUcnkgYSAzLXdheSBjb21wYXJpc29uLCByZXR1cm5pbmcgYW4gaW50OyBlaXRoZXIgdiBvciB3IGlzIGFuIGluc3RhbmNlLgpAQCAtMTcwNSwxMjQgKzE3MDUsMTI0IEBACiBzdGF0aWMgaW50CiBpbnN0YW5jZV9jb21wYXJlKFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdykKIHsKLQlpbnQgYzsKKyAgICBpbnQgYzsKIAotCWMgPSBQeU51bWJlcl9Db2VyY2VFeCgmdiwgJncpOwotCWlmIChjIDwgMCkKLQkJcmV0dXJuIC0yOwotCWlmIChjID09IDApIHsKLQkJLyogSWYgbmVpdGhlciBpcyBub3cgYW4gaW5zdGFuY2UsIHVzZSByZWd1bGFyIGNvbXBhcmlzb24gKi8KLQkJaWYgKCFQeUluc3RhbmNlX0NoZWNrKHYpICYmICFQeUluc3RhbmNlX0NoZWNrKHcpKSB7Ci0JCQljID0gUHlPYmplY3RfQ29tcGFyZSh2LCB3KTsKLQkJCVB5X0RFQ1JFRih2KTsKLQkJCVB5X0RFQ1JFRih3KTsKLQkJCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQkJCXJldHVybiAtMjsKLQkJCXJldHVybiBjIDwgMCA/IC0xIDogYyA+IDAgPyAxIDogMDsKLQkJfQotCX0KLQllbHNlIHsKLQkJLyogVGhlIGNvZXJjaW9uIGRpZG4ndCBkbyBhbnl0aGluZy4KLQkJICAgVHJlYXQgdGhpcyB0aGUgc2FtZSBhcyByZXR1cm5pbmcgdiBhbmQgdyB1bmNoYW5nZWQuICovCi0JCVB5X0lOQ1JFRih2KTsKLQkJUHlfSU5DUkVGKHcpOwotCX0KKyAgICBjID0gUHlOdW1iZXJfQ29lcmNlRXgoJnYsICZ3KTsKKyAgICBpZiAoYyA8IDApCisgICAgICAgIHJldHVybiAtMjsKKyAgICBpZiAoYyA9PSAwKSB7CisgICAgICAgIC8qIElmIG5laXRoZXIgaXMgbm93IGFuIGluc3RhbmNlLCB1c2UgcmVndWxhciBjb21wYXJpc29uICovCisgICAgICAgIGlmICghUHlJbnN0YW5jZV9DaGVjayh2KSAmJiAhUHlJbnN0YW5jZV9DaGVjayh3KSkgeworICAgICAgICAgICAgYyA9IFB5T2JqZWN0X0NvbXBhcmUodiwgdyk7CisgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICBQeV9ERUNSRUYodyk7CisgICAgICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTI7CisgICAgICAgICAgICByZXR1cm4gYyA8IDAgPyAtMSA6IGMgPiAwID8gMSA6IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8qIFRoZSBjb2VyY2lvbiBkaWRuJ3QgZG8gYW55dGhpbmcuCisgICAgICAgICAgIFRyZWF0IHRoaXMgdGhlIHNhbWUgYXMgcmV0dXJuaW5nIHYgYW5kIHcgdW5jaGFuZ2VkLiAqLworICAgICAgICBQeV9JTkNSRUYodik7CisgICAgICAgIFB5X0lOQ1JFRih3KTsKKyAgICB9CiAKLQlpZiAoUHlJbnN0YW5jZV9DaGVjayh2KSkgewotCQljID0gaGFsZl9jbXAodiwgdyk7Ci0JCWlmIChjIDw9IDEpIHsKLQkJCVB5X0RFQ1JFRih2KTsKLQkJCVB5X0RFQ1JFRih3KTsKLQkJCXJldHVybiBjOwotCQl9Ci0JfQotCWlmIChQeUluc3RhbmNlX0NoZWNrKHcpKSB7Ci0JCWMgPSBoYWxmX2NtcCh3LCB2KTsKLQkJaWYgKGMgPD0gMSkgewotCQkJUHlfREVDUkVGKHYpOwotCQkJUHlfREVDUkVGKHcpOwotCQkJaWYgKGMgPj0gLTEpCi0JCQkJYyA9IC1jOwotCQkJcmV0dXJuIGM7Ci0JCX0KLQl9Ci0JUHlfREVDUkVGKHYpOwotCVB5X0RFQ1JFRih3KTsKLQlyZXR1cm4gMjsKKyAgICBpZiAoUHlJbnN0YW5jZV9DaGVjayh2KSkgeworICAgICAgICBjID0gaGFsZl9jbXAodiwgdyk7CisgICAgICAgIGlmIChjIDw9IDEpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih3KTsKKyAgICAgICAgICAgIHJldHVybiBjOworICAgICAgICB9CisgICAgfQorICAgIGlmIChQeUluc3RhbmNlX0NoZWNrKHcpKSB7CisgICAgICAgIGMgPSBoYWxmX2NtcCh3LCB2KTsKKyAgICAgICAgaWYgKGMgPD0gMSkgeworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgUHlfREVDUkVGKHcpOworICAgICAgICAgICAgaWYgKGMgPj0gLTEpCisgICAgICAgICAgICAgICAgYyA9IC1jOworICAgICAgICAgICAgcmV0dXJuIGM7CisgICAgICAgIH0KKyAgICB9CisgICAgUHlfREVDUkVGKHYpOworICAgIFB5X0RFQ1JFRih3KTsKKyAgICByZXR1cm4gMjsKIH0KIAogc3RhdGljIGludAogaW5zdGFuY2Vfbm9uemVybyhQeUluc3RhbmNlT2JqZWN0ICpzZWxmKQogewotCVB5T2JqZWN0ICpmdW5jLCAqcmVzOwotCWxvbmcgb3V0Y29tZTsKLQlzdGF0aWMgUHlPYmplY3QgKm5vbnplcm9zdHI7CisgICAgUHlPYmplY3QgKmZ1bmMsICpyZXM7CisgICAgbG9uZyBvdXRjb21lOworICAgIHN0YXRpYyBQeU9iamVjdCAqbm9uemVyb3N0cjsKIAotCWlmIChub256ZXJvc3RyID09IE5VTEwpIHsKLQkJbm9uemVyb3N0ciA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fbm9uemVyb19fIik7Ci0JCWlmIChub256ZXJvc3RyID09IE5VTEwpCi0JCQlyZXR1cm4gLTE7Ci0JfQotCWlmICgoZnVuYyA9IGluc3RhbmNlX2dldGF0dHIoc2VsZiwgbm9uemVyb3N0cikpID09IE5VTEwpIHsKLQkJaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkKLQkJCXJldHVybiAtMTsKLQkJUHlFcnJfQ2xlYXIoKTsKLQkJaWYgKGxlbnN0ciA9PSBOVUxMKSB7Ci0JCQlsZW5zdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2xlbl9fIik7Ci0JCQlpZiAobGVuc3RyID09IE5VTEwpCi0JCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWlmICgoZnVuYyA9IGluc3RhbmNlX2dldGF0dHIoc2VsZiwgbGVuc3RyKSkgPT0gTlVMTCkgewotCQkJaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkKLQkJCQlyZXR1cm4gLTE7Ci0JCQlQeUVycl9DbGVhcigpOwotCQkJLyogRmFsbCBiYWNrIHRvIHRoZSBkZWZhdWx0IGJlaGF2aW9yOgotCQkJICAgYWxsIGluc3RhbmNlcyBhcmUgbm9uemVybyAqLwotCQkJcmV0dXJuIDE7Ci0JCX0KLQl9Ci0JcmVzID0gUHlFdmFsX0NhbGxPYmplY3QoZnVuYywgKFB5T2JqZWN0ICopTlVMTCk7Ci0JUHlfREVDUkVGKGZ1bmMpOwotCWlmIChyZXMgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCWlmICghUHlJbnRfQ2hlY2socmVzKSkgewotCQlQeV9ERUNSRUYocmVzKTsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiX19ub256ZXJvX18gc2hvdWxkIHJldHVybiBhbiBpbnQiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlvdXRjb21lID0gUHlJbnRfQXNMb25nKHJlcyk7Ci0JUHlfREVDUkVGKHJlcyk7Ci0JaWYgKG91dGNvbWUgPCAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJfX25vbnplcm9fXyBzaG91bGQgcmV0dXJuID49IDAiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlyZXR1cm4gb3V0Y29tZSA+IDA7CisgICAgaWYgKG5vbnplcm9zdHIgPT0gTlVMTCkgeworICAgICAgICBub256ZXJvc3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19ub256ZXJvX18iKTsKKyAgICAgICAgaWYgKG5vbnplcm9zdHIgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKChmdW5jID0gaW5zdGFuY2VfZ2V0YXR0cihzZWxmLCBub256ZXJvc3RyKSkgPT0gTlVMTCkgeworICAgICAgICBpZiAoIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfQXR0cmlidXRlRXJyb3IpKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBpZiAobGVuc3RyID09IE5VTEwpIHsKKyAgICAgICAgICAgIGxlbnN0ciA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fbGVuX18iKTsKKyAgICAgICAgICAgIGlmIChsZW5zdHIgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChmdW5jID0gaW5zdGFuY2VfZ2V0YXR0cihzZWxmLCBsZW5zdHIpKSA9PSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfQXR0cmlidXRlRXJyb3IpKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICAvKiBGYWxsIGJhY2sgdG8gdGhlIGRlZmF1bHQgYmVoYXZpb3I6CisgICAgICAgICAgICAgICBhbGwgaW5zdGFuY2VzIGFyZSBub256ZXJvICovCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXMgPSBQeUV2YWxfQ2FsbE9iamVjdChmdW5jLCAoUHlPYmplY3QgKilOVUxMKTsKKyAgICBQeV9ERUNSRUYoZnVuYyk7CisgICAgaWYgKHJlcyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKCFQeUludF9DaGVjayhyZXMpKSB7CisgICAgICAgIFB5X0RFQ1JFRihyZXMpOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIl9fbm9uemVyb19fIHNob3VsZCByZXR1cm4gYW4gaW50Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgb3V0Y29tZSA9IFB5SW50X0FzTG9uZyhyZXMpOworICAgIFB5X0RFQ1JFRihyZXMpOworICAgIGlmIChvdXRjb21lIDwgMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJfX25vbnplcm9fXyBzaG91bGQgcmV0dXJuID49IDAiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gb3V0Y29tZSA+IDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbnN0YW5jZV9pbmRleChQeUluc3RhbmNlT2JqZWN0ICpzZWxmKQogewotCVB5T2JqZWN0ICpmdW5jLCAqcmVzOwotCXN0YXRpYyBQeU9iamVjdCAqaW5kZXhzdHIgPSBOVUxMOworICAgIFB5T2JqZWN0ICpmdW5jLCAqcmVzOworICAgIHN0YXRpYyBQeU9iamVjdCAqaW5kZXhzdHIgPSBOVUxMOwogCi0JaWYgKGluZGV4c3RyID09IE5VTEwpIHsKLQkJaW5kZXhzdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2luZGV4X18iKTsKLQkJaWYgKGluZGV4c3RyID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQl9CQotCWlmICgoZnVuYyA9IGluc3RhbmNlX2dldGF0dHIoc2VsZiwgaW5kZXhzdHIpKSA9PSBOVUxMKSB7Ci0JCWlmICghUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19BdHRyaWJ1dGVFcnJvcikpCi0JCQlyZXR1cm4gTlVMTDsKLQkJUHlFcnJfQ2xlYXIoKTsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgCi0JCQkJIm9iamVjdCBjYW5ub3QgYmUgaW50ZXJwcmV0ZWQgYXMgYW4gaW5kZXgiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJlcyA9IFB5RXZhbF9DYWxsT2JqZWN0KGZ1bmMsIChQeU9iamVjdCAqKU5VTEwpOwotCVB5X0RFQ1JFRihmdW5jKTsKLQlyZXR1cm4gcmVzOworICAgIGlmIChpbmRleHN0ciA9PSBOVUxMKSB7CisgICAgICAgIGluZGV4c3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19pbmRleF9fIik7CisgICAgICAgIGlmIChpbmRleHN0ciA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmICgoZnVuYyA9IGluc3RhbmNlX2dldGF0dHIoc2VsZiwgaW5kZXhzdHIpKSA9PSBOVUxMKSB7CisgICAgICAgIGlmICghUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19BdHRyaWJ1dGVFcnJvcikpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJvYmplY3QgY2Fubm90IGJlIGludGVycHJldGVkIGFzIGFuIGluZGV4Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXMgPSBQeUV2YWxfQ2FsbE9iamVjdChmdW5jLCAoUHlPYmplY3QgKilOVUxMKTsKKyAgICBQeV9ERUNSRUYoZnVuYyk7CisgICAgcmV0dXJuIHJlczsKIH0KIAogCkBAIC0xODMyLDIyICsxODMyLDIyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogaW5zdGFuY2VfaW50KFB5SW5zdGFuY2VPYmplY3QgKnNlbGYpCiB7Ci0JUHlPYmplY3QgKnRydW5jYXRlZDsKLQlzdGF0aWMgUHlPYmplY3QgKmludF9uYW1lOwotCWlmIChpbnRfbmFtZSA9PSBOVUxMKSB7Ci0JCWludF9uYW1lID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19pbnRfXyIpOwotCQlpZiAoaW50X25hbWUgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCX0KLQlpZiAoUHlPYmplY3RfSGFzQXR0cigoUHlPYmplY3QqKXNlbGYsIGludF9uYW1lKSkKLQkJcmV0dXJuIGdlbmVyaWNfdW5hcnlfb3Aoc2VsZiwgaW50X25hbWUpOworICAgIFB5T2JqZWN0ICp0cnVuY2F0ZWQ7CisgICAgc3RhdGljIFB5T2JqZWN0ICppbnRfbmFtZTsKKyAgICBpZiAoaW50X25hbWUgPT0gTlVMTCkgeworICAgICAgICBpbnRfbmFtZSA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9faW50X18iKTsKKyAgICAgICAgaWYgKGludF9uYW1lID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKFB5T2JqZWN0X0hhc0F0dHIoKFB5T2JqZWN0KilzZWxmLCBpbnRfbmFtZSkpCisgICAgICAgIHJldHVybiBnZW5lcmljX3VuYXJ5X29wKHNlbGYsIGludF9uYW1lKTsKIAotCXRydW5jYXRlZCA9IF9pbnN0YW5jZV90cnVuYyhzZWxmKTsKLQkvKiBfX3RydW5jX18gaXMgc3BlY2lmaWVkIHRvIHJldHVybiBhbiBJbnRlZ3JhbCB0eXBlLCBidXQKLQkgICBpbnQoKSBuZWVkcyB0byByZXR1cm4gYW4gaW50LiAqLwotCXJldHVybiBfUHlOdW1iZXJfQ29udmVydEludGVncmFsVG9JbnQoCi0JCXRydW5jYXRlZCwKLQkJIl9fdHJ1bmNfXyByZXR1cm5lZCBub24tSW50ZWdyYWwgKHR5cGUgJS4yMDBzKSIpOworICAgIHRydW5jYXRlZCA9IF9pbnN0YW5jZV90cnVuYyhzZWxmKTsKKyAgICAvKiBfX3RydW5jX18gaXMgc3BlY2lmaWVkIHRvIHJldHVybiBhbiBJbnRlZ3JhbCB0eXBlLCBidXQKKyAgICAgICBpbnQoKSBuZWVkcyB0byByZXR1cm4gYW4gaW50LiAqLworICAgIHJldHVybiBfUHlOdW1iZXJfQ29udmVydEludGVncmFsVG9JbnQoCisgICAgICAgIHRydW5jYXRlZCwKKyAgICAgICAgIl9fdHJ1bmNfXyByZXR1cm5lZCBub24tSW50ZWdyYWwgKHR5cGUgJS4yMDBzKSIpOwogfQogCiBVTkFSWV9GQihpbnN0YW5jZV9sb25nLCAiX19sb25nX18iLCBpbnN0YW5jZV9pbnQpCkBAIC0xODU4LDc0ICsxODU4LDc0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYmluX3Bvd2VyKFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdykKIHsKLQlyZXR1cm4gUHlOdW1iZXJfUG93ZXIodiwgdywgUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5TnVtYmVyX1Bvd2VyKHYsIHcsIFB5X05vbmUpOwogfQogCiAvKiBUaGlzIHZlcnNpb24gaXMgZm9yIHRlcm5hcnkgY2FsbHMgb25seSAoeiAhPSBOb25lKSAqLwogc3RhdGljIFB5T2JqZWN0ICoKIGluc3RhbmNlX3BvdyhQeU9iamVjdCAqdiwgUHlPYmplY3QgKncsIFB5T2JqZWN0ICp6KQogewotCWlmICh6ID09IFB5X05vbmUpIHsKLQkJcmV0dXJuIGRvX2Jpbm9wKHYsIHcsICJfX3Bvd19fIiwgIl9fcnBvd19fIiwgYmluX3Bvd2VyKTsKLQl9Ci0JZWxzZSB7Ci0JCVB5T2JqZWN0ICpmdW5jOwotCQlQeU9iamVjdCAqYXJnczsKLQkJUHlPYmplY3QgKnJlc3VsdDsKKyAgICBpZiAoeiA9PSBQeV9Ob25lKSB7CisgICAgICAgIHJldHVybiBkb19iaW5vcCh2LCB3LCAiX19wb3dfXyIsICJfX3Jwb3dfXyIsIGJpbl9wb3dlcik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeU9iamVjdCAqZnVuYzsKKyAgICAgICAgUHlPYmplY3QgKmFyZ3M7CisgICAgICAgIFB5T2JqZWN0ICpyZXN1bHQ7CiAKLQkJLyogWFhYIERvZXNuJ3QgZG8gY29lcmNpb25zLi4uICovCi0JCWZ1bmMgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHYsICJfX3Bvd19fIik7Ci0JCWlmIChmdW5jID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQkJYXJncyA9IFB5VHVwbGVfUGFjaygyLCB3LCB6KTsKLQkJaWYgKGFyZ3MgPT0gTlVMTCkgewotCQkJUHlfREVDUkVGKGZ1bmMpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJcmVzdWx0ID0gUHlFdmFsX0NhbGxPYmplY3QoZnVuYywgYXJncyk7Ci0JCVB5X0RFQ1JFRihmdW5jKTsKLQkJUHlfREVDUkVGKGFyZ3MpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KKyAgICAgICAgLyogWFhYIERvZXNuJ3QgZG8gY29lcmNpb25zLi4uICovCisgICAgICAgIGZ1bmMgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHYsICJfX3Bvd19fIik7CisgICAgICAgIGlmIChmdW5jID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgYXJncyA9IFB5VHVwbGVfUGFjaygyLCB3LCB6KTsKKyAgICAgICAgaWYgKGFyZ3MgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKGZ1bmMpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0ID0gUHlFdmFsX0NhbGxPYmplY3QoZnVuYywgYXJncyk7CisgICAgICAgIFB5X0RFQ1JFRihmdW5jKTsKKyAgICAgICAgUHlfREVDUkVGKGFyZ3MpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGJpbl9pbnBsYWNlX3Bvd2VyKFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdykKIHsKLQlyZXR1cm4gUHlOdW1iZXJfSW5QbGFjZVBvd2VyKHYsIHcsIFB5X05vbmUpOworICAgIHJldHVybiBQeU51bWJlcl9JblBsYWNlUG93ZXIodiwgdywgUHlfTm9uZSk7CiB9CiAKIAogc3RhdGljIFB5T2JqZWN0ICoKIGluc3RhbmNlX2lwb3coUHlPYmplY3QgKnYsIFB5T2JqZWN0ICp3LCBQeU9iamVjdCAqeikKIHsKLQlpZiAoeiA9PSBQeV9Ob25lKSB7Ci0JCXJldHVybiBkb19iaW5vcF9pbnBsYWNlKHYsIHcsICJfX2lwb3dfXyIsICJfX3Bvd19fIiwKLQkJCSJfX3Jwb3dfXyIsIGJpbl9pbnBsYWNlX3Bvd2VyKTsKLQl9Ci0JZWxzZSB7Ci0JCS8qIFhYWCBEb2Vzbid0IGRvIGNvZXJjaW9ucy4uLiAqLwotCQlQeU9iamVjdCAqZnVuYzsKLQkJUHlPYmplY3QgKmFyZ3M7Ci0JCVB5T2JqZWN0ICpyZXN1bHQ7CisgICAgaWYgKHogPT0gUHlfTm9uZSkgeworICAgICAgICByZXR1cm4gZG9fYmlub3BfaW5wbGFjZSh2LCB3LCAiX19pcG93X18iLCAiX19wb3dfXyIsCisgICAgICAgICAgICAiX19ycG93X18iLCBiaW5faW5wbGFjZV9wb3dlcik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvKiBYWFggRG9lc24ndCBkbyBjb2VyY2lvbnMuLi4gKi8KKyAgICAgICAgUHlPYmplY3QgKmZ1bmM7CisgICAgICAgIFB5T2JqZWN0ICphcmdzOworICAgICAgICBQeU9iamVjdCAqcmVzdWx0OwogCi0JCWZ1bmMgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHYsICJfX2lwb3dfXyIpOwotCQlpZiAoZnVuYyA9PSBOVUxMKSB7Ci0JCQlpZiAoIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfQXR0cmlidXRlRXJyb3IpKQotCQkJCXJldHVybiBOVUxMOwotCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCXJldHVybiBpbnN0YW5jZV9wb3codiwgdywgeik7Ci0JCX0KLQkJYXJncyA9IFB5VHVwbGVfUGFjaygyLCB3LCB6KTsKLQkJaWYgKGFyZ3MgPT0gTlVMTCkgewotCQkJUHlfREVDUkVGKGZ1bmMpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJcmVzdWx0ID0gUHlFdmFsX0NhbGxPYmplY3QoZnVuYywgYXJncyk7Ci0JCVB5X0RFQ1JFRihmdW5jKTsKLQkJUHlfREVDUkVGKGFyZ3MpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KKyAgICAgICAgZnVuYyA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcodiwgIl9faXBvd19fIik7CisgICAgICAgIGlmIChmdW5jID09IE5VTEwpIHsKKyAgICAgICAgICAgIGlmICghUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19BdHRyaWJ1dGVFcnJvcikpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlX3Bvdyh2LCB3LCB6KTsKKyAgICAgICAgfQorICAgICAgICBhcmdzID0gUHlUdXBsZV9QYWNrKDIsIHcsIHopOworICAgICAgICBpZiAoYXJncyA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoZnVuYyk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQgPSBQeUV2YWxfQ2FsbE9iamVjdChmdW5jLCBhcmdzKTsKKyAgICAgICAgUHlfREVDUkVGKGZ1bmMpOworICAgICAgICBQeV9ERUNSRUYoYXJncyk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQogfQogCiAKQEAgLTE5MzYsOTMgKzE5MzYsOTMgQEAKIHN0YXRpYyBpbnQKIGluaXRfbmFtZV9vcCh2b2lkKQogewotCWludCBpOwotCWNoYXIgKl9uYW1lX29wW10gPSB7Ci0JCSJfX2x0X18iLAotCQkiX19sZV9fIiwKLQkJIl9fZXFfXyIsCi0JCSJfX25lX18iLAotCQkiX19ndF9fIiwKLQkJIl9fZ2VfXyIsCi0JfTsKKyAgICBpbnQgaTsKKyAgICBjaGFyICpfbmFtZV9vcFtdID0geworICAgICAgICAiX19sdF9fIiwKKyAgICAgICAgIl9fbGVfXyIsCisgICAgICAgICJfX2VxX18iLAorICAgICAgICAiX19uZV9fIiwKKyAgICAgICAgIl9fZ3RfXyIsCisgICAgICAgICJfX2dlX18iLAorICAgIH07CiAKLQluYW1lX29wID0gKFB5T2JqZWN0ICoqKW1hbGxvYyhzaXplb2YoUHlPYmplY3QgKikgKiBOQU1FX09QUyk7Ci0JaWYgKG5hbWVfb3AgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCWZvciAoaSA9IDA7IGkgPCBOQU1FX09QUzsgKytpKSB7Ci0JCW5hbWVfb3BbaV0gPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKF9uYW1lX29wW2ldKTsKLQkJaWYgKG5hbWVfb3BbaV0gPT0gTlVMTCkKLQkJCXJldHVybiAtMTsKLQl9Ci0JcmV0dXJuIDA7CisgICAgbmFtZV9vcCA9IChQeU9iamVjdCAqKiltYWxsb2Moc2l6ZW9mKFB5T2JqZWN0ICopICogTkFNRV9PUFMpOworICAgIGlmIChuYW1lX29wID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgTkFNRV9PUFM7ICsraSkgeworICAgICAgICBuYW1lX29wW2ldID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZyhfbmFtZV9vcFtpXSk7CisgICAgICAgIGlmIChuYW1lX29wW2ldID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaGFsZl9yaWNoY29tcGFyZShQeU9iamVjdCAqdiwgUHlPYmplY3QgKncsIGludCBvcCkKIHsKLQlQeU9iamVjdCAqbWV0aG9kOwotCVB5T2JqZWN0ICphcmdzOwotCVB5T2JqZWN0ICpyZXM7CisgICAgUHlPYmplY3QgKm1ldGhvZDsKKyAgICBQeU9iamVjdCAqYXJnczsKKyAgICBQeU9iamVjdCAqcmVzOwogCi0JYXNzZXJ0KFB5SW5zdGFuY2VfQ2hlY2sodikpOworICAgIGFzc2VydChQeUluc3RhbmNlX0NoZWNrKHYpKTsKIAotCWlmIChuYW1lX29wID09IE5VTEwpIHsKLQkJaWYgKGluaXRfbmFtZV9vcCgpIDwgMCkKLQkJCXJldHVybiBOVUxMOwotCX0KLQkvKiBJZiB0aGUgaW5zdGFuY2UgZG9lc24ndCBkZWZpbmUgYW4gX19nZXRhdHRyX18gbWV0aG9kLCB1c2UKLQkgICBpbnN0YW5jZV9nZXRhdHRyMiBkaXJlY3RseSBiZWNhdXNlIGl0IHdpbGwgbm90IHNldCBhbgotCSAgIGV4Y2VwdGlvbiBvbiBmYWlsdXJlLiAqLwotCWlmICgoKFB5SW5zdGFuY2VPYmplY3QgKil2KS0+aW5fY2xhc3MtPmNsX2dldGF0dHIgPT0gTlVMTCkKLQkJbWV0aG9kID0gaW5zdGFuY2VfZ2V0YXR0cjIoKFB5SW5zdGFuY2VPYmplY3QgKil2LAotCQkJCQkgICBuYW1lX29wW29wXSk7Ci0JZWxzZQotCQltZXRob2QgPSBQeU9iamVjdF9HZXRBdHRyKHYsIG5hbWVfb3Bbb3BdKTsKLQlpZiAobWV0aG9kID09IE5VTEwpIHsKLQkJaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKLQkJCWlmICghUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19BdHRyaWJ1dGVFcnJvcikpCi0JCQkJcmV0dXJuIE5VTEw7Ci0JCQlQeUVycl9DbGVhcigpOwotCQl9Ci0JCXJlcyA9IFB5X05vdEltcGxlbWVudGVkOwotCQlQeV9JTkNSRUYocmVzKTsKLQkJcmV0dXJuIHJlczsKLQl9CisgICAgaWYgKG5hbWVfb3AgPT0gTlVMTCkgeworICAgICAgICBpZiAoaW5pdF9uYW1lX29wKCkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIC8qIElmIHRoZSBpbnN0YW5jZSBkb2Vzbid0IGRlZmluZSBhbiBfX2dldGF0dHJfXyBtZXRob2QsIHVzZQorICAgICAgIGluc3RhbmNlX2dldGF0dHIyIGRpcmVjdGx5IGJlY2F1c2UgaXQgd2lsbCBub3Qgc2V0IGFuCisgICAgICAgZXhjZXB0aW9uIG9uIGZhaWx1cmUuICovCisgICAgaWYgKCgoUHlJbnN0YW5jZU9iamVjdCAqKXYpLT5pbl9jbGFzcy0+Y2xfZ2V0YXR0ciA9PSBOVUxMKQorICAgICAgICBtZXRob2QgPSBpbnN0YW5jZV9nZXRhdHRyMigoUHlJbnN0YW5jZU9iamVjdCAqKXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVfb3Bbb3BdKTsKKyAgICBlbHNlCisgICAgICAgIG1ldGhvZCA9IFB5T2JqZWN0X0dldEF0dHIodiwgbmFtZV9vcFtvcF0pOworICAgIGlmIChtZXRob2QgPT0gTlVMTCkgeworICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICAgICAgaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIH0KKyAgICAgICAgcmVzID0gUHlfTm90SW1wbGVtZW50ZWQ7CisgICAgICAgIFB5X0lOQ1JFRihyZXMpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KIAotCWFyZ3MgPSBQeVR1cGxlX1BhY2soMSwgdyk7Ci0JaWYgKGFyZ3MgPT0gTlVMTCkgewotCQlQeV9ERUNSRUYobWV0aG9kKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGFyZ3MgPSBQeVR1cGxlX1BhY2soMSwgdyk7CisgICAgaWYgKGFyZ3MgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYobWV0aG9kKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JcmVzID0gUHlFdmFsX0NhbGxPYmplY3QobWV0aG9kLCBhcmdzKTsKLQlQeV9ERUNSRUYoYXJncyk7Ci0JUHlfREVDUkVGKG1ldGhvZCk7CisgICAgcmVzID0gUHlFdmFsX0NhbGxPYmplY3QobWV0aG9kLCBhcmdzKTsKKyAgICBQeV9ERUNSRUYoYXJncyk7CisgICAgUHlfREVDUkVGKG1ldGhvZCk7CiAKLQlyZXR1cm4gcmVzOworICAgIHJldHVybiByZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbnN0YW5jZV9yaWNoY29tcGFyZShQeU9iamVjdCAqdiwgUHlPYmplY3QgKncsIGludCBvcCkKIHsKLQlQeU9iamVjdCAqcmVzOworICAgIFB5T2JqZWN0ICpyZXM7CiAKLQlpZiAoUHlJbnN0YW5jZV9DaGVjayh2KSkgewotCQlyZXMgPSBoYWxmX3JpY2hjb21wYXJlKHYsIHcsIG9wKTsKLQkJaWYgKHJlcyAhPSBQeV9Ob3RJbXBsZW1lbnRlZCkKLQkJCXJldHVybiByZXM7Ci0JCVB5X0RFQ1JFRihyZXMpOwotCX0KKyAgICBpZiAoUHlJbnN0YW5jZV9DaGVjayh2KSkgeworICAgICAgICByZXMgPSBoYWxmX3JpY2hjb21wYXJlKHYsIHcsIG9wKTsKKyAgICAgICAgaWYgKHJlcyAhPSBQeV9Ob3RJbXBsZW1lbnRlZCkKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIFB5X0RFQ1JFRihyZXMpOworICAgIH0KIAotCWlmIChQeUluc3RhbmNlX0NoZWNrKHcpKSB7Ci0JCXJlcyA9IGhhbGZfcmljaGNvbXBhcmUodywgdiwgX1B5X1N3YXBwZWRPcFtvcF0pOwotCQlpZiAocmVzICE9IFB5X05vdEltcGxlbWVudGVkKQotCQkJcmV0dXJuIHJlczsKLQkJUHlfREVDUkVGKHJlcyk7Ci0JfQorICAgIGlmIChQeUluc3RhbmNlX0NoZWNrKHcpKSB7CisgICAgICAgIHJlcyA9IGhhbGZfcmljaGNvbXBhcmUodywgdiwgX1B5X1N3YXBwZWRPcFtvcF0pOworICAgICAgICBpZiAocmVzICE9IFB5X05vdEltcGxlbWVudGVkKQorICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgUHlfREVDUkVGKHJlcyk7CisgICAgfQogCi0JUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKLQlyZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7CisgICAgUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKKyAgICByZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7CiB9CiAKIApAQCAtMjAzMCw0MiArMjAzMCw0MiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGluc3RhbmNlX2dldGl0ZXIoUHlJbnN0YW5jZU9iamVjdCAqc2VsZikKIHsKLQlQeU9iamVjdCAqZnVuYzsKKyAgICBQeU9iamVjdCAqZnVuYzsKIAotCWlmIChpdGVyc3RyID09IE5VTEwpIHsKLQkJaXRlcnN0ciA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9faXRlcl9fIik7Ci0JCWlmIChpdGVyc3RyID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKGdldGl0ZW1zdHIgPT0gTlVMTCkgewotCQlnZXRpdGVtc3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19nZXRpdGVtX18iKTsKLQkJaWYgKGdldGl0ZW1zdHIgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoaXRlcnN0ciA9PSBOVUxMKSB7CisgICAgICAgIGl0ZXJzdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2l0ZXJfXyIpOworICAgICAgICBpZiAoaXRlcnN0ciA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChnZXRpdGVtc3RyID09IE5VTEwpIHsKKyAgICAgICAgZ2V0aXRlbXN0ciA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fZ2V0aXRlbV9fIik7CisgICAgICAgIGlmIChnZXRpdGVtc3RyID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlpZiAoKGZ1bmMgPSBpbnN0YW5jZV9nZXRhdHRyKHNlbGYsIGl0ZXJzdHIpKSAhPSBOVUxMKSB7Ci0JCVB5T2JqZWN0ICpyZXMgPSBQeUV2YWxfQ2FsbE9iamVjdChmdW5jLCAoUHlPYmplY3QgKilOVUxMKTsKLQkJUHlfREVDUkVGKGZ1bmMpOwotCQlpZiAocmVzICE9IE5VTEwgJiYgIVB5SXRlcl9DaGVjayhyZXMpKSB7Ci0JCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJCSAgICAgIl9faXRlcl9fIHJldHVybmVkIG5vbi1pdGVyYXRvciAiCi0JCQkJICAgICAib2YgdHlwZSAnJS4xMDBzJyIsCi0JCQkJICAgICByZXMtPm9iX3R5cGUtPnRwX25hbWUpOwotCQkJUHlfREVDUkVGKHJlcyk7Ci0JCQlyZXMgPSBOVUxMOwotCQl9Ci0JCXJldHVybiByZXM7Ci0JfQotCWlmICghUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19BdHRyaWJ1dGVFcnJvcikpCi0JCXJldHVybiBOVUxMOwotCVB5RXJyX0NsZWFyKCk7Ci0JaWYgKChmdW5jID0gaW5zdGFuY2VfZ2V0YXR0cihzZWxmLCBnZXRpdGVtc3RyKSkgPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJpdGVyYXRpb24gb3ZlciBub24tc2VxdWVuY2UiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5X0RFQ1JFRihmdW5jKTsKLQlyZXR1cm4gUHlTZXFJdGVyX05ldygoUHlPYmplY3QgKilzZWxmKTsKKyAgICBpZiAoKGZ1bmMgPSBpbnN0YW5jZV9nZXRhdHRyKHNlbGYsIGl0ZXJzdHIpKSAhPSBOVUxMKSB7CisgICAgICAgIFB5T2JqZWN0ICpyZXMgPSBQeUV2YWxfQ2FsbE9iamVjdChmdW5jLCAoUHlPYmplY3QgKilOVUxMKTsKKyAgICAgICAgUHlfREVDUkVGKGZ1bmMpOworICAgICAgICBpZiAocmVzICE9IE5VTEwgJiYgIVB5SXRlcl9DaGVjayhyZXMpKSB7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICJfX2l0ZXJfXyByZXR1cm5lZCBub24taXRlcmF0b3IgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJvZiB0eXBlICclLjEwMHMnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZXMtPm9iX3R5cGUtPnRwX25hbWUpOworICAgICAgICAgICAgUHlfREVDUkVGKHJlcyk7CisgICAgICAgICAgICByZXMgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorICAgIGlmICghUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19BdHRyaWJ1dGVFcnJvcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5RXJyX0NsZWFyKCk7CisgICAgaWYgKChmdW5jID0gaW5zdGFuY2VfZ2V0YXR0cihzZWxmLCBnZXRpdGVtc3RyKSkgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIml0ZXJhdGlvbiBvdmVyIG5vbi1zZXF1ZW5jZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlfREVDUkVGKGZ1bmMpOworICAgIHJldHVybiBQeVNlcUl0ZXJfTmV3KChQeU9iamVjdCAqKXNlbGYpOwogfQogCiAKQEAgLTIwNzMsMTQ2ICsyMDczLDE0NiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGluc3RhbmNlX2l0ZXJuZXh0KFB5SW5zdGFuY2VPYmplY3QgKnNlbGYpCiB7Ci0JUHlPYmplY3QgKmZ1bmM7CisgICAgUHlPYmplY3QgKmZ1bmM7CiAKLQlpZiAobmV4dHN0ciA9PSBOVUxMKSB7Ci0JCW5leHRzdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJuZXh0Iik7Ci0JCWlmIChuZXh0c3RyID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKG5leHRzdHIgPT0gTlVMTCkgeworICAgICAgICBuZXh0c3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygibmV4dCIpOworICAgICAgICBpZiAobmV4dHN0ciA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaWYgKChmdW5jID0gaW5zdGFuY2VfZ2V0YXR0cihzZWxmLCBuZXh0c3RyKSkgIT0gTlVMTCkgewotCQlQeU9iamVjdCAqcmVzID0gUHlFdmFsX0NhbGxPYmplY3QoZnVuYywgKFB5T2JqZWN0ICopTlVMTCk7Ci0JCVB5X0RFQ1JFRihmdW5jKTsKLQkJaWYgKHJlcyAhPSBOVUxMKSB7Ci0JCQlyZXR1cm4gcmVzOwotCQl9Ci0JCWlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1N0b3BJdGVyYXRpb24pKSB7Ci0JCQlQeUVycl9DbGVhcigpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJpbnN0YW5jZSBoYXMgbm8gbmV4dCgpIG1ldGhvZCIpOwotCXJldHVybiBOVUxMOworICAgIGlmICgoZnVuYyA9IGluc3RhbmNlX2dldGF0dHIoc2VsZiwgbmV4dHN0cikpICE9IE5VTEwpIHsKKyAgICAgICAgUHlPYmplY3QgKnJlcyA9IFB5RXZhbF9DYWxsT2JqZWN0KGZ1bmMsIChQeU9iamVjdCAqKU5VTEwpOworICAgICAgICBQeV9ERUNSRUYoZnVuYyk7CisgICAgICAgIGlmIChyZXMgIT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgICAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19TdG9wSXRlcmF0aW9uKSkgeworICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiaW5zdGFuY2UgaGFzIG5vIG5leHQoKSBtZXRob2QiKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGluc3RhbmNlX2NhbGwoUHlPYmplY3QgKmZ1bmMsIFB5T2JqZWN0ICphcmcsIFB5T2JqZWN0ICprdykKIHsKLQlQeU9iamVjdCAqcmVzLCAqY2FsbCA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoZnVuYywgIl9fY2FsbF9fIik7Ci0JaWYgKGNhbGwgPT0gTlVMTCkgewotCQlQeUluc3RhbmNlT2JqZWN0ICppbnN0ID0gKFB5SW5zdGFuY2VPYmplY3QqKSBmdW5jOwotCQlpZiAoIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfQXR0cmlidXRlRXJyb3IpKQotCQkJcmV0dXJuIE5VTEw7Ci0JCVB5RXJyX0NsZWFyKCk7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19BdHRyaWJ1dGVFcnJvciwKLQkJCSAgICAgIiUuMjAwcyBpbnN0YW5jZSBoYXMgbm8gX19jYWxsX18gbWV0aG9kIiwKLQkJCSAgICAgUHlTdHJpbmdfQXNTdHJpbmcoaW5zdC0+aW5fY2xhc3MtPmNsX25hbWUpKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCS8qIFdlIG11c3QgY2hlY2sgYW5kIGluY3JlbWVudCB0aGUgcmVjdXJzaW9uIGRlcHRoIGhlcmUuIFNjZW5hcmlvOgotCSAgICAgICBjbGFzcyBBOgotCSAgICAgICAgICAgcGFzcwotCSAgICAgICBBLl9fY2FsbF9fID0gQSgpICMgdGhhdCdzIHJpZ2h0Ci0JICAgICAgIGEgPSBBKCkgIyBvawotCSAgICAgICBhKCkgIyBpbmZpbml0ZSByZWN1cnNpb24KLQkgICBUaGlzIGJvdW5jZXMgYmV0d2VlbiBpbnN0YW5jZV9jYWxsKCkgYW5kIFB5T2JqZWN0X0NhbGwoKSB3aXRob3V0Ci0JICAgZXZlciBoaXR0aW5nIGV2YWxfZnJhbWUoKSAod2hpY2ggaGFzIHRoZSBtYWluIHJlY3Vyc2lvbiBjaGVjaykuICovCi0JaWYgKFB5X0VudGVyUmVjdXJzaXZlQ2FsbCgiIGluIF9fY2FsbF9fIikpIHsKLQkJcmVzID0gTlVMTDsKLQl9Ci0JZWxzZSB7Ci0JCXJlcyA9IFB5T2JqZWN0X0NhbGwoY2FsbCwgYXJnLCBrdyk7Ci0JCVB5X0xlYXZlUmVjdXJzaXZlQ2FsbCgpOwotCX0KLQlQeV9ERUNSRUYoY2FsbCk7Ci0JcmV0dXJuIHJlczsKKyAgICBQeU9iamVjdCAqcmVzLCAqY2FsbCA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoZnVuYywgIl9fY2FsbF9fIik7CisgICAgaWYgKGNhbGwgPT0gTlVMTCkgeworICAgICAgICBQeUluc3RhbmNlT2JqZWN0ICppbnN0ID0gKFB5SW5zdGFuY2VPYmplY3QqKSBmdW5jOworICAgICAgICBpZiAoIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfQXR0cmlidXRlRXJyb3IpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19BdHRyaWJ1dGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICIlLjIwMHMgaW5zdGFuY2UgaGFzIG5vIF9fY2FsbF9fIG1ldGhvZCIsCisgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19Bc1N0cmluZyhpbnN0LT5pbl9jbGFzcy0+Y2xfbmFtZSkpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgLyogV2UgbXVzdCBjaGVjayBhbmQgaW5jcmVtZW50IHRoZSByZWN1cnNpb24gZGVwdGggaGVyZS4gU2NlbmFyaW86CisgICAgICAgICAgIGNsYXNzIEE6CisgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgQS5fX2NhbGxfXyA9IEEoKSAjIHRoYXQncyByaWdodAorICAgICAgICAgICBhID0gQSgpICMgb2sKKyAgICAgICAgICAgYSgpICMgaW5maW5pdGUgcmVjdXJzaW9uCisgICAgICAgVGhpcyBib3VuY2VzIGJldHdlZW4gaW5zdGFuY2VfY2FsbCgpIGFuZCBQeU9iamVjdF9DYWxsKCkgd2l0aG91dAorICAgICAgIGV2ZXIgaGl0dGluZyBldmFsX2ZyYW1lKCkgKHdoaWNoIGhhcyB0aGUgbWFpbiByZWN1cnNpb24gY2hlY2spLiAqLworICAgIGlmIChQeV9FbnRlclJlY3Vyc2l2ZUNhbGwoIiBpbiBfX2NhbGxfXyIpKSB7CisgICAgICAgIHJlcyA9IE5VTEw7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByZXMgPSBQeU9iamVjdF9DYWxsKGNhbGwsIGFyZywga3cpOworICAgICAgICBQeV9MZWF2ZVJlY3Vyc2l2ZUNhbGwoKTsKKyAgICB9CisgICAgUHlfREVDUkVGKGNhbGwpOworICAgIHJldHVybiByZXM7CiB9CiAKIAogc3RhdGljIFB5TnVtYmVyTWV0aG9kcyBpbnN0YW5jZV9hc19udW1iZXIgPSB7Ci0JaW5zdGFuY2VfYWRkLAkJCS8qIG5iX2FkZCAqLwotCWluc3RhbmNlX3N1YiwJCQkvKiBuYl9zdWJ0cmFjdCAqLwotCWluc3RhbmNlX211bCwJCQkvKiBuYl9tdWx0aXBseSAqLwotCWluc3RhbmNlX2RpdiwJCQkvKiBuYl9kaXZpZGUgKi8KLQlpbnN0YW5jZV9tb2QsCQkJLyogbmJfcmVtYWluZGVyICovCi0JaW5zdGFuY2VfZGl2bW9kLAkJLyogbmJfZGl2bW9kICovCi0JaW5zdGFuY2VfcG93LAkJCS8qIG5iX3Bvd2VyICovCi0JKHVuYXJ5ZnVuYylpbnN0YW5jZV9uZWcsCS8qIG5iX25lZ2F0aXZlICovCi0JKHVuYXJ5ZnVuYylpbnN0YW5jZV9wb3MsCS8qIG5iX3Bvc2l0aXZlICovCi0JKHVuYXJ5ZnVuYylpbnN0YW5jZV9hYnMsCS8qIG5iX2Fic29sdXRlICovCi0JKGlucXVpcnkpaW5zdGFuY2Vfbm9uemVybywJLyogbmJfbm9uemVybyAqLwotCSh1bmFyeWZ1bmMpaW5zdGFuY2VfaW52ZXJ0LAkvKiBuYl9pbnZlcnQgKi8KLQlpbnN0YW5jZV9sc2hpZnQsCQkvKiBuYl9sc2hpZnQgKi8KLQlpbnN0YW5jZV9yc2hpZnQsCQkvKiBuYl9yc2hpZnQgKi8KLQlpbnN0YW5jZV9hbmQsCQkJLyogbmJfYW5kICovCi0JaW5zdGFuY2VfeG9yLAkJCS8qIG5iX3hvciAqLwotCWluc3RhbmNlX29yLAkJCS8qIG5iX29yICovCi0JaW5zdGFuY2VfY29lcmNlLAkJLyogbmJfY29lcmNlICovCi0JKHVuYXJ5ZnVuYylpbnN0YW5jZV9pbnQsCS8qIG5iX2ludCAqLwotCSh1bmFyeWZ1bmMpaW5zdGFuY2VfbG9uZywJLyogbmJfbG9uZyAqLwotCSh1bmFyeWZ1bmMpaW5zdGFuY2VfZmxvYXQsCS8qIG5iX2Zsb2F0ICovCi0JKHVuYXJ5ZnVuYylpbnN0YW5jZV9vY3QsCS8qIG5iX29jdCAqLwotCSh1bmFyeWZ1bmMpaW5zdGFuY2VfaGV4LAkvKiBuYl9oZXggKi8KLQlpbnN0YW5jZV9pYWRkLAkJCS8qIG5iX2lucGxhY2VfYWRkICovCi0JaW5zdGFuY2VfaXN1YiwJCQkvKiBuYl9pbnBsYWNlX3N1YnRyYWN0ICovCi0JaW5zdGFuY2VfaW11bCwJCQkvKiBuYl9pbnBsYWNlX211bHRpcGx5ICovCi0JaW5zdGFuY2VfaWRpdiwJCQkvKiBuYl9pbnBsYWNlX2RpdmlkZSAqLwotCWluc3RhbmNlX2ltb2QsCQkJLyogbmJfaW5wbGFjZV9yZW1haW5kZXIgKi8KLQlpbnN0YW5jZV9pcG93LAkJCS8qIG5iX2lucGxhY2VfcG93ZXIgKi8KLQlpbnN0YW5jZV9pbHNoaWZ0LAkJLyogbmJfaW5wbGFjZV9sc2hpZnQgKi8KLQlpbnN0YW5jZV9pcnNoaWZ0LAkJLyogbmJfaW5wbGFjZV9yc2hpZnQgKi8KLQlpbnN0YW5jZV9pYW5kLAkJCS8qIG5iX2lucGxhY2VfYW5kICovCi0JaW5zdGFuY2VfaXhvciwJCQkvKiBuYl9pbnBsYWNlX3hvciAqLwotCWluc3RhbmNlX2lvciwJCQkvKiBuYl9pbnBsYWNlX29yICovCi0JaW5zdGFuY2VfZmxvb3JkaXYsCQkvKiBuYl9mbG9vcl9kaXZpZGUgKi8KLQlpbnN0YW5jZV90cnVlZGl2LAkJLyogbmJfdHJ1ZV9kaXZpZGUgKi8KLQlpbnN0YW5jZV9pZmxvb3JkaXYsCQkvKiBuYl9pbnBsYWNlX2Zsb29yX2RpdmlkZSAqLwotCWluc3RhbmNlX2l0cnVlZGl2LAkJLyogbmJfaW5wbGFjZV90cnVlX2RpdmlkZSAqLwotCSh1bmFyeWZ1bmMpaW5zdGFuY2VfaW5kZXgsCS8qIG5iX2luZGV4ICovCisgICAgaW5zdGFuY2VfYWRkLCAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfYWRkICovCisgICAgaW5zdGFuY2Vfc3ViLCAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfc3VidHJhY3QgKi8KKyAgICBpbnN0YW5jZV9tdWwsICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9tdWx0aXBseSAqLworICAgIGluc3RhbmNlX2RpdiwgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2RpdmlkZSAqLworICAgIGluc3RhbmNlX21vZCwgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX3JlbWFpbmRlciAqLworICAgIGluc3RhbmNlX2Rpdm1vZCwgICAgICAgICAgICAgICAgICAgIC8qIG5iX2Rpdm1vZCAqLworICAgIGluc3RhbmNlX3BvdywgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX3Bvd2VyICovCisgICAgKHVuYXJ5ZnVuYylpbnN0YW5jZV9uZWcsICAgICAgICAgICAgLyogbmJfbmVnYXRpdmUgKi8KKyAgICAodW5hcnlmdW5jKWluc3RhbmNlX3BvcywgICAgICAgICAgICAvKiBuYl9wb3NpdGl2ZSAqLworICAgICh1bmFyeWZ1bmMpaW5zdGFuY2VfYWJzLCAgICAgICAgICAgIC8qIG5iX2Fic29sdXRlICovCisgICAgKGlucXVpcnkpaW5zdGFuY2Vfbm9uemVybywgICAgICAgICAgLyogbmJfbm9uemVybyAqLworICAgICh1bmFyeWZ1bmMpaW5zdGFuY2VfaW52ZXJ0LCAgICAgICAgIC8qIG5iX2ludmVydCAqLworICAgIGluc3RhbmNlX2xzaGlmdCwgICAgICAgICAgICAgICAgICAgIC8qIG5iX2xzaGlmdCAqLworICAgIGluc3RhbmNlX3JzaGlmdCwgICAgICAgICAgICAgICAgICAgIC8qIG5iX3JzaGlmdCAqLworICAgIGluc3RhbmNlX2FuZCwgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2FuZCAqLworICAgIGluc3RhbmNlX3hvciwgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX3hvciAqLworICAgIGluc3RhbmNlX29yLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX29yICovCisgICAgaW5zdGFuY2VfY29lcmNlLCAgICAgICAgICAgICAgICAgICAgLyogbmJfY29lcmNlICovCisgICAgKHVuYXJ5ZnVuYylpbnN0YW5jZV9pbnQsICAgICAgICAgICAgLyogbmJfaW50ICovCisgICAgKHVuYXJ5ZnVuYylpbnN0YW5jZV9sb25nLCAgICAgICAgICAgLyogbmJfbG9uZyAqLworICAgICh1bmFyeWZ1bmMpaW5zdGFuY2VfZmxvYXQsICAgICAgICAgIC8qIG5iX2Zsb2F0ICovCisgICAgKHVuYXJ5ZnVuYylpbnN0YW5jZV9vY3QsICAgICAgICAgICAgLyogbmJfb2N0ICovCisgICAgKHVuYXJ5ZnVuYylpbnN0YW5jZV9oZXgsICAgICAgICAgICAgLyogbmJfaGV4ICovCisgICAgaW5zdGFuY2VfaWFkZCwgICAgICAgICAgICAgICAgICAgICAgLyogbmJfaW5wbGFjZV9hZGQgKi8KKyAgICBpbnN0YW5jZV9pc3ViLCAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9pbnBsYWNlX3N1YnRyYWN0ICovCisgICAgaW5zdGFuY2VfaW11bCwgICAgICAgICAgICAgICAgICAgICAgLyogbmJfaW5wbGFjZV9tdWx0aXBseSAqLworICAgIGluc3RhbmNlX2lkaXYsICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2lucGxhY2VfZGl2aWRlICovCisgICAgaW5zdGFuY2VfaW1vZCwgICAgICAgICAgICAgICAgICAgICAgLyogbmJfaW5wbGFjZV9yZW1haW5kZXIgKi8KKyAgICBpbnN0YW5jZV9pcG93LCAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9pbnBsYWNlX3Bvd2VyICovCisgICAgaW5zdGFuY2VfaWxzaGlmdCwgICAgICAgICAgICAgICAgICAgLyogbmJfaW5wbGFjZV9sc2hpZnQgKi8KKyAgICBpbnN0YW5jZV9pcnNoaWZ0LCAgICAgICAgICAgICAgICAgICAvKiBuYl9pbnBsYWNlX3JzaGlmdCAqLworICAgIGluc3RhbmNlX2lhbmQsICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2lucGxhY2VfYW5kICovCisgICAgaW5zdGFuY2VfaXhvciwgICAgICAgICAgICAgICAgICAgICAgLyogbmJfaW5wbGFjZV94b3IgKi8KKyAgICBpbnN0YW5jZV9pb3IsICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9pbnBsYWNlX29yICovCisgICAgaW5zdGFuY2VfZmxvb3JkaXYsICAgICAgICAgICAgICAgICAgLyogbmJfZmxvb3JfZGl2aWRlICovCisgICAgaW5zdGFuY2VfdHJ1ZWRpdiwgICAgICAgICAgICAgICAgICAgLyogbmJfdHJ1ZV9kaXZpZGUgKi8KKyAgICBpbnN0YW5jZV9pZmxvb3JkaXYsICAgICAgICAgICAgICAgICAvKiBuYl9pbnBsYWNlX2Zsb29yX2RpdmlkZSAqLworICAgIGluc3RhbmNlX2l0cnVlZGl2LCAgICAgICAgICAgICAgICAgIC8qIG5iX2lucGxhY2VfdHJ1ZV9kaXZpZGUgKi8KKyAgICAodW5hcnlmdW5jKWluc3RhbmNlX2luZGV4LCAgICAgICAgICAvKiBuYl9pbmRleCAqLwogfTsKIAogUHlUeXBlT2JqZWN0IFB5SW5zdGFuY2VfVHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlKQotCTAsCi0JImluc3RhbmNlIiwKLQlzaXplb2YoUHlJbnN0YW5jZU9iamVjdCksCi0JMCwKLQkoZGVzdHJ1Y3RvcilpbnN0YW5jZV9kZWFsbG9jLAkJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHIgKi8KLQlpbnN0YW5jZV9jb21wYXJlLAkJCS8qIHRwX2NvbXBhcmUgKi8KLQkocmVwcmZ1bmMpaW5zdGFuY2VfcmVwciwJCS8qIHRwX3JlcHIgKi8KLQkmaW5zdGFuY2VfYXNfbnVtYmVyLAkJCS8qIHRwX2FzX251bWJlciAqLwotCSZpbnN0YW5jZV9hc19zZXF1ZW5jZSwJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCSZpbnN0YW5jZV9hc19tYXBwaW5nLAkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpaW5zdGFuY2VfaGFzaCwJCS8qIHRwX2hhc2ggKi8KLQlpbnN0YW5jZV9jYWxsLAkJCQkvKiB0cF9jYWxsICovCi0JKHJlcHJmdW5jKWluc3RhbmNlX3N0ciwJCQkvKiB0cF9zdHIgKi8KLQkoZ2V0YXR0cm9mdW5jKWluc3RhbmNlX2dldGF0dHIsCQkvKiB0cF9nZXRhdHRybyAqLwotCShzZXRhdHRyb2Z1bmMpaW5zdGFuY2Vfc2V0YXR0ciwJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQyB8IFB5X1RQRkxBR1NfQ0hFQ0tUWVBFUywvKnRwX2ZsYWdzKi8KLQlpbnN0YW5jZV9kb2MsCQkJCS8qIHRwX2RvYyAqLwotCSh0cmF2ZXJzZXByb2MpaW5zdGFuY2VfdHJhdmVyc2UsCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJCS8qIHRwX2NsZWFyICovCi0JaW5zdGFuY2VfcmljaGNvbXBhcmUsCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLSAJb2Zmc2V0b2YoUHlJbnN0YW5jZU9iamVjdCwgaW5fd2Vha3JlZmxpc3QpLCAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCShnZXRpdGVyZnVuYylpbnN0YW5jZV9nZXRpdGVyLAkJLyogdHBfaXRlciAqLwotCShpdGVybmV4dGZ1bmMpaW5zdGFuY2VfaXRlcm5leHQsCS8qIHRwX2l0ZXJuZXh0ICovCi0JMCwJCQkJCS8qIHRwX21ldGhvZHMgKi8KLQkwLAkJCQkJLyogdHBfbWVtYmVycyAqLwotCTAsCQkJCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCQkvKiB0cF9kaWN0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KLQkwLAkJCQkJLyogdHBfZGljdG9mZnNldCAqLwotCTAsCQkJCQkvKiB0cF9pbml0ICovCi0JMCwJCQkJCS8qIHRwX2FsbG9jICovCi0JaW5zdGFuY2VfbmV3LAkJCQkvKiB0cF9uZXcgKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlKQorICAgIDAsCisgICAgImluc3RhbmNlIiwKKyAgICBzaXplb2YoUHlJbnN0YW5jZU9iamVjdCksCisgICAgMCwKKyAgICAoZGVzdHJ1Y3RvcilpbnN0YW5jZV9kZWFsbG9jLCAgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgaW5zdGFuY2VfY29tcGFyZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgKHJlcHJmdW5jKWluc3RhbmNlX3JlcHIsICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgJmluc3RhbmNlX2FzX251bWJlciwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAmaW5zdGFuY2VfYXNfc2VxdWVuY2UsICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgJmluc3RhbmNlX2FzX21hcHBpbmcsICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKWluc3RhbmNlX2hhc2gsICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgaW5zdGFuY2VfY2FsbCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgKHJlcHJmdW5jKWluc3RhbmNlX3N0ciwgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICAoZ2V0YXR0cm9mdW5jKWluc3RhbmNlX2dldGF0dHIsICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgKHNldGF0dHJvZnVuYylpbnN0YW5jZV9zZXRhdHRyLCAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDIHwgUHlfVFBGTEFHU19DSEVDS1RZUEVTLC8qdHBfZmxhZ3MqLworICAgIGluc3RhbmNlX2RvYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgKHRyYXZlcnNlcHJvYylpbnN0YW5jZV90cmF2ZXJzZSwgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICBpbnN0YW5jZV9yaWNoY29tcGFyZSwgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgb2Zmc2V0b2YoUHlJbnN0YW5jZU9iamVjdCwgaW5fd2Vha3JlZmxpc3QpLCAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIChnZXRpdGVyZnVuYylpbnN0YW5jZV9nZXRpdGVyLCAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIChpdGVybmV4dGZ1bmMpaW5zdGFuY2VfaXRlcm5leHQsICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgaW5zdGFuY2VfbmV3LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KIH07CiAKIApAQCAtMjIyNSwzMSArMjIyNSwzMSBAQAogUHlPYmplY3QgKgogUHlNZXRob2RfTmV3KFB5T2JqZWN0ICpmdW5jLCBQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmtsYXNzKQogewotCXJlZ2lzdGVyIFB5TWV0aG9kT2JqZWN0ICppbTsKLQlpZiAoIVB5Q2FsbGFibGVfQ2hlY2soZnVuYykpIHsKLQkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpbSA9IGZyZWVfbGlzdDsKLQlpZiAoaW0gIT0gTlVMTCkgewotCQlmcmVlX2xpc3QgPSAoUHlNZXRob2RPYmplY3QgKikoaW0tPmltX3NlbGYpOwotCQlQeU9iamVjdF9JTklUKGltLCAmUHlNZXRob2RfVHlwZSk7Ci0JCW51bWZyZWUtLTsKLQl9Ci0JZWxzZSB7Ci0JCWltID0gUHlPYmplY3RfR0NfTmV3KFB5TWV0aG9kT2JqZWN0LCAmUHlNZXRob2RfVHlwZSk7Ci0JCWlmIChpbSA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCWltLT5pbV93ZWFrcmVmbGlzdCA9IE5VTEw7Ci0JUHlfSU5DUkVGKGZ1bmMpOwotCWltLT5pbV9mdW5jID0gZnVuYzsKLQlQeV9YSU5DUkVGKHNlbGYpOwotCWltLT5pbV9zZWxmID0gc2VsZjsKLQlQeV9YSU5DUkVGKGtsYXNzKTsKLQlpbS0+aW1fY2xhc3MgPSBrbGFzczsKLQlfUHlPYmplY3RfR0NfVFJBQ0soaW0pOwotCXJldHVybiAoUHlPYmplY3QgKilpbTsKKyAgICByZWdpc3RlciBQeU1ldGhvZE9iamVjdCAqaW07CisgICAgaWYgKCFQeUNhbGxhYmxlX0NoZWNrKGZ1bmMpKSB7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaW0gPSBmcmVlX2xpc3Q7CisgICAgaWYgKGltICE9IE5VTEwpIHsKKyAgICAgICAgZnJlZV9saXN0ID0gKFB5TWV0aG9kT2JqZWN0ICopKGltLT5pbV9zZWxmKTsKKyAgICAgICAgUHlPYmplY3RfSU5JVChpbSwgJlB5TWV0aG9kX1R5cGUpOworICAgICAgICBudW1mcmVlLS07CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpbSA9IFB5T2JqZWN0X0dDX05ldyhQeU1ldGhvZE9iamVjdCwgJlB5TWV0aG9kX1R5cGUpOworICAgICAgICBpZiAoaW0gPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpbS0+aW1fd2Vha3JlZmxpc3QgPSBOVUxMOworICAgIFB5X0lOQ1JFRihmdW5jKTsKKyAgICBpbS0+aW1fZnVuYyA9IGZ1bmM7CisgICAgUHlfWElOQ1JFRihzZWxmKTsKKyAgICBpbS0+aW1fc2VsZiA9IHNlbGY7CisgICAgUHlfWElOQ1JFRihrbGFzcyk7CisgICAgaW0tPmltX2NsYXNzID0ga2xhc3M7CisgICAgX1B5T2JqZWN0X0dDX1RSQUNLKGltKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaW07CiB9CiAKIC8qIERlc2NyaXB0b3JzIGZvciBQeU1ldGhvZCBhdHRyaWJ1dGVzICovCkBAIC0yMjU5LDE3ICsyMjU5LDE3IEBACiAjZGVmaW5lIE9GRih4KSBvZmZzZXRvZihQeU1ldGhvZE9iamVjdCwgeCkKIAogc3RhdGljIFB5TWVtYmVyRGVmIGluc3RhbmNlbWV0aG9kX21lbWJlcmxpc3RbXSA9IHsKLQl7ImltX2NsYXNzIiwJVF9PQkpFQ1QsCU9GRihpbV9jbGFzcyksCVJFQURPTkxZfFJFU1RSSUNURUQsCi0JICJ0aGUgY2xhc3MgYXNzb2NpYXRlZCB3aXRoIGEgbWV0aG9kIn0sCi0JeyJpbV9mdW5jIiwJVF9PQkpFQ1QsCU9GRihpbV9mdW5jKSwJUkVBRE9OTFl8UkVTVFJJQ1RFRCwKLQkgInRoZSBmdW5jdGlvbiAob3Igb3RoZXIgY2FsbGFibGUpIGltcGxlbWVudGluZyBhIG1ldGhvZCJ9LAotCXsiX19mdW5jX18iLAlUX09CSkVDVCwJT0ZGKGltX2Z1bmMpLAlSRUFET05MWXxSRVNUUklDVEVELAotCSAidGhlIGZ1bmN0aW9uIChvciBvdGhlciBjYWxsYWJsZSkgaW1wbGVtZW50aW5nIGEgbWV0aG9kIn0sCi0JeyJpbV9zZWxmIiwJVF9PQkpFQ1QsCU9GRihpbV9zZWxmKSwJUkVBRE9OTFl8UkVTVFJJQ1RFRCwKLQkgInRoZSBpbnN0YW5jZSB0byB3aGljaCBhIG1ldGhvZCBpcyBib3VuZDsgTm9uZSBmb3IgdW5ib3VuZCBtZXRob2RzIn0sCi0JeyJfX3NlbGZfXyIsCVRfT0JKRUNULAlPRkYoaW1fc2VsZiksCVJFQURPTkxZfFJFU1RSSUNURUQsCi0JICJ0aGUgaW5zdGFuY2UgdG8gd2hpY2ggYSBtZXRob2QgaXMgYm91bmQ7IE5vbmUgZm9yIHVuYm91bmQgbWV0aG9kcyJ9LAotCXtOVUxMfQkvKiBTZW50aW5lbCAqLworICAgIHsiaW1fY2xhc3MiLCAgICAgICAgVF9PQkpFQ1QsICAgICAgIE9GRihpbV9jbGFzcyksICBSRUFET05MWXxSRVNUUklDVEVELAorICAgICAidGhlIGNsYXNzIGFzc29jaWF0ZWQgd2l0aCBhIG1ldGhvZCJ9LAorICAgIHsiaW1fZnVuYyIsICAgICAgICAgVF9PQkpFQ1QsICAgICAgIE9GRihpbV9mdW5jKSwgICBSRUFET05MWXxSRVNUUklDVEVELAorICAgICAidGhlIGZ1bmN0aW9uIChvciBvdGhlciBjYWxsYWJsZSkgaW1wbGVtZW50aW5nIGEgbWV0aG9kIn0sCisgICAgeyJfX2Z1bmNfXyIsICAgICAgICBUX09CSkVDVCwgICAgICAgT0ZGKGltX2Z1bmMpLCAgIFJFQURPTkxZfFJFU1RSSUNURUQsCisgICAgICJ0aGUgZnVuY3Rpb24gKG9yIG90aGVyIGNhbGxhYmxlKSBpbXBsZW1lbnRpbmcgYSBtZXRob2QifSwKKyAgICB7ImltX3NlbGYiLCAgICAgICAgIFRfT0JKRUNULCAgICAgICBPRkYoaW1fc2VsZiksICAgUkVBRE9OTFl8UkVTVFJJQ1RFRCwKKyAgICAgInRoZSBpbnN0YW5jZSB0byB3aGljaCBhIG1ldGhvZCBpcyBib3VuZDsgTm9uZSBmb3IgdW5ib3VuZCBtZXRob2RzIn0sCisgICAgeyJfX3NlbGZfXyIsICAgICAgICBUX09CSkVDVCwgICAgICAgT0ZGKGltX3NlbGYpLCAgIFJFQURPTkxZfFJFU1RSSUNURUQsCisgICAgICJ0aGUgaW5zdGFuY2UgdG8gd2hpY2ggYSBtZXRob2QgaXMgYm91bmQ7IE5vbmUgZm9yIHVuYm91bmQgbWV0aG9kcyJ9LAorICAgIHtOVUxMfSAgICAgIC8qIFNlbnRpbmVsICovCiB9OwogCiAvKiBDaHJpc3RpYW4gVGlzbWVyIGFyZ3VlZCBjb252aW5jaW5nbHkgdGhhdCBtZXRob2QgYXR0cmlidXRlcyBzaG91bGQKQEAgLTIyODAsNDYgKzIyODAsNDYgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbnN0YW5jZW1ldGhvZF9nZXRfZG9jKFB5TWV0aG9kT2JqZWN0ICppbSwgdm9pZCAqY29udGV4dCkKIHsKLQlzdGF0aWMgUHlPYmplY3QgKmRvY3N0cjsKLQlpZiAoZG9jc3RyID09IE5VTEwpIHsKLQkJZG9jc3RyPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2RvY19fIik7Ci0JCWlmIChkb2NzdHIgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gUHlPYmplY3RfR2V0QXR0cihpbS0+aW1fZnVuYywgZG9jc3RyKTsKKyAgICBzdGF0aWMgUHlPYmplY3QgKmRvY3N0cjsKKyAgICBpZiAoZG9jc3RyID09IE5VTEwpIHsKKyAgICAgICAgZG9jc3RyPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2RvY19fIik7CisgICAgICAgIGlmIChkb2NzdHIgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlPYmplY3RfR2V0QXR0cihpbS0+aW1fZnVuYywgZG9jc3RyKTsKIH0KIAogc3RhdGljIFB5R2V0U2V0RGVmIGluc3RhbmNlbWV0aG9kX2dldHNldFtdID0gewotCXsiX19kb2NfXyIsIChnZXR0ZXIpaW5zdGFuY2VtZXRob2RfZ2V0X2RvYywgTlVMTCwgTlVMTH0sCi0JezB9CisgICAgeyJfX2RvY19fIiwgKGdldHRlcilpbnN0YW5jZW1ldGhvZF9nZXRfZG9jLCBOVUxMLCBOVUxMfSwKKyAgICB7MH0KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbnN0YW5jZW1ldGhvZF9nZXRhdHRybyhQeU9iamVjdCAqb2JqLCBQeU9iamVjdCAqbmFtZSkKIHsKLQlQeU1ldGhvZE9iamVjdCAqaW0gPSAoUHlNZXRob2RPYmplY3QgKilvYmo7Ci0JUHlUeXBlT2JqZWN0ICp0cCA9IG9iai0+b2JfdHlwZTsKLQlQeU9iamVjdCAqZGVzY3IgPSBOVUxMOworICAgIFB5TWV0aG9kT2JqZWN0ICppbSA9IChQeU1ldGhvZE9iamVjdCAqKW9iajsKKyAgICBQeVR5cGVPYmplY3QgKnRwID0gb2JqLT5vYl90eXBlOworICAgIFB5T2JqZWN0ICpkZXNjciA9IE5VTEw7CiAKLQlpZiAoUHlUeXBlX0hhc0ZlYXR1cmUodHAsIFB5X1RQRkxBR1NfSEFWRV9DTEFTUykpIHsKLQkJaWYgKHRwLT50cF9kaWN0ID09IE5VTEwpIHsKLQkJCWlmIChQeVR5cGVfUmVhZHkodHApIDwgMCkKLQkJCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlkZXNjciA9IF9QeVR5cGVfTG9va3VwKHRwLCBuYW1lKTsKLQl9CisgICAgaWYgKFB5VHlwZV9IYXNGZWF0dXJlKHRwLCBQeV9UUEZMQUdTX0hBVkVfQ0xBU1MpKSB7CisgICAgICAgIGlmICh0cC0+dHBfZGljdCA9PSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoUHlUeXBlX1JlYWR5KHRwKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgZGVzY3IgPSBfUHlUeXBlX0xvb2t1cCh0cCwgbmFtZSk7CisgICAgfQogCi0JaWYgKGRlc2NyICE9IE5VTEwpIHsKLQkJZGVzY3JnZXRmdW5jIGYgPSBUUF9ERVNDUl9HRVQoZGVzY3ItPm9iX3R5cGUpOwotCQlpZiAoZiAhPSBOVUxMKQotCQkJcmV0dXJuIGYoZGVzY3IsIG9iaiwgKFB5T2JqZWN0ICopb2JqLT5vYl90eXBlKTsKLQkJZWxzZSB7Ci0JCQlQeV9JTkNSRUYoZGVzY3IpOwotCQkJcmV0dXJuIGRlc2NyOwotCQl9Ci0JfQorICAgIGlmIChkZXNjciAhPSBOVUxMKSB7CisgICAgICAgIGRlc2NyZ2V0ZnVuYyBmID0gVFBfREVTQ1JfR0VUKGRlc2NyLT5vYl90eXBlKTsKKyAgICAgICAgaWYgKGYgIT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBmKGRlc2NyLCBvYmosIChQeU9iamVjdCAqKW9iai0+b2JfdHlwZSk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgUHlfSU5DUkVGKGRlc2NyKTsKKyAgICAgICAgICAgIHJldHVybiBkZXNjcjsKKyAgICAgICAgfQorICAgIH0KIAotCXJldHVybiBQeU9iamVjdF9HZXRBdHRyKGltLT5pbV9mdW5jLCBuYW1lKTsKKyAgICByZXR1cm4gUHlPYmplY3RfR2V0QXR0cihpbS0+aW1fZnVuYywgbmFtZSk7CiB9CiAKIFB5RG9jX1NUUlZBUihpbnN0YW5jZW1ldGhvZF9kb2MsCkBAIC0yMzMwLDMyMyArMjMzMCwzMjMgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbnN0YW5jZW1ldGhvZF9uZXcoUHlUeXBlT2JqZWN0KiB0eXBlLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QgKmt3KQogewotCVB5T2JqZWN0ICpmdW5jOwotCVB5T2JqZWN0ICpzZWxmOwotCVB5T2JqZWN0ICpjbGFzc09iaiA9IE5VTEw7CisgICAgUHlPYmplY3QgKmZ1bmM7CisgICAgUHlPYmplY3QgKnNlbGY7CisgICAgUHlPYmplY3QgKmNsYXNzT2JqID0gTlVMTDsKIAotCWlmICghX1B5QXJnX05vS2V5d29yZHMoImluc3RhbmNlbWV0aG9kIiwga3cpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJpbnN0YW5jZW1ldGhvZCIsIDIsIDMsCi0JCQkgICAgICAmZnVuYywgJnNlbGYsICZjbGFzc09iaikpCi0JCXJldHVybiBOVUxMOwotCWlmICghUHlDYWxsYWJsZV9DaGVjayhmdW5jKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJmaXJzdCBhcmd1bWVudCBtdXN0IGJlIGNhbGxhYmxlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoc2VsZiA9PSBQeV9Ob25lKQotCQlzZWxmID0gTlVMTDsKLQlpZiAoc2VsZiA9PSBOVUxMICYmIGNsYXNzT2JqID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCSJ1bmJvdW5kIG1ldGhvZHMgbXVzdCBoYXZlIG5vbi1OVUxMIGltX2NsYXNzIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoIV9QeUFyZ19Ob0tleXdvcmRzKCJpbnN0YW5jZW1ldGhvZCIsIGt3KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiaW5zdGFuY2VtZXRob2QiLCAyLCAzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZnVuYywgJnNlbGYsICZjbGFzc09iaikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHlDYWxsYWJsZV9DaGVjayhmdW5jKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImZpcnN0IGFyZ3VtZW50IG11c3QgYmUgY2FsbGFibGUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChzZWxmID09IFB5X05vbmUpCisgICAgICAgIHNlbGYgPSBOVUxMOworICAgIGlmIChzZWxmID09IE5VTEwgJiYgY2xhc3NPYmogPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgInVuYm91bmQgbWV0aG9kcyBtdXN0IGhhdmUgbm9uLU5VTEwgaW1fY2xhc3MiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JcmV0dXJuIFB5TWV0aG9kX05ldyhmdW5jLCBzZWxmLCBjbGFzc09iaik7CisgICAgcmV0dXJuIFB5TWV0aG9kX05ldyhmdW5jLCBzZWxmLCBjbGFzc09iaik7CiB9CiAKIHN0YXRpYyB2b2lkCiBpbnN0YW5jZW1ldGhvZF9kZWFsbG9jKHJlZ2lzdGVyIFB5TWV0aG9kT2JqZWN0ICppbSkKIHsKLQlfUHlPYmplY3RfR0NfVU5UUkFDSyhpbSk7Ci0JaWYgKGltLT5pbV93ZWFrcmVmbGlzdCAhPSBOVUxMKQotCQlQeU9iamVjdF9DbGVhcldlYWtSZWZzKChQeU9iamVjdCAqKWltKTsKLQlQeV9ERUNSRUYoaW0tPmltX2Z1bmMpOwotCVB5X1hERUNSRUYoaW0tPmltX3NlbGYpOwotCVB5X1hERUNSRUYoaW0tPmltX2NsYXNzKTsKLQlpZiAobnVtZnJlZSA8IFB5TWV0aG9kX01BWEZSRUVMSVNUKSB7Ci0JCWltLT5pbV9zZWxmID0gKFB5T2JqZWN0ICopZnJlZV9saXN0OwotCQlmcmVlX2xpc3QgPSBpbTsKLQkJbnVtZnJlZSsrOwotCX0KLQllbHNlIHsKLQkJUHlPYmplY3RfR0NfRGVsKGltKTsKLQl9CisgICAgX1B5T2JqZWN0X0dDX1VOVFJBQ0soaW0pOworICAgIGlmIChpbS0+aW1fd2Vha3JlZmxpc3QgIT0gTlVMTCkKKyAgICAgICAgUHlPYmplY3RfQ2xlYXJXZWFrUmVmcygoUHlPYmplY3QgKilpbSk7CisgICAgUHlfREVDUkVGKGltLT5pbV9mdW5jKTsKKyAgICBQeV9YREVDUkVGKGltLT5pbV9zZWxmKTsKKyAgICBQeV9YREVDUkVGKGltLT5pbV9jbGFzcyk7CisgICAgaWYgKG51bWZyZWUgPCBQeU1ldGhvZF9NQVhGUkVFTElTVCkgeworICAgICAgICBpbS0+aW1fc2VsZiA9IChQeU9iamVjdCAqKWZyZWVfbGlzdDsKKyAgICAgICAgZnJlZV9saXN0ID0gaW07CisgICAgICAgIG51bWZyZWUrKzsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5T2JqZWN0X0dDX0RlbChpbSk7CisgICAgfQogfQogCiBzdGF0aWMgaW50CiBpbnN0YW5jZW1ldGhvZF9jb21wYXJlKFB5TWV0aG9kT2JqZWN0ICphLCBQeU1ldGhvZE9iamVjdCAqYikKIHsKLQlpbnQgY21wOwotCWNtcCA9IFB5T2JqZWN0X0NvbXBhcmUoYS0+aW1fZnVuYywgYi0+aW1fZnVuYyk7Ci0JaWYgKGNtcCkKLQkJcmV0dXJuIGNtcDsKKyAgICBpbnQgY21wOworICAgIGNtcCA9IFB5T2JqZWN0X0NvbXBhcmUoYS0+aW1fZnVuYywgYi0+aW1fZnVuYyk7CisgICAgaWYgKGNtcCkKKyAgICAgICAgcmV0dXJuIGNtcDsKIAotCWlmIChhLT5pbV9zZWxmID09IGItPmltX3NlbGYpCi0JCXJldHVybiAwOwotCWlmIChhLT5pbV9zZWxmID09IE5VTEwgfHwgYi0+aW1fc2VsZiA9PSBOVUxMKQotCQlyZXR1cm4gKGEtPmltX3NlbGYgPCBiLT5pbV9zZWxmKSA/IC0xIDogMTsKLQllbHNlCi0JCXJldHVybiBQeU9iamVjdF9Db21wYXJlKGEtPmltX3NlbGYsIGItPmltX3NlbGYpOworICAgIGlmIChhLT5pbV9zZWxmID09IGItPmltX3NlbGYpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChhLT5pbV9zZWxmID09IE5VTEwgfHwgYi0+aW1fc2VsZiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gKGEtPmltX3NlbGYgPCBiLT5pbV9zZWxmKSA/IC0xIDogMTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBQeU9iamVjdF9Db21wYXJlKGEtPmltX3NlbGYsIGItPmltX3NlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaW5zdGFuY2VtZXRob2RfcmVwcihQeU1ldGhvZE9iamVjdCAqYSkKIHsKLQlQeU9iamVjdCAqc2VsZiA9IGEtPmltX3NlbGY7Ci0JUHlPYmplY3QgKmZ1bmMgPSBhLT5pbV9mdW5jOwotCVB5T2JqZWN0ICprbGFzcyA9IGEtPmltX2NsYXNzOwotCVB5T2JqZWN0ICpmdW5jbmFtZSA9IE5VTEwsICprbGFzc25hbWUgPSBOVUxMLCAqcmVzdWx0ID0gTlVMTDsKLQljaGFyICpzZnVuY25hbWUgPSAiPyIsICpza2xhc3NuYW1lID0gIj8iOworICAgIFB5T2JqZWN0ICpzZWxmID0gYS0+aW1fc2VsZjsKKyAgICBQeU9iamVjdCAqZnVuYyA9IGEtPmltX2Z1bmM7CisgICAgUHlPYmplY3QgKmtsYXNzID0gYS0+aW1fY2xhc3M7CisgICAgUHlPYmplY3QgKmZ1bmNuYW1lID0gTlVMTCwgKmtsYXNzbmFtZSA9IE5VTEwsICpyZXN1bHQgPSBOVUxMOworICAgIGNoYXIgKnNmdW5jbmFtZSA9ICI/IiwgKnNrbGFzc25hbWUgPSAiPyI7CiAKLQlmdW5jbmFtZSA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoZnVuYywgIl9fbmFtZV9fIik7Ci0JaWYgKGZ1bmNuYW1lID09IE5VTEwpIHsKLQkJaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkKLQkJCXJldHVybiBOVUxMOwotCQlQeUVycl9DbGVhcigpOwotCX0KLQllbHNlIGlmICghUHlTdHJpbmdfQ2hlY2soZnVuY25hbWUpKSB7Ci0JCVB5X0RFQ1JFRihmdW5jbmFtZSk7Ci0JCWZ1bmNuYW1lID0gTlVMTDsKLQl9Ci0JZWxzZQotCQlzZnVuY25hbWUgPSBQeVN0cmluZ19BU19TVFJJTkcoZnVuY25hbWUpOwotCWlmIChrbGFzcyA9PSBOVUxMKQotCQlrbGFzc25hbWUgPSBOVUxMOwotCWVsc2UgewotCQlrbGFzc25hbWUgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKGtsYXNzLCAiX19uYW1lX18iKTsKLQkJaWYgKGtsYXNzbmFtZSA9PSBOVUxMKSB7Ci0JCQlpZiAoIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfQXR0cmlidXRlRXJyb3IpKQotCQkJCXJldHVybiBOVUxMOwotCQkJUHlFcnJfQ2xlYXIoKTsKLQkJfQotCQllbHNlIGlmICghUHlTdHJpbmdfQ2hlY2soa2xhc3NuYW1lKSkgewotCQkJUHlfREVDUkVGKGtsYXNzbmFtZSk7Ci0JCQlrbGFzc25hbWUgPSBOVUxMOwotCQl9Ci0JCWVsc2UKLQkJCXNrbGFzc25hbWUgPSBQeVN0cmluZ19BU19TVFJJTkcoa2xhc3NuYW1lKTsKLQl9Ci0JaWYgKHNlbGYgPT0gTlVMTCkKLQkJcmVzdWx0ID0gUHlTdHJpbmdfRnJvbUZvcm1hdCgiPHVuYm91bmQgbWV0aG9kICVzLiVzPiIsCi0JCQkJCSAgICAgc2tsYXNzbmFtZSwgc2Z1bmNuYW1lKTsKLQllbHNlIHsKLQkJLyogWFhYIFNob3VsZG4ndCB1c2UgcmVwcigpIGhlcmUhICovCi0JCVB5T2JqZWN0ICpzZWxmcmVwciA9IFB5T2JqZWN0X1JlcHIoc2VsZik7Ci0JCWlmIChzZWxmcmVwciA9PSBOVUxMKQotCQkJZ290byBmYWlsOwotCQlpZiAoIVB5U3RyaW5nX0NoZWNrKHNlbGZyZXByKSkgewotCQkJUHlfREVDUkVGKHNlbGZyZXByKTsKLQkJCWdvdG8gZmFpbDsKLQkJfQotCQlyZXN1bHQgPSBQeVN0cmluZ19Gcm9tRm9ybWF0KCI8Ym91bmQgbWV0aG9kICVzLiVzIG9mICVzPiIsCi0JCQkJCSAgICAgc2tsYXNzbmFtZSwgc2Z1bmNuYW1lLAotCQkJCQkgICAgIFB5U3RyaW5nX0FTX1NUUklORyhzZWxmcmVwcikpOwotCQlQeV9ERUNSRUYoc2VsZnJlcHIpOwotCX0KKyAgICBmdW5jbmFtZSA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoZnVuYywgIl9fbmFtZV9fIik7CisgICAgaWYgKGZ1bmNuYW1lID09IE5VTEwpIHsKKyAgICAgICAgaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBQeUVycl9DbGVhcigpOworICAgIH0KKyAgICBlbHNlIGlmICghUHlTdHJpbmdfQ2hlY2soZnVuY25hbWUpKSB7CisgICAgICAgIFB5X0RFQ1JFRihmdW5jbmFtZSk7CisgICAgICAgIGZ1bmNuYW1lID0gTlVMTDsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBzZnVuY25hbWUgPSBQeVN0cmluZ19BU19TVFJJTkcoZnVuY25hbWUpOworICAgIGlmIChrbGFzcyA9PSBOVUxMKQorICAgICAgICBrbGFzc25hbWUgPSBOVUxMOworICAgIGVsc2UgeworICAgICAgICBrbGFzc25hbWUgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKGtsYXNzLCAiX19uYW1lX18iKTsKKyAgICAgICAgaWYgKGtsYXNzbmFtZSA9PSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfQXR0cmlidXRlRXJyb3IpKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICghUHlTdHJpbmdfQ2hlY2soa2xhc3NuYW1lKSkgeworICAgICAgICAgICAgUHlfREVDUkVGKGtsYXNzbmFtZSk7CisgICAgICAgICAgICBrbGFzc25hbWUgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNrbGFzc25hbWUgPSBQeVN0cmluZ19BU19TVFJJTkcoa2xhc3NuYW1lKTsKKyAgICB9CisgICAgaWYgKHNlbGYgPT0gTlVMTCkKKyAgICAgICAgcmVzdWx0ID0gUHlTdHJpbmdfRnJvbUZvcm1hdCgiPHVuYm91bmQgbWV0aG9kICVzLiVzPiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tsYXNzbmFtZSwgc2Z1bmNuYW1lKTsKKyAgICBlbHNlIHsKKyAgICAgICAgLyogWFhYIFNob3VsZG4ndCB1c2UgcmVwcigpIGhlcmUhICovCisgICAgICAgIFB5T2JqZWN0ICpzZWxmcmVwciA9IFB5T2JqZWN0X1JlcHIoc2VsZik7CisgICAgICAgIGlmIChzZWxmcmVwciA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICBpZiAoIVB5U3RyaW5nX0NoZWNrKHNlbGZyZXByKSkgeworICAgICAgICAgICAgUHlfREVDUkVGKHNlbGZyZXByKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQgPSBQeVN0cmluZ19Gcm9tRm9ybWF0KCI8Ym91bmQgbWV0aG9kICVzLiVzIG9mICVzPiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tsYXNzbmFtZSwgc2Z1bmNuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FTX1NUUklORyhzZWxmcmVwcikpOworICAgICAgICBQeV9ERUNSRUYoc2VsZnJlcHIpOworICAgIH0KICAgZmFpbDoKLQlQeV9YREVDUkVGKGZ1bmNuYW1lKTsKLQlQeV9YREVDUkVGKGtsYXNzbmFtZSk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBQeV9YREVDUkVGKGZ1bmNuYW1lKTsKKyAgICBQeV9YREVDUkVGKGtsYXNzbmFtZSk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIGxvbmcKIGluc3RhbmNlbWV0aG9kX2hhc2goUHlNZXRob2RPYmplY3QgKmEpCiB7Ci0JbG9uZyB4LCB5OwotCWlmIChhLT5pbV9zZWxmID09IE5VTEwpCi0JCXggPSBQeU9iamVjdF9IYXNoKFB5X05vbmUpOwotCWVsc2UKLQkJeCA9IFB5T2JqZWN0X0hhc2goYS0+aW1fc2VsZik7Ci0JaWYgKHggPT0gLTEpCi0JCXJldHVybiAtMTsKLQl5ID0gUHlPYmplY3RfSGFzaChhLT5pbV9mdW5jKTsKLQlpZiAoeSA9PSAtMSkKLQkJcmV0dXJuIC0xOwotCXggPSB4IF4geTsKLQlpZiAoeCA9PSAtMSkKLQkJeCA9IC0yOwotCXJldHVybiB4OworICAgIGxvbmcgeCwgeTsKKyAgICBpZiAoYS0+aW1fc2VsZiA9PSBOVUxMKQorICAgICAgICB4ID0gUHlPYmplY3RfSGFzaChQeV9Ob25lKTsKKyAgICBlbHNlCisgICAgICAgIHggPSBQeU9iamVjdF9IYXNoKGEtPmltX3NlbGYpOworICAgIGlmICh4ID09IC0xKQorICAgICAgICByZXR1cm4gLTE7CisgICAgeSA9IFB5T2JqZWN0X0hhc2goYS0+aW1fZnVuYyk7CisgICAgaWYgKHkgPT0gLTEpCisgICAgICAgIHJldHVybiAtMTsKKyAgICB4ID0geCBeIHk7CisgICAgaWYgKHggPT0gLTEpCisgICAgICAgIHggPSAtMjsKKyAgICByZXR1cm4geDsKIH0KIAogc3RhdGljIGludAogaW5zdGFuY2VtZXRob2RfdHJhdmVyc2UoUHlNZXRob2RPYmplY3QgKmltLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlQeV9WSVNJVChpbS0+aW1fZnVuYyk7Ci0JUHlfVklTSVQoaW0tPmltX3NlbGYpOwotCVB5X1ZJU0lUKGltLT5pbV9jbGFzcyk7Ci0JcmV0dXJuIDA7CisgICAgUHlfVklTSVQoaW0tPmltX2Z1bmMpOworICAgIFB5X1ZJU0lUKGltLT5pbV9zZWxmKTsKKyAgICBQeV9WSVNJVChpbS0+aW1fY2xhc3MpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZAogZ2V0Y2xhc3NuYW1lKFB5T2JqZWN0ICprbGFzcywgY2hhciAqYnVmLCBpbnQgYnVmc2l6ZSkKIHsKLQlQeU9iamVjdCAqbmFtZTsKKyAgICBQeU9iamVjdCAqbmFtZTsKIAotCWFzc2VydChidWZzaXplID4gMSk7Ci0Jc3RyY3B5KGJ1ZiwgIj8iKTsgLyogRGVmYXVsdCBvdXRjb21lICovCi0JaWYgKGtsYXNzID09IE5VTEwpCi0JCXJldHVybjsKLQluYW1lID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhrbGFzcywgIl9fbmFtZV9fIik7Ci0JaWYgKG5hbWUgPT0gTlVMTCkgewotCQkvKiBUaGlzIGZ1bmN0aW9uIGNhbm5vdCByZXR1cm4gYW4gZXhjZXB0aW9uICovCi0JCVB5RXJyX0NsZWFyKCk7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKFB5U3RyaW5nX0NoZWNrKG5hbWUpKSB7Ci0JCXN0cm5jcHkoYnVmLCBQeVN0cmluZ19BU19TVFJJTkcobmFtZSksIGJ1ZnNpemUpOwotCQlidWZbYnVmc2l6ZS0xXSA9ICdcMCc7Ci0JfQotCVB5X0RFQ1JFRihuYW1lKTsKKyAgICBhc3NlcnQoYnVmc2l6ZSA+IDEpOworICAgIHN0cmNweShidWYsICI/Iik7IC8qIERlZmF1bHQgb3V0Y29tZSAqLworICAgIGlmIChrbGFzcyA9PSBOVUxMKQorICAgICAgICByZXR1cm47CisgICAgbmFtZSA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoa2xhc3MsICJfX25hbWVfXyIpOworICAgIGlmIChuYW1lID09IE5VTEwpIHsKKyAgICAgICAgLyogVGhpcyBmdW5jdGlvbiBjYW5ub3QgcmV0dXJuIGFuIGV4Y2VwdGlvbiAqLworICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChQeVN0cmluZ19DaGVjayhuYW1lKSkgeworICAgICAgICBzdHJuY3B5KGJ1ZiwgUHlTdHJpbmdfQVNfU1RSSU5HKG5hbWUpLCBidWZzaXplKTsKKyAgICAgICAgYnVmW2J1ZnNpemUtMV0gPSAnXDAnOworICAgIH0KKyAgICBQeV9ERUNSRUYobmFtZSk7CiB9CiAKIHN0YXRpYyB2b2lkCiBnZXRpbnN0Y2xhc3NuYW1lKFB5T2JqZWN0ICppbnN0LCBjaGFyICpidWYsIGludCBidWZzaXplKQogewotCVB5T2JqZWN0ICprbGFzczsKKyAgICBQeU9iamVjdCAqa2xhc3M7CiAKLQlpZiAoaW5zdCA9PSBOVUxMKSB7Ci0JCWFzc2VydChidWZzaXplID4gMCAmJiAoc2l6ZV90KWJ1ZnNpemUgPiBzdHJsZW4oIm5vdGhpbmciKSk7Ci0JCXN0cmNweShidWYsICJub3RoaW5nIik7Ci0JCXJldHVybjsKLQl9CisgICAgaWYgKGluc3QgPT0gTlVMTCkgeworICAgICAgICBhc3NlcnQoYnVmc2l6ZSA+IDAgJiYgKHNpemVfdClidWZzaXplID4gc3RybGVuKCJub3RoaW5nIikpOworICAgICAgICBzdHJjcHkoYnVmLCAibm90aGluZyIpOworICAgICAgICByZXR1cm47CisgICAgfQogCi0Ja2xhc3MgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKGluc3QsICJfX2NsYXNzX18iKTsKLQlpZiAoa2xhc3MgPT0gTlVMTCkgewotCQkvKiBUaGlzIGZ1bmN0aW9uIGNhbm5vdCByZXR1cm4gYW4gZXhjZXB0aW9uICovCi0JCVB5RXJyX0NsZWFyKCk7Ci0JCWtsYXNzID0gKFB5T2JqZWN0ICopKGluc3QtPm9iX3R5cGUpOwotCQlQeV9JTkNSRUYoa2xhc3MpOwotCX0KLQlnZXRjbGFzc25hbWUoa2xhc3MsIGJ1ZiwgYnVmc2l6ZSk7Ci0JUHlfWERFQ1JFRihrbGFzcyk7CisgICAga2xhc3MgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKGluc3QsICJfX2NsYXNzX18iKTsKKyAgICBpZiAoa2xhc3MgPT0gTlVMTCkgeworICAgICAgICAvKiBUaGlzIGZ1bmN0aW9uIGNhbm5vdCByZXR1cm4gYW4gZXhjZXB0aW9uICovCisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIGtsYXNzID0gKFB5T2JqZWN0ICopKGluc3QtPm9iX3R5cGUpOworICAgICAgICBQeV9JTkNSRUYoa2xhc3MpOworICAgIH0KKyAgICBnZXRjbGFzc25hbWUoa2xhc3MsIGJ1ZiwgYnVmc2l6ZSk7CisgICAgUHlfWERFQ1JFRihrbGFzcyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbnN0YW5jZW1ldGhvZF9jYWxsKFB5T2JqZWN0ICpmdW5jLCBQeU9iamVjdCAqYXJnLCBQeU9iamVjdCAqa3cpCiB7Ci0JUHlPYmplY3QgKnNlbGYgPSBQeU1ldGhvZF9HRVRfU0VMRihmdW5jKTsKLQlQeU9iamVjdCAqa2xhc3MgPSBQeU1ldGhvZF9HRVRfQ0xBU1MoZnVuYyk7Ci0JUHlPYmplY3QgKnJlc3VsdDsKKyAgICBQeU9iamVjdCAqc2VsZiA9IFB5TWV0aG9kX0dFVF9TRUxGKGZ1bmMpOworICAgIFB5T2JqZWN0ICprbGFzcyA9IFB5TWV0aG9kX0dFVF9DTEFTUyhmdW5jKTsKKyAgICBQeU9iamVjdCAqcmVzdWx0OwogCi0JZnVuYyA9IFB5TWV0aG9kX0dFVF9GVU5DVElPTihmdW5jKTsKLQlpZiAoc2VsZiA9PSBOVUxMKSB7Ci0JCS8qIFVuYm91bmQgbWV0aG9kcyBtdXN0IGJlIGNhbGxlZCB3aXRoIGFuIGluc3RhbmNlIG9mCi0JCSAgIHRoZSBjbGFzcyAob3IgYSBkZXJpdmVkIGNsYXNzKSBhcyBmaXJzdCBhcmd1bWVudCAqLwotCQlpbnQgb2s7Ci0JCWlmIChQeVR1cGxlX1NpemUoYXJnKSA+PSAxKQotCQkJc2VsZiA9IFB5VHVwbGVfR0VUX0lURU0oYXJnLCAwKTsKLQkJaWYgKHNlbGYgPT0gTlVMTCkKLQkJCW9rID0gMDsKLQkJZWxzZSB7Ci0JCQlvayA9IFB5T2JqZWN0X0lzSW5zdGFuY2Uoc2VsZiwga2xhc3MpOwotCQkJaWYgKG9rIDwgMCkKLQkJCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlpZiAoIW9rKSB7Ci0JCQljaGFyIGNsc2J1ZlsyNTZdOwotCQkJY2hhciBpbnN0YnVmWzI1Nl07Ci0JCQlnZXRjbGFzc25hbWUoa2xhc3MsIGNsc2J1Ziwgc2l6ZW9mKGNsc2J1ZikpOwotCQkJZ2V0aW5zdGNsYXNzbmFtZShzZWxmLCBpbnN0YnVmLCBzaXplb2YoaW5zdGJ1ZikpOwotCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCQkgICAgICJ1bmJvdW5kIG1ldGhvZCAlcyVzIG11c3QgYmUgY2FsbGVkIHdpdGggIgotCQkJCSAgICAgIiVzIGluc3RhbmNlIGFzIGZpcnN0IGFyZ3VtZW50ICIKLQkJCQkgICAgICIoZ290ICVzJXMgaW5zdGVhZCkiLAotCQkJCSAgICAgUHlFdmFsX0dldEZ1bmNOYW1lKGZ1bmMpLAotCQkJCSAgICAgUHlFdmFsX0dldEZ1bmNEZXNjKGZ1bmMpLAotCQkJCSAgICAgY2xzYnVmLAotCQkJCSAgICAgaW5zdGJ1ZiwKLQkJCQkgICAgIHNlbGYgPT0gTlVMTCA/ICIiIDogIiBpbnN0YW5jZSIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJUHlfSU5DUkVGKGFyZyk7Ci0JfQotCWVsc2UgewotCQlQeV9zc2l6ZV90IGFyZ2NvdW50ID0gUHlUdXBsZV9TaXplKGFyZyk7Ci0JCVB5T2JqZWN0ICpuZXdhcmcgPSBQeVR1cGxlX05ldyhhcmdjb3VudCArIDEpOwotCQlpbnQgaTsKLQkJaWYgKG5ld2FyZyA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCVB5X0lOQ1JFRihzZWxmKTsKLQkJUHlUdXBsZV9TRVRfSVRFTShuZXdhcmcsIDAsIHNlbGYpOwotCQlmb3IgKGkgPSAwOyBpIDwgYXJnY291bnQ7IGkrKykgewotCQkJUHlPYmplY3QgKnYgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZywgaSk7Ci0JCQlQeV9YSU5DUkVGKHYpOwotCQkJUHlUdXBsZV9TRVRfSVRFTShuZXdhcmcsIGkrMSwgdik7Ci0JCX0KLQkJYXJnID0gbmV3YXJnOwotCX0KLQlyZXN1bHQgPSBQeU9iamVjdF9DYWxsKChQeU9iamVjdCAqKWZ1bmMsIGFyZywga3cpOwotCVB5X0RFQ1JFRihhcmcpOwotCXJldHVybiByZXN1bHQ7CisgICAgZnVuYyA9IFB5TWV0aG9kX0dFVF9GVU5DVElPTihmdW5jKTsKKyAgICBpZiAoc2VsZiA9PSBOVUxMKSB7CisgICAgICAgIC8qIFVuYm91bmQgbWV0aG9kcyBtdXN0IGJlIGNhbGxlZCB3aXRoIGFuIGluc3RhbmNlIG9mCisgICAgICAgICAgIHRoZSBjbGFzcyAob3IgYSBkZXJpdmVkIGNsYXNzKSBhcyBmaXJzdCBhcmd1bWVudCAqLworICAgICAgICBpbnQgb2s7CisgICAgICAgIGlmIChQeVR1cGxlX1NpemUoYXJnKSA+PSAxKQorICAgICAgICAgICAgc2VsZiA9IFB5VHVwbGVfR0VUX0lURU0oYXJnLCAwKTsKKyAgICAgICAgaWYgKHNlbGYgPT0gTlVMTCkKKyAgICAgICAgICAgIG9rID0gMDsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBvayA9IFB5T2JqZWN0X0lzSW5zdGFuY2Uoc2VsZiwga2xhc3MpOworICAgICAgICAgICAgaWYgKG9rIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW9rKSB7CisgICAgICAgICAgICBjaGFyIGNsc2J1ZlsyNTZdOworICAgICAgICAgICAgY2hhciBpbnN0YnVmWzI1Nl07CisgICAgICAgICAgICBnZXRjbGFzc25hbWUoa2xhc3MsIGNsc2J1Ziwgc2l6ZW9mKGNsc2J1ZikpOworICAgICAgICAgICAgZ2V0aW5zdGNsYXNzbmFtZShzZWxmLCBpbnN0YnVmLCBzaXplb2YoaW5zdGJ1ZikpOworICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAidW5ib3VuZCBtZXRob2QgJXMlcyBtdXN0IGJlIGNhbGxlZCB3aXRoICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiJXMgaW5zdGFuY2UgYXMgZmlyc3QgYXJndW1lbnQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICIoZ290ICVzJXMgaW5zdGVhZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXZhbF9HZXRGdW5jTmFtZShmdW5jKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeUV2YWxfR2V0RnVuY0Rlc2MoZnVuYyksCisgICAgICAgICAgICAgICAgICAgICAgICAgY2xzYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZiA9PSBOVUxMID8gIiIgOiAiIGluc3RhbmNlIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBQeV9JTkNSRUYoYXJnKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5X3NzaXplX3QgYXJnY291bnQgPSBQeVR1cGxlX1NpemUoYXJnKTsKKyAgICAgICAgUHlPYmplY3QgKm5ld2FyZyA9IFB5VHVwbGVfTmV3KGFyZ2NvdW50ICsgMSk7CisgICAgICAgIGludCBpOworICAgICAgICBpZiAobmV3YXJnID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgUHlfSU5DUkVGKHNlbGYpOworICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKG5ld2FyZywgMCwgc2VsZik7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhcmdjb3VudDsgaSsrKSB7CisgICAgICAgICAgICBQeU9iamVjdCAqdiA9IFB5VHVwbGVfR0VUX0lURU0oYXJnLCBpKTsKKyAgICAgICAgICAgIFB5X1hJTkNSRUYodik7CisgICAgICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKG5ld2FyZywgaSsxLCB2KTsKKyAgICAgICAgfQorICAgICAgICBhcmcgPSBuZXdhcmc7CisgICAgfQorICAgIHJlc3VsdCA9IFB5T2JqZWN0X0NhbGwoKFB5T2JqZWN0ICopZnVuYywgYXJnLCBrdyk7CisgICAgUHlfREVDUkVGKGFyZyk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGluc3RhbmNlbWV0aG9kX2Rlc2NyX2dldChQeU9iamVjdCAqbWV0aCwgUHlPYmplY3QgKm9iaiwgUHlPYmplY3QgKmNscykKIHsKLQkvKiBEb24ndCByZWJpbmQgYW4gYWxyZWFkeSBib3VuZCBtZXRob2QsIG9yIGFuIHVuYm91bmQgbWV0aG9kCi0JICAgb2YgYSBjbGFzcyB0aGF0J3Mgbm90IGEgYmFzZSBjbGFzcyBvZiBjbHMuICovCisgICAgLyogRG9uJ3QgcmViaW5kIGFuIGFscmVhZHkgYm91bmQgbWV0aG9kLCBvciBhbiB1bmJvdW5kIG1ldGhvZAorICAgICAgIG9mIGEgY2xhc3MgdGhhdCdzIG5vdCBhIGJhc2UgY2xhc3Mgb2YgY2xzLiAqLwogCi0JaWYgKFB5TWV0aG9kX0dFVF9TRUxGKG1ldGgpICE9IE5VTEwpIHsKLQkJLyogQWxyZWFkeSBib3VuZCAqLwotCQlQeV9JTkNSRUYobWV0aCk7Ci0JCXJldHVybiBtZXRoOwotCX0KLQkvKiBObywgaXQgaXMgYW4gdW5ib3VuZCBtZXRob2QgKi8KLQlpZiAoUHlNZXRob2RfR0VUX0NMQVNTKG1ldGgpICE9IE5VTEwgJiYgY2xzICE9IE5VTEwpIHsKLQkJLyogRG8gc3ViY2xhc3MgdGVzdC4gIElmIGl0IGZhaWxzLCByZXR1cm4gbWV0aCB1bmNoYW5nZWQuICovCi0JCWludCBvayA9IFB5T2JqZWN0X0lzU3ViY2xhc3MoY2xzLCBQeU1ldGhvZF9HRVRfQ0xBU1MobWV0aCkpOwotCQlpZiAob2sgPCAwKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWlmICghb2spIHsKLQkJCVB5X0lOQ1JFRihtZXRoKTsKLQkJCXJldHVybiBtZXRoOwotCQl9Ci0JfQotCS8qIEJpbmQgaXQgdG8gb2JqICovCi0JcmV0dXJuIFB5TWV0aG9kX05ldyhQeU1ldGhvZF9HRVRfRlVOQ1RJT04obWV0aCksIG9iaiwgY2xzKTsKKyAgICBpZiAoUHlNZXRob2RfR0VUX1NFTEYobWV0aCkgIT0gTlVMTCkgeworICAgICAgICAvKiBBbHJlYWR5IGJvdW5kICovCisgICAgICAgIFB5X0lOQ1JFRihtZXRoKTsKKyAgICAgICAgcmV0dXJuIG1ldGg7CisgICAgfQorICAgIC8qIE5vLCBpdCBpcyBhbiB1bmJvdW5kIG1ldGhvZCAqLworICAgIGlmIChQeU1ldGhvZF9HRVRfQ0xBU1MobWV0aCkgIT0gTlVMTCAmJiBjbHMgIT0gTlVMTCkgeworICAgICAgICAvKiBEbyBzdWJjbGFzcyB0ZXN0LiAgSWYgaXQgZmFpbHMsIHJldHVybiBtZXRoIHVuY2hhbmdlZC4gKi8KKyAgICAgICAgaW50IG9rID0gUHlPYmplY3RfSXNTdWJjbGFzcyhjbHMsIFB5TWV0aG9kX0dFVF9DTEFTUyhtZXRoKSk7CisgICAgICAgIGlmIChvayA8IDApCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKCFvaykgeworICAgICAgICAgICAgUHlfSU5DUkVGKG1ldGgpOworICAgICAgICAgICAgcmV0dXJuIG1ldGg7CisgICAgICAgIH0KKyAgICB9CisgICAgLyogQmluZCBpdCB0byBvYmogKi8KKyAgICByZXR1cm4gUHlNZXRob2RfTmV3KFB5TWV0aG9kX0dFVF9GVU5DVElPTihtZXRoKSwgb2JqLCBjbHMpOwogfQogCiBQeVR5cGVPYmplY3QgUHlNZXRob2RfVHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlKQotCTAsCi0JImluc3RhbmNlbWV0aG9kIiwKLQlzaXplb2YoUHlNZXRob2RPYmplY3QpLAotCTAsCi0JKGRlc3RydWN0b3IpaW5zdGFuY2VtZXRob2RfZGVhbGxvYywJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkoY21wZnVuYylpbnN0YW5jZW1ldGhvZF9jb21wYXJlLAkvKiB0cF9jb21wYXJlICovCi0JKHJlcHJmdW5jKWluc3RhbmNlbWV0aG9kX3JlcHIsCQkvKiB0cF9yZXByICovCi0JMCwJCQkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JKGhhc2hmdW5jKWluc3RhbmNlbWV0aG9kX2hhc2gsCQkvKiB0cF9oYXNoICovCi0JaW5zdGFuY2VtZXRob2RfY2FsbCwJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJCS8qIHRwX3N0ciAqLwotCWluc3RhbmNlbWV0aG9kX2dldGF0dHJvLAkJLyogdHBfZ2V0YXR0cm8gKi8KLQlQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQyAgfCBQeV9UUEZMQUdTX0hBVkVfV0VBS1JFRlMsIC8qIHRwX2ZsYWdzICovCi0JaW5zdGFuY2VtZXRob2RfZG9jLAkJCS8qIHRwX2RvYyAqLwotCSh0cmF2ZXJzZXByb2MpaW5zdGFuY2VtZXRob2RfdHJhdmVyc2UsCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0gCW9mZnNldG9mKFB5TWV0aG9kT2JqZWN0LCBpbV93ZWFrcmVmbGlzdCksIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkJLyogdHBfaXRlcm5leHQgKi8KLQkwLAkJCQkJLyogdHBfbWV0aG9kcyAqLwotCWluc3RhbmNlbWV0aG9kX21lbWJlcmxpc3QsCQkvKiB0cF9tZW1iZXJzICovCi0JaW5zdGFuY2VtZXRob2RfZ2V0c2V0LAkJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJCS8qIHRwX2RpY3QgKi8KLQlpbnN0YW5jZW1ldGhvZF9kZXNjcl9nZXQsCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaW5pdCAqLwotCTAsCQkJCQkvKiB0cF9hbGxvYyAqLwotCWluc3RhbmNlbWV0aG9kX25ldywJCQkvKiB0cF9uZXcgKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlKQorICAgIDAsCisgICAgImluc3RhbmNlbWV0aG9kIiwKKyAgICBzaXplb2YoUHlNZXRob2RPYmplY3QpLAorICAgIDAsCisgICAgKGRlc3RydWN0b3IpaW5zdGFuY2VtZXRob2RfZGVhbGxvYywgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIChjbXBmdW5jKWluc3RhbmNlbWV0aG9kX2NvbXBhcmUsICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIChyZXByZnVuYylpbnN0YW5jZW1ldGhvZF9yZXByLCAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIChoYXNoZnVuYylpbnN0YW5jZW1ldGhvZF9oYXNoLCAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIGluc3RhbmNlbWV0aG9kX2NhbGwsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgaW5zdGFuY2VtZXRob2RfZ2V0YXR0cm8sICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQyAgfCBQeV9UUEZMQUdTX0hBVkVfV0VBS1JFRlMsIC8qIHRwX2ZsYWdzICovCisgICAgaW5zdGFuY2VtZXRob2RfZG9jLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAodHJhdmVyc2Vwcm9jKWluc3RhbmNlbWV0aG9kX3RyYXZlcnNlLCAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICBvZmZzZXRvZihQeU1ldGhvZE9iamVjdCwgaW1fd2Vha3JlZmxpc3QpLCAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICBpbnN0YW5jZW1ldGhvZF9tZW1iZXJsaXN0LCAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICBpbnN0YW5jZW1ldGhvZF9nZXRzZXQsICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIGluc3RhbmNlbWV0aG9kX2Rlc2NyX2dldCwgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgaW5zdGFuY2VtZXRob2RfbmV3LCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KIH07CiAKIC8qIENsZWFyIG91dCB0aGUgZnJlZSBsaXN0ICovCkBAIC0yNjU0LDIwICsyNjU0LDIwIEBACiBpbnQKIFB5TWV0aG9kX0NsZWFyRnJlZUxpc3Qodm9pZCkKIHsKLQlpbnQgZnJlZWxpc3Rfc2l6ZSA9IG51bWZyZWU7Ci0JCi0Jd2hpbGUgKGZyZWVfbGlzdCkgewotCQlQeU1ldGhvZE9iamVjdCAqaW0gPSBmcmVlX2xpc3Q7Ci0JCWZyZWVfbGlzdCA9IChQeU1ldGhvZE9iamVjdCAqKShpbS0+aW1fc2VsZik7Ci0JCVB5T2JqZWN0X0dDX0RlbChpbSk7Ci0JCW51bWZyZWUtLTsKLQl9Ci0JYXNzZXJ0KG51bWZyZWUgPT0gMCk7Ci0JcmV0dXJuIGZyZWVsaXN0X3NpemU7CisgICAgaW50IGZyZWVsaXN0X3NpemUgPSBudW1mcmVlOworCisgICAgd2hpbGUgKGZyZWVfbGlzdCkgeworICAgICAgICBQeU1ldGhvZE9iamVjdCAqaW0gPSBmcmVlX2xpc3Q7CisgICAgICAgIGZyZWVfbGlzdCA9IChQeU1ldGhvZE9iamVjdCAqKShpbS0+aW1fc2VsZik7CisgICAgICAgIFB5T2JqZWN0X0dDX0RlbChpbSk7CisgICAgICAgIG51bWZyZWUtLTsKKyAgICB9CisgICAgYXNzZXJ0KG51bWZyZWUgPT0gMCk7CisgICAgcmV0dXJuIGZyZWVsaXN0X3NpemU7CiB9CiAKIHZvaWQKIFB5TWV0aG9kX0Zpbmkodm9pZCkKIHsKLQkodm9pZClQeU1ldGhvZF9DbGVhckZyZWVMaXN0KCk7CisgICAgKHZvaWQpUHlNZXRob2RfQ2xlYXJGcmVlTGlzdCgpOwogfQpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9jb2Rlb2JqZWN0LmMgYi9PYmplY3RzL2NvZGVvYmplY3QuYwppbmRleCBlOTRiNGNjLi45YzNiZmVlIDEwMDY0NAotLS0gYS9PYmplY3RzL2NvZGVvYmplY3QuYworKysgYi9PYmplY3RzL2NvZGVvYmplY3QuYwpAQCAtMywxMjkgKzMsMTI5IEBACiAjaW5jbHVkZSAic3RydWN0bWVtYmVyLmgiCiAKICNkZWZpbmUgTkFNRV9DSEFSUyBcCi0JIjAxMjM0NTY3ODlBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiIKKyAgICAiMDEyMzQ1Njc4OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IgogCiAvKiBhbGxfbmFtZV9jaGFycyhzKTogdHJ1ZSBpZmYgYWxsIGNoYXJzIGluIHMgYXJlIHZhbGlkIE5BTUVfQ0hBUlMgKi8KIAogc3RhdGljIGludAogYWxsX25hbWVfY2hhcnModW5zaWduZWQgY2hhciAqcykKIHsKLQlzdGF0aWMgY2hhciBva19uYW1lX2NoYXJbMjU2XTsKLQlzdGF0aWMgdW5zaWduZWQgY2hhciAqbmFtZV9jaGFycyA9ICh1bnNpZ25lZCBjaGFyICopTkFNRV9DSEFSUzsKKyAgICBzdGF0aWMgY2hhciBva19uYW1lX2NoYXJbMjU2XTsKKyAgICBzdGF0aWMgdW5zaWduZWQgY2hhciAqbmFtZV9jaGFycyA9ICh1bnNpZ25lZCBjaGFyICopTkFNRV9DSEFSUzsKIAotCWlmIChva19uYW1lX2NoYXJbKm5hbWVfY2hhcnNdID09IDApIHsKLQkJdW5zaWduZWQgY2hhciAqcDsKLQkJZm9yIChwID0gbmFtZV9jaGFyczsgKnA7IHArKykKLQkJCW9rX25hbWVfY2hhclsqcF0gPSAxOwotCX0KLQl3aGlsZSAoKnMpIHsKLQkJaWYgKG9rX25hbWVfY2hhclsqcysrXSA9PSAwKQotCQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiAxOworICAgIGlmIChva19uYW1lX2NoYXJbKm5hbWVfY2hhcnNdID09IDApIHsKKyAgICAgICAgdW5zaWduZWQgY2hhciAqcDsKKyAgICAgICAgZm9yIChwID0gbmFtZV9jaGFyczsgKnA7IHArKykKKyAgICAgICAgICAgIG9rX25hbWVfY2hhclsqcF0gPSAxOworICAgIH0KKyAgICB3aGlsZSAoKnMpIHsKKyAgICAgICAgaWYgKG9rX25hbWVfY2hhclsqcysrXSA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgdm9pZAogaW50ZXJuX3N0cmluZ3MoUHlPYmplY3QgKnR1cGxlKQogewotCVB5X3NzaXplX3QgaTsKKyAgICBQeV9zc2l6ZV90IGk7CiAKLQlmb3IgKGkgPSBQeVR1cGxlX0dFVF9TSVpFKHR1cGxlKTsgLS1pID49IDA7ICkgewotCQlQeU9iamVjdCAqdiA9IFB5VHVwbGVfR0VUX0lURU0odHVwbGUsIGkpOwotCQlpZiAodiA9PSBOVUxMIHx8ICFQeVN0cmluZ19DaGVja0V4YWN0KHYpKSB7Ci0JCQlQeV9GYXRhbEVycm9yKCJub24tc3RyaW5nIGZvdW5kIGluIGNvZGUgc2xvdCIpOwotCQl9Ci0JCVB5U3RyaW5nX0ludGVybkluUGxhY2UoJlB5VHVwbGVfR0VUX0lURU0odHVwbGUsIGkpKTsKLQl9CisgICAgZm9yIChpID0gUHlUdXBsZV9HRVRfU0laRSh0dXBsZSk7IC0taSA+PSAwOyApIHsKKyAgICAgICAgUHlPYmplY3QgKnYgPSBQeVR1cGxlX0dFVF9JVEVNKHR1cGxlLCBpKTsKKyAgICAgICAgaWYgKHYgPT0gTlVMTCB8fCAhUHlTdHJpbmdfQ2hlY2tFeGFjdCh2KSkgeworICAgICAgICAgICAgUHlfRmF0YWxFcnJvcigibm9uLXN0cmluZyBmb3VuZCBpbiBjb2RlIHNsb3QiKTsKKyAgICAgICAgfQorICAgICAgICBQeVN0cmluZ19JbnRlcm5JblBsYWNlKCZQeVR1cGxlX0dFVF9JVEVNKHR1cGxlLCBpKSk7CisgICAgfQogfQogCiAKIFB5Q29kZU9iamVjdCAqCiBQeUNvZGVfTmV3KGludCBhcmdjb3VudCwgaW50IG5sb2NhbHMsIGludCBzdGFja3NpemUsIGludCBmbGFncywKLQkgICBQeU9iamVjdCAqY29kZSwgUHlPYmplY3QgKmNvbnN0cywgUHlPYmplY3QgKm5hbWVzLAotCSAgIFB5T2JqZWN0ICp2YXJuYW1lcywgUHlPYmplY3QgKmZyZWV2YXJzLCBQeU9iamVjdCAqY2VsbHZhcnMsCi0JICAgUHlPYmplY3QgKmZpbGVuYW1lLCBQeU9iamVjdCAqbmFtZSwgaW50IGZpcnN0bGluZW5vLAotCSAgIFB5T2JqZWN0ICpsbm90YWIpCisgICAgICAgICAgIFB5T2JqZWN0ICpjb2RlLCBQeU9iamVjdCAqY29uc3RzLCBQeU9iamVjdCAqbmFtZXMsCisgICAgICAgICAgIFB5T2JqZWN0ICp2YXJuYW1lcywgUHlPYmplY3QgKmZyZWV2YXJzLCBQeU9iamVjdCAqY2VsbHZhcnMsCisgICAgICAgICAgIFB5T2JqZWN0ICpmaWxlbmFtZSwgUHlPYmplY3QgKm5hbWUsIGludCBmaXJzdGxpbmVubywKKyAgICAgICAgICAgUHlPYmplY3QgKmxub3RhYikKIHsKLQlQeUNvZGVPYmplY3QgKmNvOwotCVB5X3NzaXplX3QgaTsKLQkvKiBDaGVjayBhcmd1bWVudCB0eXBlcyAqLwotCWlmIChhcmdjb3VudCA8IDAgfHwgbmxvY2FscyA8IDAgfHwKLQkgICAgY29kZSA9PSBOVUxMIHx8Ci0JICAgIGNvbnN0cyA9PSBOVUxMIHx8ICFQeVR1cGxlX0NoZWNrKGNvbnN0cykgfHwKLQkgICAgbmFtZXMgPT0gTlVMTCB8fCAhUHlUdXBsZV9DaGVjayhuYW1lcykgfHwKLQkgICAgdmFybmFtZXMgPT0gTlVMTCB8fCAhUHlUdXBsZV9DaGVjayh2YXJuYW1lcykgfHwKLQkgICAgZnJlZXZhcnMgPT0gTlVMTCB8fCAhUHlUdXBsZV9DaGVjayhmcmVldmFycykgfHwKLQkgICAgY2VsbHZhcnMgPT0gTlVMTCB8fCAhUHlUdXBsZV9DaGVjayhjZWxsdmFycykgfHwKLQkgICAgbmFtZSA9PSBOVUxMIHx8ICFQeVN0cmluZ19DaGVjayhuYW1lKSB8fAotCSAgICBmaWxlbmFtZSA9PSBOVUxMIHx8ICFQeVN0cmluZ19DaGVjayhmaWxlbmFtZSkgfHwKLQkgICAgbG5vdGFiID09IE5VTEwgfHwgIVB5U3RyaW5nX0NoZWNrKGxub3RhYikgfHwKLQkgICAgIVB5T2JqZWN0X0NoZWNrUmVhZEJ1ZmZlcihjb2RlKSkgewotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWludGVybl9zdHJpbmdzKG5hbWVzKTsKLQlpbnRlcm5fc3RyaW5ncyh2YXJuYW1lcyk7Ci0JaW50ZXJuX3N0cmluZ3MoZnJlZXZhcnMpOwotCWludGVybl9zdHJpbmdzKGNlbGx2YXJzKTsKLQkvKiBJbnRlcm4gc2VsZWN0ZWQgc3RyaW5nIGNvbnN0YW50cyAqLwotCWZvciAoaSA9IFB5VHVwbGVfU2l6ZShjb25zdHMpOyAtLWkgPj0gMDsgKSB7Ci0JCVB5T2JqZWN0ICp2ID0gUHlUdXBsZV9HZXRJdGVtKGNvbnN0cywgaSk7Ci0JCWlmICghUHlTdHJpbmdfQ2hlY2sodikpCi0JCQljb250aW51ZTsKLQkJaWYgKCFhbGxfbmFtZV9jaGFycygodW5zaWduZWQgY2hhciAqKVB5U3RyaW5nX0FTX1NUUklORyh2KSkpCi0JCQljb250aW51ZTsKLQkJUHlTdHJpbmdfSW50ZXJuSW5QbGFjZSgmUHlUdXBsZV9HRVRfSVRFTShjb25zdHMsIGkpKTsKLQl9Ci0JY28gPSBQeU9iamVjdF9ORVcoUHlDb2RlT2JqZWN0LCAmUHlDb2RlX1R5cGUpOwotCWlmIChjbyAhPSBOVUxMKSB7Ci0JCWNvLT5jb19hcmdjb3VudCA9IGFyZ2NvdW50OwotCQljby0+Y29fbmxvY2FscyA9IG5sb2NhbHM7Ci0JCWNvLT5jb19zdGFja3NpemUgPSBzdGFja3NpemU7Ci0JCWNvLT5jb19mbGFncyA9IGZsYWdzOwotCQlQeV9JTkNSRUYoY29kZSk7Ci0JCWNvLT5jb19jb2RlID0gY29kZTsKLQkJUHlfSU5DUkVGKGNvbnN0cyk7Ci0JCWNvLT5jb19jb25zdHMgPSBjb25zdHM7Ci0JCVB5X0lOQ1JFRihuYW1lcyk7Ci0JCWNvLT5jb19uYW1lcyA9IG5hbWVzOwotCQlQeV9JTkNSRUYodmFybmFtZXMpOwotCQljby0+Y29fdmFybmFtZXMgPSB2YXJuYW1lczsKLQkJUHlfSU5DUkVGKGZyZWV2YXJzKTsKLQkJY28tPmNvX2ZyZWV2YXJzID0gZnJlZXZhcnM7Ci0JCVB5X0lOQ1JFRihjZWxsdmFycyk7Ci0JCWNvLT5jb19jZWxsdmFycyA9IGNlbGx2YXJzOwotCQlQeV9JTkNSRUYoZmlsZW5hbWUpOwotCQljby0+Y29fZmlsZW5hbWUgPSBmaWxlbmFtZTsKLQkJUHlfSU5DUkVGKG5hbWUpOwotCQljby0+Y29fbmFtZSA9IG5hbWU7Ci0JCWNvLT5jb19maXJzdGxpbmVubyA9IGZpcnN0bGluZW5vOwotCQlQeV9JTkNSRUYobG5vdGFiKTsKLQkJY28tPmNvX2xub3RhYiA9IGxub3RhYjsKLSAgICAgICAgICAgICAgICBjby0+Y29fem9tYmllZnJhbWUgPSBOVUxMOwotCX0KLQlyZXR1cm4gY287CisgICAgUHlDb2RlT2JqZWN0ICpjbzsKKyAgICBQeV9zc2l6ZV90IGk7CisgICAgLyogQ2hlY2sgYXJndW1lbnQgdHlwZXMgKi8KKyAgICBpZiAoYXJnY291bnQgPCAwIHx8IG5sb2NhbHMgPCAwIHx8CisgICAgICAgIGNvZGUgPT0gTlVMTCB8fAorICAgICAgICBjb25zdHMgPT0gTlVMTCB8fCAhUHlUdXBsZV9DaGVjayhjb25zdHMpIHx8CisgICAgICAgIG5hbWVzID09IE5VTEwgfHwgIVB5VHVwbGVfQ2hlY2sobmFtZXMpIHx8CisgICAgICAgIHZhcm5hbWVzID09IE5VTEwgfHwgIVB5VHVwbGVfQ2hlY2sodmFybmFtZXMpIHx8CisgICAgICAgIGZyZWV2YXJzID09IE5VTEwgfHwgIVB5VHVwbGVfQ2hlY2soZnJlZXZhcnMpIHx8CisgICAgICAgIGNlbGx2YXJzID09IE5VTEwgfHwgIVB5VHVwbGVfQ2hlY2soY2VsbHZhcnMpIHx8CisgICAgICAgIG5hbWUgPT0gTlVMTCB8fCAhUHlTdHJpbmdfQ2hlY2sobmFtZSkgfHwKKyAgICAgICAgZmlsZW5hbWUgPT0gTlVMTCB8fCAhUHlTdHJpbmdfQ2hlY2soZmlsZW5hbWUpIHx8CisgICAgICAgIGxub3RhYiA9PSBOVUxMIHx8ICFQeVN0cmluZ19DaGVjayhsbm90YWIpIHx8CisgICAgICAgICFQeU9iamVjdF9DaGVja1JlYWRCdWZmZXIoY29kZSkpIHsKKyAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpbnRlcm5fc3RyaW5ncyhuYW1lcyk7CisgICAgaW50ZXJuX3N0cmluZ3ModmFybmFtZXMpOworICAgIGludGVybl9zdHJpbmdzKGZyZWV2YXJzKTsKKyAgICBpbnRlcm5fc3RyaW5ncyhjZWxsdmFycyk7CisgICAgLyogSW50ZXJuIHNlbGVjdGVkIHN0cmluZyBjb25zdGFudHMgKi8KKyAgICBmb3IgKGkgPSBQeVR1cGxlX1NpemUoY29uc3RzKTsgLS1pID49IDA7ICkgeworICAgICAgICBQeU9iamVjdCAqdiA9IFB5VHVwbGVfR2V0SXRlbShjb25zdHMsIGkpOworICAgICAgICBpZiAoIVB5U3RyaW5nX0NoZWNrKHYpKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmICghYWxsX25hbWVfY2hhcnMoKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19BU19TVFJJTkcodikpKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIFB5U3RyaW5nX0ludGVybkluUGxhY2UoJlB5VHVwbGVfR0VUX0lURU0oY29uc3RzLCBpKSk7CisgICAgfQorICAgIGNvID0gUHlPYmplY3RfTkVXKFB5Q29kZU9iamVjdCwgJlB5Q29kZV9UeXBlKTsKKyAgICBpZiAoY28gIT0gTlVMTCkgeworICAgICAgICBjby0+Y29fYXJnY291bnQgPSBhcmdjb3VudDsKKyAgICAgICAgY28tPmNvX25sb2NhbHMgPSBubG9jYWxzOworICAgICAgICBjby0+Y29fc3RhY2tzaXplID0gc3RhY2tzaXplOworICAgICAgICBjby0+Y29fZmxhZ3MgPSBmbGFnczsKKyAgICAgICAgUHlfSU5DUkVGKGNvZGUpOworICAgICAgICBjby0+Y29fY29kZSA9IGNvZGU7CisgICAgICAgIFB5X0lOQ1JFRihjb25zdHMpOworICAgICAgICBjby0+Y29fY29uc3RzID0gY29uc3RzOworICAgICAgICBQeV9JTkNSRUYobmFtZXMpOworICAgICAgICBjby0+Y29fbmFtZXMgPSBuYW1lczsKKyAgICAgICAgUHlfSU5DUkVGKHZhcm5hbWVzKTsKKyAgICAgICAgY28tPmNvX3Zhcm5hbWVzID0gdmFybmFtZXM7CisgICAgICAgIFB5X0lOQ1JFRihmcmVldmFycyk7CisgICAgICAgIGNvLT5jb19mcmVldmFycyA9IGZyZWV2YXJzOworICAgICAgICBQeV9JTkNSRUYoY2VsbHZhcnMpOworICAgICAgICBjby0+Y29fY2VsbHZhcnMgPSBjZWxsdmFyczsKKyAgICAgICAgUHlfSU5DUkVGKGZpbGVuYW1lKTsKKyAgICAgICAgY28tPmNvX2ZpbGVuYW1lID0gZmlsZW5hbWU7CisgICAgICAgIFB5X0lOQ1JFRihuYW1lKTsKKyAgICAgICAgY28tPmNvX25hbWUgPSBuYW1lOworICAgICAgICBjby0+Y29fZmlyc3RsaW5lbm8gPSBmaXJzdGxpbmVubzsKKyAgICAgICAgUHlfSU5DUkVGKGxub3RhYik7CisgICAgICAgIGNvLT5jb19sbm90YWIgPSBsbm90YWI7CisgICAgICAgIGNvLT5jb196b21iaWVmcmFtZSA9IE5VTEw7CisgICAgfQorICAgIHJldHVybiBjbzsKIH0KIAogCiAjZGVmaW5lIE9GRih4KSBvZmZzZXRvZihQeUNvZGVPYmplY3QsIHgpCiAKIHN0YXRpYyBQeU1lbWJlckRlZiBjb2RlX21lbWJlcmxpc3RbXSA9IHsKLQl7ImNvX2FyZ2NvdW50IiwJVF9JTlQsCQlPRkYoY29fYXJnY291bnQpLAlSRUFET05MWX0sCi0JeyJjb19ubG9jYWxzIiwJVF9JTlQsCQlPRkYoY29fbmxvY2FscyksCVJFQURPTkxZfSwKLQl7ImNvX3N0YWNrc2l6ZSIsVF9JTlQsCQlPRkYoY29fc3RhY2tzaXplKSwJUkVBRE9OTFl9LAotCXsiY29fZmxhZ3MiLAlUX0lOVCwJCU9GRihjb19mbGFncyksCQlSRUFET05MWX0sCi0JeyJjb19jb2RlIiwJVF9PQkpFQ1QsCU9GRihjb19jb2RlKSwJCVJFQURPTkxZfSwKLQl7ImNvX2NvbnN0cyIsCVRfT0JKRUNULAlPRkYoY29fY29uc3RzKSwJCVJFQURPTkxZfSwKLQl7ImNvX25hbWVzIiwJVF9PQkpFQ1QsCU9GRihjb19uYW1lcyksCQlSRUFET05MWX0sCi0JeyJjb192YXJuYW1lcyIsCVRfT0JKRUNULAlPRkYoY29fdmFybmFtZXMpLAlSRUFET05MWX0sCi0JeyJjb19mcmVldmFycyIsCVRfT0JKRUNULAlPRkYoY29fZnJlZXZhcnMpLAlSRUFET05MWX0sCi0JeyJjb19jZWxsdmFycyIsCVRfT0JKRUNULAlPRkYoY29fY2VsbHZhcnMpLAlSRUFET05MWX0sCi0JeyJjb19maWxlbmFtZSIsCVRfT0JKRUNULAlPRkYoY29fZmlsZW5hbWUpLAlSRUFET05MWX0sCi0JeyJjb19uYW1lIiwJVF9PQkpFQ1QsCU9GRihjb19uYW1lKSwJCVJFQURPTkxZfSwKLQl7ImNvX2ZpcnN0bGluZW5vIiwgVF9JTlQsCU9GRihjb19maXJzdGxpbmVubyksCVJFQURPTkxZfSwKLQl7ImNvX2xub3RhYiIsCVRfT0JKRUNULAlPRkYoY29fbG5vdGFiKSwJCVJFQURPTkxZfSwKLQl7TlVMTH0JLyogU2VudGluZWwgKi8KKyAgICB7ImNvX2FyZ2NvdW50IiwgICAgIFRfSU5ULCAgICAgICAgICBPRkYoY29fYXJnY291bnQpLCAgICAgICBSRUFET05MWX0sCisgICAgeyJjb19ubG9jYWxzIiwgICAgICBUX0lOVCwgICAgICAgICAgT0ZGKGNvX25sb2NhbHMpLCAgICAgICAgUkVBRE9OTFl9LAorICAgIHsiY29fc3RhY2tzaXplIixUX0lOVCwgICAgICAgICAgICAgIE9GRihjb19zdGFja3NpemUpLCAgICAgIFJFQURPTkxZfSwKKyAgICB7ImNvX2ZsYWdzIiwgICAgICAgIFRfSU5ULCAgICAgICAgICBPRkYoY29fZmxhZ3MpLCAgICAgICAgICBSRUFET05MWX0sCisgICAgeyJjb19jb2RlIiwgICAgICAgICBUX09CSkVDVCwgICAgICAgT0ZGKGNvX2NvZGUpLCAgICAgICAgICAgUkVBRE9OTFl9LAorICAgIHsiY29fY29uc3RzIiwgICAgICAgVF9PQkpFQ1QsICAgICAgIE9GRihjb19jb25zdHMpLCAgICAgICAgIFJFQURPTkxZfSwKKyAgICB7ImNvX25hbWVzIiwgICAgICAgIFRfT0JKRUNULCAgICAgICBPRkYoY29fbmFtZXMpLCAgICAgICAgICBSRUFET05MWX0sCisgICAgeyJjb192YXJuYW1lcyIsICAgICBUX09CSkVDVCwgICAgICAgT0ZGKGNvX3Zhcm5hbWVzKSwgICAgICAgUkVBRE9OTFl9LAorICAgIHsiY29fZnJlZXZhcnMiLCAgICAgVF9PQkpFQ1QsICAgICAgIE9GRihjb19mcmVldmFycyksICAgICAgIFJFQURPTkxZfSwKKyAgICB7ImNvX2NlbGx2YXJzIiwgICAgIFRfT0JKRUNULCAgICAgICBPRkYoY29fY2VsbHZhcnMpLCAgICAgICBSRUFET05MWX0sCisgICAgeyJjb19maWxlbmFtZSIsICAgICBUX09CSkVDVCwgICAgICAgT0ZGKGNvX2ZpbGVuYW1lKSwgICAgICAgUkVBRE9OTFl9LAorICAgIHsiY29fbmFtZSIsICAgICAgICAgVF9PQkpFQ1QsICAgICAgIE9GRihjb19uYW1lKSwgICAgICAgICAgIFJFQURPTkxZfSwKKyAgICB7ImNvX2ZpcnN0bGluZW5vIiwgVF9JTlQsICAgICAgICAgICBPRkYoY29fZmlyc3RsaW5lbm8pLCAgICBSRUFET05MWX0sCisgICAgeyJjb19sbm90YWIiLCAgICAgICBUX09CSkVDVCwgICAgICAgT0ZGKGNvX2xub3RhYiksICAgICAgICAgUkVBRE9OTFl9LAorICAgIHtOVUxMfSAgICAgIC8qIFNlbnRpbmVsICovCiB9OwogCiAvKiBIZWxwZXIgZm9yIGNvZGVfbmV3OiByZXR1cm4gYSBzaGFsbG93IGNvcHkgb2YgYSB0dXBsZSB0aGF0IGlzCkBAIC0xMzQsNDIgKzEzNCw0MiBAQAogc3RhdGljIFB5T2JqZWN0KgogdmFsaWRhdGVfYW5kX2NvcHlfdHVwbGUoUHlPYmplY3QgKnR1cCkKIHsKLQlQeU9iamVjdCAqbmV3dHVwbGU7Ci0JUHlPYmplY3QgKml0ZW07Ci0JUHlfc3NpemVfdCBpLCBsZW47CisgICAgUHlPYmplY3QgKm5ld3R1cGxlOworICAgIFB5T2JqZWN0ICppdGVtOworICAgIFB5X3NzaXplX3QgaSwgbGVuOwogCi0JbGVuID0gUHlUdXBsZV9HRVRfU0laRSh0dXApOwotCW5ld3R1cGxlID0gUHlUdXBsZV9OZXcobGVuKTsKLQlpZiAobmV3dHVwbGUgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgbGVuID0gUHlUdXBsZV9HRVRfU0laRSh0dXApOworICAgIG5ld3R1cGxlID0gUHlUdXBsZV9OZXcobGVuKTsKKyAgICBpZiAobmV3dHVwbGUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJaXRlbSA9IFB5VHVwbGVfR0VUX0lURU0odHVwLCBpKTsKLQkJaWYgKFB5U3RyaW5nX0NoZWNrRXhhY3QoaXRlbSkpIHsKLQkJCVB5X0lOQ1JFRihpdGVtKTsKLQkJfQotCQllbHNlIGlmICghUHlTdHJpbmdfQ2hlY2soaXRlbSkpIHsKLQkJCVB5RXJyX0Zvcm1hdCgKLQkJCQlQeUV4Y19UeXBlRXJyb3IsCi0JCQkJIm5hbWUgdHVwbGVzIG11c3QgY29udGFpbiBvbmx5ICIKLQkJCQkic3RyaW5ncywgbm90ICclLjUwMHMnIiwKLQkJCQlpdGVtLT5vYl90eXBlLT50cF9uYW1lKTsKLQkJCVB5X0RFQ1JFRihuZXd0dXBsZSk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQllbHNlIHsKLQkJCWl0ZW0gPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgKLQkJCQlQeVN0cmluZ19BU19TVFJJTkcoaXRlbSksCi0JCQkJUHlTdHJpbmdfR0VUX1NJWkUoaXRlbSkpOwotCQkJaWYgKGl0ZW0gPT0gTlVMTCkgewotCQkJCVB5X0RFQ1JFRihuZXd0dXBsZSk7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCX0KLQkJUHlUdXBsZV9TRVRfSVRFTShuZXd0dXBsZSwgaSwgaXRlbSk7Ci0JfQorICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICBpdGVtID0gUHlUdXBsZV9HRVRfSVRFTSh0dXAsIGkpOworICAgICAgICBpZiAoUHlTdHJpbmdfQ2hlY2tFeGFjdChpdGVtKSkgeworICAgICAgICAgICAgUHlfSU5DUkVGKGl0ZW0pOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCFQeVN0cmluZ19DaGVjayhpdGVtKSkgeworICAgICAgICAgICAgUHlFcnJfRm9ybWF0KAorICAgICAgICAgICAgICAgIFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAibmFtZSB0dXBsZXMgbXVzdCBjb250YWluIG9ubHkgIgorICAgICAgICAgICAgICAgICJzdHJpbmdzLCBub3QgJyUuNTAwcyciLAorICAgICAgICAgICAgICAgIGl0ZW0tPm9iX3R5cGUtPnRwX25hbWUpOworICAgICAgICAgICAgUHlfREVDUkVGKG5ld3R1cGxlKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaXRlbSA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKAorICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FTX1NUUklORyhpdGVtKSwKKyAgICAgICAgICAgICAgICBQeVN0cmluZ19HRVRfU0laRShpdGVtKSk7CisgICAgICAgICAgICBpZiAoaXRlbSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKG5ld3R1cGxlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKG5ld3R1cGxlLCBpLCBpdGVtKTsKKyAgICB9CiAKLQlyZXR1cm4gbmV3dHVwbGU7CisgICAgcmV0dXJuIG5ld3R1cGxlOwogfQogCiBQeURvY19TVFJWQVIoY29kZV9kb2MsCkBAIC0xODEsMjg0ICsxODEsMjg0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogY29kZV9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3KQogewotCWludCBhcmdjb3VudDsKLQlpbnQgbmxvY2FsczsKLQlpbnQgc3RhY2tzaXplOwotCWludCBmbGFnczsKLQlQeU9iamVjdCAqY28gPSBOVUxMOwotCVB5T2JqZWN0ICpjb2RlOwotCVB5T2JqZWN0ICpjb25zdHM7Ci0JUHlPYmplY3QgKm5hbWVzLCAqb3VybmFtZXMgPSBOVUxMOwotCVB5T2JqZWN0ICp2YXJuYW1lcywgKm91cnZhcm5hbWVzID0gTlVMTDsKLQlQeU9iamVjdCAqZnJlZXZhcnMgPSBOVUxMLCAqb3VyZnJlZXZhcnMgPSBOVUxMOwotCVB5T2JqZWN0ICpjZWxsdmFycyA9IE5VTEwsICpvdXJjZWxsdmFycyA9IE5VTEw7Ci0JUHlPYmplY3QgKmZpbGVuYW1lOwotCVB5T2JqZWN0ICpuYW1lOwotCWludCBmaXJzdGxpbmVubzsKLQlQeU9iamVjdCAqbG5vdGFiOworICAgIGludCBhcmdjb3VudDsKKyAgICBpbnQgbmxvY2FsczsKKyAgICBpbnQgc3RhY2tzaXplOworICAgIGludCBmbGFnczsKKyAgICBQeU9iamVjdCAqY28gPSBOVUxMOworICAgIFB5T2JqZWN0ICpjb2RlOworICAgIFB5T2JqZWN0ICpjb25zdHM7CisgICAgUHlPYmplY3QgKm5hbWVzLCAqb3VybmFtZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICp2YXJuYW1lcywgKm91cnZhcm5hbWVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqZnJlZXZhcnMgPSBOVUxMLCAqb3VyZnJlZXZhcnMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpjZWxsdmFycyA9IE5VTEwsICpvdXJjZWxsdmFycyA9IE5VTEw7CisgICAgUHlPYmplY3QgKmZpbGVuYW1lOworICAgIFB5T2JqZWN0ICpuYW1lOworICAgIGludCBmaXJzdGxpbmVubzsKKyAgICBQeU9iamVjdCAqbG5vdGFiOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpaWlpU08hTyFPIVNTaVN8TyFPITpjb2RlIiwKLQkJCSAgICAgICZhcmdjb3VudCwgJm5sb2NhbHMsICZzdGFja3NpemUsICZmbGFncywKLQkJCSAgICAgICZjb2RlLAotCQkJICAgICAgJlB5VHVwbGVfVHlwZSwgJmNvbnN0cywKLQkJCSAgICAgICZQeVR1cGxlX1R5cGUsICZuYW1lcywKLQkJCSAgICAgICZQeVR1cGxlX1R5cGUsICZ2YXJuYW1lcywKLQkJCSAgICAgICZmaWxlbmFtZSwgJm5hbWUsCi0JCQkgICAgICAmZmlyc3RsaW5lbm8sICZsbm90YWIsCi0JCQkgICAgICAmUHlUdXBsZV9UeXBlLCAmZnJlZXZhcnMsCi0JCQkgICAgICAmUHlUdXBsZV9UeXBlLCAmY2VsbHZhcnMpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpaWlTTyFPIU8hU1NpU3xPIU8hOmNvZGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYXJnY291bnQsICZubG9jYWxzLCAmc3RhY2tzaXplLCAmZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmUHlUdXBsZV9UeXBlLCAmY29uc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmUHlUdXBsZV9UeXBlLCAmbmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZQeVR1cGxlX1R5cGUsICZ2YXJuYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpbGVuYW1lLCAmbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpcnN0bGluZW5vLCAmbG5vdGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmUHlUdXBsZV9UeXBlLCAmZnJlZXZhcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZQeVR1cGxlX1R5cGUsICZjZWxsdmFycykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKGFyZ2NvdW50IDwgMCkgewotCQlQeUVycl9TZXRTdHJpbmcoCi0JCQlQeUV4Y19WYWx1ZUVycm9yLAotCQkJImNvZGU6IGFyZ2NvdW50IG11c3Qgbm90IGJlIG5lZ2F0aXZlIik7Ci0JCWdvdG8gY2xlYW51cDsKLQl9CisgICAgaWYgKGFyZ2NvdW50IDwgMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoCisgICAgICAgICAgICBQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgImNvZGU6IGFyZ2NvdW50IG11c3Qgbm90IGJlIG5lZ2F0aXZlIik7CisgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICB9CiAKLQlpZiAobmxvY2FscyA8IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKAotCQkJUHlFeGNfVmFsdWVFcnJvciwKLQkJCSJjb2RlOiBubG9jYWxzIG11c3Qgbm90IGJlIG5lZ2F0aXZlIik7Ci0JCWdvdG8gY2xlYW51cDsKLQl9CisgICAgaWYgKG5sb2NhbHMgPCAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZygKKyAgICAgICAgICAgIFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAiY29kZTogbmxvY2FscyBtdXN0IG5vdCBiZSBuZWdhdGl2ZSIpOworICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgfQogCi0Jb3VybmFtZXMgPSB2YWxpZGF0ZV9hbmRfY29weV90dXBsZShuYW1lcyk7Ci0JaWYgKG91cm5hbWVzID09IE5VTEwpCi0JCWdvdG8gY2xlYW51cDsKLQlvdXJ2YXJuYW1lcyA9IHZhbGlkYXRlX2FuZF9jb3B5X3R1cGxlKHZhcm5hbWVzKTsKLQlpZiAob3VydmFybmFtZXMgPT0gTlVMTCkKLQkJZ290byBjbGVhbnVwOwotCWlmIChmcmVldmFycykKLQkJb3VyZnJlZXZhcnMgPSB2YWxpZGF0ZV9hbmRfY29weV90dXBsZShmcmVldmFycyk7Ci0JZWxzZQotCQlvdXJmcmVldmFycyA9IFB5VHVwbGVfTmV3KDApOwotCWlmIChvdXJmcmVldmFycyA9PSBOVUxMKQotCQlnb3RvIGNsZWFudXA7Ci0JaWYgKGNlbGx2YXJzKQotCQlvdXJjZWxsdmFycyA9IHZhbGlkYXRlX2FuZF9jb3B5X3R1cGxlKGNlbGx2YXJzKTsKLQllbHNlCi0JCW91cmNlbGx2YXJzID0gUHlUdXBsZV9OZXcoMCk7Ci0JaWYgKG91cmNlbGx2YXJzID09IE5VTEwpCi0JCWdvdG8gY2xlYW51cDsKKyAgICBvdXJuYW1lcyA9IHZhbGlkYXRlX2FuZF9jb3B5X3R1cGxlKG5hbWVzKTsKKyAgICBpZiAob3VybmFtZXMgPT0gTlVMTCkKKyAgICAgICAgZ290byBjbGVhbnVwOworICAgIG91cnZhcm5hbWVzID0gdmFsaWRhdGVfYW5kX2NvcHlfdHVwbGUodmFybmFtZXMpOworICAgIGlmIChvdXJ2YXJuYW1lcyA9PSBOVUxMKQorICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgaWYgKGZyZWV2YXJzKQorICAgICAgICBvdXJmcmVldmFycyA9IHZhbGlkYXRlX2FuZF9jb3B5X3R1cGxlKGZyZWV2YXJzKTsKKyAgICBlbHNlCisgICAgICAgIG91cmZyZWV2YXJzID0gUHlUdXBsZV9OZXcoMCk7CisgICAgaWYgKG91cmZyZWV2YXJzID09IE5VTEwpCisgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICBpZiAoY2VsbHZhcnMpCisgICAgICAgIG91cmNlbGx2YXJzID0gdmFsaWRhdGVfYW5kX2NvcHlfdHVwbGUoY2VsbHZhcnMpOworICAgIGVsc2UKKyAgICAgICAgb3VyY2VsbHZhcnMgPSBQeVR1cGxlX05ldygwKTsKKyAgICBpZiAob3VyY2VsbHZhcnMgPT0gTlVMTCkKKyAgICAgICAgZ290byBjbGVhbnVwOwogCi0JY28gPSAoUHlPYmplY3QgKilQeUNvZGVfTmV3KGFyZ2NvdW50LCBubG9jYWxzLCBzdGFja3NpemUsIGZsYWdzLAotCQkJCSAgICBjb2RlLCBjb25zdHMsIG91cm5hbWVzLCBvdXJ2YXJuYW1lcywKLQkJCQkgICAgb3VyZnJlZXZhcnMsIG91cmNlbGx2YXJzLCBmaWxlbmFtZSwKLQkJCQkgICAgbmFtZSwgZmlyc3RsaW5lbm8sIGxub3RhYik7CisgICAgY28gPSAoUHlPYmplY3QgKilQeUNvZGVfTmV3KGFyZ2NvdW50LCBubG9jYWxzLCBzdGFja3NpemUsIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlLCBjb25zdHMsIG91cm5hbWVzLCBvdXJ2YXJuYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3VyZnJlZXZhcnMsIG91cmNlbGx2YXJzLCBmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgZmlyc3RsaW5lbm8sIGxub3RhYik7CiAgIGNsZWFudXA6Ci0JUHlfWERFQ1JFRihvdXJuYW1lcyk7Ci0JUHlfWERFQ1JFRihvdXJ2YXJuYW1lcyk7Ci0JUHlfWERFQ1JFRihvdXJmcmVldmFycyk7Ci0JUHlfWERFQ1JFRihvdXJjZWxsdmFycyk7Ci0JcmV0dXJuIGNvOworICAgIFB5X1hERUNSRUYob3VybmFtZXMpOworICAgIFB5X1hERUNSRUYob3VydmFybmFtZXMpOworICAgIFB5X1hERUNSRUYob3VyZnJlZXZhcnMpOworICAgIFB5X1hERUNSRUYob3VyY2VsbHZhcnMpOworICAgIHJldHVybiBjbzsKIH0KIAogc3RhdGljIHZvaWQKIGNvZGVfZGVhbGxvYyhQeUNvZGVPYmplY3QgKmNvKQogewotCVB5X1hERUNSRUYoY28tPmNvX2NvZGUpOwotCVB5X1hERUNSRUYoY28tPmNvX2NvbnN0cyk7Ci0JUHlfWERFQ1JFRihjby0+Y29fbmFtZXMpOwotCVB5X1hERUNSRUYoY28tPmNvX3Zhcm5hbWVzKTsKLQlQeV9YREVDUkVGKGNvLT5jb19mcmVldmFycyk7Ci0JUHlfWERFQ1JFRihjby0+Y29fY2VsbHZhcnMpOwotCVB5X1hERUNSRUYoY28tPmNvX2ZpbGVuYW1lKTsKLQlQeV9YREVDUkVGKGNvLT5jb19uYW1lKTsKLQlQeV9YREVDUkVGKGNvLT5jb19sbm90YWIpOwotICAgICAgICBpZiAoY28tPmNvX3pvbWJpZWZyYW1lICE9IE5VTEwpCi0gICAgICAgICAgICAgICAgUHlPYmplY3RfR0NfRGVsKGNvLT5jb196b21iaWVmcmFtZSk7Ci0JUHlPYmplY3RfREVMKGNvKTsKKyAgICBQeV9YREVDUkVGKGNvLT5jb19jb2RlKTsKKyAgICBQeV9YREVDUkVGKGNvLT5jb19jb25zdHMpOworICAgIFB5X1hERUNSRUYoY28tPmNvX25hbWVzKTsKKyAgICBQeV9YREVDUkVGKGNvLT5jb192YXJuYW1lcyk7CisgICAgUHlfWERFQ1JFRihjby0+Y29fZnJlZXZhcnMpOworICAgIFB5X1hERUNSRUYoY28tPmNvX2NlbGx2YXJzKTsKKyAgICBQeV9YREVDUkVGKGNvLT5jb19maWxlbmFtZSk7CisgICAgUHlfWERFQ1JFRihjby0+Y29fbmFtZSk7CisgICAgUHlfWERFQ1JFRihjby0+Y29fbG5vdGFiKTsKKyAgICBpZiAoY28tPmNvX3pvbWJpZWZyYW1lICE9IE5VTEwpCisgICAgICAgIFB5T2JqZWN0X0dDX0RlbChjby0+Y29fem9tYmllZnJhbWUpOworICAgIFB5T2JqZWN0X0RFTChjbyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjb2RlX3JlcHIoUHlDb2RlT2JqZWN0ICpjbykKIHsKLQljaGFyIGJ1Zls1MDBdOwotCWludCBsaW5lbm8gPSAtMTsKLQljaGFyICpmaWxlbmFtZSA9ICI/Pz8iOwotCWNoYXIgKm5hbWUgPSAiPz8/IjsKKyAgICBjaGFyIGJ1Zls1MDBdOworICAgIGludCBsaW5lbm8gPSAtMTsKKyAgICBjaGFyICpmaWxlbmFtZSA9ICI/Pz8iOworICAgIGNoYXIgKm5hbWUgPSAiPz8/IjsKIAotCWlmIChjby0+Y29fZmlyc3RsaW5lbm8gIT0gMCkKLQkJbGluZW5vID0gY28tPmNvX2ZpcnN0bGluZW5vOwotCWlmIChjby0+Y29fZmlsZW5hbWUgJiYgUHlTdHJpbmdfQ2hlY2soY28tPmNvX2ZpbGVuYW1lKSkKLQkJZmlsZW5hbWUgPSBQeVN0cmluZ19BU19TVFJJTkcoY28tPmNvX2ZpbGVuYW1lKTsKLQlpZiAoY28tPmNvX25hbWUgJiYgUHlTdHJpbmdfQ2hlY2soY28tPmNvX25hbWUpKQotCQluYW1lID0gUHlTdHJpbmdfQVNfU1RSSU5HKGNvLT5jb19uYW1lKTsKLQlQeU9TX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksCi0JCSAgICAgICI8Y29kZSBvYmplY3QgJS4xMDBzIGF0ICVwLCBmaWxlIFwiJS4zMDBzXCIsIGxpbmUgJWQ+IiwKLQkJICAgICAgbmFtZSwgY28sIGZpbGVuYW1lLCBsaW5lbm8pOwotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CisgICAgaWYgKGNvLT5jb19maXJzdGxpbmVubyAhPSAwKQorICAgICAgICBsaW5lbm8gPSBjby0+Y29fZmlyc3RsaW5lbm87CisgICAgaWYgKGNvLT5jb19maWxlbmFtZSAmJiBQeVN0cmluZ19DaGVjayhjby0+Y29fZmlsZW5hbWUpKQorICAgICAgICBmaWxlbmFtZSA9IFB5U3RyaW5nX0FTX1NUUklORyhjby0+Y29fZmlsZW5hbWUpOworICAgIGlmIChjby0+Y29fbmFtZSAmJiBQeVN0cmluZ19DaGVjayhjby0+Y29fbmFtZSkpCisgICAgICAgIG5hbWUgPSBQeVN0cmluZ19BU19TVFJJTkcoY28tPmNvX25hbWUpOworICAgIFB5T1Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwKKyAgICAgICAgICAgICAgICAgICI8Y29kZSBvYmplY3QgJS4xMDBzIGF0ICVwLCBmaWxlIFwiJS4zMDBzXCIsIGxpbmUgJWQ+IiwKKyAgICAgICAgICAgICAgICAgIG5hbWUsIGNvLCBmaWxlbmFtZSwgbGluZW5vKTsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOwogfQogCiBzdGF0aWMgaW50CiBjb2RlX2NvbXBhcmUoUHlDb2RlT2JqZWN0ICpjbywgUHlDb2RlT2JqZWN0ICpjcCkKIHsKLQlpbnQgY21wOwotCWNtcCA9IFB5T2JqZWN0X0NvbXBhcmUoY28tPmNvX25hbWUsIGNwLT5jb19uYW1lKTsKLQlpZiAoY21wKSByZXR1cm4gY21wOwotCWNtcCA9IGNvLT5jb19hcmdjb3VudCAtIGNwLT5jb19hcmdjb3VudDsKLQlpZiAoY21wKSBnb3RvIG5vcm1hbGl6ZTsKLQljbXAgPSBjby0+Y29fbmxvY2FscyAtIGNwLT5jb19ubG9jYWxzOwotCWlmIChjbXApIGdvdG8gbm9ybWFsaXplOwotCWNtcCA9IGNvLT5jb19mbGFncyAtIGNwLT5jb19mbGFnczsKLQlpZiAoY21wKSBnb3RvIG5vcm1hbGl6ZTsKLQljbXAgPSBjby0+Y29fZmlyc3RsaW5lbm8gLSBjcC0+Y29fZmlyc3RsaW5lbm87Ci0JaWYgKGNtcCkgZ290byBub3JtYWxpemU7Ci0JY21wID0gUHlPYmplY3RfQ29tcGFyZShjby0+Y29fY29kZSwgY3AtPmNvX2NvZGUpOwotCWlmIChjbXApIHJldHVybiBjbXA7Ci0JY21wID0gUHlPYmplY3RfQ29tcGFyZShjby0+Y29fY29uc3RzLCBjcC0+Y29fY29uc3RzKTsKLQlpZiAoY21wKSByZXR1cm4gY21wOwotCWNtcCA9IFB5T2JqZWN0X0NvbXBhcmUoY28tPmNvX25hbWVzLCBjcC0+Y29fbmFtZXMpOwotCWlmIChjbXApIHJldHVybiBjbXA7Ci0JY21wID0gUHlPYmplY3RfQ29tcGFyZShjby0+Y29fdmFybmFtZXMsIGNwLT5jb192YXJuYW1lcyk7Ci0JaWYgKGNtcCkgcmV0dXJuIGNtcDsKLQljbXAgPSBQeU9iamVjdF9Db21wYXJlKGNvLT5jb19mcmVldmFycywgY3AtPmNvX2ZyZWV2YXJzKTsKLQlpZiAoY21wKSByZXR1cm4gY21wOwotCWNtcCA9IFB5T2JqZWN0X0NvbXBhcmUoY28tPmNvX2NlbGx2YXJzLCBjcC0+Y29fY2VsbHZhcnMpOwotCXJldHVybiBjbXA7CisgICAgaW50IGNtcDsKKyAgICBjbXAgPSBQeU9iamVjdF9Db21wYXJlKGNvLT5jb19uYW1lLCBjcC0+Y29fbmFtZSk7CisgICAgaWYgKGNtcCkgcmV0dXJuIGNtcDsKKyAgICBjbXAgPSBjby0+Y29fYXJnY291bnQgLSBjcC0+Y29fYXJnY291bnQ7CisgICAgaWYgKGNtcCkgZ290byBub3JtYWxpemU7CisgICAgY21wID0gY28tPmNvX25sb2NhbHMgLSBjcC0+Y29fbmxvY2FsczsKKyAgICBpZiAoY21wKSBnb3RvIG5vcm1hbGl6ZTsKKyAgICBjbXAgPSBjby0+Y29fZmxhZ3MgLSBjcC0+Y29fZmxhZ3M7CisgICAgaWYgKGNtcCkgZ290byBub3JtYWxpemU7CisgICAgY21wID0gY28tPmNvX2ZpcnN0bGluZW5vIC0gY3AtPmNvX2ZpcnN0bGluZW5vOworICAgIGlmIChjbXApIGdvdG8gbm9ybWFsaXplOworICAgIGNtcCA9IFB5T2JqZWN0X0NvbXBhcmUoY28tPmNvX2NvZGUsIGNwLT5jb19jb2RlKTsKKyAgICBpZiAoY21wKSByZXR1cm4gY21wOworICAgIGNtcCA9IFB5T2JqZWN0X0NvbXBhcmUoY28tPmNvX2NvbnN0cywgY3AtPmNvX2NvbnN0cyk7CisgICAgaWYgKGNtcCkgcmV0dXJuIGNtcDsKKyAgICBjbXAgPSBQeU9iamVjdF9Db21wYXJlKGNvLT5jb19uYW1lcywgY3AtPmNvX25hbWVzKTsKKyAgICBpZiAoY21wKSByZXR1cm4gY21wOworICAgIGNtcCA9IFB5T2JqZWN0X0NvbXBhcmUoY28tPmNvX3Zhcm5hbWVzLCBjcC0+Y29fdmFybmFtZXMpOworICAgIGlmIChjbXApIHJldHVybiBjbXA7CisgICAgY21wID0gUHlPYmplY3RfQ29tcGFyZShjby0+Y29fZnJlZXZhcnMsIGNwLT5jb19mcmVldmFycyk7CisgICAgaWYgKGNtcCkgcmV0dXJuIGNtcDsKKyAgICBjbXAgPSBQeU9iamVjdF9Db21wYXJlKGNvLT5jb19jZWxsdmFycywgY3AtPmNvX2NlbGx2YXJzKTsKKyAgICByZXR1cm4gY21wOwogCiAgbm9ybWFsaXplOgotCWlmIChjbXAgPiAwKQotCQlyZXR1cm4gMTsKLQllbHNlIGlmIChjbXAgPCAwKQotCQlyZXR1cm4gLTE7Ci0JZWxzZQotCQlyZXR1cm4gMDsKKyAgICBpZiAoY21wID4gMCkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgZWxzZSBpZiAoY21wIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjb2RlX3JpY2hjb21wYXJlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqb3RoZXIsIGludCBvcCkKIHsKLQlQeUNvZGVPYmplY3QgKmNvLCAqY3A7Ci0JaW50IGVxOwotCVB5T2JqZWN0ICpyZXM7CisgICAgUHlDb2RlT2JqZWN0ICpjbywgKmNwOworICAgIGludCBlcTsKKyAgICBQeU9iamVjdCAqcmVzOwogCi0JaWYgKChvcCAhPSBQeV9FUSAmJiBvcCAhPSBQeV9ORSkgfHwKLQkgICAgIVB5Q29kZV9DaGVjayhzZWxmKSB8fAotCSAgICAhUHlDb2RlX0NoZWNrKG90aGVyKSkgeworICAgIGlmICgob3AgIT0gUHlfRVEgJiYgb3AgIT0gUHlfTkUpIHx8CisgICAgICAgICFQeUNvZGVfQ2hlY2soc2VsZikgfHwKKyAgICAgICAgIVB5Q29kZV9DaGVjayhvdGhlcikpIHsKIAotCQkvKiBQeTNLIHdhcm5pbmcgaWYgdHlwZXMgYXJlIG5vdCBlcXVhbCBhbmQgY29tcGFyaXNvbgotCQlpc24ndCA9PSBvciAhPSAgKi8KLQkJaWYgKFB5RXJyX1dhcm5QeTNrKCJjb2RlIGluZXF1YWxpdHkgY29tcGFyaXNvbnMgbm90IHN1cHBvcnRlZCAiCi0JCQkJICAgImluIDMueCIsIDEpIDwgMCkgewotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KKyAgICAgICAgLyogUHkzSyB3YXJuaW5nIGlmIHR5cGVzIGFyZSBub3QgZXF1YWwgYW5kIGNvbXBhcmlzb24KKyAgICAgICAgaXNuJ3QgPT0gb3IgIT0gICovCisgICAgICAgIGlmIChQeUVycl9XYXJuUHkzaygiY29kZSBpbmVxdWFsaXR5IGNvbXBhcmlzb25zIG5vdCBzdXBwb3J0ZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgImluIDMueCIsIDEpIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KIAotCQlQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOwotCQlyZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7Ci0JfQorICAgICAgICBQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOworICAgICAgICByZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7CisgICAgfQogCi0JY28gPSAoUHlDb2RlT2JqZWN0ICopc2VsZjsKLQljcCA9IChQeUNvZGVPYmplY3QgKilvdGhlcjsKKyAgICBjbyA9IChQeUNvZGVPYmplY3QgKilzZWxmOworICAgIGNwID0gKFB5Q29kZU9iamVjdCAqKW90aGVyOwogCi0JZXEgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woY28tPmNvX25hbWUsIGNwLT5jb19uYW1lLCBQeV9FUSk7Ci0JaWYgKGVxIDw9IDApIGdvdG8gdW5lcXVhbDsKLQllcSA9IGNvLT5jb19hcmdjb3VudCA9PSBjcC0+Y29fYXJnY291bnQ7Ci0JaWYgKCFlcSkgZ290byB1bmVxdWFsOwotCWVxID0gY28tPmNvX25sb2NhbHMgPT0gY3AtPmNvX25sb2NhbHM7Ci0JaWYgKCFlcSkgZ290byB1bmVxdWFsOwotCWVxID0gY28tPmNvX2ZsYWdzID09IGNwLT5jb19mbGFnczsKLQlpZiAoIWVxKSBnb3RvIHVuZXF1YWw7Ci0JZXEgPSBjby0+Y29fZmlyc3RsaW5lbm8gPT0gY3AtPmNvX2ZpcnN0bGluZW5vOwotCWlmICghZXEpIGdvdG8gdW5lcXVhbDsKLQllcSA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChjby0+Y29fY29kZSwgY3AtPmNvX2NvZGUsIFB5X0VRKTsKLQlpZiAoZXEgPD0gMCkgZ290byB1bmVxdWFsOwotCWVxID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKGNvLT5jb19jb25zdHMsIGNwLT5jb19jb25zdHMsIFB5X0VRKTsKLQlpZiAoZXEgPD0gMCkgZ290byB1bmVxdWFsOwotCWVxID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKGNvLT5jb19uYW1lcywgY3AtPmNvX25hbWVzLCBQeV9FUSk7Ci0JaWYgKGVxIDw9IDApIGdvdG8gdW5lcXVhbDsKLQllcSA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChjby0+Y29fdmFybmFtZXMsIGNwLT5jb192YXJuYW1lcywgUHlfRVEpOwotCWlmIChlcSA8PSAwKSBnb3RvIHVuZXF1YWw7Ci0JZXEgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woY28tPmNvX2ZyZWV2YXJzLCBjcC0+Y29fZnJlZXZhcnMsIFB5X0VRKTsKLQlpZiAoZXEgPD0gMCkgZ290byB1bmVxdWFsOwotCWVxID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKGNvLT5jb19jZWxsdmFycywgY3AtPmNvX2NlbGx2YXJzLCBQeV9FUSk7Ci0JaWYgKGVxIDw9IDApIGdvdG8gdW5lcXVhbDsKKyAgICBlcSA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChjby0+Y29fbmFtZSwgY3AtPmNvX25hbWUsIFB5X0VRKTsKKyAgICBpZiAoZXEgPD0gMCkgZ290byB1bmVxdWFsOworICAgIGVxID0gY28tPmNvX2FyZ2NvdW50ID09IGNwLT5jb19hcmdjb3VudDsKKyAgICBpZiAoIWVxKSBnb3RvIHVuZXF1YWw7CisgICAgZXEgPSBjby0+Y29fbmxvY2FscyA9PSBjcC0+Y29fbmxvY2FsczsKKyAgICBpZiAoIWVxKSBnb3RvIHVuZXF1YWw7CisgICAgZXEgPSBjby0+Y29fZmxhZ3MgPT0gY3AtPmNvX2ZsYWdzOworICAgIGlmICghZXEpIGdvdG8gdW5lcXVhbDsKKyAgICBlcSA9IGNvLT5jb19maXJzdGxpbmVubyA9PSBjcC0+Y29fZmlyc3RsaW5lbm87CisgICAgaWYgKCFlcSkgZ290byB1bmVxdWFsOworICAgIGVxID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKGNvLT5jb19jb2RlLCBjcC0+Y29fY29kZSwgUHlfRVEpOworICAgIGlmIChlcSA8PSAwKSBnb3RvIHVuZXF1YWw7CisgICAgZXEgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woY28tPmNvX2NvbnN0cywgY3AtPmNvX2NvbnN0cywgUHlfRVEpOworICAgIGlmIChlcSA8PSAwKSBnb3RvIHVuZXF1YWw7CisgICAgZXEgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woY28tPmNvX25hbWVzLCBjcC0+Y29fbmFtZXMsIFB5X0VRKTsKKyAgICBpZiAoZXEgPD0gMCkgZ290byB1bmVxdWFsOworICAgIGVxID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKGNvLT5jb192YXJuYW1lcywgY3AtPmNvX3Zhcm5hbWVzLCBQeV9FUSk7CisgICAgaWYgKGVxIDw9IDApIGdvdG8gdW5lcXVhbDsKKyAgICBlcSA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChjby0+Y29fZnJlZXZhcnMsIGNwLT5jb19mcmVldmFycywgUHlfRVEpOworICAgIGlmIChlcSA8PSAwKSBnb3RvIHVuZXF1YWw7CisgICAgZXEgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woY28tPmNvX2NlbGx2YXJzLCBjcC0+Y29fY2VsbHZhcnMsIFB5X0VRKTsKKyAgICBpZiAoZXEgPD0gMCkgZ290byB1bmVxdWFsOwogCi0JaWYgKG9wID09IFB5X0VRKQotCQlyZXMgPSBQeV9UcnVlOwotCWVsc2UKLQkJcmVzID0gUHlfRmFsc2U7Ci0JZ290byBkb25lOworICAgIGlmIChvcCA9PSBQeV9FUSkKKyAgICAgICAgcmVzID0gUHlfVHJ1ZTsKKyAgICBlbHNlCisgICAgICAgIHJlcyA9IFB5X0ZhbHNlOworICAgIGdvdG8gZG9uZTsKIAogICB1bmVxdWFsOgotCWlmIChlcSA8IDApCi0JCXJldHVybiBOVUxMOwotCWlmIChvcCA9PSBQeV9ORSkKLQkJcmVzID0gUHlfVHJ1ZTsKLQllbHNlCi0JCXJlcyA9IFB5X0ZhbHNlOworICAgIGlmIChlcSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChvcCA9PSBQeV9ORSkKKyAgICAgICAgcmVzID0gUHlfVHJ1ZTsKKyAgICBlbHNlCisgICAgICAgIHJlcyA9IFB5X0ZhbHNlOwogCiAgIGRvbmU6Ci0JUHlfSU5DUkVGKHJlcyk7Ci0JcmV0dXJuIHJlczsKKyAgICBQeV9JTkNSRUYocmVzKTsKKyAgICByZXR1cm4gcmVzOwogfQogCiBzdGF0aWMgbG9uZwogY29kZV9oYXNoKFB5Q29kZU9iamVjdCAqY28pCiB7Ci0JbG9uZyBoLCBoMCwgaDEsIGgyLCBoMywgaDQsIGg1LCBoNjsKLQloMCA9IFB5T2JqZWN0X0hhc2goY28tPmNvX25hbWUpOwotCWlmIChoMCA9PSAtMSkgcmV0dXJuIC0xOwotCWgxID0gUHlPYmplY3RfSGFzaChjby0+Y29fY29kZSk7Ci0JaWYgKGgxID09IC0xKSByZXR1cm4gLTE7Ci0JaDIgPSBQeU9iamVjdF9IYXNoKGNvLT5jb19jb25zdHMpOwotCWlmIChoMiA9PSAtMSkgcmV0dXJuIC0xOwotCWgzID0gUHlPYmplY3RfSGFzaChjby0+Y29fbmFtZXMpOwotCWlmIChoMyA9PSAtMSkgcmV0dXJuIC0xOwotCWg0ID0gUHlPYmplY3RfSGFzaChjby0+Y29fdmFybmFtZXMpOwotCWlmIChoNCA9PSAtMSkgcmV0dXJuIC0xOwotCWg1ID0gUHlPYmplY3RfSGFzaChjby0+Y29fZnJlZXZhcnMpOwotCWlmIChoNSA9PSAtMSkgcmV0dXJuIC0xOwotCWg2ID0gUHlPYmplY3RfSGFzaChjby0+Y29fY2VsbHZhcnMpOwotCWlmIChoNiA9PSAtMSkgcmV0dXJuIC0xOwotCWggPSBoMCBeIGgxIF4gaDIgXiBoMyBeIGg0IF4gaDUgXiBoNiBeCi0JCWNvLT5jb19hcmdjb3VudCBeIGNvLT5jb19ubG9jYWxzIF4gY28tPmNvX2ZsYWdzOwotCWlmIChoID09IC0xKSBoID0gLTI7Ci0JcmV0dXJuIGg7CisgICAgbG9uZyBoLCBoMCwgaDEsIGgyLCBoMywgaDQsIGg1LCBoNjsKKyAgICBoMCA9IFB5T2JqZWN0X0hhc2goY28tPmNvX25hbWUpOworICAgIGlmIChoMCA9PSAtMSkgcmV0dXJuIC0xOworICAgIGgxID0gUHlPYmplY3RfSGFzaChjby0+Y29fY29kZSk7CisgICAgaWYgKGgxID09IC0xKSByZXR1cm4gLTE7CisgICAgaDIgPSBQeU9iamVjdF9IYXNoKGNvLT5jb19jb25zdHMpOworICAgIGlmIChoMiA9PSAtMSkgcmV0dXJuIC0xOworICAgIGgzID0gUHlPYmplY3RfSGFzaChjby0+Y29fbmFtZXMpOworICAgIGlmIChoMyA9PSAtMSkgcmV0dXJuIC0xOworICAgIGg0ID0gUHlPYmplY3RfSGFzaChjby0+Y29fdmFybmFtZXMpOworICAgIGlmIChoNCA9PSAtMSkgcmV0dXJuIC0xOworICAgIGg1ID0gUHlPYmplY3RfSGFzaChjby0+Y29fZnJlZXZhcnMpOworICAgIGlmIChoNSA9PSAtMSkgcmV0dXJuIC0xOworICAgIGg2ID0gUHlPYmplY3RfSGFzaChjby0+Y29fY2VsbHZhcnMpOworICAgIGlmIChoNiA9PSAtMSkgcmV0dXJuIC0xOworICAgIGggPSBoMCBeIGgxIF4gaDIgXiBoMyBeIGg0IF4gaDUgXiBoNiBeCisgICAgICAgIGNvLT5jb19hcmdjb3VudCBeIGNvLT5jb19ubG9jYWxzIF4gY28tPmNvX2ZsYWdzOworICAgIGlmIChoID09IC0xKSBoID0gLTI7CisgICAgcmV0dXJuIGg7CiB9CiAKIC8qIFhYWCBjb2RlIG9iamVjdHMgbmVlZCB0byBwYXJ0aWNpcGF0ZSBpbiBHQz8gKi8KIAogUHlUeXBlT2JqZWN0IFB5Q29kZV9UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCi0JImNvZGUiLAotCXNpemVvZihQeUNvZGVPYmplY3QpLAotCTAsCi0JKGRlc3RydWN0b3IpY29kZV9kZWFsbG9jLCAJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCS8qIHRwX3ByaW50ICovCi0JMCwgCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkvKiB0cF9zZXRhdHRyICovCi0JKGNtcGZ1bmMpY29kZV9jb21wYXJlLCAJCS8qIHRwX2NvbXBhcmUgKi8KLQkocmVwcmZ1bmMpY29kZV9yZXByLAkJLyogdHBfcmVwciAqLwotCTAsCQkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYyljb2RlX2hhc2gsIAkJLyogdHBfaGFzaCAqLwotCTAsCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkvKiB0cF9zdHIgKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCwJCS8qIHRwX2ZsYWdzICovCi0JY29kZV9kb2MsCQkJLyogdHBfZG9jICovCi0JMCwJCQkJLyogdHBfdHJhdmVyc2UgKi8KLQkwLAkJCQkvKiB0cF9jbGVhciAqLwotCWNvZGVfcmljaGNvbXBhcmUsCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQkwLAkJCQkvKiB0cF9pdGVyICovCi0JMCwJCQkJLyogdHBfaXRlcm5leHQgKi8KLQkwLAkJCQkvKiB0cF9tZXRob2RzICovCi0JY29kZV9tZW1iZXJsaXN0LAkJLyogdHBfbWVtYmVycyAqLwotCTAsCQkJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkvKiB0cF9kaWN0ICovCi0JMCwJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJCQkJLyogdHBfZGljdG9mZnNldCAqLwotCTAsCQkJCS8qIHRwX2luaXQgKi8KLQkwLAkJCQkvKiB0cF9hbGxvYyAqLwotCWNvZGVfbmV3LAkJCS8qIHRwX25ldyAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCisgICAgImNvZGUiLAorICAgIHNpemVvZihQeUNvZGVPYmplY3QpLAorICAgIDAsCisgICAgKGRlc3RydWN0b3IpY29kZV9kZWFsbG9jLCAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAoY21wZnVuYyljb2RlX2NvbXBhcmUsICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgKHJlcHJmdW5jKWNvZGVfcmVwciwgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIChoYXNoZnVuYyljb2RlX2hhc2gsICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCwgICAgICAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCisgICAgY29kZV9kb2MsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIGNvZGVfcmljaGNvbXBhcmUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIGNvZGVfbWVtYmVybGlzdCwgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBjb2RlX25ldywgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KIH07CiAKIC8qIEFsbCBhYm91dCBjX2xub3RhYi4KQEAgLTQ3MSw5ICs0NzEsOSBAQAogcGFpcnMuICBUaGUgZGV0YWlscyBhcmUgaW1wb3J0YW50IGFuZCBkZWxpY2F0ZSwgYmVzdCBpbGx1c3RyYXRlZCBieSBleGFtcGxlOgogCiAgICAgYnl0ZSBjb2RlIG9mZnNldCAgICBzb3VyY2UgY29kZSBsaW5lIG51bWJlcgotICAgICAgICAwCQkgICAgMQotICAgICAgICA2CQkgICAgMgotICAgICAgIDUwCQkgICAgNworICAgIDAgICAgICAgICAgICAgICAgICAgICAgIDEKKyAgICA2ICAgICAgICAgICAgICAgICAgICAgICAyCisgICAgICAgNTAgICAgICAgICAgICAgICAgICAgNwogICAgICAgMzUwICAgICAgICAgICAgICAgICAzMDcKICAgICAgIDM2MSAgICAgICAgICAgICAgICAgMzA4CiAKQEAgLTQ5MywxMCArNDkzLDEwIEBACiAKICAgICBsaW5lbm8gPSBhZGRyID0gMAogICAgIGZvciBhZGRyX2luY3IsIGxpbmVfaW5jciBpbiBjX2xub3RhYjoKLSAgICAgICAgYWRkciArPSBhZGRyX2luY3IKLSAgICAgICAgaWYgYWRkciA+IEE6Ci0gICAgICAgICAgICByZXR1cm4gbGluZW5vCi0gICAgICAgIGxpbmVubyArPSBsaW5lX2luY3IKKyAgICBhZGRyICs9IGFkZHJfaW5jcgorICAgIGlmIGFkZHIgPiBBOgorICAgICAgICByZXR1cm4gbGluZW5vCisgICAgbGluZW5vICs9IGxpbmVfaW5jcgogCiBJbiBvcmRlciBmb3IgdGhpcyB0byB3b3JrLCB3aGVuIHRoZSBhZGRyIGZpZWxkIGluY3JlbWVudHMgYnkgbW9yZSB0aGFuIDI1NSwKIHRoZSBsaW5lICMgaW5jcmVtZW50IGluIGVhY2ggcGFpciBnZW5lcmF0ZWQgbXVzdCBiZSAwIHVudGlsIHRoZSByZW1haW5pbmcgYWRkcgpAQCAtNTA4LDE0OSArNTA4LDE0OSBAQAogaW50CiBQeUNvZGVfQWRkcjJMaW5lKFB5Q29kZU9iamVjdCAqY28sIGludCBhZGRycSkKIHsKLQlpbnQgc2l6ZSA9IFB5U3RyaW5nX1NpemUoY28tPmNvX2xub3RhYikgLyAyOwotCXVuc2lnbmVkIGNoYXIgKnAgPSAodW5zaWduZWQgY2hhciopUHlTdHJpbmdfQXNTdHJpbmcoY28tPmNvX2xub3RhYik7Ci0JaW50IGxpbmUgPSBjby0+Y29fZmlyc3RsaW5lbm87Ci0JaW50IGFkZHIgPSAwOwotCXdoaWxlICgtLXNpemUgPj0gMCkgewotCQlhZGRyICs9ICpwKys7Ci0JCWlmIChhZGRyID4gYWRkcnEpCi0JCQlicmVhazsKLQkJbGluZSArPSAqcCsrOwotCX0KLQlyZXR1cm4gbGluZTsKKyAgICBpbnQgc2l6ZSA9IFB5U3RyaW5nX1NpemUoY28tPmNvX2xub3RhYikgLyAyOworICAgIHVuc2lnbmVkIGNoYXIgKnAgPSAodW5zaWduZWQgY2hhciopUHlTdHJpbmdfQXNTdHJpbmcoY28tPmNvX2xub3RhYik7CisgICAgaW50IGxpbmUgPSBjby0+Y29fZmlyc3RsaW5lbm87CisgICAgaW50IGFkZHIgPSAwOworICAgIHdoaWxlICgtLXNpemUgPj0gMCkgeworICAgICAgICBhZGRyICs9ICpwKys7CisgICAgICAgIGlmIChhZGRyID4gYWRkcnEpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgbGluZSArPSAqcCsrOworICAgIH0KKyAgICByZXR1cm4gbGluZTsKIH0KIAotLyogCisvKgogICAgQ2hlY2sgd2hldGhlciB0aGUgY3VycmVudCBpbnN0cnVjdGlvbiBpcyBhdCB0aGUgc3RhcnQgb2YgYSBsaW5lLgogCiAgKi8KIAotCS8qIFRoZSB0aGVvcnkgb2YgU0VUX0xJTkVOTy1sZXNzIHRyYWNpbmcuCisgICAgLyogVGhlIHRoZW9yeSBvZiBTRVRfTElORU5PLWxlc3MgdHJhY2luZy4KIAotCSAgIEluIGEgbnV0c2hlbGwsIHdlIHVzZSB0aGUgY29fbG5vdGFiIGZpZWxkIG9mIHRoZSBjb2RlIG9iamVjdAotCSAgIHRvIHRlbGwgd2hlbiBleGVjdXRpb24gaGFzIG1vdmVkIG9udG8gYSBkaWZmZXJlbnQgbGluZS4KKyAgICAgICBJbiBhIG51dHNoZWxsLCB3ZSB1c2UgdGhlIGNvX2xub3RhYiBmaWVsZCBvZiB0aGUgY29kZSBvYmplY3QKKyAgICAgICB0byB0ZWxsIHdoZW4gZXhlY3V0aW9uIGhhcyBtb3ZlZCBvbnRvIGEgZGlmZmVyZW50IGxpbmUuCiAKLQkgICBBcyBtZW50aW9uZWQgYWJvdmUsIHRoZSBiYXNpYyBpZGVhIGlzIHNvIHNldCB0aGluZ3MgdXAgc28KLQkgICB0aGF0CisgICAgICAgQXMgbWVudGlvbmVkIGFib3ZlLCB0aGUgYmFzaWMgaWRlYSBpcyBzbyBzZXQgdGhpbmdzIHVwIHNvCisgICAgICAgdGhhdAogCi0JICAgICAgICAgKmluc3RyX2xiIDw9IGZyYW1lLT5mX2xhc3RpIDwgKmluc3RyX3ViCisgICAgICAgICAqaW5zdHJfbGIgPD0gZnJhbWUtPmZfbGFzdGkgPCAqaW5zdHJfdWIKIAotCSAgIGlzIHRydWUgc28gbG9uZyBhcyBleGVjdXRpb24gZG9lcyBub3QgY2hhbmdlIGxpbmVzLgorICAgICAgIGlzIHRydWUgc28gbG9uZyBhcyBleGVjdXRpb24gZG9lcyBub3QgY2hhbmdlIGxpbmVzLgogCi0JICAgVGhpcyBpcyBhbGwgZmFpcmx5IHNpbXBsZS4gIERpZ2dpbmcgdGhlIGluZm9ybWF0aW9uIG91dCBvZgotCSAgIGNvX2xub3RhYiB0YWtlcyBzb21lIHdvcmssIGJ1dCBpcyBjb25jZXB0dWFsbHkgY2xlYXIuCisgICAgICAgVGhpcyBpcyBhbGwgZmFpcmx5IHNpbXBsZS4gIERpZ2dpbmcgdGhlIGluZm9ybWF0aW9uIG91dCBvZgorICAgICAgIGNvX2xub3RhYiB0YWtlcyBzb21lIHdvcmssIGJ1dCBpcyBjb25jZXB0dWFsbHkgY2xlYXIuCiAKLQkgICBTb21ld2hhdCBoYXJkZXIgdG8gZXhwbGFpbiBpcyB3aHkgd2UgZG9uJ3QgKmFsd2F5cyogY2FsbCB0aGUKLQkgICBsaW5lIHRyYWNlIGZ1bmN0aW9uIHdoZW4gdGhlIGFib3ZlIHRlc3QgZmFpbHMuCisgICAgICAgU29tZXdoYXQgaGFyZGVyIHRvIGV4cGxhaW4gaXMgd2h5IHdlIGRvbid0ICphbHdheXMqIGNhbGwgdGhlCisgICAgICAgbGluZSB0cmFjZSBmdW5jdGlvbiB3aGVuIHRoZSBhYm92ZSB0ZXN0IGZhaWxzLgogCi0JICAgQ29uc2lkZXIgdGhpcyBjb2RlOgorICAgICAgIENvbnNpZGVyIHRoaXMgY29kZToKIAotCSAgIDE6IGRlZiBmKGEpOgotCSAgIDI6ICAgICBpZiBhOgotCSAgIDM6ICAgICAgICBwcmludCAxCi0JICAgNDogICAgIGVsc2U6Ci0JICAgNTogICAgICAgIHByaW50IDIKKyAgICAgICAxOiBkZWYgZihhKToKKyAgICAgICAyOiAgICAgaWYgYToKKyAgICAgICAzOiAgICAgICAgcHJpbnQgMQorICAgICAgIDQ6ICAgICBlbHNlOgorICAgICAgIDU6ICAgICAgICBwcmludCAyCiAKLQkgICB3aGljaCBjb21waWxlcyB0byB0aGlzOgorICAgICAgIHdoaWNoIGNvbXBpbGVzIHRvIHRoaXM6CiAKLQkgICAyICAgICAgICAgICAwIExPQURfRkFTVCAgICAgICAgICAgICAgICAwIChhKQotCQkgICAgICAgMyBKVU1QX0lGX0ZBTFNFICAgICAgICAgICAgOSAodG8gMTUpCi0JCSAgICAgICA2IFBPUF9UT1AKKyAgICAgICAyICAgICAgICAgICAwIExPQURfRkFTVCAgICAgICAgICAgICAgICAwIChhKQorICAgICAgICAgICAgICAgICAgIDMgSlVNUF9JRl9GQUxTRSAgICAgICAgICAgIDkgKHRvIDE1KQorICAgICAgICAgICAgICAgICAgIDYgUE9QX1RPUAogCi0JICAgMyAgICAgICAgICAgNyBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMSAoMSkKLQkJICAgICAgMTAgUFJJTlRfSVRFTQotCQkgICAgICAxMSBQUklOVF9ORVdMSU5FCi0JCSAgICAgIDEyIEpVTVBfRk9SV0FSRCAgICAgICAgICAgICA2ICh0byAyMSkKLQkJID4+ICAgMTUgUE9QX1RPUAorICAgICAgIDMgICAgICAgICAgIDcgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDEgKDEpCisgICAgICAgICAgICAgICAgICAxMCBQUklOVF9JVEVNCisgICAgICAgICAgICAgICAgICAxMSBQUklOVF9ORVdMSU5FCisgICAgICAgICAgICAgICAgICAxMiBKVU1QX0ZPUldBUkQgICAgICAgICAgICAgNiAodG8gMjEpCisgICAgICAgICA+PiAgIDE1IFBPUF9UT1AKIAotCSAgIDUgICAgICAgICAgMTYgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDIgKDIpCi0JCSAgICAgIDE5IFBSSU5UX0lURU0KLQkJICAgICAgMjAgUFJJTlRfTkVXTElORQotCQkgPj4gICAyMSBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMCAoTm9uZSkKLQkJICAgICAgMjQgUkVUVVJOX1ZBTFVFCisgICAgICAgNSAgICAgICAgICAxNiBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMiAoMikKKyAgICAgICAgICAgICAgICAgIDE5IFBSSU5UX0lURU0KKyAgICAgICAgICAgICAgICAgIDIwIFBSSU5UX05FV0xJTkUKKyAgICAgICAgID4+ICAgMjEgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDAgKE5vbmUpCisgICAgICAgICAgICAgIDI0IFJFVFVSTl9WQUxVRQogCi0JICAgSWYgJ2EnIGlzIGZhbHNlLCBleGVjdXRpb24gd2lsbCBqdW1wIHRvIGluc3RydWN0aW9uIGF0IG9mZnNldAotCSAgIDE1IGFuZCB0aGUgY29fbG5vdGFiIHdpbGwgY2xhaW0gdGhhdCBleGVjdXRpb24gaGFzIG1vdmVkIHRvCi0JICAgbGluZSAzLiAgVGhpcyBpcyBhdCBiZXN0IG1pc2xlYWRpbmcuICBJbiB0aGlzIGNhc2Ugd2UgY291bGQKLQkgICBhc3NvY2lhdGUgdGhlIFBPUF9UT1Agd2l0aCBsaW5lIDQsIGJ1dCB0aGF0IGRvZXNuJ3QgbWFrZQotCSAgIHNlbnNlIGluIGFsbCBjYXNlcyAoSSB0aGluaykuCisgICAgICAgSWYgJ2EnIGlzIGZhbHNlLCBleGVjdXRpb24gd2lsbCBqdW1wIHRvIGluc3RydWN0aW9uIGF0IG9mZnNldAorICAgICAgIDE1IGFuZCB0aGUgY29fbG5vdGFiIHdpbGwgY2xhaW0gdGhhdCBleGVjdXRpb24gaGFzIG1vdmVkIHRvCisgICAgICAgbGluZSAzLiAgVGhpcyBpcyBhdCBiZXN0IG1pc2xlYWRpbmcuICBJbiB0aGlzIGNhc2Ugd2UgY291bGQKKyAgICAgICBhc3NvY2lhdGUgdGhlIFBPUF9UT1Agd2l0aCBsaW5lIDQsIGJ1dCB0aGF0IGRvZXNuJ3QgbWFrZQorICAgICAgIHNlbnNlIGluIGFsbCBjYXNlcyAoSSB0aGluaykuCiAKLQkgICBXaGF0IHdlIGRvIGlzIG9ubHkgY2FsbCB0aGUgbGluZSB0cmFjZSBmdW5jdGlvbiBpZiB0aGUgY29fbG5vdGFiCi0JICAgaW5kaWNhdGVzIHdlIGhhdmUganVtcGVkIHRvIHRoZSAqc3RhcnQqIG9mIGEgbGluZSwgaS5lLiBpZiB0aGUKLQkgICBjdXJyZW50IGluc3RydWN0aW9uIG9mZnNldCBtYXRjaGVzIHRoZSBvZmZzZXQgZ2l2ZW4gZm9yIHRoZQotCSAgIHN0YXJ0IG9mIGEgbGluZSBieSB0aGUgY29fbG5vdGFiLgorICAgICAgIFdoYXQgd2UgZG8gaXMgb25seSBjYWxsIHRoZSBsaW5lIHRyYWNlIGZ1bmN0aW9uIGlmIHRoZSBjb19sbm90YWIKKyAgICAgICBpbmRpY2F0ZXMgd2UgaGF2ZSBqdW1wZWQgdG8gdGhlICpzdGFydCogb2YgYSBsaW5lLCBpLmUuIGlmIHRoZQorICAgICAgIGN1cnJlbnQgaW5zdHJ1Y3Rpb24gb2Zmc2V0IG1hdGNoZXMgdGhlIG9mZnNldCBnaXZlbiBmb3IgdGhlCisgICAgICAgc3RhcnQgb2YgYSBsaW5lIGJ5IHRoZSBjb19sbm90YWIuCiAKLQkgICBUaGlzIGFsc28gdGFrZXMgY2FyZSBvZiB0aGUgc2l0dWF0aW9uIHdoZXJlICdhJyBpcyB0cnVlLgotCSAgIEV4ZWN1dGlvbiB3aWxsIGp1bXAgZnJvbSBpbnN0cnVjdGlvbiBvZmZzZXQgMTIgdG8gb2Zmc2V0IDIxLgotCSAgIFRoZW4gdGhlIGNvX2xub3RhYiB3b3VsZCBpbXBseSB0aGF0IGV4ZWN1dGlvbiBoYXMgbW92ZWQgdG8gbGluZQotCSAgIDUsIHdoaWNoIGlzIGFnYWluIG1pc2xlYWRpbmcuCisgICAgICAgVGhpcyBhbHNvIHRha2VzIGNhcmUgb2YgdGhlIHNpdHVhdGlvbiB3aGVyZSAnYScgaXMgdHJ1ZS4KKyAgICAgICBFeGVjdXRpb24gd2lsbCBqdW1wIGZyb20gaW5zdHJ1Y3Rpb24gb2Zmc2V0IDEyIHRvIG9mZnNldCAyMS4KKyAgICAgICBUaGVuIHRoZSBjb19sbm90YWIgd291bGQgaW1wbHkgdGhhdCBleGVjdXRpb24gaGFzIG1vdmVkIHRvIGxpbmUKKyAgICAgICA1LCB3aGljaCBpcyBhZ2FpbiBtaXNsZWFkaW5nLgogCi0JICAgV2h5IGRvIHdlIHNldCBmX2xpbmVubyB3aGVuIHRyYWNpbmc/ICBXZWxsLCBjb25zaWRlciB0aGUgY29kZQotCSAgIGFib3ZlIHdoZW4gJ2EnIGlzIHRydWUuICBJZiBzdGVwcGluZyB0aHJvdWdoIHRoaXMgd2l0aCAnbicgaW4KLQkgICBwZGIsIHlvdSB3b3VsZCBzdG9wIGF0IGxpbmUgMSB3aXRoIGEgImNhbGwiIHR5cGUgZXZlbnQsIHRoZW4KLQkgICBsaW5lIGV2ZW50cyBvbiBsaW5lcyAyIGFuZCAzLCB0aGVuIGEgInJldHVybiIgdHlwZSBldmVudCAtLSBidXQKLQkgICB5b3Ugd291bGQgYmUgc2hvd24gbGluZSA1IGR1cmluZyB0aGlzIGV2ZW50LiAgVGhpcyBpcyBhIGNoYW5nZQotCSAgIGZyb20gdGhlIGJlaGF2aW91ciBpbiAyLjIgYW5kIGJlZm9yZSwgYW5kIEkndmUgZm91bmQgaXQKLQkgICBjb25mdXNpbmcgaW4gcHJhY3RpY2UuICBCeSBzZXR0aW5nIGFuZCB1c2luZyBmX2xpbmVubyB3aGVuCi0JICAgdHJhY2luZywgb25lIGNhbiByZXBvcnQgYSBsaW5lIG51bWJlciBkaWZmZXJlbnQgZnJvbSB0aGF0Ci0JICAgc3VnZ2VzdGVkIGJ5IGZfbGFzdGkgb24gdGhpcyBvbmUgb2NjYXNpb24gd2hlcmUgaXQncyBkZXNpcmFibGUuCi0JKi8KKyAgICAgICBXaHkgZG8gd2Ugc2V0IGZfbGluZW5vIHdoZW4gdHJhY2luZz8gIFdlbGwsIGNvbnNpZGVyIHRoZSBjb2RlCisgICAgICAgYWJvdmUgd2hlbiAnYScgaXMgdHJ1ZS4gIElmIHN0ZXBwaW5nIHRocm91Z2ggdGhpcyB3aXRoICduJyBpbgorICAgICAgIHBkYiwgeW91IHdvdWxkIHN0b3AgYXQgbGluZSAxIHdpdGggYSAiY2FsbCIgdHlwZSBldmVudCwgdGhlbgorICAgICAgIGxpbmUgZXZlbnRzIG9uIGxpbmVzIDIgYW5kIDMsIHRoZW4gYSAicmV0dXJuIiB0eXBlIGV2ZW50IC0tIGJ1dAorICAgICAgIHlvdSB3b3VsZCBiZSBzaG93biBsaW5lIDUgZHVyaW5nIHRoaXMgZXZlbnQuICBUaGlzIGlzIGEgY2hhbmdlCisgICAgICAgZnJvbSB0aGUgYmVoYXZpb3VyIGluIDIuMiBhbmQgYmVmb3JlLCBhbmQgSSd2ZSBmb3VuZCBpdAorICAgICAgIGNvbmZ1c2luZyBpbiBwcmFjdGljZS4gIEJ5IHNldHRpbmcgYW5kIHVzaW5nIGZfbGluZW5vIHdoZW4KKyAgICAgICB0cmFjaW5nLCBvbmUgY2FuIHJlcG9ydCBhIGxpbmUgbnVtYmVyIGRpZmZlcmVudCBmcm9tIHRoYXQKKyAgICAgICBzdWdnZXN0ZWQgYnkgZl9sYXN0aSBvbiB0aGlzIG9uZSBvY2Nhc2lvbiB3aGVyZSBpdCdzIGRlc2lyYWJsZS4KKyAgICAqLwogCiAKLWludCAKK2ludAogUHlDb2RlX0NoZWNrTGluZU51bWJlcihQeUNvZGVPYmplY3QqIGNvLCBpbnQgbGFzdGksIFB5QWRkclBhaXIgKmJvdW5kcykKIHsKLSAgICAgICAgaW50IHNpemUsIGFkZHIsIGxpbmU7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIqIHA7CisgICAgaW50IHNpemUsIGFkZHIsIGxpbmU7CisgICAgdW5zaWduZWQgY2hhciogcDsKIAotICAgICAgICBwID0gKHVuc2lnbmVkIGNoYXIqKVB5U3RyaW5nX0FTX1NUUklORyhjby0+Y29fbG5vdGFiKTsKLSAgICAgICAgc2l6ZSA9IFB5U3RyaW5nX0dFVF9TSVpFKGNvLT5jb19sbm90YWIpIC8gMjsKKyAgICBwID0gKHVuc2lnbmVkIGNoYXIqKVB5U3RyaW5nX0FTX1NUUklORyhjby0+Y29fbG5vdGFiKTsKKyAgICBzaXplID0gUHlTdHJpbmdfR0VUX1NJWkUoY28tPmNvX2xub3RhYikgLyAyOwogCi0gICAgICAgIGFkZHIgPSAwOwotICAgICAgICBsaW5lID0gY28tPmNvX2ZpcnN0bGluZW5vOwotICAgICAgICBhc3NlcnQobGluZSA+IDApOworICAgIGFkZHIgPSAwOworICAgIGxpbmUgPSBjby0+Y29fZmlyc3RsaW5lbm87CisgICAgYXNzZXJ0KGxpbmUgPiAwKTsKIAotICAgICAgICAvKiBwb3NzaWJsZSBvcHRpbWl6YXRpb246IGlmIGYtPmZfbGFzdGkgPT0gaW5zdHJfdWIKLSAgICAgICAgICAgKGxpa2VseSB0byBiZSBhIGNvbW1vbiBjYXNlKSB0aGVuIHdlIGFscmVhZHkga25vdwotICAgICAgICAgICBpbnN0cl9sYiAtLSBpZiB3ZSBzdG9yZWQgdGhlIG1hdGNoaW5nIHZhbHVlIG9mIHAKLSAgICAgICAgICAgc29td2hlcmUgd2UgY291bGQgc2tpcCB0aGUgZmlyc3Qgd2hpbGUgbG9vcC4gKi8KKyAgICAvKiBwb3NzaWJsZSBvcHRpbWl6YXRpb246IGlmIGYtPmZfbGFzdGkgPT0gaW5zdHJfdWIKKyAgICAgICAobGlrZWx5IHRvIGJlIGEgY29tbW9uIGNhc2UpIHRoZW4gd2UgYWxyZWFkeSBrbm93CisgICAgICAgaW5zdHJfbGIgLS0gaWYgd2Ugc3RvcmVkIHRoZSBtYXRjaGluZyB2YWx1ZSBvZiBwCisgICAgICAgc29td2hlcmUgd2UgY291bGQgc2tpcCB0aGUgZmlyc3Qgd2hpbGUgbG9vcC4gKi8KIAotICAgICAgICAvKiBzZWUgY29tbWVudHMgaW4gY29tcGlsZS5jIGZvciB0aGUgZGVzY3JpcHRpb24gb2YKLSAgICAgICAgICAgY29fbG5vdGFiLiAgQSBwb2ludCB0byByZW1lbWJlcjogaW5jcmVtZW50cyB0byBwCi0gICAgICAgICAgIHNob3VsZCBjb21lIGluIHBhaXJzIC0tIGFsdGhvdWdoIHdlIGRvbid0IGNhcmUgYWJvdXQKLSAgICAgICAgICAgdGhlIGxpbmUgaW5jcmVtZW50cyBoZXJlLCB0cmVhdGluZyB0aGVtIGFzIGJ5dGUKLSAgICAgICAgICAgaW5jcmVtZW50cyBnZXRzIGNvbmZ1c2luZywgdG8gc2F5IHRoZSBsZWFzdC4gKi8KKyAgICAvKiBzZWUgY29tbWVudHMgaW4gY29tcGlsZS5jIGZvciB0aGUgZGVzY3JpcHRpb24gb2YKKyAgICAgICBjb19sbm90YWIuICBBIHBvaW50IHRvIHJlbWVtYmVyOiBpbmNyZW1lbnRzIHRvIHAKKyAgICAgICBzaG91bGQgY29tZSBpbiBwYWlycyAtLSBhbHRob3VnaCB3ZSBkb24ndCBjYXJlIGFib3V0CisgICAgICAgdGhlIGxpbmUgaW5jcmVtZW50cyBoZXJlLCB0cmVhdGluZyB0aGVtIGFzIGJ5dGUKKyAgICAgICBpbmNyZW1lbnRzIGdldHMgY29uZnVzaW5nLCB0byBzYXkgdGhlIGxlYXN0LiAqLwogCi0gICAgICAgIGJvdW5kcy0+YXBfbG93ZXIgPSAwOwotICAgICAgICB3aGlsZSAoc2l6ZSA+IDApIHsKLSAgICAgICAgICAgICAgICBpZiAoYWRkciArICpwID4gbGFzdGkpCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBhZGRyICs9ICpwKys7Ci0gICAgICAgICAgICAgICAgaWYgKCpwKSAKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kcy0+YXBfbG93ZXIgPSBhZGRyOwotICAgICAgICAgICAgICAgIGxpbmUgKz0gKnArKzsKLSAgICAgICAgICAgICAgICAtLXNpemU7CisgICAgYm91bmRzLT5hcF9sb3dlciA9IDA7CisgICAgd2hpbGUgKHNpemUgPiAwKSB7CisgICAgICAgIGlmIChhZGRyICsgKnAgPiBsYXN0aSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBhZGRyICs9ICpwKys7CisgICAgICAgIGlmICgqcCkKKyAgICAgICAgICAgIGJvdW5kcy0+YXBfbG93ZXIgPSBhZGRyOworICAgICAgICBsaW5lICs9ICpwKys7CisgICAgICAgIC0tc2l6ZTsKKyAgICB9CisKKyAgICAvKiBJZiBsYXN0aSBhbmQgYWRkciBkb24ndCBtYXRjaCBleGFjdGx5LCB3ZSBkb24ndCB3YW50IHRvCisgICAgICAgY2hhbmdlIHRoZSBsaW5lbm8gc2xvdCBvbiB0aGUgZnJhbWUgb3IgZXhlY3V0ZSBhIHRyYWNlCisgICAgICAgZnVuY3Rpb24uICBSZXR1cm4gLTEgaW5zdGVhZC4KKyAgICAqLworICAgIGlmIChhZGRyICE9IGxhc3RpKQorICAgICAgICBsaW5lID0gLTE7CisKKyAgICBpZiAoc2l6ZSA+IDApIHsKKyAgICAgICAgd2hpbGUgKC0tc2l6ZSA+PSAwKSB7CisgICAgICAgICAgICBhZGRyICs9ICpwKys7CisgICAgICAgICAgICBpZiAoKnArKykKKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQorICAgICAgICBib3VuZHMtPmFwX3VwcGVyID0gYWRkcjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGJvdW5kcy0+YXBfdXBwZXIgPSBJTlRfTUFYOworICAgIH0KIAotICAgICAgICAvKiBJZiBsYXN0aSBhbmQgYWRkciBkb24ndCBtYXRjaCBleGFjdGx5LCB3ZSBkb24ndCB3YW50IHRvCi0gICAgICAgICAgIGNoYW5nZSB0aGUgbGluZW5vIHNsb3Qgb24gdGhlIGZyYW1lIG9yIGV4ZWN1dGUgYSB0cmFjZQotICAgICAgICAgICBmdW5jdGlvbi4gIFJldHVybiAtMSBpbnN0ZWFkLgotICAgICAgICAqLwotICAgICAgICBpZiAoYWRkciAhPSBsYXN0aSkKLSAgICAgICAgICAgICAgICBsaW5lID0gLTE7Ci0gICAgICAgIAotICAgICAgICBpZiAoc2l6ZSA+IDApIHsKLSAgICAgICAgICAgICAgICB3aGlsZSAoLS1zaXplID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZHIgKz0gKnArKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgqcCsrKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYm91bmRzLT5hcF91cHBlciA9IGFkZHI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgYm91bmRzLT5hcF91cHBlciA9IElOVF9NQVg7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbGluZTsKKyAgICByZXR1cm4gbGluZTsKIH0KZGlmZiAtLWdpdCBhL09iamVjdHMvY29tcGxleG9iamVjdC5jIGIvT2JqZWN0cy9jb21wbGV4b2JqZWN0LmMKaW5kZXggYTIzMzRjOS4uZThjOGViYiAxMDA2NDQKLS0tIGEvT2JqZWN0cy9jb21wbGV4b2JqZWN0LmMKKysrIGIvT2JqZWN0cy9jb21wbGV4b2JqZWN0LmMKQEAgLTI3LDggKzI3LDggQEAKICAgIHByZWNpc2lvbiBmb3IgcHJhY3RpY2FsIHVzZS4KICovCiAKLSNkZWZpbmUgUFJFQ19SRVBSCTE3Ci0jZGVmaW5lIFBSRUNfU1RSCTEyCisjZGVmaW5lIFBSRUNfUkVQUiAgICAgICAxNworI2RlZmluZSBQUkVDX1NUUiAgICAgICAgMTIKIAogLyogZWxlbWVudGFyeSBvcGVyYXRpb25zIG9uIGNvbXBsZXggbnVtYmVycyAqLwogCkBAIC0zNyw0MjkgKzM3LDQyOSBAQAogUHlfY29tcGxleAogY19zdW0oUHlfY29tcGxleCBhLCBQeV9jb21wbGV4IGIpCiB7Ci0JUHlfY29tcGxleCByOwotCXIucmVhbCA9IGEucmVhbCArIGIucmVhbDsKLQlyLmltYWcgPSBhLmltYWcgKyBiLmltYWc7Ci0JcmV0dXJuIHI7CisgICAgUHlfY29tcGxleCByOworICAgIHIucmVhbCA9IGEucmVhbCArIGIucmVhbDsKKyAgICByLmltYWcgPSBhLmltYWcgKyBiLmltYWc7CisgICAgcmV0dXJuIHI7CiB9CiAKIFB5X2NvbXBsZXgKIGNfZGlmZihQeV9jb21wbGV4IGEsIFB5X2NvbXBsZXggYikKIHsKLQlQeV9jb21wbGV4IHI7Ci0Jci5yZWFsID0gYS5yZWFsIC0gYi5yZWFsOwotCXIuaW1hZyA9IGEuaW1hZyAtIGIuaW1hZzsKLQlyZXR1cm4gcjsKKyAgICBQeV9jb21wbGV4IHI7CisgICAgci5yZWFsID0gYS5yZWFsIC0gYi5yZWFsOworICAgIHIuaW1hZyA9IGEuaW1hZyAtIGIuaW1hZzsKKyAgICByZXR1cm4gcjsKIH0KIAogUHlfY29tcGxleAogY19uZWcoUHlfY29tcGxleCBhKQogewotCVB5X2NvbXBsZXggcjsKLQlyLnJlYWwgPSAtYS5yZWFsOwotCXIuaW1hZyA9IC1hLmltYWc7Ci0JcmV0dXJuIHI7CisgICAgUHlfY29tcGxleCByOworICAgIHIucmVhbCA9IC1hLnJlYWw7CisgICAgci5pbWFnID0gLWEuaW1hZzsKKyAgICByZXR1cm4gcjsKIH0KIAogUHlfY29tcGxleAogY19wcm9kKFB5X2NvbXBsZXggYSwgUHlfY29tcGxleCBiKQogewotCVB5X2NvbXBsZXggcjsKLQlyLnJlYWwgPSBhLnJlYWwqYi5yZWFsIC0gYS5pbWFnKmIuaW1hZzsKLQlyLmltYWcgPSBhLnJlYWwqYi5pbWFnICsgYS5pbWFnKmIucmVhbDsKLQlyZXR1cm4gcjsKKyAgICBQeV9jb21wbGV4IHI7CisgICAgci5yZWFsID0gYS5yZWFsKmIucmVhbCAtIGEuaW1hZypiLmltYWc7CisgICAgci5pbWFnID0gYS5yZWFsKmIuaW1hZyArIGEuaW1hZypiLnJlYWw7CisgICAgcmV0dXJuIHI7CiB9CiAKIFB5X2NvbXBsZXgKIGNfcXVvdChQeV9jb21wbGV4IGEsIFB5X2NvbXBsZXggYikKIHsKLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JVGhpcyB3YXMgdGhlIG9yaWdpbmFsIGFsZ29yaXRobS4gIEl0J3MgZ3Jvc3NseSBwcm9uZSB0byBzcHVyaW91cwotCW92ZXJmbG93IGFuZCB1bmRlcmZsb3cgZXJyb3JzLiAgSXQgYWxzbyBtZXJyaWx5IGRpdmlkZXMgYnkgMCBkZXNwaXRlCi0JY2hlY2tpbmcgZm9yIHRoYXQoISkuICBUaGUgY29kZSBzdGlsbCBzZXJ2ZXMgYSBkb2MgcHVycG9zZSBoZXJlLCBhcwotCXRoZSBhbGdvcml0aG0gZm9sbG93aW5nIGlzIGEgc2ltcGxlIGJ5LWNhc2VzIHRyYW5zZm9ybWF0aW9uIG9mIHRoaXMKLQlvbmU6CisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIFRoaXMgd2FzIHRoZSBvcmlnaW5hbCBhbGdvcml0aG0uICBJdCdzIGdyb3NzbHkgcHJvbmUgdG8gc3B1cmlvdXMKKyAgICBvdmVyZmxvdyBhbmQgdW5kZXJmbG93IGVycm9ycy4gIEl0IGFsc28gbWVycmlseSBkaXZpZGVzIGJ5IDAgZGVzcGl0ZQorICAgIGNoZWNraW5nIGZvciB0aGF0KCEpLiAgVGhlIGNvZGUgc3RpbGwgc2VydmVzIGEgZG9jIHB1cnBvc2UgaGVyZSwgYXMKKyAgICB0aGUgYWxnb3JpdGhtIGZvbGxvd2luZyBpcyBhIHNpbXBsZSBieS1jYXNlcyB0cmFuc2Zvcm1hdGlvbiBvZiB0aGlzCisgICAgb25lOgogCi0JUHlfY29tcGxleCByOwotCWRvdWJsZSBkID0gYi5yZWFsKmIucmVhbCArIGIuaW1hZypiLmltYWc7Ci0JaWYgKGQgPT0gMC4pCi0JCWVycm5vID0gRURPTTsKLQlyLnJlYWwgPSAoYS5yZWFsKmIucmVhbCArIGEuaW1hZypiLmltYWcpL2Q7Ci0Jci5pbWFnID0gKGEuaW1hZypiLnJlYWwgLSBhLnJlYWwqYi5pbWFnKS9kOwotCXJldHVybiByOwotCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICBQeV9jb21wbGV4IHI7CisgICAgZG91YmxlIGQgPSBiLnJlYWwqYi5yZWFsICsgYi5pbWFnKmIuaW1hZzsKKyAgICBpZiAoZCA9PSAwLikKKyAgICAgICAgZXJybm8gPSBFRE9NOworICAgIHIucmVhbCA9IChhLnJlYWwqYi5yZWFsICsgYS5pbWFnKmIuaW1hZykvZDsKKyAgICByLmltYWcgPSAoYS5pbWFnKmIucmVhbCAtIGEucmVhbCpiLmltYWcpL2Q7CisgICAgcmV0dXJuIHI7CisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0JLyogVGhpcyBhbGdvcml0aG0gaXMgYmV0dGVyLCBhbmQgaXMgcHJldHR5IG9idmlvdXM6ICBmaXJzdCBkaXZpZGUgdGhlCi0JICogbnVtZXJhdG9ycyBhbmQgZGVub21pbmF0b3IgYnkgd2hpY2hldmVyIG9mIHtiLnJlYWwsIGIuaW1hZ30gaGFzCi0JICogbGFyZ2VyIG1hZ25pdHVkZS4gIFRoZSBlYXJsaWVzdCByZWZlcmVuY2UgSSBmb3VuZCB3YXMgdG8gQ0FDTQotCSAqIEFsZ29yaXRobSAxMTYgKENvbXBsZXggRGl2aXNpb24sIFJvYmVydCBMLiBTbWl0aCwgU3RhbmZvcmQKLQkgKiBVbml2ZXJzaXR5KS4gIEFzIHVzdWFsLCB0aG91Z2gsIHdlJ3JlIHN0aWxsIGlnbm9yaW5nIGFsbCBJRUVFCi0JICogZW5kY2FzZXMuCi0JICovCi0JIFB5X2NvbXBsZXggcjsJLyogdGhlIHJlc3VsdCAqLwotIAkgY29uc3QgZG91YmxlIGFic19icmVhbCA9IGIucmVhbCA8IDAgPyAtYi5yZWFsIDogYi5yZWFsOwotCSBjb25zdCBkb3VibGUgYWJzX2JpbWFnID0gYi5pbWFnIDwgMCA/IC1iLmltYWcgOiBiLmltYWc7CisgICAgLyogVGhpcyBhbGdvcml0aG0gaXMgYmV0dGVyLCBhbmQgaXMgcHJldHR5IG9idmlvdXM6ICBmaXJzdCBkaXZpZGUgdGhlCisgICAgICogbnVtZXJhdG9ycyBhbmQgZGVub21pbmF0b3IgYnkgd2hpY2hldmVyIG9mIHtiLnJlYWwsIGIuaW1hZ30gaGFzCisgICAgICogbGFyZ2VyIG1hZ25pdHVkZS4gIFRoZSBlYXJsaWVzdCByZWZlcmVuY2UgSSBmb3VuZCB3YXMgdG8gQ0FDTQorICAgICAqIEFsZ29yaXRobSAxMTYgKENvbXBsZXggRGl2aXNpb24sIFJvYmVydCBMLiBTbWl0aCwgU3RhbmZvcmQKKyAgICAgKiBVbml2ZXJzaXR5KS4gIEFzIHVzdWFsLCB0aG91Z2gsIHdlJ3JlIHN0aWxsIGlnbm9yaW5nIGFsbCBJRUVFCisgICAgICogZW5kY2FzZXMuCisgICAgICovCisgICAgIFB5X2NvbXBsZXggcjsgICAgICAvKiB0aGUgcmVzdWx0ICovCisgICAgIGNvbnN0IGRvdWJsZSBhYnNfYnJlYWwgPSBiLnJlYWwgPCAwID8gLWIucmVhbCA6IGIucmVhbDsKKyAgICAgY29uc3QgZG91YmxlIGFic19iaW1hZyA9IGIuaW1hZyA8IDAgPyAtYi5pbWFnIDogYi5pbWFnOwogCi0JIGlmIChhYnNfYnJlYWwgPj0gYWJzX2JpbWFnKSB7Ci0gCQkvKiBkaXZpZGUgdG9wcyBhbmQgYm90dG9tIGJ5IGIucmVhbCAqLwotCSAJaWYgKGFic19icmVhbCA9PSAwLjApIHsKLQkgCQllcnJubyA9IEVET007Ci0JIAkJci5yZWFsID0gci5pbWFnID0gMC4wOwotCSAJfQotCSAJZWxzZSB7Ci0JIAkJY29uc3QgZG91YmxlIHJhdGlvID0gYi5pbWFnIC8gYi5yZWFsOwotCSAJCWNvbnN0IGRvdWJsZSBkZW5vbSA9IGIucmVhbCArIGIuaW1hZyAqIHJhdGlvOwotCSAJCXIucmVhbCA9IChhLnJlYWwgKyBhLmltYWcgKiByYXRpbykgLyBkZW5vbTsKLQkgCQlyLmltYWcgPSAoYS5pbWFnIC0gYS5yZWFsICogcmF0aW8pIC8gZGVub207Ci0JIAl9Ci0JfQotCWVsc2UgewotCQkvKiBkaXZpZGUgdG9wcyBhbmQgYm90dG9tIGJ5IGIuaW1hZyAqLwotCQljb25zdCBkb3VibGUgcmF0aW8gPSBiLnJlYWwgLyBiLmltYWc7Ci0JCWNvbnN0IGRvdWJsZSBkZW5vbSA9IGIucmVhbCAqIHJhdGlvICsgYi5pbWFnOwotCQlhc3NlcnQoYi5pbWFnICE9IDAuMCk7Ci0JCXIucmVhbCA9IChhLnJlYWwgKiByYXRpbyArIGEuaW1hZykgLyBkZW5vbTsKLQkJci5pbWFnID0gKGEuaW1hZyAqIHJhdGlvIC0gYS5yZWFsKSAvIGRlbm9tOwotCX0KLQlyZXR1cm4gcjsKKyAgICAgaWYgKGFic19icmVhbCA+PSBhYnNfYmltYWcpIHsKKyAgICAgICAgLyogZGl2aWRlIHRvcHMgYW5kIGJvdHRvbSBieSBiLnJlYWwgKi8KKyAgICAgICAgaWYgKGFic19icmVhbCA9PSAwLjApIHsKKyAgICAgICAgICAgIGVycm5vID0gRURPTTsKKyAgICAgICAgICAgIHIucmVhbCA9IHIuaW1hZyA9IDAuMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGNvbnN0IGRvdWJsZSByYXRpbyA9IGIuaW1hZyAvIGIucmVhbDsKKyAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBkZW5vbSA9IGIucmVhbCArIGIuaW1hZyAqIHJhdGlvOworICAgICAgICAgICAgci5yZWFsID0gKGEucmVhbCArIGEuaW1hZyAqIHJhdGlvKSAvIGRlbm9tOworICAgICAgICAgICAgci5pbWFnID0gKGEuaW1hZyAtIGEucmVhbCAqIHJhdGlvKSAvIGRlbm9tOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvKiBkaXZpZGUgdG9wcyBhbmQgYm90dG9tIGJ5IGIuaW1hZyAqLworICAgICAgICBjb25zdCBkb3VibGUgcmF0aW8gPSBiLnJlYWwgLyBiLmltYWc7CisgICAgICAgIGNvbnN0IGRvdWJsZSBkZW5vbSA9IGIucmVhbCAqIHJhdGlvICsgYi5pbWFnOworICAgICAgICBhc3NlcnQoYi5pbWFnICE9IDAuMCk7CisgICAgICAgIHIucmVhbCA9IChhLnJlYWwgKiByYXRpbyArIGEuaW1hZykgLyBkZW5vbTsKKyAgICAgICAgci5pbWFnID0gKGEuaW1hZyAqIHJhdGlvIC0gYS5yZWFsKSAvIGRlbm9tOworICAgIH0KKyAgICByZXR1cm4gcjsKIH0KIAogUHlfY29tcGxleAogY19wb3coUHlfY29tcGxleCBhLCBQeV9jb21wbGV4IGIpCiB7Ci0JUHlfY29tcGxleCByOwotCWRvdWJsZSB2YWJzLGxlbixhdCxwaGFzZTsKLQlpZiAoYi5yZWFsID09IDAuICYmIGIuaW1hZyA9PSAwLikgewotCQlyLnJlYWwgPSAxLjsKLQkJci5pbWFnID0gMC47Ci0JfQotCWVsc2UgaWYgKGEucmVhbCA9PSAwLiAmJiBhLmltYWcgPT0gMC4pIHsKLQkJaWYgKGIuaW1hZyAhPSAwLiB8fCBiLnJlYWwgPCAwLikKLQkJCWVycm5vID0gRURPTTsKLQkJci5yZWFsID0gMC47Ci0JCXIuaW1hZyA9IDAuOwotCX0KLQllbHNlIHsKLQkJdmFicyA9IGh5cG90KGEucmVhbCxhLmltYWcpOwotCQlsZW4gPSBwb3codmFicyxiLnJlYWwpOwotCQlhdCA9IGF0YW4yKGEuaW1hZywgYS5yZWFsKTsKLQkJcGhhc2UgPSBhdCpiLnJlYWw7Ci0JCWlmIChiLmltYWcgIT0gMC4wKSB7Ci0JCQlsZW4gLz0gZXhwKGF0KmIuaW1hZyk7Ci0JCQlwaGFzZSArPSBiLmltYWcqbG9nKHZhYnMpOwotCQl9Ci0JCXIucmVhbCA9IGxlbipjb3MocGhhc2UpOwotCQlyLmltYWcgPSBsZW4qc2luKHBoYXNlKTsKLQl9Ci0JcmV0dXJuIHI7CisgICAgUHlfY29tcGxleCByOworICAgIGRvdWJsZSB2YWJzLGxlbixhdCxwaGFzZTsKKyAgICBpZiAoYi5yZWFsID09IDAuICYmIGIuaW1hZyA9PSAwLikgeworICAgICAgICByLnJlYWwgPSAxLjsKKyAgICAgICAgci5pbWFnID0gMC47CisgICAgfQorICAgIGVsc2UgaWYgKGEucmVhbCA9PSAwLiAmJiBhLmltYWcgPT0gMC4pIHsKKyAgICAgICAgaWYgKGIuaW1hZyAhPSAwLiB8fCBiLnJlYWwgPCAwLikKKyAgICAgICAgICAgIGVycm5vID0gRURPTTsKKyAgICAgICAgci5yZWFsID0gMC47CisgICAgICAgIHIuaW1hZyA9IDAuOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgdmFicyA9IGh5cG90KGEucmVhbCxhLmltYWcpOworICAgICAgICBsZW4gPSBwb3codmFicyxiLnJlYWwpOworICAgICAgICBhdCA9IGF0YW4yKGEuaW1hZywgYS5yZWFsKTsKKyAgICAgICAgcGhhc2UgPSBhdCpiLnJlYWw7CisgICAgICAgIGlmIChiLmltYWcgIT0gMC4wKSB7CisgICAgICAgICAgICBsZW4gLz0gZXhwKGF0KmIuaW1hZyk7CisgICAgICAgICAgICBwaGFzZSArPSBiLmltYWcqbG9nKHZhYnMpOworICAgICAgICB9CisgICAgICAgIHIucmVhbCA9IGxlbipjb3MocGhhc2UpOworICAgICAgICByLmltYWcgPSBsZW4qc2luKHBoYXNlKTsKKyAgICB9CisgICAgcmV0dXJuIHI7CiB9CiAKIHN0YXRpYyBQeV9jb21wbGV4CiBjX3Bvd3UoUHlfY29tcGxleCB4LCBsb25nIG4pCiB7Ci0JUHlfY29tcGxleCByLCBwOwotCWxvbmcgbWFzayA9IDE7Ci0JciA9IGNfMTsKLQlwID0geDsKLQl3aGlsZSAobWFzayA+IDAgJiYgbiA+PSBtYXNrKSB7Ci0JCWlmIChuICYgbWFzaykKLQkJCXIgPSBjX3Byb2QocixwKTsKLQkJbWFzayA8PD0gMTsKLQkJcCA9IGNfcHJvZChwLHApOwotCX0KLQlyZXR1cm4gcjsKKyAgICBQeV9jb21wbGV4IHIsIHA7CisgICAgbG9uZyBtYXNrID0gMTsKKyAgICByID0gY18xOworICAgIHAgPSB4OworICAgIHdoaWxlIChtYXNrID4gMCAmJiBuID49IG1hc2spIHsKKyAgICAgICAgaWYgKG4gJiBtYXNrKQorICAgICAgICAgICAgciA9IGNfcHJvZChyLHApOworICAgICAgICBtYXNrIDw8PSAxOworICAgICAgICBwID0gY19wcm9kKHAscCk7CisgICAgfQorICAgIHJldHVybiByOwogfQogCiBzdGF0aWMgUHlfY29tcGxleAogY19wb3dpKFB5X2NvbXBsZXggeCwgbG9uZyBuKQogewotCVB5X2NvbXBsZXggY247CisgICAgUHlfY29tcGxleCBjbjsKIAotCWlmIChuID4gMTAwIHx8IG4gPCAtMTAwKSB7Ci0JCWNuLnJlYWwgPSAoZG91YmxlKSBuOwotCQljbi5pbWFnID0gMC47Ci0JCXJldHVybiBjX3Bvdyh4LGNuKTsKLQl9Ci0JZWxzZSBpZiAobiA+IDApCi0JCXJldHVybiBjX3Bvd3UoeCxuKTsKLQllbHNlCi0JCXJldHVybiBjX3F1b3QoY18xLGNfcG93dSh4LC1uKSk7CisgICAgaWYgKG4gPiAxMDAgfHwgbiA8IC0xMDApIHsKKyAgICAgICAgY24ucmVhbCA9IChkb3VibGUpIG47CisgICAgICAgIGNuLmltYWcgPSAwLjsKKyAgICAgICAgcmV0dXJuIGNfcG93KHgsY24pOworICAgIH0KKyAgICBlbHNlIGlmIChuID4gMCkKKyAgICAgICAgcmV0dXJuIGNfcG93dSh4LG4pOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGNfcXVvdChjXzEsY19wb3d1KHgsLW4pKTsKIAogfQogCiBkb3VibGUKIGNfYWJzKFB5X2NvbXBsZXggeikKIHsKLQkvKiBzZXRzIGVycm5vID0gRVJBTkdFIG9uIG92ZXJmbG93OyAgb3RoZXJ3aXNlIGVycm5vID0gMCAqLwotCWRvdWJsZSByZXN1bHQ7CisgICAgLyogc2V0cyBlcnJubyA9IEVSQU5HRSBvbiBvdmVyZmxvdzsgIG90aGVyd2lzZSBlcnJubyA9IDAgKi8KKyAgICBkb3VibGUgcmVzdWx0OwogCi0JaWYgKCFQeV9JU19GSU5JVEUoei5yZWFsKSB8fCAhUHlfSVNfRklOSVRFKHouaW1hZykpIHsKLQkJLyogQzk5IHJ1bGVzOiBpZiBlaXRoZXIgdGhlIHJlYWwgb3IgdGhlIGltYWdpbmFyeSBwYXJ0IGlzIGFuCi0JCSAgIGluZmluaXR5LCByZXR1cm4gaW5maW5pdHksIGV2ZW4gaWYgdGhlIG90aGVyIHBhcnQgaXMgYQotCQkgICBOYU4uICovCi0JCWlmIChQeV9JU19JTkZJTklUWSh6LnJlYWwpKSB7Ci0JCQlyZXN1bHQgPSBmYWJzKHoucmVhbCk7Ci0JCQllcnJubyA9IDA7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWlmIChQeV9JU19JTkZJTklUWSh6LmltYWcpKSB7Ci0JCQlyZXN1bHQgPSBmYWJzKHouaW1hZyk7Ci0JCQllcnJubyA9IDA7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCS8qIGVpdGhlciB0aGUgcmVhbCBvciBpbWFnaW5hcnkgcGFydCBpcyBhIE5hTiwKLQkJICAgYW5kIG5laXRoZXIgaXMgaW5maW5pdGUuIFJlc3VsdCBzaG91bGQgYmUgTmFOLiAqLwotCQlyZXR1cm4gUHlfTkFOOwotCX0KLQlyZXN1bHQgPSBoeXBvdCh6LnJlYWwsIHouaW1hZyk7Ci0JaWYgKCFQeV9JU19GSU5JVEUocmVzdWx0KSkKLQkJZXJybm8gPSBFUkFOR0U7Ci0JZWxzZQotCQllcnJubyA9IDA7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBpZiAoIVB5X0lTX0ZJTklURSh6LnJlYWwpIHx8ICFQeV9JU19GSU5JVEUoei5pbWFnKSkgeworICAgICAgICAvKiBDOTkgcnVsZXM6IGlmIGVpdGhlciB0aGUgcmVhbCBvciB0aGUgaW1hZ2luYXJ5IHBhcnQgaXMgYW4KKyAgICAgICAgICAgaW5maW5pdHksIHJldHVybiBpbmZpbml0eSwgZXZlbiBpZiB0aGUgb3RoZXIgcGFydCBpcyBhCisgICAgICAgICAgIE5hTi4gKi8KKyAgICAgICAgaWYgKFB5X0lTX0lORklOSVRZKHoucmVhbCkpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IGZhYnMoei5yZWFsKTsKKyAgICAgICAgICAgIGVycm5vID0gMDsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKFB5X0lTX0lORklOSVRZKHouaW1hZykpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IGZhYnMoei5pbWFnKTsKKyAgICAgICAgICAgIGVycm5vID0gMDsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgLyogZWl0aGVyIHRoZSByZWFsIG9yIGltYWdpbmFyeSBwYXJ0IGlzIGEgTmFOLAorICAgICAgICAgICBhbmQgbmVpdGhlciBpcyBpbmZpbml0ZS4gUmVzdWx0IHNob3VsZCBiZSBOYU4uICovCisgICAgICAgIHJldHVybiBQeV9OQU47CisgICAgfQorICAgIHJlc3VsdCA9IGh5cG90KHoucmVhbCwgei5pbWFnKTsKKyAgICBpZiAoIVB5X0lTX0ZJTklURShyZXN1bHQpKQorICAgICAgICBlcnJubyA9IEVSQU5HRTsKKyAgICBlbHNlCisgICAgICAgIGVycm5vID0gMDsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY29tcGxleF9zdWJ0eXBlX2Zyb21fY19jb21wbGV4KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlfY29tcGxleCBjdmFsKQogewotCVB5T2JqZWN0ICpvcDsKKyAgICBQeU9iamVjdCAqb3A7CiAKLQlvcCA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOwotCWlmIChvcCAhPSBOVUxMKQotCQkoKFB5Q29tcGxleE9iamVjdCAqKW9wKS0+Y3ZhbCA9IGN2YWw7Ci0JcmV0dXJuIG9wOworICAgIG9wID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7CisgICAgaWYgKG9wICE9IE5VTEwpCisgICAgICAgICgoUHlDb21wbGV4T2JqZWN0ICopb3ApLT5jdmFsID0gY3ZhbDsKKyAgICByZXR1cm4gb3A7CiB9CiAKIFB5T2JqZWN0ICoKIFB5Q29tcGxleF9Gcm9tQ0NvbXBsZXgoUHlfY29tcGxleCBjdmFsKQogewotCXJlZ2lzdGVyIFB5Q29tcGxleE9iamVjdCAqb3A7CisgICAgcmVnaXN0ZXIgUHlDb21wbGV4T2JqZWN0ICpvcDsKIAotCS8qIElubGluZSBQeU9iamVjdF9OZXcgKi8KLQlvcCA9IChQeUNvbXBsZXhPYmplY3QgKikgUHlPYmplY3RfTUFMTE9DKHNpemVvZihQeUNvbXBsZXhPYmplY3QpKTsKLQlpZiAob3AgPT0gTlVMTCkKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JUHlPYmplY3RfSU5JVChvcCwgJlB5Q29tcGxleF9UeXBlKTsKLQlvcC0+Y3ZhbCA9IGN2YWw7Ci0JcmV0dXJuIChQeU9iamVjdCAqKSBvcDsKKyAgICAvKiBJbmxpbmUgUHlPYmplY3RfTmV3ICovCisgICAgb3AgPSAoUHlDb21wbGV4T2JqZWN0ICopIFB5T2JqZWN0X01BTExPQyhzaXplb2YoUHlDb21wbGV4T2JqZWN0KSk7CisgICAgaWYgKG9wID09IE5VTEwpCisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIFB5T2JqZWN0X0lOSVQob3AsICZQeUNvbXBsZXhfVHlwZSk7CisgICAgb3AtPmN2YWwgPSBjdmFsOworICAgIHJldHVybiAoUHlPYmplY3QgKikgb3A7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjb21wbGV4X3N1YnR5cGVfZnJvbV9kb3VibGVzKFB5VHlwZU9iamVjdCAqdHlwZSwgZG91YmxlIHJlYWwsIGRvdWJsZSBpbWFnKQogewotCVB5X2NvbXBsZXggYzsKLQljLnJlYWwgPSByZWFsOwotCWMuaW1hZyA9IGltYWc7Ci0JcmV0dXJuIGNvbXBsZXhfc3VidHlwZV9mcm9tX2NfY29tcGxleCh0eXBlLCBjKTsKKyAgICBQeV9jb21wbGV4IGM7CisgICAgYy5yZWFsID0gcmVhbDsKKyAgICBjLmltYWcgPSBpbWFnOworICAgIHJldHVybiBjb21wbGV4X3N1YnR5cGVfZnJvbV9jX2NvbXBsZXgodHlwZSwgYyk7CiB9CiAKIFB5T2JqZWN0ICoKIFB5Q29tcGxleF9Gcm9tRG91Ymxlcyhkb3VibGUgcmVhbCwgZG91YmxlIGltYWcpCiB7Ci0JUHlfY29tcGxleCBjOwotCWMucmVhbCA9IHJlYWw7Ci0JYy5pbWFnID0gaW1hZzsKLQlyZXR1cm4gUHlDb21wbGV4X0Zyb21DQ29tcGxleChjKTsKKyAgICBQeV9jb21wbGV4IGM7CisgICAgYy5yZWFsID0gcmVhbDsKKyAgICBjLmltYWcgPSBpbWFnOworICAgIHJldHVybiBQeUNvbXBsZXhfRnJvbUNDb21wbGV4KGMpOwogfQogCiBkb3VibGUKIFB5Q29tcGxleF9SZWFsQXNEb3VibGUoUHlPYmplY3QgKm9wKQogewotCWlmIChQeUNvbXBsZXhfQ2hlY2sob3ApKSB7Ci0JCXJldHVybiAoKFB5Q29tcGxleE9iamVjdCAqKW9wKS0+Y3ZhbC5yZWFsOwotCX0KLQllbHNlIHsKLQkJcmV0dXJuIFB5RmxvYXRfQXNEb3VibGUob3ApOwotCX0KKyAgICBpZiAoUHlDb21wbGV4X0NoZWNrKG9wKSkgeworICAgICAgICByZXR1cm4gKChQeUNvbXBsZXhPYmplY3QgKilvcCktPmN2YWwucmVhbDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJldHVybiBQeUZsb2F0X0FzRG91YmxlKG9wKTsKKyAgICB9CiB9CiAKIGRvdWJsZQogUHlDb21wbGV4X0ltYWdBc0RvdWJsZShQeU9iamVjdCAqb3ApCiB7Ci0JaWYgKFB5Q29tcGxleF9DaGVjayhvcCkpIHsKLQkJcmV0dXJuICgoUHlDb21wbGV4T2JqZWN0ICopb3ApLT5jdmFsLmltYWc7Ci0JfQotCWVsc2UgewotCQlyZXR1cm4gMC4wOwotCX0KKyAgICBpZiAoUHlDb21wbGV4X0NoZWNrKG9wKSkgeworICAgICAgICByZXR1cm4gKChQeUNvbXBsZXhPYmplY3QgKilvcCktPmN2YWwuaW1hZzsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJldHVybiAwLjA7CisgICAgfQogfQogCiBQeV9jb21wbGV4CiBQeUNvbXBsZXhfQXNDQ29tcGxleChQeU9iamVjdCAqb3ApCiB7Ci0JUHlfY29tcGxleCBjdjsKLQlQeU9iamVjdCAqbmV3b3AgPSBOVUxMOwotCXN0YXRpYyBQeU9iamVjdCAqY29tcGxleF9zdHIgPSBOVUxMOworICAgIFB5X2NvbXBsZXggY3Y7CisgICAgUHlPYmplY3QgKm5ld29wID0gTlVMTDsKKyAgICBzdGF0aWMgUHlPYmplY3QgKmNvbXBsZXhfc3RyID0gTlVMTDsKIAotCWFzc2VydChvcCk7Ci0JLyogSWYgb3AgaXMgYWxyZWFkeSBvZiB0eXBlIFB5Q29tcGxleF9UeXBlLCByZXR1cm4gaXRzIHZhbHVlICovCi0JaWYgKFB5Q29tcGxleF9DaGVjayhvcCkpIHsKLQkJcmV0dXJuICgoUHlDb21wbGV4T2JqZWN0ICopb3ApLT5jdmFsOwotCX0KLQkvKiBJZiBub3QsIHVzZSBvcCdzIF9fY29tcGxleF9fICBtZXRob2QsIGlmIGl0IGV4aXN0cyAqLworICAgIGFzc2VydChvcCk7CisgICAgLyogSWYgb3AgaXMgYWxyZWFkeSBvZiB0eXBlIFB5Q29tcGxleF9UeXBlLCByZXR1cm4gaXRzIHZhbHVlICovCisgICAgaWYgKFB5Q29tcGxleF9DaGVjayhvcCkpIHsKKyAgICAgICAgcmV0dXJuICgoUHlDb21wbGV4T2JqZWN0ICopb3ApLT5jdmFsOworICAgIH0KKyAgICAvKiBJZiBub3QsIHVzZSBvcCdzIF9fY29tcGxleF9fICBtZXRob2QsIGlmIGl0IGV4aXN0cyAqLwogCi0JLyogcmV0dXJuIC0xIG9uIGZhaWx1cmUgKi8KLQljdi5yZWFsID0gLTEuOwotCWN2LmltYWcgPSAwLjsKKyAgICAvKiByZXR1cm4gLTEgb24gZmFpbHVyZSAqLworICAgIGN2LnJlYWwgPSAtMS47CisgICAgY3YuaW1hZyA9IDAuOwogCi0JaWYgKGNvbXBsZXhfc3RyID09IE5VTEwpIHsKLQkJaWYgKCEoY29tcGxleF9zdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2NvbXBsZXhfXyIpKSkKLQkJCXJldHVybiBjdjsKLQl9Ci0JCi0JaWYgKFB5SW5zdGFuY2VfQ2hlY2sob3ApKSB7Ci0JCS8qIHRoaXMgY2FuIGdvIGF3YXkgaW4gcHl0aG9uIDMwMDAgKi8KLQkJaWYgKFB5T2JqZWN0X0hhc0F0dHIob3AsIGNvbXBsZXhfc3RyKSkgewotCQkJbmV3b3AgPSBQeU9iamVjdF9DYWxsTWV0aG9kKG9wLCAiX19jb21wbGV4X18iLCBOVUxMKTsKLQkJCWlmICghbmV3b3ApCi0JCQkJcmV0dXJuIGN2OwotCQl9Ci0JCS8qIGVsc2UgdHJ5IF9fZmxvYXRfXyAqLwotCX0gZWxzZSB7Ci0JCVB5T2JqZWN0ICpjb21wbGV4ZnVuYzsKLQkJY29tcGxleGZ1bmMgPSBfUHlUeXBlX0xvb2t1cChvcC0+b2JfdHlwZSwgY29tcGxleF9zdHIpOwotCQkvKiBjb21wbGV4ZnVuYyBpcyBhIGJvcnJvd2VkIHJlZmVyZW5jZSAqLwotCQlpZiAoY29tcGxleGZ1bmMpIHsKLQkJCW5ld29wID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhjb21wbGV4ZnVuYywgb3AsIE5VTEwpOwotCQkJaWYgKCFuZXdvcCkKLQkJCQlyZXR1cm4gY3Y7Ci0JCX0KLQl9CisgICAgaWYgKGNvbXBsZXhfc3RyID09IE5VTEwpIHsKKyAgICAgICAgaWYgKCEoY29tcGxleF9zdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2NvbXBsZXhfXyIpKSkKKyAgICAgICAgICAgIHJldHVybiBjdjsKKyAgICB9CiAKLQlpZiAobmV3b3ApIHsKLQkJaWYgKCFQeUNvbXBsZXhfQ2hlY2sobmV3b3ApKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJfX2NvbXBsZXhfXyBzaG91bGQgcmV0dXJuIGEgY29tcGxleCBvYmplY3QiKTsKLQkJCVB5X0RFQ1JFRihuZXdvcCk7Ci0JCQlyZXR1cm4gY3Y7Ci0JCX0KLQkJY3YgPSAoKFB5Q29tcGxleE9iamVjdCAqKW5ld29wKS0+Y3ZhbDsKLQkJUHlfREVDUkVGKG5ld29wKTsKLQkJcmV0dXJuIGN2OwotCX0KLQkvKiBJZiBuZWl0aGVyIG9mIHRoZSBhYm92ZSB3b3JrcywgaW50ZXJwcmV0IG9wIGFzIGEgZmxvYXQgZ2l2aW5nIHRoZQotCSAgIHJlYWwgcGFydCBvZiB0aGUgcmVzdWx0LCBhbmQgZmlsbCBpbiB0aGUgaW1hZ2luYXJ5IHBhcnQgYXMgMC4gKi8KLQllbHNlIHsKLQkJLyogUHlGbG9hdF9Bc0RvdWJsZSB3aWxsIHJldHVybiAtMSBvbiBmYWlsdXJlICovCi0JCWN2LnJlYWwgPSBQeUZsb2F0X0FzRG91YmxlKG9wKTsKLQkJcmV0dXJuIGN2OwotCX0KKyAgICBpZiAoUHlJbnN0YW5jZV9DaGVjayhvcCkpIHsKKyAgICAgICAgLyogdGhpcyBjYW4gZ28gYXdheSBpbiBweXRob24gMzAwMCAqLworICAgICAgICBpZiAoUHlPYmplY3RfSGFzQXR0cihvcCwgY29tcGxleF9zdHIpKSB7CisgICAgICAgICAgICBuZXdvcCA9IFB5T2JqZWN0X0NhbGxNZXRob2Qob3AsICJfX2NvbXBsZXhfXyIsIE5VTEwpOworICAgICAgICAgICAgaWYgKCFuZXdvcCkKKyAgICAgICAgICAgICAgICByZXR1cm4gY3Y7CisgICAgICAgIH0KKyAgICAgICAgLyogZWxzZSB0cnkgX19mbG9hdF9fICovCisgICAgfSBlbHNlIHsKKyAgICAgICAgUHlPYmplY3QgKmNvbXBsZXhmdW5jOworICAgICAgICBjb21wbGV4ZnVuYyA9IF9QeVR5cGVfTG9va3VwKG9wLT5vYl90eXBlLCBjb21wbGV4X3N0cik7CisgICAgICAgIC8qIGNvbXBsZXhmdW5jIGlzIGEgYm9ycm93ZWQgcmVmZXJlbmNlICovCisgICAgICAgIGlmIChjb21wbGV4ZnVuYykgeworICAgICAgICAgICAgbmV3b3AgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGNvbXBsZXhmdW5jLCBvcCwgTlVMTCk7CisgICAgICAgICAgICBpZiAoIW5ld29wKQorICAgICAgICAgICAgICAgIHJldHVybiBjdjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChuZXdvcCkgeworICAgICAgICBpZiAoIVB5Q29tcGxleF9DaGVjayhuZXdvcCkpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgIl9fY29tcGxleF9fIHNob3VsZCByZXR1cm4gYSBjb21wbGV4IG9iamVjdCIpOworICAgICAgICAgICAgUHlfREVDUkVGKG5ld29wKTsKKyAgICAgICAgICAgIHJldHVybiBjdjsKKyAgICAgICAgfQorICAgICAgICBjdiA9ICgoUHlDb21wbGV4T2JqZWN0ICopbmV3b3ApLT5jdmFsOworICAgICAgICBQeV9ERUNSRUYobmV3b3ApOworICAgICAgICByZXR1cm4gY3Y7CisgICAgfQorICAgIC8qIElmIG5laXRoZXIgb2YgdGhlIGFib3ZlIHdvcmtzLCBpbnRlcnByZXQgb3AgYXMgYSBmbG9hdCBnaXZpbmcgdGhlCisgICAgICAgcmVhbCBwYXJ0IG9mIHRoZSByZXN1bHQsIGFuZCBmaWxsIGluIHRoZSBpbWFnaW5hcnkgcGFydCBhcyAwLiAqLworICAgIGVsc2UgeworICAgICAgICAvKiBQeUZsb2F0X0FzRG91YmxlIHdpbGwgcmV0dXJuIC0xIG9uIGZhaWx1cmUgKi8KKyAgICAgICAgY3YucmVhbCA9IFB5RmxvYXRfQXNEb3VibGUob3ApOworICAgICAgICByZXR1cm4gY3Y7CisgICAgfQogfQogCiBzdGF0aWMgdm9pZAogY29tcGxleF9kZWFsbG9jKFB5T2JqZWN0ICpvcCkKIHsKLQlvcC0+b2JfdHlwZS0+dHBfZnJlZShvcCk7CisgICAgb3AtPm9iX3R5cGUtPnRwX2ZyZWUob3ApOwogfQogCiAKIHN0YXRpYyB2b2lkCiBjb21wbGV4X3RvX2J1ZihjaGFyICpidWYsIGludCBidWZzeiwgUHlDb21wbGV4T2JqZWN0ICp2LCBpbnQgcHJlY2lzaW9uKQogewotCWNoYXIgZm9ybWF0WzMyXTsKLQlpZiAodi0+Y3ZhbC5yZWFsID09IDAuKSB7Ci0JCWlmICghUHlfSVNfRklOSVRFKHYtPmN2YWwuaW1hZykpIHsKLQkJCWlmIChQeV9JU19OQU4odi0+Y3ZhbC5pbWFnKSkKLQkJCQlzdHJuY3B5KGJ1ZiwgIm5hbipqIiwgNik7Ci0JCQllbHNlIGlmIChjb3B5c2lnbigxLCB2LT5jdmFsLmltYWcpID09IDEpCi0JCQkJc3RybmNweShidWYsICJpbmYqaiIsIDYpOwotCQkJZWxzZQotCQkJCXN0cm5jcHkoYnVmLCAiLWluZipqIiwgNyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlQeU9TX3NucHJpbnRmKGZvcm1hdCwgc2l6ZW9mKGZvcm1hdCksICIlJS4laWciLCBwcmVjaXNpb24pOwotCQkJUHlPU19hc2NpaV9mb3JtYXRkKGJ1ZiwgYnVmc3ogLSAxLCBmb3JtYXQsIHYtPmN2YWwuaW1hZyk7Ci0JCQlzdHJuY2F0KGJ1ZiwgImoiLCAxKTsKLQkJfQotCX0gZWxzZSB7Ci0JCWNoYXIgcmVbNjRdLCBpbVs2NF07Ci0JCS8qIEZvcm1hdCBpbWFnaW5hcnkgcGFydCB3aXRoIHNpZ24sIHJlYWwgcGFydCB3aXRob3V0ICovCi0JCWlmICghUHlfSVNfRklOSVRFKHYtPmN2YWwucmVhbCkpIHsKLQkJCWlmIChQeV9JU19OQU4odi0+Y3ZhbC5yZWFsKSkKLQkJCQlzdHJuY3B5KHJlLCAibmFuIiwgNCk7Ci0JCQkvKiBlbHNlIGlmIChjb3B5c2lnbigxLCB2LT5jdmFsLnJlYWwpID09IDEpICovCi0JCQllbHNlIGlmICh2LT5jdmFsLnJlYWwgPiAwKQotCQkJCXN0cm5jcHkocmUsICJpbmYiLCA0KTsKLQkJCWVsc2UKLQkJCQlzdHJuY3B5KHJlLCAiLWluZiIsIDUpOwotCQl9Ci0JCWVsc2UgewotCQkJUHlPU19zbnByaW50Zihmb3JtYXQsIHNpemVvZihmb3JtYXQpLCAiJSUuJWlnIiwgcHJlY2lzaW9uKTsKLQkJCVB5T1NfYXNjaWlfZm9ybWF0ZChyZSwgc2l6ZW9mKHJlKSwgZm9ybWF0LCB2LT5jdmFsLnJlYWwpOwotCQl9Ci0JCWlmICghUHlfSVNfRklOSVRFKHYtPmN2YWwuaW1hZykpIHsKLQkJCWlmIChQeV9JU19OQU4odi0+Y3ZhbC5pbWFnKSkKLQkJCQlzdHJuY3B5KGltLCAiK25hbioiLCA2KTsKLQkJCS8qIGVsc2UgaWYgKGNvcHlzaWduKDEsIHYtPmN2YWwuaW1hZykgPT0gMSkgKi8KLQkJCWVsc2UgaWYgKHYtPmN2YWwuaW1hZyA+IDApCi0JCQkJc3RybmNweShpbSwgIitpbmYqIiwgNik7Ci0JCQllbHNlCi0JCQkJc3RybmNweShpbSwgIi1pbmYqIiwgNik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlQeU9TX3NucHJpbnRmKGZvcm1hdCwgc2l6ZW9mKGZvcm1hdCksICIlJSsuJWlnIiwgcHJlY2lzaW9uKTsKLQkJCVB5T1NfYXNjaWlfZm9ybWF0ZChpbSwgc2l6ZW9mKGltKSwgZm9ybWF0LCB2LT5jdmFsLmltYWcpOwotCQl9Ci0JCVB5T1Nfc25wcmludGYoYnVmLCBidWZzeiwgIiglcyVzaikiLCByZSwgaW0pOwotCX0KKyAgICBjaGFyIGZvcm1hdFszMl07CisgICAgaWYgKHYtPmN2YWwucmVhbCA9PSAwLikgeworICAgICAgICBpZiAoIVB5X0lTX0ZJTklURSh2LT5jdmFsLmltYWcpKSB7CisgICAgICAgICAgICBpZiAoUHlfSVNfTkFOKHYtPmN2YWwuaW1hZykpCisgICAgICAgICAgICAgICAgc3RybmNweShidWYsICJuYW4qaiIsIDYpOworICAgICAgICAgICAgZWxzZSBpZiAoY29weXNpZ24oMSwgdi0+Y3ZhbC5pbWFnKSA9PSAxKQorICAgICAgICAgICAgICAgIHN0cm5jcHkoYnVmLCAiaW5mKmoiLCA2KTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBzdHJuY3B5KGJ1ZiwgIi1pbmYqaiIsIDcpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgUHlPU19zbnByaW50Zihmb3JtYXQsIHNpemVvZihmb3JtYXQpLCAiJSUuJWlnIiwgcHJlY2lzaW9uKTsKKyAgICAgICAgICAgIFB5T1NfYXNjaWlfZm9ybWF0ZChidWYsIGJ1ZnN6IC0gMSwgZm9ybWF0LCB2LT5jdmFsLmltYWcpOworICAgICAgICAgICAgc3RybmNhdChidWYsICJqIiwgMSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBjaGFyIHJlWzY0XSwgaW1bNjRdOworICAgICAgICAvKiBGb3JtYXQgaW1hZ2luYXJ5IHBhcnQgd2l0aCBzaWduLCByZWFsIHBhcnQgd2l0aG91dCAqLworICAgICAgICBpZiAoIVB5X0lTX0ZJTklURSh2LT5jdmFsLnJlYWwpKSB7CisgICAgICAgICAgICBpZiAoUHlfSVNfTkFOKHYtPmN2YWwucmVhbCkpCisgICAgICAgICAgICAgICAgc3RybmNweShyZSwgIm5hbiIsIDQpOworICAgICAgICAgICAgLyogZWxzZSBpZiAoY29weXNpZ24oMSwgdi0+Y3ZhbC5yZWFsKSA9PSAxKSAqLworICAgICAgICAgICAgZWxzZSBpZiAodi0+Y3ZhbC5yZWFsID4gMCkKKyAgICAgICAgICAgICAgICBzdHJuY3B5KHJlLCAiaW5mIiwgNCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgc3RybmNweShyZSwgIi1pbmYiLCA1KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIFB5T1Nfc25wcmludGYoZm9ybWF0LCBzaXplb2YoZm9ybWF0KSwgIiUlLiVpZyIsIHByZWNpc2lvbik7CisgICAgICAgICAgICBQeU9TX2FzY2lpX2Zvcm1hdGQocmUsIHNpemVvZihyZSksIGZvcm1hdCwgdi0+Y3ZhbC5yZWFsKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIVB5X0lTX0ZJTklURSh2LT5jdmFsLmltYWcpKSB7CisgICAgICAgICAgICBpZiAoUHlfSVNfTkFOKHYtPmN2YWwuaW1hZykpCisgICAgICAgICAgICAgICAgc3RybmNweShpbSwgIituYW4qIiwgNik7CisgICAgICAgICAgICAvKiBlbHNlIGlmIChjb3B5c2lnbigxLCB2LT5jdmFsLmltYWcpID09IDEpICovCisgICAgICAgICAgICBlbHNlIGlmICh2LT5jdmFsLmltYWcgPiAwKQorICAgICAgICAgICAgICAgIHN0cm5jcHkoaW0sICIraW5mKiIsIDYpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHN0cm5jcHkoaW0sICItaW5mKiIsIDYpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgUHlPU19zbnByaW50Zihmb3JtYXQsIHNpemVvZihmb3JtYXQpLCAiJSUrLiVpZyIsIHByZWNpc2lvbik7CisgICAgICAgICAgICBQeU9TX2FzY2lpX2Zvcm1hdGQoaW0sIHNpemVvZihpbSksIGZvcm1hdCwgdi0+Y3ZhbC5pbWFnKTsKKyAgICAgICAgfQorICAgICAgICBQeU9TX3NucHJpbnRmKGJ1ZiwgYnVmc3osICIoJXMlc2opIiwgcmUsIGltKTsKKyAgICB9CiB9CiAKIHN0YXRpYyBpbnQKIGNvbXBsZXhfcHJpbnQoUHlDb21wbGV4T2JqZWN0ICp2LCBGSUxFICpmcCwgaW50IGZsYWdzKQogewotCWNoYXIgYnVmWzEwMF07Ci0JY29tcGxleF90b19idWYoYnVmLCBzaXplb2YoYnVmKSwgdiwKLQkJICAgICAgIChmbGFncyAmIFB5X1BSSU5UX1JBVykgPyBQUkVDX1NUUiA6IFBSRUNfUkVQUik7Ci0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCWZwdXRzKGJ1ZiwgZnApOwotCVB5X0VORF9BTExPV19USFJFQURTCi0JcmV0dXJuIDA7CisgICAgY2hhciBidWZbMTAwXTsKKyAgICBjb21wbGV4X3RvX2J1ZihidWYsIHNpemVvZihidWYpLCB2LAorICAgICAgICAgICAgICAgICAgIChmbGFncyAmIFB5X1BSSU5UX1JBVykgPyBQUkVDX1NUUiA6IFBSRUNfUkVQUik7CisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIGZwdXRzKGJ1ZiwgZnApOworICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjb21wbGV4X3JlcHIoUHlDb21wbGV4T2JqZWN0ICp2KQogewotCWNoYXIgYnVmWzEwMF07Ci0JY29tcGxleF90b19idWYoYnVmLCBzaXplb2YoYnVmKSwgdiwgUFJFQ19SRVBSKTsKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOworICAgIGNoYXIgYnVmWzEwMF07CisgICAgY29tcGxleF90b19idWYoYnVmLCBzaXplb2YoYnVmKSwgdiwgUFJFQ19SRVBSKTsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY29tcGxleF9zdHIoUHlDb21wbGV4T2JqZWN0ICp2KQogewotCWNoYXIgYnVmWzEwMF07Ci0JY29tcGxleF90b19idWYoYnVmLCBzaXplb2YoYnVmKSwgdiwgUFJFQ19TVFIpOwotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CisgICAgY2hhciBidWZbMTAwXTsKKyAgICBjb21wbGV4X3RvX2J1ZihidWYsIHNpemVvZihidWYpLCB2LCBQUkVDX1NUUik7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmKTsKIH0KIAogc3RhdGljIGxvbmcKIGNvbXBsZXhfaGFzaChQeUNvbXBsZXhPYmplY3QgKnYpCiB7Ci0JbG9uZyBoYXNocmVhbCwgaGFzaGltYWcsIGNvbWJpbmVkOwotCWhhc2hyZWFsID0gX1B5X0hhc2hEb3VibGUodi0+Y3ZhbC5yZWFsKTsKLQlpZiAoaGFzaHJlYWwgPT0gLTEpCi0JCXJldHVybiAtMTsKLQloYXNoaW1hZyA9IF9QeV9IYXNoRG91YmxlKHYtPmN2YWwuaW1hZyk7Ci0JaWYgKGhhc2hpbWFnID09IC0xKQotCQlyZXR1cm4gLTE7Ci0JLyogTm90ZTogIGlmIHRoZSBpbWFnaW5hcnkgcGFydCBpcyAwLCBoYXNoaW1hZyBpcyAwIG5vdywKLQkgKiBzbyB0aGUgZm9sbG93aW5nIHJldHVybnMgaGFzaHJlYWwgdW5jaGFuZ2VkLiAgVGhpcyBpcwotCSAqIGltcG9ydGFudCBiZWNhdXNlIG51bWJlcnMgb2YgZGlmZmVyZW50IHR5cGVzIHRoYXQKLQkgKiBjb21wYXJlIGVxdWFsIG11c3QgaGF2ZSB0aGUgc2FtZSBoYXNoIHZhbHVlLCBzbyB0aGF0Ci0JICogaGFzaCh4ICsgMCpqKSBtdXN0IGVxdWFsIGhhc2goeCkuCi0JICovCi0JY29tYmluZWQgPSBoYXNocmVhbCArIDEwMDAwMDMgKiBoYXNoaW1hZzsKLQlpZiAoY29tYmluZWQgPT0gLTEpCi0JCWNvbWJpbmVkID0gLTI7Ci0JcmV0dXJuIGNvbWJpbmVkOworICAgIGxvbmcgaGFzaHJlYWwsIGhhc2hpbWFnLCBjb21iaW5lZDsKKyAgICBoYXNocmVhbCA9IF9QeV9IYXNoRG91YmxlKHYtPmN2YWwucmVhbCk7CisgICAgaWYgKGhhc2hyZWFsID09IC0xKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaGFzaGltYWcgPSBfUHlfSGFzaERvdWJsZSh2LT5jdmFsLmltYWcpOworICAgIGlmIChoYXNoaW1hZyA9PSAtMSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIC8qIE5vdGU6ICBpZiB0aGUgaW1hZ2luYXJ5IHBhcnQgaXMgMCwgaGFzaGltYWcgaXMgMCBub3csCisgICAgICogc28gdGhlIGZvbGxvd2luZyByZXR1cm5zIGhhc2hyZWFsIHVuY2hhbmdlZC4gIFRoaXMgaXMKKyAgICAgKiBpbXBvcnRhbnQgYmVjYXVzZSBudW1iZXJzIG9mIGRpZmZlcmVudCB0eXBlcyB0aGF0CisgICAgICogY29tcGFyZSBlcXVhbCBtdXN0IGhhdmUgdGhlIHNhbWUgaGFzaCB2YWx1ZSwgc28gdGhhdAorICAgICAqIGhhc2goeCArIDAqaikgbXVzdCBlcXVhbCBoYXNoKHgpLgorICAgICAqLworICAgIGNvbWJpbmVkID0gaGFzaHJlYWwgKyAxMDAwMDAzICogaGFzaGltYWc7CisgICAgaWYgKGNvbWJpbmVkID09IC0xKQorICAgICAgICBjb21iaW5lZCA9IC0yOworICAgIHJldHVybiBjb21iaW5lZDsKIH0KIAogLyogVGhpcyBtYWNybyBtYXkgcmV0dXJuISAqLwogI2RlZmluZSBUT19DT01QTEVYKG9iaiwgYykgXAotCWlmIChQeUNvbXBsZXhfQ2hlY2sob2JqKSkgXAotCQljID0gKChQeUNvbXBsZXhPYmplY3QgKikob2JqKSktPmN2YWw7IFwKLQllbHNlIGlmICh0b19jb21wbGV4KCYob2JqKSwgJihjKSkgPCAwKSBcCi0JCXJldHVybiAob2JqKQorICAgIGlmIChQeUNvbXBsZXhfQ2hlY2sob2JqKSkgXAorICAgICAgICBjID0gKChQeUNvbXBsZXhPYmplY3QgKikob2JqKSktPmN2YWw7IFwKKyAgICBlbHNlIGlmICh0b19jb21wbGV4KCYob2JqKSwgJihjKSkgPCAwKSBcCisgICAgICAgIHJldHVybiAob2JqKQogCiBzdGF0aWMgaW50CiB0b19jb21wbGV4KFB5T2JqZWN0ICoqcG9iaiwgUHlfY29tcGxleCAqcGMpCkBAIC00NjgsMzUwICs0NjgsMzUwIEBACiAKICAgICBwYy0+cmVhbCA9IHBjLT5pbWFnID0gMC4wOwogICAgIGlmIChQeUludF9DaGVjayhvYmopKSB7Ci0gICAgICAgIHBjLT5yZWFsID0gUHlJbnRfQVNfTE9ORyhvYmopOwotICAgICAgICByZXR1cm4gMDsKKyAgICBwYy0+cmVhbCA9IFB5SW50X0FTX0xPTkcob2JqKTsKKyAgICByZXR1cm4gMDsKICAgICB9CiAgICAgaWYgKFB5TG9uZ19DaGVjayhvYmopKSB7Ci0gICAgICAgIHBjLT5yZWFsID0gUHlMb25nX0FzRG91YmxlKG9iaik7Ci0gICAgICAgIGlmIChwYy0+cmVhbCA9PSAtMS4wICYmIFB5RXJyX09jY3VycmVkKCkpIHsKLSAgICAgICAgICAgICpwb2JqID0gTlVMTDsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gMDsKKyAgICBwYy0+cmVhbCA9IFB5TG9uZ19Bc0RvdWJsZShvYmopOworICAgIGlmIChwYy0+cmVhbCA9PSAtMS4wICYmIFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgKnBvYmogPSBOVUxMOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiAwOwogICAgIH0KICAgICBpZiAoUHlGbG9hdF9DaGVjayhvYmopKSB7Ci0gICAgICAgIHBjLT5yZWFsID0gUHlGbG9hdF9Bc0RvdWJsZShvYmopOwotICAgICAgICByZXR1cm4gMDsKKyAgICBwYy0+cmVhbCA9IFB5RmxvYXRfQXNEb3VibGUob2JqKTsKKyAgICByZXR1cm4gMDsKICAgICB9CiAgICAgUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKICAgICAqcG9iaiA9IFB5X05vdEltcGxlbWVudGVkOwogICAgIHJldHVybiAtMTsKIH0KLQkJCisKIAogc3RhdGljIFB5T2JqZWN0ICoKIGNvbXBsZXhfYWRkKFB5Q29tcGxleE9iamVjdCAqdiwgUHlDb21wbGV4T2JqZWN0ICp3KQogewotCVB5X2NvbXBsZXggcmVzdWx0OwotCVB5RlBFX1NUQVJUX1BST1RFQ1QoImNvbXBsZXhfYWRkIiwgcmV0dXJuIDApCi0JcmVzdWx0ID0gY19zdW0odi0+Y3ZhbCx3LT5jdmFsKTsKLQlQeUZQRV9FTkRfUFJPVEVDVChyZXN1bHQpCi0JcmV0dXJuIFB5Q29tcGxleF9Gcm9tQ0NvbXBsZXgocmVzdWx0KTsKKyAgICBQeV9jb21wbGV4IHJlc3VsdDsKKyAgICBQeUZQRV9TVEFSVF9QUk9URUNUKCJjb21wbGV4X2FkZCIsIHJldHVybiAwKQorICAgIHJlc3VsdCA9IGNfc3VtKHYtPmN2YWwsdy0+Y3ZhbCk7CisgICAgUHlGUEVfRU5EX1BST1RFQ1QocmVzdWx0KQorICAgIHJldHVybiBQeUNvbXBsZXhfRnJvbUNDb21wbGV4KHJlc3VsdCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjb21wbGV4X3N1YihQeUNvbXBsZXhPYmplY3QgKnYsIFB5Q29tcGxleE9iamVjdCAqdykKIHsKLQlQeV9jb21wbGV4IHJlc3VsdDsKLQlQeUZQRV9TVEFSVF9QUk9URUNUKCJjb21wbGV4X3N1YiIsIHJldHVybiAwKQotCXJlc3VsdCA9IGNfZGlmZih2LT5jdmFsLHctPmN2YWwpOwotCVB5RlBFX0VORF9QUk9URUNUKHJlc3VsdCkKLQlyZXR1cm4gUHlDb21wbGV4X0Zyb21DQ29tcGxleChyZXN1bHQpOworICAgIFB5X2NvbXBsZXggcmVzdWx0OworICAgIFB5RlBFX1NUQVJUX1BST1RFQ1QoImNvbXBsZXhfc3ViIiwgcmV0dXJuIDApCisgICAgcmVzdWx0ID0gY19kaWZmKHYtPmN2YWwsdy0+Y3ZhbCk7CisgICAgUHlGUEVfRU5EX1BST1RFQ1QocmVzdWx0KQorICAgIHJldHVybiBQeUNvbXBsZXhfRnJvbUNDb21wbGV4KHJlc3VsdCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjb21wbGV4X211bChQeUNvbXBsZXhPYmplY3QgKnYsIFB5Q29tcGxleE9iamVjdCAqdykKIHsKLQlQeV9jb21wbGV4IHJlc3VsdDsKLQlQeUZQRV9TVEFSVF9QUk9URUNUKCJjb21wbGV4X211bCIsIHJldHVybiAwKQotCXJlc3VsdCA9IGNfcHJvZCh2LT5jdmFsLHctPmN2YWwpOwotCVB5RlBFX0VORF9QUk9URUNUKHJlc3VsdCkKLQlyZXR1cm4gUHlDb21wbGV4X0Zyb21DQ29tcGxleChyZXN1bHQpOworICAgIFB5X2NvbXBsZXggcmVzdWx0OworICAgIFB5RlBFX1NUQVJUX1BST1RFQ1QoImNvbXBsZXhfbXVsIiwgcmV0dXJuIDApCisgICAgcmVzdWx0ID0gY19wcm9kKHYtPmN2YWwsdy0+Y3ZhbCk7CisgICAgUHlGUEVfRU5EX1BST1RFQ1QocmVzdWx0KQorICAgIHJldHVybiBQeUNvbXBsZXhfRnJvbUNDb21wbGV4KHJlc3VsdCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjb21wbGV4X2RpdihQeUNvbXBsZXhPYmplY3QgKnYsIFB5Q29tcGxleE9iamVjdCAqdykKIHsKLQlQeV9jb21wbGV4IHF1b3Q7CisgICAgUHlfY29tcGxleCBxdW90OwogCi0JUHlGUEVfU1RBUlRfUFJPVEVDVCgiY29tcGxleF9kaXYiLCByZXR1cm4gMCkKLQllcnJubyA9IDA7Ci0JcXVvdCA9IGNfcXVvdCh2LT5jdmFsLHctPmN2YWwpOwotCVB5RlBFX0VORF9QUk9URUNUKHF1b3QpCi0JaWYgKGVycm5vID09IEVET00pIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1plcm9EaXZpc2lvbkVycm9yLCAiY29tcGxleCBkaXZpc2lvbiIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIFB5Q29tcGxleF9Gcm9tQ0NvbXBsZXgocXVvdCk7CisgICAgUHlGUEVfU1RBUlRfUFJPVEVDVCgiY29tcGxleF9kaXYiLCByZXR1cm4gMCkKKyAgICBlcnJubyA9IDA7CisgICAgcXVvdCA9IGNfcXVvdCh2LT5jdmFsLHctPmN2YWwpOworICAgIFB5RlBFX0VORF9QUk9URUNUKHF1b3QpCisgICAgaWYgKGVycm5vID09IEVET00pIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1plcm9EaXZpc2lvbkVycm9yLCAiY29tcGxleCBkaXZpc2lvbiIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIFB5Q29tcGxleF9Gcm9tQ0NvbXBsZXgocXVvdCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjb21wbGV4X2NsYXNzaWNfZGl2KFB5Q29tcGxleE9iamVjdCAqdiwgUHlDb21wbGV4T2JqZWN0ICp3KQogewotCVB5X2NvbXBsZXggcXVvdDsKKyAgICBQeV9jb21wbGV4IHF1b3Q7CiAKLQlpZiAoUHlfRGl2aXNpb25XYXJuaW5nRmxhZyA+PSAyICYmCi0JICAgIFB5RXJyX1dhcm4oUHlFeGNfRGVwcmVjYXRpb25XYXJuaW5nLAotCQkgICAgICAgImNsYXNzaWMgY29tcGxleCBkaXZpc2lvbiIpIDwgMCkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKFB5X0RpdmlzaW9uV2FybmluZ0ZsYWcgPj0gMiAmJgorICAgICAgICBQeUVycl9XYXJuKFB5RXhjX0RlcHJlY2F0aW9uV2FybmluZywKKyAgICAgICAgICAgICAgICAgICAiY2xhc3NpYyBjb21wbGV4IGRpdmlzaW9uIikgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCVB5RlBFX1NUQVJUX1BST1RFQ1QoImNvbXBsZXhfY2xhc3NpY19kaXYiLCByZXR1cm4gMCkKLQllcnJubyA9IDA7Ci0JcXVvdCA9IGNfcXVvdCh2LT5jdmFsLHctPmN2YWwpOwotCVB5RlBFX0VORF9QUk9URUNUKHF1b3QpCi0JaWYgKGVycm5vID09IEVET00pIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1plcm9EaXZpc2lvbkVycm9yLCAiY29tcGxleCBkaXZpc2lvbiIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIFB5Q29tcGxleF9Gcm9tQ0NvbXBsZXgocXVvdCk7CisgICAgUHlGUEVfU1RBUlRfUFJPVEVDVCgiY29tcGxleF9jbGFzc2ljX2RpdiIsIHJldHVybiAwKQorICAgIGVycm5vID0gMDsKKyAgICBxdW90ID0gY19xdW90KHYtPmN2YWwsdy0+Y3ZhbCk7CisgICAgUHlGUEVfRU5EX1BST1RFQ1QocXVvdCkKKyAgICBpZiAoZXJybm8gPT0gRURPTSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfWmVyb0RpdmlzaW9uRXJyb3IsICJjb21wbGV4IGRpdmlzaW9uIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlDb21wbGV4X0Zyb21DQ29tcGxleChxdW90KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNvbXBsZXhfcmVtYWluZGVyKFB5Q29tcGxleE9iamVjdCAqdiwgUHlDb21wbGV4T2JqZWN0ICp3KQogewotCVB5X2NvbXBsZXggZGl2LCBtb2Q7CisgICAgUHlfY29tcGxleCBkaXYsIG1vZDsKIAotCWlmIChQeUVycl9XYXJuKFB5RXhjX0RlcHJlY2F0aW9uV2FybmluZywKLQkJICAgICAgICJjb21wbGV4IGRpdm1vZCgpLCAvLyBhbmQgJSBhcmUgZGVwcmVjYXRlZCIpIDwgMCkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKFB5RXJyX1dhcm4oUHlFeGNfRGVwcmVjYXRpb25XYXJuaW5nLAorICAgICAgICAgICAgICAgICAgICJjb21wbGV4IGRpdm1vZCgpLCAvLyBhbmQgJSBhcmUgZGVwcmVjYXRlZCIpIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQllcnJubyA9IDA7Ci0JZGl2ID0gY19xdW90KHYtPmN2YWwsdy0+Y3ZhbCk7IC8qIFRoZSByYXcgZGl2aXNvciB2YWx1ZS4gKi8KLQlpZiAoZXJybm8gPT0gRURPTSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfWmVyb0RpdmlzaW9uRXJyb3IsICJjb21wbGV4IHJlbWFpbmRlciIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZGl2LnJlYWwgPSBmbG9vcihkaXYucmVhbCk7IC8qIFVzZSB0aGUgZmxvb3Igb2YgdGhlIHJlYWwgcGFydC4gKi8KLQlkaXYuaW1hZyA9IDAuMDsKLQltb2QgPSBjX2RpZmYodi0+Y3ZhbCwgY19wcm9kKHctPmN2YWwsIGRpdikpOworICAgIGVycm5vID0gMDsKKyAgICBkaXYgPSBjX3F1b3Qodi0+Y3ZhbCx3LT5jdmFsKTsgLyogVGhlIHJhdyBkaXZpc29yIHZhbHVlLiAqLworICAgIGlmIChlcnJubyA9PSBFRE9NKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19aZXJvRGl2aXNpb25FcnJvciwgImNvbXBsZXggcmVtYWluZGVyIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBkaXYucmVhbCA9IGZsb29yKGRpdi5yZWFsKTsgLyogVXNlIHRoZSBmbG9vciBvZiB0aGUgcmVhbCBwYXJ0LiAqLworICAgIGRpdi5pbWFnID0gMC4wOworICAgIG1vZCA9IGNfZGlmZih2LT5jdmFsLCBjX3Byb2Qody0+Y3ZhbCwgZGl2KSk7CiAKLQlyZXR1cm4gUHlDb21wbGV4X0Zyb21DQ29tcGxleChtb2QpOworICAgIHJldHVybiBQeUNvbXBsZXhfRnJvbUNDb21wbGV4KG1vZCk7CiB9CiAKIAogc3RhdGljIFB5T2JqZWN0ICoKIGNvbXBsZXhfZGl2bW9kKFB5Q29tcGxleE9iamVjdCAqdiwgUHlDb21wbGV4T2JqZWN0ICp3KQogewotCVB5X2NvbXBsZXggZGl2LCBtb2Q7Ci0JUHlPYmplY3QgKmQsICptLCAqejsKKyAgICBQeV9jb21wbGV4IGRpdiwgbW9kOworICAgIFB5T2JqZWN0ICpkLCAqbSwgKno7CiAKLQlpZiAoUHlFcnJfV2FybihQeUV4Y19EZXByZWNhdGlvbldhcm5pbmcsCi0JCSAgICAgICAiY29tcGxleCBkaXZtb2QoKSwgLy8gYW5kICUgYXJlIGRlcHJlY2F0ZWQiKSA8IDApCi0JCXJldHVybiBOVUxMOworICAgIGlmIChQeUVycl9XYXJuKFB5RXhjX0RlcHJlY2F0aW9uV2FybmluZywKKyAgICAgICAgICAgICAgICAgICAiY29tcGxleCBkaXZtb2QoKSwgLy8gYW5kICUgYXJlIGRlcHJlY2F0ZWQiKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JZXJybm8gPSAwOwotCWRpdiA9IGNfcXVvdCh2LT5jdmFsLHctPmN2YWwpOyAvKiBUaGUgcmF3IGRpdmlzb3IgdmFsdWUuICovCi0JaWYgKGVycm5vID09IEVET00pIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1plcm9EaXZpc2lvbkVycm9yLCAiY29tcGxleCBkaXZtb2QoKSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZGl2LnJlYWwgPSBmbG9vcihkaXYucmVhbCk7IC8qIFVzZSB0aGUgZmxvb3Igb2YgdGhlIHJlYWwgcGFydC4gKi8KLQlkaXYuaW1hZyA9IDAuMDsKLQltb2QgPSBjX2RpZmYodi0+Y3ZhbCwgY19wcm9kKHctPmN2YWwsIGRpdikpOwotCWQgPSBQeUNvbXBsZXhfRnJvbUNDb21wbGV4KGRpdik7Ci0JbSA9IFB5Q29tcGxleF9Gcm9tQ0NvbXBsZXgobW9kKTsKLQl6ID0gUHlUdXBsZV9QYWNrKDIsIGQsIG0pOwotCVB5X1hERUNSRUYoZCk7Ci0JUHlfWERFQ1JFRihtKTsKLQlyZXR1cm4gejsKKyAgICBlcnJubyA9IDA7CisgICAgZGl2ID0gY19xdW90KHYtPmN2YWwsdy0+Y3ZhbCk7IC8qIFRoZSByYXcgZGl2aXNvciB2YWx1ZS4gKi8KKyAgICBpZiAoZXJybm8gPT0gRURPTSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfWmVyb0RpdmlzaW9uRXJyb3IsICJjb21wbGV4IGRpdm1vZCgpIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBkaXYucmVhbCA9IGZsb29yKGRpdi5yZWFsKTsgLyogVXNlIHRoZSBmbG9vciBvZiB0aGUgcmVhbCBwYXJ0LiAqLworICAgIGRpdi5pbWFnID0gMC4wOworICAgIG1vZCA9IGNfZGlmZih2LT5jdmFsLCBjX3Byb2Qody0+Y3ZhbCwgZGl2KSk7CisgICAgZCA9IFB5Q29tcGxleF9Gcm9tQ0NvbXBsZXgoZGl2KTsKKyAgICBtID0gUHlDb21wbGV4X0Zyb21DQ29tcGxleChtb2QpOworICAgIHogPSBQeVR1cGxlX1BhY2soMiwgZCwgbSk7CisgICAgUHlfWERFQ1JFRihkKTsKKyAgICBQeV9YREVDUkVGKG0pOworICAgIHJldHVybiB6OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY29tcGxleF9wb3coUHlPYmplY3QgKnYsIFB5T2JqZWN0ICp3LCBQeU9iamVjdCAqeikKIHsKLQlQeV9jb21wbGV4IHA7Ci0JUHlfY29tcGxleCBleHBvbmVudDsKLQlsb25nIGludF9leHBvbmVudDsKLQlQeV9jb21wbGV4IGEsIGI7Ci0JVE9fQ09NUExFWCh2LCBhKTsKLQlUT19DT01QTEVYKHcsIGIpOworICAgIFB5X2NvbXBsZXggcDsKKyAgICBQeV9jb21wbGV4IGV4cG9uZW50OworICAgIGxvbmcgaW50X2V4cG9uZW50OworICAgIFB5X2NvbXBsZXggYSwgYjsKKyAgICBUT19DT01QTEVYKHYsIGEpOworICAgIFRPX0NPTVBMRVgodywgYik7CiAKLSAJaWYgKHohPVB5X05vbmUpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJjb21wbGV4IG1vZHVsbyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JUHlGUEVfU1RBUlRfUFJPVEVDVCgiY29tcGxleF9wb3ciLCByZXR1cm4gMCkKLQllcnJubyA9IDA7Ci0JZXhwb25lbnQgPSBiOwotCWludF9leHBvbmVudCA9IChsb25nKWV4cG9uZW50LnJlYWw7Ci0JaWYgKGV4cG9uZW50LmltYWcgPT0gMC4gJiYgZXhwb25lbnQucmVhbCA9PSBpbnRfZXhwb25lbnQpCi0JCXAgPSBjX3Bvd2koYSxpbnRfZXhwb25lbnQpOwotCWVsc2UKLQkJcCA9IGNfcG93KGEsZXhwb25lbnQpOworICAgIGlmICh6IT1QeV9Ob25lKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiY29tcGxleCBtb2R1bG8iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5RlBFX1NUQVJUX1BST1RFQ1QoImNvbXBsZXhfcG93IiwgcmV0dXJuIDApCisgICAgZXJybm8gPSAwOworICAgIGV4cG9uZW50ID0gYjsKKyAgICBpbnRfZXhwb25lbnQgPSAobG9uZylleHBvbmVudC5yZWFsOworICAgIGlmIChleHBvbmVudC5pbWFnID09IDAuICYmIGV4cG9uZW50LnJlYWwgPT0gaW50X2V4cG9uZW50KQorICAgICAgICBwID0gY19wb3dpKGEsaW50X2V4cG9uZW50KTsKKyAgICBlbHNlCisgICAgICAgIHAgPSBjX3BvdyhhLGV4cG9uZW50KTsKIAotCVB5RlBFX0VORF9QUk9URUNUKHApCi0JUHlfQURKVVNUX0VSQU5HRTIocC5yZWFsLCBwLmltYWcpOwotCWlmIChlcnJubyA9PSBFRE9NKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19aZXJvRGl2aXNpb25FcnJvciwKLQkJCQkiMC4wIHRvIGEgbmVnYXRpdmUgb3IgY29tcGxleCBwb3dlciIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZWxzZSBpZiAoZXJybm8gPT0gRVJBTkdFKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJCSJjb21wbGV4IGV4cG9uZW50aWF0aW9uIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gUHlDb21wbGV4X0Zyb21DQ29tcGxleChwKTsKKyAgICBQeUZQRV9FTkRfUFJPVEVDVChwKQorICAgIFB5X0FESlVTVF9FUkFOR0UyKHAucmVhbCwgcC5pbWFnKTsKKyAgICBpZiAoZXJybm8gPT0gRURPTSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfWmVyb0RpdmlzaW9uRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiMC4wIHRvIGEgbmVnYXRpdmUgb3IgY29tcGxleCBwb3dlciIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZWxzZSBpZiAoZXJybm8gPT0gRVJBTkdFKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImNvbXBsZXggZXhwb25lbnRpYXRpb24iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBQeUNvbXBsZXhfRnJvbUNDb21wbGV4KHApOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY29tcGxleF9pbnRfZGl2KFB5Q29tcGxleE9iamVjdCAqdiwgUHlDb21wbGV4T2JqZWN0ICp3KQogewotCVB5T2JqZWN0ICp0LCAqcjsKLQkKLQlpZiAoUHlFcnJfV2FybihQeUV4Y19EZXByZWNhdGlvbldhcm5pbmcsCi0JCSAgICAgICAiY29tcGxleCBkaXZtb2QoKSwgLy8gYW5kICUgYXJlIGRlcHJlY2F0ZWQiKSA8IDApCi0JCXJldHVybiBOVUxMOworICAgIFB5T2JqZWN0ICp0LCAqcjsKIAotCXQgPSBjb21wbGV4X2Rpdm1vZCh2LCB3KTsKLQlpZiAodCAhPSBOVUxMKSB7Ci0JCXIgPSBQeVR1cGxlX0dFVF9JVEVNKHQsIDApOwotCQlQeV9JTkNSRUYocik7Ci0JCVB5X0RFQ1JFRih0KTsKLQkJcmV0dXJuIHI7Ci0JfQotCXJldHVybiBOVUxMOworICAgIGlmIChQeUVycl9XYXJuKFB5RXhjX0RlcHJlY2F0aW9uV2FybmluZywKKyAgICAgICAgICAgICAgICAgICAiY29tcGxleCBkaXZtb2QoKSwgLy8gYW5kICUgYXJlIGRlcHJlY2F0ZWQiKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgdCA9IGNvbXBsZXhfZGl2bW9kKHYsIHcpOworICAgIGlmICh0ICE9IE5VTEwpIHsKKyAgICAgICAgciA9IFB5VHVwbGVfR0VUX0lURU0odCwgMCk7CisgICAgICAgIFB5X0lOQ1JFRihyKTsKKyAgICAgICAgUHlfREVDUkVGKHQpOworICAgICAgICByZXR1cm4gcjsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjb21wbGV4X25lZyhQeUNvbXBsZXhPYmplY3QgKnYpCiB7Ci0JUHlfY29tcGxleCBuZWc7Ci0JbmVnLnJlYWwgPSAtdi0+Y3ZhbC5yZWFsOwotCW5lZy5pbWFnID0gLXYtPmN2YWwuaW1hZzsKLQlyZXR1cm4gUHlDb21wbGV4X0Zyb21DQ29tcGxleChuZWcpOworICAgIFB5X2NvbXBsZXggbmVnOworICAgIG5lZy5yZWFsID0gLXYtPmN2YWwucmVhbDsKKyAgICBuZWcuaW1hZyA9IC12LT5jdmFsLmltYWc7CisgICAgcmV0dXJuIFB5Q29tcGxleF9Gcm9tQ0NvbXBsZXgobmVnKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNvbXBsZXhfcG9zKFB5Q29tcGxleE9iamVjdCAqdikKIHsKLQlpZiAoUHlDb21wbGV4X0NoZWNrRXhhY3QodikpIHsKLQkJUHlfSU5DUkVGKHYpOwotCQlyZXR1cm4gKFB5T2JqZWN0ICopdjsKLQl9Ci0JZWxzZQotCQlyZXR1cm4gUHlDb21wbGV4X0Zyb21DQ29tcGxleCh2LT5jdmFsKTsKKyAgICBpZiAoUHlDb21wbGV4X0NoZWNrRXhhY3QodikpIHsKKyAgICAgICAgUHlfSU5DUkVGKHYpOworICAgICAgICByZXR1cm4gKFB5T2JqZWN0ICopdjsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXR1cm4gUHlDb21wbGV4X0Zyb21DQ29tcGxleCh2LT5jdmFsKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNvbXBsZXhfYWJzKFB5Q29tcGxleE9iamVjdCAqdikKIHsKLQlkb3VibGUgcmVzdWx0OworICAgIGRvdWJsZSByZXN1bHQ7CiAKLQlQeUZQRV9TVEFSVF9QUk9URUNUKCJjb21wbGV4X2FicyIsIHJldHVybiAwKQotCXJlc3VsdCA9IGNfYWJzKHYtPmN2YWwpOwotCVB5RlBFX0VORF9QUk9URUNUKHJlc3VsdCkKKyAgICBQeUZQRV9TVEFSVF9QUk9URUNUKCJjb21wbGV4X2FicyIsIHJldHVybiAwKQorICAgIHJlc3VsdCA9IGNfYWJzKHYtPmN2YWwpOworICAgIFB5RlBFX0VORF9QUk9URUNUKHJlc3VsdCkKIAotCWlmIChlcnJubyA9PSBFUkFOR0UpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0JCQkJImFic29sdXRlIHZhbHVlIHRvbyBsYXJnZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShyZXN1bHQpOworICAgIGlmIChlcnJubyA9PSBFUkFOR0UpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiYWJzb2x1dGUgdmFsdWUgdG9vIGxhcmdlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKHJlc3VsdCk7CiB9CiAKIHN0YXRpYyBpbnQKIGNvbXBsZXhfbm9uemVybyhQeUNvbXBsZXhPYmplY3QgKnYpCiB7Ci0JcmV0dXJuIHYtPmN2YWwucmVhbCAhPSAwLjAgfHwgdi0+Y3ZhbC5pbWFnICE9IDAuMDsKKyAgICByZXR1cm4gdi0+Y3ZhbC5yZWFsICE9IDAuMCB8fCB2LT5jdmFsLmltYWcgIT0gMC4wOwogfQogCiBzdGF0aWMgaW50CiBjb21wbGV4X2NvZXJjZShQeU9iamVjdCAqKnB2LCBQeU9iamVjdCAqKnB3KQogewotCVB5X2NvbXBsZXggY3ZhbDsKLQljdmFsLmltYWcgPSAwLjsKLQlpZiAoUHlJbnRfQ2hlY2soKnB3KSkgewotCQljdmFsLnJlYWwgPSAoZG91YmxlKVB5SW50X0FzTG9uZygqcHcpOwotCQkqcHcgPSBQeUNvbXBsZXhfRnJvbUNDb21wbGV4KGN2YWwpOwotCQlQeV9JTkNSRUYoKnB2KTsKLQkJcmV0dXJuIDA7Ci0JfQotCWVsc2UgaWYgKFB5TG9uZ19DaGVjaygqcHcpKSB7Ci0JCWN2YWwucmVhbCA9IFB5TG9uZ19Bc0RvdWJsZSgqcHcpOwotCQlpZiAoY3ZhbC5yZWFsID09IC0xLjAgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJCXJldHVybiAtMTsKLQkJKnB3ID0gUHlDb21wbGV4X0Zyb21DQ29tcGxleChjdmFsKTsKLQkJUHlfSU5DUkVGKCpwdik7Ci0JCXJldHVybiAwOwotCX0KLQllbHNlIGlmIChQeUZsb2F0X0NoZWNrKCpwdykpIHsKLQkJY3ZhbC5yZWFsID0gUHlGbG9hdF9Bc0RvdWJsZSgqcHcpOwotCQkqcHcgPSBQeUNvbXBsZXhfRnJvbUNDb21wbGV4KGN2YWwpOwotCQlQeV9JTkNSRUYoKnB2KTsKLQkJcmV0dXJuIDA7Ci0JfQotCWVsc2UgaWYgKFB5Q29tcGxleF9DaGVjaygqcHcpKSB7Ci0JCVB5X0lOQ1JFRigqcHYpOwotCQlQeV9JTkNSRUYoKnB3KTsKLQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiAxOyAvKiBDYW4ndCBkbyBpdCAqLworICAgIFB5X2NvbXBsZXggY3ZhbDsKKyAgICBjdmFsLmltYWcgPSAwLjsKKyAgICBpZiAoUHlJbnRfQ2hlY2soKnB3KSkgeworICAgICAgICBjdmFsLnJlYWwgPSAoZG91YmxlKVB5SW50X0FzTG9uZygqcHcpOworICAgICAgICAqcHcgPSBQeUNvbXBsZXhfRnJvbUNDb21wbGV4KGN2YWwpOworICAgICAgICBQeV9JTkNSRUYoKnB2KTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGVsc2UgaWYgKFB5TG9uZ19DaGVjaygqcHcpKSB7CisgICAgICAgIGN2YWwucmVhbCA9IFB5TG9uZ19Bc0RvdWJsZSgqcHcpOworICAgICAgICBpZiAoY3ZhbC5yZWFsID09IC0xLjAgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgKnB3ID0gUHlDb21wbGV4X0Zyb21DQ29tcGxleChjdmFsKTsKKyAgICAgICAgUHlfSU5DUkVGKCpwdik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBlbHNlIGlmIChQeUZsb2F0X0NoZWNrKCpwdykpIHsKKyAgICAgICAgY3ZhbC5yZWFsID0gUHlGbG9hdF9Bc0RvdWJsZSgqcHcpOworICAgICAgICAqcHcgPSBQeUNvbXBsZXhfRnJvbUNDb21wbGV4KGN2YWwpOworICAgICAgICBQeV9JTkNSRUYoKnB2KTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGVsc2UgaWYgKFB5Q29tcGxleF9DaGVjaygqcHcpKSB7CisgICAgICAgIFB5X0lOQ1JFRigqcHYpOworICAgICAgICBQeV9JTkNSRUYoKnB3KTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAxOyAvKiBDYW4ndCBkbyBpdCAqLwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY29tcGxleF9yaWNoY29tcGFyZShQeU9iamVjdCAqdiwgUHlPYmplY3QgKncsIGludCBvcCkKIHsKLQlpbnQgYzsKLQlQeV9jb21wbGV4IGksIGo7Ci0JUHlPYmplY3QgKnJlczsKKyAgICBpbnQgYzsKKyAgICBQeV9jb21wbGV4IGksIGo7CisgICAgUHlPYmplY3QgKnJlczsKIAotCWMgPSBQeU51bWJlcl9Db2VyY2VFeCgmdiwgJncpOwotCWlmIChjIDwgMCkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKGMgPiAwKSB7Ci0JCVB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7Ci0JCXJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKLQl9Ci0JLyogTWFrZSBzdXJlIGJvdGggYXJndW1lbnRzIGFyZSBjb21wbGV4LiAqLwotCWlmICghKFB5Q29tcGxleF9DaGVjayh2KSAmJiBQeUNvbXBsZXhfQ2hlY2sodykpKSB7Ci0JCVB5X0RFQ1JFRih2KTsKLQkJUHlfREVDUkVGKHcpOwotCQlQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOwotCQlyZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7Ci0JfQorICAgIGMgPSBQeU51bWJlcl9Db2VyY2VFeCgmdiwgJncpOworICAgIGlmIChjIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKGMgPiAwKSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7CisgICAgICAgIHJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKKyAgICB9CisgICAgLyogTWFrZSBzdXJlIGJvdGggYXJndW1lbnRzIGFyZSBjb21wbGV4LiAqLworICAgIGlmICghKFB5Q29tcGxleF9DaGVjayh2KSAmJiBQeUNvbXBsZXhfQ2hlY2sodykpKSB7CisgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgUHlfREVDUkVGKHcpOworICAgICAgICBQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOworICAgICAgICByZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7CisgICAgfQogCi0JaSA9ICgoUHlDb21wbGV4T2JqZWN0ICopdiktPmN2YWw7Ci0JaiA9ICgoUHlDb21wbGV4T2JqZWN0ICopdyktPmN2YWw7Ci0JUHlfREVDUkVGKHYpOwotCVB5X0RFQ1JFRih3KTsKKyAgICBpID0gKChQeUNvbXBsZXhPYmplY3QgKil2KS0+Y3ZhbDsKKyAgICBqID0gKChQeUNvbXBsZXhPYmplY3QgKil3KS0+Y3ZhbDsKKyAgICBQeV9ERUNSRUYodik7CisgICAgUHlfREVDUkVGKHcpOwogCi0JaWYgKG9wICE9IFB5X0VRICYmIG9wICE9IFB5X05FKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkibm8gb3JkZXJpbmcgcmVsYXRpb24gaXMgZGVmaW5lZCBmb3IgY29tcGxleCBudW1iZXJzIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAob3AgIT0gUHlfRVEgJiYgb3AgIT0gUHlfTkUpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICJubyBvcmRlcmluZyByZWxhdGlvbiBpcyBkZWZpbmVkIGZvciBjb21wbGV4IG51bWJlcnMiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaWYgKChpLnJlYWwgPT0gai5yZWFsICYmIGkuaW1hZyA9PSBqLmltYWcpID09IChvcCA9PSBQeV9FUSkpCi0JCXJlcyA9IFB5X1RydWU7Ci0JZWxzZQotCQlyZXMgPSBQeV9GYWxzZTsKKyAgICBpZiAoKGkucmVhbCA9PSBqLnJlYWwgJiYgaS5pbWFnID09IGouaW1hZykgPT0gKG9wID09IFB5X0VRKSkKKyAgICAgICAgcmVzID0gUHlfVHJ1ZTsKKyAgICBlbHNlCisgICAgICAgIHJlcyA9IFB5X0ZhbHNlOwogCi0JUHlfSU5DUkVGKHJlcyk7Ci0JcmV0dXJuIHJlczsKKyAgICBQeV9JTkNSRUYocmVzKTsKKyAgICByZXR1cm4gcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY29tcGxleF9pbnQoUHlPYmplY3QgKnYpCiB7Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJICAgImNhbid0IGNvbnZlcnQgY29tcGxleCB0byBpbnQiKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgImNhbid0IGNvbnZlcnQgY29tcGxleCB0byBpbnQiKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNvbXBsZXhfbG9uZyhQeU9iamVjdCAqdikKIHsKLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkgICAiY2FuJ3QgY29udmVydCBjb21wbGV4IHRvIGxvbmciKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgImNhbid0IGNvbnZlcnQgY29tcGxleCB0byBsb25nIik7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjb21wbGV4X2Zsb2F0KFB5T2JqZWN0ICp2KQogewotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCSAgICJjYW4ndCBjb252ZXJ0IGNvbXBsZXggdG8gZmxvYXQiKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgImNhbid0IGNvbnZlcnQgY29tcGxleCB0byBmbG9hdCIpOworICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY29tcGxleF9jb25qdWdhdGUoUHlPYmplY3QgKnNlbGYpCiB7Ci0JUHlfY29tcGxleCBjOwotCWMgPSAoKFB5Q29tcGxleE9iamVjdCAqKXNlbGYpLT5jdmFsOwotCWMuaW1hZyA9IC1jLmltYWc7Ci0JcmV0dXJuIFB5Q29tcGxleF9Gcm9tQ0NvbXBsZXgoYyk7CisgICAgUHlfY29tcGxleCBjOworICAgIGMgPSAoKFB5Q29tcGxleE9iamVjdCAqKXNlbGYpLT5jdmFsOworICAgIGMuaW1hZyA9IC1jLmltYWc7CisgICAgcmV0dXJuIFB5Q29tcGxleF9Gcm9tQ0NvbXBsZXgoYyk7CiB9CiAKIFB5RG9jX1NUUlZBUihjb21wbGV4X2Nvbmp1Z2F0ZV9kb2MsCkBAIC04MjIsMTggKzgyMiwxOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGNvbXBsZXhfZ2V0bmV3YXJncyhQeUNvbXBsZXhPYmplY3QgKnYpCiB7Ci0JUHlfY29tcGxleCBjID0gdi0+Y3ZhbDsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKGRkKSIsIGMucmVhbCwgYy5pbWFnKTsKKyAgICBQeV9jb21wbGV4IGMgPSB2LT5jdmFsOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIoZGQpIiwgYy5yZWFsLCBjLmltYWcpOwogfQogCiAjaWYgMAogc3RhdGljIFB5T2JqZWN0ICoKIGNvbXBsZXhfaXNfZmluaXRlKFB5T2JqZWN0ICpzZWxmKQogewotCVB5X2NvbXBsZXggYzsKLQljID0gKChQeUNvbXBsZXhPYmplY3QgKilzZWxmKS0+Y3ZhbDsKLQlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKChsb25nKShQeV9JU19GSU5JVEUoYy5yZWFsKSAmJgotCQkJCSAgICAgIFB5X0lTX0ZJTklURShjLmltYWcpKSk7CisgICAgUHlfY29tcGxleCBjOworICAgIGMgPSAoKFB5Q29tcGxleE9iamVjdCAqKXNlbGYpLT5jdmFsOworICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoKGxvbmcpKFB5X0lTX0ZJTklURShjLnJlYWwpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfSVNfRklOSVRFKGMuaW1hZykpKTsKIH0KIAogUHlEb2NfU1RSVkFSKGNvbXBsZXhfaXNfZmluaXRlX2RvYywKQEAgLTg0MywzNDIgKzg0MywzNDIgQEAKICNlbmRpZgogCiBzdGF0aWMgUHlNZXRob2REZWYgY29tcGxleF9tZXRob2RzW10gPSB7Ci0JeyJjb25qdWdhdGUiLAkoUHlDRnVuY3Rpb24pY29tcGxleF9jb25qdWdhdGUsCU1FVEhfTk9BUkdTLAotCSBjb21wbGV4X2Nvbmp1Z2F0ZV9kb2N9LAorICAgIHsiY29uanVnYXRlIiwgICAgICAgKFB5Q0Z1bmN0aW9uKWNvbXBsZXhfY29uanVnYXRlLCBNRVRIX05PQVJHUywKKyAgICAgY29tcGxleF9jb25qdWdhdGVfZG9jfSwKICNpZiAwCi0JeyJpc19maW5pdGUiLAkoUHlDRnVuY3Rpb24pY29tcGxleF9pc19maW5pdGUsCU1FVEhfTk9BUkdTLAotCSBjb21wbGV4X2lzX2Zpbml0ZV9kb2N9LAorICAgIHsiaXNfZmluaXRlIiwgICAgICAgKFB5Q0Z1bmN0aW9uKWNvbXBsZXhfaXNfZmluaXRlLCBNRVRIX05PQVJHUywKKyAgICAgY29tcGxleF9pc19maW5pdGVfZG9jfSwKICNlbmRpZgotCXsiX19nZXRuZXdhcmdzX18iLAkoUHlDRnVuY3Rpb24pY29tcGxleF9nZXRuZXdhcmdzLAlNRVRIX05PQVJHU30sCi0Je05VTEwsCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7Il9fZ2V0bmV3YXJnc19fIiwgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWNvbXBsZXhfZ2V0bmV3YXJncywgICAgICAgIE1FVEhfTk9BUkdTfSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogc3RhdGljIFB5TWVtYmVyRGVmIGNvbXBsZXhfbWVtYmVyc1tdID0gewotCXsicmVhbCIsIFRfRE9VQkxFLCBvZmZzZXRvZihQeUNvbXBsZXhPYmplY3QsIGN2YWwucmVhbCksIFJFQURPTkxZLAotCSAidGhlIHJlYWwgcGFydCBvZiBhIGNvbXBsZXggbnVtYmVyIn0sCi0JeyJpbWFnIiwgVF9ET1VCTEUsIG9mZnNldG9mKFB5Q29tcGxleE9iamVjdCwgY3ZhbC5pbWFnKSwgUkVBRE9OTFksCi0JICJ0aGUgaW1hZ2luYXJ5IHBhcnQgb2YgYSBjb21wbGV4IG51bWJlciJ9LAotCXswfSwKKyAgICB7InJlYWwiLCBUX0RPVUJMRSwgb2Zmc2V0b2YoUHlDb21wbGV4T2JqZWN0LCBjdmFsLnJlYWwpLCBSRUFET05MWSwKKyAgICAgInRoZSByZWFsIHBhcnQgb2YgYSBjb21wbGV4IG51bWJlciJ9LAorICAgIHsiaW1hZyIsIFRfRE9VQkxFLCBvZmZzZXRvZihQeUNvbXBsZXhPYmplY3QsIGN2YWwuaW1hZyksIFJFQURPTkxZLAorICAgICAidGhlIGltYWdpbmFyeSBwYXJ0IG9mIGEgY29tcGxleCBudW1iZXIifSwKKyAgICB7MH0sCiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKgogY29tcGxleF9zdWJ0eXBlX2Zyb21fc3RyaW5nKFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKnYpCiB7Ci0JY29uc3QgY2hhciAqcywgKnN0YXJ0OwotCWNoYXIgKmVuZDsKLQlkb3VibGUgeD0wLjAsIHk9MC4wLCB6OwotCWludCBnb3RfcmU9MCwgZ290X2ltPTAsIGdvdF9icmFja2V0PTAsIGRvbmU9MDsKLQlpbnQgZGlnaXRfb3JfZG90OwotCWludCBzd19lcnJvcj0wOwotCWludCBzaWduOwotCWNoYXIgYnVmZmVyWzI1Nl07IC8qIEZvciBlcnJvcnMgKi8KKyAgICBjb25zdCBjaGFyICpzLCAqc3RhcnQ7CisgICAgY2hhciAqZW5kOworICAgIGRvdWJsZSB4PTAuMCwgeT0wLjAsIHo7CisgICAgaW50IGdvdF9yZT0wLCBnb3RfaW09MCwgZ290X2JyYWNrZXQ9MCwgZG9uZT0wOworICAgIGludCBkaWdpdF9vcl9kb3Q7CisgICAgaW50IHN3X2Vycm9yPTA7CisgICAgaW50IHNpZ247CisgICAgY2hhciBidWZmZXJbMjU2XTsgLyogRm9yIGVycm9ycyAqLwogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQljaGFyIHNfYnVmZmVyWzI1Nl07CisgICAgY2hhciBzX2J1ZmZlclsyNTZdOwogI2VuZGlmCi0JUHlfc3NpemVfdCBsZW47CisgICAgUHlfc3NpemVfdCBsZW47CiAKLQlpZiAoUHlTdHJpbmdfQ2hlY2sodikpIHsKLQkJcyA9IFB5U3RyaW5nX0FTX1NUUklORyh2KTsKLQkJbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUodik7Ci0JfQorICAgIGlmIChQeVN0cmluZ19DaGVjayh2KSkgeworICAgICAgICBzID0gUHlTdHJpbmdfQVNfU1RSSU5HKHYpOworICAgICAgICBsZW4gPSBQeVN0cmluZ19HRVRfU0laRSh2KTsKKyAgICB9CiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCWVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayh2KSkgewotCQlpZiAoUHlVbmljb2RlX0dFVF9TSVpFKHYpID49IChQeV9zc2l6ZV90KXNpemVvZihzX2J1ZmZlcikpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSAiY29tcGxleCgpIGxpdGVyYWwgdG9vIGxhcmdlIHRvIGNvbnZlcnQiKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWlmIChQeVVuaWNvZGVfRW5jb2RlRGVjaW1hbChQeVVuaWNvZGVfQVNfVU5JQ09ERSh2KSwKLQkJCQkJICAgIFB5VW5pY29kZV9HRVRfU0laRSh2KSwKLQkJCQkJICAgIHNfYnVmZmVyLAotCQkJCQkgICAgTlVMTCkpCi0JCQlyZXR1cm4gTlVMTDsKLQkJcyA9IHNfYnVmZmVyOwotCQlsZW4gPSBzdHJsZW4ocyk7Ci0JfQorICAgIGVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayh2KSkgeworICAgICAgICBpZiAoUHlVbmljb2RlX0dFVF9TSVpFKHYpID49IChQeV9zc2l6ZV90KXNpemVvZihzX2J1ZmZlcikpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgImNvbXBsZXgoKSBsaXRlcmFsIHRvbyBsYXJnZSB0byBjb252ZXJ0Iik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoUHlVbmljb2RlX0VuY29kZURlY2ltYWwoUHlVbmljb2RlX0FTX1VOSUNPREUodiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX1NJWkUodiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzX2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHMgPSBzX2J1ZmZlcjsKKyAgICAgICAgbGVuID0gc3RybGVuKHMpOworICAgIH0KICNlbmRpZgotCWVsc2UgaWYgKFB5T2JqZWN0X0FzQ2hhckJ1ZmZlcih2LCAmcywgJmxlbikpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiY29tcGxleCgpIGFyZyBpcyBub3QgYSBzdHJpbmciKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGVsc2UgaWYgKFB5T2JqZWN0X0FzQ2hhckJ1ZmZlcih2LCAmcywgJmxlbikpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjb21wbGV4KCkgYXJnIGlzIG5vdCBhIHN0cmluZyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQkvKiBwb3NpdGlvbiBvbiBmaXJzdCBub25ibGFuayAqLwotCXN0YXJ0ID0gczsKLQl3aGlsZSAoKnMgJiYgaXNzcGFjZShQeV9DSEFSTUFTSygqcykpKQotCQlzKys7Ci0JaWYgKHNbMF0gPT0gJ1wwJykgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkiY29tcGxleCgpIGFyZyBpcyBhbiBlbXB0eSBzdHJpbmciKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChzWzBdID09ICcoJykgewotCQkvKiBTa2lwIG92ZXIgcG9zc2libGUgYnJhY2tldCBmcm9tIHJlcHIoKS4gKi8KLQkJZ290X2JyYWNrZXQgPSAxOwotCQlzKys7Ci0JCXdoaWxlICgqcyAmJiBpc3NwYWNlKFB5X0NIQVJNQVNLKCpzKSkpCi0JCQlzKys7Ci0JfQorICAgIC8qIHBvc2l0aW9uIG9uIGZpcnN0IG5vbmJsYW5rICovCisgICAgc3RhcnQgPSBzOworICAgIHdoaWxlICgqcyAmJiBpc3NwYWNlKFB5X0NIQVJNQVNLKCpzKSkpCisgICAgICAgIHMrKzsKKyAgICBpZiAoc1swXSA9PSAnXDAnKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImNvbXBsZXgoKSBhcmcgaXMgYW4gZW1wdHkgc3RyaW5nIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoc1swXSA9PSAnKCcpIHsKKyAgICAgICAgLyogU2tpcCBvdmVyIHBvc3NpYmxlIGJyYWNrZXQgZnJvbSByZXByKCkuICovCisgICAgICAgIGdvdF9icmFja2V0ID0gMTsKKyAgICAgICAgcysrOworICAgICAgICB3aGlsZSAoKnMgJiYgaXNzcGFjZShQeV9DSEFSTUFTSygqcykpKQorICAgICAgICAgICAgcysrOworICAgIH0KIAotCXogPSAtMS4wOwotCXNpZ24gPSAxOwotCWRvIHsKKyAgICB6ID0gLTEuMDsKKyAgICBzaWduID0gMTsKKyAgICBkbyB7CiAKLQkJc3dpdGNoICgqcykgeworICAgICAgICBzd2l0Y2ggKCpzKSB7CiAKLQkJY2FzZSAnXDAnOgotCQkJaWYgKHMtc3RhcnQgIT0gbGVuKSB7Ci0JCQkJUHlFcnJfU2V0U3RyaW5nKAotCQkJCQlQeUV4Y19WYWx1ZUVycm9yLAotCQkJCQkiY29tcGxleCgpIGFyZyBjb250YWlucyBhIG51bGwgYnl0ZSIpOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQkJaWYoIWRvbmUpIHN3X2Vycm9yPTE7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSAnXDAnOgorICAgICAgICAgICAgaWYgKHMtc3RhcnQgIT0gbGVuKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKAorICAgICAgICAgICAgICAgICAgICBQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAiY29tcGxleCgpIGFyZyBjb250YWlucyBhIG51bGwgYnl0ZSIpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoIWRvbmUpIHN3X2Vycm9yPTE7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlICcpJzoKLQkJCWlmICghZ290X2JyYWNrZXQgfHwgIShnb3RfcmUgfHwgZ290X2ltKSkgewotCQkJCXN3X2Vycm9yPTE7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlnb3RfYnJhY2tldD0wOwotCQkJZG9uZT0xOwotCQkJcysrOwotCQkJd2hpbGUgKCpzICYmIGlzc3BhY2UoUHlfQ0hBUk1BU0soKnMpKSkKLQkJCQlzKys7Ci0JCQlpZiAoKnMpIHN3X2Vycm9yPTE7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSAnKSc6CisgICAgICAgICAgICBpZiAoIWdvdF9icmFja2V0IHx8ICEoZ290X3JlIHx8IGdvdF9pbSkpIHsKKyAgICAgICAgICAgICAgICBzd19lcnJvcj0xOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZ290X2JyYWNrZXQ9MDsKKyAgICAgICAgICAgIGRvbmU9MTsKKyAgICAgICAgICAgIHMrKzsKKyAgICAgICAgICAgIHdoaWxlICgqcyAmJiBpc3NwYWNlKFB5X0NIQVJNQVNLKCpzKSkpCisgICAgICAgICAgICAgICAgcysrOworICAgICAgICAgICAgaWYgKCpzKSBzd19lcnJvcj0xOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSAnLSc6Ci0JCQlzaWduID0gLTE7Ci0JCQkJLyogRmFsbHRocm91Z2ggKi8KLQkJY2FzZSAnKyc6Ci0JCQlpZiAoZG9uZSkgIHN3X2Vycm9yPTE7Ci0JCQlzKys7Ci0JCQlpZiAgKCAgKnM9PSdcMCd8fCpzPT0nKyd8fCpzPT0nLSd8fCpzPT0nKSd8fAotCQkJICAgICAgIGlzc3BhY2UoUHlfQ0hBUk1BU0soKnMpKSAgKSAgc3dfZXJyb3I9MTsKLQkJCWJyZWFrOworICAgICAgICBjYXNlICctJzoKKyAgICAgICAgICAgIHNpZ24gPSAtMTsKKyAgICAgICAgICAgICAgICAvKiBGYWxsdGhyb3VnaCAqLworICAgICAgICBjYXNlICcrJzoKKyAgICAgICAgICAgIGlmIChkb25lKSAgc3dfZXJyb3I9MTsKKyAgICAgICAgICAgIHMrKzsKKyAgICAgICAgICAgIGlmICAoICAqcz09J1wwJ3x8KnM9PScrJ3x8KnM9PSctJ3x8KnM9PScpJ3x8CisgICAgICAgICAgICAgICAgICAgaXNzcGFjZShQeV9DSEFSTUFTSygqcykpICApICBzd19lcnJvcj0xOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSAnSic6Ci0JCWNhc2UgJ2onOgotCQkJaWYgKGdvdF9pbSB8fCBkb25lKSB7Ci0JCQkJc3dfZXJyb3IgPSAxOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgICh6PDAuMCkgewotCQkJCXk9c2lnbjsKLQkJCX0KLQkJCWVsc2V7Ci0JCQkJeT1zaWduKno7Ci0JCQl9Ci0JCQlnb3RfaW09MTsKLQkJCXMrKzsKLQkJCWlmICAoKnMhPScrJyAmJiAqcyE9Jy0nICkKLQkJCQlkb25lPTE7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSAnSic6CisgICAgICAgIGNhc2UgJ2onOgorICAgICAgICAgICAgaWYgKGdvdF9pbSB8fCBkb25lKSB7CisgICAgICAgICAgICAgICAgc3dfZXJyb3IgPSAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgICh6PDAuMCkgeworICAgICAgICAgICAgICAgIHk9c2lnbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2V7CisgICAgICAgICAgICAgICAgeT1zaWduKno7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBnb3RfaW09MTsKKyAgICAgICAgICAgIHMrKzsKKyAgICAgICAgICAgIGlmICAoKnMhPScrJyAmJiAqcyE9Jy0nICkKKyAgICAgICAgICAgICAgICBkb25lPTE7CisgICAgICAgICAgICBicmVhazsKIAotCQlkZWZhdWx0OgotCQkJaWYgKGlzc3BhY2UoUHlfQ0hBUk1BU0soKnMpKSkgewotCQkJCXdoaWxlICgqcyAmJiBpc3NwYWNlKFB5X0NIQVJNQVNLKCpzKSkpCi0JCQkJCXMrKzsKLQkJCQlpZiAoKnMgJiYgKnMgIT0gJyknKQotCQkJCQlzd19lcnJvcj0xOwotCQkJCWVsc2UKLQkJCQkJZG9uZSA9IDE7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlkaWdpdF9vcl9kb3QgPQotCQkJCSgqcz09Jy4nIHx8IGlzZGlnaXQoUHlfQ0hBUk1BU0soKnMpKSk7Ci0JCQlpZiAgKGRvbmV8fCFkaWdpdF9vcl9kb3QpIHsKLQkJCQlzd19lcnJvcj0xOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZXJybm8gPSAwOwotCQkJUHlGUEVfU1RBUlRfUFJPVEVDVCgic3RydG9kIiwgcmV0dXJuIDApCi0JCQl6ID0gUHlPU19hc2NpaV9zdHJ0b2QocywgJmVuZCkgOwotCQkJUHlGUEVfRU5EX1BST1RFQ1QoeikKLQkJCWlmIChlcnJubyA9PSBFUkFOR0UgJiYgZmFicyh6KSA+PSAxLjApIHsKLQkJCQlQeU9TX3NucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksCi0JCQkJCSJmbG9hdCgpIG91dCBvZiByYW5nZTogJS4xNTBzIiwgcyk7Ci0JCQkJUHlFcnJfU2V0U3RyaW5nKAotCQkJCQlQeUV4Y19WYWx1ZUVycm9yLAotCQkJCQlidWZmZXIpOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQkJcz1lbmQ7Ci0JCQlpZiAgKCpzPT0nSicgfHwgKnM9PSdqJykgeworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgaWYgKGlzc3BhY2UoUHlfQ0hBUk1BU0soKnMpKSkgeworICAgICAgICAgICAgICAgIHdoaWxlICgqcyAmJiBpc3NwYWNlKFB5X0NIQVJNQVNLKCpzKSkpCisgICAgICAgICAgICAgICAgICAgIHMrKzsKKyAgICAgICAgICAgICAgICBpZiAoKnMgJiYgKnMgIT0gJyknKQorICAgICAgICAgICAgICAgICAgICBzd19lcnJvcj0xOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgZG9uZSA9IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkaWdpdF9vcl9kb3QgPQorICAgICAgICAgICAgICAgICgqcz09Jy4nIHx8IGlzZGlnaXQoUHlfQ0hBUk1BU0soKnMpKSk7CisgICAgICAgICAgICBpZiAgKGRvbmV8fCFkaWdpdF9vcl9kb3QpIHsKKyAgICAgICAgICAgICAgICBzd19lcnJvcj0xOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZXJybm8gPSAwOworICAgICAgICAgICAgUHlGUEVfU1RBUlRfUFJPVEVDVCgic3RydG9kIiwgcmV0dXJuIDApCisgICAgICAgICAgICB6ID0gUHlPU19hc2NpaV9zdHJ0b2QocywgJmVuZCkgOworICAgICAgICAgICAgUHlGUEVfRU5EX1BST1RFQ1QoeikKKyAgICAgICAgICAgIGlmIChlcnJubyA9PSBFUkFOR0UgJiYgZmFicyh6KSA+PSAxLjApIHsKKyAgICAgICAgICAgICAgICBQeU9TX3NucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksCisgICAgICAgICAgICAgICAgICAgICJmbG9hdCgpIG91dCBvZiByYW5nZTogJS4xNTBzIiwgcyk7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKAorICAgICAgICAgICAgICAgICAgICBQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICBidWZmZXIpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcz1lbmQ7CisgICAgICAgICAgICBpZiAgKCpzPT0nSicgfHwgKnM9PSdqJykgewogCi0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAgKGdvdF9yZSkgewotCQkJCXN3X2Vycm9yPTE7Ci0JCQkJYnJlYWs7Ci0JCQl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAgKGdvdF9yZSkgeworICAgICAgICAgICAgICAgIHN3X2Vycm9yPTE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CiAKLQkJCQkvKiBhY2NlcHQgYSByZWFsIHBhcnQgKi8KLQkJCXg9c2lnbip6OwotCQkJZ290X3JlPTE7Ci0JCQlpZiAgKGdvdF9pbSkgIGRvbmU9MTsKLQkJCXogPSAtMS4wOwotCQkJc2lnbiA9IDE7Ci0JCQlicmVhazsKKyAgICAgICAgICAgICAgICAvKiBhY2NlcHQgYSByZWFsIHBhcnQgKi8KKyAgICAgICAgICAgIHg9c2lnbip6OworICAgICAgICAgICAgZ290X3JlPTE7CisgICAgICAgICAgICBpZiAgKGdvdF9pbSkgIGRvbmU9MTsKKyAgICAgICAgICAgIHogPSAtMS4wOworICAgICAgICAgICAgc2lnbiA9IDE7CisgICAgICAgICAgICBicmVhazsKIAotCQl9ICAvKiBlbmQgb2Ygc3dpdGNoICAqLworICAgICAgICB9ICAvKiBlbmQgb2Ygc3dpdGNoICAqLwogCi0JfSB3aGlsZSAocyAtIHN0YXJ0IDwgbGVuICYmICFzd19lcnJvcik7CisgICAgfSB3aGlsZSAocyAtIHN0YXJ0IDwgbGVuICYmICFzd19lcnJvcik7CiAKLQlpZiAoc3dfZXJyb3IgfHwgZ290X2JyYWNrZXQpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJImNvbXBsZXgoKSBhcmcgaXMgYSBtYWxmb3JtZWQgc3RyaW5nIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoc3dfZXJyb3IgfHwgZ290X2JyYWNrZXQpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiY29tcGxleCgpIGFyZyBpcyBhIG1hbGZvcm1lZCBzdHJpbmciKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JcmV0dXJuIGNvbXBsZXhfc3VidHlwZV9mcm9tX2RvdWJsZXModHlwZSwgeCwgeSk7CisgICAgcmV0dXJuIGNvbXBsZXhfc3VidHlwZV9mcm9tX2RvdWJsZXModHlwZSwgeCwgeSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjb21wbGV4X25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlQeU9iamVjdCAqciwgKmksICp0bXAsICpmOwotCVB5TnVtYmVyTWV0aG9kcyAqbmJyLCAqbmJpID0gTlVMTDsKLQlQeV9jb21wbGV4IGNyLCBjaTsKLQlpbnQgb3duX3IgPSAwOwotCWludCBjcl9pc19jb21wbGV4ID0gMDsKLQlpbnQgY2lfaXNfY29tcGxleCA9IDA7Ci0Jc3RhdGljIFB5T2JqZWN0ICpjb21wbGV4c3RyOwotCXN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsicmVhbCIsICJpbWFnIiwgMH07CisgICAgUHlPYmplY3QgKnIsICppLCAqdG1wLCAqZjsKKyAgICBQeU51bWJlck1ldGhvZHMgKm5iciwgKm5iaSA9IE5VTEw7CisgICAgUHlfY29tcGxleCBjciwgY2k7CisgICAgaW50IG93bl9yID0gMDsKKyAgICBpbnQgY3JfaXNfY29tcGxleCA9IDA7CisgICAgaW50IGNpX2lzX2NvbXBsZXggPSAwOworICAgIHN0YXRpYyBQeU9iamVjdCAqY29tcGxleHN0cjsKKyAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7InJlYWwiLCAiaW1hZyIsIDB9OwogCi0JciA9IFB5X0ZhbHNlOwotCWkgPSBOVUxMOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJ8T086Y29tcGxleCIsIGt3bGlzdCwKLQkJCQkJICZyLCAmaSkpCi0JCXJldHVybiBOVUxMOworICAgIHIgPSBQeV9GYWxzZTsKKyAgICBpID0gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAifE9POmNvbXBsZXgiLCBrd2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnIsICZpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkvKiBTcGVjaWFsLWNhc2UgZm9yIGEgc2luZ2xlIGFyZ3VtZW50IHdoZW4gdHlwZShhcmcpIGlzIGNvbXBsZXguICovCi0JaWYgKFB5Q29tcGxleF9DaGVja0V4YWN0KHIpICYmIGkgPT0gTlVMTCAmJgotCSAgICB0eXBlID09ICZQeUNvbXBsZXhfVHlwZSkgewotCQkvKiBOb3RlIHRoYXQgd2UgY2FuJ3Qga25vdyB3aGV0aGVyIGl0J3Mgc2FmZSB0byByZXR1cm4KLQkJICAgYSBjb21wbGV4ICpzdWJjbGFzcyogaW5zdGFuY2UgYXMtaXMsIGhlbmNlIHRoZSByZXN0cmljdGlvbgotCQkgICB0byBleGFjdCBjb21wbGV4ZXMgaGVyZS4gIElmIGVpdGhlciB0aGUgaW5wdXQgb3IgdGhlCi0JCSAgIG91dHB1dCBpcyBhIGNvbXBsZXggc3ViY2xhc3MsIGl0IHdpbGwgYmUgaGFuZGxlZCBiZWxvdyAKLQkJICAgYXMgYSBub24tb3J0aG9nb25hbCB2ZWN0b3IuICAqLwotCQlQeV9JTkNSRUYocik7Ci0JCXJldHVybiByOwotCX0KLQlpZiAoUHlTdHJpbmdfQ2hlY2socikgfHwgUHlVbmljb2RlX0NoZWNrKHIpKSB7Ci0JCWlmIChpICE9IE5VTEwpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJCSJjb21wbGV4KCkgY2FuJ3QgdGFrZSBzZWNvbmQgYXJnIgotCQkJCQkiIGlmIGZpcnN0IGlzIGEgc3RyaW5nIik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlyZXR1cm4gY29tcGxleF9zdWJ0eXBlX2Zyb21fc3RyaW5nKHR5cGUsIHIpOwotCX0KLQlpZiAoaSAhPSBOVUxMICYmIChQeVN0cmluZ19DaGVjayhpKSB8fCBQeVVuaWNvZGVfQ2hlY2soaSkpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJImNvbXBsZXgoKSBzZWNvbmQgYXJnIGNhbid0IGJlIGEgc3RyaW5nIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICAvKiBTcGVjaWFsLWNhc2UgZm9yIGEgc2luZ2xlIGFyZ3VtZW50IHdoZW4gdHlwZShhcmcpIGlzIGNvbXBsZXguICovCisgICAgaWYgKFB5Q29tcGxleF9DaGVja0V4YWN0KHIpICYmIGkgPT0gTlVMTCAmJgorICAgICAgICB0eXBlID09ICZQeUNvbXBsZXhfVHlwZSkgeworICAgICAgICAvKiBOb3RlIHRoYXQgd2UgY2FuJ3Qga25vdyB3aGV0aGVyIGl0J3Mgc2FmZSB0byByZXR1cm4KKyAgICAgICAgICAgYSBjb21wbGV4ICpzdWJjbGFzcyogaW5zdGFuY2UgYXMtaXMsIGhlbmNlIHRoZSByZXN0cmljdGlvbgorICAgICAgICAgICB0byBleGFjdCBjb21wbGV4ZXMgaGVyZS4gIElmIGVpdGhlciB0aGUgaW5wdXQgb3IgdGhlCisgICAgICAgICAgIG91dHB1dCBpcyBhIGNvbXBsZXggc3ViY2xhc3MsIGl0IHdpbGwgYmUgaGFuZGxlZCBiZWxvdworICAgICAgICAgICBhcyBhIG5vbi1vcnRob2dvbmFsIHZlY3Rvci4gICovCisgICAgICAgIFB5X0lOQ1JFRihyKTsKKyAgICAgICAgcmV0dXJuIHI7CisgICAgfQorICAgIGlmIChQeVN0cmluZ19DaGVjayhyKSB8fCBQeVVuaWNvZGVfQ2hlY2socikpIHsKKyAgICAgICAgaWYgKGkgIT0gTlVMTCkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29tcGxleCgpIGNhbid0IHRha2Ugc2Vjb25kIGFyZyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGlmIGZpcnN0IGlzIGEgc3RyaW5nIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY29tcGxleF9zdWJ0eXBlX2Zyb21fc3RyaW5nKHR5cGUsIHIpOworICAgIH0KKyAgICBpZiAoaSAhPSBOVUxMICYmIChQeVN0cmluZ19DaGVjayhpKSB8fCBQeVVuaWNvZGVfQ2hlY2soaSkpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiY29tcGxleCgpIHNlY29uZCBhcmcgY2FuJ3QgYmUgYSBzdHJpbmciKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JLyogWFhYIEhhY2sgdG8gc3VwcG9ydCBjbGFzc2VzIHdpdGggX19jb21wbGV4X18gbWV0aG9kICovCi0JaWYgKGNvbXBsZXhzdHIgPT0gTlVMTCkgewotCQljb21wbGV4c3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19jb21wbGV4X18iKTsKLQkJaWYgKGNvbXBsZXhzdHIgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCX0KLQlmID0gUHlPYmplY3RfR2V0QXR0cihyLCBjb21wbGV4c3RyKTsKLQlpZiAoZiA9PSBOVUxMKQotCQlQeUVycl9DbGVhcigpOwotCWVsc2UgewotCQlQeU9iamVjdCAqYXJncyA9IFB5VHVwbGVfTmV3KDApOwotCQlpZiAoYXJncyA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCXIgPSBQeUV2YWxfQ2FsbE9iamVjdChmLCBhcmdzKTsKLQkJUHlfREVDUkVGKGFyZ3MpOwotCQlQeV9ERUNSRUYoZik7Ci0JCWlmIChyID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQkJb3duX3IgPSAxOwotCX0KLQluYnIgPSByLT5vYl90eXBlLT50cF9hc19udW1iZXI7Ci0JaWYgKGkgIT0gTlVMTCkKLQkJbmJpID0gaS0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyOwotCWlmIChuYnIgPT0gTlVMTCB8fCBuYnItPm5iX2Zsb2F0ID09IE5VTEwgfHwKLQkgICAgKChpICE9IE5VTEwpICYmIChuYmkgPT0gTlVMTCB8fCBuYmktPm5iX2Zsb2F0ID09IE5VTEwpKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJICAgImNvbXBsZXgoKSBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nIG9yIGEgbnVtYmVyIik7Ci0JCWlmIChvd25fcikgewotCQkJUHlfREVDUkVGKHIpOwotCQl9Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICAvKiBYWFggSGFjayB0byBzdXBwb3J0IGNsYXNzZXMgd2l0aCBfX2NvbXBsZXhfXyBtZXRob2QgKi8KKyAgICBpZiAoY29tcGxleHN0ciA9PSBOVUxMKSB7CisgICAgICAgIGNvbXBsZXhzdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2NvbXBsZXhfXyIpOworICAgICAgICBpZiAoY29tcGxleHN0ciA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGYgPSBQeU9iamVjdF9HZXRBdHRyKHIsIGNvbXBsZXhzdHIpOworICAgIGlmIChmID09IE5VTEwpCisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgZWxzZSB7CisgICAgICAgIFB5T2JqZWN0ICphcmdzID0gUHlUdXBsZV9OZXcoMCk7CisgICAgICAgIGlmIChhcmdzID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgciA9IFB5RXZhbF9DYWxsT2JqZWN0KGYsIGFyZ3MpOworICAgICAgICBQeV9ERUNSRUYoYXJncyk7CisgICAgICAgIFB5X0RFQ1JFRihmKTsKKyAgICAgICAgaWYgKHIgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBvd25fciA9IDE7CisgICAgfQorICAgIG5iciA9IHItPm9iX3R5cGUtPnRwX2FzX251bWJlcjsKKyAgICBpZiAoaSAhPSBOVUxMKQorICAgICAgICBuYmkgPSBpLT5vYl90eXBlLT50cF9hc19udW1iZXI7CisgICAgaWYgKG5iciA9PSBOVUxMIHx8IG5ici0+bmJfZmxvYXQgPT0gTlVMTCB8fAorICAgICAgICAoKGkgIT0gTlVMTCkgJiYgKG5iaSA9PSBOVUxMIHx8IG5iaS0+bmJfZmxvYXQgPT0gTlVMTCkpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgImNvbXBsZXgoKSBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nIG9yIGEgbnVtYmVyIik7CisgICAgICAgIGlmIChvd25fcikgeworICAgICAgICAgICAgUHlfREVDUkVGKHIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCS8qIElmIHdlIGdldCB0aGlzIGZhciwgdGhlbiB0aGUgInJlYWwiIGFuZCAiaW1hZyIgcGFydHMgc2hvdWxkCi0JICAgYm90aCBiZSB0cmVhdGVkIGFzIG51bWJlcnMsIGFuZCB0aGUgY29uc3RydWN0b3Igc2hvdWxkIHJldHVybiBhCi0JICAgY29tcGxleCBudW1iZXIgZXF1YWwgdG8gKHJlYWwgKyBpbWFnKjFqKS4KKyAgICAvKiBJZiB3ZSBnZXQgdGhpcyBmYXIsIHRoZW4gdGhlICJyZWFsIiBhbmQgImltYWciIHBhcnRzIHNob3VsZAorICAgICAgIGJvdGggYmUgdHJlYXRlZCBhcyBudW1iZXJzLCBhbmQgdGhlIGNvbnN0cnVjdG9yIHNob3VsZCByZXR1cm4gYQorICAgICAgIGNvbXBsZXggbnVtYmVyIGVxdWFsIHRvIChyZWFsICsgaW1hZyoxaikuCiAKLSAJICAgTm90ZSB0aGF0IHdlIGRvIE5PVCBhc3N1bWUgdGhlIGlucHV0IHRvIGFscmVhZHkgYmUgaW4gY2Fub25pY2FsCi0JICAgZm9ybTsgdGhlICJyZWFsIiBhbmQgImltYWciIHBhcnRzIG1pZ2h0IHRoZW1zZWx2ZXMgYmUgY29tcGxleAotCSAgIG51bWJlcnMsIHdoaWNoIHNsaWdodGx5IGNvbXBsaWNhdGVzIHRoZSBjb2RlIGJlbG93LiAqLwotCWlmIChQeUNvbXBsZXhfQ2hlY2socikpIHsKLQkJLyogTm90ZSB0aGF0IGlmIHIgaXMgb2YgYSBjb21wbGV4IHN1YnR5cGUsIHdlJ3JlIG9ubHkKLQkJICAgcmV0YWluaW5nIGl0cyByZWFsICYgaW1hZyBwYXJ0cyBoZXJlLCBhbmQgdGhlIHJldHVybgotCQkgICB2YWx1ZSBpcyAocHJvcGVybHkpIG9mIHRoZSBidWlsdGluIGNvbXBsZXggdHlwZS4gKi8KLQkJY3IgPSAoKFB5Q29tcGxleE9iamVjdCopciktPmN2YWw7Ci0JCWNyX2lzX2NvbXBsZXggPSAxOwotCQlpZiAob3duX3IpIHsKLQkJCVB5X0RFQ1JFRihyKTsKLQkJfQotCX0KLQllbHNlIHsKLQkJLyogVGhlICJyZWFsIiBwYXJ0IHJlYWxseSBpcyBlbnRpcmVseSByZWFsLCBhbmQgY29udHJpYnV0ZXMKLQkJICAgbm90aGluZyBpbiB0aGUgaW1hZ2luYXJ5IGRpcmVjdGlvbi4gIAotCQkgICBKdXN0IHRyZWF0IGl0IGFzIGEgZG91YmxlLiAqLwotCQl0bXAgPSBQeU51bWJlcl9GbG9hdChyKTsKLQkJaWYgKG93bl9yKSB7Ci0JCQkvKiByIHdhcyBhIG5ld2x5IGNyZWF0ZWQgY29tcGxleCBudW1iZXIsIHJhdGhlcgotCQkJICAgdGhhbiB0aGUgb3JpZ2luYWwgInJlYWwiIGFyZ3VtZW50LiAqLwotCQkJUHlfREVDUkVGKHIpOwotCQl9Ci0JCWlmICh0bXAgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQlpZiAoIVB5RmxvYXRfQ2hlY2sodG1wKSkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkJImZsb2F0KHIpIGRpZG4ndCByZXR1cm4gYSBmbG9hdCIpOwotCQkJUHlfREVDUkVGKHRtcCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQljci5yZWFsID0gUHlGbG9hdF9Bc0RvdWJsZSh0bXApOwotCQljci5pbWFnID0gMC4wOyAvKiBTaHV0IHVwIGNvbXBpbGVyIHdhcm5pbmcgKi8KLQkJUHlfREVDUkVGKHRtcCk7Ci0JfQotCWlmIChpID09IE5VTEwpIHsKLQkJY2kucmVhbCA9IDAuMDsKLQl9Ci0JZWxzZSBpZiAoUHlDb21wbGV4X0NoZWNrKGkpKSB7Ci0JCWNpID0gKChQeUNvbXBsZXhPYmplY3QqKWkpLT5jdmFsOwotCQljaV9pc19jb21wbGV4ID0gMTsKLQl9IGVsc2UgewotCQkvKiBUaGUgImltYWciIHBhcnQgcmVhbGx5IGlzIGVudGlyZWx5IGltYWdpbmFyeSwgYW5kCi0JCSAgIGNvbnRyaWJ1dGVzIG5vdGhpbmcgaW4gdGhlIHJlYWwgZGlyZWN0aW9uLgotCQkgICBKdXN0IHRyZWF0IGl0IGFzIGEgZG91YmxlLiAqLwotCQl0bXAgPSAoKm5iaS0+bmJfZmxvYXQpKGkpOwotCQlpZiAodG1wID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQkJY2kucmVhbCA9IFB5RmxvYXRfQXNEb3VibGUodG1wKTsKLQkJUHlfREVDUkVGKHRtcCk7Ci0JfQotCS8qICBJZiB0aGUgaW5wdXQgd2FzIGluIGNhbm9uaWNhbCBmb3JtLCB0aGVuIHRoZSAicmVhbCIgYW5kICJpbWFnIgotCSAgICBwYXJ0cyBhcmUgcmVhbCBudW1iZXJzLCBzbyB0aGF0IGNpLmltYWcgYW5kIGNyLmltYWcgYXJlIHplcm8uCi0JICAgIFdlIG5lZWQgdGhpcyBjb3JyZWN0aW9uIGluIGNhc2UgdGhleSB3ZXJlIG5vdCByZWFsIG51bWJlcnMuICovCisgICAgICAgTm90ZSB0aGF0IHdlIGRvIE5PVCBhc3N1bWUgdGhlIGlucHV0IHRvIGFscmVhZHkgYmUgaW4gY2Fub25pY2FsCisgICAgICAgZm9ybTsgdGhlICJyZWFsIiBhbmQgImltYWciIHBhcnRzIG1pZ2h0IHRoZW1zZWx2ZXMgYmUgY29tcGxleAorICAgICAgIG51bWJlcnMsIHdoaWNoIHNsaWdodGx5IGNvbXBsaWNhdGVzIHRoZSBjb2RlIGJlbG93LiAqLworICAgIGlmIChQeUNvbXBsZXhfQ2hlY2socikpIHsKKyAgICAgICAgLyogTm90ZSB0aGF0IGlmIHIgaXMgb2YgYSBjb21wbGV4IHN1YnR5cGUsIHdlJ3JlIG9ubHkKKyAgICAgICAgICAgcmV0YWluaW5nIGl0cyByZWFsICYgaW1hZyBwYXJ0cyBoZXJlLCBhbmQgdGhlIHJldHVybgorICAgICAgICAgICB2YWx1ZSBpcyAocHJvcGVybHkpIG9mIHRoZSBidWlsdGluIGNvbXBsZXggdHlwZS4gKi8KKyAgICAgICAgY3IgPSAoKFB5Q29tcGxleE9iamVjdCopciktPmN2YWw7CisgICAgICAgIGNyX2lzX2NvbXBsZXggPSAxOworICAgICAgICBpZiAob3duX3IpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLyogVGhlICJyZWFsIiBwYXJ0IHJlYWxseSBpcyBlbnRpcmVseSByZWFsLCBhbmQgY29udHJpYnV0ZXMKKyAgICAgICAgICAgbm90aGluZyBpbiB0aGUgaW1hZ2luYXJ5IGRpcmVjdGlvbi4KKyAgICAgICAgICAgSnVzdCB0cmVhdCBpdCBhcyBhIGRvdWJsZS4gKi8KKyAgICAgICAgdG1wID0gUHlOdW1iZXJfRmxvYXQocik7CisgICAgICAgIGlmIChvd25fcikgeworICAgICAgICAgICAgLyogciB3YXMgYSBuZXdseSBjcmVhdGVkIGNvbXBsZXggbnVtYmVyLCByYXRoZXIKKyAgICAgICAgICAgICAgIHRoYW4gdGhlIG9yaWdpbmFsICJyZWFsIiBhcmd1bWVudC4gKi8KKyAgICAgICAgICAgIFB5X0RFQ1JFRihyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodG1wID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKCFQeUZsb2F0X0NoZWNrKHRtcCkpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZsb2F0KHIpIGRpZG4ndCByZXR1cm4gYSBmbG9hdCIpOworICAgICAgICAgICAgUHlfREVDUkVGKHRtcCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBjci5yZWFsID0gUHlGbG9hdF9Bc0RvdWJsZSh0bXApOworICAgICAgICBjci5pbWFnID0gMC4wOyAvKiBTaHV0IHVwIGNvbXBpbGVyIHdhcm5pbmcgKi8KKyAgICAgICAgUHlfREVDUkVGKHRtcCk7CisgICAgfQorICAgIGlmIChpID09IE5VTEwpIHsKKyAgICAgICAgY2kucmVhbCA9IDAuMDsKKyAgICB9CisgICAgZWxzZSBpZiAoUHlDb21wbGV4X0NoZWNrKGkpKSB7CisgICAgICAgIGNpID0gKChQeUNvbXBsZXhPYmplY3QqKWkpLT5jdmFsOworICAgICAgICBjaV9pc19jb21wbGV4ID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBUaGUgImltYWciIHBhcnQgcmVhbGx5IGlzIGVudGlyZWx5IGltYWdpbmFyeSwgYW5kCisgICAgICAgICAgIGNvbnRyaWJ1dGVzIG5vdGhpbmcgaW4gdGhlIHJlYWwgZGlyZWN0aW9uLgorICAgICAgICAgICBKdXN0IHRyZWF0IGl0IGFzIGEgZG91YmxlLiAqLworICAgICAgICB0bXAgPSAoKm5iaS0+bmJfZmxvYXQpKGkpOworICAgICAgICBpZiAodG1wID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgY2kucmVhbCA9IFB5RmxvYXRfQXNEb3VibGUodG1wKTsKKyAgICAgICAgUHlfREVDUkVGKHRtcCk7CisgICAgfQorICAgIC8qICBJZiB0aGUgaW5wdXQgd2FzIGluIGNhbm9uaWNhbCBmb3JtLCB0aGVuIHRoZSAicmVhbCIgYW5kICJpbWFnIgorICAgICAgICBwYXJ0cyBhcmUgcmVhbCBudW1iZXJzLCBzbyB0aGF0IGNpLmltYWcgYW5kIGNyLmltYWcgYXJlIHplcm8uCisgICAgICAgIFdlIG5lZWQgdGhpcyBjb3JyZWN0aW9uIGluIGNhc2UgdGhleSB3ZXJlIG5vdCByZWFsIG51bWJlcnMuICovCiAKLQlpZiAoY2lfaXNfY29tcGxleCkgewotCQljci5yZWFsIC09IGNpLmltYWc7Ci0JfQotCWlmIChjcl9pc19jb21wbGV4KSB7Ci0JCWNpLnJlYWwgKz0gY3IuaW1hZzsKLQl9Ci0JcmV0dXJuIGNvbXBsZXhfc3VidHlwZV9mcm9tX2RvdWJsZXModHlwZSwgY3IucmVhbCwgY2kucmVhbCk7CisgICAgaWYgKGNpX2lzX2NvbXBsZXgpIHsKKyAgICAgICAgY3IucmVhbCAtPSBjaS5pbWFnOworICAgIH0KKyAgICBpZiAoY3JfaXNfY29tcGxleCkgeworICAgICAgICBjaS5yZWFsICs9IGNyLmltYWc7CisgICAgfQorICAgIHJldHVybiBjb21wbGV4X3N1YnR5cGVfZnJvbV9kb3VibGVzKHR5cGUsIGNyLnJlYWwsIGNpLnJlYWwpOwogfQogCiBQeURvY19TVFJWQVIoY29tcGxleF9kb2MsCkBAIC0xMTg4LDg2ICsxMTg4LDg2IEBACiAiVGhpcyBpcyBlcXVpdmFsZW50IHRvIChyZWFsICsgaW1hZyoxaikgd2hlcmUgaW1hZyBkZWZhdWx0cyB0byAwLiIpOwogCiBzdGF0aWMgUHlOdW1iZXJNZXRob2RzIGNvbXBsZXhfYXNfbnVtYmVyID0gewotCShiaW5hcnlmdW5jKWNvbXBsZXhfYWRkLCAJCS8qIG5iX2FkZCAqLwotCShiaW5hcnlmdW5jKWNvbXBsZXhfc3ViLCAJCS8qIG5iX3N1YnRyYWN0ICovCi0JKGJpbmFyeWZ1bmMpY29tcGxleF9tdWwsIAkJLyogbmJfbXVsdGlwbHkgKi8KLQkoYmluYXJ5ZnVuYyljb21wbGV4X2NsYXNzaWNfZGl2LAkvKiBuYl9kaXZpZGUgKi8KLQkoYmluYXJ5ZnVuYyljb21wbGV4X3JlbWFpbmRlciwJCS8qIG5iX3JlbWFpbmRlciAqLwotCShiaW5hcnlmdW5jKWNvbXBsZXhfZGl2bW9kLAkJLyogbmJfZGl2bW9kICovCi0JKHRlcm5hcnlmdW5jKWNvbXBsZXhfcG93LAkJLyogbmJfcG93ZXIgKi8KLQkodW5hcnlmdW5jKWNvbXBsZXhfbmVnLAkJCS8qIG5iX25lZ2F0aXZlICovCi0JKHVuYXJ5ZnVuYyljb21wbGV4X3BvcywJCQkvKiBuYl9wb3NpdGl2ZSAqLwotCSh1bmFyeWZ1bmMpY29tcGxleF9hYnMsCQkJLyogbmJfYWJzb2x1dGUgKi8KLQkoaW5xdWlyeSljb21wbGV4X25vbnplcm8sCQkvKiBuYl9ub256ZXJvICovCi0JMCwJCQkJCS8qIG5iX2ludmVydCAqLwotCTAsCQkJCQkvKiBuYl9sc2hpZnQgKi8KLQkwLAkJCQkJLyogbmJfcnNoaWZ0ICovCi0JMCwJCQkJCS8qIG5iX2FuZCAqLwotCTAsCQkJCQkvKiBuYl94b3IgKi8KLQkwLAkJCQkJLyogbmJfb3IgKi8KLQljb21wbGV4X2NvZXJjZSwJCQkJLyogbmJfY29lcmNlICovCi0JY29tcGxleF9pbnQsCQkJCS8qIG5iX2ludCAqLwotCWNvbXBsZXhfbG9uZywJCQkJLyogbmJfbG9uZyAqLwotCWNvbXBsZXhfZmxvYXQsCQkJCS8qIG5iX2Zsb2F0ICovCi0JMCwJCQkJCS8qIG5iX29jdCAqLwotCTAsCQkJCQkvKiBuYl9oZXggKi8KLQkwLAkJCQkJLyogbmJfaW5wbGFjZV9hZGQgKi8KLQkwLAkJCQkJLyogbmJfaW5wbGFjZV9zdWJ0cmFjdCAqLwotCTAsCQkJCQkvKiBuYl9pbnBsYWNlX211bHRpcGx5Ki8KLQkwLAkJCQkJLyogbmJfaW5wbGFjZV9kaXZpZGUgKi8KLQkwLAkJCQkJLyogbmJfaW5wbGFjZV9yZW1haW5kZXIgKi8KLQkwLCAJCQkJCS8qIG5iX2lucGxhY2VfcG93ZXIgKi8KLQkwLAkJCQkJLyogbmJfaW5wbGFjZV9sc2hpZnQgKi8KLQkwLAkJCQkJLyogbmJfaW5wbGFjZV9yc2hpZnQgKi8KLQkwLAkJCQkJLyogbmJfaW5wbGFjZV9hbmQgKi8KLQkwLAkJCQkJLyogbmJfaW5wbGFjZV94b3IgKi8KLQkwLAkJCQkJLyogbmJfaW5wbGFjZV9vciAqLwotCShiaW5hcnlmdW5jKWNvbXBsZXhfaW50X2RpdiwJCS8qIG5iX2Zsb29yX2RpdmlkZSAqLwotCShiaW5hcnlmdW5jKWNvbXBsZXhfZGl2LAkJLyogbmJfdHJ1ZV9kaXZpZGUgKi8KLQkwLAkJCQkJLyogbmJfaW5wbGFjZV9mbG9vcl9kaXZpZGUgKi8KLQkwLAkJCQkJLyogbmJfaW5wbGFjZV90cnVlX2RpdmlkZSAqLworICAgIChiaW5hcnlmdW5jKWNvbXBsZXhfYWRkLCAgICAgICAgICAgICAgICAgICAgLyogbmJfYWRkICovCisgICAgKGJpbmFyeWZ1bmMpY29tcGxleF9zdWIsICAgICAgICAgICAgICAgICAgICAvKiBuYl9zdWJ0cmFjdCAqLworICAgIChiaW5hcnlmdW5jKWNvbXBsZXhfbXVsLCAgICAgICAgICAgICAgICAgICAgLyogbmJfbXVsdGlwbHkgKi8KKyAgICAoYmluYXJ5ZnVuYyljb21wbGV4X2NsYXNzaWNfZGl2LCAgICAgICAgICAgIC8qIG5iX2RpdmlkZSAqLworICAgIChiaW5hcnlmdW5jKWNvbXBsZXhfcmVtYWluZGVyLCAgICAgICAgICAgICAgLyogbmJfcmVtYWluZGVyICovCisgICAgKGJpbmFyeWZ1bmMpY29tcGxleF9kaXZtb2QsICAgICAgICAgICAgICAgICAvKiBuYl9kaXZtb2QgKi8KKyAgICAodGVybmFyeWZ1bmMpY29tcGxleF9wb3csICAgICAgICAgICAgICAgICAgIC8qIG5iX3Bvd2VyICovCisgICAgKHVuYXJ5ZnVuYyljb21wbGV4X25lZywgICAgICAgICAgICAgICAgICAgICAvKiBuYl9uZWdhdGl2ZSAqLworICAgICh1bmFyeWZ1bmMpY29tcGxleF9wb3MsICAgICAgICAgICAgICAgICAgICAgLyogbmJfcG9zaXRpdmUgKi8KKyAgICAodW5hcnlmdW5jKWNvbXBsZXhfYWJzLCAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2Fic29sdXRlICovCisgICAgKGlucXVpcnkpY29tcGxleF9ub256ZXJvLCAgICAgICAgICAgICAgICAgICAvKiBuYl9ub256ZXJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9pbnZlcnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2xzaGlmdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfcnNoaWZ0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9hbmQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX3hvciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfb3IgKi8KKyAgICBjb21wbGV4X2NvZXJjZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2NvZXJjZSAqLworICAgIGNvbXBsZXhfaW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfaW50ICovCisgICAgY29tcGxleF9sb25nLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9sb25nICovCisgICAgY29tcGxleF9mbG9hdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9mbG9hdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfb2N0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9oZXggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2lucGxhY2VfYWRkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9pbnBsYWNlX3N1YnRyYWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9pbnBsYWNlX211bHRpcGx5Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2lucGxhY2VfZGl2aWRlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9pbnBsYWNlX3JlbWFpbmRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfaW5wbGFjZV9wb3dlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfaW5wbGFjZV9sc2hpZnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2lucGxhY2VfcnNoaWZ0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9pbnBsYWNlX2FuZCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfaW5wbGFjZV94b3IgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2lucGxhY2Vfb3IgKi8KKyAgICAoYmluYXJ5ZnVuYyljb21wbGV4X2ludF9kaXYsICAgICAgICAgICAgICAgIC8qIG5iX2Zsb29yX2RpdmlkZSAqLworICAgIChiaW5hcnlmdW5jKWNvbXBsZXhfZGl2LCAgICAgICAgICAgICAgICAgICAgLyogbmJfdHJ1ZV9kaXZpZGUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2lucGxhY2VfZmxvb3JfZGl2aWRlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9pbnBsYWNlX3RydWVfZGl2aWRlICovCiB9OwogCiBQeVR5cGVPYmplY3QgUHlDb21wbGV4X1R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKLQkiY29tcGxleCIsCi0Jc2l6ZW9mKFB5Q29tcGxleE9iamVjdCksCi0JMCwKLQljb21wbGV4X2RlYWxsb2MsCQkJLyogdHBfZGVhbGxvYyAqLwotCShwcmludGZ1bmMpY29tcGxleF9wcmludCwJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9jb21wYXJlICovCi0JKHJlcHJmdW5jKWNvbXBsZXhfcmVwciwJCQkvKiB0cF9yZXByICovCi0JJmNvbXBsZXhfYXNfbnVtYmVyLCAgICAJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYyljb21wbGV4X2hhc2gsIAkJLyogdHBfaGFzaCAqLwotCTAsCQkJCQkvKiB0cF9jYWxsICovCi0JKHJlcHJmdW5jKWNvbXBsZXhfc3RyLAkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQljb21wbGV4X2RvYywJCQkJLyogdHBfZG9jICovCi0JMCwJCQkJCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJCS8qIHRwX2NsZWFyICovCi0JY29tcGxleF9yaWNoY29tcGFyZSwJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCTAsCQkJCQkvKiB0cF9pdGVyICovCi0JMCwJCQkJCS8qIHRwX2l0ZXJuZXh0ICovCi0JY29tcGxleF9tZXRob2RzLAkJCS8qIHRwX21ldGhvZHMgKi8KLQljb21wbGV4X21lbWJlcnMsCQkJLyogdHBfbWVtYmVycyAqLwotCTAsCQkJCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCQkvKiB0cF9kaWN0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KLQkwLAkJCQkJLyogdHBfZGljdG9mZnNldCAqLwotCTAsCQkJCQkvKiB0cF9pbml0ICovCi0JUHlUeXBlX0dlbmVyaWNBbGxvYywJCQkvKiB0cF9hbGxvYyAqLwotCWNvbXBsZXhfbmV3LAkJCQkvKiB0cF9uZXcgKi8KLQlQeU9iamVjdF9EZWwsICAgICAgICAgICAJCS8qIHRwX2ZyZWUgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQorICAgICJjb21wbGV4IiwKKyAgICBzaXplb2YoUHlDb21wbGV4T2JqZWN0KSwKKyAgICAwLAorICAgIGNvbXBsZXhfZGVhbGxvYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIChwcmludGZ1bmMpY29tcGxleF9wcmludCwgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAocmVwcmZ1bmMpY29tcGxleF9yZXByLCAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAmY29tcGxleF9hc19udW1iZXIsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAoaGFzaGZ1bmMpY29tcGxleF9oYXNoLCAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAocmVwcmZ1bmMpY29tcGxleF9zdHIsICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLworICAgIGNvbXBsZXhfZG9jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICBjb21wbGV4X3JpY2hjb21wYXJlLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICBjb21wbGV4X21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICBjb21wbGV4X21lbWJlcnMsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICBQeVR5cGVfR2VuZXJpY0FsbG9jLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgY29tcGxleF9uZXcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICBQeU9iamVjdF9EZWwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KIH07CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9kZXNjcm9iamVjdC5jIGIvT2JqZWN0cy9kZXNjcm9iamVjdC5jCmluZGV4IDAwY2RhM2MuLmJmZTY2NTYgMTAwNjQ0Ci0tLSBhL09iamVjdHMvZGVzY3JvYmplY3QuYworKysgYi9PYmplY3RzL2Rlc2Nyb2JqZWN0LmMKQEAgLTYsNjQ1ICs2LDY0NSBAQAogc3RhdGljIHZvaWQKIGRlc2NyX2RlYWxsb2MoUHlEZXNjck9iamVjdCAqZGVzY3IpCiB7Ci0JX1B5T2JqZWN0X0dDX1VOVFJBQ0soZGVzY3IpOwotCVB5X1hERUNSRUYoZGVzY3ItPmRfdHlwZSk7Ci0JUHlfWERFQ1JFRihkZXNjci0+ZF9uYW1lKTsKLQlQeU9iamVjdF9HQ19EZWwoZGVzY3IpOworICAgIF9QeU9iamVjdF9HQ19VTlRSQUNLKGRlc2NyKTsKKyAgICBQeV9YREVDUkVGKGRlc2NyLT5kX3R5cGUpOworICAgIFB5X1hERUNSRUYoZGVzY3ItPmRfbmFtZSk7CisgICAgUHlPYmplY3RfR0NfRGVsKGRlc2NyKTsKIH0KIAogc3RhdGljIGNoYXIgKgogZGVzY3JfbmFtZShQeURlc2NyT2JqZWN0ICpkZXNjcikKIHsKLQlpZiAoZGVzY3ItPmRfbmFtZSAhPSBOVUxMICYmIFB5U3RyaW5nX0NoZWNrKGRlc2NyLT5kX25hbWUpKQotCQlyZXR1cm4gUHlTdHJpbmdfQVNfU1RSSU5HKGRlc2NyLT5kX25hbWUpOwotCWVsc2UKLQkJcmV0dXJuICI/IjsKKyAgICBpZiAoZGVzY3ItPmRfbmFtZSAhPSBOVUxMICYmIFB5U3RyaW5nX0NoZWNrKGRlc2NyLT5kX25hbWUpKQorICAgICAgICByZXR1cm4gUHlTdHJpbmdfQVNfU1RSSU5HKGRlc2NyLT5kX25hbWUpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuICI/IjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRlc2NyX3JlcHIoUHlEZXNjck9iamVjdCAqZGVzY3IsIGNoYXIgKmZvcm1hdCkKIHsKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbUZvcm1hdChmb3JtYXQsIGRlc2NyX25hbWUoZGVzY3IpLAotCQkJCSAgIGRlc2NyLT5kX3R5cGUtPnRwX25hbWUpOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tRm9ybWF0KGZvcm1hdCwgZGVzY3JfbmFtZShkZXNjciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3ItPmRfdHlwZS0+dHBfbmFtZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBtZXRob2RfcmVwcihQeU1ldGhvZERlc2NyT2JqZWN0ICpkZXNjcikKIHsKLQlyZXR1cm4gZGVzY3JfcmVwcigoUHlEZXNjck9iamVjdCAqKWRlc2NyLCAKLQkJCSAgIjxtZXRob2QgJyVzJyBvZiAnJXMnIG9iamVjdHM+Iik7CisgICAgcmV0dXJuIGRlc2NyX3JlcHIoKFB5RGVzY3JPYmplY3QgKilkZXNjciwKKyAgICAgICAgICAgICAgICAgICAgICAiPG1ldGhvZCAnJXMnIG9mICclcycgb2JqZWN0cz4iKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG1lbWJlcl9yZXByKFB5TWVtYmVyRGVzY3JPYmplY3QgKmRlc2NyKQogewotCXJldHVybiBkZXNjcl9yZXByKChQeURlc2NyT2JqZWN0ICopZGVzY3IsIAotCQkJICAiPG1lbWJlciAnJXMnIG9mICclcycgb2JqZWN0cz4iKTsKKyAgICByZXR1cm4gZGVzY3JfcmVwcigoUHlEZXNjck9iamVjdCAqKWRlc2NyLAorICAgICAgICAgICAgICAgICAgICAgICI8bWVtYmVyICclcycgb2YgJyVzJyBvYmplY3RzPiIpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZ2V0c2V0X3JlcHIoUHlHZXRTZXREZXNjck9iamVjdCAqZGVzY3IpCiB7Ci0JcmV0dXJuIGRlc2NyX3JlcHIoKFB5RGVzY3JPYmplY3QgKilkZXNjciwgCi0JCQkgICI8YXR0cmlidXRlICclcycgb2YgJyVzJyBvYmplY3RzPiIpOworICAgIHJldHVybiBkZXNjcl9yZXByKChQeURlc2NyT2JqZWN0ICopZGVzY3IsCisgICAgICAgICAgICAgICAgICAgICAgIjxhdHRyaWJ1dGUgJyVzJyBvZiAnJXMnIG9iamVjdHM+Iik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB3cmFwcGVyZGVzY3JfcmVwcihQeVdyYXBwZXJEZXNjck9iamVjdCAqZGVzY3IpCiB7Ci0JcmV0dXJuIGRlc2NyX3JlcHIoKFB5RGVzY3JPYmplY3QgKilkZXNjciwgCi0JCQkgICI8c2xvdCB3cmFwcGVyICclcycgb2YgJyVzJyBvYmplY3RzPiIpOworICAgIHJldHVybiBkZXNjcl9yZXByKChQeURlc2NyT2JqZWN0ICopZGVzY3IsCisgICAgICAgICAgICAgICAgICAgICAgIjxzbG90IHdyYXBwZXIgJyVzJyBvZiAnJXMnIG9iamVjdHM+Iik7CiB9CiAKIHN0YXRpYyBpbnQKIGRlc2NyX2NoZWNrKFB5RGVzY3JPYmplY3QgKmRlc2NyLCBQeU9iamVjdCAqb2JqLCBQeU9iamVjdCAqKnByZXMpCiB7Ci0JaWYgKG9iaiA9PSBOVUxMKSB7Ci0JCVB5X0lOQ1JFRihkZXNjcik7Ci0JCSpwcmVzID0gKFB5T2JqZWN0ICopZGVzY3I7Ci0JCXJldHVybiAxOwotCX0KLQlpZiAoIVB5T2JqZWN0X1R5cGVDaGVjayhvYmosIGRlc2NyLT5kX3R5cGUpKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgICJkZXNjcmlwdG9yICclcycgZm9yICclcycgb2JqZWN0cyAiCi0JCQkgICAgICJkb2Vzbid0IGFwcGx5IHRvICclcycgb2JqZWN0IiwKLQkJCSAgICAgZGVzY3JfbmFtZSgoUHlEZXNjck9iamVjdCAqKWRlc2NyKSwKLQkJCSAgICAgZGVzY3ItPmRfdHlwZS0+dHBfbmFtZSwKLQkJCSAgICAgb2JqLT5vYl90eXBlLT50cF9uYW1lKTsKLQkJKnByZXMgPSBOVUxMOwotCQlyZXR1cm4gMTsKLQl9Ci0JcmV0dXJuIDA7CisgICAgaWYgKG9iaiA9PSBOVUxMKSB7CisgICAgICAgIFB5X0lOQ1JFRihkZXNjcik7CisgICAgICAgICpwcmVzID0gKFB5T2JqZWN0ICopZGVzY3I7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAoIVB5T2JqZWN0X1R5cGVDaGVjayhvYmosIGRlc2NyLT5kX3R5cGUpKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRvciAnJXMnIGZvciAnJXMnIG9iamVjdHMgIgorICAgICAgICAgICAgICAgICAgICAgImRvZXNuJ3QgYXBwbHkgdG8gJyVzJyBvYmplY3QiLAorICAgICAgICAgICAgICAgICAgICAgZGVzY3JfbmFtZSgoUHlEZXNjck9iamVjdCAqKWRlc2NyKSwKKyAgICAgICAgICAgICAgICAgICAgIGRlc2NyLT5kX3R5cGUtPnRwX25hbWUsCisgICAgICAgICAgICAgICAgICAgICBvYmotPm9iX3R5cGUtPnRwX25hbWUpOworICAgICAgICAqcHJlcyA9IE5VTEw7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNsYXNzbWV0aG9kX2dldChQeU1ldGhvZERlc2NyT2JqZWN0ICpkZXNjciwgUHlPYmplY3QgKm9iaiwgUHlPYmplY3QgKnR5cGUpCiB7Ci0JLyogRW5zdXJlIGEgdmFsaWQgdHlwZS4gIENsYXNzIG1ldGhvZHMgaWdub3JlIG9iai4gKi8KLQlpZiAodHlwZSA9PSBOVUxMKSB7Ci0JCWlmIChvYmogIT0gTlVMTCkKLQkJCXR5cGUgPSAoUHlPYmplY3QgKilvYmotPm9iX3R5cGU7Ci0JCWVsc2UgewotCQkJLyogV290IC0gbm8gdHlwZT8hICovCi0JCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJCSAgICAgImRlc2NyaXB0b3IgJyVzJyBmb3IgdHlwZSAnJXMnICIKLQkJCQkgICAgICJuZWVkcyBlaXRoZXIgYW4gb2JqZWN0IG9yIGEgdHlwZSIsCi0JCQkJICAgICBkZXNjcl9uYW1lKChQeURlc2NyT2JqZWN0ICopZGVzY3IpLAotCQkJCSAgICAgZGVzY3ItPmRfdHlwZS0+dHBfbmFtZSk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KLQlpZiAoIVB5VHlwZV9DaGVjayh0eXBlKSkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJICAgICAiZGVzY3JpcHRvciAnJXMnIGZvciB0eXBlICclcycgIgotCQkJICAgICAibmVlZHMgYSB0eXBlLCBub3QgYSAnJXMnIGFzIGFyZyAyIiwKLQkJCSAgICAgZGVzY3JfbmFtZSgoUHlEZXNjck9iamVjdCAqKWRlc2NyKSwKLQkJCSAgICAgZGVzY3ItPmRfdHlwZS0+dHBfbmFtZSwKLQkJCSAgICAgdHlwZS0+b2JfdHlwZS0+dHBfbmFtZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoIVB5VHlwZV9Jc1N1YnR5cGUoKFB5VHlwZU9iamVjdCAqKXR5cGUsIGRlc2NyLT5kX3R5cGUpKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgICJkZXNjcmlwdG9yICclcycgZm9yIHR5cGUgJyVzJyAiCi0JCQkgICAgICJkb2Vzbid0IGFwcGx5IHRvIHR5cGUgJyVzJyIsCi0JCQkgICAgIGRlc2NyX25hbWUoKFB5RGVzY3JPYmplY3QgKilkZXNjciksCi0JCQkgICAgIGRlc2NyLT5kX3R5cGUtPnRwX25hbWUsCi0JCQkgICAgICgoUHlUeXBlT2JqZWN0ICopdHlwZSktPnRwX25hbWUpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIFB5Q0Z1bmN0aW9uX05ldyhkZXNjci0+ZF9tZXRob2QsIHR5cGUpOworICAgIC8qIEVuc3VyZSBhIHZhbGlkIHR5cGUuICBDbGFzcyBtZXRob2RzIGlnbm9yZSBvYmouICovCisgICAgaWYgKHR5cGUgPT0gTlVMTCkgeworICAgICAgICBpZiAob2JqICE9IE5VTEwpCisgICAgICAgICAgICB0eXBlID0gKFB5T2JqZWN0ICopb2JqLT5vYl90eXBlOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8qIFdvdCAtIG5vIHR5cGU/ISAqLworICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRvciAnJXMnIGZvciB0eXBlICclcycgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJuZWVkcyBlaXRoZXIgYW4gb2JqZWN0IG9yIGEgdHlwZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JfbmFtZSgoUHlEZXNjck9iamVjdCAqKWRlc2NyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjci0+ZF90eXBlLT50cF9uYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorICAgIGlmICghUHlUeXBlX0NoZWNrKHR5cGUpKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRvciAnJXMnIGZvciB0eXBlICclcycgIgorICAgICAgICAgICAgICAgICAgICAgIm5lZWRzIGEgdHlwZSwgbm90IGEgJyVzJyBhcyBhcmcgMiIsCisgICAgICAgICAgICAgICAgICAgICBkZXNjcl9uYW1lKChQeURlc2NyT2JqZWN0ICopZGVzY3IpLAorICAgICAgICAgICAgICAgICAgICAgZGVzY3ItPmRfdHlwZS0+dHBfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIHR5cGUtPm9iX3R5cGUtPnRwX25hbWUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKCFQeVR5cGVfSXNTdWJ0eXBlKChQeVR5cGVPYmplY3QgKil0eXBlLCBkZXNjci0+ZF90eXBlKSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0b3IgJyVzJyBmb3IgdHlwZSAnJXMnICIKKyAgICAgICAgICAgICAgICAgICAgICJkb2Vzbid0IGFwcGx5IHRvIHR5cGUgJyVzJyIsCisgICAgICAgICAgICAgICAgICAgICBkZXNjcl9uYW1lKChQeURlc2NyT2JqZWN0ICopZGVzY3IpLAorICAgICAgICAgICAgICAgICAgICAgZGVzY3ItPmRfdHlwZS0+dHBfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICgoUHlUeXBlT2JqZWN0ICopdHlwZSktPnRwX25hbWUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIFB5Q0Z1bmN0aW9uX05ldyhkZXNjci0+ZF9tZXRob2QsIHR5cGUpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbWV0aG9kX2dldChQeU1ldGhvZERlc2NyT2JqZWN0ICpkZXNjciwgUHlPYmplY3QgKm9iaiwgUHlPYmplY3QgKnR5cGUpCiB7Ci0JUHlPYmplY3QgKnJlczsKKyAgICBQeU9iamVjdCAqcmVzOwogCi0JaWYgKGRlc2NyX2NoZWNrKChQeURlc2NyT2JqZWN0ICopZGVzY3IsIG9iaiwgJnJlcykpCi0JCXJldHVybiByZXM7Ci0JcmV0dXJuIFB5Q0Z1bmN0aW9uX05ldyhkZXNjci0+ZF9tZXRob2QsIG9iaik7CisgICAgaWYgKGRlc2NyX2NoZWNrKChQeURlc2NyT2JqZWN0ICopZGVzY3IsIG9iaiwgJnJlcykpCisgICAgICAgIHJldHVybiByZXM7CisgICAgcmV0dXJuIFB5Q0Z1bmN0aW9uX05ldyhkZXNjci0+ZF9tZXRob2QsIG9iaik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBtZW1iZXJfZ2V0KFB5TWVtYmVyRGVzY3JPYmplY3QgKmRlc2NyLCBQeU9iamVjdCAqb2JqLCBQeU9iamVjdCAqdHlwZSkKIHsKLQlQeU9iamVjdCAqcmVzOworICAgIFB5T2JqZWN0ICpyZXM7CiAKLQlpZiAoZGVzY3JfY2hlY2soKFB5RGVzY3JPYmplY3QgKilkZXNjciwgb2JqLCAmcmVzKSkKLQkJcmV0dXJuIHJlczsKLQlyZXR1cm4gUHlNZW1iZXJfR2V0T25lKChjaGFyICopb2JqLCBkZXNjci0+ZF9tZW1iZXIpOworICAgIGlmIChkZXNjcl9jaGVjaygoUHlEZXNjck9iamVjdCAqKWRlc2NyLCBvYmosICZyZXMpKQorICAgICAgICByZXR1cm4gcmVzOworICAgIHJldHVybiBQeU1lbWJlcl9HZXRPbmUoKGNoYXIgKilvYmosIGRlc2NyLT5kX21lbWJlcik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZXRzZXRfZ2V0KFB5R2V0U2V0RGVzY3JPYmplY3QgKmRlc2NyLCBQeU9iamVjdCAqb2JqLCBQeU9iamVjdCAqdHlwZSkKIHsKLQlQeU9iamVjdCAqcmVzOworICAgIFB5T2JqZWN0ICpyZXM7CiAKLQlpZiAoZGVzY3JfY2hlY2soKFB5RGVzY3JPYmplY3QgKilkZXNjciwgb2JqLCAmcmVzKSkKLQkJcmV0dXJuIHJlczsKLQlpZiAoZGVzY3ItPmRfZ2V0c2V0LT5nZXQgIT0gTlVMTCkKLQkJcmV0dXJuIGRlc2NyLT5kX2dldHNldC0+Z2V0KG9iaiwgZGVzY3ItPmRfZ2V0c2V0LT5jbG9zdXJlKTsKLQlQeUVycl9Gb3JtYXQoUHlFeGNfQXR0cmlidXRlRXJyb3IsCi0JCSAgICAgImF0dHJpYnV0ZSAnJS4zMDBzJyBvZiAnJS4xMDBzJyBvYmplY3RzIGlzIG5vdCByZWFkYWJsZSIsCi0JCSAgICAgZGVzY3JfbmFtZSgoUHlEZXNjck9iamVjdCAqKWRlc2NyKSwKLQkJICAgICBkZXNjci0+ZF90eXBlLT50cF9uYW1lKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoZGVzY3JfY2hlY2soKFB5RGVzY3JPYmplY3QgKilkZXNjciwgb2JqLCAmcmVzKSkKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICBpZiAoZGVzY3ItPmRfZ2V0c2V0LT5nZXQgIT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIGRlc2NyLT5kX2dldHNldC0+Z2V0KG9iaiwgZGVzY3ItPmRfZ2V0c2V0LT5jbG9zdXJlKTsKKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfQXR0cmlidXRlRXJyb3IsCisgICAgICAgICAgICAgICAgICJhdHRyaWJ1dGUgJyUuMzAwcycgb2YgJyUuMTAwcycgb2JqZWN0cyBpcyBub3QgcmVhZGFibGUiLAorICAgICAgICAgICAgICAgICBkZXNjcl9uYW1lKChQeURlc2NyT2JqZWN0ICopZGVzY3IpLAorICAgICAgICAgICAgICAgICBkZXNjci0+ZF90eXBlLT50cF9uYW1lKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHdyYXBwZXJkZXNjcl9nZXQoUHlXcmFwcGVyRGVzY3JPYmplY3QgKmRlc2NyLCBQeU9iamVjdCAqb2JqLCBQeU9iamVjdCAqdHlwZSkKIHsKLQlQeU9iamVjdCAqcmVzOworICAgIFB5T2JqZWN0ICpyZXM7CiAKLQlpZiAoZGVzY3JfY2hlY2soKFB5RGVzY3JPYmplY3QgKilkZXNjciwgb2JqLCAmcmVzKSkKLQkJcmV0dXJuIHJlczsKLQlyZXR1cm4gUHlXcmFwcGVyX05ldygoUHlPYmplY3QgKilkZXNjciwgb2JqKTsKKyAgICBpZiAoZGVzY3JfY2hlY2soKFB5RGVzY3JPYmplY3QgKilkZXNjciwgb2JqLCAmcmVzKSkKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICByZXR1cm4gUHlXcmFwcGVyX05ldygoUHlPYmplY3QgKilkZXNjciwgb2JqKTsKIH0KIAogc3RhdGljIGludAogZGVzY3Jfc2V0Y2hlY2soUHlEZXNjck9iamVjdCAqZGVzY3IsIFB5T2JqZWN0ICpvYmosIFB5T2JqZWN0ICp2YWx1ZSwKLQkgICAgICAgaW50ICpwcmVzKQorICAgICAgICAgICAgICAgaW50ICpwcmVzKQogewotCWFzc2VydChvYmogIT0gTlVMTCk7Ci0JaWYgKCFQeU9iamVjdF9UeXBlQ2hlY2sob2JqLCBkZXNjci0+ZF90eXBlKSkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJICAgICAiZGVzY3JpcHRvciAnJS4yMDBzJyBmb3IgJyUuMTAwcycgb2JqZWN0cyAiCi0JCQkgICAgICJkb2Vzbid0IGFwcGx5IHRvICclLjEwMHMnIG9iamVjdCIsCi0JCQkgICAgIGRlc2NyX25hbWUoZGVzY3IpLAotCQkJICAgICBkZXNjci0+ZF90eXBlLT50cF9uYW1lLAotCQkJICAgICBvYmotPm9iX3R5cGUtPnRwX25hbWUpOwotCQkqcHJlcyA9IC0xOwotCQlyZXR1cm4gMTsKLQl9Ci0JcmV0dXJuIDA7CisgICAgYXNzZXJ0KG9iaiAhPSBOVUxMKTsKKyAgICBpZiAoIVB5T2JqZWN0X1R5cGVDaGVjayhvYmosIGRlc2NyLT5kX3R5cGUpKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRvciAnJS4yMDBzJyBmb3IgJyUuMTAwcycgb2JqZWN0cyAiCisgICAgICAgICAgICAgICAgICAgICAiZG9lc24ndCBhcHBseSB0byAnJS4xMDBzJyBvYmplY3QiLAorICAgICAgICAgICAgICAgICAgICAgZGVzY3JfbmFtZShkZXNjciksCisgICAgICAgICAgICAgICAgICAgICBkZXNjci0+ZF90eXBlLT50cF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgb2JqLT5vYl90eXBlLT50cF9uYW1lKTsKKyAgICAgICAgKnByZXMgPSAtMTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBtZW1iZXJfc2V0KFB5TWVtYmVyRGVzY3JPYmplY3QgKmRlc2NyLCBQeU9iamVjdCAqb2JqLCBQeU9iamVjdCAqdmFsdWUpCiB7Ci0JaW50IHJlczsKKyAgICBpbnQgcmVzOwogCi0JaWYgKGRlc2NyX3NldGNoZWNrKChQeURlc2NyT2JqZWN0ICopZGVzY3IsIG9iaiwgdmFsdWUsICZyZXMpKQotCQlyZXR1cm4gcmVzOwotCXJldHVybiBQeU1lbWJlcl9TZXRPbmUoKGNoYXIgKilvYmosIGRlc2NyLT5kX21lbWJlciwgdmFsdWUpOworICAgIGlmIChkZXNjcl9zZXRjaGVjaygoUHlEZXNjck9iamVjdCAqKWRlc2NyLCBvYmosIHZhbHVlLCAmcmVzKSkKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICByZXR1cm4gUHlNZW1iZXJfU2V0T25lKChjaGFyICopb2JqLCBkZXNjci0+ZF9tZW1iZXIsIHZhbHVlKTsKIH0KIAogc3RhdGljIGludAogZ2V0c2V0X3NldChQeUdldFNldERlc2NyT2JqZWN0ICpkZXNjciwgUHlPYmplY3QgKm9iaiwgUHlPYmplY3QgKnZhbHVlKQogewotCWludCByZXM7CisgICAgaW50IHJlczsKIAotCWlmIChkZXNjcl9zZXRjaGVjaygoUHlEZXNjck9iamVjdCAqKWRlc2NyLCBvYmosIHZhbHVlLCAmcmVzKSkKLQkJcmV0dXJuIHJlczsKLQlpZiAoZGVzY3ItPmRfZ2V0c2V0LT5zZXQgIT0gTlVMTCkKLQkJcmV0dXJuIGRlc2NyLT5kX2dldHNldC0+c2V0KG9iaiwgdmFsdWUsCi0JCQkJCSAgICBkZXNjci0+ZF9nZXRzZXQtPmNsb3N1cmUpOwotCVB5RXJyX0Zvcm1hdChQeUV4Y19BdHRyaWJ1dGVFcnJvciwKLQkJICAgICAiYXR0cmlidXRlICclLjMwMHMnIG9mICclLjEwMHMnIG9iamVjdHMgaXMgbm90IHdyaXRhYmxlIiwKLQkJICAgICBkZXNjcl9uYW1lKChQeURlc2NyT2JqZWN0ICopZGVzY3IpLAotCQkgICAgIGRlc2NyLT5kX3R5cGUtPnRwX25hbWUpOwotCXJldHVybiAtMTsKKyAgICBpZiAoZGVzY3Jfc2V0Y2hlY2soKFB5RGVzY3JPYmplY3QgKilkZXNjciwgb2JqLCB2YWx1ZSwgJnJlcykpCisgICAgICAgIHJldHVybiByZXM7CisgICAgaWYgKGRlc2NyLT5kX2dldHNldC0+c2V0ICE9IE5VTEwpCisgICAgICAgIHJldHVybiBkZXNjci0+ZF9nZXRzZXQtPnNldChvYmosIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3ItPmRfZ2V0c2V0LT5jbG9zdXJlKTsKKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfQXR0cmlidXRlRXJyb3IsCisgICAgICAgICAgICAgICAgICJhdHRyaWJ1dGUgJyUuMzAwcycgb2YgJyUuMTAwcycgb2JqZWN0cyBpcyBub3Qgd3JpdGFibGUiLAorICAgICAgICAgICAgICAgICBkZXNjcl9uYW1lKChQeURlc2NyT2JqZWN0ICopZGVzY3IpLAorICAgICAgICAgICAgICAgICBkZXNjci0+ZF90eXBlLT50cF9uYW1lKTsKKyAgICByZXR1cm4gLTE7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBtZXRob2RkZXNjcl9jYWxsKFB5TWV0aG9kRGVzY3JPYmplY3QgKmRlc2NyLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JUHlfc3NpemVfdCBhcmdjOwotCVB5T2JqZWN0ICpzZWxmLCAqZnVuYywgKnJlc3VsdDsKKyAgICBQeV9zc2l6ZV90IGFyZ2M7CisgICAgUHlPYmplY3QgKnNlbGYsICpmdW5jLCAqcmVzdWx0OwogCi0JLyogTWFrZSBzdXJlIHRoYXQgdGhlIGZpcnN0IGFyZ3VtZW50IGlzIGFjY2VwdGFibGUgYXMgJ3NlbGYnICovCi0JYXNzZXJ0KFB5VHVwbGVfQ2hlY2soYXJncykpOwotCWFyZ2MgPSBQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpOwotCWlmIChhcmdjIDwgMSkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJICAgICAiZGVzY3JpcHRvciAnJS4zMDBzJyBvZiAnJS4xMDBzJyAiCi0JCQkgICAgICJvYmplY3QgbmVlZHMgYW4gYXJndW1lbnQiLAotCQkJICAgICBkZXNjcl9uYW1lKChQeURlc2NyT2JqZWN0ICopZGVzY3IpLAotCQkJICAgICBkZXNjci0+ZF90eXBlLT50cF9uYW1lKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXNlbGYgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDApOwotCWlmICghUHlPYmplY3RfSXNJbnN0YW5jZShzZWxmLCAoUHlPYmplY3QgKikoZGVzY3ItPmRfdHlwZSkpKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgICJkZXNjcmlwdG9yICclLjIwMHMnICIKLQkJCSAgICAgInJlcXVpcmVzIGEgJyUuMTAwcycgb2JqZWN0ICIKLQkJCSAgICAgImJ1dCByZWNlaXZlZCBhICclLjEwMHMnIiwKLQkJCSAgICAgZGVzY3JfbmFtZSgoUHlEZXNjck9iamVjdCAqKWRlc2NyKSwKLQkJCSAgICAgZGVzY3ItPmRfdHlwZS0+dHBfbmFtZSwKLQkJCSAgICAgc2VsZi0+b2JfdHlwZS0+dHBfbmFtZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICAvKiBNYWtlIHN1cmUgdGhhdCB0aGUgZmlyc3QgYXJndW1lbnQgaXMgYWNjZXB0YWJsZSBhcyAnc2VsZicgKi8KKyAgICBhc3NlcnQoUHlUdXBsZV9DaGVjayhhcmdzKSk7CisgICAgYXJnYyA9IFB5VHVwbGVfR0VUX1NJWkUoYXJncyk7CisgICAgaWYgKGFyZ2MgPCAxKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRvciAnJS4zMDBzJyBvZiAnJS4xMDBzJyAiCisgICAgICAgICAgICAgICAgICAgICAib2JqZWN0IG5lZWRzIGFuIGFyZ3VtZW50IiwKKyAgICAgICAgICAgICAgICAgICAgIGRlc2NyX25hbWUoKFB5RGVzY3JPYmplY3QgKilkZXNjciksCisgICAgICAgICAgICAgICAgICAgICBkZXNjci0+ZF90eXBlLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHNlbGYgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDApOworICAgIGlmICghUHlPYmplY3RfSXNJbnN0YW5jZShzZWxmLCAoUHlPYmplY3QgKikoZGVzY3ItPmRfdHlwZSkpKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRvciAnJS4yMDBzJyAiCisgICAgICAgICAgICAgICAgICAgICAicmVxdWlyZXMgYSAnJS4xMDBzJyBvYmplY3QgIgorICAgICAgICAgICAgICAgICAgICAgImJ1dCByZWNlaXZlZCBhICclLjEwMHMnIiwKKyAgICAgICAgICAgICAgICAgICAgIGRlc2NyX25hbWUoKFB5RGVzY3JPYmplY3QgKilkZXNjciksCisgICAgICAgICAgICAgICAgICAgICBkZXNjci0+ZF90eXBlLT50cF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgc2VsZi0+b2JfdHlwZS0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWZ1bmMgPSBQeUNGdW5jdGlvbl9OZXcoZGVzY3ItPmRfbWV0aG9kLCBzZWxmKTsKLQlpZiAoZnVuYyA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlhcmdzID0gUHlUdXBsZV9HZXRTbGljZShhcmdzLCAxLCBhcmdjKTsKLQlpZiAoYXJncyA9PSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRihmdW5jKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJlc3VsdCA9IFB5RXZhbF9DYWxsT2JqZWN0V2l0aEtleXdvcmRzKGZ1bmMsIGFyZ3MsIGt3ZHMpOwotCVB5X0RFQ1JFRihhcmdzKTsKLQlQeV9ERUNSRUYoZnVuYyk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBmdW5jID0gUHlDRnVuY3Rpb25fTmV3KGRlc2NyLT5kX21ldGhvZCwgc2VsZik7CisgICAgaWYgKGZ1bmMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYXJncyA9IFB5VHVwbGVfR2V0U2xpY2UoYXJncywgMSwgYXJnYyk7CisgICAgaWYgKGFyZ3MgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYoZnVuYyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXN1bHQgPSBQeUV2YWxfQ2FsbE9iamVjdFdpdGhLZXl3b3JkcyhmdW5jLCBhcmdzLCBrd2RzKTsKKyAgICBQeV9ERUNSRUYoYXJncyk7CisgICAgUHlfREVDUkVGKGZ1bmMpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjbGFzc21ldGhvZGRlc2NyX2NhbGwoUHlNZXRob2REZXNjck9iamVjdCAqZGVzY3IsIFB5T2JqZWN0ICphcmdzLAotCQkgICAgICBQeU9iamVjdCAqa3dkcykKKyAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqa3dkcykKIHsKLQlQeU9iamVjdCAqZnVuYywgKnJlc3VsdDsKKyAgICBQeU9iamVjdCAqZnVuYywgKnJlc3VsdDsKIAotCWZ1bmMgPSBQeUNGdW5jdGlvbl9OZXcoZGVzY3ItPmRfbWV0aG9kLCAoUHlPYmplY3QgKilkZXNjci0+ZF90eXBlKTsKLQlpZiAoZnVuYyA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBmdW5jID0gUHlDRnVuY3Rpb25fTmV3KGRlc2NyLT5kX21ldGhvZCwgKFB5T2JqZWN0ICopZGVzY3ItPmRfdHlwZSk7CisgICAgaWYgKGZ1bmMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlyZXN1bHQgPSBQeUV2YWxfQ2FsbE9iamVjdFdpdGhLZXl3b3JkcyhmdW5jLCBhcmdzLCBrd2RzKTsKLQlQeV9ERUNSRUYoZnVuYyk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICByZXN1bHQgPSBQeUV2YWxfQ2FsbE9iamVjdFdpdGhLZXl3b3JkcyhmdW5jLCBhcmdzLCBrd2RzKTsKKyAgICBQeV9ERUNSRUYoZnVuYyk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHdyYXBwZXJkZXNjcl9jYWxsKFB5V3JhcHBlckRlc2NyT2JqZWN0ICpkZXNjciwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCVB5X3NzaXplX3QgYXJnYzsKLQlQeU9iamVjdCAqc2VsZiwgKmZ1bmMsICpyZXN1bHQ7CisgICAgUHlfc3NpemVfdCBhcmdjOworICAgIFB5T2JqZWN0ICpzZWxmLCAqZnVuYywgKnJlc3VsdDsKIAotCS8qIE1ha2Ugc3VyZSB0aGF0IHRoZSBmaXJzdCBhcmd1bWVudCBpcyBhY2NlcHRhYmxlIGFzICdzZWxmJyAqLwotCWFzc2VydChQeVR1cGxlX0NoZWNrKGFyZ3MpKTsKLQlhcmdjID0gUHlUdXBsZV9HRVRfU0laRShhcmdzKTsKLQlpZiAoYXJnYyA8IDEpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAgImRlc2NyaXB0b3IgJyUuMzAwcycgb2YgJyUuMTAwcycgIgotCQkJICAgICAib2JqZWN0IG5lZWRzIGFuIGFyZ3VtZW50IiwKLQkJCSAgICAgZGVzY3JfbmFtZSgoUHlEZXNjck9iamVjdCAqKWRlc2NyKSwKLQkJCSAgICAgZGVzY3ItPmRfdHlwZS0+dHBfbmFtZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlzZWxmID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCAwKTsKLQlpZiAoIVB5T2JqZWN0X0lzSW5zdGFuY2Uoc2VsZiwgKFB5T2JqZWN0ICopKGRlc2NyLT5kX3R5cGUpKSkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJICAgICAiZGVzY3JpcHRvciAnJS4yMDBzJyAiCi0JCQkgICAgICJyZXF1aXJlcyBhICclLjEwMHMnIG9iamVjdCAiCi0JCQkgICAgICJidXQgcmVjZWl2ZWQgYSAnJS4xMDBzJyIsCi0JCQkgICAgIGRlc2NyX25hbWUoKFB5RGVzY3JPYmplY3QgKilkZXNjciksCi0JCQkgICAgIGRlc2NyLT5kX3R5cGUtPnRwX25hbWUsCi0JCQkgICAgIHNlbGYtPm9iX3R5cGUtPnRwX25hbWUpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgLyogTWFrZSBzdXJlIHRoYXQgdGhlIGZpcnN0IGFyZ3VtZW50IGlzIGFjY2VwdGFibGUgYXMgJ3NlbGYnICovCisgICAgYXNzZXJ0KFB5VHVwbGVfQ2hlY2soYXJncykpOworICAgIGFyZ2MgPSBQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpOworICAgIGlmIChhcmdjIDwgMSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0b3IgJyUuMzAwcycgb2YgJyUuMTAwcycgIgorICAgICAgICAgICAgICAgICAgICAgIm9iamVjdCBuZWVkcyBhbiBhcmd1bWVudCIsCisgICAgICAgICAgICAgICAgICAgICBkZXNjcl9uYW1lKChQeURlc2NyT2JqZWN0ICopZGVzY3IpLAorICAgICAgICAgICAgICAgICAgICAgZGVzY3ItPmRfdHlwZS0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBzZWxmID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCAwKTsKKyAgICBpZiAoIVB5T2JqZWN0X0lzSW5zdGFuY2Uoc2VsZiwgKFB5T2JqZWN0ICopKGRlc2NyLT5kX3R5cGUpKSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0b3IgJyUuMjAwcycgIgorICAgICAgICAgICAgICAgICAgICAgInJlcXVpcmVzIGEgJyUuMTAwcycgb2JqZWN0ICIKKyAgICAgICAgICAgICAgICAgICAgICJidXQgcmVjZWl2ZWQgYSAnJS4xMDBzJyIsCisgICAgICAgICAgICAgICAgICAgICBkZXNjcl9uYW1lKChQeURlc2NyT2JqZWN0ICopZGVzY3IpLAorICAgICAgICAgICAgICAgICAgICAgZGVzY3ItPmRfdHlwZS0+dHBfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIHNlbGYtPm9iX3R5cGUtPnRwX25hbWUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlmdW5jID0gUHlXcmFwcGVyX05ldygoUHlPYmplY3QgKilkZXNjciwgc2VsZik7Ci0JaWYgKGZ1bmMgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JYXJncyA9IFB5VHVwbGVfR2V0U2xpY2UoYXJncywgMSwgYXJnYyk7Ci0JaWYgKGFyZ3MgPT0gTlVMTCkgewotCQlQeV9ERUNSRUYoZnVuYyk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXN1bHQgPSBQeUV2YWxfQ2FsbE9iamVjdFdpdGhLZXl3b3JkcyhmdW5jLCBhcmdzLCBrd2RzKTsKLQlQeV9ERUNSRUYoYXJncyk7Ci0JUHlfREVDUkVGKGZ1bmMpOwotCXJldHVybiByZXN1bHQ7CisgICAgZnVuYyA9IFB5V3JhcHBlcl9OZXcoKFB5T2JqZWN0ICopZGVzY3IsIHNlbGYpOworICAgIGlmIChmdW5jID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGFyZ3MgPSBQeVR1cGxlX0dldFNsaWNlKGFyZ3MsIDEsIGFyZ2MpOworICAgIGlmIChhcmdzID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKGZ1bmMpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmVzdWx0ID0gUHlFdmFsX0NhbGxPYmplY3RXaXRoS2V5d29yZHMoZnVuYywgYXJncywga3dkcyk7CisgICAgUHlfREVDUkVGKGFyZ3MpOworICAgIFB5X0RFQ1JFRihmdW5jKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbWV0aG9kX2dldF9kb2MoUHlNZXRob2REZXNjck9iamVjdCAqZGVzY3IsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JaWYgKGRlc2NyLT5kX21ldGhvZC0+bWxfZG9jID09IE5VTEwpIHsKLQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQlyZXR1cm4gUHlfTm9uZTsKLQl9Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoZGVzY3ItPmRfbWV0aG9kLT5tbF9kb2MpOworICAgIGlmIChkZXNjci0+ZF9tZXRob2QtPm1sX2RvYyA9PSBOVUxMKSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgfQorICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGRlc2NyLT5kX21ldGhvZC0+bWxfZG9jKTsKIH0KIAogc3RhdGljIFB5TWVtYmVyRGVmIGRlc2NyX21lbWJlcnNbXSA9IHsKLQl7Il9fb2JqY2xhc3NfXyIsIFRfT0JKRUNULCBvZmZzZXRvZihQeURlc2NyT2JqZWN0LCBkX3R5cGUpLCBSRUFET05MWX0sCi0JeyJfX25hbWVfXyIsIFRfT0JKRUNULCBvZmZzZXRvZihQeURlc2NyT2JqZWN0LCBkX25hbWUpLCBSRUFET05MWX0sCi0JezB9CisgICAgeyJfX29iamNsYXNzX18iLCBUX09CSkVDVCwgb2Zmc2V0b2YoUHlEZXNjck9iamVjdCwgZF90eXBlKSwgUkVBRE9OTFl9LAorICAgIHsiX19uYW1lX18iLCBUX09CSkVDVCwgb2Zmc2V0b2YoUHlEZXNjck9iamVjdCwgZF9uYW1lKSwgUkVBRE9OTFl9LAorICAgIHswfQogfTsKIAogc3RhdGljIFB5R2V0U2V0RGVmIG1ldGhvZF9nZXRzZXRbXSA9IHsKLQl7Il9fZG9jX18iLCAoZ2V0dGVyKW1ldGhvZF9nZXRfZG9jfSwKLQl7MH0KKyAgICB7Il9fZG9jX18iLCAoZ2V0dGVyKW1ldGhvZF9nZXRfZG9jfSwKKyAgICB7MH0KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBtZW1iZXJfZ2V0X2RvYyhQeU1lbWJlckRlc2NyT2JqZWN0ICpkZXNjciwgdm9pZCAqY2xvc3VyZSkKIHsKLQlpZiAoZGVzY3ItPmRfbWVtYmVyLT5kb2MgPT0gTlVMTCkgewotCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCXJldHVybiBQeV9Ob25lOwotCX0KLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhkZXNjci0+ZF9tZW1iZXItPmRvYyk7CisgICAgaWYgKGRlc2NyLT5kX21lbWJlci0+ZG9jID09IE5VTEwpIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICB9CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoZGVzY3ItPmRfbWVtYmVyLT5kb2MpOwogfQogCiBzdGF0aWMgUHlHZXRTZXREZWYgbWVtYmVyX2dldHNldFtdID0gewotCXsiX19kb2NfXyIsIChnZXR0ZXIpbWVtYmVyX2dldF9kb2N9LAotCXswfQorICAgIHsiX19kb2NfXyIsIChnZXR0ZXIpbWVtYmVyX2dldF9kb2N9LAorICAgIHswfQogfTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIGdldHNldF9nZXRfZG9jKFB5R2V0U2V0RGVzY3JPYmplY3QgKmRlc2NyLCB2b2lkICpjbG9zdXJlKQogewotCWlmIChkZXNjci0+ZF9nZXRzZXQtPmRvYyA9PSBOVUxMKSB7Ci0JCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJcmV0dXJuIFB5X05vbmU7Ci0JfQotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGRlc2NyLT5kX2dldHNldC0+ZG9jKTsKKyAgICBpZiAoZGVzY3ItPmRfZ2V0c2V0LT5kb2MgPT0gTlVMTCkgeworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIHJldHVybiBQeV9Ob25lOworICAgIH0KKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhkZXNjci0+ZF9nZXRzZXQtPmRvYyk7CiB9CiAKIHN0YXRpYyBQeUdldFNldERlZiBnZXRzZXRfZ2V0c2V0W10gPSB7Ci0JeyJfX2RvY19fIiwgKGdldHRlcilnZXRzZXRfZ2V0X2RvY30sCi0JezB9CisgICAgeyJfX2RvY19fIiwgKGdldHRlcilnZXRzZXRfZ2V0X2RvY30sCisgICAgezB9CiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKgogd3JhcHBlcmRlc2NyX2dldF9kb2MoUHlXcmFwcGVyRGVzY3JPYmplY3QgKmRlc2NyLCB2b2lkICpjbG9zdXJlKQogewotCWlmIChkZXNjci0+ZF9iYXNlLT5kb2MgPT0gTlVMTCkgewotCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCXJldHVybiBQeV9Ob25lOwotCX0KLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhkZXNjci0+ZF9iYXNlLT5kb2MpOworICAgIGlmIChkZXNjci0+ZF9iYXNlLT5kb2MgPT0gTlVMTCkgeworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIHJldHVybiBQeV9Ob25lOworICAgIH0KKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhkZXNjci0+ZF9iYXNlLT5kb2MpOwogfQogCiBzdGF0aWMgUHlHZXRTZXREZWYgd3JhcHBlcmRlc2NyX2dldHNldFtdID0gewotCXsiX19kb2NfXyIsIChnZXR0ZXIpd3JhcHBlcmRlc2NyX2dldF9kb2N9LAotCXswfQorICAgIHsiX19kb2NfXyIsIChnZXR0ZXIpd3JhcHBlcmRlc2NyX2dldF9kb2N9LAorICAgIHswfQogfTsKIAogc3RhdGljIGludAogZGVzY3JfdHJhdmVyc2UoUHlPYmplY3QgKnNlbGYsIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotCVB5RGVzY3JPYmplY3QgKmRlc2NyID0gKFB5RGVzY3JPYmplY3QgKilzZWxmOwotCVB5X1ZJU0lUKGRlc2NyLT5kX3R5cGUpOwotCXJldHVybiAwOworICAgIFB5RGVzY3JPYmplY3QgKmRlc2NyID0gKFB5RGVzY3JPYmplY3QgKilzZWxmOworICAgIFB5X1ZJU0lUKGRlc2NyLT5kX3R5cGUpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IFB5TWV0aG9kRGVzY3JfVHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQotCSJtZXRob2RfZGVzY3JpcHRvciIsCi0Jc2l6ZW9mKFB5TWV0aG9kRGVzY3JPYmplY3QpLAotCTAsCi0JKGRlc3RydWN0b3IpZGVzY3JfZGVhbGxvYywJCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkocmVwcmZ1bmMpbWV0aG9kX3JlcHIsCQkJLyogdHBfcmVwciAqLwotCTAsCQkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCQkvKiB0cF9oYXNoICovCi0JKHRlcm5hcnlmdW5jKW1ldGhvZGRlc2NyX2NhbGwsCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDLCAvKiB0cF9mbGFncyAqLwotCTAsCQkJCQkvKiB0cF9kb2MgKi8KLQlkZXNjcl90cmF2ZXJzZSwJCQkJLyogdHBfdHJhdmVyc2UgKi8KLQkwLAkJCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaXRlciAqLwotCTAsCQkJCQkvKiB0cF9pdGVybmV4dCAqLwotCTAsCQkJCQkvKiB0cF9tZXRob2RzICovCi0JZGVzY3JfbWVtYmVycywJCQkJLyogdHBfbWVtYmVycyAqLwotCW1ldGhvZF9nZXRzZXQsCQkJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJCS8qIHRwX2RpY3QgKi8KLQkoZGVzY3JnZXRmdW5jKW1ldGhvZF9nZXQsCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3Jfc2V0ICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKKyAgICAibWV0aG9kX2Rlc2NyaXB0b3IiLAorICAgIHNpemVvZihQeU1ldGhvZERlc2NyT2JqZWN0KSwKKyAgICAwLAorICAgIChkZXN0cnVjdG9yKWRlc2NyX2RlYWxsb2MsICAgICAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAocmVwcmZ1bmMpbWV0aG9kX3JlcHIsICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAodGVybmFyeWZ1bmMpbWV0aG9kZGVzY3JfY2FsbCwgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsIC8qIHRwX2ZsYWdzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICBkZXNjcl90cmF2ZXJzZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIGRlc2NyX21lbWJlcnMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIG1ldGhvZF9nZXRzZXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgKGRlc2NyZ2V0ZnVuYyltZXRob2RfZ2V0LCAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLwogfTsKIAogLyogVGhpcyBpcyBmb3IgTUVUSF9DTEFTUyBpbiBDLCBub3QgZm9yICJmID0gY2xhc3NtZXRob2QoZikiIGluIFB5dGhvbiEgKi8KIHN0YXRpYyBQeVR5cGVPYmplY3QgUHlDbGFzc01ldGhvZERlc2NyX1R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKLQkiY2xhc3NtZXRob2RfZGVzY3JpcHRvciIsCi0Jc2l6ZW9mKFB5TWV0aG9kRGVzY3JPYmplY3QpLAotCTAsCi0JKGRlc3RydWN0b3IpZGVzY3JfZGVhbGxvYywJCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkocmVwcmZ1bmMpbWV0aG9kX3JlcHIsCQkJLyogdHBfcmVwciAqLwotCTAsCQkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCQkvKiB0cF9oYXNoICovCi0JKHRlcm5hcnlmdW5jKWNsYXNzbWV0aG9kZGVzY3JfY2FsbCwJLyogdHBfY2FsbCAqLwotCTAsCQkJCQkvKiB0cF9zdHIgKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQywgLyogdHBfZmxhZ3MgKi8KLQkwLAkJCQkJLyogdHBfZG9jICovCi0JZGVzY3JfdHJhdmVyc2UsCQkJCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkJLyogdHBfaXRlcm5leHQgKi8KLQkwLAkJCQkJLyogdHBfbWV0aG9kcyAqLwotCWRlc2NyX21lbWJlcnMsCQkJCS8qIHRwX21lbWJlcnMgKi8KLQltZXRob2RfZ2V0c2V0LAkJCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCQkvKiB0cF9kaWN0ICovCi0JKGRlc2NyZ2V0ZnVuYyljbGFzc21ldGhvZF9nZXQsCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3Jfc2V0ICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKKyAgICAiY2xhc3NtZXRob2RfZGVzY3JpcHRvciIsCisgICAgc2l6ZW9mKFB5TWV0aG9kRGVzY3JPYmplY3QpLAorICAgIDAsCisgICAgKGRlc3RydWN0b3IpZGVzY3JfZGVhbGxvYywgICAgICAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIChyZXByZnVuYyltZXRob2RfcmVwciwgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgICh0ZXJuYXJ5ZnVuYyljbGFzc21ldGhvZGRlc2NyX2NhbGwsICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQywgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgIGRlc2NyX3RyYXZlcnNlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgZGVzY3JfbWVtYmVycywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgbWV0aG9kX2dldHNldCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAoZGVzY3JnZXRmdW5jKWNsYXNzbWV0aG9kX2dldCwgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCiB9OwogCiBQeVR5cGVPYmplY3QgUHlNZW1iZXJEZXNjcl9UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCi0JIm1lbWJlcl9kZXNjcmlwdG9yIiwKLQlzaXplb2YoUHlNZW1iZXJEZXNjck9iamVjdCksCi0JMCwKLQkoZGVzdHJ1Y3RvcilkZXNjcl9kZWFsbG9jLAkJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfY29tcGFyZSAqLwotCShyZXByZnVuYyltZW1iZXJfcmVwciwJCQkvKiB0cF9yZXByICovCi0JMCwJCQkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJCQkJCS8qIHRwX2hhc2ggKi8KLQkwLAkJCQkJLyogdHBfY2FsbCAqLwotCTAsCQkJCQkvKiB0cF9zdHIgKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQywgLyogdHBfZmxhZ3MgKi8KLQkwLAkJCQkJLyogdHBfZG9jICovCi0JZGVzY3JfdHJhdmVyc2UsCQkJCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkJLyogdHBfaXRlcm5leHQgKi8KLQkwLAkJCQkJLyogdHBfbWV0aG9kcyAqLwotCWRlc2NyX21lbWJlcnMsCQkJCS8qIHRwX21lbWJlcnMgKi8KLQltZW1iZXJfZ2V0c2V0LAkJCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCQkvKiB0cF9kaWN0ICovCi0JKGRlc2NyZ2V0ZnVuYyltZW1iZXJfZ2V0LAkJLyogdHBfZGVzY3JfZ2V0ICovCi0JKGRlc2Nyc2V0ZnVuYyltZW1iZXJfc2V0LAkJLyogdHBfZGVzY3Jfc2V0ICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKKyAgICAibWVtYmVyX2Rlc2NyaXB0b3IiLAorICAgIHNpemVvZihQeU1lbWJlckRlc2NyT2JqZWN0KSwKKyAgICAwLAorICAgIChkZXN0cnVjdG9yKWRlc2NyX2RlYWxsb2MsICAgICAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAocmVwcmZ1bmMpbWVtYmVyX3JlcHIsICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsIC8qIHRwX2ZsYWdzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICBkZXNjcl90cmF2ZXJzZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIGRlc2NyX21lbWJlcnMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIG1lbWJlcl9nZXRzZXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgKGRlc2NyZ2V0ZnVuYyltZW1iZXJfZ2V0LCAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAoZGVzY3JzZXRmdW5jKW1lbWJlcl9zZXQsICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLwogfTsKIAogUHlUeXBlT2JqZWN0IFB5R2V0U2V0RGVzY3JfVHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQotCSJnZXRzZXRfZGVzY3JpcHRvciIsCi0Jc2l6ZW9mKFB5R2V0U2V0RGVzY3JPYmplY3QpLAotCTAsCi0JKGRlc3RydWN0b3IpZGVzY3JfZGVhbGxvYywJCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkocmVwcmZ1bmMpZ2V0c2V0X3JlcHIsCQkJLyogdHBfcmVwciAqLwotCTAsCQkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCQkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsIC8qIHRwX2ZsYWdzICovCi0JMCwJCQkJCS8qIHRwX2RvYyAqLwotCWRlc2NyX3RyYXZlcnNlLAkJCQkvKiB0cF90cmF2ZXJzZSAqLwotCTAsCQkJCQkvKiB0cF9jbGVhciAqLwotCTAsCQkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCTAsCQkJCQkvKiB0cF9pdGVyICovCi0JMCwJCQkJCS8qIHRwX2l0ZXJuZXh0ICovCi0JMCwJCQkJCS8qIHRwX21ldGhvZHMgKi8KLQlkZXNjcl9tZW1iZXJzLAkJCQkvKiB0cF9tZW1iZXJzICovCi0JZ2V0c2V0X2dldHNldCwJCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkJLyogdHBfZGljdCAqLwotCShkZXNjcmdldGZ1bmMpZ2V0c2V0X2dldCwJCS8qIHRwX2Rlc2NyX2dldCAqLwotCShkZXNjcnNldGZ1bmMpZ2V0c2V0X3NldCwJCS8qIHRwX2Rlc2NyX3NldCAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCisgICAgImdldHNldF9kZXNjcmlwdG9yIiwKKyAgICBzaXplb2YoUHlHZXRTZXREZXNjck9iamVjdCksCisgICAgMCwKKyAgICAoZGVzdHJ1Y3RvcilkZXNjcl9kZWFsbG9jLCAgICAgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgKHJlcHJmdW5jKWdldHNldF9yZXByLCAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDLCAvKiB0cF9mbGFncyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgZGVzY3JfdHJhdmVyc2UsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICBkZXNjcl9tZW1iZXJzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICBnZXRzZXRfZ2V0c2V0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIChkZXNjcmdldGZ1bmMpZ2V0c2V0X2dldCwgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgKGRlc2Nyc2V0ZnVuYylnZXRzZXRfc2V0LCAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KIH07CiAKIFB5VHlwZU9iamVjdCBQeVdyYXBwZXJEZXNjcl9UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCi0JIndyYXBwZXJfZGVzY3JpcHRvciIsCi0Jc2l6ZW9mKFB5V3JhcHBlckRlc2NyT2JqZWN0KSwKLQkwLAotCShkZXN0cnVjdG9yKWRlc2NyX2RlYWxsb2MsCQkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9jb21wYXJlICovCi0JKHJlcHJmdW5jKXdyYXBwZXJkZXNjcl9yZXByLAkJLyogdHBfcmVwciAqLwotCTAsCQkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCQkvKiB0cF9oYXNoICovCi0JKHRlcm5hcnlmdW5jKXdyYXBwZXJkZXNjcl9jYWxsLAkJLyogdHBfY2FsbCAqLwotCTAsCQkJCQkvKiB0cF9zdHIgKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQywgLyogdHBfZmxhZ3MgKi8KLQkwLAkJCQkJLyogdHBfZG9jICovCi0JZGVzY3JfdHJhdmVyc2UsCQkJCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkJLyogdHBfaXRlcm5leHQgKi8KLQkwLAkJCQkJLyogdHBfbWV0aG9kcyAqLwotCWRlc2NyX21lbWJlcnMsCQkJCS8qIHRwX21lbWJlcnMgKi8KLQl3cmFwcGVyZGVzY3JfZ2V0c2V0LAkJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJCS8qIHRwX2RpY3QgKi8KLQkoZGVzY3JnZXRmdW5jKXdyYXBwZXJkZXNjcl9nZXQsCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3Jfc2V0ICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKKyAgICAid3JhcHBlcl9kZXNjcmlwdG9yIiwKKyAgICBzaXplb2YoUHlXcmFwcGVyRGVzY3JPYmplY3QpLAorICAgIDAsCisgICAgKGRlc3RydWN0b3IpZGVzY3JfZGVhbGxvYywgICAgICAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIChyZXByZnVuYyl3cmFwcGVyZGVzY3JfcmVwciwgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgICh0ZXJuYXJ5ZnVuYyl3cmFwcGVyZGVzY3JfY2FsbCwgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQywgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgIGRlc2NyX3RyYXZlcnNlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgZGVzY3JfbWVtYmVycywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgd3JhcHBlcmRlc2NyX2dldHNldCwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAoZGVzY3JnZXRmdW5jKXdyYXBwZXJkZXNjcl9nZXQsICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCiB9OwogCiBzdGF0aWMgUHlEZXNjck9iamVjdCAqCiBkZXNjcl9uZXcoUHlUeXBlT2JqZWN0ICpkZXNjcnR5cGUsIFB5VHlwZU9iamVjdCAqdHlwZSwgY29uc3QgY2hhciAqbmFtZSkKIHsKLQlQeURlc2NyT2JqZWN0ICpkZXNjcjsKKyAgICBQeURlc2NyT2JqZWN0ICpkZXNjcjsKIAotCWRlc2NyID0gKFB5RGVzY3JPYmplY3QgKilQeVR5cGVfR2VuZXJpY0FsbG9jKGRlc2NydHlwZSwgMCk7Ci0JaWYgKGRlc2NyICE9IE5VTEwpIHsKLQkJUHlfWElOQ1JFRih0eXBlKTsKLQkJZGVzY3ItPmRfdHlwZSA9IHR5cGU7Ci0JCWRlc2NyLT5kX25hbWUgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKG5hbWUpOwotCQlpZiAoZGVzY3ItPmRfbmFtZSA9PSBOVUxMKSB7Ci0JCQlQeV9ERUNSRUYoZGVzY3IpOwotCQkJZGVzY3IgPSBOVUxMOwotCQl9Ci0JfQotCXJldHVybiBkZXNjcjsKKyAgICBkZXNjciA9IChQeURlc2NyT2JqZWN0ICopUHlUeXBlX0dlbmVyaWNBbGxvYyhkZXNjcnR5cGUsIDApOworICAgIGlmIChkZXNjciAhPSBOVUxMKSB7CisgICAgICAgIFB5X1hJTkNSRUYodHlwZSk7CisgICAgICAgIGRlc2NyLT5kX3R5cGUgPSB0eXBlOworICAgICAgICBkZXNjci0+ZF9uYW1lID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZyhuYW1lKTsKKyAgICAgICAgaWYgKGRlc2NyLT5kX25hbWUgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKGRlc2NyKTsKKyAgICAgICAgICAgIGRlc2NyID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZGVzY3I7CiB9CiAKIFB5T2JqZWN0ICoKIFB5RGVzY3JfTmV3TWV0aG9kKFB5VHlwZU9iamVjdCAqdHlwZSwgUHlNZXRob2REZWYgKm1ldGhvZCkKIHsKLQlQeU1ldGhvZERlc2NyT2JqZWN0ICpkZXNjcjsKKyAgICBQeU1ldGhvZERlc2NyT2JqZWN0ICpkZXNjcjsKIAotCWRlc2NyID0gKFB5TWV0aG9kRGVzY3JPYmplY3QgKilkZXNjcl9uZXcoJlB5TWV0aG9kRGVzY3JfVHlwZSwKLQkJCQkJCSB0eXBlLCBtZXRob2QtPm1sX25hbWUpOwotCWlmIChkZXNjciAhPSBOVUxMKQotCQlkZXNjci0+ZF9tZXRob2QgPSBtZXRob2Q7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWRlc2NyOworICAgIGRlc2NyID0gKFB5TWV0aG9kRGVzY3JPYmplY3QgKilkZXNjcl9uZXcoJlB5TWV0aG9kRGVzY3JfVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsIG1ldGhvZC0+bWxfbmFtZSk7CisgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgIGRlc2NyLT5kX21ldGhvZCA9IG1ldGhvZDsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopZGVzY3I7CiB9CiAKIFB5T2JqZWN0ICoKIFB5RGVzY3JfTmV3Q2xhc3NNZXRob2QoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU1ldGhvZERlZiAqbWV0aG9kKQogewotCVB5TWV0aG9kRGVzY3JPYmplY3QgKmRlc2NyOworICAgIFB5TWV0aG9kRGVzY3JPYmplY3QgKmRlc2NyOwogCi0JZGVzY3IgPSAoUHlNZXRob2REZXNjck9iamVjdCAqKWRlc2NyX25ldygmUHlDbGFzc01ldGhvZERlc2NyX1R5cGUsCi0JCQkJCQkgdHlwZSwgbWV0aG9kLT5tbF9uYW1lKTsKLQlpZiAoZGVzY3IgIT0gTlVMTCkKLQkJZGVzY3ItPmRfbWV0aG9kID0gbWV0aG9kOwotCXJldHVybiAoUHlPYmplY3QgKilkZXNjcjsKKyAgICBkZXNjciA9IChQeU1ldGhvZERlc2NyT2JqZWN0ICopZGVzY3JfbmV3KCZQeUNsYXNzTWV0aG9kRGVzY3JfVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsIG1ldGhvZC0+bWxfbmFtZSk7CisgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgIGRlc2NyLT5kX21ldGhvZCA9IG1ldGhvZDsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopZGVzY3I7CiB9CiAKIFB5T2JqZWN0ICoKIFB5RGVzY3JfTmV3TWVtYmVyKFB5VHlwZU9iamVjdCAqdHlwZSwgUHlNZW1iZXJEZWYgKm1lbWJlcikKIHsKLQlQeU1lbWJlckRlc2NyT2JqZWN0ICpkZXNjcjsKKyAgICBQeU1lbWJlckRlc2NyT2JqZWN0ICpkZXNjcjsKIAotCWRlc2NyID0gKFB5TWVtYmVyRGVzY3JPYmplY3QgKilkZXNjcl9uZXcoJlB5TWVtYmVyRGVzY3JfVHlwZSwKLQkJCQkJCSB0eXBlLCBtZW1iZXItPm5hbWUpOwotCWlmIChkZXNjciAhPSBOVUxMKQotCQlkZXNjci0+ZF9tZW1iZXIgPSBtZW1iZXI7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWRlc2NyOworICAgIGRlc2NyID0gKFB5TWVtYmVyRGVzY3JPYmplY3QgKilkZXNjcl9uZXcoJlB5TWVtYmVyRGVzY3JfVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsIG1lbWJlci0+bmFtZSk7CisgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgIGRlc2NyLT5kX21lbWJlciA9IG1lbWJlcjsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopZGVzY3I7CiB9CiAKIFB5T2JqZWN0ICoKIFB5RGVzY3JfTmV3R2V0U2V0KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlHZXRTZXREZWYgKmdldHNldCkKIHsKLQlQeUdldFNldERlc2NyT2JqZWN0ICpkZXNjcjsKKyAgICBQeUdldFNldERlc2NyT2JqZWN0ICpkZXNjcjsKIAotCWRlc2NyID0gKFB5R2V0U2V0RGVzY3JPYmplY3QgKilkZXNjcl9uZXcoJlB5R2V0U2V0RGVzY3JfVHlwZSwKLQkJCQkJCSB0eXBlLCBnZXRzZXQtPm5hbWUpOwotCWlmIChkZXNjciAhPSBOVUxMKQotCQlkZXNjci0+ZF9nZXRzZXQgPSBnZXRzZXQ7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWRlc2NyOworICAgIGRlc2NyID0gKFB5R2V0U2V0RGVzY3JPYmplY3QgKilkZXNjcl9uZXcoJlB5R2V0U2V0RGVzY3JfVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsIGdldHNldC0+bmFtZSk7CisgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgIGRlc2NyLT5kX2dldHNldCA9IGdldHNldDsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopZGVzY3I7CiB9CiAKIFB5T2JqZWN0ICoKIFB5RGVzY3JfTmV3V3JhcHBlcihQeVR5cGVPYmplY3QgKnR5cGUsIHN0cnVjdCB3cmFwcGVyYmFzZSAqYmFzZSwgdm9pZCAqd3JhcHBlZCkKIHsKLQlQeVdyYXBwZXJEZXNjck9iamVjdCAqZGVzY3I7CisgICAgUHlXcmFwcGVyRGVzY3JPYmplY3QgKmRlc2NyOwogCi0JZGVzY3IgPSAoUHlXcmFwcGVyRGVzY3JPYmplY3QgKilkZXNjcl9uZXcoJlB5V3JhcHBlckRlc2NyX1R5cGUsCi0JCQkJCQkgdHlwZSwgYmFzZS0+bmFtZSk7Ci0JaWYgKGRlc2NyICE9IE5VTEwpIHsKLQkJZGVzY3ItPmRfYmFzZSA9IGJhc2U7Ci0JCWRlc2NyLT5kX3dyYXBwZWQgPSB3cmFwcGVkOwotCX0KLQlyZXR1cm4gKFB5T2JqZWN0ICopZGVzY3I7CisgICAgZGVzY3IgPSAoUHlXcmFwcGVyRGVzY3JPYmplY3QgKilkZXNjcl9uZXcoJlB5V3JhcHBlckRlc2NyX1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLCBiYXNlLT5uYW1lKTsKKyAgICBpZiAoZGVzY3IgIT0gTlVMTCkgeworICAgICAgICBkZXNjci0+ZF9iYXNlID0gYmFzZTsKKyAgICAgICAgZGVzY3ItPmRfd3JhcHBlZCA9IHdyYXBwZWQ7CisgICAgfQorICAgIHJldHVybiAoUHlPYmplY3QgKilkZXNjcjsKIH0KIAogCkBAIC02NTQsMjIxICs2NTQsMjIxIEBACiAgICBiaXQgb2YgYSBwYWluICovCiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JUHlPYmplY3QgKmRpY3Q7CisgICAgUHlPYmplY3RfSEVBRAorICAgIFB5T2JqZWN0ICpkaWN0OwogfSBwcm94eW9iamVjdDsKIAogc3RhdGljIFB5X3NzaXplX3QKIHByb3h5X2xlbihwcm94eW9iamVjdCAqcHApCiB7Ci0JcmV0dXJuIFB5T2JqZWN0X1NpemUocHAtPmRpY3QpOworICAgIHJldHVybiBQeU9iamVjdF9TaXplKHBwLT5kaWN0KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHByb3h5X2dldGl0ZW0ocHJveHlvYmplY3QgKnBwLCBQeU9iamVjdCAqa2V5KQogewotCXJldHVybiBQeU9iamVjdF9HZXRJdGVtKHBwLT5kaWN0LCBrZXkpOworICAgIHJldHVybiBQeU9iamVjdF9HZXRJdGVtKHBwLT5kaWN0LCBrZXkpOwogfQogCiBzdGF0aWMgUHlNYXBwaW5nTWV0aG9kcyBwcm94eV9hc19tYXBwaW5nID0gewotCShsZW5mdW5jKXByb3h5X2xlbiwJCQkvKiBtcF9sZW5ndGggKi8KLQkoYmluYXJ5ZnVuYylwcm94eV9nZXRpdGVtLAkJLyogbXBfc3Vic2NyaXB0ICovCi0JMCwJCQkJCS8qIG1wX2Fzc19zdWJzY3JpcHQgKi8KKyAgICAobGVuZnVuYylwcm94eV9sZW4sICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1wX2xlbmd0aCAqLworICAgIChiaW5hcnlmdW5jKXByb3h5X2dldGl0ZW0sICAgICAgICAgICAgICAgICAgLyogbXBfc3Vic2NyaXB0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtcF9hc3Nfc3Vic2NyaXB0ICovCiB9OwogCiBzdGF0aWMgaW50CiBwcm94eV9jb250YWlucyhwcm94eW9iamVjdCAqcHAsIFB5T2JqZWN0ICprZXkpCiB7Ci0JcmV0dXJuIFB5RGljdF9Db250YWlucyhwcC0+ZGljdCwga2V5KTsKKyAgICByZXR1cm4gUHlEaWN0X0NvbnRhaW5zKHBwLT5kaWN0LCBrZXkpOwogfQogCiBzdGF0aWMgUHlTZXF1ZW5jZU1ldGhvZHMgcHJveHlfYXNfc2VxdWVuY2UgPSB7Ci0JMCwJCQkJCS8qIHNxX2xlbmd0aCAqLwotCTAsCQkJCQkvKiBzcV9jb25jYXQgKi8KLQkwLAkJCQkJLyogc3FfcmVwZWF0ICovCi0JMCwJCQkJCS8qIHNxX2l0ZW0gKi8KLQkwLAkJCQkJLyogc3Ffc2xpY2UgKi8KLQkwLAkJCQkJLyogc3FfYXNzX2l0ZW0gKi8KLQkwLAkJCQkJLyogc3FfYXNzX3NsaWNlICovCi0JKG9iam9ianByb2MpcHJveHlfY29udGFpbnMsCQkvKiBzcV9jb250YWlucyAqLwotCTAsCQkJCQkvKiBzcV9pbnBsYWNlX2NvbmNhdCAqLwotCTAsCQkJCQkvKiBzcV9pbnBsYWNlX3JlcGVhdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3FfbGVuZ3RoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzcV9jb25jYXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNxX3JlcGVhdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3FfaXRlbSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3Ffc2xpY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNxX2Fzc19pdGVtICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzcV9hc3Nfc2xpY2UgKi8KKyAgICAob2Jqb2JqcHJvYylwcm94eV9jb250YWlucywgICAgICAgICAgICAgICAgIC8qIHNxX2NvbnRhaW5zICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzcV9pbnBsYWNlX2NvbmNhdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3FfaW5wbGFjZV9yZXBlYXQgKi8KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBwcm94eV9oYXNfa2V5KHByb3h5b2JqZWN0ICpwcCwgUHlPYmplY3QgKmtleSkKIHsKLQlpbnQgcmVzID0gUHlEaWN0X0NvbnRhaW5zKHBwLT5kaWN0LCBrZXkpOwotCWlmIChyZXMgPCAwKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKHJlcyk7CisgICAgaW50IHJlcyA9IFB5RGljdF9Db250YWlucyhwcC0+ZGljdCwga2V5KTsKKyAgICBpZiAocmVzIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZyhyZXMpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogcHJveHlfZ2V0KHByb3h5b2JqZWN0ICpwcCwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKmtleSwgKmRlZiA9IFB5X05vbmU7CisgICAgUHlPYmplY3QgKmtleSwgKmRlZiA9IFB5X05vbmU7CiAKLQlpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJnZXQiLCAxLCAyLCAma2V5LCAmZGVmKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIFB5T2JqZWN0X0NhbGxNZXRob2QocHAtPmRpY3QsICJnZXQiLCAiKE9PKSIsIGtleSwgZGVmKTsKKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJnZXQiLCAxLCAyLCAma2V5LCAmZGVmKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFB5T2JqZWN0X0NhbGxNZXRob2QocHAtPmRpY3QsICJnZXQiLCAiKE9PKSIsIGtleSwgZGVmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHByb3h5X2tleXMocHJveHlvYmplY3QgKnBwKQogewotCXJldHVybiBQeU1hcHBpbmdfS2V5cyhwcC0+ZGljdCk7CisgICAgcmV0dXJuIFB5TWFwcGluZ19LZXlzKHBwLT5kaWN0KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHByb3h5X3ZhbHVlcyhwcm94eW9iamVjdCAqcHApCiB7Ci0JcmV0dXJuIFB5TWFwcGluZ19WYWx1ZXMocHAtPmRpY3QpOworICAgIHJldHVybiBQeU1hcHBpbmdfVmFsdWVzKHBwLT5kaWN0KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHByb3h5X2l0ZW1zKHByb3h5b2JqZWN0ICpwcCkKIHsKLQlyZXR1cm4gUHlNYXBwaW5nX0l0ZW1zKHBwLT5kaWN0KTsKKyAgICByZXR1cm4gUHlNYXBwaW5nX0l0ZW1zKHBwLT5kaWN0KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHByb3h5X2l0ZXJrZXlzKHByb3h5b2JqZWN0ICpwcCkKIHsKLQlyZXR1cm4gUHlPYmplY3RfQ2FsbE1ldGhvZChwcC0+ZGljdCwgIml0ZXJrZXlzIiwgTlVMTCk7CisgICAgcmV0dXJuIFB5T2JqZWN0X0NhbGxNZXRob2QocHAtPmRpY3QsICJpdGVya2V5cyIsIE5VTEwpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogcHJveHlfaXRlcnZhbHVlcyhwcm94eW9iamVjdCAqcHApCiB7Ci0JcmV0dXJuIFB5T2JqZWN0X0NhbGxNZXRob2QocHAtPmRpY3QsICJpdGVydmFsdWVzIiwgTlVMTCk7CisgICAgcmV0dXJuIFB5T2JqZWN0X0NhbGxNZXRob2QocHAtPmRpY3QsICJpdGVydmFsdWVzIiwgTlVMTCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBwcm94eV9pdGVyaXRlbXMocHJveHlvYmplY3QgKnBwKQogewotCXJldHVybiBQeU9iamVjdF9DYWxsTWV0aG9kKHBwLT5kaWN0LCAiaXRlcml0ZW1zIiwgTlVMTCk7CisgICAgcmV0dXJuIFB5T2JqZWN0X0NhbGxNZXRob2QocHAtPmRpY3QsICJpdGVyaXRlbXMiLCBOVUxMKTsKIH0KIHN0YXRpYyBQeU9iamVjdCAqCiBwcm94eV9jb3B5KHByb3h5b2JqZWN0ICpwcCkKIHsKLQlyZXR1cm4gUHlPYmplY3RfQ2FsbE1ldGhvZChwcC0+ZGljdCwgImNvcHkiLCBOVUxMKTsKKyAgICByZXR1cm4gUHlPYmplY3RfQ2FsbE1ldGhvZChwcC0+ZGljdCwgImNvcHkiLCBOVUxMKTsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIHByb3h5X21ldGhvZHNbXSA9IHsKLQl7Imhhc19rZXkiLCAgIChQeUNGdW5jdGlvbilwcm94eV9oYXNfa2V5LCAgICBNRVRIX08sCi0JIFB5RG9jX1NUUigiRC5oYXNfa2V5KGspIC0+IFRydWUgaWYgRCBoYXMgYSBrZXkgaywgZWxzZSBGYWxzZSIpfSwKLQl7ImdldCIsICAgICAgIChQeUNGdW5jdGlvbilwcm94eV9nZXQsICAgICAgICBNRVRIX1ZBUkFSR1MsCi0JIFB5RG9jX1NUUigiRC5nZXQoa1ssZF0pIC0+IERba10gaWYgRC5oYXNfa2V5KGspLCBlbHNlIGQuIgotCSAJCQkJIiAgZCBkZWZhdWx0cyB0byBOb25lLiIpfSwKLQl7ImtleXMiLCAgICAgIChQeUNGdW5jdGlvbilwcm94eV9rZXlzLCAgICAgICBNRVRIX05PQVJHUywKLQkgUHlEb2NfU1RSKCJELmtleXMoKSAtPiBsaXN0IG9mIEQncyBrZXlzIil9LAotCXsidmFsdWVzIiwgICAgKFB5Q0Z1bmN0aW9uKXByb3h5X3ZhbHVlcywgICAgIE1FVEhfTk9BUkdTLAotCSBQeURvY19TVFIoIkQudmFsdWVzKCkgLT4gbGlzdCBvZiBEJ3MgdmFsdWVzIil9LAotCXsiaXRlbXMiLCAgICAgKFB5Q0Z1bmN0aW9uKXByb3h5X2l0ZW1zLCAgICAgIE1FVEhfTk9BUkdTLAotCSBQeURvY19TVFIoIkQuaXRlbXMoKSAtPiBsaXN0IG9mIEQncyAoa2V5LCB2YWx1ZSkgcGFpcnMsIGFzIDItdHVwbGVzIil9LAotCXsiaXRlcmtleXMiLCAgKFB5Q0Z1bmN0aW9uKXByb3h5X2l0ZXJrZXlzLCAgIE1FVEhfTk9BUkdTLAotCSBQeURvY19TVFIoIkQuaXRlcmtleXMoKSAtPiBhbiBpdGVyYXRvciBvdmVyIHRoZSBrZXlzIG9mIEQiKX0sCi0JeyJpdGVydmFsdWVzIiwoUHlDRnVuY3Rpb24pcHJveHlfaXRlcnZhbHVlcywgTUVUSF9OT0FSR1MsCi0JIFB5RG9jX1NUUigiRC5pdGVydmFsdWVzKCkgLT4gYW4gaXRlcmF0b3Igb3ZlciB0aGUgdmFsdWVzIG9mIEQiKX0sCi0JeyJpdGVyaXRlbXMiLCAoUHlDRnVuY3Rpb24pcHJveHlfaXRlcml0ZW1zLCAgTUVUSF9OT0FSR1MsCi0JIFB5RG9jX1NUUigiRC5pdGVyaXRlbXMoKSAtPiIKLQkgCSAgICIgYW4gaXRlcmF0b3Igb3ZlciB0aGUgKGtleSwgdmFsdWUpIGl0ZW1zIG9mIEQiKX0sCi0JeyJjb3B5IiwgICAgICAoUHlDRnVuY3Rpb24pcHJveHlfY29weSwgICAgICAgTUVUSF9OT0FSR1MsCi0JIFB5RG9jX1NUUigiRC5jb3B5KCkgLT4gYSBzaGFsbG93IGNvcHkgb2YgRCIpfSwKLQl7MH0KKyAgICB7Imhhc19rZXkiLCAgIChQeUNGdW5jdGlvbilwcm94eV9oYXNfa2V5LCAgICBNRVRIX08sCisgICAgIFB5RG9jX1NUUigiRC5oYXNfa2V5KGspIC0+IFRydWUgaWYgRCBoYXMgYSBrZXkgaywgZWxzZSBGYWxzZSIpfSwKKyAgICB7ImdldCIsICAgICAgIChQeUNGdW5jdGlvbilwcm94eV9nZXQsICAgICAgICBNRVRIX1ZBUkFSR1MsCisgICAgIFB5RG9jX1NUUigiRC5nZXQoa1ssZF0pIC0+IERba10gaWYgRC5oYXNfa2V5KGspLCBlbHNlIGQuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgZCBkZWZhdWx0cyB0byBOb25lLiIpfSwKKyAgICB7ImtleXMiLCAgICAgIChQeUNGdW5jdGlvbilwcm94eV9rZXlzLCAgICAgICBNRVRIX05PQVJHUywKKyAgICAgUHlEb2NfU1RSKCJELmtleXMoKSAtPiBsaXN0IG9mIEQncyBrZXlzIil9LAorICAgIHsidmFsdWVzIiwgICAgKFB5Q0Z1bmN0aW9uKXByb3h5X3ZhbHVlcywgICAgIE1FVEhfTk9BUkdTLAorICAgICBQeURvY19TVFIoIkQudmFsdWVzKCkgLT4gbGlzdCBvZiBEJ3MgdmFsdWVzIil9LAorICAgIHsiaXRlbXMiLCAgICAgKFB5Q0Z1bmN0aW9uKXByb3h5X2l0ZW1zLCAgICAgIE1FVEhfTk9BUkdTLAorICAgICBQeURvY19TVFIoIkQuaXRlbXMoKSAtPiBsaXN0IG9mIEQncyAoa2V5LCB2YWx1ZSkgcGFpcnMsIGFzIDItdHVwbGVzIil9LAorICAgIHsiaXRlcmtleXMiLCAgKFB5Q0Z1bmN0aW9uKXByb3h5X2l0ZXJrZXlzLCAgIE1FVEhfTk9BUkdTLAorICAgICBQeURvY19TVFIoIkQuaXRlcmtleXMoKSAtPiBhbiBpdGVyYXRvciBvdmVyIHRoZSBrZXlzIG9mIEQiKX0sCisgICAgeyJpdGVydmFsdWVzIiwoUHlDRnVuY3Rpb24pcHJveHlfaXRlcnZhbHVlcywgTUVUSF9OT0FSR1MsCisgICAgIFB5RG9jX1NUUigiRC5pdGVydmFsdWVzKCkgLT4gYW4gaXRlcmF0b3Igb3ZlciB0aGUgdmFsdWVzIG9mIEQiKX0sCisgICAgeyJpdGVyaXRlbXMiLCAoUHlDRnVuY3Rpb24pcHJveHlfaXRlcml0ZW1zLCAgTUVUSF9OT0FSR1MsCisgICAgIFB5RG9jX1NUUigiRC5pdGVyaXRlbXMoKSAtPiIKKyAgICAgICAgICAgICAgICIgYW4gaXRlcmF0b3Igb3ZlciB0aGUgKGtleSwgdmFsdWUpIGl0ZW1zIG9mIEQiKX0sCisgICAgeyJjb3B5IiwgICAgICAoUHlDRnVuY3Rpb24pcHJveHlfY29weSwgICAgICAgTUVUSF9OT0FSR1MsCisgICAgIFB5RG9jX1NUUigiRC5jb3B5KCkgLT4gYSBzaGFsbG93IGNvcHkgb2YgRCIpfSwKKyAgICB7MH0KIH07CiAKIHN0YXRpYyB2b2lkCiBwcm94eV9kZWFsbG9jKHByb3h5b2JqZWN0ICpwcCkKIHsKLQlfUHlPYmplY3RfR0NfVU5UUkFDSyhwcCk7Ci0JUHlfREVDUkVGKHBwLT5kaWN0KTsKLQlQeU9iamVjdF9HQ19EZWwocHApOworICAgIF9QeU9iamVjdF9HQ19VTlRSQUNLKHBwKTsKKyAgICBQeV9ERUNSRUYocHAtPmRpY3QpOworICAgIFB5T2JqZWN0X0dDX0RlbChwcCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBwcm94eV9nZXRpdGVyKHByb3h5b2JqZWN0ICpwcCkKIHsKLQlyZXR1cm4gUHlPYmplY3RfR2V0SXRlcihwcC0+ZGljdCk7CisgICAgcmV0dXJuIFB5T2JqZWN0X0dldEl0ZXIocHAtPmRpY3QpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogcHJveHlfc3RyKHByb3h5b2JqZWN0ICpwcCkKIHsKLQlyZXR1cm4gUHlPYmplY3RfU3RyKHBwLT5kaWN0KTsKKyAgICByZXR1cm4gUHlPYmplY3RfU3RyKHBwLT5kaWN0KTsKIH0KIAogc3RhdGljIGludAogcHJveHlfdHJhdmVyc2UoUHlPYmplY3QgKnNlbGYsIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotCXByb3h5b2JqZWN0ICpwcCA9IChwcm94eW9iamVjdCAqKXNlbGY7Ci0JUHlfVklTSVQocHAtPmRpY3QpOwotCXJldHVybiAwOworICAgIHByb3h5b2JqZWN0ICpwcCA9IChwcm94eW9iamVjdCAqKXNlbGY7CisgICAgUHlfVklTSVQocHAtPmRpY3QpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBwcm94eV9jb21wYXJlKHByb3h5b2JqZWN0ICp2LCBQeU9iamVjdCAqdykKIHsKLQlyZXR1cm4gUHlPYmplY3RfQ29tcGFyZSh2LT5kaWN0LCB3KTsKKyAgICByZXR1cm4gUHlPYmplY3RfQ29tcGFyZSh2LT5kaWN0LCB3KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHByb3h5X3JpY2hjb21wYXJlKHByb3h5b2JqZWN0ICp2LCBQeU9iamVjdCAqdywgaW50IG9wKQogewotCXJldHVybiBQeU9iamVjdF9SaWNoQ29tcGFyZSh2LT5kaWN0LCB3LCBvcCk7CisgICAgcmV0dXJuIFB5T2JqZWN0X1JpY2hDb21wYXJlKHYtPmRpY3QsIHcsIG9wKTsKIH0KIAogUHlUeXBlT2JqZWN0IFB5RGljdFByb3h5X1R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKLQkiZGljdHByb3h5IiwJCQkJLyogdHBfbmFtZSAqLwotCXNpemVvZihwcm94eW9iamVjdCksCQkJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJCS8qIHRwX2l0ZW1zaXplICovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKXByb3h5X2RlYWxsb2MsIAkJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkoY21wZnVuYylwcm94eV9jb21wYXJlLAkJCS8qIHRwX2NvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfcmVwciAqLwotCTAsCQkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkmcHJveHlfYXNfc2VxdWVuY2UsCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkmcHJveHlfYXNfbWFwcGluZywJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJCQkJCS8qIHRwX2hhc2ggKi8KLQkwLAkJCQkJLyogdHBfY2FsbCAqLwotCShyZXByZnVuYylwcm94eV9zdHIsCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCQkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsIC8qIHRwX2ZsYWdzICovCi0gCTAsCQkJCQkvKiB0cF9kb2MgKi8KLQlwcm94eV90cmF2ZXJzZSwJCQkJLyogdHBfdHJhdmVyc2UgKi8KLSAJMCwJCQkJCS8qIHRwX2NsZWFyICovCi0JKHJpY2hjbXBmdW5jKXByb3h5X3JpY2hjb21wYXJlLAkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQkoZ2V0aXRlcmZ1bmMpcHJveHlfZ2V0aXRlciwJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkJLyogdHBfaXRlcm5leHQgKi8KLQlwcm94eV9tZXRob2RzLAkJCQkvKiB0cF9tZXRob2RzICovCi0JMCwJCQkJCS8qIHRwX21lbWJlcnMgKi8KLQkwLAkJCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3Jfc2V0ICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKKyAgICAiZGljdHByb3h5IiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICBzaXplb2YocHJveHlvYmplY3QpLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpcHJveHlfZGVhbGxvYywgICAgICAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIChjbXBmdW5jKXByb3h5X2NvbXBhcmUsICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgJnByb3h5X2FzX3NlcXVlbmNlLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgICZwcm94eV9hc19tYXBwaW5nLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIChyZXByZnVuYylwcm94eV9zdHIsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQywgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgIHByb3h5X3RyYXZlcnNlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgKHJpY2hjbXBmdW5jKXByb3h5X3JpY2hjb21wYXJlLCAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAoZ2V0aXRlcmZ1bmMpcHJveHlfZ2V0aXRlciwgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgcHJveHlfbWV0aG9kcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCiB9OwogCiBQeU9iamVjdCAqCiBQeURpY3RQcm94eV9OZXcoUHlPYmplY3QgKmRpY3QpCiB7Ci0JcHJveHlvYmplY3QgKnBwOworICAgIHByb3h5b2JqZWN0ICpwcDsKIAotCXBwID0gUHlPYmplY3RfR0NfTmV3KHByb3h5b2JqZWN0LCAmUHlEaWN0UHJveHlfVHlwZSk7Ci0JaWYgKHBwICE9IE5VTEwpIHsKLQkJUHlfSU5DUkVGKGRpY3QpOwotCQlwcC0+ZGljdCA9IGRpY3Q7Ci0JCV9QeU9iamVjdF9HQ19UUkFDSyhwcCk7Ci0JfQotCXJldHVybiAoUHlPYmplY3QgKilwcDsKKyAgICBwcCA9IFB5T2JqZWN0X0dDX05ldyhwcm94eW9iamVjdCwgJlB5RGljdFByb3h5X1R5cGUpOworICAgIGlmIChwcCAhPSBOVUxMKSB7CisgICAgICAgIFB5X0lOQ1JFRihkaWN0KTsKKyAgICAgICAgcHAtPmRpY3QgPSBkaWN0OworICAgICAgICBfUHlPYmplY3RfR0NfVFJBQ0socHApOworICAgIH0KKyAgICByZXR1cm4gKFB5T2JqZWN0ICopcHA7CiB9CiAKIApAQCAtODc4LDE4NSArODc4LDE4NSBAQAogICAgYml0IG9mIGEgcGFpbiAqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCVB5V3JhcHBlckRlc2NyT2JqZWN0ICpkZXNjcjsKLQlQeU9iamVjdCAqc2VsZjsKKyAgICBQeU9iamVjdF9IRUFECisgICAgUHlXcmFwcGVyRGVzY3JPYmplY3QgKmRlc2NyOworICAgIFB5T2JqZWN0ICpzZWxmOwogfSB3cmFwcGVyb2JqZWN0OwogCiBzdGF0aWMgdm9pZAogd3JhcHBlcl9kZWFsbG9jKHdyYXBwZXJvYmplY3QgKndwKQogewotCVB5T2JqZWN0X0dDX1VuVHJhY2sod3ApOwotCVB5X1RSQVNIQ0FOX1NBRkVfQkVHSU4od3ApCi0JUHlfWERFQ1JFRih3cC0+ZGVzY3IpOwotCVB5X1hERUNSRUYod3AtPnNlbGYpOwotCVB5T2JqZWN0X0dDX0RlbCh3cCk7Ci0JUHlfVFJBU0hDQU5fU0FGRV9FTkQod3ApCisgICAgUHlPYmplY3RfR0NfVW5UcmFjayh3cCk7CisgICAgUHlfVFJBU0hDQU5fU0FGRV9CRUdJTih3cCkKKyAgICBQeV9YREVDUkVGKHdwLT5kZXNjcik7CisgICAgUHlfWERFQ1JFRih3cC0+c2VsZik7CisgICAgUHlPYmplY3RfR0NfRGVsKHdwKTsKKyAgICBQeV9UUkFTSENBTl9TQUZFX0VORCh3cCkKIH0KIAogc3RhdGljIGludAogd3JhcHBlcl9jb21wYXJlKHdyYXBwZXJvYmplY3QgKmEsIHdyYXBwZXJvYmplY3QgKmIpCiB7Ci0JaWYgKGEtPmRlc2NyID09IGItPmRlc2NyKQotCQlyZXR1cm4gUHlPYmplY3RfQ29tcGFyZShhLT5zZWxmLCBiLT5zZWxmKTsKLQllbHNlCi0JCXJldHVybiAoYS0+ZGVzY3IgPCBiLT5kZXNjcikgPyAtMSA6IDE7CisgICAgaWYgKGEtPmRlc2NyID09IGItPmRlc2NyKQorICAgICAgICByZXR1cm4gUHlPYmplY3RfQ29tcGFyZShhLT5zZWxmLCBiLT5zZWxmKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiAoYS0+ZGVzY3IgPCBiLT5kZXNjcikgPyAtMSA6IDE7CiB9CiAKIHN0YXRpYyBsb25nCiB3cmFwcGVyX2hhc2god3JhcHBlcm9iamVjdCAqd3ApCiB7Ci0JaW50IHgsIHk7Ci0JeCA9IF9QeV9IYXNoUG9pbnRlcih3cC0+ZGVzY3IpOwotCWlmICh4ID09IC0xKQotCQlyZXR1cm4gLTE7Ci0JeSA9IFB5T2JqZWN0X0hhc2god3AtPnNlbGYpOwotCWlmICh5ID09IC0xKQotCQlyZXR1cm4gLTE7Ci0JeCA9IHggXiB5OwotCWlmICh4ID09IC0xKQotCQl4ID0gLTI7Ci0JcmV0dXJuIHg7CisgICAgaW50IHgsIHk7CisgICAgeCA9IF9QeV9IYXNoUG9pbnRlcih3cC0+ZGVzY3IpOworICAgIGlmICh4ID09IC0xKQorICAgICAgICByZXR1cm4gLTE7CisgICAgeSA9IFB5T2JqZWN0X0hhc2god3AtPnNlbGYpOworICAgIGlmICh5ID09IC0xKQorICAgICAgICByZXR1cm4gLTE7CisgICAgeCA9IHggXiB5OworICAgIGlmICh4ID09IC0xKQorICAgICAgICB4ID0gLTI7CisgICAgcmV0dXJuIHg7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB3cmFwcGVyX3JlcHIod3JhcHBlcm9iamVjdCAqd3ApCiB7Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21Gb3JtYXQoIjxtZXRob2Qtd3JhcHBlciAnJXMnIG9mICVzIG9iamVjdCBhdCAlcD4iLAotCQkJCSAgIHdwLT5kZXNjci0+ZF9iYXNlLT5uYW1lLAotCQkJCSAgIHdwLT5zZWxmLT5vYl90eXBlLT50cF9uYW1lLAotCQkJCSAgIHdwLT5zZWxmKTsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbUZvcm1hdCgiPG1ldGhvZC13cmFwcGVyICclcycgb2YgJXMgb2JqZWN0IGF0ICVwPiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3AtPmRlc2NyLT5kX2Jhc2UtPm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3AtPnNlbGYtPm9iX3R5cGUtPnRwX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3AtPnNlbGYpOwogfQogCiBzdGF0aWMgUHlNZW1iZXJEZWYgd3JhcHBlcl9tZW1iZXJzW10gPSB7Ci0JeyJfX3NlbGZfXyIsIFRfT0JKRUNULCBvZmZzZXRvZih3cmFwcGVyb2JqZWN0LCBzZWxmKSwgUkVBRE9OTFl9LAotCXswfQorICAgIHsiX19zZWxmX18iLCBUX09CSkVDVCwgb2Zmc2V0b2Yod3JhcHBlcm9iamVjdCwgc2VsZiksIFJFQURPTkxZfSwKKyAgICB7MH0KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB3cmFwcGVyX29iamNsYXNzKHdyYXBwZXJvYmplY3QgKndwKQogewotCVB5T2JqZWN0ICpjID0gKFB5T2JqZWN0ICopd3AtPmRlc2NyLT5kX3R5cGU7CisgICAgUHlPYmplY3QgKmMgPSAoUHlPYmplY3QgKil3cC0+ZGVzY3ItPmRfdHlwZTsKIAotCVB5X0lOQ1JFRihjKTsKLQlyZXR1cm4gYzsKKyAgICBQeV9JTkNSRUYoYyk7CisgICAgcmV0dXJuIGM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB3cmFwcGVyX25hbWUod3JhcHBlcm9iamVjdCAqd3ApCiB7Ci0JY2hhciAqcyA9IHdwLT5kZXNjci0+ZF9iYXNlLT5uYW1lOworICAgIGNoYXIgKnMgPSB3cC0+ZGVzY3ItPmRfYmFzZS0+bmFtZTsKIAotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKHMpOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKHMpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogd3JhcHBlcl9kb2Mod3JhcHBlcm9iamVjdCAqd3ApCiB7Ci0JY2hhciAqcyA9IHdwLT5kZXNjci0+ZF9iYXNlLT5kb2M7CisgICAgY2hhciAqcyA9IHdwLT5kZXNjci0+ZF9iYXNlLT5kb2M7CiAKLQlpZiAocyA9PSBOVUxMKSB7Ci0JCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJcmV0dXJuIFB5X05vbmU7Ci0JfQotCWVsc2UgewotCQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhzKTsKLQl9CisgICAgaWYgKHMgPT0gTlVMTCkgeworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIHJldHVybiBQeV9Ob25lOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcocyk7CisgICAgfQogfQogCiBzdGF0aWMgUHlHZXRTZXREZWYgd3JhcHBlcl9nZXRzZXRzW10gPSB7Ci0JeyJfX29iamNsYXNzX18iLCAoZ2V0dGVyKXdyYXBwZXJfb2JqY2xhc3N9LAotCXsiX19uYW1lX18iLCAoZ2V0dGVyKXdyYXBwZXJfbmFtZX0sCi0JeyJfX2RvY19fIiwgKGdldHRlcil3cmFwcGVyX2RvY30sCi0JezB9CisgICAgeyJfX29iamNsYXNzX18iLCAoZ2V0dGVyKXdyYXBwZXJfb2JqY2xhc3N9LAorICAgIHsiX19uYW1lX18iLCAoZ2V0dGVyKXdyYXBwZXJfbmFtZX0sCisgICAgeyJfX2RvY19fIiwgKGdldHRlcil3cmFwcGVyX2RvY30sCisgICAgezB9CiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKgogd3JhcHBlcl9jYWxsKHdyYXBwZXJvYmplY3QgKndwLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0Jd3JhcHBlcmZ1bmMgd3JhcHBlciA9IHdwLT5kZXNjci0+ZF9iYXNlLT53cmFwcGVyOwotCVB5T2JqZWN0ICpzZWxmID0gd3AtPnNlbGY7CisgICAgd3JhcHBlcmZ1bmMgd3JhcHBlciA9IHdwLT5kZXNjci0+ZF9iYXNlLT53cmFwcGVyOworICAgIFB5T2JqZWN0ICpzZWxmID0gd3AtPnNlbGY7CiAKLQlpZiAod3AtPmRlc2NyLT5kX2Jhc2UtPmZsYWdzICYgUHlXcmFwcGVyRmxhZ19LRVlXT1JEUykgewotCQl3cmFwcGVyZnVuY19rd2RzIHdrID0gKHdyYXBwZXJmdW5jX2t3ZHMpd3JhcHBlcjsKLQkJcmV0dXJuICgqd2spKHNlbGYsIGFyZ3MsIHdwLT5kZXNjci0+ZF93cmFwcGVkLCBrd2RzKTsKLQl9CisgICAgaWYgKHdwLT5kZXNjci0+ZF9iYXNlLT5mbGFncyAmIFB5V3JhcHBlckZsYWdfS0VZV09SRFMpIHsKKyAgICAgICAgd3JhcHBlcmZ1bmNfa3dkcyB3ayA9ICh3cmFwcGVyZnVuY19rd2RzKXdyYXBwZXI7CisgICAgICAgIHJldHVybiAoKndrKShzZWxmLCBhcmdzLCB3cC0+ZGVzY3ItPmRfd3JhcHBlZCwga3dkcyk7CisgICAgfQogCi0JaWYgKGt3ZHMgIT0gTlVMTCAmJiAoIVB5RGljdF9DaGVjayhrd2RzKSB8fCBQeURpY3RfU2l6ZShrd2RzKSAhPSAwKSkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJICAgICAid3JhcHBlciAlcyBkb2Vzbid0IHRha2Uga2V5d29yZCBhcmd1bWVudHMiLAotCQkJICAgICB3cC0+ZGVzY3ItPmRfYmFzZS0+bmFtZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gKCp3cmFwcGVyKShzZWxmLCBhcmdzLCB3cC0+ZGVzY3ItPmRfd3JhcHBlZCk7CisgICAgaWYgKGt3ZHMgIT0gTlVMTCAmJiAoIVB5RGljdF9DaGVjayhrd2RzKSB8fCBQeURpY3RfU2l6ZShrd2RzKSAhPSAwKSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIndyYXBwZXIgJXMgZG9lc24ndCB0YWtlIGtleXdvcmQgYXJndW1lbnRzIiwKKyAgICAgICAgICAgICAgICAgICAgIHdwLT5kZXNjci0+ZF9iYXNlLT5uYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiAoKndyYXBwZXIpKHNlbGYsIGFyZ3MsIHdwLT5kZXNjci0+ZF93cmFwcGVkKTsKIH0KIAogc3RhdGljIGludAogd3JhcHBlcl90cmF2ZXJzZShQeU9iamVjdCAqc2VsZiwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0Jd3JhcHBlcm9iamVjdCAqd3AgPSAod3JhcHBlcm9iamVjdCAqKXNlbGY7Ci0JUHlfVklTSVQod3AtPmRlc2NyKTsKLQlQeV9WSVNJVCh3cC0+c2VsZik7Ci0JcmV0dXJuIDA7CisgICAgd3JhcHBlcm9iamVjdCAqd3AgPSAod3JhcHBlcm9iamVjdCAqKXNlbGY7CisgICAgUHlfVklTSVQod3AtPmRlc2NyKTsKKyAgICBQeV9WSVNJVCh3cC0+c2VsZik7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeVR5cGVPYmplY3Qgd3JhcHBlcnR5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKLQkibWV0aG9kLXdyYXBwZXIiLAkJCS8qIHRwX25hbWUgKi8KLQlzaXplb2Yod3JhcHBlcm9iamVjdCksCQkJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJCS8qIHRwX2l0ZW1zaXplICovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKXdyYXBwZXJfZGVhbGxvYywgCQkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0ciAqLwotCShjbXBmdW5jKXdyYXBwZXJfY29tcGFyZSwJCS8qIHRwX2NvbXBhcmUgKi8KLQkocmVwcmZ1bmMpd3JhcHBlcl9yZXByLAkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCSAgICAgICAJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JKGhhc2hmdW5jKXdyYXBwZXJfaGFzaCwJCQkvKiB0cF9oYXNoICovCi0JKHRlcm5hcnlmdW5jKXdyYXBwZXJfY2FsbCwJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCQkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsIC8qIHRwX2ZsYWdzICovCi0gCTAsCQkJCQkvKiB0cF9kb2MgKi8KLQl3cmFwcGVyX3RyYXZlcnNlLAkJCS8qIHRwX3RyYXZlcnNlICovCi0gCTAsCQkJCQkvKiB0cF9jbGVhciAqLwotCTAsCQkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCTAsCQkJCQkvKiB0cF9pdGVyICovCi0JMCwJCQkJCS8qIHRwX2l0ZXJuZXh0ICovCi0JMCwJCQkJCS8qIHRwX21ldGhvZHMgKi8KLQl3cmFwcGVyX21lbWJlcnMsCQkJLyogdHBfbWVtYmVycyAqLwotCXdyYXBwZXJfZ2V0c2V0cywJCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCQkvKiB0cF9kaWN0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQorICAgICJtZXRob2Qtd3JhcHBlciIsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgIHNpemVvZih3cmFwcGVyb2JqZWN0KSwgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3Rvcil3cmFwcGVyX2RlYWxsb2MsICAgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgKGNtcGZ1bmMpd3JhcHBlcl9jb21wYXJlLCAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgKHJlcHJmdW5jKXdyYXBwZXJfcmVwciwgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKXdyYXBwZXJfaGFzaCwgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgKHRlcm5hcnlmdW5jKXdyYXBwZXJfY2FsbCwgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDLCAvKiB0cF9mbGFncyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgd3JhcHBlcl90cmF2ZXJzZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICB3cmFwcGVyX21lbWJlcnMsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICB3cmFwcGVyX2dldHNldHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KIH07CiAKIFB5T2JqZWN0ICoKIFB5V3JhcHBlcl9OZXcoUHlPYmplY3QgKmQsIFB5T2JqZWN0ICpzZWxmKQogewotCXdyYXBwZXJvYmplY3QgKndwOwotCVB5V3JhcHBlckRlc2NyT2JqZWN0ICpkZXNjcjsKKyAgICB3cmFwcGVyb2JqZWN0ICp3cDsKKyAgICBQeVdyYXBwZXJEZXNjck9iamVjdCAqZGVzY3I7CiAKLQlhc3NlcnQoUHlPYmplY3RfVHlwZUNoZWNrKGQsICZQeVdyYXBwZXJEZXNjcl9UeXBlKSk7Ci0JZGVzY3IgPSAoUHlXcmFwcGVyRGVzY3JPYmplY3QgKilkOwotCWFzc2VydChQeU9iamVjdF9Jc0luc3RhbmNlKHNlbGYsIChQeU9iamVjdCAqKShkZXNjci0+ZF90eXBlKSkpOworICAgIGFzc2VydChQeU9iamVjdF9UeXBlQ2hlY2soZCwgJlB5V3JhcHBlckRlc2NyX1R5cGUpKTsKKyAgICBkZXNjciA9IChQeVdyYXBwZXJEZXNjck9iamVjdCAqKWQ7CisgICAgYXNzZXJ0KFB5T2JqZWN0X0lzSW5zdGFuY2Uoc2VsZiwgKFB5T2JqZWN0ICopKGRlc2NyLT5kX3R5cGUpKSk7CiAKLQl3cCA9IFB5T2JqZWN0X0dDX05ldyh3cmFwcGVyb2JqZWN0LCAmd3JhcHBlcnR5cGUpOwotCWlmICh3cCAhPSBOVUxMKSB7Ci0JCVB5X0lOQ1JFRihkZXNjcik7Ci0JCXdwLT5kZXNjciA9IGRlc2NyOwotCQlQeV9JTkNSRUYoc2VsZik7Ci0JCXdwLT5zZWxmID0gc2VsZjsKLQkJX1B5T2JqZWN0X0dDX1RSQUNLKHdwKTsKLQl9Ci0JcmV0dXJuIChQeU9iamVjdCAqKXdwOworICAgIHdwID0gUHlPYmplY3RfR0NfTmV3KHdyYXBwZXJvYmplY3QsICZ3cmFwcGVydHlwZSk7CisgICAgaWYgKHdwICE9IE5VTEwpIHsKKyAgICAgICAgUHlfSU5DUkVGKGRlc2NyKTsKKyAgICAgICAgd3AtPmRlc2NyID0gZGVzY3I7CisgICAgICAgIFB5X0lOQ1JFRihzZWxmKTsKKyAgICAgICAgd3AtPnNlbGYgPSBzZWxmOworICAgICAgICBfUHlPYmplY3RfR0NfVFJBQ0sod3ApOworICAgIH0KKyAgICByZXR1cm4gKFB5T2JqZWN0ICopd3A7CiB9CiAKIApAQCAtMTA2NSwyNDQgKzEwNjUsMjQ0IEBACiAvKgogICAgIGNsYXNzIHByb3BlcnR5KG9iamVjdCk6CiAKLSAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZnZXQ9Tm9uZSwgZnNldD1Ob25lLCBmZGVsPU5vbmUsIGRvYz1Ob25lKToKLSAgICAgICAgICAgIGlmIGRvYyBpcyBOb25lIGFuZCBmZ2V0IGlzIG5vdCBOb25lIGFuZCBoYXNhdHRyKGZnZXQsICJfX2RvY19fIik6Ci0gICAgICAgICAgICAgICAgZG9jID0gZmdldC5fX2RvY19fCi0gICAgICAgICAgICBzZWxmLl9fZ2V0ID0gZmdldAotICAgICAgICAgICAgc2VsZi5fX3NldCA9IGZzZXQKLSAgICAgICAgICAgIHNlbGYuX19kZWwgPSBmZGVsCi0gICAgICAgICAgICBzZWxmLl9fZG9jX18gPSBkb2MKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZmdldD1Ob25lLCBmc2V0PU5vbmUsIGZkZWw9Tm9uZSwgZG9jPU5vbmUpOgorICAgICAgICBpZiBkb2MgaXMgTm9uZSBhbmQgZmdldCBpcyBub3QgTm9uZSBhbmQgaGFzYXR0cihmZ2V0LCAiX19kb2NfXyIpOgorICAgICAgICBkb2MgPSBmZ2V0Ll9fZG9jX18KKyAgICAgICAgc2VsZi5fX2dldCA9IGZnZXQKKyAgICAgICAgc2VsZi5fX3NldCA9IGZzZXQKKyAgICAgICAgc2VsZi5fX2RlbCA9IGZkZWwKKyAgICAgICAgc2VsZi5fX2RvY19fID0gZG9jCiAKLSAgICAgICAgZGVmIF9fZ2V0X18oc2VsZiwgaW5zdCwgdHlwZT1Ob25lKToKLSAgICAgICAgICAgIGlmIGluc3QgaXMgTm9uZToKLSAgICAgICAgICAgICAgICByZXR1cm4gc2VsZgotICAgICAgICAgICAgaWYgc2VsZi5fX2dldCBpcyBOb25lOgotICAgICAgICAgICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yLCAidW5yZWFkYWJsZSBhdHRyaWJ1dGUiCi0gICAgICAgICAgICByZXR1cm4gc2VsZi5fX2dldChpbnN0KQorICAgIGRlZiBfX2dldF9fKHNlbGYsIGluc3QsIHR5cGU9Tm9uZSk6CisgICAgICAgIGlmIGluc3QgaXMgTm9uZToKKyAgICAgICAgcmV0dXJuIHNlbGYKKyAgICAgICAgaWYgc2VsZi5fX2dldCBpcyBOb25lOgorICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvciwgInVucmVhZGFibGUgYXR0cmlidXRlIgorICAgICAgICByZXR1cm4gc2VsZi5fX2dldChpbnN0KQogCi0gICAgICAgIGRlZiBfX3NldF9fKHNlbGYsIGluc3QsIHZhbHVlKToKLSAgICAgICAgICAgIGlmIHNlbGYuX19zZXQgaXMgTm9uZToKLSAgICAgICAgICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvciwgImNhbid0IHNldCBhdHRyaWJ1dGUiCi0gICAgICAgICAgICByZXR1cm4gc2VsZi5fX3NldChpbnN0LCB2YWx1ZSkKKyAgICBkZWYgX19zZXRfXyhzZWxmLCBpbnN0LCB2YWx1ZSk6CisgICAgICAgIGlmIHNlbGYuX19zZXQgaXMgTm9uZToKKyAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IsICJjYW4ndCBzZXQgYXR0cmlidXRlIgorICAgICAgICByZXR1cm4gc2VsZi5fX3NldChpbnN0LCB2YWx1ZSkKIAotICAgICAgICBkZWYgX19kZWxldGVfXyhzZWxmLCBpbnN0KToKLSAgICAgICAgICAgIGlmIHNlbGYuX19kZWwgaXMgTm9uZToKLSAgICAgICAgICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvciwgImNhbid0IGRlbGV0ZSBhdHRyaWJ1dGUiCi0gICAgICAgICAgICByZXR1cm4gc2VsZi5fX2RlbChpbnN0KQorICAgIGRlZiBfX2RlbGV0ZV9fKHNlbGYsIGluc3QpOgorICAgICAgICBpZiBzZWxmLl9fZGVsIGlzIE5vbmU6CisgICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yLCAiY2FuJ3QgZGVsZXRlIGF0dHJpYnV0ZSIKKyAgICAgICAgcmV0dXJuIHNlbGYuX19kZWwoaW5zdCkKIAogKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewotCVB5T2JqZWN0X0hFQUQKLQlQeU9iamVjdCAqcHJvcF9nZXQ7Ci0JUHlPYmplY3QgKnByb3Bfc2V0OwotCVB5T2JqZWN0ICpwcm9wX2RlbDsKLQlQeU9iamVjdCAqcHJvcF9kb2M7Ci0JaW50IGdldHRlcl9kb2M7CisgICAgUHlPYmplY3RfSEVBRAorICAgIFB5T2JqZWN0ICpwcm9wX2dldDsKKyAgICBQeU9iamVjdCAqcHJvcF9zZXQ7CisgICAgUHlPYmplY3QgKnByb3BfZGVsOworICAgIFB5T2JqZWN0ICpwcm9wX2RvYzsKKyAgICBpbnQgZ2V0dGVyX2RvYzsKIH0gcHJvcGVydHlvYmplY3Q7CiAKIHN0YXRpYyBQeU9iamVjdCAqIHByb3BlcnR5X2NvcHkoUHlPYmplY3QgKiwgUHlPYmplY3QgKiwgUHlPYmplY3QgKiwKLQkJCQkgIFB5T2JqZWN0ICosIFB5T2JqZWN0ICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICosIFB5T2JqZWN0ICopOwogCiBzdGF0aWMgUHlNZW1iZXJEZWYgcHJvcGVydHlfbWVtYmVyc1tdID0gewotCXsiZmdldCIsIFRfT0JKRUNULCBvZmZzZXRvZihwcm9wZXJ0eW9iamVjdCwgcHJvcF9nZXQpLCBSRUFET05MWX0sCi0JeyJmc2V0IiwgVF9PQkpFQ1QsIG9mZnNldG9mKHByb3BlcnR5b2JqZWN0LCBwcm9wX3NldCksIFJFQURPTkxZfSwKLQl7ImZkZWwiLCBUX09CSkVDVCwgb2Zmc2V0b2YocHJvcGVydHlvYmplY3QsIHByb3BfZGVsKSwgUkVBRE9OTFl9LAotCXsiX19kb2NfXyIsICBUX09CSkVDVCwgb2Zmc2V0b2YocHJvcGVydHlvYmplY3QsIHByb3BfZG9jKSwgUkVBRE9OTFl9LAotCXswfQorICAgIHsiZmdldCIsIFRfT0JKRUNULCBvZmZzZXRvZihwcm9wZXJ0eW9iamVjdCwgcHJvcF9nZXQpLCBSRUFET05MWX0sCisgICAgeyJmc2V0IiwgVF9PQkpFQ1QsIG9mZnNldG9mKHByb3BlcnR5b2JqZWN0LCBwcm9wX3NldCksIFJFQURPTkxZfSwKKyAgICB7ImZkZWwiLCBUX09CSkVDVCwgb2Zmc2V0b2YocHJvcGVydHlvYmplY3QsIHByb3BfZGVsKSwgUkVBRE9OTFl9LAorICAgIHsiX19kb2NfXyIsICBUX09CSkVDVCwgb2Zmc2V0b2YocHJvcGVydHlvYmplY3QsIHByb3BfZG9jKSwgUkVBRE9OTFl9LAorICAgIHswfQogfTsKIAogCiBQeURvY19TVFJWQVIoZ2V0dGVyX2RvYywKLQkgICAgICJEZXNjcmlwdG9yIHRvIGNoYW5nZSB0aGUgZ2V0dGVyIG9uIGEgcHJvcGVydHkuIik7CisgICAgICAgICAgICAgIkRlc2NyaXB0b3IgdG8gY2hhbmdlIHRoZSBnZXR0ZXIgb24gYSBwcm9wZXJ0eS4iKTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIHByb3BlcnR5X2dldHRlcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmdldHRlcikKIHsKLQlyZXR1cm4gcHJvcGVydHlfY29weShzZWxmLCBnZXR0ZXIsIE5VTEwsIE5VTEwsIE5VTEwpOworICAgIHJldHVybiBwcm9wZXJ0eV9jb3B5KHNlbGYsIGdldHRlciwgTlVMTCwgTlVMTCwgTlVMTCk7CiB9CiAKIAogUHlEb2NfU1RSVkFSKHNldHRlcl9kb2MsCi0JICAgICAiRGVzY3JpcHRvciB0byBjaGFuZ2UgdGhlIHNldHRlciBvbiBhIHByb3BlcnR5LiIpOworICAgICAgICAgICAgICJEZXNjcmlwdG9yIHRvIGNoYW5nZSB0aGUgc2V0dGVyIG9uIGEgcHJvcGVydHkuIik7CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBwcm9wZXJ0eV9zZXR0ZXIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpzZXR0ZXIpCiB7Ci0JcmV0dXJuIHByb3BlcnR5X2NvcHkoc2VsZiwgTlVMTCwgc2V0dGVyLCBOVUxMLCBOVUxMKTsKKyAgICByZXR1cm4gcHJvcGVydHlfY29weShzZWxmLCBOVUxMLCBzZXR0ZXIsIE5VTEwsIE5VTEwpOwogfQogCiAKIFB5RG9jX1NUUlZBUihkZWxldGVyX2RvYywKLQkgICAgICJEZXNjcmlwdG9yIHRvIGNoYW5nZSB0aGUgZGVsZXRlciBvbiBhIHByb3BlcnR5LiIpOworICAgICAgICAgICAgICJEZXNjcmlwdG9yIHRvIGNoYW5nZSB0aGUgZGVsZXRlciBvbiBhIHByb3BlcnR5LiIpOwogCiBzdGF0aWMgUHlPYmplY3QgKgogcHJvcGVydHlfZGVsZXRlcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmRlbGV0ZXIpCiB7Ci0JcmV0dXJuIHByb3BlcnR5X2NvcHkoc2VsZiwgTlVMTCwgTlVMTCwgZGVsZXRlciwgTlVMTCk7CisgICAgcmV0dXJuIHByb3BlcnR5X2NvcHkoc2VsZiwgTlVMTCwgTlVMTCwgZGVsZXRlciwgTlVMTCk7CiB9CiAKIAogc3RhdGljIFB5TWV0aG9kRGVmIHByb3BlcnR5X21ldGhvZHNbXSA9IHsKLQl7ImdldHRlciIsIHByb3BlcnR5X2dldHRlciwgTUVUSF9PLCBnZXR0ZXJfZG9jfSwKLQl7InNldHRlciIsIHByb3BlcnR5X3NldHRlciwgTUVUSF9PLCBzZXR0ZXJfZG9jfSwKLQl7ImRlbGV0ZXIiLCBwcm9wZXJ0eV9kZWxldGVyLCBNRVRIX08sIGRlbGV0ZXJfZG9jfSwKLQl7MH0KKyAgICB7ImdldHRlciIsIHByb3BlcnR5X2dldHRlciwgTUVUSF9PLCBnZXR0ZXJfZG9jfSwKKyAgICB7InNldHRlciIsIHByb3BlcnR5X3NldHRlciwgTUVUSF9PLCBzZXR0ZXJfZG9jfSwKKyAgICB7ImRlbGV0ZXIiLCBwcm9wZXJ0eV9kZWxldGVyLCBNRVRIX08sIGRlbGV0ZXJfZG9jfSwKKyAgICB7MH0KIH07CiAKIAogc3RhdGljIHZvaWQKIHByb3BlcnR5X2RlYWxsb2MoUHlPYmplY3QgKnNlbGYpCiB7Ci0JcHJvcGVydHlvYmplY3QgKmdzID0gKHByb3BlcnR5b2JqZWN0ICopc2VsZjsKKyAgICBwcm9wZXJ0eW9iamVjdCAqZ3MgPSAocHJvcGVydHlvYmplY3QgKilzZWxmOwogCi0JX1B5T2JqZWN0X0dDX1VOVFJBQ0soc2VsZik7Ci0JUHlfWERFQ1JFRihncy0+cHJvcF9nZXQpOwotCVB5X1hERUNSRUYoZ3MtPnByb3Bfc2V0KTsKLQlQeV9YREVDUkVGKGdzLT5wcm9wX2RlbCk7Ci0JUHlfWERFQ1JFRihncy0+cHJvcF9kb2MpOwotCXNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoc2VsZik7CisgICAgX1B5T2JqZWN0X0dDX1VOVFJBQ0soc2VsZik7CisgICAgUHlfWERFQ1JFRihncy0+cHJvcF9nZXQpOworICAgIFB5X1hERUNSRUYoZ3MtPnByb3Bfc2V0KTsKKyAgICBQeV9YREVDUkVGKGdzLT5wcm9wX2RlbCk7CisgICAgUHlfWERFQ1JFRihncy0+cHJvcF9kb2MpOworICAgIHNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBwcm9wZXJ0eV9kZXNjcl9nZXQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpvYmosIFB5T2JqZWN0ICp0eXBlKQogewotCXByb3BlcnR5b2JqZWN0ICpncyA9IChwcm9wZXJ0eW9iamVjdCAqKXNlbGY7CisgICAgcHJvcGVydHlvYmplY3QgKmdzID0gKHByb3BlcnR5b2JqZWN0ICopc2VsZjsKIAotCWlmIChvYmogPT0gTlVMTCB8fCBvYmogPT0gUHlfTm9uZSkgewotCQlQeV9JTkNSRUYoc2VsZik7Ci0JCXJldHVybiBzZWxmOwotCX0KLQlpZiAoZ3MtPnByb3BfZ2V0ID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0F0dHJpYnV0ZUVycm9yLCAidW5yZWFkYWJsZSBhdHRyaWJ1dGUiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBQeU9iamVjdF9DYWxsRnVuY3Rpb24oZ3MtPnByb3BfZ2V0LCAiKE8pIiwgb2JqKTsKKyAgICBpZiAob2JqID09IE5VTEwgfHwgb2JqID09IFB5X05vbmUpIHsKKyAgICAgICAgUHlfSU5DUkVGKHNlbGYpOworICAgICAgICByZXR1cm4gc2VsZjsKKyAgICB9CisgICAgaWYgKGdzLT5wcm9wX2dldCA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19BdHRyaWJ1dGVFcnJvciwgInVucmVhZGFibGUgYXR0cmlidXRlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKGdzLT5wcm9wX2dldCwgIihPKSIsIG9iaik7CiB9CiAKIHN0YXRpYyBpbnQKIHByb3BlcnR5X2Rlc2NyX3NldChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm9iaiwgUHlPYmplY3QgKnZhbHVlKQogewotCXByb3BlcnR5b2JqZWN0ICpncyA9IChwcm9wZXJ0eW9iamVjdCAqKXNlbGY7Ci0JUHlPYmplY3QgKmZ1bmMsICpyZXM7CisgICAgcHJvcGVydHlvYmplY3QgKmdzID0gKHByb3BlcnR5b2JqZWN0ICopc2VsZjsKKyAgICBQeU9iamVjdCAqZnVuYywgKnJlczsKIAotCWlmICh2YWx1ZSA9PSBOVUxMKQotCQlmdW5jID0gZ3MtPnByb3BfZGVsOwotCWVsc2UKLQkJZnVuYyA9IGdzLT5wcm9wX3NldDsKLQlpZiAoZnVuYyA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19BdHRyaWJ1dGVFcnJvciwKLQkJCQl2YWx1ZSA9PSBOVUxMID8KLQkJCQkiY2FuJ3QgZGVsZXRlIGF0dHJpYnV0ZSIgOgotCQkJCSJjYW4ndCBzZXQgYXR0cmlidXRlIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKHZhbHVlID09IE5VTEwpCi0JCXJlcyA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihmdW5jLCAiKE8pIiwgb2JqKTsKLQllbHNlCi0JCXJlcyA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihmdW5jLCAiKE9PKSIsIG9iaiwgdmFsdWUpOwotCWlmIChyZXMgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCVB5X0RFQ1JFRihyZXMpOwotCXJldHVybiAwOworICAgIGlmICh2YWx1ZSA9PSBOVUxMKQorICAgICAgICBmdW5jID0gZ3MtPnByb3BfZGVsOworICAgIGVsc2UKKyAgICAgICAgZnVuYyA9IGdzLT5wcm9wX3NldDsKKyAgICBpZiAoZnVuYyA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19BdHRyaWJ1dGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID09IE5VTEwgPworICAgICAgICAgICAgICAgICAgICAgICAgImNhbid0IGRlbGV0ZSBhdHRyaWJ1dGUiIDoKKyAgICAgICAgICAgICAgICAiY2FuJ3Qgc2V0IGF0dHJpYnV0ZSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICh2YWx1ZSA9PSBOVUxMKQorICAgICAgICByZXMgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oZnVuYywgIihPKSIsIG9iaik7CisgICAgZWxzZQorICAgICAgICByZXMgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oZnVuYywgIihPTykiLCBvYmosIHZhbHVlKTsKKyAgICBpZiAocmVzID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBQeV9ERUNSRUYocmVzKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHByb3BlcnR5X2NvcHkoUHlPYmplY3QgKm9sZCwgUHlPYmplY3QgKmdldCwgUHlPYmplY3QgKnNldCwgUHlPYmplY3QgKmRlbCwKLQkJUHlPYmplY3QgKmRvYykKKyAgICAgICAgICAgICAgICBQeU9iamVjdCAqZG9jKQogewotCXByb3BlcnR5b2JqZWN0ICpwb2xkID0gKHByb3BlcnR5b2JqZWN0ICopb2xkOwotCVB5T2JqZWN0ICpuZXcsICp0eXBlOworICAgIHByb3BlcnR5b2JqZWN0ICpwb2xkID0gKHByb3BlcnR5b2JqZWN0ICopb2xkOworICAgIFB5T2JqZWN0ICpuZXcsICp0eXBlOwogCi0JdHlwZSA9IFB5T2JqZWN0X1R5cGUob2xkKTsKLQlpZiAodHlwZSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICB0eXBlID0gUHlPYmplY3RfVHlwZShvbGQpOworICAgIGlmICh0eXBlID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKGdldCA9PSBOVUxMIHx8IGdldCA9PSBQeV9Ob25lKSB7Ci0JCVB5X1hERUNSRUYoZ2V0KTsKLQkJZ2V0ID0gcG9sZC0+cHJvcF9nZXQgPyBwb2xkLT5wcm9wX2dldCA6IFB5X05vbmU7Ci0JfQotCWlmIChzZXQgPT0gTlVMTCB8fCBzZXQgPT0gUHlfTm9uZSkgewotCQlQeV9YREVDUkVGKHNldCk7Ci0JCXNldCA9IHBvbGQtPnByb3Bfc2V0ID8gcG9sZC0+cHJvcF9zZXQgOiBQeV9Ob25lOwotCX0KLQlpZiAoZGVsID09IE5VTEwgfHwgZGVsID09IFB5X05vbmUpIHsKLQkJUHlfWERFQ1JFRihkZWwpOwotCQlkZWwgPSBwb2xkLT5wcm9wX2RlbCA/IHBvbGQtPnByb3BfZGVsIDogUHlfTm9uZTsKLQl9Ci0JaWYgKGRvYyA9PSBOVUxMIHx8IGRvYyA9PSBQeV9Ob25lKSB7Ci0JCVB5X1hERUNSRUYoZG9jKTsKLQkJaWYgKHBvbGQtPmdldHRlcl9kb2MgJiYgZ2V0ICE9IFB5X05vbmUpIHsKLQkJCS8qIG1ha2UgX2luaXQgdXNlIF9fZG9jX18gZnJvbSBnZXR0ZXIgKi8KLQkJCWRvYyA9IFB5X05vbmU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlkb2MgPSBwb2xkLT5wcm9wX2RvYyA/IHBvbGQtPnByb3BfZG9jIDogUHlfTm9uZTsKLQkJfQotCX0KKyAgICBpZiAoZ2V0ID09IE5VTEwgfHwgZ2V0ID09IFB5X05vbmUpIHsKKyAgICAgICAgUHlfWERFQ1JFRihnZXQpOworICAgICAgICBnZXQgPSBwb2xkLT5wcm9wX2dldCA/IHBvbGQtPnByb3BfZ2V0IDogUHlfTm9uZTsKKyAgICB9CisgICAgaWYgKHNldCA9PSBOVUxMIHx8IHNldCA9PSBQeV9Ob25lKSB7CisgICAgICAgIFB5X1hERUNSRUYoc2V0KTsKKyAgICAgICAgc2V0ID0gcG9sZC0+cHJvcF9zZXQgPyBwb2xkLT5wcm9wX3NldCA6IFB5X05vbmU7CisgICAgfQorICAgIGlmIChkZWwgPT0gTlVMTCB8fCBkZWwgPT0gUHlfTm9uZSkgeworICAgICAgICBQeV9YREVDUkVGKGRlbCk7CisgICAgICAgIGRlbCA9IHBvbGQtPnByb3BfZGVsID8gcG9sZC0+cHJvcF9kZWwgOiBQeV9Ob25lOworICAgIH0KKyAgICBpZiAoZG9jID09IE5VTEwgfHwgZG9jID09IFB5X05vbmUpIHsKKyAgICAgICAgUHlfWERFQ1JFRihkb2MpOworICAgICAgICBpZiAocG9sZC0+Z2V0dGVyX2RvYyAmJiBnZXQgIT0gUHlfTm9uZSkgeworICAgICAgICAgICAgLyogbWFrZSBfaW5pdCB1c2UgX19kb2NfXyBmcm9tIGdldHRlciAqLworICAgICAgICAgICAgZG9jID0gUHlfTm9uZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGRvYyA9IHBvbGQtPnByb3BfZG9jID8gcG9sZC0+cHJvcF9kb2MgOiBQeV9Ob25lOworICAgICAgICB9CisgICAgfQogCi0JbmV3ID0gIFB5T2JqZWN0X0NhbGxGdW5jdGlvbih0eXBlLCAiT09PTyIsIGdldCwgc2V0LCBkZWwsIGRvYyk7Ci0JUHlfREVDUkVGKHR5cGUpOwotCWlmIChuZXcgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIG5ldzsKKyAgICBuZXcgPSAgUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKHR5cGUsICJPT09PIiwgZ2V0LCBzZXQsIGRlbCwgZG9jKTsKKyAgICBQeV9ERUNSRUYodHlwZSk7CisgICAgaWYgKG5ldyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gbmV3OwogfQogCiBzdGF0aWMgaW50CiBwcm9wZXJ0eV9pbml0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JUHlPYmplY3QgKmdldCA9IE5VTEwsICpzZXQgPSBOVUxMLCAqZGVsID0gTlVMTCwgKmRvYyA9IE5VTEw7Ci0Jc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJmZ2V0IiwgImZzZXQiLCAiZmRlbCIsICJkb2MiLCAwfTsKLQlwcm9wZXJ0eW9iamVjdCAqcHJvcCA9IChwcm9wZXJ0eW9iamVjdCAqKXNlbGY7Ci0JCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgInxPT09POnByb3BlcnR5IiwKLQkJCQkJIGt3bGlzdCwgJmdldCwgJnNldCwgJmRlbCwgJmRvYykpCi0JCXJldHVybiAtMTsKKyAgICBQeU9iamVjdCAqZ2V0ID0gTlVMTCwgKnNldCA9IE5VTEwsICpkZWwgPSBOVUxMLCAqZG9jID0gTlVMTDsKKyAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7ImZnZXQiLCAiZnNldCIsICJmZGVsIiwgImRvYyIsIDB9OworICAgIHByb3BlcnR5b2JqZWN0ICpwcm9wID0gKHByb3BlcnR5b2JqZWN0ICopc2VsZjsKIAotCWlmIChnZXQgPT0gUHlfTm9uZSkKLQkJZ2V0ID0gTlVMTDsKLQlpZiAoc2V0ID09IFB5X05vbmUpCi0JCXNldCA9IE5VTEw7Ci0JaWYgKGRlbCA9PSBQeV9Ob25lKQotCQlkZWwgPSBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJ8T09PTzpwcm9wZXJ0eSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3dsaXN0LCAmZ2V0LCAmc2V0LCAmZGVsLCAmZG9jKSkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0JUHlfWElOQ1JFRihnZXQpOwotCVB5X1hJTkNSRUYoc2V0KTsKLQlQeV9YSU5DUkVGKGRlbCk7Ci0JUHlfWElOQ1JFRihkb2MpOworICAgIGlmIChnZXQgPT0gUHlfTm9uZSkKKyAgICAgICAgZ2V0ID0gTlVMTDsKKyAgICBpZiAoc2V0ID09IFB5X05vbmUpCisgICAgICAgIHNldCA9IE5VTEw7CisgICAgaWYgKGRlbCA9PSBQeV9Ob25lKQorICAgICAgICBkZWwgPSBOVUxMOwogCi0JcHJvcC0+cHJvcF9nZXQgPSBnZXQ7Ci0JcHJvcC0+cHJvcF9zZXQgPSBzZXQ7Ci0JcHJvcC0+cHJvcF9kZWwgPSBkZWw7Ci0JcHJvcC0+cHJvcF9kb2MgPSBkb2M7Ci0JcHJvcC0+Z2V0dGVyX2RvYyA9IDA7CisgICAgUHlfWElOQ1JFRihnZXQpOworICAgIFB5X1hJTkNSRUYoc2V0KTsKKyAgICBQeV9YSU5DUkVGKGRlbCk7CisgICAgUHlfWElOQ1JFRihkb2MpOwogCi0JLyogaWYgbm8gZG9jc3RyaW5nIGdpdmVuIGFuZCB0aGUgZ2V0dGVyIGhhcyBvbmUsIHVzZSB0aGF0IG9uZSAqLwotCWlmICgoZG9jID09IE5VTEwgfHwgZG9jID09IFB5X05vbmUpICYmIGdldCAhPSBOVUxMKSB7Ci0JCVB5T2JqZWN0ICpnZXRfZG9jID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhnZXQsICJfX2RvY19fIik7Ci0JCWlmIChnZXRfZG9jICE9IE5VTEwpIHsKLQkJCS8qIGdldF9kb2MgYWxyZWFkeSBJTkNSRUYnZCBieSBHZXRBdHRyICovCi0JCQlpZiAoUHlfVFlQRShzZWxmKT09JlB5UHJvcGVydHlfVHlwZSkgewotCQkJCVB5X1hERUNSRUYocHJvcC0+cHJvcF9kb2MpOwotCQkJCXByb3AtPnByb3BfZG9jID0gZ2V0X2RvYzsKLQkJCX0gZWxzZSB7Ci0JCQkJLyogUHV0IF9fZG9jX18gaW4gZGljdCBvZiB0aGUgc3ViY2xhc3MgaW5zdGFuY2UgaW5zdGVhZCwKLQkJCQlvdGhlcndpc2UgaXQgZ2V0cyBzaGFkb3dlZCBieSBjbGFzcydzIF9fZG9jX18uICovCi0JCQkJaWYgKFB5T2JqZWN0X1NldEF0dHJTdHJpbmcoc2VsZiwgIl9fZG9jX18iLCBnZXRfZG9jKSAhPSAwKQotCQkJCXsKLQkJCQkJLyogREVDUkVGIGZvciBwcm9wcyBoYW5kbGVkIGJ5IF9kZWFsbG9jICovCi0JCQkJCVB5X0RFQ1JFRihnZXRfZG9jKTsKLQkJCQkJcmV0dXJuIC0xOwotCSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGdldF9kb2MpOwotCQkJfQotCQkJcHJvcC0+Z2V0dGVyX2RvYyA9IDE7Ci0JCX0gZWxzZSB7Ci0JCQlQeUVycl9DbGVhcigpOwotCQl9Ci0JfQorICAgIHByb3AtPnByb3BfZ2V0ID0gZ2V0OworICAgIHByb3AtPnByb3Bfc2V0ID0gc2V0OworICAgIHByb3AtPnByb3BfZGVsID0gZGVsOworICAgIHByb3AtPnByb3BfZG9jID0gZG9jOworICAgIHByb3AtPmdldHRlcl9kb2MgPSAwOwogCi0JcmV0dXJuIDA7CisgICAgLyogaWYgbm8gZG9jc3RyaW5nIGdpdmVuIGFuZCB0aGUgZ2V0dGVyIGhhcyBvbmUsIHVzZSB0aGF0IG9uZSAqLworICAgIGlmICgoZG9jID09IE5VTEwgfHwgZG9jID09IFB5X05vbmUpICYmIGdldCAhPSBOVUxMKSB7CisgICAgICAgIFB5T2JqZWN0ICpnZXRfZG9jID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhnZXQsICJfX2RvY19fIik7CisgICAgICAgIGlmIChnZXRfZG9jICE9IE5VTEwpIHsKKyAgICAgICAgICAgIC8qIGdldF9kb2MgYWxyZWFkeSBJTkNSRUYnZCBieSBHZXRBdHRyICovCisgICAgICAgICAgICBpZiAoUHlfVFlQRShzZWxmKT09JlB5UHJvcGVydHlfVHlwZSkgeworICAgICAgICAgICAgICAgIFB5X1hERUNSRUYocHJvcC0+cHJvcF9kb2MpOworICAgICAgICAgICAgICAgIHByb3AtPnByb3BfZG9jID0gZ2V0X2RvYzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyogUHV0IF9fZG9jX18gaW4gZGljdCBvZiB0aGUgc3ViY2xhc3MgaW5zdGFuY2UgaW5zdGVhZCwKKyAgICAgICAgICAgICAgICBvdGhlcndpc2UgaXQgZ2V0cyBzaGFkb3dlZCBieSBjbGFzcydzIF9fZG9jX18uICovCisgICAgICAgICAgICAgICAgaWYgKFB5T2JqZWN0X1NldEF0dHJTdHJpbmcoc2VsZiwgIl9fZG9jX18iLCBnZXRfZG9jKSAhPSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogREVDUkVGIGZvciBwcm9wcyBoYW5kbGVkIGJ5IF9kZWFsbG9jICovCisgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihnZXRfZG9jKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoZ2V0X2RvYyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcm9wLT5nZXR0ZXJfZG9jID0gMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKIH0KIAogUHlEb2NfU1RSVkFSKHByb3BlcnR5X2RvYywKQEAgLTEzMzAsNTQgKzEzMzAsNTQgQEAKIHN0YXRpYyBpbnQKIHByb3BlcnR5X3RyYXZlcnNlKFB5T2JqZWN0ICpzZWxmLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlwcm9wZXJ0eW9iamVjdCAqcHAgPSAocHJvcGVydHlvYmplY3QgKilzZWxmOwotCVB5X1ZJU0lUKHBwLT5wcm9wX2dldCk7Ci0JUHlfVklTSVQocHAtPnByb3Bfc2V0KTsKLQlQeV9WSVNJVChwcC0+cHJvcF9kZWwpOwotCVB5X1ZJU0lUKHBwLT5wcm9wX2RvYyk7Ci0JcmV0dXJuIDA7CisgICAgcHJvcGVydHlvYmplY3QgKnBwID0gKHByb3BlcnR5b2JqZWN0ICopc2VsZjsKKyAgICBQeV9WSVNJVChwcC0+cHJvcF9nZXQpOworICAgIFB5X1ZJU0lUKHBwLT5wcm9wX3NldCk7CisgICAgUHlfVklTSVQocHAtPnByb3BfZGVsKTsKKyAgICBQeV9WSVNJVChwcC0+cHJvcF9kb2MpOworICAgIHJldHVybiAwOwogfQogCiBQeVR5cGVPYmplY3QgUHlQcm9wZXJ0eV9UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCi0JInByb3BlcnR5IiwJCQkJLyogdHBfbmFtZSAqLwotCXNpemVvZihwcm9wZXJ0eW9iamVjdCksCQkJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJCS8qIHRwX2l0ZW1zaXplICovCi0JLyogbWV0aG9kcyAqLwotCXByb3BlcnR5X2RlYWxsb2MsCSAJCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfcmVwciAqLwotCTAsCQkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJICAgICAgIAkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDIHwKLQkJUHlfVFBGTEFHU19CQVNFVFlQRSwJCS8qIHRwX2ZsYWdzICovCi0gCXByb3BlcnR5X2RvYywJCQkJLyogdHBfZG9jICovCi0JcHJvcGVydHlfdHJhdmVyc2UsCQkJLyogdHBfdHJhdmVyc2UgKi8KLSAJMCwJCQkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkJLyogdHBfaXRlcm5leHQgKi8KLQlwcm9wZXJ0eV9tZXRob2RzLAkJCS8qIHRwX21ldGhvZHMgKi8KLQlwcm9wZXJ0eV9tZW1iZXJzLAkJCS8qIHRwX21lbWJlcnMgKi8KLQkwLAkJCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkJLyogdHBfZGljdCAqLwotCXByb3BlcnR5X2Rlc2NyX2dldCwJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQlwcm9wZXJ0eV9kZXNjcl9zZXQsCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQlwcm9wZXJ0eV9pbml0LAkJCQkvKiB0cF9pbml0ICovCi0JUHlUeXBlX0dlbmVyaWNBbGxvYywJCQkvKiB0cF9hbGxvYyAqLwotCVB5VHlwZV9HZW5lcmljTmV3LAkJCS8qIHRwX25ldyAqLwotCVB5T2JqZWN0X0dDX0RlbCwgICAgICAgICAgICAgICAJCS8qIHRwX2ZyZWUgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQorICAgICJwcm9wZXJ0eSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgIHNpemVvZihwcm9wZXJ0eW9iamVjdCksICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICBwcm9wZXJ0eV9kZWFsbG9jLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDIHwKKyAgICAgICAgUHlfVFBGTEFHU19CQVNFVFlQRSwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCisgICAgcHJvcGVydHlfZG9jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICBwcm9wZXJ0eV90cmF2ZXJzZSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIHByb3BlcnR5X21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIHByb3BlcnR5X21lbWJlcnMsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgcHJvcGVydHlfZGVzY3JfZ2V0LCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICBwcm9wZXJ0eV9kZXNjcl9zZXQsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIHByb3BlcnR5X2luaXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIFB5VHlwZV9HZW5lcmljQWxsb2MsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBQeVR5cGVfR2VuZXJpY05ldywgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworICAgIFB5T2JqZWN0X0dDX0RlbCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKZGlmZiAtLWdpdCBhL09iamVjdHMvZGljdG9iamVjdC5jIGIvT2JqZWN0cy9kaWN0b2JqZWN0LmMKaW5kZXggNWNmOWFkMS4uOWQxOWIxZCAxMDA2NDQKLS0tIGEvT2JqZWN0cy9kaWN0b2JqZWN0LmMKKysrIGIvT2JqZWN0cy9kaWN0b2JqZWN0LmMKQEAgLTE2LDEyICsxNiwxMiBAQAogc3RhdGljIHZvaWQKIHNldF9rZXlfZXJyb3IoUHlPYmplY3QgKmFyZykKIHsKLQlQeU9iamVjdCAqdHVwOwotCXR1cCA9IFB5VHVwbGVfUGFjaygxLCBhcmcpOwotCWlmICghdHVwKQotCQlyZXR1cm47IC8qIGNhbGxlciB3aWxsIGV4cGVjdCBlcnJvciB0byBiZSBzZXQgYW55d2F5ICovCi0JUHlFcnJfU2V0T2JqZWN0KFB5RXhjX0tleUVycm9yLCB0dXApOwotCVB5X0RFQ1JFRih0dXApOworICAgIFB5T2JqZWN0ICp0dXA7CisgICAgdHVwID0gUHlUdXBsZV9QYWNrKDEsIGFyZyk7CisgICAgaWYgKCF0dXApCisgICAgICAgIHJldHVybjsgLyogY2FsbGVyIHdpbGwgZXhwZWN0IGVycm9yIHRvIGJlIHNldCBhbnl3YXkgKi8KKyAgICBQeUVycl9TZXRPYmplY3QoUHlFeGNfS2V5RXJyb3IsIHR1cCk7CisgICAgUHlfREVDUkVGKHR1cCk7CiB9CiAKIC8qIERlZmluZSB0aGlzIG91dCBpZiB5b3UgZG9uJ3Qgd2FudCBjb252ZXJzaW9uIHN0YXRpc3RpY3Mgb24gZXhpdC4gKi8KQEAgLTE0MSw3ICsxNDEsNyBAQAogUHlPYmplY3QgKgogX1B5RGljdF9EdW1teSh2b2lkKQogewotCXJldHVybiBkdW1teTsKKyAgICByZXR1cm4gZHVtbXk7CiB9CiAjZW5kaWYKIApAQCAtMTU2LDkgKzE1Niw5IEBACiBzdGF0aWMgdm9pZAogc2hvd19jb3VudHModm9pZCkKIHsKLQlmcHJpbnRmKHN0ZGVyciwgImNyZWF0ZWQgJWxkIHN0cmluZyBkaWN0c1xuIiwgY3JlYXRlZCk7Ci0JZnByaW50ZihzdGRlcnIsICJjb252ZXJ0ZWQgJWxkIHRvIG5vcm1hbCBkaWN0c1xuIiwgY29udmVydGVkKTsKLQlmcHJpbnRmKHN0ZGVyciwgIiUuMmYlJSBjb252ZXJzaW9uIHJhdGVcbiIsICgxMDAuMCpjb252ZXJ0ZWQpL2NyZWF0ZWQpOworICAgIGZwcmludGYoc3RkZXJyLCAiY3JlYXRlZCAlbGQgc3RyaW5nIGRpY3RzXG4iLCBjcmVhdGVkKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgImNvbnZlcnRlZCAlbGQgdG8gbm9ybWFsIGRpY3RzXG4iLCBjb252ZXJ0ZWQpOworICAgIGZwcmludGYoc3RkZXJyLCAiJS4yZiUlIGNvbnZlcnNpb24gcmF0ZVxuIiwgKDEwMC4wKmNvbnZlcnRlZCkvY3JlYXRlZCk7CiB9CiAjZW5kaWYKIApAQCAtMTcxLDEyICsxNzEsMTIgQEAKIHN0YXRpYyB2b2lkCiBzaG93X2FsbG9jKHZvaWQpCiB7Ci0JZnByaW50ZihzdGRlcnIsICJEaWN0IGFsbG9jYXRpb25zOiAlIiBQWV9GT1JNQVRfU0laRV9UICJkXG4iLAotCQljb3VudF9hbGxvYyk7Ci0JZnByaW50ZihzdGRlcnIsICJEaWN0IHJldXNlIHRocm91Z2ggZnJlZWxpc3Q6ICUiIFBZX0ZPUk1BVF9TSVpFX1QKLQkJImRcbiIsIGNvdW50X3JldXNlKTsKLQlmcHJpbnRmKHN0ZGVyciwgIiUuMmYlJSByZXVzZSByYXRlXG5cbiIsCi0JCSgxMDAuMCpjb3VudF9yZXVzZS8oY291bnRfYWxsb2MrY291bnRfcmV1c2UpKSk7CisgICAgZnByaW50ZihzdGRlcnIsICJEaWN0IGFsbG9jYXRpb25zOiAlIiBQWV9GT1JNQVRfU0laRV9UICJkXG4iLAorICAgICAgICBjb3VudF9hbGxvYyk7CisgICAgZnByaW50ZihzdGRlcnIsICJEaWN0IHJldXNlIHRocm91Z2ggZnJlZWxpc3Q6ICUiIFBZX0ZPUk1BVF9TSVpFX1QKKyAgICAgICAgImRcbiIsIGNvdW50X3JldXNlKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiUuMmYlJSByZXVzZSByYXRlXG5cbiIsCisgICAgICAgICgxMDAuMCpjb3VudF9yZXVzZS8oY291bnRfYWxsb2MrY291bnRfcmV1c2UpKSk7CiB9CiAjZW5kaWYKIApAQCAtMTg5LDE1ICsxODksMTUgQEAKICAgIGFuIGV4Y2VsbGVudCByZWFzb24gbm90IHRvKS4KICovCiAKLSNkZWZpbmUgSU5JVF9OT05aRVJPX0RJQ1RfU0xPVFMobXApIGRvIHsJCQkJXAotCShtcCktPm1hX3RhYmxlID0gKG1wKS0+bWFfc21hbGx0YWJsZTsJCQkJXAotCShtcCktPm1hX21hc2sgPSBQeURpY3RfTUlOU0laRSAtIDE7CQkJCVwKKyNkZWZpbmUgSU5JVF9OT05aRVJPX0RJQ1RfU0xPVFMobXApIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAobXApLT5tYV90YWJsZSA9IChtcCktPm1hX3NtYWxsdGFibGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAobXApLT5tYV9tYXNrID0gUHlEaWN0X01JTlNJWkUgLSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICB9IHdoaWxlKDApCiAKLSNkZWZpbmUgRU1QVFlfVE9fTUlOU0laRShtcCkgZG8gewkJCQkJXAotCW1lbXNldCgobXApLT5tYV9zbWFsbHRhYmxlLCAwLCBzaXplb2YoKG1wKS0+bWFfc21hbGx0YWJsZSkpOwlcCi0JKG1wKS0+bWFfdXNlZCA9IChtcCktPm1hX2ZpbGwgPSAwOwkJCQlcCi0JSU5JVF9OT05aRVJPX0RJQ1RfU0xPVFMobXApOwkJCQkJXAorI2RlZmluZSBFTVBUWV9UT19NSU5TSVpFKG1wKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1lbXNldCgobXApLT5tYV9zbWFsbHRhYmxlLCAwLCBzaXplb2YoKG1wKS0+bWFfc21hbGx0YWJsZSkpOyAgICAgICAgXAorICAgIChtcCktPm1hX3VzZWQgPSAobXApLT5tYV9maWxsID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIElOSVRfTk9OWkVST19ESUNUX1NMT1RTKG1wKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIH0gd2hpbGUoMCkKIAogLyogRGljdGlvbmFyeSByZXVzZSBzY2hlbWUgdG8gc2F2ZSBjYWxscyB0byBtYWxsb2MsIGZyZWUsIGFuZCBtZW1zZXQgKi8KQEAgLTIxMCw2MyArMjEwLDYzIEBACiB2b2lkCiBQeURpY3RfRmluaSh2b2lkKQogewotCVB5RGljdE9iamVjdCAqb3A7CisgICAgUHlEaWN0T2JqZWN0ICpvcDsKIAotCXdoaWxlIChudW1mcmVlKSB7Ci0JCW9wID0gZnJlZV9saXN0Wy0tbnVtZnJlZV07Ci0JCWFzc2VydChQeURpY3RfQ2hlY2tFeGFjdChvcCkpOwotCQlQeU9iamVjdF9HQ19EZWwob3ApOwotCX0KKyAgICB3aGlsZSAobnVtZnJlZSkgeworICAgICAgICBvcCA9IGZyZWVfbGlzdFstLW51bWZyZWVdOworICAgICAgICBhc3NlcnQoUHlEaWN0X0NoZWNrRXhhY3Qob3ApKTsKKyAgICAgICAgUHlPYmplY3RfR0NfRGVsKG9wKTsKKyAgICB9CiB9CiAKIFB5T2JqZWN0ICoKIFB5RGljdF9OZXcodm9pZCkKIHsKLQlyZWdpc3RlciBQeURpY3RPYmplY3QgKm1wOwotCWlmIChkdW1teSA9PSBOVUxMKSB7IC8qIEF1dG8taW5pdGlhbGl6ZSBkdW1teSAqLwotCQlkdW1teSA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIjxkdW1teSBrZXk+Iik7Ci0JCWlmIChkdW1teSA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7CisgICAgcmVnaXN0ZXIgUHlEaWN0T2JqZWN0ICptcDsKKyAgICBpZiAoZHVtbXkgPT0gTlVMTCkgeyAvKiBBdXRvLWluaXRpYWxpemUgZHVtbXkgKi8KKyAgICAgICAgZHVtbXkgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCI8ZHVtbXkga2V5PiIpOworICAgICAgICBpZiAoZHVtbXkgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogI2lmZGVmIFNIT1dfQ09OVkVSU0lPTl9DT1VOVFMKLQkJUHlfQXRFeGl0KHNob3dfY291bnRzKTsKKyAgICAgICAgUHlfQXRFeGl0KHNob3dfY291bnRzKTsKICNlbmRpZgogI2lmZGVmIFNIT1dfQUxMT0NfQ09VTlQKLQkJUHlfQXRFeGl0KHNob3dfYWxsb2MpOworICAgICAgICBQeV9BdEV4aXQoc2hvd19hbGxvYyk7CiAjZW5kaWYKLQl9Ci0JaWYgKG51bWZyZWUpIHsKLQkJbXAgPSBmcmVlX2xpc3RbLS1udW1mcmVlXTsKLQkJYXNzZXJ0IChtcCAhPSBOVUxMKTsKLQkJYXNzZXJ0IChQeV9UWVBFKG1wKSA9PSAmUHlEaWN0X1R5cGUpOwotCQlfUHlfTmV3UmVmZXJlbmNlKChQeU9iamVjdCAqKW1wKTsKLQkJaWYgKG1wLT5tYV9maWxsKSB7Ci0JCQlFTVBUWV9UT19NSU5TSVpFKG1wKTsKLQkJfSBlbHNlIHsKLQkJCS8qIEF0IGxlYXN0IHNldCBtYV90YWJsZSBhbmQgbWFfbWFzazsgdGhlc2UgYXJlIHdyb25nCi0JCQkgICBpZiBhbiBlbXB0eSBidXQgcHJlc2l6ZWQgZGljdCBpcyBhZGRlZCB0byBmcmVlbGlzdCAqLwotCQkJSU5JVF9OT05aRVJPX0RJQ1RfU0xPVFMobXApOwotCQl9Ci0JCWFzc2VydCAobXAtPm1hX3VzZWQgPT0gMCk7Ci0JCWFzc2VydCAobXAtPm1hX3RhYmxlID09IG1wLT5tYV9zbWFsbHRhYmxlKTsKLQkJYXNzZXJ0IChtcC0+bWFfbWFzayA9PSBQeURpY3RfTUlOU0laRSAtIDEpOworICAgIH0KKyAgICBpZiAobnVtZnJlZSkgeworICAgICAgICBtcCA9IGZyZWVfbGlzdFstLW51bWZyZWVdOworICAgICAgICBhc3NlcnQgKG1wICE9IE5VTEwpOworICAgICAgICBhc3NlcnQgKFB5X1RZUEUobXApID09ICZQeURpY3RfVHlwZSk7CisgICAgICAgIF9QeV9OZXdSZWZlcmVuY2UoKFB5T2JqZWN0ICopbXApOworICAgICAgICBpZiAobXAtPm1hX2ZpbGwpIHsKKyAgICAgICAgICAgIEVNUFRZX1RPX01JTlNJWkUobXApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogQXQgbGVhc3Qgc2V0IG1hX3RhYmxlIGFuZCBtYV9tYXNrOyB0aGVzZSBhcmUgd3JvbmcKKyAgICAgICAgICAgICAgIGlmIGFuIGVtcHR5IGJ1dCBwcmVzaXplZCBkaWN0IGlzIGFkZGVkIHRvIGZyZWVsaXN0ICovCisgICAgICAgICAgICBJTklUX05PTlpFUk9fRElDVF9TTE9UUyhtcCk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0IChtcC0+bWFfdXNlZCA9PSAwKTsKKyAgICAgICAgYXNzZXJ0IChtcC0+bWFfdGFibGUgPT0gbXAtPm1hX3NtYWxsdGFibGUpOworICAgICAgICBhc3NlcnQgKG1wLT5tYV9tYXNrID09IFB5RGljdF9NSU5TSVpFIC0gMSk7CiAjaWZkZWYgU0hPV19BTExPQ19DT1VOVAotCQljb3VudF9yZXVzZSsrOworICAgICAgICBjb3VudF9yZXVzZSsrOwogI2VuZGlmCi0JfSBlbHNlIHsKLQkJbXAgPSBQeU9iamVjdF9HQ19OZXcoUHlEaWN0T2JqZWN0LCAmUHlEaWN0X1R5cGUpOwotCQlpZiAobXAgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQlFTVBUWV9UT19NSU5TSVpFKG1wKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtcCA9IFB5T2JqZWN0X0dDX05ldyhQeURpY3RPYmplY3QsICZQeURpY3RfVHlwZSk7CisgICAgICAgIGlmIChtcCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIEVNUFRZX1RPX01JTlNJWkUobXApOwogI2lmZGVmIFNIT1dfQUxMT0NfQ09VTlQKLQkJY291bnRfYWxsb2MrKzsKKyAgICAgICAgY291bnRfYWxsb2MrKzsKICNlbmRpZgotCX0KLQltcC0+bWFfbG9va3VwID0gbG9va2RpY3Rfc3RyaW5nOworICAgIH0KKyAgICBtcC0+bWFfbG9va3VwID0gbG9va2RpY3Rfc3RyaW5nOwogI2lmZGVmIFNIT1dfQ09OVkVSU0lPTl9DT1VOVFMKLQkrK2NyZWF0ZWQ7CisgICAgKytjcmVhdGVkOwogI2VuZGlmCi0JX1B5T2JqZWN0X0dDX1RSQUNLKG1wKTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopbXA7CisgICAgX1B5T2JqZWN0X0dDX1RSQUNLKG1wKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopbXA7CiB9CiAKIC8qCkBAIC0yOTYsODAgKzI5Niw4MCBAQAogc3RhdGljIFB5RGljdEVudHJ5ICoKIGxvb2tkaWN0KFB5RGljdE9iamVjdCAqbXAsIFB5T2JqZWN0ICprZXksIHJlZ2lzdGVyIGxvbmcgaGFzaCkKIHsKLQlyZWdpc3RlciBzaXplX3QgaTsKLQlyZWdpc3RlciBzaXplX3QgcGVydHVyYjsKLQlyZWdpc3RlciBQeURpY3RFbnRyeSAqZnJlZXNsb3Q7Ci0JcmVnaXN0ZXIgc2l6ZV90IG1hc2sgPSAoc2l6ZV90KW1wLT5tYV9tYXNrOwotCVB5RGljdEVudHJ5ICplcDAgPSBtcC0+bWFfdGFibGU7Ci0JcmVnaXN0ZXIgUHlEaWN0RW50cnkgKmVwOwotCXJlZ2lzdGVyIGludCBjbXA7Ci0JUHlPYmplY3QgKnN0YXJ0a2V5OworICAgIHJlZ2lzdGVyIHNpemVfdCBpOworICAgIHJlZ2lzdGVyIHNpemVfdCBwZXJ0dXJiOworICAgIHJlZ2lzdGVyIFB5RGljdEVudHJ5ICpmcmVlc2xvdDsKKyAgICByZWdpc3RlciBzaXplX3QgbWFzayA9IChzaXplX3QpbXAtPm1hX21hc2s7CisgICAgUHlEaWN0RW50cnkgKmVwMCA9IG1wLT5tYV90YWJsZTsKKyAgICByZWdpc3RlciBQeURpY3RFbnRyeSAqZXA7CisgICAgcmVnaXN0ZXIgaW50IGNtcDsKKyAgICBQeU9iamVjdCAqc3RhcnRrZXk7CiAKLQlpID0gKHNpemVfdCloYXNoICYgbWFzazsKLQllcCA9ICZlcDBbaV07Ci0JaWYgKGVwLT5tZV9rZXkgPT0gTlVMTCB8fCBlcC0+bWVfa2V5ID09IGtleSkKLQkJcmV0dXJuIGVwOworICAgIGkgPSAoc2l6ZV90KWhhc2ggJiBtYXNrOworICAgIGVwID0gJmVwMFtpXTsKKyAgICBpZiAoZXAtPm1lX2tleSA9PSBOVUxMIHx8IGVwLT5tZV9rZXkgPT0ga2V5KQorICAgICAgICByZXR1cm4gZXA7CiAKLQlpZiAoZXAtPm1lX2tleSA9PSBkdW1teSkKLQkJZnJlZXNsb3QgPSBlcDsKLQllbHNlIHsKLQkJaWYgKGVwLT5tZV9oYXNoID09IGhhc2gpIHsKLQkJCXN0YXJ0a2V5ID0gZXAtPm1lX2tleTsKLQkJCVB5X0lOQ1JFRihzdGFydGtleSk7Ci0JCQljbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woc3RhcnRrZXksIGtleSwgUHlfRVEpOwotCQkJUHlfREVDUkVGKHN0YXJ0a2V5KTsKLQkJCWlmIChjbXAgPCAwKQotCQkJCXJldHVybiBOVUxMOwotCQkJaWYgKGVwMCA9PSBtcC0+bWFfdGFibGUgJiYgZXAtPm1lX2tleSA9PSBzdGFydGtleSkgewotCQkJCWlmIChjbXAgPiAwKQotCQkJCQlyZXR1cm4gZXA7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvKiBUaGUgY29tcGFyZSBkaWQgbWFqb3IgbmFzdHkgc3R1ZmYgdG8gdGhlCi0JCQkJICogZGljdDogIHN0YXJ0IG92ZXIuCi0JCQkJICogWFhYIEEgY2xldmVyIGFkdmVyc2FyeSBjb3VsZCBwcmV2ZW50IHRoaXMKLQkJCQkgKiBYWFggZnJvbSB0ZXJtaW5hdGluZy4KLSAJCQkJICovCi0gCQkJCXJldHVybiBsb29rZGljdChtcCwga2V5LCBoYXNoKTsKLSAJCQl9Ci0JCX0KLQkJZnJlZXNsb3QgPSBOVUxMOwotCX0KKyAgICBpZiAoZXAtPm1lX2tleSA9PSBkdW1teSkKKyAgICAgICAgZnJlZXNsb3QgPSBlcDsKKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKGVwLT5tZV9oYXNoID09IGhhc2gpIHsKKyAgICAgICAgICAgIHN0YXJ0a2V5ID0gZXAtPm1lX2tleTsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihzdGFydGtleSk7CisgICAgICAgICAgICBjbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woc3RhcnRrZXksIGtleSwgUHlfRVEpOworICAgICAgICAgICAgUHlfREVDUkVGKHN0YXJ0a2V5KTsKKyAgICAgICAgICAgIGlmIChjbXAgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgaWYgKGVwMCA9PSBtcC0+bWFfdGFibGUgJiYgZXAtPm1lX2tleSA9PSBzdGFydGtleSkgeworICAgICAgICAgICAgICAgIGlmIChjbXAgPiAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBUaGUgY29tcGFyZSBkaWQgbWFqb3IgbmFzdHkgc3R1ZmYgdG8gdGhlCisgICAgICAgICAgICAgICAgICogZGljdDogIHN0YXJ0IG92ZXIuCisgICAgICAgICAgICAgICAgICogWFhYIEEgY2xldmVyIGFkdmVyc2FyeSBjb3VsZCBwcmV2ZW50IHRoaXMKKyAgICAgICAgICAgICAgICAgKiBYWFggZnJvbSB0ZXJtaW5hdGluZy4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gbG9va2RpY3QobXAsIGtleSwgaGFzaCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZnJlZXNsb3QgPSBOVUxMOworICAgIH0KIAotCS8qIEluIHRoZSBsb29wLCBtZV9rZXkgPT0gZHVtbXkgaXMgYnkgZmFyIChmYWN0b3Igb2YgMTAwcykgdGhlCi0JICAgbGVhc3QgbGlrZWx5IG91dGNvbWUsIHNvIHRlc3QgZm9yIHRoYXQgbGFzdC4gKi8KLQlmb3IgKHBlcnR1cmIgPSBoYXNoOyA7IHBlcnR1cmIgPj49IFBFUlRVUkJfU0hJRlQpIHsKLQkJaSA9IChpIDw8IDIpICsgaSArIHBlcnR1cmIgKyAxOwotCQllcCA9ICZlcDBbaSAmIG1hc2tdOwotCQlpZiAoZXAtPm1lX2tleSA9PSBOVUxMKQotCQkJcmV0dXJuIGZyZWVzbG90ID09IE5VTEwgPyBlcCA6IGZyZWVzbG90OwotCQlpZiAoZXAtPm1lX2tleSA9PSBrZXkpCi0JCQlyZXR1cm4gZXA7Ci0JCWlmIChlcC0+bWVfaGFzaCA9PSBoYXNoICYmIGVwLT5tZV9rZXkgIT0gZHVtbXkpIHsKLQkJCXN0YXJ0a2V5ID0gZXAtPm1lX2tleTsKLQkJCVB5X0lOQ1JFRihzdGFydGtleSk7Ci0JCQljbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woc3RhcnRrZXksIGtleSwgUHlfRVEpOwotCQkJUHlfREVDUkVGKHN0YXJ0a2V5KTsKLQkJCWlmIChjbXAgPCAwKQotCQkJCXJldHVybiBOVUxMOwotCQkJaWYgKGVwMCA9PSBtcC0+bWFfdGFibGUgJiYgZXAtPm1lX2tleSA9PSBzdGFydGtleSkgewotCQkJCWlmIChjbXAgPiAwKQotCQkJCQlyZXR1cm4gZXA7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvKiBUaGUgY29tcGFyZSBkaWQgbWFqb3IgbmFzdHkgc3R1ZmYgdG8gdGhlCi0JCQkJICogZGljdDogIHN0YXJ0IG92ZXIuCi0JCQkJICogWFhYIEEgY2xldmVyIGFkdmVyc2FyeSBjb3VsZCBwcmV2ZW50IHRoaXMKLQkJCQkgKiBYWFggZnJvbSB0ZXJtaW5hdGluZy4KLSAJCQkJICovCi0gCQkJCXJldHVybiBsb29rZGljdChtcCwga2V5LCBoYXNoKTsKLSAJCQl9Ci0JCX0KLQkJZWxzZSBpZiAoZXAtPm1lX2tleSA9PSBkdW1teSAmJiBmcmVlc2xvdCA9PSBOVUxMKQotCQkJZnJlZXNsb3QgPSBlcDsKLQl9Ci0JYXNzZXJ0KDApOwkvKiBOT1QgUkVBQ0hFRCAqLwotCXJldHVybiAwOworICAgIC8qIEluIHRoZSBsb29wLCBtZV9rZXkgPT0gZHVtbXkgaXMgYnkgZmFyIChmYWN0b3Igb2YgMTAwcykgdGhlCisgICAgICAgbGVhc3QgbGlrZWx5IG91dGNvbWUsIHNvIHRlc3QgZm9yIHRoYXQgbGFzdC4gKi8KKyAgICBmb3IgKHBlcnR1cmIgPSBoYXNoOyA7IHBlcnR1cmIgPj49IFBFUlRVUkJfU0hJRlQpIHsKKyAgICAgICAgaSA9IChpIDw8IDIpICsgaSArIHBlcnR1cmIgKyAxOworICAgICAgICBlcCA9ICZlcDBbaSAmIG1hc2tdOworICAgICAgICBpZiAoZXAtPm1lX2tleSA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIGZyZWVzbG90ID09IE5VTEwgPyBlcCA6IGZyZWVzbG90OworICAgICAgICBpZiAoZXAtPm1lX2tleSA9PSBrZXkpCisgICAgICAgICAgICByZXR1cm4gZXA7CisgICAgICAgIGlmIChlcC0+bWVfaGFzaCA9PSBoYXNoICYmIGVwLT5tZV9rZXkgIT0gZHVtbXkpIHsKKyAgICAgICAgICAgIHN0YXJ0a2V5ID0gZXAtPm1lX2tleTsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihzdGFydGtleSk7CisgICAgICAgICAgICBjbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woc3RhcnRrZXksIGtleSwgUHlfRVEpOworICAgICAgICAgICAgUHlfREVDUkVGKHN0YXJ0a2V5KTsKKyAgICAgICAgICAgIGlmIChjbXAgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgaWYgKGVwMCA9PSBtcC0+bWFfdGFibGUgJiYgZXAtPm1lX2tleSA9PSBzdGFydGtleSkgeworICAgICAgICAgICAgICAgIGlmIChjbXAgPiAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBUaGUgY29tcGFyZSBkaWQgbWFqb3IgbmFzdHkgc3R1ZmYgdG8gdGhlCisgICAgICAgICAgICAgICAgICogZGljdDogIHN0YXJ0IG92ZXIuCisgICAgICAgICAgICAgICAgICogWFhYIEEgY2xldmVyIGFkdmVyc2FyeSBjb3VsZCBwcmV2ZW50IHRoaXMKKyAgICAgICAgICAgICAgICAgKiBYWFggZnJvbSB0ZXJtaW5hdGluZy4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gbG9va2RpY3QobXAsIGtleSwgaGFzaCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoZXAtPm1lX2tleSA9PSBkdW1teSAmJiBmcmVlc2xvdCA9PSBOVUxMKQorICAgICAgICAgICAgZnJlZXNsb3QgPSBlcDsKKyAgICB9CisgICAgYXNzZXJ0KDApOyAgICAgICAgICAvKiBOT1QgUkVBQ0hFRCAqLworICAgIHJldHVybiAwOwogfQogCiAvKgpAQCAtMzg0LDUzICszODQsNTMgQEAKIHN0YXRpYyBQeURpY3RFbnRyeSAqCiBsb29rZGljdF9zdHJpbmcoUHlEaWN0T2JqZWN0ICptcCwgUHlPYmplY3QgKmtleSwgcmVnaXN0ZXIgbG9uZyBoYXNoKQogewotCXJlZ2lzdGVyIHNpemVfdCBpOwotCXJlZ2lzdGVyIHNpemVfdCBwZXJ0dXJiOwotCXJlZ2lzdGVyIFB5RGljdEVudHJ5ICpmcmVlc2xvdDsKLQlyZWdpc3RlciBzaXplX3QgbWFzayA9IChzaXplX3QpbXAtPm1hX21hc2s7Ci0JUHlEaWN0RW50cnkgKmVwMCA9IG1wLT5tYV90YWJsZTsKLQlyZWdpc3RlciBQeURpY3RFbnRyeSAqZXA7CisgICAgcmVnaXN0ZXIgc2l6ZV90IGk7CisgICAgcmVnaXN0ZXIgc2l6ZV90IHBlcnR1cmI7CisgICAgcmVnaXN0ZXIgUHlEaWN0RW50cnkgKmZyZWVzbG90OworICAgIHJlZ2lzdGVyIHNpemVfdCBtYXNrID0gKHNpemVfdCltcC0+bWFfbWFzazsKKyAgICBQeURpY3RFbnRyeSAqZXAwID0gbXAtPm1hX3RhYmxlOworICAgIHJlZ2lzdGVyIFB5RGljdEVudHJ5ICplcDsKIAotCS8qIE1ha2Ugc3VyZSB0aGlzIGZ1bmN0aW9uIGRvZXNuJ3QgaGF2ZSB0byBoYW5kbGUgbm9uLXN0cmluZyBrZXlzLAotCSAgIGluY2x1ZGluZyBzdWJjbGFzc2VzIG9mIHN0cjsgZS5nLiwgb25lIHJlYXNvbiB0byBzdWJjbGFzcwotCSAgIHN0cmluZ3MgaXMgdG8gb3ZlcnJpZGUgX19lcV9fLCBhbmQgZm9yIHNwZWVkIHdlIGRvbid0IGNhdGVyIHRvCi0JICAgdGhhdCBoZXJlLiAqLwotCWlmICghUHlTdHJpbmdfQ2hlY2tFeGFjdChrZXkpKSB7CisgICAgLyogTWFrZSBzdXJlIHRoaXMgZnVuY3Rpb24gZG9lc24ndCBoYXZlIHRvIGhhbmRsZSBub24tc3RyaW5nIGtleXMsCisgICAgICAgaW5jbHVkaW5nIHN1YmNsYXNzZXMgb2Ygc3RyOyBlLmcuLCBvbmUgcmVhc29uIHRvIHN1YmNsYXNzCisgICAgICAgc3RyaW5ncyBpcyB0byBvdmVycmlkZSBfX2VxX18sIGFuZCBmb3Igc3BlZWQgd2UgZG9uJ3QgY2F0ZXIgdG8KKyAgICAgICB0aGF0IGhlcmUuICovCisgICAgaWYgKCFQeVN0cmluZ19DaGVja0V4YWN0KGtleSkpIHsKICNpZmRlZiBTSE9XX0NPTlZFUlNJT05fQ09VTlRTCi0JCSsrY29udmVydGVkOworICAgICAgICArK2NvbnZlcnRlZDsKICNlbmRpZgotCQltcC0+bWFfbG9va3VwID0gbG9va2RpY3Q7Ci0JCXJldHVybiBsb29rZGljdChtcCwga2V5LCBoYXNoKTsKLQl9Ci0JaSA9IGhhc2ggJiBtYXNrOwotCWVwID0gJmVwMFtpXTsKLQlpZiAoZXAtPm1lX2tleSA9PSBOVUxMIHx8IGVwLT5tZV9rZXkgPT0ga2V5KQotCQlyZXR1cm4gZXA7Ci0JaWYgKGVwLT5tZV9rZXkgPT0gZHVtbXkpCi0JCWZyZWVzbG90ID0gZXA7Ci0JZWxzZSB7Ci0JCWlmIChlcC0+bWVfaGFzaCA9PSBoYXNoICYmIF9QeVN0cmluZ19FcShlcC0+bWVfa2V5LCBrZXkpKQotCQkJcmV0dXJuIGVwOwotCQlmcmVlc2xvdCA9IE5VTEw7Ci0JfQorICAgICAgICBtcC0+bWFfbG9va3VwID0gbG9va2RpY3Q7CisgICAgICAgIHJldHVybiBsb29rZGljdChtcCwga2V5LCBoYXNoKTsKKyAgICB9CisgICAgaSA9IGhhc2ggJiBtYXNrOworICAgIGVwID0gJmVwMFtpXTsKKyAgICBpZiAoZXAtPm1lX2tleSA9PSBOVUxMIHx8IGVwLT5tZV9rZXkgPT0ga2V5KQorICAgICAgICByZXR1cm4gZXA7CisgICAgaWYgKGVwLT5tZV9rZXkgPT0gZHVtbXkpCisgICAgICAgIGZyZWVzbG90ID0gZXA7CisgICAgZWxzZSB7CisgICAgICAgIGlmIChlcC0+bWVfaGFzaCA9PSBoYXNoICYmIF9QeVN0cmluZ19FcShlcC0+bWVfa2V5LCBrZXkpKQorICAgICAgICAgICAgcmV0dXJuIGVwOworICAgICAgICBmcmVlc2xvdCA9IE5VTEw7CisgICAgfQogCi0JLyogSW4gdGhlIGxvb3AsIG1lX2tleSA9PSBkdW1teSBpcyBieSBmYXIgKGZhY3RvciBvZiAxMDBzKSB0aGUKLQkgICBsZWFzdCBsaWtlbHkgb3V0Y29tZSwgc28gdGVzdCBmb3IgdGhhdCBsYXN0LiAqLwotCWZvciAocGVydHVyYiA9IGhhc2g7IDsgcGVydHVyYiA+Pj0gUEVSVFVSQl9TSElGVCkgewotCQlpID0gKGkgPDwgMikgKyBpICsgcGVydHVyYiArIDE7Ci0JCWVwID0gJmVwMFtpICYgbWFza107Ci0JCWlmIChlcC0+bWVfa2V5ID09IE5VTEwpCi0JCQlyZXR1cm4gZnJlZXNsb3QgPT0gTlVMTCA/IGVwIDogZnJlZXNsb3Q7Ci0JCWlmIChlcC0+bWVfa2V5ID09IGtleQotCQkgICAgfHwgKGVwLT5tZV9oYXNoID09IGhhc2gKLQkJICAgICAgICAmJiBlcC0+bWVfa2V5ICE9IGR1bW15Ci0JCQkmJiBfUHlTdHJpbmdfRXEoZXAtPm1lX2tleSwga2V5KSkpCi0JCQlyZXR1cm4gZXA7Ci0JCWlmIChlcC0+bWVfa2V5ID09IGR1bW15ICYmIGZyZWVzbG90ID09IE5VTEwpCi0JCQlmcmVlc2xvdCA9IGVwOwotCX0KLQlhc3NlcnQoMCk7CS8qIE5PVCBSRUFDSEVEICovCi0JcmV0dXJuIDA7CisgICAgLyogSW4gdGhlIGxvb3AsIG1lX2tleSA9PSBkdW1teSBpcyBieSBmYXIgKGZhY3RvciBvZiAxMDBzKSB0aGUKKyAgICAgICBsZWFzdCBsaWtlbHkgb3V0Y29tZSwgc28gdGVzdCBmb3IgdGhhdCBsYXN0LiAqLworICAgIGZvciAocGVydHVyYiA9IGhhc2g7IDsgcGVydHVyYiA+Pj0gUEVSVFVSQl9TSElGVCkgeworICAgICAgICBpID0gKGkgPDwgMikgKyBpICsgcGVydHVyYiArIDE7CisgICAgICAgIGVwID0gJmVwMFtpICYgbWFza107CisgICAgICAgIGlmIChlcC0+bWVfa2V5ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gZnJlZXNsb3QgPT0gTlVMTCA/IGVwIDogZnJlZXNsb3Q7CisgICAgICAgIGlmIChlcC0+bWVfa2V5ID09IGtleQorICAgICAgICAgICAgfHwgKGVwLT5tZV9oYXNoID09IGhhc2gKKyAgICAgICAgICAgICYmIGVwLT5tZV9rZXkgIT0gZHVtbXkKKyAgICAgICAgICAgICYmIF9QeVN0cmluZ19FcShlcC0+bWVfa2V5LCBrZXkpKSkKKyAgICAgICAgICAgIHJldHVybiBlcDsKKyAgICAgICAgaWYgKGVwLT5tZV9rZXkgPT0gZHVtbXkgJiYgZnJlZXNsb3QgPT0gTlVMTCkKKyAgICAgICAgICAgIGZyZWVzbG90ID0gZXA7CisgICAgfQorICAgIGFzc2VydCgwKTsgICAgICAgICAgLyogTk9UIFJFQUNIRUQgKi8KKyAgICByZXR1cm4gMDsKIH0KIAogLyoKQEAgLTQ0MiwzNiArNDQyLDM2IEBACiBzdGF0aWMgaW50CiBpbnNlcnRkaWN0KHJlZ2lzdGVyIFB5RGljdE9iamVjdCAqbXAsIFB5T2JqZWN0ICprZXksIGxvbmcgaGFzaCwgUHlPYmplY3QgKnZhbHVlKQogewotCVB5T2JqZWN0ICpvbGRfdmFsdWU7Ci0JcmVnaXN0ZXIgUHlEaWN0RW50cnkgKmVwOwotCXR5cGVkZWYgUHlEaWN0RW50cnkgKigqbG9va3VwZnVuYykoUHlEaWN0T2JqZWN0ICosIFB5T2JqZWN0ICosIGxvbmcpOworICAgIFB5T2JqZWN0ICpvbGRfdmFsdWU7CisgICAgcmVnaXN0ZXIgUHlEaWN0RW50cnkgKmVwOworICAgIHR5cGVkZWYgUHlEaWN0RW50cnkgKigqbG9va3VwZnVuYykoUHlEaWN0T2JqZWN0ICosIFB5T2JqZWN0ICosIGxvbmcpOwogCi0JYXNzZXJ0KG1wLT5tYV9sb29rdXAgIT0gTlVMTCk7Ci0JZXAgPSBtcC0+bWFfbG9va3VwKG1wLCBrZXksIGhhc2gpOwotCWlmIChlcCA9PSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRihrZXkpOwotCQlQeV9ERUNSRUYodmFsdWUpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmIChlcC0+bWVfdmFsdWUgIT0gTlVMTCkgewotCQlvbGRfdmFsdWUgPSBlcC0+bWVfdmFsdWU7Ci0JCWVwLT5tZV92YWx1ZSA9IHZhbHVlOwotCQlQeV9ERUNSRUYob2xkX3ZhbHVlKTsgLyogd2hpY2ggKipDQU4qKiByZS1lbnRlciAqLwotCQlQeV9ERUNSRUYoa2V5KTsKLQl9Ci0JZWxzZSB7Ci0JCWlmIChlcC0+bWVfa2V5ID09IE5VTEwpCi0JCQltcC0+bWFfZmlsbCsrOwotCQllbHNlIHsKLQkJCWFzc2VydChlcC0+bWVfa2V5ID09IGR1bW15KTsKLQkJCVB5X0RFQ1JFRihkdW1teSk7Ci0JCX0KLQkJZXAtPm1lX2tleSA9IGtleTsKLQkJZXAtPm1lX2hhc2ggPSAoUHlfc3NpemVfdCloYXNoOwotCQllcC0+bWVfdmFsdWUgPSB2YWx1ZTsKLQkJbXAtPm1hX3VzZWQrKzsKLQl9Ci0JcmV0dXJuIDA7CisgICAgYXNzZXJ0KG1wLT5tYV9sb29rdXAgIT0gTlVMTCk7CisgICAgZXAgPSBtcC0+bWFfbG9va3VwKG1wLCBrZXksIGhhc2gpOworICAgIGlmIChlcCA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihrZXkpOworICAgICAgICBQeV9ERUNSRUYodmFsdWUpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChlcC0+bWVfdmFsdWUgIT0gTlVMTCkgeworICAgICAgICBvbGRfdmFsdWUgPSBlcC0+bWVfdmFsdWU7CisgICAgICAgIGVwLT5tZV92YWx1ZSA9IHZhbHVlOworICAgICAgICBQeV9ERUNSRUYob2xkX3ZhbHVlKTsgLyogd2hpY2ggKipDQU4qKiByZS1lbnRlciAqLworICAgICAgICBQeV9ERUNSRUYoa2V5KTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGlmIChlcC0+bWVfa2V5ID09IE5VTEwpCisgICAgICAgICAgICBtcC0+bWFfZmlsbCsrOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGFzc2VydChlcC0+bWVfa2V5ID09IGR1bW15KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihkdW1teSk7CisgICAgICAgIH0KKyAgICAgICAgZXAtPm1lX2tleSA9IGtleTsKKyAgICAgICAgZXAtPm1lX2hhc2ggPSAoUHlfc3NpemVfdCloYXNoOworICAgICAgICBlcC0+bWVfdmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgbXAtPm1hX3VzZWQrKzsKKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIC8qCkBAIC00ODQsMjYgKzQ4NCwyNiBAQAogKi8KIHN0YXRpYyB2b2lkCiBpbnNlcnRkaWN0X2NsZWFuKHJlZ2lzdGVyIFB5RGljdE9iamVjdCAqbXAsIFB5T2JqZWN0ICprZXksIGxvbmcgaGFzaCwKLQkJIFB5T2JqZWN0ICp2YWx1ZSkKKyAgICAgICAgICAgICAgICAgUHlPYmplY3QgKnZhbHVlKQogewotCXJlZ2lzdGVyIHNpemVfdCBpOwotCXJlZ2lzdGVyIHNpemVfdCBwZXJ0dXJiOwotCXJlZ2lzdGVyIHNpemVfdCBtYXNrID0gKHNpemVfdCltcC0+bWFfbWFzazsKLQlQeURpY3RFbnRyeSAqZXAwID0gbXAtPm1hX3RhYmxlOwotCXJlZ2lzdGVyIFB5RGljdEVudHJ5ICplcDsKKyAgICByZWdpc3RlciBzaXplX3QgaTsKKyAgICByZWdpc3RlciBzaXplX3QgcGVydHVyYjsKKyAgICByZWdpc3RlciBzaXplX3QgbWFzayA9IChzaXplX3QpbXAtPm1hX21hc2s7CisgICAgUHlEaWN0RW50cnkgKmVwMCA9IG1wLT5tYV90YWJsZTsKKyAgICByZWdpc3RlciBQeURpY3RFbnRyeSAqZXA7CiAKLQlpID0gaGFzaCAmIG1hc2s7Ci0JZXAgPSAmZXAwW2ldOwotCWZvciAocGVydHVyYiA9IGhhc2g7IGVwLT5tZV9rZXkgIT0gTlVMTDsgcGVydHVyYiA+Pj0gUEVSVFVSQl9TSElGVCkgewotCQlpID0gKGkgPDwgMikgKyBpICsgcGVydHVyYiArIDE7Ci0JCWVwID0gJmVwMFtpICYgbWFza107Ci0JfQotCWFzc2VydChlcC0+bWVfdmFsdWUgPT0gTlVMTCk7Ci0JbXAtPm1hX2ZpbGwrKzsKLQllcC0+bWVfa2V5ID0ga2V5OwotCWVwLT5tZV9oYXNoID0gKFB5X3NzaXplX3QpaGFzaDsKLQllcC0+bWVfdmFsdWUgPSB2YWx1ZTsKLQltcC0+bWFfdXNlZCsrOworICAgIGkgPSBoYXNoICYgbWFzazsKKyAgICBlcCA9ICZlcDBbaV07CisgICAgZm9yIChwZXJ0dXJiID0gaGFzaDsgZXAtPm1lX2tleSAhPSBOVUxMOyBwZXJ0dXJiID4+PSBQRVJUVVJCX1NISUZUKSB7CisgICAgICAgIGkgPSAoaSA8PCAyKSArIGkgKyBwZXJ0dXJiICsgMTsKKyAgICAgICAgZXAgPSAmZXAwW2kgJiBtYXNrXTsKKyAgICB9CisgICAgYXNzZXJ0KGVwLT5tZV92YWx1ZSA9PSBOVUxMKTsKKyAgICBtcC0+bWFfZmlsbCsrOworICAgIGVwLT5tZV9rZXkgPSBrZXk7CisgICAgZXAtPm1lX2hhc2ggPSAoUHlfc3NpemVfdCloYXNoOworICAgIGVwLT5tZV92YWx1ZSA9IHZhbHVlOworICAgIG1wLT5tYV91c2VkKys7CiB9CiAKIC8qCkBAIC01MTQsODQgKzUxNCw4NCBAQAogc3RhdGljIGludAogZGljdHJlc2l6ZShQeURpY3RPYmplY3QgKm1wLCBQeV9zc2l6ZV90IG1pbnVzZWQpCiB7Ci0JUHlfc3NpemVfdCBuZXdzaXplOwotCVB5RGljdEVudHJ5ICpvbGR0YWJsZSwgKm5ld3RhYmxlLCAqZXA7Ci0JUHlfc3NpemVfdCBpOwotCWludCBpc19vbGR0YWJsZV9tYWxsb2NlZDsKLQlQeURpY3RFbnRyeSBzbWFsbF9jb3B5W1B5RGljdF9NSU5TSVpFXTsKKyAgICBQeV9zc2l6ZV90IG5ld3NpemU7CisgICAgUHlEaWN0RW50cnkgKm9sZHRhYmxlLCAqbmV3dGFibGUsICplcDsKKyAgICBQeV9zc2l6ZV90IGk7CisgICAgaW50IGlzX29sZHRhYmxlX21hbGxvY2VkOworICAgIFB5RGljdEVudHJ5IHNtYWxsX2NvcHlbUHlEaWN0X01JTlNJWkVdOwogCi0JYXNzZXJ0KG1pbnVzZWQgPj0gMCk7CisgICAgYXNzZXJ0KG1pbnVzZWQgPj0gMCk7CiAKLQkvKiBGaW5kIHRoZSBzbWFsbGVzdCB0YWJsZSBzaXplID4gbWludXNlZC4gKi8KLQlmb3IgKG5ld3NpemUgPSBQeURpY3RfTUlOU0laRTsKLQkgICAgIG5ld3NpemUgPD0gbWludXNlZCAmJiBuZXdzaXplID4gMDsKLQkgICAgIG5ld3NpemUgPDw9IDEpCi0JCTsKLQlpZiAobmV3c2l6ZSA8PSAwKSB7Ci0JCVB5RXJyX05vTWVtb3J5KCk7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgLyogRmluZCB0aGUgc21hbGxlc3QgdGFibGUgc2l6ZSA+IG1pbnVzZWQuICovCisgICAgZm9yIChuZXdzaXplID0gUHlEaWN0X01JTlNJWkU7CisgICAgICAgICBuZXdzaXplIDw9IG1pbnVzZWQgJiYgbmV3c2l6ZSA+IDA7CisgICAgICAgICBuZXdzaXplIDw8PSAxKQorICAgICAgICA7CisgICAgaWYgKG5ld3NpemUgPD0gMCkgeworICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JLyogR2V0IHNwYWNlIGZvciBhIG5ldyB0YWJsZS4gKi8KLQlvbGR0YWJsZSA9IG1wLT5tYV90YWJsZTsKLQlhc3NlcnQob2xkdGFibGUgIT0gTlVMTCk7Ci0JaXNfb2xkdGFibGVfbWFsbG9jZWQgPSBvbGR0YWJsZSAhPSBtcC0+bWFfc21hbGx0YWJsZTsKKyAgICAvKiBHZXQgc3BhY2UgZm9yIGEgbmV3IHRhYmxlLiAqLworICAgIG9sZHRhYmxlID0gbXAtPm1hX3RhYmxlOworICAgIGFzc2VydChvbGR0YWJsZSAhPSBOVUxMKTsKKyAgICBpc19vbGR0YWJsZV9tYWxsb2NlZCA9IG9sZHRhYmxlICE9IG1wLT5tYV9zbWFsbHRhYmxlOwogCi0JaWYgKG5ld3NpemUgPT0gUHlEaWN0X01JTlNJWkUpIHsKLQkJLyogQSBsYXJnZSB0YWJsZSBpcyBzaHJpbmtpbmcsIG9yIHdlIGNhbid0IGdldCBhbnkgc21hbGxlci4gKi8KLQkJbmV3dGFibGUgPSBtcC0+bWFfc21hbGx0YWJsZTsKLQkJaWYgKG5ld3RhYmxlID09IG9sZHRhYmxlKSB7Ci0JCQlpZiAobXAtPm1hX2ZpbGwgPT0gbXAtPm1hX3VzZWQpIHsKLQkJCQkvKiBObyBkdW1taWVzLCBzbyBubyBwb2ludCBkb2luZyBhbnl0aGluZy4gKi8KLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJCS8qIFdlJ3JlIG5vdCBnb2luZyB0byByZXNpemUgaXQsIGJ1dCByZWJ1aWxkIHRoZQotCQkJICAgdGFibGUgYW55d2F5IHRvIHB1cmdlIG9sZCBkdW1teSBlbnRyaWVzLgotCQkJICAgU3VidGxlOiAgVGhpcyBpcyAqbmVjZXNzYXJ5KiBpZiBmaWxsPT1zaXplLAotCQkJICAgYXMgbG9va2RpY3QgbmVlZHMgYXQgbGVhc3Qgb25lIHZpcmdpbiBzbG90IHRvCi0JCQkgICB0ZXJtaW5hdGUgZmFpbGluZyBzZWFyY2hlcy4gIElmIGZpbGwgPCBzaXplLCBpdCdzCi0JCQkgICBtZXJlbHkgZGVzaXJhYmxlLCBhcyBkdW1taWVzIHNsb3cgc2VhcmNoZXMuICovCi0JCQlhc3NlcnQobXAtPm1hX2ZpbGwgPiBtcC0+bWFfdXNlZCk7Ci0JCQltZW1jcHkoc21hbGxfY29weSwgb2xkdGFibGUsIHNpemVvZihzbWFsbF9jb3B5KSk7Ci0JCQlvbGR0YWJsZSA9IHNtYWxsX2NvcHk7Ci0JCX0KLQl9Ci0JZWxzZSB7Ci0JCW5ld3RhYmxlID0gUHlNZW1fTkVXKFB5RGljdEVudHJ5LCBuZXdzaXplKTsKLQkJaWYgKG5ld3RhYmxlID09IE5VTEwpIHsKLQkJCVB5RXJyX05vTWVtb3J5KCk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9CisgICAgaWYgKG5ld3NpemUgPT0gUHlEaWN0X01JTlNJWkUpIHsKKyAgICAgICAgLyogQSBsYXJnZSB0YWJsZSBpcyBzaHJpbmtpbmcsIG9yIHdlIGNhbid0IGdldCBhbnkgc21hbGxlci4gKi8KKyAgICAgICAgbmV3dGFibGUgPSBtcC0+bWFfc21hbGx0YWJsZTsKKyAgICAgICAgaWYgKG5ld3RhYmxlID09IG9sZHRhYmxlKSB7CisgICAgICAgICAgICBpZiAobXAtPm1hX2ZpbGwgPT0gbXAtPm1hX3VzZWQpIHsKKyAgICAgICAgICAgICAgICAvKiBObyBkdW1taWVzLCBzbyBubyBwb2ludCBkb2luZyBhbnl0aGluZy4gKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIFdlJ3JlIG5vdCBnb2luZyB0byByZXNpemUgaXQsIGJ1dCByZWJ1aWxkIHRoZQorICAgICAgICAgICAgICAgdGFibGUgYW55d2F5IHRvIHB1cmdlIG9sZCBkdW1teSBlbnRyaWVzLgorICAgICAgICAgICAgICAgU3VidGxlOiAgVGhpcyBpcyAqbmVjZXNzYXJ5KiBpZiBmaWxsPT1zaXplLAorICAgICAgICAgICAgICAgYXMgbG9va2RpY3QgbmVlZHMgYXQgbGVhc3Qgb25lIHZpcmdpbiBzbG90IHRvCisgICAgICAgICAgICAgICB0ZXJtaW5hdGUgZmFpbGluZyBzZWFyY2hlcy4gIElmIGZpbGwgPCBzaXplLCBpdCdzCisgICAgICAgICAgICAgICBtZXJlbHkgZGVzaXJhYmxlLCBhcyBkdW1taWVzIHNsb3cgc2VhcmNoZXMuICovCisgICAgICAgICAgICBhc3NlcnQobXAtPm1hX2ZpbGwgPiBtcC0+bWFfdXNlZCk7CisgICAgICAgICAgICBtZW1jcHkoc21hbGxfY29weSwgb2xkdGFibGUsIHNpemVvZihzbWFsbF9jb3B5KSk7CisgICAgICAgICAgICBvbGR0YWJsZSA9IHNtYWxsX2NvcHk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIG5ld3RhYmxlID0gUHlNZW1fTkVXKFB5RGljdEVudHJ5LCBuZXdzaXplKTsKKyAgICAgICAgaWYgKG5ld3RhYmxlID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKiBNYWtlIHRoZSBkaWN0IGVtcHR5LCB1c2luZyB0aGUgbmV3IHRhYmxlLiAqLwotCWFzc2VydChuZXd0YWJsZSAhPSBvbGR0YWJsZSk7Ci0JbXAtPm1hX3RhYmxlID0gbmV3dGFibGU7Ci0JbXAtPm1hX21hc2sgPSBuZXdzaXplIC0gMTsKLQltZW1zZXQobmV3dGFibGUsIDAsIHNpemVvZihQeURpY3RFbnRyeSkgKiBuZXdzaXplKTsKLQltcC0+bWFfdXNlZCA9IDA7Ci0JaSA9IG1wLT5tYV9maWxsOwotCW1wLT5tYV9maWxsID0gMDsKKyAgICAvKiBNYWtlIHRoZSBkaWN0IGVtcHR5LCB1c2luZyB0aGUgbmV3IHRhYmxlLiAqLworICAgIGFzc2VydChuZXd0YWJsZSAhPSBvbGR0YWJsZSk7CisgICAgbXAtPm1hX3RhYmxlID0gbmV3dGFibGU7CisgICAgbXAtPm1hX21hc2sgPSBuZXdzaXplIC0gMTsKKyAgICBtZW1zZXQobmV3dGFibGUsIDAsIHNpemVvZihQeURpY3RFbnRyeSkgKiBuZXdzaXplKTsKKyAgICBtcC0+bWFfdXNlZCA9IDA7CisgICAgaSA9IG1wLT5tYV9maWxsOworICAgIG1wLT5tYV9maWxsID0gMDsKIAotCS8qIENvcHkgdGhlIGRhdGEgb3ZlcjsgdGhpcyBpcyByZWZjb3VudC1uZXV0cmFsIGZvciBhY3RpdmUgZW50cmllczsKLQkgICBkdW1teSBlbnRyaWVzIGFyZW4ndCBjb3BpZWQgb3Zlciwgb2YgY291cnNlICovCi0JZm9yIChlcCA9IG9sZHRhYmxlOyBpID4gMDsgZXArKykgewotCQlpZiAoZXAtPm1lX3ZhbHVlICE9IE5VTEwpIHsJLyogYWN0aXZlIGVudHJ5ICovCi0JCQktLWk7Ci0JCQlpbnNlcnRkaWN0X2NsZWFuKG1wLCBlcC0+bWVfa2V5LCAobG9uZyllcC0+bWVfaGFzaCwKLQkJCQkJIGVwLT5tZV92YWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAoZXAtPm1lX2tleSAhPSBOVUxMKSB7CS8qIGR1bW15IGVudHJ5ICovCi0JCQktLWk7Ci0JCQlhc3NlcnQoZXAtPm1lX2tleSA9PSBkdW1teSk7Ci0JCQlQeV9ERUNSRUYoZXAtPm1lX2tleSk7Ci0JCX0KLQkJLyogZWxzZSBrZXkgPT0gdmFsdWUgPT0gTlVMTDogIG5vdGhpbmcgdG8gZG8gKi8KLQl9CisgICAgLyogQ29weSB0aGUgZGF0YSBvdmVyOyB0aGlzIGlzIHJlZmNvdW50LW5ldXRyYWwgZm9yIGFjdGl2ZSBlbnRyaWVzOworICAgICAgIGR1bW15IGVudHJpZXMgYXJlbid0IGNvcGllZCBvdmVyLCBvZiBjb3Vyc2UgKi8KKyAgICBmb3IgKGVwID0gb2xkdGFibGU7IGkgPiAwOyBlcCsrKSB7CisgICAgICAgIGlmIChlcC0+bWVfdmFsdWUgIT0gTlVMTCkgeyAgICAgICAgICAgICAvKiBhY3RpdmUgZW50cnkgKi8KKyAgICAgICAgICAgIC0taTsKKyAgICAgICAgICAgIGluc2VydGRpY3RfY2xlYW4obXAsIGVwLT5tZV9rZXksIChsb25nKWVwLT5tZV9oYXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcC0+bWVfdmFsdWUpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGVwLT5tZV9rZXkgIT0gTlVMTCkgeyAgICAgICAgICAvKiBkdW1teSBlbnRyeSAqLworICAgICAgICAgICAgLS1pOworICAgICAgICAgICAgYXNzZXJ0KGVwLT5tZV9rZXkgPT0gZHVtbXkpOworICAgICAgICAgICAgUHlfREVDUkVGKGVwLT5tZV9rZXkpOworICAgICAgICB9CisgICAgICAgIC8qIGVsc2Uga2V5ID09IHZhbHVlID09IE5VTEw6ICBub3RoaW5nIHRvIGRvICovCisgICAgfQogCi0JaWYgKGlzX29sZHRhYmxlX21hbGxvY2VkKQotCQlQeU1lbV9ERUwob2xkdGFibGUpOwotCXJldHVybiAwOworICAgIGlmIChpc19vbGR0YWJsZV9tYWxsb2NlZCkKKyAgICAgICAgUHlNZW1fREVMKG9sZHRhYmxlKTsKKyAgICByZXR1cm4gMDsKIH0KIAogLyogQ3JlYXRlIGEgbmV3IGRpY3Rpb25hcnkgcHJlLXNpemVkIHRvIGhvbGQgYW4gZXN0aW1hdGVkIG51bWJlciBvZiBlbGVtZW50cy4KQEAgLTYwMiwxMyArNjAyLDEzIEBACiBQeU9iamVjdCAqCiBfUHlEaWN0X05ld1ByZXNpemVkKFB5X3NzaXplX3QgbWludXNlZCkKIHsKLQlQeU9iamVjdCAqb3AgPSBQeURpY3RfTmV3KCk7CisgICAgUHlPYmplY3QgKm9wID0gUHlEaWN0X05ldygpOwogCi0JaWYgKG1pbnVzZWQ+NSAmJiBvcCAhPSBOVUxMICYmIGRpY3RyZXNpemUoKFB5RGljdE9iamVjdCAqKW9wLCBtaW51c2VkKSA9PSAtMSkgewotCQlQeV9ERUNSRUYob3ApOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIG9wOworICAgIGlmIChtaW51c2VkPjUgJiYgb3AgIT0gTlVMTCAmJiBkaWN0cmVzaXplKChQeURpY3RPYmplY3QgKilvcCwgbWludXNlZCkgPT0gLTEpIHsKKyAgICAgICAgUHlfREVDUkVGKG9wKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBvcDsKIH0KIAogLyogTm90ZSB0aGF0LCBmb3IgaGlzdG9yaWNhbCByZWFzb25zLCBQeURpY3RfR2V0SXRlbSgpIHN1cHByZXNzZXMgYWxsIGVycm9ycwpAQCAtNjI0LDQ0ICs2MjQsNDQgQEAKIFB5T2JqZWN0ICoKIFB5RGljdF9HZXRJdGVtKFB5T2JqZWN0ICpvcCwgUHlPYmplY3QgKmtleSkKIHsKLQlsb25nIGhhc2g7Ci0JUHlEaWN0T2JqZWN0ICptcCA9IChQeURpY3RPYmplY3QgKilvcDsKLQlQeURpY3RFbnRyeSAqZXA7Ci0JUHlUaHJlYWRTdGF0ZSAqdHN0YXRlOwotCWlmICghUHlEaWN0X0NoZWNrKG9wKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFQeVN0cmluZ19DaGVja0V4YWN0KGtleSkgfHwKLQkgICAgKGhhc2ggPSAoKFB5U3RyaW5nT2JqZWN0ICopIGtleSktPm9iX3NoYXNoKSA9PSAtMSkKLQl7Ci0JCWhhc2ggPSBQeU9iamVjdF9IYXNoKGtleSk7Ci0JCWlmIChoYXNoID09IC0xKSB7Ci0JCQlQeUVycl9DbGVhcigpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9CisgICAgbG9uZyBoYXNoOworICAgIFB5RGljdE9iamVjdCAqbXAgPSAoUHlEaWN0T2JqZWN0ICopb3A7CisgICAgUHlEaWN0RW50cnkgKmVwOworICAgIFB5VGhyZWFkU3RhdGUgKnRzdGF0ZTsKKyAgICBpZiAoIVB5RGljdF9DaGVjayhvcCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHlTdHJpbmdfQ2hlY2tFeGFjdChrZXkpIHx8CisgICAgICAgIChoYXNoID0gKChQeVN0cmluZ09iamVjdCAqKSBrZXkpLT5vYl9zaGFzaCkgPT0gLTEpCisgICAgeworICAgICAgICBoYXNoID0gUHlPYmplY3RfSGFzaChrZXkpOworICAgICAgICBpZiAoaGFzaCA9PSAtMSkgeworICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQogCi0JLyogV2UgY2FuIGFycml2ZSBoZXJlIHdpdGggYSBOVUxMIHRzdGF0ZSBkdXJpbmcgaW5pdGlhbGl6YXRpb246Ci0JICAgdHJ5IHJ1bm5pbmcgInB5dGhvbiAtV2kiIGZvciBhbiBleGFtcGxlIHJlbGF0ZWQgdG8gc3RyaW5nCi0JICAgaW50ZXJuaW5nLiAgTGV0J3MganVzdCBob3BlIHRoYXQgbm8gZXhjZXB0aW9uIG9jY3VycyB0aGVuLi4uICovCi0JdHN0YXRlID0gX1B5VGhyZWFkU3RhdGVfQ3VycmVudDsKLQlpZiAodHN0YXRlICE9IE5VTEwgJiYgdHN0YXRlLT5jdXJleGNfdHlwZSAhPSBOVUxMKSB7Ci0JCS8qIHByZXNlcnZlIHRoZSBleGlzdGluZyBleGNlcHRpb24gKi8KLQkJUHlPYmplY3QgKmVycl90eXBlLCAqZXJyX3ZhbHVlLCAqZXJyX3RiOwotCQlQeUVycl9GZXRjaCgmZXJyX3R5cGUsICZlcnJfdmFsdWUsICZlcnJfdGIpOwotCQllcCA9IChtcC0+bWFfbG9va3VwKShtcCwga2V5LCBoYXNoKTsKLQkJLyogaWdub3JlIGVycm9ycyAqLwotCQlQeUVycl9SZXN0b3JlKGVycl90eXBlLCBlcnJfdmFsdWUsIGVycl90Yik7Ci0JCWlmIChlcCA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCWVsc2UgewotCQllcCA9IChtcC0+bWFfbG9va3VwKShtcCwga2V5LCBoYXNoKTsKLQkJaWYgKGVwID09IE5VTEwpIHsKLQkJCVB5RXJyX0NsZWFyKCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KLQlyZXR1cm4gZXAtPm1lX3ZhbHVlOworICAgIC8qIFdlIGNhbiBhcnJpdmUgaGVyZSB3aXRoIGEgTlVMTCB0c3RhdGUgZHVyaW5nIGluaXRpYWxpemF0aW9uOgorICAgICAgIHRyeSBydW5uaW5nICJweXRob24gLVdpIiBmb3IgYW4gZXhhbXBsZSByZWxhdGVkIHRvIHN0cmluZworICAgICAgIGludGVybmluZy4gIExldCdzIGp1c3QgaG9wZSB0aGF0IG5vIGV4Y2VwdGlvbiBvY2N1cnMgdGhlbi4uLiAqLworICAgIHRzdGF0ZSA9IF9QeVRocmVhZFN0YXRlX0N1cnJlbnQ7CisgICAgaWYgKHRzdGF0ZSAhPSBOVUxMICYmIHRzdGF0ZS0+Y3VyZXhjX3R5cGUgIT0gTlVMTCkgeworICAgICAgICAvKiBwcmVzZXJ2ZSB0aGUgZXhpc3RpbmcgZXhjZXB0aW9uICovCisgICAgICAgIFB5T2JqZWN0ICplcnJfdHlwZSwgKmVycl92YWx1ZSwgKmVycl90YjsKKyAgICAgICAgUHlFcnJfRmV0Y2goJmVycl90eXBlLCAmZXJyX3ZhbHVlLCAmZXJyX3RiKTsKKyAgICAgICAgZXAgPSAobXAtPm1hX2xvb2t1cCkobXAsIGtleSwgaGFzaCk7CisgICAgICAgIC8qIGlnbm9yZSBlcnJvcnMgKi8KKyAgICAgICAgUHlFcnJfUmVzdG9yZShlcnJfdHlwZSwgZXJyX3ZhbHVlLCBlcnJfdGIpOworICAgICAgICBpZiAoZXAgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgZXAgPSAobXAtPm1hX2xvb2t1cCkobXAsIGtleSwgaGFzaCk7CisgICAgICAgIGlmIChlcCA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGVwLT5tZV92YWx1ZTsKIH0KIAogLyogQ0FVVElPTjogUHlEaWN0X1NldEl0ZW0oKSBtdXN0IGd1YXJhbnRlZSB0aGF0IGl0IHdvbid0IHJlc2l6ZSB0aGUKQEAgLTY3MywxNTcgKzY3MywxNTcgQEAKIGludAogUHlEaWN0X1NldEl0ZW0ocmVnaXN0ZXIgUHlPYmplY3QgKm9wLCBQeU9iamVjdCAqa2V5LCBQeU9iamVjdCAqdmFsdWUpCiB7Ci0JcmVnaXN0ZXIgUHlEaWN0T2JqZWN0ICptcDsKLQlyZWdpc3RlciBsb25nIGhhc2g7Ci0JcmVnaXN0ZXIgUHlfc3NpemVfdCBuX3VzZWQ7CisgICAgcmVnaXN0ZXIgUHlEaWN0T2JqZWN0ICptcDsKKyAgICByZWdpc3RlciBsb25nIGhhc2g7CisgICAgcmVnaXN0ZXIgUHlfc3NpemVfdCBuX3VzZWQ7CiAKLQlpZiAoIVB5RGljdF9DaGVjayhvcCkpIHsKLQkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JYXNzZXJ0KGtleSk7Ci0JYXNzZXJ0KHZhbHVlKTsKLQltcCA9IChQeURpY3RPYmplY3QgKilvcDsKLQlpZiAoUHlTdHJpbmdfQ2hlY2tFeGFjdChrZXkpKSB7Ci0JCWhhc2ggPSAoKFB5U3RyaW5nT2JqZWN0ICopa2V5KS0+b2Jfc2hhc2g7Ci0JCWlmIChoYXNoID09IC0xKQotCQkJaGFzaCA9IFB5T2JqZWN0X0hhc2goa2V5KTsKLQl9Ci0JZWxzZSB7Ci0JCWhhc2ggPSBQeU9iamVjdF9IYXNoKGtleSk7Ci0JCWlmIChoYXNoID09IC0xKQotCQkJcmV0dXJuIC0xOwotCX0KLQlhc3NlcnQobXAtPm1hX2ZpbGwgPD0gbXAtPm1hX21hc2spOyAgLyogYXQgbGVhc3Qgb25lIGVtcHR5IHNsb3QgKi8KLQluX3VzZWQgPSBtcC0+bWFfdXNlZDsKLQlQeV9JTkNSRUYodmFsdWUpOwotCVB5X0lOQ1JFRihrZXkpOwotCWlmIChpbnNlcnRkaWN0KG1wLCBrZXksIGhhc2gsIHZhbHVlKSAhPSAwKQotCQlyZXR1cm4gLTE7Ci0JLyogSWYgd2UgYWRkZWQgYSBrZXksIHdlIGNhbiBzYWZlbHkgcmVzaXplLiAgT3RoZXJ3aXNlIGp1c3QgcmV0dXJuIQotCSAqIElmIGZpbGwgPj0gMi8zIHNpemUsIGFkanVzdCBzaXplLiAgTm9ybWFsbHksIHRoaXMgZG91YmxlcyBvcgotCSAqIHF1YWR1cGxlcyB0aGUgc2l6ZSwgYnV0IGl0J3MgYWxzbyBwb3NzaWJsZSBmb3IgdGhlIGRpY3QgdG8gc2hyaW5rCi0JICogKGlmIG1hX2ZpbGwgaXMgbXVjaCBsYXJnZXIgdGhhbiBtYV91c2VkLCBtZWFuaW5nIGEgbG90IG9mIGRpY3QKLQkgKiBrZXlzIGhhdmUgYmVlbiAqIGRlbGV0ZWQpLgotCSAqCi0JICogUXVhZHJ1cGxpbmcgdGhlIHNpemUgaW1wcm92ZXMgYXZlcmFnZSBkaWN0aW9uYXJ5IHNwYXJzZW5lc3MKLQkgKiAocmVkdWNpbmcgY29sbGlzaW9ucykgYXQgdGhlIGNvc3Qgb2Ygc29tZSBtZW1vcnkgYW5kIGl0ZXJhdGlvbgotCSAqIHNwZWVkICh3aGljaCBsb29wcyBvdmVyIGV2ZXJ5IHBvc3NpYmxlIGVudHJ5KS4gIEl0IGFsc28gaGFsdmVzCi0JICogdGhlIG51bWJlciBvZiBleHBlbnNpdmUgcmVzaXplIG9wZXJhdGlvbnMgaW4gYSBncm93aW5nIGRpY3Rpb25hcnkuCi0JICoKLQkgKiBWZXJ5IGxhcmdlIGRpY3Rpb25hcmllcyAob3ZlciA1MEsgaXRlbXMpIHVzZSBkb3VibGluZyBpbnN0ZWFkLgotCSAqIFRoaXMgbWF5IGhlbHAgYXBwbGljYXRpb25zIHdpdGggc2V2ZXJlIG1lbW9yeSBjb25zdHJhaW50cy4KLQkgKi8KLQlpZiAoIShtcC0+bWFfdXNlZCA+IG5fdXNlZCAmJiBtcC0+bWFfZmlsbCozID49IChtcC0+bWFfbWFzaysxKSoyKSkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIGRpY3RyZXNpemUobXAsIChtcC0+bWFfdXNlZCA+IDUwMDAwID8gMiA6IDQpICogbXAtPm1hX3VzZWQpOworICAgIGlmICghUHlEaWN0X0NoZWNrKG9wKSkgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBhc3NlcnQoa2V5KTsKKyAgICBhc3NlcnQodmFsdWUpOworICAgIG1wID0gKFB5RGljdE9iamVjdCAqKW9wOworICAgIGlmIChQeVN0cmluZ19DaGVja0V4YWN0KGtleSkpIHsKKyAgICAgICAgaGFzaCA9ICgoUHlTdHJpbmdPYmplY3QgKilrZXkpLT5vYl9zaGFzaDsKKyAgICAgICAgaWYgKGhhc2ggPT0gLTEpCisgICAgICAgICAgICBoYXNoID0gUHlPYmplY3RfSGFzaChrZXkpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaGFzaCA9IFB5T2JqZWN0X0hhc2goa2V5KTsKKyAgICAgICAgaWYgKGhhc2ggPT0gLTEpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGFzc2VydChtcC0+bWFfZmlsbCA8PSBtcC0+bWFfbWFzayk7ICAvKiBhdCBsZWFzdCBvbmUgZW1wdHkgc2xvdCAqLworICAgIG5fdXNlZCA9IG1wLT5tYV91c2VkOworICAgIFB5X0lOQ1JFRih2YWx1ZSk7CisgICAgUHlfSU5DUkVGKGtleSk7CisgICAgaWYgKGluc2VydGRpY3QobXAsIGtleSwgaGFzaCwgdmFsdWUpICE9IDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICAvKiBJZiB3ZSBhZGRlZCBhIGtleSwgd2UgY2FuIHNhZmVseSByZXNpemUuICBPdGhlcndpc2UganVzdCByZXR1cm4hCisgICAgICogSWYgZmlsbCA+PSAyLzMgc2l6ZSwgYWRqdXN0IHNpemUuICBOb3JtYWxseSwgdGhpcyBkb3VibGVzIG9yCisgICAgICogcXVhZHVwbGVzIHRoZSBzaXplLCBidXQgaXQncyBhbHNvIHBvc3NpYmxlIGZvciB0aGUgZGljdCB0byBzaHJpbmsKKyAgICAgKiAoaWYgbWFfZmlsbCBpcyBtdWNoIGxhcmdlciB0aGFuIG1hX3VzZWQsIG1lYW5pbmcgYSBsb3Qgb2YgZGljdAorICAgICAqIGtleXMgaGF2ZSBiZWVuICogZGVsZXRlZCkuCisgICAgICoKKyAgICAgKiBRdWFkcnVwbGluZyB0aGUgc2l6ZSBpbXByb3ZlcyBhdmVyYWdlIGRpY3Rpb25hcnkgc3BhcnNlbmVzcworICAgICAqIChyZWR1Y2luZyBjb2xsaXNpb25zKSBhdCB0aGUgY29zdCBvZiBzb21lIG1lbW9yeSBhbmQgaXRlcmF0aW9uCisgICAgICogc3BlZWQgKHdoaWNoIGxvb3BzIG92ZXIgZXZlcnkgcG9zc2libGUgZW50cnkpLiAgSXQgYWxzbyBoYWx2ZXMKKyAgICAgKiB0aGUgbnVtYmVyIG9mIGV4cGVuc2l2ZSByZXNpemUgb3BlcmF0aW9ucyBpbiBhIGdyb3dpbmcgZGljdGlvbmFyeS4KKyAgICAgKgorICAgICAqIFZlcnkgbGFyZ2UgZGljdGlvbmFyaWVzIChvdmVyIDUwSyBpdGVtcykgdXNlIGRvdWJsaW5nIGluc3RlYWQuCisgICAgICogVGhpcyBtYXkgaGVscCBhcHBsaWNhdGlvbnMgd2l0aCBzZXZlcmUgbWVtb3J5IGNvbnN0cmFpbnRzLgorICAgICAqLworICAgIGlmICghKG1wLT5tYV91c2VkID4gbl91c2VkICYmIG1wLT5tYV9maWxsKjMgPj0gKG1wLT5tYV9tYXNrKzEpKjIpKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gZGljdHJlc2l6ZShtcCwgKG1wLT5tYV91c2VkID4gNTAwMDAgPyAyIDogNCkgKiBtcC0+bWFfdXNlZCk7CiB9CiAKIGludAogUHlEaWN0X0RlbEl0ZW0oUHlPYmplY3QgKm9wLCBQeU9iamVjdCAqa2V5KQogewotCXJlZ2lzdGVyIFB5RGljdE9iamVjdCAqbXA7Ci0JcmVnaXN0ZXIgbG9uZyBoYXNoOwotCXJlZ2lzdGVyIFB5RGljdEVudHJ5ICplcDsKLQlQeU9iamVjdCAqb2xkX3ZhbHVlLCAqb2xkX2tleTsKKyAgICByZWdpc3RlciBQeURpY3RPYmplY3QgKm1wOworICAgIHJlZ2lzdGVyIGxvbmcgaGFzaDsKKyAgICByZWdpc3RlciBQeURpY3RFbnRyeSAqZXA7CisgICAgUHlPYmplY3QgKm9sZF92YWx1ZSwgKm9sZF9rZXk7CiAKLQlpZiAoIVB5RGljdF9DaGVjayhvcCkpIHsKLQkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JYXNzZXJ0KGtleSk7Ci0JaWYgKCFQeVN0cmluZ19DaGVja0V4YWN0KGtleSkgfHwKLQkgICAgKGhhc2ggPSAoKFB5U3RyaW5nT2JqZWN0ICopIGtleSktPm9iX3NoYXNoKSA9PSAtMSkgewotCQloYXNoID0gUHlPYmplY3RfSGFzaChrZXkpOwotCQlpZiAoaGFzaCA9PSAtMSkKLQkJCXJldHVybiAtMTsKLQl9Ci0JbXAgPSAoUHlEaWN0T2JqZWN0ICopb3A7Ci0JZXAgPSAobXAtPm1hX2xvb2t1cCkobXAsIGtleSwgaGFzaCk7Ci0JaWYgKGVwID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQlpZiAoZXAtPm1lX3ZhbHVlID09IE5VTEwpIHsKLQkJc2V0X2tleV9lcnJvcihrZXkpOwotCQlyZXR1cm4gLTE7Ci0JfQotCW9sZF9rZXkgPSBlcC0+bWVfa2V5OwotCVB5X0lOQ1JFRihkdW1teSk7Ci0JZXAtPm1lX2tleSA9IGR1bW15OwotCW9sZF92YWx1ZSA9IGVwLT5tZV92YWx1ZTsKLQllcC0+bWVfdmFsdWUgPSBOVUxMOwotCW1wLT5tYV91c2VkLS07Ci0JUHlfREVDUkVGKG9sZF92YWx1ZSk7Ci0JUHlfREVDUkVGKG9sZF9rZXkpOwotCXJldHVybiAwOworICAgIGlmICghUHlEaWN0X0NoZWNrKG9wKSkgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBhc3NlcnQoa2V5KTsKKyAgICBpZiAoIVB5U3RyaW5nX0NoZWNrRXhhY3Qoa2V5KSB8fAorICAgICAgICAoaGFzaCA9ICgoUHlTdHJpbmdPYmplY3QgKikga2V5KS0+b2Jfc2hhc2gpID09IC0xKSB7CisgICAgICAgIGhhc2ggPSBQeU9iamVjdF9IYXNoKGtleSk7CisgICAgICAgIGlmIChoYXNoID09IC0xKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBtcCA9IChQeURpY3RPYmplY3QgKilvcDsKKyAgICBlcCA9IChtcC0+bWFfbG9va3VwKShtcCwga2V5LCBoYXNoKTsKKyAgICBpZiAoZXAgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmIChlcC0+bWVfdmFsdWUgPT0gTlVMTCkgeworICAgICAgICBzZXRfa2V5X2Vycm9yKGtleSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgb2xkX2tleSA9IGVwLT5tZV9rZXk7CisgICAgUHlfSU5DUkVGKGR1bW15KTsKKyAgICBlcC0+bWVfa2V5ID0gZHVtbXk7CisgICAgb2xkX3ZhbHVlID0gZXAtPm1lX3ZhbHVlOworICAgIGVwLT5tZV92YWx1ZSA9IE5VTEw7CisgICAgbXAtPm1hX3VzZWQtLTsKKyAgICBQeV9ERUNSRUYob2xkX3ZhbHVlKTsKKyAgICBQeV9ERUNSRUYob2xkX2tleSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHZvaWQKIFB5RGljdF9DbGVhcihQeU9iamVjdCAqb3ApCiB7Ci0JUHlEaWN0T2JqZWN0ICptcDsKLQlQeURpY3RFbnRyeSAqZXAsICp0YWJsZTsKLQlpbnQgdGFibGVfaXNfbWFsbG9jZWQ7Ci0JUHlfc3NpemVfdCBmaWxsOwotCVB5RGljdEVudHJ5IHNtYWxsX2NvcHlbUHlEaWN0X01JTlNJWkVdOworICAgIFB5RGljdE9iamVjdCAqbXA7CisgICAgUHlEaWN0RW50cnkgKmVwLCAqdGFibGU7CisgICAgaW50IHRhYmxlX2lzX21hbGxvY2VkOworICAgIFB5X3NzaXplX3QgZmlsbDsKKyAgICBQeURpY3RFbnRyeSBzbWFsbF9jb3B5W1B5RGljdF9NSU5TSVpFXTsKICNpZmRlZiBQeV9ERUJVRwotCVB5X3NzaXplX3QgaSwgbjsKKyAgICBQeV9zc2l6ZV90IGksIG47CiAjZW5kaWYKIAotCWlmICghUHlEaWN0X0NoZWNrKG9wKSkKLQkJcmV0dXJuOwotCW1wID0gKFB5RGljdE9iamVjdCAqKW9wOworICAgIGlmICghUHlEaWN0X0NoZWNrKG9wKSkKKyAgICAgICAgcmV0dXJuOworICAgIG1wID0gKFB5RGljdE9iamVjdCAqKW9wOwogI2lmZGVmIFB5X0RFQlVHCi0JbiA9IG1wLT5tYV9tYXNrICsgMTsKLQlpID0gMDsKKyAgICBuID0gbXAtPm1hX21hc2sgKyAxOworICAgIGkgPSAwOwogI2VuZGlmCiAKLQl0YWJsZSA9IG1wLT5tYV90YWJsZTsKLQlhc3NlcnQodGFibGUgIT0gTlVMTCk7Ci0JdGFibGVfaXNfbWFsbG9jZWQgPSB0YWJsZSAhPSBtcC0+bWFfc21hbGx0YWJsZTsKKyAgICB0YWJsZSA9IG1wLT5tYV90YWJsZTsKKyAgICBhc3NlcnQodGFibGUgIT0gTlVMTCk7CisgICAgdGFibGVfaXNfbWFsbG9jZWQgPSB0YWJsZSAhPSBtcC0+bWFfc21hbGx0YWJsZTsKIAotCS8qIFRoaXMgaXMgZGVsaWNhdGUuICBEdXJpbmcgdGhlIHByb2Nlc3Mgb2YgY2xlYXJpbmcgdGhlIGRpY3QsCi0JICogZGVjcmVmcyBjYW4gY2F1c2UgdGhlIGRpY3QgdG8gbXV0YXRlLiAgVG8gYXZvaWQgZmF0YWwgY29uZnVzaW9uCi0JICogKHZvaWNlIG9mIGV4cGVyaWVuY2UpLCB3ZSBoYXZlIHRvIG1ha2UgdGhlIGRpY3QgZW1wdHkgYmVmb3JlCi0JICogY2xlYXJpbmcgdGhlIHNsb3RzLCBhbmQgbmV2ZXIgcmVmZXIgdG8gYW55dGhpbmcgdmlhIG1wLT54eHggd2hpbGUKLQkgKiBjbGVhcmluZy4KLQkgKi8KLQlmaWxsID0gbXAtPm1hX2ZpbGw7Ci0JaWYgKHRhYmxlX2lzX21hbGxvY2VkKQotCQlFTVBUWV9UT19NSU5TSVpFKG1wKTsKKyAgICAvKiBUaGlzIGlzIGRlbGljYXRlLiAgRHVyaW5nIHRoZSBwcm9jZXNzIG9mIGNsZWFyaW5nIHRoZSBkaWN0LAorICAgICAqIGRlY3JlZnMgY2FuIGNhdXNlIHRoZSBkaWN0IHRvIG11dGF0ZS4gIFRvIGF2b2lkIGZhdGFsIGNvbmZ1c2lvbgorICAgICAqICh2b2ljZSBvZiBleHBlcmllbmNlKSwgd2UgaGF2ZSB0byBtYWtlIHRoZSBkaWN0IGVtcHR5IGJlZm9yZQorICAgICAqIGNsZWFyaW5nIHRoZSBzbG90cywgYW5kIG5ldmVyIHJlZmVyIHRvIGFueXRoaW5nIHZpYSBtcC0+eHh4IHdoaWxlCisgICAgICogY2xlYXJpbmcuCisgICAgICovCisgICAgZmlsbCA9IG1wLT5tYV9maWxsOworICAgIGlmICh0YWJsZV9pc19tYWxsb2NlZCkKKyAgICAgICAgRU1QVFlfVE9fTUlOU0laRShtcCk7CiAKLQllbHNlIGlmIChmaWxsID4gMCkgewotCQkvKiBJdCdzIGEgc21hbGwgdGFibGUgd2l0aCBzb21ldGhpbmcgdGhhdCBuZWVkcyB0byBiZSBjbGVhcmVkLgotCQkgKiBBZnJhaWQgdGhlIG9ubHkgc2FmZSB3YXkgaXMgdG8gY29weSB0aGUgZGljdCBlbnRyaWVzIGludG8KLQkJICogYW5vdGhlciBzbWFsbCB0YWJsZSBmaXJzdC4KLQkJICovCi0JCW1lbWNweShzbWFsbF9jb3B5LCB0YWJsZSwgc2l6ZW9mKHNtYWxsX2NvcHkpKTsKLQkJdGFibGUgPSBzbWFsbF9jb3B5OwotCQlFTVBUWV9UT19NSU5TSVpFKG1wKTsKLQl9Ci0JLyogZWxzZSBpdCdzIGEgc21hbGwgdGFibGUgdGhhdCdzIGFscmVhZHkgZW1wdHkgKi8KKyAgICBlbHNlIGlmIChmaWxsID4gMCkgeworICAgICAgICAvKiBJdCdzIGEgc21hbGwgdGFibGUgd2l0aCBzb21ldGhpbmcgdGhhdCBuZWVkcyB0byBiZSBjbGVhcmVkLgorICAgICAgICAgKiBBZnJhaWQgdGhlIG9ubHkgc2FmZSB3YXkgaXMgdG8gY29weSB0aGUgZGljdCBlbnRyaWVzIGludG8KKyAgICAgICAgICogYW5vdGhlciBzbWFsbCB0YWJsZSBmaXJzdC4KKyAgICAgICAgICovCisgICAgICAgIG1lbWNweShzbWFsbF9jb3B5LCB0YWJsZSwgc2l6ZW9mKHNtYWxsX2NvcHkpKTsKKyAgICAgICAgdGFibGUgPSBzbWFsbF9jb3B5OworICAgICAgICBFTVBUWV9UT19NSU5TSVpFKG1wKTsKKyAgICB9CisgICAgLyogZWxzZSBpdCdzIGEgc21hbGwgdGFibGUgdGhhdCdzIGFscmVhZHkgZW1wdHkgKi8KIAotCS8qIE5vdyB3ZSBjYW4gZmluYWxseSBjbGVhciB0aGluZ3MuICBJZiBDIGhhZCByZWZjb3VudHMsIHdlIGNvdWxkCi0JICogYXNzZXJ0IHRoYXQgdGhlIHJlZmNvdW50IG9uIHRhYmxlIGlzIDEgbm93LCBpLmUuIHRoYXQgdGhpcyBmdW5jdGlvbgotCSAqIGhhcyB1bmlxdWUgYWNjZXNzIHRvIGl0LCBzbyBkZWNyZWYgc2lkZS1lZmZlY3RzIGNhbid0IGFsdGVyIGl0LgotCSAqLwotCWZvciAoZXAgPSB0YWJsZTsgZmlsbCA+IDA7ICsrZXApIHsKKyAgICAvKiBOb3cgd2UgY2FuIGZpbmFsbHkgY2xlYXIgdGhpbmdzLiAgSWYgQyBoYWQgcmVmY291bnRzLCB3ZSBjb3VsZAorICAgICAqIGFzc2VydCB0aGF0IHRoZSByZWZjb3VudCBvbiB0YWJsZSBpcyAxIG5vdywgaS5lLiB0aGF0IHRoaXMgZnVuY3Rpb24KKyAgICAgKiBoYXMgdW5pcXVlIGFjY2VzcyB0byBpdCwgc28gZGVjcmVmIHNpZGUtZWZmZWN0cyBjYW4ndCBhbHRlciBpdC4KKyAgICAgKi8KKyAgICBmb3IgKGVwID0gdGFibGU7IGZpbGwgPiAwOyArK2VwKSB7CiAjaWZkZWYgUHlfREVCVUcKLQkJYXNzZXJ0KGkgPCBuKTsKLQkJKytpOworICAgICAgICBhc3NlcnQoaSA8IG4pOworICAgICAgICArK2k7CiAjZW5kaWYKLQkJaWYgKGVwLT5tZV9rZXkpIHsKLQkJCS0tZmlsbDsKLQkJCVB5X0RFQ1JFRihlcC0+bWVfa2V5KTsKLQkJCVB5X1hERUNSRUYoZXAtPm1lX3ZhbHVlKTsKLQkJfQorICAgICAgICBpZiAoZXAtPm1lX2tleSkgeworICAgICAgICAgICAgLS1maWxsOworICAgICAgICAgICAgUHlfREVDUkVGKGVwLT5tZV9rZXkpOworICAgICAgICAgICAgUHlfWERFQ1JFRihlcC0+bWVfdmFsdWUpOworICAgICAgICB9CiAjaWZkZWYgUHlfREVCVUcKLQkJZWxzZQotCQkJYXNzZXJ0KGVwLT5tZV92YWx1ZSA9PSBOVUxMKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYXNzZXJ0KGVwLT5tZV92YWx1ZSA9PSBOVUxMKTsKICNlbmRpZgotCX0KKyAgICB9CiAKLQlpZiAodGFibGVfaXNfbWFsbG9jZWQpCi0JCVB5TWVtX0RFTCh0YWJsZSk7CisgICAgaWYgKHRhYmxlX2lzX21hbGxvY2VkKQorICAgICAgICBQeU1lbV9ERUwodGFibGUpOwogfQogCiAvKgpAQCAtODQ0LDU1ICs4NDQsNTUgQEAKIGludAogUHlEaWN0X05leHQoUHlPYmplY3QgKm9wLCBQeV9zc2l6ZV90ICpwcG9zLCBQeU9iamVjdCAqKnBrZXksIFB5T2JqZWN0ICoqcHZhbHVlKQogewotCXJlZ2lzdGVyIFB5X3NzaXplX3QgaTsKLQlyZWdpc3RlciBQeV9zc2l6ZV90IG1hc2s7Ci0JcmVnaXN0ZXIgUHlEaWN0RW50cnkgKmVwOworICAgIHJlZ2lzdGVyIFB5X3NzaXplX3QgaTsKKyAgICByZWdpc3RlciBQeV9zc2l6ZV90IG1hc2s7CisgICAgcmVnaXN0ZXIgUHlEaWN0RW50cnkgKmVwOwogCi0JaWYgKCFQeURpY3RfQ2hlY2sob3ApKQotCQlyZXR1cm4gMDsKLQlpID0gKnBwb3M7Ci0JaWYgKGkgPCAwKQotCQlyZXR1cm4gMDsKLQllcCA9ICgoUHlEaWN0T2JqZWN0ICopb3ApLT5tYV90YWJsZTsKLQltYXNrID0gKChQeURpY3RPYmplY3QgKilvcCktPm1hX21hc2s7Ci0Jd2hpbGUgKGkgPD0gbWFzayAmJiBlcFtpXS5tZV92YWx1ZSA9PSBOVUxMKQotCQlpKys7Ci0JKnBwb3MgPSBpKzE7Ci0JaWYgKGkgPiBtYXNrKQotCQlyZXR1cm4gMDsKLQlpZiAocGtleSkKLQkJKnBrZXkgPSBlcFtpXS5tZV9rZXk7Ci0JaWYgKHB2YWx1ZSkKLQkJKnB2YWx1ZSA9IGVwW2ldLm1lX3ZhbHVlOwotCXJldHVybiAxOworICAgIGlmICghUHlEaWN0X0NoZWNrKG9wKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaSA9ICpwcG9zOworICAgIGlmIChpIDwgMCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgZXAgPSAoKFB5RGljdE9iamVjdCAqKW9wKS0+bWFfdGFibGU7CisgICAgbWFzayA9ICgoUHlEaWN0T2JqZWN0ICopb3ApLT5tYV9tYXNrOworICAgIHdoaWxlIChpIDw9IG1hc2sgJiYgZXBbaV0ubWVfdmFsdWUgPT0gTlVMTCkKKyAgICAgICAgaSsrOworICAgICpwcG9zID0gaSsxOworICAgIGlmIChpID4gbWFzaykKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKHBrZXkpCisgICAgICAgICpwa2V5ID0gZXBbaV0ubWVfa2V5OworICAgIGlmIChwdmFsdWUpCisgICAgICAgICpwdmFsdWUgPSBlcFtpXS5tZV92YWx1ZTsKKyAgICByZXR1cm4gMTsKIH0KIAogLyogSW50ZXJuYWwgdmVyc2lvbiBvZiBQeURpY3RfTmV4dCB0aGF0IHJldHVybnMgYSBoYXNoIHZhbHVlIGluIGFkZGl0aW9uIHRvIHRoZSBrZXkgYW5kIHZhbHVlLiovCiBpbnQKIF9QeURpY3RfTmV4dChQeU9iamVjdCAqb3AsIFB5X3NzaXplX3QgKnBwb3MsIFB5T2JqZWN0ICoqcGtleSwgUHlPYmplY3QgKipwdmFsdWUsIGxvbmcgKnBoYXNoKQogewotCXJlZ2lzdGVyIFB5X3NzaXplX3QgaTsKLQlyZWdpc3RlciBQeV9zc2l6ZV90IG1hc2s7Ci0JcmVnaXN0ZXIgUHlEaWN0RW50cnkgKmVwOworICAgIHJlZ2lzdGVyIFB5X3NzaXplX3QgaTsKKyAgICByZWdpc3RlciBQeV9zc2l6ZV90IG1hc2s7CisgICAgcmVnaXN0ZXIgUHlEaWN0RW50cnkgKmVwOwogCi0JaWYgKCFQeURpY3RfQ2hlY2sob3ApKQotCQlyZXR1cm4gMDsKLQlpID0gKnBwb3M7Ci0JaWYgKGkgPCAwKQotCQlyZXR1cm4gMDsKLQllcCA9ICgoUHlEaWN0T2JqZWN0ICopb3ApLT5tYV90YWJsZTsKLQltYXNrID0gKChQeURpY3RPYmplY3QgKilvcCktPm1hX21hc2s7Ci0Jd2hpbGUgKGkgPD0gbWFzayAmJiBlcFtpXS5tZV92YWx1ZSA9PSBOVUxMKQotCQlpKys7Ci0JKnBwb3MgPSBpKzE7Ci0JaWYgKGkgPiBtYXNrKQotCQlyZXR1cm4gMDsKLSAgICAgICAgKnBoYXNoID0gKGxvbmcpKGVwW2ldLm1lX2hhc2gpOwotCWlmIChwa2V5KQotCQkqcGtleSA9IGVwW2ldLm1lX2tleTsKLQlpZiAocHZhbHVlKQotCQkqcHZhbHVlID0gZXBbaV0ubWVfdmFsdWU7Ci0JcmV0dXJuIDE7CisgICAgaWYgKCFQeURpY3RfQ2hlY2sob3ApKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpID0gKnBwb3M7CisgICAgaWYgKGkgPCAwKQorICAgICAgICByZXR1cm4gMDsKKyAgICBlcCA9ICgoUHlEaWN0T2JqZWN0ICopb3ApLT5tYV90YWJsZTsKKyAgICBtYXNrID0gKChQeURpY3RPYmplY3QgKilvcCktPm1hX21hc2s7CisgICAgd2hpbGUgKGkgPD0gbWFzayAmJiBlcFtpXS5tZV92YWx1ZSA9PSBOVUxMKQorICAgICAgICBpKys7CisgICAgKnBwb3MgPSBpKzE7CisgICAgaWYgKGkgPiBtYXNrKQorICAgICAgICByZXR1cm4gMDsKKyAgICAqcGhhc2ggPSAobG9uZykoZXBbaV0ubWVfaGFzaCk7CisgICAgaWYgKHBrZXkpCisgICAgICAgICpwa2V5ID0gZXBbaV0ubWVfa2V5OworICAgIGlmIChwdmFsdWUpCisgICAgICAgICpwdmFsdWUgPSBlcFtpXS5tZV92YWx1ZTsKKyAgICByZXR1cm4gMTsKIH0KIAogLyogTWV0aG9kcyAqLwpAQCAtOTAwLDQ1MiArOTAwLDQ1MiBAQAogc3RhdGljIHZvaWQKIGRpY3RfZGVhbGxvYyhyZWdpc3RlciBQeURpY3RPYmplY3QgKm1wKQogewotCXJlZ2lzdGVyIFB5RGljdEVudHJ5ICplcDsKLQlQeV9zc2l6ZV90IGZpbGwgPSBtcC0+bWFfZmlsbDsKLSAJUHlPYmplY3RfR0NfVW5UcmFjayhtcCk7Ci0JUHlfVFJBU0hDQU5fU0FGRV9CRUdJTihtcCkKLQlmb3IgKGVwID0gbXAtPm1hX3RhYmxlOyBmaWxsID4gMDsgZXArKykgewotCQlpZiAoZXAtPm1lX2tleSkgewotCQkJLS1maWxsOwotCQkJUHlfREVDUkVGKGVwLT5tZV9rZXkpOwotCQkJUHlfWERFQ1JFRihlcC0+bWVfdmFsdWUpOwotCQl9Ci0JfQotCWlmIChtcC0+bWFfdGFibGUgIT0gbXAtPm1hX3NtYWxsdGFibGUpCi0JCVB5TWVtX0RFTChtcC0+bWFfdGFibGUpOwotCWlmIChudW1mcmVlIDwgUHlEaWN0X01BWEZSRUVMSVNUICYmIFB5X1RZUEUobXApID09ICZQeURpY3RfVHlwZSkKLQkJZnJlZV9saXN0W251bWZyZWUrK10gPSBtcDsKLQllbHNlCi0JCVB5X1RZUEUobXApLT50cF9mcmVlKChQeU9iamVjdCAqKW1wKTsKLQlQeV9UUkFTSENBTl9TQUZFX0VORChtcCkKKyAgICByZWdpc3RlciBQeURpY3RFbnRyeSAqZXA7CisgICAgUHlfc3NpemVfdCBmaWxsID0gbXAtPm1hX2ZpbGw7CisgICAgUHlPYmplY3RfR0NfVW5UcmFjayhtcCk7CisgICAgUHlfVFJBU0hDQU5fU0FGRV9CRUdJTihtcCkKKyAgICBmb3IgKGVwID0gbXAtPm1hX3RhYmxlOyBmaWxsID4gMDsgZXArKykgeworICAgICAgICBpZiAoZXAtPm1lX2tleSkgeworICAgICAgICAgICAgLS1maWxsOworICAgICAgICAgICAgUHlfREVDUkVGKGVwLT5tZV9rZXkpOworICAgICAgICAgICAgUHlfWERFQ1JFRihlcC0+bWVfdmFsdWUpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChtcC0+bWFfdGFibGUgIT0gbXAtPm1hX3NtYWxsdGFibGUpCisgICAgICAgIFB5TWVtX0RFTChtcC0+bWFfdGFibGUpOworICAgIGlmIChudW1mcmVlIDwgUHlEaWN0X01BWEZSRUVMSVNUICYmIFB5X1RZUEUobXApID09ICZQeURpY3RfVHlwZSkKKyAgICAgICAgZnJlZV9saXN0W251bWZyZWUrK10gPSBtcDsKKyAgICBlbHNlCisgICAgICAgIFB5X1RZUEUobXApLT50cF9mcmVlKChQeU9iamVjdCAqKW1wKTsKKyAgICBQeV9UUkFTSENBTl9TQUZFX0VORChtcCkKIH0KIAogc3RhdGljIGludAogZGljdF9wcmludChyZWdpc3RlciBQeURpY3RPYmplY3QgKm1wLCByZWdpc3RlciBGSUxFICpmcCwgcmVnaXN0ZXIgaW50IGZsYWdzKQogewotCXJlZ2lzdGVyIFB5X3NzaXplX3QgaTsKLQlyZWdpc3RlciBQeV9zc2l6ZV90IGFueTsKLQlpbnQgc3RhdHVzOworICAgIHJlZ2lzdGVyIFB5X3NzaXplX3QgaTsKKyAgICByZWdpc3RlciBQeV9zc2l6ZV90IGFueTsKKyAgICBpbnQgc3RhdHVzOwogCi0Jc3RhdHVzID0gUHlfUmVwckVudGVyKChQeU9iamVjdCopbXApOwotCWlmIChzdGF0dXMgIT0gMCkgewotCQlpZiAoc3RhdHVzIDwgMCkKLQkJCXJldHVybiBzdGF0dXM7Ci0JCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQkJZnByaW50ZihmcCwgInsuLi59Iik7Ci0JCVB5X0VORF9BTExPV19USFJFQURTCi0JCXJldHVybiAwOwotCX0KKyAgICBzdGF0dXMgPSBQeV9SZXByRW50ZXIoKFB5T2JqZWN0KiltcCk7CisgICAgaWYgKHN0YXR1cyAhPSAwKSB7CisgICAgICAgIGlmIChzdGF0dXMgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICBmcHJpbnRmKGZwLCAiey4uLn0iKTsKKyAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCi0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCWZwcmludGYoZnAsICJ7Iik7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQlhbnkgPSAwOwotCWZvciAoaSA9IDA7IGkgPD0gbXAtPm1hX21hc2s7IGkrKykgewotCQlQeURpY3RFbnRyeSAqZXAgPSBtcC0+bWFfdGFibGUgKyBpOwotCQlQeU9iamVjdCAqcHZhbHVlID0gZXAtPm1lX3ZhbHVlOwotCQlpZiAocHZhbHVlICE9IE5VTEwpIHsKLQkJCS8qIFByZXZlbnQgUHlPYmplY3RfUmVwciBmcm9tIGRlbGV0aW5nIHZhbHVlIGR1cmluZwotCQkJICAga2V5IGZvcm1hdCAqLwotCQkJUHlfSU5DUkVGKHB2YWx1ZSk7Ci0JCQlpZiAoYW55KysgPiAwKSB7Ci0JCQkJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCQkJCWZwcmludGYoZnAsICIsICIpOwotCQkJCVB5X0VORF9BTExPV19USFJFQURTCi0JCQl9Ci0JCQlpZiAoUHlPYmplY3RfUHJpbnQoKFB5T2JqZWN0ICopZXAtPm1lX2tleSwgZnAsIDApIT0wKSB7Ci0JCQkJUHlfREVDUkVGKHB2YWx1ZSk7Ci0JCQkJUHlfUmVwckxlYXZlKChQeU9iamVjdCopbXApOwotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQkJCWZwcmludGYoZnAsICI6ICIpOwotCQkJUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQkJCWlmIChQeU9iamVjdF9QcmludChwdmFsdWUsIGZwLCAwKSAhPSAwKSB7Ci0JCQkJUHlfREVDUkVGKHB2YWx1ZSk7Ci0JCQkJUHlfUmVwckxlYXZlKChQeU9iamVjdCopbXApOwotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJCVB5X0RFQ1JFRihwdmFsdWUpOwotCQl9Ci0JfQotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlmcHJpbnRmKGZwLCAifSIpOwotCVB5X0VORF9BTExPV19USFJFQURTCi0JUHlfUmVwckxlYXZlKChQeU9iamVjdCopbXApOwotCXJldHVybiAwOworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICBmcHJpbnRmKGZwLCAieyIpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgYW55ID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDw9IG1wLT5tYV9tYXNrOyBpKyspIHsKKyAgICAgICAgUHlEaWN0RW50cnkgKmVwID0gbXAtPm1hX3RhYmxlICsgaTsKKyAgICAgICAgUHlPYmplY3QgKnB2YWx1ZSA9IGVwLT5tZV92YWx1ZTsKKyAgICAgICAgaWYgKHB2YWx1ZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAvKiBQcmV2ZW50IFB5T2JqZWN0X1JlcHIgZnJvbSBkZWxldGluZyB2YWx1ZSBkdXJpbmcKKyAgICAgICAgICAgICAgIGtleSBmb3JtYXQgKi8KKyAgICAgICAgICAgIFB5X0lOQ1JFRihwdmFsdWUpOworICAgICAgICAgICAgaWYgKGFueSsrID4gMCkgeworICAgICAgICAgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgICAgICAgICBmcHJpbnRmKGZwLCAiLCAiKTsKKyAgICAgICAgICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKFB5T2JqZWN0X1ByaW50KChQeU9iamVjdCAqKWVwLT5tZV9rZXksIGZwLCAwKSE9MCkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihwdmFsdWUpOworICAgICAgICAgICAgICAgIFB5X1JlcHJMZWF2ZSgoUHlPYmplY3QqKW1wKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgICAgICAgICBmcHJpbnRmKGZwLCAiOiAiKTsKKyAgICAgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgICAgICAgICBpZiAoUHlPYmplY3RfUHJpbnQocHZhbHVlLCBmcCwgMCkgIT0gMCkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihwdmFsdWUpOworICAgICAgICAgICAgICAgIFB5X1JlcHJMZWF2ZSgoUHlPYmplY3QqKW1wKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQeV9ERUNSRUYocHZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgZnByaW50ZihmcCwgIn0iKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIFB5X1JlcHJMZWF2ZSgoUHlPYmplY3QqKW1wKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRpY3RfcmVwcihQeURpY3RPYmplY3QgKm1wKQogewotCVB5X3NzaXplX3QgaTsKLQlQeU9iamVjdCAqcywgKnRlbXAsICpjb2xvbiA9IE5VTEw7Ci0JUHlPYmplY3QgKnBpZWNlcyA9IE5VTEwsICpyZXN1bHQgPSBOVUxMOwotCVB5T2JqZWN0ICprZXksICp2YWx1ZTsKKyAgICBQeV9zc2l6ZV90IGk7CisgICAgUHlPYmplY3QgKnMsICp0ZW1wLCAqY29sb24gPSBOVUxMOworICAgIFB5T2JqZWN0ICpwaWVjZXMgPSBOVUxMLCAqcmVzdWx0ID0gTlVMTDsKKyAgICBQeU9iamVjdCAqa2V5LCAqdmFsdWU7CiAKLQlpID0gUHlfUmVwckVudGVyKChQeU9iamVjdCAqKW1wKTsKLQlpZiAoaSAhPSAwKSB7Ci0JCXJldHVybiBpID4gMCA/IFB5U3RyaW5nX0Zyb21TdHJpbmcoInsuLi59IikgOiBOVUxMOwotCX0KKyAgICBpID0gUHlfUmVwckVudGVyKChQeU9iamVjdCAqKW1wKTsKKyAgICBpZiAoaSAhPSAwKSB7CisgICAgICAgIHJldHVybiBpID4gMCA/IFB5U3RyaW5nX0Zyb21TdHJpbmcoInsuLi59IikgOiBOVUxMOworICAgIH0KIAotCWlmIChtcC0+bWFfdXNlZCA9PSAwKSB7Ci0JCXJlc3VsdCA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoInt9Iik7Ci0JCWdvdG8gRG9uZTsKLQl9CisgICAgaWYgKG1wLT5tYV91c2VkID09IDApIHsKKyAgICAgICAgcmVzdWx0ID0gUHlTdHJpbmdfRnJvbVN0cmluZygie30iKTsKKyAgICAgICAgZ290byBEb25lOworICAgIH0KIAotCXBpZWNlcyA9IFB5TGlzdF9OZXcoMCk7Ci0JaWYgKHBpZWNlcyA9PSBOVUxMKQotCQlnb3RvIERvbmU7CisgICAgcGllY2VzID0gUHlMaXN0X05ldygwKTsKKyAgICBpZiAocGllY2VzID09IE5VTEwpCisgICAgICAgIGdvdG8gRG9uZTsKIAotCWNvbG9uID0gUHlTdHJpbmdfRnJvbVN0cmluZygiOiAiKTsKLQlpZiAoY29sb24gPT0gTlVMTCkKLQkJZ290byBEb25lOworICAgIGNvbG9uID0gUHlTdHJpbmdfRnJvbVN0cmluZygiOiAiKTsKKyAgICBpZiAoY29sb24gPT0gTlVMTCkKKyAgICAgICAgZ290byBEb25lOwogCi0JLyogRG8gcmVwcigpIG9uIGVhY2gga2V5K3ZhbHVlIHBhaXIsIGFuZCBpbnNlcnQgIjogIiBiZXR3ZWVuIHRoZW0uCi0JICAgTm90ZSB0aGF0IHJlcHIgbWF5IG11dGF0ZSB0aGUgZGljdC4gKi8KLQlpID0gMDsKLQl3aGlsZSAoUHlEaWN0X05leHQoKFB5T2JqZWN0ICopbXAsICZpLCAma2V5LCAmdmFsdWUpKSB7Ci0JCWludCBzdGF0dXM7Ci0JCS8qIFByZXZlbnQgcmVwciBmcm9tIGRlbGV0aW5nIHZhbHVlIGR1cmluZyBrZXkgZm9ybWF0LiAqLwotCQlQeV9JTkNSRUYodmFsdWUpOwotCQlzID0gUHlPYmplY3RfUmVwcihrZXkpOwotCQlQeVN0cmluZ19Db25jYXQoJnMsIGNvbG9uKTsKLQkJUHlTdHJpbmdfQ29uY2F0QW5kRGVsKCZzLCBQeU9iamVjdF9SZXByKHZhbHVlKSk7Ci0JCVB5X0RFQ1JFRih2YWx1ZSk7Ci0JCWlmIChzID09IE5VTEwpCi0JCQlnb3RvIERvbmU7Ci0JCXN0YXR1cyA9IFB5TGlzdF9BcHBlbmQocGllY2VzLCBzKTsKLQkJUHlfREVDUkVGKHMpOyAgLyogYXBwZW5kIGNyZWF0ZWQgYSBuZXcgcmVmICovCi0JCWlmIChzdGF0dXMgPCAwKQotCQkJZ290byBEb25lOwotCX0KKyAgICAvKiBEbyByZXByKCkgb24gZWFjaCBrZXkrdmFsdWUgcGFpciwgYW5kIGluc2VydCAiOiAiIGJldHdlZW4gdGhlbS4KKyAgICAgICBOb3RlIHRoYXQgcmVwciBtYXkgbXV0YXRlIHRoZSBkaWN0LiAqLworICAgIGkgPSAwOworICAgIHdoaWxlIChQeURpY3RfTmV4dCgoUHlPYmplY3QgKiltcCwgJmksICZrZXksICZ2YWx1ZSkpIHsKKyAgICAgICAgaW50IHN0YXR1czsKKyAgICAgICAgLyogUHJldmVudCByZXByIGZyb20gZGVsZXRpbmcgdmFsdWUgZHVyaW5nIGtleSBmb3JtYXQuICovCisgICAgICAgIFB5X0lOQ1JFRih2YWx1ZSk7CisgICAgICAgIHMgPSBQeU9iamVjdF9SZXByKGtleSk7CisgICAgICAgIFB5U3RyaW5nX0NvbmNhdCgmcywgY29sb24pOworICAgICAgICBQeVN0cmluZ19Db25jYXRBbmREZWwoJnMsIFB5T2JqZWN0X1JlcHIodmFsdWUpKTsKKyAgICAgICAgUHlfREVDUkVGKHZhbHVlKTsKKyAgICAgICAgaWYgKHMgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gRG9uZTsKKyAgICAgICAgc3RhdHVzID0gUHlMaXN0X0FwcGVuZChwaWVjZXMsIHMpOworICAgICAgICBQeV9ERUNSRUYocyk7ICAvKiBhcHBlbmQgY3JlYXRlZCBhIG5ldyByZWYgKi8KKyAgICAgICAgaWYgKHN0YXR1cyA8IDApCisgICAgICAgICAgICBnb3RvIERvbmU7CisgICAgfQogCi0JLyogQWRkICJ7fSIgZGVjb3JhdGlvbnMgdG8gdGhlIGZpcnN0IGFuZCBsYXN0IGl0ZW1zLiAqLwotCWFzc2VydChQeUxpc3RfR0VUX1NJWkUocGllY2VzKSA+IDApOwotCXMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCJ7Iik7Ci0JaWYgKHMgPT0gTlVMTCkKLQkJZ290byBEb25lOwotCXRlbXAgPSBQeUxpc3RfR0VUX0lURU0ocGllY2VzLCAwKTsKLQlQeVN0cmluZ19Db25jYXRBbmREZWwoJnMsIHRlbXApOwotCVB5TGlzdF9TRVRfSVRFTShwaWVjZXMsIDAsIHMpOwotCWlmIChzID09IE5VTEwpCi0JCWdvdG8gRG9uZTsKKyAgICAvKiBBZGQgInt9IiBkZWNvcmF0aW9ucyB0byB0aGUgZmlyc3QgYW5kIGxhc3QgaXRlbXMuICovCisgICAgYXNzZXJ0KFB5TGlzdF9HRVRfU0laRShwaWVjZXMpID4gMCk7CisgICAgcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoInsiKTsKKyAgICBpZiAocyA9PSBOVUxMKQorICAgICAgICBnb3RvIERvbmU7CisgICAgdGVtcCA9IFB5TGlzdF9HRVRfSVRFTShwaWVjZXMsIDApOworICAgIFB5U3RyaW5nX0NvbmNhdEFuZERlbCgmcywgdGVtcCk7CisgICAgUHlMaXN0X1NFVF9JVEVNKHBpZWNlcywgMCwgcyk7CisgICAgaWYgKHMgPT0gTlVMTCkKKyAgICAgICAgZ290byBEb25lOwogCi0JcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIn0iKTsKLQlpZiAocyA9PSBOVUxMKQotCQlnb3RvIERvbmU7Ci0JdGVtcCA9IFB5TGlzdF9HRVRfSVRFTShwaWVjZXMsIFB5TGlzdF9HRVRfU0laRShwaWVjZXMpIC0gMSk7Ci0JUHlTdHJpbmdfQ29uY2F0QW5kRGVsKCZ0ZW1wLCBzKTsKLQlQeUxpc3RfU0VUX0lURU0ocGllY2VzLCBQeUxpc3RfR0VUX1NJWkUocGllY2VzKSAtIDEsIHRlbXApOwotCWlmICh0ZW1wID09IE5VTEwpCi0JCWdvdG8gRG9uZTsKKyAgICBzID0gUHlTdHJpbmdfRnJvbVN0cmluZygifSIpOworICAgIGlmIChzID09IE5VTEwpCisgICAgICAgIGdvdG8gRG9uZTsKKyAgICB0ZW1wID0gUHlMaXN0X0dFVF9JVEVNKHBpZWNlcywgUHlMaXN0X0dFVF9TSVpFKHBpZWNlcykgLSAxKTsKKyAgICBQeVN0cmluZ19Db25jYXRBbmREZWwoJnRlbXAsIHMpOworICAgIFB5TGlzdF9TRVRfSVRFTShwaWVjZXMsIFB5TGlzdF9HRVRfU0laRShwaWVjZXMpIC0gMSwgdGVtcCk7CisgICAgaWYgKHRlbXAgPT0gTlVMTCkKKyAgICAgICAgZ290byBEb25lOwogCi0JLyogUGFzdGUgdGhlbSBhbGwgdG9nZXRoZXIgd2l0aCAiLCAiIGJldHdlZW4uICovCi0JcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIiwgIik7Ci0JaWYgKHMgPT0gTlVMTCkKLQkJZ290byBEb25lOwotCXJlc3VsdCA9IF9QeVN0cmluZ19Kb2luKHMsIHBpZWNlcyk7Ci0JUHlfREVDUkVGKHMpOworICAgIC8qIFBhc3RlIHRoZW0gYWxsIHRvZ2V0aGVyIHdpdGggIiwgIiBiZXR3ZWVuLiAqLworICAgIHMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCIsICIpOworICAgIGlmIChzID09IE5VTEwpCisgICAgICAgIGdvdG8gRG9uZTsKKyAgICByZXN1bHQgPSBfUHlTdHJpbmdfSm9pbihzLCBwaWVjZXMpOworICAgIFB5X0RFQ1JFRihzKTsKIAogRG9uZToKLQlQeV9YREVDUkVGKHBpZWNlcyk7Ci0JUHlfWERFQ1JFRihjb2xvbik7Ci0JUHlfUmVwckxlYXZlKChQeU9iamVjdCAqKW1wKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIFB5X1hERUNSRUYocGllY2VzKTsKKyAgICBQeV9YREVDUkVGKGNvbG9uKTsKKyAgICBQeV9SZXByTGVhdmUoKFB5T2JqZWN0ICopbXApOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBQeV9zc2l6ZV90CiBkaWN0X2xlbmd0aChQeURpY3RPYmplY3QgKm1wKQogewotCXJldHVybiBtcC0+bWFfdXNlZDsKKyAgICByZXR1cm4gbXAtPm1hX3VzZWQ7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkaWN0X3N1YnNjcmlwdChQeURpY3RPYmplY3QgKm1wLCByZWdpc3RlciBQeU9iamVjdCAqa2V5KQogewotCVB5T2JqZWN0ICp2OwotCWxvbmcgaGFzaDsKLQlQeURpY3RFbnRyeSAqZXA7Ci0JYXNzZXJ0KG1wLT5tYV90YWJsZSAhPSBOVUxMKTsKLQlpZiAoIVB5U3RyaW5nX0NoZWNrRXhhY3Qoa2V5KSB8fAotCSAgICAoaGFzaCA9ICgoUHlTdHJpbmdPYmplY3QgKikga2V5KS0+b2Jfc2hhc2gpID09IC0xKSB7Ci0JCWhhc2ggPSBQeU9iamVjdF9IYXNoKGtleSk7Ci0JCWlmIChoYXNoID09IC0xKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCWVwID0gKG1wLT5tYV9sb29rdXApKG1wLCBrZXksIGhhc2gpOwotCWlmIChlcCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQl2ID0gZXAtPm1lX3ZhbHVlOwotCWlmICh2ID09IE5VTEwpIHsKLQkJaWYgKCFQeURpY3RfQ2hlY2tFeGFjdChtcCkpIHsKLQkJCS8qIExvb2sgdXAgX19taXNzaW5nX18gbWV0aG9kIGlmIHdlJ3JlIGEgc3ViY2xhc3MuICovCi0JCSAgICAJUHlPYmplY3QgKm1pc3Npbmc7Ci0JCQlzdGF0aWMgUHlPYmplY3QgKm1pc3Npbmdfc3RyID0gTlVMTDsKLQkJCWlmIChtaXNzaW5nX3N0ciA9PSBOVUxMKQotCQkJCW1pc3Npbmdfc3RyID0KLQkJCQkgIFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fbWlzc2luZ19fIik7Ci0JCQltaXNzaW5nID0gX1B5VHlwZV9Mb29rdXAoUHlfVFlQRShtcCksIG1pc3Npbmdfc3RyKTsKLQkJCWlmIChtaXNzaW5nICE9IE5VTEwpCi0JCQkJcmV0dXJuIFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MobWlzc2luZywKLQkJCQkJKFB5T2JqZWN0ICopbXAsIGtleSwgTlVMTCk7Ci0JCX0KLQkJc2V0X2tleV9lcnJvcihrZXkpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZWxzZQotCQlQeV9JTkNSRUYodik7Ci0JcmV0dXJuIHY7CisgICAgUHlPYmplY3QgKnY7CisgICAgbG9uZyBoYXNoOworICAgIFB5RGljdEVudHJ5ICplcDsKKyAgICBhc3NlcnQobXAtPm1hX3RhYmxlICE9IE5VTEwpOworICAgIGlmICghUHlTdHJpbmdfQ2hlY2tFeGFjdChrZXkpIHx8CisgICAgICAgIChoYXNoID0gKChQeVN0cmluZ09iamVjdCAqKSBrZXkpLT5vYl9zaGFzaCkgPT0gLTEpIHsKKyAgICAgICAgaGFzaCA9IFB5T2JqZWN0X0hhc2goa2V5KTsKKyAgICAgICAgaWYgKGhhc2ggPT0gLTEpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZXAgPSAobXAtPm1hX2xvb2t1cCkobXAsIGtleSwgaGFzaCk7CisgICAgaWYgKGVwID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHYgPSBlcC0+bWVfdmFsdWU7CisgICAgaWYgKHYgPT0gTlVMTCkgeworICAgICAgICBpZiAoIVB5RGljdF9DaGVja0V4YWN0KG1wKSkgeworICAgICAgICAgICAgLyogTG9vayB1cCBfX21pc3NpbmdfXyBtZXRob2QgaWYgd2UncmUgYSBzdWJjbGFzcy4gKi8KKyAgICAgICAgICAgIFB5T2JqZWN0ICptaXNzaW5nOworICAgICAgICAgICAgc3RhdGljIFB5T2JqZWN0ICptaXNzaW5nX3N0ciA9IE5VTEw7CisgICAgICAgICAgICBpZiAobWlzc2luZ19zdHIgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBtaXNzaW5nX3N0ciA9CisgICAgICAgICAgICAgICAgICBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX21pc3NpbmdfXyIpOworICAgICAgICAgICAgbWlzc2luZyA9IF9QeVR5cGVfTG9va3VwKFB5X1RZUEUobXApLCBtaXNzaW5nX3N0cik7CisgICAgICAgICAgICBpZiAobWlzc2luZyAhPSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKG1pc3NpbmcsCisgICAgICAgICAgICAgICAgICAgIChQeU9iamVjdCAqKW1wLCBrZXksIE5VTEwpOworICAgICAgICB9CisgICAgICAgIHNldF9rZXlfZXJyb3Ioa2V5KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgUHlfSU5DUkVGKHYpOworICAgIHJldHVybiB2OwogfQogCiBzdGF0aWMgaW50CiBkaWN0X2Fzc19zdWIoUHlEaWN0T2JqZWN0ICptcCwgUHlPYmplY3QgKnYsIFB5T2JqZWN0ICp3KQogewotCWlmICh3ID09IE5VTEwpCi0JCXJldHVybiBQeURpY3RfRGVsSXRlbSgoUHlPYmplY3QgKiltcCwgdik7Ci0JZWxzZQotCQlyZXR1cm4gUHlEaWN0X1NldEl0ZW0oKFB5T2JqZWN0ICopbXAsIHYsIHcpOworICAgIGlmICh3ID09IE5VTEwpCisgICAgICAgIHJldHVybiBQeURpY3RfRGVsSXRlbSgoUHlPYmplY3QgKiltcCwgdik7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gUHlEaWN0X1NldEl0ZW0oKFB5T2JqZWN0ICopbXAsIHYsIHcpOwogfQogCiBzdGF0aWMgUHlNYXBwaW5nTWV0aG9kcyBkaWN0X2FzX21hcHBpbmcgPSB7Ci0JKGxlbmZ1bmMpZGljdF9sZW5ndGgsIC8qbXBfbGVuZ3RoKi8KLQkoYmluYXJ5ZnVuYylkaWN0X3N1YnNjcmlwdCwgLyptcF9zdWJzY3JpcHQqLwotCShvYmpvYmphcmdwcm9jKWRpY3RfYXNzX3N1YiwgLyptcF9hc3Nfc3Vic2NyaXB0Ki8KKyAgICAobGVuZnVuYylkaWN0X2xlbmd0aCwgLyptcF9sZW5ndGgqLworICAgIChiaW5hcnlmdW5jKWRpY3Rfc3Vic2NyaXB0LCAvKm1wX3N1YnNjcmlwdCovCisgICAgKG9iam9iamFyZ3Byb2MpZGljdF9hc3Nfc3ViLCAvKm1wX2Fzc19zdWJzY3JpcHQqLwogfTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIGRpY3Rfa2V5cyhyZWdpc3RlciBQeURpY3RPYmplY3QgKm1wKQogewotCXJlZ2lzdGVyIFB5T2JqZWN0ICp2OwotCXJlZ2lzdGVyIFB5X3NzaXplX3QgaSwgajsKLQlQeURpY3RFbnRyeSAqZXA7Ci0JUHlfc3NpemVfdCBtYXNrLCBuOworICAgIHJlZ2lzdGVyIFB5T2JqZWN0ICp2OworICAgIHJlZ2lzdGVyIFB5X3NzaXplX3QgaSwgajsKKyAgICBQeURpY3RFbnRyeSAqZXA7CisgICAgUHlfc3NpemVfdCBtYXNrLCBuOwogCiAgIGFnYWluOgotCW4gPSBtcC0+bWFfdXNlZDsKLQl2ID0gUHlMaXN0X05ldyhuKTsKLQlpZiAodiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAobiAhPSBtcC0+bWFfdXNlZCkgewotCQkvKiBEdXJuaXQuICBUaGUgYWxsb2NhdGlvbnMgY2F1c2VkIHRoZSBkaWN0IHRvIHJlc2l6ZS4KLQkJICogSnVzdCBzdGFydCBvdmVyLCB0aGlzIHNob3VsZG4ndCBub3JtYWxseSBoYXBwZW4uCi0JCSAqLwotCQlQeV9ERUNSRUYodik7Ci0JCWdvdG8gYWdhaW47Ci0JfQotCWVwID0gbXAtPm1hX3RhYmxlOwotCW1hc2sgPSBtcC0+bWFfbWFzazsKLQlmb3IgKGkgPSAwLCBqID0gMDsgaSA8PSBtYXNrOyBpKyspIHsKLQkJaWYgKGVwW2ldLm1lX3ZhbHVlICE9IE5VTEwpIHsKLQkJCVB5T2JqZWN0ICprZXkgPSBlcFtpXS5tZV9rZXk7Ci0JCQlQeV9JTkNSRUYoa2V5KTsKLQkJCVB5TGlzdF9TRVRfSVRFTSh2LCBqLCBrZXkpOwotCQkJaisrOwotCQl9Ci0JfQotCWFzc2VydChqID09IG4pOwotCXJldHVybiB2OworICAgIG4gPSBtcC0+bWFfdXNlZDsKKyAgICB2ID0gUHlMaXN0X05ldyhuKTsKKyAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAobiAhPSBtcC0+bWFfdXNlZCkgeworICAgICAgICAvKiBEdXJuaXQuICBUaGUgYWxsb2NhdGlvbnMgY2F1c2VkIHRoZSBkaWN0IHRvIHJlc2l6ZS4KKyAgICAgICAgICogSnVzdCBzdGFydCBvdmVyLCB0aGlzIHNob3VsZG4ndCBub3JtYWxseSBoYXBwZW4uCisgICAgICAgICAqLworICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgIGdvdG8gYWdhaW47CisgICAgfQorICAgIGVwID0gbXAtPm1hX3RhYmxlOworICAgIG1hc2sgPSBtcC0+bWFfbWFzazsKKyAgICBmb3IgKGkgPSAwLCBqID0gMDsgaSA8PSBtYXNrOyBpKyspIHsKKyAgICAgICAgaWYgKGVwW2ldLm1lX3ZhbHVlICE9IE5VTEwpIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICprZXkgPSBlcFtpXS5tZV9rZXk7CisgICAgICAgICAgICBQeV9JTkNSRUYoa2V5KTsKKyAgICAgICAgICAgIFB5TGlzdF9TRVRfSVRFTSh2LCBqLCBrZXkpOworICAgICAgICAgICAgaisrOworICAgICAgICB9CisgICAgfQorICAgIGFzc2VydChqID09IG4pOworICAgIHJldHVybiB2OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZGljdF92YWx1ZXMocmVnaXN0ZXIgUHlEaWN0T2JqZWN0ICptcCkKIHsKLQlyZWdpc3RlciBQeU9iamVjdCAqdjsKLQlyZWdpc3RlciBQeV9zc2l6ZV90IGksIGo7Ci0JUHlEaWN0RW50cnkgKmVwOwotCVB5X3NzaXplX3QgbWFzaywgbjsKKyAgICByZWdpc3RlciBQeU9iamVjdCAqdjsKKyAgICByZWdpc3RlciBQeV9zc2l6ZV90IGksIGo7CisgICAgUHlEaWN0RW50cnkgKmVwOworICAgIFB5X3NzaXplX3QgbWFzaywgbjsKIAogICBhZ2FpbjoKLQluID0gbXAtPm1hX3VzZWQ7Ci0JdiA9IFB5TGlzdF9OZXcobik7Ci0JaWYgKHYgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKG4gIT0gbXAtPm1hX3VzZWQpIHsKLQkJLyogRHVybml0LiAgVGhlIGFsbG9jYXRpb25zIGNhdXNlZCB0aGUgZGljdCB0byByZXNpemUuCi0JCSAqIEp1c3Qgc3RhcnQgb3ZlciwgdGhpcyBzaG91bGRuJ3Qgbm9ybWFsbHkgaGFwcGVuLgotCQkgKi8KLQkJUHlfREVDUkVGKHYpOwotCQlnb3RvIGFnYWluOwotCX0KLQllcCA9IG1wLT5tYV90YWJsZTsKLQltYXNrID0gbXAtPm1hX21hc2s7Ci0JZm9yIChpID0gMCwgaiA9IDA7IGkgPD0gbWFzazsgaSsrKSB7Ci0JCWlmIChlcFtpXS5tZV92YWx1ZSAhPSBOVUxMKSB7Ci0JCQlQeU9iamVjdCAqdmFsdWUgPSBlcFtpXS5tZV92YWx1ZTsKLQkJCVB5X0lOQ1JFRih2YWx1ZSk7Ci0JCQlQeUxpc3RfU0VUX0lURU0odiwgaiwgdmFsdWUpOwotCQkJaisrOwotCQl9Ci0JfQotCWFzc2VydChqID09IG4pOwotCXJldHVybiB2OworICAgIG4gPSBtcC0+bWFfdXNlZDsKKyAgICB2ID0gUHlMaXN0X05ldyhuKTsKKyAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAobiAhPSBtcC0+bWFfdXNlZCkgeworICAgICAgICAvKiBEdXJuaXQuICBUaGUgYWxsb2NhdGlvbnMgY2F1c2VkIHRoZSBkaWN0IHRvIHJlc2l6ZS4KKyAgICAgICAgICogSnVzdCBzdGFydCBvdmVyLCB0aGlzIHNob3VsZG4ndCBub3JtYWxseSBoYXBwZW4uCisgICAgICAgICAqLworICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgIGdvdG8gYWdhaW47CisgICAgfQorICAgIGVwID0gbXAtPm1hX3RhYmxlOworICAgIG1hc2sgPSBtcC0+bWFfbWFzazsKKyAgICBmb3IgKGkgPSAwLCBqID0gMDsgaSA8PSBtYXNrOyBpKyspIHsKKyAgICAgICAgaWYgKGVwW2ldLm1lX3ZhbHVlICE9IE5VTEwpIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICp2YWx1ZSA9IGVwW2ldLm1lX3ZhbHVlOworICAgICAgICAgICAgUHlfSU5DUkVGKHZhbHVlKTsKKyAgICAgICAgICAgIFB5TGlzdF9TRVRfSVRFTSh2LCBqLCB2YWx1ZSk7CisgICAgICAgICAgICBqKys7CisgICAgICAgIH0KKyAgICB9CisgICAgYXNzZXJ0KGogPT0gbik7CisgICAgcmV0dXJuIHY7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkaWN0X2l0ZW1zKHJlZ2lzdGVyIFB5RGljdE9iamVjdCAqbXApCiB7Ci0JcmVnaXN0ZXIgUHlPYmplY3QgKnY7Ci0JcmVnaXN0ZXIgUHlfc3NpemVfdCBpLCBqLCBuOwotCVB5X3NzaXplX3QgbWFzazsKLQlQeU9iamVjdCAqaXRlbSwgKmtleSwgKnZhbHVlOwotCVB5RGljdEVudHJ5ICplcDsKKyAgICByZWdpc3RlciBQeU9iamVjdCAqdjsKKyAgICByZWdpc3RlciBQeV9zc2l6ZV90IGksIGosIG47CisgICAgUHlfc3NpemVfdCBtYXNrOworICAgIFB5T2JqZWN0ICppdGVtLCAqa2V5LCAqdmFsdWU7CisgICAgUHlEaWN0RW50cnkgKmVwOwogCi0JLyogUHJlYWxsb2NhdGUgdGhlIGxpc3Qgb2YgdHVwbGVzLCB0byBhdm9pZCBhbGxvY2F0aW9ucyBkdXJpbmcKLQkgKiB0aGUgbG9vcCBvdmVyIHRoZSBpdGVtcywgd2hpY2ggY291bGQgdHJpZ2dlciBHQywgd2hpY2gKLQkgKiBjb3VsZCByZXNpemUgdGhlIGRpY3QuIDotKAotCSAqLworICAgIC8qIFByZWFsbG9jYXRlIHRoZSBsaXN0IG9mIHR1cGxlcywgdG8gYXZvaWQgYWxsb2NhdGlvbnMgZHVyaW5nCisgICAgICogdGhlIGxvb3Agb3ZlciB0aGUgaXRlbXMsIHdoaWNoIGNvdWxkIHRyaWdnZXIgR0MsIHdoaWNoCisgICAgICogY291bGQgcmVzaXplIHRoZSBkaWN0LiA6LSgKKyAgICAgKi8KICAgYWdhaW46Ci0JbiA9IG1wLT5tYV91c2VkOwotCXYgPSBQeUxpc3RfTmV3KG4pOwotCWlmICh2ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJaXRlbSA9IFB5VHVwbGVfTmV3KDIpOwotCQlpZiAoaXRlbSA9PSBOVUxMKSB7Ci0JCQlQeV9ERUNSRUYodik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlQeUxpc3RfU0VUX0lURU0odiwgaSwgaXRlbSk7Ci0JfQotCWlmIChuICE9IG1wLT5tYV91c2VkKSB7Ci0JCS8qIER1cm5pdC4gIFRoZSBhbGxvY2F0aW9ucyBjYXVzZWQgdGhlIGRpY3QgdG8gcmVzaXplLgotCQkgKiBKdXN0IHN0YXJ0IG92ZXIsIHRoaXMgc2hvdWxkbid0IG5vcm1hbGx5IGhhcHBlbi4KLQkJICovCi0JCVB5X0RFQ1JFRih2KTsKLQkJZ290byBhZ2FpbjsKLQl9Ci0JLyogTm90aGluZyB3ZSBkbyBiZWxvdyBtYWtlcyBhbnkgZnVuY3Rpb24gY2FsbHMuICovCi0JZXAgPSBtcC0+bWFfdGFibGU7Ci0JbWFzayA9IG1wLT5tYV9tYXNrOwotCWZvciAoaSA9IDAsIGogPSAwOyBpIDw9IG1hc2s7IGkrKykgewotCQlpZiAoKHZhbHVlPWVwW2ldLm1lX3ZhbHVlKSAhPSBOVUxMKSB7Ci0JCQlrZXkgPSBlcFtpXS5tZV9rZXk7Ci0JCQlpdGVtID0gUHlMaXN0X0dFVF9JVEVNKHYsIGopOwotCQkJUHlfSU5DUkVGKGtleSk7Ci0JCQlQeVR1cGxlX1NFVF9JVEVNKGl0ZW0sIDAsIGtleSk7Ci0JCQlQeV9JTkNSRUYodmFsdWUpOwotCQkJUHlUdXBsZV9TRVRfSVRFTShpdGVtLCAxLCB2YWx1ZSk7Ci0JCQlqKys7Ci0JCX0KLQl9Ci0JYXNzZXJ0KGogPT0gbik7Ci0JcmV0dXJuIHY7CisgICAgbiA9IG1wLT5tYV91c2VkOworICAgIHYgPSBQeUxpc3RfTmV3KG4pOworICAgIGlmICh2ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgaXRlbSA9IFB5VHVwbGVfTmV3KDIpOworICAgICAgICBpZiAoaXRlbSA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBQeUxpc3RfU0VUX0lURU0odiwgaSwgaXRlbSk7CisgICAgfQorICAgIGlmIChuICE9IG1wLT5tYV91c2VkKSB7CisgICAgICAgIC8qIER1cm5pdC4gIFRoZSBhbGxvY2F0aW9ucyBjYXVzZWQgdGhlIGRpY3QgdG8gcmVzaXplLgorICAgICAgICAgKiBKdXN0IHN0YXJ0IG92ZXIsIHRoaXMgc2hvdWxkbid0IG5vcm1hbGx5IGhhcHBlbi4KKyAgICAgICAgICovCisgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgZ290byBhZ2FpbjsKKyAgICB9CisgICAgLyogTm90aGluZyB3ZSBkbyBiZWxvdyBtYWtlcyBhbnkgZnVuY3Rpb24gY2FsbHMuICovCisgICAgZXAgPSBtcC0+bWFfdGFibGU7CisgICAgbWFzayA9IG1wLT5tYV9tYXNrOworICAgIGZvciAoaSA9IDAsIGogPSAwOyBpIDw9IG1hc2s7IGkrKykgeworICAgICAgICBpZiAoKHZhbHVlPWVwW2ldLm1lX3ZhbHVlKSAhPSBOVUxMKSB7CisgICAgICAgICAgICBrZXkgPSBlcFtpXS5tZV9rZXk7CisgICAgICAgICAgICBpdGVtID0gUHlMaXN0X0dFVF9JVEVNKHYsIGopOworICAgICAgICAgICAgUHlfSU5DUkVGKGtleSk7CisgICAgICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKGl0ZW0sIDAsIGtleSk7CisgICAgICAgICAgICBQeV9JTkNSRUYodmFsdWUpOworICAgICAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShpdGVtLCAxLCB2YWx1ZSk7CisgICAgICAgICAgICBqKys7CisgICAgICAgIH0KKyAgICB9CisgICAgYXNzZXJ0KGogPT0gbik7CisgICAgcmV0dXJuIHY7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkaWN0X2Zyb21rZXlzKFB5T2JqZWN0ICpjbHMsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICpzZXE7Ci0JUHlPYmplY3QgKnZhbHVlID0gUHlfTm9uZTsKLQlQeU9iamVjdCAqaXQ7CS8qIGl0ZXIoc2VxKSAqLwotCVB5T2JqZWN0ICprZXk7Ci0JUHlPYmplY3QgKmQ7Ci0JaW50IHN0YXR1czsKKyAgICBQeU9iamVjdCAqc2VxOworICAgIFB5T2JqZWN0ICp2YWx1ZSA9IFB5X05vbmU7CisgICAgUHlPYmplY3QgKml0OyAgICAgICAvKiBpdGVyKHNlcSkgKi8KKyAgICBQeU9iamVjdCAqa2V5OworICAgIFB5T2JqZWN0ICpkOworICAgIGludCBzdGF0dXM7CiAKLQlpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJmcm9ta2V5cyIsIDEsIDIsICZzZXEsICZ2YWx1ZSkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImZyb21rZXlzIiwgMSwgMiwgJnNlcSwgJnZhbHVlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlkID0gUHlPYmplY3RfQ2FsbE9iamVjdChjbHMsIE5VTEwpOwotCWlmIChkID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIGQgPSBQeU9iamVjdF9DYWxsT2JqZWN0KGNscywgTlVMTCk7CisgICAgaWYgKGQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoUHlEaWN0X0NoZWNrRXhhY3QoZCkgJiYgUHlEaWN0X0NoZWNrRXhhY3Qoc2VxKSkgewotCQlQeURpY3RPYmplY3QgKm1wID0gKFB5RGljdE9iamVjdCAqKWQ7Ci0JCVB5T2JqZWN0ICpvbGR2YWx1ZTsKLQkJUHlfc3NpemVfdCBwb3MgPSAwOwotCQlQeU9iamVjdCAqa2V5OwotCQlsb25nIGhhc2g7CisgICAgaWYgKFB5RGljdF9DaGVja0V4YWN0KGQpICYmIFB5RGljdF9DaGVja0V4YWN0KHNlcSkpIHsKKyAgICAgICAgUHlEaWN0T2JqZWN0ICptcCA9IChQeURpY3RPYmplY3QgKilkOworICAgICAgICBQeU9iamVjdCAqb2xkdmFsdWU7CisgICAgICAgIFB5X3NzaXplX3QgcG9zID0gMDsKKyAgICAgICAgUHlPYmplY3QgKmtleTsKKyAgICAgICAgbG9uZyBoYXNoOwogCi0JCWlmIChkaWN0cmVzaXplKG1wLCBQeV9TSVpFKHNlcSkpKQotCQkJcmV0dXJuIE5VTEw7CisgICAgICAgIGlmIChkaWN0cmVzaXplKG1wLCBQeV9TSVpFKHNlcSkpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkJd2hpbGUgKF9QeURpY3RfTmV4dChzZXEsICZwb3MsICZrZXksICZvbGR2YWx1ZSwgJmhhc2gpKSB7Ci0JCQlQeV9JTkNSRUYoa2V5KTsKLQkJCVB5X0lOQ1JFRih2YWx1ZSk7Ci0JCQlpZiAoaW5zZXJ0ZGljdChtcCwga2V5LCBoYXNoLCB2YWx1ZSkpCi0JCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJcmV0dXJuIGQ7Ci0JfQorICAgICAgICB3aGlsZSAoX1B5RGljdF9OZXh0KHNlcSwgJnBvcywgJmtleSwgJm9sZHZhbHVlLCAmaGFzaCkpIHsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihrZXkpOworICAgICAgICAgICAgUHlfSU5DUkVGKHZhbHVlKTsKKyAgICAgICAgICAgIGlmIChpbnNlcnRkaWN0KG1wLCBrZXksIGhhc2gsIHZhbHVlKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZDsKKyAgICB9CiAKLQlpZiAoUHlEaWN0X0NoZWNrRXhhY3QoZCkgJiYgUHlBbnlTZXRfQ2hlY2tFeGFjdChzZXEpKSB7Ci0JCVB5RGljdE9iamVjdCAqbXAgPSAoUHlEaWN0T2JqZWN0ICopZDsKLQkJUHlfc3NpemVfdCBwb3MgPSAwOwotCQlQeU9iamVjdCAqa2V5OwotCQlsb25nIGhhc2g7CisgICAgaWYgKFB5RGljdF9DaGVja0V4YWN0KGQpICYmIFB5QW55U2V0X0NoZWNrRXhhY3Qoc2VxKSkgeworICAgICAgICBQeURpY3RPYmplY3QgKm1wID0gKFB5RGljdE9iamVjdCAqKWQ7CisgICAgICAgIFB5X3NzaXplX3QgcG9zID0gMDsKKyAgICAgICAgUHlPYmplY3QgKmtleTsKKyAgICAgICAgbG9uZyBoYXNoOwogCi0JCWlmIChkaWN0cmVzaXplKG1wLCBQeVNldF9HRVRfU0laRShzZXEpKSkKLQkJCXJldHVybiBOVUxMOworICAgICAgICBpZiAoZGljdHJlc2l6ZShtcCwgUHlTZXRfR0VUX1NJWkUoc2VxKSkpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKIAotCQl3aGlsZSAoX1B5U2V0X05leHRFbnRyeShzZXEsICZwb3MsICZrZXksICZoYXNoKSkgewotCQkJUHlfSU5DUkVGKGtleSk7Ci0JCQlQeV9JTkNSRUYodmFsdWUpOwotCQkJaWYgKGluc2VydGRpY3QobXAsIGtleSwgaGFzaCwgdmFsdWUpKQotCQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCXJldHVybiBkOwotCX0KKyAgICAgICAgd2hpbGUgKF9QeVNldF9OZXh0RW50cnkoc2VxLCAmcG9zLCAma2V5LCAmaGFzaCkpIHsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihrZXkpOworICAgICAgICAgICAgUHlfSU5DUkVGKHZhbHVlKTsKKyAgICAgICAgICAgIGlmIChpbnNlcnRkaWN0KG1wLCBrZXksIGhhc2gsIHZhbHVlKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZDsKKyAgICB9CiAKLQlpdCA9IFB5T2JqZWN0X0dldEl0ZXIoc2VxKTsKLQlpZiAoaXQgPT0gTlVMTCl7Ci0JCVB5X0RFQ1JFRihkKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGl0ID0gUHlPYmplY3RfR2V0SXRlcihzZXEpOworICAgIGlmIChpdCA9PSBOVUxMKXsKKyAgICAgICAgUHlfREVDUkVGKGQpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlpZiAoUHlEaWN0X0NoZWNrRXhhY3QoZCkpIHsKLQkJd2hpbGUgKChrZXkgPSBQeUl0ZXJfTmV4dChpdCkpICE9IE5VTEwpIHsKLQkJCXN0YXR1cyA9IFB5RGljdF9TZXRJdGVtKGQsIGtleSwgdmFsdWUpOwotCQkJUHlfREVDUkVGKGtleSk7Ci0JCQlpZiAoc3RhdHVzIDwgMCkKLQkJCQlnb3RvIEZhaWw7Ci0JCX0KLQl9IGVsc2UgewotCQl3aGlsZSAoKGtleSA9IFB5SXRlcl9OZXh0KGl0KSkgIT0gTlVMTCkgewotCQkJc3RhdHVzID0gUHlPYmplY3RfU2V0SXRlbShkLCBrZXksIHZhbHVlKTsKLQkJCVB5X0RFQ1JFRihrZXkpOwotCQkJaWYgKHN0YXR1cyA8IDApCi0JCQkJZ290byBGYWlsOwotCQl9Ci0JfQorICAgIGlmIChQeURpY3RfQ2hlY2tFeGFjdChkKSkgeworICAgICAgICB3aGlsZSAoKGtleSA9IFB5SXRlcl9OZXh0KGl0KSkgIT0gTlVMTCkgeworICAgICAgICAgICAgc3RhdHVzID0gUHlEaWN0X1NldEl0ZW0oZCwga2V5LCB2YWx1ZSk7CisgICAgICAgICAgICBQeV9ERUNSRUYoa2V5KTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gRmFpbDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHdoaWxlICgoa2V5ID0gUHlJdGVyX05leHQoaXQpKSAhPSBOVUxMKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBQeU9iamVjdF9TZXRJdGVtKGQsIGtleSwgdmFsdWUpOworICAgICAgICAgICAgUHlfREVDUkVGKGtleSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzIDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIEZhaWw7CisgICAgICAgIH0KKyAgICB9CiAKLQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkKLQkJZ290byBGYWlsOwotCVB5X0RFQ1JFRihpdCk7Ci0JcmV0dXJuIGQ7CisgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIGdvdG8gRmFpbDsKKyAgICBQeV9ERUNSRUYoaXQpOworICAgIHJldHVybiBkOwogCiBGYWlsOgotCVB5X0RFQ1JFRihpdCk7Ci0JUHlfREVDUkVGKGQpOwotCXJldHVybiBOVUxMOworICAgIFB5X0RFQ1JFRihpdCk7CisgICAgUHlfREVDUkVGKGQpOworICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgaW50CiBkaWN0X3VwZGF0ZV9jb21tb24oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcywgY2hhciAqbWV0aG5hbWUpCiB7Ci0JUHlPYmplY3QgKmFyZyA9IE5VTEw7Ci0JaW50IHJlc3VsdCA9IDA7CisgICAgUHlPYmplY3QgKmFyZyA9IE5VTEw7CisgICAgaW50IHJlc3VsdCA9IDA7CiAKLQlpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsIG1ldGhuYW1lLCAwLCAxLCAmYXJnKSkKLQkJcmVzdWx0ID0gLTE7CisgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCBtZXRobmFtZSwgMCwgMSwgJmFyZykpCisgICAgICAgIHJlc3VsdCA9IC0xOwogCi0JZWxzZSBpZiAoYXJnICE9IE5VTEwpIHsKLQkJaWYgKFB5T2JqZWN0X0hhc0F0dHJTdHJpbmcoYXJnLCAia2V5cyIpKQotCQkJcmVzdWx0ID0gUHlEaWN0X01lcmdlKHNlbGYsIGFyZywgMSk7Ci0JCWVsc2UKLQkJCXJlc3VsdCA9IFB5RGljdF9NZXJnZUZyb21TZXEyKHNlbGYsIGFyZywgMSk7Ci0JfQotCWlmIChyZXN1bHQgPT0gMCAmJiBrd2RzICE9IE5VTEwpCi0JCXJlc3VsdCA9IFB5RGljdF9NZXJnZShzZWxmLCBrd2RzLCAxKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIGVsc2UgaWYgKGFyZyAhPSBOVUxMKSB7CisgICAgICAgIGlmIChQeU9iamVjdF9IYXNBdHRyU3RyaW5nKGFyZywgImtleXMiKSkKKyAgICAgICAgICAgIHJlc3VsdCA9IFB5RGljdF9NZXJnZShzZWxmLCBhcmcsIDEpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXN1bHQgPSBQeURpY3RfTWVyZ2VGcm9tU2VxMihzZWxmLCBhcmcsIDEpOworICAgIH0KKyAgICBpZiAocmVzdWx0ID09IDAgJiYga3dkcyAhPSBOVUxMKQorICAgICAgICByZXN1bHQgPSBQeURpY3RfTWVyZ2Uoc2VsZiwga3dkcywgMSk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRpY3RfdXBkYXRlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JaWYgKGRpY3RfdXBkYXRlX2NvbW1vbihzZWxmLCBhcmdzLCBrd2RzLCAidXBkYXRlIikgIT0gLTEpCi0JCVB5X1JFVFVSTl9OT05FOwotCXJldHVybiBOVUxMOworICAgIGlmIChkaWN0X3VwZGF0ZV9jb21tb24oc2VsZiwgYXJncywga3dkcywgInVwZGF0ZSIpICE9IC0xKQorICAgICAgICBQeV9SRVRVUk5fTk9ORTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogLyogVXBkYXRlIHVuY29uZGl0aW9uYWxseSByZXBsYWNlcyBleGlzdGluZyBpdGVtcy4KQEAgLTEzNjEsMjM4ICsxMzYxLDIzOCBAQAogaW50CiBQeURpY3RfTWVyZ2VGcm9tU2VxMihQeU9iamVjdCAqZCwgUHlPYmplY3QgKnNlcTIsIGludCBvdmVycmlkZSkKIHsKLQlQeU9iamVjdCAqaXQ7CS8qIGl0ZXIoc2VxMikgKi8KLQlQeV9zc2l6ZV90IGk7CS8qIGluZGV4IGludG8gc2VxMiBvZiBjdXJyZW50IGVsZW1lbnQgKi8KLQlQeU9iamVjdCAqaXRlbTsJLyogc2VxMltpXSAqLwotCVB5T2JqZWN0ICpmYXN0OwkvKiBpdGVtIGFzIGEgMi10dXBsZSBvciAyLWxpc3QgKi8KKyAgICBQeU9iamVjdCAqaXQ7ICAgICAgIC8qIGl0ZXIoc2VxMikgKi8KKyAgICBQeV9zc2l6ZV90IGk7ICAgICAgIC8qIGluZGV4IGludG8gc2VxMiBvZiBjdXJyZW50IGVsZW1lbnQgKi8KKyAgICBQeU9iamVjdCAqaXRlbTsgICAgIC8qIHNlcTJbaV0gKi8KKyAgICBQeU9iamVjdCAqZmFzdDsgICAgIC8qIGl0ZW0gYXMgYSAyLXR1cGxlIG9yIDItbGlzdCAqLwogCi0JYXNzZXJ0KGQgIT0gTlVMTCk7Ci0JYXNzZXJ0KFB5RGljdF9DaGVjayhkKSk7Ci0JYXNzZXJ0KHNlcTIgIT0gTlVMTCk7CisgICAgYXNzZXJ0KGQgIT0gTlVMTCk7CisgICAgYXNzZXJ0KFB5RGljdF9DaGVjayhkKSk7CisgICAgYXNzZXJ0KHNlcTIgIT0gTlVMTCk7CiAKLQlpdCA9IFB5T2JqZWN0X0dldEl0ZXIoc2VxMik7Ci0JaWYgKGl0ID09IE5VTEwpCi0JCXJldHVybiAtMTsKKyAgICBpdCA9IFB5T2JqZWN0X0dldEl0ZXIoc2VxMik7CisgICAgaWYgKGl0ID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKIAotCWZvciAoaSA9IDA7IDsgKytpKSB7Ci0JCVB5T2JqZWN0ICprZXksICp2YWx1ZTsKLQkJUHlfc3NpemVfdCBuOworICAgIGZvciAoaSA9IDA7IDsgKytpKSB7CisgICAgICAgIFB5T2JqZWN0ICprZXksICp2YWx1ZTsKKyAgICAgICAgUHlfc3NpemVfdCBuOwogCi0JCWZhc3QgPSBOVUxMOwotCQlpdGVtID0gUHlJdGVyX05leHQoaXQpOwotCQlpZiAoaXRlbSA9PSBOVUxMKSB7Ci0JCQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkKLQkJCQlnb3RvIEZhaWw7Ci0JCQlicmVhazsKLQkJfQorICAgICAgICBmYXN0ID0gTlVMTDsKKyAgICAgICAgaXRlbSA9IFB5SXRlcl9OZXh0KGl0KTsKKyAgICAgICAgaWYgKGl0ZW0gPT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICAgICAgZ290byBGYWlsOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KIAotCQkvKiBDb252ZXJ0IGl0ZW0gdG8gc2VxdWVuY2UsIGFuZCB2ZXJpZnkgbGVuZ3RoIDIuICovCi0JCWZhc3QgPSBQeVNlcXVlbmNlX0Zhc3QoaXRlbSwgIiIpOwotCQlpZiAoZmFzdCA9PSBOVUxMKSB7Ci0JCQlpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19UeXBlRXJyb3IpKQotCQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkJCSJjYW5ub3QgY29udmVydCBkaWN0aW9uYXJ5IHVwZGF0ZSAiCi0JCQkJCSJzZXF1ZW5jZSBlbGVtZW50ICMlemQgdG8gYSBzZXF1ZW5jZSIsCi0JCQkJCWkpOwotCQkJZ290byBGYWlsOwotCQl9Ci0JCW4gPSBQeVNlcXVlbmNlX0Zhc3RfR0VUX1NJWkUoZmFzdCk7Ci0JCWlmIChuICE9IDIpIHsKLQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSAgICAgImRpY3Rpb25hcnkgdXBkYXRlIHNlcXVlbmNlIGVsZW1lbnQgIyV6ZCAiCi0JCQkJICAgICAiaGFzIGxlbmd0aCAlemQ7IDIgaXMgcmVxdWlyZWQiLAotCQkJCSAgICAgaSwgbik7Ci0JCQlnb3RvIEZhaWw7Ci0JCX0KKyAgICAgICAgLyogQ29udmVydCBpdGVtIHRvIHNlcXVlbmNlLCBhbmQgdmVyaWZ5IGxlbmd0aCAyLiAqLworICAgICAgICBmYXN0ID0gUHlTZXF1ZW5jZV9GYXN0KGl0ZW0sICIiKTsKKyAgICAgICAgaWYgKGZhc3QgPT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfVHlwZUVycm9yKSkKKyAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAiY2Fubm90IGNvbnZlcnQgZGljdGlvbmFyeSB1cGRhdGUgIgorICAgICAgICAgICAgICAgICAgICAic2VxdWVuY2UgZWxlbWVudCAjJXpkIHRvIGEgc2VxdWVuY2UiLAorICAgICAgICAgICAgICAgICAgICBpKTsKKyAgICAgICAgICAgIGdvdG8gRmFpbDsKKyAgICAgICAgfQorICAgICAgICBuID0gUHlTZXF1ZW5jZV9GYXN0X0dFVF9TSVpFKGZhc3QpOworICAgICAgICBpZiAobiAhPSAyKSB7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiZGljdGlvbmFyeSB1cGRhdGUgc2VxdWVuY2UgZWxlbWVudCAjJXpkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiaGFzIGxlbmd0aCAlemQ7IDIgaXMgcmVxdWlyZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGksIG4pOworICAgICAgICAgICAgZ290byBGYWlsOworICAgICAgICB9CiAKLQkJLyogVXBkYXRlL21lcmdlIHdpdGggdGhpcyAoa2V5LCB2YWx1ZSkgcGFpci4gKi8KLQkJa2V5ID0gUHlTZXF1ZW5jZV9GYXN0X0dFVF9JVEVNKGZhc3QsIDApOwotCQl2YWx1ZSA9IFB5U2VxdWVuY2VfRmFzdF9HRVRfSVRFTShmYXN0LCAxKTsKLQkJaWYgKG92ZXJyaWRlIHx8IFB5RGljdF9HZXRJdGVtKGQsIGtleSkgPT0gTlVMTCkgewotCQkJaW50IHN0YXR1cyA9IFB5RGljdF9TZXRJdGVtKGQsIGtleSwgdmFsdWUpOwotCQkJaWYgKHN0YXR1cyA8IDApCi0JCQkJZ290byBGYWlsOwotCQl9Ci0JCVB5X0RFQ1JFRihmYXN0KTsKLQkJUHlfREVDUkVGKGl0ZW0pOwotCX0KKyAgICAgICAgLyogVXBkYXRlL21lcmdlIHdpdGggdGhpcyAoa2V5LCB2YWx1ZSkgcGFpci4gKi8KKyAgICAgICAga2V5ID0gUHlTZXF1ZW5jZV9GYXN0X0dFVF9JVEVNKGZhc3QsIDApOworICAgICAgICB2YWx1ZSA9IFB5U2VxdWVuY2VfRmFzdF9HRVRfSVRFTShmYXN0LCAxKTsKKyAgICAgICAgaWYgKG92ZXJyaWRlIHx8IFB5RGljdF9HZXRJdGVtKGQsIGtleSkgPT0gTlVMTCkgeworICAgICAgICAgICAgaW50IHN0YXR1cyA9IFB5RGljdF9TZXRJdGVtKGQsIGtleSwgdmFsdWUpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA8IDApCisgICAgICAgICAgICAgICAgZ290byBGYWlsOworICAgICAgICB9CisgICAgICAgIFB5X0RFQ1JFRihmYXN0KTsKKyAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgIH0KIAotCWkgPSAwOwotCWdvdG8gUmV0dXJuOworICAgIGkgPSAwOworICAgIGdvdG8gUmV0dXJuOwogRmFpbDoKLQlQeV9YREVDUkVGKGl0ZW0pOwotCVB5X1hERUNSRUYoZmFzdCk7Ci0JaSA9IC0xOworICAgIFB5X1hERUNSRUYoaXRlbSk7CisgICAgUHlfWERFQ1JFRihmYXN0KTsKKyAgICBpID0gLTE7CiBSZXR1cm46Ci0JUHlfREVDUkVGKGl0KTsKLQlyZXR1cm4gUHlfU0FGRV9ET1dOQ0FTVChpLCBQeV9zc2l6ZV90LCBpbnQpOworICAgIFB5X0RFQ1JFRihpdCk7CisgICAgcmV0dXJuIFB5X1NBRkVfRE9XTkNBU1QoaSwgUHlfc3NpemVfdCwgaW50KTsKIH0KIAogaW50CiBQeURpY3RfVXBkYXRlKFB5T2JqZWN0ICphLCBQeU9iamVjdCAqYikKIHsKLQlyZXR1cm4gUHlEaWN0X01lcmdlKGEsIGIsIDEpOworICAgIHJldHVybiBQeURpY3RfTWVyZ2UoYSwgYiwgMSk7CiB9CiAKIGludAogUHlEaWN0X01lcmdlKFB5T2JqZWN0ICphLCBQeU9iamVjdCAqYiwgaW50IG92ZXJyaWRlKQogewotCXJlZ2lzdGVyIFB5RGljdE9iamVjdCAqbXAsICpvdGhlcjsKLQlyZWdpc3RlciBQeV9zc2l6ZV90IGk7Ci0JUHlEaWN0RW50cnkgKmVudHJ5OworICAgIHJlZ2lzdGVyIFB5RGljdE9iamVjdCAqbXAsICpvdGhlcjsKKyAgICByZWdpc3RlciBQeV9zc2l6ZV90IGk7CisgICAgUHlEaWN0RW50cnkgKmVudHJ5OwogCi0JLyogV2UgYWNjZXB0IGZvciB0aGUgYXJndW1lbnQgZWl0aGVyIGEgY29uY3JldGUgZGljdGlvbmFyeSBvYmplY3QsCi0JICogb3IgYW4gYWJzdHJhY3QgIm1hcHBpbmciIG9iamVjdC4gIEZvciB0aGUgZm9ybWVyLCB3ZSBjYW4gZG8KLQkgKiB0aGluZ3MgcXVpdGUgZWZmaWNpZW50bHkuICBGb3IgdGhlIGxhdHRlciwgd2Ugb25seSByZXF1aXJlIHRoYXQKLQkgKiBQeU1hcHBpbmdfS2V5cygpIGFuZCBQeU9iamVjdF9HZXRJdGVtKCkgYmUgc3VwcG9ydGVkLgotCSAqLwotCWlmIChhID09IE5VTEwgfHwgIVB5RGljdF9DaGVjayhhKSB8fCBiID09IE5VTEwpIHsKLQkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JbXAgPSAoUHlEaWN0T2JqZWN0KilhOwotCWlmIChQeURpY3RfQ2hlY2soYikpIHsKLQkJb3RoZXIgPSAoUHlEaWN0T2JqZWN0KiliOwotCQlpZiAob3RoZXIgPT0gbXAgfHwgb3RoZXItPm1hX3VzZWQgPT0gMCkKLQkJCS8qIGEudXBkYXRlKGEpIG9yIGEudXBkYXRlKHt9KTsgbm90aGluZyB0byBkbyAqLwotCQkJcmV0dXJuIDA7Ci0JCWlmIChtcC0+bWFfdXNlZCA9PSAwKQotCQkJLyogU2luY2UgdGhlIHRhcmdldCBkaWN0IGlzIGVtcHR5LCBQeURpY3RfR2V0SXRlbSgpCi0JCQkgKiBhbHdheXMgcmV0dXJucyBOVUxMLiAgU2V0dGluZyBvdmVycmlkZSB0byAxCi0JCQkgKiBza2lwcyB0aGUgdW5uZWNlc3NhcnkgdGVzdC4KLQkJCSAqLwotCQkJb3ZlcnJpZGUgPSAxOwotCQkvKiBEbyBvbmUgYmlnIHJlc2l6ZSBhdCB0aGUgc3RhcnQsIHJhdGhlciB0aGFuCi0JCSAqIGluY3JlbWVudGFsbHkgcmVzaXppbmcgYXMgd2UgaW5zZXJ0IG5ldyBpdGVtcy4gIEV4cGVjdAotCQkgKiB0aGF0IHRoZXJlIHdpbGwgYmUgbm8gKG9yIGZldykgb3ZlcmxhcHBpbmcga2V5cy4KLQkJICovCi0JCWlmICgobXAtPm1hX2ZpbGwgKyBvdGhlci0+bWFfdXNlZCkqMyA+PSAobXAtPm1hX21hc2srMSkqMikgewotCQkgICBpZiAoZGljdHJlc2l6ZShtcCwgKG1wLT5tYV91c2VkICsgb3RoZXItPm1hX3VzZWQpKjIpICE9IDApCi0JCQkgICByZXR1cm4gLTE7Ci0JCX0KLQkJZm9yIChpID0gMDsgaSA8PSBvdGhlci0+bWFfbWFzazsgaSsrKSB7Ci0JCQllbnRyeSA9ICZvdGhlci0+bWFfdGFibGVbaV07Ci0JCQlpZiAoZW50cnktPm1lX3ZhbHVlICE9IE5VTEwgJiYKLQkJCSAgICAob3ZlcnJpZGUgfHwKLQkJCSAgICAgUHlEaWN0X0dldEl0ZW0oYSwgZW50cnktPm1lX2tleSkgPT0gTlVMTCkpIHsKLQkJCQlQeV9JTkNSRUYoZW50cnktPm1lX2tleSk7Ci0JCQkJUHlfSU5DUkVGKGVudHJ5LT5tZV92YWx1ZSk7Ci0JCQkJaWYgKGluc2VydGRpY3QobXAsIGVudHJ5LT5tZV9rZXksCi0JCQkJCSAgICAgICAobG9uZyllbnRyeS0+bWVfaGFzaCwKLQkJCQkJICAgICAgIGVudHJ5LT5tZV92YWx1ZSkgIT0gMCkKLQkJCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JfQotCWVsc2UgewotCQkvKiBEbyBpdCB0aGUgZ2VuZXJpYywgc2xvd2VyIHdheSAqLwotCQlQeU9iamVjdCAqa2V5cyA9IFB5TWFwcGluZ19LZXlzKGIpOwotCQlQeU9iamVjdCAqaXRlcjsKLQkJUHlPYmplY3QgKmtleSwgKnZhbHVlOwotCQlpbnQgc3RhdHVzOworICAgIC8qIFdlIGFjY2VwdCBmb3IgdGhlIGFyZ3VtZW50IGVpdGhlciBhIGNvbmNyZXRlIGRpY3Rpb25hcnkgb2JqZWN0LAorICAgICAqIG9yIGFuIGFic3RyYWN0ICJtYXBwaW5nIiBvYmplY3QuICBGb3IgdGhlIGZvcm1lciwgd2UgY2FuIGRvCisgICAgICogdGhpbmdzIHF1aXRlIGVmZmljaWVudGx5LiAgRm9yIHRoZSBsYXR0ZXIsIHdlIG9ubHkgcmVxdWlyZSB0aGF0CisgICAgICogUHlNYXBwaW5nX0tleXMoKSBhbmQgUHlPYmplY3RfR2V0SXRlbSgpIGJlIHN1cHBvcnRlZC4KKyAgICAgKi8KKyAgICBpZiAoYSA9PSBOVUxMIHx8ICFQeURpY3RfQ2hlY2soYSkgfHwgYiA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG1wID0gKFB5RGljdE9iamVjdCopYTsKKyAgICBpZiAoUHlEaWN0X0NoZWNrKGIpKSB7CisgICAgICAgIG90aGVyID0gKFB5RGljdE9iamVjdCopYjsKKyAgICAgICAgaWYgKG90aGVyID09IG1wIHx8IG90aGVyLT5tYV91c2VkID09IDApCisgICAgICAgICAgICAvKiBhLnVwZGF0ZShhKSBvciBhLnVwZGF0ZSh7fSk7IG5vdGhpbmcgdG8gZG8gKi8KKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBpZiAobXAtPm1hX3VzZWQgPT0gMCkKKyAgICAgICAgICAgIC8qIFNpbmNlIHRoZSB0YXJnZXQgZGljdCBpcyBlbXB0eSwgUHlEaWN0X0dldEl0ZW0oKQorICAgICAgICAgICAgICogYWx3YXlzIHJldHVybnMgTlVMTC4gIFNldHRpbmcgb3ZlcnJpZGUgdG8gMQorICAgICAgICAgICAgICogc2tpcHMgdGhlIHVubmVjZXNzYXJ5IHRlc3QuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIG92ZXJyaWRlID0gMTsKKyAgICAgICAgLyogRG8gb25lIGJpZyByZXNpemUgYXQgdGhlIHN0YXJ0LCByYXRoZXIgdGhhbgorICAgICAgICAgKiBpbmNyZW1lbnRhbGx5IHJlc2l6aW5nIGFzIHdlIGluc2VydCBuZXcgaXRlbXMuICBFeHBlY3QKKyAgICAgICAgICogdGhhdCB0aGVyZSB3aWxsIGJlIG5vIChvciBmZXcpIG92ZXJsYXBwaW5nIGtleXMuCisgICAgICAgICAqLworICAgICAgICBpZiAoKG1wLT5tYV9maWxsICsgb3RoZXItPm1hX3VzZWQpKjMgPj0gKG1wLT5tYV9tYXNrKzEpKjIpIHsKKyAgICAgICAgICAgaWYgKGRpY3RyZXNpemUobXAsIChtcC0+bWFfdXNlZCArIG90aGVyLT5tYV91c2VkKSoyKSAhPSAwKQorICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPD0gb3RoZXItPm1hX21hc2s7IGkrKykgeworICAgICAgICAgICAgZW50cnkgPSAmb3RoZXItPm1hX3RhYmxlW2ldOworICAgICAgICAgICAgaWYgKGVudHJ5LT5tZV92YWx1ZSAhPSBOVUxMICYmCisgICAgICAgICAgICAgICAgKG92ZXJyaWRlIHx8CisgICAgICAgICAgICAgICAgIFB5RGljdF9HZXRJdGVtKGEsIGVudHJ5LT5tZV9rZXkpID09IE5VTEwpKSB7CisgICAgICAgICAgICAgICAgUHlfSU5DUkVGKGVudHJ5LT5tZV9rZXkpOworICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihlbnRyeS0+bWVfdmFsdWUpOworICAgICAgICAgICAgICAgIGlmIChpbnNlcnRkaWN0KG1wLCBlbnRyeS0+bWVfa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nKWVudHJ5LT5tZV9oYXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LT5tZV92YWx1ZSkgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvKiBEbyBpdCB0aGUgZ2VuZXJpYywgc2xvd2VyIHdheSAqLworICAgICAgICBQeU9iamVjdCAqa2V5cyA9IFB5TWFwcGluZ19LZXlzKGIpOworICAgICAgICBQeU9iamVjdCAqaXRlcjsKKyAgICAgICAgUHlPYmplY3QgKmtleSwgKnZhbHVlOworICAgICAgICBpbnQgc3RhdHVzOwogCi0JCWlmIChrZXlzID09IE5VTEwpCi0JCQkvKiBEb2NzdHJpbmcgc2F5cyB0aGlzIGlzIGVxdWl2YWxlbnQgdG8gRS5rZXlzKCkgc28KLQkJCSAqIGlmIEUgZG9lc24ndCBoYXZlIGEgLmtleXMoKSBtZXRob2Qgd2Ugd2FudAotCQkJICogQXR0cmlidXRlRXJyb3IgdG8gcGVyY29sYXRlIHVwLiAgTWlnaHQgYXMgd2VsbAotCQkJICogZG8gdGhlIHNhbWUgZm9yIGFueSBvdGhlciBlcnJvci4KLQkJCSAqLwotCQkJcmV0dXJuIC0xOworICAgICAgICBpZiAoa2V5cyA9PSBOVUxMKQorICAgICAgICAgICAgLyogRG9jc3RyaW5nIHNheXMgdGhpcyBpcyBlcXVpdmFsZW50IHRvIEUua2V5cygpIHNvCisgICAgICAgICAgICAgKiBpZiBFIGRvZXNuJ3QgaGF2ZSBhIC5rZXlzKCkgbWV0aG9kIHdlIHdhbnQKKyAgICAgICAgICAgICAqIEF0dHJpYnV0ZUVycm9yIHRvIHBlcmNvbGF0ZSB1cC4gIE1pZ2h0IGFzIHdlbGwKKyAgICAgICAgICAgICAqIGRvIHRoZSBzYW1lIGZvciBhbnkgb3RoZXIgZXJyb3IuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHJldHVybiAtMTsKIAotCQlpdGVyID0gUHlPYmplY3RfR2V0SXRlcihrZXlzKTsKLQkJUHlfREVDUkVGKGtleXMpOwotCQlpZiAoaXRlciA9PSBOVUxMKQotCQkJcmV0dXJuIC0xOworICAgICAgICBpdGVyID0gUHlPYmplY3RfR2V0SXRlcihrZXlzKTsKKyAgICAgICAgUHlfREVDUkVGKGtleXMpOworICAgICAgICBpZiAoaXRlciA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIC0xOwogCi0JCWZvciAoa2V5ID0gUHlJdGVyX05leHQoaXRlcik7IGtleTsga2V5ID0gUHlJdGVyX05leHQoaXRlcikpIHsKLQkJCWlmICghb3ZlcnJpZGUgJiYgUHlEaWN0X0dldEl0ZW0oYSwga2V5KSAhPSBOVUxMKSB7Ci0JCQkJUHlfREVDUkVGKGtleSk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQl2YWx1ZSA9IFB5T2JqZWN0X0dldEl0ZW0oYiwga2V5KTsKLQkJCWlmICh2YWx1ZSA9PSBOVUxMKSB7Ci0JCQkJUHlfREVDUkVGKGl0ZXIpOwotCQkJCVB5X0RFQ1JFRihrZXkpOwotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJCXN0YXR1cyA9IFB5RGljdF9TZXRJdGVtKGEsIGtleSwgdmFsdWUpOwotCQkJUHlfREVDUkVGKGtleSk7Ci0JCQlQeV9ERUNSRUYodmFsdWUpOwotCQkJaWYgKHN0YXR1cyA8IDApIHsKLQkJCQlQeV9ERUNSRUYoaXRlcik7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCVB5X0RFQ1JFRihpdGVyKTsKLQkJaWYgKFB5RXJyX09jY3VycmVkKCkpCi0JCQkvKiBJdGVyYXRvciBjb21wbGV0ZWQsIHZpYSBlcnJvciAqLwotCQkJcmV0dXJuIC0xOwotCX0KLQlyZXR1cm4gMDsKKyAgICAgICAgZm9yIChrZXkgPSBQeUl0ZXJfTmV4dChpdGVyKTsga2V5OyBrZXkgPSBQeUl0ZXJfTmV4dChpdGVyKSkgeworICAgICAgICAgICAgaWYgKCFvdmVycmlkZSAmJiBQeURpY3RfR2V0SXRlbShhLCBrZXkpICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoa2V5KTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhbHVlID0gUHlPYmplY3RfR2V0SXRlbShiLCBrZXkpOworICAgICAgICAgICAgaWYgKHZhbHVlID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoaXRlcik7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGtleSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdHVzID0gUHlEaWN0X1NldEl0ZW0oYSwga2V5LCB2YWx1ZSk7CisgICAgICAgICAgICBQeV9ERUNSRUYoa2V5KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih2YWx1ZSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzIDwgMCkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihpdGVyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgUHlfREVDUkVGKGl0ZXIpOworICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIC8qIEl0ZXJhdG9yIGNvbXBsZXRlZCwgdmlhIGVycm9yICovCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZGljdF9jb3B5KHJlZ2lzdGVyIFB5RGljdE9iamVjdCAqbXApCiB7Ci0JcmV0dXJuIFB5RGljdF9Db3B5KChQeU9iamVjdCopbXApOworICAgIHJldHVybiBQeURpY3RfQ29weSgoUHlPYmplY3QqKW1wKTsKIH0KIAogUHlPYmplY3QgKgogUHlEaWN0X0NvcHkoUHlPYmplY3QgKm8pCiB7Ci0JUHlPYmplY3QgKmNvcHk7CisgICAgUHlPYmplY3QgKmNvcHk7CiAKLQlpZiAobyA9PSBOVUxMIHx8ICFQeURpY3RfQ2hlY2sobykpIHsKLQkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQljb3B5ID0gUHlEaWN0X05ldygpOwotCWlmIChjb3B5ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWlmIChQeURpY3RfTWVyZ2UoY29weSwgbywgMSkgPT0gMCkKLQkJcmV0dXJuIGNvcHk7Ci0JUHlfREVDUkVGKGNvcHkpOwotCXJldHVybiBOVUxMOworICAgIGlmIChvID09IE5VTEwgfHwgIVB5RGljdF9DaGVjayhvKSkgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGNvcHkgPSBQeURpY3RfTmV3KCk7CisgICAgaWYgKGNvcHkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKFB5RGljdF9NZXJnZShjb3B5LCBvLCAxKSA9PSAwKQorICAgICAgICByZXR1cm4gY29weTsKKyAgICBQeV9ERUNSRUYoY29weSk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIFB5X3NzaXplX3QKIFB5RGljdF9TaXplKFB5T2JqZWN0ICptcCkKIHsKLQlpZiAobXAgPT0gTlVMTCB8fCAhUHlEaWN0X0NoZWNrKG1wKSkgewotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlyZXR1cm4gKChQeURpY3RPYmplY3QgKiltcCktPm1hX3VzZWQ7CisgICAgaWYgKG1wID09IE5VTEwgfHwgIVB5RGljdF9DaGVjayhtcCkpIHsKKyAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuICgoUHlEaWN0T2JqZWN0ICopbXApLT5tYV91c2VkOwogfQogCiBQeU9iamVjdCAqCiBQeURpY3RfS2V5cyhQeU9iamVjdCAqbXApCiB7Ci0JaWYgKG1wID09IE5VTEwgfHwgIVB5RGljdF9DaGVjayhtcCkpIHsKLQkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gZGljdF9rZXlzKChQeURpY3RPYmplY3QgKiltcCk7CisgICAgaWYgKG1wID09IE5VTEwgfHwgIVB5RGljdF9DaGVjayhtcCkpIHsKKyAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gZGljdF9rZXlzKChQeURpY3RPYmplY3QgKiltcCk7CiB9CiAKIFB5T2JqZWN0ICoKIFB5RGljdF9WYWx1ZXMoUHlPYmplY3QgKm1wKQogewotCWlmIChtcCA9PSBOVUxMIHx8ICFQeURpY3RfQ2hlY2sobXApKSB7Ci0JCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIGRpY3RfdmFsdWVzKChQeURpY3RPYmplY3QgKiltcCk7CisgICAgaWYgKG1wID09IE5VTEwgfHwgIVB5RGljdF9DaGVjayhtcCkpIHsKKyAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gZGljdF92YWx1ZXMoKFB5RGljdE9iamVjdCAqKW1wKTsKIH0KIAogUHlPYmplY3QgKgogUHlEaWN0X0l0ZW1zKFB5T2JqZWN0ICptcCkKIHsKLQlpZiAobXAgPT0gTlVMTCB8fCAhUHlEaWN0X0NoZWNrKG1wKSkgewotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBkaWN0X2l0ZW1zKChQeURpY3RPYmplY3QgKiltcCk7CisgICAgaWYgKG1wID09IE5VTEwgfHwgIVB5RGljdF9DaGVjayhtcCkpIHsKKyAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gZGljdF9pdGVtcygoUHlEaWN0T2JqZWN0ICopbXApOwogfQogCiAvKiBTdWJyb3V0aW5lIHdoaWNoIHJldHVybnMgdGhlIHNtYWxsZXN0IGtleSBpbiBhIGZvciB3aGljaCBiJ3MgdmFsdWUKQEAgLTE2MDYsMTIzICsxNjA2LDEyMyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGNoYXJhY3Rlcml6ZShQeURpY3RPYmplY3QgKmEsIFB5RGljdE9iamVjdCAqYiwgUHlPYmplY3QgKipwdmFsKQogewotCVB5T2JqZWN0ICpha2V5ID0gTlVMTDsgLyogc21hbGxlc3Qga2V5IGluIGEgcy50LiBhW2FrZXldICE9IGJbYWtleV0gKi8KLQlQeU9iamVjdCAqYXZhbCA9IE5VTEw7IC8qIGFbYWtleV0gKi8KLQlQeV9zc2l6ZV90IGk7Ci0JaW50IGNtcDsKKyAgICBQeU9iamVjdCAqYWtleSA9IE5VTEw7IC8qIHNtYWxsZXN0IGtleSBpbiBhIHMudC4gYVtha2V5XSAhPSBiW2FrZXldICovCisgICAgUHlPYmplY3QgKmF2YWwgPSBOVUxMOyAvKiBhW2FrZXldICovCisgICAgUHlfc3NpemVfdCBpOworICAgIGludCBjbXA7CiAKLQlmb3IgKGkgPSAwOyBpIDw9IGEtPm1hX21hc2s7IGkrKykgewotCQlQeU9iamVjdCAqdGhpc2tleSwgKnRoaXNhdmFsLCAqdGhpc2J2YWw7Ci0JCWlmIChhLT5tYV90YWJsZVtpXS5tZV92YWx1ZSA9PSBOVUxMKQotCQkJY29udGludWU7Ci0JCXRoaXNrZXkgPSBhLT5tYV90YWJsZVtpXS5tZV9rZXk7Ci0JCVB5X0lOQ1JFRih0aGlza2V5KTsgIC8qIGtlZXAgYWxpdmUgYWNyb3NzIGNvbXBhcmVzICovCi0JCWlmIChha2V5ICE9IE5VTEwpIHsKLQkJCWNtcCA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChha2V5LCB0aGlza2V5LCBQeV9MVCk7Ci0JCQlpZiAoY21wIDwgMCkgewotCQkJCVB5X0RFQ1JFRih0aGlza2V5KTsKLQkJCQlnb3RvIEZhaWw7Ci0JCQl9Ci0JCQlpZiAoY21wID4gMCB8fAotCQkJICAgIGkgPiBhLT5tYV9tYXNrIHx8Ci0JCQkgICAgYS0+bWFfdGFibGVbaV0ubWVfdmFsdWUgPT0gTlVMTCkKLQkJCXsKLQkJCQkvKiBOb3QgdGhlICpzbWFsbGVzdCogYSBrZXk7IG9yIG1heWJlIGl0IGlzCi0JCQkJICogYnV0IHRoZSBjb21wYXJlIHNocnVuayB0aGUgZGljdCBzbyB3ZSBjYW4ndAotCQkJCSAqIGZpbmQgaXRzIGFzc29jaWF0ZWQgdmFsdWUgYW55bW9yZTsgb3IKLQkJCQkgKiBtYXliZSBpdCBpcyBidXQgdGhlIGNvbXBhcmUgZGVsZXRlZCB0aGUKLQkJCQkgKiBhW3RoaXNrZXldIGVudHJ5LgotCQkJCSAqLwotCQkJCVB5X0RFQ1JFRih0aGlza2V5KTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJfQorICAgIGZvciAoaSA9IDA7IGkgPD0gYS0+bWFfbWFzazsgaSsrKSB7CisgICAgICAgIFB5T2JqZWN0ICp0aGlza2V5LCAqdGhpc2F2YWwsICp0aGlzYnZhbDsKKyAgICAgICAgaWYgKGEtPm1hX3RhYmxlW2ldLm1lX3ZhbHVlID09IE5VTEwpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgdGhpc2tleSA9IGEtPm1hX3RhYmxlW2ldLm1lX2tleTsKKyAgICAgICAgUHlfSU5DUkVGKHRoaXNrZXkpOyAgLyoga2VlcCBhbGl2ZSBhY3Jvc3MgY29tcGFyZXMgKi8KKyAgICAgICAgaWYgKGFrZXkgIT0gTlVMTCkgeworICAgICAgICAgICAgY21wID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKGFrZXksIHRoaXNrZXksIFB5X0xUKTsKKyAgICAgICAgICAgIGlmIChjbXAgPCAwKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHRoaXNrZXkpOworICAgICAgICAgICAgICAgIGdvdG8gRmFpbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjbXAgPiAwIHx8CisgICAgICAgICAgICAgICAgaSA+IGEtPm1hX21hc2sgfHwKKyAgICAgICAgICAgICAgICBhLT5tYV90YWJsZVtpXS5tZV92YWx1ZSA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIE5vdCB0aGUgKnNtYWxsZXN0KiBhIGtleTsgb3IgbWF5YmUgaXQgaXMKKyAgICAgICAgICAgICAgICAgKiBidXQgdGhlIGNvbXBhcmUgc2hydW5rIHRoZSBkaWN0IHNvIHdlIGNhbid0CisgICAgICAgICAgICAgICAgICogZmluZCBpdHMgYXNzb2NpYXRlZCB2YWx1ZSBhbnltb3JlOyBvcgorICAgICAgICAgICAgICAgICAqIG1heWJlIGl0IGlzIGJ1dCB0aGUgY29tcGFyZSBkZWxldGVkIHRoZQorICAgICAgICAgICAgICAgICAqIGFbdGhpc2tleV0gZW50cnkuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHRoaXNrZXkpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJLyogQ29tcGFyZSBhW3RoaXNrZXldIHRvIGJbdGhpc2tleV07IGNtcCA8LSB0cnVlIGlmZiBlcXVhbC4gKi8KLQkJdGhpc2F2YWwgPSBhLT5tYV90YWJsZVtpXS5tZV92YWx1ZTsKLQkJYXNzZXJ0KHRoaXNhdmFsKTsKLQkJUHlfSU5DUkVGKHRoaXNhdmFsKTsgICAvKiBrZWVwIGFsaXZlICovCi0JCXRoaXNidmFsID0gUHlEaWN0X0dldEl0ZW0oKFB5T2JqZWN0ICopYiwgdGhpc2tleSk7Ci0JCWlmICh0aGlzYnZhbCA9PSBOVUxMKQotCQkJY21wID0gMDsKLQkJZWxzZSB7Ci0JCQkvKiBib3RoIGRpY3RzIGhhdmUgdGhpc2tleTogIHNhbWUgdmFsdWVzPyAqLwotCQkJY21wID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKAotCQkJCQkJdGhpc2F2YWwsIHRoaXNidmFsLCBQeV9FUSk7Ci0JCQlpZiAoY21wIDwgMCkgewotCQkgICAgCQlQeV9ERUNSRUYodGhpc2tleSk7Ci0JCSAgICAJCVB5X0RFQ1JFRih0aGlzYXZhbCk7Ci0JCSAgICAJCWdvdG8gRmFpbDsKLQkJCX0KLQkJfQotCQlpZiAoY21wID09IDApIHsKLQkJCS8qIE5ldyB3aW5uZXIuICovCi0JCQlQeV9YREVDUkVGKGFrZXkpOwotCQkJUHlfWERFQ1JFRihhdmFsKTsKLQkJCWFrZXkgPSB0aGlza2V5OwotCQkJYXZhbCA9IHRoaXNhdmFsOwotCQl9Ci0JCWVsc2UgewotCQkJUHlfREVDUkVGKHRoaXNrZXkpOwotCQkJUHlfREVDUkVGKHRoaXNhdmFsKTsKLQkJfQotCX0KLQkqcHZhbCA9IGF2YWw7Ci0JcmV0dXJuIGFrZXk7CisgICAgICAgIC8qIENvbXBhcmUgYVt0aGlza2V5XSB0byBiW3RoaXNrZXldOyBjbXAgPC0gdHJ1ZSBpZmYgZXF1YWwuICovCisgICAgICAgIHRoaXNhdmFsID0gYS0+bWFfdGFibGVbaV0ubWVfdmFsdWU7CisgICAgICAgIGFzc2VydCh0aGlzYXZhbCk7CisgICAgICAgIFB5X0lOQ1JFRih0aGlzYXZhbCk7ICAgLyoga2VlcCBhbGl2ZSAqLworICAgICAgICB0aGlzYnZhbCA9IFB5RGljdF9HZXRJdGVtKChQeU9iamVjdCAqKWIsIHRoaXNrZXkpOworICAgICAgICBpZiAodGhpc2J2YWwgPT0gTlVMTCkKKyAgICAgICAgICAgIGNtcCA9IDA7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLyogYm90aCBkaWN0cyBoYXZlIHRoaXNrZXk6ICBzYW1lIHZhbHVlcz8gKi8KKyAgICAgICAgICAgIGNtcCA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNhdmFsLCB0aGlzYnZhbCwgUHlfRVEpOworICAgICAgICAgICAgaWYgKGNtcCA8IDApIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYodGhpc2tleSk7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHRoaXNhdmFsKTsKKyAgICAgICAgICAgICAgICBnb3RvIEZhaWw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNtcCA9PSAwKSB7CisgICAgICAgICAgICAvKiBOZXcgd2lubmVyLiAqLworICAgICAgICAgICAgUHlfWERFQ1JFRihha2V5KTsKKyAgICAgICAgICAgIFB5X1hERUNSRUYoYXZhbCk7CisgICAgICAgICAgICBha2V5ID0gdGhpc2tleTsKKyAgICAgICAgICAgIGF2YWwgPSB0aGlzYXZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih0aGlza2V5KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih0aGlzYXZhbCk7CisgICAgICAgIH0KKyAgICB9CisgICAgKnB2YWwgPSBhdmFsOworICAgIHJldHVybiBha2V5OwogCiBGYWlsOgotCVB5X1hERUNSRUYoYWtleSk7Ci0JUHlfWERFQ1JFRihhdmFsKTsKLQkqcHZhbCA9IE5VTEw7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlfWERFQ1JFRihha2V5KTsKKyAgICBQeV9YREVDUkVGKGF2YWwpOworICAgICpwdmFsID0gTlVMTDsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIGludAogZGljdF9jb21wYXJlKFB5RGljdE9iamVjdCAqYSwgUHlEaWN0T2JqZWN0ICpiKQogewotCVB5T2JqZWN0ICphZGlmZiwgKmJkaWZmLCAqYXZhbCwgKmJ2YWw7Ci0JaW50IHJlczsKKyAgICBQeU9iamVjdCAqYWRpZmYsICpiZGlmZiwgKmF2YWwsICpidmFsOworICAgIGludCByZXM7CiAKLQkvKiBDb21wYXJlIGxlbmd0aHMgZmlyc3QgKi8KLQlpZiAoYS0+bWFfdXNlZCA8IGItPm1hX3VzZWQpCi0JCXJldHVybiAtMTsJLyogYSBpcyBzaG9ydGVyICovCi0JZWxzZSBpZiAoYS0+bWFfdXNlZCA+IGItPm1hX3VzZWQpCi0JCXJldHVybiAxOwkvKiBiIGlzIHNob3J0ZXIgKi8KKyAgICAvKiBDb21wYXJlIGxlbmd0aHMgZmlyc3QgKi8KKyAgICBpZiAoYS0+bWFfdXNlZCA8IGItPm1hX3VzZWQpCisgICAgICAgIHJldHVybiAtMTsgICAgICAgICAgICAgIC8qIGEgaXMgc2hvcnRlciAqLworICAgIGVsc2UgaWYgKGEtPm1hX3VzZWQgPiBiLT5tYV91c2VkKQorICAgICAgICByZXR1cm4gMTsgICAgICAgICAgICAgICAvKiBiIGlzIHNob3J0ZXIgKi8KIAotCS8qIFNhbWUgbGVuZ3RoIC0tIGNoZWNrIGFsbCBrZXlzICovCi0JYmRpZmYgPSBidmFsID0gTlVMTDsKLQlhZGlmZiA9IGNoYXJhY3Rlcml6ZShhLCBiLCAmYXZhbCk7Ci0JaWYgKGFkaWZmID09IE5VTEwpIHsKLQkJYXNzZXJ0KCFhdmFsKTsKLQkJLyogRWl0aGVyIGFuIGVycm9yLCBvciBhIGlzIGEgc3Vic2V0IHdpdGggdGhlIHNhbWUgbGVuZ3RoIHNvCi0JCSAqIG11c3QgYmUgZXF1YWwuCi0JCSAqLwotCQlyZXMgPSBQeUVycl9PY2N1cnJlZCgpID8gLTEgOiAwOwotCQlnb3RvIEZpbmlzaGVkOwotCX0KLQliZGlmZiA9IGNoYXJhY3Rlcml6ZShiLCBhLCAmYnZhbCk7Ci0JaWYgKGJkaWZmID09IE5VTEwgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewotCQlhc3NlcnQoIWJ2YWwpOwotCQlyZXMgPSAtMTsKLQkJZ290byBGaW5pc2hlZDsKLQl9Ci0JcmVzID0gMDsKLQlpZiAoYmRpZmYpIHsKLQkJLyogYmRpZmYgPT0gTlVMTCAic2hvdWxkIGJlIiBpbXBvc3NpYmxlIG5vdywgYnV0IHBlcmhhcHMKLQkJICogdGhlIGxhc3QgY29tcGFyaXNvbiBkb25lIGJ5IHRoZSBjaGFyYWN0ZXJpemUoKSBvbiBhIGhhZAotCQkgKiB0aGUgc2lkZSBlZmZlY3Qgb2YgbWFraW5nIHRoZSBkaWN0cyBlcXVhbCEKLQkJICovCi0JCXJlcyA9IFB5T2JqZWN0X0NvbXBhcmUoYWRpZmYsIGJkaWZmKTsKLQl9Ci0JaWYgKHJlcyA9PSAwICYmIGJ2YWwgIT0gTlVMTCkKLQkJcmVzID0gUHlPYmplY3RfQ29tcGFyZShhdmFsLCBidmFsKTsKKyAgICAvKiBTYW1lIGxlbmd0aCAtLSBjaGVjayBhbGwga2V5cyAqLworICAgIGJkaWZmID0gYnZhbCA9IE5VTEw7CisgICAgYWRpZmYgPSBjaGFyYWN0ZXJpemUoYSwgYiwgJmF2YWwpOworICAgIGlmIChhZGlmZiA9PSBOVUxMKSB7CisgICAgICAgIGFzc2VydCghYXZhbCk7CisgICAgICAgIC8qIEVpdGhlciBhbiBlcnJvciwgb3IgYSBpcyBhIHN1YnNldCB3aXRoIHRoZSBzYW1lIGxlbmd0aCBzbworICAgICAgICAgKiBtdXN0IGJlIGVxdWFsLgorICAgICAgICAgKi8KKyAgICAgICAgcmVzID0gUHlFcnJfT2NjdXJyZWQoKSA/IC0xIDogMDsKKyAgICAgICAgZ290byBGaW5pc2hlZDsKKyAgICB9CisgICAgYmRpZmYgPSBjaGFyYWN0ZXJpemUoYiwgYSwgJmJ2YWwpOworICAgIGlmIChiZGlmZiA9PSBOVUxMICYmIFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgYXNzZXJ0KCFidmFsKTsKKyAgICAgICAgcmVzID0gLTE7CisgICAgICAgIGdvdG8gRmluaXNoZWQ7CisgICAgfQorICAgIHJlcyA9IDA7CisgICAgaWYgKGJkaWZmKSB7CisgICAgICAgIC8qIGJkaWZmID09IE5VTEwgInNob3VsZCBiZSIgaW1wb3NzaWJsZSBub3csIGJ1dCBwZXJoYXBzCisgICAgICAgICAqIHRoZSBsYXN0IGNvbXBhcmlzb24gZG9uZSBieSB0aGUgY2hhcmFjdGVyaXplKCkgb24gYSBoYWQKKyAgICAgICAgICogdGhlIHNpZGUgZWZmZWN0IG9mIG1ha2luZyB0aGUgZGljdHMgZXF1YWwhCisgICAgICAgICAqLworICAgICAgICByZXMgPSBQeU9iamVjdF9Db21wYXJlKGFkaWZmLCBiZGlmZik7CisgICAgfQorICAgIGlmIChyZXMgPT0gMCAmJiBidmFsICE9IE5VTEwpCisgICAgICAgIHJlcyA9IFB5T2JqZWN0X0NvbXBhcmUoYXZhbCwgYnZhbCk7CiAKIEZpbmlzaGVkOgotCVB5X1hERUNSRUYoYWRpZmYpOwotCVB5X1hERUNSRUYoYmRpZmYpOwotCVB5X1hERUNSRUYoYXZhbCk7Ci0JUHlfWERFQ1JFRihidmFsKTsKLQlyZXR1cm4gcmVzOworICAgIFB5X1hERUNSRUYoYWRpZmYpOworICAgIFB5X1hERUNSRUYoYmRpZmYpOworICAgIFB5X1hERUNSRUYoYXZhbCk7CisgICAgUHlfWERFQ1JFRihidmFsKTsKKyAgICByZXR1cm4gcmVzOwogfQogCiAvKiBSZXR1cm4gMSBpZiBkaWN0cyBlcXVhbCwgMCBpZiBub3QsIC0xIGlmIGVycm9yLgpAQCAtMTczMiwyODQgKzE3MzIsMjg0IEBACiBzdGF0aWMgaW50CiBkaWN0X2VxdWFsKFB5RGljdE9iamVjdCAqYSwgUHlEaWN0T2JqZWN0ICpiKQogewotCVB5X3NzaXplX3QgaTsKKyAgICBQeV9zc2l6ZV90IGk7CiAKLQlpZiAoYS0+bWFfdXNlZCAhPSBiLT5tYV91c2VkKQotCQkvKiBjYW4ndCBiZSBlcXVhbCBpZiAjIG9mIGVudHJpZXMgZGlmZmVyICovCi0JCXJldHVybiAwOworICAgIGlmIChhLT5tYV91c2VkICE9IGItPm1hX3VzZWQpCisgICAgICAgIC8qIGNhbid0IGJlIGVxdWFsIGlmICMgb2YgZW50cmllcyBkaWZmZXIgKi8KKyAgICAgICAgcmV0dXJuIDA7CiAKLQkvKiBTYW1lICMgb2YgZW50cmllcyAtLSBjaGVjayBhbGwgb2YgJ2VtLiAgRXhpdCBlYXJseSBvbiBhbnkgZGlmZi4gKi8KLQlmb3IgKGkgPSAwOyBpIDw9IGEtPm1hX21hc2s7IGkrKykgewotCQlQeU9iamVjdCAqYXZhbCA9IGEtPm1hX3RhYmxlW2ldLm1lX3ZhbHVlOwotCQlpZiAoYXZhbCAhPSBOVUxMKSB7Ci0JCQlpbnQgY21wOwotCQkJUHlPYmplY3QgKmJ2YWw7Ci0JCQlQeU9iamVjdCAqa2V5ID0gYS0+bWFfdGFibGVbaV0ubWVfa2V5OwotCQkJLyogdGVtcG9yYXJpbHkgYnVtcCBhdmFsJ3MgcmVmY291bnQgdG8gZW5zdXJlIGl0IHN0YXlzCi0JCQkgICBhbGl2ZSB1bnRpbCB3ZSdyZSBkb25lIHdpdGggaXQgKi8KLQkJCVB5X0lOQ1JFRihhdmFsKTsKLQkJCS8qIGRpdHRvIGZvciBrZXkgKi8KLQkJCVB5X0lOQ1JFRihrZXkpOwotCQkJYnZhbCA9IFB5RGljdF9HZXRJdGVtKChQeU9iamVjdCAqKWIsIGtleSk7Ci0JCQlQeV9ERUNSRUYoa2V5KTsKLQkJCWlmIChidmFsID09IE5VTEwpIHsKLQkJCQlQeV9ERUNSRUYoYXZhbCk7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQljbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woYXZhbCwgYnZhbCwgUHlfRVEpOwotCQkJUHlfREVDUkVGKGF2YWwpOwotCQkJaWYgKGNtcCA8PSAwKSAgLyogZXJyb3Igb3Igbm90IGVxdWFsICovCi0JCQkJcmV0dXJuIGNtcDsKLSAJCX0KLQl9Ci0JcmV0dXJuIDE7CisgICAgLyogU2FtZSAjIG9mIGVudHJpZXMgLS0gY2hlY2sgYWxsIG9mICdlbS4gIEV4aXQgZWFybHkgb24gYW55IGRpZmYuICovCisgICAgZm9yIChpID0gMDsgaSA8PSBhLT5tYV9tYXNrOyBpKyspIHsKKyAgICAgICAgUHlPYmplY3QgKmF2YWwgPSBhLT5tYV90YWJsZVtpXS5tZV92YWx1ZTsKKyAgICAgICAgaWYgKGF2YWwgIT0gTlVMTCkgeworICAgICAgICAgICAgaW50IGNtcDsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpidmFsOworICAgICAgICAgICAgUHlPYmplY3QgKmtleSA9IGEtPm1hX3RhYmxlW2ldLm1lX2tleTsKKyAgICAgICAgICAgIC8qIHRlbXBvcmFyaWx5IGJ1bXAgYXZhbCdzIHJlZmNvdW50IHRvIGVuc3VyZSBpdCBzdGF5cworICAgICAgICAgICAgICAgYWxpdmUgdW50aWwgd2UncmUgZG9uZSB3aXRoIGl0ICovCisgICAgICAgICAgICBQeV9JTkNSRUYoYXZhbCk7CisgICAgICAgICAgICAvKiBkaXR0byBmb3Iga2V5ICovCisgICAgICAgICAgICBQeV9JTkNSRUYoa2V5KTsKKyAgICAgICAgICAgIGJ2YWwgPSBQeURpY3RfR2V0SXRlbSgoUHlPYmplY3QgKiliLCBrZXkpOworICAgICAgICAgICAgUHlfREVDUkVGKGtleSk7CisgICAgICAgICAgICBpZiAoYnZhbCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGF2YWwpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY21wID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKGF2YWwsIGJ2YWwsIFB5X0VRKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihhdmFsKTsKKyAgICAgICAgICAgIGlmIChjbXAgPD0gMCkgIC8qIGVycm9yIG9yIG5vdCBlcXVhbCAqLworICAgICAgICAgICAgICAgIHJldHVybiBjbXA7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDE7CiAgfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZGljdF9yaWNoY29tcGFyZShQeU9iamVjdCAqdiwgUHlPYmplY3QgKncsIGludCBvcCkKIHsKLQlpbnQgY21wOwotCVB5T2JqZWN0ICpyZXM7CisgICAgaW50IGNtcDsKKyAgICBQeU9iamVjdCAqcmVzOwogCi0JaWYgKCFQeURpY3RfQ2hlY2sodikgfHwgIVB5RGljdF9DaGVjayh3KSkgewotCQlyZXMgPSBQeV9Ob3RJbXBsZW1lbnRlZDsKLQl9Ci0JZWxzZSBpZiAob3AgPT0gUHlfRVEgfHwgb3AgPT0gUHlfTkUpIHsKLQkJY21wID0gZGljdF9lcXVhbCgoUHlEaWN0T2JqZWN0ICopdiwgKFB5RGljdE9iamVjdCAqKXcpOwotCQlpZiAoY21wIDwgMCkKLQkJCXJldHVybiBOVUxMOwotCQlyZXMgPSAoY21wID09IChvcCA9PSBQeV9FUSkpID8gUHlfVHJ1ZSA6IFB5X0ZhbHNlOwotCX0KLQllbHNlIHsKLQkJLyogUHkzSyB3YXJuaW5nIGlmIGNvbXBhcmlzb24gaXNuJ3QgPT0gb3IgIT0gICovCi0JCWlmIChQeUVycl9XYXJuUHkzaygiZGljdCBpbmVxdWFsaXR5IGNvbXBhcmlzb25zIG5vdCBzdXBwb3J0ZWQgIgotCQkJCSAgICJpbiAzLngiLCAxKSA8IDApIHsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCXJlcyA9IFB5X05vdEltcGxlbWVudGVkOwotCX0KLQlQeV9JTkNSRUYocmVzKTsKLQlyZXR1cm4gcmVzOworICAgIGlmICghUHlEaWN0X0NoZWNrKHYpIHx8ICFQeURpY3RfQ2hlY2sodykpIHsKKyAgICAgICAgcmVzID0gUHlfTm90SW1wbGVtZW50ZWQ7CisgICAgfQorICAgIGVsc2UgaWYgKG9wID09IFB5X0VRIHx8IG9wID09IFB5X05FKSB7CisgICAgICAgIGNtcCA9IGRpY3RfZXF1YWwoKFB5RGljdE9iamVjdCAqKXYsIChQeURpY3RPYmplY3QgKil3KTsKKyAgICAgICAgaWYgKGNtcCA8IDApCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgcmVzID0gKGNtcCA9PSAob3AgPT0gUHlfRVEpKSA/IFB5X1RydWUgOiBQeV9GYWxzZTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8qIFB5M0sgd2FybmluZyBpZiBjb21wYXJpc29uIGlzbid0ID09IG9yICE9ICAqLworICAgICAgICBpZiAoUHlFcnJfV2FyblB5M2soImRpY3QgaW5lcXVhbGl0eSBjb21wYXJpc29ucyBub3Qgc3VwcG9ydGVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbiAzLngiLCAxKSA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHJlcyA9IFB5X05vdEltcGxlbWVudGVkOworICAgIH0KKyAgICBQeV9JTkNSRUYocmVzKTsKKyAgICByZXR1cm4gcmVzOwogIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRpY3RfY29udGFpbnMocmVnaXN0ZXIgUHlEaWN0T2JqZWN0ICptcCwgUHlPYmplY3QgKmtleSkKIHsKLQlsb25nIGhhc2g7Ci0JUHlEaWN0RW50cnkgKmVwOworICAgIGxvbmcgaGFzaDsKKyAgICBQeURpY3RFbnRyeSAqZXA7CiAKLQlpZiAoIVB5U3RyaW5nX0NoZWNrRXhhY3Qoa2V5KSB8fAotCSAgICAoaGFzaCA9ICgoUHlTdHJpbmdPYmplY3QgKikga2V5KS0+b2Jfc2hhc2gpID09IC0xKSB7Ci0JCWhhc2ggPSBQeU9iamVjdF9IYXNoKGtleSk7Ci0JCWlmIChoYXNoID09IC0xKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCWVwID0gKG1wLT5tYV9sb29rdXApKG1wLCBrZXksIGhhc2gpOwotCWlmIChlcCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKGVwLT5tZV92YWx1ZSAhPSBOVUxMKTsKKyAgICBpZiAoIVB5U3RyaW5nX0NoZWNrRXhhY3Qoa2V5KSB8fAorICAgICAgICAoaGFzaCA9ICgoUHlTdHJpbmdPYmplY3QgKikga2V5KS0+b2Jfc2hhc2gpID09IC0xKSB7CisgICAgICAgIGhhc2ggPSBQeU9iamVjdF9IYXNoKGtleSk7CisgICAgICAgIGlmIChoYXNoID09IC0xKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGVwID0gKG1wLT5tYV9sb29rdXApKG1wLCBrZXksIGhhc2gpOworICAgIGlmIChlcCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKGVwLT5tZV92YWx1ZSAhPSBOVUxMKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRpY3RfaGFzX2tleShyZWdpc3RlciBQeURpY3RPYmplY3QgKm1wLCBQeU9iamVjdCAqa2V5KQogewotCWlmIChQeUVycl9XYXJuUHkzaygiZGljdC5oYXNfa2V5KCkgbm90IHN1cHBvcnRlZCBpbiAzLng7ICIKLQkJCSAgICJ1c2UgdGhlIGluIG9wZXJhdG9yIiwgMSkgPCAwKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gZGljdF9jb250YWlucyhtcCwga2V5KTsKKyAgICBpZiAoUHlFcnJfV2FyblB5M2soImRpY3QuaGFzX2tleSgpIG5vdCBzdXBwb3J0ZWQgaW4gMy54OyAiCisgICAgICAgICAgICAgICAgICAgICAgICJ1c2UgdGhlIGluIG9wZXJhdG9yIiwgMSkgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gZGljdF9jb250YWlucyhtcCwga2V5KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRpY3RfZ2V0KHJlZ2lzdGVyIFB5RGljdE9iamVjdCAqbXAsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICprZXk7Ci0JUHlPYmplY3QgKmZhaWxvYmogPSBQeV9Ob25lOwotCVB5T2JqZWN0ICp2YWwgPSBOVUxMOwotCWxvbmcgaGFzaDsKLQlQeURpY3RFbnRyeSAqZXA7CisgICAgUHlPYmplY3QgKmtleTsKKyAgICBQeU9iamVjdCAqZmFpbG9iaiA9IFB5X05vbmU7CisgICAgUHlPYmplY3QgKnZhbCA9IE5VTEw7CisgICAgbG9uZyBoYXNoOworICAgIFB5RGljdEVudHJ5ICplcDsKIAotCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImdldCIsIDEsIDIsICZrZXksICZmYWlsb2JqKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiZ2V0IiwgMSwgMiwgJmtleSwgJmZhaWxvYmopKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmICghUHlTdHJpbmdfQ2hlY2tFeGFjdChrZXkpIHx8Ci0JICAgIChoYXNoID0gKChQeVN0cmluZ09iamVjdCAqKSBrZXkpLT5vYl9zaGFzaCkgPT0gLTEpIHsKLQkJaGFzaCA9IFB5T2JqZWN0X0hhc2goa2V5KTsKLQkJaWYgKGhhc2ggPT0gLTEpCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZXAgPSAobXAtPm1hX2xvb2t1cCkobXAsIGtleSwgaGFzaCk7Ci0JaWYgKGVwID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXZhbCA9IGVwLT5tZV92YWx1ZTsKLQlpZiAodmFsID09IE5VTEwpCi0JCXZhbCA9IGZhaWxvYmo7Ci0JUHlfSU5DUkVGKHZhbCk7Ci0JcmV0dXJuIHZhbDsKKyAgICBpZiAoIVB5U3RyaW5nX0NoZWNrRXhhY3Qoa2V5KSB8fAorICAgICAgICAoaGFzaCA9ICgoUHlTdHJpbmdPYmplY3QgKikga2V5KS0+b2Jfc2hhc2gpID09IC0xKSB7CisgICAgICAgIGhhc2ggPSBQeU9iamVjdF9IYXNoKGtleSk7CisgICAgICAgIGlmIChoYXNoID09IC0xKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGVwID0gKG1wLT5tYV9sb29rdXApKG1wLCBrZXksIGhhc2gpOworICAgIGlmIChlcCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB2YWwgPSBlcC0+bWVfdmFsdWU7CisgICAgaWYgKHZhbCA9PSBOVUxMKQorICAgICAgICB2YWwgPSBmYWlsb2JqOworICAgIFB5X0lOQ1JFRih2YWwpOworICAgIHJldHVybiB2YWw7CiB9CiAKIAogc3RhdGljIFB5T2JqZWN0ICoKIGRpY3Rfc2V0ZGVmYXVsdChyZWdpc3RlciBQeURpY3RPYmplY3QgKm1wLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqa2V5OwotCVB5T2JqZWN0ICpmYWlsb2JqID0gUHlfTm9uZTsKLQlQeU9iamVjdCAqdmFsID0gTlVMTDsKLQlsb25nIGhhc2g7Ci0JUHlEaWN0RW50cnkgKmVwOworICAgIFB5T2JqZWN0ICprZXk7CisgICAgUHlPYmplY3QgKmZhaWxvYmogPSBQeV9Ob25lOworICAgIFB5T2JqZWN0ICp2YWwgPSBOVUxMOworICAgIGxvbmcgaGFzaDsKKyAgICBQeURpY3RFbnRyeSAqZXA7CiAKLQlpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJzZXRkZWZhdWx0IiwgMSwgMiwgJmtleSwgJmZhaWxvYmopKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJzZXRkZWZhdWx0IiwgMSwgMiwgJmtleSwgJmZhaWxvYmopKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmICghUHlTdHJpbmdfQ2hlY2tFeGFjdChrZXkpIHx8Ci0JICAgIChoYXNoID0gKChQeVN0cmluZ09iamVjdCAqKSBrZXkpLT5vYl9zaGFzaCkgPT0gLTEpIHsKLQkJaGFzaCA9IFB5T2JqZWN0X0hhc2goa2V5KTsKLQkJaWYgKGhhc2ggPT0gLTEpCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZXAgPSAobXAtPm1hX2xvb2t1cCkobXAsIGtleSwgaGFzaCk7Ci0JaWYgKGVwID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXZhbCA9IGVwLT5tZV92YWx1ZTsKLQlpZiAodmFsID09IE5VTEwpIHsKLQkJdmFsID0gZmFpbG9iajsKLQkJaWYgKFB5RGljdF9TZXRJdGVtKChQeU9iamVjdCopbXAsIGtleSwgZmFpbG9iaikpCi0JCQl2YWwgPSBOVUxMOwotCX0KLQlQeV9YSU5DUkVGKHZhbCk7Ci0JcmV0dXJuIHZhbDsKKyAgICBpZiAoIVB5U3RyaW5nX0NoZWNrRXhhY3Qoa2V5KSB8fAorICAgICAgICAoaGFzaCA9ICgoUHlTdHJpbmdPYmplY3QgKikga2V5KS0+b2Jfc2hhc2gpID09IC0xKSB7CisgICAgICAgIGhhc2ggPSBQeU9iamVjdF9IYXNoKGtleSk7CisgICAgICAgIGlmIChoYXNoID09IC0xKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGVwID0gKG1wLT5tYV9sb29rdXApKG1wLCBrZXksIGhhc2gpOworICAgIGlmIChlcCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB2YWwgPSBlcC0+bWVfdmFsdWU7CisgICAgaWYgKHZhbCA9PSBOVUxMKSB7CisgICAgICAgIHZhbCA9IGZhaWxvYmo7CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbSgoUHlPYmplY3QqKW1wLCBrZXksIGZhaWxvYmopKQorICAgICAgICAgICAgdmFsID0gTlVMTDsKKyAgICB9CisgICAgUHlfWElOQ1JFRih2YWwpOworICAgIHJldHVybiB2YWw7CiB9CiAKIAogc3RhdGljIFB5T2JqZWN0ICoKIGRpY3RfY2xlYXIocmVnaXN0ZXIgUHlEaWN0T2JqZWN0ICptcCkKIHsKLQlQeURpY3RfQ2xlYXIoKFB5T2JqZWN0ICopbXApOwotCVB5X1JFVFVSTl9OT05FOworICAgIFB5RGljdF9DbGVhcigoUHlPYmplY3QgKiltcCk7CisgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkaWN0X3BvcChQeURpY3RPYmplY3QgKm1wLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGhhc2g7Ci0JUHlEaWN0RW50cnkgKmVwOwotCVB5T2JqZWN0ICpvbGRfdmFsdWUsICpvbGRfa2V5OwotCVB5T2JqZWN0ICprZXksICpkZWZsdCA9IE5VTEw7CisgICAgbG9uZyBoYXNoOworICAgIFB5RGljdEVudHJ5ICplcDsKKyAgICBQeU9iamVjdCAqb2xkX3ZhbHVlLCAqb2xkX2tleTsKKyAgICBQeU9iamVjdCAqa2V5LCAqZGVmbHQgPSBOVUxMOwogCi0JaWYoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJwb3AiLCAxLCAyLCAma2V5LCAmZGVmbHQpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAobXAtPm1hX3VzZWQgPT0gMCkgewotCQlpZiAoZGVmbHQpIHsKLQkJCVB5X0lOQ1JFRihkZWZsdCk7Ci0JCQlyZXR1cm4gZGVmbHQ7Ci0JCX0KLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0tleUVycm9yLAotCQkJCSJwb3AoKTogZGljdGlvbmFyeSBpcyBlbXB0eSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKCFQeVN0cmluZ19DaGVja0V4YWN0KGtleSkgfHwKLQkgICAgKGhhc2ggPSAoKFB5U3RyaW5nT2JqZWN0ICopIGtleSktPm9iX3NoYXNoKSA9PSAtMSkgewotCQloYXNoID0gUHlPYmplY3RfSGFzaChrZXkpOwotCQlpZiAoaGFzaCA9PSAtMSkKLQkJCXJldHVybiBOVUxMOwotCX0KLQllcCA9IChtcC0+bWFfbG9va3VwKShtcCwga2V5LCBoYXNoKTsKLQlpZiAoZXAgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKGVwLT5tZV92YWx1ZSA9PSBOVUxMKSB7Ci0JCWlmIChkZWZsdCkgewotCQkJUHlfSU5DUkVGKGRlZmx0KTsKLQkJCXJldHVybiBkZWZsdDsKLQkJfQotCQlzZXRfa2V5X2Vycm9yKGtleSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlvbGRfa2V5ID0gZXAtPm1lX2tleTsKLQlQeV9JTkNSRUYoZHVtbXkpOwotCWVwLT5tZV9rZXkgPSBkdW1teTsKLQlvbGRfdmFsdWUgPSBlcC0+bWVfdmFsdWU7Ci0JZXAtPm1lX3ZhbHVlID0gTlVMTDsKLQltcC0+bWFfdXNlZC0tOwotCVB5X0RFQ1JFRihvbGRfa2V5KTsKLQlyZXR1cm4gb2xkX3ZhbHVlOworICAgIGlmKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAicG9wIiwgMSwgMiwgJmtleSwgJmRlZmx0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKG1wLT5tYV91c2VkID09IDApIHsKKyAgICAgICAgaWYgKGRlZmx0KSB7CisgICAgICAgICAgICBQeV9JTkNSRUYoZGVmbHQpOworICAgICAgICAgICAgcmV0dXJuIGRlZmx0OworICAgICAgICB9CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19LZXlFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJwb3AoKTogZGljdGlvbmFyeSBpcyBlbXB0eSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKCFQeVN0cmluZ19DaGVja0V4YWN0KGtleSkgfHwKKyAgICAgICAgKGhhc2ggPSAoKFB5U3RyaW5nT2JqZWN0ICopIGtleSktPm9iX3NoYXNoKSA9PSAtMSkgeworICAgICAgICBoYXNoID0gUHlPYmplY3RfSGFzaChrZXkpOworICAgICAgICBpZiAoaGFzaCA9PSAtMSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBlcCA9IChtcC0+bWFfbG9va3VwKShtcCwga2V5LCBoYXNoKTsKKyAgICBpZiAoZXAgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKGVwLT5tZV92YWx1ZSA9PSBOVUxMKSB7CisgICAgICAgIGlmIChkZWZsdCkgeworICAgICAgICAgICAgUHlfSU5DUkVGKGRlZmx0KTsKKyAgICAgICAgICAgIHJldHVybiBkZWZsdDsKKyAgICAgICAgfQorICAgICAgICBzZXRfa2V5X2Vycm9yKGtleSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBvbGRfa2V5ID0gZXAtPm1lX2tleTsKKyAgICBQeV9JTkNSRUYoZHVtbXkpOworICAgIGVwLT5tZV9rZXkgPSBkdW1teTsKKyAgICBvbGRfdmFsdWUgPSBlcC0+bWVfdmFsdWU7CisgICAgZXAtPm1lX3ZhbHVlID0gTlVMTDsKKyAgICBtcC0+bWFfdXNlZC0tOworICAgIFB5X0RFQ1JFRihvbGRfa2V5KTsKKyAgICByZXR1cm4gb2xkX3ZhbHVlOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZGljdF9wb3BpdGVtKFB5RGljdE9iamVjdCAqbXApCiB7Ci0JUHlfc3NpemVfdCBpID0gMDsKLQlQeURpY3RFbnRyeSAqZXA7Ci0JUHlPYmplY3QgKnJlczsKKyAgICBQeV9zc2l6ZV90IGkgPSAwOworICAgIFB5RGljdEVudHJ5ICplcDsKKyAgICBQeU9iamVjdCAqcmVzOwogCi0JLyogQWxsb2NhdGUgdGhlIHJlc3VsdCB0dXBsZSBiZWZvcmUgY2hlY2tpbmcgdGhlIHNpemUuICBCZWxpZXZlIGl0Ci0JICogb3Igbm90LCB0aGlzIGFsbG9jYXRpb24gY291bGQgdHJpZ2dlciBhIGdhcmJhZ2UgY29sbGVjdGlvbiB3aGljaAotCSAqIGNvdWxkIGVtcHR5IHRoZSBkaWN0LCBzbyBpZiB3ZSBjaGVja2VkIHRoZSBzaXplIGZpcnN0IGFuZCB0aGF0Ci0JICogaGFwcGVuZWQsIHRoZSByZXN1bHQgd291bGQgYmUgYW4gaW5maW5pdGUgbG9vcCAoc2VhcmNoaW5nIGZvciBhbgotCSAqIGVudHJ5IHRoYXQgbm8gbG9uZ2VyIGV4aXN0cykuICBOb3RlIHRoYXQgdGhlIHVzdWFsIHBvcGl0ZW0oKQotCSAqIGlkaW9tIGlzICJ3aGlsZSBkOiBrLCB2ID0gZC5wb3BpdGVtKCkiLiBzbyBuZWVkaW5nIHRvIHRocm93IHRoZQotCSAqIHR1cGxlIGF3YXkgaWYgdGhlIGRpY3QgKmlzKiBlbXB0eSBpc24ndCBhIHNpZ25pZmljYW50Ci0JICogaW5lZmZpY2llbmN5IC0tIHBvc3NpYmxlLCBidXQgdW5saWtlbHkgaW4gcHJhY3RpY2UuCi0JICovCi0JcmVzID0gUHlUdXBsZV9OZXcoMik7Ci0JaWYgKHJlcyA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAobXAtPm1hX3VzZWQgPT0gMCkgewotCQlQeV9ERUNSRUYocmVzKTsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0tleUVycm9yLAotCQkJCSJwb3BpdGVtKCk6IGRpY3Rpb25hcnkgaXMgZW1wdHkiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCS8qIFNldCBlcCB0byAidGhlIGZpcnN0IiBkaWN0IGVudHJ5IHdpdGggYSB2YWx1ZS4gIFdlIGFidXNlIHRoZSBoYXNoCi0JICogZmllbGQgb2Ygc2xvdCAwIHRvIGhvbGQgYSBzZWFyY2ggZmluZ2VyOgotCSAqIElmIHNsb3QgMCBoYXMgYSB2YWx1ZSwgdXNlIHNsb3QgMC4KLQkgKiBFbHNlIHNsb3QgMCBpcyBiZWluZyB1c2VkIHRvIGhvbGQgYSBzZWFyY2ggZmluZ2VyLAotCSAqIGFuZCB3ZSB1c2UgaXRzIGhhc2ggdmFsdWUgYXMgdGhlIGZpcnN0IGluZGV4IHRvIGxvb2suCi0JICovCi0JZXAgPSAmbXAtPm1hX3RhYmxlWzBdOwotCWlmIChlcC0+bWVfdmFsdWUgPT0gTlVMTCkgewotCQlpID0gZXAtPm1lX2hhc2g7Ci0JCS8qIFRoZSBoYXNoIGZpZWxkIG1heSBiZSBhIHJlYWwgaGFzaCB2YWx1ZSwgb3IgaXQgbWF5IGJlIGEKLQkJICogbGVnaXQgc2VhcmNoIGZpbmdlciwgb3IgaXQgbWF5IGJlIGEgb25jZS1sZWdpdCBzZWFyY2gKLQkJICogZmluZ2VyIHRoYXQncyBvdXQgb2YgYm91bmRzIG5vdyBiZWNhdXNlIGl0IHdyYXBwZWQgYXJvdW5kCi0JCSAqIG9yIHRoZSB0YWJsZSBzaHJ1bmsgLS0gc2ltcGx5IG1ha2Ugc3VyZSBpdCdzIGluIGJvdW5kcyBub3cuCi0JCSAqLwotCQlpZiAoaSA+IG1wLT5tYV9tYXNrIHx8IGkgPCAxKQotCQkJaSA9IDE7CS8qIHNraXAgc2xvdCAwICovCi0JCXdoaWxlICgoZXAgPSAmbXAtPm1hX3RhYmxlW2ldKS0+bWVfdmFsdWUgPT0gTlVMTCkgewotCQkJaSsrOwotCQkJaWYgKGkgPiBtcC0+bWFfbWFzaykKLQkJCQlpID0gMTsKLQkJfQotCX0KLQlQeVR1cGxlX1NFVF9JVEVNKHJlcywgMCwgZXAtPm1lX2tleSk7Ci0JUHlUdXBsZV9TRVRfSVRFTShyZXMsIDEsIGVwLT5tZV92YWx1ZSk7Ci0JUHlfSU5DUkVGKGR1bW15KTsKLQllcC0+bWVfa2V5ID0gZHVtbXk7Ci0JZXAtPm1lX3ZhbHVlID0gTlVMTDsKLQltcC0+bWFfdXNlZC0tOwotCWFzc2VydChtcC0+bWFfdGFibGVbMF0ubWVfdmFsdWUgPT0gTlVMTCk7Ci0JbXAtPm1hX3RhYmxlWzBdLm1lX2hhc2ggPSBpICsgMTsgIC8qIG5leHQgcGxhY2UgdG8gc3RhcnQgKi8KLQlyZXR1cm4gcmVzOworICAgIC8qIEFsbG9jYXRlIHRoZSByZXN1bHQgdHVwbGUgYmVmb3JlIGNoZWNraW5nIHRoZSBzaXplLiAgQmVsaWV2ZSBpdAorICAgICAqIG9yIG5vdCwgdGhpcyBhbGxvY2F0aW9uIGNvdWxkIHRyaWdnZXIgYSBnYXJiYWdlIGNvbGxlY3Rpb24gd2hpY2gKKyAgICAgKiBjb3VsZCBlbXB0eSB0aGUgZGljdCwgc28gaWYgd2UgY2hlY2tlZCB0aGUgc2l6ZSBmaXJzdCBhbmQgdGhhdAorICAgICAqIGhhcHBlbmVkLCB0aGUgcmVzdWx0IHdvdWxkIGJlIGFuIGluZmluaXRlIGxvb3AgKHNlYXJjaGluZyBmb3IgYW4KKyAgICAgKiBlbnRyeSB0aGF0IG5vIGxvbmdlciBleGlzdHMpLiAgTm90ZSB0aGF0IHRoZSB1c3VhbCBwb3BpdGVtKCkKKyAgICAgKiBpZGlvbSBpcyAid2hpbGUgZDogaywgdiA9IGQucG9waXRlbSgpIi4gc28gbmVlZGluZyB0byB0aHJvdyB0aGUKKyAgICAgKiB0dXBsZSBhd2F5IGlmIHRoZSBkaWN0ICppcyogZW1wdHkgaXNuJ3QgYSBzaWduaWZpY2FudAorICAgICAqIGluZWZmaWNpZW5jeSAtLSBwb3NzaWJsZSwgYnV0IHVubGlrZWx5IGluIHByYWN0aWNlLgorICAgICAqLworICAgIHJlcyA9IFB5VHVwbGVfTmV3KDIpOworICAgIGlmIChyZXMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKG1wLT5tYV91c2VkID09IDApIHsKKyAgICAgICAgUHlfREVDUkVGKHJlcyk7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19LZXlFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJwb3BpdGVtKCk6IGRpY3Rpb25hcnkgaXMgZW1wdHkiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIC8qIFNldCBlcCB0byAidGhlIGZpcnN0IiBkaWN0IGVudHJ5IHdpdGggYSB2YWx1ZS4gIFdlIGFidXNlIHRoZSBoYXNoCisgICAgICogZmllbGQgb2Ygc2xvdCAwIHRvIGhvbGQgYSBzZWFyY2ggZmluZ2VyOgorICAgICAqIElmIHNsb3QgMCBoYXMgYSB2YWx1ZSwgdXNlIHNsb3QgMC4KKyAgICAgKiBFbHNlIHNsb3QgMCBpcyBiZWluZyB1c2VkIHRvIGhvbGQgYSBzZWFyY2ggZmluZ2VyLAorICAgICAqIGFuZCB3ZSB1c2UgaXRzIGhhc2ggdmFsdWUgYXMgdGhlIGZpcnN0IGluZGV4IHRvIGxvb2suCisgICAgICovCisgICAgZXAgPSAmbXAtPm1hX3RhYmxlWzBdOworICAgIGlmIChlcC0+bWVfdmFsdWUgPT0gTlVMTCkgeworICAgICAgICBpID0gZXAtPm1lX2hhc2g7CisgICAgICAgIC8qIFRoZSBoYXNoIGZpZWxkIG1heSBiZSBhIHJlYWwgaGFzaCB2YWx1ZSwgb3IgaXQgbWF5IGJlIGEKKyAgICAgICAgICogbGVnaXQgc2VhcmNoIGZpbmdlciwgb3IgaXQgbWF5IGJlIGEgb25jZS1sZWdpdCBzZWFyY2gKKyAgICAgICAgICogZmluZ2VyIHRoYXQncyBvdXQgb2YgYm91bmRzIG5vdyBiZWNhdXNlIGl0IHdyYXBwZWQgYXJvdW5kCisgICAgICAgICAqIG9yIHRoZSB0YWJsZSBzaHJ1bmsgLS0gc2ltcGx5IG1ha2Ugc3VyZSBpdCdzIGluIGJvdW5kcyBub3cuCisgICAgICAgICAqLworICAgICAgICBpZiAoaSA+IG1wLT5tYV9tYXNrIHx8IGkgPCAxKQorICAgICAgICAgICAgaSA9IDE7ICAgICAgICAgICAgICAvKiBza2lwIHNsb3QgMCAqLworICAgICAgICB3aGlsZSAoKGVwID0gJm1wLT5tYV90YWJsZVtpXSktPm1lX3ZhbHVlID09IE5VTEwpIHsKKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgIGlmIChpID4gbXAtPm1hX21hc2spCisgICAgICAgICAgICAgICAgaSA9IDE7CisgICAgICAgIH0KKyAgICB9CisgICAgUHlUdXBsZV9TRVRfSVRFTShyZXMsIDAsIGVwLT5tZV9rZXkpOworICAgIFB5VHVwbGVfU0VUX0lURU0ocmVzLCAxLCBlcC0+bWVfdmFsdWUpOworICAgIFB5X0lOQ1JFRihkdW1teSk7CisgICAgZXAtPm1lX2tleSA9IGR1bW15OworICAgIGVwLT5tZV92YWx1ZSA9IE5VTEw7CisgICAgbXAtPm1hX3VzZWQtLTsKKyAgICBhc3NlcnQobXAtPm1hX3RhYmxlWzBdLm1lX3ZhbHVlID09IE5VTEwpOworICAgIG1wLT5tYV90YWJsZVswXS5tZV9oYXNoID0gaSArIDE7ICAvKiBuZXh0IHBsYWNlIHRvIHN0YXJ0ICovCisgICAgcmV0dXJuIHJlczsKIH0KIAogc3RhdGljIGludAogZGljdF90cmF2ZXJzZShQeU9iamVjdCAqb3AsIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotCVB5X3NzaXplX3QgaSA9IDA7Ci0JUHlPYmplY3QgKnBrOwotCVB5T2JqZWN0ICpwdjsKKyAgICBQeV9zc2l6ZV90IGkgPSAwOworICAgIFB5T2JqZWN0ICpwazsKKyAgICBQeU9iamVjdCAqcHY7CiAKLQl3aGlsZSAoUHlEaWN0X05leHQob3AsICZpLCAmcGssICZwdikpIHsKLQkJUHlfVklTSVQocGspOwotCQlQeV9WSVNJVChwdik7Ci0JfQotCXJldHVybiAwOworICAgIHdoaWxlIChQeURpY3RfTmV4dChvcCwgJmksICZwaywgJnB2KSkgeworICAgICAgICBQeV9WSVNJVChwayk7CisgICAgICAgIFB5X1ZJU0lUKHB2KTsKKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIGRpY3RfdHBfY2xlYXIoUHlPYmplY3QgKm9wKQogewotCVB5RGljdF9DbGVhcihvcCk7Ci0JcmV0dXJuIDA7CisgICAgUHlEaWN0X0NsZWFyKG9wKTsKKyAgICByZXR1cm4gMDsKIH0KIAogCkBAIC0yMDIxLDMwICsyMDIxLDMwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZGljdF9pdGVya2V5cyhQeURpY3RPYmplY3QgKmRpY3QpCiB7Ci0JcmV0dXJuIGRpY3RpdGVyX25ldyhkaWN0LCAmUHlEaWN0SXRlcktleV9UeXBlKTsKKyAgICByZXR1cm4gZGljdGl0ZXJfbmV3KGRpY3QsICZQeURpY3RJdGVyS2V5X1R5cGUpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZGljdF9pdGVydmFsdWVzKFB5RGljdE9iamVjdCAqZGljdCkKIHsKLQlyZXR1cm4gZGljdGl0ZXJfbmV3KGRpY3QsICZQeURpY3RJdGVyVmFsdWVfVHlwZSk7CisgICAgcmV0dXJuIGRpY3RpdGVyX25ldyhkaWN0LCAmUHlEaWN0SXRlclZhbHVlX1R5cGUpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZGljdF9pdGVyaXRlbXMoUHlEaWN0T2JqZWN0ICpkaWN0KQogewotCXJldHVybiBkaWN0aXRlcl9uZXcoZGljdCwgJlB5RGljdEl0ZXJJdGVtX1R5cGUpOworICAgIHJldHVybiBkaWN0aXRlcl9uZXcoZGljdCwgJlB5RGljdEl0ZXJJdGVtX1R5cGUpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZGljdF9zaXplb2YoUHlEaWN0T2JqZWN0ICptcCkKIHsKLQlQeV9zc2l6ZV90IHJlczsKKyAgICBQeV9zc2l6ZV90IHJlczsKIAotCXJlcyA9IHNpemVvZihQeURpY3RPYmplY3QpOwotCWlmIChtcC0+bWFfdGFibGUgIT0gbXAtPm1hX3NtYWxsdGFibGUpCi0JCXJlcyA9IHJlcyArIChtcC0+bWFfbWFzayArIDEpICogc2l6ZW9mKFB5RGljdEVudHJ5KTsKLQlyZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QocmVzKTsKKyAgICByZXMgPSBzaXplb2YoUHlEaWN0T2JqZWN0KTsKKyAgICBpZiAobXAtPm1hX3RhYmxlICE9IG1wLT5tYV9zbWFsbHRhYmxlKQorICAgICAgICByZXMgPSByZXMgKyAobXAtPm1hX21hc2sgKyAxKSAqIHNpemVvZihQeURpY3RFbnRyeSk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KHJlcyk7CiB9CiAKIFB5RG9jX1NUUlZBUihoYXNfa2V5X19kb2NfXywKQEAgLTIxMDcsMTE4ICsyMTA3LDExOCBAQAogIkQuaXRlcml0ZW1zKCkgLT4gYW4gaXRlcmF0b3Igb3ZlciB0aGUgKGtleSwgdmFsdWUpIGl0ZW1zIG9mIEQiKTsKIAogc3RhdGljIFB5TWV0aG9kRGVmIG1hcHBfbWV0aG9kc1tdID0gewotCXsiX19jb250YWluc19fIiwoUHlDRnVuY3Rpb24pZGljdF9jb250YWlucywJTUVUSF9PIHwgTUVUSF9DT0VYSVNULAotCSBjb250YWluc19fZG9jX199LAotCXsiX19nZXRpdGVtX18iLCAoUHlDRnVuY3Rpb24pZGljdF9zdWJzY3JpcHQsCU1FVEhfTyB8IE1FVEhfQ09FWElTVCwKLQkgZ2V0aXRlbV9fZG9jX199LAotCXsiX19zaXplb2ZfXyIsCShQeUNGdW5jdGlvbilkaWN0X3NpemVvZiwJTUVUSF9OT0FSR1MsCi0JIHNpemVvZl9fZG9jX199LAotCXsiaGFzX2tleSIsCShQeUNGdW5jdGlvbilkaWN0X2hhc19rZXksICAgICAgTUVUSF9PLAotCSBoYXNfa2V5X19kb2NfX30sCi0JeyJnZXQiLCAgICAgICAgIChQeUNGdW5jdGlvbilkaWN0X2dldCwgICAgICAgICAgTUVUSF9WQVJBUkdTLAotCSBnZXRfX2RvY19ffSwKLQl7InNldGRlZmF1bHQiLCAgKFB5Q0Z1bmN0aW9uKWRpY3Rfc2V0ZGVmYXVsdCwgICBNRVRIX1ZBUkFSR1MsCi0JIHNldGRlZmF1bHRfZG9jX199LAotCXsicG9wIiwgICAgICAgICAoUHlDRnVuY3Rpb24pZGljdF9wb3AsICAgICAgICAgIE1FVEhfVkFSQVJHUywKLQkgcG9wX19kb2NfX30sCi0JeyJwb3BpdGVtIiwJKFB5Q0Z1bmN0aW9uKWRpY3RfcG9waXRlbSwJTUVUSF9OT0FSR1MsCi0JIHBvcGl0ZW1fX2RvY19ffSwKLQl7ImtleXMiLAkoUHlDRnVuY3Rpb24pZGljdF9rZXlzLAkJTUVUSF9OT0FSR1MsCi0Ja2V5c19fZG9jX199LAotCXsiaXRlbXMiLAkoUHlDRnVuY3Rpb24pZGljdF9pdGVtcywJTUVUSF9OT0FSR1MsCi0JIGl0ZW1zX19kb2NfX30sCi0JeyJ2YWx1ZXMiLAkoUHlDRnVuY3Rpb24pZGljdF92YWx1ZXMsCU1FVEhfTk9BUkdTLAotCSB2YWx1ZXNfX2RvY19ffSwKLQl7InVwZGF0ZSIsCShQeUNGdW5jdGlvbilkaWN0X3VwZGF0ZSwJTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywKLQkgdXBkYXRlX19kb2NfX30sCi0JeyJmcm9ta2V5cyIsCShQeUNGdW5jdGlvbilkaWN0X2Zyb21rZXlzLAlNRVRIX1ZBUkFSR1MgfCBNRVRIX0NMQVNTLAotCSBmcm9ta2V5c19fZG9jX199LAotCXsiY2xlYXIiLAkoUHlDRnVuY3Rpb24pZGljdF9jbGVhciwJTUVUSF9OT0FSR1MsCi0JIGNsZWFyX19kb2NfX30sCi0JeyJjb3B5IiwJKFB5Q0Z1bmN0aW9uKWRpY3RfY29weSwJCU1FVEhfTk9BUkdTLAotCSBjb3B5X19kb2NfX30sCi0JeyJpdGVya2V5cyIsCShQeUNGdW5jdGlvbilkaWN0X2l0ZXJrZXlzLAlNRVRIX05PQVJHUywKLQkgaXRlcmtleXNfX2RvY19ffSwKLQl7Iml0ZXJ2YWx1ZXMiLAkoUHlDRnVuY3Rpb24pZGljdF9pdGVydmFsdWVzLAlNRVRIX05PQVJHUywKLQkgaXRlcnZhbHVlc19fZG9jX199LAotCXsiaXRlcml0ZW1zIiwJKFB5Q0Z1bmN0aW9uKWRpY3RfaXRlcml0ZW1zLAlNRVRIX05PQVJHUywKLQkgaXRlcml0ZW1zX19kb2NfX30sCi0Je05VTEwsCQlOVUxMfQkvKiBzZW50aW5lbCAqLworICAgIHsiX19jb250YWluc19fIiwoUHlDRnVuY3Rpb24pZGljdF9jb250YWlucywgICAgICAgICBNRVRIX08gfCBNRVRIX0NPRVhJU1QsCisgICAgIGNvbnRhaW5zX19kb2NfX30sCisgICAgeyJfX2dldGl0ZW1fXyIsIChQeUNGdW5jdGlvbilkaWN0X3N1YnNjcmlwdCwgICAgICAgIE1FVEhfTyB8IE1FVEhfQ09FWElTVCwKKyAgICAgZ2V0aXRlbV9fZG9jX199LAorICAgIHsiX19zaXplb2ZfXyIsICAgICAgKFB5Q0Z1bmN0aW9uKWRpY3Rfc2l6ZW9mLCAgICAgICBNRVRIX05PQVJHUywKKyAgICAgc2l6ZW9mX19kb2NfX30sCisgICAgeyJoYXNfa2V5IiwgICAgICAgICAoUHlDRnVuY3Rpb24pZGljdF9oYXNfa2V5LCAgICAgIE1FVEhfTywKKyAgICAgaGFzX2tleV9fZG9jX199LAorICAgIHsiZ2V0IiwgICAgICAgICAoUHlDRnVuY3Rpb24pZGljdF9nZXQsICAgICAgICAgIE1FVEhfVkFSQVJHUywKKyAgICAgZ2V0X19kb2NfX30sCisgICAgeyJzZXRkZWZhdWx0IiwgIChQeUNGdW5jdGlvbilkaWN0X3NldGRlZmF1bHQsICAgTUVUSF9WQVJBUkdTLAorICAgICBzZXRkZWZhdWx0X2RvY19ffSwKKyAgICB7InBvcCIsICAgICAgICAgKFB5Q0Z1bmN0aW9uKWRpY3RfcG9wLCAgICAgICAgICBNRVRIX1ZBUkFSR1MsCisgICAgIHBvcF9fZG9jX199LAorICAgIHsicG9waXRlbSIsICAgICAgICAgKFB5Q0Z1bmN0aW9uKWRpY3RfcG9waXRlbSwgICAgICBNRVRIX05PQVJHUywKKyAgICAgcG9waXRlbV9fZG9jX199LAorICAgIHsia2V5cyIsICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWRpY3Rfa2V5cywgICAgICAgICBNRVRIX05PQVJHUywKKyAgICBrZXlzX19kb2NfX30sCisgICAgeyJpdGVtcyIsICAgICAgICAgICAoUHlDRnVuY3Rpb24pZGljdF9pdGVtcywgICAgICAgIE1FVEhfTk9BUkdTLAorICAgICBpdGVtc19fZG9jX199LAorICAgIHsidmFsdWVzIiwgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWRpY3RfdmFsdWVzLCAgICAgICBNRVRIX05PQVJHUywKKyAgICAgdmFsdWVzX19kb2NfX30sCisgICAgeyJ1cGRhdGUiLCAgICAgICAgICAoUHlDRnVuY3Rpb24pZGljdF91cGRhdGUsICAgICAgIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsCisgICAgIHVwZGF0ZV9fZG9jX199LAorICAgIHsiZnJvbWtleXMiLCAgICAgICAgKFB5Q0Z1bmN0aW9uKWRpY3RfZnJvbWtleXMsICAgICBNRVRIX1ZBUkFSR1MgfCBNRVRIX0NMQVNTLAorICAgICBmcm9ta2V5c19fZG9jX199LAorICAgIHsiY2xlYXIiLCAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWRpY3RfY2xlYXIsICAgICAgICBNRVRIX05PQVJHUywKKyAgICAgY2xlYXJfX2RvY19ffSwKKyAgICB7ImNvcHkiLCAgICAgICAgICAgIChQeUNGdW5jdGlvbilkaWN0X2NvcHksICAgICAgICAgTUVUSF9OT0FSR1MsCisgICAgIGNvcHlfX2RvY19ffSwKKyAgICB7Iml0ZXJrZXlzIiwgICAgICAgIChQeUNGdW5jdGlvbilkaWN0X2l0ZXJrZXlzLCAgICAgTUVUSF9OT0FSR1MsCisgICAgIGl0ZXJrZXlzX19kb2NfX30sCisgICAgeyJpdGVydmFsdWVzIiwgICAgICAoUHlDRnVuY3Rpb24pZGljdF9pdGVydmFsdWVzLCAgIE1FVEhfTk9BUkdTLAorICAgICBpdGVydmFsdWVzX19kb2NfX30sCisgICAgeyJpdGVyaXRlbXMiLCAgICAgICAoUHlDRnVuY3Rpb24pZGljdF9pdGVyaXRlbXMsICAgIE1FVEhfTk9BUkdTLAorICAgICBpdGVyaXRlbXNfX2RvY19ffSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgLyogc2VudGluZWwgKi8KIH07CiAKIC8qIFJldHVybiAxIGlmIGBrZXlgIGlzIGluIGRpY3QgYG9wYCwgMCBpZiBub3QsIGFuZCAtMSBvbiBlcnJvci4gKi8KIGludAogUHlEaWN0X0NvbnRhaW5zKFB5T2JqZWN0ICpvcCwgUHlPYmplY3QgKmtleSkKIHsKLQlsb25nIGhhc2g7Ci0JUHlEaWN0T2JqZWN0ICptcCA9IChQeURpY3RPYmplY3QgKilvcDsKLQlQeURpY3RFbnRyeSAqZXA7CisgICAgbG9uZyBoYXNoOworICAgIFB5RGljdE9iamVjdCAqbXAgPSAoUHlEaWN0T2JqZWN0ICopb3A7CisgICAgUHlEaWN0RW50cnkgKmVwOwogCi0JaWYgKCFQeVN0cmluZ19DaGVja0V4YWN0KGtleSkgfHwKLQkgICAgKGhhc2ggPSAoKFB5U3RyaW5nT2JqZWN0ICopIGtleSktPm9iX3NoYXNoKSA9PSAtMSkgewotCQloYXNoID0gUHlPYmplY3RfSGFzaChrZXkpOwotCQlpZiAoaGFzaCA9PSAtMSkKLQkJCXJldHVybiAtMTsKLQl9Ci0JZXAgPSAobXAtPm1hX2xvb2t1cCkobXAsIGtleSwgaGFzaCk7Ci0JcmV0dXJuIGVwID09IE5VTEwgPyAtMSA6IChlcC0+bWVfdmFsdWUgIT0gTlVMTCk7CisgICAgaWYgKCFQeVN0cmluZ19DaGVja0V4YWN0KGtleSkgfHwKKyAgICAgICAgKGhhc2ggPSAoKFB5U3RyaW5nT2JqZWN0ICopIGtleSktPm9iX3NoYXNoKSA9PSAtMSkgeworICAgICAgICBoYXNoID0gUHlPYmplY3RfSGFzaChrZXkpOworICAgICAgICBpZiAoaGFzaCA9PSAtMSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgZXAgPSAobXAtPm1hX2xvb2t1cCkobXAsIGtleSwgaGFzaCk7CisgICAgcmV0dXJuIGVwID09IE5VTEwgPyAtMSA6IChlcC0+bWVfdmFsdWUgIT0gTlVMTCk7CiB9CiAKIC8qIEludGVybmFsIHZlcnNpb24gb2YgUHlEaWN0X0NvbnRhaW5zIHVzZWQgd2hlbiB0aGUgaGFzaCB2YWx1ZSBpcyBhbHJlYWR5IGtub3duICovCiBpbnQKIF9QeURpY3RfQ29udGFpbnMoUHlPYmplY3QgKm9wLCBQeU9iamVjdCAqa2V5LCBsb25nIGhhc2gpCiB7Ci0JUHlEaWN0T2JqZWN0ICptcCA9IChQeURpY3RPYmplY3QgKilvcDsKLQlQeURpY3RFbnRyeSAqZXA7CisgICAgUHlEaWN0T2JqZWN0ICptcCA9IChQeURpY3RPYmplY3QgKilvcDsKKyAgICBQeURpY3RFbnRyeSAqZXA7CiAKLQllcCA9IChtcC0+bWFfbG9va3VwKShtcCwga2V5LCBoYXNoKTsKLQlyZXR1cm4gZXAgPT0gTlVMTCA/IC0xIDogKGVwLT5tZV92YWx1ZSAhPSBOVUxMKTsKKyAgICBlcCA9IChtcC0+bWFfbG9va3VwKShtcCwga2V5LCBoYXNoKTsKKyAgICByZXR1cm4gZXAgPT0gTlVMTCA/IC0xIDogKGVwLT5tZV92YWx1ZSAhPSBOVUxMKTsKIH0KIAogLyogSGFjayB0byBpbXBsZW1lbnQgImtleSBpbiBkaWN0IiAqLwogc3RhdGljIFB5U2VxdWVuY2VNZXRob2RzIGRpY3RfYXNfc2VxdWVuY2UgPSB7Ci0JMCwJCQkvKiBzcV9sZW5ndGggKi8KLQkwLAkJCS8qIHNxX2NvbmNhdCAqLwotCTAsCQkJLyogc3FfcmVwZWF0ICovCi0JMCwJCQkvKiBzcV9pdGVtICovCi0JMCwJCQkvKiBzcV9zbGljZSAqLwotCTAsCQkJLyogc3FfYXNzX2l0ZW0gKi8KLQkwLAkJCS8qIHNxX2Fzc19zbGljZSAqLwotCVB5RGljdF9Db250YWlucywJLyogc3FfY29udGFpbnMgKi8KLQkwLAkJCS8qIHNxX2lucGxhY2VfY29uY2F0ICovCi0JMCwJCQkvKiBzcV9pbnBsYWNlX3JlcGVhdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzcV9sZW5ndGggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3FfY29uY2F0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNxX3JlcGVhdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzcV9pdGVtICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNxX3NsaWNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNxX2Fzc19pdGVtICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNxX2Fzc19zbGljZSAqLworICAgIFB5RGljdF9Db250YWlucywgICAgICAgICAgICAvKiBzcV9jb250YWlucyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzcV9pbnBsYWNlX2NvbmNhdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzcV9pbnBsYWNlX3JlcGVhdCAqLwogfTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIGRpY3RfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCVB5T2JqZWN0ICpzZWxmOworICAgIFB5T2JqZWN0ICpzZWxmOwogCi0JYXNzZXJ0KHR5cGUgIT0gTlVMTCAmJiB0eXBlLT50cF9hbGxvYyAhPSBOVUxMKTsKLQlzZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7Ci0JaWYgKHNlbGYgIT0gTlVMTCkgewotCQlQeURpY3RPYmplY3QgKmQgPSAoUHlEaWN0T2JqZWN0ICopc2VsZjsKLQkJLyogSXQncyBndWFyYW50ZWVkIHRoYXQgdHAtPmFsbG9jIHplcm9lZCBvdXQgdGhlIHN0cnVjdC4gKi8KLQkJYXNzZXJ0KGQtPm1hX3RhYmxlID09IE5VTEwgJiYgZC0+bWFfZmlsbCA9PSAwICYmIGQtPm1hX3VzZWQgPT0gMCk7Ci0JCUlOSVRfTk9OWkVST19ESUNUX1NMT1RTKGQpOwotCQlkLT5tYV9sb29rdXAgPSBsb29rZGljdF9zdHJpbmc7CisgICAgYXNzZXJ0KHR5cGUgIT0gTlVMTCAmJiB0eXBlLT50cF9hbGxvYyAhPSBOVUxMKTsKKyAgICBzZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7CisgICAgaWYgKHNlbGYgIT0gTlVMTCkgeworICAgICAgICBQeURpY3RPYmplY3QgKmQgPSAoUHlEaWN0T2JqZWN0ICopc2VsZjsKKyAgICAgICAgLyogSXQncyBndWFyYW50ZWVkIHRoYXQgdHAtPmFsbG9jIHplcm9lZCBvdXQgdGhlIHN0cnVjdC4gKi8KKyAgICAgICAgYXNzZXJ0KGQtPm1hX3RhYmxlID09IE5VTEwgJiYgZC0+bWFfZmlsbCA9PSAwICYmIGQtPm1hX3VzZWQgPT0gMCk7CisgICAgICAgIElOSVRfTk9OWkVST19ESUNUX1NMT1RTKGQpOworICAgICAgICBkLT5tYV9sb29rdXAgPSBsb29rZGljdF9zdHJpbmc7CiAjaWZkZWYgU0hPV19DT05WRVJTSU9OX0NPVU5UUwotCQkrK2NyZWF0ZWQ7CisgICAgICAgICsrY3JlYXRlZDsKICNlbmRpZgotCX0KLQlyZXR1cm4gc2VsZjsKKyAgICB9CisgICAgcmV0dXJuIHNlbGY7CiB9CiAKIHN0YXRpYyBpbnQKIGRpY3RfaW5pdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCXJldHVybiBkaWN0X3VwZGF0ZV9jb21tb24oc2VsZiwgYXJncywga3dkcywgImRpY3QiKTsKKyAgICByZXR1cm4gZGljdF91cGRhdGVfY29tbW9uKHNlbGYsIGFyZ3MsIGt3ZHMsICJkaWN0Iik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkaWN0X2l0ZXIoUHlEaWN0T2JqZWN0ICpkaWN0KQogewotCXJldHVybiBkaWN0aXRlcl9uZXcoZGljdCwgJlB5RGljdEl0ZXJLZXlfVHlwZSk7CisgICAgcmV0dXJuIGRpY3RpdGVyX25ldyhkaWN0LCAmUHlEaWN0SXRlcktleV9UeXBlKTsKIH0KIAogUHlEb2NfU1RSVkFSKGRpY3Rpb25hcnlfZG9jLApAQCAtMjIzMyw0NiArMjIzMyw0NiBAQAogIiAgICBpbiB0aGUga2V5d29yZCBhcmd1bWVudCBsaXN0LiAgRm9yIGV4YW1wbGU6ICBkaWN0KG9uZT0xLCB0d289MikiKTsKIAogUHlUeXBlT2JqZWN0IFB5RGljdF9UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCi0JImRpY3QiLAotCXNpemVvZihQeURpY3RPYmplY3QpLAotCTAsCi0JKGRlc3RydWN0b3IpZGljdF9kZWFsbG9jLAkJLyogdHBfZGVhbGxvYyAqLwotCShwcmludGZ1bmMpZGljdF9wcmludCwJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkoY21wZnVuYylkaWN0X2NvbXBhcmUsCQkJLyogdHBfY29tcGFyZSAqLwotCShyZXByZnVuYylkaWN0X3JlcHIsCQkJLyogdHBfcmVwciAqLwotCTAsCQkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkmZGljdF9hc19zZXF1ZW5jZSwJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCSZkaWN0X2FzX21hcHBpbmcsCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYylQeU9iamVjdF9IYXNoTm90SW1wbGVtZW50ZWQsCS8qIHRwX2hhc2ggKi8KLQkwLAkJCQkJLyogdHBfY2FsbCAqLwotCTAsCQkJCQkvKiB0cF9zdHIgKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQyB8Ci0JCVB5X1RQRkxBR1NfQkFTRVRZUEUgfCBQeV9UUEZMQUdTX0RJQ1RfU1VCQ0xBU1MsCS8qIHRwX2ZsYWdzICovCi0JZGljdGlvbmFyeV9kb2MsCQkJCS8qIHRwX2RvYyAqLwotCWRpY3RfdHJhdmVyc2UsCQkJCS8qIHRwX3RyYXZlcnNlICovCi0JZGljdF90cF9jbGVhciwJCQkJLyogdHBfY2xlYXIgKi8KLQlkaWN0X3JpY2hjb21wYXJlLAkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JKGdldGl0ZXJmdW5jKWRpY3RfaXRlciwJCQkvKiB0cF9pdGVyICovCi0JMCwJCQkJCS8qIHRwX2l0ZXJuZXh0ICovCi0JbWFwcF9tZXRob2RzLAkJCQkvKiB0cF9tZXRob2RzICovCi0JMCwJCQkJCS8qIHRwX21lbWJlcnMgKi8KLQkwLAkJCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQlkaWN0X2luaXQsCQkJCS8qIHRwX2luaXQgKi8KLQlQeVR5cGVfR2VuZXJpY0FsbG9jLAkJCS8qIHRwX2FsbG9jICovCi0JZGljdF9uZXcsCQkJCS8qIHRwX25ldyAqLwotCVB5T2JqZWN0X0dDX0RlbCwgICAgICAgIAkJLyogdHBfZnJlZSAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCisgICAgImRpY3QiLAorICAgIHNpemVvZihQeURpY3RPYmplY3QpLAorICAgIDAsCisgICAgKGRlc3RydWN0b3IpZGljdF9kZWFsbG9jLCAgICAgICAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgKHByaW50ZnVuYylkaWN0X3ByaW50LCAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIChjbXBmdW5jKWRpY3RfY29tcGFyZSwgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIChyZXByZnVuYylkaWN0X3JlcHIsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgJmRpY3RfYXNfc2VxdWVuY2UsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgICZkaWN0X2FzX21hcHBpbmcsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIChoYXNoZnVuYylQeU9iamVjdF9IYXNoTm90SW1wbGVtZW50ZWQsICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQyB8CisgICAgICAgIFB5X1RQRkxBR1NfQkFTRVRZUEUgfCBQeV9UUEZMQUdTX0RJQ1RfU1VCQ0xBU1MsICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICBkaWN0aW9uYXJ5X2RvYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgIGRpY3RfdHJhdmVyc2UsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICBkaWN0X3RwX2NsZWFyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgZGljdF9yaWNoY29tcGFyZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAoZ2V0aXRlcmZ1bmMpZGljdF9pdGVyLCAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgbWFwcF9tZXRob2RzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgZGljdF9pbml0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgUHlUeXBlX0dlbmVyaWNBbGxvYywgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIGRpY3RfbmV3LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgUHlPYmplY3RfR0NfRGVsLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCiB9OwogCiAvKiBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIG9sZCBkaWN0aW9uYXJ5IGludGVyZmFjZSAqLwpAQCAtMjI4MCwzMzYgKzIyODAsMzM2IEBACiBQeU9iamVjdCAqCiBQeURpY3RfR2V0SXRlbVN0cmluZyhQeU9iamVjdCAqdiwgY29uc3QgY2hhciAqa2V5KQogewotCVB5T2JqZWN0ICprdiwgKnJ2OwotCWt2ID0gUHlTdHJpbmdfRnJvbVN0cmluZyhrZXkpOwotCWlmIChrdiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlydiA9IFB5RGljdF9HZXRJdGVtKHYsIGt2KTsKLQlQeV9ERUNSRUYoa3YpOwotCXJldHVybiBydjsKKyAgICBQeU9iamVjdCAqa3YsICpydjsKKyAgICBrdiA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoa2V5KTsKKyAgICBpZiAoa3YgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcnYgPSBQeURpY3RfR2V0SXRlbSh2LCBrdik7CisgICAgUHlfREVDUkVGKGt2KTsKKyAgICByZXR1cm4gcnY7CiB9CiAKIGludAogUHlEaWN0X1NldEl0ZW1TdHJpbmcoUHlPYmplY3QgKnYsIGNvbnN0IGNoYXIgKmtleSwgUHlPYmplY3QgKml0ZW0pCiB7Ci0JUHlPYmplY3QgKmt2OwotCWludCBlcnI7Ci0Ja3YgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGtleSk7Ci0JaWYgKGt2ID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQlQeVN0cmluZ19JbnRlcm5JblBsYWNlKCZrdik7IC8qIFhYWCBTaG91bGQgd2UgcmVhbGx5PyAqLwotCWVyciA9IFB5RGljdF9TZXRJdGVtKHYsIGt2LCBpdGVtKTsKLQlQeV9ERUNSRUYoa3YpOwotCXJldHVybiBlcnI7CisgICAgUHlPYmplY3QgKmt2OworICAgIGludCBlcnI7CisgICAga3YgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGtleSk7CisgICAgaWYgKGt2ID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBQeVN0cmluZ19JbnRlcm5JblBsYWNlKCZrdik7IC8qIFhYWCBTaG91bGQgd2UgcmVhbGx5PyAqLworICAgIGVyciA9IFB5RGljdF9TZXRJdGVtKHYsIGt2LCBpdGVtKTsKKyAgICBQeV9ERUNSRUYoa3YpOworICAgIHJldHVybiBlcnI7CiB9CiAKIGludAogUHlEaWN0X0RlbEl0ZW1TdHJpbmcoUHlPYmplY3QgKnYsIGNvbnN0IGNoYXIgKmtleSkKIHsKLQlQeU9iamVjdCAqa3Y7Ci0JaW50IGVycjsKLQlrdiA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoa2V5KTsKLQlpZiAoa3YgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCWVyciA9IFB5RGljdF9EZWxJdGVtKHYsIGt2KTsKLQlQeV9ERUNSRUYoa3YpOwotCXJldHVybiBlcnI7CisgICAgUHlPYmplY3QgKmt2OworICAgIGludCBlcnI7CisgICAga3YgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGtleSk7CisgICAgaWYgKGt2ID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBlcnIgPSBQeURpY3RfRGVsSXRlbSh2LCBrdik7CisgICAgUHlfREVDUkVGKGt2KTsKKyAgICByZXR1cm4gZXJyOwogfQogCiAvKiBEaWN0aW9uYXJ5IGl0ZXJhdG9yIHR5cGVzICovCiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JUHlEaWN0T2JqZWN0ICpkaV9kaWN0OyAvKiBTZXQgdG8gTlVMTCB3aGVuIGl0ZXJhdG9yIGlzIGV4aGF1c3RlZCAqLwotCVB5X3NzaXplX3QgZGlfdXNlZDsKLQlQeV9zc2l6ZV90IGRpX3BvczsKLQlQeU9iamVjdCogZGlfcmVzdWx0OyAvKiByZXVzYWJsZSByZXN1bHQgdHVwbGUgZm9yIGl0ZXJpdGVtcyAqLwotCVB5X3NzaXplX3QgbGVuOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBQeURpY3RPYmplY3QgKmRpX2RpY3Q7IC8qIFNldCB0byBOVUxMIHdoZW4gaXRlcmF0b3IgaXMgZXhoYXVzdGVkICovCisgICAgUHlfc3NpemVfdCBkaV91c2VkOworICAgIFB5X3NzaXplX3QgZGlfcG9zOworICAgIFB5T2JqZWN0KiBkaV9yZXN1bHQ7IC8qIHJldXNhYmxlIHJlc3VsdCB0dXBsZSBmb3IgaXRlcml0ZW1zICovCisgICAgUHlfc3NpemVfdCBsZW47CiB9IGRpY3RpdGVyb2JqZWN0OwogCiBzdGF0aWMgUHlPYmplY3QgKgogZGljdGl0ZXJfbmV3KFB5RGljdE9iamVjdCAqZGljdCwgUHlUeXBlT2JqZWN0ICppdGVydHlwZSkKIHsKLQlkaWN0aXRlcm9iamVjdCAqZGk7Ci0JZGkgPSBQeU9iamVjdF9HQ19OZXcoZGljdGl0ZXJvYmplY3QsIGl0ZXJ0eXBlKTsKLQlpZiAoZGkgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JUHlfSU5DUkVGKGRpY3QpOwotCWRpLT5kaV9kaWN0ID0gZGljdDsKLQlkaS0+ZGlfdXNlZCA9IGRpY3QtPm1hX3VzZWQ7Ci0JZGktPmRpX3BvcyA9IDA7Ci0JZGktPmxlbiA9IGRpY3QtPm1hX3VzZWQ7Ci0JaWYgKGl0ZXJ0eXBlID09ICZQeURpY3RJdGVySXRlbV9UeXBlKSB7Ci0JCWRpLT5kaV9yZXN1bHQgPSBQeVR1cGxlX1BhY2soMiwgUHlfTm9uZSwgUHlfTm9uZSk7Ci0JCWlmIChkaS0+ZGlfcmVzdWx0ID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRihkaSk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KLQllbHNlCi0JCWRpLT5kaV9yZXN1bHQgPSBOVUxMOwotCV9QeU9iamVjdF9HQ19UUkFDSyhkaSk7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWRpOworICAgIGRpY3RpdGVyb2JqZWN0ICpkaTsKKyAgICBkaSA9IFB5T2JqZWN0X0dDX05ldyhkaWN0aXRlcm9iamVjdCwgaXRlcnR5cGUpOworICAgIGlmIChkaSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQeV9JTkNSRUYoZGljdCk7CisgICAgZGktPmRpX2RpY3QgPSBkaWN0OworICAgIGRpLT5kaV91c2VkID0gZGljdC0+bWFfdXNlZDsKKyAgICBkaS0+ZGlfcG9zID0gMDsKKyAgICBkaS0+bGVuID0gZGljdC0+bWFfdXNlZDsKKyAgICBpZiAoaXRlcnR5cGUgPT0gJlB5RGljdEl0ZXJJdGVtX1R5cGUpIHsKKyAgICAgICAgZGktPmRpX3Jlc3VsdCA9IFB5VHVwbGVfUGFjaygyLCBQeV9Ob25lLCBQeV9Ob25lKTsKKyAgICAgICAgaWYgKGRpLT5kaV9yZXN1bHQgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKGRpKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgZGktPmRpX3Jlc3VsdCA9IE5VTEw7CisgICAgX1B5T2JqZWN0X0dDX1RSQUNLKGRpKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopZGk7CiB9CiAKIHN0YXRpYyB2b2lkCiBkaWN0aXRlcl9kZWFsbG9jKGRpY3RpdGVyb2JqZWN0ICpkaSkKIHsKLQlQeV9YREVDUkVGKGRpLT5kaV9kaWN0KTsKLQlQeV9YREVDUkVGKGRpLT5kaV9yZXN1bHQpOwotCVB5T2JqZWN0X0dDX0RlbChkaSk7CisgICAgUHlfWERFQ1JFRihkaS0+ZGlfZGljdCk7CisgICAgUHlfWERFQ1JFRihkaS0+ZGlfcmVzdWx0KTsKKyAgICBQeU9iamVjdF9HQ19EZWwoZGkpOwogfQogCiBzdGF0aWMgaW50CiBkaWN0aXRlcl90cmF2ZXJzZShkaWN0aXRlcm9iamVjdCAqZGksIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotCVB5X1ZJU0lUKGRpLT5kaV9kaWN0KTsKLQlQeV9WSVNJVChkaS0+ZGlfcmVzdWx0KTsKLQlyZXR1cm4gMDsKKyAgICBQeV9WSVNJVChkaS0+ZGlfZGljdCk7CisgICAgUHlfVklTSVQoZGktPmRpX3Jlc3VsdCk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkaWN0aXRlcl9sZW4oZGljdGl0ZXJvYmplY3QgKmRpKQogewotCVB5X3NzaXplX3QgbGVuID0gMDsKLQlpZiAoZGktPmRpX2RpY3QgIT0gTlVMTCAmJiBkaS0+ZGlfdXNlZCA9PSBkaS0+ZGlfZGljdC0+bWFfdXNlZCkKLQkJbGVuID0gZGktPmxlbjsKLQlyZXR1cm4gUHlJbnRfRnJvbVNpemVfdChsZW4pOworICAgIFB5X3NzaXplX3QgbGVuID0gMDsKKyAgICBpZiAoZGktPmRpX2RpY3QgIT0gTlVMTCAmJiBkaS0+ZGlfdXNlZCA9PSBkaS0+ZGlfZGljdC0+bWFfdXNlZCkKKyAgICAgICAgbGVuID0gZGktPmxlbjsKKyAgICByZXR1cm4gUHlJbnRfRnJvbVNpemVfdChsZW4pOwogfQogCiBQeURvY19TVFJWQVIobGVuZ3RoX2hpbnRfZG9jLCAiUHJpdmF0ZSBtZXRob2QgcmV0dXJuaW5nIGFuIGVzdGltYXRlIG9mIGxlbihsaXN0KGl0KSkuIik7CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBkaWN0aXRlcl9tZXRob2RzW10gPSB7Ci0JeyJfX2xlbmd0aF9oaW50X18iLCAoUHlDRnVuY3Rpb24pZGljdGl0ZXJfbGVuLCBNRVRIX05PQVJHUywgbGVuZ3RoX2hpbnRfZG9jfSwKLSAJe05VTEwsCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7Il9fbGVuZ3RoX2hpbnRfXyIsIChQeUNGdW5jdGlvbilkaWN0aXRlcl9sZW4sIE1FVEhfTk9BUkdTLCBsZW5ndGhfaGludF9kb2N9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKmRpY3RpdGVyX2l0ZXJuZXh0a2V5KGRpY3RpdGVyb2JqZWN0ICpkaSkKIHsKLQlQeU9iamVjdCAqa2V5OwotCXJlZ2lzdGVyIFB5X3NzaXplX3QgaSwgbWFzazsKLQlyZWdpc3RlciBQeURpY3RFbnRyeSAqZXA7Ci0JUHlEaWN0T2JqZWN0ICpkID0gZGktPmRpX2RpY3Q7CisgICAgUHlPYmplY3QgKmtleTsKKyAgICByZWdpc3RlciBQeV9zc2l6ZV90IGksIG1hc2s7CisgICAgcmVnaXN0ZXIgUHlEaWN0RW50cnkgKmVwOworICAgIFB5RGljdE9iamVjdCAqZCA9IGRpLT5kaV9kaWN0OwogCi0JaWYgKGQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JYXNzZXJ0IChQeURpY3RfQ2hlY2soZCkpOworICAgIGlmIChkID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGFzc2VydCAoUHlEaWN0X0NoZWNrKGQpKTsKIAotCWlmIChkaS0+ZGlfdXNlZCAhPSBkLT5tYV91c2VkKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCi0JCQkJImRpY3Rpb25hcnkgY2hhbmdlZCBzaXplIGR1cmluZyBpdGVyYXRpb24iKTsKLQkJZGktPmRpX3VzZWQgPSAtMTsgLyogTWFrZSB0aGlzIHN0YXRlIHN0aWNreSAqLwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKGRpLT5kaV91c2VkICE9IGQtPm1hX3VzZWQpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJkaWN0aW9uYXJ5IGNoYW5nZWQgc2l6ZSBkdXJpbmcgaXRlcmF0aW9uIik7CisgICAgICAgIGRpLT5kaV91c2VkID0gLTE7IC8qIE1ha2UgdGhpcyBzdGF0ZSBzdGlja3kgKi8KKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaSA9IGRpLT5kaV9wb3M7Ci0JaWYgKGkgPCAwKQotCQlnb3RvIGZhaWw7Ci0JZXAgPSBkLT5tYV90YWJsZTsKLQltYXNrID0gZC0+bWFfbWFzazsKLQl3aGlsZSAoaSA8PSBtYXNrICYmIGVwW2ldLm1lX3ZhbHVlID09IE5VTEwpCi0JCWkrKzsKLQlkaS0+ZGlfcG9zID0gaSsxOwotCWlmIChpID4gbWFzaykKLQkJZ290byBmYWlsOwotCWRpLT5sZW4tLTsKLQlrZXkgPSBlcFtpXS5tZV9rZXk7Ci0JUHlfSU5DUkVGKGtleSk7Ci0JcmV0dXJuIGtleTsKKyAgICBpID0gZGktPmRpX3BvczsKKyAgICBpZiAoaSA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKyAgICBlcCA9IGQtPm1hX3RhYmxlOworICAgIG1hc2sgPSBkLT5tYV9tYXNrOworICAgIHdoaWxlIChpIDw9IG1hc2sgJiYgZXBbaV0ubWVfdmFsdWUgPT0gTlVMTCkKKyAgICAgICAgaSsrOworICAgIGRpLT5kaV9wb3MgPSBpKzE7CisgICAgaWYgKGkgPiBtYXNrKQorICAgICAgICBnb3RvIGZhaWw7CisgICAgZGktPmxlbi0tOworICAgIGtleSA9IGVwW2ldLm1lX2tleTsKKyAgICBQeV9JTkNSRUYoa2V5KTsKKyAgICByZXR1cm4ga2V5OwogCiBmYWlsOgotCVB5X0RFQ1JFRihkKTsKLQlkaS0+ZGlfZGljdCA9IE5VTEw7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlfREVDUkVGKGQpOworICAgIGRpLT5kaV9kaWN0ID0gTlVMTDsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogUHlUeXBlT2JqZWN0IFB5RGljdEl0ZXJLZXlfVHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQotCSJkaWN0aW9uYXJ5LWtleWl0ZXJhdG9yIiwJCS8qIHRwX25hbWUgKi8KLQlzaXplb2YoZGljdGl0ZXJvYmplY3QpLAkJCS8qIHRwX2Jhc2ljc2l6ZSAqLwotCTAsCQkJCQkvKiB0cF9pdGVtc2l6ZSAqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcilkaWN0aXRlcl9kZWFsbG9jLCAJCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfcmVwciAqLwotCTAsCQkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCQkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsLyogdHBfZmxhZ3MgKi8KLSAJMCwJCQkJCS8qIHRwX2RvYyAqLwotIAkodHJhdmVyc2Vwcm9jKWRpY3RpdGVyX3RyYXZlcnNlLAkvKiB0cF90cmF2ZXJzZSAqLwotIAkwLAkJCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQlQeU9iamVjdF9TZWxmSXRlciwJCQkvKiB0cF9pdGVyICovCi0JKGl0ZXJuZXh0ZnVuYylkaWN0aXRlcl9pdGVybmV4dGtleSwJLyogdHBfaXRlcm5leHQgKi8KLQlkaWN0aXRlcl9tZXRob2RzLAkJCS8qIHRwX21ldGhvZHMgKi8KLQkwLAorICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCisgICAgImRpY3Rpb25hcnkta2V5aXRlcmF0b3IiLCAgICAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCisgICAgc2l6ZW9mKGRpY3RpdGVyb2JqZWN0KSwgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKWRpY3RpdGVyX2RlYWxsb2MsICAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2MpZGljdGl0ZXJfdHJhdmVyc2UsICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICBQeU9iamVjdF9TZWxmSXRlciwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAoaXRlcm5leHRmdW5jKWRpY3RpdGVyX2l0ZXJuZXh0a2V5LCAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgZGljdGl0ZXJfbWV0aG9kcywgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwKIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqZGljdGl0ZXJfaXRlcm5leHR2YWx1ZShkaWN0aXRlcm9iamVjdCAqZGkpCiB7Ci0JUHlPYmplY3QgKnZhbHVlOwotCXJlZ2lzdGVyIFB5X3NzaXplX3QgaSwgbWFzazsKLQlyZWdpc3RlciBQeURpY3RFbnRyeSAqZXA7Ci0JUHlEaWN0T2JqZWN0ICpkID0gZGktPmRpX2RpY3Q7CisgICAgUHlPYmplY3QgKnZhbHVlOworICAgIHJlZ2lzdGVyIFB5X3NzaXplX3QgaSwgbWFzazsKKyAgICByZWdpc3RlciBQeURpY3RFbnRyeSAqZXA7CisgICAgUHlEaWN0T2JqZWN0ICpkID0gZGktPmRpX2RpY3Q7CiAKLQlpZiAoZCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlhc3NlcnQgKFB5RGljdF9DaGVjayhkKSk7CisgICAgaWYgKGQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYXNzZXJ0IChQeURpY3RfQ2hlY2soZCkpOwogCi0JaWYgKGRpLT5kaV91c2VkICE9IGQtPm1hX3VzZWQpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKLQkJCQkiZGljdGlvbmFyeSBjaGFuZ2VkIHNpemUgZHVyaW5nIGl0ZXJhdGlvbiIpOwotCQlkaS0+ZGlfdXNlZCA9IC0xOyAvKiBNYWtlIHRoaXMgc3RhdGUgc3RpY2t5ICovCi0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoZGktPmRpX3VzZWQgIT0gZC0+bWFfdXNlZCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImRpY3Rpb25hcnkgY2hhbmdlZCBzaXplIGR1cmluZyBpdGVyYXRpb24iKTsKKyAgICAgICAgZGktPmRpX3VzZWQgPSAtMTsgLyogTWFrZSB0aGlzIHN0YXRlIHN0aWNreSAqLworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlpID0gZGktPmRpX3BvczsKLQltYXNrID0gZC0+bWFfbWFzazsKLQlpZiAoaSA8IDAgfHwgaSA+IG1hc2spCi0JCWdvdG8gZmFpbDsKLQllcCA9IGQtPm1hX3RhYmxlOwotCXdoaWxlICgodmFsdWU9ZXBbaV0ubWVfdmFsdWUpID09IE5VTEwpIHsKLQkJaSsrOwotCQlpZiAoaSA+IG1hc2spCi0JCQlnb3RvIGZhaWw7Ci0JfQotCWRpLT5kaV9wb3MgPSBpKzE7Ci0JZGktPmxlbi0tOwotCVB5X0lOQ1JFRih2YWx1ZSk7Ci0JcmV0dXJuIHZhbHVlOworICAgIGkgPSBkaS0+ZGlfcG9zOworICAgIG1hc2sgPSBkLT5tYV9tYXNrOworICAgIGlmIChpIDwgMCB8fCBpID4gbWFzaykKKyAgICAgICAgZ290byBmYWlsOworICAgIGVwID0gZC0+bWFfdGFibGU7CisgICAgd2hpbGUgKCh2YWx1ZT1lcFtpXS5tZV92YWx1ZSkgPT0gTlVMTCkgeworICAgICAgICBpKys7CisgICAgICAgIGlmIChpID4gbWFzaykKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisgICAgZGktPmRpX3BvcyA9IGkrMTsKKyAgICBkaS0+bGVuLS07CisgICAgUHlfSU5DUkVGKHZhbHVlKTsKKyAgICByZXR1cm4gdmFsdWU7CiAKIGZhaWw6Ci0JUHlfREVDUkVGKGQpOwotCWRpLT5kaV9kaWN0ID0gTlVMTDsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeV9ERUNSRUYoZCk7CisgICAgZGktPmRpX2RpY3QgPSBOVUxMOworICAgIHJldHVybiBOVUxMOwogfQogCiBQeVR5cGVPYmplY3QgUHlEaWN0SXRlclZhbHVlX1R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKLQkiZGljdGlvbmFyeS12YWx1ZWl0ZXJhdG9yIiwJCS8qIHRwX25hbWUgKi8KLQlzaXplb2YoZGljdGl0ZXJvYmplY3QpLAkJCS8qIHRwX2Jhc2ljc2l6ZSAqLwotCTAsCQkJCQkvKiB0cF9pdGVtc2l6ZSAqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcilkaWN0aXRlcl9kZWFsbG9jLCAJCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfcmVwciAqLwotCTAsCQkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCQkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsLyogdHBfZmxhZ3MgKi8KLSAJMCwJCQkJCS8qIHRwX2RvYyAqLwotIAkodHJhdmVyc2Vwcm9jKWRpY3RpdGVyX3RyYXZlcnNlLAkvKiB0cF90cmF2ZXJzZSAqLwotIAkwLAkJCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQlQeU9iamVjdF9TZWxmSXRlciwJCQkvKiB0cF9pdGVyICovCi0JKGl0ZXJuZXh0ZnVuYylkaWN0aXRlcl9pdGVybmV4dHZhbHVlLAkvKiB0cF9pdGVybmV4dCAqLwotCWRpY3RpdGVyX21ldGhvZHMsCQkJLyogdHBfbWV0aG9kcyAqLwotCTAsCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKKyAgICAiZGljdGlvbmFyeS12YWx1ZWl0ZXJhdG9yIiwgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICBzaXplb2YoZGljdGl0ZXJvYmplY3QpLCAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpZGljdGl0ZXJfZGVhbGxvYywgICAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQywvKiB0cF9mbGFncyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgKHRyYXZlcnNlcHJvYylkaWN0aXRlcl90cmF2ZXJzZSwgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIFB5T2JqZWN0X1NlbGZJdGVyLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIChpdGVybmV4dGZ1bmMpZGljdGl0ZXJfaXRlcm5leHR2YWx1ZSwgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICBkaWN0aXRlcl9tZXRob2RzLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLAogfTsKIAogc3RhdGljIFB5T2JqZWN0ICpkaWN0aXRlcl9pdGVybmV4dGl0ZW0oZGljdGl0ZXJvYmplY3QgKmRpKQogewotCVB5T2JqZWN0ICprZXksICp2YWx1ZSwgKnJlc3VsdCA9IGRpLT5kaV9yZXN1bHQ7Ci0JcmVnaXN0ZXIgUHlfc3NpemVfdCBpLCBtYXNrOwotCXJlZ2lzdGVyIFB5RGljdEVudHJ5ICplcDsKLQlQeURpY3RPYmplY3QgKmQgPSBkaS0+ZGlfZGljdDsKKyAgICBQeU9iamVjdCAqa2V5LCAqdmFsdWUsICpyZXN1bHQgPSBkaS0+ZGlfcmVzdWx0OworICAgIHJlZ2lzdGVyIFB5X3NzaXplX3QgaSwgbWFzazsKKyAgICByZWdpc3RlciBQeURpY3RFbnRyeSAqZXA7CisgICAgUHlEaWN0T2JqZWN0ICpkID0gZGktPmRpX2RpY3Q7CiAKLQlpZiAoZCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlhc3NlcnQgKFB5RGljdF9DaGVjayhkKSk7CisgICAgaWYgKGQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYXNzZXJ0IChQeURpY3RfQ2hlY2soZCkpOwogCi0JaWYgKGRpLT5kaV91c2VkICE9IGQtPm1hX3VzZWQpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKLQkJCQkiZGljdGlvbmFyeSBjaGFuZ2VkIHNpemUgZHVyaW5nIGl0ZXJhdGlvbiIpOwotCQlkaS0+ZGlfdXNlZCA9IC0xOyAvKiBNYWtlIHRoaXMgc3RhdGUgc3RpY2t5ICovCi0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoZGktPmRpX3VzZWQgIT0gZC0+bWFfdXNlZCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImRpY3Rpb25hcnkgY2hhbmdlZCBzaXplIGR1cmluZyBpdGVyYXRpb24iKTsKKyAgICAgICAgZGktPmRpX3VzZWQgPSAtMTsgLyogTWFrZSB0aGlzIHN0YXRlIHN0aWNreSAqLworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlpID0gZGktPmRpX3BvczsKLQlpZiAoaSA8IDApCi0JCWdvdG8gZmFpbDsKLQllcCA9IGQtPm1hX3RhYmxlOwotCW1hc2sgPSBkLT5tYV9tYXNrOwotCXdoaWxlIChpIDw9IG1hc2sgJiYgZXBbaV0ubWVfdmFsdWUgPT0gTlVMTCkKLQkJaSsrOwotCWRpLT5kaV9wb3MgPSBpKzE7Ci0JaWYgKGkgPiBtYXNrKQotCQlnb3RvIGZhaWw7CisgICAgaSA9IGRpLT5kaV9wb3M7CisgICAgaWYgKGkgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisgICAgZXAgPSBkLT5tYV90YWJsZTsKKyAgICBtYXNrID0gZC0+bWFfbWFzazsKKyAgICB3aGlsZSAoaSA8PSBtYXNrICYmIGVwW2ldLm1lX3ZhbHVlID09IE5VTEwpCisgICAgICAgIGkrKzsKKyAgICBkaS0+ZGlfcG9zID0gaSsxOworICAgIGlmIChpID4gbWFzaykKKyAgICAgICAgZ290byBmYWlsOwogCi0JaWYgKHJlc3VsdC0+b2JfcmVmY250ID09IDEpIHsKLQkJUHlfSU5DUkVGKHJlc3VsdCk7Ci0JCVB5X0RFQ1JFRihQeVR1cGxlX0dFVF9JVEVNKHJlc3VsdCwgMCkpOwotCQlQeV9ERUNSRUYoUHlUdXBsZV9HRVRfSVRFTShyZXN1bHQsIDEpKTsKLQl9IGVsc2UgewotCQlyZXN1bHQgPSBQeVR1cGxlX05ldygyKTsKLQkJaWYgKHJlc3VsdCA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCWRpLT5sZW4tLTsKLQlrZXkgPSBlcFtpXS5tZV9rZXk7Ci0JdmFsdWUgPSBlcFtpXS5tZV92YWx1ZTsKLQlQeV9JTkNSRUYoa2V5KTsKLQlQeV9JTkNSRUYodmFsdWUpOwotCVB5VHVwbGVfU0VUX0lURU0ocmVzdWx0LCAwLCBrZXkpOwotCVB5VHVwbGVfU0VUX0lURU0ocmVzdWx0LCAxLCB2YWx1ZSk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBpZiAocmVzdWx0LT5vYl9yZWZjbnQgPT0gMSkgeworICAgICAgICBQeV9JTkNSRUYocmVzdWx0KTsKKyAgICAgICAgUHlfREVDUkVGKFB5VHVwbGVfR0VUX0lURU0ocmVzdWx0LCAwKSk7CisgICAgICAgIFB5X0RFQ1JFRihQeVR1cGxlX0dFVF9JVEVNKHJlc3VsdCwgMSkpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJlc3VsdCA9IFB5VHVwbGVfTmV3KDIpOworICAgICAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZGktPmxlbi0tOworICAgIGtleSA9IGVwW2ldLm1lX2tleTsKKyAgICB2YWx1ZSA9IGVwW2ldLm1lX3ZhbHVlOworICAgIFB5X0lOQ1JFRihrZXkpOworICAgIFB5X0lOQ1JFRih2YWx1ZSk7CisgICAgUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIDAsIGtleSk7CisgICAgUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIDEsIHZhbHVlKTsKKyAgICByZXR1cm4gcmVzdWx0OwogCiBmYWlsOgotCVB5X0RFQ1JFRihkKTsKLQlkaS0+ZGlfZGljdCA9IE5VTEw7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlfREVDUkVGKGQpOworICAgIGRpLT5kaV9kaWN0ID0gTlVMTDsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogUHlUeXBlT2JqZWN0IFB5RGljdEl0ZXJJdGVtX1R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKLQkiZGljdGlvbmFyeS1pdGVtaXRlcmF0b3IiLAkJLyogdHBfbmFtZSAqLwotCXNpemVvZihkaWN0aXRlcm9iamVjdCksCQkJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJCS8qIHRwX2l0ZW1zaXplICovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKWRpY3RpdGVyX2RlYWxsb2MsIAkJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfY29tcGFyZSAqLwotCTAsCQkJCQkvKiB0cF9yZXByICovCi0JMCwJCQkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJCQkJCS8qIHRwX2hhc2ggKi8KLQkwLAkJCQkJLyogdHBfY2FsbCAqLwotCTAsCQkJCQkvKiB0cF9zdHIgKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQywvKiB0cF9mbGFncyAqLwotIAkwLAkJCQkJLyogdHBfZG9jICovCi0gCSh0cmF2ZXJzZXByb2MpZGljdGl0ZXJfdHJhdmVyc2UsCS8qIHRwX3RyYXZlcnNlICovCi0gCTAsCQkJCQkvKiB0cF9jbGVhciAqLwotCTAsCQkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCVB5T2JqZWN0X1NlbGZJdGVyLAkJCS8qIHRwX2l0ZXIgKi8KLQkoaXRlcm5leHRmdW5jKWRpY3RpdGVyX2l0ZXJuZXh0aXRlbSwJLyogdHBfaXRlcm5leHQgKi8KLQlkaWN0aXRlcl9tZXRob2RzLAkJCS8qIHRwX21ldGhvZHMgKi8KLQkwLAorICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCisgICAgImRpY3Rpb25hcnktaXRlbWl0ZXJhdG9yIiwgICAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCisgICAgc2l6ZW9mKGRpY3RpdGVyb2JqZWN0KSwgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKWRpY3RpdGVyX2RlYWxsb2MsICAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2MpZGljdGl0ZXJfdHJhdmVyc2UsICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICBQeU9iamVjdF9TZWxmSXRlciwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAoaXRlcm5leHRmdW5jKWRpY3RpdGVyX2l0ZXJuZXh0aXRlbSwgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgZGljdGl0ZXJfbWV0aG9kcywgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwKIH07CmRpZmYgLS1naXQgYS9PYmplY3RzL2VudW1vYmplY3QuYyBiL09iamVjdHMvZW51bW9iamVjdC5jCmluZGV4IDM1ODY0ZjYuLjY5MTM3MDkgMTAwNjQ0Ci0tLSBhL09iamVjdHMvZW51bW9iamVjdC5jCisrKyBiL09iamVjdHMvZW51bW9iamVjdC5jCkBAIC0zLDE1OSArMywxNTkgQEAKICNpbmNsdWRlICJQeXRob24uaCIKIAogdHlwZWRlZiBzdHJ1Y3QgewotCVB5T2JqZWN0X0hFQUQKLQlQeV9zc2l6ZV90IGVuX2luZGV4OwkgICAvKiBjdXJyZW50IGluZGV4IG9mIGVudW1lcmF0aW9uICovCi0JUHlPYmplY3QqIGVuX3NpdDsgICAgICAgICAgLyogc2Vjb25kYXJ5IGl0ZXJhdG9yIG9mIGVudW1lcmF0aW9uICovCi0JUHlPYmplY3QqIGVuX3Jlc3VsdDsJICAgLyogcmVzdWx0IHR1cGxlICAqLwotCVB5T2JqZWN0KiBlbl9sb25naW5kZXg7CSAgIC8qIGluZGV4IGZvciBzZXF1ZW5jZXMgPj0gUFlfU1NJWkVfVF9NQVggKi8KKyAgICBQeU9iamVjdF9IRUFECisgICAgUHlfc3NpemVfdCBlbl9pbmRleDsgICAgICAgICAgIC8qIGN1cnJlbnQgaW5kZXggb2YgZW51bWVyYXRpb24gKi8KKyAgICBQeU9iamVjdCogZW5fc2l0OyAgICAgICAgICAvKiBzZWNvbmRhcnkgaXRlcmF0b3Igb2YgZW51bWVyYXRpb24gKi8KKyAgICBQeU9iamVjdCogZW5fcmVzdWx0OyAgICAgICAgICAgLyogcmVzdWx0IHR1cGxlICAqLworICAgIFB5T2JqZWN0KiBlbl9sb25naW5kZXg7ICAgICAgICAvKiBpbmRleCBmb3Igc2VxdWVuY2VzID49IFBZX1NTSVpFX1RfTUFYICovCiB9IGVudW1vYmplY3Q7CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBlbnVtX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQllbnVtb2JqZWN0ICplbjsKLQlQeU9iamVjdCAqc2VxID0gTlVMTDsKLQlQeU9iamVjdCAqc3RhcnQgPSBOVUxMOwotCXN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsic2VxdWVuY2UiLCAic3RhcnQiLCAwfTsKKyAgICBlbnVtb2JqZWN0ICplbjsKKyAgICBQeU9iamVjdCAqc2VxID0gTlVMTDsKKyAgICBQeU9iamVjdCAqc3RhcnQgPSBOVUxMOworICAgIHN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsic2VxdWVuY2UiLCAic3RhcnQiLCAwfTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJPfE86ZW51bWVyYXRlIiwga3dsaXN0LAotCQkJCQkgJnNlcSwgJnN0YXJ0KSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgIk98TzplbnVtZXJhdGUiLCBrd2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlcSwgJnN0YXJ0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQllbiA9IChlbnVtb2JqZWN0ICopdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7Ci0JaWYgKGVuID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWlmIChzdGFydCAhPSBOVUxMKSB7Ci0JCXN0YXJ0ID0gUHlOdW1iZXJfSW5kZXgoc3RhcnQpOwotCQlpZiAoc3RhcnQgPT0gTlVMTCkgewotCQkJUHlfREVDUkVGKGVuKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWFzc2VydChQeUludF9DaGVjayhzdGFydCkgfHwgUHlMb25nX0NoZWNrKHN0YXJ0KSk7Ci0JCWVuLT5lbl9pbmRleCA9IFB5SW50X0FzU3NpemVfdChzdGFydCk7Ci0JCWlmIChlbi0+ZW5faW5kZXggPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewotCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCWVuLT5lbl9pbmRleCA9IFBZX1NTSVpFX1RfTUFYOwotCQkJZW4tPmVuX2xvbmdpbmRleCA9IHN0YXJ0OwotCQl9IGVsc2UgewotCQkJZW4tPmVuX2xvbmdpbmRleCA9IE5VTEw7Ci0JCQlQeV9ERUNSRUYoc3RhcnQpOwotCQl9Ci0JfSBlbHNlIHsKLQkJZW4tPmVuX2luZGV4ID0gMDsKLQkJZW4tPmVuX2xvbmdpbmRleCA9IE5VTEw7Ci0JfQotCWVuLT5lbl9zaXQgPSBQeU9iamVjdF9HZXRJdGVyKHNlcSk7Ci0JaWYgKGVuLT5lbl9zaXQgPT0gTlVMTCkgewotCQlQeV9ERUNSRUYoZW4pOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZW4tPmVuX3Jlc3VsdCA9IFB5VHVwbGVfUGFjaygyLCBQeV9Ob25lLCBQeV9Ob25lKTsKLQlpZiAoZW4tPmVuX3Jlc3VsdCA9PSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRihlbik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gKFB5T2JqZWN0ICopZW47CisgICAgZW4gPSAoZW51bW9iamVjdCAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOworICAgIGlmIChlbiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoc3RhcnQgIT0gTlVMTCkgeworICAgICAgICBzdGFydCA9IFB5TnVtYmVyX0luZGV4KHN0YXJ0KTsKKyAgICAgICAgaWYgKHN0YXJ0ID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihlbik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnQoUHlJbnRfQ2hlY2soc3RhcnQpIHx8IFB5TG9uZ19DaGVjayhzdGFydCkpOworICAgICAgICBlbi0+ZW5faW5kZXggPSBQeUludF9Bc1NzaXplX3Qoc3RhcnQpOworICAgICAgICBpZiAoZW4tPmVuX2luZGV4ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICBlbi0+ZW5faW5kZXggPSBQWV9TU0laRV9UX01BWDsKKyAgICAgICAgICAgIGVuLT5lbl9sb25naW5kZXggPSBzdGFydDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGVuLT5lbl9sb25naW5kZXggPSBOVUxMOworICAgICAgICAgICAgUHlfREVDUkVGKHN0YXJ0KTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGVuLT5lbl9pbmRleCA9IDA7CisgICAgICAgIGVuLT5lbl9sb25naW5kZXggPSBOVUxMOworICAgIH0KKyAgICBlbi0+ZW5fc2l0ID0gUHlPYmplY3RfR2V0SXRlcihzZXEpOworICAgIGlmIChlbi0+ZW5fc2l0ID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKGVuKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGVuLT5lbl9yZXN1bHQgPSBQeVR1cGxlX1BhY2soMiwgUHlfTm9uZSwgUHlfTm9uZSk7CisgICAgaWYgKGVuLT5lbl9yZXN1bHQgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYoZW4pOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWVuOwogfQogCiBzdGF0aWMgdm9pZAogZW51bV9kZWFsbG9jKGVudW1vYmplY3QgKmVuKQogewotCVB5T2JqZWN0X0dDX1VuVHJhY2soZW4pOwotCVB5X1hERUNSRUYoZW4tPmVuX3NpdCk7Ci0JUHlfWERFQ1JFRihlbi0+ZW5fcmVzdWx0KTsKLQlQeV9YREVDUkVGKGVuLT5lbl9sb25naW5kZXgpOwotCVB5X1RZUEUoZW4pLT50cF9mcmVlKGVuKTsKKyAgICBQeU9iamVjdF9HQ19VblRyYWNrKGVuKTsKKyAgICBQeV9YREVDUkVGKGVuLT5lbl9zaXQpOworICAgIFB5X1hERUNSRUYoZW4tPmVuX3Jlc3VsdCk7CisgICAgUHlfWERFQ1JFRihlbi0+ZW5fbG9uZ2luZGV4KTsKKyAgICBQeV9UWVBFKGVuKS0+dHBfZnJlZShlbik7CiB9CiAKIHN0YXRpYyBpbnQKIGVudW1fdHJhdmVyc2UoZW51bW9iamVjdCAqZW4sIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotCVB5X1ZJU0lUKGVuLT5lbl9zaXQpOwotCVB5X1ZJU0lUKGVuLT5lbl9yZXN1bHQpOwotCVB5X1ZJU0lUKGVuLT5lbl9sb25naW5kZXgpOwotCXJldHVybiAwOworICAgIFB5X1ZJU0lUKGVuLT5lbl9zaXQpOworICAgIFB5X1ZJU0lUKGVuLT5lbl9yZXN1bHQpOworICAgIFB5X1ZJU0lUKGVuLT5lbl9sb25naW5kZXgpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZW51bV9uZXh0X2xvbmcoZW51bW9iamVjdCAqZW4sIFB5T2JqZWN0KiBuZXh0X2l0ZW0pCiB7Ci0Jc3RhdGljIFB5T2JqZWN0ICpvbmUgPSBOVUxMOwotCVB5T2JqZWN0ICpyZXN1bHQgPSBlbi0+ZW5fcmVzdWx0OwotCVB5T2JqZWN0ICpuZXh0X2luZGV4OwotCVB5T2JqZWN0ICpzdGVwcGVkX3VwOworICAgIHN0YXRpYyBQeU9iamVjdCAqb25lID0gTlVMTDsKKyAgICBQeU9iamVjdCAqcmVzdWx0ID0gZW4tPmVuX3Jlc3VsdDsKKyAgICBQeU9iamVjdCAqbmV4dF9pbmRleDsKKyAgICBQeU9iamVjdCAqc3RlcHBlZF91cDsKIAotCWlmIChlbi0+ZW5fbG9uZ2luZGV4ID09IE5VTEwpIHsKLQkJZW4tPmVuX2xvbmdpbmRleCA9IFB5SW50X0Zyb21Tc2l6ZV90KFBZX1NTSVpFX1RfTUFYKTsKLQkJaWYgKGVuLT5lbl9sb25naW5kZXggPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCX0KLQlpZiAob25lID09IE5VTEwpIHsKLQkJb25lID0gUHlJbnRfRnJvbUxvbmcoMSk7Ci0JCWlmIChvbmUgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCX0KLQluZXh0X2luZGV4ID0gZW4tPmVuX2xvbmdpbmRleDsKLQlhc3NlcnQobmV4dF9pbmRleCAhPSBOVUxMKTsKLQlzdGVwcGVkX3VwID0gUHlOdW1iZXJfQWRkKG5leHRfaW5kZXgsIG9uZSk7Ci0JaWYgKHN0ZXBwZWRfdXAgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JZW4tPmVuX2xvbmdpbmRleCA9IHN0ZXBwZWRfdXA7CisgICAgaWYgKGVuLT5lbl9sb25naW5kZXggPT0gTlVMTCkgeworICAgICAgICBlbi0+ZW5fbG9uZ2luZGV4ID0gUHlJbnRfRnJvbVNzaXplX3QoUFlfU1NJWkVfVF9NQVgpOworICAgICAgICBpZiAoZW4tPmVuX2xvbmdpbmRleCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChvbmUgPT0gTlVMTCkgeworICAgICAgICBvbmUgPSBQeUludF9Gcm9tTG9uZygxKTsKKyAgICAgICAgaWYgKG9uZSA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIG5leHRfaW5kZXggPSBlbi0+ZW5fbG9uZ2luZGV4OworICAgIGFzc2VydChuZXh0X2luZGV4ICE9IE5VTEwpOworICAgIHN0ZXBwZWRfdXAgPSBQeU51bWJlcl9BZGQobmV4dF9pbmRleCwgb25lKTsKKyAgICBpZiAoc3RlcHBlZF91cCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBlbi0+ZW5fbG9uZ2luZGV4ID0gc3RlcHBlZF91cDsKIAotCWlmIChyZXN1bHQtPm9iX3JlZmNudCA9PSAxKSB7Ci0JCVB5X0lOQ1JFRihyZXN1bHQpOwotCQlQeV9ERUNSRUYoUHlUdXBsZV9HRVRfSVRFTShyZXN1bHQsIDApKTsKLQkJUHlfREVDUkVGKFB5VHVwbGVfR0VUX0lURU0ocmVzdWx0LCAxKSk7Ci0JfSBlbHNlIHsKLQkJcmVzdWx0ID0gUHlUdXBsZV9OZXcoMik7Ci0JCWlmIChyZXN1bHQgPT0gTlVMTCkgewotCQkJUHlfREVDUkVGKG5leHRfaW5kZXgpOwotCQkJUHlfREVDUkVGKG5leHRfaXRlbSk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KLQlQeVR1cGxlX1NFVF9JVEVNKHJlc3VsdCwgMCwgbmV4dF9pbmRleCk7Ci0JUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIDEsIG5leHRfaXRlbSk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBpZiAocmVzdWx0LT5vYl9yZWZjbnQgPT0gMSkgeworICAgICAgICBQeV9JTkNSRUYocmVzdWx0KTsKKyAgICAgICAgUHlfREVDUkVGKFB5VHVwbGVfR0VUX0lURU0ocmVzdWx0LCAwKSk7CisgICAgICAgIFB5X0RFQ1JFRihQeVR1cGxlX0dFVF9JVEVNKHJlc3VsdCwgMSkpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJlc3VsdCA9IFB5VHVwbGVfTmV3KDIpOworICAgICAgICBpZiAocmVzdWx0ID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihuZXh0X2luZGV4KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihuZXh0X2l0ZW0pOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIDAsIG5leHRfaW5kZXgpOworICAgIFB5VHVwbGVfU0VUX0lURU0ocmVzdWx0LCAxLCBuZXh0X2l0ZW0pOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBlbnVtX25leHQoZW51bW9iamVjdCAqZW4pCiB7Ci0JUHlPYmplY3QgKm5leHRfaW5kZXg7Ci0JUHlPYmplY3QgKm5leHRfaXRlbTsKLQlQeU9iamVjdCAqcmVzdWx0ID0gZW4tPmVuX3Jlc3VsdDsKLQlQeU9iamVjdCAqaXQgPSBlbi0+ZW5fc2l0OworICAgIFB5T2JqZWN0ICpuZXh0X2luZGV4OworICAgIFB5T2JqZWN0ICpuZXh0X2l0ZW07CisgICAgUHlPYmplY3QgKnJlc3VsdCA9IGVuLT5lbl9yZXN1bHQ7CisgICAgUHlPYmplY3QgKml0ID0gZW4tPmVuX3NpdDsKIAotCW5leHRfaXRlbSA9ICgqUHlfVFlQRShpdCktPnRwX2l0ZXJuZXh0KShpdCk7Ci0JaWYgKG5leHRfaXRlbSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBuZXh0X2l0ZW0gPSAoKlB5X1RZUEUoaXQpLT50cF9pdGVybmV4dCkoaXQpOworICAgIGlmIChuZXh0X2l0ZW0gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoZW4tPmVuX2luZGV4ID09IFBZX1NTSVpFX1RfTUFYKQotCQlyZXR1cm4gZW51bV9uZXh0X2xvbmcoZW4sIG5leHRfaXRlbSk7CisgICAgaWYgKGVuLT5lbl9pbmRleCA9PSBQWV9TU0laRV9UX01BWCkKKyAgICAgICAgcmV0dXJuIGVudW1fbmV4dF9sb25nKGVuLCBuZXh0X2l0ZW0pOwogCi0JbmV4dF9pbmRleCA9IFB5SW50X0Zyb21Tc2l6ZV90KGVuLT5lbl9pbmRleCk7Ci0JaWYgKG5leHRfaW5kZXggPT0gTlVMTCkgewotCQlQeV9ERUNSRUYobmV4dF9pdGVtKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWVuLT5lbl9pbmRleCsrOworICAgIG5leHRfaW5kZXggPSBQeUludF9Gcm9tU3NpemVfdChlbi0+ZW5faW5kZXgpOworICAgIGlmIChuZXh0X2luZGV4ID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKG5leHRfaXRlbSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBlbi0+ZW5faW5kZXgrKzsKIAotCWlmIChyZXN1bHQtPm9iX3JlZmNudCA9PSAxKSB7Ci0JCVB5X0lOQ1JFRihyZXN1bHQpOwotCQlQeV9ERUNSRUYoUHlUdXBsZV9HRVRfSVRFTShyZXN1bHQsIDApKTsKLQkJUHlfREVDUkVGKFB5VHVwbGVfR0VUX0lURU0ocmVzdWx0LCAxKSk7Ci0JfSBlbHNlIHsKLQkJcmVzdWx0ID0gUHlUdXBsZV9OZXcoMik7Ci0JCWlmIChyZXN1bHQgPT0gTlVMTCkgewotCQkJUHlfREVDUkVGKG5leHRfaW5kZXgpOwotCQkJUHlfREVDUkVGKG5leHRfaXRlbSk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KLQlQeVR1cGxlX1NFVF9JVEVNKHJlc3VsdCwgMCwgbmV4dF9pbmRleCk7Ci0JUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIDEsIG5leHRfaXRlbSk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBpZiAocmVzdWx0LT5vYl9yZWZjbnQgPT0gMSkgeworICAgICAgICBQeV9JTkNSRUYocmVzdWx0KTsKKyAgICAgICAgUHlfREVDUkVGKFB5VHVwbGVfR0VUX0lURU0ocmVzdWx0LCAwKSk7CisgICAgICAgIFB5X0RFQ1JFRihQeVR1cGxlX0dFVF9JVEVNKHJlc3VsdCwgMSkpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJlc3VsdCA9IFB5VHVwbGVfTmV3KDIpOworICAgICAgICBpZiAocmVzdWx0ID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihuZXh0X2luZGV4KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihuZXh0X2l0ZW0pOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIDAsIG5leHRfaW5kZXgpOworICAgIFB5VHVwbGVfU0VUX0lURU0ocmVzdWx0LCAxLCBuZXh0X2l0ZW0pOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIFB5RG9jX1NUUlZBUihlbnVtX2RvYywKQEAgLTE2NywxMjcgKzE2NywxMjcgQEAKICJmb3Igb2J0YWluaW5nIGFuIGluZGV4ZWQgbGlzdDogKDAsIHNlcVswXSksICgxLCBzZXFbMV0pLCAoMiwgc2VxWzJdKSwgLi4uIik7CiAKIFB5VHlwZU9iamVjdCBQeUVudW1fVHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQotCSJlbnVtZXJhdGUiLCAgICAgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLwotCXNpemVvZihlbnVtb2JqZWN0KSwgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcillbnVtX2RlYWxsb2MsICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgIC8qIHRwX2dldGF0dHJvICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDIHwKLQkJUHlfVFBGTEFHU19CQVNFVFlQRSwgICAgLyogdHBfZmxhZ3MgKi8KLQllbnVtX2RvYywgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLwotCSh0cmF2ZXJzZXByb2MpZW51bV90cmF2ZXJzZSwgICAgLyogdHBfdHJhdmVyc2UgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQlQeU9iamVjdF9TZWxmSXRlciwJCS8qIHRwX2l0ZXIgKi8KLQkoaXRlcm5leHRmdW5jKWVudW1fbmV4dCwgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCi0JUHlUeXBlX0dlbmVyaWNBbGxvYywgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLwotCWVudW1fbmV3LCAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCi0JUHlPYmplY3RfR0NfRGVsLCAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKKyAgICAiZW51bWVyYXRlIiwgICAgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICBzaXplb2YoZW51bW9iamVjdCksICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpZW51bV9kZWFsbG9jLCAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQyB8CisgICAgICAgIFB5X1RQRkxBR1NfQkFTRVRZUEUsICAgIC8qIHRwX2ZsYWdzICovCisgICAgZW51bV9kb2MsICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAodHJhdmVyc2Vwcm9jKWVudW1fdHJhdmVyc2UsICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgUHlPYmplY3RfU2VsZkl0ZXIsICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIChpdGVybmV4dGZ1bmMpZW51bV9uZXh0LCAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICBQeVR5cGVfR2VuZXJpY0FsbG9jLCAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgZW51bV9uZXcsICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICBQeU9iamVjdF9HQ19EZWwsICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KIH07CiAKIC8qIFJldmVyc2VkIE9iamVjdCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JUHlfc3NpemVfdCAgICAgIGluZGV4OwotCVB5T2JqZWN0KiBzZXE7CisgICAgUHlPYmplY3RfSEVBRAorICAgIFB5X3NzaXplX3QgICAgICBpbmRleDsKKyAgICBQeU9iamVjdCogc2VxOwogfSByZXZlcnNlZG9iamVjdDsKIAogc3RhdGljIFB5T2JqZWN0ICoKIHJldmVyc2VkX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlQeV9zc2l6ZV90IG47Ci0JUHlPYmplY3QgKnNlcTsKLQlyZXZlcnNlZG9iamVjdCAqcm87CisgICAgUHlfc3NpemVfdCBuOworICAgIFB5T2JqZWN0ICpzZXE7CisgICAgcmV2ZXJzZWRvYmplY3QgKnJvOwogCi0JaWYgKHR5cGUgPT0gJlB5UmV2ZXJzZWRfVHlwZSAmJiAhX1B5QXJnX05vS2V5d29yZHMoInJldmVyc2VkKCkiLCBrd2RzKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKHR5cGUgPT0gJlB5UmV2ZXJzZWRfVHlwZSAmJiAhX1B5QXJnX05vS2V5d29yZHMoInJldmVyc2VkKCkiLCBrd2RzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJyZXZlcnNlZCIsIDEsIDEsICZzZXEpICkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAicmV2ZXJzZWQiLCAxLCAxLCAmc2VxKSApCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKFB5T2JqZWN0X0hhc0F0dHJTdHJpbmcoc2VxLCAiX19yZXZlcnNlZF9fIikpCi0JCXJldHVybiBQeU9iamVjdF9DYWxsTWV0aG9kKHNlcSwgIl9fcmV2ZXJzZWRfXyIsIE5VTEwpOworICAgIGlmIChQeU9iamVjdF9IYXNBdHRyU3RyaW5nKHNlcSwgIl9fcmV2ZXJzZWRfXyIpKQorICAgICAgICByZXR1cm4gUHlPYmplY3RfQ2FsbE1ldGhvZChzZXEsICJfX3JldmVyc2VkX18iLCBOVUxMKTsKIAotCWlmICghUHlTZXF1ZW5jZV9DaGVjayhzZXEpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJImFyZ3VtZW50IHRvIHJldmVyc2VkKCkgbXVzdCBiZSBhIHNlcXVlbmNlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoIVB5U2VxdWVuY2VfQ2hlY2soc2VxKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImFyZ3VtZW50IHRvIHJldmVyc2VkKCkgbXVzdCBiZSBhIHNlcXVlbmNlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCW4gPSBQeVNlcXVlbmNlX1NpemUoc2VxKTsKLQlpZiAobiA9PSAtMSkKLQkJcmV0dXJuIE5VTEw7CisgICAgbiA9IFB5U2VxdWVuY2VfU2l6ZShzZXEpOworICAgIGlmIChuID09IC0xKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXJvID0gKHJldmVyc2Vkb2JqZWN0ICopdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7Ci0JaWYgKHJvID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIHJvID0gKHJldmVyc2Vkb2JqZWN0ICopdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7CisgICAgaWYgKHJvID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0Jcm8tPmluZGV4ID0gbi0xOwotCVB5X0lOQ1JFRihzZXEpOwotCXJvLT5zZXEgPSBzZXE7Ci0JcmV0dXJuIChQeU9iamVjdCAqKXJvOworICAgIHJvLT5pbmRleCA9IG4tMTsKKyAgICBQeV9JTkNSRUYoc2VxKTsKKyAgICByby0+c2VxID0gc2VxOworICAgIHJldHVybiAoUHlPYmplY3QgKilybzsKIH0KIAogc3RhdGljIHZvaWQKIHJldmVyc2VkX2RlYWxsb2MocmV2ZXJzZWRvYmplY3QgKnJvKQogewotCVB5T2JqZWN0X0dDX1VuVHJhY2socm8pOwotCVB5X1hERUNSRUYocm8tPnNlcSk7Ci0JUHlfVFlQRShybyktPnRwX2ZyZWUocm8pOworICAgIFB5T2JqZWN0X0dDX1VuVHJhY2socm8pOworICAgIFB5X1hERUNSRUYocm8tPnNlcSk7CisgICAgUHlfVFlQRShybyktPnRwX2ZyZWUocm8pOwogfQogCiBzdGF0aWMgaW50CiByZXZlcnNlZF90cmF2ZXJzZShyZXZlcnNlZG9iamVjdCAqcm8sIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotCVB5X1ZJU0lUKHJvLT5zZXEpOwotCXJldHVybiAwOworICAgIFB5X1ZJU0lUKHJvLT5zZXEpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogcmV2ZXJzZWRfbmV4dChyZXZlcnNlZG9iamVjdCAqcm8pCiB7Ci0JUHlPYmplY3QgKml0ZW07Ci0JUHlfc3NpemVfdCBpbmRleCA9IHJvLT5pbmRleDsKKyAgICBQeU9iamVjdCAqaXRlbTsKKyAgICBQeV9zc2l6ZV90IGluZGV4ID0gcm8tPmluZGV4OwogCi0JaWYgKGluZGV4ID49IDApIHsKLQkJaXRlbSA9IFB5U2VxdWVuY2VfR2V0SXRlbShyby0+c2VxLCBpbmRleCk7Ci0JCWlmIChpdGVtICE9IE5VTEwpIHsKLQkJCXJvLT5pbmRleC0tOwotCQkJcmV0dXJuIGl0ZW07Ci0JCX0KLQkJaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfSW5kZXhFcnJvcikgfHwKLQkJICAgIFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfU3RvcEl0ZXJhdGlvbikpCi0JCQlQeUVycl9DbGVhcigpOwotCX0KLQlyby0+aW5kZXggPSAtMTsKLQlQeV9DTEVBUihyby0+c2VxKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICBpdGVtID0gUHlTZXF1ZW5jZV9HZXRJdGVtKHJvLT5zZXEsIGluZGV4KTsKKyAgICAgICAgaWYgKGl0ZW0gIT0gTlVMTCkgeworICAgICAgICAgICAgcm8tPmluZGV4LS07CisgICAgICAgICAgICByZXR1cm4gaXRlbTsKKyAgICAgICAgfQorICAgICAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19JbmRleEVycm9yKSB8fAorICAgICAgICAgICAgUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19TdG9wSXRlcmF0aW9uKSkKKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgfQorICAgIHJvLT5pbmRleCA9IC0xOworICAgIFB5X0NMRUFSKHJvLT5zZXEpOworICAgIHJldHVybiBOVUxMOwogfQogCiBQeURvY19TVFJWQVIocmV2ZXJzZWRfZG9jLApAQCAtMjk4LDY0ICsyOTgsNjQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiByZXZlcnNlZF9sZW4ocmV2ZXJzZWRvYmplY3QgKnJvKQogewotCVB5X3NzaXplX3QgcG9zaXRpb24sIHNlcXNpemU7CisgICAgUHlfc3NpemVfdCBwb3NpdGlvbiwgc2Vxc2l6ZTsKIAotCWlmIChyby0+c2VxID09IE5VTEwpCi0JCXJldHVybiBQeUludF9Gcm9tTG9uZygwKTsKLQlzZXFzaXplID0gUHlTZXF1ZW5jZV9TaXplKHJvLT5zZXEpOwotCWlmIChzZXFzaXplID09IC0xKQotCQlyZXR1cm4gTlVMTDsKLQlwb3NpdGlvbiA9IHJvLT5pbmRleCArIDE7Ci0JcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KChzZXFzaXplIDwgcG9zaXRpb24pICA/ICAwICA6ICBwb3NpdGlvbik7CisgICAgaWYgKHJvLT5zZXEgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKDApOworICAgIHNlcXNpemUgPSBQeVNlcXVlbmNlX1NpemUocm8tPnNlcSk7CisgICAgaWYgKHNlcXNpemUgPT0gLTEpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHBvc2l0aW9uID0gcm8tPmluZGV4ICsgMTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QoKHNlcXNpemUgPCBwb3NpdGlvbikgID8gIDAgIDogIHBvc2l0aW9uKTsKIH0KIAogUHlEb2NfU1RSVkFSKGxlbmd0aF9oaW50X2RvYywgIlByaXZhdGUgbWV0aG9kIHJldHVybmluZyBhbiBlc3RpbWF0ZSBvZiBsZW4obGlzdChpdCkpLiIpOwogCiBzdGF0aWMgUHlNZXRob2REZWYgcmV2ZXJzZWRpdGVyX21ldGhvZHNbXSA9IHsKLQl7Il9fbGVuZ3RoX2hpbnRfXyIsIChQeUNGdW5jdGlvbilyZXZlcnNlZF9sZW4sIE1FVEhfTk9BUkdTLCBsZW5ndGhfaGludF9kb2N9LAotIAl7TlVMTCwJCU5VTEx9CQkvKiBzZW50aW5lbCAqLworICAgIHsiX19sZW5ndGhfaGludF9fIiwgKFB5Q0Z1bmN0aW9uKXJldmVyc2VkX2xlbiwgTUVUSF9OT0FSR1MsIGxlbmd0aF9oaW50X2RvY30sCisgICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIFB5VHlwZU9iamVjdCBQeVJldmVyc2VkX1R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKLQkicmV2ZXJzZWQiLCAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KLQlzaXplb2YocmV2ZXJzZWRvYmplY3QpLCAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpcmV2ZXJzZWRfZGVhbGxvYywgICAvKiB0cF9kZWFsbG9jICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MgfAotCQlQeV9UUEZMQUdTX0JBU0VUWVBFLCAgICAvKiB0cF9mbGFncyAqLwotCXJldmVyc2VkX2RvYywgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCi0JKHRyYXZlcnNlcHJvYylyZXZlcnNlZF90cmF2ZXJzZSwvKiB0cF90cmF2ZXJzZSAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCVB5T2JqZWN0X1NlbGZJdGVyLAkJLyogdHBfaXRlciAqLwotCShpdGVybmV4dGZ1bmMpcmV2ZXJzZWRfbmV4dCwgICAgLyogdHBfaXRlcm5leHQgKi8KLQlyZXZlcnNlZGl0ZXJfbWV0aG9kcywJCS8qIHRwX21ldGhvZHMgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KLQlQeVR5cGVfR2VuZXJpY0FsbG9jLCAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCi0JcmV2ZXJzZWRfbmV3LCAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KLQlQeU9iamVjdF9HQ19EZWwsICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQorICAgICJyZXZlcnNlZCIsICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgIHNpemVvZihyZXZlcnNlZG9iamVjdCksICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcilyZXZlcnNlZF9kZWFsbG9jLCAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQyB8CisgICAgICAgIFB5X1RQRkxBR1NfQkFTRVRZUEUsICAgIC8qIHRwX2ZsYWdzICovCisgICAgcmV2ZXJzZWRfZG9jLCAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAodHJhdmVyc2Vwcm9jKXJldmVyc2VkX3RyYXZlcnNlLC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgUHlPYmplY3RfU2VsZkl0ZXIsICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIChpdGVybmV4dGZ1bmMpcmV2ZXJzZWRfbmV4dCwgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICByZXZlcnNlZGl0ZXJfbWV0aG9kcywgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgUHlUeXBlX0dlbmVyaWNBbGxvYywgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIHJldmVyc2VkX25ldywgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgUHlPYmplY3RfR0NfRGVsLCAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCiB9OwpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9leGNlcHRpb25zLmMgYi9PYmplY3RzL2V4Y2VwdGlvbnMuYwppbmRleCBkOThkYzljLi5hZjY3Y2M3IDEwMDY0NAotLS0gYS9PYmplY3RzL2V4Y2VwdGlvbnMuYworKysgYi9PYmplY3RzL2V4Y2VwdGlvbnMuYwpAQCAtMjE4LDcgKzIxOCw3IEBACiBzdGF0aWMgUHlNZXRob2REZWYgQmFzZUV4Y2VwdGlvbl9tZXRob2RzW10gPSB7CiAgICB7Il9fcmVkdWNlX18iLCAoUHlDRnVuY3Rpb24pQmFzZUV4Y2VwdGlvbl9yZWR1Y2UsIE1FVEhfTk9BUkdTIH0sCiAgICB7Il9fc2V0c3RhdGVfXyIsIChQeUNGdW5jdGlvbilCYXNlRXhjZXB0aW9uX3NldHN0YXRlLCBNRVRIX08gfSwKLSNpZmRlZiBQeV9VU0lOR19VTklDT0RFICAgCisjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQogICAgeyJfX3VuaWNvZGVfXyIsIChQeUNGdW5jdGlvbilCYXNlRXhjZXB0aW9uX3VuaWNvZGUsIE1FVEhfTk9BUkdTIH0sCiAjZW5kaWYKICAgIHtOVUxMLCBOVUxMLCAwLCBOVUxMfSwKQEAgLTIzNyw3ICsyMzcsNyBAQAogCiBzdGF0aWMgUHlPYmplY3QgKgogQmFzZUV4Y2VwdGlvbl9nZXRzbGljZShQeUJhc2VFeGNlcHRpb25PYmplY3QgKnNlbGYsCi0JCQlQeV9zc2l6ZV90IHN0YXJ0LCBQeV9zc2l6ZV90IHN0b3ApCisgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IHN0YXJ0LCBQeV9zc2l6ZV90IHN0b3ApCiB7CiAgICAgaWYgKFB5RXJyX1dhcm5QeTNrKCJfX2dldHNsaWNlX18gbm90IHN1cHBvcnRlZCBmb3IgZXhjZXB0aW9uICIKICAgICAgICAgICAgICAgICAgICAgICAgImNsYXNzZXMgaW4gMy54OyB1c2UgYXJncyBhdHRyaWJ1dGUiLCAxKSA8IDApCkBAIC0zMTcsNyArMzE3LDcgQEAKIEJhc2VFeGNlcHRpb25fZ2V0X21lc3NhZ2UoUHlCYXNlRXhjZXB0aW9uT2JqZWN0ICpzZWxmKQogewogICAgIFB5T2JqZWN0ICptc2c7Ci0gICAgCisKICAgICAvKiBpZiAibWVzc2FnZSIgaXMgaW4gc2VsZi0+ZGljdCwgYWNjZXNzaW5nIGEgdXNlci1zZXQgbWVzc2FnZSBhdHRyaWJ1dGUgKi8KICAgICBpZiAoc2VsZi0+ZGljdCAmJgogICAgICAgICAobXNnID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoc2VsZi0+ZGljdCwgIm1lc3NhZ2UiKSkpIHsKQEAgLTM1Myw3ICszNTMsNyBAQAogICAgICAgICBzZWxmLT5tZXNzYWdlID0gTlVMTDsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQotICAgIAorCiAgICAgLyogZWxzZSBzZXQgaXQgaW4gX19kaWN0X18sIGJ1dCBtYXkgbmVlZCB0byBjcmVhdGUgdGhlIGRpY3QgZmlyc3QgKi8KICAgICBpZiAoc2VsZi0+ZGljdCA9PSBOVUxMKSB7CiAgICAgICAgIHNlbGYtPmRpY3QgPSBQeURpY3RfTmV3KCk7CkBAIC0zNjcsNyArMzY3LDcgQEAKICAgICB7Il9fZGljdF9fIiwgKGdldHRlcilCYXNlRXhjZXB0aW9uX2dldF9kaWN0LCAoc2V0dGVyKUJhc2VFeGNlcHRpb25fc2V0X2RpY3R9LAogICAgIHsiYXJncyIsIChnZXR0ZXIpQmFzZUV4Y2VwdGlvbl9nZXRfYXJncywgKHNldHRlcilCYXNlRXhjZXB0aW9uX3NldF9hcmdzfSwKICAgICB7Im1lc3NhZ2UiLCAoZ2V0dGVyKUJhc2VFeGNlcHRpb25fZ2V0X21lc3NhZ2UsCi0JICAgIChzZXR0ZXIpQmFzZUV4Y2VwdGlvbl9zZXRfbWVzc2FnZX0sCisgICAgICAgICAgICAoc2V0dGVyKUJhc2VFeGNlcHRpb25fc2V0X21lc3NhZ2V9LAogICAgIHtOVUxMfSwKIH07CiAKQEAgLTM5NCw3ICszOTQsNyBAQAogICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAgICAvKnRwX3NldGF0dHJvKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19idWZmZXIqLwogICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfQkFTRVRZUEUgfCBQeV9UUEZMQUdTX0hBVkVfR0MgfAotICAgIAlQeV9UUEZMQUdTX0JBU0VfRVhDX1NVQkNMQVNTLCAgLyp0cF9mbGFncyovCisgICAgICAgIFB5X1RQRkxBR1NfQkFTRV9FWENfU1VCQ0xBU1MsICAvKnRwX2ZsYWdzKi8KICAgICBQeURvY19TVFIoIkNvbW1vbiBiYXNlIGNsYXNzIGZvciBhbGwgZXhjZXB0aW9ucyIpLCAvKiB0cF9kb2MgKi8KICAgICAodHJhdmVyc2Vwcm9jKUJhc2VFeGNlcHRpb25fdHJhdmVyc2UsIC8qIHRwX3RyYXZlcnNlICovCiAgICAgKGlucXVpcnkpQmFzZUV4Y2VwdGlvbl9jbGVhciwgLyogdHBfY2xlYXIgKi8KQEAgLTIwNTQsOCArMjA1NCw4IEBACiAvKiBjcnQgdmFyaWFibGUgY2hlY2tpbmcgaW4gVmlzdWFsU3R1ZGlvIC5ORVQgMjAwNSAqLwogI2luY2x1ZGUgPGNydGRiZy5oPgogCi1zdGF0aWMgaW50CXByZXZDcnRSZXBvcnRNb2RlOwotc3RhdGljIF9pbnZhbGlkX3BhcmFtZXRlcl9oYW5kbGVyCXByZXZDcnRIYW5kbGVyOworc3RhdGljIGludCAgICAgIHByZXZDcnRSZXBvcnRNb2RlOworc3RhdGljIF9pbnZhbGlkX3BhcmFtZXRlcl9oYW5kbGVyICAgICAgIHByZXZDcnRIYW5kbGVyOwogCiAvKiBJbnZhbGlkIHBhcmFtZXRlciBoYW5kbGVyLiAgU2V0cyBhIFZhbHVlRXJyb3IgZXhjZXB0aW9uICovCiBzdGF0aWMgdm9pZApAQCAtMjIwOSwyNSArMjIwOSwyNSBAQAogCiAgICAgUHlFeGNfUmVjdXJzaW9uRXJyb3JJbnN0ID0gQmFzZUV4Y2VwdGlvbl9uZXcoJl9QeUV4Y19SdW50aW1lRXJyb3IsIE5VTEwsIE5VTEwpOwogICAgIGlmICghUHlFeGNfUmVjdXJzaW9uRXJyb3JJbnN0KQotCVB5X0ZhdGFsRXJyb3IoIkNhbm5vdCBwcmUtYWxsb2NhdGUgUnVudGltZUVycm9yIGluc3RhbmNlIGZvciAiCi0JCQkicmVjdXJzaW9uIGVycm9ycyIpOworICAgICAgICBQeV9GYXRhbEVycm9yKCJDYW5ub3QgcHJlLWFsbG9jYXRlIFJ1bnRpbWVFcnJvciBpbnN0YW5jZSBmb3IgIgorICAgICAgICAgICAgICAgICAgICAgICAgInJlY3Vyc2lvbiBlcnJvcnMiKTsKICAgICBlbHNlIHsKLQlQeUJhc2VFeGNlcHRpb25PYmplY3QgKmVycl9pbnN0ID0KLQkgICAgKFB5QmFzZUV4Y2VwdGlvbk9iamVjdCAqKVB5RXhjX1JlY3Vyc2lvbkVycm9ySW5zdDsKLQlQeU9iamVjdCAqYXJnc190dXBsZTsKLQlQeU9iamVjdCAqZXhjX21lc3NhZ2U7Ci0JZXhjX21lc3NhZ2UgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCJtYXhpbXVtIHJlY3Vyc2lvbiBkZXB0aCBleGNlZWRlZCIpOwotCWlmICghZXhjX21lc3NhZ2UpCi0JICAgIFB5X0ZhdGFsRXJyb3IoImNhbm5vdCBhbGxvY2F0ZSBhcmd1bWVudCBmb3IgUnVudGltZUVycm9yICIKLQkJCSAgICAicHJlLWFsbG9jYXRpb24iKTsKLQlhcmdzX3R1cGxlID0gUHlUdXBsZV9QYWNrKDEsIGV4Y19tZXNzYWdlKTsKLQlpZiAoIWFyZ3NfdHVwbGUpCi0JICAgIFB5X0ZhdGFsRXJyb3IoImNhbm5vdCBhbGxvY2F0ZSB0dXBsZSBmb3IgUnVudGltZUVycm9yICIKLQkJCSAgICAicHJlLWFsbG9jYXRpb24iKTsKLQlQeV9ERUNSRUYoZXhjX21lc3NhZ2UpOwotCWlmIChCYXNlRXhjZXB0aW9uX2luaXQoZXJyX2luc3QsIGFyZ3NfdHVwbGUsIE5VTEwpKQotCSAgICBQeV9GYXRhbEVycm9yKCJpbml0IG9mIHByZS1hbGxvY2F0ZWQgUnVudGltZUVycm9yIGZhaWxlZCIpOwotCVB5X0RFQ1JFRihhcmdzX3R1cGxlKTsKKyAgICAgICAgUHlCYXNlRXhjZXB0aW9uT2JqZWN0ICplcnJfaW5zdCA9CisgICAgICAgICAgICAoUHlCYXNlRXhjZXB0aW9uT2JqZWN0ICopUHlFeGNfUmVjdXJzaW9uRXJyb3JJbnN0OworICAgICAgICBQeU9iamVjdCAqYXJnc190dXBsZTsKKyAgICAgICAgUHlPYmplY3QgKmV4Y19tZXNzYWdlOworICAgICAgICBleGNfbWVzc2FnZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIm1heGltdW0gcmVjdXJzaW9uIGRlcHRoIGV4Y2VlZGVkIik7CisgICAgICAgIGlmICghZXhjX21lc3NhZ2UpCisgICAgICAgICAgICBQeV9GYXRhbEVycm9yKCJjYW5ub3QgYWxsb2NhdGUgYXJndW1lbnQgZm9yIFJ1bnRpbWVFcnJvciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInByZS1hbGxvY2F0aW9uIik7CisgICAgICAgIGFyZ3NfdHVwbGUgPSBQeVR1cGxlX1BhY2soMSwgZXhjX21lc3NhZ2UpOworICAgICAgICBpZiAoIWFyZ3NfdHVwbGUpCisgICAgICAgICAgICBQeV9GYXRhbEVycm9yKCJjYW5ub3QgYWxsb2NhdGUgdHVwbGUgZm9yIFJ1bnRpbWVFcnJvciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInByZS1hbGxvY2F0aW9uIik7CisgICAgICAgIFB5X0RFQ1JFRihleGNfbWVzc2FnZSk7CisgICAgICAgIGlmIChCYXNlRXhjZXB0aW9uX2luaXQoZXJyX2luc3QsIGFyZ3NfdHVwbGUsIE5VTEwpKQorICAgICAgICAgICAgUHlfRmF0YWxFcnJvcigiaW5pdCBvZiBwcmUtYWxsb2NhdGVkIFJ1bnRpbWVFcnJvciBmYWlsZWQiKTsKKyAgICAgICAgUHlfREVDUkVGKGFyZ3NfdHVwbGUpOwogICAgIH0KIAogICAgIFB5X0RFQ1JFRihibHRpbm1vZCk7CmRpZmYgLS1naXQgYS9PYmplY3RzL2ZpbGVvYmplY3QuYyBiL09iamVjdHMvZmlsZW9iamVjdC5jCmluZGV4IDUyZDgxMjAuLmI5ZDkwOTcgMTAwNjQ0Ci0tLSBhL09iamVjdHMvZmlsZW9iamVjdC5jCisrKyBiL09iamVjdHMvZmlsZW9iamVjdC5jCkBAIC00MywxMCArNDMsMTAgQEAKICNlbmRpZgogCiAvKiBCaXRzIGluIGZfbmV3bGluZXR5cGVzICovCi0jZGVmaW5lIE5FV0xJTkVfVU5LTk9XTgkwCS8qIE5vIG5ld2xpbmUgc2VlbiwgeWV0ICovCi0jZGVmaW5lIE5FV0xJTkVfQ1IgMQkJLyogXHIgbmV3bGluZSBzZWVuICovCi0jZGVmaW5lIE5FV0xJTkVfTEYgMgkJLyogXG4gbmV3bGluZSBzZWVuICovCi0jZGVmaW5lIE5FV0xJTkVfQ1JMRiA0CQkvKiBcclxuIG5ld2xpbmUgc2VlbiAqLworI2RlZmluZSBORVdMSU5FX1VOS05PV04gMCAgICAgICAvKiBObyBuZXdsaW5lIHNlZW4sIHlldCAqLworI2RlZmluZSBORVdMSU5FX0NSIDEgICAgICAgICAgICAvKiBcciBuZXdsaW5lIHNlZW4gKi8KKyNkZWZpbmUgTkVXTElORV9MRiAyICAgICAgICAgICAgLyogXG4gbmV3bGluZSBzZWVuICovCisjZGVmaW5lIE5FV0xJTkVfQ1JMRiA0ICAgICAgICAgIC8qIFxyXG4gbmV3bGluZSBzZWVuICovCiAKIC8qCiAgKiBUaGVzZSBtYWNyb3MgcmVsZWFzZSB0aGUgR0lMIHdoaWxlIHByZXZlbnRpbmcgdGhlIGZfY2xvc2UoKSBmdW5jdGlvbiBiZWluZwpAQCAtNTgsMTkgKzU4LDE5IEBACiAKICNkZWZpbmUgRklMRV9CRUdJTl9BTExPV19USFJFQURTKGZvYmopIFwKIHsgXAotCWZvYmotPnVubG9ja2VkX2NvdW50Kys7IFwKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgZm9iai0+dW5sb2NrZWRfY291bnQrKzsgXAorICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKIAogI2RlZmluZSBGSUxFX0VORF9BTExPV19USFJFQURTKGZvYmopIFwKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUyBcCi0JZm9iai0+dW5sb2NrZWRfY291bnQtLTsgXAotCWFzc2VydChmb2JqLT51bmxvY2tlZF9jb3VudCA+PSAwKTsgXAorICAgIFB5X0VORF9BTExPV19USFJFQURTIFwKKyAgICBmb2JqLT51bmxvY2tlZF9jb3VudC0tOyBcCisgICAgYXNzZXJ0KGZvYmotPnVubG9ja2VkX2NvdW50ID49IDApOyBcCiB9CiAKICNkZWZpbmUgRklMRV9BQk9SVF9BTExPV19USFJFQURTKGZvYmopIFwKLQlQeV9CTE9DS19USFJFQURTIFwKLQlmb2JqLT51bmxvY2tlZF9jb3VudC0tOyBcCi0JYXNzZXJ0KGZvYmotPnVubG9ja2VkX2NvdW50ID49IDApOworICAgIFB5X0JMT0NLX1RIUkVBRFMgXAorICAgIGZvYmotPnVubG9ja2VkX2NvdW50LS07IFwKKyAgICBhc3NlcnQoZm9iai0+dW5sb2NrZWRfY291bnQgPj0gMCk7CiAKICNpZmRlZiBfX2NwbHVzcGx1cwogZXh0ZXJuICJDIiB7CkBAIC03OSwzMCArNzksMzAgQEAKIEZJTEUgKgogUHlGaWxlX0FzRmlsZShQeU9iamVjdCAqZikKIHsKLQlpZiAoZiA9PSBOVUxMIHx8ICFQeUZpbGVfQ2hlY2soZikpCi0JCXJldHVybiBOVUxMOwotCWVsc2UKLQkJcmV0dXJuICgoUHlGaWxlT2JqZWN0ICopZiktPmZfZnA7CisgICAgaWYgKGYgPT0gTlVMTCB8fCAhUHlGaWxlX0NoZWNrKGYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiAoKFB5RmlsZU9iamVjdCAqKWYpLT5mX2ZwOwogfQogCiB2b2lkIFB5RmlsZV9JbmNVc2VDb3VudChQeUZpbGVPYmplY3QgKmZvYmopCiB7Ci0JZm9iai0+dW5sb2NrZWRfY291bnQrKzsKKyAgICBmb2JqLT51bmxvY2tlZF9jb3VudCsrOwogfQogCiB2b2lkIFB5RmlsZV9EZWNVc2VDb3VudChQeUZpbGVPYmplY3QgKmZvYmopCiB7Ci0JZm9iai0+dW5sb2NrZWRfY291bnQtLTsKLQlhc3NlcnQoZm9iai0+dW5sb2NrZWRfY291bnQgPj0gMCk7CisgICAgZm9iai0+dW5sb2NrZWRfY291bnQtLTsKKyAgICBhc3NlcnQoZm9iai0+dW5sb2NrZWRfY291bnQgPj0gMCk7CiB9CiAKIFB5T2JqZWN0ICoKIFB5RmlsZV9OYW1lKFB5T2JqZWN0ICpmKQogewotCWlmIChmID09IE5VTEwgfHwgIVB5RmlsZV9DaGVjayhmKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZWxzZQotCQlyZXR1cm4gKChQeUZpbGVPYmplY3QgKilmKS0+Zl9uYW1lOworICAgIGlmIChmID09IE5VTEwgfHwgIVB5RmlsZV9DaGVjayhmKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gKChQeUZpbGVPYmplY3QgKilmKS0+Zl9uYW1lOwogfQogCiAvKiBUaGlzIGlzIGEgc2FmZSB3cmFwcGVyIGFyb3VuZCBQeU9iamVjdF9QcmludCB0byBwcmludCB0byB0aGUgRklMRQpAQCAtMTExLDExICsxMTEsMTEgQEAKIHN0YXRpYyBpbnQKIGZpbGVfUHlPYmplY3RfUHJpbnQoUHlPYmplY3QgKm9wLCBQeUZpbGVPYmplY3QgKmYsIGludCBmbGFncykKIHsKLQlpbnQgcmVzdWx0OwotCVB5RmlsZV9JbmNVc2VDb3VudChmKTsKLQlyZXN1bHQgPSBQeU9iamVjdF9QcmludChvcCwgZi0+Zl9mcCwgZmxhZ3MpOwotCVB5RmlsZV9EZWNVc2VDb3VudChmKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIGludCByZXN1bHQ7CisgICAgUHlGaWxlX0luY1VzZUNvdW50KGYpOworICAgIHJlc3VsdCA9IFB5T2JqZWN0X1ByaW50KG9wLCBmLT5mX2ZwLCBmbGFncyk7CisgICAgUHlGaWxlX0RlY1VzZUNvdW50KGYpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIC8qIE9uIFVuaXgsIGZvcGVuIHdpbGwgc3VjY2VlZCBmb3IgZGlyZWN0b3JpZXMuCkBAIC0xMjYsNjYgKzEyNiw2NiBAQAogZGlyY2hlY2soUHlGaWxlT2JqZWN0KiBmKQogewogI2lmIGRlZmluZWQoSEFWRV9GU1RBVCkgJiYgZGVmaW5lZChTX0lGRElSKSAmJiBkZWZpbmVkKEVJU0RJUikKLQlzdHJ1Y3Qgc3RhdCBidWY7Ci0JaWYgKGYtPmZfZnAgPT0gTlVMTCkKLQkJcmV0dXJuIGY7Ci0JaWYgKGZzdGF0KGZpbGVubyhmLT5mX2ZwKSwgJmJ1ZikgPT0gMCAmJgotCSAgICBTX0lTRElSKGJ1Zi5zdF9tb2RlKSkgewotCQljaGFyICptc2cgPSBzdHJlcnJvcihFSVNESVIpOwotCQlQeU9iamVjdCAqZXhjID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKFB5RXhjX0lPRXJyb3IsICIoaXNPKSIsCi0JCQkJCQkgICAgICBFSVNESVIsIG1zZywgZi0+Zl9uYW1lKTsKLQkJUHlFcnJfU2V0T2JqZWN0KFB5RXhjX0lPRXJyb3IsIGV4Yyk7Ci0JCVB5X1hERUNSRUYoZXhjKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIHN0cnVjdCBzdGF0IGJ1ZjsKKyAgICBpZiAoZi0+Zl9mcCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gZjsKKyAgICBpZiAoZnN0YXQoZmlsZW5vKGYtPmZfZnApLCAmYnVmKSA9PSAwICYmCisgICAgICAgIFNfSVNESVIoYnVmLnN0X21vZGUpKSB7CisgICAgICAgIGNoYXIgKm1zZyA9IHN0cmVycm9yKEVJU0RJUik7CisgICAgICAgIFB5T2JqZWN0ICpleGMgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oUHlFeGNfSU9FcnJvciwgIihpc08pIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFSVNESVIsIG1zZywgZi0+Zl9uYW1lKTsKKyAgICAgICAgUHlFcnJfU2V0T2JqZWN0KFB5RXhjX0lPRXJyb3IsIGV4Yyk7CisgICAgICAgIFB5X1hERUNSRUYoZXhjKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogI2VuZGlmCi0JcmV0dXJuIGY7CisgICAgcmV0dXJuIGY7CiB9CiAKIAogc3RhdGljIFB5T2JqZWN0ICoKIGZpbGxfZmlsZV9maWVsZHMoUHlGaWxlT2JqZWN0ICpmLCBGSUxFICpmcCwgUHlPYmplY3QgKm5hbWUsIGNoYXIgKm1vZGUsCi0JCSBpbnQgKCpjbG9zZSkoRklMRSAqKSkKKyAgICAgICAgICAgICAgICAgaW50ICgqY2xvc2UpKEZJTEUgKikpCiB7Ci0JYXNzZXJ0KG5hbWUgIT0gTlVMTCk7Ci0JYXNzZXJ0KGYgIT0gTlVMTCk7Ci0JYXNzZXJ0KFB5RmlsZV9DaGVjayhmKSk7Ci0JYXNzZXJ0KGYtPmZfZnAgPT0gTlVMTCk7CisgICAgYXNzZXJ0KG5hbWUgIT0gTlVMTCk7CisgICAgYXNzZXJ0KGYgIT0gTlVMTCk7CisgICAgYXNzZXJ0KFB5RmlsZV9DaGVjayhmKSk7CisgICAgYXNzZXJ0KGYtPmZfZnAgPT0gTlVMTCk7CiAKLQlQeV9ERUNSRUYoZi0+Zl9uYW1lKTsKLQlQeV9ERUNSRUYoZi0+Zl9tb2RlKTsKLQlQeV9ERUNSRUYoZi0+Zl9lbmNvZGluZyk7Ci0JUHlfREVDUkVGKGYtPmZfZXJyb3JzKTsKKyAgICBQeV9ERUNSRUYoZi0+Zl9uYW1lKTsKKyAgICBQeV9ERUNSRUYoZi0+Zl9tb2RlKTsKKyAgICBQeV9ERUNSRUYoZi0+Zl9lbmNvZGluZyk7CisgICAgUHlfREVDUkVGKGYtPmZfZXJyb3JzKTsKIAotICAgICAgICBQeV9JTkNSRUYobmFtZSk7Ci0gICAgICAgIGYtPmZfbmFtZSA9IG5hbWU7CisgICAgUHlfSU5DUkVGKG5hbWUpOworICAgIGYtPmZfbmFtZSA9IG5hbWU7CiAKLQlmLT5mX21vZGUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKG1vZGUpOworICAgIGYtPmZfbW9kZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmcobW9kZSk7CiAKLQlmLT5mX2Nsb3NlID0gY2xvc2U7Ci0JZi0+Zl9zb2Z0c3BhY2UgPSAwOwotCWYtPmZfYmluYXJ5ID0gc3RyY2hyKG1vZGUsJ2InKSAhPSBOVUxMOwotCWYtPmZfYnVmID0gTlVMTDsKLQlmLT5mX3VuaXZfbmV3bGluZSA9IChzdHJjaHIobW9kZSwgJ1UnKSAhPSBOVUxMKTsKLQlmLT5mX25ld2xpbmV0eXBlcyA9IE5FV0xJTkVfVU5LTk9XTjsKLQlmLT5mX3NraXBuZXh0bGYgPSAwOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlmLT5mX2VuY29kaW5nID0gUHlfTm9uZTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JZi0+Zl9lcnJvcnMgPSBQeV9Ob25lOwotCWYtPnJlYWRhYmxlID0gZi0+d3JpdGFibGUgPSAwOwotCWlmIChzdHJjaHIobW9kZSwgJ3InKSAhPSBOVUxMIHx8IGYtPmZfdW5pdl9uZXdsaW5lKQotCQlmLT5yZWFkYWJsZSA9IDE7Ci0JaWYgKHN0cmNocihtb2RlLCAndycpICE9IE5VTEwgfHwgc3RyY2hyKG1vZGUsICdhJykgIT0gTlVMTCkKLQkJZi0+d3JpdGFibGUgPSAxOwotCWlmIChzdHJjaHIobW9kZSwgJysnKSAhPSBOVUxMKQotCQlmLT5yZWFkYWJsZSA9IGYtPndyaXRhYmxlID0gMTsKKyAgICBmLT5mX2Nsb3NlID0gY2xvc2U7CisgICAgZi0+Zl9zb2Z0c3BhY2UgPSAwOworICAgIGYtPmZfYmluYXJ5ID0gc3RyY2hyKG1vZGUsJ2InKSAhPSBOVUxMOworICAgIGYtPmZfYnVmID0gTlVMTDsKKyAgICBmLT5mX3VuaXZfbmV3bGluZSA9IChzdHJjaHIobW9kZSwgJ1UnKSAhPSBOVUxMKTsKKyAgICBmLT5mX25ld2xpbmV0eXBlcyA9IE5FV0xJTkVfVU5LTk9XTjsKKyAgICBmLT5mX3NraXBuZXh0bGYgPSAwOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBmLT5mX2VuY29kaW5nID0gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgZi0+Zl9lcnJvcnMgPSBQeV9Ob25lOworICAgIGYtPnJlYWRhYmxlID0gZi0+d3JpdGFibGUgPSAwOworICAgIGlmIChzdHJjaHIobW9kZSwgJ3InKSAhPSBOVUxMIHx8IGYtPmZfdW5pdl9uZXdsaW5lKQorICAgICAgICBmLT5yZWFkYWJsZSA9IDE7CisgICAgaWYgKHN0cmNocihtb2RlLCAndycpICE9IE5VTEwgfHwgc3RyY2hyKG1vZGUsICdhJykgIT0gTlVMTCkKKyAgICAgICAgZi0+d3JpdGFibGUgPSAxOworICAgIGlmIChzdHJjaHIobW9kZSwgJysnKSAhPSBOVUxMKQorICAgICAgICBmLT5yZWFkYWJsZSA9IGYtPndyaXRhYmxlID0gMTsKIAotCWlmIChmLT5mX21vZGUgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JZi0+Zl9mcCA9IGZwOwotICAgICAgICBmID0gZGlyY2hlY2soZik7Ci0JcmV0dXJuIChQeU9iamVjdCAqKSBmOworICAgIGlmIChmLT5mX21vZGUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZi0+Zl9mcCA9IGZwOworICAgIGYgPSBkaXJjaGVjayhmKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopIGY7CiB9CiAKIC8qIGNoZWNrIGZvciBrbm93biBpbmNvcnJlY3QgbW9kZSBzdHJpbmdzIC0gcHJvYmxlbSBpcywgcGxhdGZvcm1zIGFyZQpAQCAtMTk3LDI1OCArMTk3LDI1OCBAQAogaW50CiBfUHlGaWxlX1Nhbml0aXplTW9kZShjaGFyICptb2RlKQogewotCWNoYXIgKnVwb3M7Ci0Jc2l6ZV90IGxlbiA9IHN0cmxlbihtb2RlKTsKKyAgICBjaGFyICp1cG9zOworICAgIHNpemVfdCBsZW4gPSBzdHJsZW4obW9kZSk7CiAKLQlpZiAoIWxlbikgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImVtcHR5IG1vZGUgc3RyaW5nIik7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgaWYgKCFsZW4pIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJlbXB0eSBtb2RlIHN0cmluZyIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JdXBvcyA9IHN0cmNocihtb2RlLCAnVScpOwotCWlmICh1cG9zKSB7Ci0JCW1lbW1vdmUodXBvcywgdXBvcysxLCBsZW4tKHVwb3MtbW9kZSkpOyAvKiBpbmNsIG51bGwgY2hhciAqLworICAgIHVwb3MgPSBzdHJjaHIobW9kZSwgJ1UnKTsKKyAgICBpZiAodXBvcykgeworICAgICAgICBtZW1tb3ZlKHVwb3MsIHVwb3MrMSwgbGVuLSh1cG9zLW1vZGUpKTsgLyogaW5jbCBudWxsIGNoYXIgKi8KIAotCQlpZiAobW9kZVswXSA9PSAndycgfHwgbW9kZVswXSA9PSAnYScpIHsKLQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLCAidW5pdmVyc2FsIG5ld2xpbmUgIgotCQkJICAgICAgICAgICAgICJtb2RlIGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBtb2RlcyAiCi0JCQkJICAgICAic3RhcnRpbmcgd2l0aCAnciciKTsKLQkJCXJldHVybiAtMTsKLQkJfQorICAgICAgICBpZiAobW9kZVswXSA9PSAndycgfHwgbW9kZVswXSA9PSAnYScpIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLCAidW5pdmVyc2FsIG5ld2xpbmUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJtb2RlIGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBtb2RlcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgInN0YXJ0aW5nIHdpdGggJ3InIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KIAotCQlpZiAobW9kZVswXSAhPSAncicpIHsKLQkJCW1lbW1vdmUobW9kZSsxLCBtb2RlLCBzdHJsZW4obW9kZSkrMSk7Ci0JCQltb2RlWzBdID0gJ3InOwotCQl9CisgICAgICAgIGlmIChtb2RlWzBdICE9ICdyJykgeworICAgICAgICAgICAgbWVtbW92ZShtb2RlKzEsIG1vZGUsIHN0cmxlbihtb2RlKSsxKTsKKyAgICAgICAgICAgIG1vZGVbMF0gPSAncic7CisgICAgICAgIH0KIAotCQlpZiAoIXN0cmNocihtb2RlLCAnYicpKSB7Ci0JCQltZW1tb3ZlKG1vZGUrMiwgbW9kZSsxLCBzdHJsZW4obW9kZSkpOwotCQkJbW9kZVsxXSA9ICdiJzsKLQkJfQotCX0gZWxzZSBpZiAobW9kZVswXSAhPSAncicgJiYgbW9kZVswXSAhPSAndycgJiYgbW9kZVswXSAhPSAnYScpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsICJtb2RlIHN0cmluZyBtdXN0IGJlZ2luIHdpdGggIgotCSAgICAgICAgCSAgICAib25lIG9mICdyJywgJ3cnLCAnYScgb3IgJ1UnLCBub3QgJyUuMjAwcyciLCBtb2RlKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICAgICAgaWYgKCFzdHJjaHIobW9kZSwgJ2InKSkgeworICAgICAgICAgICAgbWVtbW92ZShtb2RlKzIsIG1vZGUrMSwgc3RybGVuKG1vZGUpKTsKKyAgICAgICAgICAgIG1vZGVbMV0gPSAnYic7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKG1vZGVbMF0gIT0gJ3InICYmIG1vZGVbMF0gIT0gJ3cnICYmIG1vZGVbMF0gIT0gJ2EnKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLCAibW9kZSBzdHJpbmcgbXVzdCBiZWdpbiB3aXRoICIKKyAgICAgICAgICAgICAgICAgICAgIm9uZSBvZiAncicsICd3JywgJ2EnIG9yICdVJywgbm90ICclLjIwMHMnIiwgbW9kZSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG9wZW5fdGhlX2ZpbGUoUHlGaWxlT2JqZWN0ICpmLCBjaGFyICpuYW1lLCBjaGFyICptb2RlKQogewotCWNoYXIgKm5ld21vZGU7Ci0JYXNzZXJ0KGYgIT0gTlVMTCk7Ci0JYXNzZXJ0KFB5RmlsZV9DaGVjayhmKSk7CisgICAgY2hhciAqbmV3bW9kZTsKKyAgICBhc3NlcnQoZiAhPSBOVUxMKTsKKyAgICBhc3NlcnQoUHlGaWxlX0NoZWNrKGYpKTsKICNpZmRlZiBNU19XSU5ET1dTCi0JLyogd2luZG93cyBpZ25vcmVzIHRoZSBwYXNzZWQgbmFtZSBpbiBvcmRlciB0byBzdXBwb3J0IFVuaWNvZGUgKi8KLQlhc3NlcnQoZi0+Zl9uYW1lICE9IE5VTEwpOworICAgIC8qIHdpbmRvd3MgaWdub3JlcyB0aGUgcGFzc2VkIG5hbWUgaW4gb3JkZXIgdG8gc3VwcG9ydCBVbmljb2RlICovCisgICAgYXNzZXJ0KGYtPmZfbmFtZSAhPSBOVUxMKTsKICNlbHNlCi0JYXNzZXJ0KG5hbWUgIT0gTlVMTCk7CisgICAgYXNzZXJ0KG5hbWUgIT0gTlVMTCk7CiAjZW5kaWYKLQlhc3NlcnQobW9kZSAhPSBOVUxMKTsKLQlhc3NlcnQoZi0+Zl9mcCA9PSBOVUxMKTsKKyAgICBhc3NlcnQobW9kZSAhPSBOVUxMKTsKKyAgICBhc3NlcnQoZi0+Zl9mcCA9PSBOVUxMKTsKIAotCS8qIHByb2JhYmx5IG5lZWQgdG8gcmVwbGFjZSAnVScgYnkgJ3JiJyAqLwotCW5ld21vZGUgPSBQeU1lbV9NQUxMT0Moc3RybGVuKG1vZGUpICsgMyk7Ci0JaWYgKCFuZXdtb2RlKSB7Ci0JCVB5RXJyX05vTWVtb3J5KCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlzdHJjcHkobmV3bW9kZSwgbW9kZSk7CisgICAgLyogcHJvYmFibHkgbmVlZCB0byByZXBsYWNlICdVJyBieSAncmInICovCisgICAgbmV3bW9kZSA9IFB5TWVtX01BTExPQyhzdHJsZW4obW9kZSkgKyAzKTsKKyAgICBpZiAoIW5ld21vZGUpIHsKKyAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHN0cmNweShuZXdtb2RlLCBtb2RlKTsKIAotCWlmIChfUHlGaWxlX1Nhbml0aXplTW9kZShuZXdtb2RlKSkgewotCQlmID0gTlVMTDsKLQkJZ290byBjbGVhbnVwOwotCX0KKyAgICBpZiAoX1B5RmlsZV9TYW5pdGl6ZU1vZGUobmV3bW9kZSkpIHsKKyAgICAgICAgZiA9IE5VTEw7CisgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICB9CiAKLQkvKiByZXhlYy5weSBjYW4ndCBzdG9wIGEgdXNlciBmcm9tIGdldHRpbmcgdGhlIGZpbGUoKSBjb25zdHJ1Y3RvciAtLQotCSAgIGFsbCB0aGV5IGhhdmUgdG8gZG8gaXMgZ2V0ICphbnkqIGZpbGUgb2JqZWN0IGYsIGFuZCB0aGVuIGRvCi0JICAgdHlwZShmKS4gIEhlcmUgd2UgcHJldmVudCB0aGVtIGZyb20gZG9pbmcgZGFtYWdlIHdpdGggaXQuICovCi0JaWYgKFB5RXZhbF9HZXRSZXN0cmljdGVkKCkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0lPRXJyb3IsCi0JCSJmaWxlKCkgY29uc3RydWN0b3Igbm90IGFjY2Vzc2libGUgaW4gcmVzdHJpY3RlZCBtb2RlIik7Ci0JCWYgPSBOVUxMOwotCQlnb3RvIGNsZWFudXA7Ci0JfQotCWVycm5vID0gMDsKKyAgICAvKiByZXhlYy5weSBjYW4ndCBzdG9wIGEgdXNlciBmcm9tIGdldHRpbmcgdGhlIGZpbGUoKSBjb25zdHJ1Y3RvciAtLQorICAgICAgIGFsbCB0aGV5IGhhdmUgdG8gZG8gaXMgZ2V0ICphbnkqIGZpbGUgb2JqZWN0IGYsIGFuZCB0aGVuIGRvCisgICAgICAgdHlwZShmKS4gIEhlcmUgd2UgcHJldmVudCB0aGVtIGZyb20gZG9pbmcgZGFtYWdlIHdpdGggaXQuICovCisgICAgaWYgKFB5RXZhbF9HZXRSZXN0cmljdGVkKCkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0lPRXJyb3IsCisgICAgICAgICJmaWxlKCkgY29uc3RydWN0b3Igbm90IGFjY2Vzc2libGUgaW4gcmVzdHJpY3RlZCBtb2RlIik7CisgICAgICAgIGYgPSBOVUxMOworICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgfQorICAgIGVycm5vID0gMDsKIAogI2lmZGVmIE1TX1dJTkRPV1MKLQlpZiAoUHlVbmljb2RlX0NoZWNrKGYtPmZfbmFtZSkpIHsKLQkJUHlPYmplY3QgKndtb2RlOwotCQl3bW9kZSA9IFB5VW5pY29kZV9EZWNvZGVBU0NJSShuZXdtb2RlLCBzdHJsZW4obmV3bW9kZSksIE5VTEwpOwotCQlpZiAoZi0+Zl9uYW1lICYmIHdtb2RlKSB7Ci0JCQlGSUxFX0JFR0lOX0FMTE9XX1RIUkVBRFMoZikKLQkJCS8qIFB5VW5pY29kZV9BU19VTklDT0RFIE9LIHdpdGhvdXQgdGhyZWFkCi0JCQkgICBsb2NrIGFzIGl0IGlzIGEgc2ltcGxlIGRlcmVmZXJlbmNlLiAqLwotCQkJZi0+Zl9mcCA9IF93Zm9wZW4oUHlVbmljb2RlX0FTX1VOSUNPREUoZi0+Zl9uYW1lKSwKLQkJCQkJICBQeVVuaWNvZGVfQVNfVU5JQ09ERSh3bW9kZSkpOwotCQkJRklMRV9FTkRfQUxMT1dfVEhSRUFEUyhmKQotCQl9Ci0JCVB5X1hERUNSRUYod21vZGUpOwotCX0KKyAgICBpZiAoUHlVbmljb2RlX0NoZWNrKGYtPmZfbmFtZSkpIHsKKyAgICAgICAgUHlPYmplY3QgKndtb2RlOworICAgICAgICB3bW9kZSA9IFB5VW5pY29kZV9EZWNvZGVBU0NJSShuZXdtb2RlLCBzdHJsZW4obmV3bW9kZSksIE5VTEwpOworICAgICAgICBpZiAoZi0+Zl9uYW1lICYmIHdtb2RlKSB7CisgICAgICAgICAgICBGSUxFX0JFR0lOX0FMTE9XX1RIUkVBRFMoZikKKyAgICAgICAgICAgIC8qIFB5VW5pY29kZV9BU19VTklDT0RFIE9LIHdpdGhvdXQgdGhyZWFkCisgICAgICAgICAgICAgICBsb2NrIGFzIGl0IGlzIGEgc2ltcGxlIGRlcmVmZXJlbmNlLiAqLworICAgICAgICAgICAgZi0+Zl9mcCA9IF93Zm9wZW4oUHlVbmljb2RlX0FTX1VOSUNPREUoZi0+Zl9uYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9BU19VTklDT0RFKHdtb2RlKSk7CisgICAgICAgICAgICBGSUxFX0VORF9BTExPV19USFJFQURTKGYpCisgICAgICAgIH0KKyAgICAgICAgUHlfWERFQ1JFRih3bW9kZSk7CisgICAgfQogI2VuZGlmCi0JaWYgKE5VTEwgPT0gZi0+Zl9mcCAmJiBOVUxMICE9IG5hbWUpIHsKLQkJRklMRV9CRUdJTl9BTExPV19USFJFQURTKGYpCi0JCWYtPmZfZnAgPSBmb3BlbihuYW1lLCBuZXdtb2RlKTsKLQkJRklMRV9FTkRfQUxMT1dfVEhSRUFEUyhmKQotCX0KKyAgICBpZiAoTlVMTCA9PSBmLT5mX2ZwICYmIE5VTEwgIT0gbmFtZSkgeworICAgICAgICBGSUxFX0JFR0lOX0FMTE9XX1RIUkVBRFMoZikKKyAgICAgICAgZi0+Zl9mcCA9IGZvcGVuKG5hbWUsIG5ld21vZGUpOworICAgICAgICBGSUxFX0VORF9BTExPV19USFJFQURTKGYpCisgICAgfQogCi0JaWYgKGYtPmZfZnAgPT0gTlVMTCkgeworICAgIGlmIChmLT5mX2ZwID09IE5VTEwpIHsKICNpZiBkZWZpbmVkICBfTVNDX1ZFUiAmJiAoX01TQ19WRVIgPCAxNDAwIHx8ICFkZWZpbmVkKF9fU1REQ19TRUNVUkVfTElCX18pKQotCQkvKiBNU1ZDIDYgKE1pY3Jvc29mdCkgbGVhdmVzIGVycm5vIGF0IDAgZm9yIGJhZCBtb2RlIHN0cmluZ3MsCi0JCSAqIGFjcm9zcyBhbGwgV2luZG93cyBmbGF2b3JzLiAgV2hlbiBpdCBzZXRzIEVJTlZBTCB2YXJpZXMKLQkJICogYWNyb3NzIFdpbmRvd3MgZmxhdm9ycywgdGhlIGV4YWN0IGNvbmRpdGlvbnMgYXJlbid0Ci0JCSAqIGRvY3VtZW50ZWQsIGFuZCB0aGUgYW5zd2VyIGxpZXMgaW4gdGhlIE9TJ3MgaW1wbGVtZW50YXRpb24KLQkJICogb2YgV2luMzIncyBDcmVhdGVGaWxlIGZ1bmN0aW9uICh3aG9zZSBzb3VyY2UgaXMgc2VjcmV0KS4KLQkJICogU2VlbXMgdGhlIGJlc3Qgd2UgY2FuIGRvIGlzIG1hcCBFSU5WQUwgdG8gRU5PRU5ULgotCQkgKiBTdGFydGluZyB3aXRoIFZpc3VhbCBTdHVkaW8gLk5FVCAyMDA1LCBFSU5WQUwgaXMgY29ycmVjdGx5Ci0JCSAqIHNldCBieSBvdXIgQ1JUIGVycm9yIGhhbmRsZXIgKHNldCBpbiBleGNlcHRpb25zLmMuKQotCQkgKi8KLQkJaWYgKGVycm5vID09IDApCS8qIGJhZCBtb2RlIHN0cmluZyAqLwotCQkJZXJybm8gPSBFSU5WQUw7Ci0JCWVsc2UgaWYgKGVycm5vID09IEVJTlZBTCkgLyogdW5rbm93biwgYnV0IG5vdCBhIG1vZGUgc3RyaW5nICovCi0JCQllcnJubyA9IEVOT0VOVDsKKyAgICAgICAgLyogTVNWQyA2IChNaWNyb3NvZnQpIGxlYXZlcyBlcnJubyBhdCAwIGZvciBiYWQgbW9kZSBzdHJpbmdzLAorICAgICAgICAgKiBhY3Jvc3MgYWxsIFdpbmRvd3MgZmxhdm9ycy4gIFdoZW4gaXQgc2V0cyBFSU5WQUwgdmFyaWVzCisgICAgICAgICAqIGFjcm9zcyBXaW5kb3dzIGZsYXZvcnMsIHRoZSBleGFjdCBjb25kaXRpb25zIGFyZW4ndAorICAgICAgICAgKiBkb2N1bWVudGVkLCBhbmQgdGhlIGFuc3dlciBsaWVzIGluIHRoZSBPUydzIGltcGxlbWVudGF0aW9uCisgICAgICAgICAqIG9mIFdpbjMyJ3MgQ3JlYXRlRmlsZSBmdW5jdGlvbiAod2hvc2Ugc291cmNlIGlzIHNlY3JldCkuCisgICAgICAgICAqIFNlZW1zIHRoZSBiZXN0IHdlIGNhbiBkbyBpcyBtYXAgRUlOVkFMIHRvIEVOT0VOVC4KKyAgICAgICAgICogU3RhcnRpbmcgd2l0aCBWaXN1YWwgU3R1ZGlvIC5ORVQgMjAwNSwgRUlOVkFMIGlzIGNvcnJlY3RseQorICAgICAgICAgKiBzZXQgYnkgb3VyIENSVCBlcnJvciBoYW5kbGVyIChzZXQgaW4gZXhjZXB0aW9ucy5jLikKKyAgICAgICAgICovCisgICAgICAgIGlmIChlcnJubyA9PSAwKSAgICAgICAgIC8qIGJhZCBtb2RlIHN0cmluZyAqLworICAgICAgICAgICAgZXJybm8gPSBFSU5WQUw7CisgICAgICAgIGVsc2UgaWYgKGVycm5vID09IEVJTlZBTCkgLyogdW5rbm93biwgYnV0IG5vdCBhIG1vZGUgc3RyaW5nICovCisgICAgICAgICAgICBlcnJubyA9IEVOT0VOVDsKICNlbmRpZgotICAgICAgICAgICAgICAgIC8qIEVJTlZBTCBpcyByZXR1cm5lZCB3aGVuIGFuIGludmFsaWQgZmlsZW5hbWUgb3IKLSAgICAgICAgICAgICAgICAgKiBhbiBpbnZhbGlkIG1vZGUgaXMgc3VwcGxpZWQuICovCi0JCWlmIChlcnJubyA9PSBFSU5WQUwpIHsKLQkJCVB5T2JqZWN0ICp2OwotCQkJY2hhciBtZXNzYWdlWzEwMF07Ci0JCQlQeU9TX3NucHJpbnRmKG1lc3NhZ2UsIDEwMCwgCi0JCQkgICAgImludmFsaWQgbW9kZSAoJyUuNTBzJykgb3IgZmlsZW5hbWUiLCBtb2RlKTsKLQkJCXYgPSBQeV9CdWlsZFZhbHVlKCIoaXNPKSIsIGVycm5vLCBtZXNzYWdlLCBmLT5mX25hbWUpOwotCQkJaWYgKHYgIT0gTlVMTCkgewotCQkJCVB5RXJyX1NldE9iamVjdChQeUV4Y19JT0Vycm9yLCB2KTsKLQkJCQlQeV9ERUNSRUYodik7Ci0JCQl9Ci0JCX0KLQkJZWxzZQotCQkJUHlFcnJfU2V0RnJvbUVycm5vV2l0aEZpbGVuYW1lT2JqZWN0KFB5RXhjX0lPRXJyb3IsIGYtPmZfbmFtZSk7Ci0JCWYgPSBOVUxMOwotCX0KLQlpZiAoZiAhPSBOVUxMKQotCQlmID0gZGlyY2hlY2soZik7CisgICAgICAgIC8qIEVJTlZBTCBpcyByZXR1cm5lZCB3aGVuIGFuIGludmFsaWQgZmlsZW5hbWUgb3IKKyAgICAgICAgICogYW4gaW52YWxpZCBtb2RlIGlzIHN1cHBsaWVkLiAqLworICAgICAgICBpZiAoZXJybm8gPT0gRUlOVkFMKSB7CisgICAgICAgICAgICBQeU9iamVjdCAqdjsKKyAgICAgICAgICAgIGNoYXIgbWVzc2FnZVsxMDBdOworICAgICAgICAgICAgUHlPU19zbnByaW50ZihtZXNzYWdlLCAxMDAsCisgICAgICAgICAgICAgICAgImludmFsaWQgbW9kZSAoJyUuNTBzJykgb3IgZmlsZW5hbWUiLCBtb2RlKTsKKyAgICAgICAgICAgIHYgPSBQeV9CdWlsZFZhbHVlKCIoaXNPKSIsIGVycm5vLCBtZXNzYWdlLCBmLT5mX25hbWUpOworICAgICAgICAgICAgaWYgKHYgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldE9iamVjdChQeUV4Y19JT0Vycm9yLCB2KTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vV2l0aEZpbGVuYW1lT2JqZWN0KFB5RXhjX0lPRXJyb3IsIGYtPmZfbmFtZSk7CisgICAgICAgIGYgPSBOVUxMOworICAgIH0KKyAgICBpZiAoZiAhPSBOVUxMKQorICAgICAgICBmID0gZGlyY2hlY2soZik7CiAKIGNsZWFudXA6Ci0JUHlNZW1fRlJFRShuZXdtb2RlKTsKKyAgICBQeU1lbV9GUkVFKG5ld21vZGUpOwogCi0JcmV0dXJuIChQeU9iamVjdCAqKWY7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWY7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjbG9zZV90aGVfZmlsZShQeUZpbGVPYmplY3QgKmYpCiB7Ci0JaW50IHN0cyA9IDA7Ci0JaW50ICgqbG9jYWxfY2xvc2UpKEZJTEUgKik7Ci0JRklMRSAqbG9jYWxfZnAgPSBmLT5mX2ZwOwotCWlmIChsb2NhbF9mcCAhPSBOVUxMKSB7Ci0JCWxvY2FsX2Nsb3NlID0gZi0+Zl9jbG9zZTsKLQkJaWYgKGxvY2FsX2Nsb3NlICE9IE5VTEwgJiYgZi0+dW5sb2NrZWRfY291bnQgPiAwKSB7Ci0JCQlpZiAoZi0+b2JfcmVmY250ID4gMCkgewotCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JT0Vycm9yLAotCQkJCQkiY2xvc2UoKSBjYWxsZWQgZHVyaW5nIGNvbmN1cnJlbnQgIgotCQkJCQkib3BlcmF0aW9uIG9uIHRoZSBzYW1lIGZpbGUgb2JqZWN0LiIpOwotCQkJfSBlbHNlIHsKLQkJCQkvKiBUaGlzIHNob3VsZCBub3QgaGFwcGVuIHVubGVzcyBzb21lb25lIGlzCi0JCQkJICogY2FyZWxlc3NseSBwbGF5aW5nIHdpdGggdGhlIFB5RmlsZU9iamVjdAotCQkJCSAqIHN0cnVjdCBmaWVsZHMgYW5kL29yIGl0cyBhc3NvY2lhdGVkIEZJTEUKLQkJCQkgKiBwb2ludGVyLiAqLwotCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKLQkJCQkJIlB5RmlsZU9iamVjdCBsb2NraW5nIGVycm9yIGluICIKLQkJCQkJImRlc3RydWN0b3IgKHJlZmNudCA8PSAwIGF0IGNsb3NlKS4iKTsKLQkJCX0KLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCS8qIE5VTEwgb3V0IHRoZSBGSUxFIHBvaW50ZXIgYmVmb3JlIHJlbGVhc2luZyB0aGUgR0lMLCBiZWNhdXNlCi0JCSAqIGl0IHdpbGwgbm90IGJlIHZhbGlkIGFueW1vcmUgYWZ0ZXIgdGhlIGNsb3NlKCkgZnVuY3Rpb24gaXMKLQkJICogY2FsbGVkLiAqLwotCQlmLT5mX2ZwID0gTlVMTDsKLQkJaWYgKGxvY2FsX2Nsb3NlICE9IE5VTEwpIHsKLQkJCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQkJCWVycm5vID0gMDsKLQkJCXN0cyA9ICgqbG9jYWxfY2xvc2UpKGxvY2FsX2ZwKTsKLQkJCVB5X0VORF9BTExPV19USFJFQURTCi0JCQlpZiAoc3RzID09IEVPRikKLQkJCQlyZXR1cm4gUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOwotCQkJaWYgKHN0cyAhPSAwKQotCQkJCXJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZylzdHMpOwotCQl9Ci0JfQotCVB5X1JFVFVSTl9OT05FOworICAgIGludCBzdHMgPSAwOworICAgIGludCAoKmxvY2FsX2Nsb3NlKShGSUxFICopOworICAgIEZJTEUgKmxvY2FsX2ZwID0gZi0+Zl9mcDsKKyAgICBpZiAobG9jYWxfZnAgIT0gTlVMTCkgeworICAgICAgICBsb2NhbF9jbG9zZSA9IGYtPmZfY2xvc2U7CisgICAgICAgIGlmIChsb2NhbF9jbG9zZSAhPSBOVUxMICYmIGYtPnVubG9ja2VkX2NvdW50ID4gMCkgeworICAgICAgICAgICAgaWYgKGYtPm9iX3JlZmNudCA+IDApIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSU9FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgImNsb3NlKCkgY2FsbGVkIGR1cmluZyBjb25jdXJyZW50ICIKKyAgICAgICAgICAgICAgICAgICAgIm9wZXJhdGlvbiBvbiB0aGUgc2FtZSBmaWxlIG9iamVjdC4iKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyogVGhpcyBzaG91bGQgbm90IGhhcHBlbiB1bmxlc3Mgc29tZW9uZSBpcworICAgICAgICAgICAgICAgICAqIGNhcmVsZXNzbHkgcGxheWluZyB3aXRoIHRoZSBQeUZpbGVPYmplY3QKKyAgICAgICAgICAgICAgICAgKiBzdHJ1Y3QgZmllbGRzIGFuZC9vciBpdHMgYXNzb2NpYXRlZCBGSUxFCisgICAgICAgICAgICAgICAgICogcG9pbnRlci4gKi8KKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICJQeUZpbGVPYmplY3QgbG9ja2luZyBlcnJvciBpbiAiCisgICAgICAgICAgICAgICAgICAgICJkZXN0cnVjdG9yIChyZWZjbnQgPD0gMCBhdCBjbG9zZSkuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICAvKiBOVUxMIG91dCB0aGUgRklMRSBwb2ludGVyIGJlZm9yZSByZWxlYXNpbmcgdGhlIEdJTCwgYmVjYXVzZQorICAgICAgICAgKiBpdCB3aWxsIG5vdCBiZSB2YWxpZCBhbnltb3JlIGFmdGVyIHRoZSBjbG9zZSgpIGZ1bmN0aW9uIGlzCisgICAgICAgICAqIGNhbGxlZC4gKi8KKyAgICAgICAgZi0+Zl9mcCA9IE5VTEw7CisgICAgICAgIGlmIChsb2NhbF9jbG9zZSAhPSBOVUxMKSB7CisgICAgICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgICAgICAgICBlcnJubyA9IDA7CisgICAgICAgICAgICBzdHMgPSAoKmxvY2FsX2Nsb3NlKShsb2NhbF9mcCk7CisgICAgICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgICAgICAgICAgaWYgKHN0cyA9PSBFT0YpCisgICAgICAgICAgICAgICAgcmV0dXJuIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKKyAgICAgICAgICAgIGlmIChzdHMgIT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpc3RzKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAogUHlPYmplY3QgKgogUHlGaWxlX0Zyb21GaWxlKEZJTEUgKmZwLCBjaGFyICpuYW1lLCBjaGFyICptb2RlLCBpbnQgKCpjbG9zZSkoRklMRSAqKSkKIHsKLQlQeUZpbGVPYmplY3QgKmYgPSAoUHlGaWxlT2JqZWN0ICopUHlGaWxlX1R5cGUudHBfbmV3KCZQeUZpbGVfVHlwZSwKLQkJCQkJCQkgICAgIE5VTEwsIE5VTEwpOwotCWlmIChmICE9IE5VTEwpIHsKLQkJUHlPYmplY3QgKm9fbmFtZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmcobmFtZSk7Ci0JCWlmIChvX25hbWUgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQlpZiAoZmlsbF9maWxlX2ZpZWxkcyhmLCBmcCwgb19uYW1lLCBtb2RlLCBjbG9zZSkgPT0gTlVMTCkgewotCQkJUHlfREVDUkVGKGYpOwotCQkJZiA9IE5VTEw7Ci0JCX0KLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYob19uYW1lKTsKLQl9Ci0JcmV0dXJuIChQeU9iamVjdCAqKSBmOworICAgIFB5RmlsZU9iamVjdCAqZiA9IChQeUZpbGVPYmplY3QgKilQeUZpbGVfVHlwZS50cF9uZXcoJlB5RmlsZV9UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCk7CisgICAgaWYgKGYgIT0gTlVMTCkgeworICAgICAgICBQeU9iamVjdCAqb19uYW1lID0gUHlTdHJpbmdfRnJvbVN0cmluZyhuYW1lKTsKKyAgICAgICAgaWYgKG9fbmFtZSA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGlmIChmaWxsX2ZpbGVfZmllbGRzKGYsIGZwLCBvX25hbWUsIG1vZGUsIGNsb3NlKSA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoZik7CisgICAgICAgICAgICBmID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBQeV9ERUNSRUYob19uYW1lKTsKKyAgICB9CisgICAgcmV0dXJuIChQeU9iamVjdCAqKSBmOwogfQogCiBQeU9iamVjdCAqCiBQeUZpbGVfRnJvbVN0cmluZyhjaGFyICpuYW1lLCBjaGFyICptb2RlKQogewotCWV4dGVybiBpbnQgZmNsb3NlKEZJTEUgKik7Ci0JUHlGaWxlT2JqZWN0ICpmOworICAgIGV4dGVybiBpbnQgZmNsb3NlKEZJTEUgKik7CisgICAgUHlGaWxlT2JqZWN0ICpmOwogCi0JZiA9IChQeUZpbGVPYmplY3QgKilQeUZpbGVfRnJvbUZpbGUoKEZJTEUgKilOVUxMLCBuYW1lLCBtb2RlLCBmY2xvc2UpOwotCWlmIChmICE9IE5VTEwpIHsKLQkJaWYgKG9wZW5fdGhlX2ZpbGUoZiwgbmFtZSwgbW9kZSkgPT0gTlVMTCkgewotCQkJUHlfREVDUkVGKGYpOwotCQkJZiA9IE5VTEw7Ci0JCX0KLQl9Ci0JcmV0dXJuIChQeU9iamVjdCAqKWY7CisgICAgZiA9IChQeUZpbGVPYmplY3QgKilQeUZpbGVfRnJvbUZpbGUoKEZJTEUgKilOVUxMLCBuYW1lLCBtb2RlLCBmY2xvc2UpOworICAgIGlmIChmICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKG9wZW5fdGhlX2ZpbGUoZiwgbmFtZSwgbW9kZSkgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKGYpOworICAgICAgICAgICAgZiA9IE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWY7CiB9CiAKIHZvaWQKIFB5RmlsZV9TZXRCdWZTaXplKFB5T2JqZWN0ICpmLCBpbnQgYnVmc2l6ZSkKIHsKLQlQeUZpbGVPYmplY3QgKmZpbGUgPSAoUHlGaWxlT2JqZWN0ICopZjsKLQlpZiAoYnVmc2l6ZSA+PSAwKSB7Ci0JCWludCB0eXBlOwotCQlzd2l0Y2ggKGJ1ZnNpemUpIHsKLQkJY2FzZSAwOgotCQkJdHlwZSA9IF9JT05CRjsKLQkJCWJyZWFrOworICAgIFB5RmlsZU9iamVjdCAqZmlsZSA9IChQeUZpbGVPYmplY3QgKilmOworICAgIGlmIChidWZzaXplID49IDApIHsKKyAgICAgICAgaW50IHR5cGU7CisgICAgICAgIHN3aXRjaCAoYnVmc2l6ZSkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICB0eXBlID0gX0lPTkJGOworICAgICAgICAgICAgYnJlYWs7CiAjaWZkZWYgSEFWRV9TRVRWQlVGCi0JCWNhc2UgMToKLQkJCXR5cGUgPSBfSU9MQkY7Ci0JCQlidWZzaXplID0gQlVGU0laOwotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIHR5cGUgPSBfSU9MQkY7CisgICAgICAgICAgICBidWZzaXplID0gQlVGU0laOworICAgICAgICAgICAgYnJlYWs7CiAjZW5kaWYKLQkJZGVmYXVsdDoKLQkJCXR5cGUgPSBfSU9GQkY7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB0eXBlID0gX0lPRkJGOwogI2lmbmRlZiBIQVZFX1NFVFZCVUYKLQkJCWJ1ZnNpemUgPSBCVUZTSVo7CisgICAgICAgICAgICBidWZzaXplID0gQlVGU0laOwogI2VuZGlmCi0JCQlicmVhazsKLQkJfQotCQlmZmx1c2goZmlsZS0+Zl9mcCk7Ci0JCWlmICh0eXBlID09IF9JT05CRikgewotCQkJUHlNZW1fRnJlZShmaWxlLT5mX3NldGJ1Zik7Ci0JCQlmaWxlLT5mX3NldGJ1ZiA9IE5VTEw7Ci0JCX0gZWxzZSB7Ci0JCQlmaWxlLT5mX3NldGJ1ZiA9IChjaGFyICopUHlNZW1fUmVhbGxvYyhmaWxlLT5mX3NldGJ1ZiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmc2l6ZSk7Ci0JCX0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGZmbHVzaChmaWxlLT5mX2ZwKTsKKyAgICAgICAgaWYgKHR5cGUgPT0gX0lPTkJGKSB7CisgICAgICAgICAgICBQeU1lbV9GcmVlKGZpbGUtPmZfc2V0YnVmKTsKKyAgICAgICAgICAgIGZpbGUtPmZfc2V0YnVmID0gTlVMTDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZpbGUtPmZfc2V0YnVmID0gKGNoYXIgKilQeU1lbV9SZWFsbG9jKGZpbGUtPmZfc2V0YnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZnNpemUpOworICAgICAgICB9CiAjaWZkZWYgSEFWRV9TRVRWQlVGCi0JCXNldHZidWYoZmlsZS0+Zl9mcCwgZmlsZS0+Zl9zZXRidWYsIHR5cGUsIGJ1ZnNpemUpOworICAgICAgICBzZXR2YnVmKGZpbGUtPmZfZnAsIGZpbGUtPmZfc2V0YnVmLCB0eXBlLCBidWZzaXplKTsKICNlbHNlIC8qICFIQVZFX1NFVFZCVUYgKi8KLQkJc2V0YnVmKGZpbGUtPmZfZnAsIGZpbGUtPmZfc2V0YnVmKTsKKyAgICAgICAgc2V0YnVmKGZpbGUtPmZfZnAsIGZpbGUtPmZfc2V0YnVmKTsKICNlbmRpZiAvKiAhSEFWRV9TRVRWQlVGICovCi0JfQorICAgIH0KIH0KIAogLyogU2V0IHRoZSBlbmNvZGluZyB1c2VkIHRvIG91dHB1dCBVbmljb2RlIHN0cmluZ3MuCkBAIC00NTcsNDggKzQ1Nyw0OCBAQAogaW50CiBQeUZpbGVfU2V0RW5jb2RpbmcoUHlPYmplY3QgKmYsIGNvbnN0IGNoYXIgKmVuYykKIHsKLQlyZXR1cm4gUHlGaWxlX1NldEVuY29kaW5nQW5kRXJyb3JzKGYsIGVuYywgTlVMTCk7CisgICAgcmV0dXJuIFB5RmlsZV9TZXRFbmNvZGluZ0FuZEVycm9ycyhmLCBlbmMsIE5VTEwpOwogfQogCiBpbnQKIFB5RmlsZV9TZXRFbmNvZGluZ0FuZEVycm9ycyhQeU9iamVjdCAqZiwgY29uc3QgY2hhciAqZW5jLCBjaGFyKiBlcnJvcnMpCiB7Ci0JUHlGaWxlT2JqZWN0ICpmaWxlID0gKFB5RmlsZU9iamVjdCopZjsKLQlQeU9iamVjdCAqc3RyLCAqb2Vycm9yczsKKyAgICBQeUZpbGVPYmplY3QgKmZpbGUgPSAoUHlGaWxlT2JqZWN0KilmOworICAgIFB5T2JqZWN0ICpzdHIsICpvZXJyb3JzOwogCi0JYXNzZXJ0KFB5RmlsZV9DaGVjayhmKSk7Ci0Jc3RyID0gUHlTdHJpbmdfRnJvbVN0cmluZyhlbmMpOwotCWlmICghc3RyKQotCQlyZXR1cm4gMDsKLQlpZiAoZXJyb3JzKSB7Ci0JCW9lcnJvcnMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGVycm9ycyk7Ci0JCWlmICghb2Vycm9ycykgewotCQkJUHlfREVDUkVGKHN0cik7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0gZWxzZSB7Ci0JCW9lcnJvcnMgPSBQeV9Ob25lOwotCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JfQotCVB5X0RFQ1JFRihmaWxlLT5mX2VuY29kaW5nKTsKLQlmaWxlLT5mX2VuY29kaW5nID0gc3RyOwotCVB5X0RFQ1JFRihmaWxlLT5mX2Vycm9ycyk7Ci0JZmlsZS0+Zl9lcnJvcnMgPSBvZXJyb3JzOwotCXJldHVybiAxOworICAgIGFzc2VydChQeUZpbGVfQ2hlY2soZikpOworICAgIHN0ciA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoZW5jKTsKKyAgICBpZiAoIXN0cikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKGVycm9ycykgeworICAgICAgICBvZXJyb3JzID0gUHlTdHJpbmdfRnJvbVN0cmluZyhlcnJvcnMpOworICAgICAgICBpZiAoIW9lcnJvcnMpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihzdHIpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBvZXJyb3JzID0gUHlfTm9uZTsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIH0KKyAgICBQeV9ERUNSRUYoZmlsZS0+Zl9lbmNvZGluZyk7CisgICAgZmlsZS0+Zl9lbmNvZGluZyA9IHN0cjsKKyAgICBQeV9ERUNSRUYoZmlsZS0+Zl9lcnJvcnMpOworICAgIGZpbGUtPmZfZXJyb3JzID0gb2Vycm9yczsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGVycl9jbG9zZWQodm9pZCkKIHsKLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIkkvTyBvcGVyYXRpb24gb24gY2xvc2VkIGZpbGUiKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIkkvTyBvcGVyYXRpb24gb24gY2xvc2VkIGZpbGUiKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGVycl9tb2RlKGNoYXIgKmFjdGlvbikKIHsKLSAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX0lPRXJyb3IsICJGaWxlIG5vdCBvcGVuIGZvciAlcyIsIGFjdGlvbik7Ci0gICAgICAgIHJldHVybiBOVUxMOworICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19JT0Vycm9yLCAiRmlsZSBub3Qgb3BlbiBmb3IgJXMiLCBhY3Rpb24pOworICAgIHJldHVybiBOVUxMOwogfQogCiAvKiBSZWZ1c2UgcmVndWxhciBmaWxlIEkvTyBpZiB0aGVyZSdzIGRhdGEgaW4gdGhlIGl0ZXJhdGlvbi1idWZmZXIuCkBAIC01MDcsOSArNTA3LDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBlcnJfaXRlcmJ1ZmZlcmVkKHZvaWQpCiB7Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCSJNaXhpbmcgaXRlcmF0aW9uIGFuZCByZWFkIG1ldGhvZHMgd291bGQgbG9zZSBkYXRhIik7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICJNaXhpbmcgaXRlcmF0aW9uIGFuZCByZWFkIG1ldGhvZHMgd291bGQgbG9zZSBkYXRhIik7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyB2b2lkIGRyb3BfcmVhZGFoZWFkKFB5RmlsZU9iamVjdCAqKTsKQEAgLTUxOSw1OCArNTE5LDU4IEBACiBzdGF0aWMgdm9pZAogZmlsZV9kZWFsbG9jKFB5RmlsZU9iamVjdCAqZikKIHsKLQlQeU9iamVjdCAqcmV0OwotCWlmIChmLT53ZWFrcmVmbGlzdCAhPSBOVUxMKQotCQlQeU9iamVjdF9DbGVhcldlYWtSZWZzKChQeU9iamVjdCAqKSBmKTsKLQlyZXQgPSBjbG9zZV90aGVfZmlsZShmKTsKLQlpZiAoIXJldCkgewotCQlQeVN5c19Xcml0ZVN0ZGVycigiY2xvc2UgZmFpbGVkIGluIGZpbGUgb2JqZWN0IGRlc3RydWN0b3I6XG4iKTsKLQkJUHlFcnJfUHJpbnQoKTsKLQl9Ci0JZWxzZSB7Ci0JCVB5X0RFQ1JFRihyZXQpOwotCX0KLQlQeU1lbV9GcmVlKGYtPmZfc2V0YnVmKTsKLQlQeV9YREVDUkVGKGYtPmZfbmFtZSk7Ci0JUHlfWERFQ1JFRihmLT5mX21vZGUpOwotCVB5X1hERUNSRUYoZi0+Zl9lbmNvZGluZyk7Ci0JUHlfWERFQ1JFRihmLT5mX2Vycm9ycyk7Ci0JZHJvcF9yZWFkYWhlYWQoZik7Ci0JUHlfVFlQRShmKS0+dHBfZnJlZSgoUHlPYmplY3QgKilmKTsKKyAgICBQeU9iamVjdCAqcmV0OworICAgIGlmIChmLT53ZWFrcmVmbGlzdCAhPSBOVUxMKQorICAgICAgICBQeU9iamVjdF9DbGVhcldlYWtSZWZzKChQeU9iamVjdCAqKSBmKTsKKyAgICByZXQgPSBjbG9zZV90aGVfZmlsZShmKTsKKyAgICBpZiAoIXJldCkgeworICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigiY2xvc2UgZmFpbGVkIGluIGZpbGUgb2JqZWN0IGRlc3RydWN0b3I6XG4iKTsKKyAgICAgICAgUHlFcnJfUHJpbnQoKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5X0RFQ1JFRihyZXQpOworICAgIH0KKyAgICBQeU1lbV9GcmVlKGYtPmZfc2V0YnVmKTsKKyAgICBQeV9YREVDUkVGKGYtPmZfbmFtZSk7CisgICAgUHlfWERFQ1JFRihmLT5mX21vZGUpOworICAgIFB5X1hERUNSRUYoZi0+Zl9lbmNvZGluZyk7CisgICAgUHlfWERFQ1JFRihmLT5mX2Vycm9ycyk7CisgICAgZHJvcF9yZWFkYWhlYWQoZik7CisgICAgUHlfVFlQRShmKS0+dHBfZnJlZSgoUHlPYmplY3QgKilmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZpbGVfcmVwcihQeUZpbGVPYmplY3QgKmYpCiB7Ci0JaWYgKFB5VW5pY29kZV9DaGVjayhmLT5mX25hbWUpKSB7CisgICAgaWYgKFB5VW5pY29kZV9DaGVjayhmLT5mX25hbWUpKSB7CiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCQlQeU9iamVjdCAqcmV0ID0gTlVMTDsKLQkJUHlPYmplY3QgKm5hbWUgPSBQeVVuaWNvZGVfQXNVbmljb2RlRXNjYXBlU3RyaW5nKGYtPmZfbmFtZSk7Ci0JCWNvbnN0IGNoYXIgKm5hbWVfc3RyID0gbmFtZSA/IFB5U3RyaW5nX0FzU3RyaW5nKG5hbWUpIDogIj8iOwotCQlyZXQgPSBQeVN0cmluZ19Gcm9tRm9ybWF0KCI8JXMgZmlsZSB1JyVzJywgbW9kZSAnJXMnIGF0ICVwPiIsCi0JCQkJICAgZi0+Zl9mcCA9PSBOVUxMID8gImNsb3NlZCIgOiAib3BlbiIsCi0JCQkJICAgbmFtZV9zdHIsCi0JCQkJICAgUHlTdHJpbmdfQXNTdHJpbmcoZi0+Zl9tb2RlKSwKLQkJCQkgICBmKTsKLQkJUHlfWERFQ1JFRihuYW1lKTsKLQkJcmV0dXJuIHJldDsKKyAgICAgICAgUHlPYmplY3QgKnJldCA9IE5VTEw7CisgICAgICAgIFB5T2JqZWN0ICpuYW1lID0gUHlVbmljb2RlX0FzVW5pY29kZUVzY2FwZVN0cmluZyhmLT5mX25hbWUpOworICAgICAgICBjb25zdCBjaGFyICpuYW1lX3N0ciA9IG5hbWUgPyBQeVN0cmluZ19Bc1N0cmluZyhuYW1lKSA6ICI/IjsKKyAgICAgICAgcmV0ID0gUHlTdHJpbmdfRnJvbUZvcm1hdCgiPCVzIGZpbGUgdSclcycsIG1vZGUgJyVzJyBhdCAlcD4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZi0+Zl9mcCA9PSBOVUxMID8gImNsb3NlZCIgOiAib3BlbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FzU3RyaW5nKGYtPmZfbW9kZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmKTsKKyAgICAgICAgUHlfWERFQ1JFRihuYW1lKTsKKyAgICAgICAgcmV0dXJuIHJldDsKICNlbmRpZgotCX0gZWxzZSB7Ci0JCXJldHVybiBQeVN0cmluZ19Gcm9tRm9ybWF0KCI8JXMgZmlsZSAnJXMnLCBtb2RlICclcycgYXQgJXA+IiwKLQkJCQkgICBmLT5mX2ZwID09IE5VTEwgPyAiY2xvc2VkIiA6ICJvcGVuIiwKLQkJCQkgICBQeVN0cmluZ19Bc1N0cmluZyhmLT5mX25hbWUpLAotCQkJCSAgIFB5U3RyaW5nX0FzU3RyaW5nKGYtPmZfbW9kZSksCi0JCQkJICAgZik7Ci0JfQorICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tRm9ybWF0KCI8JXMgZmlsZSAnJXMnLCBtb2RlICclcycgYXQgJXA+IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGYtPmZfZnAgPT0gTlVMTCA/ICJjbG9zZWQiIDogIm9wZW4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQXNTdHJpbmcoZi0+Zl9uYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FzU3RyaW5nKGYtPmZfbW9kZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmKTsKKyAgICB9CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmaWxlX2Nsb3NlKFB5RmlsZU9iamVjdCAqZikKIHsKLQlQeU9iamVjdCAqc3RzID0gY2xvc2VfdGhlX2ZpbGUoZik7Ci0JUHlNZW1fRnJlZShmLT5mX3NldGJ1Zik7Ci0JZi0+Zl9zZXRidWYgPSBOVUxMOwotCXJldHVybiBzdHM7CisgICAgUHlPYmplY3QgKnN0cyA9IGNsb3NlX3RoZV9maWxlKGYpOworICAgIFB5TWVtX0ZyZWUoZi0+Zl9zZXRidWYpOworICAgIGYtPmZfc2V0YnVmID0gTlVMTDsKKyAgICByZXR1cm4gc3RzOwogfQogCiAKQEAgLTU5MiwzNiArNTkyLDM2IEBACiBfcG9ydGFibGVfZnNlZWsoRklMRSAqZnAsIFB5X29mZl90IG9mZnNldCwgaW50IHdoZW5jZSkKIHsKICNpZiAhZGVmaW5lZChIQVZFX0xBUkdFRklMRV9TVVBQT1JUKQotCXJldHVybiBmc2VlayhmcCwgb2Zmc2V0LCB3aGVuY2UpOworICAgIHJldHVybiBmc2VlayhmcCwgb2Zmc2V0LCB3aGVuY2UpOwogI2VsaWYgZGVmaW5lZChIQVZFX0ZTRUVLTykgJiYgU0laRU9GX09GRl9UID49IDgKLQlyZXR1cm4gZnNlZWtvKGZwLCBvZmZzZXQsIHdoZW5jZSk7CisgICAgcmV0dXJuIGZzZWVrbyhmcCwgb2Zmc2V0LCB3aGVuY2UpOwogI2VsaWYgZGVmaW5lZChIQVZFX0ZTRUVLNjQpCi0JcmV0dXJuIGZzZWVrNjQoZnAsIG9mZnNldCwgd2hlbmNlKTsKKyAgICByZXR1cm4gZnNlZWs2NChmcCwgb2Zmc2V0LCB3aGVuY2UpOwogI2VsaWYgZGVmaW5lZChfX0JFT1NfXykKLQlyZXR1cm4gX2ZzZWVrKGZwLCBvZmZzZXQsIHdoZW5jZSk7CisgICAgcmV0dXJuIF9mc2VlayhmcCwgb2Zmc2V0LCB3aGVuY2UpOwogI2VsaWYgU0laRU9GX0ZQT1NfVCA+PSA4Ci0JLyogbGFja2luZyBhIDY0LWJpdCBjYXBhYmxlIGZzZWVrKCksIHVzZSBhIDY0LWJpdCBjYXBhYmxlIGZzZXRwb3MoKQotCSAgIGFuZCBmZ2V0cG9zKCkgdG8gaW1wbGVtZW50IGZzZWVrKCkqLwotCWZwb3NfdCBwb3M7Ci0Jc3dpdGNoICh3aGVuY2UpIHsKLQljYXNlIFNFRUtfRU5EOgorICAgIC8qIGxhY2tpbmcgYSA2NC1iaXQgY2FwYWJsZSBmc2VlaygpLCB1c2UgYSA2NC1iaXQgY2FwYWJsZSBmc2V0cG9zKCkKKyAgICAgICBhbmQgZmdldHBvcygpIHRvIGltcGxlbWVudCBmc2VlaygpKi8KKyAgICBmcG9zX3QgcG9zOworICAgIHN3aXRjaCAod2hlbmNlKSB7CisgICAgY2FzZSBTRUVLX0VORDoKICNpZmRlZiBNU19XSU5ET1dTCi0JCWZmbHVzaChmcCk7Ci0JCWlmIChfbHNlZWtpNjQoZmlsZW5vKGZwKSwgMCwgMikgPT0gLTEpCi0JCQlyZXR1cm4gLTE7CisgICAgICAgIGZmbHVzaChmcCk7CisgICAgICAgIGlmIChfbHNlZWtpNjQoZmlsZW5vKGZwKSwgMCwgMikgPT0gLTEpCisgICAgICAgICAgICByZXR1cm4gLTE7CiAjZWxzZQotCQlpZiAoZnNlZWsoZnAsIDAsIFNFRUtfRU5EKSAhPSAwKQotCQkJcmV0dXJuIC0xOworICAgICAgICBpZiAoZnNlZWsoZnAsIDAsIFNFRUtfRU5EKSAhPSAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOwogI2VuZGlmCi0JCS8qIGZhbGwgdGhyb3VnaCAqLwotCWNhc2UgU0VFS19DVVI6Ci0JCWlmIChmZ2V0cG9zKGZwLCAmcG9zKSAhPSAwKQotCQkJcmV0dXJuIC0xOwotCQlvZmZzZXQgKz0gcG9zOwotCQlicmVhazsKLQkvKiBjYXNlIFNFRUtfU0VUOiBicmVhazsgKi8KLQl9Ci0JcmV0dXJuIGZzZXRwb3MoZnAsICZvZmZzZXQpOworICAgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KKyAgICBjYXNlIFNFRUtfQ1VSOgorICAgICAgICBpZiAoZmdldHBvcyhmcCwgJnBvcykgIT0gMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgb2Zmc2V0ICs9IHBvczsKKyAgICAgICAgYnJlYWs7CisgICAgLyogY2FzZSBTRUVLX1NFVDogYnJlYWs7ICovCisgICAgfQorICAgIHJldHVybiBmc2V0cG9zKGZwLCAmb2Zmc2V0KTsKICNlbHNlCiAjZXJyb3IgIkxhcmdlIGZpbGUgc3VwcG9ydCwgYnV0IG5vIHdheSB0byBmc2Vlay4iCiAjZW5kaWYKQEAgLTYzNSwxNiArNjM1LDE2IEBACiBfcG9ydGFibGVfZnRlbGwoRklMRSogZnApCiB7CiAjaWYgIWRlZmluZWQoSEFWRV9MQVJHRUZJTEVfU1VQUE9SVCkKLQlyZXR1cm4gZnRlbGwoZnApOworICAgIHJldHVybiBmdGVsbChmcCk7CiAjZWxpZiBkZWZpbmVkKEhBVkVfRlRFTExPKSAmJiBTSVpFT0ZfT0ZGX1QgPj0gOAotCXJldHVybiBmdGVsbG8oZnApOworICAgIHJldHVybiBmdGVsbG8oZnApOwogI2VsaWYgZGVmaW5lZChIQVZFX0ZURUxMNjQpCi0JcmV0dXJuIGZ0ZWxsNjQoZnApOworICAgIHJldHVybiBmdGVsbDY0KGZwKTsKICNlbGlmIFNJWkVPRl9GUE9TX1QgPj0gOAotCWZwb3NfdCBwb3M7Ci0JaWYgKGZnZXRwb3MoZnAsICZwb3MpICE9IDApCi0JCXJldHVybiAtMTsKLQlyZXR1cm4gcG9zOworICAgIGZwb3NfdCBwb3M7CisgICAgaWYgKGZnZXRwb3MoZnAsICZwb3MpICE9IDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICByZXR1cm4gcG9zOwogI2Vsc2UKICNlcnJvciAiTGFyZ2UgZmlsZSBzdXBwb3J0LCBidXQgbm8gd2F5IHRvIGZ0ZWxsLiIKICNlbmRpZgpAQCAtNjU0LDUzICs2NTQsNTMgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBmaWxlX3NlZWsoUHlGaWxlT2JqZWN0ICpmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgd2hlbmNlOwotCWludCByZXQ7Ci0JUHlfb2ZmX3Qgb2Zmc2V0OwotCVB5T2JqZWN0ICpvZmZvYmosICpvZmZfaW5kZXg7CisgICAgaW50IHdoZW5jZTsKKyAgICBpbnQgcmV0OworICAgIFB5X29mZl90IG9mZnNldDsKKyAgICBQeU9iamVjdCAqb2Zmb2JqLCAqb2ZmX2luZGV4OwogCi0JaWYgKGYtPmZfZnAgPT0gTlVMTCkKLQkJcmV0dXJuIGVycl9jbG9zZWQoKTsKLQlkcm9wX3JlYWRhaGVhZChmKTsKLQl3aGVuY2UgPSAwOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3xpOnNlZWsiLCAmb2Zmb2JqLCAmd2hlbmNlKSkKLQkJcmV0dXJuIE5VTEw7Ci0Jb2ZmX2luZGV4ID0gUHlOdW1iZXJfSW5kZXgob2Zmb2JqKTsKLQlpZiAoIW9mZl9pbmRleCkgewotCQlpZiAoIVB5RmxvYXRfQ2hlY2sob2Zmb2JqKSkKLQkJCXJldHVybiBOVUxMOwotCQkvKiBEZXByZWNhdGVkIGluIDIuNiAqLwotCQlQeUVycl9DbGVhcigpOwotCQlpZiAoUHlFcnJfV2FybkV4KFB5RXhjX0RlcHJlY2F0aW9uV2FybmluZywKLQkJCQkgImludGVnZXIgYXJndW1lbnQgZXhwZWN0ZWQsIGdvdCBmbG9hdCIsCi0JCQkJIDEpIDwgMCkKLQkJCXJldHVybiBOVUxMOwotCQlvZmZfaW5kZXggPSBvZmZvYmo7Ci0JCVB5X0lOQ1JFRihvZmZvYmopOwotCX0KKyAgICBpZiAoZi0+Zl9mcCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gZXJyX2Nsb3NlZCgpOworICAgIGRyb3BfcmVhZGFoZWFkKGYpOworICAgIHdoZW5jZSA9IDA7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfGk6c2VlayIsICZvZmZvYmosICZ3aGVuY2UpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBvZmZfaW5kZXggPSBQeU51bWJlcl9JbmRleChvZmZvYmopOworICAgIGlmICghb2ZmX2luZGV4KSB7CisgICAgICAgIGlmICghUHlGbG9hdF9DaGVjayhvZmZvYmopKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIC8qIERlcHJlY2F0ZWQgaW4gMi42ICovCisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIGlmIChQeUVycl9XYXJuRXgoUHlFeGNfRGVwcmVjYXRpb25XYXJuaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICJpbnRlZ2VyIGFyZ3VtZW50IGV4cGVjdGVkLCBnb3QgZmxvYXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIDEpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBvZmZfaW5kZXggPSBvZmZvYmo7CisgICAgICAgIFB5X0lOQ1JFRihvZmZvYmopOworICAgIH0KICNpZiAhZGVmaW5lZChIQVZFX0xBUkdFRklMRV9TVVBQT1JUKQotCW9mZnNldCA9IFB5SW50X0FzTG9uZyhvZmZfaW5kZXgpOworICAgIG9mZnNldCA9IFB5SW50X0FzTG9uZyhvZmZfaW5kZXgpOwogI2Vsc2UKLQlvZmZzZXQgPSBQeUxvbmdfQ2hlY2sob2ZmX2luZGV4KSA/Ci0JCVB5TG9uZ19Bc0xvbmdMb25nKG9mZl9pbmRleCkgOiBQeUludF9Bc0xvbmcob2ZmX2luZGV4KTsKKyAgICBvZmZzZXQgPSBQeUxvbmdfQ2hlY2sob2ZmX2luZGV4KSA/CisgICAgICAgIFB5TG9uZ19Bc0xvbmdMb25nKG9mZl9pbmRleCkgOiBQeUludF9Bc0xvbmcob2ZmX2luZGV4KTsKICNlbmRpZgotCVB5X0RFQ1JFRihvZmZfaW5kZXgpOwotCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBQeV9ERUNSRUYob2ZmX2luZGV4KTsKKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLSAJRklMRV9CRUdJTl9BTExPV19USFJFQURTKGYpCi0JZXJybm8gPSAwOwotCXJldCA9IF9wb3J0YWJsZV9mc2VlayhmLT5mX2ZwLCBvZmZzZXQsIHdoZW5jZSk7Ci0JRklMRV9FTkRfQUxMT1dfVEhSRUFEUyhmKQorICAgIEZJTEVfQkVHSU5fQUxMT1dfVEhSRUFEUyhmKQorICAgIGVycm5vID0gMDsKKyAgICByZXQgPSBfcG9ydGFibGVfZnNlZWsoZi0+Zl9mcCwgb2Zmc2V0LCB3aGVuY2UpOworICAgIEZJTEVfRU5EX0FMTE9XX1RIUkVBRFMoZikKIAotCWlmIChyZXQgIT0gMCkgewotCQlQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7Ci0JCWNsZWFyZXJyKGYtPmZfZnApOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZi0+Zl9za2lwbmV4dGxmID0gMDsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKHJldCAhPSAwKSB7CisgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKKyAgICAgICAgY2xlYXJlcnIoZi0+Zl9mcCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBmLT5mX3NraXBuZXh0bGYgPSAwOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogCkBAIC03MDgsMTg2ICs3MDgsMTg2IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZmlsZV90cnVuY2F0ZShQeUZpbGVPYmplY3QgKmYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5X29mZl90IG5ld3NpemU7Ci0JUHlPYmplY3QgKm5ld3NpemVvYmogPSBOVUxMOwotCVB5X29mZl90IGluaXRpYWxwb3M7Ci0JaW50IHJldDsKKyAgICBQeV9vZmZfdCBuZXdzaXplOworICAgIFB5T2JqZWN0ICpuZXdzaXplb2JqID0gTlVMTDsKKyAgICBQeV9vZmZfdCBpbml0aWFscG9zOworICAgIGludCByZXQ7CiAKLQlpZiAoZi0+Zl9mcCA9PSBOVUxMKQotCQlyZXR1cm4gZXJyX2Nsb3NlZCgpOwotCWlmICghZi0+d3JpdGFibGUpCi0JCXJldHVybiBlcnJfbW9kZSgid3JpdGluZyIpOwotCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInRydW5jYXRlIiwgMCwgMSwgJm5ld3NpemVvYmopKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoZi0+Zl9mcCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gZXJyX2Nsb3NlZCgpOworICAgIGlmICghZi0+d3JpdGFibGUpCisgICAgICAgIHJldHVybiBlcnJfbW9kZSgid3JpdGluZyIpOworICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInRydW5jYXRlIiwgMCwgMSwgJm5ld3NpemVvYmopKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCS8qIEdldCBjdXJyZW50IGZpbGUgcG9zaXRpb24uICBJZiB0aGUgZmlsZSBoYXBwZW5zIHRvIGJlIG9wZW4gZm9yCi0JICogdXBkYXRlIGFuZCB0aGUgbGFzdCBvcGVyYXRpb24gd2FzIGFuIGlucHV0IG9wZXJhdGlvbiwgQyBkb2Vzbid0Ci0JICogZGVmaW5lIHdoYXQgdGhlIGxhdGVyIGZmbHVzaCgpIHdpbGwgZG8sIGJ1dCB3ZSBwcm9taXNlIHRydW5jYXRlKCkKLQkgKiB3b24ndCBjaGFuZ2UgdGhlIGN1cnJlbnQgcG9zaXRpb24gKGFuZCBmZmx1c2goKSAqZG9lcyogY2hhbmdlIGl0Ci0JICogdGhlbiBhdCBsZWFzdCBvbiBXaW5kb3dzKS4gIFRoZSBlYXNpZXN0IHRoaW5nIGlzIHRvIGNhcHR1cmUKLQkgKiBjdXJyZW50IHBvcyBub3cgYW5kIHNlZWsgYmFjayB0byBpdCBhdCB0aGUgZW5kLgotCSAqLwotCUZJTEVfQkVHSU5fQUxMT1dfVEhSRUFEUyhmKQotCWVycm5vID0gMDsKLQlpbml0aWFscG9zID0gX3BvcnRhYmxlX2Z0ZWxsKGYtPmZfZnApOwotCUZJTEVfRU5EX0FMTE9XX1RIUkVBRFMoZikKLQlpZiAoaW5pdGlhbHBvcyA9PSAtMSkKLQkJZ290byBvbmlvZXJyb3I7CisgICAgLyogR2V0IGN1cnJlbnQgZmlsZSBwb3NpdGlvbi4gIElmIHRoZSBmaWxlIGhhcHBlbnMgdG8gYmUgb3BlbiBmb3IKKyAgICAgKiB1cGRhdGUgYW5kIHRoZSBsYXN0IG9wZXJhdGlvbiB3YXMgYW4gaW5wdXQgb3BlcmF0aW9uLCBDIGRvZXNuJ3QKKyAgICAgKiBkZWZpbmUgd2hhdCB0aGUgbGF0ZXIgZmZsdXNoKCkgd2lsbCBkbywgYnV0IHdlIHByb21pc2UgdHJ1bmNhdGUoKQorICAgICAqIHdvbid0IGNoYW5nZSB0aGUgY3VycmVudCBwb3NpdGlvbiAoYW5kIGZmbHVzaCgpICpkb2VzKiBjaGFuZ2UgaXQKKyAgICAgKiB0aGVuIGF0IGxlYXN0IG9uIFdpbmRvd3MpLiAgVGhlIGVhc2llc3QgdGhpbmcgaXMgdG8gY2FwdHVyZQorICAgICAqIGN1cnJlbnQgcG9zIG5vdyBhbmQgc2VlayBiYWNrIHRvIGl0IGF0IHRoZSBlbmQuCisgICAgICovCisgICAgRklMRV9CRUdJTl9BTExPV19USFJFQURTKGYpCisgICAgZXJybm8gPSAwOworICAgIGluaXRpYWxwb3MgPSBfcG9ydGFibGVfZnRlbGwoZi0+Zl9mcCk7CisgICAgRklMRV9FTkRfQUxMT1dfVEhSRUFEUyhmKQorICAgIGlmIChpbml0aWFscG9zID09IC0xKQorICAgICAgICBnb3RvIG9uaW9lcnJvcjsKIAotCS8qIFNldCBuZXdzaXplIHRvIGN1cnJlbnQgcG9zdGlvbiBpZiBuZXdzaXplb2JqIE5VTEwsIGVsc2UgdG8gdGhlCi0JICogc3BlY2lmaWVkIHZhbHVlLgotCSAqLwotCWlmIChuZXdzaXplb2JqICE9IE5VTEwpIHsKKyAgICAvKiBTZXQgbmV3c2l6ZSB0byBjdXJyZW50IHBvc3Rpb24gaWYgbmV3c2l6ZW9iaiBOVUxMLCBlbHNlIHRvIHRoZQorICAgICAqIHNwZWNpZmllZCB2YWx1ZS4KKyAgICAgKi8KKyAgICBpZiAobmV3c2l6ZW9iaiAhPSBOVUxMKSB7CiAjaWYgIWRlZmluZWQoSEFWRV9MQVJHRUZJTEVfU1VQUE9SVCkKLQkJbmV3c2l6ZSA9IFB5SW50X0FzTG9uZyhuZXdzaXplb2JqKTsKKyAgICAgICAgbmV3c2l6ZSA9IFB5SW50X0FzTG9uZyhuZXdzaXplb2JqKTsKICNlbHNlCi0JCW5ld3NpemUgPSBQeUxvbmdfQ2hlY2sobmV3c2l6ZW9iaikgPwotCQkJCVB5TG9uZ19Bc0xvbmdMb25nKG5ld3NpemVvYmopIDoKLQkJCQlQeUludF9Bc0xvbmcobmV3c2l6ZW9iaik7CisgICAgICAgIG5ld3NpemUgPSBQeUxvbmdfQ2hlY2sobmV3c2l6ZW9iaikgPworICAgICAgICAgICAgICAgICAgICAgICAgUHlMb25nX0FzTG9uZ0xvbmcobmV3c2l6ZW9iaikgOgorICAgICAgICAgICAgICAgIFB5SW50X0FzTG9uZyhuZXdzaXplb2JqKTsKICNlbmRpZgotCQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkKLQkJCXJldHVybiBOVUxMOwotCX0KLQllbHNlIC8qIGRlZmF1bHQgdG8gY3VycmVudCBwb3NpdGlvbiAqLwotCQluZXdzaXplID0gaW5pdGlhbHBvczsKKyAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZWxzZSAvKiBkZWZhdWx0IHRvIGN1cnJlbnQgcG9zaXRpb24gKi8KKyAgICAgICAgbmV3c2l6ZSA9IGluaXRpYWxwb3M7CiAKLQkvKiBGbHVzaCB0aGUgc3RyZWFtLiAgV2UncmUgbWl4aW5nIHN0cmVhbS1sZXZlbCBJL08gd2l0aCBsb3dlci1sZXZlbAotCSAqIEkvTywgYW5kIGEgZmx1c2ggbWF5IGJlIG5lY2Vzc2FyeSB0byBzeW5jaCBib3RoIHBsYXRmb3JtIHZpZXdzCi0JICogb2YgdGhlIGN1cnJlbnQgZmlsZSBzdGF0ZS4KLQkgKi8KLQlGSUxFX0JFR0lOX0FMTE9XX1RIUkVBRFMoZikKLQllcnJubyA9IDA7Ci0JcmV0ID0gZmZsdXNoKGYtPmZfZnApOwotCUZJTEVfRU5EX0FMTE9XX1RIUkVBRFMoZikKLQlpZiAocmV0ICE9IDApCi0JCWdvdG8gb25pb2Vycm9yOworICAgIC8qIEZsdXNoIHRoZSBzdHJlYW0uICBXZSdyZSBtaXhpbmcgc3RyZWFtLWxldmVsIEkvTyB3aXRoIGxvd2VyLWxldmVsCisgICAgICogSS9PLCBhbmQgYSBmbHVzaCBtYXkgYmUgbmVjZXNzYXJ5IHRvIHN5bmNoIGJvdGggcGxhdGZvcm0gdmlld3MKKyAgICAgKiBvZiB0aGUgY3VycmVudCBmaWxlIHN0YXRlLgorICAgICAqLworICAgIEZJTEVfQkVHSU5fQUxMT1dfVEhSRUFEUyhmKQorICAgIGVycm5vID0gMDsKKyAgICByZXQgPSBmZmx1c2goZi0+Zl9mcCk7CisgICAgRklMRV9FTkRfQUxMT1dfVEhSRUFEUyhmKQorICAgIGlmIChyZXQgIT0gMCkKKyAgICAgICAgZ290byBvbmlvZXJyb3I7CiAKICNpZmRlZiBNU19XSU5ET1dTCi0JLyogTVMgX2Noc2l6ZSBkb2Vzbid0IHdvcmsgaWYgbmV3c2l6ZSBkb2Vzbid0IGZpdCBpbiAzMiBiaXRzLAotCSAgIHNvIGRvbid0IGV2ZW4gdHJ5IHVzaW5nIGl0LiAqLwotCXsKLQkJSEFORExFIGhGaWxlOworICAgIC8qIE1TIF9jaHNpemUgZG9lc24ndCB3b3JrIGlmIG5ld3NpemUgZG9lc24ndCBmaXQgaW4gMzIgYml0cywKKyAgICAgICBzbyBkb24ndCBldmVuIHRyeSB1c2luZyBpdC4gKi8KKyAgICB7CisgICAgICAgIEhBTkRMRSBoRmlsZTsKIAotCQkvKiBIYXZlIHRvIG1vdmUgY3VycmVudCBwb3MgdG8gZGVzaXJlZCBlbmRwb2ludCBvbiBXaW5kb3dzLiAqLwotCQlGSUxFX0JFR0lOX0FMTE9XX1RIUkVBRFMoZikKLQkJZXJybm8gPSAwOwotCQlyZXQgPSBfcG9ydGFibGVfZnNlZWsoZi0+Zl9mcCwgbmV3c2l6ZSwgU0VFS19TRVQpICE9IDA7Ci0JCUZJTEVfRU5EX0FMTE9XX1RIUkVBRFMoZikKLQkJaWYgKHJldCkKLQkJCWdvdG8gb25pb2Vycm9yOworICAgICAgICAvKiBIYXZlIHRvIG1vdmUgY3VycmVudCBwb3MgdG8gZGVzaXJlZCBlbmRwb2ludCBvbiBXaW5kb3dzLiAqLworICAgICAgICBGSUxFX0JFR0lOX0FMTE9XX1RIUkVBRFMoZikKKyAgICAgICAgZXJybm8gPSAwOworICAgICAgICByZXQgPSBfcG9ydGFibGVfZnNlZWsoZi0+Zl9mcCwgbmV3c2l6ZSwgU0VFS19TRVQpICE9IDA7CisgICAgICAgIEZJTEVfRU5EX0FMTE9XX1RIUkVBRFMoZikKKyAgICAgICAgaWYgKHJldCkKKyAgICAgICAgICAgIGdvdG8gb25pb2Vycm9yOwogCi0JCS8qIFRydW5jYXRlLiAgTm90ZSB0aGF0IHRoaXMgbWF5IGdyb3cgdGhlIGZpbGUhICovCi0JCUZJTEVfQkVHSU5fQUxMT1dfVEhSRUFEUyhmKQotCQllcnJubyA9IDA7Ci0JCWhGaWxlID0gKEhBTkRMRSlfZ2V0X29zZmhhbmRsZShmaWxlbm8oZi0+Zl9mcCkpOwotCQlyZXQgPSBoRmlsZSA9PSAoSEFORExFKS0xOwotCQlpZiAocmV0ID09IDApIHsKLQkJCXJldCA9IFNldEVuZE9mRmlsZShoRmlsZSkgPT0gMDsKLQkJCWlmIChyZXQpCi0JCQkJZXJybm8gPSBFQUNDRVM7Ci0JCX0KLQkJRklMRV9FTkRfQUxMT1dfVEhSRUFEUyhmKQotCQlpZiAocmV0KQotCQkJZ290byBvbmlvZXJyb3I7Ci0JfQorICAgICAgICAvKiBUcnVuY2F0ZS4gIE5vdGUgdGhhdCB0aGlzIG1heSBncm93IHRoZSBmaWxlISAqLworICAgICAgICBGSUxFX0JFR0lOX0FMTE9XX1RIUkVBRFMoZikKKyAgICAgICAgZXJybm8gPSAwOworICAgICAgICBoRmlsZSA9IChIQU5ETEUpX2dldF9vc2ZoYW5kbGUoZmlsZW5vKGYtPmZfZnApKTsKKyAgICAgICAgcmV0ID0gaEZpbGUgPT0gKEhBTkRMRSktMTsKKyAgICAgICAgaWYgKHJldCA9PSAwKSB7CisgICAgICAgICAgICByZXQgPSBTZXRFbmRPZkZpbGUoaEZpbGUpID09IDA7CisgICAgICAgICAgICBpZiAocmV0KQorICAgICAgICAgICAgICAgIGVycm5vID0gRUFDQ0VTOworICAgICAgICB9CisgICAgICAgIEZJTEVfRU5EX0FMTE9XX1RIUkVBRFMoZikKKyAgICAgICAgaWYgKHJldCkKKyAgICAgICAgICAgIGdvdG8gb25pb2Vycm9yOworICAgIH0KICNlbHNlCi0JRklMRV9CRUdJTl9BTExPV19USFJFQURTKGYpCi0JZXJybm8gPSAwOwotCXJldCA9IGZ0cnVuY2F0ZShmaWxlbm8oZi0+Zl9mcCksIG5ld3NpemUpOwotCUZJTEVfRU5EX0FMTE9XX1RIUkVBRFMoZikKLQlpZiAocmV0ICE9IDApCi0JCWdvdG8gb25pb2Vycm9yOworICAgIEZJTEVfQkVHSU5fQUxMT1dfVEhSRUFEUyhmKQorICAgIGVycm5vID0gMDsKKyAgICByZXQgPSBmdHJ1bmNhdGUoZmlsZW5vKGYtPmZfZnApLCBuZXdzaXplKTsKKyAgICBGSUxFX0VORF9BTExPV19USFJFQURTKGYpCisgICAgaWYgKHJldCAhPSAwKQorICAgICAgICBnb3RvIG9uaW9lcnJvcjsKICNlbmRpZiAvKiAhTVNfV0lORE9XUyAqLwogCi0JLyogUmVzdG9yZSBvcmlnaW5hbCBmaWxlIHBvc2l0aW9uLiAqLwotCUZJTEVfQkVHSU5fQUxMT1dfVEhSRUFEUyhmKQotCWVycm5vID0gMDsKLQlyZXQgPSBfcG9ydGFibGVfZnNlZWsoZi0+Zl9mcCwgaW5pdGlhbHBvcywgU0VFS19TRVQpICE9IDA7Ci0JRklMRV9FTkRfQUxMT1dfVEhSRUFEUyhmKQotCWlmIChyZXQpCi0JCWdvdG8gb25pb2Vycm9yOworICAgIC8qIFJlc3RvcmUgb3JpZ2luYWwgZmlsZSBwb3NpdGlvbi4gKi8KKyAgICBGSUxFX0JFR0lOX0FMTE9XX1RIUkVBRFMoZikKKyAgICBlcnJubyA9IDA7CisgICAgcmV0ID0gX3BvcnRhYmxlX2ZzZWVrKGYtPmZfZnAsIGluaXRpYWxwb3MsIFNFRUtfU0VUKSAhPSAwOworICAgIEZJTEVfRU5EX0FMTE9XX1RIUkVBRFMoZikKKyAgICBpZiAocmV0KQorICAgICAgICBnb3RvIG9uaW9lcnJvcjsKIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiAKIG9uaW9lcnJvcjoKLQlQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7Ci0JY2xlYXJlcnIoZi0+Zl9mcCk7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOworICAgIGNsZWFyZXJyKGYtPmZfZnApOworICAgIHJldHVybiBOVUxMOwogfQogI2VuZGlmIC8qIEhBVkVfRlRSVU5DQVRFICovCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmaWxlX3RlbGwoUHlGaWxlT2JqZWN0ICpmKQogewotCVB5X29mZl90IHBvczsKKyAgICBQeV9vZmZfdCBwb3M7CiAKLQlpZiAoZi0+Zl9mcCA9PSBOVUxMKQotCQlyZXR1cm4gZXJyX2Nsb3NlZCgpOwotCUZJTEVfQkVHSU5fQUxMT1dfVEhSRUFEUyhmKQotCWVycm5vID0gMDsKLQlwb3MgPSBfcG9ydGFibGVfZnRlbGwoZi0+Zl9mcCk7Ci0JRklMRV9FTkRfQUxMT1dfVEhSRUFEUyhmKQorICAgIGlmIChmLT5mX2ZwID09IE5VTEwpCisgICAgICAgIHJldHVybiBlcnJfY2xvc2VkKCk7CisgICAgRklMRV9CRUdJTl9BTExPV19USFJFQURTKGYpCisgICAgZXJybm8gPSAwOworICAgIHBvcyA9IF9wb3J0YWJsZV9mdGVsbChmLT5mX2ZwKTsKKyAgICBGSUxFX0VORF9BTExPV19USFJFQURTKGYpCiAKLQlpZiAocG9zID09IC0xKSB7Ci0JCVB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKLQkJY2xlYXJlcnIoZi0+Zl9mcCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoZi0+Zl9za2lwbmV4dGxmKSB7Ci0JCWludCBjOwotCQljID0gR0VUQyhmLT5mX2ZwKTsKLQkJaWYgKGMgPT0gJ1xuJykgewotCQkJZi0+Zl9uZXdsaW5ldHlwZXMgfD0gTkVXTElORV9DUkxGOwotCQkJcG9zKys7Ci0JCQlmLT5mX3NraXBuZXh0bGYgPSAwOwotCQl9IGVsc2UgaWYgKGMgIT0gRU9GKSB1bmdldGMoYywgZi0+Zl9mcCk7Ci0JfQorICAgIGlmIChwb3MgPT0gLTEpIHsKKyAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOworICAgICAgICBjbGVhcmVycihmLT5mX2ZwKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChmLT5mX3NraXBuZXh0bGYpIHsKKyAgICAgICAgaW50IGM7CisgICAgICAgIGMgPSBHRVRDKGYtPmZfZnApOworICAgICAgICBpZiAoYyA9PSAnXG4nKSB7CisgICAgICAgICAgICBmLT5mX25ld2xpbmV0eXBlcyB8PSBORVdMSU5FX0NSTEY7CisgICAgICAgICAgICBwb3MrKzsKKyAgICAgICAgICAgIGYtPmZfc2tpcG5leHRsZiA9IDA7CisgICAgICAgIH0gZWxzZSBpZiAoYyAhPSBFT0YpIHVuZ2V0YyhjLCBmLT5mX2ZwKTsKKyAgICB9CiAjaWYgIWRlZmluZWQoSEFWRV9MQVJHRUZJTEVfU1VQUE9SVCkKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcocG9zKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcocG9zKTsKICNlbHNlCi0JcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZ0xvbmcocG9zKTsKKyAgICByZXR1cm4gUHlMb25nX0Zyb21Mb25nTG9uZyhwb3MpOwogI2VuZGlmCiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmaWxlX2ZpbGVubyhQeUZpbGVPYmplY3QgKmYpCiB7Ci0JaWYgKGYtPmZfZnAgPT0gTlVMTCkKLQkJcmV0dXJuIGVycl9jbG9zZWQoKTsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIGZpbGVubyhmLT5mX2ZwKSk7CisgICAgaWYgKGYtPmZfZnAgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIGVycl9jbG9zZWQoKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIGZpbGVubyhmLT5mX2ZwKSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmaWxlX2ZsdXNoKFB5RmlsZU9iamVjdCAqZikKIHsKLQlpbnQgcmVzOworICAgIGludCByZXM7CiAKLQlpZiAoZi0+Zl9mcCA9PSBOVUxMKQotCQlyZXR1cm4gZXJyX2Nsb3NlZCgpOwotCUZJTEVfQkVHSU5fQUxMT1dfVEhSRUFEUyhmKQotCWVycm5vID0gMDsKLQlyZXMgPSBmZmx1c2goZi0+Zl9mcCk7Ci0JRklMRV9FTkRfQUxMT1dfVEhSRUFEUyhmKQotCWlmIChyZXMgIT0gMCkgewotCQlQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7Ci0JCWNsZWFyZXJyKGYtPmZfZnApOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGlmIChmLT5mX2ZwID09IE5VTEwpCisgICAgICAgIHJldHVybiBlcnJfY2xvc2VkKCk7CisgICAgRklMRV9CRUdJTl9BTExPV19USFJFQURTKGYpCisgICAgZXJybm8gPSAwOworICAgIHJlcyA9IGZmbHVzaChmLT5mX2ZwKTsKKyAgICBGSUxFX0VORF9BTExPV19USFJFQURTKGYpCisgICAgaWYgKHJlcyAhPSAwKSB7CisgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKKyAgICAgICAgY2xlYXJlcnIoZi0+Zl9mcCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmaWxlX2lzYXR0eShQeUZpbGVPYmplY3QgKmYpCiB7Ci0JbG9uZyByZXM7Ci0JaWYgKGYtPmZfZnAgPT0gTlVMTCkKLQkJcmV0dXJuIGVycl9jbG9zZWQoKTsKLQlGSUxFX0JFR0lOX0FMTE9XX1RIUkVBRFMoZikKLQlyZXMgPSBpc2F0dHkoKGludClmaWxlbm8oZi0+Zl9mcCkpOwotCUZJTEVfRU5EX0FMTE9XX1RIUkVBRFMoZikKLQlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKHJlcyk7CisgICAgbG9uZyByZXM7CisgICAgaWYgKGYtPmZfZnAgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIGVycl9jbG9zZWQoKTsKKyAgICBGSUxFX0JFR0lOX0FMTE9XX1RIUkVBRFMoZikKKyAgICByZXMgPSBpc2F0dHkoKGludClmaWxlbm8oZi0+Zl9mcCkpOworICAgIEZJTEVfRU5EX0FMTE9XX1RIUkVBRFMoZikKKyAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKHJlcyk7CiB9CiAKIApAQCAtOTA3LDM5ICs5MDcsMzkgQEAKIG5ld19idWZmZXJzaXplKFB5RmlsZU9iamVjdCAqZiwgc2l6ZV90IGN1cnJlbnRzaXplKQogewogI2lmZGVmIEhBVkVfRlNUQVQKLQlvZmZfdCBwb3MsIGVuZDsKLQlzdHJ1Y3Qgc3RhdCBzdDsKLQlpZiAoZnN0YXQoZmlsZW5vKGYtPmZfZnApLCAmc3QpID09IDApIHsKLQkJZW5kID0gc3Quc3Rfc2l6ZTsKLQkJLyogVGhlIGZvbGxvd2luZyBpcyBub3QgYSBidWc6IHdlIHJlYWxseSBuZWVkIHRvIGNhbGwgbHNlZWsoKQotCQkgICAqYW5kKiBmdGVsbCgpLiAgVGhlIHJlYXNvbiBpcyB0aGF0IHNvbWUgc3RkaW8gbGlicmFyaWVzCi0JCSAgIG1pc3Rha2VubHkgZmx1c2ggdGhlaXIgYnVmZmVyIHdoZW4gZnRlbGwoKSBpcyBjYWxsZWQgYW5kCi0JCSAgIHRoZSBsc2VlaygpIGNhbGwgaXQgbWFrZXMgZmFpbHMsIHRoZXJlYnkgdGhyb3dpbmcgYXdheQotCQkgICBkYXRhIHRoYXQgY2Fubm90IGJlIHJlY292ZXJlZCBpbiBhbnkgd2F5LiAgVG8gYXZvaWQgdGhpcywKLQkJICAgd2UgZmlyc3QgdGVzdCBsc2VlaygpLCBhbmQgb25seSBjYWxsIGZ0ZWxsKCkgaWYgbHNlZWsoKQotCQkgICB3b3Jrcy4gIFdlIGNhbid0IHVzZSB0aGUgbHNlZWsoKSB2YWx1ZSBlaXRoZXIsIGJlY2F1c2Ugd2UKLQkJICAgbmVlZCB0byB0YWtlIHRoZSBhbW91bnQgb2YgYnVmZmVyZWQgZGF0YSBpbnRvIGFjY291bnQuCi0JCSAgIChZZXQgYW5vdGhlciByZWFzb24gd2h5IHN0ZGlvIHN0aW5rcy4gOi0pICovCi0JCXBvcyA9IGxzZWVrKGZpbGVubyhmLT5mX2ZwKSwgMEwsIFNFRUtfQ1VSKTsKLQkJaWYgKHBvcyA+PSAwKSB7Ci0JCQlwb3MgPSBmdGVsbChmLT5mX2ZwKTsKLQkJfQotCQlpZiAocG9zIDwgMCkKLQkJCWNsZWFyZXJyKGYtPmZfZnApOwotCQlpZiAoZW5kID4gcG9zICYmIHBvcyA+PSAwKQotCQkJcmV0dXJuIGN1cnJlbnRzaXplICsgZW5kIC0gcG9zICsgMTsKLQkJLyogQWRkIDEgc28gaWYgdGhlIGZpbGUgd2VyZSB0byBncm93IHdlJ2Qgbm90aWNlLiAqLwotCX0KKyAgICBvZmZfdCBwb3MsIGVuZDsKKyAgICBzdHJ1Y3Qgc3RhdCBzdDsKKyAgICBpZiAoZnN0YXQoZmlsZW5vKGYtPmZfZnApLCAmc3QpID09IDApIHsKKyAgICAgICAgZW5kID0gc3Quc3Rfc2l6ZTsKKyAgICAgICAgLyogVGhlIGZvbGxvd2luZyBpcyBub3QgYSBidWc6IHdlIHJlYWxseSBuZWVkIHRvIGNhbGwgbHNlZWsoKQorICAgICAgICAgICAqYW5kKiBmdGVsbCgpLiAgVGhlIHJlYXNvbiBpcyB0aGF0IHNvbWUgc3RkaW8gbGlicmFyaWVzCisgICAgICAgICAgIG1pc3Rha2VubHkgZmx1c2ggdGhlaXIgYnVmZmVyIHdoZW4gZnRlbGwoKSBpcyBjYWxsZWQgYW5kCisgICAgICAgICAgIHRoZSBsc2VlaygpIGNhbGwgaXQgbWFrZXMgZmFpbHMsIHRoZXJlYnkgdGhyb3dpbmcgYXdheQorICAgICAgICAgICBkYXRhIHRoYXQgY2Fubm90IGJlIHJlY292ZXJlZCBpbiBhbnkgd2F5LiAgVG8gYXZvaWQgdGhpcywKKyAgICAgICAgICAgd2UgZmlyc3QgdGVzdCBsc2VlaygpLCBhbmQgb25seSBjYWxsIGZ0ZWxsKCkgaWYgbHNlZWsoKQorICAgICAgICAgICB3b3Jrcy4gIFdlIGNhbid0IHVzZSB0aGUgbHNlZWsoKSB2YWx1ZSBlaXRoZXIsIGJlY2F1c2Ugd2UKKyAgICAgICAgICAgbmVlZCB0byB0YWtlIHRoZSBhbW91bnQgb2YgYnVmZmVyZWQgZGF0YSBpbnRvIGFjY291bnQuCisgICAgICAgICAgIChZZXQgYW5vdGhlciByZWFzb24gd2h5IHN0ZGlvIHN0aW5rcy4gOi0pICovCisgICAgICAgIHBvcyA9IGxzZWVrKGZpbGVubyhmLT5mX2ZwKSwgMEwsIFNFRUtfQ1VSKTsKKyAgICAgICAgaWYgKHBvcyA+PSAwKSB7CisgICAgICAgICAgICBwb3MgPSBmdGVsbChmLT5mX2ZwKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocG9zIDwgMCkKKyAgICAgICAgICAgIGNsZWFyZXJyKGYtPmZfZnApOworICAgICAgICBpZiAoZW5kID4gcG9zICYmIHBvcyA+PSAwKQorICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRzaXplICsgZW5kIC0gcG9zICsgMTsKKyAgICAgICAgLyogQWRkIDEgc28gaWYgdGhlIGZpbGUgd2VyZSB0byBncm93IHdlJ2Qgbm90aWNlLiAqLworICAgIH0KICNlbmRpZgotCWlmIChjdXJyZW50c2l6ZSA+IFNNQUxMQ0hVTkspIHsKLQkJLyogS2VlcCBkb3VibGluZyB1bnRpbCB3ZSByZWFjaCBCSUdDSFVOSzsKLQkJICAgdGhlbiBrZWVwIGFkZGluZyBCSUdDSFVOSy4gKi8KLQkJaWYgKGN1cnJlbnRzaXplIDw9IEJJR0NIVU5LKQotCQkJcmV0dXJuIGN1cnJlbnRzaXplICsgY3VycmVudHNpemU7Ci0JCWVsc2UKLQkJCXJldHVybiBjdXJyZW50c2l6ZSArIEJJR0NIVU5LOwotCX0KLQlyZXR1cm4gY3VycmVudHNpemUgKyBTTUFMTENIVU5LOworICAgIGlmIChjdXJyZW50c2l6ZSA+IFNNQUxMQ0hVTkspIHsKKyAgICAgICAgLyogS2VlcCBkb3VibGluZyB1bnRpbCB3ZSByZWFjaCBCSUdDSFVOSzsKKyAgICAgICAgICAgdGhlbiBrZWVwIGFkZGluZyBCSUdDSFVOSy4gKi8KKyAgICAgICAgaWYgKGN1cnJlbnRzaXplIDw9IEJJR0NIVU5LKQorICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRzaXplICsgY3VycmVudHNpemU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBjdXJyZW50c2l6ZSArIEJJR0NIVU5LOworICAgIH0KKyAgICByZXR1cm4gY3VycmVudHNpemUgKyBTTUFMTENIVU5LOwogfQogCiAjaWYgZGVmaW5lZChFV09VTERCTE9DSykgJiYgZGVmaW5lZChFQUdBSU4pICYmIEVXT1VMREJMT0NLICE9IEVBR0FJTgpAQCAtOTU5LDExNCArOTU5LDExNCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGZpbGVfcmVhZChQeUZpbGVPYmplY3QgKmYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYnl0ZXNyZXF1ZXN0ZWQgPSAtMTsKLQlzaXplX3QgYnl0ZXNyZWFkLCBidWZmZXJzaXplLCBjaHVua3NpemU7Ci0JUHlPYmplY3QgKnY7CisgICAgbG9uZyBieXRlc3JlcXVlc3RlZCA9IC0xOworICAgIHNpemVfdCBieXRlc3JlYWQsIGJ1ZmZlcnNpemUsIGNodW5rc2l6ZTsKKyAgICBQeU9iamVjdCAqdjsKIAotCWlmIChmLT5mX2ZwID09IE5VTEwpCi0JCXJldHVybiBlcnJfY2xvc2VkKCk7Ci0JaWYgKCFmLT5yZWFkYWJsZSkKLQkJcmV0dXJuIGVycl9tb2RlKCJyZWFkaW5nIik7Ci0JLyogcmVmdXNlIHRvIG1peCB3aXRoIGYubmV4dCgpICovCi0JaWYgKGYtPmZfYnVmICE9IE5VTEwgJiYKLQkgICAgKGYtPmZfYnVmZW5kIC0gZi0+Zl9idWZwdHIpID4gMCAmJgotCSAgICBmLT5mX2J1ZlswXSAhPSAnXDAnKQotCQlyZXR1cm4gZXJyX2l0ZXJidWZmZXJlZCgpOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifGw6cmVhZCIsICZieXRlc3JlcXVlc3RlZCkpCi0JCXJldHVybiBOVUxMOwotCWlmIChieXRlc3JlcXVlc3RlZCA8IDApCi0JCWJ1ZmZlcnNpemUgPSBuZXdfYnVmZmVyc2l6ZShmLCAoc2l6ZV90KTApOwotCWVsc2UKLQkJYnVmZmVyc2l6ZSA9IGJ5dGVzcmVxdWVzdGVkOwotCWlmIChidWZmZXJzaXplID4gUFlfU1NJWkVfVF9NQVgpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0JInJlcXVlc3RlZCBudW1iZXIgb2YgYnl0ZXMgaXMgbW9yZSB0aGFuIGEgUHl0aG9uIHN0cmluZyBjYW4gaG9sZCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JdiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopTlVMTCwgYnVmZmVyc2l6ZSk7Ci0JaWYgKHYgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JYnl0ZXNyZWFkID0gMDsKLQlmb3IgKDs7KSB7Ci0JCUZJTEVfQkVHSU5fQUxMT1dfVEhSRUFEUyhmKQotCQllcnJubyA9IDA7Ci0JCWNodW5rc2l6ZSA9IFB5X1VuaXZlcnNhbE5ld2xpbmVGcmVhZChCVUYodikgKyBieXRlc3JlYWQsCi0JCQkgIGJ1ZmZlcnNpemUgLSBieXRlc3JlYWQsIGYtPmZfZnAsIChQeU9iamVjdCAqKWYpOwotCQlGSUxFX0VORF9BTExPV19USFJFQURTKGYpCi0JCWlmIChjaHVua3NpemUgPT0gMCkgewotCQkJaWYgKCFmZXJyb3IoZi0+Zl9mcCkpCi0JCQkJYnJlYWs7Ci0JCQljbGVhcmVycihmLT5mX2ZwKTsKLQkJCS8qIFdoZW4gaW4gbm9uLWJsb2NraW5nIG1vZGUsIGRhdGEgc2hvdWxkbid0Ci0JCQkgKiBiZSBkaXNjYXJkZWQgaWYgYSBibG9ja2luZyBzaWduYWwgd2FzCi0JCQkgKiByZWNlaXZlZC4gVGhhdCB3aWxsIGFsc28gaGFwcGVuIGlmCi0JCQkgKiBjaHVua3NpemUgIT0gMCwgYnV0IGJ5dGVzcmVhZCA8IGJ1ZmZlcnNpemUuICovCi0JCQlpZiAoYnl0ZXNyZWFkID4gMCAmJiBCTE9DS0VEX0VSUk5PKGVycm5vKSkKLQkJCQlicmVhazsKLQkJCVB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKLQkJCVB5X0RFQ1JFRih2KTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWJ5dGVzcmVhZCArPSBjaHVua3NpemU7Ci0JCWlmIChieXRlc3JlYWQgPCBidWZmZXJzaXplKSB7Ci0JCQljbGVhcmVycihmLT5mX2ZwKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmIChieXRlc3JlcXVlc3RlZCA8IDApIHsKLQkJCWJ1ZmZlcnNpemUgPSBuZXdfYnVmZmVyc2l6ZShmLCBidWZmZXJzaXplKTsKLQkJCWlmIChfUHlTdHJpbmdfUmVzaXplKCZ2LCBidWZmZXJzaXplKSA8IDApCi0JCQkJcmV0dXJuIE5VTEw7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBHb3Qgd2hhdCB3YXMgcmVxdWVzdGVkLiAqLwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JaWYgKGJ5dGVzcmVhZCAhPSBidWZmZXJzaXplKQotCQlfUHlTdHJpbmdfUmVzaXplKCZ2LCBieXRlc3JlYWQpOwotCXJldHVybiB2OworICAgIGlmIChmLT5mX2ZwID09IE5VTEwpCisgICAgICAgIHJldHVybiBlcnJfY2xvc2VkKCk7CisgICAgaWYgKCFmLT5yZWFkYWJsZSkKKyAgICAgICAgcmV0dXJuIGVycl9tb2RlKCJyZWFkaW5nIik7CisgICAgLyogcmVmdXNlIHRvIG1peCB3aXRoIGYubmV4dCgpICovCisgICAgaWYgKGYtPmZfYnVmICE9IE5VTEwgJiYKKyAgICAgICAgKGYtPmZfYnVmZW5kIC0gZi0+Zl9idWZwdHIpID4gMCAmJgorICAgICAgICBmLT5mX2J1ZlswXSAhPSAnXDAnKQorICAgICAgICByZXR1cm4gZXJyX2l0ZXJidWZmZXJlZCgpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifGw6cmVhZCIsICZieXRlc3JlcXVlc3RlZCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChieXRlc3JlcXVlc3RlZCA8IDApCisgICAgICAgIGJ1ZmZlcnNpemUgPSBuZXdfYnVmZmVyc2l6ZShmLCAoc2l6ZV90KTApOworICAgIGVsc2UKKyAgICAgICAgYnVmZmVyc2l6ZSA9IGJ5dGVzcmVxdWVzdGVkOworICAgIGlmIChidWZmZXJzaXplID4gUFlfU1NJWkVfVF9NQVgpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgInJlcXVlc3RlZCBudW1iZXIgb2YgYnl0ZXMgaXMgbW9yZSB0aGFuIGEgUHl0aG9uIHN0cmluZyBjYW4gaG9sZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgdiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopTlVMTCwgYnVmZmVyc2l6ZSk7CisgICAgaWYgKHYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYnl0ZXNyZWFkID0gMDsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIEZJTEVfQkVHSU5fQUxMT1dfVEhSRUFEUyhmKQorICAgICAgICBlcnJubyA9IDA7CisgICAgICAgIGNodW5rc2l6ZSA9IFB5X1VuaXZlcnNhbE5ld2xpbmVGcmVhZChCVUYodikgKyBieXRlc3JlYWQsCisgICAgICAgICAgICAgICAgICBidWZmZXJzaXplIC0gYnl0ZXNyZWFkLCBmLT5mX2ZwLCAoUHlPYmplY3QgKilmKTsKKyAgICAgICAgRklMRV9FTkRfQUxMT1dfVEhSRUFEUyhmKQorICAgICAgICBpZiAoY2h1bmtzaXplID09IDApIHsKKyAgICAgICAgICAgIGlmICghZmVycm9yKGYtPmZfZnApKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2xlYXJlcnIoZi0+Zl9mcCk7CisgICAgICAgICAgICAvKiBXaGVuIGluIG5vbi1ibG9ja2luZyBtb2RlLCBkYXRhIHNob3VsZG4ndAorICAgICAgICAgICAgICogYmUgZGlzY2FyZGVkIGlmIGEgYmxvY2tpbmcgc2lnbmFsIHdhcworICAgICAgICAgICAgICogcmVjZWl2ZWQuIFRoYXQgd2lsbCBhbHNvIGhhcHBlbiBpZgorICAgICAgICAgICAgICogY2h1bmtzaXplICE9IDAsIGJ1dCBieXRlc3JlYWQgPCBidWZmZXJzaXplLiAqLworICAgICAgICAgICAgaWYgKGJ5dGVzcmVhZCA+IDAgJiYgQkxPQ0tFRF9FUlJOTyhlcnJubykpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7CisgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBieXRlc3JlYWQgKz0gY2h1bmtzaXplOworICAgICAgICBpZiAoYnl0ZXNyZWFkIDwgYnVmZmVyc2l6ZSkgeworICAgICAgICAgICAgY2xlYXJlcnIoZi0+Zl9mcCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoYnl0ZXNyZXF1ZXN0ZWQgPCAwKSB7CisgICAgICAgICAgICBidWZmZXJzaXplID0gbmV3X2J1ZmZlcnNpemUoZiwgYnVmZmVyc2l6ZSk7CisgICAgICAgICAgICBpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmdiwgYnVmZmVyc2l6ZSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogR290IHdoYXQgd2FzIHJlcXVlc3RlZC4gKi8KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChieXRlc3JlYWQgIT0gYnVmZmVyc2l6ZSkKKyAgICAgICAgX1B5U3RyaW5nX1Jlc2l6ZSgmdiwgYnl0ZXNyZWFkKTsKKyAgICByZXR1cm4gdjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZpbGVfcmVhZGludG8oUHlGaWxlT2JqZWN0ICpmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpwdHI7Ci0JUHlfc3NpemVfdCBudG9kbzsKLQlQeV9zc2l6ZV90IG5kb25lLCBubm93OwotCVB5X2J1ZmZlciBwYnVmOworICAgIGNoYXIgKnB0cjsKKyAgICBQeV9zc2l6ZV90IG50b2RvOworICAgIFB5X3NzaXplX3QgbmRvbmUsIG5ub3c7CisgICAgUHlfYnVmZmVyIHBidWY7CiAKLQlpZiAoZi0+Zl9mcCA9PSBOVUxMKQotCQlyZXR1cm4gZXJyX2Nsb3NlZCgpOwotCWlmICghZi0+cmVhZGFibGUpCi0JCXJldHVybiBlcnJfbW9kZSgicmVhZGluZyIpOwotCS8qIHJlZnVzZSB0byBtaXggd2l0aCBmLm5leHQoKSAqLwotCWlmIChmLT5mX2J1ZiAhPSBOVUxMICYmCi0JICAgIChmLT5mX2J1ZmVuZCAtIGYtPmZfYnVmcHRyKSA+IDAgJiYKLQkgICAgZi0+Zl9idWZbMF0gIT0gJ1wwJykKLQkJcmV0dXJuIGVycl9pdGVyYnVmZmVyZWQoKTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIncqIiwgJnBidWYpKQotCQlyZXR1cm4gTlVMTDsKLQlwdHIgPSBwYnVmLmJ1ZjsKLQludG9kbyA9IHBidWYubGVuOwotCW5kb25lID0gMDsKLQl3aGlsZSAobnRvZG8gPiAwKSB7Ci0JCUZJTEVfQkVHSU5fQUxMT1dfVEhSRUFEUyhmKQotCQllcnJubyA9IDA7Ci0JCW5ub3cgPSBQeV9Vbml2ZXJzYWxOZXdsaW5lRnJlYWQocHRyK25kb25lLCBudG9kbywgZi0+Zl9mcCwKLQkJCQkJCShQeU9iamVjdCAqKWYpOwotCQlGSUxFX0VORF9BTExPV19USFJFQURTKGYpCi0JCWlmIChubm93ID09IDApIHsKLQkJCWlmICghZmVycm9yKGYtPmZfZnApKQotCQkJCWJyZWFrOwotCQkJUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOwotCQkJY2xlYXJlcnIoZi0+Zl9mcCk7Ci0JCQlQeUJ1ZmZlcl9SZWxlYXNlKCZwYnVmKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCW5kb25lICs9IG5ub3c7Ci0JCW50b2RvIC09IG5ub3c7Ci0JfQotCVB5QnVmZmVyX1JlbGVhc2UoJnBidWYpOwotCXJldHVybiBQeUludF9Gcm9tU3NpemVfdChuZG9uZSk7CisgICAgaWYgKGYtPmZfZnAgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIGVycl9jbG9zZWQoKTsKKyAgICBpZiAoIWYtPnJlYWRhYmxlKQorICAgICAgICByZXR1cm4gZXJyX21vZGUoInJlYWRpbmciKTsKKyAgICAvKiByZWZ1c2UgdG8gbWl4IHdpdGggZi5uZXh0KCkgKi8KKyAgICBpZiAoZi0+Zl9idWYgIT0gTlVMTCAmJgorICAgICAgICAoZi0+Zl9idWZlbmQgLSBmLT5mX2J1ZnB0cikgPiAwICYmCisgICAgICAgIGYtPmZfYnVmWzBdICE9ICdcMCcpCisgICAgICAgIHJldHVybiBlcnJfaXRlcmJ1ZmZlcmVkKCk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ3KiIsICZwYnVmKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcHRyID0gcGJ1Zi5idWY7CisgICAgbnRvZG8gPSBwYnVmLmxlbjsKKyAgICBuZG9uZSA9IDA7CisgICAgd2hpbGUgKG50b2RvID4gMCkgeworICAgICAgICBGSUxFX0JFR0lOX0FMTE9XX1RIUkVBRFMoZikKKyAgICAgICAgZXJybm8gPSAwOworICAgICAgICBubm93ID0gUHlfVW5pdmVyc2FsTmV3bGluZUZyZWFkKHB0cituZG9uZSwgbnRvZG8sIGYtPmZfZnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFB5T2JqZWN0ICopZik7CisgICAgICAgIEZJTEVfRU5EX0FMTE9XX1RIUkVBRFMoZikKKyAgICAgICAgaWYgKG5ub3cgPT0gMCkgeworICAgICAgICAgICAgaWYgKCFmZXJyb3IoZi0+Zl9mcCkpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7CisgICAgICAgICAgICBjbGVhcmVycihmLT5mX2ZwKTsKKyAgICAgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnBidWYpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgbmRvbmUgKz0gbm5vdzsKKyAgICAgICAgbnRvZG8gLT0gbm5vdzsKKyAgICB9CisgICAgUHlCdWZmZXJfUmVsZWFzZSgmcGJ1Zik7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KG5kb25lKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xMDg4LDkgKzEwODgsOSBAQAogCiBSZXBvcnRzIGZyb20gb3RoZXIgcGxhdGZvcm1zIG9uIHRoaXMgbWV0aG9kIHZzIGdldGNfdW5sb2NrZWQgKHdoaWNoIE1TIGRvZXNuJ3QKIGhhdmUpOgotCUxpbnV4CQlhIHdhc2gKLQlTb2xhcmlzCQlhIHdhc2gKLQlUcnU2NCBVbml4CWdldGxpbmVfdmlhX2ZnZXRzIHNpZ25pZmljYW50bHkgZmFzdGVyCisgICAgTGludXggICAgICAgICAgICAgICBhIHdhc2gKKyAgICBTb2xhcmlzICAgICAgICAgICAgIGEgd2FzaAorICAgIFRydTY0IFVuaXggICAgICAgICAgZ2V0bGluZV92aWFfZmdldHMgc2lnbmlmaWNhbnRseSBmYXN0ZXIKIAogQ0FVVElPTjogIFRoZSBDIHN0ZCBpc24ndCBjbGVhciBhYm91dCB0aGlzOiAgaW4gdGhvc2UgY2FzZXMgd2hlcmUgZmdldHMKIHdyaXRlcyBzb21ldGhpbmcgaW50byB0aGUgYnVmZmVyLCBjYW4gaXQgd3JpdGUgaW50byBhbnkgcG9zaXRpb24gYmV5b25kIHRoZQpAQCAtMTEzNywxNTEgKzExMzcsMTUxIEBACiAgKi8KICNkZWZpbmUgSU5JVEJVRlNJWkUgMTAwCiAjZGVmaW5lIE1BWEJVRlNJWkUgMzAwCi0JY2hhciogcDsJLyogdGVtcCAqLwotCWNoYXIgYnVmW01BWEJVRlNJWkVdOwotCVB5T2JqZWN0KiB2OwkvKiB0aGUgc3RyaW5nIG9iamVjdCByZXN1bHQgKi8KLQljaGFyKiBwdmZyZWU7CS8qIGFkZHJlc3Mgb2YgbmV4dCBmcmVlIHNsb3QgKi8KLQljaGFyKiBwdmVuZDsgICAgLyogYWRkcmVzcyBvbmUgYmV5b25kIGxhc3QgZnJlZSBzbG90ICovCi0Jc2l6ZV90IG5mcmVlOwkvKiAjIG9mIGZyZWUgYnVmZmVyIHNsb3RzOyBwdmVuZC1wdmZyZWUgKi8KLQlzaXplX3QgdG90YWxfdl9zaXplOyAgLyogdG90YWwgIyBvZiBzbG90cyBpbiBidWZmZXIgKi8KLQlzaXplX3QgaW5jcmVtZW50OwkvKiBhbW91bnQgdG8gaW5jcmVtZW50IHRoZSBidWZmZXIgKi8KLQlzaXplX3QgcHJldl92X3NpemU7CisgICAgY2hhciogcDsgICAgICAgICAgICAvKiB0ZW1wICovCisgICAgY2hhciBidWZbTUFYQlVGU0laRV07CisgICAgUHlPYmplY3QqIHY7ICAgICAgICAvKiB0aGUgc3RyaW5nIG9iamVjdCByZXN1bHQgKi8KKyAgICBjaGFyKiBwdmZyZWU7ICAgICAgIC8qIGFkZHJlc3Mgb2YgbmV4dCBmcmVlIHNsb3QgKi8KKyAgICBjaGFyKiBwdmVuZDsgICAgLyogYWRkcmVzcyBvbmUgYmV5b25kIGxhc3QgZnJlZSBzbG90ICovCisgICAgc2l6ZV90IG5mcmVlOyAgICAgICAvKiAjIG9mIGZyZWUgYnVmZmVyIHNsb3RzOyBwdmVuZC1wdmZyZWUgKi8KKyAgICBzaXplX3QgdG90YWxfdl9zaXplOyAgLyogdG90YWwgIyBvZiBzbG90cyBpbiBidWZmZXIgKi8KKyAgICBzaXplX3QgaW5jcmVtZW50OyAgICAgICAgICAgLyogYW1vdW50IHRvIGluY3JlbWVudCB0aGUgYnVmZmVyICovCisgICAgc2l6ZV90IHByZXZfdl9zaXplOwogCi0JLyogT3B0aW1pemUgZm9yIG5vcm1hbCBjYXNlOiAgYXZvaWQgX1B5U3RyaW5nX1Jlc2l6ZSBpZiBhdCBhbGwKLQkgKiBwb3NzaWJsZSB2aWEgZmlyc3QgcmVhZGluZyBpbnRvIHN0YWNrIGJ1ZmZlciAiYnVmIi4KLQkgKi8KLQl0b3RhbF92X3NpemUgPSBJTklUQlVGU0laRTsJLyogc3RhcnQgc21hbGwgYW5kIHByYXkgKi8KLQlwdmZyZWUgPSBidWY7Ci0JZm9yICg7OykgewotCQlGSUxFX0JFR0lOX0FMTE9XX1RIUkVBRFMoZikKLQkJcHZlbmQgPSBidWYgKyB0b3RhbF92X3NpemU7Ci0JCW5mcmVlID0gcHZlbmQgLSBwdmZyZWU7Ci0JCW1lbXNldChwdmZyZWUsICdcbicsIG5mcmVlKTsKLQkJYXNzZXJ0KG5mcmVlIDwgSU5UX01BWCk7IC8qIFNob3VsZCBiZSBhdG1vc3QgTUFYQlVGU0laRSAqLwotCQlwID0gZmdldHMocHZmcmVlLCAoaW50KW5mcmVlLCBmcCk7Ci0JCUZJTEVfRU5EX0FMTE9XX1RIUkVBRFMoZikKKyAgICAvKiBPcHRpbWl6ZSBmb3Igbm9ybWFsIGNhc2U6ICBhdm9pZCBfUHlTdHJpbmdfUmVzaXplIGlmIGF0IGFsbAorICAgICAqIHBvc3NpYmxlIHZpYSBmaXJzdCByZWFkaW5nIGludG8gc3RhY2sgYnVmZmVyICJidWYiLgorICAgICAqLworICAgIHRvdGFsX3Zfc2l6ZSA9IElOSVRCVUZTSVpFOyAgICAgICAgIC8qIHN0YXJ0IHNtYWxsIGFuZCBwcmF5ICovCisgICAgcHZmcmVlID0gYnVmOworICAgIGZvciAoOzspIHsKKyAgICAgICAgRklMRV9CRUdJTl9BTExPV19USFJFQURTKGYpCisgICAgICAgIHB2ZW5kID0gYnVmICsgdG90YWxfdl9zaXplOworICAgICAgICBuZnJlZSA9IHB2ZW5kIC0gcHZmcmVlOworICAgICAgICBtZW1zZXQocHZmcmVlLCAnXG4nLCBuZnJlZSk7CisgICAgICAgIGFzc2VydChuZnJlZSA8IElOVF9NQVgpOyAvKiBTaG91bGQgYmUgYXRtb3N0IE1BWEJVRlNJWkUgKi8KKyAgICAgICAgcCA9IGZnZXRzKHB2ZnJlZSwgKGludCluZnJlZSwgZnApOworICAgICAgICBGSUxFX0VORF9BTExPV19USFJFQURTKGYpCiAKLQkJaWYgKHAgPT0gTlVMTCkgewotCQkJY2xlYXJlcnIoZnApOwotCQkJaWYgKFB5RXJyX0NoZWNrU2lnbmFscygpKQotCQkJCXJldHVybiBOVUxMOwotCQkJdiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGJ1ZiwgcHZmcmVlIC0gYnVmKTsKLQkJCXJldHVybiB2OwotCQl9Ci0JCS8qIGZnZXRzIHJlYWQgKnNvbWV0aGluZyogKi8KLQkJcCA9IG1lbWNocihwdmZyZWUsICdcbicsIG5mcmVlKTsKLQkJaWYgKHAgIT0gTlVMTCkgewotCQkJLyogRGlkIHRoZSBcbiBjb21lIGZyb20gZmdldHMgb3IgZnJvbSB1cz8KLQkJCSAqIFNpbmNlIGZnZXRzIHN0b3BzIGF0IHRoZSBmaXJzdCBcbiwgYW5kIHRoZW4gd3JpdGVzCi0JCQkgKiBcMCwgaWYgaXQncyBmcm9tIGZnZXRzIGEgXDAgbXVzdCBiZSBuZXh0LiAgQnV0IGlmCi0JCQkgKiB0aGF0J3Mgc28sIGl0IGNvdWxkIG5vdCBoYXZlIGNvbWUgZnJvbSB1cywgc2luY2UKLQkJCSAqIHRoZSBcbidzIHdlIGZpbGxlZCB0aGUgYnVmZmVyIHdpdGggaGF2ZSBvbmx5IG1vcmUKLQkJCSAqIFxuJ3MgdG8gdGhlIHJpZ2h0LgotCQkJICovCi0JCQlpZiAocCsxIDwgcHZlbmQgJiYgKihwKzEpID09ICdcMCcpIHsKLQkJCQkvKiBJdCdzIGZyb20gZmdldHM6ICB3ZSB3aW4hICBJbiBwYXJ0aWN1bGFyLAotCQkJCSAqIHdlIGhhdmVuJ3QgZG9uZSBhbnkgbWFsbG9jcyB5ZXQsIGFuZCBjYW4KLQkJCQkgKiBidWlsZCB0aGUgZmluYWwgcmVzdWx0IG9uIHRoZSBmaXJzdCB0cnkuCi0JCQkJICovCi0JCQkJKytwOwkvKiBpbmNsdWRlIFxuIGZyb20gZmdldHMgKi8KLQkJCX0KLQkJCWVsc2UgewotCQkJCS8qIE11c3QgYmUgZnJvbSB1czogIGZnZXRzIGRpZG4ndCBmaWxsIHRoZQotCQkJCSAqIGJ1ZmZlciBhbmQgZGlkbid0IGZpbmQgYSBuZXdsaW5lLCBzbyBpdAotCQkJCSAqIG11c3QgYmUgdGhlIGxhc3QgYW5kIG5ld2xpbmUtZnJlZSBsaW5lIG9mCi0JCQkJICogdGhlIGZpbGUuCi0JCQkJICovCi0JCQkJYXNzZXJ0KHAgPiBwdmZyZWUgJiYgKihwLTEpID09ICdcMCcpOwotCQkJCS0tcDsJLyogZG9uJ3QgaW5jbHVkZSBcMCBmcm9tIGZnZXRzICovCi0JCQl9Ci0JCQl2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoYnVmLCBwIC0gYnVmKTsKLQkJCXJldHVybiB2OwotCQl9Ci0JCS8qIHl1Y2s6ICBmZ2V0cyBvdmVyd3JvdGUgYWxsIHRoZSBuZXdsaW5lcywgaS5lLiB0aGUgZW50aXJlCi0JCSAqIGJ1ZmZlci4gIFNvIHRoaXMgbGluZSBpc24ndCBvdmVyIHlldCwgb3IgbWF5YmUgaXQgaXMgYnV0Ci0JCSAqIHdlJ3JlIGV4YWN0bHkgYXQgRU9GLiAgSWYgd2UgaGF2ZW4ndCBhbHJlYWR5LCB0cnkgdXNpbmcgdGhlCi0JCSAqIHJlc3Qgb2YgdGhlIHN0YWNrIGJ1ZmZlci4KLQkJICovCi0JCWFzc2VydCgqKHB2ZW5kLTEpID09ICdcMCcpOwotCQlpZiAocHZmcmVlID09IGJ1ZikgewotCQkJcHZmcmVlID0gcHZlbmQgLSAxOwkvKiBvdmVyd3JpdGUgdHJhaWxpbmcgbnVsbCAqLwotCQkJdG90YWxfdl9zaXplID0gTUFYQlVGU0laRTsKLQkJfQotCQllbHNlCi0JCQlicmVhazsKLQl9CisgICAgICAgIGlmIChwID09IE5VTEwpIHsKKyAgICAgICAgICAgIGNsZWFyZXJyKGZwKTsKKyAgICAgICAgICAgIGlmIChQeUVycl9DaGVja1NpZ25hbHMoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIHYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShidWYsIHB2ZnJlZSAtIGJ1Zik7CisgICAgICAgICAgICByZXR1cm4gdjsKKyAgICAgICAgfQorICAgICAgICAvKiBmZ2V0cyByZWFkICpzb21ldGhpbmcqICovCisgICAgICAgIHAgPSBtZW1jaHIocHZmcmVlLCAnXG4nLCBuZnJlZSk7CisgICAgICAgIGlmIChwICE9IE5VTEwpIHsKKyAgICAgICAgICAgIC8qIERpZCB0aGUgXG4gY29tZSBmcm9tIGZnZXRzIG9yIGZyb20gdXM/CisgICAgICAgICAgICAgKiBTaW5jZSBmZ2V0cyBzdG9wcyBhdCB0aGUgZmlyc3QgXG4sIGFuZCB0aGVuIHdyaXRlcworICAgICAgICAgICAgICogXDAsIGlmIGl0J3MgZnJvbSBmZ2V0cyBhIFwwIG11c3QgYmUgbmV4dC4gIEJ1dCBpZgorICAgICAgICAgICAgICogdGhhdCdzIHNvLCBpdCBjb3VsZCBub3QgaGF2ZSBjb21lIGZyb20gdXMsIHNpbmNlCisgICAgICAgICAgICAgKiB0aGUgXG4ncyB3ZSBmaWxsZWQgdGhlIGJ1ZmZlciB3aXRoIGhhdmUgb25seSBtb3JlCisgICAgICAgICAgICAgKiBcbidzIHRvIHRoZSByaWdodC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKHArMSA8IHB2ZW5kICYmICoocCsxKSA9PSAnXDAnKSB7CisgICAgICAgICAgICAgICAgLyogSXQncyBmcm9tIGZnZXRzOiAgd2Ugd2luISAgSW4gcGFydGljdWxhciwKKyAgICAgICAgICAgICAgICAgKiB3ZSBoYXZlbid0IGRvbmUgYW55IG1hbGxvY3MgeWV0LCBhbmQgY2FuCisgICAgICAgICAgICAgICAgICogYnVpbGQgdGhlIGZpbmFsIHJlc3VsdCBvbiB0aGUgZmlyc3QgdHJ5LgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICsrcDsgICAgICAgICAgICAgICAgICAgIC8qIGluY2x1ZGUgXG4gZnJvbSBmZ2V0cyAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgLyogTXVzdCBiZSBmcm9tIHVzOiAgZmdldHMgZGlkbid0IGZpbGwgdGhlCisgICAgICAgICAgICAgICAgICogYnVmZmVyIGFuZCBkaWRuJ3QgZmluZCBhIG5ld2xpbmUsIHNvIGl0CisgICAgICAgICAgICAgICAgICogbXVzdCBiZSB0aGUgbGFzdCBhbmQgbmV3bGluZS1mcmVlIGxpbmUgb2YKKyAgICAgICAgICAgICAgICAgKiB0aGUgZmlsZS4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBhc3NlcnQocCA+IHB2ZnJlZSAmJiAqKHAtMSkgPT0gJ1wwJyk7CisgICAgICAgICAgICAgICAgLS1wOyAgICAgICAgICAgICAgICAgICAgLyogZG9uJ3QgaW5jbHVkZSBcMCBmcm9tIGZnZXRzICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICB2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoYnVmLCBwIC0gYnVmKTsKKyAgICAgICAgICAgIHJldHVybiB2OworICAgICAgICB9CisgICAgICAgIC8qIHl1Y2s6ICBmZ2V0cyBvdmVyd3JvdGUgYWxsIHRoZSBuZXdsaW5lcywgaS5lLiB0aGUgZW50aXJlCisgICAgICAgICAqIGJ1ZmZlci4gIFNvIHRoaXMgbGluZSBpc24ndCBvdmVyIHlldCwgb3IgbWF5YmUgaXQgaXMgYnV0CisgICAgICAgICAqIHdlJ3JlIGV4YWN0bHkgYXQgRU9GLiAgSWYgd2UgaGF2ZW4ndCBhbHJlYWR5LCB0cnkgdXNpbmcgdGhlCisgICAgICAgICAqIHJlc3Qgb2YgdGhlIHN0YWNrIGJ1ZmZlci4KKyAgICAgICAgICovCisgICAgICAgIGFzc2VydCgqKHB2ZW5kLTEpID09ICdcMCcpOworICAgICAgICBpZiAocHZmcmVlID09IGJ1ZikgeworICAgICAgICAgICAgcHZmcmVlID0gcHZlbmQgLSAxOyAgICAgICAgICAgICAgICAgLyogb3ZlcndyaXRlIHRyYWlsaW5nIG51bGwgKi8KKyAgICAgICAgICAgIHRvdGFsX3Zfc2l6ZSA9IE1BWEJVRlNJWkU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQogCi0JLyogVGhlIHN0YWNrIGJ1ZmZlciBpc24ndCBiaWcgZW5vdWdoOyBtYWxsb2MgYSBzdHJpbmcgb2JqZWN0IGFuZCByZWFkCi0JICogaW50byBpdHMgYnVmZmVyLgotCSAqLwotCXRvdGFsX3Zfc2l6ZSA9IE1BWEJVRlNJWkUgPDwgMTsKLQl2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIqKU5VTEwsIChpbnQpdG90YWxfdl9zaXplKTsKLQlpZiAodiA9PSBOVUxMKQotCQlyZXR1cm4gdjsKLQkvKiBjb3B5IG92ZXIgZXZlcnl0aGluZyBleGNlcHQgdGhlIGxhc3QgbnVsbCBieXRlICovCi0JbWVtY3B5KEJVRih2KSwgYnVmLCBNQVhCVUZTSVpFLTEpOwotCXB2ZnJlZSA9IEJVRih2KSArIE1BWEJVRlNJWkUgLSAxOworICAgIC8qIFRoZSBzdGFjayBidWZmZXIgaXNuJ3QgYmlnIGVub3VnaDsgbWFsbG9jIGEgc3RyaW5nIG9iamVjdCBhbmQgcmVhZAorICAgICAqIGludG8gaXRzIGJ1ZmZlci4KKyAgICAgKi8KKyAgICB0b3RhbF92X3NpemUgPSBNQVhCVUZTSVpFIDw8IDE7CisgICAgdiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyKilOVUxMLCAoaW50KXRvdGFsX3Zfc2l6ZSk7CisgICAgaWYgKHYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIHY7CisgICAgLyogY29weSBvdmVyIGV2ZXJ5dGhpbmcgZXhjZXB0IHRoZSBsYXN0IG51bGwgYnl0ZSAqLworICAgIG1lbWNweShCVUYodiksIGJ1ZiwgTUFYQlVGU0laRS0xKTsKKyAgICBwdmZyZWUgPSBCVUYodikgKyBNQVhCVUZTSVpFIC0gMTsKIAotCS8qIEtlZXAgcmVhZGluZyBzdHVmZiBpbnRvIHY7IGlmIGl0IGV2ZXIgZW5kcyBzdWNjZXNzZnVsbHksIGJyZWFrCi0JICogYWZ0ZXIgc2V0dGluZyBwIG9uZSBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgbGluZS4gIFRoZSBjb2RlIGhlcmUgaXMKLQkgKiB2ZXJ5IG11Y2ggbGlrZSB0aGUgY29kZSBhYm92ZSwgZXhjZXB0IHJlYWRzIGludG8gdidzIGJ1ZmZlcjsgc2VlCi0JICogdGhlIGNvZGUgYWJvdmUgZm9yIGRldGFpbGVkIGNvbW1lbnRzIGFib3V0IHRoZSBsb2dpYy4KLQkgKi8KLQlmb3IgKDs7KSB7Ci0JCUZJTEVfQkVHSU5fQUxMT1dfVEhSRUFEUyhmKQotCQlwdmVuZCA9IEJVRih2KSArIHRvdGFsX3Zfc2l6ZTsKLQkJbmZyZWUgPSBwdmVuZCAtIHB2ZnJlZTsKLQkJbWVtc2V0KHB2ZnJlZSwgJ1xuJywgbmZyZWUpOwotCQlhc3NlcnQobmZyZWUgPCBJTlRfTUFYKTsKLQkJcCA9IGZnZXRzKHB2ZnJlZSwgKGludCluZnJlZSwgZnApOwotCQlGSUxFX0VORF9BTExPV19USFJFQURTKGYpCisgICAgLyogS2VlcCByZWFkaW5nIHN0dWZmIGludG8gdjsgaWYgaXQgZXZlciBlbmRzIHN1Y2Nlc3NmdWxseSwgYnJlYWsKKyAgICAgKiBhZnRlciBzZXR0aW5nIHAgb25lIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBsaW5lLiAgVGhlIGNvZGUgaGVyZSBpcworICAgICAqIHZlcnkgbXVjaCBsaWtlIHRoZSBjb2RlIGFib3ZlLCBleGNlcHQgcmVhZHMgaW50byB2J3MgYnVmZmVyOyBzZWUKKyAgICAgKiB0aGUgY29kZSBhYm92ZSBmb3IgZGV0YWlsZWQgY29tbWVudHMgYWJvdXQgdGhlIGxvZ2ljLgorICAgICAqLworICAgIGZvciAoOzspIHsKKyAgICAgICAgRklMRV9CRUdJTl9BTExPV19USFJFQURTKGYpCisgICAgICAgIHB2ZW5kID0gQlVGKHYpICsgdG90YWxfdl9zaXplOworICAgICAgICBuZnJlZSA9IHB2ZW5kIC0gcHZmcmVlOworICAgICAgICBtZW1zZXQocHZmcmVlLCAnXG4nLCBuZnJlZSk7CisgICAgICAgIGFzc2VydChuZnJlZSA8IElOVF9NQVgpOworICAgICAgICBwID0gZmdldHMocHZmcmVlLCAoaW50KW5mcmVlLCBmcCk7CisgICAgICAgIEZJTEVfRU5EX0FMTE9XX1RIUkVBRFMoZikKIAotCQlpZiAocCA9PSBOVUxMKSB7Ci0JCQljbGVhcmVycihmcCk7Ci0JCQlpZiAoUHlFcnJfQ2hlY2tTaWduYWxzKCkpIHsKLQkJCQlQeV9ERUNSRUYodik7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCQlwID0gcHZmcmVlOwotCQkJYnJlYWs7Ci0JCX0KLQkJcCA9IG1lbWNocihwdmZyZWUsICdcbicsIG5mcmVlKTsKLQkJaWYgKHAgIT0gTlVMTCkgewotCQkJaWYgKHArMSA8IHB2ZW5kICYmICoocCsxKSA9PSAnXDAnKSB7Ci0JCQkJLyogXG4gY2FtZSBmcm9tIGZnZXRzICovCi0JCQkJKytwOwotCQkJCWJyZWFrOwotCQkJfQotCQkJLyogXG4gY2FtZSBmcm9tIHVzOyBsYXN0IGxpbmUgb2YgZmlsZSwgbm8gbmV3bGluZSAqLwotCQkJYXNzZXJ0KHAgPiBwdmZyZWUgJiYgKihwLTEpID09ICdcMCcpOwotCQkJLS1wOwotCQkJYnJlYWs7Ci0JCX0KLQkJLyogZXhwYW5kIGJ1ZmZlciBhbmQgdHJ5IGFnYWluICovCi0JCWFzc2VydCgqKHB2ZW5kLTEpID09ICdcMCcpOwotCQlpbmNyZW1lbnQgPSB0b3RhbF92X3NpemUgPj4gMjsJLyogbWlsZCBleHBvbmVudGlhbCBncm93dGggKi8KLQkJcHJldl92X3NpemUgPSB0b3RhbF92X3NpemU7Ci0JCXRvdGFsX3Zfc2l6ZSArPSBpbmNyZW1lbnQ7Ci0JCS8qIGNoZWNrIGZvciBvdmVyZmxvdyAqLwotCQlpZiAodG90YWxfdl9zaXplIDw9IHByZXZfdl9zaXplIHx8Ci0JCSAgICB0b3RhbF92X3NpemUgPiBQWV9TU0laRV9UX01BWCkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0JCQkgICAgImxpbmUgaXMgbG9uZ2VyIHRoYW4gYSBQeXRob24gc3RyaW5nIGNhbiBob2xkIik7Ci0JCQlQeV9ERUNSRUYodik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmdiwgKGludCl0b3RhbF92X3NpemUpIDwgMCkKLQkJCXJldHVybiBOVUxMOwotCQkvKiBvdmVyd3JpdGUgdGhlIHRyYWlsaW5nIG51bGwgYnl0ZSAqLwotCQlwdmZyZWUgPSBCVUYodikgKyAocHJldl92X3NpemUgLSAxKTsKLQl9Ci0JaWYgKEJVRih2KSArIHRvdGFsX3Zfc2l6ZSAhPSBwKQotCQlfUHlTdHJpbmdfUmVzaXplKCZ2LCBwIC0gQlVGKHYpKTsKLQlyZXR1cm4gdjsKKyAgICAgICAgaWYgKHAgPT0gTlVMTCkgeworICAgICAgICAgICAgY2xlYXJlcnIoZnApOworICAgICAgICAgICAgaWYgKFB5RXJyX0NoZWNrU2lnbmFscygpKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcCA9IHB2ZnJlZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHAgPSBtZW1jaHIocHZmcmVlLCAnXG4nLCBuZnJlZSk7CisgICAgICAgIGlmIChwICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGlmIChwKzEgPCBwdmVuZCAmJiAqKHArMSkgPT0gJ1wwJykgeworICAgICAgICAgICAgICAgIC8qIFxuIGNhbWUgZnJvbSBmZ2V0cyAqLworICAgICAgICAgICAgICAgICsrcDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIFxuIGNhbWUgZnJvbSB1czsgbGFzdCBsaW5lIG9mIGZpbGUsIG5vIG5ld2xpbmUgKi8KKyAgICAgICAgICAgIGFzc2VydChwID4gcHZmcmVlICYmICoocC0xKSA9PSAnXDAnKTsKKyAgICAgICAgICAgIC0tcDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIC8qIGV4cGFuZCBidWZmZXIgYW5kIHRyeSBhZ2FpbiAqLworICAgICAgICBhc3NlcnQoKihwdmVuZC0xKSA9PSAnXDAnKTsKKyAgICAgICAgaW5jcmVtZW50ID0gdG90YWxfdl9zaXplID4+IDI7ICAgICAgICAgIC8qIG1pbGQgZXhwb25lbnRpYWwgZ3Jvd3RoICovCisgICAgICAgIHByZXZfdl9zaXplID0gdG90YWxfdl9zaXplOworICAgICAgICB0b3RhbF92X3NpemUgKz0gaW5jcmVtZW50OworICAgICAgICAvKiBjaGVjayBmb3Igb3ZlcmZsb3cgKi8KKyAgICAgICAgaWYgKHRvdGFsX3Zfc2l6ZSA8PSBwcmV2X3Zfc2l6ZSB8fAorICAgICAgICAgICAgdG90YWxfdl9zaXplID4gUFlfU1NJWkVfVF9NQVgpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICJsaW5lIGlzIGxvbmdlciB0aGFuIGEgUHl0aG9uIHN0cmluZyBjYW4gaG9sZCIpOworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKF9QeVN0cmluZ19SZXNpemUoJnYsIChpbnQpdG90YWxfdl9zaXplKSA8IDApCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgLyogb3ZlcndyaXRlIHRoZSB0cmFpbGluZyBudWxsIGJ5dGUgKi8KKyAgICAgICAgcHZmcmVlID0gQlVGKHYpICsgKHByZXZfdl9zaXplIC0gMSk7CisgICAgfQorICAgIGlmIChCVUYodikgKyB0b3RhbF92X3NpemUgIT0gcCkKKyAgICAgICAgX1B5U3RyaW5nX1Jlc2l6ZSgmdiwgcCAtIEJVRih2KSk7CisgICAgcmV0dXJuIHY7CiAjdW5kZWYgSU5JVEJVRlNJWkUKICN1bmRlZiBNQVhCVUZTSVpFCiB9Ci0jZW5kaWYJLyogaWZkZWYgVVNFX0ZHRVRTX0lOX0dFVExJTkUgKi8KKyNlbmRpZiAgLyogaWZkZWYgVVNFX0ZHRVRTX0lOX0dFVExJTkUgKi8KIAogLyogSW50ZXJuYWwgcm91dGluZSB0byBnZXQgYSBsaW5lLgogICAgU2l6ZSBhcmd1bWVudCBpbnRlcnByZXRhdGlvbjoKQEAgLTEyOTIsMTA1ICsxMjkyLDEwNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdldF9saW5lKFB5RmlsZU9iamVjdCAqZiwgaW50IG4pCiB7Ci0JRklMRSAqZnAgPSBmLT5mX2ZwOwotCWludCBjOwotCWNoYXIgKmJ1ZiwgKmVuZDsKLQlzaXplX3QgdG90YWxfdl9zaXplOwkvKiB0b3RhbCAjIG9mIHNsb3RzIGluIGJ1ZmZlciAqLwotCXNpemVfdCB1c2VkX3Zfc2l6ZTsJLyogIyB1c2VkIHNsb3RzIGluIGJ1ZmZlciAqLwotCXNpemVfdCBpbmNyZW1lbnQ7ICAgICAgIC8qIGFtb3VudCB0byBpbmNyZW1lbnQgdGhlIGJ1ZmZlciAqLwotCVB5T2JqZWN0ICp2OwotCWludCBuZXdsaW5ldHlwZXMgPSBmLT5mX25ld2xpbmV0eXBlczsKLQlpbnQgc2tpcG5leHRsZiA9IGYtPmZfc2tpcG5leHRsZjsKLQlpbnQgdW5pdl9uZXdsaW5lID0gZi0+Zl91bml2X25ld2xpbmU7CisgICAgRklMRSAqZnAgPSBmLT5mX2ZwOworICAgIGludCBjOworICAgIGNoYXIgKmJ1ZiwgKmVuZDsKKyAgICBzaXplX3QgdG90YWxfdl9zaXplOyAgICAgICAgLyogdG90YWwgIyBvZiBzbG90cyBpbiBidWZmZXIgKi8KKyAgICBzaXplX3QgdXNlZF92X3NpemU7ICAgICAgICAgLyogIyB1c2VkIHNsb3RzIGluIGJ1ZmZlciAqLworICAgIHNpemVfdCBpbmNyZW1lbnQ7ICAgICAgIC8qIGFtb3VudCB0byBpbmNyZW1lbnQgdGhlIGJ1ZmZlciAqLworICAgIFB5T2JqZWN0ICp2OworICAgIGludCBuZXdsaW5ldHlwZXMgPSBmLT5mX25ld2xpbmV0eXBlczsKKyAgICBpbnQgc2tpcG5leHRsZiA9IGYtPmZfc2tpcG5leHRsZjsKKyAgICBpbnQgdW5pdl9uZXdsaW5lID0gZi0+Zl91bml2X25ld2xpbmU7CiAKICNpZiBkZWZpbmVkKFVTRV9GR0VUU19JTl9HRVRMSU5FKQotCWlmIChuIDw9IDAgJiYgIXVuaXZfbmV3bGluZSApCi0JCXJldHVybiBnZXRsaW5lX3ZpYV9mZ2V0cyhmLCBmcCk7CisgICAgaWYgKG4gPD0gMCAmJiAhdW5pdl9uZXdsaW5lICkKKyAgICAgICAgcmV0dXJuIGdldGxpbmVfdmlhX2ZnZXRzKGYsIGZwKTsKICNlbmRpZgotCXRvdGFsX3Zfc2l6ZSA9IG4gPiAwID8gbiA6IDEwMDsKLQl2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilOVUxMLCB0b3RhbF92X3NpemUpOwotCWlmICh2ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWJ1ZiA9IEJVRih2KTsKLQllbmQgPSBidWYgKyB0b3RhbF92X3NpemU7CisgICAgdG90YWxfdl9zaXplID0gbiA+IDAgPyBuIDogMTAwOworICAgIHYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKU5VTEwsIHRvdGFsX3Zfc2l6ZSk7CisgICAgaWYgKHYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYnVmID0gQlVGKHYpOworICAgIGVuZCA9IGJ1ZiArIHRvdGFsX3Zfc2l6ZTsKIAotCWZvciAoOzspIHsKLQkJRklMRV9CRUdJTl9BTExPV19USFJFQURTKGYpCi0JCUZMT0NLRklMRShmcCk7Ci0JCWlmICh1bml2X25ld2xpbmUpIHsKLQkJCWMgPSAneCc7IC8qIFNodXQgdXAgZ2NjIHdhcm5pbmcgKi8KLQkJCXdoaWxlICggYnVmICE9IGVuZCAmJiAoYyA9IEdFVEMoZnApKSAhPSBFT0YgKSB7Ci0JCQkJaWYgKHNraXBuZXh0bGYgKSB7Ci0JCQkJCXNraXBuZXh0bGYgPSAwOwotCQkJCQlpZiAoYyA9PSAnXG4nKSB7Ci0JCQkJCQkvKiBTZWVpbmcgYSBcbiBoZXJlIHdpdGgKLQkJCQkJCSAqIHNraXBuZXh0bGYgdHJ1ZSBtZWFucyB3ZQotCQkJCQkJICogc2F3IGEgXHIgYmVmb3JlLgotCQkJCQkJICovCi0JCQkJCQluZXdsaW5ldHlwZXMgfD0gTkVXTElORV9DUkxGOwotCQkJCQkJYyA9IEdFVEMoZnApOwotCQkJCQkJaWYgKGMgPT0gRU9GKSBicmVhazsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCW5ld2xpbmV0eXBlcyB8PSBORVdMSU5FX0NSOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChjID09ICdccicpIHsKLQkJCQkJc2tpcG5leHRsZiA9IDE7Ci0JCQkJCWMgPSAnXG4nOwotCQkJCX0gZWxzZSBpZiAoIGMgPT0gJ1xuJykKLQkJCQkJbmV3bGluZXR5cGVzIHw9IE5FV0xJTkVfTEY7Ci0JCQkJKmJ1ZisrID0gYzsKLQkJCQlpZiAoYyA9PSAnXG4nKSBicmVhazsKLQkJCX0KLQkJCWlmICggYyA9PSBFT0YgJiYgc2tpcG5leHRsZiApCi0JCQkJbmV3bGluZXR5cGVzIHw9IE5FV0xJTkVfQ1I7Ci0JCX0gZWxzZSAvKiBJZiBub3QgdW5pdmVyc2FsIG5ld2xpbmVzIHVzZSB0aGUgbm9ybWFsIGxvb3AgKi8KLQkJd2hpbGUgKChjID0gR0VUQyhmcCkpICE9IEVPRiAmJgotCQkgICAgICAgKCpidWYrKyA9IGMpICE9ICdcbicgJiYKLQkJCWJ1ZiAhPSBlbmQpCi0JCQk7Ci0JCUZVTkxPQ0tGSUxFKGZwKTsKLQkJRklMRV9FTkRfQUxMT1dfVEhSRUFEUyhmKQotCQlmLT5mX25ld2xpbmV0eXBlcyA9IG5ld2xpbmV0eXBlczsKLQkJZi0+Zl9za2lwbmV4dGxmID0gc2tpcG5leHRsZjsKLQkJaWYgKGMgPT0gJ1xuJykKLQkJCWJyZWFrOwotCQlpZiAoYyA9PSBFT0YpIHsKLQkJCWlmIChmZXJyb3IoZnApKSB7Ci0JCQkJUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOwotCQkJCWNsZWFyZXJyKGZwKTsKLQkJCQlQeV9ERUNSRUYodik7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCQljbGVhcmVycihmcCk7Ci0JCQlpZiAoUHlFcnJfQ2hlY2tTaWduYWxzKCkpIHsKLQkJCQlQeV9ERUNSRUYodik7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCQkvKiBNdXN0IGJlIGJlY2F1c2UgYnVmID09IGVuZCAqLwotCQlpZiAobiA+IDApCi0JCQlicmVhazsKLQkJdXNlZF92X3NpemUgPSB0b3RhbF92X3NpemU7Ci0JCWluY3JlbWVudCA9IHRvdGFsX3Zfc2l6ZSA+PiAyOyAvKiBtaWxkIGV4cG9uZW50aWFsIGdyb3d0aCAqLwotCQl0b3RhbF92X3NpemUgKz0gaW5jcmVtZW50OwotCQlpZiAodG90YWxfdl9zaXplID4gUFlfU1NJWkVfVF9NQVgpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJICAgICJsaW5lIGlzIGxvbmdlciB0aGFuIGEgUHl0aG9uIHN0cmluZyBjYW4gaG9sZCIpOwotCQkJUHlfREVDUkVGKHYpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJaWYgKF9QeVN0cmluZ19SZXNpemUoJnYsIHRvdGFsX3Zfc2l6ZSkgPCAwKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWJ1ZiA9IEJVRih2KSArIHVzZWRfdl9zaXplOwotCQllbmQgPSBCVUYodikgKyB0b3RhbF92X3NpemU7Ci0JfQorICAgIGZvciAoOzspIHsKKyAgICAgICAgRklMRV9CRUdJTl9BTExPV19USFJFQURTKGYpCisgICAgICAgIEZMT0NLRklMRShmcCk7CisgICAgICAgIGlmICh1bml2X25ld2xpbmUpIHsKKyAgICAgICAgICAgIGMgPSAneCc7IC8qIFNodXQgdXAgZ2NjIHdhcm5pbmcgKi8KKyAgICAgICAgICAgIHdoaWxlICggYnVmICE9IGVuZCAmJiAoYyA9IEdFVEMoZnApKSAhPSBFT0YgKSB7CisgICAgICAgICAgICAgICAgaWYgKHNraXBuZXh0bGYgKSB7CisgICAgICAgICAgICAgICAgICAgIHNraXBuZXh0bGYgPSAwOworICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PSAnXG4nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBTZWVpbmcgYSBcbiBoZXJlIHdpdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIHNraXBuZXh0bGYgdHJ1ZSBtZWFucyB3ZQorICAgICAgICAgICAgICAgICAgICAgICAgICogc2F3IGEgXHIgYmVmb3JlLgorICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdsaW5ldHlwZXMgfD0gTkVXTElORV9DUkxGOworICAgICAgICAgICAgICAgICAgICAgICAgYyA9IEdFVEMoZnApOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMgPT0gRU9GKSBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld2xpbmV0eXBlcyB8PSBORVdMSU5FX0NSOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChjID09ICdccicpIHsKKyAgICAgICAgICAgICAgICAgICAgc2tpcG5leHRsZiA9IDE7CisgICAgICAgICAgICAgICAgICAgIGMgPSAnXG4nOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIGMgPT0gJ1xuJykKKyAgICAgICAgICAgICAgICAgICAgbmV3bGluZXR5cGVzIHw9IE5FV0xJTkVfTEY7CisgICAgICAgICAgICAgICAgKmJ1ZisrID0gYzsKKyAgICAgICAgICAgICAgICBpZiAoYyA9PSAnXG4nKSBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggYyA9PSBFT0YgJiYgc2tpcG5leHRsZiApCisgICAgICAgICAgICAgICAgbmV3bGluZXR5cGVzIHw9IE5FV0xJTkVfQ1I7CisgICAgICAgIH0gZWxzZSAvKiBJZiBub3QgdW5pdmVyc2FsIG5ld2xpbmVzIHVzZSB0aGUgbm9ybWFsIGxvb3AgKi8KKyAgICAgICAgd2hpbGUgKChjID0gR0VUQyhmcCkpICE9IEVPRiAmJgorICAgICAgICAgICAgICAgKCpidWYrKyA9IGMpICE9ICdcbicgJiYKKyAgICAgICAgICAgIGJ1ZiAhPSBlbmQpCisgICAgICAgICAgICA7CisgICAgICAgIEZVTkxPQ0tGSUxFKGZwKTsKKyAgICAgICAgRklMRV9FTkRfQUxMT1dfVEhSRUFEUyhmKQorICAgICAgICBmLT5mX25ld2xpbmV0eXBlcyA9IG5ld2xpbmV0eXBlczsKKyAgICAgICAgZi0+Zl9za2lwbmV4dGxmID0gc2tpcG5leHRsZjsKKyAgICAgICAgaWYgKGMgPT0gJ1xuJykKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBpZiAoYyA9PSBFT0YpIHsKKyAgICAgICAgICAgIGlmIChmZXJyb3IoZnApKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOworICAgICAgICAgICAgICAgIGNsZWFyZXJyKGZwKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjbGVhcmVycihmcCk7CisgICAgICAgICAgICBpZiAoUHlFcnJfQ2hlY2tTaWduYWxzKCkpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAvKiBNdXN0IGJlIGJlY2F1c2UgYnVmID09IGVuZCAqLworICAgICAgICBpZiAobiA+IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgdXNlZF92X3NpemUgPSB0b3RhbF92X3NpemU7CisgICAgICAgIGluY3JlbWVudCA9IHRvdGFsX3Zfc2l6ZSA+PiAyOyAvKiBtaWxkIGV4cG9uZW50aWFsIGdyb3d0aCAqLworICAgICAgICB0b3RhbF92X3NpemUgKz0gaW5jcmVtZW50OworICAgICAgICBpZiAodG90YWxfdl9zaXplID4gUFlfU1NJWkVfVF9NQVgpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICJsaW5lIGlzIGxvbmdlciB0aGFuIGEgUHl0aG9uIHN0cmluZyBjYW4gaG9sZCIpOworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKF9QeVN0cmluZ19SZXNpemUoJnYsIHRvdGFsX3Zfc2l6ZSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGJ1ZiA9IEJVRih2KSArIHVzZWRfdl9zaXplOworICAgICAgICBlbmQgPSBCVUYodikgKyB0b3RhbF92X3NpemU7CisgICAgfQogCi0JdXNlZF92X3NpemUgPSBidWYgLSBCVUYodik7Ci0JaWYgKHVzZWRfdl9zaXplICE9IHRvdGFsX3Zfc2l6ZSkKLQkJX1B5U3RyaW5nX1Jlc2l6ZSgmdiwgdXNlZF92X3NpemUpOwotCXJldHVybiB2OworICAgIHVzZWRfdl9zaXplID0gYnVmIC0gQlVGKHYpOworICAgIGlmICh1c2VkX3Zfc2l6ZSAhPSB0b3RhbF92X3NpemUpCisgICAgICAgIF9QeVN0cmluZ19SZXNpemUoJnYsIHVzZWRfdl9zaXplKTsKKyAgICByZXR1cm4gdjsKIH0KIAogLyogRXh0ZXJuYWwgQyBpbnRlcmZhY2UgKi8KQEAgLTEzOTgsOTYgKzEzOTgsOTYgQEAKIFB5T2JqZWN0ICoKIFB5RmlsZV9HZXRMaW5lKFB5T2JqZWN0ICpmLCBpbnQgbikKIHsKLQlQeU9iamVjdCAqcmVzdWx0OworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CiAKLQlpZiAoZiA9PSBOVUxMKSB7Ci0JCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKGYgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaWYgKFB5RmlsZV9DaGVjayhmKSkgewotCQlQeUZpbGVPYmplY3QgKmZvID0gKFB5RmlsZU9iamVjdCAqKWY7Ci0JCWlmIChmby0+Zl9mcCA9PSBOVUxMKQotCQkJcmV0dXJuIGVycl9jbG9zZWQoKTsKLQkJaWYgKCFmby0+cmVhZGFibGUpCi0JCQlyZXR1cm4gZXJyX21vZGUoInJlYWRpbmciKTsKLQkJLyogcmVmdXNlIHRvIG1peCB3aXRoIGYubmV4dCgpICovCi0JCWlmIChmby0+Zl9idWYgIT0gTlVMTCAmJgotCQkgICAgKGZvLT5mX2J1ZmVuZCAtIGZvLT5mX2J1ZnB0cikgPiAwICYmCi0JCSAgICBmby0+Zl9idWZbMF0gIT0gJ1wwJykKLQkJCXJldHVybiBlcnJfaXRlcmJ1ZmZlcmVkKCk7Ci0JCXJlc3VsdCA9IGdldF9saW5lKGZvLCBuKTsKLQl9Ci0JZWxzZSB7Ci0JCVB5T2JqZWN0ICpyZWFkZXI7Ci0JCVB5T2JqZWN0ICphcmdzOworICAgIGlmIChQeUZpbGVfQ2hlY2soZikpIHsKKyAgICAgICAgUHlGaWxlT2JqZWN0ICpmbyA9IChQeUZpbGVPYmplY3QgKilmOworICAgICAgICBpZiAoZm8tPmZfZnAgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBlcnJfY2xvc2VkKCk7CisgICAgICAgIGlmICghZm8tPnJlYWRhYmxlKQorICAgICAgICAgICAgcmV0dXJuIGVycl9tb2RlKCJyZWFkaW5nIik7CisgICAgICAgIC8qIHJlZnVzZSB0byBtaXggd2l0aCBmLm5leHQoKSAqLworICAgICAgICBpZiAoZm8tPmZfYnVmICE9IE5VTEwgJiYKKyAgICAgICAgICAgIChmby0+Zl9idWZlbmQgLSBmby0+Zl9idWZwdHIpID4gMCAmJgorICAgICAgICAgICAgZm8tPmZfYnVmWzBdICE9ICdcMCcpCisgICAgICAgICAgICByZXR1cm4gZXJyX2l0ZXJidWZmZXJlZCgpOworICAgICAgICByZXN1bHQgPSBnZXRfbGluZShmbywgbik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeU9iamVjdCAqcmVhZGVyOworICAgICAgICBQeU9iamVjdCAqYXJnczsKIAotCQlyZWFkZXIgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKGYsICJyZWFkbGluZSIpOwotCQlpZiAocmVhZGVyID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQkJaWYgKG4gPD0gMCkKLQkJCWFyZ3MgPSBQeVR1cGxlX05ldygwKTsKLQkJZWxzZQotCQkJYXJncyA9IFB5X0J1aWxkVmFsdWUoIihpKSIsIG4pOwotCQlpZiAoYXJncyA9PSBOVUxMKSB7Ci0JCQlQeV9ERUNSRUYocmVhZGVyKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCXJlc3VsdCA9IFB5RXZhbF9DYWxsT2JqZWN0KHJlYWRlciwgYXJncyk7Ci0JCVB5X0RFQ1JFRihyZWFkZXIpOwotCQlQeV9ERUNSRUYoYXJncyk7Ci0JCWlmIChyZXN1bHQgIT0gTlVMTCAmJiAhUHlTdHJpbmdfQ2hlY2socmVzdWx0KSAmJgotCQkgICAgIVB5VW5pY29kZV9DaGVjayhyZXN1bHQpKSB7Ci0JCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJCXJlc3VsdCA9IE5VTEw7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSAgICJvYmplY3QucmVhZGxpbmUoKSByZXR1cm5lZCBub24tc3RyaW5nIik7Ci0JCX0KLQl9CisgICAgICAgIHJlYWRlciA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoZiwgInJlYWRsaW5lIik7CisgICAgICAgIGlmIChyZWFkZXIgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBpZiAobiA8PSAwKQorICAgICAgICAgICAgYXJncyA9IFB5VHVwbGVfTmV3KDApOworICAgICAgICBlbHNlCisgICAgICAgICAgICBhcmdzID0gUHlfQnVpbGRWYWx1ZSgiKGkpIiwgbik7CisgICAgICAgIGlmIChhcmdzID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihyZWFkZXIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0ID0gUHlFdmFsX0NhbGxPYmplY3QocmVhZGVyLCBhcmdzKTsKKyAgICAgICAgUHlfREVDUkVGKHJlYWRlcik7CisgICAgICAgIFB5X0RFQ1JFRihhcmdzKTsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBOVUxMICYmICFQeVN0cmluZ19DaGVjayhyZXN1bHQpICYmCisgICAgICAgICAgICAhUHlVbmljb2RlX0NoZWNrKHJlc3VsdCkpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICAgICAgcmVzdWx0ID0gTlVMTDsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICJvYmplY3QucmVhZGxpbmUoKSByZXR1cm5lZCBub24tc3RyaW5nIik7CisgICAgICAgIH0KKyAgICB9CiAKLQlpZiAobiA8IDAgJiYgcmVzdWx0ICE9IE5VTEwgJiYgUHlTdHJpbmdfQ2hlY2socmVzdWx0KSkgewotCQljaGFyICpzID0gUHlTdHJpbmdfQVNfU1RSSU5HKHJlc3VsdCk7Ci0JCVB5X3NzaXplX3QgbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUocmVzdWx0KTsKLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJCXJlc3VsdCA9IE5VTEw7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfRU9GRXJyb3IsCi0JCQkJCSJFT0Ygd2hlbiByZWFkaW5nIGEgbGluZSIpOwotCQl9Ci0JCWVsc2UgaWYgKHNbbGVuLTFdID09ICdcbicpIHsKLQkJCWlmIChyZXN1bHQtPm9iX3JlZmNudCA9PSAxKQotCQkJCV9QeVN0cmluZ19SZXNpemUoJnJlc3VsdCwgbGVuLTEpOwotCQkJZWxzZSB7Ci0JCQkJUHlPYmplY3QgKnY7Ci0JCQkJdiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHMsIGxlbi0xKTsKLQkJCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJCQlyZXN1bHQgPSB2OwotCQkJfQotCQl9Ci0JfQorICAgIGlmIChuIDwgMCAmJiByZXN1bHQgIT0gTlVMTCAmJiBQeVN0cmluZ19DaGVjayhyZXN1bHQpKSB7CisgICAgICAgIGNoYXIgKnMgPSBQeVN0cmluZ19BU19TVFJJTkcocmVzdWx0KTsKKyAgICAgICAgUHlfc3NpemVfdCBsZW4gPSBQeVN0cmluZ19HRVRfU0laRShyZXN1bHQpOworICAgICAgICBpZiAobGVuID09IDApIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICAgICAgcmVzdWx0ID0gTlVMTDsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19FT0ZFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRU9GIHdoZW4gcmVhZGluZyBhIGxpbmUiKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChzW2xlbi0xXSA9PSAnXG4nKSB7CisgICAgICAgICAgICBpZiAocmVzdWx0LT5vYl9yZWZjbnQgPT0gMSkKKyAgICAgICAgICAgICAgICBfUHlTdHJpbmdfUmVzaXplKCZyZXN1bHQsIGxlbi0xKTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIFB5T2JqZWN0ICp2OworICAgICAgICAgICAgICAgIHYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzLCBsZW4tMSk7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gdjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JaWYgKG4gPCAwICYmIHJlc3VsdCAhPSBOVUxMICYmIFB5VW5pY29kZV9DaGVjayhyZXN1bHQpKSB7Ci0JCVB5X1VOSUNPREUgKnMgPSBQeVVuaWNvZGVfQVNfVU5JQ09ERShyZXN1bHQpOwotCQlQeV9zc2l6ZV90IGxlbiA9IFB5VW5pY29kZV9HRVRfU0laRShyZXN1bHQpOwotCQlpZiAobGVuID09IDApIHsKLQkJCVB5X0RFQ1JFRihyZXN1bHQpOwotCQkJcmVzdWx0ID0gTlVMTDsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19FT0ZFcnJvciwKLQkJCQkJIkVPRiB3aGVuIHJlYWRpbmcgYSBsaW5lIik7Ci0JCX0KLQkJZWxzZSBpZiAoc1tsZW4tMV0gPT0gJ1xuJykgewotCQkJaWYgKHJlc3VsdC0+b2JfcmVmY250ID09IDEpCi0JCQkJUHlVbmljb2RlX1Jlc2l6ZSgmcmVzdWx0LCBsZW4tMSk7Ci0JCQllbHNlIHsKLQkJCQlQeU9iamVjdCAqdjsKLQkJCQl2ID0gUHlVbmljb2RlX0Zyb21Vbmljb2RlKHMsIGxlbi0xKTsKLQkJCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJCQlyZXN1bHQgPSB2OwotCQkJfQotCQl9Ci0JfQorICAgIGlmIChuIDwgMCAmJiByZXN1bHQgIT0gTlVMTCAmJiBQeVVuaWNvZGVfQ2hlY2socmVzdWx0KSkgeworICAgICAgICBQeV9VTklDT0RFICpzID0gUHlVbmljb2RlX0FTX1VOSUNPREUocmVzdWx0KTsKKyAgICAgICAgUHlfc3NpemVfdCBsZW4gPSBQeVVuaWNvZGVfR0VUX1NJWkUocmVzdWx0KTsKKyAgICAgICAgaWYgKGxlbiA9PSAwKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgICAgIHJlc3VsdCA9IE5VTEw7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfRU9GRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVPRiB3aGVuIHJlYWRpbmcgYSBsaW5lIik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoc1tsZW4tMV0gPT0gJ1xuJykgeworICAgICAgICAgICAgaWYgKHJlc3VsdC0+b2JfcmVmY250ID09IDEpCisgICAgICAgICAgICAgICAgUHlVbmljb2RlX1Jlc2l6ZSgmcmVzdWx0LCBsZW4tMSk7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBQeU9iamVjdCAqdjsKKyAgICAgICAgICAgICAgICB2ID0gUHlVbmljb2RlX0Zyb21Vbmljb2RlKHMsIGxlbi0xKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSB2OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogI2VuZGlmCi0JcmV0dXJuIHJlc3VsdDsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiAvKiBQeXRob24gbWV0aG9kICovCkBAIC0xNDk1LDM0MSArMTQ5NSwzNDEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBmaWxlX3JlYWRsaW5lKFB5RmlsZU9iamVjdCAqZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IG4gPSAtMTsKKyAgICBpbnQgbiA9IC0xOwogCi0JaWYgKGYtPmZfZnAgPT0gTlVMTCkKLQkJcmV0dXJuIGVycl9jbG9zZWQoKTsKLQlpZiAoIWYtPnJlYWRhYmxlKQotCQlyZXR1cm4gZXJyX21vZGUoInJlYWRpbmciKTsKLQkvKiByZWZ1c2UgdG8gbWl4IHdpdGggZi5uZXh0KCkgKi8KLQlpZiAoZi0+Zl9idWYgIT0gTlVMTCAmJgotCSAgICAoZi0+Zl9idWZlbmQgLSBmLT5mX2J1ZnB0cikgPiAwICYmCi0JICAgIGYtPmZfYnVmWzBdICE9ICdcMCcpCi0JCXJldHVybiBlcnJfaXRlcmJ1ZmZlcmVkKCk7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8aTpyZWFkbGluZSIsICZuKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKG4gPT0gMCkKLQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoIiIpOwotCWlmIChuIDwgMCkKLQkJbiA9IDA7Ci0JcmV0dXJuIGdldF9saW5lKGYsIG4pOworICAgIGlmIChmLT5mX2ZwID09IE5VTEwpCisgICAgICAgIHJldHVybiBlcnJfY2xvc2VkKCk7CisgICAgaWYgKCFmLT5yZWFkYWJsZSkKKyAgICAgICAgcmV0dXJuIGVycl9tb2RlKCJyZWFkaW5nIik7CisgICAgLyogcmVmdXNlIHRvIG1peCB3aXRoIGYubmV4dCgpICovCisgICAgaWYgKGYtPmZfYnVmICE9IE5VTEwgJiYKKyAgICAgICAgKGYtPmZfYnVmZW5kIC0gZi0+Zl9idWZwdHIpID4gMCAmJgorICAgICAgICBmLT5mX2J1ZlswXSAhPSAnXDAnKQorICAgICAgICByZXR1cm4gZXJyX2l0ZXJidWZmZXJlZCgpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifGk6cmVhZGxpbmUiLCAmbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChuID09IDApCisgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKCIiKTsKKyAgICBpZiAobiA8IDApCisgICAgICAgIG4gPSAwOworICAgIHJldHVybiBnZXRfbGluZShmLCBuKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZpbGVfcmVhZGxpbmVzKFB5RmlsZU9iamVjdCAqZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBzaXplaGludCA9IDA7Ci0JUHlPYmplY3QgKmxpc3QgPSBOVUxMOwotCVB5T2JqZWN0ICpsaW5lOwotCWNoYXIgc21hbGxfYnVmZmVyW1NNQUxMQ0hVTktdOwotCWNoYXIgKmJ1ZmZlciA9IHNtYWxsX2J1ZmZlcjsKLQlzaXplX3QgYnVmZmVyc2l6ZSA9IFNNQUxMQ0hVTks7Ci0JUHlPYmplY3QgKmJpZ19idWZmZXIgPSBOVUxMOwotCXNpemVfdCBuZmlsbGVkID0gMDsKLQlzaXplX3QgbnJlYWQ7Ci0Jc2l6ZV90IHRvdGFscmVhZCA9IDA7Ci0JY2hhciAqcCwgKnEsICplbmQ7Ci0JaW50IGVycjsKLQlpbnQgc2hvcnRyZWFkID0gMDsKKyAgICBsb25nIHNpemVoaW50ID0gMDsKKyAgICBQeU9iamVjdCAqbGlzdCA9IE5VTEw7CisgICAgUHlPYmplY3QgKmxpbmU7CisgICAgY2hhciBzbWFsbF9idWZmZXJbU01BTExDSFVOS107CisgICAgY2hhciAqYnVmZmVyID0gc21hbGxfYnVmZmVyOworICAgIHNpemVfdCBidWZmZXJzaXplID0gU01BTExDSFVOSzsKKyAgICBQeU9iamVjdCAqYmlnX2J1ZmZlciA9IE5VTEw7CisgICAgc2l6ZV90IG5maWxsZWQgPSAwOworICAgIHNpemVfdCBucmVhZDsKKyAgICBzaXplX3QgdG90YWxyZWFkID0gMDsKKyAgICBjaGFyICpwLCAqcSwgKmVuZDsKKyAgICBpbnQgZXJyOworICAgIGludCBzaG9ydHJlYWQgPSAwOwogCi0JaWYgKGYtPmZfZnAgPT0gTlVMTCkKLQkJcmV0dXJuIGVycl9jbG9zZWQoKTsKLQlpZiAoIWYtPnJlYWRhYmxlKQotCQlyZXR1cm4gZXJyX21vZGUoInJlYWRpbmciKTsKLQkvKiByZWZ1c2UgdG8gbWl4IHdpdGggZi5uZXh0KCkgKi8KLQlpZiAoZi0+Zl9idWYgIT0gTlVMTCAmJgotCSAgICAoZi0+Zl9idWZlbmQgLSBmLT5mX2J1ZnB0cikgPiAwICYmCi0JICAgIGYtPmZfYnVmWzBdICE9ICdcMCcpCi0JCXJldHVybiBlcnJfaXRlcmJ1ZmZlcmVkKCk7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8bDpyZWFkbGluZXMiLCAmc2l6ZWhpbnQpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoKGxpc3QgPSBQeUxpc3RfTmV3KDApKSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlmb3IgKDs7KSB7Ci0JCWlmIChzaG9ydHJlYWQpCi0JCQlucmVhZCA9IDA7Ci0JCWVsc2UgewotCQkJRklMRV9CRUdJTl9BTExPV19USFJFQURTKGYpCi0JCQllcnJubyA9IDA7Ci0JCQlucmVhZCA9IFB5X1VuaXZlcnNhbE5ld2xpbmVGcmVhZChidWZmZXIrbmZpbGxlZCwKLQkJCQlidWZmZXJzaXplLW5maWxsZWQsIGYtPmZfZnAsIChQeU9iamVjdCAqKWYpOwotCQkJRklMRV9FTkRfQUxMT1dfVEhSRUFEUyhmKQotCQkJc2hvcnRyZWFkID0gKG5yZWFkIDwgYnVmZmVyc2l6ZS1uZmlsbGVkKTsKLQkJfQotCQlpZiAobnJlYWQgPT0gMCkgewotCQkJc2l6ZWhpbnQgPSAwOwotCQkJaWYgKCFmZXJyb3IoZi0+Zl9mcCkpCi0JCQkJYnJlYWs7Ci0JCQlQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7Ci0JCQljbGVhcmVycihmLT5mX2ZwKTsKLQkJCWdvdG8gZXJyb3I7Ci0JCX0KLQkJdG90YWxyZWFkICs9IG5yZWFkOwotCQlwID0gKGNoYXIgKiltZW1jaHIoYnVmZmVyK25maWxsZWQsICdcbicsIG5yZWFkKTsKLQkJaWYgKHAgPT0gTlVMTCkgewotCQkJLyogTmVlZCBhIGxhcmdlciBidWZmZXIgdG8gZml0IHRoaXMgbGluZSAqLwotCQkJbmZpbGxlZCArPSBucmVhZDsKLQkJCWJ1ZmZlcnNpemUgKj0gMjsKLQkJCWlmIChidWZmZXJzaXplID4gUFlfU1NJWkVfVF9NQVgpIHsKLQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJCSAgICAibGluZSBpcyBsb25nZXIgdGhhbiBhIFB5dGhvbiBzdHJpbmcgY2FuIGhvbGQiKTsKLQkJCQlnb3RvIGVycm9yOwotCQkJfQotCQkJaWYgKGJpZ19idWZmZXIgPT0gTlVMTCkgewotCQkJCS8qIENyZWF0ZSB0aGUgYmlnIGJ1ZmZlciAqLwotCQkJCWJpZ19idWZmZXIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgKLQkJCQkJTlVMTCwgYnVmZmVyc2l6ZSk7Ci0JCQkJaWYgKGJpZ19idWZmZXIgPT0gTlVMTCkKLQkJCQkJZ290byBlcnJvcjsKLQkJCQlidWZmZXIgPSBQeVN0cmluZ19BU19TVFJJTkcoYmlnX2J1ZmZlcik7Ci0JCQkJbWVtY3B5KGJ1ZmZlciwgc21hbGxfYnVmZmVyLCBuZmlsbGVkKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8qIEdyb3cgdGhlIGJpZyBidWZmZXIgKi8KLQkJCQlpZiAoIF9QeVN0cmluZ19SZXNpemUoJmJpZ19idWZmZXIsIGJ1ZmZlcnNpemUpIDwgMCApCi0JCQkJCWdvdG8gZXJyb3I7Ci0JCQkJYnVmZmVyID0gUHlTdHJpbmdfQVNfU1RSSU5HKGJpZ19idWZmZXIpOwotCQkJfQotCQkJY29udGludWU7Ci0JCX0KLQkJZW5kID0gYnVmZmVyK25maWxsZWQrbnJlYWQ7Ci0JCXEgPSBidWZmZXI7Ci0JCWRvIHsKLQkJCS8qIFByb2Nlc3MgY29tcGxldGUgbGluZXMgKi8KLQkJCXArKzsKLQkJCWxpbmUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShxLCBwLXEpOwotCQkJaWYgKGxpbmUgPT0gTlVMTCkKLQkJCQlnb3RvIGVycm9yOwotCQkJZXJyID0gUHlMaXN0X0FwcGVuZChsaXN0LCBsaW5lKTsKLQkJCVB5X0RFQ1JFRihsaW5lKTsKLQkJCWlmIChlcnIgIT0gMCkKLQkJCQlnb3RvIGVycm9yOwotCQkJcSA9IHA7Ci0JCQlwID0gKGNoYXIgKiltZW1jaHIocSwgJ1xuJywgZW5kLXEpOwotCQl9IHdoaWxlIChwICE9IE5VTEwpOwotCQkvKiBNb3ZlIHRoZSByZW1haW5pbmcgaW5jb21wbGV0ZSBsaW5lIHRvIHRoZSBzdGFydCAqLwotCQluZmlsbGVkID0gZW5kLXE7Ci0JCW1lbW1vdmUoYnVmZmVyLCBxLCBuZmlsbGVkKTsKLQkJaWYgKHNpemVoaW50ID4gMCkKLQkJCWlmICh0b3RhbHJlYWQgPj0gKHNpemVfdClzaXplaGludCkKLQkJCQlicmVhazsKLQl9Ci0JaWYgKG5maWxsZWQgIT0gMCkgewotCQkvKiBQYXJ0aWFsIGxhc3QgbGluZSAqLwotCQlsaW5lID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoYnVmZmVyLCBuZmlsbGVkKTsKLQkJaWYgKGxpbmUgPT0gTlVMTCkKLQkJCWdvdG8gZXJyb3I7Ci0JCWlmIChzaXplaGludCA+IDApIHsKLQkJCS8qIE5lZWQgdG8gY29tcGxldGUgdGhlIGxhc3QgbGluZSAqLwotCQkJUHlPYmplY3QgKnJlc3QgPSBnZXRfbGluZShmLCAwKTsKLQkJCWlmIChyZXN0ID09IE5VTEwpIHsKLQkJCQlQeV9ERUNSRUYobGluZSk7Ci0JCQkJZ290byBlcnJvcjsKLQkJCX0KLQkJCVB5U3RyaW5nX0NvbmNhdCgmbGluZSwgcmVzdCk7Ci0JCQlQeV9ERUNSRUYocmVzdCk7Ci0JCQlpZiAobGluZSA9PSBOVUxMKQotCQkJCWdvdG8gZXJyb3I7Ci0JCX0KLQkJZXJyID0gUHlMaXN0X0FwcGVuZChsaXN0LCBsaW5lKTsKLQkJUHlfREVDUkVGKGxpbmUpOwotCQlpZiAoZXJyICE9IDApCi0JCQlnb3RvIGVycm9yOwotCX0KKyAgICBpZiAoZi0+Zl9mcCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gZXJyX2Nsb3NlZCgpOworICAgIGlmICghZi0+cmVhZGFibGUpCisgICAgICAgIHJldHVybiBlcnJfbW9kZSgicmVhZGluZyIpOworICAgIC8qIHJlZnVzZSB0byBtaXggd2l0aCBmLm5leHQoKSAqLworICAgIGlmIChmLT5mX2J1ZiAhPSBOVUxMICYmCisgICAgICAgIChmLT5mX2J1ZmVuZCAtIGYtPmZfYnVmcHRyKSA+IDAgJiYKKyAgICAgICAgZi0+Zl9idWZbMF0gIT0gJ1wwJykKKyAgICAgICAgcmV0dXJuIGVycl9pdGVyYnVmZmVyZWQoKTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxsOnJlYWRsaW5lcyIsICZzaXplaGludCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICgobGlzdCA9IFB5TGlzdF9OZXcoMCkpID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGZvciAoOzspIHsKKyAgICAgICAgaWYgKHNob3J0cmVhZCkKKyAgICAgICAgICAgIG5yZWFkID0gMDsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBGSUxFX0JFR0lOX0FMTE9XX1RIUkVBRFMoZikKKyAgICAgICAgICAgIGVycm5vID0gMDsKKyAgICAgICAgICAgIG5yZWFkID0gUHlfVW5pdmVyc2FsTmV3bGluZUZyZWFkKGJ1ZmZlcituZmlsbGVkLAorICAgICAgICAgICAgICAgIGJ1ZmZlcnNpemUtbmZpbGxlZCwgZi0+Zl9mcCwgKFB5T2JqZWN0ICopZik7CisgICAgICAgICAgICBGSUxFX0VORF9BTExPV19USFJFQURTKGYpCisgICAgICAgICAgICBzaG9ydHJlYWQgPSAobnJlYWQgPCBidWZmZXJzaXplLW5maWxsZWQpOworICAgICAgICB9CisgICAgICAgIGlmIChucmVhZCA9PSAwKSB7CisgICAgICAgICAgICBzaXplaGludCA9IDA7CisgICAgICAgICAgICBpZiAoIWZlcnJvcihmLT5mX2ZwKSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKKyAgICAgICAgICAgIGNsZWFyZXJyKGYtPmZfZnApOworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgICAgICB0b3RhbHJlYWQgKz0gbnJlYWQ7CisgICAgICAgIHAgPSAoY2hhciAqKW1lbWNocihidWZmZXIrbmZpbGxlZCwgJ1xuJywgbnJlYWQpOworICAgICAgICBpZiAocCA9PSBOVUxMKSB7CisgICAgICAgICAgICAvKiBOZWVkIGEgbGFyZ2VyIGJ1ZmZlciB0byBmaXQgdGhpcyBsaW5lICovCisgICAgICAgICAgICBuZmlsbGVkICs9IG5yZWFkOworICAgICAgICAgICAgYnVmZmVyc2l6ZSAqPSAyOworICAgICAgICAgICAgaWYgKGJ1ZmZlcnNpemUgPiBQWV9TU0laRV9UX01BWCkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICJsaW5lIGlzIGxvbmdlciB0aGFuIGEgUHl0aG9uIHN0cmluZyBjYW4gaG9sZCIpOworICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYmlnX2J1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgLyogQ3JlYXRlIHRoZSBiaWcgYnVmZmVyICovCisgICAgICAgICAgICAgICAgYmlnX2J1ZmZlciA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKAorICAgICAgICAgICAgICAgICAgICBOVUxMLCBidWZmZXJzaXplKTsKKyAgICAgICAgICAgICAgICBpZiAoYmlnX2J1ZmZlciA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgIGJ1ZmZlciA9IFB5U3RyaW5nX0FTX1NUUklORyhiaWdfYnVmZmVyKTsKKyAgICAgICAgICAgICAgICBtZW1jcHkoYnVmZmVyLCBzbWFsbF9idWZmZXIsIG5maWxsZWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgLyogR3JvdyB0aGUgYmlnIGJ1ZmZlciAqLworICAgICAgICAgICAgICAgIGlmICggX1B5U3RyaW5nX1Jlc2l6ZSgmYmlnX2J1ZmZlciwgYnVmZmVyc2l6ZSkgPCAwICkKKyAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgICAgICBidWZmZXIgPSBQeVN0cmluZ19BU19TVFJJTkcoYmlnX2J1ZmZlcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBlbmQgPSBidWZmZXIrbmZpbGxlZCtucmVhZDsKKyAgICAgICAgcSA9IGJ1ZmZlcjsKKyAgICAgICAgZG8geworICAgICAgICAgICAgLyogUHJvY2VzcyBjb21wbGV0ZSBsaW5lcyAqLworICAgICAgICAgICAgcCsrOworICAgICAgICAgICAgbGluZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHEsIHAtcSk7CisgICAgICAgICAgICBpZiAobGluZSA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICBlcnIgPSBQeUxpc3RfQXBwZW5kKGxpc3QsIGxpbmUpOworICAgICAgICAgICAgUHlfREVDUkVGKGxpbmUpOworICAgICAgICAgICAgaWYgKGVyciAhPSAwKQorICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICBxID0gcDsKKyAgICAgICAgICAgIHAgPSAoY2hhciAqKW1lbWNocihxLCAnXG4nLCBlbmQtcSk7CisgICAgICAgIH0gd2hpbGUgKHAgIT0gTlVMTCk7CisgICAgICAgIC8qIE1vdmUgdGhlIHJlbWFpbmluZyBpbmNvbXBsZXRlIGxpbmUgdG8gdGhlIHN0YXJ0ICovCisgICAgICAgIG5maWxsZWQgPSBlbmQtcTsKKyAgICAgICAgbWVtbW92ZShidWZmZXIsIHEsIG5maWxsZWQpOworICAgICAgICBpZiAoc2l6ZWhpbnQgPiAwKQorICAgICAgICAgICAgaWYgKHRvdGFscmVhZCA+PSAoc2l6ZV90KXNpemVoaW50KQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAobmZpbGxlZCAhPSAwKSB7CisgICAgICAgIC8qIFBhcnRpYWwgbGFzdCBsaW5lICovCisgICAgICAgIGxpbmUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShidWZmZXIsIG5maWxsZWQpOworICAgICAgICBpZiAobGluZSA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgaWYgKHNpemVoaW50ID4gMCkgeworICAgICAgICAgICAgLyogTmVlZCB0byBjb21wbGV0ZSB0aGUgbGFzdCBsaW5lICovCisgICAgICAgICAgICBQeU9iamVjdCAqcmVzdCA9IGdldF9saW5lKGYsIDApOworICAgICAgICAgICAgaWYgKHJlc3QgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihsaW5lKTsKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlTdHJpbmdfQ29uY2F0KCZsaW5lLCByZXN0KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihyZXN0KTsKKyAgICAgICAgICAgIGlmIChsaW5lID09IE5VTEwpCisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgICAgICBlcnIgPSBQeUxpc3RfQXBwZW5kKGxpc3QsIGxpbmUpOworICAgICAgICBQeV9ERUNSRUYobGluZSk7CisgICAgICAgIGlmIChlcnIgIT0gMCkKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQogCiBjbGVhbnVwOgotCVB5X1hERUNSRUYoYmlnX2J1ZmZlcik7Ci0JcmV0dXJuIGxpc3Q7CisgICAgUHlfWERFQ1JFRihiaWdfYnVmZmVyKTsKKyAgICByZXR1cm4gbGlzdDsKIAogZXJyb3I6Ci0JUHlfQ0xFQVIobGlzdCk7Ci0JZ290byBjbGVhbnVwOworICAgIFB5X0NMRUFSKGxpc3QpOworICAgIGdvdG8gY2xlYW51cDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZpbGVfd3JpdGUoUHlGaWxlT2JqZWN0ICpmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeV9idWZmZXIgcGJ1ZjsKLQljaGFyICpzOwotCVB5X3NzaXplX3QgbiwgbjI7Ci0JaWYgKGYtPmZfZnAgPT0gTlVMTCkKLQkJcmV0dXJuIGVycl9jbG9zZWQoKTsKLQlpZiAoIWYtPndyaXRhYmxlKQotCQlyZXR1cm4gZXJyX21vZGUoIndyaXRpbmciKTsKLQlpZiAoZi0+Zl9iaW5hcnkpIHsKLQkJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzKiIsICZwYnVmKSkKLQkJCXJldHVybiBOVUxMOwotCQlzID0gcGJ1Zi5idWY7Ci0JCW4gPSBwYnVmLmxlbjsKLQl9IGVsc2UKLQkJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ0IyIsICZzLCAmbikpCi0JCXJldHVybiBOVUxMOwotCWYtPmZfc29mdHNwYWNlID0gMDsKLQlGSUxFX0JFR0lOX0FMTE9XX1RIUkVBRFMoZikKLQllcnJubyA9IDA7Ci0JbjIgPSBmd3JpdGUocywgMSwgbiwgZi0+Zl9mcCk7Ci0JRklMRV9FTkRfQUxMT1dfVEhSRUFEUyhmKQotCWlmIChmLT5mX2JpbmFyeSkKLQkJUHlCdWZmZXJfUmVsZWFzZSgmcGJ1Zik7Ci0JaWYgKG4yICE9IG4pIHsKLQkJUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOwotCQljbGVhcmVycihmLT5mX2ZwKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9idWZmZXIgcGJ1ZjsKKyAgICBjaGFyICpzOworICAgIFB5X3NzaXplX3QgbiwgbjI7CisgICAgaWYgKGYtPmZfZnAgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIGVycl9jbG9zZWQoKTsKKyAgICBpZiAoIWYtPndyaXRhYmxlKQorICAgICAgICByZXR1cm4gZXJyX21vZGUoIndyaXRpbmciKTsKKyAgICBpZiAoZi0+Zl9iaW5hcnkpIHsKKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzKiIsICZwYnVmKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBzID0gcGJ1Zi5idWY7CisgICAgICAgIG4gPSBwYnVmLmxlbjsKKyAgICB9IGVsc2UKKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ0IyIsICZzLCAmbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGYtPmZfc29mdHNwYWNlID0gMDsKKyAgICBGSUxFX0JFR0lOX0FMTE9XX1RIUkVBRFMoZikKKyAgICBlcnJubyA9IDA7CisgICAgbjIgPSBmd3JpdGUocywgMSwgbiwgZi0+Zl9mcCk7CisgICAgRklMRV9FTkRfQUxMT1dfVEhSRUFEUyhmKQorICAgIGlmIChmLT5mX2JpbmFyeSkKKyAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmcGJ1Zik7CisgICAgaWYgKG4yICE9IG4pIHsKKyAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOworICAgICAgICBjbGVhcmVycihmLT5mX2ZwKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZpbGVfd3JpdGVsaW5lcyhQeUZpbGVPYmplY3QgKmYsIFB5T2JqZWN0ICpzZXEpCiB7CiAjZGVmaW5lIENIVU5LU0laRSAxMDAwCi0JUHlPYmplY3QgKmxpc3QsICpsaW5lOwotCVB5T2JqZWN0ICppdDsJLyogaXRlcihzZXEpICovCi0JUHlPYmplY3QgKnJlc3VsdDsKLQlpbnQgaW5kZXgsIGlzbGlzdDsKLQlQeV9zc2l6ZV90IGksIGosIG53cml0dGVuLCBsZW47CisgICAgUHlPYmplY3QgKmxpc3QsICpsaW5lOworICAgIFB5T2JqZWN0ICppdDsgICAgICAgLyogaXRlcihzZXEpICovCisgICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICBpbnQgaW5kZXgsIGlzbGlzdDsKKyAgICBQeV9zc2l6ZV90IGksIGosIG53cml0dGVuLCBsZW47CiAKLQlhc3NlcnQoc2VxICE9IE5VTEwpOwotCWlmIChmLT5mX2ZwID09IE5VTEwpCi0JCXJldHVybiBlcnJfY2xvc2VkKCk7Ci0JaWYgKCFmLT53cml0YWJsZSkKLQkJcmV0dXJuIGVycl9tb2RlKCJ3cml0aW5nIik7CisgICAgYXNzZXJ0KHNlcSAhPSBOVUxMKTsKKyAgICBpZiAoZi0+Zl9mcCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gZXJyX2Nsb3NlZCgpOworICAgIGlmICghZi0+d3JpdGFibGUpCisgICAgICAgIHJldHVybiBlcnJfbW9kZSgid3JpdGluZyIpOwogCi0JcmVzdWx0ID0gTlVMTDsKLQlsaXN0ID0gTlVMTDsKLQlpc2xpc3QgPSBQeUxpc3RfQ2hlY2soc2VxKTsKLQlpZiAgKGlzbGlzdCkKLQkJaXQgPSBOVUxMOwotCWVsc2UgewotCQlpdCA9IFB5T2JqZWN0X0dldEl0ZXIoc2VxKTsKLQkJaWYgKGl0ID09IE5VTEwpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJIndyaXRlbGluZXMoKSByZXF1aXJlcyBhbiBpdGVyYWJsZSBhcmd1bWVudCIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJLyogRnJvbSBoZXJlIG9uLCBmYWlsIGJ5IGdvaW5nIHRvIGVycm9yLCB0byByZWNsYWltICJpdCIuICovCi0JCWxpc3QgPSBQeUxpc3RfTmV3KENIVU5LU0laRSk7Ci0JCWlmIChsaXN0ID09IE5VTEwpCi0JCQlnb3RvIGVycm9yOwotCX0KKyAgICByZXN1bHQgPSBOVUxMOworICAgIGxpc3QgPSBOVUxMOworICAgIGlzbGlzdCA9IFB5TGlzdF9DaGVjayhzZXEpOworICAgIGlmICAoaXNsaXN0KQorICAgICAgICBpdCA9IE5VTEw7CisgICAgZWxzZSB7CisgICAgICAgIGl0ID0gUHlPYmplY3RfR2V0SXRlcihzZXEpOworICAgICAgICBpZiAoaXQgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAid3JpdGVsaW5lcygpIHJlcXVpcmVzIGFuIGl0ZXJhYmxlIGFyZ3VtZW50Iik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICAvKiBGcm9tIGhlcmUgb24sIGZhaWwgYnkgZ29pbmcgdG8gZXJyb3IsIHRvIHJlY2xhaW0gIml0Ii4gKi8KKyAgICAgICAgbGlzdCA9IFB5TGlzdF9OZXcoQ0hVTktTSVpFKTsKKyAgICAgICAgaWYgKGxpc3QgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQogCi0JLyogU3RyYXRlZ3k6IHNsdXJwIENIVU5LU0laRSBsaW5lcyBpbnRvIGEgcHJpdmF0ZSBsaXN0LAotCSAgIGNoZWNraW5nIHRoYXQgdGhleSBhcmUgYWxsIHN0cmluZ3MsIHRoZW4gd3JpdGUgdGhhdCBsaXN0Ci0JICAgd2l0aG91dCBob2xkaW5nIHRoZSBpbnRlcnByZXRlciBsb2NrLCB0aGVuIGNvbWUgYmFjayBmb3IgbW9yZS4gKi8KLQlmb3IgKGluZGV4ID0gMDsgOyBpbmRleCArPSBDSFVOS1NJWkUpIHsKLQkJaWYgKGlzbGlzdCkgewotCQkJUHlfWERFQ1JFRihsaXN0KTsKLQkJCWxpc3QgPSBQeUxpc3RfR2V0U2xpY2Uoc2VxLCBpbmRleCwgaW5kZXgrQ0hVTktTSVpFKTsKLQkJCWlmIChsaXN0ID09IE5VTEwpCi0JCQkJZ290byBlcnJvcjsKLQkJCWogPSBQeUxpc3RfR0VUX1NJWkUobGlzdCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmb3IgKGogPSAwOyBqIDwgQ0hVTktTSVpFOyBqKyspIHsKLQkJCQlsaW5lID0gUHlJdGVyX05leHQoaXQpOwotCQkJCWlmIChsaW5lID09IE5VTEwpIHsKLQkJCQkJaWYgKFB5RXJyX09jY3VycmVkKCkpCi0JCQkJCQlnb3RvIGVycm9yOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJUHlMaXN0X1NldEl0ZW0obGlzdCwgaiwgbGluZSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGogPT0gMCkKLQkJCWJyZWFrOworICAgIC8qIFN0cmF0ZWd5OiBzbHVycCBDSFVOS1NJWkUgbGluZXMgaW50byBhIHByaXZhdGUgbGlzdCwKKyAgICAgICBjaGVja2luZyB0aGF0IHRoZXkgYXJlIGFsbCBzdHJpbmdzLCB0aGVuIHdyaXRlIHRoYXQgbGlzdAorICAgICAgIHdpdGhvdXQgaG9sZGluZyB0aGUgaW50ZXJwcmV0ZXIgbG9jaywgdGhlbiBjb21lIGJhY2sgZm9yIG1vcmUuICovCisgICAgZm9yIChpbmRleCA9IDA7IDsgaW5kZXggKz0gQ0hVTktTSVpFKSB7CisgICAgICAgIGlmIChpc2xpc3QpIHsKKyAgICAgICAgICAgIFB5X1hERUNSRUYobGlzdCk7CisgICAgICAgICAgICBsaXN0ID0gUHlMaXN0X0dldFNsaWNlKHNlcSwgaW5kZXgsIGluZGV4K0NIVU5LU0laRSk7CisgICAgICAgICAgICBpZiAobGlzdCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICBqID0gUHlMaXN0X0dFVF9TSVpFKGxpc3QpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IENIVU5LU0laRTsgaisrKSB7CisgICAgICAgICAgICAgICAgbGluZSA9IFB5SXRlcl9OZXh0KGl0KTsKKyAgICAgICAgICAgICAgICBpZiAobGluZSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFB5TGlzdF9TZXRJdGVtKGxpc3QsIGosIGxpbmUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChqID09IDApCisgICAgICAgICAgICBicmVhazsKIAotCQkvKiBDaGVjayB0aGF0IGFsbCBlbnRyaWVzIGFyZSBpbmRlZWQgc3RyaW5ncy4gSWYgbm90LAotCQkgICBhcHBseSB0aGUgc2FtZSBydWxlcyBhcyBmb3IgZmlsZS53cml0ZSgpIGFuZAotCQkgICBjb252ZXJ0IHRoZSByZXN1bHRzIHRvIHN0cmluZ3MuIFRoaXMgaXMgc2xvdywgYnV0Ci0JCSAgIHNlZW1zIHRvIGJlIHRoZSBvbmx5IHdheSBzaW5jZSBhbGwgY29udmVyc2lvbiBBUElzCi0JCSAgIGNvdWxkIHBvdGVudGlhbGx5IGV4ZWN1dGUgUHl0aG9uIGNvZGUuICovCi0JCWZvciAoaSA9IDA7IGkgPCBqOyBpKyspIHsKLQkJCVB5T2JqZWN0ICp2ID0gUHlMaXN0X0dFVF9JVEVNKGxpc3QsIGkpOwotCQkJaWYgKCFQeVN0cmluZ19DaGVjayh2KSkgewotCQkJICAgIAljb25zdCBjaGFyICpidWZmZXI7Ci0JCQkJaWYgKCgoZi0+Zl9iaW5hcnkgJiYKLQkJCQkgICAgICBQeU9iamVjdF9Bc1JlYWRCdWZmZXIodiwKLQkJCQkJICAgICAgKGNvbnN0IHZvaWQqKikmYnVmZmVyLAotCQkJCQkJCSAgICAmbGVuKSkgfHwKLQkJCQkgICAgIFB5T2JqZWN0X0FzQ2hhckJ1ZmZlcih2LAotCQkJCQkJCSAgICZidWZmZXIsCi0JCQkJCQkJICAgJmxlbikpKSB7Ci0JCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkid3JpdGVsaW5lcygpIGFyZ3VtZW50IG11c3QgYmUgYSBzZXF1ZW5jZSBvZiBzdHJpbmdzIik7Ci0JCQkJCWdvdG8gZXJyb3I7Ci0JCQkJfQotCQkJCWxpbmUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShidWZmZXIsCi0JCQkJCQkJCSAgbGVuKTsKLQkJCQlpZiAobGluZSA9PSBOVUxMKQotCQkJCQlnb3RvIGVycm9yOwotCQkJCVB5X0RFQ1JFRih2KTsKLQkJCQlQeUxpc3RfU0VUX0lURU0obGlzdCwgaSwgbGluZSk7Ci0JCQl9Ci0JCX0KKyAgICAgICAgLyogQ2hlY2sgdGhhdCBhbGwgZW50cmllcyBhcmUgaW5kZWVkIHN0cmluZ3MuIElmIG5vdCwKKyAgICAgICAgICAgYXBwbHkgdGhlIHNhbWUgcnVsZXMgYXMgZm9yIGZpbGUud3JpdGUoKSBhbmQKKyAgICAgICAgICAgY29udmVydCB0aGUgcmVzdWx0cyB0byBzdHJpbmdzLiBUaGlzIGlzIHNsb3csIGJ1dAorICAgICAgICAgICBzZWVtcyB0byBiZSB0aGUgb25seSB3YXkgc2luY2UgYWxsIGNvbnZlcnNpb24gQVBJcworICAgICAgICAgICBjb3VsZCBwb3RlbnRpYWxseSBleGVjdXRlIFB5dGhvbiBjb2RlLiAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgajsgaSsrKSB7CisgICAgICAgICAgICBQeU9iamVjdCAqdiA9IFB5TGlzdF9HRVRfSVRFTShsaXN0LCBpKTsKKyAgICAgICAgICAgIGlmICghUHlTdHJpbmdfQ2hlY2sodikpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpidWZmZXI7CisgICAgICAgICAgICAgICAgaWYgKCgoZi0+Zl9iaW5hcnkgJiYKKyAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdF9Bc1JlYWRCdWZmZXIodiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHZvaWQqKikmYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsZW4pKSB8fAorICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3RfQXNDaGFyQnVmZmVyKHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGVuKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICJ3cml0ZWxpbmVzKCkgYXJndW1lbnQgbXVzdCBiZSBhIHNlcXVlbmNlIG9mIHN0cmluZ3MiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsaW5lID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4pOworICAgICAgICAgICAgICAgIGlmIChsaW5lID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgICAgIFB5TGlzdF9TRVRfSVRFTShsaXN0LCBpLCBsaW5lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCS8qIFNpbmNlIHdlIGFyZSByZWxlYXNpbmcgdGhlIGdsb2JhbCBsb2NrLCB0aGUKLQkJICAgZm9sbG93aW5nIGNvZGUgbWF5ICpub3QqIGV4ZWN1dGUgUHl0aG9uIGNvZGUuICovCi0JCWYtPmZfc29mdHNwYWNlID0gMDsKLQkJRklMRV9CRUdJTl9BTExPV19USFJFQURTKGYpCi0JCWVycm5vID0gMDsKLQkJZm9yIChpID0gMDsgaSA8IGo7IGkrKykgewotCQkgICAgCWxpbmUgPSBQeUxpc3RfR0VUX0lURU0obGlzdCwgaSk7Ci0JCQlsZW4gPSBQeVN0cmluZ19HRVRfU0laRShsaW5lKTsKLQkJCW53cml0dGVuID0gZndyaXRlKFB5U3RyaW5nX0FTX1NUUklORyhsaW5lKSwKLQkJCQkJICAxLCBsZW4sIGYtPmZfZnApOwotCQkJaWYgKG53cml0dGVuICE9IGxlbikgewotCQkJCUZJTEVfQUJPUlRfQUxMT1dfVEhSRUFEUyhmKQotCQkJCVB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKLQkJCQljbGVhcmVycihmLT5mX2ZwKTsKLQkJCQlnb3RvIGVycm9yOwotCQkJfQotCQl9Ci0JCUZJTEVfRU5EX0FMTE9XX1RIUkVBRFMoZikKKyAgICAgICAgLyogU2luY2Ugd2UgYXJlIHJlbGVhc2luZyB0aGUgZ2xvYmFsIGxvY2ssIHRoZQorICAgICAgICAgICBmb2xsb3dpbmcgY29kZSBtYXkgKm5vdCogZXhlY3V0ZSBQeXRob24gY29kZS4gKi8KKyAgICAgICAgZi0+Zl9zb2Z0c3BhY2UgPSAwOworICAgICAgICBGSUxFX0JFR0lOX0FMTE9XX1RIUkVBRFMoZikKKyAgICAgICAgZXJybm8gPSAwOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgajsgaSsrKSB7CisgICAgICAgICAgICBsaW5lID0gUHlMaXN0X0dFVF9JVEVNKGxpc3QsIGkpOworICAgICAgICAgICAgbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUobGluZSk7CisgICAgICAgICAgICBud3JpdHRlbiA9IGZ3cml0ZShQeVN0cmluZ19BU19TVFJJTkcobGluZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBsZW4sIGYtPmZfZnApOworICAgICAgICAgICAgaWYgKG53cml0dGVuICE9IGxlbikgeworICAgICAgICAgICAgICAgIEZJTEVfQUJPUlRfQUxMT1dfVEhSRUFEUyhmKQorICAgICAgICAgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKKyAgICAgICAgICAgICAgICBjbGVhcmVycihmLT5mX2ZwKTsKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEZJTEVfRU5EX0FMTE9XX1RIUkVBRFMoZikKIAotCQlpZiAoaiA8IENIVU5LU0laRSkKLQkJCWJyZWFrOwotCX0KKyAgICAgICAgaWYgKGogPCBDSFVOS1NJWkUpCisgICAgICAgICAgICBicmVhazsKKyAgICB9CiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmVzdWx0ID0gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmVzdWx0ID0gUHlfTm9uZTsKICAgZXJyb3I6Ci0JUHlfWERFQ1JFRihsaXN0KTsKLSAgCVB5X1hERUNSRUYoaXQpOwotCXJldHVybiByZXN1bHQ7CisgICAgUHlfWERFQ1JFRihsaXN0KTsKKyAgICBQeV9YREVDUkVGKGl0KTsKKyAgICByZXR1cm4gcmVzdWx0OwogI3VuZGVmIENIVU5LU0laRQogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZmlsZV9zZWxmKFB5RmlsZU9iamVjdCAqZikKIHsKLQlpZiAoZi0+Zl9mcCA9PSBOVUxMKQotCQlyZXR1cm4gZXJyX2Nsb3NlZCgpOwotCVB5X0lOQ1JFRihmKTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopZjsKKyAgICBpZiAoZi0+Zl9mcCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gZXJyX2Nsb3NlZCgpOworICAgIFB5X0lOQ1JFRihmKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopZjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZpbGVfeHJlYWRsaW5lcyhQeUZpbGVPYmplY3QgKmYpCiB7Ci0JaWYgKFB5RXJyX1dhcm5QeTNrKCJmLnhyZWFkbGluZXMoKSBub3Qgc3VwcG9ydGVkIGluIDMueCwgIgotCQkJICAgInRyeSAnZm9yIGxpbmUgaW4gZicgaW5zdGVhZCIsIDEpIDwgMCkKLQkgICAgICAgcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIGZpbGVfc2VsZihmKTsKKyAgICBpZiAoUHlFcnJfV2FyblB5M2soImYueHJlYWRsaW5lcygpIG5vdCBzdXBwb3J0ZWQgaW4gMy54LCAiCisgICAgICAgICAgICAgICAgICAgICAgICJ0cnkgJ2ZvciBsaW5lIGluIGYnIGluc3RlYWQiLCAxKSA8IDApCisgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBmaWxlX3NlbGYoZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmaWxlX2V4aXQoUHlPYmplY3QgKmYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICpyZXQgPSBQeU9iamVjdF9DYWxsTWV0aG9kKGYsICJjbG9zZSIsIE5VTEwpOwotCWlmICghcmV0KQotCQkvKiBJZiBlcnJvciBvY2N1cnJlZCwgcGFzcyB0aHJvdWdoICovCi0JCXJldHVybiBOVUxMOwotCVB5X0RFQ1JFRihyZXQpOwotCS8qIFdlIGNhbm5vdCByZXR1cm4gdGhlIHJlc3VsdCBvZiBjbG9zZSBzaW5jZSBhIHRydWUKLQkgKiB2YWx1ZSB3aWxsIGJlIGludGVycHJldGVkIGFzICJ5ZXMsIHN3YWxsb3cgdGhlCi0JICogZXhjZXB0aW9uIGlmIG9uZSB3YXMgcmFpc2VkIGluc2lkZSB0aGUgd2l0aCBibG9jayIuICovCi0JUHlfUkVUVVJOX05PTkU7CisgICAgUHlPYmplY3QgKnJldCA9IFB5T2JqZWN0X0NhbGxNZXRob2QoZiwgImNsb3NlIiwgTlVMTCk7CisgICAgaWYgKCFyZXQpCisgICAgICAgIC8qIElmIGVycm9yIG9jY3VycmVkLCBwYXNzIHRocm91Z2ggKi8KKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfREVDUkVGKHJldCk7CisgICAgLyogV2UgY2Fubm90IHJldHVybiB0aGUgcmVzdWx0IG9mIGNsb3NlIHNpbmNlIGEgdHJ1ZQorICAgICAqIHZhbHVlIHdpbGwgYmUgaW50ZXJwcmV0ZWQgYXMgInllcywgc3dhbGxvdyB0aGUKKyAgICAgKiBleGNlcHRpb24gaWYgb25lIHdhcyByYWlzZWQgaW5zaWRlIHRoZSB3aXRoIGJsb2NrIi4gKi8KKyAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAogUHlEb2NfU1RSVkFSKHJlYWRsaW5lX2RvYywKQEAgLTE5MTcsMTI2ICsxOTE3LDEyNiBAQAogImlzYXR0eSgpIC0+IHRydWUgb3IgZmFsc2UuICBUcnVlIGlmIHRoZSBmaWxlIGlzIGNvbm5lY3RlZCB0byBhIHR0eSBkZXZpY2UuIik7CiAKIFB5RG9jX1NUUlZBUihlbnRlcl9kb2MsCi0JICAgICAiX19lbnRlcl9fKCkgLT4gc2VsZi4iKTsKKyAgICAgICAgICAgICAiX19lbnRlcl9fKCkgLT4gc2VsZi4iKTsKIAogUHlEb2NfU1RSVkFSKGV4aXRfZG9jLAotCSAgICAgIl9fZXhpdF9fKCpleGNpbmZvKSAtPiBOb25lLiAgQ2xvc2VzIHRoZSBmaWxlLiIpOworICAgICAgICAgICAgICJfX2V4aXRfXygqZXhjaW5mbykgLT4gTm9uZS4gIENsb3NlcyB0aGUgZmlsZS4iKTsKIAogc3RhdGljIFB5TWV0aG9kRGVmIGZpbGVfbWV0aG9kc1tdID0gewotCXsicmVhZGxpbmUiLCAgKFB5Q0Z1bmN0aW9uKWZpbGVfcmVhZGxpbmUsIE1FVEhfVkFSQVJHUywgcmVhZGxpbmVfZG9jfSwKLQl7InJlYWQiLCAgICAgIChQeUNGdW5jdGlvbilmaWxlX3JlYWQsICAgICBNRVRIX1ZBUkFSR1MsIHJlYWRfZG9jfSwKLQl7IndyaXRlIiwgICAgIChQeUNGdW5jdGlvbilmaWxlX3dyaXRlLCAgICBNRVRIX1ZBUkFSR1MsIHdyaXRlX2RvY30sCi0JeyJmaWxlbm8iLCAgICAoUHlDRnVuY3Rpb24pZmlsZV9maWxlbm8sICAgTUVUSF9OT0FSR1MsICBmaWxlbm9fZG9jfSwKLQl7InNlZWsiLCAgICAgIChQeUNGdW5jdGlvbilmaWxlX3NlZWssICAgICBNRVRIX1ZBUkFSR1MsIHNlZWtfZG9jfSwKKyAgICB7InJlYWRsaW5lIiwgIChQeUNGdW5jdGlvbilmaWxlX3JlYWRsaW5lLCBNRVRIX1ZBUkFSR1MsIHJlYWRsaW5lX2RvY30sCisgICAgeyJyZWFkIiwgICAgICAoUHlDRnVuY3Rpb24pZmlsZV9yZWFkLCAgICAgTUVUSF9WQVJBUkdTLCByZWFkX2RvY30sCisgICAgeyJ3cml0ZSIsICAgICAoUHlDRnVuY3Rpb24pZmlsZV93cml0ZSwgICAgTUVUSF9WQVJBUkdTLCB3cml0ZV9kb2N9LAorICAgIHsiZmlsZW5vIiwgICAgKFB5Q0Z1bmN0aW9uKWZpbGVfZmlsZW5vLCAgIE1FVEhfTk9BUkdTLCAgZmlsZW5vX2RvY30sCisgICAgeyJzZWVrIiwgICAgICAoUHlDRnVuY3Rpb24pZmlsZV9zZWVrLCAgICAgTUVUSF9WQVJBUkdTLCBzZWVrX2RvY30sCiAjaWZkZWYgSEFWRV9GVFJVTkNBVEUKLQl7InRydW5jYXRlIiwgIChQeUNGdW5jdGlvbilmaWxlX3RydW5jYXRlLCBNRVRIX1ZBUkFSR1MsIHRydW5jYXRlX2RvY30sCisgICAgeyJ0cnVuY2F0ZSIsICAoUHlDRnVuY3Rpb24pZmlsZV90cnVuY2F0ZSwgTUVUSF9WQVJBUkdTLCB0cnVuY2F0ZV9kb2N9LAogI2VuZGlmCi0JeyJ0ZWxsIiwgICAgICAoUHlDRnVuY3Rpb24pZmlsZV90ZWxsLCAgICAgTUVUSF9OT0FSR1MsICB0ZWxsX2RvY30sCi0JeyJyZWFkaW50byIsICAoUHlDRnVuY3Rpb24pZmlsZV9yZWFkaW50bywgTUVUSF9WQVJBUkdTLCByZWFkaW50b19kb2N9LAotCXsicmVhZGxpbmVzIiwgKFB5Q0Z1bmN0aW9uKWZpbGVfcmVhZGxpbmVzLCBNRVRIX1ZBUkFSR1MsIHJlYWRsaW5lc19kb2N9LAotCXsieHJlYWRsaW5lcyIsKFB5Q0Z1bmN0aW9uKWZpbGVfeHJlYWRsaW5lcywgTUVUSF9OT0FSR1MsIHhyZWFkbGluZXNfZG9jfSwKLQl7IndyaXRlbGluZXMiLChQeUNGdW5jdGlvbilmaWxlX3dyaXRlbGluZXMsIE1FVEhfTywgICAgIHdyaXRlbGluZXNfZG9jfSwKLQl7ImZsdXNoIiwgICAgIChQeUNGdW5jdGlvbilmaWxlX2ZsdXNoLCAgICBNRVRIX05PQVJHUywgIGZsdXNoX2RvY30sCi0JeyJjbG9zZSIsICAgICAoUHlDRnVuY3Rpb24pZmlsZV9jbG9zZSwgICAgTUVUSF9OT0FSR1MsICBjbG9zZV9kb2N9LAotCXsiaXNhdHR5IiwgICAgKFB5Q0Z1bmN0aW9uKWZpbGVfaXNhdHR5LCAgIE1FVEhfTk9BUkdTLCAgaXNhdHR5X2RvY30sCi0JeyJfX2VudGVyX18iLCAoUHlDRnVuY3Rpb24pZmlsZV9zZWxmLCAgICAgTUVUSF9OT0FSR1MsICBlbnRlcl9kb2N9LAotCXsiX19leGl0X18iLCAgKFB5Q0Z1bmN0aW9uKWZpbGVfZXhpdCwgICAgIE1FVEhfVkFSQVJHUywgZXhpdF9kb2N9LAotCXtOVUxMLAkgICAgICBOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7InRlbGwiLCAgICAgIChQeUNGdW5jdGlvbilmaWxlX3RlbGwsICAgICBNRVRIX05PQVJHUywgIHRlbGxfZG9jfSwKKyAgICB7InJlYWRpbnRvIiwgIChQeUNGdW5jdGlvbilmaWxlX3JlYWRpbnRvLCBNRVRIX1ZBUkFSR1MsIHJlYWRpbnRvX2RvY30sCisgICAgeyJyZWFkbGluZXMiLCAoUHlDRnVuY3Rpb24pZmlsZV9yZWFkbGluZXMsIE1FVEhfVkFSQVJHUywgcmVhZGxpbmVzX2RvY30sCisgICAgeyJ4cmVhZGxpbmVzIiwoUHlDRnVuY3Rpb24pZmlsZV94cmVhZGxpbmVzLCBNRVRIX05PQVJHUywgeHJlYWRsaW5lc19kb2N9LAorICAgIHsid3JpdGVsaW5lcyIsKFB5Q0Z1bmN0aW9uKWZpbGVfd3JpdGVsaW5lcywgTUVUSF9PLCAgICAgd3JpdGVsaW5lc19kb2N9LAorICAgIHsiZmx1c2giLCAgICAgKFB5Q0Z1bmN0aW9uKWZpbGVfZmx1c2gsICAgIE1FVEhfTk9BUkdTLCAgZmx1c2hfZG9jfSwKKyAgICB7ImNsb3NlIiwgICAgIChQeUNGdW5jdGlvbilmaWxlX2Nsb3NlLCAgICBNRVRIX05PQVJHUywgIGNsb3NlX2RvY30sCisgICAgeyJpc2F0dHkiLCAgICAoUHlDRnVuY3Rpb24pZmlsZV9pc2F0dHksICAgTUVUSF9OT0FSR1MsICBpc2F0dHlfZG9jfSwKKyAgICB7Il9fZW50ZXJfXyIsIChQeUNGdW5jdGlvbilmaWxlX3NlbGYsICAgICBNRVRIX05PQVJHUywgIGVudGVyX2RvY30sCisgICAgeyJfX2V4aXRfXyIsICAoUHlDRnVuY3Rpb24pZmlsZV9leGl0LCAgICAgTUVUSF9WQVJBUkdTLCBleGl0X2RvY30sCisgICAge05VTEwsICAgICAgICAgICAgTlVMTH0gICAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKICNkZWZpbmUgT0ZGKHgpIG9mZnNldG9mKFB5RmlsZU9iamVjdCwgeCkKIAogc3RhdGljIFB5TWVtYmVyRGVmIGZpbGVfbWVtYmVybGlzdFtdID0gewotCXsibW9kZSIsCVRfT0JKRUNULAlPRkYoZl9tb2RlKSwJUk8sCi0JICJmaWxlIG1vZGUgKCdyJywgJ1UnLCAndycsICdhJywgcG9zc2libHkgd2l0aCAnYicgb3IgJysnIGFkZGVkKSJ9LAotCXsibmFtZSIsCVRfT0JKRUNULAlPRkYoZl9uYW1lKSwJUk8sCi0JICJmaWxlIG5hbWUifSwKLQl7ImVuY29kaW5nIiwJVF9PQkpFQ1QsCU9GRihmX2VuY29kaW5nKSwJUk8sCi0JICJmaWxlIGVuY29kaW5nIn0sCi0JeyJlcnJvcnMiLAlUX09CSkVDVCwJT0ZGKGZfZXJyb3JzKSwJUk8sCi0JICJVbmljb2RlIGVycm9yIGhhbmRsZXIifSwKLQkvKiBnZXRhdHRyKGYsICJjbG9zZWQiKSBpcyBpbXBsZW1lbnRlZCB3aXRob3V0IHRoaXMgdGFibGUgKi8KLQl7TlVMTH0JLyogU2VudGluZWwgKi8KKyAgICB7Im1vZGUiLCAgICAgICAgICAgIFRfT0JKRUNULCAgICAgICBPRkYoZl9tb2RlKSwgICAgUk8sCisgICAgICJmaWxlIG1vZGUgKCdyJywgJ1UnLCAndycsICdhJywgcG9zc2libHkgd2l0aCAnYicgb3IgJysnIGFkZGVkKSJ9LAorICAgIHsibmFtZSIsICAgICAgICAgICAgVF9PQkpFQ1QsICAgICAgIE9GRihmX25hbWUpLCAgICBSTywKKyAgICAgImZpbGUgbmFtZSJ9LAorICAgIHsiZW5jb2RpbmciLCAgICAgICAgVF9PQkpFQ1QsICAgICAgIE9GRihmX2VuY29kaW5nKSwgICAgICAgIFJPLAorICAgICAiZmlsZSBlbmNvZGluZyJ9LAorICAgIHsiZXJyb3JzIiwgICAgICAgICAgVF9PQkpFQ1QsICAgICAgIE9GRihmX2Vycm9ycyksICBSTywKKyAgICAgIlVuaWNvZGUgZXJyb3IgaGFuZGxlciJ9LAorICAgIC8qIGdldGF0dHIoZiwgImNsb3NlZCIpIGlzIGltcGxlbWVudGVkIHdpdGhvdXQgdGhpcyB0YWJsZSAqLworICAgIHtOVUxMfSAgICAgIC8qIFNlbnRpbmVsICovCiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKgogZ2V0X2Nsb3NlZChQeUZpbGVPYmplY3QgKmYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygobG9uZykoZi0+Zl9mcCA9PSAwKSk7CisgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygobG9uZykoZi0+Zl9mcCA9PSAwKSk7CiB9CiBzdGF0aWMgUHlPYmplY3QgKgogZ2V0X25ld2xpbmVzKFB5RmlsZU9iamVjdCAqZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlzd2l0Y2ggKGYtPmZfbmV3bGluZXR5cGVzKSB7Ci0JY2FzZSBORVdMSU5FX1VOS05PV046Ci0JCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJcmV0dXJuIFB5X05vbmU7Ci0JY2FzZSBORVdMSU5FX0NSOgotCQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZygiXHIiKTsKLQljYXNlIE5FV0xJTkVfTEY6Ci0JCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKCJcbiIpOwotCWNhc2UgTkVXTElORV9DUnxORVdMSU5FX0xGOgotCQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKHNzKSIsICJcciIsICJcbiIpOwotCWNhc2UgTkVXTElORV9DUkxGOgotCQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZygiXHJcbiIpOwotCWNhc2UgTkVXTElORV9DUnxORVdMSU5FX0NSTEY6Ci0JCXJldHVybiBQeV9CdWlsZFZhbHVlKCIoc3MpIiwgIlxyIiwgIlxyXG4iKTsKLQljYXNlIE5FV0xJTkVfTEZ8TkVXTElORV9DUkxGOgotCQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKHNzKSIsICJcbiIsICJcclxuIik7Ci0JY2FzZSBORVdMSU5FX0NSfE5FV0xJTkVfTEZ8TkVXTElORV9DUkxGOgotCQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKHNzcykiLCAiXHIiLCAiXG4iLCAiXHJcbiIpOwotCWRlZmF1bHQ6Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19TeXN0ZW1FcnJvciwKLQkJCSAgICAgIlVua25vd24gbmV3bGluZXMgdmFsdWUgMHgleFxuIiwKLQkJCSAgICAgZi0+Zl9uZXdsaW5ldHlwZXMpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgc3dpdGNoIChmLT5mX25ld2xpbmV0eXBlcykgeworICAgIGNhc2UgTkVXTElORV9VTktOT1dOOgorICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIHJldHVybiBQeV9Ob25lOworICAgIGNhc2UgTkVXTElORV9DUjoKKyAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoIlxyIik7CisgICAgY2FzZSBORVdMSU5FX0xGOgorICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZygiXG4iKTsKKyAgICBjYXNlIE5FV0xJTkVfQ1J8TkVXTElORV9MRjoKKyAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihzcykiLCAiXHIiLCAiXG4iKTsKKyAgICBjYXNlIE5FV0xJTkVfQ1JMRjoKKyAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoIlxyXG4iKTsKKyAgICBjYXNlIE5FV0xJTkVfQ1J8TkVXTElORV9DUkxGOgorICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKHNzKSIsICJcciIsICJcclxuIik7CisgICAgY2FzZSBORVdMSU5FX0xGfE5FV0xJTkVfQ1JMRjoKKyAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihzcykiLCAiXG4iLCAiXHJcbiIpOworICAgIGNhc2UgTkVXTElORV9DUnxORVdMSU5FX0xGfE5FV0xJTkVfQ1JMRjoKKyAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihzc3MpIiwgIlxyIiwgIlxuIiwgIlxyXG4iKTsKKyAgICBkZWZhdWx0OgorICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiVW5rbm93biBuZXdsaW5lcyB2YWx1ZSAweCV4XG4iLAorICAgICAgICAgICAgICAgICAgICAgZi0+Zl9uZXdsaW5ldHlwZXMpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZXRfc29mdHNwYWNlKFB5RmlsZU9iamVjdCAqZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlpZiAoUHlFcnJfV2FyblB5M2soImZpbGUuc29mdHNwYWNlIG5vdCBzdXBwb3J0ZWQgaW4gMy54IiwgMSkgPCAwKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoZi0+Zl9zb2Z0c3BhY2UpOworICAgIGlmIChQeUVycl9XYXJuUHkzaygiZmlsZS5zb2Z0c3BhY2Ugbm90IHN1cHBvcnRlZCBpbiAzLngiLCAxKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhmLT5mX3NvZnRzcGFjZSk7CiB9CiAKIHN0YXRpYyBpbnQKIHNldF9zb2Z0c3BhY2UoUHlGaWxlT2JqZWN0ICpmLCBQeU9iamVjdCAqdmFsdWUpCiB7Ci0JaW50IG5ldzsKLQlpZiAoUHlFcnJfV2FyblB5M2soImZpbGUuc29mdHNwYWNlIG5vdCBzdXBwb3J0ZWQgaW4gMy54IiwgMSkgPCAwKQotCQlyZXR1cm4gLTE7CisgICAgaW50IG5ldzsKKyAgICBpZiAoUHlFcnJfV2FyblB5M2soImZpbGUuc29mdHNwYWNlIG5vdCBzdXBwb3J0ZWQgaW4gMy54IiwgMSkgPCAwKQorICAgICAgICByZXR1cm4gLTE7CiAKLQlpZiAodmFsdWUgPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJjYW4ndCBkZWxldGUgc29mdHNwYWNlIGF0dHJpYnV0ZSIpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIGlmICh2YWx1ZSA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiY2FuJ3QgZGVsZXRlIHNvZnRzcGFjZSBhdHRyaWJ1dGUiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCW5ldyA9IFB5SW50X0FzTG9uZyh2YWx1ZSk7Ci0JaWYgKG5ldyA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gLTE7Ci0JZi0+Zl9zb2Z0c3BhY2UgPSBuZXc7Ci0JcmV0dXJuIDA7CisgICAgbmV3ID0gUHlJbnRfQXNMb25nKHZhbHVlKTsKKyAgICBpZiAobmV3ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBmLT5mX3NvZnRzcGFjZSA9IG5ldzsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5R2V0U2V0RGVmIGZpbGVfZ2V0c2V0bGlzdFtdID0gewotCXsiY2xvc2VkIiwgKGdldHRlcilnZXRfY2xvc2VkLCBOVUxMLCAiVHJ1ZSBpZiB0aGUgZmlsZSBpcyBjbG9zZWQifSwKLQl7Im5ld2xpbmVzIiwgKGdldHRlcilnZXRfbmV3bGluZXMsIE5VTEwsCi0JICJlbmQtb2YtbGluZSBjb252ZW50aW9uIHVzZWQgaW4gdGhpcyBmaWxlIn0sCi0JeyJzb2Z0c3BhY2UiLCAoZ2V0dGVyKWdldF9zb2Z0c3BhY2UsIChzZXR0ZXIpc2V0X3NvZnRzcGFjZSwKLQkgImZsYWcgaW5kaWNhdGluZyB0aGF0IGEgc3BhY2UgbmVlZHMgdG8gYmUgcHJpbnRlZDsgdXNlZCBieSBwcmludCJ9LAotCXswfSwKKyAgICB7ImNsb3NlZCIsIChnZXR0ZXIpZ2V0X2Nsb3NlZCwgTlVMTCwgIlRydWUgaWYgdGhlIGZpbGUgaXMgY2xvc2VkIn0sCisgICAgeyJuZXdsaW5lcyIsIChnZXR0ZXIpZ2V0X25ld2xpbmVzLCBOVUxMLAorICAgICAiZW5kLW9mLWxpbmUgY29udmVudGlvbiB1c2VkIGluIHRoaXMgZmlsZSJ9LAorICAgIHsic29mdHNwYWNlIiwgKGdldHRlcilnZXRfc29mdHNwYWNlLCAoc2V0dGVyKXNldF9zb2Z0c3BhY2UsCisgICAgICJmbGFnIGluZGljYXRpbmcgdGhhdCBhIHNwYWNlIG5lZWRzIHRvIGJlIHByaW50ZWQ7IHVzZWQgYnkgcHJpbnQifSwKKyAgICB7MH0sCiB9OwogCiBzdGF0aWMgdm9pZAogZHJvcF9yZWFkYWhlYWQoUHlGaWxlT2JqZWN0ICpmKQogewotCWlmIChmLT5mX2J1ZiAhPSBOVUxMKSB7Ci0JCVB5TWVtX0ZyZWUoZi0+Zl9idWYpOwotCQlmLT5mX2J1ZiA9IE5VTEw7Ci0JfQorICAgIGlmIChmLT5mX2J1ZiAhPSBOVUxMKSB7CisgICAgICAgIFB5TWVtX0ZyZWUoZi0+Zl9idWYpOworICAgICAgICBmLT5mX2J1ZiA9IE5VTEw7CisgICAgfQogfQogCiAvKiBNYWtlIHN1cmUgdGhhdCBmaWxlIGhhcyBhIHJlYWRhaGVhZCBidWZmZXIgd2l0aCBhdCBsZWFzdCBvbmUgYnl0ZQpAQCAtMjA0NSwzNCArMjA0NSwzNCBAQAogc3RhdGljIGludAogcmVhZGFoZWFkKFB5RmlsZU9iamVjdCAqZiwgaW50IGJ1ZnNpemUpCiB7Ci0JUHlfc3NpemVfdCBjaHVua3NpemU7CisgICAgUHlfc3NpemVfdCBjaHVua3NpemU7CiAKLQlpZiAoZi0+Zl9idWYgIT0gTlVMTCkgewotCQlpZiggKGYtPmZfYnVmZW5kIC0gZi0+Zl9idWZwdHIpID49IDEpCi0JCQlyZXR1cm4gMDsKLQkJZWxzZQotCQkJZHJvcF9yZWFkYWhlYWQoZik7Ci0JfQotCWlmICgoZi0+Zl9idWYgPSAoY2hhciAqKVB5TWVtX01hbGxvYyhidWZzaXplKSkgPT0gTlVMTCkgewotCQlQeUVycl9Ob01lbW9yeSgpOwotCQlyZXR1cm4gLTE7Ci0JfQotCUZJTEVfQkVHSU5fQUxMT1dfVEhSRUFEUyhmKQotCWVycm5vID0gMDsKLQljaHVua3NpemUgPSBQeV9Vbml2ZXJzYWxOZXdsaW5lRnJlYWQoCi0JCWYtPmZfYnVmLCBidWZzaXplLCBmLT5mX2ZwLCAoUHlPYmplY3QgKilmKTsKLQlGSUxFX0VORF9BTExPV19USFJFQURTKGYpCi0JaWYgKGNodW5rc2l6ZSA9PSAwKSB7Ci0JCWlmIChmZXJyb3IoZi0+Zl9mcCkpIHsKLQkJCVB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKLQkJCWNsZWFyZXJyKGYtPmZfZnApOwotCQkJZHJvcF9yZWFkYWhlYWQoZik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9Ci0JZi0+Zl9idWZwdHIgPSBmLT5mX2J1ZjsKLQlmLT5mX2J1ZmVuZCA9IGYtPmZfYnVmICsgY2h1bmtzaXplOwotCXJldHVybiAwOworICAgIGlmIChmLT5mX2J1ZiAhPSBOVUxMKSB7CisgICAgICAgIGlmKCAoZi0+Zl9idWZlbmQgLSBmLT5mX2J1ZnB0cikgPj0gMSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBlbHNlCisgICAgICAgICAgICBkcm9wX3JlYWRhaGVhZChmKTsKKyAgICB9CisgICAgaWYgKChmLT5mX2J1ZiA9IChjaGFyICopUHlNZW1fTWFsbG9jKGJ1ZnNpemUpKSA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgRklMRV9CRUdJTl9BTExPV19USFJFQURTKGYpCisgICAgZXJybm8gPSAwOworICAgIGNodW5rc2l6ZSA9IFB5X1VuaXZlcnNhbE5ld2xpbmVGcmVhZCgKKyAgICAgICAgZi0+Zl9idWYsIGJ1ZnNpemUsIGYtPmZfZnAsIChQeU9iamVjdCAqKWYpOworICAgIEZJTEVfRU5EX0FMTE9XX1RIUkVBRFMoZikKKyAgICBpZiAoY2h1bmtzaXplID09IDApIHsKKyAgICAgICAgaWYgKGZlcnJvcihmLT5mX2ZwKSkgeworICAgICAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOworICAgICAgICAgICAgY2xlYXJlcnIoZi0+Zl9mcCk7CisgICAgICAgICAgICBkcm9wX3JlYWRhaGVhZChmKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBmLT5mX2J1ZnB0ciA9IGYtPmZfYnVmOworICAgIGYtPmZfYnVmZW5kID0gZi0+Zl9idWYgKyBjaHVua3NpemU7CisgICAgcmV0dXJuIDA7CiB9CiAKIC8qIFVzZWQgYnkgZmlsZV9pdGVybmV4dC4gIFRoZSByZXR1cm5lZCBzdHJpbmcgd2lsbCBzdGFydCB3aXRoICdza2lwJwpAQCAtMjA4Myw0NiArMjA4Myw0NiBAQAogc3RhdGljIFB5U3RyaW5nT2JqZWN0ICoKIHJlYWRhaGVhZF9nZXRfbGluZV9za2lwKFB5RmlsZU9iamVjdCAqZiwgaW50IHNraXAsIGludCBidWZzaXplKQogewotCVB5U3RyaW5nT2JqZWN0KiBzOwotCWNoYXIgKmJ1ZnB0cjsKLQljaGFyICpidWY7Ci0JUHlfc3NpemVfdCBsZW47CisgICAgUHlTdHJpbmdPYmplY3QqIHM7CisgICAgY2hhciAqYnVmcHRyOworICAgIGNoYXIgKmJ1ZjsKKyAgICBQeV9zc2l6ZV90IGxlbjsKIAotCWlmIChmLT5mX2J1ZiA9PSBOVUxMKQotCQlpZiAocmVhZGFoZWFkKGYsIGJ1ZnNpemUpIDwgMCkKLQkJCXJldHVybiBOVUxMOworICAgIGlmIChmLT5mX2J1ZiA9PSBOVUxMKQorICAgICAgICBpZiAocmVhZGFoZWFkKGYsIGJ1ZnNpemUpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogCi0JbGVuID0gZi0+Zl9idWZlbmQgLSBmLT5mX2J1ZnB0cjsKLQlpZiAobGVuID09IDApCi0JCXJldHVybiAoUHlTdHJpbmdPYmplY3QgKikKLQkJCVB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIHNraXApOwotCWJ1ZnB0ciA9IChjaGFyICopbWVtY2hyKGYtPmZfYnVmcHRyLCAnXG4nLCBsZW4pOwotCWlmIChidWZwdHIgIT0gTlVMTCkgewotCQlidWZwdHIrKzsJCQkvKiBDb3VudCB0aGUgJ1xuJyAqLwotCQlsZW4gPSBidWZwdHIgLSBmLT5mX2J1ZnB0cjsKLQkJcyA9IChQeVN0cmluZ09iamVjdCAqKQotCQkJUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgc2tpcCtsZW4pOwotCQlpZiAocyA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCW1lbWNweShQeVN0cmluZ19BU19TVFJJTkcocykrc2tpcCwgZi0+Zl9idWZwdHIsIGxlbik7Ci0JCWYtPmZfYnVmcHRyID0gYnVmcHRyOwotCQlpZiAoYnVmcHRyID09IGYtPmZfYnVmZW5kKQotCQkJZHJvcF9yZWFkYWhlYWQoZik7Ci0JfSBlbHNlIHsKLQkJYnVmcHRyID0gZi0+Zl9idWZwdHI7Ci0JCWJ1ZiA9IGYtPmZfYnVmOwotCQlmLT5mX2J1ZiA9IE5VTEw7IAkvKiBGb3JjZSBuZXcgcmVhZGFoZWFkIGJ1ZmZlciAqLwotCQlhc3NlcnQoc2tpcCtsZW4gPCBJTlRfTUFYKTsKLSAgICAgICAgICAgICAgICBzID0gcmVhZGFoZWFkX2dldF9saW5lX3NraXAoCi0JCQlmLCAoaW50KShza2lwK2xlbiksIGJ1ZnNpemUgKyAoYnVmc2l6ZT4+MikgKTsKLQkJaWYgKHMgPT0gTlVMTCkgewotCQkgICAgICAgIFB5TWVtX0ZyZWUoYnVmKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCW1lbWNweShQeVN0cmluZ19BU19TVFJJTkcocykrc2tpcCwgYnVmcHRyLCBsZW4pOwotCQlQeU1lbV9GcmVlKGJ1Zik7Ci0JfQotCXJldHVybiBzOworICAgIGxlbiA9IGYtPmZfYnVmZW5kIC0gZi0+Zl9idWZwdHI7CisgICAgaWYgKGxlbiA9PSAwKQorICAgICAgICByZXR1cm4gKFB5U3RyaW5nT2JqZWN0ICopCisgICAgICAgICAgICBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBza2lwKTsKKyAgICBidWZwdHIgPSAoY2hhciAqKW1lbWNocihmLT5mX2J1ZnB0ciwgJ1xuJywgbGVuKTsKKyAgICBpZiAoYnVmcHRyICE9IE5VTEwpIHsKKyAgICAgICAgYnVmcHRyKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvdW50IHRoZSAnXG4nICovCisgICAgICAgIGxlbiA9IGJ1ZnB0ciAtIGYtPmZfYnVmcHRyOworICAgICAgICBzID0gKFB5U3RyaW5nT2JqZWN0ICopCisgICAgICAgICAgICBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBza2lwK2xlbik7CisgICAgICAgIGlmIChzID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgbWVtY3B5KFB5U3RyaW5nX0FTX1NUUklORyhzKStza2lwLCBmLT5mX2J1ZnB0ciwgbGVuKTsKKyAgICAgICAgZi0+Zl9idWZwdHIgPSBidWZwdHI7CisgICAgICAgIGlmIChidWZwdHIgPT0gZi0+Zl9idWZlbmQpCisgICAgICAgICAgICBkcm9wX3JlYWRhaGVhZChmKTsKKyAgICB9IGVsc2UgeworICAgICAgICBidWZwdHIgPSBmLT5mX2J1ZnB0cjsKKyAgICAgICAgYnVmID0gZi0+Zl9idWY7CisgICAgICAgIGYtPmZfYnVmID0gTlVMTDsgICAgICAgICAgICAgICAgLyogRm9yY2UgbmV3IHJlYWRhaGVhZCBidWZmZXIgKi8KKyAgICAgICAgYXNzZXJ0KHNraXArbGVuIDwgSU5UX01BWCk7CisgICAgICAgIHMgPSByZWFkYWhlYWRfZ2V0X2xpbmVfc2tpcCgKKyAgICAgICAgICAgIGYsIChpbnQpKHNraXArbGVuKSwgYnVmc2l6ZSArIChidWZzaXplPj4yKSApOworICAgICAgICBpZiAocyA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeU1lbV9GcmVlKGJ1Zik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBtZW1jcHkoUHlTdHJpbmdfQVNfU1RSSU5HKHMpK3NraXAsIGJ1ZnB0ciwgbGVuKTsKKyAgICAgICAgUHlNZW1fRnJlZShidWYpOworICAgIH0KKyAgICByZXR1cm4gczsKIH0KIAogLyogQSBsYXJnZXIgYnVmZmVyIHNpemUgbWF5IGFjdHVhbGx5IGRlY3JlYXNlIHBlcmZvcm1hbmNlLiAqLwpAQCAtMjEzMSwxMjIgKzIxMzEsMTIyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZmlsZV9pdGVybmV4dChQeUZpbGVPYmplY3QgKmYpCiB7Ci0JUHlTdHJpbmdPYmplY3QqIGw7CisgICAgUHlTdHJpbmdPYmplY3QqIGw7CiAKLQlpZiAoZi0+Zl9mcCA9PSBOVUxMKQotCQlyZXR1cm4gZXJyX2Nsb3NlZCgpOwotCWlmICghZi0+cmVhZGFibGUpCi0JCXJldHVybiBlcnJfbW9kZSgicmVhZGluZyIpOworICAgIGlmIChmLT5mX2ZwID09IE5VTEwpCisgICAgICAgIHJldHVybiBlcnJfY2xvc2VkKCk7CisgICAgaWYgKCFmLT5yZWFkYWJsZSkKKyAgICAgICAgcmV0dXJuIGVycl9tb2RlKCJyZWFkaW5nIik7CiAKLQlsID0gcmVhZGFoZWFkX2dldF9saW5lX3NraXAoZiwgMCwgUkVBREFIRUFEX0JVRlNJWkUpOwotCWlmIChsID09IE5VTEwgfHwgUHlTdHJpbmdfR0VUX1NJWkUobCkgPT0gMCkgewotCQlQeV9YREVDUkVGKGwpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIChQeU9iamVjdCAqKWw7CisgICAgbCA9IHJlYWRhaGVhZF9nZXRfbGluZV9za2lwKGYsIDAsIFJFQURBSEVBRF9CVUZTSVpFKTsKKyAgICBpZiAobCA9PSBOVUxMIHx8IFB5U3RyaW5nX0dFVF9TSVpFKGwpID09IDApIHsKKyAgICAgICAgUHlfWERFQ1JFRihsKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiAoUHlPYmplY3QgKilsOwogfQogCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmaWxlX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlQeU9iamVjdCAqc2VsZjsKLQlzdGF0aWMgUHlPYmplY3QgKm5vdF95ZXRfc3RyaW5nOworICAgIFB5T2JqZWN0ICpzZWxmOworICAgIHN0YXRpYyBQeU9iamVjdCAqbm90X3lldF9zdHJpbmc7CiAKLQlhc3NlcnQodHlwZSAhPSBOVUxMICYmIHR5cGUtPnRwX2FsbG9jICE9IE5VTEwpOworICAgIGFzc2VydCh0eXBlICE9IE5VTEwgJiYgdHlwZS0+dHBfYWxsb2MgIT0gTlVMTCk7CiAKLQlpZiAobm90X3lldF9zdHJpbmcgPT0gTlVMTCkgewotCQlub3RfeWV0X3N0cmluZyA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIjx1bmluaXRpYWxpemVkIGZpbGU+Iik7Ci0JCWlmIChub3RfeWV0X3N0cmluZyA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChub3RfeWV0X3N0cmluZyA9PSBOVUxMKSB7CisgICAgICAgIG5vdF95ZXRfc3RyaW5nID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiPHVuaW5pdGlhbGl6ZWQgZmlsZT4iKTsKKyAgICAgICAgaWYgKG5vdF95ZXRfc3RyaW5nID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlzZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7Ci0JaWYgKHNlbGYgIT0gTlVMTCkgewotCQkvKiBBbHdheXMgZmlsbCBpbiB0aGUgbmFtZSBhbmQgbW9kZSwgc28gdGhhdCBub2JvZHkgZWxzZQotCQkgICBuZWVkcyB0byBzcGVjaWFsLWNhc2UgTlVMTHMgdGhlcmUuICovCi0JCVB5X0lOQ1JFRihub3RfeWV0X3N0cmluZyk7Ci0JCSgoUHlGaWxlT2JqZWN0ICopc2VsZiktPmZfbmFtZSA9IG5vdF95ZXRfc3RyaW5nOwotCQlQeV9JTkNSRUYobm90X3lldF9zdHJpbmcpOwotCQkoKFB5RmlsZU9iamVjdCAqKXNlbGYpLT5mX21vZGUgPSBub3RfeWV0X3N0cmluZzsKLQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQkoKFB5RmlsZU9iamVjdCAqKXNlbGYpLT5mX2VuY29kaW5nID0gUHlfTm9uZTsKLQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQkoKFB5RmlsZU9iamVjdCAqKXNlbGYpLT5mX2Vycm9ycyA9IFB5X05vbmU7Ci0JCSgoUHlGaWxlT2JqZWN0ICopc2VsZiktPndlYWtyZWZsaXN0ID0gTlVMTDsKLQkJKChQeUZpbGVPYmplY3QgKilzZWxmKS0+dW5sb2NrZWRfY291bnQgPSAwOwotCX0KLQlyZXR1cm4gc2VsZjsKKyAgICBzZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7CisgICAgaWYgKHNlbGYgIT0gTlVMTCkgeworICAgICAgICAvKiBBbHdheXMgZmlsbCBpbiB0aGUgbmFtZSBhbmQgbW9kZSwgc28gdGhhdCBub2JvZHkgZWxzZQorICAgICAgICAgICBuZWVkcyB0byBzcGVjaWFsLWNhc2UgTlVMTHMgdGhlcmUuICovCisgICAgICAgIFB5X0lOQ1JFRihub3RfeWV0X3N0cmluZyk7CisgICAgICAgICgoUHlGaWxlT2JqZWN0ICopc2VsZiktPmZfbmFtZSA9IG5vdF95ZXRfc3RyaW5nOworICAgICAgICBQeV9JTkNSRUYobm90X3lldF9zdHJpbmcpOworICAgICAgICAoKFB5RmlsZU9iamVjdCAqKXNlbGYpLT5mX21vZGUgPSBub3RfeWV0X3N0cmluZzsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICAoKFB5RmlsZU9iamVjdCAqKXNlbGYpLT5mX2VuY29kaW5nID0gUHlfTm9uZTsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICAoKFB5RmlsZU9iamVjdCAqKXNlbGYpLT5mX2Vycm9ycyA9IFB5X05vbmU7CisgICAgICAgICgoUHlGaWxlT2JqZWN0ICopc2VsZiktPndlYWtyZWZsaXN0ID0gTlVMTDsKKyAgICAgICAgKChQeUZpbGVPYmplY3QgKilzZWxmKS0+dW5sb2NrZWRfY291bnQgPSAwOworICAgIH0KKyAgICByZXR1cm4gc2VsZjsKIH0KIAogc3RhdGljIGludAogZmlsZV9pbml0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JUHlGaWxlT2JqZWN0ICpmb3NlbGYgPSAoUHlGaWxlT2JqZWN0ICopc2VsZjsKLQlpbnQgcmV0ID0gMDsKLQlzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7Im5hbWUiLCAibW9kZSIsICJidWZmZXJpbmciLCAwfTsKLQljaGFyICpuYW1lID0gTlVMTDsKLQljaGFyICptb2RlID0gInIiOwotCWludCBidWZzaXplID0gLTE7Ci0JaW50IHdpZGVhcmd1bWVudCA9IDA7CisgICAgUHlGaWxlT2JqZWN0ICpmb3NlbGYgPSAoUHlGaWxlT2JqZWN0ICopc2VsZjsKKyAgICBpbnQgcmV0ID0gMDsKKyAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7Im5hbWUiLCAibW9kZSIsICJidWZmZXJpbmciLCAwfTsKKyAgICBjaGFyICpuYW1lID0gTlVMTDsKKyAgICBjaGFyICptb2RlID0gInIiOworICAgIGludCBidWZzaXplID0gLTE7CisgICAgaW50IHdpZGVhcmd1bWVudCA9IDA7CiAKLQlhc3NlcnQoUHlGaWxlX0NoZWNrKHNlbGYpKTsKLQlpZiAoZm9zZWxmLT5mX2ZwICE9IE5VTEwpIHsKLQkJLyogSGF2ZSB0byBjbG9zZSB0aGUgZXhpc3RpbmcgZmlsZSBmaXJzdC4gKi8KLQkJUHlPYmplY3QgKmNsb3NlcmVzdWx0ID0gZmlsZV9jbG9zZShmb3NlbGYpOwotCQlpZiAoY2xvc2VyZXN1bHQgPT0gTlVMTCkKLQkJCXJldHVybiAtMTsKLQkJUHlfREVDUkVGKGNsb3NlcmVzdWx0KTsKLQl9CisgICAgYXNzZXJ0KFB5RmlsZV9DaGVjayhzZWxmKSk7CisgICAgaWYgKGZvc2VsZi0+Zl9mcCAhPSBOVUxMKSB7CisgICAgICAgIC8qIEhhdmUgdG8gY2xvc2UgdGhlIGV4aXN0aW5nIGZpbGUgZmlyc3QuICovCisgICAgICAgIFB5T2JqZWN0ICpjbG9zZXJlc3VsdCA9IGZpbGVfY2xvc2UoZm9zZWxmKTsKKyAgICAgICAgaWYgKGNsb3NlcmVzdWx0ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIFB5X0RFQ1JFRihjbG9zZXJlc3VsdCk7CisgICAgfQogCiAjaWZkZWYgUHlfV0lOX1dJREVfRklMRU5BTUVTCi0JaWYgKEdldFZlcnNpb24oKSA8IDB4ODAwMDAwMDApIHsgICAgLyogT24gTlQsIHNvIHdpZGUgQVBJIGF2YWlsYWJsZSAqLwotCQlQeU9iamVjdCAqcG87Ci0JCWlmIChQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgIlV8c2k6ZmlsZSIsCi0JCQkJCQlrd2xpc3QsICZwbywgJm1vZGUsICZidWZzaXplKSkgewotCQkJd2lkZWFyZ3VtZW50ID0gMTsKLQkJCWlmIChmaWxsX2ZpbGVfZmllbGRzKGZvc2VsZiwgTlVMTCwgcG8sIG1vZGUsCi0JCQkJCSAgICAgZmNsb3NlKSA9PSBOVUxMKQotCQkJCWdvdG8gRXJyb3I7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBEcm9wIHRoZSBhcmd1bWVudCBwYXJzaW5nIGVycm9yIGFzIG5hcnJvdwotCQkJICAgc3RyaW5ncyBhcmUgYWxzbyB2YWxpZC4gKi8KLQkJCVB5RXJyX0NsZWFyKCk7Ci0JCX0KLQl9CisgICAgaWYgKEdldFZlcnNpb24oKSA8IDB4ODAwMDAwMDApIHsgICAgLyogT24gTlQsIHNvIHdpZGUgQVBJIGF2YWlsYWJsZSAqLworICAgICAgICBQeU9iamVjdCAqcG87CisgICAgICAgIGlmIChQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgIlV8c2k6ZmlsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3dsaXN0LCAmcG8sICZtb2RlLCAmYnVmc2l6ZSkpIHsKKyAgICAgICAgICAgIHdpZGVhcmd1bWVudCA9IDE7CisgICAgICAgICAgICBpZiAoZmlsbF9maWxlX2ZpZWxkcyhmb3NlbGYsIE5VTEwsIHBvLCBtb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmNsb3NlKSA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGdvdG8gRXJyb3I7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBEcm9wIHRoZSBhcmd1bWVudCBwYXJzaW5nIGVycm9yIGFzIG5hcnJvdworICAgICAgICAgICAgICAgc3RyaW5ncyBhcmUgYWxzbyB2YWxpZC4gKi8KKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIH0KKyAgICB9CiAjZW5kaWYKIAotCWlmICghd2lkZWFyZ3VtZW50KSB7Ci0gICAgICAgICAgICAgICAgUHlPYmplY3QgKm9fbmFtZTsKKyAgICBpZiAoIXdpZGVhcmd1bWVudCkgeworICAgICAgICBQeU9iamVjdCAqb19uYW1lOwogCi0JCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJldHxzaTpmaWxlIiwga3dsaXN0LAotCQkJCQkJIFB5X0ZpbGVTeXN0ZW1EZWZhdWx0RW5jb2RpbmcsCi0JCQkJCQkgJm5hbWUsCi0JCQkJCQkgJm1vZGUsICZidWZzaXplKSkKLQkJCXJldHVybiAtMTsKKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgImV0fHNpOmZpbGUiLCBrd2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X0ZpbGVTeXN0ZW1EZWZhdWx0RW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbW9kZSwgJmJ1ZnNpemUpKQorICAgICAgICAgICAgcmV0dXJuIC0xOwogCi0gICAgICAgICAgICAgICAgLyogV2UgcGFyc2UgYWdhaW4gdG8gZ2V0IHRoZSBuYW1lIGFzIGEgUHlPYmplY3QgKi8KLSAgICAgICAgICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAiT3xzaTpmaWxlIiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3dsaXN0LCAmb19uYW1lLCAmbW9kZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ1ZnNpemUpKQotICAgICAgICAgICAgICAgICAgICAgICAgZ290byBFcnJvcjsKKyAgICAgICAgLyogV2UgcGFyc2UgYWdhaW4gdG8gZ2V0IHRoZSBuYW1lIGFzIGEgUHlPYmplY3QgKi8KKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgIk98c2k6ZmlsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGt3bGlzdCwgJm9fbmFtZSwgJm1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZidWZzaXplKSkKKyAgICAgICAgICAgIGdvdG8gRXJyb3I7CiAKLQkJaWYgKGZpbGxfZmlsZV9maWVsZHMoZm9zZWxmLCBOVUxMLCBvX25hbWUsIG1vZGUsCi0JCQkJICAgICBmY2xvc2UpID09IE5VTEwpCi0JCQlnb3RvIEVycm9yOwotCX0KLQlpZiAob3Blbl90aGVfZmlsZShmb3NlbGYsIG5hbWUsIG1vZGUpID09IE5VTEwpCi0JCWdvdG8gRXJyb3I7Ci0JZm9zZWxmLT5mX3NldGJ1ZiA9IE5VTEw7Ci0JUHlGaWxlX1NldEJ1ZlNpemUoc2VsZiwgYnVmc2l6ZSk7Ci0JZ290byBEb25lOworICAgICAgICBpZiAoZmlsbF9maWxlX2ZpZWxkcyhmb3NlbGYsIE5VTEwsIG9fbmFtZSwgbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmNsb3NlKSA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBFcnJvcjsKKyAgICB9CisgICAgaWYgKG9wZW5fdGhlX2ZpbGUoZm9zZWxmLCBuYW1lLCBtb2RlKSA9PSBOVUxMKQorICAgICAgICBnb3RvIEVycm9yOworICAgIGZvc2VsZi0+Zl9zZXRidWYgPSBOVUxMOworICAgIFB5RmlsZV9TZXRCdWZTaXplKHNlbGYsIGJ1ZnNpemUpOworICAgIGdvdG8gRG9uZTsKIAogRXJyb3I6Ci0JcmV0ID0gLTE7Ci0JLyogZmFsbCB0aHJvdWdoICovCisgICAgcmV0ID0gLTE7CisgICAgLyogZmFsbCB0aHJvdWdoICovCiBEb25lOgotCVB5TWVtX0ZyZWUobmFtZSk7IC8qIGZyZWUgdGhlIGVuY29kZWQgc3RyaW5nICovCi0JcmV0dXJuIHJldDsKKyAgICBQeU1lbV9GcmVlKG5hbWUpOyAvKiBmcmVlIHRoZSBlbmNvZGVkIHN0cmluZyAqLworICAgIHJldHVybiByZXQ7CiB9CiAKIFB5RG9jX1ZBUihmaWxlX2RvYykgPQpAQCAtMjI3Myw0NiArMjI3Myw0NiBAQAogKTsKIAogUHlUeXBlT2JqZWN0IFB5RmlsZV9UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCi0JImZpbGUiLAotCXNpemVvZihQeUZpbGVPYmplY3QpLAotCTAsCi0JKGRlc3RydWN0b3IpZmlsZV9kZWFsbG9jLAkJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJIAkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJIAkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9jb21wYXJlICovCi0JKHJlcHJmdW5jKWZpbGVfcmVwciwgCQkJLyogdHBfcmVwciAqLwotCTAsCQkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCQkvKiB0cF9nZXRhdHRybyAqLwotCS8qIHNvZnRzcGFjZSBpcyB3cml0YWJsZTogIHdlIG11c3Qgc3VwcGx5IHRwX3NldGF0dHJvICovCi0JUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFIHwgUHlfVFBGTEFHU19IQVZFX1dFQUtSRUZTLCAvKiB0cF9mbGFncyAqLwotCWZpbGVfZG9jLAkJCQkvKiB0cF9kb2MgKi8KLQkwLAkJCQkJLyogdHBfdHJhdmVyc2UgKi8KLQkwLAkJCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQlvZmZzZXRvZihQeUZpbGVPYmplY3QsIHdlYWtyZWZsaXN0KSwJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQkoZ2V0aXRlcmZ1bmMpZmlsZV9zZWxmLAkJCS8qIHRwX2l0ZXIgKi8KLQkoaXRlcm5leHRmdW5jKWZpbGVfaXRlcm5leHQsCQkvKiB0cF9pdGVybmV4dCAqLwotCWZpbGVfbWV0aG9kcywJCQkJLyogdHBfbWV0aG9kcyAqLwotCWZpbGVfbWVtYmVybGlzdCwJCQkvKiB0cF9tZW1iZXJzICovCi0JZmlsZV9nZXRzZXRsaXN0LAkJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJCS8qIHRwX2RpY3QgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCi0JZmlsZV9pbml0LAkJCQkvKiB0cF9pbml0ICovCi0JUHlUeXBlX0dlbmVyaWNBbGxvYywJCQkvKiB0cF9hbGxvYyAqLwotCWZpbGVfbmV3LAkJCQkvKiB0cF9uZXcgKi8KLQlQeU9iamVjdF9EZWwsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCisgICAgImZpbGUiLAorICAgIHNpemVvZihQeUZpbGVPYmplY3QpLAorICAgIDAsCisgICAgKGRlc3RydWN0b3IpZmlsZV9kZWFsbG9jLCAgICAgICAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIChyZXByZnVuYylmaWxlX3JlcHIsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIC8qIHNvZnRzcGFjZSBpcyB3cml0YWJsZTogIHdlIG11c3Qgc3VwcGx5IHRwX3NldGF0dHJvICovCisgICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19CQVNFVFlQRSB8IFB5X1RQRkxBR1NfSEFWRV9XRUFLUkVGUywgLyogdHBfZmxhZ3MgKi8KKyAgICBmaWxlX2RvYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIG9mZnNldG9mKFB5RmlsZU9iamVjdCwgd2Vha3JlZmxpc3QpLCAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAoZ2V0aXRlcmZ1bmMpZmlsZV9zZWxmLCAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAoaXRlcm5leHRmdW5jKWZpbGVfaXRlcm5leHQsICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgZmlsZV9tZXRob2RzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgZmlsZV9tZW1iZXJsaXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgZmlsZV9nZXRzZXRsaXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgZmlsZV9pbml0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgUHlUeXBlX0dlbmVyaWNBbGxvYywgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIGZpbGVfbmV3LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgUHlPYmplY3RfRGVsLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KIH07CiAKIC8qIEludGVyZmFjZSBmb3IgdGhlICdzb2Z0IHNwYWNlJyBiZXR3ZWVuIHByaW50IGl0ZW1zLiAqLwpAQCAtMjMyMCwzNSArMjMyMCwzNSBAQAogaW50CiBQeUZpbGVfU29mdFNwYWNlKFB5T2JqZWN0ICpmLCBpbnQgbmV3ZmxhZykKIHsKLQlsb25nIG9sZGZsYWcgPSAwOwotCWlmIChmID09IE5VTEwpIHsKLQkJLyogRG8gbm90aGluZyAqLwotCX0KLQllbHNlIGlmIChQeUZpbGVfQ2hlY2soZikpIHsKLQkJb2xkZmxhZyA9ICgoUHlGaWxlT2JqZWN0ICopZiktPmZfc29mdHNwYWNlOwotCQkoKFB5RmlsZU9iamVjdCAqKWYpLT5mX3NvZnRzcGFjZSA9IG5ld2ZsYWc7Ci0JfQotCWVsc2UgewotCQlQeU9iamVjdCAqdjsKLQkJdiA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoZiwgInNvZnRzcGFjZSIpOwotCQlpZiAodiA9PSBOVUxMKQotCQkJUHlFcnJfQ2xlYXIoKTsKLQkJZWxzZSB7Ci0JCQlpZiAoUHlJbnRfQ2hlY2sodikpCi0JCQkJb2xkZmxhZyA9IFB5SW50X0FzTG9uZyh2KTsKLQkJCWFzc2VydChvbGRmbGFnIDwgSU5UX01BWCk7Ci0JCQlQeV9ERUNSRUYodik7Ci0JCX0KLQkJdiA9IFB5SW50X0Zyb21Mb25nKChsb25nKW5ld2ZsYWcpOwotCQlpZiAodiA9PSBOVUxMKQotCQkJUHlFcnJfQ2xlYXIoKTsKLQkJZWxzZSB7Ci0JCQlpZiAoUHlPYmplY3RfU2V0QXR0clN0cmluZyhmLCAic29mdHNwYWNlIiwgdikgIT0gMCkKLQkJCQlQeUVycl9DbGVhcigpOwotCQkJUHlfREVDUkVGKHYpOwotCQl9Ci0JfQotCXJldHVybiAoaW50KW9sZGZsYWc7CisgICAgbG9uZyBvbGRmbGFnID0gMDsKKyAgICBpZiAoZiA9PSBOVUxMKSB7CisgICAgICAgIC8qIERvIG5vdGhpbmcgKi8KKyAgICB9CisgICAgZWxzZSBpZiAoUHlGaWxlX0NoZWNrKGYpKSB7CisgICAgICAgIG9sZGZsYWcgPSAoKFB5RmlsZU9iamVjdCAqKWYpLT5mX3NvZnRzcGFjZTsKKyAgICAgICAgKChQeUZpbGVPYmplY3QgKilmKS0+Zl9zb2Z0c3BhY2UgPSBuZXdmbGFnOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgUHlPYmplY3QgKnY7CisgICAgICAgIHYgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKGYsICJzb2Z0c3BhY2UiKTsKKyAgICAgICAgaWYgKHYgPT0gTlVMTCkKKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKFB5SW50X0NoZWNrKHYpKQorICAgICAgICAgICAgICAgIG9sZGZsYWcgPSBQeUludF9Bc0xvbmcodik7CisgICAgICAgICAgICBhc3NlcnQob2xkZmxhZyA8IElOVF9NQVgpOworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICB9CisgICAgICAgIHYgPSBQeUludF9Gcm9tTG9uZygobG9uZyluZXdmbGFnKTsKKyAgICAgICAgaWYgKHYgPT0gTlVMTCkKKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKFB5T2JqZWN0X1NldEF0dHJTdHJpbmcoZiwgInNvZnRzcGFjZSIsIHYpICE9IDApCisgICAgICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gKGludClvbGRmbGFnOwogfQogCiAvKiBJbnRlcmZhY2VzIHRvIHdyaXRlIG9iamVjdHMvc3RyaW5ncyB0byBmaWxlLWxpa2Ugb2JqZWN0cyAqLwpAQCAtMjM1NiwxMDcgKzIzNTYsMTA3IEBACiBpbnQKIFB5RmlsZV9Xcml0ZU9iamVjdChQeU9iamVjdCAqdiwgUHlPYmplY3QgKmYsIGludCBmbGFncykKIHsKLQlQeU9iamVjdCAqd3JpdGVyLCAqdmFsdWUsICphcmdzLCAqcmVzdWx0OwotCWlmIChmID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIndyaXRlb2JqZWN0IHdpdGggTlVMTCBmaWxlIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JZWxzZSBpZiAoUHlGaWxlX0NoZWNrKGYpKSB7Ci0JCVB5RmlsZU9iamVjdCAqZm9iaiA9IChQeUZpbGVPYmplY3QgKikgZjsKKyAgICBQeU9iamVjdCAqd3JpdGVyLCAqdmFsdWUsICphcmdzLCAqcmVzdWx0OworICAgIGlmIChmID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIndyaXRlb2JqZWN0IHdpdGggTlVMTCBmaWxlIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgZWxzZSBpZiAoUHlGaWxlX0NoZWNrKGYpKSB7CisgICAgICAgIFB5RmlsZU9iamVjdCAqZm9iaiA9IChQeUZpbGVPYmplY3QgKikgZjsKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JCVB5T2JqZWN0ICplbmMgPSBmb2JqLT5mX2VuY29kaW5nOwotCQlpbnQgcmVzdWx0OworICAgICAgICBQeU9iamVjdCAqZW5jID0gZm9iai0+Zl9lbmNvZGluZzsKKyAgICAgICAgaW50IHJlc3VsdDsKICNlbmRpZgotCQlpZiAoZm9iai0+Zl9mcCA9PSBOVUxMKSB7Ci0JCQllcnJfY2xvc2VkKCk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KKyAgICAgICAgaWYgKGZvYmotPmZfZnAgPT0gTlVMTCkgeworICAgICAgICAgICAgZXJyX2Nsb3NlZCgpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotICAgICAgICAgICAgICAgIGlmICgoZmxhZ3MgJiBQeV9QUklOVF9SQVcpICYmCi0JCSAgICBQeVVuaWNvZGVfQ2hlY2sodikgJiYgZW5jICE9IFB5X05vbmUpIHsKLQkJCWNoYXIgKmNlbmMgPSBQeVN0cmluZ19BU19TVFJJTkcoZW5jKTsKLQkJCWNoYXIgKmVycm9ycyA9IGZvYmotPmZfZXJyb3JzID09IFB5X05vbmUgPyAKLQkJCSAgInN0cmljdCIgOiBQeVN0cmluZ19BU19TVFJJTkcoZm9iai0+Zl9lcnJvcnMpOwotCQkJdmFsdWUgPSBQeVVuaWNvZGVfQXNFbmNvZGVkU3RyaW5nKHYsIGNlbmMsIGVycm9ycyk7Ci0JCQlpZiAodmFsdWUgPT0gTlVMTCkKLQkJCQlyZXR1cm4gLTE7Ci0JCX0gZWxzZSB7Ci0JCQl2YWx1ZSA9IHY7Ci0JCQlQeV9JTkNSRUYodmFsdWUpOwotCQl9Ci0JCXJlc3VsdCA9IGZpbGVfUHlPYmplY3RfUHJpbnQodmFsdWUsIGZvYmosIGZsYWdzKTsKLQkJUHlfREVDUkVGKHZhbHVlKTsKLQkJcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgaWYgKChmbGFncyAmIFB5X1BSSU5UX1JBVykgJiYKKyAgICAgICAgICAgIFB5VW5pY29kZV9DaGVjayh2KSAmJiBlbmMgIT0gUHlfTm9uZSkgeworICAgICAgICAgICAgY2hhciAqY2VuYyA9IFB5U3RyaW5nX0FTX1NUUklORyhlbmMpOworICAgICAgICAgICAgY2hhciAqZXJyb3JzID0gZm9iai0+Zl9lcnJvcnMgPT0gUHlfTm9uZSA/CisgICAgICAgICAgICAgICJzdHJpY3QiIDogUHlTdHJpbmdfQVNfU1RSSU5HKGZvYmotPmZfZXJyb3JzKTsKKyAgICAgICAgICAgIHZhbHVlID0gUHlVbmljb2RlX0FzRW5jb2RlZFN0cmluZyh2LCBjZW5jLCBlcnJvcnMpOworICAgICAgICAgICAgaWYgKHZhbHVlID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdmFsdWUgPSB2OworICAgICAgICAgICAgUHlfSU5DUkVGKHZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQgPSBmaWxlX1B5T2JqZWN0X1ByaW50KHZhbHVlLCBmb2JqLCBmbGFncyk7CisgICAgICAgIFB5X0RFQ1JFRih2YWx1ZSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CiAjZWxzZQotCQlyZXR1cm4gZmlsZV9QeU9iamVjdF9QcmludCh2LCBmb2JqLCBmbGFncyk7CisgICAgICAgIHJldHVybiBmaWxlX1B5T2JqZWN0X1ByaW50KHYsIGZvYmosIGZsYWdzKTsKICNlbmRpZgotCX0KLQl3cml0ZXIgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKGYsICJ3cml0ZSIpOwotCWlmICh3cml0ZXIgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCWlmIChmbGFncyAmIFB5X1BSSU5UX1JBVykgewotICAgICAgICAgICAgICAgIGlmIChQeVVuaWNvZGVfQ2hlY2sodikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdjsKLSAgICAgICAgICAgICAgICAgICAgICAgIFB5X0lOQ1JFRih2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IFB5T2JqZWN0X1N0cih2KTsKLQl9Ci0gICAgICAgIGVsc2UKLQkJdmFsdWUgPSBQeU9iamVjdF9SZXByKHYpOwotCWlmICh2YWx1ZSA9PSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRih3cml0ZXIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWFyZ3MgPSBQeVR1cGxlX1BhY2soMSwgdmFsdWUpOwotCWlmIChhcmdzID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKHZhbHVlKTsKLQkJUHlfREVDUkVGKHdyaXRlcik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JcmVzdWx0ID0gUHlFdmFsX0NhbGxPYmplY3Qod3JpdGVyLCBhcmdzKTsKLQlQeV9ERUNSRUYoYXJncyk7Ci0JUHlfREVDUkVGKHZhbHVlKTsKLQlQeV9ERUNSRUYod3JpdGVyKTsKLQlpZiAocmVzdWx0ID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQlQeV9ERUNSRUYocmVzdWx0KTsKLQlyZXR1cm4gMDsKKyAgICB9CisgICAgd3JpdGVyID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhmLCAid3JpdGUiKTsKKyAgICBpZiAod3JpdGVyID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAoZmxhZ3MgJiBQeV9QUklOVF9SQVcpIHsKKyAgICAgICAgaWYgKFB5VW5pY29kZV9DaGVjayh2KSkgeworICAgICAgICAgICAgdmFsdWUgPSB2OworICAgICAgICAgICAgUHlfSU5DUkVGKHZhbHVlKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICB2YWx1ZSA9IFB5T2JqZWN0X1N0cih2KTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICB2YWx1ZSA9IFB5T2JqZWN0X1JlcHIodik7CisgICAgaWYgKHZhbHVlID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKHdyaXRlcik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgYXJncyA9IFB5VHVwbGVfUGFjaygxLCB2YWx1ZSk7CisgICAgaWYgKGFyZ3MgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYodmFsdWUpOworICAgICAgICBQeV9ERUNSRUYod3JpdGVyKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXN1bHQgPSBQeUV2YWxfQ2FsbE9iamVjdCh3cml0ZXIsIGFyZ3MpOworICAgIFB5X0RFQ1JFRihhcmdzKTsKKyAgICBQeV9ERUNSRUYodmFsdWUpOworICAgIFB5X0RFQ1JFRih3cml0ZXIpOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgIHJldHVybiAwOwogfQogCiBpbnQKIFB5RmlsZV9Xcml0ZVN0cmluZyhjb25zdCBjaGFyICpzLCBQeU9iamVjdCAqZikKIHsKIAotCWlmIChmID09IE5VTEwpIHsKLQkJLyogU2hvdWxkIGJlIGNhdXNlZCBieSBhIHByZS1leGlzdGluZyBlcnJvciAqLwotCQlpZiAoIVB5RXJyX09jY3VycmVkKCkpCi0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCi0JCQkJCSJudWxsIGZpbGUgZm9yIFB5RmlsZV9Xcml0ZVN0cmluZyIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWVsc2UgaWYgKFB5RmlsZV9DaGVjayhmKSkgewotCQlQeUZpbGVPYmplY3QgKmZvYmogPSAoUHlGaWxlT2JqZWN0ICopIGY7Ci0JCUZJTEUgKmZwID0gUHlGaWxlX0FzRmlsZShmKTsKLQkJaWYgKGZwID09IE5VTEwpIHsKLQkJCWVycl9jbG9zZWQoKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlGSUxFX0JFR0lOX0FMTE9XX1RIUkVBRFMoZm9iaikKLQkJZnB1dHMocywgZnApOwotCQlGSUxFX0VORF9BTExPV19USFJFQURTKGZvYmopCi0JCXJldHVybiAwOwotCX0KLQllbHNlIGlmICghUHlFcnJfT2NjdXJyZWQoKSkgewotCQlQeU9iamVjdCAqdiA9IFB5U3RyaW5nX0Zyb21TdHJpbmcocyk7Ci0JCWludCBlcnI7Ci0JCWlmICh2ID09IE5VTEwpCi0JCQlyZXR1cm4gLTE7Ci0JCWVyciA9IFB5RmlsZV9Xcml0ZU9iamVjdCh2LCBmLCBQeV9QUklOVF9SQVcpOwotCQlQeV9ERUNSRUYodik7Ci0JCXJldHVybiBlcnI7Ci0JfQotCWVsc2UKLQkJcmV0dXJuIC0xOworICAgIGlmIChmID09IE5VTEwpIHsKKyAgICAgICAgLyogU2hvdWxkIGJlIGNhdXNlZCBieSBhIHByZS1leGlzdGluZyBlcnJvciAqLworICAgICAgICBpZiAoIVB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm51bGwgZmlsZSBmb3IgUHlGaWxlX1dyaXRlU3RyaW5nIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgZWxzZSBpZiAoUHlGaWxlX0NoZWNrKGYpKSB7CisgICAgICAgIFB5RmlsZU9iamVjdCAqZm9iaiA9IChQeUZpbGVPYmplY3QgKikgZjsKKyAgICAgICAgRklMRSAqZnAgPSBQeUZpbGVfQXNGaWxlKGYpOworICAgICAgICBpZiAoZnAgPT0gTlVMTCkgeworICAgICAgICAgICAgZXJyX2Nsb3NlZCgpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIEZJTEVfQkVHSU5fQUxMT1dfVEhSRUFEUyhmb2JqKQorICAgICAgICBmcHV0cyhzLCBmcCk7CisgICAgICAgIEZJTEVfRU5EX0FMTE9XX1RIUkVBRFMoZm9iaikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGVsc2UgaWYgKCFQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgIFB5T2JqZWN0ICp2ID0gUHlTdHJpbmdfRnJvbVN0cmluZyhzKTsKKyAgICAgICAgaW50IGVycjsKKyAgICAgICAgaWYgKHYgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgZXJyID0gUHlGaWxlX1dyaXRlT2JqZWN0KHYsIGYsIFB5X1BSSU5UX1JBVyk7CisgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXR1cm4gLTE7CiB9CiAKIC8qIFRyeSB0byBnZXQgYSBmaWxlLWRlc2NyaXB0b3IgZnJvbSBhIFB5dGhvbiBvYmplY3QuICBJZiB0aGUgb2JqZWN0CkBAIC0yNDY4LDUwICsyNDY4LDUwIEBACiAKIGludCBQeU9iamVjdF9Bc0ZpbGVEZXNjcmlwdG9yKFB5T2JqZWN0ICpvKQogewotCWludCBmZDsKLQlQeU9iamVjdCAqbWV0aDsKKyAgICBpbnQgZmQ7CisgICAgUHlPYmplY3QgKm1ldGg7CiAKLQlpZiAoUHlJbnRfQ2hlY2sobykpIHsKLQkJZmQgPSBQeUludF9Bc0xvbmcobyk7Ci0JfQotCWVsc2UgaWYgKFB5TG9uZ19DaGVjayhvKSkgewotCQlmZCA9IFB5TG9uZ19Bc0xvbmcobyk7Ci0JfQotCWVsc2UgaWYgKChtZXRoID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhvLCAiZmlsZW5vIikpICE9IE5VTEwpCi0JewotCQlQeU9iamVjdCAqZm5vID0gUHlFdmFsX0NhbGxPYmplY3QobWV0aCwgTlVMTCk7Ci0JCVB5X0RFQ1JFRihtZXRoKTsKLQkJaWYgKGZubyA9PSBOVUxMKQotCQkJcmV0dXJuIC0xOworICAgIGlmIChQeUludF9DaGVjayhvKSkgeworICAgICAgICBmZCA9IFB5SW50X0FzTG9uZyhvKTsKKyAgICB9CisgICAgZWxzZSBpZiAoUHlMb25nX0NoZWNrKG8pKSB7CisgICAgICAgIGZkID0gUHlMb25nX0FzTG9uZyhvKTsKKyAgICB9CisgICAgZWxzZSBpZiAoKG1ldGggPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKG8sICJmaWxlbm8iKSkgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIFB5T2JqZWN0ICpmbm8gPSBQeUV2YWxfQ2FsbE9iamVjdChtZXRoLCBOVUxMKTsKKyAgICAgICAgUHlfREVDUkVGKG1ldGgpOworICAgICAgICBpZiAoZm5vID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gLTE7CiAKLQkJaWYgKFB5SW50X0NoZWNrKGZubykpIHsKLQkJCWZkID0gUHlJbnRfQXNMb25nKGZubyk7Ci0JCQlQeV9ERUNSRUYoZm5vKTsKLQkJfQotCQllbHNlIGlmIChQeUxvbmdfQ2hlY2soZm5vKSkgewotCQkJZmQgPSBQeUxvbmdfQXNMb25nKGZubyk7Ci0JCQlQeV9ERUNSRUYoZm5vKTsKLQkJfQotCQllbHNlIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJCSJmaWxlbm8oKSByZXR1cm5lZCBhIG5vbi1pbnRlZ2VyIik7Ci0JCQlQeV9ERUNSRUYoZm5vKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCX0KLQllbHNlIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiYXJndW1lbnQgbXVzdCBiZSBhbiBpbnQsIG9yIGhhdmUgYSBmaWxlbm8oKSBtZXRob2QuIik7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgICAgIGlmIChQeUludF9DaGVjayhmbm8pKSB7CisgICAgICAgICAgICBmZCA9IFB5SW50X0FzTG9uZyhmbm8pOworICAgICAgICAgICAgUHlfREVDUkVGKGZubyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoUHlMb25nX0NoZWNrKGZubykpIHsKKyAgICAgICAgICAgIGZkID0gUHlMb25nX0FzTG9uZyhmbm8pOworICAgICAgICAgICAgUHlfREVDUkVGKGZubyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmaWxlbm8oKSByZXR1cm5lZCBhIG5vbi1pbnRlZ2VyIik7CisgICAgICAgICAgICBQeV9ERUNSRUYoZm5vKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJhcmd1bWVudCBtdXN0IGJlIGFuIGludCwgb3IgaGF2ZSBhIGZpbGVubygpIG1ldGhvZC4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCWlmIChmZCA8IDApIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkgICAgICJmaWxlIGRlc2NyaXB0b3IgY2Fubm90IGJlIGEgbmVnYXRpdmUgaW50ZWdlciAoJWkpIiwKLQkJCSAgICAgZmQpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXJldHVybiBmZDsKKyAgICBpZiAoZmQgPCAwKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgImZpbGUgZGVzY3JpcHRvciBjYW5ub3QgYmUgYSBuZWdhdGl2ZSBpbnRlZ2VyICglaSkiLAorICAgICAgICAgICAgICAgICAgICAgZmQpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiBmZDsKIH0KIAogLyogRnJvbSBoZXJlIG9uIHdlIG5lZWQgYWNjZXNzIHRvIHRoZSByZWFsIGZnZXRzIGFuZCBmcmVhZCAqLwpAQCAtMjUzNSw3OSArMjUzNSw3OSBAQAogY2hhciAqCiBQeV9Vbml2ZXJzYWxOZXdsaW5lRmdldHMoY2hhciAqYnVmLCBpbnQgbiwgRklMRSAqc3RyZWFtLCBQeU9iamVjdCAqZm9iaikKIHsKLQljaGFyICpwID0gYnVmOwotCWludCBjOwotCWludCBuZXdsaW5ldHlwZXMgPSAwOwotCWludCBza2lwbmV4dGxmID0gMDsKLQlpbnQgdW5pdl9uZXdsaW5lID0gMTsKKyAgICBjaGFyICpwID0gYnVmOworICAgIGludCBjOworICAgIGludCBuZXdsaW5ldHlwZXMgPSAwOworICAgIGludCBza2lwbmV4dGxmID0gMDsKKyAgICBpbnQgdW5pdl9uZXdsaW5lID0gMTsKIAotCWlmIChmb2JqKSB7Ci0JCWlmICghUHlGaWxlX0NoZWNrKGZvYmopKSB7Ci0JCQllcnJubyA9IEVOWElPOwkvKiBXaGF0IGNhbiB5b3UgZG8uLi4gKi8KLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCXVuaXZfbmV3bGluZSA9ICgoUHlGaWxlT2JqZWN0ICopZm9iaiktPmZfdW5pdl9uZXdsaW5lOwotCQlpZiAoICF1bml2X25ld2xpbmUgKQotCQkJcmV0dXJuIGZnZXRzKGJ1Ziwgbiwgc3RyZWFtKTsKLQkJbmV3bGluZXR5cGVzID0gKChQeUZpbGVPYmplY3QgKilmb2JqKS0+Zl9uZXdsaW5ldHlwZXM7Ci0JCXNraXBuZXh0bGYgPSAoKFB5RmlsZU9iamVjdCAqKWZvYmopLT5mX3NraXBuZXh0bGY7Ci0JfQotCUZMT0NLRklMRShzdHJlYW0pOwotCWMgPSAneCc7IC8qIFNodXQgdXAgZ2NjIHdhcm5pbmcgKi8KLQl3aGlsZSAoLS1uID4gMCAmJiAoYyA9IEdFVEMoc3RyZWFtKSkgIT0gRU9GICkgewotCQlpZiAoc2tpcG5leHRsZiApIHsKLQkJCXNraXBuZXh0bGYgPSAwOwotCQkJaWYgKGMgPT0gJ1xuJykgewotCQkJCS8qIFNlZWluZyBhIFxuIGhlcmUgd2l0aCBza2lwbmV4dGxmIHRydWUKLQkJCQkqKiBtZWFucyB3ZSBzYXcgYSBcciBiZWZvcmUuCi0JCQkJKi8KLQkJCQluZXdsaW5ldHlwZXMgfD0gTkVXTElORV9DUkxGOwotCQkJCWMgPSBHRVRDKHN0cmVhbSk7Ci0JCQkJaWYgKGMgPT0gRU9GKSBicmVhazsKLQkJCX0gZWxzZSB7Ci0JCQkJLyoKLQkJCQkqKiBOb3RlIHRoYXQgYyA9PSBFT0YgYWxzbyBicmluZ3MgdXMgaGVyZSwKLQkJCQkqKiBzbyB3ZSdyZSBva2F5IGlmIHRoZSBsYXN0IGNoYXIgaW4gdGhlIGZpbGUKLQkJCQkqKiBpcyBhIENSLgotCQkJCSovCi0JCQkJbmV3bGluZXR5cGVzIHw9IE5FV0xJTkVfQ1I7Ci0JCQl9Ci0JCX0KLQkJaWYgKGMgPT0gJ1xyJykgewotCQkJLyogQSBcciBpcyB0cmFuc2xhdGVkIGludG8gYSBcbiwgYW5kIHdlIHNraXAKLQkJCSoqIGFuIGFkamFjZW50IFxuLCBpZiBhbnkuIFdlIGRvbid0IHNldCB0aGUKLQkJCSoqIG5ld2xpbmV0eXBlcyBmbGFnIHVudGlsIHdlJ3ZlIHNlZW4gdGhlIG5leHQgY2hhci4KLQkJCSovCi0JCQlza2lwbmV4dGxmID0gMTsKLQkJCWMgPSAnXG4nOwotCQl9IGVsc2UgaWYgKCBjID09ICdcbicpIHsKLQkJCW5ld2xpbmV0eXBlcyB8PSBORVdMSU5FX0xGOwotCQl9Ci0JCSpwKysgPSBjOwotCQlpZiAoYyA9PSAnXG4nKSBicmVhazsKLQl9Ci0JaWYgKCBjID09IEVPRiAmJiBza2lwbmV4dGxmICkKLQkJbmV3bGluZXR5cGVzIHw9IE5FV0xJTkVfQ1I7Ci0JRlVOTE9DS0ZJTEUoc3RyZWFtKTsKLQkqcCA9ICdcMCc7Ci0JaWYgKGZvYmopIHsKLQkJKChQeUZpbGVPYmplY3QgKilmb2JqKS0+Zl9uZXdsaW5ldHlwZXMgPSBuZXdsaW5ldHlwZXM7Ci0JCSgoUHlGaWxlT2JqZWN0ICopZm9iaiktPmZfc2tpcG5leHRsZiA9IHNraXBuZXh0bGY7Ci0JfSBlbHNlIGlmICggc2tpcG5leHRsZiApIHsKLQkJLyogSWYgd2UgaGF2ZSBubyBmaWxlIG9iamVjdCB3ZSBjYW5ub3Qgc2F2ZSB0aGUKLQkJKiogc2tpcG5leHRsZiBmbGFnLiBXZSBoYXZlIHRvIHJlYWRhaGVhZCwgd2hpY2gKLQkJKiogd2lsbCBjYXVzZSBhIHBhdXNlIGlmIHdlJ3JlIHJlYWRpbmcgZnJvbSBhbgotCQkqKiBpbnRlcmFjdGl2ZSBzdHJlYW0sIGJ1dCB0aGF0IGlzIHZlcnkgdW5saWtlbHkKLQkJKiogdW5sZXNzIHdlJ3JlIGRvaW5nIHNvbWV0aGluZyBzaWxseSBsaWtlCi0JCSoqIGV4ZWNmaWxlKCIvZGV2L3R0eSIpLgotCQkqLwotCQljID0gR0VUQyhzdHJlYW0pOwotCQlpZiAoIGMgIT0gJ1xuJyApCi0JCQl1bmdldGMoYywgc3RyZWFtKTsKLQl9Ci0JaWYgKHAgPT0gYnVmKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gYnVmOworICAgIGlmIChmb2JqKSB7CisgICAgICAgIGlmICghUHlGaWxlX0NoZWNrKGZvYmopKSB7CisgICAgICAgICAgICBlcnJubyA9IEVOWElPOyAgICAgICAgICAgICAgLyogV2hhdCBjYW4geW91IGRvLi4uICovCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICB1bml2X25ld2xpbmUgPSAoKFB5RmlsZU9iamVjdCAqKWZvYmopLT5mX3VuaXZfbmV3bGluZTsKKyAgICAgICAgaWYgKCAhdW5pdl9uZXdsaW5lICkKKyAgICAgICAgICAgIHJldHVybiBmZ2V0cyhidWYsIG4sIHN0cmVhbSk7CisgICAgICAgIG5ld2xpbmV0eXBlcyA9ICgoUHlGaWxlT2JqZWN0ICopZm9iaiktPmZfbmV3bGluZXR5cGVzOworICAgICAgICBza2lwbmV4dGxmID0gKChQeUZpbGVPYmplY3QgKilmb2JqKS0+Zl9za2lwbmV4dGxmOworICAgIH0KKyAgICBGTE9DS0ZJTEUoc3RyZWFtKTsKKyAgICBjID0gJ3gnOyAvKiBTaHV0IHVwIGdjYyB3YXJuaW5nICovCisgICAgd2hpbGUgKC0tbiA+IDAgJiYgKGMgPSBHRVRDKHN0cmVhbSkpICE9IEVPRiApIHsKKyAgICAgICAgaWYgKHNraXBuZXh0bGYgKSB7CisgICAgICAgICAgICBza2lwbmV4dGxmID0gMDsKKyAgICAgICAgICAgIGlmIChjID09ICdcbicpIHsKKyAgICAgICAgICAgICAgICAvKiBTZWVpbmcgYSBcbiBoZXJlIHdpdGggc2tpcG5leHRsZiB0cnVlCisgICAgICAgICAgICAgICAgKiogbWVhbnMgd2Ugc2F3IGEgXHIgYmVmb3JlLgorICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgbmV3bGluZXR5cGVzIHw9IE5FV0xJTkVfQ1JMRjsKKyAgICAgICAgICAgICAgICBjID0gR0VUQyhzdHJlYW0pOworICAgICAgICAgICAgICAgIGlmIChjID09IEVPRikgYnJlYWs7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgKiogTm90ZSB0aGF0IGMgPT0gRU9GIGFsc28gYnJpbmdzIHVzIGhlcmUsCisgICAgICAgICAgICAgICAgKiogc28gd2UncmUgb2theSBpZiB0aGUgbGFzdCBjaGFyIGluIHRoZSBmaWxlCisgICAgICAgICAgICAgICAgKiogaXMgYSBDUi4KKyAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIG5ld2xpbmV0eXBlcyB8PSBORVdMSU5FX0NSOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChjID09ICdccicpIHsKKyAgICAgICAgICAgIC8qIEEgXHIgaXMgdHJhbnNsYXRlZCBpbnRvIGEgXG4sIGFuZCB3ZSBza2lwCisgICAgICAgICAgICAqKiBhbiBhZGphY2VudCBcbiwgaWYgYW55LiBXZSBkb24ndCBzZXQgdGhlCisgICAgICAgICAgICAqKiBuZXdsaW5ldHlwZXMgZmxhZyB1bnRpbCB3ZSd2ZSBzZWVuIHRoZSBuZXh0IGNoYXIuCisgICAgICAgICAgICAqLworICAgICAgICAgICAgc2tpcG5leHRsZiA9IDE7CisgICAgICAgICAgICBjID0gJ1xuJzsKKyAgICAgICAgfSBlbHNlIGlmICggYyA9PSAnXG4nKSB7CisgICAgICAgICAgICBuZXdsaW5ldHlwZXMgfD0gTkVXTElORV9MRjsKKyAgICAgICAgfQorICAgICAgICAqcCsrID0gYzsKKyAgICAgICAgaWYgKGMgPT0gJ1xuJykgYnJlYWs7CisgICAgfQorICAgIGlmICggYyA9PSBFT0YgJiYgc2tpcG5leHRsZiApCisgICAgICAgIG5ld2xpbmV0eXBlcyB8PSBORVdMSU5FX0NSOworICAgIEZVTkxPQ0tGSUxFKHN0cmVhbSk7CisgICAgKnAgPSAnXDAnOworICAgIGlmIChmb2JqKSB7CisgICAgICAgICgoUHlGaWxlT2JqZWN0ICopZm9iaiktPmZfbmV3bGluZXR5cGVzID0gbmV3bGluZXR5cGVzOworICAgICAgICAoKFB5RmlsZU9iamVjdCAqKWZvYmopLT5mX3NraXBuZXh0bGYgPSBza2lwbmV4dGxmOworICAgIH0gZWxzZSBpZiAoIHNraXBuZXh0bGYgKSB7CisgICAgICAgIC8qIElmIHdlIGhhdmUgbm8gZmlsZSBvYmplY3Qgd2UgY2Fubm90IHNhdmUgdGhlCisgICAgICAgICoqIHNraXBuZXh0bGYgZmxhZy4gV2UgaGF2ZSB0byByZWFkYWhlYWQsIHdoaWNoCisgICAgICAgICoqIHdpbGwgY2F1c2UgYSBwYXVzZSBpZiB3ZSdyZSByZWFkaW5nIGZyb20gYW4KKyAgICAgICAgKiogaW50ZXJhY3RpdmUgc3RyZWFtLCBidXQgdGhhdCBpcyB2ZXJ5IHVubGlrZWx5CisgICAgICAgICoqIHVubGVzcyB3ZSdyZSBkb2luZyBzb21ldGhpbmcgc2lsbHkgbGlrZQorICAgICAgICAqKiBleGVjZmlsZSgiL2Rldi90dHkiKS4KKyAgICAgICAgKi8KKyAgICAgICAgYyA9IEdFVEMoc3RyZWFtKTsKKyAgICAgICAgaWYgKCBjICE9ICdcbicgKQorICAgICAgICAgICAgdW5nZXRjKGMsIHN0cmVhbSk7CisgICAgfQorICAgIGlmIChwID09IGJ1ZikKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIGJ1ZjsKIH0KIAogLyoKQEAgLTI2MjIsNzQgKzI2MjIsNzQgQEAKICovCiBzaXplX3QKIFB5X1VuaXZlcnNhbE5ld2xpbmVGcmVhZChjaGFyICpidWYsIHNpemVfdCBuLAotCQkJIEZJTEUgKnN0cmVhbSwgUHlPYmplY3QgKmZvYmopCisgICAgICAgICAgICAgICAgICAgICAgICAgRklMRSAqc3RyZWFtLCBQeU9iamVjdCAqZm9iaikKIHsKLQljaGFyICpkc3QgPSBidWY7Ci0JUHlGaWxlT2JqZWN0ICpmID0gKFB5RmlsZU9iamVjdCAqKWZvYmo7Ci0JaW50IG5ld2xpbmV0eXBlcywgc2tpcG5leHRsZjsKKyAgICBjaGFyICpkc3QgPSBidWY7CisgICAgUHlGaWxlT2JqZWN0ICpmID0gKFB5RmlsZU9iamVjdCAqKWZvYmo7CisgICAgaW50IG5ld2xpbmV0eXBlcywgc2tpcG5leHRsZjsKIAotCWFzc2VydChidWYgIT0gTlVMTCk7Ci0JYXNzZXJ0KHN0cmVhbSAhPSBOVUxMKTsKKyAgICBhc3NlcnQoYnVmICE9IE5VTEwpOworICAgIGFzc2VydChzdHJlYW0gIT0gTlVMTCk7CiAKLQlpZiAoIWZvYmogfHwgIVB5RmlsZV9DaGVjayhmb2JqKSkgewotCQllcnJubyA9IEVOWElPOwkvKiBXaGF0IGNhbiB5b3UgZG8uLi4gKi8KLQkJcmV0dXJuIDA7Ci0JfQotCWlmICghZi0+Zl91bml2X25ld2xpbmUpCi0JCXJldHVybiBmcmVhZChidWYsIDEsIG4sIHN0cmVhbSk7Ci0JbmV3bGluZXR5cGVzID0gZi0+Zl9uZXdsaW5ldHlwZXM7Ci0Jc2tpcG5leHRsZiA9IGYtPmZfc2tpcG5leHRsZjsKLQkvKiBJbnZhcmlhbnQ6ICBuIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVtYWluaW5nIHRvIGJlIGZpbGxlZAotCSAqIGluIHRoZSBidWZmZXIuCi0JICovCi0Jd2hpbGUgKG4pIHsKLQkJc2l6ZV90IG5yZWFkOwotCQlpbnQgc2hvcnRyZWFkOwotCQljaGFyICpzcmMgPSBkc3Q7CisgICAgaWYgKCFmb2JqIHx8ICFQeUZpbGVfQ2hlY2soZm9iaikpIHsKKyAgICAgICAgZXJybm8gPSBFTlhJTzsgICAgICAgICAgLyogV2hhdCBjYW4geW91IGRvLi4uICovCisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoIWYtPmZfdW5pdl9uZXdsaW5lKQorICAgICAgICByZXR1cm4gZnJlYWQoYnVmLCAxLCBuLCBzdHJlYW0pOworICAgIG5ld2xpbmV0eXBlcyA9IGYtPmZfbmV3bGluZXR5cGVzOworICAgIHNraXBuZXh0bGYgPSBmLT5mX3NraXBuZXh0bGY7CisgICAgLyogSW52YXJpYW50OiAgbiBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlbWFpbmluZyB0byBiZSBmaWxsZWQKKyAgICAgKiBpbiB0aGUgYnVmZmVyLgorICAgICAqLworICAgIHdoaWxlIChuKSB7CisgICAgICAgIHNpemVfdCBucmVhZDsKKyAgICAgICAgaW50IHNob3J0cmVhZDsKKyAgICAgICAgY2hhciAqc3JjID0gZHN0OwogCi0JCW5yZWFkID0gZnJlYWQoZHN0LCAxLCBuLCBzdHJlYW0pOwotCQlhc3NlcnQobnJlYWQgPD0gbik7Ci0JCWlmIChucmVhZCA9PSAwKQotCQkJYnJlYWs7CisgICAgICAgIG5yZWFkID0gZnJlYWQoZHN0LCAxLCBuLCBzdHJlYW0pOworICAgICAgICBhc3NlcnQobnJlYWQgPD0gbik7CisgICAgICAgIGlmIChucmVhZCA9PSAwKQorICAgICAgICAgICAgYnJlYWs7CiAKLQkJbiAtPSBucmVhZDsgLyogYXNzdW1pbmcgMSBieXRlIG91dCBmb3IgZWFjaCBpbjsgd2lsbCBhZGp1c3QgKi8KLQkJc2hvcnRyZWFkID0gbiAhPSAwOwkvKiB0cnVlIGlmZiBFT0Ygb3IgZXJyb3IgKi8KLQkJd2hpbGUgKG5yZWFkLS0pIHsKLQkJCWNoYXIgYyA9ICpzcmMrKzsKLQkJCWlmIChjID09ICdccicpIHsKLQkJCQkvKiBTYXZlIGFzIExGIGFuZCBzZXQgZmxhZyB0byBza2lwIG5leHQgTEYuICovCi0JCQkJKmRzdCsrID0gJ1xuJzsKLQkJCQlza2lwbmV4dGxmID0gMTsKLQkJCX0KLQkJCWVsc2UgaWYgKHNraXBuZXh0bGYgJiYgYyA9PSAnXG4nKSB7Ci0JCQkJLyogU2tpcCBMRiwgYW5kIHJlbWVtYmVyIHdlIHNhdyBDUiBMRi4gKi8KLQkJCQlza2lwbmV4dGxmID0gMDsKLQkJCQluZXdsaW5ldHlwZXMgfD0gTkVXTElORV9DUkxGOwotCQkJCSsrbjsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8qIE5vcm1hbCBjaGFyIHRvIGJlIHN0b3JlZCBpbiBidWZmZXIuICBBbHNvCi0JCQkJICogdXBkYXRlIHRoZSBuZXdsaW5ldHlwZXMgZmxhZyBpZiBlaXRoZXIgdGhpcwotCQkJCSAqIGlzIGFuIExGIG9yIHRoZSBwcmV2aW91cyBjaGFyIHdhcyBhIENSLgotCQkJCSAqLwotCQkJCWlmIChjID09ICdcbicpCi0JCQkJCW5ld2xpbmV0eXBlcyB8PSBORVdMSU5FX0xGOwotCQkJCWVsc2UgaWYgKHNraXBuZXh0bGYpCi0JCQkJCW5ld2xpbmV0eXBlcyB8PSBORVdMSU5FX0NSOwotCQkJCSpkc3QrKyA9IGM7Ci0JCQkJc2tpcG5leHRsZiA9IDA7Ci0JCQl9Ci0JCX0KLQkJaWYgKHNob3J0cmVhZCkgewotCQkJLyogSWYgdGhpcyBpcyBFT0YsIHVwZGF0ZSB0eXBlIGZsYWdzLiAqLwotCQkJaWYgKHNraXBuZXh0bGYgJiYgZmVvZihzdHJlYW0pKQotCQkJCW5ld2xpbmV0eXBlcyB8PSBORVdMSU5FX0NSOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JZi0+Zl9uZXdsaW5ldHlwZXMgPSBuZXdsaW5ldHlwZXM7Ci0JZi0+Zl9za2lwbmV4dGxmID0gc2tpcG5leHRsZjsKLQlyZXR1cm4gZHN0IC0gYnVmOworICAgICAgICBuIC09IG5yZWFkOyAvKiBhc3N1bWluZyAxIGJ5dGUgb3V0IGZvciBlYWNoIGluOyB3aWxsIGFkanVzdCAqLworICAgICAgICBzaG9ydHJlYWQgPSBuICE9IDA7ICAgICAgICAgICAgIC8qIHRydWUgaWZmIEVPRiBvciBlcnJvciAqLworICAgICAgICB3aGlsZSAobnJlYWQtLSkgeworICAgICAgICAgICAgY2hhciBjID0gKnNyYysrOworICAgICAgICAgICAgaWYgKGMgPT0gJ1xyJykgeworICAgICAgICAgICAgICAgIC8qIFNhdmUgYXMgTEYgYW5kIHNldCBmbGFnIHRvIHNraXAgbmV4dCBMRi4gKi8KKyAgICAgICAgICAgICAgICAqZHN0KysgPSAnXG4nOworICAgICAgICAgICAgICAgIHNraXBuZXh0bGYgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoc2tpcG5leHRsZiAmJiBjID09ICdcbicpIHsKKyAgICAgICAgICAgICAgICAvKiBTa2lwIExGLCBhbmQgcmVtZW1iZXIgd2Ugc2F3IENSIExGLiAqLworICAgICAgICAgICAgICAgIHNraXBuZXh0bGYgPSAwOworICAgICAgICAgICAgICAgIG5ld2xpbmV0eXBlcyB8PSBORVdMSU5FX0NSTEY7CisgICAgICAgICAgICAgICAgKytuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgLyogTm9ybWFsIGNoYXIgdG8gYmUgc3RvcmVkIGluIGJ1ZmZlci4gIEFsc28KKyAgICAgICAgICAgICAgICAgKiB1cGRhdGUgdGhlIG5ld2xpbmV0eXBlcyBmbGFnIGlmIGVpdGhlciB0aGlzCisgICAgICAgICAgICAgICAgICogaXMgYW4gTEYgb3IgdGhlIHByZXZpb3VzIGNoYXIgd2FzIGEgQ1IuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaWYgKGMgPT0gJ1xuJykKKyAgICAgICAgICAgICAgICAgICAgbmV3bGluZXR5cGVzIHw9IE5FV0xJTkVfTEY7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoc2tpcG5leHRsZikKKyAgICAgICAgICAgICAgICAgICAgbmV3bGluZXR5cGVzIHw9IE5FV0xJTkVfQ1I7CisgICAgICAgICAgICAgICAgKmRzdCsrID0gYzsKKyAgICAgICAgICAgICAgICBza2lwbmV4dGxmID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoc2hvcnRyZWFkKSB7CisgICAgICAgICAgICAvKiBJZiB0aGlzIGlzIEVPRiwgdXBkYXRlIHR5cGUgZmxhZ3MuICovCisgICAgICAgICAgICBpZiAoc2tpcG5leHRsZiAmJiBmZW9mKHN0cmVhbSkpCisgICAgICAgICAgICAgICAgbmV3bGluZXR5cGVzIHw9IE5FV0xJTkVfQ1I7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBmLT5mX25ld2xpbmV0eXBlcyA9IG5ld2xpbmV0eXBlczsKKyAgICBmLT5mX3NraXBuZXh0bGYgPSBza2lwbmV4dGxmOworICAgIHJldHVybiBkc3QgLSBidWY7CiB9CiAKICNpZmRlZiBfX2NwbHVzcGx1cwpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9mbG9hdG9iamVjdC5jIGIvT2JqZWN0cy9mbG9hdG9iamVjdC5jCmluZGV4IDJkMDBjMTYuLmM1NTZkZThmIDEwMDY0NAotLS0gYS9PYmplY3RzL2Zsb2F0b2JqZWN0LmMKKysrIGIvT2JqZWN0cy9mbG9hdG9iamVjdC5jCkBAIC0yNSwxMyArMjUsMTMgQEAKICNlbmRpZgogCiAvKiBTcGVjaWFsIGZyZWUgbGlzdCAtLSBzZWUgY29tbWVudHMgZm9yIHNhbWUgY29kZSBpbiBpbnRvYmplY3QuYy4gKi8KLSNkZWZpbmUgQkxPQ0tfU0laRQkxMDAwCS8qIDFLIGxlc3MgdHlwaWNhbCBtYWxsb2Mgb3ZlcmhlYWQgKi8KLSNkZWZpbmUgQkhFQURfU0laRQk4CS8qIEVub3VnaCBmb3IgYSA2NC1iaXQgcG9pbnRlciAqLwotI2RlZmluZSBOX0ZMT0FUT0JKRUNUUwkoKEJMT0NLX1NJWkUgLSBCSEVBRF9TSVpFKSAvIHNpemVvZihQeUZsb2F0T2JqZWN0KSkKKyNkZWZpbmUgQkxPQ0tfU0laRSAgICAgIDEwMDAgICAgLyogMUsgbGVzcyB0eXBpY2FsIG1hbGxvYyBvdmVyaGVhZCAqLworI2RlZmluZSBCSEVBRF9TSVpFICAgICAgOCAgICAgICAvKiBFbm91Z2ggZm9yIGEgNjQtYml0IHBvaW50ZXIgKi8KKyNkZWZpbmUgTl9GTE9BVE9CSkVDVFMgICgoQkxPQ0tfU0laRSAtIEJIRUFEX1NJWkUpIC8gc2l6ZW9mKFB5RmxvYXRPYmplY3QpKQogCiBzdHJ1Y3QgX2Zsb2F0YmxvY2sgewotCXN0cnVjdCBfZmxvYXRibG9jayAqbmV4dDsKLQlQeUZsb2F0T2JqZWN0IG9iamVjdHNbTl9GTE9BVE9CSkVDVFNdOworICAgIHN0cnVjdCBfZmxvYXRibG9jayAqbmV4dDsKKyAgICBQeUZsb2F0T2JqZWN0IG9iamVjdHNbTl9GTE9BVE9CSkVDVFNdOwogfTsKIAogdHlwZWRlZiBzdHJ1Y3QgX2Zsb2F0YmxvY2sgUHlGbG9hdEJsb2NrOwpAQCAtNDIsMzEgKzQyLDMxIEBACiBzdGF0aWMgUHlGbG9hdE9iamVjdCAqCiBmaWxsX2ZyZWVfbGlzdCh2b2lkKQogewotCVB5RmxvYXRPYmplY3QgKnAsICpxOwotCS8qIFhYWCBGbG9hdCBibG9ja3MgZXNjYXBlIHRoZSBvYmplY3QgaGVhcC4gVXNlIFB5T2JqZWN0X01BTExPQyA/Pz8gKi8KLQlwID0gKFB5RmxvYXRPYmplY3QgKikgUHlNZW1fTUFMTE9DKHNpemVvZihQeUZsb2F0QmxvY2spKTsKLQlpZiAocCA9PSBOVUxMKQotCQlyZXR1cm4gKFB5RmxvYXRPYmplY3QgKikgUHlFcnJfTm9NZW1vcnkoKTsKLQkoKFB5RmxvYXRCbG9jayAqKXApLT5uZXh0ID0gYmxvY2tfbGlzdDsKLQlibG9ja19saXN0ID0gKFB5RmxvYXRCbG9jayAqKXA7Ci0JcCA9ICYoKFB5RmxvYXRCbG9jayAqKXApLT5vYmplY3RzWzBdOwotCXEgPSBwICsgTl9GTE9BVE9CSkVDVFM7Ci0Jd2hpbGUgKC0tcSA+IHApCi0JCVB5X1RZUEUocSkgPSAoc3RydWN0IF90eXBlb2JqZWN0ICopKHEtMSk7Ci0JUHlfVFlQRShxKSA9IE5VTEw7Ci0JcmV0dXJuIHAgKyBOX0ZMT0FUT0JKRUNUUyAtIDE7CisgICAgUHlGbG9hdE9iamVjdCAqcCwgKnE7CisgICAgLyogWFhYIEZsb2F0IGJsb2NrcyBlc2NhcGUgdGhlIG9iamVjdCBoZWFwLiBVc2UgUHlPYmplY3RfTUFMTE9DID8/PyAqLworICAgIHAgPSAoUHlGbG9hdE9iamVjdCAqKSBQeU1lbV9NQUxMT0Moc2l6ZW9mKFB5RmxvYXRCbG9jaykpOworICAgIGlmIChwID09IE5VTEwpCisgICAgICAgIHJldHVybiAoUHlGbG9hdE9iamVjdCAqKSBQeUVycl9Ob01lbW9yeSgpOworICAgICgoUHlGbG9hdEJsb2NrICopcCktPm5leHQgPSBibG9ja19saXN0OworICAgIGJsb2NrX2xpc3QgPSAoUHlGbG9hdEJsb2NrICopcDsKKyAgICBwID0gJigoUHlGbG9hdEJsb2NrICopcCktPm9iamVjdHNbMF07CisgICAgcSA9IHAgKyBOX0ZMT0FUT0JKRUNUUzsKKyAgICB3aGlsZSAoLS1xID4gcCkKKyAgICAgICAgUHlfVFlQRShxKSA9IChzdHJ1Y3QgX3R5cGVvYmplY3QgKikocS0xKTsKKyAgICBQeV9UWVBFKHEpID0gTlVMTDsKKyAgICByZXR1cm4gcCArIE5fRkxPQVRPQkpFQ1RTIC0gMTsKIH0KIAogZG91YmxlCiBQeUZsb2F0X0dldE1heCh2b2lkKQogewotCXJldHVybiBEQkxfTUFYOworICAgIHJldHVybiBEQkxfTUFYOwogfQogCiBkb3VibGUKIFB5RmxvYXRfR2V0TWluKHZvaWQpCiB7Ci0JcmV0dXJuIERCTF9NSU47CisgICAgcmV0dXJuIERCTF9NSU47CiB9CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgRmxvYXRJbmZvVHlwZSA9IHswLCAwLCAwLCAwLCAwLCAwfTsKQEAgLTc5LDgzICs3OSw4MyBAQAogeW91ciBzeXN0ZW0ncyA6ZmlsZTpgZmxvYXQuaGAgZm9yIG1vcmUgaW5mb3JtYXRpb24uIik7CiAKIHN0YXRpYyBQeVN0cnVjdFNlcXVlbmNlX0ZpZWxkIGZsb2F0aW5mb19maWVsZHNbXSA9IHsKLQl7Im1heCIsCQkiREJMX01BWCAtLSBtYXhpbXVtIHJlcHJlc2VudGFibGUgZmluaXRlIGZsb2F0In0sCi0JeyJtYXhfZXhwIiwJIkRCTF9NQVhfRVhQIC0tIG1heGltdW0gaW50IGUgc3VjaCB0aGF0IHJhZGl4KiooZS0xKSAiCi0JCQkiaXMgcmVwcmVzZW50YWJsZSJ9LAotCXsibWF4XzEwX2V4cCIsCSJEQkxfTUFYXzEwX0VYUCAtLSBtYXhpbXVtIGludCBlIHN1Y2ggdGhhdCAxMCoqZSAiCi0JCQkiaXMgcmVwcmVzZW50YWJsZSJ9LAotCXsibWluIiwJCSJEQkxfTUlOIC0tIE1pbmltdW0gcG9zaXRpdmUgbm9ybWFsaXplciBmbG9hdCJ9LAotCXsibWluX2V4cCIsCSJEQkxfTUlOX0VYUCAtLSBtaW5pbXVtIGludCBlIHN1Y2ggdGhhdCByYWRpeCoqKGUtMSkgIgotCQkJImlzIGEgbm9ybWFsaXplZCBmbG9hdCJ9LAotCXsibWluXzEwX2V4cCIsCSJEQkxfTUlOXzEwX0VYUCAtLSBtaW5pbXVtIGludCBlIHN1Y2ggdGhhdCAxMCoqZSBpcyAiCi0JCQkiYSBub3JtYWxpemVkIn0sCi0JeyJkaWciLAkJIkRCTF9ESUcgLS0gZGlnaXRzIn0sCi0JeyJtYW50X2RpZyIsCSJEQkxfTUFOVF9ESUcgLS0gbWFudGlzc2EgZGlnaXRzIn0sCi0JeyJlcHNpbG9uIiwJIkRCTF9FUFNJTE9OIC0tIERpZmZlcmVuY2UgYmV0d2VlbiAxIGFuZCB0aGUgbmV4dCAiCi0JCQkicmVwcmVzZW50YWJsZSBmbG9hdCJ9LAotCXsicmFkaXgiLAkiRkxUX1JBRElYIC0tIHJhZGl4IG9mIGV4cG9uZW50In0sCi0JeyJyb3VuZHMiLAkiRkxUX1JPVU5EUyAtLSBhZGRpdGlvbiByb3VuZHMifSwKLQl7MH0KKyAgICB7Im1heCIsICAgICAgICAgICAgICJEQkxfTUFYIC0tIG1heGltdW0gcmVwcmVzZW50YWJsZSBmaW5pdGUgZmxvYXQifSwKKyAgICB7Im1heF9leHAiLCAgICAgICAgICJEQkxfTUFYX0VYUCAtLSBtYXhpbXVtIGludCBlIHN1Y2ggdGhhdCByYWRpeCoqKGUtMSkgIgorICAgICAgICAgICAgICAgICAgICAiaXMgcmVwcmVzZW50YWJsZSJ9LAorICAgIHsibWF4XzEwX2V4cCIsICAgICAgIkRCTF9NQVhfMTBfRVhQIC0tIG1heGltdW0gaW50IGUgc3VjaCB0aGF0IDEwKiplICIKKyAgICAgICAgICAgICAgICAgICAgImlzIHJlcHJlc2VudGFibGUifSwKKyAgICB7Im1pbiIsICAgICAgICAgICAgICJEQkxfTUlOIC0tIE1pbmltdW0gcG9zaXRpdmUgbm9ybWFsaXplciBmbG9hdCJ9LAorICAgIHsibWluX2V4cCIsICAgICAgICAgIkRCTF9NSU5fRVhQIC0tIG1pbmltdW0gaW50IGUgc3VjaCB0aGF0IHJhZGl4KiooZS0xKSAiCisgICAgICAgICAgICAgICAgICAgICJpcyBhIG5vcm1hbGl6ZWQgZmxvYXQifSwKKyAgICB7Im1pbl8xMF9leHAiLCAgICAgICJEQkxfTUlOXzEwX0VYUCAtLSBtaW5pbXVtIGludCBlIHN1Y2ggdGhhdCAxMCoqZSBpcyAiCisgICAgICAgICAgICAgICAgICAgICJhIG5vcm1hbGl6ZWQifSwKKyAgICB7ImRpZyIsICAgICAgICAgICAgICJEQkxfRElHIC0tIGRpZ2l0cyJ9LAorICAgIHsibWFudF9kaWciLCAgICAgICAgIkRCTF9NQU5UX0RJRyAtLSBtYW50aXNzYSBkaWdpdHMifSwKKyAgICB7ImVwc2lsb24iLCAgICAgICAgICJEQkxfRVBTSUxPTiAtLSBEaWZmZXJlbmNlIGJldHdlZW4gMSBhbmQgdGhlIG5leHQgIgorICAgICAgICAgICAgICAgICAgICAicmVwcmVzZW50YWJsZSBmbG9hdCJ9LAorICAgIHsicmFkaXgiLCAgICAgICAgICAgIkZMVF9SQURJWCAtLSByYWRpeCBvZiBleHBvbmVudCJ9LAorICAgIHsicm91bmRzIiwgICAgICAgICAgIkZMVF9ST1VORFMgLS0gYWRkaXRpb24gcm91bmRzIn0sCisgICAgezB9CiB9OwogCiBzdGF0aWMgUHlTdHJ1Y3RTZXF1ZW5jZV9EZXNjIGZsb2F0aW5mb19kZXNjID0gewotCSJzeXMuZmxvYXRpbmZvIiwJLyogbmFtZSAqLwotCWZsb2F0aW5mb19fZG9jX18sCS8qIGRvYyAqLwotCWZsb2F0aW5mb19maWVsZHMsCS8qIGZpZWxkcyAqLwotCTExCisgICAgInN5cy5mbG9hdGluZm8iLCAgICAgICAgICAgIC8qIG5hbWUgKi8KKyAgICBmbG9hdGluZm9fX2RvY19fLCAgICAgICAgICAgLyogZG9jICovCisgICAgZmxvYXRpbmZvX2ZpZWxkcywgICAgICAgICAgIC8qIGZpZWxkcyAqLworICAgIDExCiB9OwogCiBQeU9iamVjdCAqCiBQeUZsb2F0X0dldEluZm8odm9pZCkKIHsKLQlQeU9iamVjdCogZmxvYXRpbmZvOwotCWludCBwb3MgPSAwOworICAgIFB5T2JqZWN0KiBmbG9hdGluZm87CisgICAgaW50IHBvcyA9IDA7CiAKLQlmbG9hdGluZm8gPSBQeVN0cnVjdFNlcXVlbmNlX05ldygmRmxvYXRJbmZvVHlwZSk7Ci0JaWYgKGZsb2F0aW5mbyA9PSBOVUxMKSB7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBmbG9hdGluZm8gPSBQeVN0cnVjdFNlcXVlbmNlX05ldygmRmxvYXRJbmZvVHlwZSk7CisgICAgaWYgKGZsb2F0aW5mbyA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAogI2RlZmluZSBTZXRJbnRGbGFnKGZsYWcpIFwKLQlQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKGZsb2F0aW5mbywgcG9zKyssIFB5SW50X0Zyb21Mb25nKGZsYWcpKQorICAgIFB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0oZmxvYXRpbmZvLCBwb3MrKywgUHlJbnRfRnJvbUxvbmcoZmxhZykpCiAjZGVmaW5lIFNldERibEZsYWcoZmxhZykgXAotCVB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0oZmxvYXRpbmZvLCBwb3MrKywgUHlGbG9hdF9Gcm9tRG91YmxlKGZsYWcpKQorICAgIFB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0oZmxvYXRpbmZvLCBwb3MrKywgUHlGbG9hdF9Gcm9tRG91YmxlKGZsYWcpKQogCi0JU2V0RGJsRmxhZyhEQkxfTUFYKTsKLQlTZXRJbnRGbGFnKERCTF9NQVhfRVhQKTsKLQlTZXRJbnRGbGFnKERCTF9NQVhfMTBfRVhQKTsKLQlTZXREYmxGbGFnKERCTF9NSU4pOwotCVNldEludEZsYWcoREJMX01JTl9FWFApOwotCVNldEludEZsYWcoREJMX01JTl8xMF9FWFApOwotCVNldEludEZsYWcoREJMX0RJRyk7Ci0JU2V0SW50RmxhZyhEQkxfTUFOVF9ESUcpOwotCVNldERibEZsYWcoREJMX0VQU0lMT04pOwotCVNldEludEZsYWcoRkxUX1JBRElYKTsKLQlTZXRJbnRGbGFnKEZMVF9ST1VORFMpOworICAgIFNldERibEZsYWcoREJMX01BWCk7CisgICAgU2V0SW50RmxhZyhEQkxfTUFYX0VYUCk7CisgICAgU2V0SW50RmxhZyhEQkxfTUFYXzEwX0VYUCk7CisgICAgU2V0RGJsRmxhZyhEQkxfTUlOKTsKKyAgICBTZXRJbnRGbGFnKERCTF9NSU5fRVhQKTsKKyAgICBTZXRJbnRGbGFnKERCTF9NSU5fMTBfRVhQKTsKKyAgICBTZXRJbnRGbGFnKERCTF9ESUcpOworICAgIFNldEludEZsYWcoREJMX01BTlRfRElHKTsKKyAgICBTZXREYmxGbGFnKERCTF9FUFNJTE9OKTsKKyAgICBTZXRJbnRGbGFnKEZMVF9SQURJWCk7CisgICAgU2V0SW50RmxhZyhGTFRfUk9VTkRTKTsKICN1bmRlZiBTZXRJbnRGbGFnCiAjdW5kZWYgU2V0RGJsRmxhZwotCQotCWlmIChQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCVB5X0NMRUFSKGZsb2F0aW5mbyk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gZmxvYXRpbmZvOworCisgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgUHlfQ0xFQVIoZmxvYXRpbmZvKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBmbG9hdGluZm87CiB9CiAKIFB5T2JqZWN0ICoKIFB5RmxvYXRfRnJvbURvdWJsZShkb3VibGUgZnZhbCkKIHsKLQlyZWdpc3RlciBQeUZsb2F0T2JqZWN0ICpvcDsKLQlpZiAoZnJlZV9saXN0ID09IE5VTEwpIHsKLQkJaWYgKChmcmVlX2xpc3QgPSBmaWxsX2ZyZWVfbGlzdCgpKSA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCS8qIElubGluZSBQeU9iamVjdF9OZXcgKi8KLQlvcCA9IGZyZWVfbGlzdDsKLQlmcmVlX2xpc3QgPSAoUHlGbG9hdE9iamVjdCAqKVB5X1RZUEUob3ApOwotCVB5T2JqZWN0X0lOSVQob3AsICZQeUZsb2F0X1R5cGUpOwotCW9wLT5vYl9mdmFsID0gZnZhbDsKLQlyZXR1cm4gKFB5T2JqZWN0ICopIG9wOworICAgIHJlZ2lzdGVyIFB5RmxvYXRPYmplY3QgKm9wOworICAgIGlmIChmcmVlX2xpc3QgPT0gTlVMTCkgeworICAgICAgICBpZiAoKGZyZWVfbGlzdCA9IGZpbGxfZnJlZV9saXN0KCkpID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgLyogSW5saW5lIFB5T2JqZWN0X05ldyAqLworICAgIG9wID0gZnJlZV9saXN0OworICAgIGZyZWVfbGlzdCA9IChQeUZsb2F0T2JqZWN0ICopUHlfVFlQRShvcCk7CisgICAgUHlPYmplY3RfSU5JVChvcCwgJlB5RmxvYXRfVHlwZSk7CisgICAgb3AtPm9iX2Z2YWwgPSBmdmFsOworICAgIHJldHVybiAoUHlPYmplY3QgKikgb3A7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTc3LDE2MyArMTc3LDE2MyBAQAogUHlPYmplY3QgKgogUHlGbG9hdF9Gcm9tU3RyaW5nKFB5T2JqZWN0ICp2LCBjaGFyICoqcGVuZCkKIHsKLQljb25zdCBjaGFyICpzLCAqbGFzdCwgKmVuZCwgKnNwOwotCWRvdWJsZSB4OwotCWNoYXIgYnVmZmVyWzI1Nl07IC8qIGZvciBlcnJvcnMgKi8KKyAgICBjb25zdCBjaGFyICpzLCAqbGFzdCwgKmVuZCwgKnNwOworICAgIGRvdWJsZSB4OworICAgIGNoYXIgYnVmZmVyWzI1Nl07IC8qIGZvciBlcnJvcnMgKi8KICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JY2hhciBzX2J1ZmZlclsyNTZdOyAvKiBmb3Igb2JqZWN0cyBjb252ZXJ0aWJsZSB0byBhIGNoYXIgYnVmZmVyICovCisgICAgY2hhciBzX2J1ZmZlclsyNTZdOyAvKiBmb3Igb2JqZWN0cyBjb252ZXJ0aWJsZSB0byBhIGNoYXIgYnVmZmVyICovCiAjZW5kaWYKLQlQeV9zc2l6ZV90IGxlbjsKKyAgICBQeV9zc2l6ZV90IGxlbjsKIAotCWlmIChwZW5kKQotCQkqcGVuZCA9IE5VTEw7Ci0JaWYgKFB5U3RyaW5nX0NoZWNrKHYpKSB7Ci0JCXMgPSBQeVN0cmluZ19BU19TVFJJTkcodik7Ci0JCWxlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHYpOwotCX0KKyAgICBpZiAocGVuZCkKKyAgICAgICAgKnBlbmQgPSBOVUxMOworICAgIGlmIChQeVN0cmluZ19DaGVjayh2KSkgeworICAgICAgICBzID0gUHlTdHJpbmdfQVNfU1RSSU5HKHYpOworICAgICAgICBsZW4gPSBQeVN0cmluZ19HRVRfU0laRSh2KTsKKyAgICB9CiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCWVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayh2KSkgewotCQlpZiAoUHlVbmljb2RlX0dFVF9TSVpFKHYpID49IChQeV9zc2l6ZV90KXNpemVvZihzX2J1ZmZlcikpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJVbmljb2RlIGZsb2F0KCkgbGl0ZXJhbCB0b28gbG9uZyB0byBjb252ZXJ0Iik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlpZiAoUHlVbmljb2RlX0VuY29kZURlY2ltYWwoUHlVbmljb2RlX0FTX1VOSUNPREUodiksCi0JCQkJCSAgICBQeVVuaWNvZGVfR0VUX1NJWkUodiksCi0JCQkJCSAgICBzX2J1ZmZlciwKLQkJCQkJICAgIE5VTEwpKQotCQkJcmV0dXJuIE5VTEw7Ci0JCXMgPSBzX2J1ZmZlcjsKLQkJbGVuID0gc3RybGVuKHMpOwotCX0KKyAgICBlbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2sodikpIHsKKyAgICAgICAgaWYgKFB5VW5pY29kZV9HRVRfU0laRSh2KSA+PSAoUHlfc3NpemVfdClzaXplb2Yoc19idWZmZXIpKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAiVW5pY29kZSBmbG9hdCgpIGxpdGVyYWwgdG9vIGxvbmcgdG8gY29udmVydCIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKFB5VW5pY29kZV9FbmNvZGVEZWNpbWFsKFB5VW5pY29kZV9BU19VTklDT0RFKHYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0dFVF9TSVpFKHYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc19idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBzID0gc19idWZmZXI7CisgICAgICAgIGxlbiA9IHN0cmxlbihzKTsKKyAgICB9CiAjZW5kaWYKLQllbHNlIGlmIChQeU9iamVjdF9Bc0NoYXJCdWZmZXIodiwgJnMsICZsZW4pKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJImZsb2F0KCkgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZyBvciBhIG51bWJlciIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgZWxzZSBpZiAoUHlPYmplY3RfQXNDaGFyQnVmZmVyKHYsICZzLCAmbGVuKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImZsb2F0KCkgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZyBvciBhIG51bWJlciIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlsYXN0ID0gcyArIGxlbjsKLQl3aGlsZSAoKnMgJiYgaXNzcGFjZShQeV9DSEFSTUFTSygqcykpKQotCQlzKys7Ci0JaWYgKCpzID09ICdcMCcpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJlbXB0eSBzdHJpbmcgZm9yIGZsb2F0KCkiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXNwID0gczsKLQkvKiBXZSBkb24ndCBjYXJlIGFib3V0IG92ZXJmbG93IG9yIHVuZGVyZmxvdy4gIElmIHRoZSBwbGF0Zm9ybSBzdXBwb3J0cwotCSAqIHRoZW0sIGluZmluaXRpZXMgYW5kIHNpZ25lZCB6ZXJvZXMgKG9uIHVuZGVyZmxvdykgYXJlIGZpbmUuCi0JICogSG93ZXZlciwgc3RydG9kIGNhbiByZXR1cm4gMCBmb3IgZGVub3JtYWxpemVkIG51bWJlcnMsIHdoZXJlIGF0b2YKLQkgKiBkb2VzIG5vdC4gIFNvIChhbGFzISkgd2Ugc3BlY2lhbC1jYXNlIGEgemVybyByZXN1bHQuICBOb3RlIHRoYXQKLQkgKiB3aGV0aGVyIHN0cnRvZCBzZXRzIGVycm5vIG9uIHVuZGVyZmxvdyBpcyBub3QgZGVmaW5lZCwgc28gd2UgY2FuJ3QKLQkgKiBrZXkgb2ZmIGVycm5vLgotICAgICAgICAgKi8KLQlQeUZQRV9TVEFSVF9QUk9URUNUKCJzdHJ0b2QiLCByZXR1cm4gTlVMTCkKLQl4ID0gUHlPU19hc2NpaV9zdHJ0b2QocywgKGNoYXIgKiopJmVuZCk7Ci0JUHlGUEVfRU5EX1BST1RFQ1QoeCkKLQllcnJubyA9IDA7Ci0JLyogQmVsaWV2ZSBpdCBvciBub3QsIFNvbGFyaXMgMi42IGNhbiBtb3ZlIGVuZCAqYmV5b25kKiB0aGUgbnVsbAotCSAgIGJ5dGUgYXQgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLCB3aGVuIHRoZSBpbnB1dCBpcyBpbmYoaW5pdHkpLiAqLwotCWlmIChlbmQgPiBsYXN0KQotCQllbmQgPSBsYXN0OwotCS8qIENoZWNrIGZvciBpbmYgYW5kIG5hbi4gVGhpcyBpcyBkb25lIGxhdGUgYmVjYXVzZSBpdCByYXJlbHkgaGFwcGVucy4gKi8KLQlpZiAoZW5kID09IHMpIHsKLQkJY2hhciAqcCA9IChjaGFyKilzcDsKLQkJaW50IHNpZ24gPSAxOworICAgIGxhc3QgPSBzICsgbGVuOworICAgIHdoaWxlICgqcyAmJiBpc3NwYWNlKFB5X0NIQVJNQVNLKCpzKSkpCisgICAgICAgIHMrKzsKKyAgICBpZiAoKnMgPT0gJ1wwJykgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImVtcHR5IHN0cmluZyBmb3IgZmxvYXQoKSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgc3AgPSBzOworICAgIC8qIFdlIGRvbid0IGNhcmUgYWJvdXQgb3ZlcmZsb3cgb3IgdW5kZXJmbG93LiAgSWYgdGhlIHBsYXRmb3JtIHN1cHBvcnRzCisgICAgICogdGhlbSwgaW5maW5pdGllcyBhbmQgc2lnbmVkIHplcm9lcyAob24gdW5kZXJmbG93KSBhcmUgZmluZS4KKyAgICAgKiBIb3dldmVyLCBzdHJ0b2QgY2FuIHJldHVybiAwIGZvciBkZW5vcm1hbGl6ZWQgbnVtYmVycywgd2hlcmUgYXRvZgorICAgICAqIGRvZXMgbm90LiAgU28gKGFsYXMhKSB3ZSBzcGVjaWFsLWNhc2UgYSB6ZXJvIHJlc3VsdC4gIE5vdGUgdGhhdAorICAgICAqIHdoZXRoZXIgc3RydG9kIHNldHMgZXJybm8gb24gdW5kZXJmbG93IGlzIG5vdCBkZWZpbmVkLCBzbyB3ZSBjYW4ndAorICAgICAqIGtleSBvZmYgZXJybm8uCisgICAgICovCisgICAgUHlGUEVfU1RBUlRfUFJPVEVDVCgic3RydG9kIiwgcmV0dXJuIE5VTEwpCisgICAgeCA9IFB5T1NfYXNjaWlfc3RydG9kKHMsIChjaGFyICoqKSZlbmQpOworICAgIFB5RlBFX0VORF9QUk9URUNUKHgpCisgICAgZXJybm8gPSAwOworICAgIC8qIEJlbGlldmUgaXQgb3Igbm90LCBTb2xhcmlzIDIuNiBjYW4gbW92ZSBlbmQgKmJleW9uZCogdGhlIG51bGwKKyAgICAgICBieXRlIGF0IHRoZSBlbmQgb2YgdGhlIHN0cmluZywgd2hlbiB0aGUgaW5wdXQgaXMgaW5mKGluaXR5KS4gKi8KKyAgICBpZiAoZW5kID4gbGFzdCkKKyAgICAgICAgZW5kID0gbGFzdDsKKyAgICAvKiBDaGVjayBmb3IgaW5mIGFuZCBuYW4uIFRoaXMgaXMgZG9uZSBsYXRlIGJlY2F1c2UgaXQgcmFyZWx5IGhhcHBlbnMuICovCisgICAgaWYgKGVuZCA9PSBzKSB7CisgICAgICAgIGNoYXIgKnAgPSAoY2hhciopc3A7CisgICAgICAgIGludCBzaWduID0gMTsKIAotCQlpZiAoKnAgPT0gJy0nKSB7Ci0JCQlzaWduID0gLTE7Ci0JCQlwKys7Ci0JCX0KLQkJaWYgKCpwID09ICcrJykgewotCQkJcCsrOwotCQl9Ci0JCWlmIChQeU9TX3N0cm5pY21wKHAsICJpbmYiLCA0KSA9PSAwKSB7Ci0JCQlQeV9SRVRVUk5fSU5GKHNpZ24pOwotCQl9Ci0JCWlmIChQeU9TX3N0cm5pY21wKHAsICJpbmZpbml0eSIsIDkpID09IDApIHsKLQkJCVB5X1JFVFVSTl9JTkYoc2lnbik7Ci0JCX0KKyAgICAgICAgaWYgKCpwID09ICctJykgeworICAgICAgICAgICAgc2lnbiA9IC0xOworICAgICAgICAgICAgcCsrOworICAgICAgICB9CisgICAgICAgIGlmICgqcCA9PSAnKycpIHsKKyAgICAgICAgICAgIHArKzsKKyAgICAgICAgfQorICAgICAgICBpZiAoUHlPU19zdHJuaWNtcChwLCAiaW5mIiwgNCkgPT0gMCkgeworICAgICAgICAgICAgUHlfUkVUVVJOX0lORihzaWduKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoUHlPU19zdHJuaWNtcChwLCAiaW5maW5pdHkiLCA5KSA9PSAwKSB7CisgICAgICAgICAgICBQeV9SRVRVUk5fSU5GKHNpZ24pOworICAgICAgICB9CiAjaWZkZWYgUHlfTkFOCi0JCWlmKFB5T1Nfc3RybmljbXAocCwgIm5hbiIsIDQpID09IDApIHsKLQkJCVB5X1JFVFVSTl9OQU47Ci0JCX0KKyAgICAgICAgaWYoUHlPU19zdHJuaWNtcChwLCAibmFuIiwgNCkgPT0gMCkgeworICAgICAgICAgICAgUHlfUkVUVVJOX05BTjsKKyAgICAgICAgfQogI2VuZGlmCi0JCVB5T1Nfc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwKLQkJCSAgICAgICJpbnZhbGlkIGxpdGVyYWwgZm9yIGZsb2F0KCk6ICUuMjAwcyIsIHMpOwotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgYnVmZmVyKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCS8qIFNpbmNlIGVuZCAhPSBzLCB0aGUgcGxhdGZvcm0gbWFkZSAqc29tZSoga2luZCBvZiBzZW5zZSBvdXQKLQkgICBvZiB0aGUgaW5wdXQuICBUcnVzdCBpdC4gKi8KLQl3aGlsZSAoKmVuZCAmJiBpc3NwYWNlKFB5X0NIQVJNQVNLKCplbmQpKSkKLQkJZW5kKys7Ci0JaWYgKCplbmQgIT0gJ1wwJykgewotCQlQeU9TX3NucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksCi0JCQkgICAgICAiaW52YWxpZCBsaXRlcmFsIGZvciBmbG9hdCgpOiAlLjIwMHMiLCBzKTsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsIGJ1ZmZlcik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQllbHNlIGlmIChlbmQgIT0gbGFzdCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkibnVsbCBieXRlIGluIGFyZ3VtZW50IGZvciBmbG9hdCgpIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoeCA9PSAwLjApIHsKLQkJLyogU2VlIGFib3ZlIC0tIG1heSBoYXZlIGJlZW4gc3RydG9kIGJlaW5nIGFuYWwKLQkJICAgYWJvdXQgZGVub3Jtcy4gKi8KLQkJUHlGUEVfU1RBUlRfUFJPVEVDVCgiYXRvZiIsIHJldHVybiBOVUxMKQotCQl4ID0gUHlPU19hc2NpaV9hdG9mKHMpOwotCQlQeUZQRV9FTkRfUFJPVEVDVCh4KQotCQllcnJubyA9IDA7ICAgIC8qIHdoZXRoZXIgYXRvZiBldmVyIHNldCBlcnJubyBpcyB1bmRlZmluZWQgKi8KLQl9Ci0JcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZSh4KTsKKyAgICAgICAgUHlPU19zbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLAorICAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIGxpdGVyYWwgZm9yIGZsb2F0KCk6ICUuMjAwcyIsIHMpOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgYnVmZmVyKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIC8qIFNpbmNlIGVuZCAhPSBzLCB0aGUgcGxhdGZvcm0gbWFkZSAqc29tZSoga2luZCBvZiBzZW5zZSBvdXQKKyAgICAgICBvZiB0aGUgaW5wdXQuICBUcnVzdCBpdC4gKi8KKyAgICB3aGlsZSAoKmVuZCAmJiBpc3NwYWNlKFB5X0NIQVJNQVNLKCplbmQpKSkKKyAgICAgICAgZW5kKys7CisgICAgaWYgKCplbmQgIT0gJ1wwJykgeworICAgICAgICBQeU9TX3NucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksCisgICAgICAgICAgICAgICAgICAgICAgImludmFsaWQgbGl0ZXJhbCBmb3IgZmxvYXQoKTogJS4yMDBzIiwgcyk7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCBidWZmZXIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZWxzZSBpZiAoZW5kICE9IGxhc3QpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAibnVsbCBieXRlIGluIGFyZ3VtZW50IGZvciBmbG9hdCgpIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoeCA9PSAwLjApIHsKKyAgICAgICAgLyogU2VlIGFib3ZlIC0tIG1heSBoYXZlIGJlZW4gc3RydG9kIGJlaW5nIGFuYWwKKyAgICAgICAgICAgYWJvdXQgZGVub3Jtcy4gKi8KKyAgICAgICAgUHlGUEVfU1RBUlRfUFJPVEVDVCgiYXRvZiIsIHJldHVybiBOVUxMKQorICAgICAgICB4ID0gUHlPU19hc2NpaV9hdG9mKHMpOworICAgICAgICBQeUZQRV9FTkRfUFJPVEVDVCh4KQorICAgICAgICBlcnJubyA9IDA7ICAgIC8qIHdoZXRoZXIgYXRvZiBldmVyIHNldCBlcnJubyBpcyB1bmRlZmluZWQgKi8KKyAgICB9CisgICAgcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZSh4KTsKIH0KIAogc3RhdGljIHZvaWQKIGZsb2F0X2RlYWxsb2MoUHlGbG9hdE9iamVjdCAqb3ApCiB7Ci0JaWYgKFB5RmxvYXRfQ2hlY2tFeGFjdChvcCkpIHsKLQkJUHlfVFlQRShvcCkgPSAoc3RydWN0IF90eXBlb2JqZWN0ICopZnJlZV9saXN0OwotCQlmcmVlX2xpc3QgPSBvcDsKLQl9Ci0JZWxzZQotCQlQeV9UWVBFKG9wKS0+dHBfZnJlZSgoUHlPYmplY3QgKilvcCk7CisgICAgaWYgKFB5RmxvYXRfQ2hlY2tFeGFjdChvcCkpIHsKKyAgICAgICAgUHlfVFlQRShvcCkgPSAoc3RydWN0IF90eXBlb2JqZWN0ICopZnJlZV9saXN0OworICAgICAgICBmcmVlX2xpc3QgPSBvcDsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBQeV9UWVBFKG9wKS0+dHBfZnJlZSgoUHlPYmplY3QgKilvcCk7CiB9CiAKIGRvdWJsZQogUHlGbG9hdF9Bc0RvdWJsZShQeU9iamVjdCAqb3ApCiB7Ci0JUHlOdW1iZXJNZXRob2RzICpuYjsKLQlQeUZsb2F0T2JqZWN0ICpmbzsKLQlkb3VibGUgdmFsOworICAgIFB5TnVtYmVyTWV0aG9kcyAqbmI7CisgICAgUHlGbG9hdE9iamVjdCAqZm87CisgICAgZG91YmxlIHZhbDsKIAotCWlmIChvcCAmJiBQeUZsb2F0X0NoZWNrKG9wKSkKLQkJcmV0dXJuIFB5RmxvYXRfQVNfRE9VQkxFKChQeUZsb2F0T2JqZWN0Kikgb3ApOworICAgIGlmIChvcCAmJiBQeUZsb2F0X0NoZWNrKG9wKSkKKyAgICAgICAgcmV0dXJuIFB5RmxvYXRfQVNfRE9VQkxFKChQeUZsb2F0T2JqZWN0Kikgb3ApOwogCi0JaWYgKG9wID09IE5VTEwpIHsKLQkJUHlFcnJfQmFkQXJndW1lbnQoKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICBpZiAob3AgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9CYWRBcmd1bWVudCgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JaWYgKChuYiA9IFB5X1RZUEUob3ApLT50cF9hc19udW1iZXIpID09IE5VTEwgfHwgbmItPm5iX2Zsb2F0ID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImEgZmxvYXQgaXMgcmVxdWlyZWQiKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICBpZiAoKG5iID0gUHlfVFlQRShvcCktPnRwX2FzX251bWJlcikgPT0gTlVMTCB8fCBuYi0+bmJfZmxvYXQgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYSBmbG9hdCBpcyByZXF1aXJlZCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JZm8gPSAoUHlGbG9hdE9iamVjdCopICgqbmItPm5iX2Zsb2F0KSAob3ApOwotCWlmIChmbyA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0JaWYgKCFQeUZsb2F0X0NoZWNrKGZvKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJuYl9mbG9hdCBzaG91bGQgcmV0dXJuIGZsb2F0IG9iamVjdCIpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIGZvID0gKFB5RmxvYXRPYmplY3QqKSAoKm5iLT5uYl9mbG9hdCkgKG9wKTsKKyAgICBpZiAoZm8gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmICghUHlGbG9hdF9DaGVjayhmbykpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJuYl9mbG9hdCBzaG91bGQgcmV0dXJuIGZsb2F0IG9iamVjdCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JdmFsID0gUHlGbG9hdF9BU19ET1VCTEUoZm8pOwotCVB5X0RFQ1JFRihmbyk7CisgICAgdmFsID0gUHlGbG9hdF9BU19ET1VCTEUoZm8pOworICAgIFB5X0RFQ1JFRihmbyk7CiAKLQlyZXR1cm4gdmFsOworICAgIHJldHVybiB2YWw7CiB9CiAKIC8qIE1ldGhvZHMgKi8KQEAgLTM0MSw1OCArMzQxLDU4IEBACiBzdGF0aWMgdm9pZAogZm9ybWF0X2Zsb2F0KGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1ZmxlbiwgUHlGbG9hdE9iamVjdCAqdiwgaW50IHByZWNpc2lvbikKIHsKLQlyZWdpc3RlciBjaGFyICpjcDsKLQljaGFyIGZvcm1hdFszMl07Ci0JaW50IGk7CisgICAgcmVnaXN0ZXIgY2hhciAqY3A7CisgICAgY2hhciBmb3JtYXRbMzJdOworICAgIGludCBpOwogCi0JLyogU3Vicm91dGluZSBmb3IgZmxvYXRfcmVwciBhbmQgZmxvYXRfcHJpbnQuCi0JICAgV2Ugd2FudCBmbG9hdCBudW1iZXJzIHRvIGJlIHJlY29nbml6YWJsZSBhcyBzdWNoLAotCSAgIGkuZS4sIHRoZXkgc2hvdWxkIGNvbnRhaW4gYSBkZWNpbWFsIHBvaW50IG9yIGFuIGV4cG9uZW50LgotCSAgIEhvd2V2ZXIsICVnIG1heSBwcmludCB0aGUgbnVtYmVyIGFzIGFuIGludGVnZXI7Ci0JICAgaW4gc3VjaCBjYXNlcywgd2UgYXBwZW5kICIuMCIgdG8gdGhlIHN0cmluZy4gKi8KKyAgICAvKiBTdWJyb3V0aW5lIGZvciBmbG9hdF9yZXByIGFuZCBmbG9hdF9wcmludC4KKyAgICAgICBXZSB3YW50IGZsb2F0IG51bWJlcnMgdG8gYmUgcmVjb2duaXphYmxlIGFzIHN1Y2gsCisgICAgICAgaS5lLiwgdGhleSBzaG91bGQgY29udGFpbiBhIGRlY2ltYWwgcG9pbnQgb3IgYW4gZXhwb25lbnQuCisgICAgICAgSG93ZXZlciwgJWcgbWF5IHByaW50IHRoZSBudW1iZXIgYXMgYW4gaW50ZWdlcjsKKyAgICAgICBpbiBzdWNoIGNhc2VzLCB3ZSBhcHBlbmQgIi4wIiB0byB0aGUgc3RyaW5nLiAqLwogCi0JYXNzZXJ0KFB5RmxvYXRfQ2hlY2sodikpOwotCVB5T1Nfc25wcmludGYoZm9ybWF0LCAzMiwgIiUlLiVpZyIsIHByZWNpc2lvbik7Ci0JUHlPU19hc2NpaV9mb3JtYXRkKGJ1ZiwgYnVmbGVuLCBmb3JtYXQsIHYtPm9iX2Z2YWwpOwotCWNwID0gYnVmOwotCWlmICgqY3AgPT0gJy0nKQotCQljcCsrOwotCWZvciAoOyAqY3AgIT0gJ1wwJzsgY3ArKykgewotCQkvKiBBbnkgbm9uLWRpZ2l0IG1lYW5zIGl0J3Mgbm90IGFuIGludGVnZXI7Ci0JCSAgIHRoaXMgdGFrZXMgY2FyZSBvZiBOQU4gYW5kIElORiBhcyB3ZWxsLiAqLwotCQlpZiAoIWlzZGlnaXQoUHlfQ0hBUk1BU0soKmNwKSkpCi0JCQlicmVhazsKLQl9Ci0JaWYgKCpjcCA9PSAnXDAnKSB7Ci0JCSpjcCsrID0gJy4nOwotCQkqY3ArKyA9ICcwJzsKLQkJKmNwKysgPSAnXDAnOwotCQlyZXR1cm47Ci0JfQotCS8qIENoZWNraW5nIHRoZSBuZXh0IHRocmVlIGNoYXJzIHNob3VsZCBiZSBtb3JlIHRoYW4gZW5vdWdoIHRvCi0JICogZGV0ZWN0IGluZiBvciBuYW4sIGV2ZW4gb24gV2luZG93cy4gV2UgY2hlY2sgZm9yIGluZiBvciBuYW4KLQkgKiBhdCBsYXN0IGJlY2F1c2UgdGhleSBhcmUgcmFyZSBjYXNlcy4KLQkgKi8KLQlmb3IgKGk9MDsgKmNwICE9ICdcMCcgJiYgaTwzOyBjcCsrLCBpKyspIHsKLQkJaWYgKGlzZGlnaXQoUHlfQ0hBUk1BU0soKmNwKSkgfHwgKmNwID09ICcuJykKLQkJCWNvbnRpbnVlOwotCQkvKiBmb3VuZCBzb21ldGhpbmcgdGhhdCBpcyBuZWl0aGVyIGEgZGlnaXQgbm9yIHBvaW50Ci0JCSAqIGl0IG1pZ2h0IGJlIGEgTmFOIG9yIElORgotCQkgKi8KKyAgICBhc3NlcnQoUHlGbG9hdF9DaGVjayh2KSk7CisgICAgUHlPU19zbnByaW50Zihmb3JtYXQsIDMyLCAiJSUuJWlnIiwgcHJlY2lzaW9uKTsKKyAgICBQeU9TX2FzY2lpX2Zvcm1hdGQoYnVmLCBidWZsZW4sIGZvcm1hdCwgdi0+b2JfZnZhbCk7CisgICAgY3AgPSBidWY7CisgICAgaWYgKCpjcCA9PSAnLScpCisgICAgICAgIGNwKys7CisgICAgZm9yICg7ICpjcCAhPSAnXDAnOyBjcCsrKSB7CisgICAgICAgIC8qIEFueSBub24tZGlnaXQgbWVhbnMgaXQncyBub3QgYW4gaW50ZWdlcjsKKyAgICAgICAgICAgdGhpcyB0YWtlcyBjYXJlIG9mIE5BTiBhbmQgSU5GIGFzIHdlbGwuICovCisgICAgICAgIGlmICghaXNkaWdpdChQeV9DSEFSTUFTSygqY3ApKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoKmNwID09ICdcMCcpIHsKKyAgICAgICAgKmNwKysgPSAnLic7CisgICAgICAgICpjcCsrID0gJzAnOworICAgICAgICAqY3ArKyA9ICdcMCc7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLyogQ2hlY2tpbmcgdGhlIG5leHQgdGhyZWUgY2hhcnMgc2hvdWxkIGJlIG1vcmUgdGhhbiBlbm91Z2ggdG8KKyAgICAgKiBkZXRlY3QgaW5mIG9yIG5hbiwgZXZlbiBvbiBXaW5kb3dzLiBXZSBjaGVjayBmb3IgaW5mIG9yIG5hbgorICAgICAqIGF0IGxhc3QgYmVjYXVzZSB0aGV5IGFyZSByYXJlIGNhc2VzLgorICAgICAqLworICAgIGZvciAoaT0wOyAqY3AgIT0gJ1wwJyAmJiBpPDM7IGNwKyssIGkrKykgeworICAgICAgICBpZiAoaXNkaWdpdChQeV9DSEFSTUFTSygqY3ApKSB8fCAqY3AgPT0gJy4nKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIC8qIGZvdW5kIHNvbWV0aGluZyB0aGF0IGlzIG5laXRoZXIgYSBkaWdpdCBub3IgcG9pbnQKKyAgICAgICAgICogaXQgbWlnaHQgYmUgYSBOYU4gb3IgSU5GCisgICAgICAgICAqLwogI2lmZGVmIFB5X05BTgotCQlpZiAoUHlfSVNfTkFOKHYtPm9iX2Z2YWwpKSB7Ci0JCQlzdHJjcHkoYnVmLCAibmFuIik7Ci0JCX0KLSAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgIGlmIChQeV9JU19OQU4odi0+b2JfZnZhbCkpIHsKKyAgICAgICAgICAgIHN0cmNweShidWYsICJuYW4iKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCiAjZW5kaWYKLQkJaWYgKFB5X0lTX0lORklOSVRZKHYtPm9iX2Z2YWwpKSB7Ci0JCQljcCA9IGJ1ZjsKLQkJCWlmICgqY3AgPT0gJy0nKQotCQkJCWNwKys7Ci0JCQlzdHJjcHkoY3AsICJpbmYiKTsKLQkJfQotCQlicmVhazsKLQl9CisgICAgICAgIGlmIChQeV9JU19JTkZJTklUWSh2LT5vYl9mdmFsKSkgeworICAgICAgICAgICAgY3AgPSBidWY7CisgICAgICAgICAgICBpZiAoKmNwID09ICctJykKKyAgICAgICAgICAgICAgICBjcCsrOworICAgICAgICAgICAgc3RyY3B5KGNwLCAiaW5mIik7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQogCiB9CiAKQEAgLTQwMyw3ICs0MDMsNyBAQAogdm9pZAogUHlGbG9hdF9Bc1N0cmluZ0V4KGNoYXIgKmJ1ZiwgUHlGbG9hdE9iamVjdCAqdiwgaW50IHByZWNpc2lvbikKIHsKLQlmb3JtYXRfZmxvYXQoYnVmLCAxMDAsIHYsIHByZWNpc2lvbik7CisgICAgZm9ybWF0X2Zsb2F0KGJ1ZiwgMTAwLCB2LCBwcmVjaXNpb24pOwogfQogCiAvKiBNYWNybyBhbmQgaGVscGVyIHRoYXQgY29udmVydCBQeU9iamVjdCBvYmogdG8gYSBDIGRvdWJsZSBhbmQgc3RvcmUKQEAgLTQxMywzMyArNDEzLDMzIEBACiAgICBvYmogaXMgbm90IG9mIGZsb2F0LCBpbnQgb3IgbG9uZyB0eXBlLCBQeV9Ob3RJbXBsZW1lbnRlZCBpcyBpbmNyZWYnZWQsCiAgICBzdG9yZWQgaW4gb2JqLCBhbmQgcmV0dXJuZWQgZnJvbSB0aGUgZnVuY3Rpb24gaW52b2tpbmcgdGhpcyBtYWNyby4KICovCi0jZGVmaW5lIENPTlZFUlRfVE9fRE9VQkxFKG9iaiwgZGJsKQkJCVwKLQlpZiAoUHlGbG9hdF9DaGVjayhvYmopKQkJCQlcCi0JCWRibCA9IFB5RmxvYXRfQVNfRE9VQkxFKG9iaik7CQlcCi0JZWxzZSBpZiAoY29udmVydF90b19kb3VibGUoJihvYmopLCAmKGRibCkpIDwgMCkJXAotCQlyZXR1cm4gb2JqOworI2RlZmluZSBDT05WRVJUX1RPX0RPVUJMRShvYmosIGRibCkgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKFB5RmxvYXRfQ2hlY2sob2JqKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZGJsID0gUHlGbG9hdF9BU19ET1VCTEUob2JqKTsgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgaWYgKGNvbnZlcnRfdG9fZG91YmxlKCYob2JqKSwgJihkYmwpKSA8IDApICAgICBcCisgICAgICAgIHJldHVybiBvYmo7CiAKIHN0YXRpYyBpbnQKIGNvbnZlcnRfdG9fZG91YmxlKFB5T2JqZWN0ICoqdiwgZG91YmxlICpkYmwpCiB7Ci0JcmVnaXN0ZXIgUHlPYmplY3QgKm9iaiA9ICp2OworICAgIHJlZ2lzdGVyIFB5T2JqZWN0ICpvYmogPSAqdjsKIAotCWlmIChQeUludF9DaGVjayhvYmopKSB7Ci0JCSpkYmwgPSAoZG91YmxlKVB5SW50X0FTX0xPTkcob2JqKTsKLQl9Ci0JZWxzZSBpZiAoUHlMb25nX0NoZWNrKG9iaikpIHsKLQkJKmRibCA9IFB5TG9uZ19Bc0RvdWJsZShvYmopOwotCQlpZiAoKmRibCA9PSAtMS4wICYmIFB5RXJyX09jY3VycmVkKCkpIHsKLQkJCSp2ID0gTlVMTDsKLQkJCXJldHVybiAtMTsKLQkJfQotCX0KLQllbHNlIHsKLQkJUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKLQkJKnYgPSBQeV9Ob3RJbXBsZW1lbnRlZDsKLQkJcmV0dXJuIC0xOwotCX0KLQlyZXR1cm4gMDsKKyAgICBpZiAoUHlJbnRfQ2hlY2sob2JqKSkgeworICAgICAgICAqZGJsID0gKGRvdWJsZSlQeUludF9BU19MT05HKG9iaik7CisgICAgfQorICAgIGVsc2UgaWYgKFB5TG9uZ19DaGVjayhvYmopKSB7CisgICAgICAgICpkYmwgPSBQeUxvbmdfQXNEb3VibGUob2JqKTsKKyAgICAgICAgaWYgKCpkYmwgPT0gLTEuMCAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgICAgICAqdiA9IE5VTEw7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7CisgICAgICAgICp2ID0gUHlfTm90SW1wbGVtZW50ZWQ7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIC8qIFByZWNpc2lvbnMgdXNlZCBieSByZXByKCkgYW5kIHN0cigpLCByZXNwZWN0aXZlbHkuCkBAIC00NTYsOCArNDU2LDggQEAKIAogKi8KIAotI2RlZmluZSBQUkVDX1JFUFIJMTcKLSNkZWZpbmUgUFJFQ19TVFIJMTIKKyNkZWZpbmUgUFJFQ19SRVBSICAgICAgIDE3CisjZGVmaW5lIFBSRUNfU1RSICAgICAgICAxMgogCiAvKiBYWFggUHlGbG9hdF9Bc1N0cmluZyBhbmQgUHlGbG9hdF9Bc1JlcHJTdHJpbmcgc2hvdWxkIGJlIGRlcHJlY2F0ZWQ6CiAgICBYWFggdGhleSBwYXNzIGEgY2hhciBidWZmZXIgd2l0aG91dCBwYXNzaW5nIGEgbGVuZ3RoLgpAQCAtNDY1LDQzICs0NjUsNDMgQEAKIHZvaWQKIFB5RmxvYXRfQXNTdHJpbmcoY2hhciAqYnVmLCBQeUZsb2F0T2JqZWN0ICp2KQogewotCWZvcm1hdF9mbG9hdChidWYsIDEwMCwgdiwgUFJFQ19TVFIpOworICAgIGZvcm1hdF9mbG9hdChidWYsIDEwMCwgdiwgUFJFQ19TVFIpOwogfQogCiB2b2lkCiBQeUZsb2F0X0FzUmVwclN0cmluZyhjaGFyICpidWYsIFB5RmxvYXRPYmplY3QgKnYpCiB7Ci0JZm9ybWF0X2Zsb2F0KGJ1ZiwgMTAwLCB2LCBQUkVDX1JFUFIpOworICAgIGZvcm1hdF9mbG9hdChidWYsIDEwMCwgdiwgUFJFQ19SRVBSKTsKIH0KIAogLyogQVJHU1VTRUQgKi8KIHN0YXRpYyBpbnQKIGZsb2F0X3ByaW50KFB5RmxvYXRPYmplY3QgKnYsIEZJTEUgKmZwLCBpbnQgZmxhZ3MpCiB7Ci0JY2hhciBidWZbMTAwXTsKLQlmb3JtYXRfZmxvYXQoYnVmLCBzaXplb2YoYnVmKSwgdiwKLQkJICAgICAoZmxhZ3MgJiBQeV9QUklOVF9SQVcpID8gUFJFQ19TVFIgOiBQUkVDX1JFUFIpOwotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlmcHV0cyhidWYsIGZwKTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCXJldHVybiAwOworICAgIGNoYXIgYnVmWzEwMF07CisgICAgZm9ybWF0X2Zsb2F0KGJ1Ziwgc2l6ZW9mKGJ1ZiksIHYsCisgICAgICAgICAgICAgICAgIChmbGFncyAmIFB5X1BSSU5UX1JBVykgPyBQUkVDX1NUUiA6IFBSRUNfUkVQUik7CisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIGZwdXRzKGJ1ZiwgZnApOworICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmbG9hdF9yZXByKFB5RmxvYXRPYmplY3QgKnYpCiB7Ci0JY2hhciBidWZbMTAwXTsKLQlmb3JtYXRfZmxvYXQoYnVmLCBzaXplb2YoYnVmKSwgdiwgUFJFQ19SRVBSKTsKKyAgICBjaGFyIGJ1ZlsxMDBdOworICAgIGZvcm1hdF9mbG9hdChidWYsIHNpemVvZihidWYpLCB2LCBQUkVDX1JFUFIpOwogCi0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmKTsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZmxvYXRfc3RyKFB5RmxvYXRPYmplY3QgKnYpCiB7Ci0JY2hhciBidWZbMTAwXTsKLQlmb3JtYXRfZmxvYXQoYnVmLCBzaXplb2YoYnVmKSwgdiwgUFJFQ19TVFIpOwotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CisgICAgY2hhciBidWZbMTAwXTsKKyAgICBmb3JtYXRfZmxvYXQoYnVmLCBzaXplb2YoYnVmKSwgdiwgUFJFQ19TVFIpOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CiB9CiAKIC8qIENvbXBhcmlzb24gaXMgcHJldHR5IG11Y2ggYSBuaWdodG1hcmUuICBXaGVuIGNvbXBhcmluZyBmbG9hdCB0byBmbG9hdCwKQEAgLTUyMiw2MDMgKzUyMiw2MDMgQEAKIHN0YXRpYyBQeU9iamVjdCoKIGZsb2F0X3JpY2hjb21wYXJlKFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdywgaW50IG9wKQogewotCWRvdWJsZSBpLCBqOwotCWludCByID0gMDsKKyAgICBkb3VibGUgaSwgajsKKyAgICBpbnQgciA9IDA7CiAKLQlhc3NlcnQoUHlGbG9hdF9DaGVjayh2KSk7Ci0JaSA9IFB5RmxvYXRfQVNfRE9VQkxFKHYpOworICAgIGFzc2VydChQeUZsb2F0X0NoZWNrKHYpKTsKKyAgICBpID0gUHlGbG9hdF9BU19ET1VCTEUodik7CiAKLQkvKiBTd2l0Y2ggb24gdGhlIHR5cGUgb2Ygdy4gIFNldCBpIGFuZCBqIHRvIGRvdWJsZXMgdG8gYmUgY29tcGFyZWQsCi0JICogYW5kIG9wIHRvIHRoZSByaWNoY29tcCB0byB1c2UuCi0JICovCi0JaWYgKFB5RmxvYXRfQ2hlY2sodykpCi0JCWogPSBQeUZsb2F0X0FTX0RPVUJMRSh3KTsKKyAgICAvKiBTd2l0Y2ggb24gdGhlIHR5cGUgb2Ygdy4gIFNldCBpIGFuZCBqIHRvIGRvdWJsZXMgdG8gYmUgY29tcGFyZWQsCisgICAgICogYW5kIG9wIHRvIHRoZSByaWNoY29tcCB0byB1c2UuCisgICAgICovCisgICAgaWYgKFB5RmxvYXRfQ2hlY2sodykpCisgICAgICAgIGogPSBQeUZsb2F0X0FTX0RPVUJMRSh3KTsKIAotCWVsc2UgaWYgKCFQeV9JU19GSU5JVEUoaSkpIHsKLQkJaWYgKFB5SW50X0NoZWNrKHcpIHx8IFB5TG9uZ19DaGVjayh3KSkKLQkJCS8qIElmIGkgaXMgYW4gaW5maW5pdHksIGl0cyBtYWduaXR1ZGUgZXhjZWVkcyBhbnkKLQkJCSAqIGZpbml0ZSBpbnRlZ2VyLCBzbyBpdCBkb2Vzbid0IG1hdHRlciB3aGljaCBpbnQgd2UKLQkJCSAqIGNvbXBhcmUgaSB3aXRoLiAgSWYgaSBpcyBhIE5hTiwgc2ltaWxhcmx5LgotCQkJICovCi0JCQlqID0gMC4wOwotCQllbHNlCi0JCQlnb3RvIFVuaW1wbGVtZW50ZWQ7Ci0JfQorICAgIGVsc2UgaWYgKCFQeV9JU19GSU5JVEUoaSkpIHsKKyAgICAgICAgaWYgKFB5SW50X0NoZWNrKHcpIHx8IFB5TG9uZ19DaGVjayh3KSkKKyAgICAgICAgICAgIC8qIElmIGkgaXMgYW4gaW5maW5pdHksIGl0cyBtYWduaXR1ZGUgZXhjZWVkcyBhbnkKKyAgICAgICAgICAgICAqIGZpbml0ZSBpbnRlZ2VyLCBzbyBpdCBkb2Vzbid0IG1hdHRlciB3aGljaCBpbnQgd2UKKyAgICAgICAgICAgICAqIGNvbXBhcmUgaSB3aXRoLiAgSWYgaSBpcyBhIE5hTiwgc2ltaWxhcmx5LgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBqID0gMC4wOworICAgICAgICBlbHNlCisgICAgICAgICAgICBnb3RvIFVuaW1wbGVtZW50ZWQ7CisgICAgfQogCi0JZWxzZSBpZiAoUHlJbnRfQ2hlY2sodykpIHsKLQkJbG9uZyBqaiA9IFB5SW50X0FTX0xPTkcodyk7Ci0JCS8qIEluIHRoZSB3b3JzdCByZWFsaXN0aWMgY2FzZSBJIGNhbiBpbWFnaW5lLCBDIGRvdWJsZSBpcyBhCi0JCSAqIENyYXkgc2luZ2xlIHdpdGggNDggYml0cyBvZiBwcmVjaXNpb24sIGFuZCBsb25nIGhhcyA2NAotCQkgKiBiaXRzLgotCQkgKi8KKyAgICBlbHNlIGlmIChQeUludF9DaGVjayh3KSkgeworICAgICAgICBsb25nIGpqID0gUHlJbnRfQVNfTE9ORyh3KTsKKyAgICAgICAgLyogSW4gdGhlIHdvcnN0IHJlYWxpc3RpYyBjYXNlIEkgY2FuIGltYWdpbmUsIEMgZG91YmxlIGlzIGEKKyAgICAgICAgICogQ3JheSBzaW5nbGUgd2l0aCA0OCBiaXRzIG9mIHByZWNpc2lvbiwgYW5kIGxvbmcgaGFzIDY0CisgICAgICAgICAqIGJpdHMuCisgICAgICAgICAqLwogI2lmIFNJWkVPRl9MT05HID4gNgotCQl1bnNpZ25lZCBsb25nIGFicyA9ICh1bnNpZ25lZCBsb25nKShqaiA8IDAgPyAtamogOiBqaik7Ci0JCWlmIChhYnMgPj4gNDgpIHsKLQkJCS8qIE5lZWRzIG1vcmUgdGhhbiA0OCBiaXRzLiAgTWFrZSBpdCB0YWtlIHRoZQotCQkJICogUHlMb25nIHBhdGguCi0JCQkgKi8KLQkJCVB5T2JqZWN0ICpyZXN1bHQ7Ci0JCQlQeU9iamVjdCAqd3cgPSBQeUxvbmdfRnJvbUxvbmcoamopOworICAgICAgICB1bnNpZ25lZCBsb25nIGFicyA9ICh1bnNpZ25lZCBsb25nKShqaiA8IDAgPyAtamogOiBqaik7CisgICAgICAgIGlmIChhYnMgPj4gNDgpIHsKKyAgICAgICAgICAgIC8qIE5lZWRzIG1vcmUgdGhhbiA0OCBiaXRzLiAgTWFrZSBpdCB0YWtlIHRoZQorICAgICAgICAgICAgICogUHlMb25nIHBhdGguCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisgICAgICAgICAgICBQeU9iamVjdCAqd3cgPSBQeUxvbmdfRnJvbUxvbmcoamopOwogCi0JCQlpZiAod3cgPT0gTlVMTCkKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCXJlc3VsdCA9IGZsb2F0X3JpY2hjb21wYXJlKHYsIHd3LCBvcCk7Ci0JCQlQeV9ERUNSRUYod3cpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQorICAgICAgICAgICAgaWYgKHd3ID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICByZXN1bHQgPSBmbG9hdF9yaWNoY29tcGFyZSh2LCB3dywgb3ApOworICAgICAgICAgICAgUHlfREVDUkVGKHd3KTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KICNlbmRpZgotCQlqID0gKGRvdWJsZSlqajsKLQkJYXNzZXJ0KChsb25nKWogPT0gamopOwotCX0KKyAgICAgICAgaiA9IChkb3VibGUpamo7CisgICAgICAgIGFzc2VydCgobG9uZylqID09IGpqKTsKKyAgICB9CiAKLQllbHNlIGlmIChQeUxvbmdfQ2hlY2sodykpIHsKLQkJaW50IHZzaWduID0gaSA9PSAwLjAgPyAwIDogaSA8IDAuMCA/IC0xIDogMTsKLQkJaW50IHdzaWduID0gX1B5TG9uZ19TaWduKHcpOwotCQlzaXplX3QgbmJpdHM7Ci0JCWludCBleHBvbmVudDsKKyAgICBlbHNlIGlmIChQeUxvbmdfQ2hlY2sodykpIHsKKyAgICAgICAgaW50IHZzaWduID0gaSA9PSAwLjAgPyAwIDogaSA8IDAuMCA/IC0xIDogMTsKKyAgICAgICAgaW50IHdzaWduID0gX1B5TG9uZ19TaWduKHcpOworICAgICAgICBzaXplX3QgbmJpdHM7CisgICAgICAgIGludCBleHBvbmVudDsKIAotCQlpZiAodnNpZ24gIT0gd3NpZ24pIHsKLQkJCS8qIE1hZ25pdHVkZXMgYXJlIGlycmVsZXZhbnQgLS0gdGhlIHNpZ25zIGFsb25lCi0JCQkgKiBkZXRlcm1pbmUgdGhlIG91dGNvbWUuCi0JCQkgKi8KLQkJCWkgPSAoZG91YmxlKXZzaWduOwotCQkJaiA9IChkb3VibGUpd3NpZ247Ci0JCQlnb3RvIENvbXBhcmU7Ci0JCX0KLQkJLyogVGhlIHNpZ25zIGFyZSB0aGUgc2FtZS4gKi8KLQkJLyogQ29udmVydCB3IHRvIGEgZG91YmxlIGlmIGl0IGZpdHMuICBJbiBwYXJ0aWN1bGFyLCAwIGZpdHMuICovCi0JCW5iaXRzID0gX1B5TG9uZ19OdW1CaXRzKHcpOwotCQlpZiAobmJpdHMgPT0gKHNpemVfdCktMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCQkvKiBUaGlzIGxvbmcgaXMgc28gbGFyZ2UgdGhhdCBzaXplX3QgaXNuJ3QgYmlnIGVub3VnaAotCQkJICogdG8gaG9sZCB0aGUgIyBvZiBiaXRzLiAgUmVwbGFjZSB3aXRoIGxpdHRsZSBkb3VibGVzCi0JCQkgKiB0aGF0IGdpdmUgdGhlIHNhbWUgb3V0Y29tZSAtLSB3IGlzIHNvIGxhcmdlIHRoYXQKLQkJCSAqIGl0cyBtYWduaXR1ZGUgbXVzdCBleGNlZWQgdGhlIG1hZ25pdHVkZSBvZiBhbnkKLQkJCSAqIGZpbml0ZSBmbG9hdC4KLQkJCSAqLwotCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCWkgPSAoZG91YmxlKXZzaWduOwotCQkJYXNzZXJ0KHdzaWduICE9IDApOwotCQkJaiA9IHdzaWduICogMi4wOwotCQkJZ290byBDb21wYXJlOwotCQl9Ci0JCWlmIChuYml0cyA8PSA0OCkgewotCQkJaiA9IFB5TG9uZ19Bc0RvdWJsZSh3KTsKLQkJCS8qIEl0J3MgaW1wb3NzaWJsZSB0aGF0IDw9IDQ4IGJpdHMgb3ZlcmZsb3dlZC4gKi8KLQkJCWFzc2VydChqICE9IC0xLjAgfHwgISBQeUVycl9PY2N1cnJlZCgpKTsKLQkJCWdvdG8gQ29tcGFyZTsKLQkJfQotCQlhc3NlcnQod3NpZ24gIT0gMCk7IC8qIGVsc2UgbmJpdHMgd2FzIDAgKi8KLQkJYXNzZXJ0KHZzaWduICE9IDApOyAvKiBpZiB2c2lnbiB3ZXJlIDAsIHRoZW4gc2luY2Ugd3NpZ24gaXMKLQkJICAgICAgICAgICAgICAgICAgICAgKiBub3QgMCwgd2Ugd291bGQgaGF2ZSB0YWtlbiB0aGUKLQkJICAgICAgICAgICAgICAgICAgICAgKiB2c2lnbiAhPSB3c2lnbiBicmFuY2ggYXQgdGhlIHN0YXJ0ICovCi0JCS8qIFdlIHdhbnQgdG8gd29yayB3aXRoIG5vbi1uZWdhdGl2ZSBudW1iZXJzLiAqLwotCQlpZiAodnNpZ24gPCAwKSB7Ci0JCQkvKiAiTXVsdGlwbHkgYm90aCBzaWRlcyIgYnkgLTE7IHRoaXMgYWxzbyBzd2FwcyB0aGUKLQkJCSAqIGNvbXBhcmF0b3IuCi0JCQkgKi8KLQkJCWkgPSAtaTsKLQkJCW9wID0gX1B5X1N3YXBwZWRPcFtvcF07Ci0JCX0KLQkJYXNzZXJ0KGkgPiAwLjApOwotCQkodm9pZCkgZnJleHAoaSwgJmV4cG9uZW50KTsKLQkJLyogZXhwb25lbnQgaXMgdGhlICMgb2YgYml0cyBpbiB2IGJlZm9yZSB0aGUgcmFkaXggcG9pbnQ7Ci0JCSAqIHdlIGtub3cgdGhhdCBuYml0cyAodGhlICMgb2YgYml0cyBpbiB3KSA+IDQ4IGF0IHRoaXMgcG9pbnQKLQkJICovCi0JCWlmIChleHBvbmVudCA8IDAgfHwgKHNpemVfdClleHBvbmVudCA8IG5iaXRzKSB7Ci0JCQlpID0gMS4wOwotCQkJaiA9IDIuMDsKLQkJCWdvdG8gQ29tcGFyZTsKLQkJfQotCQlpZiAoKHNpemVfdClleHBvbmVudCA+IG5iaXRzKSB7Ci0JCQlpID0gMi4wOwotCQkJaiA9IDEuMDsKLQkJCWdvdG8gQ29tcGFyZTsKLQkJfQotCQkvKiB2IGFuZCB3IGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIGJpdHMgYmVmb3JlIHRoZSByYWRpeAotCQkgKiBwb2ludC4gIENvbnN0cnVjdCB0d28gbG9uZ3MgdGhhdCBoYXZlIHRoZSBzYW1lIGNvbXBhcmlzb24KLQkJICogb3V0Y29tZS4KLQkJICovCi0JCXsKLQkJCWRvdWJsZSBmcmFjcGFydDsKLQkJCWRvdWJsZSBpbnRwYXJ0OwotCQkJUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7Ci0JCQlQeU9iamVjdCAqb25lID0gTlVMTDsKLQkJCVB5T2JqZWN0ICp2diA9IE5VTEw7Ci0JCQlQeU9iamVjdCAqd3cgPSB3OworICAgICAgICBpZiAodnNpZ24gIT0gd3NpZ24pIHsKKyAgICAgICAgICAgIC8qIE1hZ25pdHVkZXMgYXJlIGlycmVsZXZhbnQgLS0gdGhlIHNpZ25zIGFsb25lCisgICAgICAgICAgICAgKiBkZXRlcm1pbmUgdGhlIG91dGNvbWUuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGkgPSAoZG91YmxlKXZzaWduOworICAgICAgICAgICAgaiA9IChkb3VibGUpd3NpZ247CisgICAgICAgICAgICBnb3RvIENvbXBhcmU7CisgICAgICAgIH0KKyAgICAgICAgLyogVGhlIHNpZ25zIGFyZSB0aGUgc2FtZS4gKi8KKyAgICAgICAgLyogQ29udmVydCB3IHRvIGEgZG91YmxlIGlmIGl0IGZpdHMuICBJbiBwYXJ0aWN1bGFyLCAwIGZpdHMuICovCisgICAgICAgIG5iaXRzID0gX1B5TG9uZ19OdW1CaXRzKHcpOworICAgICAgICBpZiAobmJpdHMgPT0gKHNpemVfdCktMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgICAgICAvKiBUaGlzIGxvbmcgaXMgc28gbGFyZ2UgdGhhdCBzaXplX3QgaXNuJ3QgYmlnIGVub3VnaAorICAgICAgICAgICAgICogdG8gaG9sZCB0aGUgIyBvZiBiaXRzLiAgUmVwbGFjZSB3aXRoIGxpdHRsZSBkb3VibGVzCisgICAgICAgICAgICAgKiB0aGF0IGdpdmUgdGhlIHNhbWUgb3V0Y29tZSAtLSB3IGlzIHNvIGxhcmdlIHRoYXQKKyAgICAgICAgICAgICAqIGl0cyBtYWduaXR1ZGUgbXVzdCBleGNlZWQgdGhlIG1hZ25pdHVkZSBvZiBhbnkKKyAgICAgICAgICAgICAqIGZpbml0ZSBmbG9hdC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgIGkgPSAoZG91YmxlKXZzaWduOworICAgICAgICAgICAgYXNzZXJ0KHdzaWduICE9IDApOworICAgICAgICAgICAgaiA9IHdzaWduICogMi4wOworICAgICAgICAgICAgZ290byBDb21wYXJlOworICAgICAgICB9CisgICAgICAgIGlmIChuYml0cyA8PSA0OCkgeworICAgICAgICAgICAgaiA9IFB5TG9uZ19Bc0RvdWJsZSh3KTsKKyAgICAgICAgICAgIC8qIEl0J3MgaW1wb3NzaWJsZSB0aGF0IDw9IDQ4IGJpdHMgb3ZlcmZsb3dlZC4gKi8KKyAgICAgICAgICAgIGFzc2VydChqICE9IC0xLjAgfHwgISBQeUVycl9PY2N1cnJlZCgpKTsKKyAgICAgICAgICAgIGdvdG8gQ29tcGFyZTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnQod3NpZ24gIT0gMCk7IC8qIGVsc2UgbmJpdHMgd2FzIDAgKi8KKyAgICAgICAgYXNzZXJ0KHZzaWduICE9IDApOyAvKiBpZiB2c2lnbiB3ZXJlIDAsIHRoZW4gc2luY2Ugd3NpZ24gaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBub3QgMCwgd2Ugd291bGQgaGF2ZSB0YWtlbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB2c2lnbiAhPSB3c2lnbiBicmFuY2ggYXQgdGhlIHN0YXJ0ICovCisgICAgICAgIC8qIFdlIHdhbnQgdG8gd29yayB3aXRoIG5vbi1uZWdhdGl2ZSBudW1iZXJzLiAqLworICAgICAgICBpZiAodnNpZ24gPCAwKSB7CisgICAgICAgICAgICAvKiAiTXVsdGlwbHkgYm90aCBzaWRlcyIgYnkgLTE7IHRoaXMgYWxzbyBzd2FwcyB0aGUKKyAgICAgICAgICAgICAqIGNvbXBhcmF0b3IuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGkgPSAtaTsKKyAgICAgICAgICAgIG9wID0gX1B5X1N3YXBwZWRPcFtvcF07CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0KGkgPiAwLjApOworICAgICAgICAodm9pZCkgZnJleHAoaSwgJmV4cG9uZW50KTsKKyAgICAgICAgLyogZXhwb25lbnQgaXMgdGhlICMgb2YgYml0cyBpbiB2IGJlZm9yZSB0aGUgcmFkaXggcG9pbnQ7CisgICAgICAgICAqIHdlIGtub3cgdGhhdCBuYml0cyAodGhlICMgb2YgYml0cyBpbiB3KSA+IDQ4IGF0IHRoaXMgcG9pbnQKKyAgICAgICAgICovCisgICAgICAgIGlmIChleHBvbmVudCA8IDAgfHwgKHNpemVfdClleHBvbmVudCA8IG5iaXRzKSB7CisgICAgICAgICAgICBpID0gMS4wOworICAgICAgICAgICAgaiA9IDIuMDsKKyAgICAgICAgICAgIGdvdG8gQ29tcGFyZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHNpemVfdClleHBvbmVudCA+IG5iaXRzKSB7CisgICAgICAgICAgICBpID0gMi4wOworICAgICAgICAgICAgaiA9IDEuMDsKKyAgICAgICAgICAgIGdvdG8gQ29tcGFyZTsKKyAgICAgICAgfQorICAgICAgICAvKiB2IGFuZCB3IGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIGJpdHMgYmVmb3JlIHRoZSByYWRpeAorICAgICAgICAgKiBwb2ludC4gIENvbnN0cnVjdCB0d28gbG9uZ3MgdGhhdCBoYXZlIHRoZSBzYW1lIGNvbXBhcmlzb24KKyAgICAgICAgICogb3V0Y29tZS4KKyAgICAgICAgICovCisgICAgICAgIHsKKyAgICAgICAgICAgIGRvdWJsZSBmcmFjcGFydDsKKyAgICAgICAgICAgIGRvdWJsZSBpbnRwYXJ0OworICAgICAgICAgICAgUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7CisgICAgICAgICAgICBQeU9iamVjdCAqb25lID0gTlVMTDsKKyAgICAgICAgICAgIFB5T2JqZWN0ICp2diA9IE5VTEw7CisgICAgICAgICAgICBQeU9iamVjdCAqd3cgPSB3OwogCi0JCQlpZiAod3NpZ24gPCAwKSB7Ci0JCQkJd3cgPSBQeU51bWJlcl9OZWdhdGl2ZSh3KTsKLQkJCQlpZiAod3cgPT0gTlVMTCkKLQkJCQkJZ290byBFcnJvcjsKLQkJCX0KLQkJCWVsc2UKLQkJCQlQeV9JTkNSRUYod3cpOworICAgICAgICAgICAgaWYgKHdzaWduIDwgMCkgeworICAgICAgICAgICAgICAgIHd3ID0gUHlOdW1iZXJfTmVnYXRpdmUodyk7CisgICAgICAgICAgICAgICAgaWYgKHd3ID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gRXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgUHlfSU5DUkVGKHd3KTsKIAotCQkJZnJhY3BhcnQgPSBtb2RmKGksICZpbnRwYXJ0KTsKLQkJCXZ2ID0gUHlMb25nX0Zyb21Eb3VibGUoaW50cGFydCk7Ci0JCQlpZiAodnYgPT0gTlVMTCkKLQkJCQlnb3RvIEVycm9yOworICAgICAgICAgICAgZnJhY3BhcnQgPSBtb2RmKGksICZpbnRwYXJ0KTsKKyAgICAgICAgICAgIHZ2ID0gUHlMb25nX0Zyb21Eb3VibGUoaW50cGFydCk7CisgICAgICAgICAgICBpZiAodnYgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBnb3RvIEVycm9yOwogCi0JCQlpZiAoZnJhY3BhcnQgIT0gMC4wKSB7Ci0JCQkJLyogU2hpZnQgbGVmdCwgYW5kIG9yIGEgMSBiaXQgaW50byB2dgotCQkJCSAqIHRvIHJlcHJlc2VudCB0aGUgbG9zdCBmcmFjdGlvbi4KLQkJCQkgKi8KLQkJCQlQeU9iamVjdCAqdGVtcDsKKyAgICAgICAgICAgIGlmIChmcmFjcGFydCAhPSAwLjApIHsKKyAgICAgICAgICAgICAgICAvKiBTaGlmdCBsZWZ0LCBhbmQgb3IgYSAxIGJpdCBpbnRvIHZ2CisgICAgICAgICAgICAgICAgICogdG8gcmVwcmVzZW50IHRoZSBsb3N0IGZyYWN0aW9uLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIFB5T2JqZWN0ICp0ZW1wOwogCi0JCQkJb25lID0gUHlJbnRfRnJvbUxvbmcoMSk7Ci0JCQkJaWYgKG9uZSA9PSBOVUxMKQotCQkJCQlnb3RvIEVycm9yOworICAgICAgICAgICAgICAgIG9uZSA9IFB5SW50X0Zyb21Mb25nKDEpOworICAgICAgICAgICAgICAgIGlmIChvbmUgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgZ290byBFcnJvcjsKIAotCQkJCXRlbXAgPSBQeU51bWJlcl9Mc2hpZnQod3csIG9uZSk7Ci0JCQkJaWYgKHRlbXAgPT0gTlVMTCkKLQkJCQkJZ290byBFcnJvcjsKLQkJCQlQeV9ERUNSRUYod3cpOwotCQkJCXd3ID0gdGVtcDsKKyAgICAgICAgICAgICAgICB0ZW1wID0gUHlOdW1iZXJfTHNoaWZ0KHd3LCBvbmUpOworICAgICAgICAgICAgICAgIGlmICh0ZW1wID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gRXJyb3I7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHd3KTsKKyAgICAgICAgICAgICAgICB3dyA9IHRlbXA7CiAKLQkJCQl0ZW1wID0gUHlOdW1iZXJfTHNoaWZ0KHZ2LCBvbmUpOwotCQkJCWlmICh0ZW1wID09IE5VTEwpCi0JCQkJCWdvdG8gRXJyb3I7Ci0JCQkJUHlfREVDUkVGKHZ2KTsKLQkJCQl2diA9IHRlbXA7CisgICAgICAgICAgICAgICAgdGVtcCA9IFB5TnVtYmVyX0xzaGlmdCh2diwgb25lKTsKKyAgICAgICAgICAgICAgICBpZiAodGVtcCA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICBnb3RvIEVycm9yOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih2dik7CisgICAgICAgICAgICAgICAgdnYgPSB0ZW1wOwogCi0JCQkJdGVtcCA9IFB5TnVtYmVyX09yKHZ2LCBvbmUpOwotCQkJCWlmICh0ZW1wID09IE5VTEwpCi0JCQkJCWdvdG8gRXJyb3I7Ci0JCQkJUHlfREVDUkVGKHZ2KTsKLQkJCQl2diA9IHRlbXA7Ci0JCQl9CisgICAgICAgICAgICAgICAgdGVtcCA9IFB5TnVtYmVyX09yKHZ2LCBvbmUpOworICAgICAgICAgICAgICAgIGlmICh0ZW1wID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gRXJyb3I7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHZ2KTsKKyAgICAgICAgICAgICAgICB2diA9IHRlbXA7CisgICAgICAgICAgICB9CiAKLQkJCXIgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2wodnYsIHd3LCBvcCk7Ci0JCQlpZiAociA8IDApCi0JCQkJZ290byBFcnJvcjsKLQkJCXJlc3VsdCA9IFB5Qm9vbF9Gcm9tTG9uZyhyKTsKLSAJCSBFcnJvcjoKLSAJCSAJUHlfWERFQ1JFRih2dik7Ci0gCQkgCVB5X1hERUNSRUYod3cpOwotIAkJIAlQeV9YREVDUkVGKG9uZSk7Ci0gCQkgCXJldHVybiByZXN1bHQ7Ci0JCX0KLQl9IC8qIGVsc2UgaWYgKFB5TG9uZ19DaGVjayh3KSkgKi8KKyAgICAgICAgICAgIHIgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2wodnYsIHd3LCBvcCk7CisgICAgICAgICAgICBpZiAociA8IDApCisgICAgICAgICAgICAgICAgZ290byBFcnJvcjsKKyAgICAgICAgICAgIHJlc3VsdCA9IFB5Qm9vbF9Gcm9tTG9uZyhyKTsKKyAgICAgICAgIEVycm9yOgorICAgICAgICAgICAgUHlfWERFQ1JFRih2dik7CisgICAgICAgICAgICBQeV9YREVDUkVGKHd3KTsKKyAgICAgICAgICAgIFB5X1hERUNSRUYob25lKTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICB9IC8qIGVsc2UgaWYgKFB5TG9uZ19DaGVjayh3KSkgKi8KIAotCWVsc2UJLyogdyBpc24ndCBmbG9hdCwgaW50LCBvciBsb25nICovCi0JCWdvdG8gVW5pbXBsZW1lbnRlZDsKKyAgICBlbHNlICAgICAgICAvKiB3IGlzbid0IGZsb2F0LCBpbnQsIG9yIGxvbmcgKi8KKyAgICAgICAgZ290byBVbmltcGxlbWVudGVkOwogCiAgQ29tcGFyZToKLQlQeUZQRV9TVEFSVF9QUk9URUNUKCJyaWNoY29tcGFyZSIsIHJldHVybiBOVUxMKQotCXN3aXRjaCAob3ApIHsKLQljYXNlIFB5X0VROgotCQlyID0gaSA9PSBqOwotCQlicmVhazsKLQljYXNlIFB5X05FOgotCQlyID0gaSAhPSBqOwotCQlicmVhazsKLQljYXNlIFB5X0xFOgotCQlyID0gaSA8PSBqOwotCQlicmVhazsKLQljYXNlIFB5X0dFOgotCQlyID0gaSA+PSBqOwotCQlicmVhazsKLQljYXNlIFB5X0xUOgotCQlyID0gaSA8IGo7Ci0JCWJyZWFrOwotCWNhc2UgUHlfR1Q6Ci0JCXIgPSBpID4gajsKLQkJYnJlYWs7Ci0JfQotCVB5RlBFX0VORF9QUk9URUNUKHIpCi0JcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZyhyKTsKKyAgICBQeUZQRV9TVEFSVF9QUk9URUNUKCJyaWNoY29tcGFyZSIsIHJldHVybiBOVUxMKQorICAgIHN3aXRjaCAob3ApIHsKKyAgICBjYXNlIFB5X0VROgorICAgICAgICByID0gaSA9PSBqOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFB5X05FOgorICAgICAgICByID0gaSAhPSBqOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFB5X0xFOgorICAgICAgICByID0gaSA8PSBqOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFB5X0dFOgorICAgICAgICByID0gaSA+PSBqOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFB5X0xUOgorICAgICAgICByID0gaSA8IGo7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUHlfR1Q6CisgICAgICAgIHIgPSBpID4gajsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIFB5RlBFX0VORF9QUk9URUNUKHIpCisgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZyhyKTsKIAogIFVuaW1wbGVtZW50ZWQ6Ci0JUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKLQlyZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7CisgICAgUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKKyAgICByZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7CiB9CiAKIHN0YXRpYyBsb25nCiBmbG9hdF9oYXNoKFB5RmxvYXRPYmplY3QgKnYpCiB7Ci0JcmV0dXJuIF9QeV9IYXNoRG91YmxlKHYtPm9iX2Z2YWwpOworICAgIHJldHVybiBfUHlfSGFzaERvdWJsZSh2LT5vYl9mdmFsKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZsb2F0X2FkZChQeU9iamVjdCAqdiwgUHlPYmplY3QgKncpCiB7Ci0JZG91YmxlIGEsYjsKLQlDT05WRVJUX1RPX0RPVUJMRSh2LCBhKTsKLQlDT05WRVJUX1RPX0RPVUJMRSh3LCBiKTsKLQlQeUZQRV9TVEFSVF9QUk9URUNUKCJhZGQiLCByZXR1cm4gMCkKLQlhID0gYSArIGI7Ci0JUHlGUEVfRU5EX1BST1RFQ1QoYSkKLQlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKGEpOworICAgIGRvdWJsZSBhLGI7CisgICAgQ09OVkVSVF9UT19ET1VCTEUodiwgYSk7CisgICAgQ09OVkVSVF9UT19ET1VCTEUodywgYik7CisgICAgUHlGUEVfU1RBUlRfUFJPVEVDVCgiYWRkIiwgcmV0dXJuIDApCisgICAgYSA9IGEgKyBiOworICAgIFB5RlBFX0VORF9QUk9URUNUKGEpCisgICAgcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShhKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZsb2F0X3N1YihQeU9iamVjdCAqdiwgUHlPYmplY3QgKncpCiB7Ci0JZG91YmxlIGEsYjsKLQlDT05WRVJUX1RPX0RPVUJMRSh2LCBhKTsKLQlDT05WRVJUX1RPX0RPVUJMRSh3LCBiKTsKLQlQeUZQRV9TVEFSVF9QUk9URUNUKCJzdWJ0cmFjdCIsIHJldHVybiAwKQotCWEgPSBhIC0gYjsKLQlQeUZQRV9FTkRfUFJPVEVDVChhKQotCXJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoYSk7CisgICAgZG91YmxlIGEsYjsKKyAgICBDT05WRVJUX1RPX0RPVUJMRSh2LCBhKTsKKyAgICBDT05WRVJUX1RPX0RPVUJMRSh3LCBiKTsKKyAgICBQeUZQRV9TVEFSVF9QUk9URUNUKCJzdWJ0cmFjdCIsIHJldHVybiAwKQorICAgIGEgPSBhIC0gYjsKKyAgICBQeUZQRV9FTkRfUFJPVEVDVChhKQorICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoYSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmbG9hdF9tdWwoUHlPYmplY3QgKnYsIFB5T2JqZWN0ICp3KQogewotCWRvdWJsZSBhLGI7Ci0JQ09OVkVSVF9UT19ET1VCTEUodiwgYSk7Ci0JQ09OVkVSVF9UT19ET1VCTEUodywgYik7Ci0JUHlGUEVfU1RBUlRfUFJPVEVDVCgibXVsdGlwbHkiLCByZXR1cm4gMCkKLQlhID0gYSAqIGI7Ci0JUHlGUEVfRU5EX1BST1RFQ1QoYSkKLQlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKGEpOworICAgIGRvdWJsZSBhLGI7CisgICAgQ09OVkVSVF9UT19ET1VCTEUodiwgYSk7CisgICAgQ09OVkVSVF9UT19ET1VCTEUodywgYik7CisgICAgUHlGUEVfU1RBUlRfUFJPVEVDVCgibXVsdGlwbHkiLCByZXR1cm4gMCkKKyAgICBhID0gYSAqIGI7CisgICAgUHlGUEVfRU5EX1BST1RFQ1QoYSkKKyAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKGEpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZmxvYXRfZGl2KFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdykKIHsKLQlkb3VibGUgYSxiOwotCUNPTlZFUlRfVE9fRE9VQkxFKHYsIGEpOwotCUNPTlZFUlRfVE9fRE9VQkxFKHcsIGIpOworICAgIGRvdWJsZSBhLGI7CisgICAgQ09OVkVSVF9UT19ET1VCTEUodiwgYSk7CisgICAgQ09OVkVSVF9UT19ET1VCTEUodywgYik7CiAjaWZkZWYgUHlfTkFOCi0JaWYgKGIgPT0gMC4wKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19aZXJvRGl2aXNpb25FcnJvciwKLQkJCQkiZmxvYXQgZGl2aXNpb24iKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChiID09IDAuMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfWmVyb0RpdmlzaW9uRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiZmxvYXQgZGl2aXNpb24iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogI2VuZGlmCi0JUHlGUEVfU1RBUlRfUFJPVEVDVCgiZGl2aWRlIiwgcmV0dXJuIDApCi0JYSA9IGEgLyBiOwotCVB5RlBFX0VORF9QUk9URUNUKGEpCi0JcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShhKTsKKyAgICBQeUZQRV9TVEFSVF9QUk9URUNUKCJkaXZpZGUiLCByZXR1cm4gMCkKKyAgICBhID0gYSAvIGI7CisgICAgUHlGUEVfRU5EX1BST1RFQ1QoYSkKKyAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKGEpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZmxvYXRfY2xhc3NpY19kaXYoUHlPYmplY3QgKnYsIFB5T2JqZWN0ICp3KQogewotCWRvdWJsZSBhLGI7Ci0JQ09OVkVSVF9UT19ET1VCTEUodiwgYSk7Ci0JQ09OVkVSVF9UT19ET1VCTEUodywgYik7Ci0JaWYgKFB5X0RpdmlzaW9uV2FybmluZ0ZsYWcgPj0gMiAmJgotCSAgICBQeUVycl9XYXJuKFB5RXhjX0RlcHJlY2F0aW9uV2FybmluZywgImNsYXNzaWMgZmxvYXQgZGl2aXNpb24iKSA8IDApCi0JCXJldHVybiBOVUxMOworICAgIGRvdWJsZSBhLGI7CisgICAgQ09OVkVSVF9UT19ET1VCTEUodiwgYSk7CisgICAgQ09OVkVSVF9UT19ET1VCTEUodywgYik7CisgICAgaWYgKFB5X0RpdmlzaW9uV2FybmluZ0ZsYWcgPj0gMiAmJgorICAgICAgICBQeUVycl9XYXJuKFB5RXhjX0RlcHJlY2F0aW9uV2FybmluZywgImNsYXNzaWMgZmxvYXQgZGl2aXNpb24iKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOwogI2lmZGVmIFB5X05BTgotCWlmIChiID09IDAuMCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfWmVyb0RpdmlzaW9uRXJyb3IsCi0JCQkJImZsb2F0IGRpdmlzaW9uIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoYiA9PSAwLjApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1plcm9EaXZpc2lvbkVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImZsb2F0IGRpdmlzaW9uIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KICNlbmRpZgotCVB5RlBFX1NUQVJUX1BST1RFQ1QoImRpdmlkZSIsIHJldHVybiAwKQotCWEgPSBhIC8gYjsKLQlQeUZQRV9FTkRfUFJPVEVDVChhKQotCXJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoYSk7CisgICAgUHlGUEVfU1RBUlRfUFJPVEVDVCgiZGl2aWRlIiwgcmV0dXJuIDApCisgICAgYSA9IGEgLyBiOworICAgIFB5RlBFX0VORF9QUk9URUNUKGEpCisgICAgcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShhKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZsb2F0X3JlbShQeU9iamVjdCAqdiwgUHlPYmplY3QgKncpCiB7Ci0JZG91YmxlIHZ4LCB3eDsKLQlkb3VibGUgbW9kOwotCUNPTlZFUlRfVE9fRE9VQkxFKHYsIHZ4KTsKLQlDT05WRVJUX1RPX0RPVUJMRSh3LCB3eCk7CisgICAgZG91YmxlIHZ4LCB3eDsKKyAgICBkb3VibGUgbW9kOworICAgIENPTlZFUlRfVE9fRE9VQkxFKHYsIHZ4KTsKKyAgICBDT05WRVJUX1RPX0RPVUJMRSh3LCB3eCk7CiAjaWZkZWYgUHlfTkFOCi0JaWYgKHd4ID09IDAuMCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfWmVyb0RpdmlzaW9uRXJyb3IsCi0JCQkJImZsb2F0IG1vZHVsbyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKHd4ID09IDAuMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfWmVyb0RpdmlzaW9uRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiZmxvYXQgbW9kdWxvIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KICNlbmRpZgotCVB5RlBFX1NUQVJUX1BST1RFQ1QoIm1vZHVsbyIsIHJldHVybiAwKQotCW1vZCA9IGZtb2QodngsIHd4KTsKLQkvKiBub3RlOiBjaGVja2luZyBtb2Qqd3ggPCAwIGlzIGluY29ycmVjdCAtLSB1bmRlcmZsb3dzIHRvCi0JICAgMCBpZiB3eCA8IHNxcnQoc21hbGxlc3Qgbm9uemVybyBkb3VibGUpICovCi0JaWYgKG1vZCAmJiAoKHd4IDwgMCkgIT0gKG1vZCA8IDApKSkgewotCQltb2QgKz0gd3g7Ci0JfQotCVB5RlBFX0VORF9QUk9URUNUKG1vZCkKLQlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKG1vZCk7CisgICAgUHlGUEVfU1RBUlRfUFJPVEVDVCgibW9kdWxvIiwgcmV0dXJuIDApCisgICAgbW9kID0gZm1vZCh2eCwgd3gpOworICAgIC8qIG5vdGU6IGNoZWNraW5nIG1vZCp3eCA8IDAgaXMgaW5jb3JyZWN0IC0tIHVuZGVyZmxvd3MgdG8KKyAgICAgICAwIGlmIHd4IDwgc3FydChzbWFsbGVzdCBub256ZXJvIGRvdWJsZSkgKi8KKyAgICBpZiAobW9kICYmICgod3ggPCAwKSAhPSAobW9kIDwgMCkpKSB7CisgICAgICAgIG1vZCArPSB3eDsKKyAgICB9CisgICAgUHlGUEVfRU5EX1BST1RFQ1QobW9kKQorICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUobW9kKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZsb2F0X2Rpdm1vZChQeU9iamVjdCAqdiwgUHlPYmplY3QgKncpCiB7Ci0JZG91YmxlIHZ4LCB3eDsKLQlkb3VibGUgZGl2LCBtb2QsIGZsb29yZGl2OwotIAlDT05WRVJUX1RPX0RPVUJMRSh2LCB2eCk7Ci0gCUNPTlZFUlRfVE9fRE9VQkxFKHcsIHd4KTsKLQlpZiAod3ggPT0gMC4wKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19aZXJvRGl2aXNpb25FcnJvciwgImZsb2F0IGRpdm1vZCgpIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlQeUZQRV9TVEFSVF9QUk9URUNUKCJkaXZtb2QiLCByZXR1cm4gMCkKLQltb2QgPSBmbW9kKHZ4LCB3eCk7Ci0JLyogZm1vZCBpcyB0eXBpY2FsbHkgZXhhY3QsIHNvIHZ4LW1vZCBpcyAqbWF0aGVtYXRpY2FsbHkqIGFuCi0JICAgZXhhY3QgbXVsdGlwbGUgb2Ygd3guICBCdXQgdGhpcyBpcyBmcCBhcml0aG1ldGljLCBhbmQgZnAKLQkgICB2eCAtIG1vZCBpcyBhbiBhcHByb3hpbWF0aW9uOyB0aGUgcmVzdWx0IGlzIHRoYXQgZGl2IG1heQotCSAgIG5vdCBiZSBhbiBleGFjdCBpbnRlZ3JhbCB2YWx1ZSBhZnRlciB0aGUgZGl2aXNpb24sIGFsdGhvdWdoCi0JICAgaXQgd2lsbCBhbHdheXMgYmUgdmVyeSBjbG9zZSB0byBvbmUuCi0JKi8KLQlkaXYgPSAodnggLSBtb2QpIC8gd3g7Ci0JaWYgKG1vZCkgewotCQkvKiBlbnN1cmUgdGhlIHJlbWFpbmRlciBoYXMgdGhlIHNhbWUgc2lnbiBhcyB0aGUgZGVub21pbmF0b3IgKi8KLQkJaWYgKCh3eCA8IDApICE9IChtb2QgPCAwKSkgewotCQkJbW9kICs9IHd4OwotCQkJZGl2IC09IDEuMDsKLQkJfQotCX0KLQllbHNlIHsKLQkJLyogdGhlIHJlbWFpbmRlciBpcyB6ZXJvLCBhbmQgaW4gdGhlIHByZXNlbmNlIG9mIHNpZ25lZCB6ZXJvZXMKLQkJICAgZm1vZCByZXR1cm5zIGRpZmZlcmVudCByZXN1bHRzIGFjcm9zcyBwbGF0Zm9ybXM7IGVuc3VyZQotCQkgICBpdCBoYXMgdGhlIHNhbWUgc2lnbiBhcyB0aGUgZGVub21pbmF0b3I7IHdlJ2QgbGlrZSB0byBkbwotCQkgICAibW9kID0gd3ggKiAwLjAiLCBidXQgdGhhdCBtYXkgZ2V0IG9wdGltaXplZCBhd2F5ICovCi0JCW1vZCAqPSBtb2Q7ICAvKiBoaWRlICJtb2QgPSArMCIgZnJvbSBvcHRpbWl6ZXIgKi8KLQkJaWYgKHd4IDwgMC4wKQotCQkJbW9kID0gLW1vZDsKLQl9Ci0JLyogc25hcCBxdW90aWVudCB0byBuZWFyZXN0IGludGVncmFsIHZhbHVlICovCi0JaWYgKGRpdikgewotCQlmbG9vcmRpdiA9IGZsb29yKGRpdik7Ci0JCWlmIChkaXYgLSBmbG9vcmRpdiA+IDAuNSkKLQkJCWZsb29yZGl2ICs9IDEuMDsKLQl9Ci0JZWxzZSB7Ci0JCS8qIGRpdiBpcyB6ZXJvIC0gZ2V0IHRoZSBzYW1lIHNpZ24gYXMgdGhlIHRydWUgcXVvdGllbnQgKi8KLQkJZGl2ICo9IGRpdjsJLyogaGlkZSAiZGl2ID0gKzAiIGZyb20gb3B0aW1pemVycyAqLwotCQlmbG9vcmRpdiA9IGRpdiAqIHZ4IC8gd3g7IC8qIHplcm8gdy8gc2lnbiBvZiB2eC93eCAqLwotCX0KLQlQeUZQRV9FTkRfUFJPVEVDVChmbG9vcmRpdikKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKGRkKSIsIGZsb29yZGl2LCBtb2QpOworICAgIGRvdWJsZSB2eCwgd3g7CisgICAgZG91YmxlIGRpdiwgbW9kLCBmbG9vcmRpdjsKKyAgICBDT05WRVJUX1RPX0RPVUJMRSh2LCB2eCk7CisgICAgQ09OVkVSVF9UT19ET1VCTEUodywgd3gpOworICAgIGlmICh3eCA9PSAwLjApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1plcm9EaXZpc2lvbkVycm9yLCAiZmxvYXQgZGl2bW9kKCkiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5RlBFX1NUQVJUX1BST1RFQ1QoImRpdm1vZCIsIHJldHVybiAwKQorICAgIG1vZCA9IGZtb2QodngsIHd4KTsKKyAgICAvKiBmbW9kIGlzIHR5cGljYWxseSBleGFjdCwgc28gdngtbW9kIGlzICptYXRoZW1hdGljYWxseSogYW4KKyAgICAgICBleGFjdCBtdWx0aXBsZSBvZiB3eC4gIEJ1dCB0aGlzIGlzIGZwIGFyaXRobWV0aWMsIGFuZCBmcAorICAgICAgIHZ4IC0gbW9kIGlzIGFuIGFwcHJveGltYXRpb247IHRoZSByZXN1bHQgaXMgdGhhdCBkaXYgbWF5CisgICAgICAgbm90IGJlIGFuIGV4YWN0IGludGVncmFsIHZhbHVlIGFmdGVyIHRoZSBkaXZpc2lvbiwgYWx0aG91Z2gKKyAgICAgICBpdCB3aWxsIGFsd2F5cyBiZSB2ZXJ5IGNsb3NlIHRvIG9uZS4KKyAgICAqLworICAgIGRpdiA9ICh2eCAtIG1vZCkgLyB3eDsKKyAgICBpZiAobW9kKSB7CisgICAgICAgIC8qIGVuc3VyZSB0aGUgcmVtYWluZGVyIGhhcyB0aGUgc2FtZSBzaWduIGFzIHRoZSBkZW5vbWluYXRvciAqLworICAgICAgICBpZiAoKHd4IDwgMCkgIT0gKG1vZCA8IDApKSB7CisgICAgICAgICAgICBtb2QgKz0gd3g7CisgICAgICAgICAgICBkaXYgLT0gMS4wOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvKiB0aGUgcmVtYWluZGVyIGlzIHplcm8sIGFuZCBpbiB0aGUgcHJlc2VuY2Ugb2Ygc2lnbmVkIHplcm9lcworICAgICAgICAgICBmbW9kIHJldHVybnMgZGlmZmVyZW50IHJlc3VsdHMgYWNyb3NzIHBsYXRmb3JtczsgZW5zdXJlCisgICAgICAgICAgIGl0IGhhcyB0aGUgc2FtZSBzaWduIGFzIHRoZSBkZW5vbWluYXRvcjsgd2UnZCBsaWtlIHRvIGRvCisgICAgICAgICAgICJtb2QgPSB3eCAqIDAuMCIsIGJ1dCB0aGF0IG1heSBnZXQgb3B0aW1pemVkIGF3YXkgKi8KKyAgICAgICAgbW9kICo9IG1vZDsgIC8qIGhpZGUgIm1vZCA9ICswIiBmcm9tIG9wdGltaXplciAqLworICAgICAgICBpZiAod3ggPCAwLjApCisgICAgICAgICAgICBtb2QgPSAtbW9kOworICAgIH0KKyAgICAvKiBzbmFwIHF1b3RpZW50IHRvIG5lYXJlc3QgaW50ZWdyYWwgdmFsdWUgKi8KKyAgICBpZiAoZGl2KSB7CisgICAgICAgIGZsb29yZGl2ID0gZmxvb3IoZGl2KTsKKyAgICAgICAgaWYgKGRpdiAtIGZsb29yZGl2ID4gMC41KQorICAgICAgICAgICAgZmxvb3JkaXYgKz0gMS4wOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLyogZGl2IGlzIHplcm8gLSBnZXQgdGhlIHNhbWUgc2lnbiBhcyB0aGUgdHJ1ZSBxdW90aWVudCAqLworICAgICAgICBkaXYgKj0gZGl2OyAgICAgICAgICAgICAvKiBoaWRlICJkaXYgPSArMCIgZnJvbSBvcHRpbWl6ZXJzICovCisgICAgICAgIGZsb29yZGl2ID0gZGl2ICogdnggLyB3eDsgLyogemVybyB3LyBzaWduIG9mIHZ4L3d4ICovCisgICAgfQorICAgIFB5RlBFX0VORF9QUk9URUNUKGZsb29yZGl2KQorICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIoZGQpIiwgZmxvb3JkaXYsIG1vZCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmbG9hdF9mbG9vcl9kaXYoUHlPYmplY3QgKnYsIFB5T2JqZWN0ICp3KQogewotCVB5T2JqZWN0ICp0LCAqcjsKKyAgICBQeU9iamVjdCAqdCwgKnI7CiAKLQl0ID0gZmxvYXRfZGl2bW9kKHYsIHcpOwotCWlmICh0ID09IE5VTEwgfHwgdCA9PSBQeV9Ob3RJbXBsZW1lbnRlZCkKLQkJcmV0dXJuIHQ7Ci0JYXNzZXJ0KFB5VHVwbGVfQ2hlY2tFeGFjdCh0KSk7Ci0JciA9IFB5VHVwbGVfR0VUX0lURU0odCwgMCk7Ci0JUHlfSU5DUkVGKHIpOwotCVB5X0RFQ1JFRih0KTsKLQlyZXR1cm4gcjsKKyAgICB0ID0gZmxvYXRfZGl2bW9kKHYsIHcpOworICAgIGlmICh0ID09IE5VTEwgfHwgdCA9PSBQeV9Ob3RJbXBsZW1lbnRlZCkKKyAgICAgICAgcmV0dXJuIHQ7CisgICAgYXNzZXJ0KFB5VHVwbGVfQ2hlY2tFeGFjdCh0KSk7CisgICAgciA9IFB5VHVwbGVfR0VUX0lURU0odCwgMCk7CisgICAgUHlfSU5DUkVGKHIpOworICAgIFB5X0RFQ1JFRih0KTsKKyAgICByZXR1cm4gcjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZsb2F0X3BvdyhQeU9iamVjdCAqdiwgUHlPYmplY3QgKncsIFB5T2JqZWN0ICp6KQogewotCWRvdWJsZSBpdiwgaXcsIGl4OworICAgIGRvdWJsZSBpdiwgaXcsIGl4OwogCi0JaWYgKChQeU9iamVjdCAqKXogIT0gUHlfTm9uZSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAicG93KCkgM3JkIGFyZ3VtZW50IG5vdCAiCi0JCQkiYWxsb3dlZCB1bmxlc3MgYWxsIGFyZ3VtZW50cyBhcmUgaW50ZWdlcnMiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICgoUHlPYmplY3QgKil6ICE9IFB5X05vbmUpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgInBvdygpIDNyZCBhcmd1bWVudCBub3QgIgorICAgICAgICAgICAgImFsbG93ZWQgdW5sZXNzIGFsbCBhcmd1bWVudHMgYXJlIGludGVnZXJzIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCUNPTlZFUlRfVE9fRE9VQkxFKHYsIGl2KTsKLQlDT05WRVJUX1RPX0RPVUJMRSh3LCBpdyk7CisgICAgQ09OVkVSVF9UT19ET1VCTEUodiwgaXYpOworICAgIENPTlZFUlRfVE9fRE9VQkxFKHcsIGl3KTsKIAotCS8qIFNvcnQgb3V0IHNwZWNpYWwgY2FzZXMgaGVyZSBpbnN0ZWFkIG9mIHJlbHlpbmcgb24gcG93KCkgKi8KLQlpZiAoaXcgPT0gMCkgeyAJCS8qIHYqKjAgaXMgMSwgZXZlbiAwKiowICovCi0JCXJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoMS4wKTsKLQl9Ci0JaWYgKGl2ID09IDAuMCkgeyAgLyogMCoqdyBpcyBlcnJvciBpZiB3PDAsIGVsc2UgMSAqLwotCQlpZiAoaXcgPCAwLjApIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19aZXJvRGl2aXNpb25FcnJvciwKLQkJCQkJIjAuMCBjYW5ub3QgYmUgcmFpc2VkIHRvIGEgbmVnYXRpdmUgcG93ZXIiKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCXJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoMC4wKTsKLQl9Ci0JaWYgKGl2ID09IDEuMCkgeyAvKiAxKip3IGlzIDEsIGV2ZW4gMSoqaW5mIGFuZCAxKipuYW4gKi8KLQkJcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZSgxLjApOwotCX0KLQlpZiAoaXYgPCAwLjApIHsKLQkJLyogV2hldGhlciB0aGlzIGlzIGFuIGVycm9yIGlzIGEgbWVzcywgYW5kIGJ1bXBzIGludG8gbGlibQotCQkgKiBidWdzIHNvIHdlIGhhdmUgdG8gZmlndXJlIGl0IG91dCBvdXJzZWx2ZXMuCi0JCSAqLwotCQlpZiAoaXcgIT0gZmxvb3IoaXcpKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIm5lZ2F0aXZlIG51bWJlciAiCi0JCQkJImNhbm5vdCBiZSByYWlzZWQgdG8gYSBmcmFjdGlvbmFsIHBvd2VyIik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQkvKiBpdyBpcyBhbiBleGFjdCBpbnRlZ2VyLCBhbGJlaXQgcGVyaGFwcyBhIHZlcnkgbGFyZ2Ugb25lLgotCQkgKiAtMSByYWlzZWQgdG8gYW4gZXhhY3QgaW50ZWdlciBzaG91bGQgbmV2ZXIgYmUgZXhjZXB0aW9uYWwuCi0JCSAqIEFsYXMsIHNvbWUgbGlibXMgKGNoaWVmbHkgZ2xpYmMgYXMgb2YgZWFybHkgMjAwMykgcmV0dXJuCi0JCSAqIE5hTiBhbmQgc2V0IEVET00gb24gcG93KC0xLCBsYXJnZV9pbnQpIGlmIHRoZSBpbnQgZG9lc24ndAotCQkgKiBoYXBwZW4gdG8gYmUgcmVwcmVzZW50YWJsZSBpbiBhICpDKiBpbnRlZ2VyLiAgVGhhdCdzIGEKLQkJICogYnVnOyB3ZSBsZXQgdGhhdCBzbGlkZSBpbiBtYXRoLnBvdygpICh3aGljaCBjdXJyZW50bHkKLQkJICogcmVmbGVjdHMgYWxsIHBsYXRmb3JtIGFjY2lkZW50cyksIGJ1dCBub3QgZm9yIFB5dGhvbidzICoqLgotCQkgKi8KLQkJIGlmIChpdiA9PSAtMS4wICYmIFB5X0lTX0ZJTklURShpdykpIHsKLQkJIAkvKiBSZXR1cm4gMSBpZiBpdyBpcyBldmVuLCAtMSBpZiBpdyBpcyBvZGQ7IHRoZXJlJ3MKLQkJIAkgKiBubyBndWFyYW50ZWUgdGhhdCBhbnkgQyBpbnRlZ3JhbCB0eXBlIGlzIGJpZwotCQkgCSAqIGVub3VnaCB0byBob2xkIGl3LCBzbyB3ZSBoYXZlIHRvIGNoZWNrIHRoaXMKLQkJIAkgKiBpbmRpcmVjdGx5LgotCQkgCSAqLwotCQkgCWl4ID0gZmxvb3IoaXcgKiAwLjUpICogMi4wOwotCQkJcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShpeCA9PSBpdyA/IDEuMCA6IC0xLjApOwotCQl9Ci0JCS8qIEVsc2UgaXYgIT0gLTEuMCwgYW5kIG92ZXJmbG93IG9yIHVuZGVyZmxvdyBhcmUgcG9zc2libGUuCi0JCSAqIFVubGVzcyB3ZSdyZSB0byB3cml0ZSBwb3coKSBvdXJzZWx2ZXMsIHdlIGhhdmUgdG8gdHJ1c3QKLQkJICogdGhlIHBsYXRmb3JtIHRvIGRvIHRoaXMgY29ycmVjdGx5LgotCQkgKi8KLQl9Ci0JZXJybm8gPSAwOwotCVB5RlBFX1NUQVJUX1BST1RFQ1QoInBvdyIsIHJldHVybiBOVUxMKQotCWl4ID0gcG93KGl2LCBpdyk7Ci0JUHlGUEVfRU5EX1BST1RFQ1QoaXgpCi0JUHlfQURKVVNUX0VSQU5HRTEoaXgpOwotCWlmIChlcnJubyAhPSAwKSB7Ci0JCS8qIFdlIGRvbid0IGV4cGVjdCBhbnkgZXJybm8gdmFsdWUgb3RoZXIgdGhhbiBFUkFOR0UsIGJ1dAotCQkgKiB0aGUgcmFuZ2Ugb2YgbGlibSBidWdzIGFwcGVhcnMgdW5ib3VuZGVkLgotCQkgKi8KLQkJUHlFcnJfU2V0RnJvbUVycm5vKGVycm5vID09IEVSQU5HRSA/IFB5RXhjX092ZXJmbG93RXJyb3IgOgotCQkJCQkJICAgICBQeUV4Y19WYWx1ZUVycm9yKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoaXgpOworICAgIC8qIFNvcnQgb3V0IHNwZWNpYWwgY2FzZXMgaGVyZSBpbnN0ZWFkIG9mIHJlbHlpbmcgb24gcG93KCkgKi8KKyAgICBpZiAoaXcgPT0gMCkgeyAgICAgICAgICAgICAgLyogdioqMCBpcyAxLCBldmVuIDAqKjAgKi8KKyAgICAgICAgcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZSgxLjApOworICAgIH0KKyAgICBpZiAoaXYgPT0gMC4wKSB7ICAvKiAwKip3IGlzIGVycm9yIGlmIHc8MCwgZWxzZSAxICovCisgICAgICAgIGlmIChpdyA8IDAuMCkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1plcm9EaXZpc2lvbkVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIwLjAgY2Fubm90IGJlIHJhaXNlZCB0byBhIG5lZ2F0aXZlIHBvd2VyIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKDAuMCk7CisgICAgfQorICAgIGlmIChpdiA9PSAxLjApIHsgLyogMSoqdyBpcyAxLCBldmVuIDEqKmluZiBhbmQgMSoqbmFuICovCisgICAgICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoMS4wKTsKKyAgICB9CisgICAgaWYgKGl2IDwgMC4wKSB7CisgICAgICAgIC8qIFdoZXRoZXIgdGhpcyBpcyBhbiBlcnJvciBpcyBhIG1lc3MsIGFuZCBidW1wcyBpbnRvIGxpYm0KKyAgICAgICAgICogYnVncyBzbyB3ZSBoYXZlIHRvIGZpZ3VyZSBpdCBvdXQgb3Vyc2VsdmVzLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKGl3ICE9IGZsb29yKGl3KSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJuZWdhdGl2ZSBudW1iZXIgIgorICAgICAgICAgICAgICAgICJjYW5ub3QgYmUgcmFpc2VkIHRvIGEgZnJhY3Rpb25hbCBwb3dlciIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgLyogaXcgaXMgYW4gZXhhY3QgaW50ZWdlciwgYWxiZWl0IHBlcmhhcHMgYSB2ZXJ5IGxhcmdlIG9uZS4KKyAgICAgICAgICogLTEgcmFpc2VkIHRvIGFuIGV4YWN0IGludGVnZXIgc2hvdWxkIG5ldmVyIGJlIGV4Y2VwdGlvbmFsLgorICAgICAgICAgKiBBbGFzLCBzb21lIGxpYm1zIChjaGllZmx5IGdsaWJjIGFzIG9mIGVhcmx5IDIwMDMpIHJldHVybgorICAgICAgICAgKiBOYU4gYW5kIHNldCBFRE9NIG9uIHBvdygtMSwgbGFyZ2VfaW50KSBpZiB0aGUgaW50IGRvZXNuJ3QKKyAgICAgICAgICogaGFwcGVuIHRvIGJlIHJlcHJlc2VudGFibGUgaW4gYSAqQyogaW50ZWdlci4gIFRoYXQncyBhCisgICAgICAgICAqIGJ1Zzsgd2UgbGV0IHRoYXQgc2xpZGUgaW4gbWF0aC5wb3coKSAod2hpY2ggY3VycmVudGx5CisgICAgICAgICAqIHJlZmxlY3RzIGFsbCBwbGF0Zm9ybSBhY2NpZGVudHMpLCBidXQgbm90IGZvciBQeXRob24ncyAqKi4KKyAgICAgICAgICovCisgICAgICAgICBpZiAoaXYgPT0gLTEuMCAmJiBQeV9JU19GSU5JVEUoaXcpKSB7CisgICAgICAgICAgICAvKiBSZXR1cm4gMSBpZiBpdyBpcyBldmVuLCAtMSBpZiBpdyBpcyBvZGQ7IHRoZXJlJ3MKKyAgICAgICAgICAgICAqIG5vIGd1YXJhbnRlZSB0aGF0IGFueSBDIGludGVncmFsIHR5cGUgaXMgYmlnCisgICAgICAgICAgICAgKiBlbm91Z2ggdG8gaG9sZCBpdywgc28gd2UgaGF2ZSB0byBjaGVjayB0aGlzCisgICAgICAgICAgICAgKiBpbmRpcmVjdGx5LgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpeCA9IGZsb29yKGl3ICogMC41KSAqIDIuMDsKKyAgICAgICAgICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoaXggPT0gaXcgPyAxLjAgOiAtMS4wKTsKKyAgICAgICAgfQorICAgICAgICAvKiBFbHNlIGl2ICE9IC0xLjAsIGFuZCBvdmVyZmxvdyBvciB1bmRlcmZsb3cgYXJlIHBvc3NpYmxlLgorICAgICAgICAgKiBVbmxlc3Mgd2UncmUgdG8gd3JpdGUgcG93KCkgb3Vyc2VsdmVzLCB3ZSBoYXZlIHRvIHRydXN0CisgICAgICAgICAqIHRoZSBwbGF0Zm9ybSB0byBkbyB0aGlzIGNvcnJlY3RseS4KKyAgICAgICAgICovCisgICAgfQorICAgIGVycm5vID0gMDsKKyAgICBQeUZQRV9TVEFSVF9QUk9URUNUKCJwb3ciLCByZXR1cm4gTlVMTCkKKyAgICBpeCA9IHBvdyhpdiwgaXcpOworICAgIFB5RlBFX0VORF9QUk9URUNUKGl4KQorICAgIFB5X0FESlVTVF9FUkFOR0UxKGl4KTsKKyAgICBpZiAoZXJybm8gIT0gMCkgeworICAgICAgICAvKiBXZSBkb24ndCBleHBlY3QgYW55IGVycm5vIHZhbHVlIG90aGVyIHRoYW4gRVJBTkdFLCBidXQKKyAgICAgICAgICogdGhlIHJhbmdlIG9mIGxpYm0gYnVncyBhcHBlYXJzIHVuYm91bmRlZC4KKyAgICAgICAgICovCisgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhlcnJubyA9PSBFUkFOR0UgPyBQeUV4Y19PdmVyZmxvd0Vycm9yIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlFeGNfVmFsdWVFcnJvcik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKGl4KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZsb2F0X25lZyhQeUZsb2F0T2JqZWN0ICp2KQogewotCXJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoLXYtPm9iX2Z2YWwpOworICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoLXYtPm9iX2Z2YWwpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZmxvYXRfYWJzKFB5RmxvYXRPYmplY3QgKnYpCiB7Ci0JcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShmYWJzKHYtPm9iX2Z2YWwpKTsKKyAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKGZhYnModi0+b2JfZnZhbCkpOwogfQogCiBzdGF0aWMgaW50CiBmbG9hdF9ub256ZXJvKFB5RmxvYXRPYmplY3QgKnYpCiB7Ci0JcmV0dXJuIHYtPm9iX2Z2YWwgIT0gMC4wOworICAgIHJldHVybiB2LT5vYl9mdmFsICE9IDAuMDsKIH0KIAogc3RhdGljIGludAogZmxvYXRfY29lcmNlKFB5T2JqZWN0ICoqcHYsIFB5T2JqZWN0ICoqcHcpCiB7Ci0JaWYgKFB5SW50X0NoZWNrKCpwdykpIHsKLQkJbG9uZyB4ID0gUHlJbnRfQXNMb25nKCpwdyk7Ci0JCSpwdyA9IFB5RmxvYXRfRnJvbURvdWJsZSgoZG91YmxlKXgpOwotCQlQeV9JTkNSRUYoKnB2KTsKLQkJcmV0dXJuIDA7Ci0JfQotCWVsc2UgaWYgKFB5TG9uZ19DaGVjaygqcHcpKSB7Ci0JCWRvdWJsZSB4ID0gUHlMb25nX0FzRG91YmxlKCpwdyk7Ci0JCWlmICh4ID09IC0xLjAgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJCXJldHVybiAtMTsKLQkJKnB3ID0gUHlGbG9hdF9Gcm9tRG91YmxlKHgpOwotCQlQeV9JTkNSRUYoKnB2KTsKLQkJcmV0dXJuIDA7Ci0JfQotCWVsc2UgaWYgKFB5RmxvYXRfQ2hlY2soKnB3KSkgewotCQlQeV9JTkNSRUYoKnB2KTsKLQkJUHlfSU5DUkVGKCpwdyk7Ci0JCXJldHVybiAwOwotCX0KLQlyZXR1cm4gMTsgLyogQ2FuJ3QgZG8gaXQgKi8KKyAgICBpZiAoUHlJbnRfQ2hlY2soKnB3KSkgeworICAgICAgICBsb25nIHggPSBQeUludF9Bc0xvbmcoKnB3KTsKKyAgICAgICAgKnB3ID0gUHlGbG9hdF9Gcm9tRG91YmxlKChkb3VibGUpeCk7CisgICAgICAgIFB5X0lOQ1JFRigqcHYpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZWxzZSBpZiAoUHlMb25nX0NoZWNrKCpwdykpIHsKKyAgICAgICAgZG91YmxlIHggPSBQeUxvbmdfQXNEb3VibGUoKnB3KTsKKyAgICAgICAgaWYgKHggPT0gLTEuMCAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAqcHcgPSBQeUZsb2F0X0Zyb21Eb3VibGUoeCk7CisgICAgICAgIFB5X0lOQ1JFRigqcHYpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZWxzZSBpZiAoUHlGbG9hdF9DaGVjaygqcHcpKSB7CisgICAgICAgIFB5X0lOQ1JFRigqcHYpOworICAgICAgICBQeV9JTkNSRUYoKnB3KTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAxOyAvKiBDYW4ndCBkbyBpdCAqLwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZmxvYXRfaXNfaW50ZWdlcihQeU9iamVjdCAqdikKIHsKLQlkb3VibGUgeCA9IFB5RmxvYXRfQXNEb3VibGUodik7Ci0JUHlPYmplY3QgKm87Ci0JCi0JaWYgKHggPT0gLTEuMCAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIVB5X0lTX0ZJTklURSh4KSkKLQkJUHlfUkVUVVJOX0ZBTFNFOwotCWVycm5vID0gMDsKLQlQeUZQRV9TVEFSVF9QUk9URUNUKCJpc19pbnRlZ2VyIiwgcmV0dXJuIE5VTEwpCi0JbyA9IChmbG9vcih4KSA9PSB4KSA/IFB5X1RydWUgOiBQeV9GYWxzZTsKLQlQeUZQRV9FTkRfUFJPVEVDVCh4KQotCWlmIChlcnJubyAhPSAwKSB7Ci0JCVB5RXJyX1NldEZyb21FcnJubyhlcnJubyA9PSBFUkFOR0UgPyBQeUV4Y19PdmVyZmxvd0Vycm9yIDoKLQkJCQkJCSAgICAgUHlFeGNfVmFsdWVFcnJvcik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlQeV9JTkNSRUYobyk7Ci0JcmV0dXJuIG87CisgICAgZG91YmxlIHggPSBQeUZsb2F0X0FzRG91YmxlKHYpOworICAgIFB5T2JqZWN0ICpvOworCisgICAgaWYgKHggPT0gLTEuMCAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5X0lTX0ZJTklURSh4KSkKKyAgICAgICAgUHlfUkVUVVJOX0ZBTFNFOworICAgIGVycm5vID0gMDsKKyAgICBQeUZQRV9TVEFSVF9QUk9URUNUKCJpc19pbnRlZ2VyIiwgcmV0dXJuIE5VTEwpCisgICAgbyA9IChmbG9vcih4KSA9PSB4KSA/IFB5X1RydWUgOiBQeV9GYWxzZTsKKyAgICBQeUZQRV9FTkRfUFJPVEVDVCh4KQorICAgIGlmIChlcnJubyAhPSAwKSB7CisgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhlcnJubyA9PSBFUkFOR0UgPyBQeUV4Y19PdmVyZmxvd0Vycm9yIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlFeGNfVmFsdWVFcnJvcik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeV9JTkNSRUYobyk7CisgICAgcmV0dXJuIG87CiB9CiAKICNpZiAwCiBzdGF0aWMgUHlPYmplY3QgKgogZmxvYXRfaXNfaW5mKFB5T2JqZWN0ICp2KQogewotCWRvdWJsZSB4ID0gUHlGbG9hdF9Bc0RvdWJsZSh2KTsKLQlpZiAoeCA9PSAtMS4wICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBQeUJvb2xfRnJvbUxvbmcoKGxvbmcpUHlfSVNfSU5GSU5JVFkoeCkpOworICAgIGRvdWJsZSB4ID0gUHlGbG9hdF9Bc0RvdWJsZSh2KTsKKyAgICBpZiAoeCA9PSAtMS4wICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoKGxvbmcpUHlfSVNfSU5GSU5JVFkoeCkpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZmxvYXRfaXNfbmFuKFB5T2JqZWN0ICp2KQogewotCWRvdWJsZSB4ID0gUHlGbG9hdF9Bc0RvdWJsZSh2KTsKLQlpZiAoeCA9PSAtMS4wICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBQeUJvb2xfRnJvbUxvbmcoKGxvbmcpUHlfSVNfTkFOKHgpKTsKKyAgICBkb3VibGUgeCA9IFB5RmxvYXRfQXNEb3VibGUodik7CisgICAgaWYgKHggPT0gLTEuMCAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKChsb25nKVB5X0lTX05BTih4KSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmbG9hdF9pc19maW5pdGUoUHlPYmplY3QgKnYpCiB7Ci0JZG91YmxlIHggPSBQeUZsb2F0X0FzRG91YmxlKHYpOwotCWlmICh4ID09IC0xLjAgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygobG9uZylQeV9JU19GSU5JVEUoeCkpOworICAgIGRvdWJsZSB4ID0gUHlGbG9hdF9Bc0RvdWJsZSh2KTsKKyAgICBpZiAoeCA9PSAtMS4wICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoKGxvbmcpUHlfSVNfRklOSVRFKHgpKTsKIH0KICNlbmRpZgogCiBzdGF0aWMgUHlPYmplY3QgKgogZmxvYXRfdHJ1bmMoUHlPYmplY3QgKnYpCiB7Ci0JZG91YmxlIHggPSBQeUZsb2F0X0FzRG91YmxlKHYpOwotCWRvdWJsZSB3aG9sZXBhcnQ7CS8qIGludGVncmFsIHBvcnRpb24gb2YgeCwgcm91bmRlZCB0b3dhcmQgMCAqLworICAgIGRvdWJsZSB4ID0gUHlGbG9hdF9Bc0RvdWJsZSh2KTsKKyAgICBkb3VibGUgd2hvbGVwYXJ0OyAgICAgICAgICAgLyogaW50ZWdyYWwgcG9ydGlvbiBvZiB4LCByb3VuZGVkIHRvd2FyZCAwICovCiAKLQkodm9pZCltb2RmKHgsICZ3aG9sZXBhcnQpOwotCS8qIFRyeSB0byBnZXQgb3V0IGNoZWFwIGlmIHRoaXMgZml0cyBpbiBhIFB5dGhvbiBpbnQuICBUaGUgYXR0ZW1wdAotCSAqIHRvIGNhc3QgdG8gbG9uZyBtdXN0IGJlIHByb3RlY3RlZCwgYXMgQyBkb2Vzbid0IGRlZmluZSB3aGF0Ci0JICogaGFwcGVucyBpZiB0aGUgZG91YmxlIGlzIHRvbyBiaWcgdG8gZml0IGluIGEgbG9uZy4gIFNvbWUgcmFyZQotCSAqIHN5c3RlbXMgcmFpc2UgYW4gZXhjZXB0aW9uIHRoZW4gKFJJU0NPUyB3YXMgbWVudGlvbmVkIGFzIG9uZSwKLQkgKiBhbmQgc29tZW9uZSB1c2luZyBhIG5vbi1kZWZhdWx0IG9wdGlvbiBvbiBTdW4gYWxzbyBidW1wZWQgaW50bwotCSAqIHRoYXQpLiAgTm90ZSB0aGF0IGNoZWNraW5nIGZvciA+PSBhbmQgPD0gTE9OR197TUlOLE1BWH0gd291bGQKLQkgKiBzdGlsbCBiZSB2dWxuZXJhYmxlOiAgaWYgYSBsb25nIGhhcyBtb3JlIGJpdHMgb2YgcHJlY2lzaW9uIHRoYW4KLQkgKiBhIGRvdWJsZSwgY2FzdGluZyBNSU4vTUFYIHRvIGRvdWJsZSBtYXkgeWllbGQgYW4gYXBwcm94aW1hdGlvbiwKLQkgKiBhbmQgaWYgdGhhdCdzIHJvdW5kZWQgdXAsIHRoZW4sIGUuZy4sIHdob2xlcGFydD1MT05HX01BWCsxIHdvdWxkCi0JICogeWllbGQgdHJ1ZSBmcm9tIHRoZSBDIGV4cHJlc3Npb24gd2hvbGVwYXJ0PD1MT05HX01BWCwgZGVzcGl0ZQotCSAqIHRoYXQgd2hvbGVwYXJ0IGlzIGFjdHVhbGx5IGdyZWF0ZXIgdGhhbiBMT05HX01BWC4KLQkgKi8KLQlpZiAoTE9OR19NSU4gPCB3aG9sZXBhcnQgJiYgd2hvbGVwYXJ0IDwgTE9OR19NQVgpIHsKLQkJY29uc3QgbG9uZyBhc2xvbmcgPSAobG9uZyl3aG9sZXBhcnQ7Ci0JCXJldHVybiBQeUludF9Gcm9tTG9uZyhhc2xvbmcpOwotCX0KLQlyZXR1cm4gUHlMb25nX0Zyb21Eb3VibGUod2hvbGVwYXJ0KTsKKyAgICAodm9pZCltb2RmKHgsICZ3aG9sZXBhcnQpOworICAgIC8qIFRyeSB0byBnZXQgb3V0IGNoZWFwIGlmIHRoaXMgZml0cyBpbiBhIFB5dGhvbiBpbnQuICBUaGUgYXR0ZW1wdAorICAgICAqIHRvIGNhc3QgdG8gbG9uZyBtdXN0IGJlIHByb3RlY3RlZCwgYXMgQyBkb2Vzbid0IGRlZmluZSB3aGF0CisgICAgICogaGFwcGVucyBpZiB0aGUgZG91YmxlIGlzIHRvbyBiaWcgdG8gZml0IGluIGEgbG9uZy4gIFNvbWUgcmFyZQorICAgICAqIHN5c3RlbXMgcmFpc2UgYW4gZXhjZXB0aW9uIHRoZW4gKFJJU0NPUyB3YXMgbWVudGlvbmVkIGFzIG9uZSwKKyAgICAgKiBhbmQgc29tZW9uZSB1c2luZyBhIG5vbi1kZWZhdWx0IG9wdGlvbiBvbiBTdW4gYWxzbyBidW1wZWQgaW50bworICAgICAqIHRoYXQpLiAgTm90ZSB0aGF0IGNoZWNraW5nIGZvciA+PSBhbmQgPD0gTE9OR197TUlOLE1BWH0gd291bGQKKyAgICAgKiBzdGlsbCBiZSB2dWxuZXJhYmxlOiAgaWYgYSBsb25nIGhhcyBtb3JlIGJpdHMgb2YgcHJlY2lzaW9uIHRoYW4KKyAgICAgKiBhIGRvdWJsZSwgY2FzdGluZyBNSU4vTUFYIHRvIGRvdWJsZSBtYXkgeWllbGQgYW4gYXBwcm94aW1hdGlvbiwKKyAgICAgKiBhbmQgaWYgdGhhdCdzIHJvdW5kZWQgdXAsIHRoZW4sIGUuZy4sIHdob2xlcGFydD1MT05HX01BWCsxIHdvdWxkCisgICAgICogeWllbGQgdHJ1ZSBmcm9tIHRoZSBDIGV4cHJlc3Npb24gd2hvbGVwYXJ0PD1MT05HX01BWCwgZGVzcGl0ZQorICAgICAqIHRoYXQgd2hvbGVwYXJ0IGlzIGFjdHVhbGx5IGdyZWF0ZXIgdGhhbiBMT05HX01BWC4KKyAgICAgKi8KKyAgICBpZiAoTE9OR19NSU4gPCB3aG9sZXBhcnQgJiYgd2hvbGVwYXJ0IDwgTE9OR19NQVgpIHsKKyAgICAgICAgY29uc3QgbG9uZyBhc2xvbmcgPSAobG9uZyl3aG9sZXBhcnQ7CisgICAgICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhhc2xvbmcpOworICAgIH0KKyAgICByZXR1cm4gUHlMb25nX0Zyb21Eb3VibGUod2hvbGVwYXJ0KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZsb2F0X2xvbmcoUHlPYmplY3QgKnYpCiB7Ci0JZG91YmxlIHggPSBQeUZsb2F0X0FzRG91YmxlKHYpOwotCXJldHVybiBQeUxvbmdfRnJvbURvdWJsZSh4KTsKKyAgICBkb3VibGUgeCA9IFB5RmxvYXRfQXNEb3VibGUodik7CisgICAgcmV0dXJuIFB5TG9uZ19Gcm9tRG91YmxlKHgpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZmxvYXRfZmxvYXQoUHlPYmplY3QgKnYpCiB7Ci0JaWYgKFB5RmxvYXRfQ2hlY2tFeGFjdCh2KSkKLQkJUHlfSU5DUkVGKHYpOwotCWVsc2UKLQkJdiA9IFB5RmxvYXRfRnJvbURvdWJsZSgoKFB5RmxvYXRPYmplY3QgKil2KS0+b2JfZnZhbCk7Ci0JcmV0dXJuIHY7CisgICAgaWYgKFB5RmxvYXRfQ2hlY2tFeGFjdCh2KSkKKyAgICAgICAgUHlfSU5DUkVGKHYpOworICAgIGVsc2UKKyAgICAgICAgdiA9IFB5RmxvYXRfRnJvbURvdWJsZSgoKFB5RmxvYXRPYmplY3QgKil2KS0+b2JfZnZhbCk7CisgICAgcmV0dXJuIHY7CiB9CiAKIC8qIHR1cm4gQVNDSUkgaGV4IGNoYXJhY3RlcnMgaW50byBpbnRlZ2VyIHZhbHVlcyBhbmQgdmljZSB2ZXJzYSAqLwpAQCAtMTEyNiw3MyArMTEyNiw3MyBAQAogc3RhdGljIGNoYXIKIGNoYXJfZnJvbV9oZXgoaW50IHgpCiB7Ci0JYXNzZXJ0KDAgPD0geCAmJiB4IDwgMTYpOwotCXJldHVybiAiMDEyMzQ1Njc4OWFiY2RlZiJbeF07CisgICAgYXNzZXJ0KDAgPD0geCAmJiB4IDwgMTYpOworICAgIHJldHVybiAiMDEyMzQ1Njc4OWFiY2RlZiJbeF07CiB9CiAKIHN0YXRpYyBpbnQKIGhleF9mcm9tX2NoYXIoY2hhciBjKSB7Ci0JaW50IHg7Ci0Jc3dpdGNoKGMpIHsKLQljYXNlICcwJzoKLQkJeCA9IDA7Ci0JCWJyZWFrOwotCWNhc2UgJzEnOgotCQl4ID0gMTsKLQkJYnJlYWs7Ci0JY2FzZSAnMic6Ci0JCXggPSAyOwotCQlicmVhazsKLQljYXNlICczJzoKLQkJeCA9IDM7Ci0JCWJyZWFrOwotCWNhc2UgJzQnOgotCQl4ID0gNDsKLQkJYnJlYWs7Ci0JY2FzZSAnNSc6Ci0JCXggPSA1OwotCQlicmVhazsKLQljYXNlICc2JzoKLQkJeCA9IDY7Ci0JCWJyZWFrOwotCWNhc2UgJzcnOgotCQl4ID0gNzsKLQkJYnJlYWs7Ci0JY2FzZSAnOCc6Ci0JCXggPSA4OwotCQlicmVhazsKLQljYXNlICc5JzoKLQkJeCA9IDk7Ci0JCWJyZWFrOwotCWNhc2UgJ2EnOgotCWNhc2UgJ0EnOgotCQl4ID0gMTA7Ci0JCWJyZWFrOwotCWNhc2UgJ2InOgotCWNhc2UgJ0InOgotCQl4ID0gMTE7Ci0JCWJyZWFrOwotCWNhc2UgJ2MnOgotCWNhc2UgJ0MnOgotCQl4ID0gMTI7Ci0JCWJyZWFrOwotCWNhc2UgJ2QnOgotCWNhc2UgJ0QnOgotCQl4ID0gMTM7Ci0JCWJyZWFrOwotCWNhc2UgJ2UnOgotCWNhc2UgJ0UnOgotCQl4ID0gMTQ7Ci0JCWJyZWFrOwotCWNhc2UgJ2YnOgotCWNhc2UgJ0YnOgotCQl4ID0gMTU7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXggPSAtMTsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiB4OworICAgIGludCB4OworICAgIHN3aXRjaChjKSB7CisgICAgY2FzZSAnMCc6CisgICAgICAgIHggPSAwOworICAgICAgICBicmVhazsKKyAgICBjYXNlICcxJzoKKyAgICAgICAgeCA9IDE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJzInOgorICAgICAgICB4ID0gMjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnMyc6CisgICAgICAgIHggPSAzOworICAgICAgICBicmVhazsKKyAgICBjYXNlICc0JzoKKyAgICAgICAgeCA9IDQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJzUnOgorICAgICAgICB4ID0gNTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnNic6CisgICAgICAgIHggPSA2OworICAgICAgICBicmVhazsKKyAgICBjYXNlICc3JzoKKyAgICAgICAgeCA9IDc7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJzgnOgorICAgICAgICB4ID0gODsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnOSc6CisgICAgICAgIHggPSA5OworICAgICAgICBicmVhazsKKyAgICBjYXNlICdhJzoKKyAgICBjYXNlICdBJzoKKyAgICAgICAgeCA9IDEwOworICAgICAgICBicmVhazsKKyAgICBjYXNlICdiJzoKKyAgICBjYXNlICdCJzoKKyAgICAgICAgeCA9IDExOworICAgICAgICBicmVhazsKKyAgICBjYXNlICdjJzoKKyAgICBjYXNlICdDJzoKKyAgICAgICAgeCA9IDEyOworICAgICAgICBicmVhazsKKyAgICBjYXNlICdkJzoKKyAgICBjYXNlICdEJzoKKyAgICAgICAgeCA9IDEzOworICAgICAgICBicmVhazsKKyAgICBjYXNlICdlJzoKKyAgICBjYXNlICdFJzoKKyAgICAgICAgeCA9IDE0OworICAgICAgICBicmVhazsKKyAgICBjYXNlICdmJzoKKyAgICBjYXNlICdGJzoKKyAgICAgICAgeCA9IDE1OworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICB4ID0gLTE7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4geDsKIH0KIAogLyogY29udmVydCBhIGZsb2F0IHRvIGEgaGV4YWRlY2ltYWwgc3RyaW5nICovCkBAIC0xMjA0LDU0ICsxMjA0LDU0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZmxvYXRfaGV4KFB5T2JqZWN0ICp2KQogewotCWRvdWJsZSB4LCBtOwotCWludCBlLCBzaGlmdCwgaSwgc2ksIGVzaWduOwotCS8qIFNwYWNlIGZvciAxKyhUT0hFWF9OQklUUy0xKS80IGRpZ2l0cywgYSBkZWNpbWFsIHBvaW50LCBhbmQgdGhlCi0JICAgdHJhaWxpbmcgTlVMIGJ5dGUuICovCi0JY2hhciBzWyhUT0hFWF9OQklUUy0xKS80KzNdOworICAgIGRvdWJsZSB4LCBtOworICAgIGludCBlLCBzaGlmdCwgaSwgc2ksIGVzaWduOworICAgIC8qIFNwYWNlIGZvciAxKyhUT0hFWF9OQklUUy0xKS80IGRpZ2l0cywgYSBkZWNpbWFsIHBvaW50LCBhbmQgdGhlCisgICAgICAgdHJhaWxpbmcgTlVMIGJ5dGUuICovCisgICAgY2hhciBzWyhUT0hFWF9OQklUUy0xKS80KzNdOwogCi0JQ09OVkVSVF9UT19ET1VCTEUodiwgeCk7CisgICAgQ09OVkVSVF9UT19ET1VCTEUodiwgeCk7CiAKLQlpZiAoUHlfSVNfTkFOKHgpIHx8IFB5X0lTX0lORklOSVRZKHgpKQotCQlyZXR1cm4gZmxvYXRfc3RyKChQeUZsb2F0T2JqZWN0ICopdik7CisgICAgaWYgKFB5X0lTX05BTih4KSB8fCBQeV9JU19JTkZJTklUWSh4KSkKKyAgICAgICAgcmV0dXJuIGZsb2F0X3N0cigoUHlGbG9hdE9iamVjdCAqKXYpOwogCi0JaWYgKHggPT0gMC4wKSB7Ci0JCWlmKGNvcHlzaWduKDEuMCwgeCkgPT0gLTEuMCkKLQkJCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKCItMHgwLjBwKzAiKTsKLQkJZWxzZQotCQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoIjB4MC4wcCswIik7Ci0JfQorICAgIGlmICh4ID09IDAuMCkgeworICAgICAgICBpZihjb3B5c2lnbigxLjAsIHgpID09IC0xLjApCisgICAgICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZygiLTB4MC4wcCswIik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKCIweDAuMHArMCIpOworICAgIH0KIAotCW0gPSBmcmV4cChmYWJzKHgpLCAmZSk7Ci0Jc2hpZnQgPSAxIC0gTUFYKERCTF9NSU5fRVhQIC0gZSwgMCk7Ci0JbSA9IGxkZXhwKG0sIHNoaWZ0KTsKLQllIC09IHNoaWZ0OworICAgIG0gPSBmcmV4cChmYWJzKHgpLCAmZSk7CisgICAgc2hpZnQgPSAxIC0gTUFYKERCTF9NSU5fRVhQIC0gZSwgMCk7CisgICAgbSA9IGxkZXhwKG0sIHNoaWZ0KTsKKyAgICBlIC09IHNoaWZ0OwogCi0Jc2kgPSAwOwotCXNbc2ldID0gY2hhcl9mcm9tX2hleCgoaW50KW0pOwotCXNpKys7Ci0JbSAtPSAoaW50KW07Ci0Jc1tzaV0gPSAnLic7Ci0Jc2krKzsKLQlmb3IgKGk9MDsgaSA8IChUT0hFWF9OQklUUy0xKS80OyBpKyspIHsKLQkJbSAqPSAxNi4wOwotCQlzW3NpXSA9IGNoYXJfZnJvbV9oZXgoKGludCltKTsKLQkJc2krKzsKLQkJbSAtPSAoaW50KW07Ci0JfQotCXNbc2ldID0gJ1wwJzsKKyAgICBzaSA9IDA7CisgICAgc1tzaV0gPSBjaGFyX2Zyb21faGV4KChpbnQpbSk7CisgICAgc2krKzsKKyAgICBtIC09IChpbnQpbTsKKyAgICBzW3NpXSA9ICcuJzsKKyAgICBzaSsrOworICAgIGZvciAoaT0wOyBpIDwgKFRPSEVYX05CSVRTLTEpLzQ7IGkrKykgeworICAgICAgICBtICo9IDE2LjA7CisgICAgICAgIHNbc2ldID0gY2hhcl9mcm9tX2hleCgoaW50KW0pOworICAgICAgICBzaSsrOworICAgICAgICBtIC09IChpbnQpbTsKKyAgICB9CisgICAgc1tzaV0gPSAnXDAnOwogCi0JaWYgKGUgPCAwKSB7Ci0JCWVzaWduID0gKGludCknLSc7Ci0JCWUgPSAtZTsKLQl9Ci0JZWxzZQotCQllc2lnbiA9IChpbnQpJysnOworICAgIGlmIChlIDwgMCkgeworICAgICAgICBlc2lnbiA9IChpbnQpJy0nOworICAgICAgICBlID0gLWU7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgZXNpZ24gPSAoaW50KScrJzsKIAotCWlmICh4IDwgMC4wKQotCQlyZXR1cm4gUHlTdHJpbmdfRnJvbUZvcm1hdCgiLTB4JXNwJWMlZCIsIHMsIGVzaWduLCBlKTsKLQllbHNlCi0JCXJldHVybiBQeVN0cmluZ19Gcm9tRm9ybWF0KCIweCVzcCVjJWQiLCBzLCBlc2lnbiwgZSk7CisgICAgaWYgKHggPCAwLjApCisgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tRm9ybWF0KCItMHglc3AlYyVkIiwgcywgZXNpZ24sIGUpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21Gb3JtYXQoIjB4JXNwJWMlZCIsIHMsIGVzaWduLCBlKTsKIH0KIAogUHlEb2NfU1RSVkFSKGZsb2F0X2hleF9kb2MsCkBAIC0xMjcwLDExICsxMjcwLDExIEBACiBzdGF0aWMgaW50CiBjYXNlX2luc2Vuc2l0aXZlX21hdGNoKGNvbnN0IGNoYXIgKnMsIGNvbnN0IGNoYXIgKnQpCiB7Ci0Jd2hpbGUoKnQgJiYgdG9sb3dlcigqcykgPT0gKnQpIHsKLQkJcysrOwotCQl0Kys7Ci0JfQotCXJldHVybiAqdCA/IDAgOiAxOworICAgIHdoaWxlKCp0ICYmIHRvbG93ZXIoKnMpID09ICp0KSB7CisgICAgICAgIHMrKzsKKyAgICAgICAgdCsrOworICAgIH0KKyAgICByZXR1cm4gKnQgPyAwIDogMTsKIH0KIAogLyogQ29udmVydCBhIGhleGFkZWNpbWFsIHN0cmluZyB0byBhIGZsb2F0LiAqLwpAQCAtMTI4MiwyNTAgKzEyODIsMjUwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZmxvYXRfZnJvbWhleChQeU9iamVjdCAqY2xzLCBQeU9iamVjdCAqYXJnKQogewotCVB5T2JqZWN0ICpyZXN1bHRfYXNfZmxvYXQsICpyZXN1bHQ7Ci0JZG91YmxlIHg7Ci0JbG9uZyBleHAsIHRvcF9leHAsIGxzYiwga2V5X2RpZ2l0OwotCWNoYXIgKnMsICpjb2VmZl9zdGFydCwgKnNfc3RvcmUsICpjb2VmZl9lbmQsICpleHBfc3RhcnQsICpzX2VuZDsKLQlpbnQgaGFsZl9lcHMsIGRpZ2l0LCByb3VuZF91cCwgc2lnbj0xOwotCVB5X3NzaXplX3QgbGVuZ3RoLCBuZGlnaXRzLCBmZGlnaXRzLCBpOworICAgIFB5T2JqZWN0ICpyZXN1bHRfYXNfZmxvYXQsICpyZXN1bHQ7CisgICAgZG91YmxlIHg7CisgICAgbG9uZyBleHAsIHRvcF9leHAsIGxzYiwga2V5X2RpZ2l0OworICAgIGNoYXIgKnMsICpjb2VmZl9zdGFydCwgKnNfc3RvcmUsICpjb2VmZl9lbmQsICpleHBfc3RhcnQsICpzX2VuZDsKKyAgICBpbnQgaGFsZl9lcHMsIGRpZ2l0LCByb3VuZF91cCwgc2lnbj0xOworICAgIFB5X3NzaXplX3QgbGVuZ3RoLCBuZGlnaXRzLCBmZGlnaXRzLCBpOwogCi0JLyoKLQkgKiBGb3IgdGhlIHNha2Ugb2Ygc2ltcGxpY2l0eSBhbmQgY29ycmVjdG5lc3MsIHdlIGltcG9zZSBhbiBhcnRpZmljaWFsCi0JICogbGltaXQgb24gbmRpZ2l0cywgdGhlIHRvdGFsIG51bWJlciBvZiBoZXggZGlnaXRzIGluIHRoZSBjb2VmZmljaWVudAotCSAqIFRoZSBsaW1pdCBpcyBjaG9zZW4gdG8gZW5zdXJlIHRoYXQsIHdyaXRpbmcgZXhwIGZvciB0aGUgZXhwb25lbnQsCi0JICoKLQkgKiAgICgxKSBpZiBleHAgPiBMT05HX01BWC8yIHRoZW4gdGhlIHZhbHVlIG9mIHRoZSBoZXggc3RyaW5nIGlzCi0JICogICBndWFyYW50ZWVkIHRvIG92ZXJmbG93IChwcm92aWRlZCBpdCdzIG5vbnplcm8pCi0JICoKLQkgKiAgICgyKSBpZiBleHAgPCBMT05HX01JTi8yIHRoZW4gdGhlIHZhbHVlIG9mIHRoZSBoZXggc3RyaW5nIGlzCi0JICogICBndWFyYW50ZWVkIHRvIHVuZGVyZmxvdyB0byAwLgotCSAqCi0JICogICAoMykgaWYgTE9OR19NSU4vMiA8PSBleHAgPD0gTE9OR19NQVgvMiB0aGVuIHRoZXJlJ3Mgbm8gZGFuZ2VyIG9mCi0JICogICBvdmVyZmxvdyBpbiB0aGUgY2FsY3VsYXRpb24gb2YgZXhwIGFuZCB0b3BfZXhwIGJlbG93LgotCSAqCi0JICogTW9yZSBzcGVjaWZpY2FsbHksIG5kaWdpdHMgaXMgYXNzdW1lZCB0byBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcKLQkgKiBpbmVxdWFsaXRpZXM6Ci0JICoKLQkgKiAgIDQqbmRpZ2l0cyA8PSBEQkxfTUlOX0VYUCAtIERCTF9NQU5UX0RJRyAtIExPTkdfTUlOLzIKLQkgKiAgIDQqbmRpZ2l0cyA8PSBMT05HX01BWC8yICsgMSAtIERCTF9NQVhfRVhQCi0JICoKLQkgKiBJZiBlaXRoZXIgb2YgdGhlc2UgaW5lcXVhbGl0aWVzIGlzIG5vdCBzYXRpc2ZpZWQsIGEgVmFsdWVFcnJvciBpcwotCSAqIHJhaXNlZC4gIE90aGVyd2lzZSwgd3JpdGUgeCBmb3IgdGhlIHZhbHVlIG9mIHRoZSBoZXggc3RyaW5nLCBhbmQKLQkgKiBhc3N1bWUgeCBpcyBub256ZXJvLiAgVGhlbgotCSAqCi0JICogICAyKiooZXhwLTQqbmRpZ2l0cykgPD0gfHh8IDwgMioqKGV4cCs0Km5kaWdpdHMpLgotCSAqCi0JICogTm93IGlmIGV4cCA+IExPTkdfTUFYLzIgdGhlbjoKLQkgKgotCSAqICAgZXhwIC0gNCpuZGlnaXRzID49IExPTkdfTUFYLzIgKyAxIC0gKExPTkdfTUFYLzIgKyAxIC0gREJMX01BWF9FWFApCi0JICogICAgICAgICAgICAgICAgICAgID0gREJMX01BWF9FWFAKLQkgKgotCSAqIHNvIHx4fCA+PSAyKipEQkxfTUFYX0VYUCwgd2hpY2ggaXMgdG9vIGxhcmdlIHRvIGJlIHN0b3JlZCBpbiBDCi0JICogZG91YmxlLCBzbyBvdmVyZmxvd3MuICBJZiBleHAgPCBMT05HX01JTi8yLCB0aGVuCi0JICoKLQkgKiAgIGV4cCArIDQqbmRpZ2l0cyA8PSBMT05HX01JTi8yIC0gMSArICgKLQkgKiAgICAgICAgICAgICAgICAgICAgICBEQkxfTUlOX0VYUCAtIERCTF9NQU5UX0RJRyAtIExPTkdfTUlOLzIpCi0JICogICAgICAgICAgICAgICAgICAgID0gREJMX01JTl9FWFAgLSBEQkxfTUFOVF9ESUcgLSAxCi0JICoKLQkgKiBhbmQgc28gfHh8IDwgMioqKERCTF9NSU5fRVhQLURCTF9NQU5UX0RJRy0xKSwgaGVuY2UgdW5kZXJmbG93cyB0byAwCi0JICogd2hlbiBjb252ZXJ0ZWQgdG8gYSBDIGRvdWJsZS4KLQkgKgotCSAqIEl0J3MgZWFzeSB0byBzaG93IHRoYXQgaWYgTE9OR19NSU4vMiA8PSBleHAgPD0gTE9OR19NQVgvMiB0aGVuIGJvdGgKLQkgKiBleHArNCpuZGlnaXRzIGFuZCBleHAtNCpuZGlnaXRzIGFyZSB3aXRoaW4gdGhlIHJhbmdlIG9mIGEgbG9uZy4KLQkgKi8KKyAgICAvKgorICAgICAqIEZvciB0aGUgc2FrZSBvZiBzaW1wbGljaXR5IGFuZCBjb3JyZWN0bmVzcywgd2UgaW1wb3NlIGFuIGFydGlmaWNpYWwKKyAgICAgKiBsaW1pdCBvbiBuZGlnaXRzLCB0aGUgdG90YWwgbnVtYmVyIG9mIGhleCBkaWdpdHMgaW4gdGhlIGNvZWZmaWNpZW50CisgICAgICogVGhlIGxpbWl0IGlzIGNob3NlbiB0byBlbnN1cmUgdGhhdCwgd3JpdGluZyBleHAgZm9yIHRoZSBleHBvbmVudCwKKyAgICAgKgorICAgICAqICAgKDEpIGlmIGV4cCA+IExPTkdfTUFYLzIgdGhlbiB0aGUgdmFsdWUgb2YgdGhlIGhleCBzdHJpbmcgaXMKKyAgICAgKiAgIGd1YXJhbnRlZWQgdG8gb3ZlcmZsb3cgKHByb3ZpZGVkIGl0J3Mgbm9uemVybykKKyAgICAgKgorICAgICAqICAgKDIpIGlmIGV4cCA8IExPTkdfTUlOLzIgdGhlbiB0aGUgdmFsdWUgb2YgdGhlIGhleCBzdHJpbmcgaXMKKyAgICAgKiAgIGd1YXJhbnRlZWQgdG8gdW5kZXJmbG93IHRvIDAuCisgICAgICoKKyAgICAgKiAgICgzKSBpZiBMT05HX01JTi8yIDw9IGV4cCA8PSBMT05HX01BWC8yIHRoZW4gdGhlcmUncyBubyBkYW5nZXIgb2YKKyAgICAgKiAgIG92ZXJmbG93IGluIHRoZSBjYWxjdWxhdGlvbiBvZiBleHAgYW5kIHRvcF9leHAgYmVsb3cuCisgICAgICoKKyAgICAgKiBNb3JlIHNwZWNpZmljYWxseSwgbmRpZ2l0cyBpcyBhc3N1bWVkIHRvIHNhdGlzZnkgdGhlIGZvbGxvd2luZworICAgICAqIGluZXF1YWxpdGllczoKKyAgICAgKgorICAgICAqICAgNCpuZGlnaXRzIDw9IERCTF9NSU5fRVhQIC0gREJMX01BTlRfRElHIC0gTE9OR19NSU4vMgorICAgICAqICAgNCpuZGlnaXRzIDw9IExPTkdfTUFYLzIgKyAxIC0gREJMX01BWF9FWFAKKyAgICAgKgorICAgICAqIElmIGVpdGhlciBvZiB0aGVzZSBpbmVxdWFsaXRpZXMgaXMgbm90IHNhdGlzZmllZCwgYSBWYWx1ZUVycm9yIGlzCisgICAgICogcmFpc2VkLiAgT3RoZXJ3aXNlLCB3cml0ZSB4IGZvciB0aGUgdmFsdWUgb2YgdGhlIGhleCBzdHJpbmcsIGFuZAorICAgICAqIGFzc3VtZSB4IGlzIG5vbnplcm8uICBUaGVuCisgICAgICoKKyAgICAgKiAgIDIqKihleHAtNCpuZGlnaXRzKSA8PSB8eHwgPCAyKiooZXhwKzQqbmRpZ2l0cykuCisgICAgICoKKyAgICAgKiBOb3cgaWYgZXhwID4gTE9OR19NQVgvMiB0aGVuOgorICAgICAqCisgICAgICogICBleHAgLSA0Km5kaWdpdHMgPj0gTE9OR19NQVgvMiArIDEgLSAoTE9OR19NQVgvMiArIDEgLSBEQkxfTUFYX0VYUCkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgPSBEQkxfTUFYX0VYUAorICAgICAqCisgICAgICogc28gfHh8ID49IDIqKkRCTF9NQVhfRVhQLCB3aGljaCBpcyB0b28gbGFyZ2UgdG8gYmUgc3RvcmVkIGluIEMKKyAgICAgKiBkb3VibGUsIHNvIG92ZXJmbG93cy4gIElmIGV4cCA8IExPTkdfTUlOLzIsIHRoZW4KKyAgICAgKgorICAgICAqICAgZXhwICsgNCpuZGlnaXRzIDw9IExPTkdfTUlOLzIgLSAxICsgKAorICAgICAqICAgICAgICAgICAgICAgICAgICAgIERCTF9NSU5fRVhQIC0gREJMX01BTlRfRElHIC0gTE9OR19NSU4vMikKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgPSBEQkxfTUlOX0VYUCAtIERCTF9NQU5UX0RJRyAtIDEKKyAgICAgKgorICAgICAqIGFuZCBzbyB8eHwgPCAyKiooREJMX01JTl9FWFAtREJMX01BTlRfRElHLTEpLCBoZW5jZSB1bmRlcmZsb3dzIHRvIDAKKyAgICAgKiB3aGVuIGNvbnZlcnRlZCB0byBhIEMgZG91YmxlLgorICAgICAqCisgICAgICogSXQncyBlYXN5IHRvIHNob3cgdGhhdCBpZiBMT05HX01JTi8yIDw9IGV4cCA8PSBMT05HX01BWC8yIHRoZW4gYm90aAorICAgICAqIGV4cCs0Km5kaWdpdHMgYW5kIGV4cC00Km5kaWdpdHMgYXJlIHdpdGhpbiB0aGUgcmFuZ2Ugb2YgYSBsb25nLgorICAgICAqLwogCi0JaWYgKFB5U3RyaW5nX0FzU3RyaW5nQW5kU2l6ZShhcmcsICZzLCAmbGVuZ3RoKSkKLQkJcmV0dXJuIE5VTEw7Ci0Jc19lbmQgPSBzICsgbGVuZ3RoOworICAgIGlmIChQeVN0cmluZ19Bc1N0cmluZ0FuZFNpemUoYXJnLCAmcywgJmxlbmd0aCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHNfZW5kID0gcyArIGxlbmd0aDsKIAotCS8qKioqKioqKioqKioqKioqKioqKgotCSAqIFBhcnNlIHRoZSBzdHJpbmcgKgotCSAqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKioqKioqKioqKioqKioqKioqKioKKyAgICAgKiBQYXJzZSB0aGUgc3RyaW5nICoKKyAgICAgKioqKioqKioqKioqKioqKioqKiovCiAKLQkvKiBsZWFkaW5nIHdoaXRlc3BhY2UgYW5kIG9wdGlvbmFsIHNpZ24gKi8KLQl3aGlsZSAoKnMgJiYgaXNzcGFjZShQeV9DSEFSTUFTSygqcykpKQotCQlzKys7Ci0JaWYgKCpzID09ICctJykgewotCQlzKys7Ci0JCXNpZ24gPSAtMTsKLQl9Ci0JZWxzZSBpZiAoKnMgPT0gJysnKQotCQlzKys7CisgICAgLyogbGVhZGluZyB3aGl0ZXNwYWNlIGFuZCBvcHRpb25hbCBzaWduICovCisgICAgd2hpbGUgKCpzICYmIGlzc3BhY2UoUHlfQ0hBUk1BU0soKnMpKSkKKyAgICAgICAgcysrOworICAgIGlmICgqcyA9PSAnLScpIHsKKyAgICAgICAgcysrOworICAgICAgICBzaWduID0gLTE7CisgICAgfQorICAgIGVsc2UgaWYgKCpzID09ICcrJykKKyAgICAgICAgcysrOwogCi0JLyogaW5maW5pdGllcyBhbmQgbmFucyAqLwotCWlmICgqcyA9PSAnaScgfHwgKnMgPT0gJ0knKSB7Ci0JCWlmICghY2FzZV9pbnNlbnNpdGl2ZV9tYXRjaChzKzEsICJuZiIpKQotCQkJZ290byBwYXJzZV9lcnJvcjsKLQkJcyArPSAzOwotCQl4ID0gUHlfSFVHRV9WQUw7Ci0JCWlmIChjYXNlX2luc2Vuc2l0aXZlX21hdGNoKHMsICJpbml0eSIpKQotCQkJcyArPSA1OwotCQlnb3RvIGZpbmlzaGVkOwotCX0KLQlpZiAoKnMgPT0gJ24nIHx8ICpzID09ICdOJykgewotCQlpZiAoIWNhc2VfaW5zZW5zaXRpdmVfbWF0Y2gocysxLCAiYW4iKSkKLQkJCWdvdG8gcGFyc2VfZXJyb3I7Ci0JCXMgKz0gMzsKLQkJeCA9IFB5X05BTjsKLQkJZ290byBmaW5pc2hlZDsKLQl9CisgICAgLyogaW5maW5pdGllcyBhbmQgbmFucyAqLworICAgIGlmICgqcyA9PSAnaScgfHwgKnMgPT0gJ0knKSB7CisgICAgICAgIGlmICghY2FzZV9pbnNlbnNpdGl2ZV9tYXRjaChzKzEsICJuZiIpKQorICAgICAgICAgICAgZ290byBwYXJzZV9lcnJvcjsKKyAgICAgICAgcyArPSAzOworICAgICAgICB4ID0gUHlfSFVHRV9WQUw7CisgICAgICAgIGlmIChjYXNlX2luc2Vuc2l0aXZlX21hdGNoKHMsICJpbml0eSIpKQorICAgICAgICAgICAgcyArPSA1OworICAgICAgICBnb3RvIGZpbmlzaGVkOworICAgIH0KKyAgICBpZiAoKnMgPT0gJ24nIHx8ICpzID09ICdOJykgeworICAgICAgICBpZiAoIWNhc2VfaW5zZW5zaXRpdmVfbWF0Y2gocysxLCAiYW4iKSkKKyAgICAgICAgICAgIGdvdG8gcGFyc2VfZXJyb3I7CisgICAgICAgIHMgKz0gMzsKKyAgICAgICAgeCA9IFB5X05BTjsKKyAgICAgICAgZ290byBmaW5pc2hlZDsKKyAgICB9CiAKLQkvKiBbMHhdICovCi0Jc19zdG9yZSA9IHM7Ci0JaWYgKCpzID09ICcwJykgewotCQlzKys7Ci0JCWlmICh0b2xvd2VyKCpzKSA9PSAoaW50KSd4JykKLQkJCXMrKzsKLQkJZWxzZQotCQkJcyA9IHNfc3RvcmU7Ci0JfQorICAgIC8qIFsweF0gKi8KKyAgICBzX3N0b3JlID0gczsKKyAgICBpZiAoKnMgPT0gJzAnKSB7CisgICAgICAgIHMrKzsKKyAgICAgICAgaWYgKHRvbG93ZXIoKnMpID09IChpbnQpJ3gnKQorICAgICAgICAgICAgcysrOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzID0gc19zdG9yZTsKKyAgICB9CiAKLQkvKiBjb2VmZmljaWVudDogPGludGVnZXI+IFsuIDxmcmFjdGlvbj5dICovCi0JY29lZmZfc3RhcnQgPSBzOwotCXdoaWxlIChoZXhfZnJvbV9jaGFyKCpzKSA+PSAwKQotCQlzKys7Ci0Jc19zdG9yZSA9IHM7Ci0JaWYgKCpzID09ICcuJykgewotCQlzKys7Ci0JCXdoaWxlIChoZXhfZnJvbV9jaGFyKCpzKSA+PSAwKQotCQkJcysrOwotCQljb2VmZl9lbmQgPSBzLTE7Ci0JfQotCWVsc2UKLQkJY29lZmZfZW5kID0gczsKKyAgICAvKiBjb2VmZmljaWVudDogPGludGVnZXI+IFsuIDxmcmFjdGlvbj5dICovCisgICAgY29lZmZfc3RhcnQgPSBzOworICAgIHdoaWxlIChoZXhfZnJvbV9jaGFyKCpzKSA+PSAwKQorICAgICAgICBzKys7CisgICAgc19zdG9yZSA9IHM7CisgICAgaWYgKCpzID09ICcuJykgeworICAgICAgICBzKys7CisgICAgICAgIHdoaWxlIChoZXhfZnJvbV9jaGFyKCpzKSA+PSAwKQorICAgICAgICAgICAgcysrOworICAgICAgICBjb2VmZl9lbmQgPSBzLTE7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgY29lZmZfZW5kID0gczsKIAotCS8qIG5kaWdpdHMgPSB0b3RhbCAjIG9mIGhleCBkaWdpdHM7IGZkaWdpdHMgPSAjIGFmdGVyIHBvaW50ICovCi0JbmRpZ2l0cyA9IGNvZWZmX2VuZCAtIGNvZWZmX3N0YXJ0OwotCWZkaWdpdHMgPSBjb2VmZl9lbmQgLSBzX3N0b3JlOwotCWlmIChuZGlnaXRzID09IDApCi0JCWdvdG8gcGFyc2VfZXJyb3I7Ci0JaWYgKG5kaWdpdHMgPiBNSU4oREJMX01JTl9FWFAgLSBEQkxfTUFOVF9ESUcgLSBMT05HX01JTi8yLAotCQkJICBMT05HX01BWC8yICsgMSAtIERCTF9NQVhfRVhQKS80KQotCQlnb3RvIGluc2FuZV9sZW5ndGhfZXJyb3I7CisgICAgLyogbmRpZ2l0cyA9IHRvdGFsICMgb2YgaGV4IGRpZ2l0czsgZmRpZ2l0cyA9ICMgYWZ0ZXIgcG9pbnQgKi8KKyAgICBuZGlnaXRzID0gY29lZmZfZW5kIC0gY29lZmZfc3RhcnQ7CisgICAgZmRpZ2l0cyA9IGNvZWZmX2VuZCAtIHNfc3RvcmU7CisgICAgaWYgKG5kaWdpdHMgPT0gMCkKKyAgICAgICAgZ290byBwYXJzZV9lcnJvcjsKKyAgICBpZiAobmRpZ2l0cyA+IE1JTihEQkxfTUlOX0VYUCAtIERCTF9NQU5UX0RJRyAtIExPTkdfTUlOLzIsCisgICAgICAgICAgICAgICAgICAgICAgTE9OR19NQVgvMiArIDEgLSBEQkxfTUFYX0VYUCkvNCkKKyAgICAgICAgZ290byBpbnNhbmVfbGVuZ3RoX2Vycm9yOwogCi0JLyogW3AgPGV4cG9uZW50Pl0gKi8KLQlpZiAodG9sb3dlcigqcykgPT0gKGludCkncCcpIHsKLQkJcysrOwotCQlleHBfc3RhcnQgPSBzOwotCQlpZiAoKnMgPT0gJy0nIHx8ICpzID09ICcrJykKLQkJCXMrKzsKLQkJaWYgKCEoJzAnIDw9ICpzICYmICpzIDw9ICc5JykpCi0JCQlnb3RvIHBhcnNlX2Vycm9yOwotCQlzKys7Ci0JCXdoaWxlICgnMCcgPD0gKnMgJiYgKnMgPD0gJzknKQotCQkJcysrOwotCQlleHAgPSBzdHJ0b2woZXhwX3N0YXJ0LCBOVUxMLCAxMCk7Ci0JfQotCWVsc2UKLQkJZXhwID0gMDsKKyAgICAvKiBbcCA8ZXhwb25lbnQ+XSAqLworICAgIGlmICh0b2xvd2VyKCpzKSA9PSAoaW50KSdwJykgeworICAgICAgICBzKys7CisgICAgICAgIGV4cF9zdGFydCA9IHM7CisgICAgICAgIGlmICgqcyA9PSAnLScgfHwgKnMgPT0gJysnKQorICAgICAgICAgICAgcysrOworICAgICAgICBpZiAoISgnMCcgPD0gKnMgJiYgKnMgPD0gJzknKSkKKyAgICAgICAgICAgIGdvdG8gcGFyc2VfZXJyb3I7CisgICAgICAgIHMrKzsKKyAgICAgICAgd2hpbGUgKCcwJyA8PSAqcyAmJiAqcyA8PSAnOScpCisgICAgICAgICAgICBzKys7CisgICAgICAgIGV4cCA9IHN0cnRvbChleHBfc3RhcnQsIE5VTEwsIDEwKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBleHAgPSAwOwogCiAvKiBmb3IgMCA8PSBqIDwgbmRpZ2l0cywgSEVYX0RJR0lUKGopIGdpdmVzIHRoZSBqdGggbW9zdCBzaWduaWZpY2FudCBkaWdpdCAqLwotI2RlZmluZSBIRVhfRElHSVQoaikgaGV4X2Zyb21fY2hhcigqKChqKSA8IGZkaWdpdHMgPwkJXAotCQkJCSAgICAgY29lZmZfZW5kLShqKSA6CQkJXAotCQkJCSAgICAgY29lZmZfZW5kLTEtKGopKSkKKyNkZWZpbmUgSEVYX0RJR0lUKGopIGhleF9mcm9tX2NoYXIoKigoaikgPCBmZGlnaXRzID8gICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICBjb2VmZl9lbmQtKGopIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICBjb2VmZl9lbmQtMS0oaikpKQogCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkgKiBDb21wdXRlIHJvdW5kZWQgdmFsdWUgb2YgdGhlIGhleCBzdHJpbmcgKgotCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICogQ29tcHV0ZSByb3VuZGVkIHZhbHVlIG9mIHRoZSBoZXggc3RyaW5nICoKKyAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotCS8qIERpc2NhcmQgbGVhZGluZyB6ZXJvcywgYW5kIGNhdGNoIGV4dHJlbWUgb3ZlcmZsb3cgYW5kIHVuZGVyZmxvdyAqLwotCXdoaWxlIChuZGlnaXRzID4gMCAmJiBIRVhfRElHSVQobmRpZ2l0cy0xKSA9PSAwKQotCQluZGlnaXRzLS07Ci0JaWYgKG5kaWdpdHMgPT0gMCB8fCBleHAgPCBMT05HX01JTi8yKSB7Ci0JCXggPSAwLjA7Ci0JCWdvdG8gZmluaXNoZWQ7Ci0JfQotCWlmIChleHAgPiBMT05HX01BWC8yKQotCQlnb3RvIG92ZXJmbG93X2Vycm9yOworICAgIC8qIERpc2NhcmQgbGVhZGluZyB6ZXJvcywgYW5kIGNhdGNoIGV4dHJlbWUgb3ZlcmZsb3cgYW5kIHVuZGVyZmxvdyAqLworICAgIHdoaWxlIChuZGlnaXRzID4gMCAmJiBIRVhfRElHSVQobmRpZ2l0cy0xKSA9PSAwKQorICAgICAgICBuZGlnaXRzLS07CisgICAgaWYgKG5kaWdpdHMgPT0gMCB8fCBleHAgPCBMT05HX01JTi8yKSB7CisgICAgICAgIHggPSAwLjA7CisgICAgICAgIGdvdG8gZmluaXNoZWQ7CisgICAgfQorICAgIGlmIChleHAgPiBMT05HX01BWC8yKQorICAgICAgICBnb3RvIG92ZXJmbG93X2Vycm9yOwogCi0JLyogQWRqdXN0IGV4cG9uZW50IGZvciBmcmFjdGlvbmFsIHBhcnQuICovCi0JZXhwID0gZXhwIC0gNCooKGxvbmcpZmRpZ2l0cyk7CisgICAgLyogQWRqdXN0IGV4cG9uZW50IGZvciBmcmFjdGlvbmFsIHBhcnQuICovCisgICAgZXhwID0gZXhwIC0gNCooKGxvbmcpZmRpZ2l0cyk7CiAKLQkvKiB0b3BfZXhwID0gMSBtb3JlIHRoYW4gZXhwb25lbnQgb2YgbW9zdCBzaWcuIGJpdCBvZiBjb2VmZmljaWVudCAqLwotCXRvcF9leHAgPSBleHAgKyA0KigobG9uZyluZGlnaXRzIC0gMSk7Ci0JZm9yIChkaWdpdCA9IEhFWF9ESUdJVChuZGlnaXRzLTEpOyBkaWdpdCAhPSAwOyBkaWdpdCAvPSAyKQotCQl0b3BfZXhwKys7CisgICAgLyogdG9wX2V4cCA9IDEgbW9yZSB0aGFuIGV4cG9uZW50IG9mIG1vc3Qgc2lnLiBiaXQgb2YgY29lZmZpY2llbnQgKi8KKyAgICB0b3BfZXhwID0gZXhwICsgNCooKGxvbmcpbmRpZ2l0cyAtIDEpOworICAgIGZvciAoZGlnaXQgPSBIRVhfRElHSVQobmRpZ2l0cy0xKTsgZGlnaXQgIT0gMDsgZGlnaXQgLz0gMikKKyAgICAgICAgdG9wX2V4cCsrOwogCi0JLyogY2F0Y2ggYWxtb3N0IGFsbCBub25leHRyZW1lIGNhc2VzIG9mIG92ZXJmbG93IGFuZCB1bmRlcmZsb3cgaGVyZSAqLwotCWlmICh0b3BfZXhwIDwgREJMX01JTl9FWFAgLSBEQkxfTUFOVF9ESUcpIHsKLQkJeCA9IDAuMDsKLQkJZ290byBmaW5pc2hlZDsKLQl9Ci0JaWYgKHRvcF9leHAgPiBEQkxfTUFYX0VYUCkKLQkJZ290byBvdmVyZmxvd19lcnJvcjsKKyAgICAvKiBjYXRjaCBhbG1vc3QgYWxsIG5vbmV4dHJlbWUgY2FzZXMgb2Ygb3ZlcmZsb3cgYW5kIHVuZGVyZmxvdyBoZXJlICovCisgICAgaWYgKHRvcF9leHAgPCBEQkxfTUlOX0VYUCAtIERCTF9NQU5UX0RJRykgeworICAgICAgICB4ID0gMC4wOworICAgICAgICBnb3RvIGZpbmlzaGVkOworICAgIH0KKyAgICBpZiAodG9wX2V4cCA+IERCTF9NQVhfRVhQKQorICAgICAgICBnb3RvIG92ZXJmbG93X2Vycm9yOwogCi0JLyogbHNiID0gZXhwb25lbnQgb2YgbGVhc3Qgc2lnbmlmaWNhbnQgYml0IG9mIHRoZSAqcm91bmRlZCogdmFsdWUuCi0JICAgVGhpcyBpcyB0b3BfZXhwIC0gREJMX01BTlRfRElHIHVubGVzcyByZXN1bHQgaXMgc3Vibm9ybWFsLiAqLwotCWxzYiA9IE1BWCh0b3BfZXhwLCAobG9uZylEQkxfTUlOX0VYUCkgLSBEQkxfTUFOVF9ESUc7CisgICAgLyogbHNiID0gZXhwb25lbnQgb2YgbGVhc3Qgc2lnbmlmaWNhbnQgYml0IG9mIHRoZSAqcm91bmRlZCogdmFsdWUuCisgICAgICAgVGhpcyBpcyB0b3BfZXhwIC0gREJMX01BTlRfRElHIHVubGVzcyByZXN1bHQgaXMgc3Vibm9ybWFsLiAqLworICAgIGxzYiA9IE1BWCh0b3BfZXhwLCAobG9uZylEQkxfTUlOX0VYUCkgLSBEQkxfTUFOVF9ESUc7CiAKLQl4ID0gMC4wOwotCWlmIChleHAgPj0gbHNiKSB7Ci0JCS8qIG5vIHJvdW5kaW5nIHJlcXVpcmVkICovCi0JCWZvciAoaSA9IG5kaWdpdHMtMTsgaSA+PSAwOyBpLS0pCi0JCQl4ID0gMTYuMCp4ICsgSEVYX0RJR0lUKGkpOwotCQl4ID0gbGRleHAoeCwgKGludCkoZXhwKSk7Ci0JCWdvdG8gZmluaXNoZWQ7Ci0JfQotCS8qIHJvdW5kaW5nIHJlcXVpcmVkLiAga2V5X2RpZ2l0IGlzIHRoZSBpbmRleCBvZiB0aGUgaGV4IGRpZ2l0Ci0JICAgY29udGFpbmluZyB0aGUgZmlyc3QgYml0IHRvIGJlIHJvdW5kZWQgYXdheS4gKi8KLQloYWxmX2VwcyA9IDEgPDwgKGludCkoKGxzYiAtIGV4cCAtIDEpICUgNCk7Ci0Ja2V5X2RpZ2l0ID0gKGxzYiAtIGV4cCAtIDEpIC8gNDsKLQlmb3IgKGkgPSBuZGlnaXRzLTE7IGkgPiBrZXlfZGlnaXQ7IGktLSkKLQkJeCA9IDE2LjAqeCArIEhFWF9ESUdJVChpKTsKLQlkaWdpdCA9IEhFWF9ESUdJVChrZXlfZGlnaXQpOwotCXggPSAxNi4wKnggKyAoZG91YmxlKShkaWdpdCAmICgxNi0yKmhhbGZfZXBzKSk7CisgICAgeCA9IDAuMDsKKyAgICBpZiAoZXhwID49IGxzYikgeworICAgICAgICAvKiBubyByb3VuZGluZyByZXF1aXJlZCAqLworICAgICAgICBmb3IgKGkgPSBuZGlnaXRzLTE7IGkgPj0gMDsgaS0tKQorICAgICAgICAgICAgeCA9IDE2LjAqeCArIEhFWF9ESUdJVChpKTsKKyAgICAgICAgeCA9IGxkZXhwKHgsIChpbnQpKGV4cCkpOworICAgICAgICBnb3RvIGZpbmlzaGVkOworICAgIH0KKyAgICAvKiByb3VuZGluZyByZXF1aXJlZC4gIGtleV9kaWdpdCBpcyB0aGUgaW5kZXggb2YgdGhlIGhleCBkaWdpdAorICAgICAgIGNvbnRhaW5pbmcgdGhlIGZpcnN0IGJpdCB0byBiZSByb3VuZGVkIGF3YXkuICovCisgICAgaGFsZl9lcHMgPSAxIDw8IChpbnQpKChsc2IgLSBleHAgLSAxKSAlIDQpOworICAgIGtleV9kaWdpdCA9IChsc2IgLSBleHAgLSAxKSAvIDQ7CisgICAgZm9yIChpID0gbmRpZ2l0cy0xOyBpID4ga2V5X2RpZ2l0OyBpLS0pCisgICAgICAgIHggPSAxNi4wKnggKyBIRVhfRElHSVQoaSk7CisgICAgZGlnaXQgPSBIRVhfRElHSVQoa2V5X2RpZ2l0KTsKKyAgICB4ID0gMTYuMCp4ICsgKGRvdWJsZSkoZGlnaXQgJiAoMTYtMipoYWxmX2VwcykpOwogCi0JLyogcm91bmQtaGFsZi1ldmVuOiByb3VuZCB1cCBpZiBiaXQgbHNiLTEgaXMgMSBhbmQgYXQgbGVhc3Qgb25lIG9mCi0JICAgYml0cyBsc2IsIGxzYi0yLCBsc2ItMywgbHNiLTQsIC4uLiBpcyAxLiAqLwotCWlmICgoZGlnaXQgJiBoYWxmX2VwcykgIT0gMCkgewotCQlyb3VuZF91cCA9IDA7Ci0JCWlmICgoZGlnaXQgJiAoMypoYWxmX2Vwcy0xKSkgIT0gMCB8fAotCQkgICAgKGhhbGZfZXBzID09IDggJiYgKEhFWF9ESUdJVChrZXlfZGlnaXQrMSkgJiAxKSAhPSAwKSkKLQkJCXJvdW5kX3VwID0gMTsKLQkJZWxzZQotCQkJZm9yIChpID0ga2V5X2RpZ2l0LTE7IGkgPj0gMDsgaS0tKQotCQkJCWlmIChIRVhfRElHSVQoaSkgIT0gMCkgewotCQkJCQlyb3VuZF91cCA9IDE7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJaWYgKHJvdW5kX3VwID09IDEpIHsKLQkJCXggKz0gMipoYWxmX2VwczsKLQkJCWlmICh0b3BfZXhwID09IERCTF9NQVhfRVhQICYmCi0JCQkgICAgeCA9PSBsZGV4cCgoZG91YmxlKSgyKmhhbGZfZXBzKSwgREJMX01BTlRfRElHKSkKLQkJCQkvKiBvdmVyZmxvdyBjb3JuZXIgY2FzZTogcHJlLXJvdW5kZWQgdmFsdWUgPAotCQkJCSAgIDIqKkRCTF9NQVhfRVhQOyByb3VuZGVkPTIqKkRCTF9NQVhfRVhQLiAqLwotCQkJCWdvdG8gb3ZlcmZsb3dfZXJyb3I7Ci0JCX0KLQl9Ci0JeCA9IGxkZXhwKHgsIChpbnQpKGV4cCs0KmtleV9kaWdpdCkpOworICAgIC8qIHJvdW5kLWhhbGYtZXZlbjogcm91bmQgdXAgaWYgYml0IGxzYi0xIGlzIDEgYW5kIGF0IGxlYXN0IG9uZSBvZgorICAgICAgIGJpdHMgbHNiLCBsc2ItMiwgbHNiLTMsIGxzYi00LCAuLi4gaXMgMS4gKi8KKyAgICBpZiAoKGRpZ2l0ICYgaGFsZl9lcHMpICE9IDApIHsKKyAgICAgICAgcm91bmRfdXAgPSAwOworICAgICAgICBpZiAoKGRpZ2l0ICYgKDMqaGFsZl9lcHMtMSkpICE9IDAgfHwKKyAgICAgICAgICAgIChoYWxmX2VwcyA9PSA4ICYmIChIRVhfRElHSVQoa2V5X2RpZ2l0KzEpICYgMSkgIT0gMCkpCisgICAgICAgICAgICByb3VuZF91cCA9IDE7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGZvciAoaSA9IGtleV9kaWdpdC0xOyBpID49IDA7IGktLSkKKyAgICAgICAgICAgICAgICBpZiAoSEVYX0RJR0lUKGkpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcm91bmRfdXAgPSAxOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIGlmIChyb3VuZF91cCA9PSAxKSB7CisgICAgICAgICAgICB4ICs9IDIqaGFsZl9lcHM7CisgICAgICAgICAgICBpZiAodG9wX2V4cCA9PSBEQkxfTUFYX0VYUCAmJgorICAgICAgICAgICAgICAgIHggPT0gbGRleHAoKGRvdWJsZSkoMipoYWxmX2VwcyksIERCTF9NQU5UX0RJRykpCisgICAgICAgICAgICAgICAgLyogb3ZlcmZsb3cgY29ybmVyIGNhc2U6IHByZS1yb3VuZGVkIHZhbHVlIDwKKyAgICAgICAgICAgICAgICAgICAyKipEQkxfTUFYX0VYUDsgcm91bmRlZD0yKipEQkxfTUFYX0VYUC4gKi8KKyAgICAgICAgICAgICAgICBnb3RvIG92ZXJmbG93X2Vycm9yOworICAgICAgICB9CisgICAgfQorICAgIHggPSBsZGV4cCh4LCAoaW50KShleHArNCprZXlfZGlnaXQpKTsKIAogICBmaW5pc2hlZDoKLQkvKiBvcHRpb25hbCB0cmFpbGluZyB3aGl0ZXNwYWNlIGxlYWRpbmcgdG8gdGhlIGVuZCBvZiB0aGUgc3RyaW5nICovCi0Jd2hpbGUgKCpzICYmIGlzc3BhY2UoUHlfQ0hBUk1BU0soKnMpKSkKLQkJcysrOwotCWlmIChzICE9IHNfZW5kKQotCQlnb3RvIHBhcnNlX2Vycm9yOwotCXJlc3VsdF9hc19mbG9hdCA9IFB5X0J1aWxkVmFsdWUoIihkKSIsIHNpZ24gKiB4KTsKLQlpZiAocmVzdWx0X2FzX2Zsb2F0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXJlc3VsdCA9IFB5T2JqZWN0X0NhbGxPYmplY3QoY2xzLCByZXN1bHRfYXNfZmxvYXQpOwotCVB5X0RFQ1JFRihyZXN1bHRfYXNfZmxvYXQpOwotCXJldHVybiByZXN1bHQ7CisgICAgLyogb3B0aW9uYWwgdHJhaWxpbmcgd2hpdGVzcGFjZSBsZWFkaW5nIHRvIHRoZSBlbmQgb2YgdGhlIHN0cmluZyAqLworICAgIHdoaWxlICgqcyAmJiBpc3NwYWNlKFB5X0NIQVJNQVNLKCpzKSkpCisgICAgICAgIHMrKzsKKyAgICBpZiAocyAhPSBzX2VuZCkKKyAgICAgICAgZ290byBwYXJzZV9lcnJvcjsKKyAgICByZXN1bHRfYXNfZmxvYXQgPSBQeV9CdWlsZFZhbHVlKCIoZCkiLCBzaWduICogeCk7CisgICAgaWYgKHJlc3VsdF9hc19mbG9hdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXN1bHQgPSBQeU9iamVjdF9DYWxsT2JqZWN0KGNscywgcmVzdWx0X2FzX2Zsb2F0KTsKKyAgICBQeV9ERUNSRUYocmVzdWx0X2FzX2Zsb2F0KTsKKyAgICByZXR1cm4gcmVzdWx0OwogCiAgIG92ZXJmbG93X2Vycm9yOgotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJImhleGFkZWNpbWFsIHZhbHVlIHRvbyBsYXJnZSB0byByZXByZXNlbnQgYXMgYSBmbG9hdCIpOwotCXJldHVybiBOVUxMOworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAiaGV4YWRlY2ltYWwgdmFsdWUgdG9vIGxhcmdlIHRvIHJlcHJlc2VudCBhcyBhIGZsb2F0Iik7CisgICAgcmV0dXJuIE5VTEw7CiAKICAgcGFyc2VfZXJyb3I6Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkiaW52YWxpZCBoZXhhZGVjaW1hbCBmbG9hdGluZy1wb2ludCBzdHJpbmciKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgImludmFsaWQgaGV4YWRlY2ltYWwgZmxvYXRpbmctcG9pbnQgc3RyaW5nIik7CisgICAgcmV0dXJuIE5VTEw7CiAKICAgaW5zYW5lX2xlbmd0aF9lcnJvcjoKLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCSJoZXhhZGVjaW1hbCBzdHJpbmcgdG9vIGxvbmcgdG8gY29udmVydCIpOwotCXJldHVybiBOVUxMOworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAiaGV4YWRlY2ltYWwgc3RyaW5nIHRvbyBsb25nIHRvIGNvbnZlcnQiKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogUHlEb2NfU1RSVkFSKGZsb2F0X2Zyb21oZXhfZG9jLApAQCAtMTU0MSw4NSArMTU0MSw4NSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGZsb2F0X2FzX2ludGVnZXJfcmF0aW8oUHlPYmplY3QgKnYsIFB5T2JqZWN0ICp1bnVzZWQpCiB7Ci0JZG91YmxlIHNlbGY7Ci0JZG91YmxlIGZsb2F0X3BhcnQ7Ci0JaW50IGV4cG9uZW50OwotCWludCBpOworICAgIGRvdWJsZSBzZWxmOworICAgIGRvdWJsZSBmbG9hdF9wYXJ0OworICAgIGludCBleHBvbmVudDsKKyAgICBpbnQgaTsKIAotCVB5T2JqZWN0ICpwcmV2OwotCVB5T2JqZWN0ICpweV9leHBvbmVudCA9IE5VTEw7Ci0JUHlPYmplY3QgKm51bWVyYXRvciA9IE5VTEw7Ci0JUHlPYmplY3QgKmRlbm9taW5hdG9yID0gTlVMTDsKLQlQeU9iamVjdCAqcmVzdWx0X3BhaXIgPSBOVUxMOwotCVB5TnVtYmVyTWV0aG9kcyAqbG9uZ19tZXRob2RzID0gUHlMb25nX1R5cGUudHBfYXNfbnVtYmVyOworICAgIFB5T2JqZWN0ICpwcmV2OworICAgIFB5T2JqZWN0ICpweV9leHBvbmVudCA9IE5VTEw7CisgICAgUHlPYmplY3QgKm51bWVyYXRvciA9IE5VTEw7CisgICAgUHlPYmplY3QgKmRlbm9taW5hdG9yID0gTlVMTDsKKyAgICBQeU9iamVjdCAqcmVzdWx0X3BhaXIgPSBOVUxMOworICAgIFB5TnVtYmVyTWV0aG9kcyAqbG9uZ19tZXRob2RzID0gUHlMb25nX1R5cGUudHBfYXNfbnVtYmVyOwogCiAjZGVmaW5lIElOUExBQ0VfVVBEQVRFKG9iaiwgY2FsbCkgXAotCXByZXYgPSBvYmo7IFwKLQlvYmogPSBjYWxsOyBcCi0JUHlfREVDUkVGKHByZXYpOyBcCisgICAgcHJldiA9IG9iajsgXAorICAgIG9iaiA9IGNhbGw7IFwKKyAgICBQeV9ERUNSRUYocHJldik7IFwKIAotCUNPTlZFUlRfVE9fRE9VQkxFKHYsIHNlbGYpOworICAgIENPTlZFUlRfVE9fRE9VQkxFKHYsIHNlbGYpOwogCi0JaWYgKFB5X0lTX0lORklOSVRZKHNlbGYpKSB7Ci0JICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJCSAgIkNhbm5vdCBwYXNzIGluZmluaXR5IHRvIGZsb2F0LmFzX2ludGVnZXJfcmF0aW8uIik7Ci0JICByZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKFB5X0lTX0lORklOSVRZKHNlbGYpKSB7CisgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IHBhc3MgaW5maW5pdHkgdG8gZmxvYXQuYXNfaW50ZWdlcl9yYXRpby4iKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KICNpZmRlZiBQeV9OQU4KLQlpZiAoUHlfSVNfTkFOKHNlbGYpKSB7Ci0JICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCSAgIkNhbm5vdCBwYXNzIE5hTiB0byBmbG9hdC5hc19pbnRlZ2VyX3JhdGlvLiIpOwotCSAgcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChQeV9JU19OQU4oc2VsZikpIHsKKyAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgcGFzcyBOYU4gdG8gZmxvYXQuYXNfaW50ZWdlcl9yYXRpby4iKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KICNlbmRpZgogCi0JUHlGUEVfU1RBUlRfUFJPVEVDVCgiYXNfaW50ZWdlcl9yYXRpbyIsIGdvdG8gZXJyb3IpOwotCWZsb2F0X3BhcnQgPSBmcmV4cChzZWxmLCAmZXhwb25lbnQpOyAgCS8qIHNlbGYgPT0gZmxvYXRfcGFydCAqIDIqKmV4cG9uZW50IGV4YWN0bHkgKi8KLQlQeUZQRV9FTkRfUFJPVEVDVChmbG9hdF9wYXJ0KTsKLQkKLQlmb3IgKGk9MDsgaTwzMDAgJiYgZmxvYXRfcGFydCAhPSBmbG9vcihmbG9hdF9wYXJ0KSA7IGkrKykgewotCQlmbG9hdF9wYXJ0ICo9IDIuMDsKLQkJZXhwb25lbnQtLTsKLQl9CQotCS8qIHNlbGYgPT0gZmxvYXRfcGFydCAqIDIqKmV4cG9uZW50IGV4YWN0bHkgYW5kIGZsb2F0X3BhcnQgaXMgaW50ZWdyYWwuCi0gICAgICAgICAgIElmIEZMVF9SQURJWCAhPSAyLCB0aGUgMzAwIHN0ZXBzIG1heSBsZWF2ZSBhIHRpbnkgZnJhY3Rpb25hbCBwYXJ0Ci0gICAgICAgICAgIHRvIGJlIHRydW5jYXRlZCBieSBQeUxvbmdfRnJvbURvdWJsZSgpLiAqLworICAgIFB5RlBFX1NUQVJUX1BST1RFQ1QoImFzX2ludGVnZXJfcmF0aW8iLCBnb3RvIGVycm9yKTsKKyAgICBmbG9hdF9wYXJ0ID0gZnJleHAoc2VsZiwgJmV4cG9uZW50KTsgICAgICAgIC8qIHNlbGYgPT0gZmxvYXRfcGFydCAqIDIqKmV4cG9uZW50IGV4YWN0bHkgKi8KKyAgICBQeUZQRV9FTkRfUFJPVEVDVChmbG9hdF9wYXJ0KTsKIAotCW51bWVyYXRvciA9IFB5TG9uZ19Gcm9tRG91YmxlKGZsb2F0X3BhcnQpOwotCWlmIChudW1lcmF0b3IgPT0gTlVMTCkgZ290byBlcnJvcjsKKyAgICBmb3IgKGk9MDsgaTwzMDAgJiYgZmxvYXRfcGFydCAhPSBmbG9vcihmbG9hdF9wYXJ0KSA7IGkrKykgeworICAgICAgICBmbG9hdF9wYXJ0ICo9IDIuMDsKKyAgICAgICAgZXhwb25lbnQtLTsKKyAgICB9CisgICAgLyogc2VsZiA9PSBmbG9hdF9wYXJ0ICogMioqZXhwb25lbnQgZXhhY3RseSBhbmQgZmxvYXRfcGFydCBpcyBpbnRlZ3JhbC4KKyAgICAgICBJZiBGTFRfUkFESVggIT0gMiwgdGhlIDMwMCBzdGVwcyBtYXkgbGVhdmUgYSB0aW55IGZyYWN0aW9uYWwgcGFydAorICAgICAgIHRvIGJlIHRydW5jYXRlZCBieSBQeUxvbmdfRnJvbURvdWJsZSgpLiAqLwogCi0JLyogZm9sZCBpbiAyKipleHBvbmVudCAqLwotCWRlbm9taW5hdG9yID0gUHlMb25nX0Zyb21Mb25nKDEpOwotCXB5X2V4cG9uZW50ID0gUHlMb25nX0Zyb21Mb25nKGxhYnMoKGxvbmcpZXhwb25lbnQpKTsKLQlpZiAocHlfZXhwb25lbnQgPT0gTlVMTCkgZ290byBlcnJvcjsKLQlJTlBMQUNFX1VQREFURShweV9leHBvbmVudCwKLQkJICAgICAgIGxvbmdfbWV0aG9kcy0+bmJfbHNoaWZ0KGRlbm9taW5hdG9yLCBweV9leHBvbmVudCkpOwotCWlmIChweV9leHBvbmVudCA9PSBOVUxMKSBnb3RvIGVycm9yOwotCWlmIChleHBvbmVudCA+IDApIHsKLQkJSU5QTEFDRV9VUERBVEUobnVtZXJhdG9yLAotCQkJICAgICAgIGxvbmdfbWV0aG9kcy0+bmJfbXVsdGlwbHkobnVtZXJhdG9yLCBweV9leHBvbmVudCkpOwotCQlpZiAobnVtZXJhdG9yID09IE5VTEwpIGdvdG8gZXJyb3I7Ci0JfQotCWVsc2UgewotCQlQeV9ERUNSRUYoZGVub21pbmF0b3IpOwotCQlkZW5vbWluYXRvciA9IHB5X2V4cG9uZW50OwotCQlweV9leHBvbmVudCA9IE5VTEw7Ci0JfQorICAgIG51bWVyYXRvciA9IFB5TG9uZ19Gcm9tRG91YmxlKGZsb2F0X3BhcnQpOworICAgIGlmIChudW1lcmF0b3IgPT0gTlVMTCkgZ290byBlcnJvcjsKIAotCS8qIFJldHVybnMgaW50cyBpbnN0ZWFkIG9mIGxvbmdzIHdoZXJlIHBvc3NpYmxlICovCi0JSU5QTEFDRV9VUERBVEUobnVtZXJhdG9yLCBQeU51bWJlcl9JbnQobnVtZXJhdG9yKSk7Ci0JaWYgKG51bWVyYXRvciA9PSBOVUxMKSBnb3RvIGVycm9yOwotCUlOUExBQ0VfVVBEQVRFKGRlbm9taW5hdG9yLCBQeU51bWJlcl9JbnQoZGVub21pbmF0b3IpKTsKLQlpZiAoZGVub21pbmF0b3IgPT0gTlVMTCkgZ290byBlcnJvcjsKKyAgICAvKiBmb2xkIGluIDIqKmV4cG9uZW50ICovCisgICAgZGVub21pbmF0b3IgPSBQeUxvbmdfRnJvbUxvbmcoMSk7CisgICAgcHlfZXhwb25lbnQgPSBQeUxvbmdfRnJvbUxvbmcobGFicygobG9uZylleHBvbmVudCkpOworICAgIGlmIChweV9leHBvbmVudCA9PSBOVUxMKSBnb3RvIGVycm9yOworICAgIElOUExBQ0VfVVBEQVRFKHB5X2V4cG9uZW50LAorICAgICAgICAgICAgICAgICAgIGxvbmdfbWV0aG9kcy0+bmJfbHNoaWZ0KGRlbm9taW5hdG9yLCBweV9leHBvbmVudCkpOworICAgIGlmIChweV9leHBvbmVudCA9PSBOVUxMKSBnb3RvIGVycm9yOworICAgIGlmIChleHBvbmVudCA+IDApIHsKKyAgICAgICAgSU5QTEFDRV9VUERBVEUobnVtZXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICBsb25nX21ldGhvZHMtPm5iX211bHRpcGx5KG51bWVyYXRvciwgcHlfZXhwb25lbnQpKTsKKyAgICAgICAgaWYgKG51bWVyYXRvciA9PSBOVUxMKSBnb3RvIGVycm9yOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgUHlfREVDUkVGKGRlbm9taW5hdG9yKTsKKyAgICAgICAgZGVub21pbmF0b3IgPSBweV9leHBvbmVudDsKKyAgICAgICAgcHlfZXhwb25lbnQgPSBOVUxMOworICAgIH0KIAotCXJlc3VsdF9wYWlyID0gUHlUdXBsZV9QYWNrKDIsIG51bWVyYXRvciwgZGVub21pbmF0b3IpOworICAgIC8qIFJldHVybnMgaW50cyBpbnN0ZWFkIG9mIGxvbmdzIHdoZXJlIHBvc3NpYmxlICovCisgICAgSU5QTEFDRV9VUERBVEUobnVtZXJhdG9yLCBQeU51bWJlcl9JbnQobnVtZXJhdG9yKSk7CisgICAgaWYgKG51bWVyYXRvciA9PSBOVUxMKSBnb3RvIGVycm9yOworICAgIElOUExBQ0VfVVBEQVRFKGRlbm9taW5hdG9yLCBQeU51bWJlcl9JbnQoZGVub21pbmF0b3IpKTsKKyAgICBpZiAoZGVub21pbmF0b3IgPT0gTlVMTCkgZ290byBlcnJvcjsKKworICAgIHJlc3VsdF9wYWlyID0gUHlUdXBsZV9QYWNrKDIsIG51bWVyYXRvciwgZGVub21pbmF0b3IpOwogCiAjdW5kZWYgSU5QTEFDRV9VUERBVEUKIGVycm9yOgotCVB5X1hERUNSRUYocHlfZXhwb25lbnQpOwotCVB5X1hERUNSRUYoZGVub21pbmF0b3IpOwotCVB5X1hERUNSRUYobnVtZXJhdG9yKTsKLQlyZXR1cm4gcmVzdWx0X3BhaXI7CisgICAgUHlfWERFQ1JFRihweV9leHBvbmVudCk7CisgICAgUHlfWERFQ1JFRihkZW5vbWluYXRvcik7CisgICAgUHlfWERFQ1JFRihudW1lcmF0b3IpOworICAgIHJldHVybiByZXN1bHRfcGFpcjsKIH0KIAogUHlEb2NfU1RSVkFSKGZsb2F0X2FzX2ludGVnZXJfcmF0aW9fZG9jLApAQCAtMTY0MywxOCArMTY0MywxOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGZsb2F0X25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlQeU9iamVjdCAqeCA9IFB5X0ZhbHNlOyAvKiBJbnRlZ2VyIHplcm8gKi8KLQlzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7IngiLCAwfTsKKyAgICBQeU9iamVjdCAqeCA9IFB5X0ZhbHNlOyAvKiBJbnRlZ2VyIHplcm8gKi8KKyAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7IngiLCAwfTsKIAotCWlmICh0eXBlICE9ICZQeUZsb2F0X1R5cGUpCi0JCXJldHVybiBmbG9hdF9zdWJ0eXBlX25ldyh0eXBlLCBhcmdzLCBrd2RzKTsgLyogV2ltcCBvdXQgKi8KLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAifE86ZmxvYXQiLCBrd2xpc3QsICZ4KSkKLQkJcmV0dXJuIE5VTEw7Ci0JLyogSWYgaXQncyBhIHN0cmluZywgYnV0IG5vdCBhIHN0cmluZyBzdWJjbGFzcywgdXNlCi0JICAgUHlGbG9hdF9Gcm9tU3RyaW5nLiAqLwotCWlmIChQeVN0cmluZ19DaGVja0V4YWN0KHgpKQotCQlyZXR1cm4gUHlGbG9hdF9Gcm9tU3RyaW5nKHgsIE5VTEwpOwotCXJldHVybiBQeU51bWJlcl9GbG9hdCh4KTsKKyAgICBpZiAodHlwZSAhPSAmUHlGbG9hdF9UeXBlKQorICAgICAgICByZXR1cm4gZmxvYXRfc3VidHlwZV9uZXcodHlwZSwgYXJncywga3dkcyk7IC8qIFdpbXAgb3V0ICovCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgInxPOmZsb2F0Iiwga3dsaXN0LCAmeCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIC8qIElmIGl0J3MgYSBzdHJpbmcsIGJ1dCBub3QgYSBzdHJpbmcgc3ViY2xhc3MsIHVzZQorICAgICAgIFB5RmxvYXRfRnJvbVN0cmluZy4gKi8KKyAgICBpZiAoUHlTdHJpbmdfQ2hlY2tFeGFjdCh4KSkKKyAgICAgICAgcmV0dXJuIFB5RmxvYXRfRnJvbVN0cmluZyh4LCBOVUxMKTsKKyAgICByZXR1cm4gUHlOdW1iZXJfRmxvYXQoeCk7CiB9CiAKIC8qIFdpbXB5LCBzbG93IGFwcHJvYWNoIHRvIHRwX25ldyBjYWxscyBmb3Igc3VidHlwZXMgb2YgZmxvYXQ6CkBAIC0xNjY1LDMzICsxNjY1LDMzIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZmxvYXRfc3VidHlwZV9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JUHlPYmplY3QgKnRtcCwgKm5ld29iajsKKyAgICBQeU9iamVjdCAqdG1wLCAqbmV3b2JqOwogCi0JYXNzZXJ0KFB5VHlwZV9Jc1N1YnR5cGUodHlwZSwgJlB5RmxvYXRfVHlwZSkpOwotCXRtcCA9IGZsb2F0X25ldygmUHlGbG9hdF9UeXBlLCBhcmdzLCBrd2RzKTsKLQlpZiAodG1wID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWFzc2VydChQeUZsb2F0X0NoZWNrRXhhY3QodG1wKSk7Ci0JbmV3b2JqID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7Ci0JaWYgKG5ld29iaiA9PSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRih0bXApOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JKChQeUZsb2F0T2JqZWN0ICopbmV3b2JqKS0+b2JfZnZhbCA9ICgoUHlGbG9hdE9iamVjdCAqKXRtcCktPm9iX2Z2YWw7Ci0JUHlfREVDUkVGKHRtcCk7Ci0JcmV0dXJuIG5ld29iajsKKyAgICBhc3NlcnQoUHlUeXBlX0lzU3VidHlwZSh0eXBlLCAmUHlGbG9hdF9UeXBlKSk7CisgICAgdG1wID0gZmxvYXRfbmV3KCZQeUZsb2F0X1R5cGUsIGFyZ3MsIGt3ZHMpOworICAgIGlmICh0bXAgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYXNzZXJ0KFB5RmxvYXRfQ2hlY2tFeGFjdCh0bXApKTsKKyAgICBuZXdvYmogPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKKyAgICBpZiAobmV3b2JqID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKHRtcCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICAoKFB5RmxvYXRPYmplY3QgKiluZXdvYmopLT5vYl9mdmFsID0gKChQeUZsb2F0T2JqZWN0ICopdG1wKS0+b2JfZnZhbDsKKyAgICBQeV9ERUNSRUYodG1wKTsKKyAgICByZXR1cm4gbmV3b2JqOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZmxvYXRfZ2V0bmV3YXJncyhQeUZsb2F0T2JqZWN0ICp2KQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKCIoZCkiLCB2LT5vYl9mdmFsKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKGQpIiwgdi0+b2JfZnZhbCk7CiB9CiAKIC8qIHRoaXMgaXMgZm9yIHRoZSBiZW5lZml0IG9mIHRoZSBwYWNrL3VucGFjayByb3V0aW5lcyBiZWxvdyAqLwogCiB0eXBlZGVmIGVudW0gewotCXVua25vd25fZm9ybWF0LCBpZWVlX2JpZ19lbmRpYW5fZm9ybWF0LCBpZWVlX2xpdHRsZV9lbmRpYW5fZm9ybWF0CisgICAgdW5rbm93bl9mb3JtYXQsIGllZWVfYmlnX2VuZGlhbl9mb3JtYXQsIGllZWVfbGl0dGxlX2VuZGlhbl9mb3JtYXQKIH0gZmxvYXRfZm9ybWF0X3R5cGU7CiAKIHN0YXRpYyBmbG9hdF9mb3JtYXRfdHlwZSBkb3VibGVfZm9ybWF0LCBmbG9hdF9mb3JtYXQ7CkBAIC0xNzAwLDQwICsxNzAwLDQwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZmxvYXRfZ2V0Zm9ybWF0KFB5VHlwZU9iamVjdCAqdiwgUHlPYmplY3QqIGFyZykKIHsKLQljaGFyKiBzOwotCWZsb2F0X2Zvcm1hdF90eXBlIHI7CisgICAgY2hhciogczsKKyAgICBmbG9hdF9mb3JtYXRfdHlwZSByOwogCi0JaWYgKCFQeVN0cmluZ19DaGVjayhhcmcpKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JICAgICAiX19nZXRmb3JtYXRfXygpIGFyZ3VtZW50IG11c3QgYmUgc3RyaW5nLCBub3QgJS41MDBzIiwKLQkJCSAgICAgUHlfVFlQRShhcmcpLT50cF9uYW1lKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXMgPSBQeVN0cmluZ19BU19TVFJJTkcoYXJnKTsKLQlpZiAoc3RyY21wKHMsICJkb3VibGUiKSA9PSAwKSB7Ci0JCXIgPSBkb3VibGVfZm9ybWF0OwotCX0KLQllbHNlIGlmIChzdHJjbXAocywgImZsb2F0IikgPT0gMCkgewotCQlyID0gZmxvYXRfZm9ybWF0OwotCX0KLQllbHNlIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJIl9fZ2V0Zm9ybWF0X18oKSBhcmd1bWVudCAxIG11c3QgYmUgIgotCQkJCSInZG91YmxlJyBvciAnZmxvYXQnIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQkKLQlzd2l0Y2ggKHIpIHsKLQljYXNlIHVua25vd25fZm9ybWF0OgotCQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZygidW5rbm93biIpOwotCWNhc2UgaWVlZV9saXR0bGVfZW5kaWFuX2Zvcm1hdDoKLQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoIklFRUUsIGxpdHRsZS1lbmRpYW4iKTsKLQljYXNlIGllZWVfYmlnX2VuZGlhbl9mb3JtYXQ6Ci0JCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKCJJRUVFLCBiaWctZW5kaWFuIik7Ci0JZGVmYXVsdDoKLQkJUHlfRmF0YWxFcnJvcigiaW5zYW5lIGZsb2F0X2Zvcm1hdCBvciBkb3VibGVfZm9ybWF0Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoIVB5U3RyaW5nX0NoZWNrKGFyZykpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICJfX2dldGZvcm1hdF9fKCkgYXJndW1lbnQgbXVzdCBiZSBzdHJpbmcsIG5vdCAlLjUwMHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5X1RZUEUoYXJnKS0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBzID0gUHlTdHJpbmdfQVNfU1RSSU5HKGFyZyk7CisgICAgaWYgKHN0cmNtcChzLCAiZG91YmxlIikgPT0gMCkgeworICAgICAgICByID0gZG91YmxlX2Zvcm1hdDsKKyAgICB9CisgICAgZWxzZSBpZiAoc3RyY21wKHMsICJmbG9hdCIpID09IDApIHsKKyAgICAgICAgciA9IGZsb2F0X2Zvcm1hdDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIl9fZ2V0Zm9ybWF0X18oKSBhcmd1bWVudCAxIG11c3QgYmUgIgorICAgICAgICAgICAgICAgICAgICAgICAgIidkb3VibGUnIG9yICdmbG9hdCciKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgc3dpdGNoIChyKSB7CisgICAgY2FzZSB1bmtub3duX2Zvcm1hdDoKKyAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoInVua25vd24iKTsKKyAgICBjYXNlIGllZWVfbGl0dGxlX2VuZGlhbl9mb3JtYXQ6CisgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKCJJRUVFLCBsaXR0bGUtZW5kaWFuIik7CisgICAgY2FzZSBpZWVlX2JpZ19lbmRpYW5fZm9ybWF0OgorICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZygiSUVFRSwgYmlnLWVuZGlhbiIpOworICAgIGRlZmF1bHQ6CisgICAgICAgIFB5X0ZhdGFsRXJyb3IoImluc2FuZSBmbG9hdF9mb3JtYXQgb3IgZG91YmxlX2Zvcm1hdCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiB9CiAKIFB5RG9jX1NUUlZBUihmbG9hdF9nZXRmb3JtYXRfZG9jLApAQCAtMTc0OSw1NyArMTc0OSw1NyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGZsb2F0X3NldGZvcm1hdChQeVR5cGVPYmplY3QgKnYsIFB5T2JqZWN0KiBhcmdzKQogewotCWNoYXIqIHR5cGVzdHI7Ci0JY2hhciogZm9ybWF0OwotCWZsb2F0X2Zvcm1hdF90eXBlIGY7Ci0JZmxvYXRfZm9ybWF0X3R5cGUgZGV0ZWN0ZWQ7Ci0JZmxvYXRfZm9ybWF0X3R5cGUgKnA7CisgICAgY2hhciogdHlwZXN0cjsKKyAgICBjaGFyKiBmb3JtYXQ7CisgICAgZmxvYXRfZm9ybWF0X3R5cGUgZjsKKyAgICBmbG9hdF9mb3JtYXRfdHlwZSBkZXRlY3RlZDsKKyAgICBmbG9hdF9mb3JtYXRfdHlwZSAqcDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic3M6X19zZXRmb3JtYXRfXyIsICZ0eXBlc3RyLCAmZm9ybWF0KSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzczpfX3NldGZvcm1hdF9fIiwgJnR5cGVzdHIsICZmb3JtYXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChzdHJjbXAodHlwZXN0ciwgImRvdWJsZSIpID09IDApIHsKLQkJcCA9ICZkb3VibGVfZm9ybWF0OwotCQlkZXRlY3RlZCA9IGRldGVjdGVkX2RvdWJsZV9mb3JtYXQ7Ci0JfQotCWVsc2UgaWYgKHN0cmNtcCh0eXBlc3RyLCAiZmxvYXQiKSA9PSAwKSB7Ci0JCXAgPSAmZmxvYXRfZm9ybWF0OwotCQlkZXRlY3RlZCA9IGRldGVjdGVkX2Zsb2F0X2Zvcm1hdDsKLQl9Ci0JZWxzZSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJfX3NldGZvcm1hdF9fKCkgYXJndW1lbnQgMSBtdXN0ICIKLQkJCQkiYmUgJ2RvdWJsZScgb3IgJ2Zsb2F0JyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JCi0JaWYgKHN0cmNtcChmb3JtYXQsICJ1bmtub3duIikgPT0gMCkgewotCQlmID0gdW5rbm93bl9mb3JtYXQ7Ci0JfQotCWVsc2UgaWYgKHN0cmNtcChmb3JtYXQsICJJRUVFLCBsaXR0bGUtZW5kaWFuIikgPT0gMCkgewotCQlmID0gaWVlZV9saXR0bGVfZW5kaWFuX2Zvcm1hdDsKLQl9Ci0JZWxzZSBpZiAoc3RyY21wKGZvcm1hdCwgIklFRUUsIGJpZy1lbmRpYW4iKSA9PSAwKSB7Ci0JCWYgPSBpZWVlX2JpZ19lbmRpYW5fZm9ybWF0OwotCX0KLQllbHNlIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJIl9fc2V0Zm9ybWF0X18oKSBhcmd1bWVudCAyIG11c3QgYmUgIgotCQkJCSIndW5rbm93bicsICdJRUVFLCBsaXR0bGUtZW5kaWFuJyBvciAiCi0JCQkJIidJRUVFLCBiaWctZW5kaWFuJyIpOwotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoc3RyY21wKHR5cGVzdHIsICJkb3VibGUiKSA9PSAwKSB7CisgICAgICAgIHAgPSAmZG91YmxlX2Zvcm1hdDsKKyAgICAgICAgZGV0ZWN0ZWQgPSBkZXRlY3RlZF9kb3VibGVfZm9ybWF0OworICAgIH0KKyAgICBlbHNlIGlmIChzdHJjbXAodHlwZXN0ciwgImZsb2F0IikgPT0gMCkgeworICAgICAgICBwID0gJmZsb2F0X2Zvcm1hdDsKKyAgICAgICAgZGV0ZWN0ZWQgPSBkZXRlY3RlZF9mbG9hdF9mb3JtYXQ7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJfX3NldGZvcm1hdF9fKCkgYXJndW1lbnQgMSBtdXN0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJiZSAnZG91YmxlJyBvciAnZmxvYXQnIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCX0KKyAgICBpZiAoc3RyY21wKGZvcm1hdCwgInVua25vd24iKSA9PSAwKSB7CisgICAgICAgIGYgPSB1bmtub3duX2Zvcm1hdDsKKyAgICB9CisgICAgZWxzZSBpZiAoc3RyY21wKGZvcm1hdCwgIklFRUUsIGxpdHRsZS1lbmRpYW4iKSA9PSAwKSB7CisgICAgICAgIGYgPSBpZWVlX2xpdHRsZV9lbmRpYW5fZm9ybWF0OworICAgIH0KKyAgICBlbHNlIGlmIChzdHJjbXAoZm9ybWF0LCAiSUVFRSwgYmlnLWVuZGlhbiIpID09IDApIHsKKyAgICAgICAgZiA9IGllZWVfYmlnX2VuZGlhbl9mb3JtYXQ7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJfX3NldGZvcm1hdF9fKCkgYXJndW1lbnQgMiBtdXN0IGJlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICIndW5rbm93bicsICdJRUVFLCBsaXR0bGUtZW5kaWFuJyBvciAiCisgICAgICAgICAgICAgICAgICAgICAgICAiJ0lFRUUsIGJpZy1lbmRpYW4nIik7CisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKGYgIT0gdW5rbm93bl9mb3JtYXQgJiYgZiAhPSBkZXRlY3RlZCkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKLQkJCSAgICAgImNhbiBvbmx5IHNldCAlcyBmb3JtYXQgdG8gJ3Vua25vd24nIG9yIHRoZSAiCi0JCQkgICAgICJkZXRlY3RlZCBwbGF0Zm9ybSB2YWx1ZSIsIHR5cGVzdHIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgfQogCi0JKnAgPSBmOwotCVB5X1JFVFVSTl9OT05FOworICAgIGlmIChmICE9IHVua25vd25fZm9ybWF0ICYmIGYgIT0gZGV0ZWN0ZWQpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiY2FuIG9ubHkgc2V0ICVzIGZvcm1hdCB0byAndW5rbm93bicgb3IgdGhlICIKKyAgICAgICAgICAgICAgICAgICAgICJkZXRlY3RlZCBwbGF0Zm9ybSB2YWx1ZSIsIHR5cGVzdHIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAqcCA9IGY7CisgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKIFB5RG9jX1NUUlZBUihmbG9hdF9zZXRmb3JtYXRfZG9jLApAQCAtMTgxOCwzNyArMTgxOCwzNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGZsb2F0X2dldHplcm8oUHlPYmplY3QgKnYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZSgwLjApOworICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoMC4wKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZsb2F0X19mb3JtYXRfXyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKmZvcm1hdF9zcGVjOworICAgIFB5T2JqZWN0ICpmb3JtYXRfc3BlYzsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTzpfX2Zvcm1hdF9fIiwgJmZvcm1hdF9zcGVjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKFB5Qnl0ZXNfQ2hlY2soZm9ybWF0X3NwZWMpKQotCQlyZXR1cm4gX1B5RmxvYXRfRm9ybWF0QWR2YW5jZWQoc2VsZiwKLQkJCQkJICAgICAgIFB5Qnl0ZXNfQVNfU1RSSU5HKGZvcm1hdF9zcGVjKSwKLQkJCQkJICAgICAgIFB5Qnl0ZXNfR0VUX1NJWkUoZm9ybWF0X3NwZWMpKTsKLQlpZiAoUHlVbmljb2RlX0NoZWNrKGZvcm1hdF9zcGVjKSkgewotCQkvKiBDb252ZXJ0IGZvcm1hdF9zcGVjIHRvIGEgc3RyICovCi0JCVB5T2JqZWN0ICpyZXN1bHQ7Ci0JCVB5T2JqZWN0ICpzdHJfc3BlYyA9IFB5T2JqZWN0X1N0cihmb3JtYXRfc3BlYyk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPOl9fZm9ybWF0X18iLCAmZm9ybWF0X3NwZWMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoUHlCeXRlc19DaGVjayhmb3JtYXRfc3BlYykpCisgICAgICAgIHJldHVybiBfUHlGbG9hdF9Gb3JtYXRBZHZhbmNlZChzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlCeXRlc19BU19TVFJJTkcoZm9ybWF0X3NwZWMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlCeXRlc19HRVRfU0laRShmb3JtYXRfc3BlYykpOworICAgIGlmIChQeVVuaWNvZGVfQ2hlY2soZm9ybWF0X3NwZWMpKSB7CisgICAgICAgIC8qIENvbnZlcnQgZm9ybWF0X3NwZWMgdG8gYSBzdHIgKi8KKyAgICAgICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICAgICAgUHlPYmplY3QgKnN0cl9zcGVjID0gUHlPYmplY3RfU3RyKGZvcm1hdF9zcGVjKTsKIAotCQlpZiAoc3RyX3NwZWMgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOworICAgICAgICBpZiAoc3RyX3NwZWMgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogCi0JCXJlc3VsdCA9IF9QeUZsb2F0X0Zvcm1hdEFkdmFuY2VkKHNlbGYsCi0JCQkJCQkgUHlCeXRlc19BU19TVFJJTkcoc3RyX3NwZWMpLAotCQkJCQkJIFB5Qnl0ZXNfR0VUX1NJWkUoc3RyX3NwZWMpKTsKKyAgICAgICAgcmVzdWx0ID0gX1B5RmxvYXRfRm9ybWF0QWR2YW5jZWQoc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlCeXRlc19BU19TVFJJTkcoc3RyX3NwZWMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUJ5dGVzX0dFVF9TSVpFKHN0cl9zcGVjKSk7CiAKLQkJUHlfREVDUkVGKHN0cl9zcGVjKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIl9fZm9ybWF0X18gcmVxdWlyZXMgc3RyIG9yIHVuaWNvZGUiKTsKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgUHlfREVDUkVGKHN0cl9zcGVjKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIl9fZm9ybWF0X18gcmVxdWlyZXMgc3RyIG9yIHVuaWNvZGUiKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogUHlEb2NfU1RSVkFSKGZsb2F0X19mb3JtYXRfX2RvYywKQEAgLTE4NTgsNDIgKzE4NTgsNDIgQEAKIAogCiBzdGF0aWMgUHlNZXRob2REZWYgZmxvYXRfbWV0aG9kc1tdID0gewotCXsiY29uanVnYXRlIiwJKFB5Q0Z1bmN0aW9uKWZsb2F0X2Zsb2F0LAlNRVRIX05PQVJHUywKLQkgIlJldHVybnMgc2VsZiwgdGhlIGNvbXBsZXggY29uanVnYXRlIG9mIGFueSBmbG9hdC4ifSwKLQl7Il9fdHJ1bmNfXyIsCShQeUNGdW5jdGlvbilmbG9hdF90cnVuYywgTUVUSF9OT0FSR1MsCi0gICAgICAgICAiUmV0dXJucyB0aGUgSW50ZWdyYWwgY2xvc2VzdCB0byB4IGJldHdlZW4gMCBhbmQgeC4ifSwKLQl7ImFzX2ludGVnZXJfcmF0aW8iLCAoUHlDRnVuY3Rpb24pZmxvYXRfYXNfaW50ZWdlcl9yYXRpbywgTUVUSF9OT0FSR1MsCi0JIGZsb2F0X2FzX2ludGVnZXJfcmF0aW9fZG9jfSwKLQl7ImZyb21oZXgiLCAoUHlDRnVuY3Rpb24pZmxvYXRfZnJvbWhleCwKLQkgTUVUSF9PfE1FVEhfQ0xBU1MsIGZsb2F0X2Zyb21oZXhfZG9jfSwKLQl7ImhleCIsIChQeUNGdW5jdGlvbilmbG9hdF9oZXgsCi0JIE1FVEhfTk9BUkdTLCBmbG9hdF9oZXhfZG9jfSwKLQl7ImlzX2ludGVnZXIiLAkoUHlDRnVuY3Rpb24pZmxvYXRfaXNfaW50ZWdlciwJTUVUSF9OT0FSR1MsCi0JICJSZXR1cm5zIFRydWUgaWYgdGhlIGZsb2F0IGlzIGFuIGludGVnZXIuIn0sCisgICAgeyJjb25qdWdhdGUiLCAgICAgICAoUHlDRnVuY3Rpb24pZmxvYXRfZmxvYXQsICAgICAgIE1FVEhfTk9BUkdTLAorICAgICAiUmV0dXJucyBzZWxmLCB0aGUgY29tcGxleCBjb25qdWdhdGUgb2YgYW55IGZsb2F0LiJ9LAorICAgIHsiX190cnVuY19fIiwgICAgICAgKFB5Q0Z1bmN0aW9uKWZsb2F0X3RydW5jLCBNRVRIX05PQVJHUywKKyAgICAgIlJldHVybnMgdGhlIEludGVncmFsIGNsb3Nlc3QgdG8geCBiZXR3ZWVuIDAgYW5kIHguIn0sCisgICAgeyJhc19pbnRlZ2VyX3JhdGlvIiwgKFB5Q0Z1bmN0aW9uKWZsb2F0X2FzX2ludGVnZXJfcmF0aW8sIE1FVEhfTk9BUkdTLAorICAgICBmbG9hdF9hc19pbnRlZ2VyX3JhdGlvX2RvY30sCisgICAgeyJmcm9taGV4IiwgKFB5Q0Z1bmN0aW9uKWZsb2F0X2Zyb21oZXgsCisgICAgIE1FVEhfT3xNRVRIX0NMQVNTLCBmbG9hdF9mcm9taGV4X2RvY30sCisgICAgeyJoZXgiLCAoUHlDRnVuY3Rpb24pZmxvYXRfaGV4LAorICAgICBNRVRIX05PQVJHUywgZmxvYXRfaGV4X2RvY30sCisgICAgeyJpc19pbnRlZ2VyIiwgICAgICAoUHlDRnVuY3Rpb24pZmxvYXRfaXNfaW50ZWdlciwgIE1FVEhfTk9BUkdTLAorICAgICAiUmV0dXJucyBUcnVlIGlmIHRoZSBmbG9hdCBpcyBhbiBpbnRlZ2VyLiJ9LAogI2lmIDAKLQl7ImlzX2luZiIsCShQeUNGdW5jdGlvbilmbG9hdF9pc19pbmYsCU1FVEhfTk9BUkdTLAotCSAiUmV0dXJucyBUcnVlIGlmIHRoZSBmbG9hdCBpcyBwb3NpdGl2ZSBvciBuZWdhdGl2ZSBpbmZpbml0ZS4ifSwKLQl7ImlzX2Zpbml0ZSIsCShQeUNGdW5jdGlvbilmbG9hdF9pc19maW5pdGUsCU1FVEhfTk9BUkdTLAotCSAiUmV0dXJucyBUcnVlIGlmIHRoZSBmbG9hdCBpcyBmaW5pdGUsIG5laXRoZXIgaW5maW5pdGUgbm9yIE5hTi4ifSwKLQl7ImlzX25hbiIsCShQeUNGdW5jdGlvbilmbG9hdF9pc19uYW4sCU1FVEhfTk9BUkdTLAotCSAiUmV0dXJucyBUcnVlIGlmIHRoZSBmbG9hdCBpcyBub3QgYSBudW1iZXIgKE5hTikuIn0sCisgICAgeyJpc19pbmYiLCAgICAgICAgICAoUHlDRnVuY3Rpb24pZmxvYXRfaXNfaW5mLCAgICAgIE1FVEhfTk9BUkdTLAorICAgICAiUmV0dXJucyBUcnVlIGlmIHRoZSBmbG9hdCBpcyBwb3NpdGl2ZSBvciBuZWdhdGl2ZSBpbmZpbml0ZS4ifSwKKyAgICB7ImlzX2Zpbml0ZSIsICAgICAgIChQeUNGdW5jdGlvbilmbG9hdF9pc19maW5pdGUsICAgTUVUSF9OT0FSR1MsCisgICAgICJSZXR1cm5zIFRydWUgaWYgdGhlIGZsb2F0IGlzIGZpbml0ZSwgbmVpdGhlciBpbmZpbml0ZSBub3IgTmFOLiJ9LAorICAgIHsiaXNfbmFuIiwgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWZsb2F0X2lzX25hbiwgICAgICBNRVRIX05PQVJHUywKKyAgICAgIlJldHVybnMgVHJ1ZSBpZiB0aGUgZmxvYXQgaXMgbm90IGEgbnVtYmVyIChOYU4pLiJ9LAogI2VuZGlmCi0JeyJfX2dldG5ld2FyZ3NfXyIsCShQeUNGdW5jdGlvbilmbG9hdF9nZXRuZXdhcmdzLAlNRVRIX05PQVJHU30sCi0JeyJfX2dldGZvcm1hdF9fIiwJKFB5Q0Z1bmN0aW9uKWZsb2F0X2dldGZvcm1hdCwJCi0JIE1FVEhfT3xNRVRIX0NMQVNTLAkJZmxvYXRfZ2V0Zm9ybWF0X2RvY30sCi0JeyJfX3NldGZvcm1hdF9fIiwJKFB5Q0Z1bmN0aW9uKWZsb2F0X3NldGZvcm1hdCwJCi0JIE1FVEhfVkFSQVJHU3xNRVRIX0NMQVNTLAlmbG9hdF9zZXRmb3JtYXRfZG9jfSwKLSAgICAgICAgeyJfX2Zvcm1hdF9fIiwgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWZsb2F0X19mb3JtYXRfXywKLSAgICAgICAgIE1FVEhfVkFSQVJHUywgICAgICAgICAgICAgICAgICBmbG9hdF9fZm9ybWF0X19kb2N9LAotCXtOVUxMLAkJTlVMTH0JCS8qIHNlbnRpbmVsICovCisgICAgeyJfX2dldG5ld2FyZ3NfXyIsICAgICAgICAgIChQeUNGdW5jdGlvbilmbG9hdF9nZXRuZXdhcmdzLCAgTUVUSF9OT0FSR1N9LAorICAgIHsiX19nZXRmb3JtYXRfXyIsICAgICAgICAgICAoUHlDRnVuY3Rpb24pZmxvYXRfZ2V0Zm9ybWF0LAorICAgICBNRVRIX098TUVUSF9DTEFTUywgICAgICAgICAgICAgICAgIGZsb2F0X2dldGZvcm1hdF9kb2N9LAorICAgIHsiX19zZXRmb3JtYXRfXyIsICAgICAgICAgICAoUHlDRnVuY3Rpb24pZmxvYXRfc2V0Zm9ybWF0LAorICAgICBNRVRIX1ZBUkFSR1N8TUVUSF9DTEFTUywgICAgICAgICAgIGZsb2F0X3NldGZvcm1hdF9kb2N9LAorICAgIHsiX19mb3JtYXRfXyIsICAgICAgICAgIChQeUNGdW5jdGlvbilmbG9hdF9fZm9ybWF0X18sCisgICAgIE1FVEhfVkFSQVJHUywgICAgICAgICAgICAgICAgICBmbG9hdF9fZm9ybWF0X19kb2N9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiBzdGF0aWMgUHlHZXRTZXREZWYgZmxvYXRfZ2V0c2V0W10gPSB7Ci0gICAgeyJyZWFsIiwgCisgICAgeyJyZWFsIiwKICAgICAgKGdldHRlcilmbG9hdF9mbG9hdCwgKHNldHRlcilOVUxMLAogICAgICAidGhlIHJlYWwgcGFydCBvZiBhIGNvbXBsZXggbnVtYmVyIiwKICAgICAgTlVMTH0sCi0gICAgeyJpbWFnIiwgCisgICAgeyJpbWFnIiwKICAgICAgKGdldHRlcilmbG9hdF9nZXR6ZXJvLCAoc2V0dGVyKU5VTEwsCiAgICAgICJ0aGUgaW1hZ2luYXJ5IHBhcnQgb2YgYSBjb21wbGV4IG51bWJlciIsCiAgICAgIE5VTEx9LApAQCAtMTkwNywyMjkgKzE5MDcsMjI5IEBACiAKIAogc3RhdGljIFB5TnVtYmVyTWV0aG9kcyBmbG9hdF9hc19udW1iZXIgPSB7Ci0JZmxvYXRfYWRkLCAJLypuYl9hZGQqLwotCWZsb2F0X3N1YiwgCS8qbmJfc3VidHJhY3QqLwotCWZsb2F0X211bCwgCS8qbmJfbXVsdGlwbHkqLwotCWZsb2F0X2NsYXNzaWNfZGl2LCAvKm5iX2RpdmlkZSovCi0JZmxvYXRfcmVtLCAJLypuYl9yZW1haW5kZXIqLwotCWZsb2F0X2Rpdm1vZCwgCS8qbmJfZGl2bW9kKi8KLQlmbG9hdF9wb3csIAkvKm5iX3Bvd2VyKi8KLQkodW5hcnlmdW5jKWZsb2F0X25lZywgLypuYl9uZWdhdGl2ZSovCi0JKHVuYXJ5ZnVuYylmbG9hdF9mbG9hdCwgLypuYl9wb3NpdGl2ZSovCi0JKHVuYXJ5ZnVuYylmbG9hdF9hYnMsIC8qbmJfYWJzb2x1dGUqLwotCShpbnF1aXJ5KWZsb2F0X25vbnplcm8sIC8qbmJfbm9uemVybyovCi0JMCwJCS8qbmJfaW52ZXJ0Ki8KLQkwLAkJLypuYl9sc2hpZnQqLwotCTAsCQkvKm5iX3JzaGlmdCovCi0JMCwJCS8qbmJfYW5kKi8KLQkwLAkJLypuYl94b3IqLwotCTAsCQkvKm5iX29yKi8KLQlmbG9hdF9jb2VyY2UsIAkvKm5iX2NvZXJjZSovCi0JZmxvYXRfdHJ1bmMsIAkvKm5iX2ludCovCi0JZmxvYXRfbG9uZywgCS8qbmJfbG9uZyovCi0JZmxvYXRfZmxvYXQsCS8qbmJfZmxvYXQqLwotCTAsCQkvKiBuYl9vY3QgKi8KLQkwLAkJLyogbmJfaGV4ICovCi0JMCwJCS8qIG5iX2lucGxhY2VfYWRkICovCi0JMCwJCS8qIG5iX2lucGxhY2Vfc3VidHJhY3QgKi8KLQkwLAkJLyogbmJfaW5wbGFjZV9tdWx0aXBseSAqLwotCTAsCQkvKiBuYl9pbnBsYWNlX2RpdmlkZSAqLwotCTAsCQkvKiBuYl9pbnBsYWNlX3JlbWFpbmRlciAqLwotCTAsIAkJLyogbmJfaW5wbGFjZV9wb3dlciAqLwotCTAsCQkvKiBuYl9pbnBsYWNlX2xzaGlmdCAqLwotCTAsCQkvKiBuYl9pbnBsYWNlX3JzaGlmdCAqLwotCTAsCQkvKiBuYl9pbnBsYWNlX2FuZCAqLwotCTAsCQkvKiBuYl9pbnBsYWNlX3hvciAqLwotCTAsCQkvKiBuYl9pbnBsYWNlX29yICovCi0JZmxvYXRfZmxvb3JfZGl2LCAvKiBuYl9mbG9vcl9kaXZpZGUgKi8KLQlmbG9hdF9kaXYsCS8qIG5iX3RydWVfZGl2aWRlICovCi0JMCwJCS8qIG5iX2lucGxhY2VfZmxvb3JfZGl2aWRlICovCi0JMCwJCS8qIG5iX2lucGxhY2VfdHJ1ZV9kaXZpZGUgKi8KKyAgICBmbG9hdF9hZGQsICAgICAgICAgIC8qbmJfYWRkKi8KKyAgICBmbG9hdF9zdWIsICAgICAgICAgIC8qbmJfc3VidHJhY3QqLworICAgIGZsb2F0X211bCwgICAgICAgICAgLypuYl9tdWx0aXBseSovCisgICAgZmxvYXRfY2xhc3NpY19kaXYsIC8qbmJfZGl2aWRlKi8KKyAgICBmbG9hdF9yZW0sICAgICAgICAgIC8qbmJfcmVtYWluZGVyKi8KKyAgICBmbG9hdF9kaXZtb2QsICAgICAgIC8qbmJfZGl2bW9kKi8KKyAgICBmbG9hdF9wb3csICAgICAgICAgIC8qbmJfcG93ZXIqLworICAgICh1bmFyeWZ1bmMpZmxvYXRfbmVnLCAvKm5iX25lZ2F0aXZlKi8KKyAgICAodW5hcnlmdW5jKWZsb2F0X2Zsb2F0LCAvKm5iX3Bvc2l0aXZlKi8KKyAgICAodW5hcnlmdW5jKWZsb2F0X2FicywgLypuYl9hYnNvbHV0ZSovCisgICAgKGlucXVpcnkpZmxvYXRfbm9uemVybywgLypuYl9ub256ZXJvKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qbmJfaW52ZXJ0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qbmJfbHNoaWZ0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qbmJfcnNoaWZ0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qbmJfYW5kKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qbmJfeG9yKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qbmJfb3IqLworICAgIGZsb2F0X2NvZXJjZSwgICAgICAgLypuYl9jb2VyY2UqLworICAgIGZsb2F0X3RydW5jLCAgICAgICAgLypuYl9pbnQqLworICAgIGZsb2F0X2xvbmcsICAgICAgICAgLypuYl9sb25nKi8KKyAgICBmbG9hdF9mbG9hdCwgICAgICAgIC8qbmJfZmxvYXQqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyogbmJfb2N0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKiBuYl9oZXggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qIG5iX2lucGxhY2VfYWRkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKiBuYl9pbnBsYWNlX3N1YnRyYWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKiBuYl9pbnBsYWNlX211bHRpcGx5ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKiBuYl9pbnBsYWNlX2RpdmlkZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyogbmJfaW5wbGFjZV9yZW1haW5kZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qIG5iX2lucGxhY2VfcG93ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qIG5iX2lucGxhY2VfbHNoaWZ0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKiBuYl9pbnBsYWNlX3JzaGlmdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyogbmJfaW5wbGFjZV9hbmQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qIG5iX2lucGxhY2VfeG9yICovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKiBuYl9pbnBsYWNlX29yICovCisgICAgZmxvYXRfZmxvb3JfZGl2LCAvKiBuYl9mbG9vcl9kaXZpZGUgKi8KKyAgICBmbG9hdF9kaXYsICAgICAgICAgIC8qIG5iX3RydWVfZGl2aWRlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKiBuYl9pbnBsYWNlX2Zsb29yX2RpdmlkZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyogbmJfaW5wbGFjZV90cnVlX2RpdmlkZSAqLwogfTsKIAogUHlUeXBlT2JqZWN0IFB5RmxvYXRfVHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQotCSJmbG9hdCIsCi0Jc2l6ZW9mKFB5RmxvYXRPYmplY3QpLAotCTAsCi0JKGRlc3RydWN0b3IpZmxvYXRfZGVhbGxvYywJCS8qIHRwX2RlYWxsb2MgKi8KLQkocHJpbnRmdW5jKWZsb2F0X3ByaW50LCAJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJIAkJLyogdHBfY29tcGFyZSAqLwotCShyZXByZnVuYylmbG9hdF9yZXByLAkJCS8qIHRwX3JlcHIgKi8KLQkmZmxvYXRfYXNfbnVtYmVyLAkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JKGhhc2hmdW5jKWZsb2F0X2hhc2gsCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCQkvKiB0cF9jYWxsICovCi0JKHJlcHJmdW5jKWZsb2F0X3N0ciwJCQkvKiB0cF9zdHIgKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfQ0hFQ0tUWVBFUyB8Ci0JCVB5X1RQRkxBR1NfQkFTRVRZUEUsCQkvKiB0cF9mbGFncyAqLwotCWZsb2F0X2RvYywJCQkJLyogdHBfZG9jICovCi0gCTAsCQkJCQkvKiB0cF90cmF2ZXJzZSAqLwotCTAsCQkJCQkvKiB0cF9jbGVhciAqLwotCWZsb2F0X3JpY2hjb21wYXJlLAkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkJLyogdHBfaXRlcm5leHQgKi8KLQlmbG9hdF9tZXRob2RzLAkJCQkvKiB0cF9tZXRob2RzICovCi0JMCwJCQkJCS8qIHRwX21lbWJlcnMgKi8KLQlmbG9hdF9nZXRzZXQsCQkJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJCS8qIHRwX2RpY3QgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2luaXQgKi8KLQkwLAkJCQkJLyogdHBfYWxsb2MgKi8KLQlmbG9hdF9uZXcsCQkJCS8qIHRwX25ldyAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCisgICAgImZsb2F0IiwKKyAgICBzaXplb2YoUHlGbG9hdE9iamVjdCksCisgICAgMCwKKyAgICAoZGVzdHJ1Y3RvcilmbG9hdF9kZWFsbG9jLCAgICAgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAocHJpbnRmdW5jKWZsb2F0X3ByaW50LCAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgKHJlcHJmdW5jKWZsb2F0X3JlcHIsICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgJmZsb2F0X2FzX251bWJlciwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKWZsb2F0X2hhc2gsICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgKHJlcHJmdW5jKWZsb2F0X3N0ciwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19DSEVDS1RZUEVTIHwKKyAgICAgICAgUHlfVFBGTEFHU19CQVNFVFlQRSwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCisgICAgZmxvYXRfZG9jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIGZsb2F0X3JpY2hjb21wYXJlLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIGZsb2F0X21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIGZsb2F0X2dldHNldCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBmbG9hdF9uZXcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLwogfTsKIAogdm9pZAogX1B5RmxvYXRfSW5pdCh2b2lkKQogewotCS8qIFdlIGF0dGVtcHQgdG8gZGV0ZXJtaW5lIGlmIHRoaXMgbWFjaGluZSBpcyB1c2luZyBJRUVFCi0JICAgZmxvYXRpbmcgcG9pbnQgZm9ybWF0cyBieSBwZWVyaW5nIGF0IHRoZSBiaXRzIG9mIHNvbWUKLQkgICBjYXJlZnVsbHkgY2hvc2VuIHZhbHVlcy4gIElmIGl0IGxvb2tzIGxpa2Ugd2UgYXJlIG9uIGFuCi0JICAgSUVFRSBwbGF0Zm9ybSwgdGhlIGZsb2F0IHBhY2tpbmcvdW5wYWNraW5nIHJvdXRpbmVzIGNhbgotCSAgIGp1c3QgY29weSBiaXRzLCBpZiBub3QgdGhleSByZXNvcnQgdG8gYXJpdGhtZXRpYyAmIHNoaWZ0cwotCSAgIGFuZCBtYXNrcy4gIFRoZSBzaGlmdHMgJiBtYXNrcyBhcHByb2FjaCB3b3JrcyBvbiBhbGwgZmluaXRlCi0JICAgdmFsdWVzLCBidXQgd2hhdCBoYXBwZW5zIHRvIGluZmluaXRpZXMsIE5hTnMgYW5kIHNpZ25lZAotCSAgIHplcm9lcyBvbiBwYWNraW5nIGlzIGFuIGFjY2lkZW50LCBhbmQgYXR0ZW1wdGluZyB0byB1bnBhY2sKLQkgICBhIE5hTiBvciBhbiBpbmZpbml0eSB3aWxsIHJhaXNlIGFuIGV4Y2VwdGlvbi4KKyAgICAvKiBXZSBhdHRlbXB0IHRvIGRldGVybWluZSBpZiB0aGlzIG1hY2hpbmUgaXMgdXNpbmcgSUVFRQorICAgICAgIGZsb2F0aW5nIHBvaW50IGZvcm1hdHMgYnkgcGVlcmluZyBhdCB0aGUgYml0cyBvZiBzb21lCisgICAgICAgY2FyZWZ1bGx5IGNob3NlbiB2YWx1ZXMuICBJZiBpdCBsb29rcyBsaWtlIHdlIGFyZSBvbiBhbgorICAgICAgIElFRUUgcGxhdGZvcm0sIHRoZSBmbG9hdCBwYWNraW5nL3VucGFja2luZyByb3V0aW5lcyBjYW4KKyAgICAgICBqdXN0IGNvcHkgYml0cywgaWYgbm90IHRoZXkgcmVzb3J0IHRvIGFyaXRobWV0aWMgJiBzaGlmdHMKKyAgICAgICBhbmQgbWFza3MuICBUaGUgc2hpZnRzICYgbWFza3MgYXBwcm9hY2ggd29ya3Mgb24gYWxsIGZpbml0ZQorICAgICAgIHZhbHVlcywgYnV0IHdoYXQgaGFwcGVucyB0byBpbmZpbml0aWVzLCBOYU5zIGFuZCBzaWduZWQKKyAgICAgICB6ZXJvZXMgb24gcGFja2luZyBpcyBhbiBhY2NpZGVudCwgYW5kIGF0dGVtcHRpbmcgdG8gdW5wYWNrCisgICAgICAgYSBOYU4gb3IgYW4gaW5maW5pdHkgd2lsbCByYWlzZSBhbiBleGNlcHRpb24uCiAKLQkgICBOb3RlIHRoYXQgaWYgd2UncmUgb24gc29tZSB3aGFja2VkLW91dCBwbGF0Zm9ybSB3aGljaCB1c2VzCi0JICAgSUVFRSBmb3JtYXRzIGJ1dCBpc24ndCBzdHJpY3RseSBsaXR0bGUtZW5kaWFuIG9yIGJpZy0KLQkgICBlbmRpYW4sIHdlIHdpbGwgZmFsbCBiYWNrIHRvIHRoZSBwb3J0YWJsZSBzaGlmdHMgJiBtYXNrcwotCSAgIG1ldGhvZC4gKi8KKyAgICAgICBOb3RlIHRoYXQgaWYgd2UncmUgb24gc29tZSB3aGFja2VkLW91dCBwbGF0Zm9ybSB3aGljaCB1c2VzCisgICAgICAgSUVFRSBmb3JtYXRzIGJ1dCBpc24ndCBzdHJpY3RseSBsaXR0bGUtZW5kaWFuIG9yIGJpZy0KKyAgICAgICBlbmRpYW4sIHdlIHdpbGwgZmFsbCBiYWNrIHRvIHRoZSBwb3J0YWJsZSBzaGlmdHMgJiBtYXNrcworICAgICAgIG1ldGhvZC4gKi8KIAogI2lmIFNJWkVPRl9ET1VCTEUgPT0gOAotCXsKLQkJZG91YmxlIHggPSA5MDA2MTA0MDcxODMyNTgxLjA7Ci0JCWlmIChtZW1jbXAoJngsICJceDQzXHgzZlx4ZmZceDAxXHgwMlx4MDNceDA0XHgwNSIsIDgpID09IDApCi0JCQlkZXRlY3RlZF9kb3VibGVfZm9ybWF0ID0gaWVlZV9iaWdfZW5kaWFuX2Zvcm1hdDsKLQkJZWxzZSBpZiAobWVtY21wKCZ4LCAiXHgwNVx4MDRceDAzXHgwMlx4MDFceGZmXHgzZlx4NDMiLCA4KSA9PSAwKQotCQkJZGV0ZWN0ZWRfZG91YmxlX2Zvcm1hdCA9IGllZWVfbGl0dGxlX2VuZGlhbl9mb3JtYXQ7Ci0JCWVsc2UgCi0JCQlkZXRlY3RlZF9kb3VibGVfZm9ybWF0ID0gdW5rbm93bl9mb3JtYXQ7Ci0JfQorICAgIHsKKyAgICAgICAgZG91YmxlIHggPSA5MDA2MTA0MDcxODMyNTgxLjA7CisgICAgICAgIGlmIChtZW1jbXAoJngsICJceDQzXHgzZlx4ZmZceDAxXHgwMlx4MDNceDA0XHgwNSIsIDgpID09IDApCisgICAgICAgICAgICBkZXRlY3RlZF9kb3VibGVfZm9ybWF0ID0gaWVlZV9iaWdfZW5kaWFuX2Zvcm1hdDsKKyAgICAgICAgZWxzZSBpZiAobWVtY21wKCZ4LCAiXHgwNVx4MDRceDAzXHgwMlx4MDFceGZmXHgzZlx4NDMiLCA4KSA9PSAwKQorICAgICAgICAgICAgZGV0ZWN0ZWRfZG91YmxlX2Zvcm1hdCA9IGllZWVfbGl0dGxlX2VuZGlhbl9mb3JtYXQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGRldGVjdGVkX2RvdWJsZV9mb3JtYXQgPSB1bmtub3duX2Zvcm1hdDsKKyAgICB9CiAjZWxzZQotCWRldGVjdGVkX2RvdWJsZV9mb3JtYXQgPSB1bmtub3duX2Zvcm1hdDsKKyAgICBkZXRlY3RlZF9kb3VibGVfZm9ybWF0ID0gdW5rbm93bl9mb3JtYXQ7CiAjZW5kaWYKIAogI2lmIFNJWkVPRl9GTE9BVCA9PSA0Ci0JewotCQlmbG9hdCB5ID0gMTY3MTE5MzguMDsKLQkJaWYgKG1lbWNtcCgmeSwgIlx4NGJceDdmXHgwMVx4MDIiLCA0KSA9PSAwKQotCQkJZGV0ZWN0ZWRfZmxvYXRfZm9ybWF0ID0gaWVlZV9iaWdfZW5kaWFuX2Zvcm1hdDsKLQkJZWxzZSBpZiAobWVtY21wKCZ5LCAiXHgwMlx4MDFceDdmXHg0YiIsIDQpID09IDApCi0JCQlkZXRlY3RlZF9mbG9hdF9mb3JtYXQgPSBpZWVlX2xpdHRsZV9lbmRpYW5fZm9ybWF0OwotCQllbHNlIAotCQkJZGV0ZWN0ZWRfZmxvYXRfZm9ybWF0ID0gdW5rbm93bl9mb3JtYXQ7Ci0JfQorICAgIHsKKyAgICAgICAgZmxvYXQgeSA9IDE2NzExOTM4LjA7CisgICAgICAgIGlmIChtZW1jbXAoJnksICJceDRiXHg3Zlx4MDFceDAyIiwgNCkgPT0gMCkKKyAgICAgICAgICAgIGRldGVjdGVkX2Zsb2F0X2Zvcm1hdCA9IGllZWVfYmlnX2VuZGlhbl9mb3JtYXQ7CisgICAgICAgIGVsc2UgaWYgKG1lbWNtcCgmeSwgIlx4MDJceDAxXHg3Zlx4NGIiLCA0KSA9PSAwKQorICAgICAgICAgICAgZGV0ZWN0ZWRfZmxvYXRfZm9ybWF0ID0gaWVlZV9saXR0bGVfZW5kaWFuX2Zvcm1hdDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZGV0ZWN0ZWRfZmxvYXRfZm9ybWF0ID0gdW5rbm93bl9mb3JtYXQ7CisgICAgfQogI2Vsc2UKLQlkZXRlY3RlZF9mbG9hdF9mb3JtYXQgPSB1bmtub3duX2Zvcm1hdDsKKyAgICBkZXRlY3RlZF9mbG9hdF9mb3JtYXQgPSB1bmtub3duX2Zvcm1hdDsKICNlbmRpZgogCi0JZG91YmxlX2Zvcm1hdCA9IGRldGVjdGVkX2RvdWJsZV9mb3JtYXQ7Ci0JZmxvYXRfZm9ybWF0ID0gZGV0ZWN0ZWRfZmxvYXRfZm9ybWF0OworICAgIGRvdWJsZV9mb3JtYXQgPSBkZXRlY3RlZF9kb3VibGVfZm9ybWF0OworICAgIGZsb2F0X2Zvcm1hdCA9IGRldGVjdGVkX2Zsb2F0X2Zvcm1hdDsKIAotCS8qIEluaXQgZmxvYXQgaW5mbyAqLwotCWlmIChGbG9hdEluZm9UeXBlLnRwX25hbWUgPT0gMCkKLQkJUHlTdHJ1Y3RTZXF1ZW5jZV9Jbml0VHlwZSgmRmxvYXRJbmZvVHlwZSwgJmZsb2F0aW5mb19kZXNjKTsKKyAgICAvKiBJbml0IGZsb2F0IGluZm8gKi8KKyAgICBpZiAoRmxvYXRJbmZvVHlwZS50cF9uYW1lID09IDApCisgICAgICAgIFB5U3RydWN0U2VxdWVuY2VfSW5pdFR5cGUoJkZsb2F0SW5mb1R5cGUsICZmbG9hdGluZm9fZGVzYyk7CiB9CiAKIGludAogUHlGbG9hdF9DbGVhckZyZWVMaXN0KHZvaWQpCiB7Ci0JUHlGbG9hdE9iamVjdCAqcDsKLQlQeUZsb2F0QmxvY2sgKmxpc3QsICpuZXh0OwotCWludCBpOwotCWludCB1OwkJCS8qIHJlbWFpbmluZyB1bmZyZWVkIGludHMgcGVyIGJsb2NrICovCi0JaW50IGZyZWVsaXN0X3NpemUgPSAwOworICAgIFB5RmxvYXRPYmplY3QgKnA7CisgICAgUHlGbG9hdEJsb2NrICpsaXN0LCAqbmV4dDsKKyAgICBpbnQgaTsKKyAgICBpbnQgdTsgICAgICAgICAgICAgICAgICAgICAgLyogcmVtYWluaW5nIHVuZnJlZWQgaW50cyBwZXIgYmxvY2sgKi8KKyAgICBpbnQgZnJlZWxpc3Rfc2l6ZSA9IDA7CiAKLQlsaXN0ID0gYmxvY2tfbGlzdDsKLQlibG9ja19saXN0ID0gTlVMTDsKLQlmcmVlX2xpc3QgPSBOVUxMOwotCXdoaWxlIChsaXN0ICE9IE5VTEwpIHsKLQkJdSA9IDA7Ci0JCWZvciAoaSA9IDAsIHAgPSAmbGlzdC0+b2JqZWN0c1swXTsKLQkJICAgICBpIDwgTl9GTE9BVE9CSkVDVFM7Ci0JCSAgICAgaSsrLCBwKyspIHsKLQkJCWlmIChQeUZsb2F0X0NoZWNrRXhhY3QocCkgJiYgUHlfUkVGQ05UKHApICE9IDApCi0JCQkJdSsrOwotCQl9Ci0JCW5leHQgPSBsaXN0LT5uZXh0OwotCQlpZiAodSkgewotCQkJbGlzdC0+bmV4dCA9IGJsb2NrX2xpc3Q7Ci0JCQlibG9ja19saXN0ID0gbGlzdDsKLQkJCWZvciAoaSA9IDAsIHAgPSAmbGlzdC0+b2JqZWN0c1swXTsKLQkJCSAgICAgaSA8IE5fRkxPQVRPQkpFQ1RTOwotCQkJICAgICBpKyssIHArKykgewotCQkJCWlmICghUHlGbG9hdF9DaGVja0V4YWN0KHApIHx8Ci0JCQkJICAgIFB5X1JFRkNOVChwKSA9PSAwKSB7Ci0JCQkJCVB5X1RZUEUocCkgPSAoc3RydWN0IF90eXBlb2JqZWN0ICopCi0JCQkJCQlmcmVlX2xpc3Q7Ci0JCQkJCWZyZWVfbGlzdCA9IHA7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJUHlNZW1fRlJFRShsaXN0KTsKLQkJfQotCQlmcmVlbGlzdF9zaXplICs9IHU7Ci0JCWxpc3QgPSBuZXh0OwotCX0KLQlyZXR1cm4gZnJlZWxpc3Rfc2l6ZTsKKyAgICBsaXN0ID0gYmxvY2tfbGlzdDsKKyAgICBibG9ja19saXN0ID0gTlVMTDsKKyAgICBmcmVlX2xpc3QgPSBOVUxMOworICAgIHdoaWxlIChsaXN0ICE9IE5VTEwpIHsKKyAgICAgICAgdSA9IDA7CisgICAgICAgIGZvciAoaSA9IDAsIHAgPSAmbGlzdC0+b2JqZWN0c1swXTsKKyAgICAgICAgICAgICBpIDwgTl9GTE9BVE9CSkVDVFM7CisgICAgICAgICAgICAgaSsrLCBwKyspIHsKKyAgICAgICAgICAgIGlmIChQeUZsb2F0X0NoZWNrRXhhY3QocCkgJiYgUHlfUkVGQ05UKHApICE9IDApCisgICAgICAgICAgICAgICAgdSsrOworICAgICAgICB9CisgICAgICAgIG5leHQgPSBsaXN0LT5uZXh0OworICAgICAgICBpZiAodSkgeworICAgICAgICAgICAgbGlzdC0+bmV4dCA9IGJsb2NrX2xpc3Q7CisgICAgICAgICAgICBibG9ja19saXN0ID0gbGlzdDsKKyAgICAgICAgICAgIGZvciAoaSA9IDAsIHAgPSAmbGlzdC0+b2JqZWN0c1swXTsKKyAgICAgICAgICAgICAgICAgaSA8IE5fRkxPQVRPQkpFQ1RTOworICAgICAgICAgICAgICAgICBpKyssIHArKykgeworICAgICAgICAgICAgICAgIGlmICghUHlGbG9hdF9DaGVja0V4YWN0KHApIHx8CisgICAgICAgICAgICAgICAgICAgIFB5X1JFRkNOVChwKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIFB5X1RZUEUocCkgPSAoc3RydWN0IF90eXBlb2JqZWN0ICopCisgICAgICAgICAgICAgICAgICAgICAgICBmcmVlX2xpc3Q7CisgICAgICAgICAgICAgICAgICAgIGZyZWVfbGlzdCA9IHA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgUHlNZW1fRlJFRShsaXN0KTsKKyAgICAgICAgfQorICAgICAgICBmcmVlbGlzdF9zaXplICs9IHU7CisgICAgICAgIGxpc3QgPSBuZXh0OworICAgIH0KKyAgICByZXR1cm4gZnJlZWxpc3Rfc2l6ZTsKIH0KIAogdm9pZAogUHlGbG9hdF9GaW5pKHZvaWQpCiB7Ci0JUHlGbG9hdE9iamVjdCAqcDsKLQlQeUZsb2F0QmxvY2sgKmxpc3Q7Ci0JaW50IGk7Ci0JaW50IHU7CQkJLyogdG90YWwgdW5mcmVlZCBmbG9hdHMgcGVyIGJsb2NrICovCisgICAgUHlGbG9hdE9iamVjdCAqcDsKKyAgICBQeUZsb2F0QmxvY2sgKmxpc3Q7CisgICAgaW50IGk7CisgICAgaW50IHU7ICAgICAgICAgICAgICAgICAgICAgIC8qIHRvdGFsIHVuZnJlZWQgZmxvYXRzIHBlciBibG9jayAqLwogCi0JdSA9IFB5RmxvYXRfQ2xlYXJGcmVlTGlzdCgpOworICAgIHUgPSBQeUZsb2F0X0NsZWFyRnJlZUxpc3QoKTsKIAotCWlmICghUHlfVmVyYm9zZUZsYWcpCi0JCXJldHVybjsKLQlmcHJpbnRmKHN0ZGVyciwgIiMgY2xlYW51cCBmbG9hdHMiKTsKLQlpZiAoIXUpIHsKLQkJZnByaW50ZihzdGRlcnIsICJcbiIpOwotCX0KLQllbHNlIHsKLQkJZnByaW50ZihzdGRlcnIsCi0JCQkiOiAlZCB1bmZyZWVkIGZsb2F0JXNcbiIsCi0JCQl1LCB1ID09IDEgPyAiIiA6ICJzIik7Ci0JfQotCWlmIChQeV9WZXJib3NlRmxhZyA+IDEpIHsKLQkJbGlzdCA9IGJsb2NrX2xpc3Q7Ci0JCXdoaWxlIChsaXN0ICE9IE5VTEwpIHsKLQkJCWZvciAoaSA9IDAsIHAgPSAmbGlzdC0+b2JqZWN0c1swXTsKLQkJCSAgICAgaSA8IE5fRkxPQVRPQkpFQ1RTOwotCQkJICAgICBpKyssIHArKykgewotCQkJCWlmIChQeUZsb2F0X0NoZWNrRXhhY3QocCkgJiYKLQkJCQkgICAgUHlfUkVGQ05UKHApICE9IDApIHsKLQkJCQkJY2hhciBidWZbMTAwXTsKLQkJCQkJUHlGbG9hdF9Bc1N0cmluZyhidWYsIHApOwotCQkJCQkvKiBYWFgodHdvdXRlcnMpIGNhc3QgcmVmY291bnQgdG8KLQkJCQkJICAgbG9uZyB1bnRpbCAlemQgaXMgdW5pdmVyc2FsbHkKLQkJCQkJICAgYXZhaWxhYmxlCi0JCQkJCSAqLwotCQkJCQlmcHJpbnRmKHN0ZGVyciwKLQkJCSAgICAgIiMgICA8ZmxvYXQgYXQgJXAsIHJlZmNudD0lbGQsIHZhbD0lcz5cbiIsCi0JCQkJCQlwLCAobG9uZylQeV9SRUZDTlQocCksIGJ1Zik7Ci0JCQkJfQotCQkJfQotCQkJbGlzdCA9IGxpc3QtPm5leHQ7Ci0JCX0KLQl9CisgICAgaWYgKCFQeV9WZXJib3NlRmxhZykKKyAgICAgICAgcmV0dXJuOworICAgIGZwcmludGYoc3RkZXJyLCAiIyBjbGVhbnVwIGZsb2F0cyIpOworICAgIGlmICghdSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICI6ICVkIHVuZnJlZWQgZmxvYXQlc1xuIiwKKyAgICAgICAgICAgIHUsIHUgPT0gMSA/ICIiIDogInMiKTsKKyAgICB9CisgICAgaWYgKFB5X1ZlcmJvc2VGbGFnID4gMSkgeworICAgICAgICBsaXN0ID0gYmxvY2tfbGlzdDsKKyAgICAgICAgd2hpbGUgKGxpc3QgIT0gTlVMTCkgeworICAgICAgICAgICAgZm9yIChpID0gMCwgcCA9ICZsaXN0LT5vYmplY3RzWzBdOworICAgICAgICAgICAgICAgICBpIDwgTl9GTE9BVE9CSkVDVFM7CisgICAgICAgICAgICAgICAgIGkrKywgcCsrKSB7CisgICAgICAgICAgICAgICAgaWYgKFB5RmxvYXRfQ2hlY2tFeGFjdChwKSAmJgorICAgICAgICAgICAgICAgICAgICBQeV9SRUZDTlQocCkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBjaGFyIGJ1ZlsxMDBdOworICAgICAgICAgICAgICAgICAgICBQeUZsb2F0X0FzU3RyaW5nKGJ1ZiwgcCk7CisgICAgICAgICAgICAgICAgICAgIC8qIFhYWCh0d291dGVycykgY2FzdCByZWZjb3VudCB0bworICAgICAgICAgICAgICAgICAgICAgICBsb25nIHVudGlsICV6ZCBpcyB1bml2ZXJzYWxseQorICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGUKKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgICAgICAiIyAgIDxmbG9hdCBhdCAlcCwgcmVmY250PSVsZCwgdmFsPSVzPlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAsIChsb25nKVB5X1JFRkNOVChwKSwgYnVmKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsaXN0ID0gbGlzdC0+bmV4dDsKKyAgICAgICAgfQorICAgIH0KIH0KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0yMTM4LDQwNiArMjEzOCw0MDYgQEAKIGludAogX1B5RmxvYXRfUGFjazQoZG91YmxlIHgsIHVuc2lnbmVkIGNoYXIgKnAsIGludCBsZSkKIHsKLQlpZiAoZmxvYXRfZm9ybWF0ID09IHVua25vd25fZm9ybWF0KSB7Ci0JCXVuc2lnbmVkIGNoYXIgc2lnbjsKLQkJaW50IGU7Ci0JCWRvdWJsZSBmOwotCQl1bnNpZ25lZCBpbnQgZmJpdHM7Ci0JCWludCBpbmNyID0gMTsKKyAgICBpZiAoZmxvYXRfZm9ybWF0ID09IHVua25vd25fZm9ybWF0KSB7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgc2lnbjsKKyAgICAgICAgaW50IGU7CisgICAgICAgIGRvdWJsZSBmOworICAgICAgICB1bnNpZ25lZCBpbnQgZmJpdHM7CisgICAgICAgIGludCBpbmNyID0gMTsKIAotCQlpZiAobGUpIHsKLQkJCXAgKz0gMzsKLQkJCWluY3IgPSAtMTsKLQkJfQorICAgICAgICBpZiAobGUpIHsKKyAgICAgICAgICAgIHAgKz0gMzsKKyAgICAgICAgICAgIGluY3IgPSAtMTsKKyAgICAgICAgfQogCi0JCWlmICh4IDwgMCkgewotCQkJc2lnbiA9IDE7Ci0JCQl4ID0gLXg7Ci0JCX0KLQkJZWxzZQotCQkJc2lnbiA9IDA7CisgICAgICAgIGlmICh4IDwgMCkgeworICAgICAgICAgICAgc2lnbiA9IDE7CisgICAgICAgICAgICB4ID0gLXg7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc2lnbiA9IDA7CiAKLQkJZiA9IGZyZXhwKHgsICZlKTsKKyAgICAgICAgZiA9IGZyZXhwKHgsICZlKTsKIAotCQkvKiBOb3JtYWxpemUgZiB0byBiZSBpbiB0aGUgcmFuZ2UgWzEuMCwgMi4wKSAqLwotCQlpZiAoMC41IDw9IGYgJiYgZiA8IDEuMCkgewotCQkJZiAqPSAyLjA7Ci0JCQllLS07Ci0JCX0KLQkJZWxzZSBpZiAoZiA9PSAwLjApCi0JCQllID0gMDsKLQkJZWxzZSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCi0JCQkJCSJmcmV4cCgpIHJlc3VsdCBvdXQgb2YgcmFuZ2UiKTsKLQkJCXJldHVybiAtMTsKLQkJfQorICAgICAgICAvKiBOb3JtYWxpemUgZiB0byBiZSBpbiB0aGUgcmFuZ2UgWzEuMCwgMi4wKSAqLworICAgICAgICBpZiAoMC41IDw9IGYgJiYgZiA8IDEuMCkgeworICAgICAgICAgICAgZiAqPSAyLjA7CisgICAgICAgICAgICBlLS07CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoZiA9PSAwLjApCisgICAgICAgICAgICBlID0gMDsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZyZXhwKCkgcmVzdWx0IG91dCBvZiByYW5nZSIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CiAKLQkJaWYgKGUgPj0gMTI4KQotCQkJZ290byBPdmVyZmxvdzsKLQkJZWxzZSBpZiAoZSA8IC0xMjYpIHsKLQkJCS8qIEdyYWR1YWwgdW5kZXJmbG93ICovCi0JCQlmID0gbGRleHAoZiwgMTI2ICsgZSk7Ci0JCQllID0gMDsKLQkJfQotCQllbHNlIGlmICghKGUgPT0gMCAmJiBmID09IDAuMCkpIHsKLQkJCWUgKz0gMTI3OwotCQkJZiAtPSAxLjA7IC8qIEdldCByaWQgb2YgbGVhZGluZyAxICovCi0JCX0KKyAgICAgICAgaWYgKGUgPj0gMTI4KQorICAgICAgICAgICAgZ290byBPdmVyZmxvdzsKKyAgICAgICAgZWxzZSBpZiAoZSA8IC0xMjYpIHsKKyAgICAgICAgICAgIC8qIEdyYWR1YWwgdW5kZXJmbG93ICovCisgICAgICAgICAgICBmID0gbGRleHAoZiwgMTI2ICsgZSk7CisgICAgICAgICAgICBlID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICghKGUgPT0gMCAmJiBmID09IDAuMCkpIHsKKyAgICAgICAgICAgIGUgKz0gMTI3OworICAgICAgICAgICAgZiAtPSAxLjA7IC8qIEdldCByaWQgb2YgbGVhZGluZyAxICovCisgICAgICAgIH0KIAotCQlmICo9IDgzODg2MDguMDsgLyogMioqMjMgKi8KLQkJZmJpdHMgPSAodW5zaWduZWQgaW50KShmICsgMC41KTsgLyogUm91bmQgKi8KLQkJYXNzZXJ0KGZiaXRzIDw9IDgzODg2MDgpOwotCQlpZiAoZmJpdHMgPj4gMjMpIHsKLQkJCS8qIFRoZSBjYXJyeSBwcm9wYWdhdGVkIG91dCBvZiBhIHN0cmluZyBvZiAyMyAxIGJpdHMuICovCi0JCQlmYml0cyA9IDA7Ci0JCQkrK2U7Ci0JCQlpZiAoZSA+PSAyNTUpCi0JCQkJZ290byBPdmVyZmxvdzsKLQkJfQorICAgICAgICBmICo9IDgzODg2MDguMDsgLyogMioqMjMgKi8KKyAgICAgICAgZmJpdHMgPSAodW5zaWduZWQgaW50KShmICsgMC41KTsgLyogUm91bmQgKi8KKyAgICAgICAgYXNzZXJ0KGZiaXRzIDw9IDgzODg2MDgpOworICAgICAgICBpZiAoZmJpdHMgPj4gMjMpIHsKKyAgICAgICAgICAgIC8qIFRoZSBjYXJyeSBwcm9wYWdhdGVkIG91dCBvZiBhIHN0cmluZyBvZiAyMyAxIGJpdHMuICovCisgICAgICAgICAgICBmYml0cyA9IDA7CisgICAgICAgICAgICArK2U7CisgICAgICAgICAgICBpZiAoZSA+PSAyNTUpCisgICAgICAgICAgICAgICAgZ290byBPdmVyZmxvdzsKKyAgICAgICAgfQogCi0JCS8qIEZpcnN0IGJ5dGUgKi8KLQkJKnAgPSAoc2lnbiA8PCA3KSB8IChlID4+IDEpOwotCQlwICs9IGluY3I7CisgICAgICAgIC8qIEZpcnN0IGJ5dGUgKi8KKyAgICAgICAgKnAgPSAoc2lnbiA8PCA3KSB8IChlID4+IDEpOworICAgICAgICBwICs9IGluY3I7CiAKLQkJLyogU2Vjb25kIGJ5dGUgKi8KLQkJKnAgPSAoY2hhcikgKCgoZSAmIDEpIDw8IDcpIHwgKGZiaXRzID4+IDE2KSk7Ci0JCXAgKz0gaW5jcjsKKyAgICAgICAgLyogU2Vjb25kIGJ5dGUgKi8KKyAgICAgICAgKnAgPSAoY2hhcikgKCgoZSAmIDEpIDw8IDcpIHwgKGZiaXRzID4+IDE2KSk7CisgICAgICAgIHAgKz0gaW5jcjsKIAotCQkvKiBUaGlyZCBieXRlICovCi0JCSpwID0gKGZiaXRzID4+IDgpICYgMHhGRjsKLQkJcCArPSBpbmNyOworICAgICAgICAvKiBUaGlyZCBieXRlICovCisgICAgICAgICpwID0gKGZiaXRzID4+IDgpICYgMHhGRjsKKyAgICAgICAgcCArPSBpbmNyOwogCi0JCS8qIEZvdXJ0aCBieXRlICovCi0JCSpwID0gZmJpdHMgJiAweEZGOworICAgICAgICAvKiBGb3VydGggYnl0ZSAqLworICAgICAgICAqcCA9IGZiaXRzICYgMHhGRjsKIAotCQkvKiBEb25lICovCi0JCXJldHVybiAwOworICAgICAgICAvKiBEb25lICovCisgICAgICAgIHJldHVybiAwOwogCi0JfQotCWVsc2UgewotCQlmbG9hdCB5ID0gKGZsb2F0KXg7Ci0JCWNvbnN0IGNoYXIgKnMgPSAoY2hhciopJnk7Ci0JCWludCBpLCBpbmNyID0gMTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGZsb2F0IHkgPSAoZmxvYXQpeDsKKyAgICAgICAgY29uc3QgY2hhciAqcyA9IChjaGFyKikmeTsKKyAgICAgICAgaW50IGksIGluY3IgPSAxOwogCi0JCWlmIChQeV9JU19JTkZJTklUWSh5KSAmJiAhUHlfSVNfSU5GSU5JVFkoeCkpCi0JCQlnb3RvIE92ZXJmbG93OworICAgICAgICBpZiAoUHlfSVNfSU5GSU5JVFkoeSkgJiYgIVB5X0lTX0lORklOSVRZKHgpKQorICAgICAgICAgICAgZ290byBPdmVyZmxvdzsKIAotCQlpZiAoKGZsb2F0X2Zvcm1hdCA9PSBpZWVlX2xpdHRsZV9lbmRpYW5fZm9ybWF0ICYmICFsZSkKLQkJICAgIHx8IChmbG9hdF9mb3JtYXQgPT0gaWVlZV9iaWdfZW5kaWFuX2Zvcm1hdCAmJiBsZSkpIHsKLQkJCXAgKz0gMzsKLQkJCWluY3IgPSAtMTsKLQkJfQorICAgICAgICBpZiAoKGZsb2F0X2Zvcm1hdCA9PSBpZWVlX2xpdHRsZV9lbmRpYW5fZm9ybWF0ICYmICFsZSkKKyAgICAgICAgICAgIHx8IChmbG9hdF9mb3JtYXQgPT0gaWVlZV9iaWdfZW5kaWFuX2Zvcm1hdCAmJiBsZSkpIHsKKyAgICAgICAgICAgIHAgKz0gMzsKKyAgICAgICAgICAgIGluY3IgPSAtMTsKKyAgICAgICAgfQogCi0JCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKLQkJCSpwID0gKnMrKzsKLQkJCXAgKz0gaW5jcjsKLQkJfQotCQlyZXR1cm4gMDsKLQl9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgICAgICpwID0gKnMrKzsKKyAgICAgICAgICAgIHAgKz0gaW5jcjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAgIE92ZXJmbG93OgotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJImZsb2F0IHRvbyBsYXJnZSB0byBwYWNrIHdpdGggZiBmb3JtYXQiKTsKLQlyZXR1cm4gLTE7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICJmbG9hdCB0b28gbGFyZ2UgdG8gcGFjayB3aXRoIGYgZm9ybWF0Iik7CisgICAgcmV0dXJuIC0xOwogfQogCiBpbnQKIF9QeUZsb2F0X1BhY2s4KGRvdWJsZSB4LCB1bnNpZ25lZCBjaGFyICpwLCBpbnQgbGUpCiB7Ci0JaWYgKGRvdWJsZV9mb3JtYXQgPT0gdW5rbm93bl9mb3JtYXQpIHsKLQkJdW5zaWduZWQgY2hhciBzaWduOwotCQlpbnQgZTsKLQkJZG91YmxlIGY7Ci0JCXVuc2lnbmVkIGludCBmaGksIGZsbzsKLQkJaW50IGluY3IgPSAxOworICAgIGlmIChkb3VibGVfZm9ybWF0ID09IHVua25vd25fZm9ybWF0KSB7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgc2lnbjsKKyAgICAgICAgaW50IGU7CisgICAgICAgIGRvdWJsZSBmOworICAgICAgICB1bnNpZ25lZCBpbnQgZmhpLCBmbG87CisgICAgICAgIGludCBpbmNyID0gMTsKIAotCQlpZiAobGUpIHsKLQkJCXAgKz0gNzsKLQkJCWluY3IgPSAtMTsKLQkJfQorICAgICAgICBpZiAobGUpIHsKKyAgICAgICAgICAgIHAgKz0gNzsKKyAgICAgICAgICAgIGluY3IgPSAtMTsKKyAgICAgICAgfQogCi0JCWlmICh4IDwgMCkgewotCQkJc2lnbiA9IDE7Ci0JCQl4ID0gLXg7Ci0JCX0KLQkJZWxzZQotCQkJc2lnbiA9IDA7CisgICAgICAgIGlmICh4IDwgMCkgeworICAgICAgICAgICAgc2lnbiA9IDE7CisgICAgICAgICAgICB4ID0gLXg7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc2lnbiA9IDA7CiAKLQkJZiA9IGZyZXhwKHgsICZlKTsKKyAgICAgICAgZiA9IGZyZXhwKHgsICZlKTsKIAotCQkvKiBOb3JtYWxpemUgZiB0byBiZSBpbiB0aGUgcmFuZ2UgWzEuMCwgMi4wKSAqLwotCQlpZiAoMC41IDw9IGYgJiYgZiA8IDEuMCkgewotCQkJZiAqPSAyLjA7Ci0JCQllLS07Ci0JCX0KLQkJZWxzZSBpZiAoZiA9PSAwLjApCi0JCQllID0gMDsKLQkJZWxzZSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCi0JCQkJCSJmcmV4cCgpIHJlc3VsdCBvdXQgb2YgcmFuZ2UiKTsKLQkJCXJldHVybiAtMTsKLQkJfQorICAgICAgICAvKiBOb3JtYWxpemUgZiB0byBiZSBpbiB0aGUgcmFuZ2UgWzEuMCwgMi4wKSAqLworICAgICAgICBpZiAoMC41IDw9IGYgJiYgZiA8IDEuMCkgeworICAgICAgICAgICAgZiAqPSAyLjA7CisgICAgICAgICAgICBlLS07CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoZiA9PSAwLjApCisgICAgICAgICAgICBlID0gMDsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZyZXhwKCkgcmVzdWx0IG91dCBvZiByYW5nZSIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CiAKLQkJaWYgKGUgPj0gMTAyNCkKLQkJCWdvdG8gT3ZlcmZsb3c7Ci0JCWVsc2UgaWYgKGUgPCAtMTAyMikgewotCQkJLyogR3JhZHVhbCB1bmRlcmZsb3cgKi8KLQkJCWYgPSBsZGV4cChmLCAxMDIyICsgZSk7Ci0JCQllID0gMDsKLQkJfQotCQllbHNlIGlmICghKGUgPT0gMCAmJiBmID09IDAuMCkpIHsKLQkJCWUgKz0gMTAyMzsKLQkJCWYgLT0gMS4wOyAvKiBHZXQgcmlkIG9mIGxlYWRpbmcgMSAqLwotCQl9CisgICAgICAgIGlmIChlID49IDEwMjQpCisgICAgICAgICAgICBnb3RvIE92ZXJmbG93OworICAgICAgICBlbHNlIGlmIChlIDwgLTEwMjIpIHsKKyAgICAgICAgICAgIC8qIEdyYWR1YWwgdW5kZXJmbG93ICovCisgICAgICAgICAgICBmID0gbGRleHAoZiwgMTAyMiArIGUpOworICAgICAgICAgICAgZSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIShlID09IDAgJiYgZiA9PSAwLjApKSB7CisgICAgICAgICAgICBlICs9IDEwMjM7CisgICAgICAgICAgICBmIC09IDEuMDsgLyogR2V0IHJpZCBvZiBsZWFkaW5nIDEgKi8KKyAgICAgICAgfQogCi0JCS8qIGZoaSByZWNlaXZlcyB0aGUgaGlnaCAyOCBiaXRzOyBmbG8gdGhlIGxvdyAyNCBiaXRzICg9PSA1MiBiaXRzKSAqLwotCQlmICo9IDI2ODQzNTQ1Ni4wOyAvKiAyKioyOCAqLwotCQlmaGkgPSAodW5zaWduZWQgaW50KWY7IC8qIFRydW5jYXRlICovCi0JCWFzc2VydChmaGkgPCAyNjg0MzU0NTYpOworICAgICAgICAvKiBmaGkgcmVjZWl2ZXMgdGhlIGhpZ2ggMjggYml0czsgZmxvIHRoZSBsb3cgMjQgYml0cyAoPT0gNTIgYml0cykgKi8KKyAgICAgICAgZiAqPSAyNjg0MzU0NTYuMDsgLyogMioqMjggKi8KKyAgICAgICAgZmhpID0gKHVuc2lnbmVkIGludClmOyAvKiBUcnVuY2F0ZSAqLworICAgICAgICBhc3NlcnQoZmhpIDwgMjY4NDM1NDU2KTsKIAotCQlmIC09IChkb3VibGUpZmhpOwotCQlmICo9IDE2Nzc3MjE2LjA7IC8qIDIqKjI0ICovCi0JCWZsbyA9ICh1bnNpZ25lZCBpbnQpKGYgKyAwLjUpOyAvKiBSb3VuZCAqLwotCQlhc3NlcnQoZmxvIDw9IDE2Nzc3MjE2KTsKLQkJaWYgKGZsbyA+PiAyNCkgewotCQkJLyogVGhlIGNhcnJ5IHByb3BhZ2F0ZWQgb3V0IG9mIGEgc3RyaW5nIG9mIDI0IDEgYml0cy4gKi8KLQkJCWZsbyA9IDA7Ci0JCQkrK2ZoaTsKLQkJCWlmIChmaGkgPj4gMjgpIHsKLQkJCQkvKiBBbmQgaXQgYWxzbyBwcm9nYWdhdGVkIG91dCBvZiB0aGUgbmV4dCAyOCBiaXRzLiAqLwotCQkJCWZoaSA9IDA7Ci0JCQkJKytlOwotCQkJCWlmIChlID49IDIwNDcpCi0JCQkJCWdvdG8gT3ZlcmZsb3c7Ci0JCQl9Ci0JCX0KKyAgICAgICAgZiAtPSAoZG91YmxlKWZoaTsKKyAgICAgICAgZiAqPSAxNjc3NzIxNi4wOyAvKiAyKioyNCAqLworICAgICAgICBmbG8gPSAodW5zaWduZWQgaW50KShmICsgMC41KTsgLyogUm91bmQgKi8KKyAgICAgICAgYXNzZXJ0KGZsbyA8PSAxNjc3NzIxNik7CisgICAgICAgIGlmIChmbG8gPj4gMjQpIHsKKyAgICAgICAgICAgIC8qIFRoZSBjYXJyeSBwcm9wYWdhdGVkIG91dCBvZiBhIHN0cmluZyBvZiAyNCAxIGJpdHMuICovCisgICAgICAgICAgICBmbG8gPSAwOworICAgICAgICAgICAgKytmaGk7CisgICAgICAgICAgICBpZiAoZmhpID4+IDI4KSB7CisgICAgICAgICAgICAgICAgLyogQW5kIGl0IGFsc28gcHJvZ2FnYXRlZCBvdXQgb2YgdGhlIG5leHQgMjggYml0cy4gKi8KKyAgICAgICAgICAgICAgICBmaGkgPSAwOworICAgICAgICAgICAgICAgICsrZTsKKyAgICAgICAgICAgICAgICBpZiAoZSA+PSAyMDQ3KQorICAgICAgICAgICAgICAgICAgICBnb3RvIE92ZXJmbG93OworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJLyogRmlyc3QgYnl0ZSAqLwotCQkqcCA9IChzaWduIDw8IDcpIHwgKGUgPj4gNCk7Ci0JCXAgKz0gaW5jcjsKKyAgICAgICAgLyogRmlyc3QgYnl0ZSAqLworICAgICAgICAqcCA9IChzaWduIDw8IDcpIHwgKGUgPj4gNCk7CisgICAgICAgIHAgKz0gaW5jcjsKIAotCQkvKiBTZWNvbmQgYnl0ZSAqLwotCQkqcCA9ICh1bnNpZ25lZCBjaGFyKSAoKChlICYgMHhGKSA8PCA0KSB8IChmaGkgPj4gMjQpKTsKLQkJcCArPSBpbmNyOworICAgICAgICAvKiBTZWNvbmQgYnl0ZSAqLworICAgICAgICAqcCA9ICh1bnNpZ25lZCBjaGFyKSAoKChlICYgMHhGKSA8PCA0KSB8IChmaGkgPj4gMjQpKTsKKyAgICAgICAgcCArPSBpbmNyOwogCi0JCS8qIFRoaXJkIGJ5dGUgKi8KLQkJKnAgPSAoZmhpID4+IDE2KSAmIDB4RkY7Ci0JCXAgKz0gaW5jcjsKKyAgICAgICAgLyogVGhpcmQgYnl0ZSAqLworICAgICAgICAqcCA9IChmaGkgPj4gMTYpICYgMHhGRjsKKyAgICAgICAgcCArPSBpbmNyOwogCi0JCS8qIEZvdXJ0aCBieXRlICovCi0JCSpwID0gKGZoaSA+PiA4KSAmIDB4RkY7Ci0JCXAgKz0gaW5jcjsKKyAgICAgICAgLyogRm91cnRoIGJ5dGUgKi8KKyAgICAgICAgKnAgPSAoZmhpID4+IDgpICYgMHhGRjsKKyAgICAgICAgcCArPSBpbmNyOwogCi0JCS8qIEZpZnRoIGJ5dGUgKi8KLQkJKnAgPSBmaGkgJiAweEZGOwotCQlwICs9IGluY3I7CisgICAgICAgIC8qIEZpZnRoIGJ5dGUgKi8KKyAgICAgICAgKnAgPSBmaGkgJiAweEZGOworICAgICAgICBwICs9IGluY3I7CiAKLQkJLyogU2l4dGggYnl0ZSAqLwotCQkqcCA9IChmbG8gPj4gMTYpICYgMHhGRjsKLQkJcCArPSBpbmNyOworICAgICAgICAvKiBTaXh0aCBieXRlICovCisgICAgICAgICpwID0gKGZsbyA+PiAxNikgJiAweEZGOworICAgICAgICBwICs9IGluY3I7CiAKLQkJLyogU2V2ZW50aCBieXRlICovCi0JCSpwID0gKGZsbyA+PiA4KSAmIDB4RkY7Ci0JCXAgKz0gaW5jcjsKKyAgICAgICAgLyogU2V2ZW50aCBieXRlICovCisgICAgICAgICpwID0gKGZsbyA+PiA4KSAmIDB4RkY7CisgICAgICAgIHAgKz0gaW5jcjsKIAotCQkvKiBFaWdodGggYnl0ZSAqLwotCQkqcCA9IGZsbyAmIDB4RkY7Ci0JCXAgKz0gaW5jcjsKKyAgICAgICAgLyogRWlnaHRoIGJ5dGUgKi8KKyAgICAgICAgKnAgPSBmbG8gJiAweEZGOworICAgICAgICBwICs9IGluY3I7CiAKLQkJLyogRG9uZSAqLwotCQlyZXR1cm4gMDsKKyAgICAgICAgLyogRG9uZSAqLworICAgICAgICByZXR1cm4gMDsKIAotCSAgT3ZlcmZsb3c6Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJCSJmbG9hdCB0b28gbGFyZ2UgdG8gcGFjayB3aXRoIGQgZm9ybWF0Iik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JZWxzZSB7Ci0JCWNvbnN0IGNoYXIgKnMgPSAoY2hhciopJng7Ci0JCWludCBpLCBpbmNyID0gMTsKKyAgICAgIE92ZXJmbG93OgorICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJmbG9hdCB0b28gbGFyZ2UgdG8gcGFjayB3aXRoIGQgZm9ybWF0Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGNvbnN0IGNoYXIgKnMgPSAoY2hhciopJng7CisgICAgICAgIGludCBpLCBpbmNyID0gMTsKIAotCQlpZiAoKGRvdWJsZV9mb3JtYXQgPT0gaWVlZV9saXR0bGVfZW5kaWFuX2Zvcm1hdCAmJiAhbGUpCi0JCSAgICB8fCAoZG91YmxlX2Zvcm1hdCA9PSBpZWVlX2JpZ19lbmRpYW5fZm9ybWF0ICYmIGxlKSkgewotCQkJcCArPSA3OwotCQkJaW5jciA9IC0xOwotCQl9Ci0JCQotCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0JCQkqcCA9ICpzKys7Ci0JCQlwICs9IGluY3I7Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JfQorICAgICAgICBpZiAoKGRvdWJsZV9mb3JtYXQgPT0gaWVlZV9saXR0bGVfZW5kaWFuX2Zvcm1hdCAmJiAhbGUpCisgICAgICAgICAgICB8fCAoZG91YmxlX2Zvcm1hdCA9PSBpZWVlX2JpZ19lbmRpYW5fZm9ybWF0ICYmIGxlKSkgeworICAgICAgICAgICAgcCArPSA3OworICAgICAgICAgICAgaW5jciA9IC0xOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworICAgICAgICAgICAgKnAgPSAqcysrOworICAgICAgICAgICAgcCArPSBpbmNyOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KIH0KIAogZG91YmxlCiBfUHlGbG9hdF9VbnBhY2s0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnAsIGludCBsZSkKIHsKLQlpZiAoZmxvYXRfZm9ybWF0ID09IHVua25vd25fZm9ybWF0KSB7Ci0JCXVuc2lnbmVkIGNoYXIgc2lnbjsKLQkJaW50IGU7Ci0JCXVuc2lnbmVkIGludCBmOwotCQlkb3VibGUgeDsKLQkJaW50IGluY3IgPSAxOworICAgIGlmIChmbG9hdF9mb3JtYXQgPT0gdW5rbm93bl9mb3JtYXQpIHsKKyAgICAgICAgdW5zaWduZWQgY2hhciBzaWduOworICAgICAgICBpbnQgZTsKKyAgICAgICAgdW5zaWduZWQgaW50IGY7CisgICAgICAgIGRvdWJsZSB4OworICAgICAgICBpbnQgaW5jciA9IDE7CiAKLQkJaWYgKGxlKSB7Ci0JCQlwICs9IDM7Ci0JCQlpbmNyID0gLTE7Ci0JCX0KKyAgICAgICAgaWYgKGxlKSB7CisgICAgICAgICAgICBwICs9IDM7CisgICAgICAgICAgICBpbmNyID0gLTE7CisgICAgICAgIH0KIAotCQkvKiBGaXJzdCBieXRlICovCi0JCXNpZ24gPSAoKnAgPj4gNykgJiAxOwotCQllID0gKCpwICYgMHg3RikgPDwgMTsKLQkJcCArPSBpbmNyOworICAgICAgICAvKiBGaXJzdCBieXRlICovCisgICAgICAgIHNpZ24gPSAoKnAgPj4gNykgJiAxOworICAgICAgICBlID0gKCpwICYgMHg3RikgPDwgMTsKKyAgICAgICAgcCArPSBpbmNyOwogCi0JCS8qIFNlY29uZCBieXRlICovCi0JCWUgfD0gKCpwID4+IDcpICYgMTsKLQkJZiA9ICgqcCAmIDB4N0YpIDw8IDE2OwotCQlwICs9IGluY3I7CisgICAgICAgIC8qIFNlY29uZCBieXRlICovCisgICAgICAgIGUgfD0gKCpwID4+IDcpICYgMTsKKyAgICAgICAgZiA9ICgqcCAmIDB4N0YpIDw8IDE2OworICAgICAgICBwICs9IGluY3I7CiAKLQkJaWYgKGUgPT0gMjU1KSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoCi0JCQkJUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkiY2FuJ3QgdW5wYWNrIElFRUUgNzU0IHNwZWNpYWwgdmFsdWUgIgotCQkJCSJvbiBub24tSUVFRSBwbGF0Zm9ybSIpOwotCQkJcmV0dXJuIC0xOwotCQl9CisgICAgICAgIGlmIChlID09IDI1NSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKAorICAgICAgICAgICAgICAgIFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgImNhbid0IHVucGFjayBJRUVFIDc1NCBzcGVjaWFsIHZhbHVlICIKKyAgICAgICAgICAgICAgICAib24gbm9uLUlFRUUgcGxhdGZvcm0iKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQogCi0JCS8qIFRoaXJkIGJ5dGUgKi8KLQkJZiB8PSAqcCA8PCA4OwotCQlwICs9IGluY3I7CisgICAgICAgIC8qIFRoaXJkIGJ5dGUgKi8KKyAgICAgICAgZiB8PSAqcCA8PCA4OworICAgICAgICBwICs9IGluY3I7CiAKLQkJLyogRm91cnRoIGJ5dGUgKi8KLQkJZiB8PSAqcDsKKyAgICAgICAgLyogRm91cnRoIGJ5dGUgKi8KKyAgICAgICAgZiB8PSAqcDsKIAotCQl4ID0gKGRvdWJsZSlmIC8gODM4ODYwOC4wOworICAgICAgICB4ID0gKGRvdWJsZSlmIC8gODM4ODYwOC4wOwogCi0JCS8qIFhYWCBUaGlzIHNhZGx5IGlnbm9yZXMgSW5mL05hTiBpc3N1ZXMgKi8KLQkJaWYgKGUgPT0gMCkKLQkJCWUgPSAtMTI2OwotCQllbHNlIHsKLQkJCXggKz0gMS4wOwotCQkJZSAtPSAxMjc7Ci0JCX0KLQkJeCA9IGxkZXhwKHgsIGUpOworICAgICAgICAvKiBYWFggVGhpcyBzYWRseSBpZ25vcmVzIEluZi9OYU4gaXNzdWVzICovCisgICAgICAgIGlmIChlID09IDApCisgICAgICAgICAgICBlID0gLTEyNjsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICB4ICs9IDEuMDsKKyAgICAgICAgICAgIGUgLT0gMTI3OworICAgICAgICB9CisgICAgICAgIHggPSBsZGV4cCh4LCBlKTsKIAotCQlpZiAoc2lnbikKLQkJCXggPSAteDsKKyAgICAgICAgaWYgKHNpZ24pCisgICAgICAgICAgICB4ID0gLXg7CiAKLQkJcmV0dXJuIHg7Ci0JfQotCWVsc2UgewotCQlmbG9hdCB4OworICAgICAgICByZXR1cm4geDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGZsb2F0IHg7CiAKLQkJaWYgKChmbG9hdF9mb3JtYXQgPT0gaWVlZV9saXR0bGVfZW5kaWFuX2Zvcm1hdCAmJiAhbGUpCi0JCSAgICB8fCAoZmxvYXRfZm9ybWF0ID09IGllZWVfYmlnX2VuZGlhbl9mb3JtYXQgJiYgbGUpKSB7Ci0JCQljaGFyIGJ1Zls0XTsKLQkJCWNoYXIgKmQgPSAmYnVmWzNdOwotCQkJaW50IGk7CisgICAgICAgIGlmICgoZmxvYXRfZm9ybWF0ID09IGllZWVfbGl0dGxlX2VuZGlhbl9mb3JtYXQgJiYgIWxlKQorICAgICAgICAgICAgfHwgKGZsb2F0X2Zvcm1hdCA9PSBpZWVlX2JpZ19lbmRpYW5fZm9ybWF0ICYmIGxlKSkgeworICAgICAgICAgICAgY2hhciBidWZbNF07CisgICAgICAgICAgICBjaGFyICpkID0gJmJ1ZlszXTsKKyAgICAgICAgICAgIGludCBpOwogCi0JCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0JCQkJKmQtLSA9ICpwKys7Ci0JCQl9Ci0JCQltZW1jcHkoJngsIGJ1ZiwgNCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQltZW1jcHkoJngsIHAsIDQpOwotCQl9CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgICAgICAgICAgKmQtLSA9ICpwKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtZW1jcHkoJngsIGJ1ZiwgNCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBtZW1jcHkoJngsIHAsIDQpOworICAgICAgICB9CiAKLQkJcmV0dXJuIHg7Ci0JfQkJCisgICAgICAgIHJldHVybiB4OworICAgIH0KIH0KIAogZG91YmxlCiBfUHlGbG9hdF9VbnBhY2s4KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnAsIGludCBsZSkKIHsKLQlpZiAoZG91YmxlX2Zvcm1hdCA9PSB1bmtub3duX2Zvcm1hdCkgewotCQl1bnNpZ25lZCBjaGFyIHNpZ247Ci0JCWludCBlOwotCQl1bnNpZ25lZCBpbnQgZmhpLCBmbG87Ci0JCWRvdWJsZSB4OwotCQlpbnQgaW5jciA9IDE7CisgICAgaWYgKGRvdWJsZV9mb3JtYXQgPT0gdW5rbm93bl9mb3JtYXQpIHsKKyAgICAgICAgdW5zaWduZWQgY2hhciBzaWduOworICAgICAgICBpbnQgZTsKKyAgICAgICAgdW5zaWduZWQgaW50IGZoaSwgZmxvOworICAgICAgICBkb3VibGUgeDsKKyAgICAgICAgaW50IGluY3IgPSAxOwogCi0JCWlmIChsZSkgewotCQkJcCArPSA3OwotCQkJaW5jciA9IC0xOwotCQl9CisgICAgICAgIGlmIChsZSkgeworICAgICAgICAgICAgcCArPSA3OworICAgICAgICAgICAgaW5jciA9IC0xOworICAgICAgICB9CiAKLQkJLyogRmlyc3QgYnl0ZSAqLwotCQlzaWduID0gKCpwID4+IDcpICYgMTsKLQkJZSA9ICgqcCAmIDB4N0YpIDw8IDQ7Ci0JCQotCQlwICs9IGluY3I7CisgICAgICAgIC8qIEZpcnN0IGJ5dGUgKi8KKyAgICAgICAgc2lnbiA9ICgqcCA+PiA3KSAmIDE7CisgICAgICAgIGUgPSAoKnAgJiAweDdGKSA8PCA0OwogCi0JCS8qIFNlY29uZCBieXRlICovCi0JCWUgfD0gKCpwID4+IDQpICYgMHhGOwotCQlmaGkgPSAoKnAgJiAweEYpIDw8IDI0OwotCQlwICs9IGluY3I7CisgICAgICAgIHAgKz0gaW5jcjsKIAotCQlpZiAoZSA9PSAyMDQ3KSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoCi0JCQkJUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkiY2FuJ3QgdW5wYWNrIElFRUUgNzU0IHNwZWNpYWwgdmFsdWUgIgotCQkJCSJvbiBub24tSUVFRSBwbGF0Zm9ybSIpOwotCQkJcmV0dXJuIC0xLjA7Ci0JCX0KKyAgICAgICAgLyogU2Vjb25kIGJ5dGUgKi8KKyAgICAgICAgZSB8PSAoKnAgPj4gNCkgJiAweEY7CisgICAgICAgIGZoaSA9ICgqcCAmIDB4RikgPDwgMjQ7CisgICAgICAgIHAgKz0gaW5jcjsKIAotCQkvKiBUaGlyZCBieXRlICovCi0JCWZoaSB8PSAqcCA8PCAxNjsKLQkJcCArPSBpbmNyOworICAgICAgICBpZiAoZSA9PSAyMDQ3KSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAiY2FuJ3QgdW5wYWNrIElFRUUgNzU0IHNwZWNpYWwgdmFsdWUgIgorICAgICAgICAgICAgICAgICJvbiBub24tSUVFRSBwbGF0Zm9ybSIpOworICAgICAgICAgICAgcmV0dXJuIC0xLjA7CisgICAgICAgIH0KIAotCQkvKiBGb3VydGggYnl0ZSAqLwotCQlmaGkgfD0gKnAgIDw8IDg7Ci0JCXAgKz0gaW5jcjsKKyAgICAgICAgLyogVGhpcmQgYnl0ZSAqLworICAgICAgICBmaGkgfD0gKnAgPDwgMTY7CisgICAgICAgIHAgKz0gaW5jcjsKIAotCQkvKiBGaWZ0aCBieXRlICovCi0JCWZoaSB8PSAqcDsKLQkJcCArPSBpbmNyOworICAgICAgICAvKiBGb3VydGggYnl0ZSAqLworICAgICAgICBmaGkgfD0gKnAgIDw8IDg7CisgICAgICAgIHAgKz0gaW5jcjsKIAotCQkvKiBTaXh0aCBieXRlICovCi0JCWZsbyA9ICpwIDw8IDE2OwotCQlwICs9IGluY3I7CisgICAgICAgIC8qIEZpZnRoIGJ5dGUgKi8KKyAgICAgICAgZmhpIHw9ICpwOworICAgICAgICBwICs9IGluY3I7CiAKLQkJLyogU2V2ZW50aCBieXRlICovCi0JCWZsbyB8PSAqcCA8PCA4OwotCQlwICs9IGluY3I7CisgICAgICAgIC8qIFNpeHRoIGJ5dGUgKi8KKyAgICAgICAgZmxvID0gKnAgPDwgMTY7CisgICAgICAgIHAgKz0gaW5jcjsKIAotCQkvKiBFaWdodGggYnl0ZSAqLwotCQlmbG8gfD0gKnA7CisgICAgICAgIC8qIFNldmVudGggYnl0ZSAqLworICAgICAgICBmbG8gfD0gKnAgPDwgODsKKyAgICAgICAgcCArPSBpbmNyOwogCi0JCXggPSAoZG91YmxlKWZoaSArIChkb3VibGUpZmxvIC8gMTY3NzcyMTYuMDsgLyogMioqMjQgKi8KLQkJeCAvPSAyNjg0MzU0NTYuMDsgLyogMioqMjggKi8KKyAgICAgICAgLyogRWlnaHRoIGJ5dGUgKi8KKyAgICAgICAgZmxvIHw9ICpwOwogCi0JCWlmIChlID09IDApCi0JCQllID0gLTEwMjI7Ci0JCWVsc2UgewotCQkJeCArPSAxLjA7Ci0JCQllIC09IDEwMjM7Ci0JCX0KLQkJeCA9IGxkZXhwKHgsIGUpOworICAgICAgICB4ID0gKGRvdWJsZSlmaGkgKyAoZG91YmxlKWZsbyAvIDE2Nzc3MjE2LjA7IC8qIDIqKjI0ICovCisgICAgICAgIHggLz0gMjY4NDM1NDU2LjA7IC8qIDIqKjI4ICovCiAKLQkJaWYgKHNpZ24pCi0JCQl4ID0gLXg7CisgICAgICAgIGlmIChlID09IDApCisgICAgICAgICAgICBlID0gLTEwMjI7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgeCArPSAxLjA7CisgICAgICAgICAgICBlIC09IDEwMjM7CisgICAgICAgIH0KKyAgICAgICAgeCA9IGxkZXhwKHgsIGUpOwogCi0JCXJldHVybiB4OwotCX0KLQllbHNlIHsKLQkJZG91YmxlIHg7CisgICAgICAgIGlmIChzaWduKQorICAgICAgICAgICAgeCA9IC14OwogCi0JCWlmICgoZG91YmxlX2Zvcm1hdCA9PSBpZWVlX2xpdHRsZV9lbmRpYW5fZm9ybWF0ICYmICFsZSkKLQkJICAgIHx8IChkb3VibGVfZm9ybWF0ID09IGllZWVfYmlnX2VuZGlhbl9mb3JtYXQgJiYgbGUpKSB7Ci0JCQljaGFyIGJ1Zls4XTsKLQkJCWNoYXIgKmQgPSAmYnVmWzddOwotCQkJaW50IGk7Ci0JCQkKLQkJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKLQkJCQkqZC0tID0gKnArKzsKLQkJCX0KLQkJCW1lbWNweSgmeCwgYnVmLCA4KTsKLQkJfQotCQllbHNlIHsKLQkJCW1lbWNweSgmeCwgcCwgOCk7Ci0JCX0KKyAgICAgICAgcmV0dXJuIHg7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBkb3VibGUgeDsKIAotCQlyZXR1cm4geDsKLQl9CisgICAgICAgIGlmICgoZG91YmxlX2Zvcm1hdCA9PSBpZWVlX2xpdHRsZV9lbmRpYW5fZm9ybWF0ICYmICFsZSkKKyAgICAgICAgICAgIHx8IChkb3VibGVfZm9ybWF0ID09IGllZWVfYmlnX2VuZGlhbl9mb3JtYXQgJiYgbGUpKSB7CisgICAgICAgICAgICBjaGFyIGJ1Zls4XTsKKyAgICAgICAgICAgIGNoYXIgKmQgPSAmYnVmWzddOworICAgICAgICAgICAgaW50IGk7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKyAgICAgICAgICAgICAgICAqZC0tID0gKnArKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1lbWNweSgmeCwgYnVmLCA4KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIG1lbWNweSgmeCwgcCwgOCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4geDsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9PYmplY3RzL2ZyYW1lb2JqZWN0LmMgYi9PYmplY3RzL2ZyYW1lb2JqZWN0LmMKaW5kZXggZmE3YTZmZC4uMTEyMTEwYyAxMDA2NDQKLS0tIGEvT2JqZWN0cy9mcmFtZW9iamVjdC5jCisrKyBiL09iamVjdHMvZnJhbWVvYmplY3QuYwpAQCAtMTUsNDAgKzE1LDQwIEBACiAjZGVmaW5lIE9GRih4KSBvZmZzZXRvZihQeUZyYW1lT2JqZWN0LCB4KQogCiBzdGF0aWMgUHlNZW1iZXJEZWYgZnJhbWVfbWVtYmVybGlzdFtdID0gewotCXsiZl9iYWNrIiwJVF9PQkpFQ1QsCU9GRihmX2JhY2spLAlST30sCi0JeyJmX2NvZGUiLAlUX09CSkVDVCwJT0ZGKGZfY29kZSksCVJPfSwKLQl7ImZfYnVpbHRpbnMiLAlUX09CSkVDVCwJT0ZGKGZfYnVpbHRpbnMpLFJPfSwKLQl7ImZfZ2xvYmFscyIsCVRfT0JKRUNULAlPRkYoZl9nbG9iYWxzKSwJUk99LAotCXsiZl9sYXN0aSIsCVRfSU5ULAkJT0ZGKGZfbGFzdGkpLAlST30sCi0JeyJmX2V4Y190eXBlIiwJVF9PQkpFQ1QsCU9GRihmX2V4Y190eXBlKX0sCi0JeyJmX2V4Y192YWx1ZSIsCVRfT0JKRUNULAlPRkYoZl9leGNfdmFsdWUpfSwKLQl7ImZfZXhjX3RyYWNlYmFjayIsIFRfT0JKRUNULAlPRkYoZl9leGNfdHJhY2ViYWNrKX0sCi0Je05VTEx9CS8qIFNlbnRpbmVsICovCisgICAgeyJmX2JhY2siLCAgICAgICAgICBUX09CSkVDVCwgICAgICAgT0ZGKGZfYmFjayksICAgIFJPfSwKKyAgICB7ImZfY29kZSIsICAgICAgICAgIFRfT0JKRUNULCAgICAgICBPRkYoZl9jb2RlKSwgICAgUk99LAorICAgIHsiZl9idWlsdGlucyIsICAgICAgVF9PQkpFQ1QsICAgICAgIE9GRihmX2J1aWx0aW5zKSxST30sCisgICAgeyJmX2dsb2JhbHMiLCAgICAgICBUX09CSkVDVCwgICAgICAgT0ZGKGZfZ2xvYmFscyksIFJPfSwKKyAgICB7ImZfbGFzdGkiLCAgICAgICAgIFRfSU5ULCAgICAgICAgICBPRkYoZl9sYXN0aSksICAgUk99LAorICAgIHsiZl9leGNfdHlwZSIsICAgICAgVF9PQkpFQ1QsICAgICAgIE9GRihmX2V4Y190eXBlKX0sCisgICAgeyJmX2V4Y192YWx1ZSIsICAgICBUX09CSkVDVCwgICAgICAgT0ZGKGZfZXhjX3ZhbHVlKX0sCisgICAgeyJmX2V4Y190cmFjZWJhY2siLCBUX09CSkVDVCwgICAgICAgT0ZGKGZfZXhjX3RyYWNlYmFjayl9LAorICAgIHtOVUxMfSAgICAgIC8qIFNlbnRpbmVsICovCiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKgogZnJhbWVfZ2V0bG9jYWxzKFB5RnJhbWVPYmplY3QgKmYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JUHlGcmFtZV9GYXN0VG9Mb2NhbHMoZik7Ci0JUHlfSU5DUkVGKGYtPmZfbG9jYWxzKTsKLQlyZXR1cm4gZi0+Zl9sb2NhbHM7CisgICAgUHlGcmFtZV9GYXN0VG9Mb2NhbHMoZik7CisgICAgUHlfSU5DUkVGKGYtPmZfbG9jYWxzKTsKKyAgICByZXR1cm4gZi0+Zl9sb2NhbHM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmcmFtZV9nZXRsaW5lbm8oUHlGcmFtZU9iamVjdCAqZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlpbnQgbGluZW5vOworICAgIGludCBsaW5lbm87CiAKLQlpZiAoZi0+Zl90cmFjZSkKLQkJbGluZW5vID0gZi0+Zl9saW5lbm87Ci0JZWxzZQotCQlsaW5lbm8gPSBQeUNvZGVfQWRkcjJMaW5lKGYtPmZfY29kZSwgZi0+Zl9sYXN0aSk7CisgICAgaWYgKGYtPmZfdHJhY2UpCisgICAgICAgIGxpbmVubyA9IGYtPmZfbGluZW5vOworICAgIGVsc2UKKyAgICAgICAgbGluZW5vID0gUHlDb2RlX0FkZHIyTGluZShmLT5mX2NvZGUsIGYtPmZfbGFzdGkpOwogCi0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKGxpbmVubyk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKGxpbmVubyk7CiB9CiAKIC8qIFNldHRlciBmb3IgZl9saW5lbm8gLSB5b3UgY2FuIHNldCBmX2xpbmVubyBmcm9tIHdpdGhpbiBhIHRyYWNlIGZ1bmN0aW9uIGluCi0gKiBvcmRlciB0byBqdW1wIHRvIGEgZ2l2ZW4gbGluZSBvZiBjb2RlLCBzdWJqZWN0IHRvIHNvbWUgcmVzdHJpY3Rpb25zLgkgTW9zdAorICogb3JkZXIgdG8ganVtcCB0byBhIGdpdmVuIGxpbmUgb2YgY29kZSwgc3ViamVjdCB0byBzb21lIHJlc3RyaWN0aW9ucy4gIE1vc3QKICAqIGxpbmVzIGFyZSBPSyB0byBqdW1wIHRvIGJlY2F1c2UgdGhleSBkb24ndCBtYWtlIGFueSBhc3N1bXB0aW9ucyBhYm91dCB0aGUKICAqIHN0YXRlIG9mIHRoZSBzdGFjayAob2J2aW91cyBiZWNhdXNlIHlvdSBjb3VsZCByZW1vdmUgdGhlIGxpbmUgYW5kIHRoZSBjb2RlCiAgKiB3b3VsZCBzdGlsbCB3b3JrIHdpdGhvdXQgYW55IHN0YWNrIGVycm9ycyksIGJ1dCB0aGVyZSBhcmUgc29tZSBjb25zdHJ1Y3RzCkBAIC02NSwyOTcgKzY1LDI5NyBAQAogc3RhdGljIGludAogZnJhbWVfc2V0bGluZW5vKFB5RnJhbWVPYmplY3QgKmYsIFB5T2JqZWN0KiBwX25ld19saW5lbm8pCiB7Ci0JaW50IG5ld19saW5lbm8gPSAwOwkJLyogVGhlIG5ldyB2YWx1ZSBvZiBmX2xpbmVubyAqLwotCWludCBuZXdfbGFzdGkgPSAwOwkJLyogVGhlIG5ldyB2YWx1ZSBvZiBmX2xhc3RpICovCi0JaW50IG5ld19pYmxvY2sgPSAwOwkJLyogVGhlIG5ldyB2YWx1ZSBvZiBmX2libG9jayAqLwotCXVuc2lnbmVkIGNoYXIgKmNvZGUgPSBOVUxMOwkvKiBUaGUgYnl0ZWNvZGUgZm9yIHRoZSBmcmFtZS4uLiAqLwotCVB5X3NzaXplX3QgY29kZV9sZW4gPSAwOwkvKiAuLi5hbmQgaXRzIGxlbmd0aCAqLwotCXVuc2lnbmVkIGNoYXIgKmxub3RhYiA9IE5VTEw7CS8qIEl0ZXJhdGluZyBvdmVyIGNvX2xub3RhYiAqLwotCVB5X3NzaXplX3QgbG5vdGFiX2xlbiA9IDA7CS8qIChkaXR0bykgKi8KLQlpbnQgb2Zmc2V0ID0gMDsJCQkvKiAoZGl0dG8pICovCi0JaW50IGxpbmUgPSAwOwkJCS8qIChkaXR0bykgKi8KLQlpbnQgYWRkciA9IDA7CQkJLyogKGRpdHRvKSAqLwotCWludCBtaW5fYWRkciA9IDA7CQkvKiBTY2FubmluZyB0aGUgU0VUVVBzIGFuZCBQT1BzICovCi0JaW50IG1heF9hZGRyID0gMDsJCS8qIChkaXR0bykgKi8KLQlpbnQgZGVsdGFfaWJsb2NrID0gMDsJCS8qIChkaXR0bykgKi8KLQlpbnQgbWluX2RlbHRhX2libG9jayA9IDA7CS8qIChkaXR0bykgKi8KLQlpbnQgbWluX2libG9jayA9IDA7CQkvKiAoZGl0dG8pICovCi0JaW50IGZfbGFzdGlfc2V0dXBfYWRkciA9IDA7CS8qIFBvbGljaW5nIG5vLWp1bXAtaW50by1maW5hbGx5ICovCi0JaW50IG5ld19sYXN0aV9zZXR1cF9hZGRyID0gMDsJLyogKGRpdHRvKSAqLwotCWludCBibG9ja3N0YWNrW0NPX01BWEJMT0NLU107CS8qIFdhbGtpbmcgdGhlICdmaW5hbGx5JyBibG9ja3MgKi8KLQlpbnQgaW5fZmluYWxseVtDT19NQVhCTE9DS1NdOwkvKiAoZGl0dG8pICovCi0JaW50IGJsb2Nrc3RhY2tfdG9wID0gMDsJCS8qIChkaXR0bykgKi8KLQl1bnNpZ25lZCBjaGFyIHNldHVwX29wID0gMDsJLyogKGRpdHRvKSAqLwotCWNoYXIgKnRtcDsKKyAgICBpbnQgbmV3X2xpbmVubyA9IDA7ICAgICAgICAgICAgICAgICAvKiBUaGUgbmV3IHZhbHVlIG9mIGZfbGluZW5vICovCisgICAgaW50IG5ld19sYXN0aSA9IDA7ICAgICAgICAgICAgICAgICAgLyogVGhlIG5ldyB2YWx1ZSBvZiBmX2xhc3RpICovCisgICAgaW50IG5ld19pYmxvY2sgPSAwOyAgICAgICAgICAgICAgICAgLyogVGhlIG5ldyB2YWx1ZSBvZiBmX2libG9jayAqLworICAgIHVuc2lnbmVkIGNoYXIgKmNvZGUgPSBOVUxMOyAgICAgICAgIC8qIFRoZSBieXRlY29kZSBmb3IgdGhlIGZyYW1lLi4uICovCisgICAgUHlfc3NpemVfdCBjb2RlX2xlbiA9IDA7ICAgICAgICAgICAgLyogLi4uYW5kIGl0cyBsZW5ndGggKi8KKyAgICB1bnNpZ25lZCBjaGFyICpsbm90YWIgPSBOVUxMOyAgICAgICAvKiBJdGVyYXRpbmcgb3ZlciBjb19sbm90YWIgKi8KKyAgICBQeV9zc2l6ZV90IGxub3RhYl9sZW4gPSAwOyAgICAgICAgICAvKiAoZGl0dG8pICovCisgICAgaW50IG9mZnNldCA9IDA7ICAgICAgICAgICAgICAgICAgICAgLyogKGRpdHRvKSAqLworICAgIGludCBsaW5lID0gMDsgICAgICAgICAgICAgICAgICAgICAgIC8qIChkaXR0bykgKi8KKyAgICBpbnQgYWRkciA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAvKiAoZGl0dG8pICovCisgICAgaW50IG1pbl9hZGRyID0gMDsgICAgICAgICAgICAgICAgICAgLyogU2Nhbm5pbmcgdGhlIFNFVFVQcyBhbmQgUE9QcyAqLworICAgIGludCBtYXhfYWRkciA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIChkaXR0bykgKi8KKyAgICBpbnQgZGVsdGFfaWJsb2NrID0gMDsgICAgICAgICAgICAgICAvKiAoZGl0dG8pICovCisgICAgaW50IG1pbl9kZWx0YV9pYmxvY2sgPSAwOyAgICAgICAgICAgLyogKGRpdHRvKSAqLworICAgIGludCBtaW5faWJsb2NrID0gMDsgICAgICAgICAgICAgICAgIC8qIChkaXR0bykgKi8KKyAgICBpbnQgZl9sYXN0aV9zZXR1cF9hZGRyID0gMDsgICAgICAgICAvKiBQb2xpY2luZyBuby1qdW1wLWludG8tZmluYWxseSAqLworICAgIGludCBuZXdfbGFzdGlfc2V0dXBfYWRkciA9IDA7ICAgICAgIC8qIChkaXR0bykgKi8KKyAgICBpbnQgYmxvY2tzdGFja1tDT19NQVhCTE9DS1NdOyAgICAgICAvKiBXYWxraW5nIHRoZSAnZmluYWxseScgYmxvY2tzICovCisgICAgaW50IGluX2ZpbmFsbHlbQ09fTUFYQkxPQ0tTXTsgICAgICAgLyogKGRpdHRvKSAqLworICAgIGludCBibG9ja3N0YWNrX3RvcCA9IDA7ICAgICAgICAgICAgIC8qIChkaXR0bykgKi8KKyAgICB1bnNpZ25lZCBjaGFyIHNldHVwX29wID0gMDsgICAgICAgICAvKiAoZGl0dG8pICovCisgICAgY2hhciAqdG1wOwogCi0JLyogZl9saW5lbm8gbXVzdCBiZSBhbiBpbnRlZ2VyLiAqLwotCWlmICghUHlJbnRfQ2hlY2socF9uZXdfbGluZW5vKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkibGluZW5vIG11c3QgYmUgYW4gaW50ZWdlciIpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIC8qIGZfbGluZW5vIG11c3QgYmUgYW4gaW50ZWdlci4gKi8KKyAgICBpZiAoIVB5SW50X0NoZWNrKHBfbmV3X2xpbmVubykpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAibGluZW5vIG11c3QgYmUgYW4gaW50ZWdlciIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JLyogWW91IGNhbiBvbmx5IGRvIHRoaXMgZnJvbSB3aXRoaW4gYSB0cmFjZSBmdW5jdGlvbiwgbm90IHZpYQotCSAqIF9nZXRmcmFtZSBvciBzaW1pbGFyIGhhY2tlcnkuICovCi0JaWYgKCFmLT5mX3RyYWNlKQotCXsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkgICAgICJmX2xpbmVubyBjYW4gb25seSBiZSBzZXQgYnkgYSB0cmFjZSBmdW5jdGlvbiIpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIC8qIFlvdSBjYW4gb25seSBkbyB0aGlzIGZyb20gd2l0aGluIGEgdHJhY2UgZnVuY3Rpb24sIG5vdCB2aWEKKyAgICAgKiBfZ2V0ZnJhbWUgb3Igc2ltaWxhciBoYWNrZXJ5LiAqLworICAgIGlmICghZi0+Zl90cmFjZSkKKyAgICB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgImZfbGluZW5vIGNhbiBvbmx5IGJlIHNldCBieSBhIHRyYWNlIGZ1bmN0aW9uIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQkvKiBGYWlsIGlmIHRoZSBsaW5lIGNvbWVzIGJlZm9yZSB0aGUgc3RhcnQgb2YgdGhlIGNvZGUgYmxvY2suICovCi0JbmV3X2xpbmVubyA9IChpbnQpIFB5SW50X0FzTG9uZyhwX25ld19saW5lbm8pOwotCWlmIChuZXdfbGluZW5vIDwgZi0+Zl9jb2RlLT5jb19maXJzdGxpbmVubykgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKLQkJCSAgICAgImxpbmUgJWQgY29tZXMgYmVmb3JlIHRoZSBjdXJyZW50IGNvZGUgYmxvY2siLAotCQkJICAgICBuZXdfbGluZW5vKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICAvKiBGYWlsIGlmIHRoZSBsaW5lIGNvbWVzIGJlZm9yZSB0aGUgc3RhcnQgb2YgdGhlIGNvZGUgYmxvY2suICovCisgICAgbmV3X2xpbmVubyA9IChpbnQpIFB5SW50X0FzTG9uZyhwX25ld19saW5lbm8pOworICAgIGlmIChuZXdfbGluZW5vIDwgZi0+Zl9jb2RlLT5jb19maXJzdGxpbmVubykgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJsaW5lICVkIGNvbWVzIGJlZm9yZSB0aGUgY3VycmVudCBjb2RlIGJsb2NrIiwKKyAgICAgICAgICAgICAgICAgICAgIG5ld19saW5lbm8pOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JLyogRmluZCB0aGUgYnl0ZWNvZGUgb2Zmc2V0IGZvciB0aGUgc3RhcnQgb2YgdGhlIGdpdmVuIGxpbmUsIG9yIHRoZQotCSAqIGZpcnN0IGNvZGUtb3duaW5nIGxpbmUgYWZ0ZXIgaXQuICovCi0JUHlTdHJpbmdfQXNTdHJpbmdBbmRTaXplKGYtPmZfY29kZS0+Y29fbG5vdGFiLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmdG1wLCAmbG5vdGFiX2xlbik7Ci0JbG5vdGFiID0gKHVuc2lnbmVkIGNoYXIgKikgdG1wOwotCWFkZHIgPSAwOwotCWxpbmUgPSBmLT5mX2NvZGUtPmNvX2ZpcnN0bGluZW5vOwotCW5ld19sYXN0aSA9IC0xOwotCWZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IDwgbG5vdGFiX2xlbjsgb2Zmc2V0ICs9IDIpIHsKLQkJYWRkciArPSBsbm90YWJbb2Zmc2V0XTsKLQkJbGluZSArPSBsbm90YWJbb2Zmc2V0KzFdOwotCQlpZiAobGluZSA+PSBuZXdfbGluZW5vKSB7Ci0JCQluZXdfbGFzdGkgPSBhZGRyOwotCQkJbmV3X2xpbmVubyA9IGxpbmU7Ci0JCQlicmVhazsKLQkJfQotCX0KKyAgICAvKiBGaW5kIHRoZSBieXRlY29kZSBvZmZzZXQgZm9yIHRoZSBzdGFydCBvZiB0aGUgZ2l2ZW4gbGluZSwgb3IgdGhlCisgICAgICogZmlyc3QgY29kZS1vd25pbmcgbGluZSBhZnRlciBpdC4gKi8KKyAgICBQeVN0cmluZ19Bc1N0cmluZ0FuZFNpemUoZi0+Zl9jb2RlLT5jb19sbm90YWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0bXAsICZsbm90YWJfbGVuKTsKKyAgICBsbm90YWIgPSAodW5zaWduZWQgY2hhciAqKSB0bXA7CisgICAgYWRkciA9IDA7CisgICAgbGluZSA9IGYtPmZfY29kZS0+Y29fZmlyc3RsaW5lbm87CisgICAgbmV3X2xhc3RpID0gLTE7CisgICAgZm9yIChvZmZzZXQgPSAwOyBvZmZzZXQgPCBsbm90YWJfbGVuOyBvZmZzZXQgKz0gMikgeworICAgICAgICBhZGRyICs9IGxub3RhYltvZmZzZXRdOworICAgICAgICBsaW5lICs9IGxub3RhYltvZmZzZXQrMV07CisgICAgICAgIGlmIChsaW5lID49IG5ld19saW5lbm8pIHsKKyAgICAgICAgICAgIG5ld19sYXN0aSA9IGFkZHI7CisgICAgICAgICAgICBuZXdfbGluZW5vID0gbGluZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQogCi0JLyogSWYgd2UgZGlkbid0IHJlYWNoIHRoZSByZXF1ZXN0ZWQgbGluZSwgcmV0dXJuIGFuIGVycm9yLiAqLwotCWlmIChuZXdfbGFzdGkgPT0gLTEpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkgICAgICJsaW5lICVkIGNvbWVzIGFmdGVyIHRoZSBjdXJyZW50IGNvZGUgYmxvY2siLAotCQkJICAgICBuZXdfbGluZW5vKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICAvKiBJZiB3ZSBkaWRuJ3QgcmVhY2ggdGhlIHJlcXVlc3RlZCBsaW5lLCByZXR1cm4gYW4gZXJyb3IuICovCisgICAgaWYgKG5ld19sYXN0aSA9PSAtMSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJsaW5lICVkIGNvbWVzIGFmdGVyIHRoZSBjdXJyZW50IGNvZGUgYmxvY2siLAorICAgICAgICAgICAgICAgICAgICAgbmV3X2xpbmVubyk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQkvKiBXZSdyZSBub3cgcmVhZHkgdG8gbG9vayBhdCB0aGUgYnl0ZWNvZGUuICovCi0JUHlTdHJpbmdfQXNTdHJpbmdBbmRTaXplKGYtPmZfY29kZS0+Y29fY29kZSwgKGNoYXIgKiopJmNvZGUsICZjb2RlX2xlbik7Ci0JbWluX2FkZHIgPSBNSU4obmV3X2xhc3RpLCBmLT5mX2xhc3RpKTsKLQltYXhfYWRkciA9IE1BWChuZXdfbGFzdGksIGYtPmZfbGFzdGkpOworICAgIC8qIFdlJ3JlIG5vdyByZWFkeSB0byBsb29rIGF0IHRoZSBieXRlY29kZS4gKi8KKyAgICBQeVN0cmluZ19Bc1N0cmluZ0FuZFNpemUoZi0+Zl9jb2RlLT5jb19jb2RlLCAoY2hhciAqKikmY29kZSwgJmNvZGVfbGVuKTsKKyAgICBtaW5fYWRkciA9IE1JTihuZXdfbGFzdGksIGYtPmZfbGFzdGkpOworICAgIG1heF9hZGRyID0gTUFYKG5ld19sYXN0aSwgZi0+Zl9sYXN0aSk7CiAKLQkvKiBZb3UgY2FuJ3QganVtcCBvbnRvIGEgbGluZSB3aXRoIGFuICdleGNlcHQnIHN0YXRlbWVudCBvbiBpdCAtCi0JICogdGhleSBleHBlY3QgdG8gaGF2ZSBhbiBleGNlcHRpb24gb24gdGhlIHRvcCBvZiB0aGUgc3RhY2ssIHdoaWNoCi0JICogd29uJ3QgYmUgdHJ1ZSBpZiB5b3UganVtcCB0byB0aGVtLiAgVGhleSBhbHdheXMgc3RhcnQgd2l0aCBjb2RlCi0JICogdGhhdCBlaXRoZXIgcG9wcyB0aGUgZXhjZXB0aW9uIHVzaW5nIFBPUF9UT1AgKHBsYWluICdleGNlcHQ6JwotCSAqIGxpbmVzIGRvIHRoaXMpIG9yIGR1cGxpY2F0ZXMgdGhlIGV4Y2VwdGlvbiBvbiB0aGUgc3RhY2sgdXNpbmcKLQkgKiBEVVBfVE9QIChpZiB0aGVyZSdzIGFuIGV4Y2VwdGlvbiB0eXBlIHNwZWNpZmllZCkuICBTZWUgY29tcGlsZS5jLAotCSAqICdjb21fdHJ5X2V4Y2VwdCcgZm9yIHRoZSBmdWxsIGRldGFpbHMuICBUaGVyZSBhcmVuJ3QgYW55IG90aGVyCi0JICogY2FzZXMgKEFGQUlLKSB3aGVyZSBhIGxpbmUncyBjb2RlIGNhbiBzdGFydCB3aXRoIERVUF9UT1Agb3IKLQkgKiBQT1BfVE9QLCBidXQgaWYgYW55IGV2ZXIgYXBwZWFyLCB0aGV5J2xsIGJlIHN1YmplY3QgdG8gdGhlIHNhbWUKLQkgKiByZXN0cmljdGlvbiAoYnV0IHdpdGggYSBkaWZmZXJlbnQgZXJyb3IgbWVzc2FnZSkuICovCi0JaWYgKGNvZGVbbmV3X2xhc3RpXSA9PSBEVVBfVE9QIHx8IGNvZGVbbmV3X2xhc3RpXSA9PSBQT1BfVE9QKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkgICAgImNhbid0IGp1bXAgdG8gJ2V4Y2VwdCcgbGluZSBhcyB0aGVyZSdzIG5vIGV4Y2VwdGlvbiIpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIC8qIFlvdSBjYW4ndCBqdW1wIG9udG8gYSBsaW5lIHdpdGggYW4gJ2V4Y2VwdCcgc3RhdGVtZW50IG9uIGl0IC0KKyAgICAgKiB0aGV5IGV4cGVjdCB0byBoYXZlIGFuIGV4Y2VwdGlvbiBvbiB0aGUgdG9wIG9mIHRoZSBzdGFjaywgd2hpY2gKKyAgICAgKiB3b24ndCBiZSB0cnVlIGlmIHlvdSBqdW1wIHRvIHRoZW0uICBUaGV5IGFsd2F5cyBzdGFydCB3aXRoIGNvZGUKKyAgICAgKiB0aGF0IGVpdGhlciBwb3BzIHRoZSBleGNlcHRpb24gdXNpbmcgUE9QX1RPUCAocGxhaW4gJ2V4Y2VwdDonCisgICAgICogbGluZXMgZG8gdGhpcykgb3IgZHVwbGljYXRlcyB0aGUgZXhjZXB0aW9uIG9uIHRoZSBzdGFjayB1c2luZworICAgICAqIERVUF9UT1AgKGlmIHRoZXJlJ3MgYW4gZXhjZXB0aW9uIHR5cGUgc3BlY2lmaWVkKS4gIFNlZSBjb21waWxlLmMsCisgICAgICogJ2NvbV90cnlfZXhjZXB0JyBmb3IgdGhlIGZ1bGwgZGV0YWlscy4gIFRoZXJlIGFyZW4ndCBhbnkgb3RoZXIKKyAgICAgKiBjYXNlcyAoQUZBSUspIHdoZXJlIGEgbGluZSdzIGNvZGUgY2FuIHN0YXJ0IHdpdGggRFVQX1RPUCBvcgorICAgICAqIFBPUF9UT1AsIGJ1dCBpZiBhbnkgZXZlciBhcHBlYXIsIHRoZXknbGwgYmUgc3ViamVjdCB0byB0aGUgc2FtZQorICAgICAqIHJlc3RyaWN0aW9uIChidXQgd2l0aCBhIGRpZmZlcmVudCBlcnJvciBtZXNzYWdlKS4gKi8KKyAgICBpZiAoY29kZVtuZXdfbGFzdGldID09IERVUF9UT1AgfHwgY29kZVtuZXdfbGFzdGldID09IFBPUF9UT1ApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAiY2FuJ3QganVtcCB0byAnZXhjZXB0JyBsaW5lIGFzIHRoZXJlJ3Mgbm8gZXhjZXB0aW9uIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQkvKiBZb3UgY2FuJ3QganVtcCBpbnRvIG9yIG91dCBvZiBhICdmaW5hbGx5JyBibG9jayBiZWNhdXNlIHRoZSAndHJ5JwotCSAqIGJsb2NrIGxlYXZlcyBzb21ldGhpbmcgb24gdGhlIHN0YWNrIGZvciB0aGUgRU5EX0ZJTkFMTFkgdG8gY2xlYW4KLQkgKiB1cC4JU28gd2Ugd2FsayB0aGUgYnl0ZWNvZGUsIG1haW50YWluaW5nIGEgc2ltdWxhdGVkIGJsb2Nrc3RhY2suCi0JICogV2hlbiB3ZSByZWFjaCB0aGUgb2xkIG9yIG5ldyBhZGRyZXNzIGFuZCBpdCdzIGluIGEgJ2ZpbmFsbHknIGJsb2NrCi0JICogd2Ugbm90ZSB0aGUgYWRkcmVzcyBvZiB0aGUgY29ycmVzcG9uZGluZyBTRVRVUF9GSU5BTExZLiAgVGhlIGp1bXAKLQkgKiBpcyBvbmx5IGxlZ2FsIGlmIG5laXRoZXIgYWRkcmVzcyBpcyBpbiBhICdmaW5hbGx5JyBibG9jayBvcgotCSAqIHRoZXkncmUgYm90aCBpbiB0aGUgc2FtZSBvbmUuICAnYmxvY2tzdGFjaycgaXMgYSBzdGFjayBvZiB0aGUKLQkgKiBieXRlY29kZSBhZGRyZXNzZXMgb2YgdGhlIFNFVFVQX1ggb3Bjb2RlcywgYW5kICdpbl9maW5hbGx5JyB0cmFja3MKLQkgKiB3aGV0aGVyIHdlJ3JlIGluIGEgJ2ZpbmFsbHknIGJsb2NrIGF0IGVhY2ggYmxvY2tzdGFjayBsZXZlbC4gKi8KLQlmX2xhc3RpX3NldHVwX2FkZHIgPSAtMTsKLQluZXdfbGFzdGlfc2V0dXBfYWRkciA9IC0xOwotCW1lbXNldChibG9ja3N0YWNrLCAnXDAnLCBzaXplb2YoYmxvY2tzdGFjaykpOwotCW1lbXNldChpbl9maW5hbGx5LCAnXDAnLCBzaXplb2YoaW5fZmluYWxseSkpOwotCWJsb2Nrc3RhY2tfdG9wID0gMDsKLQlmb3IgKGFkZHIgPSAwOyBhZGRyIDwgY29kZV9sZW47IGFkZHIrKykgewotCQl1bnNpZ25lZCBjaGFyIG9wID0gY29kZVthZGRyXTsKLQkJc3dpdGNoIChvcCkgewotCQljYXNlIFNFVFVQX0xPT1A6Ci0JCWNhc2UgU0VUVVBfRVhDRVBUOgotCQljYXNlIFNFVFVQX0ZJTkFMTFk6Ci0JCQlibG9ja3N0YWNrW2Jsb2Nrc3RhY2tfdG9wKytdID0gYWRkcjsKLQkJCWluX2ZpbmFsbHlbYmxvY2tzdGFja190b3AtMV0gPSAwOwotCQkJYnJlYWs7CisgICAgLyogWW91IGNhbid0IGp1bXAgaW50byBvciBvdXQgb2YgYSAnZmluYWxseScgYmxvY2sgYmVjYXVzZSB0aGUgJ3RyeScKKyAgICAgKiBibG9jayBsZWF2ZXMgc29tZXRoaW5nIG9uIHRoZSBzdGFjayBmb3IgdGhlIEVORF9GSU5BTExZIHRvIGNsZWFuCisgICAgICogdXAuICAgICAgU28gd2Ugd2FsayB0aGUgYnl0ZWNvZGUsIG1haW50YWluaW5nIGEgc2ltdWxhdGVkIGJsb2Nrc3RhY2suCisgICAgICogV2hlbiB3ZSByZWFjaCB0aGUgb2xkIG9yIG5ldyBhZGRyZXNzIGFuZCBpdCdzIGluIGEgJ2ZpbmFsbHknIGJsb2NrCisgICAgICogd2Ugbm90ZSB0aGUgYWRkcmVzcyBvZiB0aGUgY29ycmVzcG9uZGluZyBTRVRVUF9GSU5BTExZLiAgVGhlIGp1bXAKKyAgICAgKiBpcyBvbmx5IGxlZ2FsIGlmIG5laXRoZXIgYWRkcmVzcyBpcyBpbiBhICdmaW5hbGx5JyBibG9jayBvcgorICAgICAqIHRoZXkncmUgYm90aCBpbiB0aGUgc2FtZSBvbmUuICAnYmxvY2tzdGFjaycgaXMgYSBzdGFjayBvZiB0aGUKKyAgICAgKiBieXRlY29kZSBhZGRyZXNzZXMgb2YgdGhlIFNFVFVQX1ggb3Bjb2RlcywgYW5kICdpbl9maW5hbGx5JyB0cmFja3MKKyAgICAgKiB3aGV0aGVyIHdlJ3JlIGluIGEgJ2ZpbmFsbHknIGJsb2NrIGF0IGVhY2ggYmxvY2tzdGFjayBsZXZlbC4gKi8KKyAgICBmX2xhc3RpX3NldHVwX2FkZHIgPSAtMTsKKyAgICBuZXdfbGFzdGlfc2V0dXBfYWRkciA9IC0xOworICAgIG1lbXNldChibG9ja3N0YWNrLCAnXDAnLCBzaXplb2YoYmxvY2tzdGFjaykpOworICAgIG1lbXNldChpbl9maW5hbGx5LCAnXDAnLCBzaXplb2YoaW5fZmluYWxseSkpOworICAgIGJsb2Nrc3RhY2tfdG9wID0gMDsKKyAgICBmb3IgKGFkZHIgPSAwOyBhZGRyIDwgY29kZV9sZW47IGFkZHIrKykgeworICAgICAgICB1bnNpZ25lZCBjaGFyIG9wID0gY29kZVthZGRyXTsKKyAgICAgICAgc3dpdGNoIChvcCkgeworICAgICAgICBjYXNlIFNFVFVQX0xPT1A6CisgICAgICAgIGNhc2UgU0VUVVBfRVhDRVBUOgorICAgICAgICBjYXNlIFNFVFVQX0ZJTkFMTFk6CisgICAgICAgICAgICBibG9ja3N0YWNrW2Jsb2Nrc3RhY2tfdG9wKytdID0gYWRkcjsKKyAgICAgICAgICAgIGluX2ZpbmFsbHlbYmxvY2tzdGFja190b3AtMV0gPSAwOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBQT1BfQkxPQ0s6Ci0JCQlhc3NlcnQoYmxvY2tzdGFja190b3AgPiAwKTsKLQkJCXNldHVwX29wID0gY29kZVtibG9ja3N0YWNrW2Jsb2Nrc3RhY2tfdG9wLTFdXTsKLQkJCWlmIChzZXR1cF9vcCA9PSBTRVRVUF9GSU5BTExZKSB7Ci0JCQkJaW5fZmluYWxseVtibG9ja3N0YWNrX3RvcC0xXSA9IDE7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlibG9ja3N0YWNrX3RvcC0tOwotCQkJfQotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgUE9QX0JMT0NLOgorICAgICAgICAgICAgYXNzZXJ0KGJsb2Nrc3RhY2tfdG9wID4gMCk7CisgICAgICAgICAgICBzZXR1cF9vcCA9IGNvZGVbYmxvY2tzdGFja1tibG9ja3N0YWNrX3RvcC0xXV07CisgICAgICAgICAgICBpZiAoc2V0dXBfb3AgPT0gU0VUVVBfRklOQUxMWSkgeworICAgICAgICAgICAgICAgIGluX2ZpbmFsbHlbYmxvY2tzdGFja190b3AtMV0gPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgYmxvY2tzdGFja190b3AtLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgRU5EX0ZJTkFMTFk6Ci0JCQkvKiBJZ25vcmUgRU5EX0ZJTkFMTFlzIGZvciBTRVRVUF9FWENFUFRzIC0gdGhleSBleGlzdAotCQkJICogaW4gdGhlIGJ5dGVjb2RlIGJ1dCBkb24ndCBjb3JyZXNwb25kIHRvIGFuIGFjdHVhbAotCQkJICogJ2ZpbmFsbHknIGJsb2NrLiAgKElmIGJsb2Nrc3RhY2tfdG9wIGlzIDAsIHdlIG11c3QKLQkJCSAqIGJlIHNlZWluZyBzdWNoIGFuIEVORF9GSU5BTExZLikgKi8KLQkJCWlmIChibG9ja3N0YWNrX3RvcCA+IDApIHsKLQkJCQlzZXR1cF9vcCA9IGNvZGVbYmxvY2tzdGFja1tibG9ja3N0YWNrX3RvcC0xXV07Ci0JCQkJaWYgKHNldHVwX29wID09IFNFVFVQX0ZJTkFMTFkpIHsKLQkJCQkJYmxvY2tzdGFja190b3AtLTsKLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQorICAgICAgICBjYXNlIEVORF9GSU5BTExZOgorICAgICAgICAgICAgLyogSWdub3JlIEVORF9GSU5BTExZcyBmb3IgU0VUVVBfRVhDRVBUcyAtIHRoZXkgZXhpc3QKKyAgICAgICAgICAgICAqIGluIHRoZSBieXRlY29kZSBidXQgZG9uJ3QgY29ycmVzcG9uZCB0byBhbiBhY3R1YWwKKyAgICAgICAgICAgICAqICdmaW5hbGx5JyBibG9jay4gIChJZiBibG9ja3N0YWNrX3RvcCBpcyAwLCB3ZSBtdXN0CisgICAgICAgICAgICAgKiBiZSBzZWVpbmcgc3VjaCBhbiBFTkRfRklOQUxMWS4pICovCisgICAgICAgICAgICBpZiAoYmxvY2tzdGFja190b3AgPiAwKSB7CisgICAgICAgICAgICAgICAgc2V0dXBfb3AgPSBjb2RlW2Jsb2Nrc3RhY2tbYmxvY2tzdGFja190b3AtMV1dOworICAgICAgICAgICAgICAgIGlmIChzZXR1cF9vcCA9PSBTRVRVUF9GSU5BTExZKSB7CisgICAgICAgICAgICAgICAgICAgIGJsb2Nrc3RhY2tfdG9wLS07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KIAotCQkvKiBGb3IgdGhlIGFkZHJlc3NlcyB3ZSdyZSBpbnRlcmVzdGVkIGluLCBzZWUgd2hldGhlciB0aGV5J3JlCi0JCSAqIHdpdGhpbiBhICdmaW5hbGx5JyBibG9jayBhbmQgaWYgc28sIHJlbWVtYmVyIHRoZSBhZGRyZXNzCi0JCSAqIG9mIHRoZSBTRVRVUF9GSU5BTExZLiAqLwotCQlpZiAoYWRkciA9PSBuZXdfbGFzdGkgfHwgYWRkciA9PSBmLT5mX2xhc3RpKSB7Ci0JCQlpbnQgaSA9IDA7Ci0JCQlpbnQgc2V0dXBfYWRkciA9IC0xOwotCQkJZm9yIChpID0gYmxvY2tzdGFja190b3AtMTsgaSA+PSAwOyBpLS0pIHsKLQkJCQlpZiAoaW5fZmluYWxseVtpXSkgewotCQkJCQlzZXR1cF9hZGRyID0gYmxvY2tzdGFja1tpXTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQorICAgICAgICAvKiBGb3IgdGhlIGFkZHJlc3NlcyB3ZSdyZSBpbnRlcmVzdGVkIGluLCBzZWUgd2hldGhlciB0aGV5J3JlCisgICAgICAgICAqIHdpdGhpbiBhICdmaW5hbGx5JyBibG9jayBhbmQgaWYgc28sIHJlbWVtYmVyIHRoZSBhZGRyZXNzCisgICAgICAgICAqIG9mIHRoZSBTRVRVUF9GSU5BTExZLiAqLworICAgICAgICBpZiAoYWRkciA9PSBuZXdfbGFzdGkgfHwgYWRkciA9PSBmLT5mX2xhc3RpKSB7CisgICAgICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgICAgICBpbnQgc2V0dXBfYWRkciA9IC0xOworICAgICAgICAgICAgZm9yIChpID0gYmxvY2tzdGFja190b3AtMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgICAgICBpZiAoaW5fZmluYWxseVtpXSkgeworICAgICAgICAgICAgICAgICAgICBzZXR1cF9hZGRyID0gYmxvY2tzdGFja1tpXTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogCi0JCQlpZiAoc2V0dXBfYWRkciAhPSAtMSkgewotCQkJCWlmIChhZGRyID09IG5ld19sYXN0aSkgewotCQkJCQluZXdfbGFzdGlfc2V0dXBfYWRkciA9IHNldHVwX2FkZHI7Ci0JCQkJfQorICAgICAgICAgICAgaWYgKHNldHVwX2FkZHIgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICBpZiAoYWRkciA9PSBuZXdfbGFzdGkpIHsKKyAgICAgICAgICAgICAgICAgICAgbmV3X2xhc3RpX3NldHVwX2FkZHIgPSBzZXR1cF9hZGRyOworICAgICAgICAgICAgICAgIH0KIAotCQkJCWlmIChhZGRyID09IGYtPmZfbGFzdGkpIHsKLQkJCQkJZl9sYXN0aV9zZXR1cF9hZGRyID0gc2V0dXBfYWRkcjsKLQkJCQl9Ci0JCQl9Ci0JCX0KKyAgICAgICAgICAgICAgICBpZiAoYWRkciA9PSBmLT5mX2xhc3RpKSB7CisgICAgICAgICAgICAgICAgICAgIGZfbGFzdGlfc2V0dXBfYWRkciA9IHNldHVwX2FkZHI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJaWYgKG9wID49IEhBVkVfQVJHVU1FTlQpIHsKLQkJCWFkZHIgKz0gMjsKLQkJfQotCX0KKyAgICAgICAgaWYgKG9wID49IEhBVkVfQVJHVU1FTlQpIHsKKyAgICAgICAgICAgIGFkZHIgKz0gMjsKKyAgICAgICAgfQorICAgIH0KIAotCS8qIFZlcmlmeSB0aGF0IHRoZSBibG9ja3N0YWNrIHRyYWNraW5nIGNvZGUgZGlkbid0IGdldCBsb3N0LiAqLwotCWFzc2VydChibG9ja3N0YWNrX3RvcCA9PSAwKTsKKyAgICAvKiBWZXJpZnkgdGhhdCB0aGUgYmxvY2tzdGFjayB0cmFja2luZyBjb2RlIGRpZG4ndCBnZXQgbG9zdC4gKi8KKyAgICBhc3NlcnQoYmxvY2tzdGFja190b3AgPT0gMCk7CiAKLQkvKiBBZnRlciBhbGwgdGhhdCwgYXJlIHdlIGp1bXBpbmcgaW50byAvIG91dCBvZiBhICdmaW5hbGx5JyBibG9jaz8gKi8KLQlpZiAobmV3X2xhc3RpX3NldHVwX2FkZHIgIT0gZl9sYXN0aV9zZXR1cF9hZGRyKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJICAgICJjYW4ndCBqdW1wIGludG8gb3Igb3V0IG9mIGEgJ2ZpbmFsbHknIGJsb2NrIik7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgLyogQWZ0ZXIgYWxsIHRoYXQsIGFyZSB3ZSBqdW1waW5nIGludG8gLyBvdXQgb2YgYSAnZmluYWxseScgYmxvY2s/ICovCisgICAgaWYgKG5ld19sYXN0aV9zZXR1cF9hZGRyICE9IGZfbGFzdGlfc2V0dXBfYWRkcikgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgImNhbid0IGp1bXAgaW50byBvciBvdXQgb2YgYSAnZmluYWxseScgYmxvY2siKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAogCi0JLyogUG9saWNlIGJsb2NrLWp1bXBpbmcgKHlvdSBjYW4ndCBqdW1wIGludG8gdGhlIG1pZGRsZSBvZiBhIGJsb2NrKQotCSAqIGFuZCBlbnN1cmUgdGhhdCB0aGUgYmxvY2tzdGFjayBmaW5pc2hlcyB1cCBpbiBhIHNlbnNpYmxlIHN0YXRlIChieQotCSAqIHBvcHBpbmcgYW55IGJsb2NrcyB3ZSdyZSBqdW1waW5nIG91dCBvZikuICBXZSBsb29rIGF0IGFsbCB0aGUKLQkgKiBibG9ja3N0YWNrIG9wZXJhdGlvbnMgYmV0d2VlbiB0aGUgY3VycmVudCBwb3NpdGlvbiBhbmQgdGhlIG5ldwotCSAqIG9uZSwgYW5kIGtlZXAgdHJhY2sgb2YgaG93IG1hbnkgYmxvY2tzIHdlIGRyb3Agb3V0IG9mIG9uIHRoZSB3YXkuCi0JICogQnkgYWxzbyBrZWVwaW5nIHRyYWNrIG9mIHRoZSBsb3dlc3QgYmxvY2tzdGFjayBwb3NpdGlvbiB3ZSBzZWUsIHdlCi0JICogY2FuIHRlbGwgd2hldGhlciB0aGUganVtcCBnb2VzIGludG8gYW55IGJsb2NrcyB3aXRob3V0IGNvbWluZyBvdXQKLQkgKiBhZ2FpbiAtIGluIHRoYXQgY2FzZSB3ZSByYWlzZSBhbiBleGNlcHRpb24gYmVsb3cuICovCi0JZGVsdGFfaWJsb2NrID0gMDsKLQlmb3IgKGFkZHIgPSBtaW5fYWRkcjsgYWRkciA8IG1heF9hZGRyOyBhZGRyKyspIHsKLQkJdW5zaWduZWQgY2hhciBvcCA9IGNvZGVbYWRkcl07Ci0JCXN3aXRjaCAob3ApIHsKLQkJY2FzZSBTRVRVUF9MT09QOgotCQljYXNlIFNFVFVQX0VYQ0VQVDoKLQkJY2FzZSBTRVRVUF9GSU5BTExZOgotCQkJZGVsdGFfaWJsb2NrKys7Ci0JCQlicmVhazsKKyAgICAvKiBQb2xpY2UgYmxvY2stanVtcGluZyAoeW91IGNhbid0IGp1bXAgaW50byB0aGUgbWlkZGxlIG9mIGEgYmxvY2spCisgICAgICogYW5kIGVuc3VyZSB0aGF0IHRoZSBibG9ja3N0YWNrIGZpbmlzaGVzIHVwIGluIGEgc2Vuc2libGUgc3RhdGUgKGJ5CisgICAgICogcG9wcGluZyBhbnkgYmxvY2tzIHdlJ3JlIGp1bXBpbmcgb3V0IG9mKS4gIFdlIGxvb2sgYXQgYWxsIHRoZQorICAgICAqIGJsb2Nrc3RhY2sgb3BlcmF0aW9ucyBiZXR3ZWVuIHRoZSBjdXJyZW50IHBvc2l0aW9uIGFuZCB0aGUgbmV3CisgICAgICogb25lLCBhbmQga2VlcCB0cmFjayBvZiBob3cgbWFueSBibG9ja3Mgd2UgZHJvcCBvdXQgb2Ygb24gdGhlIHdheS4KKyAgICAgKiBCeSBhbHNvIGtlZXBpbmcgdHJhY2sgb2YgdGhlIGxvd2VzdCBibG9ja3N0YWNrIHBvc2l0aW9uIHdlIHNlZSwgd2UKKyAgICAgKiBjYW4gdGVsbCB3aGV0aGVyIHRoZSBqdW1wIGdvZXMgaW50byBhbnkgYmxvY2tzIHdpdGhvdXQgY29taW5nIG91dAorICAgICAqIGFnYWluIC0gaW4gdGhhdCBjYXNlIHdlIHJhaXNlIGFuIGV4Y2VwdGlvbiBiZWxvdy4gKi8KKyAgICBkZWx0YV9pYmxvY2sgPSAwOworICAgIGZvciAoYWRkciA9IG1pbl9hZGRyOyBhZGRyIDwgbWF4X2FkZHI7IGFkZHIrKykgeworICAgICAgICB1bnNpZ25lZCBjaGFyIG9wID0gY29kZVthZGRyXTsKKyAgICAgICAgc3dpdGNoIChvcCkgeworICAgICAgICBjYXNlIFNFVFVQX0xPT1A6CisgICAgICAgIGNhc2UgU0VUVVBfRVhDRVBUOgorICAgICAgICBjYXNlIFNFVFVQX0ZJTkFMTFk6CisgICAgICAgICAgICBkZWx0YV9pYmxvY2srKzsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgUE9QX0JMT0NLOgotCQkJZGVsdGFfaWJsb2NrLS07Ci0JCQlicmVhazsKLQkJfQorICAgICAgICBjYXNlIFBPUF9CTE9DSzoKKyAgICAgICAgICAgIGRlbHRhX2libG9jay0tOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KIAotCQltaW5fZGVsdGFfaWJsb2NrID0gTUlOKG1pbl9kZWx0YV9pYmxvY2ssIGRlbHRhX2libG9jayk7CisgICAgICAgIG1pbl9kZWx0YV9pYmxvY2sgPSBNSU4obWluX2RlbHRhX2libG9jaywgZGVsdGFfaWJsb2NrKTsKIAotCQlpZiAob3AgPj0gSEFWRV9BUkdVTUVOVCkgewotCQkJYWRkciArPSAyOwotCQl9Ci0JfQorICAgICAgICBpZiAob3AgPj0gSEFWRV9BUkdVTUVOVCkgeworICAgICAgICAgICAgYWRkciArPSAyOworICAgICAgICB9CisgICAgfQogCi0JLyogRGVyaXZlIHRoZSBhYnNvbHV0ZSBpYmxvY2sgdmFsdWVzIGZyb20gdGhlIGRlbHRhcy4gKi8KLQltaW5faWJsb2NrID0gZi0+Zl9pYmxvY2sgKyBtaW5fZGVsdGFfaWJsb2NrOwotCWlmIChuZXdfbGFzdGkgPiBmLT5mX2xhc3RpKSB7Ci0JCS8qIEZvcndhcmRzIGp1bXAuICovCi0JCW5ld19pYmxvY2sgPSBmLT5mX2libG9jayArIGRlbHRhX2libG9jazsKLQl9Ci0JZWxzZSB7Ci0JCS8qIEJhY2t3YXJkcyBqdW1wLiAqLwotCQluZXdfaWJsb2NrID0gZi0+Zl9pYmxvY2sgLSBkZWx0YV9pYmxvY2s7Ci0JfQorICAgIC8qIERlcml2ZSB0aGUgYWJzb2x1dGUgaWJsb2NrIHZhbHVlcyBmcm9tIHRoZSBkZWx0YXMuICovCisgICAgbWluX2libG9jayA9IGYtPmZfaWJsb2NrICsgbWluX2RlbHRhX2libG9jazsKKyAgICBpZiAobmV3X2xhc3RpID4gZi0+Zl9sYXN0aSkgeworICAgICAgICAvKiBGb3J3YXJkcyBqdW1wLiAqLworICAgICAgICBuZXdfaWJsb2NrID0gZi0+Zl9pYmxvY2sgKyBkZWx0YV9pYmxvY2s7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvKiBCYWNrd2FyZHMganVtcC4gKi8KKyAgICAgICAgbmV3X2libG9jayA9IGYtPmZfaWJsb2NrIC0gZGVsdGFfaWJsb2NrOworICAgIH0KIAotCS8qIEFyZSB3ZSBqdW1waW5nIGludG8gYSBibG9jaz8gKi8KLQlpZiAobmV3X2libG9jayA+IG1pbl9pYmxvY2spIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJImNhbid0IGp1bXAgaW50byB0aGUgbWlkZGxlIG9mIGEgYmxvY2siKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICAvKiBBcmUgd2UganVtcGluZyBpbnRvIGEgYmxvY2s/ICovCisgICAgaWYgKG5ld19pYmxvY2sgPiBtaW5faWJsb2NrKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImNhbid0IGp1bXAgaW50byB0aGUgbWlkZGxlIG9mIGEgYmxvY2siKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCS8qIFBvcCBhbnkgYmxvY2tzIHRoYXQgd2UncmUganVtcGluZyBvdXQgb2YuICovCi0Jd2hpbGUgKGYtPmZfaWJsb2NrID4gbmV3X2libG9jaykgewotCQlQeVRyeUJsb2NrICpiID0gJmYtPmZfYmxvY2tzdGFja1stLWYtPmZfaWJsb2NrXTsKLQkJd2hpbGUgKChmLT5mX3N0YWNrdG9wIC0gZi0+Zl92YWx1ZXN0YWNrKSA+IGItPmJfbGV2ZWwpIHsKLQkJCVB5T2JqZWN0ICp2ID0gKCotLWYtPmZfc3RhY2t0b3ApOwotCQkJUHlfREVDUkVGKHYpOwotCQl9Ci0JfQorICAgIC8qIFBvcCBhbnkgYmxvY2tzIHRoYXQgd2UncmUganVtcGluZyBvdXQgb2YuICovCisgICAgd2hpbGUgKGYtPmZfaWJsb2NrID4gbmV3X2libG9jaykgeworICAgICAgICBQeVRyeUJsb2NrICpiID0gJmYtPmZfYmxvY2tzdGFja1stLWYtPmZfaWJsb2NrXTsKKyAgICAgICAgd2hpbGUgKChmLT5mX3N0YWNrdG9wIC0gZi0+Zl92YWx1ZXN0YWNrKSA+IGItPmJfbGV2ZWwpIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICp2ID0gKCotLWYtPmZfc3RhY2t0b3ApOworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICB9CisgICAgfQogCi0JLyogRmluYWxseSBzZXQgdGhlIG5ldyBmX2xpbmVubyBhbmQgZl9sYXN0aSBhbmQgcmV0dXJuIE9LLiAqLwotCWYtPmZfbGluZW5vID0gbmV3X2xpbmVubzsKLQlmLT5mX2xhc3RpID0gbmV3X2xhc3RpOwotCXJldHVybiAwOworICAgIC8qIEZpbmFsbHkgc2V0IHRoZSBuZXcgZl9saW5lbm8gYW5kIGZfbGFzdGkgYW5kIHJldHVybiBPSy4gKi8KKyAgICBmLT5mX2xpbmVubyA9IG5ld19saW5lbm87CisgICAgZi0+Zl9sYXN0aSA9IG5ld19sYXN0aTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZyYW1lX2dldHRyYWNlKFB5RnJhbWVPYmplY3QgKmYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JUHlPYmplY3QqIHRyYWNlID0gZi0+Zl90cmFjZTsKKyAgICBQeU9iamVjdCogdHJhY2UgPSBmLT5mX3RyYWNlOwogCi0JaWYgKHRyYWNlID09IE5VTEwpCi0JCXRyYWNlID0gUHlfTm9uZTsKKyAgICBpZiAodHJhY2UgPT0gTlVMTCkKKyAgICAgICAgdHJhY2UgPSBQeV9Ob25lOwogCi0JUHlfSU5DUkVGKHRyYWNlKTsKKyAgICBQeV9JTkNSRUYodHJhY2UpOwogCi0JcmV0dXJuIHRyYWNlOworICAgIHJldHVybiB0cmFjZTsKIH0KIAogc3RhdGljIGludAogZnJhbWVfc2V0dHJhY2UoUHlGcmFtZU9iamVjdCAqZiwgUHlPYmplY3QqIHYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JLyogV2UgcmVseSBvbiBmX2xpbmVubyBiZWluZyBhY2N1cmF0ZSB3aGVuIGZfdHJhY2UgaXMgc2V0LiAqLworICAgIC8qIFdlIHJlbHkgb24gZl9saW5lbm8gYmVpbmcgYWNjdXJhdGUgd2hlbiBmX3RyYWNlIGlzIHNldC4gKi8KIAotCVB5T2JqZWN0KiBvbGRfdmFsdWUgPSBmLT5mX3RyYWNlOworICAgIFB5T2JqZWN0KiBvbGRfdmFsdWUgPSBmLT5mX3RyYWNlOwogCi0JUHlfWElOQ1JFRih2KTsKLQlmLT5mX3RyYWNlID0gdjsKKyAgICBQeV9YSU5DUkVGKHYpOworICAgIGYtPmZfdHJhY2UgPSB2OwogCi0JaWYgKHYgIT0gTlVMTCkKLQkJZi0+Zl9saW5lbm8gPSBQeUNvZGVfQWRkcjJMaW5lKGYtPmZfY29kZSwgZi0+Zl9sYXN0aSk7CisgICAgaWYgKHYgIT0gTlVMTCkKKyAgICAgICAgZi0+Zl9saW5lbm8gPSBQeUNvZGVfQWRkcjJMaW5lKGYtPmZfY29kZSwgZi0+Zl9sYXN0aSk7CiAKLQlQeV9YREVDUkVGKG9sZF92YWx1ZSk7CisgICAgUHlfWERFQ1JFRihvbGRfdmFsdWUpOwogCi0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmcmFtZV9nZXRyZXN0cmljdGVkKFB5RnJhbWVPYmplY3QgKmYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZyhQeUZyYW1lX0lzUmVzdHJpY3RlZChmKSk7CisgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZyhQeUZyYW1lX0lzUmVzdHJpY3RlZChmKSk7CiB9CiAKIHN0YXRpYyBQeUdldFNldERlZiBmcmFtZV9nZXRzZXRsaXN0W10gPSB7Ci0JeyJmX2xvY2FscyIsCShnZXR0ZXIpZnJhbWVfZ2V0bG9jYWxzLCBOVUxMLCBOVUxMfSwKLQl7ImZfbGluZW5vIiwJKGdldHRlcilmcmFtZV9nZXRsaW5lbm8sCi0JCQkoc2V0dGVyKWZyYW1lX3NldGxpbmVubywgTlVMTH0sCi0JeyJmX3RyYWNlIiwJKGdldHRlcilmcmFtZV9nZXR0cmFjZSwgKHNldHRlcilmcmFtZV9zZXR0cmFjZSwgTlVMTH0sCi0JeyJmX3Jlc3RyaWN0ZWQiLChnZXR0ZXIpZnJhbWVfZ2V0cmVzdHJpY3RlZCxOVUxMLCBOVUxMfSwKLQl7MH0KKyAgICB7ImZfbG9jYWxzIiwgICAgICAgIChnZXR0ZXIpZnJhbWVfZ2V0bG9jYWxzLCBOVUxMLCBOVUxMfSwKKyAgICB7ImZfbGluZW5vIiwgICAgICAgIChnZXR0ZXIpZnJhbWVfZ2V0bGluZW5vLAorICAgICAgICAgICAgICAgICAgICAoc2V0dGVyKWZyYW1lX3NldGxpbmVubywgTlVMTH0sCisgICAgeyJmX3RyYWNlIiwgICAgICAgICAoZ2V0dGVyKWZyYW1lX2dldHRyYWNlLCAoc2V0dGVyKWZyYW1lX3NldHRyYWNlLCBOVUxMfSwKKyAgICB7ImZfcmVzdHJpY3RlZCIsKGdldHRlcilmcmFtZV9nZXRyZXN0cmljdGVkLE5VTEwsIE5VTEx9LAorICAgIHswfQogfTsKIAogLyogU3RhY2sgZnJhbWVzIGFyZSBhbGxvY2F0ZWQgYW5kIGRlYWxsb2NhdGVkIGF0IGEgY29uc2lkZXJhYmxlIHJhdGUuCkBAIC0zNzIsNyArMzcyLDcgQEAKICAgIHRoZSBmb2xsb3dpbmcgZmllbGRzIGFyZSBzdGlsbCB2YWxpZDoKIAogICAgICAqIG9iX3R5cGUsIG9iX3NpemUsIGZfY29kZSwgZl92YWx1ZXN0YWNrOwotICAgICAgIAorCiAgICAgICogZl9sb2NhbHMsIGZfdHJhY2UsCiAgICAgICAgZl9leGNfdHlwZSwgZl9leGNfdmFsdWUsIGZfZXhjX3RyYWNlYmFjayBhcmUgTlVMTDsKIApAQCAtMzgzLDEwICszODMsMTAgQEAKICAgIGludGVnZXJzIGFyZSBhbGxvY2F0ZWQgaW4gYSBzcGVjaWFsIHdheSAtLSBzZWUgaW50b2JqZWN0LmMpLiAgV2hlbgogICAgYSBzdGFjayBmcmFtZSBpcyBvbiB0aGUgZnJlZSBsaXN0LCBvbmx5IHRoZSBmb2xsb3dpbmcgbWVtYmVycyBoYXZlCiAgICBhIG1lYW5pbmc6Ci0Jb2JfdHlwZQkJPT0gJkZyYW1ldHlwZQotCWZfYmFjawkJbmV4dCBpdGVtIG9uIGZyZWUgbGlzdCwgb3IgTlVMTAotCWZfc3RhY2tzaXplCXNpemUgb2YgdmFsdWUgc3RhY2sKLQlvYl9zaXplCQlzaXplIG9mIGxvY2Fsc3BsdXMKKyAgICBvYl90eXBlICAgICAgICAgICAgID09ICZGcmFtZXR5cGUKKyAgICBmX2JhY2sgICAgICAgICAgICAgIG5leHQgaXRlbSBvbiBmcmVlIGxpc3QsIG9yIE5VTEwKKyAgICBmX3N0YWNrc2l6ZSAgICAgICAgIHNpemUgb2YgdmFsdWUgc3RhY2sKKyAgICBvYl9zaXplICAgICAgICAgICAgIHNpemUgb2YgbG9jYWxzcGx1cwogICAgTm90ZSB0aGF0IHRoZSB2YWx1ZSBhbmQgYmxvY2sgc3RhY2tzIGFyZSBwcmVzZXJ2ZWQgLS0gdGhpcyBjYW4gc2F2ZQogICAgYW5vdGhlciBtYWxsb2MoKSBjYWxsIG9yIHR3byAoYW5kIHR3byBmcmVlKCkgY2FsbHMgYXMgd2VsbCEpLgogICAgQWxzbyBub3RlIHRoYXQsIHVubGlrZSBmb3IgaW50ZWdlcnMsIGVhY2ggZnJhbWUgb2JqZWN0IGlzIGEKQEAgLTQwMiwzMDcgKzQwMiwzMDcgQEAKICovCiAKIHN0YXRpYyBQeUZyYW1lT2JqZWN0ICpmcmVlX2xpc3QgPSBOVUxMOwotc3RhdGljIGludCBudW1mcmVlID0gMDsJCS8qIG51bWJlciBvZiBmcmFtZXMgY3VycmVudGx5IGluIGZyZWVfbGlzdCAqLworc3RhdGljIGludCBudW1mcmVlID0gMDsgICAgICAgICAvKiBudW1iZXIgb2YgZnJhbWVzIGN1cnJlbnRseSBpbiBmcmVlX2xpc3QgKi8KIC8qIG1heCB2YWx1ZSBmb3IgbnVtZnJlZSAqLwotI2RlZmluZSBQeUZyYW1lX01BWEZSRUVMSVNUIDIwMAkKKyNkZWZpbmUgUHlGcmFtZV9NQVhGUkVFTElTVCAyMDAKIAogc3RhdGljIHZvaWQKIGZyYW1lX2RlYWxsb2MoUHlGcmFtZU9iamVjdCAqZikKIHsKLQlQeU9iamVjdCAqKnAsICoqdmFsdWVzdGFjazsKLQlQeUNvZGVPYmplY3QgKmNvOworICAgIFB5T2JqZWN0ICoqcCwgKip2YWx1ZXN0YWNrOworICAgIFB5Q29kZU9iamVjdCAqY287CiAKLQlQeU9iamVjdF9HQ19VblRyYWNrKGYpOwotCVB5X1RSQVNIQ0FOX1NBRkVfQkVHSU4oZikKLQkvKiBLaWxsIGFsbCBsb2NhbCB2YXJpYWJsZXMgKi8KLQl2YWx1ZXN0YWNrID0gZi0+Zl92YWx1ZXN0YWNrOwotCWZvciAocCA9IGYtPmZfbG9jYWxzcGx1czsgcCA8IHZhbHVlc3RhY2s7IHArKykKLQkJUHlfQ0xFQVIoKnApOworICAgIFB5T2JqZWN0X0dDX1VuVHJhY2soZik7CisgICAgUHlfVFJBU0hDQU5fU0FGRV9CRUdJTihmKQorICAgIC8qIEtpbGwgYWxsIGxvY2FsIHZhcmlhYmxlcyAqLworICAgIHZhbHVlc3RhY2sgPSBmLT5mX3ZhbHVlc3RhY2s7CisgICAgZm9yIChwID0gZi0+Zl9sb2NhbHNwbHVzOyBwIDwgdmFsdWVzdGFjazsgcCsrKQorICAgICAgICBQeV9DTEVBUigqcCk7CiAKLQkvKiBGcmVlIHN0YWNrICovCi0JaWYgKGYtPmZfc3RhY2t0b3AgIT0gTlVMTCkgewotCQlmb3IgKHAgPSB2YWx1ZXN0YWNrOyBwIDwgZi0+Zl9zdGFja3RvcDsgcCsrKQotCQkJUHlfWERFQ1JFRigqcCk7Ci0JfQorICAgIC8qIEZyZWUgc3RhY2sgKi8KKyAgICBpZiAoZi0+Zl9zdGFja3RvcCAhPSBOVUxMKSB7CisgICAgICAgIGZvciAocCA9IHZhbHVlc3RhY2s7IHAgPCBmLT5mX3N0YWNrdG9wOyBwKyspCisgICAgICAgICAgICBQeV9YREVDUkVGKCpwKTsKKyAgICB9CiAKLQlQeV9YREVDUkVGKGYtPmZfYmFjayk7Ci0JUHlfREVDUkVGKGYtPmZfYnVpbHRpbnMpOwotCVB5X0RFQ1JFRihmLT5mX2dsb2JhbHMpOwotCVB5X0NMRUFSKGYtPmZfbG9jYWxzKTsKLQlQeV9DTEVBUihmLT5mX3RyYWNlKTsKLQlQeV9DTEVBUihmLT5mX2V4Y190eXBlKTsKLQlQeV9DTEVBUihmLT5mX2V4Y192YWx1ZSk7Ci0JUHlfQ0xFQVIoZi0+Zl9leGNfdHJhY2ViYWNrKTsKKyAgICBQeV9YREVDUkVGKGYtPmZfYmFjayk7CisgICAgUHlfREVDUkVGKGYtPmZfYnVpbHRpbnMpOworICAgIFB5X0RFQ1JFRihmLT5mX2dsb2JhbHMpOworICAgIFB5X0NMRUFSKGYtPmZfbG9jYWxzKTsKKyAgICBQeV9DTEVBUihmLT5mX3RyYWNlKTsKKyAgICBQeV9DTEVBUihmLT5mX2V4Y190eXBlKTsKKyAgICBQeV9DTEVBUihmLT5mX2V4Y192YWx1ZSk7CisgICAgUHlfQ0xFQVIoZi0+Zl9leGNfdHJhY2ViYWNrKTsKIAotCWNvID0gZi0+Zl9jb2RlOwotCWlmIChjby0+Y29fem9tYmllZnJhbWUgPT0gTlVMTCkKLQkJY28tPmNvX3pvbWJpZWZyYW1lID0gZjsKLQllbHNlIGlmIChudW1mcmVlIDwgUHlGcmFtZV9NQVhGUkVFTElTVCkgewotCQkrK251bWZyZWU7Ci0JCWYtPmZfYmFjayA9IGZyZWVfbGlzdDsKLQkJZnJlZV9saXN0ID0gZjsKLQl9Ci0JZWxzZSAKLQkJUHlPYmplY3RfR0NfRGVsKGYpOworICAgIGNvID0gZi0+Zl9jb2RlOworICAgIGlmIChjby0+Y29fem9tYmllZnJhbWUgPT0gTlVMTCkKKyAgICAgICAgY28tPmNvX3pvbWJpZWZyYW1lID0gZjsKKyAgICBlbHNlIGlmIChudW1mcmVlIDwgUHlGcmFtZV9NQVhGUkVFTElTVCkgeworICAgICAgICArK251bWZyZWU7CisgICAgICAgIGYtPmZfYmFjayA9IGZyZWVfbGlzdDsKKyAgICAgICAgZnJlZV9saXN0ID0gZjsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBQeU9iamVjdF9HQ19EZWwoZik7CiAKLQlQeV9ERUNSRUYoY28pOwotCVB5X1RSQVNIQ0FOX1NBRkVfRU5EKGYpCisgICAgUHlfREVDUkVGKGNvKTsKKyAgICBQeV9UUkFTSENBTl9TQUZFX0VORChmKQogfQogCiBzdGF0aWMgaW50CiBmcmFtZV90cmF2ZXJzZShQeUZyYW1lT2JqZWN0ICpmLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlQeU9iamVjdCAqKmZhc3Rsb2NhbHMsICoqcDsKLQlpbnQgaSwgc2xvdHM7CisgICAgUHlPYmplY3QgKipmYXN0bG9jYWxzLCAqKnA7CisgICAgaW50IGksIHNsb3RzOwogCi0JUHlfVklTSVQoZi0+Zl9iYWNrKTsKLQlQeV9WSVNJVChmLT5mX2NvZGUpOwotCVB5X1ZJU0lUKGYtPmZfYnVpbHRpbnMpOwotCVB5X1ZJU0lUKGYtPmZfZ2xvYmFscyk7Ci0JUHlfVklTSVQoZi0+Zl9sb2NhbHMpOwotCVB5X1ZJU0lUKGYtPmZfdHJhY2UpOwotCVB5X1ZJU0lUKGYtPmZfZXhjX3R5cGUpOwotCVB5X1ZJU0lUKGYtPmZfZXhjX3ZhbHVlKTsKLQlQeV9WSVNJVChmLT5mX2V4Y190cmFjZWJhY2spOworICAgIFB5X1ZJU0lUKGYtPmZfYmFjayk7CisgICAgUHlfVklTSVQoZi0+Zl9jb2RlKTsKKyAgICBQeV9WSVNJVChmLT5mX2J1aWx0aW5zKTsKKyAgICBQeV9WSVNJVChmLT5mX2dsb2JhbHMpOworICAgIFB5X1ZJU0lUKGYtPmZfbG9jYWxzKTsKKyAgICBQeV9WSVNJVChmLT5mX3RyYWNlKTsKKyAgICBQeV9WSVNJVChmLT5mX2V4Y190eXBlKTsKKyAgICBQeV9WSVNJVChmLT5mX2V4Y192YWx1ZSk7CisgICAgUHlfVklTSVQoZi0+Zl9leGNfdHJhY2ViYWNrKTsKIAotCS8qIGxvY2FscyAqLwotCXNsb3RzID0gZi0+Zl9jb2RlLT5jb19ubG9jYWxzICsgUHlUdXBsZV9HRVRfU0laRShmLT5mX2NvZGUtPmNvX2NlbGx2YXJzKSArIFB5VHVwbGVfR0VUX1NJWkUoZi0+Zl9jb2RlLT5jb19mcmVldmFycyk7Ci0JZmFzdGxvY2FscyA9IGYtPmZfbG9jYWxzcGx1czsKLQlmb3IgKGkgPSBzbG90czsgLS1pID49IDA7ICsrZmFzdGxvY2FscykKLQkJUHlfVklTSVQoKmZhc3Rsb2NhbHMpOworICAgIC8qIGxvY2FscyAqLworICAgIHNsb3RzID0gZi0+Zl9jb2RlLT5jb19ubG9jYWxzICsgUHlUdXBsZV9HRVRfU0laRShmLT5mX2NvZGUtPmNvX2NlbGx2YXJzKSArIFB5VHVwbGVfR0VUX1NJWkUoZi0+Zl9jb2RlLT5jb19mcmVldmFycyk7CisgICAgZmFzdGxvY2FscyA9IGYtPmZfbG9jYWxzcGx1czsKKyAgICBmb3IgKGkgPSBzbG90czsgLS1pID49IDA7ICsrZmFzdGxvY2FscykKKyAgICAgICAgUHlfVklTSVQoKmZhc3Rsb2NhbHMpOwogCi0JLyogc3RhY2sgKi8KLQlpZiAoZi0+Zl9zdGFja3RvcCAhPSBOVUxMKSB7Ci0JCWZvciAocCA9IGYtPmZfdmFsdWVzdGFjazsgcCA8IGYtPmZfc3RhY2t0b3A7IHArKykKLQkJCVB5X1ZJU0lUKCpwKTsKLQl9Ci0JcmV0dXJuIDA7CisgICAgLyogc3RhY2sgKi8KKyAgICBpZiAoZi0+Zl9zdGFja3RvcCAhPSBOVUxMKSB7CisgICAgICAgIGZvciAocCA9IGYtPmZfdmFsdWVzdGFjazsgcCA8IGYtPmZfc3RhY2t0b3A7IHArKykKKyAgICAgICAgICAgIFB5X1ZJU0lUKCpwKTsKKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkCiBmcmFtZV9jbGVhcihQeUZyYW1lT2JqZWN0ICpmKQogewotCVB5T2JqZWN0ICoqZmFzdGxvY2FscywgKipwLCAqKm9sZHRvcDsKLQlpbnQgaSwgc2xvdHM7CisgICAgUHlPYmplY3QgKipmYXN0bG9jYWxzLCAqKnAsICoqb2xkdG9wOworICAgIGludCBpLCBzbG90czsKIAotCS8qIEJlZm9yZSBhbnl0aGluZyBlbHNlLCBtYWtlIHN1cmUgdGhhdCB0aGlzIGZyYW1lIGlzIGNsZWFybHkgbWFya2VkCi0JICogYXMgYmVpbmcgZGVmdW5jdCEgIEVsc2UsIGUuZy4sIGEgZ2VuZXJhdG9yIHJlYWNoYWJsZSBmcm9tIHRoaXMKLQkgKiBmcmFtZSBtYXkgYWxzbyBwb2ludCB0byB0aGlzIGZyYW1lLCBiZWxpZXZlIGl0c2VsZiB0byBzdGlsbCBiZQotCSAqIGFjdGl2ZSwgYW5kIHRyeSBjbGVhbmluZyB1cCB0aGlzIGZyYW1lIGFnYWluLgotCSAqLwotCW9sZHRvcCA9IGYtPmZfc3RhY2t0b3A7Ci0JZi0+Zl9zdGFja3RvcCA9IE5VTEw7CisgICAgLyogQmVmb3JlIGFueXRoaW5nIGVsc2UsIG1ha2Ugc3VyZSB0aGF0IHRoaXMgZnJhbWUgaXMgY2xlYXJseSBtYXJrZWQKKyAgICAgKiBhcyBiZWluZyBkZWZ1bmN0ISAgRWxzZSwgZS5nLiwgYSBnZW5lcmF0b3IgcmVhY2hhYmxlIGZyb20gdGhpcworICAgICAqIGZyYW1lIG1heSBhbHNvIHBvaW50IHRvIHRoaXMgZnJhbWUsIGJlbGlldmUgaXRzZWxmIHRvIHN0aWxsIGJlCisgICAgICogYWN0aXZlLCBhbmQgdHJ5IGNsZWFuaW5nIHVwIHRoaXMgZnJhbWUgYWdhaW4uCisgICAgICovCisgICAgb2xkdG9wID0gZi0+Zl9zdGFja3RvcDsKKyAgICBmLT5mX3N0YWNrdG9wID0gTlVMTDsKIAotCVB5X0NMRUFSKGYtPmZfZXhjX3R5cGUpOwotCVB5X0NMRUFSKGYtPmZfZXhjX3ZhbHVlKTsKLQlQeV9DTEVBUihmLT5mX2V4Y190cmFjZWJhY2spOwotCVB5X0NMRUFSKGYtPmZfdHJhY2UpOworICAgIFB5X0NMRUFSKGYtPmZfZXhjX3R5cGUpOworICAgIFB5X0NMRUFSKGYtPmZfZXhjX3ZhbHVlKTsKKyAgICBQeV9DTEVBUihmLT5mX2V4Y190cmFjZWJhY2spOworICAgIFB5X0NMRUFSKGYtPmZfdHJhY2UpOwogCi0JLyogbG9jYWxzICovCi0Jc2xvdHMgPSBmLT5mX2NvZGUtPmNvX25sb2NhbHMgKyBQeVR1cGxlX0dFVF9TSVpFKGYtPmZfY29kZS0+Y29fY2VsbHZhcnMpICsgUHlUdXBsZV9HRVRfU0laRShmLT5mX2NvZGUtPmNvX2ZyZWV2YXJzKTsKLQlmYXN0bG9jYWxzID0gZi0+Zl9sb2NhbHNwbHVzOwotCWZvciAoaSA9IHNsb3RzOyAtLWkgPj0gMDsgKytmYXN0bG9jYWxzKQotCQlQeV9DTEVBUigqZmFzdGxvY2Fscyk7CisgICAgLyogbG9jYWxzICovCisgICAgc2xvdHMgPSBmLT5mX2NvZGUtPmNvX25sb2NhbHMgKyBQeVR1cGxlX0dFVF9TSVpFKGYtPmZfY29kZS0+Y29fY2VsbHZhcnMpICsgUHlUdXBsZV9HRVRfU0laRShmLT5mX2NvZGUtPmNvX2ZyZWV2YXJzKTsKKyAgICBmYXN0bG9jYWxzID0gZi0+Zl9sb2NhbHNwbHVzOworICAgIGZvciAoaSA9IHNsb3RzOyAtLWkgPj0gMDsgKytmYXN0bG9jYWxzKQorICAgICAgICBQeV9DTEVBUigqZmFzdGxvY2Fscyk7CiAKLQkvKiBzdGFjayAqLwotCWlmIChvbGR0b3AgIT0gTlVMTCkgewotCQlmb3IgKHAgPSBmLT5mX3ZhbHVlc3RhY2s7IHAgPCBvbGR0b3A7IHArKykKLQkJCVB5X0NMRUFSKCpwKTsKLQl9CisgICAgLyogc3RhY2sgKi8KKyAgICBpZiAob2xkdG9wICE9IE5VTEwpIHsKKyAgICAgICAgZm9yIChwID0gZi0+Zl92YWx1ZXN0YWNrOyBwIDwgb2xkdG9wOyBwKyspCisgICAgICAgICAgICBQeV9DTEVBUigqcCk7CisgICAgfQogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZnJhbWVfc2l6ZW9mKFB5RnJhbWVPYmplY3QgKmYpCiB7Ci0JUHlfc3NpemVfdCByZXMsIGV4dHJhcywgbmNlbGxzLCBuZnJlZXM7CisgICAgUHlfc3NpemVfdCByZXMsIGV4dHJhcywgbmNlbGxzLCBuZnJlZXM7CiAKLQluY2VsbHMgPSBQeVR1cGxlX0dFVF9TSVpFKGYtPmZfY29kZS0+Y29fY2VsbHZhcnMpOwotCW5mcmVlcyA9IFB5VHVwbGVfR0VUX1NJWkUoZi0+Zl9jb2RlLT5jb19mcmVldmFycyk7Ci0JZXh0cmFzID0gZi0+Zl9jb2RlLT5jb19zdGFja3NpemUgKyBmLT5mX2NvZGUtPmNvX25sb2NhbHMgKwotCQkgbmNlbGxzICsgbmZyZWVzOwotCS8qIHN1YnRyYWN0IG9uZSBhcyBpdCBpcyBhbHJlYWR5IGluY2x1ZGVkIGluIFB5RnJhbWVPYmplY3QgKi8KLQlyZXMgPSBzaXplb2YoUHlGcmFtZU9iamVjdCkgKyAoZXh0cmFzLTEpICogc2l6ZW9mKFB5T2JqZWN0ICopOworICAgIG5jZWxscyA9IFB5VHVwbGVfR0VUX1NJWkUoZi0+Zl9jb2RlLT5jb19jZWxsdmFycyk7CisgICAgbmZyZWVzID0gUHlUdXBsZV9HRVRfU0laRShmLT5mX2NvZGUtPmNvX2ZyZWV2YXJzKTsKKyAgICBleHRyYXMgPSBmLT5mX2NvZGUtPmNvX3N0YWNrc2l6ZSArIGYtPmZfY29kZS0+Y29fbmxvY2FscyArCisgICAgICAgICAgICAgbmNlbGxzICsgbmZyZWVzOworICAgIC8qIHN1YnRyYWN0IG9uZSBhcyBpdCBpcyBhbHJlYWR5IGluY2x1ZGVkIGluIFB5RnJhbWVPYmplY3QgKi8KKyAgICByZXMgPSBzaXplb2YoUHlGcmFtZU9iamVjdCkgKyAoZXh0cmFzLTEpICogc2l6ZW9mKFB5T2JqZWN0ICopOwogCi0JcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KHJlcyk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KHJlcyk7CiB9CiAKIFB5RG9jX1NUUlZBUihzaXplb2ZfX2RvY19fLAogIkYuX19zaXplb2ZfXygpIC0+IHNpemUgb2YgRiBpbiBtZW1vcnksIGluIGJ5dGVzIik7CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBmcmFtZV9tZXRob2RzW10gPSB7Ci0JeyJfX3NpemVvZl9fIiwJKFB5Q0Z1bmN0aW9uKWZyYW1lX3NpemVvZiwJTUVUSF9OT0FSR1MsCi0JIHNpemVvZl9fZG9jX199LAotCXtOVUxMLAkJTlVMTH0JLyogc2VudGluZWwgKi8KKyAgICB7Il9fc2l6ZW9mX18iLCAgICAgIChQeUNGdW5jdGlvbilmcmFtZV9zaXplb2YsICAgICAgTUVUSF9OT0FSR1MsCisgICAgIHNpemVvZl9fZG9jX199LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0gICAvKiBzZW50aW5lbCAqLwogfTsKIAogUHlUeXBlT2JqZWN0IFB5RnJhbWVfVHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQotCSJmcmFtZSIsCi0Jc2l6ZW9mKFB5RnJhbWVPYmplY3QpLAotCXNpemVvZihQeU9iamVjdCAqKSwKLQkoZGVzdHJ1Y3RvcilmcmFtZV9kZWFsbG9jLAkJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfY29tcGFyZSAqLwotCTAsCQkJCQkvKiB0cF9yZXByICovCi0JMCwJCQkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJCQkJCS8qIHRwX2hhc2ggKi8KLQkwLAkJCQkJLyogdHBfY2FsbCAqLwotCTAsCQkJCQkvKiB0cF9zdHIgKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJCS8qIHRwX2dldGF0dHJvICovCi0JUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsLyogdHBfZmxhZ3MgKi8KLQkwLAkJCQkJLyogdHBfZG9jICovCi0JKHRyYXZlcnNlcHJvYylmcmFtZV90cmF2ZXJzZSwJCS8qIHRwX3RyYXZlcnNlICovCi0JKGlucXVpcnkpZnJhbWVfY2xlYXIsCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaXRlciAqLwotCTAsCQkJCQkvKiB0cF9pdGVybmV4dCAqLwotCWZyYW1lX21ldGhvZHMsCQkJCS8qIHRwX21ldGhvZHMgKi8KLQlmcmFtZV9tZW1iZXJsaXN0LAkJCS8qIHRwX21lbWJlcnMgKi8KLQlmcmFtZV9nZXRzZXRsaXN0LAkJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJCS8qIHRwX2RpY3QgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQorICAgICJmcmFtZSIsCisgICAgc2l6ZW9mKFB5RnJhbWVPYmplY3QpLAorICAgIHNpemVvZihQeU9iamVjdCAqKSwKKyAgICAoZGVzdHJ1Y3RvcilmcmFtZV9kZWFsbG9jLCAgICAgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDLC8qIHRwX2ZsYWdzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAodHJhdmVyc2Vwcm9jKWZyYW1lX3RyYXZlcnNlLCAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgKGlucXVpcnkpZnJhbWVfY2xlYXIsICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIGZyYW1lX21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIGZyYW1lX21lbWJlcmxpc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIGZyYW1lX2dldHNldGxpc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKmJ1aWx0aW5fb2JqZWN0OwogCiBpbnQgX1B5RnJhbWVfSW5pdCgpCiB7Ci0JYnVpbHRpbl9vYmplY3QgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2J1aWx0aW5zX18iKTsKLQlpZiAoYnVpbHRpbl9vYmplY3QgPT0gTlVMTCkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIDE7CisgICAgYnVpbHRpbl9vYmplY3QgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2J1aWx0aW5zX18iKTsKKyAgICBpZiAoYnVpbHRpbl9vYmplY3QgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIDE7CiB9CiAKIFB5RnJhbWVPYmplY3QgKgogUHlGcmFtZV9OZXcoUHlUaHJlYWRTdGF0ZSAqdHN0YXRlLCBQeUNvZGVPYmplY3QgKmNvZGUsIFB5T2JqZWN0ICpnbG9iYWxzLAotCSAgICBQeU9iamVjdCAqbG9jYWxzKQorICAgICAgICAgICAgUHlPYmplY3QgKmxvY2FscykKIHsKLQlQeUZyYW1lT2JqZWN0ICpiYWNrID0gdHN0YXRlLT5mcmFtZTsKLQlQeUZyYW1lT2JqZWN0ICpmOwotCVB5T2JqZWN0ICpidWlsdGluczsKLQlQeV9zc2l6ZV90IGk7CisgICAgUHlGcmFtZU9iamVjdCAqYmFjayA9IHRzdGF0ZS0+ZnJhbWU7CisgICAgUHlGcmFtZU9iamVjdCAqZjsKKyAgICBQeU9iamVjdCAqYnVpbHRpbnM7CisgICAgUHlfc3NpemVfdCBpOwogCiAjaWZkZWYgUHlfREVCVUcKLQlpZiAoY29kZSA9PSBOVUxMIHx8IGdsb2JhbHMgPT0gTlVMTCB8fCAhUHlEaWN0X0NoZWNrKGdsb2JhbHMpIHx8Ci0JICAgIChsb2NhbHMgIT0gTlVMTCAmJiAhUHlNYXBwaW5nX0NoZWNrKGxvY2FscykpKSB7Ci0JCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKGNvZGUgPT0gTlVMTCB8fCBnbG9iYWxzID09IE5VTEwgfHwgIVB5RGljdF9DaGVjayhnbG9iYWxzKSB8fAorICAgICAgICAobG9jYWxzICE9IE5VTEwgJiYgIVB5TWFwcGluZ19DaGVjayhsb2NhbHMpKSkgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogI2VuZGlmCi0JaWYgKGJhY2sgPT0gTlVMTCB8fCBiYWNrLT5mX2dsb2JhbHMgIT0gZ2xvYmFscykgewotCQlidWlsdGlucyA9IFB5RGljdF9HZXRJdGVtKGdsb2JhbHMsIGJ1aWx0aW5fb2JqZWN0KTsKLQkJaWYgKGJ1aWx0aW5zKSB7Ci0JCQlpZiAoUHlNb2R1bGVfQ2hlY2soYnVpbHRpbnMpKSB7Ci0JCQkJYnVpbHRpbnMgPSBQeU1vZHVsZV9HZXREaWN0KGJ1aWx0aW5zKTsKLQkJCQlhc3NlcnQoIWJ1aWx0aW5zIHx8IFB5RGljdF9DaGVjayhidWlsdGlucykpOwotCQkJfQotCQkJZWxzZSBpZiAoIVB5RGljdF9DaGVjayhidWlsdGlucykpCi0JCQkJYnVpbHRpbnMgPSBOVUxMOwotCQl9Ci0JCWlmIChidWlsdGlucyA9PSBOVUxMKSB7Ci0JCQkvKiBObyBidWlsdGlucyEJIE1ha2UgdXAgYSBtaW5pbWFsIG9uZQotCQkJICAgR2l2ZSB0aGVtICdOb25lJywgYXQgbGVhc3QuICovCi0JCQlidWlsdGlucyA9IFB5RGljdF9OZXcoKTsKLQkJCWlmIChidWlsdGlucyA9PSBOVUxMIHx8Ci0JCQkgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoCi0JCQkJICAgIGJ1aWx0aW5zLCAiTm9uZSIsIFB5X05vbmUpIDwgMCkKLQkJCQlyZXR1cm4gTlVMTDsKLQkJfQotCQllbHNlCi0JCQlQeV9JTkNSRUYoYnVpbHRpbnMpOworICAgIGlmIChiYWNrID09IE5VTEwgfHwgYmFjay0+Zl9nbG9iYWxzICE9IGdsb2JhbHMpIHsKKyAgICAgICAgYnVpbHRpbnMgPSBQeURpY3RfR2V0SXRlbShnbG9iYWxzLCBidWlsdGluX29iamVjdCk7CisgICAgICAgIGlmIChidWlsdGlucykgeworICAgICAgICAgICAgaWYgKFB5TW9kdWxlX0NoZWNrKGJ1aWx0aW5zKSkgeworICAgICAgICAgICAgICAgIGJ1aWx0aW5zID0gUHlNb2R1bGVfR2V0RGljdChidWlsdGlucyk7CisgICAgICAgICAgICAgICAgYXNzZXJ0KCFidWlsdGlucyB8fCBQeURpY3RfQ2hlY2soYnVpbHRpbnMpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCFQeURpY3RfQ2hlY2soYnVpbHRpbnMpKQorICAgICAgICAgICAgICAgIGJ1aWx0aW5zID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoYnVpbHRpbnMgPT0gTlVMTCkgeworICAgICAgICAgICAgLyogTm8gYnVpbHRpbnMhICAgICAgICAgICAgICBNYWtlIHVwIGEgbWluaW1hbCBvbmUKKyAgICAgICAgICAgICAgIEdpdmUgdGhlbSAnTm9uZScsIGF0IGxlYXN0LiAqLworICAgICAgICAgICAgYnVpbHRpbnMgPSBQeURpY3RfTmV3KCk7CisgICAgICAgICAgICBpZiAoYnVpbHRpbnMgPT0gTlVMTCB8fAorICAgICAgICAgICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKAorICAgICAgICAgICAgICAgICAgICBidWlsdGlucywgIk5vbmUiLCBQeV9Ob25lKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgUHlfSU5DUkVGKGJ1aWx0aW5zKTsKIAotCX0KLQllbHNlIHsKLQkJLyogSWYgd2Ugc2hhcmUgdGhlIGdsb2JhbHMsIHdlIHNoYXJlIHRoZSBidWlsdGlucy4KLQkJICAgU2F2ZSBhIGxvb2t1cCBhbmQgYSBjYWxsLiAqLwotCQlidWlsdGlucyA9IGJhY2stPmZfYnVpbHRpbnM7Ci0JCWFzc2VydChidWlsdGlucyAhPSBOVUxMICYmIFB5RGljdF9DaGVjayhidWlsdGlucykpOwotCQlQeV9JTkNSRUYoYnVpbHRpbnMpOwotCX0KLQlpZiAoY29kZS0+Y29fem9tYmllZnJhbWUgIT0gTlVMTCkgewotCQlmID0gY29kZS0+Y29fem9tYmllZnJhbWU7Ci0JCWNvZGUtPmNvX3pvbWJpZWZyYW1lID0gTlVMTDsKLQkJX1B5X05ld1JlZmVyZW5jZSgoUHlPYmplY3QgKilmKTsKLQkJYXNzZXJ0KGYtPmZfY29kZSA9PSBjb2RlKTsKLQl9Ci0JZWxzZSB7Ci0JCVB5X3NzaXplX3QgZXh0cmFzLCBuY2VsbHMsIG5mcmVlczsKLQkJbmNlbGxzID0gUHlUdXBsZV9HRVRfU0laRShjb2RlLT5jb19jZWxsdmFycyk7Ci0JCW5mcmVlcyA9IFB5VHVwbGVfR0VUX1NJWkUoY29kZS0+Y29fZnJlZXZhcnMpOwotCQlleHRyYXMgPSBjb2RlLT5jb19zdGFja3NpemUgKyBjb2RlLT5jb19ubG9jYWxzICsgbmNlbGxzICsKLQkJICAgIG5mcmVlczsKLQkJaWYgKGZyZWVfbGlzdCA9PSBOVUxMKSB7Ci0JCSAgICBmID0gUHlPYmplY3RfR0NfTmV3VmFyKFB5RnJhbWVPYmplY3QsICZQeUZyYW1lX1R5cGUsCi0JCQlleHRyYXMpOwotCQkgICAgaWYgKGYgPT0gTlVMTCkgewotCQkJICAgIFB5X0RFQ1JFRihidWlsdGlucyk7Ci0JCQkgICAgcmV0dXJuIE5VTEw7Ci0JCSAgICB9Ci0JCX0KLQkJZWxzZSB7Ci0JCSAgICBhc3NlcnQobnVtZnJlZSA+IDApOwotCQkgICAgLS1udW1mcmVlOwotCQkgICAgZiA9IGZyZWVfbGlzdDsKLQkJICAgIGZyZWVfbGlzdCA9IGZyZWVfbGlzdC0+Zl9iYWNrOwotCQkgICAgaWYgKFB5X1NJWkUoZikgPCBleHRyYXMpIHsKLQkJCSAgICBmID0gUHlPYmplY3RfR0NfUmVzaXplKFB5RnJhbWVPYmplY3QsIGYsIGV4dHJhcyk7Ci0JCQkgICAgaWYgKGYgPT0gTlVMTCkgewotCQkJCSAgICBQeV9ERUNSRUYoYnVpbHRpbnMpOwotCQkJCSAgICByZXR1cm4gTlVMTDsKLQkJCSAgICB9Ci0JCSAgICB9Ci0JCSAgICBfUHlfTmV3UmVmZXJlbmNlKChQeU9iamVjdCAqKWYpOwotCQl9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvKiBJZiB3ZSBzaGFyZSB0aGUgZ2xvYmFscywgd2Ugc2hhcmUgdGhlIGJ1aWx0aW5zLgorICAgICAgICAgICBTYXZlIGEgbG9va3VwIGFuZCBhIGNhbGwuICovCisgICAgICAgIGJ1aWx0aW5zID0gYmFjay0+Zl9idWlsdGluczsKKyAgICAgICAgYXNzZXJ0KGJ1aWx0aW5zICE9IE5VTEwgJiYgUHlEaWN0X0NoZWNrKGJ1aWx0aW5zKSk7CisgICAgICAgIFB5X0lOQ1JFRihidWlsdGlucyk7CisgICAgfQorICAgIGlmIChjb2RlLT5jb196b21iaWVmcmFtZSAhPSBOVUxMKSB7CisgICAgICAgIGYgPSBjb2RlLT5jb196b21iaWVmcmFtZTsKKyAgICAgICAgY29kZS0+Y29fem9tYmllZnJhbWUgPSBOVUxMOworICAgICAgICBfUHlfTmV3UmVmZXJlbmNlKChQeU9iamVjdCAqKWYpOworICAgICAgICBhc3NlcnQoZi0+Zl9jb2RlID09IGNvZGUpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgUHlfc3NpemVfdCBleHRyYXMsIG5jZWxscywgbmZyZWVzOworICAgICAgICBuY2VsbHMgPSBQeVR1cGxlX0dFVF9TSVpFKGNvZGUtPmNvX2NlbGx2YXJzKTsKKyAgICAgICAgbmZyZWVzID0gUHlUdXBsZV9HRVRfU0laRShjb2RlLT5jb19mcmVldmFycyk7CisgICAgICAgIGV4dHJhcyA9IGNvZGUtPmNvX3N0YWNrc2l6ZSArIGNvZGUtPmNvX25sb2NhbHMgKyBuY2VsbHMgKworICAgICAgICAgICAgbmZyZWVzOworICAgICAgICBpZiAoZnJlZV9saXN0ID09IE5VTEwpIHsKKyAgICAgICAgICAgIGYgPSBQeU9iamVjdF9HQ19OZXdWYXIoUHlGcmFtZU9iamVjdCwgJlB5RnJhbWVfVHlwZSwKKyAgICAgICAgICAgIGV4dHJhcyk7CisgICAgICAgICAgICBpZiAoZiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGJ1aWx0aW5zKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGFzc2VydChudW1mcmVlID4gMCk7CisgICAgICAgICAgICAtLW51bWZyZWU7CisgICAgICAgICAgICBmID0gZnJlZV9saXN0OworICAgICAgICAgICAgZnJlZV9saXN0ID0gZnJlZV9saXN0LT5mX2JhY2s7CisgICAgICAgICAgICBpZiAoUHlfU0laRShmKSA8IGV4dHJhcykgeworICAgICAgICAgICAgICAgIGYgPSBQeU9iamVjdF9HQ19SZXNpemUoUHlGcmFtZU9iamVjdCwgZiwgZXh0cmFzKTsKKyAgICAgICAgICAgICAgICBpZiAoZiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihidWlsdGlucyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9QeV9OZXdSZWZlcmVuY2UoKFB5T2JqZWN0ICopZik7CisgICAgICAgIH0KIAotCQlmLT5mX2NvZGUgPSBjb2RlOwotCQlleHRyYXMgPSBjb2RlLT5jb19ubG9jYWxzICsgbmNlbGxzICsgbmZyZWVzOwotCQlmLT5mX3ZhbHVlc3RhY2sgPSBmLT5mX2xvY2Fsc3BsdXMgKyBleHRyYXM7Ci0JCWZvciAoaT0wOyBpPGV4dHJhczsgaSsrKQotCQkJZi0+Zl9sb2NhbHNwbHVzW2ldID0gTlVMTDsKLQkJZi0+Zl9sb2NhbHMgPSBOVUxMOwotCQlmLT5mX3RyYWNlID0gTlVMTDsKLQkJZi0+Zl9leGNfdHlwZSA9IGYtPmZfZXhjX3ZhbHVlID0gZi0+Zl9leGNfdHJhY2ViYWNrID0gTlVMTDsKLQl9Ci0JZi0+Zl9zdGFja3RvcCA9IGYtPmZfdmFsdWVzdGFjazsKLQlmLT5mX2J1aWx0aW5zID0gYnVpbHRpbnM7Ci0JUHlfWElOQ1JFRihiYWNrKTsKLQlmLT5mX2JhY2sgPSBiYWNrOwotCVB5X0lOQ1JFRihjb2RlKTsKLQlQeV9JTkNSRUYoZ2xvYmFscyk7Ci0JZi0+Zl9nbG9iYWxzID0gZ2xvYmFsczsKLQkvKiBNb3N0IGZ1bmN0aW9ucyBoYXZlIENPX05FV0xPQ0FMUyBhbmQgQ09fT1BUSU1JWkVEIHNldC4gKi8KLQlpZiAoKGNvZGUtPmNvX2ZsYWdzICYgKENPX05FV0xPQ0FMUyB8IENPX09QVElNSVpFRCkpID09Ci0JCShDT19ORVdMT0NBTFMgfCBDT19PUFRJTUlaRUQpKQotCQk7IC8qIGZfbG9jYWxzID0gTlVMTDsgd2lsbCBiZSBzZXQgYnkgUHlGcmFtZV9GYXN0VG9Mb2NhbHMoKSAqLwotCWVsc2UgaWYgKGNvZGUtPmNvX2ZsYWdzICYgQ09fTkVXTE9DQUxTKSB7Ci0JCWxvY2FscyA9IFB5RGljdF9OZXcoKTsKLQkJaWYgKGxvY2FscyA9PSBOVUxMKSB7Ci0JCQlQeV9ERUNSRUYoZik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlmLT5mX2xvY2FscyA9IGxvY2FsczsKLQl9Ci0JZWxzZSB7Ci0JCWlmIChsb2NhbHMgPT0gTlVMTCkKLQkJCWxvY2FscyA9IGdsb2JhbHM7Ci0JCVB5X0lOQ1JFRihsb2NhbHMpOwotCQlmLT5mX2xvY2FscyA9IGxvY2FsczsKLQl9Ci0JZi0+Zl90c3RhdGUgPSB0c3RhdGU7CisgICAgICAgIGYtPmZfY29kZSA9IGNvZGU7CisgICAgICAgIGV4dHJhcyA9IGNvZGUtPmNvX25sb2NhbHMgKyBuY2VsbHMgKyBuZnJlZXM7CisgICAgICAgIGYtPmZfdmFsdWVzdGFjayA9IGYtPmZfbG9jYWxzcGx1cyArIGV4dHJhczsKKyAgICAgICAgZm9yIChpPTA7IGk8ZXh0cmFzOyBpKyspCisgICAgICAgICAgICBmLT5mX2xvY2Fsc3BsdXNbaV0gPSBOVUxMOworICAgICAgICBmLT5mX2xvY2FscyA9IE5VTEw7CisgICAgICAgIGYtPmZfdHJhY2UgPSBOVUxMOworICAgICAgICBmLT5mX2V4Y190eXBlID0gZi0+Zl9leGNfdmFsdWUgPSBmLT5mX2V4Y190cmFjZWJhY2sgPSBOVUxMOworICAgIH0KKyAgICBmLT5mX3N0YWNrdG9wID0gZi0+Zl92YWx1ZXN0YWNrOworICAgIGYtPmZfYnVpbHRpbnMgPSBidWlsdGluczsKKyAgICBQeV9YSU5DUkVGKGJhY2spOworICAgIGYtPmZfYmFjayA9IGJhY2s7CisgICAgUHlfSU5DUkVGKGNvZGUpOworICAgIFB5X0lOQ1JFRihnbG9iYWxzKTsKKyAgICBmLT5mX2dsb2JhbHMgPSBnbG9iYWxzOworICAgIC8qIE1vc3QgZnVuY3Rpb25zIGhhdmUgQ09fTkVXTE9DQUxTIGFuZCBDT19PUFRJTUlaRUQgc2V0LiAqLworICAgIGlmICgoY29kZS0+Y29fZmxhZ3MgJiAoQ09fTkVXTE9DQUxTIHwgQ09fT1BUSU1JWkVEKSkgPT0KKyAgICAgICAgKENPX05FV0xPQ0FMUyB8IENPX09QVElNSVpFRCkpCisgICAgICAgIDsgLyogZl9sb2NhbHMgPSBOVUxMOyB3aWxsIGJlIHNldCBieSBQeUZyYW1lX0Zhc3RUb0xvY2FscygpICovCisgICAgZWxzZSBpZiAoY29kZS0+Y29fZmxhZ3MgJiBDT19ORVdMT0NBTFMpIHsKKyAgICAgICAgbG9jYWxzID0gUHlEaWN0X05ldygpOworICAgICAgICBpZiAobG9jYWxzID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihmKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGYtPmZfbG9jYWxzID0gbG9jYWxzOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKGxvY2FscyA9PSBOVUxMKQorICAgICAgICAgICAgbG9jYWxzID0gZ2xvYmFsczsKKyAgICAgICAgUHlfSU5DUkVGKGxvY2Fscyk7CisgICAgICAgIGYtPmZfbG9jYWxzID0gbG9jYWxzOworICAgIH0KKyAgICBmLT5mX3RzdGF0ZSA9IHRzdGF0ZTsKIAotCWYtPmZfbGFzdGkgPSAtMTsKLQlmLT5mX2xpbmVubyA9IGNvZGUtPmNvX2ZpcnN0bGluZW5vOwotCWYtPmZfaWJsb2NrID0gMDsKKyAgICBmLT5mX2xhc3RpID0gLTE7CisgICAgZi0+Zl9saW5lbm8gPSBjb2RlLT5jb19maXJzdGxpbmVubzsKKyAgICBmLT5mX2libG9jayA9IDA7CiAKLQlfUHlPYmplY3RfR0NfVFJBQ0soZik7Ci0JcmV0dXJuIGY7CisgICAgX1B5T2JqZWN0X0dDX1RSQUNLKGYpOworICAgIHJldHVybiBmOwogfQogCiAvKiBCbG9jayBtYW5hZ2VtZW50ICovCkBAIC03MTAsMjggKzcxMCwyOCBAQAogdm9pZAogUHlGcmFtZV9CbG9ja1NldHVwKFB5RnJhbWVPYmplY3QgKmYsIGludCB0eXBlLCBpbnQgaGFuZGxlciwgaW50IGxldmVsKQogewotCVB5VHJ5QmxvY2sgKmI7Ci0JaWYgKGYtPmZfaWJsb2NrID49IENPX01BWEJMT0NLUykKLQkJUHlfRmF0YWxFcnJvcigiWFhYIGJsb2NrIHN0YWNrIG92ZXJmbG93Iik7Ci0JYiA9ICZmLT5mX2Jsb2Nrc3RhY2tbZi0+Zl9pYmxvY2srK107Ci0JYi0+Yl90eXBlID0gdHlwZTsKLQliLT5iX2xldmVsID0gbGV2ZWw7Ci0JYi0+Yl9oYW5kbGVyID0gaGFuZGxlcjsKKyAgICBQeVRyeUJsb2NrICpiOworICAgIGlmIChmLT5mX2libG9jayA+PSBDT19NQVhCTE9DS1MpCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIlhYWCBibG9jayBzdGFjayBvdmVyZmxvdyIpOworICAgIGIgPSAmZi0+Zl9ibG9ja3N0YWNrW2YtPmZfaWJsb2NrKytdOworICAgIGItPmJfdHlwZSA9IHR5cGU7CisgICAgYi0+Yl9sZXZlbCA9IGxldmVsOworICAgIGItPmJfaGFuZGxlciA9IGhhbmRsZXI7CiB9CiAKIFB5VHJ5QmxvY2sgKgogUHlGcmFtZV9CbG9ja1BvcChQeUZyYW1lT2JqZWN0ICpmKQogewotCVB5VHJ5QmxvY2sgKmI7Ci0JaWYgKGYtPmZfaWJsb2NrIDw9IDApCi0JCVB5X0ZhdGFsRXJyb3IoIlhYWCBibG9jayBzdGFjayB1bmRlcmZsb3ciKTsKLQliID0gJmYtPmZfYmxvY2tzdGFja1stLWYtPmZfaWJsb2NrXTsKLQlyZXR1cm4gYjsKKyAgICBQeVRyeUJsb2NrICpiOworICAgIGlmIChmLT5mX2libG9jayA8PSAwKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJYWFggYmxvY2sgc3RhY2sgdW5kZXJmbG93Iik7CisgICAgYiA9ICZmLT5mX2Jsb2Nrc3RhY2tbLS1mLT5mX2libG9ja107CisgICAgcmV0dXJuIGI7CiB9CiAKIC8qIENvbnZlcnQgYmV0d2VlbiAiZmFzdCIgdmVyc2lvbiBvZiBsb2NhbHMgYW5kIGRpY3Rpb25hcnkgdmVyc2lvbi4KLSAgIAotICAgbWFwIGFuZCB2YWx1ZXMgYXJlIGlucHV0IGFyZ3VtZW50cy4JbWFwIGlzIGEgdHVwbGUgb2Ygc3RyaW5ncy4KKworICAgbWFwIGFuZCB2YWx1ZXMgYXJlIGlucHV0IGFyZ3VtZW50cy4gIG1hcCBpcyBhIHR1cGxlIG9mIHN0cmluZ3MuCiAgICB2YWx1ZXMgaXMgYW4gYXJyYXkgb2YgUHlPYmplY3QqLiAgQXQgaW5kZXggaSwgbWFwW2ldIGlzIHRoZSBuYW1lIG9mCiAgICB0aGUgdmFyaWFibGUgd2l0aCB2YWx1ZSB2YWx1ZXNbaV0uICBUaGUgZnVuY3Rpb24gY29waWVzIHRoZSBmaXJzdAogICAgbm1hcCB2YXJpYWJsZSBmcm9tIG1hcC92YWx1ZXMgaW50byBkaWN0LiAgSWYgdmFsdWVzW2ldIGlzIE5VTEwsCkBAIC03NDcsMjkgKzc0NywyOSBAQAogCiBzdGF0aWMgdm9pZAogbWFwX3RvX2RpY3QoUHlPYmplY3QgKm1hcCwgUHlfc3NpemVfdCBubWFwLCBQeU9iamVjdCAqZGljdCwgUHlPYmplY3QgKip2YWx1ZXMsCi0JICAgIGludCBkZXJlZikKKyAgICAgICAgICAgIGludCBkZXJlZikKIHsKLQlQeV9zc2l6ZV90IGo7Ci0JYXNzZXJ0KFB5VHVwbGVfQ2hlY2sobWFwKSk7Ci0JYXNzZXJ0KFB5RGljdF9DaGVjayhkaWN0KSk7Ci0JYXNzZXJ0KFB5VHVwbGVfU2l6ZShtYXApID49IG5tYXApOwotCWZvciAoaiA9IG5tYXA7IC0taiA+PSAwOyApIHsKLQkJUHlPYmplY3QgKmtleSA9IFB5VHVwbGVfR0VUX0lURU0obWFwLCBqKTsKLQkJUHlPYmplY3QgKnZhbHVlID0gdmFsdWVzW2pdOwotCQlhc3NlcnQoUHlTdHJpbmdfQ2hlY2soa2V5KSk7Ci0JCWlmIChkZXJlZikgewotCQkJYXNzZXJ0KFB5Q2VsbF9DaGVjayh2YWx1ZSkpOwotCQkJdmFsdWUgPSBQeUNlbGxfR0VUKHZhbHVlKTsKLQkJfQotCQlpZiAodmFsdWUgPT0gTlVMTCkgewotCQkJaWYgKFB5T2JqZWN0X0RlbEl0ZW0oZGljdCwga2V5KSAhPSAwKQotCQkJCVB5RXJyX0NsZWFyKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoUHlPYmplY3RfU2V0SXRlbShkaWN0LCBrZXksIHZhbHVlKSAhPSAwKQotCQkJCVB5RXJyX0NsZWFyKCk7Ci0JCX0KLQl9CisgICAgUHlfc3NpemVfdCBqOworICAgIGFzc2VydChQeVR1cGxlX0NoZWNrKG1hcCkpOworICAgIGFzc2VydChQeURpY3RfQ2hlY2soZGljdCkpOworICAgIGFzc2VydChQeVR1cGxlX1NpemUobWFwKSA+PSBubWFwKTsKKyAgICBmb3IgKGogPSBubWFwOyAtLWogPj0gMDsgKSB7CisgICAgICAgIFB5T2JqZWN0ICprZXkgPSBQeVR1cGxlX0dFVF9JVEVNKG1hcCwgaik7CisgICAgICAgIFB5T2JqZWN0ICp2YWx1ZSA9IHZhbHVlc1tqXTsKKyAgICAgICAgYXNzZXJ0KFB5U3RyaW5nX0NoZWNrKGtleSkpOworICAgICAgICBpZiAoZGVyZWYpIHsKKyAgICAgICAgICAgIGFzc2VydChQeUNlbGxfQ2hlY2sodmFsdWUpKTsKKyAgICAgICAgICAgIHZhbHVlID0gUHlDZWxsX0dFVCh2YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZhbHVlID09IE5VTEwpIHsKKyAgICAgICAgICAgIGlmIChQeU9iamVjdF9EZWxJdGVtKGRpY3QsIGtleSkgIT0gMCkKKyAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKFB5T2JqZWN0X1NldEl0ZW0oZGljdCwga2V5LCB2YWx1ZSkgIT0gMCkKKyAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICB9CisgICAgfQogfQogCiAvKiBDb3B5IHZhbHVlcyBmcm9tIHRoZSAibG9jYWxzIiBkaWN0IGludG8gdGhlIGZhc3QgbG9jYWxzLgpAQCAtNzc3LDcgKzc3Nyw3IEBACiAgICBkaWN0IGlzIGFuIGlucHV0IGFyZ3VtZW50IGNvbnRhaW5pbmcgc3RyaW5nIGtleXMgcmVwcmVzZW50aW5nCiAgICB2YXJpYWJsZXMgbmFtZXMgYW5kIGFyYml0cmFyeSBQeU9iamVjdCogYXMgdmFsdWVzLgogCi0gICBtYXAgYW5kIHZhbHVlcyBhcmUgaW5wdXQgYXJndW1lbnRzLgltYXAgaXMgYSB0dXBsZSBvZiBzdHJpbmdzLgorICAgbWFwIGFuZCB2YWx1ZXMgYXJlIGlucHV0IGFyZ3VtZW50cy4gIG1hcCBpcyBhIHR1cGxlIG9mIHN0cmluZ3MuCiAgICB2YWx1ZXMgaXMgYW4gYXJyYXkgb2YgUHlPYmplY3QqLiAgQXQgaW5kZXggaSwgbWFwW2ldIGlzIHRoZSBuYW1lIG9mCiAgICB0aGUgdmFyaWFibGUgd2l0aCB2YWx1ZSB2YWx1ZXNbaV0uICBUaGUgZnVuY3Rpb24gY29waWVzIHRoZSBmaXJzdAogICAgbm1hcCB2YXJpYWJsZSBmcm9tIG1hcC92YWx1ZXMgaW50byBkaWN0LiAgSWYgdmFsdWVzW2ldIGlzIE5VTEwsCkBAIC03OTUsMTUwICs3OTUsMTUwIEBACiAKIHN0YXRpYyB2b2lkCiBkaWN0X3RvX21hcChQeU9iamVjdCAqbWFwLCBQeV9zc2l6ZV90IG5tYXAsIFB5T2JqZWN0ICpkaWN0LCBQeU9iamVjdCAqKnZhbHVlcywKLQkgICAgaW50IGRlcmVmLCBpbnQgY2xlYXIpCisgICAgICAgICAgICBpbnQgZGVyZWYsIGludCBjbGVhcikKIHsKLQlQeV9zc2l6ZV90IGo7Ci0JYXNzZXJ0KFB5VHVwbGVfQ2hlY2sobWFwKSk7Ci0JYXNzZXJ0KFB5RGljdF9DaGVjayhkaWN0KSk7Ci0JYXNzZXJ0KFB5VHVwbGVfU2l6ZShtYXApID49IG5tYXApOwotCWZvciAoaiA9IG5tYXA7IC0taiA+PSAwOyApIHsKLQkJUHlPYmplY3QgKmtleSA9IFB5VHVwbGVfR0VUX0lURU0obWFwLCBqKTsKLQkJUHlPYmplY3QgKnZhbHVlID0gUHlPYmplY3RfR2V0SXRlbShkaWN0LCBrZXkpOwotCQlhc3NlcnQoUHlTdHJpbmdfQ2hlY2soa2V5KSk7Ci0JCS8qIFdlIG9ubHkgY2FyZSBhYm91dCBOVUxMcyBpZiBjbGVhciBpcyB0cnVlLiAqLwotCQlpZiAodmFsdWUgPT0gTlVMTCkgewotCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCWlmICghY2xlYXIpCi0JCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKGRlcmVmKSB7Ci0JCQlhc3NlcnQoUHlDZWxsX0NoZWNrKHZhbHVlc1tqXSkpOwotCQkJaWYgKFB5Q2VsbF9HRVQodmFsdWVzW2pdKSAhPSB2YWx1ZSkgewotCQkJCWlmIChQeUNlbGxfU2V0KHZhbHVlc1tqXSwgdmFsdWUpIDwgMCkKLQkJCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCX0KLQkJfSBlbHNlIGlmICh2YWx1ZXNbal0gIT0gdmFsdWUpIHsKLQkJCVB5X1hJTkNSRUYodmFsdWUpOwotCQkJUHlfWERFQ1JFRih2YWx1ZXNbal0pOwotCQkJdmFsdWVzW2pdID0gdmFsdWU7Ci0JCX0KLQkJUHlfWERFQ1JFRih2YWx1ZSk7Ci0JfQorICAgIFB5X3NzaXplX3QgajsKKyAgICBhc3NlcnQoUHlUdXBsZV9DaGVjayhtYXApKTsKKyAgICBhc3NlcnQoUHlEaWN0X0NoZWNrKGRpY3QpKTsKKyAgICBhc3NlcnQoUHlUdXBsZV9TaXplKG1hcCkgPj0gbm1hcCk7CisgICAgZm9yIChqID0gbm1hcDsgLS1qID49IDA7ICkgeworICAgICAgICBQeU9iamVjdCAqa2V5ID0gUHlUdXBsZV9HRVRfSVRFTShtYXAsIGopOworICAgICAgICBQeU9iamVjdCAqdmFsdWUgPSBQeU9iamVjdF9HZXRJdGVtKGRpY3QsIGtleSk7CisgICAgICAgIGFzc2VydChQeVN0cmluZ19DaGVjayhrZXkpKTsKKyAgICAgICAgLyogV2Ugb25seSBjYXJlIGFib3V0IE5VTExzIGlmIGNsZWFyIGlzIHRydWUuICovCisgICAgICAgIGlmICh2YWx1ZSA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgaWYgKCFjbGVhcikKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGVyZWYpIHsKKyAgICAgICAgICAgIGFzc2VydChQeUNlbGxfQ2hlY2sodmFsdWVzW2pdKSk7CisgICAgICAgICAgICBpZiAoUHlDZWxsX0dFVCh2YWx1ZXNbal0pICE9IHZhbHVlKSB7CisgICAgICAgICAgICAgICAgaWYgKFB5Q2VsbF9TZXQodmFsdWVzW2pdLCB2YWx1ZSkgPCAwKQorICAgICAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHZhbHVlc1tqXSAhPSB2YWx1ZSkgeworICAgICAgICAgICAgUHlfWElOQ1JFRih2YWx1ZSk7CisgICAgICAgICAgICBQeV9YREVDUkVGKHZhbHVlc1tqXSk7CisgICAgICAgICAgICB2YWx1ZXNbal0gPSB2YWx1ZTsKKyAgICAgICAgfQorICAgICAgICBQeV9YREVDUkVGKHZhbHVlKTsKKyAgICB9CiB9CiAKIHZvaWQKIFB5RnJhbWVfRmFzdFRvTG9jYWxzKFB5RnJhbWVPYmplY3QgKmYpCiB7Ci0JLyogTWVyZ2UgZmFzdCBsb2NhbHMgaW50byBmLT5mX2xvY2FscyAqLwotCVB5T2JqZWN0ICpsb2NhbHMsICptYXA7Ci0JUHlPYmplY3QgKipmYXN0OwotCVB5T2JqZWN0ICplcnJvcl90eXBlLCAqZXJyb3JfdmFsdWUsICplcnJvcl90cmFjZWJhY2s7Ci0JUHlDb2RlT2JqZWN0ICpjbzsKLQlQeV9zc2l6ZV90IGo7Ci0JaW50IG5jZWxscywgbmZyZWV2YXJzOwotCWlmIChmID09IE5VTEwpCi0JCXJldHVybjsKLQlsb2NhbHMgPSBmLT5mX2xvY2FsczsKLQlpZiAobG9jYWxzID09IE5VTEwpIHsKLQkJbG9jYWxzID0gZi0+Zl9sb2NhbHMgPSBQeURpY3RfTmV3KCk7Ci0JCWlmIChsb2NhbHMgPT0gTlVMTCkgewotCQkJUHlFcnJfQ2xlYXIoKTsgLyogQ2FuJ3QgcmVwb3J0IGl0IDotKCAqLwotCQkJcmV0dXJuOwotCQl9Ci0JfQotCWNvID0gZi0+Zl9jb2RlOwotCW1hcCA9IGNvLT5jb192YXJuYW1lczsKLQlpZiAoIVB5VHVwbGVfQ2hlY2sobWFwKSkKLQkJcmV0dXJuOwotCVB5RXJyX0ZldGNoKCZlcnJvcl90eXBlLCAmZXJyb3JfdmFsdWUsICZlcnJvcl90cmFjZWJhY2spOwotCWZhc3QgPSBmLT5mX2xvY2Fsc3BsdXM7Ci0JaiA9IFB5VHVwbGVfR0VUX1NJWkUobWFwKTsKLQlpZiAoaiA+IGNvLT5jb19ubG9jYWxzKQotCQlqID0gY28tPmNvX25sb2NhbHM7Ci0JaWYgKGNvLT5jb19ubG9jYWxzKQotCQltYXBfdG9fZGljdChtYXAsIGosIGxvY2FscywgZmFzdCwgMCk7Ci0JbmNlbGxzID0gUHlUdXBsZV9HRVRfU0laRShjby0+Y29fY2VsbHZhcnMpOwotCW5mcmVldmFycyA9IFB5VHVwbGVfR0VUX1NJWkUoY28tPmNvX2ZyZWV2YXJzKTsKLQlpZiAobmNlbGxzIHx8IG5mcmVldmFycykgewotCQltYXBfdG9fZGljdChjby0+Y29fY2VsbHZhcnMsIG5jZWxscywKLQkJCSAgICBsb2NhbHMsIGZhc3QgKyBjby0+Y29fbmxvY2FscywgMSk7Ci0JCS8qIElmIHRoZSBuYW1lc3BhY2UgaXMgdW5vcHRpbWl6ZWQsIHRoZW4gb25lIG9mIHRoZSAKLQkJICAgZm9sbG93aW5nIGNhc2VzIGFwcGxpZXM6Ci0JCSAgIDEuIEl0IGRvZXMgbm90IGNvbnRhaW4gZnJlZSB2YXJpYWJsZXMsIGJlY2F1c2UgaXQKLQkJICAgICAgdXNlcyBpbXBvcnQgKiBvciBpcyBhIHRvcC1sZXZlbCBuYW1lc3BhY2UuCi0JCSAgIDIuIEl0IGlzIGEgY2xhc3MgbmFtZXNwYWNlLgotCQkgICBXZSBkb24ndCB3YW50IHRvIGFjY2lkZW50YWxseSBjb3B5IGZyZWUgdmFyaWFibGVzCi0JCSAgIGludG8gdGhlIGxvY2FscyBkaWN0IHVzZWQgYnkgdGhlIGNsYXNzLgotCQkqLwotCQlpZiAoY28tPmNvX2ZsYWdzICYgQ09fT1BUSU1JWkVEKSB7Ci0JCQltYXBfdG9fZGljdChjby0+Y29fZnJlZXZhcnMsIG5mcmVldmFycywKLQkJCQkgICAgbG9jYWxzLCBmYXN0ICsgY28tPmNvX25sb2NhbHMgKyBuY2VsbHMsIDEpOwotCQl9Ci0JfQotCVB5RXJyX1Jlc3RvcmUoZXJyb3JfdHlwZSwgZXJyb3JfdmFsdWUsIGVycm9yX3RyYWNlYmFjayk7CisgICAgLyogTWVyZ2UgZmFzdCBsb2NhbHMgaW50byBmLT5mX2xvY2FscyAqLworICAgIFB5T2JqZWN0ICpsb2NhbHMsICptYXA7CisgICAgUHlPYmplY3QgKipmYXN0OworICAgIFB5T2JqZWN0ICplcnJvcl90eXBlLCAqZXJyb3JfdmFsdWUsICplcnJvcl90cmFjZWJhY2s7CisgICAgUHlDb2RlT2JqZWN0ICpjbzsKKyAgICBQeV9zc2l6ZV90IGo7CisgICAgaW50IG5jZWxscywgbmZyZWV2YXJzOworICAgIGlmIChmID09IE5VTEwpCisgICAgICAgIHJldHVybjsKKyAgICBsb2NhbHMgPSBmLT5mX2xvY2FsczsKKyAgICBpZiAobG9jYWxzID09IE5VTEwpIHsKKyAgICAgICAgbG9jYWxzID0gZi0+Zl9sb2NhbHMgPSBQeURpY3RfTmV3KCk7CisgICAgICAgIGlmIChsb2NhbHMgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsgLyogQ2FuJ3QgcmVwb3J0IGl0IDotKCAqLworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIGNvID0gZi0+Zl9jb2RlOworICAgIG1hcCA9IGNvLT5jb192YXJuYW1lczsKKyAgICBpZiAoIVB5VHVwbGVfQ2hlY2sobWFwKSkKKyAgICAgICAgcmV0dXJuOworICAgIFB5RXJyX0ZldGNoKCZlcnJvcl90eXBlLCAmZXJyb3JfdmFsdWUsICZlcnJvcl90cmFjZWJhY2spOworICAgIGZhc3QgPSBmLT5mX2xvY2Fsc3BsdXM7CisgICAgaiA9IFB5VHVwbGVfR0VUX1NJWkUobWFwKTsKKyAgICBpZiAoaiA+IGNvLT5jb19ubG9jYWxzKQorICAgICAgICBqID0gY28tPmNvX25sb2NhbHM7CisgICAgaWYgKGNvLT5jb19ubG9jYWxzKQorICAgICAgICBtYXBfdG9fZGljdChtYXAsIGosIGxvY2FscywgZmFzdCwgMCk7CisgICAgbmNlbGxzID0gUHlUdXBsZV9HRVRfU0laRShjby0+Y29fY2VsbHZhcnMpOworICAgIG5mcmVldmFycyA9IFB5VHVwbGVfR0VUX1NJWkUoY28tPmNvX2ZyZWV2YXJzKTsKKyAgICBpZiAobmNlbGxzIHx8IG5mcmVldmFycykgeworICAgICAgICBtYXBfdG9fZGljdChjby0+Y29fY2VsbHZhcnMsIG5jZWxscywKKyAgICAgICAgICAgICAgICAgICAgbG9jYWxzLCBmYXN0ICsgY28tPmNvX25sb2NhbHMsIDEpOworICAgICAgICAvKiBJZiB0aGUgbmFtZXNwYWNlIGlzIHVub3B0aW1pemVkLCB0aGVuIG9uZSBvZiB0aGUKKyAgICAgICAgICAgZm9sbG93aW5nIGNhc2VzIGFwcGxpZXM6CisgICAgICAgICAgIDEuIEl0IGRvZXMgbm90IGNvbnRhaW4gZnJlZSB2YXJpYWJsZXMsIGJlY2F1c2UgaXQKKyAgICAgICAgICAgICAgdXNlcyBpbXBvcnQgKiBvciBpcyBhIHRvcC1sZXZlbCBuYW1lc3BhY2UuCisgICAgICAgICAgIDIuIEl0IGlzIGEgY2xhc3MgbmFtZXNwYWNlLgorICAgICAgICAgICBXZSBkb24ndCB3YW50IHRvIGFjY2lkZW50YWxseSBjb3B5IGZyZWUgdmFyaWFibGVzCisgICAgICAgICAgIGludG8gdGhlIGxvY2FscyBkaWN0IHVzZWQgYnkgdGhlIGNsYXNzLgorICAgICAgICAqLworICAgICAgICBpZiAoY28tPmNvX2ZsYWdzICYgQ09fT1BUSU1JWkVEKSB7CisgICAgICAgICAgICBtYXBfdG9fZGljdChjby0+Y29fZnJlZXZhcnMsIG5mcmVldmFycywKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FscywgZmFzdCArIGNvLT5jb19ubG9jYWxzICsgbmNlbGxzLCAxKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBQeUVycl9SZXN0b3JlKGVycm9yX3R5cGUsIGVycm9yX3ZhbHVlLCBlcnJvcl90cmFjZWJhY2spOwogfQogCiB2b2lkCiBQeUZyYW1lX0xvY2Fsc1RvRmFzdChQeUZyYW1lT2JqZWN0ICpmLCBpbnQgY2xlYXIpCiB7Ci0JLyogTWVyZ2UgZi0+Zl9sb2NhbHMgaW50byBmYXN0IGxvY2FscyAqLwotCVB5T2JqZWN0ICpsb2NhbHMsICptYXA7Ci0JUHlPYmplY3QgKipmYXN0OwotCVB5T2JqZWN0ICplcnJvcl90eXBlLCAqZXJyb3JfdmFsdWUsICplcnJvcl90cmFjZWJhY2s7Ci0JUHlDb2RlT2JqZWN0ICpjbzsKLQlQeV9zc2l6ZV90IGo7Ci0JaW50IG5jZWxscywgbmZyZWV2YXJzOwotCWlmIChmID09IE5VTEwpCi0JCXJldHVybjsKLQlsb2NhbHMgPSBmLT5mX2xvY2FsczsKLQljbyA9IGYtPmZfY29kZTsKLQltYXAgPSBjby0+Y29fdmFybmFtZXM7Ci0JaWYgKGxvY2FscyA9PSBOVUxMKQotCQlyZXR1cm47Ci0JaWYgKCFQeVR1cGxlX0NoZWNrKG1hcCkpCi0JCXJldHVybjsKLQlQeUVycl9GZXRjaCgmZXJyb3JfdHlwZSwgJmVycm9yX3ZhbHVlLCAmZXJyb3JfdHJhY2ViYWNrKTsKLQlmYXN0ID0gZi0+Zl9sb2NhbHNwbHVzOwotCWogPSBQeVR1cGxlX0dFVF9TSVpFKG1hcCk7Ci0JaWYgKGogPiBjby0+Y29fbmxvY2FscykKLQkJaiA9IGNvLT5jb19ubG9jYWxzOwotCWlmIChjby0+Y29fbmxvY2FscykKLQkgICAgZGljdF90b19tYXAoY28tPmNvX3Zhcm5hbWVzLCBqLCBsb2NhbHMsIGZhc3QsIDAsIGNsZWFyKTsKLQluY2VsbHMgPSBQeVR1cGxlX0dFVF9TSVpFKGNvLT5jb19jZWxsdmFycyk7Ci0JbmZyZWV2YXJzID0gUHlUdXBsZV9HRVRfU0laRShjby0+Y29fZnJlZXZhcnMpOwotCWlmIChuY2VsbHMgfHwgbmZyZWV2YXJzKSB7Ci0JCWRpY3RfdG9fbWFwKGNvLT5jb19jZWxsdmFycywgbmNlbGxzLAotCQkJICAgIGxvY2FscywgZmFzdCArIGNvLT5jb19ubG9jYWxzLCAxLCBjbGVhcik7Ci0JCS8qIFNhbWUgdGVzdCBhcyBpbiBQeUZyYW1lX0Zhc3RUb0xvY2FscygpIGFib3ZlLiAqLwotCQlpZiAoY28tPmNvX2ZsYWdzICYgQ09fT1BUSU1JWkVEKSB7Ci0JCQlkaWN0X3RvX21hcChjby0+Y29fZnJlZXZhcnMsIG5mcmVldmFycywKLQkJCSAgICAgICAgbG9jYWxzLCBmYXN0ICsgY28tPmNvX25sb2NhbHMgKyBuY2VsbHMsIDEsIAotCQkJICAgICAgICBjbGVhcik7Ci0JCX0KLQl9Ci0JUHlFcnJfUmVzdG9yZShlcnJvcl90eXBlLCBlcnJvcl92YWx1ZSwgZXJyb3JfdHJhY2ViYWNrKTsKKyAgICAvKiBNZXJnZSBmLT5mX2xvY2FscyBpbnRvIGZhc3QgbG9jYWxzICovCisgICAgUHlPYmplY3QgKmxvY2FscywgKm1hcDsKKyAgICBQeU9iamVjdCAqKmZhc3Q7CisgICAgUHlPYmplY3QgKmVycm9yX3R5cGUsICplcnJvcl92YWx1ZSwgKmVycm9yX3RyYWNlYmFjazsKKyAgICBQeUNvZGVPYmplY3QgKmNvOworICAgIFB5X3NzaXplX3QgajsKKyAgICBpbnQgbmNlbGxzLCBuZnJlZXZhcnM7CisgICAgaWYgKGYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOworICAgIGxvY2FscyA9IGYtPmZfbG9jYWxzOworICAgIGNvID0gZi0+Zl9jb2RlOworICAgIG1hcCA9IGNvLT5jb192YXJuYW1lczsKKyAgICBpZiAobG9jYWxzID09IE5VTEwpCisgICAgICAgIHJldHVybjsKKyAgICBpZiAoIVB5VHVwbGVfQ2hlY2sobWFwKSkKKyAgICAgICAgcmV0dXJuOworICAgIFB5RXJyX0ZldGNoKCZlcnJvcl90eXBlLCAmZXJyb3JfdmFsdWUsICZlcnJvcl90cmFjZWJhY2spOworICAgIGZhc3QgPSBmLT5mX2xvY2Fsc3BsdXM7CisgICAgaiA9IFB5VHVwbGVfR0VUX1NJWkUobWFwKTsKKyAgICBpZiAoaiA+IGNvLT5jb19ubG9jYWxzKQorICAgICAgICBqID0gY28tPmNvX25sb2NhbHM7CisgICAgaWYgKGNvLT5jb19ubG9jYWxzKQorICAgICAgICBkaWN0X3RvX21hcChjby0+Y29fdmFybmFtZXMsIGosIGxvY2FscywgZmFzdCwgMCwgY2xlYXIpOworICAgIG5jZWxscyA9IFB5VHVwbGVfR0VUX1NJWkUoY28tPmNvX2NlbGx2YXJzKTsKKyAgICBuZnJlZXZhcnMgPSBQeVR1cGxlX0dFVF9TSVpFKGNvLT5jb19mcmVldmFycyk7CisgICAgaWYgKG5jZWxscyB8fCBuZnJlZXZhcnMpIHsKKyAgICAgICAgZGljdF90b19tYXAoY28tPmNvX2NlbGx2YXJzLCBuY2VsbHMsCisgICAgICAgICAgICAgICAgICAgIGxvY2FscywgZmFzdCArIGNvLT5jb19ubG9jYWxzLCAxLCBjbGVhcik7CisgICAgICAgIC8qIFNhbWUgdGVzdCBhcyBpbiBQeUZyYW1lX0Zhc3RUb0xvY2FscygpIGFib3ZlLiAqLworICAgICAgICBpZiAoY28tPmNvX2ZsYWdzICYgQ09fT1BUSU1JWkVEKSB7CisgICAgICAgICAgICBkaWN0X3RvX21hcChjby0+Y29fZnJlZXZhcnMsIG5mcmVldmFycywKKyAgICAgICAgICAgICAgICBsb2NhbHMsIGZhc3QgKyBjby0+Y29fbmxvY2FscyArIG5jZWxscywgMSwKKyAgICAgICAgICAgICAgICBjbGVhcik7CisgICAgICAgIH0KKyAgICB9CisgICAgUHlFcnJfUmVzdG9yZShlcnJvcl90eXBlLCBlcnJvcl92YWx1ZSwgZXJyb3JfdHJhY2ViYWNrKTsKIH0KIAogLyogQ2xlYXIgb3V0IHRoZSBmcmVlIGxpc3QgKi8KIGludAogUHlGcmFtZV9DbGVhckZyZWVMaXN0KHZvaWQpCiB7Ci0JaW50IGZyZWVsaXN0X3NpemUgPSBudW1mcmVlOwotCQotCXdoaWxlIChmcmVlX2xpc3QgIT0gTlVMTCkgewotCQlQeUZyYW1lT2JqZWN0ICpmID0gZnJlZV9saXN0OwotCQlmcmVlX2xpc3QgPSBmcmVlX2xpc3QtPmZfYmFjazsKLQkJUHlPYmplY3RfR0NfRGVsKGYpOwotCQktLW51bWZyZWU7Ci0JfQotCWFzc2VydChudW1mcmVlID09IDApOwotCXJldHVybiBmcmVlbGlzdF9zaXplOworICAgIGludCBmcmVlbGlzdF9zaXplID0gbnVtZnJlZTsKKworICAgIHdoaWxlIChmcmVlX2xpc3QgIT0gTlVMTCkgeworICAgICAgICBQeUZyYW1lT2JqZWN0ICpmID0gZnJlZV9saXN0OworICAgICAgICBmcmVlX2xpc3QgPSBmcmVlX2xpc3QtPmZfYmFjazsKKyAgICAgICAgUHlPYmplY3RfR0NfRGVsKGYpOworICAgICAgICAtLW51bWZyZWU7CisgICAgfQorICAgIGFzc2VydChudW1mcmVlID09IDApOworICAgIHJldHVybiBmcmVlbGlzdF9zaXplOwogfQogCiB2b2lkCiBQeUZyYW1lX0Zpbmkodm9pZCkKIHsKLQkodm9pZClQeUZyYW1lX0NsZWFyRnJlZUxpc3QoKTsKLQlQeV9YREVDUkVGKGJ1aWx0aW5fb2JqZWN0KTsKLQlidWlsdGluX29iamVjdCA9IE5VTEw7CisgICAgKHZvaWQpUHlGcmFtZV9DbGVhckZyZWVMaXN0KCk7CisgICAgUHlfWERFQ1JFRihidWlsdGluX29iamVjdCk7CisgICAgYnVpbHRpbl9vYmplY3QgPSBOVUxMOwogfQpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9mdW5jb2JqZWN0LmMgYi9PYmplY3RzL2Z1bmNvYmplY3QuYwppbmRleCBhMmU4N2I3Li43ZjZiMTIzIDEwMDY0NAotLS0gYS9PYmplY3RzL2Z1bmNvYmplY3QuYworKysgYi9PYmplY3RzL2Z1bmNvYmplY3QuYwpAQCAtOSwxNDkgKzksMTQ5IEBACiBQeU9iamVjdCAqCiBQeUZ1bmN0aW9uX05ldyhQeU9iamVjdCAqY29kZSwgUHlPYmplY3QgKmdsb2JhbHMpCiB7Ci0JUHlGdW5jdGlvbk9iamVjdCAqb3AgPSBQeU9iamVjdF9HQ19OZXcoUHlGdW5jdGlvbk9iamVjdCwKLQkJCQkJICAgICZQeUZ1bmN0aW9uX1R5cGUpOwotCXN0YXRpYyBQeU9iamVjdCAqX19uYW1lX18gPSAwOwotCWlmIChvcCAhPSBOVUxMKSB7Ci0JCVB5T2JqZWN0ICpkb2M7Ci0JCVB5T2JqZWN0ICpjb25zdHM7Ci0JCVB5T2JqZWN0ICptb2R1bGU7Ci0JCW9wLT5mdW5jX3dlYWtyZWZsaXN0ID0gTlVMTDsKLQkJUHlfSU5DUkVGKGNvZGUpOwotCQlvcC0+ZnVuY19jb2RlID0gY29kZTsKLQkJUHlfSU5DUkVGKGdsb2JhbHMpOwotCQlvcC0+ZnVuY19nbG9iYWxzID0gZ2xvYmFsczsKLQkJb3AtPmZ1bmNfbmFtZSA9ICgoUHlDb2RlT2JqZWN0ICopY29kZSktPmNvX25hbWU7Ci0JCVB5X0lOQ1JFRihvcC0+ZnVuY19uYW1lKTsKLQkJb3AtPmZ1bmNfZGVmYXVsdHMgPSBOVUxMOyAvKiBObyBkZWZhdWx0IGFyZ3VtZW50cyAqLwotCQlvcC0+ZnVuY19jbG9zdXJlID0gTlVMTDsKLQkJY29uc3RzID0gKChQeUNvZGVPYmplY3QgKiljb2RlKS0+Y29fY29uc3RzOwotCQlpZiAoUHlUdXBsZV9TaXplKGNvbnN0cykgPj0gMSkgewotCQkJZG9jID0gUHlUdXBsZV9HZXRJdGVtKGNvbnN0cywgMCk7Ci0JCQlpZiAoIVB5U3RyaW5nX0NoZWNrKGRvYykgJiYgIVB5VW5pY29kZV9DaGVjayhkb2MpKQotCQkJCWRvYyA9IFB5X05vbmU7Ci0JCX0KLQkJZWxzZQotCQkJZG9jID0gUHlfTm9uZTsKLQkJUHlfSU5DUkVGKGRvYyk7Ci0JCW9wLT5mdW5jX2RvYyA9IGRvYzsKLQkJb3AtPmZ1bmNfZGljdCA9IE5VTEw7Ci0JCW9wLT5mdW5jX21vZHVsZSA9IE5VTEw7CisgICAgUHlGdW5jdGlvbk9iamVjdCAqb3AgPSBQeU9iamVjdF9HQ19OZXcoUHlGdW5jdGlvbk9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmUHlGdW5jdGlvbl9UeXBlKTsKKyAgICBzdGF0aWMgUHlPYmplY3QgKl9fbmFtZV9fID0gMDsKKyAgICBpZiAob3AgIT0gTlVMTCkgeworICAgICAgICBQeU9iamVjdCAqZG9jOworICAgICAgICBQeU9iamVjdCAqY29uc3RzOworICAgICAgICBQeU9iamVjdCAqbW9kdWxlOworICAgICAgICBvcC0+ZnVuY193ZWFrcmVmbGlzdCA9IE5VTEw7CisgICAgICAgIFB5X0lOQ1JFRihjb2RlKTsKKyAgICAgICAgb3AtPmZ1bmNfY29kZSA9IGNvZGU7CisgICAgICAgIFB5X0lOQ1JFRihnbG9iYWxzKTsKKyAgICAgICAgb3AtPmZ1bmNfZ2xvYmFscyA9IGdsb2JhbHM7CisgICAgICAgIG9wLT5mdW5jX25hbWUgPSAoKFB5Q29kZU9iamVjdCAqKWNvZGUpLT5jb19uYW1lOworICAgICAgICBQeV9JTkNSRUYob3AtPmZ1bmNfbmFtZSk7CisgICAgICAgIG9wLT5mdW5jX2RlZmF1bHRzID0gTlVMTDsgLyogTm8gZGVmYXVsdCBhcmd1bWVudHMgKi8KKyAgICAgICAgb3AtPmZ1bmNfY2xvc3VyZSA9IE5VTEw7CisgICAgICAgIGNvbnN0cyA9ICgoUHlDb2RlT2JqZWN0ICopY29kZSktPmNvX2NvbnN0czsKKyAgICAgICAgaWYgKFB5VHVwbGVfU2l6ZShjb25zdHMpID49IDEpIHsKKyAgICAgICAgICAgIGRvYyA9IFB5VHVwbGVfR2V0SXRlbShjb25zdHMsIDApOworICAgICAgICAgICAgaWYgKCFQeVN0cmluZ19DaGVjayhkb2MpICYmICFQeVVuaWNvZGVfQ2hlY2soZG9jKSkKKyAgICAgICAgICAgICAgICBkb2MgPSBQeV9Ob25lOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGRvYyA9IFB5X05vbmU7CisgICAgICAgIFB5X0lOQ1JFRihkb2MpOworICAgICAgICBvcC0+ZnVuY19kb2MgPSBkb2M7CisgICAgICAgIG9wLT5mdW5jX2RpY3QgPSBOVUxMOworICAgICAgICBvcC0+ZnVuY19tb2R1bGUgPSBOVUxMOwogCi0JCS8qIF9fbW9kdWxlX186IElmIG1vZHVsZSBuYW1lIGlzIGluIGdsb2JhbHMsIHVzZSBpdC4KLQkJICAgT3RoZXJ3aXNlLCB1c2UgTm9uZS4KLQkJKi8KLQkJaWYgKCFfX25hbWVfXykgewotCQkJX19uYW1lX18gPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX25hbWVfXyIpOwotCQkJaWYgKCFfX25hbWVfXykgewotCQkJCVB5X0RFQ1JFRihvcCk7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCX0KLQkJbW9kdWxlID0gUHlEaWN0X0dldEl0ZW0oZ2xvYmFscywgX19uYW1lX18pOwotCQlpZiAobW9kdWxlKSB7Ci0JCSAgICBQeV9JTkNSRUYobW9kdWxlKTsKLQkJICAgIG9wLT5mdW5jX21vZHVsZSA9IG1vZHVsZTsKLQkJfQotCX0KLQllbHNlCi0JCXJldHVybiBOVUxMOwotCV9QeU9iamVjdF9HQ19UUkFDSyhvcCk7Ci0JcmV0dXJuIChQeU9iamVjdCAqKW9wOworICAgICAgICAvKiBfX21vZHVsZV9fOiBJZiBtb2R1bGUgbmFtZSBpcyBpbiBnbG9iYWxzLCB1c2UgaXQuCisgICAgICAgICAgIE90aGVyd2lzZSwgdXNlIE5vbmUuCisgICAgICAgICovCisgICAgICAgIGlmICghX19uYW1lX18pIHsKKyAgICAgICAgICAgIF9fbmFtZV9fID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19uYW1lX18iKTsKKyAgICAgICAgICAgIGlmICghX19uYW1lX18pIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYob3ApOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1vZHVsZSA9IFB5RGljdF9HZXRJdGVtKGdsb2JhbHMsIF9fbmFtZV9fKTsKKyAgICAgICAgaWYgKG1vZHVsZSkgeworICAgICAgICAgICAgUHlfSU5DUkVGKG1vZHVsZSk7CisgICAgICAgICAgICBvcC0+ZnVuY19tb2R1bGUgPSBtb2R1bGU7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfUHlPYmplY3RfR0NfVFJBQ0sob3ApOworICAgIHJldHVybiAoUHlPYmplY3QgKilvcDsKIH0KIAogUHlPYmplY3QgKgogUHlGdW5jdGlvbl9HZXRDb2RlKFB5T2JqZWN0ICpvcCkKIHsKLQlpZiAoIVB5RnVuY3Rpb25fQ2hlY2sob3ApKSB7Ci0JCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuICgoUHlGdW5jdGlvbk9iamVjdCAqKSBvcCkgLT4gZnVuY19jb2RlOworICAgIGlmICghUHlGdW5jdGlvbl9DaGVjayhvcCkpIHsKKyAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gKChQeUZ1bmN0aW9uT2JqZWN0ICopIG9wKSAtPiBmdW5jX2NvZGU7CiB9CiAKIFB5T2JqZWN0ICoKIFB5RnVuY3Rpb25fR2V0R2xvYmFscyhQeU9iamVjdCAqb3ApCiB7Ci0JaWYgKCFQeUZ1bmN0aW9uX0NoZWNrKG9wKSkgewotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiAoKFB5RnVuY3Rpb25PYmplY3QgKikgb3ApIC0+IGZ1bmNfZ2xvYmFsczsKKyAgICBpZiAoIVB5RnVuY3Rpb25fQ2hlY2sob3ApKSB7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuICgoUHlGdW5jdGlvbk9iamVjdCAqKSBvcCkgLT4gZnVuY19nbG9iYWxzOwogfQogCiBQeU9iamVjdCAqCiBQeUZ1bmN0aW9uX0dldE1vZHVsZShQeU9iamVjdCAqb3ApCiB7Ci0JaWYgKCFQeUZ1bmN0aW9uX0NoZWNrKG9wKSkgewotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiAoKFB5RnVuY3Rpb25PYmplY3QgKikgb3ApIC0+IGZ1bmNfbW9kdWxlOworICAgIGlmICghUHlGdW5jdGlvbl9DaGVjayhvcCkpIHsKKyAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gKChQeUZ1bmN0aW9uT2JqZWN0ICopIG9wKSAtPiBmdW5jX21vZHVsZTsKIH0KIAogUHlPYmplY3QgKgogUHlGdW5jdGlvbl9HZXREZWZhdWx0cyhQeU9iamVjdCAqb3ApCiB7Ci0JaWYgKCFQeUZ1bmN0aW9uX0NoZWNrKG9wKSkgewotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiAoKFB5RnVuY3Rpb25PYmplY3QgKikgb3ApIC0+IGZ1bmNfZGVmYXVsdHM7CisgICAgaWYgKCFQeUZ1bmN0aW9uX0NoZWNrKG9wKSkgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiAoKFB5RnVuY3Rpb25PYmplY3QgKikgb3ApIC0+IGZ1bmNfZGVmYXVsdHM7CiB9CiAKIGludAogUHlGdW5jdGlvbl9TZXREZWZhdWx0cyhQeU9iamVjdCAqb3AsIFB5T2JqZWN0ICpkZWZhdWx0cykKIHsKLQlpZiAoIVB5RnVuY3Rpb25fQ2hlY2sob3ApKSB7Ci0JCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmIChkZWZhdWx0cyA9PSBQeV9Ob25lKQotCQlkZWZhdWx0cyA9IE5VTEw7Ci0JZWxzZSBpZiAoZGVmYXVsdHMgJiYgUHlUdXBsZV9DaGVjayhkZWZhdWx0cykpIHsKLQkJUHlfSU5DUkVGKGRlZmF1bHRzKTsKLQl9Ci0JZWxzZSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwgIm5vbi10dXBsZSBkZWZhdWx0IGFyZ3MiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlQeV9YREVDUkVGKCgoUHlGdW5jdGlvbk9iamVjdCAqKSBvcCkgLT4gZnVuY19kZWZhdWx0cyk7Ci0JKChQeUZ1bmN0aW9uT2JqZWN0ICopIG9wKSAtPiBmdW5jX2RlZmF1bHRzID0gZGVmYXVsdHM7Ci0JcmV0dXJuIDA7CisgICAgaWYgKCFQeUZ1bmN0aW9uX0NoZWNrKG9wKSkgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoZGVmYXVsdHMgPT0gUHlfTm9uZSkKKyAgICAgICAgZGVmYXVsdHMgPSBOVUxMOworICAgIGVsc2UgaWYgKGRlZmF1bHRzICYmIFB5VHVwbGVfQ2hlY2soZGVmYXVsdHMpKSB7CisgICAgICAgIFB5X0lOQ1JFRihkZWZhdWx0cyk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsICJub24tdHVwbGUgZGVmYXVsdCBhcmdzIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgUHlfWERFQ1JFRigoKFB5RnVuY3Rpb25PYmplY3QgKikgb3ApIC0+IGZ1bmNfZGVmYXVsdHMpOworICAgICgoUHlGdW5jdGlvbk9iamVjdCAqKSBvcCkgLT4gZnVuY19kZWZhdWx0cyA9IGRlZmF1bHRzOworICAgIHJldHVybiAwOwogfQogCiBQeU9iamVjdCAqCiBQeUZ1bmN0aW9uX0dldENsb3N1cmUoUHlPYmplY3QgKm9wKQogewotCWlmICghUHlGdW5jdGlvbl9DaGVjayhvcCkpIHsKLQkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gKChQeUZ1bmN0aW9uT2JqZWN0ICopIG9wKSAtPiBmdW5jX2Nsb3N1cmU7CisgICAgaWYgKCFQeUZ1bmN0aW9uX0NoZWNrKG9wKSkgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiAoKFB5RnVuY3Rpb25PYmplY3QgKikgb3ApIC0+IGZ1bmNfY2xvc3VyZTsKIH0KIAogaW50CiBQeUZ1bmN0aW9uX1NldENsb3N1cmUoUHlPYmplY3QgKm9wLCBQeU9iamVjdCAqY2xvc3VyZSkKIHsKLQlpZiAoIVB5RnVuY3Rpb25fQ2hlY2sob3ApKSB7Ci0JCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmIChjbG9zdXJlID09IFB5X05vbmUpCi0JCWNsb3N1cmUgPSBOVUxMOwotCWVsc2UgaWYgKFB5VHVwbGVfQ2hlY2soY2xvc3VyZSkpIHsKLQkJUHlfSU5DUkVGKGNsb3N1cmUpOwotCX0KLQllbHNlIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1N5c3RlbUVycm9yLCAKLQkJCSAgICAgImV4cGVjdGVkIHR1cGxlIGZvciBjbG9zdXJlLCBnb3QgJyUuMTAwcyciLAotCQkJICAgICBjbG9zdXJlLT5vYl90eXBlLT50cF9uYW1lKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlQeV9YREVDUkVGKCgoUHlGdW5jdGlvbk9iamVjdCAqKSBvcCkgLT4gZnVuY19jbG9zdXJlKTsKLQkoKFB5RnVuY3Rpb25PYmplY3QgKikgb3ApIC0+IGZ1bmNfY2xvc3VyZSA9IGNsb3N1cmU7Ci0JcmV0dXJuIDA7CisgICAgaWYgKCFQeUZ1bmN0aW9uX0NoZWNrKG9wKSkgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoY2xvc3VyZSA9PSBQeV9Ob25lKQorICAgICAgICBjbG9zdXJlID0gTlVMTDsKKyAgICBlbHNlIGlmIChQeVR1cGxlX0NoZWNrKGNsb3N1cmUpKSB7CisgICAgICAgIFB5X0lOQ1JFRihjbG9zdXJlKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19TeXN0ZW1FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCB0dXBsZSBmb3IgY2xvc3VyZSwgZ290ICclLjEwMHMnIiwKKyAgICAgICAgICAgICAgICAgICAgIGNsb3N1cmUtPm9iX3R5cGUtPnRwX25hbWUpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIFB5X1hERUNSRUYoKChQeUZ1bmN0aW9uT2JqZWN0ICopIG9wKSAtPiBmdW5jX2Nsb3N1cmUpOworICAgICgoUHlGdW5jdGlvbk9iamVjdCAqKSBvcCkgLT4gZnVuY19jbG9zdXJlID0gY2xvc3VyZTsKKyAgICByZXR1cm4gMDsKIH0KIAogLyogTWV0aG9kcyAqLwpAQCAtMTU5LDE4OCArMTU5LDE4OCBAQAogI2RlZmluZSBPRkYoeCkgb2Zmc2V0b2YoUHlGdW5jdGlvbk9iamVjdCwgeCkKIAogc3RhdGljIFB5TWVtYmVyRGVmIGZ1bmNfbWVtYmVybGlzdFtdID0gewotICAgICAgICB7ImZ1bmNfY2xvc3VyZSIsICBUX09CSkVDVCwgICAgIE9GRihmdW5jX2Nsb3N1cmUpLAotCSBSRVNUUklDVEVEfFJFQURPTkxZfSwKLSAgICAgICAgeyJfX2Nsb3N1cmVfXyIsICBUX09CSkVDVCwgICAgICBPRkYoZnVuY19jbG9zdXJlKSwKLQkgUkVTVFJJQ1RFRHxSRUFET05MWX0sCi0gICAgICAgIHsiZnVuY19kb2MiLCAgICAgIFRfT0JKRUNULCAgICAgT0ZGKGZ1bmNfZG9jKSwgUFlfV1JJVEVfUkVTVFJJQ1RFRH0sCi0gICAgICAgIHsiX19kb2NfXyIsICAgICAgIFRfT0JKRUNULCAgICAgT0ZGKGZ1bmNfZG9jKSwgUFlfV1JJVEVfUkVTVFJJQ1RFRH0sCi0gICAgICAgIHsiZnVuY19nbG9iYWxzIiwgIFRfT0JKRUNULCAgICAgT0ZGKGZ1bmNfZ2xvYmFscyksCi0JIFJFU1RSSUNURUR8UkVBRE9OTFl9LAotICAgICAgICB7Il9fZ2xvYmFsc19fIiwgIFRfT0JKRUNULCAgICAgIE9GRihmdW5jX2dsb2JhbHMpLAotCSBSRVNUUklDVEVEfFJFQURPTkxZfSwKLSAgICAgICAgeyJfX21vZHVsZV9fIiwgICAgVF9PQkpFQ1QsICAgICBPRkYoZnVuY19tb2R1bGUpLCBQWV9XUklURV9SRVNUUklDVEVEfSwKLSAgICAgICAge05VTEx9ICAvKiBTZW50aW5lbCAqLworICAgIHsiZnVuY19jbG9zdXJlIiwgIFRfT0JKRUNULCAgICAgT0ZGKGZ1bmNfY2xvc3VyZSksCisgICAgIFJFU1RSSUNURUR8UkVBRE9OTFl9LAorICAgIHsiX19jbG9zdXJlX18iLCAgVF9PQkpFQ1QsICAgICAgT0ZGKGZ1bmNfY2xvc3VyZSksCisgICAgIFJFU1RSSUNURUR8UkVBRE9OTFl9LAorICAgIHsiZnVuY19kb2MiLCAgICAgIFRfT0JKRUNULCAgICAgT0ZGKGZ1bmNfZG9jKSwgUFlfV1JJVEVfUkVTVFJJQ1RFRH0sCisgICAgeyJfX2RvY19fIiwgICAgICAgVF9PQkpFQ1QsICAgICBPRkYoZnVuY19kb2MpLCBQWV9XUklURV9SRVNUUklDVEVEfSwKKyAgICB7ImZ1bmNfZ2xvYmFscyIsICBUX09CSkVDVCwgICAgIE9GRihmdW5jX2dsb2JhbHMpLAorICAgICBSRVNUUklDVEVEfFJFQURPTkxZfSwKKyAgICB7Il9fZ2xvYmFsc19fIiwgIFRfT0JKRUNULCAgICAgIE9GRihmdW5jX2dsb2JhbHMpLAorICAgICBSRVNUUklDVEVEfFJFQURPTkxZfSwKKyAgICB7Il9fbW9kdWxlX18iLCAgICBUX09CSkVDVCwgICAgIE9GRihmdW5jX21vZHVsZSksIFBZX1dSSVRFX1JFU1RSSUNURUR9LAorICAgIHtOVUxMfSAgLyogU2VudGluZWwgKi8KIH07CiAKIHN0YXRpYyBpbnQKIHJlc3RyaWN0ZWQodm9pZCkKIHsKLQlpZiAoIVB5RXZhbF9HZXRSZXN0cmljdGVkKCkpCi0JCXJldHVybiAwOwotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCi0JCSJmdW5jdGlvbiBhdHRyaWJ1dGVzIG5vdCBhY2Nlc3NpYmxlIGluIHJlc3RyaWN0ZWQgbW9kZSIpOwotCXJldHVybiAxOworICAgIGlmICghUHlFdmFsX0dldFJlc3RyaWN0ZWQoKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKKyAgICAgICAgImZ1bmN0aW9uIGF0dHJpYnV0ZXMgbm90IGFjY2Vzc2libGUgaW4gcmVzdHJpY3RlZCBtb2RlIik7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmdW5jX2dldF9kaWN0KFB5RnVuY3Rpb25PYmplY3QgKm9wKQogewotCWlmIChyZXN0cmljdGVkKCkpCi0JCXJldHVybiBOVUxMOwotCWlmIChvcC0+ZnVuY19kaWN0ID09IE5VTEwpIHsKLQkJb3AtPmZ1bmNfZGljdCA9IFB5RGljdF9OZXcoKTsKLQkJaWYgKG9wLT5mdW5jX2RpY3QgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCX0KLQlQeV9JTkNSRUYob3AtPmZ1bmNfZGljdCk7Ci0JcmV0dXJuIG9wLT5mdW5jX2RpY3Q7CisgICAgaWYgKHJlc3RyaWN0ZWQoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKG9wLT5mdW5jX2RpY3QgPT0gTlVMTCkgeworICAgICAgICBvcC0+ZnVuY19kaWN0ID0gUHlEaWN0X05ldygpOworICAgICAgICBpZiAob3AtPmZ1bmNfZGljdCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5X0lOQ1JFRihvcC0+ZnVuY19kaWN0KTsKKyAgICByZXR1cm4gb3AtPmZ1bmNfZGljdDsKIH0KIAogc3RhdGljIGludAogZnVuY19zZXRfZGljdChQeUZ1bmN0aW9uT2JqZWN0ICpvcCwgUHlPYmplY3QgKnZhbHVlKQogewotCVB5T2JqZWN0ICp0bXA7CisgICAgUHlPYmplY3QgKnRtcDsKIAotCWlmIChyZXN0cmljdGVkKCkpCi0JCXJldHVybiAtMTsKLQkvKiBJdCBpcyBpbGxlZ2FsIHRvIGRlbCBmLmZ1bmNfZGljdCAqLwotCWlmICh2YWx1ZSA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJImZ1bmN0aW9uJ3MgZGljdGlvbmFyeSBtYXkgbm90IGJlIGRlbGV0ZWQiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQkvKiBDYW4gb25seSBzZXQgZnVuY19kaWN0IHRvIGEgZGljdGlvbmFyeSAqLwotCWlmICghUHlEaWN0X0NoZWNrKHZhbHVlKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJzZXR0aW5nIGZ1bmN0aW9uJ3MgZGljdGlvbmFyeSB0byBhIG5vbi1kaWN0Iik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JdG1wID0gb3AtPmZ1bmNfZGljdDsKLQlQeV9JTkNSRUYodmFsdWUpOwotCW9wLT5mdW5jX2RpY3QgPSB2YWx1ZTsKLQlQeV9YREVDUkVGKHRtcCk7Ci0JcmV0dXJuIDA7CisgICAgaWYgKHJlc3RyaWN0ZWQoKSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIC8qIEl0IGlzIGlsbGVnYWwgdG8gZGVsIGYuZnVuY19kaWN0ICovCisgICAgaWYgKHZhbHVlID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJmdW5jdGlvbidzIGRpY3Rpb25hcnkgbWF5IG5vdCBiZSBkZWxldGVkIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgLyogQ2FuIG9ubHkgc2V0IGZ1bmNfZGljdCB0byBhIGRpY3Rpb25hcnkgKi8KKyAgICBpZiAoIVB5RGljdF9DaGVjayh2YWx1ZSkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJzZXR0aW5nIGZ1bmN0aW9uJ3MgZGljdGlvbmFyeSB0byBhIG5vbi1kaWN0Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgdG1wID0gb3AtPmZ1bmNfZGljdDsKKyAgICBQeV9JTkNSRUYodmFsdWUpOworICAgIG9wLT5mdW5jX2RpY3QgPSB2YWx1ZTsKKyAgICBQeV9YREVDUkVGKHRtcCk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmdW5jX2dldF9jb2RlKFB5RnVuY3Rpb25PYmplY3QgKm9wKQogewotCWlmIChyZXN0cmljdGVkKCkpCi0JCXJldHVybiBOVUxMOwotCVB5X0lOQ1JFRihvcC0+ZnVuY19jb2RlKTsKLQlyZXR1cm4gb3AtPmZ1bmNfY29kZTsKKyAgICBpZiAocmVzdHJpY3RlZCgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQeV9JTkNSRUYob3AtPmZ1bmNfY29kZSk7CisgICAgcmV0dXJuIG9wLT5mdW5jX2NvZGU7CiB9CiAKIHN0YXRpYyBpbnQKIGZ1bmNfc2V0X2NvZGUoUHlGdW5jdGlvbk9iamVjdCAqb3AsIFB5T2JqZWN0ICp2YWx1ZSkKIHsKLQlQeU9iamVjdCAqdG1wOwotCVB5X3NzaXplX3QgbmZyZWUsIG5jbG9zdXJlOworICAgIFB5T2JqZWN0ICp0bXA7CisgICAgUHlfc3NpemVfdCBuZnJlZSwgbmNsb3N1cmU7CiAKLQlpZiAocmVzdHJpY3RlZCgpKQotCQlyZXR1cm4gLTE7Ci0JLyogTm90IGxlZ2FsIHRvIGRlbCBmLmZ1bmNfY29kZSBvciB0byBzZXQgaXQgdG8gYW55dGhpbmcKLQkgKiBvdGhlciB0aGFuIGEgY29kZSBvYmplY3QuICovCi0JaWYgKHZhbHVlID09IE5VTEwgfHwgIVB5Q29kZV9DaGVjayh2YWx1ZSkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiX19jb2RlX18gbXVzdCBiZSBzZXQgdG8gYSBjb2RlIG9iamVjdCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCW5mcmVlID0gUHlDb2RlX0dldE51bUZyZWUoKFB5Q29kZU9iamVjdCAqKXZhbHVlKTsKLQluY2xvc3VyZSA9IChvcC0+ZnVuY19jbG9zdXJlID09IE5VTEwgPyAwIDoKLQkJICAgIFB5VHVwbGVfR0VUX1NJWkUob3AtPmZ1bmNfY2xvc3VyZSkpOwotCWlmIChuY2xvc3VyZSAhPSBuZnJlZSkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKLQkJCSAgICAgIiVzKCkgcmVxdWlyZXMgYSBjb2RlIG9iamVjdCB3aXRoICV6ZCBmcmVlIHZhcnMsIgotCQkJICAgICAiIG5vdCAlemQiLAotCQkJICAgICBQeVN0cmluZ19Bc1N0cmluZyhvcC0+ZnVuY19uYW1lKSwKLQkJCSAgICAgbmNsb3N1cmUsIG5mcmVlKTsKLQkJcmV0dXJuIC0xOwotCX0KLQl0bXAgPSBvcC0+ZnVuY19jb2RlOwotCVB5X0lOQ1JFRih2YWx1ZSk7Ci0Jb3AtPmZ1bmNfY29kZSA9IHZhbHVlOwotCVB5X0RFQ1JFRih0bXApOwotCXJldHVybiAwOworICAgIGlmIChyZXN0cmljdGVkKCkpCisgICAgICAgIHJldHVybiAtMTsKKyAgICAvKiBOb3QgbGVnYWwgdG8gZGVsIGYuZnVuY19jb2RlIG9yIHRvIHNldCBpdCB0byBhbnl0aGluZworICAgICAqIG90aGVyIHRoYW4gYSBjb2RlIG9iamVjdC4gKi8KKyAgICBpZiAodmFsdWUgPT0gTlVMTCB8fCAhUHlDb2RlX0NoZWNrKHZhbHVlKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIl9fY29kZV9fIG11c3QgYmUgc2V0IHRvIGEgY29kZSBvYmplY3QiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBuZnJlZSA9IFB5Q29kZV9HZXROdW1GcmVlKChQeUNvZGVPYmplY3QgKil2YWx1ZSk7CisgICAgbmNsb3N1cmUgPSAob3AtPmZ1bmNfY2xvc3VyZSA9PSBOVUxMID8gMCA6CisgICAgICAgICAgICBQeVR1cGxlX0dFVF9TSVpFKG9wLT5mdW5jX2Nsb3N1cmUpKTsKKyAgICBpZiAobmNsb3N1cmUgIT0gbmZyZWUpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiJXMoKSByZXF1aXJlcyBhIGNvZGUgb2JqZWN0IHdpdGggJXpkIGZyZWUgdmFycywiCisgICAgICAgICAgICAgICAgICAgICAiIG5vdCAlemQiLAorICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQXNTdHJpbmcob3AtPmZ1bmNfbmFtZSksCisgICAgICAgICAgICAgICAgICAgICBuY2xvc3VyZSwgbmZyZWUpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHRtcCA9IG9wLT5mdW5jX2NvZGU7CisgICAgUHlfSU5DUkVGKHZhbHVlKTsKKyAgICBvcC0+ZnVuY19jb2RlID0gdmFsdWU7CisgICAgUHlfREVDUkVGKHRtcCk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmdW5jX2dldF9uYW1lKFB5RnVuY3Rpb25PYmplY3QgKm9wKQogewotCVB5X0lOQ1JFRihvcC0+ZnVuY19uYW1lKTsKLQlyZXR1cm4gb3AtPmZ1bmNfbmFtZTsKKyAgICBQeV9JTkNSRUYob3AtPmZ1bmNfbmFtZSk7CisgICAgcmV0dXJuIG9wLT5mdW5jX25hbWU7CiB9CiAKIHN0YXRpYyBpbnQKIGZ1bmNfc2V0X25hbWUoUHlGdW5jdGlvbk9iamVjdCAqb3AsIFB5T2JqZWN0ICp2YWx1ZSkKIHsKLQlQeU9iamVjdCAqdG1wOworICAgIFB5T2JqZWN0ICp0bXA7CiAKLQlpZiAocmVzdHJpY3RlZCgpKQotCQlyZXR1cm4gLTE7Ci0JLyogTm90IGxlZ2FsIHRvIGRlbCBmLmZ1bmNfbmFtZSBvciB0byBzZXQgaXQgdG8gYW55dGhpbmcKLQkgKiBvdGhlciB0aGFuIGEgc3RyaW5nIG9iamVjdC4gKi8KLQlpZiAodmFsdWUgPT0gTlVMTCB8fCAhUHlTdHJpbmdfQ2hlY2sodmFsdWUpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJIl9fbmFtZV9fIG11c3QgYmUgc2V0IHRvIGEgc3RyaW5nIG9iamVjdCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXRtcCA9IG9wLT5mdW5jX25hbWU7Ci0JUHlfSU5DUkVGKHZhbHVlKTsKLQlvcC0+ZnVuY19uYW1lID0gdmFsdWU7Ci0JUHlfREVDUkVGKHRtcCk7Ci0JcmV0dXJuIDA7CisgICAgaWYgKHJlc3RyaWN0ZWQoKSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIC8qIE5vdCBsZWdhbCB0byBkZWwgZi5mdW5jX25hbWUgb3IgdG8gc2V0IGl0IHRvIGFueXRoaW5nCisgICAgICogb3RoZXIgdGhhbiBhIHN0cmluZyBvYmplY3QuICovCisgICAgaWYgKHZhbHVlID09IE5VTEwgfHwgIVB5U3RyaW5nX0NoZWNrKHZhbHVlKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIl9fbmFtZV9fIG11c3QgYmUgc2V0IHRvIGEgc3RyaW5nIG9iamVjdCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHRtcCA9IG9wLT5mdW5jX25hbWU7CisgICAgUHlfSU5DUkVGKHZhbHVlKTsKKyAgICBvcC0+ZnVuY19uYW1lID0gdmFsdWU7CisgICAgUHlfREVDUkVGKHRtcCk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmdW5jX2dldF9kZWZhdWx0cyhQeUZ1bmN0aW9uT2JqZWN0ICpvcCkKIHsKLQlpZiAocmVzdHJpY3RlZCgpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAob3AtPmZ1bmNfZGVmYXVsdHMgPT0gTlVMTCkgewotCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCXJldHVybiBQeV9Ob25lOwotCX0KLQlQeV9JTkNSRUYob3AtPmZ1bmNfZGVmYXVsdHMpOwotCXJldHVybiBvcC0+ZnVuY19kZWZhdWx0czsKKyAgICBpZiAocmVzdHJpY3RlZCgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAob3AtPmZ1bmNfZGVmYXVsdHMgPT0gTlVMTCkgeworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIHJldHVybiBQeV9Ob25lOworICAgIH0KKyAgICBQeV9JTkNSRUYob3AtPmZ1bmNfZGVmYXVsdHMpOworICAgIHJldHVybiBvcC0+ZnVuY19kZWZhdWx0czsKIH0KIAogc3RhdGljIGludAogZnVuY19zZXRfZGVmYXVsdHMoUHlGdW5jdGlvbk9iamVjdCAqb3AsIFB5T2JqZWN0ICp2YWx1ZSkKIHsKLQlQeU9iamVjdCAqdG1wOworICAgIFB5T2JqZWN0ICp0bXA7CiAKLQlpZiAocmVzdHJpY3RlZCgpKQotCQlyZXR1cm4gLTE7Ci0JLyogTGVnYWwgdG8gZGVsIGYuZnVuY19kZWZhdWx0cy4KLQkgKiBDYW4gb25seSBzZXQgZnVuY19kZWZhdWx0cyB0byBOVUxMIG9yIGEgdHVwbGUuICovCi0JaWYgKHZhbHVlID09IFB5X05vbmUpCi0JCXZhbHVlID0gTlVMTDsKLQlpZiAodmFsdWUgIT0gTlVMTCAmJiAhUHlUdXBsZV9DaGVjayh2YWx1ZSkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiX19kZWZhdWx0c19fIG11c3QgYmUgc2V0IHRvIGEgdHVwbGUgb2JqZWN0Iik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JdG1wID0gb3AtPmZ1bmNfZGVmYXVsdHM7Ci0JUHlfWElOQ1JFRih2YWx1ZSk7Ci0Jb3AtPmZ1bmNfZGVmYXVsdHMgPSB2YWx1ZTsKLQlQeV9YREVDUkVGKHRtcCk7Ci0JcmV0dXJuIDA7CisgICAgaWYgKHJlc3RyaWN0ZWQoKSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIC8qIExlZ2FsIHRvIGRlbCBmLmZ1bmNfZGVmYXVsdHMuCisgICAgICogQ2FuIG9ubHkgc2V0IGZ1bmNfZGVmYXVsdHMgdG8gTlVMTCBvciBhIHR1cGxlLiAqLworICAgIGlmICh2YWx1ZSA9PSBQeV9Ob25lKQorICAgICAgICB2YWx1ZSA9IE5VTEw7CisgICAgaWYgKHZhbHVlICE9IE5VTEwgJiYgIVB5VHVwbGVfQ2hlY2sodmFsdWUpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiX19kZWZhdWx0c19fIG11c3QgYmUgc2V0IHRvIGEgdHVwbGUgb2JqZWN0Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgdG1wID0gb3AtPmZ1bmNfZGVmYXVsdHM7CisgICAgUHlfWElOQ1JFRih2YWx1ZSk7CisgICAgb3AtPmZ1bmNfZGVmYXVsdHMgPSB2YWx1ZTsKKyAgICBQeV9YREVDUkVGKHRtcCk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeUdldFNldERlZiBmdW5jX2dldHNldGxpc3RbXSA9IHsKLSAgICAgICAgeyJmdW5jX2NvZGUiLCAoZ2V0dGVyKWZ1bmNfZ2V0X2NvZGUsIChzZXR0ZXIpZnVuY19zZXRfY29kZX0sCi0gICAgICAgIHsiX19jb2RlX18iLCAoZ2V0dGVyKWZ1bmNfZ2V0X2NvZGUsIChzZXR0ZXIpZnVuY19zZXRfY29kZX0sCi0gICAgICAgIHsiZnVuY19kZWZhdWx0cyIsIChnZXR0ZXIpZnVuY19nZXRfZGVmYXVsdHMsCi0JIChzZXR0ZXIpZnVuY19zZXRfZGVmYXVsdHN9LAotICAgICAgICB7Il9fZGVmYXVsdHNfXyIsIChnZXR0ZXIpZnVuY19nZXRfZGVmYXVsdHMsCi0JIChzZXR0ZXIpZnVuY19zZXRfZGVmYXVsdHN9LAotCXsiZnVuY19kaWN0IiwgKGdldHRlcilmdW5jX2dldF9kaWN0LCAoc2V0dGVyKWZ1bmNfc2V0X2RpY3R9LAotCXsiX19kaWN0X18iLCAoZ2V0dGVyKWZ1bmNfZ2V0X2RpY3QsIChzZXR0ZXIpZnVuY19zZXRfZGljdH0sCi0JeyJmdW5jX25hbWUiLCAoZ2V0dGVyKWZ1bmNfZ2V0X25hbWUsIChzZXR0ZXIpZnVuY19zZXRfbmFtZX0sCi0JeyJfX25hbWVfXyIsIChnZXR0ZXIpZnVuY19nZXRfbmFtZSwgKHNldHRlcilmdW5jX3NldF9uYW1lfSwKLQl7TlVMTH0gLyogU2VudGluZWwgKi8KKyAgICB7ImZ1bmNfY29kZSIsIChnZXR0ZXIpZnVuY19nZXRfY29kZSwgKHNldHRlcilmdW5jX3NldF9jb2RlfSwKKyAgICB7Il9fY29kZV9fIiwgKGdldHRlcilmdW5jX2dldF9jb2RlLCAoc2V0dGVyKWZ1bmNfc2V0X2NvZGV9LAorICAgIHsiZnVuY19kZWZhdWx0cyIsIChnZXR0ZXIpZnVuY19nZXRfZGVmYXVsdHMsCisgICAgIChzZXR0ZXIpZnVuY19zZXRfZGVmYXVsdHN9LAorICAgIHsiX19kZWZhdWx0c19fIiwgKGdldHRlcilmdW5jX2dldF9kZWZhdWx0cywKKyAgICAgKHNldHRlcilmdW5jX3NldF9kZWZhdWx0c30sCisgICAgeyJmdW5jX2RpY3QiLCAoZ2V0dGVyKWZ1bmNfZ2V0X2RpY3QsIChzZXR0ZXIpZnVuY19zZXRfZGljdH0sCisgICAgeyJfX2RpY3RfXyIsIChnZXR0ZXIpZnVuY19nZXRfZGljdCwgKHNldHRlcilmdW5jX3NldF9kaWN0fSwKKyAgICB7ImZ1bmNfbmFtZSIsIChnZXR0ZXIpZnVuY19nZXRfbmFtZSwgKHNldHRlcilmdW5jX3NldF9uYW1lfSwKKyAgICB7Il9fbmFtZV9fIiwgKGdldHRlcilmdW5jX2dldF9uYW1lLCAoc2V0dGVyKWZ1bmNfc2V0X25hbWV9LAorICAgIHtOVUxMfSAvKiBTZW50aW5lbCAqLwogfTsKIAogUHlEb2NfU1RSVkFSKGZ1bmNfZG9jLApAQCAtMzUzLDIzNSArMzUzLDIzNSBAQAogCiAvKiBmdW5jX25ldygpIG1haW50YWlucyB0aGUgZm9sbG93aW5nIGludmFyaWFudHMgZm9yIGNsb3N1cmVzLiAgVGhlCiAgICBjbG9zdXJlIG11c3QgY29ycmVzcG9uZCB0byB0aGUgZnJlZSB2YXJpYWJsZXMgb2YgdGhlIGNvZGUgb2JqZWN0LgotICAgCi0gICBpZiBsZW4oY29kZS5jb19mcmVldmFycykgPT0gMDogCi0gICAgICAgICAgIGNsb3N1cmUgPSBOVUxMCisKKyAgIGlmIGxlbihjb2RlLmNvX2ZyZWV2YXJzKSA9PSAwOgorICAgICAgIGNsb3N1cmUgPSBOVUxMCiAgICBlbHNlOgotICAgICAgICAgICBsZW4oY2xvc3VyZSkgPT0gbGVuKGNvZGUuY29fZnJlZXZhcnMpCisgICAgICAgbGVuKGNsb3N1cmUpID09IGxlbihjb2RlLmNvX2ZyZWV2YXJzKQogICAgZm9yIGV2ZXJ5IGVsdCBpbiBjbG9zdXJlLCB0eXBlKGVsdCkgPT0gY2VsbAogKi8KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZ1bmNfbmV3KFB5VHlwZU9iamVjdCogdHlwZSwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KiBrdykKIHsKLQlQeUNvZGVPYmplY3QgKmNvZGU7Ci0JUHlPYmplY3QgKmdsb2JhbHM7Ci0JUHlPYmplY3QgKm5hbWUgPSBQeV9Ob25lOwotCVB5T2JqZWN0ICpkZWZhdWx0cyA9IFB5X05vbmU7Ci0JUHlPYmplY3QgKmNsb3N1cmUgPSBQeV9Ob25lOwotCVB5RnVuY3Rpb25PYmplY3QgKm5ld2Z1bmM7Ci0JUHlfc3NpemVfdCBuZnJlZSwgbmNsb3N1cmU7Ci0Jc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJjb2RlIiwgImdsb2JhbHMiLCAibmFtZSIsCi0JCQkJICJhcmdkZWZzIiwgImNsb3N1cmUiLCAwfTsKKyAgICBQeUNvZGVPYmplY3QgKmNvZGU7CisgICAgUHlPYmplY3QgKmdsb2JhbHM7CisgICAgUHlPYmplY3QgKm5hbWUgPSBQeV9Ob25lOworICAgIFB5T2JqZWN0ICpkZWZhdWx0cyA9IFB5X05vbmU7CisgICAgUHlPYmplY3QgKmNsb3N1cmUgPSBQeV9Ob25lOworICAgIFB5RnVuY3Rpb25PYmplY3QgKm5ld2Z1bmM7CisgICAgUHlfc3NpemVfdCBuZnJlZSwgbmNsb3N1cmU7CisgICAgc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJjb2RlIiwgImdsb2JhbHMiLCAibmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhcmdkZWZzIiwgImNsb3N1cmUiLCAwfTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3LCAiTyFPIXxPT086ZnVuY3Rpb24iLAotCQkJICAgICAga3dsaXN0LAotCQkJICAgICAgJlB5Q29kZV9UeXBlLCAmY29kZSwKLQkJCSAgICAgICZQeURpY3RfVHlwZSwgJmdsb2JhbHMsCi0JCQkgICAgICAmbmFtZSwgJmRlZmF1bHRzLCAmY2xvc3VyZSkpCi0JCXJldHVybiBOVUxMOwotCWlmIChuYW1lICE9IFB5X05vbmUgJiYgIVB5U3RyaW5nX0NoZWNrKG5hbWUpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJImFyZyAzIChuYW1lKSBtdXN0IGJlIE5vbmUgb3Igc3RyaW5nIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoZGVmYXVsdHMgIT0gUHlfTm9uZSAmJiAhUHlUdXBsZV9DaGVjayhkZWZhdWx0cykpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiYXJnIDQgKGRlZmF1bHRzKSBtdXN0IGJlIE5vbmUgb3IgdHVwbGUiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCW5mcmVlID0gUHlUdXBsZV9HRVRfU0laRShjb2RlLT5jb19mcmVldmFycyk7Ci0JaWYgKCFQeVR1cGxlX0NoZWNrKGNsb3N1cmUpKSB7Ci0JCWlmIChuZnJlZSAmJiBjbG9zdXJlID09IFB5X05vbmUpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJCSJhcmcgNSAoY2xvc3VyZSkgbXVzdCBiZSB0dXBsZSIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJZWxzZSBpZiAoY2xvc3VyZSAhPSBQeV9Ob25lKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJhcmcgNSAoY2xvc3VyZSkgbXVzdCBiZSBOb25lIG9yIHR1cGxlIik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrdywgIk8hTyF8T09POmZ1bmN0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAga3dsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmUHlDb2RlX1R5cGUsICZjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmUHlEaWN0X1R5cGUsICZnbG9iYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbmFtZSwgJmRlZmF1bHRzLCAmY2xvc3VyZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChuYW1lICE9IFB5X05vbmUgJiYgIVB5U3RyaW5nX0NoZWNrKG5hbWUpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiYXJnIDMgKG5hbWUpIG11c3QgYmUgTm9uZSBvciBzdHJpbmciKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChkZWZhdWx0cyAhPSBQeV9Ob25lICYmICFQeVR1cGxlX0NoZWNrKGRlZmF1bHRzKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImFyZyA0IChkZWZhdWx0cykgbXVzdCBiZSBOb25lIG9yIHR1cGxlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBuZnJlZSA9IFB5VHVwbGVfR0VUX1NJWkUoY29kZS0+Y29fZnJlZXZhcnMpOworICAgIGlmICghUHlUdXBsZV9DaGVjayhjbG9zdXJlKSkgeworICAgICAgICBpZiAobmZyZWUgJiYgY2xvc3VyZSA9PSBQeV9Ob25lKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhcmcgNSAoY2xvc3VyZSkgbXVzdCBiZSB0dXBsZSIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoY2xvc3VyZSAhPSBQeV9Ob25lKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICJhcmcgNSAoY2xvc3VyZSkgbXVzdCBiZSBOb25lIG9yIHR1cGxlIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KIAotCS8qIGNoZWNrIHRoYXQgdGhlIGNsb3N1cmUgaXMgd2VsbC1mb3JtZWQgKi8KLQluY2xvc3VyZSA9IGNsb3N1cmUgPT0gUHlfTm9uZSA/IDAgOiBQeVR1cGxlX0dFVF9TSVpFKGNsb3N1cmUpOwotCWlmIChuZnJlZSAhPSBuY2xvc3VyZSkKLQkJcmV0dXJuIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSAgICAiJXMgcmVxdWlyZXMgY2xvc3VyZSBvZiBsZW5ndGggJXpkLCBub3QgJXpkIiwKLQkJCQkgICAgUHlTdHJpbmdfQVNfU1RSSU5HKGNvZGUtPmNvX25hbWUpLAotCQkJCSAgICBuZnJlZSwgbmNsb3N1cmUpOwotCWlmIChuY2xvc3VyZSkgewotCQlQeV9zc2l6ZV90IGk7Ci0JCWZvciAoaSA9IDA7IGkgPCBuY2xvc3VyZTsgaSsrKSB7Ci0JCQlQeU9iamVjdCAqbyA9IFB5VHVwbGVfR0VUX0lURU0oY2xvc3VyZSwgaSk7Ci0JCQlpZiAoIVB5Q2VsbF9DaGVjayhvKSkgewotCQkJCXJldHVybiBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJCSAgICAiYXJnIDUgKGNsb3N1cmUpIGV4cGVjdGVkIGNlbGwsIGZvdW5kICVzIiwKLQkJCQkJCSAgICBvLT5vYl90eXBlLT50cF9uYW1lKTsKLQkJCX0KLQkJfQotCX0KLQkKLQluZXdmdW5jID0gKFB5RnVuY3Rpb25PYmplY3QgKilQeUZ1bmN0aW9uX05ldygoUHlPYmplY3QgKiljb2RlLCAKLQkJCQkJCSAgICAgZ2xvYmFscyk7Ci0JaWYgKG5ld2Z1bmMgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JCi0JaWYgKG5hbWUgIT0gUHlfTm9uZSkgewotCQlQeV9JTkNSRUYobmFtZSk7Ci0JCVB5X0RFQ1JFRihuZXdmdW5jLT5mdW5jX25hbWUpOwotCQluZXdmdW5jLT5mdW5jX25hbWUgPSBuYW1lOwotCX0KLQlpZiAoZGVmYXVsdHMgIT0gUHlfTm9uZSkgewotCQlQeV9JTkNSRUYoZGVmYXVsdHMpOwotCQluZXdmdW5jLT5mdW5jX2RlZmF1bHRzICA9IGRlZmF1bHRzOwotCX0KLQlpZiAoY2xvc3VyZSAhPSBQeV9Ob25lKSB7Ci0JCVB5X0lOQ1JFRihjbG9zdXJlKTsKLQkJbmV3ZnVuYy0+ZnVuY19jbG9zdXJlID0gY2xvc3VyZTsKLQl9CisgICAgLyogY2hlY2sgdGhhdCB0aGUgY2xvc3VyZSBpcyB3ZWxsLWZvcm1lZCAqLworICAgIG5jbG9zdXJlID0gY2xvc3VyZSA9PSBQeV9Ob25lID8gMCA6IFB5VHVwbGVfR0VUX1NJWkUoY2xvc3VyZSk7CisgICAgaWYgKG5mcmVlICE9IG5jbG9zdXJlKQorICAgICAgICByZXR1cm4gUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzIHJlcXVpcmVzIGNsb3N1cmUgb2YgbGVuZ3RoICV6ZCwgbm90ICV6ZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKGNvZGUtPmNvX25hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5mcmVlLCBuY2xvc3VyZSk7CisgICAgaWYgKG5jbG9zdXJlKSB7CisgICAgICAgIFB5X3NzaXplX3QgaTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG5jbG9zdXJlOyBpKyspIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpvID0gUHlUdXBsZV9HRVRfSVRFTShjbG9zdXJlLCBpKTsKKyAgICAgICAgICAgIGlmICghUHlDZWxsX0NoZWNrKG8pKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICJhcmcgNSAoY2xvc3VyZSkgZXhwZWN0ZWQgY2VsbCwgZm91bmQgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgby0+b2JfdHlwZS0+dHBfbmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAKLQlyZXR1cm4gKFB5T2JqZWN0ICopbmV3ZnVuYzsKKyAgICBuZXdmdW5jID0gKFB5RnVuY3Rpb25PYmplY3QgKilQeUZ1bmN0aW9uX05ldygoUHlPYmplY3QgKiljb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbHMpOworICAgIGlmIChuZXdmdW5jID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgaWYgKG5hbWUgIT0gUHlfTm9uZSkgeworICAgICAgICBQeV9JTkNSRUYobmFtZSk7CisgICAgICAgIFB5X0RFQ1JFRihuZXdmdW5jLT5mdW5jX25hbWUpOworICAgICAgICBuZXdmdW5jLT5mdW5jX25hbWUgPSBuYW1lOworICAgIH0KKyAgICBpZiAoZGVmYXVsdHMgIT0gUHlfTm9uZSkgeworICAgICAgICBQeV9JTkNSRUYoZGVmYXVsdHMpOworICAgICAgICBuZXdmdW5jLT5mdW5jX2RlZmF1bHRzICA9IGRlZmF1bHRzOworICAgIH0KKyAgICBpZiAoY2xvc3VyZSAhPSBQeV9Ob25lKSB7CisgICAgICAgIFB5X0lOQ1JFRihjbG9zdXJlKTsKKyAgICAgICAgbmV3ZnVuYy0+ZnVuY19jbG9zdXJlID0gY2xvc3VyZTsKKyAgICB9CisKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopbmV3ZnVuYzsKIH0KIAogc3RhdGljIHZvaWQKIGZ1bmNfZGVhbGxvYyhQeUZ1bmN0aW9uT2JqZWN0ICpvcCkKIHsKLQlfUHlPYmplY3RfR0NfVU5UUkFDSyhvcCk7Ci0JaWYgKG9wLT5mdW5jX3dlYWtyZWZsaXN0ICE9IE5VTEwpCi0JCVB5T2JqZWN0X0NsZWFyV2Vha1JlZnMoKFB5T2JqZWN0ICopIG9wKTsKLQlQeV9ERUNSRUYob3AtPmZ1bmNfY29kZSk7Ci0JUHlfREVDUkVGKG9wLT5mdW5jX2dsb2JhbHMpOwotCVB5X1hERUNSRUYob3AtPmZ1bmNfbW9kdWxlKTsKLQlQeV9ERUNSRUYob3AtPmZ1bmNfbmFtZSk7Ci0JUHlfWERFQ1JFRihvcC0+ZnVuY19kZWZhdWx0cyk7Ci0JUHlfWERFQ1JFRihvcC0+ZnVuY19kb2MpOwotCVB5X1hERUNSRUYob3AtPmZ1bmNfZGljdCk7Ci0JUHlfWERFQ1JFRihvcC0+ZnVuY19jbG9zdXJlKTsKLQlQeU9iamVjdF9HQ19EZWwob3ApOworICAgIF9QeU9iamVjdF9HQ19VTlRSQUNLKG9wKTsKKyAgICBpZiAob3AtPmZ1bmNfd2Vha3JlZmxpc3QgIT0gTlVMTCkKKyAgICAgICAgUHlPYmplY3RfQ2xlYXJXZWFrUmVmcygoUHlPYmplY3QgKikgb3ApOworICAgIFB5X0RFQ1JFRihvcC0+ZnVuY19jb2RlKTsKKyAgICBQeV9ERUNSRUYob3AtPmZ1bmNfZ2xvYmFscyk7CisgICAgUHlfWERFQ1JFRihvcC0+ZnVuY19tb2R1bGUpOworICAgIFB5X0RFQ1JFRihvcC0+ZnVuY19uYW1lKTsKKyAgICBQeV9YREVDUkVGKG9wLT5mdW5jX2RlZmF1bHRzKTsKKyAgICBQeV9YREVDUkVGKG9wLT5mdW5jX2RvYyk7CisgICAgUHlfWERFQ1JFRihvcC0+ZnVuY19kaWN0KTsKKyAgICBQeV9YREVDUkVGKG9wLT5mdW5jX2Nsb3N1cmUpOworICAgIFB5T2JqZWN0X0dDX0RlbChvcCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCoKIGZ1bmNfcmVwcihQeUZ1bmN0aW9uT2JqZWN0ICpvcCkKIHsKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbUZvcm1hdCgiPGZ1bmN0aW9uICVzIGF0ICVwPiIsCi0JCQkJICAgUHlTdHJpbmdfQXNTdHJpbmcob3AtPmZ1bmNfbmFtZSksCi0JCQkJICAgb3ApOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tRm9ybWF0KCI8ZnVuY3Rpb24gJXMgYXQgJXA+IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19Bc1N0cmluZyhvcC0+ZnVuY19uYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcCk7CiB9CiAKIHN0YXRpYyBpbnQKIGZ1bmNfdHJhdmVyc2UoUHlGdW5jdGlvbk9iamVjdCAqZiwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JUHlfVklTSVQoZi0+ZnVuY19jb2RlKTsKLQlQeV9WSVNJVChmLT5mdW5jX2dsb2JhbHMpOwotCVB5X1ZJU0lUKGYtPmZ1bmNfbW9kdWxlKTsKLQlQeV9WSVNJVChmLT5mdW5jX2RlZmF1bHRzKTsKLQlQeV9WSVNJVChmLT5mdW5jX2RvYyk7Ci0JUHlfVklTSVQoZi0+ZnVuY19uYW1lKTsKLQlQeV9WSVNJVChmLT5mdW5jX2RpY3QpOwotCVB5X1ZJU0lUKGYtPmZ1bmNfY2xvc3VyZSk7Ci0JcmV0dXJuIDA7CisgICAgUHlfVklTSVQoZi0+ZnVuY19jb2RlKTsKKyAgICBQeV9WSVNJVChmLT5mdW5jX2dsb2JhbHMpOworICAgIFB5X1ZJU0lUKGYtPmZ1bmNfbW9kdWxlKTsKKyAgICBQeV9WSVNJVChmLT5mdW5jX2RlZmF1bHRzKTsKKyAgICBQeV9WSVNJVChmLT5mdW5jX2RvYyk7CisgICAgUHlfVklTSVQoZi0+ZnVuY19uYW1lKTsKKyAgICBQeV9WSVNJVChmLT5mdW5jX2RpY3QpOworICAgIFB5X1ZJU0lUKGYtPmZ1bmNfY2xvc3VyZSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmdW5jdGlvbl9jYWxsKFB5T2JqZWN0ICpmdW5jLCBQeU9iamVjdCAqYXJnLCBQeU9iamVjdCAqa3cpCiB7Ci0JUHlPYmplY3QgKnJlc3VsdDsKLQlQeU9iamVjdCAqYXJnZGVmczsKLQlQeU9iamVjdCAqKmQsICoqazsKLQlQeV9zc2l6ZV90IG5rLCBuZDsKKyAgICBQeU9iamVjdCAqcmVzdWx0OworICAgIFB5T2JqZWN0ICphcmdkZWZzOworICAgIFB5T2JqZWN0ICoqZCwgKiprOworICAgIFB5X3NzaXplX3QgbmssIG5kOwogCi0JYXJnZGVmcyA9IFB5RnVuY3Rpb25fR0VUX0RFRkFVTFRTKGZ1bmMpOwotCWlmIChhcmdkZWZzICE9IE5VTEwgJiYgUHlUdXBsZV9DaGVjayhhcmdkZWZzKSkgewotCQlkID0gJlB5VHVwbGVfR0VUX0lURU0oKFB5VHVwbGVPYmplY3QgKilhcmdkZWZzLCAwKTsKLQkJbmQgPSBQeVR1cGxlX1NpemUoYXJnZGVmcyk7Ci0JfQotCWVsc2UgewotCQlkID0gTlVMTDsKLQkJbmQgPSAwOwotCX0KKyAgICBhcmdkZWZzID0gUHlGdW5jdGlvbl9HRVRfREVGQVVMVFMoZnVuYyk7CisgICAgaWYgKGFyZ2RlZnMgIT0gTlVMTCAmJiBQeVR1cGxlX0NoZWNrKGFyZ2RlZnMpKSB7CisgICAgICAgIGQgPSAmUHlUdXBsZV9HRVRfSVRFTSgoUHlUdXBsZU9iamVjdCAqKWFyZ2RlZnMsIDApOworICAgICAgICBuZCA9IFB5VHVwbGVfU2l6ZShhcmdkZWZzKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGQgPSBOVUxMOworICAgICAgICBuZCA9IDA7CisgICAgfQogCi0JaWYgKGt3ICE9IE5VTEwgJiYgUHlEaWN0X0NoZWNrKGt3KSkgewotCQlQeV9zc2l6ZV90IHBvcywgaTsKLQkJbmsgPSBQeURpY3RfU2l6ZShrdyk7Ci0JCWsgPSBQeU1lbV9ORVcoUHlPYmplY3QgKiwgMipuayk7Ci0JCWlmIChrID09IE5VTEwpIHsKLQkJCVB5RXJyX05vTWVtb3J5KCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlwb3MgPSBpID0gMDsKLQkJd2hpbGUgKFB5RGljdF9OZXh0KGt3LCAmcG9zLCAma1tpXSwgJmtbaSsxXSkpCi0JCQlpICs9IDI7Ci0JCW5rID0gaS8yOwotCQkvKiBYWFggVGhpcyBpcyBicm9rZW4gaWYgdGhlIGNhbGxlciBkZWxldGVzIGRpY3QgaXRlbXMhICovCi0JfQotCWVsc2UgewotCQlrID0gTlVMTDsKLQkJbmsgPSAwOwotCX0KKyAgICBpZiAoa3cgIT0gTlVMTCAmJiBQeURpY3RfQ2hlY2soa3cpKSB7CisgICAgICAgIFB5X3NzaXplX3QgcG9zLCBpOworICAgICAgICBuayA9IFB5RGljdF9TaXplKGt3KTsKKyAgICAgICAgayA9IFB5TWVtX05FVyhQeU9iamVjdCAqLCAyKm5rKTsKKyAgICAgICAgaWYgKGsgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHBvcyA9IGkgPSAwOworICAgICAgICB3aGlsZSAoUHlEaWN0X05leHQoa3csICZwb3MsICZrW2ldLCAma1tpKzFdKSkKKyAgICAgICAgICAgIGkgKz0gMjsKKyAgICAgICAgbmsgPSBpLzI7CisgICAgICAgIC8qIFhYWCBUaGlzIGlzIGJyb2tlbiBpZiB0aGUgY2FsbGVyIGRlbGV0ZXMgZGljdCBpdGVtcyEgKi8KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGsgPSBOVUxMOworICAgICAgICBuayA9IDA7CisgICAgfQogCi0JcmVzdWx0ID0gUHlFdmFsX0V2YWxDb2RlRXgoCi0JCShQeUNvZGVPYmplY3QgKilQeUZ1bmN0aW9uX0dFVF9DT0RFKGZ1bmMpLAotCQlQeUZ1bmN0aW9uX0dFVF9HTE9CQUxTKGZ1bmMpLCAoUHlPYmplY3QgKilOVUxMLAotCQkmUHlUdXBsZV9HRVRfSVRFTShhcmcsIDApLCBQeVR1cGxlX1NpemUoYXJnKSwKLQkJaywgbmssIGQsIG5kLAotCQlQeUZ1bmN0aW9uX0dFVF9DTE9TVVJFKGZ1bmMpKTsKKyAgICByZXN1bHQgPSBQeUV2YWxfRXZhbENvZGVFeCgKKyAgICAgICAgKFB5Q29kZU9iamVjdCAqKVB5RnVuY3Rpb25fR0VUX0NPREUoZnVuYyksCisgICAgICAgIFB5RnVuY3Rpb25fR0VUX0dMT0JBTFMoZnVuYyksIChQeU9iamVjdCAqKU5VTEwsCisgICAgICAgICZQeVR1cGxlX0dFVF9JVEVNKGFyZywgMCksIFB5VHVwbGVfU2l6ZShhcmcpLAorICAgICAgICBrLCBuaywgZCwgbmQsCisgICAgICAgIFB5RnVuY3Rpb25fR0VUX0NMT1NVUkUoZnVuYykpOwogCi0JaWYgKGsgIT0gTlVMTCkKLQkJUHlNZW1fREVMKGspOworICAgIGlmIChrICE9IE5VTEwpCisgICAgICAgIFB5TWVtX0RFTChrKTsKIAotCXJldHVybiByZXN1bHQ7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogLyogQmluZCBhIGZ1bmN0aW9uIHRvIGFuIG9iamVjdCAqLwogc3RhdGljIFB5T2JqZWN0ICoKIGZ1bmNfZGVzY3JfZ2V0KFB5T2JqZWN0ICpmdW5jLCBQeU9iamVjdCAqb2JqLCBQeU9iamVjdCAqdHlwZSkKIHsKLQlpZiAob2JqID09IFB5X05vbmUpCi0JCW9iaiA9IE5VTEw7Ci0JcmV0dXJuIFB5TWV0aG9kX05ldyhmdW5jLCBvYmosIHR5cGUpOworICAgIGlmIChvYmogPT0gUHlfTm9uZSkKKyAgICAgICAgb2JqID0gTlVMTDsKKyAgICByZXR1cm4gUHlNZXRob2RfTmV3KGZ1bmMsIG9iaiwgdHlwZSk7CiB9CiAKIFB5VHlwZU9iamVjdCBQeUZ1bmN0aW9uX1R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKLQkiZnVuY3Rpb24iLAotCXNpemVvZihQeUZ1bmN0aW9uT2JqZWN0KSwKLQkwLAotCShkZXN0cnVjdG9yKWZ1bmNfZGVhbGxvYywJCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkocmVwcmZ1bmMpZnVuY19yZXByLAkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkJLyogdHBfaGFzaCAqLwotCWZ1bmN0aW9uX2NhbGwsCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCQkvKiB0cF9nZXRhdHRybyAqLwotCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLAkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDLC8qIHRwX2ZsYWdzICovCi0JZnVuY19kb2MsCQkJCS8qIHRwX2RvYyAqLwotCSh0cmF2ZXJzZXByb2MpZnVuY190cmF2ZXJzZSwJCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0Jb2Zmc2V0b2YoUHlGdW5jdGlvbk9iamVjdCwgZnVuY193ZWFrcmVmbGlzdCksIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkJLyogdHBfaXRlcm5leHQgKi8KLQkwLAkJCQkJLyogdHBfbWV0aG9kcyAqLwotCWZ1bmNfbWVtYmVybGlzdCwJCQkvKiB0cF9tZW1iZXJzICovCi0JZnVuY19nZXRzZXRsaXN0LAkJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJCS8qIHRwX2RpY3QgKi8KLQlmdW5jX2Rlc2NyX2dldCwJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCW9mZnNldG9mKFB5RnVuY3Rpb25PYmplY3QsIGZ1bmNfZGljdCksCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaW5pdCAqLwotCTAsCQkJCQkvKiB0cF9hbGxvYyAqLwotCWZ1bmNfbmV3LAkJCQkvKiB0cF9uZXcgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQorICAgICJmdW5jdGlvbiIsCisgICAgc2l6ZW9mKFB5RnVuY3Rpb25PYmplY3QpLAorICAgIDAsCisgICAgKGRlc3RydWN0b3IpZnVuY19kZWFsbG9jLCAgICAgICAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIChyZXByZnVuYylmdW5jX3JlcHIsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIGZ1bmN0aW9uX2NhbGwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQywvKiB0cF9mbGFncyAqLworICAgIGZ1bmNfZG9jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgKHRyYXZlcnNlcHJvYylmdW5jX3RyYXZlcnNlLCAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgb2Zmc2V0b2YoUHlGdW5jdGlvbk9iamVjdCwgZnVuY193ZWFrcmVmbGlzdCksIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIGZ1bmNfbWVtYmVybGlzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIGZ1bmNfZ2V0c2V0bGlzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgZnVuY19kZXNjcl9nZXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIG9mZnNldG9mKFB5RnVuY3Rpb25PYmplY3QsIGZ1bmNfZGljdCksICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBmdW5jX25ldywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLwogfTsKIAogCkBAIC01OTIsOSArNTkyLDkgQEAKICAgIFRvIGRlY2xhcmUgYSBjbGFzcyBtZXRob2QsIHVzZSB0aGlzIGlkaW9tOgogCiAgICAgIGNsYXNzIEM6Ci0gICAgICAgICBkZWYgZihjbHMsIGFyZzEsIGFyZzIsIC4uLik6IC4uLgotCSBmID0gY2xhc3NtZXRob2QoZikKLSAgIAorICAgICBkZWYgZihjbHMsIGFyZzEsIGFyZzIsIC4uLik6IC4uLgorICAgICBmID0gY2xhc3NtZXRob2QoZikKKwogICAgSXQgY2FuIGJlIGNhbGxlZCBlaXRoZXIgb24gdGhlIGNsYXNzIChlLmcuIEMuZigpKSBvciBvbiBhbiBpbnN0YW5jZQogICAgKGUuZy4gQygpLmYoKSk7IHRoZSBpbnN0YW5jZSBpcyBpZ25vcmVkIGV4Y2VwdCBmb3IgaXRzIGNsYXNzLgogICAgSWYgYSBjbGFzcyBtZXRob2QgaXMgY2FsbGVkIGZvciBhIGRlcml2ZWQgY2xhc3MsIHRoZSBkZXJpdmVkIGNsYXNzCkBAIC02MDUsNjggKzYwNSw2OCBAQAogKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewotCVB5T2JqZWN0X0hFQUQKLQlQeU9iamVjdCAqY21fY2FsbGFibGU7CisgICAgUHlPYmplY3RfSEVBRAorICAgIFB5T2JqZWN0ICpjbV9jYWxsYWJsZTsKIH0gY2xhc3NtZXRob2Q7CiAKIHN0YXRpYyB2b2lkCiBjbV9kZWFsbG9jKGNsYXNzbWV0aG9kICpjbSkKIHsKLQlfUHlPYmplY3RfR0NfVU5UUkFDSygoUHlPYmplY3QgKiljbSk7Ci0JUHlfWERFQ1JFRihjbS0+Y21fY2FsbGFibGUpOwotCVB5X1RZUEUoY20pLT50cF9mcmVlKChQeU9iamVjdCAqKWNtKTsKKyAgICBfUHlPYmplY3RfR0NfVU5UUkFDSygoUHlPYmplY3QgKiljbSk7CisgICAgUHlfWERFQ1JFRihjbS0+Y21fY2FsbGFibGUpOworICAgIFB5X1RZUEUoY20pLT50cF9mcmVlKChQeU9iamVjdCAqKWNtKTsKIH0KIAogc3RhdGljIGludAogY21fdHJhdmVyc2UoY2xhc3NtZXRob2QgKmNtLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlQeV9WSVNJVChjbS0+Y21fY2FsbGFibGUpOwotCXJldHVybiAwOworICAgIFB5X1ZJU0lUKGNtLT5jbV9jYWxsYWJsZSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIGNtX2NsZWFyKGNsYXNzbWV0aG9kICpjbSkKIHsKLQlQeV9DTEVBUihjbS0+Y21fY2FsbGFibGUpOwotCXJldHVybiAwOworICAgIFB5X0NMRUFSKGNtLT5jbV9jYWxsYWJsZSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIAogc3RhdGljIFB5T2JqZWN0ICoKIGNtX2Rlc2NyX2dldChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm9iaiwgUHlPYmplY3QgKnR5cGUpCiB7Ci0JY2xhc3NtZXRob2QgKmNtID0gKGNsYXNzbWV0aG9kICopc2VsZjsKKyAgICBjbGFzc21ldGhvZCAqY20gPSAoY2xhc3NtZXRob2QgKilzZWxmOwogCi0JaWYgKGNtLT5jbV9jYWxsYWJsZSA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCi0JCQkJInVuaW5pdGlhbGl6ZWQgY2xhc3NtZXRob2Qgb2JqZWN0Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAodHlwZSA9PSBOVUxMKQotCQl0eXBlID0gKFB5T2JqZWN0ICopKFB5X1RZUEUob2JqKSk7Ci0gCXJldHVybiBQeU1ldGhvZF9OZXcoY20tPmNtX2NhbGxhYmxlLAotCQkJICAgIHR5cGUsIChQeU9iamVjdCAqKShQeV9UWVBFKHR5cGUpKSk7CisgICAgaWYgKGNtLT5jbV9jYWxsYWJsZSA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAidW5pbml0aWFsaXplZCBjbGFzc21ldGhvZCBvYmplY3QiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmICh0eXBlID09IE5VTEwpCisgICAgICAgIHR5cGUgPSAoUHlPYmplY3QgKikoUHlfVFlQRShvYmopKTsKKyAgICByZXR1cm4gUHlNZXRob2RfTmV3KGNtLT5jbV9jYWxsYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsIChQeU9iamVjdCAqKShQeV9UWVBFKHR5cGUpKSk7CiB9CiAKIHN0YXRpYyBpbnQKIGNtX2luaXQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQljbGFzc21ldGhvZCAqY20gPSAoY2xhc3NtZXRob2QgKilzZWxmOwotCVB5T2JqZWN0ICpjYWxsYWJsZTsKKyAgICBjbGFzc21ldGhvZCAqY20gPSAoY2xhc3NtZXRob2QgKilzZWxmOworICAgIFB5T2JqZWN0ICpjYWxsYWJsZTsKIAotCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImNsYXNzbWV0aG9kIiwgMSwgMSwgJmNhbGxhYmxlKSkKLQkJcmV0dXJuIC0xOwotCWlmICghX1B5QXJnX05vS2V5d29yZHMoImNsYXNzbWV0aG9kIiwga3dkcykpCi0JCXJldHVybiAtMTsKLQlpZiAoIVB5Q2FsbGFibGVfQ2hlY2soY2FsbGFibGUpKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICInJXMnIG9iamVjdCBpcyBub3QgY2FsbGFibGUiLAotCQkgICAgIGNhbGxhYmxlLT5vYl90eXBlLT50cF9uYW1lKTsKLQkJcmV0dXJuIC0xOwotCX0KLQkKLQlQeV9JTkNSRUYoY2FsbGFibGUpOwotCWNtLT5jbV9jYWxsYWJsZSA9IGNhbGxhYmxlOwotCXJldHVybiAwOworICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImNsYXNzbWV0aG9kIiwgMSwgMSwgJmNhbGxhYmxlKSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmICghX1B5QXJnX05vS2V5d29yZHMoImNsYXNzbWV0aG9kIiwga3dkcykpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAoIVB5Q2FsbGFibGVfQ2hlY2soY2FsbGFibGUpKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICInJXMnIG9iamVjdCBpcyBub3QgY2FsbGFibGUiLAorICAgICAgICAgICAgIGNhbGxhYmxlLT5vYl90eXBlLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIFB5X0lOQ1JFRihjYWxsYWJsZSk7CisgICAgY20tPmNtX2NhbGxhYmxlID0gY2FsbGFibGU7CisgICAgcmV0dXJuIDA7CiB9CiAKIFB5RG9jX1NUUlZBUihjbGFzc21ldGhvZF9kb2MsCkBAIC02OTEsNTcgKzY5MSw1NyBAQAogSWYgeW91IHdhbnQgdGhvc2UsIHNlZSB0aGUgc3RhdGljbWV0aG9kIGJ1aWx0aW4uIik7CiAKIFB5VHlwZU9iamVjdCBQeUNsYXNzTWV0aG9kX1R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKLQkiY2xhc3NtZXRob2QiLAotCXNpemVvZihjbGFzc21ldGhvZCksCi0JMCwKLQkoZGVzdHJ1Y3RvciljbV9kZWFsbG9jLAkJCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfcmVwciAqLwotCTAsCQkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCQkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFIHwgUHlfVFBGTEFHU19IQVZFX0dDLAotCWNsYXNzbWV0aG9kX2RvYywJCQkvKiB0cF9kb2MgKi8KLQkodHJhdmVyc2Vwcm9jKWNtX3RyYXZlcnNlLAkJLyogdHBfdHJhdmVyc2UgKi8KLQkoaW5xdWlyeSljbV9jbGVhciwJCQkvKiB0cF9jbGVhciAqLwotCTAsCQkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCTAsCQkJCQkvKiB0cF9pdGVyICovCi0JMCwJCQkJCS8qIHRwX2l0ZXJuZXh0ICovCi0JMCwJCQkJCS8qIHRwX21ldGhvZHMgKi8KLQkwLAkJCQkJLyogdHBfbWVtYmVycyAqLwotCTAsCQkJCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCQkvKiB0cF9kaWN0ICovCi0JY21fZGVzY3JfZ2V0LAkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQljbV9pbml0LAkJCQkvKiB0cF9pbml0ICovCi0JUHlUeXBlX0dlbmVyaWNBbGxvYywJCQkvKiB0cF9hbGxvYyAqLwotCVB5VHlwZV9HZW5lcmljTmV3LAkJCS8qIHRwX25ldyAqLwotCVB5T2JqZWN0X0dDX0RlbCwJICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQorICAgICJjbGFzc21ldGhvZCIsCisgICAgc2l6ZW9mKGNsYXNzbWV0aG9kKSwKKyAgICAwLAorICAgIChkZXN0cnVjdG9yKWNtX2RlYWxsb2MsICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFIHwgUHlfVFBGTEFHU19IQVZFX0dDLAorICAgIGNsYXNzbWV0aG9kX2RvYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgKHRyYXZlcnNlcHJvYyljbV90cmF2ZXJzZSwgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIChpbnF1aXJ5KWNtX2NsZWFyLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIGNtX2Rlc2NyX2dldCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICBjbV9pbml0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICBQeVR5cGVfR2VuZXJpY0FsbG9jLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgUHlUeXBlX0dlbmVyaWNOZXcsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICBQeU9iamVjdF9HQ19EZWwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KIH07CiAKIFB5T2JqZWN0ICoKIFB5Q2xhc3NNZXRob2RfTmV3KFB5T2JqZWN0ICpjYWxsYWJsZSkKIHsKLQljbGFzc21ldGhvZCAqY20gPSAoY2xhc3NtZXRob2QgKikKLQkJUHlUeXBlX0dlbmVyaWNBbGxvYygmUHlDbGFzc01ldGhvZF9UeXBlLCAwKTsKLQlpZiAoY20gIT0gTlVMTCkgewotCQlQeV9JTkNSRUYoY2FsbGFibGUpOwotCQljbS0+Y21fY2FsbGFibGUgPSBjYWxsYWJsZTsKLQl9Ci0JcmV0dXJuIChQeU9iamVjdCAqKWNtOworICAgIGNsYXNzbWV0aG9kICpjbSA9IChjbGFzc21ldGhvZCAqKQorICAgICAgICBQeVR5cGVfR2VuZXJpY0FsbG9jKCZQeUNsYXNzTWV0aG9kX1R5cGUsIDApOworICAgIGlmIChjbSAhPSBOVUxMKSB7CisgICAgICAgIFB5X0lOQ1JFRihjYWxsYWJsZSk7CisgICAgICAgIGNtLT5jbV9jYWxsYWJsZSA9IGNhbGxhYmxlOworICAgIH0KKyAgICByZXR1cm4gKFB5T2JqZWN0ICopY207CiB9CiAKIApAQCAtNzUxLDggKzc1MSw4IEBACiAgICBUbyBkZWNsYXJlIGEgc3RhdGljIG1ldGhvZCwgdXNlIHRoaXMgaWRpb206CiAKICAgICAgY2xhc3MgQzoKLSAgICAgICAgIGRlZiBmKGFyZzEsIGFyZzIsIC4uLik6IC4uLgotCSBmID0gc3RhdGljbWV0aG9kKGYpCisgICAgIGRlZiBmKGFyZzEsIGFyZzIsIC4uLik6IC4uLgorICAgICBmID0gc3RhdGljbWV0aG9kKGYpCiAKICAgIEl0IGNhbiBiZSBjYWxsZWQgZWl0aGVyIG9uIHRoZSBjbGFzcyAoZS5nLiBDLmYoKSkgb3Igb24gYW4gaW5zdGFuY2UKICAgIChlLmcuIEMoKS5mKCkpOyB0aGUgaW5zdGFuY2UgaXMgaWdub3JlZCBleGNlcHQgZm9yIGl0cyBjbGFzcy4KQEAgLTc2Miw2MSArNzYyLDYxIEBACiAqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCVB5T2JqZWN0ICpzbV9jYWxsYWJsZTsKKyAgICBQeU9iamVjdF9IRUFECisgICAgUHlPYmplY3QgKnNtX2NhbGxhYmxlOwogfSBzdGF0aWNtZXRob2Q7CiAKIHN0YXRpYyB2b2lkCiBzbV9kZWFsbG9jKHN0YXRpY21ldGhvZCAqc20pCiB7Ci0JX1B5T2JqZWN0X0dDX1VOVFJBQ0soKFB5T2JqZWN0ICopc20pOwotCVB5X1hERUNSRUYoc20tPnNtX2NhbGxhYmxlKTsKLQlQeV9UWVBFKHNtKS0+dHBfZnJlZSgoUHlPYmplY3QgKilzbSk7CisgICAgX1B5T2JqZWN0X0dDX1VOVFJBQ0soKFB5T2JqZWN0ICopc20pOworICAgIFB5X1hERUNSRUYoc20tPnNtX2NhbGxhYmxlKTsKKyAgICBQeV9UWVBFKHNtKS0+dHBfZnJlZSgoUHlPYmplY3QgKilzbSk7CiB9CiAKIHN0YXRpYyBpbnQKIHNtX3RyYXZlcnNlKHN0YXRpY21ldGhvZCAqc20sIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotCVB5X1ZJU0lUKHNtLT5zbV9jYWxsYWJsZSk7Ci0JcmV0dXJuIDA7CisgICAgUHlfVklTSVQoc20tPnNtX2NhbGxhYmxlKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogc21fY2xlYXIoc3RhdGljbWV0aG9kICpzbSkKIHsKLQlQeV9YREVDUkVGKHNtLT5zbV9jYWxsYWJsZSk7Ci0Jc20tPnNtX2NhbGxhYmxlID0gTlVMTDsKKyAgICBQeV9YREVDUkVGKHNtLT5zbV9jYWxsYWJsZSk7CisgICAgc20tPnNtX2NhbGxhYmxlID0gTlVMTDsKIAotCXJldHVybiAwOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc21fZGVzY3JfZ2V0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqb2JqLCBQeU9iamVjdCAqdHlwZSkKIHsKLQlzdGF0aWNtZXRob2QgKnNtID0gKHN0YXRpY21ldGhvZCAqKXNlbGY7CisgICAgc3RhdGljbWV0aG9kICpzbSA9IChzdGF0aWNtZXRob2QgKilzZWxmOwogCi0JaWYgKHNtLT5zbV9jYWxsYWJsZSA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCi0JCQkJInVuaW5pdGlhbGl6ZWQgc3RhdGljbWV0aG9kIG9iamVjdCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JUHlfSU5DUkVGKHNtLT5zbV9jYWxsYWJsZSk7Ci0JcmV0dXJuIHNtLT5zbV9jYWxsYWJsZTsKKyAgICBpZiAoc20tPnNtX2NhbGxhYmxlID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ1bmluaXRpYWxpemVkIHN0YXRpY21ldGhvZCBvYmplY3QiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5X0lOQ1JFRihzbS0+c21fY2FsbGFibGUpOworICAgIHJldHVybiBzbS0+c21fY2FsbGFibGU7CiB9CiAKIHN0YXRpYyBpbnQKIHNtX2luaXQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlzdGF0aWNtZXRob2QgKnNtID0gKHN0YXRpY21ldGhvZCAqKXNlbGY7Ci0JUHlPYmplY3QgKmNhbGxhYmxlOworICAgIHN0YXRpY21ldGhvZCAqc20gPSAoc3RhdGljbWV0aG9kICopc2VsZjsKKyAgICBQeU9iamVjdCAqY2FsbGFibGU7CiAKLQlpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJzdGF0aWNtZXRob2QiLCAxLCAxLCAmY2FsbGFibGUpKQotCQlyZXR1cm4gLTE7Ci0JaWYgKCFfUHlBcmdfTm9LZXl3b3Jkcygic3RhdGljbWV0aG9kIiwga3dkcykpCi0JCXJldHVybiAtMTsKLQlQeV9JTkNSRUYoY2FsbGFibGUpOwotCXNtLT5zbV9jYWxsYWJsZSA9IGNhbGxhYmxlOwotCXJldHVybiAwOworICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInN0YXRpY21ldGhvZCIsIDEsIDEsICZjYWxsYWJsZSkpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAoIV9QeUFyZ19Ob0tleXdvcmRzKCJzdGF0aWNtZXRob2QiLCBrd2RzKSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIFB5X0lOQ1JFRihjYWxsYWJsZSk7CisgICAgc20tPnNtX2NhbGxhYmxlID0gY2FsbGFibGU7CisgICAgcmV0dXJuIDA7CiB9CiAKIFB5RG9jX1NUUlZBUihzdGF0aWNtZXRob2RfZG9jLApAQCAtODI4LDggKzgyOCw4IEBACiBUbyBkZWNsYXJlIGEgc3RhdGljIG1ldGhvZCwgdXNlIHRoaXMgaWRpb206XG5cCiBcblwKICAgICAgY2xhc3MgQzpcblwKLSAgICAgICAgIGRlZiBmKGFyZzEsIGFyZzIsIC4uLik6IC4uLlxuXAotCSBmID0gc3RhdGljbWV0aG9kKGYpXG5cCisgICAgIGRlZiBmKGFyZzEsIGFyZzIsIC4uLik6IC4uLlxuXAorICAgICBmID0gc3RhdGljbWV0aG9kKGYpXG5cCiBcblwKIEl0IGNhbiBiZSBjYWxsZWQgZWl0aGVyIG9uIHRoZSBjbGFzcyAoZS5nLiBDLmYoKSkgb3Igb24gYW4gaW5zdGFuY2VcblwKIChlLmcuIEMoKS5mKCkpLiAgVGhlIGluc3RhbmNlIGlzIGlnbm9yZWQgZXhjZXB0IGZvciBpdHMgY2xhc3MuXG5cCkBAIC04MzgsNTUgKzgzOCw1NSBAQAogRm9yIGEgbW9yZSBhZHZhbmNlZCBjb25jZXB0LCBzZWUgdGhlIGNsYXNzbWV0aG9kIGJ1aWx0aW4uIik7CiAKIFB5VHlwZU9iamVjdCBQeVN0YXRpY01ldGhvZF9UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCi0JInN0YXRpY21ldGhvZCIsCi0Jc2l6ZW9mKHN0YXRpY21ldGhvZCksCi0JMCwKLQkoZGVzdHJ1Y3RvcilzbV9kZWFsbG9jLAkJCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfcmVwciAqLwotCTAsCQkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCQkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFIHwgUHlfVFBGTEFHU19IQVZFX0dDLAotCXN0YXRpY21ldGhvZF9kb2MsCQkJLyogdHBfZG9jICovCi0JKHRyYXZlcnNlcHJvYylzbV90cmF2ZXJzZSwJCS8qIHRwX3RyYXZlcnNlICovCi0JKGlucXVpcnkpc21fY2xlYXIsCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaXRlciAqLwotCTAsCQkJCQkvKiB0cF9pdGVybmV4dCAqLwotCTAsCQkJCQkvKiB0cF9tZXRob2RzICovCi0JMCwJCQkJCS8qIHRwX21lbWJlcnMgKi8KLQkwLAkJCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkJLyogdHBfZGljdCAqLwotCXNtX2Rlc2NyX2dldCwJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCi0Jc21faW5pdCwJCQkJLyogdHBfaW5pdCAqLwotCVB5VHlwZV9HZW5lcmljQWxsb2MsCQkJLyogdHBfYWxsb2MgKi8KLQlQeVR5cGVfR2VuZXJpY05ldywJCQkvKiB0cF9uZXcgKi8KLQlQeU9iamVjdF9HQ19EZWwsICAgICAgICAgICAJCS8qIHRwX2ZyZWUgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQorICAgICJzdGF0aWNtZXRob2QiLAorICAgIHNpemVvZihzdGF0aWNtZXRob2QpLAorICAgIDAsCisgICAgKGRlc3RydWN0b3Ipc21fZGVhbGxvYywgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfQkFTRVRZUEUgfCBQeV9UUEZMQUdTX0hBVkVfR0MsCisgICAgc3RhdGljbWV0aG9kX2RvYywgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAodHJhdmVyc2Vwcm9jKXNtX3RyYXZlcnNlLCAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgKGlucXVpcnkpc21fY2xlYXIsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgc21fZGVzY3JfZ2V0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIHNtX2luaXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIFB5VHlwZV9HZW5lcmljQWxsb2MsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBQeVR5cGVfR2VuZXJpY05ldywgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworICAgIFB5T2JqZWN0X0dDX0RlbCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKIAogUHlPYmplY3QgKgogUHlTdGF0aWNNZXRob2RfTmV3KFB5T2JqZWN0ICpjYWxsYWJsZSkKIHsKLQlzdGF0aWNtZXRob2QgKnNtID0gKHN0YXRpY21ldGhvZCAqKQotCQlQeVR5cGVfR2VuZXJpY0FsbG9jKCZQeVN0YXRpY01ldGhvZF9UeXBlLCAwKTsKLQlpZiAoc20gIT0gTlVMTCkgewotCQlQeV9JTkNSRUYoY2FsbGFibGUpOwotCQlzbS0+c21fY2FsbGFibGUgPSBjYWxsYWJsZTsKLQl9Ci0JcmV0dXJuIChQeU9iamVjdCAqKXNtOworICAgIHN0YXRpY21ldGhvZCAqc20gPSAoc3RhdGljbWV0aG9kICopCisgICAgICAgIFB5VHlwZV9HZW5lcmljQWxsb2MoJlB5U3RhdGljTWV0aG9kX1R5cGUsIDApOworICAgIGlmIChzbSAhPSBOVUxMKSB7CisgICAgICAgIFB5X0lOQ1JFRihjYWxsYWJsZSk7CisgICAgICAgIHNtLT5zbV9jYWxsYWJsZSA9IGNhbGxhYmxlOworICAgIH0KKyAgICByZXR1cm4gKFB5T2JqZWN0ICopc207CiB9CmRpZmYgLS1naXQgYS9PYmplY3RzL2dlbm9iamVjdC5jIGIvT2JqZWN0cy9nZW5vYmplY3QuYwppbmRleCBjM2ZhNjRiLi5hZjgxMmMwIDEwMDY0NAotLS0gYS9PYmplY3RzL2dlbm9iamVjdC5jCisrKyBiL09iamVjdHMvZ2Vub2JqZWN0LmMKQEAgLTEwLDEwMyArMTAsMTAzIEBACiBzdGF0aWMgaW50CiBnZW5fdHJhdmVyc2UoUHlHZW5PYmplY3QgKmdlbiwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JUHlfVklTSVQoKFB5T2JqZWN0ICopZ2VuLT5naV9mcmFtZSk7Ci0JUHlfVklTSVQoZ2VuLT5naV9jb2RlKTsKLQlyZXR1cm4gMDsKKyAgICBQeV9WSVNJVCgoUHlPYmplY3QgKilnZW4tPmdpX2ZyYW1lKTsKKyAgICBQeV9WSVNJVChnZW4tPmdpX2NvZGUpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZAogZ2VuX2RlYWxsb2MoUHlHZW5PYmplY3QgKmdlbikKIHsKLQlQeU9iamVjdCAqc2VsZiA9IChQeU9iamVjdCAqKSBnZW47CisgICAgUHlPYmplY3QgKnNlbGYgPSAoUHlPYmplY3QgKikgZ2VuOwogCi0JX1B5T2JqZWN0X0dDX1VOVFJBQ0soZ2VuKTsKKyAgICBfUHlPYmplY3RfR0NfVU5UUkFDSyhnZW4pOwogCi0JaWYgKGdlbi0+Z2lfd2Vha3JlZmxpc3QgIT0gTlVMTCkKLQkJUHlPYmplY3RfQ2xlYXJXZWFrUmVmcyhzZWxmKTsKKyAgICBpZiAoZ2VuLT5naV93ZWFrcmVmbGlzdCAhPSBOVUxMKQorICAgICAgICBQeU9iamVjdF9DbGVhcldlYWtSZWZzKHNlbGYpOwogCi0JX1B5T2JqZWN0X0dDX1RSQUNLKHNlbGYpOworICAgIF9QeU9iamVjdF9HQ19UUkFDSyhzZWxmKTsKIAotCWlmIChnZW4tPmdpX2ZyYW1lICE9IE5VTEwgJiYgZ2VuLT5naV9mcmFtZS0+Zl9zdGFja3RvcCAhPSBOVUxMKSB7Ci0JCS8qIEdlbmVyYXRvciBpcyBwYXVzZWQsIHNvIHdlIG5lZWQgdG8gY2xvc2UgKi8KLQkJUHlfVFlQRShnZW4pLT50cF9kZWwoc2VsZik7Ci0JCWlmIChzZWxmLT5vYl9yZWZjbnQgPiAwKQotCQkJcmV0dXJuOwkJLyogcmVzdXJyZWN0ZWQuICA6KCAqLwotCX0KKyAgICBpZiAoZ2VuLT5naV9mcmFtZSAhPSBOVUxMICYmIGdlbi0+Z2lfZnJhbWUtPmZfc3RhY2t0b3AgIT0gTlVMTCkgeworICAgICAgICAvKiBHZW5lcmF0b3IgaXMgcGF1c2VkLCBzbyB3ZSBuZWVkIHRvIGNsb3NlICovCisgICAgICAgIFB5X1RZUEUoZ2VuKS0+dHBfZGVsKHNlbGYpOworICAgICAgICBpZiAoc2VsZi0+b2JfcmVmY250ID4gMCkKKyAgICAgICAgICAgIHJldHVybjsgICAgICAgICAgICAgICAgICAgICAvKiByZXN1cnJlY3RlZC4gIDooICovCisgICAgfQogCi0JX1B5T2JqZWN0X0dDX1VOVFJBQ0soc2VsZik7Ci0JUHlfQ0xFQVIoZ2VuLT5naV9mcmFtZSk7Ci0JUHlfQ0xFQVIoZ2VuLT5naV9jb2RlKTsKLQlQeU9iamVjdF9HQ19EZWwoZ2VuKTsKKyAgICBfUHlPYmplY3RfR0NfVU5UUkFDSyhzZWxmKTsKKyAgICBQeV9DTEVBUihnZW4tPmdpX2ZyYW1lKTsKKyAgICBQeV9DTEVBUihnZW4tPmdpX2NvZGUpOworICAgIFB5T2JqZWN0X0dDX0RlbChnZW4pOwogfQogCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZW5fc2VuZF9leChQeUdlbk9iamVjdCAqZ2VuLCBQeU9iamVjdCAqYXJnLCBpbnQgZXhjKQogewotCVB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfR0VUKCk7Ci0JUHlGcmFtZU9iamVjdCAqZiA9IGdlbi0+Z2lfZnJhbWU7Ci0JUHlPYmplY3QgKnJlc3VsdDsKKyAgICBQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dFVCgpOworICAgIFB5RnJhbWVPYmplY3QgKmYgPSBnZW4tPmdpX2ZyYW1lOworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CiAKLQlpZiAoZ2VuLT5naV9ydW5uaW5nKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJnZW5lcmF0b3IgYWxyZWFkeSBleGVjdXRpbmciKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChmPT1OVUxMIHx8IGYtPmZfc3RhY2t0b3AgPT0gTlVMTCkgewotCQkvKiBPbmx5IHNldCBleGNlcHRpb24gaWYgY2FsbGVkIGZyb20gc2VuZCgpICovCi0JCWlmIChhcmcgJiYgIWV4YykKLQkJCVB5RXJyX1NldE5vbmUoUHlFeGNfU3RvcEl0ZXJhdGlvbik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoZ2VuLT5naV9ydW5uaW5nKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImdlbmVyYXRvciBhbHJlYWR5IGV4ZWN1dGluZyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKGY9PU5VTEwgfHwgZi0+Zl9zdGFja3RvcCA9PSBOVUxMKSB7CisgICAgICAgIC8qIE9ubHkgc2V0IGV4Y2VwdGlvbiBpZiBjYWxsZWQgZnJvbSBzZW5kKCkgKi8KKyAgICAgICAgaWYgKGFyZyAmJiAhZXhjKQorICAgICAgICAgICAgUHlFcnJfU2V0Tm9uZShQeUV4Y19TdG9wSXRlcmF0aW9uKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaWYgKGYtPmZfbGFzdGkgPT0gLTEpIHsKLQkJaWYgKGFyZyAmJiBhcmcgIT0gUHlfTm9uZSkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkJImNhbid0IHNlbmQgbm9uLU5vbmUgdmFsdWUgdG8gYSAiCi0JCQkJCSJqdXN0LXN0YXJ0ZWQgZ2VuZXJhdG9yIik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0gZWxzZSB7Ci0JCS8qIFB1c2ggYXJnIG9udG8gdGhlIGZyYW1lJ3MgdmFsdWUgc3RhY2sgKi8KLQkJcmVzdWx0ID0gYXJnID8gYXJnIDogUHlfTm9uZTsKLQkgICAgICAgIFB5X0lOQ1JFRihyZXN1bHQpOwotCSAgICAgICAgKihmLT5mX3N0YWNrdG9wKyspID0gcmVzdWx0OwotCX0KKyAgICBpZiAoZi0+Zl9sYXN0aSA9PSAtMSkgeworICAgICAgICBpZiAoYXJnICYmIGFyZyAhPSBQeV9Ob25lKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjYW4ndCBzZW5kIG5vbi1Ob25lIHZhbHVlIHRvIGEgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJqdXN0LXN0YXJ0ZWQgZ2VuZXJhdG9yIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8qIFB1c2ggYXJnIG9udG8gdGhlIGZyYW1lJ3MgdmFsdWUgc3RhY2sgKi8KKyAgICAgICAgcmVzdWx0ID0gYXJnID8gYXJnIDogUHlfTm9uZTsKKyAgICAgICAgUHlfSU5DUkVGKHJlc3VsdCk7CisgICAgICAgICooZi0+Zl9zdGFja3RvcCsrKSA9IHJlc3VsdDsKKyAgICB9CiAKLQkvKiBHZW5lcmF0b3JzIGFsd2F5cyByZXR1cm4gdG8gdGhlaXIgbW9zdCByZWNlbnQgY2FsbGVyLCBub3QKLQkgKiBuZWNlc3NhcmlseSB0aGVpciBjcmVhdG9yLiAqLwotCVB5X1hJTkNSRUYodHN0YXRlLT5mcmFtZSk7Ci0JYXNzZXJ0KGYtPmZfYmFjayA9PSBOVUxMKTsKLQlmLT5mX2JhY2sgPSB0c3RhdGUtPmZyYW1lOworICAgIC8qIEdlbmVyYXRvcnMgYWx3YXlzIHJldHVybiB0byB0aGVpciBtb3N0IHJlY2VudCBjYWxsZXIsIG5vdAorICAgICAqIG5lY2Vzc2FyaWx5IHRoZWlyIGNyZWF0b3IuICovCisgICAgUHlfWElOQ1JFRih0c3RhdGUtPmZyYW1lKTsKKyAgICBhc3NlcnQoZi0+Zl9iYWNrID09IE5VTEwpOworICAgIGYtPmZfYmFjayA9IHRzdGF0ZS0+ZnJhbWU7CiAKLQlnZW4tPmdpX3J1bm5pbmcgPSAxOwotCXJlc3VsdCA9IFB5RXZhbF9FdmFsRnJhbWVFeChmLCBleGMpOwotCWdlbi0+Z2lfcnVubmluZyA9IDA7CisgICAgZ2VuLT5naV9ydW5uaW5nID0gMTsKKyAgICByZXN1bHQgPSBQeUV2YWxfRXZhbEZyYW1lRXgoZiwgZXhjKTsKKyAgICBnZW4tPmdpX3J1bm5pbmcgPSAwOwogCi0JLyogRG9uJ3Qga2VlcCB0aGUgcmVmZXJlbmNlIHRvIGZfYmFjayBhbnkgbG9uZ2VyIHRoYW4gbmVjZXNzYXJ5LiAgSXQKLQkgKiBtYXkga2VlcCBhIGNoYWluIG9mIGZyYW1lcyBhbGl2ZSBvciBpdCBjb3VsZCBjcmVhdGUgYSByZWZlcmVuY2UKLQkgKiBjeWNsZS4gKi8KLQlhc3NlcnQoZi0+Zl9iYWNrID09IHRzdGF0ZS0+ZnJhbWUpOwotCVB5X0NMRUFSKGYtPmZfYmFjayk7CisgICAgLyogRG9uJ3Qga2VlcCB0aGUgcmVmZXJlbmNlIHRvIGZfYmFjayBhbnkgbG9uZ2VyIHRoYW4gbmVjZXNzYXJ5LiAgSXQKKyAgICAgKiBtYXkga2VlcCBhIGNoYWluIG9mIGZyYW1lcyBhbGl2ZSBvciBpdCBjb3VsZCBjcmVhdGUgYSByZWZlcmVuY2UKKyAgICAgKiBjeWNsZS4gKi8KKyAgICBhc3NlcnQoZi0+Zl9iYWNrID09IHRzdGF0ZS0+ZnJhbWUpOworICAgIFB5X0NMRUFSKGYtPmZfYmFjayk7CiAKLQkvKiBJZiB0aGUgZ2VuZXJhdG9yIGp1c3QgcmV0dXJuZWQgKGFzIG9wcG9zZWQgdG8geWllbGRpbmcpLCBzaWduYWwKLQkgKiB0aGF0IHRoZSBnZW5lcmF0b3IgaXMgZXhoYXVzdGVkLiAqLwotCWlmIChyZXN1bHQgPT0gUHlfTm9uZSAmJiBmLT5mX3N0YWNrdG9wID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCXJlc3VsdCA9IE5VTEw7Ci0JCS8qIFNldCBleGNlcHRpb24gaWYgbm90IGNhbGxlZCBieSBnZW5faXRlcm5leHQoKSAqLwotCQlpZiAoYXJnKQotCQkJUHlFcnJfU2V0Tm9uZShQeUV4Y19TdG9wSXRlcmF0aW9uKTsKLQl9CisgICAgLyogSWYgdGhlIGdlbmVyYXRvciBqdXN0IHJldHVybmVkIChhcyBvcHBvc2VkIHRvIHlpZWxkaW5nKSwgc2lnbmFsCisgICAgICogdGhhdCB0aGUgZ2VuZXJhdG9yIGlzIGV4aGF1c3RlZC4gKi8KKyAgICBpZiAocmVzdWx0ID09IFB5X05vbmUgJiYgZi0+Zl9zdGFja3RvcCA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICByZXN1bHQgPSBOVUxMOworICAgICAgICAvKiBTZXQgZXhjZXB0aW9uIGlmIG5vdCBjYWxsZWQgYnkgZ2VuX2l0ZXJuZXh0KCkgKi8KKyAgICAgICAgaWYgKGFyZykKKyAgICAgICAgICAgIFB5RXJyX1NldE5vbmUoUHlFeGNfU3RvcEl0ZXJhdGlvbik7CisgICAgfQogCi0JaWYgKCFyZXN1bHQgfHwgZi0+Zl9zdGFja3RvcCA9PSBOVUxMKSB7Ci0JCS8qIGdlbmVyYXRvciBjYW4ndCBiZSByZXJ1biwgc28gcmVsZWFzZSB0aGUgZnJhbWUgKi8KLQkJUHlfREVDUkVGKGYpOwotCQlnZW4tPmdpX2ZyYW1lID0gTlVMTDsKLQl9CisgICAgaWYgKCFyZXN1bHQgfHwgZi0+Zl9zdGFja3RvcCA9PSBOVUxMKSB7CisgICAgICAgIC8qIGdlbmVyYXRvciBjYW4ndCBiZSByZXJ1biwgc28gcmVsZWFzZSB0aGUgZnJhbWUgKi8KKyAgICAgICAgUHlfREVDUkVGKGYpOworICAgICAgICBnZW4tPmdpX2ZyYW1lID0gTlVMTDsKKyAgICB9CiAKLQlyZXR1cm4gcmVzdWx0OworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIFB5RG9jX1NUUlZBUihzZW5kX2RvYywKQEAgLTExNiw3ICsxMTYsNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdlbl9zZW5kKFB5R2VuT2JqZWN0ICpnZW4sIFB5T2JqZWN0ICphcmcpCiB7Ci0JcmV0dXJuIGdlbl9zZW5kX2V4KGdlbiwgYXJnLCAwKTsKKyAgICByZXR1cm4gZ2VuX3NlbmRfZXgoZ2VuLCBhcmcsIDApOwogfQogCiBQeURvY19TVFJWQVIoY2xvc2VfZG9jLApAQCAtMTI1LDgzICsxMjUsODMgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZW5fY2xvc2UoUHlHZW5PYmplY3QgKmdlbiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKnJldHZhbDsKLQlQeUVycl9TZXROb25lKFB5RXhjX0dlbmVyYXRvckV4aXQpOwotCXJldHZhbCA9IGdlbl9zZW5kX2V4KGdlbiwgUHlfTm9uZSwgMSk7Ci0JaWYgKHJldHZhbCkgewotCQlQeV9ERUNSRUYocmV0dmFsKTsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKLQkJCQkiZ2VuZXJhdG9yIGlnbm9yZWQgR2VuZXJhdG9yRXhpdCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfU3RvcEl0ZXJhdGlvbikKLQkgICAgfHwgUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19HZW5lcmF0b3JFeGl0KSkKLQl7Ci0JCVB5RXJyX0NsZWFyKCk7CS8qIGlnbm9yZSB0aGVzZSBlcnJvcnMgKi8KLQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQlyZXR1cm4gUHlfTm9uZTsKLQl9Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlPYmplY3QgKnJldHZhbDsKKyAgICBQeUVycl9TZXROb25lKFB5RXhjX0dlbmVyYXRvckV4aXQpOworICAgIHJldHZhbCA9IGdlbl9zZW5kX2V4KGdlbiwgUHlfTm9uZSwgMSk7CisgICAgaWYgKHJldHZhbCkgeworICAgICAgICBQeV9ERUNSRUYocmV0dmFsKTsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJnZW5lcmF0b3IgaWdub3JlZCBHZW5lcmF0b3JFeGl0Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19TdG9wSXRlcmF0aW9uKQorICAgICAgICB8fCBQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0dlbmVyYXRvckV4aXQpKQorICAgIHsKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsgICAgICAgICAgLyogaWdub3JlIHRoZXNlIGVycm9ycyAqLworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIHJldHVybiBQeV9Ob25lOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIHZvaWQKIGdlbl9kZWwoUHlPYmplY3QgKnNlbGYpCiB7Ci0gICAgICAgIFB5T2JqZWN0ICpyZXM7Ci0gICAgICAgIFB5T2JqZWN0ICplcnJvcl90eXBlLCAqZXJyb3JfdmFsdWUsICplcnJvcl90cmFjZWJhY2s7Ci0JUHlHZW5PYmplY3QgKmdlbiA9IChQeUdlbk9iamVjdCAqKXNlbGY7CisgICAgUHlPYmplY3QgKnJlczsKKyAgICBQeU9iamVjdCAqZXJyb3JfdHlwZSwgKmVycm9yX3ZhbHVlLCAqZXJyb3JfdHJhY2ViYWNrOworICAgIFB5R2VuT2JqZWN0ICpnZW4gPSAoUHlHZW5PYmplY3QgKilzZWxmOwogCi0JaWYgKGdlbi0+Z2lfZnJhbWUgPT0gTlVMTCB8fCBnZW4tPmdpX2ZyYW1lLT5mX3N0YWNrdG9wID09IE5VTEwpCi0JCS8qIEdlbmVyYXRvciBpc24ndCBwYXVzZWQsIHNvIG5vIG5lZWQgdG8gY2xvc2UgKi8KLQkJcmV0dXJuOworICAgIGlmIChnZW4tPmdpX2ZyYW1lID09IE5VTEwgfHwgZ2VuLT5naV9mcmFtZS0+Zl9zdGFja3RvcCA9PSBOVUxMKQorICAgICAgICAvKiBHZW5lcmF0b3IgaXNuJ3QgcGF1c2VkLCBzbyBubyBuZWVkIHRvIGNsb3NlICovCisgICAgICAgIHJldHVybjsKIAotICAgICAgICAvKiBUZW1wb3JhcmlseSByZXN1cnJlY3QgdGhlIG9iamVjdC4gKi8KLSAgICAgICAgYXNzZXJ0KHNlbGYtPm9iX3JlZmNudCA9PSAwKTsKLSAgICAgICAgc2VsZi0+b2JfcmVmY250ID0gMTsKKyAgICAvKiBUZW1wb3JhcmlseSByZXN1cnJlY3QgdGhlIG9iamVjdC4gKi8KKyAgICBhc3NlcnQoc2VsZi0+b2JfcmVmY250ID09IDApOworICAgIHNlbGYtPm9iX3JlZmNudCA9IDE7CiAKLSAgICAgICAgLyogU2F2ZSB0aGUgY3VycmVudCBleGNlcHRpb24sIGlmIGFueS4gKi8KLSAgICAgICAgUHlFcnJfRmV0Y2goJmVycm9yX3R5cGUsICZlcnJvcl92YWx1ZSwgJmVycm9yX3RyYWNlYmFjayk7CisgICAgLyogU2F2ZSB0aGUgY3VycmVudCBleGNlcHRpb24sIGlmIGFueS4gKi8KKyAgICBQeUVycl9GZXRjaCgmZXJyb3JfdHlwZSwgJmVycm9yX3ZhbHVlLCAmZXJyb3JfdHJhY2ViYWNrKTsKIAotCXJlcyA9IGdlbl9jbG9zZShnZW4sIE5VTEwpOworICAgIHJlcyA9IGdlbl9jbG9zZShnZW4sIE5VTEwpOwogCi0JaWYgKHJlcyA9PSBOVUxMKQotCQlQeUVycl9Xcml0ZVVucmFpc2FibGUoc2VsZik7Ci0JZWxzZQotCQlQeV9ERUNSRUYocmVzKTsKKyAgICBpZiAocmVzID09IE5VTEwpCisgICAgICAgIFB5RXJyX1dyaXRlVW5yYWlzYWJsZShzZWxmKTsKKyAgICBlbHNlCisgICAgICAgIFB5X0RFQ1JFRihyZXMpOwogCi0gICAgICAgIC8qIFJlc3RvcmUgdGhlIHNhdmVkIGV4Y2VwdGlvbi4gKi8KLSAgICAgICAgUHlFcnJfUmVzdG9yZShlcnJvcl90eXBlLCBlcnJvcl92YWx1ZSwgZXJyb3JfdHJhY2ViYWNrKTsKKyAgICAvKiBSZXN0b3JlIHRoZSBzYXZlZCBleGNlcHRpb24uICovCisgICAgUHlFcnJfUmVzdG9yZShlcnJvcl90eXBlLCBlcnJvcl92YWx1ZSwgZXJyb3JfdHJhY2ViYWNrKTsKIAotICAgICAgICAvKiBVbmRvIHRoZSB0ZW1wb3JhcnkgcmVzdXJyZWN0aW9uOyBjYW4ndCB1c2UgREVDUkVGIGhlcmUsIGl0IHdvdWxkCi0gICAgICAgICAqIGNhdXNlIGEgcmVjdXJzaXZlIGNhbGwuCi0gICAgICAgICAqLwotICAgICAgICBhc3NlcnQoc2VsZi0+b2JfcmVmY250ID4gMCk7Ci0gICAgICAgIGlmICgtLXNlbGYtPm9iX3JlZmNudCA9PSAwKQotICAgICAgICAgICAgICAgIHJldHVybjsgLyogdGhpcyBpcyB0aGUgbm9ybWFsIHBhdGggb3V0ICovCisgICAgLyogVW5kbyB0aGUgdGVtcG9yYXJ5IHJlc3VycmVjdGlvbjsgY2FuJ3QgdXNlIERFQ1JFRiBoZXJlLCBpdCB3b3VsZAorICAgICAqIGNhdXNlIGEgcmVjdXJzaXZlIGNhbGwuCisgICAgICovCisgICAgYXNzZXJ0KHNlbGYtPm9iX3JlZmNudCA+IDApOworICAgIGlmICgtLXNlbGYtPm9iX3JlZmNudCA9PSAwKQorICAgICAgICByZXR1cm47IC8qIHRoaXMgaXMgdGhlIG5vcm1hbCBwYXRoIG91dCAqLwogCi0gICAgICAgIC8qIGNsb3NlKCkgcmVzdXJyZWN0ZWQgaXQhICBNYWtlIGl0IGxvb2sgbGlrZSB0aGUgb3JpZ2luYWwgUHlfREVDUkVGCi0gICAgICAgICAqIG5ldmVyIGhhcHBlbmVkLgotICAgICAgICAgKi8KLSAgICAgICAgewotICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgcmVmY250ID0gc2VsZi0+b2JfcmVmY250OwotICAgICAgICAgICAgICAgIF9QeV9OZXdSZWZlcmVuY2Uoc2VsZik7Ci0gICAgICAgICAgICAgICAgc2VsZi0+b2JfcmVmY250ID0gcmVmY250OwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydChQeVR5cGVfSVNfR0Moc2VsZi0+b2JfdHlwZSkgJiYKLSAgICAgICAgICAgICAgIF9QeV9BU19HQyhzZWxmKS0+Z2MuZ2NfcmVmcyAhPSBfUHlHQ19SRUZTX1VOVFJBQ0tFRCk7CisgICAgLyogY2xvc2UoKSByZXN1cnJlY3RlZCBpdCEgIE1ha2UgaXQgbG9vayBsaWtlIHRoZSBvcmlnaW5hbCBQeV9ERUNSRUYKKyAgICAgKiBuZXZlciBoYXBwZW5lZC4KKyAgICAgKi8KKyAgICB7CisgICAgICAgIFB5X3NzaXplX3QgcmVmY250ID0gc2VsZi0+b2JfcmVmY250OworICAgICAgICBfUHlfTmV3UmVmZXJlbmNlKHNlbGYpOworICAgICAgICBzZWxmLT5vYl9yZWZjbnQgPSByZWZjbnQ7CisgICAgfQorICAgIGFzc2VydChQeVR5cGVfSVNfR0Moc2VsZi0+b2JfdHlwZSkgJiYKKyAgICAgICAgICAgX1B5X0FTX0dDKHNlbGYpLT5nYy5nY19yZWZzICE9IF9QeUdDX1JFRlNfVU5UUkFDS0VEKTsKIAotICAgICAgICAvKiBJZiBQeV9SRUZfREVCVUcsIF9QeV9OZXdSZWZlcmVuY2UgYnVtcGVkIF9QeV9SZWZUb3RhbCwgc28KLSAgICAgICAgICogd2UgbmVlZCB0byB1bmRvIHRoYXQuICovCi0gICAgICAgIF9QeV9ERUNfUkVGVE9UQUw7Ci0gICAgICAgIC8qIElmIFB5X1RSQUNFX1JFRlMsIF9QeV9OZXdSZWZlcmVuY2UgcmUtYWRkZWQgc2VsZiB0byB0aGUgb2JqZWN0Ci0gICAgICAgICAqIGNoYWluLCBzbyBubyBtb3JlIHRvIGRvIHRoZXJlLgotICAgICAgICAgKiBJZiBDT1VOVF9BTExPQ1MsIHRoZSBvcmlnaW5hbCBkZWNyZWYgYnVtcGVkIHRwX2ZyZWVzLCBhbmQKLSAgICAgICAgICogX1B5X05ld1JlZmVyZW5jZSBidW1wZWQgdHBfYWxsb2NzOiAgYm90aCBvZiB0aG9zZSBuZWVkIHRvIGJlCi0gICAgICAgICAqIHVuZG9uZS4KLSAgICAgICAgICovCisgICAgLyogSWYgUHlfUkVGX0RFQlVHLCBfUHlfTmV3UmVmZXJlbmNlIGJ1bXBlZCBfUHlfUmVmVG90YWwsIHNvCisgICAgICogd2UgbmVlZCB0byB1bmRvIHRoYXQuICovCisgICAgX1B5X0RFQ19SRUZUT1RBTDsKKyAgICAvKiBJZiBQeV9UUkFDRV9SRUZTLCBfUHlfTmV3UmVmZXJlbmNlIHJlLWFkZGVkIHNlbGYgdG8gdGhlIG9iamVjdAorICAgICAqIGNoYWluLCBzbyBubyBtb3JlIHRvIGRvIHRoZXJlLgorICAgICAqIElmIENPVU5UX0FMTE9DUywgdGhlIG9yaWdpbmFsIGRlY3JlZiBidW1wZWQgdHBfZnJlZXMsIGFuZAorICAgICAqIF9QeV9OZXdSZWZlcmVuY2UgYnVtcGVkIHRwX2FsbG9jczogIGJvdGggb2YgdGhvc2UgbmVlZCB0byBiZQorICAgICAqIHVuZG9uZS4KKyAgICAgKi8KICNpZmRlZiBDT1VOVF9BTExPQ1MKLSAgICAgICAgLS1zZWxmLT5vYl90eXBlLT50cF9mcmVlczsKLSAgICAgICAgLS1zZWxmLT5vYl90eXBlLT50cF9hbGxvY3M7CisgICAgLS1zZWxmLT5vYl90eXBlLT50cF9mcmVlczsKKyAgICAtLXNlbGYtPm9iX3R5cGUtPnRwX2FsbG9jczsKICNlbmRpZgogfQogCkBAIC0yMTQsOTEgKzIxNCw5MSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdlbl90aHJvdyhQeUdlbk9iamVjdCAqZ2VuLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqdHlwOwotCVB5T2JqZWN0ICp0YiA9IE5VTEw7Ci0JUHlPYmplY3QgKnZhbCA9IE5VTEw7CisgICAgUHlPYmplY3QgKnR5cDsKKyAgICBQeU9iamVjdCAqdGIgPSBOVUxMOworICAgIFB5T2JqZWN0ICp2YWwgPSBOVUxMOwogCi0JaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAidGhyb3ciLCAxLCAzLCAmdHlwLCAmdmFsLCAmdGIpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJ0aHJvdyIsIDEsIDMsICZ0eXAsICZ2YWwsICZ0YikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JLyogRmlyc3QsIGNoZWNrIHRoZSB0cmFjZWJhY2sgYXJndW1lbnQsIHJlcGxhY2luZyBOb25lIHdpdGgKLQkgICBOVUxMLiAqLwotCWlmICh0YiA9PSBQeV9Ob25lKQotCQl0YiA9IE5VTEw7Ci0JZWxzZSBpZiAodGIgIT0gTlVMTCAmJiAhUHlUcmFjZUJhY2tfQ2hlY2sodGIpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkidGhyb3coKSB0aGlyZCBhcmd1bWVudCBtdXN0IGJlIGEgdHJhY2ViYWNrIG9iamVjdCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgLyogRmlyc3QsIGNoZWNrIHRoZSB0cmFjZWJhY2sgYXJndW1lbnQsIHJlcGxhY2luZyBOb25lIHdpdGgKKyAgICAgICBOVUxMLiAqLworICAgIGlmICh0YiA9PSBQeV9Ob25lKQorICAgICAgICB0YiA9IE5VTEw7CisgICAgZWxzZSBpZiAodGIgIT0gTlVMTCAmJiAhUHlUcmFjZUJhY2tfQ2hlY2sodGIpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAidGhyb3coKSB0aGlyZCBhcmd1bWVudCBtdXN0IGJlIGEgdHJhY2ViYWNrIG9iamVjdCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlQeV9JTkNSRUYodHlwKTsKLQlQeV9YSU5DUkVGKHZhbCk7Ci0JUHlfWElOQ1JFRih0Yik7CisgICAgUHlfSU5DUkVGKHR5cCk7CisgICAgUHlfWElOQ1JFRih2YWwpOworICAgIFB5X1hJTkNSRUYodGIpOwogCi0JaWYgKFB5RXhjZXB0aW9uQ2xhc3NfQ2hlY2sodHlwKSkgewotCQlQeUVycl9Ob3JtYWxpemVFeGNlcHRpb24oJnR5cCwgJnZhbCwgJnRiKTsKLQl9CisgICAgaWYgKFB5RXhjZXB0aW9uQ2xhc3NfQ2hlY2sodHlwKSkgeworICAgICAgICBQeUVycl9Ob3JtYWxpemVFeGNlcHRpb24oJnR5cCwgJnZhbCwgJnRiKTsKKyAgICB9CiAKLQllbHNlIGlmIChQeUV4Y2VwdGlvbkluc3RhbmNlX0NoZWNrKHR5cCkpIHsKLQkJLyogUmFpc2luZyBhbiBpbnN0YW5jZS4gIFRoZSB2YWx1ZSBzaG91bGQgYmUgYSBkdW1teS4gKi8KLQkJaWYgKHZhbCAmJiB2YWwgIT0gUHlfTm9uZSkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgImluc3RhbmNlIGV4Y2VwdGlvbiBtYXkgbm90IGhhdmUgYSBzZXBhcmF0ZSB2YWx1ZSIpOwotCQkJZ290byBmYWlsZWRfdGhyb3c7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvKiBOb3JtYWxpemUgdG8gcmFpc2UgPGNsYXNzPiwgPGluc3RhbmNlPiAqLwotCQkJUHlfWERFQ1JFRih2YWwpOwotCQkJdmFsID0gdHlwOwotCQkJdHlwID0gUHlFeGNlcHRpb25JbnN0YW5jZV9DbGFzcyh0eXApOwotCQkJUHlfSU5DUkVGKHR5cCk7Ci0JCX0KLQl9Ci0JZWxzZSB7Ci0JCS8qIE5vdCBzb21ldGhpbmcgeW91IGNhbiByYWlzZS4gIHRocm93KCkgZmFpbHMuICovCi0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgICJleGNlcHRpb25zIG11c3QgYmUgY2xhc3Nlcywgb3IgaW5zdGFuY2VzLCBub3QgJXMiLAotCQkJICAgICB0eXAtPm9iX3R5cGUtPnRwX25hbWUpOwotCQkJZ290byBmYWlsZWRfdGhyb3c7Ci0JfQorICAgIGVsc2UgaWYgKFB5RXhjZXB0aW9uSW5zdGFuY2VfQ2hlY2sodHlwKSkgeworICAgICAgICAvKiBSYWlzaW5nIGFuIGluc3RhbmNlLiAgVGhlIHZhbHVlIHNob3VsZCBiZSBhIGR1bW15LiAqLworICAgICAgICBpZiAodmFsICYmIHZhbCAhPSBQeV9Ob25lKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAiaW5zdGFuY2UgZXhjZXB0aW9uIG1heSBub3QgaGF2ZSBhIHNlcGFyYXRlIHZhbHVlIik7CisgICAgICAgICAgICBnb3RvIGZhaWxlZF90aHJvdzsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8qIE5vcm1hbGl6ZSB0byByYWlzZSA8Y2xhc3M+LCA8aW5zdGFuY2U+ICovCisgICAgICAgICAgICBQeV9YREVDUkVGKHZhbCk7CisgICAgICAgICAgICB2YWwgPSB0eXA7CisgICAgICAgICAgICB0eXAgPSBQeUV4Y2VwdGlvbkluc3RhbmNlX0NsYXNzKHR5cCk7CisgICAgICAgICAgICBQeV9JTkNSRUYodHlwKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLyogTm90IHNvbWV0aGluZyB5b3UgY2FuIHJhaXNlLiAgdGhyb3coKSBmYWlscy4gKi8KKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJleGNlcHRpb25zIG11c3QgYmUgY2xhc3Nlcywgb3IgaW5zdGFuY2VzLCBub3QgJXMiLAorICAgICAgICAgICAgICAgICAgICAgdHlwLT5vYl90eXBlLT50cF9uYW1lKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbGVkX3Rocm93OworICAgIH0KIAotCVB5RXJyX1Jlc3RvcmUodHlwLCB2YWwsIHRiKTsKLQlyZXR1cm4gZ2VuX3NlbmRfZXgoZ2VuLCBQeV9Ob25lLCAxKTsKKyAgICBQeUVycl9SZXN0b3JlKHR5cCwgdmFsLCB0Yik7CisgICAgcmV0dXJuIGdlbl9zZW5kX2V4KGdlbiwgUHlfTm9uZSwgMSk7CiAKIGZhaWxlZF90aHJvdzoKLQkvKiBEaWRuJ3QgdXNlIG91ciBhcmd1bWVudHMsIHNvIHJlc3RvcmUgdGhlaXIgb3JpZ2luYWwgcmVmY291bnRzICovCi0JUHlfREVDUkVGKHR5cCk7Ci0JUHlfWERFQ1JFRih2YWwpOwotCVB5X1hERUNSRUYodGIpOwotCXJldHVybiBOVUxMOworICAgIC8qIERpZG4ndCB1c2Ugb3VyIGFyZ3VtZW50cywgc28gcmVzdG9yZSB0aGVpciBvcmlnaW5hbCByZWZjb3VudHMgKi8KKyAgICBQeV9ERUNSRUYodHlwKTsKKyAgICBQeV9YREVDUkVGKHZhbCk7CisgICAgUHlfWERFQ1JFRih0Yik7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIAogc3RhdGljIFB5T2JqZWN0ICoKIGdlbl9pdGVybmV4dChQeUdlbk9iamVjdCAqZ2VuKQogewotCXJldHVybiBnZW5fc2VuZF9leChnZW4sIE5VTEwsIDApOworICAgIHJldHVybiBnZW5fc2VuZF9leChnZW4sIE5VTEwsIDApOwogfQogCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZW5fcmVwcihQeUdlbk9iamVjdCAqZ2VuKQogewotCWNoYXIgKmNvZGVfbmFtZTsKLQljb2RlX25hbWUgPSBQeVN0cmluZ19Bc1N0cmluZygoKFB5Q29kZU9iamVjdCAqKWdlbi0+Z2lfY29kZSktPmNvX25hbWUpOwotCWlmIChjb2RlX25hbWUgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21Gb3JtYXQoIjxnZW5lcmF0b3Igb2JqZWN0ICUuMjAwcyBhdCAlcD4iLAotCQkJCSAgIGNvZGVfbmFtZSwgZ2VuKTsKKyAgICBjaGFyICpjb2RlX25hbWU7CisgICAgY29kZV9uYW1lID0gUHlTdHJpbmdfQXNTdHJpbmcoKChQeUNvZGVPYmplY3QgKilnZW4tPmdpX2NvZGUpLT5jb19uYW1lKTsKKyAgICBpZiAoY29kZV9uYW1lID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tRm9ybWF0KCI8Z2VuZXJhdG9yIG9iamVjdCAlLjIwMHMgYXQgJXA+IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlX25hbWUsIGdlbik7CiB9CiAKIAogc3RhdGljIFB5T2JqZWN0ICoKIGdlbl9nZXRfbmFtZShQeUdlbk9iamVjdCAqZ2VuKQogewotCVB5T2JqZWN0ICpuYW1lID0gKChQeUNvZGVPYmplY3QgKilnZW4tPmdpX2NvZGUpLT5jb19uYW1lOwotCVB5X0lOQ1JFRihuYW1lKTsKLQlyZXR1cm4gbmFtZTsKKyAgICBQeU9iamVjdCAqbmFtZSA9ICgoUHlDb2RlT2JqZWN0ICopZ2VuLT5naV9jb2RlKS0+Y29fbmFtZTsKKyAgICBQeV9JTkNSRUYobmFtZSk7CisgICAgcmV0dXJuIG5hbWU7CiB9CiAKIApAQCAtMzA2LDEwOSArMzA2LDEwOSBAQAogIlJldHVybiB0aGUgbmFtZSBvZiB0aGUgZ2VuZXJhdG9yJ3MgYXNzb2NpYXRlZCBjb2RlIG9iamVjdC4iKTsKIAogc3RhdGljIFB5R2V0U2V0RGVmIGdlbl9nZXRzZXRsaXN0W10gPSB7Ci0JeyJfX25hbWVfXyIsIChnZXR0ZXIpZ2VuX2dldF9uYW1lLCBOVUxMLCBnZW5fX25hbWVfX2RvY19ffSwKLQl7TlVMTH0KKyAgICB7Il9fbmFtZV9fIiwgKGdldHRlcilnZW5fZ2V0X25hbWUsIE5VTEwsIGdlbl9fbmFtZV9fZG9jX199LAorICAgIHtOVUxMfQogfTsKIAogCiBzdGF0aWMgUHlNZW1iZXJEZWYgZ2VuX21lbWJlcmxpc3RbXSA9IHsKLQl7ImdpX2ZyYW1lIiwJVF9PQkpFQ1QsIG9mZnNldG9mKFB5R2VuT2JqZWN0LCBnaV9mcmFtZSksCVJPfSwKLQl7ImdpX3J1bm5pbmciLAlUX0lOVCwgICAgb2Zmc2V0b2YoUHlHZW5PYmplY3QsIGdpX3J1bm5pbmcpLAlST30sCi0gICAgICAgIHsiZ2lfY29kZSIsICAgICBUX09CSkVDVCwgb2Zmc2V0b2YoUHlHZW5PYmplY3QsIGdpX2NvZGUpLCAgUk99LAotCXtOVUxMfQkvKiBTZW50aW5lbCAqLworICAgIHsiZ2lfZnJhbWUiLCAgICAgICAgVF9PQkpFQ1QsIG9mZnNldG9mKFB5R2VuT2JqZWN0LCBnaV9mcmFtZSksICAgICAgUk99LAorICAgIHsiZ2lfcnVubmluZyIsICAgICAgVF9JTlQsICAgIG9mZnNldG9mKFB5R2VuT2JqZWN0LCBnaV9ydW5uaW5nKSwgICAgUk99LAorICAgIHsiZ2lfY29kZSIsICAgICBUX09CSkVDVCwgb2Zmc2V0b2YoUHlHZW5PYmplY3QsIGdpX2NvZGUpLCAgUk99LAorICAgIHtOVUxMfSAgICAgIC8qIFNlbnRpbmVsICovCiB9OwogCiBzdGF0aWMgUHlNZXRob2REZWYgZ2VuX21ldGhvZHNbXSA9IHsKLQl7InNlbmQiLChQeUNGdW5jdGlvbilnZW5fc2VuZCwgTUVUSF9PLCBzZW5kX2RvY30sCi0JeyJ0aHJvdyIsKFB5Q0Z1bmN0aW9uKWdlbl90aHJvdywgTUVUSF9WQVJBUkdTLCB0aHJvd19kb2N9LAotCXsiY2xvc2UiLChQeUNGdW5jdGlvbilnZW5fY2xvc2UsIE1FVEhfTk9BUkdTLCBjbG9zZV9kb2N9LAotCXtOVUxMLCBOVUxMfQkvKiBTZW50aW5lbCAqLworICAgIHsic2VuZCIsKFB5Q0Z1bmN0aW9uKWdlbl9zZW5kLCBNRVRIX08sIHNlbmRfZG9jfSwKKyAgICB7InRocm93IiwoUHlDRnVuY3Rpb24pZ2VuX3Rocm93LCBNRVRIX1ZBUkFSR1MsIHRocm93X2RvY30sCisgICAgeyJjbG9zZSIsKFB5Q0Z1bmN0aW9uKWdlbl9jbG9zZSwgTUVUSF9OT0FSR1MsIGNsb3NlX2RvY30sCisgICAge05VTEwsIE5VTEx9ICAgICAgICAvKiBTZW50aW5lbCAqLwogfTsKIAogUHlUeXBlT2JqZWN0IFB5R2VuX1R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKLQkiZ2VuZXJhdG9yIiwJCQkJLyogdHBfbmFtZSAqLwotCXNpemVvZihQeUdlbk9iamVjdCksCQkJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJCS8qIHRwX2l0ZW1zaXplICovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKWdlbl9kZWFsbG9jLCAJCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkJLyogdHBfcHJpbnQgKi8KLQkwLCAJCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9jb21wYXJlICovCi0JKHJlcHJmdW5jKWdlbl9yZXByLAkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDLC8qIHRwX2ZsYWdzICovCi0gCTAsCQkJCQkvKiB0cF9kb2MgKi8KLSAJKHRyYXZlcnNlcHJvYylnZW5fdHJhdmVyc2UsCQkvKiB0cF90cmF2ZXJzZSAqLwotIAkwLAkJCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQlvZmZzZXRvZihQeUdlbk9iamVjdCwgZ2lfd2Vha3JlZmxpc3QpLAkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCVB5T2JqZWN0X1NlbGZJdGVyLAkJCS8qIHRwX2l0ZXIgKi8KLQkoaXRlcm5leHRmdW5jKWdlbl9pdGVybmV4dCwJCS8qIHRwX2l0ZXJuZXh0ICovCi0JZ2VuX21ldGhvZHMsCQkJCS8qIHRwX21ldGhvZHMgKi8KLQlnZW5fbWVtYmVybGlzdCwJCQkJLyogdHBfbWVtYmVycyAqLwotCWdlbl9nZXRzZXRsaXN0LAkJCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCQkvKiB0cF9kaWN0ICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKKyAgICAiZ2VuZXJhdG9yIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICBzaXplb2YoUHlHZW5PYmplY3QpLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpZ2VuX2RlYWxsb2MsICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIChyZXByZnVuYylnZW5fcmVwciwgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQywvKiB0cF9mbGFncyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgKHRyYXZlcnNlcHJvYylnZW5fdHJhdmVyc2UsICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgb2Zmc2V0b2YoUHlHZW5PYmplY3QsIGdpX3dlYWtyZWZsaXN0KSwgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIFB5T2JqZWN0X1NlbGZJdGVyLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIChpdGVybmV4dGZ1bmMpZ2VuX2l0ZXJuZXh0LCAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICBnZW5fbWV0aG9kcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICBnZW5fbWVtYmVybGlzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICBnZW5fZ2V0c2V0bGlzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLwogCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KLQkwLAkJCQkJLyogdHBfZGljdG9mZnNldCAqLwotCTAsCQkJCQkvKiB0cF9pbml0ICovCi0JMCwJCQkJCS8qIHRwX2FsbG9jICovCi0JMCwJCQkJCS8qIHRwX25ldyAqLwotCTAsCQkJCQkvKiB0cF9mcmVlICovCi0JMCwJCQkJCS8qIHRwX2lzX2djICovCi0JMCwJCQkJCS8qIHRwX2Jhc2VzICovCi0JMCwJCQkJCS8qIHRwX21ybyAqLwotCTAsCQkJCQkvKiB0cF9jYWNoZSAqLwotCTAsCQkJCQkvKiB0cF9zdWJjbGFzc2VzICovCi0JMCwJCQkJCS8qIHRwX3dlYWtsaXN0ICovCi0JZ2VuX2RlbCwJCQkJLyogdHBfZGVsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXNfZ2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2VzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tcm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhY2hlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdWJjbGFzc2VzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdCAqLworICAgIGdlbl9kZWwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVsICovCiB9OwogCiBQeU9iamVjdCAqCiBQeUdlbl9OZXcoUHlGcmFtZU9iamVjdCAqZikKIHsKLQlQeUdlbk9iamVjdCAqZ2VuID0gUHlPYmplY3RfR0NfTmV3KFB5R2VuT2JqZWN0LCAmUHlHZW5fVHlwZSk7Ci0JaWYgKGdlbiA9PSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRihmKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWdlbi0+Z2lfZnJhbWUgPSBmOwotCVB5X0lOQ1JFRihmLT5mX2NvZGUpOwotCWdlbi0+Z2lfY29kZSA9IChQeU9iamVjdCAqKShmLT5mX2NvZGUpOwotCWdlbi0+Z2lfcnVubmluZyA9IDA7Ci0JZ2VuLT5naV93ZWFrcmVmbGlzdCA9IE5VTEw7Ci0JX1B5T2JqZWN0X0dDX1RSQUNLKGdlbik7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWdlbjsKKyAgICBQeUdlbk9iamVjdCAqZ2VuID0gUHlPYmplY3RfR0NfTmV3KFB5R2VuT2JqZWN0LCAmUHlHZW5fVHlwZSk7CisgICAgaWYgKGdlbiA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihmKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGdlbi0+Z2lfZnJhbWUgPSBmOworICAgIFB5X0lOQ1JFRihmLT5mX2NvZGUpOworICAgIGdlbi0+Z2lfY29kZSA9IChQeU9iamVjdCAqKShmLT5mX2NvZGUpOworICAgIGdlbi0+Z2lfcnVubmluZyA9IDA7CisgICAgZ2VuLT5naV93ZWFrcmVmbGlzdCA9IE5VTEw7CisgICAgX1B5T2JqZWN0X0dDX1RSQUNLKGdlbik7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWdlbjsKIH0KIAogaW50CiBQeUdlbl9OZWVkc0ZpbmFsaXppbmcoUHlHZW5PYmplY3QgKmdlbikKIHsKLQlpbnQgaTsKLQlQeUZyYW1lT2JqZWN0ICpmID0gZ2VuLT5naV9mcmFtZTsKKyAgICBpbnQgaTsKKyAgICBQeUZyYW1lT2JqZWN0ICpmID0gZ2VuLT5naV9mcmFtZTsKIAotCWlmIChmID09IE5VTEwgfHwgZi0+Zl9zdGFja3RvcCA9PSBOVUxMIHx8IGYtPmZfaWJsb2NrIDw9IDApCi0JCXJldHVybiAwOyAvKiBubyBmcmFtZSBvciBlbXB0eSBibG9ja3N0YWNrID09IG5vIGZpbmFsaXphdGlvbiAqLworICAgIGlmIChmID09IE5VTEwgfHwgZi0+Zl9zdGFja3RvcCA9PSBOVUxMIHx8IGYtPmZfaWJsb2NrIDw9IDApCisgICAgICAgIHJldHVybiAwOyAvKiBubyBmcmFtZSBvciBlbXB0eSBibG9ja3N0YWNrID09IG5vIGZpbmFsaXphdGlvbiAqLwogCi0JLyogQW55IGJsb2NrIHR5cGUgYmVzaWRlcyBhIGxvb3AgcmVxdWlyZXMgY2xlYW51cC4gKi8KLQlpID0gZi0+Zl9pYmxvY2s7Ci0Jd2hpbGUgKC0taSA+PSAwKSB7Ci0JCWlmIChmLT5mX2Jsb2Nrc3RhY2tbaV0uYl90eXBlICE9IFNFVFVQX0xPT1ApCi0JCQlyZXR1cm4gMTsKLQl9CisgICAgLyogQW55IGJsb2NrIHR5cGUgYmVzaWRlcyBhIGxvb3AgcmVxdWlyZXMgY2xlYW51cC4gKi8KKyAgICBpID0gZi0+Zl9pYmxvY2s7CisgICAgd2hpbGUgKC0taSA+PSAwKSB7CisgICAgICAgIGlmIChmLT5mX2Jsb2Nrc3RhY2tbaV0uYl90eXBlICE9IFNFVFVQX0xPT1ApCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICB9CiAKLQkvKiBObyBibG9ja3MgZXhjZXB0IGxvb3BzLCBpdCdzIHNhZmUgdG8gc2tpcCBmaW5hbGl6YXRpb24uICovCi0JcmV0dXJuIDA7CisgICAgLyogTm8gYmxvY2tzIGV4Y2VwdCBsb29wcywgaXQncyBzYWZlIHRvIHNraXAgZmluYWxpemF0aW9uLiAqLworICAgIHJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9pbnRvYmplY3QuYyBiL09iamVjdHMvaW50b2JqZWN0LmMKaW5kZXggNDA2YTQ1YS4uMDI5ODU0ZiAxMDA2NDQKLS0tIGEvT2JqZWN0cy9pbnRvYmplY3QuYworKysgYi9PYmplY3RzL2ludG9iamVjdC5jCkBAIC05LDcgKzksNyBAQAogbG9uZwogUHlJbnRfR2V0TWF4KHZvaWQpCiB7Ci0JcmV0dXJuIExPTkdfTUFYOwkvKiBUbyBpbml0aWFsaXplIHN5cy5tYXhpbnQgKi8KKyAgICByZXR1cm4gTE9OR19NQVg7ICAgICAgICAgICAgLyogVG8gaW5pdGlhbGl6ZSBzeXMubWF4aW50ICovCiB9CiAKIC8qIEludGVnZXJzIGFyZSBxdWl0ZSBub3JtYWwgb2JqZWN0cywgdG8gbWFrZSBvYmplY3QgaGFuZGxpbmcgdW5pZm9ybS4KQEAgLTI5LDEzICsyOSwxMyBAQAogICAgdmlhIGFidXNlIG9mIHRoZWlyIG9iX3R5cGUgbWVtYmVycy4KICovCiAKLSNkZWZpbmUgQkxPQ0tfU0laRQkxMDAwCS8qIDFLIGxlc3MgdHlwaWNhbCBtYWxsb2Mgb3ZlcmhlYWQgKi8KLSNkZWZpbmUgQkhFQURfU0laRQk4CS8qIEVub3VnaCBmb3IgYSA2NC1iaXQgcG9pbnRlciAqLwotI2RlZmluZSBOX0lOVE9CSkVDVFMJKChCTE9DS19TSVpFIC0gQkhFQURfU0laRSkgLyBzaXplb2YoUHlJbnRPYmplY3QpKQorI2RlZmluZSBCTE9DS19TSVpFICAgICAgMTAwMCAgICAvKiAxSyBsZXNzIHR5cGljYWwgbWFsbG9jIG92ZXJoZWFkICovCisjZGVmaW5lIEJIRUFEX1NJWkUgICAgICA4ICAgICAgIC8qIEVub3VnaCBmb3IgYSA2NC1iaXQgcG9pbnRlciAqLworI2RlZmluZSBOX0lOVE9CSkVDVFMgICAgKChCTE9DS19TSVpFIC0gQkhFQURfU0laRSkgLyBzaXplb2YoUHlJbnRPYmplY3QpKQogCiBzdHJ1Y3QgX2ludGJsb2NrIHsKLQlzdHJ1Y3QgX2ludGJsb2NrICpuZXh0OwotCVB5SW50T2JqZWN0IG9iamVjdHNbTl9JTlRPQkpFQ1RTXTsKKyAgICBzdHJ1Y3QgX2ludGJsb2NrICpuZXh0OworICAgIFB5SW50T2JqZWN0IG9iamVjdHNbTl9JTlRPQkpFQ1RTXTsKIH07CiAKIHR5cGVkZWYgc3RydWN0IF9pbnRibG9jayBQeUludEJsb2NrOwpAQCAtNDYsMjggKzQ2LDI4IEBACiBzdGF0aWMgUHlJbnRPYmplY3QgKgogZmlsbF9mcmVlX2xpc3Qodm9pZCkKIHsKLQlQeUludE9iamVjdCAqcCwgKnE7Ci0JLyogUHl0aG9uJ3Mgb2JqZWN0IGFsbG9jYXRvciBpc24ndCBhcHByb3ByaWF0ZSBmb3IgbGFyZ2UgYmxvY2tzLiAqLwotCXAgPSAoUHlJbnRPYmplY3QgKikgUHlNZW1fTUFMTE9DKHNpemVvZihQeUludEJsb2NrKSk7Ci0JaWYgKHAgPT0gTlVMTCkKLQkJcmV0dXJuIChQeUludE9iamVjdCAqKSBQeUVycl9Ob01lbW9yeSgpOwotCSgoUHlJbnRCbG9jayAqKXApLT5uZXh0ID0gYmxvY2tfbGlzdDsKLQlibG9ja19saXN0ID0gKFB5SW50QmxvY2sgKilwOwotCS8qIExpbmsgdGhlIGludCBvYmplY3RzIHRvZ2V0aGVyLCBmcm9tIHJlYXIgdG8gZnJvbnQsIHRoZW4gcmV0dXJuCi0JICAgdGhlIGFkZHJlc3Mgb2YgdGhlIGxhc3QgaW50IG9iamVjdCBpbiB0aGUgYmxvY2suICovCi0JcCA9ICYoKFB5SW50QmxvY2sgKilwKS0+b2JqZWN0c1swXTsKLQlxID0gcCArIE5fSU5UT0JKRUNUUzsKLQl3aGlsZSAoLS1xID4gcCkKLQkJUHlfVFlQRShxKSA9IChzdHJ1Y3QgX3R5cGVvYmplY3QgKikocS0xKTsKLQlQeV9UWVBFKHEpID0gTlVMTDsKLQlyZXR1cm4gcCArIE5fSU5UT0JKRUNUUyAtIDE7CisgICAgUHlJbnRPYmplY3QgKnAsICpxOworICAgIC8qIFB5dGhvbidzIG9iamVjdCBhbGxvY2F0b3IgaXNuJ3QgYXBwcm9wcmlhdGUgZm9yIGxhcmdlIGJsb2Nrcy4gKi8KKyAgICBwID0gKFB5SW50T2JqZWN0ICopIFB5TWVtX01BTExPQyhzaXplb2YoUHlJbnRCbG9jaykpOworICAgIGlmIChwID09IE5VTEwpCisgICAgICAgIHJldHVybiAoUHlJbnRPYmplY3QgKikgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAoKFB5SW50QmxvY2sgKilwKS0+bmV4dCA9IGJsb2NrX2xpc3Q7CisgICAgYmxvY2tfbGlzdCA9IChQeUludEJsb2NrICopcDsKKyAgICAvKiBMaW5rIHRoZSBpbnQgb2JqZWN0cyB0b2dldGhlciwgZnJvbSByZWFyIHRvIGZyb250LCB0aGVuIHJldHVybgorICAgICAgIHRoZSBhZGRyZXNzIG9mIHRoZSBsYXN0IGludCBvYmplY3QgaW4gdGhlIGJsb2NrLiAqLworICAgIHAgPSAmKChQeUludEJsb2NrICopcCktPm9iamVjdHNbMF07CisgICAgcSA9IHAgKyBOX0lOVE9CSkVDVFM7CisgICAgd2hpbGUgKC0tcSA+IHApCisgICAgICAgIFB5X1RZUEUocSkgPSAoc3RydWN0IF90eXBlb2JqZWN0ICopKHEtMSk7CisgICAgUHlfVFlQRShxKSA9IE5VTEw7CisgICAgcmV0dXJuIHAgKyBOX0lOVE9CSkVDVFMgLSAxOwogfQogCiAjaWZuZGVmIE5TTUFMTFBPU0lOVFMKLSNkZWZpbmUgTlNNQUxMUE9TSU5UUwkJMjU3CisjZGVmaW5lIE5TTUFMTFBPU0lOVFMgICAgICAgICAgIDI1NwogI2VuZGlmCiAjaWZuZGVmIE5TTUFMTE5FR0lOVFMKLSNkZWZpbmUgTlNNQUxMTkVHSU5UUwkJNQorI2RlZmluZSBOU01BTExORUdJTlRTICAgICAgICAgICA1CiAjZW5kaWYKICNpZiBOU01BTExORUdJTlRTICsgTlNNQUxMUE9TSU5UUyA+IDAKIC8qIFJlZmVyZW5jZXMgdG8gc21hbGwgaW50ZWdlcnMgYXJlIHNhdmVkIGluIHRoaXMgYXJyYXkgc28gdGhhdCB0aGV5CkBAIC04NCwzMjYgKzg0LDMyNiBAQAogUHlPYmplY3QgKgogUHlJbnRfRnJvbUxvbmcobG9uZyBpdmFsKQogewotCXJlZ2lzdGVyIFB5SW50T2JqZWN0ICp2OworICAgIHJlZ2lzdGVyIFB5SW50T2JqZWN0ICp2OwogI2lmIE5TTUFMTE5FR0lOVFMgKyBOU01BTExQT1NJTlRTID4gMAotCWlmICgtTlNNQUxMTkVHSU5UUyA8PSBpdmFsICYmIGl2YWwgPCBOU01BTExQT1NJTlRTKSB7Ci0JCXYgPSBzbWFsbF9pbnRzW2l2YWwgKyBOU01BTExORUdJTlRTXTsKLQkJUHlfSU5DUkVGKHYpOworICAgIGlmICgtTlNNQUxMTkVHSU5UUyA8PSBpdmFsICYmIGl2YWwgPCBOU01BTExQT1NJTlRTKSB7CisgICAgICAgIHYgPSBzbWFsbF9pbnRzW2l2YWwgKyBOU01BTExORUdJTlRTXTsKKyAgICAgICAgUHlfSU5DUkVGKHYpOwogI2lmZGVmIENPVU5UX0FMTE9DUwotCQlpZiAoaXZhbCA+PSAwKQotCQkJcXVpY2tfaW50X2FsbG9jcysrOwotCQllbHNlCi0JCQlxdWlja19uZWdfaW50X2FsbG9jcysrOworICAgICAgICBpZiAoaXZhbCA+PSAwKQorICAgICAgICAgICAgcXVpY2tfaW50X2FsbG9jcysrOworICAgICAgICBlbHNlCisgICAgICAgICAgICBxdWlja19uZWdfaW50X2FsbG9jcysrOwogI2VuZGlmCi0JCXJldHVybiAoUHlPYmplY3QgKikgdjsKLQl9CisgICAgICAgIHJldHVybiAoUHlPYmplY3QgKikgdjsKKyAgICB9CiAjZW5kaWYKLQlpZiAoZnJlZV9saXN0ID09IE5VTEwpIHsKLQkJaWYgKChmcmVlX2xpc3QgPSBmaWxsX2ZyZWVfbGlzdCgpKSA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCS8qIElubGluZSBQeU9iamVjdF9OZXcgKi8KLQl2ID0gZnJlZV9saXN0OwotCWZyZWVfbGlzdCA9IChQeUludE9iamVjdCAqKVB5X1RZUEUodik7Ci0JUHlPYmplY3RfSU5JVCh2LCAmUHlJbnRfVHlwZSk7Ci0Jdi0+b2JfaXZhbCA9IGl2YWw7Ci0JcmV0dXJuIChQeU9iamVjdCAqKSB2OworICAgIGlmIChmcmVlX2xpc3QgPT0gTlVMTCkgeworICAgICAgICBpZiAoKGZyZWVfbGlzdCA9IGZpbGxfZnJlZV9saXN0KCkpID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgLyogSW5saW5lIFB5T2JqZWN0X05ldyAqLworICAgIHYgPSBmcmVlX2xpc3Q7CisgICAgZnJlZV9saXN0ID0gKFB5SW50T2JqZWN0ICopUHlfVFlQRSh2KTsKKyAgICBQeU9iamVjdF9JTklUKHYsICZQeUludF9UeXBlKTsKKyAgICB2LT5vYl9pdmFsID0gaXZhbDsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopIHY7CiB9CiAKIFB5T2JqZWN0ICoKIFB5SW50X0Zyb21TaXplX3Qoc2l6ZV90IGl2YWwpCiB7Ci0JaWYgKGl2YWwgPD0gTE9OR19NQVgpCi0JCXJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZylpdmFsKTsKLQlyZXR1cm4gX1B5TG9uZ19Gcm9tU2l6ZV90KGl2YWwpOworICAgIGlmIChpdmFsIDw9IExPTkdfTUFYKQorICAgICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpaXZhbCk7CisgICAgcmV0dXJuIF9QeUxvbmdfRnJvbVNpemVfdChpdmFsKTsKIH0KIAogUHlPYmplY3QgKgogUHlJbnRfRnJvbVNzaXplX3QoUHlfc3NpemVfdCBpdmFsKQogewotCWlmIChpdmFsID49IExPTkdfTUlOICYmIGl2YWwgPD0gTE9OR19NQVgpCi0JCXJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZylpdmFsKTsKLQlyZXR1cm4gX1B5TG9uZ19Gcm9tU3NpemVfdChpdmFsKTsKKyAgICBpZiAoaXZhbCA+PSBMT05HX01JTiAmJiBpdmFsIDw9IExPTkdfTUFYKQorICAgICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpaXZhbCk7CisgICAgcmV0dXJuIF9QeUxvbmdfRnJvbVNzaXplX3QoaXZhbCk7CiB9CiAKIHN0YXRpYyB2b2lkCiBpbnRfZGVhbGxvYyhQeUludE9iamVjdCAqdikKIHsKLQlpZiAoUHlJbnRfQ2hlY2tFeGFjdCh2KSkgewotCQlQeV9UWVBFKHYpID0gKHN0cnVjdCBfdHlwZW9iamVjdCAqKWZyZWVfbGlzdDsKLQkJZnJlZV9saXN0ID0gdjsKLQl9Ci0JZWxzZQotCQlQeV9UWVBFKHYpLT50cF9mcmVlKChQeU9iamVjdCAqKXYpOworICAgIGlmIChQeUludF9DaGVja0V4YWN0KHYpKSB7CisgICAgICAgIFB5X1RZUEUodikgPSAoc3RydWN0IF90eXBlb2JqZWN0ICopZnJlZV9saXN0OworICAgICAgICBmcmVlX2xpc3QgPSB2OworICAgIH0KKyAgICBlbHNlCisgICAgICAgIFB5X1RZUEUodiktPnRwX2ZyZWUoKFB5T2JqZWN0ICopdik7CiB9CiAKIHN0YXRpYyB2b2lkCiBpbnRfZnJlZShQeUludE9iamVjdCAqdikKIHsKLQlQeV9UWVBFKHYpID0gKHN0cnVjdCBfdHlwZW9iamVjdCAqKWZyZWVfbGlzdDsKLQlmcmVlX2xpc3QgPSB2OworICAgIFB5X1RZUEUodikgPSAoc3RydWN0IF90eXBlb2JqZWN0ICopZnJlZV9saXN0OworICAgIGZyZWVfbGlzdCA9IHY7CiB9CiAKIGxvbmcKIFB5SW50X0FzTG9uZyhyZWdpc3RlciBQeU9iamVjdCAqb3ApCiB7Ci0JUHlOdW1iZXJNZXRob2RzICpuYjsKLQlQeUludE9iamVjdCAqaW87Ci0JbG9uZyB2YWw7CisgICAgUHlOdW1iZXJNZXRob2RzICpuYjsKKyAgICBQeUludE9iamVjdCAqaW87CisgICAgbG9uZyB2YWw7CiAKLQlpZiAob3AgJiYgUHlJbnRfQ2hlY2sob3ApKQotCQlyZXR1cm4gUHlJbnRfQVNfTE9ORygoUHlJbnRPYmplY3QqKSBvcCk7CisgICAgaWYgKG9wICYmIFB5SW50X0NoZWNrKG9wKSkKKyAgICAgICAgcmV0dXJuIFB5SW50X0FTX0xPTkcoKFB5SW50T2JqZWN0Kikgb3ApOwogCi0JaWYgKG9wID09IE5VTEwgfHwgKG5iID0gUHlfVFlQRShvcCktPnRwX2FzX251bWJlcikgPT0gTlVMTCB8fAotCSAgICBuYi0+bmJfaW50ID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImFuIGludGVnZXIgaXMgcmVxdWlyZWQiKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICBpZiAob3AgPT0gTlVMTCB8fCAobmIgPSBQeV9UWVBFKG9wKS0+dHBfYXNfbnVtYmVyKSA9PSBOVUxMIHx8CisgICAgICAgIG5iLT5uYl9pbnQgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYW4gaW50ZWdlciBpcyByZXF1aXJlZCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JaW8gPSAoUHlJbnRPYmplY3QqKSAoKm5iLT5uYl9pbnQpIChvcCk7Ci0JaWYgKGlvID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQlpZiAoIVB5SW50X0NoZWNrKGlvKSkgewotCQlpZiAoUHlMb25nX0NoZWNrKGlvKSkgewotCQkJLyogZ290IGEgbG9uZz8gPT4gcmV0cnkgaW50IGNvbnZlcnNpb24gKi8KLQkJCXZhbCA9IFB5TG9uZ19Bc0xvbmcoKFB5T2JqZWN0ICopaW8pOwotCQkJUHlfREVDUkVGKGlvKTsKLQkJCWlmICgodmFsID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJCXJldHVybiAtMTsKLQkJCXJldHVybiB2YWw7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlQeV9ERUNSRUYoaW8pOwotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkJIm5iX2ludCBzaG91bGQgcmV0dXJuIGludCBvYmplY3QiKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCX0KKyAgICBpbyA9IChQeUludE9iamVjdCopICgqbmItPm5iX2ludCkgKG9wKTsKKyAgICBpZiAoaW8gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmICghUHlJbnRfQ2hlY2soaW8pKSB7CisgICAgICAgIGlmIChQeUxvbmdfQ2hlY2soaW8pKSB7CisgICAgICAgICAgICAvKiBnb3QgYSBsb25nPyA9PiByZXRyeSBpbnQgY29udmVyc2lvbiAqLworICAgICAgICAgICAgdmFsID0gUHlMb25nX0FzTG9uZygoUHlPYmplY3QgKilpbyk7CisgICAgICAgICAgICBQeV9ERUNSRUYoaW8pOworICAgICAgICAgICAgaWYgKCh2YWwgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgcmV0dXJuIHZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihpbyk7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYl9pbnQgc2hvdWxkIHJldHVybiBpbnQgb2JqZWN0Iik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CiAKLQl2YWwgPSBQeUludF9BU19MT05HKGlvKTsKLQlQeV9ERUNSRUYoaW8pOworICAgIHZhbCA9IFB5SW50X0FTX0xPTkcoaW8pOworICAgIFB5X0RFQ1JFRihpbyk7CiAKLQlyZXR1cm4gdmFsOworICAgIHJldHVybiB2YWw7CiB9CiAKIFB5X3NzaXplX3QKIFB5SW50X0FzU3NpemVfdChyZWdpc3RlciBQeU9iamVjdCAqb3ApCiB7CiAjaWYgU0laRU9GX1NJWkVfVCAhPSBTSVpFT0ZfTE9ORwotCVB5TnVtYmVyTWV0aG9kcyAqbmI7Ci0JUHlJbnRPYmplY3QgKmlvOwotCVB5X3NzaXplX3QgdmFsOworICAgIFB5TnVtYmVyTWV0aG9kcyAqbmI7CisgICAgUHlJbnRPYmplY3QgKmlvOworICAgIFB5X3NzaXplX3QgdmFsOwogI2VuZGlmCiAKLQlpZiAob3AgPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYW4gaW50ZWdlciBpcyByZXF1aXJlZCIpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIGlmIChvcCA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJhbiBpbnRlZ2VyIGlzIHJlcXVpcmVkIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQlpZiAoUHlJbnRfQ2hlY2sob3ApKQotCQlyZXR1cm4gUHlJbnRfQVNfTE9ORygoUHlJbnRPYmplY3QqKSBvcCk7Ci0JaWYgKFB5TG9uZ19DaGVjayhvcCkpCi0JCXJldHVybiBfUHlMb25nX0FzU3NpemVfdChvcCk7CisgICAgaWYgKFB5SW50X0NoZWNrKG9wKSkKKyAgICAgICAgcmV0dXJuIFB5SW50X0FTX0xPTkcoKFB5SW50T2JqZWN0Kikgb3ApOworICAgIGlmIChQeUxvbmdfQ2hlY2sob3ApKQorICAgICAgICByZXR1cm4gX1B5TG9uZ19Bc1NzaXplX3Qob3ApOwogI2lmIFNJWkVPRl9TSVpFX1QgPT0gU0laRU9GX0xPTkcKLQlyZXR1cm4gUHlJbnRfQXNMb25nKG9wKTsKKyAgICByZXR1cm4gUHlJbnRfQXNMb25nKG9wKTsKICNlbHNlCiAKLQlpZiAoKG5iID0gUHlfVFlQRShvcCktPnRwX2FzX251bWJlcikgPT0gTlVMTCB8fAotCSAgICAobmItPm5iX2ludCA9PSBOVUxMICYmIG5iLT5uYl9sb25nID09IDApKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJhbiBpbnRlZ2VyIGlzIHJlcXVpcmVkIik7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgaWYgKChuYiA9IFB5X1RZUEUob3ApLT50cF9hc19udW1iZXIpID09IE5VTEwgfHwKKyAgICAgICAgKG5iLT5uYl9pbnQgPT0gTlVMTCAmJiBuYi0+bmJfbG9uZyA9PSAwKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYW4gaW50ZWdlciBpcyByZXF1aXJlZCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JaWYgKG5iLT5uYl9sb25nICE9IDApCi0JCWlvID0gKFB5SW50T2JqZWN0KikgKCpuYi0+bmJfbG9uZykgKG9wKTsKLQllbHNlCi0JCWlvID0gKFB5SW50T2JqZWN0KikgKCpuYi0+bmJfaW50KSAob3ApOwotCWlmIChpbyA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0JaWYgKCFQeUludF9DaGVjayhpbykpIHsKLQkJaWYgKFB5TG9uZ19DaGVjayhpbykpIHsKLQkJCS8qIGdvdCBhIGxvbmc/ID0+IHJldHJ5IGludCBjb252ZXJzaW9uICovCi0JCQl2YWwgPSBfUHlMb25nX0FzU3NpemVfdCgoUHlPYmplY3QgKilpbyk7Ci0JCQlQeV9ERUNSRUYoaW8pOwotCQkJaWYgKCh2YWwgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCQkJcmV0dXJuIC0xOwotCQkJcmV0dXJuIHZhbDsKLQkJfQotCQllbHNlCi0JCXsKLQkJCVB5X0RFQ1JFRihpbyk7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCQkibmJfaW50IHNob3VsZCByZXR1cm4gaW50IG9iamVjdCIpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQorICAgIGlmIChuYi0+bmJfbG9uZyAhPSAwKQorICAgICAgICBpbyA9IChQeUludE9iamVjdCopICgqbmItPm5iX2xvbmcpIChvcCk7CisgICAgZWxzZQorICAgICAgICBpbyA9IChQeUludE9iamVjdCopICgqbmItPm5iX2ludCkgKG9wKTsKKyAgICBpZiAoaW8gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmICghUHlJbnRfQ2hlY2soaW8pKSB7CisgICAgICAgIGlmIChQeUxvbmdfQ2hlY2soaW8pKSB7CisgICAgICAgICAgICAvKiBnb3QgYSBsb25nPyA9PiByZXRyeSBpbnQgY29udmVyc2lvbiAqLworICAgICAgICAgICAgdmFsID0gX1B5TG9uZ19Bc1NzaXplX3QoKFB5T2JqZWN0ICopaW8pOworICAgICAgICAgICAgUHlfREVDUkVGKGlvKTsKKyAgICAgICAgICAgIGlmICgodmFsID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIHJldHVybiB2YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBQeV9ERUNSRUYoaW8pOworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmJfaW50IHNob3VsZCByZXR1cm4gaW50IG9iamVjdCIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQogCi0JdmFsID0gUHlJbnRfQVNfTE9ORyhpbyk7Ci0JUHlfREVDUkVGKGlvKTsKKyAgICB2YWwgPSBQeUludF9BU19MT05HKGlvKTsKKyAgICBQeV9ERUNSRUYoaW8pOwogCi0JcmV0dXJuIHZhbDsKKyAgICByZXR1cm4gdmFsOwogI2VuZGlmCiB9CiAKIHVuc2lnbmVkIGxvbmcKIFB5SW50X0FzVW5zaWduZWRMb25nTWFzayhyZWdpc3RlciBQeU9iamVjdCAqb3ApCiB7Ci0JUHlOdW1iZXJNZXRob2RzICpuYjsKLQlQeUludE9iamVjdCAqaW87Ci0JdW5zaWduZWQgbG9uZyB2YWw7CisgICAgUHlOdW1iZXJNZXRob2RzICpuYjsKKyAgICBQeUludE9iamVjdCAqaW87CisgICAgdW5zaWduZWQgbG9uZyB2YWw7CiAKLQlpZiAob3AgJiYgUHlJbnRfQ2hlY2sob3ApKQotCQlyZXR1cm4gUHlJbnRfQVNfTE9ORygoUHlJbnRPYmplY3QqKSBvcCk7Ci0JaWYgKG9wICYmIFB5TG9uZ19DaGVjayhvcCkpCi0JCXJldHVybiBQeUxvbmdfQXNVbnNpZ25lZExvbmdNYXNrKG9wKTsKKyAgICBpZiAob3AgJiYgUHlJbnRfQ2hlY2sob3ApKQorICAgICAgICByZXR1cm4gUHlJbnRfQVNfTE9ORygoUHlJbnRPYmplY3QqKSBvcCk7CisgICAgaWYgKG9wICYmIFB5TG9uZ19DaGVjayhvcCkpCisgICAgICAgIHJldHVybiBQeUxvbmdfQXNVbnNpZ25lZExvbmdNYXNrKG9wKTsKIAotCWlmIChvcCA9PSBOVUxMIHx8IChuYiA9IFB5X1RZUEUob3ApLT50cF9hc19udW1iZXIpID09IE5VTEwgfHwKLQkgICAgbmItPm5iX2ludCA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJhbiBpbnRlZ2VyIGlzIHJlcXVpcmVkIik7Ci0JCXJldHVybiAodW5zaWduZWQgbG9uZyktMTsKLQl9CisgICAgaWYgKG9wID09IE5VTEwgfHwgKG5iID0gUHlfVFlQRShvcCktPnRwX2FzX251bWJlcikgPT0gTlVMTCB8fAorICAgICAgICBuYi0+bmJfaW50ID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImFuIGludGVnZXIgaXMgcmVxdWlyZWQiKTsKKyAgICAgICAgcmV0dXJuICh1bnNpZ25lZCBsb25nKS0xOworICAgIH0KIAotCWlvID0gKFB5SW50T2JqZWN0KikgKCpuYi0+bmJfaW50KSAob3ApOwotCWlmIChpbyA9PSBOVUxMKQotCQlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpLTE7Ci0JaWYgKCFQeUludF9DaGVjayhpbykpIHsKLQkJaWYgKFB5TG9uZ19DaGVjayhpbykpIHsKLQkJCXZhbCA9IFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ01hc2soKFB5T2JqZWN0ICopaW8pOwotCQkJUHlfREVDUkVGKGlvKTsKLQkJCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQkJCXJldHVybiAodW5zaWduZWQgbG9uZyktMTsKLQkJCXJldHVybiB2YWw7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlQeV9ERUNSRUYoaW8pOwotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkJIm5iX2ludCBzaG91bGQgcmV0dXJuIGludCBvYmplY3QiKTsKLQkJCXJldHVybiAodW5zaWduZWQgbG9uZyktMTsKLQkJfQotCX0KKyAgICBpbyA9IChQeUludE9iamVjdCopICgqbmItPm5iX2ludCkgKG9wKTsKKyAgICBpZiAoaW8gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuICh1bnNpZ25lZCBsb25nKS0xOworICAgIGlmICghUHlJbnRfQ2hlY2soaW8pKSB7CisgICAgICAgIGlmIChQeUxvbmdfQ2hlY2soaW8pKSB7CisgICAgICAgICAgICB2YWwgPSBQeUxvbmdfQXNVbnNpZ25lZExvbmdNYXNrKChQeU9iamVjdCAqKWlvKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihpbyk7CisgICAgICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKHVuc2lnbmVkIGxvbmcpLTE7CisgICAgICAgICAgICByZXR1cm4gdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgUHlfREVDUkVGKGlvKTsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5iX2ludCBzaG91bGQgcmV0dXJuIGludCBvYmplY3QiKTsKKyAgICAgICAgICAgIHJldHVybiAodW5zaWduZWQgbG9uZyktMTsKKyAgICAgICAgfQorICAgIH0KIAotCXZhbCA9IFB5SW50X0FTX0xPTkcoaW8pOwotCVB5X0RFQ1JFRihpbyk7CisgICAgdmFsID0gUHlJbnRfQVNfTE9ORyhpbyk7CisgICAgUHlfREVDUkVGKGlvKTsKIAotCXJldHVybiB2YWw7CisgICAgcmV0dXJuIHZhbDsKIH0KIAogI2lmZGVmIEhBVkVfTE9OR19MT05HCiB1bnNpZ25lZCBQWV9MT05HX0xPTkcKIFB5SW50X0FzVW5zaWduZWRMb25nTG9uZ01hc2socmVnaXN0ZXIgUHlPYmplY3QgKm9wKQogewotCVB5TnVtYmVyTWV0aG9kcyAqbmI7Ci0JUHlJbnRPYmplY3QgKmlvOwotCXVuc2lnbmVkIFBZX0xPTkdfTE9ORyB2YWw7CisgICAgUHlOdW1iZXJNZXRob2RzICpuYjsKKyAgICBQeUludE9iamVjdCAqaW87CisgICAgdW5zaWduZWQgUFlfTE9OR19MT05HIHZhbDsKIAotCWlmIChvcCAmJiBQeUludF9DaGVjayhvcCkpCi0JCXJldHVybiBQeUludF9BU19MT05HKChQeUludE9iamVjdCopIG9wKTsKLQlpZiAob3AgJiYgUHlMb25nX0NoZWNrKG9wKSkKLQkJcmV0dXJuIFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ0xvbmdNYXNrKG9wKTsKKyAgICBpZiAob3AgJiYgUHlJbnRfQ2hlY2sob3ApKQorICAgICAgICByZXR1cm4gUHlJbnRfQVNfTE9ORygoUHlJbnRPYmplY3QqKSBvcCk7CisgICAgaWYgKG9wICYmIFB5TG9uZ19DaGVjayhvcCkpCisgICAgICAgIHJldHVybiBQeUxvbmdfQXNVbnNpZ25lZExvbmdMb25nTWFzayhvcCk7CiAKLQlpZiAob3AgPT0gTlVMTCB8fCAobmIgPSBQeV9UWVBFKG9wKS0+dHBfYXNfbnVtYmVyKSA9PSBOVUxMIHx8Ci0JICAgIG5iLT5uYl9pbnQgPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYW4gaW50ZWdlciBpcyByZXF1aXJlZCIpOwotCQlyZXR1cm4gKHVuc2lnbmVkIFBZX0xPTkdfTE9ORyktMTsKLQl9CisgICAgaWYgKG9wID09IE5VTEwgfHwgKG5iID0gUHlfVFlQRShvcCktPnRwX2FzX251bWJlcikgPT0gTlVMTCB8fAorICAgICAgICBuYi0+bmJfaW50ID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImFuIGludGVnZXIgaXMgcmVxdWlyZWQiKTsKKyAgICAgICAgcmV0dXJuICh1bnNpZ25lZCBQWV9MT05HX0xPTkcpLTE7CisgICAgfQogCi0JaW8gPSAoUHlJbnRPYmplY3QqKSAoKm5iLT5uYl9pbnQpIChvcCk7Ci0JaWYgKGlvID09IE5VTEwpCi0JCXJldHVybiAodW5zaWduZWQgUFlfTE9OR19MT05HKS0xOwotCWlmICghUHlJbnRfQ2hlY2soaW8pKSB7Ci0JCWlmIChQeUxvbmdfQ2hlY2soaW8pKSB7Ci0JCQl2YWwgPSBQeUxvbmdfQXNVbnNpZ25lZExvbmdMb25nTWFzaygoUHlPYmplY3QgKilpbyk7Ci0JCQlQeV9ERUNSRUYoaW8pOwotCQkJaWYgKFB5RXJyX09jY3VycmVkKCkpCi0JCQkJcmV0dXJuICh1bnNpZ25lZCBQWV9MT05HX0xPTkcpLTE7Ci0JCQlyZXR1cm4gdmFsOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJUHlfREVDUkVGKGlvKTsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJCSJuYl9pbnQgc2hvdWxkIHJldHVybiBpbnQgb2JqZWN0Iik7Ci0JCQlyZXR1cm4gKHVuc2lnbmVkIFBZX0xPTkdfTE9ORyktMTsKLQkJfQotCX0KKyAgICBpbyA9IChQeUludE9iamVjdCopICgqbmItPm5iX2ludCkgKG9wKTsKKyAgICBpZiAoaW8gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuICh1bnNpZ25lZCBQWV9MT05HX0xPTkcpLTE7CisgICAgaWYgKCFQeUludF9DaGVjayhpbykpIHsKKyAgICAgICAgaWYgKFB5TG9uZ19DaGVjayhpbykpIHsKKyAgICAgICAgICAgIHZhbCA9IFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ0xvbmdNYXNrKChQeU9iamVjdCAqKWlvKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihpbyk7CisgICAgICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKHVuc2lnbmVkIFBZX0xPTkdfTE9ORyktMTsKKyAgICAgICAgICAgIHJldHVybiB2YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBQeV9ERUNSRUYoaW8pOworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmJfaW50IHNob3VsZCByZXR1cm4gaW50IG9iamVjdCIpOworICAgICAgICAgICAgcmV0dXJuICh1bnNpZ25lZCBQWV9MT05HX0xPTkcpLTE7CisgICAgICAgIH0KKyAgICB9CiAKLQl2YWwgPSBQeUludF9BU19MT05HKGlvKTsKLQlQeV9ERUNSRUYoaW8pOworICAgIHZhbCA9IFB5SW50X0FTX0xPTkcoaW8pOworICAgIFB5X0RFQ1JFRihpbyk7CiAKLQlyZXR1cm4gdmFsOworICAgIHJldHVybiB2YWw7CiB9CiAjZW5kaWYKIAogUHlPYmplY3QgKgogUHlJbnRfRnJvbVN0cmluZyhjaGFyICpzLCBjaGFyICoqcGVuZCwgaW50IGJhc2UpCiB7Ci0JY2hhciAqZW5kOwotCWxvbmcgeDsKLQlQeV9zc2l6ZV90IHNsZW47Ci0JUHlPYmplY3QgKnNvYmosICpzcmVwcjsKKyAgICBjaGFyICplbmQ7CisgICAgbG9uZyB4OworICAgIFB5X3NzaXplX3Qgc2xlbjsKKyAgICBQeU9iamVjdCAqc29iaiwgKnNyZXByOwogCi0JaWYgKChiYXNlICE9IDAgJiYgYmFzZSA8IDIpIHx8IGJhc2UgPiAzNikgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkiaW50KCkgYmFzZSBtdXN0IGJlID49IDIgYW5kIDw9IDM2Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoKGJhc2UgIT0gMCAmJiBiYXNlIDwgMikgfHwgYmFzZSA+IDM2KSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImludCgpIGJhc2UgbXVzdCBiZSA+PSAyIGFuZCA8PSAzNiIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQl3aGlsZSAoKnMgJiYgaXNzcGFjZShQeV9DSEFSTUFTSygqcykpKQotCQlzKys7Ci0JZXJybm8gPSAwOwotCWlmIChiYXNlID09IDAgJiYgc1swXSA9PSAnMCcpIHsKLQkJeCA9IChsb25nKSBQeU9TX3N0cnRvdWwocywgJmVuZCwgYmFzZSk7Ci0JCWlmICh4IDwgMCkKLQkJCXJldHVybiBQeUxvbmdfRnJvbVN0cmluZyhzLCBwZW5kLCBiYXNlKTsKLQl9Ci0JZWxzZQotCQl4ID0gUHlPU19zdHJ0b2wocywgJmVuZCwgYmFzZSk7Ci0JaWYgKGVuZCA9PSBzIHx8ICFpc2FsbnVtKFB5X0NIQVJNQVNLKGVuZFstMV0pKSkKLQkJZ290byBiYWQ7Ci0Jd2hpbGUgKCplbmQgJiYgaXNzcGFjZShQeV9DSEFSTUFTSygqZW5kKSkpCi0JCWVuZCsrOwotCWlmICgqZW5kICE9ICdcMCcpIHsKKyAgICB3aGlsZSAoKnMgJiYgaXNzcGFjZShQeV9DSEFSTUFTSygqcykpKQorICAgICAgICBzKys7CisgICAgZXJybm8gPSAwOworICAgIGlmIChiYXNlID09IDAgJiYgc1swXSA9PSAnMCcpIHsKKyAgICAgICAgeCA9IChsb25nKSBQeU9TX3N0cnRvdWwocywgJmVuZCwgYmFzZSk7CisgICAgICAgIGlmICh4IDwgMCkKKyAgICAgICAgICAgIHJldHVybiBQeUxvbmdfRnJvbVN0cmluZyhzLCBwZW5kLCBiYXNlKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICB4ID0gUHlPU19zdHJ0b2wocywgJmVuZCwgYmFzZSk7CisgICAgaWYgKGVuZCA9PSBzIHx8ICFpc2FsbnVtKFB5X0NIQVJNQVNLKGVuZFstMV0pKSkKKyAgICAgICAgZ290byBiYWQ7CisgICAgd2hpbGUgKCplbmQgJiYgaXNzcGFjZShQeV9DSEFSTUFTSygqZW5kKSkpCisgICAgICAgIGVuZCsrOworICAgIGlmICgqZW5kICE9ICdcMCcpIHsKICAgYmFkOgotCQlzbGVuID0gc3RybGVuKHMpIDwgMjAwID8gc3RybGVuKHMpIDogMjAwOwotCQlzb2JqID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocywgc2xlbik7Ci0JCWlmIChzb2JqID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQkJc3JlcHIgPSBQeU9iamVjdF9SZXByKHNvYmopOwotCQlQeV9ERUNSRUYoc29iaik7Ci0JCWlmIChzcmVwciA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAotCQkJICAgICAiaW52YWxpZCBsaXRlcmFsIGZvciBpbnQoKSB3aXRoIGJhc2UgJWQ6ICVzIiwKLQkJCSAgICAgYmFzZSwgUHlTdHJpbmdfQVNfU1RSSU5HKHNyZXByKSk7Ci0JCVB5X0RFQ1JFRihzcmVwcik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQllbHNlIGlmIChlcnJubyAhPSAwKQotCQlyZXR1cm4gUHlMb25nX0Zyb21TdHJpbmcocywgcGVuZCwgYmFzZSk7Ci0JaWYgKHBlbmQpCi0JCSpwZW5kID0gZW5kOwotCXJldHVybiBQeUludF9Gcm9tTG9uZyh4KTsKKyAgICAgICAgc2xlbiA9IHN0cmxlbihzKSA8IDIwMCA/IHN0cmxlbihzKSA6IDIwMDsKKyAgICAgICAgc29iaiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHMsIHNsZW4pOworICAgICAgICBpZiAoc29iaiA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHNyZXByID0gUHlPYmplY3RfUmVwcihzb2JqKTsKKyAgICAgICAgUHlfREVDUkVGKHNvYmopOworICAgICAgICBpZiAoc3JlcHIgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIGxpdGVyYWwgZm9yIGludCgpIHdpdGggYmFzZSAlZDogJXMiLAorICAgICAgICAgICAgICAgICAgICAgYmFzZSwgUHlTdHJpbmdfQVNfU1RSSU5HKHNyZXByKSk7CisgICAgICAgIFB5X0RFQ1JFRihzcmVwcik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBlbHNlIGlmIChlcnJubyAhPSAwKQorICAgICAgICByZXR1cm4gUHlMb25nX0Zyb21TdHJpbmcocywgcGVuZCwgYmFzZSk7CisgICAgaWYgKHBlbmQpCisgICAgICAgICpwZW5kID0gZW5kOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyh4KTsKIH0KIAogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKIFB5T2JqZWN0ICoKIFB5SW50X0Zyb21Vbmljb2RlKFB5X1VOSUNPREUgKnMsIFB5X3NzaXplX3QgbGVuZ3RoLCBpbnQgYmFzZSkKIHsKLQlQeU9iamVjdCAqcmVzdWx0OwotCWNoYXIgKmJ1ZmZlciA9IChjaGFyICopUHlNZW1fTUFMTE9DKGxlbmd0aCsxKTsKKyAgICBQeU9iamVjdCAqcmVzdWx0OworICAgIGNoYXIgKmJ1ZmZlciA9IChjaGFyICopUHlNZW1fTUFMTE9DKGxlbmd0aCsxKTsKIAotCWlmIChidWZmZXIgPT0gTlVMTCkKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgaWYgKGJ1ZmZlciA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKIAotCWlmIChQeVVuaWNvZGVfRW5jb2RlRGVjaW1hbChzLCBsZW5ndGgsIGJ1ZmZlciwgTlVMTCkpIHsKLQkJUHlNZW1fRlJFRShidWZmZXIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmVzdWx0ID0gUHlJbnRfRnJvbVN0cmluZyhidWZmZXIsIE5VTEwsIGJhc2UpOwotCVB5TWVtX0ZSRUUoYnVmZmVyKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIGlmIChQeVVuaWNvZGVfRW5jb2RlRGVjaW1hbChzLCBsZW5ndGgsIGJ1ZmZlciwgTlVMTCkpIHsKKyAgICAgICAgUHlNZW1fRlJFRShidWZmZXIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmVzdWx0ID0gUHlJbnRfRnJvbVN0cmluZyhidWZmZXIsIE5VTEwsIGJhc2UpOworICAgIFB5TWVtX0ZSRUUoYnVmZmVyKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogI2VuZGlmCiAKQEAgLTQxMyw3NyArNDEzLDc3IEBACiAgICBkb24ndCBoYXZlIGFueSBrbm93bGVkZ2UgYWJvdXQgY29udmVyc2lvbiBvZiBvdGhlciB0eXBlcyB0bwogICAgaW50ZWdlcnMuICovCiAKLSNkZWZpbmUgQ09OVkVSVF9UT19MT05HKG9iaiwgbG5nKQkJXAotCWlmIChQeUludF9DaGVjayhvYmopKSB7CQkJXAotCQlsbmcgPSBQeUludF9BU19MT05HKG9iaik7CVwKLQl9CQkJCQlcCi0JZWxzZSB7CQkJCQlcCi0JCVB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7CVwKLQkJcmV0dXJuIFB5X05vdEltcGxlbWVudGVkOwlcCi0JfQorI2RlZmluZSBDT05WRVJUX1RPX0xPTkcob2JqLCBsbmcpICAgICAgICAgICAgICAgXAorICAgIGlmIChQeUludF9DaGVjayhvYmopKSB7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBsbmcgPSBQeUludF9BU19MT05HKG9iaik7ICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOyAgICAgICAgICAgXAorICAgICAgICByZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7ICAgICAgICAgICAgICAgXAorICAgIH0KIAogLyogQVJHU1VTRUQgKi8KIHN0YXRpYyBpbnQKIGludF9wcmludChQeUludE9iamVjdCAqdiwgRklMRSAqZnAsIGludCBmbGFncykKICAgICAgLyogZmxhZ3MgLS0gbm90IHVzZWQgYnV0IHJlcXVpcmVkIGJ5IGludGVyZmFjZSAqLwogewotCWxvbmcgaW50X3ZhbCA9IHYtPm9iX2l2YWw7Ci0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCWZwcmludGYoZnAsICIlbGQiLCBpbnRfdmFsKTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCXJldHVybiAwOworICAgIGxvbmcgaW50X3ZhbCA9IHYtPm9iX2l2YWw7CisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIGZwcmludGYoZnAsICIlbGQiLCBpbnRfdmFsKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaW50X3JlcHIoUHlJbnRPYmplY3QgKnYpCiB7Ci0JcmV0dXJuIF9QeUludF9Gb3JtYXQodiwgMTAsIDApOworICAgIHJldHVybiBfUHlJbnRfRm9ybWF0KHYsIDEwLCAwKTsKIH0KIAogc3RhdGljIGludAogaW50X2NvbXBhcmUoUHlJbnRPYmplY3QgKnYsIFB5SW50T2JqZWN0ICp3KQogewotCXJlZ2lzdGVyIGxvbmcgaSA9IHYtPm9iX2l2YWw7Ci0JcmVnaXN0ZXIgbG9uZyBqID0gdy0+b2JfaXZhbDsKLQlyZXR1cm4gKGkgPCBqKSA/IC0xIDogKGkgPiBqKSA/IDEgOiAwOworICAgIHJlZ2lzdGVyIGxvbmcgaSA9IHYtPm9iX2l2YWw7CisgICAgcmVnaXN0ZXIgbG9uZyBqID0gdy0+b2JfaXZhbDsKKyAgICByZXR1cm4gKGkgPCBqKSA/IC0xIDogKGkgPiBqKSA/IDEgOiAwOwogfQogCiBzdGF0aWMgbG9uZwogaW50X2hhc2goUHlJbnRPYmplY3QgKnYpCiB7Ci0JLyogWFhYIElmIHRoaXMgaXMgY2hhbmdlZCwgeW91IGFsc28gbmVlZCB0byBjaGFuZ2UgdGhlIHdheQotCSAgIFB5dGhvbidzIGxvbmcsIGZsb2F0IGFuZCBjb21wbGV4IHR5cGVzIGFyZSBoYXNoZWQuICovCi0JbG9uZyB4ID0gdiAtPiBvYl9pdmFsOwotCWlmICh4ID09IC0xKQotCQl4ID0gLTI7Ci0JcmV0dXJuIHg7CisgICAgLyogWFhYIElmIHRoaXMgaXMgY2hhbmdlZCwgeW91IGFsc28gbmVlZCB0byBjaGFuZ2UgdGhlIHdheQorICAgICAgIFB5dGhvbidzIGxvbmcsIGZsb2F0IGFuZCBjb21wbGV4IHR5cGVzIGFyZSBoYXNoZWQuICovCisgICAgbG9uZyB4ID0gdiAtPiBvYl9pdmFsOworICAgIGlmICh4ID09IC0xKQorICAgICAgICB4ID0gLTI7CisgICAgcmV0dXJuIHg7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbnRfYWRkKFB5SW50T2JqZWN0ICp2LCBQeUludE9iamVjdCAqdykKIHsKLQlyZWdpc3RlciBsb25nIGEsIGIsIHg7Ci0JQ09OVkVSVF9UT19MT05HKHYsIGEpOwotCUNPTlZFUlRfVE9fTE9ORyh3LCBiKTsKLQkvKiBjYXN0cyBpbiB0aGUgbGluZSBiZWxvdyBhdm9pZCB1bmRlZmluZWQgYmVoYXZpb3VyIG9uIG92ZXJmbG93ICovCi0JeCA9IChsb25nKSgodW5zaWduZWQgbG9uZylhICsgYik7Ci0JaWYgKCh4XmEpID49IDAgfHwgKHheYikgPj0gMCkKLQkJcmV0dXJuIFB5SW50X0Zyb21Mb25nKHgpOwotCXJldHVybiBQeUxvbmdfVHlwZS50cF9hc19udW1iZXItPm5iX2FkZCgoUHlPYmplY3QgKil2LCAoUHlPYmplY3QgKil3KTsKKyAgICByZWdpc3RlciBsb25nIGEsIGIsIHg7CisgICAgQ09OVkVSVF9UT19MT05HKHYsIGEpOworICAgIENPTlZFUlRfVE9fTE9ORyh3LCBiKTsKKyAgICAvKiBjYXN0cyBpbiB0aGUgbGluZSBiZWxvdyBhdm9pZCB1bmRlZmluZWQgYmVoYXZpb3VyIG9uIG92ZXJmbG93ICovCisgICAgeCA9IChsb25nKSgodW5zaWduZWQgbG9uZylhICsgYik7CisgICAgaWYgKCh4XmEpID49IDAgfHwgKHheYikgPj0gMCkKKyAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHgpOworICAgIHJldHVybiBQeUxvbmdfVHlwZS50cF9hc19udW1iZXItPm5iX2FkZCgoUHlPYmplY3QgKil2LCAoUHlPYmplY3QgKil3KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGludF9zdWIoUHlJbnRPYmplY3QgKnYsIFB5SW50T2JqZWN0ICp3KQogewotCXJlZ2lzdGVyIGxvbmcgYSwgYiwgeDsKLQlDT05WRVJUX1RPX0xPTkcodiwgYSk7Ci0JQ09OVkVSVF9UT19MT05HKHcsIGIpOwotCS8qIGNhc3RzIGluIHRoZSBsaW5lIGJlbG93IGF2b2lkIHVuZGVmaW5lZCBiZWhhdmlvdXIgb24gb3ZlcmZsb3cgKi8KLQl4ID0gKGxvbmcpKCh1bnNpZ25lZCBsb25nKWEgLSBiKTsKLQlpZiAoKHheYSkgPj0gMCB8fCAoeF5+YikgPj0gMCkKLQkJcmV0dXJuIFB5SW50X0Zyb21Mb25nKHgpOwotCXJldHVybiBQeUxvbmdfVHlwZS50cF9hc19udW1iZXItPm5iX3N1YnRyYWN0KChQeU9iamVjdCAqKXYsCi0JCQkJCQkgICAgIChQeU9iamVjdCAqKXcpOworICAgIHJlZ2lzdGVyIGxvbmcgYSwgYiwgeDsKKyAgICBDT05WRVJUX1RPX0xPTkcodiwgYSk7CisgICAgQ09OVkVSVF9UT19MT05HKHcsIGIpOworICAgIC8qIGNhc3RzIGluIHRoZSBsaW5lIGJlbG93IGF2b2lkIHVuZGVmaW5lZCBiZWhhdmlvdXIgb24gb3ZlcmZsb3cgKi8KKyAgICB4ID0gKGxvbmcpKCh1bnNpZ25lZCBsb25nKWEgLSBiKTsKKyAgICBpZiAoKHheYSkgPj0gMCB8fCAoeF5+YikgPj0gMCkKKyAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHgpOworICAgIHJldHVybiBQeUxvbmdfVHlwZS50cF9hc19udW1iZXItPm5iX3N1YnRyYWN0KChQeU9iamVjdCAqKXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFB5T2JqZWN0ICopdyk7CiB9CiAKIC8qCkBAIC01MTUsNDAgKzUxNSw0MCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGludF9tdWwoUHlPYmplY3QgKnYsIFB5T2JqZWN0ICp3KQogewotCWxvbmcgYSwgYjsKLQlsb25nIGxvbmdwcm9kOwkJCS8qIGEqYiBpbiBuYXRpdmUgbG9uZyBhcml0aG1ldGljICovCi0JZG91YmxlIGRvdWJsZWRfbG9uZ3Byb2Q7CS8qIChkb3VibGUpbG9uZ3Byb2QgKi8KLQlkb3VibGUgZG91YmxlcHJvZDsJCS8qIChkb3VibGUpYSAqIChkb3VibGUpYiAqLworICAgIGxvbmcgYSwgYjsKKyAgICBsb25nIGxvbmdwcm9kOyAgICAgICAgICAgICAgICAgICAgICAvKiBhKmIgaW4gbmF0aXZlIGxvbmcgYXJpdGhtZXRpYyAqLworICAgIGRvdWJsZSBkb3VibGVkX2xvbmdwcm9kOyAgICAgICAgICAgIC8qIChkb3VibGUpbG9uZ3Byb2QgKi8KKyAgICBkb3VibGUgZG91YmxlcHJvZDsgICAgICAgICAgICAgICAgICAvKiAoZG91YmxlKWEgKiAoZG91YmxlKWIgKi8KIAotCUNPTlZFUlRfVE9fTE9ORyh2LCBhKTsKLQlDT05WRVJUX1RPX0xPTkcodywgYik7Ci0JLyogY2FzdHMgaW4gdGhlIG5leHQgbGluZSBhdm9pZCB1bmRlZmluZWQgYmVoYXZpb3VyIG9uIG92ZXJmbG93ICovCi0JbG9uZ3Byb2QgPSAobG9uZykoKHVuc2lnbmVkIGxvbmcpYSAqIGIpOwotCWRvdWJsZXByb2QgPSAoZG91YmxlKWEgKiAoZG91YmxlKWI7Ci0JZG91YmxlZF9sb25ncHJvZCA9IChkb3VibGUpbG9uZ3Byb2Q7CisgICAgQ09OVkVSVF9UT19MT05HKHYsIGEpOworICAgIENPTlZFUlRfVE9fTE9ORyh3LCBiKTsKKyAgICAvKiBjYXN0cyBpbiB0aGUgbmV4dCBsaW5lIGF2b2lkIHVuZGVmaW5lZCBiZWhhdmlvdXIgb24gb3ZlcmZsb3cgKi8KKyAgICBsb25ncHJvZCA9IChsb25nKSgodW5zaWduZWQgbG9uZylhICogYik7CisgICAgZG91YmxlcHJvZCA9IChkb3VibGUpYSAqIChkb3VibGUpYjsKKyAgICBkb3VibGVkX2xvbmdwcm9kID0gKGRvdWJsZSlsb25ncHJvZDsKIAotCS8qIEZhc3QgcGF0aCBmb3Igbm9ybWFsIGNhc2U6ICBzbWFsbCBtdWx0aXBsaWNhbmRzLCBhbmQgbm8gaW5mbwotCSAgIGlzIGxvc3QgaW4gZWl0aGVyIG1ldGhvZC4gKi8KLQlpZiAoZG91YmxlZF9sb25ncHJvZCA9PSBkb3VibGVwcm9kKQotCQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcobG9uZ3Byb2QpOworICAgIC8qIEZhc3QgcGF0aCBmb3Igbm9ybWFsIGNhc2U6ICBzbWFsbCBtdWx0aXBsaWNhbmRzLCBhbmQgbm8gaW5mbworICAgICAgIGlzIGxvc3QgaW4gZWl0aGVyIG1ldGhvZC4gKi8KKyAgICBpZiAoZG91YmxlZF9sb25ncHJvZCA9PSBkb3VibGVwcm9kKQorICAgICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcobG9uZ3Byb2QpOwogCi0JLyogU29tZWJvZHkgc29tZXdoZXJlIGxvc3QgaW5mby4gIENsb3NlIGVub3VnaCwgb3Igd2F5IG9mZj8gIE5vdGUKLQkgICB0aGF0IGEgIT0gMCBhbmQgYiAhPSAwIChlbHNlIGRvdWJsZWRfbG9uZ3Byb2QgPT0gZG91YmxlcHJvZCA9PSAwKS4KLQkgICBUaGUgZGlmZmVyZW5jZSBlaXRoZXIgaXMgb3IgaXNuJ3Qgc2lnbmlmaWNhbnQgY29tcGFyZWQgdG8gdGhlCi0JICAgdHJ1ZSB2YWx1ZSAob2Ygd2hpY2ggZG91YmxlcHJvZCBpcyBhIGdvb2QgYXBwcm94aW1hdGlvbikuCi0JKi8KLQl7Ci0JCWNvbnN0IGRvdWJsZSBkaWZmID0gZG91YmxlZF9sb25ncHJvZCAtIGRvdWJsZXByb2Q7Ci0JCWNvbnN0IGRvdWJsZSBhYnNkaWZmID0gZGlmZiA+PSAwLjAgPyBkaWZmIDogLWRpZmY7Ci0JCWNvbnN0IGRvdWJsZSBhYnNwcm9kID0gZG91YmxlcHJvZCA+PSAwLjAgPyBkb3VibGVwcm9kIDoKLQkJCQkJCQkgIC1kb3VibGVwcm9kOwotCQkvKiBhYnNkaWZmL2Fic3Byb2QgPD0gMS8zMiBpZmYKLQkJICAgMzIgKiBhYnNkaWZmIDw9IGFic3Byb2QgLS0gNSBnb29kIGJpdHMgaXMgImNsb3NlIGVub3VnaCIgKi8KLQkJaWYgKDMyLjAgKiBhYnNkaWZmIDw9IGFic3Byb2QpCi0JCQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcobG9uZ3Byb2QpOwotCQllbHNlCi0JCQlyZXR1cm4gUHlMb25nX1R5cGUudHBfYXNfbnVtYmVyLT5uYl9tdWx0aXBseSh2LCB3KTsKLQl9CisgICAgLyogU29tZWJvZHkgc29tZXdoZXJlIGxvc3QgaW5mby4gIENsb3NlIGVub3VnaCwgb3Igd2F5IG9mZj8gIE5vdGUKKyAgICAgICB0aGF0IGEgIT0gMCBhbmQgYiAhPSAwIChlbHNlIGRvdWJsZWRfbG9uZ3Byb2QgPT0gZG91YmxlcHJvZCA9PSAwKS4KKyAgICAgICBUaGUgZGlmZmVyZW5jZSBlaXRoZXIgaXMgb3IgaXNuJ3Qgc2lnbmlmaWNhbnQgY29tcGFyZWQgdG8gdGhlCisgICAgICAgdHJ1ZSB2YWx1ZSAob2Ygd2hpY2ggZG91YmxlcHJvZCBpcyBhIGdvb2QgYXBwcm94aW1hdGlvbikuCisgICAgKi8KKyAgICB7CisgICAgICAgIGNvbnN0IGRvdWJsZSBkaWZmID0gZG91YmxlZF9sb25ncHJvZCAtIGRvdWJsZXByb2Q7CisgICAgICAgIGNvbnN0IGRvdWJsZSBhYnNkaWZmID0gZGlmZiA+PSAwLjAgPyBkaWZmIDogLWRpZmY7CisgICAgICAgIGNvbnN0IGRvdWJsZSBhYnNwcm9kID0gZG91YmxlcHJvZCA+PSAwLjAgPyBkb3VibGVwcm9kIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1kb3VibGVwcm9kOworICAgICAgICAvKiBhYnNkaWZmL2Fic3Byb2QgPD0gMS8zMiBpZmYKKyAgICAgICAgICAgMzIgKiBhYnNkaWZmIDw9IGFic3Byb2QgLS0gNSBnb29kIGJpdHMgaXMgImNsb3NlIGVub3VnaCIgKi8KKyAgICAgICAgaWYgKDMyLjAgKiBhYnNkaWZmIDw9IGFic3Byb2QpCisgICAgICAgICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcobG9uZ3Byb2QpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gUHlMb25nX1R5cGUudHBfYXNfbnVtYmVyLT5uYl9tdWx0aXBseSh2LCB3KTsKKyAgICB9CiB9CiAKIC8qIEludGVnZXIgb3ZlcmZsb3cgY2hlY2tpbmcgZm9yIHVuYXJ5IG5lZ2F0aW9uOiBvbiBhIDIncy1jb21wbGVtZW50CkBAIC01NTksNDAyICs1NTksNDAyIEBACiAgKiB3YXJuIGFib3V0IGFwcGx5aW5nIHVuYXJ5IG1pbnVzIHRvIGFuIHVuc2lnbmVkIG9wZXJhbmQuICBIZW5jZSB0aGUKICAqIHdlaXJkICIwLSIuCiAgKi8KLSNkZWZpbmUgVU5BUllfTkVHX1dPVUxEX09WRVJGTE9XKHgpCVwKLQkoKHgpIDwgMCAmJiAodW5zaWduZWQgbG9uZykoeCkgPT0gMC0odW5zaWduZWQgbG9uZykoeCkpCisjZGVmaW5lIFVOQVJZX05FR19XT1VMRF9PVkVSRkxPVyh4KSAgICAgXAorICAgICgoeCkgPCAwICYmICh1bnNpZ25lZCBsb25nKSh4KSA9PSAwLSh1bnNpZ25lZCBsb25nKSh4KSkKIAogLyogUmV0dXJuIHR5cGUgb2YgaV9kaXZtb2QgKi8KIGVudW0gZGl2bW9kX3Jlc3VsdCB7Ci0JRElWTU9EX09LLAkJLyogQ29ycmVjdCByZXN1bHQgKi8KLQlESVZNT0RfT1ZFUkZMT1csCS8qIE92ZXJmbG93LCB0cnkgYWdhaW4gdXNpbmcgbG9uZ3MgKi8KLQlESVZNT0RfRVJST1IJCS8qIEV4Y2VwdGlvbiByYWlzZWQgKi8KKyAgICBESVZNT0RfT0ssICAgICAgICAgICAgICAgICAgLyogQ29ycmVjdCByZXN1bHQgKi8KKyAgICBESVZNT0RfT1ZFUkZMT1csICAgICAgICAgICAgLyogT3ZlcmZsb3csIHRyeSBhZ2FpbiB1c2luZyBsb25ncyAqLworICAgIERJVk1PRF9FUlJPUiAgICAgICAgICAgICAgICAvKiBFeGNlcHRpb24gcmFpc2VkICovCiB9OwogCiBzdGF0aWMgZW51bSBkaXZtb2RfcmVzdWx0CiBpX2Rpdm1vZChyZWdpc3RlciBsb25nIHgsIHJlZ2lzdGVyIGxvbmcgeSwKICAgICAgICAgIGxvbmcgKnBfeGRpdnksIGxvbmcgKnBfeG1vZHkpCiB7Ci0JbG9uZyB4ZGl2eSwgeG1vZHk7CisgICAgbG9uZyB4ZGl2eSwgeG1vZHk7CiAKLQlpZiAoeSA9PSAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19aZXJvRGl2aXNpb25FcnJvciwKLQkJCQkiaW50ZWdlciBkaXZpc2lvbiBvciBtb2R1bG8gYnkgemVybyIpOwotCQlyZXR1cm4gRElWTU9EX0VSUk9SOwotCX0KLQkvKiAoLXN5cy5tYXhpbnQtMSkvLTEgaXMgdGhlIG9ubHkgb3ZlcmZsb3cgY2FzZS4gKi8KLQlpZiAoeSA9PSAtMSAmJiBVTkFSWV9ORUdfV09VTERfT1ZFUkZMT1coeCkpCi0JCXJldHVybiBESVZNT0RfT1ZFUkZMT1c7Ci0JeGRpdnkgPSB4IC8geTsKLQkvKiB4ZGl2KnkgY2FuIG92ZXJmbG93IG9uIHBsYXRmb3JtcyB3aGVyZSB4L3kgZ2l2ZXMgZmxvb3IoeC95KQotCSAqIGZvciB4IGFuZCB5IHdpdGggZGlmZmVyaW5nIHNpZ25zLiAoVGhpcyBpcyB1bnVzdWFsCi0JICogYmVoYXZpb3VyLCBhbmQgQzk5IHByb2hpYml0cyBpdCwgYnV0IGl0J3MgYWxsb3dlZCBieSBDODk7Ci0JICogZm9yIGFuIGV4YW1wbGUgb2Ygb3ZlcmZsb3csIHRha2UgeCA9IExPTkdfTUlOLCB5ID0gNSBvciB4ID0KLQkgKiBMT05HX01BWCwgeSA9IC01LikgIEhvd2V2ZXIsIHggLSB4ZGl2eSp5IGlzIGFsd2F5cwotCSAqIHJlcHJlc2VudGFibGUgYXMgYSBsb25nLCBzaW5jZSBpdCBsaWVzIHN0cmljdGx5IGJldHdlZW4KLQkgKiAtYWJzKHkpIGFuZCBhYnMoeSkuICBXZSBhZGQgY2FzdHMgdG8gYXZvaWQgaW50ZXJtZWRpYXRlCi0JICogb3ZlcmZsb3cuCi0JICovCi0JeG1vZHkgPSAobG9uZykoeCAtICh1bnNpZ25lZCBsb25nKXhkaXZ5ICogeSk7Ci0JLyogSWYgdGhlIHNpZ25zIG9mIHggYW5kIHkgZGlmZmVyLCBhbmQgdGhlIHJlbWFpbmRlciBpcyBub24tMCwKLQkgKiBDODkgZG9lc24ndCBkZWZpbmUgd2hldGhlciB4ZGl2eSBpcyBub3cgdGhlIGZsb29yIG9yIHRoZQotCSAqIGNlaWxpbmcgb2YgdGhlIGluZmluaXRlbHkgcHJlY2lzZSBxdW90aWVudC4gIFdlIHdhbnQgdGhlIGZsb29yLAotCSAqIGFuZCB3ZSBoYXZlIGl0IGlmZiB0aGUgcmVtYWluZGVyJ3Mgc2lnbiBtYXRjaGVzIHkncy4KLQkgKi8KLQlpZiAoeG1vZHkgJiYgKCh5IF4geG1vZHkpIDwgMCkgLyogaS5lLiBhbmQgc2lnbnMgZGlmZmVyICovKSB7Ci0JCXhtb2R5ICs9IHk7Ci0JCS0teGRpdnk7Ci0JCWFzc2VydCh4bW9keSAmJiAoKHkgXiB4bW9keSkgPj0gMCkpOwotCX0KLQkqcF94ZGl2eSA9IHhkaXZ5OwotCSpwX3htb2R5ID0geG1vZHk7Ci0JcmV0dXJuIERJVk1PRF9PSzsKKyAgICBpZiAoeSA9PSAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19aZXJvRGl2aXNpb25FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJpbnRlZ2VyIGRpdmlzaW9uIG9yIG1vZHVsbyBieSB6ZXJvIik7CisgICAgICAgIHJldHVybiBESVZNT0RfRVJST1I7CisgICAgfQorICAgIC8qICgtc3lzLm1heGludC0xKS8tMSBpcyB0aGUgb25seSBvdmVyZmxvdyBjYXNlLiAqLworICAgIGlmICh5ID09IC0xICYmIFVOQVJZX05FR19XT1VMRF9PVkVSRkxPVyh4KSkKKyAgICAgICAgcmV0dXJuIERJVk1PRF9PVkVSRkxPVzsKKyAgICB4ZGl2eSA9IHggLyB5OworICAgIC8qIHhkaXYqeSBjYW4gb3ZlcmZsb3cgb24gcGxhdGZvcm1zIHdoZXJlIHgveSBnaXZlcyBmbG9vcih4L3kpCisgICAgICogZm9yIHggYW5kIHkgd2l0aCBkaWZmZXJpbmcgc2lnbnMuIChUaGlzIGlzIHVudXN1YWwKKyAgICAgKiBiZWhhdmlvdXIsIGFuZCBDOTkgcHJvaGliaXRzIGl0LCBidXQgaXQncyBhbGxvd2VkIGJ5IEM4OTsKKyAgICAgKiBmb3IgYW4gZXhhbXBsZSBvZiBvdmVyZmxvdywgdGFrZSB4ID0gTE9OR19NSU4sIHkgPSA1IG9yIHggPQorICAgICAqIExPTkdfTUFYLCB5ID0gLTUuKSAgSG93ZXZlciwgeCAtIHhkaXZ5KnkgaXMgYWx3YXlzCisgICAgICogcmVwcmVzZW50YWJsZSBhcyBhIGxvbmcsIHNpbmNlIGl0IGxpZXMgc3RyaWN0bHkgYmV0d2VlbgorICAgICAqIC1hYnMoeSkgYW5kIGFicyh5KS4gIFdlIGFkZCBjYXN0cyB0byBhdm9pZCBpbnRlcm1lZGlhdGUKKyAgICAgKiBvdmVyZmxvdy4KKyAgICAgKi8KKyAgICB4bW9keSA9IChsb25nKSh4IC0gKHVuc2lnbmVkIGxvbmcpeGRpdnkgKiB5KTsKKyAgICAvKiBJZiB0aGUgc2lnbnMgb2YgeCBhbmQgeSBkaWZmZXIsIGFuZCB0aGUgcmVtYWluZGVyIGlzIG5vbi0wLAorICAgICAqIEM4OSBkb2Vzbid0IGRlZmluZSB3aGV0aGVyIHhkaXZ5IGlzIG5vdyB0aGUgZmxvb3Igb3IgdGhlCisgICAgICogY2VpbGluZyBvZiB0aGUgaW5maW5pdGVseSBwcmVjaXNlIHF1b3RpZW50LiAgV2Ugd2FudCB0aGUgZmxvb3IsCisgICAgICogYW5kIHdlIGhhdmUgaXQgaWZmIHRoZSByZW1haW5kZXIncyBzaWduIG1hdGNoZXMgeSdzLgorICAgICAqLworICAgIGlmICh4bW9keSAmJiAoKHkgXiB4bW9keSkgPCAwKSAvKiBpLmUuIGFuZCBzaWducyBkaWZmZXIgKi8pIHsKKyAgICAgICAgeG1vZHkgKz0geTsKKyAgICAgICAgLS14ZGl2eTsKKyAgICAgICAgYXNzZXJ0KHhtb2R5ICYmICgoeSBeIHhtb2R5KSA+PSAwKSk7CisgICAgfQorICAgICpwX3hkaXZ5ID0geGRpdnk7CisgICAgKnBfeG1vZHkgPSB4bW9keTsKKyAgICByZXR1cm4gRElWTU9EX09LOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaW50X2RpdihQeUludE9iamVjdCAqeCwgUHlJbnRPYmplY3QgKnkpCiB7Ci0JbG9uZyB4aSwgeWk7Ci0JbG9uZyBkLCBtOwotCUNPTlZFUlRfVE9fTE9ORyh4LCB4aSk7Ci0JQ09OVkVSVF9UT19MT05HKHksIHlpKTsKLQlzd2l0Y2ggKGlfZGl2bW9kKHhpLCB5aSwgJmQsICZtKSkgewotCWNhc2UgRElWTU9EX09LOgotCQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoZCk7Ci0JY2FzZSBESVZNT0RfT1ZFUkZMT1c6Ci0JCXJldHVybiBQeUxvbmdfVHlwZS50cF9hc19udW1iZXItPm5iX2RpdmlkZSgoUHlPYmplY3QgKil4LAotCQkJCQkJCSAgIChQeU9iamVjdCAqKXkpOwotCWRlZmF1bHQ6Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBsb25nIHhpLCB5aTsKKyAgICBsb25nIGQsIG07CisgICAgQ09OVkVSVF9UT19MT05HKHgsIHhpKTsKKyAgICBDT05WRVJUX1RPX0xPTkcoeSwgeWkpOworICAgIHN3aXRjaCAoaV9kaXZtb2QoeGksIHlpLCAmZCwgJm0pKSB7CisgICAgY2FzZSBESVZNT0RfT0s6CisgICAgICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhkKTsKKyAgICBjYXNlIERJVk1PRF9PVkVSRkxPVzoKKyAgICAgICAgcmV0dXJuIFB5TG9uZ19UeXBlLnRwX2FzX251bWJlci0+bmJfZGl2aWRlKChQeU9iamVjdCAqKXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUHlPYmplY3QgKil5KTsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbnRfY2xhc3NpY19kaXYoUHlJbnRPYmplY3QgKngsIFB5SW50T2JqZWN0ICp5KQogewotCWxvbmcgeGksIHlpOwotCWxvbmcgZCwgbTsKLQlDT05WRVJUX1RPX0xPTkcoeCwgeGkpOwotCUNPTlZFUlRfVE9fTE9ORyh5LCB5aSk7Ci0JaWYgKFB5X0RpdmlzaW9uV2FybmluZ0ZsYWcgJiYKLQkgICAgUHlFcnJfV2FybihQeUV4Y19EZXByZWNhdGlvbldhcm5pbmcsICJjbGFzc2ljIGludCBkaXZpc2lvbiIpIDwgMCkKLQkJcmV0dXJuIE5VTEw7Ci0Jc3dpdGNoIChpX2Rpdm1vZCh4aSwgeWksICZkLCAmbSkpIHsKLQljYXNlIERJVk1PRF9PSzoKLQkJcmV0dXJuIFB5SW50X0Zyb21Mb25nKGQpOwotCWNhc2UgRElWTU9EX09WRVJGTE9XOgotCQlyZXR1cm4gUHlMb25nX1R5cGUudHBfYXNfbnVtYmVyLT5uYl9kaXZpZGUoKFB5T2JqZWN0ICopeCwKLQkJCQkJCQkgICAoUHlPYmplY3QgKil5KTsKLQlkZWZhdWx0OgotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgbG9uZyB4aSwgeWk7CisgICAgbG9uZyBkLCBtOworICAgIENPTlZFUlRfVE9fTE9ORyh4LCB4aSk7CisgICAgQ09OVkVSVF9UT19MT05HKHksIHlpKTsKKyAgICBpZiAoUHlfRGl2aXNpb25XYXJuaW5nRmxhZyAmJgorICAgICAgICBQeUVycl9XYXJuKFB5RXhjX0RlcHJlY2F0aW9uV2FybmluZywgImNsYXNzaWMgaW50IGRpdmlzaW9uIikgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBzd2l0Y2ggKGlfZGl2bW9kKHhpLCB5aSwgJmQsICZtKSkgeworICAgIGNhc2UgRElWTU9EX09LOgorICAgICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoZCk7CisgICAgY2FzZSBESVZNT0RfT1ZFUkZMT1c6CisgICAgICAgIHJldHVybiBQeUxvbmdfVHlwZS50cF9hc19udW1iZXItPm5iX2RpdmlkZSgoUHlPYmplY3QgKil4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFB5T2JqZWN0ICopeSk7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaW50X3RydWVfZGl2aWRlKFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdykKIHsKLQkvKiBJZiB0aGV5IGFyZW4ndCBib3RoIGludHMsIGdpdmUgc29tZW9uZSBlbHNlIGEgY2hhbmNlLiAgSW4KLQkgICBwYXJ0aWN1bGFyLCB0aGlzIGxldHMgaW50L2xvbmcgZ2V0IGhhbmRsZWQgYnkgbG9uZ3MsIHdoaWNoCi0JICAgdW5kZXJmbG93cyB0byAwIGdyYWNlZnVsbHkgaWYgdGhlIGxvbmcgaXMgdG9vIGJpZyB0byBjb252ZXJ0Ci0JICAgdG8gZmxvYXQuICovCi0JaWYgKFB5SW50X0NoZWNrKHYpICYmIFB5SW50X0NoZWNrKHcpKQotCQlyZXR1cm4gUHlGbG9hdF9UeXBlLnRwX2FzX251bWJlci0+bmJfdHJ1ZV9kaXZpZGUodiwgdyk7Ci0JUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKLQlyZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7CisgICAgLyogSWYgdGhleSBhcmVuJ3QgYm90aCBpbnRzLCBnaXZlIHNvbWVvbmUgZWxzZSBhIGNoYW5jZS4gIEluCisgICAgICAgcGFydGljdWxhciwgdGhpcyBsZXRzIGludC9sb25nIGdldCBoYW5kbGVkIGJ5IGxvbmdzLCB3aGljaAorICAgICAgIHVuZGVyZmxvd3MgdG8gMCBncmFjZWZ1bGx5IGlmIHRoZSBsb25nIGlzIHRvbyBiaWcgdG8gY29udmVydAorICAgICAgIHRvIGZsb2F0LiAqLworICAgIGlmIChQeUludF9DaGVjayh2KSAmJiBQeUludF9DaGVjayh3KSkKKyAgICAgICAgcmV0dXJuIFB5RmxvYXRfVHlwZS50cF9hc19udW1iZXItPm5iX3RydWVfZGl2aWRlKHYsIHcpOworICAgIFB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7CisgICAgcmV0dXJuIFB5X05vdEltcGxlbWVudGVkOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaW50X21vZChQeUludE9iamVjdCAqeCwgUHlJbnRPYmplY3QgKnkpCiB7Ci0JbG9uZyB4aSwgeWk7Ci0JbG9uZyBkLCBtOwotCUNPTlZFUlRfVE9fTE9ORyh4LCB4aSk7Ci0JQ09OVkVSVF9UT19MT05HKHksIHlpKTsKLQlzd2l0Y2ggKGlfZGl2bW9kKHhpLCB5aSwgJmQsICZtKSkgewotCWNhc2UgRElWTU9EX09LOgotCQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcobSk7Ci0JY2FzZSBESVZNT0RfT1ZFUkZMT1c6Ci0JCXJldHVybiBQeUxvbmdfVHlwZS50cF9hc19udW1iZXItPm5iX3JlbWFpbmRlcigoUHlPYmplY3QgKil4LAotCQkJCQkJCSAgICAgIChQeU9iamVjdCAqKXkpOwotCWRlZmF1bHQ6Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBsb25nIHhpLCB5aTsKKyAgICBsb25nIGQsIG07CisgICAgQ09OVkVSVF9UT19MT05HKHgsIHhpKTsKKyAgICBDT05WRVJUX1RPX0xPTkcoeSwgeWkpOworICAgIHN3aXRjaCAoaV9kaXZtb2QoeGksIHlpLCAmZCwgJm0pKSB7CisgICAgY2FzZSBESVZNT0RfT0s6CisgICAgICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhtKTsKKyAgICBjYXNlIERJVk1PRF9PVkVSRkxPVzoKKyAgICAgICAgcmV0dXJuIFB5TG9uZ19UeXBlLnRwX2FzX251bWJlci0+bmJfcmVtYWluZGVyKChQeU9iamVjdCAqKXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUHlPYmplY3QgKil5KTsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbnRfZGl2bW9kKFB5SW50T2JqZWN0ICp4LCBQeUludE9iamVjdCAqeSkKIHsKLQlsb25nIHhpLCB5aTsKLQlsb25nIGQsIG07Ci0JQ09OVkVSVF9UT19MT05HKHgsIHhpKTsKLQlDT05WRVJUX1RPX0xPTkcoeSwgeWkpOwotCXN3aXRjaCAoaV9kaXZtb2QoeGksIHlpLCAmZCwgJm0pKSB7Ci0JY2FzZSBESVZNT0RfT0s6Ci0JCXJldHVybiBQeV9CdWlsZFZhbHVlKCIobGwpIiwgZCwgbSk7Ci0JY2FzZSBESVZNT0RfT1ZFUkZMT1c6Ci0JCXJldHVybiBQeUxvbmdfVHlwZS50cF9hc19udW1iZXItPm5iX2Rpdm1vZCgoUHlPYmplY3QgKil4LAotCQkJCQkJCSAgIChQeU9iamVjdCAqKXkpOwotCWRlZmF1bHQ6Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBsb25nIHhpLCB5aTsKKyAgICBsb25nIGQsIG07CisgICAgQ09OVkVSVF9UT19MT05HKHgsIHhpKTsKKyAgICBDT05WRVJUX1RPX0xPTkcoeSwgeWkpOworICAgIHN3aXRjaCAoaV9kaXZtb2QoeGksIHlpLCAmZCwgJm0pKSB7CisgICAgY2FzZSBESVZNT0RfT0s6CisgICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIobGwpIiwgZCwgbSk7CisgICAgY2FzZSBESVZNT0RfT1ZFUkZMT1c6CisgICAgICAgIHJldHVybiBQeUxvbmdfVHlwZS50cF9hc19udW1iZXItPm5iX2Rpdm1vZCgoUHlPYmplY3QgKil4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFB5T2JqZWN0ICopeSk7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaW50X3BvdyhQeUludE9iamVjdCAqdiwgUHlJbnRPYmplY3QgKncsIFB5SW50T2JqZWN0ICp6KQogewotCXJlZ2lzdGVyIGxvbmcgaXYsIGl3LCBpej0wLCBpeCwgdGVtcCwgcHJldjsKLQlDT05WRVJUX1RPX0xPTkcodiwgaXYpOwotCUNPTlZFUlRfVE9fTE9ORyh3LCBpdyk7Ci0JaWYgKGl3IDwgMCkgewotCQlpZiAoKFB5T2JqZWN0ICopeiAhPSBQeV9Ob25lKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAicG93KCkgMm5kIGFyZ3VtZW50ICIKLQkJCSAgICAgImNhbm5vdCBiZSBuZWdhdGl2ZSB3aGVuIDNyZCBhcmd1bWVudCBzcGVjaWZpZWQiKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCS8qIFJldHVybiBhIGZsb2F0LiAgVGhpcyB3b3JrcyBiZWNhdXNlIHdlIGtub3cgdGhhdAotCQkgICB0aGlzIGNhbGxzIGZsb2F0X3BvdygpIHdoaWNoIGNvbnZlcnRzIGl0cwotCQkgICBhcmd1bWVudHMgdG8gZG91YmxlLiAqLwotCQlyZXR1cm4gUHlGbG9hdF9UeXBlLnRwX2FzX251bWJlci0+bmJfcG93ZXIoCi0JCQkoUHlPYmplY3QgKil2LCAoUHlPYmplY3QgKil3LCAoUHlPYmplY3QgKil6KTsKLQl9Ci0gCWlmICgoUHlPYmplY3QgKil6ICE9IFB5X05vbmUpIHsKLQkJQ09OVkVSVF9UT19MT05HKHosIGl6KTsKLQkJaWYgKGl6ID09IDApIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCQkicG93KCkgM3JkIGFyZ3VtZW50IGNhbm5vdCBiZSAwIik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KLQkvKgotCSAqIFhYWDogVGhlIG9yaWdpbmFsIGV4cG9uZW50aWF0aW9uIGNvZGUgc3RvcHBlZCBsb29waW5nCi0JICogd2hlbiB0ZW1wIGhpdCB6ZXJvOyB0aGlzIGNvZGUgd2lsbCBjb250aW51ZSBvbndhcmRzCi0JICogdW5uZWNlc3NhcmlseSwgYnV0IGF0IGxlYXN0IGl0IHdvbid0IGNhdXNlIGFueSBlcnJvcnMuCi0JICogSG9wZWZ1bGx5IHRoZSBzcGVlZCBpbXByb3ZlbWVudCBmcm9tIHRoZSBmYXN0IGV4cG9uZW50aWF0aW9uCi0JICogd2lsbCBjb21wZW5zYXRlIGZvciB0aGUgc2xpZ2h0IGluZWZmaWNpZW5jeS4KLQkgKiBYWFg6IEJldHRlciBoYW5kbGluZyBvZiBvdmVyZmxvd3MgaXMgZGVzcGVyYXRlbHkgbmVlZGVkLgotCSAqLwotIAl0ZW1wID0gaXY7Ci0JaXggPSAxOwotCXdoaWxlIChpdyA+IDApIHsKLQkgCXByZXYgPSBpeDsJLyogU2F2ZSB2YWx1ZSBmb3Igb3ZlcmZsb3cgY2hlY2sgKi8KLQkgCWlmIChpdyAmIDEpIHsKLQkJIAlpeCA9IGl4KnRlbXA7Ci0JCQlpZiAodGVtcCA9PSAwKQotCQkJCWJyZWFrOyAvKiBBdm9pZCBpeCAvIDAgKi8KLQkJCWlmIChpeCAvIHRlbXAgIT0gcHJldikgewotCQkJCXJldHVybiBQeUxvbmdfVHlwZS50cF9hc19udW1iZXItPm5iX3Bvd2VyKAotCQkJCQkoUHlPYmplY3QgKil2LAotCQkJCQkoUHlPYmplY3QgKil3LAotCQkJCQkoUHlPYmplY3QgKil6KTsKLQkJCX0KLQkJfQotCSAJaXcgPj49IDE7CS8qIFNoaWZ0IGV4cG9uZW50IGRvd24gYnkgMSBiaXQgKi8KLQkgICAgICAgIGlmIChpdz09MCkgYnJlYWs7Ci0JIAlwcmV2ID0gdGVtcDsKLQkgCXRlbXAgKj0gdGVtcDsJLyogU3F1YXJlIHRoZSB2YWx1ZSBvZiB0ZW1wICovCi0JIAlpZiAocHJldiAhPSAwICYmIHRlbXAgLyBwcmV2ICE9IHByZXYpIHsKLQkJCXJldHVybiBQeUxvbmdfVHlwZS50cF9hc19udW1iZXItPm5iX3Bvd2VyKAotCQkJCShQeU9iamVjdCAqKXYsIChQeU9iamVjdCAqKXcsIChQeU9iamVjdCAqKXopOwotCQl9Ci0JIAlpZiAoaXopIHsKLQkJCS8qIElmIHdlIGRpZCBhIG11bHRpcGxpY2F0aW9uLCBwZXJmb3JtIGEgbW9kdWxvICovCi0JCSAJaXggPSBpeCAlIGl6OwotCQkgCXRlbXAgPSB0ZW1wICUgaXo7Ci0JCX0KLQl9Ci0JaWYgKGl6KSB7Ci0JIAlsb25nIGRpdiwgbW9kOwotCQlzd2l0Y2ggKGlfZGl2bW9kKGl4LCBpeiwgJmRpdiwgJm1vZCkpIHsKLQkJY2FzZSBESVZNT0RfT0s6Ci0JCQlpeCA9IG1vZDsKLQkJCWJyZWFrOwotCQljYXNlIERJVk1PRF9PVkVSRkxPVzoKLQkJCXJldHVybiBQeUxvbmdfVHlwZS50cF9hc19udW1iZXItPm5iX3Bvd2VyKAotCQkJCShQeU9iamVjdCAqKXYsIChQeU9iamVjdCAqKXcsIChQeU9iamVjdCAqKXopOwotCQlkZWZhdWx0OgotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKGl4KTsKKyAgICByZWdpc3RlciBsb25nIGl2LCBpdywgaXo9MCwgaXgsIHRlbXAsIHByZXY7CisgICAgQ09OVkVSVF9UT19MT05HKHYsIGl2KTsKKyAgICBDT05WRVJUX1RPX0xPTkcodywgaXcpOworICAgIGlmIChpdyA8IDApIHsKKyAgICAgICAgaWYgKChQeU9iamVjdCAqKXogIT0gUHlfTm9uZSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgInBvdygpIDJuZCBhcmd1bWVudCAiCisgICAgICAgICAgICAgICAgICJjYW5ub3QgYmUgbmVnYXRpdmUgd2hlbiAzcmQgYXJndW1lbnQgc3BlY2lmaWVkIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICAvKiBSZXR1cm4gYSBmbG9hdC4gIFRoaXMgd29ya3MgYmVjYXVzZSB3ZSBrbm93IHRoYXQKKyAgICAgICAgICAgdGhpcyBjYWxscyBmbG9hdF9wb3coKSB3aGljaCBjb252ZXJ0cyBpdHMKKyAgICAgICAgICAgYXJndW1lbnRzIHRvIGRvdWJsZS4gKi8KKyAgICAgICAgcmV0dXJuIFB5RmxvYXRfVHlwZS50cF9hc19udW1iZXItPm5iX3Bvd2VyKAorICAgICAgICAgICAgKFB5T2JqZWN0ICopdiwgKFB5T2JqZWN0ICopdywgKFB5T2JqZWN0ICopeik7CisgICAgfQorICAgIGlmICgoUHlPYmplY3QgKil6ICE9IFB5X05vbmUpIHsKKyAgICAgICAgQ09OVkVSVF9UT19MT05HKHosIGl6KTsKKyAgICAgICAgaWYgKGl6ID09IDApIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3coKSAzcmQgYXJndW1lbnQgY2Fubm90IGJlIDAiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorICAgIC8qCisgICAgICogWFhYOiBUaGUgb3JpZ2luYWwgZXhwb25lbnRpYXRpb24gY29kZSBzdG9wcGVkIGxvb3BpbmcKKyAgICAgKiB3aGVuIHRlbXAgaGl0IHplcm87IHRoaXMgY29kZSB3aWxsIGNvbnRpbnVlIG9ud2FyZHMKKyAgICAgKiB1bm5lY2Vzc2FyaWx5LCBidXQgYXQgbGVhc3QgaXQgd29uJ3QgY2F1c2UgYW55IGVycm9ycy4KKyAgICAgKiBIb3BlZnVsbHkgdGhlIHNwZWVkIGltcHJvdmVtZW50IGZyb20gdGhlIGZhc3QgZXhwb25lbnRpYXRpb24KKyAgICAgKiB3aWxsIGNvbXBlbnNhdGUgZm9yIHRoZSBzbGlnaHQgaW5lZmZpY2llbmN5LgorICAgICAqIFhYWDogQmV0dGVyIGhhbmRsaW5nIG9mIG92ZXJmbG93cyBpcyBkZXNwZXJhdGVseSBuZWVkZWQuCisgICAgICovCisgICAgdGVtcCA9IGl2OworICAgIGl4ID0gMTsKKyAgICB3aGlsZSAoaXcgPiAwKSB7CisgICAgICAgIHByZXYgPSBpeDsgICAgICAgICAgICAgIC8qIFNhdmUgdmFsdWUgZm9yIG92ZXJmbG93IGNoZWNrICovCisgICAgICAgIGlmIChpdyAmIDEpIHsKKyAgICAgICAgICAgIGl4ID0gaXgqdGVtcDsKKyAgICAgICAgICAgIGlmICh0ZW1wID09IDApCisgICAgICAgICAgICAgICAgYnJlYWs7IC8qIEF2b2lkIGl4IC8gMCAqLworICAgICAgICAgICAgaWYgKGl4IC8gdGVtcCAhPSBwcmV2KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFB5TG9uZ19UeXBlLnRwX2FzX251bWJlci0+bmJfcG93ZXIoCisgICAgICAgICAgICAgICAgICAgIChQeU9iamVjdCAqKXYsCisgICAgICAgICAgICAgICAgICAgIChQeU9iamVjdCAqKXcsCisgICAgICAgICAgICAgICAgICAgIChQeU9iamVjdCAqKXopOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGl3ID4+PSAxOyAgICAgICAgICAgICAgIC8qIFNoaWZ0IGV4cG9uZW50IGRvd24gYnkgMSBiaXQgKi8KKyAgICAgICAgaWYgKGl3PT0wKSBicmVhazsKKyAgICAgICAgcHJldiA9IHRlbXA7CisgICAgICAgIHRlbXAgKj0gdGVtcDsgICAgICAgICAgIC8qIFNxdWFyZSB0aGUgdmFsdWUgb2YgdGVtcCAqLworICAgICAgICBpZiAocHJldiAhPSAwICYmIHRlbXAgLyBwcmV2ICE9IHByZXYpIHsKKyAgICAgICAgICAgIHJldHVybiBQeUxvbmdfVHlwZS50cF9hc19udW1iZXItPm5iX3Bvd2VyKAorICAgICAgICAgICAgICAgIChQeU9iamVjdCAqKXYsIChQeU9iamVjdCAqKXcsIChQeU9iamVjdCAqKXopOworICAgICAgICB9CisgICAgICAgIGlmIChpeikgeworICAgICAgICAgICAgLyogSWYgd2UgZGlkIGEgbXVsdGlwbGljYXRpb24sIHBlcmZvcm0gYSBtb2R1bG8gKi8KKyAgICAgICAgICAgIGl4ID0gaXggJSBpejsKKyAgICAgICAgICAgIHRlbXAgPSB0ZW1wICUgaXo7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGl6KSB7CisgICAgICAgIGxvbmcgZGl2LCBtb2Q7CisgICAgICAgIHN3aXRjaCAoaV9kaXZtb2QoaXgsIGl6LCAmZGl2LCAmbW9kKSkgeworICAgICAgICBjYXNlIERJVk1PRF9PSzoKKyAgICAgICAgICAgIGl4ID0gbW9kOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRElWTU9EX09WRVJGTE9XOgorICAgICAgICAgICAgcmV0dXJuIFB5TG9uZ19UeXBlLnRwX2FzX251bWJlci0+bmJfcG93ZXIoCisgICAgICAgICAgICAgICAgKFB5T2JqZWN0ICopdiwgKFB5T2JqZWN0ICopdywgKFB5T2JqZWN0ICopeik7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoaXgpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaW50X25lZyhQeUludE9iamVjdCAqdikKIHsKLQlyZWdpc3RlciBsb25nIGE7Ci0JYSA9IHYtPm9iX2l2YWw7Ci0gICAgICAgIC8qIGNoZWNrIGZvciBvdmVyZmxvdyAqLwotCWlmIChVTkFSWV9ORUdfV09VTERfT1ZFUkZMT1coYSkpIHsKLQkJUHlPYmplY3QgKm8gPSBQeUxvbmdfRnJvbUxvbmcoYSk7Ci0JCWlmIChvICE9IE5VTEwpIHsKLQkJCVB5T2JqZWN0ICpyZXN1bHQgPSBQeU51bWJlcl9OZWdhdGl2ZShvKTsKLQkJCVB5X0RFQ1JFRihvKTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBQeUludF9Gcm9tTG9uZygtYSk7CisgICAgcmVnaXN0ZXIgbG9uZyBhOworICAgIGEgPSB2LT5vYl9pdmFsOworICAgIC8qIGNoZWNrIGZvciBvdmVyZmxvdyAqLworICAgIGlmIChVTkFSWV9ORUdfV09VTERfT1ZFUkZMT1coYSkpIHsKKyAgICAgICAgUHlPYmplY3QgKm8gPSBQeUxvbmdfRnJvbUxvbmcoYSk7CisgICAgICAgIGlmIChvICE9IE5VTEwpIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBQeU51bWJlcl9OZWdhdGl2ZShvKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihvKTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygtYSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbnRfYWJzKFB5SW50T2JqZWN0ICp2KQogewotCWlmICh2LT5vYl9pdmFsID49IDApCi0JCXJldHVybiBpbnRfaW50KHYpOwotCWVsc2UKLQkJcmV0dXJuIGludF9uZWcodik7CisgICAgaWYgKHYtPm9iX2l2YWwgPj0gMCkKKyAgICAgICAgcmV0dXJuIGludF9pbnQodik7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gaW50X25lZyh2KTsKIH0KIAogc3RhdGljIGludAogaW50X25vbnplcm8oUHlJbnRPYmplY3QgKnYpCiB7Ci0JcmV0dXJuIHYtPm9iX2l2YWwgIT0gMDsKKyAgICByZXR1cm4gdi0+b2JfaXZhbCAhPSAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaW50X2ludmVydChQeUludE9iamVjdCAqdikKIHsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcofnYtPm9iX2l2YWwpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyh+di0+b2JfaXZhbCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbnRfbHNoaWZ0KFB5SW50T2JqZWN0ICp2LCBQeUludE9iamVjdCAqdykKIHsKLQlsb25nIGEsIGIsIGM7Ci0JUHlPYmplY3QgKnZ2LCAqd3csICpyZXN1bHQ7CisgICAgbG9uZyBhLCBiLCBjOworICAgIFB5T2JqZWN0ICp2diwgKnd3LCAqcmVzdWx0OwogCi0JQ09OVkVSVF9UT19MT05HKHYsIGEpOwotCUNPTlZFUlRfVE9fTE9ORyh3LCBiKTsKLQlpZiAoYiA8IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJuZWdhdGl2ZSBzaGlmdCBjb3VudCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKGEgPT0gMCB8fCBiID09IDApCi0JCXJldHVybiBpbnRfaW50KHYpOwotCWlmIChiID49IExPTkdfQklUKSB7Ci0JCXZ2ID0gUHlMb25nX0Zyb21Mb25nKFB5SW50X0FTX0xPTkcodikpOwotCQlpZiAodnYgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQl3dyA9IFB5TG9uZ19Gcm9tTG9uZyhQeUludF9BU19MT05HKHcpKTsKLQkJaWYgKHd3ID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRih2dik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlyZXN1bHQgPSBQeU51bWJlcl9Mc2hpZnQodnYsIHd3KTsKLQkJUHlfREVDUkVGKHZ2KTsKLQkJUHlfREVDUkVGKHd3KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JYyA9IGEgPDwgYjsKLQlpZiAoYSAhPSBQeV9BUklUSE1FVElDX1JJR0hUX1NISUZUKGxvbmcsIGMsIGIpKSB7Ci0JCXZ2ID0gUHlMb25nX0Zyb21Mb25nKFB5SW50X0FTX0xPTkcodikpOwotCQlpZiAodnYgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQl3dyA9IFB5TG9uZ19Gcm9tTG9uZyhQeUludF9BU19MT05HKHcpKTsKLQkJaWYgKHd3ID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRih2dik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlyZXN1bHQgPSBQeU51bWJlcl9Mc2hpZnQodnYsIHd3KTsKLQkJUHlfREVDUkVGKHZ2KTsKLQkJUHlfREVDUkVGKHd3KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKGMpOworICAgIENPTlZFUlRfVE9fTE9ORyh2LCBhKTsKKyAgICBDT05WRVJUX1RPX0xPTkcodywgYik7CisgICAgaWYgKGIgPCAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAibmVnYXRpdmUgc2hpZnQgY291bnQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChhID09IDAgfHwgYiA9PSAwKQorICAgICAgICByZXR1cm4gaW50X2ludCh2KTsKKyAgICBpZiAoYiA+PSBMT05HX0JJVCkgeworICAgICAgICB2diA9IFB5TG9uZ19Gcm9tTG9uZyhQeUludF9BU19MT05HKHYpKTsKKyAgICAgICAgaWYgKHZ2ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgd3cgPSBQeUxvbmdfRnJvbUxvbmcoUHlJbnRfQVNfTE9ORyh3KSk7CisgICAgICAgIGlmICh3dyA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYodnYpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0ID0gUHlOdW1iZXJfTHNoaWZ0KHZ2LCB3dyk7CisgICAgICAgIFB5X0RFQ1JFRih2dik7CisgICAgICAgIFB5X0RFQ1JFRih3dyk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIGMgPSBhIDw8IGI7CisgICAgaWYgKGEgIT0gUHlfQVJJVEhNRVRJQ19SSUdIVF9TSElGVChsb25nLCBjLCBiKSkgeworICAgICAgICB2diA9IFB5TG9uZ19Gcm9tTG9uZyhQeUludF9BU19MT05HKHYpKTsKKyAgICAgICAgaWYgKHZ2ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgd3cgPSBQeUxvbmdfRnJvbUxvbmcoUHlJbnRfQVNfTE9ORyh3KSk7CisgICAgICAgIGlmICh3dyA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYodnYpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0ID0gUHlOdW1iZXJfTHNoaWZ0KHZ2LCB3dyk7CisgICAgICAgIFB5X0RFQ1JFRih2dik7CisgICAgICAgIFB5X0RFQ1JFRih3dyk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhjKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGludF9yc2hpZnQoUHlJbnRPYmplY3QgKnYsIFB5SW50T2JqZWN0ICp3KQogewotCXJlZ2lzdGVyIGxvbmcgYSwgYjsKLQlDT05WRVJUX1RPX0xPTkcodiwgYSk7Ci0JQ09OVkVSVF9UT19MT05HKHcsIGIpOwotCWlmIChiIDwgMCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIm5lZ2F0aXZlIHNoaWZ0IGNvdW50Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoYSA9PSAwIHx8IGIgPT0gMCkKLQkJcmV0dXJuIGludF9pbnQodik7Ci0JaWYgKGIgPj0gTE9OR19CSVQpIHsKLQkJaWYgKGEgPCAwKQotCQkJYSA9IC0xOwotCQllbHNlCi0JCQlhID0gMDsKLQl9Ci0JZWxzZSB7Ci0JCWEgPSBQeV9BUklUSE1FVElDX1JJR0hUX1NISUZUKGxvbmcsIGEsIGIpOwotCX0KLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoYSk7CisgICAgcmVnaXN0ZXIgbG9uZyBhLCBiOworICAgIENPTlZFUlRfVE9fTE9ORyh2LCBhKTsKKyAgICBDT05WRVJUX1RPX0xPTkcodywgYik7CisgICAgaWYgKGIgPCAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAibmVnYXRpdmUgc2hpZnQgY291bnQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChhID09IDAgfHwgYiA9PSAwKQorICAgICAgICByZXR1cm4gaW50X2ludCh2KTsKKyAgICBpZiAoYiA+PSBMT05HX0JJVCkgeworICAgICAgICBpZiAoYSA8IDApCisgICAgICAgICAgICBhID0gLTE7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGEgPSAwOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgYSA9IFB5X0FSSVRITUVUSUNfUklHSFRfU0hJRlQobG9uZywgYSwgYik7CisgICAgfQorICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhhKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGludF9hbmQoUHlJbnRPYmplY3QgKnYsIFB5SW50T2JqZWN0ICp3KQogewotCXJlZ2lzdGVyIGxvbmcgYSwgYjsKLQlDT05WRVJUX1RPX0xPTkcodiwgYSk7Ci0JQ09OVkVSVF9UT19MT05HKHcsIGIpOwotCXJldHVybiBQeUludF9Gcm9tTG9uZyhhICYgYik7CisgICAgcmVnaXN0ZXIgbG9uZyBhLCBiOworICAgIENPTlZFUlRfVE9fTE9ORyh2LCBhKTsKKyAgICBDT05WRVJUX1RPX0xPTkcodywgYik7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKGEgJiBiKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGludF94b3IoUHlJbnRPYmplY3QgKnYsIFB5SW50T2JqZWN0ICp3KQogewotCXJlZ2lzdGVyIGxvbmcgYSwgYjsKLQlDT05WRVJUX1RPX0xPTkcodiwgYSk7Ci0JQ09OVkVSVF9UT19MT05HKHcsIGIpOwotCXJldHVybiBQeUludF9Gcm9tTG9uZyhhIF4gYik7CisgICAgcmVnaXN0ZXIgbG9uZyBhLCBiOworICAgIENPTlZFUlRfVE9fTE9ORyh2LCBhKTsKKyAgICBDT05WRVJUX1RPX0xPTkcodywgYik7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKGEgXiBiKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGludF9vcihQeUludE9iamVjdCAqdiwgUHlJbnRPYmplY3QgKncpCiB7Ci0JcmVnaXN0ZXIgbG9uZyBhLCBiOwotCUNPTlZFUlRfVE9fTE9ORyh2LCBhKTsKLQlDT05WRVJUX1RPX0xPTkcodywgYik7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKGEgfCBiKTsKKyAgICByZWdpc3RlciBsb25nIGEsIGI7CisgICAgQ09OVkVSVF9UT19MT05HKHYsIGEpOworICAgIENPTlZFUlRfVE9fTE9ORyh3LCBiKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoYSB8IGIpOwogfQogCiBzdGF0aWMgaW50CiBpbnRfY29lcmNlKFB5T2JqZWN0ICoqcHYsIFB5T2JqZWN0ICoqcHcpCiB7Ci0JaWYgKFB5SW50X0NoZWNrKCpwdykpIHsKLQkJUHlfSU5DUkVGKCpwdik7Ci0JCVB5X0lOQ1JFRigqcHcpOwotCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIDE7IC8qIENhbid0IGRvIGl0ICovCisgICAgaWYgKFB5SW50X0NoZWNrKCpwdykpIHsKKyAgICAgICAgUHlfSU5DUkVGKCpwdik7CisgICAgICAgIFB5X0lOQ1JFRigqcHcpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIDE7IC8qIENhbid0IGRvIGl0ICovCiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbnRfaW50KFB5SW50T2JqZWN0ICp2KQogewotCWlmIChQeUludF9DaGVja0V4YWN0KHYpKQotCQlQeV9JTkNSRUYodik7Ci0JZWxzZQotCQl2ID0gKFB5SW50T2JqZWN0ICopUHlJbnRfRnJvbUxvbmcodi0+b2JfaXZhbCk7Ci0JcmV0dXJuIChQeU9iamVjdCAqKXY7CisgICAgaWYgKFB5SW50X0NoZWNrRXhhY3QodikpCisgICAgICAgIFB5X0lOQ1JFRih2KTsKKyAgICBlbHNlCisgICAgICAgIHYgPSAoUHlJbnRPYmplY3QgKilQeUludF9Gcm9tTG9uZyh2LT5vYl9pdmFsKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopdjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGludF9sb25nKFB5SW50T2JqZWN0ICp2KQogewotCXJldHVybiBQeUxvbmdfRnJvbUxvbmcoKHYgLT4gb2JfaXZhbCkpOworICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmcoKHYgLT4gb2JfaXZhbCkpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaW50X2Zsb2F0KFB5SW50T2JqZWN0ICp2KQogewotCXJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoKGRvdWJsZSkodiAtPiBvYl9pdmFsKSk7CisgICAgcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZSgoZG91YmxlKSh2IC0+IG9iX2l2YWwpKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGludF9vY3QoUHlJbnRPYmplY3QgKnYpCiB7Ci0JcmV0dXJuIF9QeUludF9Gb3JtYXQodiwgOCwgMCk7CisgICAgcmV0dXJuIF9QeUludF9Gb3JtYXQodiwgOCwgMCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbnRfaGV4KFB5SW50T2JqZWN0ICp2KQogewotCXJldHVybiBfUHlJbnRfRm9ybWF0KHYsIDE2LCAwKTsKKyAgICByZXR1cm4gX1B5SW50X0Zvcm1hdCh2LCAxNiwgMCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC05NjMsNDcgKzk2Myw0NyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGludF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JUHlPYmplY3QgKnggPSBOVUxMOwotCWludCBiYXNlID0gLTkwOTsKLQlzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7IngiLCAiYmFzZSIsIDB9OworICAgIFB5T2JqZWN0ICp4ID0gTlVMTDsKKyAgICBpbnQgYmFzZSA9IC05MDk7CisgICAgc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJ4IiwgImJhc2UiLCAwfTsKIAotCWlmICh0eXBlICE9ICZQeUludF9UeXBlKQotCQlyZXR1cm4gaW50X3N1YnR5cGVfbmV3KHR5cGUsIGFyZ3MsIGt3ZHMpOyAvKiBXaW1wIG91dCAqLwotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJ8T2k6aW50Iiwga3dsaXN0LAotCQkJCQkgJngsICZiYXNlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKHggPT0gTlVMTCkKLQkJcmV0dXJuIFB5SW50X0Zyb21Mb25nKDBMKTsKLQlpZiAoYmFzZSA9PSAtOTA5KQotCQlyZXR1cm4gUHlOdW1iZXJfSW50KHgpOwotCWlmIChQeVN0cmluZ19DaGVjayh4KSkgewotCQkvKiBTaW5jZSBQeUludF9Gcm9tU3RyaW5nIGRvZXNuJ3QgaGF2ZSBhIGxlbmd0aCBwYXJhbWV0ZXIsCi0JCSAqIGNoZWNrIGhlcmUgZm9yIHBvc3NpYmxlIE5VTHMgaW4gdGhlIHN0cmluZy4gKi8KLQkJY2hhciAqc3RyaW5nID0gUHlTdHJpbmdfQVNfU1RSSU5HKHgpOwotCQlpZiAoc3RybGVuKHN0cmluZykgIT0gUHlTdHJpbmdfU2l6ZSh4KSkgewotCQkJLyogY3JlYXRlIGEgcmVwcigpIG9mIHRoZSBpbnB1dCBzdHJpbmcsCi0JCQkgKiBqdXN0IGxpa2UgUHlJbnRfRnJvbVN0cmluZyBkb2VzICovCi0JCQlQeU9iamVjdCAqc3JlcHI7Ci0JCQlzcmVwciA9IFB5T2JqZWN0X1JlcHIoeCk7Ci0JCQlpZiAoc3JlcHIgPT0gTlVMTCkKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAotCQkJICAgICAiaW52YWxpZCBsaXRlcmFsIGZvciBpbnQoKSB3aXRoIGJhc2UgJWQ6ICVzIiwKLQkJCSAgICAgYmFzZSwgUHlTdHJpbmdfQVNfU1RSSU5HKHNyZXByKSk7Ci0JCQlQeV9ERUNSRUYoc3JlcHIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJcmV0dXJuIFB5SW50X0Zyb21TdHJpbmcoc3RyaW5nLCBOVUxMLCBiYXNlKTsKLQl9CisgICAgaWYgKHR5cGUgIT0gJlB5SW50X1R5cGUpCisgICAgICAgIHJldHVybiBpbnRfc3VidHlwZV9uZXcodHlwZSwgYXJncywga3dkcyk7IC8qIFdpbXAgb3V0ICovCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgInxPaTppbnQiLCBrd2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJngsICZiYXNlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKHggPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKDBMKTsKKyAgICBpZiAoYmFzZSA9PSAtOTA5KQorICAgICAgICByZXR1cm4gUHlOdW1iZXJfSW50KHgpOworICAgIGlmIChQeVN0cmluZ19DaGVjayh4KSkgeworICAgICAgICAvKiBTaW5jZSBQeUludF9Gcm9tU3RyaW5nIGRvZXNuJ3QgaGF2ZSBhIGxlbmd0aCBwYXJhbWV0ZXIsCisgICAgICAgICAqIGNoZWNrIGhlcmUgZm9yIHBvc3NpYmxlIE5VTHMgaW4gdGhlIHN0cmluZy4gKi8KKyAgICAgICAgY2hhciAqc3RyaW5nID0gUHlTdHJpbmdfQVNfU1RSSU5HKHgpOworICAgICAgICBpZiAoc3RybGVuKHN0cmluZykgIT0gUHlTdHJpbmdfU2l6ZSh4KSkgeworICAgICAgICAgICAgLyogY3JlYXRlIGEgcmVwcigpIG9mIHRoZSBpbnB1dCBzdHJpbmcsCisgICAgICAgICAgICAgKiBqdXN0IGxpa2UgUHlJbnRfRnJvbVN0cmluZyBkb2VzICovCisgICAgICAgICAgICBQeU9iamVjdCAqc3JlcHI7CisgICAgICAgICAgICBzcmVwciA9IFB5T2JqZWN0X1JlcHIoeCk7CisgICAgICAgICAgICBpZiAoc3JlcHIgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAiaW52YWxpZCBsaXRlcmFsIGZvciBpbnQoKSB3aXRoIGJhc2UgJWQ6ICVzIiwKKyAgICAgICAgICAgICAgICAgYmFzZSwgUHlTdHJpbmdfQVNfU1RSSU5HKHNyZXByKSk7CisgICAgICAgICAgICBQeV9ERUNSRUYoc3JlcHIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21TdHJpbmcoc3RyaW5nLCBOVUxMLCBiYXNlKTsKKyAgICB9CiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCWlmIChQeVVuaWNvZGVfQ2hlY2soeCkpCi0JCXJldHVybiBQeUludF9Gcm9tVW5pY29kZShQeVVuaWNvZGVfQVNfVU5JQ09ERSh4KSwKLQkJCQkJIFB5VW5pY29kZV9HRVRfU0laRSh4KSwKLQkJCQkJIGJhc2UpOworICAgIGlmIChQeVVuaWNvZGVfQ2hlY2soeCkpCisgICAgICAgIHJldHVybiBQeUludF9Gcm9tVW5pY29kZShQeVVuaWNvZGVfQVNfVU5JQ09ERSh4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfU0laRSh4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UpOwogI2VuZGlmCi0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCSJpbnQoKSBjYW4ndCBjb252ZXJ0IG5vbi1zdHJpbmcgd2l0aCBleHBsaWNpdCBiYXNlIik7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgImludCgpIGNhbid0IGNvbnZlcnQgbm9uLXN0cmluZyB3aXRoIGV4cGxpY2l0IGJhc2UiKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogLyogV2ltcHksIHNsb3cgYXBwcm9hY2ggdG8gdHBfbmV3IGNhbGxzIGZvciBzdWJ0eXBlcyBvZiBpbnQ6CkBAIC0xMDE0LDQyICsxMDE0LDQyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogaW50X3N1YnR5cGVfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCVB5T2JqZWN0ICp0bXAsICpuZXdvYmo7Ci0JbG9uZyBpdmFsOworICAgIFB5T2JqZWN0ICp0bXAsICpuZXdvYmo7CisgICAgbG9uZyBpdmFsOwogCi0JYXNzZXJ0KFB5VHlwZV9Jc1N1YnR5cGUodHlwZSwgJlB5SW50X1R5cGUpKTsKLQl0bXAgPSBpbnRfbmV3KCZQeUludF9UeXBlLCBhcmdzLCBrd2RzKTsKLQlpZiAodG1wID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWlmICghUHlJbnRfQ2hlY2sodG1wKSkgewotCQlpdmFsID0gUHlMb25nX0FzTG9uZyh0bXApOwotCQlpZiAoaXZhbCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCQlQeV9ERUNSRUYodG1wKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfSBlbHNlIHsKLQkJaXZhbCA9ICgoUHlJbnRPYmplY3QgKil0bXApLT5vYl9pdmFsOwotCX0KKyAgICBhc3NlcnQoUHlUeXBlX0lzU3VidHlwZSh0eXBlLCAmUHlJbnRfVHlwZSkpOworICAgIHRtcCA9IGludF9uZXcoJlB5SW50X1R5cGUsIGFyZ3MsIGt3ZHMpOworICAgIGlmICh0bXAgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUludF9DaGVjayh0bXApKSB7CisgICAgICAgIGl2YWwgPSBQeUxvbmdfQXNMb25nKHRtcCk7CisgICAgICAgIGlmIChpdmFsID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih0bXApOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpdmFsID0gKChQeUludE9iamVjdCAqKXRtcCktPm9iX2l2YWw7CisgICAgfQogCi0JbmV3b2JqID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7Ci0JaWYgKG5ld29iaiA9PSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRih0bXApOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JKChQeUludE9iamVjdCAqKW5ld29iaiktPm9iX2l2YWwgPSBpdmFsOwotCVB5X0RFQ1JFRih0bXApOwotCXJldHVybiBuZXdvYmo7CisgICAgbmV3b2JqID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7CisgICAgaWYgKG5ld29iaiA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRih0bXApOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgKChQeUludE9iamVjdCAqKW5ld29iaiktPm9iX2l2YWwgPSBpdmFsOworICAgIFB5X0RFQ1JFRih0bXApOworICAgIHJldHVybiBuZXdvYmo7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbnRfZ2V0bmV3YXJncyhQeUludE9iamVjdCAqdikKIHsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKGwpIiwgdi0+b2JfaXZhbCk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihsKSIsIHYtPm9iX2l2YWwpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaW50X2dldE4oUHlJbnRPYmplY3QgKnYsIHZvaWQgKmNvbnRleHQpIHsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKFB5X2ludHB0cl90KWNvbnRleHQpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygoUHlfaW50cHRyX3QpY29udGV4dCk7CiB9CiAKIC8qIENvbnZlcnQgYW4gaW50ZWdlciB0byB0aGUgZ2l2ZW4gYmFzZS4gIFJldHVybnMgYSBzdHJpbmcuCkBAIC0xMDU5LDEzNyArMTA1OSwxMzcgQEAKIFB5QVBJX0ZVTkMoUHlPYmplY3QqKQogX1B5SW50X0Zvcm1hdChQeUludE9iamVjdCAqdiwgaW50IGJhc2UsIGludCBuZXdzdHlsZSkKIHsKLQkvKiBUaGVyZSBhcmUgbm8gZG91YnQgbWFueSwgbWFueSB3YXlzIHRvIG9wdGltaXplIHRoaXMsIHVzaW5nIGNvZGUKLQkgICBzaW1pbGFyIHRvIF9QeUxvbmdfRm9ybWF0ICovCi0JbG9uZyBuID0gdi0+b2JfaXZhbDsKLQlpbnQgIG5lZ2F0aXZlID0gbiA8IDA7Ci0JaW50IGlzX3plcm8gPSBuID09IDA7CisgICAgLyogVGhlcmUgYXJlIG5vIGRvdWJ0IG1hbnksIG1hbnkgd2F5cyB0byBvcHRpbWl6ZSB0aGlzLCB1c2luZyBjb2RlCisgICAgICAgc2ltaWxhciB0byBfUHlMb25nX0Zvcm1hdCAqLworICAgIGxvbmcgbiA9IHYtPm9iX2l2YWw7CisgICAgaW50ICBuZWdhdGl2ZSA9IG4gPCAwOworICAgIGludCBpc196ZXJvID0gbiA9PSAwOwogCi0JLyogRm9yIHRoZSByZWFzb25pbmcgYmVoaW5kIHRoaXMgc2l6ZSwgc2VlCi0JICAgaHR0cDovL2MtZmFxLmNvbS9taXNjL2hleGlvLmh0bWwuIFRoZW4sIGFkZCBhIGZldyBieXRlcyBmb3IKLQkgICB0aGUgcG9zc2libGUgc2lnbiBhbmQgcHJlZml4ICIwW2JveF0iICovCi0JY2hhciBidWZbc2l6ZW9mKG4pKkNIQVJfQklUKzZdOworICAgIC8qIEZvciB0aGUgcmVhc29uaW5nIGJlaGluZCB0aGlzIHNpemUsIHNlZQorICAgICAgIGh0dHA6Ly9jLWZhcS5jb20vbWlzYy9oZXhpby5odG1sLiBUaGVuLCBhZGQgYSBmZXcgYnl0ZXMgZm9yCisgICAgICAgdGhlIHBvc3NpYmxlIHNpZ24gYW5kIHByZWZpeCAiMFtib3hdIiAqLworICAgIGNoYXIgYnVmW3NpemVvZihuKSpDSEFSX0JJVCs2XTsKIAotCS8qIFN0YXJ0IGJ5IHBvaW50aW5nIHRvIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlci4gIFdlIGZpbGwgaW4gZnJvbQotCSAgIHRoZSBiYWNrIGZvcndhcmQuICovCi0JY2hhciogcCA9ICZidWZbc2l6ZW9mKGJ1ZildOworICAgIC8qIFN0YXJ0IGJ5IHBvaW50aW5nIHRvIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlci4gIFdlIGZpbGwgaW4gZnJvbQorICAgICAgIHRoZSBiYWNrIGZvcndhcmQuICovCisgICAgY2hhciogcCA9ICZidWZbc2l6ZW9mKGJ1ZildOwogCi0JYXNzZXJ0KGJhc2UgPj0gMiAmJiBiYXNlIDw9IDM2KTsKKyAgICBhc3NlcnQoYmFzZSA+PSAyICYmIGJhc2UgPD0gMzYpOwogCi0JZG8gewotCQkvKiBJJ2QgdXNlIGlfZGl2bW9kLCBleGNlcHQgaXQgZG9lc24ndCBwcm9kdWNlIHRoZSByZXN1bHRzCi0JCSAgIEkgd2FudCB3aGVuIG4gaXMgbmVnYXRpdmUuICBTbyBqdXN0IGR1cGxpY2F0ZSB0aGUgc2FsaWVudAotCQkgICBwYXJ0IGhlcmUuICovCi0JCWxvbmcgZGl2ID0gbiAvIGJhc2U7Ci0JCWxvbmcgbW9kID0gbiAtIGRpdiAqIGJhc2U7CisgICAgZG8geworICAgICAgICAvKiBJJ2QgdXNlIGlfZGl2bW9kLCBleGNlcHQgaXQgZG9lc24ndCBwcm9kdWNlIHRoZSByZXN1bHRzCisgICAgICAgICAgIEkgd2FudCB3aGVuIG4gaXMgbmVnYXRpdmUuICBTbyBqdXN0IGR1cGxpY2F0ZSB0aGUgc2FsaWVudAorICAgICAgICAgICBwYXJ0IGhlcmUuICovCisgICAgICAgIGxvbmcgZGl2ID0gbiAvIGJhc2U7CisgICAgICAgIGxvbmcgbW9kID0gbiAtIGRpdiAqIGJhc2U7CiAKLQkJLyogY29udmVydCBhYnMobW9kKSB0byB0aGUgcmlnaHQgY2hhcmFjdGVyIGluIFswLTksIGEtel0gKi8KLQkJY2hhciBjZGlnaXQgPSAoY2hhcikobW9kIDwgMCA/IC1tb2QgOiBtb2QpOwotCQljZGlnaXQgKz0gKGNkaWdpdCA8IDEwKSA/ICcwJyA6ICdhJy0xMDsKLQkJKi0tcCA9IGNkaWdpdDsKKyAgICAgICAgLyogY29udmVydCBhYnMobW9kKSB0byB0aGUgcmlnaHQgY2hhcmFjdGVyIGluIFswLTksIGEtel0gKi8KKyAgICAgICAgY2hhciBjZGlnaXQgPSAoY2hhcikobW9kIDwgMCA/IC1tb2QgOiBtb2QpOworICAgICAgICBjZGlnaXQgKz0gKGNkaWdpdCA8IDEwKSA/ICcwJyA6ICdhJy0xMDsKKyAgICAgICAgKi0tcCA9IGNkaWdpdDsKIAotCQluID0gZGl2OwotCX0gd2hpbGUobik7CisgICAgICAgIG4gPSBkaXY7CisgICAgfSB3aGlsZShuKTsKIAotCWlmIChiYXNlID09IDIpIHsKLQkJKi0tcCA9ICdiJzsKLQkJKi0tcCA9ICcwJzsKLQl9Ci0JZWxzZSBpZiAoYmFzZSA9PSA4KSB7Ci0JCWlmIChuZXdzdHlsZSkgewotCQkJKi0tcCA9ICdvJzsKLQkJCSotLXAgPSAnMCc7Ci0JCX0KLQkJZWxzZQotCQkJaWYgKCFpc196ZXJvKQotCQkJCSotLXAgPSAnMCc7Ci0JfQotCWVsc2UgaWYgKGJhc2UgPT0gMTYpIHsKLQkJKi0tcCA9ICd4JzsKLQkJKi0tcCA9ICcwJzsKLQl9Ci0JZWxzZSBpZiAoYmFzZSAhPSAxMCkgewotCQkqLS1wID0gJyMnOwotCQkqLS1wID0gJzAnICsgYmFzZSUxMDsKLQkJaWYgKGJhc2UgPiAxMCkKLQkJCSotLXAgPSAnMCcgKyBiYXNlLzEwOwotCX0KLQlpZiAobmVnYXRpdmUpCi0JCSotLXAgPSAnLSc7CisgICAgaWYgKGJhc2UgPT0gMikgeworICAgICAgICAqLS1wID0gJ2InOworICAgICAgICAqLS1wID0gJzAnOworICAgIH0KKyAgICBlbHNlIGlmIChiYXNlID09IDgpIHsKKyAgICAgICAgaWYgKG5ld3N0eWxlKSB7CisgICAgICAgICAgICAqLS1wID0gJ28nOworICAgICAgICAgICAgKi0tcCA9ICcwJzsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBpZiAoIWlzX3plcm8pCisgICAgICAgICAgICAgICAgKi0tcCA9ICcwJzsKKyAgICB9CisgICAgZWxzZSBpZiAoYmFzZSA9PSAxNikgeworICAgICAgICAqLS1wID0gJ3gnOworICAgICAgICAqLS1wID0gJzAnOworICAgIH0KKyAgICBlbHNlIGlmIChiYXNlICE9IDEwKSB7CisgICAgICAgICotLXAgPSAnIyc7CisgICAgICAgICotLXAgPSAnMCcgKyBiYXNlJTEwOworICAgICAgICBpZiAoYmFzZSA+IDEwKQorICAgICAgICAgICAgKi0tcCA9ICcwJyArIGJhc2UvMTA7CisgICAgfQorICAgIGlmIChuZWdhdGl2ZSkKKyAgICAgICAgKi0tcCA9ICctJzsKIAotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShwLCAmYnVmW3NpemVvZihidWYpXSAtIHApOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShwLCAmYnVmW3NpemVvZihidWYpXSAtIHApOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaW50X19mb3JtYXRfXyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKmZvcm1hdF9zcGVjOworICAgIFB5T2JqZWN0ICpmb3JtYXRfc3BlYzsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTzpfX2Zvcm1hdF9fIiwgJmZvcm1hdF9zcGVjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKFB5Qnl0ZXNfQ2hlY2soZm9ybWF0X3NwZWMpKQotCQlyZXR1cm4gX1B5SW50X0Zvcm1hdEFkdmFuY2VkKHNlbGYsCi0JCQkJCSAgICAgUHlCeXRlc19BU19TVFJJTkcoZm9ybWF0X3NwZWMpLAotCQkJCQkgICAgIFB5Qnl0ZXNfR0VUX1NJWkUoZm9ybWF0X3NwZWMpKTsKLQlpZiAoUHlVbmljb2RlX0NoZWNrKGZvcm1hdF9zcGVjKSkgewotCQkvKiBDb252ZXJ0IGZvcm1hdF9zcGVjIHRvIGEgc3RyICovCi0JCVB5T2JqZWN0ICpyZXN1bHQ7Ci0JCVB5T2JqZWN0ICpzdHJfc3BlYyA9IFB5T2JqZWN0X1N0cihmb3JtYXRfc3BlYyk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPOl9fZm9ybWF0X18iLCAmZm9ybWF0X3NwZWMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoUHlCeXRlc19DaGVjayhmb3JtYXRfc3BlYykpCisgICAgICAgIHJldHVybiBfUHlJbnRfRm9ybWF0QWR2YW5jZWQoc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUJ5dGVzX0FTX1NUUklORyhmb3JtYXRfc3BlYyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlCeXRlc19HRVRfU0laRShmb3JtYXRfc3BlYykpOworICAgIGlmIChQeVVuaWNvZGVfQ2hlY2soZm9ybWF0X3NwZWMpKSB7CisgICAgICAgIC8qIENvbnZlcnQgZm9ybWF0X3NwZWMgdG8gYSBzdHIgKi8KKyAgICAgICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICAgICAgUHlPYmplY3QgKnN0cl9zcGVjID0gUHlPYmplY3RfU3RyKGZvcm1hdF9zcGVjKTsKIAotCQlpZiAoc3RyX3NwZWMgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOworICAgICAgICBpZiAoc3RyX3NwZWMgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogCi0JCXJlc3VsdCA9IF9QeUludF9Gb3JtYXRBZHZhbmNlZChzZWxmLAotCQkJCQkgICAgICAgUHlCeXRlc19BU19TVFJJTkcoc3RyX3NwZWMpLAotCQkJCQkgICAgICAgUHlCeXRlc19HRVRfU0laRShzdHJfc3BlYykpOworICAgICAgICByZXN1bHQgPSBfUHlJbnRfRm9ybWF0QWR2YW5jZWQoc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5Qnl0ZXNfQVNfU1RSSU5HKHN0cl9zcGVjKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5Qnl0ZXNfR0VUX1NJWkUoc3RyX3NwZWMpKTsKIAotCQlQeV9ERUNSRUYoc3RyX3NwZWMpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiX19mb3JtYXRfXyByZXF1aXJlcyBzdHIgb3IgdW5pY29kZSIpOwotCXJldHVybiBOVUxMOworICAgICAgICBQeV9ERUNSRUYoc3RyX3NwZWMpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiX19mb3JtYXRfXyByZXF1aXJlcyBzdHIgb3IgdW5pY29kZSIpOworICAgIHJldHVybiBOVUxMOwogfQogCiAjaWYgMAogc3RhdGljIFB5T2JqZWN0ICoKIGludF9pc19maW5pdGUoUHlPYmplY3QgKnYpCiB7Ci0JUHlfUkVUVVJOX1RSVUU7CisgICAgUHlfUkVUVVJOX1RSVUU7CiB9CiAjZW5kaWYKIAogc3RhdGljIFB5TWV0aG9kRGVmIGludF9tZXRob2RzW10gPSB7Ci0JeyJjb25qdWdhdGUiLAkoUHlDRnVuY3Rpb24paW50X2ludCwJTUVUSF9OT0FSR1MsCi0JICJSZXR1cm5zIHNlbGYsIHRoZSBjb21wbGV4IGNvbmp1Z2F0ZSBvZiBhbnkgaW50LiJ9LAorICAgIHsiY29uanVnYXRlIiwgICAgICAgKFB5Q0Z1bmN0aW9uKWludF9pbnQsICAgTUVUSF9OT0FSR1MsCisgICAgICJSZXR1cm5zIHNlbGYsIHRoZSBjb21wbGV4IGNvbmp1Z2F0ZSBvZiBhbnkgaW50LiJ9LAogI2lmIDAKLQl7ImlzX2Zpbml0ZSIsCShQeUNGdW5jdGlvbilpbnRfaXNfZmluaXRlLAlNRVRIX05PQVJHUywKLQkgIlJldHVybnMgYWx3YXlzIFRydWUuIn0sCisgICAgeyJpc19maW5pdGUiLCAgICAgICAoUHlDRnVuY3Rpb24paW50X2lzX2Zpbml0ZSwgICAgIE1FVEhfTk9BUkdTLAorICAgICAiUmV0dXJucyBhbHdheXMgVHJ1ZS4ifSwKICNlbmRpZgotCXsiX190cnVuY19fIiwJKFB5Q0Z1bmN0aW9uKWludF9pbnQsCU1FVEhfTk9BUkdTLAotICAgICAgICAgIlRydW5jYXRpbmcgYW4gSW50ZWdyYWwgcmV0dXJucyBpdHNlbGYuIn0sCi0JeyJfX2dldG5ld2FyZ3NfXyIsCShQeUNGdW5jdGlvbilpbnRfZ2V0bmV3YXJncywJTUVUSF9OT0FSR1N9LAotICAgICAgICB7Il9fZm9ybWF0X18iLCAoUHlDRnVuY3Rpb24paW50X19mb3JtYXRfXywgTUVUSF9WQVJBUkdTfSwKLQl7TlVMTCwJCU5VTEx9CQkvKiBzZW50aW5lbCAqLworICAgIHsiX190cnVuY19fIiwgICAgICAgKFB5Q0Z1bmN0aW9uKWludF9pbnQsICAgTUVUSF9OT0FSR1MsCisgICAgICJUcnVuY2F0aW5nIGFuIEludGVncmFsIHJldHVybnMgaXRzZWxmLiJ9LAorICAgIHsiX19nZXRuZXdhcmdzX18iLCAgICAgICAgICAoUHlDRnVuY3Rpb24paW50X2dldG5ld2FyZ3MsICAgIE1FVEhfTk9BUkdTfSwKKyAgICB7Il9fZm9ybWF0X18iLCAoUHlDRnVuY3Rpb24paW50X19mb3JtYXRfXywgTUVUSF9WQVJBUkdTfSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogc3RhdGljIFB5R2V0U2V0RGVmIGludF9nZXRzZXRbXSA9IHsKLQl7InJlYWwiLCAKLQkgKGdldHRlcilpbnRfaW50LCAoc2V0dGVyKU5VTEwsCi0JICJ0aGUgcmVhbCBwYXJ0IG9mIGEgY29tcGxleCBudW1iZXIiLAotCSBOVUxMfSwKLQl7ImltYWciLCAKLQkgKGdldHRlcilpbnRfZ2V0TiwgKHNldHRlcilOVUxMLAotCSAidGhlIGltYWdpbmFyeSBwYXJ0IG9mIGEgY29tcGxleCBudW1iZXIiLAotCSAodm9pZCopMH0sCi0JeyJudW1lcmF0b3IiLCAKLQkgKGdldHRlcilpbnRfaW50LCAoc2V0dGVyKU5VTEwsCi0JICJ0aGUgbnVtZXJhdG9yIG9mIGEgcmF0aW9uYWwgbnVtYmVyIGluIGxvd2VzdCB0ZXJtcyIsCi0JIE5VTEx9LAotCXsiZGVub21pbmF0b3IiLCAKLQkgKGdldHRlcilpbnRfZ2V0TiwgKHNldHRlcilOVUxMLAotCSAidGhlIGRlbm9taW5hdG9yIG9mIGEgcmF0aW9uYWwgbnVtYmVyIGluIGxvd2VzdCB0ZXJtcyIsCi0JICh2b2lkKikxfSwKLQl7TlVMTH0gIC8qIFNlbnRpbmVsICovCisgICAgeyJyZWFsIiwKKyAgICAgKGdldHRlcilpbnRfaW50LCAoc2V0dGVyKU5VTEwsCisgICAgICJ0aGUgcmVhbCBwYXJ0IG9mIGEgY29tcGxleCBudW1iZXIiLAorICAgICBOVUxMfSwKKyAgICB7ImltYWciLAorICAgICAoZ2V0dGVyKWludF9nZXROLCAoc2V0dGVyKU5VTEwsCisgICAgICJ0aGUgaW1hZ2luYXJ5IHBhcnQgb2YgYSBjb21wbGV4IG51bWJlciIsCisgICAgICh2b2lkKikwfSwKKyAgICB7Im51bWVyYXRvciIsCisgICAgIChnZXR0ZXIpaW50X2ludCwgKHNldHRlcilOVUxMLAorICAgICAidGhlIG51bWVyYXRvciBvZiBhIHJhdGlvbmFsIG51bWJlciBpbiBsb3dlc3QgdGVybXMiLAorICAgICBOVUxMfSwKKyAgICB7ImRlbm9taW5hdG9yIiwKKyAgICAgKGdldHRlcilpbnRfZ2V0TiwgKHNldHRlcilOVUxMLAorICAgICAidGhlIGRlbm9taW5hdG9yIG9mIGEgcmF0aW9uYWwgbnVtYmVyIGluIGxvd2VzdCB0ZXJtcyIsCisgICAgICh2b2lkKikxfSwKKyAgICB7TlVMTH0gIC8qIFNlbnRpbmVsICovCiB9OwogCiBQeURvY19TVFJWQVIoaW50X2RvYywKQEAgLTEyMDQsMjEyICsxMjA0LDIxMiBAQAogbG9uZyBvYmplY3Qgd2lsbCBiZSByZXR1cm5lZCBpbnN0ZWFkLiIpOwogCiBzdGF0aWMgUHlOdW1iZXJNZXRob2RzIGludF9hc19udW1iZXIgPSB7Ci0JKGJpbmFyeWZ1bmMpaW50X2FkZCwJLypuYl9hZGQqLwotCShiaW5hcnlmdW5jKWludF9zdWIsCS8qbmJfc3VidHJhY3QqLwotCShiaW5hcnlmdW5jKWludF9tdWwsCS8qbmJfbXVsdGlwbHkqLwotCShiaW5hcnlmdW5jKWludF9jbGFzc2ljX2RpdiwgLypuYl9kaXZpZGUqLwotCShiaW5hcnlmdW5jKWludF9tb2QsCS8qbmJfcmVtYWluZGVyKi8KLQkoYmluYXJ5ZnVuYylpbnRfZGl2bW9kLAkvKm5iX2Rpdm1vZCovCi0JKHRlcm5hcnlmdW5jKWludF9wb3csCS8qbmJfcG93ZXIqLwotCSh1bmFyeWZ1bmMpaW50X25lZywJLypuYl9uZWdhdGl2ZSovCi0JKHVuYXJ5ZnVuYylpbnRfaW50LAkvKm5iX3Bvc2l0aXZlKi8KLQkodW5hcnlmdW5jKWludF9hYnMsCS8qbmJfYWJzb2x1dGUqLwotCShpbnF1aXJ5KWludF9ub256ZXJvLAkvKm5iX25vbnplcm8qLwotCSh1bmFyeWZ1bmMpaW50X2ludmVydCwJLypuYl9pbnZlcnQqLwotCShiaW5hcnlmdW5jKWludF9sc2hpZnQsCS8qbmJfbHNoaWZ0Ki8KLQkoYmluYXJ5ZnVuYylpbnRfcnNoaWZ0LAkvKm5iX3JzaGlmdCovCi0JKGJpbmFyeWZ1bmMpaW50X2FuZCwJLypuYl9hbmQqLwotCShiaW5hcnlmdW5jKWludF94b3IsCS8qbmJfeG9yKi8KLQkoYmluYXJ5ZnVuYylpbnRfb3IsCS8qbmJfb3IqLwotCWludF9jb2VyY2UsCQkvKm5iX2NvZXJjZSovCi0JKHVuYXJ5ZnVuYylpbnRfaW50LAkvKm5iX2ludCovCi0JKHVuYXJ5ZnVuYylpbnRfbG9uZywJLypuYl9sb25nKi8KLQkodW5hcnlmdW5jKWludF9mbG9hdCwJLypuYl9mbG9hdCovCi0JKHVuYXJ5ZnVuYylpbnRfb2N0LAkvKm5iX29jdCovCi0JKHVuYXJ5ZnVuYylpbnRfaGV4LCAJLypuYl9oZXgqLwotCTAsCQkJLypuYl9pbnBsYWNlX2FkZCovCi0JMCwJCQkvKm5iX2lucGxhY2Vfc3VidHJhY3QqLwotCTAsCQkJLypuYl9pbnBsYWNlX211bHRpcGx5Ki8KLQkwLAkJCS8qbmJfaW5wbGFjZV9kaXZpZGUqLwotCTAsCQkJLypuYl9pbnBsYWNlX3JlbWFpbmRlciovCi0JMCwJCQkvKm5iX2lucGxhY2VfcG93ZXIqLwotCTAsCQkJLypuYl9pbnBsYWNlX2xzaGlmdCovCi0JMCwJCQkvKm5iX2lucGxhY2VfcnNoaWZ0Ki8KLQkwLAkJCS8qbmJfaW5wbGFjZV9hbmQqLwotCTAsCQkJLypuYl9pbnBsYWNlX3hvciovCi0JMCwJCQkvKm5iX2lucGxhY2Vfb3IqLwotCShiaW5hcnlmdW5jKWludF9kaXYsCS8qIG5iX2Zsb29yX2RpdmlkZSAqLwotCWludF90cnVlX2RpdmlkZSwJLyogbmJfdHJ1ZV9kaXZpZGUgKi8KLQkwLAkJCS8qIG5iX2lucGxhY2VfZmxvb3JfZGl2aWRlICovCi0JMCwJCQkvKiBuYl9pbnBsYWNlX3RydWVfZGl2aWRlICovCi0JKHVuYXJ5ZnVuYylpbnRfaW50LAkvKiBuYl9pbmRleCAqLworICAgIChiaW5hcnlmdW5jKWludF9hZGQsICAgICAgICAvKm5iX2FkZCovCisgICAgKGJpbmFyeWZ1bmMpaW50X3N1YiwgICAgICAgIC8qbmJfc3VidHJhY3QqLworICAgIChiaW5hcnlmdW5jKWludF9tdWwsICAgICAgICAvKm5iX211bHRpcGx5Ki8KKyAgICAoYmluYXJ5ZnVuYylpbnRfY2xhc3NpY19kaXYsIC8qbmJfZGl2aWRlKi8KKyAgICAoYmluYXJ5ZnVuYylpbnRfbW9kLCAgICAgICAgLypuYl9yZW1haW5kZXIqLworICAgIChiaW5hcnlmdW5jKWludF9kaXZtb2QsICAgICAvKm5iX2Rpdm1vZCovCisgICAgKHRlcm5hcnlmdW5jKWludF9wb3csICAgICAgIC8qbmJfcG93ZXIqLworICAgICh1bmFyeWZ1bmMpaW50X25lZywgICAgICAgICAvKm5iX25lZ2F0aXZlKi8KKyAgICAodW5hcnlmdW5jKWludF9pbnQsICAgICAgICAgLypuYl9wb3NpdGl2ZSovCisgICAgKHVuYXJ5ZnVuYylpbnRfYWJzLCAgICAgICAgIC8qbmJfYWJzb2x1dGUqLworICAgIChpbnF1aXJ5KWludF9ub256ZXJvLCAgICAgICAvKm5iX25vbnplcm8qLworICAgICh1bmFyeWZ1bmMpaW50X2ludmVydCwgICAgICAvKm5iX2ludmVydCovCisgICAgKGJpbmFyeWZ1bmMpaW50X2xzaGlmdCwgICAgIC8qbmJfbHNoaWZ0Ki8KKyAgICAoYmluYXJ5ZnVuYylpbnRfcnNoaWZ0LCAgICAgLypuYl9yc2hpZnQqLworICAgIChiaW5hcnlmdW5jKWludF9hbmQsICAgICAgICAvKm5iX2FuZCovCisgICAgKGJpbmFyeWZ1bmMpaW50X3hvciwgICAgICAgIC8qbmJfeG9yKi8KKyAgICAoYmluYXJ5ZnVuYylpbnRfb3IsICAgICAgICAgLypuYl9vciovCisgICAgaW50X2NvZXJjZSwgICAgICAgICAgICAgICAgIC8qbmJfY29lcmNlKi8KKyAgICAodW5hcnlmdW5jKWludF9pbnQsICAgICAgICAgLypuYl9pbnQqLworICAgICh1bmFyeWZ1bmMpaW50X2xvbmcsICAgICAgICAvKm5iX2xvbmcqLworICAgICh1bmFyeWZ1bmMpaW50X2Zsb2F0LCAgICAgICAvKm5iX2Zsb2F0Ki8KKyAgICAodW5hcnlmdW5jKWludF9vY3QsICAgICAgICAgLypuYl9vY3QqLworICAgICh1bmFyeWZ1bmMpaW50X2hleCwgICAgICAgICAvKm5iX2hleCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbmJfaW5wbGFjZV9hZGQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKm5iX2lucGxhY2Vfc3VidHJhY3QqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKm5iX2lucGxhY2VfbXVsdGlwbHkqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKm5iX2lucGxhY2VfZGl2aWRlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLypuYl9pbnBsYWNlX3JlbWFpbmRlciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbmJfaW5wbGFjZV9wb3dlciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbmJfaW5wbGFjZV9sc2hpZnQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKm5iX2lucGxhY2VfcnNoaWZ0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLypuYl9pbnBsYWNlX2FuZCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbmJfaW5wbGFjZV94b3IqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKm5iX2lucGxhY2Vfb3IqLworICAgIChiaW5hcnlmdW5jKWludF9kaXYsICAgICAgICAvKiBuYl9mbG9vcl9kaXZpZGUgKi8KKyAgICBpbnRfdHJ1ZV9kaXZpZGUsICAgICAgICAgICAgLyogbmJfdHJ1ZV9kaXZpZGUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfaW5wbGFjZV9mbG9vcl9kaXZpZGUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfaW5wbGFjZV90cnVlX2RpdmlkZSAqLworICAgICh1bmFyeWZ1bmMpaW50X2ludCwgICAgICAgICAvKiBuYl9pbmRleCAqLwogfTsKIAogUHlUeXBlT2JqZWN0IFB5SW50X1R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKLQkiaW50IiwKLQlzaXplb2YoUHlJbnRPYmplY3QpLAotCTAsCi0JKGRlc3RydWN0b3IpaW50X2RlYWxsb2MsCQkvKiB0cF9kZWFsbG9jICovCi0JKHByaW50ZnVuYylpbnRfcHJpbnQsCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRyICovCi0JKGNtcGZ1bmMpaW50X2NvbXBhcmUsCQkJLyogdHBfY29tcGFyZSAqLwotCShyZXByZnVuYylpbnRfcmVwciwJCQkvKiB0cF9yZXByICovCi0JJmludF9hc19udW1iZXIsCQkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JKGhhc2hmdW5jKWludF9oYXNoLAkJCS8qIHRwX2hhc2ggKi8KLSAgICAgICAgMCwJCQkJCS8qIHRwX2NhbGwgKi8KLSAgICAgICAgKHJlcHJmdW5jKWludF9yZXByLAkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19DSEVDS1RZUEVTIHwKLQkJUHlfVFBGTEFHU19CQVNFVFlQRSB8IFB5X1RQRkxBR1NfSU5UX1NVQkNMQVNTLAkvKiB0cF9mbGFncyAqLwotCWludF9kb2MsCQkJCS8qIHRwX2RvYyAqLwotCTAsCQkJCQkvKiB0cF90cmF2ZXJzZSAqLwotCTAsCQkJCQkvKiB0cF9jbGVhciAqLwotCTAsCQkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCTAsCQkJCQkvKiB0cF9pdGVyICovCi0JMCwJCQkJCS8qIHRwX2l0ZXJuZXh0ICovCi0JaW50X21ldGhvZHMsCQkJCS8qIHRwX21ldGhvZHMgKi8KLQkwLAkJCQkJLyogdHBfbWVtYmVycyAqLwotCWludF9nZXRzZXQsCQkJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJCS8qIHRwX2RpY3QgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2luaXQgKi8KLQkwLAkJCQkJLyogdHBfYWxsb2MgKi8KLQlpbnRfbmV3LAkJCQkvKiB0cF9uZXcgKi8KLQkoZnJlZWZ1bmMpaW50X2ZyZWUsICAgICAgICAgICAJCS8qIHRwX2ZyZWUgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQorICAgICJpbnQiLAorICAgIHNpemVvZihQeUludE9iamVjdCksCisgICAgMCwKKyAgICAoZGVzdHJ1Y3RvcilpbnRfZGVhbGxvYywgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAocHJpbnRmdW5jKWludF9wcmludCwgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgKGNtcGZ1bmMpaW50X2NvbXBhcmUsICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgKHJlcHJmdW5jKWludF9yZXByLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgJmludF9hc19udW1iZXIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKWludF9oYXNoLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgKHJlcHJmdW5jKWludF9yZXByLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19DSEVDS1RZUEVTIHwKKyAgICAgICAgUHlfVFBGTEFHU19CQVNFVFlQRSB8IFB5X1RQRkxBR1NfSU5UX1NVQkNMQVNTLCAgICAgICAgICAvKiB0cF9mbGFncyAqLworICAgIGludF9kb2MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICBpbnRfbWV0aG9kcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICBpbnRfZ2V0c2V0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgaW50X25ldywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICAoZnJlZWZ1bmMpaW50X2ZyZWUsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KIH07CiAKIGludAogX1B5SW50X0luaXQodm9pZCkKIHsKLQlQeUludE9iamVjdCAqdjsKLQlpbnQgaXZhbDsKKyAgICBQeUludE9iamVjdCAqdjsKKyAgICBpbnQgaXZhbDsKICNpZiBOU01BTExORUdJTlRTICsgTlNNQUxMUE9TSU5UUyA+IDAKLQlmb3IgKGl2YWwgPSAtTlNNQUxMTkVHSU5UUzsgaXZhbCA8IE5TTUFMTFBPU0lOVFM7IGl2YWwrKykgewotICAgICAgICAgICAgICBpZiAoIWZyZWVfbGlzdCAmJiAoZnJlZV9saXN0ID0gZmlsbF9mcmVlX2xpc3QoKSkgPT0gTlVMTCkKLQkJCXJldHVybiAwOwotCQkvKiBQeU9iamVjdF9OZXcgaXMgaW5saW5lZCAqLwotCQl2ID0gZnJlZV9saXN0OwotCQlmcmVlX2xpc3QgPSAoUHlJbnRPYmplY3QgKilQeV9UWVBFKHYpOwotCQlQeU9iamVjdF9JTklUKHYsICZQeUludF9UeXBlKTsKLQkJdi0+b2JfaXZhbCA9IGl2YWw7Ci0JCXNtYWxsX2ludHNbaXZhbCArIE5TTUFMTE5FR0lOVFNdID0gdjsKLQl9CisgICAgZm9yIChpdmFsID0gLU5TTUFMTE5FR0lOVFM7IGl2YWwgPCBOU01BTExQT1NJTlRTOyBpdmFsKyspIHsKKyAgICAgICAgICBpZiAoIWZyZWVfbGlzdCAmJiAoZnJlZV9saXN0ID0gZmlsbF9mcmVlX2xpc3QoKSkgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIC8qIFB5T2JqZWN0X05ldyBpcyBpbmxpbmVkICovCisgICAgICAgIHYgPSBmcmVlX2xpc3Q7CisgICAgICAgIGZyZWVfbGlzdCA9IChQeUludE9iamVjdCAqKVB5X1RZUEUodik7CisgICAgICAgIFB5T2JqZWN0X0lOSVQodiwgJlB5SW50X1R5cGUpOworICAgICAgICB2LT5vYl9pdmFsID0gaXZhbDsKKyAgICAgICAgc21hbGxfaW50c1tpdmFsICsgTlNNQUxMTkVHSU5UU10gPSB2OworICAgIH0KICNlbmRpZgotCXJldHVybiAxOworICAgIHJldHVybiAxOwogfQogCiBpbnQKIFB5SW50X0NsZWFyRnJlZUxpc3Qodm9pZCkKIHsKLQlQeUludE9iamVjdCAqcDsKLQlQeUludEJsb2NrICpsaXN0LCAqbmV4dDsKLQlpbnQgaTsKLQlpbnQgdTsJCQkvKiByZW1haW5pbmcgdW5mcmVlZCBpbnRzIHBlciBibG9jayAqLwotCWludCBmcmVlbGlzdF9zaXplID0gMDsKKyAgICBQeUludE9iamVjdCAqcDsKKyAgICBQeUludEJsb2NrICpsaXN0LCAqbmV4dDsKKyAgICBpbnQgaTsKKyAgICBpbnQgdTsgICAgICAgICAgICAgICAgICAgICAgLyogcmVtYWluaW5nIHVuZnJlZWQgaW50cyBwZXIgYmxvY2sgKi8KKyAgICBpbnQgZnJlZWxpc3Rfc2l6ZSA9IDA7CiAKLQlsaXN0ID0gYmxvY2tfbGlzdDsKLQlibG9ja19saXN0ID0gTlVMTDsKLQlmcmVlX2xpc3QgPSBOVUxMOwotCXdoaWxlIChsaXN0ICE9IE5VTEwpIHsKLQkJdSA9IDA7Ci0JCWZvciAoaSA9IDAsIHAgPSAmbGlzdC0+b2JqZWN0c1swXTsKLQkJICAgICBpIDwgTl9JTlRPQkpFQ1RTOwotCQkgICAgIGkrKywgcCsrKSB7Ci0JCQlpZiAoUHlJbnRfQ2hlY2tFeGFjdChwKSAmJiBwLT5vYl9yZWZjbnQgIT0gMCkKLQkJCQl1Kys7Ci0JCX0KLQkJbmV4dCA9IGxpc3QtPm5leHQ7Ci0JCWlmICh1KSB7Ci0JCQlsaXN0LT5uZXh0ID0gYmxvY2tfbGlzdDsKLQkJCWJsb2NrX2xpc3QgPSBsaXN0OwotCQkJZm9yIChpID0gMCwgcCA9ICZsaXN0LT5vYmplY3RzWzBdOwotCQkJICAgICBpIDwgTl9JTlRPQkpFQ1RTOwotCQkJICAgICBpKyssIHArKykgewotCQkJCWlmICghUHlJbnRfQ2hlY2tFeGFjdChwKSB8fAotCQkJCSAgICBwLT5vYl9yZWZjbnQgPT0gMCkgewotCQkJCQlQeV9UWVBFKHApID0gKHN0cnVjdCBfdHlwZW9iamVjdCAqKQotCQkJCQkJZnJlZV9saXN0OwotCQkJCQlmcmVlX2xpc3QgPSBwOwotCQkJCX0KKyAgICBsaXN0ID0gYmxvY2tfbGlzdDsKKyAgICBibG9ja19saXN0ID0gTlVMTDsKKyAgICBmcmVlX2xpc3QgPSBOVUxMOworICAgIHdoaWxlIChsaXN0ICE9IE5VTEwpIHsKKyAgICAgICAgdSA9IDA7CisgICAgICAgIGZvciAoaSA9IDAsIHAgPSAmbGlzdC0+b2JqZWN0c1swXTsKKyAgICAgICAgICAgICBpIDwgTl9JTlRPQkpFQ1RTOworICAgICAgICAgICAgIGkrKywgcCsrKSB7CisgICAgICAgICAgICBpZiAoUHlJbnRfQ2hlY2tFeGFjdChwKSAmJiBwLT5vYl9yZWZjbnQgIT0gMCkKKyAgICAgICAgICAgICAgICB1Kys7CisgICAgICAgIH0KKyAgICAgICAgbmV4dCA9IGxpc3QtPm5leHQ7CisgICAgICAgIGlmICh1KSB7CisgICAgICAgICAgICBsaXN0LT5uZXh0ID0gYmxvY2tfbGlzdDsKKyAgICAgICAgICAgIGJsb2NrX2xpc3QgPSBsaXN0OworICAgICAgICAgICAgZm9yIChpID0gMCwgcCA9ICZsaXN0LT5vYmplY3RzWzBdOworICAgICAgICAgICAgICAgICBpIDwgTl9JTlRPQkpFQ1RTOworICAgICAgICAgICAgICAgICBpKyssIHArKykgeworICAgICAgICAgICAgICAgIGlmICghUHlJbnRfQ2hlY2tFeGFjdChwKSB8fAorICAgICAgICAgICAgICAgICAgICBwLT5vYl9yZWZjbnQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBQeV9UWVBFKHApID0gKHN0cnVjdCBfdHlwZW9iamVjdCAqKQorICAgICAgICAgICAgICAgICAgICAgICAgZnJlZV9saXN0OworICAgICAgICAgICAgICAgICAgICBmcmVlX2xpc3QgPSBwOworICAgICAgICAgICAgICAgIH0KICNpZiBOU01BTExORUdJTlRTICsgTlNNQUxMUE9TSU5UUyA+IDAKLQkJCQllbHNlIGlmICgtTlNNQUxMTkVHSU5UUyA8PSBwLT5vYl9pdmFsICYmCi0JCQkJCSBwLT5vYl9pdmFsIDwgTlNNQUxMUE9TSU5UUyAmJgotCQkJCQkgc21hbGxfaW50c1twLT5vYl9pdmFsICsKLQkJCQkJCSAgICBOU01BTExORUdJTlRTXSA9PSBOVUxMKSB7Ci0JCQkJCVB5X0lOQ1JFRihwKTsKLQkJCQkJc21hbGxfaW50c1twLT5vYl9pdmFsICsKLQkJCQkJCSAgIE5TTUFMTE5FR0lOVFNdID0gcDsKLQkJCQl9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoLU5TTUFMTE5FR0lOVFMgPD0gcC0+b2JfaXZhbCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgIHAtPm9iX2l2YWwgPCBOU01BTExQT1NJTlRTICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgc21hbGxfaW50c1twLT5vYl9pdmFsICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TTUFMTE5FR0lOVFNdID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgUHlfSU5DUkVGKHApOworICAgICAgICAgICAgICAgICAgICBzbWFsbF9pbnRzW3AtPm9iX2l2YWwgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TTUFMTE5FR0lOVFNdID0gcDsKKyAgICAgICAgICAgICAgICB9CiAjZW5kaWYKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCVB5TWVtX0ZSRUUobGlzdCk7Ci0JCX0KLQkJZnJlZWxpc3Rfc2l6ZSArPSB1OwotCQlsaXN0ID0gbmV4dDsKLQl9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBQeU1lbV9GUkVFKGxpc3QpOworICAgICAgICB9CisgICAgICAgIGZyZWVsaXN0X3NpemUgKz0gdTsKKyAgICAgICAgbGlzdCA9IG5leHQ7CisgICAgfQogCi0JcmV0dXJuIGZyZWVsaXN0X3NpemU7CisgICAgcmV0dXJuIGZyZWVsaXN0X3NpemU7CiB9CiAKIHZvaWQKIFB5SW50X0Zpbmkodm9pZCkKIHsKLQlQeUludE9iamVjdCAqcDsKLQlQeUludEJsb2NrICpsaXN0OwotCWludCBpOwotCWludCB1OwkJCS8qIHRvdGFsIHVuZnJlZWQgaW50cyBwZXIgYmxvY2sgKi8KKyAgICBQeUludE9iamVjdCAqcDsKKyAgICBQeUludEJsb2NrICpsaXN0OworICAgIGludCBpOworICAgIGludCB1OyAgICAgICAgICAgICAgICAgICAgICAvKiB0b3RhbCB1bmZyZWVkIGludHMgcGVyIGJsb2NrICovCiAKICNpZiBOU01BTExORUdJTlRTICsgTlNNQUxMUE9TSU5UUyA+IDAKLQlQeUludE9iamVjdCAqKnE7CisgICAgUHlJbnRPYmplY3QgKipxOwogCi0JaSA9IE5TTUFMTE5FR0lOVFMgKyBOU01BTExQT1NJTlRTOwotCXEgPSBzbWFsbF9pbnRzOwotCXdoaWxlICgtLWkgPj0gMCkgewotCQlQeV9YREVDUkVGKCpxKTsKLQkJKnErKyA9IE5VTEw7Ci0JfQorICAgIGkgPSBOU01BTExORUdJTlRTICsgTlNNQUxMUE9TSU5UUzsKKyAgICBxID0gc21hbGxfaW50czsKKyAgICB3aGlsZSAoLS1pID49IDApIHsKKyAgICAgICAgUHlfWERFQ1JFRigqcSk7CisgICAgICAgICpxKysgPSBOVUxMOworICAgIH0KICNlbmRpZgotCXUgPSBQeUludF9DbGVhckZyZWVMaXN0KCk7Ci0JaWYgKCFQeV9WZXJib3NlRmxhZykKLQkJcmV0dXJuOwotCWZwcmludGYoc3RkZXJyLCAiIyBjbGVhbnVwIGludHMiKTsKLQlpZiAoIXUpIHsKLQkJZnByaW50ZihzdGRlcnIsICJcbiIpOwotCX0KLQllbHNlIHsKLQkJZnByaW50ZihzdGRlcnIsCi0JCQkiOiAlZCB1bmZyZWVkIGludCVzXG4iLAotCQkJdSwgdSA9PSAxID8gIiIgOiAicyIpOwotCX0KLQlpZiAoUHlfVmVyYm9zZUZsYWcgPiAxKSB7Ci0JCWxpc3QgPSBibG9ja19saXN0OwotCQl3aGlsZSAobGlzdCAhPSBOVUxMKSB7Ci0JCQlmb3IgKGkgPSAwLCBwID0gJmxpc3QtPm9iamVjdHNbMF07Ci0JCQkgICAgIGkgPCBOX0lOVE9CSkVDVFM7Ci0JCQkgICAgIGkrKywgcCsrKSB7Ci0JCQkJaWYgKFB5SW50X0NoZWNrRXhhY3QocCkgJiYgcC0+b2JfcmVmY250ICE9IDApCi0JCQkJCS8qIFhYWCh0d291dGVycykgY2FzdCByZWZjb3VudCB0bwotCQkJCQkgICBsb25nIHVudGlsICV6ZCBpcyB1bml2ZXJzYWxseQotCQkJCQkgICBhdmFpbGFibGUKLQkJCQkJICovCi0JCQkJCWZwcmludGYoc3RkZXJyLAotCQkJCSIjICAgPGludCBhdCAlcCwgcmVmY250PSVsZCwgdmFsPSVsZD5cbiIsCi0JCQkJCQlwLCAobG9uZylwLT5vYl9yZWZjbnQsCi0JCQkJCQlwLT5vYl9pdmFsKTsKLQkJCX0KLQkJCWxpc3QgPSBsaXN0LT5uZXh0OwotCQl9Ci0JfQorICAgIHUgPSBQeUludF9DbGVhckZyZWVMaXN0KCk7CisgICAgaWYgKCFQeV9WZXJib3NlRmxhZykKKyAgICAgICAgcmV0dXJuOworICAgIGZwcmludGYoc3RkZXJyLCAiIyBjbGVhbnVwIGludHMiKTsKKyAgICBpZiAoIXUpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJcbiIpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAiOiAlZCB1bmZyZWVkIGludCVzXG4iLAorICAgICAgICAgICAgdSwgdSA9PSAxID8gIiIgOiAicyIpOworICAgIH0KKyAgICBpZiAoUHlfVmVyYm9zZUZsYWcgPiAxKSB7CisgICAgICAgIGxpc3QgPSBibG9ja19saXN0OworICAgICAgICB3aGlsZSAobGlzdCAhPSBOVUxMKSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwLCBwID0gJmxpc3QtPm9iamVjdHNbMF07CisgICAgICAgICAgICAgICAgIGkgPCBOX0lOVE9CSkVDVFM7CisgICAgICAgICAgICAgICAgIGkrKywgcCsrKSB7CisgICAgICAgICAgICAgICAgaWYgKFB5SW50X0NoZWNrRXhhY3QocCkgJiYgcC0+b2JfcmVmY250ICE9IDApCisgICAgICAgICAgICAgICAgICAgIC8qIFhYWCh0d291dGVycykgY2FzdCByZWZjb3VudCB0bworICAgICAgICAgICAgICAgICAgICAgICBsb25nIHVudGlsICV6ZCBpcyB1bml2ZXJzYWxseQorICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGUKKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgICAgICIjICAgPGludCBhdCAlcCwgcmVmY250PSVsZCwgdmFsPSVsZD5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAsIChsb25nKXAtPm9iX3JlZmNudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+b2JfaXZhbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsaXN0ID0gbGlzdC0+bmV4dDsKKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL09iamVjdHMvaXRlcm9iamVjdC5jIGIvT2JqZWN0cy9pdGVyb2JqZWN0LmMKaW5kZXggOWNlYmFjOS4uNWE5YTJkZCAxMDA2NDQKLS0tIGEvT2JqZWN0cy9pdGVyb2JqZWN0LmMKKysrIGIvT2JqZWN0cy9pdGVyb2JqZWN0LmMKQEAgLTMsMjI4ICszLDIyOCBAQAogI2luY2x1ZGUgIlB5dGhvbi5oIgogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCWxvbmcgICAgICBpdF9pbmRleDsKLQlQeU9iamVjdCAqaXRfc2VxOyAvKiBTZXQgdG8gTlVMTCB3aGVuIGl0ZXJhdG9yIGlzIGV4aGF1c3RlZCAqLworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBsb25nICAgICAgaXRfaW5kZXg7CisgICAgUHlPYmplY3QgKml0X3NlcTsgLyogU2V0IHRvIE5VTEwgd2hlbiBpdGVyYXRvciBpcyBleGhhdXN0ZWQgKi8KIH0gc2VxaXRlcm9iamVjdDsKIAogUHlPYmplY3QgKgogUHlTZXFJdGVyX05ldyhQeU9iamVjdCAqc2VxKQogewotCXNlcWl0ZXJvYmplY3QgKml0OworICAgIHNlcWl0ZXJvYmplY3QgKml0OwogCi0JaWYgKCFQeVNlcXVlbmNlX0NoZWNrKHNlcSkpIHsKLQkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0JCXJldHVybiBOVUxMOwotCX0JCi0JaXQgPSBQeU9iamVjdF9HQ19OZXcoc2VxaXRlcm9iamVjdCwgJlB5U2VxSXRlcl9UeXBlKTsKLQlpZiAoaXQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JaXQtPml0X2luZGV4ID0gMDsKLQlQeV9JTkNSRUYoc2VxKTsKLQlpdC0+aXRfc2VxID0gc2VxOwotCV9QeU9iamVjdF9HQ19UUkFDSyhpdCk7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIGlmICghUHlTZXF1ZW5jZV9DaGVjayhzZXEpKSB7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaXQgPSBQeU9iamVjdF9HQ19OZXcoc2VxaXRlcm9iamVjdCwgJlB5U2VxSXRlcl9UeXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaXQtPml0X2luZGV4ID0gMDsKKyAgICBQeV9JTkNSRUYoc2VxKTsKKyAgICBpdC0+aXRfc2VxID0gc2VxOworICAgIF9QeU9iamVjdF9HQ19UUkFDSyhpdCk7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogCiBzdGF0aWMgdm9pZAogaXRlcl9kZWFsbG9jKHNlcWl0ZXJvYmplY3QgKml0KQogewotCV9QeU9iamVjdF9HQ19VTlRSQUNLKGl0KTsKLQlQeV9YREVDUkVGKGl0LT5pdF9zZXEpOwotCVB5T2JqZWN0X0dDX0RlbChpdCk7CisgICAgX1B5T2JqZWN0X0dDX1VOVFJBQ0soaXQpOworICAgIFB5X1hERUNSRUYoaXQtPml0X3NlcSk7CisgICAgUHlPYmplY3RfR0NfRGVsKGl0KTsKIH0KIAogc3RhdGljIGludAogaXRlcl90cmF2ZXJzZShzZXFpdGVyb2JqZWN0ICppdCwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JUHlfVklTSVQoaXQtPml0X3NlcSk7Ci0JcmV0dXJuIDA7CisgICAgUHlfVklTSVQoaXQtPml0X3NlcSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpdGVyX2l0ZXJuZXh0KFB5T2JqZWN0ICppdGVyYXRvcikKIHsKLQlzZXFpdGVyb2JqZWN0ICppdDsKLQlQeU9iamVjdCAqc2VxOwotCVB5T2JqZWN0ICpyZXN1bHQ7CisgICAgc2VxaXRlcm9iamVjdCAqaXQ7CisgICAgUHlPYmplY3QgKnNlcTsKKyAgICBQeU9iamVjdCAqcmVzdWx0OwogCi0JYXNzZXJ0KFB5U2VxSXRlcl9DaGVjayhpdGVyYXRvcikpOwotCWl0ID0gKHNlcWl0ZXJvYmplY3QgKilpdGVyYXRvcjsKLQlzZXEgPSBpdC0+aXRfc2VxOwotCWlmIChzZXEgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgYXNzZXJ0KFB5U2VxSXRlcl9DaGVjayhpdGVyYXRvcikpOworICAgIGl0ID0gKHNlcWl0ZXJvYmplY3QgKilpdGVyYXRvcjsKKyAgICBzZXEgPSBpdC0+aXRfc2VxOworICAgIGlmIChzZXEgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlyZXN1bHQgPSBQeVNlcXVlbmNlX0dldEl0ZW0oc2VxLCBpdC0+aXRfaW5kZXgpOwotCWlmIChyZXN1bHQgIT0gTlVMTCkgewotCQlpdC0+aXRfaW5kZXgrKzsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfSW5kZXhFcnJvcikgfHwKLQkgICAgUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19TdG9wSXRlcmF0aW9uKSkKLQl7Ci0JCVB5RXJyX0NsZWFyKCk7Ci0JCVB5X0RFQ1JFRihzZXEpOwotCQlpdC0+aXRfc2VxID0gTlVMTDsKLQl9Ci0JcmV0dXJuIE5VTEw7CisgICAgcmVzdWx0ID0gUHlTZXF1ZW5jZV9HZXRJdGVtKHNlcSwgaXQtPml0X2luZGV4KTsKKyAgICBpZiAocmVzdWx0ICE9IE5VTEwpIHsKKyAgICAgICAgaXQtPml0X2luZGV4Kys7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIGlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0luZGV4RXJyb3IpIHx8CisgICAgICAgIFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfU3RvcEl0ZXJhdGlvbikpCisgICAgeworICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBQeV9ERUNSRUYoc2VxKTsKKyAgICAgICAgaXQtPml0X3NlcSA9IE5VTEw7CisgICAgfQorICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaXRlcl9sZW4oc2VxaXRlcm9iamVjdCAqaXQpCiB7Ci0JUHlfc3NpemVfdCBzZXFzaXplLCBsZW47CisgICAgUHlfc3NpemVfdCBzZXFzaXplLCBsZW47CiAKLQlpZiAoaXQtPml0X3NlcSkgewotCQlzZXFzaXplID0gUHlTZXF1ZW5jZV9TaXplKGl0LT5pdF9zZXEpOwotCQlpZiAoc2Vxc2l6ZSA9PSAtMSkKLQkJCXJldHVybiBOVUxMOwotCQlsZW4gPSBzZXFzaXplIC0gaXQtPml0X2luZGV4OwotCQlpZiAobGVuID49IDApCi0JCQlyZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QobGVuKTsKLQl9Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKDApOworICAgIGlmIChpdC0+aXRfc2VxKSB7CisgICAgICAgIHNlcXNpemUgPSBQeVNlcXVlbmNlX1NpemUoaXQtPml0X3NlcSk7CisgICAgICAgIGlmIChzZXFzaXplID09IC0xKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGxlbiA9IHNlcXNpemUgLSBpdC0+aXRfaW5kZXg7CisgICAgICAgIGlmIChsZW4gPj0gMCkKKyAgICAgICAgICAgIHJldHVybiBQeUludF9Gcm9tU3NpemVfdChsZW4pOworICAgIH0KKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoMCk7CiB9CiAKIFB5RG9jX1NUUlZBUihsZW5ndGhfaGludF9kb2MsICJQcml2YXRlIG1ldGhvZCByZXR1cm5pbmcgYW4gZXN0aW1hdGUgb2YgbGVuKGxpc3QoaXQpKS4iKTsKIAogc3RhdGljIFB5TWV0aG9kRGVmIHNlcWl0ZXJfbWV0aG9kc1tdID0gewotCXsiX19sZW5ndGhfaGludF9fIiwgKFB5Q0Z1bmN0aW9uKWl0ZXJfbGVuLCBNRVRIX05PQVJHUywgbGVuZ3RoX2hpbnRfZG9jfSwKLSAJe05VTEwsCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7Il9fbGVuZ3RoX2hpbnRfXyIsIChQeUNGdW5jdGlvbilpdGVyX2xlbiwgTUVUSF9OT0FSR1MsIGxlbmd0aF9oaW50X2RvY30sCisgICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIFB5VHlwZU9iamVjdCBQeVNlcUl0ZXJfVHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQotCSJpdGVyYXRvciIsCQkJCS8qIHRwX25hbWUgKi8KLQlzaXplb2Yoc2VxaXRlcm9iamVjdCksCQkJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJCS8qIHRwX2l0ZW1zaXplICovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKWl0ZXJfZGVhbGxvYywgCQkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9jb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDLC8qIHRwX2ZsYWdzICovCi0gCTAsCQkJCQkvKiB0cF9kb2MgKi8KLSAJKHRyYXZlcnNlcHJvYylpdGVyX3RyYXZlcnNlLAkJLyogdHBfdHJhdmVyc2UgKi8KLSAJMCwJCQkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JUHlPYmplY3RfU2VsZkl0ZXIsCQkJLyogdHBfaXRlciAqLwotCWl0ZXJfaXRlcm5leHQsCQkJCS8qIHRwX2l0ZXJuZXh0ICovCi0Jc2VxaXRlcl9tZXRob2RzLAkJCS8qIHRwX21ldGhvZHMgKi8KLQkwLAkJCQkJLyogdHBfbWVtYmVycyAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCisgICAgIml0ZXJhdG9yIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCisgICAgc2l6ZW9mKHNlcWl0ZXJvYmplY3QpLCAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKWl0ZXJfZGVhbGxvYywgICAgICAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2MpaXRlcl90cmF2ZXJzZSwgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICBQeU9iamVjdF9TZWxmSXRlciwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICBpdGVyX2l0ZXJuZXh0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgc2VxaXRlcl9tZXRob2RzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCVB5T2JqZWN0ICppdF9jYWxsYWJsZTsgLyogU2V0IHRvIE5VTEwgd2hlbiBpdGVyYXRvciBpcyBleGhhdXN0ZWQgKi8KLQlQeU9iamVjdCAqaXRfc2VudGluZWw7IC8qIFNldCB0byBOVUxMIHdoZW4gaXRlcmF0b3IgaXMgZXhoYXVzdGVkICovCisgICAgUHlPYmplY3RfSEVBRAorICAgIFB5T2JqZWN0ICppdF9jYWxsYWJsZTsgLyogU2V0IHRvIE5VTEwgd2hlbiBpdGVyYXRvciBpcyBleGhhdXN0ZWQgKi8KKyAgICBQeU9iamVjdCAqaXRfc2VudGluZWw7IC8qIFNldCB0byBOVUxMIHdoZW4gaXRlcmF0b3IgaXMgZXhoYXVzdGVkICovCiB9IGNhbGxpdGVyb2JqZWN0OwogCiBQeU9iamVjdCAqCiBQeUNhbGxJdGVyX05ldyhQeU9iamVjdCAqY2FsbGFibGUsIFB5T2JqZWN0ICpzZW50aW5lbCkKIHsKLQljYWxsaXRlcm9iamVjdCAqaXQ7Ci0JaXQgPSBQeU9iamVjdF9HQ19OZXcoY2FsbGl0ZXJvYmplY3QsICZQeUNhbGxJdGVyX1R5cGUpOwotCWlmIChpdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlQeV9JTkNSRUYoY2FsbGFibGUpOwotCWl0LT5pdF9jYWxsYWJsZSA9IGNhbGxhYmxlOwotCVB5X0lOQ1JFRihzZW50aW5lbCk7Ci0JaXQtPml0X3NlbnRpbmVsID0gc2VudGluZWw7Ci0JX1B5T2JqZWN0X0dDX1RSQUNLKGl0KTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgY2FsbGl0ZXJvYmplY3QgKml0OworICAgIGl0ID0gUHlPYmplY3RfR0NfTmV3KGNhbGxpdGVyb2JqZWN0LCAmUHlDYWxsSXRlcl9UeXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfSU5DUkVGKGNhbGxhYmxlKTsKKyAgICBpdC0+aXRfY2FsbGFibGUgPSBjYWxsYWJsZTsKKyAgICBQeV9JTkNSRUYoc2VudGluZWwpOworICAgIGl0LT5pdF9zZW50aW5lbCA9IHNlbnRpbmVsOworICAgIF9QeU9iamVjdF9HQ19UUkFDSyhpdCk7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogc3RhdGljIHZvaWQKIGNhbGxpdGVyX2RlYWxsb2MoY2FsbGl0ZXJvYmplY3QgKml0KQogewotCV9QeU9iamVjdF9HQ19VTlRSQUNLKGl0KTsKLQlQeV9YREVDUkVGKGl0LT5pdF9jYWxsYWJsZSk7Ci0JUHlfWERFQ1JFRihpdC0+aXRfc2VudGluZWwpOwotCVB5T2JqZWN0X0dDX0RlbChpdCk7CisgICAgX1B5T2JqZWN0X0dDX1VOVFJBQ0soaXQpOworICAgIFB5X1hERUNSRUYoaXQtPml0X2NhbGxhYmxlKTsKKyAgICBQeV9YREVDUkVGKGl0LT5pdF9zZW50aW5lbCk7CisgICAgUHlPYmplY3RfR0NfRGVsKGl0KTsKIH0KIAogc3RhdGljIGludAogY2FsbGl0ZXJfdHJhdmVyc2UoY2FsbGl0ZXJvYmplY3QgKml0LCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlQeV9WSVNJVChpdC0+aXRfY2FsbGFibGUpOwotCVB5X1ZJU0lUKGl0LT5pdF9zZW50aW5lbCk7Ci0JcmV0dXJuIDA7CisgICAgUHlfVklTSVQoaXQtPml0X2NhbGxhYmxlKTsKKyAgICBQeV9WSVNJVChpdC0+aXRfc2VudGluZWwpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY2FsbGl0ZXJfaXRlcm5leHQoY2FsbGl0ZXJvYmplY3QgKml0KQogewotCWlmIChpdC0+aXRfY2FsbGFibGUgIT0gTlVMTCkgewotCQlQeU9iamVjdCAqYXJncyA9IFB5VHVwbGVfTmV3KDApOwotCQlQeU9iamVjdCAqcmVzdWx0OwotCQlpZiAoYXJncyA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCXJlc3VsdCA9IFB5T2JqZWN0X0NhbGwoaXQtPml0X2NhbGxhYmxlLCBhcmdzLCBOVUxMKTsKLQkJUHlfREVDUkVGKGFyZ3MpOwotCQlpZiAocmVzdWx0ICE9IE5VTEwpIHsKLQkJCWludCBvazsKLQkJCW9rID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKHJlc3VsdCwKLQkJCQkJCSAgICAgIGl0LT5pdF9zZW50aW5lbCwKLQkJCQkJCSAgICAgIFB5X0VRKTsKLQkJCWlmIChvayA9PSAwKQotCQkJCXJldHVybiByZXN1bHQ7IC8qIENvbW1vbiBjYXNlLCBmYXN0IHBhdGggKi8KLQkJCVB5X0RFQ1JFRihyZXN1bHQpOwotCQkJaWYgKG9rID4gMCkgewotCQkJCVB5X0NMRUFSKGl0LT5pdF9jYWxsYWJsZSk7Ci0JCQkJUHlfQ0xFQVIoaXQtPml0X3NlbnRpbmVsKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1N0b3BJdGVyYXRpb24pKSB7Ci0JCQlQeUVycl9DbGVhcigpOwotCQkJUHlfQ0xFQVIoaXQtPml0X2NhbGxhYmxlKTsKLQkJCVB5X0NMRUFSKGl0LT5pdF9zZW50aW5lbCk7Ci0JCX0KLQl9Ci0JcmV0dXJuIE5VTEw7CisgICAgaWYgKGl0LT5pdF9jYWxsYWJsZSAhPSBOVUxMKSB7CisgICAgICAgIFB5T2JqZWN0ICphcmdzID0gUHlUdXBsZV9OZXcoMCk7CisgICAgICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisgICAgICAgIGlmIChhcmdzID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgcmVzdWx0ID0gUHlPYmplY3RfQ2FsbChpdC0+aXRfY2FsbGFibGUsIGFyZ3MsIE5VTEwpOworICAgICAgICBQeV9ERUNSRUYoYXJncyk7CisgICAgICAgIGlmIChyZXN1bHQgIT0gTlVMTCkgeworICAgICAgICAgICAgaW50IG9rOworICAgICAgICAgICAgb2sgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2wocmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQtPml0X3NlbnRpbmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfRVEpOworICAgICAgICAgICAgaWYgKG9rID09IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsgLyogQ29tbW9uIGNhc2UsIGZhc3QgcGF0aCAqLworICAgICAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgICAgICBpZiAob2sgPiAwKSB7CisgICAgICAgICAgICAgICAgUHlfQ0xFQVIoaXQtPml0X2NhbGxhYmxlKTsKKyAgICAgICAgICAgICAgICBQeV9DTEVBUihpdC0+aXRfc2VudGluZWwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfU3RvcEl0ZXJhdGlvbikpIHsKKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICBQeV9DTEVBUihpdC0+aXRfY2FsbGFibGUpOworICAgICAgICAgICAgUHlfQ0xFQVIoaXQtPml0X3NlbnRpbmVsKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTlVMTDsKIH0KIAogUHlUeXBlT2JqZWN0IFB5Q2FsbEl0ZXJfVHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQotCSJjYWxsYWJsZS1pdGVyYXRvciIsCQkJLyogdHBfbmFtZSAqLwotCXNpemVvZihjYWxsaXRlcm9iamVjdCksCQkJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJCS8qIHRwX2l0ZW1zaXplICovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKWNhbGxpdGVyX2RlYWxsb2MsIAkJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfY29tcGFyZSAqLwotCTAsCQkJCQkvKiB0cF9yZXByICovCi0JMCwJCQkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJCQkJCS8qIHRwX2hhc2ggKi8KLQkwLAkJCQkJLyogdHBfY2FsbCAqLwotCTAsCQkJCQkvKiB0cF9zdHIgKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQywvKiB0cF9mbGFncyAqLwotCTAsCQkJCQkvKiB0cF9kb2MgKi8KLQkodHJhdmVyc2Vwcm9jKWNhbGxpdGVyX3RyYXZlcnNlLAkvKiB0cF90cmF2ZXJzZSAqLwotCTAsCQkJCQkvKiB0cF9jbGVhciAqLwotCTAsCQkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCVB5T2JqZWN0X1NlbGZJdGVyLAkJCS8qIHRwX2l0ZXIgKi8KLQkoaXRlcm5leHRmdW5jKWNhbGxpdGVyX2l0ZXJuZXh0LAkvKiB0cF9pdGVybmV4dCAqLwotCTAsCQkJCQkvKiB0cF9tZXRob2RzICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKKyAgICAiY2FsbGFibGUtaXRlcmF0b3IiLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICBzaXplb2YoY2FsbGl0ZXJvYmplY3QpLCAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpY2FsbGl0ZXJfZGVhbGxvYywgICAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQywvKiB0cF9mbGFncyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgKHRyYXZlcnNlcHJvYyljYWxsaXRlcl90cmF2ZXJzZSwgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIFB5T2JqZWN0X1NlbGZJdGVyLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIChpdGVybmV4dGZ1bmMpY2FsbGl0ZXJfaXRlcm5leHQsICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KIH07CmRpZmYgLS1naXQgYS9PYmplY3RzL2xpc3RvYmplY3QuYyBiL09iamVjdHMvbGlzdG9iamVjdC5jCmluZGV4IDYxODhiZWMuLmE1YmFjZjMgMTAwNjQ0Ci0tLSBhL09iamVjdHMvbGlzdG9iamVjdC5jCisrKyBiL09iamVjdHMvbGlzdG9iamVjdC5jCkBAIC01LDcgKzUsNyBAQAogI2lmZGVmIFNURENfSEVBREVSUwogI2luY2x1ZGUgPHN0ZGRlZi5oPgogI2Vsc2UKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4JCS8qIEZvciBzaXplX3QgKi8KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4gICAgICAgICAgLyogRm9yIHNpemVfdCAqLwogI2VuZGlmCiAKIC8qIEVuc3VyZSBvYl9pdGVtIGhhcyByb29tIGZvciBhdCBsZWFzdCBuZXdzaXplIGVsZW1lbnRzLCBhbmQgc2V0CkBAIC0yNCw1MiArMjQsNTIgQEAKIHN0YXRpYyBpbnQKIGxpc3RfcmVzaXplKFB5TGlzdE9iamVjdCAqc2VsZiwgUHlfc3NpemVfdCBuZXdzaXplKQogewotCVB5T2JqZWN0ICoqaXRlbXM7Ci0Jc2l6ZV90IG5ld19hbGxvY2F0ZWQ7Ci0JUHlfc3NpemVfdCBhbGxvY2F0ZWQgPSBzZWxmLT5hbGxvY2F0ZWQ7CisgICAgUHlPYmplY3QgKippdGVtczsKKyAgICBzaXplX3QgbmV3X2FsbG9jYXRlZDsKKyAgICBQeV9zc2l6ZV90IGFsbG9jYXRlZCA9IHNlbGYtPmFsbG9jYXRlZDsKIAotCS8qIEJ5cGFzcyByZWFsbG9jKCkgd2hlbiBhIHByZXZpb3VzIG92ZXJhbGxvY2F0aW9uIGlzIGxhcmdlIGVub3VnaAotCSAgIHRvIGFjY29tbW9kYXRlIHRoZSBuZXdzaXplLiAgSWYgdGhlIG5ld3NpemUgZmFsbHMgbG93ZXIgdGhhbiBoYWxmCi0JICAgdGhlIGFsbG9jYXRlZCBzaXplLCB0aGVuIHByb2NlZWQgd2l0aCB0aGUgcmVhbGxvYygpIHRvIHNocmluayB0aGUgbGlzdC4KLQkqLwotCWlmIChhbGxvY2F0ZWQgPj0gbmV3c2l6ZSAmJiBuZXdzaXplID49IChhbGxvY2F0ZWQgPj4gMSkpIHsKLQkJYXNzZXJ0KHNlbGYtPm9iX2l0ZW0gIT0gTlVMTCB8fCBuZXdzaXplID09IDApOwotCQlQeV9TSVpFKHNlbGYpID0gbmV3c2l6ZTsKLQkJcmV0dXJuIDA7Ci0JfQorICAgIC8qIEJ5cGFzcyByZWFsbG9jKCkgd2hlbiBhIHByZXZpb3VzIG92ZXJhbGxvY2F0aW9uIGlzIGxhcmdlIGVub3VnaAorICAgICAgIHRvIGFjY29tbW9kYXRlIHRoZSBuZXdzaXplLiAgSWYgdGhlIG5ld3NpemUgZmFsbHMgbG93ZXIgdGhhbiBoYWxmCisgICAgICAgdGhlIGFsbG9jYXRlZCBzaXplLCB0aGVuIHByb2NlZWQgd2l0aCB0aGUgcmVhbGxvYygpIHRvIHNocmluayB0aGUgbGlzdC4KKyAgICAqLworICAgIGlmIChhbGxvY2F0ZWQgPj0gbmV3c2l6ZSAmJiBuZXdzaXplID49IChhbGxvY2F0ZWQgPj4gMSkpIHsKKyAgICAgICAgYXNzZXJ0KHNlbGYtPm9iX2l0ZW0gIT0gTlVMTCB8fCBuZXdzaXplID09IDApOworICAgICAgICBQeV9TSVpFKHNlbGYpID0gbmV3c2l6ZTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCi0JLyogVGhpcyBvdmVyLWFsbG9jYXRlcyBwcm9wb3J0aW9uYWwgdG8gdGhlIGxpc3Qgc2l6ZSwgbWFraW5nIHJvb20KLQkgKiBmb3IgYWRkaXRpb25hbCBncm93dGguICBUaGUgb3Zlci1hbGxvY2F0aW9uIGlzIG1pbGQsIGJ1dCBpcwotCSAqIGVub3VnaCB0byBnaXZlIGxpbmVhci10aW1lIGFtb3J0aXplZCBiZWhhdmlvciBvdmVyIGEgbG9uZwotCSAqIHNlcXVlbmNlIG9mIGFwcGVuZHMoKSBpbiB0aGUgcHJlc2VuY2Ugb2YgYSBwb29ybHktcGVyZm9ybWluZwotCSAqIHN5c3RlbSByZWFsbG9jKCkuCi0JICogVGhlIGdyb3d0aCBwYXR0ZXJuIGlzOiAgMCwgNCwgOCwgMTYsIDI1LCAzNSwgNDYsIDU4LCA3MiwgODgsIC4uLgotCSAqLwotCW5ld19hbGxvY2F0ZWQgPSAobmV3c2l6ZSA+PiAzKSArIChuZXdzaXplIDwgOSA/IDMgOiA2KTsKKyAgICAvKiBUaGlzIG92ZXItYWxsb2NhdGVzIHByb3BvcnRpb25hbCB0byB0aGUgbGlzdCBzaXplLCBtYWtpbmcgcm9vbQorICAgICAqIGZvciBhZGRpdGlvbmFsIGdyb3d0aC4gIFRoZSBvdmVyLWFsbG9jYXRpb24gaXMgbWlsZCwgYnV0IGlzCisgICAgICogZW5vdWdoIHRvIGdpdmUgbGluZWFyLXRpbWUgYW1vcnRpemVkIGJlaGF2aW9yIG92ZXIgYSBsb25nCisgICAgICogc2VxdWVuY2Ugb2YgYXBwZW5kcygpIGluIHRoZSBwcmVzZW5jZSBvZiBhIHBvb3JseS1wZXJmb3JtaW5nCisgICAgICogc3lzdGVtIHJlYWxsb2MoKS4KKyAgICAgKiBUaGUgZ3Jvd3RoIHBhdHRlcm4gaXM6ICAwLCA0LCA4LCAxNiwgMjUsIDM1LCA0NiwgNTgsIDcyLCA4OCwgLi4uCisgICAgICovCisgICAgbmV3X2FsbG9jYXRlZCA9IChuZXdzaXplID4+IDMpICsgKG5ld3NpemUgPCA5ID8gMyA6IDYpOwogCi0JLyogY2hlY2sgZm9yIGludGVnZXIgb3ZlcmZsb3cgKi8KLQlpZiAobmV3X2FsbG9jYXRlZCA+IFBZX1NJWkVfTUFYIC0gbmV3c2l6ZSkgewotCQlQeUVycl9Ob01lbW9yeSgpOwotCQlyZXR1cm4gLTE7Ci0JfSBlbHNlIHsKLQkJbmV3X2FsbG9jYXRlZCArPSBuZXdzaXplOwotCX0KKyAgICAvKiBjaGVjayBmb3IgaW50ZWdlciBvdmVyZmxvdyAqLworICAgIGlmIChuZXdfYWxsb2NhdGVkID4gUFlfU0laRV9NQVggLSBuZXdzaXplKSB7CisgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9IGVsc2UgeworICAgICAgICBuZXdfYWxsb2NhdGVkICs9IG5ld3NpemU7CisgICAgfQogCi0JaWYgKG5ld3NpemUgPT0gMCkKLQkJbmV3X2FsbG9jYXRlZCA9IDA7Ci0JaXRlbXMgPSBzZWxmLT5vYl9pdGVtOwotCWlmIChuZXdfYWxsb2NhdGVkIDw9ICgofihzaXplX3QpMCkgLyBzaXplb2YoUHlPYmplY3QgKikpKQotCQlQeU1lbV9SRVNJWkUoaXRlbXMsIFB5T2JqZWN0ICosIG5ld19hbGxvY2F0ZWQpOwotCWVsc2UKLQkJaXRlbXMgPSBOVUxMOwotCWlmIChpdGVtcyA9PSBOVUxMKSB7Ci0JCVB5RXJyX05vTWVtb3J5KCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0Jc2VsZi0+b2JfaXRlbSA9IGl0ZW1zOwotCVB5X1NJWkUoc2VsZikgPSBuZXdzaXplOwotCXNlbGYtPmFsbG9jYXRlZCA9IG5ld19hbGxvY2F0ZWQ7Ci0JcmV0dXJuIDA7CisgICAgaWYgKG5ld3NpemUgPT0gMCkKKyAgICAgICAgbmV3X2FsbG9jYXRlZCA9IDA7CisgICAgaXRlbXMgPSBzZWxmLT5vYl9pdGVtOworICAgIGlmIChuZXdfYWxsb2NhdGVkIDw9ICgofihzaXplX3QpMCkgLyBzaXplb2YoUHlPYmplY3QgKikpKQorICAgICAgICBQeU1lbV9SRVNJWkUoaXRlbXMsIFB5T2JqZWN0ICosIG5ld19hbGxvY2F0ZWQpOworICAgIGVsc2UKKyAgICAgICAgaXRlbXMgPSBOVUxMOworICAgIGlmIChpdGVtcyA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgc2VsZi0+b2JfaXRlbSA9IGl0ZW1zOworICAgIFB5X1NJWkUoc2VsZikgPSBuZXdzaXplOworICAgIHNlbGYtPmFsbG9jYXRlZCA9IG5ld19hbGxvY2F0ZWQ7CisgICAgcmV0dXJuIDA7CiB9CiAKIC8qIERlYnVnIHN0YXRpc3RpYyB0byBjb21wYXJlIGFsbG9jYXRpb25zIHdpdGggcmV1c2UgdGhyb3VnaCB0aGUgZnJlZSBsaXN0ICovCkBAIC04MSwxMiArODEsMTIgQEAKIHN0YXRpYyB2b2lkCiBzaG93X2FsbG9jKHZvaWQpCiB7Ci0JZnByaW50ZihzdGRlcnIsICJMaXN0IGFsbG9jYXRpb25zOiAlIiBQWV9GT1JNQVRfU0laRV9UICJkXG4iLAotCQljb3VudF9hbGxvYyk7Ci0JZnByaW50ZihzdGRlcnIsICJMaXN0IHJldXNlIHRocm91Z2ggZnJlZWxpc3Q6ICUiIFBZX0ZPUk1BVF9TSVpFX1QKLQkJImRcbiIsIGNvdW50X3JldXNlKTsKLQlmcHJpbnRmKHN0ZGVyciwgIiUuMmYlJSByZXVzZSByYXRlXG5cbiIsCi0JCSgxMDAuMCpjb3VudF9yZXVzZS8oY291bnRfYWxsb2MrY291bnRfcmV1c2UpKSk7CisgICAgZnByaW50ZihzdGRlcnIsICJMaXN0IGFsbG9jYXRpb25zOiAlIiBQWV9GT1JNQVRfU0laRV9UICJkXG4iLAorICAgICAgICBjb3VudF9hbGxvYyk7CisgICAgZnByaW50ZihzdGRlcnIsICJMaXN0IHJldXNlIHRocm91Z2ggZnJlZWxpc3Q6ICUiIFBZX0ZPUk1BVF9TSVpFX1QKKyAgICAgICAgImRcbiIsIGNvdW50X3JldXNlKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiUuMmYlJSByZXVzZSByYXRlXG5cbiIsCisgICAgICAgICgxMDAuMCpjb3VudF9yZXVzZS8oY291bnRfYWxsb2MrY291bnRfcmV1c2UpKSk7CiB9CiAjZW5kaWYKIApAQCAtMTAwLDc3ICsxMDAsNzcgQEAKIHZvaWQKIFB5TGlzdF9GaW5pKHZvaWQpCiB7Ci0JUHlMaXN0T2JqZWN0ICpvcDsKKyAgICBQeUxpc3RPYmplY3QgKm9wOwogCi0Jd2hpbGUgKG51bWZyZWUpIHsKLQkJb3AgPSBmcmVlX2xpc3RbLS1udW1mcmVlXTsKLQkJYXNzZXJ0KFB5TGlzdF9DaGVja0V4YWN0KG9wKSk7Ci0JCVB5T2JqZWN0X0dDX0RlbChvcCk7Ci0JfQorICAgIHdoaWxlIChudW1mcmVlKSB7CisgICAgICAgIG9wID0gZnJlZV9saXN0Wy0tbnVtZnJlZV07CisgICAgICAgIGFzc2VydChQeUxpc3RfQ2hlY2tFeGFjdChvcCkpOworICAgICAgICBQeU9iamVjdF9HQ19EZWwob3ApOworICAgIH0KIH0KIAogUHlPYmplY3QgKgogUHlMaXN0X05ldyhQeV9zc2l6ZV90IHNpemUpCiB7Ci0JUHlMaXN0T2JqZWN0ICpvcDsKLQlzaXplX3QgbmJ5dGVzOworICAgIFB5TGlzdE9iamVjdCAqb3A7CisgICAgc2l6ZV90IG5ieXRlczsKICNpZmRlZiBTSE9XX0FMTE9DX0NPVU5UCi0Jc3RhdGljIGludCBpbml0aWFsaXplZCA9IDA7Ci0JaWYgKCFpbml0aWFsaXplZCkgewotCQlQeV9BdEV4aXQoc2hvd19hbGxvYyk7Ci0JCWluaXRpYWxpemVkID0gMTsKLQl9CisgICAgc3RhdGljIGludCBpbml0aWFsaXplZCA9IDA7CisgICAgaWYgKCFpbml0aWFsaXplZCkgeworICAgICAgICBQeV9BdEV4aXQoc2hvd19hbGxvYyk7CisgICAgICAgIGluaXRpYWxpemVkID0gMTsKKyAgICB9CiAjZW5kaWYKIAotCWlmIChzaXplIDwgMCkgewotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCS8qIENoZWNrIGZvciBvdmVyZmxvdyB3aXRob3V0IGFuIGFjdHVhbCBvdmVyZmxvdywKLQkgKiAgd2hpY2ggY2FuIGNhdXNlIGNvbXBpbGVyIHRvIG9wdGltaXNlIG91dCAqLwotCWlmICgoc2l6ZV90KXNpemUgPiBQWV9TSVpFX01BWCAvIHNpemVvZihQeU9iamVjdCAqKSkKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JbmJ5dGVzID0gc2l6ZSAqIHNpemVvZihQeU9iamVjdCAqKTsKLQlpZiAobnVtZnJlZSkgewotCQludW1mcmVlLS07Ci0JCW9wID0gZnJlZV9saXN0W251bWZyZWVdOwotCQlfUHlfTmV3UmVmZXJlbmNlKChQeU9iamVjdCAqKW9wKTsKKyAgICBpZiAoc2l6ZSA8IDApIHsKKyAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICAvKiBDaGVjayBmb3Igb3ZlcmZsb3cgd2l0aG91dCBhbiBhY3R1YWwgb3ZlcmZsb3csCisgICAgICogIHdoaWNoIGNhbiBjYXVzZSBjb21waWxlciB0byBvcHRpbWlzZSBvdXQgKi8KKyAgICBpZiAoKHNpemVfdClzaXplID4gUFlfU0laRV9NQVggLyBzaXplb2YoUHlPYmplY3QgKikpCisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIG5ieXRlcyA9IHNpemUgKiBzaXplb2YoUHlPYmplY3QgKik7CisgICAgaWYgKG51bWZyZWUpIHsKKyAgICAgICAgbnVtZnJlZS0tOworICAgICAgICBvcCA9IGZyZWVfbGlzdFtudW1mcmVlXTsKKyAgICAgICAgX1B5X05ld1JlZmVyZW5jZSgoUHlPYmplY3QgKilvcCk7CiAjaWZkZWYgU0hPV19BTExPQ19DT1VOVAotCQljb3VudF9yZXVzZSsrOworICAgICAgICBjb3VudF9yZXVzZSsrOwogI2VuZGlmCi0JfSBlbHNlIHsKLQkJb3AgPSBQeU9iamVjdF9HQ19OZXcoUHlMaXN0T2JqZWN0LCAmUHlMaXN0X1R5cGUpOwotCQlpZiAob3AgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOworICAgIH0gZWxzZSB7CisgICAgICAgIG9wID0gUHlPYmplY3RfR0NfTmV3KFB5TGlzdE9iamVjdCwgJlB5TGlzdF9UeXBlKTsKKyAgICAgICAgaWYgKG9wID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKICNpZmRlZiBTSE9XX0FMTE9DX0NPVU5UCi0JCWNvdW50X2FsbG9jKys7CisgICAgICAgIGNvdW50X2FsbG9jKys7CiAjZW5kaWYKLQl9Ci0JaWYgKHNpemUgPD0gMCkKLQkJb3AtPm9iX2l0ZW0gPSBOVUxMOwotCWVsc2UgewotCQlvcC0+b2JfaXRlbSA9IChQeU9iamVjdCAqKikgUHlNZW1fTUFMTE9DKG5ieXRlcyk7Ci0JCWlmIChvcC0+b2JfaXRlbSA9PSBOVUxMKSB7Ci0JCQlQeV9ERUNSRUYob3ApOwotCQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JCX0KLQkJbWVtc2V0KG9wLT5vYl9pdGVtLCAwLCBuYnl0ZXMpOwotCX0KLQlQeV9TSVpFKG9wKSA9IHNpemU7Ci0Jb3AtPmFsbG9jYXRlZCA9IHNpemU7Ci0JX1B5T2JqZWN0X0dDX1RSQUNLKG9wKTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopIG9wOworICAgIH0KKyAgICBpZiAoc2l6ZSA8PSAwKQorICAgICAgICBvcC0+b2JfaXRlbSA9IE5VTEw7CisgICAgZWxzZSB7CisgICAgICAgIG9wLT5vYl9pdGVtID0gKFB5T2JqZWN0ICoqKSBQeU1lbV9NQUxMT0MobmJ5dGVzKTsKKyAgICAgICAgaWYgKG9wLT5vYl9pdGVtID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihvcCk7CisgICAgICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgfQorICAgICAgICBtZW1zZXQob3AtPm9iX2l0ZW0sIDAsIG5ieXRlcyk7CisgICAgfQorICAgIFB5X1NJWkUob3ApID0gc2l6ZTsKKyAgICBvcC0+YWxsb2NhdGVkID0gc2l6ZTsKKyAgICBfUHlPYmplY3RfR0NfVFJBQ0sob3ApOworICAgIHJldHVybiAoUHlPYmplY3QgKikgb3A7CiB9CiAKIFB5X3NzaXplX3QKIFB5TGlzdF9TaXplKFB5T2JqZWN0ICpvcCkKIHsKLQlpZiAoIVB5TGlzdF9DaGVjayhvcCkpIHsKLQkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JZWxzZQotCQlyZXR1cm4gUHlfU0laRShvcCk7CisgICAgaWYgKCFQeUxpc3RfQ2hlY2sob3ApKSB7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIFB5X1NJWkUob3ApOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKmluZGV4ZXJyID0gTlVMTDsKQEAgLTE3OCwxMTQgKzE3OCwxMTQgQEAKIFB5T2JqZWN0ICoKIFB5TGlzdF9HZXRJdGVtKFB5T2JqZWN0ICpvcCwgUHlfc3NpemVfdCBpKQogewotCWlmICghUHlMaXN0X0NoZWNrKG9wKSkgewotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChpIDwgMCB8fCBpID49IFB5X1NJWkUob3ApKSB7Ci0JCWlmIChpbmRleGVyciA9PSBOVUxMKQotCQkJaW5kZXhlcnIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKAotCQkJCSJsaXN0IGluZGV4IG91dCBvZiByYW5nZSIpOwotCQlQeUVycl9TZXRPYmplY3QoUHlFeGNfSW5kZXhFcnJvciwgaW5kZXhlcnIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuICgoUHlMaXN0T2JqZWN0ICopb3ApIC0+IG9iX2l0ZW1baV07CisgICAgaWYgKCFQeUxpc3RfQ2hlY2sob3ApKSB7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKGkgPCAwIHx8IGkgPj0gUHlfU0laRShvcCkpIHsKKyAgICAgICAgaWYgKGluZGV4ZXJyID09IE5VTEwpCisgICAgICAgICAgICBpbmRleGVyciA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoCisgICAgICAgICAgICAgICAgImxpc3QgaW5kZXggb3V0IG9mIHJhbmdlIik7CisgICAgICAgIFB5RXJyX1NldE9iamVjdChQeUV4Y19JbmRleEVycm9yLCBpbmRleGVycik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gKChQeUxpc3RPYmplY3QgKilvcCkgLT4gb2JfaXRlbVtpXTsKIH0KIAogaW50CiBQeUxpc3RfU2V0SXRlbShyZWdpc3RlciBQeU9iamVjdCAqb3AsIHJlZ2lzdGVyIFB5X3NzaXplX3QgaSwKICAgICAgICAgICAgICAgIHJlZ2lzdGVyIFB5T2JqZWN0ICpuZXdpdGVtKQogewotCXJlZ2lzdGVyIFB5T2JqZWN0ICpvbGRpdGVtOwotCXJlZ2lzdGVyIFB5T2JqZWN0ICoqcDsKLQlpZiAoIVB5TGlzdF9DaGVjayhvcCkpIHsKLQkJUHlfWERFQ1JFRihuZXdpdGVtKTsKLQkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKGkgPCAwIHx8IGkgPj0gUHlfU0laRShvcCkpIHsKLQkJUHlfWERFQ1JFRihuZXdpdGVtKTsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsCi0JCQkJImxpc3QgYXNzaWdubWVudCBpbmRleCBvdXQgb2YgcmFuZ2UiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlwID0gKChQeUxpc3RPYmplY3QgKilvcCkgLT4gb2JfaXRlbSArIGk7Ci0Jb2xkaXRlbSA9ICpwOwotCSpwID0gbmV3aXRlbTsKLQlQeV9YREVDUkVGKG9sZGl0ZW0pOwotCXJldHVybiAwOworICAgIHJlZ2lzdGVyIFB5T2JqZWN0ICpvbGRpdGVtOworICAgIHJlZ2lzdGVyIFB5T2JqZWN0ICoqcDsKKyAgICBpZiAoIVB5TGlzdF9DaGVjayhvcCkpIHsKKyAgICAgICAgUHlfWERFQ1JFRihuZXdpdGVtKTsKKyAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKGkgPCAwIHx8IGkgPj0gUHlfU0laRShvcCkpIHsKKyAgICAgICAgUHlfWERFQ1JFRihuZXdpdGVtKTsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAibGlzdCBhc3NpZ25tZW50IGluZGV4IG91dCBvZiByYW5nZSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHAgPSAoKFB5TGlzdE9iamVjdCAqKW9wKSAtPiBvYl9pdGVtICsgaTsKKyAgICBvbGRpdGVtID0gKnA7CisgICAgKnAgPSBuZXdpdGVtOworICAgIFB5X1hERUNSRUYob2xkaXRlbSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIGluczEoUHlMaXN0T2JqZWN0ICpzZWxmLCBQeV9zc2l6ZV90IHdoZXJlLCBQeU9iamVjdCAqdikKIHsKLQlQeV9zc2l6ZV90IGksIG4gPSBQeV9TSVpFKHNlbGYpOwotCVB5T2JqZWN0ICoqaXRlbXM7Ci0JaWYgKHYgPT0gTlVMTCkgewotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAobiA9PSBQWV9TU0laRV9UX01BWCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJCSJjYW5ub3QgYWRkIG1vcmUgb2JqZWN0cyB0byBsaXN0Iik7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgUHlfc3NpemVfdCBpLCBuID0gUHlfU0laRShzZWxmKTsKKyAgICBQeU9iamVjdCAqKml0ZW1zOworICAgIGlmICh2ID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKG4gPT0gUFlfU1NJWkVfVF9NQVgpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAiY2Fubm90IGFkZCBtb3JlIG9iamVjdHMgdG8gbGlzdCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JaWYgKGxpc3RfcmVzaXplKHNlbGYsIG4rMSkgPT0gLTEpCi0JCXJldHVybiAtMTsKKyAgICBpZiAobGlzdF9yZXNpemUoc2VsZiwgbisxKSA9PSAtMSkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0JaWYgKHdoZXJlIDwgMCkgewotCQl3aGVyZSArPSBuOwotCQlpZiAod2hlcmUgPCAwKQotCQkJd2hlcmUgPSAwOwotCX0KLQlpZiAod2hlcmUgPiBuKQotCQl3aGVyZSA9IG47Ci0JaXRlbXMgPSBzZWxmLT5vYl9pdGVtOwotCWZvciAoaSA9IG47IC0taSA+PSB3aGVyZTsgKQotCQlpdGVtc1tpKzFdID0gaXRlbXNbaV07Ci0JUHlfSU5DUkVGKHYpOwotCWl0ZW1zW3doZXJlXSA9IHY7Ci0JcmV0dXJuIDA7CisgICAgaWYgKHdoZXJlIDwgMCkgeworICAgICAgICB3aGVyZSArPSBuOworICAgICAgICBpZiAod2hlcmUgPCAwKQorICAgICAgICAgICAgd2hlcmUgPSAwOworICAgIH0KKyAgICBpZiAod2hlcmUgPiBuKQorICAgICAgICB3aGVyZSA9IG47CisgICAgaXRlbXMgPSBzZWxmLT5vYl9pdGVtOworICAgIGZvciAoaSA9IG47IC0taSA+PSB3aGVyZTsgKQorICAgICAgICBpdGVtc1tpKzFdID0gaXRlbXNbaV07CisgICAgUHlfSU5DUkVGKHYpOworICAgIGl0ZW1zW3doZXJlXSA9IHY7CisgICAgcmV0dXJuIDA7CiB9CiAKIGludAogUHlMaXN0X0luc2VydChQeU9iamVjdCAqb3AsIFB5X3NzaXplX3Qgd2hlcmUsIFB5T2JqZWN0ICpuZXdpdGVtKQogewotCWlmICghUHlMaXN0X0NoZWNrKG9wKSkgewotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlyZXR1cm4gaW5zMSgoUHlMaXN0T2JqZWN0ICopb3AsIHdoZXJlLCBuZXdpdGVtKTsKKyAgICBpZiAoIVB5TGlzdF9DaGVjayhvcCkpIHsKKyAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIGluczEoKFB5TGlzdE9iamVjdCAqKW9wLCB3aGVyZSwgbmV3aXRlbSk7CiB9CiAKIHN0YXRpYyBpbnQKIGFwcDEoUHlMaXN0T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdikKIHsKLQlQeV9zc2l6ZV90IG4gPSBQeUxpc3RfR0VUX1NJWkUoc2VsZik7CisgICAgUHlfc3NpemVfdCBuID0gUHlMaXN0X0dFVF9TSVpFKHNlbGYpOwogCi0JYXNzZXJ0ICh2ICE9IE5VTEwpOwotCWlmIChuID09IFBZX1NTSVpFX1RfTUFYKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJImNhbm5vdCBhZGQgbW9yZSBvYmplY3RzIHRvIGxpc3QiKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICBhc3NlcnQgKHYgIT0gTlVMTCk7CisgICAgaWYgKG4gPT0gUFlfU1NJWkVfVF9NQVgpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAiY2Fubm90IGFkZCBtb3JlIG9iamVjdHMgdG8gbGlzdCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JaWYgKGxpc3RfcmVzaXplKHNlbGYsIG4rMSkgPT0gLTEpCi0JCXJldHVybiAtMTsKKyAgICBpZiAobGlzdF9yZXNpemUoc2VsZiwgbisxKSA9PSAtMSkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0JUHlfSU5DUkVGKHYpOwotCVB5TGlzdF9TRVRfSVRFTShzZWxmLCBuLCB2KTsKLQlyZXR1cm4gMDsKKyAgICBQeV9JTkNSRUYodik7CisgICAgUHlMaXN0X1NFVF9JVEVNKHNlbGYsIG4sIHYpOworICAgIHJldHVybiAwOwogfQogCiBpbnQKIFB5TGlzdF9BcHBlbmQoUHlPYmplY3QgKm9wLCBQeU9iamVjdCAqbmV3aXRlbSkKIHsKLQlpZiAoUHlMaXN0X0NoZWNrKG9wKSAmJiAobmV3aXRlbSAhPSBOVUxMKSkKLQkJcmV0dXJuIGFwcDEoKFB5TGlzdE9iamVjdCAqKW9wLCBuZXdpdGVtKTsKLQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQlyZXR1cm4gLTE7CisgICAgaWYgKFB5TGlzdF9DaGVjayhvcCkgJiYgKG5ld2l0ZW0gIT0gTlVMTCkpCisgICAgICAgIHJldHVybiBhcHAxKChQeUxpc3RPYmplY3QgKilvcCwgbmV3aXRlbSk7CisgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgcmV0dXJuIC0xOwogfQogCiAvKiBNZXRob2RzICovCkBAIC0yOTMsMzA5ICsyOTMsMzA5IEBACiBzdGF0aWMgdm9pZAogbGlzdF9kZWFsbG9jKFB5TGlzdE9iamVjdCAqb3ApCiB7Ci0JUHlfc3NpemVfdCBpOwotCVB5T2JqZWN0X0dDX1VuVHJhY2sob3ApOwotCVB5X1RSQVNIQ0FOX1NBRkVfQkVHSU4ob3ApCi0JaWYgKG9wLT5vYl9pdGVtICE9IE5VTEwpIHsKLQkJLyogRG8gaXQgYmFja3dhcmRzLCBmb3IgQ2hyaXN0aWFuIFRpc21lci4KLQkJICAgVGhlcmUncyBhIHNpbXBsZSB0ZXN0IGNhc2Ugd2hlcmUgc29tZWhvdyB0aGlzIHJlZHVjZXMKLQkJICAgdGhyYXNoaW5nIHdoZW4gYSAqdmVyeSogbGFyZ2UgbGlzdCBpcyBjcmVhdGVkIGFuZAotCQkgICBpbW1lZGlhdGVseSBkZWxldGVkLiAqLwotCQlpID0gUHlfU0laRShvcCk7Ci0JCXdoaWxlICgtLWkgPj0gMCkgewotCQkJUHlfWERFQ1JFRihvcC0+b2JfaXRlbVtpXSk7Ci0JCX0KLQkJUHlNZW1fRlJFRShvcC0+b2JfaXRlbSk7Ci0JfQotCWlmIChudW1mcmVlIDwgUHlMaXN0X01BWEZSRUVMSVNUICYmIFB5TGlzdF9DaGVja0V4YWN0KG9wKSkKLQkJZnJlZV9saXN0W251bWZyZWUrK10gPSBvcDsKLQllbHNlCi0JCVB5X1RZUEUob3ApLT50cF9mcmVlKChQeU9iamVjdCAqKW9wKTsKLQlQeV9UUkFTSENBTl9TQUZFX0VORChvcCkKKyAgICBQeV9zc2l6ZV90IGk7CisgICAgUHlPYmplY3RfR0NfVW5UcmFjayhvcCk7CisgICAgUHlfVFJBU0hDQU5fU0FGRV9CRUdJTihvcCkKKyAgICBpZiAob3AtPm9iX2l0ZW0gIT0gTlVMTCkgeworICAgICAgICAvKiBEbyBpdCBiYWNrd2FyZHMsIGZvciBDaHJpc3RpYW4gVGlzbWVyLgorICAgICAgICAgICBUaGVyZSdzIGEgc2ltcGxlIHRlc3QgY2FzZSB3aGVyZSBzb21laG93IHRoaXMgcmVkdWNlcworICAgICAgICAgICB0aHJhc2hpbmcgd2hlbiBhICp2ZXJ5KiBsYXJnZSBsaXN0IGlzIGNyZWF0ZWQgYW5kCisgICAgICAgICAgIGltbWVkaWF0ZWx5IGRlbGV0ZWQuICovCisgICAgICAgIGkgPSBQeV9TSVpFKG9wKTsKKyAgICAgICAgd2hpbGUgKC0taSA+PSAwKSB7CisgICAgICAgICAgICBQeV9YREVDUkVGKG9wLT5vYl9pdGVtW2ldKTsKKyAgICAgICAgfQorICAgICAgICBQeU1lbV9GUkVFKG9wLT5vYl9pdGVtKTsKKyAgICB9CisgICAgaWYgKG51bWZyZWUgPCBQeUxpc3RfTUFYRlJFRUxJU1QgJiYgUHlMaXN0X0NoZWNrRXhhY3Qob3ApKQorICAgICAgICBmcmVlX2xpc3RbbnVtZnJlZSsrXSA9IG9wOworICAgIGVsc2UKKyAgICAgICAgUHlfVFlQRShvcCktPnRwX2ZyZWUoKFB5T2JqZWN0ICopb3ApOworICAgIFB5X1RSQVNIQ0FOX1NBRkVfRU5EKG9wKQogfQogCiBzdGF0aWMgaW50CiBsaXN0X3ByaW50KFB5TGlzdE9iamVjdCAqb3AsIEZJTEUgKmZwLCBpbnQgZmxhZ3MpCiB7Ci0JaW50IHJjOwotCVB5X3NzaXplX3QgaTsKLQlQeU9iamVjdCAqaXRlbTsKKyAgICBpbnQgcmM7CisgICAgUHlfc3NpemVfdCBpOworICAgIFB5T2JqZWN0ICppdGVtOwogCi0JcmMgPSBQeV9SZXByRW50ZXIoKFB5T2JqZWN0KilvcCk7Ci0JaWYgKHJjICE9IDApIHsKLQkJaWYgKHJjIDwgMCkKLQkJCXJldHVybiByYzsKLQkJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCQlmcHJpbnRmKGZwLCAiWy4uLl0iKTsKLQkJUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQkJcmV0dXJuIDA7Ci0JfQotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlmcHJpbnRmKGZwLCAiWyIpOwotCVB5X0VORF9BTExPV19USFJFQURTCi0JZm9yIChpID0gMDsgaSA8IFB5X1NJWkUob3ApOyBpKyspIHsKLQkJaXRlbSA9IG9wLT5vYl9pdGVtW2ldOwotCQlQeV9JTkNSRUYoaXRlbSk7Ci0JCWlmIChpID4gMCkgewotCQkJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCQkJZnByaW50ZihmcCwgIiwgIik7Ci0JCQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCQl9Ci0JCWlmIChQeU9iamVjdF9QcmludChpdGVtLCBmcCwgMCkgIT0gMCkgewotCQkJUHlfREVDUkVGKGl0ZW0pOwotCQkJUHlfUmVwckxlYXZlKChQeU9iamVjdCAqKW9wKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlQeV9ERUNSRUYoaXRlbSk7Ci0JfQotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlmcHJpbnRmKGZwLCAiXSIpOwotCVB5X0VORF9BTExPV19USFJFQURTCi0JUHlfUmVwckxlYXZlKChQeU9iamVjdCAqKW9wKTsKLQlyZXR1cm4gMDsKKyAgICByYyA9IFB5X1JlcHJFbnRlcigoUHlPYmplY3QqKW9wKTsKKyAgICBpZiAocmMgIT0gMCkgeworICAgICAgICBpZiAocmMgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgICAgIGZwcmludGYoZnAsICJbLi4uXSIpOworICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIGZwcmludGYoZnAsICJbIik7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBmb3IgKGkgPSAwOyBpIDwgUHlfU0laRShvcCk7IGkrKykgeworICAgICAgICBpdGVtID0gb3AtPm9iX2l0ZW1baV07CisgICAgICAgIFB5X0lOQ1JFRihpdGVtKTsKKyAgICAgICAgaWYgKGkgPiAwKSB7CisgICAgICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgICAgICAgICBmcHJpbnRmKGZwLCAiLCAiKTsKKyAgICAgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgICAgIH0KKyAgICAgICAgaWYgKFB5T2JqZWN0X1ByaW50KGl0ZW0sIGZwLCAwKSAhPSAwKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CisgICAgICAgICAgICBQeV9SZXByTGVhdmUoKFB5T2JqZWN0ICopb3ApOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICB9CisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIGZwcmludGYoZnAsICJdIik7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBQeV9SZXByTGVhdmUoKFB5T2JqZWN0ICopb3ApOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbGlzdF9yZXByKFB5TGlzdE9iamVjdCAqdikKIHsKLQlQeV9zc2l6ZV90IGk7Ci0JUHlPYmplY3QgKnMsICp0ZW1wOwotCVB5T2JqZWN0ICpwaWVjZXMgPSBOVUxMLCAqcmVzdWx0ID0gTlVMTDsKKyAgICBQeV9zc2l6ZV90IGk7CisgICAgUHlPYmplY3QgKnMsICp0ZW1wOworICAgIFB5T2JqZWN0ICpwaWVjZXMgPSBOVUxMLCAqcmVzdWx0ID0gTlVMTDsKIAotCWkgPSBQeV9SZXByRW50ZXIoKFB5T2JqZWN0Kil2KTsKLQlpZiAoaSAhPSAwKSB7Ci0JCXJldHVybiBpID4gMCA/IFB5U3RyaW5nX0Zyb21TdHJpbmcoIlsuLi5dIikgOiBOVUxMOwotCX0KKyAgICBpID0gUHlfUmVwckVudGVyKChQeU9iamVjdCopdik7CisgICAgaWYgKGkgIT0gMCkgeworICAgICAgICByZXR1cm4gaSA+IDAgPyBQeVN0cmluZ19Gcm9tU3RyaW5nKCJbLi4uXSIpIDogTlVMTDsKKyAgICB9CiAKLQlpZiAoUHlfU0laRSh2KSA9PSAwKSB7Ci0JCXJlc3VsdCA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIltdIik7Ci0JCWdvdG8gRG9uZTsKLQl9CisgICAgaWYgKFB5X1NJWkUodikgPT0gMCkgeworICAgICAgICByZXN1bHQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCJbXSIpOworICAgICAgICBnb3RvIERvbmU7CisgICAgfQogCi0JcGllY2VzID0gUHlMaXN0X05ldygwKTsKLQlpZiAocGllY2VzID09IE5VTEwpCi0JCWdvdG8gRG9uZTsKKyAgICBwaWVjZXMgPSBQeUxpc3RfTmV3KDApOworICAgIGlmIChwaWVjZXMgPT0gTlVMTCkKKyAgICAgICAgZ290byBEb25lOwogCi0JLyogRG8gcmVwcigpIG9uIGVhY2ggZWxlbWVudC4gIE5vdGUgdGhhdCB0aGlzIG1heSBtdXRhdGUgdGhlIGxpc3QsCi0JICAgc28gbXVzdCByZWZldGNoIHRoZSBsaXN0IHNpemUgb24gZWFjaCBpdGVyYXRpb24uICovCi0JZm9yIChpID0gMDsgaSA8IFB5X1NJWkUodik7ICsraSkgewotCQlpbnQgc3RhdHVzOwotCQlpZiAoUHlfRW50ZXJSZWN1cnNpdmVDYWxsKCIgd2hpbGUgZ2V0dGluZyB0aGUgcmVwciBvZiBhIGxpc3QiKSkKLQkJCWdvdG8gRG9uZTsKLQkJcyA9IFB5T2JqZWN0X1JlcHIodi0+b2JfaXRlbVtpXSk7Ci0JCVB5X0xlYXZlUmVjdXJzaXZlQ2FsbCgpOwotCQlpZiAocyA9PSBOVUxMKQotCQkJZ290byBEb25lOwotCQlzdGF0dXMgPSBQeUxpc3RfQXBwZW5kKHBpZWNlcywgcyk7Ci0JCVB5X0RFQ1JFRihzKTsgIC8qIGFwcGVuZCBjcmVhdGVkIGEgbmV3IHJlZiAqLwotCQlpZiAoc3RhdHVzIDwgMCkKLQkJCWdvdG8gRG9uZTsKLQl9CisgICAgLyogRG8gcmVwcigpIG9uIGVhY2ggZWxlbWVudC4gIE5vdGUgdGhhdCB0aGlzIG1heSBtdXRhdGUgdGhlIGxpc3QsCisgICAgICAgc28gbXVzdCByZWZldGNoIHRoZSBsaXN0IHNpemUgb24gZWFjaCBpdGVyYXRpb24uICovCisgICAgZm9yIChpID0gMDsgaSA8IFB5X1NJWkUodik7ICsraSkgeworICAgICAgICBpbnQgc3RhdHVzOworICAgICAgICBpZiAoUHlfRW50ZXJSZWN1cnNpdmVDYWxsKCIgd2hpbGUgZ2V0dGluZyB0aGUgcmVwciBvZiBhIGxpc3QiKSkKKyAgICAgICAgICAgIGdvdG8gRG9uZTsKKyAgICAgICAgcyA9IFB5T2JqZWN0X1JlcHIodi0+b2JfaXRlbVtpXSk7CisgICAgICAgIFB5X0xlYXZlUmVjdXJzaXZlQ2FsbCgpOworICAgICAgICBpZiAocyA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBEb25lOworICAgICAgICBzdGF0dXMgPSBQeUxpc3RfQXBwZW5kKHBpZWNlcywgcyk7CisgICAgICAgIFB5X0RFQ1JFRihzKTsgIC8qIGFwcGVuZCBjcmVhdGVkIGEgbmV3IHJlZiAqLworICAgICAgICBpZiAoc3RhdHVzIDwgMCkKKyAgICAgICAgICAgIGdvdG8gRG9uZTsKKyAgICB9CiAKLQkvKiBBZGQgIltdIiBkZWNvcmF0aW9ucyB0byB0aGUgZmlyc3QgYW5kIGxhc3QgaXRlbXMuICovCi0JYXNzZXJ0KFB5TGlzdF9HRVRfU0laRShwaWVjZXMpID4gMCk7Ci0JcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIlsiKTsKLQlpZiAocyA9PSBOVUxMKQotCQlnb3RvIERvbmU7Ci0JdGVtcCA9IFB5TGlzdF9HRVRfSVRFTShwaWVjZXMsIDApOwotCVB5U3RyaW5nX0NvbmNhdEFuZERlbCgmcywgdGVtcCk7Ci0JUHlMaXN0X1NFVF9JVEVNKHBpZWNlcywgMCwgcyk7Ci0JaWYgKHMgPT0gTlVMTCkKLQkJZ290byBEb25lOworICAgIC8qIEFkZCAiW10iIGRlY29yYXRpb25zIHRvIHRoZSBmaXJzdCBhbmQgbGFzdCBpdGVtcy4gKi8KKyAgICBhc3NlcnQoUHlMaXN0X0dFVF9TSVpFKHBpZWNlcykgPiAwKTsKKyAgICBzID0gUHlTdHJpbmdfRnJvbVN0cmluZygiWyIpOworICAgIGlmIChzID09IE5VTEwpCisgICAgICAgIGdvdG8gRG9uZTsKKyAgICB0ZW1wID0gUHlMaXN0X0dFVF9JVEVNKHBpZWNlcywgMCk7CisgICAgUHlTdHJpbmdfQ29uY2F0QW5kRGVsKCZzLCB0ZW1wKTsKKyAgICBQeUxpc3RfU0VUX0lURU0ocGllY2VzLCAwLCBzKTsKKyAgICBpZiAocyA9PSBOVUxMKQorICAgICAgICBnb3RvIERvbmU7CiAKLQlzID0gUHlTdHJpbmdfRnJvbVN0cmluZygiXSIpOwotCWlmIChzID09IE5VTEwpCi0JCWdvdG8gRG9uZTsKLQl0ZW1wID0gUHlMaXN0X0dFVF9JVEVNKHBpZWNlcywgUHlMaXN0X0dFVF9TSVpFKHBpZWNlcykgLSAxKTsKLQlQeVN0cmluZ19Db25jYXRBbmREZWwoJnRlbXAsIHMpOwotCVB5TGlzdF9TRVRfSVRFTShwaWVjZXMsIFB5TGlzdF9HRVRfU0laRShwaWVjZXMpIC0gMSwgdGVtcCk7Ci0JaWYgKHRlbXAgPT0gTlVMTCkKLQkJZ290byBEb25lOworICAgIHMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCJdIik7CisgICAgaWYgKHMgPT0gTlVMTCkKKyAgICAgICAgZ290byBEb25lOworICAgIHRlbXAgPSBQeUxpc3RfR0VUX0lURU0ocGllY2VzLCBQeUxpc3RfR0VUX1NJWkUocGllY2VzKSAtIDEpOworICAgIFB5U3RyaW5nX0NvbmNhdEFuZERlbCgmdGVtcCwgcyk7CisgICAgUHlMaXN0X1NFVF9JVEVNKHBpZWNlcywgUHlMaXN0X0dFVF9TSVpFKHBpZWNlcykgLSAxLCB0ZW1wKTsKKyAgICBpZiAodGVtcCA9PSBOVUxMKQorICAgICAgICBnb3RvIERvbmU7CiAKLQkvKiBQYXN0ZSB0aGVtIGFsbCB0b2dldGhlciB3aXRoICIsICIgYmV0d2Vlbi4gKi8KLQlzID0gUHlTdHJpbmdfRnJvbVN0cmluZygiLCAiKTsKLQlpZiAocyA9PSBOVUxMKQotCQlnb3RvIERvbmU7Ci0JcmVzdWx0ID0gX1B5U3RyaW5nX0pvaW4ocywgcGllY2VzKTsKLQlQeV9ERUNSRUYocyk7CisgICAgLyogUGFzdGUgdGhlbSBhbGwgdG9nZXRoZXIgd2l0aCAiLCAiIGJldHdlZW4uICovCisgICAgcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIiwgIik7CisgICAgaWYgKHMgPT0gTlVMTCkKKyAgICAgICAgZ290byBEb25lOworICAgIHJlc3VsdCA9IF9QeVN0cmluZ19Kb2luKHMsIHBpZWNlcyk7CisgICAgUHlfREVDUkVGKHMpOwogCiBEb25lOgotCVB5X1hERUNSRUYocGllY2VzKTsKLQlQeV9SZXByTGVhdmUoKFB5T2JqZWN0ICopdik7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBQeV9YREVDUkVGKHBpZWNlcyk7CisgICAgUHlfUmVwckxlYXZlKChQeU9iamVjdCAqKXYpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBQeV9zc2l6ZV90CiBsaXN0X2xlbmd0aChQeUxpc3RPYmplY3QgKmEpCiB7Ci0JcmV0dXJuIFB5X1NJWkUoYSk7CisgICAgcmV0dXJuIFB5X1NJWkUoYSk7CiB9CiAKIHN0YXRpYyBpbnQKIGxpc3RfY29udGFpbnMoUHlMaXN0T2JqZWN0ICphLCBQeU9iamVjdCAqZWwpCiB7Ci0JUHlfc3NpemVfdCBpOwotCWludCBjbXA7CisgICAgUHlfc3NpemVfdCBpOworICAgIGludCBjbXA7CiAKLQlmb3IgKGkgPSAwLCBjbXAgPSAwIDsgY21wID09IDAgJiYgaSA8IFB5X1NJWkUoYSk7ICsraSkKLQkJY21wID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKGVsLCBQeUxpc3RfR0VUX0lURU0oYSwgaSksCi0JCQkJCQkgICBQeV9FUSk7Ci0JcmV0dXJuIGNtcDsKKyAgICBmb3IgKGkgPSAwLCBjbXAgPSAwIDsgY21wID09IDAgJiYgaSA8IFB5X1NJWkUoYSk7ICsraSkKKyAgICAgICAgY21wID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKGVsLCBQeUxpc3RfR0VUX0lURU0oYSwgaSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfRVEpOworICAgIHJldHVybiBjbXA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBsaXN0X2l0ZW0oUHlMaXN0T2JqZWN0ICphLCBQeV9zc2l6ZV90IGkpCiB7Ci0JaWYgKGkgPCAwIHx8IGkgPj0gUHlfU0laRShhKSkgewotCQlpZiAoaW5kZXhlcnIgPT0gTlVMTCkKLQkJCWluZGV4ZXJyID0gUHlTdHJpbmdfRnJvbVN0cmluZygKLQkJCQkibGlzdCBpbmRleCBvdXQgb2YgcmFuZ2UiKTsKLQkJUHlFcnJfU2V0T2JqZWN0KFB5RXhjX0luZGV4RXJyb3IsIGluZGV4ZXJyKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5X0lOQ1JFRihhLT5vYl9pdGVtW2ldKTsKLQlyZXR1cm4gYS0+b2JfaXRlbVtpXTsKKyAgICBpZiAoaSA8IDAgfHwgaSA+PSBQeV9TSVpFKGEpKSB7CisgICAgICAgIGlmIChpbmRleGVyciA9PSBOVUxMKQorICAgICAgICAgICAgaW5kZXhlcnIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKAorICAgICAgICAgICAgICAgICJsaXN0IGluZGV4IG91dCBvZiByYW5nZSIpOworICAgICAgICBQeUVycl9TZXRPYmplY3QoUHlFeGNfSW5kZXhFcnJvciwgaW5kZXhlcnIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlfSU5DUkVGKGEtPm9iX2l0ZW1baV0pOworICAgIHJldHVybiBhLT5vYl9pdGVtW2ldOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbGlzdF9zbGljZShQeUxpc3RPYmplY3QgKmEsIFB5X3NzaXplX3QgaWxvdywgUHlfc3NpemVfdCBpaGlnaCkKIHsKLQlQeUxpc3RPYmplY3QgKm5wOwotCVB5T2JqZWN0ICoqc3JjLCAqKmRlc3Q7Ci0JUHlfc3NpemVfdCBpLCBsZW47Ci0JaWYgKGlsb3cgPCAwKQotCQlpbG93ID0gMDsKLQllbHNlIGlmIChpbG93ID4gUHlfU0laRShhKSkKLQkJaWxvdyA9IFB5X1NJWkUoYSk7Ci0JaWYgKGloaWdoIDwgaWxvdykKLQkJaWhpZ2ggPSBpbG93OwotCWVsc2UgaWYgKGloaWdoID4gUHlfU0laRShhKSkKLQkJaWhpZ2ggPSBQeV9TSVpFKGEpOwotCWxlbiA9IGloaWdoIC0gaWxvdzsKLQlucCA9IChQeUxpc3RPYmplY3QgKikgUHlMaXN0X05ldyhsZW4pOwotCWlmIChucCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBQeUxpc3RPYmplY3QgKm5wOworICAgIFB5T2JqZWN0ICoqc3JjLCAqKmRlc3Q7CisgICAgUHlfc3NpemVfdCBpLCBsZW47CisgICAgaWYgKGlsb3cgPCAwKQorICAgICAgICBpbG93ID0gMDsKKyAgICBlbHNlIGlmIChpbG93ID4gUHlfU0laRShhKSkKKyAgICAgICAgaWxvdyA9IFB5X1NJWkUoYSk7CisgICAgaWYgKGloaWdoIDwgaWxvdykKKyAgICAgICAgaWhpZ2ggPSBpbG93OworICAgIGVsc2UgaWYgKGloaWdoID4gUHlfU0laRShhKSkKKyAgICAgICAgaWhpZ2ggPSBQeV9TSVpFKGEpOworICAgIGxlbiA9IGloaWdoIC0gaWxvdzsKKyAgICBucCA9IChQeUxpc3RPYmplY3QgKikgUHlMaXN0X05ldyhsZW4pOworICAgIGlmIChucCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXNyYyA9IGEtPm9iX2l0ZW0gKyBpbG93OwotCWRlc3QgPSBucC0+b2JfaXRlbTsKLQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJUHlPYmplY3QgKnYgPSBzcmNbaV07Ci0JCVB5X0lOQ1JFRih2KTsKLQkJZGVzdFtpXSA9IHY7Ci0JfQotCXJldHVybiAoUHlPYmplY3QgKilucDsKKyAgICBzcmMgPSBhLT5vYl9pdGVtICsgaWxvdzsKKyAgICBkZXN0ID0gbnAtPm9iX2l0ZW07CisgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgIFB5T2JqZWN0ICp2ID0gc3JjW2ldOworICAgICAgICBQeV9JTkNSRUYodik7CisgICAgICAgIGRlc3RbaV0gPSB2OworICAgIH0KKyAgICByZXR1cm4gKFB5T2JqZWN0ICopbnA7CiB9CiAKIFB5T2JqZWN0ICoKIFB5TGlzdF9HZXRTbGljZShQeU9iamVjdCAqYSwgUHlfc3NpemVfdCBpbG93LCBQeV9zc2l6ZV90IGloaWdoKQogewotCWlmICghUHlMaXN0X0NoZWNrKGEpKSB7Ci0JCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIGxpc3Rfc2xpY2UoKFB5TGlzdE9iamVjdCAqKWEsIGlsb3csIGloaWdoKTsKKyAgICBpZiAoIVB5TGlzdF9DaGVjayhhKSkgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBsaXN0X3NsaWNlKChQeUxpc3RPYmplY3QgKilhLCBpbG93LCBpaGlnaCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBsaXN0X2NvbmNhdChQeUxpc3RPYmplY3QgKmEsIFB5T2JqZWN0ICpiYikKIHsKLQlQeV9zc2l6ZV90IHNpemU7Ci0JUHlfc3NpemVfdCBpOwotCVB5T2JqZWN0ICoqc3JjLCAqKmRlc3Q7Ci0JUHlMaXN0T2JqZWN0ICpucDsKLQlpZiAoIVB5TGlzdF9DaGVjayhiYikpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgImNhbiBvbmx5IGNvbmNhdGVuYXRlIGxpc3QgKG5vdCBcIiUuMjAwc1wiKSB0byBsaXN0IiwKLQkJCSAgYmItPm9iX3R5cGUtPnRwX25hbWUpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgUHlfc3NpemVfdCBzaXplOworICAgIFB5X3NzaXplX3QgaTsKKyAgICBQeU9iamVjdCAqKnNyYywgKipkZXN0OworICAgIFB5TGlzdE9iamVjdCAqbnA7CisgICAgaWYgKCFQeUxpc3RfQ2hlY2soYmIpKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAiY2FuIG9ubHkgY29uY2F0ZW5hdGUgbGlzdCAobm90IFwiJS4yMDBzXCIpIHRvIGxpc3QiLAorICAgICAgICAgICAgICAgICAgYmItPm9iX3R5cGUtPnRwX25hbWUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAjZGVmaW5lIGIgKChQeUxpc3RPYmplY3QgKiliYikKLQlzaXplID0gUHlfU0laRShhKSArIFB5X1NJWkUoYik7Ci0JaWYgKHNpemUgPCAwKQotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQlucCA9IChQeUxpc3RPYmplY3QgKikgUHlMaXN0X05ldyhzaXplKTsKLQlpZiAobnAgPT0gTlVMTCkgewotCQlyZXR1cm4gTlVMTDsKLQl9Ci0Jc3JjID0gYS0+b2JfaXRlbTsKLQlkZXN0ID0gbnAtPm9iX2l0ZW07Ci0JZm9yIChpID0gMDsgaSA8IFB5X1NJWkUoYSk7IGkrKykgewotCQlQeU9iamVjdCAqdiA9IHNyY1tpXTsKLQkJUHlfSU5DUkVGKHYpOwotCQlkZXN0W2ldID0gdjsKLQl9Ci0Jc3JjID0gYi0+b2JfaXRlbTsKLQlkZXN0ID0gbnAtPm9iX2l0ZW0gKyBQeV9TSVpFKGEpOwotCWZvciAoaSA9IDA7IGkgPCBQeV9TSVpFKGIpOyBpKyspIHsKLQkJUHlPYmplY3QgKnYgPSBzcmNbaV07Ci0JCVB5X0lOQ1JFRih2KTsKLQkJZGVzdFtpXSA9IHY7Ci0JfQotCXJldHVybiAoUHlPYmplY3QgKilucDsKKyAgICBzaXplID0gUHlfU0laRShhKSArIFB5X1NJWkUoYik7CisgICAgaWYgKHNpemUgPCAwKQorICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICBucCA9IChQeUxpc3RPYmplY3QgKikgUHlMaXN0X05ldyhzaXplKTsKKyAgICBpZiAobnAgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgc3JjID0gYS0+b2JfaXRlbTsKKyAgICBkZXN0ID0gbnAtPm9iX2l0ZW07CisgICAgZm9yIChpID0gMDsgaSA8IFB5X1NJWkUoYSk7IGkrKykgeworICAgICAgICBQeU9iamVjdCAqdiA9IHNyY1tpXTsKKyAgICAgICAgUHlfSU5DUkVGKHYpOworICAgICAgICBkZXN0W2ldID0gdjsKKyAgICB9CisgICAgc3JjID0gYi0+b2JfaXRlbTsKKyAgICBkZXN0ID0gbnAtPm9iX2l0ZW0gKyBQeV9TSVpFKGEpOworICAgIGZvciAoaSA9IDA7IGkgPCBQeV9TSVpFKGIpOyBpKyspIHsKKyAgICAgICAgUHlPYmplY3QgKnYgPSBzcmNbaV07CisgICAgICAgIFB5X0lOQ1JFRih2KTsKKyAgICAgICAgZGVzdFtpXSA9IHY7CisgICAgfQorICAgIHJldHVybiAoUHlPYmplY3QgKilucDsKICN1bmRlZiBiCiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBsaXN0X3JlcGVhdChQeUxpc3RPYmplY3QgKmEsIFB5X3NzaXplX3QgbikKIHsKLQlQeV9zc2l6ZV90IGksIGo7Ci0JUHlfc3NpemVfdCBzaXplOwotCVB5TGlzdE9iamVjdCAqbnA7Ci0JUHlPYmplY3QgKipwLCAqKml0ZW1zOwotCVB5T2JqZWN0ICplbGVtOwotCWlmIChuIDwgMCkKLQkJbiA9IDA7Ci0Jc2l6ZSA9IFB5X1NJWkUoYSkgKiBuOwotCWlmIChuICYmIHNpemUvbiAhPSBQeV9TSVpFKGEpKQotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQlpZiAoc2l6ZSA9PSAwKQotCQlyZXR1cm4gUHlMaXN0X05ldygwKTsKLQlucCA9IChQeUxpc3RPYmplY3QgKikgUHlMaXN0X05ldyhzaXplKTsKLQlpZiAobnAgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgUHlfc3NpemVfdCBpLCBqOworICAgIFB5X3NzaXplX3Qgc2l6ZTsKKyAgICBQeUxpc3RPYmplY3QgKm5wOworICAgIFB5T2JqZWN0ICoqcCwgKippdGVtczsKKyAgICBQeU9iamVjdCAqZWxlbTsKKyAgICBpZiAobiA8IDApCisgICAgICAgIG4gPSAwOworICAgIHNpemUgPSBQeV9TSVpFKGEpICogbjsKKyAgICBpZiAobiAmJiBzaXplL24gIT0gUHlfU0laRShhKSkKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgaWYgKHNpemUgPT0gMCkKKyAgICAgICAgcmV0dXJuIFB5TGlzdF9OZXcoMCk7CisgICAgbnAgPSAoUHlMaXN0T2JqZWN0ICopIFB5TGlzdF9OZXcoc2l6ZSk7CisgICAgaWYgKG5wID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaXRlbXMgPSBucC0+b2JfaXRlbTsKLQlpZiAoUHlfU0laRShhKSA9PSAxKSB7Ci0JCWVsZW0gPSBhLT5vYl9pdGVtWzBdOwotCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCQlpdGVtc1tpXSA9IGVsZW07Ci0JCQlQeV9JTkNSRUYoZWxlbSk7Ci0JCX0KLQkJcmV0dXJuIChQeU9iamVjdCAqKSBucDsKLQl9Ci0JcCA9IG5wLT5vYl9pdGVtOwotCWl0ZW1zID0gYS0+b2JfaXRlbTsKLQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCWZvciAoaiA9IDA7IGogPCBQeV9TSVpFKGEpOyBqKyspIHsKLQkJCSpwID0gaXRlbXNbal07Ci0JCQlQeV9JTkNSRUYoKnApOwotCQkJcCsrOwotCQl9Ci0JfQotCXJldHVybiAoUHlPYmplY3QgKikgbnA7CisgICAgaXRlbXMgPSBucC0+b2JfaXRlbTsKKyAgICBpZiAoUHlfU0laRShhKSA9PSAxKSB7CisgICAgICAgIGVsZW0gPSBhLT5vYl9pdGVtWzBdOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgICAgICBpdGVtc1tpXSA9IGVsZW07CisgICAgICAgICAgICBQeV9JTkNSRUYoZWxlbSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChQeU9iamVjdCAqKSBucDsKKyAgICB9CisgICAgcCA9IG5wLT5vYl9pdGVtOworICAgIGl0ZW1zID0gYS0+b2JfaXRlbTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBQeV9TSVpFKGEpOyBqKyspIHsKKyAgICAgICAgICAgICpwID0gaXRlbXNbal07CisgICAgICAgICAgICBQeV9JTkNSRUYoKnApOworICAgICAgICAgICAgcCsrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAoUHlPYmplY3QgKikgbnA7CiB9CiAKIHN0YXRpYyBpbnQKIGxpc3RfY2xlYXIoUHlMaXN0T2JqZWN0ICphKQogewotCVB5X3NzaXplX3QgaTsKLQlQeU9iamVjdCAqKml0ZW0gPSBhLT5vYl9pdGVtOwotCWlmIChpdGVtICE9IE5VTEwpIHsKLQkJLyogQmVjYXVzZSBYREVDUkVGIGNhbiByZWN1cnNpdmVseSBpbnZva2Ugb3BlcmF0aW9ucyBvbgotCQkgICB0aGlzIGxpc3QsIHdlIG1ha2UgaXQgZW1wdHkgZmlyc3QuICovCi0JCWkgPSBQeV9TSVpFKGEpOwotCQlQeV9TSVpFKGEpID0gMDsKLQkJYS0+b2JfaXRlbSA9IE5VTEw7Ci0JCWEtPmFsbG9jYXRlZCA9IDA7Ci0JCXdoaWxlICgtLWkgPj0gMCkgewotCQkJUHlfWERFQ1JFRihpdGVtW2ldKTsKLQkJfQotCQlQeU1lbV9GUkVFKGl0ZW0pOwotCX0KLQkvKiBOZXZlciBmYWlsczsgdGhlIHJldHVybiB2YWx1ZSBjYW4gYmUgaWdub3JlZC4KLQkgICBOb3RlIHRoYXQgdGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgdGhlIGxpc3QgaXMgYWN0dWFsbHkgZW1wdHkKLQkgICBhdCB0aGlzIHBvaW50LCBiZWNhdXNlIFhERUNSRUYgbWF5IGhhdmUgcG9wdWxhdGVkIGl0IGFnYWluISAqLwotCXJldHVybiAwOworICAgIFB5X3NzaXplX3QgaTsKKyAgICBQeU9iamVjdCAqKml0ZW0gPSBhLT5vYl9pdGVtOworICAgIGlmIChpdGVtICE9IE5VTEwpIHsKKyAgICAgICAgLyogQmVjYXVzZSBYREVDUkVGIGNhbiByZWN1cnNpdmVseSBpbnZva2Ugb3BlcmF0aW9ucyBvbgorICAgICAgICAgICB0aGlzIGxpc3QsIHdlIG1ha2UgaXQgZW1wdHkgZmlyc3QuICovCisgICAgICAgIGkgPSBQeV9TSVpFKGEpOworICAgICAgICBQeV9TSVpFKGEpID0gMDsKKyAgICAgICAgYS0+b2JfaXRlbSA9IE5VTEw7CisgICAgICAgIGEtPmFsbG9jYXRlZCA9IDA7CisgICAgICAgIHdoaWxlICgtLWkgPj0gMCkgeworICAgICAgICAgICAgUHlfWERFQ1JFRihpdGVtW2ldKTsKKyAgICAgICAgfQorICAgICAgICBQeU1lbV9GUkVFKGl0ZW0pOworICAgIH0KKyAgICAvKiBOZXZlciBmYWlsczsgdGhlIHJldHVybiB2YWx1ZSBjYW4gYmUgaWdub3JlZC4KKyAgICAgICBOb3RlIHRoYXQgdGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgdGhlIGxpc3QgaXMgYWN0dWFsbHkgZW1wdHkKKyAgICAgICBhdCB0aGlzIHBvaW50LCBiZWNhdXNlIFhERUNSRUYgbWF5IGhhdmUgcG9wdWxhdGVkIGl0IGFnYWluISAqLworICAgIHJldHVybiAwOwogfQogCiAvKiBhW2lsb3c6aWhpZ2hdID0gdiBpZiB2ICE9IE5VTEwuCkBAIC02MDcsMzY4ICs2MDcsMzY4IEBACiBzdGF0aWMgaW50CiBsaXN0X2Fzc19zbGljZShQeUxpc3RPYmplY3QgKmEsIFB5X3NzaXplX3QgaWxvdywgUHlfc3NpemVfdCBpaGlnaCwgUHlPYmplY3QgKnYpCiB7Ci0JLyogQmVjYXVzZSBbWF1ERUNSRUYgY2FuIHJlY3Vyc2l2ZWx5IGludm9rZSBsaXN0IG9wZXJhdGlvbnMgb24KLQkgICB0aGlzIGxpc3QsIHdlIG11c3QgcG9zdHBvbmUgYWxsIFtYXURFQ1JFRiBhY3Rpdml0eSB1bnRpbAotCSAgIGFmdGVyIHRoZSBsaXN0IGlzIGJhY2sgaW4gaXRzIGNhbm9uaWNhbCBzaGFwZS4gIFRoZXJlZm9yZQotCSAgIHdlIG11c3QgYWxsb2NhdGUgYW4gYWRkaXRpb25hbCBhcnJheSwgJ3JlY3ljbGUnLCBpbnRvIHdoaWNoCi0JICAgd2UgdGVtcG9yYXJpbHkgY29weSB0aGUgaXRlbXMgdGhhdCBhcmUgZGVsZXRlZCBmcm9tIHRoZQotCSAgIGxpc3QuIDotKCAqLwotCVB5T2JqZWN0ICpyZWN5Y2xlX29uX3N0YWNrWzhdOwotCVB5T2JqZWN0ICoqcmVjeWNsZSA9IHJlY3ljbGVfb25fc3RhY2s7IC8qIHdpbGwgYWxsb2NhdGUgbW9yZSBpZiBuZWVkZWQgKi8KLQlQeU9iamVjdCAqKml0ZW07Ci0JUHlPYmplY3QgKip2aXRlbSA9IE5VTEw7Ci0JUHlPYmplY3QgKnZfYXNfU0YgPSBOVUxMOyAvKiBQeVNlcXVlbmNlX0Zhc3QodikgKi8KLQlQeV9zc2l6ZV90IG47IC8qICMgb2YgZWxlbWVudHMgaW4gcmVwbGFjZW1lbnQgbGlzdCAqLwotCVB5X3NzaXplX3Qgbm9yaWc7IC8qICMgb2YgZWxlbWVudHMgaW4gbGlzdCBnZXR0aW5nIHJlcGxhY2VkICovCi0JUHlfc3NpemVfdCBkOyAvKiBDaGFuZ2UgaW4gc2l6ZSAqLwotCVB5X3NzaXplX3QgazsKLQlzaXplX3QgczsKLQlpbnQgcmVzdWx0ID0gLTE7CS8qIGd1aWx0eSB1bnRpbCBwcm92ZWQgaW5ub2NlbnQgKi8KKyAgICAvKiBCZWNhdXNlIFtYXURFQ1JFRiBjYW4gcmVjdXJzaXZlbHkgaW52b2tlIGxpc3Qgb3BlcmF0aW9ucyBvbgorICAgICAgIHRoaXMgbGlzdCwgd2UgbXVzdCBwb3N0cG9uZSBhbGwgW1hdREVDUkVGIGFjdGl2aXR5IHVudGlsCisgICAgICAgYWZ0ZXIgdGhlIGxpc3QgaXMgYmFjayBpbiBpdHMgY2Fub25pY2FsIHNoYXBlLiAgVGhlcmVmb3JlCisgICAgICAgd2UgbXVzdCBhbGxvY2F0ZSBhbiBhZGRpdGlvbmFsIGFycmF5LCAncmVjeWNsZScsIGludG8gd2hpY2gKKyAgICAgICB3ZSB0ZW1wb3JhcmlseSBjb3B5IHRoZSBpdGVtcyB0aGF0IGFyZSBkZWxldGVkIGZyb20gdGhlCisgICAgICAgbGlzdC4gOi0oICovCisgICAgUHlPYmplY3QgKnJlY3ljbGVfb25fc3RhY2tbOF07CisgICAgUHlPYmplY3QgKipyZWN5Y2xlID0gcmVjeWNsZV9vbl9zdGFjazsgLyogd2lsbCBhbGxvY2F0ZSBtb3JlIGlmIG5lZWRlZCAqLworICAgIFB5T2JqZWN0ICoqaXRlbTsKKyAgICBQeU9iamVjdCAqKnZpdGVtID0gTlVMTDsKKyAgICBQeU9iamVjdCAqdl9hc19TRiA9IE5VTEw7IC8qIFB5U2VxdWVuY2VfRmFzdCh2KSAqLworICAgIFB5X3NzaXplX3QgbjsgLyogIyBvZiBlbGVtZW50cyBpbiByZXBsYWNlbWVudCBsaXN0ICovCisgICAgUHlfc3NpemVfdCBub3JpZzsgLyogIyBvZiBlbGVtZW50cyBpbiBsaXN0IGdldHRpbmcgcmVwbGFjZWQgKi8KKyAgICBQeV9zc2l6ZV90IGQ7IC8qIENoYW5nZSBpbiBzaXplICovCisgICAgUHlfc3NpemVfdCBrOworICAgIHNpemVfdCBzOworICAgIGludCByZXN1bHQgPSAtMTsgICAgICAgICAgICAvKiBndWlsdHkgdW50aWwgcHJvdmVkIGlubm9jZW50ICovCiAjZGVmaW5lIGIgKChQeUxpc3RPYmplY3QgKil2KQotCWlmICh2ID09IE5VTEwpCi0JCW4gPSAwOwotCWVsc2UgewotCQlpZiAoYSA9PSBiKSB7Ci0JCQkvKiBTcGVjaWFsIGNhc2UgImFbaTpqXSA9IGEiIC0tIGNvcHkgYiBmaXJzdCAqLwotCQkJdiA9IGxpc3Rfc2xpY2UoYiwgMCwgUHlfU0laRShiKSk7Ci0JCQlpZiAodiA9PSBOVUxMKQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQlyZXN1bHQgPSBsaXN0X2Fzc19zbGljZShhLCBpbG93LCBpaGlnaCwgdik7Ci0JCQlQeV9ERUNSRUYodik7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCXZfYXNfU0YgPSBQeVNlcXVlbmNlX0Zhc3QodiwgImNhbiBvbmx5IGFzc2lnbiBhbiBpdGVyYWJsZSIpOwotCQlpZih2X2FzX1NGID09IE5VTEwpCi0JCQlnb3RvIEVycm9yOwotCQluID0gUHlTZXF1ZW5jZV9GYXN0X0dFVF9TSVpFKHZfYXNfU0YpOwotCQl2aXRlbSA9IFB5U2VxdWVuY2VfRmFzdF9JVEVNUyh2X2FzX1NGKTsKLQl9Ci0JaWYgKGlsb3cgPCAwKQotCQlpbG93ID0gMDsKLQllbHNlIGlmIChpbG93ID4gUHlfU0laRShhKSkKLQkJaWxvdyA9IFB5X1NJWkUoYSk7CisgICAgaWYgKHYgPT0gTlVMTCkKKyAgICAgICAgbiA9IDA7CisgICAgZWxzZSB7CisgICAgICAgIGlmIChhID09IGIpIHsKKyAgICAgICAgICAgIC8qIFNwZWNpYWwgY2FzZSAiYVtpOmpdID0gYSIgLS0gY29weSBiIGZpcnN0ICovCisgICAgICAgICAgICB2ID0gbGlzdF9zbGljZShiLCAwLCBQeV9TSVpFKGIpKTsKKyAgICAgICAgICAgIGlmICh2ID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIHJlc3VsdCA9IGxpc3RfYXNzX3NsaWNlKGEsIGlsb3csIGloaWdoLCB2KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgdl9hc19TRiA9IFB5U2VxdWVuY2VfRmFzdCh2LCAiY2FuIG9ubHkgYXNzaWduIGFuIGl0ZXJhYmxlIik7CisgICAgICAgIGlmKHZfYXNfU0YgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gRXJyb3I7CisgICAgICAgIG4gPSBQeVNlcXVlbmNlX0Zhc3RfR0VUX1NJWkUodl9hc19TRik7CisgICAgICAgIHZpdGVtID0gUHlTZXF1ZW5jZV9GYXN0X0lURU1TKHZfYXNfU0YpOworICAgIH0KKyAgICBpZiAoaWxvdyA8IDApCisgICAgICAgIGlsb3cgPSAwOworICAgIGVsc2UgaWYgKGlsb3cgPiBQeV9TSVpFKGEpKQorICAgICAgICBpbG93ID0gUHlfU0laRShhKTsKIAotCWlmIChpaGlnaCA8IGlsb3cpCi0JCWloaWdoID0gaWxvdzsKLQllbHNlIGlmIChpaGlnaCA+IFB5X1NJWkUoYSkpCi0JCWloaWdoID0gUHlfU0laRShhKTsKKyAgICBpZiAoaWhpZ2ggPCBpbG93KQorICAgICAgICBpaGlnaCA9IGlsb3c7CisgICAgZWxzZSBpZiAoaWhpZ2ggPiBQeV9TSVpFKGEpKQorICAgICAgICBpaGlnaCA9IFB5X1NJWkUoYSk7CiAKLQlub3JpZyA9IGloaWdoIC0gaWxvdzsKLQlhc3NlcnQobm9yaWcgPj0gMCk7Ci0JZCA9IG4gLSBub3JpZzsKLQlpZiAoUHlfU0laRShhKSArIGQgPT0gMCkgewotCQlQeV9YREVDUkVGKHZfYXNfU0YpOwotCQlyZXR1cm4gbGlzdF9jbGVhcihhKTsKLQl9Ci0JaXRlbSA9IGEtPm9iX2l0ZW07Ci0JLyogcmVjeWNsZSB0aGUgaXRlbXMgdGhhdCB3ZSBhcmUgYWJvdXQgdG8gcmVtb3ZlICovCi0JcyA9IG5vcmlnICogc2l6ZW9mKFB5T2JqZWN0ICopOwotCWlmIChzID4gc2l6ZW9mKHJlY3ljbGVfb25fc3RhY2spKSB7Ci0JCXJlY3ljbGUgPSAoUHlPYmplY3QgKiopUHlNZW1fTUFMTE9DKHMpOwotCQlpZiAocmVjeWNsZSA9PSBOVUxMKSB7Ci0JCQlQeUVycl9Ob01lbW9yeSgpOwotCQkJZ290byBFcnJvcjsKLQkJfQotCX0KLQltZW1jcHkocmVjeWNsZSwgJml0ZW1baWxvd10sIHMpOworICAgIG5vcmlnID0gaWhpZ2ggLSBpbG93OworICAgIGFzc2VydChub3JpZyA+PSAwKTsKKyAgICBkID0gbiAtIG5vcmlnOworICAgIGlmIChQeV9TSVpFKGEpICsgZCA9PSAwKSB7CisgICAgICAgIFB5X1hERUNSRUYodl9hc19TRik7CisgICAgICAgIHJldHVybiBsaXN0X2NsZWFyKGEpOworICAgIH0KKyAgICBpdGVtID0gYS0+b2JfaXRlbTsKKyAgICAvKiByZWN5Y2xlIHRoZSBpdGVtcyB0aGF0IHdlIGFyZSBhYm91dCB0byByZW1vdmUgKi8KKyAgICBzID0gbm9yaWcgKiBzaXplb2YoUHlPYmplY3QgKik7CisgICAgaWYgKHMgPiBzaXplb2YocmVjeWNsZV9vbl9zdGFjaykpIHsKKyAgICAgICAgcmVjeWNsZSA9IChQeU9iamVjdCAqKilQeU1lbV9NQUxMT0Mocyk7CisgICAgICAgIGlmIChyZWN5Y2xlID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgICAgICBnb3RvIEVycm9yOworICAgICAgICB9CisgICAgfQorICAgIG1lbWNweShyZWN5Y2xlLCAmaXRlbVtpbG93XSwgcyk7CiAKLQlpZiAoZCA8IDApIHsgLyogRGVsZXRlIC1kIGl0ZW1zICovCi0JCW1lbW1vdmUoJml0ZW1baWhpZ2grZF0sICZpdGVtW2loaWdoXSwKLQkJCShQeV9TSVpFKGEpIC0gaWhpZ2gpKnNpemVvZihQeU9iamVjdCAqKSk7Ci0JCWxpc3RfcmVzaXplKGEsIFB5X1NJWkUoYSkgKyBkKTsKLQkJaXRlbSA9IGEtPm9iX2l0ZW07Ci0JfQotCWVsc2UgaWYgKGQgPiAwKSB7IC8qIEluc2VydCBkIGl0ZW1zICovCi0JCWsgPSBQeV9TSVpFKGEpOwotCQlpZiAobGlzdF9yZXNpemUoYSwgaytkKSA8IDApCi0JCQlnb3RvIEVycm9yOwotCQlpdGVtID0gYS0+b2JfaXRlbTsKLQkJbWVtbW92ZSgmaXRlbVtpaGlnaCtkXSwgJml0ZW1baWhpZ2hdLAotCQkJKGsgLSBpaGlnaCkqc2l6ZW9mKFB5T2JqZWN0ICopKTsKLQl9Ci0JZm9yIChrID0gMDsgayA8IG47IGsrKywgaWxvdysrKSB7Ci0JCVB5T2JqZWN0ICp3ID0gdml0ZW1ba107Ci0JCVB5X1hJTkNSRUYodyk7Ci0JCWl0ZW1baWxvd10gPSB3OwotCX0KLQlmb3IgKGsgPSBub3JpZyAtIDE7IGsgPj0gMDsgLS1rKQotCQlQeV9YREVDUkVGKHJlY3ljbGVba10pOwotCXJlc3VsdCA9IDA7CisgICAgaWYgKGQgPCAwKSB7IC8qIERlbGV0ZSAtZCBpdGVtcyAqLworICAgICAgICBtZW1tb3ZlKCZpdGVtW2loaWdoK2RdLCAmaXRlbVtpaGlnaF0sCisgICAgICAgICAgICAoUHlfU0laRShhKSAtIGloaWdoKSpzaXplb2YoUHlPYmplY3QgKikpOworICAgICAgICBsaXN0X3Jlc2l6ZShhLCBQeV9TSVpFKGEpICsgZCk7CisgICAgICAgIGl0ZW0gPSBhLT5vYl9pdGVtOworICAgIH0KKyAgICBlbHNlIGlmIChkID4gMCkgeyAvKiBJbnNlcnQgZCBpdGVtcyAqLworICAgICAgICBrID0gUHlfU0laRShhKTsKKyAgICAgICAgaWYgKGxpc3RfcmVzaXplKGEsIGsrZCkgPCAwKQorICAgICAgICAgICAgZ290byBFcnJvcjsKKyAgICAgICAgaXRlbSA9IGEtPm9iX2l0ZW07CisgICAgICAgIG1lbW1vdmUoJml0ZW1baWhpZ2grZF0sICZpdGVtW2loaWdoXSwKKyAgICAgICAgICAgIChrIC0gaWhpZ2gpKnNpemVvZihQeU9iamVjdCAqKSk7CisgICAgfQorICAgIGZvciAoayA9IDA7IGsgPCBuOyBrKyssIGlsb3crKykgeworICAgICAgICBQeU9iamVjdCAqdyA9IHZpdGVtW2tdOworICAgICAgICBQeV9YSU5DUkVGKHcpOworICAgICAgICBpdGVtW2lsb3ddID0gdzsKKyAgICB9CisgICAgZm9yIChrID0gbm9yaWcgLSAxOyBrID49IDA7IC0taykKKyAgICAgICAgUHlfWERFQ1JFRihyZWN5Y2xlW2tdKTsKKyAgICByZXN1bHQgPSAwOwogIEVycm9yOgotCWlmIChyZWN5Y2xlICE9IHJlY3ljbGVfb25fc3RhY2spCi0JCVB5TWVtX0ZSRUUocmVjeWNsZSk7Ci0JUHlfWERFQ1JFRih2X2FzX1NGKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIGlmIChyZWN5Y2xlICE9IHJlY3ljbGVfb25fc3RhY2spCisgICAgICAgIFB5TWVtX0ZSRUUocmVjeWNsZSk7CisgICAgUHlfWERFQ1JFRih2X2FzX1NGKTsKKyAgICByZXR1cm4gcmVzdWx0OwogI3VuZGVmIGIKIH0KIAogaW50CiBQeUxpc3RfU2V0U2xpY2UoUHlPYmplY3QgKmEsIFB5X3NzaXplX3QgaWxvdywgUHlfc3NpemVfdCBpaGlnaCwgUHlPYmplY3QgKnYpCiB7Ci0JaWYgKCFQeUxpc3RfQ2hlY2soYSkpIHsKLQkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JcmV0dXJuIGxpc3RfYXNzX3NsaWNlKChQeUxpc3RPYmplY3QgKilhLCBpbG93LCBpaGlnaCwgdik7CisgICAgaWYgKCFQeUxpc3RfQ2hlY2soYSkpIHsKKyAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIGxpc3RfYXNzX3NsaWNlKChQeUxpc3RPYmplY3QgKilhLCBpbG93LCBpaGlnaCwgdik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBsaXN0X2lucGxhY2VfcmVwZWF0KFB5TGlzdE9iamVjdCAqc2VsZiwgUHlfc3NpemVfdCBuKQogewotCVB5T2JqZWN0ICoqaXRlbXM7Ci0JUHlfc3NpemVfdCBzaXplLCBpLCBqLCBwOworICAgIFB5T2JqZWN0ICoqaXRlbXM7CisgICAgUHlfc3NpemVfdCBzaXplLCBpLCBqLCBwOwogCiAKLQlzaXplID0gUHlMaXN0X0dFVF9TSVpFKHNlbGYpOwotCWlmIChzaXplID09IDAgfHwgbiA9PSAxKSB7Ci0JCVB5X0lOQ1JFRihzZWxmKTsKLQkJcmV0dXJuIChQeU9iamVjdCAqKXNlbGY7Ci0JfQorICAgIHNpemUgPSBQeUxpc3RfR0VUX1NJWkUoc2VsZik7CisgICAgaWYgKHNpemUgPT0gMCB8fCBuID09IDEpIHsKKyAgICAgICAgUHlfSU5DUkVGKHNlbGYpOworICAgICAgICByZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKKyAgICB9CiAKLQlpZiAobiA8IDEpIHsKLQkJKHZvaWQpbGlzdF9jbGVhcihzZWxmKTsKLQkJUHlfSU5DUkVGKHNlbGYpOwotCQlyZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKLQl9CisgICAgaWYgKG4gPCAxKSB7CisgICAgICAgICh2b2lkKWxpc3RfY2xlYXIoc2VsZik7CisgICAgICAgIFB5X0lOQ1JFRihzZWxmKTsKKyAgICAgICAgcmV0dXJuIChQeU9iamVjdCAqKXNlbGY7CisgICAgfQogCi0JaWYgKHNpemUgPiBQWV9TU0laRV9UX01BWCAvIG4pIHsKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JfQorICAgIGlmIChzaXplID4gUFlfU1NJWkVfVF9NQVggLyBuKSB7CisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIH0KIAotCWlmIChsaXN0X3Jlc2l6ZShzZWxmLCBzaXplKm4pID09IC0xKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAobGlzdF9yZXNpemUoc2VsZiwgc2l6ZSpuKSA9PSAtMSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlwID0gc2l6ZTsKLQlpdGVtcyA9IHNlbGYtPm9iX2l0ZW07Ci0JZm9yIChpID0gMTsgaSA8IG47IGkrKykgeyAvKiBTdGFydCBjb3VudGluZyBhdCAxLCBub3QgMCAqLwotCQlmb3IgKGogPSAwOyBqIDwgc2l6ZTsgaisrKSB7Ci0JCQlQeU9iamVjdCAqbyA9IGl0ZW1zW2pdOwotCQkJUHlfSU5DUkVGKG8pOwotCQkJaXRlbXNbcCsrXSA9IG87Ci0JCX0KLQl9Ci0JUHlfSU5DUkVGKHNlbGYpOwotCXJldHVybiAoUHlPYmplY3QgKilzZWxmOworICAgIHAgPSBzaXplOworICAgIGl0ZW1zID0gc2VsZi0+b2JfaXRlbTsKKyAgICBmb3IgKGkgPSAxOyBpIDwgbjsgaSsrKSB7IC8qIFN0YXJ0IGNvdW50aW5nIGF0IDEsIG5vdCAwICovCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBzaXplOyBqKyspIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpvID0gaXRlbXNbal07CisgICAgICAgICAgICBQeV9JTkNSRUYobyk7CisgICAgICAgICAgICBpdGVtc1twKytdID0gbzsKKyAgICAgICAgfQorICAgIH0KKyAgICBQeV9JTkNSRUYoc2VsZik7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKXNlbGY7CiB9CiAKIHN0YXRpYyBpbnQKIGxpc3RfYXNzX2l0ZW0oUHlMaXN0T2JqZWN0ICphLCBQeV9zc2l6ZV90IGksIFB5T2JqZWN0ICp2KQogewotCVB5T2JqZWN0ICpvbGRfdmFsdWU7Ci0JaWYgKGkgPCAwIHx8IGkgPj0gUHlfU0laRShhKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwKLQkJCQkibGlzdCBhc3NpZ25tZW50IGluZGV4IG91dCBvZiByYW5nZSIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmICh2ID09IE5VTEwpCi0JCXJldHVybiBsaXN0X2Fzc19zbGljZShhLCBpLCBpKzEsIHYpOwotCVB5X0lOQ1JFRih2KTsKLQlvbGRfdmFsdWUgPSBhLT5vYl9pdGVtW2ldOwotCWEtPm9iX2l0ZW1baV0gPSB2OwotCVB5X0RFQ1JFRihvbGRfdmFsdWUpOwotCXJldHVybiAwOworICAgIFB5T2JqZWN0ICpvbGRfdmFsdWU7CisgICAgaWYgKGkgPCAwIHx8IGkgPj0gUHlfU0laRShhKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJsaXN0IGFzc2lnbm1lbnQgaW5kZXggb3V0IG9mIHJhbmdlIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKHYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIGxpc3RfYXNzX3NsaWNlKGEsIGksIGkrMSwgdik7CisgICAgUHlfSU5DUkVGKHYpOworICAgIG9sZF92YWx1ZSA9IGEtPm9iX2l0ZW1baV07CisgICAgYS0+b2JfaXRlbVtpXSA9IHY7CisgICAgUHlfREVDUkVGKG9sZF92YWx1ZSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBsaXN0aW5zZXJ0KFB5TGlzdE9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlfc3NpemVfdCBpOwotCVB5T2JqZWN0ICp2OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibk86aW5zZXJ0IiwgJmksICZ2KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKGluczEoc2VsZiwgaSwgdikgPT0gMCkKLQkJUHlfUkVUVVJOX05PTkU7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlfc3NpemVfdCBpOworICAgIFB5T2JqZWN0ICp2OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibk86aW5zZXJ0IiwgJmksICZ2KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKGluczEoc2VsZiwgaSwgdikgPT0gMCkKKyAgICAgICAgUHlfUkVUVVJOX05PTkU7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBsaXN0YXBwZW5kKFB5TGlzdE9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnYpCiB7Ci0JaWYgKGFwcDEoc2VsZiwgdikgPT0gMCkKLQkJUHlfUkVUVVJOX05PTkU7Ci0JcmV0dXJuIE5VTEw7CisgICAgaWYgKGFwcDEoc2VsZiwgdikgPT0gMCkKKyAgICAgICAgUHlfUkVUVVJOX05PTkU7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBsaXN0ZXh0ZW5kKFB5TGlzdE9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmIpCiB7Ci0JUHlPYmplY3QgKml0OyAgICAgIC8qIGl0ZXIodikgKi8KLQlQeV9zc2l6ZV90IG07CQkgICAvKiBzaXplIG9mIHNlbGYgKi8KLQlQeV9zc2l6ZV90IG47CQkgICAvKiBndWVzcyBmb3Igc2l6ZSBvZiBiICovCi0JUHlfc3NpemVfdCBtbjsJCSAgIC8qIG0gKyBuICovCi0JUHlfc3NpemVfdCBpOwotCVB5T2JqZWN0ICooKml0ZXJuZXh0KShQeU9iamVjdCAqKTsKKyAgICBQeU9iamVjdCAqaXQ7ICAgICAgLyogaXRlcih2KSAqLworICAgIFB5X3NzaXplX3QgbTsgICAgICAgICAgICAgICAgICAvKiBzaXplIG9mIHNlbGYgKi8KKyAgICBQeV9zc2l6ZV90IG47ICAgICAgICAgICAgICAgICAgLyogZ3Vlc3MgZm9yIHNpemUgb2YgYiAqLworICAgIFB5X3NzaXplX3QgbW47ICAgICAgICAgICAgICAgICAvKiBtICsgbiAqLworICAgIFB5X3NzaXplX3QgaTsKKyAgICBQeU9iamVjdCAqKCppdGVybmV4dCkoUHlPYmplY3QgKik7CiAKLQkvKiBTcGVjaWFsIGNhc2VzOgotCSAgIDEpIGxpc3RzIGFuZCB0dXBsZXMgd2hpY2ggY2FuIHVzZSBQeVNlcXVlbmNlX0Zhc3Qgb3BzCi0JICAgMikgZXh0ZW5kaW5nIHNlbGYgdG8gc2VsZiByZXF1aXJlcyBtYWtpbmcgYSBjb3B5IGZpcnN0Ci0JKi8KLQlpZiAoUHlMaXN0X0NoZWNrRXhhY3QoYikgfHwgUHlUdXBsZV9DaGVja0V4YWN0KGIpIHx8IChQeU9iamVjdCAqKXNlbGYgPT0gYikgewotCQlQeU9iamVjdCAqKnNyYywgKipkZXN0OwotCQliID0gUHlTZXF1ZW5jZV9GYXN0KGIsICJhcmd1bWVudCBtdXN0IGJlIGl0ZXJhYmxlIik7Ci0JCWlmICghYikKLQkJCXJldHVybiBOVUxMOwotCQluID0gUHlTZXF1ZW5jZV9GYXN0X0dFVF9TSVpFKGIpOwotCQlpZiAobiA9PSAwKSB7Ci0JCQkvKiBzaG9ydCBjaXJjdWl0IHdoZW4gYiBpcyBlbXB0eSAqLwotCQkJUHlfREVDUkVGKGIpOwotCQkJUHlfUkVUVVJOX05PTkU7Ci0JCX0KLQkJbSA9IFB5X1NJWkUoc2VsZik7Ci0JCWlmIChsaXN0X3Jlc2l6ZShzZWxmLCBtICsgbikgPT0gLTEpIHsKLQkJCVB5X0RFQ1JFRihiKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCS8qIG5vdGUgdGhhdCB3ZSBtYXkgc3RpbGwgaGF2ZSBzZWxmID09IGIgaGVyZSBmb3IgdGhlCi0JCSAqIHNpdHVhdGlvbiBhLmV4dGVuZChhKSwgYnV0IHRoZSBmb2xsb3dpbmcgY29kZSB3b3JrcwotCQkgKiBpbiB0aGF0IGNhc2UgdG9vLiAgSnVzdCBtYWtlIHN1cmUgdG8gcmVzaXplIHNlbGYKLQkJICogYmVmb3JlIGNhbGxpbmcgUHlTZXF1ZW5jZV9GYXN0X0lURU1TLgotCQkgKi8KLQkJLyogcG9wdWxhdGUgdGhlIGVuZCBvZiBzZWxmIHdpdGggYidzIGl0ZW1zICovCi0JCXNyYyA9IFB5U2VxdWVuY2VfRmFzdF9JVEVNUyhiKTsKLQkJZGVzdCA9IHNlbGYtPm9iX2l0ZW0gKyBtOwotCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCQlQeU9iamVjdCAqbyA9IHNyY1tpXTsKLQkJCVB5X0lOQ1JFRihvKTsKLQkJCWRlc3RbaV0gPSBvOwotCQl9Ci0JCVB5X0RFQ1JFRihiKTsKLQkJUHlfUkVUVVJOX05PTkU7Ci0JfQorICAgIC8qIFNwZWNpYWwgY2FzZXM6CisgICAgICAgMSkgbGlzdHMgYW5kIHR1cGxlcyB3aGljaCBjYW4gdXNlIFB5U2VxdWVuY2VfRmFzdCBvcHMKKyAgICAgICAyKSBleHRlbmRpbmcgc2VsZiB0byBzZWxmIHJlcXVpcmVzIG1ha2luZyBhIGNvcHkgZmlyc3QKKyAgICAqLworICAgIGlmIChQeUxpc3RfQ2hlY2tFeGFjdChiKSB8fCBQeVR1cGxlX0NoZWNrRXhhY3QoYikgfHwgKFB5T2JqZWN0ICopc2VsZiA9PSBiKSB7CisgICAgICAgIFB5T2JqZWN0ICoqc3JjLCAqKmRlc3Q7CisgICAgICAgIGIgPSBQeVNlcXVlbmNlX0Zhc3QoYiwgImFyZ3VtZW50IG11c3QgYmUgaXRlcmFibGUiKTsKKyAgICAgICAgaWYgKCFiKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIG4gPSBQeVNlcXVlbmNlX0Zhc3RfR0VUX1NJWkUoYik7CisgICAgICAgIGlmIChuID09IDApIHsKKyAgICAgICAgICAgIC8qIHNob3J0IGNpcmN1aXQgd2hlbiBiIGlzIGVtcHR5ICovCisgICAgICAgICAgICBQeV9ERUNSRUYoYik7CisgICAgICAgICAgICBQeV9SRVRVUk5fTk9ORTsKKyAgICAgICAgfQorICAgICAgICBtID0gUHlfU0laRShzZWxmKTsKKyAgICAgICAgaWYgKGxpc3RfcmVzaXplKHNlbGYsIG0gKyBuKSA9PSAtMSkgeworICAgICAgICAgICAgUHlfREVDUkVGKGIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgLyogbm90ZSB0aGF0IHdlIG1heSBzdGlsbCBoYXZlIHNlbGYgPT0gYiBoZXJlIGZvciB0aGUKKyAgICAgICAgICogc2l0dWF0aW9uIGEuZXh0ZW5kKGEpLCBidXQgdGhlIGZvbGxvd2luZyBjb2RlIHdvcmtzCisgICAgICAgICAqIGluIHRoYXQgY2FzZSB0b28uICBKdXN0IG1ha2Ugc3VyZSB0byByZXNpemUgc2VsZgorICAgICAgICAgKiBiZWZvcmUgY2FsbGluZyBQeVNlcXVlbmNlX0Zhc3RfSVRFTVMuCisgICAgICAgICAqLworICAgICAgICAvKiBwb3B1bGF0ZSB0aGUgZW5kIG9mIHNlbGYgd2l0aCBiJ3MgaXRlbXMgKi8KKyAgICAgICAgc3JjID0gUHlTZXF1ZW5jZV9GYXN0X0lURU1TKGIpOworICAgICAgICBkZXN0ID0gc2VsZi0+b2JfaXRlbSArIG07CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpvID0gc3JjW2ldOworICAgICAgICAgICAgUHlfSU5DUkVGKG8pOworICAgICAgICAgICAgZGVzdFtpXSA9IG87CisgICAgICAgIH0KKyAgICAgICAgUHlfREVDUkVGKGIpOworICAgICAgICBQeV9SRVRVUk5fTk9ORTsKKyAgICB9CiAKLQlpdCA9IFB5T2JqZWN0X0dldEl0ZXIoYik7Ci0JaWYgKGl0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWl0ZXJuZXh0ID0gKml0LT5vYl90eXBlLT50cF9pdGVybmV4dDsKKyAgICBpdCA9IFB5T2JqZWN0X0dldEl0ZXIoYik7CisgICAgaWYgKGl0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGl0ZXJuZXh0ID0gKml0LT5vYl90eXBlLT50cF9pdGVybmV4dDsKIAotCS8qIEd1ZXNzIGEgcmVzdWx0IGxpc3Qgc2l6ZS4gKi8KLQluID0gX1B5T2JqZWN0X0xlbmd0aEhpbnQoYiwgOCk7Ci0JaWYgKG4gPT0gLTEpIHsKLQkJUHlfREVDUkVGKGl0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCW0gPSBQeV9TSVpFKHNlbGYpOwotCW1uID0gbSArIG47Ci0JaWYgKG1uID49IG0pIHsKLQkJLyogTWFrZSByb29tLiAqLwotCQlpZiAobGlzdF9yZXNpemUoc2VsZiwgbW4pID09IC0xKQotCQkJZ290byBlcnJvcjsKLQkJLyogTWFrZSB0aGUgbGlzdCBzYW5lIGFnYWluLiAqLwotCQlQeV9TSVpFKHNlbGYpID0gbTsKLQl9Ci0JLyogRWxzZSBtICsgbiBvdmVyZmxvd2VkOyBvbiB0aGUgY2hhbmNlIHRoYXQgbiBsaWVkLCBhbmQgdGhlcmUgcmVhbGx5Ci0JICogaXMgZW5vdWdoIHJvb20sIGlnbm9yZSBpdC4gIElmIG4gd2FzIHRlbGxpbmcgdGhlIHRydXRoLCB3ZSdsbAotCSAqIGV2ZW50dWFsbHkgcnVuIG91dCBvZiBtZW1vcnkgZHVyaW5nIHRoZSBsb29wLgotCSAqLworICAgIC8qIEd1ZXNzIGEgcmVzdWx0IGxpc3Qgc2l6ZS4gKi8KKyAgICBuID0gX1B5T2JqZWN0X0xlbmd0aEhpbnQoYiwgOCk7CisgICAgaWYgKG4gPT0gLTEpIHsKKyAgICAgICAgUHlfREVDUkVGKGl0KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIG0gPSBQeV9TSVpFKHNlbGYpOworICAgIG1uID0gbSArIG47CisgICAgaWYgKG1uID49IG0pIHsKKyAgICAgICAgLyogTWFrZSByb29tLiAqLworICAgICAgICBpZiAobGlzdF9yZXNpemUoc2VsZiwgbW4pID09IC0xKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgLyogTWFrZSB0aGUgbGlzdCBzYW5lIGFnYWluLiAqLworICAgICAgICBQeV9TSVpFKHNlbGYpID0gbTsKKyAgICB9CisgICAgLyogRWxzZSBtICsgbiBvdmVyZmxvd2VkOyBvbiB0aGUgY2hhbmNlIHRoYXQgbiBsaWVkLCBhbmQgdGhlcmUgcmVhbGx5CisgICAgICogaXMgZW5vdWdoIHJvb20sIGlnbm9yZSBpdC4gIElmIG4gd2FzIHRlbGxpbmcgdGhlIHRydXRoLCB3ZSdsbAorICAgICAqIGV2ZW50dWFsbHkgcnVuIG91dCBvZiBtZW1vcnkgZHVyaW5nIHRoZSBsb29wLgorICAgICAqLwogCi0JLyogUnVuIGl0ZXJhdG9yIHRvIGV4aGF1c3Rpb24uICovCi0JZm9yICg7OykgewotCQlQeU9iamVjdCAqaXRlbSA9IGl0ZXJuZXh0KGl0KTsKLQkJaWYgKGl0ZW0gPT0gTlVMTCkgewotCQkJaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKLQkJCQlpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19TdG9wSXRlcmF0aW9uKSkKLQkJCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCQllbHNlCi0JCQkJCWdvdG8gZXJyb3I7Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoUHlfU0laRShzZWxmKSA8IHNlbGYtPmFsbG9jYXRlZCkgewotCQkJLyogc3RlYWxzIHJlZiAqLwotCQkJUHlMaXN0X1NFVF9JVEVNKHNlbGYsIFB5X1NJWkUoc2VsZiksIGl0ZW0pOwotCQkJKytQeV9TSVpFKHNlbGYpOwotCQl9Ci0JCWVsc2UgewotCQkJaW50IHN0YXR1cyA9IGFwcDEoc2VsZiwgaXRlbSk7Ci0JCQlQeV9ERUNSRUYoaXRlbSk7ICAvKiBhcHBlbmQgY3JlYXRlcyBhIG5ldyByZWYgKi8KLQkJCWlmIChzdGF0dXMgPCAwKQotCQkJCWdvdG8gZXJyb3I7Ci0JCX0KLQl9CisgICAgLyogUnVuIGl0ZXJhdG9yIHRvIGV4aGF1c3Rpb24uICovCisgICAgZm9yICg7OykgeworICAgICAgICBQeU9iamVjdCAqaXRlbSA9IGl0ZXJuZXh0KGl0KTsKKyAgICAgICAgaWYgKGl0ZW0gPT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19TdG9wSXRlcmF0aW9uKSkKKyAgICAgICAgICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoUHlfU0laRShzZWxmKSA8IHNlbGYtPmFsbG9jYXRlZCkgeworICAgICAgICAgICAgLyogc3RlYWxzIHJlZiAqLworICAgICAgICAgICAgUHlMaXN0X1NFVF9JVEVNKHNlbGYsIFB5X1NJWkUoc2VsZiksIGl0ZW0pOworICAgICAgICAgICAgKytQeV9TSVpFKHNlbGYpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaW50IHN0YXR1cyA9IGFwcDEoc2VsZiwgaXRlbSk7CisgICAgICAgICAgICBQeV9ERUNSRUYoaXRlbSk7ICAvKiBhcHBlbmQgY3JlYXRlcyBhIG5ldyByZWYgKi8KKyAgICAgICAgICAgIGlmIChzdGF0dXMgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKiBDdXQgYmFjayByZXN1bHQgbGlzdCBpZiBpbml0aWFsIGd1ZXNzIHdhcyB0b28gbGFyZ2UuICovCi0JaWYgKFB5X1NJWkUoc2VsZikgPCBzZWxmLT5hbGxvY2F0ZWQpCi0JCWxpc3RfcmVzaXplKHNlbGYsIFB5X1NJWkUoc2VsZikpOyAgLyogc2hyaW5raW5nIGNhbid0IGZhaWwgKi8KKyAgICAvKiBDdXQgYmFjayByZXN1bHQgbGlzdCBpZiBpbml0aWFsIGd1ZXNzIHdhcyB0b28gbGFyZ2UuICovCisgICAgaWYgKFB5X1NJWkUoc2VsZikgPCBzZWxmLT5hbGxvY2F0ZWQpCisgICAgICAgIGxpc3RfcmVzaXplKHNlbGYsIFB5X1NJWkUoc2VsZikpOyAgLyogc2hyaW5raW5nIGNhbid0IGZhaWwgKi8KIAotCVB5X0RFQ1JFRihpdCk7Ci0JUHlfUkVUVVJOX05PTkU7CisgICAgUHlfREVDUkVGKGl0KTsKKyAgICBQeV9SRVRVUk5fTk9ORTsKIAogICBlcnJvcjoKLQlQeV9ERUNSRUYoaXQpOwotCXJldHVybiBOVUxMOworICAgIFB5X0RFQ1JFRihpdCk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIFB5T2JqZWN0ICoKIF9QeUxpc3RfRXh0ZW5kKFB5TGlzdE9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmIpCiB7Ci0JcmV0dXJuIGxpc3RleHRlbmQoc2VsZiwgYik7CisgICAgcmV0dXJuIGxpc3RleHRlbmQoc2VsZiwgYik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBsaXN0X2lucGxhY2VfY29uY2F0KFB5TGlzdE9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm90aGVyKQogewotCVB5T2JqZWN0ICpyZXN1bHQ7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKIAotCXJlc3VsdCA9IGxpc3RleHRlbmQoc2VsZiwgb3RoZXIpOwotCWlmIChyZXN1bHQgPT0gTlVMTCkKLQkJcmV0dXJuIHJlc3VsdDsKLQlQeV9ERUNSRUYocmVzdWx0KTsKLQlQeV9JTkNSRUYoc2VsZik7Ci0JcmV0dXJuIChQeU9iamVjdCAqKXNlbGY7CisgICAgcmVzdWx0ID0gbGlzdGV4dGVuZChzZWxmLCBvdGhlcik7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgIFB5X0lOQ1JFRihzZWxmKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGxpc3Rwb3AoUHlMaXN0T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeV9zc2l6ZV90IGkgPSAtMTsKLQlQeU9iamVjdCAqdjsKLQlpbnQgc3RhdHVzOworICAgIFB5X3NzaXplX3QgaSA9IC0xOworICAgIFB5T2JqZWN0ICp2OworICAgIGludCBzdGF0dXM7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxuOnBvcCIsICZpKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8bjpwb3AiLCAmaSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKFB5X1NJWkUoc2VsZikgPT0gMCkgewotCQkvKiBTcGVjaWFsLWNhc2UgbW9zdCBjb21tb24gZmFpbHVyZSBjYXVzZSAqLwotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwgInBvcCBmcm9tIGVtcHR5IGxpc3QiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChpIDwgMCkKLQkJaSArPSBQeV9TSVpFKHNlbGYpOwotCWlmIChpIDwgMCB8fCBpID49IFB5X1NJWkUoc2VsZikpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsICJwb3AgaW5kZXggb3V0IG9mIHJhbmdlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQl2ID0gc2VsZi0+b2JfaXRlbVtpXTsKLQlpZiAoaSA9PSBQeV9TSVpFKHNlbGYpIC0gMSkgewotCQlzdGF0dXMgPSBsaXN0X3Jlc2l6ZShzZWxmLCBQeV9TSVpFKHNlbGYpIC0gMSk7Ci0JCWFzc2VydChzdGF0dXMgPj0gMCk7Ci0JCXJldHVybiB2OyAvKiBhbmQgdiBub3cgb3ducyB0aGUgcmVmZXJlbmNlIHRoZSBsaXN0IGhhZCAqLwotCX0KLQlQeV9JTkNSRUYodik7Ci0Jc3RhdHVzID0gbGlzdF9hc3Nfc2xpY2Uoc2VsZiwgaSwgaSsxLCAoUHlPYmplY3QgKilOVUxMKTsKLQlhc3NlcnQoc3RhdHVzID49IDApOwotCS8qIFVzZSBzdGF0dXMsIHNvIHRoYXQgaW4gYSByZWxlYXNlIGJ1aWxkIGNvbXBpbGVycyBkb24ndAotCSAqIGNvbXBsYWluIGFib3V0IHRoZSB1bnVzZWQgbmFtZS4KLQkgKi8KLQkodm9pZCkgc3RhdHVzOworICAgIGlmIChQeV9TSVpFKHNlbGYpID09IDApIHsKKyAgICAgICAgLyogU3BlY2lhbC1jYXNlIG1vc3QgY29tbW9uIGZhaWx1cmUgY2F1c2UgKi8KKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsICJwb3AgZnJvbSBlbXB0eSBsaXN0Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoaSA8IDApCisgICAgICAgIGkgKz0gUHlfU0laRShzZWxmKTsKKyAgICBpZiAoaSA8IDAgfHwgaSA+PSBQeV9TSVpFKHNlbGYpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLCAicG9wIGluZGV4IG91dCBvZiByYW5nZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgdiA9IHNlbGYtPm9iX2l0ZW1baV07CisgICAgaWYgKGkgPT0gUHlfU0laRShzZWxmKSAtIDEpIHsKKyAgICAgICAgc3RhdHVzID0gbGlzdF9yZXNpemUoc2VsZiwgUHlfU0laRShzZWxmKSAtIDEpOworICAgICAgICBhc3NlcnQoc3RhdHVzID49IDApOworICAgICAgICByZXR1cm4gdjsgLyogYW5kIHYgbm93IG93bnMgdGhlIHJlZmVyZW5jZSB0aGUgbGlzdCBoYWQgKi8KKyAgICB9CisgICAgUHlfSU5DUkVGKHYpOworICAgIHN0YXR1cyA9IGxpc3RfYXNzX3NsaWNlKHNlbGYsIGksIGkrMSwgKFB5T2JqZWN0ICopTlVMTCk7CisgICAgYXNzZXJ0KHN0YXR1cyA+PSAwKTsKKyAgICAvKiBVc2Ugc3RhdHVzLCBzbyB0aGF0IGluIGEgcmVsZWFzZSBidWlsZCBjb21waWxlcnMgZG9uJ3QKKyAgICAgKiBjb21wbGFpbiBhYm91dCB0aGUgdW51c2VkIG5hbWUuCisgICAgICovCisgICAgKHZvaWQpIHN0YXR1czsKIAotCXJldHVybiB2OworICAgIHJldHVybiB2OwogfQogCiAvKiBSZXZlcnNlIGEgc2xpY2Ugb2YgYSBsaXN0IGluIHBsYWNlLCBmcm9tIGxvIHVwIHRvIChleGNsdXNpdmUpIGhpLiAqLwogc3RhdGljIHZvaWQKIHJldmVyc2Vfc2xpY2UoUHlPYmplY3QgKipsbywgUHlPYmplY3QgKipoaSkKIHsKLQlhc3NlcnQobG8gJiYgaGkpOworICAgIGFzc2VydChsbyAmJiBoaSk7CiAKLQktLWhpOwotCXdoaWxlIChsbyA8IGhpKSB7Ci0JCVB5T2JqZWN0ICp0ID0gKmxvOwotCQkqbG8gPSAqaGk7Ci0JCSpoaSA9IHQ7Ci0JCSsrbG87Ci0JCS0taGk7Ci0JfQorICAgIC0taGk7CisgICAgd2hpbGUgKGxvIDwgaGkpIHsKKyAgICAgICAgUHlPYmplY3QgKnQgPSAqbG87CisgICAgICAgICpsbyA9ICpoaTsKKyAgICAgICAgKmhpID0gdDsKKyAgICAgICAgKytsbzsKKyAgICAgICAgLS1oaTsKKyAgICB9CiB9CiAKIC8qIExvdHMgb2YgY29kZSBmb3IgYW4gYWRhcHRpdmUsIHN0YWJsZSwgbmF0dXJhbCBtZXJnZXNvcnQuICBUaGVyZSBhcmUgbWFueQpAQCAtOTg0LDM1ICs5ODQsMzUgQEAKIHN0YXRpYyBpbnQKIGlzbHQoUHlPYmplY3QgKngsIFB5T2JqZWN0ICp5LCBQeU9iamVjdCAqY29tcGFyZSkKIHsKLQlQeU9iamVjdCAqcmVzOwotCVB5T2JqZWN0ICphcmdzOwotCVB5X3NzaXplX3QgaTsKKyAgICBQeU9iamVjdCAqcmVzOworICAgIFB5T2JqZWN0ICphcmdzOworICAgIFB5X3NzaXplX3QgaTsKIAotCWFzc2VydChjb21wYXJlICE9IE5VTEwpOwotCS8qIENhbGwgdGhlIHVzZXIncyBjb21wYXJpc29uIGZ1bmN0aW9uIGFuZCB0cmFuc2xhdGUgdGhlIDMtd2F5Ci0JICogcmVzdWx0IGludG8gdHJ1ZSBvciBmYWxzZSAob3IgZXJyb3IpLgotCSAqLwotCWFyZ3MgPSBQeVR1cGxlX05ldygyKTsKLQlpZiAoYXJncyA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0JUHlfSU5DUkVGKHgpOwotCVB5X0lOQ1JFRih5KTsKLQlQeVR1cGxlX1NFVF9JVEVNKGFyZ3MsIDAsIHgpOwotCVB5VHVwbGVfU0VUX0lURU0oYXJncywgMSwgeSk7Ci0JcmVzID0gUHlPYmplY3RfQ2FsbChjb21wYXJlLCBhcmdzLCBOVUxMKTsKLQlQeV9ERUNSRUYoYXJncyk7Ci0JaWYgKHJlcyA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0JaWYgKCFQeUludF9DaGVjayhyZXMpKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgICJjb21wYXJpc29uIGZ1bmN0aW9uIG11c3QgcmV0dXJuIGludCwgbm90ICUuMjAwcyIsCi0JCQkgICAgIHJlcy0+b2JfdHlwZS0+dHBfbmFtZSk7Ci0JCVB5X0RFQ1JFRihyZXMpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWkgPSBQeUludF9Bc0xvbmcocmVzKTsKLQlQeV9ERUNSRUYocmVzKTsKLQlyZXR1cm4gaSA8IDA7CisgICAgYXNzZXJ0KGNvbXBhcmUgIT0gTlVMTCk7CisgICAgLyogQ2FsbCB0aGUgdXNlcidzIGNvbXBhcmlzb24gZnVuY3Rpb24gYW5kIHRyYW5zbGF0ZSB0aGUgMy13YXkKKyAgICAgKiByZXN1bHQgaW50byB0cnVlIG9yIGZhbHNlIChvciBlcnJvcikuCisgICAgICovCisgICAgYXJncyA9IFB5VHVwbGVfTmV3KDIpOworICAgIGlmIChhcmdzID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBQeV9JTkNSRUYoeCk7CisgICAgUHlfSU5DUkVGKHkpOworICAgIFB5VHVwbGVfU0VUX0lURU0oYXJncywgMCwgeCk7CisgICAgUHlUdXBsZV9TRVRfSVRFTShhcmdzLCAxLCB5KTsKKyAgICByZXMgPSBQeU9iamVjdF9DYWxsKGNvbXBhcmUsIGFyZ3MsIE5VTEwpOworICAgIFB5X0RFQ1JFRihhcmdzKTsKKyAgICBpZiAocmVzID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAoIVB5SW50X0NoZWNrKHJlcykpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJjb21wYXJpc29uIGZ1bmN0aW9uIG11c3QgcmV0dXJuIGludCwgbm90ICUuMjAwcyIsCisgICAgICAgICAgICAgICAgICAgICByZXMtPm9iX3R5cGUtPnRwX25hbWUpOworICAgICAgICBQeV9ERUNSRUYocmVzKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpID0gUHlJbnRfQXNMb25nKHJlcyk7CisgICAgUHlfREVDUkVGKHJlcyk7CisgICAgcmV0dXJuIGkgPCAwOwogfQogCiAvKiBJZiBDT01QQVJFIGlzIE5VTEwsIGNhbGxzIFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbCB3aXRoIFB5X0xULCBlbHNlIGNhbGxzCkBAIC0xMDIwLDE2ICsxMDIwLDE2IEBACiAgKiBzb3J0aW5nIGRvZXMgbWFueSBjb21wYXJpc29ucy4KICAqIFJldHVybnMgLTEgb24gZXJyb3IsIDEgaWYgeCA8IHksIDAgaWYgeCA+PSB5LgogICovCi0jZGVmaW5lIElTTFQoWCwgWSwgQ09NUEFSRSkgKChDT01QQVJFKSA9PSBOVUxMID8JCQlcCi0JCQkgICAgIFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChYLCBZLCBQeV9MVCkgOglcCi0JCQkgICAgIGlzbHQoWCwgWSwgQ09NUEFSRSkpCisjZGVmaW5lIElTTFQoWCwgWSwgQ09NUEFSRSkgKChDT01QQVJFKSA9PSBOVUxMID8gICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgIFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChYLCBZLCBQeV9MVCkgOiAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgIGlzbHQoWCwgWSwgQ09NUEFSRSkpCiAKIC8qIENvbXBhcmUgWCB0byBZIHZpYSAiPCIuICBHb3RvICJmYWlsIiBpZiB0aGUgY29tcGFyaXNvbiByYWlzZXMgYW4KICAgIGVycm9yLiAgRWxzZSAiayIgaXMgc2V0IHRvIHRydWUgaWZmIFg8WSwgYW5kIGFuICJpZiAoaykiIGJsb2NrIGlzCiAgICBzdGFydGVkLiAgSXQgbWFrZXMgbW9yZSBzZW5zZSBpbiBjb250ZXh0IDx3aW5rPi4gIFggYW5kIFkgYXJlIFB5T2JqZWN0KnMuCiAqLwogI2RlZmluZSBJRkxUKFgsIFkpIGlmICgoayA9IElTTFQoWCwgWSwgY29tcGFyZSkpIDwgMCkgZ290byBmYWlsOyAgXAotCQkgICBpZiAoaykKKyAgICAgICAgICAgaWYgKGspCiAKIC8qIGJpbmFyeXNvcnQgaXMgdGhlIGJlc3QgbWV0aG9kIGZvciBzb3J0aW5nIHNtYWxsIGFycmF5czogaXQgZG9lcwogICAgZmV3IGNvbXBhcmVzLCBidXQgY2FuIGRvIGRhdGEgbW92ZW1lbnQgcXVhZHJhdGljIGluIHRoZSBudW1iZXIgb2YKQEAgLTEwNDYsNDggKzEwNDYsNDggQEAKIGJpbmFyeXNvcnQoUHlPYmplY3QgKipsbywgUHlPYmplY3QgKipoaSwgUHlPYmplY3QgKipzdGFydCwgUHlPYmplY3QgKmNvbXBhcmUpCiAgICAgIC8qIGNvbXBhcmUgLS0gY29tcGFyaXNvbiBmdW5jdGlvbiBvYmplY3QsIG9yIE5VTEwgZm9yIGRlZmF1bHQgKi8KIHsKLQlyZWdpc3RlciBQeV9zc2l6ZV90IGs7Ci0JcmVnaXN0ZXIgUHlPYmplY3QgKipsLCAqKnAsICoqcjsKLQlyZWdpc3RlciBQeU9iamVjdCAqcGl2b3Q7CisgICAgcmVnaXN0ZXIgUHlfc3NpemVfdCBrOworICAgIHJlZ2lzdGVyIFB5T2JqZWN0ICoqbCwgKipwLCAqKnI7CisgICAgcmVnaXN0ZXIgUHlPYmplY3QgKnBpdm90OwogCi0JYXNzZXJ0KGxvIDw9IHN0YXJ0ICYmIHN0YXJ0IDw9IGhpKTsKLQkvKiBhc3NlcnQgW2xvLCBzdGFydCkgaXMgc29ydGVkICovCi0JaWYgKGxvID09IHN0YXJ0KQotCQkrK3N0YXJ0OwotCWZvciAoOyBzdGFydCA8IGhpOyArK3N0YXJ0KSB7Ci0JCS8qIHNldCBsIHRvIHdoZXJlICpzdGFydCBiZWxvbmdzICovCi0JCWwgPSBsbzsKLQkJciA9IHN0YXJ0OwotCQlwaXZvdCA9ICpyOwotCQkvKiBJbnZhcmlhbnRzOgotCQkgKiBwaXZvdCA+PSBhbGwgaW4gW2xvLCBsKS4KLQkJICogcGl2b3QgIDwgYWxsIGluIFtyLCBzdGFydCkuCi0JCSAqIFRoZSBzZWNvbmQgaXMgdmFjdW91c2x5IHRydWUgYXQgdGhlIHN0YXJ0LgotCQkgKi8KLQkJYXNzZXJ0KGwgPCByKTsKLQkJZG8gewotCQkJcCA9IGwgKyAoKHIgLSBsKSA+PiAxKTsKLQkJCUlGTFQocGl2b3QsICpwKQotCQkJCXIgPSBwOwotCQkJZWxzZQotCQkJCWwgPSBwKzE7Ci0JCX0gd2hpbGUgKGwgPCByKTsKLQkJYXNzZXJ0KGwgPT0gcik7Ci0JCS8qIFRoZSBpbnZhcmlhbnRzIHN0aWxsIGhvbGQsIHNvIHBpdm90ID49IGFsbCBpbiBbbG8sIGwpIGFuZAotCQkgICBwaXZvdCA8IGFsbCBpbiBbbCwgc3RhcnQpLCBzbyBwaXZvdCBiZWxvbmdzIGF0IGwuICBOb3RlCi0JCSAgIHRoYXQgaWYgdGhlcmUgYXJlIGVsZW1lbnRzIGVxdWFsIHRvIHBpdm90LCBsIHBvaW50cyB0byB0aGUKLQkJICAgZmlyc3Qgc2xvdCBhZnRlciB0aGVtIC0tIHRoYXQncyB3aHkgdGhpcyBzb3J0IGlzIHN0YWJsZS4KLQkJICAgU2xpZGUgb3ZlciB0byBtYWtlIHJvb20uCi0JCSAgIENhdXRpb246IHVzaW5nIG1lbW1vdmUgaXMgbXVjaCBzbG93ZXIgdW5kZXIgTVNWQyA1OwotCQkgICB3ZSdyZSBub3QgdXN1YWxseSBtb3ZpbmcgbWFueSBzbG90cy4gKi8KLQkJZm9yIChwID0gc3RhcnQ7IHAgPiBsOyAtLXApCi0JCQkqcCA9ICoocC0xKTsKLQkJKmwgPSBwaXZvdDsKLQl9Ci0JcmV0dXJuIDA7CisgICAgYXNzZXJ0KGxvIDw9IHN0YXJ0ICYmIHN0YXJ0IDw9IGhpKTsKKyAgICAvKiBhc3NlcnQgW2xvLCBzdGFydCkgaXMgc29ydGVkICovCisgICAgaWYgKGxvID09IHN0YXJ0KQorICAgICAgICArK3N0YXJ0OworICAgIGZvciAoOyBzdGFydCA8IGhpOyArK3N0YXJ0KSB7CisgICAgICAgIC8qIHNldCBsIHRvIHdoZXJlICpzdGFydCBiZWxvbmdzICovCisgICAgICAgIGwgPSBsbzsKKyAgICAgICAgciA9IHN0YXJ0OworICAgICAgICBwaXZvdCA9ICpyOworICAgICAgICAvKiBJbnZhcmlhbnRzOgorICAgICAgICAgKiBwaXZvdCA+PSBhbGwgaW4gW2xvLCBsKS4KKyAgICAgICAgICogcGl2b3QgIDwgYWxsIGluIFtyLCBzdGFydCkuCisgICAgICAgICAqIFRoZSBzZWNvbmQgaXMgdmFjdW91c2x5IHRydWUgYXQgdGhlIHN0YXJ0LgorICAgICAgICAgKi8KKyAgICAgICAgYXNzZXJ0KGwgPCByKTsKKyAgICAgICAgZG8geworICAgICAgICAgICAgcCA9IGwgKyAoKHIgLSBsKSA+PiAxKTsKKyAgICAgICAgICAgIElGTFQocGl2b3QsICpwKQorICAgICAgICAgICAgICAgIHIgPSBwOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGwgPSBwKzE7CisgICAgICAgIH0gd2hpbGUgKGwgPCByKTsKKyAgICAgICAgYXNzZXJ0KGwgPT0gcik7CisgICAgICAgIC8qIFRoZSBpbnZhcmlhbnRzIHN0aWxsIGhvbGQsIHNvIHBpdm90ID49IGFsbCBpbiBbbG8sIGwpIGFuZAorICAgICAgICAgICBwaXZvdCA8IGFsbCBpbiBbbCwgc3RhcnQpLCBzbyBwaXZvdCBiZWxvbmdzIGF0IGwuICBOb3RlCisgICAgICAgICAgIHRoYXQgaWYgdGhlcmUgYXJlIGVsZW1lbnRzIGVxdWFsIHRvIHBpdm90LCBsIHBvaW50cyB0byB0aGUKKyAgICAgICAgICAgZmlyc3Qgc2xvdCBhZnRlciB0aGVtIC0tIHRoYXQncyB3aHkgdGhpcyBzb3J0IGlzIHN0YWJsZS4KKyAgICAgICAgICAgU2xpZGUgb3ZlciB0byBtYWtlIHJvb20uCisgICAgICAgICAgIENhdXRpb246IHVzaW5nIG1lbW1vdmUgaXMgbXVjaCBzbG93ZXIgdW5kZXIgTVNWQyA1OworICAgICAgICAgICB3ZSdyZSBub3QgdXN1YWxseSBtb3ZpbmcgbWFueSBzbG90cy4gKi8KKyAgICAgICAgZm9yIChwID0gc3RhcnQ7IHAgPiBsOyAtLXApCisgICAgICAgICAgICAqcCA9ICoocC0xKTsKKyAgICAgICAgKmwgPSBwaXZvdDsKKyAgICB9CisgICAgcmV0dXJuIDA7CiAKICBmYWlsOgotCXJldHVybiAtMTsKKyAgICByZXR1cm4gLTE7CiB9CiAKIC8qCkBAIC0xMTExLDM1ICsxMTExLDM1IEBACiBzdGF0aWMgUHlfc3NpemVfdAogY291bnRfcnVuKFB5T2JqZWN0ICoqbG8sIFB5T2JqZWN0ICoqaGksIFB5T2JqZWN0ICpjb21wYXJlLCBpbnQgKmRlc2NlbmRpbmcpCiB7Ci0JUHlfc3NpemVfdCBrOwotCVB5X3NzaXplX3QgbjsKKyAgICBQeV9zc2l6ZV90IGs7CisgICAgUHlfc3NpemVfdCBuOwogCi0JYXNzZXJ0KGxvIDwgaGkpOwotCSpkZXNjZW5kaW5nID0gMDsKLQkrK2xvOwotCWlmIChsbyA9PSBoaSkKLQkJcmV0dXJuIDE7CisgICAgYXNzZXJ0KGxvIDwgaGkpOworICAgICpkZXNjZW5kaW5nID0gMDsKKyAgICArK2xvOworICAgIGlmIChsbyA9PSBoaSkKKyAgICAgICAgcmV0dXJuIDE7CiAKLQluID0gMjsKLQlJRkxUKCpsbywgKihsby0xKSkgewotCQkqZGVzY2VuZGluZyA9IDE7Ci0JCWZvciAobG8gPSBsbysxOyBsbyA8IGhpOyArK2xvLCArK24pIHsKLQkJCUlGTFQoKmxvLCAqKGxvLTEpKQotCQkJCTsKLQkJCWVsc2UKLQkJCQlicmVhazsKLQkJfQotCX0KLQllbHNlIHsKLQkJZm9yIChsbyA9IGxvKzE7IGxvIDwgaGk7ICsrbG8sICsrbikgewotCQkJSUZMVCgqbG8sICoobG8tMSkpCi0JCQkJYnJlYWs7Ci0JCX0KLQl9CisgICAgbiA9IDI7CisgICAgSUZMVCgqbG8sICoobG8tMSkpIHsKKyAgICAgICAgKmRlc2NlbmRpbmcgPSAxOworICAgICAgICBmb3IgKGxvID0gbG8rMTsgbG8gPCBoaTsgKytsbywgKytuKSB7CisgICAgICAgICAgICBJRkxUKCpsbywgKihsby0xKSkKKyAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGZvciAobG8gPSBsbysxOyBsbyA8IGhpOyArK2xvLCArK24pIHsKKyAgICAgICAgICAgIElGTFQoKmxvLCAqKGxvLTEpKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQogCi0JcmV0dXJuIG47CisgICAgcmV0dXJuIG47CiBmYWlsOgotCXJldHVybiAtMTsKKyAgICByZXR1cm4gLTE7CiB9CiAKIC8qCkBAIC0xMTY2LDc4ICsxMTY2LDc4IEBACiBzdGF0aWMgUHlfc3NpemVfdAogZ2FsbG9wX2xlZnQoUHlPYmplY3QgKmtleSwgUHlPYmplY3QgKiphLCBQeV9zc2l6ZV90IG4sIFB5X3NzaXplX3QgaGludCwgUHlPYmplY3QgKmNvbXBhcmUpCiB7Ci0JUHlfc3NpemVfdCBvZnM7Ci0JUHlfc3NpemVfdCBsYXN0b2ZzOwotCVB5X3NzaXplX3QgazsKKyAgICBQeV9zc2l6ZV90IG9mczsKKyAgICBQeV9zc2l6ZV90IGxhc3RvZnM7CisgICAgUHlfc3NpemVfdCBrOwogCi0JYXNzZXJ0KGtleSAmJiBhICYmIG4gPiAwICYmIGhpbnQgPj0gMCAmJiBoaW50IDwgbik7CisgICAgYXNzZXJ0KGtleSAmJiBhICYmIG4gPiAwICYmIGhpbnQgPj0gMCAmJiBoaW50IDwgbik7CiAKLQlhICs9IGhpbnQ7Ci0JbGFzdG9mcyA9IDA7Ci0Jb2ZzID0gMTsKLQlJRkxUKCphLCBrZXkpIHsKLQkJLyogYVtoaW50XSA8IGtleSAtLSBnYWxsb3AgcmlnaHQsIHVudGlsCi0JCSAqIGFbaGludCArIGxhc3RvZnNdIDwga2V5IDw9IGFbaGludCArIG9mc10KLQkJICovCi0JCWNvbnN0IFB5X3NzaXplX3QgbWF4b2ZzID0gbiAtIGhpbnQ7CS8qICZhW24tMV0gaXMgaGlnaGVzdCAqLwotCQl3aGlsZSAob2ZzIDwgbWF4b2ZzKSB7Ci0JCQlJRkxUKGFbb2ZzXSwga2V5KSB7Ci0JCQkJbGFzdG9mcyA9IG9mczsKLQkJCQlvZnMgPSAob2ZzIDw8IDEpICsgMTsKLQkJCQlpZiAob2ZzIDw9IDApCS8qIGludCBvdmVyZmxvdyAqLwotCQkJCQlvZnMgPSBtYXhvZnM7Ci0JCQl9Ci0gCQkJZWxzZQkvKiBrZXkgPD0gYVtoaW50ICsgb2ZzXSAqLwotCQkJCWJyZWFrOwotCQl9Ci0JCWlmIChvZnMgPiBtYXhvZnMpCi0JCQlvZnMgPSBtYXhvZnM7Ci0JCS8qIFRyYW5zbGF0ZSBiYWNrIHRvIG9mZnNldHMgcmVsYXRpdmUgdG8gJmFbMF0uICovCi0JCWxhc3RvZnMgKz0gaGludDsKLQkJb2ZzICs9IGhpbnQ7Ci0JfQotCWVsc2UgewotCQkvKiBrZXkgPD0gYVtoaW50XSAtLSBnYWxsb3AgbGVmdCwgdW50aWwKLQkJICogYVtoaW50IC0gb2ZzXSA8IGtleSA8PSBhW2hpbnQgLSBsYXN0b2ZzXQotCQkgKi8KLQkJY29uc3QgUHlfc3NpemVfdCBtYXhvZnMgPSBoaW50ICsgMTsJLyogJmFbMF0gaXMgbG93ZXN0ICovCi0JCXdoaWxlIChvZnMgPCBtYXhvZnMpIHsKLQkJCUlGTFQoKihhLW9mcyksIGtleSkKLQkJCQlicmVhazsKLQkJCS8qIGtleSA8PSBhW2hpbnQgLSBvZnNdICovCi0JCQlsYXN0b2ZzID0gb2ZzOwotCQkJb2ZzID0gKG9mcyA8PCAxKSArIDE7Ci0JCQlpZiAob2ZzIDw9IDApCS8qIGludCBvdmVyZmxvdyAqLwotCQkJCW9mcyA9IG1heG9mczsKLQkJfQotCQlpZiAob2ZzID4gbWF4b2ZzKQotCQkJb2ZzID0gbWF4b2ZzOwotCQkvKiBUcmFuc2xhdGUgYmFjayB0byBwb3NpdGl2ZSBvZmZzZXRzIHJlbGF0aXZlIHRvICZhWzBdLiAqLwotCQlrID0gbGFzdG9mczsKLQkJbGFzdG9mcyA9IGhpbnQgLSBvZnM7Ci0JCW9mcyA9IGhpbnQgLSBrOwotCX0KLQlhIC09IGhpbnQ7CisgICAgYSArPSBoaW50OworICAgIGxhc3RvZnMgPSAwOworICAgIG9mcyA9IDE7CisgICAgSUZMVCgqYSwga2V5KSB7CisgICAgICAgIC8qIGFbaGludF0gPCBrZXkgLS0gZ2FsbG9wIHJpZ2h0LCB1bnRpbAorICAgICAgICAgKiBhW2hpbnQgKyBsYXN0b2ZzXSA8IGtleSA8PSBhW2hpbnQgKyBvZnNdCisgICAgICAgICAqLworICAgICAgICBjb25zdCBQeV9zc2l6ZV90IG1heG9mcyA9IG4gLSBoaW50OyAgICAgICAgICAgICAvKiAmYVtuLTFdIGlzIGhpZ2hlc3QgKi8KKyAgICAgICAgd2hpbGUgKG9mcyA8IG1heG9mcykgeworICAgICAgICAgICAgSUZMVChhW29mc10sIGtleSkgeworICAgICAgICAgICAgICAgIGxhc3RvZnMgPSBvZnM7CisgICAgICAgICAgICAgICAgb2ZzID0gKG9mcyA8PCAxKSArIDE7CisgICAgICAgICAgICAgICAgaWYgKG9mcyA8PSAwKSAgICAgICAgICAgICAgICAgICAvKiBpbnQgb3ZlcmZsb3cgKi8KKyAgICAgICAgICAgICAgICAgICAgb2ZzID0gbWF4b2ZzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAvKiBrZXkgPD0gYVtoaW50ICsgb2ZzXSAqLworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChvZnMgPiBtYXhvZnMpCisgICAgICAgICAgICBvZnMgPSBtYXhvZnM7CisgICAgICAgIC8qIFRyYW5zbGF0ZSBiYWNrIHRvIG9mZnNldHMgcmVsYXRpdmUgdG8gJmFbMF0uICovCisgICAgICAgIGxhc3RvZnMgKz0gaGludDsKKyAgICAgICAgb2ZzICs9IGhpbnQ7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvKiBrZXkgPD0gYVtoaW50XSAtLSBnYWxsb3AgbGVmdCwgdW50aWwKKyAgICAgICAgICogYVtoaW50IC0gb2ZzXSA8IGtleSA8PSBhW2hpbnQgLSBsYXN0b2ZzXQorICAgICAgICAgKi8KKyAgICAgICAgY29uc3QgUHlfc3NpemVfdCBtYXhvZnMgPSBoaW50ICsgMTsgICAgICAgICAgICAgLyogJmFbMF0gaXMgbG93ZXN0ICovCisgICAgICAgIHdoaWxlIChvZnMgPCBtYXhvZnMpIHsKKyAgICAgICAgICAgIElGTFQoKihhLW9mcyksIGtleSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIC8qIGtleSA8PSBhW2hpbnQgLSBvZnNdICovCisgICAgICAgICAgICBsYXN0b2ZzID0gb2ZzOworICAgICAgICAgICAgb2ZzID0gKG9mcyA8PCAxKSArIDE7CisgICAgICAgICAgICBpZiAob2ZzIDw9IDApICAgICAgICAgICAgICAgLyogaW50IG92ZXJmbG93ICovCisgICAgICAgICAgICAgICAgb2ZzID0gbWF4b2ZzOworICAgICAgICB9CisgICAgICAgIGlmIChvZnMgPiBtYXhvZnMpCisgICAgICAgICAgICBvZnMgPSBtYXhvZnM7CisgICAgICAgIC8qIFRyYW5zbGF0ZSBiYWNrIHRvIHBvc2l0aXZlIG9mZnNldHMgcmVsYXRpdmUgdG8gJmFbMF0uICovCisgICAgICAgIGsgPSBsYXN0b2ZzOworICAgICAgICBsYXN0b2ZzID0gaGludCAtIG9mczsKKyAgICAgICAgb2ZzID0gaGludCAtIGs7CisgICAgfQorICAgIGEgLT0gaGludDsKIAotCWFzc2VydCgtMSA8PSBsYXN0b2ZzICYmIGxhc3RvZnMgPCBvZnMgJiYgb2ZzIDw9IG4pOwotCS8qIE5vdyBhW2xhc3RvZnNdIDwga2V5IDw9IGFbb2ZzXSwgc28ga2V5IGJlbG9uZ3Mgc29tZXdoZXJlIHRvIHRoZQotCSAqIHJpZ2h0IG9mIGxhc3RvZnMgYnV0IG5vIGZhcnRoZXIgcmlnaHQgdGhhbiBvZnMuICBEbyBhIGJpbmFyeQotCSAqIHNlYXJjaCwgd2l0aCBpbnZhcmlhbnQgYVtsYXN0b2ZzLTFdIDwga2V5IDw9IGFbb2ZzXS4KLQkgKi8KLQkrK2xhc3RvZnM7Ci0Jd2hpbGUgKGxhc3RvZnMgPCBvZnMpIHsKLQkJUHlfc3NpemVfdCBtID0gbGFzdG9mcyArICgob2ZzIC0gbGFzdG9mcykgPj4gMSk7CisgICAgYXNzZXJ0KC0xIDw9IGxhc3RvZnMgJiYgbGFzdG9mcyA8IG9mcyAmJiBvZnMgPD0gbik7CisgICAgLyogTm93IGFbbGFzdG9mc10gPCBrZXkgPD0gYVtvZnNdLCBzbyBrZXkgYmVsb25ncyBzb21ld2hlcmUgdG8gdGhlCisgICAgICogcmlnaHQgb2YgbGFzdG9mcyBidXQgbm8gZmFydGhlciByaWdodCB0aGFuIG9mcy4gIERvIGEgYmluYXJ5CisgICAgICogc2VhcmNoLCB3aXRoIGludmFyaWFudCBhW2xhc3RvZnMtMV0gPCBrZXkgPD0gYVtvZnNdLgorICAgICAqLworICAgICsrbGFzdG9mczsKKyAgICB3aGlsZSAobGFzdG9mcyA8IG9mcykgeworICAgICAgICBQeV9zc2l6ZV90IG0gPSBsYXN0b2ZzICsgKChvZnMgLSBsYXN0b2ZzKSA+PiAxKTsKIAotCQlJRkxUKGFbbV0sIGtleSkKLQkJCWxhc3RvZnMgPSBtKzE7CS8qIGFbbV0gPCBrZXkgKi8KLQkJZWxzZQotCQkJb2ZzID0gbTsJLyoga2V5IDw9IGFbbV0gKi8KLQl9Ci0JYXNzZXJ0KGxhc3RvZnMgPT0gb2ZzKTsJCS8qIHNvIGFbb2ZzLTFdIDwga2V5IDw9IGFbb2ZzXSAqLwotCXJldHVybiBvZnM7CisgICAgICAgIElGTFQoYVttXSwga2V5KQorICAgICAgICAgICAgbGFzdG9mcyA9IG0rMTsgICAgICAgICAgICAgIC8qIGFbbV0gPCBrZXkgKi8KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgb2ZzID0gbTsgICAgICAgICAgICAgICAgICAgIC8qIGtleSA8PSBhW21dICovCisgICAgfQorICAgIGFzc2VydChsYXN0b2ZzID09IG9mcyk7ICAgICAgICAgICAgIC8qIHNvIGFbb2ZzLTFdIDwga2V5IDw9IGFbb2ZzXSAqLworICAgIHJldHVybiBvZnM7CiAKIGZhaWw6Ci0JcmV0dXJuIC0xOworICAgIHJldHVybiAtMTsKIH0KIAogLyoKQEAgLTEyNTcsNzggKzEyNTcsNzggQEAKIHN0YXRpYyBQeV9zc2l6ZV90CiBnYWxsb3BfcmlnaHQoUHlPYmplY3QgKmtleSwgUHlPYmplY3QgKiphLCBQeV9zc2l6ZV90IG4sIFB5X3NzaXplX3QgaGludCwgUHlPYmplY3QgKmNvbXBhcmUpCiB7Ci0JUHlfc3NpemVfdCBvZnM7Ci0JUHlfc3NpemVfdCBsYXN0b2ZzOwotCVB5X3NzaXplX3QgazsKKyAgICBQeV9zc2l6ZV90IG9mczsKKyAgICBQeV9zc2l6ZV90IGxhc3RvZnM7CisgICAgUHlfc3NpemVfdCBrOwogCi0JYXNzZXJ0KGtleSAmJiBhICYmIG4gPiAwICYmIGhpbnQgPj0gMCAmJiBoaW50IDwgbik7CisgICAgYXNzZXJ0KGtleSAmJiBhICYmIG4gPiAwICYmIGhpbnQgPj0gMCAmJiBoaW50IDwgbik7CiAKLQlhICs9IGhpbnQ7Ci0JbGFzdG9mcyA9IDA7Ci0Jb2ZzID0gMTsKLQlJRkxUKGtleSwgKmEpIHsKLQkJLyoga2V5IDwgYVtoaW50XSAtLSBnYWxsb3AgbGVmdCwgdW50aWwKLQkJICogYVtoaW50IC0gb2ZzXSA8PSBrZXkgPCBhW2hpbnQgLSBsYXN0b2ZzXQotCQkgKi8KLQkJY29uc3QgUHlfc3NpemVfdCBtYXhvZnMgPSBoaW50ICsgMTsJLyogJmFbMF0gaXMgbG93ZXN0ICovCi0JCXdoaWxlIChvZnMgPCBtYXhvZnMpIHsKLQkJCUlGTFQoa2V5LCAqKGEtb2ZzKSkgewotCQkJCWxhc3RvZnMgPSBvZnM7Ci0JCQkJb2ZzID0gKG9mcyA8PCAxKSArIDE7Ci0JCQkJaWYgKG9mcyA8PSAwKQkvKiBpbnQgb3ZlcmZsb3cgKi8KLQkJCQkJb2ZzID0gbWF4b2ZzOwotCQkJfQotCQkJZWxzZQkvKiBhW2hpbnQgLSBvZnNdIDw9IGtleSAqLwotCQkJCWJyZWFrOwotCQl9Ci0JCWlmIChvZnMgPiBtYXhvZnMpCi0JCQlvZnMgPSBtYXhvZnM7Ci0JCS8qIFRyYW5zbGF0ZSBiYWNrIHRvIHBvc2l0aXZlIG9mZnNldHMgcmVsYXRpdmUgdG8gJmFbMF0uICovCi0JCWsgPSBsYXN0b2ZzOwotCQlsYXN0b2ZzID0gaGludCAtIG9mczsKLQkJb2ZzID0gaGludCAtIGs7Ci0JfQotCWVsc2UgewotCQkvKiBhW2hpbnRdIDw9IGtleSAtLSBnYWxsb3AgcmlnaHQsIHVudGlsCi0JCSAqIGFbaGludCArIGxhc3RvZnNdIDw9IGtleSA8IGFbaGludCArIG9mc10KLQkJKi8KLQkJY29uc3QgUHlfc3NpemVfdCBtYXhvZnMgPSBuIC0gaGludDsJLyogJmFbbi0xXSBpcyBoaWdoZXN0ICovCi0JCXdoaWxlIChvZnMgPCBtYXhvZnMpIHsKLQkJCUlGTFQoa2V5LCBhW29mc10pCi0JCQkJYnJlYWs7Ci0JCQkvKiBhW2hpbnQgKyBvZnNdIDw9IGtleSAqLwotCQkJbGFzdG9mcyA9IG9mczsKLQkJCW9mcyA9IChvZnMgPDwgMSkgKyAxOwotCQkJaWYgKG9mcyA8PSAwKQkvKiBpbnQgb3ZlcmZsb3cgKi8KLQkJCQlvZnMgPSBtYXhvZnM7Ci0JCX0KLQkJaWYgKG9mcyA+IG1heG9mcykKLQkJCW9mcyA9IG1heG9mczsKLQkJLyogVHJhbnNsYXRlIGJhY2sgdG8gb2Zmc2V0cyByZWxhdGl2ZSB0byAmYVswXS4gKi8KLQkJbGFzdG9mcyArPSBoaW50OwotCQlvZnMgKz0gaGludDsKLQl9Ci0JYSAtPSBoaW50OworICAgIGEgKz0gaGludDsKKyAgICBsYXN0b2ZzID0gMDsKKyAgICBvZnMgPSAxOworICAgIElGTFQoa2V5LCAqYSkgeworICAgICAgICAvKiBrZXkgPCBhW2hpbnRdIC0tIGdhbGxvcCBsZWZ0LCB1bnRpbAorICAgICAgICAgKiBhW2hpbnQgLSBvZnNdIDw9IGtleSA8IGFbaGludCAtIGxhc3RvZnNdCisgICAgICAgICAqLworICAgICAgICBjb25zdCBQeV9zc2l6ZV90IG1heG9mcyA9IGhpbnQgKyAxOyAgICAgICAgICAgICAvKiAmYVswXSBpcyBsb3dlc3QgKi8KKyAgICAgICAgd2hpbGUgKG9mcyA8IG1heG9mcykgeworICAgICAgICAgICAgSUZMVChrZXksICooYS1vZnMpKSB7CisgICAgICAgICAgICAgICAgbGFzdG9mcyA9IG9mczsKKyAgICAgICAgICAgICAgICBvZnMgPSAob2ZzIDw8IDEpICsgMTsKKyAgICAgICAgICAgICAgICBpZiAob2ZzIDw9IDApICAgICAgICAgICAgICAgICAgIC8qIGludCBvdmVyZmxvdyAqLworICAgICAgICAgICAgICAgICAgICBvZnMgPSBtYXhvZnM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgIC8qIGFbaGludCAtIG9mc10gPD0ga2V5ICovCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG9mcyA+IG1heG9mcykKKyAgICAgICAgICAgIG9mcyA9IG1heG9mczsKKyAgICAgICAgLyogVHJhbnNsYXRlIGJhY2sgdG8gcG9zaXRpdmUgb2Zmc2V0cyByZWxhdGl2ZSB0byAmYVswXS4gKi8KKyAgICAgICAgayA9IGxhc3RvZnM7CisgICAgICAgIGxhc3RvZnMgPSBoaW50IC0gb2ZzOworICAgICAgICBvZnMgPSBoaW50IC0gazsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8qIGFbaGludF0gPD0ga2V5IC0tIGdhbGxvcCByaWdodCwgdW50aWwKKyAgICAgICAgICogYVtoaW50ICsgbGFzdG9mc10gPD0ga2V5IDwgYVtoaW50ICsgb2ZzXQorICAgICAgICAqLworICAgICAgICBjb25zdCBQeV9zc2l6ZV90IG1heG9mcyA9IG4gLSBoaW50OyAgICAgICAgICAgICAvKiAmYVtuLTFdIGlzIGhpZ2hlc3QgKi8KKyAgICAgICAgd2hpbGUgKG9mcyA8IG1heG9mcykgeworICAgICAgICAgICAgSUZMVChrZXksIGFbb2ZzXSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIC8qIGFbaGludCArIG9mc10gPD0ga2V5ICovCisgICAgICAgICAgICBsYXN0b2ZzID0gb2ZzOworICAgICAgICAgICAgb2ZzID0gKG9mcyA8PCAxKSArIDE7CisgICAgICAgICAgICBpZiAob2ZzIDw9IDApICAgICAgICAgICAgICAgLyogaW50IG92ZXJmbG93ICovCisgICAgICAgICAgICAgICAgb2ZzID0gbWF4b2ZzOworICAgICAgICB9CisgICAgICAgIGlmIChvZnMgPiBtYXhvZnMpCisgICAgICAgICAgICBvZnMgPSBtYXhvZnM7CisgICAgICAgIC8qIFRyYW5zbGF0ZSBiYWNrIHRvIG9mZnNldHMgcmVsYXRpdmUgdG8gJmFbMF0uICovCisgICAgICAgIGxhc3RvZnMgKz0gaGludDsKKyAgICAgICAgb2ZzICs9IGhpbnQ7CisgICAgfQorICAgIGEgLT0gaGludDsKIAotCWFzc2VydCgtMSA8PSBsYXN0b2ZzICYmIGxhc3RvZnMgPCBvZnMgJiYgb2ZzIDw9IG4pOwotCS8qIE5vdyBhW2xhc3RvZnNdIDw9IGtleSA8IGFbb2ZzXSwgc28ga2V5IGJlbG9uZ3Mgc29tZXdoZXJlIHRvIHRoZQotCSAqIHJpZ2h0IG9mIGxhc3RvZnMgYnV0IG5vIGZhcnRoZXIgcmlnaHQgdGhhbiBvZnMuICBEbyBhIGJpbmFyeQotCSAqIHNlYXJjaCwgd2l0aCBpbnZhcmlhbnQgYVtsYXN0b2ZzLTFdIDw9IGtleSA8IGFbb2ZzXS4KLQkgKi8KLQkrK2xhc3RvZnM7Ci0Jd2hpbGUgKGxhc3RvZnMgPCBvZnMpIHsKLQkJUHlfc3NpemVfdCBtID0gbGFzdG9mcyArICgob2ZzIC0gbGFzdG9mcykgPj4gMSk7CisgICAgYXNzZXJ0KC0xIDw9IGxhc3RvZnMgJiYgbGFzdG9mcyA8IG9mcyAmJiBvZnMgPD0gbik7CisgICAgLyogTm93IGFbbGFzdG9mc10gPD0ga2V5IDwgYVtvZnNdLCBzbyBrZXkgYmVsb25ncyBzb21ld2hlcmUgdG8gdGhlCisgICAgICogcmlnaHQgb2YgbGFzdG9mcyBidXQgbm8gZmFydGhlciByaWdodCB0aGFuIG9mcy4gIERvIGEgYmluYXJ5CisgICAgICogc2VhcmNoLCB3aXRoIGludmFyaWFudCBhW2xhc3RvZnMtMV0gPD0ga2V5IDwgYVtvZnNdLgorICAgICAqLworICAgICsrbGFzdG9mczsKKyAgICB3aGlsZSAobGFzdG9mcyA8IG9mcykgeworICAgICAgICBQeV9zc2l6ZV90IG0gPSBsYXN0b2ZzICsgKChvZnMgLSBsYXN0b2ZzKSA+PiAxKTsKIAotCQlJRkxUKGtleSwgYVttXSkKLQkJCW9mcyA9IG07CS8qIGtleSA8IGFbbV0gKi8KLQkJZWxzZQotCQkJbGFzdG9mcyA9IG0rMTsJLyogYVttXSA8PSBrZXkgKi8KLQl9Ci0JYXNzZXJ0KGxhc3RvZnMgPT0gb2ZzKTsJCS8qIHNvIGFbb2ZzLTFdIDw9IGtleSA8IGFbb2ZzXSAqLwotCXJldHVybiBvZnM7CisgICAgICAgIElGTFQoa2V5LCBhW21dKQorICAgICAgICAgICAgb2ZzID0gbTsgICAgICAgICAgICAgICAgICAgIC8qIGtleSA8IGFbbV0gKi8KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbGFzdG9mcyA9IG0rMTsgICAgICAgICAgICAgIC8qIGFbbV0gPD0ga2V5ICovCisgICAgfQorICAgIGFzc2VydChsYXN0b2ZzID09IG9mcyk7ICAgICAgICAgICAgIC8qIHNvIGFbb2ZzLTFdIDw9IGtleSA8IGFbb2ZzXSAqLworICAgIHJldHVybiBvZnM7CiAKIGZhaWw6Ci0JcmV0dXJuIC0xOworICAgIHJldHVybiAtMTsKIH0KIAogLyogVGhlIG1heGltdW0gbnVtYmVyIG9mIGVudHJpZXMgaW4gYSBNZXJnZVN0YXRlJ3MgcGVuZGluZy1ydW5zIHN0YWNrLgpAQCAtMTM1MSw1MiArMTM1MSw1MiBAQAogICogYSBjb252ZW5pZW50IHdheSB0byBwYXNzIHN0YXRlIGFyb3VuZCBhbW9uZyB0aGUgaGVscGVyIGZ1bmN0aW9ucy4KICAqLwogc3RydWN0IHNfc2xpY2UgewotCVB5T2JqZWN0ICoqYmFzZTsKLQlQeV9zc2l6ZV90IGxlbjsKKyAgICBQeU9iamVjdCAqKmJhc2U7CisgICAgUHlfc3NpemVfdCBsZW47CiB9OwogCiB0eXBlZGVmIHN0cnVjdCBzX01lcmdlU3RhdGUgewotCS8qIFRoZSB1c2VyLXN1cHBsaWVkIGNvbXBhcmlzb24gZnVuY3Rpb24uIG9yIE5VTEwgaWYgbm9uZSBnaXZlbi4gKi8KLQlQeU9iamVjdCAqY29tcGFyZTsKKyAgICAvKiBUaGUgdXNlci1zdXBwbGllZCBjb21wYXJpc29uIGZ1bmN0aW9uLiBvciBOVUxMIGlmIG5vbmUgZ2l2ZW4uICovCisgICAgUHlPYmplY3QgKmNvbXBhcmU7CiAKLQkvKiBUaGlzIGNvbnRyb2xzIHdoZW4gd2UgZ2V0ICppbnRvKiBnYWxsb3BpbmcgbW9kZS4gIEl0J3MgaW5pdGlhbGl6ZWQKLQkgKiB0byBNSU5fR0FMTE9QLiAgbWVyZ2VfbG8gYW5kIG1lcmdlX2hpIHRlbmQgdG8gbnVkZ2UgaXQgaGlnaGVyIGZvcgotCSAqIHJhbmRvbSBkYXRhLCBhbmQgbG93ZXIgZm9yIGhpZ2hseSBzdHJ1Y3R1cmVkIGRhdGEuCi0JICovCi0JUHlfc3NpemVfdCBtaW5fZ2FsbG9wOworICAgIC8qIFRoaXMgY29udHJvbHMgd2hlbiB3ZSBnZXQgKmludG8qIGdhbGxvcGluZyBtb2RlLiAgSXQncyBpbml0aWFsaXplZAorICAgICAqIHRvIE1JTl9HQUxMT1AuICBtZXJnZV9sbyBhbmQgbWVyZ2VfaGkgdGVuZCB0byBudWRnZSBpdCBoaWdoZXIgZm9yCisgICAgICogcmFuZG9tIGRhdGEsIGFuZCBsb3dlciBmb3IgaGlnaGx5IHN0cnVjdHVyZWQgZGF0YS4KKyAgICAgKi8KKyAgICBQeV9zc2l6ZV90IG1pbl9nYWxsb3A7CiAKLQkvKiAnYScgaXMgdGVtcCBzdG9yYWdlIHRvIGhlbHAgd2l0aCBtZXJnZXMuICBJdCBjb250YWlucyByb29tIGZvcgotCSAqIGFsbG9jZWQgZW50cmllcy4KLQkgKi8KLQlQeU9iamVjdCAqKmE7CS8qIG1heSBwb2ludCB0byB0ZW1wYXJyYXkgYmVsb3cgKi8KLQlQeV9zc2l6ZV90IGFsbG9jZWQ7CisgICAgLyogJ2EnIGlzIHRlbXAgc3RvcmFnZSB0byBoZWxwIHdpdGggbWVyZ2VzLiAgSXQgY29udGFpbnMgcm9vbSBmb3IKKyAgICAgKiBhbGxvY2VkIGVudHJpZXMuCisgICAgICovCisgICAgUHlPYmplY3QgKiphOyAgICAgICAvKiBtYXkgcG9pbnQgdG8gdGVtcGFycmF5IGJlbG93ICovCisgICAgUHlfc3NpemVfdCBhbGxvY2VkOwogCi0JLyogQSBzdGFjayBvZiBuIHBlbmRpbmcgcnVucyB5ZXQgdG8gYmUgbWVyZ2VkLiAgUnVuICNpIHN0YXJ0cyBhdAotCSAqIGFkZHJlc3MgYmFzZVtpXSBhbmQgZXh0ZW5kcyBmb3IgbGVuW2ldIGVsZW1lbnRzLiAgSXQncyBhbHdheXMKLQkgKiB0cnVlIChzbyBsb25nIGFzIHRoZSBpbmRpY2VzIGFyZSBpbiBib3VuZHMpIHRoYXQKLQkgKgotCSAqICAgICBwZW5kaW5nW2ldLmJhc2UgKyBwZW5kaW5nW2ldLmxlbiA9PSBwZW5kaW5nW2krMV0uYmFzZQotCSAqCi0JICogc28gd2UgY291bGQgY3V0IHRoZSBzdG9yYWdlIGZvciB0aGlzLCBidXQgaXQncyBhIG1pbm9yIGFtb3VudCwKLQkgKiBhbmQga2VlcGluZyBhbGwgdGhlIGluZm8gZXhwbGljaXQgc2ltcGxpZmllcyB0aGUgY29kZS4KLQkgKi8KLQlpbnQgbjsKLQlzdHJ1Y3Qgc19zbGljZSBwZW5kaW5nW01BWF9NRVJHRV9QRU5ESU5HXTsKKyAgICAvKiBBIHN0YWNrIG9mIG4gcGVuZGluZyBydW5zIHlldCB0byBiZSBtZXJnZWQuICBSdW4gI2kgc3RhcnRzIGF0CisgICAgICogYWRkcmVzcyBiYXNlW2ldIGFuZCBleHRlbmRzIGZvciBsZW5baV0gZWxlbWVudHMuICBJdCdzIGFsd2F5cworICAgICAqIHRydWUgKHNvIGxvbmcgYXMgdGhlIGluZGljZXMgYXJlIGluIGJvdW5kcykgdGhhdAorICAgICAqCisgICAgICogICAgIHBlbmRpbmdbaV0uYmFzZSArIHBlbmRpbmdbaV0ubGVuID09IHBlbmRpbmdbaSsxXS5iYXNlCisgICAgICoKKyAgICAgKiBzbyB3ZSBjb3VsZCBjdXQgdGhlIHN0b3JhZ2UgZm9yIHRoaXMsIGJ1dCBpdCdzIGEgbWlub3IgYW1vdW50LAorICAgICAqIGFuZCBrZWVwaW5nIGFsbCB0aGUgaW5mbyBleHBsaWNpdCBzaW1wbGlmaWVzIHRoZSBjb2RlLgorICAgICAqLworICAgIGludCBuOworICAgIHN0cnVjdCBzX3NsaWNlIHBlbmRpbmdbTUFYX01FUkdFX1BFTkRJTkddOwogCi0JLyogJ2EnIHBvaW50cyB0byB0aGlzIHdoZW4gcG9zc2libGUsIHJhdGhlciB0aGFuIG11Y2sgd2l0aCBtYWxsb2MuICovCi0JUHlPYmplY3QgKnRlbXBhcnJheVtNRVJHRVNUQVRFX1RFTVBfU0laRV07CisgICAgLyogJ2EnIHBvaW50cyB0byB0aGlzIHdoZW4gcG9zc2libGUsIHJhdGhlciB0aGFuIG11Y2sgd2l0aCBtYWxsb2MuICovCisgICAgUHlPYmplY3QgKnRlbXBhcnJheVtNRVJHRVNUQVRFX1RFTVBfU0laRV07CiB9IE1lcmdlU3RhdGU7CiAKIC8qIENvbmNlcHR1YWxseSBhIE1lcmdlU3RhdGUncyBjb25zdHJ1Y3Rvci4gKi8KIHN0YXRpYyB2b2lkCiBtZXJnZV9pbml0KE1lcmdlU3RhdGUgKm1zLCBQeU9iamVjdCAqY29tcGFyZSkKIHsKLQlhc3NlcnQobXMgIT0gTlVMTCk7Ci0JbXMtPmNvbXBhcmUgPSBjb21wYXJlOwotCW1zLT5hID0gbXMtPnRlbXBhcnJheTsKLQltcy0+YWxsb2NlZCA9IE1FUkdFU1RBVEVfVEVNUF9TSVpFOwotCW1zLT5uID0gMDsKLQltcy0+bWluX2dhbGxvcCA9IE1JTl9HQUxMT1A7CisgICAgYXNzZXJ0KG1zICE9IE5VTEwpOworICAgIG1zLT5jb21wYXJlID0gY29tcGFyZTsKKyAgICBtcy0+YSA9IG1zLT50ZW1wYXJyYXk7CisgICAgbXMtPmFsbG9jZWQgPSBNRVJHRVNUQVRFX1RFTVBfU0laRTsKKyAgICBtcy0+biA9IDA7CisgICAgbXMtPm1pbl9nYWxsb3AgPSBNSU5fR0FMTE9QOwogfQogCiAvKiBGcmVlIGFsbCB0aGUgdGVtcCBtZW1vcnkgb3duZWQgYnkgdGhlIE1lcmdlU3RhdGUuICBUaGlzIG11c3QgYmUgY2FsbGVkCkBAIC0xNDA2LDExICsxNDA2LDExIEBACiBzdGF0aWMgdm9pZAogbWVyZ2VfZnJlZW1lbShNZXJnZVN0YXRlICptcykKIHsKLQlhc3NlcnQobXMgIT0gTlVMTCk7Ci0JaWYgKG1zLT5hICE9IG1zLT50ZW1wYXJyYXkpCi0JCVB5TWVtX0ZyZWUobXMtPmEpOwotCW1zLT5hID0gbXMtPnRlbXBhcnJheTsKLQltcy0+YWxsb2NlZCA9IE1FUkdFU1RBVEVfVEVNUF9TSVpFOworICAgIGFzc2VydChtcyAhPSBOVUxMKTsKKyAgICBpZiAobXMtPmEgIT0gbXMtPnRlbXBhcnJheSkKKyAgICAgICAgUHlNZW1fRnJlZShtcy0+YSk7CisgICAgbXMtPmEgPSBtcy0+dGVtcGFycmF5OworICAgIG1zLT5hbGxvY2VkID0gTUVSR0VTVEFURV9URU1QX1NJWkU7CiB9CiAKIC8qIEVuc3VyZSBlbm91Z2ggdGVtcCBtZW1vcnkgZm9yICduZWVkJyBhcnJheSBzbG90cyBpcyBhdmFpbGFibGUuCkBAIC0xNDE5LDI4ICsxNDE5LDI4IEBACiBzdGF0aWMgaW50CiBtZXJnZV9nZXRtZW0oTWVyZ2VTdGF0ZSAqbXMsIFB5X3NzaXplX3QgbmVlZCkKIHsKLQlhc3NlcnQobXMgIT0gTlVMTCk7Ci0JaWYgKG5lZWQgPD0gbXMtPmFsbG9jZWQpCi0JCXJldHVybiAwOwotCS8qIERvbid0IHJlYWxsb2MhICBUaGF0IGNhbiBjb3N0IGN5Y2xlcyB0byBjb3B5IHRoZSBvbGQgZGF0YSwgYnV0Ci0JICogd2UgZG9uJ3QgY2FyZSB3aGF0J3MgaW4gdGhlIGJsb2NrLgotCSAqLwotCW1lcmdlX2ZyZWVtZW0obXMpOwotCWlmICgoc2l6ZV90KW5lZWQgPiBQWV9TU0laRV9UX01BWCAvIHNpemVvZihQeU9iamVjdCopKSB7Ci0JCVB5RXJyX05vTWVtb3J5KCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JbXMtPmEgPSAoUHlPYmplY3QgKiopUHlNZW1fTWFsbG9jKG5lZWQgKiBzaXplb2YoUHlPYmplY3QqKSk7Ci0JaWYgKG1zLT5hKSB7Ci0JCW1zLT5hbGxvY2VkID0gbmVlZDsKLQkJcmV0dXJuIDA7Ci0JfQotCVB5RXJyX05vTWVtb3J5KCk7Ci0JbWVyZ2VfZnJlZW1lbShtcyk7CS8qIHJlc2V0IHRvIHNhbmUgc3RhdGUgKi8KLQlyZXR1cm4gLTE7CisgICAgYXNzZXJ0KG1zICE9IE5VTEwpOworICAgIGlmIChuZWVkIDw9IG1zLT5hbGxvY2VkKQorICAgICAgICByZXR1cm4gMDsKKyAgICAvKiBEb24ndCByZWFsbG9jISAgVGhhdCBjYW4gY29zdCBjeWNsZXMgdG8gY29weSB0aGUgb2xkIGRhdGEsIGJ1dAorICAgICAqIHdlIGRvbid0IGNhcmUgd2hhdCdzIGluIHRoZSBibG9jay4KKyAgICAgKi8KKyAgICBtZXJnZV9mcmVlbWVtKG1zKTsKKyAgICBpZiAoKHNpemVfdCluZWVkID4gUFlfU1NJWkVfVF9NQVggLyBzaXplb2YoUHlPYmplY3QqKSkgeworICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG1zLT5hID0gKFB5T2JqZWN0ICoqKVB5TWVtX01hbGxvYyhuZWVkICogc2l6ZW9mKFB5T2JqZWN0KikpOworICAgIGlmIChtcy0+YSkgeworICAgICAgICBtcy0+YWxsb2NlZCA9IG5lZWQ7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBQeUVycl9Ob01lbW9yeSgpOworICAgIG1lcmdlX2ZyZWVtZW0obXMpOyAgICAgICAgICAvKiByZXNldCB0byBzYW5lIHN0YXRlICovCisgICAgcmV0dXJuIC0xOwogfQotI2RlZmluZSBNRVJHRV9HRVRNRU0oTVMsIE5FRUQpICgoTkVFRCkgPD0gKE1TKS0+YWxsb2NlZCA/IDAgOglcCi0JCQkJbWVyZ2VfZ2V0bWVtKE1TLCBORUVEKSkKKyNkZWZpbmUgTUVSR0VfR0VUTUVNKE1TLCBORUVEKSAoKE5FRUQpIDw9IChNUyktPmFsbG9jZWQgPyAwIDogICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lcmdlX2dldG1lbShNUywgTkVFRCkpCiAKIC8qIE1lcmdlIHRoZSBuYSBlbGVtZW50cyBzdGFydGluZyBhdCBwYSB3aXRoIHRoZSBuYiBlbGVtZW50cyBzdGFydGluZyBhdCBwYgogICogaW4gYSBzdGFibGUgd2F5LCBpbi1wbGFjZS4gIG5hIGFuZCBuYiBtdXN0IGJlID4gMCwgYW5kIHBhICsgbmEgPT0gcGIuCkBAIC0xNDUyLDEyNyArMTQ1MiwxMjcgQEAKIG1lcmdlX2xvKE1lcmdlU3RhdGUgKm1zLCBQeU9iamVjdCAqKnBhLCBQeV9zc2l6ZV90IG5hLAogICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICoqcGIsIFB5X3NzaXplX3QgbmIpCiB7Ci0JUHlfc3NpemVfdCBrOwotCVB5T2JqZWN0ICpjb21wYXJlOwotCVB5T2JqZWN0ICoqZGVzdDsKLQlpbnQgcmVzdWx0ID0gLTE7CS8qIGd1aWx0eSB1bnRpbCBwcm92ZWQgaW5ub2NlbnQgKi8KLQlQeV9zc2l6ZV90IG1pbl9nYWxsb3A7CisgICAgUHlfc3NpemVfdCBrOworICAgIFB5T2JqZWN0ICpjb21wYXJlOworICAgIFB5T2JqZWN0ICoqZGVzdDsKKyAgICBpbnQgcmVzdWx0ID0gLTE7ICAgICAgICAgICAgLyogZ3VpbHR5IHVudGlsIHByb3ZlZCBpbm5vY2VudCAqLworICAgIFB5X3NzaXplX3QgbWluX2dhbGxvcDsKIAotCWFzc2VydChtcyAmJiBwYSAmJiBwYiAmJiBuYSA+IDAgJiYgbmIgPiAwICYmIHBhICsgbmEgPT0gcGIpOwotCWlmIChNRVJHRV9HRVRNRU0obXMsIG5hKSA8IDApCi0JCXJldHVybiAtMTsKLQltZW1jcHkobXMtPmEsIHBhLCBuYSAqIHNpemVvZihQeU9iamVjdCopKTsKLQlkZXN0ID0gcGE7Ci0JcGEgPSBtcy0+YTsKKyAgICBhc3NlcnQobXMgJiYgcGEgJiYgcGIgJiYgbmEgPiAwICYmIG5iID4gMCAmJiBwYSArIG5hID09IHBiKTsKKyAgICBpZiAoTUVSR0VfR0VUTUVNKG1zLCBuYSkgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisgICAgbWVtY3B5KG1zLT5hLCBwYSwgbmEgKiBzaXplb2YoUHlPYmplY3QqKSk7CisgICAgZGVzdCA9IHBhOworICAgIHBhID0gbXMtPmE7CiAKLQkqZGVzdCsrID0gKnBiKys7Ci0JLS1uYjsKLQlpZiAobmIgPT0gMCkKLQkJZ290byBTdWNjZWVkOwotCWlmIChuYSA9PSAxKQotCQlnb3RvIENvcHlCOworICAgICpkZXN0KysgPSAqcGIrKzsKKyAgICAtLW5iOworICAgIGlmIChuYiA9PSAwKQorICAgICAgICBnb3RvIFN1Y2NlZWQ7CisgICAgaWYgKG5hID09IDEpCisgICAgICAgIGdvdG8gQ29weUI7CiAKLQltaW5fZ2FsbG9wID0gbXMtPm1pbl9nYWxsb3A7Ci0JY29tcGFyZSA9IG1zLT5jb21wYXJlOwotCWZvciAoOzspIHsKLQkJUHlfc3NpemVfdCBhY291bnQgPSAwOwkvKiAjIG9mIHRpbWVzIEEgd29uIGluIGEgcm93ICovCi0JCVB5X3NzaXplX3QgYmNvdW50ID0gMDsJLyogIyBvZiB0aW1lcyBCIHdvbiBpbiBhIHJvdyAqLworICAgIG1pbl9nYWxsb3AgPSBtcy0+bWluX2dhbGxvcDsKKyAgICBjb21wYXJlID0gbXMtPmNvbXBhcmU7CisgICAgZm9yICg7OykgeworICAgICAgICBQeV9zc2l6ZV90IGFjb3VudCA9IDA7ICAgICAgICAgIC8qICMgb2YgdGltZXMgQSB3b24gaW4gYSByb3cgKi8KKyAgICAgICAgUHlfc3NpemVfdCBiY291bnQgPSAwOyAgICAgICAgICAvKiAjIG9mIHRpbWVzIEIgd29uIGluIGEgcm93ICovCiAKLQkJLyogRG8gdGhlIHN0cmFpZ2h0Zm9yd2FyZCB0aGluZyB1bnRpbCAoaWYgZXZlcikgb25lIHJ1bgotCQkgKiBhcHBlYXJzIHRvIHdpbiBjb25zaXN0ZW50bHkuCi0JCSAqLwotIAkJZm9yICg7OykgewotIAkJCWFzc2VydChuYSA+IDEgJiYgbmIgPiAwKTsKLQkgCQlrID0gSVNMVCgqcGIsICpwYSwgY29tcGFyZSk7Ci0JCQlpZiAoaykgewotCQkJCWlmIChrIDwgMCkKLQkJCQkJZ290byBGYWlsOwotCQkJCSpkZXN0KysgPSAqcGIrKzsKLQkJCQkrK2Jjb3VudDsKLQkJCQlhY291bnQgPSAwOwotCQkJCS0tbmI7Ci0JCQkJaWYgKG5iID09IDApCi0JCQkJCWdvdG8gU3VjY2VlZDsKLQkJCQlpZiAoYmNvdW50ID49IG1pbl9nYWxsb3ApCi0JCQkJCWJyZWFrOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJKmRlc3QrKyA9ICpwYSsrOwotCQkJCSsrYWNvdW50OwotCQkJCWJjb3VudCA9IDA7Ci0JCQkJLS1uYTsKLQkJCQlpZiAobmEgPT0gMSkKLQkJCQkJZ290byBDb3B5QjsKLQkJCQlpZiAoYWNvdW50ID49IG1pbl9nYWxsb3ApCi0JCQkJCWJyZWFrOwotCQkJfQotIAkJfQorICAgICAgICAvKiBEbyB0aGUgc3RyYWlnaHRmb3J3YXJkIHRoaW5nIHVudGlsIChpZiBldmVyKSBvbmUgcnVuCisgICAgICAgICAqIGFwcGVhcnMgdG8gd2luIGNvbnNpc3RlbnRseS4KKyAgICAgICAgICovCisgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgIGFzc2VydChuYSA+IDEgJiYgbmIgPiAwKTsKKyAgICAgICAgICAgIGsgPSBJU0xUKCpwYiwgKnBhLCBjb21wYXJlKTsKKyAgICAgICAgICAgIGlmIChrKSB7CisgICAgICAgICAgICAgICAgaWYgKGsgPCAwKQorICAgICAgICAgICAgICAgICAgICBnb3RvIEZhaWw7CisgICAgICAgICAgICAgICAgKmRlc3QrKyA9ICpwYisrOworICAgICAgICAgICAgICAgICsrYmNvdW50OworICAgICAgICAgICAgICAgIGFjb3VudCA9IDA7CisgICAgICAgICAgICAgICAgLS1uYjsKKyAgICAgICAgICAgICAgICBpZiAobmIgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgZ290byBTdWNjZWVkOworICAgICAgICAgICAgICAgIGlmIChiY291bnQgPj0gbWluX2dhbGxvcCkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAqZGVzdCsrID0gKnBhKys7CisgICAgICAgICAgICAgICAgKythY291bnQ7CisgICAgICAgICAgICAgICAgYmNvdW50ID0gMDsKKyAgICAgICAgICAgICAgICAtLW5hOworICAgICAgICAgICAgICAgIGlmIChuYSA9PSAxKQorICAgICAgICAgICAgICAgICAgICBnb3RvIENvcHlCOworICAgICAgICAgICAgICAgIGlmIChhY291bnQgPj0gbWluX2dhbGxvcCkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQkvKiBPbmUgcnVuIGlzIHdpbm5pbmcgc28gY29uc2lzdGVudGx5IHRoYXQgZ2FsbG9waW5nIG1heQotCQkgKiBiZSBhIGh1Z2Ugd2luLiAgU28gdHJ5IHRoYXQsIGFuZCBjb250aW51ZSBnYWxsb3BpbmcgdW50aWwKLQkJICogKGlmIGV2ZXIpIG5laXRoZXIgcnVuIGFwcGVhcnMgdG8gYmUgd2lubmluZyBjb25zaXN0ZW50bHkKLQkJICogYW55bW9yZS4KLQkJICovCi0JCSsrbWluX2dhbGxvcDsKLQkJZG8gewotIAkJCWFzc2VydChuYSA+IDEgJiYgbmIgPiAwKTsKLQkJCW1pbl9nYWxsb3AgLT0gbWluX2dhbGxvcCA+IDE7Ci0JIAkJbXMtPm1pbl9nYWxsb3AgPSBtaW5fZ2FsbG9wOwotCQkJayA9IGdhbGxvcF9yaWdodCgqcGIsIHBhLCBuYSwgMCwgY29tcGFyZSk7Ci0JCQlhY291bnQgPSBrOwotCQkJaWYgKGspIHsKLQkJCQlpZiAoayA8IDApCi0JCQkJCWdvdG8gRmFpbDsKLQkJCQltZW1jcHkoZGVzdCwgcGEsIGsgKiBzaXplb2YoUHlPYmplY3QgKikpOwotCQkJCWRlc3QgKz0gazsKLQkJCQlwYSArPSBrOwotCQkJCW5hIC09IGs7Ci0JCQkJaWYgKG5hID09IDEpCi0JCQkJCWdvdG8gQ29weUI7Ci0JCQkJLyogbmE9PTAgaXMgaW1wb3NzaWJsZSBub3cgaWYgdGhlIGNvbXBhcmlzb24KLQkJCQkgKiBmdW5jdGlvbiBpcyBjb25zaXN0ZW50LCBidXQgd2UgY2FuJ3QgYXNzdW1lCi0JCQkJICogdGhhdCBpdCBpcy4KLQkJCQkgKi8KLQkJCQlpZiAobmEgPT0gMCkKLQkJCQkJZ290byBTdWNjZWVkOwotCQkJfQotCQkJKmRlc3QrKyA9ICpwYisrOwotCQkJLS1uYjsKLQkJCWlmIChuYiA9PSAwKQotCQkJCWdvdG8gU3VjY2VlZDsKKyAgICAgICAgLyogT25lIHJ1biBpcyB3aW5uaW5nIHNvIGNvbnNpc3RlbnRseSB0aGF0IGdhbGxvcGluZyBtYXkKKyAgICAgICAgICogYmUgYSBodWdlIHdpbi4gIFNvIHRyeSB0aGF0LCBhbmQgY29udGludWUgZ2FsbG9waW5nIHVudGlsCisgICAgICAgICAqIChpZiBldmVyKSBuZWl0aGVyIHJ1biBhcHBlYXJzIHRvIGJlIHdpbm5pbmcgY29uc2lzdGVudGx5CisgICAgICAgICAqIGFueW1vcmUuCisgICAgICAgICAqLworICAgICAgICArK21pbl9nYWxsb3A7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGFzc2VydChuYSA+IDEgJiYgbmIgPiAwKTsKKyAgICAgICAgICAgIG1pbl9nYWxsb3AgLT0gbWluX2dhbGxvcCA+IDE7CisgICAgICAgICAgICBtcy0+bWluX2dhbGxvcCA9IG1pbl9nYWxsb3A7CisgICAgICAgICAgICBrID0gZ2FsbG9wX3JpZ2h0KCpwYiwgcGEsIG5hLCAwLCBjb21wYXJlKTsKKyAgICAgICAgICAgIGFjb3VudCA9IGs7CisgICAgICAgICAgICBpZiAoaykgeworICAgICAgICAgICAgICAgIGlmIChrIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgZ290byBGYWlsOworICAgICAgICAgICAgICAgIG1lbWNweShkZXN0LCBwYSwgayAqIHNpemVvZihQeU9iamVjdCAqKSk7CisgICAgICAgICAgICAgICAgZGVzdCArPSBrOworICAgICAgICAgICAgICAgIHBhICs9IGs7CisgICAgICAgICAgICAgICAgbmEgLT0gazsKKyAgICAgICAgICAgICAgICBpZiAobmEgPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBDb3B5QjsKKyAgICAgICAgICAgICAgICAvKiBuYT09MCBpcyBpbXBvc3NpYmxlIG5vdyBpZiB0aGUgY29tcGFyaXNvbgorICAgICAgICAgICAgICAgICAqIGZ1bmN0aW9uIGlzIGNvbnNpc3RlbnQsIGJ1dCB3ZSBjYW4ndCBhc3N1bWUKKyAgICAgICAgICAgICAgICAgKiB0aGF0IGl0IGlzLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmIChuYSA9PSAwKQorICAgICAgICAgICAgICAgICAgICBnb3RvIFN1Y2NlZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqZGVzdCsrID0gKnBiKys7CisgICAgICAgICAgICAtLW5iOworICAgICAgICAgICAgaWYgKG5iID09IDApCisgICAgICAgICAgICAgICAgZ290byBTdWNjZWVkOwogCi0gCQkJayA9IGdhbGxvcF9sZWZ0KCpwYSwgcGIsIG5iLCAwLCBjb21wYXJlKTsKLSAJCQliY291bnQgPSBrOwotCQkJaWYgKGspIHsKLQkJCQlpZiAoayA8IDApCi0JCQkJCWdvdG8gRmFpbDsKLQkJCQltZW1tb3ZlKGRlc3QsIHBiLCBrICogc2l6ZW9mKFB5T2JqZWN0ICopKTsKLQkJCQlkZXN0ICs9IGs7Ci0JCQkJcGIgKz0gazsKLQkJCQluYiAtPSBrOwotCQkJCWlmIChuYiA9PSAwKQotCQkJCQlnb3RvIFN1Y2NlZWQ7Ci0JCQl9Ci0JCQkqZGVzdCsrID0gKnBhKys7Ci0JCQktLW5hOwotCQkJaWYgKG5hID09IDEpCi0JCQkJZ290byBDb3B5QjsKLSAJCX0gd2hpbGUgKGFjb3VudCA+PSBNSU5fR0FMTE9QIHx8IGJjb3VudCA+PSBNSU5fR0FMTE9QKTsKLSAJCSsrbWluX2dhbGxvcDsJLyogcGVuYWxpemUgaXQgZm9yIGxlYXZpbmcgZ2FsbG9waW5nIG1vZGUgKi8KLSAJCW1zLT5taW5fZ2FsbG9wID0gbWluX2dhbGxvcDsKLSAJfQorICAgICAgICAgICAgayA9IGdhbGxvcF9sZWZ0KCpwYSwgcGIsIG5iLCAwLCBjb21wYXJlKTsKKyAgICAgICAgICAgIGJjb3VudCA9IGs7CisgICAgICAgICAgICBpZiAoaykgeworICAgICAgICAgICAgICAgIGlmIChrIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgZ290byBGYWlsOworICAgICAgICAgICAgICAgIG1lbW1vdmUoZGVzdCwgcGIsIGsgKiBzaXplb2YoUHlPYmplY3QgKikpOworICAgICAgICAgICAgICAgIGRlc3QgKz0gazsKKyAgICAgICAgICAgICAgICBwYiArPSBrOworICAgICAgICAgICAgICAgIG5iIC09IGs7CisgICAgICAgICAgICAgICAgaWYgKG5iID09IDApCisgICAgICAgICAgICAgICAgICAgIGdvdG8gU3VjY2VlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpkZXN0KysgPSAqcGErKzsKKyAgICAgICAgICAgIC0tbmE7CisgICAgICAgICAgICBpZiAobmEgPT0gMSkKKyAgICAgICAgICAgICAgICBnb3RvIENvcHlCOworICAgICAgICB9IHdoaWxlIChhY291bnQgPj0gTUlOX0dBTExPUCB8fCBiY291bnQgPj0gTUlOX0dBTExPUCk7CisgICAgICAgICsrbWluX2dhbGxvcDsgICAgICAgICAgIC8qIHBlbmFsaXplIGl0IGZvciBsZWF2aW5nIGdhbGxvcGluZyBtb2RlICovCisgICAgICAgIG1zLT5taW5fZ2FsbG9wID0gbWluX2dhbGxvcDsKKyAgICB9CiBTdWNjZWVkOgotCXJlc3VsdCA9IDA7CisgICAgcmVzdWx0ID0gMDsKIEZhaWw6Ci0JaWYgKG5hKQotCQltZW1jcHkoZGVzdCwgcGEsIG5hICogc2l6ZW9mKFB5T2JqZWN0KikpOwotCXJldHVybiByZXN1bHQ7CisgICAgaWYgKG5hKQorICAgICAgICBtZW1jcHkoZGVzdCwgcGEsIG5hICogc2l6ZW9mKFB5T2JqZWN0KikpOworICAgIHJldHVybiByZXN1bHQ7CiBDb3B5QjoKLQlhc3NlcnQobmEgPT0gMSAmJiBuYiA+IDApOwotCS8qIFRoZSBsYXN0IGVsZW1lbnQgb2YgcGEgYmVsb25ncyBhdCB0aGUgZW5kIG9mIHRoZSBtZXJnZS4gKi8KLQltZW1tb3ZlKGRlc3QsIHBiLCBuYiAqIHNpemVvZihQeU9iamVjdCAqKSk7Ci0JZGVzdFtuYl0gPSAqcGE7Ci0JcmV0dXJuIDA7CisgICAgYXNzZXJ0KG5hID09IDEgJiYgbmIgPiAwKTsKKyAgICAvKiBUaGUgbGFzdCBlbGVtZW50IG9mIHBhIGJlbG9uZ3MgYXQgdGhlIGVuZCBvZiB0aGUgbWVyZ2UuICovCisgICAgbWVtbW92ZShkZXN0LCBwYiwgbmIgKiBzaXplb2YoUHlPYmplY3QgKikpOworICAgIGRlc3RbbmJdID0gKnBhOworICAgIHJldHVybiAwOwogfQogCiAvKiBNZXJnZSB0aGUgbmEgZWxlbWVudHMgc3RhcnRpbmcgYXQgcGEgd2l0aCB0aGUgbmIgZWxlbWVudHMgc3RhcnRpbmcgYXQgcGIKQEAgLTE1ODQsMTM2ICsxNTg0LDEzNiBAQAogc3RhdGljIFB5X3NzaXplX3QKIG1lcmdlX2hpKE1lcmdlU3RhdGUgKm1zLCBQeU9iamVjdCAqKnBhLCBQeV9zc2l6ZV90IG5hLCBQeU9iamVjdCAqKnBiLCBQeV9zc2l6ZV90IG5iKQogewotCVB5X3NzaXplX3QgazsKLQlQeU9iamVjdCAqY29tcGFyZTsKLQlQeU9iamVjdCAqKmRlc3Q7Ci0JaW50IHJlc3VsdCA9IC0xOwkvKiBndWlsdHkgdW50aWwgcHJvdmVkIGlubm9jZW50ICovCi0JUHlPYmplY3QgKipiYXNlYTsKLQlQeU9iamVjdCAqKmJhc2ViOwotCVB5X3NzaXplX3QgbWluX2dhbGxvcDsKKyAgICBQeV9zc2l6ZV90IGs7CisgICAgUHlPYmplY3QgKmNvbXBhcmU7CisgICAgUHlPYmplY3QgKipkZXN0OworICAgIGludCByZXN1bHQgPSAtMTsgICAgICAgICAgICAvKiBndWlsdHkgdW50aWwgcHJvdmVkIGlubm9jZW50ICovCisgICAgUHlPYmplY3QgKipiYXNlYTsKKyAgICBQeU9iamVjdCAqKmJhc2ViOworICAgIFB5X3NzaXplX3QgbWluX2dhbGxvcDsKIAotCWFzc2VydChtcyAmJiBwYSAmJiBwYiAmJiBuYSA+IDAgJiYgbmIgPiAwICYmIHBhICsgbmEgPT0gcGIpOwotCWlmIChNRVJHRV9HRVRNRU0obXMsIG5iKSA8IDApCi0JCXJldHVybiAtMTsKLQlkZXN0ID0gcGIgKyBuYiAtIDE7Ci0JbWVtY3B5KG1zLT5hLCBwYiwgbmIgKiBzaXplb2YoUHlPYmplY3QqKSk7Ci0JYmFzZWEgPSBwYTsKLQliYXNlYiA9IG1zLT5hOwotCXBiID0gbXMtPmEgKyBuYiAtIDE7Ci0JcGEgKz0gbmEgLSAxOworICAgIGFzc2VydChtcyAmJiBwYSAmJiBwYiAmJiBuYSA+IDAgJiYgbmIgPiAwICYmIHBhICsgbmEgPT0gcGIpOworICAgIGlmIChNRVJHRV9HRVRNRU0obXMsIG5iKSA8IDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICBkZXN0ID0gcGIgKyBuYiAtIDE7CisgICAgbWVtY3B5KG1zLT5hLCBwYiwgbmIgKiBzaXplb2YoUHlPYmplY3QqKSk7CisgICAgYmFzZWEgPSBwYTsKKyAgICBiYXNlYiA9IG1zLT5hOworICAgIHBiID0gbXMtPmEgKyBuYiAtIDE7CisgICAgcGEgKz0gbmEgLSAxOwogCi0JKmRlc3QtLSA9ICpwYS0tOwotCS0tbmE7Ci0JaWYgKG5hID09IDApCi0JCWdvdG8gU3VjY2VlZDsKLQlpZiAobmIgPT0gMSkKLQkJZ290byBDb3B5QTsKKyAgICAqZGVzdC0tID0gKnBhLS07CisgICAgLS1uYTsKKyAgICBpZiAobmEgPT0gMCkKKyAgICAgICAgZ290byBTdWNjZWVkOworICAgIGlmIChuYiA9PSAxKQorICAgICAgICBnb3RvIENvcHlBOwogCi0JbWluX2dhbGxvcCA9IG1zLT5taW5fZ2FsbG9wOwotCWNvbXBhcmUgPSBtcy0+Y29tcGFyZTsKLQlmb3IgKDs7KSB7Ci0JCVB5X3NzaXplX3QgYWNvdW50ID0gMDsJLyogIyBvZiB0aW1lcyBBIHdvbiBpbiBhIHJvdyAqLwotCQlQeV9zc2l6ZV90IGJjb3VudCA9IDA7CS8qICMgb2YgdGltZXMgQiB3b24gaW4gYSByb3cgKi8KKyAgICBtaW5fZ2FsbG9wID0gbXMtPm1pbl9nYWxsb3A7CisgICAgY29tcGFyZSA9IG1zLT5jb21wYXJlOworICAgIGZvciAoOzspIHsKKyAgICAgICAgUHlfc3NpemVfdCBhY291bnQgPSAwOyAgICAgICAgICAvKiAjIG9mIHRpbWVzIEEgd29uIGluIGEgcm93ICovCisgICAgICAgIFB5X3NzaXplX3QgYmNvdW50ID0gMDsgICAgICAgICAgLyogIyBvZiB0aW1lcyBCIHdvbiBpbiBhIHJvdyAqLwogCi0JCS8qIERvIHRoZSBzdHJhaWdodGZvcndhcmQgdGhpbmcgdW50aWwgKGlmIGV2ZXIpIG9uZSBydW4KLQkJICogYXBwZWFycyB0byB3aW4gY29uc2lzdGVudGx5LgotCQkgKi8KLSAJCWZvciAoOzspIHsKLSAJCQlhc3NlcnQobmEgPiAwICYmIG5iID4gMSk7Ci0JIAkJayA9IElTTFQoKnBiLCAqcGEsIGNvbXBhcmUpOwotCQkJaWYgKGspIHsKLQkJCQlpZiAoayA8IDApCi0JCQkJCWdvdG8gRmFpbDsKLQkJCQkqZGVzdC0tID0gKnBhLS07Ci0JCQkJKythY291bnQ7Ci0JCQkJYmNvdW50ID0gMDsKLQkJCQktLW5hOwotCQkJCWlmIChuYSA9PSAwKQotCQkJCQlnb3RvIFN1Y2NlZWQ7Ci0JCQkJaWYgKGFjb3VudCA+PSBtaW5fZ2FsbG9wKQotCQkJCQlicmVhazsKLQkJCX0KLQkJCWVsc2UgewotCQkJCSpkZXN0LS0gPSAqcGItLTsKLQkJCQkrK2Jjb3VudDsKLQkJCQlhY291bnQgPSAwOwotCQkJCS0tbmI7Ci0JCQkJaWYgKG5iID09IDEpCi0JCQkJCWdvdG8gQ29weUE7Ci0JCQkJaWYgKGJjb3VudCA+PSBtaW5fZ2FsbG9wKQotCQkJCQlicmVhazsKLQkJCX0KLSAJCX0KKyAgICAgICAgLyogRG8gdGhlIHN0cmFpZ2h0Zm9yd2FyZCB0aGluZyB1bnRpbCAoaWYgZXZlcikgb25lIHJ1bgorICAgICAgICAgKiBhcHBlYXJzIHRvIHdpbiBjb25zaXN0ZW50bHkuCisgICAgICAgICAqLworICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICBhc3NlcnQobmEgPiAwICYmIG5iID4gMSk7CisgICAgICAgICAgICBrID0gSVNMVCgqcGIsICpwYSwgY29tcGFyZSk7CisgICAgICAgICAgICBpZiAoaykgeworICAgICAgICAgICAgICAgIGlmIChrIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgZ290byBGYWlsOworICAgICAgICAgICAgICAgICpkZXN0LS0gPSAqcGEtLTsKKyAgICAgICAgICAgICAgICArK2Fjb3VudDsKKyAgICAgICAgICAgICAgICBiY291bnQgPSAwOworICAgICAgICAgICAgICAgIC0tbmE7CisgICAgICAgICAgICAgICAgaWYgKG5hID09IDApCisgICAgICAgICAgICAgICAgICAgIGdvdG8gU3VjY2VlZDsKKyAgICAgICAgICAgICAgICBpZiAoYWNvdW50ID49IG1pbl9nYWxsb3ApCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgKmRlc3QtLSA9ICpwYi0tOworICAgICAgICAgICAgICAgICsrYmNvdW50OworICAgICAgICAgICAgICAgIGFjb3VudCA9IDA7CisgICAgICAgICAgICAgICAgLS1uYjsKKyAgICAgICAgICAgICAgICBpZiAobmIgPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBDb3B5QTsKKyAgICAgICAgICAgICAgICBpZiAoYmNvdW50ID49IG1pbl9nYWxsb3ApCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJLyogT25lIHJ1biBpcyB3aW5uaW5nIHNvIGNvbnNpc3RlbnRseSB0aGF0IGdhbGxvcGluZyBtYXkKLQkJICogYmUgYSBodWdlIHdpbi4gIFNvIHRyeSB0aGF0LCBhbmQgY29udGludWUgZ2FsbG9waW5nIHVudGlsCi0JCSAqIChpZiBldmVyKSBuZWl0aGVyIHJ1biBhcHBlYXJzIHRvIGJlIHdpbm5pbmcgY29uc2lzdGVudGx5Ci0JCSAqIGFueW1vcmUuCi0JCSAqLwotCQkrK21pbl9nYWxsb3A7Ci0JCWRvIHsKLSAJCQlhc3NlcnQobmEgPiAwICYmIG5iID4gMSk7Ci0JCQltaW5fZ2FsbG9wIC09IG1pbl9nYWxsb3AgPiAxOwotCSAJCW1zLT5taW5fZ2FsbG9wID0gbWluX2dhbGxvcDsKLQkJCWsgPSBnYWxsb3BfcmlnaHQoKnBiLCBiYXNlYSwgbmEsIG5hLTEsIGNvbXBhcmUpOwotCQkJaWYgKGsgPCAwKQotCQkJCWdvdG8gRmFpbDsKLQkJCWsgPSBuYSAtIGs7Ci0JCQlhY291bnQgPSBrOwotCQkJaWYgKGspIHsKLQkJCQlkZXN0IC09IGs7Ci0JCQkJcGEgLT0gazsKLQkJCQltZW1tb3ZlKGRlc3QrMSwgcGErMSwgayAqIHNpemVvZihQeU9iamVjdCAqKSk7Ci0JCQkJbmEgLT0gazsKLQkJCQlpZiAobmEgPT0gMCkKLQkJCQkJZ290byBTdWNjZWVkOwotCQkJfQotCQkJKmRlc3QtLSA9ICpwYi0tOwotCQkJLS1uYjsKLQkJCWlmIChuYiA9PSAxKQotCQkJCWdvdG8gQ29weUE7CisgICAgICAgIC8qIE9uZSBydW4gaXMgd2lubmluZyBzbyBjb25zaXN0ZW50bHkgdGhhdCBnYWxsb3BpbmcgbWF5CisgICAgICAgICAqIGJlIGEgaHVnZSB3aW4uICBTbyB0cnkgdGhhdCwgYW5kIGNvbnRpbnVlIGdhbGxvcGluZyB1bnRpbAorICAgICAgICAgKiAoaWYgZXZlcikgbmVpdGhlciBydW4gYXBwZWFycyB0byBiZSB3aW5uaW5nIGNvbnNpc3RlbnRseQorICAgICAgICAgKiBhbnltb3JlLgorICAgICAgICAgKi8KKyAgICAgICAgKyttaW5fZ2FsbG9wOworICAgICAgICBkbyB7CisgICAgICAgICAgICBhc3NlcnQobmEgPiAwICYmIG5iID4gMSk7CisgICAgICAgICAgICBtaW5fZ2FsbG9wIC09IG1pbl9nYWxsb3AgPiAxOworICAgICAgICAgICAgbXMtPm1pbl9nYWxsb3AgPSBtaW5fZ2FsbG9wOworICAgICAgICAgICAgayA9IGdhbGxvcF9yaWdodCgqcGIsIGJhc2VhLCBuYSwgbmEtMSwgY29tcGFyZSk7CisgICAgICAgICAgICBpZiAoayA8IDApCisgICAgICAgICAgICAgICAgZ290byBGYWlsOworICAgICAgICAgICAgayA9IG5hIC0gazsKKyAgICAgICAgICAgIGFjb3VudCA9IGs7CisgICAgICAgICAgICBpZiAoaykgeworICAgICAgICAgICAgICAgIGRlc3QgLT0gazsKKyAgICAgICAgICAgICAgICBwYSAtPSBrOworICAgICAgICAgICAgICAgIG1lbW1vdmUoZGVzdCsxLCBwYSsxLCBrICogc2l6ZW9mKFB5T2JqZWN0ICopKTsKKyAgICAgICAgICAgICAgICBuYSAtPSBrOworICAgICAgICAgICAgICAgIGlmIChuYSA9PSAwKQorICAgICAgICAgICAgICAgICAgICBnb3RvIFN1Y2NlZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqZGVzdC0tID0gKnBiLS07CisgICAgICAgICAgICAtLW5iOworICAgICAgICAgICAgaWYgKG5iID09IDEpCisgICAgICAgICAgICAgICAgZ290byBDb3B5QTsKIAotIAkJCWsgPSBnYWxsb3BfbGVmdCgqcGEsIGJhc2ViLCBuYiwgbmItMSwgY29tcGFyZSk7Ci0JCQlpZiAoayA8IDApCi0JCQkJZ290byBGYWlsOwotCQkJayA9IG5iIC0gazsKLQkJCWJjb3VudCA9IGs7Ci0JCQlpZiAoaykgewotCQkJCWRlc3QgLT0gazsKLQkJCQlwYiAtPSBrOwotCQkJCW1lbWNweShkZXN0KzEsIHBiKzEsIGsgKiBzaXplb2YoUHlPYmplY3QgKikpOwotCQkJCW5iIC09IGs7Ci0JCQkJaWYgKG5iID09IDEpCi0JCQkJCWdvdG8gQ29weUE7Ci0JCQkJLyogbmI9PTAgaXMgaW1wb3NzaWJsZSBub3cgaWYgdGhlIGNvbXBhcmlzb24KLQkJCQkgKiBmdW5jdGlvbiBpcyBjb25zaXN0ZW50LCBidXQgd2UgY2FuJ3QgYXNzdW1lCi0JCQkJICogdGhhdCBpdCBpcy4KLQkJCQkgKi8KLQkJCQlpZiAobmIgPT0gMCkKLQkJCQkJZ290byBTdWNjZWVkOwotCQkJfQotCQkJKmRlc3QtLSA9ICpwYS0tOwotCQkJLS1uYTsKLQkJCWlmIChuYSA9PSAwKQotCQkJCWdvdG8gU3VjY2VlZDsKLSAJCX0gd2hpbGUgKGFjb3VudCA+PSBNSU5fR0FMTE9QIHx8IGJjb3VudCA+PSBNSU5fR0FMTE9QKTsKLSAJCSsrbWluX2dhbGxvcDsJLyogcGVuYWxpemUgaXQgZm9yIGxlYXZpbmcgZ2FsbG9waW5nIG1vZGUgKi8KLSAJCW1zLT5taW5fZ2FsbG9wID0gbWluX2dhbGxvcDsKLSAJfQorICAgICAgICAgICAgayA9IGdhbGxvcF9sZWZ0KCpwYSwgYmFzZWIsIG5iLCBuYi0xLCBjb21wYXJlKTsKKyAgICAgICAgICAgIGlmIChrIDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIEZhaWw7CisgICAgICAgICAgICBrID0gbmIgLSBrOworICAgICAgICAgICAgYmNvdW50ID0gazsKKyAgICAgICAgICAgIGlmIChrKSB7CisgICAgICAgICAgICAgICAgZGVzdCAtPSBrOworICAgICAgICAgICAgICAgIHBiIC09IGs7CisgICAgICAgICAgICAgICAgbWVtY3B5KGRlc3QrMSwgcGIrMSwgayAqIHNpemVvZihQeU9iamVjdCAqKSk7CisgICAgICAgICAgICAgICAgbmIgLT0gazsKKyAgICAgICAgICAgICAgICBpZiAobmIgPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBDb3B5QTsKKyAgICAgICAgICAgICAgICAvKiBuYj09MCBpcyBpbXBvc3NpYmxlIG5vdyBpZiB0aGUgY29tcGFyaXNvbgorICAgICAgICAgICAgICAgICAqIGZ1bmN0aW9uIGlzIGNvbnNpc3RlbnQsIGJ1dCB3ZSBjYW4ndCBhc3N1bWUKKyAgICAgICAgICAgICAgICAgKiB0aGF0IGl0IGlzLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmIChuYiA9PSAwKQorICAgICAgICAgICAgICAgICAgICBnb3RvIFN1Y2NlZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqZGVzdC0tID0gKnBhLS07CisgICAgICAgICAgICAtLW5hOworICAgICAgICAgICAgaWYgKG5hID09IDApCisgICAgICAgICAgICAgICAgZ290byBTdWNjZWVkOworICAgICAgICB9IHdoaWxlIChhY291bnQgPj0gTUlOX0dBTExPUCB8fCBiY291bnQgPj0gTUlOX0dBTExPUCk7CisgICAgICAgICsrbWluX2dhbGxvcDsgICAgICAgICAgIC8qIHBlbmFsaXplIGl0IGZvciBsZWF2aW5nIGdhbGxvcGluZyBtb2RlICovCisgICAgICAgIG1zLT5taW5fZ2FsbG9wID0gbWluX2dhbGxvcDsKKyAgICB9CiBTdWNjZWVkOgotCXJlc3VsdCA9IDA7CisgICAgcmVzdWx0ID0gMDsKIEZhaWw6Ci0JaWYgKG5iKQotCQltZW1jcHkoZGVzdC0obmItMSksIGJhc2ViLCBuYiAqIHNpemVvZihQeU9iamVjdCopKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIGlmIChuYikKKyAgICAgICAgbWVtY3B5KGRlc3QtKG5iLTEpLCBiYXNlYiwgbmIgKiBzaXplb2YoUHlPYmplY3QqKSk7CisgICAgcmV0dXJuIHJlc3VsdDsKIENvcHlBOgotCWFzc2VydChuYiA9PSAxICYmIG5hID4gMCk7Ci0JLyogVGhlIGZpcnN0IGVsZW1lbnQgb2YgcGIgYmVsb25ncyBhdCB0aGUgZnJvbnQgb2YgdGhlIG1lcmdlLiAqLwotCWRlc3QgLT0gbmE7Ci0JcGEgLT0gbmE7Ci0JbWVtbW92ZShkZXN0KzEsIHBhKzEsIG5hICogc2l6ZW9mKFB5T2JqZWN0ICopKTsKLQkqZGVzdCA9ICpwYjsKLQlyZXR1cm4gMDsKKyAgICBhc3NlcnQobmIgPT0gMSAmJiBuYSA+IDApOworICAgIC8qIFRoZSBmaXJzdCBlbGVtZW50IG9mIHBiIGJlbG9uZ3MgYXQgdGhlIGZyb250IG9mIHRoZSBtZXJnZS4gKi8KKyAgICBkZXN0IC09IG5hOworICAgIHBhIC09IG5hOworICAgIG1lbW1vdmUoZGVzdCsxLCBwYSsxLCBuYSAqIHNpemVvZihQeU9iamVjdCAqKSk7CisgICAgKmRlc3QgPSAqcGI7CisgICAgcmV0dXJuIDA7CiB9CiAKIC8qIE1lcmdlIHRoZSB0d28gcnVucyBhdCBzdGFjayBpbmRpY2VzIGkgYW5kIGkrMS4KQEAgLTE3MjIsNTggKzE3MjIsNTggQEAKIHN0YXRpYyBQeV9zc2l6ZV90CiBtZXJnZV9hdChNZXJnZVN0YXRlICptcywgUHlfc3NpemVfdCBpKQogewotCVB5T2JqZWN0ICoqcGEsICoqcGI7Ci0JUHlfc3NpemVfdCBuYSwgbmI7Ci0JUHlfc3NpemVfdCBrOwotCVB5T2JqZWN0ICpjb21wYXJlOworICAgIFB5T2JqZWN0ICoqcGEsICoqcGI7CisgICAgUHlfc3NpemVfdCBuYSwgbmI7CisgICAgUHlfc3NpemVfdCBrOworICAgIFB5T2JqZWN0ICpjb21wYXJlOwogCi0JYXNzZXJ0KG1zICE9IE5VTEwpOwotCWFzc2VydChtcy0+biA+PSAyKTsKLQlhc3NlcnQoaSA+PSAwKTsKLQlhc3NlcnQoaSA9PSBtcy0+biAtIDIgfHwgaSA9PSBtcy0+biAtIDMpOworICAgIGFzc2VydChtcyAhPSBOVUxMKTsKKyAgICBhc3NlcnQobXMtPm4gPj0gMik7CisgICAgYXNzZXJ0KGkgPj0gMCk7CisgICAgYXNzZXJ0KGkgPT0gbXMtPm4gLSAyIHx8IGkgPT0gbXMtPm4gLSAzKTsKIAotCXBhID0gbXMtPnBlbmRpbmdbaV0uYmFzZTsKLQluYSA9IG1zLT5wZW5kaW5nW2ldLmxlbjsKLQlwYiA9IG1zLT5wZW5kaW5nW2krMV0uYmFzZTsKLQluYiA9IG1zLT5wZW5kaW5nW2krMV0ubGVuOwotCWFzc2VydChuYSA+IDAgJiYgbmIgPiAwKTsKLQlhc3NlcnQocGEgKyBuYSA9PSBwYik7CisgICAgcGEgPSBtcy0+cGVuZGluZ1tpXS5iYXNlOworICAgIG5hID0gbXMtPnBlbmRpbmdbaV0ubGVuOworICAgIHBiID0gbXMtPnBlbmRpbmdbaSsxXS5iYXNlOworICAgIG5iID0gbXMtPnBlbmRpbmdbaSsxXS5sZW47CisgICAgYXNzZXJ0KG5hID4gMCAmJiBuYiA+IDApOworICAgIGFzc2VydChwYSArIG5hID09IHBiKTsKIAotCS8qIFJlY29yZCB0aGUgbGVuZ3RoIG9mIHRoZSBjb21iaW5lZCBydW5zOyBpZiBpIGlzIHRoZSAzcmQtbGFzdAotCSAqIHJ1biBub3csIGFsc28gc2xpZGUgb3ZlciB0aGUgbGFzdCBydW4gKHdoaWNoIGlzbid0IGludm9sdmVkCi0JICogaW4gdGhpcyBtZXJnZSkuICBUaGUgY3VycmVudCBydW4gaSsxIGdvZXMgYXdheSBpbiBhbnkgY2FzZS4KLQkgKi8KLQltcy0+cGVuZGluZ1tpXS5sZW4gPSBuYSArIG5iOwotCWlmIChpID09IG1zLT5uIC0gMykKLQkJbXMtPnBlbmRpbmdbaSsxXSA9IG1zLT5wZW5kaW5nW2krMl07Ci0JLS1tcy0+bjsKKyAgICAvKiBSZWNvcmQgdGhlIGxlbmd0aCBvZiB0aGUgY29tYmluZWQgcnVuczsgaWYgaSBpcyB0aGUgM3JkLWxhc3QKKyAgICAgKiBydW4gbm93LCBhbHNvIHNsaWRlIG92ZXIgdGhlIGxhc3QgcnVuICh3aGljaCBpc24ndCBpbnZvbHZlZAorICAgICAqIGluIHRoaXMgbWVyZ2UpLiAgVGhlIGN1cnJlbnQgcnVuIGkrMSBnb2VzIGF3YXkgaW4gYW55IGNhc2UuCisgICAgICovCisgICAgbXMtPnBlbmRpbmdbaV0ubGVuID0gbmEgKyBuYjsKKyAgICBpZiAoaSA9PSBtcy0+biAtIDMpCisgICAgICAgIG1zLT5wZW5kaW5nW2krMV0gPSBtcy0+cGVuZGluZ1tpKzJdOworICAgIC0tbXMtPm47CiAKLQkvKiBXaGVyZSBkb2VzIGIgc3RhcnQgaW4gYT8gIEVsZW1lbnRzIGluIGEgYmVmb3JlIHRoYXQgY2FuIGJlCi0JICogaWdub3JlZCAoYWxyZWFkeSBpbiBwbGFjZSkuCi0JICovCi0JY29tcGFyZSA9IG1zLT5jb21wYXJlOwotCWsgPSBnYWxsb3BfcmlnaHQoKnBiLCBwYSwgbmEsIDAsIGNvbXBhcmUpOwotCWlmIChrIDwgMCkKLQkJcmV0dXJuIC0xOwotCXBhICs9IGs7Ci0JbmEgLT0gazsKLQlpZiAobmEgPT0gMCkKLQkJcmV0dXJuIDA7CisgICAgLyogV2hlcmUgZG9lcyBiIHN0YXJ0IGluIGE/ICBFbGVtZW50cyBpbiBhIGJlZm9yZSB0aGF0IGNhbiBiZQorICAgICAqIGlnbm9yZWQgKGFscmVhZHkgaW4gcGxhY2UpLgorICAgICAqLworICAgIGNvbXBhcmUgPSBtcy0+Y29tcGFyZTsKKyAgICBrID0gZ2FsbG9wX3JpZ2h0KCpwYiwgcGEsIG5hLCAwLCBjb21wYXJlKTsKKyAgICBpZiAoayA8IDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICBwYSArPSBrOworICAgIG5hIC09IGs7CisgICAgaWYgKG5hID09IDApCisgICAgICAgIHJldHVybiAwOwogCi0JLyogV2hlcmUgZG9lcyBhIGVuZCBpbiBiPyAgRWxlbWVudHMgaW4gYiBhZnRlciB0aGF0IGNhbiBiZQotCSAqIGlnbm9yZWQgKGFscmVhZHkgaW4gcGxhY2UpLgotCSAqLwotCW5iID0gZ2FsbG9wX2xlZnQocGFbbmEtMV0sIHBiLCBuYiwgbmItMSwgY29tcGFyZSk7Ci0JaWYgKG5iIDw9IDApCi0JCXJldHVybiBuYjsKKyAgICAvKiBXaGVyZSBkb2VzIGEgZW5kIGluIGI/ICBFbGVtZW50cyBpbiBiIGFmdGVyIHRoYXQgY2FuIGJlCisgICAgICogaWdub3JlZCAoYWxyZWFkeSBpbiBwbGFjZSkuCisgICAgICovCisgICAgbmIgPSBnYWxsb3BfbGVmdChwYVtuYS0xXSwgcGIsIG5iLCBuYi0xLCBjb21wYXJlKTsKKyAgICBpZiAobmIgPD0gMCkKKyAgICAgICAgcmV0dXJuIG5iOwogCi0JLyogTWVyZ2Ugd2hhdCByZW1haW5zIG9mIHRoZSBydW5zLCB1c2luZyBhIHRlbXAgYXJyYXkgd2l0aAotCSAqIG1pbihuYSwgbmIpIGVsZW1lbnRzLgotCSAqLwotCWlmIChuYSA8PSBuYikKLQkJcmV0dXJuIG1lcmdlX2xvKG1zLCBwYSwgbmEsIHBiLCBuYik7Ci0JZWxzZQotCQlyZXR1cm4gbWVyZ2VfaGkobXMsIHBhLCBuYSwgcGIsIG5iKTsKKyAgICAvKiBNZXJnZSB3aGF0IHJlbWFpbnMgb2YgdGhlIHJ1bnMsIHVzaW5nIGEgdGVtcCBhcnJheSB3aXRoCisgICAgICogbWluKG5hLCBuYikgZWxlbWVudHMuCisgICAgICovCisgICAgaWYgKG5hIDw9IG5iKQorICAgICAgICByZXR1cm4gbWVyZ2VfbG8obXMsIHBhLCBuYSwgcGIsIG5iKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBtZXJnZV9oaShtcywgcGEsIG5hLCBwYiwgbmIpOwogfQogCiAvKiBFeGFtaW5lIHRoZSBzdGFjayBvZiBydW5zIHdhaXRpbmcgdG8gYmUgbWVyZ2VkLCBtZXJnaW5nIGFkamFjZW50IHJ1bnMKQEAgLTE3ODksMjUgKzE3ODksMjUgQEAKIHN0YXRpYyBpbnQKIG1lcmdlX2NvbGxhcHNlKE1lcmdlU3RhdGUgKm1zKQogewotCXN0cnVjdCBzX3NsaWNlICpwID0gbXMtPnBlbmRpbmc7CisgICAgc3RydWN0IHNfc2xpY2UgKnAgPSBtcy0+cGVuZGluZzsKIAotCWFzc2VydChtcyk7Ci0Jd2hpbGUgKG1zLT5uID4gMSkgewotCQlQeV9zc2l6ZV90IG4gPSBtcy0+biAtIDI7Ci0JCWlmIChuID4gMCAmJiBwW24tMV0ubGVuIDw9IHBbbl0ubGVuICsgcFtuKzFdLmxlbikgewotCQkgICAgCWlmIChwW24tMV0ubGVuIDwgcFtuKzFdLmxlbikKLQkJICAgIAkJLS1uOwotCQkJaWYgKG1lcmdlX2F0KG1zLCBuKSA8IDApCi0JCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWVsc2UgaWYgKHBbbl0ubGVuIDw9IHBbbisxXS5sZW4pIHsKLQkJCSBpZiAobWVyZ2VfYXQobXMsIG4pIDwgMCkKLQkJCSAJcmV0dXJuIC0xOwotCQl9Ci0JCWVsc2UKLQkJCWJyZWFrOwotCX0KLQlyZXR1cm4gMDsKKyAgICBhc3NlcnQobXMpOworICAgIHdoaWxlIChtcy0+biA+IDEpIHsKKyAgICAgICAgUHlfc3NpemVfdCBuID0gbXMtPm4gLSAyOworICAgICAgICBpZiAobiA+IDAgJiYgcFtuLTFdLmxlbiA8PSBwW25dLmxlbiArIHBbbisxXS5sZW4pIHsKKyAgICAgICAgICAgIGlmIChwW24tMV0ubGVuIDwgcFtuKzFdLmxlbikKKyAgICAgICAgICAgICAgICAtLW47CisgICAgICAgICAgICBpZiAobWVyZ2VfYXQobXMsIG4pIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAocFtuXS5sZW4gPD0gcFtuKzFdLmxlbikgeworICAgICAgICAgICAgICAgICBpZiAobWVyZ2VfYXQobXMsIG4pIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIC8qIFJlZ2FyZGxlc3Mgb2YgaW52YXJpYW50cywgbWVyZ2UgYWxsIHJ1bnMgb24gdGhlIHN0YWNrIHVudGlsIG9ubHkgb25lCkBAIC0xODE4LDE3ICsxODE4LDE3IEBACiBzdGF0aWMgaW50CiBtZXJnZV9mb3JjZV9jb2xsYXBzZShNZXJnZVN0YXRlICptcykKIHsKLQlzdHJ1Y3Qgc19zbGljZSAqcCA9IG1zLT5wZW5kaW5nOworICAgIHN0cnVjdCBzX3NsaWNlICpwID0gbXMtPnBlbmRpbmc7CiAKLQlhc3NlcnQobXMpOwotCXdoaWxlIChtcy0+biA+IDEpIHsKLQkJUHlfc3NpemVfdCBuID0gbXMtPm4gLSAyOwotCQlpZiAobiA+IDAgJiYgcFtuLTFdLmxlbiA8IHBbbisxXS5sZW4pCi0JCQktLW47Ci0JCWlmIChtZXJnZV9hdChtcywgbikgPCAwKQotCQkJcmV0dXJuIC0xOwotCX0KLQlyZXR1cm4gMDsKKyAgICBhc3NlcnQobXMpOworICAgIHdoaWxlIChtcy0+biA+IDEpIHsKKyAgICAgICAgUHlfc3NpemVfdCBuID0gbXMtPm4gLSAyOworICAgICAgICBpZiAobiA+IDAgJiYgcFtuLTFdLmxlbiA8IHBbbisxXS5sZW4pCisgICAgICAgICAgICAtLW47CisgICAgICAgIGlmIChtZXJnZV9hdChtcywgbikgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogLyogQ29tcHV0ZSBhIGdvb2QgdmFsdWUgZm9yIHRoZSBtaW5pbXVtIHJ1biBsZW5ndGg7IG5hdHVyYWwgcnVucyBzaG9ydGVyCkBAIC0xODQ0LDE0ICsxODQ0LDE0IEBACiBzdGF0aWMgUHlfc3NpemVfdAogbWVyZ2VfY29tcHV0ZV9taW5ydW4oUHlfc3NpemVfdCBuKQogewotCVB5X3NzaXplX3QgciA9IDA7CS8qIGJlY29tZXMgMSBpZiBhbnkgMSBiaXRzIGFyZSBzaGlmdGVkIG9mZiAqLworICAgIFB5X3NzaXplX3QgciA9IDA7ICAgICAgICAgICAvKiBiZWNvbWVzIDEgaWYgYW55IDEgYml0cyBhcmUgc2hpZnRlZCBvZmYgKi8KIAotCWFzc2VydChuID49IDApOwotCXdoaWxlIChuID49IDY0KSB7Ci0JCXIgfD0gbiAmIDE7Ci0JCW4gPj49IDE7Ci0JfQotCXJldHVybiBuICsgcjsKKyAgICBhc3NlcnQobiA+PSAwKTsKKyAgICB3aGlsZSAobiA+PSA2NCkgeworICAgICAgICByIHw9IG4gJiAxOworICAgICAgICBuID4+PSAxOworICAgIH0KKyAgICByZXR1cm4gbiArIHI7CiB9CiAKIC8qIFNwZWNpYWwgd3JhcHBlciB0byBzdXBwb3J0IHN0YWJsZSBzb3J0aW5nIHVzaW5nIHRoZSBkZWNvcmF0ZS1zb3J0LXVuZGVjb3JhdGUKQEAgLTE4NjIsOSArMTg2Miw5IEBACiAgICB0aGUga2V5IGluc3RlYWQgb2YgYSBmdWxsIHJlY29yZC4gKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewotCVB5T2JqZWN0X0hFQUQKLQlQeU9iamVjdCAqa2V5OwotCVB5T2JqZWN0ICp2YWx1ZTsKKyAgICBQeU9iamVjdF9IRUFECisgICAgUHlPYmplY3QgKmtleTsKKyAgICBQeU9iamVjdCAqdmFsdWU7CiB9IHNvcnR3cmFwcGVyb2JqZWN0OwogCiBQeURvY19TVFJWQVIoc29ydHdyYXBwZXJfZG9jLCAiT2JqZWN0IHdyYXBwZXIgd2l0aCBhIGN1c3RvbSBzb3J0IGtleS4iKTsKQEAgLTE4NzQsNTIgKzE4NzQsNTIgQEAKIHNvcnR3cmFwcGVyX2RlYWxsb2Moc29ydHdyYXBwZXJvYmplY3QgKik7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3Qgc29ydHdyYXBwZXJfdHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQotCSJzb3J0d3JhcHBlciIsCQkJCS8qIHRwX25hbWUgKi8KLQlzaXplb2Yoc29ydHdyYXBwZXJvYmplY3QpLAkJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJCS8qIHRwX2l0ZW1zaXplICovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKXNvcnR3cmFwcGVyX2RlYWxsb2MsCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfcmVwciAqLwotCTAsCQkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCQkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfAotCVB5X1RQRkxBR1NfSEFWRV9SSUNIQ09NUEFSRSwgCQkvKiB0cF9mbGFncyAqLwotCXNvcnR3cmFwcGVyX2RvYywJCQkvKiB0cF9kb2MgKi8KLQkwLAkJCQkJLyogdHBfdHJhdmVyc2UgKi8KLQkwLAkJCQkJLyogdHBfY2xlYXIgKi8KLQkocmljaGNtcGZ1bmMpc29ydHdyYXBwZXJfcmljaGNvbXBhcmUsCS8qIHRwX3JpY2hjb21wYXJlICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKKyAgICAic29ydHdyYXBwZXIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICBzaXplb2Yoc29ydHdyYXBwZXJvYmplY3QpLCAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3Ipc29ydHdyYXBwZXJfZGVhbGxvYywgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8CisgICAgUHlfVFBGTEFHU19IQVZFX1JJQ0hDT01QQVJFLCAgICAgICAgICAgICAgICAvKiB0cF9mbGFncyAqLworICAgIHNvcnR3cmFwcGVyX2RvYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAocmljaGNtcGZ1bmMpc29ydHdyYXBwZXJfcmljaGNvbXBhcmUsICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCiB9OwogCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzb3J0d3JhcHBlcl9yaWNoY29tcGFyZShzb3J0d3JhcHBlcm9iamVjdCAqYSwgc29ydHdyYXBwZXJvYmplY3QgKmIsIGludCBvcCkKIHsKLQlpZiAoIVB5T2JqZWN0X1R5cGVDaGVjayhiLCAmc29ydHdyYXBwZXJfdHlwZSkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCSJleHBlY3RlZCBhIHNvcnR3cmFwcGVyb2JqZWN0Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gUHlPYmplY3RfUmljaENvbXBhcmUoYS0+a2V5LCBiLT5rZXksIG9wKTsKKyAgICBpZiAoIVB5T2JqZWN0X1R5cGVDaGVjayhiLCAmc29ydHdyYXBwZXJfdHlwZSkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICJleHBlY3RlZCBhIHNvcnR3cmFwcGVyb2JqZWN0Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlPYmplY3RfUmljaENvbXBhcmUoYS0+a2V5LCBiLT5rZXksIG9wKTsKIH0KIAogc3RhdGljIHZvaWQKIHNvcnR3cmFwcGVyX2RlYWxsb2Moc29ydHdyYXBwZXJvYmplY3QgKnNvKQogewotCVB5X1hERUNSRUYoc28tPmtleSk7Ci0JUHlfWERFQ1JFRihzby0+dmFsdWUpOwotCVB5T2JqZWN0X0RlbChzbyk7CisgICAgUHlfWERFQ1JFRihzby0+a2V5KTsKKyAgICBQeV9YREVDUkVGKHNvLT52YWx1ZSk7CisgICAgUHlPYmplY3RfRGVsKHNvKTsKIH0KIAogLyogUmV0dXJucyBhIG5ldyByZWZlcmVuY2UgdG8gYSBzb3J0d3JhcHBlci4KQEAgLTE5MjgsMzAgKzE5MjgsMzAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBidWlsZF9zb3J0d3JhcHBlcihQeU9iamVjdCAqa2V5LCBQeU9iamVjdCAqdmFsdWUpCiB7Ci0Jc29ydHdyYXBwZXJvYmplY3QgKnNvOworICAgIHNvcnR3cmFwcGVyb2JqZWN0ICpzbzsKIAotCXNvID0gUHlPYmplY3RfTmV3KHNvcnR3cmFwcGVyb2JqZWN0LCAmc29ydHdyYXBwZXJfdHlwZSk7Ci0JaWYgKHNvID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXNvLT5rZXkgPSBrZXk7Ci0Jc28tPnZhbHVlID0gdmFsdWU7Ci0JcmV0dXJuIChQeU9iamVjdCAqKXNvOworICAgIHNvID0gUHlPYmplY3RfTmV3KHNvcnR3cmFwcGVyb2JqZWN0LCAmc29ydHdyYXBwZXJfdHlwZSk7CisgICAgaWYgKHNvID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHNvLT5rZXkgPSBrZXk7CisgICAgc28tPnZhbHVlID0gdmFsdWU7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKXNvOwogfQogCiAvKiBSZXR1cm5zIGEgbmV3IHJlZmVyZW5jZSB0byB0aGUgdmFsdWUgdW5kZXJseWluZyB0aGUgd3JhcHBlci4gKi8KIHN0YXRpYyBQeU9iamVjdCAqCiBzb3J0d3JhcHBlcl9nZXR2YWx1ZShQeU9iamVjdCAqc28pCiB7Ci0JUHlPYmplY3QgKnZhbHVlOworICAgIFB5T2JqZWN0ICp2YWx1ZTsKIAotCWlmICghUHlPYmplY3RfVHlwZUNoZWNrKHNvLCAmc29ydHdyYXBwZXJfdHlwZSkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCSJleHBlY3RlZCBhIHNvcnR3cmFwcGVyb2JqZWN0Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQl2YWx1ZSA9ICgoc29ydHdyYXBwZXJvYmplY3QgKilzbyktPnZhbHVlOwotCVB5X0lOQ1JFRih2YWx1ZSk7Ci0JcmV0dXJuIHZhbHVlOworICAgIGlmICghUHlPYmplY3RfVHlwZUNoZWNrKHNvLCAmc29ydHdyYXBwZXJfdHlwZSkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICJleHBlY3RlZCBhIHNvcnR3cmFwcGVyb2JqZWN0Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICB2YWx1ZSA9ICgoc29ydHdyYXBwZXJvYmplY3QgKilzbyktPnZhbHVlOworICAgIFB5X0lOQ1JFRih2YWx1ZSk7CisgICAgcmV0dXJuIHZhbHVlOwogfQogCiAvKiBXcmFwcGVyIGZvciB1c2VyIHNwZWNpZmllZCBjbXAgZnVuY3Rpb25zIGluIGNvbWJpbmF0aW9uIHdpdGggYQpAQCAtMTk1OSw3MyArMTk1OSw3MyBAQAogICAgd2l0aCB0aGUgYWN0dWFsIGtleSBpbnN0ZWFkIG9mIHRoZSBzb3J0d3JhcHBlciAqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCVB5T2JqZWN0ICpmdW5jOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBQeU9iamVjdCAqZnVuYzsKIH0gY21wd3JhcHBlcm9iamVjdDsKIAogc3RhdGljIHZvaWQKIGNtcHdyYXBwZXJfZGVhbGxvYyhjbXB3cmFwcGVyb2JqZWN0ICpjbykKIHsKLQlQeV9YREVDUkVGKGNvLT5mdW5jKTsKLQlQeU9iamVjdF9EZWwoY28pOworICAgIFB5X1hERUNSRUYoY28tPmZ1bmMpOworICAgIFB5T2JqZWN0X0RlbChjbyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjbXB3cmFwcGVyX2NhbGwoY21wd3JhcHBlcm9iamVjdCAqY28sIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlQeU9iamVjdCAqeCwgKnksICp4eCwgKnl5OworICAgIFB5T2JqZWN0ICp4LCAqeSwgKnh4LCAqeXk7CiAKLQlpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICIiLCAyLCAyLCAmeCwgJnkpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIVB5T2JqZWN0X1R5cGVDaGVjayh4LCAmc29ydHdyYXBwZXJfdHlwZSkgfHwKLQkgICAgIVB5T2JqZWN0X1R5cGVDaGVjayh5LCAmc29ydHdyYXBwZXJfdHlwZSkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCSJleHBlY3RlZCBhIHNvcnR3cmFwcGVyb2JqZWN0Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQl4eCA9ICgoc29ydHdyYXBwZXJvYmplY3QgKil4KS0+a2V5OwotCXl5ID0gKChzb3J0d3JhcHBlcm9iamVjdCAqKXkpLT5rZXk7Ci0JcmV0dXJuIFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoY28tPmZ1bmMsIHh4LCB5eSwgTlVMTCk7CisgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiIiwgMiwgMiwgJngsICZ5KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeU9iamVjdF9UeXBlQ2hlY2soeCwgJnNvcnR3cmFwcGVyX3R5cGUpIHx8CisgICAgICAgICFQeU9iamVjdF9UeXBlQ2hlY2soeSwgJnNvcnR3cmFwcGVyX3R5cGUpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAiZXhwZWN0ZWQgYSBzb3J0d3JhcHBlcm9iamVjdCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgeHggPSAoKHNvcnR3cmFwcGVyb2JqZWN0ICopeCktPmtleTsKKyAgICB5eSA9ICgoc29ydHdyYXBwZXJvYmplY3QgKil5KS0+a2V5OworICAgIHJldHVybiBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGNvLT5mdW5jLCB4eCwgeXksIE5VTEwpOwogfQogCiBQeURvY19TVFJWQVIoY21wd3JhcHBlcl9kb2MsICJjbXAoKSB3cmFwcGVyIGZvciBzb3J0IHdpdGggY3VzdG9tIGtleXMuIik7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgY21wd3JhcHBlcl90eXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCi0JImNtcHdyYXBwZXIiLAkJCQkvKiB0cF9uYW1lICovCi0Jc2l6ZW9mKGNtcHdyYXBwZXJvYmplY3QpLAkJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJCS8qIHRwX2l0ZW1zaXplICovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKWNtcHdyYXBwZXJfZGVhbGxvYywJCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfcmVwciAqLwotCTAsCQkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCQkvKiB0cF9oYXNoICovCi0JKHRlcm5hcnlmdW5jKWNtcHdyYXBwZXJfY2FsbCwJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCQkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQsCQkJLyogdHBfZmxhZ3MgKi8KLQljbXB3cmFwcGVyX2RvYywJCQkJLyogdHBfZG9jICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKKyAgICAiY21wd3JhcHBlciIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICBzaXplb2YoY21wd3JhcHBlcm9iamVjdCksICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpY21wd3JhcHBlcl9kZWFsbG9jLCAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgICh0ZXJuYXJ5ZnVuYyljbXB3cmFwcGVyX2NhbGwsICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICBjbXB3cmFwcGVyX2RvYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLwogfTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIGJ1aWxkX2NtcHdyYXBwZXIoUHlPYmplY3QgKmNtcGZ1bmMpCiB7Ci0JY21wd3JhcHBlcm9iamVjdCAqY287CisgICAgY21wd3JhcHBlcm9iamVjdCAqY287CiAKLQljbyA9IFB5T2JqZWN0X05ldyhjbXB3cmFwcGVyb2JqZWN0LCAmY21wd3JhcHBlcl90eXBlKTsKLQlpZiAoY28gPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JUHlfSU5DUkVGKGNtcGZ1bmMpOwotCWNvLT5mdW5jID0gY21wZnVuYzsKLQlyZXR1cm4gKFB5T2JqZWN0ICopY287CisgICAgY28gPSBQeU9iamVjdF9OZXcoY21wd3JhcHBlcm9iamVjdCwgJmNtcHdyYXBwZXJfdHlwZSk7CisgICAgaWYgKGNvID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5X0lOQ1JFRihjbXBmdW5jKTsKKyAgICBjby0+ZnVuYyA9IGNtcGZ1bmM7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWNvOwogfQogCiAvKiBBbiBhZGFwdGl2ZSwgc3RhYmxlLCBuYXR1cmFsIG1lcmdlc29ydC4gIFNlZSBsaXN0c29ydC50eHQuCkBAIC0yMDM2LDE3MSArMjAzNiwxNzEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBsaXN0c29ydChQeUxpc3RPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlNZXJnZVN0YXRlIG1zOwotCVB5T2JqZWN0ICoqbG8sICoqaGk7Ci0JUHlfc3NpemVfdCBucmVtYWluaW5nOwotCVB5X3NzaXplX3QgbWlucnVuOwotCVB5X3NzaXplX3Qgc2F2ZWRfb2Jfc2l6ZSwgc2F2ZWRfYWxsb2NhdGVkOwotCVB5T2JqZWN0ICoqc2F2ZWRfb2JfaXRlbTsKLQlQeU9iamVjdCAqKmZpbmFsX29iX2l0ZW07Ci0JUHlPYmplY3QgKmNvbXBhcmUgPSBOVUxMOwotCVB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOwkvKiBndWlsdHkgdW50aWwgcHJvdmVkIGlubm9jZW50ICovCi0JaW50IHJldmVyc2UgPSAwOwotCVB5T2JqZWN0ICprZXlmdW5jID0gTlVMTDsKLQlQeV9zc2l6ZV90IGk7Ci0JUHlPYmplY3QgKmtleSwgKnZhbHVlLCAqa3ZwYWlyOwotCXN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsiY21wIiwgImtleSIsICJyZXZlcnNlIiwgMH07CisgICAgTWVyZ2VTdGF0ZSBtczsKKyAgICBQeU9iamVjdCAqKmxvLCAqKmhpOworICAgIFB5X3NzaXplX3QgbnJlbWFpbmluZzsKKyAgICBQeV9zc2l6ZV90IG1pbnJ1bjsKKyAgICBQeV9zc2l6ZV90IHNhdmVkX29iX3NpemUsIHNhdmVkX2FsbG9jYXRlZDsKKyAgICBQeU9iamVjdCAqKnNhdmVkX29iX2l0ZW07CisgICAgUHlPYmplY3QgKipmaW5hbF9vYl9pdGVtOworICAgIFB5T2JqZWN0ICpjb21wYXJlID0gTlVMTDsKKyAgICBQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsgICAgICAgICAgICAvKiBndWlsdHkgdW50aWwgcHJvdmVkIGlubm9jZW50ICovCisgICAgaW50IHJldmVyc2UgPSAwOworICAgIFB5T2JqZWN0ICprZXlmdW5jID0gTlVMTDsKKyAgICBQeV9zc2l6ZV90IGk7CisgICAgUHlPYmplY3QgKmtleSwgKnZhbHVlLCAqa3ZwYWlyOworICAgIHN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsiY21wIiwgImtleSIsICJyZXZlcnNlIiwgMH07CiAKLQlhc3NlcnQoc2VsZiAhPSBOVUxMKTsKLQlhc3NlcnQgKFB5TGlzdF9DaGVjayhzZWxmKSk7Ci0JaWYgKGFyZ3MgIT0gTlVMTCkgewotCQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAifE9PaTpzb3J0IiwKLQkJCWt3bGlzdCwgJmNvbXBhcmUsICZrZXlmdW5jLCAmcmV2ZXJzZSkpCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKGNvbXBhcmUgPT0gUHlfTm9uZSkKLQkJY29tcGFyZSA9IE5VTEw7Ci0JaWYgKGNvbXBhcmUgIT0gTlVMTCAmJiAKLQkgICAgUHlFcnJfV2FyblB5M2soInRoZSBjbXAgYXJndW1lbnQgaXMgbm90IHN1cHBvcnRlZCBpbiAzLngiLCAxKSA8IDApCi0JCXJldHVybiBOVUxMOwotCWlmIChrZXlmdW5jID09IFB5X05vbmUpCi0JCWtleWZ1bmMgPSBOVUxMOwotCWlmIChjb21wYXJlICE9IE5VTEwgJiYga2V5ZnVuYyAhPSBOVUxMKSB7Ci0JCWNvbXBhcmUgPSBidWlsZF9jbXB3cmFwcGVyKGNvbXBhcmUpOwotCQlpZiAoY29tcGFyZSA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JfSBlbHNlCi0JCVB5X1hJTkNSRUYoY29tcGFyZSk7CisgICAgYXNzZXJ0KHNlbGYgIT0gTlVMTCk7CisgICAgYXNzZXJ0IChQeUxpc3RfQ2hlY2soc2VsZikpOworICAgIGlmIChhcmdzICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgInxPT2k6c29ydCIsCisgICAgICAgICAgICBrd2xpc3QsICZjb21wYXJlLCAma2V5ZnVuYywgJnJldmVyc2UpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChjb21wYXJlID09IFB5X05vbmUpCisgICAgICAgIGNvbXBhcmUgPSBOVUxMOworICAgIGlmIChjb21wYXJlICE9IE5VTEwgJiYKKyAgICAgICAgUHlFcnJfV2FyblB5M2soInRoZSBjbXAgYXJndW1lbnQgaXMgbm90IHN1cHBvcnRlZCBpbiAzLngiLCAxKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChrZXlmdW5jID09IFB5X05vbmUpCisgICAgICAgIGtleWZ1bmMgPSBOVUxMOworICAgIGlmIChjb21wYXJlICE9IE5VTEwgJiYga2V5ZnVuYyAhPSBOVUxMKSB7CisgICAgICAgIGNvbXBhcmUgPSBidWlsZF9jbXB3cmFwcGVyKGNvbXBhcmUpOworICAgICAgICBpZiAoY29tcGFyZSA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfSBlbHNlCisgICAgICAgIFB5X1hJTkNSRUYoY29tcGFyZSk7CiAKLQkvKiBUaGUgbGlzdCBpcyB0ZW1wb3JhcmlseSBtYWRlIGVtcHR5LCBzbyB0aGF0IG11dGF0aW9ucyBwZXJmb3JtZWQKLQkgKiBieSBjb21wYXJpc29uIGZ1bmN0aW9ucyBjYW4ndCBhZmZlY3QgdGhlIHNsaWNlIG9mIG1lbW9yeSB3ZSdyZQotCSAqIHNvcnRpbmcgKGFsbG93aW5nIG11dGF0aW9ucyBkdXJpbmcgc29ydGluZyBpcyBhIGNvcmUtZHVtcAotCSAqIGZhY3RvcnksIHNpbmNlIG9iX2l0ZW0gbWF5IGNoYW5nZSkuCi0JICovCi0Jc2F2ZWRfb2Jfc2l6ZSA9IFB5X1NJWkUoc2VsZik7Ci0Jc2F2ZWRfb2JfaXRlbSA9IHNlbGYtPm9iX2l0ZW07Ci0Jc2F2ZWRfYWxsb2NhdGVkID0gc2VsZi0+YWxsb2NhdGVkOwotCVB5X1NJWkUoc2VsZikgPSAwOwotCXNlbGYtPm9iX2l0ZW0gPSBOVUxMOwotCXNlbGYtPmFsbG9jYXRlZCA9IC0xOyAvKiBhbnkgb3BlcmF0aW9uIHdpbGwgcmVzZXQgaXQgdG8gPj0gMCAqLworICAgIC8qIFRoZSBsaXN0IGlzIHRlbXBvcmFyaWx5IG1hZGUgZW1wdHksIHNvIHRoYXQgbXV0YXRpb25zIHBlcmZvcm1lZAorICAgICAqIGJ5IGNvbXBhcmlzb24gZnVuY3Rpb25zIGNhbid0IGFmZmVjdCB0aGUgc2xpY2Ugb2YgbWVtb3J5IHdlJ3JlCisgICAgICogc29ydGluZyAoYWxsb3dpbmcgbXV0YXRpb25zIGR1cmluZyBzb3J0aW5nIGlzIGEgY29yZS1kdW1wCisgICAgICogZmFjdG9yeSwgc2luY2Ugb2JfaXRlbSBtYXkgY2hhbmdlKS4KKyAgICAgKi8KKyAgICBzYXZlZF9vYl9zaXplID0gUHlfU0laRShzZWxmKTsKKyAgICBzYXZlZF9vYl9pdGVtID0gc2VsZi0+b2JfaXRlbTsKKyAgICBzYXZlZF9hbGxvY2F0ZWQgPSBzZWxmLT5hbGxvY2F0ZWQ7CisgICAgUHlfU0laRShzZWxmKSA9IDA7CisgICAgc2VsZi0+b2JfaXRlbSA9IE5VTEw7CisgICAgc2VsZi0+YWxsb2NhdGVkID0gLTE7IC8qIGFueSBvcGVyYXRpb24gd2lsbCByZXNldCBpdCB0byA+PSAwICovCiAKLQlpZiAoa2V5ZnVuYyAhPSBOVUxMKSB7Ci0JCWZvciAoaT0wIDsgaSA8IHNhdmVkX29iX3NpemUgOyBpKyspIHsKLQkJCXZhbHVlID0gc2F2ZWRfb2JfaXRlbVtpXTsKLQkJCWtleSA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3Moa2V5ZnVuYywgdmFsdWUsCi0JCQkJCQkJICAgTlVMTCk7Ci0JCQlpZiAoa2V5ID09IE5VTEwpIHsKLQkJCQlmb3IgKGk9aS0xIDsgaT49MCA7IGktLSkgewotCQkJCQlrdnBhaXIgPSBzYXZlZF9vYl9pdGVtW2ldOwotCQkJCQl2YWx1ZSA9IHNvcnR3cmFwcGVyX2dldHZhbHVlKGt2cGFpcik7Ci0JCQkJCXNhdmVkX29iX2l0ZW1baV0gPSB2YWx1ZTsKLQkJCQkJUHlfREVDUkVGKGt2cGFpcik7Ci0JCQkJfQotCQkJCWdvdG8gZHN1X2ZhaWw7Ci0JCQl9Ci0JCQlrdnBhaXIgPSBidWlsZF9zb3J0d3JhcHBlcihrZXksIHZhbHVlKTsKLQkJCWlmIChrdnBhaXIgPT0gTlVMTCkKLQkJCQlnb3RvIGRzdV9mYWlsOwotCQkJc2F2ZWRfb2JfaXRlbVtpXSA9IGt2cGFpcjsKLQkJfQotCX0KKyAgICBpZiAoa2V5ZnVuYyAhPSBOVUxMKSB7CisgICAgICAgIGZvciAoaT0wIDsgaSA8IHNhdmVkX29iX3NpemUgOyBpKyspIHsKKyAgICAgICAgICAgIHZhbHVlID0gc2F2ZWRfb2JfaXRlbVtpXTsKKyAgICAgICAgICAgIGtleSA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3Moa2V5ZnVuYywgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICAgICAgaWYgKGtleSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgZm9yIChpPWktMSA7IGk+PTAgOyBpLS0pIHsKKyAgICAgICAgICAgICAgICAgICAga3ZwYWlyID0gc2F2ZWRfb2JfaXRlbVtpXTsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBzb3J0d3JhcHBlcl9nZXR2YWx1ZShrdnBhaXIpOworICAgICAgICAgICAgICAgICAgICBzYXZlZF9vYl9pdGVtW2ldID0gdmFsdWU7CisgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihrdnBhaXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBnb3RvIGRzdV9mYWlsOworICAgICAgICAgICAgfQorICAgICAgICAgICAga3ZwYWlyID0gYnVpbGRfc29ydHdyYXBwZXIoa2V5LCB2YWx1ZSk7CisgICAgICAgICAgICBpZiAoa3ZwYWlyID09IE5VTEwpCisgICAgICAgICAgICAgICAgZ290byBkc3VfZmFpbDsKKyAgICAgICAgICAgIHNhdmVkX29iX2l0ZW1baV0gPSBrdnBhaXI7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKiBSZXZlcnNlIHNvcnQgc3RhYmlsaXR5IGFjaGlldmVkIGJ5IGluaXRpYWxseSByZXZlcnNpbmcgdGhlIGxpc3QsCi0JYXBwbHlpbmcgYSBzdGFibGUgZm9yd2FyZCBzb3J0LCB0aGVuIHJldmVyc2luZyB0aGUgZmluYWwgcmVzdWx0LiAqLwotCWlmIChyZXZlcnNlICYmIHNhdmVkX29iX3NpemUgPiAxKQotCQlyZXZlcnNlX3NsaWNlKHNhdmVkX29iX2l0ZW0sIHNhdmVkX29iX2l0ZW0gKyBzYXZlZF9vYl9zaXplKTsKKyAgICAvKiBSZXZlcnNlIHNvcnQgc3RhYmlsaXR5IGFjaGlldmVkIGJ5IGluaXRpYWxseSByZXZlcnNpbmcgdGhlIGxpc3QsCisgICAgYXBwbHlpbmcgYSBzdGFibGUgZm9yd2FyZCBzb3J0LCB0aGVuIHJldmVyc2luZyB0aGUgZmluYWwgcmVzdWx0LiAqLworICAgIGlmIChyZXZlcnNlICYmIHNhdmVkX29iX3NpemUgPiAxKQorICAgICAgICByZXZlcnNlX3NsaWNlKHNhdmVkX29iX2l0ZW0sIHNhdmVkX29iX2l0ZW0gKyBzYXZlZF9vYl9zaXplKTsKIAotCW1lcmdlX2luaXQoJm1zLCBjb21wYXJlKTsKKyAgICBtZXJnZV9pbml0KCZtcywgY29tcGFyZSk7CiAKLQlucmVtYWluaW5nID0gc2F2ZWRfb2Jfc2l6ZTsKLQlpZiAobnJlbWFpbmluZyA8IDIpCi0JCWdvdG8gc3VjY2VlZDsKKyAgICBucmVtYWluaW5nID0gc2F2ZWRfb2Jfc2l6ZTsKKyAgICBpZiAobnJlbWFpbmluZyA8IDIpCisgICAgICAgIGdvdG8gc3VjY2VlZDsKIAotCS8qIE1hcmNoIG92ZXIgdGhlIGFycmF5IG9uY2UsIGxlZnQgdG8gcmlnaHQsIGZpbmRpbmcgbmF0dXJhbCBydW5zLAotCSAqIGFuZCBleHRlbmRpbmcgc2hvcnQgbmF0dXJhbCBydW5zIHRvIG1pbnJ1biBlbGVtZW50cy4KLQkgKi8KLQlsbyA9IHNhdmVkX29iX2l0ZW07Ci0JaGkgPSBsbyArIG5yZW1haW5pbmc7Ci0JbWlucnVuID0gbWVyZ2VfY29tcHV0ZV9taW5ydW4obnJlbWFpbmluZyk7Ci0JZG8gewotCQlpbnQgZGVzY2VuZGluZzsKLQkJUHlfc3NpemVfdCBuOworICAgIC8qIE1hcmNoIG92ZXIgdGhlIGFycmF5IG9uY2UsIGxlZnQgdG8gcmlnaHQsIGZpbmRpbmcgbmF0dXJhbCBydW5zLAorICAgICAqIGFuZCBleHRlbmRpbmcgc2hvcnQgbmF0dXJhbCBydW5zIHRvIG1pbnJ1biBlbGVtZW50cy4KKyAgICAgKi8KKyAgICBsbyA9IHNhdmVkX29iX2l0ZW07CisgICAgaGkgPSBsbyArIG5yZW1haW5pbmc7CisgICAgbWlucnVuID0gbWVyZ2VfY29tcHV0ZV9taW5ydW4obnJlbWFpbmluZyk7CisgICAgZG8geworICAgICAgICBpbnQgZGVzY2VuZGluZzsKKyAgICAgICAgUHlfc3NpemVfdCBuOwogCi0JCS8qIElkZW50aWZ5IG5leHQgcnVuLiAqLwotCQluID0gY291bnRfcnVuKGxvLCBoaSwgY29tcGFyZSwgJmRlc2NlbmRpbmcpOwotCQlpZiAobiA8IDApCi0JCQlnb3RvIGZhaWw7Ci0JCWlmIChkZXNjZW5kaW5nKQotCQkJcmV2ZXJzZV9zbGljZShsbywgbG8gKyBuKTsKLQkJLyogSWYgc2hvcnQsIGV4dGVuZCB0byBtaW4obWlucnVuLCBucmVtYWluaW5nKS4gKi8KLQkJaWYgKG4gPCBtaW5ydW4pIHsKLQkJCWNvbnN0IFB5X3NzaXplX3QgZm9yY2UgPSBucmVtYWluaW5nIDw9IG1pbnJ1biA/Ci0JIAkJCSAgCSAgbnJlbWFpbmluZyA6IG1pbnJ1bjsKLQkJCWlmIChiaW5hcnlzb3J0KGxvLCBsbyArIGZvcmNlLCBsbyArIG4sIGNvbXBhcmUpIDwgMCkKLQkJCQlnb3RvIGZhaWw7Ci0JCQluID0gZm9yY2U7Ci0JCX0KLQkJLyogUHVzaCBydW4gb250byBwZW5kaW5nLXJ1bnMgc3RhY2ssIGFuZCBtYXliZSBtZXJnZS4gKi8KLQkJYXNzZXJ0KG1zLm4gPCBNQVhfTUVSR0VfUEVORElORyk7Ci0JCW1zLnBlbmRpbmdbbXMubl0uYmFzZSA9IGxvOwotCQltcy5wZW5kaW5nW21zLm5dLmxlbiA9IG47Ci0JCSsrbXMubjsKLQkJaWYgKG1lcmdlX2NvbGxhcHNlKCZtcykgPCAwKQotCQkJZ290byBmYWlsOwotCQkvKiBBZHZhbmNlIHRvIGZpbmQgbmV4dCBydW4uICovCi0JCWxvICs9IG47Ci0JCW5yZW1haW5pbmcgLT0gbjsKLQl9IHdoaWxlIChucmVtYWluaW5nKTsKLQlhc3NlcnQobG8gPT0gaGkpOworICAgICAgICAvKiBJZGVudGlmeSBuZXh0IHJ1bi4gKi8KKyAgICAgICAgbiA9IGNvdW50X3J1bihsbywgaGksIGNvbXBhcmUsICZkZXNjZW5kaW5nKTsKKyAgICAgICAgaWYgKG4gPCAwKQorICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICBpZiAoZGVzY2VuZGluZykKKyAgICAgICAgICAgIHJldmVyc2Vfc2xpY2UobG8sIGxvICsgbik7CisgICAgICAgIC8qIElmIHNob3J0LCBleHRlbmQgdG8gbWluKG1pbnJ1biwgbnJlbWFpbmluZykuICovCisgICAgICAgIGlmIChuIDwgbWlucnVuKSB7CisgICAgICAgICAgICBjb25zdCBQeV9zc2l6ZV90IGZvcmNlID0gbnJlbWFpbmluZyA8PSBtaW5ydW4gPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnJlbWFpbmluZyA6IG1pbnJ1bjsKKyAgICAgICAgICAgIGlmIChiaW5hcnlzb3J0KGxvLCBsbyArIGZvcmNlLCBsbyArIG4sIGNvbXBhcmUpIDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICBuID0gZm9yY2U7CisgICAgICAgIH0KKyAgICAgICAgLyogUHVzaCBydW4gb250byBwZW5kaW5nLXJ1bnMgc3RhY2ssIGFuZCBtYXliZSBtZXJnZS4gKi8KKyAgICAgICAgYXNzZXJ0KG1zLm4gPCBNQVhfTUVSR0VfUEVORElORyk7CisgICAgICAgIG1zLnBlbmRpbmdbbXMubl0uYmFzZSA9IGxvOworICAgICAgICBtcy5wZW5kaW5nW21zLm5dLmxlbiA9IG47CisgICAgICAgICsrbXMubjsKKyAgICAgICAgaWYgKG1lcmdlX2NvbGxhcHNlKCZtcykgPCAwKQorICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAvKiBBZHZhbmNlIHRvIGZpbmQgbmV4dCBydW4uICovCisgICAgICAgIGxvICs9IG47CisgICAgICAgIG5yZW1haW5pbmcgLT0gbjsKKyAgICB9IHdoaWxlIChucmVtYWluaW5nKTsKKyAgICBhc3NlcnQobG8gPT0gaGkpOwogCi0JaWYgKG1lcmdlX2ZvcmNlX2NvbGxhcHNlKCZtcykgPCAwKQotCQlnb3RvIGZhaWw7Ci0JYXNzZXJ0KG1zLm4gPT0gMSk7Ci0JYXNzZXJ0KG1zLnBlbmRpbmdbMF0uYmFzZSA9PSBzYXZlZF9vYl9pdGVtKTsKLQlhc3NlcnQobXMucGVuZGluZ1swXS5sZW4gPT0gc2F2ZWRfb2Jfc2l6ZSk7CisgICAgaWYgKG1lcmdlX2ZvcmNlX2NvbGxhcHNlKCZtcykgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisgICAgYXNzZXJ0KG1zLm4gPT0gMSk7CisgICAgYXNzZXJ0KG1zLnBlbmRpbmdbMF0uYmFzZSA9PSBzYXZlZF9vYl9pdGVtKTsKKyAgICBhc3NlcnQobXMucGVuZGluZ1swXS5sZW4gPT0gc2F2ZWRfb2Jfc2l6ZSk7CiAKIHN1Y2NlZWQ6Ci0JcmVzdWx0ID0gUHlfTm9uZTsKKyAgICByZXN1bHQgPSBQeV9Ob25lOwogZmFpbDoKLQlpZiAoa2V5ZnVuYyAhPSBOVUxMKSB7Ci0JCWZvciAoaT0wIDsgaSA8IHNhdmVkX29iX3NpemUgOyBpKyspIHsKLQkJCWt2cGFpciA9IHNhdmVkX29iX2l0ZW1baV07Ci0JCQl2YWx1ZSA9IHNvcnR3cmFwcGVyX2dldHZhbHVlKGt2cGFpcik7Ci0JCQlzYXZlZF9vYl9pdGVtW2ldID0gdmFsdWU7Ci0JCQlQeV9ERUNSRUYoa3ZwYWlyKTsKLQkJfQotCX0KKyAgICBpZiAoa2V5ZnVuYyAhPSBOVUxMKSB7CisgICAgICAgIGZvciAoaT0wIDsgaSA8IHNhdmVkX29iX3NpemUgOyBpKyspIHsKKyAgICAgICAgICAgIGt2cGFpciA9IHNhdmVkX29iX2l0ZW1baV07CisgICAgICAgICAgICB2YWx1ZSA9IHNvcnR3cmFwcGVyX2dldHZhbHVlKGt2cGFpcik7CisgICAgICAgICAgICBzYXZlZF9vYl9pdGVtW2ldID0gdmFsdWU7CisgICAgICAgICAgICBQeV9ERUNSRUYoa3ZwYWlyKTsKKyAgICAgICAgfQorICAgIH0KIAotCWlmIChzZWxmLT5hbGxvY2F0ZWQgIT0gLTEgJiYgcmVzdWx0ICE9IE5VTEwpIHsKLQkJLyogVGhlIHVzZXIgbXVja2VkIHdpdGggdGhlIGxpc3QgZHVyaW5nIHRoZSBzb3J0LAotCQkgKiBhbmQgd2UgZG9uJ3QgYWxyZWFkeSBoYXZlIGFub3RoZXIgZXJyb3IgdG8gcmVwb3J0LgotCQkgKi8KLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJsaXN0IG1vZGlmaWVkIGR1cmluZyBzb3J0Iik7Ci0JCXJlc3VsdCA9IE5VTEw7Ci0JfQorICAgIGlmIChzZWxmLT5hbGxvY2F0ZWQgIT0gLTEgJiYgcmVzdWx0ICE9IE5VTEwpIHsKKyAgICAgICAgLyogVGhlIHVzZXIgbXVja2VkIHdpdGggdGhlIGxpc3QgZHVyaW5nIHRoZSBzb3J0LAorICAgICAgICAgKiBhbmQgd2UgZG9uJ3QgYWxyZWFkeSBoYXZlIGFub3RoZXIgZXJyb3IgdG8gcmVwb3J0LgorICAgICAgICAgKi8KKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJsaXN0IG1vZGlmaWVkIGR1cmluZyBzb3J0Iik7CisgICAgICAgIHJlc3VsdCA9IE5VTEw7CisgICAgfQogCi0JaWYgKHJldmVyc2UgJiYgc2F2ZWRfb2Jfc2l6ZSA+IDEpCi0JCXJldmVyc2Vfc2xpY2Uoc2F2ZWRfb2JfaXRlbSwgc2F2ZWRfb2JfaXRlbSArIHNhdmVkX29iX3NpemUpOworICAgIGlmIChyZXZlcnNlICYmIHNhdmVkX29iX3NpemUgPiAxKQorICAgICAgICByZXZlcnNlX3NsaWNlKHNhdmVkX29iX2l0ZW0sIHNhdmVkX29iX2l0ZW0gKyBzYXZlZF9vYl9zaXplKTsKIAotCW1lcmdlX2ZyZWVtZW0oJm1zKTsKKyAgICBtZXJnZV9mcmVlbWVtKCZtcyk7CiAKIGRzdV9mYWlsOgotCWZpbmFsX29iX2l0ZW0gPSBzZWxmLT5vYl9pdGVtOwotCWkgPSBQeV9TSVpFKHNlbGYpOwotCVB5X1NJWkUoc2VsZikgPSBzYXZlZF9vYl9zaXplOwotCXNlbGYtPm9iX2l0ZW0gPSBzYXZlZF9vYl9pdGVtOwotCXNlbGYtPmFsbG9jYXRlZCA9IHNhdmVkX2FsbG9jYXRlZDsKLQlpZiAoZmluYWxfb2JfaXRlbSAhPSBOVUxMKSB7Ci0JCS8qIHdlIGNhbm5vdCB1c2UgbGlzdF9jbGVhcigpIGZvciB0aGlzIGJlY2F1c2UgaXQgZG9lcyBub3QKLQkJICAgZ3VhcmFudGVlIHRoYXQgdGhlIGxpc3QgaXMgcmVhbGx5IGVtcHR5IHdoZW4gaXQgcmV0dXJucyAqLwotCQl3aGlsZSAoLS1pID49IDApIHsKLQkJCVB5X1hERUNSRUYoZmluYWxfb2JfaXRlbVtpXSk7Ci0JCX0KLQkJUHlNZW1fRlJFRShmaW5hbF9vYl9pdGVtKTsKLQl9Ci0JUHlfWERFQ1JFRihjb21wYXJlKTsKLQlQeV9YSU5DUkVGKHJlc3VsdCk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBmaW5hbF9vYl9pdGVtID0gc2VsZi0+b2JfaXRlbTsKKyAgICBpID0gUHlfU0laRShzZWxmKTsKKyAgICBQeV9TSVpFKHNlbGYpID0gc2F2ZWRfb2Jfc2l6ZTsKKyAgICBzZWxmLT5vYl9pdGVtID0gc2F2ZWRfb2JfaXRlbTsKKyAgICBzZWxmLT5hbGxvY2F0ZWQgPSBzYXZlZF9hbGxvY2F0ZWQ7CisgICAgaWYgKGZpbmFsX29iX2l0ZW0gIT0gTlVMTCkgeworICAgICAgICAvKiB3ZSBjYW5ub3QgdXNlIGxpc3RfY2xlYXIoKSBmb3IgdGhpcyBiZWNhdXNlIGl0IGRvZXMgbm90CisgICAgICAgICAgIGd1YXJhbnRlZSB0aGF0IHRoZSBsaXN0IGlzIHJlYWxseSBlbXB0eSB3aGVuIGl0IHJldHVybnMgKi8KKyAgICAgICAgd2hpbGUgKC0taSA+PSAwKSB7CisgICAgICAgICAgICBQeV9YREVDUkVGKGZpbmFsX29iX2l0ZW1baV0pOworICAgICAgICB9CisgICAgICAgIFB5TWVtX0ZSRUUoZmluYWxfb2JfaXRlbSk7CisgICAgfQorICAgIFB5X1hERUNSRUYoY29tcGFyZSk7CisgICAgUHlfWElOQ1JFRihyZXN1bHQpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAjdW5kZWYgSUZMVAogI3VuZGVmIElTTFQKQEAgLTIyMDgsMjQ4ICsyMjA4LDI0OCBAQAogaW50CiBQeUxpc3RfU29ydChQeU9iamVjdCAqdikKIHsKLQlpZiAodiA9PSBOVUxMIHx8ICFQeUxpc3RfQ2hlY2sodikpIHsKLQkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JdiA9IGxpc3Rzb3J0KChQeUxpc3RPYmplY3QgKil2LCAoUHlPYmplY3QgKilOVUxMLCAoUHlPYmplY3QgKilOVUxMKTsKLQlpZiAodiA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0JUHlfREVDUkVGKHYpOwotCXJldHVybiAwOworICAgIGlmICh2ID09IE5VTEwgfHwgIVB5TGlzdF9DaGVjayh2KSkgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICB2ID0gbGlzdHNvcnQoKFB5TGlzdE9iamVjdCAqKXYsIChQeU9iamVjdCAqKU5VTEwsIChQeU9iamVjdCAqKU5VTEwpOworICAgIGlmICh2ID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBQeV9ERUNSRUYodik7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBsaXN0cmV2ZXJzZShQeUxpc3RPYmplY3QgKnNlbGYpCiB7Ci0JaWYgKFB5X1NJWkUoc2VsZikgPiAxKQotCQlyZXZlcnNlX3NsaWNlKHNlbGYtPm9iX2l0ZW0sIHNlbGYtPm9iX2l0ZW0gKyBQeV9TSVpFKHNlbGYpKTsKLQlQeV9SRVRVUk5fTk9ORTsKKyAgICBpZiAoUHlfU0laRShzZWxmKSA+IDEpCisgICAgICAgIHJldmVyc2Vfc2xpY2Uoc2VsZi0+b2JfaXRlbSwgc2VsZi0+b2JfaXRlbSArIFB5X1NJWkUoc2VsZikpOworICAgIFB5X1JFVFVSTl9OT05FOwogfQogCiBpbnQKIFB5TGlzdF9SZXZlcnNlKFB5T2JqZWN0ICp2KQogewotCVB5TGlzdE9iamVjdCAqc2VsZiA9IChQeUxpc3RPYmplY3QgKil2OworICAgIFB5TGlzdE9iamVjdCAqc2VsZiA9IChQeUxpc3RPYmplY3QgKil2OwogCi0JaWYgKHYgPT0gTlVMTCB8fCAhUHlMaXN0X0NoZWNrKHYpKSB7Ci0JCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmIChQeV9TSVpFKHNlbGYpID4gMSkKLQkJcmV2ZXJzZV9zbGljZShzZWxmLT5vYl9pdGVtLCBzZWxmLT5vYl9pdGVtICsgUHlfU0laRShzZWxmKSk7Ci0JcmV0dXJuIDA7CisgICAgaWYgKHYgPT0gTlVMTCB8fCAhUHlMaXN0X0NoZWNrKHYpKSB7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChQeV9TSVpFKHNlbGYpID4gMSkKKyAgICAgICAgcmV2ZXJzZV9zbGljZShzZWxmLT5vYl9pdGVtLCBzZWxmLT5vYl9pdGVtICsgUHlfU0laRShzZWxmKSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIFB5T2JqZWN0ICoKIFB5TGlzdF9Bc1R1cGxlKFB5T2JqZWN0ICp2KQogewotCVB5T2JqZWN0ICp3OwotCVB5T2JqZWN0ICoqcCwgKipxOwotCVB5X3NzaXplX3QgbjsKLQlpZiAodiA9PSBOVUxMIHx8ICFQeUxpc3RfQ2hlY2sodikpIHsKLQkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQluID0gUHlfU0laRSh2KTsKLQl3ID0gUHlUdXBsZV9OZXcobik7Ci0JaWYgKHcgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JcCA9ICgoUHlUdXBsZU9iamVjdCAqKXcpLT5vYl9pdGVtOwotCXEgPSAoKFB5TGlzdE9iamVjdCAqKXYpLT5vYl9pdGVtOwotCXdoaWxlICgtLW4gPj0gMCkgewotCQlQeV9JTkNSRUYoKnEpOwotCQkqcCA9ICpxOwotCQlwKys7Ci0JCXErKzsKLQl9Ci0JcmV0dXJuIHc7CisgICAgUHlPYmplY3QgKnc7CisgICAgUHlPYmplY3QgKipwLCAqKnE7CisgICAgUHlfc3NpemVfdCBuOworICAgIGlmICh2ID09IE5VTEwgfHwgIVB5TGlzdF9DaGVjayh2KSkgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIG4gPSBQeV9TSVpFKHYpOworICAgIHcgPSBQeVR1cGxlX05ldyhuKTsKKyAgICBpZiAodyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBwID0gKChQeVR1cGxlT2JqZWN0ICopdyktPm9iX2l0ZW07CisgICAgcSA9ICgoUHlMaXN0T2JqZWN0ICopdiktPm9iX2l0ZW07CisgICAgd2hpbGUgKC0tbiA+PSAwKSB7CisgICAgICAgIFB5X0lOQ1JFRigqcSk7CisgICAgICAgICpwID0gKnE7CisgICAgICAgIHArKzsKKyAgICAgICAgcSsrOworICAgIH0KKyAgICByZXR1cm4gdzsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGxpc3RpbmRleChQeUxpc3RPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5X3NzaXplX3QgaSwgc3RhcnQ9MCwgc3RvcD1QeV9TSVpFKHNlbGYpOwotCVB5T2JqZWN0ICp2OworICAgIFB5X3NzaXplX3QgaSwgc3RhcnQ9MCwgc3RvcD1QeV9TSVpFKHNlbGYpOworICAgIFB5T2JqZWN0ICp2OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfE8mTyY6aW5kZXgiLCAmdiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1B5RXZhbF9TbGljZUluZGV4LCAmc3RhcnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9QeUV2YWxfU2xpY2VJbmRleCwgJnN0b3ApKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoc3RhcnQgPCAwKSB7Ci0JCXN0YXJ0ICs9IFB5X1NJWkUoc2VsZik7Ci0JCWlmIChzdGFydCA8IDApCi0JCQlzdGFydCA9IDA7Ci0JfQotCWlmIChzdG9wIDwgMCkgewotCQlzdG9wICs9IFB5X1NJWkUoc2VsZik7Ci0JCWlmIChzdG9wIDwgMCkKLQkJCXN0b3AgPSAwOwotCX0KLQlmb3IgKGkgPSBzdGFydDsgaSA8IHN0b3AgJiYgaSA8IFB5X1NJWkUoc2VsZik7IGkrKykgewotCQlpbnQgY21wID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKHNlbGYtPm9iX2l0ZW1baV0sIHYsIFB5X0VRKTsKLQkJaWYgKGNtcCA+IDApCi0JCQlyZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QoaSk7Ci0JCWVsc2UgaWYgKGNtcCA8IDApCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJsaXN0LmluZGV4KHgpOiB4IG5vdCBpbiBsaXN0Iik7Ci0JcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfE8mTyY6aW5kZXgiLCAmdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1B5RXZhbF9TbGljZUluZGV4LCAmc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9QeUV2YWxfU2xpY2VJbmRleCwgJnN0b3ApKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoc3RhcnQgPCAwKSB7CisgICAgICAgIHN0YXJ0ICs9IFB5X1NJWkUoc2VsZik7CisgICAgICAgIGlmIChzdGFydCA8IDApCisgICAgICAgICAgICBzdGFydCA9IDA7CisgICAgfQorICAgIGlmIChzdG9wIDwgMCkgeworICAgICAgICBzdG9wICs9IFB5X1NJWkUoc2VsZik7CisgICAgICAgIGlmIChzdG9wIDwgMCkKKyAgICAgICAgICAgIHN0b3AgPSAwOworICAgIH0KKyAgICBmb3IgKGkgPSBzdGFydDsgaSA8IHN0b3AgJiYgaSA8IFB5X1NJWkUoc2VsZik7IGkrKykgeworICAgICAgICBpbnQgY21wID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKHNlbGYtPm9iX2l0ZW1baV0sIHYsIFB5X0VRKTsKKyAgICAgICAgaWYgKGNtcCA+IDApCisgICAgICAgICAgICByZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QoaSk7CisgICAgICAgIGVsc2UgaWYgKGNtcCA8IDApCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJsaXN0LmluZGV4KHgpOiB4IG5vdCBpbiBsaXN0Iik7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBsaXN0Y291bnQoUHlMaXN0T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdikKIHsKLQlQeV9zc2l6ZV90IGNvdW50ID0gMDsKLQlQeV9zc2l6ZV90IGk7CisgICAgUHlfc3NpemVfdCBjb3VudCA9IDA7CisgICAgUHlfc3NpemVfdCBpOwogCi0JZm9yIChpID0gMDsgaSA8IFB5X1NJWkUoc2VsZik7IGkrKykgewotCQlpbnQgY21wID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKHNlbGYtPm9iX2l0ZW1baV0sIHYsIFB5X0VRKTsKLQkJaWYgKGNtcCA+IDApCi0JCQljb3VudCsrOwotCQllbHNlIGlmIChjbXAgPCAwKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBQeUludF9Gcm9tU3NpemVfdChjb3VudCk7CisgICAgZm9yIChpID0gMDsgaSA8IFB5X1NJWkUoc2VsZik7IGkrKykgeworICAgICAgICBpbnQgY21wID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKHNlbGYtPm9iX2l0ZW1baV0sIHYsIFB5X0VRKTsKKyAgICAgICAgaWYgKGNtcCA+IDApCisgICAgICAgICAgICBjb3VudCsrOworICAgICAgICBlbHNlIGlmIChjbXAgPCAwKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBQeUludF9Gcm9tU3NpemVfdChjb3VudCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBsaXN0cmVtb3ZlKFB5TGlzdE9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnYpCiB7Ci0JUHlfc3NpemVfdCBpOworICAgIFB5X3NzaXplX3QgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBQeV9TSVpFKHNlbGYpOyBpKyspIHsKLQkJaW50IGNtcCA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChzZWxmLT5vYl9pdGVtW2ldLCB2LCBQeV9FUSk7Ci0JCWlmIChjbXAgPiAwKSB7Ci0JCQlpZiAobGlzdF9hc3Nfc2xpY2Uoc2VsZiwgaSwgaSsxLAotCQkJCQkgICAoUHlPYmplY3QgKilOVUxMKSA9PSAwKQotCQkJCVB5X1JFVFVSTl9OT05FOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJZWxzZSBpZiAoY21wIDwgMCkKLQkJCXJldHVybiBOVUxMOwotCX0KLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImxpc3QucmVtb3ZlKHgpOiB4IG5vdCBpbiBsaXN0Iik7Ci0JcmV0dXJuIE5VTEw7CisgICAgZm9yIChpID0gMDsgaSA8IFB5X1NJWkUoc2VsZik7IGkrKykgeworICAgICAgICBpbnQgY21wID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKHNlbGYtPm9iX2l0ZW1baV0sIHYsIFB5X0VRKTsKKyAgICAgICAgaWYgKGNtcCA+IDApIHsKKyAgICAgICAgICAgIGlmIChsaXN0X2Fzc19zbGljZShzZWxmLCBpLCBpKzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFB5T2JqZWN0ICopTlVMTCkgPT0gMCkKKyAgICAgICAgICAgICAgICBQeV9SRVRVUk5fTk9ORTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGNtcCA8IDApCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJsaXN0LnJlbW92ZSh4KTogeCBub3QgaW4gbGlzdCIpOworICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgaW50CiBsaXN0X3RyYXZlcnNlKFB5TGlzdE9iamVjdCAqbywgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JUHlfc3NpemVfdCBpOworICAgIFB5X3NzaXplX3QgaTsKIAotCWZvciAoaSA9IFB5X1NJWkUobyk7IC0taSA+PSAwOyApCi0JCVB5X1ZJU0lUKG8tPm9iX2l0ZW1baV0pOwotCXJldHVybiAwOworICAgIGZvciAoaSA9IFB5X1NJWkUobyk7IC0taSA+PSAwOyApCisgICAgICAgIFB5X1ZJU0lUKG8tPm9iX2l0ZW1baV0pOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbGlzdF9yaWNoY29tcGFyZShQeU9iamVjdCAqdiwgUHlPYmplY3QgKncsIGludCBvcCkKIHsKLQlQeUxpc3RPYmplY3QgKnZsLCAqd2w7Ci0JUHlfc3NpemVfdCBpOworICAgIFB5TGlzdE9iamVjdCAqdmwsICp3bDsKKyAgICBQeV9zc2l6ZV90IGk7CiAKLQlpZiAoIVB5TGlzdF9DaGVjayh2KSB8fCAhUHlMaXN0X0NoZWNrKHcpKSB7Ci0JCVB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7Ci0JCXJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKLQl9CisgICAgaWYgKCFQeUxpc3RfQ2hlY2sodikgfHwgIVB5TGlzdF9DaGVjayh3KSkgeworICAgICAgICBQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOworICAgICAgICByZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7CisgICAgfQogCi0JdmwgPSAoUHlMaXN0T2JqZWN0ICopdjsKLQl3bCA9IChQeUxpc3RPYmplY3QgKil3OworICAgIHZsID0gKFB5TGlzdE9iamVjdCAqKXY7CisgICAgd2wgPSAoUHlMaXN0T2JqZWN0ICopdzsKIAotCWlmIChQeV9TSVpFKHZsKSAhPSBQeV9TSVpFKHdsKSAmJiAob3AgPT0gUHlfRVEgfHwgb3AgPT0gUHlfTkUpKSB7Ci0JCS8qIFNob3J0Y3V0OiBpZiB0aGUgbGVuZ3RocyBkaWZmZXIsIHRoZSBsaXN0cyBkaWZmZXIgKi8KLQkJUHlPYmplY3QgKnJlczsKLQkJaWYgKG9wID09IFB5X0VRKQotCQkJcmVzID0gUHlfRmFsc2U7Ci0JCWVsc2UKLQkJCXJlcyA9IFB5X1RydWU7Ci0JCVB5X0lOQ1JFRihyZXMpOwotCQlyZXR1cm4gcmVzOwotCX0KKyAgICBpZiAoUHlfU0laRSh2bCkgIT0gUHlfU0laRSh3bCkgJiYgKG9wID09IFB5X0VRIHx8IG9wID09IFB5X05FKSkgeworICAgICAgICAvKiBTaG9ydGN1dDogaWYgdGhlIGxlbmd0aHMgZGlmZmVyLCB0aGUgbGlzdHMgZGlmZmVyICovCisgICAgICAgIFB5T2JqZWN0ICpyZXM7CisgICAgICAgIGlmIChvcCA9PSBQeV9FUSkKKyAgICAgICAgICAgIHJlcyA9IFB5X0ZhbHNlOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXMgPSBQeV9UcnVlOworICAgICAgICBQeV9JTkNSRUYocmVzKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CiAKLQkvKiBTZWFyY2ggZm9yIHRoZSBmaXJzdCBpbmRleCB3aGVyZSBpdGVtcyBhcmUgZGlmZmVyZW50ICovCi0JZm9yIChpID0gMDsgaSA8IFB5X1NJWkUodmwpICYmIGkgPCBQeV9TSVpFKHdsKTsgaSsrKSB7Ci0JCWludCBrID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKHZsLT5vYl9pdGVtW2ldLAotCQkJCQkJIHdsLT5vYl9pdGVtW2ldLCBQeV9FUSk7Ci0JCWlmIChrIDwgMCkKLQkJCXJldHVybiBOVUxMOwotCQlpZiAoIWspCi0JCQlicmVhazsKLQl9CisgICAgLyogU2VhcmNoIGZvciB0aGUgZmlyc3QgaW5kZXggd2hlcmUgaXRlbXMgYXJlIGRpZmZlcmVudCAqLworICAgIGZvciAoaSA9IDA7IGkgPCBQeV9TSVpFKHZsKSAmJiBpIDwgUHlfU0laRSh3bCk7IGkrKykgeworICAgICAgICBpbnQgayA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbCh2bC0+b2JfaXRlbVtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2wtPm9iX2l0ZW1baV0sIFB5X0VRKTsKKyAgICAgICAgaWYgKGsgPCAwKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGlmICghaykKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KIAotCWlmIChpID49IFB5X1NJWkUodmwpIHx8IGkgPj0gUHlfU0laRSh3bCkpIHsKLQkJLyogTm8gbW9yZSBpdGVtcyB0byBjb21wYXJlIC0tIGNvbXBhcmUgc2l6ZXMgKi8KLQkJUHlfc3NpemVfdCB2cyA9IFB5X1NJWkUodmwpOwotCQlQeV9zc2l6ZV90IHdzID0gUHlfU0laRSh3bCk7Ci0JCWludCBjbXA7Ci0JCVB5T2JqZWN0ICpyZXM7Ci0JCXN3aXRjaCAob3ApIHsKLQkJY2FzZSBQeV9MVDogY21wID0gdnMgPCAgd3M7IGJyZWFrOwotCQljYXNlIFB5X0xFOiBjbXAgPSB2cyA8PSB3czsgYnJlYWs7Ci0JCWNhc2UgUHlfRVE6IGNtcCA9IHZzID09IHdzOyBicmVhazsKLQkJY2FzZSBQeV9ORTogY21wID0gdnMgIT0gd3M7IGJyZWFrOwotCQljYXNlIFB5X0dUOiBjbXAgPSB2cyA+ICB3czsgYnJlYWs7Ci0JCWNhc2UgUHlfR0U6IGNtcCA9IHZzID49IHdzOyBicmVhazsKLQkJZGVmYXVsdDogcmV0dXJuIE5VTEw7IC8qIGNhbm5vdCBoYXBwZW4gKi8KLQkJfQotCQlpZiAoY21wKQotCQkJcmVzID0gUHlfVHJ1ZTsKLQkJZWxzZQotCQkJcmVzID0gUHlfRmFsc2U7Ci0JCVB5X0lOQ1JFRihyZXMpOwotCQlyZXR1cm4gcmVzOwotCX0KKyAgICBpZiAoaSA+PSBQeV9TSVpFKHZsKSB8fCBpID49IFB5X1NJWkUod2wpKSB7CisgICAgICAgIC8qIE5vIG1vcmUgaXRlbXMgdG8gY29tcGFyZSAtLSBjb21wYXJlIHNpemVzICovCisgICAgICAgIFB5X3NzaXplX3QgdnMgPSBQeV9TSVpFKHZsKTsKKyAgICAgICAgUHlfc3NpemVfdCB3cyA9IFB5X1NJWkUod2wpOworICAgICAgICBpbnQgY21wOworICAgICAgICBQeU9iamVjdCAqcmVzOworICAgICAgICBzd2l0Y2ggKG9wKSB7CisgICAgICAgIGNhc2UgUHlfTFQ6IGNtcCA9IHZzIDwgIHdzOyBicmVhazsKKyAgICAgICAgY2FzZSBQeV9MRTogY21wID0gdnMgPD0gd3M7IGJyZWFrOworICAgICAgICBjYXNlIFB5X0VROiBjbXAgPSB2cyA9PSB3czsgYnJlYWs7CisgICAgICAgIGNhc2UgUHlfTkU6IGNtcCA9IHZzICE9IHdzOyBicmVhazsKKyAgICAgICAgY2FzZSBQeV9HVDogY21wID0gdnMgPiAgd3M7IGJyZWFrOworICAgICAgICBjYXNlIFB5X0dFOiBjbXAgPSB2cyA+PSB3czsgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IHJldHVybiBOVUxMOyAvKiBjYW5ub3QgaGFwcGVuICovCisgICAgICAgIH0KKyAgICAgICAgaWYgKGNtcCkKKyAgICAgICAgICAgIHJlcyA9IFB5X1RydWU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJlcyA9IFB5X0ZhbHNlOworICAgICAgICBQeV9JTkNSRUYocmVzKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CiAKLQkvKiBXZSBoYXZlIGFuIGl0ZW0gdGhhdCBkaWZmZXJzIC0tIHNob3J0Y3V0cyBmb3IgRVEvTkUgKi8KLQlpZiAob3AgPT0gUHlfRVEpIHsKLQkJUHlfSU5DUkVGKFB5X0ZhbHNlKTsKLQkJcmV0dXJuIFB5X0ZhbHNlOwotCX0KLQlpZiAob3AgPT0gUHlfTkUpIHsKLQkJUHlfSU5DUkVGKFB5X1RydWUpOwotCQlyZXR1cm4gUHlfVHJ1ZTsKLQl9CisgICAgLyogV2UgaGF2ZSBhbiBpdGVtIHRoYXQgZGlmZmVycyAtLSBzaG9ydGN1dHMgZm9yIEVRL05FICovCisgICAgaWYgKG9wID09IFB5X0VRKSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9GYWxzZSk7CisgICAgICAgIHJldHVybiBQeV9GYWxzZTsKKyAgICB9CisgICAgaWYgKG9wID09IFB5X05FKSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9UcnVlKTsKKyAgICAgICAgcmV0dXJuIFB5X1RydWU7CisgICAgfQogCi0JLyogQ29tcGFyZSB0aGUgZmluYWwgaXRlbSBhZ2FpbiB1c2luZyB0aGUgcHJvcGVyIG9wZXJhdG9yICovCi0JcmV0dXJuIFB5T2JqZWN0X1JpY2hDb21wYXJlKHZsLT5vYl9pdGVtW2ldLCB3bC0+b2JfaXRlbVtpXSwgb3ApOworICAgIC8qIENvbXBhcmUgdGhlIGZpbmFsIGl0ZW0gYWdhaW4gdXNpbmcgdGhlIHByb3BlciBvcGVyYXRvciAqLworICAgIHJldHVybiBQeU9iamVjdF9SaWNoQ29tcGFyZSh2bC0+b2JfaXRlbVtpXSwgd2wtPm9iX2l0ZW1baV0sIG9wKTsKIH0KIAogc3RhdGljIGludAogbGlzdF9pbml0KFB5TGlzdE9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprdykKIHsKLQlQeU9iamVjdCAqYXJnID0gTlVMTDsKLQlzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7InNlcXVlbmNlIiwgMH07CisgICAgUHlPYmplY3QgKmFyZyA9IE5VTEw7CisgICAgc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJzZXF1ZW5jZSIsIDB9OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3csICJ8TzpsaXN0Iiwga3dsaXN0LCAmYXJnKSkKLQkJcmV0dXJuIC0xOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3LCAifE86bGlzdCIsIGt3bGlzdCwgJmFyZykpCisgICAgICAgIHJldHVybiAtMTsKIAotCS8qIFZlcmlmeSBsaXN0IGludmFyaWFudHMgZXN0YWJsaXNoZWQgYnkgUHlUeXBlX0dlbmVyaWNBbGxvYygpICovCi0JYXNzZXJ0KDAgPD0gUHlfU0laRShzZWxmKSk7Ci0JYXNzZXJ0KFB5X1NJWkUoc2VsZikgPD0gc2VsZi0+YWxsb2NhdGVkIHx8IHNlbGYtPmFsbG9jYXRlZCA9PSAtMSk7Ci0JYXNzZXJ0KHNlbGYtPm9iX2l0ZW0gIT0gTlVMTCB8fAotCSAgICAgICBzZWxmLT5hbGxvY2F0ZWQgPT0gMCB8fCBzZWxmLT5hbGxvY2F0ZWQgPT0gLTEpOworICAgIC8qIFZlcmlmeSBsaXN0IGludmFyaWFudHMgZXN0YWJsaXNoZWQgYnkgUHlUeXBlX0dlbmVyaWNBbGxvYygpICovCisgICAgYXNzZXJ0KDAgPD0gUHlfU0laRShzZWxmKSk7CisgICAgYXNzZXJ0KFB5X1NJWkUoc2VsZikgPD0gc2VsZi0+YWxsb2NhdGVkIHx8IHNlbGYtPmFsbG9jYXRlZCA9PSAtMSk7CisgICAgYXNzZXJ0KHNlbGYtPm9iX2l0ZW0gIT0gTlVMTCB8fAorICAgICAgICAgICBzZWxmLT5hbGxvY2F0ZWQgPT0gMCB8fCBzZWxmLT5hbGxvY2F0ZWQgPT0gLTEpOwogCi0JLyogRW1wdHkgcHJldmlvdXMgY29udGVudHMgKi8KLQlpZiAoc2VsZi0+b2JfaXRlbSAhPSBOVUxMKSB7Ci0JCSh2b2lkKWxpc3RfY2xlYXIoc2VsZik7Ci0JfQotCWlmIChhcmcgIT0gTlVMTCkgewotCQlQeU9iamVjdCAqcnYgPSBsaXN0ZXh0ZW5kKHNlbGYsIGFyZyk7Ci0JCWlmIChydiA9PSBOVUxMKQotCQkJcmV0dXJuIC0xOwotCQlQeV9ERUNSRUYocnYpOwotCX0KLQlyZXR1cm4gMDsKKyAgICAvKiBFbXB0eSBwcmV2aW91cyBjb250ZW50cyAqLworICAgIGlmIChzZWxmLT5vYl9pdGVtICE9IE5VTEwpIHsKKyAgICAgICAgKHZvaWQpbGlzdF9jbGVhcihzZWxmKTsKKyAgICB9CisgICAgaWYgKGFyZyAhPSBOVUxMKSB7CisgICAgICAgIFB5T2JqZWN0ICpydiA9IGxpc3RleHRlbmQoc2VsZiwgYXJnKTsKKyAgICAgICAgaWYgKHJ2ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIFB5X0RFQ1JFRihydik7CisgICAgfQorICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbGlzdF9zaXplb2YoUHlMaXN0T2JqZWN0ICpzZWxmKQogewotCVB5X3NzaXplX3QgcmVzOworICAgIFB5X3NzaXplX3QgcmVzOwogCi0JcmVzID0gc2l6ZW9mKFB5TGlzdE9iamVjdCkgKyBzZWxmLT5hbGxvY2F0ZWQgKiBzaXplb2Yodm9pZCopOwotCXJldHVybiBQeUludF9Gcm9tU3NpemVfdChyZXMpOworICAgIHJlcyA9IHNpemVvZihQeUxpc3RPYmplY3QpICsgc2VsZi0+YWxsb2NhdGVkICogc2l6ZW9mKHZvaWQqKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QocmVzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpsaXN0X2l0ZXIoUHlPYmplY3QgKnNlcSk7CkBAIC0yNDg3LDMyICsyNDg3LDMyIEBACiBzdGF0aWMgUHlPYmplY3QgKmxpc3Rfc3Vic2NyaXB0KFB5TGlzdE9iamVjdCosIFB5T2JqZWN0Kik7CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBsaXN0X21ldGhvZHNbXSA9IHsKLQl7Il9fZ2V0aXRlbV9fIiwgKFB5Q0Z1bmN0aW9uKWxpc3Rfc3Vic2NyaXB0LCBNRVRIX098TUVUSF9DT0VYSVNULCBnZXRpdGVtX2RvY30sCi0JeyJfX3JldmVyc2VkX18iLChQeUNGdW5jdGlvbilsaXN0X3JldmVyc2VkLCBNRVRIX05PQVJHUywgcmV2ZXJzZWRfZG9jfSwKLQl7Il9fc2l6ZW9mX18iLCAgKFB5Q0Z1bmN0aW9uKWxpc3Rfc2l6ZW9mLCBNRVRIX05PQVJHUywgc2l6ZW9mX2RvY30sCi0JeyJhcHBlbmQiLAkoUHlDRnVuY3Rpb24pbGlzdGFwcGVuZCwgIE1FVEhfTywgYXBwZW5kX2RvY30sCi0JeyJpbnNlcnQiLAkoUHlDRnVuY3Rpb24pbGlzdGluc2VydCwgIE1FVEhfVkFSQVJHUywgaW5zZXJ0X2RvY30sCi0JeyJleHRlbmQiLCAgICAgIChQeUNGdW5jdGlvbilsaXN0ZXh0ZW5kLCAgTUVUSF9PLCBleHRlbmRfZG9jfSwKLQl7InBvcCIsCQkoUHlDRnVuY3Rpb24pbGlzdHBvcCwgCSAgTUVUSF9WQVJBUkdTLCBwb3BfZG9jfSwKLQl7InJlbW92ZSIsCShQeUNGdW5jdGlvbilsaXN0cmVtb3ZlLCAgTUVUSF9PLCByZW1vdmVfZG9jfSwKLQl7ImluZGV4IiwJKFB5Q0Z1bmN0aW9uKWxpc3RpbmRleCwgICBNRVRIX1ZBUkFSR1MsIGluZGV4X2RvY30sCi0JeyJjb3VudCIsCShQeUNGdW5jdGlvbilsaXN0Y291bnQsICAgTUVUSF9PLCBjb3VudF9kb2N9LAotCXsicmV2ZXJzZSIsCShQeUNGdW5jdGlvbilsaXN0cmV2ZXJzZSwgTUVUSF9OT0FSR1MsIHJldmVyc2VfZG9jfSwKLQl7InNvcnQiLAkoUHlDRnVuY3Rpb24pbGlzdHNvcnQsIAkgIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsIHNvcnRfZG9jfSwKLSAJe05VTEwsCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7Il9fZ2V0aXRlbV9fIiwgKFB5Q0Z1bmN0aW9uKWxpc3Rfc3Vic2NyaXB0LCBNRVRIX098TUVUSF9DT0VYSVNULCBnZXRpdGVtX2RvY30sCisgICAgeyJfX3JldmVyc2VkX18iLChQeUNGdW5jdGlvbilsaXN0X3JldmVyc2VkLCBNRVRIX05PQVJHUywgcmV2ZXJzZWRfZG9jfSwKKyAgICB7Il9fc2l6ZW9mX18iLCAgKFB5Q0Z1bmN0aW9uKWxpc3Rfc2l6ZW9mLCBNRVRIX05PQVJHUywgc2l6ZW9mX2RvY30sCisgICAgeyJhcHBlbmQiLCAgICAgICAgICAoUHlDRnVuY3Rpb24pbGlzdGFwcGVuZCwgIE1FVEhfTywgYXBwZW5kX2RvY30sCisgICAgeyJpbnNlcnQiLCAgICAgICAgICAoUHlDRnVuY3Rpb24pbGlzdGluc2VydCwgIE1FVEhfVkFSQVJHUywgaW5zZXJ0X2RvY30sCisgICAgeyJleHRlbmQiLCAgICAgIChQeUNGdW5jdGlvbilsaXN0ZXh0ZW5kLCAgTUVUSF9PLCBleHRlbmRfZG9jfSwKKyAgICB7InBvcCIsICAgICAgICAgICAgIChQeUNGdW5jdGlvbilsaXN0cG9wLCAgICAgTUVUSF9WQVJBUkdTLCBwb3BfZG9jfSwKKyAgICB7InJlbW92ZSIsICAgICAgICAgIChQeUNGdW5jdGlvbilsaXN0cmVtb3ZlLCAgTUVUSF9PLCByZW1vdmVfZG9jfSwKKyAgICB7ImluZGV4IiwgICAgICAgICAgIChQeUNGdW5jdGlvbilsaXN0aW5kZXgsICAgTUVUSF9WQVJBUkdTLCBpbmRleF9kb2N9LAorICAgIHsiY291bnQiLCAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWxpc3Rjb3VudCwgICBNRVRIX08sIGNvdW50X2RvY30sCisgICAgeyJyZXZlcnNlIiwgICAgICAgICAoUHlDRnVuY3Rpb24pbGlzdHJldmVyc2UsIE1FVEhfTk9BUkdTLCByZXZlcnNlX2RvY30sCisgICAgeyJzb3J0IiwgICAgICAgICAgICAoUHlDRnVuY3Rpb24pbGlzdHNvcnQsICAgIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsIHNvcnRfZG9jfSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogc3RhdGljIFB5U2VxdWVuY2VNZXRob2RzIGxpc3RfYXNfc2VxdWVuY2UgPSB7Ci0JKGxlbmZ1bmMpbGlzdF9sZW5ndGgsCQkJLyogc3FfbGVuZ3RoICovCi0JKGJpbmFyeWZ1bmMpbGlzdF9jb25jYXQsCQkvKiBzcV9jb25jYXQgKi8KLQkoc3NpemVhcmdmdW5jKWxpc3RfcmVwZWF0LAkJLyogc3FfcmVwZWF0ICovCi0JKHNzaXplYXJnZnVuYylsaXN0X2l0ZW0sCQkvKiBzcV9pdGVtICovCi0JKHNzaXplc3NpemVhcmdmdW5jKWxpc3Rfc2xpY2UsCQkvKiBzcV9zbGljZSAqLwotCShzc2l6ZW9iamFyZ3Byb2MpbGlzdF9hc3NfaXRlbSwJCS8qIHNxX2Fzc19pdGVtICovCi0JKHNzaXplc3NpemVvYmphcmdwcm9jKWxpc3RfYXNzX3NsaWNlLAkvKiBzcV9hc3Nfc2xpY2UgKi8KLQkob2Jqb2JqcHJvYylsaXN0X2NvbnRhaW5zLAkJLyogc3FfY29udGFpbnMgKi8KLQkoYmluYXJ5ZnVuYylsaXN0X2lucGxhY2VfY29uY2F0LAkvKiBzcV9pbnBsYWNlX2NvbmNhdCAqLwotCShzc2l6ZWFyZ2Z1bmMpbGlzdF9pbnBsYWNlX3JlcGVhdCwJLyogc3FfaW5wbGFjZV9yZXBlYXQgKi8KKyAgICAobGVuZnVuYylsaXN0X2xlbmd0aCwgICAgICAgICAgICAgICAgICAgICAgIC8qIHNxX2xlbmd0aCAqLworICAgIChiaW5hcnlmdW5jKWxpc3RfY29uY2F0LCAgICAgICAgICAgICAgICAgICAgLyogc3FfY29uY2F0ICovCisgICAgKHNzaXplYXJnZnVuYylsaXN0X3JlcGVhdCwgICAgICAgICAgICAgICAgICAvKiBzcV9yZXBlYXQgKi8KKyAgICAoc3NpemVhcmdmdW5jKWxpc3RfaXRlbSwgICAgICAgICAgICAgICAgICAgIC8qIHNxX2l0ZW0gKi8KKyAgICAoc3NpemVzc2l6ZWFyZ2Z1bmMpbGlzdF9zbGljZSwgICAgICAgICAgICAgIC8qIHNxX3NsaWNlICovCisgICAgKHNzaXplb2JqYXJncHJvYylsaXN0X2Fzc19pdGVtLCAgICAgICAgICAgICAvKiBzcV9hc3NfaXRlbSAqLworICAgIChzc2l6ZXNzaXplb2JqYXJncHJvYylsaXN0X2Fzc19zbGljZSwgICAgICAgLyogc3FfYXNzX3NsaWNlICovCisgICAgKG9iam9ianByb2MpbGlzdF9jb250YWlucywgICAgICAgICAgICAgICAgICAvKiBzcV9jb250YWlucyAqLworICAgIChiaW5hcnlmdW5jKWxpc3RfaW5wbGFjZV9jb25jYXQsICAgICAgICAgICAgLyogc3FfaW5wbGFjZV9jb25jYXQgKi8KKyAgICAoc3NpemVhcmdmdW5jKWxpc3RfaW5wbGFjZV9yZXBlYXQsICAgICAgICAgIC8qIHNxX2lucGxhY2VfcmVwZWF0ICovCiB9OwogCiBQeURvY19TVFJWQVIobGlzdF9kb2MsCkBAIC0yNTIzLDI3NSArMjUyMywyNzUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBsaXN0X3N1YnNjcmlwdChQeUxpc3RPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBpdGVtKQogewotCWlmIChQeUluZGV4X0NoZWNrKGl0ZW0pKSB7Ci0JCVB5X3NzaXplX3QgaTsKLQkJaSA9IFB5TnVtYmVyX0FzU3NpemVfdChpdGVtLCBQeUV4Y19JbmRleEVycm9yKTsKLQkJaWYgKGkgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJCXJldHVybiBOVUxMOwotCQlpZiAoaSA8IDApCi0JCQlpICs9IFB5TGlzdF9HRVRfU0laRShzZWxmKTsKLQkJcmV0dXJuIGxpc3RfaXRlbShzZWxmLCBpKTsKLQl9Ci0JZWxzZSBpZiAoUHlTbGljZV9DaGVjayhpdGVtKSkgewotCQlQeV9zc2l6ZV90IHN0YXJ0LCBzdG9wLCBzdGVwLCBzbGljZWxlbmd0aCwgY3VyLCBpOwotCQlQeU9iamVjdCogcmVzdWx0OwotCQlQeU9iamVjdCogaXQ7Ci0JCVB5T2JqZWN0ICoqc3JjLCAqKmRlc3Q7CisgICAgaWYgKFB5SW5kZXhfQ2hlY2soaXRlbSkpIHsKKyAgICAgICAgUHlfc3NpemVfdCBpOworICAgICAgICBpID0gUHlOdW1iZXJfQXNTc2l6ZV90KGl0ZW0sIFB5RXhjX0luZGV4RXJyb3IpOworICAgICAgICBpZiAoaSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGlmIChpIDwgMCkKKyAgICAgICAgICAgIGkgKz0gUHlMaXN0X0dFVF9TSVpFKHNlbGYpOworICAgICAgICByZXR1cm4gbGlzdF9pdGVtKHNlbGYsIGkpOworICAgIH0KKyAgICBlbHNlIGlmIChQeVNsaWNlX0NoZWNrKGl0ZW0pKSB7CisgICAgICAgIFB5X3NzaXplX3Qgc3RhcnQsIHN0b3AsIHN0ZXAsIHNsaWNlbGVuZ3RoLCBjdXIsIGk7CisgICAgICAgIFB5T2JqZWN0KiByZXN1bHQ7CisgICAgICAgIFB5T2JqZWN0KiBpdDsKKyAgICAgICAgUHlPYmplY3QgKipzcmMsICoqZGVzdDsKIAotCQlpZiAoUHlTbGljZV9HZXRJbmRpY2VzRXgoKFB5U2xpY2VPYmplY3QqKWl0ZW0sIFB5X1NJWkUoc2VsZiksCi0JCQkJICZzdGFydCwgJnN0b3AsICZzdGVwLCAmc2xpY2VsZW5ndGgpIDwgMCkgewotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KKyAgICAgICAgaWYgKFB5U2xpY2VfR2V0SW5kaWNlc0V4KChQeVNsaWNlT2JqZWN0KilpdGVtLCBQeV9TSVpFKHNlbGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICZzdGFydCwgJnN0b3AsICZzdGVwLCAmc2xpY2VsZW5ndGgpIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KIAotCQlpZiAoc2xpY2VsZW5ndGggPD0gMCkgewotCQkJcmV0dXJuIFB5TGlzdF9OZXcoMCk7Ci0JCX0KLQkJZWxzZSBpZiAoc3RlcCA9PSAxKSB7Ci0JCQlyZXR1cm4gbGlzdF9zbGljZShzZWxmLCBzdGFydCwgc3RvcCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXN1bHQgPSBQeUxpc3RfTmV3KHNsaWNlbGVuZ3RoKTsKLQkJCWlmICghcmVzdWx0KSByZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKHNsaWNlbGVuZ3RoIDw9IDApIHsKKyAgICAgICAgICAgIHJldHVybiBQeUxpc3RfTmV3KDApOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHN0ZXAgPT0gMSkgeworICAgICAgICAgICAgcmV0dXJuIGxpc3Rfc2xpY2Uoc2VsZiwgc3RhcnQsIHN0b3ApOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcmVzdWx0ID0gUHlMaXN0X05ldyhzbGljZWxlbmd0aCk7CisgICAgICAgICAgICBpZiAoIXJlc3VsdCkgcmV0dXJuIE5VTEw7CiAKLQkJCXNyYyA9IHNlbGYtPm9iX2l0ZW07Ci0JCQlkZXN0ID0gKChQeUxpc3RPYmplY3QgKilyZXN1bHQpLT5vYl9pdGVtOwotCQkJZm9yIChjdXIgPSBzdGFydCwgaSA9IDA7IGkgPCBzbGljZWxlbmd0aDsKLQkJCSAgICAgY3VyICs9IHN0ZXAsIGkrKykgewotCQkJCWl0ID0gc3JjW2N1cl07Ci0JCQkJUHlfSU5DUkVGKGl0KTsKLQkJCQlkZXN0W2ldID0gaXQ7Ci0JCQl9CisgICAgICAgICAgICBzcmMgPSBzZWxmLT5vYl9pdGVtOworICAgICAgICAgICAgZGVzdCA9ICgoUHlMaXN0T2JqZWN0ICopcmVzdWx0KS0+b2JfaXRlbTsKKyAgICAgICAgICAgIGZvciAoY3VyID0gc3RhcnQsIGkgPSAwOyBpIDwgc2xpY2VsZW5ndGg7CisgICAgICAgICAgICAgICAgIGN1ciArPSBzdGVwLCBpKyspIHsKKyAgICAgICAgICAgICAgICBpdCA9IHNyY1tjdXJdOworICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihpdCk7CisgICAgICAgICAgICAgICAgZGVzdFtpXSA9IGl0OworICAgICAgICAgICAgfQogCi0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JfQotCWVsc2UgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJICAgICAibGlzdCBpbmRpY2VzIG11c3QgYmUgaW50ZWdlcnMsIG5vdCAlLjIwMHMiLAotCQkJICAgICBpdGVtLT5vYl90eXBlLT50cF9uYW1lKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJsaXN0IGluZGljZXMgbXVzdCBiZSBpbnRlZ2Vycywgbm90ICUuMjAwcyIsCisgICAgICAgICAgICAgICAgICAgICBpdGVtLT5vYl90eXBlLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogfQogCiBzdGF0aWMgaW50CiBsaXN0X2Fzc19zdWJzY3JpcHQoUHlMaXN0T2JqZWN0KiBzZWxmLCBQeU9iamVjdCogaXRlbSwgUHlPYmplY3QqIHZhbHVlKQogewotCWlmIChQeUluZGV4X0NoZWNrKGl0ZW0pKSB7Ci0JCVB5X3NzaXplX3QgaSA9IFB5TnVtYmVyX0FzU3NpemVfdChpdGVtLCBQeUV4Y19JbmRleEVycm9yKTsKLQkJaWYgKGkgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJCXJldHVybiAtMTsKLQkJaWYgKGkgPCAwKQotCQkJaSArPSBQeUxpc3RfR0VUX1NJWkUoc2VsZik7Ci0JCXJldHVybiBsaXN0X2Fzc19pdGVtKHNlbGYsIGksIHZhbHVlKTsKLQl9Ci0JZWxzZSBpZiAoUHlTbGljZV9DaGVjayhpdGVtKSkgewotCQlQeV9zc2l6ZV90IHN0YXJ0LCBzdG9wLCBzdGVwLCBzbGljZWxlbmd0aDsKKyAgICBpZiAoUHlJbmRleF9DaGVjayhpdGVtKSkgeworICAgICAgICBQeV9zc2l6ZV90IGkgPSBQeU51bWJlcl9Bc1NzaXplX3QoaXRlbSwgUHlFeGNfSW5kZXhFcnJvcik7CisgICAgICAgIGlmIChpID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmIChpIDwgMCkKKyAgICAgICAgICAgIGkgKz0gUHlMaXN0X0dFVF9TSVpFKHNlbGYpOworICAgICAgICByZXR1cm4gbGlzdF9hc3NfaXRlbShzZWxmLCBpLCB2YWx1ZSk7CisgICAgfQorICAgIGVsc2UgaWYgKFB5U2xpY2VfQ2hlY2soaXRlbSkpIHsKKyAgICAgICAgUHlfc3NpemVfdCBzdGFydCwgc3RvcCwgc3RlcCwgc2xpY2VsZW5ndGg7CiAKLQkJaWYgKFB5U2xpY2VfR2V0SW5kaWNlc0V4KChQeVNsaWNlT2JqZWN0KilpdGVtLCBQeV9TSVpFKHNlbGYpLAotCQkJCSAmc3RhcnQsICZzdG9wLCAmc3RlcCwgJnNsaWNlbGVuZ3RoKSA8IDApIHsKLQkJCXJldHVybiAtMTsKLQkJfQorICAgICAgICBpZiAoUHlTbGljZV9HZXRJbmRpY2VzRXgoKFB5U2xpY2VPYmplY3QqKWl0ZW0sIFB5X1NJWkUoc2VsZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0LCAmc3RvcCwgJnN0ZXAsICZzbGljZWxlbmd0aCkgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KIAotCQlpZiAoc3RlcCA9PSAxKQotCQkJcmV0dXJuIGxpc3RfYXNzX3NsaWNlKHNlbGYsIHN0YXJ0LCBzdG9wLCB2YWx1ZSk7CisgICAgICAgIGlmIChzdGVwID09IDEpCisgICAgICAgICAgICByZXR1cm4gbGlzdF9hc3Nfc2xpY2Uoc2VsZiwgc3RhcnQsIHN0b3AsIHZhbHVlKTsKIAotCQkvKiBNYWtlIHN1cmUgc1s1OjJdID0gWy4uXSBpbnNlcnRzIGF0IHRoZSByaWdodCBwbGFjZToKLQkJICAgYmVmb3JlIDUsIG5vdCBiZWZvcmUgMi4gKi8KLQkJaWYgKChzdGVwIDwgMCAmJiBzdGFydCA8IHN0b3ApIHx8Ci0JCSAgICAoc3RlcCA+IDAgJiYgc3RhcnQgPiBzdG9wKSkKLQkJCXN0b3AgPSBzdGFydDsKKyAgICAgICAgLyogTWFrZSBzdXJlIHNbNToyXSA9IFsuLl0gaW5zZXJ0cyBhdCB0aGUgcmlnaHQgcGxhY2U6CisgICAgICAgICAgIGJlZm9yZSA1LCBub3QgYmVmb3JlIDIuICovCisgICAgICAgIGlmICgoc3RlcCA8IDAgJiYgc3RhcnQgPCBzdG9wKSB8fAorICAgICAgICAgICAgKHN0ZXAgPiAwICYmIHN0YXJ0ID4gc3RvcCkpCisgICAgICAgICAgICBzdG9wID0gc3RhcnQ7CiAKLQkJaWYgKHZhbHVlID09IE5VTEwpIHsKLQkJCS8qIGRlbGV0ZSBzbGljZSAqLwotCQkJUHlPYmplY3QgKipnYXJiYWdlOwotCQkJc2l6ZV90IGN1cjsKLQkJCVB5X3NzaXplX3QgaTsKKyAgICAgICAgaWYgKHZhbHVlID09IE5VTEwpIHsKKyAgICAgICAgICAgIC8qIGRlbGV0ZSBzbGljZSAqLworICAgICAgICAgICAgUHlPYmplY3QgKipnYXJiYWdlOworICAgICAgICAgICAgc2l6ZV90IGN1cjsKKyAgICAgICAgICAgIFB5X3NzaXplX3QgaTsKIAotCQkJaWYgKHNsaWNlbGVuZ3RoIDw9IDApCi0JCQkJcmV0dXJuIDA7CisgICAgICAgICAgICBpZiAoc2xpY2VsZW5ndGggPD0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKIAotCQkJaWYgKHN0ZXAgPCAwKSB7Ci0JCQkJc3RvcCA9IHN0YXJ0ICsgMTsKLQkJCQlzdGFydCA9IHN0b3AgKyBzdGVwKihzbGljZWxlbmd0aCAtIDEpIC0gMTsKLQkJCQlzdGVwID0gLXN0ZXA7Ci0JCQl9CisgICAgICAgICAgICBpZiAoc3RlcCA8IDApIHsKKyAgICAgICAgICAgICAgICBzdG9wID0gc3RhcnQgKyAxOworICAgICAgICAgICAgICAgIHN0YXJ0ID0gc3RvcCArIHN0ZXAqKHNsaWNlbGVuZ3RoIC0gMSkgLSAxOworICAgICAgICAgICAgICAgIHN0ZXAgPSAtc3RlcDsKKyAgICAgICAgICAgIH0KIAotCQkJYXNzZXJ0KChzaXplX3Qpc2xpY2VsZW5ndGggPD0KLQkJCSAgICAgICBQWV9TSVpFX01BWCAvIHNpemVvZihQeU9iamVjdCopKTsKKyAgICAgICAgICAgIGFzc2VydCgoc2l6ZV90KXNsaWNlbGVuZ3RoIDw9CisgICAgICAgICAgICAgICAgICAgUFlfU0laRV9NQVggLyBzaXplb2YoUHlPYmplY3QqKSk7CiAKLQkJCWdhcmJhZ2UgPSAoUHlPYmplY3QqKikKLQkJCQlQeU1lbV9NQUxMT0Moc2xpY2VsZW5ndGgqc2l6ZW9mKFB5T2JqZWN0KikpOwotCQkJaWYgKCFnYXJiYWdlKSB7Ci0JCQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9CisgICAgICAgICAgICBnYXJiYWdlID0gKFB5T2JqZWN0KiopCisgICAgICAgICAgICAgICAgUHlNZW1fTUFMTE9DKHNsaWNlbGVuZ3RoKnNpemVvZihQeU9iamVjdCopKTsKKyAgICAgICAgICAgIGlmICghZ2FyYmFnZSkgeworICAgICAgICAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQogCi0JCQkvKiBkcmF3aW5nIHBpY3R1cmVzIG1pZ2h0IGhlbHAgdW5kZXJzdGFuZCB0aGVzZSBmb3IKLQkJCSAgIGxvb3BzLiBCYXNpY2FsbHksIHdlIG1lbW1vdmUgdGhlIHBhcnRzIG9mIHRoZQotCQkJICAgbGlzdCB0aGF0IGFyZSAqbm90KiBwYXJ0IG9mIHRoZSBzbGljZTogc3RlcC0xCi0JCQkgICBpdGVtcyBmb3IgZWFjaCBpdGVtIHRoYXQgaXMgcGFydCBvZiB0aGUgc2xpY2UsCi0JCQkgICBhbmQgdGhlbiB0YWlsIGVuZCBvZiB0aGUgbGlzdCB0aGF0IHdhcyBub3QKLQkJCSAgIGNvdmVyZWQgYnkgdGhlIHNsaWNlICovCi0JCQlmb3IgKGN1ciA9IHN0YXJ0LCBpID0gMDsKLQkJCSAgICAgY3VyIDwgKHNpemVfdClzdG9wOwotCQkJICAgICBjdXIgKz0gc3RlcCwgaSsrKSB7Ci0JCQkJUHlfc3NpemVfdCBsaW0gPSBzdGVwIC0gMTsKKyAgICAgICAgICAgIC8qIGRyYXdpbmcgcGljdHVyZXMgbWlnaHQgaGVscCB1bmRlcnN0YW5kIHRoZXNlIGZvcgorICAgICAgICAgICAgICAgbG9vcHMuIEJhc2ljYWxseSwgd2UgbWVtbW92ZSB0aGUgcGFydHMgb2YgdGhlCisgICAgICAgICAgICAgICBsaXN0IHRoYXQgYXJlICpub3QqIHBhcnQgb2YgdGhlIHNsaWNlOiBzdGVwLTEKKyAgICAgICAgICAgICAgIGl0ZW1zIGZvciBlYWNoIGl0ZW0gdGhhdCBpcyBwYXJ0IG9mIHRoZSBzbGljZSwKKyAgICAgICAgICAgICAgIGFuZCB0aGVuIHRhaWwgZW5kIG9mIHRoZSBsaXN0IHRoYXQgd2FzIG5vdAorICAgICAgICAgICAgICAgY292ZXJlZCBieSB0aGUgc2xpY2UgKi8KKyAgICAgICAgICAgIGZvciAoY3VyID0gc3RhcnQsIGkgPSAwOworICAgICAgICAgICAgICAgICBjdXIgPCAoc2l6ZV90KXN0b3A7CisgICAgICAgICAgICAgICAgIGN1ciArPSBzdGVwLCBpKyspIHsKKyAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IGxpbSA9IHN0ZXAgLSAxOwogCi0JCQkJZ2FyYmFnZVtpXSA9IFB5TGlzdF9HRVRfSVRFTShzZWxmLCBjdXIpOworICAgICAgICAgICAgICAgIGdhcmJhZ2VbaV0gPSBQeUxpc3RfR0VUX0lURU0oc2VsZiwgY3VyKTsKIAotCQkJCWlmIChjdXIgKyBzdGVwID49IChzaXplX3QpUHlfU0laRShzZWxmKSkgewotCQkJCQlsaW0gPSBQeV9TSVpFKHNlbGYpIC0gY3VyIC0gMTsKLQkJCQl9CisgICAgICAgICAgICAgICAgaWYgKGN1ciArIHN0ZXAgPj0gKHNpemVfdClQeV9TSVpFKHNlbGYpKSB7CisgICAgICAgICAgICAgICAgICAgIGxpbSA9IFB5X1NJWkUoc2VsZikgLSBjdXIgLSAxOworICAgICAgICAgICAgICAgIH0KIAotCQkJCW1lbW1vdmUoc2VsZi0+b2JfaXRlbSArIGN1ciAtIGksCi0JCQkJCXNlbGYtPm9iX2l0ZW0gKyBjdXIgKyAxLAotCQkJCQlsaW0gKiBzaXplb2YoUHlPYmplY3QgKikpOwotCQkJfQotCQkJY3VyID0gc3RhcnQgKyBzbGljZWxlbmd0aCpzdGVwOwotCQkJaWYgKGN1ciA8IChzaXplX3QpUHlfU0laRShzZWxmKSkgewotCQkJCW1lbW1vdmUoc2VsZi0+b2JfaXRlbSArIGN1ciAtIHNsaWNlbGVuZ3RoLAotCQkJCQlzZWxmLT5vYl9pdGVtICsgY3VyLAotCQkJCQkoUHlfU0laRShzZWxmKSAtIGN1cikgKiAKLQkJCQkJIHNpemVvZihQeU9iamVjdCAqKSk7Ci0JCQl9CisgICAgICAgICAgICAgICAgbWVtbW92ZShzZWxmLT5vYl9pdGVtICsgY3VyIC0gaSwKKyAgICAgICAgICAgICAgICAgICAgc2VsZi0+b2JfaXRlbSArIGN1ciArIDEsCisgICAgICAgICAgICAgICAgICAgIGxpbSAqIHNpemVvZihQeU9iamVjdCAqKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjdXIgPSBzdGFydCArIHNsaWNlbGVuZ3RoKnN0ZXA7CisgICAgICAgICAgICBpZiAoY3VyIDwgKHNpemVfdClQeV9TSVpFKHNlbGYpKSB7CisgICAgICAgICAgICAgICAgbWVtbW92ZShzZWxmLT5vYl9pdGVtICsgY3VyIC0gc2xpY2VsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgIHNlbGYtPm9iX2l0ZW0gKyBjdXIsCisgICAgICAgICAgICAgICAgICAgIChQeV9TSVpFKHNlbGYpIC0gY3VyKSAqCisgICAgICAgICAgICAgICAgICAgICBzaXplb2YoUHlPYmplY3QgKikpOworICAgICAgICAgICAgfQogCi0JCQlQeV9TSVpFKHNlbGYpIC09IHNsaWNlbGVuZ3RoOwotCQkJbGlzdF9yZXNpemUoc2VsZiwgUHlfU0laRShzZWxmKSk7CisgICAgICAgICAgICBQeV9TSVpFKHNlbGYpIC09IHNsaWNlbGVuZ3RoOworICAgICAgICAgICAgbGlzdF9yZXNpemUoc2VsZiwgUHlfU0laRShzZWxmKSk7CiAKLQkJCWZvciAoaSA9IDA7IGkgPCBzbGljZWxlbmd0aDsgaSsrKSB7Ci0JCQkJUHlfREVDUkVGKGdhcmJhZ2VbaV0pOwotCQkJfQotCQkJUHlNZW1fRlJFRShnYXJiYWdlKTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzbGljZWxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGdhcmJhZ2VbaV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlNZW1fRlJFRShnYXJiYWdlKTsKIAotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvKiBhc3NpZ24gc2xpY2UgKi8KLQkJCVB5T2JqZWN0ICppbnMsICpzZXE7Ci0JCQlQeU9iamVjdCAqKmdhcmJhZ2UsICoqc2VxaXRlbXMsICoqc2VsZml0ZW1zOwotCQkJUHlfc3NpemVfdCBjdXIsIGk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8qIGFzc2lnbiBzbGljZSAqLworICAgICAgICAgICAgUHlPYmplY3QgKmlucywgKnNlcTsKKyAgICAgICAgICAgIFB5T2JqZWN0ICoqZ2FyYmFnZSwgKipzZXFpdGVtcywgKipzZWxmaXRlbXM7CisgICAgICAgICAgICBQeV9zc2l6ZV90IGN1ciwgaTsKIAotCQkJLyogcHJvdGVjdCBhZ2FpbnN0IGFbOjotMV0gPSBhICovCi0JCQlpZiAoc2VsZiA9PSAoUHlMaXN0T2JqZWN0Kil2YWx1ZSkgewotCQkJCXNlcSA9IGxpc3Rfc2xpY2UoKFB5TGlzdE9iamVjdCopdmFsdWUsIDAsCi0JCQkJCQkgICBQeUxpc3RfR0VUX1NJWkUodmFsdWUpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXNlcSA9IFB5U2VxdWVuY2VfRmFzdCh2YWx1ZSwKLQkJCQkJCSAgICAgICJtdXN0IGFzc2lnbiBpdGVyYWJsZSAiCi0JCQkJCQkgICAgICAidG8gZXh0ZW5kZWQgc2xpY2UiKTsKLQkJCX0KLQkJCWlmICghc2VxKQotCQkJCXJldHVybiAtMTsKKyAgICAgICAgICAgIC8qIHByb3RlY3QgYWdhaW5zdCBhWzo6LTFdID0gYSAqLworICAgICAgICAgICAgaWYgKHNlbGYgPT0gKFB5TGlzdE9iamVjdCopdmFsdWUpIHsKKyAgICAgICAgICAgICAgICBzZXEgPSBsaXN0X3NsaWNlKChQeUxpc3RPYmplY3QqKXZhbHVlLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUxpc3RfR0VUX1NJWkUodmFsdWUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHNlcSA9IFB5U2VxdWVuY2VfRmFzdCh2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm11c3QgYXNzaWduIGl0ZXJhYmxlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRvIGV4dGVuZGVkIHNsaWNlIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIXNlcSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAKLQkJCWlmIChQeVNlcXVlbmNlX0Zhc3RfR0VUX1NJWkUoc2VxKSAhPSBzbGljZWxlbmd0aCkgewotCQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAotCQkJCQkiYXR0ZW1wdCB0byBhc3NpZ24gc2VxdWVuY2Ugb2YgIgotCQkJCQkic2l6ZSAlemQgdG8gZXh0ZW5kZWQgc2xpY2Ugb2YgIgotCQkJCQkic2l6ZSAlemQiLAotCQkJCQkgICAgIFB5U2VxdWVuY2VfRmFzdF9HRVRfU0laRShzZXEpLAotCQkJCQkgICAgIHNsaWNlbGVuZ3RoKTsKLQkJCQlQeV9ERUNSRUYoc2VxKTsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9CisgICAgICAgICAgICBpZiAoUHlTZXF1ZW5jZV9GYXN0X0dFVF9TSVpFKHNlcSkgIT0gc2xpY2VsZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgImF0dGVtcHQgdG8gYXNzaWduIHNlcXVlbmNlIG9mICIKKyAgICAgICAgICAgICAgICAgICAgInNpemUgJXpkIHRvIGV4dGVuZGVkIHNsaWNlIG9mICIKKyAgICAgICAgICAgICAgICAgICAgInNpemUgJXpkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeVNlcXVlbmNlX0Zhc3RfR0VUX1NJWkUoc2VxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzbGljZWxlbmd0aCk7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHNlcSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQogCi0JCQlpZiAoIXNsaWNlbGVuZ3RoKSB7Ci0JCQkJUHlfREVDUkVGKHNlcSk7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9CisgICAgICAgICAgICBpZiAoIXNsaWNlbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHNlcSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CiAKLQkJCWdhcmJhZ2UgPSAoUHlPYmplY3QqKikKLQkJCQlQeU1lbV9NQUxMT0Moc2xpY2VsZW5ndGgqc2l6ZW9mKFB5T2JqZWN0KikpOwotCQkJaWYgKCFnYXJiYWdlKSB7Ci0JCQkJUHlfREVDUkVGKHNlcSk7Ci0JCQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9CisgICAgICAgICAgICBnYXJiYWdlID0gKFB5T2JqZWN0KiopCisgICAgICAgICAgICAgICAgUHlNZW1fTUFMTE9DKHNsaWNlbGVuZ3RoKnNpemVvZihQeU9iamVjdCopKTsKKyAgICAgICAgICAgIGlmICghZ2FyYmFnZSkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihzZXEpOworICAgICAgICAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQogCi0JCQlzZWxmaXRlbXMgPSBzZWxmLT5vYl9pdGVtOwotCQkJc2VxaXRlbXMgPSBQeVNlcXVlbmNlX0Zhc3RfSVRFTVMoc2VxKTsKLQkJCWZvciAoY3VyID0gc3RhcnQsIGkgPSAwOyBpIDwgc2xpY2VsZW5ndGg7Ci0JCQkgICAgIGN1ciArPSBzdGVwLCBpKyspIHsKLQkJCQlnYXJiYWdlW2ldID0gc2VsZml0ZW1zW2N1cl07Ci0JCQkJaW5zID0gc2VxaXRlbXNbaV07Ci0JCQkJUHlfSU5DUkVGKGlucyk7Ci0JCQkJc2VsZml0ZW1zW2N1cl0gPSBpbnM7Ci0JCQl9CisgICAgICAgICAgICBzZWxmaXRlbXMgPSBzZWxmLT5vYl9pdGVtOworICAgICAgICAgICAgc2VxaXRlbXMgPSBQeVNlcXVlbmNlX0Zhc3RfSVRFTVMoc2VxKTsKKyAgICAgICAgICAgIGZvciAoY3VyID0gc3RhcnQsIGkgPSAwOyBpIDwgc2xpY2VsZW5ndGg7CisgICAgICAgICAgICAgICAgIGN1ciArPSBzdGVwLCBpKyspIHsKKyAgICAgICAgICAgICAgICBnYXJiYWdlW2ldID0gc2VsZml0ZW1zW2N1cl07CisgICAgICAgICAgICAgICAgaW5zID0gc2VxaXRlbXNbaV07CisgICAgICAgICAgICAgICAgUHlfSU5DUkVGKGlucyk7CisgICAgICAgICAgICAgICAgc2VsZml0ZW1zW2N1cl0gPSBpbnM7CisgICAgICAgICAgICB9CiAKLQkJCWZvciAoaSA9IDA7IGkgPCBzbGljZWxlbmd0aDsgaSsrKSB7Ci0JCQkJUHlfREVDUkVGKGdhcmJhZ2VbaV0pOwotCQkJfQorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNsaWNlbGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoZ2FyYmFnZVtpXSk7CisgICAgICAgICAgICB9CiAKLQkJCVB5TWVtX0ZSRUUoZ2FyYmFnZSk7Ci0JCQlQeV9ERUNSRUYoc2VxKTsKKyAgICAgICAgICAgIFB5TWVtX0ZSRUUoZ2FyYmFnZSk7CisgICAgICAgICAgICBQeV9ERUNSRUYoc2VxKTsKIAotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0JZWxzZSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgICJsaXN0IGluZGljZXMgbXVzdCBiZSBpbnRlZ2Vycywgbm90ICUuMjAwcyIsCi0JCQkgICAgIGl0ZW0tPm9iX3R5cGUtPnRwX25hbWUpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAibGlzdCBpbmRpY2VzIG11c3QgYmUgaW50ZWdlcnMsIG5vdCAlLjIwMHMiLAorICAgICAgICAgICAgICAgICAgICAgaXRlbS0+b2JfdHlwZS0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiB9CiAKIHN0YXRpYyBQeU1hcHBpbmdNZXRob2RzIGxpc3RfYXNfbWFwcGluZyA9IHsKLQkobGVuZnVuYylsaXN0X2xlbmd0aCwKLQkoYmluYXJ5ZnVuYylsaXN0X3N1YnNjcmlwdCwKLQkob2Jqb2JqYXJncHJvYylsaXN0X2Fzc19zdWJzY3JpcHQKKyAgICAobGVuZnVuYylsaXN0X2xlbmd0aCwKKyAgICAoYmluYXJ5ZnVuYylsaXN0X3N1YnNjcmlwdCwKKyAgICAob2Jqb2JqYXJncHJvYylsaXN0X2Fzc19zdWJzY3JpcHQKIH07CiAKIFB5VHlwZU9iamVjdCBQeUxpc3RfVHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQotCSJsaXN0IiwKLQlzaXplb2YoUHlMaXN0T2JqZWN0KSwKLQkwLAotCShkZXN0cnVjdG9yKWxpc3RfZGVhbGxvYywJCS8qIHRwX2RlYWxsb2MgKi8KLQkocHJpbnRmdW5jKWxpc3RfcHJpbnQsCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkocmVwcmZ1bmMpbGlzdF9yZXByLAkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JJmxpc3RfYXNfc2VxdWVuY2UsCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkmbGlzdF9hc19tYXBwaW5nLAkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpUHlPYmplY3RfSGFzaE5vdEltcGxlbWVudGVkLAkvKiB0cF9oYXNoICovCi0JMCwJCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCQkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MgfAotCQlQeV9UUEZMQUdTX0JBU0VUWVBFIHwgUHlfVFBGTEFHU19MSVNUX1NVQkNMQVNTLAkvKiB0cF9mbGFncyAqLwotIAlsaXN0X2RvYywJCQkJLyogdHBfZG9jICovCi0gCSh0cmF2ZXJzZXByb2MpbGlzdF90cmF2ZXJzZSwJCS8qIHRwX3RyYXZlcnNlICovCi0gCShpbnF1aXJ5KWxpc3RfY2xlYXIsCQkJLyogdHBfY2xlYXIgKi8KLQlsaXN0X3JpY2hjb21wYXJlLAkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JbGlzdF9pdGVyLAkJCQkvKiB0cF9pdGVyICovCi0JMCwJCQkJCS8qIHRwX2l0ZXJuZXh0ICovCi0JbGlzdF9tZXRob2RzLAkJCQkvKiB0cF9tZXRob2RzICovCi0JMCwJCQkJCS8qIHRwX21lbWJlcnMgKi8KLQkwLAkJCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQkoaW5pdHByb2MpbGlzdF9pbml0LAkJCS8qIHRwX2luaXQgKi8KLQlQeVR5cGVfR2VuZXJpY0FsbG9jLAkJCS8qIHRwX2FsbG9jICovCi0JUHlUeXBlX0dlbmVyaWNOZXcsCQkJLyogdHBfbmV3ICovCi0JUHlPYmplY3RfR0NfRGVsLAkJCS8qIHRwX2ZyZWUgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQorICAgICJsaXN0IiwKKyAgICBzaXplb2YoUHlMaXN0T2JqZWN0KSwKKyAgICAwLAorICAgIChkZXN0cnVjdG9yKWxpc3RfZGVhbGxvYywgICAgICAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIChwcmludGZ1bmMpbGlzdF9wcmludCwgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAocmVwcmZ1bmMpbGlzdF9yZXByLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgICZsaXN0X2FzX3NlcXVlbmNlLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAmbGlzdF9hc19tYXBwaW5nLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAoaGFzaGZ1bmMpUHlPYmplY3RfSGFzaE5vdEltcGxlbWVudGVkLCAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MgfAorICAgICAgICBQeV9UUEZMQUdTX0JBU0VUWVBFIHwgUHlfVFBGTEFHU19MSVNUX1NVQkNMQVNTLCAgICAgICAgIC8qIHRwX2ZsYWdzICovCisgICAgbGlzdF9kb2MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAodHJhdmVyc2Vwcm9jKWxpc3RfdHJhdmVyc2UsICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgKGlucXVpcnkpbGlzdF9jbGVhciwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIGxpc3RfcmljaGNvbXBhcmUsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgbGlzdF9pdGVyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIGxpc3RfbWV0aG9kcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIChpbml0cHJvYylsaXN0X2luaXQsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIFB5VHlwZV9HZW5lcmljQWxsb2MsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBQeVR5cGVfR2VuZXJpY05ldywgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworICAgIFB5T2JqZWN0X0dDX0RlbCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKiogTGlzdCBJdGVyYXRvciAqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewotCVB5T2JqZWN0X0hFQUQKLQlsb25nIGl0X2luZGV4OwotCVB5TGlzdE9iamVjdCAqaXRfc2VxOyAvKiBTZXQgdG8gTlVMTCB3aGVuIGl0ZXJhdG9yIGlzIGV4aGF1c3RlZCAqLworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBsb25nIGl0X2luZGV4OworICAgIFB5TGlzdE9iamVjdCAqaXRfc2VxOyAvKiBTZXQgdG8gTlVMTCB3aGVuIGl0ZXJhdG9yIGlzIGV4aGF1c3RlZCAqLwogfSBsaXN0aXRlcm9iamVjdDsKIAogc3RhdGljIFB5T2JqZWN0ICpsaXN0X2l0ZXIoUHlPYmplY3QgKik7CkBAIC0yODAzLDExOSArMjgwMywxMTkgQEAKIFB5RG9jX1NUUlZBUihsZW5ndGhfaGludF9kb2MsICJQcml2YXRlIG1ldGhvZCByZXR1cm5pbmcgYW4gZXN0aW1hdGUgb2YgbGVuKGxpc3QoaXQpKS4iKTsKIAogc3RhdGljIFB5TWV0aG9kRGVmIGxpc3RpdGVyX21ldGhvZHNbXSA9IHsKLQl7Il9fbGVuZ3RoX2hpbnRfXyIsIChQeUNGdW5jdGlvbilsaXN0aXRlcl9sZW4sIE1FVEhfTk9BUkdTLCBsZW5ndGhfaGludF9kb2N9LAotIAl7TlVMTCwJCU5VTEx9CQkvKiBzZW50aW5lbCAqLworICAgIHsiX19sZW5ndGhfaGludF9fIiwgKFB5Q0Z1bmN0aW9uKWxpc3RpdGVyX2xlbiwgTUVUSF9OT0FSR1MsIGxlbmd0aF9oaW50X2RvY30sCisgICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIFB5VHlwZU9iamVjdCBQeUxpc3RJdGVyX1R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKLQkibGlzdGl0ZXJhdG9yIiwJCQkJLyogdHBfbmFtZSAqLwotCXNpemVvZihsaXN0aXRlcm9iamVjdCksCQkJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJCS8qIHRwX2l0ZW1zaXplICovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKWxpc3RpdGVyX2RlYWxsb2MsCQkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9jb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDLC8qIHRwX2ZsYWdzICovCi0JMCwJCQkJCS8qIHRwX2RvYyAqLwotCSh0cmF2ZXJzZXByb2MpbGlzdGl0ZXJfdHJhdmVyc2UsCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JUHlPYmplY3RfU2VsZkl0ZXIsCQkJLyogdHBfaXRlciAqLwotCShpdGVybmV4dGZ1bmMpbGlzdGl0ZXJfbmV4dCwJCS8qIHRwX2l0ZXJuZXh0ICovCi0JbGlzdGl0ZXJfbWV0aG9kcywJCQkvKiB0cF9tZXRob2RzICovCi0JMCwJCQkJCS8qIHRwX21lbWJlcnMgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQorICAgICJsaXN0aXRlcmF0b3IiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgIHNpemVvZihsaXN0aXRlcm9iamVjdCksICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcilsaXN0aXRlcl9kZWFsbG9jLCAgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDLC8qIHRwX2ZsYWdzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAodHJhdmVyc2Vwcm9jKWxpc3RpdGVyX3RyYXZlcnNlLCAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgUHlPYmplY3RfU2VsZkl0ZXIsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgKGl0ZXJuZXh0ZnVuYylsaXN0aXRlcl9uZXh0LCAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIGxpc3RpdGVyX21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLwogfTsKIAogCiBzdGF0aWMgUHlPYmplY3QgKgogbGlzdF9pdGVyKFB5T2JqZWN0ICpzZXEpCiB7Ci0JbGlzdGl0ZXJvYmplY3QgKml0OworICAgIGxpc3RpdGVyb2JqZWN0ICppdDsKIAotCWlmICghUHlMaXN0X0NoZWNrKHNlcSkpIHsKLQkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpdCA9IFB5T2JqZWN0X0dDX05ldyhsaXN0aXRlcm9iamVjdCwgJlB5TGlzdEl0ZXJfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWl0LT5pdF9pbmRleCA9IDA7Ci0JUHlfSU5DUkVGKHNlcSk7Ci0JaXQtPml0X3NlcSA9IChQeUxpc3RPYmplY3QgKilzZXE7Ci0JX1B5T2JqZWN0X0dDX1RSQUNLKGl0KTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgaWYgKCFQeUxpc3RfQ2hlY2soc2VxKSkgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGl0ID0gUHlPYmplY3RfR0NfTmV3KGxpc3RpdGVyb2JqZWN0LCAmUHlMaXN0SXRlcl9UeXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaXQtPml0X2luZGV4ID0gMDsKKyAgICBQeV9JTkNSRUYoc2VxKTsKKyAgICBpdC0+aXRfc2VxID0gKFB5TGlzdE9iamVjdCAqKXNlcTsKKyAgICBfUHlPYmplY3RfR0NfVFJBQ0soaXQpOworICAgIHJldHVybiAoUHlPYmplY3QgKilpdDsKIH0KIAogc3RhdGljIHZvaWQKIGxpc3RpdGVyX2RlYWxsb2MobGlzdGl0ZXJvYmplY3QgKml0KQogewotCV9QeU9iamVjdF9HQ19VTlRSQUNLKGl0KTsKLQlQeV9YREVDUkVGKGl0LT5pdF9zZXEpOwotCVB5T2JqZWN0X0dDX0RlbChpdCk7CisgICAgX1B5T2JqZWN0X0dDX1VOVFJBQ0soaXQpOworICAgIFB5X1hERUNSRUYoaXQtPml0X3NlcSk7CisgICAgUHlPYmplY3RfR0NfRGVsKGl0KTsKIH0KIAogc3RhdGljIGludAogbGlzdGl0ZXJfdHJhdmVyc2UobGlzdGl0ZXJvYmplY3QgKml0LCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlQeV9WSVNJVChpdC0+aXRfc2VxKTsKLQlyZXR1cm4gMDsKKyAgICBQeV9WSVNJVChpdC0+aXRfc2VxKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGxpc3RpdGVyX25leHQobGlzdGl0ZXJvYmplY3QgKml0KQogewotCVB5TGlzdE9iamVjdCAqc2VxOwotCVB5T2JqZWN0ICppdGVtOworICAgIFB5TGlzdE9iamVjdCAqc2VxOworICAgIFB5T2JqZWN0ICppdGVtOwogCi0JYXNzZXJ0KGl0ICE9IE5VTEwpOwotCXNlcSA9IGl0LT5pdF9zZXE7Ci0JaWYgKHNlcSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlhc3NlcnQoUHlMaXN0X0NoZWNrKHNlcSkpOworICAgIGFzc2VydChpdCAhPSBOVUxMKTsKKyAgICBzZXEgPSBpdC0+aXRfc2VxOworICAgIGlmIChzZXEgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYXNzZXJ0KFB5TGlzdF9DaGVjayhzZXEpKTsKIAotCWlmIChpdC0+aXRfaW5kZXggPCBQeUxpc3RfR0VUX1NJWkUoc2VxKSkgewotCQlpdGVtID0gUHlMaXN0X0dFVF9JVEVNKHNlcSwgaXQtPml0X2luZGV4KTsKLQkJKytpdC0+aXRfaW5kZXg7Ci0JCVB5X0lOQ1JFRihpdGVtKTsKLQkJcmV0dXJuIGl0ZW07Ci0JfQorICAgIGlmIChpdC0+aXRfaW5kZXggPCBQeUxpc3RfR0VUX1NJWkUoc2VxKSkgeworICAgICAgICBpdGVtID0gUHlMaXN0X0dFVF9JVEVNKHNlcSwgaXQtPml0X2luZGV4KTsKKyAgICAgICAgKytpdC0+aXRfaW5kZXg7CisgICAgICAgIFB5X0lOQ1JFRihpdGVtKTsKKyAgICAgICAgcmV0dXJuIGl0ZW07CisgICAgfQogCi0JUHlfREVDUkVGKHNlcSk7Ci0JaXQtPml0X3NlcSA9IE5VTEw7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlfREVDUkVGKHNlcSk7CisgICAgaXQtPml0X3NlcSA9IE5VTEw7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBsaXN0aXRlcl9sZW4obGlzdGl0ZXJvYmplY3QgKml0KQogewotCVB5X3NzaXplX3QgbGVuOwotCWlmIChpdC0+aXRfc2VxKSB7Ci0JCWxlbiA9IFB5TGlzdF9HRVRfU0laRShpdC0+aXRfc2VxKSAtIGl0LT5pdF9pbmRleDsKLQkJaWYgKGxlbiA+PSAwKQotCQkJcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KGxlbik7Ci0JfQotCXJldHVybiBQeUludF9Gcm9tTG9uZygwKTsKKyAgICBQeV9zc2l6ZV90IGxlbjsKKyAgICBpZiAoaXQtPml0X3NlcSkgeworICAgICAgICBsZW4gPSBQeUxpc3RfR0VUX1NJWkUoaXQtPml0X3NlcSkgLSBpdC0+aXRfaW5kZXg7CisgICAgICAgIGlmIChsZW4gPj0gMCkKKyAgICAgICAgICAgIHJldHVybiBQeUludF9Gcm9tU3NpemVfdChsZW4pOworICAgIH0KKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoMCk7CiB9CiAvKioqKioqKioqKioqKioqKioqKioqKiogTGlzdCBSZXZlcnNlIEl0ZXJhdG9yICoqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCVB5X3NzaXplX3QgaXRfaW5kZXg7Ci0JUHlMaXN0T2JqZWN0ICppdF9zZXE7IC8qIFNldCB0byBOVUxMIHdoZW4gaXRlcmF0b3IgaXMgZXhoYXVzdGVkICovCisgICAgUHlPYmplY3RfSEVBRAorICAgIFB5X3NzaXplX3QgaXRfaW5kZXg7CisgICAgUHlMaXN0T2JqZWN0ICppdF9zZXE7IC8qIFNldCB0byBOVUxMIHdoZW4gaXRlcmF0b3IgaXMgZXhoYXVzdGVkICovCiB9IGxpc3RyZXZpdGVyb2JqZWN0OwogCiBzdGF0aWMgUHlPYmplY3QgKmxpc3RfcmV2ZXJzZWQoUHlMaXN0T2JqZWN0ICosIFB5T2JqZWN0ICopOwpAQCAtMjkyNSwxMDAgKzI5MjUsMTAwIEBACiBzdGF0aWMgUHlPYmplY3QgKmxpc3RyZXZpdGVyX2xlbihsaXN0cmV2aXRlcm9iamVjdCAqKTsKIAogc3RhdGljIFB5TWV0aG9kRGVmIGxpc3RyZXZpdGVyX21ldGhvZHNbXSA9IHsKLQl7Il9fbGVuZ3RoX2hpbnRfXyIsIChQeUNGdW5jdGlvbilsaXN0cmV2aXRlcl9sZW4sIE1FVEhfTk9BUkdTLCBsZW5ndGhfaGludF9kb2N9LAotIAl7TlVMTCwJCU5VTEx9CQkvKiBzZW50aW5lbCAqLworICAgIHsiX19sZW5ndGhfaGludF9fIiwgKFB5Q0Z1bmN0aW9uKWxpc3RyZXZpdGVyX2xlbiwgTUVUSF9OT0FSR1MsIGxlbmd0aF9oaW50X2RvY30sCisgICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIFB5VHlwZU9iamVjdCBQeUxpc3RSZXZJdGVyX1R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKLQkibGlzdHJldmVyc2VpdGVyYXRvciIsCQkJLyogdHBfbmFtZSAqLwotCXNpemVvZihsaXN0cmV2aXRlcm9iamVjdCksCQkvKiB0cF9iYXNpY3NpemUgKi8KLQkwLAkJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpbGlzdHJldml0ZXJfZGVhbGxvYywJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfY29tcGFyZSAqLwotCTAsCQkJCQkvKiB0cF9yZXByICovCi0JMCwJCQkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJCQkJCS8qIHRwX2hhc2ggKi8KLQkwLAkJCQkJLyogdHBfY2FsbCAqLwotCTAsCQkJCQkvKiB0cF9zdHIgKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQywvKiB0cF9mbGFncyAqLwotCTAsCQkJCQkvKiB0cF9kb2MgKi8KLQkodHJhdmVyc2Vwcm9jKWxpc3RyZXZpdGVyX3RyYXZlcnNlLAkvKiB0cF90cmF2ZXJzZSAqLwotCTAsCQkJCQkvKiB0cF9jbGVhciAqLwotCTAsCQkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCVB5T2JqZWN0X1NlbGZJdGVyLAkJCS8qIHRwX2l0ZXIgKi8KLQkoaXRlcm5leHRmdW5jKWxpc3RyZXZpdGVyX25leHQsCQkvKiB0cF9pdGVybmV4dCAqLwotCWxpc3RyZXZpdGVyX21ldGhvZHMsCQkvKiB0cF9tZXRob2RzICovCi0JMCwKKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQorICAgICJsaXN0cmV2ZXJzZWl0ZXJhdG9yIiwgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgIHNpemVvZihsaXN0cmV2aXRlcm9iamVjdCksICAgICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcilsaXN0cmV2aXRlcl9kZWFsbG9jLCAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDLC8qIHRwX2ZsYWdzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAodHJhdmVyc2Vwcm9jKWxpc3RyZXZpdGVyX3RyYXZlcnNlLCAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgUHlPYmplY3RfU2VsZkl0ZXIsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgKGl0ZXJuZXh0ZnVuYylsaXN0cmV2aXRlcl9uZXh0LCAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIGxpc3RyZXZpdGVyX21ldGhvZHMsICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLAogfTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIGxpc3RfcmV2ZXJzZWQoUHlMaXN0T2JqZWN0ICpzZXEsIFB5T2JqZWN0ICp1bnVzZWQpCiB7Ci0JbGlzdHJldml0ZXJvYmplY3QgKml0OworICAgIGxpc3RyZXZpdGVyb2JqZWN0ICppdDsKIAotCWl0ID0gUHlPYmplY3RfR0NfTmV3KGxpc3RyZXZpdGVyb2JqZWN0LCAmUHlMaXN0UmV2SXRlcl9UeXBlKTsKLQlpZiAoaXQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JYXNzZXJ0KFB5TGlzdF9DaGVjayhzZXEpKTsKLQlpdC0+aXRfaW5kZXggPSBQeUxpc3RfR0VUX1NJWkUoc2VxKSAtIDE7Ci0JUHlfSU5DUkVGKHNlcSk7Ci0JaXQtPml0X3NlcSA9IHNlcTsKLQlQeU9iamVjdF9HQ19UcmFjayhpdCk7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIGl0ID0gUHlPYmplY3RfR0NfTmV3KGxpc3RyZXZpdGVyb2JqZWN0LCAmUHlMaXN0UmV2SXRlcl9UeXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYXNzZXJ0KFB5TGlzdF9DaGVjayhzZXEpKTsKKyAgICBpdC0+aXRfaW5kZXggPSBQeUxpc3RfR0VUX1NJWkUoc2VxKSAtIDE7CisgICAgUHlfSU5DUkVGKHNlcSk7CisgICAgaXQtPml0X3NlcSA9IHNlcTsKKyAgICBQeU9iamVjdF9HQ19UcmFjayhpdCk7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogCiBzdGF0aWMgdm9pZAogbGlzdHJldml0ZXJfZGVhbGxvYyhsaXN0cmV2aXRlcm9iamVjdCAqaXQpCiB7Ci0JUHlPYmplY3RfR0NfVW5UcmFjayhpdCk7Ci0JUHlfWERFQ1JFRihpdC0+aXRfc2VxKTsKLQlQeU9iamVjdF9HQ19EZWwoaXQpOworICAgIFB5T2JqZWN0X0dDX1VuVHJhY2soaXQpOworICAgIFB5X1hERUNSRUYoaXQtPml0X3NlcSk7CisgICAgUHlPYmplY3RfR0NfRGVsKGl0KTsKIH0KIAogc3RhdGljIGludAogbGlzdHJldml0ZXJfdHJhdmVyc2UobGlzdHJldml0ZXJvYmplY3QgKml0LCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlQeV9WSVNJVChpdC0+aXRfc2VxKTsKLQlyZXR1cm4gMDsKKyAgICBQeV9WSVNJVChpdC0+aXRfc2VxKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGxpc3RyZXZpdGVyX25leHQobGlzdHJldml0ZXJvYmplY3QgKml0KQogewotCVB5T2JqZWN0ICppdGVtOwotCVB5X3NzaXplX3QgaW5kZXggPSBpdC0+aXRfaW5kZXg7Ci0JUHlMaXN0T2JqZWN0ICpzZXEgPSBpdC0+aXRfc2VxOworICAgIFB5T2JqZWN0ICppdGVtOworICAgIFB5X3NzaXplX3QgaW5kZXggPSBpdC0+aXRfaW5kZXg7CisgICAgUHlMaXN0T2JqZWN0ICpzZXEgPSBpdC0+aXRfc2VxOwogCi0JaWYgKGluZGV4Pj0wICYmIGluZGV4IDwgUHlMaXN0X0dFVF9TSVpFKHNlcSkpIHsKLQkJaXRlbSA9IFB5TGlzdF9HRVRfSVRFTShzZXEsIGluZGV4KTsKLQkJaXQtPml0X2luZGV4LS07Ci0JCVB5X0lOQ1JFRihpdGVtKTsKLQkJcmV0dXJuIGl0ZW07Ci0JfQotCWl0LT5pdF9pbmRleCA9IC0xOwotCWlmIChzZXEgIT0gTlVMTCkgewotCQlpdC0+aXRfc2VxID0gTlVMTDsKLQkJUHlfREVDUkVGKHNlcSk7Ci0JfQotCXJldHVybiBOVUxMOworICAgIGlmIChpbmRleD49MCAmJiBpbmRleCA8IFB5TGlzdF9HRVRfU0laRShzZXEpKSB7CisgICAgICAgIGl0ZW0gPSBQeUxpc3RfR0VUX0lURU0oc2VxLCBpbmRleCk7CisgICAgICAgIGl0LT5pdF9pbmRleC0tOworICAgICAgICBQeV9JTkNSRUYoaXRlbSk7CisgICAgICAgIHJldHVybiBpdGVtOworICAgIH0KKyAgICBpdC0+aXRfaW5kZXggPSAtMTsKKyAgICBpZiAoc2VxICE9IE5VTEwpIHsKKyAgICAgICAgaXQtPml0X3NlcSA9IE5VTEw7CisgICAgICAgIFB5X0RFQ1JFRihzZXEpOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGxpc3RyZXZpdGVyX2xlbihsaXN0cmV2aXRlcm9iamVjdCAqaXQpCiB7Ci0JUHlfc3NpemVfdCBsZW4gPSBpdC0+aXRfaW5kZXggKyAxOwotCWlmIChpdC0+aXRfc2VxID09IE5VTEwgfHwgUHlMaXN0X0dFVF9TSVpFKGl0LT5pdF9zZXEpIDwgbGVuKQotCQlsZW4gPSAwOwotCXJldHVybiBQeUxvbmdfRnJvbVNzaXplX3QobGVuKTsKKyAgICBQeV9zc2l6ZV90IGxlbiA9IGl0LT5pdF9pbmRleCArIDE7CisgICAgaWYgKGl0LT5pdF9zZXEgPT0gTlVMTCB8fCBQeUxpc3RfR0VUX1NJWkUoaXQtPml0X3NlcSkgPCBsZW4pCisgICAgICAgIGxlbiA9IDA7CisgICAgcmV0dXJuIFB5TG9uZ19Gcm9tU3NpemVfdChsZW4pOwogfQpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9sb25nb2JqZWN0LmMgYi9PYmplY3RzL2xvbmdvYmplY3QuYwppbmRleCA5MWVkZjYyLi5lNmVkYjRmIDEwMDY0NAotLS0gYS9PYmplY3RzL2xvbmdvYmplY3QuYworKysgYi9PYmplY3RzL2xvbmdvYmplY3QuYwpAQCAtMzcsMTAgKzM3LDEwIEBACiBzdGF0aWMgUHlMb25nT2JqZWN0ICpkaXZyZW0xKFB5TG9uZ09iamVjdCAqLCBkaWdpdCwgZGlnaXQgKik7CiAKICNkZWZpbmUgU0lHQ0hFQ0soUHlUcnlCbG9jaykgXAotCWlmICgtLV9QeV9UaWNrZXIgPCAwKSB7IFwKLQkJX1B5X1RpY2tlciA9IF9QeV9DaGVja0ludGVydmFsOyBcCi0JCWlmIChQeUVycl9DaGVja1NpZ25hbHMoKSkgUHlUcnlCbG9jayBcCi0JfQorICAgIGlmICgtLV9QeV9UaWNrZXIgPCAwKSB7IFwKKyAgICAgICAgX1B5X1RpY2tlciA9IF9QeV9DaGVja0ludGVydmFsOyBcCisgICAgICAgIGlmIChQeUVycl9DaGVja1NpZ25hbHMoKSkgUHlUcnlCbG9jayBcCisgICAgfQogCiAvKiBOb3JtYWxpemUgKHJlbW92ZSBsZWFkaW5nIHplcm9zIGZyb20pIGEgbG9uZyBpbnQgb2JqZWN0LgogICAgRG9lc24ndCBhdHRlbXB0IHRvIGZyZWUgdGhlIHN0b3JhZ2UtLWluIG1vc3QgY2FzZXMsIGR1ZSB0byB0aGUgbmF0dXJlCkBAIC00OSwxNCArNDksMTQgQEAKIHN0YXRpYyBQeUxvbmdPYmplY3QgKgogbG9uZ19ub3JtYWxpemUocmVnaXN0ZXIgUHlMb25nT2JqZWN0ICp2KQogewotCVB5X3NzaXplX3QgaiA9IEFCUyhQeV9TSVpFKHYpKTsKLQlQeV9zc2l6ZV90IGkgPSBqOworICAgIFB5X3NzaXplX3QgaiA9IEFCUyhQeV9TSVpFKHYpKTsKKyAgICBQeV9zc2l6ZV90IGkgPSBqOwogCi0Jd2hpbGUgKGkgPiAwICYmIHYtPm9iX2RpZ2l0W2ktMV0gPT0gMCkKLQkJLS1pOwotCWlmIChpICE9IGopCi0JCVB5X1NJWkUodikgPSAoUHlfU0laRSh2KSA8IDApID8gLShpKSA6IGk7Ci0JcmV0dXJuIHY7CisgICAgd2hpbGUgKGkgPiAwICYmIHYtPm9iX2RpZ2l0W2ktMV0gPT0gMCkKKyAgICAgICAgLS1pOworICAgIGlmIChpICE9IGopCisgICAgICAgIFB5X1NJWkUodikgPSAoUHlfU0laRSh2KSA8IDApID8gLShpKSA6IGk7CisgICAgcmV0dXJuIHY7CiB9CiAKIC8qIEFsbG9jYXRlIGEgbmV3IGxvbmcgaW50IG9iamVjdCB3aXRoIHNpemUgZGlnaXRzLgpAQCAtNjUsMzMgKzY1LDMzIEBACiBQeUxvbmdPYmplY3QgKgogX1B5TG9uZ19OZXcoUHlfc3NpemVfdCBzaXplKQogewotCWlmIChzaXplID4gUFlfU1NJWkVfVF9NQVgpIHsKLQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCS8qIGNvdmVyaXR5W2FtcGVyc2FuZF9pbl9zaXplXSAqLwotCS8qIFhYWChubm9yd2l0eik6IFRoaXMgY2FuIG92ZXJmbG93IC0tCi0gICAgICAgICAgIFB5T2JqZWN0X05FV19WQVIgLyBfUHlPYmplY3RfVkFSX1NJWkUgbmVlZCB0byBkZXRlY3Qgb3ZlcmZsb3cgKi8KLQlyZXR1cm4gUHlPYmplY3RfTkVXX1ZBUihQeUxvbmdPYmplY3QsICZQeUxvbmdfVHlwZSwgc2l6ZSk7CisgICAgaWYgKHNpemUgPiBQWV9TU0laRV9UX01BWCkgeworICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgLyogY292ZXJpdHlbYW1wZXJzYW5kX2luX3NpemVdICovCisgICAgLyogWFhYKG5ub3J3aXR6KTogVGhpcyBjYW4gb3ZlcmZsb3cgLS0KKyAgICAgICBQeU9iamVjdF9ORVdfVkFSIC8gX1B5T2JqZWN0X1ZBUl9TSVpFIG5lZWQgdG8gZGV0ZWN0IG92ZXJmbG93ICovCisgICAgcmV0dXJuIFB5T2JqZWN0X05FV19WQVIoUHlMb25nT2JqZWN0LCAmUHlMb25nX1R5cGUsIHNpemUpOwogfQogCiBQeU9iamVjdCAqCiBfUHlMb25nX0NvcHkoUHlMb25nT2JqZWN0ICpzcmMpCiB7Ci0JUHlMb25nT2JqZWN0ICpyZXN1bHQ7Ci0JUHlfc3NpemVfdCBpOworICAgIFB5TG9uZ09iamVjdCAqcmVzdWx0OworICAgIFB5X3NzaXplX3QgaTsKIAotCWFzc2VydChzcmMgIT0gTlVMTCk7Ci0JaSA9IHNyYy0+b2Jfc2l6ZTsKLQlpZiAoaSA8IDApCi0JCWkgPSAtKGkpOwotCXJlc3VsdCA9IF9QeUxvbmdfTmV3KGkpOwotCWlmIChyZXN1bHQgIT0gTlVMTCkgewotCQlyZXN1bHQtPm9iX3NpemUgPSBzcmMtPm9iX3NpemU7Ci0JCXdoaWxlICgtLWkgPj0gMCkKLQkJCXJlc3VsdC0+b2JfZGlnaXRbaV0gPSBzcmMtPm9iX2RpZ2l0W2ldOwotCX0KLQlyZXR1cm4gKFB5T2JqZWN0ICopcmVzdWx0OworICAgIGFzc2VydChzcmMgIT0gTlVMTCk7CisgICAgaSA9IHNyYy0+b2Jfc2l6ZTsKKyAgICBpZiAoaSA8IDApCisgICAgICAgIGkgPSAtKGkpOworICAgIHJlc3VsdCA9IF9QeUxvbmdfTmV3KGkpOworICAgIGlmIChyZXN1bHQgIT0gTlVMTCkgeworICAgICAgICByZXN1bHQtPm9iX3NpemUgPSBzcmMtPm9iX3NpemU7CisgICAgICAgIHdoaWxlICgtLWkgPj0gMCkKKyAgICAgICAgICAgIHJlc3VsdC0+b2JfZGlnaXRbaV0gPSBzcmMtPm9iX2RpZ2l0W2ldOworICAgIH0KKyAgICByZXR1cm4gKFB5T2JqZWN0ICopcmVzdWx0OwogfQogCiAvKiBDcmVhdGUgYSBuZXcgbG9uZyBpbnQgb2JqZWN0IGZyb20gYSBDIGxvbmcgaW50ICovCkBAIC05OSw0MyArOTksNDMgQEAKIFB5T2JqZWN0ICoKIFB5TG9uZ19Gcm9tTG9uZyhsb25nIGl2YWwpCiB7Ci0JUHlMb25nT2JqZWN0ICp2OwotICAgICAgICB1bnNpZ25lZCBsb25nIGFic19pdmFsOwotCXVuc2lnbmVkIGxvbmcgdDsgIC8qIHVuc2lnbmVkIHNvID4+IGRvZXNuJ3QgcHJvcGFnYXRlIHNpZ24gYml0ICovCi0JaW50IG5kaWdpdHMgPSAwOwotCWludCBuZWdhdGl2ZSA9IDA7CisgICAgUHlMb25nT2JqZWN0ICp2OworICAgIHVuc2lnbmVkIGxvbmcgYWJzX2l2YWw7CisgICAgdW5zaWduZWQgbG9uZyB0OyAgLyogdW5zaWduZWQgc28gPj4gZG9lc24ndCBwcm9wYWdhdGUgc2lnbiBiaXQgKi8KKyAgICBpbnQgbmRpZ2l0cyA9IDA7CisgICAgaW50IG5lZ2F0aXZlID0gMDsKIAotCWlmIChpdmFsIDwgMCkgewotCQkvKiBpZiBMT05HX01JTiA9PSAtTE9OR19NQVgtMSAodHJ1ZSBvbiBtb3N0IHBsYXRmb3JtcykgdGhlbgotCQkgICBBTlNJIEMgc2F5cyB0aGF0IHRoZSByZXN1bHQgb2YgLWl2YWwgaXMgdW5kZWZpbmVkIHdoZW4gaXZhbAotCQkgICA9PSBMT05HX01JTi4gIEhlbmNlIHRoZSBmb2xsb3dpbmcgd29ya2Fyb3VuZC4gKi8KLQkJYWJzX2l2YWwgPSAodW5zaWduZWQgbG9uZykoLTEtaXZhbCkgKyAxOwotCQluZWdhdGl2ZSA9IDE7Ci0JfQotCWVsc2UgewotCQlhYnNfaXZhbCA9ICh1bnNpZ25lZCBsb25nKWl2YWw7Ci0JfQorICAgIGlmIChpdmFsIDwgMCkgeworICAgICAgICAvKiBpZiBMT05HX01JTiA9PSAtTE9OR19NQVgtMSAodHJ1ZSBvbiBtb3N0IHBsYXRmb3JtcykgdGhlbgorICAgICAgICAgICBBTlNJIEMgc2F5cyB0aGF0IHRoZSByZXN1bHQgb2YgLWl2YWwgaXMgdW5kZWZpbmVkIHdoZW4gaXZhbAorICAgICAgICAgICA9PSBMT05HX01JTi4gIEhlbmNlIHRoZSBmb2xsb3dpbmcgd29ya2Fyb3VuZC4gKi8KKyAgICAgICAgYWJzX2l2YWwgPSAodW5zaWduZWQgbG9uZykoLTEtaXZhbCkgKyAxOworICAgICAgICBuZWdhdGl2ZSA9IDE7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBhYnNfaXZhbCA9ICh1bnNpZ25lZCBsb25nKWl2YWw7CisgICAgfQogCi0JLyogQ291bnQgdGhlIG51bWJlciBvZiBQeXRob24gZGlnaXRzLgotCSAgIFdlIHVzZWQgdG8gcGljayA1ICgiYmlnIGVub3VnaCBmb3IgYW55dGhpbmciKSwgYnV0IHRoYXQncyBhCi0JICAgd2FzdGUgb2YgdGltZSBhbmQgc3BhY2UgZ2l2ZW4gdGhhdCA1KjE1ID0gNzUgYml0cyBhcmUgcmFyZWx5Ci0JICAgbmVlZGVkLiAqLwotCXQgPSBhYnNfaXZhbDsKLQl3aGlsZSAodCkgewotCQkrK25kaWdpdHM7Ci0JCXQgPj49IFB5TG9uZ19TSElGVDsKLQl9Ci0JdiA9IF9QeUxvbmdfTmV3KG5kaWdpdHMpOwotCWlmICh2ICE9IE5VTEwpIHsKLQkJZGlnaXQgKnAgPSB2LT5vYl9kaWdpdDsKLQkJdi0+b2Jfc2l6ZSA9IG5lZ2F0aXZlID8gLW5kaWdpdHMgOiBuZGlnaXRzOwotCQl0ID0gYWJzX2l2YWw7Ci0JCXdoaWxlICh0KSB7Ci0JCQkqcCsrID0gKGRpZ2l0KSh0ICYgUHlMb25nX01BU0spOwotCQkJdCA+Pj0gUHlMb25nX1NISUZUOwotCQl9Ci0JfQotCXJldHVybiAoUHlPYmplY3QgKil2OworICAgIC8qIENvdW50IHRoZSBudW1iZXIgb2YgUHl0aG9uIGRpZ2l0cy4KKyAgICAgICBXZSB1c2VkIHRvIHBpY2sgNSAoImJpZyBlbm91Z2ggZm9yIGFueXRoaW5nIiksIGJ1dCB0aGF0J3MgYQorICAgICAgIHdhc3RlIG9mIHRpbWUgYW5kIHNwYWNlIGdpdmVuIHRoYXQgNSoxNSA9IDc1IGJpdHMgYXJlIHJhcmVseQorICAgICAgIG5lZWRlZC4gKi8KKyAgICB0ID0gYWJzX2l2YWw7CisgICAgd2hpbGUgKHQpIHsKKyAgICAgICAgKytuZGlnaXRzOworICAgICAgICB0ID4+PSBQeUxvbmdfU0hJRlQ7CisgICAgfQorICAgIHYgPSBfUHlMb25nX05ldyhuZGlnaXRzKTsKKyAgICBpZiAodiAhPSBOVUxMKSB7CisgICAgICAgIGRpZ2l0ICpwID0gdi0+b2JfZGlnaXQ7CisgICAgICAgIHYtPm9iX3NpemUgPSBuZWdhdGl2ZSA/IC1uZGlnaXRzIDogbmRpZ2l0czsKKyAgICAgICAgdCA9IGFic19pdmFsOworICAgICAgICB3aGlsZSAodCkgeworICAgICAgICAgICAgKnArKyA9IChkaWdpdCkodCAmIFB5TG9uZ19NQVNLKTsKKyAgICAgICAgICAgIHQgPj49IFB5TG9uZ19TSElGVDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gKFB5T2JqZWN0ICopdjsKIH0KIAogLyogQ3JlYXRlIGEgbmV3IGxvbmcgaW50IG9iamVjdCBmcm9tIGEgQyB1bnNpZ25lZCBsb25nIGludCAqLwpAQCAtMTQzLDI2ICsxNDMsMjYgQEAKIFB5T2JqZWN0ICoKIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKHVuc2lnbmVkIGxvbmcgaXZhbCkKIHsKLQlQeUxvbmdPYmplY3QgKnY7Ci0JdW5zaWduZWQgbG9uZyB0OwotCWludCBuZGlnaXRzID0gMDsKKyAgICBQeUxvbmdPYmplY3QgKnY7CisgICAgdW5zaWduZWQgbG9uZyB0OworICAgIGludCBuZGlnaXRzID0gMDsKIAotCS8qIENvdW50IHRoZSBudW1iZXIgb2YgUHl0aG9uIGRpZ2l0cy4gKi8KLQl0ID0gKHVuc2lnbmVkIGxvbmcpaXZhbDsKLQl3aGlsZSAodCkgewotCQkrK25kaWdpdHM7Ci0JCXQgPj49IFB5TG9uZ19TSElGVDsKLQl9Ci0JdiA9IF9QeUxvbmdfTmV3KG5kaWdpdHMpOwotCWlmICh2ICE9IE5VTEwpIHsKLQkJZGlnaXQgKnAgPSB2LT5vYl9kaWdpdDsKLQkJUHlfU0laRSh2KSA9IG5kaWdpdHM7Ci0JCXdoaWxlIChpdmFsKSB7Ci0JCQkqcCsrID0gKGRpZ2l0KShpdmFsICYgUHlMb25nX01BU0spOwotCQkJaXZhbCA+Pj0gUHlMb25nX1NISUZUOwotCQl9Ci0JfQotCXJldHVybiAoUHlPYmplY3QgKil2OworICAgIC8qIENvdW50IHRoZSBudW1iZXIgb2YgUHl0aG9uIGRpZ2l0cy4gKi8KKyAgICB0ID0gKHVuc2lnbmVkIGxvbmcpaXZhbDsKKyAgICB3aGlsZSAodCkgeworICAgICAgICArK25kaWdpdHM7CisgICAgICAgIHQgPj49IFB5TG9uZ19TSElGVDsKKyAgICB9CisgICAgdiA9IF9QeUxvbmdfTmV3KG5kaWdpdHMpOworICAgIGlmICh2ICE9IE5VTEwpIHsKKyAgICAgICAgZGlnaXQgKnAgPSB2LT5vYl9kaWdpdDsKKyAgICAgICAgUHlfU0laRSh2KSA9IG5kaWdpdHM7CisgICAgICAgIHdoaWxlIChpdmFsKSB7CisgICAgICAgICAgICAqcCsrID0gKGRpZ2l0KShpdmFsICYgUHlMb25nX01BU0spOworICAgICAgICAgICAgaXZhbCA+Pj0gUHlMb25nX1NISUZUOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAoUHlPYmplY3QgKil2OwogfQogCiAvKiBDcmVhdGUgYSBuZXcgbG9uZyBpbnQgb2JqZWN0IGZyb20gYSBDIGRvdWJsZSAqLwpAQCAtMTcwLDQxICsxNzAsNDEgQEAKIFB5T2JqZWN0ICoKIFB5TG9uZ19Gcm9tRG91YmxlKGRvdWJsZSBkdmFsKQogewotCVB5TG9uZ09iamVjdCAqdjsKLQlkb3VibGUgZnJhYzsKLQlpbnQgaSwgbmRpZywgZXhwbywgbmVnOwotCW5lZyA9IDA7Ci0JaWYgKFB5X0lTX0lORklOSVRZKGR2YWwpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJImNhbm5vdCBjb252ZXJ0IGZsb2F0IGluZmluaXR5IHRvIGludGVnZXIiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChQeV9JU19OQU4oZHZhbCkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkiY2Fubm90IGNvbnZlcnQgZmxvYXQgTmFOIHRvIGludGVnZXIiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChkdmFsIDwgMC4wKSB7Ci0JCW5lZyA9IDE7Ci0JCWR2YWwgPSAtZHZhbDsKLQl9Ci0JZnJhYyA9IGZyZXhwKGR2YWwsICZleHBvKTsgLyogZHZhbCA9IGZyYWMqMioqZXhwbzsgMC4wIDw9IGZyYWMgPCAxLjAgKi8KLQlpZiAoZXhwbyA8PSAwKQotCQlyZXR1cm4gUHlMb25nX0Zyb21Mb25nKDBMKTsKLQluZGlnID0gKGV4cG8tMSkgLyBQeUxvbmdfU0hJRlQgKyAxOyAvKiBOdW1iZXIgb2YgJ2RpZ2l0cycgaW4gcmVzdWx0ICovCi0JdiA9IF9QeUxvbmdfTmV3KG5kaWcpOwotCWlmICh2ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWZyYWMgPSBsZGV4cChmcmFjLCAoZXhwby0xKSAlIFB5TG9uZ19TSElGVCArIDEpOwotCWZvciAoaSA9IG5kaWc7IC0taSA+PSAwOyApIHsKLQkJbG9uZyBiaXRzID0gKGxvbmcpZnJhYzsKLQkJdi0+b2JfZGlnaXRbaV0gPSAoZGlnaXQpIGJpdHM7Ci0JCWZyYWMgPSBmcmFjIC0gKGRvdWJsZSliaXRzOwotCQlmcmFjID0gbGRleHAoZnJhYywgUHlMb25nX1NISUZUKTsKLQl9Ci0JaWYgKG5lZykKLQkJUHlfU0laRSh2KSA9IC0oUHlfU0laRSh2KSk7Ci0JcmV0dXJuIChQeU9iamVjdCAqKXY7CisgICAgUHlMb25nT2JqZWN0ICp2OworICAgIGRvdWJsZSBmcmFjOworICAgIGludCBpLCBuZGlnLCBleHBvLCBuZWc7CisgICAgbmVnID0gMDsKKyAgICBpZiAoUHlfSVNfSU5GSU5JVFkoZHZhbCkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAiY2Fubm90IGNvbnZlcnQgZmxvYXQgaW5maW5pdHkgdG8gaW50ZWdlciIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKFB5X0lTX05BTihkdmFsKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICJjYW5ub3QgY29udmVydCBmbG9hdCBOYU4gdG8gaW50ZWdlciIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKGR2YWwgPCAwLjApIHsKKyAgICAgICAgbmVnID0gMTsKKyAgICAgICAgZHZhbCA9IC1kdmFsOworICAgIH0KKyAgICBmcmFjID0gZnJleHAoZHZhbCwgJmV4cG8pOyAvKiBkdmFsID0gZnJhYyoyKipleHBvOyAwLjAgPD0gZnJhYyA8IDEuMCAqLworICAgIGlmIChleHBvIDw9IDApCisgICAgICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmcoMEwpOworICAgIG5kaWcgPSAoZXhwby0xKSAvIFB5TG9uZ19TSElGVCArIDE7IC8qIE51bWJlciBvZiAnZGlnaXRzJyBpbiByZXN1bHQgKi8KKyAgICB2ID0gX1B5TG9uZ19OZXcobmRpZyk7CisgICAgaWYgKHYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZnJhYyA9IGxkZXhwKGZyYWMsIChleHBvLTEpICUgUHlMb25nX1NISUZUICsgMSk7CisgICAgZm9yIChpID0gbmRpZzsgLS1pID49IDA7ICkgeworICAgICAgICBsb25nIGJpdHMgPSAobG9uZylmcmFjOworICAgICAgICB2LT5vYl9kaWdpdFtpXSA9IChkaWdpdCkgYml0czsKKyAgICAgICAgZnJhYyA9IGZyYWMgLSAoZG91YmxlKWJpdHM7CisgICAgICAgIGZyYWMgPSBsZGV4cChmcmFjLCBQeUxvbmdfU0hJRlQpOworICAgIH0KKyAgICBpZiAobmVnKQorICAgICAgICBQeV9TSVpFKHYpID0gLShQeV9TSVpFKHYpKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopdjsKIH0KIAogLyogQ2hlY2tpbmcgZm9yIG92ZXJmbG93IGluIFB5TG9uZ19Bc0xvbmcgaXMgYSBQSVRBIHNpbmNlIEMgZG9lc24ndCBkZWZpbmUKQEAgLTIxNiw4ICsyMTYsOCBAQAogICogSG93ZXZlciwgc29tZSBvdGhlciBjb21waWxlcnMgd2FybiBhYm91dCBhcHBseWluZyB1bmFyeSBtaW51cyB0byBhbgogICogdW5zaWduZWQgb3BlcmFuZC4gIEhlbmNlIHRoZSB3ZWlyZCAiMC0iLgogICovCi0jZGVmaW5lIFBZX0FCU19MT05HX01JTgkJKDAtKHVuc2lnbmVkIGxvbmcpTE9OR19NSU4pCi0jZGVmaW5lIFBZX0FCU19TU0laRV9UX01JTgkoMC0oc2l6ZV90KVBZX1NTSVpFX1RfTUlOKQorI2RlZmluZSBQWV9BQlNfTE9OR19NSU4gICAgICAgICAoMC0odW5zaWduZWQgbG9uZylMT05HX01JTikKKyNkZWZpbmUgUFlfQUJTX1NTSVpFX1RfTUlOICAgICAgKDAtKHNpemVfdClQWV9TU0laRV9UX01JTikKIAogLyogR2V0IGEgQyBsb25nIGludCBmcm9tIGEgbG9uZyBpbnQgb2JqZWN0LgogICAgUmV0dXJucyAtMSBhbmQgc2V0cyBhbiBlcnJvciBjb25kaXRpb24gaWYgb3ZlcmZsb3cgb2NjdXJzLiAqLwpAQCAtMjI1LDQ3ICsyMjUsNDcgQEAKIGxvbmcKIFB5TG9uZ19Bc0xvbmcoUHlPYmplY3QgKnZ2KQogewotCS8qIFRoaXMgdmVyc2lvbiBieSBUaW0gUGV0ZXJzICovCi0JcmVnaXN0ZXIgUHlMb25nT2JqZWN0ICp2OwotCXVuc2lnbmVkIGxvbmcgeCwgcHJldjsKLQlQeV9zc2l6ZV90IGk7Ci0JaW50IHNpZ247CisgICAgLyogVGhpcyB2ZXJzaW9uIGJ5IFRpbSBQZXRlcnMgKi8KKyAgICByZWdpc3RlciBQeUxvbmdPYmplY3QgKnY7CisgICAgdW5zaWduZWQgbG9uZyB4LCBwcmV2OworICAgIFB5X3NzaXplX3QgaTsKKyAgICBpbnQgc2lnbjsKIAotCWlmICh2diA9PSBOVUxMIHx8ICFQeUxvbmdfQ2hlY2sodnYpKSB7Ci0JCWlmICh2diAhPSBOVUxMICYmIFB5SW50X0NoZWNrKHZ2KSkKLQkJCXJldHVybiBQeUludF9Bc0xvbmcodnYpOwotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIC0xOwotCX0KLQl2ID0gKFB5TG9uZ09iamVjdCAqKXZ2OwotCWkgPSB2LT5vYl9zaXplOwotCXNpZ24gPSAxOwotCXggPSAwOwotCWlmIChpIDwgMCkgewotCQlzaWduID0gLTE7Ci0JCWkgPSAtKGkpOwotCX0KLQl3aGlsZSAoLS1pID49IDApIHsKLQkJcHJldiA9IHg7Ci0JCXggPSAoeCA8PCBQeUxvbmdfU0hJRlQpICsgdi0+b2JfZGlnaXRbaV07Ci0JCWlmICgoeCA+PiBQeUxvbmdfU0hJRlQpICE9IHByZXYpCi0JCQlnb3RvIG92ZXJmbG93OwotCX0KLQkvKiBIYXZlbid0IGxvc3QgYW55IGJpdHMsIGJ1dCBjYXN0aW5nIHRvIGxvbmcgcmVxdWlyZXMgZXh0cmEgY2FyZQotCSAqIChzZWUgY29tbWVudCBhYm92ZSkuCi0gICAgICAgICAqLwotCWlmICh4IDw9ICh1bnNpZ25lZCBsb25nKUxPTkdfTUFYKSB7Ci0JCXJldHVybiAobG9uZyl4ICogc2lnbjsKLQl9Ci0JZWxzZSBpZiAoc2lnbiA8IDAgJiYgeCA9PSBQWV9BQlNfTE9OR19NSU4pIHsKLQkJcmV0dXJuIExPTkdfTUlOOwotCX0KLQkvKiBlbHNlIG92ZXJmbG93ICovCisgICAgaWYgKHZ2ID09IE5VTEwgfHwgIVB5TG9uZ19DaGVjayh2dikpIHsKKyAgICAgICAgaWYgKHZ2ICE9IE5VTEwgJiYgUHlJbnRfQ2hlY2sodnYpKQorICAgICAgICAgICAgcmV0dXJuIFB5SW50X0FzTG9uZyh2dik7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHYgPSAoUHlMb25nT2JqZWN0ICopdnY7CisgICAgaSA9IHYtPm9iX3NpemU7CisgICAgc2lnbiA9IDE7CisgICAgeCA9IDA7CisgICAgaWYgKGkgPCAwKSB7CisgICAgICAgIHNpZ24gPSAtMTsKKyAgICAgICAgaSA9IC0oaSk7CisgICAgfQorICAgIHdoaWxlICgtLWkgPj0gMCkgeworICAgICAgICBwcmV2ID0geDsKKyAgICAgICAgeCA9ICh4IDw8IFB5TG9uZ19TSElGVCkgKyB2LT5vYl9kaWdpdFtpXTsKKyAgICAgICAgaWYgKCh4ID4+IFB5TG9uZ19TSElGVCkgIT0gcHJldikKKyAgICAgICAgICAgIGdvdG8gb3ZlcmZsb3c7CisgICAgfQorICAgIC8qIEhhdmVuJ3QgbG9zdCBhbnkgYml0cywgYnV0IGNhc3RpbmcgdG8gbG9uZyByZXF1aXJlcyBleHRyYSBjYXJlCisgICAgICogKHNlZSBjb21tZW50IGFib3ZlKS4KKyAgICAgKi8KKyAgICBpZiAoeCA8PSAodW5zaWduZWQgbG9uZylMT05HX01BWCkgeworICAgICAgICByZXR1cm4gKGxvbmcpeCAqIHNpZ247CisgICAgfQorICAgIGVsc2UgaWYgKHNpZ24gPCAwICYmIHggPT0gUFlfQUJTX0xPTkdfTUlOKSB7CisgICAgICAgIHJldHVybiBMT05HX01JTjsKKyAgICB9CisgICAgLyogZWxzZSBvdmVyZmxvdyAqLwogCiAgb3ZlcmZsb3c6Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0JCQkibG9uZyBpbnQgdG9vIGxhcmdlIHRvIGNvbnZlcnQgdG8gaW50Iik7Ci0JcmV0dXJuIC0xOworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAibG9uZyBpbnQgdG9vIGxhcmdlIHRvIGNvbnZlcnQgdG8gaW50Iik7CisgICAgcmV0dXJuIC0xOwogfQogCiAvKiBHZXQgYSBQeV9zc2l6ZV90IGZyb20gYSBsb25nIGludCBvYmplY3QuCkBAIC0yNzMsNDQgKzI3Myw0NCBAQAogCiBQeV9zc2l6ZV90CiBQeUxvbmdfQXNTc2l6ZV90KFB5T2JqZWN0ICp2dikgewotCXJlZ2lzdGVyIFB5TG9uZ09iamVjdCAqdjsKLQlzaXplX3QgeCwgcHJldjsKLQlQeV9zc2l6ZV90IGk7Ci0JaW50IHNpZ247CisgICAgcmVnaXN0ZXIgUHlMb25nT2JqZWN0ICp2OworICAgIHNpemVfdCB4LCBwcmV2OworICAgIFB5X3NzaXplX3QgaTsKKyAgICBpbnQgc2lnbjsKIAotCWlmICh2diA9PSBOVUxMIHx8ICFQeUxvbmdfQ2hlY2sodnYpKSB7Ci0JCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXYgPSAoUHlMb25nT2JqZWN0ICopdnY7Ci0JaSA9IHYtPm9iX3NpemU7Ci0Jc2lnbiA9IDE7Ci0JeCA9IDA7Ci0JaWYgKGkgPCAwKSB7Ci0JCXNpZ24gPSAtMTsKLQkJaSA9IC0oaSk7Ci0JfQotCXdoaWxlICgtLWkgPj0gMCkgewotCQlwcmV2ID0geDsKLQkJeCA9ICh4IDw8IFB5TG9uZ19TSElGVCkgKyB2LT5vYl9kaWdpdFtpXTsKLQkJaWYgKCh4ID4+IFB5TG9uZ19TSElGVCkgIT0gcHJldikKLQkJCWdvdG8gb3ZlcmZsb3c7Ci0JfQotCS8qIEhhdmVuJ3QgbG9zdCBhbnkgYml0cywgYnV0IGNhc3RpbmcgdG8gYSBzaWduZWQgdHlwZSByZXF1aXJlcwotCSAqIGV4dHJhIGNhcmUgKHNlZSBjb21tZW50IGFib3ZlKS4KLQkgKi8KLQlpZiAoeCA8PSAoc2l6ZV90KVBZX1NTSVpFX1RfTUFYKSB7Ci0JCXJldHVybiAoUHlfc3NpemVfdCl4ICogc2lnbjsKLQl9Ci0JZWxzZSBpZiAoc2lnbiA8IDAgJiYgeCA9PSBQWV9BQlNfU1NJWkVfVF9NSU4pIHsKLQkJcmV0dXJuIFBZX1NTSVpFX1RfTUlOOwotCX0KLQkvKiBlbHNlIG92ZXJmbG93ICovCisgICAgaWYgKHZ2ID09IE5VTEwgfHwgIVB5TG9uZ19DaGVjayh2dikpIHsKKyAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgdiA9IChQeUxvbmdPYmplY3QgKil2djsKKyAgICBpID0gdi0+b2Jfc2l6ZTsKKyAgICBzaWduID0gMTsKKyAgICB4ID0gMDsKKyAgICBpZiAoaSA8IDApIHsKKyAgICAgICAgc2lnbiA9IC0xOworICAgICAgICBpID0gLShpKTsKKyAgICB9CisgICAgd2hpbGUgKC0taSA+PSAwKSB7CisgICAgICAgIHByZXYgPSB4OworICAgICAgICB4ID0gKHggPDwgUHlMb25nX1NISUZUKSArIHYtPm9iX2RpZ2l0W2ldOworICAgICAgICBpZiAoKHggPj4gUHlMb25nX1NISUZUKSAhPSBwcmV2KQorICAgICAgICAgICAgZ290byBvdmVyZmxvdzsKKyAgICB9CisgICAgLyogSGF2ZW4ndCBsb3N0IGFueSBiaXRzLCBidXQgY2FzdGluZyB0byBhIHNpZ25lZCB0eXBlIHJlcXVpcmVzCisgICAgICogZXh0cmEgY2FyZSAoc2VlIGNvbW1lbnQgYWJvdmUpLgorICAgICAqLworICAgIGlmICh4IDw9IChzaXplX3QpUFlfU1NJWkVfVF9NQVgpIHsKKyAgICAgICAgcmV0dXJuIChQeV9zc2l6ZV90KXggKiBzaWduOworICAgIH0KKyAgICBlbHNlIGlmIChzaWduIDwgMCAmJiB4ID09IFBZX0FCU19TU0laRV9UX01JTikgeworICAgICAgICByZXR1cm4gUFlfU1NJWkVfVF9NSU47CisgICAgfQorICAgIC8qIGVsc2Ugb3ZlcmZsb3cgKi8KIAogIG92ZXJmbG93OgotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJImxvbmcgaW50IHRvbyBsYXJnZSB0byBjb252ZXJ0IHRvIGludCIpOwotCXJldHVybiAtMTsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgImxvbmcgaW50IHRvbyBsYXJnZSB0byBjb252ZXJ0IHRvIGludCIpOworICAgIHJldHVybiAtMTsKIH0KIAogLyogR2V0IGEgQyB1bnNpZ25lZCBsb25nIGludCBmcm9tIGEgbG9uZyBpbnQgb2JqZWN0LgpAQCAtMzE5LDQxICszMTksNDEgQEAKIHVuc2lnbmVkIGxvbmcKIFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZyhQeU9iamVjdCAqdnYpCiB7Ci0JcmVnaXN0ZXIgUHlMb25nT2JqZWN0ICp2OwotCXVuc2lnbmVkIGxvbmcgeCwgcHJldjsKLQlQeV9zc2l6ZV90IGk7CisgICAgcmVnaXN0ZXIgUHlMb25nT2JqZWN0ICp2OworICAgIHVuc2lnbmVkIGxvbmcgeCwgcHJldjsKKyAgICBQeV9zc2l6ZV90IGk7CiAKLQlpZiAodnYgPT0gTlVMTCB8fCAhUHlMb25nX0NoZWNrKHZ2KSkgewotCQlpZiAodnYgIT0gTlVMTCAmJiBQeUludF9DaGVjayh2dikpIHsKLQkJCWxvbmcgdmFsID0gUHlJbnRfQXNMb25nKHZ2KTsKLQkJCWlmICh2YWwgPCAwKSB7Ci0JCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0JCQkJImNhbid0IGNvbnZlcnQgbmVnYXRpdmUgdmFsdWUgdG8gdW5zaWduZWQgbG9uZyIpOwotCQkJCXJldHVybiAodW5zaWduZWQgbG9uZykgLTE7Ci0JCQl9Ci0JCQlyZXR1cm4gdmFsOwotCQl9Ci0JCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotCQlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpIC0xOwotCX0KLQl2ID0gKFB5TG9uZ09iamVjdCAqKXZ2OwotCWkgPSBQeV9TSVpFKHYpOwotCXggPSAwOwotCWlmIChpIDwgMCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJCSAgICJjYW4ndCBjb252ZXJ0IG5lZ2F0aXZlIHZhbHVlIHRvIHVuc2lnbmVkIGxvbmciKTsKLQkJcmV0dXJuICh1bnNpZ25lZCBsb25nKSAtMTsKLQl9Ci0Jd2hpbGUgKC0taSA+PSAwKSB7Ci0JCXByZXYgPSB4OwotCQl4ID0gKHggPDwgUHlMb25nX1NISUZUKSArIHYtPm9iX2RpZ2l0W2ldOwotCQlpZiAoKHggPj4gUHlMb25nX1NISUZUKSAhPSBwcmV2KSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJCQkibG9uZyBpbnQgdG9vIGxhcmdlIHRvIGNvbnZlcnQiKTsKLQkJCXJldHVybiAodW5zaWduZWQgbG9uZykgLTE7Ci0JCX0KLQl9Ci0JcmV0dXJuIHg7CisgICAgaWYgKHZ2ID09IE5VTEwgfHwgIVB5TG9uZ19DaGVjayh2dikpIHsKKyAgICAgICAgaWYgKHZ2ICE9IE5VTEwgJiYgUHlJbnRfQ2hlY2sodnYpKSB7CisgICAgICAgICAgICBsb25nIHZhbCA9IFB5SW50X0FzTG9uZyh2dik7CisgICAgICAgICAgICBpZiAodmFsIDwgMCkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICJjYW4ndCBjb252ZXJ0IG5lZ2F0aXZlIHZhbHVlIHRvIHVuc2lnbmVkIGxvbmciKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKHVuc2lnbmVkIGxvbmcpIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHZhbDsKKyAgICAgICAgfQorICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuICh1bnNpZ25lZCBsb25nKSAtMTsKKyAgICB9CisgICAgdiA9IChQeUxvbmdPYmplY3QgKil2djsKKyAgICBpID0gUHlfU0laRSh2KTsKKyAgICB4ID0gMDsKKyAgICBpZiAoaSA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgICAgImNhbid0IGNvbnZlcnQgbmVnYXRpdmUgdmFsdWUgdG8gdW5zaWduZWQgbG9uZyIpOworICAgICAgICByZXR1cm4gKHVuc2lnbmVkIGxvbmcpIC0xOworICAgIH0KKyAgICB3aGlsZSAoLS1pID49IDApIHsKKyAgICAgICAgcHJldiA9IHg7CisgICAgICAgIHggPSAoeCA8PCBQeUxvbmdfU0hJRlQpICsgdi0+b2JfZGlnaXRbaV07CisgICAgICAgIGlmICgoeCA+PiBQeUxvbmdfU0hJRlQpICE9IHByZXYpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICJsb25nIGludCB0b28gbGFyZ2UgdG8gY29udmVydCIpOworICAgICAgICAgICAgcmV0dXJuICh1bnNpZ25lZCBsb25nKSAtMTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4geDsKIH0KIAogLyogR2V0IGEgQyB1bnNpZ25lZCBsb25nIGludCBmcm9tIGEgbG9uZyBpbnQgb2JqZWN0LCBpZ25vcmluZyB0aGUgaGlnaCBiaXRzLgpAQCAtMzYyLDMxMiArMzYyLDMxMiBAQAogdW5zaWduZWQgbG9uZwogUHlMb25nX0FzVW5zaWduZWRMb25nTWFzayhQeU9iamVjdCAqdnYpCiB7Ci0JcmVnaXN0ZXIgUHlMb25nT2JqZWN0ICp2OwotCXVuc2lnbmVkIGxvbmcgeDsKLQlQeV9zc2l6ZV90IGk7Ci0JaW50IHNpZ247CisgICAgcmVnaXN0ZXIgUHlMb25nT2JqZWN0ICp2OworICAgIHVuc2lnbmVkIGxvbmcgeDsKKyAgICBQeV9zc2l6ZV90IGk7CisgICAgaW50IHNpZ247CiAKLQlpZiAodnYgPT0gTlVMTCB8fCAhUHlMb25nX0NoZWNrKHZ2KSkgewotCQlpZiAodnYgIT0gTlVMTCAmJiBQeUludF9DaGVjayh2dikpCi0JCQlyZXR1cm4gUHlJbnRfQXNVbnNpZ25lZExvbmdNYXNrKHZ2KTsKLQkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0JCXJldHVybiAodW5zaWduZWQgbG9uZykgLTE7Ci0JfQotCXYgPSAoUHlMb25nT2JqZWN0ICopdnY7Ci0JaSA9IHYtPm9iX3NpemU7Ci0Jc2lnbiA9IDE7Ci0JeCA9IDA7Ci0JaWYgKGkgPCAwKSB7Ci0JCXNpZ24gPSAtMTsKLQkJaSA9IC1pOwotCX0KLQl3aGlsZSAoLS1pID49IDApIHsKLQkJeCA9ICh4IDw8IFB5TG9uZ19TSElGVCkgKyB2LT5vYl9kaWdpdFtpXTsKLQl9Ci0JcmV0dXJuIHggKiBzaWduOworICAgIGlmICh2diA9PSBOVUxMIHx8ICFQeUxvbmdfQ2hlY2sodnYpKSB7CisgICAgICAgIGlmICh2diAhPSBOVUxMICYmIFB5SW50X0NoZWNrKHZ2KSkKKyAgICAgICAgICAgIHJldHVybiBQeUludF9Bc1Vuc2lnbmVkTG9uZ01hc2sodnYpOworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuICh1bnNpZ25lZCBsb25nKSAtMTsKKyAgICB9CisgICAgdiA9IChQeUxvbmdPYmplY3QgKil2djsKKyAgICBpID0gdi0+b2Jfc2l6ZTsKKyAgICBzaWduID0gMTsKKyAgICB4ID0gMDsKKyAgICBpZiAoaSA8IDApIHsKKyAgICAgICAgc2lnbiA9IC0xOworICAgICAgICBpID0gLWk7CisgICAgfQorICAgIHdoaWxlICgtLWkgPj0gMCkgeworICAgICAgICB4ID0gKHggPDwgUHlMb25nX1NISUZUKSArIHYtPm9iX2RpZ2l0W2ldOworICAgIH0KKyAgICByZXR1cm4geCAqIHNpZ247CiB9CiAKIGludAogX1B5TG9uZ19TaWduKFB5T2JqZWN0ICp2dikKIHsKLQlQeUxvbmdPYmplY3QgKnYgPSAoUHlMb25nT2JqZWN0ICopdnY7CisgICAgUHlMb25nT2JqZWN0ICp2ID0gKFB5TG9uZ09iamVjdCAqKXZ2OwogCi0JYXNzZXJ0KHYgIT0gTlVMTCk7Ci0JYXNzZXJ0KFB5TG9uZ19DaGVjayh2KSk7CisgICAgYXNzZXJ0KHYgIT0gTlVMTCk7CisgICAgYXNzZXJ0KFB5TG9uZ19DaGVjayh2KSk7CiAKLQlyZXR1cm4gUHlfU0laRSh2KSA9PSAwID8gMCA6IChQeV9TSVpFKHYpIDwgMCA/IC0xIDogMSk7CisgICAgcmV0dXJuIFB5X1NJWkUodikgPT0gMCA/IDAgOiAoUHlfU0laRSh2KSA8IDAgPyAtMSA6IDEpOwogfQogCiBzaXplX3QKIF9QeUxvbmdfTnVtQml0cyhQeU9iamVjdCAqdnYpCiB7Ci0JUHlMb25nT2JqZWN0ICp2ID0gKFB5TG9uZ09iamVjdCAqKXZ2OwotCXNpemVfdCByZXN1bHQgPSAwOwotCVB5X3NzaXplX3QgbmRpZ2l0czsKKyAgICBQeUxvbmdPYmplY3QgKnYgPSAoUHlMb25nT2JqZWN0ICopdnY7CisgICAgc2l6ZV90IHJlc3VsdCA9IDA7CisgICAgUHlfc3NpemVfdCBuZGlnaXRzOwogCi0JYXNzZXJ0KHYgIT0gTlVMTCk7Ci0JYXNzZXJ0KFB5TG9uZ19DaGVjayh2KSk7Ci0JbmRpZ2l0cyA9IEFCUyhQeV9TSVpFKHYpKTsKLQlhc3NlcnQobmRpZ2l0cyA9PSAwIHx8IHYtPm9iX2RpZ2l0W25kaWdpdHMgLSAxXSAhPSAwKTsKLQlpZiAobmRpZ2l0cyA+IDApIHsKLQkJZGlnaXQgbXNkID0gdi0+b2JfZGlnaXRbbmRpZ2l0cyAtIDFdOworICAgIGFzc2VydCh2ICE9IE5VTEwpOworICAgIGFzc2VydChQeUxvbmdfQ2hlY2sodikpOworICAgIG5kaWdpdHMgPSBBQlMoUHlfU0laRSh2KSk7CisgICAgYXNzZXJ0KG5kaWdpdHMgPT0gMCB8fCB2LT5vYl9kaWdpdFtuZGlnaXRzIC0gMV0gIT0gMCk7CisgICAgaWYgKG5kaWdpdHMgPiAwKSB7CisgICAgICAgIGRpZ2l0IG1zZCA9IHYtPm9iX2RpZ2l0W25kaWdpdHMgLSAxXTsKIAotCQlyZXN1bHQgPSAobmRpZ2l0cyAtIDEpICogUHlMb25nX1NISUZUOwotCQlpZiAocmVzdWx0IC8gUHlMb25nX1NISUZUICE9IChzaXplX3QpKG5kaWdpdHMgLSAxKSkKLQkJCWdvdG8gT3ZlcmZsb3c7Ci0JCWRvIHsKLQkJCSsrcmVzdWx0OwotCQkJaWYgKHJlc3VsdCA9PSAwKQotCQkJCWdvdG8gT3ZlcmZsb3c7Ci0JCQltc2QgPj49IDE7Ci0JCX0gd2hpbGUgKG1zZCk7Ci0JfQotCXJldHVybiByZXN1bHQ7CisgICAgICAgIHJlc3VsdCA9IChuZGlnaXRzIC0gMSkgKiBQeUxvbmdfU0hJRlQ7CisgICAgICAgIGlmIChyZXN1bHQgLyBQeUxvbmdfU0hJRlQgIT0gKHNpemVfdCkobmRpZ2l0cyAtIDEpKQorICAgICAgICAgICAgZ290byBPdmVyZmxvdzsKKyAgICAgICAgZG8geworICAgICAgICAgICAgKytyZXN1bHQ7CisgICAgICAgICAgICBpZiAocmVzdWx0ID09IDApCisgICAgICAgICAgICAgICAgZ290byBPdmVyZmxvdzsKKyAgICAgICAgICAgIG1zZCA+Pj0gMTsKKyAgICAgICAgfSB3aGlsZSAobXNkKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKIAogT3ZlcmZsb3c6Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsICJsb25nIGhhcyB0b28gbWFueSBiaXRzICIKLQkJCSJ0byBleHByZXNzIGluIGEgcGxhdGZvcm0gc2l6ZV90Iik7Ci0JcmV0dXJuIChzaXplX3QpLTE7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsICJsb25nIGhhcyB0b28gbWFueSBiaXRzICIKKyAgICAgICAgICAgICAgICAgICAgInRvIGV4cHJlc3MgaW4gYSBwbGF0Zm9ybSBzaXplX3QiKTsKKyAgICByZXR1cm4gKHNpemVfdCktMTsKIH0KIAogUHlPYmplY3QgKgogX1B5TG9uZ19Gcm9tQnl0ZUFycmF5KGNvbnN0IHVuc2lnbmVkIGNoYXIqIGJ5dGVzLCBzaXplX3QgbiwKLQkJICAgICAgaW50IGxpdHRsZV9lbmRpYW4sIGludCBpc19zaWduZWQpCisgICAgICAgICAgICAgICAgICAgICAgaW50IGxpdHRsZV9lbmRpYW4sIGludCBpc19zaWduZWQpCiB7Ci0JY29uc3QgdW5zaWduZWQgY2hhciogcHN0YXJ0Ynl0ZTsvKiBMU0Igb2YgYnl0ZXMgKi8KLQlpbnQgaW5jcjsJCQkvKiBkaXJlY3Rpb24gdG8gbW92ZSBwc3RhcnRieXRlICovCi0JY29uc3QgdW5zaWduZWQgY2hhciogcGVuZGJ5dGU7CS8qIE1TQiBvZiBieXRlcyAqLwotCXNpemVfdCBudW1zaWduaWZpY2FudGJ5dGVzOwkvKiBudW1iZXIgb2YgYnl0ZXMgdGhhdCBtYXR0ZXIgKi8KLQlzaXplX3QgbmRpZ2l0czsJCQkvKiBudW1iZXIgb2YgUHl0aG9uIGxvbmcgZGlnaXRzICovCi0JUHlMb25nT2JqZWN0KiB2OwkJLyogcmVzdWx0ICovCi0JaW50IGlkaWdpdCA9IDA7ICAJCS8qIG5leHQgZnJlZSBpbmRleCBpbiB2LT5vYl9kaWdpdCAqLworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIHBzdGFydGJ5dGU7LyogTFNCIG9mIGJ5dGVzICovCisgICAgaW50IGluY3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGlyZWN0aW9uIHRvIG1vdmUgcHN0YXJ0Ynl0ZSAqLworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIHBlbmRieXRlOyAgICAgIC8qIE1TQiBvZiBieXRlcyAqLworICAgIHNpemVfdCBudW1zaWduaWZpY2FudGJ5dGVzOyAgICAgICAgIC8qIG51bWJlciBvZiBieXRlcyB0aGF0IG1hdHRlciAqLworICAgIHNpemVfdCBuZGlnaXRzOyAgICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBQeXRob24gbG9uZyBkaWdpdHMgKi8KKyAgICBQeUxvbmdPYmplY3QqIHY7ICAgICAgICAgICAgICAgICAgICAvKiByZXN1bHQgKi8KKyAgICBpbnQgaWRpZ2l0ID0gMDsgICAgICAgICAgICAgICAgICAgICAvKiBuZXh0IGZyZWUgaW5kZXggaW4gdi0+b2JfZGlnaXQgKi8KIAotCWlmIChuID09IDApCi0JCXJldHVybiBQeUxvbmdfRnJvbUxvbmcoMEwpOworICAgIGlmIChuID09IDApCisgICAgICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmcoMEwpOwogCi0JaWYgKGxpdHRsZV9lbmRpYW4pIHsKLQkJcHN0YXJ0Ynl0ZSA9IGJ5dGVzOwotCQlwZW5kYnl0ZSA9IGJ5dGVzICsgbiAtIDE7Ci0JCWluY3IgPSAxOwotCX0KLQllbHNlIHsKLQkJcHN0YXJ0Ynl0ZSA9IGJ5dGVzICsgbiAtIDE7Ci0JCXBlbmRieXRlID0gYnl0ZXM7Ci0JCWluY3IgPSAtMTsKLQl9CisgICAgaWYgKGxpdHRsZV9lbmRpYW4pIHsKKyAgICAgICAgcHN0YXJ0Ynl0ZSA9IGJ5dGVzOworICAgICAgICBwZW5kYnl0ZSA9IGJ5dGVzICsgbiAtIDE7CisgICAgICAgIGluY3IgPSAxOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcHN0YXJ0Ynl0ZSA9IGJ5dGVzICsgbiAtIDE7CisgICAgICAgIHBlbmRieXRlID0gYnl0ZXM7CisgICAgICAgIGluY3IgPSAtMTsKKyAgICB9CiAKLQlpZiAoaXNfc2lnbmVkKQotCQlpc19zaWduZWQgPSAqcGVuZGJ5dGUgPj0gMHg4MDsKKyAgICBpZiAoaXNfc2lnbmVkKQorICAgICAgICBpc19zaWduZWQgPSAqcGVuZGJ5dGUgPj0gMHg4MDsKIAotCS8qIENvbXB1dGUgbnVtc2lnbmlmaWNhbnRieXRlcy4gIFRoaXMgY29uc2lzdHMgb2YgZmluZGluZyB0aGUgbW9zdAotCSAgIHNpZ25pZmljYW50IGJ5dGUuICBMZWFkaW5nIDAgYnl0ZXMgYXJlIGluc2lnbmZpY2FudCBpZiB0aGUgbnVtYmVyCi0JICAgaXMgcG9zaXRpdmUsIGFuZCBsZWFkaW5nIDB4ZmYgYnl0ZXMgaWYgbmVnYXRpdmUuICovCi0JewotCQlzaXplX3QgaTsKLQkJY29uc3QgdW5zaWduZWQgY2hhciogcCA9IHBlbmRieXRlOwotCQljb25zdCBpbnQgcGluY3IgPSAtaW5jcjsgIC8qIHNlYXJjaCBNU0IgdG8gTFNCICovCi0JCWNvbnN0IHVuc2lnbmVkIGNoYXIgaW5zaWduZmljYW50ID0gaXNfc2lnbmVkID8gMHhmZiA6IDB4MDA7CisgICAgLyogQ29tcHV0ZSBudW1zaWduaWZpY2FudGJ5dGVzLiAgVGhpcyBjb25zaXN0cyBvZiBmaW5kaW5nIHRoZSBtb3N0CisgICAgICAgc2lnbmlmaWNhbnQgYnl0ZS4gIExlYWRpbmcgMCBieXRlcyBhcmUgaW5zaWduZmljYW50IGlmIHRoZSBudW1iZXIKKyAgICAgICBpcyBwb3NpdGl2ZSwgYW5kIGxlYWRpbmcgMHhmZiBieXRlcyBpZiBuZWdhdGl2ZS4gKi8KKyAgICB7CisgICAgICAgIHNpemVfdCBpOworICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBwID0gcGVuZGJ5dGU7CisgICAgICAgIGNvbnN0IGludCBwaW5jciA9IC1pbmNyOyAgLyogc2VhcmNoIE1TQiB0byBMU0IgKi8KKyAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciBpbnNpZ25maWNhbnQgPSBpc19zaWduZWQgPyAweGZmIDogMHgwMDsKIAotCQlmb3IgKGkgPSAwOyBpIDwgbjsgKytpLCBwICs9IHBpbmNyKSB7Ci0JCQlpZiAoKnAgIT0gaW5zaWduZmljYW50KQotCQkJCWJyZWFrOwotCQl9Ci0JCW51bXNpZ25pZmljYW50Ynl0ZXMgPSBuIC0gaTsKLQkJLyogMidzLWNvbXAgaXMgYSBiaXQgdHJpY2t5IGhlcmUsIGUuZy4gMHhmZjAwID09IC0weDAxMDAsIHNvCi0JCSAgIGFjdHVhbGx5IGhhcyAyIHNpZ25pZmljYW50IGJ5dGVzLiAgT1RPSCwgMHhmZjAwMDEgPT0KLQkJICAgLTB4MDBmZmZmLCBzbyB3ZSB3b3VsZG4ndCAqbmVlZCogdG8gYnVtcCBpdCB0aGVyZTsgYnV0IHdlCi0JCSAgIGRvIGZvciAweGZmZmYgPSAtMHgwMDAxLiAgVG8gYmUgc2FmZSB3aXRob3V0IGJvdGhlcmluZyB0bwotCQkgICBjaGVjayBldmVyeSBjYXNlLCBidW1wIGl0IHJlZ2FyZGxlc3MuICovCi0JCWlmIChpc19zaWduZWQgJiYgbnVtc2lnbmlmaWNhbnRieXRlcyA8IG4pCi0JCQkrK251bXNpZ25pZmljYW50Ynl0ZXM7Ci0JfQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpLCBwICs9IHBpbmNyKSB7CisgICAgICAgICAgICBpZiAoKnAgIT0gaW5zaWduZmljYW50KQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIG51bXNpZ25pZmljYW50Ynl0ZXMgPSBuIC0gaTsKKyAgICAgICAgLyogMidzLWNvbXAgaXMgYSBiaXQgdHJpY2t5IGhlcmUsIGUuZy4gMHhmZjAwID09IC0weDAxMDAsIHNvCisgICAgICAgICAgIGFjdHVhbGx5IGhhcyAyIHNpZ25pZmljYW50IGJ5dGVzLiAgT1RPSCwgMHhmZjAwMDEgPT0KKyAgICAgICAgICAgLTB4MDBmZmZmLCBzbyB3ZSB3b3VsZG4ndCAqbmVlZCogdG8gYnVtcCBpdCB0aGVyZTsgYnV0IHdlCisgICAgICAgICAgIGRvIGZvciAweGZmZmYgPSAtMHgwMDAxLiAgVG8gYmUgc2FmZSB3aXRob3V0IGJvdGhlcmluZyB0bworICAgICAgICAgICBjaGVjayBldmVyeSBjYXNlLCBidW1wIGl0IHJlZ2FyZGxlc3MuICovCisgICAgICAgIGlmIChpc19zaWduZWQgJiYgbnVtc2lnbmlmaWNhbnRieXRlcyA8IG4pCisgICAgICAgICAgICArK251bXNpZ25pZmljYW50Ynl0ZXM7CisgICAgfQogCi0JLyogSG93IG1hbnkgUHl0aG9uIGxvbmcgZGlnaXRzIGRvIHdlIG5lZWQ/ICBXZSBoYXZlCi0JICAgOCpudW1zaWduaWZpY2FudGJ5dGVzIGJpdHMsIGFuZCBlYWNoIFB5dGhvbiBsb25nIGRpZ2l0IGhhcyBQeUxvbmdfU0hJRlQKLQkgICBiaXRzLCBzbyBpdCdzIHRoZSBjZWlsaW5nIG9mIHRoZSBxdW90aWVudC4gKi8KLQluZGlnaXRzID0gKG51bXNpZ25pZmljYW50Ynl0ZXMgKiA4ICsgUHlMb25nX1NISUZUIC0gMSkgLyBQeUxvbmdfU0hJRlQ7Ci0JaWYgKG5kaWdpdHMgPiAoc2l6ZV90KUlOVF9NQVgpCi0JCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCXYgPSBfUHlMb25nX05ldygoaW50KW5kaWdpdHMpOwotCWlmICh2ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIC8qIEhvdyBtYW55IFB5dGhvbiBsb25nIGRpZ2l0cyBkbyB3ZSBuZWVkPyAgV2UgaGF2ZQorICAgICAgIDgqbnVtc2lnbmlmaWNhbnRieXRlcyBiaXRzLCBhbmQgZWFjaCBQeXRob24gbG9uZyBkaWdpdCBoYXMgUHlMb25nX1NISUZUCisgICAgICAgYml0cywgc28gaXQncyB0aGUgY2VpbGluZyBvZiB0aGUgcXVvdGllbnQuICovCisgICAgbmRpZ2l0cyA9IChudW1zaWduaWZpY2FudGJ5dGVzICogOCArIFB5TG9uZ19TSElGVCAtIDEpIC8gUHlMb25nX1NISUZUOworICAgIGlmIChuZGlnaXRzID4gKHNpemVfdClJTlRfTUFYKQorICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICB2ID0gX1B5TG9uZ19OZXcoKGludCluZGlnaXRzKTsKKyAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCS8qIENvcHkgdGhlIGJpdHMgb3Zlci4gIFRoZSB0cmlja3kgcGFydHMgYXJlIGNvbXB1dGluZyAyJ3MtY29tcCBvbgotCSAgIHRoZSBmbHkgZm9yIHNpZ25lZCBudW1iZXJzLCBhbmQgZGVhbGluZyB3aXRoIHRoZSBtaXNtYXRjaCBiZXR3ZWVuCi0JICAgOC1iaXQgYnl0ZXMgYW5kIChwcm9iYWJseSkgMTUtYml0IFB5dGhvbiBkaWdpdHMuKi8KLQl7Ci0JCXNpemVfdCBpOwotCQl0d29kaWdpdHMgY2FycnkgPSAxOwkJLyogZm9yIDIncy1jb21wIGNhbGN1bGF0aW9uICovCi0JCXR3b2RpZ2l0cyBhY2N1bSA9IDA7CQkvKiBzbGlkaW5nIHJlZ2lzdGVyICovCi0JCXVuc2lnbmVkIGludCBhY2N1bWJpdHMgPSAwOyAJLyogbnVtYmVyIG9mIGJpdHMgaW4gYWNjdW0gKi8KLQkJY29uc3QgdW5zaWduZWQgY2hhciogcCA9IHBzdGFydGJ5dGU7CisgICAgLyogQ29weSB0aGUgYml0cyBvdmVyLiAgVGhlIHRyaWNreSBwYXJ0cyBhcmUgY29tcHV0aW5nIDIncy1jb21wIG9uCisgICAgICAgdGhlIGZseSBmb3Igc2lnbmVkIG51bWJlcnMsIGFuZCBkZWFsaW5nIHdpdGggdGhlIG1pc21hdGNoIGJldHdlZW4KKyAgICAgICA4LWJpdCBieXRlcyBhbmQgKHByb2JhYmx5KSAxNS1iaXQgUHl0aG9uIGRpZ2l0cy4qLworICAgIHsKKyAgICAgICAgc2l6ZV90IGk7CisgICAgICAgIHR3b2RpZ2l0cyBjYXJyeSA9IDE7ICAgICAgICAgICAgICAgICAgICAvKiBmb3IgMidzLWNvbXAgY2FsY3VsYXRpb24gKi8KKyAgICAgICAgdHdvZGlnaXRzIGFjY3VtID0gMDsgICAgICAgICAgICAgICAgICAgIC8qIHNsaWRpbmcgcmVnaXN0ZXIgKi8KKyAgICAgICAgdW5zaWduZWQgaW50IGFjY3VtYml0cyA9IDA7ICAgICAgICAgICAgIC8qIG51bWJlciBvZiBiaXRzIGluIGFjY3VtICovCisgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIHAgPSBwc3RhcnRieXRlOwogCi0JCWZvciAoaSA9IDA7IGkgPCBudW1zaWduaWZpY2FudGJ5dGVzOyArK2ksIHAgKz0gaW5jcikgewotCQkJdHdvZGlnaXRzIHRoaXNieXRlID0gKnA7Ci0JCQkvKiBDb21wdXRlIGNvcnJlY3Rpb24gZm9yIDIncyBjb21wLCBpZiBuZWVkZWQuICovCi0JCQlpZiAoaXNfc2lnbmVkKSB7Ci0JCQkJdGhpc2J5dGUgPSAoMHhmZiBeIHRoaXNieXRlKSArIGNhcnJ5OwotCQkJCWNhcnJ5ID0gdGhpc2J5dGUgPj4gODsKLQkJCQl0aGlzYnl0ZSAmPSAweGZmOwotCQkJfQotCQkJLyogQmVjYXVzZSB3ZSdyZSBnb2luZyBMU0IgdG8gTVNCLCB0aGlzYnl0ZSBpcwotCQkJICAgbW9yZSBzaWduaWZpY2FudCB0aGFuIHdoYXQncyBhbHJlYWR5IGluIGFjY3VtLAotCQkJICAgc28gbmVlZHMgdG8gYmUgcHJlcGVuZGVkIHRvIGFjY3VtLiAqLwotCQkJYWNjdW0gfD0gKHR3b2RpZ2l0cyl0aGlzYnl0ZSA8PCBhY2N1bWJpdHM7Ci0JCQlhY2N1bWJpdHMgKz0gODsKLQkJCWlmIChhY2N1bWJpdHMgPj0gUHlMb25nX1NISUZUKSB7Ci0JCQkJLyogVGhlcmUncyBlbm91Z2ggdG8gZmlsbCBhIFB5dGhvbiBkaWdpdC4gKi8KLQkJCQlhc3NlcnQoaWRpZ2l0IDwgKGludCluZGlnaXRzKTsKLQkJCQl2LT5vYl9kaWdpdFtpZGlnaXRdID0gKGRpZ2l0KShhY2N1bSAmIFB5TG9uZ19NQVNLKTsKLQkJCQkrK2lkaWdpdDsKLQkJCQlhY2N1bSA+Pj0gUHlMb25nX1NISUZUOwotCQkJCWFjY3VtYml0cyAtPSBQeUxvbmdfU0hJRlQ7Ci0JCQkJYXNzZXJ0KGFjY3VtYml0cyA8IFB5TG9uZ19TSElGVCk7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0KGFjY3VtYml0cyA8IFB5TG9uZ19TSElGVCk7Ci0JCWlmIChhY2N1bWJpdHMpIHsKLQkJCWFzc2VydChpZGlnaXQgPCAoaW50KW5kaWdpdHMpOwotCQkJdi0+b2JfZGlnaXRbaWRpZ2l0XSA9IChkaWdpdClhY2N1bTsKLQkJCSsraWRpZ2l0OwotCQl9Ci0JfQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtc2lnbmlmaWNhbnRieXRlczsgKytpLCBwICs9IGluY3IpIHsKKyAgICAgICAgICAgIHR3b2RpZ2l0cyB0aGlzYnl0ZSA9ICpwOworICAgICAgICAgICAgLyogQ29tcHV0ZSBjb3JyZWN0aW9uIGZvciAyJ3MgY29tcCwgaWYgbmVlZGVkLiAqLworICAgICAgICAgICAgaWYgKGlzX3NpZ25lZCkgeworICAgICAgICAgICAgICAgIHRoaXNieXRlID0gKDB4ZmYgXiB0aGlzYnl0ZSkgKyBjYXJyeTsKKyAgICAgICAgICAgICAgICBjYXJyeSA9IHRoaXNieXRlID4+IDg7CisgICAgICAgICAgICAgICAgdGhpc2J5dGUgJj0gMHhmZjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIEJlY2F1c2Ugd2UncmUgZ29pbmcgTFNCIHRvIE1TQiwgdGhpc2J5dGUgaXMKKyAgICAgICAgICAgICAgIG1vcmUgc2lnbmlmaWNhbnQgdGhhbiB3aGF0J3MgYWxyZWFkeSBpbiBhY2N1bSwKKyAgICAgICAgICAgICAgIHNvIG5lZWRzIHRvIGJlIHByZXBlbmRlZCB0byBhY2N1bS4gKi8KKyAgICAgICAgICAgIGFjY3VtIHw9ICh0d29kaWdpdHMpdGhpc2J5dGUgPDwgYWNjdW1iaXRzOworICAgICAgICAgICAgYWNjdW1iaXRzICs9IDg7CisgICAgICAgICAgICBpZiAoYWNjdW1iaXRzID49IFB5TG9uZ19TSElGVCkgeworICAgICAgICAgICAgICAgIC8qIFRoZXJlJ3MgZW5vdWdoIHRvIGZpbGwgYSBQeXRob24gZGlnaXQuICovCisgICAgICAgICAgICAgICAgYXNzZXJ0KGlkaWdpdCA8IChpbnQpbmRpZ2l0cyk7CisgICAgICAgICAgICAgICAgdi0+b2JfZGlnaXRbaWRpZ2l0XSA9IChkaWdpdCkoYWNjdW0gJiBQeUxvbmdfTUFTSyk7CisgICAgICAgICAgICAgICAgKytpZGlnaXQ7CisgICAgICAgICAgICAgICAgYWNjdW0gPj49IFB5TG9uZ19TSElGVDsKKyAgICAgICAgICAgICAgICBhY2N1bWJpdHMgLT0gUHlMb25nX1NISUZUOworICAgICAgICAgICAgICAgIGFzc2VydChhY2N1bWJpdHMgPCBQeUxvbmdfU0hJRlQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGFzc2VydChhY2N1bWJpdHMgPCBQeUxvbmdfU0hJRlQpOworICAgICAgICBpZiAoYWNjdW1iaXRzKSB7CisgICAgICAgICAgICBhc3NlcnQoaWRpZ2l0IDwgKGludCluZGlnaXRzKTsKKyAgICAgICAgICAgIHYtPm9iX2RpZ2l0W2lkaWdpdF0gPSAoZGlnaXQpYWNjdW07CisgICAgICAgICAgICArK2lkaWdpdDsKKyAgICAgICAgfQorICAgIH0KIAotCVB5X1NJWkUodikgPSBpc19zaWduZWQgPyAtaWRpZ2l0IDogaWRpZ2l0OwotCXJldHVybiAoUHlPYmplY3QgKilsb25nX25vcm1hbGl6ZSh2KTsKKyAgICBQeV9TSVpFKHYpID0gaXNfc2lnbmVkID8gLWlkaWdpdCA6IGlkaWdpdDsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopbG9uZ19ub3JtYWxpemUodik7CiB9CiAKIGludAogX1B5TG9uZ19Bc0J5dGVBcnJheShQeUxvbmdPYmplY3QqIHYsCi0JCSAgICB1bnNpZ25lZCBjaGFyKiBieXRlcywgc2l6ZV90IG4sCi0JCSAgICBpbnQgbGl0dGxlX2VuZGlhbiwgaW50IGlzX3NpZ25lZCkKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciogYnl0ZXMsIHNpemVfdCBuLAorICAgICAgICAgICAgICAgICAgICBpbnQgbGl0dGxlX2VuZGlhbiwgaW50IGlzX3NpZ25lZCkKIHsKLQlQeV9zc2l6ZV90IGk7CQkvKiBpbmRleCBpbnRvIHYtPm9iX2RpZ2l0ICovCi0JUHlfc3NpemVfdCBuZGlnaXRzOwkJLyogfHYtPm9iX3NpemV8ICovCi0JdHdvZGlnaXRzIGFjY3VtOwkvKiBzbGlkaW5nIHJlZ2lzdGVyICovCi0JdW5zaWduZWQgaW50IGFjY3VtYml0czsgLyogIyBiaXRzIGluIGFjY3VtICovCi0JaW50IGRvX3R3b3NfY29tcDsJLyogc3RvcmUgMidzLWNvbXA/ICBpc19zaWduZWQgYW5kIHYgPCAwICovCi0JZGlnaXQgY2Fycnk7CQkvKiBmb3IgY29tcHV0aW5nIDIncy1jb21wICovCi0Jc2l6ZV90IGo7CQkvKiAjIGJ5dGVzIGZpbGxlZCAqLwotCXVuc2lnbmVkIGNoYXIqIHA7CS8qIHBvaW50ZXIgdG8gbmV4dCBieXRlIGluIGJ5dGVzICovCi0JaW50IHBpbmNyOwkJLyogZGlyZWN0aW9uIHRvIG1vdmUgcCAqLworICAgIFB5X3NzaXplX3QgaTsgICAgICAgICAgICAgICAvKiBpbmRleCBpbnRvIHYtPm9iX2RpZ2l0ICovCisgICAgUHlfc3NpemVfdCBuZGlnaXRzOyAgICAgICAgICAgICAgICAgLyogfHYtPm9iX3NpemV8ICovCisgICAgdHdvZGlnaXRzIGFjY3VtOyAgICAgICAgICAgIC8qIHNsaWRpbmcgcmVnaXN0ZXIgKi8KKyAgICB1bnNpZ25lZCBpbnQgYWNjdW1iaXRzOyAvKiAjIGJpdHMgaW4gYWNjdW0gKi8KKyAgICBpbnQgZG9fdHdvc19jb21wOyAgICAgICAgICAgLyogc3RvcmUgMidzLWNvbXA/ICBpc19zaWduZWQgYW5kIHYgPCAwICovCisgICAgZGlnaXQgY2Fycnk7ICAgICAgICAgICAgICAgIC8qIGZvciBjb21wdXRpbmcgMidzLWNvbXAgKi8KKyAgICBzaXplX3QgajsgICAgICAgICAgICAgICAgICAgLyogIyBieXRlcyBmaWxsZWQgKi8KKyAgICB1bnNpZ25lZCBjaGFyKiBwOyAgICAgICAgICAgLyogcG9pbnRlciB0byBuZXh0IGJ5dGUgaW4gYnl0ZXMgKi8KKyAgICBpbnQgcGluY3I7ICAgICAgICAgICAgICAgICAgLyogZGlyZWN0aW9uIHRvIG1vdmUgcCAqLwogCi0JYXNzZXJ0KHYgIT0gTlVMTCAmJiBQeUxvbmdfQ2hlY2sodikpOworICAgIGFzc2VydCh2ICE9IE5VTEwgJiYgUHlMb25nX0NoZWNrKHYpKTsKIAotCWlmIChQeV9TSVpFKHYpIDwgMCkgewotCQluZGlnaXRzID0gLShQeV9TSVpFKHYpKTsKLQkJaWYgKCFpc19zaWduZWQpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJImNhbid0IGNvbnZlcnQgbmVnYXRpdmUgbG9uZyB0byB1bnNpZ25lZCIpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWRvX3R3b3NfY29tcCA9IDE7Ci0JfQotCWVsc2UgewotCQluZGlnaXRzID0gUHlfU0laRSh2KTsKLQkJZG9fdHdvc19jb21wID0gMDsKLQl9CisgICAgaWYgKFB5X1NJWkUodikgPCAwKSB7CisgICAgICAgIG5kaWdpdHMgPSAtKFB5X1NJWkUodikpOworICAgICAgICBpZiAoIWlzX3NpZ25lZCkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAiY2FuJ3QgY29udmVydCBuZWdhdGl2ZSBsb25nIHRvIHVuc2lnbmVkIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgZG9fdHdvc19jb21wID0gMTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIG5kaWdpdHMgPSBQeV9TSVpFKHYpOworICAgICAgICBkb190d29zX2NvbXAgPSAwOworICAgIH0KIAotCWlmIChsaXR0bGVfZW5kaWFuKSB7Ci0JCXAgPSBieXRlczsKLQkJcGluY3IgPSAxOwotCX0KLQllbHNlIHsKLQkJcCA9IGJ5dGVzICsgbiAtIDE7Ci0JCXBpbmNyID0gLTE7Ci0JfQorICAgIGlmIChsaXR0bGVfZW5kaWFuKSB7CisgICAgICAgIHAgPSBieXRlczsKKyAgICAgICAgcGluY3IgPSAxOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcCA9IGJ5dGVzICsgbiAtIDE7CisgICAgICAgIHBpbmNyID0gLTE7CisgICAgfQogCi0JLyogQ29weSBvdmVyIGFsbCB0aGUgUHl0aG9uIGRpZ2l0cy4KLQkgICBJdCdzIGNydWNpYWwgdGhhdCBldmVyeSBQeXRob24gZGlnaXQgZXhjZXB0IGZvciB0aGUgTVNEIGNvbnRyaWJ1dGUKLQkgICBleGFjdGx5IFB5TG9uZ19TSElGVCBiaXRzIHRvIHRoZSB0b3RhbCwgc28gZmlyc3QgYXNzZXJ0IHRoYXQgdGhlIGxvbmcgaXMKLQkgICBub3JtYWxpemVkLiAqLwotCWFzc2VydChuZGlnaXRzID09IDAgfHwgdi0+b2JfZGlnaXRbbmRpZ2l0cyAtIDFdICE9IDApOwotCWogPSAwOwotCWFjY3VtID0gMDsKLQlhY2N1bWJpdHMgPSAwOwotCWNhcnJ5ID0gZG9fdHdvc19jb21wID8gMSA6IDA7Ci0JZm9yIChpID0gMDsgaSA8IG5kaWdpdHM7ICsraSkgewotCQlkaWdpdCB0aGlzZGlnaXQgPSB2LT5vYl9kaWdpdFtpXTsKLQkJaWYgKGRvX3R3b3NfY29tcCkgewotCQkJdGhpc2RpZ2l0ID0gKHRoaXNkaWdpdCBeIFB5TG9uZ19NQVNLKSArIGNhcnJ5OwotCQkJY2FycnkgPSB0aGlzZGlnaXQgPj4gUHlMb25nX1NISUZUOwotCQkJdGhpc2RpZ2l0ICY9IFB5TG9uZ19NQVNLOwotCQl9Ci0JCS8qIEJlY2F1c2Ugd2UncmUgZ29pbmcgTFNCIHRvIE1TQiwgdGhpc2RpZ2l0IGlzIG1vcmUKLQkJICAgc2lnbmlmaWNhbnQgdGhhbiB3aGF0J3MgYWxyZWFkeSBpbiBhY2N1bSwgc28gbmVlZHMgdG8gYmUKLQkJICAgcHJlcGVuZGVkIHRvIGFjY3VtLiAqLwotCQlhY2N1bSB8PSAodHdvZGlnaXRzKXRoaXNkaWdpdCA8PCBhY2N1bWJpdHM7CisgICAgLyogQ29weSBvdmVyIGFsbCB0aGUgUHl0aG9uIGRpZ2l0cy4KKyAgICAgICBJdCdzIGNydWNpYWwgdGhhdCBldmVyeSBQeXRob24gZGlnaXQgZXhjZXB0IGZvciB0aGUgTVNEIGNvbnRyaWJ1dGUKKyAgICAgICBleGFjdGx5IFB5TG9uZ19TSElGVCBiaXRzIHRvIHRoZSB0b3RhbCwgc28gZmlyc3QgYXNzZXJ0IHRoYXQgdGhlIGxvbmcgaXMKKyAgICAgICBub3JtYWxpemVkLiAqLworICAgIGFzc2VydChuZGlnaXRzID09IDAgfHwgdi0+b2JfZGlnaXRbbmRpZ2l0cyAtIDFdICE9IDApOworICAgIGogPSAwOworICAgIGFjY3VtID0gMDsKKyAgICBhY2N1bWJpdHMgPSAwOworICAgIGNhcnJ5ID0gZG9fdHdvc19jb21wID8gMSA6IDA7CisgICAgZm9yIChpID0gMDsgaSA8IG5kaWdpdHM7ICsraSkgeworICAgICAgICBkaWdpdCB0aGlzZGlnaXQgPSB2LT5vYl9kaWdpdFtpXTsKKyAgICAgICAgaWYgKGRvX3R3b3NfY29tcCkgeworICAgICAgICAgICAgdGhpc2RpZ2l0ID0gKHRoaXNkaWdpdCBeIFB5TG9uZ19NQVNLKSArIGNhcnJ5OworICAgICAgICAgICAgY2FycnkgPSB0aGlzZGlnaXQgPj4gUHlMb25nX1NISUZUOworICAgICAgICAgICAgdGhpc2RpZ2l0ICY9IFB5TG9uZ19NQVNLOworICAgICAgICB9CisgICAgICAgIC8qIEJlY2F1c2Ugd2UncmUgZ29pbmcgTFNCIHRvIE1TQiwgdGhpc2RpZ2l0IGlzIG1vcmUKKyAgICAgICAgICAgc2lnbmlmaWNhbnQgdGhhbiB3aGF0J3MgYWxyZWFkeSBpbiBhY2N1bSwgc28gbmVlZHMgdG8gYmUKKyAgICAgICAgICAgcHJlcGVuZGVkIHRvIGFjY3VtLiAqLworICAgICAgICBhY2N1bSB8PSAodHdvZGlnaXRzKXRoaXNkaWdpdCA8PCBhY2N1bWJpdHM7CiAKLQkJLyogVGhlIG1vc3Qtc2lnbmlmaWNhbnQgZGlnaXQgbWF5IGJlIChwcm9iYWJseSBpcykgYXQgbGVhc3QKLQkJICAgcGFydGx5IGVtcHR5LiAqLwotCQlpZiAoaSA9PSBuZGlnaXRzIC0gMSkgewotCQkJLyogQ291bnQgIyBvZiBzaWduIGJpdHMgLS0gdGhleSBuZWVkbid0IGJlIHN0b3JlZCwKLQkJCSAqIGFsdGhvdWdoIGZvciBzaWduZWQgY29udmVyc2lvbiB3ZSBuZWVkIGxhdGVyIHRvCi0JCQkgKiBtYWtlIHN1cmUgYXQgbGVhc3Qgb25lIHNpZ24gYml0IGdldHMgc3RvcmVkLiAqLwotCQkJZGlnaXQgcyA9IGRvX3R3b3NfY29tcCA/IHRoaXNkaWdpdCBeIFB5TG9uZ19NQVNLIDoKLQkJCQkgICAgICAgICAgICAgICAgdGhpc2RpZ2l0OwotCQkJd2hpbGUgKHMgIT0gMCkgewotCQkJCXMgPj49IDE7Ci0JCQkJYWNjdW1iaXRzKys7Ci0JCQl9Ci0JCX0KLQkJZWxzZQotCQkJYWNjdW1iaXRzICs9IFB5TG9uZ19TSElGVDsKKyAgICAgICAgLyogVGhlIG1vc3Qtc2lnbmlmaWNhbnQgZGlnaXQgbWF5IGJlIChwcm9iYWJseSBpcykgYXQgbGVhc3QKKyAgICAgICAgICAgcGFydGx5IGVtcHR5LiAqLworICAgICAgICBpZiAoaSA9PSBuZGlnaXRzIC0gMSkgeworICAgICAgICAgICAgLyogQ291bnQgIyBvZiBzaWduIGJpdHMgLS0gdGhleSBuZWVkbid0IGJlIHN0b3JlZCwKKyAgICAgICAgICAgICAqIGFsdGhvdWdoIGZvciBzaWduZWQgY29udmVyc2lvbiB3ZSBuZWVkIGxhdGVyIHRvCisgICAgICAgICAgICAgKiBtYWtlIHN1cmUgYXQgbGVhc3Qgb25lIHNpZ24gYml0IGdldHMgc3RvcmVkLiAqLworICAgICAgICAgICAgZGlnaXQgcyA9IGRvX3R3b3NfY29tcCA/IHRoaXNkaWdpdCBeIFB5TG9uZ19NQVNLIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNkaWdpdDsKKyAgICAgICAgICAgIHdoaWxlIChzICE9IDApIHsKKyAgICAgICAgICAgICAgICBzID4+PSAxOworICAgICAgICAgICAgICAgIGFjY3VtYml0cysrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGFjY3VtYml0cyArPSBQeUxvbmdfU0hJRlQ7CiAKLQkJLyogU3RvcmUgYXMgbWFueSBieXRlcyBhcyBwb3NzaWJsZS4gKi8KLQkJd2hpbGUgKGFjY3VtYml0cyA+PSA4KSB7Ci0JCQlpZiAoaiA+PSBuKQotCQkJCWdvdG8gT3ZlcmZsb3c7Ci0JCQkrK2o7Ci0JCQkqcCA9ICh1bnNpZ25lZCBjaGFyKShhY2N1bSAmIDB4ZmYpOwotCQkJcCArPSBwaW5jcjsKLQkJCWFjY3VtYml0cyAtPSA4OwotCQkJYWNjdW0gPj49IDg7Ci0JCX0KLQl9CisgICAgICAgIC8qIFN0b3JlIGFzIG1hbnkgYnl0ZXMgYXMgcG9zc2libGUuICovCisgICAgICAgIHdoaWxlIChhY2N1bWJpdHMgPj0gOCkgeworICAgICAgICAgICAgaWYgKGogPj0gbikKKyAgICAgICAgICAgICAgICBnb3RvIE92ZXJmbG93OworICAgICAgICAgICAgKytqOworICAgICAgICAgICAgKnAgPSAodW5zaWduZWQgY2hhcikoYWNjdW0gJiAweGZmKTsKKyAgICAgICAgICAgIHAgKz0gcGluY3I7CisgICAgICAgICAgICBhY2N1bWJpdHMgLT0gODsKKyAgICAgICAgICAgIGFjY3VtID4+PSA4OworICAgICAgICB9CisgICAgfQogCi0JLyogU3RvcmUgdGhlIHN0cmFnZ2xlciAoaWYgYW55KS4gKi8KLQlhc3NlcnQoYWNjdW1iaXRzIDwgOCk7Ci0JYXNzZXJ0KGNhcnJ5ID09IDApOyAgLyogZWxzZSBkb190d29zX2NvbXAgYW5kICpldmVyeSogZGlnaXQgd2FzIDAgKi8KLQlpZiAoYWNjdW1iaXRzID4gMCkgewotCQlpZiAoaiA+PSBuKQotCQkJZ290byBPdmVyZmxvdzsKLQkJKytqOwotCQlpZiAoZG9fdHdvc19jb21wKSB7Ci0JCQkvKiBGaWxsIGxlYWRpbmcgYml0cyBvZiB0aGUgYnl0ZSB3aXRoIHNpZ24gYml0cwotCQkJICAgKGFwcHJvcHJpYXRlbHkgcHJldGVuZGluZyB0aGF0IHRoZSBsb25nIGhhZCBhbgotCQkJICAgaW5maW5pdGUgc3VwcGx5IG9mIHNpZ24gYml0cykuICovCi0JCQlhY2N1bSB8PSAofih0d29kaWdpdHMpMCkgPDwgYWNjdW1iaXRzOwotCQl9Ci0JCSpwID0gKHVuc2lnbmVkIGNoYXIpKGFjY3VtICYgMHhmZik7Ci0JCXAgKz0gcGluY3I7Ci0JfQotCWVsc2UgaWYgKGogPT0gbiAmJiBuID4gMCAmJiBpc19zaWduZWQpIHsKLQkJLyogVGhlIG1haW4gbG9vcCBmaWxsZWQgdGhlIGJ5dGUgYXJyYXkgZXhhY3RseSwgc28gdGhlIGNvZGUKLQkJICAganVzdCBhYm92ZSBkaWRuJ3QgZ2V0IHRvIGVuc3VyZSB0aGVyZSdzIGEgc2lnbiBiaXQsIGFuZCB0aGUKLQkJICAgbG9vcCBiZWxvdyB3b3VsZG4ndCBhZGQgb25lIGVpdGhlci4gIE1ha2Ugc3VyZSBhIHNpZ24gYml0Ci0JCSAgIGV4aXN0cy4gKi8KLQkJdW5zaWduZWQgY2hhciBtc2IgPSAqKHAgLSBwaW5jcik7Ci0JCWludCBzaWduX2JpdF9zZXQgPSBtc2IgPj0gMHg4MDsKLQkJYXNzZXJ0KGFjY3VtYml0cyA9PSAwKTsKLQkJaWYgKHNpZ25fYml0X3NldCA9PSBkb190d29zX2NvbXApCi0JCQlyZXR1cm4gMDsKLQkJZWxzZQotCQkJZ290byBPdmVyZmxvdzsKLQl9CisgICAgLyogU3RvcmUgdGhlIHN0cmFnZ2xlciAoaWYgYW55KS4gKi8KKyAgICBhc3NlcnQoYWNjdW1iaXRzIDwgOCk7CisgICAgYXNzZXJ0KGNhcnJ5ID09IDApOyAgLyogZWxzZSBkb190d29zX2NvbXAgYW5kICpldmVyeSogZGlnaXQgd2FzIDAgKi8KKyAgICBpZiAoYWNjdW1iaXRzID4gMCkgeworICAgICAgICBpZiAoaiA+PSBuKQorICAgICAgICAgICAgZ290byBPdmVyZmxvdzsKKyAgICAgICAgKytqOworICAgICAgICBpZiAoZG9fdHdvc19jb21wKSB7CisgICAgICAgICAgICAvKiBGaWxsIGxlYWRpbmcgYml0cyBvZiB0aGUgYnl0ZSB3aXRoIHNpZ24gYml0cworICAgICAgICAgICAgICAgKGFwcHJvcHJpYXRlbHkgcHJldGVuZGluZyB0aGF0IHRoZSBsb25nIGhhZCBhbgorICAgICAgICAgICAgICAgaW5maW5pdGUgc3VwcGx5IG9mIHNpZ24gYml0cykuICovCisgICAgICAgICAgICBhY2N1bSB8PSAofih0d29kaWdpdHMpMCkgPDwgYWNjdW1iaXRzOworICAgICAgICB9CisgICAgICAgICpwID0gKHVuc2lnbmVkIGNoYXIpKGFjY3VtICYgMHhmZik7CisgICAgICAgIHAgKz0gcGluY3I7CisgICAgfQorICAgIGVsc2UgaWYgKGogPT0gbiAmJiBuID4gMCAmJiBpc19zaWduZWQpIHsKKyAgICAgICAgLyogVGhlIG1haW4gbG9vcCBmaWxsZWQgdGhlIGJ5dGUgYXJyYXkgZXhhY3RseSwgc28gdGhlIGNvZGUKKyAgICAgICAgICAganVzdCBhYm92ZSBkaWRuJ3QgZ2V0IHRvIGVuc3VyZSB0aGVyZSdzIGEgc2lnbiBiaXQsIGFuZCB0aGUKKyAgICAgICAgICAgbG9vcCBiZWxvdyB3b3VsZG4ndCBhZGQgb25lIGVpdGhlci4gIE1ha2Ugc3VyZSBhIHNpZ24gYml0CisgICAgICAgICAgIGV4aXN0cy4gKi8KKyAgICAgICAgdW5zaWduZWQgY2hhciBtc2IgPSAqKHAgLSBwaW5jcik7CisgICAgICAgIGludCBzaWduX2JpdF9zZXQgPSBtc2IgPj0gMHg4MDsKKyAgICAgICAgYXNzZXJ0KGFjY3VtYml0cyA9PSAwKTsKKyAgICAgICAgaWYgKHNpZ25fYml0X3NldCA9PSBkb190d29zX2NvbXApCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZ290byBPdmVyZmxvdzsKKyAgICB9CiAKLQkvKiBGaWxsIHJlbWFpbmluZyBieXRlcyB3aXRoIGNvcGllcyBvZiB0aGUgc2lnbiBiaXQuICovCi0JewotCQl1bnNpZ25lZCBjaGFyIHNpZ25ieXRlID0gZG9fdHdvc19jb21wID8gMHhmZlUgOiAwVTsKLQkJZm9yICggOyBqIDwgbjsgKytqLCBwICs9IHBpbmNyKQotCQkJKnAgPSBzaWduYnl0ZTsKLQl9CisgICAgLyogRmlsbCByZW1haW5pbmcgYnl0ZXMgd2l0aCBjb3BpZXMgb2YgdGhlIHNpZ24gYml0LiAqLworICAgIHsKKyAgICAgICAgdW5zaWduZWQgY2hhciBzaWduYnl0ZSA9IGRvX3R3b3NfY29tcCA/IDB4ZmZVIDogMFU7CisgICAgICAgIGZvciAoIDsgaiA8IG47ICsraiwgcCArPSBwaW5jcikKKyAgICAgICAgICAgICpwID0gc2lnbmJ5dGU7CisgICAgfQogCi0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiAKIE92ZXJmbG93OgotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLCAibG9uZyB0b28gYmlnIHRvIGNvbnZlcnQiKTsKLQlyZXR1cm4gLTE7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsICJsb25nIHRvbyBiaWcgdG8gY29udmVydCIpOworICAgIHJldHVybiAtMTsKIAogfQogCkBAIC02ODUsNDIgKzY4NSw0MiBAQAogICAgbGVhc3Qgb25lIHJvdW5kIGJpdCB0byBzdGFuZCBpbiBmb3IgdGhlIGlnbm9yZWQgbGVhc3Qtc2lnbmlmaWNhbnQgYml0cy4KICovCiAjZGVmaW5lIE5CSVRTX1dBTlRFRCA1NwotCVB5TG9uZ09iamVjdCAqdjsKLQlkb3VibGUgeDsKLQljb25zdCBkb3VibGUgbXVsdGlwbGllciA9IChkb3VibGUpKDFMIDw8IFB5TG9uZ19TSElGVCk7Ci0JUHlfc3NpemVfdCBpOwotCWludCBzaWduOwotCWludCBuYml0c25lZWRlZDsKKyAgICBQeUxvbmdPYmplY3QgKnY7CisgICAgZG91YmxlIHg7CisgICAgY29uc3QgZG91YmxlIG11bHRpcGxpZXIgPSAoZG91YmxlKSgxTCA8PCBQeUxvbmdfU0hJRlQpOworICAgIFB5X3NzaXplX3QgaTsKKyAgICBpbnQgc2lnbjsKKyAgICBpbnQgbmJpdHNuZWVkZWQ7CiAKLQlpZiAodnYgPT0gTlVMTCB8fCAhUHlMb25nX0NoZWNrKHZ2KSkgewotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIC0xOwotCX0KLQl2ID0gKFB5TG9uZ09iamVjdCAqKXZ2OwotCWkgPSBQeV9TSVpFKHYpOwotCXNpZ24gPSAxOwotCWlmIChpIDwgMCkgewotCQlzaWduID0gLTE7Ci0JCWkgPSAtKGkpOwotCX0KLQllbHNlIGlmIChpID09IDApIHsKLQkJKmV4cG9uZW50ID0gMDsKLQkJcmV0dXJuIDAuMDsKLQl9Ci0JLS1pOwotCXggPSAoZG91YmxlKXYtPm9iX2RpZ2l0W2ldOwotCW5iaXRzbmVlZGVkID0gTkJJVFNfV0FOVEVEIC0gMTsKLQkvKiBJbnZhcmlhbnQ6ICBpIFB5dGhvbiBkaWdpdHMgcmVtYWluIHVuYWNjb3VudGVkIGZvci4gKi8KLQl3aGlsZSAoaSA+IDAgJiYgbmJpdHNuZWVkZWQgPiAwKSB7Ci0JCS0taTsKLQkJeCA9IHggKiBtdWx0aXBsaWVyICsgKGRvdWJsZSl2LT5vYl9kaWdpdFtpXTsKLQkJbmJpdHNuZWVkZWQgLT0gUHlMb25nX1NISUZUOwotCX0KLQkvKiBUaGVyZSBhcmUgaSBkaWdpdHMgd2UgZGlkbid0IHNoaWZ0IGluLiAgUHJldGVuZGluZyB0aGV5J3JlIGFsbAotCSAgIHplcm9lcywgdGhlIHRydWUgdmFsdWUgaXMgeCAqIDIqKihpKlB5TG9uZ19TSElGVCkuICovCi0JKmV4cG9uZW50ID0gaTsKLQlhc3NlcnQoeCA+IDAuMCk7Ci0JcmV0dXJuIHggKiBzaWduOworICAgIGlmICh2diA9PSBOVUxMIHx8ICFQeUxvbmdfQ2hlY2sodnYpKSB7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHYgPSAoUHlMb25nT2JqZWN0ICopdnY7CisgICAgaSA9IFB5X1NJWkUodik7CisgICAgc2lnbiA9IDE7CisgICAgaWYgKGkgPCAwKSB7CisgICAgICAgIHNpZ24gPSAtMTsKKyAgICAgICAgaSA9IC0oaSk7CisgICAgfQorICAgIGVsc2UgaWYgKGkgPT0gMCkgeworICAgICAgICAqZXhwb25lbnQgPSAwOworICAgICAgICByZXR1cm4gMC4wOworICAgIH0KKyAgICAtLWk7CisgICAgeCA9IChkb3VibGUpdi0+b2JfZGlnaXRbaV07CisgICAgbmJpdHNuZWVkZWQgPSBOQklUU19XQU5URUQgLSAxOworICAgIC8qIEludmFyaWFudDogIGkgUHl0aG9uIGRpZ2l0cyByZW1haW4gdW5hY2NvdW50ZWQgZm9yLiAqLworICAgIHdoaWxlIChpID4gMCAmJiBuYml0c25lZWRlZCA+IDApIHsKKyAgICAgICAgLS1pOworICAgICAgICB4ID0geCAqIG11bHRpcGxpZXIgKyAoZG91YmxlKXYtPm9iX2RpZ2l0W2ldOworICAgICAgICBuYml0c25lZWRlZCAtPSBQeUxvbmdfU0hJRlQ7CisgICAgfQorICAgIC8qIFRoZXJlIGFyZSBpIGRpZ2l0cyB3ZSBkaWRuJ3Qgc2hpZnQgaW4uICBQcmV0ZW5kaW5nIHRoZXkncmUgYWxsCisgICAgICAgemVyb2VzLCB0aGUgdHJ1ZSB2YWx1ZSBpcyB4ICogMioqKGkqUHlMb25nX1NISUZUKS4gKi8KKyAgICAqZXhwb25lbnQgPSBpOworICAgIGFzc2VydCh4ID4gMC4wKTsKKyAgICByZXR1cm4geCAqIHNpZ247CiAjdW5kZWYgTkJJVFNfV0FOVEVECiB9CiAKQEAgLTcyOSwzMSArNzI5LDMxIEBACiBkb3VibGUKIFB5TG9uZ19Bc0RvdWJsZShQeU9iamVjdCAqdnYpCiB7Ci0JaW50IGUgPSAtMTsKLQlkb3VibGUgeDsKKyAgICBpbnQgZSA9IC0xOworICAgIGRvdWJsZSB4OwogCi0JaWYgKHZ2ID09IE5VTEwgfHwgIVB5TG9uZ19DaGVjayh2dikpIHsKLQkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JeCA9IF9QeUxvbmdfQXNTY2FsZWREb3VibGUodnYsICZlKTsKLQlpZiAoeCA9PSAtMS4wICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiAtMS4wOwotCS8qICdlJyBpbml0aWFsaXplZCB0byAtMSB0byBzaWxlbmNlIGdjYy00LjAueCwgYnV0IGl0IHNob3VsZCBiZQotCSAgIHNldCBjb3JyZWN0bHkgYWZ0ZXIgYSBzdWNjZXNzZnVsIF9QeUxvbmdfQXNTY2FsZWREb3VibGUoKSBjYWxsICovCi0JYXNzZXJ0KGUgPj0gMCk7Ci0JaWYgKGUgPiBJTlRfTUFYIC8gUHlMb25nX1NISUZUKQotCQlnb3RvIG92ZXJmbG93OwotCWVycm5vID0gMDsKLQl4ID0gbGRleHAoeCwgZSAqIFB5TG9uZ19TSElGVCk7Ci0JaWYgKFB5X09WRVJGTE9XRUQoeCkpCi0JCWdvdG8gb3ZlcmZsb3c7Ci0JcmV0dXJuIHg7CisgICAgaWYgKHZ2ID09IE5VTEwgfHwgIVB5TG9uZ19DaGVjayh2dikpIHsKKyAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgeCA9IF9QeUxvbmdfQXNTY2FsZWREb3VibGUodnYsICZlKTsKKyAgICBpZiAoeCA9PSAtMS4wICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiAtMS4wOworICAgIC8qICdlJyBpbml0aWFsaXplZCB0byAtMSB0byBzaWxlbmNlIGdjYy00LjAueCwgYnV0IGl0IHNob3VsZCBiZQorICAgICAgIHNldCBjb3JyZWN0bHkgYWZ0ZXIgYSBzdWNjZXNzZnVsIF9QeUxvbmdfQXNTY2FsZWREb3VibGUoKSBjYWxsICovCisgICAgYXNzZXJ0KGUgPj0gMCk7CisgICAgaWYgKGUgPiBJTlRfTUFYIC8gUHlMb25nX1NISUZUKQorICAgICAgICBnb3RvIG92ZXJmbG93OworICAgIGVycm5vID0gMDsKKyAgICB4ID0gbGRleHAoeCwgZSAqIFB5TG9uZ19TSElGVCk7CisgICAgaWYgKFB5X09WRVJGTE9XRUQoeCkpCisgICAgICAgIGdvdG8gb3ZlcmZsb3c7CisgICAgcmV0dXJuIHg7CiAKIG92ZXJmbG93OgotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkibG9uZyBpbnQgdG9vIGxhcmdlIHRvIGNvbnZlcnQgdG8gZmxvYXQiKTsKLQlyZXR1cm4gLTEuMDsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgImxvbmcgaW50IHRvbyBsYXJnZSB0byBjb252ZXJ0IHRvIGZsb2F0Iik7CisgICAgcmV0dXJuIC0xLjA7CiB9CiAKIC8qIENyZWF0ZSBhIG5ldyBsb25nIChvciBpbnQpIG9iamVjdCBmcm9tIGEgQyBwb2ludGVyICovCkBAIC03NjIsOSArNzYyLDkgQEAKIFB5TG9uZ19Gcm9tVm9pZFB0cih2b2lkICpwKQogewogI2lmIFNJWkVPRl9WT0lEX1AgPD0gU0laRU9GX0xPTkcKLQlpZiAoKGxvbmcpcCA8IDApCi0JCXJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZygodW5zaWduZWQgbG9uZylwKTsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpcCk7CisgICAgaWYgKChsb25nKXAgPCAwKQorICAgICAgICByZXR1cm4gUHlMb25nX0Zyb21VbnNpZ25lZExvbmcoKHVuc2lnbmVkIGxvbmcpcCk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKXApOwogI2Vsc2UKIAogI2lmbmRlZiBIQVZFX0xPTkdfTE9ORwpAQCAtNzczLDEwICs3NzMsMTAgQEAKICNpZiBTSVpFT0ZfTE9OR19MT05HIDwgU0laRU9GX1ZPSURfUAogIyAgIGVycm9yICJQeUxvbmdfRnJvbVZvaWRQdHI6IHNpemVvZihQWV9MT05HX0xPTkcpIDwgc2l6ZW9mKHZvaWQqKSIKICNlbmRpZgotCS8qIG9wdGltaXplIG51bGwgcG9pbnRlcnMgKi8KLQlpZiAocCA9PSBOVUxMKQotCQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoMCk7Ci0JcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nTG9uZygodW5zaWduZWQgUFlfTE9OR19MT05HKXApOworICAgIC8qIG9wdGltaXplIG51bGwgcG9pbnRlcnMgKi8KKyAgICBpZiAocCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoMCk7CisgICAgcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nTG9uZygodW5zaWduZWQgUFlfTE9OR19MT05HKXApOwogCiAjZW5kaWYgLyogU0laRU9GX1ZPSURfUCA8PSBTSVpFT0ZfTE9ORyAqLwogfQpAQCAtNzg2LDE5ICs3ODYsMTkgQEAKIHZvaWQgKgogUHlMb25nX0FzVm9pZFB0cihQeU9iamVjdCAqdnYpCiB7Ci0JLyogVGhpcyBmdW5jdGlvbiB3aWxsIGFsbG93IGludCBvciBsb25nIG9iamVjdHMuIElmIHZ2IGlzIG5laXRoZXIsCi0JICAgdGhlbiB0aGUgUHlMb25nX0FzTG9uZyooKSBmdW5jdGlvbnMgd2lsbCByYWlzZSB0aGUgZXhjZXB0aW9uOgotCSAgIFB5RXhjX1N5c3RlbUVycm9yLCAiYmFkIGFyZ3VtZW50IHRvIGludGVybmFsIGZ1bmN0aW9uIgotCSovCisgICAgLyogVGhpcyBmdW5jdGlvbiB3aWxsIGFsbG93IGludCBvciBsb25nIG9iamVjdHMuIElmIHZ2IGlzIG5laXRoZXIsCisgICAgICAgdGhlbiB0aGUgUHlMb25nX0FzTG9uZyooKSBmdW5jdGlvbnMgd2lsbCByYWlzZSB0aGUgZXhjZXB0aW9uOgorICAgICAgIFB5RXhjX1N5c3RlbUVycm9yLCAiYmFkIGFyZ3VtZW50IHRvIGludGVybmFsIGZ1bmN0aW9uIgorICAgICovCiAjaWYgU0laRU9GX1ZPSURfUCA8PSBTSVpFT0ZfTE9ORwotCWxvbmcgeDsKKyAgICBsb25nIHg7CiAKLQlpZiAoUHlJbnRfQ2hlY2sodnYpKQotCQl4ID0gUHlJbnRfQVNfTE9ORyh2dik7Ci0JZWxzZSBpZiAoUHlMb25nX0NoZWNrKHZ2KSAmJiBfUHlMb25nX1NpZ24odnYpIDwgMCkKLQkJeCA9IFB5TG9uZ19Bc0xvbmcodnYpOwotCWVsc2UKLQkJeCA9IFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZyh2dik7CisgICAgaWYgKFB5SW50X0NoZWNrKHZ2KSkKKyAgICAgICAgeCA9IFB5SW50X0FTX0xPTkcodnYpOworICAgIGVsc2UgaWYgKFB5TG9uZ19DaGVjayh2dikgJiYgX1B5TG9uZ19TaWduKHZ2KSA8IDApCisgICAgICAgIHggPSBQeUxvbmdfQXNMb25nKHZ2KTsKKyAgICBlbHNlCisgICAgICAgIHggPSBQeUxvbmdfQXNVbnNpZ25lZExvbmcodnYpOwogI2Vsc2UKIAogI2lmbmRlZiBIQVZFX0xPTkdfTE9ORwpAQCAtODA3LDIwICs4MDcsMjAgQEAKICNpZiBTSVpFT0ZfTE9OR19MT05HIDwgU0laRU9GX1ZPSURfUAogIyAgIGVycm9yICJQeUxvbmdfQXNWb2lkUHRyOiBzaXplb2YoUFlfTE9OR19MT05HKSA8IHNpemVvZih2b2lkKikiCiAjZW5kaWYKLQlQWV9MT05HX0xPTkcgeDsKKyAgICBQWV9MT05HX0xPTkcgeDsKIAotCWlmIChQeUludF9DaGVjayh2dikpCi0JCXggPSBQeUludF9BU19MT05HKHZ2KTsKLQllbHNlIGlmIChQeUxvbmdfQ2hlY2sodnYpICYmIF9QeUxvbmdfU2lnbih2dikgPCAwKQotCQl4ID0gUHlMb25nX0FzTG9uZ0xvbmcodnYpOwotCWVsc2UKLQkJeCA9IFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ0xvbmcodnYpOworICAgIGlmIChQeUludF9DaGVjayh2dikpCisgICAgICAgIHggPSBQeUludF9BU19MT05HKHZ2KTsKKyAgICBlbHNlIGlmIChQeUxvbmdfQ2hlY2sodnYpICYmIF9QeUxvbmdfU2lnbih2dikgPCAwKQorICAgICAgICB4ID0gUHlMb25nX0FzTG9uZ0xvbmcodnYpOworICAgIGVsc2UKKyAgICAgICAgeCA9IFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ0xvbmcodnYpOwogCiAjZW5kaWYgLyogU0laRU9GX1ZPSURfUCA8PSBTSVpFT0ZfTE9ORyAqLwogCi0JaWYgKHggPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuICh2b2lkICopeDsKKyAgICBpZiAoeCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gKHZvaWQgKil4OwogfQogCiAjaWZkZWYgSEFWRV9MT05HX0xPTkcKQEAgLTgzNiw0MiArODM2LDQyIEBACiBQeU9iamVjdCAqCiBQeUxvbmdfRnJvbUxvbmdMb25nKFBZX0xPTkdfTE9ORyBpdmFsKQogewotCVB5TG9uZ09iamVjdCAqdjsKLQl1bnNpZ25lZCBQWV9MT05HX0xPTkcgYWJzX2l2YWw7Ci0JdW5zaWduZWQgUFlfTE9OR19MT05HIHQ7ICAvKiB1bnNpZ25lZCBzbyA+PiBkb2Vzbid0IHByb3BhZ2F0ZSBzaWduIGJpdCAqLwotCWludCBuZGlnaXRzID0gMDsKLQlpbnQgbmVnYXRpdmUgPSAwOworICAgIFB5TG9uZ09iamVjdCAqdjsKKyAgICB1bnNpZ25lZCBQWV9MT05HX0xPTkcgYWJzX2l2YWw7CisgICAgdW5zaWduZWQgUFlfTE9OR19MT05HIHQ7ICAvKiB1bnNpZ25lZCBzbyA+PiBkb2Vzbid0IHByb3BhZ2F0ZSBzaWduIGJpdCAqLworICAgIGludCBuZGlnaXRzID0gMDsKKyAgICBpbnQgbmVnYXRpdmUgPSAwOwogCi0JaWYgKGl2YWwgPCAwKSB7Ci0JCS8qIGF2b2lkIHNpZ25lZCBvdmVyZmxvdyBvbiBuZWdhdGlvbjsgIHNlZSBjb21tZW50cwotCQkgICBpbiBQeUxvbmdfRnJvbUxvbmcgYWJvdmUuICovCi0JCWFic19pdmFsID0gKHVuc2lnbmVkIFBZX0xPTkdfTE9ORykoLTEtaXZhbCkgKyAxOwotCQluZWdhdGl2ZSA9IDE7Ci0JfQotCWVsc2UgewotCQlhYnNfaXZhbCA9ICh1bnNpZ25lZCBQWV9MT05HX0xPTkcpaXZhbDsKLQl9CisgICAgaWYgKGl2YWwgPCAwKSB7CisgICAgICAgIC8qIGF2b2lkIHNpZ25lZCBvdmVyZmxvdyBvbiBuZWdhdGlvbjsgIHNlZSBjb21tZW50cworICAgICAgICAgICBpbiBQeUxvbmdfRnJvbUxvbmcgYWJvdmUuICovCisgICAgICAgIGFic19pdmFsID0gKHVuc2lnbmVkIFBZX0xPTkdfTE9ORykoLTEtaXZhbCkgKyAxOworICAgICAgICBuZWdhdGl2ZSA9IDE7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBhYnNfaXZhbCA9ICh1bnNpZ25lZCBQWV9MT05HX0xPTkcpaXZhbDsKKyAgICB9CiAKLQkvKiBDb3VudCB0aGUgbnVtYmVyIG9mIFB5dGhvbiBkaWdpdHMuCi0JICAgV2UgdXNlZCB0byBwaWNrIDUgKCJiaWcgZW5vdWdoIGZvciBhbnl0aGluZyIpLCBidXQgdGhhdCdzIGEKLQkgICB3YXN0ZSBvZiB0aW1lIGFuZCBzcGFjZSBnaXZlbiB0aGF0IDUqMTUgPSA3NSBiaXRzIGFyZSByYXJlbHkKLQkgICBuZWVkZWQuICovCi0JdCA9IGFic19pdmFsOwotCXdoaWxlICh0KSB7Ci0JCSsrbmRpZ2l0czsKLQkJdCA+Pj0gUHlMb25nX1NISUZUOwotCX0KLQl2ID0gX1B5TG9uZ19OZXcobmRpZ2l0cyk7Ci0JaWYgKHYgIT0gTlVMTCkgewotCQlkaWdpdCAqcCA9IHYtPm9iX2RpZ2l0OwotCQlQeV9TSVpFKHYpID0gbmVnYXRpdmUgPyAtbmRpZ2l0cyA6IG5kaWdpdHM7Ci0JCXQgPSBhYnNfaXZhbDsKLQkJd2hpbGUgKHQpIHsKLQkJCSpwKysgPSAoZGlnaXQpKHQgJiBQeUxvbmdfTUFTSyk7Ci0JCQl0ID4+PSBQeUxvbmdfU0hJRlQ7Ci0JCX0KLQl9Ci0JcmV0dXJuIChQeU9iamVjdCAqKXY7CisgICAgLyogQ291bnQgdGhlIG51bWJlciBvZiBQeXRob24gZGlnaXRzLgorICAgICAgIFdlIHVzZWQgdG8gcGljayA1ICgiYmlnIGVub3VnaCBmb3IgYW55dGhpbmciKSwgYnV0IHRoYXQncyBhCisgICAgICAgd2FzdGUgb2YgdGltZSBhbmQgc3BhY2UgZ2l2ZW4gdGhhdCA1KjE1ID0gNzUgYml0cyBhcmUgcmFyZWx5CisgICAgICAgbmVlZGVkLiAqLworICAgIHQgPSBhYnNfaXZhbDsKKyAgICB3aGlsZSAodCkgeworICAgICAgICArK25kaWdpdHM7CisgICAgICAgIHQgPj49IFB5TG9uZ19TSElGVDsKKyAgICB9CisgICAgdiA9IF9QeUxvbmdfTmV3KG5kaWdpdHMpOworICAgIGlmICh2ICE9IE5VTEwpIHsKKyAgICAgICAgZGlnaXQgKnAgPSB2LT5vYl9kaWdpdDsKKyAgICAgICAgUHlfU0laRSh2KSA9IG5lZ2F0aXZlID8gLW5kaWdpdHMgOiBuZGlnaXRzOworICAgICAgICB0ID0gYWJzX2l2YWw7CisgICAgICAgIHdoaWxlICh0KSB7CisgICAgICAgICAgICAqcCsrID0gKGRpZ2l0KSh0ICYgUHlMb25nX01BU0spOworICAgICAgICAgICAgdCA+Pj0gUHlMb25nX1NISUZUOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAoUHlPYmplY3QgKil2OwogfQogCiAvKiBDcmVhdGUgYSBuZXcgbG9uZyBpbnQgb2JqZWN0IGZyb20gYSBDIHVuc2lnbmVkIFBZX0xPTkdfTE9ORyBpbnQuICovCkBAIC04NzksMjYgKzg3OSwyNiBAQAogUHlPYmplY3QgKgogUHlMb25nX0Zyb21VbnNpZ25lZExvbmdMb25nKHVuc2lnbmVkIFBZX0xPTkdfTE9ORyBpdmFsKQogewotCVB5TG9uZ09iamVjdCAqdjsKLQl1bnNpZ25lZCBQWV9MT05HX0xPTkcgdDsKLQlpbnQgbmRpZ2l0cyA9IDA7CisgICAgUHlMb25nT2JqZWN0ICp2OworICAgIHVuc2lnbmVkIFBZX0xPTkdfTE9ORyB0OworICAgIGludCBuZGlnaXRzID0gMDsKIAotCS8qIENvdW50IHRoZSBudW1iZXIgb2YgUHl0aG9uIGRpZ2l0cy4gKi8KLQl0ID0gKHVuc2lnbmVkIFBZX0xPTkdfTE9ORylpdmFsOwotCXdoaWxlICh0KSB7Ci0JCSsrbmRpZ2l0czsKLQkJdCA+Pj0gUHlMb25nX1NISUZUOwotCX0KLQl2ID0gX1B5TG9uZ19OZXcobmRpZ2l0cyk7Ci0JaWYgKHYgIT0gTlVMTCkgewotCQlkaWdpdCAqcCA9IHYtPm9iX2RpZ2l0OwotCQlQeV9TSVpFKHYpID0gbmRpZ2l0czsKLQkJd2hpbGUgKGl2YWwpIHsKLQkJCSpwKysgPSAoZGlnaXQpKGl2YWwgJiBQeUxvbmdfTUFTSyk7Ci0JCQlpdmFsID4+PSBQeUxvbmdfU0hJRlQ7Ci0JCX0KLQl9Ci0JcmV0dXJuIChQeU9iamVjdCAqKXY7CisgICAgLyogQ291bnQgdGhlIG51bWJlciBvZiBQeXRob24gZGlnaXRzLiAqLworICAgIHQgPSAodW5zaWduZWQgUFlfTE9OR19MT05HKWl2YWw7CisgICAgd2hpbGUgKHQpIHsKKyAgICAgICAgKytuZGlnaXRzOworICAgICAgICB0ID4+PSBQeUxvbmdfU0hJRlQ7CisgICAgfQorICAgIHYgPSBfUHlMb25nX05ldyhuZGlnaXRzKTsKKyAgICBpZiAodiAhPSBOVUxMKSB7CisgICAgICAgIGRpZ2l0ICpwID0gdi0+b2JfZGlnaXQ7CisgICAgICAgIFB5X1NJWkUodikgPSBuZGlnaXRzOworICAgICAgICB3aGlsZSAoaXZhbCkgeworICAgICAgICAgICAgKnArKyA9IChkaWdpdCkoaXZhbCAmIFB5TG9uZ19NQVNLKTsKKyAgICAgICAgICAgIGl2YWwgPj49IFB5TG9uZ19TSElGVDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gKFB5T2JqZWN0ICopdjsKIH0KIAogLyogQ3JlYXRlIGEgbmV3IGxvbmcgaW50IG9iamVjdCBmcm9tIGEgQyBQeV9zc2l6ZV90LiAqLwpAQCAtOTA2LDExICs5MDYsMTEgQEAKIFB5T2JqZWN0ICoKIFB5TG9uZ19Gcm9tU3NpemVfdChQeV9zc2l6ZV90IGl2YWwpCiB7Ci0JUHlfc3NpemVfdCBieXRlcyA9IGl2YWw7Ci0JaW50IG9uZSA9IDE7Ci0JcmV0dXJuIF9QeUxvbmdfRnJvbUJ5dGVBcnJheSgKLQkJCSh1bnNpZ25lZCBjaGFyICopJmJ5dGVzLAotCQkJU0laRU9GX1NJWkVfVCwgSVNfTElUVExFX0VORElBTiwgMSk7CisgICAgUHlfc3NpemVfdCBieXRlcyA9IGl2YWw7CisgICAgaW50IG9uZSA9IDE7CisgICAgcmV0dXJuIF9QeUxvbmdfRnJvbUJ5dGVBcnJheSgKKyAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIgKikmYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgIFNJWkVPRl9TSVpFX1QsIElTX0xJVFRMRV9FTkRJQU4sIDEpOwogfQogCiAvKiBDcmVhdGUgYSBuZXcgbG9uZyBpbnQgb2JqZWN0IGZyb20gYSBDIHNpemVfdC4gKi8KQEAgLTkxOCwxMSArOTE4LDExIEBACiBQeU9iamVjdCAqCiBQeUxvbmdfRnJvbVNpemVfdChzaXplX3QgaXZhbCkKIHsKLQlzaXplX3QgYnl0ZXMgPSBpdmFsOwotCWludCBvbmUgPSAxOwotCXJldHVybiBfUHlMb25nX0Zyb21CeXRlQXJyYXkoCi0JCQkodW5zaWduZWQgY2hhciAqKSZieXRlcywKLQkJCVNJWkVPRl9TSVpFX1QsIElTX0xJVFRMRV9FTkRJQU4sIDApOworICAgIHNpemVfdCBieXRlcyA9IGl2YWw7CisgICAgaW50IG9uZSA9IDE7CisgICAgcmV0dXJuIF9QeUxvbmdfRnJvbUJ5dGVBcnJheSgKKyAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIgKikmYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgIFNJWkVPRl9TSVpFX1QsIElTX0xJVFRMRV9FTkRJQU4sIDApOwogfQogCiAvKiBHZXQgYSBDIFBZX0xPTkdfTE9ORyBpbnQgZnJvbSBhIGxvbmcgaW50IG9iamVjdC4KQEAgLTkzMSw1MSArOTMxLDUxIEBACiBQWV9MT05HX0xPTkcKIFB5TG9uZ19Bc0xvbmdMb25nKFB5T2JqZWN0ICp2dikKIHsKLQlQWV9MT05HX0xPTkcgYnl0ZXM7Ci0JaW50IG9uZSA9IDE7Ci0JaW50IHJlczsKKyAgICBQWV9MT05HX0xPTkcgYnl0ZXM7CisgICAgaW50IG9uZSA9IDE7CisgICAgaW50IHJlczsKIAotCWlmICh2diA9PSBOVUxMKSB7Ci0JCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmICghUHlMb25nX0NoZWNrKHZ2KSkgewotCQlQeU51bWJlck1ldGhvZHMgKm5iOwotCQlQeU9iamVjdCAqaW87Ci0JCWlmIChQeUludF9DaGVjayh2dikpCi0JCQlyZXR1cm4gKFBZX0xPTkdfTE9ORylQeUludF9Bc0xvbmcodnYpOwotCQlpZiAoKG5iID0gdnYtPm9iX3R5cGUtPnRwX2FzX251bWJlcikgPT0gTlVMTCB8fAotCQkgICAgbmItPm5iX2ludCA9PSBOVUxMKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYW4gaW50ZWdlciBpcyByZXF1aXJlZCIpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWlvID0gKCpuYi0+bmJfaW50KSAodnYpOwotCQlpZiAoaW8gPT0gTlVMTCkKLQkJCXJldHVybiAtMTsKLQkJaWYgKFB5SW50X0NoZWNrKGlvKSkgewotCQkJYnl0ZXMgPSBQeUludF9Bc0xvbmcoaW8pOwotCQkJUHlfREVDUkVGKGlvKTsKLQkJCXJldHVybiBieXRlczsKLQkJfQotCQlpZiAoUHlMb25nX0NoZWNrKGlvKSkgewotCQkJYnl0ZXMgPSBQeUxvbmdfQXNMb25nTG9uZyhpbyk7Ci0JCQlQeV9ERUNSRUYoaW8pOwotCQkJcmV0dXJuIGJ5dGVzOwotCQl9Ci0JCVB5X0RFQ1JFRihpbyk7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJpbnRlZ2VyIGNvbnZlcnNpb24gZmFpbGVkIik7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgaWYgKHZ2ID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKCFQeUxvbmdfQ2hlY2sodnYpKSB7CisgICAgICAgIFB5TnVtYmVyTWV0aG9kcyAqbmI7CisgICAgICAgIFB5T2JqZWN0ICppbzsKKyAgICAgICAgaWYgKFB5SW50X0NoZWNrKHZ2KSkKKyAgICAgICAgICAgIHJldHVybiAoUFlfTE9OR19MT05HKVB5SW50X0FzTG9uZyh2dik7CisgICAgICAgIGlmICgobmIgPSB2di0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyKSA9PSBOVUxMIHx8CisgICAgICAgICAgICBuYi0+bmJfaW50ID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJhbiBpbnRlZ2VyIGlzIHJlcXVpcmVkIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgaW8gPSAoKm5iLT5uYl9pbnQpICh2dik7CisgICAgICAgIGlmIChpbyA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBpZiAoUHlJbnRfQ2hlY2soaW8pKSB7CisgICAgICAgICAgICBieXRlcyA9IFB5SW50X0FzTG9uZyhpbyk7CisgICAgICAgICAgICBQeV9ERUNSRUYoaW8pOworICAgICAgICAgICAgcmV0dXJuIGJ5dGVzOworICAgICAgICB9CisgICAgICAgIGlmIChQeUxvbmdfQ2hlY2soaW8pKSB7CisgICAgICAgICAgICBieXRlcyA9IFB5TG9uZ19Bc0xvbmdMb25nKGlvKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihpbyk7CisgICAgICAgICAgICByZXR1cm4gYnl0ZXM7CisgICAgICAgIH0KKyAgICAgICAgUHlfREVDUkVGKGlvKTsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImludGVnZXIgY29udmVyc2lvbiBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCXJlcyA9IF9QeUxvbmdfQXNCeXRlQXJyYXkoCi0JCQkoUHlMb25nT2JqZWN0ICopdnYsICh1bnNpZ25lZCBjaGFyICopJmJ5dGVzLAotCQkJU0laRU9GX0xPTkdfTE9ORywgSVNfTElUVExFX0VORElBTiwgMSk7CisgICAgcmVzID0gX1B5TG9uZ19Bc0J5dGVBcnJheSgKKyAgICAgICAgICAgICAgICAgICAgKFB5TG9uZ09iamVjdCAqKXZ2LCAodW5zaWduZWQgY2hhciAqKSZieXRlcywKKyAgICAgICAgICAgICAgICAgICAgU0laRU9GX0xPTkdfTE9ORywgSVNfTElUVExFX0VORElBTiwgMSk7CiAKLQkvKiBQbGFuIDkgY2FuJ3QgaGFuZGxlIFBZX0xPTkdfTE9ORyBpbiA/IDogZXhwcmVzc2lvbnMgKi8KLQlpZiAocmVzIDwgMCkKLQkJcmV0dXJuIChQWV9MT05HX0xPTkcpLTE7Ci0JZWxzZQotCQlyZXR1cm4gYnl0ZXM7CisgICAgLyogUGxhbiA5IGNhbid0IGhhbmRsZSBQWV9MT05HX0xPTkcgaW4gPyA6IGV4cHJlc3Npb25zICovCisgICAgaWYgKHJlcyA8IDApCisgICAgICAgIHJldHVybiAoUFlfTE9OR19MT05HKS0xOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGJ5dGVzOwogfQogCiAvKiBHZXQgYSBDIHVuc2lnbmVkIFBZX0xPTkdfTE9ORyBpbnQgZnJvbSBhIGxvbmcgaW50IG9iamVjdC4KQEAgLTk4NCwyNCArOTg0LDI0IEBACiB1bnNpZ25lZCBQWV9MT05HX0xPTkcKIFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ0xvbmcoUHlPYmplY3QgKnZ2KQogewotCXVuc2lnbmVkIFBZX0xPTkdfTE9ORyBieXRlczsKLQlpbnQgb25lID0gMTsKLQlpbnQgcmVzOworICAgIHVuc2lnbmVkIFBZX0xPTkdfTE9ORyBieXRlczsKKyAgICBpbnQgb25lID0gMTsKKyAgICBpbnQgcmVzOwogCi0JaWYgKHZ2ID09IE5VTEwgfHwgIVB5TG9uZ19DaGVjayh2dikpIHsKLQkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0JCXJldHVybiAodW5zaWduZWQgUFlfTE9OR19MT05HKS0xOwotCX0KKyAgICBpZiAodnYgPT0gTlVMTCB8fCAhUHlMb25nX0NoZWNrKHZ2KSkgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuICh1bnNpZ25lZCBQWV9MT05HX0xPTkcpLTE7CisgICAgfQogCi0JcmVzID0gX1B5TG9uZ19Bc0J5dGVBcnJheSgKLQkJCShQeUxvbmdPYmplY3QgKil2diwgKHVuc2lnbmVkIGNoYXIgKikmYnl0ZXMsCi0JCQlTSVpFT0ZfTE9OR19MT05HLCBJU19MSVRUTEVfRU5ESUFOLCAwKTsKKyAgICByZXMgPSBfUHlMb25nX0FzQnl0ZUFycmF5KAorICAgICAgICAgICAgICAgICAgICAoUHlMb25nT2JqZWN0ICopdnYsICh1bnNpZ25lZCBjaGFyICopJmJ5dGVzLAorICAgICAgICAgICAgICAgICAgICBTSVpFT0ZfTE9OR19MT05HLCBJU19MSVRUTEVfRU5ESUFOLCAwKTsKIAotCS8qIFBsYW4gOSBjYW4ndCBoYW5kbGUgUFlfTE9OR19MT05HIGluID8gOiBleHByZXNzaW9ucyAqLwotCWlmIChyZXMgPCAwKQotCQlyZXR1cm4gKHVuc2lnbmVkIFBZX0xPTkdfTE9ORylyZXM7Ci0JZWxzZQotCQlyZXR1cm4gYnl0ZXM7CisgICAgLyogUGxhbiA5IGNhbid0IGhhbmRsZSBQWV9MT05HX0xPTkcgaW4gPyA6IGV4cHJlc3Npb25zICovCisgICAgaWYgKHJlcyA8IDApCisgICAgICAgIHJldHVybiAodW5zaWduZWQgUFlfTE9OR19MT05HKXJlczsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBieXRlczsKIH0KIAogLyogR2V0IGEgQyB1bnNpZ25lZCBsb25nIGludCBmcm9tIGEgbG9uZyBpbnQgb2JqZWN0LCBpZ25vcmluZyB0aGUgaGlnaCBiaXRzLgpAQCAtMTAxMCwyNyArMTAxMCwyNyBAQAogdW5zaWduZWQgUFlfTE9OR19MT05HCiBQeUxvbmdfQXNVbnNpZ25lZExvbmdMb25nTWFzayhQeU9iamVjdCAqdnYpCiB7Ci0JcmVnaXN0ZXIgUHlMb25nT2JqZWN0ICp2OwotCXVuc2lnbmVkIFBZX0xPTkdfTE9ORyB4OwotCVB5X3NzaXplX3QgaTsKLQlpbnQgc2lnbjsKKyAgICByZWdpc3RlciBQeUxvbmdPYmplY3QgKnY7CisgICAgdW5zaWduZWQgUFlfTE9OR19MT05HIHg7CisgICAgUHlfc3NpemVfdCBpOworICAgIGludCBzaWduOwogCi0JaWYgKHZ2ID09IE5VTEwgfHwgIVB5TG9uZ19DaGVjayh2dikpIHsKLQkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0JCXJldHVybiAodW5zaWduZWQgbG9uZykgLTE7Ci0JfQotCXYgPSAoUHlMb25nT2JqZWN0ICopdnY7Ci0JaSA9IHYtPm9iX3NpemU7Ci0Jc2lnbiA9IDE7Ci0JeCA9IDA7Ci0JaWYgKGkgPCAwKSB7Ci0JCXNpZ24gPSAtMTsKLQkJaSA9IC1pOwotCX0KLQl3aGlsZSAoLS1pID49IDApIHsKLQkJeCA9ICh4IDw8IFB5TG9uZ19TSElGVCkgKyB2LT5vYl9kaWdpdFtpXTsKLQl9Ci0JcmV0dXJuIHggKiBzaWduOworICAgIGlmICh2diA9PSBOVUxMIHx8ICFQeUxvbmdfQ2hlY2sodnYpKSB7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gKHVuc2lnbmVkIGxvbmcpIC0xOworICAgIH0KKyAgICB2ID0gKFB5TG9uZ09iamVjdCAqKXZ2OworICAgIGkgPSB2LT5vYl9zaXplOworICAgIHNpZ24gPSAxOworICAgIHggPSAwOworICAgIGlmIChpIDwgMCkgeworICAgICAgICBzaWduID0gLTE7CisgICAgICAgIGkgPSAtaTsKKyAgICB9CisgICAgd2hpbGUgKC0taSA+PSAwKSB7CisgICAgICAgIHggPSAoeCA8PCBQeUxvbmdfU0hJRlQpICsgdi0+b2JfZGlnaXRbaV07CisgICAgfQorICAgIHJldHVybiB4ICogc2lnbjsKIH0KICN1bmRlZiBJU19MSVRUTEVfRU5ESUFOCiAKQEAgLTEwMzksMzUgKzEwMzksMzUgQEAKIAogc3RhdGljIGludAogY29udmVydF9iaW5vcChQeU9iamVjdCAqdiwgUHlPYmplY3QgKncsIFB5TG9uZ09iamVjdCAqKmEsIFB5TG9uZ09iamVjdCAqKmIpIHsKLQlpZiAoUHlMb25nX0NoZWNrKHYpKSB7Ci0JCSphID0gKFB5TG9uZ09iamVjdCAqKSB2OwotCQlQeV9JTkNSRUYodik7Ci0JfQotCWVsc2UgaWYgKFB5SW50X0NoZWNrKHYpKSB7Ci0JCSphID0gKFB5TG9uZ09iamVjdCAqKSBQeUxvbmdfRnJvbUxvbmcoUHlJbnRfQVNfTE9ORyh2KSk7Ci0JfQotCWVsc2UgewotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKFB5TG9uZ19DaGVjayh3KSkgewotCQkqYiA9IChQeUxvbmdPYmplY3QgKikgdzsKLQkJUHlfSU5DUkVGKHcpOwotCX0KLQllbHNlIGlmIChQeUludF9DaGVjayh3KSkgewotCQkqYiA9IChQeUxvbmdPYmplY3QgKikgUHlMb25nX0Zyb21Mb25nKFB5SW50X0FTX0xPTkcodykpOwotCX0KLQllbHNlIHsKLQkJUHlfREVDUkVGKCphKTsKLQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiAxOworICAgIGlmIChQeUxvbmdfQ2hlY2sodikpIHsKKyAgICAgICAgKmEgPSAoUHlMb25nT2JqZWN0ICopIHY7CisgICAgICAgIFB5X0lOQ1JFRih2KTsKKyAgICB9CisgICAgZWxzZSBpZiAoUHlJbnRfQ2hlY2sodikpIHsKKyAgICAgICAgKmEgPSAoUHlMb25nT2JqZWN0ICopIFB5TG9uZ19Gcm9tTG9uZyhQeUludF9BU19MT05HKHYpKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoUHlMb25nX0NoZWNrKHcpKSB7CisgICAgICAgICpiID0gKFB5TG9uZ09iamVjdCAqKSB3OworICAgICAgICBQeV9JTkNSRUYodyk7CisgICAgfQorICAgIGVsc2UgaWYgKFB5SW50X0NoZWNrKHcpKSB7CisgICAgICAgICpiID0gKFB5TG9uZ09iamVjdCAqKSBQeUxvbmdfRnJvbUxvbmcoUHlJbnRfQVNfTE9ORyh3KSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeV9ERUNSRUYoKmEpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIDE7CiB9CiAKICNkZWZpbmUgQ09OVkVSVF9CSU5PUCh2LCB3LCBhLCBiKSBcCi0JaWYgKCFjb252ZXJ0X2Jpbm9wKHYsIHcsIGEsIGIpKSB7IFwKLQkJUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsgXAotCQlyZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7IFwKLQl9CisgICAgaWYgKCFjb252ZXJ0X2Jpbm9wKHYsIHcsIGEsIGIpKSB7IFwKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsgXAorICAgICAgICByZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7IFwKKyAgICB9CiAKIC8qIHhbMDptXSBhbmQgeVswOm5dIGFyZSBkaWdpdCB2ZWN0b3JzLCBMU0QgZmlyc3QsIG0gPj0gbiByZXF1aXJlZC4gIHhbMDpuXQogICogaXMgbW9kaWZpZWQgaW4gcGxhY2UsIGJ5IGFkZGluZyB5IHRvIGl0LiAgQ2FycmllcyBhcmUgcHJvcGFnYXRlZCBhcyBmYXIgYXMKQEAgLTEwNzYsMjMgKzEwNzYsMjMgQEAKIHN0YXRpYyBkaWdpdAogdl9pYWRkKGRpZ2l0ICp4LCBQeV9zc2l6ZV90IG0sIGRpZ2l0ICp5LCBQeV9zc2l6ZV90IG4pCiB7Ci0JUHlfc3NpemVfdCBpOwotCWRpZ2l0IGNhcnJ5ID0gMDsKKyAgICBQeV9zc2l6ZV90IGk7CisgICAgZGlnaXQgY2FycnkgPSAwOwogCi0JYXNzZXJ0KG0gPj0gbik7Ci0JZm9yIChpID0gMDsgaSA8IG47ICsraSkgewotCQljYXJyeSArPSB4W2ldICsgeVtpXTsKLQkJeFtpXSA9IGNhcnJ5ICYgUHlMb25nX01BU0s7Ci0JCWNhcnJ5ID4+PSBQeUxvbmdfU0hJRlQ7Ci0JCWFzc2VydCgoY2FycnkgJiAxKSA9PSBjYXJyeSk7Ci0JfQotCWZvciAoOyBjYXJyeSAmJiBpIDwgbTsgKytpKSB7Ci0JCWNhcnJ5ICs9IHhbaV07Ci0JCXhbaV0gPSBjYXJyeSAmIFB5TG9uZ19NQVNLOwotCQljYXJyeSA+Pj0gUHlMb25nX1NISUZUOwotCQlhc3NlcnQoKGNhcnJ5ICYgMSkgPT0gY2FycnkpOwotCX0KLQlyZXR1cm4gY2Fycnk7CisgICAgYXNzZXJ0KG0gPj0gbik7CisgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgeworICAgICAgICBjYXJyeSArPSB4W2ldICsgeVtpXTsKKyAgICAgICAgeFtpXSA9IGNhcnJ5ICYgUHlMb25nX01BU0s7CisgICAgICAgIGNhcnJ5ID4+PSBQeUxvbmdfU0hJRlQ7CisgICAgICAgIGFzc2VydCgoY2FycnkgJiAxKSA9PSBjYXJyeSk7CisgICAgfQorICAgIGZvciAoOyBjYXJyeSAmJiBpIDwgbTsgKytpKSB7CisgICAgICAgIGNhcnJ5ICs9IHhbaV07CisgICAgICAgIHhbaV0gPSBjYXJyeSAmIFB5TG9uZ19NQVNLOworICAgICAgICBjYXJyeSA+Pj0gUHlMb25nX1NISUZUOworICAgICAgICBhc3NlcnQoKGNhcnJ5ICYgMSkgPT0gY2FycnkpOworICAgIH0KKyAgICByZXR1cm4gY2Fycnk7CiB9CiAKIC8qIHhbMDptXSBhbmQgeVswOm5dIGFyZSBkaWdpdCB2ZWN0b3JzLCBMU0QgZmlyc3QsIG0gPj0gbiByZXF1aXJlZC4gIHhbMDpuXQpAQCAtMTEwMiwyMyArMTEwMiwyMyBAQAogc3RhdGljIGRpZ2l0CiB2X2lzdWIoZGlnaXQgKngsIFB5X3NzaXplX3QgbSwgZGlnaXQgKnksIFB5X3NzaXplX3QgbikKIHsKLQlQeV9zc2l6ZV90IGk7Ci0JZGlnaXQgYm9ycm93ID0gMDsKKyAgICBQeV9zc2l6ZV90IGk7CisgICAgZGlnaXQgYm9ycm93ID0gMDsKIAotCWFzc2VydChtID49IG4pOwotCWZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKLQkJYm9ycm93ID0geFtpXSAtIHlbaV0gLSBib3Jyb3c7Ci0JCXhbaV0gPSBib3Jyb3cgJiBQeUxvbmdfTUFTSzsKLQkJYm9ycm93ID4+PSBQeUxvbmdfU0hJRlQ7Ci0JCWJvcnJvdyAmPSAxOwkvKiBrZWVwIG9ubHkgMSBzaWduIGJpdCAqLwotCX0KLQlmb3IgKDsgYm9ycm93ICYmIGkgPCBtOyArK2kpIHsKLQkJYm9ycm93ID0geFtpXSAtIGJvcnJvdzsKLQkJeFtpXSA9IGJvcnJvdyAmIFB5TG9uZ19NQVNLOwotCQlib3Jyb3cgPj49IFB5TG9uZ19TSElGVDsKLQkJYm9ycm93ICY9IDE7Ci0JfQotCXJldHVybiBib3Jyb3c7CisgICAgYXNzZXJ0KG0gPj0gbik7CisgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgeworICAgICAgICBib3Jyb3cgPSB4W2ldIC0geVtpXSAtIGJvcnJvdzsKKyAgICAgICAgeFtpXSA9IGJvcnJvdyAmIFB5TG9uZ19NQVNLOworICAgICAgICBib3Jyb3cgPj49IFB5TG9uZ19TSElGVDsKKyAgICAgICAgYm9ycm93ICY9IDE7ICAgICAgICAgICAgLyoga2VlcCBvbmx5IDEgc2lnbiBiaXQgKi8KKyAgICB9CisgICAgZm9yICg7IGJvcnJvdyAmJiBpIDwgbTsgKytpKSB7CisgICAgICAgIGJvcnJvdyA9IHhbaV0gLSBib3Jyb3c7CisgICAgICAgIHhbaV0gPSBib3Jyb3cgJiBQeUxvbmdfTUFTSzsKKyAgICAgICAgYm9ycm93ID4+PSBQeUxvbmdfU0hJRlQ7CisgICAgICAgIGJvcnJvdyAmPSAxOworICAgIH0KKyAgICByZXR1cm4gYm9ycm93OwogfQogCiAvKiBNdWx0aXBseSBieSBhIHNpbmdsZSBkaWdpdCwgaWdub3JpbmcgdGhlIHNpZ24uICovCkBAIC0xMTI2LDcgKzExMjYsNyBAQAogc3RhdGljIFB5TG9uZ09iamVjdCAqCiBtdWwxKFB5TG9uZ09iamVjdCAqYSwgd2RpZ2l0IG4pCiB7Ci0JcmV0dXJuIG11bGFkZDEoYSwgbiwgKGRpZ2l0KTApOworICAgIHJldHVybiBtdWxhZGQxKGEsIG4sIChkaWdpdCkwKTsKIH0KIAogLyogTXVsdGlwbHkgYnkgYSBzaW5nbGUgZGlnaXQgYW5kIGFkZCBhIHNpbmdsZSBkaWdpdCwgaWdub3JpbmcgdGhlIHNpZ24uICovCkBAIC0xMTM0LDIwICsxMTM0LDIwIEBACiBzdGF0aWMgUHlMb25nT2JqZWN0ICoKIG11bGFkZDEoUHlMb25nT2JqZWN0ICphLCB3ZGlnaXQgbiwgd2RpZ2l0IGV4dHJhKQogewotCVB5X3NzaXplX3Qgc2l6ZV9hID0gQUJTKFB5X1NJWkUoYSkpOwotCVB5TG9uZ09iamVjdCAqeiA9IF9QeUxvbmdfTmV3KHNpemVfYSsxKTsKLQl0d29kaWdpdHMgY2FycnkgPSBleHRyYTsKLQlQeV9zc2l6ZV90IGk7CisgICAgUHlfc3NpemVfdCBzaXplX2EgPSBBQlMoUHlfU0laRShhKSk7CisgICAgUHlMb25nT2JqZWN0ICp6ID0gX1B5TG9uZ19OZXcoc2l6ZV9hKzEpOworICAgIHR3b2RpZ2l0cyBjYXJyeSA9IGV4dHJhOworICAgIFB5X3NzaXplX3QgaTsKIAotCWlmICh6ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWZvciAoaSA9IDA7IGkgPCBzaXplX2E7ICsraSkgewotCQljYXJyeSArPSAodHdvZGlnaXRzKWEtPm9iX2RpZ2l0W2ldICogbjsKLQkJei0+b2JfZGlnaXRbaV0gPSAoZGlnaXQpIChjYXJyeSAmIFB5TG9uZ19NQVNLKTsKLQkJY2FycnkgPj49IFB5TG9uZ19TSElGVDsKLQl9Ci0Jei0+b2JfZGlnaXRbaV0gPSAoZGlnaXQpIGNhcnJ5OwotCXJldHVybiBsb25nX25vcm1hbGl6ZSh6KTsKKyAgICBpZiAoeiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZV9hOyArK2kpIHsKKyAgICAgICAgY2FycnkgKz0gKHR3b2RpZ2l0cylhLT5vYl9kaWdpdFtpXSAqIG47CisgICAgICAgIHotPm9iX2RpZ2l0W2ldID0gKGRpZ2l0KSAoY2FycnkgJiBQeUxvbmdfTUFTSyk7CisgICAgICAgIGNhcnJ5ID4+PSBQeUxvbmdfU0hJRlQ7CisgICAgfQorICAgIHotPm9iX2RpZ2l0W2ldID0gKGRpZ2l0KSBjYXJyeTsKKyAgICByZXR1cm4gbG9uZ19ub3JtYWxpemUoeik7CiB9CiAKIC8qIERpdmlkZSBsb25nIHBpbiwgdy8gc2l6ZSBkaWdpdHMsIGJ5IG5vbi16ZXJvIGRpZ2l0IG4sIHN0b3JpbmcgcXVvdGllbnQKQEAgLTExNTksMTggKzExNTksMTggQEAKIHN0YXRpYyBkaWdpdAogaW5wbGFjZV9kaXZyZW0xKGRpZ2l0ICpwb3V0LCBkaWdpdCAqcGluLCBQeV9zc2l6ZV90IHNpemUsIGRpZ2l0IG4pCiB7Ci0JdHdvZGlnaXRzIHJlbSA9IDA7CisgICAgdHdvZGlnaXRzIHJlbSA9IDA7CiAKLQlhc3NlcnQobiA+IDAgJiYgbiA8PSBQeUxvbmdfTUFTSyk7Ci0JcGluICs9IHNpemU7Ci0JcG91dCArPSBzaXplOwotCXdoaWxlICgtLXNpemUgPj0gMCkgewotCQlkaWdpdCBoaTsKLQkJcmVtID0gKHJlbSA8PCBQeUxvbmdfU0hJRlQpICsgKi0tcGluOwotCQkqLS1wb3V0ID0gaGkgPSAoZGlnaXQpKHJlbSAvIG4pOwotCQlyZW0gLT0gKHR3b2RpZ2l0cyloaSAqIG47Ci0JfQotCXJldHVybiAoZGlnaXQpcmVtOworICAgIGFzc2VydChuID4gMCAmJiBuIDw9IFB5TG9uZ19NQVNLKTsKKyAgICBwaW4gKz0gc2l6ZTsKKyAgICBwb3V0ICs9IHNpemU7CisgICAgd2hpbGUgKC0tc2l6ZSA+PSAwKSB7CisgICAgICAgIGRpZ2l0IGhpOworICAgICAgICByZW0gPSAocmVtIDw8IFB5TG9uZ19TSElGVCkgKyAqLS1waW47CisgICAgICAgICotLXBvdXQgPSBoaSA9IChkaWdpdCkocmVtIC8gbik7CisgICAgICAgIHJlbSAtPSAodHdvZGlnaXRzKWhpICogbjsKKyAgICB9CisgICAgcmV0dXJuIChkaWdpdClyZW07CiB9CiAKIC8qIERpdmlkZSBhIGxvbmcgaW50ZWdlciBieSBhIGRpZ2l0LCByZXR1cm5pbmcgYm90aCB0aGUgcXVvdGllbnQKQEAgLTExODAsMTUgKzExODAsMTUgQEAKIHN0YXRpYyBQeUxvbmdPYmplY3QgKgogZGl2cmVtMShQeUxvbmdPYmplY3QgKmEsIGRpZ2l0IG4sIGRpZ2l0ICpwcmVtKQogewotCWNvbnN0IFB5X3NzaXplX3Qgc2l6ZSA9IEFCUyhQeV9TSVpFKGEpKTsKLQlQeUxvbmdPYmplY3QgKno7CisgICAgY29uc3QgUHlfc3NpemVfdCBzaXplID0gQUJTKFB5X1NJWkUoYSkpOworICAgIFB5TG9uZ09iamVjdCAqejsKIAotCWFzc2VydChuID4gMCAmJiBuIDw9IFB5TG9uZ19NQVNLKTsKLQl6ID0gX1B5TG9uZ19OZXcoc2l6ZSk7Ci0JaWYgKHogPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JKnByZW0gPSBpbnBsYWNlX2RpdnJlbTEoei0+b2JfZGlnaXQsIGEtPm9iX2RpZ2l0LCBzaXplLCBuKTsKLQlyZXR1cm4gbG9uZ19ub3JtYWxpemUoeik7CisgICAgYXNzZXJ0KG4gPiAwICYmIG4gPD0gUHlMb25nX01BU0spOworICAgIHogPSBfUHlMb25nX05ldyhzaXplKTsKKyAgICBpZiAoeiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAqcHJlbSA9IGlucGxhY2VfZGl2cmVtMSh6LT5vYl9kaWdpdCwgYS0+b2JfZGlnaXQsIHNpemUsIG4pOworICAgIHJldHVybiBsb25nX25vcm1hbGl6ZSh6KTsKIH0KIAogLyogQ29udmVydCB0aGUgbG9uZyB0byBhIHN0cmluZyBvYmplY3Qgd2l0aCBnaXZlbiBiYXNlLApAQCAtMTE5OSwxNjcgKzExOTksMTY3IEBACiBQeUFQSV9GVU5DKFB5T2JqZWN0ICopCiBfUHlMb25nX0Zvcm1hdChQeU9iamVjdCAqYWEsIGludCBiYXNlLCBpbnQgYWRkTCwgaW50IG5ld3N0eWxlKQogewotCXJlZ2lzdGVyIFB5TG9uZ09iamVjdCAqYSA9IChQeUxvbmdPYmplY3QgKilhYTsKLQlQeVN0cmluZ09iamVjdCAqc3RyOwotCVB5X3NzaXplX3QgaSwgc3o7Ci0JUHlfc3NpemVfdCBzaXplX2E7Ci0JY2hhciAqcDsKLQlpbnQgYml0czsKLQljaGFyIHNpZ24gPSAnXDAnOworICAgIHJlZ2lzdGVyIFB5TG9uZ09iamVjdCAqYSA9IChQeUxvbmdPYmplY3QgKilhYTsKKyAgICBQeVN0cmluZ09iamVjdCAqc3RyOworICAgIFB5X3NzaXplX3QgaSwgc3o7CisgICAgUHlfc3NpemVfdCBzaXplX2E7CisgICAgY2hhciAqcDsKKyAgICBpbnQgYml0czsKKyAgICBjaGFyIHNpZ24gPSAnXDAnOwogCi0JaWYgKGEgPT0gTlVMTCB8fCAhUHlMb25nX0NoZWNrKGEpKSB7Ci0JCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JYXNzZXJ0KGJhc2UgPj0gMiAmJiBiYXNlIDw9IDM2KTsKLQlzaXplX2EgPSBBQlMoUHlfU0laRShhKSk7CisgICAgaWYgKGEgPT0gTlVMTCB8fCAhUHlMb25nX0NoZWNrKGEpKSB7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgYXNzZXJ0KGJhc2UgPj0gMiAmJiBiYXNlIDw9IDM2KTsKKyAgICBzaXplX2EgPSBBQlMoUHlfU0laRShhKSk7CiAKLQkvKiBDb21wdXRlIGEgcm91Z2ggdXBwZXIgYm91bmQgZm9yIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyAqLwotCWkgPSBiYXNlOwotCWJpdHMgPSAwOwotCXdoaWxlIChpID4gMSkgewotCQkrK2JpdHM7Ci0JCWkgPj49IDE7Ci0JfQotCWkgPSA1ICsgKGFkZEwgPyAxIDogMCk7Ci0JLyogZW5zdXJlIHdlIGRvbid0IGdldCBzaWduZWQgb3ZlcmZsb3cgaW4gc3ogY2FsY3VsYXRpb24gKi8KLQlpZiAoc2l6ZV9hID4gKFBZX1NTSVpFX1RfTUFYIC0gaSkgLyBQeUxvbmdfU0hJRlQpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0JCQkJImxvbmcgaXMgdG9vIGxhcmdlIHRvIGZvcm1hdCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0Jc3ogPSBpICsgMSArIChzaXplX2EgKiBQeUxvbmdfU0hJRlQgLSAxKSAvIGJpdHM7Ci0JYXNzZXJ0KHN6ID49IDApOwotCXN0ciA9IChQeVN0cmluZ09iamVjdCAqKSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKTAsIHN6KTsKLQlpZiAoc3RyID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXAgPSBQeVN0cmluZ19BU19TVFJJTkcoc3RyKSArIHN6OwotCSpwID0gJ1wwJzsKLQlpZiAoYWRkTCkKLQkJKi0tcCA9ICdMJzsKLQlpZiAoYS0+b2Jfc2l6ZSA8IDApCi0JCXNpZ24gPSAnLSc7CisgICAgLyogQ29tcHV0ZSBhIHJvdWdoIHVwcGVyIGJvdW5kIGZvciB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgKi8KKyAgICBpID0gYmFzZTsKKyAgICBiaXRzID0gMDsKKyAgICB3aGlsZSAoaSA+IDEpIHsKKyAgICAgICAgKytiaXRzOworICAgICAgICBpID4+PSAxOworICAgIH0KKyAgICBpID0gNSArIChhZGRMID8gMSA6IDApOworICAgIC8qIGVuc3VyZSB3ZSBkb24ndCBnZXQgc2lnbmVkIG92ZXJmbG93IGluIHN6IGNhbGN1bGF0aW9uICovCisgICAgaWYgKHNpemVfYSA+IChQWV9TU0laRV9UX01BWCAtIGkpIC8gUHlMb25nX1NISUZUKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImxvbmcgaXMgdG9vIGxhcmdlIHRvIGZvcm1hdCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgc3ogPSBpICsgMSArIChzaXplX2EgKiBQeUxvbmdfU0hJRlQgLSAxKSAvIGJpdHM7CisgICAgYXNzZXJ0KHN6ID49IDApOworICAgIHN0ciA9IChQeVN0cmluZ09iamVjdCAqKSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKTAsIHN6KTsKKyAgICBpZiAoc3RyID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHAgPSBQeVN0cmluZ19BU19TVFJJTkcoc3RyKSArIHN6OworICAgICpwID0gJ1wwJzsKKyAgICBpZiAoYWRkTCkKKyAgICAgICAgKi0tcCA9ICdMJzsKKyAgICBpZiAoYS0+b2Jfc2l6ZSA8IDApCisgICAgICAgIHNpZ24gPSAnLSc7CiAKLQlpZiAoYS0+b2Jfc2l6ZSA9PSAwKSB7Ci0JCSotLXAgPSAnMCc7Ci0JfQotCWVsc2UgaWYgKChiYXNlICYgKGJhc2UgLSAxKSkgPT0gMCkgewotCQkvKiBKUkg6IHNwZWNpYWwgY2FzZSBmb3IgcG93ZXItb2YtMiBiYXNlcyAqLwotCQl0d29kaWdpdHMgYWNjdW0gPSAwOwotCQlpbnQgYWNjdW1iaXRzID0gMDsJLyogIyBvZiBiaXRzIGluIGFjY3VtICovCi0JCWludCBiYXNlYml0cyA9IDE7CS8qICMgb2YgYml0cyBpbiBiYXNlLTEgKi8KLQkJaSA9IGJhc2U7Ci0JCXdoaWxlICgoaSA+Pj0gMSkgPiAxKQotCQkJKytiYXNlYml0czsKKyAgICBpZiAoYS0+b2Jfc2l6ZSA9PSAwKSB7CisgICAgICAgICotLXAgPSAnMCc7CisgICAgfQorICAgIGVsc2UgaWYgKChiYXNlICYgKGJhc2UgLSAxKSkgPT0gMCkgeworICAgICAgICAvKiBKUkg6IHNwZWNpYWwgY2FzZSBmb3IgcG93ZXItb2YtMiBiYXNlcyAqLworICAgICAgICB0d29kaWdpdHMgYWNjdW0gPSAwOworICAgICAgICBpbnQgYWNjdW1iaXRzID0gMDsgICAgICAgICAgICAgIC8qICMgb2YgYml0cyBpbiBhY2N1bSAqLworICAgICAgICBpbnQgYmFzZWJpdHMgPSAxOyAgICAgICAgICAgICAgIC8qICMgb2YgYml0cyBpbiBiYXNlLTEgKi8KKyAgICAgICAgaSA9IGJhc2U7CisgICAgICAgIHdoaWxlICgoaSA+Pj0gMSkgPiAxKQorICAgICAgICAgICAgKytiYXNlYml0czsKIAotCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZV9hOyArK2kpIHsKLQkJCWFjY3VtIHw9ICh0d29kaWdpdHMpYS0+b2JfZGlnaXRbaV0gPDwgYWNjdW1iaXRzOwotCQkJYWNjdW1iaXRzICs9IFB5TG9uZ19TSElGVDsKLQkJCWFzc2VydChhY2N1bWJpdHMgPj0gYmFzZWJpdHMpOwotCQkJZG8gewotCQkJCWNoYXIgY2RpZ2l0ID0gKGNoYXIpKGFjY3VtICYgKGJhc2UgLSAxKSk7Ci0JCQkJY2RpZ2l0ICs9IChjZGlnaXQgPCAxMCkgPyAnMCcgOiAnYSctMTA7Ci0JCQkJYXNzZXJ0KHAgPiBQeVN0cmluZ19BU19TVFJJTkcoc3RyKSk7Ci0JCQkJKi0tcCA9IGNkaWdpdDsKLQkJCQlhY2N1bWJpdHMgLT0gYmFzZWJpdHM7Ci0JCQkJYWNjdW0gPj49IGJhc2ViaXRzOwotCQkJfSB3aGlsZSAoaSA8IHNpemVfYS0xID8gYWNjdW1iaXRzID49IGJhc2ViaXRzIDoKLQkJCQkJCWFjY3VtID4gMCk7Ci0JCX0KLQl9Ci0JZWxzZSB7Ci0JCS8qIE5vdCAwLCBhbmQgYmFzZSBub3QgYSBwb3dlciBvZiAyLiAgRGl2aWRlIHJlcGVhdGVkbHkgYnkKLQkJICAgYmFzZSwgYnV0IGZvciBzcGVlZCB1c2UgdGhlIGhpZ2hlc3QgcG93ZXIgb2YgYmFzZSB0aGF0Ci0JCSAgIGZpdHMgaW4gYSBkaWdpdC4gKi8KLQkJUHlfc3NpemVfdCBzaXplID0gc2l6ZV9hOwotCQlkaWdpdCAqcGluID0gYS0+b2JfZGlnaXQ7Ci0JCVB5TG9uZ09iamVjdCAqc2NyYXRjaDsKLQkJLyogcG93YmFzdyA8LSBsYXJnZXN0IHBvd2VyIG9mIGJhc2UgdGhhdCBmaXRzIGluIGEgZGlnaXQuICovCi0JCWRpZ2l0IHBvd2Jhc2UgPSBiYXNlOyAgLyogcG93YmFzZSA9PSBiYXNlICoqIHBvd2VyICovCi0JCWludCBwb3dlciA9IDE7Ci0JCWZvciAoOzspIHsKLQkJCXVuc2lnbmVkIGxvbmcgbmV3cG93ID0gcG93YmFzZSAqICh1bnNpZ25lZCBsb25nKWJhc2U7Ci0JCQlpZiAobmV3cG93ID4+IFB5TG9uZ19TSElGVCkKLQkJCQkvKiBkb2Vzbid0IGZpdCBpbiBhIGRpZ2l0ICovCi0JCQkJYnJlYWs7Ci0JCQlwb3diYXNlID0gKGRpZ2l0KW5ld3BvdzsKLQkJCSsrcG93ZXI7Ci0JCX0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHNpemVfYTsgKytpKSB7CisgICAgICAgICAgICBhY2N1bSB8PSAodHdvZGlnaXRzKWEtPm9iX2RpZ2l0W2ldIDw8IGFjY3VtYml0czsKKyAgICAgICAgICAgIGFjY3VtYml0cyArPSBQeUxvbmdfU0hJRlQ7CisgICAgICAgICAgICBhc3NlcnQoYWNjdW1iaXRzID49IGJhc2ViaXRzKTsKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBjaGFyIGNkaWdpdCA9IChjaGFyKShhY2N1bSAmIChiYXNlIC0gMSkpOworICAgICAgICAgICAgICAgIGNkaWdpdCArPSAoY2RpZ2l0IDwgMTApID8gJzAnIDogJ2EnLTEwOworICAgICAgICAgICAgICAgIGFzc2VydChwID4gUHlTdHJpbmdfQVNfU1RSSU5HKHN0cikpOworICAgICAgICAgICAgICAgICotLXAgPSBjZGlnaXQ7CisgICAgICAgICAgICAgICAgYWNjdW1iaXRzIC09IGJhc2ViaXRzOworICAgICAgICAgICAgICAgIGFjY3VtID4+PSBiYXNlYml0czsKKyAgICAgICAgICAgIH0gd2hpbGUgKGkgPCBzaXplX2EtMSA/IGFjY3VtYml0cyA+PSBiYXNlYml0cyA6CisgICAgICAgICAgICAgICAgICAgICAgICBhY2N1bSA+IDApOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvKiBOb3QgMCwgYW5kIGJhc2Ugbm90IGEgcG93ZXIgb2YgMi4gIERpdmlkZSByZXBlYXRlZGx5IGJ5CisgICAgICAgICAgIGJhc2UsIGJ1dCBmb3Igc3BlZWQgdXNlIHRoZSBoaWdoZXN0IHBvd2VyIG9mIGJhc2UgdGhhdAorICAgICAgICAgICBmaXRzIGluIGEgZGlnaXQuICovCisgICAgICAgIFB5X3NzaXplX3Qgc2l6ZSA9IHNpemVfYTsKKyAgICAgICAgZGlnaXQgKnBpbiA9IGEtPm9iX2RpZ2l0OworICAgICAgICBQeUxvbmdPYmplY3QgKnNjcmF0Y2g7CisgICAgICAgIC8qIHBvd2Jhc3cgPC0gbGFyZ2VzdCBwb3dlciBvZiBiYXNlIHRoYXQgZml0cyBpbiBhIGRpZ2l0LiAqLworICAgICAgICBkaWdpdCBwb3diYXNlID0gYmFzZTsgIC8qIHBvd2Jhc2UgPT0gYmFzZSAqKiBwb3dlciAqLworICAgICAgICBpbnQgcG93ZXIgPSAxOworICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICB1bnNpZ25lZCBsb25nIG5ld3BvdyA9IHBvd2Jhc2UgKiAodW5zaWduZWQgbG9uZyliYXNlOworICAgICAgICAgICAgaWYgKG5ld3BvdyA+PiBQeUxvbmdfU0hJRlQpCisgICAgICAgICAgICAgICAgLyogZG9lc24ndCBmaXQgaW4gYSBkaWdpdCAqLworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgcG93YmFzZSA9IChkaWdpdCluZXdwb3c7CisgICAgICAgICAgICArK3Bvd2VyOworICAgICAgICB9CiAKLQkJLyogR2V0IGEgc2NyYXRjaCBhcmVhIGZvciByZXBlYXRlZCBkaXZpc2lvbi4gKi8KLQkJc2NyYXRjaCA9IF9QeUxvbmdfTmV3KHNpemUpOwotCQlpZiAoc2NyYXRjaCA9PSBOVUxMKSB7Ci0JCQlQeV9ERUNSRUYoc3RyKTsKLQkJCXJldHVybiBOVUxMOwotCQl9CisgICAgICAgIC8qIEdldCBhIHNjcmF0Y2ggYXJlYSBmb3IgcmVwZWF0ZWQgZGl2aXNpb24uICovCisgICAgICAgIHNjcmF0Y2ggPSBfUHlMb25nX05ldyhzaXplKTsKKyAgICAgICAgaWYgKHNjcmF0Y2ggPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKHN0cik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQogCi0JCS8qIFJlcGVhdGVkbHkgZGl2aWRlIGJ5IHBvd2Jhc2UuICovCi0JCWRvIHsKLQkJCWludCBudG9zdG9yZSA9IHBvd2VyOwotCQkJZGlnaXQgcmVtID0gaW5wbGFjZV9kaXZyZW0xKHNjcmF0Y2gtPm9iX2RpZ2l0LAotCQkJCQkJICAgICBwaW4sIHNpemUsIHBvd2Jhc2UpOwotCQkJcGluID0gc2NyYXRjaC0+b2JfZGlnaXQ7IC8qIG5vIG5lZWQgdG8gdXNlIGEgYWdhaW4gKi8KLQkJCWlmIChwaW5bc2l6ZSAtIDFdID09IDApCi0JCQkJLS1zaXplOwotCQkJU0lHQ0hFQ0soewotCQkJCVB5X0RFQ1JFRihzY3JhdGNoKTsKLQkJCQlQeV9ERUNSRUYoc3RyKTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0pCisgICAgICAgIC8qIFJlcGVhdGVkbHkgZGl2aWRlIGJ5IHBvd2Jhc2UuICovCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGludCBudG9zdG9yZSA9IHBvd2VyOworICAgICAgICAgICAgZGlnaXQgcmVtID0gaW5wbGFjZV9kaXZyZW0xKHNjcmF0Y2gtPm9iX2RpZ2l0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaW4sIHNpemUsIHBvd2Jhc2UpOworICAgICAgICAgICAgcGluID0gc2NyYXRjaC0+b2JfZGlnaXQ7IC8qIG5vIG5lZWQgdG8gdXNlIGEgYWdhaW4gKi8KKyAgICAgICAgICAgIGlmIChwaW5bc2l6ZSAtIDFdID09IDApCisgICAgICAgICAgICAgICAgLS1zaXplOworICAgICAgICAgICAgU0lHQ0hFQ0soeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihzY3JhdGNoKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoc3RyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0pCiAKLQkJCS8qIEJyZWFrIHJlbSBpbnRvIGRpZ2l0cy4gKi8KLQkJCWFzc2VydChudG9zdG9yZSA+IDApOwotCQkJZG8gewotCQkJCWRpZ2l0IG5leHRyZW0gPSAoZGlnaXQpKHJlbSAvIGJhc2UpOwotCQkJCWNoYXIgYyA9IChjaGFyKShyZW0gLSBuZXh0cmVtICogYmFzZSk7Ci0JCQkJYXNzZXJ0KHAgPiBQeVN0cmluZ19BU19TVFJJTkcoc3RyKSk7Ci0JCQkJYyArPSAoYyA8IDEwKSA/ICcwJyA6ICdhJy0xMDsKLQkJCQkqLS1wID0gYzsKLQkJCQlyZW0gPSBuZXh0cmVtOwotCQkJCS0tbnRvc3RvcmU7Ci0JCQkJLyogVGVybWluYXRpb24gaXMgYSBiaXQgZGVsaWNhdGU6ICBtdXN0IG5vdAotCQkJCSAgIHN0b3JlIGxlYWRpbmcgemVyb2VzLCBzbyBtdXN0IGdldCBvdXQgaWYKLQkJCQkgICByZW1haW5pbmcgcXVvdGllbnQgYW5kIHJlbSBhcmUgYm90aCAwLiAqLwotCQkJfSB3aGlsZSAobnRvc3RvcmUgJiYgKHNpemUgfHwgcmVtKSk7Ci0JCX0gd2hpbGUgKHNpemUgIT0gMCk7Ci0JCVB5X0RFQ1JFRihzY3JhdGNoKTsKLQl9CisgICAgICAgICAgICAvKiBCcmVhayByZW0gaW50byBkaWdpdHMuICovCisgICAgICAgICAgICBhc3NlcnQobnRvc3RvcmUgPiAwKTsKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBkaWdpdCBuZXh0cmVtID0gKGRpZ2l0KShyZW0gLyBiYXNlKTsKKyAgICAgICAgICAgICAgICBjaGFyIGMgPSAoY2hhcikocmVtIC0gbmV4dHJlbSAqIGJhc2UpOworICAgICAgICAgICAgICAgIGFzc2VydChwID4gUHlTdHJpbmdfQVNfU1RSSU5HKHN0cikpOworICAgICAgICAgICAgICAgIGMgKz0gKGMgPCAxMCkgPyAnMCcgOiAnYSctMTA7CisgICAgICAgICAgICAgICAgKi0tcCA9IGM7CisgICAgICAgICAgICAgICAgcmVtID0gbmV4dHJlbTsKKyAgICAgICAgICAgICAgICAtLW50b3N0b3JlOworICAgICAgICAgICAgICAgIC8qIFRlcm1pbmF0aW9uIGlzIGEgYml0IGRlbGljYXRlOiAgbXVzdCBub3QKKyAgICAgICAgICAgICAgICAgICBzdG9yZSBsZWFkaW5nIHplcm9lcywgc28gbXVzdCBnZXQgb3V0IGlmCisgICAgICAgICAgICAgICAgICAgcmVtYWluaW5nIHF1b3RpZW50IGFuZCByZW0gYXJlIGJvdGggMC4gKi8KKyAgICAgICAgICAgIH0gd2hpbGUgKG50b3N0b3JlICYmIChzaXplIHx8IHJlbSkpOworICAgICAgICB9IHdoaWxlIChzaXplICE9IDApOworICAgICAgICBQeV9ERUNSRUYoc2NyYXRjaCk7CisgICAgfQogCi0JaWYgKGJhc2UgPT0gMikgewotCQkqLS1wID0gJ2InOwotCQkqLS1wID0gJzAnOwotCX0KLQllbHNlIGlmIChiYXNlID09IDgpIHsKLQkJaWYgKG5ld3N0eWxlKSB7Ci0JCQkqLS1wID0gJ28nOwotCQkJKi0tcCA9ICcwJzsKLQkJfQotCQllbHNlCi0JCQlpZiAoc2l6ZV9hICE9IDApCi0JCQkJKi0tcCA9ICcwJzsKLQl9Ci0JZWxzZSBpZiAoYmFzZSA9PSAxNikgewotCQkqLS1wID0gJ3gnOwotCQkqLS1wID0gJzAnOwotCX0KLQllbHNlIGlmIChiYXNlICE9IDEwKSB7Ci0JCSotLXAgPSAnIyc7Ci0JCSotLXAgPSAnMCcgKyBiYXNlJTEwOwotCQlpZiAoYmFzZSA+IDEwKQotCQkJKi0tcCA9ICcwJyArIGJhc2UvMTA7Ci0JfQotCWlmIChzaWduKQotCQkqLS1wID0gc2lnbjsKLQlpZiAocCAhPSBQeVN0cmluZ19BU19TVFJJTkcoc3RyKSkgewotCQljaGFyICpxID0gUHlTdHJpbmdfQVNfU1RSSU5HKHN0cik7Ci0JCWFzc2VydChwID4gcSk7Ci0JCWRvIHsKLQkJfSB3aGlsZSAoKCpxKysgPSAqcCsrKSAhPSAnXDAnKTsKLQkJcS0tOwotCQlfUHlTdHJpbmdfUmVzaXplKChQeU9iamVjdCAqKikmc3RyLAotCQkJCSAoUHlfc3NpemVfdCkgKHEgLSBQeVN0cmluZ19BU19TVFJJTkcoc3RyKSkpOwotCX0KLQlyZXR1cm4gKFB5T2JqZWN0ICopc3RyOworICAgIGlmIChiYXNlID09IDIpIHsKKyAgICAgICAgKi0tcCA9ICdiJzsKKyAgICAgICAgKi0tcCA9ICcwJzsKKyAgICB9CisgICAgZWxzZSBpZiAoYmFzZSA9PSA4KSB7CisgICAgICAgIGlmIChuZXdzdHlsZSkgeworICAgICAgICAgICAgKi0tcCA9ICdvJzsKKyAgICAgICAgICAgICotLXAgPSAnMCc7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaWYgKHNpemVfYSAhPSAwKQorICAgICAgICAgICAgICAgICotLXAgPSAnMCc7CisgICAgfQorICAgIGVsc2UgaWYgKGJhc2UgPT0gMTYpIHsKKyAgICAgICAgKi0tcCA9ICd4JzsKKyAgICAgICAgKi0tcCA9ICcwJzsKKyAgICB9CisgICAgZWxzZSBpZiAoYmFzZSAhPSAxMCkgeworICAgICAgICAqLS1wID0gJyMnOworICAgICAgICAqLS1wID0gJzAnICsgYmFzZSUxMDsKKyAgICAgICAgaWYgKGJhc2UgPiAxMCkKKyAgICAgICAgICAgICotLXAgPSAnMCcgKyBiYXNlLzEwOworICAgIH0KKyAgICBpZiAoc2lnbikKKyAgICAgICAgKi0tcCA9IHNpZ247CisgICAgaWYgKHAgIT0gUHlTdHJpbmdfQVNfU1RSSU5HKHN0cikpIHsKKyAgICAgICAgY2hhciAqcSA9IFB5U3RyaW5nX0FTX1NUUklORyhzdHIpOworICAgICAgICBhc3NlcnQocCA+IHEpOworICAgICAgICBkbyB7CisgICAgICAgIH0gd2hpbGUgKCgqcSsrID0gKnArKykgIT0gJ1wwJyk7CisgICAgICAgIHEtLTsKKyAgICAgICAgX1B5U3RyaW5nX1Jlc2l6ZSgoUHlPYmplY3QgKiopJnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoUHlfc3NpemVfdCkgKHEgLSBQeVN0cmluZ19BU19TVFJJTkcoc3RyKSkpOworICAgIH0KKyAgICByZXR1cm4gKFB5T2JqZWN0ICopc3RyOwogfQogCiAvKiBUYWJsZSBvZiBkaWdpdCB2YWx1ZXMgZm9yIDgtYml0IHN0cmluZyAtPiBpbnRlZ2VyIGNvbnZlcnNpb24uCkBAIC0xMzcwLDIyICsxMzcwLDIyIEBACiAgKiBiYXNlIEIgZGlnaXQgaWZmIF9QeUxvbmdfRGlnaXRWYWx1ZVtQeV9DSEFSTUFTSyhjKV0gPCBCLgogICovCiBpbnQgX1B5TG9uZ19EaWdpdFZhbHVlWzI1Nl0gPSB7Ci0JMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsCi0JMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsCi0JMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsCi0JMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsICA4LCAgOSwgIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsCi0JMzcsIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsCi0JMjUsIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEsIDMyLCAzMywgMzQsIDM1LCAzNywgMzcsIDM3LCAzNywgMzcsCi0JMzcsIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsCi0JMjUsIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEsIDMyLCAzMywgMzQsIDM1LCAzNywgMzcsIDM3LCAzNywgMzcsCi0JMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsCi0JMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsCi0JMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsCi0JMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsCi0JMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsCi0JMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsCi0JMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsCi0JMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsCisgICAgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsCisgICAgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsCisgICAgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsCisgICAgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsICA4LCAgOSwgIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsCisgICAgMzcsIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsCisgICAgMjUsIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEsIDMyLCAzMywgMzQsIDM1LCAzNywgMzcsIDM3LCAzNywgMzcsCisgICAgMzcsIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsCisgICAgMjUsIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEsIDMyLCAzMywgMzQsIDM1LCAzNywgMzcsIDM3LCAzNywgMzcsCisgICAgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsCisgICAgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsCisgICAgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsCisgICAgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsCisgICAgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsCisgICAgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsCisgICAgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsCisgICAgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsCiB9OwogCiAvKiAqc3RyIHBvaW50cyB0byB0aGUgZmlyc3QgZGlnaXQgaW4gYSBzdHJpbmcgb2YgYmFzZSBgYmFzZWAgZGlnaXRzLiAgYmFzZQpAQCAtMTM5NywxMTUgKzEzOTcsMTE1IEBACiBzdGF0aWMgUHlMb25nT2JqZWN0ICoKIGxvbmdfZnJvbV9iaW5hcnlfYmFzZShjaGFyICoqc3RyLCBpbnQgYmFzZSkKIHsKLQljaGFyICpwID0gKnN0cjsKLQljaGFyICpzdGFydCA9IHA7Ci0JaW50IGJpdHNfcGVyX2NoYXI7Ci0JUHlfc3NpemVfdCBuOwotCVB5TG9uZ09iamVjdCAqejsKLQl0d29kaWdpdHMgYWNjdW07Ci0JaW50IGJpdHNfaW5fYWNjdW07Ci0JZGlnaXQgKnBkaWdpdDsKKyAgICBjaGFyICpwID0gKnN0cjsKKyAgICBjaGFyICpzdGFydCA9IHA7CisgICAgaW50IGJpdHNfcGVyX2NoYXI7CisgICAgUHlfc3NpemVfdCBuOworICAgIFB5TG9uZ09iamVjdCAqejsKKyAgICB0d29kaWdpdHMgYWNjdW07CisgICAgaW50IGJpdHNfaW5fYWNjdW07CisgICAgZGlnaXQgKnBkaWdpdDsKIAotCWFzc2VydChiYXNlID49IDIgJiYgYmFzZSA8PSAzMiAmJiAoYmFzZSAmIChiYXNlIC0gMSkpID09IDApOwotCW4gPSBiYXNlOwotCWZvciAoYml0c19wZXJfY2hhciA9IC0xOyBuOyArK2JpdHNfcGVyX2NoYXIpCi0JCW4gPj49IDE7Ci0JLyogbiA8LSB0b3RhbCAjIG9mIGJpdHMgbmVlZGVkLCB3aGlsZSBzZXR0aW5nIHAgdG8gZW5kLW9mLXN0cmluZyAqLwotCXdoaWxlIChfUHlMb25nX0RpZ2l0VmFsdWVbUHlfQ0hBUk1BU0soKnApXSA8IGJhc2UpCi0JCSsrcDsKLQkqc3RyID0gcDsKLQkvKiBuIDwtICMgb2YgUHl0aG9uIGRpZ2l0cyBuZWVkZWQsID0gY2VpbGluZyhuL1B5TG9uZ19TSElGVCkuICovCi0JbiA9IChwIC0gc3RhcnQpICogYml0c19wZXJfY2hhciArIFB5TG9uZ19TSElGVCAtIDE7Ci0JaWYgKG4gLyBiaXRzX3Blcl9jaGFyIDwgcCAtIHN0YXJ0KSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJsb25nIHN0cmluZyB0b28gbGFyZ2UgdG8gY29udmVydCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JbiA9IG4gLyBQeUxvbmdfU0hJRlQ7Ci0JeiA9IF9QeUxvbmdfTmV3KG4pOwotCWlmICh6ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCS8qIFJlYWQgc3RyaW5nIGZyb20gcmlnaHQsIGFuZCBmaWxsIGluIGxvbmcgZnJvbSBsZWZ0OyBpLmUuLAotCSAqIGZyb20gbGVhc3QgdG8gbW9zdCBzaWduaWZpY2FudCBpbiBib3RoLgotCSAqLwotCWFjY3VtID0gMDsKLQliaXRzX2luX2FjY3VtID0gMDsKLQlwZGlnaXQgPSB6LT5vYl9kaWdpdDsKLQl3aGlsZSAoLS1wID49IHN0YXJ0KSB7Ci0JCWludCBrID0gX1B5TG9uZ19EaWdpdFZhbHVlW1B5X0NIQVJNQVNLKCpwKV07Ci0JCWFzc2VydChrID49IDAgJiYgayA8IGJhc2UpOwotCQlhY2N1bSB8PSAodHdvZGlnaXRzKWsgPDwgYml0c19pbl9hY2N1bTsKLQkJYml0c19pbl9hY2N1bSArPSBiaXRzX3Blcl9jaGFyOwotCQlpZiAoYml0c19pbl9hY2N1bSA+PSBQeUxvbmdfU0hJRlQpIHsKLQkJCSpwZGlnaXQrKyA9IChkaWdpdCkoYWNjdW0gJiBQeUxvbmdfTUFTSyk7Ci0JCQlhc3NlcnQocGRpZ2l0IC0gei0+b2JfZGlnaXQgPD0gbik7Ci0JCQlhY2N1bSA+Pj0gUHlMb25nX1NISUZUOwotCQkJYml0c19pbl9hY2N1bSAtPSBQeUxvbmdfU0hJRlQ7Ci0JCQlhc3NlcnQoYml0c19pbl9hY2N1bSA8IFB5TG9uZ19TSElGVCk7Ci0JCX0KLQl9Ci0JaWYgKGJpdHNfaW5fYWNjdW0pIHsKLQkJYXNzZXJ0KGJpdHNfaW5fYWNjdW0gPD0gUHlMb25nX1NISUZUKTsKLQkJKnBkaWdpdCsrID0gKGRpZ2l0KWFjY3VtOwotCQlhc3NlcnQocGRpZ2l0IC0gei0+b2JfZGlnaXQgPD0gbik7Ci0JfQotCXdoaWxlIChwZGlnaXQgLSB6LT5vYl9kaWdpdCA8IG4pCi0JCSpwZGlnaXQrKyA9IDA7Ci0JcmV0dXJuIGxvbmdfbm9ybWFsaXplKHopOworICAgIGFzc2VydChiYXNlID49IDIgJiYgYmFzZSA8PSAzMiAmJiAoYmFzZSAmIChiYXNlIC0gMSkpID09IDApOworICAgIG4gPSBiYXNlOworICAgIGZvciAoYml0c19wZXJfY2hhciA9IC0xOyBuOyArK2JpdHNfcGVyX2NoYXIpCisgICAgICAgIG4gPj49IDE7CisgICAgLyogbiA8LSB0b3RhbCAjIG9mIGJpdHMgbmVlZGVkLCB3aGlsZSBzZXR0aW5nIHAgdG8gZW5kLW9mLXN0cmluZyAqLworICAgIHdoaWxlIChfUHlMb25nX0RpZ2l0VmFsdWVbUHlfQ0hBUk1BU0soKnApXSA8IGJhc2UpCisgICAgICAgICsrcDsKKyAgICAqc3RyID0gcDsKKyAgICAvKiBuIDwtICMgb2YgUHl0aG9uIGRpZ2l0cyBuZWVkZWQsID0gY2VpbGluZyhuL1B5TG9uZ19TSElGVCkuICovCisgICAgbiA9IChwIC0gc3RhcnQpICogYml0c19wZXJfY2hhciArIFB5TG9uZ19TSElGVCAtIDE7CisgICAgaWYgKG4gLyBiaXRzX3Blcl9jaGFyIDwgcCAtIHN0YXJ0KSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImxvbmcgc3RyaW5nIHRvbyBsYXJnZSB0byBjb252ZXJ0Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBuID0gbiAvIFB5TG9uZ19TSElGVDsKKyAgICB6ID0gX1B5TG9uZ19OZXcobik7CisgICAgaWYgKHogPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgLyogUmVhZCBzdHJpbmcgZnJvbSByaWdodCwgYW5kIGZpbGwgaW4gbG9uZyBmcm9tIGxlZnQ7IGkuZS4sCisgICAgICogZnJvbSBsZWFzdCB0byBtb3N0IHNpZ25pZmljYW50IGluIGJvdGguCisgICAgICovCisgICAgYWNjdW0gPSAwOworICAgIGJpdHNfaW5fYWNjdW0gPSAwOworICAgIHBkaWdpdCA9IHotPm9iX2RpZ2l0OworICAgIHdoaWxlICgtLXAgPj0gc3RhcnQpIHsKKyAgICAgICAgaW50IGsgPSBfUHlMb25nX0RpZ2l0VmFsdWVbUHlfQ0hBUk1BU0soKnApXTsKKyAgICAgICAgYXNzZXJ0KGsgPj0gMCAmJiBrIDwgYmFzZSk7CisgICAgICAgIGFjY3VtIHw9ICh0d29kaWdpdHMpayA8PCBiaXRzX2luX2FjY3VtOworICAgICAgICBiaXRzX2luX2FjY3VtICs9IGJpdHNfcGVyX2NoYXI7CisgICAgICAgIGlmIChiaXRzX2luX2FjY3VtID49IFB5TG9uZ19TSElGVCkgeworICAgICAgICAgICAgKnBkaWdpdCsrID0gKGRpZ2l0KShhY2N1bSAmIFB5TG9uZ19NQVNLKTsKKyAgICAgICAgICAgIGFzc2VydChwZGlnaXQgLSB6LT5vYl9kaWdpdCA8PSBuKTsKKyAgICAgICAgICAgIGFjY3VtID4+PSBQeUxvbmdfU0hJRlQ7CisgICAgICAgICAgICBiaXRzX2luX2FjY3VtIC09IFB5TG9uZ19TSElGVDsKKyAgICAgICAgICAgIGFzc2VydChiaXRzX2luX2FjY3VtIDwgUHlMb25nX1NISUZUKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoYml0c19pbl9hY2N1bSkgeworICAgICAgICBhc3NlcnQoYml0c19pbl9hY2N1bSA8PSBQeUxvbmdfU0hJRlQpOworICAgICAgICAqcGRpZ2l0KysgPSAoZGlnaXQpYWNjdW07CisgICAgICAgIGFzc2VydChwZGlnaXQgLSB6LT5vYl9kaWdpdCA8PSBuKTsKKyAgICB9CisgICAgd2hpbGUgKHBkaWdpdCAtIHotPm9iX2RpZ2l0IDwgbikKKyAgICAgICAgKnBkaWdpdCsrID0gMDsKKyAgICByZXR1cm4gbG9uZ19ub3JtYWxpemUoeik7CiB9CiAKIFB5T2JqZWN0ICoKIFB5TG9uZ19Gcm9tU3RyaW5nKGNoYXIgKnN0ciwgY2hhciAqKnBlbmQsIGludCBiYXNlKQogewotCWludCBzaWduID0gMTsKLQljaGFyICpzdGFydCwgKm9yaWdfc3RyID0gc3RyOwotCVB5TG9uZ09iamVjdCAqejsKLQlQeU9iamVjdCAqc3Ryb2JqLCAqc3RycmVwcjsKLQlQeV9zc2l6ZV90IHNsZW47CisgICAgaW50IHNpZ24gPSAxOworICAgIGNoYXIgKnN0YXJ0LCAqb3JpZ19zdHIgPSBzdHI7CisgICAgUHlMb25nT2JqZWN0ICp6OworICAgIFB5T2JqZWN0ICpzdHJvYmosICpzdHJyZXByOworICAgIFB5X3NzaXplX3Qgc2xlbjsKIAotCWlmICgoYmFzZSAhPSAwICYmIGJhc2UgPCAyKSB8fCBiYXNlID4gMzYpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJImxvbmcoKSBhcmcgMiBtdXN0IGJlID49IDIgYW5kIDw9IDM2Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQl3aGlsZSAoKnN0ciAhPSAnXDAnICYmIGlzc3BhY2UoUHlfQ0hBUk1BU0soKnN0cikpKQotCQlzdHIrKzsKLQlpZiAoKnN0ciA9PSAnKycpCi0JCSsrc3RyOwotCWVsc2UgaWYgKCpzdHIgPT0gJy0nKSB7Ci0JCSsrc3RyOwotCQlzaWduID0gLTE7Ci0JfQotCXdoaWxlICgqc3RyICE9ICdcMCcgJiYgaXNzcGFjZShQeV9DSEFSTUFTSygqc3RyKSkpCi0JCXN0cisrOwotCWlmIChiYXNlID09IDApIHsKLQkJLyogTm8gYmFzZSBnaXZlbi4gIERlZHVjZSB0aGUgYmFzZSBmcm9tIHRoZSBjb250ZW50cwotCQkgICBvZiB0aGUgc3RyaW5nICovCi0JCWlmIChzdHJbMF0gIT0gJzAnKQotCQkJYmFzZSA9IDEwOwotCQllbHNlIGlmIChzdHJbMV0gPT0gJ3gnIHx8IHN0clsxXSA9PSAnWCcpCi0JCQliYXNlID0gMTY7Ci0JCWVsc2UgaWYgKHN0clsxXSA9PSAnbycgfHwgc3RyWzFdID09ICdPJykKLQkJCWJhc2UgPSA4OwotCQllbHNlIGlmIChzdHJbMV0gPT0gJ2InIHx8IHN0clsxXSA9PSAnQicpCi0JCQliYXNlID0gMjsKLQkJZWxzZQotCQkJLyogIm9sZCIgKEMtc3R5bGUpIG9jdGFsIGxpdGVyYWwsIHN0aWxsIHZhbGlkIGluCi0JCQkgICAyLngsIGFsdGhvdWdoIGlsbGVnYWwgaW4gMy54ICovCi0JCQliYXNlID0gODsKLQl9Ci0JLyogV2hldGhlciBvciBub3Qgd2Ugd2VyZSBkZWR1Y2luZyB0aGUgYmFzZSwgc2tpcCBsZWFkaW5nIGNoYXJzCi0JICAgYXMgbmVlZGVkICovCi0JaWYgKHN0clswXSA9PSAnMCcgJiYKLQkgICAgKChiYXNlID09IDE2ICYmIChzdHJbMV0gPT0gJ3gnIHx8IHN0clsxXSA9PSAnWCcpKSB8fAotCSAgICAgKGJhc2UgPT0gOCAgJiYgKHN0clsxXSA9PSAnbycgfHwgc3RyWzFdID09ICdPJykpIHx8Ci0JICAgICAoYmFzZSA9PSAyICAmJiAoc3RyWzFdID09ICdiJyB8fCBzdHJbMV0gPT0gJ0InKSkpKQotCQlzdHIgKz0gMjsKKyAgICBpZiAoKGJhc2UgIT0gMCAmJiBiYXNlIDwgMikgfHwgYmFzZSA+IDM2KSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImxvbmcoKSBhcmcgMiBtdXN0IGJlID49IDIgYW5kIDw9IDM2Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICB3aGlsZSAoKnN0ciAhPSAnXDAnICYmIGlzc3BhY2UoUHlfQ0hBUk1BU0soKnN0cikpKQorICAgICAgICBzdHIrKzsKKyAgICBpZiAoKnN0ciA9PSAnKycpCisgICAgICAgICsrc3RyOworICAgIGVsc2UgaWYgKCpzdHIgPT0gJy0nKSB7CisgICAgICAgICsrc3RyOworICAgICAgICBzaWduID0gLTE7CisgICAgfQorICAgIHdoaWxlICgqc3RyICE9ICdcMCcgJiYgaXNzcGFjZShQeV9DSEFSTUFTSygqc3RyKSkpCisgICAgICAgIHN0cisrOworICAgIGlmIChiYXNlID09IDApIHsKKyAgICAgICAgLyogTm8gYmFzZSBnaXZlbi4gIERlZHVjZSB0aGUgYmFzZSBmcm9tIHRoZSBjb250ZW50cworICAgICAgICAgICBvZiB0aGUgc3RyaW5nICovCisgICAgICAgIGlmIChzdHJbMF0gIT0gJzAnKQorICAgICAgICAgICAgYmFzZSA9IDEwOworICAgICAgICBlbHNlIGlmIChzdHJbMV0gPT0gJ3gnIHx8IHN0clsxXSA9PSAnWCcpCisgICAgICAgICAgICBiYXNlID0gMTY7CisgICAgICAgIGVsc2UgaWYgKHN0clsxXSA9PSAnbycgfHwgc3RyWzFdID09ICdPJykKKyAgICAgICAgICAgIGJhc2UgPSA4OworICAgICAgICBlbHNlIGlmIChzdHJbMV0gPT0gJ2InIHx8IHN0clsxXSA9PSAnQicpCisgICAgICAgICAgICBiYXNlID0gMjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgLyogIm9sZCIgKEMtc3R5bGUpIG9jdGFsIGxpdGVyYWwsIHN0aWxsIHZhbGlkIGluCisgICAgICAgICAgICAgICAyLngsIGFsdGhvdWdoIGlsbGVnYWwgaW4gMy54ICovCisgICAgICAgICAgICBiYXNlID0gODsKKyAgICB9CisgICAgLyogV2hldGhlciBvciBub3Qgd2Ugd2VyZSBkZWR1Y2luZyB0aGUgYmFzZSwgc2tpcCBsZWFkaW5nIGNoYXJzCisgICAgICAgYXMgbmVlZGVkICovCisgICAgaWYgKHN0clswXSA9PSAnMCcgJiYKKyAgICAgICAgKChiYXNlID09IDE2ICYmIChzdHJbMV0gPT0gJ3gnIHx8IHN0clsxXSA9PSAnWCcpKSB8fAorICAgICAgICAgKGJhc2UgPT0gOCAgJiYgKHN0clsxXSA9PSAnbycgfHwgc3RyWzFdID09ICdPJykpIHx8CisgICAgICAgICAoYmFzZSA9PSAyICAmJiAoc3RyWzFdID09ICdiJyB8fCBzdHJbMV0gPT0gJ0InKSkpKQorICAgICAgICBzdHIgKz0gMjsKIAotCXN0YXJ0ID0gc3RyOwotCWlmICgoYmFzZSAmIChiYXNlIC0gMSkpID09IDApCi0JCXogPSBsb25nX2Zyb21fYmluYXJ5X2Jhc2UoJnN0ciwgYmFzZSk7Ci0JZWxzZSB7CisgICAgc3RhcnQgPSBzdHI7CisgICAgaWYgKChiYXNlICYgKGJhc2UgLSAxKSkgPT0gMCkKKyAgICAgICAgeiA9IGxvbmdfZnJvbV9iaW5hcnlfYmFzZSgmc3RyLCBiYXNlKTsKKyAgICBlbHNlIHsKIC8qKioKIEJpbmFyeSBiYXNlcyBjYW4gYmUgY29udmVydGVkIGluIHRpbWUgbGluZWFyIGluIHRoZSBudW1iZXIgb2YgZGlnaXRzLCBiZWNhdXNlCiBQeXRob24ncyByZXByZXNlbnRhdGlvbiBiYXNlIGlzIGJpbmFyeS4gIE90aGVyIGJhc2VzIChpbmNsdWRpbmcgZGVjaW1hbCEpIHVzZQpAQCAtMTU5MSwyMjcgKzE1OTEsMjI3IEBACiBqdXN0IDEgZGlnaXQgYXQgdGhlIHN0YXJ0LCBzbyB0aGF0IHRoZSBjb3B5aW5nIGNvZGUgd2FzIGV4ZXJjaXNlZCBmb3IgZXZlcnkKIGRpZ2l0IGJleW9uZCB0aGUgZmlyc3QuCiAqKiovCi0JCXJlZ2lzdGVyIHR3b2RpZ2l0cyBjOwkvKiBjdXJyZW50IGlucHV0IGNoYXJhY3RlciAqLwotCQlQeV9zc2l6ZV90IHNpemVfejsKLQkJaW50IGk7Ci0JCWludCBjb252d2lkdGg7Ci0JCXR3b2RpZ2l0cyBjb252bXVsdG1heCwgY29udm11bHQ7Ci0JCWRpZ2l0ICpweiwgKnB6c3RvcDsKLQkJY2hhciogc2NhbjsKKyAgICAgICAgcmVnaXN0ZXIgdHdvZGlnaXRzIGM7ICAgICAgICAgICAvKiBjdXJyZW50IGlucHV0IGNoYXJhY3RlciAqLworICAgICAgICBQeV9zc2l6ZV90IHNpemVfejsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGludCBjb252d2lkdGg7CisgICAgICAgIHR3b2RpZ2l0cyBjb252bXVsdG1heCwgY29udm11bHQ7CisgICAgICAgIGRpZ2l0ICpweiwgKnB6c3RvcDsKKyAgICAgICAgY2hhciogc2NhbjsKIAotCQlzdGF0aWMgZG91YmxlIGxvZ19iYXNlX1B5TG9uZ19CQVNFWzM3XSA9IHswLjBlMCx9OwotCQlzdGF0aWMgaW50IGNvbnZ3aWR0aF9iYXNlWzM3XSA9IHswLH07Ci0JCXN0YXRpYyB0d29kaWdpdHMgY29udm11bHRtYXhfYmFzZVszN10gPSB7MCx9OworICAgICAgICBzdGF0aWMgZG91YmxlIGxvZ19iYXNlX1B5TG9uZ19CQVNFWzM3XSA9IHswLjBlMCx9OworICAgICAgICBzdGF0aWMgaW50IGNvbnZ3aWR0aF9iYXNlWzM3XSA9IHswLH07CisgICAgICAgIHN0YXRpYyB0d29kaWdpdHMgY29udm11bHRtYXhfYmFzZVszN10gPSB7MCx9OwogCi0JCWlmIChsb2dfYmFzZV9QeUxvbmdfQkFTRVtiYXNlXSA9PSAwLjApIHsKLQkJCXR3b2RpZ2l0cyBjb252bWF4ID0gYmFzZTsKLQkJCWludCBpID0gMTsKKyAgICAgICAgaWYgKGxvZ19iYXNlX1B5TG9uZ19CQVNFW2Jhc2VdID09IDAuMCkgeworICAgICAgICAgICAgdHdvZGlnaXRzIGNvbnZtYXggPSBiYXNlOworICAgICAgICAgICAgaW50IGkgPSAxOwogCi0JCQlsb2dfYmFzZV9QeUxvbmdfQkFTRVtiYXNlXSA9IGxvZygoZG91YmxlKWJhc2UpIC8KLQkJCQkJCWxvZygoZG91YmxlKVB5TG9uZ19CQVNFKTsKLQkJCWZvciAoOzspIHsKLQkJCQl0d29kaWdpdHMgbmV4dCA9IGNvbnZtYXggKiBiYXNlOwotCQkJCWlmIChuZXh0ID4gUHlMb25nX0JBU0UpCi0JCQkJCWJyZWFrOwotCQkJCWNvbnZtYXggPSBuZXh0OwotCQkJCSsraTsKLQkJCX0KLQkJCWNvbnZtdWx0bWF4X2Jhc2VbYmFzZV0gPSBjb252bWF4OwotCQkJYXNzZXJ0KGkgPiAwKTsKLQkJCWNvbnZ3aWR0aF9iYXNlW2Jhc2VdID0gaTsKLQkJfQorICAgICAgICAgICAgbG9nX2Jhc2VfUHlMb25nX0JBU0VbYmFzZV0gPSBsb2coKGRvdWJsZSliYXNlKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coKGRvdWJsZSlQeUxvbmdfQkFTRSk7CisgICAgICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICAgICAgdHdvZGlnaXRzIG5leHQgPSBjb252bWF4ICogYmFzZTsKKyAgICAgICAgICAgICAgICBpZiAobmV4dCA+IFB5TG9uZ19CQVNFKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjb252bWF4ID0gbmV4dDsKKyAgICAgICAgICAgICAgICArK2k7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb252bXVsdG1heF9iYXNlW2Jhc2VdID0gY29udm1heDsKKyAgICAgICAgICAgIGFzc2VydChpID4gMCk7CisgICAgICAgICAgICBjb252d2lkdGhfYmFzZVtiYXNlXSA9IGk7CisgICAgICAgIH0KIAotCQkvKiBGaW5kIGxlbmd0aCBvZiB0aGUgc3RyaW5nIG9mIG51bWVyaWMgY2hhcmFjdGVycy4gKi8KLQkJc2NhbiA9IHN0cjsKLQkJd2hpbGUgKF9QeUxvbmdfRGlnaXRWYWx1ZVtQeV9DSEFSTUFTSygqc2NhbildIDwgYmFzZSkKLQkJCSsrc2NhbjsKKyAgICAgICAgLyogRmluZCBsZW5ndGggb2YgdGhlIHN0cmluZyBvZiBudW1lcmljIGNoYXJhY3RlcnMuICovCisgICAgICAgIHNjYW4gPSBzdHI7CisgICAgICAgIHdoaWxlIChfUHlMb25nX0RpZ2l0VmFsdWVbUHlfQ0hBUk1BU0soKnNjYW4pXSA8IGJhc2UpCisgICAgICAgICAgICArK3NjYW47CiAKLQkJLyogQ3JlYXRlIGEgbG9uZyBvYmplY3QgdGhhdCBjYW4gY29udGFpbiB0aGUgbGFyZ2VzdCBwb3NzaWJsZQotCQkgKiBpbnRlZ2VyIHdpdGggdGhpcyBiYXNlIGFuZCBsZW5ndGguICBOb3RlIHRoYXQgdGhlcmUncyBubwotCQkgKiBuZWVkIHRvIGluaXRpYWxpemUgei0+b2JfZGlnaXQgLS0gbm8gc2xvdCBpcyByZWFkIHVwIGJlZm9yZQotCQkgKiBiZWluZyBzdG9yZWQgaW50by4KLQkJICovCi0JCXNpemVfeiA9IChQeV9zc2l6ZV90KSgoc2NhbiAtIHN0cikgKiBsb2dfYmFzZV9QeUxvbmdfQkFTRVtiYXNlXSkgKyAxOwotCQkvKiBVbmNvbW1lbnQgbmV4dCBsaW5lIHRvIHRlc3QgZXhjZWVkaW5nbHkgcmFyZSBjb3B5IGNvZGUgKi8KLQkJLyogc2l6ZV96ID0gMTsgKi8KLQkJYXNzZXJ0KHNpemVfeiA+IDApOwotCQl6ID0gX1B5TG9uZ19OZXcoc2l6ZV96KTsKLQkJaWYgKHogPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQlQeV9TSVpFKHopID0gMDsKKyAgICAgICAgLyogQ3JlYXRlIGEgbG9uZyBvYmplY3QgdGhhdCBjYW4gY29udGFpbiB0aGUgbGFyZ2VzdCBwb3NzaWJsZQorICAgICAgICAgKiBpbnRlZ2VyIHdpdGggdGhpcyBiYXNlIGFuZCBsZW5ndGguICBOb3RlIHRoYXQgdGhlcmUncyBubworICAgICAgICAgKiBuZWVkIHRvIGluaXRpYWxpemUgei0+b2JfZGlnaXQgLS0gbm8gc2xvdCBpcyByZWFkIHVwIGJlZm9yZQorICAgICAgICAgKiBiZWluZyBzdG9yZWQgaW50by4KKyAgICAgICAgICovCisgICAgICAgIHNpemVfeiA9IChQeV9zc2l6ZV90KSgoc2NhbiAtIHN0cikgKiBsb2dfYmFzZV9QeUxvbmdfQkFTRVtiYXNlXSkgKyAxOworICAgICAgICAvKiBVbmNvbW1lbnQgbmV4dCBsaW5lIHRvIHRlc3QgZXhjZWVkaW5nbHkgcmFyZSBjb3B5IGNvZGUgKi8KKyAgICAgICAgLyogc2l6ZV96ID0gMTsgKi8KKyAgICAgICAgYXNzZXJ0KHNpemVfeiA+IDApOworICAgICAgICB6ID0gX1B5TG9uZ19OZXcoc2l6ZV96KTsKKyAgICAgICAgaWYgKHogPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBQeV9TSVpFKHopID0gMDsKIAotCQkvKiBgY29udndpZHRoYCBjb25zZWN1dGl2ZSBpbnB1dCBkaWdpdHMgYXJlIHRyZWF0ZWQgYXMgYSBzaW5nbGUKLQkJICogZGlnaXQgaW4gYmFzZSBgY29udm11bHRtYXhgLgotCQkgKi8KLQkJY29udndpZHRoID0gY29udndpZHRoX2Jhc2VbYmFzZV07Ci0JCWNvbnZtdWx0bWF4ID0gY29udm11bHRtYXhfYmFzZVtiYXNlXTsKKyAgICAgICAgLyogYGNvbnZ3aWR0aGAgY29uc2VjdXRpdmUgaW5wdXQgZGlnaXRzIGFyZSB0cmVhdGVkIGFzIGEgc2luZ2xlCisgICAgICAgICAqIGRpZ2l0IGluIGJhc2UgYGNvbnZtdWx0bWF4YC4KKyAgICAgICAgICovCisgICAgICAgIGNvbnZ3aWR0aCA9IGNvbnZ3aWR0aF9iYXNlW2Jhc2VdOworICAgICAgICBjb252bXVsdG1heCA9IGNvbnZtdWx0bWF4X2Jhc2VbYmFzZV07CiAKLQkJLyogV29yayA7LSkgKi8KLQkJd2hpbGUgKHN0ciA8IHNjYW4pIHsKLQkJCS8qIGdyYWIgdXAgdG8gY29udndpZHRoIGRpZ2l0cyBmcm9tIHRoZSBpbnB1dCBzdHJpbmcgKi8KLQkJCWMgPSAoZGlnaXQpX1B5TG9uZ19EaWdpdFZhbHVlW1B5X0NIQVJNQVNLKCpzdHIrKyldOwotCQkJZm9yIChpID0gMTsgaSA8IGNvbnZ3aWR0aCAmJiBzdHIgIT0gc2NhbjsgKytpLCArK3N0cikgewotCQkJCWMgPSAodHdvZGlnaXRzKShjICogIGJhc2UgKwotCQkJCQlfUHlMb25nX0RpZ2l0VmFsdWVbUHlfQ0hBUk1BU0soKnN0cildKTsKLQkJCQlhc3NlcnQoYyA8IFB5TG9uZ19CQVNFKTsKLQkJCX0KKyAgICAgICAgLyogV29yayA7LSkgKi8KKyAgICAgICAgd2hpbGUgKHN0ciA8IHNjYW4pIHsKKyAgICAgICAgICAgIC8qIGdyYWIgdXAgdG8gY29udndpZHRoIGRpZ2l0cyBmcm9tIHRoZSBpbnB1dCBzdHJpbmcgKi8KKyAgICAgICAgICAgIGMgPSAoZGlnaXQpX1B5TG9uZ19EaWdpdFZhbHVlW1B5X0NIQVJNQVNLKCpzdHIrKyldOworICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IGNvbnZ3aWR0aCAmJiBzdHIgIT0gc2NhbjsgKytpLCArK3N0cikgeworICAgICAgICAgICAgICAgIGMgPSAodHdvZGlnaXRzKShjICogIGJhc2UgKworICAgICAgICAgICAgICAgICAgICBfUHlMb25nX0RpZ2l0VmFsdWVbUHlfQ0hBUk1BU0soKnN0cildKTsKKyAgICAgICAgICAgICAgICBhc3NlcnQoYyA8IFB5TG9uZ19CQVNFKTsKKyAgICAgICAgICAgIH0KIAotCQkJY29udm11bHQgPSBjb252bXVsdG1heDsKLQkJCS8qIENhbGN1bGF0ZSB0aGUgc2hpZnQgb25seSBpZiB3ZSBjb3VsZG4ndCBnZXQKLQkJCSAqIGNvbnZ3aWR0aCBkaWdpdHMuCi0JCQkgKi8KLQkJCWlmIChpICE9IGNvbnZ3aWR0aCkgewotCQkJCWNvbnZtdWx0ID0gYmFzZTsKLQkJCQlmb3IgKCA7IGkgPiAxOyAtLWkpCi0JCQkJCWNvbnZtdWx0ICo9IGJhc2U7Ci0JCQl9CisgICAgICAgICAgICBjb252bXVsdCA9IGNvbnZtdWx0bWF4OworICAgICAgICAgICAgLyogQ2FsY3VsYXRlIHRoZSBzaGlmdCBvbmx5IGlmIHdlIGNvdWxkbid0IGdldAorICAgICAgICAgICAgICogY29udndpZHRoIGRpZ2l0cy4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKGkgIT0gY29udndpZHRoKSB7CisgICAgICAgICAgICAgICAgY29udm11bHQgPSBiYXNlOworICAgICAgICAgICAgICAgIGZvciAoIDsgaSA+IDE7IC0taSkKKyAgICAgICAgICAgICAgICAgICAgY29udm11bHQgKj0gYmFzZTsKKyAgICAgICAgICAgIH0KIAotCQkJLyogTXVsdGlwbHkgeiBieSBjb252bXVsdCwgYW5kIGFkZCBjLiAqLwotCQkJcHogPSB6LT5vYl9kaWdpdDsKLQkJCXB6c3RvcCA9IHB6ICsgUHlfU0laRSh6KTsKLQkJCWZvciAoOyBweiA8IHB6c3RvcDsgKytweikgewotCQkJCWMgKz0gKHR3b2RpZ2l0cykqcHogKiBjb252bXVsdDsKLQkJCQkqcHogPSAoZGlnaXQpKGMgJiBQeUxvbmdfTUFTSyk7Ci0JCQkJYyA+Pj0gUHlMb25nX1NISUZUOwotCQkJfQotCQkJLyogY2Fycnkgb2ZmIHRoZSBjdXJyZW50IGVuZD8gKi8KLQkJCWlmIChjKSB7Ci0JCQkJYXNzZXJ0KGMgPCBQeUxvbmdfQkFTRSk7Ci0JCQkJaWYgKFB5X1NJWkUoeikgPCBzaXplX3opIHsKLQkJCQkJKnB6ID0gKGRpZ2l0KWM7Ci0JCQkJCSsrUHlfU0laRSh6KTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCVB5TG9uZ09iamVjdCAqdG1wOwotCQkJCQkvKiBFeHRyZW1lbHkgcmFyZS4gIEdldCBtb3JlIHNwYWNlLiAqLwotCQkJCQlhc3NlcnQoUHlfU0laRSh6KSA9PSBzaXplX3opOwotCQkJCQl0bXAgPSBfUHlMb25nX05ldyhzaXplX3ogKyAxKTsKLQkJCQkJaWYgKHRtcCA9PSBOVUxMKSB7Ci0JCQkJCQlQeV9ERUNSRUYoeik7Ci0JCQkJCQlyZXR1cm4gTlVMTDsKLQkJCQkJfQotCQkJCQltZW1jcHkodG1wLT5vYl9kaWdpdCwKLQkJCQkJICAgICAgIHotPm9iX2RpZ2l0LAotCQkJCQkgICAgICAgc2l6ZW9mKGRpZ2l0KSAqIHNpemVfeik7Ci0JCQkJCVB5X0RFQ1JFRih6KTsKLQkJCQkJeiA9IHRtcDsKLQkJCQkJei0+b2JfZGlnaXRbc2l6ZV96XSA9IChkaWdpdCljOwotCQkJCQkrK3NpemVfejsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JaWYgKHogPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKHN0ciA9PSBzdGFydCkKLQkJZ290byBvbkVycm9yOwotCWlmIChzaWduIDwgMCkKLQkJUHlfU0laRSh6KSA9IC0oUHlfU0laRSh6KSk7Ci0JaWYgKCpzdHIgPT0gJ0wnIHx8ICpzdHIgPT0gJ2wnKQotCQlzdHIrKzsKLQl3aGlsZSAoKnN0ciAmJiBpc3NwYWNlKFB5X0NIQVJNQVNLKCpzdHIpKSkKLQkJc3RyKys7Ci0JaWYgKCpzdHIgIT0gJ1wwJykKLQkJZ290byBvbkVycm9yOwotCWlmIChwZW5kKQotCQkqcGVuZCA9IHN0cjsKLQlyZXR1cm4gKFB5T2JqZWN0ICopIHo7CisgICAgICAgICAgICAvKiBNdWx0aXBseSB6IGJ5IGNvbnZtdWx0LCBhbmQgYWRkIGMuICovCisgICAgICAgICAgICBweiA9IHotPm9iX2RpZ2l0OworICAgICAgICAgICAgcHpzdG9wID0gcHogKyBQeV9TSVpFKHopOworICAgICAgICAgICAgZm9yICg7IHB6IDwgcHpzdG9wOyArK3B6KSB7CisgICAgICAgICAgICAgICAgYyArPSAodHdvZGlnaXRzKSpweiAqIGNvbnZtdWx0OworICAgICAgICAgICAgICAgICpweiA9IChkaWdpdCkoYyAmIFB5TG9uZ19NQVNLKTsKKyAgICAgICAgICAgICAgICBjID4+PSBQeUxvbmdfU0hJRlQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBjYXJyeSBvZmYgdGhlIGN1cnJlbnQgZW5kPyAqLworICAgICAgICAgICAgaWYgKGMpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnQoYyA8IFB5TG9uZ19CQVNFKTsKKyAgICAgICAgICAgICAgICBpZiAoUHlfU0laRSh6KSA8IHNpemVfeikgeworICAgICAgICAgICAgICAgICAgICAqcHogPSAoZGlnaXQpYzsKKyAgICAgICAgICAgICAgICAgICAgKytQeV9TSVpFKHopOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgUHlMb25nT2JqZWN0ICp0bXA7CisgICAgICAgICAgICAgICAgICAgIC8qIEV4dHJlbWVseSByYXJlLiAgR2V0IG1vcmUgc3BhY2UuICovCisgICAgICAgICAgICAgICAgICAgIGFzc2VydChQeV9TSVpFKHopID09IHNpemVfeik7CisgICAgICAgICAgICAgICAgICAgIHRtcCA9IF9QeUxvbmdfTmV3KHNpemVfeiArIDEpOworICAgICAgICAgICAgICAgICAgICBpZiAodG1wID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih6KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1lbWNweSh0bXAtPm9iX2RpZ2l0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgei0+b2JfZGlnaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZGlnaXQpICogc2l6ZV96KTsKKyAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHopOworICAgICAgICAgICAgICAgICAgICB6ID0gdG1wOworICAgICAgICAgICAgICAgICAgICB6LT5vYl9kaWdpdFtzaXplX3pdID0gKGRpZ2l0KWM7CisgICAgICAgICAgICAgICAgICAgICsrc2l6ZV96OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoeiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoc3RyID09IHN0YXJ0KQorICAgICAgICBnb3RvIG9uRXJyb3I7CisgICAgaWYgKHNpZ24gPCAwKQorICAgICAgICBQeV9TSVpFKHopID0gLShQeV9TSVpFKHopKTsKKyAgICBpZiAoKnN0ciA9PSAnTCcgfHwgKnN0ciA9PSAnbCcpCisgICAgICAgIHN0cisrOworICAgIHdoaWxlICgqc3RyICYmIGlzc3BhY2UoUHlfQ0hBUk1BU0soKnN0cikpKQorICAgICAgICBzdHIrKzsKKyAgICBpZiAoKnN0ciAhPSAnXDAnKQorICAgICAgICBnb3RvIG9uRXJyb3I7CisgICAgaWYgKHBlbmQpCisgICAgICAgICpwZW5kID0gc3RyOworICAgIHJldHVybiAoUHlPYmplY3QgKikgejsKIAogIG9uRXJyb3I6Ci0JUHlfWERFQ1JFRih6KTsKLQlzbGVuID0gc3RybGVuKG9yaWdfc3RyKSA8IDIwMCA/IHN0cmxlbihvcmlnX3N0cikgOiAyMDA7Ci0Jc3Ryb2JqID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUob3JpZ19zdHIsIHNsZW4pOwotCWlmIChzdHJvYmogPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0Jc3RycmVwciA9IFB5T2JqZWN0X1JlcHIoc3Ryb2JqKTsKLQlQeV9ERUNSRUYoc3Ryb2JqKTsKLQlpZiAoc3RycmVwciA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKLQkJICAgICAiaW52YWxpZCBsaXRlcmFsIGZvciBsb25nKCkgd2l0aCBiYXNlICVkOiAlcyIsCi0JCSAgICAgYmFzZSwgUHlTdHJpbmdfQVNfU1RSSU5HKHN0cnJlcHIpKTsKLQlQeV9ERUNSRUYoc3RycmVwcik7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlfWERFQ1JFRih6KTsKKyAgICBzbGVuID0gc3RybGVuKG9yaWdfc3RyKSA8IDIwMCA/IHN0cmxlbihvcmlnX3N0cikgOiAyMDA7CisgICAgc3Ryb2JqID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUob3JpZ19zdHIsIHNsZW4pOworICAgIGlmIChzdHJvYmogPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgc3RycmVwciA9IFB5T2JqZWN0X1JlcHIoc3Ryb2JqKTsKKyAgICBQeV9ERUNSRUYoc3Ryb2JqKTsKKyAgICBpZiAoc3RycmVwciA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgImludmFsaWQgbGl0ZXJhbCBmb3IgbG9uZygpIHdpdGggYmFzZSAlZDogJXMiLAorICAgICAgICAgICAgICAgICBiYXNlLCBQeVN0cmluZ19BU19TVFJJTkcoc3RycmVwcikpOworICAgIFB5X0RFQ1JFRihzdHJyZXByKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKIFB5T2JqZWN0ICoKIFB5TG9uZ19Gcm9tVW5pY29kZShQeV9VTklDT0RFICp1LCBQeV9zc2l6ZV90IGxlbmd0aCwgaW50IGJhc2UpCiB7Ci0JUHlPYmplY3QgKnJlc3VsdDsKLQljaGFyICpidWZmZXIgPSAoY2hhciAqKVB5TWVtX01BTExPQyhsZW5ndGgrMSk7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICBjaGFyICpidWZmZXIgPSAoY2hhciAqKVB5TWVtX01BTExPQyhsZW5ndGgrMSk7CiAKLQlpZiAoYnVmZmVyID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIGlmIChidWZmZXIgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoUHlVbmljb2RlX0VuY29kZURlY2ltYWwodSwgbGVuZ3RoLCBidWZmZXIsIE5VTEwpKSB7Ci0JCVB5TWVtX0ZSRUUoYnVmZmVyKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJlc3VsdCA9IFB5TG9uZ19Gcm9tU3RyaW5nKGJ1ZmZlciwgTlVMTCwgYmFzZSk7Ci0JUHlNZW1fRlJFRShidWZmZXIpOwotCXJldHVybiByZXN1bHQ7CisgICAgaWYgKFB5VW5pY29kZV9FbmNvZGVEZWNpbWFsKHUsIGxlbmd0aCwgYnVmZmVyLCBOVUxMKSkgeworICAgICAgICBQeU1lbV9GUkVFKGJ1ZmZlcik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXN1bHQgPSBQeUxvbmdfRnJvbVN0cmluZyhidWZmZXIsIE5VTEwsIGJhc2UpOworICAgIFB5TWVtX0ZSRUUoYnVmZmVyKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogI2VuZGlmCiAKIC8qIGZvcndhcmQgKi8KIHN0YXRpYyBQeUxvbmdPYmplY3QgKnhfZGl2cmVtCi0JKFB5TG9uZ09iamVjdCAqLCBQeUxvbmdPYmplY3QgKiwgUHlMb25nT2JqZWN0ICoqKTsKKyAgICAoUHlMb25nT2JqZWN0ICosIFB5TG9uZ09iamVjdCAqLCBQeUxvbmdPYmplY3QgKiopOwogc3RhdGljIFB5T2JqZWN0ICpsb25nX2xvbmcoUHlPYmplY3QgKnYpOwogc3RhdGljIGludCBsb25nX2RpdnJlbShQeUxvbmdPYmplY3QgKiwgUHlMb25nT2JqZWN0ICosCi0JUHlMb25nT2JqZWN0ICoqLCBQeUxvbmdPYmplY3QgKiopOworICAgIFB5TG9uZ09iamVjdCAqKiwgUHlMb25nT2JqZWN0ICoqKTsKIAogLyogTG9uZyBkaXZpc2lvbiB3aXRoIHJlbWFpbmRlciwgdG9wLWxldmVsIHJvdXRpbmUgKi8KIAogc3RhdGljIGludAogbG9uZ19kaXZyZW0oUHlMb25nT2JqZWN0ICphLCBQeUxvbmdPYmplY3QgKmIsCi0JICAgIFB5TG9uZ09iamVjdCAqKnBkaXYsIFB5TG9uZ09iamVjdCAqKnByZW0pCisgICAgICAgICAgICBQeUxvbmdPYmplY3QgKipwZGl2LCBQeUxvbmdPYmplY3QgKipwcmVtKQogewotCVB5X3NzaXplX3Qgc2l6ZV9hID0gQUJTKFB5X1NJWkUoYSkpLCBzaXplX2IgPSBBQlMoUHlfU0laRShiKSk7Ci0JUHlMb25nT2JqZWN0ICp6OworICAgIFB5X3NzaXplX3Qgc2l6ZV9hID0gQUJTKFB5X1NJWkUoYSkpLCBzaXplX2IgPSBBQlMoUHlfU0laRShiKSk7CisgICAgUHlMb25nT2JqZWN0ICp6OwogCi0JaWYgKHNpemVfYiA9PSAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19aZXJvRGl2aXNpb25FcnJvciwKLQkJCQkibG9uZyBkaXZpc2lvbiBvciBtb2R1bG8gYnkgemVybyIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmIChzaXplX2EgPCBzaXplX2IgfHwKLQkgICAgKHNpemVfYSA9PSBzaXplX2IgJiYKLQkgICAgIGEtPm9iX2RpZ2l0W3NpemVfYS0xXSA8IGItPm9iX2RpZ2l0W3NpemVfYi0xXSkpIHsKLQkJLyogfGF8IDwgfGJ8LiAqLwotCQkqcGRpdiA9IF9QeUxvbmdfTmV3KDApOwotCQlpZiAoKnBkaXYgPT0gTlVMTCkKLQkJCXJldHVybiAtMTsKLQkJUHlfSU5DUkVGKGEpOwotCQkqcHJlbSA9IChQeUxvbmdPYmplY3QgKikgYTsKLQkJcmV0dXJuIDA7Ci0JfQotCWlmIChzaXplX2IgPT0gMSkgewotCQlkaWdpdCByZW0gPSAwOwotCQl6ID0gZGl2cmVtMShhLCBiLT5vYl9kaWdpdFswXSwgJnJlbSk7Ci0JCWlmICh6ID09IE5VTEwpCi0JCQlyZXR1cm4gLTE7Ci0JCSpwcmVtID0gKFB5TG9uZ09iamVjdCAqKSBQeUxvbmdfRnJvbUxvbmcoKGxvbmcpcmVtKTsKLQkJaWYgKCpwcmVtID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRih6KTsKLQkJCXJldHVybiAtMTsKLQkJfQotCX0KLQllbHNlIHsKLQkJeiA9IHhfZGl2cmVtKGEsIGIsIHByZW0pOwotCQlpZiAoeiA9PSBOVUxMKQotCQkJcmV0dXJuIC0xOwotCX0KLQkvKiBTZXQgdGhlIHNpZ25zLgotCSAgIFRoZSBxdW90aWVudCB6IGhhcyB0aGUgc2lnbiBvZiBhKmI7Ci0JICAgdGhlIHJlbWFpbmRlciByIGhhcyB0aGUgc2lnbiBvZiBhLAotCSAgIHNvIGEgPSBiKnogKyByLiAqLwotCWlmICgoYS0+b2Jfc2l6ZSA8IDApICE9IChiLT5vYl9zaXplIDwgMCkpCi0JCXotPm9iX3NpemUgPSAtKHotPm9iX3NpemUpOwotCWlmIChhLT5vYl9zaXplIDwgMCAmJiAoKnByZW0pLT5vYl9zaXplICE9IDApCi0JCSgqcHJlbSktPm9iX3NpemUgPSAtKCgqcHJlbSktPm9iX3NpemUpOwotCSpwZGl2ID0gejsKLQlyZXR1cm4gMDsKKyAgICBpZiAoc2l6ZV9iID09IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1plcm9EaXZpc2lvbkVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImxvbmcgZGl2aXNpb24gb3IgbW9kdWxvIGJ5IHplcm8iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoc2l6ZV9hIDwgc2l6ZV9iIHx8CisgICAgICAgIChzaXplX2EgPT0gc2l6ZV9iICYmCisgICAgICAgICBhLT5vYl9kaWdpdFtzaXplX2EtMV0gPCBiLT5vYl9kaWdpdFtzaXplX2ItMV0pKSB7CisgICAgICAgIC8qIHxhfCA8IHxifC4gKi8KKyAgICAgICAgKnBkaXYgPSBfUHlMb25nX05ldygwKTsKKyAgICAgICAgaWYgKCpwZGl2ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIFB5X0lOQ1JFRihhKTsKKyAgICAgICAgKnByZW0gPSAoUHlMb25nT2JqZWN0ICopIGE7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoc2l6ZV9iID09IDEpIHsKKyAgICAgICAgZGlnaXQgcmVtID0gMDsKKyAgICAgICAgeiA9IGRpdnJlbTEoYSwgYi0+b2JfZGlnaXRbMF0sICZyZW0pOworICAgICAgICBpZiAoeiA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAqcHJlbSA9IChQeUxvbmdPYmplY3QgKikgUHlMb25nX0Zyb21Mb25nKChsb25nKXJlbSk7CisgICAgICAgIGlmICgqcHJlbSA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoeik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHogPSB4X2RpdnJlbShhLCBiLCBwcmVtKTsKKyAgICAgICAgaWYgKHogPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgLyogU2V0IHRoZSBzaWducy4KKyAgICAgICBUaGUgcXVvdGllbnQgeiBoYXMgdGhlIHNpZ24gb2YgYSpiOworICAgICAgIHRoZSByZW1haW5kZXIgciBoYXMgdGhlIHNpZ24gb2YgYSwKKyAgICAgICBzbyBhID0gYip6ICsgci4gKi8KKyAgICBpZiAoKGEtPm9iX3NpemUgPCAwKSAhPSAoYi0+b2Jfc2l6ZSA8IDApKQorICAgICAgICB6LT5vYl9zaXplID0gLSh6LT5vYl9zaXplKTsKKyAgICBpZiAoYS0+b2Jfc2l6ZSA8IDAgJiYgKCpwcmVtKS0+b2Jfc2l6ZSAhPSAwKQorICAgICAgICAoKnByZW0pLT5vYl9zaXplID0gLSgoKnByZW0pLT5vYl9zaXplKTsKKyAgICAqcGRpdiA9IHo7CisgICAgcmV0dXJuIDA7CiB9CiAKIC8qIFVuc2lnbmVkIGxvbmcgZGl2aXNpb24gd2l0aCByZW1haW5kZXIgLS0gdGhlIGFsZ29yaXRobSAqLwpAQCAtMTgxOSw5OSArMTgxOSw5OSBAQAogc3RhdGljIFB5TG9uZ09iamVjdCAqCiB4X2RpdnJlbShQeUxvbmdPYmplY3QgKnYxLCBQeUxvbmdPYmplY3QgKncxLCBQeUxvbmdPYmplY3QgKipwcmVtKQogewotCVB5X3NzaXplX3Qgc2l6ZV92ID0gQUJTKFB5X1NJWkUodjEpKSwgc2l6ZV93ID0gQUJTKFB5X1NJWkUodzEpKTsKLQlkaWdpdCBkID0gKGRpZ2l0KSAoKHR3b2RpZ2l0cylQeUxvbmdfQkFTRSAvICh3MS0+b2JfZGlnaXRbc2l6ZV93LTFdICsgMSkpOwotCVB5TG9uZ09iamVjdCAqdiA9IG11bDEodjEsIGQpOwotCVB5TG9uZ09iamVjdCAqdyA9IG11bDEodzEsIGQpOwotCVB5TG9uZ09iamVjdCAqYTsKLQlQeV9zc2l6ZV90IGosIGs7CisgICAgUHlfc3NpemVfdCBzaXplX3YgPSBBQlMoUHlfU0laRSh2MSkpLCBzaXplX3cgPSBBQlMoUHlfU0laRSh3MSkpOworICAgIGRpZ2l0IGQgPSAoZGlnaXQpICgodHdvZGlnaXRzKVB5TG9uZ19CQVNFIC8gKHcxLT5vYl9kaWdpdFtzaXplX3ctMV0gKyAxKSk7CisgICAgUHlMb25nT2JqZWN0ICp2ID0gbXVsMSh2MSwgZCk7CisgICAgUHlMb25nT2JqZWN0ICp3ID0gbXVsMSh3MSwgZCk7CisgICAgUHlMb25nT2JqZWN0ICphOworICAgIFB5X3NzaXplX3QgaiwgazsKIAotCWlmICh2ID09IE5VTEwgfHwgdyA9PSBOVUxMKSB7Ci0JCVB5X1hERUNSRUYodik7Ci0JCVB5X1hERUNSRUYodyk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAodiA9PSBOVUxMIHx8IHcgPT0gTlVMTCkgeworICAgICAgICBQeV9YREVDUkVGKHYpOworICAgICAgICBQeV9YREVDUkVGKHcpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlhc3NlcnQoc2l6ZV92ID49IHNpemVfdyAmJiBzaXplX3cgPiAxKTsgLyogQXNzZXJ0IGNoZWNrcyBieSBkaXYoKSAqLwotCWFzc2VydChQeV9SRUZDTlQodikgPT0gMSk7IC8qIFNpbmNlIHYgd2lsbCBiZSB1c2VkIGFzIGFjY3VtdWxhdG9yISAqLwotCWFzc2VydChzaXplX3cgPT0gQUJTKFB5X1NJWkUodykpKTsgLyogVGhhdCdzIGhvdyBkIHdhcyBjYWxjdWxhdGVkICovCisgICAgYXNzZXJ0KHNpemVfdiA+PSBzaXplX3cgJiYgc2l6ZV93ID4gMSk7IC8qIEFzc2VydCBjaGVja3MgYnkgZGl2KCkgKi8KKyAgICBhc3NlcnQoUHlfUkVGQ05UKHYpID09IDEpOyAvKiBTaW5jZSB2IHdpbGwgYmUgdXNlZCBhcyBhY2N1bXVsYXRvciEgKi8KKyAgICBhc3NlcnQoc2l6ZV93ID09IEFCUyhQeV9TSVpFKHcpKSk7IC8qIFRoYXQncyBob3cgZCB3YXMgY2FsY3VsYXRlZCAqLwogCi0Jc2l6ZV92ID0gQUJTKFB5X1NJWkUodikpOwotCWsgPSBzaXplX3YgLSBzaXplX3c7Ci0JYSA9IF9QeUxvbmdfTmV3KGsgKyAxKTsKKyAgICBzaXplX3YgPSBBQlMoUHlfU0laRSh2KSk7CisgICAgayA9IHNpemVfdiAtIHNpemVfdzsKKyAgICBhID0gX1B5TG9uZ19OZXcoayArIDEpOwogCi0JZm9yIChqID0gc2l6ZV92OyBhICE9IE5VTEwgJiYgayA+PSAwOyAtLWosIC0taykgewotCQlkaWdpdCB2aiA9IChqID49IHNpemVfdikgPyAwIDogdi0+b2JfZGlnaXRbal07Ci0JCXR3b2RpZ2l0cyBxOwotCQlzdHdvZGlnaXRzIGNhcnJ5ID0gMDsKLQkJUHlfc3NpemVfdCBpOworICAgIGZvciAoaiA9IHNpemVfdjsgYSAhPSBOVUxMICYmIGsgPj0gMDsgLS1qLCAtLWspIHsKKyAgICAgICAgZGlnaXQgdmogPSAoaiA+PSBzaXplX3YpID8gMCA6IHYtPm9iX2RpZ2l0W2pdOworICAgICAgICB0d29kaWdpdHMgcTsKKyAgICAgICAgc3R3b2RpZ2l0cyBjYXJyeSA9IDA7CisgICAgICAgIFB5X3NzaXplX3QgaTsKIAotCQlTSUdDSEVDSyh7Ci0JCQlQeV9ERUNSRUYoYSk7Ci0JCQlhID0gTlVMTDsKLQkJCWJyZWFrOwotCQl9KQotCQlpZiAodmogPT0gdy0+b2JfZGlnaXRbc2l6ZV93LTFdKQotCQkJcSA9IFB5TG9uZ19NQVNLOwotCQllbHNlCi0JCQlxID0gKCgodHdvZGlnaXRzKXZqIDw8IFB5TG9uZ19TSElGVCkgKyB2LT5vYl9kaWdpdFtqLTFdKSAvCi0JCQkJdy0+b2JfZGlnaXRbc2l6ZV93LTFdOworICAgICAgICBTSUdDSEVDSyh7CisgICAgICAgICAgICBQeV9ERUNSRUYoYSk7CisgICAgICAgICAgICBhID0gTlVMTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9KQorICAgICAgICBpZiAodmogPT0gdy0+b2JfZGlnaXRbc2l6ZV93LTFdKQorICAgICAgICAgICAgcSA9IFB5TG9uZ19NQVNLOworICAgICAgICBlbHNlCisgICAgICAgICAgICBxID0gKCgodHdvZGlnaXRzKXZqIDw8IFB5TG9uZ19TSElGVCkgKyB2LT5vYl9kaWdpdFtqLTFdKSAvCisgICAgICAgICAgICAgICAgdy0+b2JfZGlnaXRbc2l6ZV93LTFdOwogCi0JCXdoaWxlICh3LT5vYl9kaWdpdFtzaXplX3ctMl0qcSA+Ci0JCQkJKCgKLQkJCQkJKCh0d29kaWdpdHMpdmogPDwgUHlMb25nX1NISUZUKQotCQkJCQkrIHYtPm9iX2RpZ2l0W2otMV0KLQkJCQkJLSBxKnctPm9iX2RpZ2l0W3NpemVfdy0xXQotCQkJCQkJCQkpIDw8IFB5TG9uZ19TSElGVCkKLQkJCQkrIHYtPm9iX2RpZ2l0W2otMl0pCi0JCQktLXE7CisgICAgICAgIHdoaWxlICh3LT5vYl9kaWdpdFtzaXplX3ctMl0qcSA+CisgICAgICAgICAgICAgICAgICAgICAgICAoKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHR3b2RpZ2l0cyl2aiA8PCBQeUxvbmdfU0hJRlQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdi0+b2JfZGlnaXRbai0xXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHEqdy0+b2JfZGlnaXRbc2l6ZV93LTFdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgPDwgUHlMb25nX1NISUZUKQorICAgICAgICAgICAgICAgICAgICAgICAgKyB2LT5vYl9kaWdpdFtqLTJdKQorICAgICAgICAgICAgLS1xOwogCi0JCWZvciAoaSA9IDA7IGkgPCBzaXplX3cgJiYgaStrIDwgc2l6ZV92OyArK2kpIHsKLQkJCXR3b2RpZ2l0cyB6ID0gdy0+b2JfZGlnaXRbaV0gKiBxOwotCQkJZGlnaXQgenogPSAoZGlnaXQpICh6ID4+IFB5TG9uZ19TSElGVCk7Ci0JCQljYXJyeSArPSB2LT5vYl9kaWdpdFtpK2tdIC0gegotCQkJCSsgKCh0d29kaWdpdHMpenogPDwgUHlMb25nX1NISUZUKTsKLQkJCXYtPm9iX2RpZ2l0W2kra10gPSAoZGlnaXQpKGNhcnJ5ICYgUHlMb25nX01BU0spOwotCQkJY2FycnkgPSBQeV9BUklUSE1FVElDX1JJR0hUX1NISUZUKEJBU0VfVFdPRElHSVRTX1RZUEUsCi0JCQkJCQkJICBjYXJyeSwgUHlMb25nX1NISUZUKTsKLQkJCWNhcnJ5IC09IHp6OwotCQl9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplX3cgJiYgaStrIDwgc2l6ZV92OyArK2kpIHsKKyAgICAgICAgICAgIHR3b2RpZ2l0cyB6ID0gdy0+b2JfZGlnaXRbaV0gKiBxOworICAgICAgICAgICAgZGlnaXQgenogPSAoZGlnaXQpICh6ID4+IFB5TG9uZ19TSElGVCk7CisgICAgICAgICAgICBjYXJyeSArPSB2LT5vYl9kaWdpdFtpK2tdIC0gegorICAgICAgICAgICAgICAgICsgKCh0d29kaWdpdHMpenogPDwgUHlMb25nX1NISUZUKTsKKyAgICAgICAgICAgIHYtPm9iX2RpZ2l0W2kra10gPSAoZGlnaXQpKGNhcnJ5ICYgUHlMb25nX01BU0spOworICAgICAgICAgICAgY2FycnkgPSBQeV9BUklUSE1FVElDX1JJR0hUX1NISUZUKEJBU0VfVFdPRElHSVRTX1RZUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FycnksIFB5TG9uZ19TSElGVCk7CisgICAgICAgICAgICBjYXJyeSAtPSB6ejsKKyAgICAgICAgfQogCi0JCWlmIChpK2sgPCBzaXplX3YpIHsKLQkJCWNhcnJ5ICs9IHYtPm9iX2RpZ2l0W2kra107Ci0JCQl2LT5vYl9kaWdpdFtpK2tdID0gMDsKLQkJfQorICAgICAgICBpZiAoaStrIDwgc2l6ZV92KSB7CisgICAgICAgICAgICBjYXJyeSArPSB2LT5vYl9kaWdpdFtpK2tdOworICAgICAgICAgICAgdi0+b2JfZGlnaXRbaStrXSA9IDA7CisgICAgICAgIH0KIAotCQlpZiAoY2FycnkgPT0gMCkKLQkJCWEtPm9iX2RpZ2l0W2tdID0gKGRpZ2l0KSBxOwotCQllbHNlIHsKLQkJCWFzc2VydChjYXJyeSA9PSAtMSk7Ci0JCQlhLT5vYl9kaWdpdFtrXSA9IChkaWdpdCkgcS0xOwotCQkJY2FycnkgPSAwOwotCQkJZm9yIChpID0gMDsgaSA8IHNpemVfdyAmJiBpK2sgPCBzaXplX3Y7ICsraSkgewotCQkJCWNhcnJ5ICs9IHYtPm9iX2RpZ2l0W2kra10gKyB3LT5vYl9kaWdpdFtpXTsKLQkJCQl2LT5vYl9kaWdpdFtpK2tdID0gKGRpZ2l0KShjYXJyeSAmIFB5TG9uZ19NQVNLKTsKLQkJCQljYXJyeSA9IFB5X0FSSVRITUVUSUNfUklHSFRfU0hJRlQoCi0JCQkJCQlCQVNFX1RXT0RJR0lUU19UWVBFLAotCQkJCQkJY2FycnksIFB5TG9uZ19TSElGVCk7Ci0JCQl9Ci0JCX0KLQl9IC8qIGZvciBqLCBrICovCisgICAgICAgIGlmIChjYXJyeSA9PSAwKQorICAgICAgICAgICAgYS0+b2JfZGlnaXRba10gPSAoZGlnaXQpIHE7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgYXNzZXJ0KGNhcnJ5ID09IC0xKTsKKyAgICAgICAgICAgIGEtPm9iX2RpZ2l0W2tdID0gKGRpZ2l0KSBxLTE7CisgICAgICAgICAgICBjYXJyeSA9IDA7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZV93ICYmIGkrayA8IHNpemVfdjsgKytpKSB7CisgICAgICAgICAgICAgICAgY2FycnkgKz0gdi0+b2JfZGlnaXRbaStrXSArIHctPm9iX2RpZ2l0W2ldOworICAgICAgICAgICAgICAgIHYtPm9iX2RpZ2l0W2kra10gPSAoZGlnaXQpKGNhcnJ5ICYgUHlMb25nX01BU0spOworICAgICAgICAgICAgICAgIGNhcnJ5ID0gUHlfQVJJVEhNRVRJQ19SSUdIVF9TSElGVCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkFTRV9UV09ESUdJVFNfVFlQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FycnksIFB5TG9uZ19TSElGVCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IC8qIGZvciBqLCBrICovCiAKLQlpZiAoYSA9PSBOVUxMKQotCQkqcHJlbSA9IE5VTEw7Ci0JZWxzZSB7Ci0JCWEgPSBsb25nX25vcm1hbGl6ZShhKTsKLQkJKnByZW0gPSBkaXZyZW0xKHYsIGQsICZkKTsKLQkJLyogZCByZWNlaXZlcyB0aGUgKHVudXNlZCkgcmVtYWluZGVyICovCi0JCWlmICgqcHJlbSA9PSBOVUxMKSB7Ci0JCQlQeV9ERUNSRUYoYSk7Ci0JCQlhID0gTlVMTDsKLQkJfQotCX0KLQlQeV9ERUNSRUYodik7Ci0JUHlfREVDUkVGKHcpOwotCXJldHVybiBhOworICAgIGlmIChhID09IE5VTEwpCisgICAgICAgICpwcmVtID0gTlVMTDsKKyAgICBlbHNlIHsKKyAgICAgICAgYSA9IGxvbmdfbm9ybWFsaXplKGEpOworICAgICAgICAqcHJlbSA9IGRpdnJlbTEodiwgZCwgJmQpOworICAgICAgICAvKiBkIHJlY2VpdmVzIHRoZSAodW51c2VkKSByZW1haW5kZXIgKi8KKyAgICAgICAgaWYgKCpwcmVtID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihhKTsKKyAgICAgICAgICAgIGEgPSBOVUxMOworICAgICAgICB9CisgICAgfQorICAgIFB5X0RFQ1JFRih2KTsKKyAgICBQeV9ERUNSRUYodyk7CisgICAgcmV0dXJuIGE7CiB9CiAKIC8qIE1ldGhvZHMgKi8KQEAgLTE5MTksODQgKzE5MTksODQgQEAKIHN0YXRpYyB2b2lkCiBsb25nX2RlYWxsb2MoUHlPYmplY3QgKnYpCiB7Ci0JUHlfVFlQRSh2KS0+dHBfZnJlZSh2KTsKKyAgICBQeV9UWVBFKHYpLT50cF9mcmVlKHYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbG9uZ19yZXByKFB5T2JqZWN0ICp2KQogewotCXJldHVybiBfUHlMb25nX0Zvcm1hdCh2LCAxMCwgMSwgMCk7CisgICAgcmV0dXJuIF9QeUxvbmdfRm9ybWF0KHYsIDEwLCAxLCAwKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGxvbmdfc3RyKFB5T2JqZWN0ICp2KQogewotCXJldHVybiBfUHlMb25nX0Zvcm1hdCh2LCAxMCwgMCwgMCk7CisgICAgcmV0dXJuIF9QeUxvbmdfRm9ybWF0KHYsIDEwLCAwLCAwKTsKIH0KIAogc3RhdGljIGludAogbG9uZ19jb21wYXJlKFB5TG9uZ09iamVjdCAqYSwgUHlMb25nT2JqZWN0ICpiKQogewotCVB5X3NzaXplX3Qgc2lnbjsKKyAgICBQeV9zc2l6ZV90IHNpZ247CiAKLQlpZiAoUHlfU0laRShhKSAhPSBQeV9TSVpFKGIpKSB7Ci0JCWlmIChBQlMoUHlfU0laRShhKSkgPT0gMCAmJiBBQlMoUHlfU0laRShiKSkgPT0gMCkKLQkJCXNpZ24gPSAwOwotCQllbHNlCi0JCQlzaWduID0gUHlfU0laRShhKSAtIFB5X1NJWkUoYik7Ci0JfQotCWVsc2UgewotCQlQeV9zc2l6ZV90IGkgPSBBQlMoUHlfU0laRShhKSk7Ci0JCXdoaWxlICgtLWkgPj0gMCAmJiBhLT5vYl9kaWdpdFtpXSA9PSBiLT5vYl9kaWdpdFtpXSkKLQkJCTsKLQkJaWYgKGkgPCAwKQotCQkJc2lnbiA9IDA7Ci0JCWVsc2UgewotCQkJc2lnbiA9IChpbnQpYS0+b2JfZGlnaXRbaV0gLSAoaW50KWItPm9iX2RpZ2l0W2ldOwotCQkJaWYgKFB5X1NJWkUoYSkgPCAwKQotCQkJCXNpZ24gPSAtc2lnbjsKLQkJfQotCX0KLQlyZXR1cm4gc2lnbiA8IDAgPyAtMSA6IHNpZ24gPiAwID8gMSA6IDA7CisgICAgaWYgKFB5X1NJWkUoYSkgIT0gUHlfU0laRShiKSkgeworICAgICAgICBpZiAoQUJTKFB5X1NJWkUoYSkpID09IDAgJiYgQUJTKFB5X1NJWkUoYikpID09IDApCisgICAgICAgICAgICBzaWduID0gMDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc2lnbiA9IFB5X1NJWkUoYSkgLSBQeV9TSVpFKGIpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgUHlfc3NpemVfdCBpID0gQUJTKFB5X1NJWkUoYSkpOworICAgICAgICB3aGlsZSAoLS1pID49IDAgJiYgYS0+b2JfZGlnaXRbaV0gPT0gYi0+b2JfZGlnaXRbaV0pCisgICAgICAgICAgICA7CisgICAgICAgIGlmIChpIDwgMCkKKyAgICAgICAgICAgIHNpZ24gPSAwOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHNpZ24gPSAoaW50KWEtPm9iX2RpZ2l0W2ldIC0gKGludCliLT5vYl9kaWdpdFtpXTsKKyAgICAgICAgICAgIGlmIChQeV9TSVpFKGEpIDwgMCkKKyAgICAgICAgICAgICAgICBzaWduID0gLXNpZ247CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNpZ24gPCAwID8gLTEgOiBzaWduID4gMCA/IDEgOiAwOwogfQogCiBzdGF0aWMgbG9uZwogbG9uZ19oYXNoKFB5TG9uZ09iamVjdCAqdikKIHsKLQl1bnNpZ25lZCBsb25nIHg7Ci0JUHlfc3NpemVfdCBpOwotCWludCBzaWduOworICAgIHVuc2lnbmVkIGxvbmcgeDsKKyAgICBQeV9zc2l6ZV90IGk7CisgICAgaW50IHNpZ247CiAKLQkvKiBUaGlzIGlzIGRlc2lnbmVkIHNvIHRoYXQgUHl0aG9uIGludHMgYW5kIGxvbmdzIHdpdGggdGhlCi0JICAgc2FtZSB2YWx1ZSBoYXNoIHRvIHRoZSBzYW1lIHZhbHVlLCBvdGhlcndpc2UgY29tcGFyaXNvbnMKLQkgICBvZiBtYXBwaW5nIGtleXMgd2lsbCB0dXJuIG91dCB3ZWlyZCAqLwotCWkgPSB2LT5vYl9zaXplOwotCXNpZ24gPSAxOwotCXggPSAwOwotCWlmIChpIDwgMCkgewotCQlzaWduID0gLTE7Ci0JCWkgPSAtKGkpOwotCX0KLSNkZWZpbmUgTE9OR19CSVRfUHlMb25nX1NISUZUCSg4KnNpemVvZihsb25nKSAtIFB5TG9uZ19TSElGVCkKLQkvKiBUaGUgZm9sbG93aW5nIGxvb3AgcHJvZHVjZXMgYSBDIHVuc2lnbmVkIGxvbmcgeCBzdWNoIHRoYXQgeCBpcwotCSAgIGNvbmdydWVudCB0byB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdiBtb2R1bG8gVUxPTkdfTUFYLiAgVGhlCi0JICAgcmVzdWx0aW5nIHggaXMgbm9uemVybyBpZiBhbmQgb25seSBpZiB2IGlzLiAqLwotCXdoaWxlICgtLWkgPj0gMCkgewotCQkvKiBGb3JjZSBhIG5hdGl2ZSBsb25nICMtYml0cyAoMzIgb3IgNjQpIGNpcmN1bGFyIHNoaWZ0ICovCi0JCXggPSAoKHggPDwgUHlMb25nX1NISUZUKSAmIH5QeUxvbmdfTUFTSykgfAotCQkJKCh4ID4+IExPTkdfQklUX1B5TG9uZ19TSElGVCkgJiBQeUxvbmdfTUFTSyk7Ci0JCXggKz0gdi0+b2JfZGlnaXRbaV07Ci0JCS8qIElmIHRoZSBhZGRpdGlvbiBhYm92ZSBvdmVyZmxvd2VkIHdlIGNvbXBlbnNhdGUgYnkKLQkJICAgaW5jcmVtZW50aW5nLiAgVGhpcyBwcmVzZXJ2ZXMgdGhlIHZhbHVlIG1vZHVsbwotCQkgICBVTE9OR19NQVguICovCi0JCWlmICh4IDwgdi0+b2JfZGlnaXRbaV0pCi0JCQl4Kys7Ci0JfQorICAgIC8qIFRoaXMgaXMgZGVzaWduZWQgc28gdGhhdCBQeXRob24gaW50cyBhbmQgbG9uZ3Mgd2l0aCB0aGUKKyAgICAgICBzYW1lIHZhbHVlIGhhc2ggdG8gdGhlIHNhbWUgdmFsdWUsIG90aGVyd2lzZSBjb21wYXJpc29ucworICAgICAgIG9mIG1hcHBpbmcga2V5cyB3aWxsIHR1cm4gb3V0IHdlaXJkICovCisgICAgaSA9IHYtPm9iX3NpemU7CisgICAgc2lnbiA9IDE7CisgICAgeCA9IDA7CisgICAgaWYgKGkgPCAwKSB7CisgICAgICAgIHNpZ24gPSAtMTsKKyAgICAgICAgaSA9IC0oaSk7CisgICAgfQorI2RlZmluZSBMT05HX0JJVF9QeUxvbmdfU0hJRlQgICAoOCpzaXplb2YobG9uZykgLSBQeUxvbmdfU0hJRlQpCisgICAgLyogVGhlIGZvbGxvd2luZyBsb29wIHByb2R1Y2VzIGEgQyB1bnNpZ25lZCBsb25nIHggc3VjaCB0aGF0IHggaXMKKyAgICAgICBjb25ncnVlbnQgdG8gdGhlIGFic29sdXRlIHZhbHVlIG9mIHYgbW9kdWxvIFVMT05HX01BWC4gIFRoZQorICAgICAgIHJlc3VsdGluZyB4IGlzIG5vbnplcm8gaWYgYW5kIG9ubHkgaWYgdiBpcy4gKi8KKyAgICB3aGlsZSAoLS1pID49IDApIHsKKyAgICAgICAgLyogRm9yY2UgYSBuYXRpdmUgbG9uZyAjLWJpdHMgKDMyIG9yIDY0KSBjaXJjdWxhciBzaGlmdCAqLworICAgICAgICB4ID0gKCh4IDw8IFB5TG9uZ19TSElGVCkgJiB+UHlMb25nX01BU0spIHwKKyAgICAgICAgICAgICgoeCA+PiBMT05HX0JJVF9QeUxvbmdfU0hJRlQpICYgUHlMb25nX01BU0spOworICAgICAgICB4ICs9IHYtPm9iX2RpZ2l0W2ldOworICAgICAgICAvKiBJZiB0aGUgYWRkaXRpb24gYWJvdmUgb3ZlcmZsb3dlZCB3ZSBjb21wZW5zYXRlIGJ5CisgICAgICAgICAgIGluY3JlbWVudGluZy4gIFRoaXMgcHJlc2VydmVzIHRoZSB2YWx1ZSBtb2R1bG8KKyAgICAgICAgICAgVUxPTkdfTUFYLiAqLworICAgICAgICBpZiAoeCA8IHYtPm9iX2RpZ2l0W2ldKQorICAgICAgICAgICAgeCsrOworICAgIH0KICN1bmRlZiBMT05HX0JJVF9QeUxvbmdfU0hJRlQKLQl4ID0geCAqIHNpZ247Ci0JaWYgKHggPT0gLTEpCi0JCXggPSAtMjsKLQlyZXR1cm4geDsKKyAgICB4ID0geCAqIHNpZ247CisgICAgaWYgKHggPT0gLTEpCisgICAgICAgIHggPSAtMjsKKyAgICByZXR1cm4geDsKIH0KIAogCkBAIC0yMDA1LDMzICsyMDA1LDMzIEBACiBzdGF0aWMgUHlMb25nT2JqZWN0ICoKIHhfYWRkKFB5TG9uZ09iamVjdCAqYSwgUHlMb25nT2JqZWN0ICpiKQogewotCVB5X3NzaXplX3Qgc2l6ZV9hID0gQUJTKFB5X1NJWkUoYSkpLCBzaXplX2IgPSBBQlMoUHlfU0laRShiKSk7Ci0JUHlMb25nT2JqZWN0ICp6OwotCVB5X3NzaXplX3QgaTsKLQlkaWdpdCBjYXJyeSA9IDA7CisgICAgUHlfc3NpemVfdCBzaXplX2EgPSBBQlMoUHlfU0laRShhKSksIHNpemVfYiA9IEFCUyhQeV9TSVpFKGIpKTsKKyAgICBQeUxvbmdPYmplY3QgKno7CisgICAgUHlfc3NpemVfdCBpOworICAgIGRpZ2l0IGNhcnJ5ID0gMDsKIAotCS8qIEVuc3VyZSBhIGlzIHRoZSBsYXJnZXIgb2YgdGhlIHR3bzogKi8KLQlpZiAoc2l6ZV9hIDwgc2l6ZV9iKSB7Ci0JCXsgUHlMb25nT2JqZWN0ICp0ZW1wID0gYTsgYSA9IGI7IGIgPSB0ZW1wOyB9Ci0JCXsgUHlfc3NpemVfdCBzaXplX3RlbXAgPSBzaXplX2E7Ci0JCSAgc2l6ZV9hID0gc2l6ZV9iOwotCQkgIHNpemVfYiA9IHNpemVfdGVtcDsgfQotCX0KLQl6ID0gX1B5TG9uZ19OZXcoc2l6ZV9hKzEpOwotCWlmICh6ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWZvciAoaSA9IDA7IGkgPCBzaXplX2I7ICsraSkgewotCQljYXJyeSArPSBhLT5vYl9kaWdpdFtpXSArIGItPm9iX2RpZ2l0W2ldOwotCQl6LT5vYl9kaWdpdFtpXSA9IGNhcnJ5ICYgUHlMb25nX01BU0s7Ci0JCWNhcnJ5ID4+PSBQeUxvbmdfU0hJRlQ7Ci0JfQotCWZvciAoOyBpIDwgc2l6ZV9hOyArK2kpIHsKLQkJY2FycnkgKz0gYS0+b2JfZGlnaXRbaV07Ci0JCXotPm9iX2RpZ2l0W2ldID0gY2FycnkgJiBQeUxvbmdfTUFTSzsKLQkJY2FycnkgPj49IFB5TG9uZ19TSElGVDsKLQl9Ci0Jei0+b2JfZGlnaXRbaV0gPSBjYXJyeTsKLQlyZXR1cm4gbG9uZ19ub3JtYWxpemUoeik7CisgICAgLyogRW5zdXJlIGEgaXMgdGhlIGxhcmdlciBvZiB0aGUgdHdvOiAqLworICAgIGlmIChzaXplX2EgPCBzaXplX2IpIHsKKyAgICAgICAgeyBQeUxvbmdPYmplY3QgKnRlbXAgPSBhOyBhID0gYjsgYiA9IHRlbXA7IH0KKyAgICAgICAgeyBQeV9zc2l6ZV90IHNpemVfdGVtcCA9IHNpemVfYTsKKyAgICAgICAgICBzaXplX2EgPSBzaXplX2I7CisgICAgICAgICAgc2l6ZV9iID0gc2l6ZV90ZW1wOyB9CisgICAgfQorICAgIHogPSBfUHlMb25nX05ldyhzaXplX2ErMSk7CisgICAgaWYgKHogPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZm9yIChpID0gMDsgaSA8IHNpemVfYjsgKytpKSB7CisgICAgICAgIGNhcnJ5ICs9IGEtPm9iX2RpZ2l0W2ldICsgYi0+b2JfZGlnaXRbaV07CisgICAgICAgIHotPm9iX2RpZ2l0W2ldID0gY2FycnkgJiBQeUxvbmdfTUFTSzsKKyAgICAgICAgY2FycnkgPj49IFB5TG9uZ19TSElGVDsKKyAgICB9CisgICAgZm9yICg7IGkgPCBzaXplX2E7ICsraSkgeworICAgICAgICBjYXJyeSArPSBhLT5vYl9kaWdpdFtpXTsKKyAgICAgICAgei0+b2JfZGlnaXRbaV0gPSBjYXJyeSAmIFB5TG9uZ19NQVNLOworICAgICAgICBjYXJyeSA+Pj0gUHlMb25nX1NISUZUOworICAgIH0KKyAgICB6LT5vYl9kaWdpdFtpXSA9IGNhcnJ5OworICAgIHJldHVybiBsb25nX25vcm1hbGl6ZSh6KTsKIH0KIAogLyogU3VidHJhY3QgdGhlIGFic29sdXRlIHZhbHVlcyBvZiB0d28gaW50ZWdlcnMuICovCkBAIC0yMDM5LDEwNyArMjAzOSwxMDcgQEAKIHN0YXRpYyBQeUxvbmdPYmplY3QgKgogeF9zdWIoUHlMb25nT2JqZWN0ICphLCBQeUxvbmdPYmplY3QgKmIpCiB7Ci0JUHlfc3NpemVfdCBzaXplX2EgPSBBQlMoUHlfU0laRShhKSksIHNpemVfYiA9IEFCUyhQeV9TSVpFKGIpKTsKLQlQeUxvbmdPYmplY3QgKno7Ci0JUHlfc3NpemVfdCBpOwotCWludCBzaWduID0gMTsKLQlkaWdpdCBib3Jyb3cgPSAwOworICAgIFB5X3NzaXplX3Qgc2l6ZV9hID0gQUJTKFB5X1NJWkUoYSkpLCBzaXplX2IgPSBBQlMoUHlfU0laRShiKSk7CisgICAgUHlMb25nT2JqZWN0ICp6OworICAgIFB5X3NzaXplX3QgaTsKKyAgICBpbnQgc2lnbiA9IDE7CisgICAgZGlnaXQgYm9ycm93ID0gMDsKIAotCS8qIEVuc3VyZSBhIGlzIHRoZSBsYXJnZXIgb2YgdGhlIHR3bzogKi8KLQlpZiAoc2l6ZV9hIDwgc2l6ZV9iKSB7Ci0JCXNpZ24gPSAtMTsKLQkJeyBQeUxvbmdPYmplY3QgKnRlbXAgPSBhOyBhID0gYjsgYiA9IHRlbXA7IH0KLQkJeyBQeV9zc2l6ZV90IHNpemVfdGVtcCA9IHNpemVfYTsKLQkJICBzaXplX2EgPSBzaXplX2I7Ci0JCSAgc2l6ZV9iID0gc2l6ZV90ZW1wOyB9Ci0JfQotCWVsc2UgaWYgKHNpemVfYSA9PSBzaXplX2IpIHsKLQkJLyogRmluZCBoaWdoZXN0IGRpZ2l0IHdoZXJlIGEgYW5kIGIgZGlmZmVyOiAqLwotCQlpID0gc2l6ZV9hOwotCQl3aGlsZSAoLS1pID49IDAgJiYgYS0+b2JfZGlnaXRbaV0gPT0gYi0+b2JfZGlnaXRbaV0pCi0JCQk7Ci0JCWlmIChpIDwgMCkKLQkJCXJldHVybiBfUHlMb25nX05ldygwKTsKLQkJaWYgKGEtPm9iX2RpZ2l0W2ldIDwgYi0+b2JfZGlnaXRbaV0pIHsKLQkJCXNpZ24gPSAtMTsKLQkJCXsgUHlMb25nT2JqZWN0ICp0ZW1wID0gYTsgYSA9IGI7IGIgPSB0ZW1wOyB9Ci0JCX0KLQkJc2l6ZV9hID0gc2l6ZV9iID0gaSsxOwotCX0KLQl6ID0gX1B5TG9uZ19OZXcoc2l6ZV9hKTsKLQlpZiAoeiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlmb3IgKGkgPSAwOyBpIDwgc2l6ZV9iOyArK2kpIHsKLQkJLyogVGhlIGZvbGxvd2luZyBhc3N1bWVzIHVuc2lnbmVkIGFyaXRobWV0aWMKLQkJICAgd29ya3MgbW9kdWxlIDIqKk4gZm9yIHNvbWUgTj5QeUxvbmdfU0hJRlQuICovCi0JCWJvcnJvdyA9IGEtPm9iX2RpZ2l0W2ldIC0gYi0+b2JfZGlnaXRbaV0gLSBib3Jyb3c7Ci0JCXotPm9iX2RpZ2l0W2ldID0gYm9ycm93ICYgUHlMb25nX01BU0s7Ci0JCWJvcnJvdyA+Pj0gUHlMb25nX1NISUZUOwotCQlib3Jyb3cgJj0gMTsgLyogS2VlcCBvbmx5IG9uZSBzaWduIGJpdCAqLwotCX0KLQlmb3IgKDsgaSA8IHNpemVfYTsgKytpKSB7Ci0JCWJvcnJvdyA9IGEtPm9iX2RpZ2l0W2ldIC0gYm9ycm93OwotCQl6LT5vYl9kaWdpdFtpXSA9IGJvcnJvdyAmIFB5TG9uZ19NQVNLOwotCQlib3Jyb3cgPj49IFB5TG9uZ19TSElGVDsKLQkJYm9ycm93ICY9IDE7IC8qIEtlZXAgb25seSBvbmUgc2lnbiBiaXQgKi8KLQl9Ci0JYXNzZXJ0KGJvcnJvdyA9PSAwKTsKLQlpZiAoc2lnbiA8IDApCi0JCXotPm9iX3NpemUgPSAtKHotPm9iX3NpemUpOwotCXJldHVybiBsb25nX25vcm1hbGl6ZSh6KTsKKyAgICAvKiBFbnN1cmUgYSBpcyB0aGUgbGFyZ2VyIG9mIHRoZSB0d286ICovCisgICAgaWYgKHNpemVfYSA8IHNpemVfYikgeworICAgICAgICBzaWduID0gLTE7CisgICAgICAgIHsgUHlMb25nT2JqZWN0ICp0ZW1wID0gYTsgYSA9IGI7IGIgPSB0ZW1wOyB9CisgICAgICAgIHsgUHlfc3NpemVfdCBzaXplX3RlbXAgPSBzaXplX2E7CisgICAgICAgICAgc2l6ZV9hID0gc2l6ZV9iOworICAgICAgICAgIHNpemVfYiA9IHNpemVfdGVtcDsgfQorICAgIH0KKyAgICBlbHNlIGlmIChzaXplX2EgPT0gc2l6ZV9iKSB7CisgICAgICAgIC8qIEZpbmQgaGlnaGVzdCBkaWdpdCB3aGVyZSBhIGFuZCBiIGRpZmZlcjogKi8KKyAgICAgICAgaSA9IHNpemVfYTsKKyAgICAgICAgd2hpbGUgKC0taSA+PSAwICYmIGEtPm9iX2RpZ2l0W2ldID09IGItPm9iX2RpZ2l0W2ldKQorICAgICAgICAgICAgOworICAgICAgICBpZiAoaSA8IDApCisgICAgICAgICAgICByZXR1cm4gX1B5TG9uZ19OZXcoMCk7CisgICAgICAgIGlmIChhLT5vYl9kaWdpdFtpXSA8IGItPm9iX2RpZ2l0W2ldKSB7CisgICAgICAgICAgICBzaWduID0gLTE7CisgICAgICAgICAgICB7IFB5TG9uZ09iamVjdCAqdGVtcCA9IGE7IGEgPSBiOyBiID0gdGVtcDsgfQorICAgICAgICB9CisgICAgICAgIHNpemVfYSA9IHNpemVfYiA9IGkrMTsKKyAgICB9CisgICAgeiA9IF9QeUxvbmdfTmV3KHNpemVfYSk7CisgICAgaWYgKHogPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZm9yIChpID0gMDsgaSA8IHNpemVfYjsgKytpKSB7CisgICAgICAgIC8qIFRoZSBmb2xsb3dpbmcgYXNzdW1lcyB1bnNpZ25lZCBhcml0aG1ldGljCisgICAgICAgICAgIHdvcmtzIG1vZHVsZSAyKipOIGZvciBzb21lIE4+UHlMb25nX1NISUZULiAqLworICAgICAgICBib3Jyb3cgPSBhLT5vYl9kaWdpdFtpXSAtIGItPm9iX2RpZ2l0W2ldIC0gYm9ycm93OworICAgICAgICB6LT5vYl9kaWdpdFtpXSA9IGJvcnJvdyAmIFB5TG9uZ19NQVNLOworICAgICAgICBib3Jyb3cgPj49IFB5TG9uZ19TSElGVDsKKyAgICAgICAgYm9ycm93ICY9IDE7IC8qIEtlZXAgb25seSBvbmUgc2lnbiBiaXQgKi8KKyAgICB9CisgICAgZm9yICg7IGkgPCBzaXplX2E7ICsraSkgeworICAgICAgICBib3Jyb3cgPSBhLT5vYl9kaWdpdFtpXSAtIGJvcnJvdzsKKyAgICAgICAgei0+b2JfZGlnaXRbaV0gPSBib3Jyb3cgJiBQeUxvbmdfTUFTSzsKKyAgICAgICAgYm9ycm93ID4+PSBQeUxvbmdfU0hJRlQ7CisgICAgICAgIGJvcnJvdyAmPSAxOyAvKiBLZWVwIG9ubHkgb25lIHNpZ24gYml0ICovCisgICAgfQorICAgIGFzc2VydChib3Jyb3cgPT0gMCk7CisgICAgaWYgKHNpZ24gPCAwKQorICAgICAgICB6LT5vYl9zaXplID0gLSh6LT5vYl9zaXplKTsKKyAgICByZXR1cm4gbG9uZ19ub3JtYWxpemUoeik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBsb25nX2FkZChQeUxvbmdPYmplY3QgKnYsIFB5TG9uZ09iamVjdCAqdykKIHsKLQlQeUxvbmdPYmplY3QgKmEsICpiLCAqejsKKyAgICBQeUxvbmdPYmplY3QgKmEsICpiLCAqejsKIAotCUNPTlZFUlRfQklOT1AoKFB5T2JqZWN0ICopdiwgKFB5T2JqZWN0ICopdywgJmEsICZiKTsKKyAgICBDT05WRVJUX0JJTk9QKChQeU9iamVjdCAqKXYsIChQeU9iamVjdCAqKXcsICZhLCAmYik7CiAKLQlpZiAoYS0+b2Jfc2l6ZSA8IDApIHsKLQkJaWYgKGItPm9iX3NpemUgPCAwKSB7Ci0JCQl6ID0geF9hZGQoYSwgYik7Ci0JCQlpZiAoeiAhPSBOVUxMICYmIHotPm9iX3NpemUgIT0gMCkKLQkJCQl6LT5vYl9zaXplID0gLSh6LT5vYl9zaXplKTsKLQkJfQotCQllbHNlCi0JCQl6ID0geF9zdWIoYiwgYSk7Ci0JfQotCWVsc2UgewotCQlpZiAoYi0+b2Jfc2l6ZSA8IDApCi0JCQl6ID0geF9zdWIoYSwgYik7Ci0JCWVsc2UKLQkJCXogPSB4X2FkZChhLCBiKTsKLQl9Ci0JUHlfREVDUkVGKGEpOwotCVB5X0RFQ1JFRihiKTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopejsKKyAgICBpZiAoYS0+b2Jfc2l6ZSA8IDApIHsKKyAgICAgICAgaWYgKGItPm9iX3NpemUgPCAwKSB7CisgICAgICAgICAgICB6ID0geF9hZGQoYSwgYik7CisgICAgICAgICAgICBpZiAoeiAhPSBOVUxMICYmIHotPm9iX3NpemUgIT0gMCkKKyAgICAgICAgICAgICAgICB6LT5vYl9zaXplID0gLSh6LT5vYl9zaXplKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICB6ID0geF9zdWIoYiwgYSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZiAoYi0+b2Jfc2l6ZSA8IDApCisgICAgICAgICAgICB6ID0geF9zdWIoYSwgYik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHogPSB4X2FkZChhLCBiKTsKKyAgICB9CisgICAgUHlfREVDUkVGKGEpOworICAgIFB5X0RFQ1JFRihiKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopejsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGxvbmdfc3ViKFB5TG9uZ09iamVjdCAqdiwgUHlMb25nT2JqZWN0ICp3KQogewotCVB5TG9uZ09iamVjdCAqYSwgKmIsICp6OworICAgIFB5TG9uZ09iamVjdCAqYSwgKmIsICp6OwogCi0JQ09OVkVSVF9CSU5PUCgoUHlPYmplY3QgKil2LCAoUHlPYmplY3QgKil3LCAmYSwgJmIpOworICAgIENPTlZFUlRfQklOT1AoKFB5T2JqZWN0ICopdiwgKFB5T2JqZWN0ICopdywgJmEsICZiKTsKIAotCWlmIChhLT5vYl9zaXplIDwgMCkgewotCQlpZiAoYi0+b2Jfc2l6ZSA8IDApCi0JCQl6ID0geF9zdWIoYSwgYik7Ci0JCWVsc2UKLQkJCXogPSB4X2FkZChhLCBiKTsKLQkJaWYgKHogIT0gTlVMTCAmJiB6LT5vYl9zaXplICE9IDApCi0JCQl6LT5vYl9zaXplID0gLSh6LT5vYl9zaXplKTsKLQl9Ci0JZWxzZSB7Ci0JCWlmIChiLT5vYl9zaXplIDwgMCkKLQkJCXogPSB4X2FkZChhLCBiKTsKLQkJZWxzZQotCQkJeiA9IHhfc3ViKGEsIGIpOwotCX0KLQlQeV9ERUNSRUYoYSk7Ci0JUHlfREVDUkVGKGIpOwotCXJldHVybiAoUHlPYmplY3QgKil6OworICAgIGlmIChhLT5vYl9zaXplIDwgMCkgeworICAgICAgICBpZiAoYi0+b2Jfc2l6ZSA8IDApCisgICAgICAgICAgICB6ID0geF9zdWIoYSwgYik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHogPSB4X2FkZChhLCBiKTsKKyAgICAgICAgaWYgKHogIT0gTlVMTCAmJiB6LT5vYl9zaXplICE9IDApCisgICAgICAgICAgICB6LT5vYl9zaXplID0gLSh6LT5vYl9zaXplKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGlmIChiLT5vYl9zaXplIDwgMCkKKyAgICAgICAgICAgIHogPSB4X2FkZChhLCBiKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgeiA9IHhfc3ViKGEsIGIpOworICAgIH0KKyAgICBQeV9ERUNSRUYoYSk7CisgICAgUHlfREVDUkVGKGIpOworICAgIHJldHVybiAoUHlPYmplY3QgKil6OwogfQogCiAvKiBHcmFkZSBzY2hvb2wgbXVsdGlwbGljYXRpb24sIGlnbm9yaW5nIHRoZSBzaWducy4KQEAgLTIxNDgsODUgKzIxNDgsODUgQEAKIHN0YXRpYyBQeUxvbmdPYmplY3QgKgogeF9tdWwoUHlMb25nT2JqZWN0ICphLCBQeUxvbmdPYmplY3QgKmIpCiB7Ci0JUHlMb25nT2JqZWN0ICp6OwotCVB5X3NzaXplX3Qgc2l6ZV9hID0gQUJTKFB5X1NJWkUoYSkpOwotCVB5X3NzaXplX3Qgc2l6ZV9iID0gQUJTKFB5X1NJWkUoYikpOwotCVB5X3NzaXplX3QgaTsKKyAgICBQeUxvbmdPYmplY3QgKno7CisgICAgUHlfc3NpemVfdCBzaXplX2EgPSBBQlMoUHlfU0laRShhKSk7CisgICAgUHlfc3NpemVfdCBzaXplX2IgPSBBQlMoUHlfU0laRShiKSk7CisgICAgUHlfc3NpemVfdCBpOwogCi0gICAgIAl6ID0gX1B5TG9uZ19OZXcoc2l6ZV9hICsgc2l6ZV9iKTsKLQlpZiAoeiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICB6ID0gX1B5TG9uZ19OZXcoc2l6ZV9hICsgc2l6ZV9iKTsKKyAgICBpZiAoeiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCW1lbXNldCh6LT5vYl9kaWdpdCwgMCwgUHlfU0laRSh6KSAqIHNpemVvZihkaWdpdCkpOwotCWlmIChhID09IGIpIHsKLQkJLyogRWZmaWNpZW50IHNxdWFyaW5nIHBlciBIQUMsIEFsZ29yaXRobSAxNC4xNjoKLQkJICogaHR0cDovL3d3dy5jYWNyLm1hdGgudXdhdGVybG9vLmNhL2hhYy9hYm91dC9jaGFwMTQucGRmCi0JCSAqIEdpdmVzIHNsaWdodGx5IGxlc3MgdGhhbiBhIDJ4IHNwZWVkdXAgd2hlbiBhID09IGIsCi0JCSAqIHZpYSBleHBsb2l0aW5nIHRoYXQgZWFjaCBlbnRyeSBpbiB0aGUgbXVsdGlwbGljYXRpb24KLQkJICogcHlyYW1pZCBhcHBlYXJzIHR3aWNlIChleGNlcHQgZm9yIHRoZSBzaXplX2Egc3F1YXJlcykuCi0JCSAqLwotCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZV9hOyArK2kpIHsKLQkJCXR3b2RpZ2l0cyBjYXJyeTsKLQkJCXR3b2RpZ2l0cyBmID0gYS0+b2JfZGlnaXRbaV07Ci0JCQlkaWdpdCAqcHogPSB6LT5vYl9kaWdpdCArIChpIDw8IDEpOwotCQkJZGlnaXQgKnBhID0gYS0+b2JfZGlnaXQgKyBpICsgMTsKLQkJCWRpZ2l0ICpwYWVuZCA9IGEtPm9iX2RpZ2l0ICsgc2l6ZV9hOworICAgIG1lbXNldCh6LT5vYl9kaWdpdCwgMCwgUHlfU0laRSh6KSAqIHNpemVvZihkaWdpdCkpOworICAgIGlmIChhID09IGIpIHsKKyAgICAgICAgLyogRWZmaWNpZW50IHNxdWFyaW5nIHBlciBIQUMsIEFsZ29yaXRobSAxNC4xNjoKKyAgICAgICAgICogaHR0cDovL3d3dy5jYWNyLm1hdGgudXdhdGVybG9vLmNhL2hhYy9hYm91dC9jaGFwMTQucGRmCisgICAgICAgICAqIEdpdmVzIHNsaWdodGx5IGxlc3MgdGhhbiBhIDJ4IHNwZWVkdXAgd2hlbiBhID09IGIsCisgICAgICAgICAqIHZpYSBleHBsb2l0aW5nIHRoYXQgZWFjaCBlbnRyeSBpbiB0aGUgbXVsdGlwbGljYXRpb24KKyAgICAgICAgICogcHlyYW1pZCBhcHBlYXJzIHR3aWNlIChleGNlcHQgZm9yIHRoZSBzaXplX2Egc3F1YXJlcykuCisgICAgICAgICAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZV9hOyArK2kpIHsKKyAgICAgICAgICAgIHR3b2RpZ2l0cyBjYXJyeTsKKyAgICAgICAgICAgIHR3b2RpZ2l0cyBmID0gYS0+b2JfZGlnaXRbaV07CisgICAgICAgICAgICBkaWdpdCAqcHogPSB6LT5vYl9kaWdpdCArIChpIDw8IDEpOworICAgICAgICAgICAgZGlnaXQgKnBhID0gYS0+b2JfZGlnaXQgKyBpICsgMTsKKyAgICAgICAgICAgIGRpZ2l0ICpwYWVuZCA9IGEtPm9iX2RpZ2l0ICsgc2l6ZV9hOwogCi0JCQlTSUdDSEVDSyh7Ci0JCQkJUHlfREVDUkVGKHopOwotCQkJCXJldHVybiBOVUxMOwotCQkJfSkKKyAgICAgICAgICAgIFNJR0NIRUNLKHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoeik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9KQogCi0JCQljYXJyeSA9ICpweiArIGYgKiBmOwotCQkJKnB6KysgPSAoZGlnaXQpKGNhcnJ5ICYgUHlMb25nX01BU0spOwotCQkJY2FycnkgPj49IFB5TG9uZ19TSElGVDsKLQkJCWFzc2VydChjYXJyeSA8PSBQeUxvbmdfTUFTSyk7CisgICAgICAgICAgICBjYXJyeSA9ICpweiArIGYgKiBmOworICAgICAgICAgICAgKnB6KysgPSAoZGlnaXQpKGNhcnJ5ICYgUHlMb25nX01BU0spOworICAgICAgICAgICAgY2FycnkgPj49IFB5TG9uZ19TSElGVDsKKyAgICAgICAgICAgIGFzc2VydChjYXJyeSA8PSBQeUxvbmdfTUFTSyk7CiAKLQkJCS8qIE5vdyBmIGlzIGFkZGVkIGluIHR3aWNlIGluIGVhY2ggY29sdW1uIG9mIHRoZQotCQkJICogcHlyYW1pZCBpdCBhcHBlYXJzLiAgU2FtZSBhcyBhZGRpbmcgZjw8MSBvbmNlLgotCQkJICovCi0JCQlmIDw8PSAxOwotCQkJd2hpbGUgKHBhIDwgcGFlbmQpIHsKLQkJCQljYXJyeSArPSAqcHogKyAqcGErKyAqIGY7Ci0JCQkJKnB6KysgPSAoZGlnaXQpKGNhcnJ5ICYgUHlMb25nX01BU0spOwotCQkJCWNhcnJ5ID4+PSBQeUxvbmdfU0hJRlQ7Ci0JCQkJYXNzZXJ0KGNhcnJ5IDw9IChQeUxvbmdfTUFTSyA8PCAxKSk7Ci0JCQl9Ci0JCQlpZiAoY2FycnkpIHsKLQkJCQljYXJyeSArPSAqcHo7Ci0JCQkJKnB6KysgPSAoZGlnaXQpKGNhcnJ5ICYgUHlMb25nX01BU0spOwotCQkJCWNhcnJ5ID4+PSBQeUxvbmdfU0hJRlQ7Ci0JCQl9Ci0JCQlpZiAoY2FycnkpCi0JCQkJKnB6ICs9IChkaWdpdCkoY2FycnkgJiBQeUxvbmdfTUFTSyk7Ci0JCQlhc3NlcnQoKGNhcnJ5ID4+IFB5TG9uZ19TSElGVCkgPT0gMCk7Ci0JCX0KLQl9Ci0JZWxzZSB7CS8qIGEgaXMgbm90IHRoZSBzYW1lIGFzIGIgLS0gZ3JhZGVzY2hvb2wgbG9uZyBtdWx0ICovCi0JCWZvciAoaSA9IDA7IGkgPCBzaXplX2E7ICsraSkgewotCQkJdHdvZGlnaXRzIGNhcnJ5ID0gMDsKLQkJCXR3b2RpZ2l0cyBmID0gYS0+b2JfZGlnaXRbaV07Ci0JCQlkaWdpdCAqcHogPSB6LT5vYl9kaWdpdCArIGk7Ci0JCQlkaWdpdCAqcGIgPSBiLT5vYl9kaWdpdDsKLQkJCWRpZ2l0ICpwYmVuZCA9IGItPm9iX2RpZ2l0ICsgc2l6ZV9iOworICAgICAgICAgICAgLyogTm93IGYgaXMgYWRkZWQgaW4gdHdpY2UgaW4gZWFjaCBjb2x1bW4gb2YgdGhlCisgICAgICAgICAgICAgKiBweXJhbWlkIGl0IGFwcGVhcnMuICBTYW1lIGFzIGFkZGluZyBmPDwxIG9uY2UuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGYgPDw9IDE7CisgICAgICAgICAgICB3aGlsZSAocGEgPCBwYWVuZCkgeworICAgICAgICAgICAgICAgIGNhcnJ5ICs9ICpweiArICpwYSsrICogZjsKKyAgICAgICAgICAgICAgICAqcHorKyA9IChkaWdpdCkoY2FycnkgJiBQeUxvbmdfTUFTSyk7CisgICAgICAgICAgICAgICAgY2FycnkgPj49IFB5TG9uZ19TSElGVDsKKyAgICAgICAgICAgICAgICBhc3NlcnQoY2FycnkgPD0gKFB5TG9uZ19NQVNLIDw8IDEpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjYXJyeSkgeworICAgICAgICAgICAgICAgIGNhcnJ5ICs9ICpwejsKKyAgICAgICAgICAgICAgICAqcHorKyA9IChkaWdpdCkoY2FycnkgJiBQeUxvbmdfTUFTSyk7CisgICAgICAgICAgICAgICAgY2FycnkgPj49IFB5TG9uZ19TSElGVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjYXJyeSkKKyAgICAgICAgICAgICAgICAqcHogKz0gKGRpZ2l0KShjYXJyeSAmIFB5TG9uZ19NQVNLKTsKKyAgICAgICAgICAgIGFzc2VydCgoY2FycnkgPj4gUHlMb25nX1NISUZUKSA9PSAwKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsgICAgICAvKiBhIGlzIG5vdCB0aGUgc2FtZSBhcyBiIC0tIGdyYWRlc2Nob29sIGxvbmcgbXVsdCAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZV9hOyArK2kpIHsKKyAgICAgICAgICAgIHR3b2RpZ2l0cyBjYXJyeSA9IDA7CisgICAgICAgICAgICB0d29kaWdpdHMgZiA9IGEtPm9iX2RpZ2l0W2ldOworICAgICAgICAgICAgZGlnaXQgKnB6ID0gei0+b2JfZGlnaXQgKyBpOworICAgICAgICAgICAgZGlnaXQgKnBiID0gYi0+b2JfZGlnaXQ7CisgICAgICAgICAgICBkaWdpdCAqcGJlbmQgPSBiLT5vYl9kaWdpdCArIHNpemVfYjsKIAotCQkJU0lHQ0hFQ0soewotCQkJCVB5X0RFQ1JFRih6KTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0pCisgICAgICAgICAgICBTSUdDSEVDSyh7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHopOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfSkKIAotCQkJd2hpbGUgKHBiIDwgcGJlbmQpIHsKLQkJCQljYXJyeSArPSAqcHogKyAqcGIrKyAqIGY7Ci0JCQkJKnB6KysgPSAoZGlnaXQpKGNhcnJ5ICYgUHlMb25nX01BU0spOwotCQkJCWNhcnJ5ID4+PSBQeUxvbmdfU0hJRlQ7Ci0JCQkJYXNzZXJ0KGNhcnJ5IDw9IFB5TG9uZ19NQVNLKTsKLQkJCX0KLQkJCWlmIChjYXJyeSkKLQkJCQkqcHogKz0gKGRpZ2l0KShjYXJyeSAmIFB5TG9uZ19NQVNLKTsKLQkJCWFzc2VydCgoY2FycnkgPj4gUHlMb25nX1NISUZUKSA9PSAwKTsKLQkJfQotCX0KLQlyZXR1cm4gbG9uZ19ub3JtYWxpemUoeik7CisgICAgICAgICAgICB3aGlsZSAocGIgPCBwYmVuZCkgeworICAgICAgICAgICAgICAgIGNhcnJ5ICs9ICpweiArICpwYisrICogZjsKKyAgICAgICAgICAgICAgICAqcHorKyA9IChkaWdpdCkoY2FycnkgJiBQeUxvbmdfTUFTSyk7CisgICAgICAgICAgICAgICAgY2FycnkgPj49IFB5TG9uZ19TSElGVDsKKyAgICAgICAgICAgICAgICBhc3NlcnQoY2FycnkgPD0gUHlMb25nX01BU0spOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNhcnJ5KQorICAgICAgICAgICAgICAgICpweiArPSAoZGlnaXQpKGNhcnJ5ICYgUHlMb25nX01BU0spOworICAgICAgICAgICAgYXNzZXJ0KChjYXJyeSA+PiBQeUxvbmdfU0hJRlQpID09IDApOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBsb25nX25vcm1hbGl6ZSh6KTsKIH0KIAogLyogQSBoZWxwZXIgZm9yIEthcmF0c3ViYSBtdWx0aXBsaWNhdGlvbiAoa19tdWwpLgpAQCAtMjIzOSwyNiArMjIzOSwyNiBAQAogc3RhdGljIGludAoga211bF9zcGxpdChQeUxvbmdPYmplY3QgKm4sIFB5X3NzaXplX3Qgc2l6ZSwgUHlMb25nT2JqZWN0ICoqaGlnaCwgUHlMb25nT2JqZWN0ICoqbG93KQogewotCVB5TG9uZ09iamVjdCAqaGksICpsbzsKLQlQeV9zc2l6ZV90IHNpemVfbG8sIHNpemVfaGk7Ci0JY29uc3QgUHlfc3NpemVfdCBzaXplX24gPSBBQlMoUHlfU0laRShuKSk7CisgICAgUHlMb25nT2JqZWN0ICpoaSwgKmxvOworICAgIFB5X3NzaXplX3Qgc2l6ZV9sbywgc2l6ZV9oaTsKKyAgICBjb25zdCBQeV9zc2l6ZV90IHNpemVfbiA9IEFCUyhQeV9TSVpFKG4pKTsKIAotCXNpemVfbG8gPSBNSU4oc2l6ZV9uLCBzaXplKTsKLQlzaXplX2hpID0gc2l6ZV9uIC0gc2l6ZV9sbzsKKyAgICBzaXplX2xvID0gTUlOKHNpemVfbiwgc2l6ZSk7CisgICAgc2l6ZV9oaSA9IHNpemVfbiAtIHNpemVfbG87CiAKLQlpZiAoKGhpID0gX1B5TG9uZ19OZXcoc2l6ZV9oaSkpID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQlpZiAoKGxvID0gX1B5TG9uZ19OZXcoc2l6ZV9sbykpID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKGhpKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICBpZiAoKGhpID0gX1B5TG9uZ19OZXcoc2l6ZV9oaSkpID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAoKGxvID0gX1B5TG9uZ19OZXcoc2l6ZV9sbykpID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKGhpKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCW1lbWNweShsby0+b2JfZGlnaXQsIG4tPm9iX2RpZ2l0LCBzaXplX2xvICogc2l6ZW9mKGRpZ2l0KSk7Ci0JbWVtY3B5KGhpLT5vYl9kaWdpdCwgbi0+b2JfZGlnaXQgKyBzaXplX2xvLCBzaXplX2hpICogc2l6ZW9mKGRpZ2l0KSk7CisgICAgbWVtY3B5KGxvLT5vYl9kaWdpdCwgbi0+b2JfZGlnaXQsIHNpemVfbG8gKiBzaXplb2YoZGlnaXQpKTsKKyAgICBtZW1jcHkoaGktPm9iX2RpZ2l0LCBuLT5vYl9kaWdpdCArIHNpemVfbG8sIHNpemVfaGkgKiBzaXplb2YoZGlnaXQpKTsKIAotCSpoaWdoID0gbG9uZ19ub3JtYWxpemUoaGkpOwotCSpsb3cgPSBsb25nX25vcm1hbGl6ZShsbyk7Ci0JcmV0dXJuIDA7CisgICAgKmhpZ2ggPSBsb25nX25vcm1hbGl6ZShoaSk7CisgICAgKmxvdyA9IGxvbmdfbm9ybWFsaXplKGxvKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5TG9uZ09iamVjdCAqa19sb3BzaWRlZF9tdWwoUHlMb25nT2JqZWN0ICphLCBQeUxvbmdPYmplY3QgKmIpOwpAQCAtMjI3MCwxNjkgKzIyNzAsMTY5IEBACiBzdGF0aWMgUHlMb25nT2JqZWN0ICoKIGtfbXVsKFB5TG9uZ09iamVjdCAqYSwgUHlMb25nT2JqZWN0ICpiKQogewotCVB5X3NzaXplX3QgYXNpemUgPSBBQlMoUHlfU0laRShhKSk7Ci0JUHlfc3NpemVfdCBic2l6ZSA9IEFCUyhQeV9TSVpFKGIpKTsKLQlQeUxvbmdPYmplY3QgKmFoID0gTlVMTDsKLQlQeUxvbmdPYmplY3QgKmFsID0gTlVMTDsKLQlQeUxvbmdPYmplY3QgKmJoID0gTlVMTDsKLQlQeUxvbmdPYmplY3QgKmJsID0gTlVMTDsKLQlQeUxvbmdPYmplY3QgKnJldCA9IE5VTEw7Ci0JUHlMb25nT2JqZWN0ICp0MSwgKnQyLCAqdDM7Ci0JUHlfc3NpemVfdCBzaGlmdDsJLyogdGhlIG51bWJlciBvZiBkaWdpdHMgd2Ugc3BsaXQgb2ZmICovCi0JUHlfc3NpemVfdCBpOworICAgIFB5X3NzaXplX3QgYXNpemUgPSBBQlMoUHlfU0laRShhKSk7CisgICAgUHlfc3NpemVfdCBic2l6ZSA9IEFCUyhQeV9TSVpFKGIpKTsKKyAgICBQeUxvbmdPYmplY3QgKmFoID0gTlVMTDsKKyAgICBQeUxvbmdPYmplY3QgKmFsID0gTlVMTDsKKyAgICBQeUxvbmdPYmplY3QgKmJoID0gTlVMTDsKKyAgICBQeUxvbmdPYmplY3QgKmJsID0gTlVMTDsKKyAgICBQeUxvbmdPYmplY3QgKnJldCA9IE5VTEw7CisgICAgUHlMb25nT2JqZWN0ICp0MSwgKnQyLCAqdDM7CisgICAgUHlfc3NpemVfdCBzaGlmdDsgICAgICAgICAgIC8qIHRoZSBudW1iZXIgb2YgZGlnaXRzIHdlIHNwbGl0IG9mZiAqLworICAgIFB5X3NzaXplX3QgaTsKIAotCS8qIChhaCpYK2FsKShiaCpYK2JsKSA9IGFoKmJoKlgqWCArIChhaCpibCArIGFsKmJoKSpYICsgYWwqYmwKLQkgKiBMZXQgayA9IChhaCthbCkqKGJoK2JsKSA9IGFoKmJsICsgYWwqYmggICsgYWgqYmggKyBhbCpibAotCSAqIFRoZW4gdGhlIG9yaWdpbmFsIHByb2R1Y3QgaXMKLQkgKiAgICAgYWgqYmgqWCpYICsgKGsgLSBhaCpiaCAtIGFsKmJsKSpYICsgYWwqYmwKLQkgKiBCeSBwaWNraW5nIFggdG8gYmUgYSBwb3dlciBvZiAyLCAiKlgiIGlzIGp1c3Qgc2hpZnRpbmcsIGFuZCBpdCdzCi0JICogYmVlbiByZWR1Y2VkIHRvIDMgbXVsdGlwbGllcyBvbiBudW1iZXJzIGhhbGYgdGhlIHNpemUuCi0JICovCisgICAgLyogKGFoKlgrYWwpKGJoKlgrYmwpID0gYWgqYmgqWCpYICsgKGFoKmJsICsgYWwqYmgpKlggKyBhbCpibAorICAgICAqIExldCBrID0gKGFoK2FsKSooYmgrYmwpID0gYWgqYmwgKyBhbCpiaCAgKyBhaCpiaCArIGFsKmJsCisgICAgICogVGhlbiB0aGUgb3JpZ2luYWwgcHJvZHVjdCBpcworICAgICAqICAgICBhaCpiaCpYKlggKyAoayAtIGFoKmJoIC0gYWwqYmwpKlggKyBhbCpibAorICAgICAqIEJ5IHBpY2tpbmcgWCB0byBiZSBhIHBvd2VyIG9mIDIsICIqWCIgaXMganVzdCBzaGlmdGluZywgYW5kIGl0J3MKKyAgICAgKiBiZWVuIHJlZHVjZWQgdG8gMyBtdWx0aXBsaWVzIG9uIG51bWJlcnMgaGFsZiB0aGUgc2l6ZS4KKyAgICAgKi8KIAotCS8qIFdlIHdhbnQgdG8gc3BsaXQgYmFzZWQgb24gdGhlIGxhcmdlciBudW1iZXI7IGZpZGRsZSBzbyB0aGF0IGIKLQkgKiBpcyBsYXJnZXN0LgotCSAqLwotCWlmIChhc2l6ZSA+IGJzaXplKSB7Ci0JCXQxID0gYTsKLQkJYSA9IGI7Ci0JCWIgPSB0MTsKKyAgICAvKiBXZSB3YW50IHRvIHNwbGl0IGJhc2VkIG9uIHRoZSBsYXJnZXIgbnVtYmVyOyBmaWRkbGUgc28gdGhhdCBiCisgICAgICogaXMgbGFyZ2VzdC4KKyAgICAgKi8KKyAgICBpZiAoYXNpemUgPiBic2l6ZSkgeworICAgICAgICB0MSA9IGE7CisgICAgICAgIGEgPSBiOworICAgICAgICBiID0gdDE7CiAKLQkJaSA9IGFzaXplOwotCQlhc2l6ZSA9IGJzaXplOwotCQlic2l6ZSA9IGk7Ci0JfQorICAgICAgICBpID0gYXNpemU7CisgICAgICAgIGFzaXplID0gYnNpemU7CisgICAgICAgIGJzaXplID0gaTsKKyAgICB9CiAKLQkvKiBVc2UgZ3JhZGVzY2hvb2wgbWF0aCB3aGVuIGVpdGhlciBudW1iZXIgaXMgdG9vIHNtYWxsLiAqLwotCWkgPSBhID09IGIgPyBLQVJBVFNVQkFfU1FVQVJFX0NVVE9GRiA6IEtBUkFUU1VCQV9DVVRPRkY7Ci0JaWYgKGFzaXplIDw9IGkpIHsKLQkJaWYgKGFzaXplID09IDApCi0JCQlyZXR1cm4gX1B5TG9uZ19OZXcoMCk7Ci0JCWVsc2UKLQkJCXJldHVybiB4X211bChhLCBiKTsKLQl9CisgICAgLyogVXNlIGdyYWRlc2Nob29sIG1hdGggd2hlbiBlaXRoZXIgbnVtYmVyIGlzIHRvbyBzbWFsbC4gKi8KKyAgICBpID0gYSA9PSBiID8gS0FSQVRTVUJBX1NRVUFSRV9DVVRPRkYgOiBLQVJBVFNVQkFfQ1VUT0ZGOworICAgIGlmIChhc2l6ZSA8PSBpKSB7CisgICAgICAgIGlmIChhc2l6ZSA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIF9QeUxvbmdfTmV3KDApOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4geF9tdWwoYSwgYik7CisgICAgfQogCi0JLyogSWYgYSBpcyBzbWFsbCBjb21wYXJlZCB0byBiLCBzcGxpdHRpbmcgb24gYiBnaXZlcyBhIGRlZ2VuZXJhdGUKLQkgKiBjYXNlIHdpdGggYWg9PTAsIGFuZCBLYXJhdHN1YmEgbWF5IGJlIChldmVuIG11Y2gpIGxlc3MgZWZmaWNpZW50Ci0JICogdGhhbiAiZ3JhZGUgc2Nob29sIiB0aGVuLiAgSG93ZXZlciwgd2UgY2FuIHN0aWxsIHdpbiwgYnkgdmlld2luZwotCSAqIGIgYXMgYSBzdHJpbmcgb2YgImJpZyBkaWdpdHMiLCBlYWNoIG9mIHdpZHRoIGEtPm9iX3NpemUuICBUaGF0Ci0JICogbGVhZHMgdG8gYSBzZXF1ZW5jZSBvZiBiYWxhbmNlZCBjYWxscyB0byBrX211bC4KLQkgKi8KLQlpZiAoMiAqIGFzaXplIDw9IGJzaXplKQotCQlyZXR1cm4ga19sb3BzaWRlZF9tdWwoYSwgYik7CisgICAgLyogSWYgYSBpcyBzbWFsbCBjb21wYXJlZCB0byBiLCBzcGxpdHRpbmcgb24gYiBnaXZlcyBhIGRlZ2VuZXJhdGUKKyAgICAgKiBjYXNlIHdpdGggYWg9PTAsIGFuZCBLYXJhdHN1YmEgbWF5IGJlIChldmVuIG11Y2gpIGxlc3MgZWZmaWNpZW50CisgICAgICogdGhhbiAiZ3JhZGUgc2Nob29sIiB0aGVuLiAgSG93ZXZlciwgd2UgY2FuIHN0aWxsIHdpbiwgYnkgdmlld2luZworICAgICAqIGIgYXMgYSBzdHJpbmcgb2YgImJpZyBkaWdpdHMiLCBlYWNoIG9mIHdpZHRoIGEtPm9iX3NpemUuICBUaGF0CisgICAgICogbGVhZHMgdG8gYSBzZXF1ZW5jZSBvZiBiYWxhbmNlZCBjYWxscyB0byBrX211bC4KKyAgICAgKi8KKyAgICBpZiAoMiAqIGFzaXplIDw9IGJzaXplKQorICAgICAgICByZXR1cm4ga19sb3BzaWRlZF9tdWwoYSwgYik7CiAKLQkvKiBTcGxpdCBhICYgYiBpbnRvIGhpICYgbG8gcGllY2VzLiAqLwotCXNoaWZ0ID0gYnNpemUgPj4gMTsKLQlpZiAoa211bF9zcGxpdChhLCBzaGlmdCwgJmFoLCAmYWwpIDwgMCkgZ290byBmYWlsOwotCWFzc2VydChQeV9TSVpFKGFoKSA+IDApOwkvKiB0aGUgc3BsaXQgaXNuJ3QgZGVnZW5lcmF0ZSAqLworICAgIC8qIFNwbGl0IGEgJiBiIGludG8gaGkgJiBsbyBwaWVjZXMuICovCisgICAgc2hpZnQgPSBic2l6ZSA+PiAxOworICAgIGlmIChrbXVsX3NwbGl0KGEsIHNoaWZ0LCAmYWgsICZhbCkgPCAwKSBnb3RvIGZhaWw7CisgICAgYXNzZXJ0KFB5X1NJWkUoYWgpID4gMCk7ICAgICAgICAgICAgLyogdGhlIHNwbGl0IGlzbid0IGRlZ2VuZXJhdGUgKi8KIAotCWlmIChhID09IGIpIHsKLQkJYmggPSBhaDsKLQkJYmwgPSBhbDsKLQkJUHlfSU5DUkVGKGJoKTsKLQkJUHlfSU5DUkVGKGJsKTsKLQl9Ci0JZWxzZSBpZiAoa211bF9zcGxpdChiLCBzaGlmdCwgJmJoLCAmYmwpIDwgMCkgZ290byBmYWlsOworICAgIGlmIChhID09IGIpIHsKKyAgICAgICAgYmggPSBhaDsKKyAgICAgICAgYmwgPSBhbDsKKyAgICAgICAgUHlfSU5DUkVGKGJoKTsKKyAgICAgICAgUHlfSU5DUkVGKGJsKTsKKyAgICB9CisgICAgZWxzZSBpZiAoa211bF9zcGxpdChiLCBzaGlmdCwgJmJoLCAmYmwpIDwgMCkgZ290byBmYWlsOwogCi0JLyogVGhlIHBsYW46Ci0JICogMS4gQWxsb2NhdGUgcmVzdWx0IHNwYWNlIChhc2l6ZSArIGJzaXplIGRpZ2l0czogIHRoYXQncyBhbHdheXMKLQkgKiAgICBlbm91Z2gpLgotCSAqIDIuIENvbXB1dGUgYWgqYmgsIGFuZCBjb3B5IGludG8gcmVzdWx0IGF0IDIqc2hpZnQuCi0JICogMy4gQ29tcHV0ZSBhbCpibCwgYW5kIGNvcHkgaW50byByZXN1bHQgYXQgMC4gIE5vdGUgdGhhdCB0aGlzCi0JICogICAgY2FuJ3Qgb3ZlcmxhcCB3aXRoICMyLgotCSAqIDQuIFN1YnRyYWN0IGFsKmJsIGZyb20gdGhlIHJlc3VsdCwgc3RhcnRpbmcgYXQgc2hpZnQuICBUaGlzIG1heQotCSAqICAgIHVuZGVyZmxvdyAoYm9ycm93IG91dCBvZiB0aGUgaGlnaCBkaWdpdCksIGJ1dCB3ZSBkb24ndCBjYXJlOgotCSAqICAgIHdlJ3JlIGVmZmVjdGl2ZWx5IGRvaW5nIHVuc2lnbmVkIGFyaXRobWV0aWMgbW9kCi0JICogICAgUHlMb25nX0JBU0UqKihzaXplYSArIHNpemViKSwgYW5kIHNvIGxvbmcgYXMgdGhlICpmaW5hbCogcmVzdWx0IGZpdHMsCi0JICogICAgYm9ycm93cyBhbmQgY2FycmllcyBvdXQgb2YgdGhlIGhpZ2ggZGlnaXQgY2FuIGJlIGlnbm9yZWQuCi0JICogNS4gU3VidHJhY3QgYWgqYmggZnJvbSB0aGUgcmVzdWx0LCBzdGFydGluZyBhdCBzaGlmdC4KLQkgKiA2LiBDb21wdXRlIChhaCthbCkqKGJoK2JsKSwgYW5kIGFkZCBpdCBpbnRvIHRoZSByZXN1bHQgc3RhcnRpbmcKLQkgKiAgICBhdCBzaGlmdC4KLQkgKi8KKyAgICAvKiBUaGUgcGxhbjoKKyAgICAgKiAxLiBBbGxvY2F0ZSByZXN1bHQgc3BhY2UgKGFzaXplICsgYnNpemUgZGlnaXRzOiAgdGhhdCdzIGFsd2F5cworICAgICAqICAgIGVub3VnaCkuCisgICAgICogMi4gQ29tcHV0ZSBhaCpiaCwgYW5kIGNvcHkgaW50byByZXN1bHQgYXQgMipzaGlmdC4KKyAgICAgKiAzLiBDb21wdXRlIGFsKmJsLCBhbmQgY29weSBpbnRvIHJlc3VsdCBhdCAwLiAgTm90ZSB0aGF0IHRoaXMKKyAgICAgKiAgICBjYW4ndCBvdmVybGFwIHdpdGggIzIuCisgICAgICogNC4gU3VidHJhY3QgYWwqYmwgZnJvbSB0aGUgcmVzdWx0LCBzdGFydGluZyBhdCBzaGlmdC4gIFRoaXMgbWF5CisgICAgICogICAgdW5kZXJmbG93IChib3Jyb3cgb3V0IG9mIHRoZSBoaWdoIGRpZ2l0KSwgYnV0IHdlIGRvbid0IGNhcmU6CisgICAgICogICAgd2UncmUgZWZmZWN0aXZlbHkgZG9pbmcgdW5zaWduZWQgYXJpdGhtZXRpYyBtb2QKKyAgICAgKiAgICBQeUxvbmdfQkFTRSoqKHNpemVhICsgc2l6ZWIpLCBhbmQgc28gbG9uZyBhcyB0aGUgKmZpbmFsKiByZXN1bHQgZml0cywKKyAgICAgKiAgICBib3Jyb3dzIGFuZCBjYXJyaWVzIG91dCBvZiB0aGUgaGlnaCBkaWdpdCBjYW4gYmUgaWdub3JlZC4KKyAgICAgKiA1LiBTdWJ0cmFjdCBhaCpiaCBmcm9tIHRoZSByZXN1bHQsIHN0YXJ0aW5nIGF0IHNoaWZ0LgorICAgICAqIDYuIENvbXB1dGUgKGFoK2FsKSooYmgrYmwpLCBhbmQgYWRkIGl0IGludG8gdGhlIHJlc3VsdCBzdGFydGluZworICAgICAqICAgIGF0IHNoaWZ0LgorICAgICAqLwogCi0JLyogMS4gQWxsb2NhdGUgcmVzdWx0IHNwYWNlLiAqLwotCXJldCA9IF9QeUxvbmdfTmV3KGFzaXplICsgYnNpemUpOwotCWlmIChyZXQgPT0gTlVMTCkgZ290byBmYWlsOworICAgIC8qIDEuIEFsbG9jYXRlIHJlc3VsdCBzcGFjZS4gKi8KKyAgICByZXQgPSBfUHlMb25nX05ldyhhc2l6ZSArIGJzaXplKTsKKyAgICBpZiAocmV0ID09IE5VTEwpIGdvdG8gZmFpbDsKICNpZmRlZiBQeV9ERUJVRwotCS8qIEZpbGwgd2l0aCB0cmFzaCwgdG8gY2F0Y2ggcmVmZXJlbmNlIHRvIHVuaW5pdGlhbGl6ZWQgZGlnaXRzLiAqLwotCW1lbXNldChyZXQtPm9iX2RpZ2l0LCAweERGLCBQeV9TSVpFKHJldCkgKiBzaXplb2YoZGlnaXQpKTsKKyAgICAvKiBGaWxsIHdpdGggdHJhc2gsIHRvIGNhdGNoIHJlZmVyZW5jZSB0byB1bmluaXRpYWxpemVkIGRpZ2l0cy4gKi8KKyAgICBtZW1zZXQocmV0LT5vYl9kaWdpdCwgMHhERiwgUHlfU0laRShyZXQpICogc2l6ZW9mKGRpZ2l0KSk7CiAjZW5kaWYKIAotCS8qIDIuIHQxIDwtIGFoKmJoLCBhbmQgY29weSBpbnRvIGhpZ2ggZGlnaXRzIG9mIHJlc3VsdC4gKi8KLQlpZiAoKHQxID0ga19tdWwoYWgsIGJoKSkgPT0gTlVMTCkgZ290byBmYWlsOwotCWFzc2VydChQeV9TSVpFKHQxKSA+PSAwKTsKLQlhc3NlcnQoMipzaGlmdCArIFB5X1NJWkUodDEpIDw9IFB5X1NJWkUocmV0KSk7Ci0JbWVtY3B5KHJldC0+b2JfZGlnaXQgKyAyKnNoaWZ0LCB0MS0+b2JfZGlnaXQsCi0JICAgICAgIFB5X1NJWkUodDEpICogc2l6ZW9mKGRpZ2l0KSk7CisgICAgLyogMi4gdDEgPC0gYWgqYmgsIGFuZCBjb3B5IGludG8gaGlnaCBkaWdpdHMgb2YgcmVzdWx0LiAqLworICAgIGlmICgodDEgPSBrX211bChhaCwgYmgpKSA9PSBOVUxMKSBnb3RvIGZhaWw7CisgICAgYXNzZXJ0KFB5X1NJWkUodDEpID49IDApOworICAgIGFzc2VydCgyKnNoaWZ0ICsgUHlfU0laRSh0MSkgPD0gUHlfU0laRShyZXQpKTsKKyAgICBtZW1jcHkocmV0LT5vYl9kaWdpdCArIDIqc2hpZnQsIHQxLT5vYl9kaWdpdCwKKyAgICAgICAgICAgUHlfU0laRSh0MSkgKiBzaXplb2YoZGlnaXQpKTsKIAotCS8qIFplcm8tb3V0IHRoZSBkaWdpdHMgaGlnaGVyIHRoYW4gdGhlIGFoKmJoIGNvcHkuICovCi0JaSA9IFB5X1NJWkUocmV0KSAtIDIqc2hpZnQgLSBQeV9TSVpFKHQxKTsKLQlpZiAoaSkKLQkJbWVtc2V0KHJldC0+b2JfZGlnaXQgKyAyKnNoaWZ0ICsgUHlfU0laRSh0MSksIDAsCi0JCSAgICAgICBpICogc2l6ZW9mKGRpZ2l0KSk7CisgICAgLyogWmVyby1vdXQgdGhlIGRpZ2l0cyBoaWdoZXIgdGhhbiB0aGUgYWgqYmggY29weS4gKi8KKyAgICBpID0gUHlfU0laRShyZXQpIC0gMipzaGlmdCAtIFB5X1NJWkUodDEpOworICAgIGlmIChpKQorICAgICAgICBtZW1zZXQocmV0LT5vYl9kaWdpdCArIDIqc2hpZnQgKyBQeV9TSVpFKHQxKSwgMCwKKyAgICAgICAgICAgICAgIGkgKiBzaXplb2YoZGlnaXQpKTsKIAotCS8qIDMuIHQyIDwtIGFsKmJsLCBhbmQgY29weSBpbnRvIHRoZSBsb3cgZGlnaXRzLiAqLwotCWlmICgodDIgPSBrX211bChhbCwgYmwpKSA9PSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRih0MSk7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0JYXNzZXJ0KFB5X1NJWkUodDIpID49IDApOwotCWFzc2VydChQeV9TSVpFKHQyKSA8PSAyKnNoaWZ0KTsgLyogbm8gb3ZlcmxhcCB3aXRoIGhpZ2ggZGlnaXRzICovCi0JbWVtY3B5KHJldC0+b2JfZGlnaXQsIHQyLT5vYl9kaWdpdCwgUHlfU0laRSh0MikgKiBzaXplb2YoZGlnaXQpKTsKKyAgICAvKiAzLiB0MiA8LSBhbCpibCwgYW5kIGNvcHkgaW50byB0aGUgbG93IGRpZ2l0cy4gKi8KKyAgICBpZiAoKHQyID0ga19tdWwoYWwsIGJsKSkgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYodDEpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorICAgIGFzc2VydChQeV9TSVpFKHQyKSA+PSAwKTsKKyAgICBhc3NlcnQoUHlfU0laRSh0MikgPD0gMipzaGlmdCk7IC8qIG5vIG92ZXJsYXAgd2l0aCBoaWdoIGRpZ2l0cyAqLworICAgIG1lbWNweShyZXQtPm9iX2RpZ2l0LCB0Mi0+b2JfZGlnaXQsIFB5X1NJWkUodDIpICogc2l6ZW9mKGRpZ2l0KSk7CiAKLQkvKiBaZXJvIG91dCByZW1haW5pbmcgZGlnaXRzLiAqLwotCWkgPSAyKnNoaWZ0IC0gUHlfU0laRSh0Mik7CS8qIG51bWJlciBvZiB1bmluaXRpYWxpemVkIGRpZ2l0cyAqLwotCWlmIChpKQotCQltZW1zZXQocmV0LT5vYl9kaWdpdCArIFB5X1NJWkUodDIpLCAwLCBpICogc2l6ZW9mKGRpZ2l0KSk7CisgICAgLyogWmVybyBvdXQgcmVtYWluaW5nIGRpZ2l0cy4gKi8KKyAgICBpID0gMipzaGlmdCAtIFB5X1NJWkUodDIpOyAgICAgICAgICAvKiBudW1iZXIgb2YgdW5pbml0aWFsaXplZCBkaWdpdHMgKi8KKyAgICBpZiAoaSkKKyAgICAgICAgbWVtc2V0KHJldC0+b2JfZGlnaXQgKyBQeV9TSVpFKHQyKSwgMCwgaSAqIHNpemVvZihkaWdpdCkpOwogCi0JLyogNCAmIDUuIFN1YnRyYWN0IGFoKmJoICh0MSkgYW5kIGFsKmJsICh0MikuICBXZSBkbyBhbCpibCBmaXJzdAotCSAqIGJlY2F1c2UgaXQncyBmcmVzaGVyIGluIGNhY2hlLgotCSAqLwotCWkgPSBQeV9TSVpFKHJldCkgLSBzaGlmdDsgIC8qICMgZGlnaXRzIGFmdGVyIHNoaWZ0ICovCi0JKHZvaWQpdl9pc3ViKHJldC0+b2JfZGlnaXQgKyBzaGlmdCwgaSwgdDItPm9iX2RpZ2l0LCBQeV9TSVpFKHQyKSk7Ci0JUHlfREVDUkVGKHQyKTsKKyAgICAvKiA0ICYgNS4gU3VidHJhY3QgYWgqYmggKHQxKSBhbmQgYWwqYmwgKHQyKS4gIFdlIGRvIGFsKmJsIGZpcnN0CisgICAgICogYmVjYXVzZSBpdCdzIGZyZXNoZXIgaW4gY2FjaGUuCisgICAgICovCisgICAgaSA9IFB5X1NJWkUocmV0KSAtIHNoaWZ0OyAgLyogIyBkaWdpdHMgYWZ0ZXIgc2hpZnQgKi8KKyAgICAodm9pZCl2X2lzdWIocmV0LT5vYl9kaWdpdCArIHNoaWZ0LCBpLCB0Mi0+b2JfZGlnaXQsIFB5X1NJWkUodDIpKTsKKyAgICBQeV9ERUNSRUYodDIpOwogCi0JKHZvaWQpdl9pc3ViKHJldC0+b2JfZGlnaXQgKyBzaGlmdCwgaSwgdDEtPm9iX2RpZ2l0LCBQeV9TSVpFKHQxKSk7Ci0JUHlfREVDUkVGKHQxKTsKKyAgICAodm9pZCl2X2lzdWIocmV0LT5vYl9kaWdpdCArIHNoaWZ0LCBpLCB0MS0+b2JfZGlnaXQsIFB5X1NJWkUodDEpKTsKKyAgICBQeV9ERUNSRUYodDEpOwogCi0JLyogNi4gdDMgPC0gKGFoK2FsKShiaCtibCksIGFuZCBhZGQgaW50byByZXN1bHQuICovCi0JaWYgKCh0MSA9IHhfYWRkKGFoLCBhbCkpID09IE5VTEwpIGdvdG8gZmFpbDsKLQlQeV9ERUNSRUYoYWgpOwotCVB5X0RFQ1JFRihhbCk7Ci0JYWggPSBhbCA9IE5VTEw7CisgICAgLyogNi4gdDMgPC0gKGFoK2FsKShiaCtibCksIGFuZCBhZGQgaW50byByZXN1bHQuICovCisgICAgaWYgKCh0MSA9IHhfYWRkKGFoLCBhbCkpID09IE5VTEwpIGdvdG8gZmFpbDsKKyAgICBQeV9ERUNSRUYoYWgpOworICAgIFB5X0RFQ1JFRihhbCk7CisgICAgYWggPSBhbCA9IE5VTEw7CiAKLQlpZiAoYSA9PSBiKSB7Ci0JCXQyID0gdDE7Ci0JCVB5X0lOQ1JFRih0Mik7Ci0JfQotCWVsc2UgaWYgKCh0MiA9IHhfYWRkKGJoLCBibCkpID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKHQxKTsKLQkJZ290byBmYWlsOwotCX0KLQlQeV9ERUNSRUYoYmgpOwotCVB5X0RFQ1JFRihibCk7Ci0JYmggPSBibCA9IE5VTEw7CisgICAgaWYgKGEgPT0gYikgeworICAgICAgICB0MiA9IHQxOworICAgICAgICBQeV9JTkNSRUYodDIpOworICAgIH0KKyAgICBlbHNlIGlmICgodDIgPSB4X2FkZChiaCwgYmwpKSA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRih0MSk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisgICAgUHlfREVDUkVGKGJoKTsKKyAgICBQeV9ERUNSRUYoYmwpOworICAgIGJoID0gYmwgPSBOVUxMOwogCi0JdDMgPSBrX211bCh0MSwgdDIpOwotCVB5X0RFQ1JFRih0MSk7Ci0JUHlfREVDUkVGKHQyKTsKLQlpZiAodDMgPT0gTlVMTCkgZ290byBmYWlsOwotCWFzc2VydChQeV9TSVpFKHQzKSA+PSAwKTsKKyAgICB0MyA9IGtfbXVsKHQxLCB0Mik7CisgICAgUHlfREVDUkVGKHQxKTsKKyAgICBQeV9ERUNSRUYodDIpOworICAgIGlmICh0MyA9PSBOVUxMKSBnb3RvIGZhaWw7CisgICAgYXNzZXJ0KFB5X1NJWkUodDMpID49IDApOwogCi0JLyogQWRkIHQzLiAgSXQncyBub3Qgb2J2aW91cyB3aHkgd2UgY2FuJ3QgcnVuIG91dCBvZiByb29tIGhlcmUuCi0JICogU2VlIHRoZSAoKikgY29tbWVudCBhZnRlciB0aGlzIGZ1bmN0aW9uLgotCSAqLwotCSh2b2lkKXZfaWFkZChyZXQtPm9iX2RpZ2l0ICsgc2hpZnQsIGksIHQzLT5vYl9kaWdpdCwgUHlfU0laRSh0MykpOwotCVB5X0RFQ1JFRih0Myk7CisgICAgLyogQWRkIHQzLiAgSXQncyBub3Qgb2J2aW91cyB3aHkgd2UgY2FuJ3QgcnVuIG91dCBvZiByb29tIGhlcmUuCisgICAgICogU2VlIHRoZSAoKikgY29tbWVudCBhZnRlciB0aGlzIGZ1bmN0aW9uLgorICAgICAqLworICAgICh2b2lkKXZfaWFkZChyZXQtPm9iX2RpZ2l0ICsgc2hpZnQsIGksIHQzLT5vYl9kaWdpdCwgUHlfU0laRSh0MykpOworICAgIFB5X0RFQ1JFRih0Myk7CiAKLQlyZXR1cm4gbG9uZ19ub3JtYWxpemUocmV0KTsKKyAgICByZXR1cm4gbG9uZ19ub3JtYWxpemUocmV0KTsKIAogIGZhaWw6Ci0gCVB5X1hERUNSRUYocmV0KTsKLQlQeV9YREVDUkVGKGFoKTsKLQlQeV9YREVDUkVGKGFsKTsKLQlQeV9YREVDUkVGKGJoKTsKLQlQeV9YREVDUkVGKGJsKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeV9YREVDUkVGKHJldCk7CisgICAgUHlfWERFQ1JFRihhaCk7CisgICAgUHlfWERFQ1JFRihhbCk7CisgICAgUHlfWERFQ1JFRihiaCk7CisgICAgUHlfWERFQ1JFRihibCk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIC8qICgqKSBXaHkgYWRkaW5nIHQzIGNhbid0ICJydW4gb3V0IG9mIHJvb20iIGFib3ZlLgpAQCAtMjQ5MSw3NCArMjQ5MSw3NCBAQAogc3RhdGljIFB5TG9uZ09iamVjdCAqCiBrX2xvcHNpZGVkX211bChQeUxvbmdPYmplY3QgKmEsIFB5TG9uZ09iamVjdCAqYikKIHsKLQljb25zdCBQeV9zc2l6ZV90IGFzaXplID0gQUJTKFB5X1NJWkUoYSkpOwotCVB5X3NzaXplX3QgYnNpemUgPSBBQlMoUHlfU0laRShiKSk7Ci0JUHlfc3NpemVfdCBuYmRvbmU7CS8qICMgb2YgYiBkaWdpdHMgYWxyZWFkeSBtdWx0aXBsaWVkICovCi0JUHlMb25nT2JqZWN0ICpyZXQ7Ci0JUHlMb25nT2JqZWN0ICpic2xpY2UgPSBOVUxMOworICAgIGNvbnN0IFB5X3NzaXplX3QgYXNpemUgPSBBQlMoUHlfU0laRShhKSk7CisgICAgUHlfc3NpemVfdCBic2l6ZSA9IEFCUyhQeV9TSVpFKGIpKTsKKyAgICBQeV9zc2l6ZV90IG5iZG9uZTsgICAgICAgICAgLyogIyBvZiBiIGRpZ2l0cyBhbHJlYWR5IG11bHRpcGxpZWQgKi8KKyAgICBQeUxvbmdPYmplY3QgKnJldDsKKyAgICBQeUxvbmdPYmplY3QgKmJzbGljZSA9IE5VTEw7CiAKLQlhc3NlcnQoYXNpemUgPiBLQVJBVFNVQkFfQ1VUT0ZGKTsKLQlhc3NlcnQoMiAqIGFzaXplIDw9IGJzaXplKTsKKyAgICBhc3NlcnQoYXNpemUgPiBLQVJBVFNVQkFfQ1VUT0ZGKTsKKyAgICBhc3NlcnQoMiAqIGFzaXplIDw9IGJzaXplKTsKIAotCS8qIEFsbG9jYXRlIHJlc3VsdCBzcGFjZSwgYW5kIHplcm8gaXQgb3V0LiAqLwotCXJldCA9IF9QeUxvbmdfTmV3KGFzaXplICsgYnNpemUpOwotCWlmIChyZXQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JbWVtc2V0KHJldC0+b2JfZGlnaXQsIDAsIFB5X1NJWkUocmV0KSAqIHNpemVvZihkaWdpdCkpOworICAgIC8qIEFsbG9jYXRlIHJlc3VsdCBzcGFjZSwgYW5kIHplcm8gaXQgb3V0LiAqLworICAgIHJldCA9IF9QeUxvbmdfTmV3KGFzaXplICsgYnNpemUpOworICAgIGlmIChyZXQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbWVtc2V0KHJldC0+b2JfZGlnaXQsIDAsIFB5X1NJWkUocmV0KSAqIHNpemVvZihkaWdpdCkpOwogCi0JLyogU3VjY2Vzc2l2ZSBzbGljZXMgb2YgYiBhcmUgY29waWVkIGludG8gYnNsaWNlLiAqLwotCWJzbGljZSA9IF9QeUxvbmdfTmV3KGFzaXplKTsKLQlpZiAoYnNsaWNlID09IE5VTEwpCi0JCWdvdG8gZmFpbDsKKyAgICAvKiBTdWNjZXNzaXZlIHNsaWNlcyBvZiBiIGFyZSBjb3BpZWQgaW50byBic2xpY2UuICovCisgICAgYnNsaWNlID0gX1B5TG9uZ19OZXcoYXNpemUpOworICAgIGlmIChic2xpY2UgPT0gTlVMTCkKKyAgICAgICAgZ290byBmYWlsOwogCi0JbmJkb25lID0gMDsKLQl3aGlsZSAoYnNpemUgPiAwKSB7Ci0JCVB5TG9uZ09iamVjdCAqcHJvZHVjdDsKLQkJY29uc3QgUHlfc3NpemVfdCBuYnRvdXNlID0gTUlOKGJzaXplLCBhc2l6ZSk7CisgICAgbmJkb25lID0gMDsKKyAgICB3aGlsZSAoYnNpemUgPiAwKSB7CisgICAgICAgIFB5TG9uZ09iamVjdCAqcHJvZHVjdDsKKyAgICAgICAgY29uc3QgUHlfc3NpemVfdCBuYnRvdXNlID0gTUlOKGJzaXplLCBhc2l6ZSk7CiAKLQkJLyogTXVsdGlwbHkgdGhlIG5leHQgc2xpY2Ugb2YgYiBieSBhLiAqLwotCQltZW1jcHkoYnNsaWNlLT5vYl9kaWdpdCwgYi0+b2JfZGlnaXQgKyBuYmRvbmUsCi0JCSAgICAgICBuYnRvdXNlICogc2l6ZW9mKGRpZ2l0KSk7Ci0JCVB5X1NJWkUoYnNsaWNlKSA9IG5idG91c2U7Ci0JCXByb2R1Y3QgPSBrX211bChhLCBic2xpY2UpOwotCQlpZiAocHJvZHVjdCA9PSBOVUxMKQotCQkJZ290byBmYWlsOworICAgICAgICAvKiBNdWx0aXBseSB0aGUgbmV4dCBzbGljZSBvZiBiIGJ5IGEuICovCisgICAgICAgIG1lbWNweShic2xpY2UtPm9iX2RpZ2l0LCBiLT5vYl9kaWdpdCArIG5iZG9uZSwKKyAgICAgICAgICAgICAgIG5idG91c2UgKiBzaXplb2YoZGlnaXQpKTsKKyAgICAgICAgUHlfU0laRShic2xpY2UpID0gbmJ0b3VzZTsKKyAgICAgICAgcHJvZHVjdCA9IGtfbXVsKGEsIGJzbGljZSk7CisgICAgICAgIGlmIChwcm9kdWN0ID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGZhaWw7CiAKLQkJLyogQWRkIGludG8gcmVzdWx0LiAqLwotCQkodm9pZCl2X2lhZGQocmV0LT5vYl9kaWdpdCArIG5iZG9uZSwgUHlfU0laRShyZXQpIC0gbmJkb25lLAotCQkJICAgICBwcm9kdWN0LT5vYl9kaWdpdCwgUHlfU0laRShwcm9kdWN0KSk7Ci0JCVB5X0RFQ1JFRihwcm9kdWN0KTsKKyAgICAgICAgLyogQWRkIGludG8gcmVzdWx0LiAqLworICAgICAgICAodm9pZCl2X2lhZGQocmV0LT5vYl9kaWdpdCArIG5iZG9uZSwgUHlfU0laRShyZXQpIC0gbmJkb25lLAorICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdC0+b2JfZGlnaXQsIFB5X1NJWkUocHJvZHVjdCkpOworICAgICAgICBQeV9ERUNSRUYocHJvZHVjdCk7CiAKLQkJYnNpemUgLT0gbmJ0b3VzZTsKLQkJbmJkb25lICs9IG5idG91c2U7Ci0JfQorICAgICAgICBic2l6ZSAtPSBuYnRvdXNlOworICAgICAgICBuYmRvbmUgKz0gbmJ0b3VzZTsKKyAgICB9CiAKLQlQeV9ERUNSRUYoYnNsaWNlKTsKLQlyZXR1cm4gbG9uZ19ub3JtYWxpemUocmV0KTsKKyAgICBQeV9ERUNSRUYoYnNsaWNlKTsKKyAgICByZXR1cm4gbG9uZ19ub3JtYWxpemUocmV0KTsKIAogIGZhaWw6Ci0JUHlfREVDUkVGKHJldCk7Ci0JUHlfWERFQ1JFRihic2xpY2UpOwotCXJldHVybiBOVUxMOworICAgIFB5X0RFQ1JFRihyZXQpOworICAgIFB5X1hERUNSRUYoYnNsaWNlKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGxvbmdfbXVsKFB5TG9uZ09iamVjdCAqdiwgUHlMb25nT2JqZWN0ICp3KQogewotCVB5TG9uZ09iamVjdCAqYSwgKmIsICp6OworICAgIFB5TG9uZ09iamVjdCAqYSwgKmIsICp6OwogCi0JaWYgKCFjb252ZXJ0X2Jpbm9wKChQeU9iamVjdCAqKXYsIChQeU9iamVjdCAqKXcsICZhLCAmYikpIHsKLQkJUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKLQkJcmV0dXJuIFB5X05vdEltcGxlbWVudGVkOwotCX0KKyAgICBpZiAoIWNvbnZlcnRfYmlub3AoKFB5T2JqZWN0ICopdiwgKFB5T2JqZWN0ICopdywgJmEsICZiKSkgeworICAgICAgICBQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOworICAgICAgICByZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7CisgICAgfQogCi0JeiA9IGtfbXVsKGEsIGIpOwotCS8qIE5lZ2F0ZSBpZiBleGFjdGx5IG9uZSBvZiB0aGUgaW5wdXRzIGlzIG5lZ2F0aXZlLiAqLwotCWlmICgoKGEtPm9iX3NpemUgXiBiLT5vYl9zaXplKSA8IDApICYmIHopCi0JCXotPm9iX3NpemUgPSAtKHotPm9iX3NpemUpOwotCVB5X0RFQ1JFRihhKTsKLQlQeV9ERUNSRUYoYik7Ci0JcmV0dXJuIChQeU9iamVjdCAqKXo7CisgICAgeiA9IGtfbXVsKGEsIGIpOworICAgIC8qIE5lZ2F0ZSBpZiBleGFjdGx5IG9uZSBvZiB0aGUgaW5wdXRzIGlzIG5lZ2F0aXZlLiAqLworICAgIGlmICgoKGEtPm9iX3NpemUgXiBiLT5vYl9zaXplKSA8IDApICYmIHopCisgICAgICAgIHotPm9iX3NpemUgPSAtKHotPm9iX3NpemUpOworICAgIFB5X0RFQ1JFRihhKTsKKyAgICBQeV9ERUNSRUYoYik7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKXo7CiB9CiAKIC8qIFRoZSAvIGFuZCAlIG9wZXJhdG9ycyBhcmUgbm93IGRlZmluZWQgaW4gdGVybXMgb2YgZGl2bW9kKCkuCkBAIC0yNTY3LDExICsyNTY3LDExIEBACiAgICB8YXwgYnkgfGJ8LCB3aXRoIHRoZSBzaWduIG9mIGEuICBUaGlzIGlzIGFsc28gZXhwcmVzc2VkCiAgICBhcyBhIC0gYip0cnVuYyhhL2IpLCBpZiB0cnVuYyB0cnVuY2F0ZXMgdG93YXJkcyB6ZXJvLgogICAgU29tZSBleGFtcGxlczoKLSAgIAkgYQkgYglhIHJlbSBiCQlhIG1vZCBiCi0gICAJIDEzCSAxMAkgMwkJIDMKLSAgIAktMTMJIDEwCS0zCQkgNwotICAgCSAxMwktMTAJIDMJCS03Ci0gICAJLTEzCS0xMAktMwkJLTMKKyAgICAgYSAgICAgICAgICAgYiAgICAgIGEgcmVtIGIgICAgICAgICBhIG1vZCBiCisgICAgIDEzICAgICAgICAgIDEwICAgICAgMyAgICAgICAgICAgICAgIDMKKyAgICAtMTMgICAgICAgICAgMTAgICAgIC0zICAgICAgICAgICAgICAgNworICAgICAxMyAgICAgICAgIC0xMCAgICAgIDMgICAgICAgICAgICAgIC03CisgICAgLTEzICAgICAgICAgLTEwICAgICAtMyAgICAgICAgICAgICAgLTMKICAgIFNvLCB0byBnZXQgZnJvbSByZW0gdG8gbW9kLCB3ZSBoYXZlIHRvIGFkZCBiIGlmIGEgYW5kIGIKICAgIGhhdmUgZGlmZmVyZW50IHNpZ25zLiAgV2UgdGhlbiBzdWJ0cmFjdCBvbmUgZnJvbSB0aGUgJ2RpdicKICAgIHBhcnQgb2YgdGhlIG91dGNvbWUgdG8ga2VlcCB0aGUgaW52YXJpYW50IGludGFjdC4gKi8KQEAgLTI1ODQsNTE5ICsyNTg0LDUxOSBAQAogICovCiBzdGF0aWMgaW50CiBsX2Rpdm1vZChQeUxvbmdPYmplY3QgKnYsIFB5TG9uZ09iamVjdCAqdywKLQkgUHlMb25nT2JqZWN0ICoqcGRpdiwgUHlMb25nT2JqZWN0ICoqcG1vZCkKKyAgICAgICAgIFB5TG9uZ09iamVjdCAqKnBkaXYsIFB5TG9uZ09iamVjdCAqKnBtb2QpCiB7Ci0JUHlMb25nT2JqZWN0ICpkaXYsICptb2Q7CisgICAgUHlMb25nT2JqZWN0ICpkaXYsICptb2Q7CiAKLQlpZiAobG9uZ19kaXZyZW0odiwgdywgJmRpdiwgJm1vZCkgPCAwKQotCQlyZXR1cm4gLTE7Ci0JaWYgKChQeV9TSVpFKG1vZCkgPCAwICYmIFB5X1NJWkUodykgPiAwKSB8fAotCSAgICAoUHlfU0laRShtb2QpID4gMCAmJiBQeV9TSVpFKHcpIDwgMCkpIHsKLQkJUHlMb25nT2JqZWN0ICp0ZW1wOwotCQlQeUxvbmdPYmplY3QgKm9uZTsKLQkJdGVtcCA9IChQeUxvbmdPYmplY3QgKikgbG9uZ19hZGQobW9kLCB3KTsKLQkJUHlfREVDUkVGKG1vZCk7Ci0JCW1vZCA9IHRlbXA7Ci0JCWlmIChtb2QgPT0gTlVMTCkgewotCQkJUHlfREVDUkVGKGRpdik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJb25lID0gKFB5TG9uZ09iamVjdCAqKSBQeUxvbmdfRnJvbUxvbmcoMUwpOwotCQlpZiAob25lID09IE5VTEwgfHwKLQkJICAgICh0ZW1wID0gKFB5TG9uZ09iamVjdCAqKSBsb25nX3N1YihkaXYsIG9uZSkpID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRihtb2QpOwotCQkJUHlfREVDUkVGKGRpdik7Ci0JCQlQeV9YREVDUkVGKG9uZSk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJUHlfREVDUkVGKG9uZSk7Ci0JCVB5X0RFQ1JFRihkaXYpOwotCQlkaXYgPSB0ZW1wOwotCX0KLQlpZiAocGRpdiAhPSBOVUxMKQotCQkqcGRpdiA9IGRpdjsKLQllbHNlCi0JCVB5X0RFQ1JFRihkaXYpOworICAgIGlmIChsb25nX2RpdnJlbSh2LCB3LCAmZGl2LCAmbW9kKSA8IDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAoKFB5X1NJWkUobW9kKSA8IDAgJiYgUHlfU0laRSh3KSA+IDApIHx8CisgICAgICAgIChQeV9TSVpFKG1vZCkgPiAwICYmIFB5X1NJWkUodykgPCAwKSkgeworICAgICAgICBQeUxvbmdPYmplY3QgKnRlbXA7CisgICAgICAgIFB5TG9uZ09iamVjdCAqb25lOworICAgICAgICB0ZW1wID0gKFB5TG9uZ09iamVjdCAqKSBsb25nX2FkZChtb2QsIHcpOworICAgICAgICBQeV9ERUNSRUYobW9kKTsKKyAgICAgICAgbW9kID0gdGVtcDsKKyAgICAgICAgaWYgKG1vZCA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoZGl2KTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBvbmUgPSAoUHlMb25nT2JqZWN0ICopIFB5TG9uZ19Gcm9tTG9uZygxTCk7CisgICAgICAgIGlmIChvbmUgPT0gTlVMTCB8fAorICAgICAgICAgICAgKHRlbXAgPSAoUHlMb25nT2JqZWN0ICopIGxvbmdfc3ViKGRpdiwgb25lKSkgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKG1vZCk7CisgICAgICAgICAgICBQeV9ERUNSRUYoZGl2KTsKKyAgICAgICAgICAgIFB5X1hERUNSRUYob25lKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBQeV9ERUNSRUYob25lKTsKKyAgICAgICAgUHlfREVDUkVGKGRpdik7CisgICAgICAgIGRpdiA9IHRlbXA7CisgICAgfQorICAgIGlmIChwZGl2ICE9IE5VTEwpCisgICAgICAgICpwZGl2ID0gZGl2OworICAgIGVsc2UKKyAgICAgICAgUHlfREVDUkVGKGRpdik7CiAKLQlpZiAocG1vZCAhPSBOVUxMKQotCQkqcG1vZCA9IG1vZDsKLQllbHNlCi0JCVB5X0RFQ1JFRihtb2QpOworICAgIGlmIChwbW9kICE9IE5VTEwpCisgICAgICAgICpwbW9kID0gbW9kOworICAgIGVsc2UKKyAgICAgICAgUHlfREVDUkVGKG1vZCk7CiAKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGxvbmdfZGl2KFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdykKIHsKLQlQeUxvbmdPYmplY3QgKmEsICpiLCAqZGl2OworICAgIFB5TG9uZ09iamVjdCAqYSwgKmIsICpkaXY7CiAKLQlDT05WRVJUX0JJTk9QKHYsIHcsICZhLCAmYik7Ci0JaWYgKGxfZGl2bW9kKGEsIGIsICZkaXYsIE5VTEwpIDwgMCkKLQkJZGl2ID0gTlVMTDsKLQlQeV9ERUNSRUYoYSk7Ci0JUHlfREVDUkVGKGIpOwotCXJldHVybiAoUHlPYmplY3QgKilkaXY7CisgICAgQ09OVkVSVF9CSU5PUCh2LCB3LCAmYSwgJmIpOworICAgIGlmIChsX2Rpdm1vZChhLCBiLCAmZGl2LCBOVUxMKSA8IDApCisgICAgICAgIGRpdiA9IE5VTEw7CisgICAgUHlfREVDUkVGKGEpOworICAgIFB5X0RFQ1JFRihiKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopZGl2OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbG9uZ19jbGFzc2ljX2RpdihQeU9iamVjdCAqdiwgUHlPYmplY3QgKncpCiB7Ci0JUHlMb25nT2JqZWN0ICphLCAqYiwgKmRpdjsKKyAgICBQeUxvbmdPYmplY3QgKmEsICpiLCAqZGl2OwogCi0JQ09OVkVSVF9CSU5PUCh2LCB3LCAmYSwgJmIpOwotCWlmIChQeV9EaXZpc2lvbldhcm5pbmdGbGFnICYmCi0JICAgIFB5RXJyX1dhcm4oUHlFeGNfRGVwcmVjYXRpb25XYXJuaW5nLCAiY2xhc3NpYyBsb25nIGRpdmlzaW9uIikgPCAwKQotCQlkaXYgPSBOVUxMOwotCWVsc2UgaWYgKGxfZGl2bW9kKGEsIGIsICZkaXYsIE5VTEwpIDwgMCkKLQkJZGl2ID0gTlVMTDsKLQlQeV9ERUNSRUYoYSk7Ci0JUHlfREVDUkVGKGIpOwotCXJldHVybiAoUHlPYmplY3QgKilkaXY7CisgICAgQ09OVkVSVF9CSU5PUCh2LCB3LCAmYSwgJmIpOworICAgIGlmIChQeV9EaXZpc2lvbldhcm5pbmdGbGFnICYmCisgICAgICAgIFB5RXJyX1dhcm4oUHlFeGNfRGVwcmVjYXRpb25XYXJuaW5nLCAiY2xhc3NpYyBsb25nIGRpdmlzaW9uIikgPCAwKQorICAgICAgICBkaXYgPSBOVUxMOworICAgIGVsc2UgaWYgKGxfZGl2bW9kKGEsIGIsICZkaXYsIE5VTEwpIDwgMCkKKyAgICAgICAgZGl2ID0gTlVMTDsKKyAgICBQeV9ERUNSRUYoYSk7CisgICAgUHlfREVDUkVGKGIpOworICAgIHJldHVybiAoUHlPYmplY3QgKilkaXY7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBsb25nX3RydWVfZGl2aWRlKFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdykKIHsKLQlQeUxvbmdPYmplY3QgKmEsICpiOwotCWRvdWJsZSBhZCwgYmQ7Ci0JaW50IGZhaWxlZCwgYWV4cCA9IC0xLCBiZXhwID0gLTE7CisgICAgUHlMb25nT2JqZWN0ICphLCAqYjsKKyAgICBkb3VibGUgYWQsIGJkOworICAgIGludCBmYWlsZWQsIGFleHAgPSAtMSwgYmV4cCA9IC0xOwogCi0JQ09OVkVSVF9CSU5PUCh2LCB3LCAmYSwgJmIpOwotCWFkID0gX1B5TG9uZ19Bc1NjYWxlZERvdWJsZSgoUHlPYmplY3QgKilhLCAmYWV4cCk7Ci0JYmQgPSBfUHlMb25nX0FzU2NhbGVkRG91YmxlKChQeU9iamVjdCAqKWIsICZiZXhwKTsKLQlmYWlsZWQgPSAoYWQgPT0gLTEuMCB8fCBiZCA9PSAtMS4wKSAmJiBQeUVycl9PY2N1cnJlZCgpOwotCVB5X0RFQ1JFRihhKTsKLQlQeV9ERUNSRUYoYik7Ci0JaWYgKGZhaWxlZCkKLQkJcmV0dXJuIE5VTEw7Ci0JLyogJ2FleHAnIGFuZCAnYmV4cCcgd2VyZSBpbml0aWFsaXplZCB0byAtMSB0byBzaWxlbmNlIGdjYy00LjAueCwKLQkgICBidXQgc2hvdWxkIHJlYWxseSBiZSBzZXQgY29ycmVjdGx5IGFmdGVyIHN1Y2Vzc2Z1bCBjYWxscyB0bwotCSAgIF9QeUxvbmdfQXNTY2FsZWREb3VibGUoKSAqLwotCWFzc2VydChhZXhwID49IDAgJiYgYmV4cCA+PSAwKTsKKyAgICBDT05WRVJUX0JJTk9QKHYsIHcsICZhLCAmYik7CisgICAgYWQgPSBfUHlMb25nX0FzU2NhbGVkRG91YmxlKChQeU9iamVjdCAqKWEsICZhZXhwKTsKKyAgICBiZCA9IF9QeUxvbmdfQXNTY2FsZWREb3VibGUoKFB5T2JqZWN0ICopYiwgJmJleHApOworICAgIGZhaWxlZCA9IChhZCA9PSAtMS4wIHx8IGJkID09IC0xLjApICYmIFB5RXJyX09jY3VycmVkKCk7CisgICAgUHlfREVDUkVGKGEpOworICAgIFB5X0RFQ1JFRihiKTsKKyAgICBpZiAoZmFpbGVkKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAvKiAnYWV4cCcgYW5kICdiZXhwJyB3ZXJlIGluaXRpYWxpemVkIHRvIC0xIHRvIHNpbGVuY2UgZ2NjLTQuMC54LAorICAgICAgIGJ1dCBzaG91bGQgcmVhbGx5IGJlIHNldCBjb3JyZWN0bHkgYWZ0ZXIgc3VjZXNzZnVsIGNhbGxzIHRvCisgICAgICAgX1B5TG9uZ19Bc1NjYWxlZERvdWJsZSgpICovCisgICAgYXNzZXJ0KGFleHAgPj0gMCAmJiBiZXhwID49IDApOwogCi0JaWYgKGJkID09IDAuMCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfWmVyb0RpdmlzaW9uRXJyb3IsCi0JCQkibG9uZyBkaXZpc2lvbiBvciBtb2R1bG8gYnkgemVybyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKGJkID09IDAuMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfWmVyb0RpdmlzaW9uRXJyb3IsCisgICAgICAgICAgICAibG9uZyBkaXZpc2lvbiBvciBtb2R1bG8gYnkgemVybyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQkvKiBUcnVlIHZhbHVlIGlzIHZlcnkgY2xvc2UgdG8gYWQvYmQgKiAyKiooUHlMb25nX1NISUZUKihhZXhwLWJleHApKSAqLwotCWFkIC89IGJkOwkvKiBvdmVyZmxvdy91bmRlcmZsb3cgaW1wb3NzaWJsZSBoZXJlICovCi0JYWV4cCAtPSBiZXhwOwotCWlmIChhZXhwID4gSU5UX01BWCAvIFB5TG9uZ19TSElGVCkKLQkJZ290byBvdmVyZmxvdzsKLQllbHNlIGlmIChhZXhwIDwgLShJTlRfTUFYIC8gUHlMb25nX1NISUZUKSkKLQkJcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZSgwLjApOwkvKiB1bmRlcmZsb3cgdG8gMCAqLwotCWVycm5vID0gMDsKLQlhZCA9IGxkZXhwKGFkLCBhZXhwICogUHlMb25nX1NISUZUKTsKLQlpZiAoUHlfT1ZFUkZMT1dFRChhZCkpIC8qIGlnbm9yZSB1bmRlcmZsb3cgdG8gMC4wICovCi0JCWdvdG8gb3ZlcmZsb3c7Ci0JcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShhZCk7CisgICAgLyogVHJ1ZSB2YWx1ZSBpcyB2ZXJ5IGNsb3NlIHRvIGFkL2JkICogMioqKFB5TG9uZ19TSElGVCooYWV4cC1iZXhwKSkgKi8KKyAgICBhZCAvPSBiZDsgICAgICAgICAgIC8qIG92ZXJmbG93L3VuZGVyZmxvdyBpbXBvc3NpYmxlIGhlcmUgKi8KKyAgICBhZXhwIC09IGJleHA7CisgICAgaWYgKGFleHAgPiBJTlRfTUFYIC8gUHlMb25nX1NISUZUKQorICAgICAgICBnb3RvIG92ZXJmbG93OworICAgIGVsc2UgaWYgKGFleHAgPCAtKElOVF9NQVggLyBQeUxvbmdfU0hJRlQpKQorICAgICAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKDAuMCk7ICAgICAgICAgLyogdW5kZXJmbG93IHRvIDAgKi8KKyAgICBlcnJubyA9IDA7CisgICAgYWQgPSBsZGV4cChhZCwgYWV4cCAqIFB5TG9uZ19TSElGVCk7CisgICAgaWYgKFB5X09WRVJGTE9XRUQoYWQpKSAvKiBpZ25vcmUgdW5kZXJmbG93IHRvIDAuMCAqLworICAgICAgICBnb3RvIG92ZXJmbG93OworICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoYWQpOwogCiBvdmVyZmxvdzoKLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJImxvbmcvbG9uZyB0b28gbGFyZ2UgZm9yIGEgZmxvYXQiKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgImxvbmcvbG9uZyB0b28gbGFyZ2UgZm9yIGEgZmxvYXQiKTsKKyAgICByZXR1cm4gTlVMTDsKIAogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbG9uZ19tb2QoUHlPYmplY3QgKnYsIFB5T2JqZWN0ICp3KQogewotCVB5TG9uZ09iamVjdCAqYSwgKmIsICptb2Q7CisgICAgUHlMb25nT2JqZWN0ICphLCAqYiwgKm1vZDsKIAotCUNPTlZFUlRfQklOT1AodiwgdywgJmEsICZiKTsKKyAgICBDT05WRVJUX0JJTk9QKHYsIHcsICZhLCAmYik7CiAKLQlpZiAobF9kaXZtb2QoYSwgYiwgTlVMTCwgJm1vZCkgPCAwKQotCQltb2QgPSBOVUxMOwotCVB5X0RFQ1JFRihhKTsKLQlQeV9ERUNSRUYoYik7Ci0JcmV0dXJuIChQeU9iamVjdCAqKW1vZDsKKyAgICBpZiAobF9kaXZtb2QoYSwgYiwgTlVMTCwgJm1vZCkgPCAwKQorICAgICAgICBtb2QgPSBOVUxMOworICAgIFB5X0RFQ1JFRihhKTsKKyAgICBQeV9ERUNSRUYoYik7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKW1vZDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGxvbmdfZGl2bW9kKFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdykKIHsKLQlQeUxvbmdPYmplY3QgKmEsICpiLCAqZGl2LCAqbW9kOwotCVB5T2JqZWN0ICp6OworICAgIFB5TG9uZ09iamVjdCAqYSwgKmIsICpkaXYsICptb2Q7CisgICAgUHlPYmplY3QgKno7CiAKLQlDT05WRVJUX0JJTk9QKHYsIHcsICZhLCAmYik7CisgICAgQ09OVkVSVF9CSU5PUCh2LCB3LCAmYSwgJmIpOwogCi0JaWYgKGxfZGl2bW9kKGEsIGIsICZkaXYsICZtb2QpIDwgMCkgewotCQlQeV9ERUNSRUYoYSk7Ci0JCVB5X0RFQ1JFRihiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXogPSBQeVR1cGxlX05ldygyKTsKLQlpZiAoeiAhPSBOVUxMKSB7Ci0JCVB5VHVwbGVfU2V0SXRlbSh6LCAwLCAoUHlPYmplY3QgKikgZGl2KTsKLQkJUHlUdXBsZV9TZXRJdGVtKHosIDEsIChQeU9iamVjdCAqKSBtb2QpOwotCX0KLQllbHNlIHsKLQkJUHlfREVDUkVGKGRpdik7Ci0JCVB5X0RFQ1JFRihtb2QpOwotCX0KLQlQeV9ERUNSRUYoYSk7Ci0JUHlfREVDUkVGKGIpOwotCXJldHVybiB6OworICAgIGlmIChsX2Rpdm1vZChhLCBiLCAmZGl2LCAmbW9kKSA8IDApIHsKKyAgICAgICAgUHlfREVDUkVGKGEpOworICAgICAgICBQeV9ERUNSRUYoYik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICB6ID0gUHlUdXBsZV9OZXcoMik7CisgICAgaWYgKHogIT0gTlVMTCkgeworICAgICAgICBQeVR1cGxlX1NldEl0ZW0oeiwgMCwgKFB5T2JqZWN0ICopIGRpdik7CisgICAgICAgIFB5VHVwbGVfU2V0SXRlbSh6LCAxLCAoUHlPYmplY3QgKikgbW9kKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5X0RFQ1JFRihkaXYpOworICAgICAgICBQeV9ERUNSRUYobW9kKTsKKyAgICB9CisgICAgUHlfREVDUkVGKGEpOworICAgIFB5X0RFQ1JFRihiKTsKKyAgICByZXR1cm4gejsKIH0KIAogLyogcG93KHYsIHcsIHgpICovCiBzdGF0aWMgUHlPYmplY3QgKgogbG9uZ19wb3coUHlPYmplY3QgKnYsIFB5T2JqZWN0ICp3LCBQeU9iamVjdCAqeCkKIHsKLQlQeUxvbmdPYmplY3QgKmEsICpiLCAqYzsgLyogYSxiLGMgPSB2LHcseCAqLwotCWludCBuZWdhdGl2ZU91dHB1dCA9IDA7ICAvKiBpZiB4PDAgcmV0dXJuIG5lZ2F0aXZlIG91dHB1dCAqLworICAgIFB5TG9uZ09iamVjdCAqYSwgKmIsICpjOyAvKiBhLGIsYyA9IHYsdyx4ICovCisgICAgaW50IG5lZ2F0aXZlT3V0cHV0ID0gMDsgIC8qIGlmIHg8MCByZXR1cm4gbmVnYXRpdmUgb3V0cHV0ICovCiAKLQlQeUxvbmdPYmplY3QgKnogPSBOVUxMOyAgLyogYWNjdW11bGF0ZWQgcmVzdWx0ICovCi0JUHlfc3NpemVfdCBpLCBqLCBrOyAgICAgICAgICAgICAvKiBjb3VudGVycyAqLwotCVB5TG9uZ09iamVjdCAqdGVtcCA9IE5VTEw7CisgICAgUHlMb25nT2JqZWN0ICp6ID0gTlVMTDsgIC8qIGFjY3VtdWxhdGVkIHJlc3VsdCAqLworICAgIFB5X3NzaXplX3QgaSwgaiwgazsgICAgICAgICAgICAgLyogY291bnRlcnMgKi8KKyAgICBQeUxvbmdPYmplY3QgKnRlbXAgPSBOVUxMOwogCi0JLyogNS1hcnkgdmFsdWVzLiAgSWYgdGhlIGV4cG9uZW50IGlzIGxhcmdlIGVub3VnaCwgdGFibGUgaXMKLQkgKiBwcmVjb21wdXRlZCBzbyB0aGF0IHRhYmxlW2ldID09IGEqKmkgJSBjIGZvciBpIGluIHJhbmdlKDMyKS4KLQkgKi8KLQlQeUxvbmdPYmplY3QgKnRhYmxlWzMyXSA9IHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAotCQkJCSAgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9OworICAgIC8qIDUtYXJ5IHZhbHVlcy4gIElmIHRoZSBleHBvbmVudCBpcyBsYXJnZSBlbm91Z2gsIHRhYmxlIGlzCisgICAgICogcHJlY29tcHV0ZWQgc28gdGhhdCB0YWJsZVtpXSA9PSBhKippICUgYyBmb3IgaSBpbiByYW5nZSgzMikuCisgICAgICovCisgICAgUHlMb25nT2JqZWN0ICp0YWJsZVszMl0gPSB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfTsKIAotCS8qIGEsIGIsIGMgPSB2LCB3LCB4ICovCi0JQ09OVkVSVF9CSU5PUCh2LCB3LCAmYSwgJmIpOwotCWlmIChQeUxvbmdfQ2hlY2soeCkpIHsKLQkJYyA9IChQeUxvbmdPYmplY3QgKil4OwotCQlQeV9JTkNSRUYoeCk7Ci0JfQotCWVsc2UgaWYgKFB5SW50X0NoZWNrKHgpKSB7Ci0JCWMgPSAoUHlMb25nT2JqZWN0ICopUHlMb25nX0Zyb21Mb25nKFB5SW50X0FTX0xPTkcoeCkpOwotCQlpZiAoYyA9PSBOVUxMKQotCQkJZ290byBFcnJvcjsKLQl9Ci0JZWxzZSBpZiAoeCA9PSBQeV9Ob25lKQotCQljID0gTlVMTDsKLQllbHNlIHsKLQkJUHlfREVDUkVGKGEpOwotCQlQeV9ERUNSRUYoYik7Ci0JCVB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7Ci0JCXJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKLQl9CisgICAgLyogYSwgYiwgYyA9IHYsIHcsIHggKi8KKyAgICBDT05WRVJUX0JJTk9QKHYsIHcsICZhLCAmYik7CisgICAgaWYgKFB5TG9uZ19DaGVjayh4KSkgeworICAgICAgICBjID0gKFB5TG9uZ09iamVjdCAqKXg7CisgICAgICAgIFB5X0lOQ1JFRih4KTsKKyAgICB9CisgICAgZWxzZSBpZiAoUHlJbnRfQ2hlY2soeCkpIHsKKyAgICAgICAgYyA9IChQeUxvbmdPYmplY3QgKilQeUxvbmdfRnJvbUxvbmcoUHlJbnRfQVNfTE9ORyh4KSk7CisgICAgICAgIGlmIChjID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIEVycm9yOworICAgIH0KKyAgICBlbHNlIGlmICh4ID09IFB5X05vbmUpCisgICAgICAgIGMgPSBOVUxMOworICAgIGVsc2UgeworICAgICAgICBQeV9ERUNSRUYoYSk7CisgICAgICAgIFB5X0RFQ1JFRihiKTsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKKyAgICAgICAgcmV0dXJuIFB5X05vdEltcGxlbWVudGVkOworICAgIH0KIAotCWlmIChQeV9TSVpFKGIpIDwgMCkgeyAgLyogaWYgZXhwb25lbnQgaXMgbmVnYXRpdmUgKi8KLQkJaWYgKGMpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJwb3coKSAybmQgYXJndW1lbnQgIgotCQkJICAgICJjYW5ub3QgYmUgbmVnYXRpdmUgd2hlbiAzcmQgYXJndW1lbnQgc3BlY2lmaWVkIik7Ci0JCQlnb3RvIEVycm9yOwotCQl9Ci0JCWVsc2UgewotCQkJLyogZWxzZSByZXR1cm4gYSBmbG9hdC4gIFRoaXMgd29ya3MgYmVjYXVzZSB3ZSBrbm93Ci0JCQkgICB0aGF0IHRoaXMgY2FsbHMgZmxvYXRfcG93KCkgd2hpY2ggY29udmVydHMgaXRzCi0JCQkgICBhcmd1bWVudHMgdG8gZG91YmxlLiAqLwotCQkJUHlfREVDUkVGKGEpOwotCQkJUHlfREVDUkVGKGIpOwotCQkJcmV0dXJuIFB5RmxvYXRfVHlwZS50cF9hc19udW1iZXItPm5iX3Bvd2VyKHYsIHcsIHgpOwotCQl9Ci0JfQorICAgIGlmIChQeV9TSVpFKGIpIDwgMCkgeyAgLyogaWYgZXhwb25lbnQgaXMgbmVnYXRpdmUgKi8KKyAgICAgICAgaWYgKGMpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJwb3coKSAybmQgYXJndW1lbnQgIgorICAgICAgICAgICAgICAgICJjYW5ub3QgYmUgbmVnYXRpdmUgd2hlbiAzcmQgYXJndW1lbnQgc3BlY2lmaWVkIik7CisgICAgICAgICAgICBnb3RvIEVycm9yOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLyogZWxzZSByZXR1cm4gYSBmbG9hdC4gIFRoaXMgd29ya3MgYmVjYXVzZSB3ZSBrbm93CisgICAgICAgICAgICAgICB0aGF0IHRoaXMgY2FsbHMgZmxvYXRfcG93KCkgd2hpY2ggY29udmVydHMgaXRzCisgICAgICAgICAgICAgICBhcmd1bWVudHMgdG8gZG91YmxlLiAqLworICAgICAgICAgICAgUHlfREVDUkVGKGEpOworICAgICAgICAgICAgUHlfREVDUkVGKGIpOworICAgICAgICAgICAgcmV0dXJuIFB5RmxvYXRfVHlwZS50cF9hc19udW1iZXItPm5iX3Bvd2VyKHYsIHcsIHgpOworICAgICAgICB9CisgICAgfQogCi0JaWYgKGMpIHsKLQkJLyogaWYgbW9kdWx1cyA9PSAwOgotCQkgICAgICAgcmFpc2UgVmFsdWVFcnJvcigpICovCi0JCWlmIChQeV9TSVpFKGMpID09IDApIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCQkicG93KCkgM3JkIGFyZ3VtZW50IGNhbm5vdCBiZSAwIik7Ci0JCQlnb3RvIEVycm9yOwotCQl9CisgICAgaWYgKGMpIHsKKyAgICAgICAgLyogaWYgbW9kdWx1cyA9PSAwOgorICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigpICovCisgICAgICAgIGlmIChQeV9TSVpFKGMpID09IDApIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3coKSAzcmQgYXJndW1lbnQgY2Fubm90IGJlIDAiKTsKKyAgICAgICAgICAgIGdvdG8gRXJyb3I7CisgICAgICAgIH0KIAotCQkvKiBpZiBtb2R1bHVzIDwgMDoKLQkJICAgICAgIG5lZ2F0aXZlT3V0cHV0ID0gVHJ1ZQotCQkgICAgICAgbW9kdWx1cyA9IC1tb2R1bHVzICovCi0JCWlmIChQeV9TSVpFKGMpIDwgMCkgewotCQkJbmVnYXRpdmVPdXRwdXQgPSAxOwotCQkJdGVtcCA9IChQeUxvbmdPYmplY3QgKilfUHlMb25nX0NvcHkoYyk7Ci0JCQlpZiAodGVtcCA9PSBOVUxMKQotCQkJCWdvdG8gRXJyb3I7Ci0JCQlQeV9ERUNSRUYoYyk7Ci0JCQljID0gdGVtcDsKLQkJCXRlbXAgPSBOVUxMOwotCQkJYy0+b2Jfc2l6ZSA9IC0gYy0+b2Jfc2l6ZTsKLQkJfQorICAgICAgICAvKiBpZiBtb2R1bHVzIDwgMDoKKyAgICAgICAgICAgICAgIG5lZ2F0aXZlT3V0cHV0ID0gVHJ1ZQorICAgICAgICAgICAgICAgbW9kdWx1cyA9IC1tb2R1bHVzICovCisgICAgICAgIGlmIChQeV9TSVpFKGMpIDwgMCkgeworICAgICAgICAgICAgbmVnYXRpdmVPdXRwdXQgPSAxOworICAgICAgICAgICAgdGVtcCA9IChQeUxvbmdPYmplY3QgKilfUHlMb25nX0NvcHkoYyk7CisgICAgICAgICAgICBpZiAodGVtcCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGdvdG8gRXJyb3I7CisgICAgICAgICAgICBQeV9ERUNSRUYoYyk7CisgICAgICAgICAgICBjID0gdGVtcDsKKyAgICAgICAgICAgIHRlbXAgPSBOVUxMOworICAgICAgICAgICAgYy0+b2Jfc2l6ZSA9IC0gYy0+b2Jfc2l6ZTsKKyAgICAgICAgfQogCi0JCS8qIGlmIG1vZHVsdXMgPT0gMToKLQkJICAgICAgIHJldHVybiAwICovCi0JCWlmICgoUHlfU0laRShjKSA9PSAxKSAmJiAoYy0+b2JfZGlnaXRbMF0gPT0gMSkpIHsKLQkJCXogPSAoUHlMb25nT2JqZWN0ICopUHlMb25nX0Zyb21Mb25nKDBMKTsKLQkJCWdvdG8gRG9uZTsKLQkJfQorICAgICAgICAvKiBpZiBtb2R1bHVzID09IDE6CisgICAgICAgICAgICAgICByZXR1cm4gMCAqLworICAgICAgICBpZiAoKFB5X1NJWkUoYykgPT0gMSkgJiYgKGMtPm9iX2RpZ2l0WzBdID09IDEpKSB7CisgICAgICAgICAgICB6ID0gKFB5TG9uZ09iamVjdCAqKVB5TG9uZ19Gcm9tTG9uZygwTCk7CisgICAgICAgICAgICBnb3RvIERvbmU7CisgICAgICAgIH0KIAotCQkvKiBpZiBiYXNlIDwgMDoKLQkJICAgICAgIGJhc2UgPSBiYXNlICUgbW9kdWx1cwotCQkgICBIYXZpbmcgdGhlIGJhc2UgcG9zaXRpdmUganVzdCBtYWtlcyB0aGluZ3MgZWFzaWVyLiAqLwotCQlpZiAoUHlfU0laRShhKSA8IDApIHsKLQkJCWlmIChsX2Rpdm1vZChhLCBjLCBOVUxMLCAmdGVtcCkgPCAwKQotCQkJCWdvdG8gRXJyb3I7Ci0JCQlQeV9ERUNSRUYoYSk7Ci0JCQlhID0gdGVtcDsKLQkJCXRlbXAgPSBOVUxMOwotCQl9Ci0JfQorICAgICAgICAvKiBpZiBiYXNlIDwgMDoKKyAgICAgICAgICAgICAgIGJhc2UgPSBiYXNlICUgbW9kdWx1cworICAgICAgICAgICBIYXZpbmcgdGhlIGJhc2UgcG9zaXRpdmUganVzdCBtYWtlcyB0aGluZ3MgZWFzaWVyLiAqLworICAgICAgICBpZiAoUHlfU0laRShhKSA8IDApIHsKKyAgICAgICAgICAgIGlmIChsX2Rpdm1vZChhLCBjLCBOVUxMLCAmdGVtcCkgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gRXJyb3I7CisgICAgICAgICAgICBQeV9ERUNSRUYoYSk7CisgICAgICAgICAgICBhID0gdGVtcDsKKyAgICAgICAgICAgIHRlbXAgPSBOVUxMOworICAgICAgICB9CisgICAgfQogCi0JLyogQXQgdGhpcyBwb2ludCBhLCBiLCBhbmQgYyBhcmUgZ3VhcmFudGVlZCBub24tbmVnYXRpdmUgVU5MRVNTCi0JICAgYyBpcyBOVUxMLCBpbiB3aGljaCBjYXNlIGEgbWF5IGJlIG5lZ2F0aXZlLiAqLworICAgIC8qIEF0IHRoaXMgcG9pbnQgYSwgYiwgYW5kIGMgYXJlIGd1YXJhbnRlZWQgbm9uLW5lZ2F0aXZlIFVOTEVTUworICAgICAgIGMgaXMgTlVMTCwgaW4gd2hpY2ggY2FzZSBhIG1heSBiZSBuZWdhdGl2ZS4gKi8KIAotCXogPSAoUHlMb25nT2JqZWN0ICopUHlMb25nX0Zyb21Mb25nKDFMKTsKLQlpZiAoeiA9PSBOVUxMKQotCQlnb3RvIEVycm9yOworICAgIHogPSAoUHlMb25nT2JqZWN0ICopUHlMb25nX0Zyb21Mb25nKDFMKTsKKyAgICBpZiAoeiA9PSBOVUxMKQorICAgICAgICBnb3RvIEVycm9yOwogCi0JLyogUGVyZm9ybSBhIG1vZHVsYXIgcmVkdWN0aW9uLCBYID0gWCAlIGMsIGJ1dCBsZWF2ZSBYIGFsb25lIGlmIGMKLQkgKiBpcyBOVUxMLgotCSAqLwotI2RlZmluZSBSRURVQ0UoWCkJCQkJCVwKLQlpZiAoYyAhPSBOVUxMKSB7CQkJCVwKLQkJaWYgKGxfZGl2bW9kKFgsIGMsIE5VTEwsICZ0ZW1wKSA8IDApCVwKLQkJCWdvdG8gRXJyb3I7CQkJXAotCQlQeV9YREVDUkVGKFgpOwkJCQlcCi0JCVggPSB0ZW1wOwkJCQlcCi0JCXRlbXAgPSBOVUxMOwkJCQlcCi0JfQorICAgIC8qIFBlcmZvcm0gYSBtb2R1bGFyIHJlZHVjdGlvbiwgWCA9IFggJSBjLCBidXQgbGVhdmUgWCBhbG9uZSBpZiBjCisgICAgICogaXMgTlVMTC4KKyAgICAgKi8KKyNkZWZpbmUgUkVEVUNFKFgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChjICE9IE5VTEwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChsX2Rpdm1vZChYLCBjLCBOVUxMLCAmdGVtcCkgPCAwKSAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGdvdG8gRXJyb3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBQeV9YREVDUkVGKFgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFggPSB0ZW1wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdGVtcCA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KIAotCS8qIE11bHRpcGx5IHR3byB2YWx1ZXMsIHRoZW4gcmVkdWNlIHRoZSByZXN1bHQ6Ci0JICAgcmVzdWx0ID0gWCpZICUgYy4gIElmIGMgaXMgTlVMTCwgc2tpcCB0aGUgbW9kLiAqLwotI2RlZmluZSBNVUxUKFgsIFksIHJlc3VsdCkJCQkJXAotewkJCQkJCQlcCi0JdGVtcCA9IChQeUxvbmdPYmplY3QgKilsb25nX211bChYLCBZKTsJCVwKLQlpZiAodGVtcCA9PSBOVUxMKQkJCQlcCi0JCWdvdG8gRXJyb3I7CQkJCVwKLQlQeV9YREVDUkVGKHJlc3VsdCk7CQkJCVwKLQlyZXN1bHQgPSB0ZW1wOwkJCQkJXAotCXRlbXAgPSBOVUxMOwkJCQkJXAotCVJFRFVDRShyZXN1bHQpCQkJCQlcCisgICAgLyogTXVsdGlwbHkgdHdvIHZhbHVlcywgdGhlbiByZWR1Y2UgdGhlIHJlc3VsdDoKKyAgICAgICByZXN1bHQgPSBYKlkgJSBjLiAgSWYgYyBpcyBOVUxMLCBza2lwIHRoZSBtb2QuICovCisjZGVmaW5lIE1VTFQoWCwgWSwgcmVzdWx0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlbXAgPSAoUHlMb25nT2JqZWN0ICopbG9uZ19tdWwoWCwgWSk7ICAgICAgICAgICAgICBcCisgICAgaWYgKHRlbXAgPT0gTlVMTCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZ290byBFcnJvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFB5X1hERUNSRUYocmVzdWx0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmVzdWx0ID0gdGVtcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZW1wID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFJFRFVDRShyZXN1bHQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiB9CiAKLQlpZiAoUHlfU0laRShiKSA8PSBGSVZFQVJZX0NVVE9GRikgewotCQkvKiBMZWZ0LXRvLXJpZ2h0IGJpbmFyeSBleHBvbmVudGlhdGlvbiAoSEFDIEFsZ29yaXRobSAxNC43OSkgKi8KLQkJLyogaHR0cDovL3d3dy5jYWNyLm1hdGgudXdhdGVybG9vLmNhL2hhYy9hYm91dC9jaGFwMTQucGRmICAgICovCi0JCWZvciAoaSA9IFB5X1NJWkUoYikgLSAxOyBpID49IDA7IC0taSkgewotCQkJZGlnaXQgYmkgPSBiLT5vYl9kaWdpdFtpXTsKKyAgICBpZiAoUHlfU0laRShiKSA8PSBGSVZFQVJZX0NVVE9GRikgeworICAgICAgICAvKiBMZWZ0LXRvLXJpZ2h0IGJpbmFyeSBleHBvbmVudGlhdGlvbiAoSEFDIEFsZ29yaXRobSAxNC43OSkgKi8KKyAgICAgICAgLyogaHR0cDovL3d3dy5jYWNyLm1hdGgudXdhdGVybG9vLmNhL2hhYy9hYm91dC9jaGFwMTQucGRmICAgICovCisgICAgICAgIGZvciAoaSA9IFB5X1NJWkUoYikgLSAxOyBpID49IDA7IC0taSkgeworICAgICAgICAgICAgZGlnaXQgYmkgPSBiLT5vYl9kaWdpdFtpXTsKIAotCQkJZm9yIChqID0gMSA8PCAoUHlMb25nX1NISUZULTEpOyBqICE9IDA7IGogPj49IDEpIHsKLQkJCQlNVUxUKHosIHosIHopCi0JCQkJaWYgKGJpICYgaikKLQkJCQkJTVVMVCh6LCBhLCB6KQotCQkJfQotCQl9Ci0JfQotCWVsc2UgewotCQkvKiBMZWZ0LXRvLXJpZ2h0IDUtYXJ5IGV4cG9uZW50aWF0aW9uIChIQUMgQWxnb3JpdGhtIDE0LjgyKSAqLwotCQlQeV9JTkNSRUYoeik7CS8qIHN0aWxsIGhvbGRzIDFMICovCi0JCXRhYmxlWzBdID0gejsKLQkJZm9yIChpID0gMTsgaSA8IDMyOyArK2kpCi0JCQlNVUxUKHRhYmxlW2ktMV0sIGEsIHRhYmxlW2ldKQorICAgICAgICAgICAgZm9yIChqID0gMSA8PCAoUHlMb25nX1NISUZULTEpOyBqICE9IDA7IGogPj49IDEpIHsKKyAgICAgICAgICAgICAgICBNVUxUKHosIHosIHopCisgICAgICAgICAgICAgICAgaWYgKGJpICYgaikKKyAgICAgICAgICAgICAgICAgICAgTVVMVCh6LCBhLCB6KQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvKiBMZWZ0LXRvLXJpZ2h0IDUtYXJ5IGV4cG9uZW50aWF0aW9uIChIQUMgQWxnb3JpdGhtIDE0LjgyKSAqLworICAgICAgICBQeV9JTkNSRUYoeik7ICAgICAgICAgICAvKiBzdGlsbCBob2xkcyAxTCAqLworICAgICAgICB0YWJsZVswXSA9IHo7CisgICAgICAgIGZvciAoaSA9IDE7IGkgPCAzMjsgKytpKQorICAgICAgICAgICAgTVVMVCh0YWJsZVtpLTFdLCBhLCB0YWJsZVtpXSkKIAotCQlmb3IgKGkgPSBQeV9TSVpFKGIpIC0gMTsgaSA+PSAwOyAtLWkpIHsKLQkJCWNvbnN0IGRpZ2l0IGJpID0gYi0+b2JfZGlnaXRbaV07CisgICAgICAgIGZvciAoaSA9IFB5X1NJWkUoYikgLSAxOyBpID49IDA7IC0taSkgeworICAgICAgICAgICAgY29uc3QgZGlnaXQgYmkgPSBiLT5vYl9kaWdpdFtpXTsKIAotCQkJZm9yIChqID0gUHlMb25nX1NISUZUIC0gNTsgaiA+PSAwOyBqIC09IDUpIHsKLQkJCQljb25zdCBpbnQgaW5kZXggPSAoYmkgPj4gaikgJiAweDFmOwotCQkJCWZvciAoayA9IDA7IGsgPCA1OyArK2spCi0JCQkJCU1VTFQoeiwgeiwgeikKLQkJCQlpZiAoaW5kZXgpCi0JCQkJCU1VTFQoeiwgdGFibGVbaW5kZXhdLCB6KQotCQkJfQotCQl9Ci0JfQorICAgICAgICAgICAgZm9yIChqID0gUHlMb25nX1NISUZUIC0gNTsgaiA+PSAwOyBqIC09IDUpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgaW5kZXggPSAoYmkgPj4gaikgJiAweDFmOworICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCA1OyArK2spCisgICAgICAgICAgICAgICAgICAgIE1VTFQoeiwgeiwgeikKKyAgICAgICAgICAgICAgICBpZiAoaW5kZXgpCisgICAgICAgICAgICAgICAgICAgIE1VTFQoeiwgdGFibGVbaW5kZXhdLCB6KQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogCi0JaWYgKG5lZ2F0aXZlT3V0cHV0ICYmIChQeV9TSVpFKHopICE9IDApKSB7Ci0JCXRlbXAgPSAoUHlMb25nT2JqZWN0ICopbG9uZ19zdWIoeiwgYyk7Ci0JCWlmICh0ZW1wID09IE5VTEwpCi0JCQlnb3RvIEVycm9yOwotCQlQeV9ERUNSRUYoeik7Ci0JCXogPSB0ZW1wOwotCQl0ZW1wID0gTlVMTDsKLQl9Ci0JZ290byBEb25lOworICAgIGlmIChuZWdhdGl2ZU91dHB1dCAmJiAoUHlfU0laRSh6KSAhPSAwKSkgeworICAgICAgICB0ZW1wID0gKFB5TG9uZ09iamVjdCAqKWxvbmdfc3ViKHosIGMpOworICAgICAgICBpZiAodGVtcCA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBFcnJvcjsKKyAgICAgICAgUHlfREVDUkVGKHopOworICAgICAgICB6ID0gdGVtcDsKKyAgICAgICAgdGVtcCA9IE5VTEw7CisgICAgfQorICAgIGdvdG8gRG9uZTsKIAogIEVycm9yOgotIAlpZiAoeiAhPSBOVUxMKSB7Ci0gCQlQeV9ERUNSRUYoeik7Ci0gCQl6ID0gTlVMTDsKLSAJfQotCS8qIGZhbGwgdGhyb3VnaCAqLworICAgIGlmICh6ICE9IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKHopOworICAgICAgICB6ID0gTlVMTDsKKyAgICB9CisgICAgLyogZmFsbCB0aHJvdWdoICovCiAgRG9uZToKLQlpZiAoUHlfU0laRShiKSA+IEZJVkVBUllfQ1VUT0ZGKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCAzMjsgKytpKQotCQkJUHlfWERFQ1JFRih0YWJsZVtpXSk7Ci0JfQotCVB5X0RFQ1JFRihhKTsKLQlQeV9ERUNSRUYoYik7Ci0JUHlfWERFQ1JFRihjKTsKLQlQeV9YREVDUkVGKHRlbXApOwotCXJldHVybiAoUHlPYmplY3QgKil6OworICAgIGlmIChQeV9TSVpFKGIpID4gRklWRUFSWV9DVVRPRkYpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDMyOyArK2kpCisgICAgICAgICAgICBQeV9YREVDUkVGKHRhYmxlW2ldKTsKKyAgICB9CisgICAgUHlfREVDUkVGKGEpOworICAgIFB5X0RFQ1JFRihiKTsKKyAgICBQeV9YREVDUkVGKGMpOworICAgIFB5X1hERUNSRUYodGVtcCk7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKXo7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBsb25nX2ludmVydChQeUxvbmdPYmplY3QgKnYpCiB7Ci0JLyogSW1wbGVtZW50IH54IGFzIC0oeCsxKSAqLwotCVB5TG9uZ09iamVjdCAqeDsKLQlQeUxvbmdPYmplY3QgKnc7Ci0JdyA9IChQeUxvbmdPYmplY3QgKilQeUxvbmdfRnJvbUxvbmcoMUwpOwotCWlmICh3ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXggPSAoUHlMb25nT2JqZWN0ICopIGxvbmdfYWRkKHYsIHcpOwotCVB5X0RFQ1JFRih3KTsKLQlpZiAoeCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlQeV9TSVpFKHgpID0gLShQeV9TSVpFKHgpKTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopeDsKKyAgICAvKiBJbXBsZW1lbnQgfnggYXMgLSh4KzEpICovCisgICAgUHlMb25nT2JqZWN0ICp4OworICAgIFB5TG9uZ09iamVjdCAqdzsKKyAgICB3ID0gKFB5TG9uZ09iamVjdCAqKVB5TG9uZ19Gcm9tTG9uZygxTCk7CisgICAgaWYgKHcgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgeCA9IChQeUxvbmdPYmplY3QgKikgbG9uZ19hZGQodiwgdyk7CisgICAgUHlfREVDUkVGKHcpOworICAgIGlmICh4ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5X1NJWkUoeCkgPSAtKFB5X1NJWkUoeCkpOworICAgIHJldHVybiAoUHlPYmplY3QgKil4OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbG9uZ19uZWcoUHlMb25nT2JqZWN0ICp2KQogewotCVB5TG9uZ09iamVjdCAqejsKLQlpZiAodi0+b2Jfc2l6ZSA9PSAwICYmIFB5TG9uZ19DaGVja0V4YWN0KHYpKSB7Ci0JCS8qIC0wID09IDAgKi8KLQkJUHlfSU5DUkVGKHYpOwotCQlyZXR1cm4gKFB5T2JqZWN0ICopIHY7Ci0JfQotCXogPSAoUHlMb25nT2JqZWN0ICopX1B5TG9uZ19Db3B5KHYpOwotCWlmICh6ICE9IE5VTEwpCi0JCXotPm9iX3NpemUgPSAtKHYtPm9iX3NpemUpOwotCXJldHVybiAoUHlPYmplY3QgKil6OworICAgIFB5TG9uZ09iamVjdCAqejsKKyAgICBpZiAodi0+b2Jfc2l6ZSA9PSAwICYmIFB5TG9uZ19DaGVja0V4YWN0KHYpKSB7CisgICAgICAgIC8qIC0wID09IDAgKi8KKyAgICAgICAgUHlfSU5DUkVGKHYpOworICAgICAgICByZXR1cm4gKFB5T2JqZWN0ICopIHY7CisgICAgfQorICAgIHogPSAoUHlMb25nT2JqZWN0ICopX1B5TG9uZ19Db3B5KHYpOworICAgIGlmICh6ICE9IE5VTEwpCisgICAgICAgIHotPm9iX3NpemUgPSAtKHYtPm9iX3NpemUpOworICAgIHJldHVybiAoUHlPYmplY3QgKil6OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbG9uZ19hYnMoUHlMb25nT2JqZWN0ICp2KQogewotCWlmICh2LT5vYl9zaXplIDwgMCkKLQkJcmV0dXJuIGxvbmdfbmVnKHYpOwotCWVsc2UKLQkJcmV0dXJuIGxvbmdfbG9uZygoUHlPYmplY3QgKil2KTsKKyAgICBpZiAodi0+b2Jfc2l6ZSA8IDApCisgICAgICAgIHJldHVybiBsb25nX25lZyh2KTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBsb25nX2xvbmcoKFB5T2JqZWN0ICopdik7CiB9CiAKIHN0YXRpYyBpbnQKIGxvbmdfbm9uemVybyhQeUxvbmdPYmplY3QgKnYpCiB7Ci0JcmV0dXJuIEFCUyhQeV9TSVpFKHYpKSAhPSAwOworICAgIHJldHVybiBBQlMoUHlfU0laRSh2KSkgIT0gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGxvbmdfcnNoaWZ0KFB5TG9uZ09iamVjdCAqdiwgUHlMb25nT2JqZWN0ICp3KQogewotCVB5TG9uZ09iamVjdCAqYSwgKmI7Ci0JUHlMb25nT2JqZWN0ICp6ID0gTlVMTDsKLQlsb25nIHNoaWZ0Ynk7Ci0JUHlfc3NpemVfdCBuZXdzaXplLCB3b3Jkc2hpZnQsIGxvc2hpZnQsIGhpc2hpZnQsIGksIGo7Ci0JZGlnaXQgbG9tYXNrLCBoaW1hc2s7CisgICAgUHlMb25nT2JqZWN0ICphLCAqYjsKKyAgICBQeUxvbmdPYmplY3QgKnogPSBOVUxMOworICAgIGxvbmcgc2hpZnRieTsKKyAgICBQeV9zc2l6ZV90IG5ld3NpemUsIHdvcmRzaGlmdCwgbG9zaGlmdCwgaGlzaGlmdCwgaSwgajsKKyAgICBkaWdpdCBsb21hc2ssIGhpbWFzazsKIAotCUNPTlZFUlRfQklOT1AoKFB5T2JqZWN0ICopdiwgKFB5T2JqZWN0ICopdywgJmEsICZiKTsKKyAgICBDT05WRVJUX0JJTk9QKChQeU9iamVjdCAqKXYsIChQeU9iamVjdCAqKXcsICZhLCAmYik7CiAKLQlpZiAoUHlfU0laRShhKSA8IDApIHsKLQkJLyogUmlnaHQgc2hpZnRpbmcgbmVnYXRpdmUgbnVtYmVycyBpcyBoYXJkZXIgKi8KLQkJUHlMb25nT2JqZWN0ICphMSwgKmEyOwotCQlhMSA9IChQeUxvbmdPYmplY3QgKikgbG9uZ19pbnZlcnQoYSk7Ci0JCWlmIChhMSA9PSBOVUxMKQotCQkJZ290byByc2hpZnRfZXJyb3I7Ci0JCWEyID0gKFB5TG9uZ09iamVjdCAqKSBsb25nX3JzaGlmdChhMSwgYik7Ci0JCVB5X0RFQ1JFRihhMSk7Ci0JCWlmIChhMiA9PSBOVUxMKQotCQkJZ290byByc2hpZnRfZXJyb3I7Ci0JCXogPSAoUHlMb25nT2JqZWN0ICopIGxvbmdfaW52ZXJ0KGEyKTsKLQkJUHlfREVDUkVGKGEyKTsKLQl9Ci0JZWxzZSB7CisgICAgaWYgKFB5X1NJWkUoYSkgPCAwKSB7CisgICAgICAgIC8qIFJpZ2h0IHNoaWZ0aW5nIG5lZ2F0aXZlIG51bWJlcnMgaXMgaGFyZGVyICovCisgICAgICAgIFB5TG9uZ09iamVjdCAqYTEsICphMjsKKyAgICAgICAgYTEgPSAoUHlMb25nT2JqZWN0ICopIGxvbmdfaW52ZXJ0KGEpOworICAgICAgICBpZiAoYTEgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gcnNoaWZ0X2Vycm9yOworICAgICAgICBhMiA9IChQeUxvbmdPYmplY3QgKikgbG9uZ19yc2hpZnQoYTEsIGIpOworICAgICAgICBQeV9ERUNSRUYoYTEpOworICAgICAgICBpZiAoYTIgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gcnNoaWZ0X2Vycm9yOworICAgICAgICB6ID0gKFB5TG9uZ09iamVjdCAqKSBsb25nX2ludmVydChhMik7CisgICAgICAgIFB5X0RFQ1JFRihhMik7CisgICAgfQorICAgIGVsc2UgewogCi0JCXNoaWZ0YnkgPSBQeUxvbmdfQXNMb25nKChQeU9iamVjdCAqKWIpOwotCQlpZiAoc2hpZnRieSA9PSAtMUwgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJCWdvdG8gcnNoaWZ0X2Vycm9yOwotCQlpZiAoc2hpZnRieSA8IDApIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCQkibmVnYXRpdmUgc2hpZnQgY291bnQiKTsKLQkJCWdvdG8gcnNoaWZ0X2Vycm9yOwotCQl9Ci0JCXdvcmRzaGlmdCA9IHNoaWZ0YnkgLyBQeUxvbmdfU0hJRlQ7Ci0JCW5ld3NpemUgPSBBQlMoUHlfU0laRShhKSkgLSB3b3Jkc2hpZnQ7Ci0JCWlmIChuZXdzaXplIDw9IDApIHsKLQkJCXogPSBfUHlMb25nX05ldygwKTsKLQkJCVB5X0RFQ1JFRihhKTsKLQkJCVB5X0RFQ1JFRihiKTsKLQkJCXJldHVybiAoUHlPYmplY3QgKil6OwotCQl9Ci0JCWxvc2hpZnQgPSBzaGlmdGJ5ICUgUHlMb25nX1NISUZUOwotCQloaXNoaWZ0ID0gUHlMb25nX1NISUZUIC0gbG9zaGlmdDsKLQkJbG9tYXNrID0gKChkaWdpdCkxIDw8IGhpc2hpZnQpIC0gMTsKLQkJaGltYXNrID0gUHlMb25nX01BU0sgXiBsb21hc2s7Ci0JCXogPSBfUHlMb25nX05ldyhuZXdzaXplKTsKLQkJaWYgKHogPT0gTlVMTCkKLQkJCWdvdG8gcnNoaWZ0X2Vycm9yOwotCQlpZiAoUHlfU0laRShhKSA8IDApCi0JCQlQeV9TSVpFKHopID0gLShQeV9TSVpFKHopKTsKLQkJZm9yIChpID0gMCwgaiA9IHdvcmRzaGlmdDsgaSA8IG5ld3NpemU7IGkrKywgaisrKSB7Ci0JCQl6LT5vYl9kaWdpdFtpXSA9IChhLT5vYl9kaWdpdFtqXSA+PiBsb3NoaWZ0KSAmIGxvbWFzazsKLQkJCWlmIChpKzEgPCBuZXdzaXplKQotCQkJCXotPm9iX2RpZ2l0W2ldIHw9Ci0JCQkJICAoYS0+b2JfZGlnaXRbaisxXSA8PCBoaXNoaWZ0KSAmIGhpbWFzazsKLQkJfQotCQl6ID0gbG9uZ19ub3JtYWxpemUoeik7Ci0JfQorICAgICAgICBzaGlmdGJ5ID0gUHlMb25nX0FzTG9uZygoUHlPYmplY3QgKiliKTsKKyAgICAgICAgaWYgKHNoaWZ0YnkgPT0gLTFMICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICBnb3RvIHJzaGlmdF9lcnJvcjsKKyAgICAgICAgaWYgKHNoaWZ0YnkgPCAwKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmVnYXRpdmUgc2hpZnQgY291bnQiKTsKKyAgICAgICAgICAgIGdvdG8gcnNoaWZ0X2Vycm9yOworICAgICAgICB9CisgICAgICAgIHdvcmRzaGlmdCA9IHNoaWZ0YnkgLyBQeUxvbmdfU0hJRlQ7CisgICAgICAgIG5ld3NpemUgPSBBQlMoUHlfU0laRShhKSkgLSB3b3Jkc2hpZnQ7CisgICAgICAgIGlmIChuZXdzaXplIDw9IDApIHsKKyAgICAgICAgICAgIHogPSBfUHlMb25nX05ldygwKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihhKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihiKTsKKyAgICAgICAgICAgIHJldHVybiAoUHlPYmplY3QgKil6OworICAgICAgICB9CisgICAgICAgIGxvc2hpZnQgPSBzaGlmdGJ5ICUgUHlMb25nX1NISUZUOworICAgICAgICBoaXNoaWZ0ID0gUHlMb25nX1NISUZUIC0gbG9zaGlmdDsKKyAgICAgICAgbG9tYXNrID0gKChkaWdpdCkxIDw8IGhpc2hpZnQpIC0gMTsKKyAgICAgICAgaGltYXNrID0gUHlMb25nX01BU0sgXiBsb21hc2s7CisgICAgICAgIHogPSBfUHlMb25nX05ldyhuZXdzaXplKTsKKyAgICAgICAgaWYgKHogPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gcnNoaWZ0X2Vycm9yOworICAgICAgICBpZiAoUHlfU0laRShhKSA8IDApCisgICAgICAgICAgICBQeV9TSVpFKHopID0gLShQeV9TSVpFKHopKTsKKyAgICAgICAgZm9yIChpID0gMCwgaiA9IHdvcmRzaGlmdDsgaSA8IG5ld3NpemU7IGkrKywgaisrKSB7CisgICAgICAgICAgICB6LT5vYl9kaWdpdFtpXSA9IChhLT5vYl9kaWdpdFtqXSA+PiBsb3NoaWZ0KSAmIGxvbWFzazsKKyAgICAgICAgICAgIGlmIChpKzEgPCBuZXdzaXplKQorICAgICAgICAgICAgICAgIHotPm9iX2RpZ2l0W2ldIHw9CisgICAgICAgICAgICAgICAgICAoYS0+b2JfZGlnaXRbaisxXSA8PCBoaXNoaWZ0KSAmIGhpbWFzazsKKyAgICAgICAgfQorICAgICAgICB6ID0gbG9uZ19ub3JtYWxpemUoeik7CisgICAgfQogcnNoaWZ0X2Vycm9yOgotCVB5X0RFQ1JFRihhKTsKLQlQeV9ERUNSRUYoYik7Ci0JcmV0dXJuIChQeU9iamVjdCAqKSB6OworICAgIFB5X0RFQ1JFRihhKTsKKyAgICBQeV9ERUNSRUYoYik7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKSB6OwogCiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBsb25nX2xzaGlmdChQeU9iamVjdCAqdiwgUHlPYmplY3QgKncpCiB7Ci0JLyogVGhpcyB2ZXJzaW9uIGR1ZSB0byBUaW0gUGV0ZXJzICovCi0JUHlMb25nT2JqZWN0ICphLCAqYjsKLQlQeUxvbmdPYmplY3QgKnogPSBOVUxMOwotCWxvbmcgc2hpZnRieTsKLQlQeV9zc2l6ZV90IG9sZHNpemUsIG5ld3NpemUsIHdvcmRzaGlmdCwgcmVtc2hpZnQsIGksIGo7Ci0JdHdvZGlnaXRzIGFjY3VtOworICAgIC8qIFRoaXMgdmVyc2lvbiBkdWUgdG8gVGltIFBldGVycyAqLworICAgIFB5TG9uZ09iamVjdCAqYSwgKmI7CisgICAgUHlMb25nT2JqZWN0ICp6ID0gTlVMTDsKKyAgICBsb25nIHNoaWZ0Ynk7CisgICAgUHlfc3NpemVfdCBvbGRzaXplLCBuZXdzaXplLCB3b3Jkc2hpZnQsIHJlbXNoaWZ0LCBpLCBqOworICAgIHR3b2RpZ2l0cyBhY2N1bTsKIAotCUNPTlZFUlRfQklOT1AodiwgdywgJmEsICZiKTsKKyAgICBDT05WRVJUX0JJTk9QKHYsIHcsICZhLCAmYik7CiAKLQlzaGlmdGJ5ID0gUHlMb25nX0FzTG9uZygoUHlPYmplY3QgKiliKTsKLQlpZiAoc2hpZnRieSA9PSAtMUwgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJZ290byBsc2hpZnRfZXJyb3I7Ci0JaWYgKHNoaWZ0YnkgPCAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAibmVnYXRpdmUgc2hpZnQgY291bnQiKTsKLQkJZ290byBsc2hpZnRfZXJyb3I7Ci0JfQotCWlmICgobG9uZykoaW50KXNoaWZ0YnkgIT0gc2hpZnRieSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkib3V0cmFnZW91cyBsZWZ0IHNoaWZ0IGNvdW50Iik7Ci0JCWdvdG8gbHNoaWZ0X2Vycm9yOwotCX0KLQkvKiB3b3Jkc2hpZnQsIHJlbXNoaWZ0ID0gZGl2bW9kKHNoaWZ0YnksIFB5TG9uZ19TSElGVCkgKi8KLQl3b3Jkc2hpZnQgPSAoaW50KXNoaWZ0YnkgLyBQeUxvbmdfU0hJRlQ7Ci0JcmVtc2hpZnQgID0gKGludClzaGlmdGJ5IC0gd29yZHNoaWZ0ICogUHlMb25nX1NISUZUOworICAgIHNoaWZ0YnkgPSBQeUxvbmdfQXNMb25nKChQeU9iamVjdCAqKWIpOworICAgIGlmIChzaGlmdGJ5ID09IC0xTCAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICBnb3RvIGxzaGlmdF9lcnJvcjsKKyAgICBpZiAoc2hpZnRieSA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJuZWdhdGl2ZSBzaGlmdCBjb3VudCIpOworICAgICAgICBnb3RvIGxzaGlmdF9lcnJvcjsKKyAgICB9CisgICAgaWYgKChsb25nKShpbnQpc2hpZnRieSAhPSBzaGlmdGJ5KSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIm91dHJhZ2VvdXMgbGVmdCBzaGlmdCBjb3VudCIpOworICAgICAgICBnb3RvIGxzaGlmdF9lcnJvcjsKKyAgICB9CisgICAgLyogd29yZHNoaWZ0LCByZW1zaGlmdCA9IGRpdm1vZChzaGlmdGJ5LCBQeUxvbmdfU0hJRlQpICovCisgICAgd29yZHNoaWZ0ID0gKGludClzaGlmdGJ5IC8gUHlMb25nX1NISUZUOworICAgIHJlbXNoaWZ0ICA9IChpbnQpc2hpZnRieSAtIHdvcmRzaGlmdCAqIFB5TG9uZ19TSElGVDsKIAotCW9sZHNpemUgPSBBQlMoYS0+b2Jfc2l6ZSk7Ci0JbmV3c2l6ZSA9IG9sZHNpemUgKyB3b3Jkc2hpZnQ7Ci0JaWYgKHJlbXNoaWZ0KQotCQkrK25ld3NpemU7Ci0JeiA9IF9QeUxvbmdfTmV3KG5ld3NpemUpOwotCWlmICh6ID09IE5VTEwpCi0JCWdvdG8gbHNoaWZ0X2Vycm9yOwotCWlmIChhLT5vYl9zaXplIDwgMCkKLQkJei0+b2Jfc2l6ZSA9IC0oei0+b2Jfc2l6ZSk7Ci0JZm9yIChpID0gMDsgaSA8IHdvcmRzaGlmdDsgaSsrKQotCQl6LT5vYl9kaWdpdFtpXSA9IDA7Ci0JYWNjdW0gPSAwOwotCWZvciAoaSA9IHdvcmRzaGlmdCwgaiA9IDA7IGogPCBvbGRzaXplOyBpKyssIGorKykgewotCQlhY2N1bSB8PSAodHdvZGlnaXRzKWEtPm9iX2RpZ2l0W2pdIDw8IHJlbXNoaWZ0OwotCQl6LT5vYl9kaWdpdFtpXSA9IChkaWdpdCkoYWNjdW0gJiBQeUxvbmdfTUFTSyk7Ci0JCWFjY3VtID4+PSBQeUxvbmdfU0hJRlQ7Ci0JfQotCWlmIChyZW1zaGlmdCkKLQkJei0+b2JfZGlnaXRbbmV3c2l6ZS0xXSA9IChkaWdpdClhY2N1bTsKLQllbHNlCi0JCWFzc2VydCghYWNjdW0pOwotCXogPSBsb25nX25vcm1hbGl6ZSh6KTsKKyAgICBvbGRzaXplID0gQUJTKGEtPm9iX3NpemUpOworICAgIG5ld3NpemUgPSBvbGRzaXplICsgd29yZHNoaWZ0OworICAgIGlmIChyZW1zaGlmdCkKKyAgICAgICAgKytuZXdzaXplOworICAgIHogPSBfUHlMb25nX05ldyhuZXdzaXplKTsKKyAgICBpZiAoeiA9PSBOVUxMKQorICAgICAgICBnb3RvIGxzaGlmdF9lcnJvcjsKKyAgICBpZiAoYS0+b2Jfc2l6ZSA8IDApCisgICAgICAgIHotPm9iX3NpemUgPSAtKHotPm9iX3NpemUpOworICAgIGZvciAoaSA9IDA7IGkgPCB3b3Jkc2hpZnQ7IGkrKykKKyAgICAgICAgei0+b2JfZGlnaXRbaV0gPSAwOworICAgIGFjY3VtID0gMDsKKyAgICBmb3IgKGkgPSB3b3Jkc2hpZnQsIGogPSAwOyBqIDwgb2xkc2l6ZTsgaSsrLCBqKyspIHsKKyAgICAgICAgYWNjdW0gfD0gKHR3b2RpZ2l0cylhLT5vYl9kaWdpdFtqXSA8PCByZW1zaGlmdDsKKyAgICAgICAgei0+b2JfZGlnaXRbaV0gPSAoZGlnaXQpKGFjY3VtICYgUHlMb25nX01BU0spOworICAgICAgICBhY2N1bSA+Pj0gUHlMb25nX1NISUZUOworICAgIH0KKyAgICBpZiAocmVtc2hpZnQpCisgICAgICAgIHotPm9iX2RpZ2l0W25ld3NpemUtMV0gPSAoZGlnaXQpYWNjdW07CisgICAgZWxzZQorICAgICAgICBhc3NlcnQoIWFjY3VtKTsKKyAgICB6ID0gbG9uZ19ub3JtYWxpemUoeik7CiBsc2hpZnRfZXJyb3I6Ci0JUHlfREVDUkVGKGEpOwotCVB5X0RFQ1JFRihiKTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopIHo7CisgICAgUHlfREVDUkVGKGEpOworICAgIFB5X0RFQ1JFRihiKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopIHo7CiB9CiAKIApAQCAtMzEwNCwyMTUgKzMxMDQsMjE1IEBACiAKIHN0YXRpYyBQeU9iamVjdCAqCiBsb25nX2JpdHdpc2UoUHlMb25nT2JqZWN0ICphLAotCSAgICAgaW50IG9wLCAgLyogJyYnLCAnfCcsICdeJyAqLwotCSAgICAgUHlMb25nT2JqZWN0ICpiKQorICAgICAgICAgICAgIGludCBvcCwgIC8qICcmJywgJ3wnLCAnXicgKi8KKyAgICAgICAgIFB5TG9uZ09iamVjdCAqYikKIHsKLQlkaWdpdCBtYXNrYSwgbWFza2I7IC8qIDAgb3IgUHlMb25nX01BU0sgKi8KLQlpbnQgbmVnejsKLQlQeV9zc2l6ZV90IHNpemVfYSwgc2l6ZV9iLCBzaXplX3o7Ci0JUHlMb25nT2JqZWN0ICp6OwotCWludCBpOwotCWRpZ2l0IGRpZ2EsIGRpZ2I7Ci0JUHlPYmplY3QgKnY7CisgICAgZGlnaXQgbWFza2EsIG1hc2tiOyAvKiAwIG9yIFB5TG9uZ19NQVNLICovCisgICAgaW50IG5lZ3o7CisgICAgUHlfc3NpemVfdCBzaXplX2EsIHNpemVfYiwgc2l6ZV96OworICAgIFB5TG9uZ09iamVjdCAqejsKKyAgICBpbnQgaTsKKyAgICBkaWdpdCBkaWdhLCBkaWdiOworICAgIFB5T2JqZWN0ICp2OwogCi0JaWYgKFB5X1NJWkUoYSkgPCAwKSB7Ci0JCWEgPSAoUHlMb25nT2JqZWN0ICopIGxvbmdfaW52ZXJ0KGEpOwotCQlpZiAoYSA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCW1hc2thID0gUHlMb25nX01BU0s7Ci0JfQotCWVsc2UgewotCQlQeV9JTkNSRUYoYSk7Ci0JCW1hc2thID0gMDsKLQl9Ci0JaWYgKFB5X1NJWkUoYikgPCAwKSB7Ci0JCWIgPSAoUHlMb25nT2JqZWN0ICopIGxvbmdfaW52ZXJ0KGIpOwotCQlpZiAoYiA9PSBOVUxMKSB7Ci0JCQlQeV9ERUNSRUYoYSk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQltYXNrYiA9IFB5TG9uZ19NQVNLOwotCX0KLQllbHNlIHsKLQkJUHlfSU5DUkVGKGIpOwotCQltYXNrYiA9IDA7Ci0JfQorICAgIGlmIChQeV9TSVpFKGEpIDwgMCkgeworICAgICAgICBhID0gKFB5TG9uZ09iamVjdCAqKSBsb25nX2ludmVydChhKTsKKyAgICAgICAgaWYgKGEgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBtYXNrYSA9IFB5TG9uZ19NQVNLOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgUHlfSU5DUkVGKGEpOworICAgICAgICBtYXNrYSA9IDA7CisgICAgfQorICAgIGlmIChQeV9TSVpFKGIpIDwgMCkgeworICAgICAgICBiID0gKFB5TG9uZ09iamVjdCAqKSBsb25nX2ludmVydChiKTsKKyAgICAgICAgaWYgKGIgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKGEpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgbWFza2IgPSBQeUxvbmdfTUFTSzsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5X0lOQ1JFRihiKTsKKyAgICAgICAgbWFza2IgPSAwOworICAgIH0KIAotCW5lZ3ogPSAwOwotCXN3aXRjaCAob3ApIHsKLQljYXNlICdeJzoKLQkJaWYgKG1hc2thICE9IG1hc2tiKSB7Ci0JCQltYXNrYSBePSBQeUxvbmdfTUFTSzsKLQkJCW5lZ3ogPSAtMTsKLQkJfQotCQlicmVhazsKLQljYXNlICcmJzoKLQkJaWYgKG1hc2thICYmIG1hc2tiKSB7Ci0JCQlvcCA9ICd8JzsKLQkJCW1hc2thIF49IFB5TG9uZ19NQVNLOwotCQkJbWFza2IgXj0gUHlMb25nX01BU0s7Ci0JCQluZWd6ID0gLTE7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSAnfCc6Ci0JCWlmIChtYXNrYSB8fCBtYXNrYikgewotCQkJb3AgPSAnJic7Ci0JCQltYXNrYSBePSBQeUxvbmdfTUFTSzsKLQkJCW1hc2tiIF49IFB5TG9uZ19NQVNLOwotCQkJbmVneiA9IC0xOwotCQl9Ci0JCWJyZWFrOwotCX0KKyAgICBuZWd6ID0gMDsKKyAgICBzd2l0Y2ggKG9wKSB7CisgICAgY2FzZSAnXic6CisgICAgICAgIGlmIChtYXNrYSAhPSBtYXNrYikgeworICAgICAgICAgICAgbWFza2EgXj0gUHlMb25nX01BU0s7CisgICAgICAgICAgICBuZWd6ID0gLTE7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnJic6CisgICAgICAgIGlmIChtYXNrYSAmJiBtYXNrYikgeworICAgICAgICAgICAgb3AgPSAnfCc7CisgICAgICAgICAgICBtYXNrYSBePSBQeUxvbmdfTUFTSzsKKyAgICAgICAgICAgIG1hc2tiIF49IFB5TG9uZ19NQVNLOworICAgICAgICAgICAgbmVneiA9IC0xOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJ3wnOgorICAgICAgICBpZiAobWFza2EgfHwgbWFza2IpIHsKKyAgICAgICAgICAgIG9wID0gJyYnOworICAgICAgICAgICAgbWFza2EgXj0gUHlMb25nX01BU0s7CisgICAgICAgICAgICBtYXNrYiBePSBQeUxvbmdfTUFTSzsKKyAgICAgICAgICAgIG5lZ3ogPSAtMTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CiAKLQkvKiBKUkg6IFRoZSBvcmlnaW5hbCBsb2dpYyBoZXJlIHdhcyB0byBhbGxvY2F0ZSB0aGUgcmVzdWx0IHZhbHVlICh6KQotCSAgIGFzIHRoZSBsb25nZXIgb2YgdGhlIHR3byBvcGVyYW5kcy4gIEhvd2V2ZXIsIHRoZXJlIGFyZSBzb21lIGNhc2VzCi0JICAgd2hlcmUgdGhlIHJlc3VsdCBpcyBndWFyYW50ZWVkIHRvIGJlIHNob3J0ZXIgdGhhbiB0aGF0OiBBTkQgb2YgdHdvCi0JICAgcG9zaXRpdmVzLCBPUiBvZiB0d28gbmVnYXRpdmVzOiB1c2UgdGhlIHNob3J0ZXIgbnVtYmVyLiAgQU5EIHdpdGgKLQkgICBtaXhlZCBzaWduczogdXNlIHRoZSBwb3NpdGl2ZSBudW1iZXIuICBPUiB3aXRoIG1peGVkIHNpZ25zOiB1c2UgdGhlCi0JICAgbmVnYXRpdmUgbnVtYmVyLiAgQWZ0ZXIgdGhlIHRyYW5zZm9ybWF0aW9ucyBhYm92ZSwgb3Agd2lsbCBiZSAnJicKLQkgICBpZmYgb25lIG9mIHRoZXNlIGNhc2VzIGFwcGxpZXMsIGFuZCBtYXNrIHdpbGwgYmUgbm9uLTAgZm9yIG9wZXJhbmRzCi0JICAgd2hvc2UgbGVuZ3RoIHNob3VsZCBiZSBpZ25vcmVkLgotCSovCisgICAgLyogSlJIOiBUaGUgb3JpZ2luYWwgbG9naWMgaGVyZSB3YXMgdG8gYWxsb2NhdGUgdGhlIHJlc3VsdCB2YWx1ZSAoeikKKyAgICAgICBhcyB0aGUgbG9uZ2VyIG9mIHRoZSB0d28gb3BlcmFuZHMuICBIb3dldmVyLCB0aGVyZSBhcmUgc29tZSBjYXNlcworICAgICAgIHdoZXJlIHRoZSByZXN1bHQgaXMgZ3VhcmFudGVlZCB0byBiZSBzaG9ydGVyIHRoYW4gdGhhdDogQU5EIG9mIHR3bworICAgICAgIHBvc2l0aXZlcywgT1Igb2YgdHdvIG5lZ2F0aXZlczogdXNlIHRoZSBzaG9ydGVyIG51bWJlci4gIEFORCB3aXRoCisgICAgICAgbWl4ZWQgc2lnbnM6IHVzZSB0aGUgcG9zaXRpdmUgbnVtYmVyLiAgT1Igd2l0aCBtaXhlZCBzaWduczogdXNlIHRoZQorICAgICAgIG5lZ2F0aXZlIG51bWJlci4gIEFmdGVyIHRoZSB0cmFuc2Zvcm1hdGlvbnMgYWJvdmUsIG9wIHdpbGwgYmUgJyYnCisgICAgICAgaWZmIG9uZSBvZiB0aGVzZSBjYXNlcyBhcHBsaWVzLCBhbmQgbWFzayB3aWxsIGJlIG5vbi0wIGZvciBvcGVyYW5kcworICAgICAgIHdob3NlIGxlbmd0aCBzaG91bGQgYmUgaWdub3JlZC4KKyAgICAqLwogCi0Jc2l6ZV9hID0gUHlfU0laRShhKTsKLQlzaXplX2IgPSBQeV9TSVpFKGIpOwotCXNpemVfeiA9IG9wID09ICcmJwotCQk/IChtYXNrYQotCQkgICA/IHNpemVfYgotCQkgICA6IChtYXNrYiA/IHNpemVfYSA6IE1JTihzaXplX2EsIHNpemVfYikpKQotCQk6IE1BWChzaXplX2EsIHNpemVfYik7Ci0JeiA9IF9QeUxvbmdfTmV3KHNpemVfeik7Ci0JaWYgKHogPT0gTlVMTCkgewotCQlQeV9ERUNSRUYoYSk7Ci0JCVB5X0RFQ1JFRihiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIHNpemVfYSA9IFB5X1NJWkUoYSk7CisgICAgc2l6ZV9iID0gUHlfU0laRShiKTsKKyAgICBzaXplX3ogPSBvcCA9PSAnJicKKyAgICAgICAgPyAobWFza2EKKyAgICAgICAgICAgPyBzaXplX2IKKyAgICAgICAgICAgOiAobWFza2IgPyBzaXplX2EgOiBNSU4oc2l6ZV9hLCBzaXplX2IpKSkKKyAgICAgICAgOiBNQVgoc2l6ZV9hLCBzaXplX2IpOworICAgIHogPSBfUHlMb25nX05ldyhzaXplX3opOworICAgIGlmICh6ID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKGEpOworICAgICAgICBQeV9ERUNSRUYoYik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWZvciAoaSA9IDA7IGkgPCBzaXplX3o7ICsraSkgewotCQlkaWdhID0gKGkgPCBzaXplX2EgPyBhLT5vYl9kaWdpdFtpXSA6IDApIF4gbWFza2E7Ci0JCWRpZ2IgPSAoaSA8IHNpemVfYiA/IGItPm9iX2RpZ2l0W2ldIDogMCkgXiBtYXNrYjsKLQkJc3dpdGNoIChvcCkgewotCQljYXNlICcmJzogei0+b2JfZGlnaXRbaV0gPSBkaWdhICYgZGlnYjsgYnJlYWs7Ci0JCWNhc2UgJ3wnOiB6LT5vYl9kaWdpdFtpXSA9IGRpZ2EgfCBkaWdiOyBicmVhazsKLQkJY2FzZSAnXic6IHotPm9iX2RpZ2l0W2ldID0gZGlnYSBeIGRpZ2I7IGJyZWFrOwotCQl9Ci0JfQorICAgIGZvciAoaSA9IDA7IGkgPCBzaXplX3o7ICsraSkgeworICAgICAgICBkaWdhID0gKGkgPCBzaXplX2EgPyBhLT5vYl9kaWdpdFtpXSA6IDApIF4gbWFza2E7CisgICAgICAgIGRpZ2IgPSAoaSA8IHNpemVfYiA/IGItPm9iX2RpZ2l0W2ldIDogMCkgXiBtYXNrYjsKKyAgICAgICAgc3dpdGNoIChvcCkgeworICAgICAgICBjYXNlICcmJzogei0+b2JfZGlnaXRbaV0gPSBkaWdhICYgZGlnYjsgYnJlYWs7CisgICAgICAgIGNhc2UgJ3wnOiB6LT5vYl9kaWdpdFtpXSA9IGRpZ2EgfCBkaWdiOyBicmVhazsKKyAgICAgICAgY2FzZSAnXic6IHotPm9iX2RpZ2l0W2ldID0gZGlnYSBeIGRpZ2I7IGJyZWFrOworICAgICAgICB9CisgICAgfQogCi0JUHlfREVDUkVGKGEpOwotCVB5X0RFQ1JFRihiKTsKLQl6ID0gbG9uZ19ub3JtYWxpemUoeik7Ci0JaWYgKG5lZ3ogPT0gMCkKLQkJcmV0dXJuIChQeU9iamVjdCAqKSB6OwotCXYgPSBsb25nX2ludmVydCh6KTsKLQlQeV9ERUNSRUYoeik7Ci0JcmV0dXJuIHY7CisgICAgUHlfREVDUkVGKGEpOworICAgIFB5X0RFQ1JFRihiKTsKKyAgICB6ID0gbG9uZ19ub3JtYWxpemUoeik7CisgICAgaWYgKG5lZ3ogPT0gMCkKKyAgICAgICAgcmV0dXJuIChQeU9iamVjdCAqKSB6OworICAgIHYgPSBsb25nX2ludmVydCh6KTsKKyAgICBQeV9ERUNSRUYoeik7CisgICAgcmV0dXJuIHY7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBsb25nX2FuZChQeU9iamVjdCAqdiwgUHlPYmplY3QgKncpCiB7Ci0JUHlMb25nT2JqZWN0ICphLCAqYjsKLQlQeU9iamVjdCAqYzsKLQlDT05WRVJUX0JJTk9QKHYsIHcsICZhLCAmYik7Ci0JYyA9IGxvbmdfYml0d2lzZShhLCAnJicsIGIpOwotCVB5X0RFQ1JFRihhKTsKLQlQeV9ERUNSRUYoYik7Ci0JcmV0dXJuIGM7CisgICAgUHlMb25nT2JqZWN0ICphLCAqYjsKKyAgICBQeU9iamVjdCAqYzsKKyAgICBDT05WRVJUX0JJTk9QKHYsIHcsICZhLCAmYik7CisgICAgYyA9IGxvbmdfYml0d2lzZShhLCAnJicsIGIpOworICAgIFB5X0RFQ1JFRihhKTsKKyAgICBQeV9ERUNSRUYoYik7CisgICAgcmV0dXJuIGM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBsb25nX3hvcihQeU9iamVjdCAqdiwgUHlPYmplY3QgKncpCiB7Ci0JUHlMb25nT2JqZWN0ICphLCAqYjsKLQlQeU9iamVjdCAqYzsKLQlDT05WRVJUX0JJTk9QKHYsIHcsICZhLCAmYik7Ci0JYyA9IGxvbmdfYml0d2lzZShhLCAnXicsIGIpOwotCVB5X0RFQ1JFRihhKTsKLQlQeV9ERUNSRUYoYik7Ci0JcmV0dXJuIGM7CisgICAgUHlMb25nT2JqZWN0ICphLCAqYjsKKyAgICBQeU9iamVjdCAqYzsKKyAgICBDT05WRVJUX0JJTk9QKHYsIHcsICZhLCAmYik7CisgICAgYyA9IGxvbmdfYml0d2lzZShhLCAnXicsIGIpOworICAgIFB5X0RFQ1JFRihhKTsKKyAgICBQeV9ERUNSRUYoYik7CisgICAgcmV0dXJuIGM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBsb25nX29yKFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdykKIHsKLQlQeUxvbmdPYmplY3QgKmEsICpiOwotCVB5T2JqZWN0ICpjOwotCUNPTlZFUlRfQklOT1AodiwgdywgJmEsICZiKTsKLQljID0gbG9uZ19iaXR3aXNlKGEsICd8JywgYik7Ci0JUHlfREVDUkVGKGEpOwotCVB5X0RFQ1JFRihiKTsKLQlyZXR1cm4gYzsKKyAgICBQeUxvbmdPYmplY3QgKmEsICpiOworICAgIFB5T2JqZWN0ICpjOworICAgIENPTlZFUlRfQklOT1AodiwgdywgJmEsICZiKTsKKyAgICBjID0gbG9uZ19iaXR3aXNlKGEsICd8JywgYik7CisgICAgUHlfREVDUkVGKGEpOworICAgIFB5X0RFQ1JFRihiKTsKKyAgICByZXR1cm4gYzsKIH0KIAogc3RhdGljIGludAogbG9uZ19jb2VyY2UoUHlPYmplY3QgKipwdiwgUHlPYmplY3QgKipwdykKIHsKLQlpZiAoUHlJbnRfQ2hlY2soKnB3KSkgewotCQkqcHcgPSBQeUxvbmdfRnJvbUxvbmcoUHlJbnRfQVNfTE9ORygqcHcpKTsKLQkJaWYgKCpwdyA9PSBOVUxMKQotCQkJcmV0dXJuIC0xOwotCQlQeV9JTkNSRUYoKnB2KTsKLQkJcmV0dXJuIDA7Ci0JfQotCWVsc2UgaWYgKFB5TG9uZ19DaGVjaygqcHcpKSB7Ci0JCVB5X0lOQ1JFRigqcHYpOwotCQlQeV9JTkNSRUYoKnB3KTsKLQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiAxOyAvKiBDYW4ndCBkbyBpdCAqLworICAgIGlmIChQeUludF9DaGVjaygqcHcpKSB7CisgICAgICAgICpwdyA9IFB5TG9uZ19Gcm9tTG9uZyhQeUludF9BU19MT05HKCpwdykpOworICAgICAgICBpZiAoKnB3ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIFB5X0lOQ1JFRigqcHYpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZWxzZSBpZiAoUHlMb25nX0NoZWNrKCpwdykpIHsKKyAgICAgICAgUHlfSU5DUkVGKCpwdik7CisgICAgICAgIFB5X0lOQ1JFRigqcHcpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIDE7IC8qIENhbid0IGRvIGl0ICovCiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBsb25nX2xvbmcoUHlPYmplY3QgKnYpCiB7Ci0JaWYgKFB5TG9uZ19DaGVja0V4YWN0KHYpKQotCQlQeV9JTkNSRUYodik7Ci0JZWxzZQotCQl2ID0gX1B5TG9uZ19Db3B5KChQeUxvbmdPYmplY3QgKil2KTsKLQlyZXR1cm4gdjsKKyAgICBpZiAoUHlMb25nX0NoZWNrRXhhY3QodikpCisgICAgICAgIFB5X0lOQ1JFRih2KTsKKyAgICBlbHNlCisgICAgICAgIHYgPSBfUHlMb25nX0NvcHkoKFB5TG9uZ09iamVjdCAqKXYpOworICAgIHJldHVybiB2OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbG9uZ19pbnQoUHlPYmplY3QgKnYpCiB7Ci0JbG9uZyB4OwotCXggPSBQeUxvbmdfQXNMb25nKHYpOwotCWlmIChQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCWlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX092ZXJmbG93RXJyb3IpKSB7Ci0JCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCQlpZiAoUHlMb25nX0NoZWNrRXhhY3QodikpIHsKLQkJCQkJUHlfSU5DUkVGKHYpOwotCQkJCQlyZXR1cm4gdjsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCQlyZXR1cm4gX1B5TG9uZ19Db3B5KChQeUxvbmdPYmplY3QgKil2KTsKLQkJfQotCQllbHNlCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKHgpOworICAgIGxvbmcgeDsKKyAgICB4ID0gUHlMb25nX0FzTG9uZyh2KTsKKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19PdmVyZmxvd0Vycm9yKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChQeUxvbmdfQ2hlY2tFeGFjdCh2KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9JTkNSRUYodik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX1B5TG9uZ19Db3B5KChQeUxvbmdPYmplY3QgKil2KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHgpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbG9uZ19mbG9hdChQeU9iamVjdCAqdikKIHsKLQlkb3VibGUgcmVzdWx0OwotCXJlc3VsdCA9IFB5TG9uZ19Bc0RvdWJsZSh2KTsKLQlpZiAocmVzdWx0ID09IC0xLjAgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShyZXN1bHQpOworICAgIGRvdWJsZSByZXN1bHQ7CisgICAgcmVzdWx0ID0gUHlMb25nX0FzRG91YmxlKHYpOworICAgIGlmIChyZXN1bHQgPT0gLTEuMCAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKHJlc3VsdCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBsb25nX29jdChQeU9iamVjdCAqdikKIHsKLQlyZXR1cm4gX1B5TG9uZ19Gb3JtYXQodiwgOCwgMSwgMCk7CisgICAgcmV0dXJuIF9QeUxvbmdfRm9ybWF0KHYsIDgsIDEsIDApOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbG9uZ19oZXgoUHlPYmplY3QgKnYpCiB7Ci0JcmV0dXJuIF9QeUxvbmdfRm9ybWF0KHYsIDE2LCAxLCAwKTsKKyAgICByZXR1cm4gX1B5TG9uZ19Gb3JtYXQodiwgMTYsIDEsIDApOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgpAQCAtMzMyMSw0OSArMzMyMSw0OSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGxvbmdfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCVB5T2JqZWN0ICp4ID0gTlVMTDsKLQlpbnQgYmFzZSA9IC05MDk7CQkgICAgIC8qIHVubGlrZWx5ISAqLwotCXN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsieCIsICJiYXNlIiwgMH07CisgICAgUHlPYmplY3QgKnggPSBOVUxMOworICAgIGludCBiYXNlID0gLTkwOTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogdW5saWtlbHkhICovCisgICAgc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJ4IiwgImJhc2UiLCAwfTsKIAotCWlmICh0eXBlICE9ICZQeUxvbmdfVHlwZSkKLQkJcmV0dXJuIGxvbmdfc3VidHlwZV9uZXcodHlwZSwgYXJncywga3dkcyk7IC8qIFdpbXAgb3V0ICovCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgInxPaTpsb25nIiwga3dsaXN0LAotCQkJCQkgJngsICZiYXNlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKHggPT0gTlVMTCkKLQkJcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZygwTCk7Ci0JaWYgKGJhc2UgPT0gLTkwOSkKLQkJcmV0dXJuIFB5TnVtYmVyX0xvbmcoeCk7Ci0JZWxzZSBpZiAoUHlTdHJpbmdfQ2hlY2soeCkpIHsKLQkJLyogU2luY2UgUHlMb25nX0Zyb21TdHJpbmcgZG9lc24ndCBoYXZlIGEgbGVuZ3RoIHBhcmFtZXRlciwKLQkJICogY2hlY2sgaGVyZSBmb3IgcG9zc2libGUgTlVMcyBpbiB0aGUgc3RyaW5nLiAqLwotCQljaGFyICpzdHJpbmcgPSBQeVN0cmluZ19BU19TVFJJTkcoeCk7Ci0JCWlmIChzdHJsZW4oc3RyaW5nKSAhPSBQeVN0cmluZ19TaXplKHgpKSB7Ci0JCQkvKiBjcmVhdGUgYSByZXByKCkgb2YgdGhlIGlucHV0IHN0cmluZywKLQkJCSAqIGp1c3QgbGlrZSBQeUxvbmdfRnJvbVN0cmluZyBkb2VzLiAqLwotCQkJUHlPYmplY3QgKnNyZXByOwotCQkJc3JlcHIgPSBQeU9iamVjdF9SZXByKHgpOwotCQkJaWYgKHNyZXByID09IE5VTEwpCi0JCQkJcmV0dXJuIE5VTEw7Ci0JCQlQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKLQkJCSAgICAgImludmFsaWQgbGl0ZXJhbCBmb3IgbG9uZygpIHdpdGggYmFzZSAlZDogJXMiLAotCQkJICAgICBiYXNlLCBQeVN0cmluZ19BU19TVFJJTkcoc3JlcHIpKTsKLQkJCVB5X0RFQ1JFRihzcmVwcik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlyZXR1cm4gUHlMb25nX0Zyb21TdHJpbmcoUHlTdHJpbmdfQVNfU1RSSU5HKHgpLCBOVUxMLCBiYXNlKTsKLQl9CisgICAgaWYgKHR5cGUgIT0gJlB5TG9uZ19UeXBlKQorICAgICAgICByZXR1cm4gbG9uZ19zdWJ0eXBlX25ldyh0eXBlLCBhcmdzLCBrd2RzKTsgLyogV2ltcCBvdXQgKi8KKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAifE9pOmxvbmciLCBrd2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJngsICZiYXNlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKHggPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZygwTCk7CisgICAgaWYgKGJhc2UgPT0gLTkwOSkKKyAgICAgICAgcmV0dXJuIFB5TnVtYmVyX0xvbmcoeCk7CisgICAgZWxzZSBpZiAoUHlTdHJpbmdfQ2hlY2soeCkpIHsKKyAgICAgICAgLyogU2luY2UgUHlMb25nX0Zyb21TdHJpbmcgZG9lc24ndCBoYXZlIGEgbGVuZ3RoIHBhcmFtZXRlciwKKyAgICAgICAgICogY2hlY2sgaGVyZSBmb3IgcG9zc2libGUgTlVMcyBpbiB0aGUgc3RyaW5nLiAqLworICAgICAgICBjaGFyICpzdHJpbmcgPSBQeVN0cmluZ19BU19TVFJJTkcoeCk7CisgICAgICAgIGlmIChzdHJsZW4oc3RyaW5nKSAhPSBQeVN0cmluZ19TaXplKHgpKSB7CisgICAgICAgICAgICAvKiBjcmVhdGUgYSByZXByKCkgb2YgdGhlIGlucHV0IHN0cmluZywKKyAgICAgICAgICAgICAqIGp1c3QgbGlrZSBQeUxvbmdfRnJvbVN0cmluZyBkb2VzLiAqLworICAgICAgICAgICAgUHlPYmplY3QgKnNyZXByOworICAgICAgICAgICAgc3JlcHIgPSBQeU9iamVjdF9SZXByKHgpOworICAgICAgICAgICAgaWYgKHNyZXByID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgImludmFsaWQgbGl0ZXJhbCBmb3IgbG9uZygpIHdpdGggYmFzZSAlZDogJXMiLAorICAgICAgICAgICAgICAgICBiYXNlLCBQeVN0cmluZ19BU19TVFJJTkcoc3JlcHIpKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihzcmVwcik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gUHlMb25nX0Zyb21TdHJpbmcoUHlTdHJpbmdfQVNfU1RSSU5HKHgpLCBOVUxMLCBiYXNlKTsKKyAgICB9CiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCWVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayh4KSkKLQkJcmV0dXJuIFB5TG9uZ19Gcm9tVW5pY29kZShQeVVuaWNvZGVfQVNfVU5JQ09ERSh4KSwKLQkJCQkJICBQeVVuaWNvZGVfR0VUX1NJWkUoeCksCi0JCQkJCSAgYmFzZSk7CisgICAgZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrKHgpKQorICAgICAgICByZXR1cm4gUHlMb25nX0Zyb21Vbmljb2RlKFB5VW5pY29kZV9BU19VTklDT0RFKHgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfU0laRSh4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlKTsKICNlbmRpZgotCWVsc2UgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJImxvbmcoKSBjYW4ndCBjb252ZXJ0IG5vbi1zdHJpbmcgd2l0aCBleHBsaWNpdCBiYXNlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBlbHNlIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICJsb25nKCkgY2FuJ3QgY29udmVydCBub24tc3RyaW5nIHdpdGggZXhwbGljaXQgYmFzZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiB9CiAKIC8qIFdpbXB5LCBzbG93IGFwcHJvYWNoIHRvIHRwX25ldyBjYWxscyBmb3Igc3VidHlwZXMgb2YgbG9uZzoKQEAgLTMzNzQsMTIwICszMzc0LDEyMCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGxvbmdfc3VidHlwZV9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JUHlMb25nT2JqZWN0ICp0bXAsICpuZXdvYmo7Ci0JUHlfc3NpemVfdCBpLCBuOworICAgIFB5TG9uZ09iamVjdCAqdG1wLCAqbmV3b2JqOworICAgIFB5X3NzaXplX3QgaSwgbjsKIAotCWFzc2VydChQeVR5cGVfSXNTdWJ0eXBlKHR5cGUsICZQeUxvbmdfVHlwZSkpOwotCXRtcCA9IChQeUxvbmdPYmplY3QgKilsb25nX25ldygmUHlMb25nX1R5cGUsIGFyZ3MsIGt3ZHMpOwotCWlmICh0bXAgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JYXNzZXJ0KFB5TG9uZ19DaGVja0V4YWN0KHRtcCkpOwotCW4gPSBQeV9TSVpFKHRtcCk7Ci0JaWYgKG4gPCAwKQotCQluID0gLW47Ci0JbmV3b2JqID0gKFB5TG9uZ09iamVjdCAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIG4pOwotCWlmIChuZXdvYmogPT0gTlVMTCkgewotCQlQeV9ERUNSRUYodG1wKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWFzc2VydChQeUxvbmdfQ2hlY2sobmV3b2JqKSk7Ci0JUHlfU0laRShuZXdvYmopID0gUHlfU0laRSh0bXApOwotCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspCi0JCW5ld29iai0+b2JfZGlnaXRbaV0gPSB0bXAtPm9iX2RpZ2l0W2ldOwotCVB5X0RFQ1JFRih0bXApOwotCXJldHVybiAoUHlPYmplY3QgKiluZXdvYmo7CisgICAgYXNzZXJ0KFB5VHlwZV9Jc1N1YnR5cGUodHlwZSwgJlB5TG9uZ19UeXBlKSk7CisgICAgdG1wID0gKFB5TG9uZ09iamVjdCAqKWxvbmdfbmV3KCZQeUxvbmdfVHlwZSwgYXJncywga3dkcyk7CisgICAgaWYgKHRtcCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBhc3NlcnQoUHlMb25nX0NoZWNrRXhhY3QodG1wKSk7CisgICAgbiA9IFB5X1NJWkUodG1wKTsKKyAgICBpZiAobiA8IDApCisgICAgICAgIG4gPSAtbjsKKyAgICBuZXdvYmogPSAoUHlMb25nT2JqZWN0ICopdHlwZS0+dHBfYWxsb2ModHlwZSwgbik7CisgICAgaWYgKG5ld29iaiA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRih0bXApOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgYXNzZXJ0KFB5TG9uZ19DaGVjayhuZXdvYmopKTsKKyAgICBQeV9TSVpFKG5ld29iaikgPSBQeV9TSVpFKHRtcCk7CisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgICAgICAgbmV3b2JqLT5vYl9kaWdpdFtpXSA9IHRtcC0+b2JfZGlnaXRbaV07CisgICAgUHlfREVDUkVGKHRtcCk7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKW5ld29iajsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGxvbmdfZ2V0bmV3YXJncyhQeUxvbmdPYmplY3QgKnYpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihOKSIsIF9QeUxvbmdfQ29weSh2KSk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihOKSIsIF9QeUxvbmdfQ29weSh2KSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBsb25nX2dldE4oUHlMb25nT2JqZWN0ICp2LCB2b2lkICpjb250ZXh0KSB7Ci0JcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZygoUHlfaW50cHRyX3QpY29udGV4dCk7CisgICAgcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZygoUHlfaW50cHRyX3QpY29udGV4dCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBsb25nX19mb3JtYXRfXyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKmZvcm1hdF9zcGVjOworICAgIFB5T2JqZWN0ICpmb3JtYXRfc3BlYzsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTzpfX2Zvcm1hdF9fIiwgJmZvcm1hdF9zcGVjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKFB5Qnl0ZXNfQ2hlY2soZm9ybWF0X3NwZWMpKQotCQlyZXR1cm4gX1B5TG9uZ19Gb3JtYXRBZHZhbmNlZChzZWxmLAotCQkJCQkgICAgICBQeUJ5dGVzX0FTX1NUUklORyhmb3JtYXRfc3BlYyksCi0JCQkJCSAgICAgIFB5Qnl0ZXNfR0VUX1NJWkUoZm9ybWF0X3NwZWMpKTsKLQlpZiAoUHlVbmljb2RlX0NoZWNrKGZvcm1hdF9zcGVjKSkgewotCQkvKiBDb252ZXJ0IGZvcm1hdF9zcGVjIHRvIGEgc3RyICovCi0JCVB5T2JqZWN0ICpyZXN1bHQ7Ci0JCVB5T2JqZWN0ICpzdHJfc3BlYyA9IFB5T2JqZWN0X1N0cihmb3JtYXRfc3BlYyk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPOl9fZm9ybWF0X18iLCAmZm9ybWF0X3NwZWMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoUHlCeXRlc19DaGVjayhmb3JtYXRfc3BlYykpCisgICAgICAgIHJldHVybiBfUHlMb25nX0Zvcm1hdEFkdmFuY2VkKHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5Qnl0ZXNfQVNfU1RSSU5HKGZvcm1hdF9zcGVjKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlCeXRlc19HRVRfU0laRShmb3JtYXRfc3BlYykpOworICAgIGlmIChQeVVuaWNvZGVfQ2hlY2soZm9ybWF0X3NwZWMpKSB7CisgICAgICAgIC8qIENvbnZlcnQgZm9ybWF0X3NwZWMgdG8gYSBzdHIgKi8KKyAgICAgICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICAgICAgUHlPYmplY3QgKnN0cl9zcGVjID0gUHlPYmplY3RfU3RyKGZvcm1hdF9zcGVjKTsKIAotCQlpZiAoc3RyX3NwZWMgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOworICAgICAgICBpZiAoc3RyX3NwZWMgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogCi0JCXJlc3VsdCA9IF9QeUxvbmdfRm9ybWF0QWR2YW5jZWQoc2VsZiwKLQkJCQkJCVB5Qnl0ZXNfQVNfU1RSSU5HKHN0cl9zcGVjKSwKLQkJCQkJCVB5Qnl0ZXNfR0VUX1NJWkUoc3RyX3NwZWMpKTsKKyAgICAgICAgcmVzdWx0ID0gX1B5TG9uZ19Gb3JtYXRBZHZhbmNlZChzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5Qnl0ZXNfQVNfU1RSSU5HKHN0cl9zcGVjKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUJ5dGVzX0dFVF9TSVpFKHN0cl9zcGVjKSk7CiAKLQkJUHlfREVDUkVGKHN0cl9zcGVjKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIl9fZm9ybWF0X18gcmVxdWlyZXMgc3RyIG9yIHVuaWNvZGUiKTsKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgUHlfREVDUkVGKHN0cl9zcGVjKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIl9fZm9ybWF0X18gcmVxdWlyZXMgc3RyIG9yIHVuaWNvZGUiKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGxvbmdfc2l6ZW9mKFB5TG9uZ09iamVjdCAqdikKIHsKLQlQeV9zc2l6ZV90IHJlczsKKyAgICBQeV9zc2l6ZV90IHJlczsKIAotCXJlcyA9IHYtPm9iX3R5cGUtPnRwX2Jhc2ljc2l6ZTsKLSAgICAgICAgaWYgKHYtPm9iX3NpemUgIT0gMCkKLQkJcmVzICs9IGFicyh2LT5vYl9zaXplKSAqIHNpemVvZihkaWdpdCk7Ci0JcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KHJlcyk7CisgICAgcmVzID0gdi0+b2JfdHlwZS0+dHBfYmFzaWNzaXplOworICAgIGlmICh2LT5vYl9zaXplICE9IDApCisgICAgICAgIHJlcyArPSBhYnModi0+b2Jfc2l6ZSkgKiBzaXplb2YoZGlnaXQpOworICAgIHJldHVybiBQeUludF9Gcm9tU3NpemVfdChyZXMpOwogfQogCiAjaWYgMAogc3RhdGljIFB5T2JqZWN0ICoKIGxvbmdfaXNfZmluaXRlKFB5T2JqZWN0ICp2KQogewotCVB5X1JFVFVSTl9UUlVFOworICAgIFB5X1JFVFVSTl9UUlVFOwogfQogI2VuZGlmCiAKIHN0YXRpYyBQeU1ldGhvZERlZiBsb25nX21ldGhvZHNbXSA9IHsKLQl7ImNvbmp1Z2F0ZSIsCShQeUNGdW5jdGlvbilsb25nX2xvbmcsCU1FVEhfTk9BUkdTLAotCSAiUmV0dXJucyBzZWxmLCB0aGUgY29tcGxleCBjb25qdWdhdGUgb2YgYW55IGxvbmcuIn0sCisgICAgeyJjb25qdWdhdGUiLCAgICAgICAoUHlDRnVuY3Rpb24pbG9uZ19sb25nLCBNRVRIX05PQVJHUywKKyAgICAgIlJldHVybnMgc2VsZiwgdGhlIGNvbXBsZXggY29uanVnYXRlIG9mIGFueSBsb25nLiJ9LAogI2lmIDAKLQl7ImlzX2Zpbml0ZSIsCShQeUNGdW5jdGlvbilsb25nX2lzX2Zpbml0ZSwJTUVUSF9OT0FSR1MsCi0JICJSZXR1cm5zIGFsd2F5cyBUcnVlLiJ9LAorICAgIHsiaXNfZmluaXRlIiwgICAgICAgKFB5Q0Z1bmN0aW9uKWxvbmdfaXNfZmluaXRlLCAgICBNRVRIX05PQVJHUywKKyAgICAgIlJldHVybnMgYWx3YXlzIFRydWUuIn0sCiAjZW5kaWYKLQl7Il9fdHJ1bmNfXyIsCShQeUNGdW5jdGlvbilsb25nX2xvbmcsCU1FVEhfTk9BUkdTLAotICAgICAgICAgIlRydW5jYXRpbmcgYW4gSW50ZWdyYWwgcmV0dXJucyBpdHNlbGYuIn0sCi0JeyJfX2dldG5ld2FyZ3NfXyIsCShQeUNGdW5jdGlvbilsb25nX2dldG5ld2FyZ3MsCU1FVEhfTk9BUkdTfSwKLSAgICAgICAgeyJfX2Zvcm1hdF9fIiwgKFB5Q0Z1bmN0aW9uKWxvbmdfX2Zvcm1hdF9fLCBNRVRIX1ZBUkFSR1N9LAotCXsiX19zaXplb2ZfXyIsCShQeUNGdW5jdGlvbilsb25nX3NpemVvZiwgTUVUSF9OT0FSR1MsCi0JICJSZXR1cm5zIHNpemUgaW4gbWVtb3J5LCBpbiBieXRlcyJ9LAotCXtOVUxMLAkJTlVMTH0JCS8qIHNlbnRpbmVsICovCisgICAgeyJfX3RydW5jX18iLCAgICAgICAoUHlDRnVuY3Rpb24pbG9uZ19sb25nLCBNRVRIX05PQVJHUywKKyAgICAgIlRydW5jYXRpbmcgYW4gSW50ZWdyYWwgcmV0dXJucyBpdHNlbGYuIn0sCisgICAgeyJfX2dldG5ld2FyZ3NfXyIsICAgICAgICAgIChQeUNGdW5jdGlvbilsb25nX2dldG5ld2FyZ3MsICAgTUVUSF9OT0FSR1N9LAorICAgIHsiX19mb3JtYXRfXyIsIChQeUNGdW5jdGlvbilsb25nX19mb3JtYXRfXywgTUVUSF9WQVJBUkdTfSwKKyAgICB7Il9fc2l6ZW9mX18iLCAgICAgIChQeUNGdW5jdGlvbilsb25nX3NpemVvZiwgTUVUSF9OT0FSR1MsCisgICAgICJSZXR1cm5zIHNpemUgaW4gbWVtb3J5LCBpbiBieXRlcyJ9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiBzdGF0aWMgUHlHZXRTZXREZWYgbG9uZ19nZXRzZXRbXSA9IHsKLSAgICB7InJlYWwiLCAKKyAgICB7InJlYWwiLAogICAgICAoZ2V0dGVyKWxvbmdfbG9uZywgKHNldHRlcilOVUxMLAogICAgICAidGhlIHJlYWwgcGFydCBvZiBhIGNvbXBsZXggbnVtYmVyIiwKICAgICAgTlVMTH0sCi0gICAgeyJpbWFnIiwgCisgICAgeyJpbWFnIiwKICAgICAgKGdldHRlcilsb25nX2dldE4sIChzZXR0ZXIpTlVMTCwKICAgICAgInRoZSBpbWFnaW5hcnkgcGFydCBvZiBhIGNvbXBsZXggbnVtYmVyIiwKICAgICAgKHZvaWQqKTB9LAotICAgIHsibnVtZXJhdG9yIiwgCisgICAgeyJudW1lcmF0b3IiLAogICAgICAoZ2V0dGVyKWxvbmdfbG9uZywgKHNldHRlcilOVUxMLAogICAgICAidGhlIG51bWVyYXRvciBvZiBhIHJhdGlvbmFsIG51bWJlciBpbiBsb3dlc3QgdGVybXMiLAogICAgICBOVUxMfSwKLSAgICB7ImRlbm9taW5hdG9yIiwgCisgICAgeyJkZW5vbWluYXRvciIsCiAgICAgIChnZXR0ZXIpbG9uZ19nZXROLCAoc2V0dGVyKU5VTEwsCiAgICAgICJ0aGUgZGVub21pbmF0b3Igb2YgYSByYXRpb25hbCBudW1iZXIgaW4gbG93ZXN0IHRlcm1zIiwKICAgICAgKHZvaWQqKTF9LApAQCAtMzUwNCw4NyArMzUwNCw4NyBAQAogY29udmVydGluZyBhIG5vbi1zdHJpbmcuIik7CiAKIHN0YXRpYyBQeU51bWJlck1ldGhvZHMgbG9uZ19hc19udW1iZXIgPSB7Ci0JKGJpbmFyeWZ1bmMpCWxvbmdfYWRkLAkvKm5iX2FkZCovCi0JKGJpbmFyeWZ1bmMpCWxvbmdfc3ViLAkvKm5iX3N1YnRyYWN0Ki8KLQkoYmluYXJ5ZnVuYykJbG9uZ19tdWwsCS8qbmJfbXVsdGlwbHkqLwotCQkJbG9uZ19jbGFzc2ljX2RpdiwgLypuYl9kaXZpZGUqLwotCQkJbG9uZ19tb2QsCS8qbmJfcmVtYWluZGVyKi8KLQkJCWxvbmdfZGl2bW9kLAkvKm5iX2Rpdm1vZCovCi0JCQlsb25nX3BvdywJLypuYl9wb3dlciovCi0JKHVuYXJ5ZnVuYykgCWxvbmdfbmVnLAkvKm5iX25lZ2F0aXZlKi8KLQkodW5hcnlmdW5jKSAJbG9uZ19sb25nLAkvKnRwX3Bvc2l0aXZlKi8KLQkodW5hcnlmdW5jKSAJbG9uZ19hYnMsCS8qdHBfYWJzb2x1dGUqLwotCShpbnF1aXJ5KQlsb25nX25vbnplcm8sCS8qdHBfbm9uemVybyovCi0JKHVuYXJ5ZnVuYykJbG9uZ19pbnZlcnQsCS8qbmJfaW52ZXJ0Ki8KLQkJCWxvbmdfbHNoaWZ0LAkvKm5iX2xzaGlmdCovCi0JKGJpbmFyeWZ1bmMpCWxvbmdfcnNoaWZ0LAkvKm5iX3JzaGlmdCovCi0JCQlsb25nX2FuZCwJLypuYl9hbmQqLwotCQkJbG9uZ194b3IsCS8qbmJfeG9yKi8KLQkJCWxvbmdfb3IsCS8qbmJfb3IqLwotCQkJbG9uZ19jb2VyY2UsCS8qbmJfY29lcmNlKi8KLQkJCWxvbmdfaW50LAkvKm5iX2ludCovCi0JCQlsb25nX2xvbmcsCS8qbmJfbG9uZyovCi0JCQlsb25nX2Zsb2F0LAkvKm5iX2Zsb2F0Ki8KLQkJCWxvbmdfb2N0LAkvKm5iX29jdCovCi0JCQlsb25nX2hleCwJLypuYl9oZXgqLwotCTAsCQkJCS8qIG5iX2lucGxhY2VfYWRkICovCi0JMCwJCQkJLyogbmJfaW5wbGFjZV9zdWJ0cmFjdCAqLwotCTAsCQkJCS8qIG5iX2lucGxhY2VfbXVsdGlwbHkgKi8KLQkwLAkJCQkvKiBuYl9pbnBsYWNlX2RpdmlkZSAqLwotCTAsCQkJCS8qIG5iX2lucGxhY2VfcmVtYWluZGVyICovCi0JMCwJCQkJLyogbmJfaW5wbGFjZV9wb3dlciAqLwotCTAsCQkJCS8qIG5iX2lucGxhY2VfbHNoaWZ0ICovCi0JMCwJCQkJLyogbmJfaW5wbGFjZV9yc2hpZnQgKi8KLQkwLAkJCQkvKiBuYl9pbnBsYWNlX2FuZCAqLwotCTAsCQkJCS8qIG5iX2lucGxhY2VfeG9yICovCi0JMCwJCQkJLyogbmJfaW5wbGFjZV9vciAqLwotCWxvbmdfZGl2LAkJCS8qIG5iX2Zsb29yX2RpdmlkZSAqLwotCWxvbmdfdHJ1ZV9kaXZpZGUsCQkvKiBuYl90cnVlX2RpdmlkZSAqLwotCTAsCQkJCS8qIG5iX2lucGxhY2VfZmxvb3JfZGl2aWRlICovCi0JMCwJCQkJLyogbmJfaW5wbGFjZV90cnVlX2RpdmlkZSAqLwotCWxvbmdfbG9uZywJCQkvKiBuYl9pbmRleCAqLworICAgIChiaW5hcnlmdW5jKSAgICAgICAgbG9uZ19hZGQsICAgICAgIC8qbmJfYWRkKi8KKyAgICAoYmluYXJ5ZnVuYykgICAgICAgIGxvbmdfc3ViLCAgICAgICAvKm5iX3N1YnRyYWN0Ki8KKyAgICAoYmluYXJ5ZnVuYykgICAgICAgIGxvbmdfbXVsLCAgICAgICAvKm5iX211bHRpcGx5Ki8KKyAgICAgICAgICAgIGxvbmdfY2xhc3NpY19kaXYsIC8qbmJfZGl2aWRlKi8KKyAgICAgICAgICAgIGxvbmdfbW9kLCAgICAgICAgICAgICAgICAgICAvKm5iX3JlbWFpbmRlciovCisgICAgICAgICAgICBsb25nX2Rpdm1vZCwgICAgICAgICAgICAgICAgLypuYl9kaXZtb2QqLworICAgICAgICAgICAgbG9uZ19wb3csICAgICAgICAgICAgICAgICAgIC8qbmJfcG93ZXIqLworICAgICh1bmFyeWZ1bmMpICAgICAgICAgbG9uZ19uZWcsICAgICAgIC8qbmJfbmVnYXRpdmUqLworICAgICh1bmFyeWZ1bmMpICAgICAgICAgbG9uZ19sb25nLCAgICAgIC8qdHBfcG9zaXRpdmUqLworICAgICh1bmFyeWZ1bmMpICAgICAgICAgbG9uZ19hYnMsICAgICAgIC8qdHBfYWJzb2x1dGUqLworICAgIChpbnF1aXJ5KSAgICAgICAgICAgbG9uZ19ub256ZXJvLCAgIC8qdHBfbm9uemVybyovCisgICAgKHVuYXJ5ZnVuYykgICAgICAgICBsb25nX2ludmVydCwgICAgLypuYl9pbnZlcnQqLworICAgICAgICAgICAgbG9uZ19sc2hpZnQsICAgICAgICAgICAgICAgIC8qbmJfbHNoaWZ0Ki8KKyAgICAoYmluYXJ5ZnVuYykgICAgICAgIGxvbmdfcnNoaWZ0LCAgICAvKm5iX3JzaGlmdCovCisgICAgICAgICAgICBsb25nX2FuZCwgICAgICAgICAgICAgICAgICAgLypuYl9hbmQqLworICAgICAgICAgICAgbG9uZ194b3IsICAgICAgICAgICAgICAgICAgIC8qbmJfeG9yKi8KKyAgICAgICAgICAgIGxvbmdfb3IsICAgICAgICAgICAgICAgICAgICAvKm5iX29yKi8KKyAgICAgICAgICAgIGxvbmdfY29lcmNlLCAgICAgICAgICAgICAgICAvKm5iX2NvZXJjZSovCisgICAgICAgICAgICBsb25nX2ludCwgICAgICAgICAgICAgICAgICAgLypuYl9pbnQqLworICAgICAgICAgICAgbG9uZ19sb25nLCAgICAgICAgICAgICAgICAgIC8qbmJfbG9uZyovCisgICAgICAgICAgICBsb25nX2Zsb2F0LCAgICAgICAgICAgICAgICAgLypuYl9mbG9hdCovCisgICAgICAgICAgICBsb25nX29jdCwgICAgICAgICAgICAgICAgICAgLypuYl9vY3QqLworICAgICAgICAgICAgbG9uZ19oZXgsICAgICAgICAgICAgICAgICAgIC8qbmJfaGV4Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9pbnBsYWNlX2FkZCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2lucGxhY2Vfc3VidHJhY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9pbnBsYWNlX211bHRpcGx5ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfaW5wbGFjZV9kaXZpZGUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9pbnBsYWNlX3JlbWFpbmRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2lucGxhY2VfcG93ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9pbnBsYWNlX2xzaGlmdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2lucGxhY2VfcnNoaWZ0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfaW5wbGFjZV9hbmQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9pbnBsYWNlX3hvciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2lucGxhY2Vfb3IgKi8KKyAgICBsb25nX2RpdiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9mbG9vcl9kaXZpZGUgKi8KKyAgICBsb25nX3RydWVfZGl2aWRlLCAgICAgICAgICAgICAgICAgICAvKiBuYl90cnVlX2RpdmlkZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2lucGxhY2VfZmxvb3JfZGl2aWRlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfaW5wbGFjZV90cnVlX2RpdmlkZSAqLworICAgIGxvbmdfbG9uZywgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2luZGV4ICovCiB9OwogCiBQeVR5cGVPYmplY3QgUHlMb25nX1R5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSkKLQkwLAkJCQkJLyogb2Jfc2l6ZSAqLwotCSJsb25nIiwJCQkJCS8qIHRwX25hbWUgKi8KLQlzaXplb2YoUHlMb25nT2JqZWN0KSAtIHNpemVvZihkaWdpdCksCS8qIHRwX2Jhc2ljc2l6ZSAqLwotCXNpemVvZihkaWdpdCksCQkJCS8qIHRwX2l0ZW1zaXplICovCi0JbG9uZ19kZWFsbG9jLAkJCQkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0ciAqLwotCShjbXBmdW5jKWxvbmdfY29tcGFyZSwJCQkvKiB0cF9jb21wYXJlICovCi0JbG9uZ19yZXByLAkJCQkvKiB0cF9yZXByICovCi0JJmxvbmdfYXNfbnVtYmVyLAkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JKGhhc2hmdW5jKWxvbmdfaGFzaCwJCQkvKiB0cF9oYXNoICovCi0gICAgICAgIDAsICAgICAgICAgICAgICAJCQkvKiB0cF9jYWxsICovCi0gICAgICAgIGxvbmdfc3RyLAkJCQkvKiB0cF9zdHIgKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfQ0hFQ0tUWVBFUyB8Ci0JCVB5X1RQRkxBR1NfQkFTRVRZUEUgfCBQeV9UUEZMQUdTX0xPTkdfU1VCQ0xBU1MsCS8qIHRwX2ZsYWdzICovCi0JbG9uZ19kb2MsCQkJCS8qIHRwX2RvYyAqLwotCTAsCQkJCQkvKiB0cF90cmF2ZXJzZSAqLwotCTAsCQkJCQkvKiB0cF9jbGVhciAqLwotCTAsCQkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCTAsCQkJCQkvKiB0cF9pdGVyICovCi0JMCwJCQkJCS8qIHRwX2l0ZXJuZXh0ICovCi0JbG9uZ19tZXRob2RzLAkJCQkvKiB0cF9tZXRob2RzICovCi0JMCwJCQkJCS8qIHRwX21lbWJlcnMgKi8KLQlsb25nX2dldHNldCwJCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaW5pdCAqLwotCTAsCQkJCQkvKiB0cF9hbGxvYyAqLwotCWxvbmdfbmV3LAkJCQkvKiB0cF9uZXcgKi8KLQlQeU9iamVjdF9EZWwsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUpCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvYl9zaXplICovCisgICAgImxvbmciLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCisgICAgc2l6ZW9mKFB5TG9uZ09iamVjdCkgLSBzaXplb2YoZGlnaXQpLCAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICBzaXplb2YoZGlnaXQpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgbG9uZ19kZWFsbG9jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIChjbXBmdW5jKWxvbmdfY29tcGFyZSwgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIGxvbmdfcmVwciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgICZsb25nX2FzX251bWJlciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIChoYXNoZnVuYylsb25nX2hhc2gsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIGxvbmdfc3RyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfQ0hFQ0tUWVBFUyB8CisgICAgICAgIFB5X1RQRkxBR1NfQkFTRVRZUEUgfCBQeV9UUEZMQUdTX0xPTkdfU1VCQ0xBU1MsICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICBsb25nX2RvYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgbG9uZ19tZXRob2RzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgbG9uZ19nZXRzZXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIGxvbmdfbmV3LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgUHlPYmplY3RfRGVsLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KIH07CmRpZmYgLS1naXQgYS9PYmplY3RzL21ldGhvZG9iamVjdC5jIGIvT2JqZWN0cy9tZXRob2RvYmplY3QuYwppbmRleCA2OWQ3NzkxLi4wYjYwY2EzIDEwMDY0NAotLS0gYS9PYmplY3RzL21ldGhvZG9iamVjdC5jCisrKyBiL09iamVjdHMvbWV0aG9kb2JqZWN0LmMKQEAgLTE2LDExMyArMTYsMTEzIEBACiBQeU9iamVjdCAqCiBQeUNGdW5jdGlvbl9OZXdFeChQeU1ldGhvZERlZiAqbWwsIFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqbW9kdWxlKQogewotCVB5Q0Z1bmN0aW9uT2JqZWN0ICpvcDsKLQlvcCA9IGZyZWVfbGlzdDsKLQlpZiAob3AgIT0gTlVMTCkgewotCQlmcmVlX2xpc3QgPSAoUHlDRnVuY3Rpb25PYmplY3QgKikob3AtPm1fc2VsZik7Ci0JCVB5T2JqZWN0X0lOSVQob3AsICZQeUNGdW5jdGlvbl9UeXBlKTsKLQkJbnVtZnJlZS0tOwotCX0KLQllbHNlIHsKLQkJb3AgPSBQeU9iamVjdF9HQ19OZXcoUHlDRnVuY3Rpb25PYmplY3QsICZQeUNGdW5jdGlvbl9UeXBlKTsKLQkJaWYgKG9wID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0Jb3AtPm1fbWwgPSBtbDsKLQlQeV9YSU5DUkVGKHNlbGYpOwotCW9wLT5tX3NlbGYgPSBzZWxmOwotCVB5X1hJTkNSRUYobW9kdWxlKTsKLQlvcC0+bV9tb2R1bGUgPSBtb2R1bGU7Ci0JX1B5T2JqZWN0X0dDX1RSQUNLKG9wKTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopb3A7CisgICAgUHlDRnVuY3Rpb25PYmplY3QgKm9wOworICAgIG9wID0gZnJlZV9saXN0OworICAgIGlmIChvcCAhPSBOVUxMKSB7CisgICAgICAgIGZyZWVfbGlzdCA9IChQeUNGdW5jdGlvbk9iamVjdCAqKShvcC0+bV9zZWxmKTsKKyAgICAgICAgUHlPYmplY3RfSU5JVChvcCwgJlB5Q0Z1bmN0aW9uX1R5cGUpOworICAgICAgICBudW1mcmVlLS07CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBvcCA9IFB5T2JqZWN0X0dDX05ldyhQeUNGdW5jdGlvbk9iamVjdCwgJlB5Q0Z1bmN0aW9uX1R5cGUpOworICAgICAgICBpZiAob3AgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBvcC0+bV9tbCA9IG1sOworICAgIFB5X1hJTkNSRUYoc2VsZik7CisgICAgb3AtPm1fc2VsZiA9IHNlbGY7CisgICAgUHlfWElOQ1JFRihtb2R1bGUpOworICAgIG9wLT5tX21vZHVsZSA9IG1vZHVsZTsKKyAgICBfUHlPYmplY3RfR0NfVFJBQ0sob3ApOworICAgIHJldHVybiAoUHlPYmplY3QgKilvcDsKIH0KIAogUHlDRnVuY3Rpb24KIFB5Q0Z1bmN0aW9uX0dldEZ1bmN0aW9uKFB5T2JqZWN0ICpvcCkKIHsKLQlpZiAoIVB5Q0Z1bmN0aW9uX0NoZWNrKG9wKSkgewotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiAoKFB5Q0Z1bmN0aW9uT2JqZWN0ICopb3ApIC0+IG1fbWwgLT4gbWxfbWV0aDsKKyAgICBpZiAoIVB5Q0Z1bmN0aW9uX0NoZWNrKG9wKSkgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiAoKFB5Q0Z1bmN0aW9uT2JqZWN0ICopb3ApIC0+IG1fbWwgLT4gbWxfbWV0aDsKIH0KIAogUHlPYmplY3QgKgogUHlDRnVuY3Rpb25fR2V0U2VsZihQeU9iamVjdCAqb3ApCiB7Ci0JaWYgKCFQeUNGdW5jdGlvbl9DaGVjayhvcCkpIHsKLQkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gKChQeUNGdW5jdGlvbk9iamVjdCAqKW9wKSAtPiBtX3NlbGY7CisgICAgaWYgKCFQeUNGdW5jdGlvbl9DaGVjayhvcCkpIHsKKyAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gKChQeUNGdW5jdGlvbk9iamVjdCAqKW9wKSAtPiBtX3NlbGY7CiB9CiAKIGludAogUHlDRnVuY3Rpb25fR2V0RmxhZ3MoUHlPYmplY3QgKm9wKQogewotCWlmICghUHlDRnVuY3Rpb25fQ2hlY2sob3ApKSB7Ci0JCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXJldHVybiAoKFB5Q0Z1bmN0aW9uT2JqZWN0ICopb3ApIC0+IG1fbWwgLT4gbWxfZmxhZ3M7CisgICAgaWYgKCFQeUNGdW5jdGlvbl9DaGVjayhvcCkpIHsKKyAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuICgoUHlDRnVuY3Rpb25PYmplY3QgKilvcCkgLT4gbV9tbCAtPiBtbF9mbGFnczsKIH0KIAogUHlPYmplY3QgKgogUHlDRnVuY3Rpb25fQ2FsbChQeU9iamVjdCAqZnVuYywgUHlPYmplY3QgKmFyZywgUHlPYmplY3QgKmt3KQogewotCVB5Q0Z1bmN0aW9uT2JqZWN0KiBmID0gKFB5Q0Z1bmN0aW9uT2JqZWN0KilmdW5jOwotCVB5Q0Z1bmN0aW9uIG1ldGggPSBQeUNGdW5jdGlvbl9HRVRfRlVOQ1RJT04oZnVuYyk7Ci0JUHlPYmplY3QgKnNlbGYgPSBQeUNGdW5jdGlvbl9HRVRfU0VMRihmdW5jKTsKLQlQeV9zc2l6ZV90IHNpemU7CisgICAgUHlDRnVuY3Rpb25PYmplY3QqIGYgPSAoUHlDRnVuY3Rpb25PYmplY3QqKWZ1bmM7CisgICAgUHlDRnVuY3Rpb24gbWV0aCA9IFB5Q0Z1bmN0aW9uX0dFVF9GVU5DVElPTihmdW5jKTsKKyAgICBQeU9iamVjdCAqc2VsZiA9IFB5Q0Z1bmN0aW9uX0dFVF9TRUxGKGZ1bmMpOworICAgIFB5X3NzaXplX3Qgc2l6ZTsKIAotCXN3aXRjaCAoUHlDRnVuY3Rpb25fR0VUX0ZMQUdTKGZ1bmMpICYgfihNRVRIX0NMQVNTIHwgTUVUSF9TVEFUSUMgfCBNRVRIX0NPRVhJU1QpKSB7Ci0JY2FzZSBNRVRIX1ZBUkFSR1M6Ci0JCWlmIChrdyA9PSBOVUxMIHx8IFB5RGljdF9TaXplKGt3KSA9PSAwKQotCQkJcmV0dXJuICgqbWV0aCkoc2VsZiwgYXJnKTsKLQkJYnJlYWs7Ci0JY2FzZSBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTOgotCWNhc2UgTUVUSF9PTERBUkdTIHwgTUVUSF9LRVlXT1JEUzoKLQkJcmV0dXJuICgqKFB5Q0Z1bmN0aW9uV2l0aEtleXdvcmRzKW1ldGgpKHNlbGYsIGFyZywga3cpOwotCWNhc2UgTUVUSF9OT0FSR1M6Ci0JCWlmIChrdyA9PSBOVUxMIHx8IFB5RGljdF9TaXplKGt3KSA9PSAwKSB7Ci0JCQlzaXplID0gUHlUdXBsZV9HRVRfU0laRShhcmcpOwotCQkJaWYgKHNpemUgPT0gMCkKLQkJCQlyZXR1cm4gKCptZXRoKShzZWxmLCBOVUxMKTsKLQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgIiUuMjAwcygpIHRha2VzIG5vIGFyZ3VtZW50cyAoJXpkIGdpdmVuKSIsCi0JCQkgICAgZi0+bV9tbC0+bWxfbmFtZSwgc2l6ZSk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlicmVhazsKLQljYXNlIE1FVEhfTzoKLQkJaWYgKGt3ID09IE5VTEwgfHwgUHlEaWN0X1NpemUoa3cpID09IDApIHsKLQkJCXNpemUgPSBQeVR1cGxlX0dFVF9TSVpFKGFyZyk7Ci0JCQlpZiAoc2l6ZSA9PSAxKQotCQkJCXJldHVybiAoKm1ldGgpKHNlbGYsIFB5VHVwbGVfR0VUX0lURU0oYXJnLCAwKSk7Ci0JCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJICAgICIlLjIwMHMoKSB0YWtlcyBleGFjdGx5IG9uZSBhcmd1bWVudCAoJXpkIGdpdmVuKSIsCi0JCQkgICAgZi0+bV9tbC0+bWxfbmFtZSwgc2l6ZSk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlicmVhazsKLQljYXNlIE1FVEhfT0xEQVJHUzoKLQkJLyogdGhlIHJlYWxseSBvbGQgc3R5bGUgKi8KLQkJaWYgKGt3ID09IE5VTEwgfHwgUHlEaWN0X1NpemUoa3cpID09IDApIHsKLQkJCXNpemUgPSBQeVR1cGxlX0dFVF9TSVpFKGFyZyk7Ci0JCQlpZiAoc2l6ZSA9PSAxKQotCQkJCWFyZyA9IFB5VHVwbGVfR0VUX0lURU0oYXJnLCAwKTsKLQkJCWVsc2UgaWYgKHNpemUgPT0gMCkKLQkJCQlhcmcgPSBOVUxMOwotCQkJcmV0dXJuICgqbWV0aCkoc2VsZiwgYXJnKTsKLQkJfQotCQlicmVhazsKLQlkZWZhdWx0OgotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICIlLjIwMHMoKSB0YWtlcyBubyBrZXl3b3JkIGFyZ3VtZW50cyIsCi0JCSAgICAgZi0+bV9tbC0+bWxfbmFtZSk7Ci0JcmV0dXJuIE5VTEw7CisgICAgc3dpdGNoIChQeUNGdW5jdGlvbl9HRVRfRkxBR1MoZnVuYykgJiB+KE1FVEhfQ0xBU1MgfCBNRVRIX1NUQVRJQyB8IE1FVEhfQ09FWElTVCkpIHsKKyAgICBjYXNlIE1FVEhfVkFSQVJHUzoKKyAgICAgICAgaWYgKGt3ID09IE5VTEwgfHwgUHlEaWN0X1NpemUoa3cpID09IDApCisgICAgICAgICAgICByZXR1cm4gKCptZXRoKShzZWxmLCBhcmcpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFM6CisgICAgY2FzZSBNRVRIX09MREFSR1MgfCBNRVRIX0tFWVdPUkRTOgorICAgICAgICByZXR1cm4gKCooUHlDRnVuY3Rpb25XaXRoS2V5d29yZHMpbWV0aCkoc2VsZiwgYXJnLCBrdyk7CisgICAgY2FzZSBNRVRIX05PQVJHUzoKKyAgICAgICAgaWYgKGt3ID09IE5VTEwgfHwgUHlEaWN0X1NpemUoa3cpID09IDApIHsKKyAgICAgICAgICAgIHNpemUgPSBQeVR1cGxlX0dFVF9TSVpFKGFyZyk7CisgICAgICAgICAgICBpZiAoc2l6ZSA9PSAwKQorICAgICAgICAgICAgICAgIHJldHVybiAoKm1ldGgpKHNlbGYsIE5VTEwpOworICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAiJS4yMDBzKCkgdGFrZXMgbm8gYXJndW1lbnRzICglemQgZ2l2ZW4pIiwKKyAgICAgICAgICAgICAgICBmLT5tX21sLT5tbF9uYW1lLCBzaXplKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTUVUSF9POgorICAgICAgICBpZiAoa3cgPT0gTlVMTCB8fCBQeURpY3RfU2l6ZShrdykgPT0gMCkgeworICAgICAgICAgICAgc2l6ZSA9IFB5VHVwbGVfR0VUX1NJWkUoYXJnKTsKKyAgICAgICAgICAgIGlmIChzaXplID09IDEpCisgICAgICAgICAgICAgICAgcmV0dXJuICgqbWV0aCkoc2VsZiwgUHlUdXBsZV9HRVRfSVRFTShhcmcsIDApKTsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgIiUuMjAwcygpIHRha2VzIGV4YWN0bHkgb25lIGFyZ3VtZW50ICglemQgZ2l2ZW4pIiwKKyAgICAgICAgICAgICAgICBmLT5tX21sLT5tbF9uYW1lLCBzaXplKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTUVUSF9PTERBUkdTOgorICAgICAgICAvKiB0aGUgcmVhbGx5IG9sZCBzdHlsZSAqLworICAgICAgICBpZiAoa3cgPT0gTlVMTCB8fCBQeURpY3RfU2l6ZShrdykgPT0gMCkgeworICAgICAgICAgICAgc2l6ZSA9IFB5VHVwbGVfR0VUX1NJWkUoYXJnKTsKKyAgICAgICAgICAgIGlmIChzaXplID09IDEpCisgICAgICAgICAgICAgICAgYXJnID0gUHlUdXBsZV9HRVRfSVRFTShhcmcsIDApOworICAgICAgICAgICAgZWxzZSBpZiAoc2l6ZSA9PSAwKQorICAgICAgICAgICAgICAgIGFyZyA9IE5VTEw7CisgICAgICAgICAgICByZXR1cm4gKCptZXRoKShzZWxmLCBhcmcpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgIiUuMjAwcygpIHRha2VzIG5vIGtleXdvcmQgYXJndW1lbnRzIiwKKyAgICAgICAgICAgICAgICAgZi0+bV9tbC0+bWxfbmFtZSk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIC8qIE1ldGhvZHMgKHRoZSBzdGFuZGFyZCBidWlsdC1pbiBtZXRob2RzLCB0aGF0IGlzKSAqLwpAQCAtMTMwLDE4NyArMTMwLDE4NyBAQAogc3RhdGljIHZvaWQKIG1ldGhfZGVhbGxvYyhQeUNGdW5jdGlvbk9iamVjdCAqbSkKIHsKLQlfUHlPYmplY3RfR0NfVU5UUkFDSyhtKTsKLQlQeV9YREVDUkVGKG0tPm1fc2VsZik7Ci0JUHlfWERFQ1JFRihtLT5tX21vZHVsZSk7Ci0JaWYgKG51bWZyZWUgPCBQeUNGdW5jdGlvbl9NQVhGUkVFTElTVCkgewotCQltLT5tX3NlbGYgPSAoUHlPYmplY3QgKilmcmVlX2xpc3Q7Ci0JCWZyZWVfbGlzdCA9IG07Ci0JCW51bWZyZWUrKzsKLQl9Ci0JZWxzZSB7Ci0JCVB5T2JqZWN0X0dDX0RlbChtKTsKLQl9CisgICAgX1B5T2JqZWN0X0dDX1VOVFJBQ0sobSk7CisgICAgUHlfWERFQ1JFRihtLT5tX3NlbGYpOworICAgIFB5X1hERUNSRUYobS0+bV9tb2R1bGUpOworICAgIGlmIChudW1mcmVlIDwgUHlDRnVuY3Rpb25fTUFYRlJFRUxJU1QpIHsKKyAgICAgICAgbS0+bV9zZWxmID0gKFB5T2JqZWN0ICopZnJlZV9saXN0OworICAgICAgICBmcmVlX2xpc3QgPSBtOworICAgICAgICBudW1mcmVlKys7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeU9iamVjdF9HQ19EZWwobSk7CisgICAgfQogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbWV0aF9nZXRfX2RvY19fKFB5Q0Z1bmN0aW9uT2JqZWN0ICptLCB2b2lkICpjbG9zdXJlKQogewotCWNvbnN0IGNoYXIgKmRvYyA9IG0tPm1fbWwtPm1sX2RvYzsKKyAgICBjb25zdCBjaGFyICpkb2MgPSBtLT5tX21sLT5tbF9kb2M7CiAKLQlpZiAoZG9jICE9IE5VTEwpCi0JCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGRvYyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGlmIChkb2MgIT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoZG9jKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBtZXRoX2dldF9fbmFtZV9fKFB5Q0Z1bmN0aW9uT2JqZWN0ICptLCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKG0tPm1fbWwtPm1sX25hbWUpOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKG0tPm1fbWwtPm1sX25hbWUpOwogfQogCiBzdGF0aWMgaW50CiBtZXRoX3RyYXZlcnNlKFB5Q0Z1bmN0aW9uT2JqZWN0ICptLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlQeV9WSVNJVChtLT5tX3NlbGYpOwotCVB5X1ZJU0lUKG0tPm1fbW9kdWxlKTsKLQlyZXR1cm4gMDsKKyAgICBQeV9WSVNJVChtLT5tX3NlbGYpOworICAgIFB5X1ZJU0lUKG0tPm1fbW9kdWxlKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG1ldGhfZ2V0X19zZWxmX18oUHlDRnVuY3Rpb25PYmplY3QgKm0sIHZvaWQgKmNsb3N1cmUpCiB7Ci0JUHlPYmplY3QgKnNlbGY7Ci0JaWYgKFB5RXZhbF9HZXRSZXN0cmljdGVkKCkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKLQkJCSJtZXRob2QuX19zZWxmX18gbm90IGFjY2Vzc2libGUgaW4gcmVzdHJpY3RlZCBtb2RlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlzZWxmID0gbS0+bV9zZWxmOwotCWlmIChzZWxmID09IE5VTEwpCi0JCXNlbGYgPSBQeV9Ob25lOwotCVB5X0lOQ1JFRihzZWxmKTsKLQlyZXR1cm4gc2VsZjsKKyAgICBQeU9iamVjdCAqc2VsZjsKKyAgICBpZiAoUHlFdmFsX0dldFJlc3RyaWN0ZWQoKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAorICAgICAgICAgICAgIm1ldGhvZC5fX3NlbGZfXyBub3QgYWNjZXNzaWJsZSBpbiByZXN0cmljdGVkIG1vZGUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHNlbGYgPSBtLT5tX3NlbGY7CisgICAgaWYgKHNlbGYgPT0gTlVMTCkKKyAgICAgICAgc2VsZiA9IFB5X05vbmU7CisgICAgUHlfSU5DUkVGKHNlbGYpOworICAgIHJldHVybiBzZWxmOwogfQogCiBzdGF0aWMgUHlHZXRTZXREZWYgbWV0aF9nZXRzZXRzIFtdID0gewotCXsiX19kb2NfXyIsICAoZ2V0dGVyKW1ldGhfZ2V0X19kb2NfXywgIE5VTEwsIE5VTEx9LAotCXsiX19uYW1lX18iLCAoZ2V0dGVyKW1ldGhfZ2V0X19uYW1lX18sIE5VTEwsIE5VTEx9LAotCXsiX19zZWxmX18iLCAoZ2V0dGVyKW1ldGhfZ2V0X19zZWxmX18sIE5VTEwsIE5VTEx9LAotCXswfQorICAgIHsiX19kb2NfXyIsICAoZ2V0dGVyKW1ldGhfZ2V0X19kb2NfXywgIE5VTEwsIE5VTEx9LAorICAgIHsiX19uYW1lX18iLCAoZ2V0dGVyKW1ldGhfZ2V0X19uYW1lX18sIE5VTEwsIE5VTEx9LAorICAgIHsiX19zZWxmX18iLCAoZ2V0dGVyKW1ldGhfZ2V0X19zZWxmX18sIE5VTEwsIE5VTEx9LAorICAgIHswfQogfTsKIAogI2RlZmluZSBPRkYoeCkgb2Zmc2V0b2YoUHlDRnVuY3Rpb25PYmplY3QsIHgpCiAKIHN0YXRpYyBQeU1lbWJlckRlZiBtZXRoX21lbWJlcnNbXSA9IHsKLQl7Il9fbW9kdWxlX18iLCAgICBUX09CSkVDVCwgICAgIE9GRihtX21vZHVsZSksIFBZX1dSSVRFX1JFU1RSSUNURUR9LAotCXtOVUxMfQorICAgIHsiX19tb2R1bGVfXyIsICAgIFRfT0JKRUNULCAgICAgT0ZGKG1fbW9kdWxlKSwgUFlfV1JJVEVfUkVTVFJJQ1RFRH0sCisgICAge05VTEx9CiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKgogbWV0aF9yZXByKFB5Q0Z1bmN0aW9uT2JqZWN0ICptKQogewotCWlmIChtLT5tX3NlbGYgPT0gTlVMTCkKLQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21Gb3JtYXQoIjxidWlsdC1pbiBmdW5jdGlvbiAlcz4iLAotCQkJCQkgICBtLT5tX21sLT5tbF9uYW1lKTsKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbUZvcm1hdCgiPGJ1aWx0LWluIG1ldGhvZCAlcyBvZiAlcyBvYmplY3QgYXQgJXA+IiwKLQkJCQkgICBtLT5tX21sLT5tbF9uYW1lLAotCQkJCSAgIG0tPm1fc2VsZi0+b2JfdHlwZS0+dHBfbmFtZSwKLQkJCQkgICBtLT5tX3NlbGYpOworICAgIGlmIChtLT5tX3NlbGYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21Gb3JtYXQoIjxidWlsdC1pbiBmdW5jdGlvbiAlcz4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLT5tX21sLT5tbF9uYW1lKTsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbUZvcm1hdCgiPGJ1aWx0LWluIG1ldGhvZCAlcyBvZiAlcyBvYmplY3QgYXQgJXA+IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLT5tX21sLT5tbF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0tPm1fc2VsZi0+b2JfdHlwZS0+dHBfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLT5tX3NlbGYpOwogfQogCiBzdGF0aWMgaW50CiBtZXRoX2NvbXBhcmUoUHlDRnVuY3Rpb25PYmplY3QgKmEsIFB5Q0Z1bmN0aW9uT2JqZWN0ICpiKQogewotCWlmIChhLT5tX3NlbGYgIT0gYi0+bV9zZWxmKQotCQlyZXR1cm4gKGEtPm1fc2VsZiA8IGItPm1fc2VsZikgPyAtMSA6IDE7Ci0JaWYgKGEtPm1fbWwtPm1sX21ldGggPT0gYi0+bV9tbC0+bWxfbWV0aCkKLQkJcmV0dXJuIDA7Ci0JaWYgKHN0cmNtcChhLT5tX21sLT5tbF9uYW1lLCBiLT5tX21sLT5tbF9uYW1lKSA8IDApCi0JCXJldHVybiAtMTsKLQllbHNlCi0JCXJldHVybiAxOworICAgIGlmIChhLT5tX3NlbGYgIT0gYi0+bV9zZWxmKQorICAgICAgICByZXR1cm4gKGEtPm1fc2VsZiA8IGItPm1fc2VsZikgPyAtMSA6IDE7CisgICAgaWYgKGEtPm1fbWwtPm1sX21ldGggPT0gYi0+bV9tbC0+bWxfbWV0aCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKHN0cmNtcChhLT5tX21sLT5tbF9uYW1lLCBiLT5tX21sLT5tbF9uYW1lKSA8IDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbWV0aF9yaWNoY29tcGFyZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm90aGVyLCBpbnQgb3ApCiB7Ci0JUHlDRnVuY3Rpb25PYmplY3QgKmEsICpiOwotCVB5T2JqZWN0ICpyZXM7Ci0JaW50IGVxOworICAgIFB5Q0Z1bmN0aW9uT2JqZWN0ICphLCAqYjsKKyAgICBQeU9iamVjdCAqcmVzOworICAgIGludCBlcTsKIAotCWlmIChvcCAhPSBQeV9FUSAmJiBvcCAhPSBQeV9ORSkgewotCQkvKiBQeTNLIHdhcm5pbmcgaWYgY29tcGFyaXNvbiBpc24ndCA9PSBvciAhPS4gICovCi0JCWlmIChQeUVycl9XYXJuUHkzaygiYnVpbHRpbl9mdW5jdGlvbl9vcl9tZXRob2Qgb3JkZXIgIgotCQkJCSAgICJjb21wYXJpc29ucyBub3Qgc3VwcG9ydGVkIGluIDMueCIsIDEpIDwgMCkgewotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KKyAgICBpZiAob3AgIT0gUHlfRVEgJiYgb3AgIT0gUHlfTkUpIHsKKyAgICAgICAgLyogUHkzSyB3YXJuaW5nIGlmIGNvbXBhcmlzb24gaXNuJ3QgPT0gb3IgIT0uICAqLworICAgICAgICBpZiAoUHlFcnJfV2FyblB5M2soImJ1aWx0aW5fZnVuY3Rpb25fb3JfbWV0aG9kIG9yZGVyICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb21wYXJpc29ucyBub3Qgc3VwcG9ydGVkIGluIDMueCIsIDEpIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KIAotCQlQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOwotCQlyZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7Ci0JfQotCWVsc2UgaWYgKCFQeUNGdW5jdGlvbl9DaGVjayhzZWxmKSB8fCAhUHlDRnVuY3Rpb25fQ2hlY2sob3RoZXIpKSB7Ci0JCVB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7Ci0JCXJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKLQl9Ci0JYSA9IChQeUNGdW5jdGlvbk9iamVjdCAqKXNlbGY7Ci0JYiA9IChQeUNGdW5jdGlvbk9iamVjdCAqKW90aGVyOwotCWVxID0gYS0+bV9zZWxmID09IGItPm1fc2VsZjsKLQlpZiAoZXEpCi0JCWVxID0gYS0+bV9tbC0+bWxfbWV0aCA9PSBiLT5tX21sLT5tbF9tZXRoOwotCWlmIChvcCA9PSBQeV9FUSkKLQkJcmVzID0gZXEgPyBQeV9UcnVlIDogUHlfRmFsc2U7Ci0JZWxzZQotCQlyZXMgPSBlcSA/IFB5X0ZhbHNlIDogUHlfVHJ1ZTsKLQlQeV9JTkNSRUYocmVzKTsKLQlyZXR1cm4gcmVzOworICAgICAgICBQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOworICAgICAgICByZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7CisgICAgfQorICAgIGVsc2UgaWYgKCFQeUNGdW5jdGlvbl9DaGVjayhzZWxmKSB8fCAhUHlDRnVuY3Rpb25fQ2hlY2sob3RoZXIpKSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7CisgICAgICAgIHJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKKyAgICB9CisgICAgYSA9IChQeUNGdW5jdGlvbk9iamVjdCAqKXNlbGY7CisgICAgYiA9IChQeUNGdW5jdGlvbk9iamVjdCAqKW90aGVyOworICAgIGVxID0gYS0+bV9zZWxmID09IGItPm1fc2VsZjsKKyAgICBpZiAoZXEpCisgICAgICAgIGVxID0gYS0+bV9tbC0+bWxfbWV0aCA9PSBiLT5tX21sLT5tbF9tZXRoOworICAgIGlmIChvcCA9PSBQeV9FUSkKKyAgICAgICAgcmVzID0gZXEgPyBQeV9UcnVlIDogUHlfRmFsc2U7CisgICAgZWxzZQorICAgICAgICByZXMgPSBlcSA/IFB5X0ZhbHNlIDogUHlfVHJ1ZTsKKyAgICBQeV9JTkNSRUYocmVzKTsKKyAgICByZXR1cm4gcmVzOwogfQogCiBzdGF0aWMgbG9uZwogbWV0aF9oYXNoKFB5Q0Z1bmN0aW9uT2JqZWN0ICphKQogewotCWxvbmcgeCx5OwotCWlmIChhLT5tX3NlbGYgPT0gTlVMTCkKLQkJeCA9IDA7Ci0JZWxzZSB7Ci0JCXggPSBQeU9iamVjdF9IYXNoKGEtPm1fc2VsZik7Ci0JCWlmICh4ID09IC0xKQotCQkJcmV0dXJuIC0xOwotCX0KLQl5ID0gX1B5X0hhc2hQb2ludGVyKCh2b2lkKikoYS0+bV9tbC0+bWxfbWV0aCkpOwotCWlmICh5ID09IC0xKQotCQlyZXR1cm4gLTE7Ci0JeCBePSB5OwotCWlmICh4ID09IC0xKQotCQl4ID0gLTI7Ci0JcmV0dXJuIHg7CisgICAgbG9uZyB4LHk7CisgICAgaWYgKGEtPm1fc2VsZiA9PSBOVUxMKQorICAgICAgICB4ID0gMDsKKyAgICBlbHNlIHsKKyAgICAgICAgeCA9IFB5T2JqZWN0X0hhc2goYS0+bV9zZWxmKTsKKyAgICAgICAgaWYgKHggPT0gLTEpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHkgPSBfUHlfSGFzaFBvaW50ZXIoKHZvaWQqKShhLT5tX21sLT5tbF9tZXRoKSk7CisgICAgaWYgKHkgPT0gLTEpCisgICAgICAgIHJldHVybiAtMTsKKyAgICB4IF49IHk7CisgICAgaWYgKHggPT0gLTEpCisgICAgICAgIHggPSAtMjsKKyAgICByZXR1cm4geDsKIH0KIAogCiBQeVR5cGVPYmplY3QgUHlDRnVuY3Rpb25fVHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQotCSJidWlsdGluX2Z1bmN0aW9uX29yX21ldGhvZCIsCi0Jc2l6ZW9mKFB5Q0Z1bmN0aW9uT2JqZWN0KSwKLQkwLAotCShkZXN0cnVjdG9yKW1ldGhfZGVhbGxvYywgCQkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0ciAqLwotCShjbXBmdW5jKW1ldGhfY29tcGFyZSwJCQkvKiB0cF9jb21wYXJlICovCi0JKHJlcHJmdW5jKW1ldGhfcmVwciwJCQkvKiB0cF9yZXByICovCi0JMCwJCQkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JKGhhc2hmdW5jKW1ldGhfaGFzaCwJCQkvKiB0cF9oYXNoICovCi0JUHlDRnVuY3Rpb25fQ2FsbCwJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDLC8qIHRwX2ZsYWdzICovCi0gCTAsCQkJCQkvKiB0cF9kb2MgKi8KLSAJKHRyYXZlcnNlcHJvYyltZXRoX3RyYXZlcnNlLAkJLyogdHBfdHJhdmVyc2UgKi8KLQkwLAkJCQkJLyogdHBfY2xlYXIgKi8KLQltZXRoX3JpY2hjb21wYXJlLAkJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaXRlciAqLwotCTAsCQkJCQkvKiB0cF9pdGVybmV4dCAqLwotCTAsCQkJCQkvKiB0cF9tZXRob2RzICovCi0JbWV0aF9tZW1iZXJzLAkJCQkvKiB0cF9tZW1iZXJzICovCi0JbWV0aF9nZXRzZXRzLAkJCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCQkvKiB0cF9kaWN0ICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKKyAgICAiYnVpbHRpbl9mdW5jdGlvbl9vcl9tZXRob2QiLAorICAgIHNpemVvZihQeUNGdW5jdGlvbk9iamVjdCksCisgICAgMCwKKyAgICAoZGVzdHJ1Y3RvciltZXRoX2RlYWxsb2MsICAgICAgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgKGNtcGZ1bmMpbWV0aF9jb21wYXJlLCAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgKHJlcHJmdW5jKW1ldGhfcmVwciwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKW1ldGhfaGFzaCwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgUHlDRnVuY3Rpb25fQ2FsbCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDLC8qIHRwX2ZsYWdzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAodHJhdmVyc2Vwcm9jKW1ldGhfdHJhdmVyc2UsICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIG1ldGhfcmljaGNvbXBhcmUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICBtZXRoX21lbWJlcnMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICBtZXRoX2dldHNldHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLwogfTsKIAogLyogTGlzdCBhbGwgbWV0aG9kcyBpbiBhIGNoYWluIC0tIGhlbHBlciBmb3IgZmluZG1ldGhvZGluY2hhaW4gKi8KQEAgLTMxOCwzMiArMzE4LDMyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogbGlzdG1ldGhvZGNoYWluKFB5TWV0aG9kQ2hhaW4gKmNoYWluKQogewotCVB5TWV0aG9kQ2hhaW4gKmM7Ci0JUHlNZXRob2REZWYgKm1sOwotCWludCBpLCBuOwotCVB5T2JqZWN0ICp2OworICAgIFB5TWV0aG9kQ2hhaW4gKmM7CisgICAgUHlNZXRob2REZWYgKm1sOworICAgIGludCBpLCBuOworICAgIFB5T2JqZWN0ICp2OwogCi0JbiA9IDA7Ci0JZm9yIChjID0gY2hhaW47IGMgIT0gTlVMTDsgYyA9IGMtPmxpbmspIHsKLQkJZm9yIChtbCA9IGMtPm1ldGhvZHM7IG1sLT5tbF9uYW1lICE9IE5VTEw7IG1sKyspCi0JCQluKys7Ci0JfQotCXYgPSBQeUxpc3RfTmV3KG4pOwotCWlmICh2ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWkgPSAwOwotCWZvciAoYyA9IGNoYWluOyBjICE9IE5VTEw7IGMgPSBjLT5saW5rKSB7Ci0JCWZvciAobWwgPSBjLT5tZXRob2RzOyBtbC0+bWxfbmFtZSAhPSBOVUxMOyBtbCsrKSB7Ci0JCQlQeUxpc3RfU2V0SXRlbSh2LCBpLCBQeVN0cmluZ19Gcm9tU3RyaW5nKG1sLT5tbF9uYW1lKSk7Ci0JCQlpKys7Ci0JCX0KLQl9Ci0JaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKLQkJUHlfREVDUkVGKHYpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JUHlMaXN0X1NvcnQodik7Ci0JcmV0dXJuIHY7CisgICAgbiA9IDA7CisgICAgZm9yIChjID0gY2hhaW47IGMgIT0gTlVMTDsgYyA9IGMtPmxpbmspIHsKKyAgICAgICAgZm9yIChtbCA9IGMtPm1ldGhvZHM7IG1sLT5tbF9uYW1lICE9IE5VTEw7IG1sKyspCisgICAgICAgICAgICBuKys7CisgICAgfQorICAgIHYgPSBQeUxpc3RfTmV3KG4pOworICAgIGlmICh2ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGkgPSAwOworICAgIGZvciAoYyA9IGNoYWluOyBjICE9IE5VTEw7IGMgPSBjLT5saW5rKSB7CisgICAgICAgIGZvciAobWwgPSBjLT5tZXRob2RzOyBtbC0+bWxfbmFtZSAhPSBOVUxMOyBtbCsrKSB7CisgICAgICAgICAgICBQeUxpc3RfU2V0SXRlbSh2LCBpLCBQeVN0cmluZ19Gcm9tU3RyaW5nKG1sLT5tbF9uYW1lKSk7CisgICAgICAgICAgICBpKys7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlMaXN0X1NvcnQodik7CisgICAgcmV0dXJuIHY7CiB9CiAKIC8qIEZpbmQgYSBtZXRob2QgaW4gYSBtZXRob2QgY2hhaW4gKi8KQEAgLTM1MSwzMSArMzUxLDMxIEBACiBQeU9iamVjdCAqCiBQeV9GaW5kTWV0aG9kSW5DaGFpbihQeU1ldGhvZENoYWluICpjaGFpbiwgUHlPYmplY3QgKnNlbGYsIGNvbnN0IGNoYXIgKm5hbWUpCiB7Ci0JaWYgKG5hbWVbMF0gPT0gJ18nICYmIG5hbWVbMV0gPT0gJ18nKSB7Ci0JCWlmIChzdHJjbXAobmFtZSwgIl9fbWV0aG9kc19fIikgPT0gMCkgewotCQkJaWYgKFB5RXJyX1dhcm5QeTNrKCJfX21ldGhvZHNfXyBub3Qgc3VwcG9ydGVkIGluIDMueCIsCi0JCQkJCSAgIDEpIDwgMCkKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCXJldHVybiBsaXN0bWV0aG9kY2hhaW4oY2hhaW4pOwotCQl9Ci0JCWlmIChzdHJjbXAobmFtZSwgIl9fZG9jX18iKSA9PSAwKSB7Ci0JCQljb25zdCBjaGFyICpkb2MgPSBzZWxmLT5vYl90eXBlLT50cF9kb2M7Ci0JCQlpZiAoZG9jICE9IE5VTEwpCi0JCQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoZG9jKTsKLQkJfQotCX0KLQl3aGlsZSAoY2hhaW4gIT0gTlVMTCkgewotCQlQeU1ldGhvZERlZiAqbWwgPSBjaGFpbi0+bWV0aG9kczsKLQkJZm9yICg7IG1sLT5tbF9uYW1lICE9IE5VTEw7IG1sKyspIHsKLQkJCWlmIChuYW1lWzBdID09IG1sLT5tbF9uYW1lWzBdICYmCi0JCQkgICAgc3RyY21wKG5hbWUrMSwgbWwtPm1sX25hbWUrMSkgPT0gMCkKLQkJCQkvKiBYWFggKi8KLQkJCQlyZXR1cm4gUHlDRnVuY3Rpb25fTmV3KG1sLCBzZWxmKTsKLQkJfQotCQljaGFpbiA9IGNoYWluLT5saW5rOwotCX0KLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfQXR0cmlidXRlRXJyb3IsIG5hbWUpOwotCXJldHVybiBOVUxMOworICAgIGlmIChuYW1lWzBdID09ICdfJyAmJiBuYW1lWzFdID09ICdfJykgeworICAgICAgICBpZiAoc3RyY21wKG5hbWUsICJfX21ldGhvZHNfXyIpID09IDApIHsKKyAgICAgICAgICAgIGlmIChQeUVycl9XYXJuUHkzaygiX19tZXRob2RzX18gbm90IHN1cHBvcnRlZCBpbiAzLngiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIHJldHVybiBsaXN0bWV0aG9kY2hhaW4oY2hhaW4pOworICAgICAgICB9CisgICAgICAgIGlmIChzdHJjbXAobmFtZSwgIl9fZG9jX18iKSA9PSAwKSB7CisgICAgICAgICAgICBjb25zdCBjaGFyICpkb2MgPSBzZWxmLT5vYl90eXBlLT50cF9kb2M7CisgICAgICAgICAgICBpZiAoZG9jICE9IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoZG9jKTsKKyAgICAgICAgfQorICAgIH0KKyAgICB3aGlsZSAoY2hhaW4gIT0gTlVMTCkgeworICAgICAgICBQeU1ldGhvZERlZiAqbWwgPSBjaGFpbi0+bWV0aG9kczsKKyAgICAgICAgZm9yICg7IG1sLT5tbF9uYW1lICE9IE5VTEw7IG1sKyspIHsKKyAgICAgICAgICAgIGlmIChuYW1lWzBdID09IG1sLT5tbF9uYW1lWzBdICYmCisgICAgICAgICAgICAgICAgc3RyY21wKG5hbWUrMSwgbWwtPm1sX25hbWUrMSkgPT0gMCkKKyAgICAgICAgICAgICAgICAvKiBYWFggKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gUHlDRnVuY3Rpb25fTmV3KG1sLCBzZWxmKTsKKyAgICAgICAgfQorICAgICAgICBjaGFpbiA9IGNoYWluLT5saW5rOworICAgIH0KKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfQXR0cmlidXRlRXJyb3IsIG5hbWUpOworICAgIHJldHVybiBOVUxMOwogfQogCiAvKiBGaW5kIGEgbWV0aG9kIGluIGEgc2luZ2xlIG1ldGhvZCBsaXN0ICovCkBAIC0zODMsMTAgKzM4MywxMCBAQAogUHlPYmplY3QgKgogUHlfRmluZE1ldGhvZChQeU1ldGhvZERlZiAqbWV0aG9kcywgUHlPYmplY3QgKnNlbGYsIGNvbnN0IGNoYXIgKm5hbWUpCiB7Ci0JUHlNZXRob2RDaGFpbiBjaGFpbjsKLQljaGFpbi5tZXRob2RzID0gbWV0aG9kczsKLQljaGFpbi5saW5rID0gTlVMTDsKLQlyZXR1cm4gUHlfRmluZE1ldGhvZEluQ2hhaW4oJmNoYWluLCBzZWxmLCBuYW1lKTsKKyAgICBQeU1ldGhvZENoYWluIGNoYWluOworICAgIGNoYWluLm1ldGhvZHMgPSBtZXRob2RzOworICAgIGNoYWluLmxpbmsgPSBOVUxMOworICAgIHJldHVybiBQeV9GaW5kTWV0aG9kSW5DaGFpbigmY2hhaW4sIHNlbGYsIG5hbWUpOwogfQogCiAvKiBDbGVhciBvdXQgdGhlIGZyZWUgbGlzdCAqLwpAQCAtMzk0LDIyICszOTQsMjIgQEAKIGludAogUHlDRnVuY3Rpb25fQ2xlYXJGcmVlTGlzdCh2b2lkKQogewotCWludCBmcmVlbGlzdF9zaXplID0gbnVtZnJlZTsKLQkKLQl3aGlsZSAoZnJlZV9saXN0KSB7Ci0JCVB5Q0Z1bmN0aW9uT2JqZWN0ICp2ID0gZnJlZV9saXN0OwotCQlmcmVlX2xpc3QgPSAoUHlDRnVuY3Rpb25PYmplY3QgKikodi0+bV9zZWxmKTsKLQkJUHlPYmplY3RfR0NfRGVsKHYpOwotCQludW1mcmVlLS07Ci0JfQotCWFzc2VydChudW1mcmVlID09IDApOwotCXJldHVybiBmcmVlbGlzdF9zaXplOworICAgIGludCBmcmVlbGlzdF9zaXplID0gbnVtZnJlZTsKKworICAgIHdoaWxlIChmcmVlX2xpc3QpIHsKKyAgICAgICAgUHlDRnVuY3Rpb25PYmplY3QgKnYgPSBmcmVlX2xpc3Q7CisgICAgICAgIGZyZWVfbGlzdCA9IChQeUNGdW5jdGlvbk9iamVjdCAqKSh2LT5tX3NlbGYpOworICAgICAgICBQeU9iamVjdF9HQ19EZWwodik7CisgICAgICAgIG51bWZyZWUtLTsKKyAgICB9CisgICAgYXNzZXJ0KG51bWZyZWUgPT0gMCk7CisgICAgcmV0dXJuIGZyZWVsaXN0X3NpemU7CiB9CiAKIHZvaWQKIFB5Q0Z1bmN0aW9uX0Zpbmkodm9pZCkKIHsKLQkodm9pZClQeUNGdW5jdGlvbl9DbGVhckZyZWVMaXN0KCk7CisgICAgKHZvaWQpUHlDRnVuY3Rpb25fQ2xlYXJGcmVlTGlzdCgpOwogfQogCiAvKiBQeUNGdW5jdGlvbl9OZXcoKSBpcyBub3cganVzdCBhIG1hY3JvIHRoYXQgY2FsbHMgUHlDRnVuY3Rpb25fTmV3RXgoKSwKQEAgLTQyMyw1ICs0MjMsNSBAQAogUHlPYmplY3QgKgogUHlDRnVuY3Rpb25fTmV3KFB5TWV0aG9kRGVmICptbCwgUHlPYmplY3QgKnNlbGYpCiB7Ci0JcmV0dXJuIFB5Q0Z1bmN0aW9uX05ld0V4KG1sLCBzZWxmLCBOVUxMKTsKKyAgICByZXR1cm4gUHlDRnVuY3Rpb25fTmV3RXgobWwsIHNlbGYsIE5VTEwpOwogfQpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9tb2R1bGVvYmplY3QuYyBiL09iamVjdHMvbW9kdWxlb2JqZWN0LmMKaW5kZXggZDFhYTc3MS4uMDhlOTc0MCAxMDA2NDQKLS0tIGEvT2JqZWN0cy9tb2R1bGVvYmplY3QuYworKysgYi9PYmplY3RzL21vZHVsZW9iamVjdC5jCkBAIC01LDE0NCArNSwxNDQgQEAKICNpbmNsdWRlICJzdHJ1Y3RtZW1iZXIuaCIKIAogdHlwZWRlZiBzdHJ1Y3QgewotCVB5T2JqZWN0X0hFQUQKLQlQeU9iamVjdCAqbWRfZGljdDsKKyAgICBQeU9iamVjdF9IRUFECisgICAgUHlPYmplY3QgKm1kX2RpY3Q7CiB9IFB5TW9kdWxlT2JqZWN0OwogCiBzdGF0aWMgUHlNZW1iZXJEZWYgbW9kdWxlX21lbWJlcnNbXSA9IHsKLQl7Il9fZGljdF9fIiwgVF9PQkpFQ1QsIG9mZnNldG9mKFB5TW9kdWxlT2JqZWN0LCBtZF9kaWN0KSwgUkVBRE9OTFl9LAotCXswfQorICAgIHsiX19kaWN0X18iLCBUX09CSkVDVCwgb2Zmc2V0b2YoUHlNb2R1bGVPYmplY3QsIG1kX2RpY3QpLCBSRUFET05MWX0sCisgICAgezB9CiB9OwogCiBQeU9iamVjdCAqCiBQeU1vZHVsZV9OZXcoY29uc3QgY2hhciAqbmFtZSkKIHsKLQlQeU1vZHVsZU9iamVjdCAqbTsKLQlQeU9iamVjdCAqbmFtZW9iajsKLQltID0gUHlPYmplY3RfR0NfTmV3KFB5TW9kdWxlT2JqZWN0LCAmUHlNb2R1bGVfVHlwZSk7Ci0JaWYgKG0gPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JbmFtZW9iaiA9IFB5U3RyaW5nX0Zyb21TdHJpbmcobmFtZSk7Ci0JbS0+bWRfZGljdCA9IFB5RGljdF9OZXcoKTsKLQlpZiAobS0+bWRfZGljdCA9PSBOVUxMIHx8IG5hbWVvYmogPT0gTlVMTCkKLQkJZ290byBmYWlsOwotCWlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhtLT5tZF9kaWN0LCAiX19uYW1lX18iLCBuYW1lb2JqKSAhPSAwKQotCQlnb3RvIGZhaWw7Ci0JaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKG0tPm1kX2RpY3QsICJfX2RvY19fIiwgUHlfTm9uZSkgIT0gMCkKLQkJZ290byBmYWlsOwotCWlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhtLT5tZF9kaWN0LCAiX19wYWNrYWdlX18iLCBQeV9Ob25lKSAhPSAwKQotCQlnb3RvIGZhaWw7Ci0JUHlfREVDUkVGKG5hbWVvYmopOwotCVB5T2JqZWN0X0dDX1RyYWNrKG0pOwotCXJldHVybiAoUHlPYmplY3QgKiltOworICAgIFB5TW9kdWxlT2JqZWN0ICptOworICAgIFB5T2JqZWN0ICpuYW1lb2JqOworICAgIG0gPSBQeU9iamVjdF9HQ19OZXcoUHlNb2R1bGVPYmplY3QsICZQeU1vZHVsZV9UeXBlKTsKKyAgICBpZiAobSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBuYW1lb2JqID0gUHlTdHJpbmdfRnJvbVN0cmluZyhuYW1lKTsKKyAgICBtLT5tZF9kaWN0ID0gUHlEaWN0X05ldygpOworICAgIGlmIChtLT5tZF9kaWN0ID09IE5VTEwgfHwgbmFtZW9iaiA9PSBOVUxMKQorICAgICAgICBnb3RvIGZhaWw7CisgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKG0tPm1kX2RpY3QsICJfX25hbWVfXyIsIG5hbWVvYmopICE9IDApCisgICAgICAgIGdvdG8gZmFpbDsKKyAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcobS0+bWRfZGljdCwgIl9fZG9jX18iLCBQeV9Ob25lKSAhPSAwKQorICAgICAgICBnb3RvIGZhaWw7CisgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKG0tPm1kX2RpY3QsICJfX3BhY2thZ2VfXyIsIFB5X05vbmUpICE9IDApCisgICAgICAgIGdvdG8gZmFpbDsKKyAgICBQeV9ERUNSRUYobmFtZW9iaik7CisgICAgUHlPYmplY3RfR0NfVHJhY2sobSk7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKW07CiAKICBmYWlsOgotCVB5X1hERUNSRUYobmFtZW9iaik7Ci0JUHlfREVDUkVGKG0pOwotCXJldHVybiBOVUxMOworICAgIFB5X1hERUNSRUYobmFtZW9iaik7CisgICAgUHlfREVDUkVGKG0pOworICAgIHJldHVybiBOVUxMOwogfQogCiBQeU9iamVjdCAqCiBQeU1vZHVsZV9HZXREaWN0KFB5T2JqZWN0ICptKQogewotCVB5T2JqZWN0ICpkOwotCWlmICghUHlNb2R1bGVfQ2hlY2sobSkpIHsKLQkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlkID0gKChQeU1vZHVsZU9iamVjdCAqKW0pIC0+IG1kX2RpY3Q7Ci0JaWYgKGQgPT0gTlVMTCkKLQkJKChQeU1vZHVsZU9iamVjdCAqKW0pIC0+IG1kX2RpY3QgPSBkID0gUHlEaWN0X05ldygpOwotCXJldHVybiBkOworICAgIFB5T2JqZWN0ICpkOworICAgIGlmICghUHlNb2R1bGVfQ2hlY2sobSkpIHsKKyAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBkID0gKChQeU1vZHVsZU9iamVjdCAqKW0pIC0+IG1kX2RpY3Q7CisgICAgaWYgKGQgPT0gTlVMTCkKKyAgICAgICAgKChQeU1vZHVsZU9iamVjdCAqKW0pIC0+IG1kX2RpY3QgPSBkID0gUHlEaWN0X05ldygpOworICAgIHJldHVybiBkOwogfQogCiBjaGFyICoKIFB5TW9kdWxlX0dldE5hbWUoUHlPYmplY3QgKm0pCiB7Ci0JUHlPYmplY3QgKmQ7Ci0JUHlPYmplY3QgKm5hbWVvYmo7Ci0JaWYgKCFQeU1vZHVsZV9DaGVjayhtKSkgewotCQlQeUVycl9CYWRBcmd1bWVudCgpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZCA9ICgoUHlNb2R1bGVPYmplY3QgKiltKS0+bWRfZGljdDsKLQlpZiAoZCA9PSBOVUxMIHx8Ci0JICAgIChuYW1lb2JqID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoZCwgIl9fbmFtZV9fIikpID09IE5VTEwgfHwKLQkgICAgIVB5U3RyaW5nX0NoZWNrKG5hbWVvYmopKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLCAibmFtZWxlc3MgbW9kdWxlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gUHlTdHJpbmdfQXNTdHJpbmcobmFtZW9iaik7CisgICAgUHlPYmplY3QgKmQ7CisgICAgUHlPYmplY3QgKm5hbWVvYmo7CisgICAgaWYgKCFQeU1vZHVsZV9DaGVjayhtKSkgeworICAgICAgICBQeUVycl9CYWRBcmd1bWVudCgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZCA9ICgoUHlNb2R1bGVPYmplY3QgKiltKS0+bWRfZGljdDsKKyAgICBpZiAoZCA9PSBOVUxMIHx8CisgICAgICAgIChuYW1lb2JqID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoZCwgIl9fbmFtZV9fIikpID09IE5VTEwgfHwKKyAgICAgICAgIVB5U3RyaW5nX0NoZWNrKG5hbWVvYmopKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLCAibmFtZWxlc3MgbW9kdWxlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlTdHJpbmdfQXNTdHJpbmcobmFtZW9iaik7CiB9CiAKIGNoYXIgKgogUHlNb2R1bGVfR2V0RmlsZW5hbWUoUHlPYmplY3QgKm0pCiB7Ci0JUHlPYmplY3QgKmQ7Ci0JUHlPYmplY3QgKmZpbGVvYmo7Ci0JaWYgKCFQeU1vZHVsZV9DaGVjayhtKSkgewotCQlQeUVycl9CYWRBcmd1bWVudCgpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZCA9ICgoUHlNb2R1bGVPYmplY3QgKiltKS0+bWRfZGljdDsKLQlpZiAoZCA9PSBOVUxMIHx8Ci0JICAgIChmaWxlb2JqID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoZCwgIl9fZmlsZV9fIikpID09IE5VTEwgfHwKLQkgICAgIVB5U3RyaW5nX0NoZWNrKGZpbGVvYmopKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLCAibW9kdWxlIGZpbGVuYW1lIG1pc3NpbmciKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBQeVN0cmluZ19Bc1N0cmluZyhmaWxlb2JqKTsKKyAgICBQeU9iamVjdCAqZDsKKyAgICBQeU9iamVjdCAqZmlsZW9iajsKKyAgICBpZiAoIVB5TW9kdWxlX0NoZWNrKG0pKSB7CisgICAgICAgIFB5RXJyX0JhZEFyZ3VtZW50KCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBkID0gKChQeU1vZHVsZU9iamVjdCAqKW0pLT5tZF9kaWN0OworICAgIGlmIChkID09IE5VTEwgfHwKKyAgICAgICAgKGZpbGVvYmogPSBQeURpY3RfR2V0SXRlbVN0cmluZyhkLCAiX19maWxlX18iKSkgPT0gTlVMTCB8fAorICAgICAgICAhUHlTdHJpbmdfQ2hlY2soZmlsZW9iaikpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsICJtb2R1bGUgZmlsZW5hbWUgbWlzc2luZyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIFB5U3RyaW5nX0FzU3RyaW5nKGZpbGVvYmopOwogfQogCiB2b2lkCiBfUHlNb2R1bGVfQ2xlYXIoUHlPYmplY3QgKm0pCiB7Ci0JLyogVG8gbWFrZSB0aGUgZXhlY3V0aW9uIG9yZGVyIG9mIGRlc3RydWN0b3JzIGZvciBnbG9iYWwKLQkgICBvYmplY3RzIGEgYml0IG1vcmUgcHJlZGljdGFibGUsIHdlIGZpcnN0IHphcCBhbGwgb2JqZWN0cwotCSAgIHdob3NlIG5hbWUgc3RhcnRzIHdpdGggYSBzaW5nbGUgdW5kZXJzY29yZSwgYmVmb3JlIHdlIGNsZWFyCi0JICAgdGhlIGVudGlyZSBkaWN0aW9uYXJ5LiAgV2UgemFwIHRoZW0gYnkgcmVwbGFjaW5nIHRoZW0gd2l0aAotCSAgIE5vbmUsIHJhdGhlciB0aGFuIGRlbGV0aW5nIHRoZW0gZnJvbSB0aGUgZGljdGlvbmFyeSwgdG8KLQkgICBhdm9pZCByZWhhc2hpbmcgdGhlIGRpY3Rpb25hcnkgKHRvIHNvbWUgZXh0ZW50KS4gKi8KKyAgICAvKiBUbyBtYWtlIHRoZSBleGVjdXRpb24gb3JkZXIgb2YgZGVzdHJ1Y3RvcnMgZm9yIGdsb2JhbAorICAgICAgIG9iamVjdHMgYSBiaXQgbW9yZSBwcmVkaWN0YWJsZSwgd2UgZmlyc3QgemFwIGFsbCBvYmplY3RzCisgICAgICAgd2hvc2UgbmFtZSBzdGFydHMgd2l0aCBhIHNpbmdsZSB1bmRlcnNjb3JlLCBiZWZvcmUgd2UgY2xlYXIKKyAgICAgICB0aGUgZW50aXJlIGRpY3Rpb25hcnkuICBXZSB6YXAgdGhlbSBieSByZXBsYWNpbmcgdGhlbSB3aXRoCisgICAgICAgTm9uZSwgcmF0aGVyIHRoYW4gZGVsZXRpbmcgdGhlbSBmcm9tIHRoZSBkaWN0aW9uYXJ5LCB0bworICAgICAgIGF2b2lkIHJlaGFzaGluZyB0aGUgZGljdGlvbmFyeSAodG8gc29tZSBleHRlbnQpLiAqLwogCi0JUHlfc3NpemVfdCBwb3M7Ci0JUHlPYmplY3QgKmtleSwgKnZhbHVlOwotCVB5T2JqZWN0ICpkOworICAgIFB5X3NzaXplX3QgcG9zOworICAgIFB5T2JqZWN0ICprZXksICp2YWx1ZTsKKyAgICBQeU9iamVjdCAqZDsKIAotCWQgPSAoKFB5TW9kdWxlT2JqZWN0ICopbSktPm1kX2RpY3Q7Ci0JaWYgKGQgPT0gTlVMTCkKLQkJcmV0dXJuOworICAgIGQgPSAoKFB5TW9kdWxlT2JqZWN0ICopbSktPm1kX2RpY3Q7CisgICAgaWYgKGQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOwogCi0JLyogRmlyc3QsIGNsZWFyIG9ubHkgbmFtZXMgc3RhcnRpbmcgd2l0aCBhIHNpbmdsZSB1bmRlcnNjb3JlICovCi0JcG9zID0gMDsKLQl3aGlsZSAoUHlEaWN0X05leHQoZCwgJnBvcywgJmtleSwgJnZhbHVlKSkgewotCQlpZiAodmFsdWUgIT0gUHlfTm9uZSAmJiBQeVN0cmluZ19DaGVjayhrZXkpKSB7Ci0JCQljaGFyICpzID0gUHlTdHJpbmdfQXNTdHJpbmcoa2V5KTsKLQkJCWlmIChzWzBdID09ICdfJyAmJiBzWzFdICE9ICdfJykgewotCQkJCWlmIChQeV9WZXJib3NlRmxhZyA+IDEpCi0JCQkJICAgIFB5U3lzX1dyaXRlU3RkZXJyKCIjICAgY2xlYXJbMV0gJXNcbiIsIHMpOwotCQkJCVB5RGljdF9TZXRJdGVtKGQsIGtleSwgUHlfTm9uZSk7Ci0JCQl9Ci0JCX0KLQl9CisgICAgLyogRmlyc3QsIGNsZWFyIG9ubHkgbmFtZXMgc3RhcnRpbmcgd2l0aCBhIHNpbmdsZSB1bmRlcnNjb3JlICovCisgICAgcG9zID0gMDsKKyAgICB3aGlsZSAoUHlEaWN0X05leHQoZCwgJnBvcywgJmtleSwgJnZhbHVlKSkgeworICAgICAgICBpZiAodmFsdWUgIT0gUHlfTm9uZSAmJiBQeVN0cmluZ19DaGVjayhrZXkpKSB7CisgICAgICAgICAgICBjaGFyICpzID0gUHlTdHJpbmdfQXNTdHJpbmcoa2V5KTsKKyAgICAgICAgICAgIGlmIChzWzBdID09ICdfJyAmJiBzWzFdICE9ICdfJykgeworICAgICAgICAgICAgICAgIGlmIChQeV9WZXJib3NlRmxhZyA+IDEpCisgICAgICAgICAgICAgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCIjICAgY2xlYXJbMV0gJXNcbiIsIHMpOworICAgICAgICAgICAgICAgIFB5RGljdF9TZXRJdGVtKGQsIGtleSwgUHlfTm9uZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAKLQkvKiBOZXh0LCBjbGVhciBhbGwgbmFtZXMgZXhjZXB0IGZvciBfX2J1aWx0aW5zX18gKi8KLQlwb3MgPSAwOwotCXdoaWxlIChQeURpY3RfTmV4dChkLCAmcG9zLCAma2V5LCAmdmFsdWUpKSB7Ci0JCWlmICh2YWx1ZSAhPSBQeV9Ob25lICYmIFB5U3RyaW5nX0NoZWNrKGtleSkpIHsKLQkJCWNoYXIgKnMgPSBQeVN0cmluZ19Bc1N0cmluZyhrZXkpOwotCQkJaWYgKHNbMF0gIT0gJ18nIHx8IHN0cmNtcChzLCAiX19idWlsdGluc19fIikgIT0gMCkgewotCQkJCWlmIChQeV9WZXJib3NlRmxhZyA+IDEpCi0JCQkJICAgIFB5U3lzX1dyaXRlU3RkZXJyKCIjICAgY2xlYXJbMl0gJXNcbiIsIHMpOwotCQkJCVB5RGljdF9TZXRJdGVtKGQsIGtleSwgUHlfTm9uZSk7Ci0JCQl9Ci0JCX0KLQl9CisgICAgLyogTmV4dCwgY2xlYXIgYWxsIG5hbWVzIGV4Y2VwdCBmb3IgX19idWlsdGluc19fICovCisgICAgcG9zID0gMDsKKyAgICB3aGlsZSAoUHlEaWN0X05leHQoZCwgJnBvcywgJmtleSwgJnZhbHVlKSkgeworICAgICAgICBpZiAodmFsdWUgIT0gUHlfTm9uZSAmJiBQeVN0cmluZ19DaGVjayhrZXkpKSB7CisgICAgICAgICAgICBjaGFyICpzID0gUHlTdHJpbmdfQXNTdHJpbmcoa2V5KTsKKyAgICAgICAgICAgIGlmIChzWzBdICE9ICdfJyB8fCBzdHJjbXAocywgIl9fYnVpbHRpbnNfXyIpICE9IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoUHlfVmVyYm9zZUZsYWcgPiAxKQorICAgICAgICAgICAgICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigiIyAgIGNsZWFyWzJdICVzXG4iLCBzKTsKKyAgICAgICAgICAgICAgICBQeURpY3RfU2V0SXRlbShkLCBrZXksIFB5X05vbmUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogCi0JLyogTm90ZTogd2UgbGVhdmUgX19idWlsdGluc19fIGluIHBsYWNlLCBzbyB0aGF0IGRlc3RydWN0b3JzCi0JICAgb2Ygbm9uLWdsb2JhbCBvYmplY3RzIGRlZmluZWQgaW4gdGhpcyBtb2R1bGUgY2FuIHN0aWxsIHVzZQotCSAgIGJ1aWx0aW5zLCBpbiBwYXJ0aWN1bGFybHkgJ05vbmUnLiAqLworICAgIC8qIE5vdGU6IHdlIGxlYXZlIF9fYnVpbHRpbnNfXyBpbiBwbGFjZSwgc28gdGhhdCBkZXN0cnVjdG9ycworICAgICAgIG9mIG5vbi1nbG9iYWwgb2JqZWN0cyBkZWZpbmVkIGluIHRoaXMgbW9kdWxlIGNhbiBzdGlsbCB1c2UKKyAgICAgICBidWlsdGlucywgaW4gcGFydGljdWxhcmx5ICdOb25lJy4gKi8KIAogfQogCkBAIC0xNTEsNTMgKzE1MSw1MyBAQAogc3RhdGljIGludAogbW9kdWxlX2luaXQoUHlNb2R1bGVPYmplY3QgKm0sIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7Im5hbWUiLCAiZG9jIiwgTlVMTH07Ci0JUHlPYmplY3QgKmRpY3QsICpuYW1lID0gUHlfTm9uZSwgKmRvYyA9IFB5X05vbmU7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgIlN8Tzptb2R1bGUuX19pbml0X18iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrd2xpc3QsICZuYW1lLCAmZG9jKSkKLQkJcmV0dXJuIC0xOwotCWRpY3QgPSBtLT5tZF9kaWN0OwotCWlmIChkaWN0ID09IE5VTEwpIHsKLQkJZGljdCA9IFB5RGljdF9OZXcoKTsKLQkJaWYgKGRpY3QgPT0gTlVMTCkKLQkJCXJldHVybiAtMTsKLQkJbS0+bWRfZGljdCA9IGRpY3Q7Ci0JfQotCWlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCAiX19uYW1lX18iLCBuYW1lKSA8IDApCi0JCXJldHVybiAtMTsKLQlpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgIl9fZG9jX18iLCBkb2MpIDwgMCkKLQkJcmV0dXJuIC0xOwotCXJldHVybiAwOworICAgIHN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsibmFtZSIsICJkb2MiLCBOVUxMfTsKKyAgICBQeU9iamVjdCAqZGljdCwgKm5hbWUgPSBQeV9Ob25lLCAqZG9jID0gUHlfTm9uZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAiU3xPOm1vZHVsZS5fX2luaXRfXyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3dsaXN0LCAmbmFtZSwgJmRvYykpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBkaWN0ID0gbS0+bWRfZGljdDsKKyAgICBpZiAoZGljdCA9PSBOVUxMKSB7CisgICAgICAgIGRpY3QgPSBQeURpY3RfTmV3KCk7CisgICAgICAgIGlmIChkaWN0ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIG0tPm1kX2RpY3QgPSBkaWN0OworICAgIH0KKyAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgIl9fbmFtZV9fIiwgbmFtZSkgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsICJfX2RvY19fIiwgZG9jKSA8IDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQKIG1vZHVsZV9kZWFsbG9jKFB5TW9kdWxlT2JqZWN0ICptKQogewotCVB5T2JqZWN0X0dDX1VuVHJhY2sobSk7Ci0JaWYgKG0tPm1kX2RpY3QgIT0gTlVMTCkgewotCQlfUHlNb2R1bGVfQ2xlYXIoKFB5T2JqZWN0ICopbSk7Ci0JCVB5X0RFQ1JFRihtLT5tZF9kaWN0KTsKLQl9Ci0JUHlfVFlQRShtKS0+dHBfZnJlZSgoUHlPYmplY3QgKiltKTsKKyAgICBQeU9iamVjdF9HQ19VblRyYWNrKG0pOworICAgIGlmIChtLT5tZF9kaWN0ICE9IE5VTEwpIHsKKyAgICAgICAgX1B5TW9kdWxlX0NsZWFyKChQeU9iamVjdCAqKW0pOworICAgICAgICBQeV9ERUNSRUYobS0+bWRfZGljdCk7CisgICAgfQorICAgIFB5X1RZUEUobSktPnRwX2ZyZWUoKFB5T2JqZWN0ICopbSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBtb2R1bGVfcmVwcihQeU1vZHVsZU9iamVjdCAqbSkKIHsKLQljaGFyICpuYW1lOwotCWNoYXIgKmZpbGVuYW1lOworICAgIGNoYXIgKm5hbWU7CisgICAgY2hhciAqZmlsZW5hbWU7CiAKLQluYW1lID0gUHlNb2R1bGVfR2V0TmFtZSgoUHlPYmplY3QgKiltKTsKLQlpZiAobmFtZSA9PSBOVUxMKSB7Ci0JCVB5RXJyX0NsZWFyKCk7Ci0JCW5hbWUgPSAiPyI7Ci0JfQotCWZpbGVuYW1lID0gUHlNb2R1bGVfR2V0RmlsZW5hbWUoKFB5T2JqZWN0ICopbSk7Ci0JaWYgKGZpbGVuYW1lID09IE5VTEwpIHsKLQkJUHlFcnJfQ2xlYXIoKTsKLQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21Gb3JtYXQoIjxtb2R1bGUgJyVzJyAoYnVpbHQtaW4pPiIsIG5hbWUpOwotCX0KLQlyZXR1cm4gUHlTdHJpbmdfRnJvbUZvcm1hdCgiPG1vZHVsZSAnJXMnIGZyb20gJyVzJz4iLCBuYW1lLCBmaWxlbmFtZSk7CisgICAgbmFtZSA9IFB5TW9kdWxlX0dldE5hbWUoKFB5T2JqZWN0ICopbSk7CisgICAgaWYgKG5hbWUgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBuYW1lID0gIj8iOworICAgIH0KKyAgICBmaWxlbmFtZSA9IFB5TW9kdWxlX0dldEZpbGVuYW1lKChQeU9iamVjdCAqKW0pOworICAgIGlmIChmaWxlbmFtZSA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tRm9ybWF0KCI8bW9kdWxlICclcycgKGJ1aWx0LWluKT4iLCBuYW1lKTsKKyAgICB9CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21Gb3JtYXQoIjxtb2R1bGUgJyVzJyBmcm9tICclcyc+IiwgbmFtZSwgZmlsZW5hbWUpOwogfQogCiAvKiBXZSBvbmx5IG5lZWQgYSB0cmF2ZXJzZSBmdW5jdGlvbiwgbm8gY2xlYXIgZnVuY3Rpb246IElmIHRoZSBtb2R1bGUKQEAgLTIwNiw4ICsyMDYsOCBAQAogc3RhdGljIGludAogbW9kdWxlX3RyYXZlcnNlKFB5TW9kdWxlT2JqZWN0ICptLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlQeV9WSVNJVChtLT5tZF9kaWN0KTsKLQlyZXR1cm4gMDsKKyAgICBQeV9WSVNJVChtLT5tZF9kaWN0KTsKKyAgICByZXR1cm4gMDsKIH0KIAogUHlEb2NfU1RSVkFSKG1vZHVsZV9kb2MsCkBAIC0yMTcsNDQgKzIxNyw0NCBAQAogVGhlIG5hbWUgbXVzdCBiZSBhIHN0cmluZzsgdGhlIG9wdGlvbmFsIGRvYyBhcmd1bWVudCBjYW4gaGF2ZSBhbnkgdHlwZS4iKTsKIAogUHlUeXBlT2JqZWN0IFB5TW9kdWxlX1R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKLQkibW9kdWxlIiwJCQkJLyogdHBfbmFtZSAqLwotCXNpemVvZihQeU1vZHVsZU9iamVjdCksCQkJLyogdHBfc2l6ZSAqLwotCTAsCQkJCQkvKiB0cF9pdGVtc2l6ZSAqLwotCShkZXN0cnVjdG9yKW1vZHVsZV9kZWFsbG9jLAkJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfY29tcGFyZSAqLwotCShyZXByZnVuYyltb2R1bGVfcmVwciwJCQkvKiB0cF9yZXByICovCi0JMCwJCQkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJCQkJCS8qIHRwX2hhc2ggKi8KLQkwLAkJCQkJLyogdHBfY2FsbCAqLwotCTAsCQkJCQkvKiB0cF9zdHIgKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJCS8qIHRwX2dldGF0dHJvICovCi0JUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MgfAotCQlQeV9UUEZMQUdTX0JBU0VUWVBFLAkJLyogdHBfZmxhZ3MgKi8KLQltb2R1bGVfZG9jLAkJCQkvKiB0cF9kb2MgKi8KLQkodHJhdmVyc2Vwcm9jKW1vZHVsZV90cmF2ZXJzZSwJCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkJLyogdHBfaXRlcm5leHQgKi8KLQkwLAkJCQkJLyogdHBfbWV0aG9kcyAqLwotCW1vZHVsZV9tZW1iZXJzLAkJCQkvKiB0cF9tZW1iZXJzICovCi0JMCwJCQkJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJCS8qIHRwX2RpY3QgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCW9mZnNldG9mKFB5TW9kdWxlT2JqZWN0LCBtZF9kaWN0KSwJLyogdHBfZGljdG9mZnNldCAqLwotCShpbml0cHJvYyltb2R1bGVfaW5pdCwJCQkvKiB0cF9pbml0ICovCi0JUHlUeXBlX0dlbmVyaWNBbGxvYywJCQkvKiB0cF9hbGxvYyAqLwotCVB5VHlwZV9HZW5lcmljTmV3LAkJCS8qIHRwX25ldyAqLwotCVB5T2JqZWN0X0dDX0RlbCwJCSAgICAgICAgLyogdHBfZnJlZSAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCisgICAgIm1vZHVsZSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCisgICAgc2l6ZW9mKFB5TW9kdWxlT2JqZWN0KSwgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIChkZXN0cnVjdG9yKW1vZHVsZV9kZWFsbG9jLCAgICAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAocmVwcmZ1bmMpbW9kdWxlX3JlcHIsICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MgfAorICAgICAgICBQeV9UUEZMQUdTX0JBU0VUWVBFLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICBtb2R1bGVfZG9jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2MpbW9kdWxlX3RyYXZlcnNlLCAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgbW9kdWxlX21lbWJlcnMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgb2Zmc2V0b2YoUHlNb2R1bGVPYmplY3QsIG1kX2RpY3QpLCAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgKGluaXRwcm9jKW1vZHVsZV9pbml0LCAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgUHlUeXBlX0dlbmVyaWNBbGxvYywgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIFB5VHlwZV9HZW5lcmljTmV3LCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgUHlPYmplY3RfR0NfRGVsLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCiB9OwpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9vYmplY3QuYyBiL09iamVjdHMvb2JqZWN0LmMKaW5kZXggMGU5N2U4Yy4uNDI0ZjM1MyAxMDA2NDQKLS0tIGEvT2JqZWN0cy9vYmplY3QuYworKysgYi9PYmplY3RzL29iamVjdC5jCkBAIC0xNCwxOCArMTQsMTggQEAKIFB5X3NzaXplX3QKIF9QeV9HZXRSZWZUb3RhbCh2b2lkKQogewotCVB5T2JqZWN0ICpvOwotCVB5X3NzaXplX3QgdG90YWwgPSBfUHlfUmVmVG90YWw7Ci0gICAgICAgIC8qIGlnbm9yZSB0aGUgcmVmZXJlbmNlcyB0byB0aGUgZHVtbXkgb2JqZWN0IG9mIHRoZSBkaWN0cyBhbmQgc2V0cwotICAgICAgICAgICBiZWNhdXNlIHRoZXkgYXJlIG5vdCByZWxpYWJsZSBhbmQgbm90IHVzZWZ1bCAobm93IHRoYXQgdGhlCi0gICAgICAgICAgIGhhc2ggdGFibGUgY29kZSBpcyB3ZWxsLXRlc3RlZCkgKi8KLQlvID0gX1B5RGljdF9EdW1teSgpOwotCWlmIChvICE9IE5VTEwpCi0JCXRvdGFsIC09IG8tPm9iX3JlZmNudDsKLQlvID0gX1B5U2V0X0R1bW15KCk7Ci0JaWYgKG8gIT0gTlVMTCkKLQkJdG90YWwgLT0gby0+b2JfcmVmY250OwotCXJldHVybiB0b3RhbDsKKyAgICBQeU9iamVjdCAqbzsKKyAgICBQeV9zc2l6ZV90IHRvdGFsID0gX1B5X1JlZlRvdGFsOworICAgIC8qIGlnbm9yZSB0aGUgcmVmZXJlbmNlcyB0byB0aGUgZHVtbXkgb2JqZWN0IG9mIHRoZSBkaWN0cyBhbmQgc2V0cworICAgICAgIGJlY2F1c2UgdGhleSBhcmUgbm90IHJlbGlhYmxlIGFuZCBub3QgdXNlZnVsIChub3cgdGhhdCB0aGUKKyAgICAgICBoYXNoIHRhYmxlIGNvZGUgaXMgd2VsbC10ZXN0ZWQpICovCisgICAgbyA9IF9QeURpY3RfRHVtbXkoKTsKKyAgICBpZiAobyAhPSBOVUxMKQorICAgICAgICB0b3RhbCAtPSBvLT5vYl9yZWZjbnQ7CisgICAgbyA9IF9QeVNldF9EdW1teSgpOworICAgIGlmIChvICE9IE5VTEwpCisgICAgICAgIHRvdGFsIC09IG8tPm9iX3JlZmNudDsKKyAgICByZXR1cm4gdG90YWw7CiB9CiAjZW5kaWYgLyogUHlfUkVGX0RFQlVHICovCiAKQEAgLTU4LDIxICs1OCwyMSBAQAogX1B5X0FkZFRvQWxsT2JqZWN0cyhQeU9iamVjdCAqb3AsIGludCBmb3JjZSkKIHsKICNpZmRlZiAgUHlfREVCVUcKLQlpZiAoIWZvcmNlKSB7Ci0JCS8qIElmIGl0J3MgaW5pdGlhbGl6ZWQgbWVtb3J5LCBvcCBtdXN0IGJlIGluIG9yIG91dCBvZgotCQkgKiB0aGUgbGlzdCB1bmFtYmlndW91c2x5LgotCQkgKi8KLQkJYXNzZXJ0KChvcC0+X29iX3ByZXYgPT0gTlVMTCkgPT0gKG9wLT5fb2JfbmV4dCA9PSBOVUxMKSk7Ci0JfQorICAgIGlmICghZm9yY2UpIHsKKyAgICAgICAgLyogSWYgaXQncyBpbml0aWFsaXplZCBtZW1vcnksIG9wIG11c3QgYmUgaW4gb3Igb3V0IG9mCisgICAgICAgICAqIHRoZSBsaXN0IHVuYW1iaWd1b3VzbHkuCisgICAgICAgICAqLworICAgICAgICBhc3NlcnQoKG9wLT5fb2JfcHJldiA9PSBOVUxMKSA9PSAob3AtPl9vYl9uZXh0ID09IE5VTEwpKTsKKyAgICB9CiAjZW5kaWYKLQlpZiAoZm9yY2UgfHwgb3AtPl9vYl9wcmV2ID09IE5VTEwpIHsKLQkJb3AtPl9vYl9uZXh0ID0gcmVmY2hhaW4uX29iX25leHQ7Ci0JCW9wLT5fb2JfcHJldiA9ICZyZWZjaGFpbjsKLQkJcmVmY2hhaW4uX29iX25leHQtPl9vYl9wcmV2ID0gb3A7Ci0JCXJlZmNoYWluLl9vYl9uZXh0ID0gb3A7Ci0JfQorICAgIGlmIChmb3JjZSB8fCBvcC0+X29iX3ByZXYgPT0gTlVMTCkgeworICAgICAgICBvcC0+X29iX25leHQgPSByZWZjaGFpbi5fb2JfbmV4dDsKKyAgICAgICAgb3AtPl9vYl9wcmV2ID0gJnJlZmNoYWluOworICAgICAgICByZWZjaGFpbi5fb2JfbmV4dC0+X29iX3ByZXYgPSBvcDsKKyAgICAgICAgcmVmY2hhaW4uX29iX25leHQgPSBvcDsKKyAgICB9CiB9Ci0jZW5kaWYJLyogUHlfVFJBQ0VfUkVGUyAqLworI2VuZGlmICAvKiBQeV9UUkFDRV9SRUZTICovCiAKICNpZmRlZiBDT1VOVF9BTExPQ1MKIHN0YXRpYyBQeVR5cGVPYmplY3QgKnR5cGVfbGlzdDsKQEAgLTg5LDk0ICs4OSw5NCBAQAogdm9pZAogZHVtcF9jb3VudHMoRklMRSogZikKIHsKLQlQeVR5cGVPYmplY3QgKnRwOworICAgIFB5VHlwZU9iamVjdCAqdHA7CiAKLQlmb3IgKHRwID0gdHlwZV9saXN0OyB0cDsgdHAgPSB0cC0+dHBfbmV4dCkKLQkJZnByaW50ZihmLCAiJXMgYWxsb2MnZDogJWQsIGZyZWVkOiAlZCwgbWF4IGluIHVzZTogJWRcbiIsCi0JCQl0cC0+dHBfbmFtZSwgdHAtPnRwX2FsbG9jcywgdHAtPnRwX2ZyZWVzLAotCQkJdHAtPnRwX21heGFsbG9jKTsKLQlmcHJpbnRmKGYsICJmYXN0IHR1cGxlIGFsbG9jczogJWQsIGVtcHR5OiAlZFxuIiwKLQkJZmFzdF90dXBsZV9hbGxvY3MsIHR1cGxlX3plcm9fYWxsb2NzKTsKLQlmcHJpbnRmKGYsICJmYXN0IGludCBhbGxvY3M6IHBvczogJWQsIG5lZzogJWRcbiIsCi0JCXF1aWNrX2ludF9hbGxvY3MsIHF1aWNrX25lZ19pbnRfYWxsb2NzKTsKLQlmcHJpbnRmKGYsICJudWxsIHN0cmluZ3M6ICVkLCAxLXN0cmluZ3M6ICVkXG4iLAotCQludWxsX3N0cmluZ3MsIG9uZV9zdHJpbmdzKTsKKyAgICBmb3IgKHRwID0gdHlwZV9saXN0OyB0cDsgdHAgPSB0cC0+dHBfbmV4dCkKKyAgICAgICAgZnByaW50ZihmLCAiJXMgYWxsb2MnZDogJWQsIGZyZWVkOiAlZCwgbWF4IGluIHVzZTogJWRcbiIsCisgICAgICAgICAgICB0cC0+dHBfbmFtZSwgdHAtPnRwX2FsbG9jcywgdHAtPnRwX2ZyZWVzLAorICAgICAgICAgICAgdHAtPnRwX21heGFsbG9jKTsKKyAgICBmcHJpbnRmKGYsICJmYXN0IHR1cGxlIGFsbG9jczogJWQsIGVtcHR5OiAlZFxuIiwKKyAgICAgICAgZmFzdF90dXBsZV9hbGxvY3MsIHR1cGxlX3plcm9fYWxsb2NzKTsKKyAgICBmcHJpbnRmKGYsICJmYXN0IGludCBhbGxvY3M6IHBvczogJWQsIG5lZzogJWRcbiIsCisgICAgICAgIHF1aWNrX2ludF9hbGxvY3MsIHF1aWNrX25lZ19pbnRfYWxsb2NzKTsKKyAgICBmcHJpbnRmKGYsICJudWxsIHN0cmluZ3M6ICVkLCAxLXN0cmluZ3M6ICVkXG4iLAorICAgICAgICBudWxsX3N0cmluZ3MsIG9uZV9zdHJpbmdzKTsKIH0KIAogUHlPYmplY3QgKgogZ2V0X2NvdW50cyh2b2lkKQogewotCVB5VHlwZU9iamVjdCAqdHA7Ci0JUHlPYmplY3QgKnJlc3VsdDsKLQlQeU9iamVjdCAqdjsKKyAgICBQeVR5cGVPYmplY3QgKnRwOworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisgICAgUHlPYmplY3QgKnY7CiAKLQlyZXN1bHQgPSBQeUxpc3RfTmV3KDApOwotCWlmIChyZXN1bHQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JZm9yICh0cCA9IHR5cGVfbGlzdDsgdHA7IHRwID0gdHAtPnRwX25leHQpIHsKLQkJdiA9IFB5X0J1aWxkVmFsdWUoIihzbm5uKSIsIHRwLT50cF9uYW1lLCB0cC0+dHBfYWxsb2NzLAotCQkJCSAgdHAtPnRwX2ZyZWVzLCB0cC0+dHBfbWF4YWxsb2MpOwotCQlpZiAodiA9PSBOVUxMKSB7Ci0JCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWlmIChQeUxpc3RfQXBwZW5kKHJlc3VsdCwgdikgPCAwKSB7Ci0JCQlQeV9ERUNSRUYodik7Ci0JCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCVB5X0RFQ1JFRih2KTsKLQl9Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICByZXN1bHQgPSBQeUxpc3RfTmV3KDApOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZm9yICh0cCA9IHR5cGVfbGlzdDsgdHA7IHRwID0gdHAtPnRwX25leHQpIHsKKyAgICAgICAgdiA9IFB5X0J1aWxkVmFsdWUoIihzbm5uKSIsIHRwLT50cF9uYW1lLCB0cC0+dHBfYWxsb2NzLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0cC0+dHBfZnJlZXMsIHRwLT50cF9tYXhhbGxvYyk7CisgICAgICAgIGlmICh2ID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKFB5TGlzdF9BcHBlbmQocmVzdWx0LCB2KSA8IDApIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgUHlfREVDUkVGKHYpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiB2b2lkCiBpbmNfY291bnQoUHlUeXBlT2JqZWN0ICp0cCkKIHsKLQlpZiAodHAtPnRwX25leHQgPT0gTlVMTCAmJiB0cC0+dHBfcHJldiA9PSBOVUxMKSB7Ci0JCS8qIGZpcnN0IHRpbWU7IGluc2VydCBpbiBsaW5rZWQgbGlzdCAqLwotCQlpZiAodHAtPnRwX25leHQgIT0gTlVMTCkgLyogc2FuaXR5IGNoZWNrICovCi0JCQlQeV9GYXRhbEVycm9yKCJYWFggaW5jX2NvdW50IHNhbml0eSBjaGVjayIpOwotCQlpZiAodHlwZV9saXN0KQotCQkJdHlwZV9saXN0LT50cF9wcmV2ID0gdHA7Ci0JCXRwLT50cF9uZXh0ID0gdHlwZV9saXN0OwotCQkvKiBOb3RlIHRoYXQgYXMgb2YgUHl0aG9uIDIuMiwgaGVhcC1hbGxvY2F0ZWQgdHlwZSBvYmplY3RzCi0JCSAqIGNhbiBnbyBhd2F5LCBidXQgdGhpcyBjb2RlIHJlcXVpcmVzIHRoYXQgdGhleSBzdGF5IGFsaXZlCi0JCSAqIHVudGlsIHByb2dyYW0gZXhpdC4gIFRoYXQncyB3aHkgd2UncmUgY2FyZWZ1bCB3aXRoCi0JCSAqIHJlZmNvdW50cyBoZXJlLiAgdHlwZV9saXN0IGdldHMgYSBuZXcgcmVmZXJlbmNlIHRvIHRwLAotCQkgKiB3aGlsZSBvd25lcnNoaXAgb2YgdGhlIHJlZmVyZW5jZSB0eXBlX2xpc3QgdXNlZCB0byBob2xkCi0JCSAqIChpZiBhbnkpIHdhcyB0cmFuc2ZlcnJlZCB0byB0cC0+dHBfbmV4dCBpbiB0aGUgbGluZSBhYm92ZS4KLQkJICogdHAgaXMgdGh1cyBlZmZlY3RpdmVseSBpbW1vcnRhbCBhZnRlciB0aGlzLgotCQkgKi8KLQkJUHlfSU5DUkVGKHRwKTsKLQkJdHlwZV9saXN0ID0gdHA7CisgICAgaWYgKHRwLT50cF9uZXh0ID09IE5VTEwgJiYgdHAtPnRwX3ByZXYgPT0gTlVMTCkgeworICAgICAgICAvKiBmaXJzdCB0aW1lOyBpbnNlcnQgaW4gbGlua2VkIGxpc3QgKi8KKyAgICAgICAgaWYgKHRwLT50cF9uZXh0ICE9IE5VTEwpIC8qIHNhbml0eSBjaGVjayAqLworICAgICAgICAgICAgUHlfRmF0YWxFcnJvcigiWFhYIGluY19jb3VudCBzYW5pdHkgY2hlY2siKTsKKyAgICAgICAgaWYgKHR5cGVfbGlzdCkKKyAgICAgICAgICAgIHR5cGVfbGlzdC0+dHBfcHJldiA9IHRwOworICAgICAgICB0cC0+dHBfbmV4dCA9IHR5cGVfbGlzdDsKKyAgICAgICAgLyogTm90ZSB0aGF0IGFzIG9mIFB5dGhvbiAyLjIsIGhlYXAtYWxsb2NhdGVkIHR5cGUgb2JqZWN0cworICAgICAgICAgKiBjYW4gZ28gYXdheSwgYnV0IHRoaXMgY29kZSByZXF1aXJlcyB0aGF0IHRoZXkgc3RheSBhbGl2ZQorICAgICAgICAgKiB1bnRpbCBwcm9ncmFtIGV4aXQuICBUaGF0J3Mgd2h5IHdlJ3JlIGNhcmVmdWwgd2l0aAorICAgICAgICAgKiByZWZjb3VudHMgaGVyZS4gIHR5cGVfbGlzdCBnZXRzIGEgbmV3IHJlZmVyZW5jZSB0byB0cCwKKyAgICAgICAgICogd2hpbGUgb3duZXJzaGlwIG9mIHRoZSByZWZlcmVuY2UgdHlwZV9saXN0IHVzZWQgdG8gaG9sZAorICAgICAgICAgKiAoaWYgYW55KSB3YXMgdHJhbnNmZXJyZWQgdG8gdHAtPnRwX25leHQgaW4gdGhlIGxpbmUgYWJvdmUuCisgICAgICAgICAqIHRwIGlzIHRodXMgZWZmZWN0aXZlbHkgaW1tb3J0YWwgYWZ0ZXIgdGhpcy4KKyAgICAgICAgICovCisgICAgICAgIFB5X0lOQ1JFRih0cCk7CisgICAgICAgIHR5cGVfbGlzdCA9IHRwOwogI2lmZGVmIFB5X1RSQUNFX1JFRlMKLQkJLyogQWxzbyBpbnNlcnQgaW4gdGhlIGRvdWJseS1saW5rZWQgbGlzdCBvZiBhbGwgb2JqZWN0cywKLQkJICogaWYgbm90IGFscmVhZHkgdGhlcmUuCi0JCSAqLwotCQlfUHlfQWRkVG9BbGxPYmplY3RzKChQeU9iamVjdCAqKXRwLCAwKTsKKyAgICAgICAgLyogQWxzbyBpbnNlcnQgaW4gdGhlIGRvdWJseS1saW5rZWQgbGlzdCBvZiBhbGwgb2JqZWN0cywKKyAgICAgICAgICogaWYgbm90IGFscmVhZHkgdGhlcmUuCisgICAgICAgICAqLworICAgICAgICBfUHlfQWRkVG9BbGxPYmplY3RzKChQeU9iamVjdCAqKXRwLCAwKTsKICNlbmRpZgotCX0KLQl0cC0+dHBfYWxsb2NzKys7Ci0JaWYgKHRwLT50cF9hbGxvY3MgLSB0cC0+dHBfZnJlZXMgPiB0cC0+dHBfbWF4YWxsb2MpCi0JCXRwLT50cF9tYXhhbGxvYyA9IHRwLT50cF9hbGxvY3MgLSB0cC0+dHBfZnJlZXM7CisgICAgfQorICAgIHRwLT50cF9hbGxvY3MrKzsKKyAgICBpZiAodHAtPnRwX2FsbG9jcyAtIHRwLT50cF9mcmVlcyA+IHRwLT50cF9tYXhhbGxvYykKKyAgICAgICAgdHAtPnRwX21heGFsbG9jID0gdHAtPnRwX2FsbG9jcyAtIHRwLT50cF9mcmVlczsKIH0KIAogdm9pZCBkZWNfY291bnQoUHlUeXBlT2JqZWN0ICp0cCkKIHsKLQl0cC0+dHBfZnJlZXMrKzsKLQlpZiAodW5saXN0X3R5cGVzX3dpdGhvdXRfb2JqZWN0cyAmJgotCSAgICB0cC0+dHBfYWxsb2NzID09IHRwLT50cF9mcmVlcykgewotCQkvKiB1bmxpbmsgdGhlIHR5cGUgZnJvbSB0eXBlX2xpc3QgKi8KLQkJaWYgKHRwLT50cF9wcmV2KQotCQkJdHAtPnRwX3ByZXYtPnRwX25leHQgPSB0cC0+dHBfbmV4dDsKLQkJZWxzZQotCQkJdHlwZV9saXN0ID0gdHAtPnRwX25leHQ7Ci0JCWlmICh0cC0+dHBfbmV4dCkKLQkJCXRwLT50cF9uZXh0LT50cF9wcmV2ID0gdHAtPnRwX3ByZXY7Ci0JCXRwLT50cF9uZXh0ID0gdHAtPnRwX3ByZXYgPSBOVUxMOwotCQlQeV9ERUNSRUYodHApOwotCX0KKyAgICB0cC0+dHBfZnJlZXMrKzsKKyAgICBpZiAodW5saXN0X3R5cGVzX3dpdGhvdXRfb2JqZWN0cyAmJgorICAgICAgICB0cC0+dHBfYWxsb2NzID09IHRwLT50cF9mcmVlcykgeworICAgICAgICAvKiB1bmxpbmsgdGhlIHR5cGUgZnJvbSB0eXBlX2xpc3QgKi8KKyAgICAgICAgaWYgKHRwLT50cF9wcmV2KQorICAgICAgICAgICAgdHAtPnRwX3ByZXYtPnRwX25leHQgPSB0cC0+dHBfbmV4dDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdHlwZV9saXN0ID0gdHAtPnRwX25leHQ7CisgICAgICAgIGlmICh0cC0+dHBfbmV4dCkKKyAgICAgICAgICAgIHRwLT50cF9uZXh0LT50cF9wcmV2ID0gdHAtPnRwX3ByZXY7CisgICAgICAgIHRwLT50cF9uZXh0ID0gdHAtPnRwX3ByZXYgPSBOVUxMOworICAgICAgICBQeV9ERUNSRUYodHApOworICAgIH0KIH0KIAogI2VuZGlmCkBAIC0xODYsMTMgKzE4NiwxMyBAQAogdm9pZAogX1B5X05lZ2F0aXZlUmVmY291bnQoY29uc3QgY2hhciAqZm5hbWUsIGludCBsaW5lbm8sIFB5T2JqZWN0ICpvcCkKIHsKLQljaGFyIGJ1ZlszMDBdOworICAgIGNoYXIgYnVmWzMwMF07CiAKLQlQeU9TX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksCi0JCSAgICAgICIlczolaSBvYmplY3QgYXQgJXAgaGFzIG5lZ2F0aXZlIHJlZiBjb3VudCAiCi0JCSAgICAgICIlIiBQWV9GT1JNQVRfU0laRV9UICJkIiwKLQkJICAgICAgZm5hbWUsIGxpbmVubywgb3AsIG9wLT5vYl9yZWZjbnQpOwotCVB5X0ZhdGFsRXJyb3IoYnVmKTsKKyAgICBQeU9TX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksCisgICAgICAgICAgICAgICAgICAiJXM6JWkgb2JqZWN0IGF0ICVwIGhhcyBuZWdhdGl2ZSByZWYgY291bnQgIgorICAgICAgICAgICAgICAgICAgIiUiIFBZX0ZPUk1BVF9TSVpFX1QgImQiLAorICAgICAgICAgICAgICAgICAgZm5hbWUsIGxpbmVubywgb3AsIG9wLT5vYl9yZWZjbnQpOworICAgIFB5X0ZhdGFsRXJyb3IoYnVmKTsKIH0KIAogI2VuZGlmIC8qIFB5X1JFRl9ERUJVRyAqLwpAQCAtMjEyLDQ1ICsyMTIsNDUgQEAKIFB5T2JqZWN0ICoKIFB5T2JqZWN0X0luaXQoUHlPYmplY3QgKm9wLCBQeVR5cGVPYmplY3QgKnRwKQogewotCWlmIChvcCA9PSBOVUxMKQotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQkvKiBBbnkgY2hhbmdlcyBzaG91bGQgYmUgcmVmbGVjdGVkIGluIFB5T2JqZWN0X0lOSVQgKG9iamltcGwuaCkgKi8KLQlQeV9UWVBFKG9wKSA9IHRwOwotCV9QeV9OZXdSZWZlcmVuY2Uob3ApOwotCXJldHVybiBvcDsKKyAgICBpZiAob3AgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgLyogQW55IGNoYW5nZXMgc2hvdWxkIGJlIHJlZmxlY3RlZCBpbiBQeU9iamVjdF9JTklUIChvYmppbXBsLmgpICovCisgICAgUHlfVFlQRShvcCkgPSB0cDsKKyAgICBfUHlfTmV3UmVmZXJlbmNlKG9wKTsKKyAgICByZXR1cm4gb3A7CiB9CiAKIFB5VmFyT2JqZWN0ICoKIFB5T2JqZWN0X0luaXRWYXIoUHlWYXJPYmplY3QgKm9wLCBQeVR5cGVPYmplY3QgKnRwLCBQeV9zc2l6ZV90IHNpemUpCiB7Ci0JaWYgKG9wID09IE5VTEwpCi0JCXJldHVybiAoUHlWYXJPYmplY3QgKikgUHlFcnJfTm9NZW1vcnkoKTsKLQkvKiBBbnkgY2hhbmdlcyBzaG91bGQgYmUgcmVmbGVjdGVkIGluIFB5T2JqZWN0X0lOSVRfVkFSICovCi0Jb3AtPm9iX3NpemUgPSBzaXplOwotCVB5X1RZUEUob3ApID0gdHA7Ci0JX1B5X05ld1JlZmVyZW5jZSgoUHlPYmplY3QgKilvcCk7Ci0JcmV0dXJuIG9wOworICAgIGlmIChvcCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gKFB5VmFyT2JqZWN0ICopIFB5RXJyX05vTWVtb3J5KCk7CisgICAgLyogQW55IGNoYW5nZXMgc2hvdWxkIGJlIHJlZmxlY3RlZCBpbiBQeU9iamVjdF9JTklUX1ZBUiAqLworICAgIG9wLT5vYl9zaXplID0gc2l6ZTsKKyAgICBQeV9UWVBFKG9wKSA9IHRwOworICAgIF9QeV9OZXdSZWZlcmVuY2UoKFB5T2JqZWN0ICopb3ApOworICAgIHJldHVybiBvcDsKIH0KIAogUHlPYmplY3QgKgogX1B5T2JqZWN0X05ldyhQeVR5cGVPYmplY3QgKnRwKQogewotCVB5T2JqZWN0ICpvcDsKLQlvcCA9IChQeU9iamVjdCAqKSBQeU9iamVjdF9NQUxMT0MoX1B5T2JqZWN0X1NJWkUodHApKTsKLQlpZiAob3AgPT0gTlVMTCkKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JcmV0dXJuIFB5T2JqZWN0X0lOSVQob3AsIHRwKTsKKyAgICBQeU9iamVjdCAqb3A7CisgICAgb3AgPSAoUHlPYmplY3QgKikgUHlPYmplY3RfTUFMTE9DKF9QeU9iamVjdF9TSVpFKHRwKSk7CisgICAgaWYgKG9wID09IE5VTEwpCisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIHJldHVybiBQeU9iamVjdF9JTklUKG9wLCB0cCk7CiB9CiAKIFB5VmFyT2JqZWN0ICoKIF9QeU9iamVjdF9OZXdWYXIoUHlUeXBlT2JqZWN0ICp0cCwgUHlfc3NpemVfdCBuaXRlbXMpCiB7Ci0JUHlWYXJPYmplY3QgKm9wOwotCWNvbnN0IHNpemVfdCBzaXplID0gX1B5T2JqZWN0X1ZBUl9TSVpFKHRwLCBuaXRlbXMpOwotCW9wID0gKFB5VmFyT2JqZWN0ICopIFB5T2JqZWN0X01BTExPQyhzaXplKTsKLQlpZiAob3AgPT0gTlVMTCkKLQkJcmV0dXJuIChQeVZhck9iamVjdCAqKVB5RXJyX05vTWVtb3J5KCk7Ci0JcmV0dXJuIFB5T2JqZWN0X0lOSVRfVkFSKG9wLCB0cCwgbml0ZW1zKTsKKyAgICBQeVZhck9iamVjdCAqb3A7CisgICAgY29uc3Qgc2l6ZV90IHNpemUgPSBfUHlPYmplY3RfVkFSX1NJWkUodHAsIG5pdGVtcyk7CisgICAgb3AgPSAoUHlWYXJPYmplY3QgKikgUHlPYmplY3RfTUFMTE9DKHNpemUpOworICAgIGlmIChvcCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gKFB5VmFyT2JqZWN0ICopUHlFcnJfTm9NZW1vcnkoKTsKKyAgICByZXR1cm4gUHlPYmplY3RfSU5JVF9WQVIob3AsIHRwLCBuaXRlbXMpOwogfQogCiAvKiBmb3IgYmluYXJ5IGNvbXBhdGliaWxpdHkgd2l0aCAyLjIgKi8KQEAgLTI1OCwyOTEgKzI1OCwyOTEgQEAKIHZvaWQKIF9QeU9iamVjdF9EZWwoUHlPYmplY3QgKm9wKQogewotCVB5T2JqZWN0X0ZSRUUob3ApOworICAgIFB5T2JqZWN0X0ZSRUUob3ApOwogfQogCiAvKiBJbXBsZW1lbnRhdGlvbiBvZiBQeU9iamVjdF9QcmludCB3aXRoIHJlY3Vyc2lvbiBjaGVja2luZyAqLwogc3RhdGljIGludAogaW50ZXJuYWxfcHJpbnQoUHlPYmplY3QgKm9wLCBGSUxFICpmcCwgaW50IGZsYWdzLCBpbnQgbmVzdGluZykKIHsKLQlpbnQgcmV0ID0gMDsKLQlpZiAobmVzdGluZyA+IDEwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJwcmludCByZWN1cnNpb24iKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoUHlFcnJfQ2hlY2tTaWduYWxzKCkpCi0JCXJldHVybiAtMTsKKyAgICBpbnQgcmV0ID0gMDsKKyAgICBpZiAobmVzdGluZyA+IDEwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJwcmludCByZWN1cnNpb24iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoUHlFcnJfQ2hlY2tTaWduYWxzKCkpCisgICAgICAgIHJldHVybiAtMTsKICNpZmRlZiBVU0VfU1RBQ0tDSEVDSwotCWlmIChQeU9TX0NoZWNrU3RhY2soKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfTWVtb3J5RXJyb3IsICJzdGFjayBvdmVyZmxvdyIpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIGlmIChQeU9TX0NoZWNrU3RhY2soKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTWVtb3J5RXJyb3IsICJzdGFjayBvdmVyZmxvdyIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogI2VuZGlmCi0JY2xlYXJlcnIoZnApOyAvKiBDbGVhciBhbnkgcHJldmlvdXMgZXJyb3IgY29uZGl0aW9uICovCi0JaWYgKG9wID09IE5VTEwpIHsKLQkJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCQlmcHJpbnRmKGZwLCAiPG5pbD4iKTsKLQkJUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQl9Ci0JZWxzZSB7Ci0JCWlmIChvcC0+b2JfcmVmY250IDw9IDApCi0JCQkvKiBYWFgodHdvdXRlcnMpIGNhc3QgcmVmY291bnQgdG8gbG9uZyB1bnRpbCAlemQgaXMKLQkJCSAgIHVuaXZlcnNhbGx5IGF2YWlsYWJsZSAqLwotCQkJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCQkJZnByaW50ZihmcCwgIjxyZWZjbnQgJWxkIGF0ICVwPiIsCi0JCQkJKGxvbmcpb3AtPm9iX3JlZmNudCwgb3ApOwotCQkJUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQkJZWxzZSBpZiAoUHlfVFlQRShvcCktPnRwX3ByaW50ID09IE5VTEwpIHsKLQkJCVB5T2JqZWN0ICpzOwotCQkJaWYgKGZsYWdzICYgUHlfUFJJTlRfUkFXKQotCQkJCXMgPSBQeU9iamVjdF9TdHIob3ApOwotCQkJZWxzZQotCQkJCXMgPSBQeU9iamVjdF9SZXByKG9wKTsKLQkJCWlmIChzID09IE5VTEwpCi0JCQkJcmV0ID0gLTE7Ci0JCQllbHNlIHsKLQkJCQlyZXQgPSBpbnRlcm5hbF9wcmludChzLCBmcCwgUHlfUFJJTlRfUkFXLAotCQkJCQkJICAgICBuZXN0aW5nKzEpOwotCQkJfQotCQkJUHlfWERFQ1JFRihzKTsKLQkJfQotCQllbHNlCi0JCQlyZXQgPSAoKlB5X1RZUEUob3ApLT50cF9wcmludCkob3AsIGZwLCBmbGFncyk7Ci0JfQotCWlmIChyZXQgPT0gMCkgewotCQlpZiAoZmVycm9yKGZwKSkgewotCQkJUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOwotCQkJY2xlYXJlcnIoZnApOwotCQkJcmV0ID0gLTE7Ci0JCX0KLQl9Ci0JcmV0dXJuIHJldDsKKyAgICBjbGVhcmVycihmcCk7IC8qIENsZWFyIGFueSBwcmV2aW91cyBlcnJvciBjb25kaXRpb24gKi8KKyAgICBpZiAob3AgPT0gTlVMTCkgeworICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgICAgIGZwcmludGYoZnAsICI8bmlsPiIpOworICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKG9wLT5vYl9yZWZjbnQgPD0gMCkKKyAgICAgICAgICAgIC8qIFhYWCh0d291dGVycykgY2FzdCByZWZjb3VudCB0byBsb25nIHVudGlsICV6ZCBpcworICAgICAgICAgICAgICAgdW5pdmVyc2FsbHkgYXZhaWxhYmxlICovCisgICAgICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgICAgICAgICBmcHJpbnRmKGZwLCAiPHJlZmNudCAlbGQgYXQgJXA+IiwKKyAgICAgICAgICAgICAgICAobG9uZylvcC0+b2JfcmVmY250LCBvcCk7CisgICAgICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgICAgICBlbHNlIGlmIChQeV9UWVBFKG9wKS0+dHBfcHJpbnQgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlPYmplY3QgKnM7CisgICAgICAgICAgICBpZiAoZmxhZ3MgJiBQeV9QUklOVF9SQVcpCisgICAgICAgICAgICAgICAgcyA9IFB5T2JqZWN0X1N0cihvcCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcyA9IFB5T2JqZWN0X1JlcHIob3ApOworICAgICAgICAgICAgaWYgKHMgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXQgPSAtMTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHJldCA9IGludGVybmFsX3ByaW50KHMsIGZwLCBQeV9QUklOVF9SQVcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVzdGluZysxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5X1hERUNSRUYocyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0ID0gKCpQeV9UWVBFKG9wKS0+dHBfcHJpbnQpKG9wLCBmcCwgZmxhZ3MpOworICAgIH0KKyAgICBpZiAocmV0ID09IDApIHsKKyAgICAgICAgaWYgKGZlcnJvcihmcCkpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKKyAgICAgICAgICAgIGNsZWFyZXJyKGZwKTsKKyAgICAgICAgICAgIHJldCA9IC0xOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXQ7CiB9CiAKIGludAogUHlPYmplY3RfUHJpbnQoUHlPYmplY3QgKm9wLCBGSUxFICpmcCwgaW50IGZsYWdzKQogewotCXJldHVybiBpbnRlcm5hbF9wcmludChvcCwgZnAsIGZsYWdzLCAwKTsKKyAgICByZXR1cm4gaW50ZXJuYWxfcHJpbnQob3AsIGZwLCBmbGFncywgMCk7CiB9CiAKIAogLyogRm9yIGRlYnVnZ2luZyBjb252ZW5pZW5jZS4gIFNlZSBNaXNjL2dkYmluaXQgZm9yIHNvbWUgdXNlZnVsIGdkYiBob29rcyAqLwogdm9pZCBfUHlPYmplY3RfRHVtcChQeU9iamVjdCogb3ApCiB7Ci0JaWYgKG9wID09IE5VTEwpCi0JCWZwcmludGYoc3RkZXJyLCAiTlVMTFxuIik7Ci0JZWxzZSB7CisgICAgaWYgKG9wID09IE5VTEwpCisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiTlVMTFxuIik7CisgICAgZWxzZSB7CiAjaWZkZWYgV0lUSF9USFJFQUQKLQkJUHlHSUxTdGF0ZV9TVEFURSBnaWw7CisgICAgICAgIFB5R0lMU3RhdGVfU1RBVEUgZ2lsOwogI2VuZGlmCi0JCWZwcmludGYoc3RkZXJyLCAib2JqZWN0ICA6ICIpOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIm9iamVjdCAgOiAiKTsKICNpZmRlZiBXSVRIX1RIUkVBRAotCQlnaWwgPSBQeUdJTFN0YXRlX0Vuc3VyZSgpOworICAgICAgICBnaWwgPSBQeUdJTFN0YXRlX0Vuc3VyZSgpOwogI2VuZGlmCi0JCSh2b2lkKVB5T2JqZWN0X1ByaW50KG9wLCBzdGRlcnIsIDApOworICAgICAgICAodm9pZClQeU9iamVjdF9QcmludChvcCwgc3RkZXJyLCAwKTsKICNpZmRlZiBXSVRIX1RIUkVBRAotCQlQeUdJTFN0YXRlX1JlbGVhc2UoZ2lsKTsKKyAgICAgICAgUHlHSUxTdGF0ZV9SZWxlYXNlKGdpbCk7CiAjZW5kaWYKLQkJLyogWFhYKHR3b3V0ZXJzKSBjYXN0IHJlZmNvdW50IHRvIGxvbmcgdW50aWwgJXpkIGlzCi0JCSAgIHVuaXZlcnNhbGx5IGF2YWlsYWJsZSAqLwotCQlmcHJpbnRmKHN0ZGVyciwgIlxuIgotCQkJInR5cGUgICAgOiAlc1xuIgotCQkJInJlZmNvdW50OiAlbGRcbiIKLQkJCSJhZGRyZXNzIDogJXBcbiIsCi0JCQlQeV9UWVBFKG9wKT09TlVMTCA/ICJOVUxMIiA6IFB5X1RZUEUob3ApLT50cF9uYW1lLAotCQkJKGxvbmcpb3AtPm9iX3JlZmNudCwKLQkJCW9wKTsKLQl9CisgICAgICAgIC8qIFhYWCh0d291dGVycykgY2FzdCByZWZjb3VudCB0byBsb25nIHVudGlsICV6ZCBpcworICAgICAgICAgICB1bml2ZXJzYWxseSBhdmFpbGFibGUgKi8KKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJcbiIKKyAgICAgICAgICAgICJ0eXBlICAgIDogJXNcbiIKKyAgICAgICAgICAgICJyZWZjb3VudDogJWxkXG4iCisgICAgICAgICAgICAiYWRkcmVzcyA6ICVwXG4iLAorICAgICAgICAgICAgUHlfVFlQRShvcCk9PU5VTEwgPyAiTlVMTCIgOiBQeV9UWVBFKG9wKS0+dHBfbmFtZSwKKyAgICAgICAgICAgIChsb25nKW9wLT5vYl9yZWZjbnQsCisgICAgICAgICAgICBvcCk7CisgICAgfQogfQogCiBQeU9iamVjdCAqCiBQeU9iamVjdF9SZXByKFB5T2JqZWN0ICp2KQogewotCWlmIChQeUVycl9DaGVja1NpZ25hbHMoKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKFB5RXJyX0NoZWNrU2lnbmFscygpKQorICAgICAgICByZXR1cm4gTlVMTDsKICNpZmRlZiBVU0VfU1RBQ0tDSEVDSwotCWlmIChQeU9TX0NoZWNrU3RhY2soKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfTWVtb3J5RXJyb3IsICJzdGFjayBvdmVyZmxvdyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKFB5T1NfQ2hlY2tTdGFjaygpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19NZW1vcnlFcnJvciwgInN0YWNrIG92ZXJmbG93Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KICNlbmRpZgotCWlmICh2ID09IE5VTEwpCi0JCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKCI8TlVMTD4iKTsKLQllbHNlIGlmIChQeV9UWVBFKHYpLT50cF9yZXByID09IE5VTEwpCi0JCXJldHVybiBQeVN0cmluZ19Gcm9tRm9ybWF0KCI8JXMgb2JqZWN0IGF0ICVwPiIsCi0JCQkJCSAgIFB5X1RZUEUodiktPnRwX25hbWUsIHYpOwotCWVsc2UgewotCQlQeU9iamVjdCAqcmVzOwotCQlyZXMgPSAoKlB5X1RZUEUodiktPnRwX3JlcHIpKHYpOwotCQlpZiAocmVzID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZygiPE5VTEw+Iik7CisgICAgZWxzZSBpZiAoUHlfVFlQRSh2KS0+dHBfcmVwciA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbUZvcm1hdCgiPCVzIG9iamVjdCBhdCAlcD4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9UWVBFKHYpLT50cF9uYW1lLCB2KTsKKyAgICBlbHNlIHsKKyAgICAgICAgUHlPYmplY3QgKnJlczsKKyAgICAgICAgcmVzID0gKCpQeV9UWVBFKHYpLT50cF9yZXByKSh2KTsKKyAgICAgICAgaWYgKHJlcyA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCQlpZiAoUHlVbmljb2RlX0NoZWNrKHJlcykpIHsKLQkJCVB5T2JqZWN0KiBzdHI7Ci0JCQlzdHIgPSBQeVVuaWNvZGVfQXNFbmNvZGVkU3RyaW5nKHJlcywgTlVMTCwgTlVMTCk7Ci0JCQlQeV9ERUNSRUYocmVzKTsKLQkJCWlmIChzdHIpCi0JCQkJcmVzID0gc3RyOwotCQkJZWxzZQotCQkJCXJldHVybiBOVUxMOwotCQl9CisgICAgICAgIGlmIChQeVVuaWNvZGVfQ2hlY2socmVzKSkgeworICAgICAgICAgICAgUHlPYmplY3QqIHN0cjsKKyAgICAgICAgICAgIHN0ciA9IFB5VW5pY29kZV9Bc0VuY29kZWRTdHJpbmcocmVzLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihyZXMpOworICAgICAgICAgICAgaWYgKHN0cikKKyAgICAgICAgICAgICAgICByZXMgPSBzdHI7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KICNlbmRpZgotCQlpZiAoIVB5U3RyaW5nX0NoZWNrKHJlcykpIHsKLQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkJICAgICAiX19yZXByX18gcmV0dXJuZWQgbm9uLXN0cmluZyAodHlwZSAlLjIwMHMpIiwKLQkJCQkgICAgIFB5X1RZUEUocmVzKS0+dHBfbmFtZSk7Ci0JCQlQeV9ERUNSRUYocmVzKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCXJldHVybiByZXM7Ci0JfQorICAgICAgICBpZiAoIVB5U3RyaW5nX0NoZWNrKHJlcykpIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIl9fcmVwcl9fIHJldHVybmVkIG5vbi1zdHJpbmcgKHR5cGUgJS4yMDBzKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRShyZXMpLT50cF9uYW1lKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihyZXMpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CiB9CiAKIFB5T2JqZWN0ICoKIF9QeU9iamVjdF9TdHIoUHlPYmplY3QgKnYpCiB7Ci0JUHlPYmplY3QgKnJlczsKLQlpbnQgdHlwZV9vazsKLQlpZiAodiA9PSBOVUxMKQotCQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZygiPE5VTEw+Iik7Ci0JaWYgKFB5U3RyaW5nX0NoZWNrRXhhY3QodikpIHsKLQkJUHlfSU5DUkVGKHYpOwotCQlyZXR1cm4gdjsKLQl9CisgICAgUHlPYmplY3QgKnJlczsKKyAgICBpbnQgdHlwZV9vazsKKyAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZygiPE5VTEw+Iik7CisgICAgaWYgKFB5U3RyaW5nX0NoZWNrRXhhY3QodikpIHsKKyAgICAgICAgUHlfSU5DUkVGKHYpOworICAgICAgICByZXR1cm4gdjsKKyAgICB9CiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCWlmIChQeVVuaWNvZGVfQ2hlY2tFeGFjdCh2KSkgewotCQlQeV9JTkNSRUYodik7Ci0JCXJldHVybiB2OwotCX0KKyAgICBpZiAoUHlVbmljb2RlX0NoZWNrRXhhY3QodikpIHsKKyAgICAgICAgUHlfSU5DUkVGKHYpOworICAgICAgICByZXR1cm4gdjsKKyAgICB9CiAjZW5kaWYKLQlpZiAoUHlfVFlQRSh2KS0+dHBfc3RyID09IE5VTEwpCi0JCXJldHVybiBQeU9iamVjdF9SZXByKHYpOworICAgIGlmIChQeV9UWVBFKHYpLT50cF9zdHIgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFB5T2JqZWN0X1JlcHIodik7CiAKLQkvKiBJdCBpcyBwb3NzaWJsZSBmb3IgYSB0eXBlIHRvIGhhdmUgYSB0cF9zdHIgcmVwcmVzZW50YXRpb24gdGhhdCBsb29wcwotCSAgIGluZmluaXRlbHkuICovCi0JaWYgKFB5X0VudGVyUmVjdXJzaXZlQ2FsbCgiIHdoaWxlIGdldHRpbmcgdGhlIHN0ciBvZiBhbiBvYmplY3QiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmVzID0gKCpQeV9UWVBFKHYpLT50cF9zdHIpKHYpOwotCVB5X0xlYXZlUmVjdXJzaXZlQ2FsbCgpOwotCWlmIChyZXMgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JdHlwZV9vayA9IFB5U3RyaW5nX0NoZWNrKHJlcyk7CisgICAgLyogSXQgaXMgcG9zc2libGUgZm9yIGEgdHlwZSB0byBoYXZlIGEgdHBfc3RyIHJlcHJlc2VudGF0aW9uIHRoYXQgbG9vcHMKKyAgICAgICBpbmZpbml0ZWx5LiAqLworICAgIGlmIChQeV9FbnRlclJlY3Vyc2l2ZUNhbGwoIiB3aGlsZSBnZXR0aW5nIHRoZSBzdHIgb2YgYW4gb2JqZWN0IikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJlcyA9ICgqUHlfVFlQRSh2KS0+dHBfc3RyKSh2KTsKKyAgICBQeV9MZWF2ZVJlY3Vyc2l2ZUNhbGwoKTsKKyAgICBpZiAocmVzID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHR5cGVfb2sgPSBQeVN0cmluZ19DaGVjayhyZXMpOwogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQl0eXBlX29rID0gdHlwZV9vayB8fCBQeVVuaWNvZGVfQ2hlY2socmVzKTsKKyAgICB0eXBlX29rID0gdHlwZV9vayB8fCBQeVVuaWNvZGVfQ2hlY2socmVzKTsKICNlbmRpZgotCWlmICghdHlwZV9vaykgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJICAgICAiX19zdHJfXyByZXR1cm5lZCBub24tc3RyaW5nICh0eXBlICUuMjAwcykiLAotCQkJICAgICBQeV9UWVBFKHJlcyktPnRwX25hbWUpOwotCQlQeV9ERUNSRUYocmVzKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiByZXM7CisgICAgaWYgKCF0eXBlX29rKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiX19zdHJfXyByZXR1cm5lZCBub24tc3RyaW5nICh0eXBlICUuMjAwcykiLAorICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRShyZXMpLT50cF9uYW1lKTsKKyAgICAgICAgUHlfREVDUkVGKHJlcyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gcmVzOwogfQogCiBQeU9iamVjdCAqCiBQeU9iamVjdF9TdHIoUHlPYmplY3QgKnYpCiB7Ci0JUHlPYmplY3QgKnJlcyA9IF9QeU9iamVjdF9TdHIodik7Ci0JaWYgKHJlcyA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBQeU9iamVjdCAqcmVzID0gX1B5T2JqZWN0X1N0cih2KTsKKyAgICBpZiAocmVzID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQlpZiAoUHlVbmljb2RlX0NoZWNrKHJlcykpIHsKLQkJUHlPYmplY3QqIHN0cjsKLQkJc3RyID0gUHlVbmljb2RlX0FzRW5jb2RlZFN0cmluZyhyZXMsIE5VTEwsIE5VTEwpOwotCQlQeV9ERUNSRUYocmVzKTsKLQkJaWYgKHN0cikKLQkJCXJlcyA9IHN0cjsKLQkJZWxzZQotCQkgICAgCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoUHlVbmljb2RlX0NoZWNrKHJlcykpIHsKKyAgICAgICAgUHlPYmplY3QqIHN0cjsKKyAgICAgICAgc3RyID0gUHlVbmljb2RlX0FzRW5jb2RlZFN0cmluZyhyZXMsIE5VTEwsIE5VTEwpOworICAgICAgICBQeV9ERUNSRUYocmVzKTsKKyAgICAgICAgaWYgKHN0cikKKyAgICAgICAgICAgIHJlcyA9IHN0cjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogI2VuZGlmCi0JYXNzZXJ0KFB5U3RyaW5nX0NoZWNrKHJlcykpOwotCXJldHVybiByZXM7CisgICAgYXNzZXJ0KFB5U3RyaW5nX0NoZWNrKHJlcykpOworICAgIHJldHVybiByZXM7CiB9CiAKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCiBQeU9iamVjdCAqCiBQeU9iamVjdF9Vbmljb2RlKFB5T2JqZWN0ICp2KQogewotCVB5T2JqZWN0ICpyZXM7Ci0JUHlPYmplY3QgKmZ1bmM7Ci0JUHlPYmplY3QgKnN0cjsKLQlpbnQgdW5pY29kZV9tZXRob2RfZm91bmQgPSAwOwotCXN0YXRpYyBQeU9iamVjdCAqdW5pY29kZXN0cjsKKyAgICBQeU9iamVjdCAqcmVzOworICAgIFB5T2JqZWN0ICpmdW5jOworICAgIFB5T2JqZWN0ICpzdHI7CisgICAgaW50IHVuaWNvZGVfbWV0aG9kX2ZvdW5kID0gMDsKKyAgICBzdGF0aWMgUHlPYmplY3QgKnVuaWNvZGVzdHI7CiAKLQlpZiAodiA9PSBOVUxMKSB7Ci0JCXJlcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIjxOVUxMPiIpOwotCQlpZiAocmVzID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQkJc3RyID0gUHlVbmljb2RlX0Zyb21FbmNvZGVkT2JqZWN0KHJlcywgTlVMTCwgInN0cmljdCIpOwotCQlQeV9ERUNSRUYocmVzKTsKLQkJcmV0dXJuIHN0cjsKLQl9IGVsc2UgaWYgKFB5VW5pY29kZV9DaGVja0V4YWN0KHYpKSB7Ci0JCVB5X0lOQ1JFRih2KTsKLQkJcmV0dXJuIHY7Ci0JfQorICAgIGlmICh2ID09IE5VTEwpIHsKKyAgICAgICAgcmVzID0gUHlTdHJpbmdfRnJvbVN0cmluZygiPE5VTEw+Iik7CisgICAgICAgIGlmIChyZXMgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBzdHIgPSBQeVVuaWNvZGVfRnJvbUVuY29kZWRPYmplY3QocmVzLCBOVUxMLCAic3RyaWN0Iik7CisgICAgICAgIFB5X0RFQ1JFRihyZXMpOworICAgICAgICByZXR1cm4gc3RyOworICAgIH0gZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrRXhhY3QodikpIHsKKyAgICAgICAgUHlfSU5DUkVGKHYpOworICAgICAgICByZXR1cm4gdjsKKyAgICB9CiAKLQkvKiBUcnkgdGhlIF9fdW5pY29kZV9fIG1ldGhvZCAqLwotCWlmICh1bmljb2Rlc3RyID09IE5VTEwpIHsKLQkJdW5pY29kZXN0cj0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX191bmljb2RlX18iKTsKLQkJaWYgKHVuaWNvZGVzdHIgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCX0KLQlpZiAoUHlJbnN0YW5jZV9DaGVjayh2KSkgewotCQkvKiBXZSdyZSBhbiBpbnN0YW5jZSBvZiBhIGNsYXNzaWMgY2xhc3MgKi8KLQkJLyogVHJ5IF9fdW5pY29kZV9fIGZyb20gdGhlIGluc3RhbmNlIC0tIGFsYXMgd2UgaGF2ZSBubyB0eXBlICovCi0JCWZ1bmMgPSBQeU9iamVjdF9HZXRBdHRyKHYsIHVuaWNvZGVzdHIpOwotCQlpZiAoZnVuYyAhPSBOVUxMKSB7Ci0JCQl1bmljb2RlX21ldGhvZF9mb3VuZCA9IDE7Ci0JCQlyZXMgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGZ1bmMsIE5VTEwpOwotCQkJUHlfREVDUkVGKGZ1bmMpOwotCQl9Ci0JCWVsc2UgewotCQkJUHlFcnJfQ2xlYXIoKTsgCi0JCX0KLQl9Ci0JZWxzZSB7Ci0JCS8qIE5vdCBhIGNsYXNzaWMgY2xhc3MgaW5zdGFuY2UsIHRyeSBfX3VuaWNvZGVfXyBmcm9tIHR5cGUgKi8KLQkJLyogX1B5VHlwZV9Mb29rdXAgZG9lc24ndCBjcmVhdGUgYSByZWZlcmVuY2UgKi8KLQkJZnVuYyA9IF9QeVR5cGVfTG9va3VwKFB5X1RZUEUodiksIHVuaWNvZGVzdHIpOwotCQlpZiAoZnVuYyAhPSBOVUxMKSB7Ci0JCQl1bmljb2RlX21ldGhvZF9mb3VuZCA9IDE7Ci0JCQlyZXMgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGZ1bmMsIHYsIE5VTEwpOwotCQl9Ci0JCWVsc2UgewotCQkJUHlFcnJfQ2xlYXIoKTsKLQkJfQotCX0KKyAgICAvKiBUcnkgdGhlIF9fdW5pY29kZV9fIG1ldGhvZCAqLworICAgIGlmICh1bmljb2Rlc3RyID09IE5VTEwpIHsKKyAgICAgICAgdW5pY29kZXN0cj0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX191bmljb2RlX18iKTsKKyAgICAgICAgaWYgKHVuaWNvZGVzdHIgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoUHlJbnN0YW5jZV9DaGVjayh2KSkgeworICAgICAgICAvKiBXZSdyZSBhbiBpbnN0YW5jZSBvZiBhIGNsYXNzaWMgY2xhc3MgKi8KKyAgICAgICAgLyogVHJ5IF9fdW5pY29kZV9fIGZyb20gdGhlIGluc3RhbmNlIC0tIGFsYXMgd2UgaGF2ZSBubyB0eXBlICovCisgICAgICAgIGZ1bmMgPSBQeU9iamVjdF9HZXRBdHRyKHYsIHVuaWNvZGVzdHIpOworICAgICAgICBpZiAoZnVuYyAhPSBOVUxMKSB7CisgICAgICAgICAgICB1bmljb2RlX21ldGhvZF9mb3VuZCA9IDE7CisgICAgICAgICAgICByZXMgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGZ1bmMsIE5VTEwpOworICAgICAgICAgICAgUHlfREVDUkVGKGZ1bmMpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLyogTm90IGEgY2xhc3NpYyBjbGFzcyBpbnN0YW5jZSwgdHJ5IF9fdW5pY29kZV9fIGZyb20gdHlwZSAqLworICAgICAgICAvKiBfUHlUeXBlX0xvb2t1cCBkb2Vzbid0IGNyZWF0ZSBhIHJlZmVyZW5jZSAqLworICAgICAgICBmdW5jID0gX1B5VHlwZV9Mb29rdXAoUHlfVFlQRSh2KSwgdW5pY29kZXN0cik7CisgICAgICAgIGlmIChmdW5jICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHVuaWNvZGVfbWV0aG9kX2ZvdW5kID0gMTsKKyAgICAgICAgICAgIHJlcyA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoZnVuYywgdiwgTlVMTCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICB9CisgICAgfQogCi0JLyogRGlkbid0IGZpbmQgX191bmljb2RlX18gKi8KLQlpZiAoIXVuaWNvZGVfbWV0aG9kX2ZvdW5kKSB7Ci0JCWlmIChQeVVuaWNvZGVfQ2hlY2sodikpIHsKLQkJCS8qIEZvciBhIFVuaWNvZGUgc3VidHlwZSB0aGF0J3MgZGlkbid0IG92ZXJ3cml0ZSBfX3VuaWNvZGVfXywKLQkJCSAgIHJldHVybiBhIHRydWUgVW5pY29kZSBvYmplY3Qgd2l0aCB0aGUgc2FtZSBkYXRhLiAqLwotCQkJcmV0dXJuIFB5VW5pY29kZV9Gcm9tVW5pY29kZShQeVVuaWNvZGVfQVNfVU5JQ09ERSh2KSwKLQkJCQkJCSAgICAgUHlVbmljb2RlX0dFVF9TSVpFKHYpKTsKLQkJfQotCQlpZiAoUHlTdHJpbmdfQ2hlY2tFeGFjdCh2KSkgewotCQkJUHlfSU5DUkVGKHYpOwotCQkJcmVzID0gdjsKLQkJfQotCQllbHNlIHsKLQkJCWlmIChQeV9UWVBFKHYpLT50cF9zdHIgIT0gTlVMTCkKLQkJCQlyZXMgPSAoKlB5X1RZUEUodiktPnRwX3N0cikodik7Ci0JCQllbHNlCi0JCQkJcmVzID0gUHlPYmplY3RfUmVwcih2KTsKLQkJfQotCX0KKyAgICAvKiBEaWRuJ3QgZmluZCBfX3VuaWNvZGVfXyAqLworICAgIGlmICghdW5pY29kZV9tZXRob2RfZm91bmQpIHsKKyAgICAgICAgaWYgKFB5VW5pY29kZV9DaGVjayh2KSkgeworICAgICAgICAgICAgLyogRm9yIGEgVW5pY29kZSBzdWJ0eXBlIHRoYXQncyBkaWRuJ3Qgb3ZlcndyaXRlIF9fdW5pY29kZV9fLAorICAgICAgICAgICAgICAgcmV0dXJuIGEgdHJ1ZSBVbmljb2RlIG9iamVjdCB3aXRoIHRoZSBzYW1lIGRhdGEuICovCisgICAgICAgICAgICByZXR1cm4gUHlVbmljb2RlX0Zyb21Vbmljb2RlKFB5VW5pY29kZV9BU19VTklDT0RFKHYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX1NJWkUodikpOworICAgICAgICB9CisgICAgICAgIGlmIChQeVN0cmluZ19DaGVja0V4YWN0KHYpKSB7CisgICAgICAgICAgICBQeV9JTkNSRUYodik7CisgICAgICAgICAgICByZXMgPSB2OworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKFB5X1RZUEUodiktPnRwX3N0ciAhPSBOVUxMKQorICAgICAgICAgICAgICAgIHJlcyA9ICgqUHlfVFlQRSh2KS0+dHBfc3RyKSh2KTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXMgPSBQeU9iamVjdF9SZXByKHYpOworICAgICAgICB9CisgICAgfQogCi0JaWYgKHJlcyA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIVB5VW5pY29kZV9DaGVjayhyZXMpKSB7Ci0JCXN0ciA9IFB5VW5pY29kZV9Gcm9tRW5jb2RlZE9iamVjdChyZXMsIE5VTEwsICJzdHJpY3QiKTsKLQkJUHlfREVDUkVGKHJlcyk7Ci0JCXJlcyA9IHN0cjsKLQl9Ci0JcmV0dXJuIHJlczsKKyAgICBpZiAocmVzID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHlVbmljb2RlX0NoZWNrKHJlcykpIHsKKyAgICAgICAgc3RyID0gUHlVbmljb2RlX0Zyb21FbmNvZGVkT2JqZWN0KHJlcywgTlVMTCwgInN0cmljdCIpOworICAgICAgICBQeV9ERUNSRUYocmVzKTsKKyAgICAgICAgcmVzID0gc3RyOworICAgIH0KKyAgICByZXR1cm4gcmVzOwogfQogI2VuZGlmCiAKQEAgLTU1NywzOSArNTU3LDM5IEBACiBzdGF0aWMgaW50CiBhZGp1c3RfdHBfY29tcGFyZShpbnQgYykKIHsKLQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkgewotCQlpZiAoYyAhPSAtMSAmJiBjICE9IC0yKSB7Ci0JCQlQeU9iamVjdCAqdCwgKnYsICp0YjsKLQkJCVB5RXJyX0ZldGNoKCZ0LCAmdiwgJnRiKTsKLQkJCWlmIChQeUVycl9XYXJuKFB5RXhjX1J1bnRpbWVXYXJuaW5nLAotCQkJCSAgICAgICAidHBfY29tcGFyZSBkaWRuJ3QgcmV0dXJuIC0xIG9yIC0yICIKLQkJCQkgICAgICAgImZvciBleGNlcHRpb24iKSA8IDApIHsKLQkJCQlQeV9YREVDUkVGKHQpOwotCQkJCVB5X1hERUNSRUYodik7Ci0JCQkJUHlfWERFQ1JFRih0Yik7Ci0JCQl9Ci0JCQllbHNlCi0JCQkJUHlFcnJfUmVzdG9yZSh0LCB2LCB0Yik7Ci0JCX0KLQkJcmV0dXJuIC0yOwotCX0KLQllbHNlIGlmIChjIDwgLTEgfHwgYyA+IDEpIHsKLQkJaWYgKFB5RXJyX1dhcm4oUHlFeGNfUnVudGltZVdhcm5pbmcsCi0JCQkgICAgICAgInRwX2NvbXBhcmUgZGlkbid0IHJldHVybiAtMSwgMCBvciAxIikgPCAwKQotCQkJcmV0dXJuIC0yOwotCQllbHNlCi0JCQlyZXR1cm4gYyA8IC0xID8gLTEgOiAxOwotCX0KLQllbHNlIHsKLQkJYXNzZXJ0KGMgPj0gLTEgJiYgYyA8PSAxKTsKLQkJcmV0dXJuIGM7Ci0JfQorICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgIGlmIChjICE9IC0xICYmIGMgIT0gLTIpIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICp0LCAqdiwgKnRiOworICAgICAgICAgICAgUHlFcnJfRmV0Y2goJnQsICZ2LCAmdGIpOworICAgICAgICAgICAgaWYgKFB5RXJyX1dhcm4oUHlFeGNfUnVudGltZVdhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAidHBfY29tcGFyZSBkaWRuJ3QgcmV0dXJuIC0xIG9yIC0yICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJmb3IgZXhjZXB0aW9uIikgPCAwKSB7CisgICAgICAgICAgICAgICAgUHlfWERFQ1JFRih0KTsKKyAgICAgICAgICAgICAgICBQeV9YREVDUkVGKHYpOworICAgICAgICAgICAgICAgIFB5X1hERUNSRUYodGIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIFB5RXJyX1Jlc3RvcmUodCwgdiwgdGIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAtMjsKKyAgICB9CisgICAgZWxzZSBpZiAoYyA8IC0xIHx8IGMgPiAxKSB7CisgICAgICAgIGlmIChQeUVycl9XYXJuKFB5RXhjX1J1bnRpbWVXYXJuaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAidHBfY29tcGFyZSBkaWRuJ3QgcmV0dXJuIC0xLCAwIG9yIDEiKSA8IDApCisgICAgICAgICAgICByZXR1cm4gLTI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBjIDwgLTEgPyAtMSA6IDE7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBhc3NlcnQoYyA+PSAtMSAmJiBjIDw9IDEpOworICAgICAgICByZXR1cm4gYzsKKyAgICB9CiB9CiAKIAogLyogTWFjcm8gdG8gZ2V0IHRoZSB0cF9yaWNoY29tcGFyZSBmaWVsZCBvZiBhIHR5cGUgaWYgZGVmaW5lZCAqLwogI2RlZmluZSBSSUNIQ09NUEFSRSh0KSAoUHlUeXBlX0hhc0ZlYXR1cmUoKHQpLCBQeV9UUEZMQUdTX0hBVkVfUklDSENPTVBBUkUpIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICA/ICh0KS0+dHBfcmljaGNvbXBhcmUgOiBOVUxMKQorICAgICAgICAgICAgID8gKHQpLT50cF9yaWNoY29tcGFyZSA6IE5VTEwpCiAKIC8qIE1hcCByaWNoIGNvbXBhcmlzb24gb3BlcmF0b3JzIHRvIHRoZWlyIHN3YXBwZWQgdmVyc2lvbiwgZS5nLiBMVCAtLT4gR1QgKi8KIGludCBfUHlfU3dhcHBlZE9wW10gPSB7UHlfR1QsIFB5X0dFLCBQeV9FUSwgUHlfTkUsIFB5X0xULCBQeV9MRX07CkBAIC02MDQsMjkgKzYwNCwyOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHRyeV9yaWNoX2NvbXBhcmUoUHlPYmplY3QgKnYsIFB5T2JqZWN0ICp3LCBpbnQgb3ApCiB7Ci0JcmljaGNtcGZ1bmMgZjsKLQlQeU9iamVjdCAqcmVzOworICAgIHJpY2hjbXBmdW5jIGY7CisgICAgUHlPYmplY3QgKnJlczsKIAotCWlmICh2LT5vYl90eXBlICE9IHctPm9iX3R5cGUgJiYKLQkgICAgUHlUeXBlX0lzU3VidHlwZSh3LT5vYl90eXBlLCB2LT5vYl90eXBlKSAmJgotCSAgICAoZiA9IFJJQ0hDT01QQVJFKHctPm9iX3R5cGUpKSAhPSBOVUxMKSB7Ci0JCXJlcyA9ICgqZikodywgdiwgX1B5X1N3YXBwZWRPcFtvcF0pOwotCQlpZiAocmVzICE9IFB5X05vdEltcGxlbWVudGVkKQotCQkJcmV0dXJuIHJlczsKLQkJUHlfREVDUkVGKHJlcyk7Ci0JfQotCWlmICgoZiA9IFJJQ0hDT01QQVJFKHYtPm9iX3R5cGUpKSAhPSBOVUxMKSB7Ci0JCXJlcyA9ICgqZikodiwgdywgb3ApOwotCQlpZiAocmVzICE9IFB5X05vdEltcGxlbWVudGVkKQotCQkJcmV0dXJuIHJlczsKLQkJUHlfREVDUkVGKHJlcyk7Ci0JfQotCWlmICgoZiA9IFJJQ0hDT01QQVJFKHctPm9iX3R5cGUpKSAhPSBOVUxMKSB7Ci0JCXJldHVybiAoKmYpKHcsIHYsIF9QeV9Td2FwcGVkT3Bbb3BdKTsKLQl9Ci0JcmVzID0gUHlfTm90SW1wbGVtZW50ZWQ7Ci0JUHlfSU5DUkVGKHJlcyk7Ci0JcmV0dXJuIHJlczsKKyAgICBpZiAodi0+b2JfdHlwZSAhPSB3LT5vYl90eXBlICYmCisgICAgICAgIFB5VHlwZV9Jc1N1YnR5cGUody0+b2JfdHlwZSwgdi0+b2JfdHlwZSkgJiYKKyAgICAgICAgKGYgPSBSSUNIQ09NUEFSRSh3LT5vYl90eXBlKSkgIT0gTlVMTCkgeworICAgICAgICByZXMgPSAoKmYpKHcsIHYsIF9QeV9Td2FwcGVkT3Bbb3BdKTsKKyAgICAgICAgaWYgKHJlcyAhPSBQeV9Ob3RJbXBsZW1lbnRlZCkKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIFB5X0RFQ1JFRihyZXMpOworICAgIH0KKyAgICBpZiAoKGYgPSBSSUNIQ09NUEFSRSh2LT5vYl90eXBlKSkgIT0gTlVMTCkgeworICAgICAgICByZXMgPSAoKmYpKHYsIHcsIG9wKTsKKyAgICAgICAgaWYgKHJlcyAhPSBQeV9Ob3RJbXBsZW1lbnRlZCkKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIFB5X0RFQ1JFRihyZXMpOworICAgIH0KKyAgICBpZiAoKGYgPSBSSUNIQ09NUEFSRSh3LT5vYl90eXBlKSkgIT0gTlVMTCkgeworICAgICAgICByZXR1cm4gKCpmKSh3LCB2LCBfUHlfU3dhcHBlZE9wW29wXSk7CisgICAgfQorICAgIHJlcyA9IFB5X05vdEltcGxlbWVudGVkOworICAgIFB5X0lOQ1JFRihyZXMpOworICAgIHJldHVybiByZXM7CiB9CiAKIC8qIFRyeSBhIGdlbnVpbmUgcmljaCBjb21wYXJpc29uLCByZXR1cm5pbmcgYW4gaW50LiAgUmV0dXJuOgpAQCAtNjM5LDIxICs2MzksMjEgQEAKIHN0YXRpYyBpbnQKIHRyeV9yaWNoX2NvbXBhcmVfYm9vbChQeU9iamVjdCAqdiwgUHlPYmplY3QgKncsIGludCBvcCkKIHsKLQlQeU9iamVjdCAqcmVzOwotCWludCBvazsKKyAgICBQeU9iamVjdCAqcmVzOworICAgIGludCBvazsKIAotCWlmIChSSUNIQ09NUEFSRSh2LT5vYl90eXBlKSA9PSBOVUxMICYmIFJJQ0hDT01QQVJFKHctPm9iX3R5cGUpID09IE5VTEwpCi0JCXJldHVybiAyOyAvKiBTaG9ydGN1dCwgYXZvaWQgSU5DUkVGK0RFQ1JFRiAqLwotCXJlcyA9IHRyeV9yaWNoX2NvbXBhcmUodiwgdywgb3ApOwotCWlmIChyZXMgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCWlmIChyZXMgPT0gUHlfTm90SW1wbGVtZW50ZWQpIHsKLQkJUHlfREVDUkVGKHJlcyk7Ci0JCXJldHVybiAyOwotCX0KLQlvayA9IFB5T2JqZWN0X0lzVHJ1ZShyZXMpOwotCVB5X0RFQ1JFRihyZXMpOwotCXJldHVybiBvazsKKyAgICBpZiAoUklDSENPTVBBUkUodi0+b2JfdHlwZSkgPT0gTlVMTCAmJiBSSUNIQ09NUEFSRSh3LT5vYl90eXBlKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gMjsgLyogU2hvcnRjdXQsIGF2b2lkIElOQ1JFRitERUNSRUYgKi8KKyAgICByZXMgPSB0cnlfcmljaF9jb21wYXJlKHYsIHcsIG9wKTsKKyAgICBpZiAocmVzID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAocmVzID09IFB5X05vdEltcGxlbWVudGVkKSB7CisgICAgICAgIFB5X0RFQ1JFRihyZXMpOworICAgICAgICByZXR1cm4gMjsKKyAgICB9CisgICAgb2sgPSBQeU9iamVjdF9Jc1RydWUocmVzKTsKKyAgICBQeV9ERUNSRUYocmVzKTsKKyAgICByZXR1cm4gb2s7CiB9CiAKIC8qIFRyeSByaWNoIGNvbXBhcmlzb25zIHRvIGRldGVybWluZSBhIDMtd2F5IGNvbXBhcmlzb24uICBSZXR1cm46CkBAIC02NjYsMjcgKzY2NiwyNyBAQAogc3RhdGljIGludAogdHJ5X3JpY2hfdG9fM3dheV9jb21wYXJlKFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdykKIHsKLQlzdGF0aWMgc3RydWN0IHsgaW50IG9wOyBpbnQgb3V0Y29tZTsgfSB0cmllc1szXSA9IHsKLQkJLyogVHJ5IHRoaXMgb3BlcmF0b3IsIGFuZCBpZiBpdCBpcyB0cnVlLCB1c2UgdGhpcyBvdXRjb21lOiAqLwotCQl7UHlfRVEsIDB9LAotCQl7UHlfTFQsIC0xfSwKLQkJe1B5X0dULCAxfSwKLQl9OwotCWludCBpOworICAgIHN0YXRpYyBzdHJ1Y3QgeyBpbnQgb3A7IGludCBvdXRjb21lOyB9IHRyaWVzWzNdID0geworICAgICAgICAvKiBUcnkgdGhpcyBvcGVyYXRvciwgYW5kIGlmIGl0IGlzIHRydWUsIHVzZSB0aGlzIG91dGNvbWU6ICovCisgICAgICAgIHtQeV9FUSwgMH0sCisgICAgICAgIHtQeV9MVCwgLTF9LAorICAgICAgICB7UHlfR1QsIDF9LAorICAgIH07CisgICAgaW50IGk7CiAKLQlpZiAoUklDSENPTVBBUkUodi0+b2JfdHlwZSkgPT0gTlVMTCAmJiBSSUNIQ09NUEFSRSh3LT5vYl90eXBlKSA9PSBOVUxMKQotCQlyZXR1cm4gMjsgLyogU2hvcnRjdXQgKi8KKyAgICBpZiAoUklDSENPTVBBUkUodi0+b2JfdHlwZSkgPT0gTlVMTCAmJiBSSUNIQ09NUEFSRSh3LT5vYl90eXBlKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gMjsgLyogU2hvcnRjdXQgKi8KIAotCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKLQkJc3dpdGNoICh0cnlfcmljaF9jb21wYXJlX2Jvb2wodiwgdywgdHJpZXNbaV0ub3ApKSB7Ci0JCWNhc2UgLTE6Ci0JCQlyZXR1cm4gLTI7Ci0JCWNhc2UgMToKLQkJCXJldHVybiB0cmllc1tpXS5vdXRjb21lOwotCQl9Ci0JfQorICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgc3dpdGNoICh0cnlfcmljaF9jb21wYXJlX2Jvb2wodiwgdywgdHJpZXNbaV0ub3ApKSB7CisgICAgICAgIGNhc2UgLTE6CisgICAgICAgICAgICByZXR1cm4gLTI7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIHJldHVybiB0cmllc1tpXS5vdXRjb21lOworICAgICAgICB9CisgICAgfQogCi0JcmV0dXJuIDI7CisgICAgcmV0dXJuIDI7CiB9CiAKIC8qIFRyeSBhIDMtd2F5IGNvbXBhcmlzb24sIHJldHVybmluZyBhbiBpbnQuICBSZXR1cm46CkBAIC02OTksNTUgKzY5OSw1NSBAQAogc3RhdGljIGludAogdHJ5XzN3YXlfY29tcGFyZShQeU9iamVjdCAqdiwgUHlPYmplY3QgKncpCiB7Ci0JaW50IGM7Ci0JY21wZnVuYyBmOworICAgIGludCBjOworICAgIGNtcGZ1bmMgZjsKIAotCS8qIENvbXBhcmlzb25zIGludm9sdmluZyBpbnN0YW5jZXMgYXJlIGdpdmVuIHRvIGluc3RhbmNlX2NvbXBhcmUsCi0JICAgd2hpY2ggaGFzIHRoZSBzYW1lIHJldHVybiBjb252ZW50aW9ucyBhcyB0aGlzIGZ1bmN0aW9uLiAqLworICAgIC8qIENvbXBhcmlzb25zIGludm9sdmluZyBpbnN0YW5jZXMgYXJlIGdpdmVuIHRvIGluc3RhbmNlX2NvbXBhcmUsCisgICAgICAgd2hpY2ggaGFzIHRoZSBzYW1lIHJldHVybiBjb252ZW50aW9ucyBhcyB0aGlzIGZ1bmN0aW9uLiAqLwogCi0JZiA9IHYtPm9iX3R5cGUtPnRwX2NvbXBhcmU7Ci0JaWYgKFB5SW5zdGFuY2VfQ2hlY2sodikpCi0JCXJldHVybiAoKmYpKHYsIHcpOwotCWlmIChQeUluc3RhbmNlX0NoZWNrKHcpKQotCQlyZXR1cm4gKCp3LT5vYl90eXBlLT50cF9jb21wYXJlKSh2LCB3KTsKKyAgICBmID0gdi0+b2JfdHlwZS0+dHBfY29tcGFyZTsKKyAgICBpZiAoUHlJbnN0YW5jZV9DaGVjayh2KSkKKyAgICAgICAgcmV0dXJuICgqZikodiwgdyk7CisgICAgaWYgKFB5SW5zdGFuY2VfQ2hlY2sodykpCisgICAgICAgIHJldHVybiAoKnctPm9iX3R5cGUtPnRwX2NvbXBhcmUpKHYsIHcpOwogCi0JLyogSWYgYm90aCBoYXZlIHRoZSBzYW1lIChub24tTlVMTCkgdHBfY29tcGFyZSwgdXNlIGl0LiAqLwotCWlmIChmICE9IE5VTEwgJiYgZiA9PSB3LT5vYl90eXBlLT50cF9jb21wYXJlKSB7Ci0JCWMgPSAoKmYpKHYsIHcpOwotCQlyZXR1cm4gYWRqdXN0X3RwX2NvbXBhcmUoYyk7Ci0JfQorICAgIC8qIElmIGJvdGggaGF2ZSB0aGUgc2FtZSAobm9uLU5VTEwpIHRwX2NvbXBhcmUsIHVzZSBpdC4gKi8KKyAgICBpZiAoZiAhPSBOVUxMICYmIGYgPT0gdy0+b2JfdHlwZS0+dHBfY29tcGFyZSkgeworICAgICAgICBjID0gKCpmKSh2LCB3KTsKKyAgICAgICAgcmV0dXJuIGFkanVzdF90cF9jb21wYXJlKGMpOworICAgIH0KIAotCS8qIElmIGVpdGhlciB0cF9jb21wYXJlIGlzIF9QeU9iamVjdF9TbG90Q29tcGFyZSwgdGhhdCdzIHNhZmUuICovCi0JaWYgKGYgPT0gX1B5T2JqZWN0X1Nsb3RDb21wYXJlIHx8Ci0JICAgIHctPm9iX3R5cGUtPnRwX2NvbXBhcmUgPT0gX1B5T2JqZWN0X1Nsb3RDb21wYXJlKQotCQlyZXR1cm4gX1B5T2JqZWN0X1Nsb3RDb21wYXJlKHYsIHcpOworICAgIC8qIElmIGVpdGhlciB0cF9jb21wYXJlIGlzIF9QeU9iamVjdF9TbG90Q29tcGFyZSwgdGhhdCdzIHNhZmUuICovCisgICAgaWYgKGYgPT0gX1B5T2JqZWN0X1Nsb3RDb21wYXJlIHx8CisgICAgICAgIHctPm9iX3R5cGUtPnRwX2NvbXBhcmUgPT0gX1B5T2JqZWN0X1Nsb3RDb21wYXJlKQorICAgICAgICByZXR1cm4gX1B5T2JqZWN0X1Nsb3RDb21wYXJlKHYsIHcpOwogCi0JLyogSWYgd2UncmUgaGVyZSwgdiBhbmQgdywKLQkgICAgYSkgYXJlIG5vdCBpbnN0YW5jZXM7Ci0JICAgIGIpIGhhdmUgZGlmZmVyZW50IHR5cGVzIG9yIGEgdHlwZSB3aXRob3V0IHRwX2NvbXBhcmU7IGFuZAotCSAgICBjKSBkb24ndCBoYXZlIGEgdXNlci1kZWZpbmVkIHRwX2NvbXBhcmUuCi0JICAgdHBfY29tcGFyZSBpbXBsZW1lbnRhdGlvbnMgaW4gQyBhc3N1bWUgdGhhdCBib3RoIGFyZ3VtZW50cwotCSAgIGhhdmUgdGhlaXIgdHlwZSwgc28gd2UgZ2l2ZSB1cCBpZiB0aGUgY29lcmNpb24gZmFpbHMgb3IgaWYKLQkgICBpdCB5aWVsZHMgdHlwZXMgd2hpY2ggYXJlIHN0aWxsIGluY29tcGF0aWJsZSAod2hpY2ggY2FuCi0JICAgaGFwcGVuIHdpdGggYSB1c2VyLWRlZmluZWQgbmJfY29lcmNlKS4KLQkqLwotCWMgPSBQeU51bWJlcl9Db2VyY2VFeCgmdiwgJncpOwotCWlmIChjIDwgMCkKLQkJcmV0dXJuIC0yOwotCWlmIChjID4gMCkKLQkJcmV0dXJuIDI7Ci0JZiA9IHYtPm9iX3R5cGUtPnRwX2NvbXBhcmU7Ci0JaWYgKGYgIT0gTlVMTCAmJiBmID09IHctPm9iX3R5cGUtPnRwX2NvbXBhcmUpIHsKLQkJYyA9ICgqZikodiwgdyk7Ci0JCVB5X0RFQ1JFRih2KTsKLQkJUHlfREVDUkVGKHcpOwotCQlyZXR1cm4gYWRqdXN0X3RwX2NvbXBhcmUoYyk7Ci0JfQorICAgIC8qIElmIHdlJ3JlIGhlcmUsIHYgYW5kIHcsCisgICAgICAgIGEpIGFyZSBub3QgaW5zdGFuY2VzOworICAgICAgICBiKSBoYXZlIGRpZmZlcmVudCB0eXBlcyBvciBhIHR5cGUgd2l0aG91dCB0cF9jb21wYXJlOyBhbmQKKyAgICAgICAgYykgZG9uJ3QgaGF2ZSBhIHVzZXItZGVmaW5lZCB0cF9jb21wYXJlLgorICAgICAgIHRwX2NvbXBhcmUgaW1wbGVtZW50YXRpb25zIGluIEMgYXNzdW1lIHRoYXQgYm90aCBhcmd1bWVudHMKKyAgICAgICBoYXZlIHRoZWlyIHR5cGUsIHNvIHdlIGdpdmUgdXAgaWYgdGhlIGNvZXJjaW9uIGZhaWxzIG9yIGlmCisgICAgICAgaXQgeWllbGRzIHR5cGVzIHdoaWNoIGFyZSBzdGlsbCBpbmNvbXBhdGlibGUgKHdoaWNoIGNhbgorICAgICAgIGhhcHBlbiB3aXRoIGEgdXNlci1kZWZpbmVkIG5iX2NvZXJjZSkuCisgICAgKi8KKyAgICBjID0gUHlOdW1iZXJfQ29lcmNlRXgoJnYsICZ3KTsKKyAgICBpZiAoYyA8IDApCisgICAgICAgIHJldHVybiAtMjsKKyAgICBpZiAoYyA+IDApCisgICAgICAgIHJldHVybiAyOworICAgIGYgPSB2LT5vYl90eXBlLT50cF9jb21wYXJlOworICAgIGlmIChmICE9IE5VTEwgJiYgZiA9PSB3LT5vYl90eXBlLT50cF9jb21wYXJlKSB7CisgICAgICAgIGMgPSAoKmYpKHYsIHcpOworICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgIFB5X0RFQ1JFRih3KTsKKyAgICAgICAgcmV0dXJuIGFkanVzdF90cF9jb21wYXJlKGMpOworICAgIH0KIAotCS8qIE5vIGNvbXBhcmlzb24gZGVmaW5lZCAqLwotCVB5X0RFQ1JFRih2KTsKLQlQeV9ERUNSRUYodyk7Ci0JcmV0dXJuIDI7CisgICAgLyogTm8gY29tcGFyaXNvbiBkZWZpbmVkICovCisgICAgUHlfREVDUkVGKHYpOworICAgIFB5X0RFQ1JFRih3KTsKKyAgICByZXR1cm4gMjsKIH0KIAogLyogRmluYWwgZmFsbGJhY2sgMy13YXkgY29tcGFyaXNvbiwgcmV0dXJuaW5nIGFuIGludC4gIFJldHVybjoKQEAgLTc1OSw0MyArNzU5LDQzIEBACiBzdGF0aWMgaW50CiBkZWZhdWx0XzN3YXlfY29tcGFyZShQeU9iamVjdCAqdiwgUHlPYmplY3QgKncpCiB7Ci0JaW50IGM7Ci0JY29uc3QgY2hhciAqdm5hbWUsICp3bmFtZTsKKyAgICBpbnQgYzsKKyAgICBjb25zdCBjaGFyICp2bmFtZSwgKnduYW1lOwogCi0JaWYgKHYtPm9iX3R5cGUgPT0gdy0+b2JfdHlwZSkgewotCQkvKiBXaGVuIGNvbXBhcmluZyB0aGVzZSBwb2ludGVycywgdGhleSBtdXN0IGJlIGNhc3QgdG8KLQkJICogaW50ZWdlciB0eXBlcyAoaS5lLiBQeV91aW50cHRyX3QsIG91ciBzcGVsbGluZyBvZiBDOVgncwotCQkgKiB1aW50cHRyX3QpLiAgQU5TSSBzcGVjaWZpZXMgdGhhdCBwb2ludGVyIGNvbXBhcmVzIG90aGVyCi0JCSAqIHRoYW4gPT0gYW5kICE9IHRvIG5vbi1yZWxhdGVkIHN0cnVjdHVyZXMgYXJlIHVuZGVmaW5lZC4KLQkJICovCi0JCVB5X3VpbnRwdHJfdCB2diA9IChQeV91aW50cHRyX3QpdjsKLQkJUHlfdWludHB0cl90IHd3ID0gKFB5X3VpbnRwdHJfdCl3OwotCQlyZXR1cm4gKHZ2IDwgd3cpID8gLTEgOiAodnYgPiB3dykgPyAxIDogMDsKLQl9CisgICAgaWYgKHYtPm9iX3R5cGUgPT0gdy0+b2JfdHlwZSkgeworICAgICAgICAvKiBXaGVuIGNvbXBhcmluZyB0aGVzZSBwb2ludGVycywgdGhleSBtdXN0IGJlIGNhc3QgdG8KKyAgICAgICAgICogaW50ZWdlciB0eXBlcyAoaS5lLiBQeV91aW50cHRyX3QsIG91ciBzcGVsbGluZyBvZiBDOVgncworICAgICAgICAgKiB1aW50cHRyX3QpLiAgQU5TSSBzcGVjaWZpZXMgdGhhdCBwb2ludGVyIGNvbXBhcmVzIG90aGVyCisgICAgICAgICAqIHRoYW4gPT0gYW5kICE9IHRvIG5vbi1yZWxhdGVkIHN0cnVjdHVyZXMgYXJlIHVuZGVmaW5lZC4KKyAgICAgICAgICovCisgICAgICAgIFB5X3VpbnRwdHJfdCB2diA9IChQeV91aW50cHRyX3QpdjsKKyAgICAgICAgUHlfdWludHB0cl90IHd3ID0gKFB5X3VpbnRwdHJfdCl3OworICAgICAgICByZXR1cm4gKHZ2IDwgd3cpID8gLTEgOiAodnYgPiB3dykgPyAxIDogMDsKKyAgICB9CiAKLQkvKiBOb25lIGlzIHNtYWxsZXIgdGhhbiBhbnl0aGluZyAqLwotCWlmICh2ID09IFB5X05vbmUpCi0JCXJldHVybiAtMTsKLQlpZiAodyA9PSBQeV9Ob25lKQotCQlyZXR1cm4gMTsKKyAgICAvKiBOb25lIGlzIHNtYWxsZXIgdGhhbiBhbnl0aGluZyAqLworICAgIGlmICh2ID09IFB5X05vbmUpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAodyA9PSBQeV9Ob25lKQorICAgICAgICByZXR1cm4gMTsKIAotCS8qIGRpZmZlcmVudCB0eXBlOiBjb21wYXJlIHR5cGUgbmFtZXM7IG51bWJlcnMgYXJlIHNtYWxsZXIgKi8KLQlpZiAoUHlOdW1iZXJfQ2hlY2sodikpCi0JCXZuYW1lID0gIiI7Ci0JZWxzZQotCQl2bmFtZSA9IHYtPm9iX3R5cGUtPnRwX25hbWU7Ci0JaWYgKFB5TnVtYmVyX0NoZWNrKHcpKQotCQl3bmFtZSA9ICIiOwotCWVsc2UKLQkJd25hbWUgPSB3LT5vYl90eXBlLT50cF9uYW1lOwotCWMgPSBzdHJjbXAodm5hbWUsIHduYW1lKTsKLQlpZiAoYyA8IDApCi0JCXJldHVybiAtMTsKLQlpZiAoYyA+IDApCi0JCXJldHVybiAxOwotCS8qIFNhbWUgdHlwZSBuYW1lLCBvciAobW9yZSBsaWtlbHkpIGluY29tcGFyYWJsZSBudW1lcmljIHR5cGVzICovCi0JcmV0dXJuICgoUHlfdWludHB0cl90KSh2LT5vYl90eXBlKSA8ICgKLQkJUHlfdWludHB0cl90KSh3LT5vYl90eXBlKSkgPyAtMSA6IDE7CisgICAgLyogZGlmZmVyZW50IHR5cGU6IGNvbXBhcmUgdHlwZSBuYW1lczsgbnVtYmVycyBhcmUgc21hbGxlciAqLworICAgIGlmIChQeU51bWJlcl9DaGVjayh2KSkKKyAgICAgICAgdm5hbWUgPSAiIjsKKyAgICBlbHNlCisgICAgICAgIHZuYW1lID0gdi0+b2JfdHlwZS0+dHBfbmFtZTsKKyAgICBpZiAoUHlOdW1iZXJfQ2hlY2sodykpCisgICAgICAgIHduYW1lID0gIiI7CisgICAgZWxzZQorICAgICAgICB3bmFtZSA9IHctPm9iX3R5cGUtPnRwX25hbWU7CisgICAgYyA9IHN0cmNtcCh2bmFtZSwgd25hbWUpOworICAgIGlmIChjIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmIChjID4gMCkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgLyogU2FtZSB0eXBlIG5hbWUsIG9yIChtb3JlIGxpa2VseSkgaW5jb21wYXJhYmxlIG51bWVyaWMgdHlwZXMgKi8KKyAgICByZXR1cm4gKChQeV91aW50cHRyX3QpKHYtPm9iX3R5cGUpIDwgKAorICAgICAgICBQeV91aW50cHRyX3QpKHctPm9iX3R5cGUpKSA/IC0xIDogMTsKIH0KIAogLyogRG8gYSAzLXdheSBjb21wYXJpc29uLCBieSBob29rIG9yIGJ5IGNyb29rLiAgUmV0dXJuOgpAQCAtODA5LDM1ICs4MDksMzUgQEAKIHN0YXRpYyBpbnQKIGRvX2NtcChQeU9iamVjdCAqdiwgUHlPYmplY3QgKncpCiB7Ci0JaW50IGM7Ci0JY21wZnVuYyBmOworICAgIGludCBjOworICAgIGNtcGZ1bmMgZjsKIAotCWlmICh2LT5vYl90eXBlID09IHctPm9iX3R5cGUKLQkgICAgJiYgKGYgPSB2LT5vYl90eXBlLT50cF9jb21wYXJlKSAhPSBOVUxMKSB7Ci0JCWMgPSAoKmYpKHYsIHcpOwotCQlpZiAoUHlJbnN0YW5jZV9DaGVjayh2KSkgewotCQkJLyogSW5zdGFuY2UgdHBfY29tcGFyZSBoYXMgYSBkaWZmZXJlbnQgc2lnbmF0dXJlLgotCQkJICAgQnV0IGlmIGl0IHJldHVybnMgdW5kZWZpbmVkIHdlIGZhbGwgdGhyb3VnaC4gKi8KLQkJCWlmIChjICE9IDIpCi0JCQkJcmV0dXJuIGM7Ci0JCQkvKiBFbHNlIGZhbGwgdGhyb3VnaCB0byB0cnlfcmljaF90b18zd2F5X2NvbXBhcmUoKSAqLwotCQl9Ci0JCWVsc2UKLQkJCXJldHVybiBhZGp1c3RfdHBfY29tcGFyZShjKTsKLQl9Ci0JLyogV2Ugb25seSBnZXQgaGVyZSBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBpcyB0cnVlOgotCSAgIGEpIHYgYW5kIHcgaGF2ZSBkaWZmZXJlbnQgdHlwZXMKLQkgICBiKSB2IGFuZCB3IGhhdmUgdGhlIHNhbWUgdHlwZSwgd2hpY2ggZG9lc24ndCBoYXZlIHRwX2NvbXBhcmUKLQkgICBjKSB2IGFuZCB3IGFyZSBpbnN0YW5jZXMsIGFuZCBlaXRoZXIgX19jbXBfXyBpcyBub3QgZGVmaW5lZCBvcgotCSAgICAgIF9fY21wX18gcmV0dXJucyBOb3RJbXBsZW1lbnRlZAotCSovCi0JYyA9IHRyeV9yaWNoX3RvXzN3YXlfY29tcGFyZSh2LCB3KTsKLQlpZiAoYyA8IDIpCi0JCXJldHVybiBjOwotCWMgPSB0cnlfM3dheV9jb21wYXJlKHYsIHcpOwotCWlmIChjIDwgMikKLQkJcmV0dXJuIGM7Ci0JcmV0dXJuIGRlZmF1bHRfM3dheV9jb21wYXJlKHYsIHcpOworICAgIGlmICh2LT5vYl90eXBlID09IHctPm9iX3R5cGUKKyAgICAgICAgJiYgKGYgPSB2LT5vYl90eXBlLT50cF9jb21wYXJlKSAhPSBOVUxMKSB7CisgICAgICAgIGMgPSAoKmYpKHYsIHcpOworICAgICAgICBpZiAoUHlJbnN0YW5jZV9DaGVjayh2KSkgeworICAgICAgICAgICAgLyogSW5zdGFuY2UgdHBfY29tcGFyZSBoYXMgYSBkaWZmZXJlbnQgc2lnbmF0dXJlLgorICAgICAgICAgICAgICAgQnV0IGlmIGl0IHJldHVybnMgdW5kZWZpbmVkIHdlIGZhbGwgdGhyb3VnaC4gKi8KKyAgICAgICAgICAgIGlmIChjICE9IDIpCisgICAgICAgICAgICAgICAgcmV0dXJuIGM7CisgICAgICAgICAgICAvKiBFbHNlIGZhbGwgdGhyb3VnaCB0byB0cnlfcmljaF90b18zd2F5X2NvbXBhcmUoKSAqLworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBhZGp1c3RfdHBfY29tcGFyZShjKTsKKyAgICB9CisgICAgLyogV2Ugb25seSBnZXQgaGVyZSBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBpcyB0cnVlOgorICAgICAgIGEpIHYgYW5kIHcgaGF2ZSBkaWZmZXJlbnQgdHlwZXMKKyAgICAgICBiKSB2IGFuZCB3IGhhdmUgdGhlIHNhbWUgdHlwZSwgd2hpY2ggZG9lc24ndCBoYXZlIHRwX2NvbXBhcmUKKyAgICAgICBjKSB2IGFuZCB3IGFyZSBpbnN0YW5jZXMsIGFuZCBlaXRoZXIgX19jbXBfXyBpcyBub3QgZGVmaW5lZCBvcgorICAgICAgICAgIF9fY21wX18gcmV0dXJucyBOb3RJbXBsZW1lbnRlZAorICAgICovCisgICAgYyA9IHRyeV9yaWNoX3RvXzN3YXlfY29tcGFyZSh2LCB3KTsKKyAgICBpZiAoYyA8IDIpCisgICAgICAgIHJldHVybiBjOworICAgIGMgPSB0cnlfM3dheV9jb21wYXJlKHYsIHcpOworICAgIGlmIChjIDwgMikKKyAgICAgICAgcmV0dXJuIGM7CisgICAgcmV0dXJuIGRlZmF1bHRfM3dheV9jb21wYXJlKHYsIHcpOwogfQogCiAvKiBDb21wYXJlIHYgdG8gdy4gIFJldHVybgpAQCAtODUwLDM3ICs4NTAsMzcgQEAKIGludAogUHlPYmplY3RfQ29tcGFyZShQeU9iamVjdCAqdiwgUHlPYmplY3QgKncpCiB7Ci0JaW50IHJlc3VsdDsKKyAgICBpbnQgcmVzdWx0OwogCi0JaWYgKHYgPT0gTlVMTCB8fCB3ID09IE5VTEwpIHsKLQkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKHYgPT0gdykKLQkJcmV0dXJuIDA7Ci0JaWYgKFB5X0VudGVyUmVjdXJzaXZlQ2FsbCgiIGluIGNtcCIpKQotCQlyZXR1cm4gLTE7Ci0JcmVzdWx0ID0gZG9fY21wKHYsIHcpOwotCVB5X0xlYXZlUmVjdXJzaXZlQ2FsbCgpOwotCXJldHVybiByZXN1bHQgPCAwID8gLTEgOiByZXN1bHQ7CisgICAgaWYgKHYgPT0gTlVMTCB8fCB3ID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKHYgPT0gdykKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKFB5X0VudGVyUmVjdXJzaXZlQ2FsbCgiIGluIGNtcCIpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgcmVzdWx0ID0gZG9fY21wKHYsIHcpOworICAgIFB5X0xlYXZlUmVjdXJzaXZlQ2FsbCgpOworICAgIHJldHVybiByZXN1bHQgPCAwID8gLTEgOiByZXN1bHQ7CiB9CiAKIC8qIFJldHVybiAobmV3IHJlZmVyZW5jZSB0bykgUHlfVHJ1ZSBvciBQeV9GYWxzZS4gKi8KIHN0YXRpYyBQeU9iamVjdCAqCiBjb252ZXJ0XzN3YXlfdG9fb2JqZWN0KGludCBvcCwgaW50IGMpCiB7Ci0JUHlPYmplY3QgKnJlc3VsdDsKLQlzd2l0Y2ggKG9wKSB7Ci0JY2FzZSBQeV9MVDogYyA9IGMgPCAgMDsgYnJlYWs7Ci0JY2FzZSBQeV9MRTogYyA9IGMgPD0gMDsgYnJlYWs7Ci0JY2FzZSBQeV9FUTogYyA9IGMgPT0gMDsgYnJlYWs7Ci0JY2FzZSBQeV9ORTogYyA9IGMgIT0gMDsgYnJlYWs7Ci0JY2FzZSBQeV9HVDogYyA9IGMgPiAgMDsgYnJlYWs7Ci0JY2FzZSBQeV9HRTogYyA9IGMgPj0gMDsgYnJlYWs7Ci0JfQotCXJlc3VsdCA9IGMgPyBQeV9UcnVlIDogUHlfRmFsc2U7Ci0JUHlfSU5DUkVGKHJlc3VsdCk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBQeU9iamVjdCAqcmVzdWx0OworICAgIHN3aXRjaCAob3ApIHsKKyAgICBjYXNlIFB5X0xUOiBjID0gYyA8ICAwOyBicmVhazsKKyAgICBjYXNlIFB5X0xFOiBjID0gYyA8PSAwOyBicmVhazsKKyAgICBjYXNlIFB5X0VROiBjID0gYyA9PSAwOyBicmVhazsKKyAgICBjYXNlIFB5X05FOiBjID0gYyAhPSAwOyBicmVhazsKKyAgICBjYXNlIFB5X0dUOiBjID0gYyA+ICAwOyBicmVhazsKKyAgICBjYXNlIFB5X0dFOiBjID0gYyA+PSAwOyBicmVhazsKKyAgICB9CisgICAgcmVzdWx0ID0gYyA/IFB5X1RydWUgOiBQeV9GYWxzZTsKKyAgICBQeV9JTkNSRUYocmVzdWx0KTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiAvKiBXZSB3YW50IGEgcmljaCBjb21wYXJpc29uIGJ1dCBkb24ndCBoYXZlIG9uZS4gIFRyeSBhIDMtd2F5IGNtcCBpbnN0ZWFkLgpAQCAtODkyLDI1ICs4OTIsMjUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiB0cnlfM3dheV90b19yaWNoX2NvbXBhcmUoUHlPYmplY3QgKnYsIFB5T2JqZWN0ICp3LCBpbnQgb3ApCiB7Ci0JaW50IGM7CisgICAgaW50IGM7CiAKLQljID0gdHJ5XzN3YXlfY29tcGFyZSh2LCB3KTsKLQlpZiAoYyA+PSAyKSB7CisgICAgYyA9IHRyeV8zd2F5X2NvbXBhcmUodiwgdyk7CisgICAgaWYgKGMgPj0gMikgewogCi0JCS8qIFB5M0sgd2FybmluZyBpZiB0eXBlcyBhcmUgbm90IGVxdWFsIGFuZCBjb21wYXJpc29uIGlzbid0ID09IG9yICE9ICAqLwotCQlpZiAoUHlfUHkza1dhcm5pbmdGbGFnICYmCi0JCSAgICB2LT5vYl90eXBlICE9IHctPm9iX3R5cGUgJiYgb3AgIT0gUHlfRVEgJiYgb3AgIT0gUHlfTkUgJiYKLQkJICAgIFB5RXJyX1dhcm5FeChQeUV4Y19EZXByZWNhdGlvbldhcm5pbmcsCi0JCQkgICAgICAgImNvbXBhcmluZyB1bmVxdWFsIHR5cGVzIG5vdCBzdXBwb3J0ZWQgIgotCQkJICAgICAgICJpbiAzLngiLCAxKSA8IDApIHsKLQkJCXJldHVybiBOVUxMOwotCQl9CisgICAgICAgIC8qIFB5M0sgd2FybmluZyBpZiB0eXBlcyBhcmUgbm90IGVxdWFsIGFuZCBjb21wYXJpc29uIGlzbid0ID09IG9yICE9ICAqLworICAgICAgICBpZiAoUHlfUHkza1dhcm5pbmdGbGFnICYmCisgICAgICAgICAgICB2LT5vYl90eXBlICE9IHctPm9iX3R5cGUgJiYgb3AgIT0gUHlfRVEgJiYgb3AgIT0gUHlfTkUgJiYKKyAgICAgICAgICAgIFB5RXJyX1dhcm5FeChQeUV4Y19EZXByZWNhdGlvbldhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICJjb21wYXJpbmcgdW5lcXVhbCB0eXBlcyBub3Qgc3VwcG9ydGVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgImluIDMueCIsIDEpIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KIAotCQljID0gZGVmYXVsdF8zd2F5X2NvbXBhcmUodiwgdyk7Ci0JfQotCWlmIChjIDw9IC0yKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gY29udmVydF8zd2F5X3RvX29iamVjdChvcCwgYyk7CisgICAgICAgIGMgPSBkZWZhdWx0XzN3YXlfY29tcGFyZSh2LCB3KTsKKyAgICB9CisgICAgaWYgKGMgPD0gLTIpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBjb252ZXJ0XzN3YXlfdG9fb2JqZWN0KG9wLCBjKTsKIH0KIAogLyogRG8gcmljaCBjb21wYXJpc29uIG9uIHYgYW5kIHcuICBSZXR1cm4KQEAgLTkyMiwxNCArOTIyLDE0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZG9fcmljaGNtcChQeU9iamVjdCAqdiwgUHlPYmplY3QgKncsIGludCBvcCkKIHsKLQlQeU9iamVjdCAqcmVzOworICAgIFB5T2JqZWN0ICpyZXM7CiAKLQlyZXMgPSB0cnlfcmljaF9jb21wYXJlKHYsIHcsIG9wKTsKLQlpZiAocmVzICE9IFB5X05vdEltcGxlbWVudGVkKQotCQlyZXR1cm4gcmVzOwotCVB5X0RFQ1JFRihyZXMpOworICAgIHJlcyA9IHRyeV9yaWNoX2NvbXBhcmUodiwgdywgb3ApOworICAgIGlmIChyZXMgIT0gUHlfTm90SW1wbGVtZW50ZWQpCisgICAgICAgIHJldHVybiByZXM7CisgICAgUHlfREVDUkVGKHJlcyk7CiAKLQlyZXR1cm4gdHJ5XzN3YXlfdG9fcmljaF9jb21wYXJlKHYsIHcsIG9wKTsKKyAgICByZXR1cm4gdHJ5XzN3YXlfdG9fcmljaF9jb21wYXJlKHYsIHcsIG9wKTsKIH0KIAogLyogUmV0dXJuOgpAQCAtOTQwLDc3ICs5NDAsNzcgQEAKIFB5T2JqZWN0ICoKIFB5T2JqZWN0X1JpY2hDb21wYXJlKFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdywgaW50IG9wKQogewotCVB5T2JqZWN0ICpyZXM7CisgICAgUHlPYmplY3QgKnJlczsKIAotCWFzc2VydChQeV9MVCA8PSBvcCAmJiBvcCA8PSBQeV9HRSk7Ci0JaWYgKFB5X0VudGVyUmVjdXJzaXZlQ2FsbCgiIGluIGNtcCIpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBhc3NlcnQoUHlfTFQgPD0gb3AgJiYgb3AgPD0gUHlfR0UpOworICAgIGlmIChQeV9FbnRlclJlY3Vyc2l2ZUNhbGwoIiBpbiBjbXAiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkvKiBJZiB0aGUgdHlwZXMgYXJlIGVxdWFsLCBhbmQgbm90IG9sZC1zdHlsZSBpbnN0YW5jZXMsIHRyeSB0bwotCSAgIGdldCBvdXQgY2hlYXAgKGRvbid0IGJvdGhlciB3aXRoIGNvZXJjaW9ucyBldGMuKS4gKi8KLQlpZiAodi0+b2JfdHlwZSA9PSB3LT5vYl90eXBlICYmICFQeUluc3RhbmNlX0NoZWNrKHYpKSB7Ci0JCWNtcGZ1bmMgZmNtcDsKLQkJcmljaGNtcGZ1bmMgZnJpY2ggPSBSSUNIQ09NUEFSRSh2LT5vYl90eXBlKTsKLQkJLyogSWYgdGhlIHR5cGUgaGFzIHJpY2hjbXAsIHRyeSBpdCBmaXJzdC4gIHRyeV9yaWNoX2NvbXBhcmUKLQkJICAgdHJpZXMgaXQgdHdvLXNpZGVkLCB3aGljaCBpcyBub3QgbmVlZGVkIHNpbmNlIHdlJ3ZlIGEKLQkJICAgc2luZ2xlIHR5cGUgb25seS4gKi8KLQkJaWYgKGZyaWNoICE9IE5VTEwpIHsKLQkJCXJlcyA9ICgqZnJpY2gpKHYsIHcsIG9wKTsKLQkJCWlmIChyZXMgIT0gUHlfTm90SW1wbGVtZW50ZWQpCi0JCQkJZ290byBEb25lOwotCQkJUHlfREVDUkVGKHJlcyk7Ci0JCX0KLQkJLyogTm8gcmljaGNtcCwgb3IgdGhpcyBwYXJ0aWN1bGFyIHJpY2htcCBub3QgaW1wbGVtZW50ZWQuCi0JCSAgIFRyeSAzLXdheSBjbXAuICovCi0JCWZjbXAgPSB2LT5vYl90eXBlLT50cF9jb21wYXJlOwotCQlpZiAoZmNtcCAhPSBOVUxMKSB7Ci0JCQlpbnQgYyA9ICgqZmNtcCkodiwgdyk7Ci0JCQljID0gYWRqdXN0X3RwX2NvbXBhcmUoYyk7Ci0JCQlpZiAoYyA9PSAtMikgewotCQkJCXJlcyA9IE5VTEw7Ci0JCQkJZ290byBEb25lOwotCQkJfQotCQkJcmVzID0gY29udmVydF8zd2F5X3RvX29iamVjdChvcCwgYyk7Ci0JCQlnb3RvIERvbmU7Ci0JCX0KLQl9CisgICAgLyogSWYgdGhlIHR5cGVzIGFyZSBlcXVhbCwgYW5kIG5vdCBvbGQtc3R5bGUgaW5zdGFuY2VzLCB0cnkgdG8KKyAgICAgICBnZXQgb3V0IGNoZWFwIChkb24ndCBib3RoZXIgd2l0aCBjb2VyY2lvbnMgZXRjLikuICovCisgICAgaWYgKHYtPm9iX3R5cGUgPT0gdy0+b2JfdHlwZSAmJiAhUHlJbnN0YW5jZV9DaGVjayh2KSkgeworICAgICAgICBjbXBmdW5jIGZjbXA7CisgICAgICAgIHJpY2hjbXBmdW5jIGZyaWNoID0gUklDSENPTVBBUkUodi0+b2JfdHlwZSk7CisgICAgICAgIC8qIElmIHRoZSB0eXBlIGhhcyByaWNoY21wLCB0cnkgaXQgZmlyc3QuICB0cnlfcmljaF9jb21wYXJlCisgICAgICAgICAgIHRyaWVzIGl0IHR3by1zaWRlZCwgd2hpY2ggaXMgbm90IG5lZWRlZCBzaW5jZSB3ZSd2ZSBhCisgICAgICAgICAgIHNpbmdsZSB0eXBlIG9ubHkuICovCisgICAgICAgIGlmIChmcmljaCAhPSBOVUxMKSB7CisgICAgICAgICAgICByZXMgPSAoKmZyaWNoKSh2LCB3LCBvcCk7CisgICAgICAgICAgICBpZiAocmVzICE9IFB5X05vdEltcGxlbWVudGVkKQorICAgICAgICAgICAgICAgIGdvdG8gRG9uZTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihyZXMpOworICAgICAgICB9CisgICAgICAgIC8qIE5vIHJpY2hjbXAsIG9yIHRoaXMgcGFydGljdWxhciByaWNobXAgbm90IGltcGxlbWVudGVkLgorICAgICAgICAgICBUcnkgMy13YXkgY21wLiAqLworICAgICAgICBmY21wID0gdi0+b2JfdHlwZS0+dHBfY29tcGFyZTsKKyAgICAgICAgaWYgKGZjbXAgIT0gTlVMTCkgeworICAgICAgICAgICAgaW50IGMgPSAoKmZjbXApKHYsIHcpOworICAgICAgICAgICAgYyA9IGFkanVzdF90cF9jb21wYXJlKGMpOworICAgICAgICAgICAgaWYgKGMgPT0gLTIpIHsKKyAgICAgICAgICAgICAgICByZXMgPSBOVUxMOworICAgICAgICAgICAgICAgIGdvdG8gRG9uZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcyA9IGNvbnZlcnRfM3dheV90b19vYmplY3Qob3AsIGMpOworICAgICAgICAgICAgZ290byBEb25lOworICAgICAgICB9CisgICAgfQogCi0JLyogRmFzdCBwYXRoIG5vdCB0YWtlbiwgb3IgY291bGRuJ3QgZGVsaXZlciBhIHVzZWZ1bCByZXN1bHQuICovCi0JcmVzID0gZG9fcmljaGNtcCh2LCB3LCBvcCk7CisgICAgLyogRmFzdCBwYXRoIG5vdCB0YWtlbiwgb3IgY291bGRuJ3QgZGVsaXZlciBhIHVzZWZ1bCByZXN1bHQuICovCisgICAgcmVzID0gZG9fcmljaGNtcCh2LCB3LCBvcCk7CiBEb25lOgotCVB5X0xlYXZlUmVjdXJzaXZlQ2FsbCgpOwotCXJldHVybiByZXM7CisgICAgUHlfTGVhdmVSZWN1cnNpdmVDYWxsKCk7CisgICAgcmV0dXJuIHJlczsKIH0KIAogLyogUmV0dXJuIC0xIGlmIGVycm9yOyAxIGlmIHYgb3AgdzsgMCBpZiBub3QgKHYgb3AgdykuICovCiBpbnQKIFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChQeU9iamVjdCAqdiwgUHlPYmplY3QgKncsIGludCBvcCkKIHsKLQlQeU9iamVjdCAqcmVzOwotCWludCBvazsKKyAgICBQeU9iamVjdCAqcmVzOworICAgIGludCBvazsKIAotCS8qIFF1aWNrIHJlc3VsdCB3aGVuIG9iamVjdHMgYXJlIHRoZSBzYW1lLgotCSAgIEd1YXJhbnRlZXMgdGhhdCBpZGVudGl0eSBpbXBsaWVzIGVxdWFsaXR5LiAqLwotCWlmICh2ID09IHcpIHsKLQkJaWYgKG9wID09IFB5X0VRKQotCQkJcmV0dXJuIDE7Ci0JCWVsc2UgaWYgKG9wID09IFB5X05FKQotCQkJcmV0dXJuIDA7Ci0JfQorICAgIC8qIFF1aWNrIHJlc3VsdCB3aGVuIG9iamVjdHMgYXJlIHRoZSBzYW1lLgorICAgICAgIEd1YXJhbnRlZXMgdGhhdCBpZGVudGl0eSBpbXBsaWVzIGVxdWFsaXR5LiAqLworICAgIGlmICh2ID09IHcpIHsKKyAgICAgICAgaWYgKG9wID09IFB5X0VRKQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIGVsc2UgaWYgKG9wID09IFB5X05FKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCi0JcmVzID0gUHlPYmplY3RfUmljaENvbXBhcmUodiwgdywgb3ApOwotCWlmIChyZXMgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCWlmIChQeUJvb2xfQ2hlY2socmVzKSkKLQkJb2sgPSAocmVzID09IFB5X1RydWUpOwotCWVsc2UKLQkJb2sgPSBQeU9iamVjdF9Jc1RydWUocmVzKTsKLQlQeV9ERUNSRUYocmVzKTsKLQlyZXR1cm4gb2s7CisgICAgcmVzID0gUHlPYmplY3RfUmljaENvbXBhcmUodiwgdywgb3ApOworICAgIGlmIChyZXMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmIChQeUJvb2xfQ2hlY2socmVzKSkKKyAgICAgICAgb2sgPSAocmVzID09IFB5X1RydWUpOworICAgIGVsc2UKKyAgICAgICAgb2sgPSBQeU9iamVjdF9Jc1RydWUocmVzKTsKKyAgICBQeV9ERUNSRUYocmVzKTsKKyAgICByZXR1cm4gb2s7CiB9CiAKIC8qIFNldCBvZiBoYXNoIHV0aWxpdHkgZnVuY3Rpb25zIHRvIGhlbHAgbWFpbnRhaW5pbmcgdGhlIGludmFyaWFudCB0aGF0Ci0JaWYgYT09YiB0aGVuIGhhc2goYSk9PWhhc2goYikKKyAgICBpZiBhPT1iIHRoZW4gaGFzaChhKT09aGFzaChiKQogCiAgICBBbGwgdGhlIHV0aWxpdHkgZnVuY3Rpb25zIChfUHlfSGFzaCooKSkgcmV0dXJuICItMSIgdG8gc2lnbmlmeSBhbiBlcnJvci4KICovCkBAIC0xMDE4LDI1NyArMTAxOCwyNTcgQEAKIGxvbmcKIF9QeV9IYXNoRG91YmxlKGRvdWJsZSB2KQogewotCWRvdWJsZSBpbnRwYXJ0LCBmcmFjdHBhcnQ7Ci0JaW50IGV4cG87Ci0JbG9uZyBoaXBhcnQ7Ci0JbG9uZyB4OwkJLyogdGhlIGZpbmFsIGhhc2ggdmFsdWUgKi8KLQkvKiBUaGlzIGlzIGRlc2lnbmVkIHNvIHRoYXQgUHl0aG9uIG51bWJlcnMgb2YgZGlmZmVyZW50IHR5cGVzCi0JICogdGhhdCBjb21wYXJlIGVxdWFsIGhhc2ggdG8gdGhlIHNhbWUgdmFsdWU7IG90aGVyd2lzZSBjb21wYXJpc29ucwotCSAqIG9mIG1hcHBpbmcga2V5cyB3aWxsIHR1cm4gb3V0IHdlaXJkLgotCSAqLworICAgIGRvdWJsZSBpbnRwYXJ0LCBmcmFjdHBhcnQ7CisgICAgaW50IGV4cG87CisgICAgbG9uZyBoaXBhcnQ7CisgICAgbG9uZyB4OyAgICAgICAgICAgICAvKiB0aGUgZmluYWwgaGFzaCB2YWx1ZSAqLworICAgIC8qIFRoaXMgaXMgZGVzaWduZWQgc28gdGhhdCBQeXRob24gbnVtYmVycyBvZiBkaWZmZXJlbnQgdHlwZXMKKyAgICAgKiB0aGF0IGNvbXBhcmUgZXF1YWwgaGFzaCB0byB0aGUgc2FtZSB2YWx1ZTsgb3RoZXJ3aXNlIGNvbXBhcmlzb25zCisgICAgICogb2YgbWFwcGluZyBrZXlzIHdpbGwgdHVybiBvdXQgd2VpcmQuCisgICAgICovCiAKLQlmcmFjdHBhcnQgPSBtb2RmKHYsICZpbnRwYXJ0KTsKLQlpZiAoZnJhY3RwYXJ0ID09IDAuMCkgewotCQkvKiBUaGlzIG11c3QgcmV0dXJuIHRoZSBzYW1lIGhhc2ggYXMgYW4gZXF1YWwgaW50IG9yIGxvbmcuICovCi0JCWlmIChpbnRwYXJ0ID4gTE9OR19NQVgvMiB8fCAtaW50cGFydCA+IExPTkdfTUFYLzIpIHsKLQkJCS8qIENvbnZlcnQgdG8gbG9uZyBhbmQgdXNlIGl0cyBoYXNoLiAqLwotCQkJUHlPYmplY3QgKnBsb25nOwkvKiBjb252ZXJ0ZWQgdG8gUHl0aG9uIGxvbmcgKi8KLQkJCWlmIChQeV9JU19JTkZJTklUWShpbnRwYXJ0KSkKLQkJCQkvKiBjYW4ndCBjb252ZXJ0IHRvIGxvbmcgaW50IC0tIGFyYml0cmFyeSAqLwotCQkJCXYgPSB2IDwgMCA/IC0yNzE4MjguMCA6IDMxNDE1OS4wOwotCQkJcGxvbmcgPSBQeUxvbmdfRnJvbURvdWJsZSh2KTsKLQkJCWlmIChwbG9uZyA9PSBOVUxMKQotCQkJCXJldHVybiAtMTsKLQkJCXggPSBQeU9iamVjdF9IYXNoKHBsb25nKTsKLQkJCVB5X0RFQ1JFRihwbG9uZyk7Ci0JCQlyZXR1cm4geDsKLQkJfQotCQkvKiBGaXRzIGluIGEgQyBsb25nID09IGEgUHl0aG9uIGludCwgc28gaXMgaXRzIG93biBoYXNoLiAqLwotCQl4ID0gKGxvbmcpaW50cGFydDsKLQkJaWYgKHggPT0gLTEpCi0JCQl4ID0gLTI7Ci0JCXJldHVybiB4OwotCX0KLQkvKiBUaGUgZnJhY3Rpb25hbCBwYXJ0IGlzIG5vbi16ZXJvLCBzbyB3ZSBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0Ci0JICogbWFraW5nIHRoaXMgbWF0Y2ggdGhlIGhhc2ggb2Ygc29tZSBvdGhlciB0eXBlLgotCSAqIFVzZSBmcmV4cCB0byBnZXQgYXQgdGhlIGJpdHMgaW4gdGhlIGRvdWJsZS4KLQkgKiBTaW5jZSB0aGUgVkFYIEQgZG91YmxlIGZvcm1hdCBoYXMgNTYgbWFudGlzc2EgYml0cywgd2hpY2ggaXMgdGhlCi0JICogbW9zdCBvZiBhbnkgZG91YmxlIGZvcm1hdCBpbiB1c2UsIGVhY2ggb2YgdGhlc2UgcGFydHMgbWF5IGhhdmUgYXMKLQkgKiBtYW55IGFzIChidXQgbm8gbW9yZSB0aGFuKSA1NiBzaWduaWZpY2FudCBiaXRzLgotCSAqIFNvLCBhc3N1bWluZyBzaXplb2YobG9uZykgPj0gNCwgZWFjaCBwYXJ0IGNhbiBiZSBicm9rZW4gaW50byB0d28KLQkgKiBsb25nczsgZnJleHAgYW5kIG11bHRpcGxpY2F0aW9uIGFyZSB1c2VkIHRvIGRvIHRoYXQuCi0JICogQWxzbywgc2luY2UgdGhlIENyYXkgZG91YmxlIGZvcm1hdCBoYXMgMTUgZXhwb25lbnQgYml0cywgd2hpY2ggaXMKLQkgKiB0aGUgbW9zdCBvZiBhbnkgZG91YmxlIGZvcm1hdCBpbiB1c2UsIHNoaWZ0aW5nIHRoZSBleHBvbmVudCBmaWVsZAotCSAqIGxlZnQgYnkgMTUgd29uJ3Qgb3ZlcmZsb3cgYSBsb25nIChhZ2FpbiBhc3N1bWluZyBzaXplb2YobG9uZykgPj0gNCkuCi0JICovCi0JdiA9IGZyZXhwKHYsICZleHBvKTsKLQl2ICo9IDIxNDc0ODM2NDguMDsJLyogMioqMzEgKi8KLQloaXBhcnQgPSAobG9uZyl2OwkvKiB0YWtlIHRoZSB0b3AgMzIgYml0cyAqLwotCXYgPSAodiAtIChkb3VibGUpaGlwYXJ0KSAqIDIxNDc0ODM2NDguMDsgLyogZ2V0IHRoZSBuZXh0IDMyIGJpdHMgKi8KLQl4ID0gaGlwYXJ0ICsgKGxvbmcpdiArIChleHBvIDw8IDE1KTsKLQlpZiAoeCA9PSAtMSkKLQkJeCA9IC0yOwotCXJldHVybiB4OworICAgIGZyYWN0cGFydCA9IG1vZGYodiwgJmludHBhcnQpOworICAgIGlmIChmcmFjdHBhcnQgPT0gMC4wKSB7CisgICAgICAgIC8qIFRoaXMgbXVzdCByZXR1cm4gdGhlIHNhbWUgaGFzaCBhcyBhbiBlcXVhbCBpbnQgb3IgbG9uZy4gKi8KKyAgICAgICAgaWYgKGludHBhcnQgPiBMT05HX01BWC8yIHx8IC1pbnRwYXJ0ID4gTE9OR19NQVgvMikgeworICAgICAgICAgICAgLyogQ29udmVydCB0byBsb25nIGFuZCB1c2UgaXRzIGhhc2guICovCisgICAgICAgICAgICBQeU9iamVjdCAqcGxvbmc7ICAgICAgICAgICAgICAgICAgICAvKiBjb252ZXJ0ZWQgdG8gUHl0aG9uIGxvbmcgKi8KKyAgICAgICAgICAgIGlmIChQeV9JU19JTkZJTklUWShpbnRwYXJ0KSkKKyAgICAgICAgICAgICAgICAvKiBjYW4ndCBjb252ZXJ0IHRvIGxvbmcgaW50IC0tIGFyYml0cmFyeSAqLworICAgICAgICAgICAgICAgIHYgPSB2IDwgMCA/IC0yNzE4MjguMCA6IDMxNDE1OS4wOworICAgICAgICAgICAgcGxvbmcgPSBQeUxvbmdfRnJvbURvdWJsZSh2KTsKKyAgICAgICAgICAgIGlmIChwbG9uZyA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIHggPSBQeU9iamVjdF9IYXNoKHBsb25nKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihwbG9uZyk7CisgICAgICAgICAgICByZXR1cm4geDsKKyAgICAgICAgfQorICAgICAgICAvKiBGaXRzIGluIGEgQyBsb25nID09IGEgUHl0aG9uIGludCwgc28gaXMgaXRzIG93biBoYXNoLiAqLworICAgICAgICB4ID0gKGxvbmcpaW50cGFydDsKKyAgICAgICAgaWYgKHggPT0gLTEpCisgICAgICAgICAgICB4ID0gLTI7CisgICAgICAgIHJldHVybiB4OworICAgIH0KKyAgICAvKiBUaGUgZnJhY3Rpb25hbCBwYXJ0IGlzIG5vbi16ZXJvLCBzbyB3ZSBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0CisgICAgICogbWFraW5nIHRoaXMgbWF0Y2ggdGhlIGhhc2ggb2Ygc29tZSBvdGhlciB0eXBlLgorICAgICAqIFVzZSBmcmV4cCB0byBnZXQgYXQgdGhlIGJpdHMgaW4gdGhlIGRvdWJsZS4KKyAgICAgKiBTaW5jZSB0aGUgVkFYIEQgZG91YmxlIGZvcm1hdCBoYXMgNTYgbWFudGlzc2EgYml0cywgd2hpY2ggaXMgdGhlCisgICAgICogbW9zdCBvZiBhbnkgZG91YmxlIGZvcm1hdCBpbiB1c2UsIGVhY2ggb2YgdGhlc2UgcGFydHMgbWF5IGhhdmUgYXMKKyAgICAgKiBtYW55IGFzIChidXQgbm8gbW9yZSB0aGFuKSA1NiBzaWduaWZpY2FudCBiaXRzLgorICAgICAqIFNvLCBhc3N1bWluZyBzaXplb2YobG9uZykgPj0gNCwgZWFjaCBwYXJ0IGNhbiBiZSBicm9rZW4gaW50byB0d28KKyAgICAgKiBsb25nczsgZnJleHAgYW5kIG11bHRpcGxpY2F0aW9uIGFyZSB1c2VkIHRvIGRvIHRoYXQuCisgICAgICogQWxzbywgc2luY2UgdGhlIENyYXkgZG91YmxlIGZvcm1hdCBoYXMgMTUgZXhwb25lbnQgYml0cywgd2hpY2ggaXMKKyAgICAgKiB0aGUgbW9zdCBvZiBhbnkgZG91YmxlIGZvcm1hdCBpbiB1c2UsIHNoaWZ0aW5nIHRoZSBleHBvbmVudCBmaWVsZAorICAgICAqIGxlZnQgYnkgMTUgd29uJ3Qgb3ZlcmZsb3cgYSBsb25nIChhZ2FpbiBhc3N1bWluZyBzaXplb2YobG9uZykgPj0gNCkuCisgICAgICovCisgICAgdiA9IGZyZXhwKHYsICZleHBvKTsKKyAgICB2ICo9IDIxNDc0ODM2NDguMDsgICAgICAgICAgLyogMioqMzEgKi8KKyAgICBoaXBhcnQgPSAobG9uZyl2OyAgICAgICAgICAgLyogdGFrZSB0aGUgdG9wIDMyIGJpdHMgKi8KKyAgICB2ID0gKHYgLSAoZG91YmxlKWhpcGFydCkgKiAyMTQ3NDgzNjQ4LjA7IC8qIGdldCB0aGUgbmV4dCAzMiBiaXRzICovCisgICAgeCA9IGhpcGFydCArIChsb25nKXYgKyAoZXhwbyA8PCAxNSk7CisgICAgaWYgKHggPT0gLTEpCisgICAgICAgIHggPSAtMjsKKyAgICByZXR1cm4geDsKIH0KIAogbG9uZwogX1B5X0hhc2hQb2ludGVyKHZvaWQgKnApCiB7CiAjaWYgU0laRU9GX0xPTkcgPj0gU0laRU9GX1ZPSURfUAotCXJldHVybiAobG9uZylwOworICAgIHJldHVybiAobG9uZylwOwogI2Vsc2UKLQkvKiBjb252ZXJ0IHRvIGEgUHl0aG9uIGxvbmcgYW5kIGhhc2ggdGhhdCAqLwotCVB5T2JqZWN0KiBsb25nb2JqOwotCWxvbmcgeDsKKyAgICAvKiBjb252ZXJ0IHRvIGEgUHl0aG9uIGxvbmcgYW5kIGhhc2ggdGhhdCAqLworICAgIFB5T2JqZWN0KiBsb25nb2JqOworICAgIGxvbmcgeDsKIAotCWlmICgobG9uZ29iaiA9IFB5TG9uZ19Gcm9tVm9pZFB0cihwKSkgPT0gTlVMTCkgewotCQl4ID0gLTE7Ci0JCWdvdG8gZmluYWxseTsKLQl9Ci0JeCA9IFB5T2JqZWN0X0hhc2gobG9uZ29iaik7CisgICAgaWYgKChsb25nb2JqID0gUHlMb25nX0Zyb21Wb2lkUHRyKHApKSA9PSBOVUxMKSB7CisgICAgICAgIHggPSAtMTsKKyAgICAgICAgZ290byBmaW5hbGx5OworICAgIH0KKyAgICB4ID0gUHlPYmplY3RfSGFzaChsb25nb2JqKTsKIAogZmluYWxseToKLQlQeV9YREVDUkVGKGxvbmdvYmopOwotCXJldHVybiB4OworICAgIFB5X1hERUNSRUYobG9uZ29iaik7CisgICAgcmV0dXJuIHg7CiAjZW5kaWYKIH0KIAogbG9uZwogUHlPYmplY3RfSGFzaE5vdEltcGxlbWVudGVkKFB5T2JqZWN0ICpzZWxmKQogewotCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICJ1bmhhc2hhYmxlIHR5cGU6ICclLjIwMHMnIiwKLQkJICAgICBzZWxmLT5vYl90eXBlLT50cF9uYW1lKTsKLQlyZXR1cm4gLTE7CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgInVuaGFzaGFibGUgdHlwZTogJyUuMjAwcyciLAorICAgICAgICAgICAgICAgICBzZWxmLT5vYl90eXBlLT50cF9uYW1lKTsKKyAgICByZXR1cm4gLTE7CiB9CiAKIGxvbmcKIFB5T2JqZWN0X0hhc2goUHlPYmplY3QgKnYpCiB7Ci0JUHlUeXBlT2JqZWN0ICp0cCA9IHYtPm9iX3R5cGU7Ci0JaWYgKHRwLT50cF9oYXNoICE9IE5VTEwpCi0JCXJldHVybiAoKnRwLT50cF9oYXNoKSh2KTsKLQkvKiBUbyBrZWVwIHRvIHRoZSBnZW5lcmFsIHByYWN0aWNlIHRoYXQgaW5oZXJpdGluZwotCSAqIHNvbGVseSBmcm9tIG9iamVjdCBpbiBDIGNvZGUgc2hvdWxkIHdvcmsgd2l0aG91dAotCSAqIGFuIGV4cGxpY2l0IGNhbGwgdG8gUHlUeXBlX1JlYWR5LCB3ZSBpbXBsaWNpdGx5IGNhbGwKLQkgKiBQeVR5cGVfUmVhZHkgaGVyZSBhbmQgdGhlbiBjaGVjayB0aGUgdHBfaGFzaCBzbG90IGFnYWluCi0JICovCi0JaWYgKHRwLT50cF9kaWN0ID09IE5VTEwpIHsKLQkJaWYgKFB5VHlwZV9SZWFkeSh0cCkgPCAwKQotCQkJcmV0dXJuIC0xOwotCQlpZiAodHAtPnRwX2hhc2ggIT0gTlVMTCkKLQkJCXJldHVybiAoKnRwLT50cF9oYXNoKSh2KTsKLQl9Ci0JaWYgKHRwLT50cF9jb21wYXJlID09IE5VTEwgJiYgUklDSENPTVBBUkUodHApID09IE5VTEwpIHsKLQkJcmV0dXJuIF9QeV9IYXNoUG9pbnRlcih2KTsgLyogVXNlIGFkZHJlc3MgYXMgaGFzaCB2YWx1ZSAqLwotCX0KLQkvKiBJZiB0aGVyZSdzIGEgY21wIGJ1dCBubyBoYXNoIGRlZmluZWQsIHRoZSBvYmplY3QgY2FuJ3QgYmUgaGFzaGVkICovCi0JcmV0dXJuIFB5T2JqZWN0X0hhc2hOb3RJbXBsZW1lbnRlZCh2KTsKKyAgICBQeVR5cGVPYmplY3QgKnRwID0gdi0+b2JfdHlwZTsKKyAgICBpZiAodHAtPnRwX2hhc2ggIT0gTlVMTCkKKyAgICAgICAgcmV0dXJuICgqdHAtPnRwX2hhc2gpKHYpOworICAgIC8qIFRvIGtlZXAgdG8gdGhlIGdlbmVyYWwgcHJhY3RpY2UgdGhhdCBpbmhlcml0aW5nCisgICAgICogc29sZWx5IGZyb20gb2JqZWN0IGluIEMgY29kZSBzaG91bGQgd29yayB3aXRob3V0CisgICAgICogYW4gZXhwbGljaXQgY2FsbCB0byBQeVR5cGVfUmVhZHksIHdlIGltcGxpY2l0bHkgY2FsbAorICAgICAqIFB5VHlwZV9SZWFkeSBoZXJlIGFuZCB0aGVuIGNoZWNrIHRoZSB0cF9oYXNoIHNsb3QgYWdhaW4KKyAgICAgKi8KKyAgICBpZiAodHAtPnRwX2RpY3QgPT0gTlVMTCkgeworICAgICAgICBpZiAoUHlUeXBlX1JlYWR5KHRwKSA8IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmICh0cC0+dHBfaGFzaCAhPSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuICgqdHAtPnRwX2hhc2gpKHYpOworICAgIH0KKyAgICBpZiAodHAtPnRwX2NvbXBhcmUgPT0gTlVMTCAmJiBSSUNIQ09NUEFSRSh0cCkgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gX1B5X0hhc2hQb2ludGVyKHYpOyAvKiBVc2UgYWRkcmVzcyBhcyBoYXNoIHZhbHVlICovCisgICAgfQorICAgIC8qIElmIHRoZXJlJ3MgYSBjbXAgYnV0IG5vIGhhc2ggZGVmaW5lZCwgdGhlIG9iamVjdCBjYW4ndCBiZSBoYXNoZWQgKi8KKyAgICByZXR1cm4gUHlPYmplY3RfSGFzaE5vdEltcGxlbWVudGVkKHYpOwogfQogCiBQeU9iamVjdCAqCiBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKFB5T2JqZWN0ICp2LCBjb25zdCBjaGFyICpuYW1lKQogewotCVB5T2JqZWN0ICp3LCAqcmVzOworICAgIFB5T2JqZWN0ICp3LCAqcmVzOwogCi0JaWYgKFB5X1RZUEUodiktPnRwX2dldGF0dHIgIT0gTlVMTCkKLQkJcmV0dXJuICgqUHlfVFlQRSh2KS0+dHBfZ2V0YXR0cikodiwgKGNoYXIqKW5hbWUpOwotCXcgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKG5hbWUpOwotCWlmICh3ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXJlcyA9IFB5T2JqZWN0X0dldEF0dHIodiwgdyk7Ci0JUHlfWERFQ1JFRih3KTsKLQlyZXR1cm4gcmVzOworICAgIGlmIChQeV9UWVBFKHYpLT50cF9nZXRhdHRyICE9IE5VTEwpCisgICAgICAgIHJldHVybiAoKlB5X1RZUEUodiktPnRwX2dldGF0dHIpKHYsIChjaGFyKiluYW1lKTsKKyAgICB3ID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZyhuYW1lKTsKKyAgICBpZiAodyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXMgPSBQeU9iamVjdF9HZXRBdHRyKHYsIHcpOworICAgIFB5X1hERUNSRUYodyk7CisgICAgcmV0dXJuIHJlczsKIH0KIAogaW50CiBQeU9iamVjdF9IYXNBdHRyU3RyaW5nKFB5T2JqZWN0ICp2LCBjb25zdCBjaGFyICpuYW1lKQogewotCVB5T2JqZWN0ICpyZXMgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHYsIG5hbWUpOwotCWlmIChyZXMgIT0gTlVMTCkgewotCQlQeV9ERUNSRUYocmVzKTsKLQkJcmV0dXJuIDE7Ci0JfQotCVB5RXJyX0NsZWFyKCk7Ci0JcmV0dXJuIDA7CisgICAgUHlPYmplY3QgKnJlcyA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcodiwgbmFtZSk7CisgICAgaWYgKHJlcyAhPSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihyZXMpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICByZXR1cm4gMDsKIH0KIAogaW50CiBQeU9iamVjdF9TZXRBdHRyU3RyaW5nKFB5T2JqZWN0ICp2LCBjb25zdCBjaGFyICpuYW1lLCBQeU9iamVjdCAqdykKIHsKLQlQeU9iamVjdCAqczsKLQlpbnQgcmVzOworICAgIFB5T2JqZWN0ICpzOworICAgIGludCByZXM7CiAKLQlpZiAoUHlfVFlQRSh2KS0+dHBfc2V0YXR0ciAhPSBOVUxMKQotCQlyZXR1cm4gKCpQeV9UWVBFKHYpLT50cF9zZXRhdHRyKSh2LCAoY2hhciopbmFtZSwgdyk7Ci0JcyA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcobmFtZSk7Ci0JaWYgKHMgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCXJlcyA9IFB5T2JqZWN0X1NldEF0dHIodiwgcywgdyk7Ci0JUHlfWERFQ1JFRihzKTsKLQlyZXR1cm4gcmVzOworICAgIGlmIChQeV9UWVBFKHYpLT50cF9zZXRhdHRyICE9IE5VTEwpCisgICAgICAgIHJldHVybiAoKlB5X1RZUEUodiktPnRwX3NldGF0dHIpKHYsIChjaGFyKiluYW1lLCB3KTsKKyAgICBzID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZyhuYW1lKTsKKyAgICBpZiAocyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAgcmVzID0gUHlPYmplY3RfU2V0QXR0cih2LCBzLCB3KTsKKyAgICBQeV9YREVDUkVGKHMpOworICAgIHJldHVybiByZXM7CiB9CiAKIFB5T2JqZWN0ICoKIFB5T2JqZWN0X0dldEF0dHIoUHlPYmplY3QgKnYsIFB5T2JqZWN0ICpuYW1lKQogewotCVB5VHlwZU9iamVjdCAqdHAgPSBQeV9UWVBFKHYpOworICAgIFB5VHlwZU9iamVjdCAqdHAgPSBQeV9UWVBFKHYpOwogCi0JaWYgKCFQeVN0cmluZ19DaGVjayhuYW1lKSkgeworICAgIGlmICghUHlTdHJpbmdfQ2hlY2sobmFtZSkpIHsKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JCS8qIFRoZSBVbmljb2RlIHRvIHN0cmluZyBjb252ZXJzaW9uIGlzIGRvbmUgaGVyZSBiZWNhdXNlIHRoZQotCQkgICBleGlzdGluZyB0cF9nZXRhdHRybyBzbG90cyBleHBlY3QgYSBzdHJpbmcgb2JqZWN0IGFzIG5hbWUKLQkJICAgYW5kIHdlIHdvdWxkbid0IHdhbnQgdG8gYnJlYWsgdGhvc2UuICovCi0JCWlmIChQeVVuaWNvZGVfQ2hlY2sobmFtZSkpIHsKLQkJCW5hbWUgPSBfUHlVbmljb2RlX0FzRGVmYXVsdEVuY29kZWRTdHJpbmcobmFtZSwgTlVMTCk7Ci0JCQlpZiAobmFtZSA9PSBOVUxMKQotCQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWVsc2UKKyAgICAgICAgLyogVGhlIFVuaWNvZGUgdG8gc3RyaW5nIGNvbnZlcnNpb24gaXMgZG9uZSBoZXJlIGJlY2F1c2UgdGhlCisgICAgICAgICAgIGV4aXN0aW5nIHRwX2dldGF0dHJvIHNsb3RzIGV4cGVjdCBhIHN0cmluZyBvYmplY3QgYXMgbmFtZQorICAgICAgICAgICBhbmQgd2Ugd291bGRuJ3Qgd2FudCB0byBicmVhayB0aG9zZS4gKi8KKyAgICAgICAgaWYgKFB5VW5pY29kZV9DaGVjayhuYW1lKSkgeworICAgICAgICAgICAgbmFtZSA9IF9QeVVuaWNvZGVfQXNEZWZhdWx0RW5jb2RlZFN0cmluZyhuYW1lLCBOVUxMKTsKKyAgICAgICAgICAgIGlmIChuYW1lID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQogI2VuZGlmCi0JCXsKLQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkJICAgICAiYXR0cmlidXRlIG5hbWUgbXVzdCBiZSBzdHJpbmcsIG5vdCAnJS4yMDBzJyIsCi0JCQkJICAgICBQeV9UWVBFKG5hbWUpLT50cF9uYW1lKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQotCWlmICh0cC0+dHBfZ2V0YXR0cm8gIT0gTlVMTCkKLQkJcmV0dXJuICgqdHAtPnRwX2dldGF0dHJvKSh2LCBuYW1lKTsKLQlpZiAodHAtPnRwX2dldGF0dHIgIT0gTlVMTCkKLQkJcmV0dXJuICgqdHAtPnRwX2dldGF0dHIpKHYsIFB5U3RyaW5nX0FTX1NUUklORyhuYW1lKSk7Ci0JUHlFcnJfRm9ybWF0KFB5RXhjX0F0dHJpYnV0ZUVycm9yLAotCQkgICAgICInJS41MHMnIG9iamVjdCBoYXMgbm8gYXR0cmlidXRlICclLjQwMHMnIiwKLQkJICAgICB0cC0+dHBfbmFtZSwgUHlTdHJpbmdfQVNfU1RSSU5HKG5hbWUpKTsKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgeworICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiYXR0cmlidXRlIG5hbWUgbXVzdCBiZSBzdHJpbmcsIG5vdCAnJS4yMDBzJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRShuYW1lKS0+dHBfbmFtZSk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAodHAtPnRwX2dldGF0dHJvICE9IE5VTEwpCisgICAgICAgIHJldHVybiAoKnRwLT50cF9nZXRhdHRybykodiwgbmFtZSk7CisgICAgaWYgKHRwLT50cF9nZXRhdHRyICE9IE5VTEwpCisgICAgICAgIHJldHVybiAoKnRwLT50cF9nZXRhdHRyKSh2LCBQeVN0cmluZ19BU19TVFJJTkcobmFtZSkpOworICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19BdHRyaWJ1dGVFcnJvciwKKyAgICAgICAgICAgICAgICAgIiclLjUwcycgb2JqZWN0IGhhcyBubyBhdHRyaWJ1dGUgJyUuNDAwcyciLAorICAgICAgICAgICAgICAgICB0cC0+dHBfbmFtZSwgUHlTdHJpbmdfQVNfU1RSSU5HKG5hbWUpKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogaW50CiBQeU9iamVjdF9IYXNBdHRyKFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqbmFtZSkKIHsKLQlQeU9iamVjdCAqcmVzID0gUHlPYmplY3RfR2V0QXR0cih2LCBuYW1lKTsKLQlpZiAocmVzICE9IE5VTEwpIHsKLQkJUHlfREVDUkVGKHJlcyk7Ci0JCXJldHVybiAxOwotCX0KLQlQeUVycl9DbGVhcigpOwotCXJldHVybiAwOworICAgIFB5T2JqZWN0ICpyZXMgPSBQeU9iamVjdF9HZXRBdHRyKHYsIG5hbWUpOworICAgIGlmIChyZXMgIT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYocmVzKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIFB5RXJyX0NsZWFyKCk7CisgICAgcmV0dXJuIDA7CiB9CiAKIGludAogUHlPYmplY3RfU2V0QXR0cihQeU9iamVjdCAqdiwgUHlPYmplY3QgKm5hbWUsIFB5T2JqZWN0ICp2YWx1ZSkKIHsKLQlQeVR5cGVPYmplY3QgKnRwID0gUHlfVFlQRSh2KTsKLQlpbnQgZXJyOworICAgIFB5VHlwZU9iamVjdCAqdHAgPSBQeV9UWVBFKHYpOworICAgIGludCBlcnI7CiAKLQlpZiAoIVB5U3RyaW5nX0NoZWNrKG5hbWUpKXsKKyAgICBpZiAoIVB5U3RyaW5nX0NoZWNrKG5hbWUpKXsKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JCS8qIFRoZSBVbmljb2RlIHRvIHN0cmluZyBjb252ZXJzaW9uIGlzIGRvbmUgaGVyZSBiZWNhdXNlIHRoZQotCQkgICBleGlzdGluZyB0cF9zZXRhdHRybyBzbG90cyBleHBlY3QgYSBzdHJpbmcgb2JqZWN0IGFzIG5hbWUKLQkJICAgYW5kIHdlIHdvdWxkbid0IHdhbnQgdG8gYnJlYWsgdGhvc2UuICovCi0JCWlmIChQeVVuaWNvZGVfQ2hlY2sobmFtZSkpIHsKLQkJCW5hbWUgPSBQeVVuaWNvZGVfQXNFbmNvZGVkU3RyaW5nKG5hbWUsIE5VTEwsIE5VTEwpOwotCQkJaWYgKG5hbWUgPT0gTlVMTCkKLQkJCQlyZXR1cm4gLTE7Ci0JCX0KLQkJZWxzZQorICAgICAgICAvKiBUaGUgVW5pY29kZSB0byBzdHJpbmcgY29udmVyc2lvbiBpcyBkb25lIGhlcmUgYmVjYXVzZSB0aGUKKyAgICAgICAgICAgZXhpc3RpbmcgdHBfc2V0YXR0cm8gc2xvdHMgZXhwZWN0IGEgc3RyaW5nIG9iamVjdCBhcyBuYW1lCisgICAgICAgICAgIGFuZCB3ZSB3b3VsZG4ndCB3YW50IHRvIGJyZWFrIHRob3NlLiAqLworICAgICAgICBpZiAoUHlVbmljb2RlX0NoZWNrKG5hbWUpKSB7CisgICAgICAgICAgICBuYW1lID0gUHlVbmljb2RlX0FzRW5jb2RlZFN0cmluZyhuYW1lLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgICAgIGlmIChuYW1lID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGVsc2UKICNlbmRpZgotCQl7Ci0JCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJCSAgICAgImF0dHJpYnV0ZSBuYW1lIG11c3QgYmUgc3RyaW5nLCBub3QgJyUuMjAwcyciLAotCQkJCSAgICAgUHlfVFlQRShuYW1lKS0+dHBfbmFtZSk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9Ci0JZWxzZQotCQlQeV9JTkNSRUYobmFtZSk7CisgICAgICAgIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgImF0dHJpYnV0ZSBuYW1lIG11c3QgYmUgc3RyaW5nLCBub3QgJyUuMjAwcyciLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5X1RZUEUobmFtZSktPnRwX25hbWUpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgUHlfSU5DUkVGKG5hbWUpOwogCi0JUHlTdHJpbmdfSW50ZXJuSW5QbGFjZSgmbmFtZSk7Ci0JaWYgKHRwLT50cF9zZXRhdHRybyAhPSBOVUxMKSB7Ci0JCWVyciA9ICgqdHAtPnRwX3NldGF0dHJvKSh2LCBuYW1lLCB2YWx1ZSk7Ci0JCVB5X0RFQ1JFRihuYW1lKTsKLQkJcmV0dXJuIGVycjsKLQl9Ci0JaWYgKHRwLT50cF9zZXRhdHRyICE9IE5VTEwpIHsKLQkJZXJyID0gKCp0cC0+dHBfc2V0YXR0cikodiwgUHlTdHJpbmdfQVNfU1RSSU5HKG5hbWUpLCB2YWx1ZSk7Ci0JCVB5X0RFQ1JFRihuYW1lKTsKLQkJcmV0dXJuIGVycjsKLQl9Ci0JUHlfREVDUkVGKG5hbWUpOwotCWlmICh0cC0+dHBfZ2V0YXR0ciA9PSBOVUxMICYmIHRwLT50cF9nZXRhdHRybyA9PSBOVUxMKQotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJICAgICAiJyUuMTAwcycgb2JqZWN0IGhhcyBubyBhdHRyaWJ1dGVzICIKLQkJCSAgICAgIiglcyAuJS4xMDBzKSIsCi0JCQkgICAgIHRwLT50cF9uYW1lLAotCQkJICAgICB2YWx1ZT09TlVMTCA/ICJkZWwiIDogImFzc2lnbiB0byIsCi0JCQkgICAgIFB5U3RyaW5nX0FTX1NUUklORyhuYW1lKSk7Ci0JZWxzZQotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJICAgICAiJyUuMTAwcycgb2JqZWN0IGhhcyBvbmx5IHJlYWQtb25seSBhdHRyaWJ1dGVzICIKLQkJCSAgICAgIiglcyAuJS4xMDBzKSIsCi0JCQkgICAgIHRwLT50cF9uYW1lLAotCQkJICAgICB2YWx1ZT09TlVMTCA/ICJkZWwiIDogImFzc2lnbiB0byIsCi0JCQkgICAgIFB5U3RyaW5nX0FTX1NUUklORyhuYW1lKSk7Ci0JcmV0dXJuIC0xOworICAgIFB5U3RyaW5nX0ludGVybkluUGxhY2UoJm5hbWUpOworICAgIGlmICh0cC0+dHBfc2V0YXR0cm8gIT0gTlVMTCkgeworICAgICAgICBlcnIgPSAoKnRwLT50cF9zZXRhdHRybykodiwgbmFtZSwgdmFsdWUpOworICAgICAgICBQeV9ERUNSRUYobmFtZSk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorICAgIGlmICh0cC0+dHBfc2V0YXR0ciAhPSBOVUxMKSB7CisgICAgICAgIGVyciA9ICgqdHAtPnRwX3NldGF0dHIpKHYsIFB5U3RyaW5nX0FTX1NUUklORyhuYW1lKSwgdmFsdWUpOworICAgICAgICBQeV9ERUNSRUYobmFtZSk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorICAgIFB5X0RFQ1JFRihuYW1lKTsKKyAgICBpZiAodHAtPnRwX2dldGF0dHIgPT0gTlVMTCAmJiB0cC0+dHBfZ2V0YXR0cm8gPT0gTlVMTCkKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICInJS4xMDBzJyBvYmplY3QgaGFzIG5vIGF0dHJpYnV0ZXMgIgorICAgICAgICAgICAgICAgICAgICAgIiglcyAuJS4xMDBzKSIsCisgICAgICAgICAgICAgICAgICAgICB0cC0+dHBfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIHZhbHVlPT1OVUxMID8gImRlbCIgOiAiYXNzaWduIHRvIiwKKyAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FTX1NUUklORyhuYW1lKSk7CisgICAgZWxzZQorICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIiclLjEwMHMnIG9iamVjdCBoYXMgb25seSByZWFkLW9ubHkgYXR0cmlidXRlcyAiCisgICAgICAgICAgICAgICAgICAgICAiKCVzIC4lLjEwMHMpIiwKKyAgICAgICAgICAgICAgICAgICAgIHRwLT50cF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgdmFsdWU9PU5VTEwgPyAiZGVsIiA6ICJhc3NpZ24gdG8iLAorICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKG5hbWUpKTsKKyAgICByZXR1cm4gLTE7CiB9CiAKIC8qIEhlbHBlciB0byBnZXQgYSBwb2ludGVyIHRvIGFuIG9iamVjdCdzIF9fZGljdF9fIHNsb3QsIGlmIGFueSAqLwpAQCAtMTI3NiwzNSArMTI3NiwzNSBAQAogUHlPYmplY3QgKioKIF9QeU9iamVjdF9HZXREaWN0UHRyKFB5T2JqZWN0ICpvYmopCiB7Ci0JUHlfc3NpemVfdCBkaWN0b2Zmc2V0OwotCVB5VHlwZU9iamVjdCAqdHAgPSBQeV9UWVBFKG9iaik7CisgICAgUHlfc3NpemVfdCBkaWN0b2Zmc2V0OworICAgIFB5VHlwZU9iamVjdCAqdHAgPSBQeV9UWVBFKG9iaik7CiAKLQlpZiAoISh0cC0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hBVkVfQ0xBU1MpKQotCQlyZXR1cm4gTlVMTDsKLQlkaWN0b2Zmc2V0ID0gdHAtPnRwX2RpY3RvZmZzZXQ7Ci0JaWYgKGRpY3RvZmZzZXQgPT0gMCkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKGRpY3RvZmZzZXQgPCAwKSB7Ci0JCVB5X3NzaXplX3QgdHNpemU7Ci0JCXNpemVfdCBzaXplOworICAgIGlmICghKHRwLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEFWRV9DTEFTUykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGRpY3RvZmZzZXQgPSB0cC0+dHBfZGljdG9mZnNldDsKKyAgICBpZiAoZGljdG9mZnNldCA9PSAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoZGljdG9mZnNldCA8IDApIHsKKyAgICAgICAgUHlfc3NpemVfdCB0c2l6ZTsKKyAgICAgICAgc2l6ZV90IHNpemU7CiAKLQkJdHNpemUgPSAoKFB5VmFyT2JqZWN0ICopb2JqKS0+b2Jfc2l6ZTsKLQkJaWYgKHRzaXplIDwgMCkKLQkJCXRzaXplID0gLXRzaXplOwotCQlzaXplID0gX1B5T2JqZWN0X1ZBUl9TSVpFKHRwLCB0c2l6ZSk7CisgICAgICAgIHRzaXplID0gKChQeVZhck9iamVjdCAqKW9iaiktPm9iX3NpemU7CisgICAgICAgIGlmICh0c2l6ZSA8IDApCisgICAgICAgICAgICB0c2l6ZSA9IC10c2l6ZTsKKyAgICAgICAgc2l6ZSA9IF9QeU9iamVjdF9WQVJfU0laRSh0cCwgdHNpemUpOwogCi0JCWRpY3RvZmZzZXQgKz0gKGxvbmcpc2l6ZTsKLQkJYXNzZXJ0KGRpY3RvZmZzZXQgPiAwKTsKLQkJYXNzZXJ0KGRpY3RvZmZzZXQgJSBTSVpFT0ZfVk9JRF9QID09IDApOwotCX0KLQlyZXR1cm4gKFB5T2JqZWN0ICoqKSAoKGNoYXIgKilvYmogKyBkaWN0b2Zmc2V0KTsKKyAgICAgICAgZGljdG9mZnNldCArPSAobG9uZylzaXplOworICAgICAgICBhc3NlcnQoZGljdG9mZnNldCA+IDApOworICAgICAgICBhc3NlcnQoZGljdG9mZnNldCAlIFNJWkVPRl9WT0lEX1AgPT0gMCk7CisgICAgfQorICAgIHJldHVybiAoUHlPYmplY3QgKiopICgoY2hhciAqKW9iaiArIGRpY3RvZmZzZXQpOwogfQogCiBQeU9iamVjdCAqCiBQeU9iamVjdF9TZWxmSXRlcihQeU9iamVjdCAqb2JqKQogewotCVB5X0lOQ1JFRihvYmopOwotCXJldHVybiBvYmo7CisgICAgUHlfSU5DUkVGKG9iaik7CisgICAgcmV0dXJuIG9iajsKIH0KIAogLyogR2VuZXJpYyBHZXRBdHRyIGZ1bmN0aW9ucyAtIHB1dCB0aGVzZSBpbiB5b3VyIHRwX1tnc11ldGF0dHJvIHNsb3QgKi8KQEAgLTEzMTIsMjIxICsxMzEyLDIyMSBAQAogUHlPYmplY3QgKgogUHlPYmplY3RfR2VuZXJpY0dldEF0dHIoUHlPYmplY3QgKm9iaiwgUHlPYmplY3QgKm5hbWUpCiB7Ci0JUHlUeXBlT2JqZWN0ICp0cCA9IFB5X1RZUEUob2JqKTsKLQlQeU9iamVjdCAqZGVzY3IgPSBOVUxMOwotCVB5T2JqZWN0ICpyZXMgPSBOVUxMOwotCWRlc2NyZ2V0ZnVuYyBmOwotCVB5X3NzaXplX3QgZGljdG9mZnNldDsKLQlQeU9iamVjdCAqKmRpY3RwdHI7CisgICAgUHlUeXBlT2JqZWN0ICp0cCA9IFB5X1RZUEUob2JqKTsKKyAgICBQeU9iamVjdCAqZGVzY3IgPSBOVUxMOworICAgIFB5T2JqZWN0ICpyZXMgPSBOVUxMOworICAgIGRlc2NyZ2V0ZnVuYyBmOworICAgIFB5X3NzaXplX3QgZGljdG9mZnNldDsKKyAgICBQeU9iamVjdCAqKmRpY3RwdHI7CiAKLQlpZiAoIVB5U3RyaW5nX0NoZWNrKG5hbWUpKXsKKyAgICBpZiAoIVB5U3RyaW5nX0NoZWNrKG5hbWUpKXsKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JCS8qIFRoZSBVbmljb2RlIHRvIHN0cmluZyBjb252ZXJzaW9uIGlzIGRvbmUgaGVyZSBiZWNhdXNlIHRoZQotCQkgICBleGlzdGluZyB0cF9zZXRhdHRybyBzbG90cyBleHBlY3QgYSBzdHJpbmcgb2JqZWN0IGFzIG5hbWUKLQkJICAgYW5kIHdlIHdvdWxkbid0IHdhbnQgdG8gYnJlYWsgdGhvc2UuICovCi0JCWlmIChQeVVuaWNvZGVfQ2hlY2sobmFtZSkpIHsKLQkJCW5hbWUgPSBQeVVuaWNvZGVfQXNFbmNvZGVkU3RyaW5nKG5hbWUsIE5VTEwsIE5VTEwpOwotCQkJaWYgKG5hbWUgPT0gTlVMTCkKLQkJCQlyZXR1cm4gTlVMTDsKLQkJfQotCQllbHNlCisgICAgICAgIC8qIFRoZSBVbmljb2RlIHRvIHN0cmluZyBjb252ZXJzaW9uIGlzIGRvbmUgaGVyZSBiZWNhdXNlIHRoZQorICAgICAgICAgICBleGlzdGluZyB0cF9zZXRhdHRybyBzbG90cyBleHBlY3QgYSBzdHJpbmcgb2JqZWN0IGFzIG5hbWUKKyAgICAgICAgICAgYW5kIHdlIHdvdWxkbid0IHdhbnQgdG8gYnJlYWsgdGhvc2UuICovCisgICAgICAgIGlmIChQeVVuaWNvZGVfQ2hlY2sobmFtZSkpIHsKKyAgICAgICAgICAgIG5hbWUgPSBQeVVuaWNvZGVfQXNFbmNvZGVkU3RyaW5nKG5hbWUsIE5VTEwsIE5VTEwpOworICAgICAgICAgICAgaWYgKG5hbWUgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCiAjZW5kaWYKLQkJewotCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCQkgICAgICJhdHRyaWJ1dGUgbmFtZSBtdXN0IGJlIHN0cmluZywgbm90ICclLjIwMHMnIiwKLQkJCQkgICAgIFB5X1RZUEUobmFtZSktPnRwX25hbWUpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9Ci0JZWxzZQotCQlQeV9JTkNSRUYobmFtZSk7CisgICAgICAgIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgImF0dHJpYnV0ZSBuYW1lIG11c3QgYmUgc3RyaW5nLCBub3QgJyUuMjAwcyciLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5X1RZUEUobmFtZSktPnRwX25hbWUpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgICAgICBQeV9JTkNSRUYobmFtZSk7CiAKLQlpZiAodHAtPnRwX2RpY3QgPT0gTlVMTCkgewotCQlpZiAoUHlUeXBlX1JlYWR5KHRwKSA8IDApCi0JCQlnb3RvIGRvbmU7Ci0JfQorICAgIGlmICh0cC0+dHBfZGljdCA9PSBOVUxMKSB7CisgICAgICAgIGlmIChQeVR5cGVfUmVhZHkodHApIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICB9CiAKICNpZiAwIC8qIFhYWCB0aGlzIGlzIG5vdCBxdWl0ZSBfUHlUeXBlX0xvb2t1cCBhbnltb3JlICovCi0JLyogSW5saW5lIF9QeVR5cGVfTG9va3VwICovCi0JewotCQlQeV9zc2l6ZV90IGksIG47Ci0JCVB5T2JqZWN0ICptcm8sICpiYXNlLCAqZGljdDsKKyAgICAvKiBJbmxpbmUgX1B5VHlwZV9Mb29rdXAgKi8KKyAgICB7CisgICAgICAgIFB5X3NzaXplX3QgaSwgbjsKKyAgICAgICAgUHlPYmplY3QgKm1ybywgKmJhc2UsICpkaWN0OwogCi0JCS8qIExvb2sgaW4gdHBfZGljdCBvZiB0eXBlcyBpbiBNUk8gKi8KLQkJbXJvID0gdHAtPnRwX21ybzsKLQkJYXNzZXJ0KG1ybyAhPSBOVUxMKTsKLQkJYXNzZXJ0KFB5VHVwbGVfQ2hlY2sobXJvKSk7Ci0JCW4gPSBQeVR1cGxlX0dFVF9TSVpFKG1ybyk7Ci0JCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJCWJhc2UgPSBQeVR1cGxlX0dFVF9JVEVNKG1ybywgaSk7Ci0JCQlpZiAoUHlDbGFzc19DaGVjayhiYXNlKSkKLQkJCQlkaWN0ID0gKChQeUNsYXNzT2JqZWN0ICopYmFzZSktPmNsX2RpY3Q7Ci0JCQllbHNlIHsKLQkJCQlhc3NlcnQoUHlUeXBlX0NoZWNrKGJhc2UpKTsKLQkJCQlkaWN0ID0gKChQeVR5cGVPYmplY3QgKiliYXNlKS0+dHBfZGljdDsKLQkJCX0KLQkJCWFzc2VydChkaWN0ICYmIFB5RGljdF9DaGVjayhkaWN0KSk7Ci0JCQlkZXNjciA9IFB5RGljdF9HZXRJdGVtKGRpY3QsIG5hbWUpOwotCQkJaWYgKGRlc2NyICE9IE5VTEwpCi0JCQkJYnJlYWs7Ci0JCX0KLQl9CisgICAgICAgIC8qIExvb2sgaW4gdHBfZGljdCBvZiB0eXBlcyBpbiBNUk8gKi8KKyAgICAgICAgbXJvID0gdHAtPnRwX21ybzsKKyAgICAgICAgYXNzZXJ0KG1ybyAhPSBOVUxMKTsKKyAgICAgICAgYXNzZXJ0KFB5VHVwbGVfQ2hlY2sobXJvKSk7CisgICAgICAgIG4gPSBQeVR1cGxlX0dFVF9TSVpFKG1ybyk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICAgIGJhc2UgPSBQeVR1cGxlX0dFVF9JVEVNKG1ybywgaSk7CisgICAgICAgICAgICBpZiAoUHlDbGFzc19DaGVjayhiYXNlKSkKKyAgICAgICAgICAgICAgICBkaWN0ID0gKChQeUNsYXNzT2JqZWN0ICopYmFzZSktPmNsX2RpY3Q7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBhc3NlcnQoUHlUeXBlX0NoZWNrKGJhc2UpKTsKKyAgICAgICAgICAgICAgICBkaWN0ID0gKChQeVR5cGVPYmplY3QgKiliYXNlKS0+dHBfZGljdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFzc2VydChkaWN0ICYmIFB5RGljdF9DaGVjayhkaWN0KSk7CisgICAgICAgICAgICBkZXNjciA9IFB5RGljdF9HZXRJdGVtKGRpY3QsIG5hbWUpOworICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CiAjZWxzZQotCWRlc2NyID0gX1B5VHlwZV9Mb29rdXAodHAsIG5hbWUpOworICAgIGRlc2NyID0gX1B5VHlwZV9Mb29rdXAodHAsIG5hbWUpOwogI2VuZGlmCiAKLQlQeV9YSU5DUkVGKGRlc2NyKTsKKyAgICBQeV9YSU5DUkVGKGRlc2NyKTsKIAotCWYgPSBOVUxMOwotCWlmIChkZXNjciAhPSBOVUxMICYmCi0JICAgIFB5VHlwZV9IYXNGZWF0dXJlKGRlc2NyLT5vYl90eXBlLCBQeV9UUEZMQUdTX0hBVkVfQ0xBU1MpKSB7Ci0JCWYgPSBkZXNjci0+b2JfdHlwZS0+dHBfZGVzY3JfZ2V0OwotCQlpZiAoZiAhPSBOVUxMICYmIFB5RGVzY3JfSXNEYXRhKGRlc2NyKSkgewotCQkJcmVzID0gZihkZXNjciwgb2JqLCAoUHlPYmplY3QgKilvYmotPm9iX3R5cGUpOwotCQkJUHlfREVDUkVGKGRlc2NyKTsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCX0KKyAgICBmID0gTlVMTDsKKyAgICBpZiAoZGVzY3IgIT0gTlVMTCAmJgorICAgICAgICBQeVR5cGVfSGFzRmVhdHVyZShkZXNjci0+b2JfdHlwZSwgUHlfVFBGTEFHU19IQVZFX0NMQVNTKSkgeworICAgICAgICBmID0gZGVzY3ItPm9iX3R5cGUtPnRwX2Rlc2NyX2dldDsKKyAgICAgICAgaWYgKGYgIT0gTlVMTCAmJiBQeURlc2NyX0lzRGF0YShkZXNjcikpIHsKKyAgICAgICAgICAgIHJlcyA9IGYoZGVzY3IsIG9iaiwgKFB5T2JqZWN0ICopb2JqLT5vYl90eXBlKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihkZXNjcik7CisgICAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKiBJbmxpbmUgX1B5T2JqZWN0X0dldERpY3RQdHIgKi8KLQlkaWN0b2Zmc2V0ID0gdHAtPnRwX2RpY3RvZmZzZXQ7Ci0JaWYgKGRpY3RvZmZzZXQgIT0gMCkgewotCQlQeU9iamVjdCAqZGljdDsKLQkJaWYgKGRpY3RvZmZzZXQgPCAwKSB7Ci0JCQlQeV9zc2l6ZV90IHRzaXplOwotCQkJc2l6ZV90IHNpemU7CisgICAgLyogSW5saW5lIF9QeU9iamVjdF9HZXREaWN0UHRyICovCisgICAgZGljdG9mZnNldCA9IHRwLT50cF9kaWN0b2Zmc2V0OworICAgIGlmIChkaWN0b2Zmc2V0ICE9IDApIHsKKyAgICAgICAgUHlPYmplY3QgKmRpY3Q7CisgICAgICAgIGlmIChkaWN0b2Zmc2V0IDwgMCkgeworICAgICAgICAgICAgUHlfc3NpemVfdCB0c2l6ZTsKKyAgICAgICAgICAgIHNpemVfdCBzaXplOwogCi0JCQl0c2l6ZSA9ICgoUHlWYXJPYmplY3QgKilvYmopLT5vYl9zaXplOwotCQkJaWYgKHRzaXplIDwgMCkKLQkJCQl0c2l6ZSA9IC10c2l6ZTsKLQkJCXNpemUgPSBfUHlPYmplY3RfVkFSX1NJWkUodHAsIHRzaXplKTsKKyAgICAgICAgICAgIHRzaXplID0gKChQeVZhck9iamVjdCAqKW9iaiktPm9iX3NpemU7CisgICAgICAgICAgICBpZiAodHNpemUgPCAwKQorICAgICAgICAgICAgICAgIHRzaXplID0gLXRzaXplOworICAgICAgICAgICAgc2l6ZSA9IF9QeU9iamVjdF9WQVJfU0laRSh0cCwgdHNpemUpOwogCi0JCQlkaWN0b2Zmc2V0ICs9IChsb25nKXNpemU7Ci0JCQlhc3NlcnQoZGljdG9mZnNldCA+IDApOwotCQkJYXNzZXJ0KGRpY3RvZmZzZXQgJSBTSVpFT0ZfVk9JRF9QID09IDApOwotCQl9Ci0JCWRpY3RwdHIgPSAoUHlPYmplY3QgKiopICgoY2hhciAqKW9iaiArIGRpY3RvZmZzZXQpOwotCQlkaWN0ID0gKmRpY3RwdHI7Ci0JCWlmIChkaWN0ICE9IE5VTEwpIHsKLQkJCVB5X0lOQ1JFRihkaWN0KTsKLQkJCXJlcyA9IFB5RGljdF9HZXRJdGVtKGRpY3QsIG5hbWUpOwotCQkJaWYgKHJlcyAhPSBOVUxMKSB7Ci0JCQkJUHlfSU5DUkVGKHJlcyk7Ci0JCQkJUHlfWERFQ1JFRihkZXNjcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihkaWN0KTsKLQkJCQlnb3RvIGRvbmU7Ci0JCQl9Ci0gICAgICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoZGljdCk7Ci0JCX0KLQl9CisgICAgICAgICAgICBkaWN0b2Zmc2V0ICs9IChsb25nKXNpemU7CisgICAgICAgICAgICBhc3NlcnQoZGljdG9mZnNldCA+IDApOworICAgICAgICAgICAgYXNzZXJ0KGRpY3RvZmZzZXQgJSBTSVpFT0ZfVk9JRF9QID09IDApOworICAgICAgICB9CisgICAgICAgIGRpY3RwdHIgPSAoUHlPYmplY3QgKiopICgoY2hhciAqKW9iaiArIGRpY3RvZmZzZXQpOworICAgICAgICBkaWN0ID0gKmRpY3RwdHI7CisgICAgICAgIGlmIChkaWN0ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihkaWN0KTsKKyAgICAgICAgICAgIHJlcyA9IFB5RGljdF9HZXRJdGVtKGRpY3QsIG5hbWUpOworICAgICAgICAgICAgaWYgKHJlcyAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlfSU5DUkVGKHJlcyk7CisgICAgICAgICAgICAgICAgUHlfWERFQ1JFRihkZXNjcik7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGRpY3QpOworICAgICAgICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5X0RFQ1JFRihkaWN0KTsKKyAgICAgICAgfQorICAgIH0KIAotCWlmIChmICE9IE5VTEwpIHsKLQkJcmVzID0gZihkZXNjciwgb2JqLCAoUHlPYmplY3QgKilQeV9UWVBFKG9iaikpOwotCQlQeV9ERUNSRUYoZGVzY3IpOwotCQlnb3RvIGRvbmU7Ci0JfQorICAgIGlmIChmICE9IE5VTEwpIHsKKyAgICAgICAgcmVzID0gZihkZXNjciwgb2JqLCAoUHlPYmplY3QgKilQeV9UWVBFKG9iaikpOworICAgICAgICBQeV9ERUNSRUYoZGVzY3IpOworICAgICAgICBnb3RvIGRvbmU7CisgICAgfQogCi0JaWYgKGRlc2NyICE9IE5VTEwpIHsKLQkJcmVzID0gZGVzY3I7Ci0JCS8qIGRlc2NyIHdhcyBhbHJlYWR5IGluY3JlZmVkIGFib3ZlICovCi0JCWdvdG8gZG9uZTsKLQl9CisgICAgaWYgKGRlc2NyICE9IE5VTEwpIHsKKyAgICAgICAgcmVzID0gZGVzY3I7CisgICAgICAgIC8qIGRlc2NyIHdhcyBhbHJlYWR5IGluY3JlZmVkIGFib3ZlICovCisgICAgICAgIGdvdG8gZG9uZTsKKyAgICB9CiAKLQlQeUVycl9Gb3JtYXQoUHlFeGNfQXR0cmlidXRlRXJyb3IsCi0JCSAgICAgIiclLjUwcycgb2JqZWN0IGhhcyBubyBhdHRyaWJ1dGUgJyUuNDAwcyciLAotCQkgICAgIHRwLT50cF9uYW1lLCBQeVN0cmluZ19BU19TVFJJTkcobmFtZSkpOworICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19BdHRyaWJ1dGVFcnJvciwKKyAgICAgICAgICAgICAgICAgIiclLjUwcycgb2JqZWN0IGhhcyBubyBhdHRyaWJ1dGUgJyUuNDAwcyciLAorICAgICAgICAgICAgICAgICB0cC0+dHBfbmFtZSwgUHlTdHJpbmdfQVNfU1RSSU5HKG5hbWUpKTsKICAgZG9uZToKLQlQeV9ERUNSRUYobmFtZSk7Ci0JcmV0dXJuIHJlczsKKyAgICBQeV9ERUNSRUYobmFtZSk7CisgICAgcmV0dXJuIHJlczsKIH0KIAogaW50CiBQeU9iamVjdF9HZW5lcmljU2V0QXR0cihQeU9iamVjdCAqb2JqLCBQeU9iamVjdCAqbmFtZSwgUHlPYmplY3QgKnZhbHVlKQogewotCVB5VHlwZU9iamVjdCAqdHAgPSBQeV9UWVBFKG9iaik7Ci0JUHlPYmplY3QgKmRlc2NyOwotCWRlc2Nyc2V0ZnVuYyBmOwotCVB5T2JqZWN0ICoqZGljdHB0cjsKLQlpbnQgcmVzID0gLTE7CisgICAgUHlUeXBlT2JqZWN0ICp0cCA9IFB5X1RZUEUob2JqKTsKKyAgICBQeU9iamVjdCAqZGVzY3I7CisgICAgZGVzY3JzZXRmdW5jIGY7CisgICAgUHlPYmplY3QgKipkaWN0cHRyOworICAgIGludCByZXMgPSAtMTsKIAotCWlmICghUHlTdHJpbmdfQ2hlY2sobmFtZSkpeworICAgIGlmICghUHlTdHJpbmdfQ2hlY2sobmFtZSkpewogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQkJLyogVGhlIFVuaWNvZGUgdG8gc3RyaW5nIGNvbnZlcnNpb24gaXMgZG9uZSBoZXJlIGJlY2F1c2UgdGhlCi0JCSAgIGV4aXN0aW5nIHRwX3NldGF0dHJvIHNsb3RzIGV4cGVjdCBhIHN0cmluZyBvYmplY3QgYXMgbmFtZQotCQkgICBhbmQgd2Ugd291bGRuJ3Qgd2FudCB0byBicmVhayB0aG9zZS4gKi8KLQkJaWYgKFB5VW5pY29kZV9DaGVjayhuYW1lKSkgewotCQkJbmFtZSA9IFB5VW5pY29kZV9Bc0VuY29kZWRTdHJpbmcobmFtZSwgTlVMTCwgTlVMTCk7Ci0JCQlpZiAobmFtZSA9PSBOVUxMKQotCQkJCXJldHVybiAtMTsKLQkJfQotCQllbHNlCisgICAgICAgIC8qIFRoZSBVbmljb2RlIHRvIHN0cmluZyBjb252ZXJzaW9uIGlzIGRvbmUgaGVyZSBiZWNhdXNlIHRoZQorICAgICAgICAgICBleGlzdGluZyB0cF9zZXRhdHRybyBzbG90cyBleHBlY3QgYSBzdHJpbmcgb2JqZWN0IGFzIG5hbWUKKyAgICAgICAgICAgYW5kIHdlIHdvdWxkbid0IHdhbnQgdG8gYnJlYWsgdGhvc2UuICovCisgICAgICAgIGlmIChQeVVuaWNvZGVfQ2hlY2sobmFtZSkpIHsKKyAgICAgICAgICAgIG5hbWUgPSBQeVVuaWNvZGVfQXNFbmNvZGVkU3RyaW5nKG5hbWUsIE5VTEwsIE5VTEwpOworICAgICAgICAgICAgaWYgKG5hbWUgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQogI2VuZGlmCi0JCXsKLQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkJICAgICAiYXR0cmlidXRlIG5hbWUgbXVzdCBiZSBzdHJpbmcsIG5vdCAnJS4yMDBzJyIsCi0JCQkJICAgICBQeV9UWVBFKG5hbWUpLT50cF9uYW1lKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCX0KLQllbHNlCi0JCVB5X0lOQ1JFRihuYW1lKTsKKyAgICAgICAgeworICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiYXR0cmlidXRlIG5hbWUgbXVzdCBiZSBzdHJpbmcsIG5vdCAnJS4yMDBzJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRShuYW1lKS0+dHBfbmFtZSk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgICAgICBQeV9JTkNSRUYobmFtZSk7CiAKLQlpZiAodHAtPnRwX2RpY3QgPT0gTlVMTCkgewotCQlpZiAoUHlUeXBlX1JlYWR5KHRwKSA8IDApCi0JCQlnb3RvIGRvbmU7Ci0JfQorICAgIGlmICh0cC0+dHBfZGljdCA9PSBOVUxMKSB7CisgICAgICAgIGlmIChQeVR5cGVfUmVhZHkodHApIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICB9CiAKLQlkZXNjciA9IF9QeVR5cGVfTG9va3VwKHRwLCBuYW1lKTsKLQlmID0gTlVMTDsKLQlpZiAoZGVzY3IgIT0gTlVMTCAmJgotCSAgICBQeVR5cGVfSGFzRmVhdHVyZShkZXNjci0+b2JfdHlwZSwgUHlfVFBGTEFHU19IQVZFX0NMQVNTKSkgewotCQlmID0gZGVzY3ItPm9iX3R5cGUtPnRwX2Rlc2NyX3NldDsKLQkJaWYgKGYgIT0gTlVMTCAmJiBQeURlc2NyX0lzRGF0YShkZXNjcikpIHsKLQkJCXJlcyA9IGYoZGVzY3IsIG9iaiwgdmFsdWUpOwotCQkJZ290byBkb25lOwotCQl9Ci0JfQorICAgIGRlc2NyID0gX1B5VHlwZV9Mb29rdXAodHAsIG5hbWUpOworICAgIGYgPSBOVUxMOworICAgIGlmIChkZXNjciAhPSBOVUxMICYmCisgICAgICAgIFB5VHlwZV9IYXNGZWF0dXJlKGRlc2NyLT5vYl90eXBlLCBQeV9UUEZMQUdTX0hBVkVfQ0xBU1MpKSB7CisgICAgICAgIGYgPSBkZXNjci0+b2JfdHlwZS0+dHBfZGVzY3Jfc2V0OworICAgICAgICBpZiAoZiAhPSBOVUxMICYmIFB5RGVzY3JfSXNEYXRhKGRlc2NyKSkgeworICAgICAgICAgICAgcmVzID0gZihkZXNjciwgb2JqLCB2YWx1ZSk7CisgICAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgIH0KKyAgICB9CiAKLQlkaWN0cHRyID0gX1B5T2JqZWN0X0dldERpY3RQdHIob2JqKTsKLQlpZiAoZGljdHB0ciAhPSBOVUxMKSB7Ci0JCVB5T2JqZWN0ICpkaWN0ID0gKmRpY3RwdHI7Ci0JCWlmIChkaWN0ID09IE5VTEwgJiYgdmFsdWUgIT0gTlVMTCkgewotCQkJZGljdCA9IFB5RGljdF9OZXcoKTsKLQkJCWlmIChkaWN0ID09IE5VTEwpCi0JCQkJZ290byBkb25lOwotCQkJKmRpY3RwdHIgPSBkaWN0OwotCQl9Ci0JCWlmIChkaWN0ICE9IE5VTEwpIHsKLQkJCVB5X0lOQ1JFRihkaWN0KTsKLQkJCWlmICh2YWx1ZSA9PSBOVUxMKQotCQkJCXJlcyA9IFB5RGljdF9EZWxJdGVtKGRpY3QsIG5hbWUpOwotCQkJZWxzZQotCQkJCXJlcyA9IFB5RGljdF9TZXRJdGVtKGRpY3QsIG5hbWUsIHZhbHVlKTsKLQkJCWlmIChyZXMgPCAwICYmIFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfS2V5RXJyb3IpKQotCQkJCVB5RXJyX1NldE9iamVjdChQeUV4Y19BdHRyaWJ1dGVFcnJvciwgbmFtZSk7Ci0JCQlQeV9ERUNSRUYoZGljdCk7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQl9CisgICAgZGljdHB0ciA9IF9QeU9iamVjdF9HZXREaWN0UHRyKG9iaik7CisgICAgaWYgKGRpY3RwdHIgIT0gTlVMTCkgeworICAgICAgICBQeU9iamVjdCAqZGljdCA9ICpkaWN0cHRyOworICAgICAgICBpZiAoZGljdCA9PSBOVUxMICYmIHZhbHVlICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGRpY3QgPSBQeURpY3RfTmV3KCk7CisgICAgICAgICAgICBpZiAoZGljdCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgICAgICAgICpkaWN0cHRyID0gZGljdDsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGljdCAhPSBOVUxMKSB7CisgICAgICAgICAgICBQeV9JTkNSRUYoZGljdCk7CisgICAgICAgICAgICBpZiAodmFsdWUgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXMgPSBQeURpY3RfRGVsSXRlbShkaWN0LCBuYW1lKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXMgPSBQeURpY3RfU2V0SXRlbShkaWN0LCBuYW1lLCB2YWx1ZSk7CisgICAgICAgICAgICBpZiAocmVzIDwgMCAmJiBQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0tleUVycm9yKSkKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRPYmplY3QoUHlFeGNfQXR0cmlidXRlRXJyb3IsIG5hbWUpOworICAgICAgICAgICAgUHlfREVDUkVGKGRpY3QpOworICAgICAgICAgICAgZ290byBkb25lOworICAgICAgICB9CisgICAgfQogCi0JaWYgKGYgIT0gTlVMTCkgewotCQlyZXMgPSBmKGRlc2NyLCBvYmosIHZhbHVlKTsKLQkJZ290byBkb25lOwotCX0KKyAgICBpZiAoZiAhPSBOVUxMKSB7CisgICAgICAgIHJlcyA9IGYoZGVzY3IsIG9iaiwgdmFsdWUpOworICAgICAgICBnb3RvIGRvbmU7CisgICAgfQogCi0JaWYgKGRlc2NyID09IE5VTEwpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX0F0dHJpYnV0ZUVycm9yLAotCQkJICAgICAiJyUuMTAwcycgb2JqZWN0IGhhcyBubyBhdHRyaWJ1dGUgJyUuMjAwcyciLAotCQkJICAgICB0cC0+dHBfbmFtZSwgUHlTdHJpbmdfQVNfU1RSSU5HKG5hbWUpKTsKLQkJZ290byBkb25lOwotCX0KKyAgICBpZiAoZGVzY3IgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfQXR0cmlidXRlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiJyUuMTAwcycgb2JqZWN0IGhhcyBubyBhdHRyaWJ1dGUgJyUuMjAwcyciLAorICAgICAgICAgICAgICAgICAgICAgdHAtPnRwX25hbWUsIFB5U3RyaW5nX0FTX1NUUklORyhuYW1lKSk7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICB9CiAKLQlQeUVycl9Gb3JtYXQoUHlFeGNfQXR0cmlidXRlRXJyb3IsCi0JCSAgICAgIiclLjUwcycgb2JqZWN0IGF0dHJpYnV0ZSAnJS40MDBzJyBpcyByZWFkLW9ubHkiLAotCQkgICAgIHRwLT50cF9uYW1lLCBQeVN0cmluZ19BU19TVFJJTkcobmFtZSkpOworICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19BdHRyaWJ1dGVFcnJvciwKKyAgICAgICAgICAgICAgICAgIiclLjUwcycgb2JqZWN0IGF0dHJpYnV0ZSAnJS40MDBzJyBpcyByZWFkLW9ubHkiLAorICAgICAgICAgICAgICAgICB0cC0+dHBfbmFtZSwgUHlTdHJpbmdfQVNfU1RSSU5HKG5hbWUpKTsKICAgZG9uZToKLQlQeV9ERUNSRUYobmFtZSk7Ci0JcmV0dXJuIHJlczsKKyAgICBQeV9ERUNSRUYobmFtZSk7CisgICAgcmV0dXJuIHJlczsKIH0KIAogLyogVGVzdCBhIHZhbHVlIHVzZWQgYXMgY29uZGl0aW9uLCBlLmcuLCBpbiBhIGZvciBvciBpZiBzdGF0ZW1lbnQuCkBAIC0xNTM1LDI2ICsxNTM1LDI2IEBACiBpbnQKIFB5T2JqZWN0X0lzVHJ1ZShQeU9iamVjdCAqdikKIHsKLQlQeV9zc2l6ZV90IHJlczsKLQlpZiAodiA9PSBQeV9UcnVlKQotCQlyZXR1cm4gMTsKLQlpZiAodiA9PSBQeV9GYWxzZSkKLQkJcmV0dXJuIDA7Ci0JaWYgKHYgPT0gUHlfTm9uZSkKLQkJcmV0dXJuIDA7Ci0JZWxzZSBpZiAodi0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyICE9IE5VTEwgJiYKLQkJIHYtPm9iX3R5cGUtPnRwX2FzX251bWJlci0+bmJfbm9uemVybyAhPSBOVUxMKQotCQlyZXMgPSAoKnYtPm9iX3R5cGUtPnRwX2FzX251bWJlci0+bmJfbm9uemVybykodik7Ci0JZWxzZSBpZiAodi0+b2JfdHlwZS0+dHBfYXNfbWFwcGluZyAhPSBOVUxMICYmCi0JCSB2LT5vYl90eXBlLT50cF9hc19tYXBwaW5nLT5tcF9sZW5ndGggIT0gTlVMTCkKLQkJcmVzID0gKCp2LT5vYl90eXBlLT50cF9hc19tYXBwaW5nLT5tcF9sZW5ndGgpKHYpOwotCWVsc2UgaWYgKHYtPm9iX3R5cGUtPnRwX2FzX3NlcXVlbmNlICE9IE5VTEwgJiYKLQkJIHYtPm9iX3R5cGUtPnRwX2FzX3NlcXVlbmNlLT5zcV9sZW5ndGggIT0gTlVMTCkKLQkJcmVzID0gKCp2LT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZS0+c3FfbGVuZ3RoKSh2KTsKLQllbHNlCi0JCXJldHVybiAxOwotCS8qIGlmIGl0IGlzIG5lZ2F0aXZlLCBpdCBzaG91bGQgYmUgZWl0aGVyIC0xIG9yIC0yICovCi0JcmV0dXJuIChyZXMgPiAwKSA/IDEgOiBQeV9TQUZFX0RPV05DQVNUKHJlcywgUHlfc3NpemVfdCwgaW50KTsKKyAgICBQeV9zc2l6ZV90IHJlczsKKyAgICBpZiAodiA9PSBQeV9UcnVlKQorICAgICAgICByZXR1cm4gMTsKKyAgICBpZiAodiA9PSBQeV9GYWxzZSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKHYgPT0gUHlfTm9uZSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgZWxzZSBpZiAodi0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyICE9IE5VTEwgJiYKKyAgICAgICAgICAgICB2LT5vYl90eXBlLT50cF9hc19udW1iZXItPm5iX25vbnplcm8gIT0gTlVMTCkKKyAgICAgICAgcmVzID0gKCp2LT5vYl90eXBlLT50cF9hc19udW1iZXItPm5iX25vbnplcm8pKHYpOworICAgIGVsc2UgaWYgKHYtPm9iX3R5cGUtPnRwX2FzX21hcHBpbmcgIT0gTlVMTCAmJgorICAgICAgICAgICAgIHYtPm9iX3R5cGUtPnRwX2FzX21hcHBpbmctPm1wX2xlbmd0aCAhPSBOVUxMKQorICAgICAgICByZXMgPSAoKnYtPm9iX3R5cGUtPnRwX2FzX21hcHBpbmctPm1wX2xlbmd0aCkodik7CisgICAgZWxzZSBpZiAodi0+b2JfdHlwZS0+dHBfYXNfc2VxdWVuY2UgIT0gTlVMTCAmJgorICAgICAgICAgICAgIHYtPm9iX3R5cGUtPnRwX2FzX3NlcXVlbmNlLT5zcV9sZW5ndGggIT0gTlVMTCkKKyAgICAgICAgcmVzID0gKCp2LT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZS0+c3FfbGVuZ3RoKSh2KTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiAxOworICAgIC8qIGlmIGl0IGlzIG5lZ2F0aXZlLCBpdCBzaG91bGQgYmUgZWl0aGVyIC0xIG9yIC0yICovCisgICAgcmV0dXJuIChyZXMgPiAwKSA/IDEgOiBQeV9TQUZFX0RPV05DQVNUKHJlcywgUHlfc3NpemVfdCwgaW50KTsKIH0KIAogLyogZXF1aXZhbGVudCBvZiAnbm90IHYnCkBAIC0xNTYzLDExICsxNTYzLDExIEBACiBpbnQKIFB5T2JqZWN0X05vdChQeU9iamVjdCAqdikKIHsKLQlpbnQgcmVzOwotCXJlcyA9IFB5T2JqZWN0X0lzVHJ1ZSh2KTsKLQlpZiAocmVzIDwgMCkKLQkJcmV0dXJuIHJlczsKLQlyZXR1cm4gcmVzID09IDA7CisgICAgaW50IHJlczsKKyAgICByZXMgPSBQeU9iamVjdF9Jc1RydWUodik7CisgICAgaWYgKHJlcyA8IDApCisgICAgICAgIHJldHVybiByZXM7CisgICAgcmV0dXJuIHJlcyA9PSAwOwogfQogCiAvKiBDb2VyY2UgdHdvIG51bWVyaWMgdHlwZXMgdG8gdGhlICJsYXJnZXIiIG9uZS4KQEAgLTE1ODAsMjkgKzE1ODAsMjkgQEAKIGludAogUHlOdW1iZXJfQ29lcmNlRXgoUHlPYmplY3QgKipwdiwgUHlPYmplY3QgKipwdykKIHsKLQlyZWdpc3RlciBQeU9iamVjdCAqdiA9ICpwdjsKLQlyZWdpc3RlciBQeU9iamVjdCAqdyA9ICpwdzsKLQlpbnQgcmVzOworICAgIHJlZ2lzdGVyIFB5T2JqZWN0ICp2ID0gKnB2OworICAgIHJlZ2lzdGVyIFB5T2JqZWN0ICp3ID0gKnB3OworICAgIGludCByZXM7CiAKLQkvKiBTaG9ydGN1dCBvbmx5IGZvciBvbGQtc3R5bGUgdHlwZXMgKi8KLQlpZiAodi0+b2JfdHlwZSA9PSB3LT5vYl90eXBlICYmCi0JICAgICFQeVR5cGVfSGFzRmVhdHVyZSh2LT5vYl90eXBlLCBQeV9UUEZMQUdTX0NIRUNLVFlQRVMpKQotCXsKLQkJUHlfSU5DUkVGKHYpOwotCQlQeV9JTkNSRUYodyk7Ci0JCXJldHVybiAwOwotCX0KLQlpZiAodi0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyICYmIHYtPm9iX3R5cGUtPnRwX2FzX251bWJlci0+bmJfY29lcmNlKSB7Ci0JCXJlcyA9ICgqdi0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyLT5uYl9jb2VyY2UpKHB2LCBwdyk7Ci0JCWlmIChyZXMgPD0gMCkKLQkJCXJldHVybiByZXM7Ci0JfQotCWlmICh3LT5vYl90eXBlLT50cF9hc19udW1iZXIgJiYgdy0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyLT5uYl9jb2VyY2UpIHsKLQkJcmVzID0gKCp3LT5vYl90eXBlLT50cF9hc19udW1iZXItPm5iX2NvZXJjZSkocHcsIHB2KTsKLQkJaWYgKHJlcyA8PSAwKQotCQkJcmV0dXJuIHJlczsKLQl9Ci0JcmV0dXJuIDE7CisgICAgLyogU2hvcnRjdXQgb25seSBmb3Igb2xkLXN0eWxlIHR5cGVzICovCisgICAgaWYgKHYtPm9iX3R5cGUgPT0gdy0+b2JfdHlwZSAmJgorICAgICAgICAhUHlUeXBlX0hhc0ZlYXR1cmUodi0+b2JfdHlwZSwgUHlfVFBGTEFHU19DSEVDS1RZUEVTKSkKKyAgICB7CisgICAgICAgIFB5X0lOQ1JFRih2KTsKKyAgICAgICAgUHlfSU5DUkVGKHcpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKHYtPm9iX3R5cGUtPnRwX2FzX251bWJlciAmJiB2LT5vYl90eXBlLT50cF9hc19udW1iZXItPm5iX2NvZXJjZSkgeworICAgICAgICByZXMgPSAoKnYtPm9iX3R5cGUtPnRwX2FzX251bWJlci0+bmJfY29lcmNlKShwdiwgcHcpOworICAgICAgICBpZiAocmVzIDw9IDApCisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKyAgICBpZiAody0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyICYmIHctPm9iX3R5cGUtPnRwX2FzX251bWJlci0+bmJfY29lcmNlKSB7CisgICAgICAgIHJlcyA9ICgqdy0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyLT5uYl9jb2VyY2UpKHB3LCBwdik7CisgICAgICAgIGlmIChyZXMgPD0gMCkKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgfQorICAgIHJldHVybiAxOwogfQogCiAvKiBDb2VyY2UgdHdvIG51bWVyaWMgdHlwZXMgdG8gdGhlICJsYXJnZXIiIG9uZS4KQEAgLTE2MTMsMTEgKzE2MTMsMTEgQEAKIGludAogUHlOdW1iZXJfQ29lcmNlKFB5T2JqZWN0ICoqcHYsIFB5T2JqZWN0ICoqcHcpCiB7Ci0JaW50IGVyciA9IFB5TnVtYmVyX0NvZXJjZUV4KHB2LCBwdyk7Ci0JaWYgKGVyciA8PSAwKQotCQlyZXR1cm4gZXJyOwotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJudW1iZXIgY29lcmNpb24gZmFpbGVkIik7Ci0JcmV0dXJuIC0xOworICAgIGludCBlcnIgPSBQeU51bWJlcl9Db2VyY2VFeChwdiwgcHcpOworICAgIGlmIChlcnIgPD0gMCkKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAibnVtYmVyIGNvZXJjaW9uIGZhaWxlZCIpOworICAgIHJldHVybiAtMTsKIH0KIAogCkBAIC0xNjI2LDIyICsxNjI2LDIyIEBACiBpbnQKIFB5Q2FsbGFibGVfQ2hlY2soUHlPYmplY3QgKngpCiB7Ci0JaWYgKHggPT0gTlVMTCkKLQkJcmV0dXJuIDA7Ci0JaWYgKFB5SW5zdGFuY2VfQ2hlY2soeCkpIHsKLQkJUHlPYmplY3QgKmNhbGwgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHgsICJfX2NhbGxfXyIpOwotCQlpZiAoY2FsbCA9PSBOVUxMKSB7Ci0JCQlQeUVycl9DbGVhcigpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJLyogQ291bGQgdGVzdCByZWN1cnNpdmVseSBidXQgZG9uJ3QsIGZvciBmZWFyIG9mIGVuZGxlc3MKLQkJICAgcmVjdXJzaW9uIGlmIHNvbWUgam9rZXIgc2V0cyBzZWxmLl9fY2FsbF9fID0gc2VsZiAqLwotCQlQeV9ERUNSRUYoY2FsbCk7Ci0JCXJldHVybiAxOwotCX0KLQllbHNlIHsKLQkJcmV0dXJuIHgtPm9iX3R5cGUtPnRwX2NhbGwgIT0gTlVMTDsKLQl9CisgICAgaWYgKHggPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKFB5SW5zdGFuY2VfQ2hlY2soeCkpIHsKKyAgICAgICAgUHlPYmplY3QgKmNhbGwgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHgsICJfX2NhbGxfXyIpOworICAgICAgICBpZiAoY2FsbCA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgLyogQ291bGQgdGVzdCByZWN1cnNpdmVseSBidXQgZG9uJ3QsIGZvciBmZWFyIG9mIGVuZGxlc3MKKyAgICAgICAgICAgcmVjdXJzaW9uIGlmIHNvbWUgam9rZXIgc2V0cyBzZWxmLl9fY2FsbF9fID0gc2VsZiAqLworICAgICAgICBQeV9ERUNSRUYoY2FsbCk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcmV0dXJuIHgtPm9iX3R5cGUtPnRwX2NhbGwgIT0gTlVMTDsKKyAgICB9CiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHlPYmplY3RfRGlyKCkgaGVscGVycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0xNjU3LDUyICsxNjU3LDUyIEBACiBzdGF0aWMgaW50CiBtZXJnZV9jbGFzc19kaWN0KFB5T2JqZWN0KiBkaWN0LCBQeU9iamVjdCogYWNsYXNzKQogewotCVB5T2JqZWN0ICpjbGFzc2RpY3Q7Ci0JUHlPYmplY3QgKmJhc2VzOworICAgIFB5T2JqZWN0ICpjbGFzc2RpY3Q7CisgICAgUHlPYmplY3QgKmJhc2VzOwogCi0JYXNzZXJ0KFB5RGljdF9DaGVjayhkaWN0KSk7Ci0JYXNzZXJ0KGFjbGFzcyk7CisgICAgYXNzZXJ0KFB5RGljdF9DaGVjayhkaWN0KSk7CisgICAgYXNzZXJ0KGFjbGFzcyk7CiAKLQkvKiBNZXJnZSBpbiB0aGUgdHlwZSdzIGRpY3QgKGlmIGFueSkuICovCi0JY2xhc3NkaWN0ID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhhY2xhc3MsICJfX2RpY3RfXyIpOwotCWlmIChjbGFzc2RpY3QgPT0gTlVMTCkKLQkJUHlFcnJfQ2xlYXIoKTsKLQllbHNlIHsKLQkJaW50IHN0YXR1cyA9IFB5RGljdF9VcGRhdGUoZGljdCwgY2xhc3NkaWN0KTsKLQkJUHlfREVDUkVGKGNsYXNzZGljdCk7Ci0JCWlmIChzdGF0dXMgPCAwKQotCQkJcmV0dXJuIC0xOwotCX0KKyAgICAvKiBNZXJnZSBpbiB0aGUgdHlwZSdzIGRpY3QgKGlmIGFueSkuICovCisgICAgY2xhc3NkaWN0ID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhhY2xhc3MsICJfX2RpY3RfXyIpOworICAgIGlmIChjbGFzc2RpY3QgPT0gTlVMTCkKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICBlbHNlIHsKKyAgICAgICAgaW50IHN0YXR1cyA9IFB5RGljdF9VcGRhdGUoZGljdCwgY2xhc3NkaWN0KTsKKyAgICAgICAgUHlfREVDUkVGKGNsYXNzZGljdCk7CisgICAgICAgIGlmIChzdGF0dXMgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCS8qIFJlY3Vyc2l2ZWx5IG1lcmdlIGluIHRoZSBiYXNlIHR5cGVzJyAoaWYgYW55KSBkaWN0cy4gKi8KLQliYXNlcyA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoYWNsYXNzLCAiX19iYXNlc19fIik7Ci0JaWYgKGJhc2VzID09IE5VTEwpCi0JCVB5RXJyX0NsZWFyKCk7Ci0JZWxzZSB7Ci0JCS8qIFdlIGhhdmUgbm8gZ3VhcmFudGVlIHRoYXQgYmFzZXMgaXMgYSByZWFsIHR1cGxlICovCi0JCVB5X3NzaXplX3QgaSwgbjsKLQkJbiA9IFB5U2VxdWVuY2VfU2l6ZShiYXNlcyk7IC8qIFRoaXMgYmV0dGVyIGJlIHJpZ2h0ICovCi0JCWlmIChuIDwgMCkKLQkJCVB5RXJyX0NsZWFyKCk7Ci0JCWVsc2UgewotCQkJZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQkJCWludCBzdGF0dXM7Ci0JCQkJUHlPYmplY3QgKmJhc2UgPSBQeVNlcXVlbmNlX0dldEl0ZW0oYmFzZXMsIGkpOwotCQkJCWlmIChiYXNlID09IE5VTEwpIHsKLQkJCQkJUHlfREVDUkVGKGJhc2VzKTsKLQkJCQkJcmV0dXJuIC0xOwotCQkJCX0KLQkJCQlzdGF0dXMgPSBtZXJnZV9jbGFzc19kaWN0KGRpY3QsIGJhc2UpOwotCQkJCVB5X0RFQ1JFRihiYXNlKTsKLQkJCQlpZiAoc3RhdHVzIDwgMCkgewotCQkJCQlQeV9ERUNSRUYoYmFzZXMpOwotCQkJCQlyZXR1cm4gLTE7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCVB5X0RFQ1JFRihiYXNlcyk7Ci0JfQotCXJldHVybiAwOworICAgIC8qIFJlY3Vyc2l2ZWx5IG1lcmdlIGluIHRoZSBiYXNlIHR5cGVzJyAoaWYgYW55KSBkaWN0cy4gKi8KKyAgICBiYXNlcyA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoYWNsYXNzLCAiX19iYXNlc19fIik7CisgICAgaWYgKGJhc2VzID09IE5VTEwpCisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgZWxzZSB7CisgICAgICAgIC8qIFdlIGhhdmUgbm8gZ3VhcmFudGVlIHRoYXQgYmFzZXMgaXMgYSByZWFsIHR1cGxlICovCisgICAgICAgIFB5X3NzaXplX3QgaSwgbjsKKyAgICAgICAgbiA9IFB5U2VxdWVuY2VfU2l6ZShiYXNlcyk7IC8qIFRoaXMgYmV0dGVyIGJlIHJpZ2h0ICovCisgICAgICAgIGlmIChuIDwgMCkKKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICAgICAgICAgIGludCBzdGF0dXM7CisgICAgICAgICAgICAgICAgUHlPYmplY3QgKmJhc2UgPSBQeVNlcXVlbmNlX0dldEl0ZW0oYmFzZXMsIGkpOworICAgICAgICAgICAgICAgIGlmIChiYXNlID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGJhc2VzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBtZXJnZV9jbGFzc19kaWN0KGRpY3QsIGJhc2UpOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihiYXNlKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoYmFzZXMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFB5X0RFQ1JFRihiYXNlcyk7CisgICAgfQorICAgIHJldHVybiAwOwogfQogCiAvKiBIZWxwZXIgZm9yIFB5T2JqZWN0X0Rpci4KQEAgLTE3MTUsMTA3ICsxNzE1LDEwNyBAQAogc3RhdGljIGludAogbWVyZ2VfbGlzdF9hdHRyKFB5T2JqZWN0KiBkaWN0LCBQeU9iamVjdCogb2JqLCBjb25zdCBjaGFyICphdHRybmFtZSkKIHsKLQlQeU9iamVjdCAqbGlzdDsKLQlpbnQgcmVzdWx0ID0gMDsKKyAgICBQeU9iamVjdCAqbGlzdDsKKyAgICBpbnQgcmVzdWx0ID0gMDsKIAotCWFzc2VydChQeURpY3RfQ2hlY2soZGljdCkpOwotCWFzc2VydChvYmopOwotCWFzc2VydChhdHRybmFtZSk7CisgICAgYXNzZXJ0KFB5RGljdF9DaGVjayhkaWN0KSk7CisgICAgYXNzZXJ0KG9iaik7CisgICAgYXNzZXJ0KGF0dHJuYW1lKTsKIAotCWxpc3QgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKG9iaiwgYXR0cm5hbWUpOwotCWlmIChsaXN0ID09IE5VTEwpCi0JCVB5RXJyX0NsZWFyKCk7CisgICAgbGlzdCA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcob2JqLCBhdHRybmFtZSk7CisgICAgaWYgKGxpc3QgPT0gTlVMTCkKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKIAotCWVsc2UgaWYgKFB5TGlzdF9DaGVjayhsaXN0KSkgewotCQlpbnQgaTsKLQkJZm9yIChpID0gMDsgaSA8IFB5TGlzdF9HRVRfU0laRShsaXN0KTsgKytpKSB7Ci0JCQlQeU9iamVjdCAqaXRlbSA9IFB5TGlzdF9HRVRfSVRFTShsaXN0LCBpKTsKLQkJCWlmIChQeVN0cmluZ19DaGVjayhpdGVtKSkgewotCQkJCXJlc3VsdCA9IFB5RGljdF9TZXRJdGVtKGRpY3QsIGl0ZW0sIFB5X05vbmUpOwotCQkJCWlmIChyZXN1bHQgPCAwKQotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAoUHlfUHkza1dhcm5pbmdGbGFnICYmCi0JCSAgICAoc3RyY21wKGF0dHJuYW1lLCAiX19tZW1iZXJzX18iKSA9PSAwIHx8Ci0JCSAgICAgc3RyY21wKGF0dHJuYW1lLCAiX19tZXRob2RzX18iKSA9PSAwKSkgewotCQkJaWYgKFB5RXJyX1dhcm5FeChQeUV4Y19EZXByZWNhdGlvbldhcm5pbmcsIAotCQkJCSAgICAgICAiX19tZW1iZXJzX18gYW5kIF9fbWV0aG9kc19fIG5vdCAiCi0JCQkJICAgICAgICJzdXBwb3J0ZWQgaW4gMy54IiwgMSkgPCAwKSB7Ci0JCQkJUHlfWERFQ1JFRihsaXN0KTsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQl9CisgICAgZWxzZSBpZiAoUHlMaXN0X0NoZWNrKGxpc3QpKSB7CisgICAgICAgIGludCBpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgUHlMaXN0X0dFVF9TSVpFKGxpc3QpOyArK2kpIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICppdGVtID0gUHlMaXN0X0dFVF9JVEVNKGxpc3QsIGkpOworICAgICAgICAgICAgaWYgKFB5U3RyaW5nX0NoZWNrKGl0ZW0pKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gUHlEaWN0X1NldEl0ZW0oZGljdCwgaXRlbSwgUHlfTm9uZSk7CisgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA8IDApCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChQeV9QeTNrV2FybmluZ0ZsYWcgJiYKKyAgICAgICAgICAgIChzdHJjbXAoYXR0cm5hbWUsICJfX21lbWJlcnNfXyIpID09IDAgfHwKKyAgICAgICAgICAgICBzdHJjbXAoYXR0cm5hbWUsICJfX21ldGhvZHNfXyIpID09IDApKSB7CisgICAgICAgICAgICBpZiAoUHlFcnJfV2FybkV4KFB5RXhjX0RlcHJlY2F0aW9uV2FybmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJfX21lbWJlcnNfXyBhbmQgX19tZXRob2RzX18gbm90ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdXBwb3J0ZWQgaW4gMy54IiwgMSkgPCAwKSB7CisgICAgICAgICAgICAgICAgUHlfWERFQ1JFRihsaXN0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAKLQlQeV9YREVDUkVGKGxpc3QpOwotCXJldHVybiByZXN1bHQ7CisgICAgUHlfWERFQ1JFRihsaXN0KTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiAvKiBIZWxwZXIgZm9yIFB5T2JqZWN0X0RpciB3aXRob3V0IGFyZ3VtZW50czogcmV0dXJucyB0aGUgbG9jYWwgc2NvcGUuICovCiBzdGF0aWMgUHlPYmplY3QgKgogX2Rpcl9sb2NhbHModm9pZCkKIHsKLQlQeU9iamVjdCAqbmFtZXM7Ci0JUHlPYmplY3QgKmxvY2FscyA9IFB5RXZhbF9HZXRMb2NhbHMoKTsKKyAgICBQeU9iamVjdCAqbmFtZXM7CisgICAgUHlPYmplY3QgKmxvY2FscyA9IFB5RXZhbF9HZXRMb2NhbHMoKTsKIAotCWlmIChsb2NhbHMgPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsICJmcmFtZSBkb2VzIG5vdCBleGlzdCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKGxvY2FscyA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwgImZyYW1lIGRvZXMgbm90IGV4aXN0Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCW5hbWVzID0gUHlNYXBwaW5nX0tleXMobG9jYWxzKTsKLQlpZiAoIW5hbWVzKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIVB5TGlzdF9DaGVjayhuYW1lcykpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSJkaXIoKTogZXhwZWN0ZWQga2V5cygpIG9mIGxvY2FscyB0byBiZSBhIGxpc3QsICIKLQkJCSJub3QgJyUuMjAwcyciLCBQeV9UWVBFKG5hbWVzKS0+dHBfbmFtZSk7Ci0JCVB5X0RFQ1JFRihuYW1lcyk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQkvKiB0aGUgbG9jYWxzIGRvbid0IG5lZWQgdG8gYmUgREVDUkVGJ2QgKi8KLQlyZXR1cm4gbmFtZXM7CisgICAgbmFtZXMgPSBQeU1hcHBpbmdfS2V5cyhsb2NhbHMpOworICAgIGlmICghbmFtZXMpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHlMaXN0X0NoZWNrKG5hbWVzKSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgImRpcigpOiBleHBlY3RlZCBrZXlzKCkgb2YgbG9jYWxzIHRvIGJlIGEgbGlzdCwgIgorICAgICAgICAgICAgIm5vdCAnJS4yMDBzJyIsIFB5X1RZUEUobmFtZXMpLT50cF9uYW1lKTsKKyAgICAgICAgUHlfREVDUkVGKG5hbWVzKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIC8qIHRoZSBsb2NhbHMgZG9uJ3QgbmVlZCB0byBiZSBERUNSRUYnZCAqLworICAgIHJldHVybiBuYW1lczsKIH0KIAogLyogSGVscGVyIGZvciBQeU9iamVjdF9EaXIgb2YgdHlwZSBvYmplY3RzOiByZXR1cm5zIF9fZGljdF9fIGFuZCBfX2Jhc2VzX18uCi0gICBXZSBkZWxpYmVyYXRlbHkgZG9uJ3Qgc3VjayB1cCBpdHMgX19jbGFzc19fLCBhcyBtZXRob2RzIGJlbG9uZ2luZyB0byB0aGUgCi0gICBtZXRhY2xhc3Mgd291bGQgcHJvYmFibHkgYmUgbW9yZSBjb25mdXNpbmcgdGhhbiBoZWxwZnVsLiAKKyAgIFdlIGRlbGliZXJhdGVseSBkb24ndCBzdWNrIHVwIGl0cyBfX2NsYXNzX18sIGFzIG1ldGhvZHMgYmVsb25naW5nIHRvIHRoZQorICAgbWV0YWNsYXNzIHdvdWxkIHByb2JhYmx5IGJlIG1vcmUgY29uZnVzaW5nIHRoYW4gaGVscGZ1bC4KICovCi1zdGF0aWMgUHlPYmplY3QgKiAKK3N0YXRpYyBQeU9iamVjdCAqCiBfc3BlY2lhbGl6ZWRfZGlyX3R5cGUoUHlPYmplY3QgKm9iaikKIHsKLQlQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKLQlQeU9iamVjdCAqZGljdCA9IFB5RGljdF9OZXcoKTsKKyAgICBQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKKyAgICBQeU9iamVjdCAqZGljdCA9IFB5RGljdF9OZXcoKTsKIAotCWlmIChkaWN0ICE9IE5VTEwgJiYgbWVyZ2VfY2xhc3NfZGljdChkaWN0LCBvYmopID09IDApCi0JCXJlc3VsdCA9IFB5RGljdF9LZXlzKGRpY3QpOworICAgIGlmIChkaWN0ICE9IE5VTEwgJiYgbWVyZ2VfY2xhc3NfZGljdChkaWN0LCBvYmopID09IDApCisgICAgICAgIHJlc3VsdCA9IFB5RGljdF9LZXlzKGRpY3QpOwogCi0JUHlfWERFQ1JFRihkaWN0KTsKLQlyZXR1cm4gcmVzdWx0OworICAgIFB5X1hERUNSRUYoZGljdCk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogLyogSGVscGVyIGZvciBQeU9iamVjdF9EaXIgb2YgbW9kdWxlIG9iamVjdHM6IHJldHVybnMgdGhlIG1vZHVsZSdzIF9fZGljdF9fLiAqLwogc3RhdGljIFB5T2JqZWN0ICoKIF9zcGVjaWFsaXplZF9kaXJfbW9kdWxlKFB5T2JqZWN0ICpvYmopCiB7Ci0JUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7Ci0JUHlPYmplY3QgKmRpY3QgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKG9iaiwgIl9fZGljdF9fIik7CisgICAgUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7CisgICAgUHlPYmplY3QgKmRpY3QgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKG9iaiwgIl9fZGljdF9fIik7CiAKLQlpZiAoZGljdCAhPSBOVUxMKSB7Ci0JCWlmIChQeURpY3RfQ2hlY2soZGljdCkpCi0JCQlyZXN1bHQgPSBQeURpY3RfS2V5cyhkaWN0KTsKLQkJZWxzZSB7Ci0JCQljaGFyICpuYW1lID0gUHlNb2R1bGVfR2V0TmFtZShvYmopOwotCQkJaWYgKG5hbWUpCi0JCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCQkJICAgICAiJS4yMDBzLl9fZGljdF9fIGlzIG5vdCBhIGRpY3Rpb25hcnkiLAotCQkJCQkgICAgIG5hbWUpOwotCQl9Ci0JfQorICAgIGlmIChkaWN0ICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKFB5RGljdF9DaGVjayhkaWN0KSkKKyAgICAgICAgICAgIHJlc3VsdCA9IFB5RGljdF9LZXlzKGRpY3QpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGNoYXIgKm5hbWUgPSBQeU1vZHVsZV9HZXROYW1lKG9iaik7CisgICAgICAgICAgICBpZiAobmFtZSkKKyAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJS4yMDBzLl9fZGljdF9fIGlzIG5vdCBhIGRpY3Rpb25hcnkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKKyAgICAgICAgfQorICAgIH0KIAotCVB5X1hERUNSRUYoZGljdCk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBQeV9YREVDUkVGKGRpY3QpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIC8qIEhlbHBlciBmb3IgUHlPYmplY3RfRGlyIG9mIGdlbmVyaWMgb2JqZWN0czogcmV0dXJucyBfX2RpY3RfXywgX19jbGFzc19fLApAQCAtMTgyNCw1NCArMTgyNCw1NCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIF9nZW5lcmljX2RpcihQeU9iamVjdCAqb2JqKQogewotCVB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOwotCVB5T2JqZWN0ICpkaWN0ID0gTlVMTDsKLQlQeU9iamVjdCAqaXRzY2xhc3MgPSBOVUxMOwotCQotCS8qIEdldCBfX2RpY3RfXyAod2hpY2ggbWF5IG9yIG1heSBub3QgYmUgYSByZWFsIGRpY3QuLi4pICovCi0JZGljdCA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcob2JqLCAiX19kaWN0X18iKTsKLQlpZiAoZGljdCA9PSBOVUxMKSB7Ci0JCVB5RXJyX0NsZWFyKCk7Ci0JCWRpY3QgPSBQeURpY3RfTmV3KCk7Ci0JfQotCWVsc2UgaWYgKCFQeURpY3RfQ2hlY2soZGljdCkpIHsKLQkJUHlfREVDUkVGKGRpY3QpOwotCQlkaWN0ID0gUHlEaWN0X05ldygpOwotCX0KLQllbHNlIHsKLQkJLyogQ29weSBfX2RpY3RfXyB0byBhdm9pZCBtdXRhdGluZyBpdC4gKi8KLQkJUHlPYmplY3QgKnRlbXAgPSBQeURpY3RfQ29weShkaWN0KTsKLQkJUHlfREVDUkVGKGRpY3QpOwotCQlkaWN0ID0gdGVtcDsKLQl9CisgICAgUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7CisgICAgUHlPYmplY3QgKmRpY3QgPSBOVUxMOworICAgIFB5T2JqZWN0ICppdHNjbGFzcyA9IE5VTEw7CiAKLQlpZiAoZGljdCA9PSBOVUxMKQotCQlnb3RvIGVycm9yOworICAgIC8qIEdldCBfX2RpY3RfXyAod2hpY2ggbWF5IG9yIG1heSBub3QgYmUgYSByZWFsIGRpY3QuLi4pICovCisgICAgZGljdCA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcob2JqLCAiX19kaWN0X18iKTsKKyAgICBpZiAoZGljdCA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIGRpY3QgPSBQeURpY3RfTmV3KCk7CisgICAgfQorICAgIGVsc2UgaWYgKCFQeURpY3RfQ2hlY2soZGljdCkpIHsKKyAgICAgICAgUHlfREVDUkVGKGRpY3QpOworICAgICAgICBkaWN0ID0gUHlEaWN0X05ldygpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLyogQ29weSBfX2RpY3RfXyB0byBhdm9pZCBtdXRhdGluZyBpdC4gKi8KKyAgICAgICAgUHlPYmplY3QgKnRlbXAgPSBQeURpY3RfQ29weShkaWN0KTsKKyAgICAgICAgUHlfREVDUkVGKGRpY3QpOworICAgICAgICBkaWN0ID0gdGVtcDsKKyAgICB9CiAKLQkvKiBNZXJnZSBpbiBfX21lbWJlcnNfXyBhbmQgX19tZXRob2RzX18gKGlmIGFueSkuCi0JICogVGhpcyBpcyByZW1vdmVkIGluIFB5dGhvbiAzMDAwLiAqLwotCWlmIChtZXJnZV9saXN0X2F0dHIoZGljdCwgb2JqLCAiX19tZW1iZXJzX18iKSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JaWYgKG1lcmdlX2xpc3RfYXR0cihkaWN0LCBvYmosICJfX21ldGhvZHNfXyIpIDwgMCkKLQkJZ290byBlcnJvcjsKKyAgICBpZiAoZGljdCA9PSBOVUxMKQorICAgICAgICBnb3RvIGVycm9yOwogCi0JLyogTWVyZ2UgaW4gYXR0cnMgcmVhY2hhYmxlIGZyb20gaXRzIGNsYXNzLiAqLwotCWl0c2NsYXNzID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhvYmosICJfX2NsYXNzX18iKTsKLQlpZiAoaXRzY2xhc3MgPT0gTlVMTCkKLQkJLyogWFhYKHRvbWVyKTogUGVyaGFwcyBmYWxsIGJhY2sgdG8gb2JqLT5vYl90eXBlIGlmIG5vCi0JCSAgICAgICAgICAgICAgIF9fY2xhc3NfXyBleGlzdHM/ICovCi0JCVB5RXJyX0NsZWFyKCk7Ci0JZWxzZSB7Ci0JCWlmIChtZXJnZV9jbGFzc19kaWN0KGRpY3QsIGl0c2NsYXNzKSAhPSAwKQotCQkJZ290byBlcnJvcjsKLQl9CisgICAgLyogTWVyZ2UgaW4gX19tZW1iZXJzX18gYW5kIF9fbWV0aG9kc19fIChpZiBhbnkpLgorICAgICAqIFRoaXMgaXMgcmVtb3ZlZCBpbiBQeXRob24gMzAwMC4gKi8KKyAgICBpZiAobWVyZ2VfbGlzdF9hdHRyKGRpY3QsIG9iaiwgIl9fbWVtYmVyc19fIikgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIGlmIChtZXJnZV9saXN0X2F0dHIoZGljdCwgb2JqLCAiX19tZXRob2RzX18iKSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CiAKLQlyZXN1bHQgPSBQeURpY3RfS2V5cyhkaWN0KTsKLQkvKiBmYWxsIHRocm91Z2ggKi8KKyAgICAvKiBNZXJnZSBpbiBhdHRycyByZWFjaGFibGUgZnJvbSBpdHMgY2xhc3MuICovCisgICAgaXRzY2xhc3MgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKG9iaiwgIl9fY2xhc3NfXyIpOworICAgIGlmIChpdHNjbGFzcyA9PSBOVUxMKQorICAgICAgICAvKiBYWFgodG9tZXIpOiBQZXJoYXBzIGZhbGwgYmFjayB0byBvYmotPm9iX3R5cGUgaWYgbm8KKyAgICAgICAgICAgICAgICAgICAgICAgX19jbGFzc19fIGV4aXN0cz8gKi8KKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKG1lcmdlX2NsYXNzX2RpY3QoZGljdCwgaXRzY2xhc3MpICE9IDApCisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIHJlc3VsdCA9IFB5RGljdF9LZXlzKGRpY3QpOworICAgIC8qIGZhbGwgdGhyb3VnaCAqLwogZXJyb3I6Ci0JUHlfWERFQ1JFRihpdHNjbGFzcyk7Ci0JUHlfWERFQ1JFRihkaWN0KTsKLQlyZXR1cm4gcmVzdWx0OworICAgIFB5X1hERUNSRUYoaXRzY2xhc3MpOworICAgIFB5X1hERUNSRUYoZGljdCk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogLyogSGVscGVyIGZvciBQeU9iamVjdF9EaXI6IG9iamVjdCBpbnRyb3NwZWN0aW9uLgpAQCAtMTg4MCw0MCArMTg4MCw0MCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIF9kaXJfb2JqZWN0KFB5T2JqZWN0ICpvYmopCiB7Ci0JUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7Ci0JUHlPYmplY3QgKmRpcmZ1bmMgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKChQeU9iamVjdCAqKW9iai0+b2JfdHlwZSwKLQkJCQkJCSAgICJfX2Rpcl9fIik7CisgICAgUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7CisgICAgUHlPYmplY3QgKmRpcmZ1bmMgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKChQeU9iamVjdCAqKW9iai0+b2JfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9fZGlyX18iKTsKIAotCWFzc2VydChvYmopOwotCWlmIChkaXJmdW5jID09IE5VTEwpIHsKLQkJLyogdXNlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gKi8KLQkJUHlFcnJfQ2xlYXIoKTsKLQkJaWYgKFB5TW9kdWxlX0NoZWNrKG9iaikpCi0JCQlyZXN1bHQgPSBfc3BlY2lhbGl6ZWRfZGlyX21vZHVsZShvYmopOwotCQllbHNlIGlmIChQeVR5cGVfQ2hlY2sob2JqKSB8fCBQeUNsYXNzX0NoZWNrKG9iaikpCi0JCQlyZXN1bHQgPSBfc3BlY2lhbGl6ZWRfZGlyX3R5cGUob2JqKTsKLQkJZWxzZQotCQkJcmVzdWx0ID0gX2dlbmVyaWNfZGlyKG9iaik7Ci0JfQotCWVsc2UgewotCQkvKiB1c2UgX19kaXJfXyAqLwotCQlyZXN1bHQgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGRpcmZ1bmMsIG9iaiwgTlVMTCk7Ci0JCVB5X0RFQ1JFRihkaXJmdW5jKTsKLQkJaWYgKHJlc3VsdCA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7CisgICAgYXNzZXJ0KG9iaik7CisgICAgaWYgKGRpcmZ1bmMgPT0gTlVMTCkgeworICAgICAgICAvKiB1c2UgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiAqLworICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBpZiAoUHlNb2R1bGVfQ2hlY2sob2JqKSkKKyAgICAgICAgICAgIHJlc3VsdCA9IF9zcGVjaWFsaXplZF9kaXJfbW9kdWxlKG9iaik7CisgICAgICAgIGVsc2UgaWYgKFB5VHlwZV9DaGVjayhvYmopIHx8IFB5Q2xhc3NfQ2hlY2sob2JqKSkKKyAgICAgICAgICAgIHJlc3VsdCA9IF9zcGVjaWFsaXplZF9kaXJfdHlwZShvYmopOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXN1bHQgPSBfZ2VuZXJpY19kaXIob2JqKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8qIHVzZSBfX2Rpcl9fICovCisgICAgICAgIHJlc3VsdCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoZGlyZnVuYywgb2JqLCBOVUxMKTsKKyAgICAgICAgUHlfREVDUkVGKGRpcmZ1bmMpOworICAgICAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKIAotCQkvKiByZXN1bHQgbXVzdCBiZSBhIGxpc3QgKi8KLQkJLyogWFhYKGdicmFuZGwpOiBjb3VsZCBhbHNvIGNoZWNrIGlmIGFsbCBpdGVtcyBhcmUgc3RyaW5ncyAqLwotCQlpZiAoIVB5TGlzdF9DaGVjayhyZXN1bHQpKSB7Ci0JCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJCSAgICAgIl9fZGlyX18oKSBtdXN0IHJldHVybiBhIGxpc3QsIG5vdCAlLjIwMHMiLAotCQkJCSAgICAgUHlfVFlQRShyZXN1bHQpLT50cF9uYW1lKTsKLQkJCVB5X0RFQ1JFRihyZXN1bHQpOwotCQkJcmVzdWx0ID0gTlVMTDsKLQkJfQotCX0KKyAgICAgICAgLyogcmVzdWx0IG11c3QgYmUgYSBsaXN0ICovCisgICAgICAgIC8qIFhYWChnYnJhbmRsKTogY291bGQgYWxzbyBjaGVjayBpZiBhbGwgaXRlbXMgYXJlIHN0cmluZ3MgKi8KKyAgICAgICAgaWYgKCFQeUxpc3RfQ2hlY2socmVzdWx0KSkgeworICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiX19kaXJfXygpIG11c3QgcmV0dXJuIGEgbGlzdCwgbm90ICUuMjAwcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRShyZXN1bHQpLT50cF9uYW1lKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICAgICAgcmVzdWx0ID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KIAotCXJldHVybiByZXN1bHQ7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogLyogSW1wbGVtZW50YXRpb24gb2YgZGlyKCkgLS0gaWYgb2JqIGlzIE5VTEwsIHJldHVybnMgdGhlIG5hbWVzIGluIHRoZSBjdXJyZW50CkBAIC0xOTIzLDI0ICsxOTIzLDI0IEBACiBQeU9iamVjdCAqCiBQeU9iamVjdF9EaXIoUHlPYmplY3QgKm9iaikKIHsKLQlQeU9iamVjdCAqIHJlc3VsdDsKKyAgICBQeU9iamVjdCAqIHJlc3VsdDsKIAotCWlmIChvYmogPT0gTlVMTCkKLQkJLyogbm8gb2JqZWN0IC0tIGludHJvc3BlY3QgdGhlIGxvY2FscyAqLwotCQlyZXN1bHQgPSBfZGlyX2xvY2FscygpOwotCWVsc2UKLQkJLyogb2JqZWN0IC0tIGludHJvc3BlY3QgdGhlIG9iamVjdCAqLwotCQlyZXN1bHQgPSBfZGlyX29iamVjdChvYmopOworICAgIGlmIChvYmogPT0gTlVMTCkKKyAgICAgICAgLyogbm8gb2JqZWN0IC0tIGludHJvc3BlY3QgdGhlIGxvY2FscyAqLworICAgICAgICByZXN1bHQgPSBfZGlyX2xvY2FscygpOworICAgIGVsc2UKKyAgICAgICAgLyogb2JqZWN0IC0tIGludHJvc3BlY3QgdGhlIG9iamVjdCAqLworICAgICAgICByZXN1bHQgPSBfZGlyX29iamVjdChvYmopOwogCi0JYXNzZXJ0KHJlc3VsdCA9PSBOVUxMIHx8IFB5TGlzdF9DaGVjayhyZXN1bHQpKTsKKyAgICBhc3NlcnQocmVzdWx0ID09IE5VTEwgfHwgUHlMaXN0X0NoZWNrKHJlc3VsdCkpOwogCi0JaWYgKHJlc3VsdCAhPSBOVUxMICYmIFB5TGlzdF9Tb3J0KHJlc3VsdCkgIT0gMCkgewotCQkvKiBzb3J0aW5nIHRoZSBsaXN0IGZhaWxlZCAqLwotCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJcmVzdWx0ID0gTlVMTDsKLQl9Ci0JCi0JcmV0dXJuIHJlc3VsdDsKKyAgICBpZiAocmVzdWx0ICE9IE5VTEwgJiYgUHlMaXN0X1NvcnQocmVzdWx0KSAhPSAwKSB7CisgICAgICAgIC8qIHNvcnRpbmcgdGhlIGxpc3QgZmFpbGVkICovCisgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICByZXN1bHQgPSBOVUxMOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIC8qCkBAIC0xOTU0LDM1ICsxOTU0LDM1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogbm9uZV9yZXByKFB5T2JqZWN0ICpvcCkKIHsKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZygiTm9uZSIpOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKCJOb25lIik7CiB9CiAKIC8qIEFSR1VTRUQgKi8KIHN0YXRpYyB2b2lkCiBub25lX2RlYWxsb2MoUHlPYmplY3QqIGlnbm9yZSkKIHsKLQkvKiBUaGlzIHNob3VsZCBuZXZlciBnZXQgY2FsbGVkLCBidXQgd2UgYWxzbyBkb24ndCB3YW50IHRvIFNFR1YgaWYKLQkgKiB3ZSBhY2NpZGVudGFsbHkgZGVjcmVmIE5vbmUgb3V0IG9mIGV4aXN0ZW5jZS4KLQkgKi8KLQlQeV9GYXRhbEVycm9yKCJkZWFsbG9jYXRpbmcgTm9uZSIpOworICAgIC8qIFRoaXMgc2hvdWxkIG5ldmVyIGdldCBjYWxsZWQsIGJ1dCB3ZSBhbHNvIGRvbid0IHdhbnQgdG8gU0VHViBpZgorICAgICAqIHdlIGFjY2lkZW50YWxseSBkZWNyZWYgTm9uZSBvdXQgb2YgZXhpc3RlbmNlLgorICAgICAqLworICAgIFB5X0ZhdGFsRXJyb3IoImRlYWxsb2NhdGluZyBOb25lIik7CiB9CiAKIAogc3RhdGljIFB5VHlwZU9iamVjdCBQeU5vbmVfVHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQotCSJOb25lVHlwZSIsCi0JMCwKLQkwLAotCW5vbmVfZGVhbGxvYywJLyp0cF9kZWFsbG9jKi8gLypuZXZlciBjYWxsZWQqLwotCTAsCQkvKnRwX3ByaW50Ki8KLQkwLAkJLyp0cF9nZXRhdHRyKi8KLQkwLAkJLyp0cF9zZXRhdHRyKi8KLQkwLAkJLyp0cF9jb21wYXJlKi8KLQlub25lX3JlcHIsCS8qdHBfcmVwciovCi0JMCwJCS8qdHBfYXNfbnVtYmVyKi8KLQkwLAkJLyp0cF9hc19zZXF1ZW5jZSovCi0JMCwJCS8qdHBfYXNfbWFwcGluZyovCi0JKGhhc2hmdW5jKV9QeV9IYXNoUG9pbnRlciwgLyp0cF9oYXNoICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKKyAgICAiTm9uZVR5cGUiLAorICAgIDAsCisgICAgMCwKKyAgICBub25lX2RlYWxsb2MsICAgICAgIC8qdHBfZGVhbGxvYyovIC8qbmV2ZXIgY2FsbGVkKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfcHJpbnQqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9nZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfc2V0YXR0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX2NvbXBhcmUqLworICAgIG5vbmVfcmVwciwgICAgICAgICAgLyp0cF9yZXByKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbnVtYmVyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfYXNfc2VxdWVuY2UqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9hc19tYXBwaW5nKi8KKyAgICAoaGFzaGZ1bmMpX1B5X0hhc2hQb2ludGVyLCAvKnRwX2hhc2ggKi8KIH07CiAKIFB5T2JqZWN0IF9QeV9Ob25lU3RydWN0ID0gewpAQCAtMTk5NiwxNjEgKzE5OTYsMTYxIEBACiBzdGF0aWMgUHlPYmplY3QgKgogTm90SW1wbGVtZW50ZWRfcmVwcihQeU9iamVjdCAqb3ApCiB7Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoIk5vdEltcGxlbWVudGVkIik7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoIk5vdEltcGxlbWVudGVkIik7CiB9CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgUHlOb3RJbXBsZW1lbnRlZF9UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCi0JIk5vdEltcGxlbWVudGVkVHlwZSIsCi0JMCwKLQkwLAotCW5vbmVfZGVhbGxvYywJLyp0cF9kZWFsbG9jKi8gLypuZXZlciBjYWxsZWQqLwotCTAsCQkvKnRwX3ByaW50Ki8KLQkwLAkJLyp0cF9nZXRhdHRyKi8KLQkwLAkJLyp0cF9zZXRhdHRyKi8KLQkwLAkJLyp0cF9jb21wYXJlKi8KLQlOb3RJbXBsZW1lbnRlZF9yZXByLCAvKnRwX3JlcHIqLwotCTAsCQkvKnRwX2FzX251bWJlciovCi0JMCwJCS8qdHBfYXNfc2VxdWVuY2UqLwotCTAsCQkvKnRwX2FzX21hcHBpbmcqLwotCTAsCQkvKnRwX2hhc2ggKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQorICAgICJOb3RJbXBsZW1lbnRlZFR5cGUiLAorICAgIDAsCisgICAgMCwKKyAgICBub25lX2RlYWxsb2MsICAgICAgIC8qdHBfZGVhbGxvYyovIC8qbmV2ZXIgY2FsbGVkKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfcHJpbnQqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9nZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfc2V0YXR0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX2NvbXBhcmUqLworICAgIE5vdEltcGxlbWVudGVkX3JlcHIsIC8qdHBfcmVwciovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX2FzX251bWJlciovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX2FzX3NlcXVlbmNlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbWFwcGluZyovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX2hhc2ggKi8KIH07CiAKIFB5T2JqZWN0IF9QeV9Ob3RJbXBsZW1lbnRlZFN0cnVjdCA9IHsKLQlfUHlPYmplY3RfRVhUUkFfSU5JVAotCTEsICZQeU5vdEltcGxlbWVudGVkX1R5cGUKKyAgICBfUHlPYmplY3RfRVhUUkFfSU5JVAorICAgIDEsICZQeU5vdEltcGxlbWVudGVkX1R5cGUKIH07CiAKIHZvaWQKIF9QeV9SZWFkeVR5cGVzKHZvaWQpCiB7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmUHlUeXBlX1R5cGUpIDwgMCkKLQkJUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSB0eXBlIHR5cGUiKTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZQeVR5cGVfVHlwZSkgPCAwKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIHR5cGUgdHlwZSIpOwogCi0JaWYgKFB5VHlwZV9SZWFkeSgmX1B5V2Vha3JlZl9SZWZUeXBlKSA8IDApCi0JCVB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgd2Vha3JlZiB0eXBlIik7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmX1B5V2Vha3JlZl9SZWZUeXBlKSA8IDApCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgd2Vha3JlZiB0eXBlIik7CiAKLQlpZiAoUHlUeXBlX1JlYWR5KCZfUHlXZWFrcmVmX0NhbGxhYmxlUHJveHlUeXBlKSA8IDApCi0JCVB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgY2FsbGFibGUgd2Vha3JlZiBwcm94eSB0eXBlIik7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmX1B5V2Vha3JlZl9DYWxsYWJsZVByb3h5VHlwZSkgPCAwKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIGNhbGxhYmxlIHdlYWtyZWYgcHJveHkgdHlwZSIpOwogCi0JaWYgKFB5VHlwZV9SZWFkeSgmX1B5V2Vha3JlZl9Qcm94eVR5cGUpIDwgMCkKLQkJUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSB3ZWFrcmVmIHByb3h5IHR5cGUiKTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZfUHlXZWFrcmVmX1Byb3h5VHlwZSkgPCAwKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIHdlYWtyZWYgcHJveHkgdHlwZSIpOwogCi0JaWYgKFB5VHlwZV9SZWFkeSgmUHlCb29sX1R5cGUpIDwgMCkKLQkJUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSBib29sIHR5cGUiKTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZQeUJvb2xfVHlwZSkgPCAwKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIGJvb2wgdHlwZSIpOwogCi0JaWYgKFB5VHlwZV9SZWFkeSgmUHlTdHJpbmdfVHlwZSkgPCAwKQotCQlQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIHN0ciB0eXBlIik7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmUHlTdHJpbmdfVHlwZSkgPCAwKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIHN0ciB0eXBlIik7CiAKLQlpZiAoUHlUeXBlX1JlYWR5KCZQeUJ5dGVBcnJheV9UeXBlKSA8IDApCi0JCVB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgYnl0ZWFycmF5IHR5cGUiKTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZQeUJ5dGVBcnJheV9UeXBlKSA8IDApCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgYnl0ZWFycmF5IHR5cGUiKTsKIAotCWlmIChQeVR5cGVfUmVhZHkoJlB5TGlzdF9UeXBlKSA8IDApCi0JCVB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgbGlzdCB0eXBlIik7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmUHlMaXN0X1R5cGUpIDwgMCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSBsaXN0IHR5cGUiKTsKIAotCWlmIChQeVR5cGVfUmVhZHkoJlB5Tm9uZV9UeXBlKSA8IDApCi0JCVB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgTm9uZSB0eXBlIik7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmUHlOb25lX1R5cGUpIDwgMCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSBOb25lIHR5cGUiKTsKIAotCWlmIChQeVR5cGVfUmVhZHkoJlB5Tm90SW1wbGVtZW50ZWRfVHlwZSkgPCAwKQotCQlQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIE5vdEltcGxlbWVudGVkIHR5cGUiKTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZQeU5vdEltcGxlbWVudGVkX1R5cGUpIDwgMCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSBOb3RJbXBsZW1lbnRlZCB0eXBlIik7CiAKLQlpZiAoUHlUeXBlX1JlYWR5KCZQeVRyYWNlQmFja19UeXBlKSA8IDApCi0JCVB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgdHJhY2ViYWNrIHR5cGUiKTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZQeVRyYWNlQmFja19UeXBlKSA8IDApCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgdHJhY2ViYWNrIHR5cGUiKTsKIAotCWlmIChQeVR5cGVfUmVhZHkoJlB5U3VwZXJfVHlwZSkgPCAwKQotCQlQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIHN1cGVyIHR5cGUiKTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZQeVN1cGVyX1R5cGUpIDwgMCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSBzdXBlciB0eXBlIik7CiAKLQlpZiAoUHlUeXBlX1JlYWR5KCZQeUJhc2VPYmplY3RfVHlwZSkgPCAwKQotCQlQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIG9iamVjdCB0eXBlIik7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmUHlCYXNlT2JqZWN0X1R5cGUpIDwgMCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSBvYmplY3QgdHlwZSIpOwogCi0JaWYgKFB5VHlwZV9SZWFkeSgmUHlSYW5nZV9UeXBlKSA8IDApCi0JCVB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgeHJhbmdlIHR5cGUiKTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZQeVJhbmdlX1R5cGUpIDwgMCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSB4cmFuZ2UgdHlwZSIpOwogCi0JaWYgKFB5VHlwZV9SZWFkeSgmUHlEaWN0X1R5cGUpIDwgMCkKLQkJUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSBkaWN0IHR5cGUiKTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZQeURpY3RfVHlwZSkgPCAwKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIGRpY3QgdHlwZSIpOwogCi0JaWYgKFB5VHlwZV9SZWFkeSgmUHlTZXRfVHlwZSkgPCAwKQotCQlQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIHNldCB0eXBlIik7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmUHlTZXRfVHlwZSkgPCAwKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIHNldCB0eXBlIik7CiAKLQlpZiAoUHlUeXBlX1JlYWR5KCZQeVVuaWNvZGVfVHlwZSkgPCAwKQotCQlQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIHVuaWNvZGUgdHlwZSIpOworICAgIGlmIChQeVR5cGVfUmVhZHkoJlB5VW5pY29kZV9UeXBlKSA8IDApCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgdW5pY29kZSB0eXBlIik7CiAKLQlpZiAoUHlUeXBlX1JlYWR5KCZQeVNsaWNlX1R5cGUpIDwgMCkKLQkJUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSBzbGljZSB0eXBlIik7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmUHlTbGljZV9UeXBlKSA8IDApCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgc2xpY2UgdHlwZSIpOwogCi0JaWYgKFB5VHlwZV9SZWFkeSgmUHlTdGF0aWNNZXRob2RfVHlwZSkgPCAwKQotCQlQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIHN0YXRpYyBtZXRob2QgdHlwZSIpOworICAgIGlmIChQeVR5cGVfUmVhZHkoJlB5U3RhdGljTWV0aG9kX1R5cGUpIDwgMCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSBzdGF0aWMgbWV0aG9kIHR5cGUiKTsKIAogI2lmbmRlZiBXSVRIT1VUX0NPTVBMRVgKLQlpZiAoUHlUeXBlX1JlYWR5KCZQeUNvbXBsZXhfVHlwZSkgPCAwKQotCQlQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIGNvbXBsZXggdHlwZSIpOworICAgIGlmIChQeVR5cGVfUmVhZHkoJlB5Q29tcGxleF9UeXBlKSA8IDApCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgY29tcGxleCB0eXBlIik7CiAjZW5kaWYKIAotCWlmIChQeVR5cGVfUmVhZHkoJlB5RmxvYXRfVHlwZSkgPCAwKQotCQlQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIGZsb2F0IHR5cGUiKTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZQeUZsb2F0X1R5cGUpIDwgMCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSBmbG9hdCB0eXBlIik7CiAKLQlpZiAoUHlUeXBlX1JlYWR5KCZQeUJ1ZmZlcl9UeXBlKSA8IDApCi0JCVB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgYnVmZmVyIHR5cGUiKTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZQeUJ1ZmZlcl9UeXBlKSA8IDApCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgYnVmZmVyIHR5cGUiKTsKIAotCWlmIChQeVR5cGVfUmVhZHkoJlB5TG9uZ19UeXBlKSA8IDApCi0JCVB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgbG9uZyB0eXBlIik7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmUHlMb25nX1R5cGUpIDwgMCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSBsb25nIHR5cGUiKTsKIAotCWlmIChQeVR5cGVfUmVhZHkoJlB5SW50X1R5cGUpIDwgMCkKLQkJUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSBpbnQgdHlwZSIpOworICAgIGlmIChQeVR5cGVfUmVhZHkoJlB5SW50X1R5cGUpIDwgMCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSBpbnQgdHlwZSIpOwogCi0JaWYgKFB5VHlwZV9SZWFkeSgmUHlGcm96ZW5TZXRfVHlwZSkgPCAwKQotCQlQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIGZyb3plbnNldCB0eXBlIik7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmUHlGcm96ZW5TZXRfVHlwZSkgPCAwKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIGZyb3plbnNldCB0eXBlIik7CiAKLQlpZiAoUHlUeXBlX1JlYWR5KCZQeVByb3BlcnR5X1R5cGUpIDwgMCkKLQkJUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSBwcm9wZXJ0eSB0eXBlIik7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmUHlQcm9wZXJ0eV9UeXBlKSA8IDApCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgcHJvcGVydHkgdHlwZSIpOwogCi0JaWYgKFB5VHlwZV9SZWFkeSgmUHlUdXBsZV9UeXBlKSA8IDApCi0JCVB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgdHVwbGUgdHlwZSIpOworICAgIGlmIChQeVR5cGVfUmVhZHkoJlB5VHVwbGVfVHlwZSkgPCAwKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIHR1cGxlIHR5cGUiKTsKIAotCWlmIChQeVR5cGVfUmVhZHkoJlB5RW51bV9UeXBlKSA8IDApCi0JCVB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgZW51bWVyYXRlIHR5cGUiKTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZQeUVudW1fVHlwZSkgPCAwKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIGVudW1lcmF0ZSB0eXBlIik7CiAKLQlpZiAoUHlUeXBlX1JlYWR5KCZQeVJldmVyc2VkX1R5cGUpIDwgMCkKLQkJUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSByZXZlcnNlZCB0eXBlIik7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmUHlSZXZlcnNlZF9UeXBlKSA8IDApCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgcmV2ZXJzZWQgdHlwZSIpOwogCi0JaWYgKFB5VHlwZV9SZWFkeSgmUHlDb2RlX1R5cGUpIDwgMCkKLQkJUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSBjb2RlIHR5cGUiKTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZQeUNvZGVfVHlwZSkgPCAwKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIGNvZGUgdHlwZSIpOwogCi0JaWYgKFB5VHlwZV9SZWFkeSgmUHlGcmFtZV9UeXBlKSA8IDApCi0JCVB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgZnJhbWUgdHlwZSIpOworICAgIGlmIChQeVR5cGVfUmVhZHkoJlB5RnJhbWVfVHlwZSkgPCAwKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIGZyYW1lIHR5cGUiKTsKIAotCWlmIChQeVR5cGVfUmVhZHkoJlB5Q0Z1bmN0aW9uX1R5cGUpIDwgMCkKLQkJUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSBidWlsdGluIGZ1bmN0aW9uIHR5cGUiKTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZQeUNGdW5jdGlvbl9UeXBlKSA8IDApCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgYnVpbHRpbiBmdW5jdGlvbiB0eXBlIik7CiAKLQlpZiAoUHlUeXBlX1JlYWR5KCZQeU1ldGhvZF9UeXBlKSA8IDApCi0JCVB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgbWV0aG9kIHR5cGUiKTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZQeU1ldGhvZF9UeXBlKSA8IDApCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgbWV0aG9kIHR5cGUiKTsKIAotCWlmIChQeVR5cGVfUmVhZHkoJlB5RnVuY3Rpb25fVHlwZSkgPCAwKQotCQlQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIGZ1bmN0aW9uIHR5cGUiKTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZQeUZ1bmN0aW9uX1R5cGUpIDwgMCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSBmdW5jdGlvbiB0eXBlIik7CiAKLQlpZiAoUHlUeXBlX1JlYWR5KCZQeUNsYXNzX1R5cGUpIDwgMCkKLQkJUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSBjbGFzcyB0eXBlIik7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmUHlDbGFzc19UeXBlKSA8IDApCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgY2xhc3MgdHlwZSIpOwogCi0JaWYgKFB5VHlwZV9SZWFkeSgmUHlEaWN0UHJveHlfVHlwZSkgPCAwKQotCQlQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIGRpY3QgcHJveHkgdHlwZSIpOworICAgIGlmIChQeVR5cGVfUmVhZHkoJlB5RGljdFByb3h5X1R5cGUpIDwgMCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSBkaWN0IHByb3h5IHR5cGUiKTsKIAotCWlmIChQeVR5cGVfUmVhZHkoJlB5R2VuX1R5cGUpIDwgMCkKLQkJUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSBnZW5lcmF0b3IgdHlwZSIpOworICAgIGlmIChQeVR5cGVfUmVhZHkoJlB5R2VuX1R5cGUpIDwgMCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSBnZW5lcmF0b3IgdHlwZSIpOwogCi0JaWYgKFB5VHlwZV9SZWFkeSgmUHlHZXRTZXREZXNjcl9UeXBlKSA8IDApCi0JCVB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgZ2V0LXNldCBkZXNjcmlwdG9yIHR5cGUiKTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZQeUdldFNldERlc2NyX1R5cGUpIDwgMCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSBnZXQtc2V0IGRlc2NyaXB0b3IgdHlwZSIpOwogCi0JaWYgKFB5VHlwZV9SZWFkeSgmUHlXcmFwcGVyRGVzY3JfVHlwZSkgPCAwKQotCQlQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIHdyYXBwZXIgdHlwZSIpOworICAgIGlmIChQeVR5cGVfUmVhZHkoJlB5V3JhcHBlckRlc2NyX1R5cGUpIDwgMCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSB3cmFwcGVyIHR5cGUiKTsKIAotCWlmIChQeVR5cGVfUmVhZHkoJlB5SW5zdGFuY2VfVHlwZSkgPCAwKQotCQlQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIGluc3RhbmNlIHR5cGUiKTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZQeUluc3RhbmNlX1R5cGUpIDwgMCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSBpbnN0YW5jZSB0eXBlIik7CiAKLQlpZiAoUHlUeXBlX1JlYWR5KCZQeUVsbGlwc2lzX1R5cGUpIDwgMCkKLQkJUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSBlbGxpcHNpcyB0eXBlIik7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmUHlFbGxpcHNpc19UeXBlKSA8IDApCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgZWxsaXBzaXMgdHlwZSIpOwogCi0JaWYgKFB5VHlwZV9SZWFkeSgmUHlNZW1iZXJEZXNjcl9UeXBlKSA8IDApCi0JCVB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgbWVtYmVyIGRlc2NyaXB0b3IgdHlwZSIpOworICAgIGlmIChQeVR5cGVfUmVhZHkoJlB5TWVtYmVyRGVzY3JfVHlwZSkgPCAwKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIG1lbWJlciBkZXNjcmlwdG9yIHR5cGUiKTsKIH0KIAogCkBAIC0yMTU5LDQzICsyMTU5LDQzIEBACiB2b2lkCiBfUHlfTmV3UmVmZXJlbmNlKFB5T2JqZWN0ICpvcCkKIHsKLQlfUHlfSU5DX1JFRlRPVEFMOwotCW9wLT5vYl9yZWZjbnQgPSAxOwotCV9QeV9BZGRUb0FsbE9iamVjdHMob3AsIDEpOwotCV9QeV9JTkNfVFBBTExPQ1Mob3ApOworICAgIF9QeV9JTkNfUkVGVE9UQUw7CisgICAgb3AtPm9iX3JlZmNudCA9IDE7CisgICAgX1B5X0FkZFRvQWxsT2JqZWN0cyhvcCwgMSk7CisgICAgX1B5X0lOQ19UUEFMTE9DUyhvcCk7CiB9CiAKIHZvaWQKIF9QeV9Gb3JnZXRSZWZlcmVuY2UocmVnaXN0ZXIgUHlPYmplY3QgKm9wKQogewogI2lmZGVmIFNMT1dfVU5SRUZfQ0hFQ0sKLSAgICAgICAgcmVnaXN0ZXIgUHlPYmplY3QgKnA7CisgICAgcmVnaXN0ZXIgUHlPYmplY3QgKnA7CiAjZW5kaWYKLQlpZiAob3AtPm9iX3JlZmNudCA8IDApCi0JCVB5X0ZhdGFsRXJyb3IoIlVOUkVGIG5lZ2F0aXZlIHJlZmNudCIpOwotCWlmIChvcCA9PSAmcmVmY2hhaW4gfHwKLQkgICAgb3AtPl9vYl9wcmV2LT5fb2JfbmV4dCAhPSBvcCB8fCBvcC0+X29iX25leHQtPl9vYl9wcmV2ICE9IG9wKQotCQlQeV9GYXRhbEVycm9yKCJVTlJFRiBpbnZhbGlkIG9iamVjdCIpOworICAgIGlmIChvcC0+b2JfcmVmY250IDwgMCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiVU5SRUYgbmVnYXRpdmUgcmVmY250Iik7CisgICAgaWYgKG9wID09ICZyZWZjaGFpbiB8fAorICAgICAgICBvcC0+X29iX3ByZXYtPl9vYl9uZXh0ICE9IG9wIHx8IG9wLT5fb2JfbmV4dC0+X29iX3ByZXYgIT0gb3ApCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIlVOUkVGIGludmFsaWQgb2JqZWN0Iik7CiAjaWZkZWYgU0xPV19VTlJFRl9DSEVDSwotCWZvciAocCA9IHJlZmNoYWluLl9vYl9uZXh0OyBwICE9ICZyZWZjaGFpbjsgcCA9IHAtPl9vYl9uZXh0KSB7Ci0JCWlmIChwID09IG9wKQotCQkJYnJlYWs7Ci0JfQotCWlmIChwID09ICZyZWZjaGFpbikgLyogTm90IGZvdW5kICovCi0JCVB5X0ZhdGFsRXJyb3IoIlVOUkVGIHVua25vd24gb2JqZWN0Iik7CisgICAgZm9yIChwID0gcmVmY2hhaW4uX29iX25leHQ7IHAgIT0gJnJlZmNoYWluOyBwID0gcC0+X29iX25leHQpIHsKKyAgICAgICAgaWYgKHAgPT0gb3ApCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKHAgPT0gJnJlZmNoYWluKSAvKiBOb3QgZm91bmQgKi8KKyAgICAgICAgUHlfRmF0YWxFcnJvcigiVU5SRUYgdW5rbm93biBvYmplY3QiKTsKICNlbmRpZgotCW9wLT5fb2JfbmV4dC0+X29iX3ByZXYgPSBvcC0+X29iX3ByZXY7Ci0Jb3AtPl9vYl9wcmV2LT5fb2JfbmV4dCA9IG9wLT5fb2JfbmV4dDsKLQlvcC0+X29iX25leHQgPSBvcC0+X29iX3ByZXYgPSBOVUxMOwotCV9QeV9JTkNfVFBGUkVFUyhvcCk7CisgICAgb3AtPl9vYl9uZXh0LT5fb2JfcHJldiA9IG9wLT5fb2JfcHJldjsKKyAgICBvcC0+X29iX3ByZXYtPl9vYl9uZXh0ID0gb3AtPl9vYl9uZXh0OworICAgIG9wLT5fb2JfbmV4dCA9IG9wLT5fb2JfcHJldiA9IE5VTEw7CisgICAgX1B5X0lOQ19UUEZSRUVTKG9wKTsKIH0KIAogdm9pZAogX1B5X0RlYWxsb2MoUHlPYmplY3QgKm9wKQogewotCWRlc3RydWN0b3IgZGVhbGxvYyA9IFB5X1RZUEUob3ApLT50cF9kZWFsbG9jOwotCV9QeV9Gb3JnZXRSZWZlcmVuY2Uob3ApOwotCSgqZGVhbGxvYykob3ApOworICAgIGRlc3RydWN0b3IgZGVhbGxvYyA9IFB5X1RZUEUob3ApLT50cF9kZWFsbG9jOworICAgIF9QeV9Gb3JnZXRSZWZlcmVuY2Uob3ApOworICAgICgqZGVhbGxvYykob3ApOwogfQogCiAvKiBQcmludCBhbGwgbGl2ZSBvYmplY3RzLiAgQmVjYXVzZSBQeU9iamVjdF9QcmludCBpcyBjYWxsZWQsIHRoZQpAQCAtMjIwNCwxNCArMjIwNCwxNCBAQAogdm9pZAogX1B5X1ByaW50UmVmZXJlbmNlcyhGSUxFICpmcCkKIHsKLQlQeU9iamVjdCAqb3A7Ci0JZnByaW50ZihmcCwgIlJlbWFpbmluZyBvYmplY3RzOlxuIik7Ci0JZm9yIChvcCA9IHJlZmNoYWluLl9vYl9uZXh0OyBvcCAhPSAmcmVmY2hhaW47IG9wID0gb3AtPl9vYl9uZXh0KSB7Ci0JCWZwcmludGYoZnAsICIlcCBbJSIgUFlfRk9STUFUX1NJWkVfVCAiZF0gIiwgb3AsIG9wLT5vYl9yZWZjbnQpOwotCQlpZiAoUHlPYmplY3RfUHJpbnQob3AsIGZwLCAwKSAhPSAwKQotCQkJUHlFcnJfQ2xlYXIoKTsKLQkJcHV0YygnXG4nLCBmcCk7Ci0JfQorICAgIFB5T2JqZWN0ICpvcDsKKyAgICBmcHJpbnRmKGZwLCAiUmVtYWluaW5nIG9iamVjdHM6XG4iKTsKKyAgICBmb3IgKG9wID0gcmVmY2hhaW4uX29iX25leHQ7IG9wICE9ICZyZWZjaGFpbjsgb3AgPSBvcC0+X29iX25leHQpIHsKKyAgICAgICAgZnByaW50ZihmcCwgIiVwIFslIiBQWV9GT1JNQVRfU0laRV9UICJkXSAiLCBvcCwgb3AtPm9iX3JlZmNudCk7CisgICAgICAgIGlmIChQeU9iamVjdF9QcmludChvcCwgZnAsIDApICE9IDApCisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBwdXRjKCdcbicsIGZwKTsKKyAgICB9CiB9CiAKIC8qIFByaW50IHRoZSBhZGRyZXNzZXMgb2YgYWxsIGxpdmUgb2JqZWN0cy4gIFVubGlrZSBfUHlfUHJpbnRSZWZlcmVuY2VzLCB0aGlzCkBAIC0yMjIwLDQwICsyMjIwLDQwIEBACiB2b2lkCiBfUHlfUHJpbnRSZWZlcmVuY2VBZGRyZXNzZXMoRklMRSAqZnApCiB7Ci0JUHlPYmplY3QgKm9wOwotCWZwcmludGYoZnAsICJSZW1haW5pbmcgb2JqZWN0IGFkZHJlc3NlczpcbiIpOwotCWZvciAob3AgPSByZWZjaGFpbi5fb2JfbmV4dDsgb3AgIT0gJnJlZmNoYWluOyBvcCA9IG9wLT5fb2JfbmV4dCkKLQkJZnByaW50ZihmcCwgIiVwIFslIiBQWV9GT1JNQVRfU0laRV9UICJkXSAlc1xuIiwgb3AsCi0JCQlvcC0+b2JfcmVmY250LCBQeV9UWVBFKG9wKS0+dHBfbmFtZSk7CisgICAgUHlPYmplY3QgKm9wOworICAgIGZwcmludGYoZnAsICJSZW1haW5pbmcgb2JqZWN0IGFkZHJlc3NlczpcbiIpOworICAgIGZvciAob3AgPSByZWZjaGFpbi5fb2JfbmV4dDsgb3AgIT0gJnJlZmNoYWluOyBvcCA9IG9wLT5fb2JfbmV4dCkKKyAgICAgICAgZnByaW50ZihmcCwgIiVwIFslIiBQWV9GT1JNQVRfU0laRV9UICJkXSAlc1xuIiwgb3AsCisgICAgICAgICAgICBvcC0+b2JfcmVmY250LCBQeV9UWVBFKG9wKS0+dHBfbmFtZSk7CiB9CiAKIFB5T2JqZWN0ICoKIF9QeV9HZXRPYmplY3RzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgaSwgbjsKLQlQeU9iamVjdCAqdCA9IE5VTEw7Ci0JUHlPYmplY3QgKnJlcywgKm9wOworICAgIGludCBpLCBuOworICAgIFB5T2JqZWN0ICp0ID0gTlVMTDsKKyAgICBQeU9iamVjdCAqcmVzLCAqb3A7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIml8TyIsICZuLCAmdCkpCi0JCXJldHVybiBOVUxMOwotCW9wID0gcmVmY2hhaW4uX29iX25leHQ7Ci0JcmVzID0gUHlMaXN0X05ldygwKTsKLQlpZiAocmVzID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWZvciAoaSA9IDA7IChuID09IDAgfHwgaSA8IG4pICYmIG9wICE9ICZyZWZjaGFpbjsgaSsrKSB7Ci0JCXdoaWxlIChvcCA9PSBzZWxmIHx8IG9wID09IGFyZ3MgfHwgb3AgPT0gcmVzIHx8IG9wID09IHQgfHwKLQkJICAgICAgICh0ICE9IE5VTEwgJiYgUHlfVFlQRShvcCkgIT0gKFB5VHlwZU9iamVjdCAqKSB0KSkgewotCQkJb3AgPSBvcC0+X29iX25leHQ7Ci0JCQlpZiAob3AgPT0gJnJlZmNoYWluKQotCQkJCXJldHVybiByZXM7Ci0JCX0KLQkJaWYgKFB5TGlzdF9BcHBlbmQocmVzLCBvcCkgPCAwKSB7Ci0JCQlQeV9ERUNSRUYocmVzKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCW9wID0gb3AtPl9vYl9uZXh0OwotCX0KLQlyZXR1cm4gcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaXxPIiwgJm4sICZ0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgb3AgPSByZWZjaGFpbi5fb2JfbmV4dDsKKyAgICByZXMgPSBQeUxpc3RfTmV3KDApOworICAgIGlmIChyZXMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZm9yIChpID0gMDsgKG4gPT0gMCB8fCBpIDwgbikgJiYgb3AgIT0gJnJlZmNoYWluOyBpKyspIHsKKyAgICAgICAgd2hpbGUgKG9wID09IHNlbGYgfHwgb3AgPT0gYXJncyB8fCBvcCA9PSByZXMgfHwgb3AgPT0gdCB8fAorICAgICAgICAgICAgICAgKHQgIT0gTlVMTCAmJiBQeV9UWVBFKG9wKSAhPSAoUHlUeXBlT2JqZWN0ICopIHQpKSB7CisgICAgICAgICAgICBvcCA9IG9wLT5fb2JfbmV4dDsKKyAgICAgICAgICAgIGlmIChvcCA9PSAmcmVmY2hhaW4pCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgICAgICBpZiAoUHlMaXN0X0FwcGVuZChyZXMsIG9wKSA8IDApIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihyZXMpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgb3AgPSBvcC0+X29iX25leHQ7CisgICAgfQorICAgIHJldHVybiByZXM7CiB9CiAKICNlbmRpZgpAQCAtMjI3MiwxOSArMjI3MiwxOSBAQAogdm9pZCAqCiBQeU1lbV9NYWxsb2Moc2l6ZV90IG5ieXRlcykKIHsKLQlyZXR1cm4gUHlNZW1fTUFMTE9DKG5ieXRlcyk7CisgICAgcmV0dXJuIFB5TWVtX01BTExPQyhuYnl0ZXMpOwogfQogCiB2b2lkICoKIFB5TWVtX1JlYWxsb2Modm9pZCAqcCwgc2l6ZV90IG5ieXRlcykKIHsKLQlyZXR1cm4gUHlNZW1fUkVBTExPQyhwLCBuYnl0ZXMpOworICAgIHJldHVybiBQeU1lbV9SRUFMTE9DKHAsIG5ieXRlcyk7CiB9CiAKIHZvaWQKIFB5TWVtX0ZyZWUodm9pZCAqcCkKIHsKLQlQeU1lbV9GUkVFKHApOworICAgIFB5TWVtX0ZSRUUocCk7CiB9CiAKIApAQCAtMjMwNSw1MiArMjMwNSw1MiBAQAogaW50CiBQeV9SZXByRW50ZXIoUHlPYmplY3QgKm9iaikKIHsKLQlQeU9iamVjdCAqZGljdDsKLQlQeU9iamVjdCAqbGlzdDsKLQlQeV9zc2l6ZV90IGk7CisgICAgUHlPYmplY3QgKmRpY3Q7CisgICAgUHlPYmplY3QgKmxpc3Q7CisgICAgUHlfc3NpemVfdCBpOwogCi0JZGljdCA9IFB5VGhyZWFkU3RhdGVfR2V0RGljdCgpOwotCWlmIChkaWN0ID09IE5VTEwpCi0JCXJldHVybiAwOwotCWxpc3QgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhkaWN0LCBLRVkpOwotCWlmIChsaXN0ID09IE5VTEwpIHsKLQkJbGlzdCA9IFB5TGlzdF9OZXcoMCk7Ci0JCWlmIChsaXN0ID09IE5VTEwpCi0JCQlyZXR1cm4gLTE7Ci0JCWlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCBLRVksIGxpc3QpIDwgMCkKLQkJCXJldHVybiAtMTsKLQkJUHlfREVDUkVGKGxpc3QpOwotCX0KLQlpID0gUHlMaXN0X0dFVF9TSVpFKGxpc3QpOwotCXdoaWxlICgtLWkgPj0gMCkgewotCQlpZiAoUHlMaXN0X0dFVF9JVEVNKGxpc3QsIGkpID09IG9iaikKLQkJCXJldHVybiAxOwotCX0KLQlQeUxpc3RfQXBwZW5kKGxpc3QsIG9iaik7Ci0JcmV0dXJuIDA7CisgICAgZGljdCA9IFB5VGhyZWFkU3RhdGVfR2V0RGljdCgpOworICAgIGlmIChkaWN0ID09IE5VTEwpCisgICAgICAgIHJldHVybiAwOworICAgIGxpc3QgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhkaWN0LCBLRVkpOworICAgIGlmIChsaXN0ID09IE5VTEwpIHsKKyAgICAgICAgbGlzdCA9IFB5TGlzdF9OZXcoMCk7CisgICAgICAgIGlmIChsaXN0ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCBLRVksIGxpc3QpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgUHlfREVDUkVGKGxpc3QpOworICAgIH0KKyAgICBpID0gUHlMaXN0X0dFVF9TSVpFKGxpc3QpOworICAgIHdoaWxlICgtLWkgPj0gMCkgeworICAgICAgICBpZiAoUHlMaXN0X0dFVF9JVEVNKGxpc3QsIGkpID09IG9iaikKKyAgICAgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBQeUxpc3RfQXBwZW5kKGxpc3QsIG9iaik7CisgICAgcmV0dXJuIDA7CiB9CiAKIHZvaWQKIFB5X1JlcHJMZWF2ZShQeU9iamVjdCAqb2JqKQogewotCVB5T2JqZWN0ICpkaWN0OwotCVB5T2JqZWN0ICpsaXN0OwotCVB5X3NzaXplX3QgaTsKKyAgICBQeU9iamVjdCAqZGljdDsKKyAgICBQeU9iamVjdCAqbGlzdDsKKyAgICBQeV9zc2l6ZV90IGk7CiAKLQlkaWN0ID0gUHlUaHJlYWRTdGF0ZV9HZXREaWN0KCk7Ci0JaWYgKGRpY3QgPT0gTlVMTCkKLQkJcmV0dXJuOwotCWxpc3QgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhkaWN0LCBLRVkpOwotCWlmIChsaXN0ID09IE5VTEwgfHwgIVB5TGlzdF9DaGVjayhsaXN0KSkKLQkJcmV0dXJuOwotCWkgPSBQeUxpc3RfR0VUX1NJWkUobGlzdCk7Ci0JLyogQ291bnQgYmFja3dhcmRzIGJlY2F1c2Ugd2UgYWx3YXlzIGV4cGVjdCBvYmogdG8gYmUgbGlzdFstMV0gKi8KLQl3aGlsZSAoLS1pID49IDApIHsKLQkJaWYgKFB5TGlzdF9HRVRfSVRFTShsaXN0LCBpKSA9PSBvYmopIHsKLQkJCVB5TGlzdF9TZXRTbGljZShsaXN0LCBpLCBpICsgMSwgTlVMTCk7Ci0JCQlicmVhazsKLQkJfQotCX0KKyAgICBkaWN0ID0gUHlUaHJlYWRTdGF0ZV9HZXREaWN0KCk7CisgICAgaWYgKGRpY3QgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOworICAgIGxpc3QgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhkaWN0LCBLRVkpOworICAgIGlmIChsaXN0ID09IE5VTEwgfHwgIVB5TGlzdF9DaGVjayhsaXN0KSkKKyAgICAgICAgcmV0dXJuOworICAgIGkgPSBQeUxpc3RfR0VUX1NJWkUobGlzdCk7CisgICAgLyogQ291bnQgYmFja3dhcmRzIGJlY2F1c2Ugd2UgYWx3YXlzIGV4cGVjdCBvYmogdG8gYmUgbGlzdFstMV0gKi8KKyAgICB3aGlsZSAoLS1pID49IDApIHsKKyAgICAgICAgaWYgKFB5TGlzdF9HRVRfSVRFTShsaXN0LCBpKSA9PSBvYmopIHsKKyAgICAgICAgICAgIFB5TGlzdF9TZXRTbGljZShsaXN0LCBpLCBpICsgMSwgTlVMTCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KIH0KIAogLyogVHJhc2hjYW4gc3VwcG9ydC4gKi8KQEAgLTIzNzAsMTEgKzIzNzAsMTEgQEAKIHZvaWQKIF9QeVRyYXNoX2RlcG9zaXRfb2JqZWN0KFB5T2JqZWN0ICpvcCkKIHsKLQlhc3NlcnQoUHlPYmplY3RfSVNfR0Mob3ApKTsKLQlhc3NlcnQoX1B5X0FTX0dDKG9wKS0+Z2MuZ2NfcmVmcyA9PSBfUHlHQ19SRUZTX1VOVFJBQ0tFRCk7Ci0JYXNzZXJ0KG9wLT5vYl9yZWZjbnQgPT0gMCk7Ci0JX1B5X0FTX0dDKG9wKS0+Z2MuZ2NfcHJldiA9IChQeUdDX0hlYWQgKilfUHlUcmFzaF9kZWxldGVfbGF0ZXI7Ci0JX1B5VHJhc2hfZGVsZXRlX2xhdGVyID0gb3A7CisgICAgYXNzZXJ0KFB5T2JqZWN0X0lTX0dDKG9wKSk7CisgICAgYXNzZXJ0KF9QeV9BU19HQyhvcCktPmdjLmdjX3JlZnMgPT0gX1B5R0NfUkVGU19VTlRSQUNLRUQpOworICAgIGFzc2VydChvcC0+b2JfcmVmY250ID09IDApOworICAgIF9QeV9BU19HQyhvcCktPmdjLmdjX3ByZXYgPSAoUHlHQ19IZWFkICopX1B5VHJhc2hfZGVsZXRlX2xhdGVyOworICAgIF9QeVRyYXNoX2RlbGV0ZV9sYXRlciA9IG9wOwogfQogCiAvKiBEZWFsbG9jY2F0ZSBhbGwgdGhlIG9iamVjdHMgaW4gdGhlIF9QeVRyYXNoX2RlbGV0ZV9sYXRlciBsaXN0LiAgQ2FsbGVkIHdoZW4KQEAgLTIzODMsMjQgKzIzODMsMjQgQEAKIHZvaWQKIF9QeVRyYXNoX2Rlc3Ryb3lfY2hhaW4odm9pZCkKIHsKLQl3aGlsZSAoX1B5VHJhc2hfZGVsZXRlX2xhdGVyKSB7Ci0JCVB5T2JqZWN0ICpvcCA9IF9QeVRyYXNoX2RlbGV0ZV9sYXRlcjsKLQkJZGVzdHJ1Y3RvciBkZWFsbG9jID0gUHlfVFlQRShvcCktPnRwX2RlYWxsb2M7CisgICAgd2hpbGUgKF9QeVRyYXNoX2RlbGV0ZV9sYXRlcikgeworICAgICAgICBQeU9iamVjdCAqb3AgPSBfUHlUcmFzaF9kZWxldGVfbGF0ZXI7CisgICAgICAgIGRlc3RydWN0b3IgZGVhbGxvYyA9IFB5X1RZUEUob3ApLT50cF9kZWFsbG9jOwogCi0JCV9QeVRyYXNoX2RlbGV0ZV9sYXRlciA9Ci0JCQkoUHlPYmplY3QqKSBfUHlfQVNfR0Mob3ApLT5nYy5nY19wcmV2OworICAgICAgICBfUHlUcmFzaF9kZWxldGVfbGF0ZXIgPQorICAgICAgICAgICAgKFB5T2JqZWN0KikgX1B5X0FTX0dDKG9wKS0+Z2MuZ2NfcHJldjsKIAotCQkvKiBDYWxsIHRoZSBkZWFsbG9jYXRvciBkaXJlY3RseS4gIFRoaXMgdXNlZCB0byB0cnkgdG8KLQkJICogZm9vbCBQeV9ERUNSRUYgaW50byBjYWxsaW5nIGl0IGluZGlyZWN0bHksIGJ1dAotCQkgKiBQeV9ERUNSRUYgd2FzIGFscmVhZHkgY2FsbGVkIG9uIHRoaXMgb2JqZWN0LCBhbmQgaW4KLQkJICogYXNzb3J0ZWQgbm9uLXJlbGVhc2UgYnVpbGRzIGNhbGxpbmcgUHlfREVDUkVGIGFnYWluIGVuZHMKLQkJICogdXAgZGlzdG9ydGluZyBhbGxvY2F0aW9uIHN0YXRpc3RpY3MuCi0JCSAqLwotCQlhc3NlcnQob3AtPm9iX3JlZmNudCA9PSAwKTsKLQkJKytfUHlUcmFzaF9kZWxldGVfbmVzdGluZzsKLQkJKCpkZWFsbG9jKShvcCk7Ci0JCS0tX1B5VHJhc2hfZGVsZXRlX25lc3Rpbmc7Ci0JfQorICAgICAgICAvKiBDYWxsIHRoZSBkZWFsbG9jYXRvciBkaXJlY3RseS4gIFRoaXMgdXNlZCB0byB0cnkgdG8KKyAgICAgICAgICogZm9vbCBQeV9ERUNSRUYgaW50byBjYWxsaW5nIGl0IGluZGlyZWN0bHksIGJ1dAorICAgICAgICAgKiBQeV9ERUNSRUYgd2FzIGFscmVhZHkgY2FsbGVkIG9uIHRoaXMgb2JqZWN0LCBhbmQgaW4KKyAgICAgICAgICogYXNzb3J0ZWQgbm9uLXJlbGVhc2UgYnVpbGRzIGNhbGxpbmcgUHlfREVDUkVGIGFnYWluIGVuZHMKKyAgICAgICAgICogdXAgZGlzdG9ydGluZyBhbGxvY2F0aW9uIHN0YXRpc3RpY3MuCisgICAgICAgICAqLworICAgICAgICBhc3NlcnQob3AtPm9iX3JlZmNudCA9PSAwKTsKKyAgICAgICAgKytfUHlUcmFzaF9kZWxldGVfbmVzdGluZzsKKyAgICAgICAgKCpkZWFsbG9jKShvcCk7CisgICAgICAgIC0tX1B5VHJhc2hfZGVsZXRlX25lc3Rpbmc7CisgICAgfQogfQogCiAjaWZkZWYgX19jcGx1c3BsdXMKZGlmZiAtLWdpdCBhL09iamVjdHMvb2JtYWxsb2MuYyBiL09iamVjdHMvb2JtYWxsb2MuYwppbmRleCBkMTU4NmMyLi5mMzI5N2YyIDEwMDY0NAotLS0gYS9PYmplY3RzL29ibWFsbG9jLmMKKysrIGIvT2JqZWN0cy9vYm1hbGxvYy5jCkBAIC0xMiw3ICsxMiw3IEBACiAgICB0aGUgY3ljbGljIGdhcmJhZ2UgY29sbGVjdG9yIG9wZXJhdGVzIHNlbGVjdGl2ZWx5IG9uIGNvbnRhaW5lciBvYmplY3RzLgogCiAKLSAgICAgICAgT2JqZWN0LXNwZWNpZmljIGFsbG9jYXRvcnMKKyAgICBPYmplY3Qtc3BlY2lmaWMgYWxsb2NhdG9ycwogICAgIF9fX19fICAgX19fX19fICAgX19fX19fICAgICAgIF9fX19fX19fCiAgICBbIGludCBdIFsgZGljdCBdIFsgbGlzdCBdIC4uLiBbIHN0cmluZyBdICAgICAgIFB5dGhvbiBjb3JlICAgICAgICAgfAogKzMgfCA8LS0tLS0gT2JqZWN0LXNwZWNpZmljIG1lbW9yeSAtLS0tLT4gfCA8LS0gTm9uLW9iamVjdCBtZW1vcnkgLS0+IHwKQEAgLTUyLDcgKzUyLDcgQEAKICAqICAgIGluIFByb2MuIDE5OTUgSW50J2wuIFdvcmtzaG9wIG9uIE1lbW9yeSBNYW5hZ2VtZW50LCBTZXB0ZW1iZXIgMTk5NS4KICAqLwogCi0vKiAjdW5kZWYgV0lUSF9NRU1PUllfTElNSVRTICovCQkvKiBkaXNhYmxlIG1lbSBsaW1pdCBjaGVja3MgICovCisvKiAjdW5kZWYgV0lUSF9NRU1PUllfTElNSVRTICovICAgICAgICAgLyogZGlzYWJsZSBtZW0gbGltaXQgY2hlY2tzICAqLwogCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIApAQCAtODAsMjIgKzgwLDIyIEBACiAgKgogICogRm9yIHNtYWxsIHJlcXVlc3RzIHdlIGhhdmUgdGhlIGZvbGxvd2luZyB0YWJsZToKICAqCi0gKiBSZXF1ZXN0IGluIGJ5dGVzCVNpemUgb2YgYWxsb2NhdGVkIGJsb2NrICAgICAgU2l6ZSBjbGFzcyBpZHgKKyAqIFJlcXVlc3QgaW4gYnl0ZXMgICAgIFNpemUgb2YgYWxsb2NhdGVkIGJsb2NrICAgICAgU2l6ZSBjbGFzcyBpZHgKICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqICAgICAgICAxLTggICAgICAgICAgICAgICAgICAgICA4ICAgICAgICAgICAgICAgICAgICAgICAwCi0gKgkgIDktMTYgICAgICAgICAgICAgICAgICAgMTYgICAgICAgICAgICAgICAgICAgICAgIDEKLSAqCSAxNy0yNCAgICAgICAgICAgICAgICAgICAyNCAgICAgICAgICAgICAgICAgICAgICAgMgotICoJIDI1LTMyICAgICAgICAgICAgICAgICAgIDMyICAgICAgICAgICAgICAgICAgICAgICAzCi0gKgkgMzMtNDAgICAgICAgICAgICAgICAgICAgNDAgICAgICAgICAgICAgICAgICAgICAgIDQKLSAqCSA0MS00OCAgICAgICAgICAgICAgICAgICA0OCAgICAgICAgICAgICAgICAgICAgICAgNQotICoJIDQ5LTU2ICAgICAgICAgICAgICAgICAgIDU2ICAgICAgICAgICAgICAgICAgICAgICA2Ci0gKgkgNTctNjQgICAgICAgICAgICAgICAgICAgNjQgICAgICAgICAgICAgICAgICAgICAgIDcKLSAqCSA2NS03MiAgICAgICAgICAgICAgICAgICA3MiAgICAgICAgICAgICAgICAgICAgICAgOAotICoJICAuLi4gICAgICAgICAgICAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgLi4uCi0gKgkyNDEtMjQ4ICAgICAgICAgICAgICAgICAyNDggICAgICAgICAgICAgICAgICAgICAgMzAKLSAqCTI0OS0yNTYgICAgICAgICAgICAgICAgIDI1NiAgICAgICAgICAgICAgICAgICAgICAzMQorICogICAgICAgIDktMTYgICAgICAgICAgICAgICAgICAgMTYgICAgICAgICAgICAgICAgICAgICAgIDEKKyAqICAgICAgIDE3LTI0ICAgICAgICAgICAgICAgICAgIDI0ICAgICAgICAgICAgICAgICAgICAgICAyCisgKiAgICAgICAyNS0zMiAgICAgICAgICAgICAgICAgICAzMiAgICAgICAgICAgICAgICAgICAgICAgMworICogICAgICAgMzMtNDAgICAgICAgICAgICAgICAgICAgNDAgICAgICAgICAgICAgICAgICAgICAgIDQKKyAqICAgICAgIDQxLTQ4ICAgICAgICAgICAgICAgICAgIDQ4ICAgICAgICAgICAgICAgICAgICAgICA1CisgKiAgICAgICA0OS01NiAgICAgICAgICAgICAgICAgICA1NiAgICAgICAgICAgICAgICAgICAgICAgNgorICogICAgICAgNTctNjQgICAgICAgICAgICAgICAgICAgNjQgICAgICAgICAgICAgICAgICAgICAgIDcKKyAqICAgICAgIDY1LTcyICAgICAgICAgICAgICAgICAgIDcyICAgICAgICAgICAgICAgICAgICAgICA4CisgKiAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgIC4uLgorICogICAgICAyNDEtMjQ4ICAgICAgICAgICAgICAgICAyNDggICAgICAgICAgICAgICAgICAgICAgMzAKKyAqICAgICAgMjQ5LTI1NiAgICAgICAgICAgICAgICAgMjU2ICAgICAgICAgICAgICAgICAgICAgIDMxCiAgKgotICoJMCwgMjU3IGFuZCB1cDogcm91dGVkIHRvIHRoZSB1bmRlcmx5aW5nIGFsbG9jYXRvci4KKyAqICAgICAgMCwgMjU3IGFuZCB1cDogcm91dGVkIHRvIHRoZSB1bmRlcmx5aW5nIGFsbG9jYXRvci4KICAqLwogCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KQEAgLTExMiw5ICsxMTIsOSBAQAogICoKICAqIFlvdSBzaG91bGRuJ3QgY2hhbmdlIHRoaXMgdW5sZXNzIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZy4KICAqLwotI2RlZmluZSBBTElHTk1FTlQJCTgJCS8qIG11c3QgYmUgMl5OICovCi0jZGVmaW5lIEFMSUdOTUVOVF9TSElGVAkJMwotI2RlZmluZSBBTElHTk1FTlRfTUFTSwkJKEFMSUdOTUVOVCAtIDEpCisjZGVmaW5lIEFMSUdOTUVOVCAgICAgICAgICAgICAgIDggICAgICAgICAgICAgICAvKiBtdXN0IGJlIDJeTiAqLworI2RlZmluZSBBTElHTk1FTlRfU0hJRlQgICAgICAgICAzCisjZGVmaW5lIEFMSUdOTUVOVF9NQVNLICAgICAgICAgIChBTElHTk1FTlQgLSAxKQogCiAvKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBpbiBzaXplIGNsYXNzIEksIGFzIGEgdWludC4gKi8KICNkZWZpbmUgSU5ERVgyU0laRShJKSAoKCh1aW50KShJKSArIDEpIDw8IEFMSUdOTUVOVF9TSElGVCkKQEAgLTEyNSwxNCArMTI1LDE0IEBACiAgKiB0aGlzIHZhbHVlIGFjY29yZGluZyB0byB5b3VyIGFwcGxpY2F0aW9uIGJlaGF2aW91ciBhbmQgbWVtb3J5IG5lZWRzLgogICoKICAqIFRoZSBmb2xsb3dpbmcgaW52YXJpYW50cyBtdXN0IGhvbGQ6Ci0gKgkxKSBBTElHTk1FTlQgPD0gU01BTExfUkVRVUVTVF9USFJFU0hPTEQgPD0gMjU2Ci0gKgkyKSBTTUFMTF9SRVFVRVNUX1RIUkVTSE9MRCBpcyBldmVubHkgZGl2aXNpYmxlIGJ5IEFMSUdOTUVOVAorICogICAgICAxKSBBTElHTk1FTlQgPD0gU01BTExfUkVRVUVTVF9USFJFU0hPTEQgPD0gMjU2CisgKiAgICAgIDIpIFNNQUxMX1JFUVVFU1RfVEhSRVNIT0xEIGlzIGV2ZW5seSBkaXZpc2libGUgYnkgQUxJR05NRU5UCiAgKgogICogQWx0aG91Z2ggbm90IHJlcXVpcmVkLCBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlIGFuZCBzcGFjZSBlZmZpY2llbmN5LAogICogaXQgaXMgcmVjb21tZW5kZWQgdGhhdCBTTUFMTF9SRVFVRVNUX1RIUkVTSE9MRCBpcyBzZXQgdG8gYSBwb3dlciBvZiAyLgogICovCi0jZGVmaW5lIFNNQUxMX1JFUVVFU1RfVEhSRVNIT0xECTI1NgotI2RlZmluZSBOQl9TTUFMTF9TSVpFX0NMQVNTRVMJKFNNQUxMX1JFUVVFU1RfVEhSRVNIT0xEIC8gQUxJR05NRU5UKQorI2RlZmluZSBTTUFMTF9SRVFVRVNUX1RIUkVTSE9MRCAyNTYKKyNkZWZpbmUgTkJfU01BTExfU0laRV9DTEFTU0VTICAgKFNNQUxMX1JFUVVFU1RfVEhSRVNIT0xEIC8gQUxJR05NRU5UKQogCiAvKgogICogVGhlIHN5c3RlbSdzIFZNTSBwYWdlIHNpemUgY2FuIGJlIG9idGFpbmVkIG9uIG1vc3QgdW5pY2VzIHdpdGggYQpAQCAtMTQ0LDE1ICsxNDQsMTUgQEAKICAqIHZpb2xhdGlvbiBmYXVsdC4gIDRLIGlzIGFwcGFyZW50bHkgT0sgZm9yIGFsbCB0aGUgcGxhdGZvcm1zIHRoYXQgcHl0aG9uCiAgKiBjdXJyZW50bHkgdGFyZ2V0cy4KICAqLwotI2RlZmluZSBTWVNURU1fUEFHRV9TSVpFCSg0ICogMTAyNCkKLSNkZWZpbmUgU1lTVEVNX1BBR0VfU0laRV9NQVNLCShTWVNURU1fUEFHRV9TSVpFIC0gMSkKKyNkZWZpbmUgU1lTVEVNX1BBR0VfU0laRSAgICAgICAgKDQgKiAxMDI0KQorI2RlZmluZSBTWVNURU1fUEFHRV9TSVpFX01BU0sgICAoU1lTVEVNX1BBR0VfU0laRSAtIDEpCiAKIC8qCiAgKiBNYXhpbXVtIGFtb3VudCBvZiBtZW1vcnkgbWFuYWdlZCBieSB0aGUgYWxsb2NhdG9yIGZvciBzbWFsbCByZXF1ZXN0cy4KICAqLwogI2lmZGVmIFdJVEhfTUVNT1JZX0xJTUlUUwogI2lmbmRlZiBTTUFMTF9NRU1PUllfTElNSVQKLSNkZWZpbmUgU01BTExfTUVNT1JZX0xJTUlUCSg2NCAqIDEwMjQgKiAxMDI0KQkvKiA2NCBNQiAtLSBtb3JlPyAqLworI2RlZmluZSBTTUFMTF9NRU1PUllfTElNSVQgICAgICAoNjQgKiAxMDI0ICogMTAyNCkgICAgICAvKiA2NCBNQiAtLSBtb3JlPyAqLwogI2VuZGlmCiAjZW5kaWYKIApAQCAtMTY5LDE4ICsxNjksMTggQEAKICAqIHNvbWUgYWRkcmVzcyBzcGFjZSB3YXN0YWdlLCBidXQgdGhpcyBpcyB0aGUgbW9zdCBwb3J0YWJsZSB3YXkgdG8gcmVxdWVzdAogICogbWVtb3J5IGZyb20gdGhlIHN5c3RlbSBhY3Jvc3MgdmFyaW91cyBwbGF0Zm9ybXMuCiAgKi8KLSNkZWZpbmUgQVJFTkFfU0laRQkJKDI1NiA8PCAxMCkJLyogMjU2S0IgKi8KKyNkZWZpbmUgQVJFTkFfU0laRSAgICAgICAgICAgICAgKDI1NiA8PCAxMCkgICAgIC8qIDI1NktCICovCiAKICNpZmRlZiBXSVRIX01FTU9SWV9MSU1JVFMKLSNkZWZpbmUgTUFYX0FSRU5BUwkJKFNNQUxMX01FTU9SWV9MSU1JVCAvIEFSRU5BX1NJWkUpCisjZGVmaW5lIE1BWF9BUkVOQVMgICAgICAgICAgICAgIChTTUFMTF9NRU1PUllfTElNSVQgLyBBUkVOQV9TSVpFKQogI2VuZGlmCiAKIC8qCiAgKiBTaXplIG9mIHRoZSBwb29scyB1c2VkIGZvciBzbWFsbCBibG9ja3MuIFNob3VsZCBiZSBhIHBvd2VyIG9mIDIsCiAgKiBiZXR3ZWVuIDFLIGFuZCBTWVNURU1fUEFHRV9TSVpFLCB0aGF0IGlzOiAxaywgMmssIDRrLgogICovCi0jZGVmaW5lIFBPT0xfU0laRQkJU1lTVEVNX1BBR0VfU0laRQkvKiBtdXN0IGJlIDJeTiAqLwotI2RlZmluZSBQT09MX1NJWkVfTUFTSwkJU1lTVEVNX1BBR0VfU0laRV9NQVNLCisjZGVmaW5lIFBPT0xfU0laRSAgICAgICAgICAgICAgIFNZU1RFTV9QQUdFX1NJWkUgICAgICAgIC8qIG11c3QgYmUgMl5OICovCisjZGVmaW5lIFBPT0xfU0laRV9NQVNLICAgICAgICAgIFNZU1RFTV9QQUdFX1NJWkVfTUFTSwogCiAvKgogICogLS0gRW5kIG9mIHR1bmFibGUgc2V0dGluZ3Mgc2VjdGlvbiAtLQpAQCAtMjA2LDkyICsyMDYsOTIgQEAKIC8qCiAgKiBQeXRob24ncyB0aHJlYWRzIGFyZSBzZXJpYWxpemVkLCBzbyBvYmplY3QgbWFsbG9jIGxvY2tpbmcgaXMgZGlzYWJsZWQuCiAgKi8KLSNkZWZpbmUgU0lNUExFTE9DS19ERUNMKGxvY2spCS8qIHNpbXBsZSBsb2NrIGRlY2xhcmF0aW9uCQkqLwotI2RlZmluZSBTSU1QTEVMT0NLX0lOSVQobG9jaykJLyogYWxsb2NhdGUgKGlmIG5lZWRlZCkgYW5kIGluaXRpYWxpemUJKi8KLSNkZWZpbmUgU0lNUExFTE9DS19GSU5JKGxvY2spCS8qIGZyZWUvZGVzdHJveSBhbiBleGlzdGluZyBsb2NrIAkqLwotI2RlZmluZSBTSU1QTEVMT0NLX0xPQ0sobG9jaykJLyogYWNxdWlyZSByZWxlYXNlZCBsb2NrICovCi0jZGVmaW5lIFNJTVBMRUxPQ0tfVU5MT0NLKGxvY2spCS8qIHJlbGVhc2UgYWNxdWlyZWQgbG9jayAqLworI2RlZmluZSBTSU1QTEVMT0NLX0RFQ0wobG9jaykgICAvKiBzaW1wbGUgbG9jayBkZWNsYXJhdGlvbiAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU0lNUExFTE9DS19JTklUKGxvY2spICAgLyogYWxsb2NhdGUgKGlmIG5lZWRlZCkgYW5kIGluaXRpYWxpemUgICovCisjZGVmaW5lIFNJTVBMRUxPQ0tfRklOSShsb2NrKSAgIC8qIGZyZWUvZGVzdHJveSBhbiBleGlzdGluZyBsb2NrICAgICAgICAqLworI2RlZmluZSBTSU1QTEVMT0NLX0xPQ0sobG9jaykgICAvKiBhY3F1aXJlIHJlbGVhc2VkIGxvY2sgKi8KKyNkZWZpbmUgU0lNUExFTE9DS19VTkxPQ0sobG9jaykgLyogcmVsZWFzZSBhY3F1aXJlZCBsb2NrICovCiAKIC8qCiAgKiBCYXNpYyB0eXBlcwogICogSSBkb24ndCBjYXJlIGlmIHRoZXNlIGFyZSBkZWZpbmVkIGluIDxzeXMvdHlwZXMuaD4gb3IgZWxzZXdoZXJlLiBBeGlvbS4KICAqLwogI3VuZGVmICB1Y2hhcgotI2RlZmluZSB1Y2hhcgl1bnNpZ25lZCBjaGFyCS8qIGFzc3VtaW5nID09IDggYml0cyAgKi8KKyNkZWZpbmUgdWNoYXIgICB1bnNpZ25lZCBjaGFyICAgLyogYXNzdW1pbmcgPT0gOCBiaXRzICAqLwogCiAjdW5kZWYgIHVpbnQKLSNkZWZpbmUgdWludAl1bnNpZ25lZCBpbnQJLyogYXNzdW1pbmcgPj0gMTYgYml0cyAqLworI2RlZmluZSB1aW50ICAgIHVuc2lnbmVkIGludCAgICAvKiBhc3N1bWluZyA+PSAxNiBiaXRzICovCiAKICN1bmRlZiAgdWxvbmcKLSNkZWZpbmUgdWxvbmcJdW5zaWduZWQgbG9uZwkvKiBhc3N1bWluZyA+PSAzMiBiaXRzICovCisjZGVmaW5lIHVsb25nICAgdW5zaWduZWQgbG9uZyAgIC8qIGFzc3VtaW5nID49IDMyIGJpdHMgKi8KIAogI3VuZGVmIHVwdHIKLSNkZWZpbmUgdXB0cglQeV91aW50cHRyX3QKKyNkZWZpbmUgdXB0ciAgICBQeV91aW50cHRyX3QKIAogLyogV2hlbiB5b3Ugc2F5IG1lbW9yeSwgbXkgbWluZCByZWFzb25zIGluIHRlcm1zIG9mIChwb2ludGVycyB0bykgYmxvY2tzICovCiB0eXBlZGVmIHVjaGFyIGJsb2NrOwogCiAvKiBQb29sIGZvciBzbWFsbCBibG9ja3MuICovCiBzdHJ1Y3QgcG9vbF9oZWFkZXIgewotCXVuaW9uIHsgYmxvY2sgKl9wYWRkaW5nOwotCQl1aW50IGNvdW50OyB9IHJlZjsJLyogbnVtYmVyIG9mIGFsbG9jYXRlZCBibG9ja3MgICAgKi8KLQlibG9jayAqZnJlZWJsb2NrOwkJLyogcG9vbCdzIGZyZWUgbGlzdCBoZWFkICAgICAgICAgKi8KLQlzdHJ1Y3QgcG9vbF9oZWFkZXIgKm5leHRwb29sOwkvKiBuZXh0IHBvb2wgb2YgdGhpcyBzaXplIGNsYXNzICAqLwotCXN0cnVjdCBwb29sX2hlYWRlciAqcHJldnBvb2w7CS8qIHByZXZpb3VzIHBvb2wgICAgICAgIiIgICAgICAgICovCi0JdWludCBhcmVuYWluZGV4OwkJLyogaW5kZXggaW50byBhcmVuYXMgb2YgYmFzZSBhZHIgKi8KLQl1aW50IHN6aWR4OwkJCS8qIGJsb2NrIHNpemUgY2xhc3MgaW5kZXgJICovCi0JdWludCBuZXh0b2Zmc2V0OwkJLyogYnl0ZXMgdG8gdmlyZ2luIGJsb2NrCSAqLwotCXVpbnQgbWF4bmV4dG9mZnNldDsJCS8qIGxhcmdlc3QgdmFsaWQgbmV4dG9mZnNldAkgKi8KKyAgICB1bmlvbiB7IGJsb2NrICpfcGFkZGluZzsKKyAgICAgICAgdWludCBjb3VudDsgfSByZWY7ICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgYWxsb2NhdGVkIGJsb2NrcyAgICAqLworICAgIGJsb2NrICpmcmVlYmxvY2s7ICAgICAgICAgICAgICAgICAgIC8qIHBvb2wncyBmcmVlIGxpc3QgaGVhZCAgICAgICAgICovCisgICAgc3RydWN0IHBvb2xfaGVhZGVyICpuZXh0cG9vbDsgICAgICAgLyogbmV4dCBwb29sIG9mIHRoaXMgc2l6ZSBjbGFzcyAgKi8KKyAgICBzdHJ1Y3QgcG9vbF9oZWFkZXIgKnByZXZwb29sOyAgICAgICAvKiBwcmV2aW91cyBwb29sICAgICAgICIiICAgICAgICAqLworICAgIHVpbnQgYXJlbmFpbmRleDsgICAgICAgICAgICAgICAgICAgIC8qIGluZGV4IGludG8gYXJlbmFzIG9mIGJhc2UgYWRyICovCisgICAgdWludCBzemlkeDsgICAgICAgICAgICAgICAgICAgICAgICAgLyogYmxvY2sgc2l6ZSBjbGFzcyBpbmRleCAgICAgICAgKi8KKyAgICB1aW50IG5leHRvZmZzZXQ7ICAgICAgICAgICAgICAgICAgICAvKiBieXRlcyB0byB2aXJnaW4gYmxvY2sgICAgICAgICAqLworICAgIHVpbnQgbWF4bmV4dG9mZnNldDsgICAgICAgICAgICAgICAgIC8qIGxhcmdlc3QgdmFsaWQgbmV4dG9mZnNldCAgICAgICovCiB9OwogCiB0eXBlZGVmIHN0cnVjdCBwb29sX2hlYWRlciAqcG9vbHA7CiAKIC8qIFJlY29yZCBrZWVwaW5nIGZvciBhcmVuYXMuICovCiBzdHJ1Y3QgYXJlbmFfb2JqZWN0IHsKLQkvKiBUaGUgYWRkcmVzcyBvZiB0aGUgYXJlbmEsIGFzIHJldHVybmVkIGJ5IG1hbGxvYy4gIE5vdGUgdGhhdCAwCi0JICogd2lsbCBuZXZlciBiZSByZXR1cm5lZCBieSBhIHN1Y2Nlc3NmdWwgbWFsbG9jLCBhbmQgaXMgdXNlZAotCSAqIGhlcmUgdG8gbWFyayBhbiBhcmVuYV9vYmplY3QgdGhhdCBkb2Vzbid0IGNvcnJlc3BvbmQgdG8gYW4KLQkgKiBhbGxvY2F0ZWQgYXJlbmEuCi0JICovCi0JdXB0ciBhZGRyZXNzOworICAgIC8qIFRoZSBhZGRyZXNzIG9mIHRoZSBhcmVuYSwgYXMgcmV0dXJuZWQgYnkgbWFsbG9jLiAgTm90ZSB0aGF0IDAKKyAgICAgKiB3aWxsIG5ldmVyIGJlIHJldHVybmVkIGJ5IGEgc3VjY2Vzc2Z1bCBtYWxsb2MsIGFuZCBpcyB1c2VkCisgICAgICogaGVyZSB0byBtYXJrIGFuIGFyZW5hX29iamVjdCB0aGF0IGRvZXNuJ3QgY29ycmVzcG9uZCB0byBhbgorICAgICAqIGFsbG9jYXRlZCBhcmVuYS4KKyAgICAgKi8KKyAgICB1cHRyIGFkZHJlc3M7CiAKLQkvKiBQb29sLWFsaWduZWQgcG9pbnRlciB0byB0aGUgbmV4dCBwb29sIHRvIGJlIGNhcnZlZCBvZmYuICovCi0JYmxvY2sqIHBvb2xfYWRkcmVzczsKKyAgICAvKiBQb29sLWFsaWduZWQgcG9pbnRlciB0byB0aGUgbmV4dCBwb29sIHRvIGJlIGNhcnZlZCBvZmYuICovCisgICAgYmxvY2sqIHBvb2xfYWRkcmVzczsKIAotCS8qIFRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIHBvb2xzIGluIHRoZSBhcmVuYTogIGZyZWUgcG9vbHMgKyBuZXZlci0KLQkgKiBhbGxvY2F0ZWQgcG9vbHMuCi0JICovCi0JdWludCBuZnJlZXBvb2xzOworICAgIC8qIFRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIHBvb2xzIGluIHRoZSBhcmVuYTogIGZyZWUgcG9vbHMgKyBuZXZlci0KKyAgICAgKiBhbGxvY2F0ZWQgcG9vbHMuCisgICAgICovCisgICAgdWludCBuZnJlZXBvb2xzOwogCi0JLyogVGhlIHRvdGFsIG51bWJlciBvZiBwb29scyBpbiB0aGUgYXJlbmEsIHdoZXRoZXIgb3Igbm90IGF2YWlsYWJsZS4gKi8KLQl1aW50IG50b3RhbHBvb2xzOworICAgIC8qIFRoZSB0b3RhbCBudW1iZXIgb2YgcG9vbHMgaW4gdGhlIGFyZW5hLCB3aGV0aGVyIG9yIG5vdCBhdmFpbGFibGUuICovCisgICAgdWludCBudG90YWxwb29sczsKIAotCS8qIFNpbmdseS1saW5rZWQgbGlzdCBvZiBhdmFpbGFibGUgcG9vbHMuICovCi0Jc3RydWN0IHBvb2xfaGVhZGVyKiBmcmVlcG9vbHM7CisgICAgLyogU2luZ2x5LWxpbmtlZCBsaXN0IG9mIGF2YWlsYWJsZSBwb29scy4gKi8KKyAgICBzdHJ1Y3QgcG9vbF9oZWFkZXIqIGZyZWVwb29sczsKIAotCS8qIFdoZW5ldmVyIHRoaXMgYXJlbmFfb2JqZWN0IGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggYW4gYWxsb2NhdGVkCi0JICogYXJlbmEsIHRoZSBuZXh0YXJlbmEgbWVtYmVyIGlzIHVzZWQgdG8gbGluayBhbGwgdW5hc3NvY2lhdGVkCi0JICogYXJlbmFfb2JqZWN0cyBpbiB0aGUgc2luZ2x5LWxpbmtlZCBgdW51c2VkX2FyZW5hX29iamVjdHNgIGxpc3QuCi0JICogVGhlIHByZXZhcmVuYSBtZW1iZXIgaXMgdW51c2VkIGluIHRoaXMgY2FzZS4KLQkgKgotCSAqIFdoZW4gdGhpcyBhcmVuYV9vYmplY3QgaXMgYXNzb2NpYXRlZCB3aXRoIGFuIGFsbG9jYXRlZCBhcmVuYQotCSAqIHdpdGggYXQgbGVhc3Qgb25lIGF2YWlsYWJsZSBwb29sLCBib3RoIG1lbWJlcnMgYXJlIHVzZWQgaW4gdGhlCi0JICogZG91Ymx5LWxpbmtlZCBgdXNhYmxlX2FyZW5hc2AgbGlzdCwgd2hpY2ggaXMgbWFpbnRhaW5lZCBpbgotCSAqIGluY3JlYXNpbmcgb3JkZXIgb2YgYG5mcmVlcG9vbHNgIHZhbHVlcy4KLQkgKgotCSAqIEVsc2UgdGhpcyBhcmVuYV9vYmplY3QgaXMgYXNzb2NpYXRlZCB3aXRoIGFuIGFsbG9jYXRlZCBhcmVuYQotCSAqIGFsbCBvZiB3aG9zZSBwb29scyBhcmUgaW4gdXNlLiAgYG5leHRhcmVuYWAgYW5kIGBwcmV2YXJlbmFgCi0JICogYXJlIGJvdGggbWVhbmluZ2xlc3MgaW4gdGhpcyBjYXNlLgotCSAqLwotCXN0cnVjdCBhcmVuYV9vYmplY3QqIG5leHRhcmVuYTsKLQlzdHJ1Y3QgYXJlbmFfb2JqZWN0KiBwcmV2YXJlbmE7CisgICAgLyogV2hlbmV2ZXIgdGhpcyBhcmVuYV9vYmplY3QgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCBhbiBhbGxvY2F0ZWQKKyAgICAgKiBhcmVuYSwgdGhlIG5leHRhcmVuYSBtZW1iZXIgaXMgdXNlZCB0byBsaW5rIGFsbCB1bmFzc29jaWF0ZWQKKyAgICAgKiBhcmVuYV9vYmplY3RzIGluIHRoZSBzaW5nbHktbGlua2VkIGB1bnVzZWRfYXJlbmFfb2JqZWN0c2AgbGlzdC4KKyAgICAgKiBUaGUgcHJldmFyZW5hIG1lbWJlciBpcyB1bnVzZWQgaW4gdGhpcyBjYXNlLgorICAgICAqCisgICAgICogV2hlbiB0aGlzIGFyZW5hX29iamVjdCBpcyBhc3NvY2lhdGVkIHdpdGggYW4gYWxsb2NhdGVkIGFyZW5hCisgICAgICogd2l0aCBhdCBsZWFzdCBvbmUgYXZhaWxhYmxlIHBvb2wsIGJvdGggbWVtYmVycyBhcmUgdXNlZCBpbiB0aGUKKyAgICAgKiBkb3VibHktbGlua2VkIGB1c2FibGVfYXJlbmFzYCBsaXN0LCB3aGljaCBpcyBtYWludGFpbmVkIGluCisgICAgICogaW5jcmVhc2luZyBvcmRlciBvZiBgbmZyZWVwb29sc2AgdmFsdWVzLgorICAgICAqCisgICAgICogRWxzZSB0aGlzIGFyZW5hX29iamVjdCBpcyBhc3NvY2lhdGVkIHdpdGggYW4gYWxsb2NhdGVkIGFyZW5hCisgICAgICogYWxsIG9mIHdob3NlIHBvb2xzIGFyZSBpbiB1c2UuICBgbmV4dGFyZW5hYCBhbmQgYHByZXZhcmVuYWAKKyAgICAgKiBhcmUgYm90aCBtZWFuaW5nbGVzcyBpbiB0aGlzIGNhc2UuCisgICAgICovCisgICAgc3RydWN0IGFyZW5hX29iamVjdCogbmV4dGFyZW5hOworICAgIHN0cnVjdCBhcmVuYV9vYmplY3QqIHByZXZhcmVuYTsKIH07CiAKICN1bmRlZiAgUk9VTkRVUAotI2RlZmluZSBST1VORFVQKHgpCQkoKCh4KSArIEFMSUdOTUVOVF9NQVNLKSAmIH5BTElHTk1FTlRfTUFTSykKLSNkZWZpbmUgUE9PTF9PVkVSSEVBRAkJUk9VTkRVUChzaXplb2Yoc3RydWN0IHBvb2xfaGVhZGVyKSkKKyNkZWZpbmUgUk9VTkRVUCh4KSAgICAgICAgICAgICAgKCgoeCkgKyBBTElHTk1FTlRfTUFTSykgJiB+QUxJR05NRU5UX01BU0spCisjZGVmaW5lIFBPT0xfT1ZFUkhFQUQgICAgICAgICAgIFJPVU5EVVAoc2l6ZW9mKHN0cnVjdCBwb29sX2hlYWRlcikpCiAKLSNkZWZpbmUgRFVNTVlfU0laRV9JRFgJCTB4ZmZmZgkvKiBzaXplIGNsYXNzIG9mIG5ld2x5IGNhY2hlZCBwb29scyAqLworI2RlZmluZSBEVU1NWV9TSVpFX0lEWCAgICAgICAgICAweGZmZmYgIC8qIHNpemUgY2xhc3Mgb2YgbmV3bHkgY2FjaGVkIHBvb2xzICovCiAKIC8qIFJvdW5kIHBvaW50ZXIgUCBkb3duIHRvIHRoZSBjbG9zZXN0IHBvb2wtYWxpZ25lZCBhZGRyZXNzIDw9IFAsIGFzIGEgcG9vbHAgKi8KICNkZWZpbmUgUE9PTF9BRERSKFApICgocG9vbHApKCh1cHRyKShQKSAmIH4odXB0cilQT09MX1NJWkVfTUFTSykpCkBAIC0zMDUsMTAgKzMwNSwxMCBAQAogICogVGhpcyBtYWxsb2MgbG9jawogICovCiBTSU1QTEVMT0NLX0RFQ0woX21hbGxvY19sb2NrKQotI2RlZmluZSBMT0NLKCkJCVNJTVBMRUxPQ0tfTE9DSyhfbWFsbG9jX2xvY2spCi0jZGVmaW5lIFVOTE9DSygpCVNJTVBMRUxPQ0tfVU5MT0NLKF9tYWxsb2NfbG9jaykKLSNkZWZpbmUgTE9DS19JTklUKCkJU0lNUExFTE9DS19JTklUKF9tYWxsb2NfbG9jaykKLSNkZWZpbmUgTE9DS19GSU5JKCkJU0lNUExFTE9DS19GSU5JKF9tYWxsb2NfbG9jaykKKyNkZWZpbmUgTE9DSygpICAgICAgICAgIFNJTVBMRUxPQ0tfTE9DSyhfbWFsbG9jX2xvY2spCisjZGVmaW5lIFVOTE9DSygpICAgICAgICBTSU1QTEVMT0NLX1VOTE9DSyhfbWFsbG9jX2xvY2spCisjZGVmaW5lIExPQ0tfSU5JVCgpICAgICBTSU1QTEVMT0NLX0lOSVQoX21hbGxvY19sb2NrKQorI2RlZmluZSBMT0NLX0ZJTkkoKSAgICAgU0lNUExFTE9DS19GSU5JKF9tYWxsb2NfbG9jaykKIAogLyoKICAqIFBvb2wgdGFibGUgLS0gaGVhZGVkLCBjaXJjdWxhciwgZG91Ymx5LWxpbmtlZCBsaXN0cyBvZiBwYXJ0aWFsbHkgdXNlZCBwb29scy4KQEAgLTM4OCw5ICszODgsOSBAQAogY29tcGVuc2F0aW5nIGZvciB0aGF0IGEgcG9vbF9oZWFkZXIncyBuZXh0cG9vbCBhbmQgcHJldnBvb2wgbWVtYmVycwogaW1tZWRpYXRlbHkgZm9sbG93IGEgcG9vbF9oZWFkZXIncyBmaXJzdCB0d28gbWVtYmVyczoKIAotCXVuaW9uIHsgYmxvY2sgKl9wYWRkaW5nOwotCQl1aW50IGNvdW50OyB9IHJlZjsKLQlibG9jayAqZnJlZWJsb2NrOworICAgIHVuaW9uIHsgYmxvY2sgKl9wYWRkaW5nOworICAgICAgICB1aW50IGNvdW50OyB9IHJlZjsKKyAgICBibG9jayAqZnJlZWJsb2NrOwogCiBlYWNoIG9mIHdoaWNoIGNvbnN1bWUgc2l6ZW9mKGJsb2NrICopIGJ5dGVzLiAgU28gd2hhdCB1c2VkcG9vbHNbaStpXSByZWFsbHkKIGNvbnRhaW5zIGlzIGEgZnVkZ2VkLXVwIHBvaW50ZXIgcCBzdWNoIHRoYXQgKmlmKiBDIGJlbGlldmVzIGl0J3MgYSBwb29scApAQCAtNDA2LDI1ICs0MDYsMjUgQEAKIHRoZSBwcmV2cG9vbCBtZW1iZXIuCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCiAKLSNkZWZpbmUgUFRBKHgpCSgocG9vbHAgKSgodWNoYXIgKikmKHVzZWRwb29sc1syKih4KV0pIC0gMipzaXplb2YoYmxvY2sgKikpKQotI2RlZmluZSBQVCh4KQlQVEEoeCksIFBUQSh4KQorI2RlZmluZSBQVEEoeCkgICgocG9vbHAgKSgodWNoYXIgKikmKHVzZWRwb29sc1syKih4KV0pIC0gMipzaXplb2YoYmxvY2sgKikpKQorI2RlZmluZSBQVCh4KSAgIFBUQSh4KSwgUFRBKHgpCiAKIHN0YXRpYyBwb29scCB1c2VkcG9vbHNbMiAqICgoTkJfU01BTExfU0laRV9DTEFTU0VTICsgNykgLyA4KSAqIDhdID0gewotCVBUKDApLCBQVCgxKSwgUFQoMiksIFBUKDMpLCBQVCg0KSwgUFQoNSksIFBUKDYpLCBQVCg3KQorICAgIFBUKDApLCBQVCgxKSwgUFQoMiksIFBUKDMpLCBQVCg0KSwgUFQoNSksIFBUKDYpLCBQVCg3KQogI2lmIE5CX1NNQUxMX1NJWkVfQ0xBU1NFUyA+IDgKLQksIFBUKDgpLCBQVCg5KSwgUFQoMTApLCBQVCgxMSksIFBUKDEyKSwgUFQoMTMpLCBQVCgxNCksIFBUKDE1KQorICAgICwgUFQoOCksIFBUKDkpLCBQVCgxMCksIFBUKDExKSwgUFQoMTIpLCBQVCgxMyksIFBUKDE0KSwgUFQoMTUpCiAjaWYgTkJfU01BTExfU0laRV9DTEFTU0VTID4gMTYKLQksIFBUKDE2KSwgUFQoMTcpLCBQVCgxOCksIFBUKDE5KSwgUFQoMjApLCBQVCgyMSksIFBUKDIyKSwgUFQoMjMpCisgICAgLCBQVCgxNiksIFBUKDE3KSwgUFQoMTgpLCBQVCgxOSksIFBUKDIwKSwgUFQoMjEpLCBQVCgyMiksIFBUKDIzKQogI2lmIE5CX1NNQUxMX1NJWkVfQ0xBU1NFUyA+IDI0Ci0JLCBQVCgyNCksIFBUKDI1KSwgUFQoMjYpLCBQVCgyNyksIFBUKDI4KSwgUFQoMjkpLCBQVCgzMCksIFBUKDMxKQorICAgICwgUFQoMjQpLCBQVCgyNSksIFBUKDI2KSwgUFQoMjcpLCBQVCgyOCksIFBUKDI5KSwgUFQoMzApLCBQVCgzMSkKICNpZiBOQl9TTUFMTF9TSVpFX0NMQVNTRVMgPiAzMgotCSwgUFQoMzIpLCBQVCgzMyksIFBUKDM0KSwgUFQoMzUpLCBQVCgzNiksIFBUKDM3KSwgUFQoMzgpLCBQVCgzOSkKKyAgICAsIFBUKDMyKSwgUFQoMzMpLCBQVCgzNCksIFBUKDM1KSwgUFQoMzYpLCBQVCgzNyksIFBUKDM4KSwgUFQoMzkpCiAjaWYgTkJfU01BTExfU0laRV9DTEFTU0VTID4gNDAKLQksIFBUKDQwKSwgUFQoNDEpLCBQVCg0MiksIFBUKDQzKSwgUFQoNDQpLCBQVCg0NSksIFBUKDQ2KSwgUFQoNDcpCisgICAgLCBQVCg0MCksIFBUKDQxKSwgUFQoNDIpLCBQVCg0MyksIFBUKDQ0KSwgUFQoNDUpLCBQVCg0NiksIFBUKDQ3KQogI2lmIE5CX1NNQUxMX1NJWkVfQ0xBU1NFUyA+IDQ4Ci0JLCBQVCg0OCksIFBUKDQ5KSwgUFQoNTApLCBQVCg1MSksIFBUKDUyKSwgUFQoNTMpLCBQVCg1NCksIFBUKDU1KQorICAgICwgUFQoNDgpLCBQVCg0OSksIFBUKDUwKSwgUFQoNTEpLCBQVCg1MiksIFBUKDUzKSwgUFQoNTQpLCBQVCg1NSkKICNpZiBOQl9TTUFMTF9TSVpFX0NMQVNTRVMgPiA1NgotCSwgUFQoNTYpLCBQVCg1NyksIFBUKDU4KSwgUFQoNTkpLCBQVCg2MCksIFBUKDYxKSwgUFQoNjIpLCBQVCg2MykKKyAgICAsIFBUKDU2KSwgUFQoNTcpLCBQVCg1OCksIFBUKDU5KSwgUFQoNjApLCBQVCg2MSksIFBUKDYyKSwgUFQoNjMpCiAjZW5kaWYgLyogTkJfU01BTExfU0laRV9DTEFTU0VTID4gNTYgKi8KICNlbmRpZiAvKiBOQl9TTUFMTF9TSVpFX0NMQVNTRVMgPiA0OCAqLwogI2VuZGlmIC8qIE5CX1NNQUxMX1NJWkVfQ0xBU1NFUyA+IDQwICovCkBAIC01MDgsOTAgKzUwOCw5MCBAQAogc3RhdGljIHN0cnVjdCBhcmVuYV9vYmplY3QqCiBuZXdfYXJlbmEodm9pZCkKIHsKLQlzdHJ1Y3QgYXJlbmFfb2JqZWN0KiBhcmVuYW9iajsKLQl1aW50IGV4Y2VzczsJLyogbnVtYmVyIG9mIGJ5dGVzIGFib3ZlIHBvb2wgYWxpZ25tZW50ICovCisgICAgc3RydWN0IGFyZW5hX29iamVjdCogYXJlbmFvYmo7CisgICAgdWludCBleGNlc3M7ICAgICAgICAvKiBudW1iZXIgb2YgYnl0ZXMgYWJvdmUgcG9vbCBhbGlnbm1lbnQgKi8KIAogI2lmZGVmIFBZTUFMTE9DX0RFQlVHCi0JaWYgKFB5X0dFVEVOVigiUFlUSE9OTUFMTE9DU1RBVFMiKSkKLQkJX1B5T2JqZWN0X0RlYnVnTWFsbG9jU3RhdHMoKTsKKyAgICBpZiAoUHlfR0VURU5WKCJQWVRIT05NQUxMT0NTVEFUUyIpKQorICAgICAgICBfUHlPYmplY3RfRGVidWdNYWxsb2NTdGF0cygpOwogI2VuZGlmCi0JaWYgKHVudXNlZF9hcmVuYV9vYmplY3RzID09IE5VTEwpIHsKLQkJdWludCBpOwotCQl1aW50IG51bWFyZW5hczsKLQkJc2l6ZV90IG5ieXRlczsKKyAgICBpZiAodW51c2VkX2FyZW5hX29iamVjdHMgPT0gTlVMTCkgeworICAgICAgICB1aW50IGk7CisgICAgICAgIHVpbnQgbnVtYXJlbmFzOworICAgICAgICBzaXplX3QgbmJ5dGVzOwogCi0JCS8qIERvdWJsZSB0aGUgbnVtYmVyIG9mIGFyZW5hIG9iamVjdHMgb24gZWFjaCBhbGxvY2F0aW9uLgotCQkgKiBOb3RlIHRoYXQgaXQncyBwb3NzaWJsZSBmb3IgYG51bWFyZW5hc2AgdG8gb3ZlcmZsb3cuCi0JCSAqLwotCQludW1hcmVuYXMgPSBtYXhhcmVuYXMgPyBtYXhhcmVuYXMgPDwgMSA6IElOSVRJQUxfQVJFTkFfT0JKRUNUUzsKLQkJaWYgKG51bWFyZW5hcyA8PSBtYXhhcmVuYXMpCi0JCQlyZXR1cm4gTlVMTDsJLyogb3ZlcmZsb3cgKi8KKyAgICAgICAgLyogRG91YmxlIHRoZSBudW1iZXIgb2YgYXJlbmEgb2JqZWN0cyBvbiBlYWNoIGFsbG9jYXRpb24uCisgICAgICAgICAqIE5vdGUgdGhhdCBpdCdzIHBvc3NpYmxlIGZvciBgbnVtYXJlbmFzYCB0byBvdmVyZmxvdy4KKyAgICAgICAgICovCisgICAgICAgIG51bWFyZW5hcyA9IG1heGFyZW5hcyA/IG1heGFyZW5hcyA8PCAxIDogSU5JVElBTF9BUkVOQV9PQkpFQ1RTOworICAgICAgICBpZiAobnVtYXJlbmFzIDw9IG1heGFyZW5hcykKKyAgICAgICAgICAgIHJldHVybiBOVUxMOyAgICAgICAgICAgICAgICAvKiBvdmVyZmxvdyAqLwogI2lmIFNJWkVPRl9TSVpFX1QgPD0gU0laRU9GX0lOVAotCQlpZiAobnVtYXJlbmFzID4gUFlfU0laRV9NQVggLyBzaXplb2YoKmFyZW5hcykpCi0JCQlyZXR1cm4gTlVMTDsJLyogb3ZlcmZsb3cgKi8KKyAgICAgICAgaWYgKG51bWFyZW5hcyA+IFBZX1NJWkVfTUFYIC8gc2l6ZW9mKCphcmVuYXMpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7ICAgICAgICAgICAgICAgIC8qIG92ZXJmbG93ICovCiAjZW5kaWYKLQkJbmJ5dGVzID0gbnVtYXJlbmFzICogc2l6ZW9mKCphcmVuYXMpOwotCQlhcmVuYW9iaiA9IChzdHJ1Y3QgYXJlbmFfb2JqZWN0ICopcmVhbGxvYyhhcmVuYXMsIG5ieXRlcyk7Ci0JCWlmIChhcmVuYW9iaiA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWFyZW5hcyA9IGFyZW5hb2JqOworICAgICAgICBuYnl0ZXMgPSBudW1hcmVuYXMgKiBzaXplb2YoKmFyZW5hcyk7CisgICAgICAgIGFyZW5hb2JqID0gKHN0cnVjdCBhcmVuYV9vYmplY3QgKilyZWFsbG9jKGFyZW5hcywgbmJ5dGVzKTsKKyAgICAgICAgaWYgKGFyZW5hb2JqID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgYXJlbmFzID0gYXJlbmFvYmo7CiAKLQkJLyogV2UgbWlnaHQgbmVlZCB0byBmaXggcG9pbnRlcnMgdGhhdCB3ZXJlIGNvcGllZC4gIEhvd2V2ZXIsCi0JCSAqIG5ld19hcmVuYSBvbmx5IGdldHMgY2FsbGVkIHdoZW4gYWxsIHRoZSBwYWdlcyBpbiB0aGUKLQkJICogcHJldmlvdXMgYXJlbmFzIGFyZSBmdWxsLiAgVGh1cywgdGhlcmUgYXJlICpubyogcG9pbnRlcnMKLQkJICogaW50byB0aGUgb2xkIGFycmF5LiBUaHVzLCB3ZSBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0Ci0JCSAqIGludmFsaWQgcG9pbnRlcnMuICBKdXN0IHRvIGJlIHN1cmUsIHNvbWUgYXNzZXJ0czoKLQkJICovCi0JCWFzc2VydCh1c2FibGVfYXJlbmFzID09IE5VTEwpOwotCQlhc3NlcnQodW51c2VkX2FyZW5hX29iamVjdHMgPT0gTlVMTCk7CisgICAgICAgIC8qIFdlIG1pZ2h0IG5lZWQgdG8gZml4IHBvaW50ZXJzIHRoYXQgd2VyZSBjb3BpZWQuICBIb3dldmVyLAorICAgICAgICAgKiBuZXdfYXJlbmEgb25seSBnZXRzIGNhbGxlZCB3aGVuIGFsbCB0aGUgcGFnZXMgaW4gdGhlCisgICAgICAgICAqIHByZXZpb3VzIGFyZW5hcyBhcmUgZnVsbC4gIFRodXMsIHRoZXJlIGFyZSAqbm8qIHBvaW50ZXJzCisgICAgICAgICAqIGludG8gdGhlIG9sZCBhcnJheS4gVGh1cywgd2UgZG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dAorICAgICAgICAgKiBpbnZhbGlkIHBvaW50ZXJzLiAgSnVzdCB0byBiZSBzdXJlLCBzb21lIGFzc2VydHM6CisgICAgICAgICAqLworICAgICAgICBhc3NlcnQodXNhYmxlX2FyZW5hcyA9PSBOVUxMKTsKKyAgICAgICAgYXNzZXJ0KHVudXNlZF9hcmVuYV9vYmplY3RzID09IE5VTEwpOwogCi0JCS8qIFB1dCB0aGUgbmV3IGFyZW5hcyBvbiB0aGUgdW51c2VkX2FyZW5hX29iamVjdHMgbGlzdC4gKi8KLQkJZm9yIChpID0gbWF4YXJlbmFzOyBpIDwgbnVtYXJlbmFzOyArK2kpIHsKLQkJCWFyZW5hc1tpXS5hZGRyZXNzID0gMDsJLyogbWFyayBhcyB1bmFzc29jaWF0ZWQgKi8KLQkJCWFyZW5hc1tpXS5uZXh0YXJlbmEgPSBpIDwgbnVtYXJlbmFzIC0gMSA/Ci0JCQkJCSAgICAgICAmYXJlbmFzW2krMV0gOiBOVUxMOwotCQl9CisgICAgICAgIC8qIFB1dCB0aGUgbmV3IGFyZW5hcyBvbiB0aGUgdW51c2VkX2FyZW5hX29iamVjdHMgbGlzdC4gKi8KKyAgICAgICAgZm9yIChpID0gbWF4YXJlbmFzOyBpIDwgbnVtYXJlbmFzOyArK2kpIHsKKyAgICAgICAgICAgIGFyZW5hc1tpXS5hZGRyZXNzID0gMDsgICAgICAgICAgICAgIC8qIG1hcmsgYXMgdW5hc3NvY2lhdGVkICovCisgICAgICAgICAgICBhcmVuYXNbaV0ubmV4dGFyZW5hID0gaSA8IG51bWFyZW5hcyAtIDEgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXJlbmFzW2krMV0gOiBOVUxMOworICAgICAgICB9CiAKLQkJLyogVXBkYXRlIGdsb2JhbHMuICovCi0JCXVudXNlZF9hcmVuYV9vYmplY3RzID0gJmFyZW5hc1ttYXhhcmVuYXNdOwotCQltYXhhcmVuYXMgPSBudW1hcmVuYXM7Ci0JfQorICAgICAgICAvKiBVcGRhdGUgZ2xvYmFscy4gKi8KKyAgICAgICAgdW51c2VkX2FyZW5hX29iamVjdHMgPSAmYXJlbmFzW21heGFyZW5hc107CisgICAgICAgIG1heGFyZW5hcyA9IG51bWFyZW5hczsKKyAgICB9CiAKLQkvKiBUYWtlIHRoZSBuZXh0IGF2YWlsYWJsZSBhcmVuYSBvYmplY3Qgb2ZmIHRoZSBoZWFkIG9mIHRoZSBsaXN0LiAqLwotCWFzc2VydCh1bnVzZWRfYXJlbmFfb2JqZWN0cyAhPSBOVUxMKTsKLQlhcmVuYW9iaiA9IHVudXNlZF9hcmVuYV9vYmplY3RzOwotCXVudXNlZF9hcmVuYV9vYmplY3RzID0gYXJlbmFvYmotPm5leHRhcmVuYTsKLQlhc3NlcnQoYXJlbmFvYmotPmFkZHJlc3MgPT0gMCk7Ci0JYXJlbmFvYmotPmFkZHJlc3MgPSAodXB0ciltYWxsb2MoQVJFTkFfU0laRSk7Ci0JaWYgKGFyZW5hb2JqLT5hZGRyZXNzID09IDApIHsKLQkJLyogVGhlIGFsbG9jYXRpb24gZmFpbGVkOiByZXR1cm4gTlVMTCBhZnRlciBwdXR0aW5nIHRoZQotCQkgKiBhcmVuYW9iaiBiYWNrLgotCQkgKi8KLQkJYXJlbmFvYmotPm5leHRhcmVuYSA9IHVudXNlZF9hcmVuYV9vYmplY3RzOwotCQl1bnVzZWRfYXJlbmFfb2JqZWN0cyA9IGFyZW5hb2JqOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgLyogVGFrZSB0aGUgbmV4dCBhdmFpbGFibGUgYXJlbmEgb2JqZWN0IG9mZiB0aGUgaGVhZCBvZiB0aGUgbGlzdC4gKi8KKyAgICBhc3NlcnQodW51c2VkX2FyZW5hX29iamVjdHMgIT0gTlVMTCk7CisgICAgYXJlbmFvYmogPSB1bnVzZWRfYXJlbmFfb2JqZWN0czsKKyAgICB1bnVzZWRfYXJlbmFfb2JqZWN0cyA9IGFyZW5hb2JqLT5uZXh0YXJlbmE7CisgICAgYXNzZXJ0KGFyZW5hb2JqLT5hZGRyZXNzID09IDApOworICAgIGFyZW5hb2JqLT5hZGRyZXNzID0gKHVwdHIpbWFsbG9jKEFSRU5BX1NJWkUpOworICAgIGlmIChhcmVuYW9iai0+YWRkcmVzcyA9PSAwKSB7CisgICAgICAgIC8qIFRoZSBhbGxvY2F0aW9uIGZhaWxlZDogcmV0dXJuIE5VTEwgYWZ0ZXIgcHV0dGluZyB0aGUKKyAgICAgICAgICogYXJlbmFvYmogYmFjay4KKyAgICAgICAgICovCisgICAgICAgIGFyZW5hb2JqLT5uZXh0YXJlbmEgPSB1bnVzZWRfYXJlbmFfb2JqZWN0czsKKyAgICAgICAgdW51c2VkX2FyZW5hX29iamVjdHMgPSBhcmVuYW9iajsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JKytuYXJlbmFzX2N1cnJlbnRseV9hbGxvY2F0ZWQ7CisgICAgKytuYXJlbmFzX2N1cnJlbnRseV9hbGxvY2F0ZWQ7CiAjaWZkZWYgUFlNQUxMT0NfREVCVUcKLQkrK250aW1lc19hcmVuYV9hbGxvY2F0ZWQ7Ci0JaWYgKG5hcmVuYXNfY3VycmVudGx5X2FsbG9jYXRlZCA+IG5hcmVuYXNfaGlnaHdhdGVyKQotCQluYXJlbmFzX2hpZ2h3YXRlciA9IG5hcmVuYXNfY3VycmVudGx5X2FsbG9jYXRlZDsKKyAgICArK250aW1lc19hcmVuYV9hbGxvY2F0ZWQ7CisgICAgaWYgKG5hcmVuYXNfY3VycmVudGx5X2FsbG9jYXRlZCA+IG5hcmVuYXNfaGlnaHdhdGVyKQorICAgICAgICBuYXJlbmFzX2hpZ2h3YXRlciA9IG5hcmVuYXNfY3VycmVudGx5X2FsbG9jYXRlZDsKICNlbmRpZgotCWFyZW5hb2JqLT5mcmVlcG9vbHMgPSBOVUxMOwotCS8qIHBvb2xfYWRkcmVzcyA8LSBmaXJzdCBwb29sLWFsaWduZWQgYWRkcmVzcyBpbiB0aGUgYXJlbmEKLQkgICBuZnJlZXBvb2xzIDwtIG51bWJlciBvZiB3aG9sZSBwb29scyB0aGF0IGZpdCBhZnRlciBhbGlnbm1lbnQgKi8KLQlhcmVuYW9iai0+cG9vbF9hZGRyZXNzID0gKGJsb2NrKilhcmVuYW9iai0+YWRkcmVzczsKLQlhcmVuYW9iai0+bmZyZWVwb29scyA9IEFSRU5BX1NJWkUgLyBQT09MX1NJWkU7Ci0JYXNzZXJ0KFBPT0xfU0laRSAqIGFyZW5hb2JqLT5uZnJlZXBvb2xzID09IEFSRU5BX1NJWkUpOwotCWV4Y2VzcyA9ICh1aW50KShhcmVuYW9iai0+YWRkcmVzcyAmIFBPT0xfU0laRV9NQVNLKTsKLQlpZiAoZXhjZXNzICE9IDApIHsKLQkJLS1hcmVuYW9iai0+bmZyZWVwb29sczsKLQkJYXJlbmFvYmotPnBvb2xfYWRkcmVzcyArPSBQT09MX1NJWkUgLSBleGNlc3M7Ci0JfQotCWFyZW5hb2JqLT5udG90YWxwb29scyA9IGFyZW5hb2JqLT5uZnJlZXBvb2xzOworICAgIGFyZW5hb2JqLT5mcmVlcG9vbHMgPSBOVUxMOworICAgIC8qIHBvb2xfYWRkcmVzcyA8LSBmaXJzdCBwb29sLWFsaWduZWQgYWRkcmVzcyBpbiB0aGUgYXJlbmEKKyAgICAgICBuZnJlZXBvb2xzIDwtIG51bWJlciBvZiB3aG9sZSBwb29scyB0aGF0IGZpdCBhZnRlciBhbGlnbm1lbnQgKi8KKyAgICBhcmVuYW9iai0+cG9vbF9hZGRyZXNzID0gKGJsb2NrKilhcmVuYW9iai0+YWRkcmVzczsKKyAgICBhcmVuYW9iai0+bmZyZWVwb29scyA9IEFSRU5BX1NJWkUgLyBQT09MX1NJWkU7CisgICAgYXNzZXJ0KFBPT0xfU0laRSAqIGFyZW5hb2JqLT5uZnJlZXBvb2xzID09IEFSRU5BX1NJWkUpOworICAgIGV4Y2VzcyA9ICh1aW50KShhcmVuYW9iai0+YWRkcmVzcyAmIFBPT0xfU0laRV9NQVNLKTsKKyAgICBpZiAoZXhjZXNzICE9IDApIHsKKyAgICAgICAgLS1hcmVuYW9iai0+bmZyZWVwb29sczsKKyAgICAgICAgYXJlbmFvYmotPnBvb2xfYWRkcmVzcyArPSBQT09MX1NJWkUgLSBleGNlc3M7CisgICAgfQorICAgIGFyZW5hb2JqLT5udG90YWxwb29scyA9IGFyZW5hb2JqLT5uZnJlZXBvb2xzOwogCi0JcmV0dXJuIGFyZW5hb2JqOworICAgIHJldHVybiBhcmVuYW9iajsKIH0KIAogLyoKQEAgLTYwNywxMSArNjA3LDExIEBACiBUcmlja3k6ICBMZXQgQiBiZSB0aGUgYXJlbmEgYmFzZSBhZGRyZXNzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcG9vbCwgQiA9CiBhcmVuYXNbKFBPT0wpLT5hcmVuYWluZGV4XS5hZGRyZXNzLiAgVGhlbiBQIGJlbG9uZ3MgdG8gdGhlIGFyZW5hIGlmIGFuZCBvbmx5IGlmCiAKLQlCIDw9IFAgPCBCICsgQVJFTkFfU0laRQorICAgIEIgPD0gUCA8IEIgKyBBUkVOQV9TSVpFCiAKIFN1YnRyYWN0aW5nIEIgdGhyb3VnaG91dCwgdGhpcyBpcyB0cnVlIGlmZgogCi0JMCA8PSBQLUIgPCBBUkVOQV9TSVpFCisgICAgMCA8PSBQLUIgPCBBUkVOQV9TSVpFCiAKIEJ5IHVzaW5nIHVuc2lnbmVkIGFyaXRobWV0aWMsIHRoZSAiMCA8PSIgaGFsZiBvZiB0aGUgdGVzdCBjYW4gYmUgc2tpcHBlZC4KIApAQCAtNjQ1LDcgKzY0NSw3IEBACiBhcmVuYV9vYmplY3QgKG9uZSBub3QgY3VycmVudGx5IGFzc29jaWF0ZWQgd2l0aCBhbiBhbGxvY2F0ZWQgYXJlbmEpLAogQU8uYWRkcmVzcyBpcyAwLCBhbmQgdGhlIHNlY29uZCB0ZXN0IGluIHRoZSBtYWNybyByZWR1Y2VzIHRvOgogCi0JUCA8IEFSRU5BX1NJWkUKKyAgICBQIDwgQVJFTkFfU0laRQogCiBJZiBQID49IEFSRU5BX1NJWkUgKGV4dHJlbWVseSBsaWtlbHkpLCB0aGUgbWFjcm8gYWdhaW4gY29ycmVjdGx5IGNvbmNsdWRlcwogdGhhdCBQIGlzIG5vdCBjb250cm9sbGVkIGJ5IG9ibWFsbG9jLiAgSG93ZXZlciwgaWYgUCA8IEFSRU5BX1NJWkUsIHRoaXMgcGFydApAQCAtNjY4LDEwICs2NjgsMTAgQEAKIG9ibWFsbG9jIGNvbnRyb2xzLiAgU2luY2UgdGhpcyB0ZXN0IGlzIG5lZWRlZCBhdCBldmVyeSBlbnRyeSBwb2ludCwgaXQncwogZXh0cmVtZWx5IGRlc2lyYWJsZSB0aGF0IGl0IGJlIHRoaXMgZmFzdC4KICovCi0jZGVmaW5lIFB5X0FERFJFU1NfSU5fUkFOR0UoUCwgUE9PTCkJCQlcCi0JKChQT09MKS0+YXJlbmFpbmRleCA8IG1heGFyZW5hcyAmJgkJXAotCSAodXB0cikoUCkgLSBhcmVuYXNbKFBPT0wpLT5hcmVuYWluZGV4XS5hZGRyZXNzIDwgKHVwdHIpQVJFTkFfU0laRSAmJiBcCi0JIGFyZW5hc1soUE9PTCktPmFyZW5haW5kZXhdLmFkZHJlc3MgIT0gMCkKKyNkZWZpbmUgUHlfQUREUkVTU19JTl9SQU5HRShQLCBQT09MKSAgICAgICAgICAgICAgICAgICAgXAorICAgICgoUE9PTCktPmFyZW5haW5kZXggPCBtYXhhcmVuYXMgJiYgICAgICAgICAgICAgICAgICBcCisgICAgICh1cHRyKShQKSAtIGFyZW5hc1soUE9PTCktPmFyZW5haW5kZXhdLmFkZHJlc3MgPCAodXB0cilBUkVOQV9TSVpFICYmIFwKKyAgICAgYXJlbmFzWyhQT09MKS0+YXJlbmFpbmRleF0uYWRkcmVzcyAhPSAwKQogCiAKIC8qIFRoaXMgaXMgb25seSB1c2VmdWwgd2hlbiBydW5uaW5nIG1lbW9yeSBkZWJ1Z2dlcnMgc3VjaCBhcwpAQCAtNjk0LDcgKzY5NCw3IEBACiAjdW5kZWYgUHlfQUREUkVTU19JTl9SQU5HRQogCiAjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgKChfX0dOVUNfXyA9PSAzKSAmJiAoX19HTlVDX01JTk9SX18gPj0gMSkgfHwgXAotCQkJICAoX19HTlVDX18gPj0gNCkpCisgICAgICAgICAgICAgIChfX0dOVUNfXyA+PSA0KSkKICNkZWZpbmUgUHlfTk9fSU5MSU5FIF9fYXR0cmlidXRlX18oKF9fbm9pbmxpbmVfXykpCiAjZWxzZQogI2RlZmluZSBQeV9OT19JTkxJTkUKQEAgLTcyMywxOTQgKzcyMywxOTQgQEAKIHZvaWQgKgogUHlPYmplY3RfTWFsbG9jKHNpemVfdCBuYnl0ZXMpCiB7Ci0JYmxvY2sgKmJwOwotCXBvb2xwIHBvb2w7Ci0JcG9vbHAgbmV4dDsKLQl1aW50IHNpemU7CisgICAgYmxvY2sgKmJwOworICAgIHBvb2xwIHBvb2w7CisgICAgcG9vbHAgbmV4dDsKKyAgICB1aW50IHNpemU7CiAKLQkvKgotCSAqIExpbWl0IG91cnNlbHZlcyB0byBQWV9TU0laRV9UX01BWCBieXRlcyB0byBwcmV2ZW50IHNlY3VyaXR5IGhvbGVzLgotCSAqIE1vc3QgcHl0aG9uIGludGVybmFscyBibGluZGx5IHVzZSBhIHNpZ25lZCBQeV9zc2l6ZV90IHRvIHRyYWNrCi0JICogdGhpbmdzIHdpdGhvdXQgY2hlY2tpbmcgZm9yIG92ZXJmbG93cyBvciBuZWdhdGl2ZXMuCi0JICogQXMgc2l6ZV90IGlzIHVuc2lnbmVkLCBjaGVja2luZyBmb3IgbmJ5dGVzIDwgMCBpcyBub3QgcmVxdWlyZWQuCi0JICovCi0JaWYgKG5ieXRlcyA+IFBZX1NTSVpFX1RfTUFYKQotCQlyZXR1cm4gTlVMTDsKKyAgICAvKgorICAgICAqIExpbWl0IG91cnNlbHZlcyB0byBQWV9TU0laRV9UX01BWCBieXRlcyB0byBwcmV2ZW50IHNlY3VyaXR5IGhvbGVzLgorICAgICAqIE1vc3QgcHl0aG9uIGludGVybmFscyBibGluZGx5IHVzZSBhIHNpZ25lZCBQeV9zc2l6ZV90IHRvIHRyYWNrCisgICAgICogdGhpbmdzIHdpdGhvdXQgY2hlY2tpbmcgZm9yIG92ZXJmbG93cyBvciBuZWdhdGl2ZXMuCisgICAgICogQXMgc2l6ZV90IGlzIHVuc2lnbmVkLCBjaGVja2luZyBmb3IgbmJ5dGVzIDwgMCBpcyBub3QgcmVxdWlyZWQuCisgICAgICovCisgICAgaWYgKG5ieXRlcyA+IFBZX1NTSVpFX1RfTUFYKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCS8qCi0JICogVGhpcyBpbXBsaWNpdGx5IHJlZGlyZWN0cyBtYWxsb2MoMCkuCi0JICovCi0JaWYgKChuYnl0ZXMgLSAxKSA8IFNNQUxMX1JFUVVFU1RfVEhSRVNIT0xEKSB7Ci0JCUxPQ0soKTsKLQkJLyoKLQkJICogTW9zdCBmcmVxdWVudCBwYXRocyBmaXJzdAotCQkgKi8KLQkJc2l6ZSA9ICh1aW50KShuYnl0ZXMgLSAxKSA+PiBBTElHTk1FTlRfU0hJRlQ7Ci0JCXBvb2wgPSB1c2VkcG9vbHNbc2l6ZSArIHNpemVdOwotCQlpZiAocG9vbCAhPSBwb29sLT5uZXh0cG9vbCkgewotCQkJLyoKLQkJCSAqIFRoZXJlIGlzIGEgdXNlZCBwb29sIGZvciB0aGlzIHNpemUgY2xhc3MuCi0JCQkgKiBQaWNrIHVwIHRoZSBoZWFkIGJsb2NrIG9mIGl0cyBmcmVlIGxpc3QuCi0JCQkgKi8KLQkJCSsrcG9vbC0+cmVmLmNvdW50OwotCQkJYnAgPSBwb29sLT5mcmVlYmxvY2s7Ci0JCQlhc3NlcnQoYnAgIT0gTlVMTCk7Ci0JCQlpZiAoKHBvb2wtPmZyZWVibG9jayA9ICooYmxvY2sgKiopYnApICE9IE5VTEwpIHsKLQkJCQlVTkxPQ0soKTsKLQkJCQlyZXR1cm4gKHZvaWQgKilicDsKLQkJCX0KLQkJCS8qCi0JCQkgKiBSZWFjaGVkIHRoZSBlbmQgb2YgdGhlIGZyZWUgbGlzdCwgdHJ5IHRvIGV4dGVuZCBpdC4KLQkJCSAqLwotCQkJaWYgKHBvb2wtPm5leHRvZmZzZXQgPD0gcG9vbC0+bWF4bmV4dG9mZnNldCkgewotCQkJCS8qIFRoZXJlIGlzIHJvb20gZm9yIGFub3RoZXIgYmxvY2suICovCi0JCQkJcG9vbC0+ZnJlZWJsb2NrID0gKGJsb2NrKilwb29sICsKLQkJCQkJCSAgcG9vbC0+bmV4dG9mZnNldDsKLQkJCQlwb29sLT5uZXh0b2Zmc2V0ICs9IElOREVYMlNJWkUoc2l6ZSk7Ci0JCQkJKihibG9jayAqKikocG9vbC0+ZnJlZWJsb2NrKSA9IE5VTEw7Ci0JCQkJVU5MT0NLKCk7Ci0JCQkJcmV0dXJuICh2b2lkICopYnA7Ci0JCQl9Ci0JCQkvKiBQb29sIGlzIGZ1bGwsIHVubGluayBmcm9tIHVzZWQgcG9vbHMuICovCi0JCQluZXh0ID0gcG9vbC0+bmV4dHBvb2w7Ci0JCQlwb29sID0gcG9vbC0+cHJldnBvb2w7Ci0JCQluZXh0LT5wcmV2cG9vbCA9IHBvb2w7Ci0JCQlwb29sLT5uZXh0cG9vbCA9IG5leHQ7Ci0JCQlVTkxPQ0soKTsKLQkJCXJldHVybiAodm9pZCAqKWJwOwotCQl9CisgICAgLyoKKyAgICAgKiBUaGlzIGltcGxpY2l0bHkgcmVkaXJlY3RzIG1hbGxvYygwKS4KKyAgICAgKi8KKyAgICBpZiAoKG5ieXRlcyAtIDEpIDwgU01BTExfUkVRVUVTVF9USFJFU0hPTEQpIHsKKyAgICAgICAgTE9DSygpOworICAgICAgICAvKgorICAgICAgICAgKiBNb3N0IGZyZXF1ZW50IHBhdGhzIGZpcnN0CisgICAgICAgICAqLworICAgICAgICBzaXplID0gKHVpbnQpKG5ieXRlcyAtIDEpID4+IEFMSUdOTUVOVF9TSElGVDsKKyAgICAgICAgcG9vbCA9IHVzZWRwb29sc1tzaXplICsgc2l6ZV07CisgICAgICAgIGlmIChwb29sICE9IHBvb2wtPm5leHRwb29sKSB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogVGhlcmUgaXMgYSB1c2VkIHBvb2wgZm9yIHRoaXMgc2l6ZSBjbGFzcy4KKyAgICAgICAgICAgICAqIFBpY2sgdXAgdGhlIGhlYWQgYmxvY2sgb2YgaXRzIGZyZWUgbGlzdC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgKytwb29sLT5yZWYuY291bnQ7CisgICAgICAgICAgICBicCA9IHBvb2wtPmZyZWVibG9jazsKKyAgICAgICAgICAgIGFzc2VydChicCAhPSBOVUxMKTsKKyAgICAgICAgICAgIGlmICgocG9vbC0+ZnJlZWJsb2NrID0gKihibG9jayAqKilicCkgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFVOTE9DSygpOworICAgICAgICAgICAgICAgIHJldHVybiAodm9pZCAqKWJwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgZnJlZSBsaXN0LCB0cnkgdG8gZXh0ZW5kIGl0LgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAocG9vbC0+bmV4dG9mZnNldCA8PSBwb29sLT5tYXhuZXh0b2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgLyogVGhlcmUgaXMgcm9vbSBmb3IgYW5vdGhlciBibG9jay4gKi8KKyAgICAgICAgICAgICAgICBwb29sLT5mcmVlYmxvY2sgPSAoYmxvY2sqKXBvb2wgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvb2wtPm5leHRvZmZzZXQ7CisgICAgICAgICAgICAgICAgcG9vbC0+bmV4dG9mZnNldCArPSBJTkRFWDJTSVpFKHNpemUpOworICAgICAgICAgICAgICAgICooYmxvY2sgKiopKHBvb2wtPmZyZWVibG9jaykgPSBOVUxMOworICAgICAgICAgICAgICAgIFVOTE9DSygpOworICAgICAgICAgICAgICAgIHJldHVybiAodm9pZCAqKWJwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogUG9vbCBpcyBmdWxsLCB1bmxpbmsgZnJvbSB1c2VkIHBvb2xzLiAqLworICAgICAgICAgICAgbmV4dCA9IHBvb2wtPm5leHRwb29sOworICAgICAgICAgICAgcG9vbCA9IHBvb2wtPnByZXZwb29sOworICAgICAgICAgICAgbmV4dC0+cHJldnBvb2wgPSBwb29sOworICAgICAgICAgICAgcG9vbC0+bmV4dHBvb2wgPSBuZXh0OworICAgICAgICAgICAgVU5MT0NLKCk7CisgICAgICAgICAgICByZXR1cm4gKHZvaWQgKilicDsKKyAgICAgICAgfQogCi0JCS8qIFRoZXJlIGlzbid0IGEgcG9vbCBvZiB0aGUgcmlnaHQgc2l6ZSBjbGFzcyBpbW1lZGlhdGVseQotCQkgKiBhdmFpbGFibGU6ICB1c2UgYSBmcmVlIHBvb2wuCi0JCSAqLwotCQlpZiAodXNhYmxlX2FyZW5hcyA9PSBOVUxMKSB7Ci0JCQkvKiBObyBhcmVuYSBoYXMgYSBmcmVlIHBvb2w6ICBhbGxvY2F0ZSBhIG5ldyBhcmVuYS4gKi8KKyAgICAgICAgLyogVGhlcmUgaXNuJ3QgYSBwb29sIG9mIHRoZSByaWdodCBzaXplIGNsYXNzIGltbWVkaWF0ZWx5CisgICAgICAgICAqIGF2YWlsYWJsZTogIHVzZSBhIGZyZWUgcG9vbC4KKyAgICAgICAgICovCisgICAgICAgIGlmICh1c2FibGVfYXJlbmFzID09IE5VTEwpIHsKKyAgICAgICAgICAgIC8qIE5vIGFyZW5hIGhhcyBhIGZyZWUgcG9vbDogIGFsbG9jYXRlIGEgbmV3IGFyZW5hLiAqLwogI2lmZGVmIFdJVEhfTUVNT1JZX0xJTUlUUwotCQkJaWYgKG5hcmVuYXNfY3VycmVudGx5X2FsbG9jYXRlZCA+PSBNQVhfQVJFTkFTKSB7Ci0JCQkJVU5MT0NLKCk7Ci0JCQkJZ290byByZWRpcmVjdDsKLQkJCX0KKyAgICAgICAgICAgIGlmIChuYXJlbmFzX2N1cnJlbnRseV9hbGxvY2F0ZWQgPj0gTUFYX0FSRU5BUykgeworICAgICAgICAgICAgICAgIFVOTE9DSygpOworICAgICAgICAgICAgICAgIGdvdG8gcmVkaXJlY3Q7CisgICAgICAgICAgICB9CiAjZW5kaWYKLQkJCXVzYWJsZV9hcmVuYXMgPSBuZXdfYXJlbmEoKTsKLQkJCWlmICh1c2FibGVfYXJlbmFzID09IE5VTEwpIHsKLQkJCQlVTkxPQ0soKTsKLQkJCQlnb3RvIHJlZGlyZWN0OwotCQkJfQotCQkJdXNhYmxlX2FyZW5hcy0+bmV4dGFyZW5hID0KLQkJCQl1c2FibGVfYXJlbmFzLT5wcmV2YXJlbmEgPSBOVUxMOwotCQl9Ci0JCWFzc2VydCh1c2FibGVfYXJlbmFzLT5hZGRyZXNzICE9IDApOworICAgICAgICAgICAgdXNhYmxlX2FyZW5hcyA9IG5ld19hcmVuYSgpOworICAgICAgICAgICAgaWYgKHVzYWJsZV9hcmVuYXMgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFVOTE9DSygpOworICAgICAgICAgICAgICAgIGdvdG8gcmVkaXJlY3Q7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB1c2FibGVfYXJlbmFzLT5uZXh0YXJlbmEgPQorICAgICAgICAgICAgICAgIHVzYWJsZV9hcmVuYXMtPnByZXZhcmVuYSA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0KHVzYWJsZV9hcmVuYXMtPmFkZHJlc3MgIT0gMCk7CiAKLQkJLyogVHJ5IHRvIGdldCBhIGNhY2hlZCBmcmVlIHBvb2wuICovCi0JCXBvb2wgPSB1c2FibGVfYXJlbmFzLT5mcmVlcG9vbHM7Ci0JCWlmIChwb29sICE9IE5VTEwpIHsKLQkJCS8qIFVubGluayBmcm9tIGNhY2hlZCBwb29scy4gKi8KLQkJCXVzYWJsZV9hcmVuYXMtPmZyZWVwb29scyA9IHBvb2wtPm5leHRwb29sOworICAgICAgICAvKiBUcnkgdG8gZ2V0IGEgY2FjaGVkIGZyZWUgcG9vbC4gKi8KKyAgICAgICAgcG9vbCA9IHVzYWJsZV9hcmVuYXMtPmZyZWVwb29sczsKKyAgICAgICAgaWYgKHBvb2wgIT0gTlVMTCkgeworICAgICAgICAgICAgLyogVW5saW5rIGZyb20gY2FjaGVkIHBvb2xzLiAqLworICAgICAgICAgICAgdXNhYmxlX2FyZW5hcy0+ZnJlZXBvb2xzID0gcG9vbC0+bmV4dHBvb2w7CiAKLQkJCS8qIFRoaXMgYXJlbmEgYWxyZWFkeSBoYWQgdGhlIHNtYWxsZXN0IG5mcmVlcG9vbHMKLQkJCSAqIHZhbHVlLCBzbyBkZWNyZWFzaW5nIG5mcmVlcG9vbHMgZG9lc24ndCBjaGFuZ2UKLQkJCSAqIHRoYXQsIGFuZCB3ZSBkb24ndCBuZWVkIHRvIHJlYXJyYW5nZSB0aGUKLQkJCSAqIHVzYWJsZV9hcmVuYXMgbGlzdC4gIEhvd2V2ZXIsIGlmIHRoZSBhcmVuYSBoYXMKLQkJCSAqIGJlY29tZSB3aG9sbHkgYWxsb2NhdGVkLCB3ZSBuZWVkIHRvIHJlbW92ZSBpdHMKLQkJCSAqIGFyZW5hX29iamVjdCBmcm9tIHVzYWJsZV9hcmVuYXMuCi0JCQkgKi8KLQkJCS0tdXNhYmxlX2FyZW5hcy0+bmZyZWVwb29sczsKLQkJCWlmICh1c2FibGVfYXJlbmFzLT5uZnJlZXBvb2xzID09IDApIHsKLQkJCQkvKiBXaG9sbHkgYWxsb2NhdGVkOiAgcmVtb3ZlLiAqLwotCQkJCWFzc2VydCh1c2FibGVfYXJlbmFzLT5mcmVlcG9vbHMgPT0gTlVMTCk7Ci0JCQkJYXNzZXJ0KHVzYWJsZV9hcmVuYXMtPm5leHRhcmVuYSA9PSBOVUxMIHx8Ci0JCQkJICAgICAgIHVzYWJsZV9hcmVuYXMtPm5leHRhcmVuYS0+cHJldmFyZW5hID09Ci0JCQkJCSAgIHVzYWJsZV9hcmVuYXMpOworICAgICAgICAgICAgLyogVGhpcyBhcmVuYSBhbHJlYWR5IGhhZCB0aGUgc21hbGxlc3QgbmZyZWVwb29scworICAgICAgICAgICAgICogdmFsdWUsIHNvIGRlY3JlYXNpbmcgbmZyZWVwb29scyBkb2Vzbid0IGNoYW5nZQorICAgICAgICAgICAgICogdGhhdCwgYW5kIHdlIGRvbid0IG5lZWQgdG8gcmVhcnJhbmdlIHRoZQorICAgICAgICAgICAgICogdXNhYmxlX2FyZW5hcyBsaXN0LiAgSG93ZXZlciwgaWYgdGhlIGFyZW5hIGhhcworICAgICAgICAgICAgICogYmVjb21lIHdob2xseSBhbGxvY2F0ZWQsIHdlIG5lZWQgdG8gcmVtb3ZlIGl0cworICAgICAgICAgICAgICogYXJlbmFfb2JqZWN0IGZyb20gdXNhYmxlX2FyZW5hcy4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgLS11c2FibGVfYXJlbmFzLT5uZnJlZXBvb2xzOworICAgICAgICAgICAgaWYgKHVzYWJsZV9hcmVuYXMtPm5mcmVlcG9vbHMgPT0gMCkgeworICAgICAgICAgICAgICAgIC8qIFdob2xseSBhbGxvY2F0ZWQ6ICByZW1vdmUuICovCisgICAgICAgICAgICAgICAgYXNzZXJ0KHVzYWJsZV9hcmVuYXMtPmZyZWVwb29scyA9PSBOVUxMKTsKKyAgICAgICAgICAgICAgICBhc3NlcnQodXNhYmxlX2FyZW5hcy0+bmV4dGFyZW5hID09IE5VTEwgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgdXNhYmxlX2FyZW5hcy0+bmV4dGFyZW5hLT5wcmV2YXJlbmEgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgdXNhYmxlX2FyZW5hcyk7CiAKLQkJCQl1c2FibGVfYXJlbmFzID0gdXNhYmxlX2FyZW5hcy0+bmV4dGFyZW5hOwotCQkJCWlmICh1c2FibGVfYXJlbmFzICE9IE5VTEwpIHsKLQkJCQkJdXNhYmxlX2FyZW5hcy0+cHJldmFyZW5hID0gTlVMTDsKLQkJCQkJYXNzZXJ0KHVzYWJsZV9hcmVuYXMtPmFkZHJlc3MgIT0gMCk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLyogbmZyZWVwb29scyA+IDA6ICBpdCBtdXN0IGJlIHRoYXQgZnJlZXBvb2xzCi0JCQkJICogaXNuJ3QgTlVMTCwgb3IgdGhhdCB3ZSBoYXZlbid0IHlldCBjYXJ2ZWQKLQkJCQkgKiBvZmYgYWxsIHRoZSBhcmVuYSdzIHBvb2xzIGZvciB0aGUgZmlyc3QKLQkJCQkgKiB0aW1lLgotCQkJCSAqLwotCQkJCWFzc2VydCh1c2FibGVfYXJlbmFzLT5mcmVlcG9vbHMgIT0gTlVMTCB8fAotCQkJCSAgICAgICB1c2FibGVfYXJlbmFzLT5wb29sX2FkZHJlc3MgPD0KLQkJCQkgICAgICAgICAgIChibG9jayopdXNhYmxlX2FyZW5hcy0+YWRkcmVzcyArCi0JCQkJICAgICAgICAgICAgICAgQVJFTkFfU0laRSAtIFBPT0xfU0laRSk7Ci0JCQl9Ci0JCWluaXRfcG9vbDoKLQkJCS8qIEZyb250bGluayB0byB1c2VkIHBvb2xzLiAqLwotCQkJbmV4dCA9IHVzZWRwb29sc1tzaXplICsgc2l6ZV07IC8qID09IHByZXYgKi8KLQkJCXBvb2wtPm5leHRwb29sID0gbmV4dDsKLQkJCXBvb2wtPnByZXZwb29sID0gbmV4dDsKLQkJCW5leHQtPm5leHRwb29sID0gcG9vbDsKLQkJCW5leHQtPnByZXZwb29sID0gcG9vbDsKLQkJCXBvb2wtPnJlZi5jb3VudCA9IDE7Ci0JCQlpZiAocG9vbC0+c3ppZHggPT0gc2l6ZSkgewotCQkJCS8qIEx1Y2tpbHksIHRoaXMgcG9vbCBsYXN0IGNvbnRhaW5lZCBibG9ja3MKLQkJCQkgKiBvZiB0aGUgc2FtZSBzaXplIGNsYXNzLCBzbyBpdHMgaGVhZGVyCi0JCQkJICogYW5kIGZyZWUgbGlzdCBhcmUgYWxyZWFkeSBpbml0aWFsaXplZC4KLQkJCQkgKi8KLQkJCQlicCA9IHBvb2wtPmZyZWVibG9jazsKLQkJCQlwb29sLT5mcmVlYmxvY2sgPSAqKGJsb2NrICoqKWJwOwotCQkJCVVOTE9DSygpOwotCQkJCXJldHVybiAodm9pZCAqKWJwOwotCQkJfQotCQkJLyoKLQkJCSAqIEluaXRpYWxpemUgdGhlIHBvb2wgaGVhZGVyLCBzZXQgdXAgdGhlIGZyZWUgbGlzdCB0bwotCQkJICogY29udGFpbiBqdXN0IHRoZSBzZWNvbmQgYmxvY2ssIGFuZCByZXR1cm4gdGhlIGZpcnN0Ci0JCQkgKiBibG9jay4KLQkJCSAqLwotCQkJcG9vbC0+c3ppZHggPSBzaXplOwotCQkJc2l6ZSA9IElOREVYMlNJWkUoc2l6ZSk7Ci0JCQlicCA9IChibG9jayAqKXBvb2wgKyBQT09MX09WRVJIRUFEOwotCQkJcG9vbC0+bmV4dG9mZnNldCA9IFBPT0xfT1ZFUkhFQUQgKyAoc2l6ZSA8PCAxKTsKLQkJCXBvb2wtPm1heG5leHRvZmZzZXQgPSBQT09MX1NJWkUgLSBzaXplOwotCQkJcG9vbC0+ZnJlZWJsb2NrID0gYnAgKyBzaXplOwotCQkJKihibG9jayAqKikocG9vbC0+ZnJlZWJsb2NrKSA9IE5VTEw7Ci0JCQlVTkxPQ0soKTsKLQkJCXJldHVybiAodm9pZCAqKWJwOwotCQl9CisgICAgICAgICAgICAgICAgdXNhYmxlX2FyZW5hcyA9IHVzYWJsZV9hcmVuYXMtPm5leHRhcmVuYTsKKyAgICAgICAgICAgICAgICBpZiAodXNhYmxlX2FyZW5hcyAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIHVzYWJsZV9hcmVuYXMtPnByZXZhcmVuYSA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydCh1c2FibGVfYXJlbmFzLT5hZGRyZXNzICE9IDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIC8qIG5mcmVlcG9vbHMgPiAwOiAgaXQgbXVzdCBiZSB0aGF0IGZyZWVwb29scworICAgICAgICAgICAgICAgICAqIGlzbid0IE5VTEwsIG9yIHRoYXQgd2UgaGF2ZW4ndCB5ZXQgY2FydmVkCisgICAgICAgICAgICAgICAgICogb2ZmIGFsbCB0aGUgYXJlbmEncyBwb29scyBmb3IgdGhlIGZpcnN0CisgICAgICAgICAgICAgICAgICogdGltZS4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBhc3NlcnQodXNhYmxlX2FyZW5hcy0+ZnJlZXBvb2xzICE9IE5VTEwgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgdXNhYmxlX2FyZW5hcy0+cG9vbF9hZGRyZXNzIDw9CisgICAgICAgICAgICAgICAgICAgICAgIChibG9jayopdXNhYmxlX2FyZW5hcy0+YWRkcmVzcyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBUkVOQV9TSVpFIC0gUE9PTF9TSVpFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgaW5pdF9wb29sOgorICAgICAgICAgICAgLyogRnJvbnRsaW5rIHRvIHVzZWQgcG9vbHMuICovCisgICAgICAgICAgICBuZXh0ID0gdXNlZHBvb2xzW3NpemUgKyBzaXplXTsgLyogPT0gcHJldiAqLworICAgICAgICAgICAgcG9vbC0+bmV4dHBvb2wgPSBuZXh0OworICAgICAgICAgICAgcG9vbC0+cHJldnBvb2wgPSBuZXh0OworICAgICAgICAgICAgbmV4dC0+bmV4dHBvb2wgPSBwb29sOworICAgICAgICAgICAgbmV4dC0+cHJldnBvb2wgPSBwb29sOworICAgICAgICAgICAgcG9vbC0+cmVmLmNvdW50ID0gMTsKKyAgICAgICAgICAgIGlmIChwb29sLT5zemlkeCA9PSBzaXplKSB7CisgICAgICAgICAgICAgICAgLyogTHVja2lseSwgdGhpcyBwb29sIGxhc3QgY29udGFpbmVkIGJsb2NrcworICAgICAgICAgICAgICAgICAqIG9mIHRoZSBzYW1lIHNpemUgY2xhc3MsIHNvIGl0cyBoZWFkZXIKKyAgICAgICAgICAgICAgICAgKiBhbmQgZnJlZSBsaXN0IGFyZSBhbHJlYWR5IGluaXRpYWxpemVkLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGJwID0gcG9vbC0+ZnJlZWJsb2NrOworICAgICAgICAgICAgICAgIHBvb2wtPmZyZWVibG9jayA9ICooYmxvY2sgKiopYnA7CisgICAgICAgICAgICAgICAgVU5MT0NLKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuICh2b2lkICopYnA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogSW5pdGlhbGl6ZSB0aGUgcG9vbCBoZWFkZXIsIHNldCB1cCB0aGUgZnJlZSBsaXN0IHRvCisgICAgICAgICAgICAgKiBjb250YWluIGp1c3QgdGhlIHNlY29uZCBibG9jaywgYW5kIHJldHVybiB0aGUgZmlyc3QKKyAgICAgICAgICAgICAqIGJsb2NrLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwb29sLT5zemlkeCA9IHNpemU7CisgICAgICAgICAgICBzaXplID0gSU5ERVgyU0laRShzaXplKTsKKyAgICAgICAgICAgIGJwID0gKGJsb2NrICopcG9vbCArIFBPT0xfT1ZFUkhFQUQ7CisgICAgICAgICAgICBwb29sLT5uZXh0b2Zmc2V0ID0gUE9PTF9PVkVSSEVBRCArIChzaXplIDw8IDEpOworICAgICAgICAgICAgcG9vbC0+bWF4bmV4dG9mZnNldCA9IFBPT0xfU0laRSAtIHNpemU7CisgICAgICAgICAgICBwb29sLT5mcmVlYmxvY2sgPSBicCArIHNpemU7CisgICAgICAgICAgICAqKGJsb2NrICoqKShwb29sLT5mcmVlYmxvY2spID0gTlVMTDsKKyAgICAgICAgICAgIFVOTE9DSygpOworICAgICAgICAgICAgcmV0dXJuICh2b2lkICopYnA7CisgICAgICAgIH0KIAotCQkvKiBDYXJ2ZSBvZmYgYSBuZXcgcG9vbC4gKi8KLQkJYXNzZXJ0KHVzYWJsZV9hcmVuYXMtPm5mcmVlcG9vbHMgPiAwKTsKLQkJYXNzZXJ0KHVzYWJsZV9hcmVuYXMtPmZyZWVwb29scyA9PSBOVUxMKTsKLQkJcG9vbCA9IChwb29scCl1c2FibGVfYXJlbmFzLT5wb29sX2FkZHJlc3M7Ci0JCWFzc2VydCgoYmxvY2sqKXBvb2wgPD0gKGJsb2NrKil1c2FibGVfYXJlbmFzLT5hZGRyZXNzICsKLQkJICAgICAgICAgICAgICAgICAgICAgICBBUkVOQV9TSVpFIC0gUE9PTF9TSVpFKTsKLQkJcG9vbC0+YXJlbmFpbmRleCA9IHVzYWJsZV9hcmVuYXMgLSBhcmVuYXM7Ci0JCWFzc2VydCgmYXJlbmFzW3Bvb2wtPmFyZW5haW5kZXhdID09IHVzYWJsZV9hcmVuYXMpOwotCQlwb29sLT5zemlkeCA9IERVTU1ZX1NJWkVfSURYOwotCQl1c2FibGVfYXJlbmFzLT5wb29sX2FkZHJlc3MgKz0gUE9PTF9TSVpFOwotCQktLXVzYWJsZV9hcmVuYXMtPm5mcmVlcG9vbHM7CisgICAgICAgIC8qIENhcnZlIG9mZiBhIG5ldyBwb29sLiAqLworICAgICAgICBhc3NlcnQodXNhYmxlX2FyZW5hcy0+bmZyZWVwb29scyA+IDApOworICAgICAgICBhc3NlcnQodXNhYmxlX2FyZW5hcy0+ZnJlZXBvb2xzID09IE5VTEwpOworICAgICAgICBwb29sID0gKHBvb2xwKXVzYWJsZV9hcmVuYXMtPnBvb2xfYWRkcmVzczsKKyAgICAgICAgYXNzZXJ0KChibG9jayopcG9vbCA8PSAoYmxvY2sqKXVzYWJsZV9hcmVuYXMtPmFkZHJlc3MgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSRU5BX1NJWkUgLSBQT09MX1NJWkUpOworICAgICAgICBwb29sLT5hcmVuYWluZGV4ID0gdXNhYmxlX2FyZW5hcyAtIGFyZW5hczsKKyAgICAgICAgYXNzZXJ0KCZhcmVuYXNbcG9vbC0+YXJlbmFpbmRleF0gPT0gdXNhYmxlX2FyZW5hcyk7CisgICAgICAgIHBvb2wtPnN6aWR4ID0gRFVNTVlfU0laRV9JRFg7CisgICAgICAgIHVzYWJsZV9hcmVuYXMtPnBvb2xfYWRkcmVzcyArPSBQT09MX1NJWkU7CisgICAgICAgIC0tdXNhYmxlX2FyZW5hcy0+bmZyZWVwb29sczsKIAotCQlpZiAodXNhYmxlX2FyZW5hcy0+bmZyZWVwb29scyA9PSAwKSB7Ci0JCQlhc3NlcnQodXNhYmxlX2FyZW5hcy0+bmV4dGFyZW5hID09IE5VTEwgfHwKLQkJCSAgICAgICB1c2FibGVfYXJlbmFzLT5uZXh0YXJlbmEtPnByZXZhcmVuYSA9PQotCQkJICAgICAgIAkgICB1c2FibGVfYXJlbmFzKTsKLQkJCS8qIFVubGluayB0aGUgYXJlbmE6ICBpdCBpcyBjb21wbGV0ZWx5IGFsbG9jYXRlZC4gKi8KLQkJCXVzYWJsZV9hcmVuYXMgPSB1c2FibGVfYXJlbmFzLT5uZXh0YXJlbmE7Ci0JCQlpZiAodXNhYmxlX2FyZW5hcyAhPSBOVUxMKSB7Ci0JCQkJdXNhYmxlX2FyZW5hcy0+cHJldmFyZW5hID0gTlVMTDsKLQkJCQlhc3NlcnQodXNhYmxlX2FyZW5hcy0+YWRkcmVzcyAhPSAwKTsKLQkJCX0KLQkJfQorICAgICAgICBpZiAodXNhYmxlX2FyZW5hcy0+bmZyZWVwb29scyA9PSAwKSB7CisgICAgICAgICAgICBhc3NlcnQodXNhYmxlX2FyZW5hcy0+bmV4dGFyZW5hID09IE5VTEwgfHwKKyAgICAgICAgICAgICAgICAgICB1c2FibGVfYXJlbmFzLT5uZXh0YXJlbmEtPnByZXZhcmVuYSA9PQorICAgICAgICAgICAgICAgICAgIHVzYWJsZV9hcmVuYXMpOworICAgICAgICAgICAgLyogVW5saW5rIHRoZSBhcmVuYTogIGl0IGlzIGNvbXBsZXRlbHkgYWxsb2NhdGVkLiAqLworICAgICAgICAgICAgdXNhYmxlX2FyZW5hcyA9IHVzYWJsZV9hcmVuYXMtPm5leHRhcmVuYTsKKyAgICAgICAgICAgIGlmICh1c2FibGVfYXJlbmFzICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICB1c2FibGVfYXJlbmFzLT5wcmV2YXJlbmEgPSBOVUxMOworICAgICAgICAgICAgICAgIGFzc2VydCh1c2FibGVfYXJlbmFzLT5hZGRyZXNzICE9IDApOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJZ290byBpbml0X3Bvb2w7Ci0JfQorICAgICAgICBnb3RvIGluaXRfcG9vbDsKKyAgICB9CiAKLSAgICAgICAgLyogVGhlIHNtYWxsIGJsb2NrIGFsbG9jYXRvciBlbmRzIGhlcmUuICovCisgICAgLyogVGhlIHNtYWxsIGJsb2NrIGFsbG9jYXRvciBlbmRzIGhlcmUuICovCiAKIHJlZGlyZWN0OgotCS8qIFJlZGlyZWN0IHRoZSBvcmlnaW5hbCByZXF1ZXN0IHRvIHRoZSB1bmRlcmx5aW5nIChsaWJjKSBhbGxvY2F0b3IuCi0JICogV2UganVtcCBoZXJlIG9uIGJpZ2dlciByZXF1ZXN0cywgb24gZXJyb3IgaW4gdGhlIGNvZGUgYWJvdmUgKGFzIGEKLQkgKiBsYXN0IGNoYW5jZSB0byBzZXJ2ZSB0aGUgcmVxdWVzdCkgb3Igd2hlbiB0aGUgbWF4IG1lbW9yeSBsaW1pdAotCSAqIGhhcyBiZWVuIHJlYWNoZWQuCi0JICovCi0JaWYgKG5ieXRlcyA9PSAwKQotCQluYnl0ZXMgPSAxOwotCXJldHVybiAodm9pZCAqKW1hbGxvYyhuYnl0ZXMpOworICAgIC8qIFJlZGlyZWN0IHRoZSBvcmlnaW5hbCByZXF1ZXN0IHRvIHRoZSB1bmRlcmx5aW5nIChsaWJjKSBhbGxvY2F0b3IuCisgICAgICogV2UganVtcCBoZXJlIG9uIGJpZ2dlciByZXF1ZXN0cywgb24gZXJyb3IgaW4gdGhlIGNvZGUgYWJvdmUgKGFzIGEKKyAgICAgKiBsYXN0IGNoYW5jZSB0byBzZXJ2ZSB0aGUgcmVxdWVzdCkgb3Igd2hlbiB0aGUgbWF4IG1lbW9yeSBsaW1pdAorICAgICAqIGhhcyBiZWVuIHJlYWNoZWQuCisgICAgICovCisgICAgaWYgKG5ieXRlcyA9PSAwKQorICAgICAgICBuYnl0ZXMgPSAxOworICAgIHJldHVybiAodm9pZCAqKW1hbGxvYyhuYnl0ZXMpOwogfQogCiAvKiBmcmVlICovCkBAIC05MTksMjEwICs5MTksMjEwIEBACiB2b2lkCiBQeU9iamVjdF9GcmVlKHZvaWQgKnApCiB7Ci0JcG9vbHAgcG9vbDsKLQlibG9jayAqbGFzdGZyZWU7Ci0JcG9vbHAgbmV4dCwgcHJldjsKLQl1aW50IHNpemU7CisgICAgcG9vbHAgcG9vbDsKKyAgICBibG9jayAqbGFzdGZyZWU7CisgICAgcG9vbHAgbmV4dCwgcHJldjsKKyAgICB1aW50IHNpemU7CiAKLQlpZiAocCA9PSBOVUxMKQkvKiBmcmVlKE5VTEwpIGhhcyBubyBlZmZlY3QgKi8KLQkJcmV0dXJuOworICAgIGlmIChwID09IE5VTEwpICAgICAgLyogZnJlZShOVUxMKSBoYXMgbm8gZWZmZWN0ICovCisgICAgICAgIHJldHVybjsKIAotCXBvb2wgPSBQT09MX0FERFIocCk7Ci0JaWYgKFB5X0FERFJFU1NfSU5fUkFOR0UocCwgcG9vbCkpIHsKLQkJLyogV2UgYWxsb2NhdGVkIHRoaXMgYWRkcmVzcy4gKi8KLQkJTE9DSygpOwotCQkvKiBMaW5rIHAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBwb29sJ3MgZnJlZWJsb2NrIGxpc3QuICBTaW5jZQotCQkgKiB0aGUgcG9vbCBoYWQgYXQgbGVhc3QgdGhlIHAgYmxvY2sgb3V0c3RhbmRpbmcsIHRoZSBwb29sCi0JCSAqIHdhc24ndCBlbXB0eSAoc28gaXQncyBhbHJlYWR5IGluIGEgdXNlZHBvb2xzW10gbGlzdCwgb3IKLQkJICogd2FzIGZ1bGwgYW5kIGlzIGluIG5vIGxpc3QgLS0gaXQncyBub3QgaW4gdGhlIGZyZWVibG9ja3MKLQkJICogbGlzdCBpbiBhbnkgY2FzZSkuCi0JCSAqLwotCQlhc3NlcnQocG9vbC0+cmVmLmNvdW50ID4gMCk7CS8qIGVsc2UgaXQgd2FzIGVtcHR5ICovCi0JCSooYmxvY2sgKiopcCA9IGxhc3RmcmVlID0gcG9vbC0+ZnJlZWJsb2NrOwotCQlwb29sLT5mcmVlYmxvY2sgPSAoYmxvY2sgKilwOwotCQlpZiAobGFzdGZyZWUpIHsKLQkJCXN0cnVjdCBhcmVuYV9vYmplY3QqIGFvOwotCQkJdWludCBuZjsgIC8qIGFvLT5uZnJlZXBvb2xzICovCisgICAgcG9vbCA9IFBPT0xfQUREUihwKTsKKyAgICBpZiAoUHlfQUREUkVTU19JTl9SQU5HRShwLCBwb29sKSkgeworICAgICAgICAvKiBXZSBhbGxvY2F0ZWQgdGhpcyBhZGRyZXNzLiAqLworICAgICAgICBMT0NLKCk7CisgICAgICAgIC8qIExpbmsgcCB0byB0aGUgc3RhcnQgb2YgdGhlIHBvb2wncyBmcmVlYmxvY2sgbGlzdC4gIFNpbmNlCisgICAgICAgICAqIHRoZSBwb29sIGhhZCBhdCBsZWFzdCB0aGUgcCBibG9jayBvdXRzdGFuZGluZywgdGhlIHBvb2wKKyAgICAgICAgICogd2Fzbid0IGVtcHR5IChzbyBpdCdzIGFscmVhZHkgaW4gYSB1c2VkcG9vbHNbXSBsaXN0LCBvcgorICAgICAgICAgKiB3YXMgZnVsbCBhbmQgaXMgaW4gbm8gbGlzdCAtLSBpdCdzIG5vdCBpbiB0aGUgZnJlZWJsb2NrcworICAgICAgICAgKiBsaXN0IGluIGFueSBjYXNlKS4KKyAgICAgICAgICovCisgICAgICAgIGFzc2VydChwb29sLT5yZWYuY291bnQgPiAwKTsgICAgICAgICAgICAvKiBlbHNlIGl0IHdhcyBlbXB0eSAqLworICAgICAgICAqKGJsb2NrICoqKXAgPSBsYXN0ZnJlZSA9IHBvb2wtPmZyZWVibG9jazsKKyAgICAgICAgcG9vbC0+ZnJlZWJsb2NrID0gKGJsb2NrICopcDsKKyAgICAgICAgaWYgKGxhc3RmcmVlKSB7CisgICAgICAgICAgICBzdHJ1Y3QgYXJlbmFfb2JqZWN0KiBhbzsKKyAgICAgICAgICAgIHVpbnQgbmY7ICAvKiBhby0+bmZyZWVwb29scyAqLwogCi0JCQkvKiBmcmVlYmxvY2sgd2Fzbid0IE5VTEwsIHNvIHRoZSBwb29sIHdhc24ndCBmdWxsLAotCQkJICogYW5kIHRoZSBwb29sIGlzIGluIGEgdXNlZHBvb2xzW10gbGlzdC4KLQkJCSAqLwotCQkJaWYgKC0tcG9vbC0+cmVmLmNvdW50ICE9IDApIHsKLQkJCQkvKiBwb29sIGlzbid0IGVtcHR5OiAgbGVhdmUgaXQgaW4gdXNlZHBvb2xzICovCi0JCQkJVU5MT0NLKCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJLyogUG9vbCBpcyBub3cgZW1wdHk6ICB1bmxpbmsgZnJvbSB1c2VkcG9vbHMsIGFuZAotCQkJICogbGluayB0byB0aGUgZnJvbnQgb2YgZnJlZXBvb2xzLiAgVGhpcyBlbnN1cmVzIHRoYXQKLQkJCSAqIHByZXZpb3VzbHkgZnJlZWQgcG9vbHMgd2lsbCBiZSBhbGxvY2F0ZWQgbGF0ZXIKLQkJCSAqIChiZWluZyBub3QgcmVmZXJlbmNlZCwgdGhleSBhcmUgcGVyaGFwcyBwYWdlZCBvdXQpLgotCQkJICovCi0JCQluZXh0ID0gcG9vbC0+bmV4dHBvb2w7Ci0JCQlwcmV2ID0gcG9vbC0+cHJldnBvb2w7Ci0JCQluZXh0LT5wcmV2cG9vbCA9IHByZXY7Ci0JCQlwcmV2LT5uZXh0cG9vbCA9IG5leHQ7CisgICAgICAgICAgICAvKiBmcmVlYmxvY2sgd2Fzbid0IE5VTEwsIHNvIHRoZSBwb29sIHdhc24ndCBmdWxsLAorICAgICAgICAgICAgICogYW5kIHRoZSBwb29sIGlzIGluIGEgdXNlZHBvb2xzW10gbGlzdC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKC0tcG9vbC0+cmVmLmNvdW50ICE9IDApIHsKKyAgICAgICAgICAgICAgICAvKiBwb29sIGlzbid0IGVtcHR5OiAgbGVhdmUgaXQgaW4gdXNlZHBvb2xzICovCisgICAgICAgICAgICAgICAgVU5MT0NLKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogUG9vbCBpcyBub3cgZW1wdHk6ICB1bmxpbmsgZnJvbSB1c2VkcG9vbHMsIGFuZAorICAgICAgICAgICAgICogbGluayB0byB0aGUgZnJvbnQgb2YgZnJlZXBvb2xzLiAgVGhpcyBlbnN1cmVzIHRoYXQKKyAgICAgICAgICAgICAqIHByZXZpb3VzbHkgZnJlZWQgcG9vbHMgd2lsbCBiZSBhbGxvY2F0ZWQgbGF0ZXIKKyAgICAgICAgICAgICAqIChiZWluZyBub3QgcmVmZXJlbmNlZCwgdGhleSBhcmUgcGVyaGFwcyBwYWdlZCBvdXQpLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBuZXh0ID0gcG9vbC0+bmV4dHBvb2w7CisgICAgICAgICAgICBwcmV2ID0gcG9vbC0+cHJldnBvb2w7CisgICAgICAgICAgICBuZXh0LT5wcmV2cG9vbCA9IHByZXY7CisgICAgICAgICAgICBwcmV2LT5uZXh0cG9vbCA9IG5leHQ7CiAKLQkJCS8qIExpbmsgdGhlIHBvb2wgdG8gZnJlZXBvb2xzLiAgVGhpcyBpcyBhIHNpbmdseS1saW5rZWQKLQkJCSAqIGxpc3QsIGFuZCBwb29sLT5wcmV2cG9vbCBpc24ndCB1c2VkIHRoZXJlLgotCQkJICovCi0JCQlhbyA9ICZhcmVuYXNbcG9vbC0+YXJlbmFpbmRleF07Ci0JCQlwb29sLT5uZXh0cG9vbCA9IGFvLT5mcmVlcG9vbHM7Ci0JCQlhby0+ZnJlZXBvb2xzID0gcG9vbDsKLQkJCW5mID0gKythby0+bmZyZWVwb29sczsKKyAgICAgICAgICAgIC8qIExpbmsgdGhlIHBvb2wgdG8gZnJlZXBvb2xzLiAgVGhpcyBpcyBhIHNpbmdseS1saW5rZWQKKyAgICAgICAgICAgICAqIGxpc3QsIGFuZCBwb29sLT5wcmV2cG9vbCBpc24ndCB1c2VkIHRoZXJlLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBhbyA9ICZhcmVuYXNbcG9vbC0+YXJlbmFpbmRleF07CisgICAgICAgICAgICBwb29sLT5uZXh0cG9vbCA9IGFvLT5mcmVlcG9vbHM7CisgICAgICAgICAgICBhby0+ZnJlZXBvb2xzID0gcG9vbDsKKyAgICAgICAgICAgIG5mID0gKythby0+bmZyZWVwb29sczsKIAotCQkJLyogQWxsIHRoZSByZXN0IGlzIGFyZW5hIG1hbmFnZW1lbnQuICBXZSBqdXN0IGZyZWVkCi0JCQkgKiBhIHBvb2wsIGFuZCB0aGVyZSBhcmUgNCBjYXNlcyBmb3IgYXJlbmEgbWdtdDoKLQkJCSAqIDEuIElmIGFsbCB0aGUgcG9vbHMgYXJlIGZyZWUsIHJldHVybiB0aGUgYXJlbmEgdG8KLQkJCSAqICAgIHRoZSBzeXN0ZW0gZnJlZSgpLgotCQkJICogMi4gSWYgdGhpcyBpcyB0aGUgb25seSBmcmVlIHBvb2wgaW4gdGhlIGFyZW5hLAotCQkJICogICAgYWRkIHRoZSBhcmVuYSBiYWNrIHRvIHRoZSBgdXNhYmxlX2FyZW5hc2AgbGlzdC4KLQkJCSAqIDMuIElmIHRoZSAibmV4dCIgYXJlbmEgaGFzIGEgc21hbGxlciBjb3VudCBvZiBmcmVlCi0JCQkgKiAgICBwb29scywgd2UgaGF2ZSB0byAic2xpZGUgdGhpcyBhcmVuYSByaWdodCIgdG8KLQkJCSAqICAgIHJlc3RvcmUgdGhhdCB1c2FibGVfYXJlbmFzIGlzIHNvcnRlZCBpbiBvcmRlciBvZgotCQkJICogICAgbmZyZWVwb29scy4KLQkJCSAqIDQuIEVsc2UgdGhlcmUncyBub3RoaW5nIG1vcmUgdG8gZG8uCi0JCQkgKi8KLQkJCWlmIChuZiA9PSBhby0+bnRvdGFscG9vbHMpIHsKLQkJCQkvKiBDYXNlIDEuICBGaXJzdCB1bmxpbmsgYW8gZnJvbSB1c2FibGVfYXJlbmFzLgotCQkJCSAqLwotCQkJCWFzc2VydChhby0+cHJldmFyZW5hID09IE5VTEwgfHwKLQkJCQkgICAgICAgYW8tPnByZXZhcmVuYS0+YWRkcmVzcyAhPSAwKTsKLQkJCQlhc3NlcnQoYW8gLT5uZXh0YXJlbmEgPT0gTlVMTCB8fAotCQkJCSAgICAgICBhby0+bmV4dGFyZW5hLT5hZGRyZXNzICE9IDApOworICAgICAgICAgICAgLyogQWxsIHRoZSByZXN0IGlzIGFyZW5hIG1hbmFnZW1lbnQuICBXZSBqdXN0IGZyZWVkCisgICAgICAgICAgICAgKiBhIHBvb2wsIGFuZCB0aGVyZSBhcmUgNCBjYXNlcyBmb3IgYXJlbmEgbWdtdDoKKyAgICAgICAgICAgICAqIDEuIElmIGFsbCB0aGUgcG9vbHMgYXJlIGZyZWUsIHJldHVybiB0aGUgYXJlbmEgdG8KKyAgICAgICAgICAgICAqICAgIHRoZSBzeXN0ZW0gZnJlZSgpLgorICAgICAgICAgICAgICogMi4gSWYgdGhpcyBpcyB0aGUgb25seSBmcmVlIHBvb2wgaW4gdGhlIGFyZW5hLAorICAgICAgICAgICAgICogICAgYWRkIHRoZSBhcmVuYSBiYWNrIHRvIHRoZSBgdXNhYmxlX2FyZW5hc2AgbGlzdC4KKyAgICAgICAgICAgICAqIDMuIElmIHRoZSAibmV4dCIgYXJlbmEgaGFzIGEgc21hbGxlciBjb3VudCBvZiBmcmVlCisgICAgICAgICAgICAgKiAgICBwb29scywgd2UgaGF2ZSB0byAic2xpZGUgdGhpcyBhcmVuYSByaWdodCIgdG8KKyAgICAgICAgICAgICAqICAgIHJlc3RvcmUgdGhhdCB1c2FibGVfYXJlbmFzIGlzIHNvcnRlZCBpbiBvcmRlciBvZgorICAgICAgICAgICAgICogICAgbmZyZWVwb29scy4KKyAgICAgICAgICAgICAqIDQuIEVsc2UgdGhlcmUncyBub3RoaW5nIG1vcmUgdG8gZG8uCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChuZiA9PSBhby0+bnRvdGFscG9vbHMpIHsKKyAgICAgICAgICAgICAgICAvKiBDYXNlIDEuICBGaXJzdCB1bmxpbmsgYW8gZnJvbSB1c2FibGVfYXJlbmFzLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGFzc2VydChhby0+cHJldmFyZW5hID09IE5VTEwgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgYW8tPnByZXZhcmVuYS0+YWRkcmVzcyAhPSAwKTsKKyAgICAgICAgICAgICAgICBhc3NlcnQoYW8gLT5uZXh0YXJlbmEgPT0gTlVMTCB8fAorICAgICAgICAgICAgICAgICAgICAgICBhby0+bmV4dGFyZW5hLT5hZGRyZXNzICE9IDApOwogCi0JCQkJLyogRml4IHRoZSBwb2ludGVyIGluIHRoZSBwcmV2YXJlbmEsIG9yIHRoZQotCQkJCSAqIHVzYWJsZV9hcmVuYXMgcG9pbnRlci4KLQkJCQkgKi8KLQkJCQlpZiAoYW8tPnByZXZhcmVuYSA9PSBOVUxMKSB7Ci0JCQkJCXVzYWJsZV9hcmVuYXMgPSBhby0+bmV4dGFyZW5hOwotCQkJCQlhc3NlcnQodXNhYmxlX2FyZW5hcyA9PSBOVUxMIHx8Ci0JCQkJCSAgICAgICB1c2FibGVfYXJlbmFzLT5hZGRyZXNzICE9IDApOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJYXNzZXJ0KGFvLT5wcmV2YXJlbmEtPm5leHRhcmVuYSA9PSBhbyk7Ci0JCQkJCWFvLT5wcmV2YXJlbmEtPm5leHRhcmVuYSA9Ci0JCQkJCQlhby0+bmV4dGFyZW5hOwotCQkJCX0KLQkJCQkvKiBGaXggdGhlIHBvaW50ZXIgaW4gdGhlIG5leHRhcmVuYS4gKi8KLQkJCQlpZiAoYW8tPm5leHRhcmVuYSAhPSBOVUxMKSB7Ci0JCQkJCWFzc2VydChhby0+bmV4dGFyZW5hLT5wcmV2YXJlbmEgPT0gYW8pOwotCQkJCQlhby0+bmV4dGFyZW5hLT5wcmV2YXJlbmEgPQotCQkJCQkJYW8tPnByZXZhcmVuYTsKLQkJCQl9Ci0JCQkJLyogUmVjb3JkIHRoYXQgdGhpcyBhcmVuYV9vYmplY3Qgc2xvdCBpcwotCQkJCSAqIGF2YWlsYWJsZSB0byBiZSByZXVzZWQuCi0JCQkJICovCi0JCQkJYW8tPm5leHRhcmVuYSA9IHVudXNlZF9hcmVuYV9vYmplY3RzOwotCQkJCXVudXNlZF9hcmVuYV9vYmplY3RzID0gYW87CisgICAgICAgICAgICAgICAgLyogRml4IHRoZSBwb2ludGVyIGluIHRoZSBwcmV2YXJlbmEsIG9yIHRoZQorICAgICAgICAgICAgICAgICAqIHVzYWJsZV9hcmVuYXMgcG9pbnRlci4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBpZiAoYW8tPnByZXZhcmVuYSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIHVzYWJsZV9hcmVuYXMgPSBhby0+bmV4dGFyZW5hOworICAgICAgICAgICAgICAgICAgICBhc3NlcnQodXNhYmxlX2FyZW5hcyA9PSBOVUxMIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2FibGVfYXJlbmFzLT5hZGRyZXNzICE9IDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KGFvLT5wcmV2YXJlbmEtPm5leHRhcmVuYSA9PSBhbyk7CisgICAgICAgICAgICAgICAgICAgIGFvLT5wcmV2YXJlbmEtPm5leHRhcmVuYSA9CisgICAgICAgICAgICAgICAgICAgICAgICBhby0+bmV4dGFyZW5hOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvKiBGaXggdGhlIHBvaW50ZXIgaW4gdGhlIG5leHRhcmVuYS4gKi8KKyAgICAgICAgICAgICAgICBpZiAoYW8tPm5leHRhcmVuYSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydChhby0+bmV4dGFyZW5hLT5wcmV2YXJlbmEgPT0gYW8pOworICAgICAgICAgICAgICAgICAgICBhby0+bmV4dGFyZW5hLT5wcmV2YXJlbmEgPQorICAgICAgICAgICAgICAgICAgICAgICAgYW8tPnByZXZhcmVuYTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLyogUmVjb3JkIHRoYXQgdGhpcyBhcmVuYV9vYmplY3Qgc2xvdCBpcworICAgICAgICAgICAgICAgICAqIGF2YWlsYWJsZSB0byBiZSByZXVzZWQuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgYW8tPm5leHRhcmVuYSA9IHVudXNlZF9hcmVuYV9vYmplY3RzOworICAgICAgICAgICAgICAgIHVudXNlZF9hcmVuYV9vYmplY3RzID0gYW87CiAKLQkJCQkvKiBGcmVlIHRoZSBlbnRpcmUgYXJlbmEuICovCi0JCQkJZnJlZSgodm9pZCAqKWFvLT5hZGRyZXNzKTsKLQkJCQlhby0+YWRkcmVzcyA9IDA7CS8qIG1hcmsgdW5hc3NvY2lhdGVkICovCi0JCQkJLS1uYXJlbmFzX2N1cnJlbnRseV9hbGxvY2F0ZWQ7CisgICAgICAgICAgICAgICAgLyogRnJlZSB0aGUgZW50aXJlIGFyZW5hLiAqLworICAgICAgICAgICAgICAgIGZyZWUoKHZvaWQgKilhby0+YWRkcmVzcyk7CisgICAgICAgICAgICAgICAgYW8tPmFkZHJlc3MgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1hcmsgdW5hc3NvY2lhdGVkICovCisgICAgICAgICAgICAgICAgLS1uYXJlbmFzX2N1cnJlbnRseV9hbGxvY2F0ZWQ7CiAKLQkJCQlVTkxPQ0soKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlpZiAobmYgPT0gMSkgewotCQkJCS8qIENhc2UgMi4gIFB1dCBhbyBhdCB0aGUgaGVhZCBvZgotCQkJCSAqIHVzYWJsZV9hcmVuYXMuICBOb3RlIHRoYXQgYmVjYXVzZQotCQkJCSAqIGFvLT5uZnJlZXBvb2xzIHdhcyAwIGJlZm9yZSwgYW8gaXNuJ3QKLQkJCQkgKiBjdXJyZW50bHkgb24gdGhlIHVzYWJsZV9hcmVuYXMgbGlzdC4KLQkJCQkgKi8KLQkJCQlhby0+bmV4dGFyZW5hID0gdXNhYmxlX2FyZW5hczsKLQkJCQlhby0+cHJldmFyZW5hID0gTlVMTDsKLQkJCQlpZiAodXNhYmxlX2FyZW5hcykKLQkJCQkJdXNhYmxlX2FyZW5hcy0+cHJldmFyZW5hID0gYW87Ci0JCQkJdXNhYmxlX2FyZW5hcyA9IGFvOwotCQkJCWFzc2VydCh1c2FibGVfYXJlbmFzLT5hZGRyZXNzICE9IDApOworICAgICAgICAgICAgICAgIFVOTE9DSygpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChuZiA9PSAxKSB7CisgICAgICAgICAgICAgICAgLyogQ2FzZSAyLiAgUHV0IGFvIGF0IHRoZSBoZWFkIG9mCisgICAgICAgICAgICAgICAgICogdXNhYmxlX2FyZW5hcy4gIE5vdGUgdGhhdCBiZWNhdXNlCisgICAgICAgICAgICAgICAgICogYW8tPm5mcmVlcG9vbHMgd2FzIDAgYmVmb3JlLCBhbyBpc24ndAorICAgICAgICAgICAgICAgICAqIGN1cnJlbnRseSBvbiB0aGUgdXNhYmxlX2FyZW5hcyBsaXN0LgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGFvLT5uZXh0YXJlbmEgPSB1c2FibGVfYXJlbmFzOworICAgICAgICAgICAgICAgIGFvLT5wcmV2YXJlbmEgPSBOVUxMOworICAgICAgICAgICAgICAgIGlmICh1c2FibGVfYXJlbmFzKQorICAgICAgICAgICAgICAgICAgICB1c2FibGVfYXJlbmFzLT5wcmV2YXJlbmEgPSBhbzsKKyAgICAgICAgICAgICAgICB1c2FibGVfYXJlbmFzID0gYW87CisgICAgICAgICAgICAgICAgYXNzZXJ0KHVzYWJsZV9hcmVuYXMtPmFkZHJlc3MgIT0gMCk7CiAKLQkJCQlVTkxPQ0soKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQkvKiBJZiB0aGlzIGFyZW5hIGlzIG5vdyBvdXQgb2Ygb3JkZXIsIHdlIG5lZWQgdG8ga2VlcAotCQkJICogdGhlIGxpc3Qgc29ydGVkLiAgVGhlIGxpc3QgaXMga2VwdCBzb3J0ZWQgc28gdGhhdAotCQkJICogdGhlICJtb3N0IGZ1bGwiIGFyZW5hcyBhcmUgdXNlZCBmaXJzdCwgd2hpY2ggYWxsb3dzCi0JCQkgKiB0aGUgbmVhcmx5IGVtcHR5IGFyZW5hcyB0byBiZSBjb21wbGV0ZWx5IGZyZWVkLiAgSW4KLQkJCSAqIGEgZmV3IHVuLXNjaWVudGlmaWMgdGVzdHMsIGl0IHNlZW1zIGxpa2UgdGhpcwotCQkJICogYXBwcm9hY2ggYWxsb3dlZCBhIGxvdCBtb3JlIG1lbW9yeSB0byBiZSBmcmVlZC4KLQkJCSAqLwotCQkJaWYgKGFvLT5uZXh0YXJlbmEgPT0gTlVMTCB8fAotCQkJCSAgICAgbmYgPD0gYW8tPm5leHRhcmVuYS0+bmZyZWVwb29scykgewotCQkJCS8qIENhc2UgNC4gIE5vdGhpbmcgdG8gZG8uICovCi0JCQkJVU5MT0NLKCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJLyogQ2FzZSAzOiAgV2UgaGF2ZSB0byBtb3ZlIHRoZSBhcmVuYSB0b3dhcmRzIHRoZSBlbmQKLQkJCSAqIG9mIHRoZSBsaXN0LCBiZWNhdXNlIGl0IGhhcyBtb3JlIGZyZWUgcG9vbHMgdGhhbgotCQkJICogdGhlIGFyZW5hIHRvIGl0cyByaWdodC4KLQkJCSAqIEZpcnN0IHVubGluayBhbyBmcm9tIHVzYWJsZV9hcmVuYXMuCi0JCQkgKi8KLQkJCWlmIChhby0+cHJldmFyZW5hICE9IE5VTEwpIHsKLQkJCQkvKiBhbyBpc24ndCBhdCB0aGUgaGVhZCBvZiB0aGUgbGlzdCAqLwotCQkJCWFzc2VydChhby0+cHJldmFyZW5hLT5uZXh0YXJlbmEgPT0gYW8pOwotCQkJCWFvLT5wcmV2YXJlbmEtPm5leHRhcmVuYSA9IGFvLT5uZXh0YXJlbmE7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvKiBhbyBpcyBhdCB0aGUgaGVhZCBvZiB0aGUgbGlzdCAqLwotCQkJCWFzc2VydCh1c2FibGVfYXJlbmFzID09IGFvKTsKLQkJCQl1c2FibGVfYXJlbmFzID0gYW8tPm5leHRhcmVuYTsKLQkJCX0KLQkJCWFvLT5uZXh0YXJlbmEtPnByZXZhcmVuYSA9IGFvLT5wcmV2YXJlbmE7CisgICAgICAgICAgICAgICAgVU5MT0NLKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogSWYgdGhpcyBhcmVuYSBpcyBub3cgb3V0IG9mIG9yZGVyLCB3ZSBuZWVkIHRvIGtlZXAKKyAgICAgICAgICAgICAqIHRoZSBsaXN0IHNvcnRlZC4gIFRoZSBsaXN0IGlzIGtlcHQgc29ydGVkIHNvIHRoYXQKKyAgICAgICAgICAgICAqIHRoZSAibW9zdCBmdWxsIiBhcmVuYXMgYXJlIHVzZWQgZmlyc3QsIHdoaWNoIGFsbG93cworICAgICAgICAgICAgICogdGhlIG5lYXJseSBlbXB0eSBhcmVuYXMgdG8gYmUgY29tcGxldGVseSBmcmVlZC4gIEluCisgICAgICAgICAgICAgKiBhIGZldyB1bi1zY2llbnRpZmljIHRlc3RzLCBpdCBzZWVtcyBsaWtlIHRoaXMKKyAgICAgICAgICAgICAqIGFwcHJvYWNoIGFsbG93ZWQgYSBsb3QgbW9yZSBtZW1vcnkgdG8gYmUgZnJlZWQuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChhby0+bmV4dGFyZW5hID09IE5VTEwgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBuZiA8PSBhby0+bmV4dGFyZW5hLT5uZnJlZXBvb2xzKSB7CisgICAgICAgICAgICAgICAgLyogQ2FzZSA0LiAgTm90aGluZyB0byBkby4gKi8KKyAgICAgICAgICAgICAgICBVTkxPQ0soKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBDYXNlIDM6ICBXZSBoYXZlIHRvIG1vdmUgdGhlIGFyZW5hIHRvd2FyZHMgdGhlIGVuZAorICAgICAgICAgICAgICogb2YgdGhlIGxpc3QsIGJlY2F1c2UgaXQgaGFzIG1vcmUgZnJlZSBwb29scyB0aGFuCisgICAgICAgICAgICAgKiB0aGUgYXJlbmEgdG8gaXRzIHJpZ2h0LgorICAgICAgICAgICAgICogRmlyc3QgdW5saW5rIGFvIGZyb20gdXNhYmxlX2FyZW5hcy4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKGFvLT5wcmV2YXJlbmEgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIC8qIGFvIGlzbid0IGF0IHRoZSBoZWFkIG9mIHRoZSBsaXN0ICovCisgICAgICAgICAgICAgICAgYXNzZXJ0KGFvLT5wcmV2YXJlbmEtPm5leHRhcmVuYSA9PSBhbyk7CisgICAgICAgICAgICAgICAgYW8tPnByZXZhcmVuYS0+bmV4dGFyZW5hID0gYW8tPm5leHRhcmVuYTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIC8qIGFvIGlzIGF0IHRoZSBoZWFkIG9mIHRoZSBsaXN0ICovCisgICAgICAgICAgICAgICAgYXNzZXJ0KHVzYWJsZV9hcmVuYXMgPT0gYW8pOworICAgICAgICAgICAgICAgIHVzYWJsZV9hcmVuYXMgPSBhby0+bmV4dGFyZW5hOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYW8tPm5leHRhcmVuYS0+cHJldmFyZW5hID0gYW8tPnByZXZhcmVuYTsKIAotCQkJLyogTG9jYXRlIHRoZSBuZXcgaW5zZXJ0aW9uIHBvaW50IGJ5IGl0ZXJhdGluZyBvdmVyCi0JCQkgKiB0aGUgbGlzdCwgdXNpbmcgb3VyIG5leHRhcmVuYSBwb2ludGVyLgotCQkJICovCi0JCQl3aGlsZSAoYW8tPm5leHRhcmVuYSAhPSBOVUxMICYmCi0JCQkJCW5mID4gYW8tPm5leHRhcmVuYS0+bmZyZWVwb29scykgewotCQkJCWFvLT5wcmV2YXJlbmEgPSBhby0+bmV4dGFyZW5hOwotCQkJCWFvLT5uZXh0YXJlbmEgPSBhby0+bmV4dGFyZW5hLT5uZXh0YXJlbmE7Ci0JCQl9CisgICAgICAgICAgICAvKiBMb2NhdGUgdGhlIG5ldyBpbnNlcnRpb24gcG9pbnQgYnkgaXRlcmF0aW5nIG92ZXIKKyAgICAgICAgICAgICAqIHRoZSBsaXN0LCB1c2luZyBvdXIgbmV4dGFyZW5hIHBvaW50ZXIuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHdoaWxlIChhby0+bmV4dGFyZW5hICE9IE5VTEwgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZiA+IGFvLT5uZXh0YXJlbmEtPm5mcmVlcG9vbHMpIHsKKyAgICAgICAgICAgICAgICBhby0+cHJldmFyZW5hID0gYW8tPm5leHRhcmVuYTsKKyAgICAgICAgICAgICAgICBhby0+bmV4dGFyZW5hID0gYW8tPm5leHRhcmVuYS0+bmV4dGFyZW5hOworICAgICAgICAgICAgfQogCi0JCQkvKiBJbnNlcnQgYW8gYXQgdGhpcyBwb2ludC4gKi8KLQkJCWFzc2VydChhby0+bmV4dGFyZW5hID09IE5VTEwgfHwKLQkJCQlhby0+cHJldmFyZW5hID09IGFvLT5uZXh0YXJlbmEtPnByZXZhcmVuYSk7Ci0JCQlhc3NlcnQoYW8tPnByZXZhcmVuYS0+bmV4dGFyZW5hID09IGFvLT5uZXh0YXJlbmEpOworICAgICAgICAgICAgLyogSW5zZXJ0IGFvIGF0IHRoaXMgcG9pbnQuICovCisgICAgICAgICAgICBhc3NlcnQoYW8tPm5leHRhcmVuYSA9PSBOVUxMIHx8CisgICAgICAgICAgICAgICAgYW8tPnByZXZhcmVuYSA9PSBhby0+bmV4dGFyZW5hLT5wcmV2YXJlbmEpOworICAgICAgICAgICAgYXNzZXJ0KGFvLT5wcmV2YXJlbmEtPm5leHRhcmVuYSA9PSBhby0+bmV4dGFyZW5hKTsKIAotCQkJYW8tPnByZXZhcmVuYS0+bmV4dGFyZW5hID0gYW87Ci0JCQlpZiAoYW8tPm5leHRhcmVuYSAhPSBOVUxMKQotCQkJCWFvLT5uZXh0YXJlbmEtPnByZXZhcmVuYSA9IGFvOworICAgICAgICAgICAgYW8tPnByZXZhcmVuYS0+bmV4dGFyZW5hID0gYW87CisgICAgICAgICAgICBpZiAoYW8tPm5leHRhcmVuYSAhPSBOVUxMKQorICAgICAgICAgICAgICAgIGFvLT5uZXh0YXJlbmEtPnByZXZhcmVuYSA9IGFvOwogCi0JCQkvKiBWZXJpZnkgdGhhdCB0aGUgc3dhcHMgd29ya2VkLiAqLwotCQkJYXNzZXJ0KGFvLT5uZXh0YXJlbmEgPT0gTlVMTCB8fAotCQkJCSAgbmYgPD0gYW8tPm5leHRhcmVuYS0+bmZyZWVwb29scyk7Ci0JCQlhc3NlcnQoYW8tPnByZXZhcmVuYSA9PSBOVUxMIHx8Ci0JCQkJICBuZiA+IGFvLT5wcmV2YXJlbmEtPm5mcmVlcG9vbHMpOwotCQkJYXNzZXJ0KGFvLT5uZXh0YXJlbmEgPT0gTlVMTCB8fAotCQkJCWFvLT5uZXh0YXJlbmEtPnByZXZhcmVuYSA9PSBhbyk7Ci0JCQlhc3NlcnQoKHVzYWJsZV9hcmVuYXMgPT0gYW8gJiYKLQkJCQlhby0+cHJldmFyZW5hID09IE5VTEwpIHx8Ci0JCQkJYW8tPnByZXZhcmVuYS0+bmV4dGFyZW5hID09IGFvKTsKKyAgICAgICAgICAgIC8qIFZlcmlmeSB0aGF0IHRoZSBzd2FwcyB3b3JrZWQuICovCisgICAgICAgICAgICBhc3NlcnQoYW8tPm5leHRhcmVuYSA9PSBOVUxMIHx8CisgICAgICAgICAgICAgICAgICAgICAgbmYgPD0gYW8tPm5leHRhcmVuYS0+bmZyZWVwb29scyk7CisgICAgICAgICAgICBhc3NlcnQoYW8tPnByZXZhcmVuYSA9PSBOVUxMIHx8CisgICAgICAgICAgICAgICAgICAgICAgbmYgPiBhby0+cHJldmFyZW5hLT5uZnJlZXBvb2xzKTsKKyAgICAgICAgICAgIGFzc2VydChhby0+bmV4dGFyZW5hID09IE5VTEwgfHwKKyAgICAgICAgICAgICAgICBhby0+bmV4dGFyZW5hLT5wcmV2YXJlbmEgPT0gYW8pOworICAgICAgICAgICAgYXNzZXJ0KCh1c2FibGVfYXJlbmFzID09IGFvICYmCisgICAgICAgICAgICAgICAgYW8tPnByZXZhcmVuYSA9PSBOVUxMKSB8fAorICAgICAgICAgICAgICAgIGFvLT5wcmV2YXJlbmEtPm5leHRhcmVuYSA9PSBhbyk7CiAKLQkJCVVOTE9DSygpOwotCQkJcmV0dXJuOwotCQl9Ci0JCS8qIFBvb2wgd2FzIGZ1bGwsIHNvIGRvZXNuJ3QgY3VycmVudGx5IGxpdmUgaW4gYW55IGxpc3Q6Ci0JCSAqIGxpbmsgaXQgdG8gdGhlIGZyb250IG9mIHRoZSBhcHByb3ByaWF0ZSB1c2VkcG9vbHNbXSBsaXN0LgotCQkgKiBUaGlzIG1pbWljcyBMUlUgcG9vbCB1c2FnZSBmb3IgbmV3IGFsbG9jYXRpb25zIGFuZAotCQkgKiB0YXJnZXRzIG9wdGltYWwgZmlsbGluZyB3aGVuIHNldmVyYWwgcG9vbHMgY29udGFpbgotCQkgKiBibG9ja3Mgb2YgdGhlIHNhbWUgc2l6ZSBjbGFzcy4KLQkJICovCi0JCS0tcG9vbC0+cmVmLmNvdW50OwotCQlhc3NlcnQocG9vbC0+cmVmLmNvdW50ID4gMCk7CS8qIGVsc2UgdGhlIHBvb2wgaXMgZW1wdHkgKi8KLQkJc2l6ZSA9IHBvb2wtPnN6aWR4OwotCQluZXh0ID0gdXNlZHBvb2xzW3NpemUgKyBzaXplXTsKLQkJcHJldiA9IG5leHQtPnByZXZwb29sOwotCQkvKiBpbnNlcnQgcG9vbCBiZWZvcmUgbmV4dDogICBwcmV2IDwtPiBwb29sIDwtPiBuZXh0ICovCi0JCXBvb2wtPm5leHRwb29sID0gbmV4dDsKLQkJcG9vbC0+cHJldnBvb2wgPSBwcmV2OwotCQluZXh0LT5wcmV2cG9vbCA9IHBvb2w7Ci0JCXByZXYtPm5leHRwb29sID0gcG9vbDsKLQkJVU5MT0NLKCk7Ci0JCXJldHVybjsKLQl9CisgICAgICAgICAgICBVTkxPQ0soKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAvKiBQb29sIHdhcyBmdWxsLCBzbyBkb2Vzbid0IGN1cnJlbnRseSBsaXZlIGluIGFueSBsaXN0OgorICAgICAgICAgKiBsaW5rIGl0IHRvIHRoZSBmcm9udCBvZiB0aGUgYXBwcm9wcmlhdGUgdXNlZHBvb2xzW10gbGlzdC4KKyAgICAgICAgICogVGhpcyBtaW1pY3MgTFJVIHBvb2wgdXNhZ2UgZm9yIG5ldyBhbGxvY2F0aW9ucyBhbmQKKyAgICAgICAgICogdGFyZ2V0cyBvcHRpbWFsIGZpbGxpbmcgd2hlbiBzZXZlcmFsIHBvb2xzIGNvbnRhaW4KKyAgICAgICAgICogYmxvY2tzIG9mIHRoZSBzYW1lIHNpemUgY2xhc3MuCisgICAgICAgICAqLworICAgICAgICAtLXBvb2wtPnJlZi5jb3VudDsKKyAgICAgICAgYXNzZXJ0KHBvb2wtPnJlZi5jb3VudCA+IDApOyAgICAgICAgICAgIC8qIGVsc2UgdGhlIHBvb2wgaXMgZW1wdHkgKi8KKyAgICAgICAgc2l6ZSA9IHBvb2wtPnN6aWR4OworICAgICAgICBuZXh0ID0gdXNlZHBvb2xzW3NpemUgKyBzaXplXTsKKyAgICAgICAgcHJldiA9IG5leHQtPnByZXZwb29sOworICAgICAgICAvKiBpbnNlcnQgcG9vbCBiZWZvcmUgbmV4dDogICBwcmV2IDwtPiBwb29sIDwtPiBuZXh0ICovCisgICAgICAgIHBvb2wtPm5leHRwb29sID0gbmV4dDsKKyAgICAgICAgcG9vbC0+cHJldnBvb2wgPSBwcmV2OworICAgICAgICBuZXh0LT5wcmV2cG9vbCA9IHBvb2w7CisgICAgICAgIHByZXYtPm5leHRwb29sID0gcG9vbDsKKyAgICAgICAgVU5MT0NLKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAKLQkvKiBXZSBkaWRuJ3QgYWxsb2NhdGUgdGhpcyBhZGRyZXNzLiAqLwotCWZyZWUocCk7CisgICAgLyogV2UgZGlkbid0IGFsbG9jYXRlIHRoaXMgYWRkcmVzcy4gKi8KKyAgICBmcmVlKHApOwogfQogCiAvKiByZWFsbG9jLiAgSWYgcCBpcyBOVUxMLCB0aGlzIGFjdHMgbGlrZSBtYWxsb2MobmJ5dGVzKS4gIEVsc2UgaWYgbmJ5dGVzPT0wLApAQCAtMTEzNCw3MiArMTEzNCw3MiBAQAogdm9pZCAqCiBQeU9iamVjdF9SZWFsbG9jKHZvaWQgKnAsIHNpemVfdCBuYnl0ZXMpCiB7Ci0Jdm9pZCAqYnA7Ci0JcG9vbHAgcG9vbDsKLQlzaXplX3Qgc2l6ZTsKKyAgICB2b2lkICpicDsKKyAgICBwb29scCBwb29sOworICAgIHNpemVfdCBzaXplOwogCi0JaWYgKHAgPT0gTlVMTCkKLQkJcmV0dXJuIFB5T2JqZWN0X01hbGxvYyhuYnl0ZXMpOworICAgIGlmIChwID09IE5VTEwpCisgICAgICAgIHJldHVybiBQeU9iamVjdF9NYWxsb2MobmJ5dGVzKTsKIAotCS8qCi0JICogTGltaXQgb3Vyc2VsdmVzIHRvIFBZX1NTSVpFX1RfTUFYIGJ5dGVzIHRvIHByZXZlbnQgc2VjdXJpdHkgaG9sZXMuCi0JICogTW9zdCBweXRob24gaW50ZXJuYWxzIGJsaW5kbHkgdXNlIGEgc2lnbmVkIFB5X3NzaXplX3QgdG8gdHJhY2sKLQkgKiB0aGluZ3Mgd2l0aG91dCBjaGVja2luZyBmb3Igb3ZlcmZsb3dzIG9yIG5lZ2F0aXZlcy4KLQkgKiBBcyBzaXplX3QgaXMgdW5zaWduZWQsIGNoZWNraW5nIGZvciBuYnl0ZXMgPCAwIGlzIG5vdCByZXF1aXJlZC4KLQkgKi8KLQlpZiAobmJ5dGVzID4gUFlfU1NJWkVfVF9NQVgpCi0JCXJldHVybiBOVUxMOworICAgIC8qCisgICAgICogTGltaXQgb3Vyc2VsdmVzIHRvIFBZX1NTSVpFX1RfTUFYIGJ5dGVzIHRvIHByZXZlbnQgc2VjdXJpdHkgaG9sZXMuCisgICAgICogTW9zdCBweXRob24gaW50ZXJuYWxzIGJsaW5kbHkgdXNlIGEgc2lnbmVkIFB5X3NzaXplX3QgdG8gdHJhY2sKKyAgICAgKiB0aGluZ3Mgd2l0aG91dCBjaGVja2luZyBmb3Igb3ZlcmZsb3dzIG9yIG5lZ2F0aXZlcy4KKyAgICAgKiBBcyBzaXplX3QgaXMgdW5zaWduZWQsIGNoZWNraW5nIGZvciBuYnl0ZXMgPCAwIGlzIG5vdCByZXF1aXJlZC4KKyAgICAgKi8KKyAgICBpZiAobmJ5dGVzID4gUFlfU1NJWkVfVF9NQVgpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JcG9vbCA9IFBPT0xfQUREUihwKTsKLQlpZiAoUHlfQUREUkVTU19JTl9SQU5HRShwLCBwb29sKSkgewotCQkvKiBXZSdyZSBpbiBjaGFyZ2Ugb2YgdGhpcyBibG9jayAqLwotCQlzaXplID0gSU5ERVgyU0laRShwb29sLT5zemlkeCk7Ci0JCWlmIChuYnl0ZXMgPD0gc2l6ZSkgewotCQkJLyogVGhlIGJsb2NrIGlzIHN0YXlpbmcgdGhlIHNhbWUgb3Igc2hyaW5raW5nLiAgSWYKLQkJCSAqIGl0J3Mgc2hyaW5raW5nLCB0aGVyZSdzIGEgdHJhZGVvZmY6ICBpdCBjb3N0cwotCQkJICogY3ljbGVzIHRvIGNvcHkgdGhlIGJsb2NrIHRvIGEgc21hbGxlciBzaXplIGNsYXNzLAotCQkJICogYnV0IGl0IHdhc3RlcyBtZW1vcnkgbm90IHRvIGNvcHkgaXQuICBUaGUKLQkJCSAqIGNvbXByb21pc2UgaGVyZSBpcyB0byBjb3B5IG9uIHNocmluayBvbmx5IGlmIGF0Ci0JCQkgKiBsZWFzdCAyNSUgb2Ygc2l6ZSBjYW4gYmUgc2hhdmVkIG9mZi4KLQkJCSAqLwotCQkJaWYgKDQgKiBuYnl0ZXMgPiAzICogc2l6ZSkgewotCQkJCS8qIEl0J3MgdGhlIHNhbWUsCi0JCQkJICogb3Igc2hyaW5raW5nIGFuZCBuZXcvb2xkID4gMy80LgotCQkJCSAqLwotCQkJCXJldHVybiBwOwotCQkJfQotCQkJc2l6ZSA9IG5ieXRlczsKLQkJfQotCQlicCA9IFB5T2JqZWN0X01hbGxvYyhuYnl0ZXMpOwotCQlpZiAoYnAgIT0gTlVMTCkgewotCQkJbWVtY3B5KGJwLCBwLCBzaXplKTsKLQkJCVB5T2JqZWN0X0ZyZWUocCk7Ci0JCX0KLQkJcmV0dXJuIGJwOwotCX0KLQkvKiBXZSdyZSBub3QgbWFuYWdpbmcgdGhpcyBibG9jay4gIElmIG5ieXRlcyA8PQotCSAqIFNNQUxMX1JFUVVFU1RfVEhSRVNIT0xELCBpdCdzIHRlbXB0aW5nIHRvIHRyeSB0byB0YWtlIG92ZXIgdGhpcwotCSAqIGJsb2NrLiAgSG93ZXZlciwgaWYgd2UgZG8sIHdlIG5lZWQgdG8gY29weSB0aGUgdmFsaWQgZGF0YSBmcm9tCi0JICogdGhlIEMtbWFuYWdlZCBibG9jayB0byBvbmUgb2Ygb3VyIGJsb2NrcywgYW5kIHRoZXJlJ3Mgbm8gcG9ydGFibGUKLQkgKiB3YXkgdG8ga25vdyBob3cgbXVjaCBvZiB0aGUgbWVtb3J5IHNwYWNlIHN0YXJ0aW5nIGF0IHAgaXMgdmFsaWQuCi0JICogQXMgYnVnIDExODU4ODMgcG9pbnRlZCBvdXQgdGhlIGhhcmQgd2F5LCBpdCdzIHBvc3NpYmxlIHRoYXQgdGhlCi0JICogQy1tYW5hZ2VkIGJsb2NrIGlzICJhdCB0aGUgZW5kIiBvZiBhbGxvY2F0ZWQgVk0gc3BhY2UsIHNvIHRoYXQKLQkgKiBhIG1lbW9yeSBmYXVsdCBjYW4gb2NjdXIgaWYgd2UgdHJ5IHRvIGNvcHkgbmJ5dGVzIGJ5dGVzIHN0YXJ0aW5nCi0JICogYXQgcC4gIEluc3RlYWQgd2UgcHVudDogIGxldCBDIGNvbnRpbnVlIHRvIG1hbmFnZSB0aGlzIGJsb2NrLgotICAgICAgICAgKi8KLQlpZiAobmJ5dGVzKQotCQlyZXR1cm4gcmVhbGxvYyhwLCBuYnl0ZXMpOwotCS8qIEMgZG9lc24ndCBkZWZpbmUgdGhlIHJlc3VsdCBvZiByZWFsbG9jKHAsIDApIChpdCBtYXkgb3IgbWF5IG5vdAotCSAqIHJldHVybiBOVUxMIHRoZW4pLCBidXQgUHl0aG9uJ3MgZG9jcyBwcm9taXNlIHRoYXQgbmJ5dGVzPT0wIG5ldmVyCi0JICogcmV0dXJucyBOVUxMLiAgV2UgZG9uJ3QgcGFzcyAwIHRvIHJlYWxsb2MoKSwgdG8gYXZvaWQgdGhhdCBlbmRjYXNlCi0JICogdG8gYmVnaW4gd2l0aC4gIEV2ZW4gdGhlbiwgd2UgY2FuJ3QgYmUgc3VyZSB0aGF0IHJlYWxsb2MoKSB3b24ndAotCSAqIHJldHVybiBOVUxMLgotCSAqLwotCWJwID0gcmVhbGxvYyhwLCAxKTsKLSAgIAlyZXR1cm4gYnAgPyBicCA6IHA7CisgICAgcG9vbCA9IFBPT0xfQUREUihwKTsKKyAgICBpZiAoUHlfQUREUkVTU19JTl9SQU5HRShwLCBwb29sKSkgeworICAgICAgICAvKiBXZSdyZSBpbiBjaGFyZ2Ugb2YgdGhpcyBibG9jayAqLworICAgICAgICBzaXplID0gSU5ERVgyU0laRShwb29sLT5zemlkeCk7CisgICAgICAgIGlmIChuYnl0ZXMgPD0gc2l6ZSkgeworICAgICAgICAgICAgLyogVGhlIGJsb2NrIGlzIHN0YXlpbmcgdGhlIHNhbWUgb3Igc2hyaW5raW5nLiAgSWYKKyAgICAgICAgICAgICAqIGl0J3Mgc2hyaW5raW5nLCB0aGVyZSdzIGEgdHJhZGVvZmY6ICBpdCBjb3N0cworICAgICAgICAgICAgICogY3ljbGVzIHRvIGNvcHkgdGhlIGJsb2NrIHRvIGEgc21hbGxlciBzaXplIGNsYXNzLAorICAgICAgICAgICAgICogYnV0IGl0IHdhc3RlcyBtZW1vcnkgbm90IHRvIGNvcHkgaXQuICBUaGUKKyAgICAgICAgICAgICAqIGNvbXByb21pc2UgaGVyZSBpcyB0byBjb3B5IG9uIHNocmluayBvbmx5IGlmIGF0CisgICAgICAgICAgICAgKiBsZWFzdCAyNSUgb2Ygc2l6ZSBjYW4gYmUgc2hhdmVkIG9mZi4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKDQgKiBuYnl0ZXMgPiAzICogc2l6ZSkgeworICAgICAgICAgICAgICAgIC8qIEl0J3MgdGhlIHNhbWUsCisgICAgICAgICAgICAgICAgICogb3Igc2hyaW5raW5nIGFuZCBuZXcvb2xkID4gMy80LgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIHJldHVybiBwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2l6ZSA9IG5ieXRlczsKKyAgICAgICAgfQorICAgICAgICBicCA9IFB5T2JqZWN0X01hbGxvYyhuYnl0ZXMpOworICAgICAgICBpZiAoYnAgIT0gTlVMTCkgeworICAgICAgICAgICAgbWVtY3B5KGJwLCBwLCBzaXplKTsKKyAgICAgICAgICAgIFB5T2JqZWN0X0ZyZWUocCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJwOworICAgIH0KKyAgICAvKiBXZSdyZSBub3QgbWFuYWdpbmcgdGhpcyBibG9jay4gIElmIG5ieXRlcyA8PQorICAgICAqIFNNQUxMX1JFUVVFU1RfVEhSRVNIT0xELCBpdCdzIHRlbXB0aW5nIHRvIHRyeSB0byB0YWtlIG92ZXIgdGhpcworICAgICAqIGJsb2NrLiAgSG93ZXZlciwgaWYgd2UgZG8sIHdlIG5lZWQgdG8gY29weSB0aGUgdmFsaWQgZGF0YSBmcm9tCisgICAgICogdGhlIEMtbWFuYWdlZCBibG9jayB0byBvbmUgb2Ygb3VyIGJsb2NrcywgYW5kIHRoZXJlJ3Mgbm8gcG9ydGFibGUKKyAgICAgKiB3YXkgdG8ga25vdyBob3cgbXVjaCBvZiB0aGUgbWVtb3J5IHNwYWNlIHN0YXJ0aW5nIGF0IHAgaXMgdmFsaWQuCisgICAgICogQXMgYnVnIDExODU4ODMgcG9pbnRlZCBvdXQgdGhlIGhhcmQgd2F5LCBpdCdzIHBvc3NpYmxlIHRoYXQgdGhlCisgICAgICogQy1tYW5hZ2VkIGJsb2NrIGlzICJhdCB0aGUgZW5kIiBvZiBhbGxvY2F0ZWQgVk0gc3BhY2UsIHNvIHRoYXQKKyAgICAgKiBhIG1lbW9yeSBmYXVsdCBjYW4gb2NjdXIgaWYgd2UgdHJ5IHRvIGNvcHkgbmJ5dGVzIGJ5dGVzIHN0YXJ0aW5nCisgICAgICogYXQgcC4gIEluc3RlYWQgd2UgcHVudDogIGxldCBDIGNvbnRpbnVlIHRvIG1hbmFnZSB0aGlzIGJsb2NrLgorICAgICAqLworICAgIGlmIChuYnl0ZXMpCisgICAgICAgIHJldHVybiByZWFsbG9jKHAsIG5ieXRlcyk7CisgICAgLyogQyBkb2Vzbid0IGRlZmluZSB0aGUgcmVzdWx0IG9mIHJlYWxsb2MocCwgMCkgKGl0IG1heSBvciBtYXkgbm90CisgICAgICogcmV0dXJuIE5VTEwgdGhlbiksIGJ1dCBQeXRob24ncyBkb2NzIHByb21pc2UgdGhhdCBuYnl0ZXM9PTAgbmV2ZXIKKyAgICAgKiByZXR1cm5zIE5VTEwuICBXZSBkb24ndCBwYXNzIDAgdG8gcmVhbGxvYygpLCB0byBhdm9pZCB0aGF0IGVuZGNhc2UKKyAgICAgKiB0byBiZWdpbiB3aXRoLiAgRXZlbiB0aGVuLCB3ZSBjYW4ndCBiZSBzdXJlIHRoYXQgcmVhbGxvYygpIHdvbid0CisgICAgICogcmV0dXJuIE5VTEwuCisgICAgICovCisgICAgYnAgPSByZWFsbG9jKHAsIDEpOworICAgIHJldHVybiBicCA/IGJwIDogcDsKIH0KIAotI2Vsc2UJLyogISBXSVRIX1BZTUFMTE9DICovCisjZWxzZSAgIC8qICEgV0lUSF9QWU1BTExPQyAqLwogCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIC8qIHB5bWFsbG9jIG5vdCBlbmFibGVkOiAgUmVkaXJlY3QgdGhlIGVudHJ5IHBvaW50cyB0byBtYWxsb2MuICBUaGVzZSB3aWxsCkBAIC0xMjA4LDE5ICsxMjA4LDE5IEBACiB2b2lkICoKIFB5T2JqZWN0X01hbGxvYyhzaXplX3QgbikKIHsKLQlyZXR1cm4gUHlNZW1fTUFMTE9DKG4pOworICAgIHJldHVybiBQeU1lbV9NQUxMT0Mobik7CiB9CiAKIHZvaWQgKgogUHlPYmplY3RfUmVhbGxvYyh2b2lkICpwLCBzaXplX3QgbikKIHsKLQlyZXR1cm4gUHlNZW1fUkVBTExPQyhwLCBuKTsKKyAgICByZXR1cm4gUHlNZW1fUkVBTExPQyhwLCBuKTsKIH0KIAogdm9pZAogUHlPYmplY3RfRnJlZSh2b2lkICpwKQogewotCVB5TWVtX0ZSRUUocCk7CisgICAgUHlNZW1fRlJFRShwKTsKIH0KICNlbmRpZiAvKiBXSVRIX1BZTUFMTE9DICovCiAKQEAgLTEyNDEsNyArMTI0MSw3IEBACiAjZGVmaW5lIERFQURCWVRFICAgICAgIDB4REIgICAgLyogZGVhZCAobmV3bHkgZnJlZWQpIG1lbW9yeSAqLwogI2RlZmluZSBGT1JCSURERU5CWVRFICAweEZCICAgIC8qIHVudG91Y2hhYmxlIGJ5dGVzIGF0IGVhY2ggZW5kIG9mIGEgYmxvY2sgKi8KIAotc3RhdGljIHNpemVfdCBzZXJpYWxubyA9IDA7CS8qIGluY3JlbWVudGVkIG9uIGVhY2ggZGVidWcge20scmV9YWxsb2MgKi8KK3N0YXRpYyBzaXplX3Qgc2VyaWFsbm8gPSAwOyAgICAgLyogaW5jcmVtZW50ZWQgb24gZWFjaCBkZWJ1ZyB7bSxyZX1hbGxvYyAqLwogCiAvKiBzZXJpYWxubyBpcyBhbHdheXMgaW5jcmVtZW50ZWQgdmlhIGNhbGxpbmcgdGhpcyByb3V0aW5lLiAgVGhlIHBvaW50IGlzCiAgKiB0byBzdXBwbHkgYSBzaW5nbGUgcGxhY2UgdG8gc2V0IGEgYnJlYWtwb2ludC4KQEAgLTEyNDksNyArMTI0OSw3IEBACiBzdGF0aWMgdm9pZAogYnVtcHNlcmlhbG5vKHZvaWQpCiB7Ci0JKytzZXJpYWxubzsKKyAgICArK3NlcmlhbG5vOwogfQogCiAjZGVmaW5lIFNTVCBTSVpFT0ZfU0laRV9UCkBAIC0xMjU4LDEzICsxMjU4LDEzIEBACiBzdGF0aWMgc2l6ZV90CiByZWFkX3NpemVfdChjb25zdCB2b2lkICpwKQogewotCWNvbnN0IHVjaGFyICpxID0gKGNvbnN0IHVjaGFyICopcDsKLQlzaXplX3QgcmVzdWx0ID0gKnErKzsKLQlpbnQgaTsKKyAgICBjb25zdCB1Y2hhciAqcSA9IChjb25zdCB1Y2hhciAqKXA7CisgICAgc2l6ZV90IHJlc3VsdCA9ICpxKys7CisgICAgaW50IGk7CiAKLQlmb3IgKGkgPSBTU1Q7IC0taSA+IDA7ICsrcSkKLQkJcmVzdWx0ID0gKHJlc3VsdCA8PCA4KSB8ICpxOwotCXJldHVybiByZXN1bHQ7CisgICAgZm9yIChpID0gU1NUOyAtLWkgPiAwOyArK3EpCisgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgPDwgOCkgfCAqcTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiAvKiBXcml0ZSBuIGFzIGEgYmlnLWVuZGlhbiBzaXplX3QsIE1TQiBhdCBhZGRyZXNzIHAsIExTQiBhdApAQCAtMTI3MywxMyArMTI3MywxMyBAQAogc3RhdGljIHZvaWQKIHdyaXRlX3NpemVfdCh2b2lkICpwLCBzaXplX3QgbikKIHsKLQl1Y2hhciAqcSA9ICh1Y2hhciAqKXAgKyBTU1QgLSAxOwotCWludCBpOworICAgIHVjaGFyICpxID0gKHVjaGFyICopcCArIFNTVCAtIDE7CisgICAgaW50IGk7CiAKLQlmb3IgKGkgPSBTU1Q7IC0taSA+PSAwOyAtLXEpIHsKLQkJKnEgPSAodWNoYXIpKG4gJiAweGZmKTsKLQkJbiA+Pj0gODsKLQl9CisgICAgZm9yIChpID0gU1NUOyAtLWkgPj0gMDsgLS1xKSB7CisgICAgICAgICpxID0gKHVjaGFyKShuICYgMHhmZik7CisgICAgICAgIG4gPj49IDg7CisgICAgfQogfQogCiAjaWZkZWYgUHlfREVCVUcKQEAgLTEyOTAsMjIgKzEyOTAsMjIgQEAKIHN0YXRpYyBpbnQKIHBvb2xfaXNfaW5fbGlzdChjb25zdCBwb29scCB0YXJnZXQsIHBvb2xwIGxpc3QpCiB7Ci0JcG9vbHAgb3JpZ2xpc3QgPSBsaXN0OwotCWFzc2VydCh0YXJnZXQgIT0gTlVMTCk7Ci0JaWYgKGxpc3QgPT0gTlVMTCkKLQkJcmV0dXJuIDA7Ci0JZG8gewotCQlpZiAodGFyZ2V0ID09IGxpc3QpCi0JCQlyZXR1cm4gMTsKLQkJbGlzdCA9IGxpc3QtPm5leHRwb29sOwotCX0gd2hpbGUgKGxpc3QgIT0gTlVMTCAmJiBsaXN0ICE9IG9yaWdsaXN0KTsKLQlyZXR1cm4gMDsKKyAgICBwb29scCBvcmlnbGlzdCA9IGxpc3Q7CisgICAgYXNzZXJ0KHRhcmdldCAhPSBOVUxMKTsKKyAgICBpZiAobGlzdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gMDsKKyAgICBkbyB7CisgICAgICAgIGlmICh0YXJnZXQgPT0gbGlzdCkKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICBsaXN0ID0gbGlzdC0+bmV4dHBvb2w7CisgICAgfSB3aGlsZSAobGlzdCAhPSBOVUxMICYmIGxpc3QgIT0gb3JpZ2xpc3QpOworICAgIHJldHVybiAwOwogfQogCiAjZWxzZQogI2RlZmluZSBwb29sX2lzX2luX2xpc3QoWCwgWSkgMQogCi0jZW5kaWYJLyogUHlfREVCVUcgKi8KKyNlbmRpZiAgLyogUHlfREVCVUcgKi8KIAogLyogTGV0IFMgPSBzaXplb2Yoc2l6ZV90KS4gIFRoZSBkZWJ1ZyBtYWxsb2MgYXNrcyBmb3IgNCpTIGV4dHJhIGJ5dGVzIGFuZAogICAgZmlsbHMgdGhlbSB3aXRoIHVzZWZ1bCBzdHVmZiwgaGVyZSBjYWxsaW5nIHRoZSB1bmRlcmx5aW5nIG1hbGxvYydzIHJlc3VsdCBwOgpAQCAtMTMzNCwzMSArMTMzNCwzMSBAQAogdm9pZCAqCiBfUHlPYmplY3RfRGVidWdNYWxsb2Moc2l6ZV90IG5ieXRlcykKIHsKLQl1Y2hhciAqcDsJLyogYmFzZSBhZGRyZXNzIG9mIG1hbGxvYydlZCBibG9jayAqLwotCXVjaGFyICp0YWlsOwkvKiBwICsgMipTU1QgKyBuYnl0ZXMgPT0gcG9pbnRlciB0byB0YWlsIHBhZCBieXRlcyAqLwotCXNpemVfdCB0b3RhbDsJLyogbmJ5dGVzICsgNCpTU1QgKi8KKyAgICB1Y2hhciAqcDsgICAgICAgICAgIC8qIGJhc2UgYWRkcmVzcyBvZiBtYWxsb2MnZWQgYmxvY2sgKi8KKyAgICB1Y2hhciAqdGFpbDsgICAgICAgIC8qIHAgKyAyKlNTVCArIG5ieXRlcyA9PSBwb2ludGVyIHRvIHRhaWwgcGFkIGJ5dGVzICovCisgICAgc2l6ZV90IHRvdGFsOyAgICAgICAvKiBuYnl0ZXMgKyA0KlNTVCAqLwogCi0JYnVtcHNlcmlhbG5vKCk7Ci0JdG90YWwgPSBuYnl0ZXMgKyA0KlNTVDsKLQlpZiAodG90YWwgPCBuYnl0ZXMpCi0JCS8qIG92ZXJmbG93OiAgY2FuJ3QgcmVwcmVzZW50IHRvdGFsIGFzIGEgc2l6ZV90ICovCi0JCXJldHVybiBOVUxMOworICAgIGJ1bXBzZXJpYWxubygpOworICAgIHRvdGFsID0gbmJ5dGVzICsgNCpTU1Q7CisgICAgaWYgKHRvdGFsIDwgbmJ5dGVzKQorICAgICAgICAvKiBvdmVyZmxvdzogIGNhbid0IHJlcHJlc2VudCB0b3RhbCBhcyBhIHNpemVfdCAqLworICAgICAgICByZXR1cm4gTlVMTDsKIAotCXAgPSAodWNoYXIgKilQeU9iamVjdF9NYWxsb2ModG90YWwpOwotCWlmIChwID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIHAgPSAodWNoYXIgKilQeU9iamVjdF9NYWxsb2ModG90YWwpOworICAgIGlmIChwID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0Jd3JpdGVfc2l6ZV90KHAsIG5ieXRlcyk7Ci0JbWVtc2V0KHAgKyBTU1QsIEZPUkJJRERFTkJZVEUsIFNTVCk7CisgICAgd3JpdGVfc2l6ZV90KHAsIG5ieXRlcyk7CisgICAgbWVtc2V0KHAgKyBTU1QsIEZPUkJJRERFTkJZVEUsIFNTVCk7CiAKLQlpZiAobmJ5dGVzID4gMCkKLQkJbWVtc2V0KHAgKyAyKlNTVCwgQ0xFQU5CWVRFLCBuYnl0ZXMpOworICAgIGlmIChuYnl0ZXMgPiAwKQorICAgICAgICBtZW1zZXQocCArIDIqU1NULCBDTEVBTkJZVEUsIG5ieXRlcyk7CiAKLQl0YWlsID0gcCArIDIqU1NUICsgbmJ5dGVzOwotCW1lbXNldCh0YWlsLCBGT1JCSURERU5CWVRFLCBTU1QpOwotCXdyaXRlX3NpemVfdCh0YWlsICsgU1NULCBzZXJpYWxubyk7CisgICAgdGFpbCA9IHAgKyAyKlNTVCArIG5ieXRlczsKKyAgICBtZW1zZXQodGFpbCwgRk9SQklEREVOQllURSwgU1NUKTsKKyAgICB3cml0ZV9zaXplX3QodGFpbCArIFNTVCwgc2VyaWFsbm8pOwogCi0JcmV0dXJuIHAgKyAyKlNTVDsKKyAgICByZXR1cm4gcCArIDIqU1NUOwogfQogCiAvKiBUaGUgZGVidWcgZnJlZSBmaXJzdCBjaGVja3MgdGhlIDIqU1NUIGJ5dGVzIG9uIGVhY2ggZW5kIGZvciBzYW5pdHkgKGluCkBAIC0xMzY5LDYzICsxMzY5LDYzIEBACiB2b2lkCiBfUHlPYmplY3RfRGVidWdGcmVlKHZvaWQgKnApCiB7Ci0JdWNoYXIgKnEgPSAodWNoYXIgKilwIC0gMipTU1Q7ICAvKiBhZGRyZXNzIHJldHVybmVkIGZyb20gbWFsbG9jICovCi0Jc2l6ZV90IG5ieXRlczsKKyAgICB1Y2hhciAqcSA9ICh1Y2hhciAqKXAgLSAyKlNTVDsgIC8qIGFkZHJlc3MgcmV0dXJuZWQgZnJvbSBtYWxsb2MgKi8KKyAgICBzaXplX3QgbmJ5dGVzOwogCi0JaWYgKHAgPT0gTlVMTCkKLQkJcmV0dXJuOwotCV9QeU9iamVjdF9EZWJ1Z0NoZWNrQWRkcmVzcyhwKTsKLQluYnl0ZXMgPSByZWFkX3NpemVfdChxKTsKLQlpZiAobmJ5dGVzID4gMCkKLQkJbWVtc2V0KHEsIERFQURCWVRFLCBuYnl0ZXMpOwotCVB5T2JqZWN0X0ZyZWUocSk7CisgICAgaWYgKHAgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOworICAgIF9QeU9iamVjdF9EZWJ1Z0NoZWNrQWRkcmVzcyhwKTsKKyAgICBuYnl0ZXMgPSByZWFkX3NpemVfdChxKTsKKyAgICBpZiAobmJ5dGVzID4gMCkKKyAgICAgICAgbWVtc2V0KHEsIERFQURCWVRFLCBuYnl0ZXMpOworICAgIFB5T2JqZWN0X0ZyZWUocSk7CiB9CiAKIHZvaWQgKgogX1B5T2JqZWN0X0RlYnVnUmVhbGxvYyh2b2lkICpwLCBzaXplX3QgbmJ5dGVzKQogewotCXVjaGFyICpxID0gKHVjaGFyICopcDsKLQl1Y2hhciAqdGFpbDsKLQlzaXplX3QgdG90YWw7CS8qIG5ieXRlcyArIDQqU1NUICovCi0Jc2l6ZV90IG9yaWdpbmFsX25ieXRlczsKLQlpbnQgaTsKKyAgICB1Y2hhciAqcSA9ICh1Y2hhciAqKXA7CisgICAgdWNoYXIgKnRhaWw7CisgICAgc2l6ZV90IHRvdGFsOyAgICAgICAvKiBuYnl0ZXMgKyA0KlNTVCAqLworICAgIHNpemVfdCBvcmlnaW5hbF9uYnl0ZXM7CisgICAgaW50IGk7CiAKLQlpZiAocCA9PSBOVUxMKQotCQlyZXR1cm4gX1B5T2JqZWN0X0RlYnVnTWFsbG9jKG5ieXRlcyk7CisgICAgaWYgKHAgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIF9QeU9iamVjdF9EZWJ1Z01hbGxvYyhuYnl0ZXMpOwogCi0JX1B5T2JqZWN0X0RlYnVnQ2hlY2tBZGRyZXNzKHApOwotCWJ1bXBzZXJpYWxubygpOwotCW9yaWdpbmFsX25ieXRlcyA9IHJlYWRfc2l6ZV90KHEgLSAyKlNTVCk7Ci0JdG90YWwgPSBuYnl0ZXMgKyA0KlNTVDsKLQlpZiAodG90YWwgPCBuYnl0ZXMpCi0JCS8qIG92ZXJmbG93OiAgY2FuJ3QgcmVwcmVzZW50IHRvdGFsIGFzIGEgc2l6ZV90ICovCi0JCXJldHVybiBOVUxMOworICAgIF9QeU9iamVjdF9EZWJ1Z0NoZWNrQWRkcmVzcyhwKTsKKyAgICBidW1wc2VyaWFsbm8oKTsKKyAgICBvcmlnaW5hbF9uYnl0ZXMgPSByZWFkX3NpemVfdChxIC0gMipTU1QpOworICAgIHRvdGFsID0gbmJ5dGVzICsgNCpTU1Q7CisgICAgaWYgKHRvdGFsIDwgbmJ5dGVzKQorICAgICAgICAvKiBvdmVyZmxvdzogIGNhbid0IHJlcHJlc2VudCB0b3RhbCBhcyBhIHNpemVfdCAqLworICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChuYnl0ZXMgPCBvcmlnaW5hbF9uYnl0ZXMpIHsKLQkJLyogc2hyaW5raW5nOiAgbWFyayBvbGQgZXh0cmEgbWVtb3J5IGRlYWQgKi8KLQkJbWVtc2V0KHEgKyBuYnl0ZXMsIERFQURCWVRFLCBvcmlnaW5hbF9uYnl0ZXMgLSBuYnl0ZXMpOwotCX0KKyAgICBpZiAobmJ5dGVzIDwgb3JpZ2luYWxfbmJ5dGVzKSB7CisgICAgICAgIC8qIHNocmlua2luZzogIG1hcmsgb2xkIGV4dHJhIG1lbW9yeSBkZWFkICovCisgICAgICAgIG1lbXNldChxICsgbmJ5dGVzLCBERUFEQllURSwgb3JpZ2luYWxfbmJ5dGVzIC0gbmJ5dGVzKTsKKyAgICB9CiAKLQkvKiBSZXNpemUgYW5kIGFkZCBkZWNvcmF0aW9ucy4gKi8KLQlxID0gKHVjaGFyICopUHlPYmplY3RfUmVhbGxvYyhxIC0gMipTU1QsIHRvdGFsKTsKLQlpZiAocSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICAvKiBSZXNpemUgYW5kIGFkZCBkZWNvcmF0aW9ucy4gKi8KKyAgICBxID0gKHVjaGFyICopUHlPYmplY3RfUmVhbGxvYyhxIC0gMipTU1QsIHRvdGFsKTsKKyAgICBpZiAocSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXdyaXRlX3NpemVfdChxLCBuYnl0ZXMpOwotCWZvciAoaSA9IDA7IGkgPCBTU1Q7ICsraSkKLQkJYXNzZXJ0KHFbU1NUICsgaV0gPT0gRk9SQklEREVOQllURSk7Ci0JcSArPSAyKlNTVDsKLQl0YWlsID0gcSArIG5ieXRlczsKLQltZW1zZXQodGFpbCwgRk9SQklEREVOQllURSwgU1NUKTsKLQl3cml0ZV9zaXplX3QodGFpbCArIFNTVCwgc2VyaWFsbm8pOworICAgIHdyaXRlX3NpemVfdChxLCBuYnl0ZXMpOworICAgIGZvciAoaSA9IDA7IGkgPCBTU1Q7ICsraSkKKyAgICAgICAgYXNzZXJ0KHFbU1NUICsgaV0gPT0gRk9SQklEREVOQllURSk7CisgICAgcSArPSAyKlNTVDsKKyAgICB0YWlsID0gcSArIG5ieXRlczsKKyAgICBtZW1zZXQodGFpbCwgRk9SQklEREVOQllURSwgU1NUKTsKKyAgICB3cml0ZV9zaXplX3QodGFpbCArIFNTVCwgc2VyaWFsbm8pOwogCi0JaWYgKG5ieXRlcyA+IG9yaWdpbmFsX25ieXRlcykgewotCQkvKiBncm93aW5nOiAgbWFyayBuZXcgZXh0cmEgbWVtb3J5IGNsZWFuICovCi0JCW1lbXNldChxICsgb3JpZ2luYWxfbmJ5dGVzLCBDTEVBTkJZVEUsCi0JCQluYnl0ZXMgLSBvcmlnaW5hbF9uYnl0ZXMpOwotCX0KKyAgICBpZiAobmJ5dGVzID4gb3JpZ2luYWxfbmJ5dGVzKSB7CisgICAgICAgIC8qIGdyb3dpbmc6ICBtYXJrIG5ldyBleHRyYSBtZW1vcnkgY2xlYW4gKi8KKyAgICAgICAgbWVtc2V0KHEgKyBvcmlnaW5hbF9uYnl0ZXMsIENMRUFOQllURSwKKyAgICAgICAgICAgIG5ieXRlcyAtIG9yaWdpbmFsX25ieXRlcyk7CisgICAgfQogCi0JcmV0dXJuIHE7CisgICAgcmV0dXJuIHE7CiB9CiAKIC8qIENoZWNrIHRoZSBmb3JiaWRkZW4gYnl0ZXMgb24gYm90aCBlbmRzIG9mIHRoZSBtZW1vcnkgYWxsb2NhdGVkIGZvciBwLgpAQCAtMTQzNSwxNzYgKzE0MzUsMTc2IEBACiAgdm9pZAogX1B5T2JqZWN0X0RlYnVnQ2hlY2tBZGRyZXNzKGNvbnN0IHZvaWQgKnApCiB7Ci0JY29uc3QgdWNoYXIgKnEgPSAoY29uc3QgdWNoYXIgKilwOwotCWNoYXIgKm1zZzsKLQlzaXplX3QgbmJ5dGVzOwotCWNvbnN0IHVjaGFyICp0YWlsOwotCWludCBpOworICAgIGNvbnN0IHVjaGFyICpxID0gKGNvbnN0IHVjaGFyICopcDsKKyAgICBjaGFyICptc2c7CisgICAgc2l6ZV90IG5ieXRlczsKKyAgICBjb25zdCB1Y2hhciAqdGFpbDsKKyAgICBpbnQgaTsKIAotCWlmIChwID09IE5VTEwpIHsKLQkJbXNnID0gImRpZG4ndCBleHBlY3QgYSBOVUxMIHBvaW50ZXIiOwotCQlnb3RvIGVycm9yOwotCX0KKyAgICBpZiAocCA9PSBOVUxMKSB7CisgICAgICAgIG1zZyA9ICJkaWRuJ3QgZXhwZWN0IGEgTlVMTCBwb2ludGVyIjsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CiAKLQkvKiBDaGVjayB0aGUgc3R1ZmYgYXQgdGhlIHN0YXJ0IG9mIHAgZmlyc3Q6ICBpZiB0aGVyZSdzIHVuZGVyd3JpdGUKLQkgKiBjb3JydXB0aW9uLCB0aGUgbnVtYmVyLW9mLWJ5dGVzIGZpZWxkIG1heSBiZSBudXRzLCBhbmQgY2hlY2tpbmcKLQkgKiB0aGUgdGFpbCBjb3VsZCBsZWFkIHRvIGEgc2VnZmF1bHQgdGhlbi4KLQkgKi8KLQlmb3IgKGkgPSBTU1Q7IGkgPj0gMTsgLS1pKSB7Ci0JCWlmICgqKHEtaSkgIT0gRk9SQklEREVOQllURSkgewotCQkJbXNnID0gImJhZCBsZWFkaW5nIHBhZCBieXRlIjsKLQkJCWdvdG8gZXJyb3I7Ci0JCX0KLQl9CisgICAgLyogQ2hlY2sgdGhlIHN0dWZmIGF0IHRoZSBzdGFydCBvZiBwIGZpcnN0OiAgaWYgdGhlcmUncyB1bmRlcndyaXRlCisgICAgICogY29ycnVwdGlvbiwgdGhlIG51bWJlci1vZi1ieXRlcyBmaWVsZCBtYXkgYmUgbnV0cywgYW5kIGNoZWNraW5nCisgICAgICogdGhlIHRhaWwgY291bGQgbGVhZCB0byBhIHNlZ2ZhdWx0IHRoZW4uCisgICAgICovCisgICAgZm9yIChpID0gU1NUOyBpID49IDE7IC0taSkgeworICAgICAgICBpZiAoKihxLWkpICE9IEZPUkJJRERFTkJZVEUpIHsKKyAgICAgICAgICAgIG1zZyA9ICJiYWQgbGVhZGluZyBwYWQgYnl0ZSI7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgfQogCi0JbmJ5dGVzID0gcmVhZF9zaXplX3QocSAtIDIqU1NUKTsKLQl0YWlsID0gcSArIG5ieXRlczsKLQlmb3IgKGkgPSAwOyBpIDwgU1NUOyArK2kpIHsKLQkJaWYgKHRhaWxbaV0gIT0gRk9SQklEREVOQllURSkgewotCQkJbXNnID0gImJhZCB0cmFpbGluZyBwYWQgYnl0ZSI7Ci0JCQlnb3RvIGVycm9yOwotCQl9Ci0JfQorICAgIG5ieXRlcyA9IHJlYWRfc2l6ZV90KHEgLSAyKlNTVCk7CisgICAgdGFpbCA9IHEgKyBuYnl0ZXM7CisgICAgZm9yIChpID0gMDsgaSA8IFNTVDsgKytpKSB7CisgICAgICAgIGlmICh0YWlsW2ldICE9IEZPUkJJRERFTkJZVEUpIHsKKyAgICAgICAgICAgIG1zZyA9ICJiYWQgdHJhaWxpbmcgcGFkIGJ5dGUiOworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgIH0KIAotCXJldHVybjsKKyAgICByZXR1cm47CiAKIGVycm9yOgotCV9QeU9iamVjdF9EZWJ1Z0R1bXBBZGRyZXNzKHApOwotCVB5X0ZhdGFsRXJyb3IobXNnKTsKKyAgICBfUHlPYmplY3RfRGVidWdEdW1wQWRkcmVzcyhwKTsKKyAgICBQeV9GYXRhbEVycm9yKG1zZyk7CiB9CiAKIC8qIERpc3BsYXkgaW5mbyB0byBzdGRlcnIgYWJvdXQgdGhlIG1lbW9yeSBibG9jayBhdCBwLiAqLwogdm9pZAogX1B5T2JqZWN0X0RlYnVnRHVtcEFkZHJlc3MoY29uc3Qgdm9pZCAqcCkKIHsKLQljb25zdCB1Y2hhciAqcSA9IChjb25zdCB1Y2hhciAqKXA7Ci0JY29uc3QgdWNoYXIgKnRhaWw7Ci0Jc2l6ZV90IG5ieXRlcywgc2VyaWFsOwotCWludCBpOwotCWludCBvazsKKyAgICBjb25zdCB1Y2hhciAqcSA9IChjb25zdCB1Y2hhciAqKXA7CisgICAgY29uc3QgdWNoYXIgKnRhaWw7CisgICAgc2l6ZV90IG5ieXRlcywgc2VyaWFsOworICAgIGludCBpOworICAgIGludCBvazsKIAotCWZwcmludGYoc3RkZXJyLCAiRGVidWcgbWVtb3J5IGJsb2NrIGF0IGFkZHJlc3MgcD0lcDpcbiIsIHApOwotCWlmIChwID09IE5VTEwpCi0JCXJldHVybjsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkRlYnVnIG1lbW9yeSBibG9jayBhdCBhZGRyZXNzIHA9JXA6XG4iLCBwKTsKKyAgICBpZiAocCA9PSBOVUxMKQorICAgICAgICByZXR1cm47CiAKLQluYnl0ZXMgPSByZWFkX3NpemVfdChxIC0gMipTU1QpOwotCWZwcmludGYoc3RkZXJyLCAiICAgICUiIFBZX0ZPUk1BVF9TSVpFX1QgInUgYnl0ZXMgb3JpZ2luYWxseSAiCi0JICAgICAgICAgICAgICAgICJyZXF1ZXN0ZWRcbiIsIG5ieXRlcyk7CisgICAgbmJ5dGVzID0gcmVhZF9zaXplX3QocSAtIDIqU1NUKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAlIiBQWV9GT1JNQVRfU0laRV9UICJ1IGJ5dGVzIG9yaWdpbmFsbHkgIgorICAgICAgICAgICAgICAgICAgICAicmVxdWVzdGVkXG4iLCBuYnl0ZXMpOwogCi0JLyogSW4gY2FzZSB0aGlzIGlzIG51dHMsIGNoZWNrIHRoZSBsZWFkaW5nIHBhZCBieXRlcyBmaXJzdC4gKi8KLQlmcHJpbnRmKHN0ZGVyciwgIiAgICBUaGUgJWQgcGFkIGJ5dGVzIGF0IHAtJWQgYXJlICIsIFNTVCwgU1NUKTsKLQlvayA9IDE7Ci0JZm9yIChpID0gMTsgaSA8PSBTU1Q7ICsraSkgewotCQlpZiAoKihxLWkpICE9IEZPUkJJRERFTkJZVEUpIHsKLQkJCW9rID0gMDsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCWlmIChvaykKLQkJZnB1dHMoIkZPUkJJRERFTkJZVEUsIGFzIGV4cGVjdGVkLlxuIiwgc3RkZXJyKTsKLQllbHNlIHsKLQkJZnByaW50ZihzdGRlcnIsICJub3QgYWxsIEZPUkJJRERFTkJZVEUgKDB4JTAyeCk6XG4iLAotCQkJRk9SQklEREVOQllURSk7Ci0JCWZvciAoaSA9IFNTVDsgaSA+PSAxOyAtLWkpIHsKLQkJCWNvbnN0IHVjaGFyIGJ5dGUgPSAqKHEtaSk7Ci0JCQlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgYXQgcC0lZDogMHglMDJ4IiwgaSwgYnl0ZSk7Ci0JCQlpZiAoYnl0ZSAhPSBGT1JCSURERU5CWVRFKQotCQkJCWZwdXRzKCIgKioqIE9VQ0giLCBzdGRlcnIpOwotCQkJZnB1dGMoJ1xuJywgc3RkZXJyKTsKLQkJfQorICAgIC8qIEluIGNhc2UgdGhpcyBpcyBudXRzLCBjaGVjayB0aGUgbGVhZGluZyBwYWQgYnl0ZXMgZmlyc3QuICovCisgICAgZnByaW50ZihzdGRlcnIsICIgICAgVGhlICVkIHBhZCBieXRlcyBhdCBwLSVkIGFyZSAiLCBTU1QsIFNTVCk7CisgICAgb2sgPSAxOworICAgIGZvciAoaSA9IDE7IGkgPD0gU1NUOyArK2kpIHsKKyAgICAgICAgaWYgKCoocS1pKSAhPSBGT1JCSURERU5CWVRFKSB7CisgICAgICAgICAgICBvayA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAob2spCisgICAgICAgIGZwdXRzKCJGT1JCSURERU5CWVRFLCBhcyBleHBlY3RlZC5cbiIsIHN0ZGVycik7CisgICAgZWxzZSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAibm90IGFsbCBGT1JCSURERU5CWVRFICgweCUwMngpOlxuIiwKKyAgICAgICAgICAgIEZPUkJJRERFTkJZVEUpOworICAgICAgICBmb3IgKGkgPSBTU1Q7IGkgPj0gMTsgLS1pKSB7CisgICAgICAgICAgICBjb25zdCB1Y2hhciBieXRlID0gKihxLWkpOworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIgICAgICAgIGF0IHAtJWQ6IDB4JTAyeCIsIGksIGJ5dGUpOworICAgICAgICAgICAgaWYgKGJ5dGUgIT0gRk9SQklEREVOQllURSkKKyAgICAgICAgICAgICAgICBmcHV0cygiICoqKiBPVUNIIiwgc3RkZXJyKTsKKyAgICAgICAgICAgIGZwdXRjKCdcbicsIHN0ZGVycik7CisgICAgICAgIH0KIAotCQlmcHV0cygiICAgIEJlY2F1c2UgbWVtb3J5IGlzIGNvcnJ1cHRlZCBhdCB0aGUgc3RhcnQsIHRoZSAiCi0JCSAgICAgICJjb3VudCBvZiBieXRlcyByZXF1ZXN0ZWRcbiIKLQkJICAgICAgIiAgICAgICBtYXkgYmUgYm9ndXMsIGFuZCBjaGVja2luZyB0aGUgdHJhaWxpbmcgcGFkICIKLQkJICAgICAgImJ5dGVzIG1heSBzZWdmYXVsdC5cbiIsIHN0ZGVycik7Ci0JfQorICAgICAgICBmcHV0cygiICAgIEJlY2F1c2UgbWVtb3J5IGlzIGNvcnJ1cHRlZCBhdCB0aGUgc3RhcnQsIHRoZSAiCisgICAgICAgICAgICAgICJjb3VudCBvZiBieXRlcyByZXF1ZXN0ZWRcbiIKKyAgICAgICAgICAgICAgIiAgICAgICBtYXkgYmUgYm9ndXMsIGFuZCBjaGVja2luZyB0aGUgdHJhaWxpbmcgcGFkICIKKyAgICAgICAgICAgICAgImJ5dGVzIG1heSBzZWdmYXVsdC5cbiIsIHN0ZGVycik7CisgICAgfQogCi0JdGFpbCA9IHEgKyBuYnl0ZXM7Ci0JZnByaW50ZihzdGRlcnIsICIgICAgVGhlICVkIHBhZCBieXRlcyBhdCB0YWlsPSVwIGFyZSAiLCBTU1QsIHRhaWwpOwotCW9rID0gMTsKLQlmb3IgKGkgPSAwOyBpIDwgU1NUOyArK2kpIHsKLQkJaWYgKHRhaWxbaV0gIT0gRk9SQklEREVOQllURSkgewotCQkJb2sgPSAwOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JaWYgKG9rKQotCQlmcHV0cygiRk9SQklEREVOQllURSwgYXMgZXhwZWN0ZWQuXG4iLCBzdGRlcnIpOwotCWVsc2UgewotCQlmcHJpbnRmKHN0ZGVyciwgIm5vdCBhbGwgRk9SQklEREVOQllURSAoMHglMDJ4KTpcbiIsCi0JCQlGT1JCSURERU5CWVRFKTsKLQkJZm9yIChpID0gMDsgaSA8IFNTVDsgKytpKSB7Ci0JCQljb25zdCB1Y2hhciBieXRlID0gdGFpbFtpXTsKLQkJCWZwcmludGYoc3RkZXJyLCAiICAgICAgICBhdCB0YWlsKyVkOiAweCUwMngiLAotCQkJCWksIGJ5dGUpOwotCQkJaWYgKGJ5dGUgIT0gRk9SQklEREVOQllURSkKLQkJCQlmcHV0cygiICoqKiBPVUNIIiwgc3RkZXJyKTsKLQkJCWZwdXRjKCdcbicsIHN0ZGVycik7Ci0JCX0KLQl9CisgICAgdGFpbCA9IHEgKyBuYnl0ZXM7CisgICAgZnByaW50ZihzdGRlcnIsICIgICAgVGhlICVkIHBhZCBieXRlcyBhdCB0YWlsPSVwIGFyZSAiLCBTU1QsIHRhaWwpOworICAgIG9rID0gMTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgU1NUOyArK2kpIHsKKyAgICAgICAgaWYgKHRhaWxbaV0gIT0gRk9SQklEREVOQllURSkgeworICAgICAgICAgICAgb2sgPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKG9rKQorICAgICAgICBmcHV0cygiRk9SQklEREVOQllURSwgYXMgZXhwZWN0ZWQuXG4iLCBzdGRlcnIpOworICAgIGVsc2UgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIm5vdCBhbGwgRk9SQklEREVOQllURSAoMHglMDJ4KTpcbiIsCisgICAgICAgICAgICBGT1JCSURERU5CWVRFKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IFNTVDsgKytpKSB7CisgICAgICAgICAgICBjb25zdCB1Y2hhciBieXRlID0gdGFpbFtpXTsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgICBhdCB0YWlsKyVkOiAweCUwMngiLAorICAgICAgICAgICAgICAgIGksIGJ5dGUpOworICAgICAgICAgICAgaWYgKGJ5dGUgIT0gRk9SQklEREVOQllURSkKKyAgICAgICAgICAgICAgICBmcHV0cygiICoqKiBPVUNIIiwgc3RkZXJyKTsKKyAgICAgICAgICAgIGZwdXRjKCdcbicsIHN0ZGVycik7CisgICAgICAgIH0KKyAgICB9CiAKLQlzZXJpYWwgPSByZWFkX3NpemVfdCh0YWlsICsgU1NUKTsKLQlmcHJpbnRmKHN0ZGVyciwgIiAgICBUaGUgYmxvY2sgd2FzIG1hZGUgYnkgY2FsbCAjJSIgUFlfRk9STUFUX1NJWkVfVAotCQkJInUgdG8gZGVidWcgbWFsbG9jL3JlYWxsb2MuXG4iLCBzZXJpYWwpOworICAgIHNlcmlhbCA9IHJlYWRfc2l6ZV90KHRhaWwgKyBTU1QpOworICAgIGZwcmludGYoc3RkZXJyLCAiICAgIFRoZSBibG9jayB3YXMgbWFkZSBieSBjYWxsICMlIiBQWV9GT1JNQVRfU0laRV9UCisgICAgICAgICAgICAgICAgICAgICJ1IHRvIGRlYnVnIG1hbGxvYy9yZWFsbG9jLlxuIiwgc2VyaWFsKTsKIAotCWlmIChuYnl0ZXMgPiAwKSB7Ci0JCWkgPSAwOwotCQlmcHV0cygiICAgIERhdGEgYXQgcDoiLCBzdGRlcnIpOwotCQkvKiBwcmludCB1cCB0byA4IGJ5dGVzIGF0IHRoZSBzdGFydCAqLwotCQl3aGlsZSAocSA8IHRhaWwgJiYgaSA8IDgpIHsKLQkJCWZwcmludGYoc3RkZXJyLCAiICUwMngiLCAqcSk7Ci0JCQkrK2k7Ci0JCQkrK3E7Ci0JCX0KLQkJLyogYW5kIHVwIHRvIDggYXQgdGhlIGVuZCAqLwotCQlpZiAocSA8IHRhaWwpIHsKLQkJCWlmICh0YWlsIC0gcSA+IDgpIHsKLQkJCQlmcHV0cygiIC4uLiIsIHN0ZGVycik7Ci0JCQkJcSA9IHRhaWwgLSA4OwotCQkJfQotCQkJd2hpbGUgKHEgPCB0YWlsKSB7Ci0JCQkJZnByaW50ZihzdGRlcnIsICIgJTAyeCIsICpxKTsKLQkJCQkrK3E7Ci0JCQl9Ci0JCX0KLQkJZnB1dGMoJ1xuJywgc3RkZXJyKTsKLQl9CisgICAgaWYgKG5ieXRlcyA+IDApIHsKKyAgICAgICAgaSA9IDA7CisgICAgICAgIGZwdXRzKCIgICAgRGF0YSBhdCBwOiIsIHN0ZGVycik7CisgICAgICAgIC8qIHByaW50IHVwIHRvIDggYnl0ZXMgYXQgdGhlIHN0YXJ0ICovCisgICAgICAgIHdoaWxlIChxIDwgdGFpbCAmJiBpIDwgOCkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIgJTAyeCIsICpxKTsKKyAgICAgICAgICAgICsraTsKKyAgICAgICAgICAgICsrcTsKKyAgICAgICAgfQorICAgICAgICAvKiBhbmQgdXAgdG8gOCBhdCB0aGUgZW5kICovCisgICAgICAgIGlmIChxIDwgdGFpbCkgeworICAgICAgICAgICAgaWYgKHRhaWwgLSBxID4gOCkgeworICAgICAgICAgICAgICAgIGZwdXRzKCIgLi4uIiwgc3RkZXJyKTsKKyAgICAgICAgICAgICAgICBxID0gdGFpbCAtIDg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSAocSA8IHRhaWwpIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiAlMDJ4IiwgKnEpOworICAgICAgICAgICAgICAgICsrcTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmcHV0YygnXG4nLCBzdGRlcnIpOworICAgIH0KIH0KIAogc3RhdGljIHNpemVfdAogcHJpbnRvbmUoY29uc3QgY2hhciogbXNnLCBzaXplX3QgdmFsdWUpCiB7Ci0JaW50IGksIGs7Ci0JY2hhciBidWZbMTAwXTsKLQlzaXplX3Qgb3JpZ3ZhbHVlID0gdmFsdWU7CisgICAgaW50IGksIGs7CisgICAgY2hhciBidWZbMTAwXTsKKyAgICBzaXplX3Qgb3JpZ3ZhbHVlID0gdmFsdWU7CiAKLQlmcHV0cyhtc2csIHN0ZGVycik7Ci0JZm9yIChpID0gKGludClzdHJsZW4obXNnKTsgaSA8IDM1OyArK2kpCi0JCWZwdXRjKCcgJywgc3RkZXJyKTsKLQlmcHV0YygnPScsIHN0ZGVycik7CisgICAgZnB1dHMobXNnLCBzdGRlcnIpOworICAgIGZvciAoaSA9IChpbnQpc3RybGVuKG1zZyk7IGkgPCAzNTsgKytpKQorICAgICAgICBmcHV0YygnICcsIHN0ZGVycik7CisgICAgZnB1dGMoJz0nLCBzdGRlcnIpOwogCi0JLyogV3JpdGUgdGhlIHZhbHVlIHdpdGggY29tbWFzLiAqLwotCWkgPSAyMjsKLQlidWZbaS0tXSA9ICdcMCc7Ci0JYnVmW2ktLV0gPSAnXG4nOwotCWsgPSAzOwotCWRvIHsKLQkJc2l6ZV90IG5leHR2YWx1ZSA9IHZhbHVlIC8gMTA7Ci0JCXVpbnQgZGlnaXQgPSAodWludCkodmFsdWUgLSBuZXh0dmFsdWUgKiAxMCk7Ci0JCXZhbHVlID0gbmV4dHZhbHVlOwotCQlidWZbaS0tXSA9IChjaGFyKShkaWdpdCArICcwJyk7Ci0JCS0tazsKLQkJaWYgKGsgPT0gMCAmJiB2YWx1ZSAmJiBpID49IDApIHsKLQkJCWsgPSAzOwotCQkJYnVmW2ktLV0gPSAnLCc7Ci0JCX0KLQl9IHdoaWxlICh2YWx1ZSAmJiBpID49IDApOworICAgIC8qIFdyaXRlIHRoZSB2YWx1ZSB3aXRoIGNvbW1hcy4gKi8KKyAgICBpID0gMjI7CisgICAgYnVmW2ktLV0gPSAnXDAnOworICAgIGJ1ZltpLS1dID0gJ1xuJzsKKyAgICBrID0gMzsKKyAgICBkbyB7CisgICAgICAgIHNpemVfdCBuZXh0dmFsdWUgPSB2YWx1ZSAvIDEwOworICAgICAgICB1aW50IGRpZ2l0ID0gKHVpbnQpKHZhbHVlIC0gbmV4dHZhbHVlICogMTApOworICAgICAgICB2YWx1ZSA9IG5leHR2YWx1ZTsKKyAgICAgICAgYnVmW2ktLV0gPSAoY2hhcikoZGlnaXQgKyAnMCcpOworICAgICAgICAtLWs7CisgICAgICAgIGlmIChrID09IDAgJiYgdmFsdWUgJiYgaSA+PSAwKSB7CisgICAgICAgICAgICBrID0gMzsKKyAgICAgICAgICAgIGJ1ZltpLS1dID0gJywnOworICAgICAgICB9CisgICAgfSB3aGlsZSAodmFsdWUgJiYgaSA+PSAwKTsKIAotCXdoaWxlIChpID49IDApCi0JCWJ1ZltpLS1dID0gJyAnOwotCWZwdXRzKGJ1Ziwgc3RkZXJyKTsKKyAgICB3aGlsZSAoaSA+PSAwKQorICAgICAgICBidWZbaS0tXSA9ICcgJzsKKyAgICBmcHV0cyhidWYsIHN0ZGVycik7CiAKLQlyZXR1cm4gb3JpZ3ZhbHVlOworICAgIHJldHVybiBvcmlndmFsdWU7CiB9CiAKIC8qIFByaW50IHN1bW1hcnkgaW5mbyB0byBzdGRlcnIgYWJvdXQgdGhlIHN0YXRlIG9mIHB5bWFsbG9jJ3Mgc3RydWN0dXJlcy4KQEAgLTE2MTQsMTQyICsxNjE0LDE0MiBAQAogdm9pZAogX1B5T2JqZWN0X0RlYnVnTWFsbG9jU3RhdHModm9pZCkKIHsKLQl1aW50IGk7Ci0JY29uc3QgdWludCBudW1jbGFzc2VzID0gU01BTExfUkVRVUVTVF9USFJFU0hPTEQgPj4gQUxJR05NRU5UX1NISUZUOwotCS8qICMgb2YgcG9vbHMsIGFsbG9jYXRlZCBibG9ja3MsIGFuZCBmcmVlIGJsb2NrcyBwZXIgY2xhc3MgaW5kZXggKi8KLQlzaXplX3QgbnVtcG9vbHNbU01BTExfUkVRVUVTVF9USFJFU0hPTEQgPj4gQUxJR05NRU5UX1NISUZUXTsKLQlzaXplX3QgbnVtYmxvY2tzW1NNQUxMX1JFUVVFU1RfVEhSRVNIT0xEID4+IEFMSUdOTUVOVF9TSElGVF07Ci0Jc2l6ZV90IG51bWZyZWVibG9ja3NbU01BTExfUkVRVUVTVF9USFJFU0hPTEQgPj4gQUxJR05NRU5UX1NISUZUXTsKLQkvKiB0b3RhbCAjIG9mIGFsbG9jYXRlZCBieXRlcyBpbiB1c2VkIGFuZCBmdWxsIHBvb2xzICovCi0Jc2l6ZV90IGFsbG9jYXRlZF9ieXRlcyA9IDA7Ci0JLyogdG90YWwgIyBvZiBhdmFpbGFibGUgYnl0ZXMgaW4gdXNlZCBwb29scyAqLwotCXNpemVfdCBhdmFpbGFibGVfYnl0ZXMgPSAwOwotCS8qICMgb2YgZnJlZSBwb29scyArIHBvb2xzIG5vdCB5ZXQgY2FydmVkIG91dCBvZiBjdXJyZW50IGFyZW5hICovCi0JdWludCBudW1mcmVlcG9vbHMgPSAwOwotCS8qICMgb2YgYnl0ZXMgZm9yIGFyZW5hIGFsaWdubWVudCBwYWRkaW5nICovCi0Jc2l6ZV90IGFyZW5hX2FsaWdubWVudCA9IDA7Ci0JLyogIyBvZiBieXRlcyBpbiB1c2VkIGFuZCBmdWxsIHBvb2xzIHVzZWQgZm9yIHBvb2xfaGVhZGVycyAqLwotCXNpemVfdCBwb29sX2hlYWRlcl9ieXRlcyA9IDA7Ci0JLyogIyBvZiBieXRlcyBpbiB1c2VkIGFuZCBmdWxsIHBvb2xzIHdhc3RlZCBkdWUgdG8gcXVhbnRpemF0aW9uLAotCSAqIGkuZS4gdGhlIG5lY2Vzc2FyaWx5IGxlZnRvdmVyIHNwYWNlIGF0IHRoZSBlbmRzIG9mIHVzZWQgYW5kCi0JICogZnVsbCBwb29scy4KLQkgKi8KLQlzaXplX3QgcXVhbnRpemF0aW9uID0gMDsKLQkvKiAjIG9mIGFyZW5hcyBhY3R1YWxseSBhbGxvY2F0ZWQuICovCi0Jc2l6ZV90IG5hcmVuYXMgPSAwOwotCS8qIHJ1bm5pbmcgdG90YWwgLS0gc2hvdWxkIGVxdWFsIG5hcmVuYXMgKiBBUkVOQV9TSVpFICovCi0Jc2l6ZV90IHRvdGFsOwotCWNoYXIgYnVmWzEyOF07CisgICAgdWludCBpOworICAgIGNvbnN0IHVpbnQgbnVtY2xhc3NlcyA9IFNNQUxMX1JFUVVFU1RfVEhSRVNIT0xEID4+IEFMSUdOTUVOVF9TSElGVDsKKyAgICAvKiAjIG9mIHBvb2xzLCBhbGxvY2F0ZWQgYmxvY2tzLCBhbmQgZnJlZSBibG9ja3MgcGVyIGNsYXNzIGluZGV4ICovCisgICAgc2l6ZV90IG51bXBvb2xzW1NNQUxMX1JFUVVFU1RfVEhSRVNIT0xEID4+IEFMSUdOTUVOVF9TSElGVF07CisgICAgc2l6ZV90IG51bWJsb2Nrc1tTTUFMTF9SRVFVRVNUX1RIUkVTSE9MRCA+PiBBTElHTk1FTlRfU0hJRlRdOworICAgIHNpemVfdCBudW1mcmVlYmxvY2tzW1NNQUxMX1JFUVVFU1RfVEhSRVNIT0xEID4+IEFMSUdOTUVOVF9TSElGVF07CisgICAgLyogdG90YWwgIyBvZiBhbGxvY2F0ZWQgYnl0ZXMgaW4gdXNlZCBhbmQgZnVsbCBwb29scyAqLworICAgIHNpemVfdCBhbGxvY2F0ZWRfYnl0ZXMgPSAwOworICAgIC8qIHRvdGFsICMgb2YgYXZhaWxhYmxlIGJ5dGVzIGluIHVzZWQgcG9vbHMgKi8KKyAgICBzaXplX3QgYXZhaWxhYmxlX2J5dGVzID0gMDsKKyAgICAvKiAjIG9mIGZyZWUgcG9vbHMgKyBwb29scyBub3QgeWV0IGNhcnZlZCBvdXQgb2YgY3VycmVudCBhcmVuYSAqLworICAgIHVpbnQgbnVtZnJlZXBvb2xzID0gMDsKKyAgICAvKiAjIG9mIGJ5dGVzIGZvciBhcmVuYSBhbGlnbm1lbnQgcGFkZGluZyAqLworICAgIHNpemVfdCBhcmVuYV9hbGlnbm1lbnQgPSAwOworICAgIC8qICMgb2YgYnl0ZXMgaW4gdXNlZCBhbmQgZnVsbCBwb29scyB1c2VkIGZvciBwb29sX2hlYWRlcnMgKi8KKyAgICBzaXplX3QgcG9vbF9oZWFkZXJfYnl0ZXMgPSAwOworICAgIC8qICMgb2YgYnl0ZXMgaW4gdXNlZCBhbmQgZnVsbCBwb29scyB3YXN0ZWQgZHVlIHRvIHF1YW50aXphdGlvbiwKKyAgICAgKiBpLmUuIHRoZSBuZWNlc3NhcmlseSBsZWZ0b3ZlciBzcGFjZSBhdCB0aGUgZW5kcyBvZiB1c2VkIGFuZAorICAgICAqIGZ1bGwgcG9vbHMuCisgICAgICovCisgICAgc2l6ZV90IHF1YW50aXphdGlvbiA9IDA7CisgICAgLyogIyBvZiBhcmVuYXMgYWN0dWFsbHkgYWxsb2NhdGVkLiAqLworICAgIHNpemVfdCBuYXJlbmFzID0gMDsKKyAgICAvKiBydW5uaW5nIHRvdGFsIC0tIHNob3VsZCBlcXVhbCBuYXJlbmFzICogQVJFTkFfU0laRSAqLworICAgIHNpemVfdCB0b3RhbDsKKyAgICBjaGFyIGJ1ZlsxMjhdOwogCi0JZnByaW50ZihzdGRlcnIsICJTbWFsbCBibG9jayB0aHJlc2hvbGQgPSAlZCwgaW4gJXUgc2l6ZSBjbGFzc2VzLlxuIiwKLQkJU01BTExfUkVRVUVTVF9USFJFU0hPTEQsIG51bWNsYXNzZXMpOworICAgIGZwcmludGYoc3RkZXJyLCAiU21hbGwgYmxvY2sgdGhyZXNob2xkID0gJWQsIGluICV1IHNpemUgY2xhc3Nlcy5cbiIsCisgICAgICAgIFNNQUxMX1JFUVVFU1RfVEhSRVNIT0xELCBudW1jbGFzc2VzKTsKIAotCWZvciAoaSA9IDA7IGkgPCBudW1jbGFzc2VzOyArK2kpCi0JCW51bXBvb2xzW2ldID0gbnVtYmxvY2tzW2ldID0gbnVtZnJlZWJsb2Nrc1tpXSA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IG51bWNsYXNzZXM7ICsraSkKKyAgICAgICAgbnVtcG9vbHNbaV0gPSBudW1ibG9ja3NbaV0gPSBudW1mcmVlYmxvY2tzW2ldID0gMDsKIAotCS8qIEJlY2F1c2UgZnVsbCBwb29scyBhcmVuJ3QgbGlua2VkIHRvIGZyb20gYW55dGhpbmcsIGl0J3MgZWFzaWVzdAotCSAqIHRvIG1hcmNoIG92ZXIgYWxsIHRoZSBhcmVuYXMuICBJZiB3ZSdyZSBsdWNreSwgbW9zdCBvZiB0aGUgbWVtb3J5Ci0JICogd2lsbCBiZSBsaXZpbmcgaW4gZnVsbCBwb29scyAtLSB3b3VsZCBiZSBhIHNoYW1lIHRvIG1pc3MgdGhlbS4KLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgbWF4YXJlbmFzOyArK2kpIHsKLQkJdWludCBwb29sc2luYXJlbmE7Ci0JCXVpbnQgajsKLQkJdXB0ciBiYXNlID0gYXJlbmFzW2ldLmFkZHJlc3M7CisgICAgLyogQmVjYXVzZSBmdWxsIHBvb2xzIGFyZW4ndCBsaW5rZWQgdG8gZnJvbSBhbnl0aGluZywgaXQncyBlYXNpZXN0CisgICAgICogdG8gbWFyY2ggb3ZlciBhbGwgdGhlIGFyZW5hcy4gIElmIHdlJ3JlIGx1Y2t5LCBtb3N0IG9mIHRoZSBtZW1vcnkKKyAgICAgKiB3aWxsIGJlIGxpdmluZyBpbiBmdWxsIHBvb2xzIC0tIHdvdWxkIGJlIGEgc2hhbWUgdG8gbWlzcyB0aGVtLgorICAgICAqLworICAgIGZvciAoaSA9IDA7IGkgPCBtYXhhcmVuYXM7ICsraSkgeworICAgICAgICB1aW50IHBvb2xzaW5hcmVuYTsKKyAgICAgICAgdWludCBqOworICAgICAgICB1cHRyIGJhc2UgPSBhcmVuYXNbaV0uYWRkcmVzczsKIAotCQkvKiBTa2lwIGFyZW5hcyB3aGljaCBhcmUgbm90IGFsbG9jYXRlZC4gKi8KLQkJaWYgKGFyZW5hc1tpXS5hZGRyZXNzID09ICh1cHRyKU5VTEwpCi0JCQljb250aW51ZTsKLQkJbmFyZW5hcyArPSAxOworICAgICAgICAvKiBTa2lwIGFyZW5hcyB3aGljaCBhcmUgbm90IGFsbG9jYXRlZC4gKi8KKyAgICAgICAgaWYgKGFyZW5hc1tpXS5hZGRyZXNzID09ICh1cHRyKU5VTEwpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgbmFyZW5hcyArPSAxOwogCi0JCXBvb2xzaW5hcmVuYSA9IGFyZW5hc1tpXS5udG90YWxwb29sczsKLQkJbnVtZnJlZXBvb2xzICs9IGFyZW5hc1tpXS5uZnJlZXBvb2xzOworICAgICAgICBwb29sc2luYXJlbmEgPSBhcmVuYXNbaV0ubnRvdGFscG9vbHM7CisgICAgICAgIG51bWZyZWVwb29scyArPSBhcmVuYXNbaV0ubmZyZWVwb29sczsKIAotCQkvKiByb3VuZCB1cCB0byBwb29sIGFsaWdubWVudCAqLwotCQlpZiAoYmFzZSAmICh1cHRyKVBPT0xfU0laRV9NQVNLKSB7Ci0JCQlhcmVuYV9hbGlnbm1lbnQgKz0gUE9PTF9TSVpFOwotCQkJYmFzZSAmPSB+KHVwdHIpUE9PTF9TSVpFX01BU0s7Ci0JCQliYXNlICs9IFBPT0xfU0laRTsKLQkJfQorICAgICAgICAvKiByb3VuZCB1cCB0byBwb29sIGFsaWdubWVudCAqLworICAgICAgICBpZiAoYmFzZSAmICh1cHRyKVBPT0xfU0laRV9NQVNLKSB7CisgICAgICAgICAgICBhcmVuYV9hbGlnbm1lbnQgKz0gUE9PTF9TSVpFOworICAgICAgICAgICAgYmFzZSAmPSB+KHVwdHIpUE9PTF9TSVpFX01BU0s7CisgICAgICAgICAgICBiYXNlICs9IFBPT0xfU0laRTsKKyAgICAgICAgfQogCi0JCS8qIHZpc2l0IGV2ZXJ5IHBvb2wgaW4gdGhlIGFyZW5hICovCi0JCWFzc2VydChiYXNlIDw9ICh1cHRyKSBhcmVuYXNbaV0ucG9vbF9hZGRyZXNzKTsKLQkJZm9yIChqID0gMDsKLQkJCSAgICBiYXNlIDwgKHVwdHIpIGFyZW5hc1tpXS5wb29sX2FkZHJlc3M7Ci0JCQkgICAgKytqLCBiYXNlICs9IFBPT0xfU0laRSkgewotCQkJcG9vbHAgcCA9IChwb29scCliYXNlOwotCQkJY29uc3QgdWludCBzeiA9IHAtPnN6aWR4OwotCQkJdWludCBmcmVlYmxvY2tzOworICAgICAgICAvKiB2aXNpdCBldmVyeSBwb29sIGluIHRoZSBhcmVuYSAqLworICAgICAgICBhc3NlcnQoYmFzZSA8PSAodXB0cikgYXJlbmFzW2ldLnBvb2xfYWRkcmVzcyk7CisgICAgICAgIGZvciAoaiA9IDA7CisgICAgICAgICAgICAgICAgICAgIGJhc2UgPCAodXB0cikgYXJlbmFzW2ldLnBvb2xfYWRkcmVzczsKKyAgICAgICAgICAgICAgICAgICAgKytqLCBiYXNlICs9IFBPT0xfU0laRSkgeworICAgICAgICAgICAgcG9vbHAgcCA9IChwb29scCliYXNlOworICAgICAgICAgICAgY29uc3QgdWludCBzeiA9IHAtPnN6aWR4OworICAgICAgICAgICAgdWludCBmcmVlYmxvY2tzOwogCi0JCQlpZiAocC0+cmVmLmNvdW50ID09IDApIHsKLQkJCQkvKiBjdXJyZW50bHkgdW51c2VkICovCi0JCQkJYXNzZXJ0KHBvb2xfaXNfaW5fbGlzdChwLCBhcmVuYXNbaV0uZnJlZXBvb2xzKSk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQkrK251bXBvb2xzW3N6XTsKLQkJCW51bWJsb2Nrc1tzel0gKz0gcC0+cmVmLmNvdW50OwotCQkJZnJlZWJsb2NrcyA9IE5VTUJMT0NLUyhzeikgLSBwLT5yZWYuY291bnQ7Ci0JCQludW1mcmVlYmxvY2tzW3N6XSArPSBmcmVlYmxvY2tzOworICAgICAgICAgICAgaWYgKHAtPnJlZi5jb3VudCA9PSAwKSB7CisgICAgICAgICAgICAgICAgLyogY3VycmVudGx5IHVudXNlZCAqLworICAgICAgICAgICAgICAgIGFzc2VydChwb29sX2lzX2luX2xpc3QocCwgYXJlbmFzW2ldLmZyZWVwb29scykpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKytudW1wb29sc1tzel07CisgICAgICAgICAgICBudW1ibG9ja3Nbc3pdICs9IHAtPnJlZi5jb3VudDsKKyAgICAgICAgICAgIGZyZWVibG9ja3MgPSBOVU1CTE9DS1Moc3opIC0gcC0+cmVmLmNvdW50OworICAgICAgICAgICAgbnVtZnJlZWJsb2Nrc1tzel0gKz0gZnJlZWJsb2NrczsKICNpZmRlZiBQeV9ERUJVRwotCQkJaWYgKGZyZWVibG9ja3MgPiAwKQotCQkJCWFzc2VydChwb29sX2lzX2luX2xpc3QocCwgdXNlZHBvb2xzW3N6ICsgc3pdKSk7CisgICAgICAgICAgICBpZiAoZnJlZWJsb2NrcyA+IDApCisgICAgICAgICAgICAgICAgYXNzZXJ0KHBvb2xfaXNfaW5fbGlzdChwLCB1c2VkcG9vbHNbc3ogKyBzel0pKTsKICNlbmRpZgotCQl9Ci0JfQotCWFzc2VydChuYXJlbmFzID09IG5hcmVuYXNfY3VycmVudGx5X2FsbG9jYXRlZCk7CisgICAgICAgIH0KKyAgICB9CisgICAgYXNzZXJ0KG5hcmVuYXMgPT0gbmFyZW5hc19jdXJyZW50bHlfYWxsb2NhdGVkKTsKIAotCWZwdXRjKCdcbicsIHN0ZGVycik7Ci0JZnB1dHMoImNsYXNzICAgc2l6ZSAgIG51bSBwb29scyAgIGJsb2NrcyBpbiB1c2UgIGF2YWlsIGJsb2Nrc1xuIgotCSAgICAgICItLS0tLSAgIC0tLS0gICAtLS0tLS0tLS0gICAtLS0tLS0tLS0tLS0tICAtLS0tLS0tLS0tLS1cbiIsCi0JCXN0ZGVycik7CisgICAgZnB1dGMoJ1xuJywgc3RkZXJyKTsKKyAgICBmcHV0cygiY2xhc3MgICBzaXplICAgbnVtIHBvb2xzICAgYmxvY2tzIGluIHVzZSAgYXZhaWwgYmxvY2tzXG4iCisgICAgICAgICAgIi0tLS0tICAgLS0tLSAgIC0tLS0tLS0tLSAgIC0tLS0tLS0tLS0tLS0gIC0tLS0tLS0tLS0tLVxuIiwKKyAgICAgICAgc3RkZXJyKTsKIAotCWZvciAoaSA9IDA7IGkgPCBudW1jbGFzc2VzOyArK2kpIHsKLQkJc2l6ZV90IHAgPSBudW1wb29sc1tpXTsKLQkJc2l6ZV90IGIgPSBudW1ibG9ja3NbaV07Ci0JCXNpemVfdCBmID0gbnVtZnJlZWJsb2Nrc1tpXTsKLQkJdWludCBzaXplID0gSU5ERVgyU0laRShpKTsKLQkJaWYgKHAgPT0gMCkgewotCQkJYXNzZXJ0KGIgPT0gMCAmJiBmID09IDApOwotCQkJY29udGludWU7Ci0JCX0KLQkJZnByaW50ZihzdGRlcnIsICIlNXUgJTZ1ICIKLQkJCQkiJTExIiBQWV9GT1JNQVRfU0laRV9UICJ1ICIKLQkJCQkiJTE1IiBQWV9GT1JNQVRfU0laRV9UICJ1ICIKLQkJCQkiJTEzIiBQWV9GT1JNQVRfU0laRV9UICJ1XG4iLAotCQkJaSwgc2l6ZSwgcCwgYiwgZik7Ci0JCWFsbG9jYXRlZF9ieXRlcyArPSBiICogc2l6ZTsKLQkJYXZhaWxhYmxlX2J5dGVzICs9IGYgKiBzaXplOwotCQlwb29sX2hlYWRlcl9ieXRlcyArPSBwICogUE9PTF9PVkVSSEVBRDsKLQkJcXVhbnRpemF0aW9uICs9IHAgKiAoKFBPT0xfU0laRSAtIFBPT0xfT1ZFUkhFQUQpICUgc2l6ZSk7Ci0JfQotCWZwdXRjKCdcbicsIHN0ZGVycik7Ci0JKHZvaWQpcHJpbnRvbmUoIiMgdGltZXMgb2JqZWN0IG1hbGxvYyBjYWxsZWQiLCBzZXJpYWxubyk7CisgICAgZm9yIChpID0gMDsgaSA8IG51bWNsYXNzZXM7ICsraSkgeworICAgICAgICBzaXplX3QgcCA9IG51bXBvb2xzW2ldOworICAgICAgICBzaXplX3QgYiA9IG51bWJsb2Nrc1tpXTsKKyAgICAgICAgc2l6ZV90IGYgPSBudW1mcmVlYmxvY2tzW2ldOworICAgICAgICB1aW50IHNpemUgPSBJTkRFWDJTSVpFKGkpOworICAgICAgICBpZiAocCA9PSAwKSB7CisgICAgICAgICAgICBhc3NlcnQoYiA9PSAwICYmIGYgPT0gMCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiU1dSAlNnUgIgorICAgICAgICAgICAgICAgICAgICAgICAgIiUxMSIgUFlfRk9STUFUX1NJWkVfVCAidSAiCisgICAgICAgICAgICAgICAgICAgICAgICAiJTE1IiBQWV9GT1JNQVRfU0laRV9UICJ1ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICIlMTMiIFBZX0ZPUk1BVF9TSVpFX1QgInVcbiIsCisgICAgICAgICAgICBpLCBzaXplLCBwLCBiLCBmKTsKKyAgICAgICAgYWxsb2NhdGVkX2J5dGVzICs9IGIgKiBzaXplOworICAgICAgICBhdmFpbGFibGVfYnl0ZXMgKz0gZiAqIHNpemU7CisgICAgICAgIHBvb2xfaGVhZGVyX2J5dGVzICs9IHAgKiBQT09MX09WRVJIRUFEOworICAgICAgICBxdWFudGl6YXRpb24gKz0gcCAqICgoUE9PTF9TSVpFIC0gUE9PTF9PVkVSSEVBRCkgJSBzaXplKTsKKyAgICB9CisgICAgZnB1dGMoJ1xuJywgc3RkZXJyKTsKKyAgICAodm9pZClwcmludG9uZSgiIyB0aW1lcyBvYmplY3QgbWFsbG9jIGNhbGxlZCIsIHNlcmlhbG5vKTsKIAotCSh2b2lkKXByaW50b25lKCIjIGFyZW5hcyBhbGxvY2F0ZWQgdG90YWwiLCBudGltZXNfYXJlbmFfYWxsb2NhdGVkKTsKLQkodm9pZClwcmludG9uZSgiIyBhcmVuYXMgcmVjbGFpbWVkIiwgbnRpbWVzX2FyZW5hX2FsbG9jYXRlZCAtIG5hcmVuYXMpOwotCSh2b2lkKXByaW50b25lKCIjIGFyZW5hcyBoaWdod2F0ZXIgbWFyayIsIG5hcmVuYXNfaGlnaHdhdGVyKTsKLQkodm9pZClwcmludG9uZSgiIyBhcmVuYXMgYWxsb2NhdGVkIGN1cnJlbnQiLCBuYXJlbmFzKTsKKyAgICAodm9pZClwcmludG9uZSgiIyBhcmVuYXMgYWxsb2NhdGVkIHRvdGFsIiwgbnRpbWVzX2FyZW5hX2FsbG9jYXRlZCk7CisgICAgKHZvaWQpcHJpbnRvbmUoIiMgYXJlbmFzIHJlY2xhaW1lZCIsIG50aW1lc19hcmVuYV9hbGxvY2F0ZWQgLSBuYXJlbmFzKTsKKyAgICAodm9pZClwcmludG9uZSgiIyBhcmVuYXMgaGlnaHdhdGVyIG1hcmsiLCBuYXJlbmFzX2hpZ2h3YXRlcik7CisgICAgKHZvaWQpcHJpbnRvbmUoIiMgYXJlbmFzIGFsbG9jYXRlZCBjdXJyZW50IiwgbmFyZW5hcyk7CiAKLQlQeU9TX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksCi0JCSIlIiBQWV9GT1JNQVRfU0laRV9UICJ1IGFyZW5hcyAqICVkIGJ5dGVzL2FyZW5hIiwKLQkJbmFyZW5hcywgQVJFTkFfU0laRSk7Ci0JKHZvaWQpcHJpbnRvbmUoYnVmLCBuYXJlbmFzICogQVJFTkFfU0laRSk7CisgICAgUHlPU19zbnByaW50ZihidWYsIHNpemVvZihidWYpLAorICAgICAgICAiJSIgUFlfRk9STUFUX1NJWkVfVCAidSBhcmVuYXMgKiAlZCBieXRlcy9hcmVuYSIsCisgICAgICAgIG5hcmVuYXMsIEFSRU5BX1NJWkUpOworICAgICh2b2lkKXByaW50b25lKGJ1ZiwgbmFyZW5hcyAqIEFSRU5BX1NJWkUpOwogCi0JZnB1dGMoJ1xuJywgc3RkZXJyKTsKKyAgICBmcHV0YygnXG4nLCBzdGRlcnIpOwogCi0JdG90YWwgPSBwcmludG9uZSgiIyBieXRlcyBpbiBhbGxvY2F0ZWQgYmxvY2tzIiwgYWxsb2NhdGVkX2J5dGVzKTsKLQl0b3RhbCArPSBwcmludG9uZSgiIyBieXRlcyBpbiBhdmFpbGFibGUgYmxvY2tzIiwgYXZhaWxhYmxlX2J5dGVzKTsKKyAgICB0b3RhbCA9IHByaW50b25lKCIjIGJ5dGVzIGluIGFsbG9jYXRlZCBibG9ja3MiLCBhbGxvY2F0ZWRfYnl0ZXMpOworICAgIHRvdGFsICs9IHByaW50b25lKCIjIGJ5dGVzIGluIGF2YWlsYWJsZSBibG9ja3MiLCBhdmFpbGFibGVfYnl0ZXMpOwogCi0JUHlPU19zbnByaW50ZihidWYsIHNpemVvZihidWYpLAotCQkiJXUgdW51c2VkIHBvb2xzICogJWQgYnl0ZXMiLCBudW1mcmVlcG9vbHMsIFBPT0xfU0laRSk7Ci0JdG90YWwgKz0gcHJpbnRvbmUoYnVmLCAoc2l6ZV90KW51bWZyZWVwb29scyAqIFBPT0xfU0laRSk7CisgICAgUHlPU19zbnByaW50ZihidWYsIHNpemVvZihidWYpLAorICAgICAgICAiJXUgdW51c2VkIHBvb2xzICogJWQgYnl0ZXMiLCBudW1mcmVlcG9vbHMsIFBPT0xfU0laRSk7CisgICAgdG90YWwgKz0gcHJpbnRvbmUoYnVmLCAoc2l6ZV90KW51bWZyZWVwb29scyAqIFBPT0xfU0laRSk7CiAKLQl0b3RhbCArPSBwcmludG9uZSgiIyBieXRlcyBsb3N0IHRvIHBvb2wgaGVhZGVycyIsIHBvb2xfaGVhZGVyX2J5dGVzKTsKLQl0b3RhbCArPSBwcmludG9uZSgiIyBieXRlcyBsb3N0IHRvIHF1YW50aXphdGlvbiIsIHF1YW50aXphdGlvbik7Ci0JdG90YWwgKz0gcHJpbnRvbmUoIiMgYnl0ZXMgbG9zdCB0byBhcmVuYSBhbGlnbm1lbnQiLCBhcmVuYV9hbGlnbm1lbnQpOwotCSh2b2lkKXByaW50b25lKCJUb3RhbCIsIHRvdGFsKTsKKyAgICB0b3RhbCArPSBwcmludG9uZSgiIyBieXRlcyBsb3N0IHRvIHBvb2wgaGVhZGVycyIsIHBvb2xfaGVhZGVyX2J5dGVzKTsKKyAgICB0b3RhbCArPSBwcmludG9uZSgiIyBieXRlcyBsb3N0IHRvIHF1YW50aXphdGlvbiIsIHF1YW50aXphdGlvbik7CisgICAgdG90YWwgKz0gcHJpbnRvbmUoIiMgYnl0ZXMgbG9zdCB0byBhcmVuYSBhbGlnbm1lbnQiLCBhcmVuYV9hbGlnbm1lbnQpOworICAgICh2b2lkKXByaW50b25lKCJUb3RhbCIsIHRvdGFsKTsKIH0KIAotI2VuZGlmCS8qIFBZTUFMTE9DX0RFQlVHICovCisjZW5kaWYgIC8qIFBZTUFMTE9DX0RFQlVHICovCiAKICNpZmRlZiBQeV9VU0lOR19NRU1PUllfREVCVUdHRVIKIC8qIE1ha2UgdGhpcyBmdW5jdGlvbiBsYXN0IHNvIGdjYyB3b24ndCBpbmxpbmUgaXQgc2luY2UgdGhlIGRlZmluaXRpb24gaXMKQEAgLTE3NTgsOCArMTc1OCw4IEBACiBpbnQKIFB5X0FERFJFU1NfSU5fUkFOR0Uodm9pZCAqUCwgcG9vbHAgcG9vbCkKIHsKLQlyZXR1cm4gcG9vbC0+YXJlbmFpbmRleCA8IG1heGFyZW5hcyAmJgotCSAgICAgICAodXB0cilQIC0gYXJlbmFzW3Bvb2wtPmFyZW5haW5kZXhdLmFkZHJlc3MgPCAodXB0cilBUkVOQV9TSVpFICYmCi0JICAgICAgIGFyZW5hc1twb29sLT5hcmVuYWluZGV4XS5hZGRyZXNzICE9IDA7CisgICAgcmV0dXJuIHBvb2wtPmFyZW5haW5kZXggPCBtYXhhcmVuYXMgJiYKKyAgICAgICAgICAgKHVwdHIpUCAtIGFyZW5hc1twb29sLT5hcmVuYWluZGV4XS5hZGRyZXNzIDwgKHVwdHIpQVJFTkFfU0laRSAmJgorICAgICAgICAgICBhcmVuYXNbcG9vbC0+YXJlbmFpbmRleF0uYWRkcmVzcyAhPSAwOwogfQogI2VuZGlmCmRpZmYgLS1naXQgYS9PYmplY3RzL3Jhbmdlb2JqZWN0LmMgYi9PYmplY3RzL3Jhbmdlb2JqZWN0LmMKaW5kZXggZjQ1Yjc3MS4uNGU2NGRiYSAxMDA2NDQKLS0tIGEvT2JqZWN0cy9yYW5nZW9iamVjdC5jCisrKyBiL09iamVjdHMvcmFuZ2VvYmplY3QuYwpAQCAtMywxMCArMywxMCBAQAogI2luY2x1ZGUgIlB5dGhvbi5oIgogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCWxvbmcJc3RhcnQ7Ci0JbG9uZwlzdGVwOwotCWxvbmcJbGVuOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBsb25nICAgICAgICBzdGFydDsKKyAgICBsb25nICAgICAgICBzdGVwOworICAgIGxvbmcgICAgICAgIGxlbjsKIH0gcmFuZ2VvYmplY3Q7CiAKIC8qIFJldHVybiBudW1iZXIgb2YgaXRlbXMgaW4gcmFuZ2UgKGxvLCBoaSwgc3RlcCkuICBzdGVwICE9IDAKQEAgLTMwLDUzICszMCw1MyBAQAogICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICAgYXNzZXJ0KHN0ZXAgIT0gMCk7CiAgICAgaWYgKHN0ZXAgPiAwICYmIGxvIDwgaGkpCi0gICAgICAgIHJldHVybiAxVUwgKyAoaGkgLSAxVUwgLSBsbykgLyBzdGVwOworICAgIHJldHVybiAxVUwgKyAoaGkgLSAxVUwgLSBsbykgLyBzdGVwOwogICAgIGVsc2UgaWYgKHN0ZXAgPCAwICYmIGxvID4gaGkpCi0gICAgICAgIHJldHVybiAxVUwgKyAobG8gLSAxVUwgLSBoaSkgLyAoMFVMIC0gc3RlcCk7CisgICAgcmV0dXJuIDFVTCArIChsbyAtIDFVTCAtIGhpKSAvICgwVUwgLSBzdGVwKTsKICAgICBlbHNlCi0gICAgICAgIHJldHVybiAwVUw7CisgICAgcmV0dXJuIDBVTDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHJhbmdlX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3cpCiB7Ci0JcmFuZ2VvYmplY3QgKm9iajsKLQlsb25nIGlsb3cgPSAwLCBpaGlnaCA9IDAsIGlzdGVwID0gMTsKLQl1bnNpZ25lZCBsb25nIG47CisgICAgcmFuZ2VvYmplY3QgKm9iajsKKyAgICBsb25nIGlsb3cgPSAwLCBpaGlnaCA9IDAsIGlzdGVwID0gMTsKKyAgICB1bnNpZ25lZCBsb25nIG47CiAKLQlpZiAoIV9QeUFyZ19Ob0tleXdvcmRzKCJ4cmFuZ2UoKSIsIGt3KSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFfUHlBcmdfTm9LZXl3b3JkcygieHJhbmdlKCkiLCBrdykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKFB5VHVwbGVfU2l6ZShhcmdzKSA8PSAxKSB7Ci0JCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLAotCQkJCSJsO3hyYW5nZSgpIHJlcXVpcmVzIDEtMyBpbnQgYXJndW1lbnRzIiwKLQkJCQkmaWhpZ2gpKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCWVsc2UgewotCQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywKLQkJCQkibGx8bDt4cmFuZ2UoKSByZXF1aXJlcyAxLTMgaW50IGFyZ3VtZW50cyIsCi0JCQkJJmlsb3csICZpaGlnaCwgJmlzdGVwKSkKLQkJCXJldHVybiBOVUxMOwotCX0KLQlpZiAoaXN0ZXAgPT0gMCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgInhyYW5nZSgpIGFyZyAzIG11c3Qgbm90IGJlIHplcm8iKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCW4gPSBnZXRfbGVuX29mX3JhbmdlKGlsb3csIGloaWdoLCBpc3RlcCk7Ci0JaWYgKG4gPiAodW5zaWduZWQgbG9uZylMT05HX01BWCB8fCAobG9uZyluID4gUFlfU1NJWkVfVF9NQVgpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0JCQkJInhyYW5nZSgpIHJlc3VsdCBoYXMgdG9vIG1hbnkgaXRlbXMiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChQeVR1cGxlX1NpemUoYXJncykgPD0gMSkgeworICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICJsO3hyYW5nZSgpIHJlcXVpcmVzIDEtMyBpbnQgYXJndW1lbnRzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICZpaGlnaCkpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgImxsfGw7eHJhbmdlKCkgcmVxdWlyZXMgMS0zIGludCBhcmd1bWVudHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgJmlsb3csICZpaGlnaCwgJmlzdGVwKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoaXN0ZXAgPT0gMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgInhyYW5nZSgpIGFyZyAzIG11c3Qgbm90IGJlIHplcm8iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIG4gPSBnZXRfbGVuX29mX3JhbmdlKGlsb3csIGloaWdoLCBpc3RlcCk7CisgICAgaWYgKG4gPiAodW5zaWduZWQgbG9uZylMT05HX01BWCB8fCAobG9uZyluID4gUFlfU1NJWkVfVF9NQVgpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAieHJhbmdlKCkgcmVzdWx0IGhhcyB0b28gbWFueSBpdGVtcyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlvYmogPSBQeU9iamVjdF9OZXcocmFuZ2VvYmplY3QsICZQeVJhbmdlX1R5cGUpOwotCWlmIChvYmogPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0Jb2JqLT5zdGFydCA9IGlsb3c7Ci0Jb2JqLT5sZW4gICA9IChsb25nKW47Ci0Jb2JqLT5zdGVwICA9IGlzdGVwOwotCXJldHVybiAoUHlPYmplY3QgKikgb2JqOworICAgIG9iaiA9IFB5T2JqZWN0X05ldyhyYW5nZW9iamVjdCwgJlB5UmFuZ2VfVHlwZSk7CisgICAgaWYgKG9iaiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBvYmotPnN0YXJ0ID0gaWxvdzsKKyAgICBvYmotPmxlbiAgID0gKGxvbmcpbjsKKyAgICBvYmotPnN0ZXAgID0gaXN0ZXA7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKSBvYmo7CiB9CiAKIFB5RG9jX1NUUlZBUihyYW5nZV9kb2MsCkBAIC04OSw2MCArODksNjAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiByYW5nZV9pdGVtKHJhbmdlb2JqZWN0ICpyLCBQeV9zc2l6ZV90IGkpCiB7Ci0JaWYgKGkgPCAwIHx8IGkgPj0gci0+bGVuKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLAotCQkJCSJ4cmFuZ2Ugb2JqZWN0IGluZGV4IG91dCBvZiByYW5nZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JLyogZG8gY2FsY3VsYXRpb24gZW50aXJlbHkgdXNpbmcgdW5zaWduZWQgbG9uZ3MsIHRvIGF2b2lkCi0JICAgdW5kZWZpbmVkIGJlaGF2aW91ciBkdWUgdG8gc2lnbmVkIG92ZXJmbG93LiAqLwotCXJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZykoci0+c3RhcnQgKyAodW5zaWduZWQgbG9uZylpICogci0+c3RlcCkpOworICAgIGlmIChpIDwgMCB8fCBpID49IHItPmxlbikgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ4cmFuZ2Ugb2JqZWN0IGluZGV4IG91dCBvZiByYW5nZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgLyogZG8gY2FsY3VsYXRpb24gZW50aXJlbHkgdXNpbmcgdW5zaWduZWQgbG9uZ3MsIHRvIGF2b2lkCisgICAgICAgdW5kZWZpbmVkIGJlaGF2aW91ciBkdWUgdG8gc2lnbmVkIG92ZXJmbG93LiAqLworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZykoci0+c3RhcnQgKyAodW5zaWduZWQgbG9uZylpICogci0+c3RlcCkpOwogfQogCiBzdGF0aWMgUHlfc3NpemVfdAogcmFuZ2VfbGVuZ3RoKHJhbmdlb2JqZWN0ICpyKQogewotCXJldHVybiAoUHlfc3NpemVfdCkoci0+bGVuKTsKKyAgICByZXR1cm4gKFB5X3NzaXplX3QpKHItPmxlbik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiByYW5nZV9yZXByKHJhbmdlb2JqZWN0ICpyKQogewotCVB5T2JqZWN0ICpydG47CisgICAgUHlPYmplY3QgKnJ0bjsKIAotCWlmIChyLT5zdGFydCA9PSAwICYmIHItPnN0ZXAgPT0gMSkKLQkJcnRuID0gUHlTdHJpbmdfRnJvbUZvcm1hdCgieHJhbmdlKCVsZCkiLAotCQkJCQkgIHItPnN0YXJ0ICsgci0+bGVuICogci0+c3RlcCk7CisgICAgaWYgKHItPnN0YXJ0ID09IDAgJiYgci0+c3RlcCA9PSAxKQorICAgICAgICBydG4gPSBQeVN0cmluZ19Gcm9tRm9ybWF0KCJ4cmFuZ2UoJWxkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci0+c3RhcnQgKyByLT5sZW4gKiByLT5zdGVwKTsKIAotCWVsc2UgaWYgKHItPnN0ZXAgPT0gMSkKLQkJcnRuID0gUHlTdHJpbmdfRnJvbUZvcm1hdCgieHJhbmdlKCVsZCwgJWxkKSIsCi0JCQkJCSAgci0+c3RhcnQsCi0JCQkJCSAgci0+c3RhcnQgKyByLT5sZW4gKiByLT5zdGVwKTsKKyAgICBlbHNlIGlmIChyLT5zdGVwID09IDEpCisgICAgICAgIHJ0biA9IFB5U3RyaW5nX0Zyb21Gb3JtYXQoInhyYW5nZSglbGQsICVsZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHItPnN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHItPnN0YXJ0ICsgci0+bGVuICogci0+c3RlcCk7CiAKLQllbHNlCi0JCXJ0biA9IFB5U3RyaW5nX0Zyb21Gb3JtYXQoInhyYW5nZSglbGQsICVsZCwgJWxkKSIsCi0JCQkJCSAgci0+c3RhcnQsCi0JCQkJCSAgci0+c3RhcnQgKyByLT5sZW4gKiByLT5zdGVwLAotCQkJCQkgIHItPnN0ZXApOwotCXJldHVybiBydG47CisgICAgZWxzZQorICAgICAgICBydG4gPSBQeVN0cmluZ19Gcm9tRm9ybWF0KCJ4cmFuZ2UoJWxkLCAlbGQsICVsZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHItPnN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHItPnN0YXJ0ICsgci0+bGVuICogci0+c3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLT5zdGVwKTsKKyAgICByZXR1cm4gcnRuOwogfQogCiAvKiBQaWNrbGluZyBzdXBwb3J0ICovCiBzdGF0aWMgUHlPYmplY3QgKgogcmFuZ2VfcmVkdWNlKHJhbmdlb2JqZWN0ICpyLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKE8oaWlpKSkiLCBQeV9UWVBFKHIpLAotCQkJICAgICByLT5zdGFydCwKLQkJCSAgICAgci0+c3RhcnQgKyByLT5sZW4gKiByLT5zdGVwLAotCQkJICAgICByLT5zdGVwKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKE8oaWlpKSkiLCBQeV9UWVBFKHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHItPnN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHItPnN0YXJ0ICsgci0+bGVuICogci0+c3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICByLT5zdGVwKTsKIH0KIAogc3RhdGljIFB5U2VxdWVuY2VNZXRob2RzIHJhbmdlX2FzX3NlcXVlbmNlID0gewotCShsZW5mdW5jKXJhbmdlX2xlbmd0aCwJLyogc3FfbGVuZ3RoICovCi0JMCwJCQkvKiBzcV9jb25jYXQgKi8KLQkwLAkJCS8qIHNxX3JlcGVhdCAqLwotCShzc2l6ZWFyZ2Z1bmMpcmFuZ2VfaXRlbSwgLyogc3FfaXRlbSAqLwotCTAsCQkJLyogc3Ffc2xpY2UgKi8KKyAgICAobGVuZnVuYylyYW5nZV9sZW5ndGgsICAgICAgLyogc3FfbGVuZ3RoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNxX2NvbmNhdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzcV9yZXBlYXQgKi8KKyAgICAoc3NpemVhcmdmdW5jKXJhbmdlX2l0ZW0sIC8qIHNxX2l0ZW0gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3Ffc2xpY2UgKi8KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqIHJhbmdlX2l0ZXIoUHlPYmplY3QgKnNlcSk7CkBAIC0xNTIsMTcxICsxNTIsMTcxIEBACiAiUmV0dXJucyBhIHJldmVyc2UgaXRlcmF0b3IuIik7CiAKIHN0YXRpYyBQeU1ldGhvZERlZiByYW5nZV9tZXRob2RzW10gPSB7Ci0JeyJfX3JldmVyc2VkX18iLAkoUHlDRnVuY3Rpb24pcmFuZ2VfcmV2ZXJzZSwgTUVUSF9OT0FSR1MsIHJldmVyc2VfZG9jfSwKLQl7Il9fcmVkdWNlX18iLAkJKFB5Q0Z1bmN0aW9uKXJhbmdlX3JlZHVjZSwgTUVUSF9WQVJBUkdTfSwKLSAJe05VTEwsCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7Il9fcmV2ZXJzZWRfXyIsICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXJhbmdlX3JldmVyc2UsIE1FVEhfTk9BUkdTLCByZXZlcnNlX2RvY30sCisgICAgeyJfX3JlZHVjZV9fIiwgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilyYW5nZV9yZWR1Y2UsIE1FVEhfVkFSQVJHU30sCisgICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIFB5VHlwZU9iamVjdCBQeVJhbmdlX1R5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSkKLQkwLAkJCS8qIE51bWJlciBvZiBpdGVtcyBmb3IgdmFyb2JqZWN0ICovCi0JInhyYW5nZSIsCQkvKiBOYW1lIG9mIHRoaXMgdHlwZSAqLwotCXNpemVvZihyYW5nZW9iamVjdCksCS8qIEJhc2ljIG9iamVjdCBzaXplICovCi0JMCwJCQkvKiBJdGVtIHNpemUgZm9yIHZhcm9iamVjdCAqLwotCShkZXN0cnVjdG9yKVB5T2JqZWN0X0RlbCwgLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCS8qIHRwX2NvbXBhcmUgKi8KLQkocmVwcmZ1bmMpcmFuZ2VfcmVwciwJLyogdHBfcmVwciAqLwotCTAsCQkJLyogdHBfYXNfbnVtYmVyICovCi0JJnJhbmdlX2FzX3NlcXVlbmNlLAkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJLyogdHBfY2FsbCAqLwotCTAsCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCwJLyogdHBfZmxhZ3MgKi8KLQlyYW5nZV9kb2MsCQkvKiB0cF9kb2MgKi8KLQkwLAkJCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkvKiB0cF9jbGVhciAqLwotCTAsCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JcmFuZ2VfaXRlciwJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCS8qIHRwX2l0ZXJuZXh0ICovCi0JcmFuZ2VfbWV0aG9kcywJCS8qIHRwX21ldGhvZHMgKi8KLQkwLAkJCS8qIHRwX21lbWJlcnMgKi8KLQkwLAkJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJLyogdHBfZGljdCAqLwotCTAsCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkvKiB0cF9kZXNjcl9zZXQgKi8KLQkwLAkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQkwLAkJCS8qIHRwX2luaXQgKi8KLQkwLAkJCS8qIHRwX2FsbG9jICovCi0JcmFuZ2VfbmV3LAkJLyogdHBfbmV3ICovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSkKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGl0ZW1zIGZvciB2YXJvYmplY3QgKi8KKyAgICAieHJhbmdlIiwgICAgICAgICAgICAgICAgICAgLyogTmFtZSBvZiB0aGlzIHR5cGUgKi8KKyAgICBzaXplb2YocmFuZ2VvYmplY3QpLCAgICAgICAgLyogQmFzaWMgb2JqZWN0IHNpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSXRlbSBzaXplIGZvciB2YXJvYmplY3QgKi8KKyAgICAoZGVzdHJ1Y3RvcilQeU9iamVjdF9EZWwsIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAocmVwcmZ1bmMpcmFuZ2VfcmVwciwgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAmcmFuZ2VfYXNfc2VxdWVuY2UsICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQsICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICByYW5nZV9kb2MsICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgcmFuZ2VfaXRlciwgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICByYW5nZV9tZXRob2RzLCAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICByYW5nZV9uZXcsICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCiB9OwogCiAvKioqKioqKioqKioqKioqKioqKioqKiogWHJhbmdlIEl0ZXJhdG9yICoqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCWxvbmcJaW5kZXg7Ci0JbG9uZwlzdGFydDsKLQlsb25nCXN0ZXA7Ci0JbG9uZwlsZW47CisgICAgUHlPYmplY3RfSEVBRAorICAgIGxvbmcgICAgICAgIGluZGV4OworICAgIGxvbmcgICAgICAgIHN0YXJ0OworICAgIGxvbmcgICAgICAgIHN0ZXA7CisgICAgbG9uZyAgICAgICAgbGVuOwogfSByYW5nZWl0ZXJvYmplY3Q7CiAKIHN0YXRpYyBQeU9iamVjdCAqCiByYW5nZWl0ZXJfbmV4dChyYW5nZWl0ZXJvYmplY3QgKnIpCiB7Ci0JaWYgKHItPmluZGV4IDwgci0+bGVuKQotCQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoci0+c3RhcnQgKyAoci0+aW5kZXgrKykgKiByLT5zdGVwKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoci0+aW5kZXggPCByLT5sZW4pCisgICAgICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhyLT5zdGFydCArIChyLT5pbmRleCsrKSAqIHItPnN0ZXApOworICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogcmFuZ2VpdGVyX2xlbihyYW5nZWl0ZXJvYmplY3QgKnIpCiB7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKHItPmxlbiAtIHItPmluZGV4KTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoci0+bGVuIC0gci0+aW5kZXgpOwogfQogCiBQeURvY19TVFJWQVIobGVuZ3RoX2hpbnRfZG9jLCAiUHJpdmF0ZSBtZXRob2QgcmV0dXJuaW5nIGFuIGVzdGltYXRlIG9mIGxlbihsaXN0KGl0KSkuIik7CiAKIHN0YXRpYyBQeU1ldGhvZERlZiByYW5nZWl0ZXJfbWV0aG9kc1tdID0gewotCXsiX19sZW5ndGhfaGludF9fIiwgKFB5Q0Z1bmN0aW9uKXJhbmdlaXRlcl9sZW4sIE1FVEhfTk9BUkdTLCBsZW5ndGhfaGludF9kb2N9LAotIAl7TlVMTCwJCU5VTEx9CQkvKiBzZW50aW5lbCAqLworICAgIHsiX19sZW5ndGhfaGludF9fIiwgKFB5Q0Z1bmN0aW9uKXJhbmdlaXRlcl9sZW4sIE1FVEhfTk9BUkdTLCBsZW5ndGhfaGludF9kb2N9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IFB5cmFuZ2VpdGVyX1R5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSkKLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb2Jfc2l6ZSAqLwotCSJyYW5nZWl0ZXJhdG9yIiwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCi0Jc2l6ZW9mKHJhbmdlaXRlcm9iamVjdCksICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcilQeU9iamVjdF9EZWwsCQkvKiB0cF9kZWFsbG9jICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQsCQkJLyogdHBfZmxhZ3MgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCi0JMCwJCQkJCS8qIHRwX3RyYXZlcnNlICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JUHlPYmplY3RfU2VsZkl0ZXIsCQkJLyogdHBfaXRlciAqLwotCShpdGVybmV4dGZ1bmMpcmFuZ2VpdGVyX25leHQsCQkvKiB0cF9pdGVybmV4dCAqLwotCXJhbmdlaXRlcl9tZXRob2RzLAkJCS8qIHRwX21ldGhvZHMgKi8KLQkwLAorICAgIFB5T2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUpCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9iX3NpemUgKi8KKyAgICAicmFuZ2VpdGVyYXRvciIsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgIHNpemVvZihyYW5nZWl0ZXJvYmplY3QpLCAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpUHlPYmplY3RfRGVsLCAgICAgICAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mbGFncyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgUHlPYmplY3RfU2VsZkl0ZXIsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgKGl0ZXJuZXh0ZnVuYylyYW5nZWl0ZXJfbmV4dCwgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIHJhbmdlaXRlcl9tZXRob2RzLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsCiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKgogcmFuZ2VfaXRlcihQeU9iamVjdCAqc2VxKQogewotCXJhbmdlaXRlcm9iamVjdCAqaXQ7CisgICAgcmFuZ2VpdGVyb2JqZWN0ICppdDsKIAotCWlmICghUHlSYW5nZV9DaGVjayhzZXEpKSB7Ci0JCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaXQgPSBQeU9iamVjdF9OZXcocmFuZ2VpdGVyb2JqZWN0LCAmUHlyYW5nZWl0ZXJfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWl0LT5pbmRleCA9IDA7Ci0JaXQtPnN0YXJ0ID0gKChyYW5nZW9iamVjdCAqKXNlcSktPnN0YXJ0OwotCWl0LT5zdGVwID0gKChyYW5nZW9iamVjdCAqKXNlcSktPnN0ZXA7Ci0JaXQtPmxlbiA9ICgocmFuZ2VvYmplY3QgKilzZXEpLT5sZW47Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIGlmICghUHlSYW5nZV9DaGVjayhzZXEpKSB7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaXQgPSBQeU9iamVjdF9OZXcocmFuZ2VpdGVyb2JqZWN0LCAmUHlyYW5nZWl0ZXJfVHlwZSk7CisgICAgaWYgKGl0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGl0LT5pbmRleCA9IDA7CisgICAgaXQtPnN0YXJ0ID0gKChyYW5nZW9iamVjdCAqKXNlcSktPnN0YXJ0OworICAgIGl0LT5zdGVwID0gKChyYW5nZW9iamVjdCAqKXNlcSktPnN0ZXA7CisgICAgaXQtPmxlbiA9ICgocmFuZ2VvYmplY3QgKilzZXEpLT5sZW47CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogcmFuZ2VfcmV2ZXJzZShQeU9iamVjdCAqc2VxKQogewotCXJhbmdlaXRlcm9iamVjdCAqaXQ7Ci0JbG9uZyBzdGFydCwgc3RlcCwgbGVuOworICAgIHJhbmdlaXRlcm9iamVjdCAqaXQ7CisgICAgbG9uZyBzdGFydCwgc3RlcCwgbGVuOwogCi0JaWYgKCFQeVJhbmdlX0NoZWNrKHNlcSkpIHsKLQkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpdCA9IFB5T2JqZWN0X05ldyhyYW5nZWl0ZXJvYmplY3QsICZQeXJhbmdlaXRlcl9UeXBlKTsKLQlpZiAoaXQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeVJhbmdlX0NoZWNrKHNlcSkpIHsKKyAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpdCA9IFB5T2JqZWN0X05ldyhyYW5nZWl0ZXJvYmplY3QsICZQeXJhbmdlaXRlcl9UeXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlzdGFydCA9ICgocmFuZ2VvYmplY3QgKilzZXEpLT5zdGFydDsKLQlzdGVwID0gKChyYW5nZW9iamVjdCAqKXNlcSktPnN0ZXA7Ci0JbGVuID0gKChyYW5nZW9iamVjdCAqKXNlcSktPmxlbjsKKyAgICBzdGFydCA9ICgocmFuZ2VvYmplY3QgKilzZXEpLT5zdGFydDsKKyAgICBzdGVwID0gKChyYW5nZW9iamVjdCAqKXNlcSktPnN0ZXA7CisgICAgbGVuID0gKChyYW5nZW9iamVjdCAqKXNlcSktPmxlbjsKIAotCWl0LT5pbmRleCA9IDA7Ci0JaXQtPmxlbiA9IGxlbjsKLQkvKiB0aGUgY2FzdHMgYmVsb3cgZ3VhcmQgYWdhaW5zdCBzaWduZWQgb3ZlcmZsb3cgYnkgdHVybmluZyBpdAotCSAgIGludG8gdW5zaWduZWQgb3ZlcmZsb3cgaW5zdGVhZC4gIFRoZSBjb3JyZWN0bmVzcyBvZiB0aGlzCi0JICAgY29kZSBzdGlsbCBkZXBlbmRzIG9uIGNvbnZlcnNpb24gZnJvbSB1bnNpZ25lZCBsb25nIHRvIGxvbmcKLQkgICB3cmFwcGluZyBtb2R1bG8gVUxPTkdfTUFYKzEsIHdoaWNoIGlzbid0IGd1YXJhbnRlZWQgKHNlZQotCSAgIEM5OSA2LjMuMS4zcDMpIGJ1dCBzZWVtcyB0byBob2xkIGluIHByYWN0aWNlIGZvciBhbGwKLQkgICBwbGF0Zm9ybXMgd2UncmUgbGlrZWx5IHRvIG1lZXQuCisgICAgaXQtPmluZGV4ID0gMDsKKyAgICBpdC0+bGVuID0gbGVuOworICAgIC8qIHRoZSBjYXN0cyBiZWxvdyBndWFyZCBhZ2FpbnN0IHNpZ25lZCBvdmVyZmxvdyBieSB0dXJuaW5nIGl0CisgICAgICAgaW50byB1bnNpZ25lZCBvdmVyZmxvdyBpbnN0ZWFkLiAgVGhlIGNvcnJlY3RuZXNzIG9mIHRoaXMKKyAgICAgICBjb2RlIHN0aWxsIGRlcGVuZHMgb24gY29udmVyc2lvbiBmcm9tIHVuc2lnbmVkIGxvbmcgdG8gbG9uZworICAgICAgIHdyYXBwaW5nIG1vZHVsbyBVTE9OR19NQVgrMSwgd2hpY2ggaXNuJ3QgZ3VhcmFudGVlZCAoc2VlCisgICAgICAgQzk5IDYuMy4xLjNwMykgYnV0IHNlZW1zIHRvIGhvbGQgaW4gcHJhY3RpY2UgZm9yIGFsbAorICAgICAgIHBsYXRmb3JtcyB3ZSdyZSBsaWtlbHkgdG8gbWVldC4KIAotCSAgIElmIHN0ZXAgPT0gTE9OR19NSU4gdGhlbiB3ZSBzdGlsbCBlbmQgdXAgd2l0aCBMT05HX01JTgotCSAgIGFmdGVyIG5lZ2F0aW9uOyBidXQgdGhpcyB3b3JrcyBvdXQsIHNpbmNlIHdlJ3ZlIHN0aWxsIGdvdAotCSAgIHRoZSBjb3JyZWN0IHZhbHVlIG1vZHVsbyBVTE9OR19NQVgrMSwgYW5kIHRoZSByYW5nZV9pdGVtCi0JICAgY2FsY3VsYXRpb24gaXMgYWxzbyBkb25lIG1vZHVsbyBVTE9OR19NQVgrMS4KLQkqLwotCWl0LT5zdGFydCA9IChsb25nKShzdGFydCArICh1bnNpZ25lZCBsb25nKShsZW4tMSkgKiBzdGVwKTsKLQlpdC0+c3RlcCA9IChsb25nKSgwVUwtc3RlcCk7CisgICAgICAgSWYgc3RlcCA9PSBMT05HX01JTiB0aGVuIHdlIHN0aWxsIGVuZCB1cCB3aXRoIExPTkdfTUlOCisgICAgICAgYWZ0ZXIgbmVnYXRpb247IGJ1dCB0aGlzIHdvcmtzIG91dCwgc2luY2Ugd2UndmUgc3RpbGwgZ290CisgICAgICAgdGhlIGNvcnJlY3QgdmFsdWUgbW9kdWxvIFVMT05HX01BWCsxLCBhbmQgdGhlIHJhbmdlX2l0ZW0KKyAgICAgICBjYWxjdWxhdGlvbiBpcyBhbHNvIGRvbmUgbW9kdWxvIFVMT05HX01BWCsxLgorICAgICovCisgICAgaXQtPnN0YXJ0ID0gKGxvbmcpKHN0YXJ0ICsgKHVuc2lnbmVkIGxvbmcpKGxlbi0xKSAqIHN0ZXApOworICAgIGl0LT5zdGVwID0gKGxvbmcpKDBVTC1zdGVwKTsKIAotCXJldHVybiAoUHlPYmplY3QgKilpdDsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CmRpZmYgLS1naXQgYS9PYmplY3RzL3NldG9iamVjdC5jIGIvT2JqZWN0cy9zZXRvYmplY3QuYwppbmRleCA0NzM2MmViLi42YTZlYjNhIDEwMDY0NAotLS0gYS9PYmplY3RzL3NldG9iamVjdC5jCisrKyBiL09iamVjdHMvc2V0b2JqZWN0LmMKQEAgLTEsNSArMSw1IEBACiAKLS8qIHNldCBvYmplY3QgaW1wbGVtZW50YXRpb24gCisvKiBzZXQgb2JqZWN0IGltcGxlbWVudGF0aW9uCiAgICBXcml0dGVuIGFuZCBtYWludGFpbmVkIGJ5IFJheW1vbmQgRC4gSGV0dGluZ2VyIDxweXRob25AcmNuLmNvbT4KICAgIERlcml2ZWQgZnJvbSBMaWIvc2V0cy5weSBhbmQgT2JqZWN0cy9kaWN0b2JqZWN0LmMuCiAKQEAgLTE2LDEyICsxNiwxMiBAQAogc3RhdGljIHZvaWQKIHNldF9rZXlfZXJyb3IoUHlPYmplY3QgKmFyZykKIHsKLQlQeU9iamVjdCAqdHVwOwotCXR1cCA9IFB5VHVwbGVfUGFjaygxLCBhcmcpOwotCWlmICghdHVwKQotCQlyZXR1cm47IC8qIGNhbGxlciB3aWxsIGV4cGVjdCBlcnJvciB0byBiZSBzZXQgYW55d2F5ICovCi0JUHlFcnJfU2V0T2JqZWN0KFB5RXhjX0tleUVycm9yLCB0dXApOwotCVB5X0RFQ1JFRih0dXApOworICAgIFB5T2JqZWN0ICp0dXA7CisgICAgdHVwID0gUHlUdXBsZV9QYWNrKDEsIGFyZyk7CisgICAgaWYgKCF0dXApCisgICAgICAgIHJldHVybjsgLyogY2FsbGVyIHdpbGwgZXhwZWN0IGVycm9yIHRvIGJlIHNldCBhbnl3YXkgKi8KKyAgICBQeUVycl9TZXRPYmplY3QoUHlFeGNfS2V5RXJyb3IsIHR1cCk7CisgICAgUHlfREVDUkVGKHR1cCk7CiB9CiAKIC8qIFRoaXMgbXVzdCBiZSA+PSAxLiAqLwpAQCAtMzQsMjAgKzM0LDIwIEBACiBQeU9iamVjdCAqCiBfUHlTZXRfRHVtbXkodm9pZCkKIHsKLQlyZXR1cm4gZHVtbXk7CisgICAgcmV0dXJuIGR1bW15OwogfQogI2VuZGlmCiAKLSNkZWZpbmUgSU5JVF9OT05aRVJPX1NFVF9TTE9UUyhzbykgZG8gewkJCQlcCi0JKHNvKS0+dGFibGUgPSAoc28pLT5zbWFsbHRhYmxlOwkJCQlcCi0JKHNvKS0+bWFzayA9IFB5U2V0X01JTlNJWkUgLSAxOwkJCQlcCi0JKHNvKS0+aGFzaCA9IC0xOwkJCQkJXAorI2RlZmluZSBJTklUX05PTlpFUk9fU0VUX1NMT1RTKHNvKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoc28pLT50YWJsZSA9IChzbyktPnNtYWxsdGFibGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKHNvKS0+bWFzayA9IFB5U2V0X01JTlNJWkUgLSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChzbyktPmhhc2ggPSAtMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICB9IHdoaWxlKDApCiAKLSNkZWZpbmUgRU1QVFlfVE9fTUlOU0laRShzbykgZG8gewkJCQlcCi0JbWVtc2V0KChzbyktPnNtYWxsdGFibGUsIDAsIHNpemVvZigoc28pLT5zbWFsbHRhYmxlKSk7CVwKLQkoc28pLT51c2VkID0gKHNvKS0+ZmlsbCA9IDA7CQkJCVwKLQlJTklUX05PTlpFUk9fU0VUX1NMT1RTKHNvKTsJCQkJXAorI2RlZmluZSBFTVBUWV9UT19NSU5TSVpFKHNvKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtZW1zZXQoKHNvKS0+c21hbGx0YWJsZSwgMCwgc2l6ZW9mKChzbyktPnNtYWxsdGFibGUpKTsgICAgICBcCisgICAgKHNvKS0+dXNlZCA9IChzbyktPmZpbGwgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIElOSVRfTk9OWkVST19TRVRfU0xPVFMoc28pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICB9IHdoaWxlKDApCiAKIC8qIFJldXNlIHNjaGVtZSB0byBzYXZlIGNhbGxzIHRvIG1hbGxvYywgZnJlZSwgYW5kIG1lbXNldCAqLwpAQCAtNzUsNzggKzc1LDc4IEBACiBzdGF0aWMgc2V0ZW50cnkgKgogc2V0X2xvb2trZXkoUHlTZXRPYmplY3QgKnNvLCBQeU9iamVjdCAqa2V5LCByZWdpc3RlciBsb25nIGhhc2gpCiB7Ci0JcmVnaXN0ZXIgUHlfc3NpemVfdCBpOwotCXJlZ2lzdGVyIHNpemVfdCBwZXJ0dXJiOwotCXJlZ2lzdGVyIHNldGVudHJ5ICpmcmVlc2xvdDsKLQlyZWdpc3RlciBzaXplX3QgbWFzayA9IHNvLT5tYXNrOwotCXNldGVudHJ5ICp0YWJsZSA9IHNvLT50YWJsZTsKLQlyZWdpc3RlciBzZXRlbnRyeSAqZW50cnk7Ci0JcmVnaXN0ZXIgaW50IGNtcDsKLQlQeU9iamVjdCAqc3RhcnRrZXk7CisgICAgcmVnaXN0ZXIgUHlfc3NpemVfdCBpOworICAgIHJlZ2lzdGVyIHNpemVfdCBwZXJ0dXJiOworICAgIHJlZ2lzdGVyIHNldGVudHJ5ICpmcmVlc2xvdDsKKyAgICByZWdpc3RlciBzaXplX3QgbWFzayA9IHNvLT5tYXNrOworICAgIHNldGVudHJ5ICp0YWJsZSA9IHNvLT50YWJsZTsKKyAgICByZWdpc3RlciBzZXRlbnRyeSAqZW50cnk7CisgICAgcmVnaXN0ZXIgaW50IGNtcDsKKyAgICBQeU9iamVjdCAqc3RhcnRrZXk7CiAKLQlpID0gaGFzaCAmIG1hc2s7Ci0JZW50cnkgPSAmdGFibGVbaV07Ci0JaWYgKGVudHJ5LT5rZXkgPT0gTlVMTCB8fCBlbnRyeS0+a2V5ID09IGtleSkKLQkJcmV0dXJuIGVudHJ5OworICAgIGkgPSBoYXNoICYgbWFzazsKKyAgICBlbnRyeSA9ICZ0YWJsZVtpXTsKKyAgICBpZiAoZW50cnktPmtleSA9PSBOVUxMIHx8IGVudHJ5LT5rZXkgPT0ga2V5KQorICAgICAgICByZXR1cm4gZW50cnk7CiAKLQlpZiAoZW50cnktPmtleSA9PSBkdW1teSkKLQkJZnJlZXNsb3QgPSBlbnRyeTsKLQllbHNlIHsKLQkJaWYgKGVudHJ5LT5oYXNoID09IGhhc2gpIHsKLQkJCXN0YXJ0a2V5ID0gZW50cnktPmtleTsKLQkJCVB5X0lOQ1JFRihzdGFydGtleSk7Ci0JCQljbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woc3RhcnRrZXksIGtleSwgUHlfRVEpOwotCQkJUHlfREVDUkVGKHN0YXJ0a2V5KTsKLQkJCWlmIChjbXAgPCAwKQotCQkJCXJldHVybiBOVUxMOwotCQkJaWYgKHRhYmxlID09IHNvLT50YWJsZSAmJiBlbnRyeS0+a2V5ID09IHN0YXJ0a2V5KSB7Ci0JCQkJaWYgKGNtcCA+IDApCi0JCQkJCXJldHVybiBlbnRyeTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8qIFRoZSBjb21wYXJlIGRpZCBtYWpvciBuYXN0eSBzdHVmZiB0byB0aGUKLQkJCQkgKiBzZXQ6ICBzdGFydCBvdmVyLgotIAkJCQkgKi8KLSAJCQkJcmV0dXJuIHNldF9sb29ra2V5KHNvLCBrZXksIGhhc2gpOwotIAkJCX0KLQkJfQotCQlmcmVlc2xvdCA9IE5VTEw7Ci0JfQorICAgIGlmIChlbnRyeS0+a2V5ID09IGR1bW15KQorICAgICAgICBmcmVlc2xvdCA9IGVudHJ5OworICAgIGVsc2UgeworICAgICAgICBpZiAoZW50cnktPmhhc2ggPT0gaGFzaCkgeworICAgICAgICAgICAgc3RhcnRrZXkgPSBlbnRyeS0+a2V5OworICAgICAgICAgICAgUHlfSU5DUkVGKHN0YXJ0a2V5KTsKKyAgICAgICAgICAgIGNtcCA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChzdGFydGtleSwga2V5LCBQeV9FUSk7CisgICAgICAgICAgICBQeV9ERUNSRUYoc3RhcnRrZXkpOworICAgICAgICAgICAgaWYgKGNtcCA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICBpZiAodGFibGUgPT0gc28tPnRhYmxlICYmIGVudHJ5LT5rZXkgPT0gc3RhcnRrZXkpIHsKKyAgICAgICAgICAgICAgICBpZiAoY21wID4gMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgLyogVGhlIGNvbXBhcmUgZGlkIG1ham9yIG5hc3R5IHN0dWZmIHRvIHRoZQorICAgICAgICAgICAgICAgICAqIHNldDogIHN0YXJ0IG92ZXIuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgcmV0dXJuIHNldF9sb29ra2V5KHNvLCBrZXksIGhhc2gpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZyZWVzbG90ID0gTlVMTDsKKyAgICB9CiAKLQkvKiBJbiB0aGUgbG9vcCwga2V5ID09IGR1bW15IGlzIGJ5IGZhciAoZmFjdG9yIG9mIDEwMHMpIHRoZQotCSAgIGxlYXN0IGxpa2VseSBvdXRjb21lLCBzbyB0ZXN0IGZvciB0aGF0IGxhc3QuICovCi0JZm9yIChwZXJ0dXJiID0gaGFzaDsgOyBwZXJ0dXJiID4+PSBQRVJUVVJCX1NISUZUKSB7Ci0JCWkgPSAoaSA8PCAyKSArIGkgKyBwZXJ0dXJiICsgMTsKLQkJZW50cnkgPSAmdGFibGVbaSAmIG1hc2tdOwotCQlpZiAoZW50cnktPmtleSA9PSBOVUxMKSB7Ci0JCQlpZiAoZnJlZXNsb3QgIT0gTlVMTCkKLQkJCQllbnRyeSA9IGZyZWVzbG90OwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGVudHJ5LT5rZXkgPT0ga2V5KQotCQkJYnJlYWs7Ci0JCWlmIChlbnRyeS0+aGFzaCA9PSBoYXNoICYmIGVudHJ5LT5rZXkgIT0gZHVtbXkpIHsKLQkJCXN0YXJ0a2V5ID0gZW50cnktPmtleTsKLQkJCVB5X0lOQ1JFRihzdGFydGtleSk7Ci0JCQljbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woc3RhcnRrZXksIGtleSwgUHlfRVEpOwotCQkJUHlfREVDUkVGKHN0YXJ0a2V5KTsKLQkJCWlmIChjbXAgPCAwKQotCQkJCXJldHVybiBOVUxMOwotCQkJaWYgKHRhYmxlID09IHNvLT50YWJsZSAmJiBlbnRyeS0+a2V5ID09IHN0YXJ0a2V5KSB7Ci0JCQkJaWYgKGNtcCA+IDApCi0JCQkJCWJyZWFrOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLyogVGhlIGNvbXBhcmUgZGlkIG1ham9yIG5hc3R5IHN0dWZmIHRvIHRoZQotCQkJCSAqIHNldDogIHN0YXJ0IG92ZXIuCi0gCQkJCSAqLwotIAkJCQlyZXR1cm4gc2V0X2xvb2trZXkoc28sIGtleSwgaGFzaCk7Ci0gCQkJfQotCQl9Ci0JCWVsc2UgaWYgKGVudHJ5LT5rZXkgPT0gZHVtbXkgJiYgZnJlZXNsb3QgPT0gTlVMTCkKLQkJCWZyZWVzbG90ID0gZW50cnk7Ci0JfQotCXJldHVybiBlbnRyeTsKKyAgICAvKiBJbiB0aGUgbG9vcCwga2V5ID09IGR1bW15IGlzIGJ5IGZhciAoZmFjdG9yIG9mIDEwMHMpIHRoZQorICAgICAgIGxlYXN0IGxpa2VseSBvdXRjb21lLCBzbyB0ZXN0IGZvciB0aGF0IGxhc3QuICovCisgICAgZm9yIChwZXJ0dXJiID0gaGFzaDsgOyBwZXJ0dXJiID4+PSBQRVJUVVJCX1NISUZUKSB7CisgICAgICAgIGkgPSAoaSA8PCAyKSArIGkgKyBwZXJ0dXJiICsgMTsKKyAgICAgICAgZW50cnkgPSAmdGFibGVbaSAmIG1hc2tdOworICAgICAgICBpZiAoZW50cnktPmtleSA9PSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoZnJlZXNsb3QgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICBlbnRyeSA9IGZyZWVzbG90OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVudHJ5LT5rZXkgPT0ga2V5KQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmIChlbnRyeS0+aGFzaCA9PSBoYXNoICYmIGVudHJ5LT5rZXkgIT0gZHVtbXkpIHsKKyAgICAgICAgICAgIHN0YXJ0a2V5ID0gZW50cnktPmtleTsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihzdGFydGtleSk7CisgICAgICAgICAgICBjbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woc3RhcnRrZXksIGtleSwgUHlfRVEpOworICAgICAgICAgICAgUHlfREVDUkVGKHN0YXJ0a2V5KTsKKyAgICAgICAgICAgIGlmIChjbXAgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgaWYgKHRhYmxlID09IHNvLT50YWJsZSAmJiBlbnRyeS0+a2V5ID09IHN0YXJ0a2V5KSB7CisgICAgICAgICAgICAgICAgaWYgKGNtcCA+IDApCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgLyogVGhlIGNvbXBhcmUgZGlkIG1ham9yIG5hc3R5IHN0dWZmIHRvIHRoZQorICAgICAgICAgICAgICAgICAqIHNldDogIHN0YXJ0IG92ZXIuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgcmV0dXJuIHNldF9sb29ra2V5KHNvLCBrZXksIGhhc2gpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGVudHJ5LT5rZXkgPT0gZHVtbXkgJiYgZnJlZXNsb3QgPT0gTlVMTCkKKyAgICAgICAgICAgIGZyZWVzbG90ID0gZW50cnk7CisgICAgfQorICAgIHJldHVybiBlbnRyeTsKIH0KIAogLyoKQEAgLTE1Nyw1MCArMTU3LDUwIEBACiBzdGF0aWMgc2V0ZW50cnkgKgogc2V0X2xvb2trZXlfc3RyaW5nKFB5U2V0T2JqZWN0ICpzbywgUHlPYmplY3QgKmtleSwgcmVnaXN0ZXIgbG9uZyBoYXNoKQogewotCXJlZ2lzdGVyIFB5X3NzaXplX3QgaTsKLQlyZWdpc3RlciBzaXplX3QgcGVydHVyYjsKLQlyZWdpc3RlciBzZXRlbnRyeSAqZnJlZXNsb3Q7Ci0JcmVnaXN0ZXIgc2l6ZV90IG1hc2sgPSBzby0+bWFzazsKLQlzZXRlbnRyeSAqdGFibGUgPSBzby0+dGFibGU7Ci0JcmVnaXN0ZXIgc2V0ZW50cnkgKmVudHJ5OworICAgIHJlZ2lzdGVyIFB5X3NzaXplX3QgaTsKKyAgICByZWdpc3RlciBzaXplX3QgcGVydHVyYjsKKyAgICByZWdpc3RlciBzZXRlbnRyeSAqZnJlZXNsb3Q7CisgICAgcmVnaXN0ZXIgc2l6ZV90IG1hc2sgPSBzby0+bWFzazsKKyAgICBzZXRlbnRyeSAqdGFibGUgPSBzby0+dGFibGU7CisgICAgcmVnaXN0ZXIgc2V0ZW50cnkgKmVudHJ5OwogCi0JLyogTWFrZSBzdXJlIHRoaXMgZnVuY3Rpb24gZG9lc24ndCBoYXZlIHRvIGhhbmRsZSBub24tc3RyaW5nIGtleXMsCi0JICAgaW5jbHVkaW5nIHN1YmNsYXNzZXMgb2Ygc3RyOyBlLmcuLCBvbmUgcmVhc29uIHRvIHN1YmNsYXNzCi0JICAgc3RyaW5ncyBpcyB0byBvdmVycmlkZSBfX2VxX18sIGFuZCBmb3Igc3BlZWQgd2UgZG9uJ3QgY2F0ZXIgdG8KLQkgICB0aGF0IGhlcmUuICovCi0JaWYgKCFQeVN0cmluZ19DaGVja0V4YWN0KGtleSkpIHsKLQkJc28tPmxvb2t1cCA9IHNldF9sb29ra2V5OwotCQlyZXR1cm4gc2V0X2xvb2trZXkoc28sIGtleSwgaGFzaCk7Ci0JfQotCWkgPSBoYXNoICYgbWFzazsKLQllbnRyeSA9ICZ0YWJsZVtpXTsKLQlpZiAoZW50cnktPmtleSA9PSBOVUxMIHx8IGVudHJ5LT5rZXkgPT0ga2V5KQotCQlyZXR1cm4gZW50cnk7Ci0JaWYgKGVudHJ5LT5rZXkgPT0gZHVtbXkpCi0JCWZyZWVzbG90ID0gZW50cnk7Ci0JZWxzZSB7Ci0JCWlmIChlbnRyeS0+aGFzaCA9PSBoYXNoICYmIF9QeVN0cmluZ19FcShlbnRyeS0+a2V5LCBrZXkpKQotCQkJcmV0dXJuIGVudHJ5OwotCQlmcmVlc2xvdCA9IE5VTEw7Ci0JfQorICAgIC8qIE1ha2Ugc3VyZSB0aGlzIGZ1bmN0aW9uIGRvZXNuJ3QgaGF2ZSB0byBoYW5kbGUgbm9uLXN0cmluZyBrZXlzLAorICAgICAgIGluY2x1ZGluZyBzdWJjbGFzc2VzIG9mIHN0cjsgZS5nLiwgb25lIHJlYXNvbiB0byBzdWJjbGFzcworICAgICAgIHN0cmluZ3MgaXMgdG8gb3ZlcnJpZGUgX19lcV9fLCBhbmQgZm9yIHNwZWVkIHdlIGRvbid0IGNhdGVyIHRvCisgICAgICAgdGhhdCBoZXJlLiAqLworICAgIGlmICghUHlTdHJpbmdfQ2hlY2tFeGFjdChrZXkpKSB7CisgICAgICAgIHNvLT5sb29rdXAgPSBzZXRfbG9va2tleTsKKyAgICAgICAgcmV0dXJuIHNldF9sb29ra2V5KHNvLCBrZXksIGhhc2gpOworICAgIH0KKyAgICBpID0gaGFzaCAmIG1hc2s7CisgICAgZW50cnkgPSAmdGFibGVbaV07CisgICAgaWYgKGVudHJ5LT5rZXkgPT0gTlVMTCB8fCBlbnRyeS0+a2V5ID09IGtleSkKKyAgICAgICAgcmV0dXJuIGVudHJ5OworICAgIGlmIChlbnRyeS0+a2V5ID09IGR1bW15KQorICAgICAgICBmcmVlc2xvdCA9IGVudHJ5OworICAgIGVsc2UgeworICAgICAgICBpZiAoZW50cnktPmhhc2ggPT0gaGFzaCAmJiBfUHlTdHJpbmdfRXEoZW50cnktPmtleSwga2V5KSkKKyAgICAgICAgICAgIHJldHVybiBlbnRyeTsKKyAgICAgICAgZnJlZXNsb3QgPSBOVUxMOworICAgIH0KIAotCS8qIEluIHRoZSBsb29wLCBrZXkgPT0gZHVtbXkgaXMgYnkgZmFyIChmYWN0b3Igb2YgMTAwcykgdGhlCi0JICAgbGVhc3QgbGlrZWx5IG91dGNvbWUsIHNvIHRlc3QgZm9yIHRoYXQgbGFzdC4gKi8KLQlmb3IgKHBlcnR1cmIgPSBoYXNoOyA7IHBlcnR1cmIgPj49IFBFUlRVUkJfU0hJRlQpIHsKLQkJaSA9IChpIDw8IDIpICsgaSArIHBlcnR1cmIgKyAxOwotCQllbnRyeSA9ICZ0YWJsZVtpICYgbWFza107Ci0JCWlmIChlbnRyeS0+a2V5ID09IE5VTEwpCi0JCQlyZXR1cm4gZnJlZXNsb3QgPT0gTlVMTCA/IGVudHJ5IDogZnJlZXNsb3Q7Ci0JCWlmIChlbnRyeS0+a2V5ID09IGtleQotCQkgICAgfHwgKGVudHJ5LT5oYXNoID09IGhhc2gKLQkJCSYmIGVudHJ5LT5rZXkgIT0gZHVtbXkKLQkJCSYmIF9QeVN0cmluZ19FcShlbnRyeS0+a2V5LCBrZXkpKSkKLQkJCXJldHVybiBlbnRyeTsKLQkJaWYgKGVudHJ5LT5rZXkgPT0gZHVtbXkgJiYgZnJlZXNsb3QgPT0gTlVMTCkKLQkJCWZyZWVzbG90ID0gZW50cnk7Ci0JfQotCWFzc2VydCgwKTsJLyogTk9UIFJFQUNIRUQgKi8KLQlyZXR1cm4gMDsKKyAgICAvKiBJbiB0aGUgbG9vcCwga2V5ID09IGR1bW15IGlzIGJ5IGZhciAoZmFjdG9yIG9mIDEwMHMpIHRoZQorICAgICAgIGxlYXN0IGxpa2VseSBvdXRjb21lLCBzbyB0ZXN0IGZvciB0aGF0IGxhc3QuICovCisgICAgZm9yIChwZXJ0dXJiID0gaGFzaDsgOyBwZXJ0dXJiID4+PSBQRVJUVVJCX1NISUZUKSB7CisgICAgICAgIGkgPSAoaSA8PCAyKSArIGkgKyBwZXJ0dXJiICsgMTsKKyAgICAgICAgZW50cnkgPSAmdGFibGVbaSAmIG1hc2tdOworICAgICAgICBpZiAoZW50cnktPmtleSA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIGZyZWVzbG90ID09IE5VTEwgPyBlbnRyeSA6IGZyZWVzbG90OworICAgICAgICBpZiAoZW50cnktPmtleSA9PSBrZXkKKyAgICAgICAgICAgIHx8IChlbnRyeS0+aGFzaCA9PSBoYXNoCisgICAgICAgICAgICAmJiBlbnRyeS0+a2V5ICE9IGR1bW15CisgICAgICAgICAgICAmJiBfUHlTdHJpbmdfRXEoZW50cnktPmtleSwga2V5KSkpCisgICAgICAgICAgICByZXR1cm4gZW50cnk7CisgICAgICAgIGlmIChlbnRyeS0+a2V5ID09IGR1bW15ICYmIGZyZWVzbG90ID09IE5VTEwpCisgICAgICAgICAgICBmcmVlc2xvdCA9IGVudHJ5OworICAgIH0KKyAgICBhc3NlcnQoMCk7ICAgICAgICAgIC8qIE5PVCBSRUFDSEVEICovCisgICAgcmV0dXJuIDA7CiB9CiAKIC8qCkBAIC0yMTEsMzAgKzIxMSwzMCBAQAogc3RhdGljIGludAogc2V0X2luc2VydF9rZXkocmVnaXN0ZXIgUHlTZXRPYmplY3QgKnNvLCBQeU9iamVjdCAqa2V5LCBsb25nIGhhc2gpCiB7Ci0JcmVnaXN0ZXIgc2V0ZW50cnkgKmVudHJ5OwotCXR5cGVkZWYgc2V0ZW50cnkgKigqbG9va3VwZnVuYykoUHlTZXRPYmplY3QgKiwgUHlPYmplY3QgKiwgbG9uZyk7CisgICAgcmVnaXN0ZXIgc2V0ZW50cnkgKmVudHJ5OworICAgIHR5cGVkZWYgc2V0ZW50cnkgKigqbG9va3VwZnVuYykoUHlTZXRPYmplY3QgKiwgUHlPYmplY3QgKiwgbG9uZyk7CiAKLQlhc3NlcnQoc28tPmxvb2t1cCAhPSBOVUxMKTsKLQllbnRyeSA9IHNvLT5sb29rdXAoc28sIGtleSwgaGFzaCk7Ci0JaWYgKGVudHJ5ID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQlpZiAoZW50cnktPmtleSA9PSBOVUxMKSB7Ci0JCS8qIFVOVVNFRCAqLwotCQlzby0+ZmlsbCsrOyAKLQkJZW50cnktPmtleSA9IGtleTsKLQkJZW50cnktPmhhc2ggPSBoYXNoOwotCQlzby0+dXNlZCsrOwotCX0gZWxzZSBpZiAoZW50cnktPmtleSA9PSBkdW1teSkgewotCQkvKiBEVU1NWSAqLwotCQllbnRyeS0+a2V5ID0ga2V5OwotCQllbnRyeS0+aGFzaCA9IGhhc2g7Ci0JCXNvLT51c2VkKys7Ci0JCVB5X0RFQ1JFRihkdW1teSk7Ci0JfSBlbHNlIHsKLQkJLyogQUNUSVZFICovCi0JCVB5X0RFQ1JFRihrZXkpOwotCX0KLQlyZXR1cm4gMDsKKyAgICBhc3NlcnQoc28tPmxvb2t1cCAhPSBOVUxMKTsKKyAgICBlbnRyeSA9IHNvLT5sb29rdXAoc28sIGtleSwgaGFzaCk7CisgICAgaWYgKGVudHJ5ID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAoZW50cnktPmtleSA9PSBOVUxMKSB7CisgICAgICAgIC8qIFVOVVNFRCAqLworICAgICAgICBzby0+ZmlsbCsrOworICAgICAgICBlbnRyeS0+a2V5ID0ga2V5OworICAgICAgICBlbnRyeS0+aGFzaCA9IGhhc2g7CisgICAgICAgIHNvLT51c2VkKys7CisgICAgfSBlbHNlIGlmIChlbnRyeS0+a2V5ID09IGR1bW15KSB7CisgICAgICAgIC8qIERVTU1ZICovCisgICAgICAgIGVudHJ5LT5rZXkgPSBrZXk7CisgICAgICAgIGVudHJ5LT5oYXNoID0gaGFzaDsKKyAgICAgICAgc28tPnVzZWQrKzsKKyAgICAgICAgUHlfREVDUkVGKGR1bW15KTsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBBQ1RJVkUgKi8KKyAgICAgICAgUHlfREVDUkVGKGtleSk7CisgICAgfQorICAgIHJldHVybiAwOwogfQogCiAvKgpAQCAtMjQ4LDIyICsyNDgsMjIgQEAKIHN0YXRpYyB2b2lkCiBzZXRfaW5zZXJ0X2NsZWFuKHJlZ2lzdGVyIFB5U2V0T2JqZWN0ICpzbywgUHlPYmplY3QgKmtleSwgbG9uZyBoYXNoKQogewotCXJlZ2lzdGVyIHNpemVfdCBpOwotCXJlZ2lzdGVyIHNpemVfdCBwZXJ0dXJiOwotCXJlZ2lzdGVyIHNpemVfdCBtYXNrID0gKHNpemVfdClzby0+bWFzazsKLQlzZXRlbnRyeSAqdGFibGUgPSBzby0+dGFibGU7Ci0JcmVnaXN0ZXIgc2V0ZW50cnkgKmVudHJ5OworICAgIHJlZ2lzdGVyIHNpemVfdCBpOworICAgIHJlZ2lzdGVyIHNpemVfdCBwZXJ0dXJiOworICAgIHJlZ2lzdGVyIHNpemVfdCBtYXNrID0gKHNpemVfdClzby0+bWFzazsKKyAgICBzZXRlbnRyeSAqdGFibGUgPSBzby0+dGFibGU7CisgICAgcmVnaXN0ZXIgc2V0ZW50cnkgKmVudHJ5OwogCi0JaSA9IGhhc2ggJiBtYXNrOwotCWVudHJ5ID0gJnRhYmxlW2ldOwotCWZvciAocGVydHVyYiA9IGhhc2g7IGVudHJ5LT5rZXkgIT0gTlVMTDsgcGVydHVyYiA+Pj0gUEVSVFVSQl9TSElGVCkgewotCQlpID0gKGkgPDwgMikgKyBpICsgcGVydHVyYiArIDE7Ci0JCWVudHJ5ID0gJnRhYmxlW2kgJiBtYXNrXTsKLQl9Ci0Jc28tPmZpbGwrKzsKLQllbnRyeS0+a2V5ID0ga2V5OwotCWVudHJ5LT5oYXNoID0gaGFzaDsKLQlzby0+dXNlZCsrOworICAgIGkgPSBoYXNoICYgbWFzazsKKyAgICBlbnRyeSA9ICZ0YWJsZVtpXTsKKyAgICBmb3IgKHBlcnR1cmIgPSBoYXNoOyBlbnRyeS0+a2V5ICE9IE5VTEw7IHBlcnR1cmIgPj49IFBFUlRVUkJfU0hJRlQpIHsKKyAgICAgICAgaSA9IChpIDw8IDIpICsgaSArIHBlcnR1cmIgKyAxOworICAgICAgICBlbnRyeSA9ICZ0YWJsZVtpICYgbWFza107CisgICAgfQorICAgIHNvLT5maWxsKys7CisgICAgZW50cnktPmtleSA9IGtleTsKKyAgICBlbnRyeS0+aGFzaCA9IGhhc2g7CisgICAgc28tPnVzZWQrKzsKIH0KIAogLyoKQEAgLTI3NCw4NiArMjc0LDg2IEBACiBzdGF0aWMgaW50CiBzZXRfdGFibGVfcmVzaXplKFB5U2V0T2JqZWN0ICpzbywgUHlfc3NpemVfdCBtaW51c2VkKQogewotCVB5X3NzaXplX3QgbmV3c2l6ZTsKLQlzZXRlbnRyeSAqb2xkdGFibGUsICpuZXd0YWJsZSwgKmVudHJ5OwotCVB5X3NzaXplX3QgaTsKLQlpbnQgaXNfb2xkdGFibGVfbWFsbG9jZWQ7Ci0Jc2V0ZW50cnkgc21hbGxfY29weVtQeVNldF9NSU5TSVpFXTsKKyAgICBQeV9zc2l6ZV90IG5ld3NpemU7CisgICAgc2V0ZW50cnkgKm9sZHRhYmxlLCAqbmV3dGFibGUsICplbnRyeTsKKyAgICBQeV9zc2l6ZV90IGk7CisgICAgaW50IGlzX29sZHRhYmxlX21hbGxvY2VkOworICAgIHNldGVudHJ5IHNtYWxsX2NvcHlbUHlTZXRfTUlOU0laRV07CiAKLQlhc3NlcnQobWludXNlZCA+PSAwKTsKKyAgICBhc3NlcnQobWludXNlZCA+PSAwKTsKIAotCS8qIEZpbmQgdGhlIHNtYWxsZXN0IHRhYmxlIHNpemUgPiBtaW51c2VkLiAqLwotCWZvciAobmV3c2l6ZSA9IFB5U2V0X01JTlNJWkU7Ci0JICAgICBuZXdzaXplIDw9IG1pbnVzZWQgJiYgbmV3c2l6ZSA+IDA7Ci0JICAgICBuZXdzaXplIDw8PSAxKQotCQk7Ci0JaWYgKG5ld3NpemUgPD0gMCkgewotCQlQeUVycl9Ob01lbW9yeSgpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIC8qIEZpbmQgdGhlIHNtYWxsZXN0IHRhYmxlIHNpemUgPiBtaW51c2VkLiAqLworICAgIGZvciAobmV3c2l6ZSA9IFB5U2V0X01JTlNJWkU7CisgICAgICAgICBuZXdzaXplIDw9IG1pbnVzZWQgJiYgbmV3c2l6ZSA+IDA7CisgICAgICAgICBuZXdzaXplIDw8PSAxKQorICAgICAgICA7CisgICAgaWYgKG5ld3NpemUgPD0gMCkgeworICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JLyogR2V0IHNwYWNlIGZvciBhIG5ldyB0YWJsZS4gKi8KLQlvbGR0YWJsZSA9IHNvLT50YWJsZTsKLQlhc3NlcnQob2xkdGFibGUgIT0gTlVMTCk7Ci0JaXNfb2xkdGFibGVfbWFsbG9jZWQgPSBvbGR0YWJsZSAhPSBzby0+c21hbGx0YWJsZTsKKyAgICAvKiBHZXQgc3BhY2UgZm9yIGEgbmV3IHRhYmxlLiAqLworICAgIG9sZHRhYmxlID0gc28tPnRhYmxlOworICAgIGFzc2VydChvbGR0YWJsZSAhPSBOVUxMKTsKKyAgICBpc19vbGR0YWJsZV9tYWxsb2NlZCA9IG9sZHRhYmxlICE9IHNvLT5zbWFsbHRhYmxlOwogCi0JaWYgKG5ld3NpemUgPT0gUHlTZXRfTUlOU0laRSkgewotCQkvKiBBIGxhcmdlIHRhYmxlIGlzIHNocmlua2luZywgb3Igd2UgY2FuJ3QgZ2V0IGFueSBzbWFsbGVyLiAqLwotCQluZXd0YWJsZSA9IHNvLT5zbWFsbHRhYmxlOwotCQlpZiAobmV3dGFibGUgPT0gb2xkdGFibGUpIHsKLQkJCWlmIChzby0+ZmlsbCA9PSBzby0+dXNlZCkgewotCQkJCS8qIE5vIGR1bW1pZXMsIHNvIG5vIHBvaW50IGRvaW5nIGFueXRoaW5nLiAqLwotCQkJCXJldHVybiAwOwotCQkJfQotCQkJLyogV2UncmUgbm90IGdvaW5nIHRvIHJlc2l6ZSBpdCwgYnV0IHJlYnVpbGQgdGhlCi0JCQkgICB0YWJsZSBhbnl3YXkgdG8gcHVyZ2Ugb2xkIGR1bW15IGVudHJpZXMuCi0JCQkgICBTdWJ0bGU6ICBUaGlzIGlzICpuZWNlc3NhcnkqIGlmIGZpbGw9PXNpemUsCi0JCQkgICBhcyBzZXRfbG9va2tleSBuZWVkcyBhdCBsZWFzdCBvbmUgdmlyZ2luIHNsb3QgdG8KLQkJCSAgIHRlcm1pbmF0ZSBmYWlsaW5nIHNlYXJjaGVzLiAgSWYgZmlsbCA8IHNpemUsIGl0J3MKLQkJCSAgIG1lcmVseSBkZXNpcmFibGUsIGFzIGR1bW1pZXMgc2xvdyBzZWFyY2hlcy4gKi8KLQkJCWFzc2VydChzby0+ZmlsbCA+IHNvLT51c2VkKTsKLQkJCW1lbWNweShzbWFsbF9jb3B5LCBvbGR0YWJsZSwgc2l6ZW9mKHNtYWxsX2NvcHkpKTsKLQkJCW9sZHRhYmxlID0gc21hbGxfY29weTsKLQkJfQotCX0KLQllbHNlIHsKLQkJbmV3dGFibGUgPSBQeU1lbV9ORVcoc2V0ZW50cnksIG5ld3NpemUpOwotCQlpZiAobmV3dGFibGUgPT0gTlVMTCkgewotCQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCX0KKyAgICBpZiAobmV3c2l6ZSA9PSBQeVNldF9NSU5TSVpFKSB7CisgICAgICAgIC8qIEEgbGFyZ2UgdGFibGUgaXMgc2hyaW5raW5nLCBvciB3ZSBjYW4ndCBnZXQgYW55IHNtYWxsZXIuICovCisgICAgICAgIG5ld3RhYmxlID0gc28tPnNtYWxsdGFibGU7CisgICAgICAgIGlmIChuZXd0YWJsZSA9PSBvbGR0YWJsZSkgeworICAgICAgICAgICAgaWYgKHNvLT5maWxsID09IHNvLT51c2VkKSB7CisgICAgICAgICAgICAgICAgLyogTm8gZHVtbWllcywgc28gbm8gcG9pbnQgZG9pbmcgYW55dGhpbmcuICovCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBXZSdyZSBub3QgZ29pbmcgdG8gcmVzaXplIGl0LCBidXQgcmVidWlsZCB0aGUKKyAgICAgICAgICAgICAgIHRhYmxlIGFueXdheSB0byBwdXJnZSBvbGQgZHVtbXkgZW50cmllcy4KKyAgICAgICAgICAgICAgIFN1YnRsZTogIFRoaXMgaXMgKm5lY2Vzc2FyeSogaWYgZmlsbD09c2l6ZSwKKyAgICAgICAgICAgICAgIGFzIHNldF9sb29ra2V5IG5lZWRzIGF0IGxlYXN0IG9uZSB2aXJnaW4gc2xvdCB0bworICAgICAgICAgICAgICAgdGVybWluYXRlIGZhaWxpbmcgc2VhcmNoZXMuICBJZiBmaWxsIDwgc2l6ZSwgaXQncworICAgICAgICAgICAgICAgbWVyZWx5IGRlc2lyYWJsZSwgYXMgZHVtbWllcyBzbG93IHNlYXJjaGVzLiAqLworICAgICAgICAgICAgYXNzZXJ0KHNvLT5maWxsID4gc28tPnVzZWQpOworICAgICAgICAgICAgbWVtY3B5KHNtYWxsX2NvcHksIG9sZHRhYmxlLCBzaXplb2Yoc21hbGxfY29weSkpOworICAgICAgICAgICAgb2xkdGFibGUgPSBzbWFsbF9jb3B5OworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBuZXd0YWJsZSA9IFB5TWVtX05FVyhzZXRlbnRyeSwgbmV3c2l6ZSk7CisgICAgICAgIGlmIChuZXd0YWJsZSA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQogCi0JLyogTWFrZSB0aGUgc2V0IGVtcHR5LCB1c2luZyB0aGUgbmV3IHRhYmxlLiAqLwotCWFzc2VydChuZXd0YWJsZSAhPSBvbGR0YWJsZSk7Ci0Jc28tPnRhYmxlID0gbmV3dGFibGU7Ci0Jc28tPm1hc2sgPSBuZXdzaXplIC0gMTsKLQltZW1zZXQobmV3dGFibGUsIDAsIHNpemVvZihzZXRlbnRyeSkgKiBuZXdzaXplKTsKLQlzby0+dXNlZCA9IDA7Ci0JaSA9IHNvLT5maWxsOwotCXNvLT5maWxsID0gMDsKKyAgICAvKiBNYWtlIHRoZSBzZXQgZW1wdHksIHVzaW5nIHRoZSBuZXcgdGFibGUuICovCisgICAgYXNzZXJ0KG5ld3RhYmxlICE9IG9sZHRhYmxlKTsKKyAgICBzby0+dGFibGUgPSBuZXd0YWJsZTsKKyAgICBzby0+bWFzayA9IG5ld3NpemUgLSAxOworICAgIG1lbXNldChuZXd0YWJsZSwgMCwgc2l6ZW9mKHNldGVudHJ5KSAqIG5ld3NpemUpOworICAgIHNvLT51c2VkID0gMDsKKyAgICBpID0gc28tPmZpbGw7CisgICAgc28tPmZpbGwgPSAwOwogCi0JLyogQ29weSB0aGUgZGF0YSBvdmVyOyB0aGlzIGlzIHJlZmNvdW50LW5ldXRyYWwgZm9yIGFjdGl2ZSBlbnRyaWVzOwotCSAgIGR1bW15IGVudHJpZXMgYXJlbid0IGNvcGllZCBvdmVyLCBvZiBjb3Vyc2UgKi8KLQlmb3IgKGVudHJ5ID0gb2xkdGFibGU7IGkgPiAwOyBlbnRyeSsrKSB7Ci0JCWlmIChlbnRyeS0+a2V5ID09IE5VTEwpIHsKLQkJCS8qIFVOVVNFRCAqLwotCQkJOwotCQl9IGVsc2UgaWYgKGVudHJ5LT5rZXkgPT0gZHVtbXkpIHsKLQkJCS8qIERVTU1ZICovCi0JCQktLWk7Ci0JCQlhc3NlcnQoZW50cnktPmtleSA9PSBkdW1teSk7Ci0JCQlQeV9ERUNSRUYoZW50cnktPmtleSk7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBBQ1RJVkUgKi8KLQkJCS0taTsKLQkJCXNldF9pbnNlcnRfY2xlYW4oc28sIGVudHJ5LT5rZXksIGVudHJ5LT5oYXNoKTsKLQkJfQotCX0KKyAgICAvKiBDb3B5IHRoZSBkYXRhIG92ZXI7IHRoaXMgaXMgcmVmY291bnQtbmV1dHJhbCBmb3IgYWN0aXZlIGVudHJpZXM7CisgICAgICAgZHVtbXkgZW50cmllcyBhcmVuJ3QgY29waWVkIG92ZXIsIG9mIGNvdXJzZSAqLworICAgIGZvciAoZW50cnkgPSBvbGR0YWJsZTsgaSA+IDA7IGVudHJ5KyspIHsKKyAgICAgICAgaWYgKGVudHJ5LT5rZXkgPT0gTlVMTCkgeworICAgICAgICAgICAgLyogVU5VU0VEICovCisgICAgICAgICAgICA7CisgICAgICAgIH0gZWxzZSBpZiAoZW50cnktPmtleSA9PSBkdW1teSkgeworICAgICAgICAgICAgLyogRFVNTVkgKi8KKyAgICAgICAgICAgIC0taTsKKyAgICAgICAgICAgIGFzc2VydChlbnRyeS0+a2V5ID09IGR1bW15KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihlbnRyeS0+a2V5KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIEFDVElWRSAqLworICAgICAgICAgICAgLS1pOworICAgICAgICAgICAgc2V0X2luc2VydF9jbGVhbihzbywgZW50cnktPmtleSwgZW50cnktPmhhc2gpOworICAgICAgICB9CisgICAgfQogCi0JaWYgKGlzX29sZHRhYmxlX21hbGxvY2VkKQotCQlQeU1lbV9ERUwob2xkdGFibGUpOwotCXJldHVybiAwOworICAgIGlmIChpc19vbGR0YWJsZV9tYWxsb2NlZCkKKyAgICAgICAgUHlNZW1fREVMKG9sZHRhYmxlKTsKKyAgICByZXR1cm4gMDsKIH0KIAogLyogQ0FVVElPTjogc2V0X2FkZF9rZXkvZW50cnkoKSBtdXN0IGd1YXJhbnRlZSBpdCB3b24ndCByZXNpemUgdGhlIHRhYmxlICovCkBAIC0zNjEsNDIgKzM2MSw0MiBAQAogc3RhdGljIGludAogc2V0X2FkZF9lbnRyeShyZWdpc3RlciBQeVNldE9iamVjdCAqc28sIHNldGVudHJ5ICplbnRyeSkKIHsKLQlyZWdpc3RlciBQeV9zc2l6ZV90IG5fdXNlZDsKKyAgICByZWdpc3RlciBQeV9zc2l6ZV90IG5fdXNlZDsKIAotCWFzc2VydChzby0+ZmlsbCA8PSBzby0+bWFzayk7ICAvKiBhdCBsZWFzdCBvbmUgZW1wdHkgc2xvdCAqLwotCW5fdXNlZCA9IHNvLT51c2VkOwotCVB5X0lOQ1JFRihlbnRyeS0+a2V5KTsKLQlpZiAoc2V0X2luc2VydF9rZXkoc28sIGVudHJ5LT5rZXksIGVudHJ5LT5oYXNoKSA9PSAtMSkgewotCQlQeV9ERUNSRUYoZW50cnktPmtleSk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKCEoc28tPnVzZWQgPiBuX3VzZWQgJiYgc28tPmZpbGwqMyA+PSAoc28tPm1hc2srMSkqMikpCi0JCXJldHVybiAwOwotCXJldHVybiBzZXRfdGFibGVfcmVzaXplKHNvLCBzby0+dXNlZD41MDAwMCA/IHNvLT51c2VkKjIgOiBzby0+dXNlZCo0KTsKKyAgICBhc3NlcnQoc28tPmZpbGwgPD0gc28tPm1hc2spOyAgLyogYXQgbGVhc3Qgb25lIGVtcHR5IHNsb3QgKi8KKyAgICBuX3VzZWQgPSBzby0+dXNlZDsKKyAgICBQeV9JTkNSRUYoZW50cnktPmtleSk7CisgICAgaWYgKHNldF9pbnNlcnRfa2V5KHNvLCBlbnRyeS0+a2V5LCBlbnRyeS0+aGFzaCkgPT0gLTEpIHsKKyAgICAgICAgUHlfREVDUkVGKGVudHJ5LT5rZXkpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICghKHNvLT51c2VkID4gbl91c2VkICYmIHNvLT5maWxsKjMgPj0gKHNvLT5tYXNrKzEpKjIpKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gc2V0X3RhYmxlX3Jlc2l6ZShzbywgc28tPnVzZWQ+NTAwMDAgPyBzby0+dXNlZCoyIDogc28tPnVzZWQqNCk7CiB9CiAKIHN0YXRpYyBpbnQKIHNldF9hZGRfa2V5KHJlZ2lzdGVyIFB5U2V0T2JqZWN0ICpzbywgUHlPYmplY3QgKmtleSkKIHsKLQlyZWdpc3RlciBsb25nIGhhc2g7Ci0JcmVnaXN0ZXIgUHlfc3NpemVfdCBuX3VzZWQ7CisgICAgcmVnaXN0ZXIgbG9uZyBoYXNoOworICAgIHJlZ2lzdGVyIFB5X3NzaXplX3Qgbl91c2VkOwogCi0JaWYgKCFQeVN0cmluZ19DaGVja0V4YWN0KGtleSkgfHwKLQkgICAgKGhhc2ggPSAoKFB5U3RyaW5nT2JqZWN0ICopIGtleSktPm9iX3NoYXNoKSA9PSAtMSkgewotCQloYXNoID0gUHlPYmplY3RfSGFzaChrZXkpOwotCQlpZiAoaGFzaCA9PSAtMSkKLQkJCXJldHVybiAtMTsKLQl9Ci0JYXNzZXJ0KHNvLT5maWxsIDw9IHNvLT5tYXNrKTsgIC8qIGF0IGxlYXN0IG9uZSBlbXB0eSBzbG90ICovCi0Jbl91c2VkID0gc28tPnVzZWQ7Ci0JUHlfSU5DUkVGKGtleSk7Ci0JaWYgKHNldF9pbnNlcnRfa2V5KHNvLCBrZXksIGhhc2gpID09IC0xKSB7Ci0JCVB5X0RFQ1JFRihrZXkpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmICghKHNvLT51c2VkID4gbl91c2VkICYmIHNvLT5maWxsKjMgPj0gKHNvLT5tYXNrKzEpKjIpKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gc2V0X3RhYmxlX3Jlc2l6ZShzbywgc28tPnVzZWQ+NTAwMDAgPyBzby0+dXNlZCoyIDogc28tPnVzZWQqNCk7CisgICAgaWYgKCFQeVN0cmluZ19DaGVja0V4YWN0KGtleSkgfHwKKyAgICAgICAgKGhhc2ggPSAoKFB5U3RyaW5nT2JqZWN0ICopIGtleSktPm9iX3NoYXNoKSA9PSAtMSkgeworICAgICAgICBoYXNoID0gUHlPYmplY3RfSGFzaChrZXkpOworICAgICAgICBpZiAoaGFzaCA9PSAtMSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgYXNzZXJ0KHNvLT5maWxsIDw9IHNvLT5tYXNrKTsgIC8qIGF0IGxlYXN0IG9uZSBlbXB0eSBzbG90ICovCisgICAgbl91c2VkID0gc28tPnVzZWQ7CisgICAgUHlfSU5DUkVGKGtleSk7CisgICAgaWYgKHNldF9pbnNlcnRfa2V5KHNvLCBrZXksIGhhc2gpID09IC0xKSB7CisgICAgICAgIFB5X0RFQ1JFRihrZXkpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICghKHNvLT51c2VkID4gbl91c2VkICYmIHNvLT5maWxsKjMgPj0gKHNvLT5tYXNrKzEpKjIpKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gc2V0X3RhYmxlX3Jlc2l6ZShzbywgc28tPnVzZWQ+NTAwMDAgPyBzby0+dXNlZCoyIDogc28tPnVzZWQqNCk7CiB9CiAKICNkZWZpbmUgRElTQ0FSRF9OT1RGT1VORCAwCkBAIC00MDQsMTExICs0MDQsMTExIEBACiAKIHN0YXRpYyBpbnQKIHNldF9kaXNjYXJkX2VudHJ5KFB5U2V0T2JqZWN0ICpzbywgc2V0ZW50cnkgKm9sZGVudHJ5KQotewlyZWdpc3RlciBzZXRlbnRyeSAqZW50cnk7Ci0JUHlPYmplY3QgKm9sZF9rZXk7Cit7ICAgICAgIHJlZ2lzdGVyIHNldGVudHJ5ICplbnRyeTsKKyAgICBQeU9iamVjdCAqb2xkX2tleTsKIAotCWVudHJ5ID0gKHNvLT5sb29rdXApKHNvLCBvbGRlbnRyeS0+a2V5LCBvbGRlbnRyeS0+aGFzaCk7Ci0JaWYgKGVudHJ5ID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQlpZiAoZW50cnktPmtleSA9PSBOVUxMICB8fCAgZW50cnktPmtleSA9PSBkdW1teSkKLQkJcmV0dXJuIERJU0NBUkRfTk9URk9VTkQ7Ci0Jb2xkX2tleSA9IGVudHJ5LT5rZXk7Ci0JUHlfSU5DUkVGKGR1bW15KTsKLQllbnRyeS0+a2V5ID0gZHVtbXk7Ci0Jc28tPnVzZWQtLTsKLQlQeV9ERUNSRUYob2xkX2tleSk7Ci0JcmV0dXJuIERJU0NBUkRfRk9VTkQ7CisgICAgZW50cnkgPSAoc28tPmxvb2t1cCkoc28sIG9sZGVudHJ5LT5rZXksIG9sZGVudHJ5LT5oYXNoKTsKKyAgICBpZiAoZW50cnkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmIChlbnRyeS0+a2V5ID09IE5VTEwgIHx8ICBlbnRyeS0+a2V5ID09IGR1bW15KQorICAgICAgICByZXR1cm4gRElTQ0FSRF9OT1RGT1VORDsKKyAgICBvbGRfa2V5ID0gZW50cnktPmtleTsKKyAgICBQeV9JTkNSRUYoZHVtbXkpOworICAgIGVudHJ5LT5rZXkgPSBkdW1teTsKKyAgICBzby0+dXNlZC0tOworICAgIFB5X0RFQ1JFRihvbGRfa2V5KTsKKyAgICByZXR1cm4gRElTQ0FSRF9GT1VORDsKIH0KIAogc3RhdGljIGludAogc2V0X2Rpc2NhcmRfa2V5KFB5U2V0T2JqZWN0ICpzbywgUHlPYmplY3QgKmtleSkKIHsKLQlyZWdpc3RlciBsb25nIGhhc2g7Ci0JcmVnaXN0ZXIgc2V0ZW50cnkgKmVudHJ5OwotCVB5T2JqZWN0ICpvbGRfa2V5OworICAgIHJlZ2lzdGVyIGxvbmcgaGFzaDsKKyAgICByZWdpc3RlciBzZXRlbnRyeSAqZW50cnk7CisgICAgUHlPYmplY3QgKm9sZF9rZXk7CiAKLQlhc3NlcnQgKFB5QW55U2V0X0NoZWNrKHNvKSk7Ci0JaWYgKCFQeVN0cmluZ19DaGVja0V4YWN0KGtleSkgfHwKLQkgICAgKGhhc2ggPSAoKFB5U3RyaW5nT2JqZWN0ICopIGtleSktPm9iX3NoYXNoKSA9PSAtMSkgewotCQloYXNoID0gUHlPYmplY3RfSGFzaChrZXkpOwotCQlpZiAoaGFzaCA9PSAtMSkKLQkJCXJldHVybiAtMTsKLQl9Ci0JZW50cnkgPSAoc28tPmxvb2t1cCkoc28sIGtleSwgaGFzaCk7Ci0JaWYgKGVudHJ5ID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQlpZiAoZW50cnktPmtleSA9PSBOVUxMICB8fCAgZW50cnktPmtleSA9PSBkdW1teSkKLQkJcmV0dXJuIERJU0NBUkRfTk9URk9VTkQ7Ci0Jb2xkX2tleSA9IGVudHJ5LT5rZXk7Ci0JUHlfSU5DUkVGKGR1bW15KTsKLQllbnRyeS0+a2V5ID0gZHVtbXk7Ci0Jc28tPnVzZWQtLTsKLQlQeV9ERUNSRUYob2xkX2tleSk7Ci0JcmV0dXJuIERJU0NBUkRfRk9VTkQ7CisgICAgYXNzZXJ0IChQeUFueVNldF9DaGVjayhzbykpOworICAgIGlmICghUHlTdHJpbmdfQ2hlY2tFeGFjdChrZXkpIHx8CisgICAgICAgIChoYXNoID0gKChQeVN0cmluZ09iamVjdCAqKSBrZXkpLT5vYl9zaGFzaCkgPT0gLTEpIHsKKyAgICAgICAgaGFzaCA9IFB5T2JqZWN0X0hhc2goa2V5KTsKKyAgICAgICAgaWYgKGhhc2ggPT0gLTEpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGVudHJ5ID0gKHNvLT5sb29rdXApKHNvLCBrZXksIGhhc2gpOworICAgIGlmIChlbnRyeSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKGVudHJ5LT5rZXkgPT0gTlVMTCAgfHwgIGVudHJ5LT5rZXkgPT0gZHVtbXkpCisgICAgICAgIHJldHVybiBESVNDQVJEX05PVEZPVU5EOworICAgIG9sZF9rZXkgPSBlbnRyeS0+a2V5OworICAgIFB5X0lOQ1JFRihkdW1teSk7CisgICAgZW50cnktPmtleSA9IGR1bW15OworICAgIHNvLT51c2VkLS07CisgICAgUHlfREVDUkVGKG9sZF9rZXkpOworICAgIHJldHVybiBESVNDQVJEX0ZPVU5EOwogfQogCiBzdGF0aWMgaW50CiBzZXRfY2xlYXJfaW50ZXJuYWwoUHlTZXRPYmplY3QgKnNvKQogewotCXNldGVudHJ5ICplbnRyeSwgKnRhYmxlOwotCWludCB0YWJsZV9pc19tYWxsb2NlZDsKLQlQeV9zc2l6ZV90IGZpbGw7Ci0Jc2V0ZW50cnkgc21hbGxfY29weVtQeVNldF9NSU5TSVpFXTsKKyAgICBzZXRlbnRyeSAqZW50cnksICp0YWJsZTsKKyAgICBpbnQgdGFibGVfaXNfbWFsbG9jZWQ7CisgICAgUHlfc3NpemVfdCBmaWxsOworICAgIHNldGVudHJ5IHNtYWxsX2NvcHlbUHlTZXRfTUlOU0laRV07CiAjaWZkZWYgUHlfREVCVUcKLQlQeV9zc2l6ZV90IGksIG47Ci0JYXNzZXJ0IChQeUFueVNldF9DaGVjayhzbykpOworICAgIFB5X3NzaXplX3QgaSwgbjsKKyAgICBhc3NlcnQgKFB5QW55U2V0X0NoZWNrKHNvKSk7CiAKLQluID0gc28tPm1hc2sgKyAxOwotCWkgPSAwOworICAgIG4gPSBzby0+bWFzayArIDE7CisgICAgaSA9IDA7CiAjZW5kaWYKIAotCXRhYmxlID0gc28tPnRhYmxlOwotCWFzc2VydCh0YWJsZSAhPSBOVUxMKTsKLQl0YWJsZV9pc19tYWxsb2NlZCA9IHRhYmxlICE9IHNvLT5zbWFsbHRhYmxlOworICAgIHRhYmxlID0gc28tPnRhYmxlOworICAgIGFzc2VydCh0YWJsZSAhPSBOVUxMKTsKKyAgICB0YWJsZV9pc19tYWxsb2NlZCA9IHRhYmxlICE9IHNvLT5zbWFsbHRhYmxlOwogCi0JLyogVGhpcyBpcyBkZWxpY2F0ZS4gIER1cmluZyB0aGUgcHJvY2VzcyBvZiBjbGVhcmluZyB0aGUgc2V0LAotCSAqIGRlY3JlZnMgY2FuIGNhdXNlIHRoZSBzZXQgdG8gbXV0YXRlLiAgVG8gYXZvaWQgZmF0YWwgY29uZnVzaW9uCi0JICogKHZvaWNlIG9mIGV4cGVyaWVuY2UpLCB3ZSBoYXZlIHRvIG1ha2UgdGhlIHNldCBlbXB0eSBiZWZvcmUKLQkgKiBjbGVhcmluZyB0aGUgc2xvdHMsIGFuZCBuZXZlciByZWZlciB0byBhbnl0aGluZyB2aWEgc28tPnJlZiB3aGlsZQotCSAqIGNsZWFyaW5nLgotCSAqLwotCWZpbGwgPSBzby0+ZmlsbDsKLQlpZiAodGFibGVfaXNfbWFsbG9jZWQpCi0JCUVNUFRZX1RPX01JTlNJWkUoc28pOworICAgIC8qIFRoaXMgaXMgZGVsaWNhdGUuICBEdXJpbmcgdGhlIHByb2Nlc3Mgb2YgY2xlYXJpbmcgdGhlIHNldCwKKyAgICAgKiBkZWNyZWZzIGNhbiBjYXVzZSB0aGUgc2V0IHRvIG11dGF0ZS4gIFRvIGF2b2lkIGZhdGFsIGNvbmZ1c2lvbgorICAgICAqICh2b2ljZSBvZiBleHBlcmllbmNlKSwgd2UgaGF2ZSB0byBtYWtlIHRoZSBzZXQgZW1wdHkgYmVmb3JlCisgICAgICogY2xlYXJpbmcgdGhlIHNsb3RzLCBhbmQgbmV2ZXIgcmVmZXIgdG8gYW55dGhpbmcgdmlhIHNvLT5yZWYgd2hpbGUKKyAgICAgKiBjbGVhcmluZy4KKyAgICAgKi8KKyAgICBmaWxsID0gc28tPmZpbGw7CisgICAgaWYgKHRhYmxlX2lzX21hbGxvY2VkKQorICAgICAgICBFTVBUWV9UT19NSU5TSVpFKHNvKTsKIAotCWVsc2UgaWYgKGZpbGwgPiAwKSB7Ci0JCS8qIEl0J3MgYSBzbWFsbCB0YWJsZSB3aXRoIHNvbWV0aGluZyB0aGF0IG5lZWRzIHRvIGJlIGNsZWFyZWQuCi0JCSAqIEFmcmFpZCB0aGUgb25seSBzYWZlIHdheSBpcyB0byBjb3B5IHRoZSBzZXQgZW50cmllcyBpbnRvCi0JCSAqIGFub3RoZXIgc21hbGwgdGFibGUgZmlyc3QuCi0JCSAqLwotCQltZW1jcHkoc21hbGxfY29weSwgdGFibGUsIHNpemVvZihzbWFsbF9jb3B5KSk7Ci0JCXRhYmxlID0gc21hbGxfY29weTsKLQkJRU1QVFlfVE9fTUlOU0laRShzbyk7Ci0JfQotCS8qIGVsc2UgaXQncyBhIHNtYWxsIHRhYmxlIHRoYXQncyBhbHJlYWR5IGVtcHR5ICovCisgICAgZWxzZSBpZiAoZmlsbCA+IDApIHsKKyAgICAgICAgLyogSXQncyBhIHNtYWxsIHRhYmxlIHdpdGggc29tZXRoaW5nIHRoYXQgbmVlZHMgdG8gYmUgY2xlYXJlZC4KKyAgICAgICAgICogQWZyYWlkIHRoZSBvbmx5IHNhZmUgd2F5IGlzIHRvIGNvcHkgdGhlIHNldCBlbnRyaWVzIGludG8KKyAgICAgICAgICogYW5vdGhlciBzbWFsbCB0YWJsZSBmaXJzdC4KKyAgICAgICAgICovCisgICAgICAgIG1lbWNweShzbWFsbF9jb3B5LCB0YWJsZSwgc2l6ZW9mKHNtYWxsX2NvcHkpKTsKKyAgICAgICAgdGFibGUgPSBzbWFsbF9jb3B5OworICAgICAgICBFTVBUWV9UT19NSU5TSVpFKHNvKTsKKyAgICB9CisgICAgLyogZWxzZSBpdCdzIGEgc21hbGwgdGFibGUgdGhhdCdzIGFscmVhZHkgZW1wdHkgKi8KIAotCS8qIE5vdyB3ZSBjYW4gZmluYWxseSBjbGVhciB0aGluZ3MuICBJZiBDIGhhZCByZWZjb3VudHMsIHdlIGNvdWxkCi0JICogYXNzZXJ0IHRoYXQgdGhlIHJlZmNvdW50IG9uIHRhYmxlIGlzIDEgbm93LCBpLmUuIHRoYXQgdGhpcyBmdW5jdGlvbgotCSAqIGhhcyB1bmlxdWUgYWNjZXNzIHRvIGl0LCBzbyBkZWNyZWYgc2lkZS1lZmZlY3RzIGNhbid0IGFsdGVyIGl0LgotCSAqLwotCWZvciAoZW50cnkgPSB0YWJsZTsgZmlsbCA+IDA7ICsrZW50cnkpIHsKKyAgICAvKiBOb3cgd2UgY2FuIGZpbmFsbHkgY2xlYXIgdGhpbmdzLiAgSWYgQyBoYWQgcmVmY291bnRzLCB3ZSBjb3VsZAorICAgICAqIGFzc2VydCB0aGF0IHRoZSByZWZjb3VudCBvbiB0YWJsZSBpcyAxIG5vdywgaS5lLiB0aGF0IHRoaXMgZnVuY3Rpb24KKyAgICAgKiBoYXMgdW5pcXVlIGFjY2VzcyB0byBpdCwgc28gZGVjcmVmIHNpZGUtZWZmZWN0cyBjYW4ndCBhbHRlciBpdC4KKyAgICAgKi8KKyAgICBmb3IgKGVudHJ5ID0gdGFibGU7IGZpbGwgPiAwOyArK2VudHJ5KSB7CiAjaWZkZWYgUHlfREVCVUcKLQkJYXNzZXJ0KGkgPCBuKTsKLQkJKytpOworICAgICAgICBhc3NlcnQoaSA8IG4pOworICAgICAgICArK2k7CiAjZW5kaWYKLQkJaWYgKGVudHJ5LT5rZXkpIHsKLQkJCS0tZmlsbDsKLQkJCVB5X0RFQ1JFRihlbnRyeS0+a2V5KTsKLQkJfQorICAgICAgICBpZiAoZW50cnktPmtleSkgeworICAgICAgICAgICAgLS1maWxsOworICAgICAgICAgICAgUHlfREVDUkVGKGVudHJ5LT5rZXkpOworICAgICAgICB9CiAjaWZkZWYgUHlfREVCVUcKLQkJZWxzZQotCQkJYXNzZXJ0KGVudHJ5LT5rZXkgPT0gTlVMTCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGFzc2VydChlbnRyeS0+a2V5ID09IE5VTEwpOwogI2VuZGlmCi0JfQorICAgIH0KIAotCWlmICh0YWJsZV9pc19tYWxsb2NlZCkKLQkJUHlNZW1fREVMKHRhYmxlKTsKLQlyZXR1cm4gMDsKKyAgICBpZiAodGFibGVfaXNfbWFsbG9jZWQpCisgICAgICAgIFB5TWVtX0RFTCh0YWJsZSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIC8qCkBAIC01MjIsMjM2ICs1MjIsMjM2IEBACiAgKiAgICAgfQogICoKICAqIENBVVRJT046ICBJbiBnZW5lcmFsLCBpdCBpc24ndCBzYWZlIHRvIHVzZSBzZXRfbmV4dCBpbiBhIGxvb3AgdGhhdAotICogbXV0YXRlcyB0aGUgdGFibGUuICAKKyAqIG11dGF0ZXMgdGhlIHRhYmxlLgogICovCiBzdGF0aWMgaW50CiBzZXRfbmV4dChQeVNldE9iamVjdCAqc28sIFB5X3NzaXplX3QgKnBvc19wdHIsIHNldGVudHJ5ICoqZW50cnlfcHRyKQogewotCVB5X3NzaXplX3QgaTsKLQlQeV9zc2l6ZV90IG1hc2s7Ci0JcmVnaXN0ZXIgc2V0ZW50cnkgKnRhYmxlOworICAgIFB5X3NzaXplX3QgaTsKKyAgICBQeV9zc2l6ZV90IG1hc2s7CisgICAgcmVnaXN0ZXIgc2V0ZW50cnkgKnRhYmxlOwogCi0JYXNzZXJ0IChQeUFueVNldF9DaGVjayhzbykpOwotCWkgPSAqcG9zX3B0cjsKLQlhc3NlcnQoaSA+PSAwKTsKLQl0YWJsZSA9IHNvLT50YWJsZTsKLQltYXNrID0gc28tPm1hc2s7Ci0Jd2hpbGUgKGkgPD0gbWFzayAmJiAodGFibGVbaV0ua2V5ID09IE5VTEwgfHwgdGFibGVbaV0ua2V5ID09IGR1bW15KSkKLQkJaSsrOwotCSpwb3NfcHRyID0gaSsxOwotCWlmIChpID4gbWFzaykKLQkJcmV0dXJuIDA7Ci0JYXNzZXJ0KHRhYmxlW2ldLmtleSAhPSBOVUxMKTsKLQkqZW50cnlfcHRyID0gJnRhYmxlW2ldOwotCXJldHVybiAxOworICAgIGFzc2VydCAoUHlBbnlTZXRfQ2hlY2soc28pKTsKKyAgICBpID0gKnBvc19wdHI7CisgICAgYXNzZXJ0KGkgPj0gMCk7CisgICAgdGFibGUgPSBzby0+dGFibGU7CisgICAgbWFzayA9IHNvLT5tYXNrOworICAgIHdoaWxlIChpIDw9IG1hc2sgJiYgKHRhYmxlW2ldLmtleSA9PSBOVUxMIHx8IHRhYmxlW2ldLmtleSA9PSBkdW1teSkpCisgICAgICAgIGkrKzsKKyAgICAqcG9zX3B0ciA9IGkrMTsKKyAgICBpZiAoaSA+IG1hc2spCisgICAgICAgIHJldHVybiAwOworICAgIGFzc2VydCh0YWJsZVtpXS5rZXkgIT0gTlVMTCk7CisgICAgKmVudHJ5X3B0ciA9ICZ0YWJsZVtpXTsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIHZvaWQKIHNldF9kZWFsbG9jKFB5U2V0T2JqZWN0ICpzbykKIHsKLQlyZWdpc3RlciBzZXRlbnRyeSAqZW50cnk7Ci0JUHlfc3NpemVfdCBmaWxsID0gc28tPmZpbGw7Ci0JUHlPYmplY3RfR0NfVW5UcmFjayhzbyk7Ci0JUHlfVFJBU0hDQU5fU0FGRV9CRUdJTihzbykKLQlpZiAoc28tPndlYWtyZWZsaXN0ICE9IE5VTEwpCi0JCVB5T2JqZWN0X0NsZWFyV2Vha1JlZnMoKFB5T2JqZWN0ICopIHNvKTsKKyAgICByZWdpc3RlciBzZXRlbnRyeSAqZW50cnk7CisgICAgUHlfc3NpemVfdCBmaWxsID0gc28tPmZpbGw7CisgICAgUHlPYmplY3RfR0NfVW5UcmFjayhzbyk7CisgICAgUHlfVFJBU0hDQU5fU0FGRV9CRUdJTihzbykKKyAgICBpZiAoc28tPndlYWtyZWZsaXN0ICE9IE5VTEwpCisgICAgICAgIFB5T2JqZWN0X0NsZWFyV2Vha1JlZnMoKFB5T2JqZWN0ICopIHNvKTsKIAotCWZvciAoZW50cnkgPSBzby0+dGFibGU7IGZpbGwgPiAwOyBlbnRyeSsrKSB7Ci0JCWlmIChlbnRyeS0+a2V5KSB7Ci0JCQktLWZpbGw7Ci0JCQlQeV9ERUNSRUYoZW50cnktPmtleSk7Ci0JCX0KLQl9Ci0JaWYgKHNvLT50YWJsZSAhPSBzby0+c21hbGx0YWJsZSkKLQkJUHlNZW1fREVMKHNvLT50YWJsZSk7Ci0JaWYgKG51bWZyZWUgPCBQeVNldF9NQVhGUkVFTElTVCAmJiBQeUFueVNldF9DaGVja0V4YWN0KHNvKSkKLQkJZnJlZV9saXN0W251bWZyZWUrK10gPSBzbzsKLQllbHNlIAotCQlQeV9UWVBFKHNvKS0+dHBfZnJlZShzbyk7Ci0JUHlfVFJBU0hDQU5fU0FGRV9FTkQoc28pCisgICAgZm9yIChlbnRyeSA9IHNvLT50YWJsZTsgZmlsbCA+IDA7IGVudHJ5KyspIHsKKyAgICAgICAgaWYgKGVudHJ5LT5rZXkpIHsKKyAgICAgICAgICAgIC0tZmlsbDsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihlbnRyeS0+a2V5KTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoc28tPnRhYmxlICE9IHNvLT5zbWFsbHRhYmxlKQorICAgICAgICBQeU1lbV9ERUwoc28tPnRhYmxlKTsKKyAgICBpZiAobnVtZnJlZSA8IFB5U2V0X01BWEZSRUVMSVNUICYmIFB5QW55U2V0X0NoZWNrRXhhY3Qoc28pKQorICAgICAgICBmcmVlX2xpc3RbbnVtZnJlZSsrXSA9IHNvOworICAgIGVsc2UKKyAgICAgICAgUHlfVFlQRShzbyktPnRwX2ZyZWUoc28pOworICAgIFB5X1RSQVNIQ0FOX1NBRkVfRU5EKHNvKQogfQogCiBzdGF0aWMgaW50CiBzZXRfdHBfcHJpbnQoUHlTZXRPYmplY3QgKnNvLCBGSUxFICpmcCwgaW50IGZsYWdzKQogewotCXNldGVudHJ5ICplbnRyeTsKLQlQeV9zc2l6ZV90IHBvcz0wOwotCWNoYXIgKmVtaXQgPSAiIjsJLyogTm8gc2VwYXJhdG9yIGVtaXR0ZWQgb24gZmlyc3QgcGFzcyAqLwotCWNoYXIgKnNlcGFyYXRvciA9ICIsICI7Ci0JaW50IHN0YXR1cyA9IFB5X1JlcHJFbnRlcigoUHlPYmplY3QqKXNvKTsKKyAgICBzZXRlbnRyeSAqZW50cnk7CisgICAgUHlfc3NpemVfdCBwb3M9MDsKKyAgICBjaGFyICplbWl0ID0gIiI7ICAgICAgICAgICAgLyogTm8gc2VwYXJhdG9yIGVtaXR0ZWQgb24gZmlyc3QgcGFzcyAqLworICAgIGNoYXIgKnNlcGFyYXRvciA9ICIsICI7CisgICAgaW50IHN0YXR1cyA9IFB5X1JlcHJFbnRlcigoUHlPYmplY3QqKXNvKTsKIAotCWlmIChzdGF0dXMgIT0gMCkgewotCQlpZiAoc3RhdHVzIDwgMCkKLQkJCXJldHVybiBzdGF0dXM7Ci0JCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQkJZnByaW50ZihmcCwgIiVzKC4uLikiLCBzby0+b2JfdHlwZS0+dHBfbmFtZSk7Ci0JCVB5X0VORF9BTExPV19USFJFQURTCi0JCXJldHVybiAwOwotCX0gICAgICAgIAorICAgIGlmIChzdGF0dXMgIT0gMCkgeworICAgICAgICBpZiAoc3RhdHVzIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgZnByaW50ZihmcCwgIiVzKC4uLikiLCBzby0+b2JfdHlwZS0+dHBfbmFtZSk7CisgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgICAgIHJldHVybiAwOworICAgIH0KIAotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlmcHJpbnRmKGZwLCAiJXMoWyIsIHNvLT5vYl90eXBlLT50cF9uYW1lKTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCXdoaWxlIChzZXRfbmV4dChzbywgJnBvcywgJmVudHJ5KSkgewotCQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JCWZwdXRzKGVtaXQsIGZwKTsKLQkJUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQkJZW1pdCA9IHNlcGFyYXRvcjsKLQkJaWYgKFB5T2JqZWN0X1ByaW50KGVudHJ5LT5rZXksIGZwLCAwKSAhPSAwKSB7Ci0JCQlQeV9SZXByTGVhdmUoKFB5T2JqZWN0Kilzbyk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9Ci0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCWZwdXRzKCJdKSIsIGZwKTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCVB5X1JlcHJMZWF2ZSgoUHlPYmplY3QqKXNvKTsgICAgICAgIAotCXJldHVybiAwOworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICBmcHJpbnRmKGZwLCAiJXMoWyIsIHNvLT5vYl90eXBlLT50cF9uYW1lKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIHdoaWxlIChzZXRfbmV4dChzbywgJnBvcywgJmVudHJ5KSkgeworICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgICAgIGZwdXRzKGVtaXQsIGZwKTsKKyAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgZW1pdCA9IHNlcGFyYXRvcjsKKyAgICAgICAgaWYgKFB5T2JqZWN0X1ByaW50KGVudHJ5LT5rZXksIGZwLCAwKSAhPSAwKSB7CisgICAgICAgICAgICBQeV9SZXByTGVhdmUoKFB5T2JqZWN0Kilzbyk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIGZwdXRzKCJdKSIsIGZwKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIFB5X1JlcHJMZWF2ZSgoUHlPYmplY3QqKXNvKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNldF9yZXByKFB5U2V0T2JqZWN0ICpzbykKIHsKLQlQeU9iamVjdCAqa2V5cywgKnJlc3VsdD1OVUxMLCAqbGlzdHJlcHI7Ci0JaW50IHN0YXR1cyA9IFB5X1JlcHJFbnRlcigoUHlPYmplY3QqKXNvKTsKKyAgICBQeU9iamVjdCAqa2V5cywgKnJlc3VsdD1OVUxMLCAqbGlzdHJlcHI7CisgICAgaW50IHN0YXR1cyA9IFB5X1JlcHJFbnRlcigoUHlPYmplY3QqKXNvKTsKIAotCWlmIChzdGF0dXMgIT0gMCkgewotCQlpZiAoc3RhdHVzIDwgMCkKLQkJCXJldHVybiBOVUxMOwotCQlyZXR1cm4gUHlTdHJpbmdfRnJvbUZvcm1hdCgiJXMoLi4uKSIsIHNvLT5vYl90eXBlLT50cF9uYW1lKTsKLQl9CisgICAgaWYgKHN0YXR1cyAhPSAwKSB7CisgICAgICAgIGlmIChzdGF0dXMgPCAwKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tRm9ybWF0KCIlcyguLi4pIiwgc28tPm9iX3R5cGUtPnRwX25hbWUpOworICAgIH0KIAotCWtleXMgPSBQeVNlcXVlbmNlX0xpc3QoKFB5T2JqZWN0ICopc28pOwotCWlmIChrZXlzID09IE5VTEwpCi0JCWdvdG8gZG9uZTsKLQlsaXN0cmVwciA9IFB5T2JqZWN0X1JlcHIoa2V5cyk7Ci0JUHlfREVDUkVGKGtleXMpOwotCWlmIChsaXN0cmVwciA9PSBOVUxMKQotCQlnb3RvIGRvbmU7CisgICAga2V5cyA9IFB5U2VxdWVuY2VfTGlzdCgoUHlPYmplY3QgKilzbyk7CisgICAgaWYgKGtleXMgPT0gTlVMTCkKKyAgICAgICAgZ290byBkb25lOworICAgIGxpc3RyZXByID0gUHlPYmplY3RfUmVwcihrZXlzKTsKKyAgICBQeV9ERUNSRUYoa2V5cyk7CisgICAgaWYgKGxpc3RyZXByID09IE5VTEwpCisgICAgICAgIGdvdG8gZG9uZTsKIAotCXJlc3VsdCA9IFB5U3RyaW5nX0Zyb21Gb3JtYXQoIiVzKCVzKSIsIHNvLT5vYl90eXBlLT50cF9uYW1lLAotCQlQeVN0cmluZ19BU19TVFJJTkcobGlzdHJlcHIpKTsKLQlQeV9ERUNSRUYobGlzdHJlcHIpOworICAgIHJlc3VsdCA9IFB5U3RyaW5nX0Zyb21Gb3JtYXQoIiVzKCVzKSIsIHNvLT5vYl90eXBlLT50cF9uYW1lLAorICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcobGlzdHJlcHIpKTsKKyAgICBQeV9ERUNSRUYobGlzdHJlcHIpOwogZG9uZToKLQlQeV9SZXByTGVhdmUoKFB5T2JqZWN0Kilzbyk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBQeV9SZXByTGVhdmUoKFB5T2JqZWN0Kilzbyk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIFB5X3NzaXplX3QKIHNldF9sZW4oUHlPYmplY3QgKnNvKQogewotCXJldHVybiAoKFB5U2V0T2JqZWN0ICopc28pLT51c2VkOworICAgIHJldHVybiAoKFB5U2V0T2JqZWN0ICopc28pLT51c2VkOwogfQogCiBzdGF0aWMgaW50CiBzZXRfbWVyZ2UoUHlTZXRPYmplY3QgKnNvLCBQeU9iamVjdCAqb3RoZXJzZXQpCiB7Ci0JUHlTZXRPYmplY3QgKm90aGVyOwotCXJlZ2lzdGVyIFB5X3NzaXplX3QgaTsKLQlyZWdpc3RlciBzZXRlbnRyeSAqZW50cnk7CisgICAgUHlTZXRPYmplY3QgKm90aGVyOworICAgIHJlZ2lzdGVyIFB5X3NzaXplX3QgaTsKKyAgICByZWdpc3RlciBzZXRlbnRyeSAqZW50cnk7CiAKLQlhc3NlcnQgKFB5QW55U2V0X0NoZWNrKHNvKSk7Ci0JYXNzZXJ0IChQeUFueVNldF9DaGVjayhvdGhlcnNldCkpOworICAgIGFzc2VydCAoUHlBbnlTZXRfQ2hlY2soc28pKTsKKyAgICBhc3NlcnQgKFB5QW55U2V0X0NoZWNrKG90aGVyc2V0KSk7CiAKLQlvdGhlciA9IChQeVNldE9iamVjdCopb3RoZXJzZXQ7Ci0JaWYgKG90aGVyID09IHNvIHx8IG90aGVyLT51c2VkID09IDApCi0JCS8qIGEudXBkYXRlKGEpIG9yIGEudXBkYXRlKHt9KTsgbm90aGluZyB0byBkbyAqLwotCQlyZXR1cm4gMDsKLQkvKiBEbyBvbmUgYmlnIHJlc2l6ZSBhdCB0aGUgc3RhcnQsIHJhdGhlciB0aGFuCi0JICogaW5jcmVtZW50YWxseSByZXNpemluZyBhcyB3ZSBpbnNlcnQgbmV3IGtleXMuICBFeHBlY3QKLQkgKiB0aGF0IHRoZXJlIHdpbGwgYmUgbm8gKG9yIGZldykgb3ZlcmxhcHBpbmcga2V5cy4KLQkgKi8KLQlpZiAoKHNvLT5maWxsICsgb3RoZXItPnVzZWQpKjMgPj0gKHNvLT5tYXNrKzEpKjIpIHsKLQkgICBpZiAoc2V0X3RhYmxlX3Jlc2l6ZShzbywgKHNvLT51c2VkICsgb3RoZXItPnVzZWQpKjIpICE9IDApCi0JCSAgIHJldHVybiAtMTsKLQl9Ci0JZm9yIChpID0gMDsgaSA8PSBvdGhlci0+bWFzazsgaSsrKSB7Ci0JCWVudHJ5ID0gJm90aGVyLT50YWJsZVtpXTsKLQkJaWYgKGVudHJ5LT5rZXkgIT0gTlVMTCAmJiAKLQkJICAgIGVudHJ5LT5rZXkgIT0gZHVtbXkpIHsKLQkJCVB5X0lOQ1JFRihlbnRyeS0+a2V5KTsKLQkJCWlmIChzZXRfaW5zZXJ0X2tleShzbywgZW50cnktPmtleSwgZW50cnktPmhhc2gpID09IC0xKSB7Ci0JCQkJUHlfREVDUkVGKGVudHJ5LT5rZXkpOwotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfQotCX0KLQlyZXR1cm4gMDsKKyAgICBvdGhlciA9IChQeVNldE9iamVjdCopb3RoZXJzZXQ7CisgICAgaWYgKG90aGVyID09IHNvIHx8IG90aGVyLT51c2VkID09IDApCisgICAgICAgIC8qIGEudXBkYXRlKGEpIG9yIGEudXBkYXRlKHt9KTsgbm90aGluZyB0byBkbyAqLworICAgICAgICByZXR1cm4gMDsKKyAgICAvKiBEbyBvbmUgYmlnIHJlc2l6ZSBhdCB0aGUgc3RhcnQsIHJhdGhlciB0aGFuCisgICAgICogaW5jcmVtZW50YWxseSByZXNpemluZyBhcyB3ZSBpbnNlcnQgbmV3IGtleXMuICBFeHBlY3QKKyAgICAgKiB0aGF0IHRoZXJlIHdpbGwgYmUgbm8gKG9yIGZldykgb3ZlcmxhcHBpbmcga2V5cy4KKyAgICAgKi8KKyAgICBpZiAoKHNvLT5maWxsICsgb3RoZXItPnVzZWQpKjMgPj0gKHNvLT5tYXNrKzEpKjIpIHsKKyAgICAgICBpZiAoc2V0X3RhYmxlX3Jlc2l6ZShzbywgKHNvLT51c2VkICsgb3RoZXItPnVzZWQpKjIpICE9IDApCisgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8PSBvdGhlci0+bWFzazsgaSsrKSB7CisgICAgICAgIGVudHJ5ID0gJm90aGVyLT50YWJsZVtpXTsKKyAgICAgICAgaWYgKGVudHJ5LT5rZXkgIT0gTlVMTCAmJgorICAgICAgICAgICAgZW50cnktPmtleSAhPSBkdW1teSkgeworICAgICAgICAgICAgUHlfSU5DUkVGKGVudHJ5LT5rZXkpOworICAgICAgICAgICAgaWYgKHNldF9pbnNlcnRfa2V5KHNvLCBlbnRyeS0+a2V5LCBlbnRyeS0+aGFzaCkgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoZW50cnktPmtleSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBzZXRfY29udGFpbnNfa2V5KFB5U2V0T2JqZWN0ICpzbywgUHlPYmplY3QgKmtleSkKIHsKLQlsb25nIGhhc2g7Ci0Jc2V0ZW50cnkgKmVudHJ5OworICAgIGxvbmcgaGFzaDsKKyAgICBzZXRlbnRyeSAqZW50cnk7CiAKLQlpZiAoIVB5U3RyaW5nX0NoZWNrRXhhY3Qoa2V5KSB8fAotCSAgICAoaGFzaCA9ICgoUHlTdHJpbmdPYmplY3QgKikga2V5KS0+b2Jfc2hhc2gpID09IC0xKSB7Ci0JCWhhc2ggPSBQeU9iamVjdF9IYXNoKGtleSk7Ci0JCWlmIChoYXNoID09IC0xKQotCQkJcmV0dXJuIC0xOwotCX0KLQllbnRyeSA9IChzby0+bG9va3VwKShzbywga2V5LCBoYXNoKTsKLQlpZiAoZW50cnkgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCWtleSA9IGVudHJ5LT5rZXk7Ci0JcmV0dXJuIGtleSAhPSBOVUxMICYmIGtleSAhPSBkdW1teTsKKyAgICBpZiAoIVB5U3RyaW5nX0NoZWNrRXhhY3Qoa2V5KSB8fAorICAgICAgICAoaGFzaCA9ICgoUHlTdHJpbmdPYmplY3QgKikga2V5KS0+b2Jfc2hhc2gpID09IC0xKSB7CisgICAgICAgIGhhc2ggPSBQeU9iamVjdF9IYXNoKGtleSk7CisgICAgICAgIGlmIChoYXNoID09IC0xKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBlbnRyeSA9IChzby0+bG9va3VwKShzbywga2V5LCBoYXNoKTsKKyAgICBpZiAoZW50cnkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGtleSA9IGVudHJ5LT5rZXk7CisgICAgcmV0dXJuIGtleSAhPSBOVUxMICYmIGtleSAhPSBkdW1teTsKIH0KIAogc3RhdGljIGludAogc2V0X2NvbnRhaW5zX2VudHJ5KFB5U2V0T2JqZWN0ICpzbywgc2V0ZW50cnkgKmVudHJ5KQogewotCVB5T2JqZWN0ICprZXk7Ci0Jc2V0ZW50cnkgKmx1X2VudHJ5OworICAgIFB5T2JqZWN0ICprZXk7CisgICAgc2V0ZW50cnkgKmx1X2VudHJ5OwogCi0JbHVfZW50cnkgPSAoc28tPmxvb2t1cCkoc28sIGVudHJ5LT5rZXksIGVudHJ5LT5oYXNoKTsKLQlpZiAobHVfZW50cnkgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCWtleSA9IGx1X2VudHJ5LT5rZXk7IAotCXJldHVybiBrZXkgIT0gTlVMTCAmJiBrZXkgIT0gZHVtbXk7CisgICAgbHVfZW50cnkgPSAoc28tPmxvb2t1cCkoc28sIGVudHJ5LT5rZXksIGVudHJ5LT5oYXNoKTsKKyAgICBpZiAobHVfZW50cnkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGtleSA9IGx1X2VudHJ5LT5rZXk7CisgICAgcmV0dXJuIGtleSAhPSBOVUxMICYmIGtleSAhPSBkdW1teTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNldF9wb3AoUHlTZXRPYmplY3QgKnNvKQogewotCXJlZ2lzdGVyIFB5X3NzaXplX3QgaSA9IDA7Ci0JcmVnaXN0ZXIgc2V0ZW50cnkgKmVudHJ5OwotCVB5T2JqZWN0ICprZXk7CisgICAgcmVnaXN0ZXIgUHlfc3NpemVfdCBpID0gMDsKKyAgICByZWdpc3RlciBzZXRlbnRyeSAqZW50cnk7CisgICAgUHlPYmplY3QgKmtleTsKIAotCWFzc2VydCAoUHlBbnlTZXRfQ2hlY2soc28pKTsKLQlpZiAoc28tPnVzZWQgPT0gMCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfS2V5RXJyb3IsICJwb3AgZnJvbSBhbiBlbXB0eSBzZXQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGFzc2VydCAoUHlBbnlTZXRfQ2hlY2soc28pKTsKKyAgICBpZiAoc28tPnVzZWQgPT0gMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfS2V5RXJyb3IsICJwb3AgZnJvbSBhbiBlbXB0eSBzZXQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JLyogU2V0IGVudHJ5IHRvICJ0aGUgZmlyc3QiIHVudXNlZCBvciBkdW1teSBzZXQgZW50cnkuICBXZSBhYnVzZQotCSAqIHRoZSBoYXNoIGZpZWxkIG9mIHNsb3QgMCB0byBob2xkIGEgc2VhcmNoIGZpbmdlcjoKLQkgKiBJZiBzbG90IDAgaGFzIGEgdmFsdWUsIHVzZSBzbG90IDAuCi0JICogRWxzZSBzbG90IDAgaXMgYmVpbmcgdXNlZCB0byBob2xkIGEgc2VhcmNoIGZpbmdlciwKLQkgKiBhbmQgd2UgdXNlIGl0cyBoYXNoIHZhbHVlIGFzIHRoZSBmaXJzdCBpbmRleCB0byBsb29rLgotCSAqLwotCWVudHJ5ID0gJnNvLT50YWJsZVswXTsKLQlpZiAoZW50cnktPmtleSA9PSBOVUxMIHx8IGVudHJ5LT5rZXkgPT0gZHVtbXkpIHsKLQkJaSA9IGVudHJ5LT5oYXNoOwotCQkvKiBUaGUgaGFzaCBmaWVsZCBtYXkgYmUgYSByZWFsIGhhc2ggdmFsdWUsIG9yIGl0IG1heSBiZSBhCi0JCSAqIGxlZ2l0IHNlYXJjaCBmaW5nZXIsIG9yIGl0IG1heSBiZSBhIG9uY2UtbGVnaXQgc2VhcmNoCi0JCSAqIGZpbmdlciB0aGF0J3Mgb3V0IG9mIGJvdW5kcyBub3cgYmVjYXVzZSBpdCB3cmFwcGVkIGFyb3VuZAotCQkgKiBvciB0aGUgdGFibGUgc2hydW5rIC0tIHNpbXBseSBtYWtlIHN1cmUgaXQncyBpbiBib3VuZHMgbm93LgotCQkgKi8KLQkJaWYgKGkgPiBzby0+bWFzayB8fCBpIDwgMSkKLQkJCWkgPSAxOwkvKiBza2lwIHNsb3QgMCAqLwotCQl3aGlsZSAoKGVudHJ5ID0gJnNvLT50YWJsZVtpXSktPmtleSA9PSBOVUxMIHx8IGVudHJ5LT5rZXk9PWR1bW15KSB7Ci0JCQlpKys7Ci0JCQlpZiAoaSA+IHNvLT5tYXNrKQotCQkJCWkgPSAxOwotCQl9Ci0JfQotCWtleSA9IGVudHJ5LT5rZXk7Ci0JUHlfSU5DUkVGKGR1bW15KTsKLQllbnRyeS0+a2V5ID0gZHVtbXk7Ci0Jc28tPnVzZWQtLTsKLQlzby0+dGFibGVbMF0uaGFzaCA9IGkgKyAxOyAgLyogbmV4dCBwbGFjZSB0byBzdGFydCAqLwotCXJldHVybiBrZXk7CisgICAgLyogU2V0IGVudHJ5IHRvICJ0aGUgZmlyc3QiIHVudXNlZCBvciBkdW1teSBzZXQgZW50cnkuICBXZSBhYnVzZQorICAgICAqIHRoZSBoYXNoIGZpZWxkIG9mIHNsb3QgMCB0byBob2xkIGEgc2VhcmNoIGZpbmdlcjoKKyAgICAgKiBJZiBzbG90IDAgaGFzIGEgdmFsdWUsIHVzZSBzbG90IDAuCisgICAgICogRWxzZSBzbG90IDAgaXMgYmVpbmcgdXNlZCB0byBob2xkIGEgc2VhcmNoIGZpbmdlciwKKyAgICAgKiBhbmQgd2UgdXNlIGl0cyBoYXNoIHZhbHVlIGFzIHRoZSBmaXJzdCBpbmRleCB0byBsb29rLgorICAgICAqLworICAgIGVudHJ5ID0gJnNvLT50YWJsZVswXTsKKyAgICBpZiAoZW50cnktPmtleSA9PSBOVUxMIHx8IGVudHJ5LT5rZXkgPT0gZHVtbXkpIHsKKyAgICAgICAgaSA9IGVudHJ5LT5oYXNoOworICAgICAgICAvKiBUaGUgaGFzaCBmaWVsZCBtYXkgYmUgYSByZWFsIGhhc2ggdmFsdWUsIG9yIGl0IG1heSBiZSBhCisgICAgICAgICAqIGxlZ2l0IHNlYXJjaCBmaW5nZXIsIG9yIGl0IG1heSBiZSBhIG9uY2UtbGVnaXQgc2VhcmNoCisgICAgICAgICAqIGZpbmdlciB0aGF0J3Mgb3V0IG9mIGJvdW5kcyBub3cgYmVjYXVzZSBpdCB3cmFwcGVkIGFyb3VuZAorICAgICAgICAgKiBvciB0aGUgdGFibGUgc2hydW5rIC0tIHNpbXBseSBtYWtlIHN1cmUgaXQncyBpbiBib3VuZHMgbm93LgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKGkgPiBzby0+bWFzayB8fCBpIDwgMSkKKyAgICAgICAgICAgIGkgPSAxOyAgICAgICAgICAgICAgLyogc2tpcCBzbG90IDAgKi8KKyAgICAgICAgd2hpbGUgKChlbnRyeSA9ICZzby0+dGFibGVbaV0pLT5rZXkgPT0gTlVMTCB8fCBlbnRyeS0+a2V5PT1kdW1teSkgeworICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgaWYgKGkgPiBzby0+bWFzaykKKyAgICAgICAgICAgICAgICBpID0gMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBrZXkgPSBlbnRyeS0+a2V5OworICAgIFB5X0lOQ1JFRihkdW1teSk7CisgICAgZW50cnktPmtleSA9IGR1bW15OworICAgIHNvLT51c2VkLS07CisgICAgc28tPnRhYmxlWzBdLmhhc2ggPSBpICsgMTsgIC8qIG5leHQgcGxhY2UgdG8gc3RhcnQgKi8KKyAgICByZXR1cm4ga2V5OwogfQogCiBQeURvY19TVFJWQVIocG9wX2RvYywgIlJlbW92ZSBhbmQgcmV0dXJuIGFuIGFyYml0cmFyeSBzZXQgZWxlbWVudC5cblwKQEAgLTc2MCwyNzcgKzc2MCwyNzcgQEAKIHN0YXRpYyBpbnQKIHNldF90cmF2ZXJzZShQeVNldE9iamVjdCAqc28sIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotCVB5X3NzaXplX3QgcG9zID0gMDsKLQlzZXRlbnRyeSAqZW50cnk7CisgICAgUHlfc3NpemVfdCBwb3MgPSAwOworICAgIHNldGVudHJ5ICplbnRyeTsKIAotCXdoaWxlIChzZXRfbmV4dChzbywgJnBvcywgJmVudHJ5KSkKLQkJUHlfVklTSVQoZW50cnktPmtleSk7Ci0JcmV0dXJuIDA7CisgICAgd2hpbGUgKHNldF9uZXh0KHNvLCAmcG9zLCAmZW50cnkpKQorICAgICAgICBQeV9WSVNJVChlbnRyeS0+a2V5KTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGxvbmcKIGZyb3plbnNldF9oYXNoKFB5T2JqZWN0ICpzZWxmKQogewotCVB5U2V0T2JqZWN0ICpzbyA9IChQeVNldE9iamVjdCAqKXNlbGY7Ci0JbG9uZyBoLCBoYXNoID0gMTkyNzg2ODIzN0w7Ci0Jc2V0ZW50cnkgKmVudHJ5OwotCVB5X3NzaXplX3QgcG9zID0gMDsKKyAgICBQeVNldE9iamVjdCAqc28gPSAoUHlTZXRPYmplY3QgKilzZWxmOworICAgIGxvbmcgaCwgaGFzaCA9IDE5Mjc4NjgyMzdMOworICAgIHNldGVudHJ5ICplbnRyeTsKKyAgICBQeV9zc2l6ZV90IHBvcyA9IDA7CiAKLQlpZiAoc28tPmhhc2ggIT0gLTEpCi0JCXJldHVybiBzby0+aGFzaDsKKyAgICBpZiAoc28tPmhhc2ggIT0gLTEpCisgICAgICAgIHJldHVybiBzby0+aGFzaDsKIAotCWhhc2ggKj0gUHlTZXRfR0VUX1NJWkUoc2VsZikgKyAxOwotCXdoaWxlIChzZXRfbmV4dChzbywgJnBvcywgJmVudHJ5KSkgewotCQkvKiBXb3JrIHRvIGluY3JlYXNlIHRoZSBiaXQgZGlzcGVyc2lvbiBmb3IgY2xvc2VseSBzcGFjZWQgaGFzaAotCQkgICB2YWx1ZXMuICBUaGUgaXMgaW1wb3J0YW50IGJlY2F1c2Ugc29tZSB1c2UgY2FzZXMgaGF2ZSBtYW55IAotCQkgICBjb21iaW5hdGlvbnMgb2YgYSBzbWFsbCBudW1iZXIgb2YgZWxlbWVudHMgd2l0aCBuZWFyYnkgCi0JCSAgIGhhc2hlcyBzbyB0aGF0IG1hbnkgZGlzdGluY3QgY29tYmluYXRpb25zIGNvbGxhcHNlIHRvIG9ubHkgCi0JCSAgIGEgaGFuZGZ1bCBvZiBkaXN0aW5jdCBoYXNoIHZhbHVlcy4gKi8KLQkJaCA9IGVudHJ5LT5oYXNoOwotCQloYXNoIF49IChoIF4gKGggPDwgMTYpIF4gODk4Njk3NDdMKSAgKiAzNjQ0Nzk4MTY3dTsKLQl9Ci0JaGFzaCA9IGhhc2ggKiA2OTA2OUwgKyA5MDcxMzM5MjNMOwotCWlmIChoYXNoID09IC0xKQotCQloYXNoID0gNTkwOTIzNzEzTDsKLQlzby0+aGFzaCA9IGhhc2g7Ci0JcmV0dXJuIGhhc2g7CisgICAgaGFzaCAqPSBQeVNldF9HRVRfU0laRShzZWxmKSArIDE7CisgICAgd2hpbGUgKHNldF9uZXh0KHNvLCAmcG9zLCAmZW50cnkpKSB7CisgICAgICAgIC8qIFdvcmsgdG8gaW5jcmVhc2UgdGhlIGJpdCBkaXNwZXJzaW9uIGZvciBjbG9zZWx5IHNwYWNlZCBoYXNoCisgICAgICAgICAgIHZhbHVlcy4gIFRoZSBpcyBpbXBvcnRhbnQgYmVjYXVzZSBzb21lIHVzZSBjYXNlcyBoYXZlIG1hbnkKKyAgICAgICAgICAgY29tYmluYXRpb25zIG9mIGEgc21hbGwgbnVtYmVyIG9mIGVsZW1lbnRzIHdpdGggbmVhcmJ5CisgICAgICAgICAgIGhhc2hlcyBzbyB0aGF0IG1hbnkgZGlzdGluY3QgY29tYmluYXRpb25zIGNvbGxhcHNlIHRvIG9ubHkKKyAgICAgICAgICAgYSBoYW5kZnVsIG9mIGRpc3RpbmN0IGhhc2ggdmFsdWVzLiAqLworICAgICAgICBoID0gZW50cnktPmhhc2g7CisgICAgICAgIGhhc2ggXj0gKGggXiAoaCA8PCAxNikgXiA4OTg2OTc0N0wpICAqIDM2NDQ3OTgxNjd1OworICAgIH0KKyAgICBoYXNoID0gaGFzaCAqIDY5MDY5TCArIDkwNzEzMzkyM0w7CisgICAgaWYgKGhhc2ggPT0gLTEpCisgICAgICAgIGhhc2ggPSA1OTA5MjM3MTNMOworICAgIHNvLT5oYXNoID0gaGFzaDsKKyAgICByZXR1cm4gaGFzaDsKIH0KIAogLyoqKioqIFNldCBpdGVyYXRvciB0eXBlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCVB5U2V0T2JqZWN0ICpzaV9zZXQ7IC8qIFNldCB0byBOVUxMIHdoZW4gaXRlcmF0b3IgaXMgZXhoYXVzdGVkICovCi0JUHlfc3NpemVfdCBzaV91c2VkOwotCVB5X3NzaXplX3Qgc2lfcG9zOwotCVB5X3NzaXplX3QgbGVuOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBQeVNldE9iamVjdCAqc2lfc2V0OyAvKiBTZXQgdG8gTlVMTCB3aGVuIGl0ZXJhdG9yIGlzIGV4aGF1c3RlZCAqLworICAgIFB5X3NzaXplX3Qgc2lfdXNlZDsKKyAgICBQeV9zc2l6ZV90IHNpX3BvczsKKyAgICBQeV9zc2l6ZV90IGxlbjsKIH0gc2V0aXRlcm9iamVjdDsKIAogc3RhdGljIHZvaWQKIHNldGl0ZXJfZGVhbGxvYyhzZXRpdGVyb2JqZWN0ICpzaSkKIHsKLQlQeV9YREVDUkVGKHNpLT5zaV9zZXQpOwotCVB5T2JqZWN0X0dDX0RlbChzaSk7CisgICAgUHlfWERFQ1JFRihzaS0+c2lfc2V0KTsKKyAgICBQeU9iamVjdF9HQ19EZWwoc2kpOwogfQogCiBzdGF0aWMgaW50CiBzZXRpdGVyX3RyYXZlcnNlKHNldGl0ZXJvYmplY3QgKnNpLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlQeV9WSVNJVChzaS0+c2lfc2V0KTsKLQlyZXR1cm4gMDsKKyAgICBQeV9WSVNJVChzaS0+c2lfc2V0KTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNldGl0ZXJfbGVuKHNldGl0ZXJvYmplY3QgKnNpKQogewotCVB5X3NzaXplX3QgbGVuID0gMDsKLQlpZiAoc2ktPnNpX3NldCAhPSBOVUxMICYmIHNpLT5zaV91c2VkID09IHNpLT5zaV9zZXQtPnVzZWQpCi0JCWxlbiA9IHNpLT5sZW47Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKGxlbik7CisgICAgUHlfc3NpemVfdCBsZW4gPSAwOworICAgIGlmIChzaS0+c2lfc2V0ICE9IE5VTEwgJiYgc2ktPnNpX3VzZWQgPT0gc2ktPnNpX3NldC0+dXNlZCkKKyAgICAgICAgbGVuID0gc2ktPmxlbjsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcobGVuKTsKIH0KIAogUHlEb2NfU1RSVkFSKGxlbmd0aF9oaW50X2RvYywgIlByaXZhdGUgbWV0aG9kIHJldHVybmluZyBhbiBlc3RpbWF0ZSBvZiBsZW4obGlzdChpdCkpLiIpOwogCiBzdGF0aWMgUHlNZXRob2REZWYgc2V0aXRlcl9tZXRob2RzW10gPSB7Ci0JeyJfX2xlbmd0aF9oaW50X18iLCAoUHlDRnVuY3Rpb24pc2V0aXRlcl9sZW4sIE1FVEhfTk9BUkdTLCBsZW5ndGhfaGludF9kb2N9LAotIAl7TlVMTCwJCU5VTEx9CQkvKiBzZW50aW5lbCAqLworICAgIHsiX19sZW5ndGhfaGludF9fIiwgKFB5Q0Z1bmN0aW9uKXNldGl0ZXJfbGVuLCBNRVRIX05PQVJHUywgbGVuZ3RoX2hpbnRfZG9jfSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogc3RhdGljIFB5T2JqZWN0ICpzZXRpdGVyX2l0ZXJuZXh0KHNldGl0ZXJvYmplY3QgKnNpKQogewotCVB5T2JqZWN0ICprZXk7Ci0JcmVnaXN0ZXIgUHlfc3NpemVfdCBpLCBtYXNrOwotCXJlZ2lzdGVyIHNldGVudHJ5ICplbnRyeTsKLQlQeVNldE9iamVjdCAqc28gPSBzaS0+c2lfc2V0OworICAgIFB5T2JqZWN0ICprZXk7CisgICAgcmVnaXN0ZXIgUHlfc3NpemVfdCBpLCBtYXNrOworICAgIHJlZ2lzdGVyIHNldGVudHJ5ICplbnRyeTsKKyAgICBQeVNldE9iamVjdCAqc28gPSBzaS0+c2lfc2V0OwogCi0JaWYgKHNvID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWFzc2VydCAoUHlBbnlTZXRfQ2hlY2soc28pKTsKKyAgICBpZiAoc28gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYXNzZXJ0IChQeUFueVNldF9DaGVjayhzbykpOwogCi0JaWYgKHNpLT5zaV91c2VkICE9IHNvLT51c2VkKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCi0JCQkJIlNldCBjaGFuZ2VkIHNpemUgZHVyaW5nIGl0ZXJhdGlvbiIpOwotCQlzaS0+c2lfdXNlZCA9IC0xOyAvKiBNYWtlIHRoaXMgc3RhdGUgc3RpY2t5ICovCi0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoc2ktPnNpX3VzZWQgIT0gc28tPnVzZWQpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJTZXQgY2hhbmdlZCBzaXplIGR1cmluZyBpdGVyYXRpb24iKTsKKyAgICAgICAgc2ktPnNpX3VzZWQgPSAtMTsgLyogTWFrZSB0aGlzIHN0YXRlIHN0aWNreSAqLworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlpID0gc2ktPnNpX3BvczsKLQlhc3NlcnQoaT49MCk7Ci0JZW50cnkgPSBzby0+dGFibGU7Ci0JbWFzayA9IHNvLT5tYXNrOwotCXdoaWxlIChpIDw9IG1hc2sgJiYgKGVudHJ5W2ldLmtleSA9PSBOVUxMIHx8IGVudHJ5W2ldLmtleSA9PSBkdW1teSkpCi0JCWkrKzsKLQlzaS0+c2lfcG9zID0gaSsxOwotCWlmIChpID4gbWFzaykKLQkJZ290byBmYWlsOwotCXNpLT5sZW4tLTsKLQlrZXkgPSBlbnRyeVtpXS5rZXk7Ci0JUHlfSU5DUkVGKGtleSk7Ci0JcmV0dXJuIGtleTsKKyAgICBpID0gc2ktPnNpX3BvczsKKyAgICBhc3NlcnQoaT49MCk7CisgICAgZW50cnkgPSBzby0+dGFibGU7CisgICAgbWFzayA9IHNvLT5tYXNrOworICAgIHdoaWxlIChpIDw9IG1hc2sgJiYgKGVudHJ5W2ldLmtleSA9PSBOVUxMIHx8IGVudHJ5W2ldLmtleSA9PSBkdW1teSkpCisgICAgICAgIGkrKzsKKyAgICBzaS0+c2lfcG9zID0gaSsxOworICAgIGlmIChpID4gbWFzaykKKyAgICAgICAgZ290byBmYWlsOworICAgIHNpLT5sZW4tLTsKKyAgICBrZXkgPSBlbnRyeVtpXS5rZXk7CisgICAgUHlfSU5DUkVGKGtleSk7CisgICAgcmV0dXJuIGtleTsKIAogZmFpbDoKLQlQeV9ERUNSRUYoc28pOwotCXNpLT5zaV9zZXQgPSBOVUxMOwotCXJldHVybiBOVUxMOworICAgIFB5X0RFQ1JFRihzbyk7CisgICAgc2ktPnNpX3NldCA9IE5VTEw7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgUHlTZXRJdGVyX1R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKLQkic2V0aXRlcmF0b3IiLAkJCQkvKiB0cF9uYW1lICovCi0Jc2l6ZW9mKHNldGl0ZXJvYmplY3QpLAkJCS8qIHRwX2Jhc2ljc2l6ZSAqLwotCTAsCQkJCQkvKiB0cF9pdGVtc2l6ZSAqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcilzZXRpdGVyX2RlYWxsb2MsIAkJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfY29tcGFyZSAqLwotCTAsCQkJCQkvKiB0cF9yZXByICovCi0JMCwJCQkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJCQkJCS8qIHRwX2hhc2ggKi8KLQkwLAkJCQkJLyogdHBfY2FsbCAqLwotCTAsCQkJCQkvKiB0cF9zdHIgKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQywvKiB0cF9mbGFncyAqLwotIAkwLAkJCQkJLyogdHBfZG9jICovCi0gCSh0cmF2ZXJzZXByb2Mpc2V0aXRlcl90cmF2ZXJzZSwJCS8qIHRwX3RyYXZlcnNlICovCi0gCTAsCQkJCQkvKiB0cF9jbGVhciAqLwotCTAsCQkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCVB5T2JqZWN0X1NlbGZJdGVyLAkJCS8qIHRwX2l0ZXIgKi8KLQkoaXRlcm5leHRmdW5jKXNldGl0ZXJfaXRlcm5leHQsCQkvKiB0cF9pdGVybmV4dCAqLwotCXNldGl0ZXJfbWV0aG9kcywJCQkvKiB0cF9tZXRob2RzICovCi0JMCwKKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQorICAgICJzZXRpdGVyYXRvciIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgIHNpemVvZihzZXRpdGVyb2JqZWN0KSwgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcilzZXRpdGVyX2RlYWxsb2MsICAgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDLC8qIHRwX2ZsYWdzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAodHJhdmVyc2Vwcm9jKXNldGl0ZXJfdHJhdmVyc2UsICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgUHlPYmplY3RfU2VsZkl0ZXIsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgKGl0ZXJuZXh0ZnVuYylzZXRpdGVyX2l0ZXJuZXh0LCAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIHNldGl0ZXJfbWV0aG9kcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsCiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKgogc2V0X2l0ZXIoUHlTZXRPYmplY3QgKnNvKQogewotCXNldGl0ZXJvYmplY3QgKnNpID0gUHlPYmplY3RfR0NfTmV3KHNldGl0ZXJvYmplY3QsICZQeVNldEl0ZXJfVHlwZSk7Ci0JaWYgKHNpID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCVB5X0lOQ1JFRihzbyk7Ci0Jc2ktPnNpX3NldCA9IHNvOwotCXNpLT5zaV91c2VkID0gc28tPnVzZWQ7Ci0Jc2ktPnNpX3BvcyA9IDA7Ci0Jc2ktPmxlbiA9IHNvLT51c2VkOwotCV9QeU9iamVjdF9HQ19UUkFDSyhzaSk7Ci0JcmV0dXJuIChQeU9iamVjdCAqKXNpOworICAgIHNldGl0ZXJvYmplY3QgKnNpID0gUHlPYmplY3RfR0NfTmV3KHNldGl0ZXJvYmplY3QsICZQeVNldEl0ZXJfVHlwZSk7CisgICAgaWYgKHNpID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5X0lOQ1JFRihzbyk7CisgICAgc2ktPnNpX3NldCA9IHNvOworICAgIHNpLT5zaV91c2VkID0gc28tPnVzZWQ7CisgICAgc2ktPnNpX3BvcyA9IDA7CisgICAgc2ktPmxlbiA9IHNvLT51c2VkOworICAgIF9QeU9iamVjdF9HQ19UUkFDSyhzaSk7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKXNpOwogfQogCiBzdGF0aWMgaW50CiBzZXRfdXBkYXRlX2ludGVybmFsKFB5U2V0T2JqZWN0ICpzbywgUHlPYmplY3QgKm90aGVyKQogewotCVB5T2JqZWN0ICprZXksICppdDsKKyAgICBQeU9iamVjdCAqa2V5LCAqaXQ7CiAKLQlpZiAoUHlBbnlTZXRfQ2hlY2sob3RoZXIpKQotCQlyZXR1cm4gc2V0X21lcmdlKHNvLCBvdGhlcik7CisgICAgaWYgKFB5QW55U2V0X0NoZWNrKG90aGVyKSkKKyAgICAgICAgcmV0dXJuIHNldF9tZXJnZShzbywgb3RoZXIpOwogCi0JaWYgKFB5RGljdF9DaGVja0V4YWN0KG90aGVyKSkgewotCQlQeU9iamVjdCAqdmFsdWU7Ci0JCVB5X3NzaXplX3QgcG9zID0gMDsKLQkJbG9uZyBoYXNoOwotCQlQeV9zc2l6ZV90IGRpY3RzaXplID0gUHlEaWN0X1NpemUob3RoZXIpOworICAgIGlmIChQeURpY3RfQ2hlY2tFeGFjdChvdGhlcikpIHsKKyAgICAgICAgUHlPYmplY3QgKnZhbHVlOworICAgICAgICBQeV9zc2l6ZV90IHBvcyA9IDA7CisgICAgICAgIGxvbmcgaGFzaDsKKyAgICAgICAgUHlfc3NpemVfdCBkaWN0c2l6ZSA9IFB5RGljdF9TaXplKG90aGVyKTsKIAotCQkvKiBEbyBvbmUgYmlnIHJlc2l6ZSBhdCB0aGUgc3RhcnQsIHJhdGhlciB0aGFuCi0JCSogaW5jcmVtZW50YWxseSByZXNpemluZyBhcyB3ZSBpbnNlcnQgbmV3IGtleXMuICBFeHBlY3QKLQkJKiB0aGF0IHRoZXJlIHdpbGwgYmUgbm8gKG9yIGZldykgb3ZlcmxhcHBpbmcga2V5cy4KLQkJKi8KLQkJaWYgKGRpY3RzaXplID09IC0xKQotCQkJcmV0dXJuIC0xOwotCQlpZiAoKHNvLT5maWxsICsgZGljdHNpemUpKjMgPj0gKHNvLT5tYXNrKzEpKjIpIHsKLQkJCWlmIChzZXRfdGFibGVfcmVzaXplKHNvLCAoc28tPnVzZWQgKyBkaWN0c2l6ZSkqMikgIT0gMCkKLQkJCQlyZXR1cm4gLTE7Ci0JCX0KLQkJd2hpbGUgKF9QeURpY3RfTmV4dChvdGhlciwgJnBvcywgJmtleSwgJnZhbHVlLCAmaGFzaCkpIHsKLQkJCXNldGVudHJ5IGFuX2VudHJ5OworICAgICAgICAvKiBEbyBvbmUgYmlnIHJlc2l6ZSBhdCB0aGUgc3RhcnQsIHJhdGhlciB0aGFuCisgICAgICAgICogaW5jcmVtZW50YWxseSByZXNpemluZyBhcyB3ZSBpbnNlcnQgbmV3IGtleXMuICBFeHBlY3QKKyAgICAgICAgKiB0aGF0IHRoZXJlIHdpbGwgYmUgbm8gKG9yIGZldykgb3ZlcmxhcHBpbmcga2V5cy4KKyAgICAgICAgKi8KKyAgICAgICAgaWYgKGRpY3RzaXplID09IC0xKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBpZiAoKHNvLT5maWxsICsgZGljdHNpemUpKjMgPj0gKHNvLT5tYXNrKzEpKjIpIHsKKyAgICAgICAgICAgIGlmIChzZXRfdGFibGVfcmVzaXplKHNvLCAoc28tPnVzZWQgKyBkaWN0c2l6ZSkqMikgIT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKF9QeURpY3RfTmV4dChvdGhlciwgJnBvcywgJmtleSwgJnZhbHVlLCAmaGFzaCkpIHsKKyAgICAgICAgICAgIHNldGVudHJ5IGFuX2VudHJ5OwogCi0JCQlhbl9lbnRyeS5oYXNoID0gaGFzaDsKLQkJCWFuX2VudHJ5LmtleSA9IGtleTsKLQkJCWlmIChzZXRfYWRkX2VudHJ5KHNvLCAmYW5fZW50cnkpID09IC0xKQotCQkJCXJldHVybiAtMTsKLQkJfQotCQlyZXR1cm4gMDsKLQl9CisgICAgICAgICAgICBhbl9lbnRyeS5oYXNoID0gaGFzaDsKKyAgICAgICAgICAgIGFuX2VudHJ5LmtleSA9IGtleTsKKyAgICAgICAgICAgIGlmIChzZXRfYWRkX2VudHJ5KHNvLCAmYW5fZW50cnkpID09IC0xKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLQlpdCA9IFB5T2JqZWN0X0dldEl0ZXIob3RoZXIpOwotCWlmIChpdCA9PSBOVUxMKQotCQlyZXR1cm4gLTE7CisgICAgaXQgPSBQeU9iamVjdF9HZXRJdGVyKG90aGVyKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0Jd2hpbGUgKChrZXkgPSBQeUl0ZXJfTmV4dChpdCkpICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBpZiAoc2V0X2FkZF9rZXkoc28sIGtleSkgPT0gLTEpIHsKLQkJCVB5X0RFQ1JFRihpdCk7Ci0JCQlQeV9ERUNSRUYoa2V5KTsKLQkJCXJldHVybiAtMTsKLSAgICAgICAgICAgICAgICB9IAotCQlQeV9ERUNSRUYoa2V5KTsKLQl9Ci0JUHlfREVDUkVGKGl0KTsKLQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIC0xOwotCXJldHVybiAwOworICAgIHdoaWxlICgoa2V5ID0gUHlJdGVyX05leHQoaXQpKSAhPSBOVUxMKSB7CisgICAgICAgIGlmIChzZXRfYWRkX2tleShzbywga2V5KSA9PSAtMSkgeworICAgICAgICAgICAgUHlfREVDUkVGKGl0KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihrZXkpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIFB5X0RFQ1JFRihrZXkpOworICAgIH0KKyAgICBQeV9ERUNSRUYoaXQpOworICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZXRfdXBkYXRlKFB5U2V0T2JqZWN0ICpzbywgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlfc3NpemVfdCBpOworICAgIFB5X3NzaXplX3QgaTsKIAotCWZvciAoaT0wIDsgaTxQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpIDsgaSsrKSB7Ci0JCVB5T2JqZWN0ICpvdGhlciA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgaSk7Ci0JCWlmIChzZXRfdXBkYXRlX2ludGVybmFsKHNvLCBvdGhlcikgPT0gLTEpCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0JUHlfUkVUVVJOX05PTkU7CisgICAgZm9yIChpPTAgOyBpPFB5VHVwbGVfR0VUX1NJWkUoYXJncykgOyBpKyspIHsKKyAgICAgICAgUHlPYmplY3QgKm90aGVyID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCBpKTsKKyAgICAgICAgaWYgKHNldF91cGRhdGVfaW50ZXJuYWwoc28sIG90aGVyKSA9PSAtMSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAotUHlEb2NfU1RSVkFSKHVwZGF0ZV9kb2MsIAorUHlEb2NfU1RSVkFSKHVwZGF0ZV9kb2MsCiAiVXBkYXRlIGEgc2V0IHdpdGggdGhlIHVuaW9uIG9mIGl0c2VsZiBhbmQgb3RoZXJzLiIpOwogCiBzdGF0aWMgUHlPYmplY3QgKgogbWFrZV9uZXdfc2V0KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKml0ZXJhYmxlKQogewotCXJlZ2lzdGVyIFB5U2V0T2JqZWN0ICpzbyA9IE5VTEw7CisgICAgcmVnaXN0ZXIgUHlTZXRPYmplY3QgKnNvID0gTlVMTDsKIAotCWlmIChkdW1teSA9PSBOVUxMKSB7IC8qIEF1dG8taW5pdGlhbGl6ZSBkdW1teSAqLwotCQlkdW1teSA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIjxkdW1teSBrZXk+Iik7Ci0JCWlmIChkdW1teSA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChkdW1teSA9PSBOVUxMKSB7IC8qIEF1dG8taW5pdGlhbGl6ZSBkdW1teSAqLworICAgICAgICBkdW1teSA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIjxkdW1teSBrZXk+Iik7CisgICAgICAgIGlmIChkdW1teSA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JLyogY3JlYXRlIFB5U2V0T2JqZWN0IHN0cnVjdHVyZSAqLwotCWlmIChudW1mcmVlICYmCi0JICAgICh0eXBlID09ICZQeVNldF9UeXBlICB8fCAgdHlwZSA9PSAmUHlGcm96ZW5TZXRfVHlwZSkpIHsKLQkJc28gPSBmcmVlX2xpc3RbLS1udW1mcmVlXTsKLQkJYXNzZXJ0IChzbyAhPSBOVUxMICYmIFB5QW55U2V0X0NoZWNrRXhhY3Qoc28pKTsKLQkJUHlfVFlQRShzbykgPSB0eXBlOwotCQlfUHlfTmV3UmVmZXJlbmNlKChQeU9iamVjdCAqKXNvKTsKLQkJRU1QVFlfVE9fTUlOU0laRShzbyk7Ci0JCVB5T2JqZWN0X0dDX1RyYWNrKHNvKTsKLQl9IGVsc2UgewotCQlzbyA9IChQeVNldE9iamVjdCAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOwotCQlpZiAoc28gPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQkvKiB0cF9hbGxvYyBoYXMgYWxyZWFkeSB6ZXJvZWQgdGhlIHN0cnVjdHVyZSAqLwotCQlhc3NlcnQoc28tPnRhYmxlID09IE5VTEwgJiYgc28tPmZpbGwgPT0gMCAmJiBzby0+dXNlZCA9PSAwKTsKLQkJSU5JVF9OT05aRVJPX1NFVF9TTE9UUyhzbyk7Ci0JfQorICAgIC8qIGNyZWF0ZSBQeVNldE9iamVjdCBzdHJ1Y3R1cmUgKi8KKyAgICBpZiAobnVtZnJlZSAmJgorICAgICAgICAodHlwZSA9PSAmUHlTZXRfVHlwZSAgfHwgIHR5cGUgPT0gJlB5RnJvemVuU2V0X1R5cGUpKSB7CisgICAgICAgIHNvID0gZnJlZV9saXN0Wy0tbnVtZnJlZV07CisgICAgICAgIGFzc2VydCAoc28gIT0gTlVMTCAmJiBQeUFueVNldF9DaGVja0V4YWN0KHNvKSk7CisgICAgICAgIFB5X1RZUEUoc28pID0gdHlwZTsKKyAgICAgICAgX1B5X05ld1JlZmVyZW5jZSgoUHlPYmplY3QgKilzbyk7CisgICAgICAgIEVNUFRZX1RPX01JTlNJWkUoc28pOworICAgICAgICBQeU9iamVjdF9HQ19UcmFjayhzbyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc28gPSAoUHlTZXRPYmplY3QgKil0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKKyAgICAgICAgaWYgKHNvID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgLyogdHBfYWxsb2MgaGFzIGFscmVhZHkgemVyb2VkIHRoZSBzdHJ1Y3R1cmUgKi8KKyAgICAgICAgYXNzZXJ0KHNvLT50YWJsZSA9PSBOVUxMICYmIHNvLT5maWxsID09IDAgJiYgc28tPnVzZWQgPT0gMCk7CisgICAgICAgIElOSVRfTk9OWkVST19TRVRfU0xPVFMoc28pOworICAgIH0KIAotCXNvLT5sb29rdXAgPSBzZXRfbG9va2tleV9zdHJpbmc7Ci0Jc28tPndlYWtyZWZsaXN0ID0gTlVMTDsKKyAgICBzby0+bG9va3VwID0gc2V0X2xvb2trZXlfc3RyaW5nOworICAgIHNvLT53ZWFrcmVmbGlzdCA9IE5VTEw7CiAKLQlpZiAoaXRlcmFibGUgIT0gTlVMTCkgewotCQlpZiAoc2V0X3VwZGF0ZV9pbnRlcm5hbChzbywgaXRlcmFibGUpID09IC0xKSB7Ci0JCQlQeV9ERUNSRUYoc28pOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9CisgICAgaWYgKGl0ZXJhYmxlICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKHNldF91cGRhdGVfaW50ZXJuYWwoc28sIGl0ZXJhYmxlKSA9PSAtMSkgeworICAgICAgICAgICAgUHlfREVDUkVGKHNvKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQogCi0JcmV0dXJuIChQeU9iamVjdCAqKXNvOworICAgIHJldHVybiAoUHlPYmplY3QgKilzbzsKIH0KIAogLyogVGhlIGVtcHR5IGZyb3plbnNldCBpcyBhIHNpbmdsZXRvbiAqLwpAQCAtMTAzOSw1NiArMTAzOSw1NiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGZyb3plbnNldF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JUHlPYmplY3QgKml0ZXJhYmxlID0gTlVMTCwgKnJlc3VsdDsKKyAgICBQeU9iamVjdCAqaXRlcmFibGUgPSBOVUxMLCAqcmVzdWx0OwogCi0JaWYgKHR5cGUgPT0gJlB5RnJvemVuU2V0X1R5cGUgJiYgIV9QeUFyZ19Ob0tleXdvcmRzKCJmcm96ZW5zZXQoKSIsIGt3ZHMpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAodHlwZSA9PSAmUHlGcm96ZW5TZXRfVHlwZSAmJiAhX1B5QXJnX05vS2V5d29yZHMoImZyb3plbnNldCgpIiwga3dkcykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCB0eXBlLT50cF9uYW1lLCAwLCAxLCAmaXRlcmFibGUpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsIHR5cGUtPnRwX25hbWUsIDAsIDEsICZpdGVyYWJsZSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKHR5cGUgIT0gJlB5RnJvemVuU2V0X1R5cGUpCi0JCXJldHVybiBtYWtlX25ld19zZXQodHlwZSwgaXRlcmFibGUpOworICAgIGlmICh0eXBlICE9ICZQeUZyb3plblNldF9UeXBlKQorICAgICAgICByZXR1cm4gbWFrZV9uZXdfc2V0KHR5cGUsIGl0ZXJhYmxlKTsKIAotCWlmIChpdGVyYWJsZSAhPSBOVUxMKSB7Ci0JCS8qIGZyb3plbnNldChmKSBpcyBpZGVtcG90ZW50ICovCi0JCWlmIChQeUZyb3plblNldF9DaGVja0V4YWN0KGl0ZXJhYmxlKSkgewotCQkJUHlfSU5DUkVGKGl0ZXJhYmxlKTsKLQkJCXJldHVybiBpdGVyYWJsZTsKLQkJfQotCQlyZXN1bHQgPSBtYWtlX25ld19zZXQodHlwZSwgaXRlcmFibGUpOwotCQlpZiAocmVzdWx0ID09IE5VTEwgfHwgUHlTZXRfR0VUX1NJWkUocmVzdWx0KSkKLQkJCXJldHVybiByZXN1bHQ7Ci0JCVB5X0RFQ1JFRihyZXN1bHQpOwotCX0KLQkvKiBUaGUgZW1wdHkgZnJvemVuc2V0IGlzIGEgc2luZ2xldG9uICovCi0JaWYgKGVtcHR5ZnJvemVuc2V0ID09IE5VTEwpCi0JCWVtcHR5ZnJvemVuc2V0ID0gbWFrZV9uZXdfc2V0KHR5cGUsIE5VTEwpOwotCVB5X1hJTkNSRUYoZW1wdHlmcm96ZW5zZXQpOwotCXJldHVybiBlbXB0eWZyb3plbnNldDsKKyAgICBpZiAoaXRlcmFibGUgIT0gTlVMTCkgeworICAgICAgICAvKiBmcm96ZW5zZXQoZikgaXMgaWRlbXBvdGVudCAqLworICAgICAgICBpZiAoUHlGcm96ZW5TZXRfQ2hlY2tFeGFjdChpdGVyYWJsZSkpIHsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihpdGVyYWJsZSk7CisgICAgICAgICAgICByZXR1cm4gaXRlcmFibGU7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0ID0gbWFrZV9uZXdfc2V0KHR5cGUsIGl0ZXJhYmxlKTsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBOVUxMIHx8IFB5U2V0X0dFVF9TSVpFKHJlc3VsdCkpCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICB9CisgICAgLyogVGhlIGVtcHR5IGZyb3plbnNldCBpcyBhIHNpbmdsZXRvbiAqLworICAgIGlmIChlbXB0eWZyb3plbnNldCA9PSBOVUxMKQorICAgICAgICBlbXB0eWZyb3plbnNldCA9IG1ha2VfbmV3X3NldCh0eXBlLCBOVUxMKTsKKyAgICBQeV9YSU5DUkVGKGVtcHR5ZnJvemVuc2V0KTsKKyAgICByZXR1cm4gZW1wdHlmcm96ZW5zZXQ7CiB9CiAKIHZvaWQKIFB5U2V0X0Zpbmkodm9pZCkKIHsKLQlQeVNldE9iamVjdCAqc287CisgICAgUHlTZXRPYmplY3QgKnNvOwogCi0Jd2hpbGUgKG51bWZyZWUpIHsKLQkJbnVtZnJlZS0tOwotCQlzbyA9IGZyZWVfbGlzdFtudW1mcmVlXTsKLQkJUHlPYmplY3RfR0NfRGVsKHNvKTsKLQl9Ci0JUHlfQ0xFQVIoZHVtbXkpOwotCVB5X0NMRUFSKGVtcHR5ZnJvemVuc2V0KTsKKyAgICB3aGlsZSAobnVtZnJlZSkgeworICAgICAgICBudW1mcmVlLS07CisgICAgICAgIHNvID0gZnJlZV9saXN0W251bWZyZWVdOworICAgICAgICBQeU9iamVjdF9HQ19EZWwoc28pOworICAgIH0KKyAgICBQeV9DTEVBUihkdW1teSk7CisgICAgUHlfQ0xFQVIoZW1wdHlmcm96ZW5zZXQpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc2V0X25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlpZiAodHlwZSA9PSAmUHlTZXRfVHlwZSAmJiAhX1B5QXJnX05vS2V5d29yZHMoInNldCgpIiwga3dkcykpCi0JCXJldHVybiBOVUxMOwotCQotCXJldHVybiBtYWtlX25ld19zZXQodHlwZSwgTlVMTCk7CisgICAgaWYgKHR5cGUgPT0gJlB5U2V0X1R5cGUgJiYgIV9QeUFyZ19Ob0tleXdvcmRzKCJzZXQoKSIsIGt3ZHMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIHJldHVybiBtYWtlX25ld19zZXQodHlwZSwgTlVMTCk7CiB9CiAKIC8qIHNldF9zd2FwX2JvZGllcygpIHN3aXRjaGVzIHRoZSBjb250ZW50cyBvZiBhbnkgdHdvIHNldHMgYnkgbW92aW5nIHRoZWlyCkBAIC0xMDk4LDY0ICsxMDk4LDY0IEBACiAgICAgIHQ9c2V0KGEpOyBhLmNsZWFyKCk7IGEudXBkYXRlKGIpOyBiLmNsZWFyKCk7IGIudXBkYXRlKHQpOyBkZWwgdAogCiAgICBUaGUgZnVuY3Rpb24gYWx3YXlzIHN1Y2NlZWRzIGFuZCBpdCBsZWF2ZXMgYm90aCBvYmplY3RzIGluIGEgc3RhYmxlIHN0YXRlLgotICAgVXNlZnVsIGZvciBjcmVhdGluZyB0ZW1wb3JhcnkgZnJvemVuc2V0cyBmcm9tIHNldHMgZm9yIG1lbWJlcnNoaXAgdGVzdGluZyAKKyAgIFVzZWZ1bCBmb3IgY3JlYXRpbmcgdGVtcG9yYXJ5IGZyb3plbnNldHMgZnJvbSBzZXRzIGZvciBtZW1iZXJzaGlwIHRlc3RpbmcKICAgIGluIF9fY29udGFpbnNfXygpLCBkaXNjYXJkKCksIGFuZCByZW1vdmUoKS4gIEFsc28gdXNlZnVsIGZvciBvcGVyYXRpb25zCi0gICB0aGF0IHVwZGF0ZSBpbi1wbGFjZSAoYnkgYWxsb3dpbmcgYW4gaW50ZXJtZWRpYXRlIHJlc3VsdCB0byBiZSBzd2FwcGVkIAorICAgdGhhdCB1cGRhdGUgaW4tcGxhY2UgKGJ5IGFsbG93aW5nIGFuIGludGVybWVkaWF0ZSByZXN1bHQgdG8gYmUgc3dhcHBlZAogICAgaW50byBvbmUgb2YgdGhlIG9yaWdpbmFsIGlucHV0cykuCiAqLwogCiBzdGF0aWMgdm9pZAogc2V0X3N3YXBfYm9kaWVzKFB5U2V0T2JqZWN0ICphLCBQeVNldE9iamVjdCAqYikKIHsKLQlQeV9zc2l6ZV90IHQ7Ci0Jc2V0ZW50cnkgKnU7Ci0Jc2V0ZW50cnkgKigqZikoUHlTZXRPYmplY3QgKnNvLCBQeU9iamVjdCAqa2V5LCBsb25nIGhhc2gpOwotCXNldGVudHJ5IHRhYltQeVNldF9NSU5TSVpFXTsKLQlsb25nIGg7CisgICAgUHlfc3NpemVfdCB0OworICAgIHNldGVudHJ5ICp1OworICAgIHNldGVudHJ5ICooKmYpKFB5U2V0T2JqZWN0ICpzbywgUHlPYmplY3QgKmtleSwgbG9uZyBoYXNoKTsKKyAgICBzZXRlbnRyeSB0YWJbUHlTZXRfTUlOU0laRV07CisgICAgbG9uZyBoOwogCi0JdCA9IGEtPmZpbGw7ICAgICBhLT5maWxsICAgPSBiLT5maWxsOyAgICAgICAgYi0+ZmlsbCAgPSB0OwotCXQgPSBhLT51c2VkOyAgICAgYS0+dXNlZCAgID0gYi0+dXNlZDsgICAgICAgIGItPnVzZWQgID0gdDsKLQl0ID0gYS0+bWFzazsgICAgIGEtPm1hc2sgICA9IGItPm1hc2s7ICAgICAgICBiLT5tYXNrICA9IHQ7CisgICAgdCA9IGEtPmZpbGw7ICAgICBhLT5maWxsICAgPSBiLT5maWxsOyAgICAgICAgYi0+ZmlsbCAgPSB0OworICAgIHQgPSBhLT51c2VkOyAgICAgYS0+dXNlZCAgID0gYi0+dXNlZDsgICAgICAgIGItPnVzZWQgID0gdDsKKyAgICB0ID0gYS0+bWFzazsgICAgIGEtPm1hc2sgICA9IGItPm1hc2s7ICAgICAgICBiLT5tYXNrICA9IHQ7CiAKLQl1ID0gYS0+dGFibGU7Ci0JaWYgKGEtPnRhYmxlID09IGEtPnNtYWxsdGFibGUpCi0JCXUgPSBiLT5zbWFsbHRhYmxlOwotCWEtPnRhYmxlICA9IGItPnRhYmxlOwotCWlmIChiLT50YWJsZSA9PSBiLT5zbWFsbHRhYmxlKQotCQlhLT50YWJsZSA9IGEtPnNtYWxsdGFibGU7Ci0JYi0+dGFibGUgPSB1OworICAgIHUgPSBhLT50YWJsZTsKKyAgICBpZiAoYS0+dGFibGUgPT0gYS0+c21hbGx0YWJsZSkKKyAgICAgICAgdSA9IGItPnNtYWxsdGFibGU7CisgICAgYS0+dGFibGUgID0gYi0+dGFibGU7CisgICAgaWYgKGItPnRhYmxlID09IGItPnNtYWxsdGFibGUpCisgICAgICAgIGEtPnRhYmxlID0gYS0+c21hbGx0YWJsZTsKKyAgICBiLT50YWJsZSA9IHU7CiAKLQlmID0gYS0+bG9va3VwOyAgIGEtPmxvb2t1cCA9IGItPmxvb2t1cDsgICAgICBiLT5sb29rdXAgPSBmOworICAgIGYgPSBhLT5sb29rdXA7ICAgYS0+bG9va3VwID0gYi0+bG9va3VwOyAgICAgIGItPmxvb2t1cCA9IGY7CiAKLQlpZiAoYS0+dGFibGUgPT0gYS0+c21hbGx0YWJsZSB8fCBiLT50YWJsZSA9PSBiLT5zbWFsbHRhYmxlKSB7Ci0JCW1lbWNweSh0YWIsIGEtPnNtYWxsdGFibGUsIHNpemVvZih0YWIpKTsKLQkJbWVtY3B5KGEtPnNtYWxsdGFibGUsIGItPnNtYWxsdGFibGUsIHNpemVvZih0YWIpKTsKLQkJbWVtY3B5KGItPnNtYWxsdGFibGUsIHRhYiwgc2l6ZW9mKHRhYikpOwotCX0KKyAgICBpZiAoYS0+dGFibGUgPT0gYS0+c21hbGx0YWJsZSB8fCBiLT50YWJsZSA9PSBiLT5zbWFsbHRhYmxlKSB7CisgICAgICAgIG1lbWNweSh0YWIsIGEtPnNtYWxsdGFibGUsIHNpemVvZih0YWIpKTsKKyAgICAgICAgbWVtY3B5KGEtPnNtYWxsdGFibGUsIGItPnNtYWxsdGFibGUsIHNpemVvZih0YWIpKTsKKyAgICAgICAgbWVtY3B5KGItPnNtYWxsdGFibGUsIHRhYiwgc2l6ZW9mKHRhYikpOworICAgIH0KIAotCWlmIChQeVR5cGVfSXNTdWJ0eXBlKFB5X1RZUEUoYSksICZQeUZyb3plblNldF9UeXBlKSAgJiYKLQkgICAgUHlUeXBlX0lzU3VidHlwZShQeV9UWVBFKGIpLCAmUHlGcm96ZW5TZXRfVHlwZSkpIHsKLQkJaCA9IGEtPmhhc2g7ICAgICBhLT5oYXNoID0gYi0+aGFzaDsgIGItPmhhc2ggPSBoOwotCX0gZWxzZSB7Ci0JCWEtPmhhc2ggPSAtMTsKLQkJYi0+aGFzaCA9IC0xOwotCX0KKyAgICBpZiAoUHlUeXBlX0lzU3VidHlwZShQeV9UWVBFKGEpLCAmUHlGcm96ZW5TZXRfVHlwZSkgICYmCisgICAgICAgIFB5VHlwZV9Jc1N1YnR5cGUoUHlfVFlQRShiKSwgJlB5RnJvemVuU2V0X1R5cGUpKSB7CisgICAgICAgIGggPSBhLT5oYXNoOyAgICAgYS0+aGFzaCA9IGItPmhhc2g7ICBiLT5oYXNoID0gaDsKKyAgICB9IGVsc2UgeworICAgICAgICBhLT5oYXNoID0gLTE7CisgICAgICAgIGItPmhhc2ggPSAtMTsKKyAgICB9CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZXRfY29weShQeVNldE9iamVjdCAqc28pCiB7Ci0JcmV0dXJuIG1ha2VfbmV3X3NldChQeV9UWVBFKHNvKSwgKFB5T2JqZWN0ICopc28pOworICAgIHJldHVybiBtYWtlX25ld19zZXQoUHlfVFlQRShzbyksIChQeU9iamVjdCAqKXNvKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZyb3plbnNldF9jb3B5KFB5U2V0T2JqZWN0ICpzbykKIHsKLQlpZiAoUHlGcm96ZW5TZXRfQ2hlY2tFeGFjdChzbykpIHsKLQkJUHlfSU5DUkVGKHNvKTsKLQkJcmV0dXJuIChQeU9iamVjdCAqKXNvOwotCX0KLQlyZXR1cm4gc2V0X2NvcHkoc28pOworICAgIGlmIChQeUZyb3plblNldF9DaGVja0V4YWN0KHNvKSkgeworICAgICAgICBQeV9JTkNSRUYoc28pOworICAgICAgICByZXR1cm4gKFB5T2JqZWN0ICopc287CisgICAgfQorICAgIHJldHVybiBzZXRfY29weShzbyk7CiB9CiAKIFB5RG9jX1NUUlZBUihjb3B5X2RvYywgIlJldHVybiBhIHNoYWxsb3cgY29weSBvZiBhIHNldC4iKTsKQEAgLTExNjMsOCArMTE2Myw4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc2V0X2NsZWFyKFB5U2V0T2JqZWN0ICpzbykKIHsKLQlzZXRfY2xlYXJfaW50ZXJuYWwoc28pOwotCVB5X1JFVFVSTl9OT05FOworICAgIHNldF9jbGVhcl9pbnRlcm5hbChzbyk7CisgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKIFB5RG9jX1NUUlZBUihjbGVhcl9kb2MsICJSZW1vdmUgYWxsIGVsZW1lbnRzIGZyb20gdGhpcyBzZXQuIik7CkBAIC0xMTcyLDI0ICsxMTcyLDI0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc2V0X3VuaW9uKFB5U2V0T2JqZWN0ICpzbywgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlTZXRPYmplY3QgKnJlc3VsdDsKLQlQeU9iamVjdCAqb3RoZXI7Ci0JUHlfc3NpemVfdCBpOworICAgIFB5U2V0T2JqZWN0ICpyZXN1bHQ7CisgICAgUHlPYmplY3QgKm90aGVyOworICAgIFB5X3NzaXplX3QgaTsKIAotCXJlc3VsdCA9IChQeVNldE9iamVjdCAqKXNldF9jb3B5KHNvKTsKLQlpZiAocmVzdWx0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIHJlc3VsdCA9IChQeVNldE9iamVjdCAqKXNldF9jb3B5KHNvKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JZm9yIChpPTAgOyBpPFB5VHVwbGVfR0VUX1NJWkUoYXJncykgOyBpKyspIHsKLQkJb3RoZXIgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIGkpOwotCQlpZiAoKFB5T2JqZWN0ICopc28gPT0gb3RoZXIpCi0JCQljb250aW51ZTsKLQkJaWYgKHNldF91cGRhdGVfaW50ZXJuYWwocmVzdWx0LCBvdGhlcikgPT0gLTEpIHsKLQkJCVB5X0RFQ1JFRihyZXN1bHQpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9Ci0JcmV0dXJuIChQeU9iamVjdCAqKXJlc3VsdDsKKyAgICBmb3IgKGk9MCA7IGk8UHlUdXBsZV9HRVRfU0laRShhcmdzKSA7IGkrKykgeworICAgICAgICBvdGhlciA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgaSk7CisgICAgICAgIGlmICgoUHlPYmplY3QgKilzbyA9PSBvdGhlcikKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoc2V0X3VwZGF0ZV9pbnRlcm5hbChyZXN1bHQsIG90aGVyKSA9PSAtMSkgeworICAgICAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gKFB5T2JqZWN0ICopcmVzdWx0OwogfQogCiBQeURvY19TVFJWQVIodW5pb25fZG9jLApAQCAtMTIwMCwxNDIgKzEyMDAsMTQyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogc2V0X29yKFB5U2V0T2JqZWN0ICpzbywgUHlPYmplY3QgKm90aGVyKQogewotCVB5U2V0T2JqZWN0ICpyZXN1bHQ7CisgICAgUHlTZXRPYmplY3QgKnJlc3VsdDsKIAotCWlmICghUHlBbnlTZXRfQ2hlY2soc28pIHx8ICFQeUFueVNldF9DaGVjayhvdGhlcikpIHsKLQkJUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKLQkJcmV0dXJuIFB5X05vdEltcGxlbWVudGVkOwotCX0KKyAgICBpZiAoIVB5QW55U2V0X0NoZWNrKHNvKSB8fCAhUHlBbnlTZXRfQ2hlY2sob3RoZXIpKSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7CisgICAgICAgIHJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKKyAgICB9CiAKLQlyZXN1bHQgPSAoUHlTZXRPYmplY3QgKilzZXRfY29weShzbyk7Ci0JaWYgKHJlc3VsdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoKFB5T2JqZWN0ICopc28gPT0gb3RoZXIpCi0JCXJldHVybiAoUHlPYmplY3QgKilyZXN1bHQ7Ci0JaWYgKHNldF91cGRhdGVfaW50ZXJuYWwocmVzdWx0LCBvdGhlcikgPT0gLTEpIHsKLQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gKFB5T2JqZWN0ICopcmVzdWx0OworICAgIHJlc3VsdCA9IChQeVNldE9iamVjdCAqKXNldF9jb3B5KHNvKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICgoUHlPYmplY3QgKilzbyA9PSBvdGhlcikKKyAgICAgICAgcmV0dXJuIChQeU9iamVjdCAqKXJlc3VsdDsKKyAgICBpZiAoc2V0X3VwZGF0ZV9pbnRlcm5hbChyZXN1bHQsIG90aGVyKSA9PSAtMSkgeworICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiAoUHlPYmplY3QgKilyZXN1bHQ7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZXRfaW9yKFB5U2V0T2JqZWN0ICpzbywgUHlPYmplY3QgKm90aGVyKQogewotCWlmICghUHlBbnlTZXRfQ2hlY2sob3RoZXIpKSB7Ci0JCVB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7Ci0JCXJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKLQl9Ci0JaWYgKHNldF91cGRhdGVfaW50ZXJuYWwoc28sIG90aGVyKSA9PSAtMSkKLQkJcmV0dXJuIE5VTEw7Ci0JUHlfSU5DUkVGKHNvKTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopc287CisgICAgaWYgKCFQeUFueVNldF9DaGVjayhvdGhlcikpIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKKyAgICAgICAgcmV0dXJuIFB5X05vdEltcGxlbWVudGVkOworICAgIH0KKyAgICBpZiAoc2V0X3VwZGF0ZV9pbnRlcm5hbChzbywgb3RoZXIpID09IC0xKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQeV9JTkNSRUYoc28pOworICAgIHJldHVybiAoUHlPYmplY3QgKilzbzsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNldF9pbnRlcnNlY3Rpb24oUHlTZXRPYmplY3QgKnNvLCBQeU9iamVjdCAqb3RoZXIpCiB7Ci0JUHlTZXRPYmplY3QgKnJlc3VsdDsKLQlQeU9iamVjdCAqa2V5LCAqaXQsICp0bXA7CisgICAgUHlTZXRPYmplY3QgKnJlc3VsdDsKKyAgICBQeU9iamVjdCAqa2V5LCAqaXQsICp0bXA7CiAKLQlpZiAoKFB5T2JqZWN0ICopc28gPT0gb3RoZXIpCi0JCXJldHVybiBzZXRfY29weShzbyk7CisgICAgaWYgKChQeU9iamVjdCAqKXNvID09IG90aGVyKQorICAgICAgICByZXR1cm4gc2V0X2NvcHkoc28pOwogCi0JcmVzdWx0ID0gKFB5U2V0T2JqZWN0ICopbWFrZV9uZXdfc2V0KFB5X1RZUEUoc28pLCBOVUxMKTsKLQlpZiAocmVzdWx0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIHJlc3VsdCA9IChQeVNldE9iamVjdCAqKW1ha2VfbmV3X3NldChQeV9UWVBFKHNvKSwgTlVMTCk7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChQeUFueVNldF9DaGVjayhvdGhlcikpIHsJCQotCQlQeV9zc2l6ZV90IHBvcyA9IDA7Ci0JCXNldGVudHJ5ICplbnRyeTsKKyAgICBpZiAoUHlBbnlTZXRfQ2hlY2sob3RoZXIpKSB7CisgICAgICAgIFB5X3NzaXplX3QgcG9zID0gMDsKKyAgICAgICAgc2V0ZW50cnkgKmVudHJ5OwogCi0JCWlmIChQeVNldF9HRVRfU0laRShvdGhlcikgPiBQeVNldF9HRVRfU0laRShzbykpIHsKLQkJCXRtcCA9IChQeU9iamVjdCAqKXNvOwotCQkJc28gPSAoUHlTZXRPYmplY3QgKilvdGhlcjsKLQkJCW90aGVyID0gdG1wOwotCQl9CisgICAgICAgIGlmIChQeVNldF9HRVRfU0laRShvdGhlcikgPiBQeVNldF9HRVRfU0laRShzbykpIHsKKyAgICAgICAgICAgIHRtcCA9IChQeU9iamVjdCAqKXNvOworICAgICAgICAgICAgc28gPSAoUHlTZXRPYmplY3QgKilvdGhlcjsKKyAgICAgICAgICAgIG90aGVyID0gdG1wOworICAgICAgICB9CiAKLQkJd2hpbGUgKHNldF9uZXh0KChQeVNldE9iamVjdCAqKW90aGVyLCAmcG9zLCAmZW50cnkpKSB7Ci0JCQlpbnQgcnYgPSBzZXRfY29udGFpbnNfZW50cnkoc28sIGVudHJ5KTsKLQkJCWlmIChydiA9PSAtMSkgewotCQkJCVB5X0RFQ1JFRihyZXN1bHQpOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQkJaWYgKHJ2KSB7Ci0JCQkJaWYgKHNldF9hZGRfZW50cnkocmVzdWx0LCBlbnRyeSkgPT0gLTEpIHsKLQkJCQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCQkJCXJldHVybiBOVUxMOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gKFB5T2JqZWN0ICopcmVzdWx0OwotCX0KKyAgICAgICAgd2hpbGUgKHNldF9uZXh0KChQeVNldE9iamVjdCAqKW90aGVyLCAmcG9zLCAmZW50cnkpKSB7CisgICAgICAgICAgICBpbnQgcnYgPSBzZXRfY29udGFpbnNfZW50cnkoc28sIGVudHJ5KTsKKyAgICAgICAgICAgIGlmIChydiA9PSAtMSkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHJ2KSB7CisgICAgICAgICAgICAgICAgaWYgKHNldF9hZGRfZW50cnkocmVzdWx0LCBlbnRyeSkgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKFB5T2JqZWN0ICopcmVzdWx0OworICAgIH0KIAotCWl0ID0gUHlPYmplY3RfR2V0SXRlcihvdGhlcik7Ci0JaWYgKGl0ID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpdCA9IFB5T2JqZWN0X0dldEl0ZXIob3RoZXIpOworICAgIGlmIChpdCA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQl3aGlsZSAoKGtleSA9IFB5SXRlcl9OZXh0KGl0KSkgIT0gTlVMTCkgewotCQlpbnQgcnY7Ci0JCXNldGVudHJ5IGVudHJ5OwotCQlsb25nIGhhc2ggPSBQeU9iamVjdF9IYXNoKGtleSk7CisgICAgd2hpbGUgKChrZXkgPSBQeUl0ZXJfTmV4dChpdCkpICE9IE5VTEwpIHsKKyAgICAgICAgaW50IHJ2OworICAgICAgICBzZXRlbnRyeSBlbnRyeTsKKyAgICAgICAgbG9uZyBoYXNoID0gUHlPYmplY3RfSGFzaChrZXkpOwogCi0JCWlmIChoYXNoID09IC0xKSB7Ci0JCQlQeV9ERUNSRUYoaXQpOwotCQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCQlQeV9ERUNSRUYoa2V5KTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWVudHJ5Lmhhc2ggPSBoYXNoOwotCQllbnRyeS5rZXkgPSBrZXk7Ci0JCXJ2ID0gc2V0X2NvbnRhaW5zX2VudHJ5KHNvLCAmZW50cnkpOwotCQlpZiAocnYgPT0gLTEpIHsKLQkJCVB5X0RFQ1JFRihpdCk7Ci0JCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJCVB5X0RFQ1JFRihrZXkpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJaWYgKHJ2KSB7Ci0JCQlpZiAoc2V0X2FkZF9lbnRyeShyZXN1bHQsICZlbnRyeSkgPT0gLTEpIHsKLQkJCQlQeV9ERUNSRUYoaXQpOwotCQkJCVB5X0RFQ1JFRihyZXN1bHQpOwotCQkJCVB5X0RFQ1JFRihrZXkpOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQl9Ci0JCVB5X0RFQ1JFRihrZXkpOwotCX0KLQlQeV9ERUNSRUYoaXQpOwotCWlmIChQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCVB5X0RFQ1JFRihyZXN1bHQpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIChQeU9iamVjdCAqKXJlc3VsdDsKKyAgICAgICAgaWYgKGhhc2ggPT0gLTEpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihpdCk7CisgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihrZXkpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgZW50cnkuaGFzaCA9IGhhc2g7CisgICAgICAgIGVudHJ5LmtleSA9IGtleTsKKyAgICAgICAgcnYgPSBzZXRfY29udGFpbnNfZW50cnkoc28sICZlbnRyeSk7CisgICAgICAgIGlmIChydiA9PSAtMSkgeworICAgICAgICAgICAgUHlfREVDUkVGKGl0KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICAgICAgUHlfREVDUkVGKGtleSk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAocnYpIHsKKyAgICAgICAgICAgIGlmIChzZXRfYWRkX2VudHJ5KHJlc3VsdCwgJmVudHJ5KSA9PSAtMSkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihpdCk7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGtleSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgUHlfREVDUkVGKGtleSk7CisgICAgfQorICAgIFB5X0RFQ1JFRihpdCk7CisgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gKFB5T2JqZWN0ICopcmVzdWx0OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc2V0X2ludGVyc2VjdGlvbl9tdWx0aShQeVNldE9iamVjdCAqc28sIFB5T2JqZWN0ICphcmdzKQogewotCVB5X3NzaXplX3QgaTsKLQlQeU9iamVjdCAqcmVzdWx0ID0gKFB5T2JqZWN0ICopc287CisgICAgUHlfc3NpemVfdCBpOworICAgIFB5T2JqZWN0ICpyZXN1bHQgPSAoUHlPYmplY3QgKilzbzsKIAotCWlmIChQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpID09IDApCi0JCXJldHVybiBzZXRfY29weShzbyk7CisgICAgaWYgKFB5VHVwbGVfR0VUX1NJWkUoYXJncykgPT0gMCkKKyAgICAgICAgcmV0dXJuIHNldF9jb3B5KHNvKTsKIAotCVB5X0lOQ1JFRihzbyk7Ci0JZm9yIChpPTAgOyBpPFB5VHVwbGVfR0VUX1NJWkUoYXJncykgOyBpKyspIHsKLQkJUHlPYmplY3QgKm90aGVyID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCBpKTsKLQkJUHlPYmplY3QgKm5ld3Jlc3VsdCA9IHNldF9pbnRlcnNlY3Rpb24oKFB5U2V0T2JqZWN0ICopcmVzdWx0LCBvdGhlcik7Ci0JCWlmIChuZXdyZXN1bHQgPT0gTlVMTCkgewotCQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJcmVzdWx0ID0gbmV3cmVzdWx0OwotCX0KLQlyZXR1cm4gcmVzdWx0OworICAgIFB5X0lOQ1JFRihzbyk7CisgICAgZm9yIChpPTAgOyBpPFB5VHVwbGVfR0VUX1NJWkUoYXJncykgOyBpKyspIHsKKyAgICAgICAgUHlPYmplY3QgKm90aGVyID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCBpKTsKKyAgICAgICAgUHlPYmplY3QgKm5ld3Jlc3VsdCA9IHNldF9pbnRlcnNlY3Rpb24oKFB5U2V0T2JqZWN0ICopcmVzdWx0LCBvdGhlcik7CisgICAgICAgIGlmIChuZXdyZXN1bHQgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgcmVzdWx0ID0gbmV3cmVzdWx0OworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBQeURvY19TVFJWQVIoaW50ZXJzZWN0aW9uX2RvYywKQEAgLTEzNDYsMjcgKzEzNDYsMjcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZXRfaW50ZXJzZWN0aW9uX3VwZGF0ZShQeVNldE9iamVjdCAqc28sIFB5T2JqZWN0ICpvdGhlcikKIHsKLQlQeU9iamVjdCAqdG1wOworICAgIFB5T2JqZWN0ICp0bXA7CiAKLQl0bXAgPSBzZXRfaW50ZXJzZWN0aW9uKHNvLCBvdGhlcik7Ci0JaWYgKHRtcCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlzZXRfc3dhcF9ib2RpZXMoc28sIChQeVNldE9iamVjdCAqKXRtcCk7Ci0JUHlfREVDUkVGKHRtcCk7Ci0JUHlfUkVUVVJOX05PTkU7CisgICAgdG1wID0gc2V0X2ludGVyc2VjdGlvbihzbywgb3RoZXIpOworICAgIGlmICh0bXAgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgc2V0X3N3YXBfYm9kaWVzKHNvLCAoUHlTZXRPYmplY3QgKil0bXApOworICAgIFB5X0RFQ1JFRih0bXApOworICAgIFB5X1JFVFVSTl9OT05FOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc2V0X2ludGVyc2VjdGlvbl91cGRhdGVfbXVsdGkoUHlTZXRPYmplY3QgKnNvLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqdG1wOworICAgIFB5T2JqZWN0ICp0bXA7CiAKLQl0bXAgPSBzZXRfaW50ZXJzZWN0aW9uX211bHRpKHNvLCBhcmdzKTsKLQlpZiAodG1wID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXNldF9zd2FwX2JvZGllcyhzbywgKFB5U2V0T2JqZWN0ICopdG1wKTsKLQlQeV9ERUNSRUYodG1wKTsKLQlQeV9SRVRVUk5fTk9ORTsKKyAgICB0bXAgPSBzZXRfaW50ZXJzZWN0aW9uX211bHRpKHNvLCBhcmdzKTsKKyAgICBpZiAodG1wID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHNldF9zd2FwX2JvZGllcyhzbywgKFB5U2V0T2JqZWN0ICopdG1wKTsKKyAgICBQeV9ERUNSRUYodG1wKTsKKyAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAogUHlEb2NfU1RSVkFSKGludGVyc2VjdGlvbl91cGRhdGVfZG9jLApAQCAtMTM3NSw5MiArMTM3NSw5MiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNldF9hbmQoUHlTZXRPYmplY3QgKnNvLCBQeU9iamVjdCAqb3RoZXIpCiB7Ci0JaWYgKCFQeUFueVNldF9DaGVjayhzbykgfHwgIVB5QW55U2V0X0NoZWNrKG90aGVyKSkgewotCQlQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOwotCQlyZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7Ci0JfQotCXJldHVybiBzZXRfaW50ZXJzZWN0aW9uKHNvLCBvdGhlcik7CisgICAgaWYgKCFQeUFueVNldF9DaGVjayhzbykgfHwgIVB5QW55U2V0X0NoZWNrKG90aGVyKSkgeworICAgICAgICBQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOworICAgICAgICByZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7CisgICAgfQorICAgIHJldHVybiBzZXRfaW50ZXJzZWN0aW9uKHNvLCBvdGhlcik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZXRfaWFuZChQeVNldE9iamVjdCAqc28sIFB5T2JqZWN0ICpvdGhlcikKIHsKLQlQeU9iamVjdCAqcmVzdWx0OworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CiAKLQlpZiAoIVB5QW55U2V0X0NoZWNrKG90aGVyKSkgewotCQlQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOwotCQlyZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7Ci0JfQotCXJlc3VsdCA9IHNldF9pbnRlcnNlY3Rpb25fdXBkYXRlKHNvLCBvdGhlcik7Ci0JaWYgKHJlc3VsdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlQeV9ERUNSRUYocmVzdWx0KTsKLQlQeV9JTkNSRUYoc28pOwotCXJldHVybiAoUHlPYmplY3QgKilzbzsKKyAgICBpZiAoIVB5QW55U2V0X0NoZWNrKG90aGVyKSkgeworICAgICAgICBQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOworICAgICAgICByZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7CisgICAgfQorICAgIHJlc3VsdCA9IHNldF9pbnRlcnNlY3Rpb25fdXBkYXRlKHNvLCBvdGhlcik7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICBQeV9JTkNSRUYoc28pOworICAgIHJldHVybiAoUHlPYmplY3QgKilzbzsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNldF9pc2Rpc2pvaW50KFB5U2V0T2JqZWN0ICpzbywgUHlPYmplY3QgKm90aGVyKQogewotCVB5T2JqZWN0ICprZXksICppdCwgKnRtcDsKKyAgICBQeU9iamVjdCAqa2V5LCAqaXQsICp0bXA7CiAKLQlpZiAoKFB5T2JqZWN0ICopc28gPT0gb3RoZXIpIHsKLQkJaWYgKFB5U2V0X0dFVF9TSVpFKHNvKSA9PSAwKQotCQkJUHlfUkVUVVJOX1RSVUU7Ci0JCWVsc2UKLQkJCVB5X1JFVFVSTl9GQUxTRTsKLQl9CisgICAgaWYgKChQeU9iamVjdCAqKXNvID09IG90aGVyKSB7CisgICAgICAgIGlmIChQeVNldF9HRVRfU0laRShzbykgPT0gMCkKKyAgICAgICAgICAgIFB5X1JFVFVSTl9UUlVFOworICAgICAgICBlbHNlCisgICAgICAgICAgICBQeV9SRVRVUk5fRkFMU0U7CisgICAgfQogCi0JaWYgKFB5QW55U2V0X0NoZWNrRXhhY3Qob3RoZXIpKSB7CQkKLQkJUHlfc3NpemVfdCBwb3MgPSAwOwotCQlzZXRlbnRyeSAqZW50cnk7CisgICAgaWYgKFB5QW55U2V0X0NoZWNrRXhhY3Qob3RoZXIpKSB7CisgICAgICAgIFB5X3NzaXplX3QgcG9zID0gMDsKKyAgICAgICAgc2V0ZW50cnkgKmVudHJ5OwogCi0JCWlmIChQeVNldF9HRVRfU0laRShvdGhlcikgPiBQeVNldF9HRVRfU0laRShzbykpIHsKLQkJCXRtcCA9IChQeU9iamVjdCAqKXNvOwotCQkJc28gPSAoUHlTZXRPYmplY3QgKilvdGhlcjsKLQkJCW90aGVyID0gdG1wOwotCQl9Ci0JCXdoaWxlIChzZXRfbmV4dCgoUHlTZXRPYmplY3QgKilvdGhlciwgJnBvcywgJmVudHJ5KSkgewotCQkJaW50IHJ2ID0gc2V0X2NvbnRhaW5zX2VudHJ5KHNvLCBlbnRyeSk7Ci0JCQlpZiAocnYgPT0gLTEpCi0JCQkJcmV0dXJuIE5VTEw7Ci0JCQlpZiAocnYpCi0JCQkJUHlfUkVUVVJOX0ZBTFNFOwotCQl9Ci0JCVB5X1JFVFVSTl9UUlVFOwotCX0KKyAgICAgICAgaWYgKFB5U2V0X0dFVF9TSVpFKG90aGVyKSA+IFB5U2V0X0dFVF9TSVpFKHNvKSkgeworICAgICAgICAgICAgdG1wID0gKFB5T2JqZWN0ICopc287CisgICAgICAgICAgICBzbyA9IChQeVNldE9iamVjdCAqKW90aGVyOworICAgICAgICAgICAgb3RoZXIgPSB0bXA7CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKHNldF9uZXh0KChQeVNldE9iamVjdCAqKW90aGVyLCAmcG9zLCAmZW50cnkpKSB7CisgICAgICAgICAgICBpbnQgcnYgPSBzZXRfY29udGFpbnNfZW50cnkoc28sIGVudHJ5KTsKKyAgICAgICAgICAgIGlmIChydiA9PSAtMSkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIGlmIChydikKKyAgICAgICAgICAgICAgICBQeV9SRVRVUk5fRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgUHlfUkVUVVJOX1RSVUU7CisgICAgfQogCi0JaXQgPSBQeU9iamVjdF9HZXRJdGVyKG90aGVyKTsKLQlpZiAoaXQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgaXQgPSBQeU9iamVjdF9HZXRJdGVyKG90aGVyKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQl3aGlsZSAoKGtleSA9IFB5SXRlcl9OZXh0KGl0KSkgIT0gTlVMTCkgewotCQlpbnQgcnY7Ci0JCXNldGVudHJ5IGVudHJ5OwotCQlsb25nIGhhc2ggPSBQeU9iamVjdF9IYXNoKGtleSk7CisgICAgd2hpbGUgKChrZXkgPSBQeUl0ZXJfTmV4dChpdCkpICE9IE5VTEwpIHsKKyAgICAgICAgaW50IHJ2OworICAgICAgICBzZXRlbnRyeSBlbnRyeTsKKyAgICAgICAgbG9uZyBoYXNoID0gUHlPYmplY3RfSGFzaChrZXkpOwogCi0JCWlmIChoYXNoID09IC0xKSB7Ci0JCQlQeV9ERUNSRUYoa2V5KTsKLQkJCVB5X0RFQ1JFRihpdCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQllbnRyeS5oYXNoID0gaGFzaDsKLQkJZW50cnkua2V5ID0ga2V5OwotCQlydiA9IHNldF9jb250YWluc19lbnRyeShzbywgJmVudHJ5KTsKLQkJUHlfREVDUkVGKGtleSk7Ci0JCWlmIChydiA9PSAtMSkgewotCQkJUHlfREVDUkVGKGl0KTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWlmIChydikgewotCQkJUHlfREVDUkVGKGl0KTsKLQkJCVB5X1JFVFVSTl9GQUxTRTsKLQkJfQotCX0KLQlQeV9ERUNSRUYoaXQpOwotCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gTlVMTDsKLQlQeV9SRVRVUk5fVFJVRTsKKyAgICAgICAgaWYgKGhhc2ggPT0gLTEpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihrZXkpOworICAgICAgICAgICAgUHlfREVDUkVGKGl0KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGVudHJ5Lmhhc2ggPSBoYXNoOworICAgICAgICBlbnRyeS5rZXkgPSBrZXk7CisgICAgICAgIHJ2ID0gc2V0X2NvbnRhaW5zX2VudHJ5KHNvLCAmZW50cnkpOworICAgICAgICBQeV9ERUNSRUYoa2V5KTsKKyAgICAgICAgaWYgKHJ2ID09IC0xKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoaXQpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJ2KSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoaXQpOworICAgICAgICAgICAgUHlfUkVUVVJOX0ZBTFNFOworICAgICAgICB9CisgICAgfQorICAgIFB5X0RFQ1JFRihpdCk7CisgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5X1JFVFVSTl9UUlVFOwogfQogCiBQeURvY19TVFJWQVIoaXNkaXNqb2ludF9kb2MsCkBAIC0xNDY5LDUxICsxNDY5LDUxIEBACiBzdGF0aWMgaW50CiBzZXRfZGlmZmVyZW5jZV91cGRhdGVfaW50ZXJuYWwoUHlTZXRPYmplY3QgKnNvLCBQeU9iamVjdCAqb3RoZXIpCiB7Ci0JaWYgKChQeU9iamVjdCAqKXNvID09IG90aGVyKQotCQlyZXR1cm4gc2V0X2NsZWFyX2ludGVybmFsKHNvKTsKLQkKLQlpZiAoUHlBbnlTZXRfQ2hlY2sob3RoZXIpKSB7Ci0JCXNldGVudHJ5ICplbnRyeTsKLQkJUHlfc3NpemVfdCBwb3MgPSAwOworICAgIGlmICgoUHlPYmplY3QgKilzbyA9PSBvdGhlcikKKyAgICAgICAgcmV0dXJuIHNldF9jbGVhcl9pbnRlcm5hbChzbyk7CiAKLQkJd2hpbGUgKHNldF9uZXh0KChQeVNldE9iamVjdCAqKW90aGVyLCAmcG9zLCAmZW50cnkpKQotCQkJaWYgKHNldF9kaXNjYXJkX2VudHJ5KHNvLCBlbnRyeSkgPT0gLTEpCi0JCQkJcmV0dXJuIC0xOwotCX0gZWxzZSB7Ci0JCVB5T2JqZWN0ICprZXksICppdDsKLQkJaXQgPSBQeU9iamVjdF9HZXRJdGVyKG90aGVyKTsKLQkJaWYgKGl0ID09IE5VTEwpCi0JCQlyZXR1cm4gLTE7CisgICAgaWYgKFB5QW55U2V0X0NoZWNrKG90aGVyKSkgeworICAgICAgICBzZXRlbnRyeSAqZW50cnk7CisgICAgICAgIFB5X3NzaXplX3QgcG9zID0gMDsKIAotCQl3aGlsZSAoKGtleSA9IFB5SXRlcl9OZXh0KGl0KSkgIT0gTlVMTCkgewotCQkJaWYgKHNldF9kaXNjYXJkX2tleShzbywga2V5KSA9PSAtMSkgewotCQkJCVB5X0RFQ1JFRihpdCk7Ci0JCQkJUHlfREVDUkVGKGtleSk7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQkJUHlfREVDUkVGKGtleSk7Ci0JCX0KLQkJUHlfREVDUkVGKGl0KTsKLQkJaWYgKFB5RXJyX09jY3VycmVkKCkpCi0JCQlyZXR1cm4gLTE7Ci0JfQotCS8qIElmIG1vcmUgdGhhbiAxLzUgYXJlIGR1bW1pZXMsIHRoZW4gcmVzaXplIHRoZW0gYXdheS4gKi8KLQlpZiAoKHNvLT5maWxsIC0gc28tPnVzZWQpICogNSA8IHNvLT5tYXNrKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gc2V0X3RhYmxlX3Jlc2l6ZShzbywgc28tPnVzZWQ+NTAwMDAgPyBzby0+dXNlZCoyIDogc28tPnVzZWQqNCk7CisgICAgICAgIHdoaWxlIChzZXRfbmV4dCgoUHlTZXRPYmplY3QgKilvdGhlciwgJnBvcywgJmVudHJ5KSkKKyAgICAgICAgICAgIGlmIChzZXRfZGlzY2FyZF9lbnRyeShzbywgZW50cnkpID09IC0xKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9IGVsc2UgeworICAgICAgICBQeU9iamVjdCAqa2V5LCAqaXQ7CisgICAgICAgIGl0ID0gUHlPYmplY3RfR2V0SXRlcihvdGhlcik7CisgICAgICAgIGlmIChpdCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgIHdoaWxlICgoa2V5ID0gUHlJdGVyX05leHQoaXQpKSAhPSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoc2V0X2Rpc2NhcmRfa2V5KHNvLCBrZXkpID09IC0xKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGl0KTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoa2V5KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQeV9ERUNSRUYoa2V5KTsKKyAgICAgICAgfQorICAgICAgICBQeV9ERUNSRUYoaXQpOworICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgLyogSWYgbW9yZSB0aGFuIDEvNSBhcmUgZHVtbWllcywgdGhlbiByZXNpemUgdGhlbSBhd2F5LiAqLworICAgIGlmICgoc28tPmZpbGwgLSBzby0+dXNlZCkgKiA1IDwgc28tPm1hc2spCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiBzZXRfdGFibGVfcmVzaXplKHNvLCBzby0+dXNlZD41MDAwMCA/IHNvLT51c2VkKjIgOiBzby0+dXNlZCo0KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNldF9kaWZmZXJlbmNlX3VwZGF0ZShQeVNldE9iamVjdCAqc28sIFB5T2JqZWN0ICphcmdzKQogewotCVB5X3NzaXplX3QgaTsKKyAgICBQeV9zc2l6ZV90IGk7CiAKLQlmb3IgKGk9MCA7IGk8UHlUdXBsZV9HRVRfU0laRShhcmdzKSA7IGkrKykgewotCQlQeU9iamVjdCAqb3RoZXIgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIGkpOwotCQlpZiAoc2V0X2RpZmZlcmVuY2VfdXBkYXRlX2ludGVybmFsKHNvLCBvdGhlcikgPT0gLTEpCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0JUHlfUkVUVVJOX05PTkU7CisgICAgZm9yIChpPTAgOyBpPFB5VHVwbGVfR0VUX1NJWkUoYXJncykgOyBpKyspIHsKKyAgICAgICAgUHlPYmplY3QgKm90aGVyID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCBpKTsKKyAgICAgICAgaWYgKHNldF9kaWZmZXJlbmNlX3VwZGF0ZV9pbnRlcm5hbChzbywgb3RoZXIpID09IC0xKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5X1JFVFVSTl9OT05FOwogfQogCiBQeURvY19TVFJWQVIoZGlmZmVyZW5jZV91cGRhdGVfZG9jLApAQCAtMTUyMiw3NyArMTUyMiw3NyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNldF9kaWZmZXJlbmNlKFB5U2V0T2JqZWN0ICpzbywgUHlPYmplY3QgKm90aGVyKQogewotCVB5T2JqZWN0ICpyZXN1bHQ7Ci0Jc2V0ZW50cnkgKmVudHJ5OwotCVB5X3NzaXplX3QgcG9zID0gMDsKKyAgICBQeU9iamVjdCAqcmVzdWx0OworICAgIHNldGVudHJ5ICplbnRyeTsKKyAgICBQeV9zc2l6ZV90IHBvcyA9IDA7CiAKLQlpZiAoIVB5QW55U2V0X0NoZWNrKG90aGVyKSAgJiYgIVB5RGljdF9DaGVja0V4YWN0KG90aGVyKSkgewotCQlyZXN1bHQgPSBzZXRfY29weShzbyk7Ci0JCWlmIChyZXN1bHQgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQlpZiAoc2V0X2RpZmZlcmVuY2VfdXBkYXRlX2ludGVybmFsKChQeVNldE9iamVjdCAqKXJlc3VsdCwgb3RoZXIpICE9IC0xKQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQkKLQlyZXN1bHQgPSBtYWtlX25ld19zZXQoUHlfVFlQRShzbyksIE5VTEwpOwotCWlmIChyZXN1bHQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFueVNldF9DaGVjayhvdGhlcikgICYmICFQeURpY3RfQ2hlY2tFeGFjdChvdGhlcikpIHsKKyAgICAgICAgcmVzdWx0ID0gc2V0X2NvcHkoc28pOworICAgICAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKHNldF9kaWZmZXJlbmNlX3VwZGF0ZV9pbnRlcm5hbCgoUHlTZXRPYmplY3QgKilyZXN1bHQsIG90aGVyKSAhPSAtMSkKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlpZiAoUHlEaWN0X0NoZWNrRXhhY3Qob3RoZXIpKSB7Ci0JCXdoaWxlIChzZXRfbmV4dChzbywgJnBvcywgJmVudHJ5KSkgewotCQkJc2V0ZW50cnkgZW50cnljb3B5OwotCQkJZW50cnljb3B5Lmhhc2ggPSBlbnRyeS0+aGFzaDsKLQkJCWVudHJ5Y29weS5rZXkgPSBlbnRyeS0+a2V5OwotCQkJaWYgKCFfUHlEaWN0X0NvbnRhaW5zKG90aGVyLCBlbnRyeS0+a2V5LCBlbnRyeS0+aGFzaCkpIHsKLQkJCQlpZiAoc2V0X2FkZF9lbnRyeSgoUHlTZXRPYmplY3QgKilyZXN1bHQsICZlbnRyeWNvcHkpID09IC0xKSB7Ci0JCQkJCVB5X0RFQ1JFRihyZXN1bHQpOwotCQkJCQlyZXR1cm4gTlVMTDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9CisgICAgcmVzdWx0ID0gbWFrZV9uZXdfc2V0KFB5X1RZUEUoc28pLCBOVUxMKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0Jd2hpbGUgKHNldF9uZXh0KHNvLCAmcG9zLCAmZW50cnkpKSB7Ci0JCWludCBydiA9IHNldF9jb250YWluc19lbnRyeSgoUHlTZXRPYmplY3QgKilvdGhlciwgZW50cnkpOwotCQlpZiAocnYgPT0gLTEpIHsKLQkJCVB5X0RFQ1JFRihyZXN1bHQpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJaWYgKCFydikgewotCQkJaWYgKHNldF9hZGRfZW50cnkoKFB5U2V0T2JqZWN0ICopcmVzdWx0LCBlbnRyeSkgPT0gLTEpIHsKLQkJCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJfQotCX0KLQlyZXR1cm4gcmVzdWx0OworICAgIGlmIChQeURpY3RfQ2hlY2tFeGFjdChvdGhlcikpIHsKKyAgICAgICAgd2hpbGUgKHNldF9uZXh0KHNvLCAmcG9zLCAmZW50cnkpKSB7CisgICAgICAgICAgICBzZXRlbnRyeSBlbnRyeWNvcHk7CisgICAgICAgICAgICBlbnRyeWNvcHkuaGFzaCA9IGVudHJ5LT5oYXNoOworICAgICAgICAgICAgZW50cnljb3B5LmtleSA9IGVudHJ5LT5rZXk7CisgICAgICAgICAgICBpZiAoIV9QeURpY3RfQ29udGFpbnMob3RoZXIsIGVudHJ5LT5rZXksIGVudHJ5LT5oYXNoKSkgeworICAgICAgICAgICAgICAgIGlmIChzZXRfYWRkX2VudHJ5KChQeVNldE9iamVjdCAqKXJlc3VsdCwgJmVudHJ5Y29weSkgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHdoaWxlIChzZXRfbmV4dChzbywgJnBvcywgJmVudHJ5KSkgeworICAgICAgICBpbnQgcnYgPSBzZXRfY29udGFpbnNfZW50cnkoKFB5U2V0T2JqZWN0ICopb3RoZXIsIGVudHJ5KTsKKyAgICAgICAgaWYgKHJ2ID09IC0xKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGlmICghcnYpIHsKKyAgICAgICAgICAgIGlmIChzZXRfYWRkX2VudHJ5KChQeVNldE9iamVjdCAqKXJlc3VsdCwgZW50cnkpID09IC0xKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNldF9kaWZmZXJlbmNlX211bHRpKFB5U2V0T2JqZWN0ICpzbywgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlfc3NpemVfdCBpOwotCVB5T2JqZWN0ICpyZXN1bHQsICpvdGhlcjsKKyAgICBQeV9zc2l6ZV90IGk7CisgICAgUHlPYmplY3QgKnJlc3VsdCwgKm90aGVyOwogCi0JaWYgKFB5VHVwbGVfR0VUX1NJWkUoYXJncykgPT0gMCkKLQkJcmV0dXJuIHNldF9jb3B5KHNvKTsKKyAgICBpZiAoUHlUdXBsZV9HRVRfU0laRShhcmdzKSA9PSAwKQorICAgICAgICByZXR1cm4gc2V0X2NvcHkoc28pOwogCi0Jb3RoZXIgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDApOwotCXJlc3VsdCA9IHNldF9kaWZmZXJlbmNlKHNvLCBvdGhlcik7Ci0JaWYgKHJlc3VsdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBvdGhlciA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgMCk7CisgICAgcmVzdWx0ID0gc2V0X2RpZmZlcmVuY2Uoc28sIG90aGVyKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JZm9yIChpPTEgOyBpPFB5VHVwbGVfR0VUX1NJWkUoYXJncykgOyBpKyspIHsKLQkJb3RoZXIgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIGkpOwotCQlpZiAoc2V0X2RpZmZlcmVuY2VfdXBkYXRlX2ludGVybmFsKChQeVNldE9iamVjdCAqKXJlc3VsdCwgb3RoZXIpID09IC0xKSB7Ci0JCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQotCXJldHVybiByZXN1bHQ7CisgICAgZm9yIChpPTEgOyBpPFB5VHVwbGVfR0VUX1NJWkUoYXJncykgOyBpKyspIHsKKyAgICAgICAgb3RoZXIgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIGkpOworICAgICAgICBpZiAoc2V0X2RpZmZlcmVuY2VfdXBkYXRlX2ludGVybmFsKChQeVNldE9iamVjdCAqKXJlc3VsdCwgb3RoZXIpID09IC0xKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIFB5RG9jX1NUUlZBUihkaWZmZXJlbmNlX2RvYywKQEAgLTE2MDIsODEgKzE2MDIsODEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZXRfc3ViKFB5U2V0T2JqZWN0ICpzbywgUHlPYmplY3QgKm90aGVyKQogewotCWlmICghUHlBbnlTZXRfQ2hlY2soc28pIHx8ICFQeUFueVNldF9DaGVjayhvdGhlcikpIHsKLQkJUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKLQkJcmV0dXJuIFB5X05vdEltcGxlbWVudGVkOwotCX0KLQlyZXR1cm4gc2V0X2RpZmZlcmVuY2Uoc28sIG90aGVyKTsKKyAgICBpZiAoIVB5QW55U2V0X0NoZWNrKHNvKSB8fCAhUHlBbnlTZXRfQ2hlY2sob3RoZXIpKSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7CisgICAgICAgIHJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKKyAgICB9CisgICAgcmV0dXJuIHNldF9kaWZmZXJlbmNlKHNvLCBvdGhlcik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZXRfaXN1YihQeVNldE9iamVjdCAqc28sIFB5T2JqZWN0ICpvdGhlcikKIHsKLQlpZiAoIVB5QW55U2V0X0NoZWNrKG90aGVyKSkgewotCQlQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOwotCQlyZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7Ci0JfQotCWlmIChzZXRfZGlmZmVyZW5jZV91cGRhdGVfaW50ZXJuYWwoc28sIG90aGVyKSA9PSAtMSkKLQkJcmV0dXJuIE5VTEw7Ci0JUHlfSU5DUkVGKHNvKTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopc287CisgICAgaWYgKCFQeUFueVNldF9DaGVjayhvdGhlcikpIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKKyAgICAgICAgcmV0dXJuIFB5X05vdEltcGxlbWVudGVkOworICAgIH0KKyAgICBpZiAoc2V0X2RpZmZlcmVuY2VfdXBkYXRlX2ludGVybmFsKHNvLCBvdGhlcikgPT0gLTEpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5X0lOQ1JFRihzbyk7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKXNvOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc2V0X3N5bW1ldHJpY19kaWZmZXJlbmNlX3VwZGF0ZShQeVNldE9iamVjdCAqc28sIFB5T2JqZWN0ICpvdGhlcikKIHsKLQlQeVNldE9iamVjdCAqb3RoZXJzZXQ7Ci0JUHlPYmplY3QgKmtleTsKLQlQeV9zc2l6ZV90IHBvcyA9IDA7Ci0Jc2V0ZW50cnkgKmVudHJ5OworICAgIFB5U2V0T2JqZWN0ICpvdGhlcnNldDsKKyAgICBQeU9iamVjdCAqa2V5OworICAgIFB5X3NzaXplX3QgcG9zID0gMDsKKyAgICBzZXRlbnRyeSAqZW50cnk7CiAKLQlpZiAoKFB5T2JqZWN0ICopc28gPT0gb3RoZXIpCi0JCXJldHVybiBzZXRfY2xlYXIoc28pOworICAgIGlmICgoUHlPYmplY3QgKilzbyA9PSBvdGhlcikKKyAgICAgICAgcmV0dXJuIHNldF9jbGVhcihzbyk7CiAKLQlpZiAoUHlEaWN0X0NoZWNrRXhhY3Qob3RoZXIpKSB7Ci0JCVB5T2JqZWN0ICp2YWx1ZTsKLQkJaW50IHJ2OwotCQlsb25nIGhhc2g7Ci0JCXdoaWxlIChfUHlEaWN0X05leHQob3RoZXIsICZwb3MsICZrZXksICZ2YWx1ZSwgJmhhc2gpKSB7Ci0JCQlzZXRlbnRyeSBhbl9lbnRyeTsKKyAgICBpZiAoUHlEaWN0X0NoZWNrRXhhY3Qob3RoZXIpKSB7CisgICAgICAgIFB5T2JqZWN0ICp2YWx1ZTsKKyAgICAgICAgaW50IHJ2OworICAgICAgICBsb25nIGhhc2g7CisgICAgICAgIHdoaWxlIChfUHlEaWN0X05leHQob3RoZXIsICZwb3MsICZrZXksICZ2YWx1ZSwgJmhhc2gpKSB7CisgICAgICAgICAgICBzZXRlbnRyeSBhbl9lbnRyeTsKIAotCQkJYW5fZW50cnkuaGFzaCA9IGhhc2g7Ci0JCQlhbl9lbnRyeS5rZXkgPSBrZXk7Ci0JCQlydiA9IHNldF9kaXNjYXJkX2VudHJ5KHNvLCAmYW5fZW50cnkpOwotCQkJaWYgKHJ2ID09IC0xKQotCQkJCXJldHVybiBOVUxMOwotCQkJaWYgKHJ2ID09IERJU0NBUkRfTk9URk9VTkQpIHsKLQkJCQlpZiAoc2V0X2FkZF9lbnRyeShzbywgJmFuX2VudHJ5KSA9PSAtMSkKLQkJCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCX0KLQkJUHlfUkVUVVJOX05PTkU7Ci0JfQorICAgICAgICAgICAgYW5fZW50cnkuaGFzaCA9IGhhc2g7CisgICAgICAgICAgICBhbl9lbnRyeS5rZXkgPSBrZXk7CisgICAgICAgICAgICBydiA9IHNldF9kaXNjYXJkX2VudHJ5KHNvLCAmYW5fZW50cnkpOworICAgICAgICAgICAgaWYgKHJ2ID09IC0xKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgaWYgKHJ2ID09IERJU0NBUkRfTk9URk9VTkQpIHsKKyAgICAgICAgICAgICAgICBpZiAoc2V0X2FkZF9lbnRyeShzbywgJmFuX2VudHJ5KSA9PSAtMSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgUHlfUkVUVVJOX05PTkU7CisgICAgfQogCi0JaWYgKFB5QW55U2V0X0NoZWNrKG90aGVyKSkgewotCQlQeV9JTkNSRUYob3RoZXIpOwotCQlvdGhlcnNldCA9IChQeVNldE9iamVjdCAqKW90aGVyOwotCX0gZWxzZSB7Ci0JCW90aGVyc2V0ID0gKFB5U2V0T2JqZWN0ICopbWFrZV9uZXdfc2V0KFB5X1RZUEUoc28pLCBvdGhlcik7Ci0JCWlmIChvdGhlcnNldCA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChQeUFueVNldF9DaGVjayhvdGhlcikpIHsKKyAgICAgICAgUHlfSU5DUkVGKG90aGVyKTsKKyAgICAgICAgb3RoZXJzZXQgPSAoUHlTZXRPYmplY3QgKilvdGhlcjsKKyAgICB9IGVsc2UgeworICAgICAgICBvdGhlcnNldCA9IChQeVNldE9iamVjdCAqKW1ha2VfbmV3X3NldChQeV9UWVBFKHNvKSwgb3RoZXIpOworICAgICAgICBpZiAob3RoZXJzZXQgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXdoaWxlIChzZXRfbmV4dChvdGhlcnNldCwgJnBvcywgJmVudHJ5KSkgewotCQlpbnQgcnYgPSBzZXRfZGlzY2FyZF9lbnRyeShzbywgZW50cnkpOwotCQlpZiAocnYgPT0gLTEpIHsKLQkJCVB5X0RFQ1JFRihvdGhlcnNldCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlpZiAocnYgPT0gRElTQ0FSRF9OT1RGT1VORCkgewotCQkJaWYgKHNldF9hZGRfZW50cnkoc28sIGVudHJ5KSA9PSAtMSkgewotCQkJCVB5X0RFQ1JFRihvdGhlcnNldCk7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCX0KLQl9Ci0JUHlfREVDUkVGKG90aGVyc2V0KTsKLQlQeV9SRVRVUk5fTk9ORTsKKyAgICB3aGlsZSAoc2V0X25leHQob3RoZXJzZXQsICZwb3MsICZlbnRyeSkpIHsKKyAgICAgICAgaW50IHJ2ID0gc2V0X2Rpc2NhcmRfZW50cnkoc28sIGVudHJ5KTsKKyAgICAgICAgaWYgKHJ2ID09IC0xKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYob3RoZXJzZXQpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJ2ID09IERJU0NBUkRfTk9URk9VTkQpIHsKKyAgICAgICAgICAgIGlmIChzZXRfYWRkX2VudHJ5KHNvLCBlbnRyeSkgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYob3RoZXJzZXQpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIFB5X0RFQ1JFRihvdGhlcnNldCk7CisgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKIFB5RG9jX1NUUlZBUihzeW1tZXRyaWNfZGlmZmVyZW5jZV91cGRhdGVfZG9jLApAQCAtMTY4NSwxNyArMTY4NSwxNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNldF9zeW1tZXRyaWNfZGlmZmVyZW5jZShQeVNldE9iamVjdCAqc28sIFB5T2JqZWN0ICpvdGhlcikKIHsKLQlQeU9iamVjdCAqcnY7Ci0JUHlTZXRPYmplY3QgKm90aGVyc2V0OworICAgIFB5T2JqZWN0ICpydjsKKyAgICBQeVNldE9iamVjdCAqb3RoZXJzZXQ7CiAKLQlvdGhlcnNldCA9IChQeVNldE9iamVjdCAqKW1ha2VfbmV3X3NldChQeV9UWVBFKHNvKSwgb3RoZXIpOwotCWlmIChvdGhlcnNldCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlydiA9IHNldF9zeW1tZXRyaWNfZGlmZmVyZW5jZV91cGRhdGUob3RoZXJzZXQsIChQeU9iamVjdCAqKXNvKTsKLQlpZiAocnYgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JUHlfREVDUkVGKHJ2KTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopb3RoZXJzZXQ7CisgICAgb3RoZXJzZXQgPSAoUHlTZXRPYmplY3QgKiltYWtlX25ld19zZXQoUHlfVFlQRShzbyksIG90aGVyKTsKKyAgICBpZiAob3RoZXJzZXQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcnYgPSBzZXRfc3ltbWV0cmljX2RpZmZlcmVuY2VfdXBkYXRlKG90aGVyc2V0LCAoUHlPYmplY3QgKilzbyk7CisgICAgaWYgKHJ2ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5X0RFQ1JFRihydik7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKW90aGVyc2V0OwogfQogCiBQeURvY19TVFJWQVIoc3ltbWV0cmljX2RpZmZlcmVuY2VfZG9jLApAQCAtMTcwNiw1NiArMTcwNiw1NiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNldF94b3IoUHlTZXRPYmplY3QgKnNvLCBQeU9iamVjdCAqb3RoZXIpCiB7Ci0JaWYgKCFQeUFueVNldF9DaGVjayhzbykgfHwgIVB5QW55U2V0X0NoZWNrKG90aGVyKSkgewotCQlQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOwotCQlyZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7Ci0JfQotCXJldHVybiBzZXRfc3ltbWV0cmljX2RpZmZlcmVuY2Uoc28sIG90aGVyKTsKKyAgICBpZiAoIVB5QW55U2V0X0NoZWNrKHNvKSB8fCAhUHlBbnlTZXRfQ2hlY2sob3RoZXIpKSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7CisgICAgICAgIHJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKKyAgICB9CisgICAgcmV0dXJuIHNldF9zeW1tZXRyaWNfZGlmZmVyZW5jZShzbywgb3RoZXIpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc2V0X2l4b3IoUHlTZXRPYmplY3QgKnNvLCBQeU9iamVjdCAqb3RoZXIpCiB7Ci0JUHlPYmplY3QgKnJlc3VsdDsKKyAgICBQeU9iamVjdCAqcmVzdWx0OwogCi0JaWYgKCFQeUFueVNldF9DaGVjayhvdGhlcikpIHsKLQkJUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKLQkJcmV0dXJuIFB5X05vdEltcGxlbWVudGVkOwotCX0KLQlyZXN1bHQgPSBzZXRfc3ltbWV0cmljX2RpZmZlcmVuY2VfdXBkYXRlKHNvLCBvdGhlcik7Ci0JaWYgKHJlc3VsdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlQeV9ERUNSRUYocmVzdWx0KTsKLQlQeV9JTkNSRUYoc28pOwotCXJldHVybiAoUHlPYmplY3QgKilzbzsKKyAgICBpZiAoIVB5QW55U2V0X0NoZWNrKG90aGVyKSkgeworICAgICAgICBQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOworICAgICAgICByZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7CisgICAgfQorICAgIHJlc3VsdCA9IHNldF9zeW1tZXRyaWNfZGlmZmVyZW5jZV91cGRhdGUoc28sIG90aGVyKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgIFB5X0lOQ1JFRihzbyk7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKXNvOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc2V0X2lzc3Vic2V0KFB5U2V0T2JqZWN0ICpzbywgUHlPYmplY3QgKm90aGVyKQogewotCXNldGVudHJ5ICplbnRyeTsKLQlQeV9zc2l6ZV90IHBvcyA9IDA7CisgICAgc2V0ZW50cnkgKmVudHJ5OworICAgIFB5X3NzaXplX3QgcG9zID0gMDsKIAotCWlmICghUHlBbnlTZXRfQ2hlY2sob3RoZXIpKSB7Ci0JCVB5T2JqZWN0ICp0bXAsICpyZXN1bHQ7Ci0JCXRtcCA9IG1ha2VfbmV3X3NldCgmUHlTZXRfVHlwZSwgb3RoZXIpOwotCQlpZiAodG1wID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQkJcmVzdWx0ID0gc2V0X2lzc3Vic2V0KHNvLCB0bXApOwotCQlQeV9ERUNSRUYodG1wKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JaWYgKFB5U2V0X0dFVF9TSVpFKHNvKSA+IFB5U2V0X0dFVF9TSVpFKG90aGVyKSkgCi0JCVB5X1JFVFVSTl9GQUxTRTsKKyAgICBpZiAoIVB5QW55U2V0X0NoZWNrKG90aGVyKSkgeworICAgICAgICBQeU9iamVjdCAqdG1wLCAqcmVzdWx0OworICAgICAgICB0bXAgPSBtYWtlX25ld19zZXQoJlB5U2V0X1R5cGUsIG90aGVyKTsKKyAgICAgICAgaWYgKHRtcCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHJlc3VsdCA9IHNldF9pc3N1YnNldChzbywgdG1wKTsKKyAgICAgICAgUHlfREVDUkVGKHRtcCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIGlmIChQeVNldF9HRVRfU0laRShzbykgPiBQeVNldF9HRVRfU0laRShvdGhlcikpCisgICAgICAgIFB5X1JFVFVSTl9GQUxTRTsKIAotCXdoaWxlIChzZXRfbmV4dChzbywgJnBvcywgJmVudHJ5KSkgewotCQlpbnQgcnYgPSBzZXRfY29udGFpbnNfZW50cnkoKFB5U2V0T2JqZWN0ICopb3RoZXIsIGVudHJ5KTsKLQkJaWYgKHJ2ID09IC0xKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWlmICghcnYpCi0JCQlQeV9SRVRVUk5fRkFMU0U7Ci0JfQotCVB5X1JFVFVSTl9UUlVFOworICAgIHdoaWxlIChzZXRfbmV4dChzbywgJnBvcywgJmVudHJ5KSkgeworICAgICAgICBpbnQgcnYgPSBzZXRfY29udGFpbnNfZW50cnkoKFB5U2V0T2JqZWN0ICopb3RoZXIsIGVudHJ5KTsKKyAgICAgICAgaWYgKHJ2ID09IC0xKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGlmICghcnYpCisgICAgICAgICAgICBQeV9SRVRVUk5fRkFMU0U7CisgICAgfQorICAgIFB5X1JFVFVSTl9UUlVFOwogfQogCiBQeURvY19TVFJWQVIoaXNzdWJzZXRfZG9jLCAiUmVwb3J0IHdoZXRoZXIgYW5vdGhlciBzZXQgY29udGFpbnMgdGhpcyBzZXQuIik7CkBAIC0xNzYzLDE3ICsxNzYzLDE3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc2V0X2lzc3VwZXJzZXQoUHlTZXRPYmplY3QgKnNvLCBQeU9iamVjdCAqb3RoZXIpCiB7Ci0JUHlPYmplY3QgKnRtcCwgKnJlc3VsdDsKKyAgICBQeU9iamVjdCAqdG1wLCAqcmVzdWx0OwogCi0JaWYgKCFQeUFueVNldF9DaGVjayhvdGhlcikpIHsKLQkJdG1wID0gbWFrZV9uZXdfc2V0KCZQeVNldF9UeXBlLCBvdGhlcik7Ci0JCWlmICh0bXAgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQlyZXN1bHQgPSBzZXRfaXNzdXBlcnNldChzbywgdG1wKTsKLQkJUHlfREVDUkVGKHRtcCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCXJldHVybiBzZXRfaXNzdWJzZXQoKFB5U2V0T2JqZWN0ICopb3RoZXIsIChQeU9iamVjdCAqKXNvKTsKKyAgICBpZiAoIVB5QW55U2V0X0NoZWNrKG90aGVyKSkgeworICAgICAgICB0bXAgPSBtYWtlX25ld19zZXQoJlB5U2V0X1R5cGUsIG90aGVyKTsKKyAgICAgICAgaWYgKHRtcCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHJlc3VsdCA9IHNldF9pc3N1cGVyc2V0KHNvLCB0bXApOworICAgICAgICBQeV9ERUNSRUYodG1wKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgcmV0dXJuIHNldF9pc3N1YnNldCgoUHlTZXRPYmplY3QgKilvdGhlciwgKFB5T2JqZWN0ICopc28pOwogfQogCiBQeURvY19TVFJWQVIoaXNzdXBlcnNldF9kb2MsICJSZXBvcnQgd2hldGhlciB0aGlzIHNldCBjb250YWlucyBhbm90aGVyIHNldC4iKTsKQEAgLTE3ODEsNjUgKzE3ODEsNjUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZXRfcmljaGNvbXBhcmUoUHlTZXRPYmplY3QgKnYsIFB5T2JqZWN0ICp3LCBpbnQgb3ApCiB7Ci0JUHlPYmplY3QgKnIxLCAqcjI7CisgICAgUHlPYmplY3QgKnIxLCAqcjI7CiAKLQlpZighUHlBbnlTZXRfQ2hlY2sodykpIHsKLQkJaWYgKG9wID09IFB5X0VRKQotCQkJUHlfUkVUVVJOX0ZBTFNFOwotCQlpZiAob3AgPT0gUHlfTkUpCi0JCQlQeV9SRVRVUk5fVFJVRTsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImNhbiBvbmx5IGNvbXBhcmUgdG8gYSBzZXQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXN3aXRjaCAob3ApIHsKLQljYXNlIFB5X0VROgotCQlpZiAoUHlTZXRfR0VUX1NJWkUodikgIT0gUHlTZXRfR0VUX1NJWkUodykpCi0JCQlQeV9SRVRVUk5fRkFMU0U7Ci0JCWlmICh2LT5oYXNoICE9IC0xICAmJgotCQkgICAgKChQeVNldE9iamVjdCAqKXcpLT5oYXNoICE9IC0xICYmCi0JCSAgICB2LT5oYXNoICE9ICgoUHlTZXRPYmplY3QgKil3KS0+aGFzaCkKLQkJCVB5X1JFVFVSTl9GQUxTRTsKLQkJcmV0dXJuIHNldF9pc3N1YnNldCh2LCB3KTsKLQljYXNlIFB5X05FOgotCQlyMSA9IHNldF9yaWNoY29tcGFyZSh2LCB3LCBQeV9FUSk7Ci0JCWlmIChyMSA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCXIyID0gUHlCb29sX0Zyb21Mb25nKFB5T2JqZWN0X05vdChyMSkpOwotCQlQeV9ERUNSRUYocjEpOwotCQlyZXR1cm4gcjI7Ci0JY2FzZSBQeV9MRToKLQkJcmV0dXJuIHNldF9pc3N1YnNldCh2LCB3KTsKLQljYXNlIFB5X0dFOgotCQlyZXR1cm4gc2V0X2lzc3VwZXJzZXQodiwgdyk7Ci0JY2FzZSBQeV9MVDoKLQkJaWYgKFB5U2V0X0dFVF9TSVpFKHYpID49IFB5U2V0X0dFVF9TSVpFKHcpKQotCQkJUHlfUkVUVVJOX0ZBTFNFOwkJCi0JCXJldHVybiBzZXRfaXNzdWJzZXQodiwgdyk7Ci0JY2FzZSBQeV9HVDoKLQkJaWYgKFB5U2V0X0dFVF9TSVpFKHYpIDw9IFB5U2V0X0dFVF9TSVpFKHcpKQotCQkJUHlfUkVUVVJOX0ZBTFNFOwotCQlyZXR1cm4gc2V0X2lzc3VwZXJzZXQodiwgdyk7Ci0JfQotCVB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7Ci0JcmV0dXJuIFB5X05vdEltcGxlbWVudGVkOworICAgIGlmKCFQeUFueVNldF9DaGVjayh3KSkgeworICAgICAgICBpZiAob3AgPT0gUHlfRVEpCisgICAgICAgICAgICBQeV9SRVRVUk5fRkFMU0U7CisgICAgICAgIGlmIChvcCA9PSBQeV9ORSkKKyAgICAgICAgICAgIFB5X1JFVFVSTl9UUlVFOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiY2FuIG9ubHkgY29tcGFyZSB0byBhIHNldCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgc3dpdGNoIChvcCkgeworICAgIGNhc2UgUHlfRVE6CisgICAgICAgIGlmIChQeVNldF9HRVRfU0laRSh2KSAhPSBQeVNldF9HRVRfU0laRSh3KSkKKyAgICAgICAgICAgIFB5X1JFVFVSTl9GQUxTRTsKKyAgICAgICAgaWYgKHYtPmhhc2ggIT0gLTEgICYmCisgICAgICAgICAgICAoKFB5U2V0T2JqZWN0ICopdyktPmhhc2ggIT0gLTEgJiYKKyAgICAgICAgICAgIHYtPmhhc2ggIT0gKChQeVNldE9iamVjdCAqKXcpLT5oYXNoKQorICAgICAgICAgICAgUHlfUkVUVVJOX0ZBTFNFOworICAgICAgICByZXR1cm4gc2V0X2lzc3Vic2V0KHYsIHcpOworICAgIGNhc2UgUHlfTkU6CisgICAgICAgIHIxID0gc2V0X3JpY2hjb21wYXJlKHYsIHcsIFB5X0VRKTsKKyAgICAgICAgaWYgKHIxID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgcjIgPSBQeUJvb2xfRnJvbUxvbmcoUHlPYmplY3RfTm90KHIxKSk7CisgICAgICAgIFB5X0RFQ1JFRihyMSk7CisgICAgICAgIHJldHVybiByMjsKKyAgICBjYXNlIFB5X0xFOgorICAgICAgICByZXR1cm4gc2V0X2lzc3Vic2V0KHYsIHcpOworICAgIGNhc2UgUHlfR0U6CisgICAgICAgIHJldHVybiBzZXRfaXNzdXBlcnNldCh2LCB3KTsKKyAgICBjYXNlIFB5X0xUOgorICAgICAgICBpZiAoUHlTZXRfR0VUX1NJWkUodikgPj0gUHlTZXRfR0VUX1NJWkUodykpCisgICAgICAgICAgICBQeV9SRVRVUk5fRkFMU0U7CisgICAgICAgIHJldHVybiBzZXRfaXNzdWJzZXQodiwgdyk7CisgICAgY2FzZSBQeV9HVDoKKyAgICAgICAgaWYgKFB5U2V0X0dFVF9TSVpFKHYpIDw9IFB5U2V0X0dFVF9TSVpFKHcpKQorICAgICAgICAgICAgUHlfUkVUVVJOX0ZBTFNFOworICAgICAgICByZXR1cm4gc2V0X2lzc3VwZXJzZXQodiwgdyk7CisgICAgfQorICAgIFB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7CisgICAgcmV0dXJuIFB5X05vdEltcGxlbWVudGVkOwogfQogCiBzdGF0aWMgaW50CiBzZXRfbm9jbXAoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpvdGhlcikKIHsKLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiY2Fubm90IGNvbXBhcmUgc2V0cyB1c2luZyBjbXAoKSIpOwotCXJldHVybiAtMTsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiY2Fubm90IGNvbXBhcmUgc2V0cyB1c2luZyBjbXAoKSIpOworICAgIHJldHVybiAtMTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNldF9hZGQoUHlTZXRPYmplY3QgKnNvLCBQeU9iamVjdCAqa2V5KQogewotCWlmIChzZXRfYWRkX2tleShzbywga2V5KSA9PSAtMSkKLQkJcmV0dXJuIE5VTEw7Ci0JUHlfUkVUVVJOX05PTkU7CisgICAgaWYgKHNldF9hZGRfa2V5KHNvLCBrZXkpID09IC0xKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAotUHlEb2NfU1RSVkFSKGFkZF9kb2MsIAorUHlEb2NfU1RSVkFSKGFkZF9kb2MsCiAiQWRkIGFuIGVsZW1lbnQgdG8gYSBzZXQuXG5cCiBcblwKIFRoaXMgaGFzIG5vIGVmZmVjdCBpZiB0aGUgZWxlbWVudCBpcyBhbHJlYWR5IHByZXNlbnQuIik7CkBAIC0xODQ3LDM0ICsxODQ3LDM0IEBACiBzdGF0aWMgaW50CiBzZXRfY29udGFpbnMoUHlTZXRPYmplY3QgKnNvLCBQeU9iamVjdCAqa2V5KQogewotCVB5T2JqZWN0ICp0bXBrZXk7Ci0JaW50IHJ2OworICAgIFB5T2JqZWN0ICp0bXBrZXk7CisgICAgaW50IHJ2OwogCi0JcnYgPSBzZXRfY29udGFpbnNfa2V5KHNvLCBrZXkpOwotCWlmIChydiA9PSAtMSkgewotCQlpZiAoIVB5U2V0X0NoZWNrKGtleSkgfHwgIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfVHlwZUVycm9yKSkKLQkJCXJldHVybiAtMTsKLQkJUHlFcnJfQ2xlYXIoKTsKLQkJdG1wa2V5ID0gbWFrZV9uZXdfc2V0KCZQeUZyb3plblNldF9UeXBlLCBOVUxMKTsKLQkJaWYgKHRtcGtleSA9PSBOVUxMKQotCQkJcmV0dXJuIC0xOwotCQlzZXRfc3dhcF9ib2RpZXMoKFB5U2V0T2JqZWN0ICopdG1wa2V5LCAoUHlTZXRPYmplY3QgKilrZXkpOwotCQlydiA9IHNldF9jb250YWlucyhzbywgdG1wa2V5KTsKLQkJc2V0X3N3YXBfYm9kaWVzKChQeVNldE9iamVjdCAqKXRtcGtleSwgKFB5U2V0T2JqZWN0ICopa2V5KTsKLQkJUHlfREVDUkVGKHRtcGtleSk7Ci0JfQotCXJldHVybiBydjsKKyAgICBydiA9IHNldF9jb250YWluc19rZXkoc28sIGtleSk7CisgICAgaWYgKHJ2ID09IC0xKSB7CisgICAgICAgIGlmICghUHlTZXRfQ2hlY2soa2V5KSB8fCAhUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19UeXBlRXJyb3IpKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICB0bXBrZXkgPSBtYWtlX25ld19zZXQoJlB5RnJvemVuU2V0X1R5cGUsIE5VTEwpOworICAgICAgICBpZiAodG1wa2V5ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIHNldF9zd2FwX2JvZGllcygoUHlTZXRPYmplY3QgKil0bXBrZXksIChQeVNldE9iamVjdCAqKWtleSk7CisgICAgICAgIHJ2ID0gc2V0X2NvbnRhaW5zKHNvLCB0bXBrZXkpOworICAgICAgICBzZXRfc3dhcF9ib2RpZXMoKFB5U2V0T2JqZWN0ICopdG1wa2V5LCAoUHlTZXRPYmplY3QgKilrZXkpOworICAgICAgICBQeV9ERUNSRUYodG1wa2V5KTsKKyAgICB9CisgICAgcmV0dXJuIHJ2OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc2V0X2RpcmVjdF9jb250YWlucyhQeVNldE9iamVjdCAqc28sIFB5T2JqZWN0ICprZXkpCiB7Ci0JbG9uZyByZXN1bHQ7CisgICAgbG9uZyByZXN1bHQ7CiAKLQlyZXN1bHQgPSBzZXRfY29udGFpbnMoc28sIGtleSk7Ci0JaWYgKHJlc3VsdCA9PSAtMSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZyhyZXN1bHQpOworICAgIHJlc3VsdCA9IHNldF9jb250YWlucyhzbywga2V5KTsKKyAgICBpZiAocmVzdWx0ID09IC0xKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKHJlc3VsdCk7CiB9CiAKIFB5RG9jX1NUUlZBUihjb250YWluc19kb2MsICJ4Ll9fY29udGFpbnNfXyh5KSA8PT0+IHkgaW4geC4iKTsKQEAgLTE4ODIsMzAgKzE4ODIsMzAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZXRfcmVtb3ZlKFB5U2V0T2JqZWN0ICpzbywgUHlPYmplY3QgKmtleSkKIHsKLQlQeU9iamVjdCAqdG1wa2V5OwotCWludCBydjsKKyAgICBQeU9iamVjdCAqdG1wa2V5OworICAgIGludCBydjsKIAotCXJ2ID0gc2V0X2Rpc2NhcmRfa2V5KHNvLCBrZXkpOwotCWlmIChydiA9PSAtMSkgewotCQlpZiAoIVB5U2V0X0NoZWNrKGtleSkgfHwgIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfVHlwZUVycm9yKSkKLQkJCXJldHVybiBOVUxMOwotCQlQeUVycl9DbGVhcigpOwotCQl0bXBrZXkgPSBtYWtlX25ld19zZXQoJlB5RnJvemVuU2V0X1R5cGUsIE5VTEwpOwotCQlpZiAodG1wa2V5ID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQkJc2V0X3N3YXBfYm9kaWVzKChQeVNldE9iamVjdCAqKXRtcGtleSwgKFB5U2V0T2JqZWN0ICopa2V5KTsKLQkJcnYgPSBzZXRfZGlzY2FyZF9rZXkoc28sIHRtcGtleSk7Ci0JCXNldF9zd2FwX2JvZGllcygoUHlTZXRPYmplY3QgKil0bXBrZXksIChQeVNldE9iamVjdCAqKWtleSk7Ci0JCVB5X0RFQ1JFRih0bXBrZXkpOwotCQlpZiAocnYgPT0gLTEpCi0JCQlyZXR1cm4gTlVMTDsKLQl9IAorICAgIHJ2ID0gc2V0X2Rpc2NhcmRfa2V5KHNvLCBrZXkpOworICAgIGlmIChydiA9PSAtMSkgeworICAgICAgICBpZiAoIVB5U2V0X0NoZWNrKGtleSkgfHwgIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfVHlwZUVycm9yKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICB0bXBrZXkgPSBtYWtlX25ld19zZXQoJlB5RnJvemVuU2V0X1R5cGUsIE5VTEwpOworICAgICAgICBpZiAodG1wa2V5ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgc2V0X3N3YXBfYm9kaWVzKChQeVNldE9iamVjdCAqKXRtcGtleSwgKFB5U2V0T2JqZWN0ICopa2V5KTsKKyAgICAgICAgcnYgPSBzZXRfZGlzY2FyZF9rZXkoc28sIHRtcGtleSk7CisgICAgICAgIHNldF9zd2FwX2JvZGllcygoUHlTZXRPYmplY3QgKil0bXBrZXksIChQeVNldE9iamVjdCAqKWtleSk7CisgICAgICAgIFB5X0RFQ1JFRih0bXBrZXkpOworICAgICAgICBpZiAocnYgPT0gLTEpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlpZiAocnYgPT0gRElTQ0FSRF9OT1RGT1VORCkgewotCQlzZXRfa2V5X2Vycm9yKGtleSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlQeV9SRVRVUk5fTk9ORTsKKyAgICBpZiAocnYgPT0gRElTQ0FSRF9OT1RGT1VORCkgeworICAgICAgICBzZXRfa2V5X2Vycm9yKGtleSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAogUHlEb2NfU1RSVkFSKHJlbW92ZV9kb2MsCkBAIC0xOTE2LDU0ICsxOTE2LDU0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc2V0X2Rpc2NhcmQoUHlTZXRPYmplY3QgKnNvLCBQeU9iamVjdCAqa2V5KQogewotCVB5T2JqZWN0ICp0bXBrZXksICpyZXN1bHQ7Ci0JaW50IHJ2OworICAgIFB5T2JqZWN0ICp0bXBrZXksICpyZXN1bHQ7CisgICAgaW50IHJ2OwogCi0JcnYgPSBzZXRfZGlzY2FyZF9rZXkoc28sIGtleSk7Ci0JaWYgKHJ2ID09IC0xKSB7Ci0JCWlmICghUHlTZXRfQ2hlY2soa2V5KSB8fCAhUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19UeXBlRXJyb3IpKQotCQkJcmV0dXJuIE5VTEw7Ci0JCVB5RXJyX0NsZWFyKCk7Ci0JCXRtcGtleSA9IG1ha2VfbmV3X3NldCgmUHlGcm96ZW5TZXRfVHlwZSwgTlVMTCk7Ci0JCWlmICh0bXBrZXkgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQlzZXRfc3dhcF9ib2RpZXMoKFB5U2V0T2JqZWN0ICopdG1wa2V5LCAoUHlTZXRPYmplY3QgKilrZXkpOwotCQlyZXN1bHQgPSBzZXRfZGlzY2FyZChzbywgdG1wa2V5KTsKLQkJc2V0X3N3YXBfYm9kaWVzKChQeVNldE9iamVjdCAqKXRtcGtleSwgKFB5U2V0T2JqZWN0ICopa2V5KTsKLQkJUHlfREVDUkVGKHRtcGtleSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCVB5X1JFVFVSTl9OT05FOworICAgIHJ2ID0gc2V0X2Rpc2NhcmRfa2V5KHNvLCBrZXkpOworICAgIGlmIChydiA9PSAtMSkgeworICAgICAgICBpZiAoIVB5U2V0X0NoZWNrKGtleSkgfHwgIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfVHlwZUVycm9yKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICB0bXBrZXkgPSBtYWtlX25ld19zZXQoJlB5RnJvemVuU2V0X1R5cGUsIE5VTEwpOworICAgICAgICBpZiAodG1wa2V5ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgc2V0X3N3YXBfYm9kaWVzKChQeVNldE9iamVjdCAqKXRtcGtleSwgKFB5U2V0T2JqZWN0ICopa2V5KTsKKyAgICAgICAgcmVzdWx0ID0gc2V0X2Rpc2NhcmQoc28sIHRtcGtleSk7CisgICAgICAgIHNldF9zd2FwX2JvZGllcygoUHlTZXRPYmplY3QgKil0bXBrZXksIChQeVNldE9iamVjdCAqKWtleSk7CisgICAgICAgIFB5X0RFQ1JFRih0bXBrZXkpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAogUHlEb2NfU1RSVkFSKGRpc2NhcmRfZG9jLAogIlJlbW92ZSBhbiBlbGVtZW50IGZyb20gYSBzZXQgaWYgaXQgaXMgYSBtZW1iZXIuXG5cCiBcblwKLUlmIHRoZSBlbGVtZW50IGlzIG5vdCBhIG1lbWJlciwgZG8gbm90aGluZy4iKTsgCitJZiB0aGUgZWxlbWVudCBpcyBub3QgYSBtZW1iZXIsIGRvIG5vdGhpbmcuIik7CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZXRfcmVkdWNlKFB5U2V0T2JqZWN0ICpzbykKIHsKLQlQeU9iamVjdCAqa2V5cz1OVUxMLCAqYXJncz1OVUxMLCAqcmVzdWx0PU5VTEwsICpkaWN0PU5VTEw7CisgICAgUHlPYmplY3QgKmtleXM9TlVMTCwgKmFyZ3M9TlVMTCwgKnJlc3VsdD1OVUxMLCAqZGljdD1OVUxMOwogCi0Ja2V5cyA9IFB5U2VxdWVuY2VfTGlzdCgoUHlPYmplY3QgKilzbyk7Ci0JaWYgKGtleXMgPT0gTlVMTCkKLQkJZ290byBkb25lOwotCWFyZ3MgPSBQeVR1cGxlX1BhY2soMSwga2V5cyk7Ci0JaWYgKGFyZ3MgPT0gTlVMTCkKLQkJZ290byBkb25lOwotCWRpY3QgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKChQeU9iamVjdCAqKXNvLCAiX19kaWN0X18iKTsKLQlpZiAoZGljdCA9PSBOVUxMKSB7Ci0JCVB5RXJyX0NsZWFyKCk7Ci0JCWRpY3QgPSBQeV9Ob25lOwotCQlQeV9JTkNSRUYoZGljdCk7Ci0JfQotCXJlc3VsdCA9IFB5VHVwbGVfUGFjaygzLCBQeV9UWVBFKHNvKSwgYXJncywgZGljdCk7CisgICAga2V5cyA9IFB5U2VxdWVuY2VfTGlzdCgoUHlPYmplY3QgKilzbyk7CisgICAgaWYgKGtleXMgPT0gTlVMTCkKKyAgICAgICAgZ290byBkb25lOworICAgIGFyZ3MgPSBQeVR1cGxlX1BhY2soMSwga2V5cyk7CisgICAgaWYgKGFyZ3MgPT0gTlVMTCkKKyAgICAgICAgZ290byBkb25lOworICAgIGRpY3QgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKChQeU9iamVjdCAqKXNvLCAiX19kaWN0X18iKTsKKyAgICBpZiAoZGljdCA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIGRpY3QgPSBQeV9Ob25lOworICAgICAgICBQeV9JTkNSRUYoZGljdCk7CisgICAgfQorICAgIHJlc3VsdCA9IFB5VHVwbGVfUGFjaygzLCBQeV9UWVBFKHNvKSwgYXJncywgZGljdCk7CiBkb25lOgotCVB5X1hERUNSRUYoYXJncyk7Ci0JUHlfWERFQ1JFRihrZXlzKTsKLQlQeV9YREVDUkVGKGRpY3QpOwotCXJldHVybiByZXN1bHQ7CisgICAgUHlfWERFQ1JFRihhcmdzKTsKKyAgICBQeV9YREVDUkVGKGtleXMpOworICAgIFB5X1hERUNSRUYoZGljdCk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogUHlEb2NfU1RSVkFSKHJlZHVjZV9kb2MsICJSZXR1cm4gc3RhdGUgaW5mb3JtYXRpb24gZm9yIHBpY2tsaW5nLiIpOwpAQCAtMTk3MSw0MiArMTk3MSw0MiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNldF9zaXplb2YoUHlTZXRPYmplY3QgKnNvKQogewotCVB5X3NzaXplX3QgcmVzOworICAgIFB5X3NzaXplX3QgcmVzOwogCi0JcmVzID0gc2l6ZW9mKFB5U2V0T2JqZWN0KTsKLQlpZiAoc28tPnRhYmxlICE9IHNvLT5zbWFsbHRhYmxlKQotCQlyZXMgPSByZXMgKyAoc28tPm1hc2sgKyAxKSAqIHNpemVvZihzZXRlbnRyeSk7Ci0JcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KHJlcyk7CisgICAgcmVzID0gc2l6ZW9mKFB5U2V0T2JqZWN0KTsKKyAgICBpZiAoc28tPnRhYmxlICE9IHNvLT5zbWFsbHRhYmxlKQorICAgICAgICByZXMgPSByZXMgKyAoc28tPm1hc2sgKyAxKSAqIHNpemVvZihzZXRlbnRyeSk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KHJlcyk7CiB9CiAKIFB5RG9jX1NUUlZBUihzaXplb2ZfZG9jLCAiUy5fX3NpemVvZl9fKCkgLT4gc2l6ZSBvZiBTIGluIG1lbW9yeSwgaW4gYnl0ZXMiKTsKIHN0YXRpYyBpbnQKIHNldF9pbml0KFB5U2V0T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JUHlPYmplY3QgKml0ZXJhYmxlID0gTlVMTDsKKyAgICBQeU9iamVjdCAqaXRlcmFibGUgPSBOVUxMOwogCi0JaWYgKCFQeUFueVNldF9DaGVjayhzZWxmKSkKLQkJcmV0dXJuIC0xOwotCWlmIChQeVNldF9DaGVjayhzZWxmKSAmJiAhX1B5QXJnX05vS2V5d29yZHMoInNldCgpIiwga3dkcykpCi0JCXJldHVybiAtMTsKLQlpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsIFB5X1RZUEUoc2VsZiktPnRwX25hbWUsIDAsIDEsICZpdGVyYWJsZSkpCi0JCXJldHVybiAtMTsKLQlzZXRfY2xlYXJfaW50ZXJuYWwoc2VsZik7Ci0Jc2VsZi0+aGFzaCA9IC0xOwotCWlmIChpdGVyYWJsZSA9PSBOVUxMKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gc2V0X3VwZGF0ZV9pbnRlcm5hbChzZWxmLCBpdGVyYWJsZSk7CisgICAgaWYgKCFQeUFueVNldF9DaGVjayhzZWxmKSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmIChQeVNldF9DaGVjayhzZWxmKSAmJiAhX1B5QXJnX05vS2V5d29yZHMoInNldCgpIiwga3dkcykpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsIFB5X1RZUEUoc2VsZiktPnRwX25hbWUsIDAsIDEsICZpdGVyYWJsZSkpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBzZXRfY2xlYXJfaW50ZXJuYWwoc2VsZik7CisgICAgc2VsZi0+aGFzaCA9IC0xOworICAgIGlmIChpdGVyYWJsZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gc2V0X3VwZGF0ZV9pbnRlcm5hbChzZWxmLCBpdGVyYWJsZSk7CiB9CiAKIHN0YXRpYyBQeVNlcXVlbmNlTWV0aG9kcyBzZXRfYXNfc2VxdWVuY2UgPSB7Ci0Jc2V0X2xlbiwJCQkvKiBzcV9sZW5ndGggKi8KLQkwLAkJCQkvKiBzcV9jb25jYXQgKi8KLQkwLAkJCQkvKiBzcV9yZXBlYXQgKi8KLQkwLAkJCQkvKiBzcV9pdGVtICovCi0JMCwJCQkJLyogc3Ffc2xpY2UgKi8KLQkwLAkJCQkvKiBzcV9hc3NfaXRlbSAqLwotCTAsCQkJCS8qIHNxX2Fzc19zbGljZSAqLwotCShvYmpvYmpwcm9jKXNldF9jb250YWlucywJLyogc3FfY29udGFpbnMgKi8KKyAgICBzZXRfbGVuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzcV9sZW5ndGggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzcV9jb25jYXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzcV9yZXBlYXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzcV9pdGVtICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3Ffc2xpY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzcV9hc3NfaXRlbSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNxX2Fzc19zbGljZSAqLworICAgIChvYmpvYmpwcm9jKXNldF9jb250YWlucywgICAgICAgICAgIC8qIHNxX2NvbnRhaW5zICovCiB9OwogCiAvKiBzZXQgb2JqZWN0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMjAxOSw4OCArMjAxOSw4OCBAQAogI2VuZGlmCiAKIHN0YXRpYyBQeU1ldGhvZERlZiBzZXRfbWV0aG9kc1tdID0gewotCXsiYWRkIiwJCShQeUNGdW5jdGlvbilzZXRfYWRkLAkJTUVUSF9PLAotCSBhZGRfZG9jfSwKLQl7ImNsZWFyIiwJKFB5Q0Z1bmN0aW9uKXNldF9jbGVhciwJCU1FVEhfTk9BUkdTLAotCSBjbGVhcl9kb2N9LAotCXsiX19jb250YWluc19fIiwoUHlDRnVuY3Rpb24pc2V0X2RpcmVjdF9jb250YWlucywJTUVUSF9PIHwgTUVUSF9DT0VYSVNULAotCSBjb250YWluc19kb2N9LAotCXsiY29weSIsCShQeUNGdW5jdGlvbilzZXRfY29weSwJCU1FVEhfTk9BUkdTLAotCSBjb3B5X2RvY30sCi0JeyJkaXNjYXJkIiwJKFB5Q0Z1bmN0aW9uKXNldF9kaXNjYXJkLAlNRVRIX08sCi0JIGRpc2NhcmRfZG9jfSwKLQl7ImRpZmZlcmVuY2UiLAkoUHlDRnVuY3Rpb24pc2V0X2RpZmZlcmVuY2VfbXVsdGksCU1FVEhfVkFSQVJHUywKLQkgZGlmZmVyZW5jZV9kb2N9LAotCXsiZGlmZmVyZW5jZV91cGRhdGUiLAkoUHlDRnVuY3Rpb24pc2V0X2RpZmZlcmVuY2VfdXBkYXRlLAlNRVRIX1ZBUkFSR1MsCi0JIGRpZmZlcmVuY2VfdXBkYXRlX2RvY30sCi0JeyJpbnRlcnNlY3Rpb24iLChQeUNGdW5jdGlvbilzZXRfaW50ZXJzZWN0aW9uX211bHRpLAlNRVRIX1ZBUkFSR1MsCi0JIGludGVyc2VjdGlvbl9kb2N9LAotCXsiaW50ZXJzZWN0aW9uX3VwZGF0ZSIsKFB5Q0Z1bmN0aW9uKXNldF9pbnRlcnNlY3Rpb25fdXBkYXRlX211bHRpLAlNRVRIX1ZBUkFSR1MsCi0JIGludGVyc2VjdGlvbl91cGRhdGVfZG9jfSwKLQl7ImlzZGlzam9pbnQiLAkoUHlDRnVuY3Rpb24pc2V0X2lzZGlzam9pbnQsCU1FVEhfTywKLQkgaXNkaXNqb2ludF9kb2N9LAotCXsiaXNzdWJzZXQiLAkoUHlDRnVuY3Rpb24pc2V0X2lzc3Vic2V0LAlNRVRIX08sCi0JIGlzc3Vic2V0X2RvY30sCi0JeyJpc3N1cGVyc2V0IiwJKFB5Q0Z1bmN0aW9uKXNldF9pc3N1cGVyc2V0LAlNRVRIX08sCi0JIGlzc3VwZXJzZXRfZG9jfSwKLQl7InBvcCIsCQkoUHlDRnVuY3Rpb24pc2V0X3BvcCwJCU1FVEhfTk9BUkdTLAotCSBwb3BfZG9jfSwKLQl7Il9fcmVkdWNlX18iLAkoUHlDRnVuY3Rpb24pc2V0X3JlZHVjZSwJTUVUSF9OT0FSR1MsCi0JIHJlZHVjZV9kb2N9LAotCXsicmVtb3ZlIiwJKFB5Q0Z1bmN0aW9uKXNldF9yZW1vdmUsCU1FVEhfTywKLQkgcmVtb3ZlX2RvY30sCi0JeyJfX3NpemVvZl9fIiwJKFB5Q0Z1bmN0aW9uKXNldF9zaXplb2YsCU1FVEhfTk9BUkdTLAotCSBzaXplb2ZfZG9jfSwKLQl7InN5bW1ldHJpY19kaWZmZXJlbmNlIiwoUHlDRnVuY3Rpb24pc2V0X3N5bW1ldHJpY19kaWZmZXJlbmNlLAlNRVRIX08sCi0JIHN5bW1ldHJpY19kaWZmZXJlbmNlX2RvY30sCi0JeyJzeW1tZXRyaWNfZGlmZmVyZW5jZV91cGRhdGUiLChQeUNGdW5jdGlvbilzZXRfc3ltbWV0cmljX2RpZmZlcmVuY2VfdXBkYXRlLAlNRVRIX08sCi0JIHN5bW1ldHJpY19kaWZmZXJlbmNlX3VwZGF0ZV9kb2N9LAorICAgIHsiYWRkIiwgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXNldF9hZGQsICAgICAgICAgICBNRVRIX08sCisgICAgIGFkZF9kb2N9LAorICAgIHsiY2xlYXIiLCAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXNldF9jbGVhciwgICAgICAgICBNRVRIX05PQVJHUywKKyAgICAgY2xlYXJfZG9jfSwKKyAgICB7Il9fY29udGFpbnNfXyIsKFB5Q0Z1bmN0aW9uKXNldF9kaXJlY3RfY29udGFpbnMsICAgICAgICAgICBNRVRIX08gfCBNRVRIX0NPRVhJU1QsCisgICAgIGNvbnRhaW5zX2RvY30sCisgICAgeyJjb3B5IiwgICAgICAgICAgICAoUHlDRnVuY3Rpb24pc2V0X2NvcHksICAgICAgICAgIE1FVEhfTk9BUkdTLAorICAgICBjb3B5X2RvY30sCisgICAgeyJkaXNjYXJkIiwgICAgICAgICAoUHlDRnVuY3Rpb24pc2V0X2Rpc2NhcmQsICAgICAgIE1FVEhfTywKKyAgICAgZGlzY2FyZF9kb2N9LAorICAgIHsiZGlmZmVyZW5jZSIsICAgICAgKFB5Q0Z1bmN0aW9uKXNldF9kaWZmZXJlbmNlX211bHRpLCAgICAgIE1FVEhfVkFSQVJHUywKKyAgICAgZGlmZmVyZW5jZV9kb2N9LAorICAgIHsiZGlmZmVyZW5jZV91cGRhdGUiLCAgICAgICAoUHlDRnVuY3Rpb24pc2V0X2RpZmZlcmVuY2VfdXBkYXRlLCAgICAgTUVUSF9WQVJBUkdTLAorICAgICBkaWZmZXJlbmNlX3VwZGF0ZV9kb2N9LAorICAgIHsiaW50ZXJzZWN0aW9uIiwoUHlDRnVuY3Rpb24pc2V0X2ludGVyc2VjdGlvbl9tdWx0aSwgICAgICAgIE1FVEhfVkFSQVJHUywKKyAgICAgaW50ZXJzZWN0aW9uX2RvY30sCisgICAgeyJpbnRlcnNlY3Rpb25fdXBkYXRlIiwoUHlDRnVuY3Rpb24pc2V0X2ludGVyc2VjdGlvbl91cGRhdGVfbXVsdGksICAgICAgICAgIE1FVEhfVkFSQVJHUywKKyAgICAgaW50ZXJzZWN0aW9uX3VwZGF0ZV9kb2N9LAorICAgIHsiaXNkaXNqb2ludCIsICAgICAgKFB5Q0Z1bmN0aW9uKXNldF9pc2Rpc2pvaW50LCAgICBNRVRIX08sCisgICAgIGlzZGlzam9pbnRfZG9jfSwKKyAgICB7Imlzc3Vic2V0IiwgICAgICAgIChQeUNGdW5jdGlvbilzZXRfaXNzdWJzZXQsICAgICAgTUVUSF9PLAorICAgICBpc3N1YnNldF9kb2N9LAorICAgIHsiaXNzdXBlcnNldCIsICAgICAgKFB5Q0Z1bmN0aW9uKXNldF9pc3N1cGVyc2V0LCAgICBNRVRIX08sCisgICAgIGlzc3VwZXJzZXRfZG9jfSwKKyAgICB7InBvcCIsICAgICAgICAgICAgIChQeUNGdW5jdGlvbilzZXRfcG9wLCAgICAgICAgICAgTUVUSF9OT0FSR1MsCisgICAgIHBvcF9kb2N9LAorICAgIHsiX19yZWR1Y2VfXyIsICAgICAgKFB5Q0Z1bmN0aW9uKXNldF9yZWR1Y2UsICAgICAgICBNRVRIX05PQVJHUywKKyAgICAgcmVkdWNlX2RvY30sCisgICAgeyJyZW1vdmUiLCAgICAgICAgICAoUHlDRnVuY3Rpb24pc2V0X3JlbW92ZSwgICAgICAgIE1FVEhfTywKKyAgICAgcmVtb3ZlX2RvY30sCisgICAgeyJfX3NpemVvZl9fIiwgICAgICAoUHlDRnVuY3Rpb24pc2V0X3NpemVvZiwgICAgICAgIE1FVEhfTk9BUkdTLAorICAgICBzaXplb2ZfZG9jfSwKKyAgICB7InN5bW1ldHJpY19kaWZmZXJlbmNlIiwoUHlDRnVuY3Rpb24pc2V0X3N5bW1ldHJpY19kaWZmZXJlbmNlLCAgICAgIE1FVEhfTywKKyAgICAgc3ltbWV0cmljX2RpZmZlcmVuY2VfZG9jfSwKKyAgICB7InN5bW1ldHJpY19kaWZmZXJlbmNlX3VwZGF0ZSIsKFB5Q0Z1bmN0aW9uKXNldF9zeW1tZXRyaWNfZGlmZmVyZW5jZV91cGRhdGUsICAgICAgICBNRVRIX08sCisgICAgIHN5bW1ldHJpY19kaWZmZXJlbmNlX3VwZGF0ZV9kb2N9LAogI2lmZGVmIFB5X0RFQlVHCi0JeyJ0ZXN0X2NfYXBpIiwJKFB5Q0Z1bmN0aW9uKXRlc3RfY19hcGksCU1FVEhfTk9BUkdTLAotCSB0ZXN0X2NfYXBpX2RvY30sCisgICAgeyJ0ZXN0X2NfYXBpIiwgICAgICAoUHlDRnVuY3Rpb24pdGVzdF9jX2FwaSwgICAgICAgIE1FVEhfTk9BUkdTLAorICAgICB0ZXN0X2NfYXBpX2RvY30sCiAjZW5kaWYKLQl7InVuaW9uIiwJKFB5Q0Z1bmN0aW9uKXNldF91bmlvbiwJCU1FVEhfVkFSQVJHUywKLQkgdW5pb25fZG9jfSwKLQl7InVwZGF0ZSIsCShQeUNGdW5jdGlvbilzZXRfdXBkYXRlLAlNRVRIX1ZBUkFSR1MsCi0JIHVwZGF0ZV9kb2N9LAotCXtOVUxMLAkJTlVMTH0JLyogc2VudGluZWwgKi8KKyAgICB7InVuaW9uIiwgICAgICAgICAgIChQeUNGdW5jdGlvbilzZXRfdW5pb24sICAgICAgICAgTUVUSF9WQVJBUkdTLAorICAgICB1bmlvbl9kb2N9LAorICAgIHsidXBkYXRlIiwgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXNldF91cGRhdGUsICAgICAgICBNRVRIX1ZBUkFSR1MsCisgICAgIHVwZGF0ZV9kb2N9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0gICAvKiBzZW50aW5lbCAqLwogfTsKIAogc3RhdGljIFB5TnVtYmVyTWV0aG9kcyBzZXRfYXNfbnVtYmVyID0gewotCTAsCQkJCS8qbmJfYWRkKi8KLQkoYmluYXJ5ZnVuYylzZXRfc3ViLAkJLypuYl9zdWJ0cmFjdCovCi0JMCwJCQkJLypuYl9tdWx0aXBseSovCi0JMCwJCQkJLypuYl9kaXZpZGUqLwotCTAsCQkJCS8qbmJfcmVtYWluZGVyKi8KLQkwLAkJCQkvKm5iX2Rpdm1vZCovCi0JMCwJCQkJLypuYl9wb3dlciovCi0JMCwJCQkJLypuYl9uZWdhdGl2ZSovCi0JMCwJCQkJLypuYl9wb3NpdGl2ZSovCi0JMCwJCQkJLypuYl9hYnNvbHV0ZSovCi0JMCwJCQkJLypuYl9ub256ZXJvKi8KLQkwLAkJCQkvKm5iX2ludmVydCovCi0JMCwJCQkJLypuYl9sc2hpZnQqLwotCTAsCQkJCS8qbmJfcnNoaWZ0Ki8KLQkoYmluYXJ5ZnVuYylzZXRfYW5kLAkJLypuYl9hbmQqLwotCShiaW5hcnlmdW5jKXNldF94b3IsCQkvKm5iX3hvciovCi0JKGJpbmFyeWZ1bmMpc2V0X29yLAkJLypuYl9vciovCi0JMCwJCQkJLypuYl9jb2VyY2UqLwotCTAsCQkJCS8qbmJfaW50Ki8KLQkwLAkJCQkvKm5iX2xvbmcqLwotCTAsCQkJCS8qbmJfZmxvYXQqLwotCTAsCQkJCS8qbmJfb2N0Ki8KLQkwLCAJCQkJLypuYl9oZXgqLwotCTAsCQkJCS8qbmJfaW5wbGFjZV9hZGQqLwotCShiaW5hcnlmdW5jKXNldF9pc3ViLAkJLypuYl9pbnBsYWNlX3N1YnRyYWN0Ki8KLQkwLAkJCQkvKm5iX2lucGxhY2VfbXVsdGlwbHkqLwotCTAsCQkJCS8qbmJfaW5wbGFjZV9kaXZpZGUqLwotCTAsCQkJCS8qbmJfaW5wbGFjZV9yZW1haW5kZXIqLwotCTAsCQkJCS8qbmJfaW5wbGFjZV9wb3dlciovCi0JMCwJCQkJLypuYl9pbnBsYWNlX2xzaGlmdCovCi0JMCwJCQkJLypuYl9pbnBsYWNlX3JzaGlmdCovCi0JKGJpbmFyeWZ1bmMpc2V0X2lhbmQsCQkvKm5iX2lucGxhY2VfYW5kKi8KLQkoYmluYXJ5ZnVuYylzZXRfaXhvciwJCS8qbmJfaW5wbGFjZV94b3IqLwotCShiaW5hcnlmdW5jKXNldF9pb3IsCQkvKm5iX2lucGxhY2Vfb3IqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbmJfYWRkKi8KKyAgICAoYmluYXJ5ZnVuYylzZXRfc3ViLCAgICAgICAgICAgICAgICAvKm5iX3N1YnRyYWN0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm5iX211bHRpcGx5Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm5iX2RpdmlkZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypuYl9yZW1haW5kZXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbmJfZGl2bW9kKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm5iX3Bvd2VyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm5iX25lZ2F0aXZlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm5iX3Bvc2l0aXZlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm5iX2Fic29sdXRlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm5iX25vbnplcm8qLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbmJfaW52ZXJ0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm5iX2xzaGlmdCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypuYl9yc2hpZnQqLworICAgIChiaW5hcnlmdW5jKXNldF9hbmQsICAgICAgICAgICAgICAgIC8qbmJfYW5kKi8KKyAgICAoYmluYXJ5ZnVuYylzZXRfeG9yLCAgICAgICAgICAgICAgICAvKm5iX3hvciovCisgICAgKGJpbmFyeWZ1bmMpc2V0X29yLCAgICAgICAgICAgICAgICAgLypuYl9vciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypuYl9jb2VyY2UqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbmJfaW50Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm5iX2xvbmcqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbmJfZmxvYXQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbmJfb2N0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm5iX2hleCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypuYl9pbnBsYWNlX2FkZCovCisgICAgKGJpbmFyeWZ1bmMpc2V0X2lzdWIsICAgICAgICAgICAgICAgLypuYl9pbnBsYWNlX3N1YnRyYWN0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm5iX2lucGxhY2VfbXVsdGlwbHkqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbmJfaW5wbGFjZV9kaXZpZGUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbmJfaW5wbGFjZV9yZW1haW5kZXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbmJfaW5wbGFjZV9wb3dlciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypuYl9pbnBsYWNlX2xzaGlmdCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypuYl9pbnBsYWNlX3JzaGlmdCovCisgICAgKGJpbmFyeWZ1bmMpc2V0X2lhbmQsICAgICAgICAgICAgICAgLypuYl9pbnBsYWNlX2FuZCovCisgICAgKGJpbmFyeWZ1bmMpc2V0X2l4b3IsICAgICAgICAgICAgICAgLypuYl9pbnBsYWNlX3hvciovCisgICAgKGJpbmFyeWZ1bmMpc2V0X2lvciwgICAgICAgICAgICAgICAgLypuYl9pbnBsYWNlX29yKi8KIH07CiAKIFB5RG9jX1NUUlZBUihzZXRfZG9jLApAQCAtMjExMCw5NiArMjExMCw5NiBAQAogQnVpbGQgYW4gdW5vcmRlcmVkIGNvbGxlY3Rpb24gb2YgdW5pcXVlIGVsZW1lbnRzLiIpOwogCiBQeVR5cGVPYmplY3QgUHlTZXRfVHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQotCSJzZXQiLAkJCQkvKiB0cF9uYW1lICovCi0Jc2l6ZW9mKFB5U2V0T2JqZWN0KSwJCS8qIHRwX2Jhc2ljc2l6ZSAqLwotCTAsCQkJCS8qIHRwX2l0ZW1zaXplICovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKXNldF9kZWFsbG9jLAkvKiB0cF9kZWFsbG9jICovCi0JKHByaW50ZnVuYylzZXRfdHBfcHJpbnQsCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCS8qIHRwX3NldGF0dHIgKi8KLQlzZXRfbm9jbXAsCQkJLyogdHBfY29tcGFyZSAqLwotCShyZXByZnVuYylzZXRfcmVwciwJCS8qIHRwX3JlcHIgKi8KLQkmc2V0X2FzX251bWJlciwJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkmc2V0X2FzX3NlcXVlbmNlLAkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JKGhhc2hmdW5jKVB5T2JqZWN0X0hhc2hOb3RJbXBsZW1lbnRlZCwJLyogdHBfaGFzaCAqLwotCTAsCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkvKiB0cF9zdHIgKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQyB8IFB5X1RQRkxBR1NfQ0hFQ0tUWVBFUyB8Ci0JCVB5X1RQRkxBR1NfQkFTRVRZUEUsCS8qIHRwX2ZsYWdzICovCi0Jc2V0X2RvYywJCQkvKiB0cF9kb2MgKi8KLQkodHJhdmVyc2Vwcm9jKXNldF90cmF2ZXJzZSwJLyogdHBfdHJhdmVyc2UgKi8KLQkoaW5xdWlyeSlzZXRfY2xlYXJfaW50ZXJuYWwsCS8qIHRwX2NsZWFyICovCi0JKHJpY2hjbXBmdW5jKXNldF9yaWNoY29tcGFyZSwJLyogdHBfcmljaGNvbXBhcmUgKi8KLQlvZmZzZXRvZihQeVNldE9iamVjdCwgd2Vha3JlZmxpc3QpLAkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCShnZXRpdGVyZnVuYylzZXRfaXRlciwJLyogdHBfaXRlciAqLwotCTAsCQkJCS8qIHRwX2l0ZXJuZXh0ICovCi0Jc2V0X21ldGhvZHMsCQkJLyogdHBfbWV0aG9kcyAqLwotCTAsCQkJCS8qIHRwX21lbWJlcnMgKi8KLQkwLAkJCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQkoaW5pdHByb2Mpc2V0X2luaXQsCQkvKiB0cF9pbml0ICovCi0JUHlUeXBlX0dlbmVyaWNBbGxvYywJCS8qIHRwX2FsbG9jICovCi0Jc2V0X25ldywJCQkvKiB0cF9uZXcgKi8KLQlQeU9iamVjdF9HQ19EZWwsCQkvKiB0cF9mcmVlICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKKyAgICAic2V0IiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCisgICAgc2l6ZW9mKFB5U2V0T2JqZWN0KSwgICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3Ipc2V0X2RlYWxsb2MsICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIChwcmludGZ1bmMpc2V0X3RwX3ByaW50LCAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICBzZXRfbm9jbXAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgKHJlcHJmdW5jKXNldF9yZXByLCAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgICZzZXRfYXNfbnVtYmVyLCAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgICZzZXRfYXNfc2VxdWVuY2UsICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIChoYXNoZnVuYylQeU9iamVjdF9IYXNoTm90SW1wbGVtZW50ZWQsICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDIHwgUHlfVFBGTEFHU19DSEVDS1RZUEVTIHwKKyAgICAgICAgUHlfVFBGTEFHU19CQVNFVFlQRSwgICAgICAgICAgICAvKiB0cF9mbGFncyAqLworICAgIHNldF9kb2MsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2Mpc2V0X3RyYXZlcnNlLCAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgKGlucXVpcnkpc2V0X2NsZWFyX2ludGVybmFsLCAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAocmljaGNtcGZ1bmMpc2V0X3JpY2hjb21wYXJlLCAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIG9mZnNldG9mKFB5U2V0T2JqZWN0LCB3ZWFrcmVmbGlzdCksICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAoZ2V0aXRlcmZ1bmMpc2V0X2l0ZXIsICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgc2V0X21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAoaW5pdHByb2Mpc2V0X2luaXQsICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgUHlUeXBlX0dlbmVyaWNBbGxvYywgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBzZXRfbmV3LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICBQeU9iamVjdF9HQ19EZWwsICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCiB9OwogCiAvKiBmcm96ZW5zZXQgb2JqZWN0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAKIHN0YXRpYyBQeU1ldGhvZERlZiBmcm96ZW5zZXRfbWV0aG9kc1tdID0gewotCXsiX19jb250YWluc19fIiwoUHlDRnVuY3Rpb24pc2V0X2RpcmVjdF9jb250YWlucywJTUVUSF9PIHwgTUVUSF9DT0VYSVNULAotCSBjb250YWluc19kb2N9LAotCXsiY29weSIsCShQeUNGdW5jdGlvbilmcm96ZW5zZXRfY29weSwJTUVUSF9OT0FSR1MsCi0JIGNvcHlfZG9jfSwKLQl7ImRpZmZlcmVuY2UiLAkoUHlDRnVuY3Rpb24pc2V0X2RpZmZlcmVuY2VfbXVsdGksCU1FVEhfVkFSQVJHUywKLQkgZGlmZmVyZW5jZV9kb2N9LAotCXsiaW50ZXJzZWN0aW9uIiwoUHlDRnVuY3Rpb24pc2V0X2ludGVyc2VjdGlvbl9tdWx0aSwJTUVUSF9WQVJBUkdTLAotCSBpbnRlcnNlY3Rpb25fZG9jfSwKLQl7ImlzZGlzam9pbnQiLAkoUHlDRnVuY3Rpb24pc2V0X2lzZGlzam9pbnQsCU1FVEhfTywKLQkgaXNkaXNqb2ludF9kb2N9LAotCXsiaXNzdWJzZXQiLAkoUHlDRnVuY3Rpb24pc2V0X2lzc3Vic2V0LAlNRVRIX08sCi0JIGlzc3Vic2V0X2RvY30sCi0JeyJpc3N1cGVyc2V0IiwJKFB5Q0Z1bmN0aW9uKXNldF9pc3N1cGVyc2V0LAlNRVRIX08sCi0JIGlzc3VwZXJzZXRfZG9jfSwKLQl7Il9fcmVkdWNlX18iLAkoUHlDRnVuY3Rpb24pc2V0X3JlZHVjZSwJTUVUSF9OT0FSR1MsCi0JIHJlZHVjZV9kb2N9LAotCXsiX19zaXplb2ZfXyIsCShQeUNGdW5jdGlvbilzZXRfc2l6ZW9mLAlNRVRIX05PQVJHUywKLQkgc2l6ZW9mX2RvY30sCi0JeyJzeW1tZXRyaWNfZGlmZmVyZW5jZSIsKFB5Q0Z1bmN0aW9uKXNldF9zeW1tZXRyaWNfZGlmZmVyZW5jZSwJTUVUSF9PLAotCSBzeW1tZXRyaWNfZGlmZmVyZW5jZV9kb2N9LAotCXsidW5pb24iLAkoUHlDRnVuY3Rpb24pc2V0X3VuaW9uLAkJTUVUSF9WQVJBUkdTLAotCSB1bmlvbl9kb2N9LAotCXtOVUxMLAkJTlVMTH0JLyogc2VudGluZWwgKi8KKyAgICB7Il9fY29udGFpbnNfXyIsKFB5Q0Z1bmN0aW9uKXNldF9kaXJlY3RfY29udGFpbnMsICAgICAgICAgICBNRVRIX08gfCBNRVRIX0NPRVhJU1QsCisgICAgIGNvbnRhaW5zX2RvY30sCisgICAgeyJjb3B5IiwgICAgICAgICAgICAoUHlDRnVuY3Rpb24pZnJvemVuc2V0X2NvcHksICAgIE1FVEhfTk9BUkdTLAorICAgICBjb3B5X2RvY30sCisgICAgeyJkaWZmZXJlbmNlIiwgICAgICAoUHlDRnVuY3Rpb24pc2V0X2RpZmZlcmVuY2VfbXVsdGksICAgICAgTUVUSF9WQVJBUkdTLAorICAgICBkaWZmZXJlbmNlX2RvY30sCisgICAgeyJpbnRlcnNlY3Rpb24iLChQeUNGdW5jdGlvbilzZXRfaW50ZXJzZWN0aW9uX211bHRpLCAgICAgICAgTUVUSF9WQVJBUkdTLAorICAgICBpbnRlcnNlY3Rpb25fZG9jfSwKKyAgICB7ImlzZGlzam9pbnQiLCAgICAgIChQeUNGdW5jdGlvbilzZXRfaXNkaXNqb2ludCwgICAgTUVUSF9PLAorICAgICBpc2Rpc2pvaW50X2RvY30sCisgICAgeyJpc3N1YnNldCIsICAgICAgICAoUHlDRnVuY3Rpb24pc2V0X2lzc3Vic2V0LCAgICAgIE1FVEhfTywKKyAgICAgaXNzdWJzZXRfZG9jfSwKKyAgICB7Imlzc3VwZXJzZXQiLCAgICAgIChQeUNGdW5jdGlvbilzZXRfaXNzdXBlcnNldCwgICAgTUVUSF9PLAorICAgICBpc3N1cGVyc2V0X2RvY30sCisgICAgeyJfX3JlZHVjZV9fIiwgICAgICAoUHlDRnVuY3Rpb24pc2V0X3JlZHVjZSwgICAgICAgIE1FVEhfTk9BUkdTLAorICAgICByZWR1Y2VfZG9jfSwKKyAgICB7Il9fc2l6ZW9mX18iLCAgICAgIChQeUNGdW5jdGlvbilzZXRfc2l6ZW9mLCAgICAgICAgTUVUSF9OT0FSR1MsCisgICAgIHNpemVvZl9kb2N9LAorICAgIHsic3ltbWV0cmljX2RpZmZlcmVuY2UiLChQeUNGdW5jdGlvbilzZXRfc3ltbWV0cmljX2RpZmZlcmVuY2UsICAgICAgTUVUSF9PLAorICAgICBzeW1tZXRyaWNfZGlmZmVyZW5jZV9kb2N9LAorICAgIHsidW5pb24iLCAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXNldF91bmlvbiwgICAgICAgICBNRVRIX1ZBUkFSR1MsCisgICAgIHVuaW9uX2RvY30sCisgICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSAgIC8qIHNlbnRpbmVsICovCiB9OwogCiBzdGF0aWMgUHlOdW1iZXJNZXRob2RzIGZyb3plbnNldF9hc19udW1iZXIgPSB7Ci0JMCwJCQkJLypuYl9hZGQqLwotCShiaW5hcnlmdW5jKXNldF9zdWIsCQkvKm5iX3N1YnRyYWN0Ki8KLQkwLAkJCQkvKm5iX211bHRpcGx5Ki8KLQkwLAkJCQkvKm5iX2RpdmlkZSovCi0JMCwJCQkJLypuYl9yZW1haW5kZXIqLwotCTAsCQkJCS8qbmJfZGl2bW9kKi8KLQkwLAkJCQkvKm5iX3Bvd2VyKi8KLQkwLAkJCQkvKm5iX25lZ2F0aXZlKi8KLQkwLAkJCQkvKm5iX3Bvc2l0aXZlKi8KLQkwLAkJCQkvKm5iX2Fic29sdXRlKi8KLQkwLAkJCQkvKm5iX25vbnplcm8qLwotCTAsCQkJCS8qbmJfaW52ZXJ0Ki8KLQkwLAkJCQkvKm5iX2xzaGlmdCovCi0JMCwJCQkJLypuYl9yc2hpZnQqLwotCShiaW5hcnlmdW5jKXNldF9hbmQsCQkvKm5iX2FuZCovCi0JKGJpbmFyeWZ1bmMpc2V0X3hvciwJCS8qbmJfeG9yKi8KLQkoYmluYXJ5ZnVuYylzZXRfb3IsCQkvKm5iX29yKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm5iX2FkZCovCisgICAgKGJpbmFyeWZ1bmMpc2V0X3N1YiwgICAgICAgICAgICAgICAgLypuYl9zdWJ0cmFjdCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypuYl9tdWx0aXBseSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypuYl9kaXZpZGUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbmJfcmVtYWluZGVyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm5iX2Rpdm1vZCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypuYl9wb3dlciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypuYl9uZWdhdGl2ZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypuYl9wb3NpdGl2ZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypuYl9hYnNvbHV0ZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypuYl9ub256ZXJvKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm5iX2ludmVydCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypuYl9sc2hpZnQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbmJfcnNoaWZ0Ki8KKyAgICAoYmluYXJ5ZnVuYylzZXRfYW5kLCAgICAgICAgICAgICAgICAvKm5iX2FuZCovCisgICAgKGJpbmFyeWZ1bmMpc2V0X3hvciwgICAgICAgICAgICAgICAgLypuYl94b3IqLworICAgIChiaW5hcnlmdW5jKXNldF9vciwgICAgICAgICAgICAgICAgIC8qbmJfb3IqLwogfTsKIAogUHlEb2NfU1RSVkFSKGZyb3plbnNldF9kb2MsCkBAIC0yMjA5LDQ3ICsyMjA5LDQ3IEBACiBCdWlsZCBhbiBpbW11dGFibGUgdW5vcmRlcmVkIGNvbGxlY3Rpb24gb2YgdW5pcXVlIGVsZW1lbnRzLiIpOwogCiBQeVR5cGVPYmplY3QgUHlGcm96ZW5TZXRfVHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQotCSJmcm96ZW5zZXQiLAkJCS8qIHRwX25hbWUgKi8KLQlzaXplb2YoUHlTZXRPYmplY3QpLAkJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3Ipc2V0X2RlYWxsb2MsCS8qIHRwX2RlYWxsb2MgKi8KLQkocHJpbnRmdW5jKXNldF90cF9wcmludCwJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJLyogdHBfc2V0YXR0ciAqLwotCXNldF9ub2NtcCwJCQkvKiB0cF9jb21wYXJlICovCi0JKHJlcHJmdW5jKXNldF9yZXByLAkJLyogdHBfcmVwciAqLwotCSZmcm96ZW5zZXRfYXNfbnVtYmVyLAkJLyogdHBfYXNfbnVtYmVyICovCi0JJnNldF9hc19zZXF1ZW5jZSwJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCWZyb3plbnNldF9oYXNoLAkJCS8qIHRwX2hhc2ggKi8KLQkwLAkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MgfCBQeV9UUEZMQUdTX0NIRUNLVFlQRVMgfAotCQlQeV9UUEZMQUdTX0JBU0VUWVBFLAkvKiB0cF9mbGFncyAqLwotCWZyb3plbnNldF9kb2MsCQkJLyogdHBfZG9jICovCi0JKHRyYXZlcnNlcHJvYylzZXRfdHJhdmVyc2UsCS8qIHRwX3RyYXZlcnNlICovCi0JKGlucXVpcnkpc2V0X2NsZWFyX2ludGVybmFsLAkvKiB0cF9jbGVhciAqLwotCShyaWNoY21wZnVuYylzZXRfcmljaGNvbXBhcmUsCS8qIHRwX3JpY2hjb21wYXJlICovCi0Jb2Zmc2V0b2YoUHlTZXRPYmplY3QsIHdlYWtyZWZsaXN0KSwJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQkoZ2V0aXRlcmZ1bmMpc2V0X2l0ZXIsCQkvKiB0cF9pdGVyICovCi0JMCwJCQkJLyogdHBfaXRlcm5leHQgKi8KLQlmcm96ZW5zZXRfbWV0aG9kcywJCS8qIHRwX21ldGhvZHMgKi8KLQkwLAkJCQkvKiB0cF9tZW1iZXJzICovCi0JMCwJCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCS8qIHRwX2RpY3QgKi8KLQkwLAkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KLQkwLAkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCi0JMCwJCQkJLyogdHBfaW5pdCAqLwotCVB5VHlwZV9HZW5lcmljQWxsb2MsCQkvKiB0cF9hbGxvYyAqLwotCWZyb3plbnNldF9uZXcsCQkJLyogdHBfbmV3ICovCi0JUHlPYmplY3RfR0NfRGVsLAkJLyogdHBfZnJlZSAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCisgICAgImZyb3plbnNldCIsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgIHNpemVvZihQeVNldE9iamVjdCksICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKXNldF9kZWFsbG9jLCAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAocHJpbnRmdW5jKXNldF90cF9wcmludCwgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgc2V0X25vY21wLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIChyZXByZnVuYylzZXRfcmVwciwgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAmZnJvemVuc2V0X2FzX251bWJlciwgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAmc2V0X2FzX3NlcXVlbmNlLCAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICBmcm96ZW5zZXRfaGFzaCwgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MgfCBQeV9UUEZMQUdTX0NIRUNLVFlQRVMgfAorICAgICAgICBQeV9UUEZMQUdTX0JBU0VUWVBFLCAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCisgICAgZnJvemVuc2V0X2RvYywgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgKHRyYXZlcnNlcHJvYylzZXRfdHJhdmVyc2UsICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAoaW5xdWlyeSlzZXRfY2xlYXJfaW50ZXJuYWwsICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIChyaWNoY21wZnVuYylzZXRfcmljaGNvbXBhcmUsICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgb2Zmc2V0b2YoUHlTZXRPYmplY3QsIHdlYWtyZWZsaXN0KSwgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIChnZXRpdGVyZnVuYylzZXRfaXRlciwgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIGZyb3plbnNldF9tZXRob2RzLCAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIFB5VHlwZV9HZW5lcmljQWxsb2MsICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgZnJvemVuc2V0X25ldywgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgUHlPYmplY3RfR0NfRGVsLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKIAogCkBAIC0yMjU4LDIzOCArMjI1OCwyMzggQEAKIFB5T2JqZWN0ICoKIFB5U2V0X05ldyhQeU9iamVjdCAqaXRlcmFibGUpCiB7Ci0JcmV0dXJuIG1ha2VfbmV3X3NldCgmUHlTZXRfVHlwZSwgaXRlcmFibGUpOworICAgIHJldHVybiBtYWtlX25ld19zZXQoJlB5U2V0X1R5cGUsIGl0ZXJhYmxlKTsKIH0KIAogUHlPYmplY3QgKgogUHlGcm96ZW5TZXRfTmV3KFB5T2JqZWN0ICppdGVyYWJsZSkKIHsKLQlyZXR1cm4gbWFrZV9uZXdfc2V0KCZQeUZyb3plblNldF9UeXBlLCBpdGVyYWJsZSk7CisgICAgcmV0dXJuIG1ha2VfbmV3X3NldCgmUHlGcm96ZW5TZXRfVHlwZSwgaXRlcmFibGUpOwogfQogCiBQeV9zc2l6ZV90CiBQeVNldF9TaXplKFB5T2JqZWN0ICphbnlzZXQpCiB7Ci0JaWYgKCFQeUFueVNldF9DaGVjayhhbnlzZXQpKSB7Ci0JCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXJldHVybiBQeVNldF9HRVRfU0laRShhbnlzZXQpOworICAgIGlmICghUHlBbnlTZXRfQ2hlY2soYW55c2V0KSkgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gUHlTZXRfR0VUX1NJWkUoYW55c2V0KTsKIH0KIAogaW50CiBQeVNldF9DbGVhcihQeU9iamVjdCAqc2V0KQogewotCWlmICghUHlTZXRfQ2hlY2soc2V0KSkgewotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlyZXR1cm4gc2V0X2NsZWFyX2ludGVybmFsKChQeVNldE9iamVjdCAqKXNldCk7CisgICAgaWYgKCFQeVNldF9DaGVjayhzZXQpKSB7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiBzZXRfY2xlYXJfaW50ZXJuYWwoKFB5U2V0T2JqZWN0ICopc2V0KTsKIH0KIAogaW50CiBQeVNldF9Db250YWlucyhQeU9iamVjdCAqYW55c2V0LCBQeU9iamVjdCAqa2V5KQogewotCWlmICghUHlBbnlTZXRfQ2hlY2soYW55c2V0KSkgewotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlyZXR1cm4gc2V0X2NvbnRhaW5zX2tleSgoUHlTZXRPYmplY3QgKilhbnlzZXQsIGtleSk7CisgICAgaWYgKCFQeUFueVNldF9DaGVjayhhbnlzZXQpKSB7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiBzZXRfY29udGFpbnNfa2V5KChQeVNldE9iamVjdCAqKWFueXNldCwga2V5KTsKIH0KIAogaW50CiBQeVNldF9EaXNjYXJkKFB5T2JqZWN0ICpzZXQsIFB5T2JqZWN0ICprZXkpCiB7Ci0JaWYgKCFQeVNldF9DaGVjayhzZXQpKSB7Ci0JCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXJldHVybiBzZXRfZGlzY2FyZF9rZXkoKFB5U2V0T2JqZWN0ICopc2V0LCBrZXkpOworICAgIGlmICghUHlTZXRfQ2hlY2soc2V0KSkgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gc2V0X2Rpc2NhcmRfa2V5KChQeVNldE9iamVjdCAqKXNldCwga2V5KTsKIH0KIAogaW50CiBQeVNldF9BZGQoUHlPYmplY3QgKmFueXNldCwgUHlPYmplY3QgKmtleSkKIHsKLQlpZiAoIVB5U2V0X0NoZWNrKGFueXNldCkgJiYgCi0JICAgICghUHlGcm96ZW5TZXRfQ2hlY2soYW55c2V0KSB8fCBQeV9SRUZDTlQoYW55c2V0KSAhPSAxKSkgewotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlyZXR1cm4gc2V0X2FkZF9rZXkoKFB5U2V0T2JqZWN0ICopYW55c2V0LCBrZXkpOworICAgIGlmICghUHlTZXRfQ2hlY2soYW55c2V0KSAmJgorICAgICAgICAoIVB5RnJvemVuU2V0X0NoZWNrKGFueXNldCkgfHwgUHlfUkVGQ05UKGFueXNldCkgIT0gMSkpIHsKKyAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIHNldF9hZGRfa2V5KChQeVNldE9iamVjdCAqKWFueXNldCwga2V5KTsKIH0KIAogaW50CiBfUHlTZXRfTmV4dChQeU9iamVjdCAqc2V0LCBQeV9zc2l6ZV90ICpwb3MsIFB5T2JqZWN0ICoqa2V5KQogewotCXNldGVudHJ5ICplbnRyeV9wdHI7CisgICAgc2V0ZW50cnkgKmVudHJ5X3B0cjsKIAotCWlmICghUHlBbnlTZXRfQ2hlY2soc2V0KSkgewotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoc2V0X25leHQoKFB5U2V0T2JqZWN0ICopc2V0LCBwb3MsICZlbnRyeV9wdHIpID09IDApCi0JCXJldHVybiAwOwotCSprZXkgPSBlbnRyeV9wdHItPmtleTsKLQlyZXR1cm4gMTsKKyAgICBpZiAoIVB5QW55U2V0X0NoZWNrKHNldCkpIHsKKyAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKHNldF9uZXh0KChQeVNldE9iamVjdCAqKXNldCwgcG9zLCAmZW50cnlfcHRyKSA9PSAwKQorICAgICAgICByZXR1cm4gMDsKKyAgICAqa2V5ID0gZW50cnlfcHRyLT5rZXk7CisgICAgcmV0dXJuIDE7CiB9CiAKIGludAogX1B5U2V0X05leHRFbnRyeShQeU9iamVjdCAqc2V0LCBQeV9zc2l6ZV90ICpwb3MsIFB5T2JqZWN0ICoqa2V5LCBsb25nICpoYXNoKQogewotCXNldGVudHJ5ICplbnRyeTsKKyAgICBzZXRlbnRyeSAqZW50cnk7CiAKLQlpZiAoIVB5QW55U2V0X0NoZWNrKHNldCkpIHsKLQkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKHNldF9uZXh0KChQeVNldE9iamVjdCAqKXNldCwgcG9zLCAmZW50cnkpID09IDApCi0JCXJldHVybiAwOwotCSprZXkgPSBlbnRyeS0+a2V5OwotCSpoYXNoID0gZW50cnktPmhhc2g7Ci0JcmV0dXJuIDE7CisgICAgaWYgKCFQeUFueVNldF9DaGVjayhzZXQpKSB7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChzZXRfbmV4dCgoUHlTZXRPYmplY3QgKilzZXQsIHBvcywgJmVudHJ5KSA9PSAwKQorICAgICAgICByZXR1cm4gMDsKKyAgICAqa2V5ID0gZW50cnktPmtleTsKKyAgICAqaGFzaCA9IGVudHJ5LT5oYXNoOworICAgIHJldHVybiAxOwogfQogCiBQeU9iamVjdCAqCiBQeVNldF9Qb3AoUHlPYmplY3QgKnNldCkKIHsKLQlpZiAoIVB5U2V0X0NoZWNrKHNldCkpIHsKLQkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gc2V0X3BvcCgoUHlTZXRPYmplY3QgKilzZXQpOworICAgIGlmICghUHlTZXRfQ2hlY2soc2V0KSkgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBzZXRfcG9wKChQeVNldE9iamVjdCAqKXNldCk7CiB9CiAKIGludAogX1B5U2V0X1VwZGF0ZShQeU9iamVjdCAqc2V0LCBQeU9iamVjdCAqaXRlcmFibGUpCiB7Ci0JaWYgKCFQeVNldF9DaGVjayhzZXQpKSB7Ci0JCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXJldHVybiBzZXRfdXBkYXRlX2ludGVybmFsKChQeVNldE9iamVjdCAqKXNldCwgaXRlcmFibGUpOworICAgIGlmICghUHlTZXRfQ2hlY2soc2V0KSkgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gc2V0X3VwZGF0ZV9pbnRlcm5hbCgoUHlTZXRPYmplY3QgKilzZXQsIGl0ZXJhYmxlKTsKIH0KIAogI2lmZGVmIFB5X0RFQlVHCiAKLS8qIFRlc3QgY29kZSB0byBiZSBjYWxsZWQgd2l0aCBhbnkgdGhyZWUgZWxlbWVudCBzZXQuIAorLyogVGVzdCBjb2RlIHRvIGJlIGNhbGxlZCB3aXRoIGFueSB0aHJlZSBlbGVtZW50IHNldC4KICAgIFJldHVybnMgVHJ1ZSBhbmQgb3JpZ2luYWwgc2V0IGlzIHJlc3RvcmVkLiAqLwogCi0jZGVmaW5lIGFzc2VydFJhaXNlcyhjYWxsX3JldHVybl92YWx1ZSwgZXhjZXB0aW9uKQkJXAotCWRvIHsJCQkJCQkJXAotCQlhc3NlcnQoY2FsbF9yZXR1cm5fdmFsdWUpOwkJCVwKLQkJYXNzZXJ0KFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoZXhjZXB0aW9uKSk7CVwKLQkJUHlFcnJfQ2xlYXIoKTsJCQkJCVwKLQl9IHdoaWxlKDApCisjZGVmaW5lIGFzc2VydFJhaXNlcyhjYWxsX3JldHVybl92YWx1ZSwgZXhjZXB0aW9uKSAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYXNzZXJ0KGNhbGxfcmV0dXJuX3ZhbHVlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGFzc2VydChQeUVycl9FeGNlcHRpb25NYXRjaGVzKGV4Y2VwdGlvbikpOyAgICAgICAgICAgICAgXAorICAgICAgICBQeUVycl9DbGVhcigpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlKDApCiAKIHN0YXRpYyBQeU9iamVjdCAqCiB0ZXN0X2NfYXBpKFB5U2V0T2JqZWN0ICpzbykKIHsKLQlQeV9zc2l6ZV90IGNvdW50OwotCWNoYXIgKnM7Ci0JUHlfc3NpemVfdCBpOwotCVB5T2JqZWN0ICplbGVtPU5VTEwsICpkdXA9TlVMTCwgKnQsICpmLCAqZHVwMiwgKng7Ci0JUHlPYmplY3QgKm9iID0gKFB5T2JqZWN0ICopc287CisgICAgUHlfc3NpemVfdCBjb3VudDsKKyAgICBjaGFyICpzOworICAgIFB5X3NzaXplX3QgaTsKKyAgICBQeU9iamVjdCAqZWxlbT1OVUxMLCAqZHVwPU5VTEwsICp0LCAqZiwgKmR1cDIsICp4OworICAgIFB5T2JqZWN0ICpvYiA9IChQeU9iamVjdCAqKXNvOwogCi0JLyogVmVyaWZ5IHByZWNvbmRpdGlvbnMgYW5kIGV4ZXJjaXNlIHR5cGUvc2l6ZSBjaGVja3MgKi8KLQlhc3NlcnQoUHlBbnlTZXRfQ2hlY2sob2IpKTsKLQlhc3NlcnQoUHlBbnlTZXRfQ2hlY2tFeGFjdChvYikpOwotCWFzc2VydCghUHlGcm96ZW5TZXRfQ2hlY2tFeGFjdChvYikpOwotCWFzc2VydChQeVNldF9TaXplKG9iKSA9PSAzKTsKLQlhc3NlcnQoUHlTZXRfR0VUX1NJWkUob2IpID09IDMpOworICAgIC8qIFZlcmlmeSBwcmVjb25kaXRpb25zIGFuZCBleGVyY2lzZSB0eXBlL3NpemUgY2hlY2tzICovCisgICAgYXNzZXJ0KFB5QW55U2V0X0NoZWNrKG9iKSk7CisgICAgYXNzZXJ0KFB5QW55U2V0X0NoZWNrRXhhY3Qob2IpKTsKKyAgICBhc3NlcnQoIVB5RnJvemVuU2V0X0NoZWNrRXhhY3Qob2IpKTsKKyAgICBhc3NlcnQoUHlTZXRfU2l6ZShvYikgPT0gMyk7CisgICAgYXNzZXJ0KFB5U2V0X0dFVF9TSVpFKG9iKSA9PSAzKTsKIAotCS8qIFJhaXNlIFR5cGVFcnJvciBmb3Igbm9uLWl0ZXJhYmxlIGNvbnN0cnVjdG9yIGFyZ3VtZW50cyAqLwotCWFzc2VydFJhaXNlcyhQeVNldF9OZXcoUHlfTm9uZSkgPT0gTlVMTCwgUHlFeGNfVHlwZUVycm9yKTsKLQlhc3NlcnRSYWlzZXMoUHlGcm96ZW5TZXRfTmV3KFB5X05vbmUpID09IE5VTEwsIFB5RXhjX1R5cGVFcnJvcik7CisgICAgLyogUmFpc2UgVHlwZUVycm9yIGZvciBub24taXRlcmFibGUgY29uc3RydWN0b3IgYXJndW1lbnRzICovCisgICAgYXNzZXJ0UmFpc2VzKFB5U2V0X05ldyhQeV9Ob25lKSA9PSBOVUxMLCBQeUV4Y19UeXBlRXJyb3IpOworICAgIGFzc2VydFJhaXNlcyhQeUZyb3plblNldF9OZXcoUHlfTm9uZSkgPT0gTlVMTCwgUHlFeGNfVHlwZUVycm9yKTsKIAotCS8qIFJhaXNlIFR5cGVFcnJvciBmb3IgdW5oYXNoYWJsZSBrZXkgKi8KLQlkdXAgPSBQeVNldF9OZXcob2IpOwotCWFzc2VydFJhaXNlcyhQeVNldF9EaXNjYXJkKG9iLCBkdXApID09IC0xLCBQeUV4Y19UeXBlRXJyb3IpOwotCWFzc2VydFJhaXNlcyhQeVNldF9Db250YWlucyhvYiwgZHVwKSA9PSAtMSwgUHlFeGNfVHlwZUVycm9yKTsKLQlhc3NlcnRSYWlzZXMoUHlTZXRfQWRkKG9iLCBkdXApID09IC0xLCBQeUV4Y19UeXBlRXJyb3IpOworICAgIC8qIFJhaXNlIFR5cGVFcnJvciBmb3IgdW5oYXNoYWJsZSBrZXkgKi8KKyAgICBkdXAgPSBQeVNldF9OZXcob2IpOworICAgIGFzc2VydFJhaXNlcyhQeVNldF9EaXNjYXJkKG9iLCBkdXApID09IC0xLCBQeUV4Y19UeXBlRXJyb3IpOworICAgIGFzc2VydFJhaXNlcyhQeVNldF9Db250YWlucyhvYiwgZHVwKSA9PSAtMSwgUHlFeGNfVHlwZUVycm9yKTsKKyAgICBhc3NlcnRSYWlzZXMoUHlTZXRfQWRkKG9iLCBkdXApID09IC0xLCBQeUV4Y19UeXBlRXJyb3IpOwogCi0JLyogRXhlcmNpc2Ugc3VjY2Vzc2Z1bCBwb3AsIGNvbnRhaW5zLCBhZGQsIGFuZCBkaXNjYXJkICovCi0JZWxlbSA9IFB5U2V0X1BvcChvYik7Ci0JYXNzZXJ0KFB5U2V0X0NvbnRhaW5zKG9iLCBlbGVtKSA9PSAwKTsKLQlhc3NlcnQoUHlTZXRfR0VUX1NJWkUob2IpID09IDIpOwotCWFzc2VydChQeVNldF9BZGQob2IsIGVsZW0pID09IDApOwotCWFzc2VydChQeVNldF9Db250YWlucyhvYiwgZWxlbSkgPT0gMSk7Ci0JYXNzZXJ0KFB5U2V0X0dFVF9TSVpFKG9iKSA9PSAzKTsKLQlhc3NlcnQoUHlTZXRfRGlzY2FyZChvYiwgZWxlbSkgPT0gMSk7Ci0JYXNzZXJ0KFB5U2V0X0dFVF9TSVpFKG9iKSA9PSAyKTsKLQlhc3NlcnQoUHlTZXRfRGlzY2FyZChvYiwgZWxlbSkgPT0gMCk7Ci0JYXNzZXJ0KFB5U2V0X0dFVF9TSVpFKG9iKSA9PSAyKTsKKyAgICAvKiBFeGVyY2lzZSBzdWNjZXNzZnVsIHBvcCwgY29udGFpbnMsIGFkZCwgYW5kIGRpc2NhcmQgKi8KKyAgICBlbGVtID0gUHlTZXRfUG9wKG9iKTsKKyAgICBhc3NlcnQoUHlTZXRfQ29udGFpbnMob2IsIGVsZW0pID09IDApOworICAgIGFzc2VydChQeVNldF9HRVRfU0laRShvYikgPT0gMik7CisgICAgYXNzZXJ0KFB5U2V0X0FkZChvYiwgZWxlbSkgPT0gMCk7CisgICAgYXNzZXJ0KFB5U2V0X0NvbnRhaW5zKG9iLCBlbGVtKSA9PSAxKTsKKyAgICBhc3NlcnQoUHlTZXRfR0VUX1NJWkUob2IpID09IDMpOworICAgIGFzc2VydChQeVNldF9EaXNjYXJkKG9iLCBlbGVtKSA9PSAxKTsKKyAgICBhc3NlcnQoUHlTZXRfR0VUX1NJWkUob2IpID09IDIpOworICAgIGFzc2VydChQeVNldF9EaXNjYXJkKG9iLCBlbGVtKSA9PSAwKTsKKyAgICBhc3NlcnQoUHlTZXRfR0VUX1NJWkUob2IpID09IDIpOwogCi0JLyogRXhlcmNpc2UgY2xlYXIgKi8KLQlkdXAyID0gUHlTZXRfTmV3KGR1cCk7Ci0JYXNzZXJ0KFB5U2V0X0NsZWFyKGR1cDIpID09IDApOwotCWFzc2VydChQeVNldF9TaXplKGR1cDIpID09IDApOwotCVB5X0RFQ1JFRihkdXAyKTsKKyAgICAvKiBFeGVyY2lzZSBjbGVhciAqLworICAgIGR1cDIgPSBQeVNldF9OZXcoZHVwKTsKKyAgICBhc3NlcnQoUHlTZXRfQ2xlYXIoZHVwMikgPT0gMCk7CisgICAgYXNzZXJ0KFB5U2V0X1NpemUoZHVwMikgPT0gMCk7CisgICAgUHlfREVDUkVGKGR1cDIpOwogCi0JLyogUmFpc2UgU3lzdGVtRXJyb3Igb24gY2xlYXIgb3IgdXBkYXRlIG9mIGZyb3plbiBzZXQgKi8KLQlmID0gUHlGcm96ZW5TZXRfTmV3KGR1cCk7Ci0JYXNzZXJ0UmFpc2VzKFB5U2V0X0NsZWFyKGYpID09IC0xLCBQeUV4Y19TeXN0ZW1FcnJvcik7Ci0JYXNzZXJ0UmFpc2VzKF9QeVNldF9VcGRhdGUoZiwgZHVwKSA9PSAtMSwgUHlFeGNfU3lzdGVtRXJyb3IpOwotCWFzc2VydChQeVNldF9BZGQoZiwgZWxlbSkgPT0gMCk7Ci0JUHlfSU5DUkVGKGYpOwotCWFzc2VydFJhaXNlcyhQeVNldF9BZGQoZiwgZWxlbSkgPT0gLTEsIFB5RXhjX1N5c3RlbUVycm9yKTsKLQlQeV9ERUNSRUYoZik7Ci0JUHlfREVDUkVGKGYpOworICAgIC8qIFJhaXNlIFN5c3RlbUVycm9yIG9uIGNsZWFyIG9yIHVwZGF0ZSBvZiBmcm96ZW4gc2V0ICovCisgICAgZiA9IFB5RnJvemVuU2V0X05ldyhkdXApOworICAgIGFzc2VydFJhaXNlcyhQeVNldF9DbGVhcihmKSA9PSAtMSwgUHlFeGNfU3lzdGVtRXJyb3IpOworICAgIGFzc2VydFJhaXNlcyhfUHlTZXRfVXBkYXRlKGYsIGR1cCkgPT0gLTEsIFB5RXhjX1N5c3RlbUVycm9yKTsKKyAgICBhc3NlcnQoUHlTZXRfQWRkKGYsIGVsZW0pID09IDApOworICAgIFB5X0lOQ1JFRihmKTsKKyAgICBhc3NlcnRSYWlzZXMoUHlTZXRfQWRkKGYsIGVsZW0pID09IC0xLCBQeUV4Y19TeXN0ZW1FcnJvcik7CisgICAgUHlfREVDUkVGKGYpOworICAgIFB5X0RFQ1JFRihmKTsKIAotCS8qIEV4ZXJjaXNlIGRpcmVjdCBpdGVyYXRpb24gKi8KLQlpID0gMCwgY291bnQgPSAwOwotCXdoaWxlIChfUHlTZXRfTmV4dCgoUHlPYmplY3QgKilkdXAsICZpLCAmeCkpIHsKLQkJcyA9IFB5U3RyaW5nX0FzU3RyaW5nKHgpOwotCQlhc3NlcnQocyAmJiAoc1swXSA9PSAnYScgfHwgc1swXSA9PSAnYicgfHwgc1swXSA9PSAnYycpKTsKLQkJY291bnQrKzsKLQl9Ci0JYXNzZXJ0KGNvdW50ID09IDMpOworICAgIC8qIEV4ZXJjaXNlIGRpcmVjdCBpdGVyYXRpb24gKi8KKyAgICBpID0gMCwgY291bnQgPSAwOworICAgIHdoaWxlIChfUHlTZXRfTmV4dCgoUHlPYmplY3QgKilkdXAsICZpLCAmeCkpIHsKKyAgICAgICAgcyA9IFB5U3RyaW5nX0FzU3RyaW5nKHgpOworICAgICAgICBhc3NlcnQocyAmJiAoc1swXSA9PSAnYScgfHwgc1swXSA9PSAnYicgfHwgc1swXSA9PSAnYycpKTsKKyAgICAgICAgY291bnQrKzsKKyAgICB9CisgICAgYXNzZXJ0KGNvdW50ID09IDMpOwogCi0JLyogRXhlcmNpc2UgdXBkYXRlcyAqLwotCWR1cDIgPSBQeVNldF9OZXcoTlVMTCk7Ci0JYXNzZXJ0KF9QeVNldF9VcGRhdGUoZHVwMiwgZHVwKSA9PSAwKTsKLQlhc3NlcnQoUHlTZXRfU2l6ZShkdXAyKSA9PSAzKTsKLQlhc3NlcnQoX1B5U2V0X1VwZGF0ZShkdXAyLCBkdXApID09IDApOwotCWFzc2VydChQeVNldF9TaXplKGR1cDIpID09IDMpOwotCVB5X0RFQ1JFRihkdXAyKTsKKyAgICAvKiBFeGVyY2lzZSB1cGRhdGVzICovCisgICAgZHVwMiA9IFB5U2V0X05ldyhOVUxMKTsKKyAgICBhc3NlcnQoX1B5U2V0X1VwZGF0ZShkdXAyLCBkdXApID09IDApOworICAgIGFzc2VydChQeVNldF9TaXplKGR1cDIpID09IDMpOworICAgIGFzc2VydChfUHlTZXRfVXBkYXRlKGR1cDIsIGR1cCkgPT0gMCk7CisgICAgYXNzZXJ0KFB5U2V0X1NpemUoZHVwMikgPT0gMyk7CisgICAgUHlfREVDUkVGKGR1cDIpOwogCi0JLyogUmFpc2UgU3lzdGVtRXJyb3Igd2hlbiBzZWxmIGFyZ3VtZW50IGlzIG5vdCBhIHNldCBvciBmcm96ZW5zZXQuICovCi0JdCA9IFB5VHVwbGVfTmV3KDApOwotCWFzc2VydFJhaXNlcyhQeVNldF9TaXplKHQpID09IC0xLCBQeUV4Y19TeXN0ZW1FcnJvcik7Ci0JYXNzZXJ0UmFpc2VzKFB5U2V0X0NvbnRhaW5zKHQsIGVsZW0pID09IC0xLCBQeUV4Y19TeXN0ZW1FcnJvcik7Ci0JUHlfREVDUkVGKHQpOworICAgIC8qIFJhaXNlIFN5c3RlbUVycm9yIHdoZW4gc2VsZiBhcmd1bWVudCBpcyBub3QgYSBzZXQgb3IgZnJvemVuc2V0LiAqLworICAgIHQgPSBQeVR1cGxlX05ldygwKTsKKyAgICBhc3NlcnRSYWlzZXMoUHlTZXRfU2l6ZSh0KSA9PSAtMSwgUHlFeGNfU3lzdGVtRXJyb3IpOworICAgIGFzc2VydFJhaXNlcyhQeVNldF9Db250YWlucyh0LCBlbGVtKSA9PSAtMSwgUHlFeGNfU3lzdGVtRXJyb3IpOworICAgIFB5X0RFQ1JFRih0KTsKIAotCS8qIFJhaXNlIFN5c3RlbUVycm9yIHdoZW4gc2VsZiBhcmd1bWVudCBpcyBub3QgYSBzZXQuICovCi0JZiA9IFB5RnJvemVuU2V0X05ldyhkdXApOwotCWFzc2VydChQeVNldF9TaXplKGYpID09IDMpOwotCWFzc2VydChQeUZyb3plblNldF9DaGVja0V4YWN0KGYpKTsKLQlhc3NlcnRSYWlzZXMoUHlTZXRfRGlzY2FyZChmLCBlbGVtKSA9PSAtMSwgUHlFeGNfU3lzdGVtRXJyb3IpOwotCWFzc2VydFJhaXNlcyhQeVNldF9Qb3AoZikgPT0gTlVMTCwgUHlFeGNfU3lzdGVtRXJyb3IpOwotCVB5X0RFQ1JFRihmKTsKKyAgICAvKiBSYWlzZSBTeXN0ZW1FcnJvciB3aGVuIHNlbGYgYXJndW1lbnQgaXMgbm90IGEgc2V0LiAqLworICAgIGYgPSBQeUZyb3plblNldF9OZXcoZHVwKTsKKyAgICBhc3NlcnQoUHlTZXRfU2l6ZShmKSA9PSAzKTsKKyAgICBhc3NlcnQoUHlGcm96ZW5TZXRfQ2hlY2tFeGFjdChmKSk7CisgICAgYXNzZXJ0UmFpc2VzKFB5U2V0X0Rpc2NhcmQoZiwgZWxlbSkgPT0gLTEsIFB5RXhjX1N5c3RlbUVycm9yKTsKKyAgICBhc3NlcnRSYWlzZXMoUHlTZXRfUG9wKGYpID09IE5VTEwsIFB5RXhjX1N5c3RlbUVycm9yKTsKKyAgICBQeV9ERUNSRUYoZik7CiAKLQkvKiBSYWlzZSBLZXlFcnJvciB3aGVuIHBvcHBpbmcgZnJvbSBhbiBlbXB0eSBzZXQgKi8KLQlhc3NlcnQoUHlOdW1iZXJfSW5QbGFjZVN1YnRyYWN0KG9iLCBvYikgPT0gb2IpOwotCVB5X0RFQ1JFRihvYik7Ci0JYXNzZXJ0KFB5U2V0X0dFVF9TSVpFKG9iKSA9PSAwKTsKLQlhc3NlcnRSYWlzZXMoUHlTZXRfUG9wKG9iKSA9PSBOVUxMLCBQeUV4Y19LZXlFcnJvcik7CisgICAgLyogUmFpc2UgS2V5RXJyb3Igd2hlbiBwb3BwaW5nIGZyb20gYW4gZW1wdHkgc2V0ICovCisgICAgYXNzZXJ0KFB5TnVtYmVyX0luUGxhY2VTdWJ0cmFjdChvYiwgb2IpID09IG9iKTsKKyAgICBQeV9ERUNSRUYob2IpOworICAgIGFzc2VydChQeVNldF9HRVRfU0laRShvYikgPT0gMCk7CisgICAgYXNzZXJ0UmFpc2VzKFB5U2V0X1BvcChvYikgPT0gTlVMTCwgUHlFeGNfS2V5RXJyb3IpOwogCi0JLyogUmVzdG9yZSB0aGUgc2V0IGZyb20gdGhlIGNvcHkgdXNpbmcgdGhlIFB5TnVtYmVyIEFQSSAqLwotCWFzc2VydChQeU51bWJlcl9JblBsYWNlT3Iob2IsIGR1cCkgPT0gb2IpOwotCVB5X0RFQ1JFRihvYik7CisgICAgLyogUmVzdG9yZSB0aGUgc2V0IGZyb20gdGhlIGNvcHkgdXNpbmcgdGhlIFB5TnVtYmVyIEFQSSAqLworICAgIGFzc2VydChQeU51bWJlcl9JblBsYWNlT3Iob2IsIGR1cCkgPT0gb2IpOworICAgIFB5X0RFQ1JFRihvYik7CiAKLQkvKiBWZXJpZnkgY29uc3RydWN0b3JzIGFjY2VwdCBOVUxMIGFyZ3VtZW50cyAqLwotCWYgPSBQeVNldF9OZXcoTlVMTCk7Ci0JYXNzZXJ0KGYgIT0gTlVMTCk7Ci0JYXNzZXJ0KFB5U2V0X0dFVF9TSVpFKGYpID09IDApOwotCVB5X0RFQ1JFRihmKTsKLQlmID0gUHlGcm96ZW5TZXRfTmV3KE5VTEwpOwotCWFzc2VydChmICE9IE5VTEwpOwotCWFzc2VydChQeUZyb3plblNldF9DaGVja0V4YWN0KGYpKTsKLQlhc3NlcnQoUHlTZXRfR0VUX1NJWkUoZikgPT0gMCk7Ci0JUHlfREVDUkVGKGYpOworICAgIC8qIFZlcmlmeSBjb25zdHJ1Y3RvcnMgYWNjZXB0IE5VTEwgYXJndW1lbnRzICovCisgICAgZiA9IFB5U2V0X05ldyhOVUxMKTsKKyAgICBhc3NlcnQoZiAhPSBOVUxMKTsKKyAgICBhc3NlcnQoUHlTZXRfR0VUX1NJWkUoZikgPT0gMCk7CisgICAgUHlfREVDUkVGKGYpOworICAgIGYgPSBQeUZyb3plblNldF9OZXcoTlVMTCk7CisgICAgYXNzZXJ0KGYgIT0gTlVMTCk7CisgICAgYXNzZXJ0KFB5RnJvemVuU2V0X0NoZWNrRXhhY3QoZikpOworICAgIGFzc2VydChQeVNldF9HRVRfU0laRShmKSA9PSAwKTsKKyAgICBQeV9ERUNSRUYoZik7CiAKLQlQeV9ERUNSRUYoZWxlbSk7Ci0JUHlfREVDUkVGKGR1cCk7Ci0JUHlfUkVUVVJOX1RSVUU7CisgICAgUHlfREVDUkVGKGVsZW0pOworICAgIFB5X0RFQ1JFRihkdXApOworICAgIFB5X1JFVFVSTl9UUlVFOwogfQogCiAjdW5kZWYgYXNzZXJ0UmFpc2VzCmRpZmYgLS1naXQgYS9PYmplY3RzL3NsaWNlb2JqZWN0LmMgYi9PYmplY3RzL3NsaWNlb2JqZWN0LmMKaW5kZXggMmViMzk0MS4uZDFmZTA1MiAxMDA2NDQKLS0tIGEvT2JqZWN0cy9zbGljZW9iamVjdC5jCisrKyBiL09iamVjdHMvc2xpY2VvYmplY3QuYwpAQCAtNyw3ICs3LDcgQEAKIGZvciB0aGlzIGZpbGUuCiAqLwogCi0vKiAKKy8qCiBQeV9FbGxpcHNpcyBlbmNvZGVzIHRoZSAnLi4uJyBydWJiZXIgaW5kZXggdG9rZW4uIEl0IGlzIHNpbWlsYXIgdG8KIHRoZSBQeV9Ob25lU3RydWN0IGluIHRoYXQgdGhlcmUgaXMgbm8gd2F5IHRvIGNyZWF0ZSBvdGhlciBvYmplY3RzIG9mCiB0aGlzIHR5cGUgYW5kIHRoZXJlIGlzIGV4YWN0bHkgb25lIGluIGV4aXN0ZW5jZS4KQEAgLTE5LDM1ICsxOSwzNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGVsbGlwc2lzX3JlcHIoUHlPYmplY3QgKm9wKQogewotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKCJFbGxpcHNpcyIpOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKCJFbGxpcHNpcyIpOwogfQogCiBQeVR5cGVPYmplY3QgUHlFbGxpcHNpc19UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCi0JImVsbGlwc2lzIiwJCQkvKiB0cF9uYW1lICovCi0JMCwJCQkJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkwLCAvKm5ldmVyIGNhbGxlZCovCQkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQllbGxpcHNpc19yZXByLAkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJLyogdHBfY2FsbCAqLwotCTAsCQkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxULAkJLyogdHBfZmxhZ3MgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQorICAgICJlbGxpcHNpcyIsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIDAsIC8qbmV2ZXIgY2FsbGVkKi8gICAgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIGVsbGlwc2lzX3JlcHIsICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQsICAgICAgICAgICAgICAgICAvKiB0cF9mbGFncyAqLwogfTsKIAogUHlPYmplY3QgX1B5X0VsbGlwc2lzT2JqZWN0ID0gewotCV9QeU9iamVjdF9FWFRSQV9JTklUCi0JMSwgJlB5RWxsaXBzaXNfVHlwZQorICAgIF9QeU9iamVjdF9FWFRSQV9JTklUCisgICAgMSwgJlB5RWxsaXBzaXNfVHlwZQogfTsKIAogCkBAIC02MCwxNTQgKzYwLDE1NCBAQAogUHlPYmplY3QgKgogUHlTbGljZV9OZXcoUHlPYmplY3QgKnN0YXJ0LCBQeU9iamVjdCAqc3RvcCwgUHlPYmplY3QgKnN0ZXApCiB7Ci0JUHlTbGljZU9iamVjdCAqb2JqID0gUHlPYmplY3RfTmV3KFB5U2xpY2VPYmplY3QsICZQeVNsaWNlX1R5cGUpOworICAgIFB5U2xpY2VPYmplY3QgKm9iaiA9IFB5T2JqZWN0X05ldyhQeVNsaWNlT2JqZWN0LCAmUHlTbGljZV9UeXBlKTsKIAotCWlmIChvYmogPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKG9iaiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChzdGVwID09IE5VTEwpIHN0ZXAgPSBQeV9Ob25lOwotCVB5X0lOQ1JFRihzdGVwKTsKLQlpZiAoc3RhcnQgPT0gTlVMTCkgc3RhcnQgPSBQeV9Ob25lOwotCVB5X0lOQ1JFRihzdGFydCk7Ci0JaWYgKHN0b3AgPT0gTlVMTCkgc3RvcCA9IFB5X05vbmU7Ci0JUHlfSU5DUkVGKHN0b3ApOworICAgIGlmIChzdGVwID09IE5VTEwpIHN0ZXAgPSBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihzdGVwKTsKKyAgICBpZiAoc3RhcnQgPT0gTlVMTCkgc3RhcnQgPSBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihzdGFydCk7CisgICAgaWYgKHN0b3AgPT0gTlVMTCkgc3RvcCA9IFB5X05vbmU7CisgICAgUHlfSU5DUkVGKHN0b3ApOwogCi0Jb2JqLT5zdGVwID0gc3RlcDsKLQlvYmotPnN0YXJ0ID0gc3RhcnQ7Ci0Jb2JqLT5zdG9wID0gc3RvcDsKKyAgICBvYmotPnN0ZXAgPSBzdGVwOworICAgIG9iai0+c3RhcnQgPSBzdGFydDsKKyAgICBvYmotPnN0b3AgPSBzdG9wOwogCi0JcmV0dXJuIChQeU9iamVjdCAqKSBvYmo7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKSBvYmo7CiB9CiAKIFB5T2JqZWN0ICoKIF9QeVNsaWNlX0Zyb21JbmRpY2VzKFB5X3NzaXplX3QgaXN0YXJ0LCBQeV9zc2l6ZV90IGlzdG9wKQogewotCVB5T2JqZWN0ICpzdGFydCwgKmVuZCwgKnNsaWNlOwotCXN0YXJ0ID0gUHlJbnRfRnJvbVNzaXplX3QoaXN0YXJ0KTsKLQlpZiAoIXN0YXJ0KQotCQlyZXR1cm4gTlVMTDsKLQllbmQgPSBQeUludF9Gcm9tU3NpemVfdChpc3RvcCk7Ci0JaWYgKCFlbmQpIHsKLQkJUHlfREVDUkVGKHN0YXJ0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIFB5T2JqZWN0ICpzdGFydCwgKmVuZCwgKnNsaWNlOworICAgIHN0YXJ0ID0gUHlJbnRfRnJvbVNzaXplX3QoaXN0YXJ0KTsKKyAgICBpZiAoIXN0YXJ0KQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBlbmQgPSBQeUludF9Gcm9tU3NpemVfdChpc3RvcCk7CisgICAgaWYgKCFlbmQpIHsKKyAgICAgICAgUHlfREVDUkVGKHN0YXJ0KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0Jc2xpY2UgPSBQeVNsaWNlX05ldyhzdGFydCwgZW5kLCBOVUxMKTsKLQlQeV9ERUNSRUYoc3RhcnQpOwotCVB5X0RFQ1JFRihlbmQpOwotCXJldHVybiBzbGljZTsKKyAgICBzbGljZSA9IFB5U2xpY2VfTmV3KHN0YXJ0LCBlbmQsIE5VTEwpOworICAgIFB5X0RFQ1JFRihzdGFydCk7CisgICAgUHlfREVDUkVGKGVuZCk7CisgICAgcmV0dXJuIHNsaWNlOwogfQogCiBpbnQKIFB5U2xpY2VfR2V0SW5kaWNlcyhQeVNsaWNlT2JqZWN0ICpyLCBQeV9zc2l6ZV90IGxlbmd0aCwKICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90ICpzdGFydCwgUHlfc3NpemVfdCAqc3RvcCwgUHlfc3NpemVfdCAqc3RlcCkKIHsKLQkvKiBYWFggc3VwcG9ydCBsb25nIGludHMgKi8KLQlpZiAoci0+c3RlcCA9PSBQeV9Ob25lKSB7Ci0JCSpzdGVwID0gMTsKLQl9IGVsc2UgewotCQlpZiAoIVB5SW50X0NoZWNrKHItPnN0ZXApICYmICFQeUxvbmdfQ2hlY2soci0+c3RlcCkpIHJldHVybiAtMTsKLQkJKnN0ZXAgPSBQeUludF9Bc1NzaXplX3Qoci0+c3RlcCk7Ci0JfQotCWlmIChyLT5zdGFydCA9PSBQeV9Ob25lKSB7Ci0JCSpzdGFydCA9ICpzdGVwIDwgMCA/IGxlbmd0aC0xIDogMDsKLQl9IGVsc2UgewotCQlpZiAoIVB5SW50X0NoZWNrKHItPnN0YXJ0KSAmJiAhUHlMb25nX0NoZWNrKHItPnN0ZXApKSByZXR1cm4gLTE7Ci0JCSpzdGFydCA9IFB5SW50X0FzU3NpemVfdChyLT5zdGFydCk7Ci0JCWlmICgqc3RhcnQgPCAwKSAqc3RhcnQgKz0gbGVuZ3RoOwotCX0KLQlpZiAoci0+c3RvcCA9PSBQeV9Ob25lKSB7Ci0JCSpzdG9wID0gKnN0ZXAgPCAwID8gLTEgOiBsZW5ndGg7Ci0JfSBlbHNlIHsKLQkJaWYgKCFQeUludF9DaGVjayhyLT5zdG9wKSAmJiAhUHlMb25nX0NoZWNrKHItPnN0ZXApKSByZXR1cm4gLTE7Ci0JCSpzdG9wID0gUHlJbnRfQXNTc2l6ZV90KHItPnN0b3ApOwotCQlpZiAoKnN0b3AgPCAwKSAqc3RvcCArPSBsZW5ndGg7Ci0JfQotCWlmICgqc3RvcCA+IGxlbmd0aCkgcmV0dXJuIC0xOwotCWlmICgqc3RhcnQgPj0gbGVuZ3RoKSByZXR1cm4gLTE7Ci0JaWYgKCpzdGVwID09IDApIHJldHVybiAtMTsKLQlyZXR1cm4gMDsKKyAgICAvKiBYWFggc3VwcG9ydCBsb25nIGludHMgKi8KKyAgICBpZiAoci0+c3RlcCA9PSBQeV9Ob25lKSB7CisgICAgICAgICpzdGVwID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoIVB5SW50X0NoZWNrKHItPnN0ZXApICYmICFQeUxvbmdfQ2hlY2soci0+c3RlcCkpIHJldHVybiAtMTsKKyAgICAgICAgKnN0ZXAgPSBQeUludF9Bc1NzaXplX3Qoci0+c3RlcCk7CisgICAgfQorICAgIGlmIChyLT5zdGFydCA9PSBQeV9Ob25lKSB7CisgICAgICAgICpzdGFydCA9ICpzdGVwIDwgMCA/IGxlbmd0aC0xIDogMDsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoIVB5SW50X0NoZWNrKHItPnN0YXJ0KSAmJiAhUHlMb25nX0NoZWNrKHItPnN0ZXApKSByZXR1cm4gLTE7CisgICAgICAgICpzdGFydCA9IFB5SW50X0FzU3NpemVfdChyLT5zdGFydCk7CisgICAgICAgIGlmICgqc3RhcnQgPCAwKSAqc3RhcnQgKz0gbGVuZ3RoOworICAgIH0KKyAgICBpZiAoci0+c3RvcCA9PSBQeV9Ob25lKSB7CisgICAgICAgICpzdG9wID0gKnN0ZXAgPCAwID8gLTEgOiBsZW5ndGg7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCFQeUludF9DaGVjayhyLT5zdG9wKSAmJiAhUHlMb25nX0NoZWNrKHItPnN0ZXApKSByZXR1cm4gLTE7CisgICAgICAgICpzdG9wID0gUHlJbnRfQXNTc2l6ZV90KHItPnN0b3ApOworICAgICAgICBpZiAoKnN0b3AgPCAwKSAqc3RvcCArPSBsZW5ndGg7CisgICAgfQorICAgIGlmICgqc3RvcCA+IGxlbmd0aCkgcmV0dXJuIC0xOworICAgIGlmICgqc3RhcnQgPj0gbGVuZ3RoKSByZXR1cm4gLTE7CisgICAgaWYgKCpzdGVwID09IDApIHJldHVybiAtMTsKKyAgICByZXR1cm4gMDsKIH0KIAogaW50CiBQeVNsaWNlX0dldEluZGljZXNFeChQeVNsaWNlT2JqZWN0ICpyLCBQeV9zc2l6ZV90IGxlbmd0aCwKLQkJICAgICBQeV9zc2l6ZV90ICpzdGFydCwgUHlfc3NpemVfdCAqc3RvcCwgUHlfc3NpemVfdCAqc3RlcCwgUHlfc3NpemVfdCAqc2xpY2VsZW5ndGgpCisgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90ICpzdGFydCwgUHlfc3NpemVfdCAqc3RvcCwgUHlfc3NpemVfdCAqc3RlcCwgUHlfc3NpemVfdCAqc2xpY2VsZW5ndGgpCiB7Ci0JLyogdGhpcyBpcyBoYXJkZXIgdG8gZ2V0IHJpZ2h0IHRoYW4geW91IG1pZ2h0IHRoaW5rICovCisgICAgLyogdGhpcyBpcyBoYXJkZXIgdG8gZ2V0IHJpZ2h0IHRoYW4geW91IG1pZ2h0IHRoaW5rICovCiAKLQlQeV9zc2l6ZV90IGRlZnN0YXJ0LCBkZWZzdG9wOworICAgIFB5X3NzaXplX3QgZGVmc3RhcnQsIGRlZnN0b3A7CiAKLQlpZiAoci0+c3RlcCA9PSBQeV9Ob25lKSB7Ci0JCSpzdGVwID0gMTsKLQl9IAotCWVsc2UgewotCQlpZiAoIV9QeUV2YWxfU2xpY2VJbmRleChyLT5zdGVwLCBzdGVwKSkgcmV0dXJuIC0xOwotCQlpZiAoKnN0ZXAgPT0gMCkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJCSJzbGljZSBzdGVwIGNhbm5vdCBiZSB6ZXJvIik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9CisgICAgaWYgKHItPnN0ZXAgPT0gUHlfTm9uZSkgeworICAgICAgICAqc3RlcCA9IDE7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZiAoIV9QeUV2YWxfU2xpY2VJbmRleChyLT5zdGVwLCBzdGVwKSkgcmV0dXJuIC0xOworICAgICAgICBpZiAoKnN0ZXAgPT0gMCkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNsaWNlIHN0ZXAgY2Fubm90IGJlIHplcm8iKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KIAotCWRlZnN0YXJ0ID0gKnN0ZXAgPCAwID8gbGVuZ3RoLTEgOiAwOwotCWRlZnN0b3AgPSAqc3RlcCA8IDAgPyAtMSA6IGxlbmd0aDsKKyAgICBkZWZzdGFydCA9ICpzdGVwIDwgMCA/IGxlbmd0aC0xIDogMDsKKyAgICBkZWZzdG9wID0gKnN0ZXAgPCAwID8gLTEgOiBsZW5ndGg7CiAKLQlpZiAoci0+c3RhcnQgPT0gUHlfTm9uZSkgewotCQkqc3RhcnQgPSBkZWZzdGFydDsKLQl9Ci0JZWxzZSB7Ci0JCWlmICghX1B5RXZhbF9TbGljZUluZGV4KHItPnN0YXJ0LCBzdGFydCkpIHJldHVybiAtMTsKLQkJaWYgKCpzdGFydCA8IDApICpzdGFydCArPSBsZW5ndGg7Ci0JCWlmICgqc3RhcnQgPCAwKSAqc3RhcnQgPSAoKnN0ZXAgPCAwKSA/IC0xIDogMDsKLQkJaWYgKCpzdGFydCA+PSBsZW5ndGgpIAotCQkJKnN0YXJ0ID0gKCpzdGVwIDwgMCkgPyBsZW5ndGggLSAxIDogbGVuZ3RoOwotCX0KKyAgICBpZiAoci0+c3RhcnQgPT0gUHlfTm9uZSkgeworICAgICAgICAqc3RhcnQgPSBkZWZzdGFydDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGlmICghX1B5RXZhbF9TbGljZUluZGV4KHItPnN0YXJ0LCBzdGFydCkpIHJldHVybiAtMTsKKyAgICAgICAgaWYgKCpzdGFydCA8IDApICpzdGFydCArPSBsZW5ndGg7CisgICAgICAgIGlmICgqc3RhcnQgPCAwKSAqc3RhcnQgPSAoKnN0ZXAgPCAwKSA/IC0xIDogMDsKKyAgICAgICAgaWYgKCpzdGFydCA+PSBsZW5ndGgpCisgICAgICAgICAgICAqc3RhcnQgPSAoKnN0ZXAgPCAwKSA/IGxlbmd0aCAtIDEgOiBsZW5ndGg7CisgICAgfQogCi0JaWYgKHItPnN0b3AgPT0gUHlfTm9uZSkgewotCQkqc3RvcCA9IGRlZnN0b3A7Ci0JfQotCWVsc2UgewotCQlpZiAoIV9QeUV2YWxfU2xpY2VJbmRleChyLT5zdG9wLCBzdG9wKSkgcmV0dXJuIC0xOwotCQlpZiAoKnN0b3AgPCAwKSAqc3RvcCArPSBsZW5ndGg7Ci0JCWlmICgqc3RvcCA8IDApICpzdG9wID0gKCpzdGVwIDwgMCkgPyAtMSA6IDA7Ci0JCWlmICgqc3RvcCA+PSBsZW5ndGgpCi0JCQkqc3RvcCA9ICgqc3RlcCA8IDApID8gbGVuZ3RoIC0gMSA6IGxlbmd0aDsKLQl9CisgICAgaWYgKHItPnN0b3AgPT0gUHlfTm9uZSkgeworICAgICAgICAqc3RvcCA9IGRlZnN0b3A7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZiAoIV9QeUV2YWxfU2xpY2VJbmRleChyLT5zdG9wLCBzdG9wKSkgcmV0dXJuIC0xOworICAgICAgICBpZiAoKnN0b3AgPCAwKSAqc3RvcCArPSBsZW5ndGg7CisgICAgICAgIGlmICgqc3RvcCA8IDApICpzdG9wID0gKCpzdGVwIDwgMCkgPyAtMSA6IDA7CisgICAgICAgIGlmICgqc3RvcCA+PSBsZW5ndGgpCisgICAgICAgICAgICAqc3RvcCA9ICgqc3RlcCA8IDApID8gbGVuZ3RoIC0gMSA6IGxlbmd0aDsKKyAgICB9CiAKLQlpZiAoKCpzdGVwIDwgMCAmJiAqc3RvcCA+PSAqc3RhcnQpIAotCSAgICB8fCAoKnN0ZXAgPiAwICYmICpzdGFydCA+PSAqc3RvcCkpIHsKLQkJKnNsaWNlbGVuZ3RoID0gMDsKLQl9Ci0JZWxzZSBpZiAoKnN0ZXAgPCAwKSB7Ci0JCSpzbGljZWxlbmd0aCA9ICgqc3RvcC0qc3RhcnQrMSkvKCpzdGVwKSsxOwotCX0KLQllbHNlIHsKLQkJKnNsaWNlbGVuZ3RoID0gKCpzdG9wLSpzdGFydC0xKS8oKnN0ZXApKzE7Ci0JfQorICAgIGlmICgoKnN0ZXAgPCAwICYmICpzdG9wID49ICpzdGFydCkKKyAgICAgICAgfHwgKCpzdGVwID4gMCAmJiAqc3RhcnQgPj0gKnN0b3ApKSB7CisgICAgICAgICpzbGljZWxlbmd0aCA9IDA7CisgICAgfQorICAgIGVsc2UgaWYgKCpzdGVwIDwgMCkgeworICAgICAgICAqc2xpY2VsZW5ndGggPSAoKnN0b3AtKnN0YXJ0KzEpLygqc3RlcCkrMTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgICpzbGljZWxlbmd0aCA9ICgqc3RvcC0qc3RhcnQtMSkvKCpzdGVwKSsxOworICAgIH0KIAotCXJldHVybiAwOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc2xpY2VfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprdykKIHsKLQlQeU9iamVjdCAqc3RhcnQsICpzdG9wLCAqc3RlcDsKKyAgICBQeU9iamVjdCAqc3RhcnQsICpzdG9wLCAqc3RlcDsKIAotCXN0YXJ0ID0gc3RvcCA9IHN0ZXAgPSBOVUxMOworICAgIHN0YXJ0ID0gc3RvcCA9IHN0ZXAgPSBOVUxMOwogCi0JaWYgKCFfUHlBcmdfTm9LZXl3b3Jkcygic2xpY2UoKSIsIGt3KSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFfUHlBcmdfTm9LZXl3b3Jkcygic2xpY2UoKSIsIGt3KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJzbGljZSIsIDEsIDMsICZzdGFydCwgJnN0b3AsICZzdGVwKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAic2xpY2UiLCAxLCAzLCAmc3RhcnQsICZzdG9wLCAmc3RlcCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JLyogVGhpcyBzd2FwcGluZyBvZiBzdG9wIGFuZCBzdGFydCBpcyB0byBtYWludGFpbiBzaW1pbGFyaXR5IHdpdGgKLQkgICByYW5nZSgpLiAqLwotCWlmIChzdG9wID09IE5VTEwpIHsKLQkJc3RvcCA9IHN0YXJ0OwotCQlzdGFydCA9IE5VTEw7Ci0JfQotCXJldHVybiBQeVNsaWNlX05ldyhzdGFydCwgc3RvcCwgc3RlcCk7CisgICAgLyogVGhpcyBzd2FwcGluZyBvZiBzdG9wIGFuZCBzdGFydCBpcyB0byBtYWludGFpbiBzaW1pbGFyaXR5IHdpdGgKKyAgICAgICByYW5nZSgpLiAqLworICAgIGlmIChzdG9wID09IE5VTEwpIHsKKyAgICAgICAgc3RvcCA9IHN0YXJ0OworICAgICAgICBzdGFydCA9IE5VTEw7CisgICAgfQorICAgIHJldHVybiBQeVNsaWNlX05ldyhzdGFydCwgc3RvcCwgc3RlcCk7CiB9CiAKIFB5RG9jX1NUUlZBUihzbGljZV9kb2MsCkBAIC0yMTgsNTMgKzIxOCw1MyBAQAogc3RhdGljIHZvaWQKIHNsaWNlX2RlYWxsb2MoUHlTbGljZU9iamVjdCAqcikKIHsKLQlQeV9ERUNSRUYoci0+c3RlcCk7Ci0JUHlfREVDUkVGKHItPnN0YXJ0KTsKLQlQeV9ERUNSRUYoci0+c3RvcCk7Ci0JUHlPYmplY3RfRGVsKHIpOworICAgIFB5X0RFQ1JFRihyLT5zdGVwKTsKKyAgICBQeV9ERUNSRUYoci0+c3RhcnQpOworICAgIFB5X0RFQ1JFRihyLT5zdG9wKTsKKyAgICBQeU9iamVjdF9EZWwocik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzbGljZV9yZXByKFB5U2xpY2VPYmplY3QgKnIpCiB7Ci0JUHlPYmplY3QgKnMsICpjb21tYTsKKyAgICBQeU9iamVjdCAqcywgKmNvbW1hOwogCi0JcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoInNsaWNlKCIpOwotCWNvbW1hID0gUHlTdHJpbmdfRnJvbVN0cmluZygiLCAiKTsKLQlQeVN0cmluZ19Db25jYXRBbmREZWwoJnMsIFB5T2JqZWN0X1JlcHIoci0+c3RhcnQpKTsKLQlQeVN0cmluZ19Db25jYXQoJnMsIGNvbW1hKTsKLQlQeVN0cmluZ19Db25jYXRBbmREZWwoJnMsIFB5T2JqZWN0X1JlcHIoci0+c3RvcCkpOwotCVB5U3RyaW5nX0NvbmNhdCgmcywgY29tbWEpOwotCVB5U3RyaW5nX0NvbmNhdEFuZERlbCgmcywgUHlPYmplY3RfUmVwcihyLT5zdGVwKSk7Ci0JUHlTdHJpbmdfQ29uY2F0QW5kRGVsKCZzLCBQeVN0cmluZ19Gcm9tU3RyaW5nKCIpIikpOwotCVB5X0RFQ1JFRihjb21tYSk7Ci0JcmV0dXJuIHM7CisgICAgcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoInNsaWNlKCIpOworICAgIGNvbW1hID0gUHlTdHJpbmdfRnJvbVN0cmluZygiLCAiKTsKKyAgICBQeVN0cmluZ19Db25jYXRBbmREZWwoJnMsIFB5T2JqZWN0X1JlcHIoci0+c3RhcnQpKTsKKyAgICBQeVN0cmluZ19Db25jYXQoJnMsIGNvbW1hKTsKKyAgICBQeVN0cmluZ19Db25jYXRBbmREZWwoJnMsIFB5T2JqZWN0X1JlcHIoci0+c3RvcCkpOworICAgIFB5U3RyaW5nX0NvbmNhdCgmcywgY29tbWEpOworICAgIFB5U3RyaW5nX0NvbmNhdEFuZERlbCgmcywgUHlPYmplY3RfUmVwcihyLT5zdGVwKSk7CisgICAgUHlTdHJpbmdfQ29uY2F0QW5kRGVsKCZzLCBQeVN0cmluZ19Gcm9tU3RyaW5nKCIpIikpOworICAgIFB5X0RFQ1JFRihjb21tYSk7CisgICAgcmV0dXJuIHM7CiB9CiAKIHN0YXRpYyBQeU1lbWJlckRlZiBzbGljZV9tZW1iZXJzW10gPSB7Ci0JeyJzdGFydCIsIFRfT0JKRUNULCBvZmZzZXRvZihQeVNsaWNlT2JqZWN0LCBzdGFydCksIFJFQURPTkxZfSwKLQl7InN0b3AiLCBUX09CSkVDVCwgb2Zmc2V0b2YoUHlTbGljZU9iamVjdCwgc3RvcCksIFJFQURPTkxZfSwKLQl7InN0ZXAiLCBUX09CSkVDVCwgb2Zmc2V0b2YoUHlTbGljZU9iamVjdCwgc3RlcCksIFJFQURPTkxZfSwKLQl7MH0KKyAgICB7InN0YXJ0IiwgVF9PQkpFQ1QsIG9mZnNldG9mKFB5U2xpY2VPYmplY3QsIHN0YXJ0KSwgUkVBRE9OTFl9LAorICAgIHsic3RvcCIsIFRfT0JKRUNULCBvZmZzZXRvZihQeVNsaWNlT2JqZWN0LCBzdG9wKSwgUkVBRE9OTFl9LAorICAgIHsic3RlcCIsIFRfT0JKRUNULCBvZmZzZXRvZihQeVNsaWNlT2JqZWN0LCBzdGVwKSwgUkVBRE9OTFl9LAorICAgIHswfQogfTsKIAogc3RhdGljIFB5T2JqZWN0Kgogc2xpY2VfaW5kaWNlcyhQeVNsaWNlT2JqZWN0KiBzZWxmLCBQeU9iamVjdCogbGVuKQogewotCVB5X3NzaXplX3QgaWxlbiwgc3RhcnQsIHN0b3AsIHN0ZXAsIHNsaWNlbGVuZ3RoOworICAgIFB5X3NzaXplX3QgaWxlbiwgc3RhcnQsIHN0b3AsIHN0ZXAsIHNsaWNlbGVuZ3RoOwogCi0JaWxlbiA9IFB5TnVtYmVyX0FzU3NpemVfdChsZW4sIFB5RXhjX092ZXJmbG93RXJyb3IpOworICAgIGlsZW4gPSBQeU51bWJlcl9Bc1NzaXplX3QobGVuLCBQeUV4Y19PdmVyZmxvd0Vycm9yKTsKIAotCWlmIChpbGVuID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpIHsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChpbGVuID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaWYgKFB5U2xpY2VfR2V0SW5kaWNlc0V4KHNlbGYsIGlsZW4sICZzdGFydCwgJnN0b3AsIAotCQkJCSAmc3RlcCwgJnNsaWNlbGVuZ3RoKSA8IDApIHsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChQeVNsaWNlX0dldEluZGljZXNFeChzZWxmLCBpbGVuLCAmc3RhcnQsICZzdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RlcCwgJnNsaWNlbGVuZ3RoKSA8IDApIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihubm4pIiwgc3RhcnQsIHN0b3AsIHN0ZXApOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIobm5uKSIsIHN0YXJ0LCBzdG9wLCBzdGVwKTsKIH0KIAogUHlEb2NfU1RSVkFSKHNsaWNlX2luZGljZXNfZG9jLApAQCAtMjc4LDg0ICsyNzgsODQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzbGljZV9yZWR1Y2UoUHlTbGljZU9iamVjdCogc2VsZikKIHsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyhPT08pIiwgUHlfVFlQRShzZWxmKSwgc2VsZi0+c3RhcnQsIHNlbGYtPnN0b3AsIHNlbGYtPnN0ZXApOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPKE9PTykiLCBQeV9UWVBFKHNlbGYpLCBzZWxmLT5zdGFydCwgc2VsZi0+c3RvcCwgc2VsZi0+c3RlcCk7CiB9CiAKIFB5RG9jX1NUUlZBUihyZWR1Y2VfZG9jLCAiUmV0dXJuIHN0YXRlIGluZm9ybWF0aW9uIGZvciBwaWNrbGluZy4iKTsKIAogc3RhdGljIFB5TWV0aG9kRGVmIHNsaWNlX21ldGhvZHNbXSA9IHsKLQl7ImluZGljZXMiLAkoUHlDRnVuY3Rpb24pc2xpY2VfaW5kaWNlcywKLQkgTUVUSF9PLAlzbGljZV9pbmRpY2VzX2RvY30sCi0JeyJfX3JlZHVjZV9fIiwJKFB5Q0Z1bmN0aW9uKXNsaWNlX3JlZHVjZSwKLQkgTUVUSF9OT0FSR1MsCXJlZHVjZV9kb2N9LAotCXtOVUxMLCBOVUxMfQorICAgIHsiaW5kaWNlcyIsICAgICAgICAgKFB5Q0Z1bmN0aW9uKXNsaWNlX2luZGljZXMsCisgICAgIE1FVEhfTywgICAgICAgICAgICBzbGljZV9pbmRpY2VzX2RvY30sCisgICAgeyJfX3JlZHVjZV9fIiwgICAgICAoUHlDRnVuY3Rpb24pc2xpY2VfcmVkdWNlLAorICAgICBNRVRIX05PQVJHUywgICAgICAgcmVkdWNlX2RvY30sCisgICAge05VTEwsIE5VTEx9CiB9OwogCiBzdGF0aWMgaW50CiBzbGljZV9jb21wYXJlKFB5U2xpY2VPYmplY3QgKnYsIFB5U2xpY2VPYmplY3QgKncpCiB7Ci0JaW50IHJlc3VsdCA9IDA7CisgICAgaW50IHJlc3VsdCA9IDA7CiAKLSAgICAgICAgaWYgKHYgPT0gdykKLQkJcmV0dXJuIDA7CisgICAgaWYgKHYgPT0gdykKKyAgICAgICAgcmV0dXJuIDA7CiAKLQlpZiAoUHlPYmplY3RfQ21wKHYtPnN0YXJ0LCB3LT5zdGFydCwgJnJlc3VsdCkgPCAwKQotCSAgICByZXR1cm4gLTI7Ci0JaWYgKHJlc3VsdCAhPSAwKQotCQlyZXR1cm4gcmVzdWx0OwotCWlmIChQeU9iamVjdF9DbXAodi0+c3RvcCwgdy0+c3RvcCwgJnJlc3VsdCkgPCAwKQotCSAgICByZXR1cm4gLTI7Ci0JaWYgKHJlc3VsdCAhPSAwKQotCQlyZXR1cm4gcmVzdWx0OwotCWlmIChQeU9iamVjdF9DbXAodi0+c3RlcCwgdy0+c3RlcCwgJnJlc3VsdCkgPCAwKQotCSAgICByZXR1cm4gLTI7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBpZiAoUHlPYmplY3RfQ21wKHYtPnN0YXJ0LCB3LT5zdGFydCwgJnJlc3VsdCkgPCAwKQorICAgICAgICByZXR1cm4gLTI7CisgICAgaWYgKHJlc3VsdCAhPSAwKQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIGlmIChQeU9iamVjdF9DbXAodi0+c3RvcCwgdy0+c3RvcCwgJnJlc3VsdCkgPCAwKQorICAgICAgICByZXR1cm4gLTI7CisgICAgaWYgKHJlc3VsdCAhPSAwKQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIGlmIChQeU9iamVjdF9DbXAodi0+c3RlcCwgdy0+c3RlcCwgJnJlc3VsdCkgPCAwKQorICAgICAgICByZXR1cm4gLTI7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIGxvbmcKIHNsaWNlX2hhc2goUHlTbGljZU9iamVjdCAqdikKIHsKLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAidW5oYXNoYWJsZSB0eXBlIik7Ci0JcmV0dXJuIC0xTDsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAidW5oYXNoYWJsZSB0eXBlIik7CisgICAgcmV0dXJuIC0xTDsKIH0KIAogUHlUeXBlT2JqZWN0IFB5U2xpY2VfVHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQotCSJzbGljZSIsCQkvKiBOYW1lIG9mIHRoaXMgdHlwZSAqLwotCXNpemVvZihQeVNsaWNlT2JqZWN0KSwJLyogQmFzaWMgb2JqZWN0IHNpemUgKi8KLQkwLAkJCS8qIEl0ZW0gc2l6ZSBmb3IgdmFyb2JqZWN0ICovCi0JKGRlc3RydWN0b3Ipc2xpY2VfZGVhbGxvYywJCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRyICovCi0JKGNtcGZ1bmMpc2xpY2VfY29tcGFyZSwgCQkvKiB0cF9jb21wYXJlICovCi0JKHJlcHJmdW5jKXNsaWNlX3JlcHIsICAgCQkvKiB0cF9yZXByICovCi0JMCwJCQkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCSAgICAJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYylzbGljZV9oYXNoLAkJCS8qIHRwX2hhc2ggKi8KLQkwLAkJCQkJLyogdHBfY2FsbCAqLwotCTAsCQkJCQkvKiB0cF9zdHIgKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCwJCQkvKiB0cF9mbGFncyAqLwotCXNsaWNlX2RvYywJCQkJLyogdHBfZG9jICovCi0JMCwJCQkJCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkJLyogdHBfaXRlcm5leHQgKi8KLQlzbGljZV9tZXRob2RzLAkJCQkvKiB0cF9tZXRob2RzICovCi0Jc2xpY2VfbWVtYmVycywJCQkJLyogdHBfbWVtYmVycyAqLwotCTAsCQkJCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCQkvKiB0cF9kaWN0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KLQkwLAkJCQkJLyogdHBfZGljdG9mZnNldCAqLwotCTAsCQkJCQkvKiB0cF9pbml0ICovCi0JMCwJCQkJCS8qIHRwX2FsbG9jICovCi0Jc2xpY2VfbmV3LAkJCQkvKiB0cF9uZXcgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQorICAgICJzbGljZSIsICAgICAgICAgICAgICAgICAgICAvKiBOYW1lIG9mIHRoaXMgdHlwZSAqLworICAgIHNpemVvZihQeVNsaWNlT2JqZWN0KSwgICAgICAvKiBCYXNpYyBvYmplY3Qgc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJdGVtIHNpemUgZm9yIHZhcm9iamVjdCAqLworICAgIChkZXN0cnVjdG9yKXNsaWNlX2RlYWxsb2MsICAgICAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAoY21wZnVuYylzbGljZV9jb21wYXJlLCAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAocmVwcmZ1bmMpc2xpY2VfcmVwciwgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAoaGFzaGZ1bmMpc2xpY2VfaGFzaCwgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCisgICAgc2xpY2VfZG9jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIHNsaWNlX21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIHNsaWNlX21lbWJlcnMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBzbGljZV9uZXcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLwogfTsKZGlmZiAtLWdpdCBhL09iamVjdHMvc3RyaW5nbGliL2Zvcm1hdHRlci5oIGIvT2JqZWN0cy9zdHJpbmdsaWIvZm9ybWF0dGVyLmgKaW5kZXggZDhlNjZhNi4uZTk0OTVjOSAxMDA2NDQKLS0tIGEvT2JqZWN0cy9zdHJpbmdsaWIvZm9ybWF0dGVyLmgKKysrIGIvT2JqZWN0cy9zdHJpbmdsaWIvZm9ybWF0dGVyLmgKQEAgLTEzMiw3ICsxMzIsNyBAQAogKi8KIHN0YXRpYyBpbnQKIHBhcnNlX2ludGVybmFsX3JlbmRlcl9mb3JtYXRfc3BlYyhTVFJJTkdMSUJfQ0hBUiAqZm9ybWF0X3NwZWMsCi0JCQkJICBQeV9zc2l6ZV90IGZvcm1hdF9zcGVjX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IGZvcm1hdF9zcGVjX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlcm5hbEZvcm1hdFNwZWMgKmZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGRlZmF1bHRfdHlwZSkKIHsKQEAgLTE3OCw4ICsxNzgsOCBAQAogICAgIC8qIElmIHRoZSBuZXh0IGNoYXJhY3RlciBpcyAjLCB3ZSdyZSBpbiBhbHRlcm5hdGUgbW9kZS4gIFRoaXMgb25seQogICAgICAgIGFwcGxpZXMgdG8gaW50ZWdlcnMuICovCiAgICAgaWYgKGVuZC1wdHIgPj0gMSAmJiBwdHJbMF0gPT0gJyMnKSB7Ci0JZm9ybWF0LT5hbHRlcm5hdGUgPSAxOwotCSsrcHRyOworICAgICAgICBmb3JtYXQtPmFsdGVybmF0ZSA9IDE7CisgICAgICAgICsrcHRyOwogICAgIH0KIAogICAgIC8qIFRoZSBzcGVjaWFsIGNhc2UgZm9yIDAtcGFkZGluZyAoYmFja3dhcmRzIGNvbXBhdCkgKi8KQEAgLTI1OSw4ICsyNTksOCBAQAogICAgYW5kIG1vcmUgZWZmaWNpZW50IGVub3VnaCB0byBqdXN0aWZ5IGEgbGl0dGxlIG9iZnVzY2F0aW9uPyAqLwogc3RhdGljIHZvaWQKIGNhbGNfbnVtYmVyX3dpZHRocyhOdW1iZXJGaWVsZFdpZHRocyAqc3BlYywgU1RSSU5HTElCX0NIQVIgYWN0dWFsX3NpZ24sCi0JCSAgIFB5X3NzaXplX3Qgbl9wcmVmaXgsIFB5X3NzaXplX3Qgbl9kaWdpdHMsCi0JCSAgIGNvbnN0IEludGVybmFsRm9ybWF0U3BlYyAqZm9ybWF0KQorICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3Qgbl9wcmVmaXgsIFB5X3NzaXplX3Qgbl9kaWdpdHMsCisgICAgICAgICAgICAgICAgICAgY29uc3QgSW50ZXJuYWxGb3JtYXRTcGVjICpmb3JtYXQpCiB7CiAgICAgc3BlYy0+bl9scGFkZGluZyA9IDA7CiAgICAgc3BlYy0+bl9wcmVmaXggPSAwOwpAQCAtMzI3LDcgKzMyNyw3IEBACiAgICAgZWxzZSB7CiAgICAgICAgIC8qIHNlZSBpZiBhbnkgcGFkZGluZyBpcyBuZWVkZWQgKi8KICAgICAgICAgaWYgKHNwZWMtPm5fbHNpZ24gKyBuX2RpZ2l0cyArIHNwZWMtPm5fcnNpZ24gKwotCSAgICAgICAgc3BlYy0+bl9wcmVmaXggPj0gZm9ybWF0LT53aWR0aCkgeworICAgICAgICAgICAgICAgIHNwZWMtPm5fcHJlZml4ID49IGZvcm1hdC0+d2lkdGgpIHsKICAgICAgICAgICAgIC8qIG5vIHBhZGRpbmcgbmVlZGVkLCB3ZSdyZSBhbHJlYWR5IGJpZ2dlciB0aGFuIHRoZQogICAgICAgICAgICAgICAgcmVxdWVzdGVkIHdpZHRoICovCiAgICAgICAgIH0KQEAgLTMzNSw4ICszMzUsOCBAQAogICAgICAgICAgICAgLyogZGV0ZXJtaW5lIHdoaWNoIG9mIGxlZnQsIHNwYWNlLCBvciByaWdodCBwYWRkaW5nIGlzCiAgICAgICAgICAgICAgICBuZWVkZWQgKi8KICAgICAgICAgICAgIFB5X3NzaXplX3QgcGFkZGluZyA9IGZvcm1hdC0+d2lkdGggLQotCQkgICAgICAgICAgICAgICAgICAgIChzcGVjLT5uX2xzaWduICsgc3BlYy0+bl9wcmVmaXggKwotCQkJCSAgICAgbl9kaWdpdHMgKyBzcGVjLT5uX3JzaWduKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzcGVjLT5uX2xzaWduICsgc3BlYy0+bl9wcmVmaXggKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5fZGlnaXRzICsgc3BlYy0+bl9yc2lnbik7CiAgICAgICAgICAgICBpZiAoZm9ybWF0LT5hbGlnbiA9PSAnPCcpCiAgICAgICAgICAgICAgICAgc3BlYy0+bl9ycGFkZGluZyA9IHBhZGRpbmc7CiAgICAgICAgICAgICBlbHNlIGlmIChmb3JtYXQtPmFsaWduID09ICc+JykKQEAgLTM1Miw3ICszNTIsNyBAQAogICAgICAgICB9CiAgICAgfQogICAgIHNwZWMtPm5fdG90YWwgPSBzcGVjLT5uX2xwYWRkaW5nICsgc3BlYy0+bl9sc2lnbiArIHNwZWMtPm5fcHJlZml4ICsKLQkgICAgc3BlYy0+bl9zcGFkZGluZyArIG5fZGlnaXRzICsgc3BlYy0+bl9yc2lnbiArIHNwZWMtPm5fcnBhZGRpbmc7CisgICAgICAgICAgICBzcGVjLT5uX3NwYWRkaW5nICsgbl9kaWdpdHMgKyBzcGVjLT5uX3JzaWduICsgc3BlYy0+bl9ycGFkZGluZzsKIH0KIAogLyogZmlsbCBpbiB0aGUgbm9uLWRpZ2l0IHBhcnRzIG9mIGEgbnVtYmVycydzIHN0cmluZyByZXByZXNlbnRhdGlvbiwKQEAgLTM2MCw4ICszNjAsOCBAQAogICAgd2hlcmUgdGhlIGRpZ2l0cyBnby4gKi8KIHN0YXRpYyBTVFJJTkdMSUJfQ0hBUiAqCiBmaWxsX25vbl9kaWdpdHMoU1RSSU5HTElCX0NIQVIgKnBfYnVmLCBjb25zdCBOdW1iZXJGaWVsZFdpZHRocyAqc3BlYywKLQkJU1RSSU5HTElCX0NIQVIgKnByZWZpeCwgUHlfc3NpemVfdCBuX2RpZ2l0cywKLQkJU1RSSU5HTElCX0NIQVIgZmlsbF9jaGFyKQorICAgICAgICAgICAgICAgIFNUUklOR0xJQl9DSEFSICpwcmVmaXgsIFB5X3NzaXplX3Qgbl9kaWdpdHMsCisgICAgICAgICAgICAgICAgU1RSSU5HTElCX0NIQVIgZmlsbF9jaGFyKQogewogICAgIFNUUklOR0xJQl9DSEFSICpwX2RpZ2l0czsKIApAQCAtMzczLDEwICszNzMsMTAgQEAKICAgICAgICAgKnBfYnVmKysgPSBzcGVjLT5sc2lnbjsKICAgICB9CiAgICAgaWYgKHNwZWMtPm5fcHJlZml4KSB7Ci0JbWVtbW92ZShwX2J1ZiwKLQkJcHJlZml4LAotCQlzcGVjLT5uX3ByZWZpeCAqIHNpemVvZihTVFJJTkdMSUJfQ0hBUikpOwotCXBfYnVmICs9IHNwZWMtPm5fcHJlZml4OworICAgICAgICBtZW1tb3ZlKHBfYnVmLAorICAgICAgICAgICAgICAgIHByZWZpeCwKKyAgICAgICAgICAgICAgICBzcGVjLT5uX3ByZWZpeCAqIHNpemVvZihTVFJJTkdMSUJfQ0hBUikpOworICAgICAgICBwX2J1ZiArPSBzcGVjLT5uX3ByZWZpeDsKICAgICB9CiAgICAgaWYgKHNwZWMtPm5fc3BhZGRpbmcpIHsKICAgICAgICAgU1RSSU5HTElCX0ZJTEwocF9idWYsIGZpbGxfY2hhciwgc3BlYy0+bl9zcGFkZGluZyk7CkBAIC00MjAsNyArNDIwLDcgQEAKICAgICBpZiAoZm9ybWF0LT5hbHRlcm5hdGUpIHsKICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAiQWx0ZXJuYXRlIGZvcm0gKCMpIG5vdCBhbGxvd2VkIGluIHN0cmluZyBmb3JtYXQgIgotCQkJInNwZWNpZmllciIpOworICAgICAgICAgICAgICAgICAgICAgICAgInNwZWNpZmllciIpOwogICAgICAgICBnb3RvIGRvbmU7CiAgICAgfQogCkBAIC01MDQsNyArNTA0LDcgQEAKIAogc3RhdGljIFB5T2JqZWN0ICoKIGZvcm1hdF9pbnRfb3JfbG9uZ19pbnRlcm5hbChQeU9iamVjdCAqdmFsdWUsIGNvbnN0IEludGVybmFsRm9ybWF0U3BlYyAqZm9ybWF0LAotCQkJICAgIEludE9yTG9uZ1RvU3RyaW5nIHRvc3RyaW5nKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludE9yTG9uZ1RvU3RyaW5nIHRvc3RyaW5nKQogewogICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOwogICAgIFB5T2JqZWN0ICp0bXAgPSBOVUxMOwpAQCAtNTE2LDggKzUxNiw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nICovCiAgICAgUHlfc3NpemVfdCBuX2xlYWRpbmdfY2hhcnM7CiAgICAgUHlfc3NpemVfdCBuX2dyb3VwaW5nX2NoYXJzID0gMDsgLyogQ291bnQgb2YgYWRkaXRpb25hbCBjaGFycyB0bwotCQkJCQlhbGxvY2F0ZSwgdXNlZCBmb3IgJ24nCi0JCQkJCWZvcm1hdHRpbmcuICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdGUsIHVzZWQgZm9yICduJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHRpbmcuICovCiAgICAgUHlfc3NpemVfdCBuX3ByZWZpeCA9IDA7ICAgLyogQ291bnQgb2YgcHJlZml4IGNoYXJzLCAoZS5nLiwgJzB4JykgKi8KICAgICBTVFJJTkdMSUJfQ0hBUiAqcHJlZml4ID0gTlVMTDsKICAgICBOdW1iZXJGaWVsZFdpZHRocyBzcGVjOwpAQCAtNTYyLDMxICs1NjIsMzEgQEAKICAgICAgICAgICAgIGdvdG8gZG9uZTsKICAgICAgICAgfQogI2VuZGlmCi0JbnVtZXJpY19jaGFyID0gKFNUUklOR0xJQl9DSEFSKXg7Ci0JcG51bWVyaWNfY2hhcnMgPSAmbnVtZXJpY19jaGFyOworICAgICAgICBudW1lcmljX2NoYXIgPSAoU1RSSU5HTElCX0NIQVIpeDsKKyAgICAgICAgcG51bWVyaWNfY2hhcnMgPSAmbnVtZXJpY19jaGFyOwogICAgICAgICBuX2RpZ2l0cyA9IDE7CiAgICAgfQogICAgIGVsc2UgewogICAgICAgICBpbnQgYmFzZTsKLQlpbnQgbGVhZGluZ19jaGFyc190b19za2lwID0gMDsgIC8qIE51bWJlciBvZiBjaGFyYWN0ZXJzIGFkZGVkIGJ5Ci0JCQkJICAgICAgICAgICBQeU51bWJlcl9Ub0Jhc2UgdGhhdCB3ZSB3YW50IHRvCi0JCQkJICAgICAgICAgICBza2lwIG92ZXIuICovCisgICAgICAgIGludCBsZWFkaW5nX2NoYXJzX3RvX3NraXAgPSAwOyAgLyogTnVtYmVyIG9mIGNoYXJhY3RlcnMgYWRkZWQgYnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU51bWJlcl9Ub0Jhc2UgdGhhdCB3ZSB3YW50IHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCBvdmVyLiAqLwogCiAgICAgICAgIC8qIENvbXB1dGUgdGhlIGJhc2UgYW5kIGhvdyBtYW55IGNoYXJhY3RlcnMgd2lsbCBiZSBhZGRlZCBieQogICAgICAgICAgICBQeU51bWJlcl9Ub0Jhc2UgKi8KICAgICAgICAgc3dpdGNoIChmb3JtYXQtPnR5cGUpIHsKICAgICAgICAgY2FzZSAnYic6CiAgICAgICAgICAgICBiYXNlID0gMjsKLQkgICAgbGVhZGluZ19jaGFyc190b19za2lwID0gMjsgLyogMGIgKi8KKyAgICAgICAgICAgIGxlYWRpbmdfY2hhcnNfdG9fc2tpcCA9IDI7IC8qIDBiICovCiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAnbyc6CiAgICAgICAgICAgICBiYXNlID0gODsKLQkgICAgbGVhZGluZ19jaGFyc190b19za2lwID0gMjsgLyogMG8gKi8KKyAgICAgICAgICAgIGxlYWRpbmdfY2hhcnNfdG9fc2tpcCA9IDI7IC8qIDBvICovCiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAneCc6CiAgICAgICAgIGNhc2UgJ1gnOgogICAgICAgICAgICAgYmFzZSA9IDE2OwotCSAgICBsZWFkaW5nX2NoYXJzX3RvX3NraXAgPSAyOyAvKiAweCAqLworICAgICAgICAgICAgbGVhZGluZ19jaGFyc190b19za2lwID0gMjsgLyogMHggKi8KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OiAgLyogc2hvdWxkbid0IGJlIG5lZWRlZCwgYnV0IHN0b3BzIGEgY29tcGlsZXIgd2FybmluZyAqLwogICAgICAgICBjYXNlICdkJzoKQEAgLTU5NSw1MiArNTk1LDUyIEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCi0JLyogVGhlIG51bWJlciBvZiBwcmVmaXggY2hhcnMgaXMgdGhlIHNhbWUgYXMgdGhlIGxlYWRpbmcKLQkgICBjaGFycyB0byBza2lwICovCi0JaWYgKGZvcm1hdC0+YWx0ZXJuYXRlKQotCSAgICBuX3ByZWZpeCA9IGxlYWRpbmdfY2hhcnNfdG9fc2tpcDsKKyAgICAgICAgLyogVGhlIG51bWJlciBvZiBwcmVmaXggY2hhcnMgaXMgdGhlIHNhbWUgYXMgdGhlIGxlYWRpbmcKKyAgICAgICAgICAgY2hhcnMgdG8gc2tpcCAqLworICAgICAgICBpZiAoZm9ybWF0LT5hbHRlcm5hdGUpCisgICAgICAgICAgICBuX3ByZWZpeCA9IGxlYWRpbmdfY2hhcnNfdG9fc2tpcDsKIAogICAgICAgICAvKiBEbyB0aGUgaGFyZCBwYXJ0LCBjb252ZXJ0aW5nIHRvIGEgc3RyaW5nIGluIGEgZ2l2ZW4gYmFzZSAqLwotCXRtcCA9IHRvc3RyaW5nKHZhbHVlLCBiYXNlKTsKKyAgICAgICAgdG1wID0gdG9zdHJpbmcodmFsdWUsIGJhc2UpOwogICAgICAgICBpZiAodG1wID09IE5VTEwpCiAgICAgICAgICAgICBnb3RvIGRvbmU7CiAKLQlwbnVtZXJpY19jaGFycyA9IFNUUklOR0xJQl9TVFIodG1wKTsKKyAgICAgICAgcG51bWVyaWNfY2hhcnMgPSBTVFJJTkdMSUJfU1RSKHRtcCk7CiAgICAgICAgIG5fZGlnaXRzID0gU1RSSU5HTElCX0xFTih0bXApOwogCi0JcHJlZml4ID0gcG51bWVyaWNfY2hhcnM7CisgICAgICAgIHByZWZpeCA9IHBudW1lcmljX2NoYXJzOwogCi0JLyogUmVtZW1iZXIgbm90IHRvIG1vZGlmeSB3aGF0IHBudW1lcmljX2NoYXJzIHBvaW50cyB0by4gIGl0Ci0JICAgbWlnaHQgYmUgaW50ZXJuZWQuICBPbmx5IG1vZGlmeSBpdCBhZnRlciB3ZSBjb3B5IGl0IGludG8gYQotCSAgIG5ld2x5IGFsbG9jYXRlZCBvdXRwdXQgYnVmZmVyLiAqLworICAgICAgICAvKiBSZW1lbWJlciBub3QgdG8gbW9kaWZ5IHdoYXQgcG51bWVyaWNfY2hhcnMgcG9pbnRzIHRvLiAgaXQKKyAgICAgICAgICAgbWlnaHQgYmUgaW50ZXJuZWQuICBPbmx5IG1vZGlmeSBpdCBhZnRlciB3ZSBjb3B5IGl0IGludG8gYQorICAgICAgICAgICBuZXdseSBhbGxvY2F0ZWQgb3V0cHV0IGJ1ZmZlci4gKi8KIAogICAgICAgICAvKiBJcyBhIHNpZ24gY2hhcmFjdGVyIHByZXNlbnQgaW4gdGhlIG91dHB1dD8gIElmIHNvLCByZW1lbWJlciBpdAogICAgICAgICAgICBhbmQgc2tpcCBpdCAqLwogICAgICAgICBzaWduID0gcG51bWVyaWNfY2hhcnNbMF07CiAgICAgICAgIGlmIChzaWduID09ICctJykgewotCSAgICArK3ByZWZpeDsKLQkgICAgKytsZWFkaW5nX2NoYXJzX3RvX3NraXA7CisgICAgICAgICAgICArK3ByZWZpeDsKKyAgICAgICAgICAgICsrbGVhZGluZ19jaGFyc190b19za2lwOwogICAgICAgICB9CiAKLQkvKiBTa2lwIG92ZXIgdGhlIGxlYWRpbmcgY2hhcnMgKDB4LCAwYiwgZXRjLikgKi8KLQluX2RpZ2l0cyAtPSBsZWFkaW5nX2NoYXJzX3RvX3NraXA7Ci0JcG51bWVyaWNfY2hhcnMgKz0gbGVhZGluZ19jaGFyc190b19za2lwOworICAgICAgICAvKiBTa2lwIG92ZXIgdGhlIGxlYWRpbmcgY2hhcnMgKDB4LCAwYiwgZXRjLikgKi8KKyAgICAgICAgbl9kaWdpdHMgLT0gbGVhZGluZ19jaGFyc190b19za2lwOworICAgICAgICBwbnVtZXJpY19jaGFycyArPSBsZWFkaW5nX2NoYXJzX3RvX3NraXA7CiAgICAgfQogCiAgICAgaWYgKGZvcm1hdC0+dHlwZSA9PSAnbicpCi0JICAgIC8qIENvbXB1dGUgaG93IG1hbnkgYWRkaXRpb25hbCBjaGFycyB3ZSBuZWVkIHRvIGFsbG9jYXRlCi0JICAgICAgIHRvIGhvbGQgdGhlIHRob3VzYW5kcyBncm91cGluZy4gKi8KLQkgICAgU1RSSU5HTElCX0dST1VQSU5HKE5VTEwsIG5fZGlnaXRzLCBuX2RpZ2l0cywKLQkJCSAgICAgICAwLCAmbl9ncm91cGluZ19jaGFycywgMCk7CisgICAgICAgICAgICAvKiBDb21wdXRlIGhvdyBtYW55IGFkZGl0aW9uYWwgY2hhcnMgd2UgbmVlZCB0byBhbGxvY2F0ZQorICAgICAgICAgICAgICAgdG8gaG9sZCB0aGUgdGhvdXNhbmRzIGdyb3VwaW5nLiAqLworICAgICAgICAgICAgU1RSSU5HTElCX0dST1VQSU5HKE5VTEwsIG5fZGlnaXRzLCBuX2RpZ2l0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAmbl9ncm91cGluZ19jaGFycywgMCk7CiAKICAgICAvKiBDYWxjdWxhdGUgdGhlIHdpZHRocyBvZiB0aGUgdmFyaW91cyBsZWFkaW5nIGFuZCB0cmFpbGluZyBwYXJ0cyAqLwogICAgIGNhbGNfbnVtYmVyX3dpZHRocygmc3BlYywgc2lnbiwgbl9wcmVmaXgsIG5fZGlnaXRzICsgbl9ncm91cGluZ19jaGFycywKLQkJICAgICAgIGZvcm1hdCk7CisgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCk7CiAKICAgICAvKiBBbGxvY2F0ZSBhIG5ldyBzdHJpbmcgdG8gaG9sZCB0aGUgcmVzdWx0ICovCiAgICAgcmVzdWx0ID0gU1RSSU5HTElCX05FVyhOVUxMLCBzcGVjLm5fdG90YWwpOwogICAgIGlmICghcmVzdWx0KQotCWdvdG8gZG9uZTsKKyAgICAgICAgZ290byBkb25lOwogICAgIHAgPSBTVFJJTkdMSUJfU1RSKHJlc3VsdCk7CiAKICAgICAvKiBYWFggVGhlcmUgaXMgdG9vIG11Y2ggbWFnaWMgaGVyZSByZWdhcmRpbmcgdGhlIGludGVybmFscyBvZgpAQCAtNjUxLDQ0ICs2NTEsNDQgQEAKIAogICAgIC8qIEZpbGwgaW4gdGhlIGRpZ2l0IHBhcnRzICovCiAgICAgbl9sZWFkaW5nX2NoYXJzID0gc3BlYy5uX2xwYWRkaW5nICsgc3BlYy5uX2xzaWduICsKLQkgICAgc3BlYy5uX3ByZWZpeCArIHNwZWMubl9zcGFkZGluZzsKKyAgICAgICAgICAgIHNwZWMubl9wcmVmaXggKyBzcGVjLm5fc3BhZGRpbmc7CiAgICAgbWVtbW92ZShwICsgbl9sZWFkaW5nX2NoYXJzLAotCSAgICBwbnVtZXJpY19jaGFycywKLQkgICAgbl9kaWdpdHMgKiBzaXplb2YoU1RSSU5HTElCX0NIQVIpKTsKKyAgICAgICAgICAgIHBudW1lcmljX2NoYXJzLAorICAgICAgICAgICAgbl9kaWdpdHMgKiBzaXplb2YoU1RSSU5HTElCX0NIQVIpKTsKIAogICAgIC8qIElmIHR5cGUgaXMgJ1gnLCBjb252ZXJ0IHRoZSBmaWxsZWQgaW4gZGlnaXRzIHRvIHVwcGVyY2FzZSAqLwogICAgIGlmIChmb3JtYXQtPnR5cGUgPT0gJ1gnKSB7Ci0JUHlfc3NpemVfdCB0OwotCWZvciAodCA9IDA7IHQgPCBuX2RpZ2l0czsgKyt0KQotCSAgICBwW3QgKyBuX2xlYWRpbmdfY2hhcnNdID0gU1RSSU5HTElCX1RPVVBQRVIocFt0ICsgbl9sZWFkaW5nX2NoYXJzXSk7CisgICAgICAgIFB5X3NzaXplX3QgdDsKKyAgICAgICAgZm9yICh0ID0gMDsgdCA8IG5fZGlnaXRzOyArK3QpCisgICAgICAgICAgICBwW3QgKyBuX2xlYWRpbmdfY2hhcnNdID0gU1RSSU5HTElCX1RPVVBQRVIocFt0ICsgbl9sZWFkaW5nX2NoYXJzXSk7CiAgICAgfQogCiAgICAgLyogSW5zZXJ0IHRoZSBncm91cGluZywgaWYgYW55LCBhZnRlciB0aGUgdXBwZXJjYXNpbmcgb2YgdGhlIGRpZ2l0cywgc28KICAgICAgICB3ZSBjYW4gZW5zdXJlIHRoYXQgZ3JvdXBpbmcgY2hhcnMgd29uJ3QgYmUgYWZmZWN0ZWQuICovCiAgICAgaWYgKG5fZ3JvdXBpbmdfY2hhcnMpIHsKLQkgICAgLyogV2Uga25vdyB0aGlzIGNhbid0IGZhaWwsIHNpbmNlIHdlJ3ZlIGFscmVhZHkKLQkgICAgICAgcmVzZXJ2ZWQgZW5vdWdoIHNwYWNlLiAqLwotCSAgICBTVFJJTkdMSUJfQ0hBUiAqcHN0YXJ0ID0gcCArIG5fbGVhZGluZ19jaGFyczsKKyAgICAgICAgICAgIC8qIFdlIGtub3cgdGhpcyBjYW4ndCBmYWlsLCBzaW5jZSB3ZSd2ZSBhbHJlYWR5CisgICAgICAgICAgICAgICByZXNlcnZlZCBlbm91Z2ggc3BhY2UuICovCisgICAgICAgICAgICBTVFJJTkdMSUJfQ0hBUiAqcHN0YXJ0ID0gcCArIG5fbGVhZGluZ19jaGFyczsKICNpZm5kZWYgTkRFQlVHCi0JICAgIGludCByID0KKyAgICAgICAgICAgIGludCByID0KICNlbmRpZgotCQlTVFJJTkdMSUJfR1JPVVBJTkcocHN0YXJ0LCBuX2RpZ2l0cywgbl9kaWdpdHMsCi0JCQkgICBzcGVjLm5fdG90YWwrbl9ncm91cGluZ19jaGFycy1uX2xlYWRpbmdfY2hhcnMsCi0JCQkgICBOVUxMLCAwKTsKLQkgICAgYXNzZXJ0KHIpOworICAgICAgICAgICAgICAgIFNUUklOR0xJQl9HUk9VUElORyhwc3RhcnQsIG5fZGlnaXRzLCBuX2RpZ2l0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWMubl90b3RhbCtuX2dyb3VwaW5nX2NoYXJzLW5fbGVhZGluZ19jaGFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDApOworICAgICAgICAgICAgYXNzZXJ0KHIpOwogICAgIH0KIAogICAgIC8qIEZpbGwgaW4gdGhlIG5vbi1kaWdpdCBwYXJ0cyAocGFkZGluZywgc2lnbiwgZXRjLikgKi8KICAgICBmaWxsX25vbl9kaWdpdHMocCwgJnNwZWMsIHByZWZpeCwgbl9kaWdpdHMgKyBuX2dyb3VwaW5nX2NoYXJzLAotCQkgICAgZm9ybWF0LT5maWxsX2NoYXIgPT0gJ1wwJyA/ICcgJyA6IGZvcm1hdC0+ZmlsbF9jaGFyKTsKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0LT5maWxsX2NoYXIgPT0gJ1wwJyA/ICcgJyA6IGZvcm1hdC0+ZmlsbF9jaGFyKTsKIAogICAgIC8qIElmIHR5cGUgaXMgJ1gnLCB1cHBlcmNhc2UgdGhlIHByZWZpeC4gIFRoaXMgaGFzIHRvIGJlIGRvbmUgYWZ0ZXIgdGhlCiAgICAgICAgcHJlZml4IGlzIGZpbGxlZCBpbiBieSBmaWxsX25vbl9kaWdpdHMgKi8KICAgICBpZiAoZm9ybWF0LT50eXBlID09ICdYJykgewotCVB5X3NzaXplX3QgdDsKLQlmb3IgKHQgPSAwOyB0IDwgbl9wcmVmaXg7ICsrdCkKLQkgICAgcFt0ICsgc3BlYy5uX2xwYWRkaW5nICsgc3BlYy5uX2xzaWduXSA9Ci0JCSAgICBTVFJJTkdMSUJfVE9VUFBFUihwW3QgKyBzcGVjLm5fbHBhZGRpbmcgKyBzcGVjLm5fbHNpZ25dKTsKKyAgICAgICAgUHlfc3NpemVfdCB0OworICAgICAgICBmb3IgKHQgPSAwOyB0IDwgbl9wcmVmaXg7ICsrdCkKKyAgICAgICAgICAgIHBbdCArIHNwZWMubl9scGFkZGluZyArIHNwZWMubl9sc2lnbl0gPQorICAgICAgICAgICAgICAgICAgICBTVFJJTkdMSUJfVE9VUFBFUihwW3QgKyBzcGVjLm5fbHBhZGRpbmcgKyBzcGVjLm5fbHNpZ25dKTsKICAgICB9CiAKIApAQCAtNzIzLDcgKzcyMyw3IEBACiAvKiBtdWNoIG9mIHRoaXMgaXMgdGFrZW4gZnJvbSB1bmljb2Rlb2JqZWN0LmMgKi8KIHN0YXRpYyBQeU9iamVjdCAqCiBmb3JtYXRfZmxvYXRfaW50ZXJuYWwoUHlPYmplY3QgKnZhbHVlLAotCQkgICAgICBjb25zdCBJbnRlcm5hbEZvcm1hdFNwZWMgKmZvcm1hdCkKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnRlcm5hbEZvcm1hdFNwZWMgKmZvcm1hdCkKIHsKICAgICAvKiBmbXQgPSAnJS4nICsgYHByZWNgICsgYHR5cGVgICsgJyUlJwogICAgICAgIHdvcnN0IGNhc2UgbGVuZ3RoID0gMiArIDEwIChsZW4gb2YgSU5UX01BWCkgKyAxICsgMiA9IDE1ICh1c2UgMjApKi8KQEAgLTc2NSw3ICs3NjUsNyBAQAogICAgIGlmIChmb3JtYXQtPmFsdGVybmF0ZSkgewogICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICJBbHRlcm5hdGUgZm9ybSAoIykgbm90IGFsbG93ZWQgaW4gZmxvYXQgZm9ybWF0ICIKLQkJCSJzcGVjaWZpZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICJzcGVjaWZpZXIiKTsKICAgICAgICAgZ290byBkb25lOwogICAgIH0KIApAQCAtNzk2LDcgKzc5Niw3IEBACiAgICAgICAgOC1iaXQgY2hhci4gIHRoaXMgaXMgc2FmZSwgYmVjYXVzZSB3ZSd2ZSByZXN0cmljdGVkIHdoYXQgInR5cGUiCiAgICAgICAgY2FuIGJlICovCiAgICAgUHlPU19zbnByaW50ZihmbXQsIHNpemVvZihmbXQpLCAiJSUuJSIgUFlfRk9STUFUX1NJWkVfVCAiZCVjIiwgcHJlY2lzaW9uLAotCQkgIChjaGFyKXR5cGUpOworICAgICAgICAgICAgICAgICAgKGNoYXIpdHlwZSk7CiAKICAgICAvKiBkbyB0aGUgYWN0dWFsIGZvcm1hdHRpbmcgKi8KICAgICBQeU9TX2FzY2lpX2Zvcm1hdGQoY2hhcmJ1Ziwgc2l6ZW9mKGNoYXJidWYpLCBmbXQsIHgpOwpAQCAtODM4LDExICs4MzgsMTEgQEAKIAogICAgIC8qIEZpbGwgaW4gdGhlIG5vbi1kaWdpdCBwYXJ0cyAocGFkZGluZywgc2lnbiwgZXRjLikgKi8KICAgICBmaWxsX25vbl9kaWdpdHMoU1RSSU5HTElCX1NUUihyZXN1bHQpLCAmc3BlYywgTlVMTCwgbl9kaWdpdHMsCi0JCSAgICBmb3JtYXQtPmZpbGxfY2hhciA9PSAnXDAnID8gJyAnIDogZm9ybWF0LT5maWxsX2NoYXIpOworICAgICAgICAgICAgICAgICAgICBmb3JtYXQtPmZpbGxfY2hhciA9PSAnXDAnID8gJyAnIDogZm9ybWF0LT5maWxsX2NoYXIpOwogCiAgICAgLyogZmlsbCBpbiB0aGUgZGlnaXQgcGFydHMgKi8KICAgICBtZW1tb3ZlKFNUUklOR0xJQl9TVFIocmVzdWx0KSArCi0JICAgICAgIChzcGVjLm5fbHBhZGRpbmcgKyBzcGVjLm5fbHNpZ24gKyBzcGVjLm5fc3BhZGRpbmcpLAorICAgICAgICAgICAgICAgKHNwZWMubl9scGFkZGluZyArIHNwZWMubl9sc2lnbiArIHNwZWMubl9zcGFkZGluZyksCiAgICAgICAgICAgICBwLAogICAgICAgICAgICAgbl9kaWdpdHMgKiBzaXplb2YoU1RSSU5HTElCX0NIQVIpKTsKIApAQCAtODU2LDggKzg1Niw4IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogUHlPYmplY3QgKgogRk9STUFUX1NUUklORyhQeU9iamVjdCAqb2JqLAotCSAgICAgIFNUUklOR0xJQl9DSEFSICpmb3JtYXRfc3BlYywKLQkgICAgICBQeV9zc2l6ZV90IGZvcm1hdF9zcGVjX2xlbikKKyAgICAgICAgICAgICAgU1RSSU5HTElCX0NIQVIgKmZvcm1hdF9zcGVjLAorICAgICAgICAgICAgICBQeV9zc2l6ZV90IGZvcm1hdF9zcGVjX2xlbikKIHsKICAgICBJbnRlcm5hbEZvcm1hdFNwZWMgZm9ybWF0OwogICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOwpAQCAtODcxLDcgKzg3MSw3IEBACiAKICAgICAvKiBwYXJzZSB0aGUgZm9ybWF0X3NwZWMgKi8KICAgICBpZiAoIXBhcnNlX2ludGVybmFsX3JlbmRlcl9mb3JtYXRfc3BlYyhmb3JtYXRfc3BlYywgZm9ybWF0X3NwZWNfbGVuLAotCQkJCQkgICAmZm9ybWF0LCAncycpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmb3JtYXQsICdzJykpCiAgICAgICAgIGdvdG8gZG9uZTsKIAogICAgIC8qIHR5cGUgY29udmVyc2lvbj8gKi8KQEAgLTg5Myw5ICs4OTMsOSBAQAogI2lmIGRlZmluZWQgRk9STUFUX0xPTkcgfHwgZGVmaW5lZCBGT1JNQVRfSU5UCiBzdGF0aWMgUHlPYmplY3QqCiBmb3JtYXRfaW50X29yX2xvbmcoUHlPYmplY3QqIG9iaiwKLQkJICAgU1RSSU5HTElCX0NIQVIgKmZvcm1hdF9zcGVjLAotCQkgICBQeV9zc2l6ZV90IGZvcm1hdF9zcGVjX2xlbiwKLQkJICAgSW50T3JMb25nVG9TdHJpbmcgdG9zdHJpbmcpCisgICAgICAgICAgICAgICAgICAgU1RSSU5HTElCX0NIQVIgKmZvcm1hdF9zcGVjLAorICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgZm9ybWF0X3NwZWNfbGVuLAorICAgICAgICAgICAgICAgICAgIEludE9yTG9uZ1RvU3RyaW5nIHRvc3RyaW5nKQogewogICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOwogICAgIFB5T2JqZWN0ICp0bXAgPSBOVUxMOwpAQCAtOTEwLDggKzkxMCw4IEBACiAKICAgICAvKiBwYXJzZSB0aGUgZm9ybWF0X3NwZWMgKi8KICAgICBpZiAoIXBhcnNlX2ludGVybmFsX3JlbmRlcl9mb3JtYXRfc3BlYyhmb3JtYXRfc3BlYywKLQkJCQkJICAgZm9ybWF0X3NwZWNfbGVuLAotCQkJCQkgICAmZm9ybWF0LCAnZCcpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdF9zcGVjX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZm9ybWF0LCAnZCcpKQogICAgICAgICBnb3RvIGRvbmU7CiAKICAgICAvKiB0eXBlIGNvbnZlcnNpb24/ICovCkBAIC05MjQsOCArOTI0LDggQEAKICAgICBjYXNlICdYJzoKICAgICBjYXNlICduJzoKICAgICAgICAgLyogbm8gdHlwZSBjb252ZXJzaW9uIG5lZWRlZCwgYWxyZWFkeSBhbiBpbnQgKG9yIGxvbmcpLiAgZG8KLQkgICB0aGUgZm9ybWF0dGluZyAqLwotCSAgICByZXN1bHQgPSBmb3JtYXRfaW50X29yX2xvbmdfaW50ZXJuYWwob2JqLCAmZm9ybWF0LCB0b3N0cmluZyk7CisgICAgICAgICAgIHRoZSBmb3JtYXR0aW5nICovCisgICAgICAgICAgICByZXN1bHQgPSBmb3JtYXRfaW50X29yX2xvbmdfaW50ZXJuYWwob2JqLCAmZm9ybWF0LCB0b3N0cmluZyk7CiAgICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSAnZSc6CkBAIC05NzQsMTEgKzk3NCwxMSBAQAogCiBQeU9iamVjdCAqCiBGT1JNQVRfTE9ORyhQeU9iamVjdCAqb2JqLAotCSAgICBTVFJJTkdMSUJfQ0hBUiAqZm9ybWF0X3NwZWMsCi0JICAgIFB5X3NzaXplX3QgZm9ybWF0X3NwZWNfbGVuKQorICAgICAgICAgICAgU1RSSU5HTElCX0NIQVIgKmZvcm1hdF9zcGVjLAorICAgICAgICAgICAgUHlfc3NpemVfdCBmb3JtYXRfc3BlY19sZW4pCiB7CiAgICAgcmV0dXJuIGZvcm1hdF9pbnRfb3JfbG9uZyhvYmosIGZvcm1hdF9zcGVjLCBmb3JtYXRfc3BlY19sZW4sCi0JCQkgICAgICBsb25nX2Zvcm1hdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nX2Zvcm1hdCk7CiB9CiAjZW5kaWYgLyogRk9STUFUX0xPTkcgKi8KIApAQCAtOTk1LDE5ICs5OTUsMTkgQEAKIAogUHlPYmplY3QgKgogRk9STUFUX0lOVChQeU9iamVjdCAqb2JqLAotCSAgIFNUUklOR0xJQl9DSEFSICpmb3JtYXRfc3BlYywKLQkgICBQeV9zc2l6ZV90IGZvcm1hdF9zcGVjX2xlbikKKyAgICAgICAgICAgU1RSSU5HTElCX0NIQVIgKmZvcm1hdF9zcGVjLAorICAgICAgICAgICBQeV9zc2l6ZV90IGZvcm1hdF9zcGVjX2xlbikKIHsKICAgICByZXR1cm4gZm9ybWF0X2ludF9vcl9sb25nKG9iaiwgZm9ybWF0X3NwZWMsIGZvcm1hdF9zcGVjX2xlbiwKLQkJCSAgICAgIGludF9mb3JtYXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50X2Zvcm1hdCk7CiB9CiAjZW5kaWYgLyogRk9STUFUX0lOVCAqLwogCiAjaWZkZWYgRk9STUFUX0ZMT0FUCiBQeU9iamVjdCAqCiBGT1JNQVRfRkxPQVQoUHlPYmplY3QgKm9iaiwKLQkgICAgIFNUUklOR0xJQl9DSEFSICpmb3JtYXRfc3BlYywKLQkgICAgIFB5X3NzaXplX3QgZm9ybWF0X3NwZWNfbGVuKQorICAgICAgICAgICAgIFNUUklOR0xJQl9DSEFSICpmb3JtYXRfc3BlYywKKyAgICAgICAgICAgICBQeV9zc2l6ZV90IGZvcm1hdF9zcGVjX2xlbikKIHsKICAgICBQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKICAgICBJbnRlcm5hbEZvcm1hdFNwZWMgZm9ybWF0OwpAQCAtMTAyMSwxNyArMTAyMSwxNyBAQAogCiAgICAgLyogcGFyc2UgdGhlIGZvcm1hdF9zcGVjICovCiAgICAgaWYgKCFwYXJzZV9pbnRlcm5hbF9yZW5kZXJfZm9ybWF0X3NwZWMoZm9ybWF0X3NwZWMsCi0JCQkJCSAgIGZvcm1hdF9zcGVjX2xlbiwKLQkJCQkJICAgJmZvcm1hdCwgJ1wwJykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0X3NwZWNfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmb3JtYXQsICdcMCcpKQogICAgICAgICBnb3RvIGRvbmU7CiAKICAgICAvKiB0eXBlIGNvbnZlcnNpb24/ICovCiAgICAgc3dpdGNoIChmb3JtYXQudHlwZSkgewogICAgIGNhc2UgJ1wwJzoKLQkvKiAnWicgbWVhbnMgbGlrZSAnZycsIGJ1dCB3aXRoIGF0IGxlYXN0IG9uZSBkZWNpbWFsLiAgU2VlCi0JICAgUHlPU19hc2NpaV9mb3JtYXRkICovCi0JZm9ybWF0LnR5cGUgPSAnWic7Ci0JLyogRGVsaWJlcmF0ZSBmYWxsIHRocm91Z2ggdG8gdGhlIG5leHQgY2FzZSBzdGF0ZW1lbnQgKi8KKyAgICAgICAgLyogJ1onIG1lYW5zIGxpa2UgJ2cnLCBidXQgd2l0aCBhdCBsZWFzdCBvbmUgZGVjaW1hbC4gIFNlZQorICAgICAgICAgICBQeU9TX2FzY2lpX2Zvcm1hdGQgKi8KKyAgICAgICAgZm9ybWF0LnR5cGUgPSAnWic7CisgICAgICAgIC8qIERlbGliZXJhdGUgZmFsbCB0aHJvdWdoIHRvIHRoZSBuZXh0IGNhc2Ugc3RhdGVtZW50ICovCiAgICAgY2FzZSAnZSc6CiAgICAgY2FzZSAnRSc6CiAgICAgY2FzZSAnZic6CmRpZmYgLS1naXQgYS9PYmplY3RzL3N0cmluZ2xpYi9sb2NhbGV1dGlsLmggYi9PYmplY3RzL3N0cmluZ2xpYi9sb2NhbGV1dGlsLmgKaW5kZXggMTEwNTYwOS4uOTczMGM2NyAxMDA2NDQKLS0tIGEvT2JqZWN0cy9zdHJpbmdsaWIvbG9jYWxldXRpbC5oCisrKyBiL09iamVjdHMvc3RyaW5nbGliL2xvY2FsZXV0aWwuaApAQCAtMzQsOTcgKzM0LDk3IEBACiAgKiovCiBpbnQKIF9QeV9JbnNlcnRUaG91c2FuZHNHcm91cGluZyhTVFJJTkdMSUJfQ0hBUiAqYnVmZmVyLAotCQkJICAgIFB5X3NzaXplX3Qgbl9idWZmZXIsCi0JCQkgICAgUHlfc3NpemVfdCBuX2RpZ2l0cywKLQkJCSAgICBQeV9zc2l6ZV90IGJ1Zl9zaXplLAotCQkJICAgIFB5X3NzaXplX3QgKmNvdW50LAotCQkJICAgIGludCBhcHBlbmRfemVyb19jaGFyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3Qgbl9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBuX2RpZ2l0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IGJ1Zl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgKmNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhcHBlbmRfemVyb19jaGFyKQogewotCXN0cnVjdCBsY29udiAqbG9jYWxlX2RhdGEgPSBsb2NhbGVjb252KCk7Ci0JY29uc3QgY2hhciAqZ3JvdXBpbmcgPSBsb2NhbGVfZGF0YS0+Z3JvdXBpbmc7Ci0JY29uc3QgY2hhciAqdGhvdXNhbmRzX3NlcCA9IGxvY2FsZV9kYXRhLT50aG91c2FuZHNfc2VwOwotCVB5X3NzaXplX3QgdGhvdXNhbmRzX3NlcF9sZW4gPSBzdHJsZW4odGhvdXNhbmRzX3NlcCk7Ci0JU1RSSU5HTElCX0NIQVIgKnBlbmQgPSBOVUxMOyAvKiBjdXJyZW50IGVuZCBvZiBidWZmZXIgKi8KLQlTVFJJTkdMSUJfQ0hBUiAqcG1heCA9IE5VTEw7IC8qIG1heCBvZiBidWZmZXIgKi8KLQljaGFyIGN1cnJlbnRfZ3JvdXBpbmc7Ci0JUHlfc3NpemVfdCByZW1haW5pbmcgPSBuX2RpZ2l0czsgLyogTnVtYmVyIG9mIGNoYXJzIHJlbWFpbmluZyB0bwotCQkJCQkgICAgYmUgbG9va2VkIGF0ICovCisgICAgc3RydWN0IGxjb252ICpsb2NhbGVfZGF0YSA9IGxvY2FsZWNvbnYoKTsKKyAgICBjb25zdCBjaGFyICpncm91cGluZyA9IGxvY2FsZV9kYXRhLT5ncm91cGluZzsKKyAgICBjb25zdCBjaGFyICp0aG91c2FuZHNfc2VwID0gbG9jYWxlX2RhdGEtPnRob3VzYW5kc19zZXA7CisgICAgUHlfc3NpemVfdCB0aG91c2FuZHNfc2VwX2xlbiA9IHN0cmxlbih0aG91c2FuZHNfc2VwKTsKKyAgICBTVFJJTkdMSUJfQ0hBUiAqcGVuZCA9IE5VTEw7IC8qIGN1cnJlbnQgZW5kIG9mIGJ1ZmZlciAqLworICAgIFNUUklOR0xJQl9DSEFSICpwbWF4ID0gTlVMTDsgLyogbWF4IG9mIGJ1ZmZlciAqLworICAgIGNoYXIgY3VycmVudF9ncm91cGluZzsKKyAgICBQeV9zc2l6ZV90IHJlbWFpbmluZyA9IG5fZGlnaXRzOyAvKiBOdW1iZXIgb2YgY2hhcnMgcmVtYWluaW5nIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgbG9va2VkIGF0ICovCiAKLQkvKiBJbml0aWFsaXplIHRoZSBjaGFyYWN0ZXIgY291bnQsIGlmIHdlJ3JlIGp1c3QgY291bnRpbmcuICovCi0JaWYgKGNvdW50KQotCQkqY291bnQgPSAwOwotCWVsc2UgewotCQkvKiBXZSdyZSBub3QganVzdCBjb3VudGluZywgd2UncmUgbW9kaWZ5aW5nIGJ1ZmZlciAqLwotCQlwZW5kID0gYnVmZmVyICsgbl9idWZmZXI7Ci0JCXBtYXggPSBidWZmZXIgKyBidWZfc2l6ZTsKLQl9CisgICAgLyogSW5pdGlhbGl6ZSB0aGUgY2hhcmFjdGVyIGNvdW50LCBpZiB3ZSdyZSBqdXN0IGNvdW50aW5nLiAqLworICAgIGlmIChjb3VudCkKKyAgICAgICAgKmNvdW50ID0gMDsKKyAgICBlbHNlIHsKKyAgICAgICAgLyogV2UncmUgbm90IGp1c3QgY291bnRpbmcsIHdlJ3JlIG1vZGlmeWluZyBidWZmZXIgKi8KKyAgICAgICAgcGVuZCA9IGJ1ZmZlciArIG5fYnVmZmVyOworICAgICAgICBwbWF4ID0gYnVmZmVyICsgYnVmX3NpemU7CisgICAgfQogCi0JLyogU3RhcnRpbmcgYXQgdGhlIGVuZCBhbmQgd29ya2luZyByaWdodC10by1sZWZ0LCBrZWVwIHRyYWNrIG9mCi0JICAgd2hhdCBncm91cGluZyBuZWVkcyB0byBiZSBhZGRlZCBhbmQgaW5zZXJ0IHRoYXQuICovCi0JY3VycmVudF9ncm91cGluZyA9ICpncm91cGluZysrOworICAgIC8qIFN0YXJ0aW5nIGF0IHRoZSBlbmQgYW5kIHdvcmtpbmcgcmlnaHQtdG8tbGVmdCwga2VlcCB0cmFjayBvZgorICAgICAgIHdoYXQgZ3JvdXBpbmcgbmVlZHMgdG8gYmUgYWRkZWQgYW5kIGluc2VydCB0aGF0LiAqLworICAgIGN1cnJlbnRfZ3JvdXBpbmcgPSAqZ3JvdXBpbmcrKzsKIAotCS8qIElmIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaXMgMCwgcGVyZm9ybSBubyBncm91cGluZyBhdCBhbGwuICovCi0JaWYgKGN1cnJlbnRfZ3JvdXBpbmcgPT0gMCkKLQkJcmV0dXJuIDE7CisgICAgLyogSWYgdGhlIGZpcnN0IGNoYXJhY3RlciBpcyAwLCBwZXJmb3JtIG5vIGdyb3VwaW5nIGF0IGFsbC4gKi8KKyAgICBpZiAoY3VycmVudF9ncm91cGluZyA9PSAwKQorICAgICAgICByZXR1cm4gMTsKIAotCXdoaWxlIChyZW1haW5pbmcgPiBjdXJyZW50X2dyb3VwaW5nKSB7Ci0JCS8qIEFsd2F5cyBsZWF2ZSBidWZmZXIgYW5kIHBlbmQgdmFsaWQgYXQgdGhlIGVuZCBvZiB0aGlzCi0JCSAgIGxvb3AsIHNpbmNlIHdlIG1pZ2h0IGxlYXZlIHdpdGggYSByZXR1cm4gc3RhdGVtZW50LiAqLworICAgIHdoaWxlIChyZW1haW5pbmcgPiBjdXJyZW50X2dyb3VwaW5nKSB7CisgICAgICAgIC8qIEFsd2F5cyBsZWF2ZSBidWZmZXIgYW5kIHBlbmQgdmFsaWQgYXQgdGhlIGVuZCBvZiB0aGlzCisgICAgICAgICAgIGxvb3AsIHNpbmNlIHdlIG1pZ2h0IGxlYXZlIHdpdGggYSByZXR1cm4gc3RhdGVtZW50LiAqLwogCi0JCXJlbWFpbmluZyAtPSBjdXJyZW50X2dyb3VwaW5nOwotCQlpZiAoY291bnQpIHsKLQkJCS8qIFdlJ3JlIG9ubHkgY291bnRpbmcsIG5vdCB0b3VjaGluZyB0aGUgbWVtb3J5LiAqLwotCQkJKmNvdW50ICs9IHRob3VzYW5kc19zZXBfbGVuOwotCQl9Ci0JCWVsc2UgewotCQkJLyogRG8gdGhlIGZvcm1hdHRpbmcuICovCisgICAgICAgIHJlbWFpbmluZyAtPSBjdXJyZW50X2dyb3VwaW5nOworICAgICAgICBpZiAoY291bnQpIHsKKyAgICAgICAgICAgIC8qIFdlJ3JlIG9ubHkgY291bnRpbmcsIG5vdCB0b3VjaGluZyB0aGUgbWVtb3J5LiAqLworICAgICAgICAgICAgKmNvdW50ICs9IHRob3VzYW5kc19zZXBfbGVuOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLyogRG8gdGhlIGZvcm1hdHRpbmcuICovCiAKLQkJCVNUUklOR0xJQl9DSEFSICpwbGFzdCA9IGJ1ZmZlciArIHJlbWFpbmluZzsKKyAgICAgICAgICAgIFNUUklOR0xJQl9DSEFSICpwbGFzdCA9IGJ1ZmZlciArIHJlbWFpbmluZzsKIAotCQkJLyogSXMgdGhlcmUgcm9vbSB0byBpbnNlcnQgdGhvdXNhbmRzX3NlcF9sZW4gY2hhcnM/ICovCi0JCQlpZiAocG1heCAtIHBlbmQgPCB0aG91c2FuZHNfc2VwX2xlbikKLQkJCQkvKiBObyByb29tLiAqLwotCQkJCXJldHVybiAwOworICAgICAgICAgICAgLyogSXMgdGhlcmUgcm9vbSB0byBpbnNlcnQgdGhvdXNhbmRzX3NlcF9sZW4gY2hhcnM/ICovCisgICAgICAgICAgICBpZiAocG1heCAtIHBlbmQgPCB0aG91c2FuZHNfc2VwX2xlbikKKyAgICAgICAgICAgICAgICAvKiBObyByb29tLiAqLworICAgICAgICAgICAgICAgIHJldHVybiAwOwogCi0JCQkvKiBNb3ZlIHRoZSByZXN0IG9mIHRoZSBzdHJpbmcgZG93bi4gKi8KLQkJCW1lbW1vdmUocGxhc3QgKyB0aG91c2FuZHNfc2VwX2xlbiwKLQkJCQlwbGFzdCwKLQkJCQkocGVuZCAtIHBsYXN0KSAqIHNpemVvZihTVFJJTkdMSUJfQ0hBUikpOwotCQkJLyogQ29weSB0aGUgdGhvdXNhbmRzX3NlcCBjaGFycyBpbnRvIHRoZSBidWZmZXIuICovCisgICAgICAgICAgICAvKiBNb3ZlIHRoZSByZXN0IG9mIHRoZSBzdHJpbmcgZG93bi4gKi8KKyAgICAgICAgICAgIG1lbW1vdmUocGxhc3QgKyB0aG91c2FuZHNfc2VwX2xlbiwKKyAgICAgICAgICAgICAgICBwbGFzdCwKKyAgICAgICAgICAgICAgICAocGVuZCAtIHBsYXN0KSAqIHNpemVvZihTVFJJTkdMSUJfQ0hBUikpOworICAgICAgICAgICAgLyogQ29weSB0aGUgdGhvdXNhbmRzX3NlcCBjaGFycyBpbnRvIHRoZSBidWZmZXIuICovCiAjaWYgU1RSSU5HTElCX0lTX1VOSUNPREUKLQkJCS8qIENvbnZlcnQgZnJvbSB0aGUgY2hhcidzIG9mIHRoZSB0aG91c2FuZHNfc2VwIGZyb20KLQkJCSAgIHRoZSBsb2NhbGUgaW50byB1bmljb2RlLiAqLwotCQkJewotCQkJCVB5X3NzaXplX3QgaTsKLQkJCQlmb3IgKGkgPSAwOyBpIDwgdGhvdXNhbmRzX3NlcF9sZW47ICsraSkKLQkJCQkJcGxhc3RbaV0gPSB0aG91c2FuZHNfc2VwW2ldOwotCQkJfQorICAgICAgICAgICAgLyogQ29udmVydCBmcm9tIHRoZSBjaGFyJ3Mgb2YgdGhlIHRob3VzYW5kc19zZXAgZnJvbQorICAgICAgICAgICAgICAgdGhlIGxvY2FsZSBpbnRvIHVuaWNvZGUuICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBpOworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0aG91c2FuZHNfc2VwX2xlbjsgKytpKQorICAgICAgICAgICAgICAgICAgICBwbGFzdFtpXSA9IHRob3VzYW5kc19zZXBbaV07CisgICAgICAgICAgICB9CiAjZWxzZQotCQkJLyogTm8gY29udmVyc2lvbiwganVzdCBtZW1jcHkgdGhlIHRob3VzYW5kc19zZXAuICovCi0JCQltZW1jcHkocGxhc3QsIHRob3VzYW5kc19zZXAsIHRob3VzYW5kc19zZXBfbGVuKTsKKyAgICAgICAgICAgIC8qIE5vIGNvbnZlcnNpb24sIGp1c3QgbWVtY3B5IHRoZSB0aG91c2FuZHNfc2VwLiAqLworICAgICAgICAgICAgbWVtY3B5KHBsYXN0LCB0aG91c2FuZHNfc2VwLCB0aG91c2FuZHNfc2VwX2xlbik7CiAjZW5kaWYKLQkJfQorICAgICAgICB9CiAKLQkJLyogQWRqdXN0IGVuZCBwb2ludGVyLiAqLwotCQlwZW5kICs9IHRob3VzYW5kc19zZXBfbGVuOworICAgICAgICAvKiBBZGp1c3QgZW5kIHBvaW50ZXIuICovCisgICAgICAgIHBlbmQgKz0gdGhvdXNhbmRzX3NlcF9sZW47CiAKLQkJLyogTW92ZSB0byB0aGUgbmV4dCBncm91cGluZyBjaGFyYWN0ZXIsIHVubGVzcyB3ZSdyZQotCQkgICByZXBlYXRpbmcgKHdoaWNoIGlzIGRlc2lnbmF0ZWQgYnkgYSBncm91cGluZyBvZiAwKS4gKi8KLQkJaWYgKCpncm91cGluZyAhPSAwKSB7Ci0JCQljdXJyZW50X2dyb3VwaW5nID0gKmdyb3VwaW5nKys7Ci0JCQlpZiAoY3VycmVudF9ncm91cGluZyA9PSBDSEFSX01BWCkKLQkJCQkvKiBXZSdyZSBkb25lLiAqLwotCQkJCWJyZWFrOwotCQl9Ci0JfQotCWlmIChhcHBlbmRfemVyb19jaGFyKSB7Ci0JCS8qIEFwcGVuZCBhIHplcm8gY2hhcmFjdGVyIHRvIG1hcmsgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLAotCQkgICBpZiB0aGVyZSdzIHJvb20uICovCi0JCWlmIChwZW5kIC0gKGJ1ZmZlciArIHJlbWFpbmluZykgPCAxKQotCQkJLyogTm8gcm9vbSwgZXJyb3IuICovCi0JCQlyZXR1cm4gMDsKLQkJKnBlbmQgPSAwOwotCX0KLQlyZXR1cm4gMTsKKyAgICAgICAgLyogTW92ZSB0byB0aGUgbmV4dCBncm91cGluZyBjaGFyYWN0ZXIsIHVubGVzcyB3ZSdyZQorICAgICAgICAgICByZXBlYXRpbmcgKHdoaWNoIGlzIGRlc2lnbmF0ZWQgYnkgYSBncm91cGluZyBvZiAwKS4gKi8KKyAgICAgICAgaWYgKCpncm91cGluZyAhPSAwKSB7CisgICAgICAgICAgICBjdXJyZW50X2dyb3VwaW5nID0gKmdyb3VwaW5nKys7CisgICAgICAgICAgICBpZiAoY3VycmVudF9ncm91cGluZyA9PSBDSEFSX01BWCkKKyAgICAgICAgICAgICAgICAvKiBXZSdyZSBkb25lLiAqLworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChhcHBlbmRfemVyb19jaGFyKSB7CisgICAgICAgIC8qIEFwcGVuZCBhIHplcm8gY2hhcmFjdGVyIHRvIG1hcmsgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLAorICAgICAgICAgICBpZiB0aGVyZSdzIHJvb20uICovCisgICAgICAgIGlmIChwZW5kIC0gKGJ1ZmZlciArIHJlbWFpbmluZykgPCAxKQorICAgICAgICAgICAgLyogTm8gcm9vbSwgZXJyb3IuICovCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgKnBlbmQgPSAwOworICAgIH0KKyAgICByZXR1cm4gMTsKIH0KICNlbmRpZiAvKiBTVFJJTkdMSUJfTE9DQUxFVVRJTF9IICovCmRpZmYgLS1naXQgYS9PYmplY3RzL3N0cmluZ2xpYi9wYXJ0aXRpb24uaCBiL09iamVjdHMvc3RyaW5nbGliL3BhcnRpdGlvbi5oCmluZGV4IDEwNWJhMzEuLjIwYzc1MDcgMTAwNjQ0Ci0tLSBhL09iamVjdHMvc3RyaW5nbGliL3BhcnRpdGlvbi5oCisrKyBiL09iamVjdHMvc3RyaW5nbGliL3BhcnRpdGlvbi5oCkBAIC0xOCwyMyArMTgsMjMgQEAKIAogICAgIGlmIChzZXBfbGVuID09IDApIHsKICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJlbXB0eSBzZXBhcmF0b3IiKTsKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCiAgICAgb3V0ID0gUHlUdXBsZV9OZXcoMyk7CiAgICAgaWYgKCFvdXQpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgcG9zID0gZmFzdHNlYXJjaChzdHIsIHN0cl9sZW4sIHNlcCwgc2VwX2xlbiwgRkFTVF9TRUFSQ0gpOwogCiAgICAgaWYgKHBvcyA8IDApIHsKLQlQeV9JTkNSRUYoc3RyX29iaik7Ci0JUHlUdXBsZV9TRVRfSVRFTShvdXQsIDAsIChQeU9iamVjdCopIHN0cl9vYmopOwotCVB5X0lOQ1JFRihTVFJJTkdMSUJfRU1QVFkpOwotCVB5VHVwbGVfU0VUX0lURU0ob3V0LCAxLCAoUHlPYmplY3QqKSBTVFJJTkdMSUJfRU1QVFkpOwotCVB5X0lOQ1JFRihTVFJJTkdMSUJfRU1QVFkpOwotCVB5VHVwbGVfU0VUX0lURU0ob3V0LCAyLCAoUHlPYmplY3QqKSBTVFJJTkdMSUJfRU1QVFkpOwotCXJldHVybiBvdXQ7CisgICAgICAgIFB5X0lOQ1JFRihzdHJfb2JqKTsKKyAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShvdXQsIDAsIChQeU9iamVjdCopIHN0cl9vYmopOworICAgICAgICBQeV9JTkNSRUYoU1RSSU5HTElCX0VNUFRZKTsKKyAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShvdXQsIDEsIChQeU9iamVjdCopIFNUUklOR0xJQl9FTVBUWSk7CisgICAgICAgIFB5X0lOQ1JFRihTVFJJTkdMSUJfRU1QVFkpOworICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKG91dCwgMiwgKFB5T2JqZWN0KikgU1RSSU5HTElCX0VNUFRZKTsKKyAgICAgICAgcmV0dXJuIG91dDsKICAgICB9CiAKICAgICBQeVR1cGxlX1NFVF9JVEVNKG91dCwgMCwgU1RSSU5HTElCX05FVyhzdHIsIHBvcykpOwpAQCAtNDQsOCArNDQsOCBAQAogICAgIFB5VHVwbGVfU0VUX0lURU0ob3V0LCAyLCBTVFJJTkdMSUJfTkVXKHN0ciArIHBvcywgc3RyX2xlbiAtIHBvcykpOwogCiAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKLQlQeV9ERUNSRUYob3V0KTsKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgUHlfREVDUkVGKG91dCk7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAogICAgIHJldHVybiBvdXQ7CkBAIC02MiwyOSArNjIsMjkgQEAKIAogICAgIGlmIChzZXBfbGVuID09IDApIHsKICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJlbXB0eSBzZXBhcmF0b3IiKTsKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCiAgICAgb3V0ID0gUHlUdXBsZV9OZXcoMyk7CiAgICAgaWYgKCFvdXQpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgLyogWFhYIC0gY3JlYXRlIHJldmVyc2VmYXN0c2VhcmNoIGhlbHBlciEgKi8KICAgICAgICAgcG9zID0gLTE7Ci0JZm9yIChqID0gc3RyX2xlbiAtIHNlcF9sZW47IGogPj0gMDsgLS1qKQorICAgICAgICBmb3IgKGogPSBzdHJfbGVuIC0gc2VwX2xlbjsgaiA+PSAwOyAtLWopCiAgICAgICAgICAgICBpZiAoU1RSSU5HTElCX0NNUChzdHIraiwgc2VwLCBzZXBfbGVuKSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgcG9zID0gajsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAogICAgIGlmIChwb3MgPCAwKSB7Ci0JUHlfSU5DUkVGKFNUUklOR0xJQl9FTVBUWSk7Ci0JUHlUdXBsZV9TRVRfSVRFTShvdXQsIDAsIChQeU9iamVjdCopIFNUUklOR0xJQl9FTVBUWSk7Ci0JUHlfSU5DUkVGKFNUUklOR0xJQl9FTVBUWSk7Ci0JUHlUdXBsZV9TRVRfSVRFTShvdXQsIDEsIChQeU9iamVjdCopIFNUUklOR0xJQl9FTVBUWSk7Ci0JUHlfSU5DUkVGKHN0cl9vYmopOyAgICAgICAgCi0JUHlUdXBsZV9TRVRfSVRFTShvdXQsIDIsIChQeU9iamVjdCopIHN0cl9vYmopOwotCXJldHVybiBvdXQ7CisgICAgICAgIFB5X0lOQ1JFRihTVFJJTkdMSUJfRU1QVFkpOworICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKG91dCwgMCwgKFB5T2JqZWN0KikgU1RSSU5HTElCX0VNUFRZKTsKKyAgICAgICAgUHlfSU5DUkVGKFNUUklOR0xJQl9FTVBUWSk7CisgICAgICAgIFB5VHVwbGVfU0VUX0lURU0ob3V0LCAxLCAoUHlPYmplY3QqKSBTVFJJTkdMSUJfRU1QVFkpOworICAgICAgICBQeV9JTkNSRUYoc3RyX29iaik7CisgICAgICAgIFB5VHVwbGVfU0VUX0lURU0ob3V0LCAyLCAoUHlPYmplY3QqKSBzdHJfb2JqKTsKKyAgICAgICAgcmV0dXJuIG91dDsKICAgICB9CiAKICAgICBQeVR1cGxlX1NFVF9JVEVNKG91dCwgMCwgU1RSSU5HTElCX05FVyhzdHIsIHBvcykpOwpAQCAtOTQsOCArOTQsOCBAQAogICAgIFB5VHVwbGVfU0VUX0lURU0ob3V0LCAyLCBTVFJJTkdMSUJfTkVXKHN0ciArIHBvcywgc3RyX2xlbiAtIHBvcykpOwogCiAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKLQlQeV9ERUNSRUYob3V0KTsKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgUHlfREVDUkVGKG91dCk7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAogICAgIHJldHVybiBvdXQ7CmRpZmYgLS1naXQgYS9PYmplY3RzL3N0cmluZ2xpYi9zdHJpbmdfZm9ybWF0LmggYi9PYmplY3RzL3N0cmluZ2xpYi9zdHJpbmdfZm9ybWF0LmgKaW5kZXggNmM1MzFlOC4uNDJlYWQ4OSAxMDA2NDQKLS0tIGEvT2JqZWN0cy9zdHJpbmdsaWIvc3RyaW5nX2Zvcm1hdC5oCisrKyBiL09iamVjdHMvc3RyaW5nbGliL3N0cmluZ19mb3JtYXQuaApAQCAtNDg3LDE1ICs0ODcsMTUgQEAKICAgICBQeU9iamVjdCAqZm9ybWF0X3NwZWNfb2JqZWN0ID0gTlVMTDsKICAgICBQeU9iamVjdCAqKCpmb3JtYXR0ZXIpKFB5T2JqZWN0ICosIFNUUklOR0xJQl9DSEFSICosIFB5X3NzaXplX3QpID0gTlVMTDsKICAgICBTVFJJTkdMSUJfQ0hBUiogZm9ybWF0X3NwZWNfc3RhcnQgPSBmb3JtYXRfc3BlYy0+cHRyID8KLQkgICAgZm9ybWF0X3NwZWMtPnB0ciA6IE5VTEw7CisgICAgICAgICAgICBmb3JtYXRfc3BlYy0+cHRyIDogTlVMTDsKICAgICBQeV9zc2l6ZV90IGZvcm1hdF9zcGVjX2xlbiA9IGZvcm1hdF9zcGVjLT5wdHIgPwotCSAgICBmb3JtYXRfc3BlYy0+ZW5kIC0gZm9ybWF0X3NwZWMtPnB0ciA6IDA7CisgICAgICAgICAgICBmb3JtYXRfc3BlYy0+ZW5kIC0gZm9ybWF0X3NwZWMtPnB0ciA6IDA7CiAKICAgICAvKiBJZiB3ZSBrbm93IHRoZSB0eXBlIGV4YWN0bHksIHNraXAgdGhlIGxvb2t1cCBvZiBfX2Zvcm1hdF9fIGFuZCBqdXN0CiAgICAgICAgY2FsbCB0aGUgZm9ybWF0dGVyIGRpcmVjdGx5LiAqLwogI2lmIFNUUklOR0xJQl9JU19VTklDT0RFCiAgICAgaWYgKFB5VW5pY29kZV9DaGVja0V4YWN0KGZpZWxkb2JqKSkKLQlmb3JtYXR0ZXIgPSBfUHlVbmljb2RlX0Zvcm1hdEFkdmFuY2VkOworICAgICAgICBmb3JtYXR0ZXIgPSBfUHlVbmljb2RlX0Zvcm1hdEFkdmFuY2VkOwogICAgIC8qIFVuZm9ydHVuYXRlbHksIHRoZXJlJ3MgYSBwcm9ibGVtIHdpdGggY2hlY2tpbmcgZm9yIGludCwgbG9uZywKICAgICAgICBhbmQgZmxvYXQgaGVyZS4gIElmIHdlJ3JlIGJlaW5nIGluY2x1ZGVkIGFzIHVuaWNvZGUsIHRoZWlyCiAgICAgICAgZm9ybWF0dGVycyBleHBlY3Qgc3RyaW5nIGZvcm1hdF9zcGVjIGFyZ3MuICBGb3Igbm93LCBqdXN0IHNraXAKQEAgLTUwMywyOSArNTAzLDI5IEBACiAgICAgICAgaGFzc2xlLiAqLwogI2Vsc2UKICAgICBpZiAoUHlTdHJpbmdfQ2hlY2tFeGFjdChmaWVsZG9iaikpCi0JZm9ybWF0dGVyID0gX1B5Qnl0ZXNfRm9ybWF0QWR2YW5jZWQ7CisgICAgICAgIGZvcm1hdHRlciA9IF9QeUJ5dGVzX0Zvcm1hdEFkdmFuY2VkOwogICAgIGVsc2UgaWYgKFB5SW50X0NoZWNrRXhhY3QoZmllbGRvYmopKQotCWZvcm1hdHRlciA9X1B5SW50X0Zvcm1hdEFkdmFuY2VkOworICAgICAgICBmb3JtYXR0ZXIgPV9QeUludF9Gb3JtYXRBZHZhbmNlZDsKICAgICBlbHNlIGlmIChQeUxvbmdfQ2hlY2tFeGFjdChmaWVsZG9iaikpCi0JZm9ybWF0dGVyID1fUHlMb25nX0Zvcm1hdEFkdmFuY2VkOworICAgICAgICBmb3JtYXR0ZXIgPV9QeUxvbmdfRm9ybWF0QWR2YW5jZWQ7CiAgICAgZWxzZSBpZiAoUHlGbG9hdF9DaGVja0V4YWN0KGZpZWxkb2JqKSkKLQlmb3JtYXR0ZXIgPSBfUHlGbG9hdF9Gb3JtYXRBZHZhbmNlZDsKKyAgICAgICAgZm9ybWF0dGVyID0gX1B5RmxvYXRfRm9ybWF0QWR2YW5jZWQ7CiAjZW5kaWYKIAogICAgIGlmIChmb3JtYXR0ZXIpIHsKLQkvKiB3ZSBrbm93IGV4YWN0bHkgd2hpY2ggZm9ybWF0dGVyIHdpbGwgYmUgY2FsbGVkIHdoZW4gX19mb3JtYXRfXyBpcwotCSAgIGxvb2tlZCB1cCwgc28gY2FsbCBpdCBkaXJlY3RseSwgaW5zdGVhZC4gKi8KLQlyZXN1bHQgPSBmb3JtYXR0ZXIoZmllbGRvYmosIGZvcm1hdF9zcGVjX3N0YXJ0LCBmb3JtYXRfc3BlY19sZW4pOworICAgICAgICAvKiB3ZSBrbm93IGV4YWN0bHkgd2hpY2ggZm9ybWF0dGVyIHdpbGwgYmUgY2FsbGVkIHdoZW4gX19mb3JtYXRfXyBpcworICAgICAgICAgICBsb29rZWQgdXAsIHNvIGNhbGwgaXQgZGlyZWN0bHksIGluc3RlYWQuICovCisgICAgICAgIHJlc3VsdCA9IGZvcm1hdHRlcihmaWVsZG9iaiwgZm9ybWF0X3NwZWNfc3RhcnQsIGZvcm1hdF9zcGVjX2xlbik7CiAgICAgfQogICAgIGVsc2UgewotCS8qIFdlIG5lZWQgdG8gY3JlYXRlIGFuIG9iamVjdCBvdXQgb2YgdGhlIHBvaW50ZXJzIHdlIGhhdmUsIGJlY2F1c2UKLQkgICBfX2Zvcm1hdF9fIHRha2VzIGEgc3RyaW5nL3VuaWNvZGUgb2JqZWN0IGZvciBmb3JtYXRfc3BlYy4gKi8KLQlmb3JtYXRfc3BlY19vYmplY3QgPSBTVFJJTkdMSUJfTkVXKGZvcm1hdF9zcGVjX3N0YXJ0LAotCQkJCQkgICBmb3JtYXRfc3BlY19sZW4pOwotCWlmIChmb3JtYXRfc3BlY19vYmplY3QgPT0gTlVMTCkKLQkgICAgZ290byBkb25lOworICAgICAgICAvKiBXZSBuZWVkIHRvIGNyZWF0ZSBhbiBvYmplY3Qgb3V0IG9mIHRoZSBwb2ludGVycyB3ZSBoYXZlLCBiZWNhdXNlCisgICAgICAgICAgIF9fZm9ybWF0X18gdGFrZXMgYSBzdHJpbmcvdW5pY29kZSBvYmplY3QgZm9yIGZvcm1hdF9zcGVjLiAqLworICAgICAgICBmb3JtYXRfc3BlY19vYmplY3QgPSBTVFJJTkdMSUJfTkVXKGZvcm1hdF9zcGVjX3N0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdF9zcGVjX2xlbik7CisgICAgICAgIGlmIChmb3JtYXRfc3BlY19vYmplY3QgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gZG9uZTsKIAotCXJlc3VsdCA9IFB5T2JqZWN0X0Zvcm1hdChmaWVsZG9iaiwgZm9ybWF0X3NwZWNfb2JqZWN0KTsKKyAgICAgICAgcmVzdWx0ID0gUHlPYmplY3RfRm9ybWF0KGZpZWxkb2JqLCBmb3JtYXRfc3BlY19vYmplY3QpOwogICAgIH0KICAgICBpZiAocmVzdWx0ID09IE5VTEwpCiAgICAgICAgIGdvdG8gZG9uZTsKQEAgLTUzOCwxMSArNTM4LDExIEBACiAgICAgLyogQ29udmVydCByZXN1bHQgdG8gb3VyIHR5cGUuICBXZSBjb3VsZCBiZSBzdHIsIGFuZCByZXN1bHQgY291bGQKICAgICAgICBiZSB1bmljb2RlICovCiAgICAgewotCVB5T2JqZWN0ICp0bXAgPSBTVFJJTkdMSUJfVE9TVFIocmVzdWx0KTsKLQlpZiAodG1wID09IE5VTEwpCi0JICAgIGdvdG8gZG9uZTsKLQlQeV9ERUNSRUYocmVzdWx0KTsKLQlyZXN1bHQgPSB0bXA7CisgICAgICAgIFB5T2JqZWN0ICp0bXAgPSBTVFJJTkdMSUJfVE9TVFIocmVzdWx0KTsKKyAgICAgICAgaWYgKHRtcCA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBkb25lOworICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgcmVzdWx0ID0gdG1wOwogICAgIH0KICNlbmRpZgogCkBAIC03NzcsMTcgKzc3NywxNyBAQAogICAgIGNhc2UgJ3MnOgogICAgICAgICByZXR1cm4gU1RSSU5HTElCX1RPU1RSKG9iaik7CiAgICAgZGVmYXVsdDoKLQlpZiAoY29udmVyc2lvbiA+IDMyICYmIGNvbnZlcnNpb24gPCAxMjcpIHsKLQkJLyogSXQncyB0aGUgQVNDSUkgc3VicmFuZ2U7IGNhc3RpbmcgdG8gY2hhciBpcyBzYWZlCi0JCSAgIChhc3N1bWluZyB0aGUgZXhlY3V0aW9uIGNoYXJhY3RlciBzZXQgaXMgYW4gQVNDSUkKLQkJICAgc3VwZXJzZXQpLiAqLwotICAgICAgICAJUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgIGlmIChjb252ZXJzaW9uID4gMzIgJiYgY29udmVyc2lvbiA8IDEyNykgeworICAgICAgICAgICAgICAgIC8qIEl0J3MgdGhlIEFTQ0lJIHN1YnJhbmdlOyBjYXN0aW5nIHRvIGNoYXIgaXMgc2FmZQorICAgICAgICAgICAgICAgICAgIChhc3N1bWluZyB0aGUgZXhlY3V0aW9uIGNoYXJhY3RlciBzZXQgaXMgYW4gQVNDSUkKKyAgICAgICAgICAgICAgICAgICBzdXBlcnNldCkuICovCisgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAiVW5rbm93biBjb252ZXJzaW9uIHNwZWNpZmllciAlYyIsCiAgICAgICAgICAgICAgICAgICAgICAoY2hhciljb252ZXJzaW9uKTsKLQl9IGVsc2UKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCi0JCSAgICAgIlVua25vd24gY29udmVyc2lvbiBzcGVjaWZpZXIgXFx4JXgiLAotCQkgICAgICh1bnNpZ25lZCBpbnQpY29udmVyc2lvbik7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIlVua25vd24gY29udmVyc2lvbiBzcGVjaWZpZXIgXFx4JXgiLAorICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludCljb252ZXJzaW9uKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogfQpAQCAtMTA0MSw3ICsxMDQxLDcgQEAKICAgICAgICAgICAgIFB5X0lOQ1JFRihjb252ZXJzaW9uX3N0cik7CiAgICAgICAgIH0KICAgICAgICAgZWxzZQotCSAgICBjb252ZXJzaW9uX3N0ciA9IFNUUklOR0xJQl9ORVcoJmNvbnZlcnNpb24sIDEpOworICAgICAgICAgICAgY29udmVyc2lvbl9zdHIgPSBTVFJJTkdMSUJfTkVXKCZjb252ZXJzaW9uLCAxKTsKICAgICAgICAgaWYgKGNvbnZlcnNpb25fc3RyID09IE5VTEwpCiAgICAgICAgICAgICBnb3RvIGRvbmU7CiAKQEAgLTEwNTcsMzkgKzEwNTcsMzkgQEAKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIGZvcm1hdHRlcml0ZXJfbWV0aG9kc1tdID0gewotICAgIHtOVUxMLAkJTlVMTH0JCS8qIHNlbnRpbmVsICovCisgICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgUHlGb3JtYXR0ZXJJdGVyX1R5cGUgPSB7CiAgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKLSAgICAiZm9ybWF0dGVyaXRlcmF0b3IiLAkJLyogdHBfbmFtZSAqLwotICAgIHNpemVvZihmb3JtYXR0ZXJpdGVyb2JqZWN0KSwJLyogdHBfYmFzaWNzaXplICovCi0gICAgMCwJCQkJCS8qIHRwX2l0ZW1zaXplICovCisgICAgImZvcm1hdHRlcml0ZXJhdG9yIiwgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgIHNpemVvZihmb3JtYXR0ZXJpdGVyb2JqZWN0KSwgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCiAgICAgLyogbWV0aG9kcyAqLwotICAgIChkZXN0cnVjdG9yKWZvcm1hdHRlcml0ZXJfZGVhbGxvYywJLyogdHBfZGVhbGxvYyAqLwotICAgIDAsCQkJCQkvKiB0cF9wcmludCAqLwotICAgIDAsCQkJCQkvKiB0cF9nZXRhdHRyICovCi0gICAgMCwJCQkJCS8qIHRwX3NldGF0dHIgKi8KLSAgICAwLAkJCQkJLyogdHBfY29tcGFyZSAqLwotICAgIDAsCQkJCQkvKiB0cF9yZXByICovCi0gICAgMCwJCQkJCS8qIHRwX2FzX251bWJlciAqLwotICAgIDAsCQkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotICAgIDAsCQkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0gICAgMCwJCQkJCS8qIHRwX2hhc2ggKi8KLSAgICAwLAkJCQkJLyogdHBfY2FsbCAqLwotICAgIDAsCQkJCQkvKiB0cF9zdHIgKi8KLSAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJCS8qIHRwX2dldGF0dHJvICovCi0gICAgMCwJCQkJCS8qIHRwX3NldGF0dHJvICovCi0gICAgMCwJCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotICAgIFB5X1RQRkxBR1NfREVGQVVMVCwJCQkvKiB0cF9mbGFncyAqLwotICAgIDAsCQkJCQkvKiB0cF9kb2MgKi8KLSAgICAwLAkJCQkJLyogdHBfdHJhdmVyc2UgKi8KLSAgICAwLAkJCQkJLyogdHBfY2xlYXIgKi8KLSAgICAwLAkJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLSAgICAwLAkJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLSAgICBQeU9iamVjdF9TZWxmSXRlciwJCQkvKiB0cF9pdGVyICovCi0gICAgKGl0ZXJuZXh0ZnVuYylmb3JtYXR0ZXJpdGVyX25leHQsCS8qIHRwX2l0ZXJuZXh0ICovCi0gICAgZm9ybWF0dGVyaXRlcl9tZXRob2RzLAkJLyogdHBfbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKWZvcm1hdHRlcml0ZXJfZGVhbGxvYywgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQsICAgICAgICAgICAgICAgICAvKiB0cF9mbGFncyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgUHlPYmplY3RfU2VsZkl0ZXIsICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIChpdGVybmV4dGZ1bmMpZm9ybWF0dGVyaXRlcl9uZXh0LCAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgZm9ybWF0dGVyaXRlcl9tZXRob2RzLCAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLwogICAgIDAsCiB9OwogCkBAIC0xMTkwLDM5ICsxMTkwLDM5IEBACiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBmaWVsZG5hbWVpdGVyX21ldGhvZHNbXSA9IHsKLSAgICB7TlVMTCwJCU5VTEx9CQkvKiBzZW50aW5lbCAqLworICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IFB5RmllbGROYW1lSXRlcl9UeXBlID0gewogICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCi0gICAgImZpZWxkbmFtZWl0ZXJhdG9yIiwJCS8qIHRwX25hbWUgKi8KLSAgICBzaXplb2YoZmllbGRuYW1laXRlcm9iamVjdCksCS8qIHRwX2Jhc2ljc2l6ZSAqLwotICAgIDAsCQkJCQkvKiB0cF9pdGVtc2l6ZSAqLworICAgICJmaWVsZG5hbWVpdGVyYXRvciIsICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICBzaXplb2YoZmllbGRuYW1laXRlcm9iamVjdCksICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLwogICAgIC8qIG1ldGhvZHMgKi8KLSAgICAoZGVzdHJ1Y3RvcilmaWVsZG5hbWVpdGVyX2RlYWxsb2MsCS8qIHRwX2RlYWxsb2MgKi8KLSAgICAwLAkJCQkJLyogdHBfcHJpbnQgKi8KLSAgICAwLAkJCQkJLyogdHBfZ2V0YXR0ciAqLwotICAgIDAsCQkJCQkvKiB0cF9zZXRhdHRyICovCi0gICAgMCwJCQkJCS8qIHRwX2NvbXBhcmUgKi8KLSAgICAwLAkJCQkJLyogdHBfcmVwciAqLwotICAgIDAsCQkJCQkvKiB0cF9hc19udW1iZXIgKi8KLSAgICAwLAkJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLSAgICAwLAkJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotICAgIDAsCQkJCQkvKiB0cF9oYXNoICovCi0gICAgMCwJCQkJCS8qIHRwX2NhbGwgKi8KLSAgICAwLAkJCQkJLyogdHBfc3RyICovCi0gICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCQkvKiB0cF9nZXRhdHRybyAqLwotICAgIDAsCQkJCQkvKiB0cF9zZXRhdHRybyAqLwotICAgIDAsCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KLSAgICBQeV9UUEZMQUdTX0RFRkFVTFQsCQkJLyogdHBfZmxhZ3MgKi8KLSAgICAwLAkJCQkJLyogdHBfZG9jICovCi0gICAgMCwJCQkJCS8qIHRwX3RyYXZlcnNlICovCi0gICAgMCwJCQkJCS8qIHRwX2NsZWFyICovCi0gICAgMCwJCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0gICAgMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0gICAgUHlPYmplY3RfU2VsZkl0ZXIsCQkJLyogdHBfaXRlciAqLwotICAgIChpdGVybmV4dGZ1bmMpZmllbGRuYW1laXRlcl9uZXh0LAkvKiB0cF9pdGVybmV4dCAqLwotICAgIGZpZWxkbmFtZWl0ZXJfbWV0aG9kcywJCS8qIHRwX21ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcilmaWVsZG5hbWVpdGVyX2RlYWxsb2MsICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIFB5T2JqZWN0X1NlbGZJdGVyLCAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAoaXRlcm5leHRmdW5jKWZpZWxkbmFtZWl0ZXJfbmV4dCwgICAvKiB0cF9pdGVybmV4dCAqLworICAgIGZpZWxkbmFtZWl0ZXJfbWV0aG9kcywgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KICAgICAwfTsKIAogLyogdW5pY29kZV9mb3JtYXR0ZXJfZmllbGRfbmFtZV9zcGxpdCBpcyB1c2VkIHRvIGltcGxlbWVudApkaWZmIC0tZ2l0IGEvT2JqZWN0cy9zdHJpbmdsaWIvdHJhbnNtb2dyaWZ5LmggYi9PYmplY3RzL3N0cmluZ2xpYi90cmFuc21vZ3JpZnkuaAppbmRleCA3ZGM4MTc3Li40MzkwZTIyIDEwMDY0NAotLS0gYS9PYmplY3RzL3N0cmluZ2xpYi90cmFuc21vZ3JpZnkuaAorKysgYi9PYmplY3RzL3N0cmluZ2xpYi90cmFuc21vZ3JpZnkuaApAQCAtMjUsMTAgKzI1LDEwIEBACiAgICAgc2l6ZV90IGksIGo7CiAgICAgUHlPYmplY3QgKnU7CiAgICAgaW50IHRhYnNpemUgPSA4OwotICAgIAorCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8aTpleHBhbmR0YWJzIiwgJnRhYnNpemUpKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAKKwogICAgIC8qIEZpcnN0IHBhc3M6IGRldGVybWluZSBzaXplIG9mIG91dHB1dCBzdHJpbmcgKi8KICAgICBpID0gaiA9IDA7CiAgICAgZSA9IFNUUklOR0xJQl9TVFIoc2VsZikgKyBTVFJJTkdMSUJfTEVOKHNlbGYpOwpAQCAtNTUsMjAgKzU1LDIwIEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgCisKICAgICBpZiAoKGkgKyBqKSA+IFBZX1NTSVpFX1RfTUFYKSB7CiAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLCAicmVzdWx0IGlzIHRvbyBsb25nIik7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICAKKwogICAgIC8qIFNlY29uZCBwYXNzOiBjcmVhdGUgb3V0cHV0IHN0cmluZyBhbmQgZmlsbCBpdCAqLwogICAgIHUgPSBTVFJJTkdMSUJfTkVXKE5VTEwsIGkgKyBqKTsKICAgICBpZiAoIXUpCiAgICAgICAgIHJldHVybiBOVUxMOwotICAgIAorCiAgICAgaiA9IDA7CiAgICAgcSA9IFNUUklOR0xJQl9TVFIodSk7Ci0gICAgCisKICAgICBmb3IgKHAgPSBTVFJJTkdMSUJfU1RSKHNlbGYpOyBwIDwgZTsgcCsrKQogICAgICAgICBpZiAoKnAgPT0gJ1x0JykgewogICAgICAgICAgICAgaWYgKHRhYnNpemUgPiAwKSB7CkBAIC04NCw3ICs4NCw3IEBACiAgICAgICAgICAgICBpZiAoKnAgPT0gJ1xuJyB8fCAqcCA9PSAnXHInKQogICAgICAgICAgICAgICAgIGogPSAwOwogICAgICAgICB9Ci0gICAgCisKICAgICByZXR1cm4gdTsKIH0KIApAQCAtMTEwLDE2ICsxMTAsMTYgQEAKICAgICB9CiAKICAgICB1ID0gU1RSSU5HTElCX05FVyhOVUxMLAotCQkJCSAgIGxlZnQgKyBTVFJJTkdMSUJfTEVOKHNlbGYpICsgcmlnaHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0ICsgU1RSSU5HTElCX0xFTihzZWxmKSArIHJpZ2h0KTsKICAgICBpZiAodSkgewogICAgICAgICBpZiAobGVmdCkKICAgICAgICAgICAgIG1lbXNldChTVFJJTkdMSUJfU1RSKHUpLCBmaWxsLCBsZWZ0KTsKICAgICAgICAgUHlfTUVNQ1BZKFNUUklOR0xJQl9TVFIodSkgKyBsZWZ0LAotCSAgICAgICBTVFJJTkdMSUJfU1RSKHNlbGYpLAotCSAgICAgICBTVFJJTkdMSUJfTEVOKHNlbGYpKTsKKyAgICAgICAgICAgICAgIFNUUklOR0xJQl9TVFIoc2VsZiksCisgICAgICAgICAgICAgICBTVFJJTkdMSUJfTEVOKHNlbGYpKTsKICAgICAgICAgaWYgKHJpZ2h0KQogICAgICAgICAgICAgbWVtc2V0KFNUUklOR0xJQl9TVFIodSkgKyBsZWZ0ICsgU1RSSU5HTElCX0xFTihzZWxmKSwKLQkJICAgZmlsbCwgcmlnaHQpOworICAgICAgICAgICAgICAgICAgIGZpbGwsIHJpZ2h0KTsKICAgICB9CiAKICAgICByZXR1cm4gdTsKQEAgLTI3MSwxNyArMjcxLDE3IEBACiB9CiAKIAotI2RlZmluZSBfU1RSSU5HTElCX1NQTElUX0FQUEVORChkYXRhLCBsZWZ0LCByaWdodCkJCVwKLQlzdHIgPSBTVFJJTkdMSUJfTkVXKChkYXRhKSArIChsZWZ0KSwJICAgICAgICAgICAgICAgIFwKLQkJCQkJIChyaWdodCkgLSAobGVmdCkpOwlcCi0JaWYgKHN0ciA9PSBOVUxMKQkJCQkJXAotCQlnb3RvIG9uRXJyb3I7CQkJCQlcCi0JaWYgKFB5TGlzdF9BcHBlbmQobGlzdCwgc3RyKSkgewkJCQlcCi0JCVB5X0RFQ1JFRihzdHIpOwkJCQkJXAotCQlnb3RvIG9uRXJyb3I7CQkJCQlcCi0JfQkJCQkJCQlcCi0JZWxzZQkJCQkJCQlcCi0JCVB5X0RFQ1JFRihzdHIpOworI2RlZmluZSBfU1RSSU5HTElCX1NQTElUX0FQUEVORChkYXRhLCBsZWZ0LCByaWdodCkgICAgICAgICAgICAgIFwKKyAgICAgICAgc3RyID0gU1RSSU5HTElCX05FVygoZGF0YSkgKyAobGVmdCksICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyaWdodCkgLSAobGVmdCkpOyAgICAgXAorICAgICAgICBpZiAoc3RyID09IE5VTEwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBnb3RvIG9uRXJyb3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChQeUxpc3RfQXBwZW5kKGxpc3QsIHN0cikpIHsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihzdHIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBnb3RvIG9uRXJyb3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoc3RyKTsKIAogUHlEb2NfU1RSVkFSKHNwbGl0bGluZXNfX2RvY19fLAogIkIuc3BsaXRsaW5lcyhba2VlcGVuZHNdKSAtPiBsaXN0IG9mIGxpbmVzXG5cCkBAIC0zMjAsMjggKzMyMCwyOCBAQAogICAgICAgICBnb3RvIG9uRXJyb3I7CiAKICAgICBmb3IgKGkgPSBqID0gMDsgaSA8IGxlbjsgKSB7Ci0JUHlfc3NpemVfdCBlb2w7CisgICAgICAgIFB5X3NzaXplX3QgZW9sOwogCi0JLyogRmluZCBhIGxpbmUgYW5kIGFwcGVuZCBpdCAqLwotCXdoaWxlIChpIDwgbGVuICYmIGRhdGFbaV0gIT0gJ1xuJyAmJiBkYXRhW2ldICE9ICdccicpCi0JICAgIGkrKzsKKyAgICAgICAgLyogRmluZCBhIGxpbmUgYW5kIGFwcGVuZCBpdCAqLworICAgICAgICB3aGlsZSAoaSA8IGxlbiAmJiBkYXRhW2ldICE9ICdcbicgJiYgZGF0YVtpXSAhPSAnXHInKQorICAgICAgICAgICAgaSsrOwogCi0JLyogU2tpcCB0aGUgbGluZSBicmVhayByZWFkaW5nIENSTEYgYXMgb25lIGxpbmUgYnJlYWsgKi8KLQllb2wgPSBpOwotCWlmIChpIDwgbGVuKSB7Ci0JICAgIGlmIChkYXRhW2ldID09ICdccicgJiYgaSArIDEgPCBsZW4gJiYKLQkJZGF0YVtpKzFdID09ICdcbicpCi0JCWkgKz0gMjsKLQkgICAgZWxzZQotCQlpKys7Ci0JICAgIGlmIChrZWVwZW5kcykKLQkJZW9sID0gaTsKLQl9Ci0JX1NUUklOR0xJQl9TUExJVF9BUFBFTkQoZGF0YSwgaiwgZW9sKTsKLQlqID0gaTsKKyAgICAgICAgLyogU2tpcCB0aGUgbGluZSBicmVhayByZWFkaW5nIENSTEYgYXMgb25lIGxpbmUgYnJlYWsgKi8KKyAgICAgICAgZW9sID0gaTsKKyAgICAgICAgaWYgKGkgPCBsZW4pIHsKKyAgICAgICAgICAgIGlmIChkYXRhW2ldID09ICdccicgJiYgaSArIDEgPCBsZW4gJiYKKyAgICAgICAgICAgICAgICBkYXRhW2krMV0gPT0gJ1xuJykKKyAgICAgICAgICAgICAgICBpICs9IDI7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgaWYgKGtlZXBlbmRzKQorICAgICAgICAgICAgICAgIGVvbCA9IGk7CisgICAgICAgIH0KKyAgICAgICAgX1NUUklOR0xJQl9TUExJVF9BUFBFTkQoZGF0YSwgaiwgZW9sKTsKKyAgICAgICAgaiA9IGk7CiAgICAgfQogICAgIGlmIChqIDwgbGVuKSB7Ci0JX1NUUklOR0xJQl9TUExJVF9BUFBFTkQoZGF0YSwgaiwgbGVuKTsKKyAgICAgICAgX1NUUklOR0xJQl9TUExJVF9BUFBFTkQoZGF0YSwgaiwgbGVuKTsKICAgICB9CiAKICAgICByZXR1cm4gbGlzdDsKZGlmZiAtLWdpdCBhL09iamVjdHMvc3RyaW5nb2JqZWN0LmMgYi9PYmplY3RzL3N0cmluZ29iamVjdC5jCmluZGV4IDk5NmMyNjAuLjk2NzIyYzUgMTAwNjQ0Ci0tLSBhL09iamVjdHMvc3RyaW5nb2JqZWN0LmMKKysrIGIvT2JqZWN0cy9zdHJpbmdvYmplY3QuYwpAQCAtNTEsMzU0ICs1MSwzNTQgQEAKIFB5T2JqZWN0ICoKIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGNvbnN0IGNoYXIgKnN0ciwgUHlfc3NpemVfdCBzaXplKQogewotCXJlZ2lzdGVyIFB5U3RyaW5nT2JqZWN0ICpvcDsKLQlpZiAoc2l6ZSA8IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAotCQkgICAgIk5lZ2F0aXZlIHNpemUgcGFzc2VkIHRvIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoc2l6ZSA9PSAwICYmIChvcCA9IG51bGxzdHJpbmcpICE9IE5VTEwpIHsKKyAgICByZWdpc3RlciBQeVN0cmluZ09iamVjdCAqb3A7CisgICAgaWYgKHNpemUgPCAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKKyAgICAgICAgICAgICJOZWdhdGl2ZSBzaXplIHBhc3NlZCB0byBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKHNpemUgPT0gMCAmJiAob3AgPSBudWxsc3RyaW5nKSAhPSBOVUxMKSB7CiAjaWZkZWYgQ09VTlRfQUxMT0NTCi0JCW51bGxfc3RyaW5ncysrOworICAgICAgICBudWxsX3N0cmluZ3MrKzsKICNlbmRpZgotCQlQeV9JTkNSRUYob3ApOwotCQlyZXR1cm4gKFB5T2JqZWN0ICopb3A7Ci0JfQotCWlmIChzaXplID09IDEgJiYgc3RyICE9IE5VTEwgJiYKLQkgICAgKG9wID0gY2hhcmFjdGVyc1sqc3RyICYgVUNIQVJfTUFYXSkgIT0gTlVMTCkKLQl7CisgICAgICAgIFB5X0lOQ1JFRihvcCk7CisgICAgICAgIHJldHVybiAoUHlPYmplY3QgKilvcDsKKyAgICB9CisgICAgaWYgKHNpemUgPT0gMSAmJiBzdHIgIT0gTlVMTCAmJgorICAgICAgICAob3AgPSBjaGFyYWN0ZXJzWypzdHIgJiBVQ0hBUl9NQVhdKSAhPSBOVUxMKQorICAgIHsKICNpZmRlZiBDT1VOVF9BTExPQ1MKLQkJb25lX3N0cmluZ3MrKzsKKyAgICAgICAgb25lX3N0cmluZ3MrKzsKICNlbmRpZgotCQlQeV9JTkNSRUYob3ApOwotCQlyZXR1cm4gKFB5T2JqZWN0ICopb3A7Ci0JfQorICAgICAgICBQeV9JTkNSRUYob3ApOworICAgICAgICByZXR1cm4gKFB5T2JqZWN0ICopb3A7CisgICAgfQogCi0JaWYgKHNpemUgPiBQWV9TU0laRV9UX01BWCAtIHNpemVvZihQeVN0cmluZ09iamVjdCkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsICJzdHJpbmcgaXMgdG9vIGxhcmdlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoc2l6ZSA+IFBZX1NTSVpFX1RfTUFYIC0gc2l6ZW9mKFB5U3RyaW5nT2JqZWN0KSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwgInN0cmluZyBpcyB0b28gbGFyZ2UiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JLyogSW5saW5lIFB5T2JqZWN0X05ld1ZhciAqLwotCW9wID0gKFB5U3RyaW5nT2JqZWN0ICopUHlPYmplY3RfTUFMTE9DKHNpemVvZihQeVN0cmluZ09iamVjdCkgKyBzaXplKTsKLQlpZiAob3AgPT0gTlVMTCkKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JUHlPYmplY3RfSU5JVF9WQVIob3AsICZQeVN0cmluZ19UeXBlLCBzaXplKTsKLQlvcC0+b2Jfc2hhc2ggPSAtMTsKLQlvcC0+b2Jfc3N0YXRlID0gU1NUQVRFX05PVF9JTlRFUk5FRDsKLQlpZiAoc3RyICE9IE5VTEwpCi0JCVB5X01FTUNQWShvcC0+b2Jfc3ZhbCwgc3RyLCBzaXplKTsKLQlvcC0+b2Jfc3ZhbFtzaXplXSA9ICdcMCc7Ci0JLyogc2hhcmUgc2hvcnQgc3RyaW5ncyAqLwotCWlmIChzaXplID09IDApIHsKLQkJUHlPYmplY3QgKnQgPSAoUHlPYmplY3QgKilvcDsKLQkJUHlTdHJpbmdfSW50ZXJuSW5QbGFjZSgmdCk7Ci0JCW9wID0gKFB5U3RyaW5nT2JqZWN0ICopdDsKLQkJbnVsbHN0cmluZyA9IG9wOwotCQlQeV9JTkNSRUYob3ApOwotCX0gZWxzZSBpZiAoc2l6ZSA9PSAxICYmIHN0ciAhPSBOVUxMKSB7Ci0JCVB5T2JqZWN0ICp0ID0gKFB5T2JqZWN0ICopb3A7Ci0JCVB5U3RyaW5nX0ludGVybkluUGxhY2UoJnQpOwotCQlvcCA9IChQeVN0cmluZ09iamVjdCAqKXQ7Ci0JCWNoYXJhY3RlcnNbKnN0ciAmIFVDSEFSX01BWF0gPSBvcDsKLQkJUHlfSU5DUkVGKG9wKTsKLQl9Ci0JcmV0dXJuIChQeU9iamVjdCAqKSBvcDsKKyAgICAvKiBJbmxpbmUgUHlPYmplY3RfTmV3VmFyICovCisgICAgb3AgPSAoUHlTdHJpbmdPYmplY3QgKilQeU9iamVjdF9NQUxMT0Moc2l6ZW9mKFB5U3RyaW5nT2JqZWN0KSArIHNpemUpOworICAgIGlmIChvcCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICBQeU9iamVjdF9JTklUX1ZBUihvcCwgJlB5U3RyaW5nX1R5cGUsIHNpemUpOworICAgIG9wLT5vYl9zaGFzaCA9IC0xOworICAgIG9wLT5vYl9zc3RhdGUgPSBTU1RBVEVfTk9UX0lOVEVSTkVEOworICAgIGlmIChzdHIgIT0gTlVMTCkKKyAgICAgICAgUHlfTUVNQ1BZKG9wLT5vYl9zdmFsLCBzdHIsIHNpemUpOworICAgIG9wLT5vYl9zdmFsW3NpemVdID0gJ1wwJzsKKyAgICAvKiBzaGFyZSBzaG9ydCBzdHJpbmdzICovCisgICAgaWYgKHNpemUgPT0gMCkgeworICAgICAgICBQeU9iamVjdCAqdCA9IChQeU9iamVjdCAqKW9wOworICAgICAgICBQeVN0cmluZ19JbnRlcm5JblBsYWNlKCZ0KTsKKyAgICAgICAgb3AgPSAoUHlTdHJpbmdPYmplY3QgKil0OworICAgICAgICBudWxsc3RyaW5nID0gb3A7CisgICAgICAgIFB5X0lOQ1JFRihvcCk7CisgICAgfSBlbHNlIGlmIChzaXplID09IDEgJiYgc3RyICE9IE5VTEwpIHsKKyAgICAgICAgUHlPYmplY3QgKnQgPSAoUHlPYmplY3QgKilvcDsKKyAgICAgICAgUHlTdHJpbmdfSW50ZXJuSW5QbGFjZSgmdCk7CisgICAgICAgIG9wID0gKFB5U3RyaW5nT2JqZWN0ICopdDsKKyAgICAgICAgY2hhcmFjdGVyc1sqc3RyICYgVUNIQVJfTUFYXSA9IG9wOworICAgICAgICBQeV9JTkNSRUYob3ApOworICAgIH0KKyAgICByZXR1cm4gKFB5T2JqZWN0ICopIG9wOwogfQogCiBQeU9iamVjdCAqCiBQeVN0cmluZ19Gcm9tU3RyaW5nKGNvbnN0IGNoYXIgKnN0cikKIHsKLQlyZWdpc3RlciBzaXplX3Qgc2l6ZTsKLQlyZWdpc3RlciBQeVN0cmluZ09iamVjdCAqb3A7CisgICAgcmVnaXN0ZXIgc2l6ZV90IHNpemU7CisgICAgcmVnaXN0ZXIgUHlTdHJpbmdPYmplY3QgKm9wOwogCi0JYXNzZXJ0KHN0ciAhPSBOVUxMKTsKLQlzaXplID0gc3RybGVuKHN0cik7Ci0JaWYgKHNpemUgPiBQWV9TU0laRV9UX01BWCAtIHNpemVvZihQeVN0cmluZ09iamVjdCkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0JCQkic3RyaW5nIGlzIHRvbyBsb25nIGZvciBhIFB5dGhvbiBzdHJpbmciKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChzaXplID09IDAgJiYgKG9wID0gbnVsbHN0cmluZykgIT0gTlVMTCkgeworICAgIGFzc2VydChzdHIgIT0gTlVMTCk7CisgICAgc2l6ZSA9IHN0cmxlbihzdHIpOworICAgIGlmIChzaXplID4gUFlfU1NJWkVfVF9NQVggLSBzaXplb2YoUHlTdHJpbmdPYmplY3QpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgInN0cmluZyBpcyB0b28gbG9uZyBmb3IgYSBQeXRob24gc3RyaW5nIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoc2l6ZSA9PSAwICYmIChvcCA9IG51bGxzdHJpbmcpICE9IE5VTEwpIHsKICNpZmRlZiBDT1VOVF9BTExPQ1MKLQkJbnVsbF9zdHJpbmdzKys7CisgICAgICAgIG51bGxfc3RyaW5ncysrOwogI2VuZGlmCi0JCVB5X0lOQ1JFRihvcCk7Ci0JCXJldHVybiAoUHlPYmplY3QgKilvcDsKLQl9Ci0JaWYgKHNpemUgPT0gMSAmJiAob3AgPSBjaGFyYWN0ZXJzWypzdHIgJiBVQ0hBUl9NQVhdKSAhPSBOVUxMKSB7CisgICAgICAgIFB5X0lOQ1JFRihvcCk7CisgICAgICAgIHJldHVybiAoUHlPYmplY3QgKilvcDsKKyAgICB9CisgICAgaWYgKHNpemUgPT0gMSAmJiAob3AgPSBjaGFyYWN0ZXJzWypzdHIgJiBVQ0hBUl9NQVhdKSAhPSBOVUxMKSB7CiAjaWZkZWYgQ09VTlRfQUxMT0NTCi0JCW9uZV9zdHJpbmdzKys7CisgICAgICAgIG9uZV9zdHJpbmdzKys7CiAjZW5kaWYKLQkJUHlfSU5DUkVGKG9wKTsKLQkJcmV0dXJuIChQeU9iamVjdCAqKW9wOwotCX0KKyAgICAgICAgUHlfSU5DUkVGKG9wKTsKKyAgICAgICAgcmV0dXJuIChQeU9iamVjdCAqKW9wOworICAgIH0KIAotCS8qIElubGluZSBQeU9iamVjdF9OZXdWYXIgKi8KLQlvcCA9IChQeVN0cmluZ09iamVjdCAqKVB5T2JqZWN0X01BTExPQyhzaXplb2YoUHlTdHJpbmdPYmplY3QpICsgc2l6ZSk7Ci0JaWYgKG9wID09IE5VTEwpCi0JCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCVB5T2JqZWN0X0lOSVRfVkFSKG9wLCAmUHlTdHJpbmdfVHlwZSwgc2l6ZSk7Ci0Jb3AtPm9iX3NoYXNoID0gLTE7Ci0Jb3AtPm9iX3NzdGF0ZSA9IFNTVEFURV9OT1RfSU5URVJORUQ7Ci0JUHlfTUVNQ1BZKG9wLT5vYl9zdmFsLCBzdHIsIHNpemUrMSk7Ci0JLyogc2hhcmUgc2hvcnQgc3RyaW5ncyAqLwotCWlmIChzaXplID09IDApIHsKLQkJUHlPYmplY3QgKnQgPSAoUHlPYmplY3QgKilvcDsKLQkJUHlTdHJpbmdfSW50ZXJuSW5QbGFjZSgmdCk7Ci0JCW9wID0gKFB5U3RyaW5nT2JqZWN0ICopdDsKLQkJbnVsbHN0cmluZyA9IG9wOwotCQlQeV9JTkNSRUYob3ApOwotCX0gZWxzZSBpZiAoc2l6ZSA9PSAxKSB7Ci0JCVB5T2JqZWN0ICp0ID0gKFB5T2JqZWN0ICopb3A7Ci0JCVB5U3RyaW5nX0ludGVybkluUGxhY2UoJnQpOwotCQlvcCA9IChQeVN0cmluZ09iamVjdCAqKXQ7Ci0JCWNoYXJhY3RlcnNbKnN0ciAmIFVDSEFSX01BWF0gPSBvcDsKLQkJUHlfSU5DUkVGKG9wKTsKLQl9Ci0JcmV0dXJuIChQeU9iamVjdCAqKSBvcDsKKyAgICAvKiBJbmxpbmUgUHlPYmplY3RfTmV3VmFyICovCisgICAgb3AgPSAoUHlTdHJpbmdPYmplY3QgKilQeU9iamVjdF9NQUxMT0Moc2l6ZW9mKFB5U3RyaW5nT2JqZWN0KSArIHNpemUpOworICAgIGlmIChvcCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICBQeU9iamVjdF9JTklUX1ZBUihvcCwgJlB5U3RyaW5nX1R5cGUsIHNpemUpOworICAgIG9wLT5vYl9zaGFzaCA9IC0xOworICAgIG9wLT5vYl9zc3RhdGUgPSBTU1RBVEVfTk9UX0lOVEVSTkVEOworICAgIFB5X01FTUNQWShvcC0+b2Jfc3ZhbCwgc3RyLCBzaXplKzEpOworICAgIC8qIHNoYXJlIHNob3J0IHN0cmluZ3MgKi8KKyAgICBpZiAoc2l6ZSA9PSAwKSB7CisgICAgICAgIFB5T2JqZWN0ICp0ID0gKFB5T2JqZWN0ICopb3A7CisgICAgICAgIFB5U3RyaW5nX0ludGVybkluUGxhY2UoJnQpOworICAgICAgICBvcCA9IChQeVN0cmluZ09iamVjdCAqKXQ7CisgICAgICAgIG51bGxzdHJpbmcgPSBvcDsKKyAgICAgICAgUHlfSU5DUkVGKG9wKTsKKyAgICB9IGVsc2UgaWYgKHNpemUgPT0gMSkgeworICAgICAgICBQeU9iamVjdCAqdCA9IChQeU9iamVjdCAqKW9wOworICAgICAgICBQeVN0cmluZ19JbnRlcm5JblBsYWNlKCZ0KTsKKyAgICAgICAgb3AgPSAoUHlTdHJpbmdPYmplY3QgKil0OworICAgICAgICBjaGFyYWN0ZXJzWypzdHIgJiBVQ0hBUl9NQVhdID0gb3A7CisgICAgICAgIFB5X0lOQ1JFRihvcCk7CisgICAgfQorICAgIHJldHVybiAoUHlPYmplY3QgKikgb3A7CiB9CiAKIFB5T2JqZWN0ICoKIFB5U3RyaW5nX0Zyb21Gb3JtYXRWKGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCB2YXJncykKIHsKLQl2YV9saXN0IGNvdW50OwotCVB5X3NzaXplX3QgbiA9IDA7Ci0JY29uc3QgY2hhciogZjsKLQljaGFyICpzOwotCVB5T2JqZWN0KiBzdHJpbmc7CisgICAgdmFfbGlzdCBjb3VudDsKKyAgICBQeV9zc2l6ZV90IG4gPSAwOworICAgIGNvbnN0IGNoYXIqIGY7CisgICAgY2hhciAqczsKKyAgICBQeU9iamVjdCogc3RyaW5nOwogCiAjaWZkZWYgVkFfTElTVF9JU19BUlJBWQotCVB5X01FTUNQWShjb3VudCwgdmFyZ3MsIHNpemVvZih2YV9saXN0KSk7CisgICAgUHlfTUVNQ1BZKGNvdW50LCB2YXJncywgc2l6ZW9mKHZhX2xpc3QpKTsKICNlbHNlCiAjaWZkZWYgIF9fdmFfY29weQotCV9fdmFfY29weShjb3VudCwgdmFyZ3MpOworICAgIF9fdmFfY29weShjb3VudCwgdmFyZ3MpOwogI2Vsc2UKLQljb3VudCA9IHZhcmdzOworICAgIGNvdW50ID0gdmFyZ3M7CiAjZW5kaWYKICNlbmRpZgotCS8qIHN0ZXAgMTogZmlndXJlIG91dCBob3cgbGFyZ2UgYSBidWZmZXIgd2UgbmVlZCAqLwotCWZvciAoZiA9IGZvcm1hdDsgKmY7IGYrKykgewotCQlpZiAoKmYgPT0gJyUnKSB7Ci0JCQljb25zdCBjaGFyKiBwID0gZjsKLQkJCXdoaWxlICgqKytmICYmICpmICE9ICclJyAmJiAhaXNhbHBoYShQeV9DSEFSTUFTSygqZikpKQotCQkJCTsKKyAgICAvKiBzdGVwIDE6IGZpZ3VyZSBvdXQgaG93IGxhcmdlIGEgYnVmZmVyIHdlIG5lZWQgKi8KKyAgICBmb3IgKGYgPSBmb3JtYXQ7ICpmOyBmKyspIHsKKyAgICAgICAgaWYgKCpmID09ICclJykgeworICAgICAgICAgICAgY29uc3QgY2hhciogcCA9IGY7CisgICAgICAgICAgICB3aGlsZSAoKisrZiAmJiAqZiAhPSAnJScgJiYgIWlzYWxwaGEoUHlfQ0hBUk1BU0soKmYpKSkKKyAgICAgICAgICAgICAgICA7CiAKLQkJCS8qIHNraXAgdGhlICdsJyBvciAneicgaW4geyVsZCwgJXpkLCAlbHUsICV6dX0gc2luY2UKLQkJCSAqIHRoZXkgZG9uJ3QgYWZmZWN0IHRoZSBhbW91bnQgb2Ygc3BhY2Ugd2UgcmVzZXJ2ZS4KLQkJCSAqLwotCQkJaWYgKCgqZiA9PSAnbCcgfHwgKmYgPT0gJ3onKSAmJgotCQkJCQkoZlsxXSA9PSAnZCcgfHwgZlsxXSA9PSAndScpKQotCQkJCSsrZjsKKyAgICAgICAgICAgIC8qIHNraXAgdGhlICdsJyBvciAneicgaW4geyVsZCwgJXpkLCAlbHUsICV6dX0gc2luY2UKKyAgICAgICAgICAgICAqIHRoZXkgZG9uJ3QgYWZmZWN0IHRoZSBhbW91bnQgb2Ygc3BhY2Ugd2UgcmVzZXJ2ZS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKCgqZiA9PSAnbCcgfHwgKmYgPT0gJ3onKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmWzFdID09ICdkJyB8fCBmWzFdID09ICd1JykpCisgICAgICAgICAgICAgICAgKytmOwogCi0JCQlzd2l0Y2ggKCpmKSB7Ci0JCQljYXNlICdjJzoKLQkJCQkodm9pZCl2YV9hcmcoY291bnQsIGludCk7Ci0JCQkJLyogZmFsbCB0aHJvdWdoLi4uICovCi0JCQljYXNlICclJzoKLQkJCQluKys7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICdkJzogY2FzZSAndSc6IGNhc2UgJ2knOiBjYXNlICd4JzoKLQkJCQkodm9pZCkgdmFfYXJnKGNvdW50LCBpbnQpOwotCQkJCS8qIDIwIGJ5dGVzIGlzIGVub3VnaCB0byBob2xkIGEgNjQtYml0Ci0JCQkJICAgaW50ZWdlci4gIERlY2ltYWwgdGFrZXMgdGhlIG1vc3Qgc3BhY2UuCi0JCQkJICAgVGhpcyBpc24ndCBlbm91Z2ggZm9yIG9jdGFsLiAqLwotCQkJCW4gKz0gMjA7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICdzJzoKLQkJCQlzID0gdmFfYXJnKGNvdW50LCBjaGFyKik7Ci0JCQkJbiArPSBzdHJsZW4ocyk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICdwJzoKLQkJCQkodm9pZCkgdmFfYXJnKGNvdW50LCBpbnQpOwotCQkJCS8qIG1heGltdW0gNjQtYml0IHBvaW50ZXIgcmVwcmVzZW50YXRpb246Ci0JCQkJICogMHhmZmZmZmZmZmZmZmZmZmZmCi0JCQkJICogc28gMTkgY2hhcmFjdGVycyBpcyBlbm91Z2guCi0JCQkJICogWFhYIEkgY291bnQgMTggLS0gd2hhdCdzIHRoZSBleHRyYSBmb3I/Ci0JCQkJICovCi0JCQkJbiArPSAxOTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJLyogaWYgd2Ugc3R1bWJsZSB1cG9uIGFuIHVua25vd24KLQkJCQkgICBmb3JtYXR0aW5nIGNvZGUsIGNvcHkgdGhlIHJlc3Qgb2YKLQkJCQkgICB0aGUgZm9ybWF0IHN0cmluZyB0byB0aGUgb3V0cHV0Ci0JCQkJICAgc3RyaW5nLiAod2UgY2Fubm90IGp1c3Qgc2tpcCB0aGUKLQkJCQkgICBjb2RlLCBzaW5jZSB0aGVyZSdzIG5vIHdheSB0byBrbm93Ci0JCQkJICAgd2hhdCdzIGluIHRoZSBhcmd1bWVudCBsaXN0KSAqLwotCQkJCW4gKz0gc3RybGVuKHApOwotCQkJCWdvdG8gZXhwYW5kOwotCQkJfQotCQl9IGVsc2UKLQkJCW4rKzsKLQl9CisgICAgICAgICAgICBzd2l0Y2ggKCpmKSB7CisgICAgICAgICAgICBjYXNlICdjJzoKKyAgICAgICAgICAgICAgICAodm9pZCl2YV9hcmcoY291bnQsIGludCk7CisgICAgICAgICAgICAgICAgLyogZmFsbCB0aHJvdWdoLi4uICovCisgICAgICAgICAgICBjYXNlICclJzoKKyAgICAgICAgICAgICAgICBuKys7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdkJzogY2FzZSAndSc6IGNhc2UgJ2knOiBjYXNlICd4JzoKKyAgICAgICAgICAgICAgICAodm9pZCkgdmFfYXJnKGNvdW50LCBpbnQpOworICAgICAgICAgICAgICAgIC8qIDIwIGJ5dGVzIGlzIGVub3VnaCB0byBob2xkIGEgNjQtYml0CisgICAgICAgICAgICAgICAgICAgaW50ZWdlci4gIERlY2ltYWwgdGFrZXMgdGhlIG1vc3Qgc3BhY2UuCisgICAgICAgICAgICAgICAgICAgVGhpcyBpc24ndCBlbm91Z2ggZm9yIG9jdGFsLiAqLworICAgICAgICAgICAgICAgIG4gKz0gMjA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdzJzoKKyAgICAgICAgICAgICAgICBzID0gdmFfYXJnKGNvdW50LCBjaGFyKik7CisgICAgICAgICAgICAgICAgbiArPSBzdHJsZW4ocyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdwJzoKKyAgICAgICAgICAgICAgICAodm9pZCkgdmFfYXJnKGNvdW50LCBpbnQpOworICAgICAgICAgICAgICAgIC8qIG1heGltdW0gNjQtYml0IHBvaW50ZXIgcmVwcmVzZW50YXRpb246CisgICAgICAgICAgICAgICAgICogMHhmZmZmZmZmZmZmZmZmZmZmCisgICAgICAgICAgICAgICAgICogc28gMTkgY2hhcmFjdGVycyBpcyBlbm91Z2guCisgICAgICAgICAgICAgICAgICogWFhYIEkgY291bnQgMTggLS0gd2hhdCdzIHRoZSBleHRyYSBmb3I/CisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgbiArPSAxOTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgLyogaWYgd2Ugc3R1bWJsZSB1cG9uIGFuIHVua25vd24KKyAgICAgICAgICAgICAgICAgICBmb3JtYXR0aW5nIGNvZGUsIGNvcHkgdGhlIHJlc3Qgb2YKKyAgICAgICAgICAgICAgICAgICB0aGUgZm9ybWF0IHN0cmluZyB0byB0aGUgb3V0cHV0CisgICAgICAgICAgICAgICAgICAgc3RyaW5nLiAod2UgY2Fubm90IGp1c3Qgc2tpcCB0aGUKKyAgICAgICAgICAgICAgICAgICBjb2RlLCBzaW5jZSB0aGVyZSdzIG5vIHdheSB0byBrbm93CisgICAgICAgICAgICAgICAgICAgd2hhdCdzIGluIHRoZSBhcmd1bWVudCBsaXN0KSAqLworICAgICAgICAgICAgICAgIG4gKz0gc3RybGVuKHApOworICAgICAgICAgICAgICAgIGdvdG8gZXhwYW5kOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIG4rKzsKKyAgICB9CiAgZXhwYW5kOgotCS8qIHN0ZXAgMjogZmlsbCB0aGUgYnVmZmVyICovCi0JLyogU2luY2Ugd2UndmUgYW5hbHl6ZWQgaG93IG11Y2ggc3BhY2Ugd2UgbmVlZCBmb3IgdGhlIHdvcnN0IGNhc2UsCi0JICAgdXNlIHNwcmludGYgZGlyZWN0bHkgaW5zdGVhZCBvZiB0aGUgc2xvd2VyIFB5T1Nfc25wcmludGYuICovCi0Jc3RyaW5nID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbik7Ci0JaWYgKCFzdHJpbmcpCi0JCXJldHVybiBOVUxMOworICAgIC8qIHN0ZXAgMjogZmlsbCB0aGUgYnVmZmVyICovCisgICAgLyogU2luY2Ugd2UndmUgYW5hbHl6ZWQgaG93IG11Y2ggc3BhY2Ugd2UgbmVlZCBmb3IgdGhlIHdvcnN0IGNhc2UsCisgICAgICAgdXNlIHNwcmludGYgZGlyZWN0bHkgaW5zdGVhZCBvZiB0aGUgc2xvd2VyIFB5T1Nfc25wcmludGYuICovCisgICAgc3RyaW5nID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbik7CisgICAgaWYgKCFzdHJpbmcpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JcyA9IFB5U3RyaW5nX0FzU3RyaW5nKHN0cmluZyk7CisgICAgcyA9IFB5U3RyaW5nX0FzU3RyaW5nKHN0cmluZyk7CiAKLQlmb3IgKGYgPSBmb3JtYXQ7ICpmOyBmKyspIHsKLQkJaWYgKCpmID09ICclJykgewotCQkJY29uc3QgY2hhciogcCA9IGYrKzsKLQkJCVB5X3NzaXplX3QgaTsKLQkJCWludCBsb25nZmxhZyA9IDA7Ci0JCQlpbnQgc2l6ZV90ZmxhZyA9IDA7Ci0JCQkvKiBwYXJzZSB0aGUgd2lkdGgucHJlY2lzaW9uIHBhcnQgKHdlJ3JlIG9ubHkKLQkJCSAgIGludGVyZXN0ZWQgaW4gdGhlIHByZWNpc2lvbiB2YWx1ZSwgaWYgYW55KSAqLwotCQkJbiA9IDA7Ci0JCQl3aGlsZSAoaXNkaWdpdChQeV9DSEFSTUFTSygqZikpKQotCQkJCW4gPSAobioxMCkgKyAqZisrIC0gJzAnOwotCQkJaWYgKCpmID09ICcuJykgewotCQkJCWYrKzsKLQkJCQluID0gMDsKLQkJCQl3aGlsZSAoaXNkaWdpdChQeV9DSEFSTUFTSygqZikpKQotCQkJCQluID0gKG4qMTApICsgKmYrKyAtICcwJzsKLQkJCX0KLQkJCXdoaWxlICgqZiAmJiAqZiAhPSAnJScgJiYgIWlzYWxwaGEoUHlfQ0hBUk1BU0soKmYpKSkKLQkJCQlmKys7Ci0JCQkvKiBoYW5kbGUgdGhlIGxvbmcgZmxhZywgYnV0IG9ubHkgZm9yICVsZCBhbmQgJWx1LgotCQkJICAgb3RoZXJzIGNhbiBiZSBhZGRlZCB3aGVuIG5lY2Vzc2FyeS4gKi8KLQkJCWlmICgqZiA9PSAnbCcgJiYgKGZbMV0gPT0gJ2QnIHx8IGZbMV0gPT0gJ3UnKSkgewotCQkJCWxvbmdmbGFnID0gMTsKLQkJCQkrK2Y7Ci0JCQl9Ci0JCQkvKiBoYW5kbGUgdGhlIHNpemVfdCBmbGFnLiAqLwotCQkJaWYgKCpmID09ICd6JyAmJiAoZlsxXSA9PSAnZCcgfHwgZlsxXSA9PSAndScpKSB7Ci0JCQkJc2l6ZV90ZmxhZyA9IDE7Ci0JCQkJKytmOwotCQkJfQorICAgIGZvciAoZiA9IGZvcm1hdDsgKmY7IGYrKykgeworICAgICAgICBpZiAoKmYgPT0gJyUnKSB7CisgICAgICAgICAgICBjb25zdCBjaGFyKiBwID0gZisrOworICAgICAgICAgICAgUHlfc3NpemVfdCBpOworICAgICAgICAgICAgaW50IGxvbmdmbGFnID0gMDsKKyAgICAgICAgICAgIGludCBzaXplX3RmbGFnID0gMDsKKyAgICAgICAgICAgIC8qIHBhcnNlIHRoZSB3aWR0aC5wcmVjaXNpb24gcGFydCAod2UncmUgb25seQorICAgICAgICAgICAgICAgaW50ZXJlc3RlZCBpbiB0aGUgcHJlY2lzaW9uIHZhbHVlLCBpZiBhbnkpICovCisgICAgICAgICAgICBuID0gMDsKKyAgICAgICAgICAgIHdoaWxlIChpc2RpZ2l0KFB5X0NIQVJNQVNLKCpmKSkpCisgICAgICAgICAgICAgICAgbiA9IChuKjEwKSArICpmKysgLSAnMCc7CisgICAgICAgICAgICBpZiAoKmYgPT0gJy4nKSB7CisgICAgICAgICAgICAgICAgZisrOworICAgICAgICAgICAgICAgIG4gPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChpc2RpZ2l0KFB5X0NIQVJNQVNLKCpmKSkpCisgICAgICAgICAgICAgICAgICAgIG4gPSAobioxMCkgKyAqZisrIC0gJzAnOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd2hpbGUgKCpmICYmICpmICE9ICclJyAmJiAhaXNhbHBoYShQeV9DSEFSTUFTSygqZikpKQorICAgICAgICAgICAgICAgIGYrKzsKKyAgICAgICAgICAgIC8qIGhhbmRsZSB0aGUgbG9uZyBmbGFnLCBidXQgb25seSBmb3IgJWxkIGFuZCAlbHUuCisgICAgICAgICAgICAgICBvdGhlcnMgY2FuIGJlIGFkZGVkIHdoZW4gbmVjZXNzYXJ5LiAqLworICAgICAgICAgICAgaWYgKCpmID09ICdsJyAmJiAoZlsxXSA9PSAnZCcgfHwgZlsxXSA9PSAndScpKSB7CisgICAgICAgICAgICAgICAgbG9uZ2ZsYWcgPSAxOworICAgICAgICAgICAgICAgICsrZjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIGhhbmRsZSB0aGUgc2l6ZV90IGZsYWcuICovCisgICAgICAgICAgICBpZiAoKmYgPT0gJ3onICYmIChmWzFdID09ICdkJyB8fCBmWzFdID09ICd1JykpIHsKKyAgICAgICAgICAgICAgICBzaXplX3RmbGFnID0gMTsKKyAgICAgICAgICAgICAgICArK2Y7CisgICAgICAgICAgICB9CiAKLQkJCXN3aXRjaCAoKmYpIHsKLQkJCWNhc2UgJ2MnOgotCQkJCSpzKysgPSB2YV9hcmcodmFyZ3MsIGludCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICdkJzoKLQkJCQlpZiAobG9uZ2ZsYWcpCi0JCQkJCXNwcmludGYocywgIiVsZCIsIHZhX2FyZyh2YXJncywgbG9uZykpOwotCQkJCWVsc2UgaWYgKHNpemVfdGZsYWcpCi0JCQkJCXNwcmludGYocywgIiUiIFBZX0ZPUk1BVF9TSVpFX1QgImQiLAotCQkJCQkgICAgICAgIHZhX2FyZyh2YXJncywgUHlfc3NpemVfdCkpOwotCQkJCWVsc2UKLQkJCQkJc3ByaW50ZihzLCAiJWQiLCB2YV9hcmcodmFyZ3MsIGludCkpOwotCQkJCXMgKz0gc3RybGVuKHMpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAndSc6Ci0JCQkJaWYgKGxvbmdmbGFnKQotCQkJCQlzcHJpbnRmKHMsICIlbHUiLAotCQkJCQkJdmFfYXJnKHZhcmdzLCB1bnNpZ25lZCBsb25nKSk7Ci0JCQkJZWxzZSBpZiAoc2l6ZV90ZmxhZykKLQkJCQkJc3ByaW50ZihzLCAiJSIgUFlfRk9STUFUX1NJWkVfVCAidSIsCi0JCQkJCSAgICAgICAgdmFfYXJnKHZhcmdzLCBzaXplX3QpKTsKLQkJCQllbHNlCi0JCQkJCXNwcmludGYocywgIiV1IiwKLQkJCQkJCXZhX2FyZyh2YXJncywgdW5zaWduZWQgaW50KSk7Ci0JCQkJcyArPSBzdHJsZW4ocyk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICdpJzoKLQkJCQlzcHJpbnRmKHMsICIlaSIsIHZhX2FyZyh2YXJncywgaW50KSk7Ci0JCQkJcyArPSBzdHJsZW4ocyk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICd4JzoKLQkJCQlzcHJpbnRmKHMsICIleCIsIHZhX2FyZyh2YXJncywgaW50KSk7Ci0JCQkJcyArPSBzdHJsZW4ocyk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICdzJzoKLQkJCQlwID0gdmFfYXJnKHZhcmdzLCBjaGFyKik7Ci0JCQkJaSA9IHN0cmxlbihwKTsKLQkJCQlpZiAobiA+IDAgJiYgaSA+IG4pCi0JCQkJCWkgPSBuOwotCQkJCVB5X01FTUNQWShzLCBwLCBpKTsKLQkJCQlzICs9IGk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICdwJzoKLQkJCQlzcHJpbnRmKHMsICIlcCIsIHZhX2FyZyh2YXJncywgdm9pZCopKTsKLQkJCQkvKiAlcCBpcyBpbGwtZGVmaW5lZDogIGVuc3VyZSBsZWFkaW5nIDB4LiAqLwotCQkJCWlmIChzWzFdID09ICdYJykKLQkJCQkJc1sxXSA9ICd4JzsKLQkJCQllbHNlIGlmIChzWzFdICE9ICd4JykgewotCQkJCQltZW1tb3ZlKHMrMiwgcywgc3RybGVuKHMpKzEpOwotCQkJCQlzWzBdID0gJzAnOwotCQkJCQlzWzFdID0gJ3gnOwotCQkJCX0KLQkJCQlzICs9IHN0cmxlbihzKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgJyUnOgotCQkJCSpzKysgPSAnJSc7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCXN0cmNweShzLCBwKTsKLQkJCQlzICs9IHN0cmxlbihzKTsKLQkJCQlnb3RvIGVuZDsKLQkJCX0KLQkJfSBlbHNlCi0JCQkqcysrID0gKmY7Ci0JfQorICAgICAgICAgICAgc3dpdGNoICgqZikgeworICAgICAgICAgICAgY2FzZSAnYyc6CisgICAgICAgICAgICAgICAgKnMrKyA9IHZhX2FyZyh2YXJncywgaW50KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ2QnOgorICAgICAgICAgICAgICAgIGlmIChsb25nZmxhZykKKyAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihzLCAiJWxkIiwgdmFfYXJnKHZhcmdzLCBsb25nKSk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoc2l6ZV90ZmxhZykKKyAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihzLCAiJSIgUFlfRk9STUFUX1NJWkVfVCAiZCIsCisgICAgICAgICAgICAgICAgICAgICAgICB2YV9hcmcodmFyZ3MsIFB5X3NzaXplX3QpKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHNwcmludGYocywgIiVkIiwgdmFfYXJnKHZhcmdzLCBpbnQpKTsKKyAgICAgICAgICAgICAgICBzICs9IHN0cmxlbihzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ3UnOgorICAgICAgICAgICAgICAgIGlmIChsb25nZmxhZykKKyAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihzLCAiJWx1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhX2FyZyh2YXJncywgdW5zaWduZWQgbG9uZykpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNpemVfdGZsYWcpCisgICAgICAgICAgICAgICAgICAgIHNwcmludGYocywgIiUiIFBZX0ZPUk1BVF9TSVpFX1QgInUiLAorICAgICAgICAgICAgICAgICAgICAgICAgdmFfYXJnKHZhcmdzLCBzaXplX3QpKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHNwcmludGYocywgIiV1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhX2FyZyh2YXJncywgdW5zaWduZWQgaW50KSk7CisgICAgICAgICAgICAgICAgcyArPSBzdHJsZW4ocyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdpJzoKKyAgICAgICAgICAgICAgICBzcHJpbnRmKHMsICIlaSIsIHZhX2FyZyh2YXJncywgaW50KSk7CisgICAgICAgICAgICAgICAgcyArPSBzdHJsZW4ocyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICd4JzoKKyAgICAgICAgICAgICAgICBzcHJpbnRmKHMsICIleCIsIHZhX2FyZyh2YXJncywgaW50KSk7CisgICAgICAgICAgICAgICAgcyArPSBzdHJsZW4ocyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdzJzoKKyAgICAgICAgICAgICAgICBwID0gdmFfYXJnKHZhcmdzLCBjaGFyKik7CisgICAgICAgICAgICAgICAgaSA9IHN0cmxlbihwKTsKKyAgICAgICAgICAgICAgICBpZiAobiA+IDAgJiYgaSA+IG4pCisgICAgICAgICAgICAgICAgICAgIGkgPSBuOworICAgICAgICAgICAgICAgIFB5X01FTUNQWShzLCBwLCBpKTsKKyAgICAgICAgICAgICAgICBzICs9IGk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdwJzoKKyAgICAgICAgICAgICAgICBzcHJpbnRmKHMsICIlcCIsIHZhX2FyZyh2YXJncywgdm9pZCopKTsKKyAgICAgICAgICAgICAgICAvKiAlcCBpcyBpbGwtZGVmaW5lZDogIGVuc3VyZSBsZWFkaW5nIDB4LiAqLworICAgICAgICAgICAgICAgIGlmIChzWzFdID09ICdYJykKKyAgICAgICAgICAgICAgICAgICAgc1sxXSA9ICd4JzsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChzWzFdICE9ICd4JykgeworICAgICAgICAgICAgICAgICAgICBtZW1tb3ZlKHMrMiwgcywgc3RybGVuKHMpKzEpOworICAgICAgICAgICAgICAgICAgICBzWzBdID0gJzAnOworICAgICAgICAgICAgICAgICAgICBzWzFdID0gJ3gnOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzICs9IHN0cmxlbihzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJyUnOgorICAgICAgICAgICAgICAgICpzKysgPSAnJSc7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHN0cmNweShzLCBwKTsKKyAgICAgICAgICAgICAgICBzICs9IHN0cmxlbihzKTsKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAqcysrID0gKmY7CisgICAgfQogCiAgZW5kOgotCV9QeVN0cmluZ19SZXNpemUoJnN0cmluZywgcyAtIFB5U3RyaW5nX0FTX1NUUklORyhzdHJpbmcpKTsKLQlyZXR1cm4gc3RyaW5nOworICAgIF9QeVN0cmluZ19SZXNpemUoJnN0cmluZywgcyAtIFB5U3RyaW5nX0FTX1NUUklORyhzdHJpbmcpKTsKKyAgICByZXR1cm4gc3RyaW5nOwogfQogCiBQeU9iamVjdCAqCiBQeVN0cmluZ19Gcm9tRm9ybWF0KGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQogewotCVB5T2JqZWN0KiByZXQ7Ci0JdmFfbGlzdCB2YXJnczsKKyAgICBQeU9iamVjdCogcmV0OworICAgIHZhX2xpc3QgdmFyZ3M7CiAKICNpZmRlZiBIQVZFX1NUREFSR19QUk9UT1RZUEVTCi0JdmFfc3RhcnQodmFyZ3MsIGZvcm1hdCk7CisgICAgdmFfc3RhcnQodmFyZ3MsIGZvcm1hdCk7CiAjZWxzZQotCXZhX3N0YXJ0KHZhcmdzKTsKKyAgICB2YV9zdGFydCh2YXJncyk7CiAjZW5kaWYKLQlyZXQgPSBQeVN0cmluZ19Gcm9tRm9ybWF0Vihmb3JtYXQsIHZhcmdzKTsKLQl2YV9lbmQodmFyZ3MpOwotCXJldHVybiByZXQ7CisgICAgcmV0ID0gUHlTdHJpbmdfRnJvbUZvcm1hdFYoZm9ybWF0LCB2YXJncyk7CisgICAgdmFfZW5kKHZhcmdzKTsKKyAgICByZXR1cm4gcmV0OwogfQogCiAKIFB5T2JqZWN0ICpQeVN0cmluZ19EZWNvZGUoY29uc3QgY2hhciAqcywKLQkJCSAgUHlfc3NpemVfdCBzaXplLAotCQkJICBjb25zdCBjaGFyICplbmNvZGluZywKLQkJCSAgY29uc3QgY2hhciAqZXJyb3JzKQorICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplcnJvcnMpCiB7CiAgICAgUHlPYmplY3QgKnYsICpzdHI7CiAKICAgICBzdHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzLCBzaXplKTsKICAgICBpZiAoc3RyID09IE5VTEwpCi0JcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIE5VTEw7CiAgICAgdiA9IFB5U3RyaW5nX0FzRGVjb2RlZFN0cmluZyhzdHIsIGVuY29kaW5nLCBlcnJvcnMpOwogICAgIFB5X0RFQ1JFRihzdHIpOwogICAgIHJldHVybiB2OwogfQogCiBQeU9iamVjdCAqUHlTdHJpbmdfQXNEZWNvZGVkT2JqZWN0KFB5T2JqZWN0ICpzdHIsCi0JCQkJICAgY29uc3QgY2hhciAqZW5jb2RpbmcsCi0JCQkJICAgY29uc3QgY2hhciAqZXJyb3JzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZXJyb3JzKQogewogICAgIFB5T2JqZWN0ICp2OwogCiAgICAgaWYgKCFQeVN0cmluZ19DaGVjayhzdHIpKSB7Ci0gICAgICAgIFB5RXJyX0JhZEFyZ3VtZW50KCk7Ci0gICAgICAgIGdvdG8gb25FcnJvcjsKKyAgICBQeUVycl9CYWRBcmd1bWVudCgpOworICAgIGdvdG8gb25FcnJvcjsKICAgICB9CiAKICAgICBpZiAoZW5jb2RpbmcgPT0gTlVMTCkgewogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQllbmNvZGluZyA9IFB5VW5pY29kZV9HZXREZWZhdWx0RW5jb2RpbmcoKTsKKyAgICBlbmNvZGluZyA9IFB5VW5pY29kZV9HZXREZWZhdWx0RW5jb2RpbmcoKTsKICNlbHNlCi0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJubyBlbmNvZGluZyBzcGVjaWZpZWQiKTsKLQlnb3RvIG9uRXJyb3I7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJubyBlbmNvZGluZyBzcGVjaWZpZWQiKTsKKyAgICBnb3RvIG9uRXJyb3I7CiAjZW5kaWYKICAgICB9CiAKICAgICAvKiBEZWNvZGUgdmlhIHRoZSBjb2RlYyByZWdpc3RyeSAqLwogICAgIHYgPSBQeUNvZGVjX0RlY29kZShzdHIsIGVuY29kaW5nLCBlcnJvcnMpOwogICAgIGlmICh2ID09IE5VTEwpCi0gICAgICAgIGdvdG8gb25FcnJvcjsKKyAgICBnb3RvIG9uRXJyb3I7CiAKICAgICByZXR1cm4gdjsKIApAQCAtNDA3LDMxICs0MDcsMzEgQEAKIH0KIAogUHlPYmplY3QgKlB5U3RyaW5nX0FzRGVjb2RlZFN0cmluZyhQeU9iamVjdCAqc3RyLAotCQkJCSAgIGNvbnN0IGNoYXIgKmVuY29kaW5nLAotCQkJCSAgIGNvbnN0IGNoYXIgKmVycm9ycykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVycm9ycykKIHsKICAgICBQeU9iamVjdCAqdjsKIAogICAgIHYgPSBQeVN0cmluZ19Bc0RlY29kZWRPYmplY3Qoc3RyLCBlbmNvZGluZywgZXJyb3JzKTsKICAgICBpZiAodiA9PSBOVUxMKQotICAgICAgICBnb3RvIG9uRXJyb3I7CisgICAgZ290byBvbkVycm9yOwogCiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQogICAgIC8qIENvbnZlcnQgVW5pY29kZSB0byBhIHN0cmluZyB1c2luZyB0aGUgZGVmYXVsdCBlbmNvZGluZyAqLwogICAgIGlmIChQeVVuaWNvZGVfQ2hlY2sodikpIHsKLQlQeU9iamVjdCAqdGVtcCA9IHY7Ci0JdiA9IFB5VW5pY29kZV9Bc0VuY29kZWRTdHJpbmcodiwgTlVMTCwgTlVMTCk7Ci0JUHlfREVDUkVGKHRlbXApOwotCWlmICh2ID09IE5VTEwpCi0JICAgIGdvdG8gb25FcnJvcjsKKyAgICBQeU9iamVjdCAqdGVtcCA9IHY7CisgICAgdiA9IFB5VW5pY29kZV9Bc0VuY29kZWRTdHJpbmcodiwgTlVMTCwgTlVMTCk7CisgICAgUHlfREVDUkVGKHRlbXApOworICAgIGlmICh2ID09IE5VTEwpCisgICAgICAgIGdvdG8gb25FcnJvcjsKICAgICB9CiAjZW5kaWYKICAgICBpZiAoIVB5U3RyaW5nX0NoZWNrKHYpKSB7Ci0gICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiZGVjb2RlciBkaWQgbm90IHJldHVybiBhIHN0cmluZyBvYmplY3QgKHR5cGU9JS40MDBzKSIsCi0gICAgICAgICAgICAgICAgICAgICBQeV9UWVBFKHYpLT50cF9uYW1lKTsKLSAgICAgICAgUHlfREVDUkVGKHYpOwotICAgICAgICBnb3RvIG9uRXJyb3I7CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgImRlY29kZXIgZGlkIG5vdCByZXR1cm4gYSBzdHJpbmcgb2JqZWN0ICh0eXBlPSUuNDAwcykiLAorICAgICAgICAgICAgICAgICBQeV9UWVBFKHYpLT50cF9uYW1lKTsKKyAgICBQeV9ERUNSRUYodik7CisgICAgZ290byBvbkVycm9yOwogICAgIH0KIAogICAgIHJldHVybiB2OwpAQCAtNDQxLDQ0ICs0NDEsNDQgQEAKIH0KIAogUHlPYmplY3QgKlB5U3RyaW5nX0VuY29kZShjb25zdCBjaGFyICpzLAotCQkJICBQeV9zc2l6ZV90IHNpemUsCi0JCQkgIGNvbnN0IGNoYXIgKmVuY29kaW5nLAotCQkJICBjb25zdCBjaGFyICplcnJvcnMpCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVycm9ycykKIHsKICAgICBQeU9iamVjdCAqdiwgKnN0cjsKIAogICAgIHN0ciA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHMsIHNpemUpOwogICAgIGlmIChzdHIgPT0gTlVMTCkKLQlyZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gTlVMTDsKICAgICB2ID0gUHlTdHJpbmdfQXNFbmNvZGVkU3RyaW5nKHN0ciwgZW5jb2RpbmcsIGVycm9ycyk7CiAgICAgUHlfREVDUkVGKHN0cik7CiAgICAgcmV0dXJuIHY7CiB9CiAKIFB5T2JqZWN0ICpQeVN0cmluZ19Bc0VuY29kZWRPYmplY3QoUHlPYmplY3QgKnN0ciwKLQkJCQkgICBjb25zdCBjaGFyICplbmNvZGluZywKLQkJCQkgICBjb25zdCBjaGFyICplcnJvcnMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplcnJvcnMpCiB7CiAgICAgUHlPYmplY3QgKnY7CiAKICAgICBpZiAoIVB5U3RyaW5nX0NoZWNrKHN0cikpIHsKLSAgICAgICAgUHlFcnJfQmFkQXJndW1lbnQoKTsKLSAgICAgICAgZ290byBvbkVycm9yOworICAgIFB5RXJyX0JhZEFyZ3VtZW50KCk7CisgICAgZ290byBvbkVycm9yOwogICAgIH0KIAogICAgIGlmIChlbmNvZGluZyA9PSBOVUxMKSB7CiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCWVuY29kaW5nID0gUHlVbmljb2RlX0dldERlZmF1bHRFbmNvZGluZygpOworICAgIGVuY29kaW5nID0gUHlVbmljb2RlX0dldERlZmF1bHRFbmNvZGluZygpOwogI2Vsc2UKLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIm5vIGVuY29kaW5nIHNwZWNpZmllZCIpOwotCWdvdG8gb25FcnJvcjsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIm5vIGVuY29kaW5nIHNwZWNpZmllZCIpOworICAgIGdvdG8gb25FcnJvcjsKICNlbmRpZgogICAgIH0KIAogICAgIC8qIEVuY29kZSB2aWEgdGhlIGNvZGVjIHJlZ2lzdHJ5ICovCiAgICAgdiA9IFB5Q29kZWNfRW5jb2RlKHN0ciwgZW5jb2RpbmcsIGVycm9ycyk7CiAgICAgaWYgKHYgPT0gTlVMTCkKLSAgICAgICAgZ290byBvbkVycm9yOworICAgIGdvdG8gb25FcnJvcjsKIAogICAgIHJldHVybiB2OwogCkBAIC00ODcsMzEgKzQ4NywzMSBAQAogfQogCiBQeU9iamVjdCAqUHlTdHJpbmdfQXNFbmNvZGVkU3RyaW5nKFB5T2JqZWN0ICpzdHIsCi0JCQkJICAgY29uc3QgY2hhciAqZW5jb2RpbmcsCi0JCQkJICAgY29uc3QgY2hhciAqZXJyb3JzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZXJyb3JzKQogewogICAgIFB5T2JqZWN0ICp2OwogCiAgICAgdiA9IFB5U3RyaW5nX0FzRW5jb2RlZE9iamVjdChzdHIsIGVuY29kaW5nLCBlcnJvcnMpOwogICAgIGlmICh2ID09IE5VTEwpCi0gICAgICAgIGdvdG8gb25FcnJvcjsKKyAgICBnb3RvIG9uRXJyb3I7CiAKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCiAgICAgLyogQ29udmVydCBVbmljb2RlIHRvIGEgc3RyaW5nIHVzaW5nIHRoZSBkZWZhdWx0IGVuY29kaW5nICovCiAgICAgaWYgKFB5VW5pY29kZV9DaGVjayh2KSkgewotCVB5T2JqZWN0ICp0ZW1wID0gdjsKLQl2ID0gUHlVbmljb2RlX0FzRW5jb2RlZFN0cmluZyh2LCBOVUxMLCBOVUxMKTsKLQlQeV9ERUNSRUYodGVtcCk7Ci0JaWYgKHYgPT0gTlVMTCkKLQkgICAgZ290byBvbkVycm9yOworICAgIFB5T2JqZWN0ICp0ZW1wID0gdjsKKyAgICB2ID0gUHlVbmljb2RlX0FzRW5jb2RlZFN0cmluZyh2LCBOVUxMLCBOVUxMKTsKKyAgICBQeV9ERUNSRUYodGVtcCk7CisgICAgaWYgKHYgPT0gTlVMTCkKKyAgICAgICAgZ290byBvbkVycm9yOwogICAgIH0KICNlbmRpZgogICAgIGlmICghUHlTdHJpbmdfQ2hlY2sodikpIHsKLSAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJlbmNvZGVyIGRpZCBub3QgcmV0dXJuIGEgc3RyaW5nIG9iamVjdCAodHlwZT0lLjQwMHMpIiwKLSAgICAgICAgICAgICAgICAgICAgIFB5X1RZUEUodiktPnRwX25hbWUpOwotICAgICAgICBQeV9ERUNSRUYodik7Ci0gICAgICAgIGdvdG8gb25FcnJvcjsKKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAiZW5jb2RlciBkaWQgbm90IHJldHVybiBhIHN0cmluZyBvYmplY3QgKHR5cGU9JS40MDBzKSIsCisgICAgICAgICAgICAgICAgIFB5X1RZUEUodiktPnRwX25hbWUpOworICAgIFB5X0RFQ1JFRih2KTsKKyAgICBnb3RvIG9uRXJyb3I7CiAgICAgfQogCiAgICAgcmV0dXJuIHY7CkBAIC01MjMsMjUgKzUyMywyNSBAQAogc3RhdGljIHZvaWQKIHN0cmluZ19kZWFsbG9jKFB5T2JqZWN0ICpvcCkKIHsKLQlzd2l0Y2ggKFB5U3RyaW5nX0NIRUNLX0lOVEVSTkVEKG9wKSkgewotCQljYXNlIFNTVEFURV9OT1RfSU5URVJORUQ6Ci0JCQlicmVhazsKKyAgICBzd2l0Y2ggKFB5U3RyaW5nX0NIRUNLX0lOVEVSTkVEKG9wKSkgeworICAgICAgICBjYXNlIFNTVEFURV9OT1RfSU5URVJORUQ6CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIFNTVEFURV9JTlRFUk5FRF9NT1JUQUw6Ci0JCQkvKiByZXZpdmUgZGVhZCBvYmplY3QgdGVtcG9yYXJpbHkgZm9yIERlbEl0ZW0gKi8KLQkJCVB5X1JFRkNOVChvcCkgPSAzOwotCQkJaWYgKFB5RGljdF9EZWxJdGVtKGludGVybmVkLCBvcCkgIT0gMCkKLQkJCQlQeV9GYXRhbEVycm9yKAotCQkJCQkiZGVsZXRpb24gb2YgaW50ZXJuZWQgc3RyaW5nIGZhaWxlZCIpOwotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgU1NUQVRFX0lOVEVSTkVEX01PUlRBTDoKKyAgICAgICAgICAgIC8qIHJldml2ZSBkZWFkIG9iamVjdCB0ZW1wb3JhcmlseSBmb3IgRGVsSXRlbSAqLworICAgICAgICAgICAgUHlfUkVGQ05UKG9wKSA9IDM7CisgICAgICAgICAgICBpZiAoUHlEaWN0X0RlbEl0ZW0oaW50ZXJuZWQsIG9wKSAhPSAwKQorICAgICAgICAgICAgICAgIFB5X0ZhdGFsRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICJkZWxldGlvbiBvZiBpbnRlcm5lZCBzdHJpbmcgZmFpbGVkIik7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIFNTVEFURV9JTlRFUk5FRF9JTU1PUlRBTDoKLQkJCVB5X0ZhdGFsRXJyb3IoIkltbW9ydGFsIGludGVybmVkIHN0cmluZyBkaWVkLiIpOworICAgICAgICBjYXNlIFNTVEFURV9JTlRFUk5FRF9JTU1PUlRBTDoKKyAgICAgICAgICAgIFB5X0ZhdGFsRXJyb3IoIkltbW9ydGFsIGludGVybmVkIHN0cmluZyBkaWVkLiIpOwogCi0JCWRlZmF1bHQ6Ci0JCQlQeV9GYXRhbEVycm9yKCJJbmNvbnNpc3RlbnQgaW50ZXJuZWQgc3RyaW5nIHN0YXRlLiIpOwotCX0KLQlQeV9UWVBFKG9wKS0+dHBfZnJlZShvcCk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBQeV9GYXRhbEVycm9yKCJJbmNvbnNpc3RlbnQgaW50ZXJuZWQgc3RyaW5nIHN0YXRlLiIpOworICAgIH0KKyAgICBQeV9UWVBFKG9wKS0+dHBfZnJlZShvcCk7CiB9CiAKIC8qIFVuZXNjYXBlIGEgYmFja3NsYXNoLWVzY2FwZWQgc3RyaW5nLiBJZiB1bmljb2RlIGlzIG5vbi16ZXJvLApAQCAtNTUwLDE1MyArNTUwLDE1MyBAQAogICAgc3BlY2lmaWVkIGVuY29kaW5nLiAgKi8KIAogUHlPYmplY3QgKlB5U3RyaW5nX0RlY29kZUVzY2FwZShjb25zdCBjaGFyICpzLAotCQkJCVB5X3NzaXplX3QgbGVuLAotCQkJCWNvbnN0IGNoYXIgKmVycm9ycywKLQkJCQlQeV9zc2l6ZV90IHVuaWNvZGUsCi0JCQkJY29uc3QgY2hhciAqcmVjb2RlX2VuY29kaW5nKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZXJyb3JzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IHVuaWNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnJlY29kZV9lbmNvZGluZykKIHsKLQlpbnQgYzsKLQljaGFyICpwLCAqYnVmOwotCWNvbnN0IGNoYXIgKmVuZDsKLQlQeU9iamVjdCAqdjsKLQlQeV9zc2l6ZV90IG5ld2xlbiA9IHJlY29kZV9lbmNvZGluZyA/IDQqbGVuOmxlbjsKLQl2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilOVUxMLCBuZXdsZW4pOwotCWlmICh2ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXAgPSBidWYgPSBQeVN0cmluZ19Bc1N0cmluZyh2KTsKLQllbmQgPSBzICsgbGVuOwotCXdoaWxlIChzIDwgZW5kKSB7Ci0JCWlmICgqcyAhPSAnXFwnKSB7Ci0JCSAgbm9uX2VzYzoKKyAgICBpbnQgYzsKKyAgICBjaGFyICpwLCAqYnVmOworICAgIGNvbnN0IGNoYXIgKmVuZDsKKyAgICBQeU9iamVjdCAqdjsKKyAgICBQeV9zc2l6ZV90IG5ld2xlbiA9IHJlY29kZV9lbmNvZGluZyA/IDQqbGVuOmxlbjsKKyAgICB2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilOVUxMLCBuZXdsZW4pOworICAgIGlmICh2ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHAgPSBidWYgPSBQeVN0cmluZ19Bc1N0cmluZyh2KTsKKyAgICBlbmQgPSBzICsgbGVuOworICAgIHdoaWxlIChzIDwgZW5kKSB7CisgICAgICAgIGlmICgqcyAhPSAnXFwnKSB7CisgICAgICAgICAgbm9uX2VzYzoKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JCQlpZiAocmVjb2RlX2VuY29kaW5nICYmICgqcyAmIDB4ODApKSB7Ci0JCQkJUHlPYmplY3QgKnUsICp3OwotCQkJCWNoYXIgKnI7Ci0JCQkJY29uc3QgY2hhciogdDsKLQkJCQlQeV9zc2l6ZV90IHJuOwotCQkJCXQgPSBzOwotCQkJCS8qIERlY29kZSBub24tQVNDSUkgYnl0ZXMgYXMgVVRGLTguICovCi0JCQkJd2hpbGUgKHQgPCBlbmQgJiYgKCp0ICYgMHg4MCkpIHQrKzsKLQkJCQl1ID0gUHlVbmljb2RlX0RlY29kZVVURjgocywgdCAtIHMsIGVycm9ycyk7Ci0JCQkJaWYoIXUpIGdvdG8gZmFpbGVkOworICAgICAgICAgICAgaWYgKHJlY29kZV9lbmNvZGluZyAmJiAoKnMgJiAweDgwKSkgeworICAgICAgICAgICAgICAgIFB5T2JqZWN0ICp1LCAqdzsKKyAgICAgICAgICAgICAgICBjaGFyICpyOworICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHQ7CisgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBybjsKKyAgICAgICAgICAgICAgICB0ID0gczsKKyAgICAgICAgICAgICAgICAvKiBEZWNvZGUgbm9uLUFTQ0lJIGJ5dGVzIGFzIFVURi04LiAqLworICAgICAgICAgICAgICAgIHdoaWxlICh0IDwgZW5kICYmICgqdCAmIDB4ODApKSB0Kys7CisgICAgICAgICAgICAgICAgdSA9IFB5VW5pY29kZV9EZWNvZGVVVEY4KHMsIHQgLSBzLCBlcnJvcnMpOworICAgICAgICAgICAgICAgIGlmKCF1KSBnb3RvIGZhaWxlZDsKIAotCQkJCS8qIFJlY29kZSB0aGVtIGluIHRhcmdldCBlbmNvZGluZy4gKi8KLQkJCQl3ID0gUHlVbmljb2RlX0FzRW5jb2RlZFN0cmluZygKLQkJCQkJdSwgcmVjb2RlX2VuY29kaW5nLCBlcnJvcnMpOwotCQkJCVB5X0RFQ1JFRih1KTsKLQkJCQlpZiAoIXcpCWdvdG8gZmFpbGVkOworICAgICAgICAgICAgICAgIC8qIFJlY29kZSB0aGVtIGluIHRhcmdldCBlbmNvZGluZy4gKi8KKyAgICAgICAgICAgICAgICB3ID0gUHlVbmljb2RlX0FzRW5jb2RlZFN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgdSwgcmVjb2RlX2VuY29kaW5nLCBlcnJvcnMpOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih1KTsKKyAgICAgICAgICAgICAgICBpZiAoIXcpICAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKIAotCQkJCS8qIEFwcGVuZCBieXRlcyB0byBvdXRwdXQgYnVmZmVyLiAqLwotCQkJCWFzc2VydChQeVN0cmluZ19DaGVjayh3KSk7Ci0JCQkJciA9IFB5U3RyaW5nX0FTX1NUUklORyh3KTsKLQkJCQlybiA9IFB5U3RyaW5nX0dFVF9TSVpFKHcpOwotCQkJCVB5X01FTUNQWShwLCByLCBybik7Ci0JCQkJcCArPSBybjsKLQkJCQlQeV9ERUNSRUYodyk7Ci0JCQkJcyA9IHQ7Ci0JCQl9IGVsc2UgewotCQkJCSpwKysgPSAqcysrOwotCQkJfQorICAgICAgICAgICAgICAgIC8qIEFwcGVuZCBieXRlcyB0byBvdXRwdXQgYnVmZmVyLiAqLworICAgICAgICAgICAgICAgIGFzc2VydChQeVN0cmluZ19DaGVjayh3KSk7CisgICAgICAgICAgICAgICAgciA9IFB5U3RyaW5nX0FTX1NUUklORyh3KTsKKyAgICAgICAgICAgICAgICBybiA9IFB5U3RyaW5nX0dFVF9TSVpFKHcpOworICAgICAgICAgICAgICAgIFB5X01FTUNQWShwLCByLCBybik7CisgICAgICAgICAgICAgICAgcCArPSBybjsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYodyk7CisgICAgICAgICAgICAgICAgcyA9IHQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICpwKysgPSAqcysrOworICAgICAgICAgICAgfQogI2Vsc2UKLQkJCSpwKysgPSAqcysrOworICAgICAgICAgICAgKnArKyA9ICpzKys7CiAjZW5kaWYKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCXMrKzsKLSAgICAgICAgICAgICAgICBpZiAocz09ZW5kKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkJIlRyYWlsaW5nIFxcIGluIHN0cmluZyIpOwotCQkJZ290byBmYWlsZWQ7Ci0JCX0KLQkJc3dpdGNoICgqcysrKSB7Ci0JCS8qIFhYWCBUaGlzIGFzc3VtZXMgQVNDSUkhICovCi0JCWNhc2UgJ1xuJzogYnJlYWs7Ci0JCWNhc2UgJ1xcJzogKnArKyA9ICdcXCc7IGJyZWFrOwotCQljYXNlICdcJyc6ICpwKysgPSAnXCcnOyBicmVhazsKLQkJY2FzZSAnXCInOiAqcCsrID0gJ1wiJzsgYnJlYWs7Ci0JCWNhc2UgJ2InOiAqcCsrID0gJ1xiJzsgYnJlYWs7Ci0JCWNhc2UgJ2YnOiAqcCsrID0gJ1wwMTQnOyBicmVhazsgLyogRkYgKi8KLQkJY2FzZSAndCc6ICpwKysgPSAnXHQnOyBicmVhazsKLQkJY2FzZSAnbic6ICpwKysgPSAnXG4nOyBicmVhazsKLQkJY2FzZSAncic6ICpwKysgPSAnXHInOyBicmVhazsKLQkJY2FzZSAndic6ICpwKysgPSAnXDAxMyc7IGJyZWFrOyAvKiBWVCAqLwotCQljYXNlICdhJzogKnArKyA9ICdcMDA3JzsgYnJlYWs7IC8qIEJFTCwgbm90IGNsYXNzaWMgQyAqLwotCQljYXNlICcwJzogY2FzZSAnMSc6IGNhc2UgJzInOiBjYXNlICczJzoKLQkJY2FzZSAnNCc6IGNhc2UgJzUnOiBjYXNlICc2JzogY2FzZSAnNyc6Ci0JCQljID0gc1stMV0gLSAnMCc7Ci0JCQlpZiAocyA8IGVuZCAmJiAnMCcgPD0gKnMgJiYgKnMgPD0gJzcnKSB7Ci0JCQkJYyA9IChjPDwzKSArICpzKysgLSAnMCc7Ci0JCQkJaWYgKHMgPCBlbmQgJiYgJzAnIDw9ICpzICYmICpzIDw9ICc3JykKLQkJCQkJYyA9IChjPDwzKSArICpzKysgLSAnMCc7Ci0JCQl9Ci0JCQkqcCsrID0gYzsKLQkJCWJyZWFrOwotCQljYXNlICd4JzoKLQkJCWlmIChzKzEgPCBlbmQgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc3hkaWdpdChQeV9DSEFSTUFTSyhzWzBdKSkgJiYKLQkJCSAgICBpc3hkaWdpdChQeV9DSEFSTUFTSyhzWzFdKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0JCQkJdW5zaWduZWQgaW50IHggPSAwOwotCQkJCWMgPSBQeV9DSEFSTUFTSygqcyk7Ci0JCQkJcysrOwotCQkJCWlmIChpc2RpZ2l0KGMpKQotCQkJCQl4ID0gYyAtICcwJzsKLQkJCQllbHNlIGlmIChpc2xvd2VyKGMpKQotCQkJCQl4ID0gMTAgKyBjIC0gJ2EnOwotCQkJCWVsc2UKLQkJCQkJeCA9IDEwICsgYyAtICdBJzsKLQkJCQl4ID0geCA8PCA0OwotCQkJCWMgPSBQeV9DSEFSTUFTSygqcyk7Ci0JCQkJcysrOwotCQkJCWlmIChpc2RpZ2l0KGMpKQotCQkJCQl4ICs9IGMgLSAnMCc7Ci0JCQkJZWxzZSBpZiAoaXNsb3dlcihjKSkKLQkJCQkJeCArPSAxMCArIGMgLSAnYSc7Ci0JCQkJZWxzZQotCQkJCQl4ICs9IDEwICsgYyAtICdBJzsKLQkJCQkqcCsrID0geDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmICghZXJyb3JzIHx8IHN0cmNtcChlcnJvcnMsICJzdHJpY3QiKSA9PSAwKSB7Ci0JCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJCQkiaW52YWxpZCBcXHggZXNjYXBlIik7Ci0JCQkJZ290byBmYWlsZWQ7Ci0JCQl9Ci0JCQlpZiAoc3RyY21wKGVycm9ycywgInJlcGxhY2UiKSA9PSAwKSB7Ci0JCQkJKnArKyA9ICc/JzsKLQkJCX0gZWxzZSBpZiAoc3RyY21wKGVycm9ycywgImlnbm9yZSIpID09IDApCi0JCQkJLyogZG8gbm90aGluZyAqLzsKLQkJCWVsc2UgewotCQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAotCQkJCQkgICAgICJkZWNvZGluZyBlcnJvcjsgIgotCQkJCQkgICAgICJ1bmtub3duIGVycm9yIGhhbmRsaW5nIGNvZGU6ICUuNDAwcyIsCi0JCQkJCSAgICAgZXJyb3JzKTsKLQkJCQlnb3RvIGZhaWxlZDsKLQkJCX0KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHMrKzsKKyAgICAgICAgaWYgKHM9PWVuZCkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRyYWlsaW5nIFxcIGluIHN0cmluZyIpOworICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoICgqcysrKSB7CisgICAgICAgIC8qIFhYWCBUaGlzIGFzc3VtZXMgQVNDSUkhICovCisgICAgICAgIGNhc2UgJ1xuJzogYnJlYWs7CisgICAgICAgIGNhc2UgJ1xcJzogKnArKyA9ICdcXCc7IGJyZWFrOworICAgICAgICBjYXNlICdcJyc6ICpwKysgPSAnXCcnOyBicmVhazsKKyAgICAgICAgY2FzZSAnXCInOiAqcCsrID0gJ1wiJzsgYnJlYWs7CisgICAgICAgIGNhc2UgJ2InOiAqcCsrID0gJ1xiJzsgYnJlYWs7CisgICAgICAgIGNhc2UgJ2YnOiAqcCsrID0gJ1wwMTQnOyBicmVhazsgLyogRkYgKi8KKyAgICAgICAgY2FzZSAndCc6ICpwKysgPSAnXHQnOyBicmVhazsKKyAgICAgICAgY2FzZSAnbic6ICpwKysgPSAnXG4nOyBicmVhazsKKyAgICAgICAgY2FzZSAncic6ICpwKysgPSAnXHInOyBicmVhazsKKyAgICAgICAgY2FzZSAndic6ICpwKysgPSAnXDAxMyc7IGJyZWFrOyAvKiBWVCAqLworICAgICAgICBjYXNlICdhJzogKnArKyA9ICdcMDA3JzsgYnJlYWs7IC8qIEJFTCwgbm90IGNsYXNzaWMgQyAqLworICAgICAgICBjYXNlICcwJzogY2FzZSAnMSc6IGNhc2UgJzInOiBjYXNlICczJzoKKyAgICAgICAgY2FzZSAnNCc6IGNhc2UgJzUnOiBjYXNlICc2JzogY2FzZSAnNyc6CisgICAgICAgICAgICBjID0gc1stMV0gLSAnMCc7CisgICAgICAgICAgICBpZiAocyA8IGVuZCAmJiAnMCcgPD0gKnMgJiYgKnMgPD0gJzcnKSB7CisgICAgICAgICAgICAgICAgYyA9IChjPDwzKSArICpzKysgLSAnMCc7CisgICAgICAgICAgICAgICAgaWYgKHMgPCBlbmQgJiYgJzAnIDw9ICpzICYmICpzIDw9ICc3JykKKyAgICAgICAgICAgICAgICAgICAgYyA9IChjPDwzKSArICpzKysgLSAnMCc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqcCsrID0gYzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICd4JzoKKyAgICAgICAgICAgIGlmIChzKzEgPCBlbmQgJiYKKyAgICAgICAgICAgICAgICBpc3hkaWdpdChQeV9DSEFSTUFTSyhzWzBdKSkgJiYKKyAgICAgICAgICAgICAgICBpc3hkaWdpdChQeV9DSEFSTUFTSyhzWzFdKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHggPSAwOworICAgICAgICAgICAgICAgIGMgPSBQeV9DSEFSTUFTSygqcyk7CisgICAgICAgICAgICAgICAgcysrOworICAgICAgICAgICAgICAgIGlmIChpc2RpZ2l0KGMpKQorICAgICAgICAgICAgICAgICAgICB4ID0gYyAtICcwJzsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChpc2xvd2VyKGMpKQorICAgICAgICAgICAgICAgICAgICB4ID0gMTAgKyBjIC0gJ2EnOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeCA9IDEwICsgYyAtICdBJzsKKyAgICAgICAgICAgICAgICB4ID0geCA8PCA0OworICAgICAgICAgICAgICAgIGMgPSBQeV9DSEFSTUFTSygqcyk7CisgICAgICAgICAgICAgICAgcysrOworICAgICAgICAgICAgICAgIGlmIChpc2RpZ2l0KGMpKQorICAgICAgICAgICAgICAgICAgICB4ICs9IGMgLSAnMCc7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoaXNsb3dlcihjKSkKKyAgICAgICAgICAgICAgICAgICAgeCArPSAxMCArIGMgLSAnYSc7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB4ICs9IDEwICsgYyAtICdBJzsKKyAgICAgICAgICAgICAgICAqcCsrID0geDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghZXJyb3JzIHx8IHN0cmNtcChlcnJvcnMsICJzdHJpY3QiKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIFxceCBlc2NhcGUiKTsKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdHJjbXAoZXJyb3JzLCAicmVwbGFjZSIpID09IDApIHsKKyAgICAgICAgICAgICAgICAqcCsrID0gJz8nOworICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAoZXJyb3JzLCAiaWdub3JlIikgPT0gMCkKKyAgICAgICAgICAgICAgICAvKiBkbyBub3RoaW5nICovOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZWNvZGluZyBlcnJvcjsgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5rbm93biBlcnJvciBoYW5kbGluZyBjb2RlOiAlLjQwMHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMpOworICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICAgICAgfQogI2lmbmRlZiBQeV9VU0lOR19VTklDT0RFCi0JCWNhc2UgJ3UnOgotCQljYXNlICdVJzoKLQkJY2FzZSAnTic6Ci0JCQlpZiAodW5pY29kZSkgewotCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCQkgICJVbmljb2RlIGVzY2FwZXMgbm90IGxlZ2FsICIKLQkJCQkJICAid2hlbiBVbmljb2RlIGRpc2FibGVkIik7Ci0JCQkJZ290byBmYWlsZWQ7Ci0JCQl9CisgICAgICAgIGNhc2UgJ3UnOgorICAgICAgICBjYXNlICdVJzoKKyAgICAgICAgY2FzZSAnTic6CisgICAgICAgICAgICBpZiAodW5pY29kZSkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5pY29kZSBlc2NhcGVzIG5vdCBsZWdhbCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aGVuIFVuaWNvZGUgZGlzYWJsZWQiKTsKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgIH0KICNlbmRpZgotCQlkZWZhdWx0OgotCQkJKnArKyA9ICdcXCc7Ci0JCQlzLS07Ci0JCQlnb3RvIG5vbl9lc2M7IC8qIGFuIGFyYml0cnkgbnVtYmVyIG9mIHVuZXNjYXBlZAotCQkJCQkgVVRGLTggYnl0ZXMgbWF5IGZvbGxvdy4gKi8KLQkJfQotCX0KLQlpZiAocC1idWYgPCBuZXdsZW4pCi0JCV9QeVN0cmluZ19SZXNpemUoJnYsIHAgLSBidWYpOwotCXJldHVybiB2OworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgKnArKyA9ICdcXCc7CisgICAgICAgICAgICBzLS07CisgICAgICAgICAgICBnb3RvIG5vbl9lc2M7IC8qIGFuIGFyYml0cnkgbnVtYmVyIG9mIHVuZXNjYXBlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVVEYtOCBieXRlcyBtYXkgZm9sbG93LiAqLworICAgICAgICB9CisgICAgfQorICAgIGlmIChwLWJ1ZiA8IG5ld2xlbikKKyAgICAgICAgX1B5U3RyaW5nX1Jlc2l6ZSgmdiwgcCAtIGJ1Zik7CisgICAgcmV0dXJuIHY7CiAgIGZhaWxlZDoKLQlQeV9ERUNSRUYodik7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlfREVDUkVGKHYpOworICAgIHJldHVybiBOVUxMOwogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtNzA1LDc1ICs3MDUsNzUgQEAKIHN0YXRpYyBQeV9zc2l6ZV90CiBzdHJpbmdfZ2V0c2l6ZShyZWdpc3RlciBQeU9iamVjdCAqb3ApCiB7Ci0gICAgCWNoYXIgKnM7Ci0gICAgCVB5X3NzaXplX3QgbGVuOwotCWlmIChQeVN0cmluZ19Bc1N0cmluZ0FuZFNpemUob3AsICZzLCAmbGVuKSkKLQkJcmV0dXJuIC0xOwotCXJldHVybiBsZW47CisgICAgY2hhciAqczsKKyAgICBQeV9zc2l6ZV90IGxlbjsKKyAgICBpZiAoUHlTdHJpbmdfQXNTdHJpbmdBbmRTaXplKG9wLCAmcywgJmxlbikpCisgICAgICAgIHJldHVybiAtMTsKKyAgICByZXR1cm4gbGVuOwogfQogCiBzdGF0aWMgLypjb25zdCovIGNoYXIgKgogc3RyaW5nX2dldGJ1ZmZlcihyZWdpc3RlciBQeU9iamVjdCAqb3ApCiB7Ci0gICAgCWNoYXIgKnM7Ci0gICAgCVB5X3NzaXplX3QgbGVuOwotCWlmIChQeVN0cmluZ19Bc1N0cmluZ0FuZFNpemUob3AsICZzLCAmbGVuKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIHM7CisgICAgY2hhciAqczsKKyAgICBQeV9zc2l6ZV90IGxlbjsKKyAgICBpZiAoUHlTdHJpbmdfQXNTdHJpbmdBbmRTaXplKG9wLCAmcywgJmxlbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBzOwogfQogCiBQeV9zc2l6ZV90CiBQeVN0cmluZ19TaXplKHJlZ2lzdGVyIFB5T2JqZWN0ICpvcCkKIHsKLQlpZiAoIVB5U3RyaW5nX0NoZWNrKG9wKSkKLQkJcmV0dXJuIHN0cmluZ19nZXRzaXplKG9wKTsKLQlyZXR1cm4gUHlfU0laRShvcCk7CisgICAgaWYgKCFQeVN0cmluZ19DaGVjayhvcCkpCisgICAgICAgIHJldHVybiBzdHJpbmdfZ2V0c2l6ZShvcCk7CisgICAgcmV0dXJuIFB5X1NJWkUob3ApOwogfQogCiAvKmNvbnN0Ki8gY2hhciAqCiBQeVN0cmluZ19Bc1N0cmluZyhyZWdpc3RlciBQeU9iamVjdCAqb3ApCiB7Ci0JaWYgKCFQeVN0cmluZ19DaGVjayhvcCkpCi0JCXJldHVybiBzdHJpbmdfZ2V0YnVmZmVyKG9wKTsKLQlyZXR1cm4gKChQeVN0cmluZ09iamVjdCAqKW9wKSAtPiBvYl9zdmFsOworICAgIGlmICghUHlTdHJpbmdfQ2hlY2sob3ApKQorICAgICAgICByZXR1cm4gc3RyaW5nX2dldGJ1ZmZlcihvcCk7CisgICAgcmV0dXJuICgoUHlTdHJpbmdPYmplY3QgKilvcCkgLT4gb2Jfc3ZhbDsKIH0KIAogaW50CiBQeVN0cmluZ19Bc1N0cmluZ0FuZFNpemUocmVnaXN0ZXIgUHlPYmplY3QgKm9iaiwKLQkJCSByZWdpc3RlciBjaGFyICoqcywKLQkJCSByZWdpc3RlciBQeV9zc2l6ZV90ICpsZW4pCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY2hhciAqKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgUHlfc3NpemVfdCAqbGVuKQogewotCWlmIChzID09IE5VTEwpIHsKLQkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgaWYgKHMgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCWlmICghUHlTdHJpbmdfQ2hlY2sob2JqKSkgeworICAgIGlmICghUHlTdHJpbmdfQ2hlY2sob2JqKSkgewogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQkJaWYgKFB5VW5pY29kZV9DaGVjayhvYmopKSB7Ci0JCQlvYmogPSBfUHlVbmljb2RlX0FzRGVmYXVsdEVuY29kZWRTdHJpbmcob2JqLCBOVUxMKTsKLQkJCWlmIChvYmogPT0gTlVMTCkKLQkJCQlyZXR1cm4gLTE7Ci0JCX0KLQkJZWxzZQorICAgICAgICBpZiAoUHlVbmljb2RlX0NoZWNrKG9iaikpIHsKKyAgICAgICAgICAgIG9iaiA9IF9QeVVuaWNvZGVfQXNEZWZhdWx0RW5jb2RlZFN0cmluZyhvYmosIE5VTEwpOworICAgICAgICAgICAgaWYgKG9iaiA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCiAjZW5kaWYKLQkJewotCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCQkgICAgICJleHBlY3RlZCBzdHJpbmcgb3IgVW5pY29kZSBvYmplY3QsICIKLQkJCQkgICAgICIlLjIwMHMgZm91bmQiLCBQeV9UWVBFKG9iaiktPnRwX25hbWUpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQorICAgICAgICB7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBzdHJpbmcgb3IgVW5pY29kZSBvYmplY3QsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiJS4yMDBzIGZvdW5kIiwgUHlfVFlQRShvYmopLT50cF9uYW1lKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KIAotCSpzID0gUHlTdHJpbmdfQVNfU1RSSU5HKG9iaik7Ci0JaWYgKGxlbiAhPSBOVUxMKQotCQkqbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUob2JqKTsKLQllbHNlIGlmIChzdHJsZW4oKnMpICE9IChzaXplX3QpUHlTdHJpbmdfR0VUX1NJWkUob2JqKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJleHBlY3RlZCBzdHJpbmcgd2l0aG91dCBudWxsIGJ5dGVzIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JcmV0dXJuIDA7CisgICAgKnMgPSBQeVN0cmluZ19BU19TVFJJTkcob2JqKTsKKyAgICBpZiAobGVuICE9IE5VTEwpCisgICAgICAgICpsZW4gPSBQeVN0cmluZ19HRVRfU0laRShvYmopOworICAgIGVsc2UgaWYgKHN0cmxlbigqcykgIT0gKHNpemVfdClQeVN0cmluZ19HRVRfU0laRShvYmopKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgc3RyaW5nIHdpdGhvdXQgbnVsbCBieXRlcyIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiAwOwogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtNzk0LDU2OSArNzk0LDU2OSBAQAogc3RhdGljIGludAogc3RyaW5nX3ByaW50KFB5U3RyaW5nT2JqZWN0ICpvcCwgRklMRSAqZnAsIGludCBmbGFncykKIHsKLQlQeV9zc2l6ZV90IGksIHN0cl9sZW47Ci0JY2hhciBjOwotCWludCBxdW90ZTsKKyAgICBQeV9zc2l6ZV90IGksIHN0cl9sZW47CisgICAgY2hhciBjOworICAgIGludCBxdW90ZTsKIAotCS8qIFhYWCBPdWdodCB0byBjaGVjayBmb3IgaW50ZXJydXB0cyB3aGVuIHdyaXRpbmcgbG9uZyBzdHJpbmdzICovCi0JaWYgKCEgUHlTdHJpbmdfQ2hlY2tFeGFjdChvcCkpIHsKLQkJaW50IHJldDsKLQkJLyogQSBzdHIgc3ViY2xhc3MgbWF5IGhhdmUgaXRzIG93biBfX3N0cl9fIG1ldGhvZC4gKi8KLQkJb3AgPSAoUHlTdHJpbmdPYmplY3QgKikgUHlPYmplY3RfU3RyKChQeU9iamVjdCAqKW9wKTsKLQkJaWYgKG9wID09IE5VTEwpCi0JCQlyZXR1cm4gLTE7Ci0JCXJldCA9IHN0cmluZ19wcmludChvcCwgZnAsIGZsYWdzKTsKLQkJUHlfREVDUkVGKG9wKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0JaWYgKGZsYWdzICYgUHlfUFJJTlRfUkFXKSB7Ci0JCWNoYXIgKmRhdGEgPSBvcC0+b2Jfc3ZhbDsKLQkJUHlfc3NpemVfdCBzaXplID0gUHlfU0laRShvcCk7Ci0JCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQkJd2hpbGUgKHNpemUgPiBJTlRfTUFYKSB7Ci0JCQkvKiBWZXJ5IGxvbmcgc3RyaW5ncyBjYW5ub3QgYmUgd3JpdHRlbiBhdG9taWNhbGx5LgotCQkJICogQnV0IGRvbid0IHdyaXRlIGV4YWN0bHkgSU5UX01BWCBieXRlcyBhdCBhIHRpbWUKLQkJCSAqIHRvIGF2b2lkIG1lbW9yeSBhbGlnbWVudCBpc3N1ZXMuCi0JCQkgKi8KLQkJCWNvbnN0IGludCBjaHVua19zaXplID0gSU5UX01BWCAmIH4weDNGRkY7Ci0JCQlmd3JpdGUoZGF0YSwgMSwgY2h1bmtfc2l6ZSwgZnApOwotCQkJZGF0YSArPSBjaHVua19zaXplOwotCQkJc2l6ZSAtPSBjaHVua19zaXplOwotCQl9CisgICAgLyogWFhYIE91Z2h0IHRvIGNoZWNrIGZvciBpbnRlcnJ1cHRzIHdoZW4gd3JpdGluZyBsb25nIHN0cmluZ3MgKi8KKyAgICBpZiAoISBQeVN0cmluZ19DaGVja0V4YWN0KG9wKSkgeworICAgICAgICBpbnQgcmV0OworICAgICAgICAvKiBBIHN0ciBzdWJjbGFzcyBtYXkgaGF2ZSBpdHMgb3duIF9fc3RyX18gbWV0aG9kLiAqLworICAgICAgICBvcCA9IChQeVN0cmluZ09iamVjdCAqKSBQeU9iamVjdF9TdHIoKFB5T2JqZWN0ICopb3ApOworICAgICAgICBpZiAob3AgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgcmV0ID0gc3RyaW5nX3ByaW50KG9wLCBmcCwgZmxhZ3MpOworICAgICAgICBQeV9ERUNSRUYob3ApOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBpZiAoZmxhZ3MgJiBQeV9QUklOVF9SQVcpIHsKKyAgICAgICAgY2hhciAqZGF0YSA9IG9wLT5vYl9zdmFsOworICAgICAgICBQeV9zc2l6ZV90IHNpemUgPSBQeV9TSVpFKG9wKTsKKyAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICB3aGlsZSAoc2l6ZSA+IElOVF9NQVgpIHsKKyAgICAgICAgICAgIC8qIFZlcnkgbG9uZyBzdHJpbmdzIGNhbm5vdCBiZSB3cml0dGVuIGF0b21pY2FsbHkuCisgICAgICAgICAgICAgKiBCdXQgZG9uJ3Qgd3JpdGUgZXhhY3RseSBJTlRfTUFYIGJ5dGVzIGF0IGEgdGltZQorICAgICAgICAgICAgICogdG8gYXZvaWQgbWVtb3J5IGFsaWdtZW50IGlzc3Vlcy4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgY29uc3QgaW50IGNodW5rX3NpemUgPSBJTlRfTUFYICYgfjB4M0ZGRjsKKyAgICAgICAgICAgIGZ3cml0ZShkYXRhLCAxLCBjaHVua19zaXplLCBmcCk7CisgICAgICAgICAgICBkYXRhICs9IGNodW5rX3NpemU7CisgICAgICAgICAgICBzaXplIC09IGNodW5rX3NpemU7CisgICAgICAgIH0KICNpZmRlZiBfX1ZNUwotICAgICAgICAgICAgICAgIGlmIChzaXplKSBmd3JpdGUoZGF0YSwgKGludClzaXplLCAxLCBmcCk7CisgICAgICAgIGlmIChzaXplKSBmd3JpdGUoZGF0YSwgKGludClzaXplLCAxLCBmcCk7CiAjZWxzZQotICAgICAgICAgICAgICAgIGZ3cml0ZShkYXRhLCAxLCAoaW50KXNpemUsIGZwKTsKKyAgICAgICAgZndyaXRlKGRhdGEsIDEsIChpbnQpc2l6ZSwgZnApOwogI2VuZGlmCi0JCVB5X0VORF9BTExPV19USFJFQURTCi0JCXJldHVybiAwOwotCX0KKyAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCi0JLyogZmlndXJlIG91dCB3aGljaCBxdW90ZSB0byB1c2U7IHNpbmdsZSBpcyBwcmVmZXJyZWQgKi8KLQlxdW90ZSA9ICdcJyc7Ci0JaWYgKG1lbWNocihvcC0+b2Jfc3ZhbCwgJ1wnJywgUHlfU0laRShvcCkpICYmCi0JICAgICFtZW1jaHIob3AtPm9iX3N2YWwsICciJywgUHlfU0laRShvcCkpKQotCQlxdW90ZSA9ICciJzsKKyAgICAvKiBmaWd1cmUgb3V0IHdoaWNoIHF1b3RlIHRvIHVzZTsgc2luZ2xlIGlzIHByZWZlcnJlZCAqLworICAgIHF1b3RlID0gJ1wnJzsKKyAgICBpZiAobWVtY2hyKG9wLT5vYl9zdmFsLCAnXCcnLCBQeV9TSVpFKG9wKSkgJiYKKyAgICAgICAgIW1lbWNocihvcC0+b2Jfc3ZhbCwgJyInLCBQeV9TSVpFKG9wKSkpCisgICAgICAgIHF1b3RlID0gJyInOwogCi0Jc3RyX2xlbiA9IFB5X1NJWkUob3ApOwotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlmcHV0YyhxdW90ZSwgZnApOwotCWZvciAoaSA9IDA7IGkgPCBzdHJfbGVuOyBpKyspIHsKLQkJLyogU2luY2Ugc3RyaW5ncyBhcmUgaW1tdXRhYmxlIGFuZCB0aGUgY2FsbGVyIHNob3VsZCBoYXZlIGEKLQkJcmVmZXJlbmNlLCBhY2Nlc3NpbmcgdGhlIGludGVyYWwgYnVmZmVyIHNob3VsZCBub3QgYmUgYW4gaXNzdWUKLQkJd2l0aCB0aGUgR0lMIHJlbGVhc2VkLiAqLwotCQljID0gb3AtPm9iX3N2YWxbaV07Ci0JCWlmIChjID09IHF1b3RlIHx8IGMgPT0gJ1xcJykKLQkJCWZwcmludGYoZnAsICJcXCVjIiwgYyk7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoYyA9PSAnXHQnKQotICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihmcCwgIlxcdCIpOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKGMgPT0gJ1xuJykKLSAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZnAsICJcXG4iKTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChjID09ICdccicpCi0gICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZwLCAiXFxyIik7Ci0JCWVsc2UgaWYgKGMgPCAnICcgfHwgYyA+PSAweDdmKQotCQkJZnByaW50ZihmcCwgIlxceCUwMngiLCBjICYgMHhmZik7Ci0JCWVsc2UKLQkJCWZwdXRjKGMsIGZwKTsKLQl9Ci0JZnB1dGMocXVvdGUsIGZwKTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCXJldHVybiAwOworICAgIHN0cl9sZW4gPSBQeV9TSVpFKG9wKTsKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgZnB1dGMocXVvdGUsIGZwKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgc3RyX2xlbjsgaSsrKSB7CisgICAgICAgIC8qIFNpbmNlIHN0cmluZ3MgYXJlIGltbXV0YWJsZSBhbmQgdGhlIGNhbGxlciBzaG91bGQgaGF2ZSBhCisgICAgICAgIHJlZmVyZW5jZSwgYWNjZXNzaW5nIHRoZSBpbnRlcmFsIGJ1ZmZlciBzaG91bGQgbm90IGJlIGFuIGlzc3VlCisgICAgICAgIHdpdGggdGhlIEdJTCByZWxlYXNlZC4gKi8KKyAgICAgICAgYyA9IG9wLT5vYl9zdmFsW2ldOworICAgICAgICBpZiAoYyA9PSBxdW90ZSB8fCBjID09ICdcXCcpCisgICAgICAgICAgICBmcHJpbnRmKGZwLCAiXFwlYyIsIGMpOworICAgICAgICBlbHNlIGlmIChjID09ICdcdCcpCisgICAgICAgICAgICBmcHJpbnRmKGZwLCAiXFx0Iik7CisgICAgICAgIGVsc2UgaWYgKGMgPT0gJ1xuJykKKyAgICAgICAgICAgIGZwcmludGYoZnAsICJcXG4iKTsKKyAgICAgICAgZWxzZSBpZiAoYyA9PSAnXHInKQorICAgICAgICAgICAgZnByaW50ZihmcCwgIlxcciIpOworICAgICAgICBlbHNlIGlmIChjIDwgJyAnIHx8IGMgPj0gMHg3ZikKKyAgICAgICAgICAgIGZwcmludGYoZnAsICJcXHglMDJ4IiwgYyAmIDB4ZmYpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBmcHV0YyhjLCBmcCk7CisgICAgfQorICAgIGZwdXRjKHF1b3RlLCBmcCk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICByZXR1cm4gMDsKIH0KIAogUHlPYmplY3QgKgogUHlTdHJpbmdfUmVwcihQeU9iamVjdCAqb2JqLCBpbnQgc21hcnRxdW90ZXMpCiB7Ci0JcmVnaXN0ZXIgUHlTdHJpbmdPYmplY3QqIG9wID0gKFB5U3RyaW5nT2JqZWN0Kikgb2JqOwotCXNpemVfdCBuZXdzaXplID0gMiArIDQgKiBQeV9TSVpFKG9wKTsKLQlQeU9iamVjdCAqdjsKLQlpZiAobmV3c2l6ZSA+IFBZX1NTSVpFX1RfTUFYIHx8IG5ld3NpemUgLyA0ICE9IFB5X1NJWkUob3ApKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJInN0cmluZyBpcyB0b28gbGFyZ2UgdG8gbWFrZSByZXByIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0JfQotCXYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKU5VTEwsIG5ld3NpemUpOwotCWlmICh2ID09IE5VTEwpIHsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWVsc2UgewotCQlyZWdpc3RlciBQeV9zc2l6ZV90IGk7Ci0JCXJlZ2lzdGVyIGNoYXIgYzsKLQkJcmVnaXN0ZXIgY2hhciAqcDsKLQkJaW50IHF1b3RlOworICAgIHJlZ2lzdGVyIFB5U3RyaW5nT2JqZWN0KiBvcCA9IChQeVN0cmluZ09iamVjdCopIG9iajsKKyAgICBzaXplX3QgbmV3c2l6ZSA9IDIgKyA0ICogUHlfU0laRShvcCk7CisgICAgUHlPYmplY3QgKnY7CisgICAgaWYgKG5ld3NpemUgPiBQWV9TU0laRV9UX01BWCB8fCBuZXdzaXplIC8gNCAhPSBQeV9TSVpFKG9wKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICJzdHJpbmcgaXMgdG9vIGxhcmdlIHRvIG1ha2UgcmVwciIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgdiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopTlVMTCwgbmV3c2l6ZSk7CisgICAgaWYgKHYgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJlZ2lzdGVyIFB5X3NzaXplX3QgaTsKKyAgICAgICAgcmVnaXN0ZXIgY2hhciBjOworICAgICAgICByZWdpc3RlciBjaGFyICpwOworICAgICAgICBpbnQgcXVvdGU7CiAKLQkJLyogZmlndXJlIG91dCB3aGljaCBxdW90ZSB0byB1c2U7IHNpbmdsZSBpcyBwcmVmZXJyZWQgKi8KLQkJcXVvdGUgPSAnXCcnOwotCQlpZiAoc21hcnRxdW90ZXMgJiYKLQkJICAgIG1lbWNocihvcC0+b2Jfc3ZhbCwgJ1wnJywgUHlfU0laRShvcCkpICYmCi0JCSAgICAhbWVtY2hyKG9wLT5vYl9zdmFsLCAnIicsIFB5X1NJWkUob3ApKSkKLQkJCXF1b3RlID0gJyInOworICAgICAgICAvKiBmaWd1cmUgb3V0IHdoaWNoIHF1b3RlIHRvIHVzZTsgc2luZ2xlIGlzIHByZWZlcnJlZCAqLworICAgICAgICBxdW90ZSA9ICdcJyc7CisgICAgICAgIGlmIChzbWFydHF1b3RlcyAmJgorICAgICAgICAgICAgbWVtY2hyKG9wLT5vYl9zdmFsLCAnXCcnLCBQeV9TSVpFKG9wKSkgJiYKKyAgICAgICAgICAgICFtZW1jaHIob3AtPm9iX3N2YWwsICciJywgUHlfU0laRShvcCkpKQorICAgICAgICAgICAgcXVvdGUgPSAnIic7CiAKLQkJcCA9IFB5U3RyaW5nX0FTX1NUUklORyh2KTsKLQkJKnArKyA9IHF1b3RlOwotCQlmb3IgKGkgPSAwOyBpIDwgUHlfU0laRShvcCk7IGkrKykgewotCQkJLyogVGhlcmUncyBhdCBsZWFzdCBlbm91Z2ggcm9vbSBmb3IgYSBoZXggZXNjYXBlCi0JCQkgICBhbmQgYSBjbG9zaW5nIHF1b3RlLiAqLwotCQkJYXNzZXJ0KG5ld3NpemUgLSAocCAtIFB5U3RyaW5nX0FTX1NUUklORyh2KSkgPj0gNSk7Ci0JCQljID0gb3AtPm9iX3N2YWxbaV07Ci0JCQlpZiAoYyA9PSBxdW90ZSB8fCBjID09ICdcXCcpCi0JCQkJKnArKyA9ICdcXCcsICpwKysgPSBjOwotCQkJZWxzZSBpZiAoYyA9PSAnXHQnKQotCQkJCSpwKysgPSAnXFwnLCAqcCsrID0gJ3QnOwotCQkJZWxzZSBpZiAoYyA9PSAnXG4nKQotCQkJCSpwKysgPSAnXFwnLCAqcCsrID0gJ24nOwotCQkJZWxzZSBpZiAoYyA9PSAnXHInKQotCQkJCSpwKysgPSAnXFwnLCAqcCsrID0gJ3InOwotCQkJZWxzZSBpZiAoYyA8ICcgJyB8fCBjID49IDB4N2YpIHsKLQkJCQkvKiBGb3IgcGVyZm9ybWFuY2UsIHdlIGRvbid0IHdhbnQgdG8gY2FsbAotCQkJCSAgIFB5T1Nfc25wcmludGYgaGVyZSAoZXh0cmEgbGF5ZXJzIG9mCi0JCQkJICAgZnVuY3Rpb24gY2FsbCkuICovCi0JCQkJc3ByaW50ZihwLCAiXFx4JTAyeCIsIGMgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCArPSA0OwotCQkJfQotCQkJZWxzZQotCQkJCSpwKysgPSBjOwotCQl9Ci0JCWFzc2VydChuZXdzaXplIC0gKHAgLSBQeVN0cmluZ19BU19TVFJJTkcodikpID49IDEpOwotCQkqcCsrID0gcXVvdGU7Ci0JCSpwID0gJ1wwJzsKLQkJX1B5U3RyaW5nX1Jlc2l6ZSgKLQkJCSZ2LCAocCAtIFB5U3RyaW5nX0FTX1NUUklORyh2KSkpOwotCQlyZXR1cm4gdjsKLQl9CisgICAgICAgIHAgPSBQeVN0cmluZ19BU19TVFJJTkcodik7CisgICAgICAgICpwKysgPSBxdW90ZTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IFB5X1NJWkUob3ApOyBpKyspIHsKKyAgICAgICAgICAgIC8qIFRoZXJlJ3MgYXQgbGVhc3QgZW5vdWdoIHJvb20gZm9yIGEgaGV4IGVzY2FwZQorICAgICAgICAgICAgICAgYW5kIGEgY2xvc2luZyBxdW90ZS4gKi8KKyAgICAgICAgICAgIGFzc2VydChuZXdzaXplIC0gKHAgLSBQeVN0cmluZ19BU19TVFJJTkcodikpID49IDUpOworICAgICAgICAgICAgYyA9IG9wLT5vYl9zdmFsW2ldOworICAgICAgICAgICAgaWYgKGMgPT0gcXVvdGUgfHwgYyA9PSAnXFwnKQorICAgICAgICAgICAgICAgICpwKysgPSAnXFwnLCAqcCsrID0gYzsKKyAgICAgICAgICAgIGVsc2UgaWYgKGMgPT0gJ1x0JykKKyAgICAgICAgICAgICAgICAqcCsrID0gJ1xcJywgKnArKyA9ICd0JzsKKyAgICAgICAgICAgIGVsc2UgaWYgKGMgPT0gJ1xuJykKKyAgICAgICAgICAgICAgICAqcCsrID0gJ1xcJywgKnArKyA9ICduJzsKKyAgICAgICAgICAgIGVsc2UgaWYgKGMgPT0gJ1xyJykKKyAgICAgICAgICAgICAgICAqcCsrID0gJ1xcJywgKnArKyA9ICdyJzsKKyAgICAgICAgICAgIGVsc2UgaWYgKGMgPCAnICcgfHwgYyA+PSAweDdmKSB7CisgICAgICAgICAgICAgICAgLyogRm9yIHBlcmZvcm1hbmNlLCB3ZSBkb24ndCB3YW50IHRvIGNhbGwKKyAgICAgICAgICAgICAgICAgICBQeU9TX3NucHJpbnRmIGhlcmUgKGV4dHJhIGxheWVycyBvZgorICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGNhbGwpLiAqLworICAgICAgICAgICAgICAgIHNwcmludGYocCwgIlxceCUwMngiLCBjICYgMHhmZik7CisgICAgICAgICAgICAgICAgcCArPSA0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICpwKysgPSBjOworICAgICAgICB9CisgICAgICAgIGFzc2VydChuZXdzaXplIC0gKHAgLSBQeVN0cmluZ19BU19TVFJJTkcodikpID49IDEpOworICAgICAgICAqcCsrID0gcXVvdGU7CisgICAgICAgICpwID0gJ1wwJzsKKyAgICAgICAgX1B5U3RyaW5nX1Jlc2l6ZSgKKyAgICAgICAgICAgICZ2LCAocCAtIFB5U3RyaW5nX0FTX1NUUklORyh2KSkpOworICAgICAgICByZXR1cm4gdjsKKyAgICB9CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdHJpbmdfcmVwcihQeU9iamVjdCAqb3ApCiB7Ci0JcmV0dXJuIFB5U3RyaW5nX1JlcHIob3AsIDEpOworICAgIHJldHVybiBQeVN0cmluZ19SZXByKG9wLCAxKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHN0cmluZ19zdHIoUHlPYmplY3QgKnMpCiB7Ci0JYXNzZXJ0KFB5U3RyaW5nX0NoZWNrKHMpKTsKLQlpZiAoUHlTdHJpbmdfQ2hlY2tFeGFjdChzKSkgewotCQlQeV9JTkNSRUYocyk7Ci0JCXJldHVybiBzOwotCX0KLQllbHNlIHsKLQkJLyogU3VidHlwZSAtLSByZXR1cm4gZ2VudWluZSBzdHJpbmcgd2l0aCB0aGUgc2FtZSB2YWx1ZS4gKi8KLQkJUHlTdHJpbmdPYmplY3QgKnQgPSAoUHlTdHJpbmdPYmplY3QgKikgczsKLQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHQtPm9iX3N2YWwsIFB5X1NJWkUodCkpOwotCX0KKyAgICBhc3NlcnQoUHlTdHJpbmdfQ2hlY2socykpOworICAgIGlmIChQeVN0cmluZ19DaGVja0V4YWN0KHMpKSB7CisgICAgICAgIFB5X0lOQ1JFRihzKTsKKyAgICAgICAgcmV0dXJuIHM7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvKiBTdWJ0eXBlIC0tIHJldHVybiBnZW51aW5lIHN0cmluZyB3aXRoIHRoZSBzYW1lIHZhbHVlLiAqLworICAgICAgICBQeVN0cmluZ09iamVjdCAqdCA9IChQeVN0cmluZ09iamVjdCAqKSBzOworICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUodC0+b2Jfc3ZhbCwgUHlfU0laRSh0KSk7CisgICAgfQogfQogCiBzdGF0aWMgUHlfc3NpemVfdAogc3RyaW5nX2xlbmd0aChQeVN0cmluZ09iamVjdCAqYSkKIHsKLQlyZXR1cm4gUHlfU0laRShhKTsKKyAgICByZXR1cm4gUHlfU0laRShhKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHN0cmluZ19jb25jYXQocmVnaXN0ZXIgUHlTdHJpbmdPYmplY3QgKmEsIHJlZ2lzdGVyIFB5T2JqZWN0ICpiYikKIHsKLQlyZWdpc3RlciBQeV9zc2l6ZV90IHNpemU7Ci0JcmVnaXN0ZXIgUHlTdHJpbmdPYmplY3QgKm9wOwotCWlmICghUHlTdHJpbmdfQ2hlY2soYmIpKSB7CisgICAgcmVnaXN0ZXIgUHlfc3NpemVfdCBzaXplOworICAgIHJlZ2lzdGVyIFB5U3RyaW5nT2JqZWN0ICpvcDsKKyAgICBpZiAoIVB5U3RyaW5nX0NoZWNrKGJiKSkgewogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQkJaWYgKFB5VW5pY29kZV9DaGVjayhiYikpCi0JCSAgICByZXR1cm4gUHlVbmljb2RlX0NvbmNhdCgoUHlPYmplY3QgKilhLCBiYik7CisgICAgICAgIGlmIChQeVVuaWNvZGVfQ2hlY2soYmIpKQorICAgICAgICAgICAgcmV0dXJuIFB5VW5pY29kZV9Db25jYXQoKFB5T2JqZWN0ICopYSwgYmIpOwogI2VuZGlmCi0JCWlmIChQeUJ5dGVBcnJheV9DaGVjayhiYikpCi0JCSAgICByZXR1cm4gUHlCeXRlQXJyYXlfQ29uY2F0KChQeU9iamVjdCAqKWEsIGJiKTsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAgImNhbm5vdCBjb25jYXRlbmF0ZSAnc3RyJyBhbmQgJyUuMjAwcycgb2JqZWN0cyIsCi0JCQkgICAgIFB5X1RZUEUoYmIpLT50cF9uYW1lKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgICAgICBpZiAoUHlCeXRlQXJyYXlfQ2hlY2soYmIpKQorICAgICAgICAgICAgcmV0dXJuIFB5Qnl0ZUFycmF5X0NvbmNhdCgoUHlPYmplY3QgKilhLCBiYik7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiY2Fubm90IGNvbmNhdGVuYXRlICdzdHInIGFuZCAnJS4yMDBzJyBvYmplY3RzIiwKKyAgICAgICAgICAgICAgICAgICAgIFB5X1RZUEUoYmIpLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogI2RlZmluZSBiICgoUHlTdHJpbmdPYmplY3QgKiliYikKLQkvKiBPcHRpbWl6ZSBjYXNlcyB3aXRoIGVtcHR5IGxlZnQgb3IgcmlnaHQgb3BlcmFuZCAqLwotCWlmICgoUHlfU0laRShhKSA9PSAwIHx8IFB5X1NJWkUoYikgPT0gMCkgJiYKLQkgICAgUHlTdHJpbmdfQ2hlY2tFeGFjdChhKSAmJiBQeVN0cmluZ19DaGVja0V4YWN0KGIpKSB7Ci0JCWlmIChQeV9TSVpFKGEpID09IDApIHsKLQkJCVB5X0lOQ1JFRihiYik7Ci0JCQlyZXR1cm4gYmI7Ci0JCX0KLQkJUHlfSU5DUkVGKGEpOwotCQlyZXR1cm4gKFB5T2JqZWN0ICopYTsKLQl9Ci0Jc2l6ZSA9IFB5X1NJWkUoYSkgKyBQeV9TSVpFKGIpOwotCS8qIENoZWNrIHRoYXQgc3RyaW5nIHNpemVzIGFyZSBub3QgbmVnYXRpdmUsIHRvIHByZXZlbnQgYW4KLQkgICBvdmVyZmxvdyBpbiBjYXNlcyB3aGVyZSB3ZSBhcmUgcGFzc2VkIGluY29ycmVjdGx5LWNyZWF0ZWQKLQkgICBzdHJpbmdzIHdpdGggbmVnYXRpdmUgbGVuZ3RocyAoZHVlIHRvIGEgYnVnIGluIG90aGVyIGNvZGUpLgotICAgICAgICAqLwotCWlmIChQeV9TSVpFKGEpIDwgMCB8fCBQeV9TSVpFKGIpIDwgMCB8fAotCSAgICBQeV9TSVpFKGEpID4gUFlfU1NJWkVfVF9NQVggLSBQeV9TSVpFKGIpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJCSJzdHJpbmdzIGFyZSB0b28gbGFyZ2UgdG8gY29uY2F0Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQkgIAotCS8qIElubGluZSBQeU9iamVjdF9OZXdWYXIgKi8KLQlpZiAoc2l6ZSA+IFBZX1NTSVpFX1RfTUFYIC0gc2l6ZW9mKFB5U3RyaW5nT2JqZWN0KSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJCQkic3RyaW5ncyBhcmUgdG9vIGxhcmdlIHRvIGNvbmNhdCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0Jb3AgPSAoUHlTdHJpbmdPYmplY3QgKilQeU9iamVjdF9NQUxMT0Moc2l6ZW9mKFB5U3RyaW5nT2JqZWN0KSArIHNpemUpOwotCWlmIChvcCA9PSBOVUxMKQotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQlQeU9iamVjdF9JTklUX1ZBUihvcCwgJlB5U3RyaW5nX1R5cGUsIHNpemUpOwotCW9wLT5vYl9zaGFzaCA9IC0xOwotCW9wLT5vYl9zc3RhdGUgPSBTU1RBVEVfTk9UX0lOVEVSTkVEOwotCVB5X01FTUNQWShvcC0+b2Jfc3ZhbCwgYS0+b2Jfc3ZhbCwgUHlfU0laRShhKSk7Ci0JUHlfTUVNQ1BZKG9wLT5vYl9zdmFsICsgUHlfU0laRShhKSwgYi0+b2Jfc3ZhbCwgUHlfU0laRShiKSk7Ci0Jb3AtPm9iX3N2YWxbc2l6ZV0gPSAnXDAnOwotCXJldHVybiAoUHlPYmplY3QgKikgb3A7CisgICAgLyogT3B0aW1pemUgY2FzZXMgd2l0aCBlbXB0eSBsZWZ0IG9yIHJpZ2h0IG9wZXJhbmQgKi8KKyAgICBpZiAoKFB5X1NJWkUoYSkgPT0gMCB8fCBQeV9TSVpFKGIpID09IDApICYmCisgICAgICAgIFB5U3RyaW5nX0NoZWNrRXhhY3QoYSkgJiYgUHlTdHJpbmdfQ2hlY2tFeGFjdChiKSkgeworICAgICAgICBpZiAoUHlfU0laRShhKSA9PSAwKSB7CisgICAgICAgICAgICBQeV9JTkNSRUYoYmIpOworICAgICAgICAgICAgcmV0dXJuIGJiOworICAgICAgICB9CisgICAgICAgIFB5X0lOQ1JFRihhKTsKKyAgICAgICAgcmV0dXJuIChQeU9iamVjdCAqKWE7CisgICAgfQorICAgIHNpemUgPSBQeV9TSVpFKGEpICsgUHlfU0laRShiKTsKKyAgICAvKiBDaGVjayB0aGF0IHN0cmluZyBzaXplcyBhcmUgbm90IG5lZ2F0aXZlLCB0byBwcmV2ZW50IGFuCisgICAgICAgb3ZlcmZsb3cgaW4gY2FzZXMgd2hlcmUgd2UgYXJlIHBhc3NlZCBpbmNvcnJlY3RseS1jcmVhdGVkCisgICAgICAgc3RyaW5ncyB3aXRoIG5lZ2F0aXZlIGxlbmd0aHMgKGR1ZSB0byBhIGJ1ZyBpbiBvdGhlciBjb2RlKS4KKyAgICAqLworICAgIGlmIChQeV9TSVpFKGEpIDwgMCB8fCBQeV9TSVpFKGIpIDwgMCB8fAorICAgICAgICBQeV9TSVpFKGEpID4gUFlfU1NJWkVfVF9NQVggLSBQeV9TSVpFKGIpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInN0cmluZ3MgYXJlIHRvbyBsYXJnZSB0byBjb25jYXQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgLyogSW5saW5lIFB5T2JqZWN0X05ld1ZhciAqLworICAgIGlmIChzaXplID4gUFlfU1NJWkVfVF9NQVggLSBzaXplb2YoUHlTdHJpbmdPYmplY3QpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInN0cmluZ3MgYXJlIHRvbyBsYXJnZSB0byBjb25jYXQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIG9wID0gKFB5U3RyaW5nT2JqZWN0ICopUHlPYmplY3RfTUFMTE9DKHNpemVvZihQeVN0cmluZ09iamVjdCkgKyBzaXplKTsKKyAgICBpZiAob3AgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgUHlPYmplY3RfSU5JVF9WQVIob3AsICZQeVN0cmluZ19UeXBlLCBzaXplKTsKKyAgICBvcC0+b2Jfc2hhc2ggPSAtMTsKKyAgICBvcC0+b2Jfc3N0YXRlID0gU1NUQVRFX05PVF9JTlRFUk5FRDsKKyAgICBQeV9NRU1DUFkob3AtPm9iX3N2YWwsIGEtPm9iX3N2YWwsIFB5X1NJWkUoYSkpOworICAgIFB5X01FTUNQWShvcC0+b2Jfc3ZhbCArIFB5X1NJWkUoYSksIGItPm9iX3N2YWwsIFB5X1NJWkUoYikpOworICAgIG9wLT5vYl9zdmFsW3NpemVdID0gJ1wwJzsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopIG9wOwogI3VuZGVmIGIKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHN0cmluZ19yZXBlYXQocmVnaXN0ZXIgUHlTdHJpbmdPYmplY3QgKmEsIHJlZ2lzdGVyIFB5X3NzaXplX3QgbikKIHsKLQlyZWdpc3RlciBQeV9zc2l6ZV90IGk7Ci0JcmVnaXN0ZXIgUHlfc3NpemVfdCBqOwotCXJlZ2lzdGVyIFB5X3NzaXplX3Qgc2l6ZTsKLQlyZWdpc3RlciBQeVN0cmluZ09iamVjdCAqb3A7Ci0Jc2l6ZV90IG5ieXRlczsKLQlpZiAobiA8IDApCi0JCW4gPSAwOwotCS8qIHdhdGNoIG91dCBmb3Igb3ZlcmZsb3dzOiAgdGhlIHNpemUgY2FuIG92ZXJmbG93IGludCwKLQkgKiBhbmQgdGhlICMgb2YgYnl0ZXMgbmVlZGVkIGNhbiBvdmVyZmxvdyBzaXplX3QKLQkgKi8KLQlzaXplID0gUHlfU0laRShhKSAqIG47Ci0JaWYgKG4gJiYgc2l6ZSAvIG4gIT0gUHlfU0laRShhKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJCSJyZXBlYXRlZCBzdHJpbmcgaXMgdG9vIGxvbmciKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChzaXplID09IFB5X1NJWkUoYSkgJiYgUHlTdHJpbmdfQ2hlY2tFeGFjdChhKSkgewotCQlQeV9JTkNSRUYoYSk7Ci0JCXJldHVybiAoUHlPYmplY3QgKilhOwotCX0KLQluYnl0ZXMgPSAoc2l6ZV90KXNpemU7Ci0JaWYgKG5ieXRlcyArIHNpemVvZihQeVN0cmluZ09iamVjdCkgPD0gbmJ5dGVzKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJInJlcGVhdGVkIHN0cmluZyBpcyB0b28gbG9uZyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0Jb3AgPSAoUHlTdHJpbmdPYmplY3QgKikKLQkJUHlPYmplY3RfTUFMTE9DKHNpemVvZihQeVN0cmluZ09iamVjdCkgKyBuYnl0ZXMpOwotCWlmIChvcCA9PSBOVUxMKQotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQlQeU9iamVjdF9JTklUX1ZBUihvcCwgJlB5U3RyaW5nX1R5cGUsIHNpemUpOwotCW9wLT5vYl9zaGFzaCA9IC0xOwotCW9wLT5vYl9zc3RhdGUgPSBTU1RBVEVfTk9UX0lOVEVSTkVEOwotCW9wLT5vYl9zdmFsW3NpemVdID0gJ1wwJzsKLQlpZiAoUHlfU0laRShhKSA9PSAxICYmIG4gPiAwKSB7Ci0JCW1lbXNldChvcC0+b2Jfc3ZhbCwgYS0+b2Jfc3ZhbFswXSAsIG4pOwotCQlyZXR1cm4gKFB5T2JqZWN0ICopIG9wOwotCX0KLQlpID0gMDsKLQlpZiAoaSA8IHNpemUpIHsKLQkJUHlfTUVNQ1BZKG9wLT5vYl9zdmFsLCBhLT5vYl9zdmFsLCBQeV9TSVpFKGEpKTsKLQkJaSA9IFB5X1NJWkUoYSk7Ci0JfQotCXdoaWxlIChpIDwgc2l6ZSkgewotCQlqID0gKGkgPD0gc2l6ZS1pKSAgPyAgaSAgOiAgc2l6ZS1pOwotCQlQeV9NRU1DUFkob3AtPm9iX3N2YWwraSwgb3AtPm9iX3N2YWwsIGopOwotCQlpICs9IGo7Ci0JfQotCXJldHVybiAoUHlPYmplY3QgKikgb3A7CisgICAgcmVnaXN0ZXIgUHlfc3NpemVfdCBpOworICAgIHJlZ2lzdGVyIFB5X3NzaXplX3QgajsKKyAgICByZWdpc3RlciBQeV9zc2l6ZV90IHNpemU7CisgICAgcmVnaXN0ZXIgUHlTdHJpbmdPYmplY3QgKm9wOworICAgIHNpemVfdCBuYnl0ZXM7CisgICAgaWYgKG4gPCAwKQorICAgICAgICBuID0gMDsKKyAgICAvKiB3YXRjaCBvdXQgZm9yIG92ZXJmbG93czogIHRoZSBzaXplIGNhbiBvdmVyZmxvdyBpbnQsCisgICAgICogYW5kIHRoZSAjIG9mIGJ5dGVzIG5lZWRlZCBjYW4gb3ZlcmZsb3cgc2l6ZV90CisgICAgICovCisgICAgc2l6ZSA9IFB5X1NJWkUoYSkgKiBuOworICAgIGlmIChuICYmIHNpemUgLyBuICE9IFB5X1NJWkUoYSkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAicmVwZWF0ZWQgc3RyaW5nIGlzIHRvbyBsb25nIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoc2l6ZSA9PSBQeV9TSVpFKGEpICYmIFB5U3RyaW5nX0NoZWNrRXhhY3QoYSkpIHsKKyAgICAgICAgUHlfSU5DUkVGKGEpOworICAgICAgICByZXR1cm4gKFB5T2JqZWN0ICopYTsKKyAgICB9CisgICAgbmJ5dGVzID0gKHNpemVfdClzaXplOworICAgIGlmIChuYnl0ZXMgKyBzaXplb2YoUHlTdHJpbmdPYmplY3QpIDw9IG5ieXRlcykgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICJyZXBlYXRlZCBzdHJpbmcgaXMgdG9vIGxvbmciKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIG9wID0gKFB5U3RyaW5nT2JqZWN0ICopCisgICAgICAgIFB5T2JqZWN0X01BTExPQyhzaXplb2YoUHlTdHJpbmdPYmplY3QpICsgbmJ5dGVzKTsKKyAgICBpZiAob3AgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgUHlPYmplY3RfSU5JVF9WQVIob3AsICZQeVN0cmluZ19UeXBlLCBzaXplKTsKKyAgICBvcC0+b2Jfc2hhc2ggPSAtMTsKKyAgICBvcC0+b2Jfc3N0YXRlID0gU1NUQVRFX05PVF9JTlRFUk5FRDsKKyAgICBvcC0+b2Jfc3ZhbFtzaXplXSA9ICdcMCc7CisgICAgaWYgKFB5X1NJWkUoYSkgPT0gMSAmJiBuID4gMCkgeworICAgICAgICBtZW1zZXQob3AtPm9iX3N2YWwsIGEtPm9iX3N2YWxbMF0gLCBuKTsKKyAgICAgICAgcmV0dXJuIChQeU9iamVjdCAqKSBvcDsKKyAgICB9CisgICAgaSA9IDA7CisgICAgaWYgKGkgPCBzaXplKSB7CisgICAgICAgIFB5X01FTUNQWShvcC0+b2Jfc3ZhbCwgYS0+b2Jfc3ZhbCwgUHlfU0laRShhKSk7CisgICAgICAgIGkgPSBQeV9TSVpFKGEpOworICAgIH0KKyAgICB3aGlsZSAoaSA8IHNpemUpIHsKKyAgICAgICAgaiA9IChpIDw9IHNpemUtaSkgID8gIGkgIDogIHNpemUtaTsKKyAgICAgICAgUHlfTUVNQ1BZKG9wLT5vYl9zdmFsK2ksIG9wLT5vYl9zdmFsLCBqKTsKKyAgICAgICAgaSArPSBqOworICAgIH0KKyAgICByZXR1cm4gKFB5T2JqZWN0ICopIG9wOwogfQogCiAvKiBTdHJpbmcgc2xpY2UgYVtpOmpdIGNvbnNpc3RzIG9mIGNoYXJhY3RlcnMgYVtpXSAuLi4gYVtqLTFdICovCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdHJpbmdfc2xpY2UocmVnaXN0ZXIgUHlTdHJpbmdPYmplY3QgKmEsIHJlZ2lzdGVyIFB5X3NzaXplX3QgaSwKLQkgICAgIHJlZ2lzdGVyIFB5X3NzaXplX3QgaikKKyAgICAgICAgICAgICByZWdpc3RlciBQeV9zc2l6ZV90IGopCiAgICAgIC8qIGogLS0gbWF5IGJlIG5lZ2F0aXZlISAqLwogewotCWlmIChpIDwgMCkKLQkJaSA9IDA7Ci0JaWYgKGogPCAwKQotCQlqID0gMDsgLyogQXZvaWQgc2lnbmVkL3Vuc2lnbmVkIGJ1ZyBpbiBuZXh0IGxpbmUgKi8KLQlpZiAoaiA+IFB5X1NJWkUoYSkpCi0JCWogPSBQeV9TSVpFKGEpOwotCWlmIChpID09IDAgJiYgaiA9PSBQeV9TSVpFKGEpICYmIFB5U3RyaW5nX0NoZWNrRXhhY3QoYSkpIHsKLQkJLyogSXQncyB0aGUgc2FtZSBhcyBhICovCi0JCVB5X0lOQ1JFRihhKTsKLQkJcmV0dXJuIChQeU9iamVjdCAqKWE7Ci0JfQotCWlmIChqIDwgaSkKLQkJaiA9IGk7Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGEtPm9iX3N2YWwgKyBpLCBqLWkpOworICAgIGlmIChpIDwgMCkKKyAgICAgICAgaSA9IDA7CisgICAgaWYgKGogPCAwKQorICAgICAgICBqID0gMDsgLyogQXZvaWQgc2lnbmVkL3Vuc2lnbmVkIGJ1ZyBpbiBuZXh0IGxpbmUgKi8KKyAgICBpZiAoaiA+IFB5X1NJWkUoYSkpCisgICAgICAgIGogPSBQeV9TSVpFKGEpOworICAgIGlmIChpID09IDAgJiYgaiA9PSBQeV9TSVpFKGEpICYmIFB5U3RyaW5nX0NoZWNrRXhhY3QoYSkpIHsKKyAgICAgICAgLyogSXQncyB0aGUgc2FtZSBhcyBhICovCisgICAgICAgIFB5X0lOQ1JFRihhKTsKKyAgICAgICAgcmV0dXJuIChQeU9iamVjdCAqKWE7CisgICAgfQorICAgIGlmIChqIDwgaSkKKyAgICAgICAgaiA9IGk7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGEtPm9iX3N2YWwgKyBpLCBqLWkpOwogfQogCiBzdGF0aWMgaW50CiBzdHJpbmdfY29udGFpbnMoUHlPYmplY3QgKnN0cl9vYmosIFB5T2JqZWN0ICpzdWJfb2JqKQogewotCWlmICghUHlTdHJpbmdfQ2hlY2tFeGFjdChzdWJfb2JqKSkgeworICAgIGlmICghUHlTdHJpbmdfQ2hlY2tFeGFjdChzdWJfb2JqKSkgewogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQkJaWYgKFB5VW5pY29kZV9DaGVjayhzdWJfb2JqKSkKLQkJCXJldHVybiBQeVVuaWNvZGVfQ29udGFpbnMoc3RyX29iaiwgc3ViX29iaik7CisgICAgICAgIGlmIChQeVVuaWNvZGVfQ2hlY2soc3ViX29iaikpCisgICAgICAgICAgICByZXR1cm4gUHlVbmljb2RlX0NvbnRhaW5zKHN0cl9vYmosIHN1Yl9vYmopOwogI2VuZGlmCi0JCWlmICghUHlTdHJpbmdfQ2hlY2soc3ViX29iaikpIHsKLQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgIidpbiA8c3RyaW5nPicgcmVxdWlyZXMgc3RyaW5nIGFzIGxlZnQgb3BlcmFuZCwgIgotCQkJICAgICJub3QgJS4yMDBzIiwgUHlfVFlQRShzdWJfb2JqKS0+dHBfbmFtZSk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9CisgICAgICAgIGlmICghUHlTdHJpbmdfQ2hlY2soc3ViX29iaikpIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgIidpbiA8c3RyaW5nPicgcmVxdWlyZXMgc3RyaW5nIGFzIGxlZnQgb3BlcmFuZCwgIgorICAgICAgICAgICAgICAgICJub3QgJS4yMDBzIiwgUHlfVFlQRShzdWJfb2JqKS0+dHBfbmFtZSk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CiAKLQlyZXR1cm4gc3RyaW5nbGliX2NvbnRhaW5zX29iaihzdHJfb2JqLCBzdWJfb2JqKTsKKyAgICByZXR1cm4gc3RyaW5nbGliX2NvbnRhaW5zX29iaihzdHJfb2JqLCBzdWJfb2JqKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHN0cmluZ19pdGVtKFB5U3RyaW5nT2JqZWN0ICphLCByZWdpc3RlciBQeV9zc2l6ZV90IGkpCiB7Ci0JY2hhciBwY2hhcjsKLQlQeU9iamVjdCAqdjsKLQlpZiAoaSA8IDAgfHwgaSA+PSBQeV9TSVpFKGEpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLCAic3RyaW5nIGluZGV4IG91dCBvZiByYW5nZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcGNoYXIgPSBhLT5vYl9zdmFsW2ldOwotCXYgPSAoUHlPYmplY3QgKiljaGFyYWN0ZXJzW3BjaGFyICYgVUNIQVJfTUFYXTsKLQlpZiAodiA9PSBOVUxMKQotCQl2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoJnBjaGFyLCAxKTsKLQllbHNlIHsKKyAgICBjaGFyIHBjaGFyOworICAgIFB5T2JqZWN0ICp2OworICAgIGlmIChpIDwgMCB8fCBpID49IFB5X1NJWkUoYSkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsICJzdHJpbmcgaW5kZXggb3V0IG9mIHJhbmdlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBwY2hhciA9IGEtPm9iX3N2YWxbaV07CisgICAgdiA9IChQeU9iamVjdCAqKWNoYXJhY3RlcnNbcGNoYXIgJiBVQ0hBUl9NQVhdOworICAgIGlmICh2ID09IE5VTEwpCisgICAgICAgIHYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgmcGNoYXIsIDEpOworICAgIGVsc2UgewogI2lmZGVmIENPVU5UX0FMTE9DUwotCQlvbmVfc3RyaW5ncysrOworICAgICAgICBvbmVfc3RyaW5ncysrOwogI2VuZGlmCi0JCVB5X0lOQ1JFRih2KTsKLQl9Ci0JcmV0dXJuIHY7CisgICAgICAgIFB5X0lOQ1JFRih2KTsKKyAgICB9CisgICAgcmV0dXJuIHY7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCoKIHN0cmluZ19yaWNoY29tcGFyZShQeVN0cmluZ09iamVjdCAqYSwgUHlTdHJpbmdPYmplY3QgKmIsIGludCBvcCkKIHsKLQlpbnQgYzsKLQlQeV9zc2l6ZV90IGxlbl9hLCBsZW5fYjsKLQlQeV9zc2l6ZV90IG1pbl9sZW47Ci0JUHlPYmplY3QgKnJlc3VsdDsKKyAgICBpbnQgYzsKKyAgICBQeV9zc2l6ZV90IGxlbl9hLCBsZW5fYjsKKyAgICBQeV9zc2l6ZV90IG1pbl9sZW47CisgICAgUHlPYmplY3QgKnJlc3VsdDsKIAotCS8qIE1ha2Ugc3VyZSBib3RoIGFyZ3VtZW50cyBhcmUgc3RyaW5ncy4gKi8KLQlpZiAoIShQeVN0cmluZ19DaGVjayhhKSAmJiBQeVN0cmluZ19DaGVjayhiKSkpIHsKLQkJcmVzdWx0ID0gUHlfTm90SW1wbGVtZW50ZWQ7Ci0JCWdvdG8gb3V0OwotCX0KLQlpZiAoYSA9PSBiKSB7Ci0JCXN3aXRjaCAob3ApIHsKLQkJY2FzZSBQeV9FUTpjYXNlIFB5X0xFOmNhc2UgUHlfR0U6Ci0JCQlyZXN1bHQgPSBQeV9UcnVlOwotCQkJZ290byBvdXQ7Ci0JCWNhc2UgUHlfTkU6Y2FzZSBQeV9MVDpjYXNlIFB5X0dUOgotCQkJcmVzdWx0ID0gUHlfRmFsc2U7Ci0JCQlnb3RvIG91dDsKLQkJfQotCX0KLQlpZiAob3AgPT0gUHlfRVEpIHsKLQkJLyogU3VwcG9ydGluZyBQeV9ORSBoZXJlIGFzIHdlbGwgZG9lcyBub3Qgc2F2ZQotCQkgICBtdWNoIHRpbWUsIHNpbmNlIFB5X05FIGlzIHJhcmVseSB1c2VkLiAgKi8KLQkJaWYgKFB5X1NJWkUoYSkgPT0gUHlfU0laRShiKQotCQkgICAgJiYgKGEtPm9iX3N2YWxbMF0gPT0gYi0+b2Jfc3ZhbFswXQotCQkJJiYgbWVtY21wKGEtPm9iX3N2YWwsIGItPm9iX3N2YWwsIFB5X1NJWkUoYSkpID09IDApKSB7Ci0JCQlyZXN1bHQgPSBQeV9UcnVlOwotCQl9IGVsc2UgewotCQkJcmVzdWx0ID0gUHlfRmFsc2U7Ci0JCX0KLQkJZ290byBvdXQ7Ci0JfQotCWxlbl9hID0gUHlfU0laRShhKTsgbGVuX2IgPSBQeV9TSVpFKGIpOwotCW1pbl9sZW4gPSAobGVuX2EgPCBsZW5fYikgPyBsZW5fYSA6IGxlbl9iOwotCWlmIChtaW5fbGVuID4gMCkgewotCQljID0gUHlfQ0hBUk1BU0soKmEtPm9iX3N2YWwpIC0gUHlfQ0hBUk1BU0soKmItPm9iX3N2YWwpOwotCQlpZiAoYz09MCkKLQkJCWMgPSBtZW1jbXAoYS0+b2Jfc3ZhbCwgYi0+b2Jfc3ZhbCwgbWluX2xlbik7Ci0JfSBlbHNlCi0JCWMgPSAwOwotCWlmIChjID09IDApCi0JCWMgPSAobGVuX2EgPCBsZW5fYikgPyAtMSA6IChsZW5fYSA+IGxlbl9iKSA/IDEgOiAwOwotCXN3aXRjaCAob3ApIHsKLQljYXNlIFB5X0xUOiBjID0gYyA8ICAwOyBicmVhazsKLQljYXNlIFB5X0xFOiBjID0gYyA8PSAwOyBicmVhazsKLQljYXNlIFB5X0VROiBhc3NlcnQoMCk7ICBicmVhazsgLyogdW5yZWFjaGFibGUgKi8KLQljYXNlIFB5X05FOiBjID0gYyAhPSAwOyBicmVhazsKLQljYXNlIFB5X0dUOiBjID0gYyA+ICAwOyBicmVhazsKLQljYXNlIFB5X0dFOiBjID0gYyA+PSAwOyBicmVhazsKLQlkZWZhdWx0OgotCQlyZXN1bHQgPSBQeV9Ob3RJbXBsZW1lbnRlZDsKLQkJZ290byBvdXQ7Ci0JfQotCXJlc3VsdCA9IGMgPyBQeV9UcnVlIDogUHlfRmFsc2U7CisgICAgLyogTWFrZSBzdXJlIGJvdGggYXJndW1lbnRzIGFyZSBzdHJpbmdzLiAqLworICAgIGlmICghKFB5U3RyaW5nX0NoZWNrKGEpICYmIFB5U3RyaW5nX0NoZWNrKGIpKSkgeworICAgICAgICByZXN1bHQgPSBQeV9Ob3RJbXBsZW1lbnRlZDsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorICAgIGlmIChhID09IGIpIHsKKyAgICAgICAgc3dpdGNoIChvcCkgeworICAgICAgICBjYXNlIFB5X0VROmNhc2UgUHlfTEU6Y2FzZSBQeV9HRToKKyAgICAgICAgICAgIHJlc3VsdCA9IFB5X1RydWU7CisgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgY2FzZSBQeV9ORTpjYXNlIFB5X0xUOmNhc2UgUHlfR1Q6CisgICAgICAgICAgICByZXN1bHQgPSBQeV9GYWxzZTsKKyAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgfQorICAgIGlmIChvcCA9PSBQeV9FUSkgeworICAgICAgICAvKiBTdXBwb3J0aW5nIFB5X05FIGhlcmUgYXMgd2VsbCBkb2VzIG5vdCBzYXZlCisgICAgICAgICAgIG11Y2ggdGltZSwgc2luY2UgUHlfTkUgaXMgcmFyZWx5IHVzZWQuICAqLworICAgICAgICBpZiAoUHlfU0laRShhKSA9PSBQeV9TSVpFKGIpCisgICAgICAgICAgICAmJiAoYS0+b2Jfc3ZhbFswXSA9PSBiLT5vYl9zdmFsWzBdCisgICAgICAgICAgICAmJiBtZW1jbXAoYS0+b2Jfc3ZhbCwgYi0+b2Jfc3ZhbCwgUHlfU0laRShhKSkgPT0gMCkpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IFB5X1RydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXN1bHQgPSBQeV9GYWxzZTsKKyAgICAgICAgfQorICAgICAgICBnb3RvIG91dDsKKyAgICB9CisgICAgbGVuX2EgPSBQeV9TSVpFKGEpOyBsZW5fYiA9IFB5X1NJWkUoYik7CisgICAgbWluX2xlbiA9IChsZW5fYSA8IGxlbl9iKSA/IGxlbl9hIDogbGVuX2I7CisgICAgaWYgKG1pbl9sZW4gPiAwKSB7CisgICAgICAgIGMgPSBQeV9DSEFSTUFTSygqYS0+b2Jfc3ZhbCkgLSBQeV9DSEFSTUFTSygqYi0+b2Jfc3ZhbCk7CisgICAgICAgIGlmIChjPT0wKQorICAgICAgICAgICAgYyA9IG1lbWNtcChhLT5vYl9zdmFsLCBiLT5vYl9zdmFsLCBtaW5fbGVuKTsKKyAgICB9IGVsc2UKKyAgICAgICAgYyA9IDA7CisgICAgaWYgKGMgPT0gMCkKKyAgICAgICAgYyA9IChsZW5fYSA8IGxlbl9iKSA/IC0xIDogKGxlbl9hID4gbGVuX2IpID8gMSA6IDA7CisgICAgc3dpdGNoIChvcCkgeworICAgIGNhc2UgUHlfTFQ6IGMgPSBjIDwgIDA7IGJyZWFrOworICAgIGNhc2UgUHlfTEU6IGMgPSBjIDw9IDA7IGJyZWFrOworICAgIGNhc2UgUHlfRVE6IGFzc2VydCgwKTsgIGJyZWFrOyAvKiB1bnJlYWNoYWJsZSAqLworICAgIGNhc2UgUHlfTkU6IGMgPSBjICE9IDA7IGJyZWFrOworICAgIGNhc2UgUHlfR1Q6IGMgPSBjID4gIDA7IGJyZWFrOworICAgIGNhc2UgUHlfR0U6IGMgPSBjID49IDA7IGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJlc3VsdCA9IFB5X05vdEltcGxlbWVudGVkOworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisgICAgcmVzdWx0ID0gYyA/IFB5X1RydWUgOiBQeV9GYWxzZTsKICAgb3V0OgotCVB5X0lOQ1JFRihyZXN1bHQpOwotCXJldHVybiByZXN1bHQ7CisgICAgUHlfSU5DUkVGKHJlc3VsdCk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogaW50CiBfUHlTdHJpbmdfRXEoUHlPYmplY3QgKm8xLCBQeU9iamVjdCAqbzIpCiB7Ci0JUHlTdHJpbmdPYmplY3QgKmEgPSAoUHlTdHJpbmdPYmplY3QqKSBvMTsKLQlQeVN0cmluZ09iamVjdCAqYiA9IChQeVN0cmluZ09iamVjdCopIG8yOwotICAgICAgICByZXR1cm4gUHlfU0laRShhKSA9PSBQeV9TSVpFKGIpCi0gICAgICAgICAgJiYgKmEtPm9iX3N2YWwgPT0gKmItPm9iX3N2YWwKLSAgICAgICAgICAmJiBtZW1jbXAoYS0+b2Jfc3ZhbCwgYi0+b2Jfc3ZhbCwgUHlfU0laRShhKSkgPT0gMDsKKyAgICBQeVN0cmluZ09iamVjdCAqYSA9IChQeVN0cmluZ09iamVjdCopIG8xOworICAgIFB5U3RyaW5nT2JqZWN0ICpiID0gKFB5U3RyaW5nT2JqZWN0KikgbzI7CisgICAgcmV0dXJuIFB5X1NJWkUoYSkgPT0gUHlfU0laRShiKQorICAgICAgJiYgKmEtPm9iX3N2YWwgPT0gKmItPm9iX3N2YWwKKyAgICAgICYmIG1lbWNtcChhLT5vYl9zdmFsLCBiLT5vYl9zdmFsLCBQeV9TSVpFKGEpKSA9PSAwOwogfQogCiBzdGF0aWMgbG9uZwogc3RyaW5nX2hhc2goUHlTdHJpbmdPYmplY3QgKmEpCiB7Ci0JcmVnaXN0ZXIgUHlfc3NpemVfdCBsZW47Ci0JcmVnaXN0ZXIgdW5zaWduZWQgY2hhciAqcDsKLQlyZWdpc3RlciBsb25nIHg7CisgICAgcmVnaXN0ZXIgUHlfc3NpemVfdCBsZW47CisgICAgcmVnaXN0ZXIgdW5zaWduZWQgY2hhciAqcDsKKyAgICByZWdpc3RlciBsb25nIHg7CiAKLQlpZiAoYS0+b2Jfc2hhc2ggIT0gLTEpCi0JCXJldHVybiBhLT5vYl9zaGFzaDsKLQlsZW4gPSBQeV9TSVpFKGEpOwotCXAgPSAodW5zaWduZWQgY2hhciAqKSBhLT5vYl9zdmFsOwotCXggPSAqcCA8PCA3OwotCXdoaWxlICgtLWxlbiA+PSAwKQotCQl4ID0gKDEwMDAwMDMqeCkgXiAqcCsrOwotCXggXj0gUHlfU0laRShhKTsKLQlpZiAoeCA9PSAtMSkKLQkJeCA9IC0yOwotCWEtPm9iX3NoYXNoID0geDsKLQlyZXR1cm4geDsKKyAgICBpZiAoYS0+b2Jfc2hhc2ggIT0gLTEpCisgICAgICAgIHJldHVybiBhLT5vYl9zaGFzaDsKKyAgICBsZW4gPSBQeV9TSVpFKGEpOworICAgIHAgPSAodW5zaWduZWQgY2hhciAqKSBhLT5vYl9zdmFsOworICAgIHggPSAqcCA8PCA3OworICAgIHdoaWxlICgtLWxlbiA+PSAwKQorICAgICAgICB4ID0gKDEwMDAwMDMqeCkgXiAqcCsrOworICAgIHggXj0gUHlfU0laRShhKTsKKyAgICBpZiAoeCA9PSAtMSkKKyAgICAgICAgeCA9IC0yOworICAgIGEtPm9iX3NoYXNoID0geDsKKyAgICByZXR1cm4geDsKIH0KIAogc3RhdGljIFB5T2JqZWN0Kgogc3RyaW5nX3N1YnNjcmlwdChQeVN0cmluZ09iamVjdCogc2VsZiwgUHlPYmplY3QqIGl0ZW0pCiB7Ci0JaWYgKFB5SW5kZXhfQ2hlY2soaXRlbSkpIHsKLQkJUHlfc3NpemVfdCBpID0gUHlOdW1iZXJfQXNTc2l6ZV90KGl0ZW0sIFB5RXhjX0luZGV4RXJyb3IpOwotCQlpZiAoaSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWlmIChpIDwgMCkKLQkJCWkgKz0gUHlTdHJpbmdfR0VUX1NJWkUoc2VsZik7Ci0JCXJldHVybiBzdHJpbmdfaXRlbShzZWxmLCBpKTsKLQl9Ci0JZWxzZSBpZiAoUHlTbGljZV9DaGVjayhpdGVtKSkgewotCQlQeV9zc2l6ZV90IHN0YXJ0LCBzdG9wLCBzdGVwLCBzbGljZWxlbmd0aCwgY3VyLCBpOwotCQljaGFyKiBzb3VyY2VfYnVmOwotCQljaGFyKiByZXN1bHRfYnVmOwotCQlQeU9iamVjdCogcmVzdWx0OworICAgIGlmIChQeUluZGV4X0NoZWNrKGl0ZW0pKSB7CisgICAgICAgIFB5X3NzaXplX3QgaSA9IFB5TnVtYmVyX0FzU3NpemVfdChpdGVtLCBQeUV4Y19JbmRleEVycm9yKTsKKyAgICAgICAgaWYgKGkgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBpZiAoaSA8IDApCisgICAgICAgICAgICBpICs9IFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpOworICAgICAgICByZXR1cm4gc3RyaW5nX2l0ZW0oc2VsZiwgaSk7CisgICAgfQorICAgIGVsc2UgaWYgKFB5U2xpY2VfQ2hlY2soaXRlbSkpIHsKKyAgICAgICAgUHlfc3NpemVfdCBzdGFydCwgc3RvcCwgc3RlcCwgc2xpY2VsZW5ndGgsIGN1ciwgaTsKKyAgICAgICAgY2hhciogc291cmNlX2J1ZjsKKyAgICAgICAgY2hhciogcmVzdWx0X2J1ZjsKKyAgICAgICAgUHlPYmplY3QqIHJlc3VsdDsKIAotCQlpZiAoUHlTbGljZV9HZXRJbmRpY2VzRXgoKFB5U2xpY2VPYmplY3QqKWl0ZW0sCi0JCQkJIFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpLAotCQkJCSAmc3RhcnQsICZzdG9wLCAmc3RlcCwgJnNsaWNlbGVuZ3RoKSA8IDApIHsKLQkJCXJldHVybiBOVUxMOwotCQl9CisgICAgICAgIGlmIChQeVNsaWNlX0dldEluZGljZXNFeCgoUHlTbGljZU9iamVjdCopaXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19HRVRfU0laRShzZWxmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhcnQsICZzdG9wLCAmc3RlcCwgJnNsaWNlbGVuZ3RoKSA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CiAKLQkJaWYgKHNsaWNlbGVuZ3RoIDw9IDApIHsKLQkJCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgiIiwgMCk7Ci0JCX0KLQkJZWxzZSBpZiAoc3RhcnQgPT0gMCAmJiBzdGVwID09IDEgJiYKLQkJCSBzbGljZWxlbmd0aCA9PSBQeVN0cmluZ19HRVRfU0laRShzZWxmKSAmJgotCQkJIFB5U3RyaW5nX0NoZWNrRXhhY3Qoc2VsZikpIHsKLQkJCVB5X0lOQ1JFRihzZWxmKTsKLQkJCXJldHVybiAoUHlPYmplY3QgKilzZWxmOwotCQl9Ci0JCWVsc2UgaWYgKHN0ZXAgPT0gMSkgewotCQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKAotCQkJCVB5U3RyaW5nX0FTX1NUUklORyhzZWxmKSArIHN0YXJ0LAotCQkJCXNsaWNlbGVuZ3RoKTsKLQkJfQotCQllbHNlIHsKLQkJCXNvdXJjZV9idWYgPSBQeVN0cmluZ19Bc1N0cmluZygoUHlPYmplY3QqKXNlbGYpOwotCQkJcmVzdWx0X2J1ZiA9IChjaGFyICopUHlNZW1fTWFsbG9jKHNsaWNlbGVuZ3RoKTsKLQkJCWlmIChyZXN1bHRfYnVmID09IE5VTEwpCi0JCQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIGlmIChzbGljZWxlbmd0aCA8PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoIiIsIDApOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHN0YXJ0ID09IDAgJiYgc3RlcCA9PSAxICYmCisgICAgICAgICAgICAgICAgIHNsaWNlbGVuZ3RoID09IFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpICYmCisgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0NoZWNrRXhhY3Qoc2VsZikpIHsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihzZWxmKTsKKyAgICAgICAgICAgIHJldHVybiAoUHlPYmplY3QgKilzZWxmOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHN0ZXAgPT0gMSkgeworICAgICAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKAorICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKSArIHN0YXJ0LAorICAgICAgICAgICAgICAgIHNsaWNlbGVuZ3RoKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHNvdXJjZV9idWYgPSBQeVN0cmluZ19Bc1N0cmluZygoUHlPYmplY3QqKXNlbGYpOworICAgICAgICAgICAgcmVzdWx0X2J1ZiA9IChjaGFyICopUHlNZW1fTWFsbG9jKHNsaWNlbGVuZ3RoKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHRfYnVmID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CiAKLQkJCWZvciAoY3VyID0gc3RhcnQsIGkgPSAwOyBpIDwgc2xpY2VsZW5ndGg7Ci0JCQkgICAgIGN1ciArPSBzdGVwLCBpKyspIHsKLQkJCQlyZXN1bHRfYnVmW2ldID0gc291cmNlX2J1ZltjdXJdOwotCQkJfQorICAgICAgICAgICAgZm9yIChjdXIgPSBzdGFydCwgaSA9IDA7IGkgPCBzbGljZWxlbmd0aDsKKyAgICAgICAgICAgICAgICAgY3VyICs9IHN0ZXAsIGkrKykgeworICAgICAgICAgICAgICAgIHJlc3VsdF9idWZbaV0gPSBzb3VyY2VfYnVmW2N1cl07CisgICAgICAgICAgICB9CiAKLQkJCXJlc3VsdCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHJlc3VsdF9idWYsCi0JCQkJCQkJICAgIHNsaWNlbGVuZ3RoKTsKLQkJCVB5TWVtX0ZyZWUocmVzdWx0X2J1Zik7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JfQotCWVsc2UgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJICAgICAic3RyaW5nIGluZGljZXMgbXVzdCBiZSBpbnRlZ2Vycywgbm90ICUuMjAwcyIsCi0JCQkgICAgIFB5X1RZUEUoaXRlbSktPnRwX25hbWUpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgICAgICAgICByZXN1bHQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShyZXN1bHRfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xpY2VsZW5ndGgpOworICAgICAgICAgICAgUHlNZW1fRnJlZShyZXN1bHRfYnVmKTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAic3RyaW5nIGluZGljZXMgbXVzdCBiZSBpbnRlZ2Vycywgbm90ICUuMjAwcyIsCisgICAgICAgICAgICAgICAgICAgICBQeV9UWVBFKGl0ZW0pLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogfQogCiBzdGF0aWMgUHlfc3NpemVfdAogc3RyaW5nX2J1ZmZlcl9nZXRyZWFkYnVmKFB5U3RyaW5nT2JqZWN0ICpzZWxmLCBQeV9zc2l6ZV90IGluZGV4LCBjb25zdCB2b2lkICoqcHRyKQogewotCWlmICggaW5kZXggIT0gMCApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAotCQkJCSJhY2Nlc3Npbmcgbm9uLWV4aXN0ZW50IHN0cmluZyBzZWdtZW50Iik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JKnB0ciA9ICh2b2lkICopc2VsZi0+b2Jfc3ZhbDsKLQlyZXR1cm4gUHlfU0laRShzZWxmKTsKKyAgICBpZiAoIGluZGV4ICE9IDAgKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJhY2Nlc3Npbmcgbm9uLWV4aXN0ZW50IHN0cmluZyBzZWdtZW50Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgKnB0ciA9ICh2b2lkICopc2VsZi0+b2Jfc3ZhbDsKKyAgICByZXR1cm4gUHlfU0laRShzZWxmKTsKIH0KIAogc3RhdGljIFB5X3NzaXplX3QKIHN0cmluZ19idWZmZXJfZ2V0d3JpdGVidWYoUHlTdHJpbmdPYmplY3QgKnNlbGYsIFB5X3NzaXplX3QgaW5kZXgsIGNvbnN0IHZvaWQgKipwdHIpCiB7Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCSJDYW5ub3QgdXNlIHN0cmluZyBhcyBtb2RpZmlhYmxlIGJ1ZmZlciIpOwotCXJldHVybiAtMTsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IHVzZSBzdHJpbmcgYXMgbW9kaWZpYWJsZSBidWZmZXIiKTsKKyAgICByZXR1cm4gLTE7CiB9CiAKIHN0YXRpYyBQeV9zc2l6ZV90CiBzdHJpbmdfYnVmZmVyX2dldHNlZ2NvdW50KFB5U3RyaW5nT2JqZWN0ICpzZWxmLCBQeV9zc2l6ZV90ICpsZW5wKQogewotCWlmICggbGVucCApCi0JCSpsZW5wID0gUHlfU0laRShzZWxmKTsKLQlyZXR1cm4gMTsKKyAgICBpZiAoIGxlbnAgKQorICAgICAgICAqbGVucCA9IFB5X1NJWkUoc2VsZik7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyBQeV9zc2l6ZV90CiBzdHJpbmdfYnVmZmVyX2dldGNoYXJidWYoUHlTdHJpbmdPYmplY3QgKnNlbGYsIFB5X3NzaXplX3QgaW5kZXgsIGNvbnN0IGNoYXIgKipwdHIpCiB7Ci0JaWYgKCBpbmRleCAhPSAwICkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCi0JCQkJImFjY2Vzc2luZyBub24tZXhpc3RlbnQgc3RyaW5nIHNlZ21lbnQiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQkqcHRyID0gc2VsZi0+b2Jfc3ZhbDsKLQlyZXR1cm4gUHlfU0laRShzZWxmKTsKKyAgICBpZiAoIGluZGV4ICE9IDAgKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJhY2Nlc3Npbmcgbm9uLWV4aXN0ZW50IHN0cmluZyBzZWdtZW50Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgKnB0ciA9IHNlbGYtPm9iX3N2YWw7CisgICAgcmV0dXJuIFB5X1NJWkUoc2VsZik7CiB9CiAKIHN0YXRpYyBpbnQKIHN0cmluZ19idWZmZXJfZ2V0YnVmZmVyKFB5U3RyaW5nT2JqZWN0ICpzZWxmLCBQeV9idWZmZXIgKnZpZXcsIGludCBmbGFncykKIHsKLQlyZXR1cm4gUHlCdWZmZXJfRmlsbEluZm8odmlldywgKFB5T2JqZWN0KilzZWxmLAotCQkJCSAodm9pZCAqKXNlbGYtPm9iX3N2YWwsIFB5X1NJWkUoc2VsZiksCi0JCQkJIDEsIGZsYWdzKTsKKyAgICByZXR1cm4gUHlCdWZmZXJfRmlsbEluZm8odmlldywgKFB5T2JqZWN0KilzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXNlbGYtPm9iX3N2YWwsIFB5X1NJWkUoc2VsZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIGZsYWdzKTsKIH0KIAogc3RhdGljIFB5U2VxdWVuY2VNZXRob2RzIHN0cmluZ19hc19zZXF1ZW5jZSA9IHsKLQkobGVuZnVuYylzdHJpbmdfbGVuZ3RoLCAvKnNxX2xlbmd0aCovCi0JKGJpbmFyeWZ1bmMpc3RyaW5nX2NvbmNhdCwgLypzcV9jb25jYXQqLwotCShzc2l6ZWFyZ2Z1bmMpc3RyaW5nX3JlcGVhdCwgLypzcV9yZXBlYXQqLwotCShzc2l6ZWFyZ2Z1bmMpc3RyaW5nX2l0ZW0sIC8qc3FfaXRlbSovCi0JKHNzaXplc3NpemVhcmdmdW5jKXN0cmluZ19zbGljZSwgLypzcV9zbGljZSovCi0JMCwJCS8qc3FfYXNzX2l0ZW0qLwotCTAsCQkvKnNxX2Fzc19zbGljZSovCi0JKG9iam9ianByb2Mpc3RyaW5nX2NvbnRhaW5zIC8qc3FfY29udGFpbnMqLworICAgIChsZW5mdW5jKXN0cmluZ19sZW5ndGgsIC8qc3FfbGVuZ3RoKi8KKyAgICAoYmluYXJ5ZnVuYylzdHJpbmdfY29uY2F0LCAvKnNxX2NvbmNhdCovCisgICAgKHNzaXplYXJnZnVuYylzdHJpbmdfcmVwZWF0LCAvKnNxX3JlcGVhdCovCisgICAgKHNzaXplYXJnZnVuYylzdHJpbmdfaXRlbSwgLypzcV9pdGVtKi8KKyAgICAoc3NpemVzc2l6ZWFyZ2Z1bmMpc3RyaW5nX3NsaWNlLCAvKnNxX3NsaWNlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qc3FfYXNzX2l0ZW0qLworICAgIDAsICAgICAgICAgICAgICAgICAgLypzcV9hc3Nfc2xpY2UqLworICAgIChvYmpvYmpwcm9jKXN0cmluZ19jb250YWlucyAvKnNxX2NvbnRhaW5zKi8KIH07CiAKIHN0YXRpYyBQeU1hcHBpbmdNZXRob2RzIHN0cmluZ19hc19tYXBwaW5nID0gewotCShsZW5mdW5jKXN0cmluZ19sZW5ndGgsCi0JKGJpbmFyeWZ1bmMpc3RyaW5nX3N1YnNjcmlwdCwKLQkwLAorICAgIChsZW5mdW5jKXN0cmluZ19sZW5ndGgsCisgICAgKGJpbmFyeWZ1bmMpc3RyaW5nX3N1YnNjcmlwdCwKKyAgICAwLAogfTsKIAogc3RhdGljIFB5QnVmZmVyUHJvY3Mgc3RyaW5nX2FzX2J1ZmZlciA9IHsKLQkocmVhZGJ1ZmZlcnByb2Mpc3RyaW5nX2J1ZmZlcl9nZXRyZWFkYnVmLAotCSh3cml0ZWJ1ZmZlcnByb2Mpc3RyaW5nX2J1ZmZlcl9nZXR3cml0ZWJ1ZiwKLQkoc2VnY291bnRwcm9jKXN0cmluZ19idWZmZXJfZ2V0c2VnY291bnQsCi0JKGNoYXJidWZmZXJwcm9jKXN0cmluZ19idWZmZXJfZ2V0Y2hhcmJ1ZiwKLQkoZ2V0YnVmZmVycHJvYylzdHJpbmdfYnVmZmVyX2dldGJ1ZmZlciwKLQkwLCAvKiBYWFggKi8KKyAgICAocmVhZGJ1ZmZlcnByb2Mpc3RyaW5nX2J1ZmZlcl9nZXRyZWFkYnVmLAorICAgICh3cml0ZWJ1ZmZlcnByb2Mpc3RyaW5nX2J1ZmZlcl9nZXR3cml0ZWJ1ZiwKKyAgICAoc2VnY291bnRwcm9jKXN0cmluZ19idWZmZXJfZ2V0c2VnY291bnQsCisgICAgKGNoYXJidWZmZXJwcm9jKXN0cmluZ19idWZmZXJfZ2V0Y2hhcmJ1ZiwKKyAgICAoZ2V0YnVmZmVycHJvYylzdHJpbmdfYnVmZmVyX2dldGJ1ZmZlciwKKyAgICAwLCAvKiBYWFggKi8KIH07CiAKIApAQCAtMTM3Miw5ICsxMzcyLDkgQEAKIAogCiAvKiBEb24ndCBjYWxsIGlmIGxlbmd0aCA8IDIgKi8KLSNkZWZpbmUgUHlfU1RSSU5HX01BVENIKHRhcmdldCwgb2Zmc2V0LCBwYXR0ZXJuLCBsZW5ndGgpCVwKLSAgKHRhcmdldFtvZmZzZXRdID09IHBhdHRlcm5bMF0gJiYJCQkJXAotICAgdGFyZ2V0W29mZnNldCtsZW5ndGgtMV0gPT0gcGF0dGVybltsZW5ndGgtMV0gJiYJCVwKKyNkZWZpbmUgUHlfU1RSSU5HX01BVENIKHRhcmdldCwgb2Zmc2V0LCBwYXR0ZXJuLCBsZW5ndGgpICAgICAgICBcCisgICh0YXJnZXRbb2Zmc2V0XSA9PSBwYXR0ZXJuWzBdICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgdGFyZ2V0W29mZnNldCtsZW5ndGgtMV0gPT0gcGF0dGVybltsZW5ndGgtMV0gJiYgICAgICAgICAgICAgIFwKICAgICFtZW1jbXAodGFyZ2V0K29mZnNldCsxLCBwYXR0ZXJuKzEsIGxlbmd0aC0yKSApCiAKIApAQCAtMTM4OSwzNiArMTM4OSwzNiBAQAogCiAvKiA1IHNwbGl0cyBnaXZlcyA2IGVsZW1lbnRzICovCiAjZGVmaW5lIFBSRUFMTE9DX1NJWkUobWF4c3BsaXQpIFwKLQkobWF4c3BsaXQgPj0gTUFYX1BSRUFMTE9DID8gTUFYX1BSRUFMTE9DIDogbWF4c3BsaXQrMSkKKyAgICAobWF4c3BsaXQgPj0gTUFYX1BSRUFMTE9DID8gTUFYX1BSRUFMTE9DIDogbWF4c3BsaXQrMSkKIAotI2RlZmluZSBTUExJVF9BUFBFTkQoZGF0YSwgbGVmdCwgcmlnaHQpCQkJCVwKLQlzdHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoZGF0YSkgKyAobGVmdCksCVwKLQkJCQkJIChyaWdodCkgLSAobGVmdCkpOwlcCi0JaWYgKHN0ciA9PSBOVUxMKQkJCQkJXAotCQlnb3RvIG9uRXJyb3I7CQkJCQlcCi0JaWYgKFB5TGlzdF9BcHBlbmQobGlzdCwgc3RyKSkgewkJCQlcCi0JCVB5X0RFQ1JFRihzdHIpOwkJCQkJXAotCQlnb3RvIG9uRXJyb3I7CQkJCQlcCi0JfQkJCQkJCQlcCi0JZWxzZQkJCQkJCQlcCi0JCVB5X0RFQ1JFRihzdHIpOworI2RlZmluZSBTUExJVF9BUFBFTkQoZGF0YSwgbGVmdCwgcmlnaHQpICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoZGF0YSkgKyAobGVmdCksICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJpZ2h0KSAtIChsZWZ0KSk7ICAgICAgICAgXAorICAgIGlmIChzdHIgPT0gTlVMTCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZ290byBvbkVycm9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKFB5TGlzdF9BcHBlbmQobGlzdCwgc3RyKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBQeV9ERUNSRUYoc3RyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZ290byBvbkVycm9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgUHlfREVDUkVGKHN0cik7CiAKLSNkZWZpbmUgU1BMSVRfQUREKGRhdGEsIGxlZnQsIHJpZ2h0KSB7CQkJCVwKLQlzdHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoZGF0YSkgKyAobGVmdCksCVwKLQkJCQkJIChyaWdodCkgLSAobGVmdCkpOwlcCi0JaWYgKHN0ciA9PSBOVUxMKQkJCQkJXAotCQlnb3RvIG9uRXJyb3I7CQkJCQlcCi0JaWYgKGNvdW50IDwgTUFYX1BSRUFMTE9DKSB7CQkJCVwKLQkJUHlMaXN0X1NFVF9JVEVNKGxpc3QsIGNvdW50LCBzdHIpOwkJXAotCX0gZWxzZSB7CQkJCQkJXAotCQlpZiAoUHlMaXN0X0FwcGVuZChsaXN0LCBzdHIpKSB7CQkJXAotCQkJUHlfREVDUkVGKHN0cik7CQkJCVwKLQkJCWdvdG8gb25FcnJvcjsJCQkJXAotCQl9CQkJCQkJXAotCQllbHNlCQkJCQkJXAotCQkJUHlfREVDUkVGKHN0cik7CQkJCVwKLQl9CQkJCQkJCVwKLQljb3VudCsrOyB9CisjZGVmaW5lIFNQTElUX0FERChkYXRhLCBsZWZ0LCByaWdodCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0ciA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChkYXRhKSArIChsZWZ0KSwgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmlnaHQpIC0gKGxlZnQpKTsgICAgICAgICBcCisgICAgaWYgKHN0ciA9PSBOVUxMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBnb3RvIG9uRXJyb3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoY291bnQgPCBNQVhfUFJFQUxMT0MpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFB5TGlzdF9TRVRfSVRFTShsaXN0LCBjb3VudCwgc3RyKTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKFB5TGlzdF9BcHBlbmQobGlzdCwgc3RyKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBQeV9ERUNSRUYoc3RyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZ290byBvbkVycm9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgUHlfREVDUkVGKHN0cik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY291bnQrKzsgfQogCiAvKiBBbHdheXMgZm9yY2UgdGhlIGxpc3QgdG8gdGhlIGV4cGVjdGVkIHNpemUuICovCiAjZGVmaW5lIEZJWF9QUkVBTExPQ19TSVpFKGxpc3QpIFB5X1NJWkUobGlzdCkgPSBjb3VudApAQCAtMTQzMSw4MiArMTQzMSw4MiBAQAogUHlfTE9DQUxfSU5MSU5FKFB5T2JqZWN0ICopCiBzcGxpdF93aGl0ZXNwYWNlKFB5U3RyaW5nT2JqZWN0ICpzZWxmLCBQeV9zc2l6ZV90IGxlbiwgUHlfc3NpemVfdCBtYXhzcGxpdCkKIHsKLQljb25zdCBjaGFyICpzID0gUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpOwotCVB5X3NzaXplX3QgaSwgaiwgY291bnQ9MDsKLQlQeU9iamVjdCAqc3RyOwotCVB5T2JqZWN0ICpsaXN0ID0gUHlMaXN0X05ldyhQUkVBTExPQ19TSVpFKG1heHNwbGl0KSk7CisgICAgY29uc3QgY2hhciAqcyA9IFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKTsKKyAgICBQeV9zc2l6ZV90IGksIGosIGNvdW50PTA7CisgICAgUHlPYmplY3QgKnN0cjsKKyAgICBQeU9iamVjdCAqbGlzdCA9IFB5TGlzdF9OZXcoUFJFQUxMT0NfU0laRShtYXhzcGxpdCkpOwogCi0JaWYgKGxpc3QgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKGxpc3QgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpID0gaiA9IDA7CisgICAgaSA9IGogPSAwOwogCi0Jd2hpbGUgKG1heHNwbGl0LS0gPiAwKSB7Ci0JCVNLSVBfU1BBQ0UocywgaSwgbGVuKTsKLQkJaWYgKGk9PWxlbikgYnJlYWs7Ci0JCWogPSBpOyBpKys7Ci0JCVNLSVBfTk9OU1BBQ0UocywgaSwgbGVuKTsKLQkJaWYgKGogPT0gMCAmJiBpID09IGxlbiAmJiBQeVN0cmluZ19DaGVja0V4YWN0KHNlbGYpKSB7Ci0JCQkvKiBObyB3aGl0ZXNwYWNlIGluIHNlbGYsIHNvIGp1c3QgdXNlIGl0IGFzIGxpc3RbMF0gKi8KLQkJCVB5X0lOQ1JFRihzZWxmKTsKLQkJCVB5TGlzdF9TRVRfSVRFTShsaXN0LCAwLCAoUHlPYmplY3QgKilzZWxmKTsKLQkJCWNvdW50Kys7Ci0JCQlicmVhazsKLQkJfQotCQlTUExJVF9BREQocywgaiwgaSk7Ci0JfQorICAgIHdoaWxlIChtYXhzcGxpdC0tID4gMCkgeworICAgICAgICBTS0lQX1NQQUNFKHMsIGksIGxlbik7CisgICAgICAgIGlmIChpPT1sZW4pIGJyZWFrOworICAgICAgICBqID0gaTsgaSsrOworICAgICAgICBTS0lQX05PTlNQQUNFKHMsIGksIGxlbik7CisgICAgICAgIGlmIChqID09IDAgJiYgaSA9PSBsZW4gJiYgUHlTdHJpbmdfQ2hlY2tFeGFjdChzZWxmKSkgeworICAgICAgICAgICAgLyogTm8gd2hpdGVzcGFjZSBpbiBzZWxmLCBzbyBqdXN0IHVzZSBpdCBhcyBsaXN0WzBdICovCisgICAgICAgICAgICBQeV9JTkNSRUYoc2VsZik7CisgICAgICAgICAgICBQeUxpc3RfU0VUX0lURU0obGlzdCwgMCwgKFB5T2JqZWN0ICopc2VsZik7CisgICAgICAgICAgICBjb3VudCsrOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgU1BMSVRfQUREKHMsIGosIGkpOworICAgIH0KIAotCWlmIChpIDwgbGVuKSB7Ci0JCS8qIE9ubHkgb2NjdXJzIHdoZW4gbWF4c3BsaXQgd2FzIHJlYWNoZWQgKi8KLQkJLyogU2tpcCBhbnkgcmVtYWluaW5nIHdoaXRlc3BhY2UgYW5kIGNvcHkgdG8gZW5kIG9mIHN0cmluZyAqLwotCQlTS0lQX1NQQUNFKHMsIGksIGxlbik7Ci0JCWlmIChpICE9IGxlbikKLQkJCVNQTElUX0FERChzLCBpLCBsZW4pOwotCX0KLQlGSVhfUFJFQUxMT0NfU0laRShsaXN0KTsKLQlyZXR1cm4gbGlzdDsKKyAgICBpZiAoaSA8IGxlbikgeworICAgICAgICAvKiBPbmx5IG9jY3VycyB3aGVuIG1heHNwbGl0IHdhcyByZWFjaGVkICovCisgICAgICAgIC8qIFNraXAgYW55IHJlbWFpbmluZyB3aGl0ZXNwYWNlIGFuZCBjb3B5IHRvIGVuZCBvZiBzdHJpbmcgKi8KKyAgICAgICAgU0tJUF9TUEFDRShzLCBpLCBsZW4pOworICAgICAgICBpZiAoaSAhPSBsZW4pCisgICAgICAgICAgICBTUExJVF9BREQocywgaSwgbGVuKTsKKyAgICB9CisgICAgRklYX1BSRUFMTE9DX1NJWkUobGlzdCk7CisgICAgcmV0dXJuIGxpc3Q7CiAgIG9uRXJyb3I6Ci0JUHlfREVDUkVGKGxpc3QpOwotCXJldHVybiBOVUxMOworICAgIFB5X0RFQ1JFRihsaXN0KTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogUHlfTE9DQUxfSU5MSU5FKFB5T2JqZWN0ICopCiBzcGxpdF9jaGFyKFB5U3RyaW5nT2JqZWN0ICpzZWxmLCBQeV9zc2l6ZV90IGxlbiwgY2hhciBjaCwgUHlfc3NpemVfdCBtYXhjb3VudCkKIHsKLQljb25zdCBjaGFyICpzID0gUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpOwotCXJlZ2lzdGVyIFB5X3NzaXplX3QgaSwgaiwgY291bnQ9MDsKLQlQeU9iamVjdCAqc3RyOwotCVB5T2JqZWN0ICpsaXN0ID0gUHlMaXN0X05ldyhQUkVBTExPQ19TSVpFKG1heGNvdW50KSk7CisgICAgY29uc3QgY2hhciAqcyA9IFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKTsKKyAgICByZWdpc3RlciBQeV9zc2l6ZV90IGksIGosIGNvdW50PTA7CisgICAgUHlPYmplY3QgKnN0cjsKKyAgICBQeU9iamVjdCAqbGlzdCA9IFB5TGlzdF9OZXcoUFJFQUxMT0NfU0laRShtYXhjb3VudCkpOwogCi0JaWYgKGxpc3QgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKGxpc3QgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpID0gaiA9IDA7Ci0Jd2hpbGUgKChqIDwgbGVuKSAmJiAobWF4Y291bnQtLSA+IDApKSB7Ci0JCWZvcig7IGo8bGVuOyBqKyspIHsKLQkJCS8qIEkgZm91bmQgdGhhdCB1c2luZyBtZW1jaHIgbWFrZXMgbm8gZGlmZmVyZW5jZSAqLwotCQkJaWYgKHNbal0gPT0gY2gpIHsKLQkJCQlTUExJVF9BREQocywgaSwgaik7Ci0JCQkJaSA9IGogPSBqICsgMTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQlpZiAoaSA9PSAwICYmIGNvdW50ID09IDAgJiYgUHlTdHJpbmdfQ2hlY2tFeGFjdChzZWxmKSkgewotCQkvKiBjaCBub3QgaW4gc2VsZiwgc28ganVzdCB1c2Ugc2VsZiBhcyBsaXN0WzBdICovCi0JCVB5X0lOQ1JFRihzZWxmKTsKLQkJUHlMaXN0X1NFVF9JVEVNKGxpc3QsIDAsIChQeU9iamVjdCAqKXNlbGYpOwotCQljb3VudCsrOwotCX0KLQllbHNlIGlmIChpIDw9IGxlbikgewotCQlTUExJVF9BREQocywgaSwgbGVuKTsKLQl9Ci0JRklYX1BSRUFMTE9DX1NJWkUobGlzdCk7Ci0JcmV0dXJuIGxpc3Q7CisgICAgaSA9IGogPSAwOworICAgIHdoaWxlICgoaiA8IGxlbikgJiYgKG1heGNvdW50LS0gPiAwKSkgeworICAgICAgICBmb3IoOyBqPGxlbjsgaisrKSB7CisgICAgICAgICAgICAvKiBJIGZvdW5kIHRoYXQgdXNpbmcgbWVtY2hyIG1ha2VzIG5vIGRpZmZlcmVuY2UgKi8KKyAgICAgICAgICAgIGlmIChzW2pdID09IGNoKSB7CisgICAgICAgICAgICAgICAgU1BMSVRfQUREKHMsIGksIGopOworICAgICAgICAgICAgICAgIGkgPSBqID0gaiArIDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGkgPT0gMCAmJiBjb3VudCA9PSAwICYmIFB5U3RyaW5nX0NoZWNrRXhhY3Qoc2VsZikpIHsKKyAgICAgICAgLyogY2ggbm90IGluIHNlbGYsIHNvIGp1c3QgdXNlIHNlbGYgYXMgbGlzdFswXSAqLworICAgICAgICBQeV9JTkNSRUYoc2VsZik7CisgICAgICAgIFB5TGlzdF9TRVRfSVRFTShsaXN0LCAwLCAoUHlPYmplY3QgKilzZWxmKTsKKyAgICAgICAgY291bnQrKzsKKyAgICB9CisgICAgZWxzZSBpZiAoaSA8PSBsZW4pIHsKKyAgICAgICAgU1BMSVRfQUREKHMsIGksIGxlbik7CisgICAgfQorICAgIEZJWF9QUkVBTExPQ19TSVpFKGxpc3QpOworICAgIHJldHVybiBsaXN0OwogCiAgIG9uRXJyb3I6Ci0JUHlfREVDUkVGKGxpc3QpOwotCXJldHVybiBOVUxMOworICAgIFB5X0RFQ1JFRihsaXN0KTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogUHlEb2NfU1RSVkFSKHNwbGl0X19kb2NfXywKQEAgLTE1MjEsNzEgKzE1MjEsNzEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdHJpbmdfc3BsaXQoUHlTdHJpbmdPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5X3NzaXplX3QgbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUoc2VsZiksIG4sIGksIGo7Ci0JUHlfc3NpemVfdCBtYXhzcGxpdCA9IC0xLCBjb3VudD0wOwotCWNvbnN0IGNoYXIgKnMgPSBQeVN0cmluZ19BU19TVFJJTkcoc2VsZiksICpzdWI7Ci0JUHlPYmplY3QgKmxpc3QsICpzdHIsICpzdWJvYmogPSBQeV9Ob25lOworICAgIFB5X3NzaXplX3QgbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUoc2VsZiksIG4sIGksIGo7CisgICAgUHlfc3NpemVfdCBtYXhzcGxpdCA9IC0xLCBjb3VudD0wOworICAgIGNvbnN0IGNoYXIgKnMgPSBQeVN0cmluZ19BU19TVFJJTkcoc2VsZiksICpzdWI7CisgICAgUHlPYmplY3QgKmxpc3QsICpzdHIsICpzdWJvYmogPSBQeV9Ob25lOwogI2lmZGVmIFVTRV9GQVNUCi0JUHlfc3NpemVfdCBwb3M7CisgICAgUHlfc3NpemVfdCBwb3M7CiAjZW5kaWYKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifE9uOnNwbGl0IiwgJnN1Ym9iaiwgJm1heHNwbGl0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKG1heHNwbGl0IDwgMCkKLQkJbWF4c3BsaXQgPSBQWV9TU0laRV9UX01BWDsKLQlpZiAoc3Vib2JqID09IFB5X05vbmUpCi0JCXJldHVybiBzcGxpdF93aGl0ZXNwYWNlKHNlbGYsIGxlbiwgbWF4c3BsaXQpOwotCWlmIChQeVN0cmluZ19DaGVjayhzdWJvYmopKSB7Ci0JCXN1YiA9IFB5U3RyaW5nX0FTX1NUUklORyhzdWJvYmopOwotCQluID0gUHlTdHJpbmdfR0VUX1NJWkUoc3Vib2JqKTsKLQl9CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8T246c3BsaXQiLCAmc3Vib2JqLCAmbWF4c3BsaXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAobWF4c3BsaXQgPCAwKQorICAgICAgICBtYXhzcGxpdCA9IFBZX1NTSVpFX1RfTUFYOworICAgIGlmIChzdWJvYmogPT0gUHlfTm9uZSkKKyAgICAgICAgcmV0dXJuIHNwbGl0X3doaXRlc3BhY2Uoc2VsZiwgbGVuLCBtYXhzcGxpdCk7CisgICAgaWYgKFB5U3RyaW5nX0NoZWNrKHN1Ym9iaikpIHsKKyAgICAgICAgc3ViID0gUHlTdHJpbmdfQVNfU1RSSU5HKHN1Ym9iaik7CisgICAgICAgIG4gPSBQeVN0cmluZ19HRVRfU0laRShzdWJvYmopOworICAgIH0KICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrKHN1Ym9iaikpCi0JCXJldHVybiBQeVVuaWNvZGVfU3BsaXQoKFB5T2JqZWN0ICopc2VsZiwgc3Vib2JqLCBtYXhzcGxpdCk7CisgICAgZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrKHN1Ym9iaikpCisgICAgICAgIHJldHVybiBQeVVuaWNvZGVfU3BsaXQoKFB5T2JqZWN0ICopc2VsZiwgc3Vib2JqLCBtYXhzcGxpdCk7CiAjZW5kaWYKLQllbHNlIGlmIChQeU9iamVjdF9Bc0NoYXJCdWZmZXIoc3Vib2JqLCAmc3ViLCAmbikpCi0JCXJldHVybiBOVUxMOworICAgIGVsc2UgaWYgKFB5T2JqZWN0X0FzQ2hhckJ1ZmZlcihzdWJvYmosICZzdWIsICZuKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAobiA9PSAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiZW1wdHkgc2VwYXJhdG9yIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQllbHNlIGlmIChuID09IDEpCi0JCXJldHVybiBzcGxpdF9jaGFyKHNlbGYsIGxlbiwgc3ViWzBdLCBtYXhzcGxpdCk7CisgICAgaWYgKG4gPT0gMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImVtcHR5IHNlcGFyYXRvciIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZWxzZSBpZiAobiA9PSAxKQorICAgICAgICByZXR1cm4gc3BsaXRfY2hhcihzZWxmLCBsZW4sIHN1YlswXSwgbWF4c3BsaXQpOwogCi0JbGlzdCA9IFB5TGlzdF9OZXcoUFJFQUxMT0NfU0laRShtYXhzcGxpdCkpOwotCWlmIChsaXN0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIGxpc3QgPSBQeUxpc3RfTmV3KFBSRUFMTE9DX1NJWkUobWF4c3BsaXQpKTsKKyAgICBpZiAobGlzdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAogI2lmZGVmIFVTRV9GQVNUCi0JaSA9IGogPSAwOwotCXdoaWxlIChtYXhzcGxpdC0tID4gMCkgewotCQlwb3MgPSBmYXN0c2VhcmNoKHMraSwgbGVuLWksIHN1YiwgbiwgRkFTVF9TRUFSQ0gpOwotCQlpZiAocG9zIDwgMCkKLQkJCWJyZWFrOwotCQlqID0gaStwb3M7Ci0JCVNQTElUX0FERChzLCBpLCBqKTsKLQkJaSA9IGogKyBuOwotCX0KKyAgICBpID0gaiA9IDA7CisgICAgd2hpbGUgKG1heHNwbGl0LS0gPiAwKSB7CisgICAgICAgIHBvcyA9IGZhc3RzZWFyY2gocytpLCBsZW4taSwgc3ViLCBuLCBGQVNUX1NFQVJDSCk7CisgICAgICAgIGlmIChwb3MgPCAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGogPSBpK3BvczsKKyAgICAgICAgU1BMSVRfQUREKHMsIGksIGopOworICAgICAgICBpID0gaiArIG47CisgICAgfQogI2Vsc2UKLQlpID0gaiA9IDA7Ci0Jd2hpbGUgKChqK24gPD0gbGVuKSAmJiAobWF4c3BsaXQtLSA+IDApKSB7Ci0JCWZvciAoOyBqK24gPD0gbGVuOyBqKyspIHsKLQkJCWlmIChQeV9TVFJJTkdfTUFUQ0gocywgaiwgc3ViLCBuKSkgewotCQkJCVNQTElUX0FERChzLCBpLCBqKTsKLQkJCQlpID0gaiA9IGogKyBuOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQorICAgIGkgPSBqID0gMDsKKyAgICB3aGlsZSAoKGorbiA8PSBsZW4pICYmIChtYXhzcGxpdC0tID4gMCkpIHsKKyAgICAgICAgZm9yICg7IGorbiA8PSBsZW47IGorKykgeworICAgICAgICAgICAgaWYgKFB5X1NUUklOR19NQVRDSChzLCBqLCBzdWIsIG4pKSB7CisgICAgICAgICAgICAgICAgU1BMSVRfQUREKHMsIGksIGopOworICAgICAgICAgICAgICAgIGkgPSBqID0gaiArIG47CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAjZW5kaWYKLQlTUExJVF9BREQocywgaSwgbGVuKTsKLQlGSVhfUFJFQUxMT0NfU0laRShsaXN0KTsKLQlyZXR1cm4gbGlzdDsKKyAgICBTUExJVF9BREQocywgaSwgbGVuKTsKKyAgICBGSVhfUFJFQUxMT0NfU0laRShsaXN0KTsKKyAgICByZXR1cm4gbGlzdDsKIAogIG9uRXJyb3I6Ci0JUHlfREVDUkVGKGxpc3QpOwotCXJldHVybiBOVUxMOworICAgIFB5X0RFQ1JFRihsaXN0KTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogUHlEb2NfU1RSVkFSKHBhcnRpdGlvbl9fZG9jX18sCkBAIC0xNTk4LDI1ICsxNTk4LDI1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3RyaW5nX3BhcnRpdGlvbihQeVN0cmluZ09iamVjdCAqc2VsZiwgUHlPYmplY3QgKnNlcF9vYmopCiB7Ci0JY29uc3QgY2hhciAqc2VwOwotCVB5X3NzaXplX3Qgc2VwX2xlbjsKKyAgICBjb25zdCBjaGFyICpzZXA7CisgICAgUHlfc3NpemVfdCBzZXBfbGVuOwogCi0JaWYgKFB5U3RyaW5nX0NoZWNrKHNlcF9vYmopKSB7Ci0JCXNlcCA9IFB5U3RyaW5nX0FTX1NUUklORyhzZXBfb2JqKTsKLQkJc2VwX2xlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHNlcF9vYmopOwotCX0KKyAgICBpZiAoUHlTdHJpbmdfQ2hlY2soc2VwX29iaikpIHsKKyAgICAgICAgc2VwID0gUHlTdHJpbmdfQVNfU1RSSU5HKHNlcF9vYmopOworICAgICAgICBzZXBfbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUoc2VwX29iaik7CisgICAgfQogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQllbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2soc2VwX29iaikpCi0JCXJldHVybiBQeVVuaWNvZGVfUGFydGl0aW9uKChQeU9iamVjdCAqKSBzZWxmLCBzZXBfb2JqKTsKKyAgICBlbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2soc2VwX29iaikpCisgICAgICAgIHJldHVybiBQeVVuaWNvZGVfUGFydGl0aW9uKChQeU9iamVjdCAqKSBzZWxmLCBzZXBfb2JqKTsKICNlbmRpZgotCWVsc2UgaWYgKFB5T2JqZWN0X0FzQ2hhckJ1ZmZlcihzZXBfb2JqLCAmc2VwLCAmc2VwX2xlbikpCi0JCXJldHVybiBOVUxMOworICAgIGVsc2UgaWYgKFB5T2JqZWN0X0FzQ2hhckJ1ZmZlcihzZXBfb2JqLCAmc2VwLCAmc2VwX2xlbikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JcmV0dXJuIHN0cmluZ2xpYl9wYXJ0aXRpb24oCi0JCShQeU9iamVjdCopIHNlbGYsCi0JCVB5U3RyaW5nX0FTX1NUUklORyhzZWxmKSwgUHlTdHJpbmdfR0VUX1NJWkUoc2VsZiksCi0JCXNlcF9vYmosIHNlcCwgc2VwX2xlbgotCQkpOworICAgIHJldHVybiBzdHJpbmdsaWJfcGFydGl0aW9uKAorICAgICAgICAoUHlPYmplY3QqKSBzZWxmLAorICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcoc2VsZiksIFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpLAorICAgICAgICBzZXBfb2JqLCBzZXAsIHNlcF9sZW4KKyAgICAgICAgKTsKIH0KIAogUHlEb2NfU1RSVkFSKHJwYXJ0aXRpb25fX2RvY19fLApAQCAtMTYyOSwxMDkgKzE2MjksMTA5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3RyaW5nX3JwYXJ0aXRpb24oUHlTdHJpbmdPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpzZXBfb2JqKQogewotCWNvbnN0IGNoYXIgKnNlcDsKLQlQeV9zc2l6ZV90IHNlcF9sZW47CisgICAgY29uc3QgY2hhciAqc2VwOworICAgIFB5X3NzaXplX3Qgc2VwX2xlbjsKIAotCWlmIChQeVN0cmluZ19DaGVjayhzZXBfb2JqKSkgewotCQlzZXAgPSBQeVN0cmluZ19BU19TVFJJTkcoc2VwX29iaik7Ci0JCXNlcF9sZW4gPSBQeVN0cmluZ19HRVRfU0laRShzZXBfb2JqKTsKLQl9CisgICAgaWYgKFB5U3RyaW5nX0NoZWNrKHNlcF9vYmopKSB7CisgICAgICAgIHNlcCA9IFB5U3RyaW5nX0FTX1NUUklORyhzZXBfb2JqKTsKKyAgICAgICAgc2VwX2xlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHNlcF9vYmopOworICAgIH0KICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrKHNlcF9vYmopKQotCQlyZXR1cm4gUHlVbmljb2RlX1JQYXJ0aXRpb24oKFB5T2JqZWN0ICopIHNlbGYsIHNlcF9vYmopOworICAgIGVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayhzZXBfb2JqKSkKKyAgICAgICAgcmV0dXJuIFB5VW5pY29kZV9SUGFydGl0aW9uKChQeU9iamVjdCAqKSBzZWxmLCBzZXBfb2JqKTsKICNlbmRpZgotCWVsc2UgaWYgKFB5T2JqZWN0X0FzQ2hhckJ1ZmZlcihzZXBfb2JqLCAmc2VwLCAmc2VwX2xlbikpCi0JCXJldHVybiBOVUxMOworICAgIGVsc2UgaWYgKFB5T2JqZWN0X0FzQ2hhckJ1ZmZlcihzZXBfb2JqLCAmc2VwLCAmc2VwX2xlbikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JcmV0dXJuIHN0cmluZ2xpYl9ycGFydGl0aW9uKAotCQkoUHlPYmplY3QqKSBzZWxmLAotCQlQeVN0cmluZ19BU19TVFJJTkcoc2VsZiksIFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpLAotCQlzZXBfb2JqLCBzZXAsIHNlcF9sZW4KLQkJKTsKKyAgICByZXR1cm4gc3RyaW5nbGliX3JwYXJ0aXRpb24oCisgICAgICAgIChQeU9iamVjdCopIHNlbGYsCisgICAgICAgIFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKSwgUHlTdHJpbmdfR0VUX1NJWkUoc2VsZiksCisgICAgICAgIHNlcF9vYmosIHNlcCwgc2VwX2xlbgorICAgICAgICApOwogfQogCiBQeV9MT0NBTF9JTkxJTkUoUHlPYmplY3QgKikKIHJzcGxpdF93aGl0ZXNwYWNlKFB5U3RyaW5nT2JqZWN0ICpzZWxmLCBQeV9zc2l6ZV90IGxlbiwgUHlfc3NpemVfdCBtYXhzcGxpdCkKIHsKLQljb25zdCBjaGFyICpzID0gUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpOwotCVB5X3NzaXplX3QgaSwgaiwgY291bnQ9MDsKLQlQeU9iamVjdCAqc3RyOwotCVB5T2JqZWN0ICpsaXN0ID0gUHlMaXN0X05ldyhQUkVBTExPQ19TSVpFKG1heHNwbGl0KSk7CisgICAgY29uc3QgY2hhciAqcyA9IFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKTsKKyAgICBQeV9zc2l6ZV90IGksIGosIGNvdW50PTA7CisgICAgUHlPYmplY3QgKnN0cjsKKyAgICBQeU9iamVjdCAqbGlzdCA9IFB5TGlzdF9OZXcoUFJFQUxMT0NfU0laRShtYXhzcGxpdCkpOwogCi0JaWYgKGxpc3QgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKGxpc3QgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpID0gaiA9IGxlbi0xOworICAgIGkgPSBqID0gbGVuLTE7CiAKLQl3aGlsZSAobWF4c3BsaXQtLSA+IDApIHsKLQkJUlNLSVBfU1BBQ0UocywgaSk7Ci0JCWlmIChpPDApIGJyZWFrOwotCQlqID0gaTsgaS0tOwotCQlSU0tJUF9OT05TUEFDRShzLCBpKTsKLQkJaWYgKGogPT0gbGVuLTEgJiYgaSA8IDAgJiYgUHlTdHJpbmdfQ2hlY2tFeGFjdChzZWxmKSkgewotCQkJLyogTm8gd2hpdGVzcGFjZSBpbiBzZWxmLCBzbyBqdXN0IHVzZSBpdCBhcyBsaXN0WzBdICovCi0JCQlQeV9JTkNSRUYoc2VsZik7Ci0JCQlQeUxpc3RfU0VUX0lURU0obGlzdCwgMCwgKFB5T2JqZWN0ICopc2VsZik7Ci0JCQljb3VudCsrOwotCQkJYnJlYWs7Ci0JCX0KLQkJU1BMSVRfQUREKHMsIGkgKyAxLCBqICsgMSk7Ci0JfQotCWlmIChpID49IDApIHsKLQkJLyogT25seSBvY2N1cnMgd2hlbiBtYXhzcGxpdCB3YXMgcmVhY2hlZCAqLwotCQkvKiBTa2lwIGFueSByZW1haW5pbmcgd2hpdGVzcGFjZSBhbmQgY29weSB0byBiZWdpbm5pbmcgb2Ygc3RyaW5nICovCi0JCVJTS0lQX1NQQUNFKHMsIGkpOwotCQlpZiAoaSA+PSAwKQotCQkJU1BMSVRfQUREKHMsIDAsIGkgKyAxKTsKKyAgICB3aGlsZSAobWF4c3BsaXQtLSA+IDApIHsKKyAgICAgICAgUlNLSVBfU1BBQ0UocywgaSk7CisgICAgICAgIGlmIChpPDApIGJyZWFrOworICAgICAgICBqID0gaTsgaS0tOworICAgICAgICBSU0tJUF9OT05TUEFDRShzLCBpKTsKKyAgICAgICAgaWYgKGogPT0gbGVuLTEgJiYgaSA8IDAgJiYgUHlTdHJpbmdfQ2hlY2tFeGFjdChzZWxmKSkgeworICAgICAgICAgICAgLyogTm8gd2hpdGVzcGFjZSBpbiBzZWxmLCBzbyBqdXN0IHVzZSBpdCBhcyBsaXN0WzBdICovCisgICAgICAgICAgICBQeV9JTkNSRUYoc2VsZik7CisgICAgICAgICAgICBQeUxpc3RfU0VUX0lURU0obGlzdCwgMCwgKFB5T2JqZWN0ICopc2VsZik7CisgICAgICAgICAgICBjb3VudCsrOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgU1BMSVRfQUREKHMsIGkgKyAxLCBqICsgMSk7CisgICAgfQorICAgIGlmIChpID49IDApIHsKKyAgICAgICAgLyogT25seSBvY2N1cnMgd2hlbiBtYXhzcGxpdCB3YXMgcmVhY2hlZCAqLworICAgICAgICAvKiBTa2lwIGFueSByZW1haW5pbmcgd2hpdGVzcGFjZSBhbmQgY29weSB0byBiZWdpbm5pbmcgb2Ygc3RyaW5nICovCisgICAgICAgIFJTS0lQX1NQQUNFKHMsIGkpOworICAgICAgICBpZiAoaSA+PSAwKQorICAgICAgICAgICAgU1BMSVRfQUREKHMsIDAsIGkgKyAxKTsKIAotCX0KLQlGSVhfUFJFQUxMT0NfU0laRShsaXN0KTsKLQlpZiAoUHlMaXN0X1JldmVyc2UobGlzdCkgPCAwKQotCQlnb3RvIG9uRXJyb3I7Ci0JcmV0dXJuIGxpc3Q7CisgICAgfQorICAgIEZJWF9QUkVBTExPQ19TSVpFKGxpc3QpOworICAgIGlmIChQeUxpc3RfUmV2ZXJzZShsaXN0KSA8IDApCisgICAgICAgIGdvdG8gb25FcnJvcjsKKyAgICByZXR1cm4gbGlzdDsKICAgb25FcnJvcjoKLQlQeV9ERUNSRUYobGlzdCk7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlfREVDUkVGKGxpc3QpOworICAgIHJldHVybiBOVUxMOwogfQogCiBQeV9MT0NBTF9JTkxJTkUoUHlPYmplY3QgKikKIHJzcGxpdF9jaGFyKFB5U3RyaW5nT2JqZWN0ICpzZWxmLCBQeV9zc2l6ZV90IGxlbiwgY2hhciBjaCwgUHlfc3NpemVfdCBtYXhjb3VudCkKIHsKLQljb25zdCBjaGFyICpzID0gUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpOwotCXJlZ2lzdGVyIFB5X3NzaXplX3QgaSwgaiwgY291bnQ9MDsKLQlQeU9iamVjdCAqc3RyOwotCVB5T2JqZWN0ICpsaXN0ID0gUHlMaXN0X05ldyhQUkVBTExPQ19TSVpFKG1heGNvdW50KSk7CisgICAgY29uc3QgY2hhciAqcyA9IFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKTsKKyAgICByZWdpc3RlciBQeV9zc2l6ZV90IGksIGosIGNvdW50PTA7CisgICAgUHlPYmplY3QgKnN0cjsKKyAgICBQeU9iamVjdCAqbGlzdCA9IFB5TGlzdF9OZXcoUFJFQUxMT0NfU0laRShtYXhjb3VudCkpOwogCi0JaWYgKGxpc3QgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKGxpc3QgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpID0gaiA9IGxlbiAtIDE7Ci0Jd2hpbGUgKChpID49IDApICYmIChtYXhjb3VudC0tID4gMCkpIHsKLQkJZm9yICg7IGkgPj0gMDsgaS0tKSB7Ci0JCQlpZiAoc1tpXSA9PSBjaCkgewotCQkJCVNQTElUX0FERChzLCBpICsgMSwgaiArIDEpOwotCQkJCWogPSBpID0gaSAtIDE7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0JaWYgKGkgPCAwICYmIGNvdW50ID09IDAgJiYgUHlTdHJpbmdfQ2hlY2tFeGFjdChzZWxmKSkgewotCQkvKiBjaCBub3QgaW4gc2VsZiwgc28ganVzdCB1c2Ugc2VsZiBhcyBsaXN0WzBdICovCi0JCVB5X0lOQ1JFRihzZWxmKTsKLQkJUHlMaXN0X1NFVF9JVEVNKGxpc3QsIDAsIChQeU9iamVjdCAqKXNlbGYpOwotCQljb3VudCsrOwotCX0KLQllbHNlIGlmIChqID49IC0xKSB7Ci0JCVNQTElUX0FERChzLCAwLCBqICsgMSk7Ci0JfQotCUZJWF9QUkVBTExPQ19TSVpFKGxpc3QpOwotCWlmIChQeUxpc3RfUmV2ZXJzZShsaXN0KSA8IDApCi0JCWdvdG8gb25FcnJvcjsKLQlyZXR1cm4gbGlzdDsKKyAgICBpID0gaiA9IGxlbiAtIDE7CisgICAgd2hpbGUgKChpID49IDApICYmIChtYXhjb3VudC0tID4gMCkpIHsKKyAgICAgICAgZm9yICg7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICBpZiAoc1tpXSA9PSBjaCkgeworICAgICAgICAgICAgICAgIFNQTElUX0FERChzLCBpICsgMSwgaiArIDEpOworICAgICAgICAgICAgICAgIGogPSBpID0gaSAtIDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGkgPCAwICYmIGNvdW50ID09IDAgJiYgUHlTdHJpbmdfQ2hlY2tFeGFjdChzZWxmKSkgeworICAgICAgICAvKiBjaCBub3QgaW4gc2VsZiwgc28ganVzdCB1c2Ugc2VsZiBhcyBsaXN0WzBdICovCisgICAgICAgIFB5X0lOQ1JFRihzZWxmKTsKKyAgICAgICAgUHlMaXN0X1NFVF9JVEVNKGxpc3QsIDAsIChQeU9iamVjdCAqKXNlbGYpOworICAgICAgICBjb3VudCsrOworICAgIH0KKyAgICBlbHNlIGlmIChqID49IC0xKSB7CisgICAgICAgIFNQTElUX0FERChzLCAwLCBqICsgMSk7CisgICAgfQorICAgIEZJWF9QUkVBTExPQ19TSVpFKGxpc3QpOworICAgIGlmIChQeUxpc3RfUmV2ZXJzZShsaXN0KSA8IDApCisgICAgICAgIGdvdG8gb25FcnJvcjsKKyAgICByZXR1cm4gbGlzdDsKIAogIG9uRXJyb3I6Ci0JUHlfREVDUkVGKGxpc3QpOwotCXJldHVybiBOVUxMOworICAgIFB5X0RFQ1JFRihsaXN0KTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogUHlEb2NfU1RSVkFSKHJzcGxpdF9fZG9jX18sCkBAIC0xNzQ2LDYyICsxNzQ2LDYyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3RyaW5nX3JzcGxpdChQeVN0cmluZ09iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlfc3NpemVfdCBsZW4gPSBQeVN0cmluZ19HRVRfU0laRShzZWxmKSwgbiwgaSwgajsKLQlQeV9zc2l6ZV90IG1heHNwbGl0ID0gLTEsIGNvdW50PTA7Ci0JY29uc3QgY2hhciAqcywgKnN1YjsKLQlQeU9iamVjdCAqbGlzdCwgKnN0ciwgKnN1Ym9iaiA9IFB5X05vbmU7CisgICAgUHlfc3NpemVfdCBsZW4gPSBQeVN0cmluZ19HRVRfU0laRShzZWxmKSwgbiwgaSwgajsKKyAgICBQeV9zc2l6ZV90IG1heHNwbGl0ID0gLTEsIGNvdW50PTA7CisgICAgY29uc3QgY2hhciAqcywgKnN1YjsKKyAgICBQeU9iamVjdCAqbGlzdCwgKnN0ciwgKnN1Ym9iaiA9IFB5X05vbmU7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxPbjpyc3BsaXQiLCAmc3Vib2JqLCAmbWF4c3BsaXQpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAobWF4c3BsaXQgPCAwKQotCQltYXhzcGxpdCA9IFBZX1NTSVpFX1RfTUFYOwotCWlmIChzdWJvYmogPT0gUHlfTm9uZSkKLQkJcmV0dXJuIHJzcGxpdF93aGl0ZXNwYWNlKHNlbGYsIGxlbiwgbWF4c3BsaXQpOwotCWlmIChQeVN0cmluZ19DaGVjayhzdWJvYmopKSB7Ci0JCXN1YiA9IFB5U3RyaW5nX0FTX1NUUklORyhzdWJvYmopOwotCQluID0gUHlTdHJpbmdfR0VUX1NJWkUoc3Vib2JqKTsKLQl9CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8T246cnNwbGl0IiwgJnN1Ym9iaiwgJm1heHNwbGl0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKG1heHNwbGl0IDwgMCkKKyAgICAgICAgbWF4c3BsaXQgPSBQWV9TU0laRV9UX01BWDsKKyAgICBpZiAoc3Vib2JqID09IFB5X05vbmUpCisgICAgICAgIHJldHVybiByc3BsaXRfd2hpdGVzcGFjZShzZWxmLCBsZW4sIG1heHNwbGl0KTsKKyAgICBpZiAoUHlTdHJpbmdfQ2hlY2soc3Vib2JqKSkgeworICAgICAgICBzdWIgPSBQeVN0cmluZ19BU19TVFJJTkcoc3Vib2JqKTsKKyAgICAgICAgbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHN1Ym9iaik7CisgICAgfQogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQllbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2soc3Vib2JqKSkKLQkJcmV0dXJuIFB5VW5pY29kZV9SU3BsaXQoKFB5T2JqZWN0ICopc2VsZiwgc3Vib2JqLCBtYXhzcGxpdCk7CisgICAgZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrKHN1Ym9iaikpCisgICAgICAgIHJldHVybiBQeVVuaWNvZGVfUlNwbGl0KChQeU9iamVjdCAqKXNlbGYsIHN1Ym9iaiwgbWF4c3BsaXQpOwogI2VuZGlmCi0JZWxzZSBpZiAoUHlPYmplY3RfQXNDaGFyQnVmZmVyKHN1Ym9iaiwgJnN1YiwgJm4pKQotCQlyZXR1cm4gTlVMTDsKKyAgICBlbHNlIGlmIChQeU9iamVjdF9Bc0NoYXJCdWZmZXIoc3Vib2JqLCAmc3ViLCAmbikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKG4gPT0gMCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImVtcHR5IHNlcGFyYXRvciIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZWxzZSBpZiAobiA9PSAxKQotCQlyZXR1cm4gcnNwbGl0X2NoYXIoc2VsZiwgbGVuLCBzdWJbMF0sIG1heHNwbGl0KTsKKyAgICBpZiAobiA9PSAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiZW1wdHkgc2VwYXJhdG9yIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBlbHNlIGlmIChuID09IDEpCisgICAgICAgIHJldHVybiByc3BsaXRfY2hhcihzZWxmLCBsZW4sIHN1YlswXSwgbWF4c3BsaXQpOwogCi0JbGlzdCA9IFB5TGlzdF9OZXcoUFJFQUxMT0NfU0laRShtYXhzcGxpdCkpOwotCWlmIChsaXN0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIGxpc3QgPSBQeUxpc3RfTmV3KFBSRUFMTE9DX1NJWkUobWF4c3BsaXQpKTsKKyAgICBpZiAobGlzdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWogPSBsZW47Ci0JaSA9IGogLSBuOworICAgIGogPSBsZW47CisgICAgaSA9IGogLSBuOwogCi0JcyA9IFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKTsKLQl3aGlsZSAoIChpID49IDApICYmIChtYXhzcGxpdC0tID4gMCkgKSB7Ci0JCWZvciAoOyBpPj0wOyBpLS0pIHsKLQkJCWlmIChQeV9TVFJJTkdfTUFUQ0gocywgaSwgc3ViLCBuKSkgewotCQkJCVNQTElUX0FERChzLCBpICsgbiwgaik7Ci0JCQkJaiA9IGk7Ci0JCQkJaSAtPSBuOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCVNQTElUX0FERChzLCAwLCBqKTsKLQlGSVhfUFJFQUxMT0NfU0laRShsaXN0KTsKLQlpZiAoUHlMaXN0X1JldmVyc2UobGlzdCkgPCAwKQotCQlnb3RvIG9uRXJyb3I7Ci0JcmV0dXJuIGxpc3Q7CisgICAgcyA9IFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKTsKKyAgICB3aGlsZSAoIChpID49IDApICYmIChtYXhzcGxpdC0tID4gMCkgKSB7CisgICAgICAgIGZvciAoOyBpPj0wOyBpLS0pIHsKKyAgICAgICAgICAgIGlmIChQeV9TVFJJTkdfTUFUQ0gocywgaSwgc3ViLCBuKSkgeworICAgICAgICAgICAgICAgIFNQTElUX0FERChzLCBpICsgbiwgaik7CisgICAgICAgICAgICAgICAgaiA9IGk7CisgICAgICAgICAgICAgICAgaSAtPSBuOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIFNQTElUX0FERChzLCAwLCBqKTsKKyAgICBGSVhfUFJFQUxMT0NfU0laRShsaXN0KTsKKyAgICBpZiAoUHlMaXN0X1JldmVyc2UobGlzdCkgPCAwKQorICAgICAgICBnb3RvIG9uRXJyb3I7CisgICAgcmV0dXJuIGxpc3Q7CiAKIG9uRXJyb3I6Ci0JUHlfREVDUkVGKGxpc3QpOwotCXJldHVybiBOVUxMOworICAgIFB5X0RFQ1JFRihsaXN0KTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogCkBAIC0xODE0LDE2NyArMTgxNCwxNjcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdHJpbmdfam9pbihQeVN0cmluZ09iamVjdCAqc2VsZiwgUHlPYmplY3QgKm9yaWcpCiB7Ci0JY2hhciAqc2VwID0gUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpOwotCWNvbnN0IFB5X3NzaXplX3Qgc2VwbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUoc2VsZik7Ci0JUHlPYmplY3QgKnJlcyA9IE5VTEw7Ci0JY2hhciAqcDsKLQlQeV9zc2l6ZV90IHNlcWxlbiA9IDA7Ci0Jc2l6ZV90IHN6ID0gMDsKLQlQeV9zc2l6ZV90IGk7Ci0JUHlPYmplY3QgKnNlcSwgKml0ZW07CisgICAgY2hhciAqc2VwID0gUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpOworICAgIGNvbnN0IFB5X3NzaXplX3Qgc2VwbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUoc2VsZik7CisgICAgUHlPYmplY3QgKnJlcyA9IE5VTEw7CisgICAgY2hhciAqcDsKKyAgICBQeV9zc2l6ZV90IHNlcWxlbiA9IDA7CisgICAgc2l6ZV90IHN6ID0gMDsKKyAgICBQeV9zc2l6ZV90IGk7CisgICAgUHlPYmplY3QgKnNlcSwgKml0ZW07CiAKLQlzZXEgPSBQeVNlcXVlbmNlX0Zhc3Qob3JpZywgIiIpOwotCWlmIChzZXEgPT0gTlVMTCkgewotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgc2VxID0gUHlTZXF1ZW5jZV9GYXN0KG9yaWcsICIiKTsKKyAgICBpZiAoc2VxID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0Jc2VxbGVuID0gUHlTZXF1ZW5jZV9TaXplKHNlcSk7Ci0JaWYgKHNlcWxlbiA9PSAwKSB7Ci0JCVB5X0RFQ1JFRihzZXEpOwotCQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZygiIik7Ci0JfQotCWlmIChzZXFsZW4gPT0gMSkgewotCQlpdGVtID0gUHlTZXF1ZW5jZV9GYXN0X0dFVF9JVEVNKHNlcSwgMCk7Ci0JCWlmIChQeVN0cmluZ19DaGVja0V4YWN0KGl0ZW0pIHx8IFB5VW5pY29kZV9DaGVja0V4YWN0KGl0ZW0pKSB7Ci0JCQlQeV9JTkNSRUYoaXRlbSk7Ci0JCQlQeV9ERUNSRUYoc2VxKTsKLQkJCXJldHVybiBpdGVtOwotCQl9Ci0JfQorICAgIHNlcWxlbiA9IFB5U2VxdWVuY2VfU2l6ZShzZXEpOworICAgIGlmIChzZXFsZW4gPT0gMCkgeworICAgICAgICBQeV9ERUNSRUYoc2VxKTsKKyAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoIiIpOworICAgIH0KKyAgICBpZiAoc2VxbGVuID09IDEpIHsKKyAgICAgICAgaXRlbSA9IFB5U2VxdWVuY2VfRmFzdF9HRVRfSVRFTShzZXEsIDApOworICAgICAgICBpZiAoUHlTdHJpbmdfQ2hlY2tFeGFjdChpdGVtKSB8fCBQeVVuaWNvZGVfQ2hlY2tFeGFjdChpdGVtKSkgeworICAgICAgICAgICAgUHlfSU5DUkVGKGl0ZW0pOworICAgICAgICAgICAgUHlfREVDUkVGKHNlcSk7CisgICAgICAgICAgICByZXR1cm4gaXRlbTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qIFRoZXJlIGFyZSBhdCBsZWFzdCB0d28gdGhpbmdzIHRvIGpvaW4sIG9yIGVsc2Ugd2UgaGF2ZSBhIHN1YmNsYXNzCi0JICogb2YgdGhlIGJ1aWx0aW4gdHlwZXMgaW4gdGhlIHNlcXVlbmNlLgotCSAqIERvIGEgcHJlLXBhc3MgdG8gZmlndXJlIG91dCB0aGUgdG90YWwgYW1vdW50IG9mIHNwYWNlIHdlJ2xsCi0JICogbmVlZCAoc3opLCBzZWUgd2hldGhlciBhbnkgYXJndW1lbnQgaXMgYWJzdXJkLCBhbmQgZGVmZXIgdG8KLQkgKiB0aGUgVW5pY29kZSBqb2luIGlmIGFwcHJvcHJpYXRlLgotCSAqLwotCWZvciAoaSA9IDA7IGkgPCBzZXFsZW47IGkrKykgewotCQljb25zdCBzaXplX3Qgb2xkX3N6ID0gc3o7Ci0JCWl0ZW0gPSBQeVNlcXVlbmNlX0Zhc3RfR0VUX0lURU0oc2VxLCBpKTsKLQkJaWYgKCFQeVN0cmluZ19DaGVjayhpdGVtKSl7CisgICAgLyogVGhlcmUgYXJlIGF0IGxlYXN0IHR3byB0aGluZ3MgdG8gam9pbiwgb3IgZWxzZSB3ZSBoYXZlIGEgc3ViY2xhc3MKKyAgICAgKiBvZiB0aGUgYnVpbHRpbiB0eXBlcyBpbiB0aGUgc2VxdWVuY2UuCisgICAgICogRG8gYSBwcmUtcGFzcyB0byBmaWd1cmUgb3V0IHRoZSB0b3RhbCBhbW91bnQgb2Ygc3BhY2Ugd2UnbGwKKyAgICAgKiBuZWVkIChzeiksIHNlZSB3aGV0aGVyIGFueSBhcmd1bWVudCBpcyBhYnN1cmQsIGFuZCBkZWZlciB0bworICAgICAqIHRoZSBVbmljb2RlIGpvaW4gaWYgYXBwcm9wcmlhdGUuCisgICAgICovCisgICAgZm9yIChpID0gMDsgaSA8IHNlcWxlbjsgaSsrKSB7CisgICAgICAgIGNvbnN0IHNpemVfdCBvbGRfc3ogPSBzejsKKyAgICAgICAgaXRlbSA9IFB5U2VxdWVuY2VfRmFzdF9HRVRfSVRFTShzZXEsIGkpOworICAgICAgICBpZiAoIVB5U3RyaW5nX0NoZWNrKGl0ZW0pKXsKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JCQlpZiAoUHlVbmljb2RlX0NoZWNrKGl0ZW0pKSB7Ci0JCQkJLyogRGVmZXIgdG8gVW5pY29kZSBqb2luLgotCQkJCSAqIENBVVRJT046ICBUaGVyZSdzIG5vIGd1cmFudGVlIHRoYXQgdGhlCi0JCQkJICogb3JpZ2luYWwgc2VxdWVuY2UgY2FuIGJlIGl0ZXJhdGVkIG92ZXIKLQkJCQkgKiBhZ2Fpbiwgc28gd2UgbXVzdCBwYXNzIHNlcSBoZXJlLgotCQkJCSAqLwotCQkJCVB5T2JqZWN0ICpyZXN1bHQ7Ci0JCQkJcmVzdWx0ID0gUHlVbmljb2RlX0pvaW4oKFB5T2JqZWN0ICopc2VsZiwgc2VxKTsKLQkJCQlQeV9ERUNSRUYoc2VxKTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQorICAgICAgICAgICAgaWYgKFB5VW5pY29kZV9DaGVjayhpdGVtKSkgeworICAgICAgICAgICAgICAgIC8qIERlZmVyIHRvIFVuaWNvZGUgam9pbi4KKyAgICAgICAgICAgICAgICAgKiBDQVVUSU9OOiAgVGhlcmUncyBubyBndXJhbnRlZSB0aGF0IHRoZQorICAgICAgICAgICAgICAgICAqIG9yaWdpbmFsIHNlcXVlbmNlIGNhbiBiZSBpdGVyYXRlZCBvdmVyCisgICAgICAgICAgICAgICAgICogYWdhaW4sIHNvIHdlIG11c3QgcGFzcyBzZXEgaGVyZS4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBQeU9iamVjdCAqcmVzdWx0OworICAgICAgICAgICAgICAgIHJlc3VsdCA9IFB5VW5pY29kZV9Kb2luKChQeU9iamVjdCAqKXNlbGYsIHNlcSk7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHNlcSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIH0KICNlbmRpZgotCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCQkgICAgICJzZXF1ZW5jZSBpdGVtICV6ZDogZXhwZWN0ZWQgc3RyaW5nLCIKLQkJCQkgICAgICIgJS44MHMgZm91bmQiLAotCQkJCSAgICAgaSwgUHlfVFlQRShpdGVtKS0+dHBfbmFtZSk7Ci0JCQlQeV9ERUNSRUYoc2VxKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCXN6ICs9IFB5U3RyaW5nX0dFVF9TSVpFKGl0ZW0pOwotCQlpZiAoaSAhPSAwKQotCQkJc3ogKz0gc2VwbGVuOwotCQlpZiAoc3ogPCBvbGRfc3ogfHwgc3ogPiBQWV9TU0laRV9UX01BWCkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0JCQkJImpvaW4oKSByZXN1bHQgaXMgdG9vIGxvbmcgZm9yIGEgUHl0aG9uIHN0cmluZyIpOwotCQkJUHlfREVDUkVGKHNlcSk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgInNlcXVlbmNlIGl0ZW0gJXpkOiBleHBlY3RlZCBzdHJpbmcsIgorICAgICAgICAgICAgICAgICAgICAgICAgICIgJS44MHMgZm91bmQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGksIFB5X1RZUEUoaXRlbSktPnRwX25hbWUpOworICAgICAgICAgICAgUHlfREVDUkVGKHNlcSk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBzeiArPSBQeVN0cmluZ19HRVRfU0laRShpdGVtKTsKKyAgICAgICAgaWYgKGkgIT0gMCkKKyAgICAgICAgICAgIHN6ICs9IHNlcGxlbjsKKyAgICAgICAgaWYgKHN6IDwgb2xkX3N6IHx8IHN6ID4gUFlfU1NJWkVfVF9NQVgpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICJqb2luKCkgcmVzdWx0IGlzIHRvbyBsb25nIGZvciBhIFB5dGhvbiBzdHJpbmciKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihzZXEpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKiBBbGxvY2F0ZSByZXN1bHQgc3BhY2UuICovCi0JcmVzID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIqKU5VTEwsIHN6KTsKLQlpZiAocmVzID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKHNlcSk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICAvKiBBbGxvY2F0ZSByZXN1bHQgc3BhY2UuICovCisgICAgcmVzID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIqKU5VTEwsIHN6KTsKKyAgICBpZiAocmVzID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKHNlcSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCS8qIENhdGVuYXRlIGV2ZXJ5dGhpbmcuICovCi0JcCA9IFB5U3RyaW5nX0FTX1NUUklORyhyZXMpOwotCWZvciAoaSA9IDA7IGkgPCBzZXFsZW47ICsraSkgewotCQlzaXplX3QgbjsKLQkJaXRlbSA9IFB5U2VxdWVuY2VfRmFzdF9HRVRfSVRFTShzZXEsIGkpOwotCQluID0gUHlTdHJpbmdfR0VUX1NJWkUoaXRlbSk7Ci0JCVB5X01FTUNQWShwLCBQeVN0cmluZ19BU19TVFJJTkcoaXRlbSksIG4pOwotCQlwICs9IG47Ci0JCWlmIChpIDwgc2VxbGVuIC0gMSkgewotCQkJUHlfTUVNQ1BZKHAsIHNlcCwgc2VwbGVuKTsKLQkJCXAgKz0gc2VwbGVuOwotCQl9Ci0JfQorICAgIC8qIENhdGVuYXRlIGV2ZXJ5dGhpbmcuICovCisgICAgcCA9IFB5U3RyaW5nX0FTX1NUUklORyhyZXMpOworICAgIGZvciAoaSA9IDA7IGkgPCBzZXFsZW47ICsraSkgeworICAgICAgICBzaXplX3QgbjsKKyAgICAgICAgaXRlbSA9IFB5U2VxdWVuY2VfRmFzdF9HRVRfSVRFTShzZXEsIGkpOworICAgICAgICBuID0gUHlTdHJpbmdfR0VUX1NJWkUoaXRlbSk7CisgICAgICAgIFB5X01FTUNQWShwLCBQeVN0cmluZ19BU19TVFJJTkcoaXRlbSksIG4pOworICAgICAgICBwICs9IG47CisgICAgICAgIGlmIChpIDwgc2VxbGVuIC0gMSkgeworICAgICAgICAgICAgUHlfTUVNQ1BZKHAsIHNlcCwgc2VwbGVuKTsKKyAgICAgICAgICAgIHAgKz0gc2VwbGVuOworICAgICAgICB9CisgICAgfQogCi0JUHlfREVDUkVGKHNlcSk7Ci0JcmV0dXJuIHJlczsKKyAgICBQeV9ERUNSRUYoc2VxKTsKKyAgICByZXR1cm4gcmVzOwogfQogCiBQeU9iamVjdCAqCiBfUHlTdHJpbmdfSm9pbihQeU9iamVjdCAqc2VwLCBQeU9iamVjdCAqeCkKIHsKLQlhc3NlcnQoc2VwICE9IE5VTEwgJiYgUHlTdHJpbmdfQ2hlY2soc2VwKSk7Ci0JYXNzZXJ0KHggIT0gTlVMTCk7Ci0JcmV0dXJuIHN0cmluZ19qb2luKChQeVN0cmluZ09iamVjdCAqKXNlcCwgeCk7CisgICAgYXNzZXJ0KHNlcCAhPSBOVUxMICYmIFB5U3RyaW5nX0NoZWNrKHNlcCkpOworICAgIGFzc2VydCh4ICE9IE5VTEwpOworICAgIHJldHVybiBzdHJpbmdfam9pbigoUHlTdHJpbmdPYmplY3QgKilzZXAsIHgpOwogfQogCiBQeV9MT0NBTF9JTkxJTkUodm9pZCkKIHN0cmluZ19hZGp1c3RfaW5kaWNlcyhQeV9zc2l6ZV90ICpzdGFydCwgUHlfc3NpemVfdCAqZW5kLCBQeV9zc2l6ZV90IGxlbikKIHsKLQlpZiAoKmVuZCA+IGxlbikKLQkJKmVuZCA9IGxlbjsKLQllbHNlIGlmICgqZW5kIDwgMCkKLQkJKmVuZCArPSBsZW47Ci0JaWYgKCplbmQgPCAwKQotCQkqZW5kID0gMDsKLQlpZiAoKnN0YXJ0IDwgMCkKLQkJKnN0YXJ0ICs9IGxlbjsKLQlpZiAoKnN0YXJ0IDwgMCkKLQkJKnN0YXJ0ID0gMDsKKyAgICBpZiAoKmVuZCA+IGxlbikKKyAgICAgICAgKmVuZCA9IGxlbjsKKyAgICBlbHNlIGlmICgqZW5kIDwgMCkKKyAgICAgICAgKmVuZCArPSBsZW47CisgICAgaWYgKCplbmQgPCAwKQorICAgICAgICAqZW5kID0gMDsKKyAgICBpZiAoKnN0YXJ0IDwgMCkKKyAgICAgICAgKnN0YXJ0ICs9IGxlbjsKKyAgICBpZiAoKnN0YXJ0IDwgMCkKKyAgICAgICAgKnN0YXJ0ID0gMDsKIH0KIAogUHlfTE9DQUxfSU5MSU5FKFB5X3NzaXplX3QpCiBzdHJpbmdfZmluZF9pbnRlcm5hbChQeVN0cmluZ09iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIGludCBkaXIpCiB7Ci0JUHlPYmplY3QgKnN1Ym9iajsKLQljb25zdCBjaGFyICpzdWI7Ci0JUHlfc3NpemVfdCBzdWJfbGVuOwotCVB5X3NzaXplX3Qgc3RhcnQ9MCwgZW5kPVBZX1NTSVpFX1RfTUFYOwotCVB5T2JqZWN0ICpvYmpfc3RhcnQ9UHlfTm9uZSwgKm9ial9lbmQ9UHlfTm9uZTsKKyAgICBQeU9iamVjdCAqc3Vib2JqOworICAgIGNvbnN0IGNoYXIgKnN1YjsKKyAgICBQeV9zc2l6ZV90IHN1Yl9sZW47CisgICAgUHlfc3NpemVfdCBzdGFydD0wLCBlbmQ9UFlfU1NJWkVfVF9NQVg7CisgICAgUHlPYmplY3QgKm9ial9zdGFydD1QeV9Ob25lLCAqb2JqX2VuZD1QeV9Ob25lOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfE9POmZpbmQvcmZpbmQvaW5kZXgvcmluZGV4IiwgJnN1Ym9iaiwKLQkJJm9ial9zdGFydCwgJm9ial9lbmQpKQotCQlyZXR1cm4gLTI7Ci0JLyogVG8gc3VwcG9ydCBOb25lIGluICJzdGFydCIgYW5kICJlbmQiIGFyZ3VtZW50cywgbWVhbmluZwotCSAgIHRoZSBzYW1lIGFzIGlmIHRoZXkgd2VyZSBub3QgcGFzc2VkLgotCSovCi0JaWYgKG9ial9zdGFydCAhPSBQeV9Ob25lKQotCQlpZiAoIV9QeUV2YWxfU2xpY2VJbmRleChvYmpfc3RhcnQsICZzdGFydCkpCi0JICAgICAgICByZXR1cm4gLTI7Ci0JaWYgKG9ial9lbmQgIT0gUHlfTm9uZSkKLQkJaWYgKCFfUHlFdmFsX1NsaWNlSW5kZXgob2JqX2VuZCwgJmVuZCkpCi0JICAgICAgICByZXR1cm4gLTI7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfE9POmZpbmQvcmZpbmQvaW5kZXgvcmluZGV4IiwgJnN1Ym9iaiwKKyAgICAgICAgJm9ial9zdGFydCwgJm9ial9lbmQpKQorICAgICAgICByZXR1cm4gLTI7CisgICAgLyogVG8gc3VwcG9ydCBOb25lIGluICJzdGFydCIgYW5kICJlbmQiIGFyZ3VtZW50cywgbWVhbmluZworICAgICAgIHRoZSBzYW1lIGFzIGlmIHRoZXkgd2VyZSBub3QgcGFzc2VkLgorICAgICovCisgICAgaWYgKG9ial9zdGFydCAhPSBQeV9Ob25lKQorICAgICAgICBpZiAoIV9QeUV2YWxfU2xpY2VJbmRleChvYmpfc3RhcnQsICZzdGFydCkpCisgICAgICAgIHJldHVybiAtMjsKKyAgICBpZiAob2JqX2VuZCAhPSBQeV9Ob25lKQorICAgICAgICBpZiAoIV9QeUV2YWxfU2xpY2VJbmRleChvYmpfZW5kLCAmZW5kKSkKKyAgICAgICAgcmV0dXJuIC0yOwogCi0JaWYgKFB5U3RyaW5nX0NoZWNrKHN1Ym9iaikpIHsKLQkJc3ViID0gUHlTdHJpbmdfQVNfU1RSSU5HKHN1Ym9iaik7Ci0JCXN1Yl9sZW4gPSBQeVN0cmluZ19HRVRfU0laRShzdWJvYmopOwotCX0KKyAgICBpZiAoUHlTdHJpbmdfQ2hlY2soc3Vib2JqKSkgeworICAgICAgICBzdWIgPSBQeVN0cmluZ19BU19TVFJJTkcoc3Vib2JqKTsKKyAgICAgICAgc3ViX2xlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHN1Ym9iaik7CisgICAgfQogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQllbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2soc3Vib2JqKSkKLQkJcmV0dXJuIFB5VW5pY29kZV9GaW5kKAotCQkJKFB5T2JqZWN0ICopc2VsZiwgc3Vib2JqLCBzdGFydCwgZW5kLCBkaXIpOworICAgIGVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayhzdWJvYmopKQorICAgICAgICByZXR1cm4gUHlVbmljb2RlX0ZpbmQoCisgICAgICAgICAgICAoUHlPYmplY3QgKilzZWxmLCBzdWJvYmosIHN0YXJ0LCBlbmQsIGRpcik7CiAjZW5kaWYKLQllbHNlIGlmIChQeU9iamVjdF9Bc0NoYXJCdWZmZXIoc3Vib2JqLCAmc3ViLCAmc3ViX2xlbikpCi0JCS8qIFhYWCAtIHRoZSAiZXhwZWN0ZWQgYSBjaGFyYWN0ZXIgYnVmZmVyIG9iamVjdCIgaXMgcHJldHR5Ci0JCSAgIGNvbmZ1c2luZyBmb3IgYSBub24tZXhwZXJ0LiAgcmVtYXAgdG8gc29tZXRoaW5nIGVsc2UgPyAqLwotCQlyZXR1cm4gLTI7CisgICAgZWxzZSBpZiAoUHlPYmplY3RfQXNDaGFyQnVmZmVyKHN1Ym9iaiwgJnN1YiwgJnN1Yl9sZW4pKQorICAgICAgICAvKiBYWFggLSB0aGUgImV4cGVjdGVkIGEgY2hhcmFjdGVyIGJ1ZmZlciBvYmplY3QiIGlzIHByZXR0eQorICAgICAgICAgICBjb25mdXNpbmcgZm9yIGEgbm9uLWV4cGVydC4gIHJlbWFwIHRvIHNvbWV0aGluZyBlbHNlID8gKi8KKyAgICAgICAgcmV0dXJuIC0yOwogCi0JaWYgKGRpciA+IDApCi0JCXJldHVybiBzdHJpbmdsaWJfZmluZF9zbGljZSgKLQkJCVB5U3RyaW5nX0FTX1NUUklORyhzZWxmKSwgUHlTdHJpbmdfR0VUX1NJWkUoc2VsZiksCi0JCQlzdWIsIHN1Yl9sZW4sIHN0YXJ0LCBlbmQpOwotCWVsc2UKLQkJcmV0dXJuIHN0cmluZ2xpYl9yZmluZF9zbGljZSgKLQkJCVB5U3RyaW5nX0FTX1NUUklORyhzZWxmKSwgUHlTdHJpbmdfR0VUX1NJWkUoc2VsZiksCi0JCQlzdWIsIHN1Yl9sZW4sIHN0YXJ0LCBlbmQpOworICAgIGlmIChkaXIgPiAwKQorICAgICAgICByZXR1cm4gc3RyaW5nbGliX2ZpbmRfc2xpY2UoCisgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcoc2VsZiksIFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpLAorICAgICAgICAgICAgc3ViLCBzdWJfbGVuLCBzdGFydCwgZW5kKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBzdHJpbmdsaWJfcmZpbmRfc2xpY2UoCisgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcoc2VsZiksIFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpLAorICAgICAgICAgICAgc3ViLCBzdWJfbGVuLCBzdGFydCwgZW5kKTsKIH0KIAogCkBAIC0xOTkwLDEwICsxOTkwLDEwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3RyaW5nX2ZpbmQoUHlTdHJpbmdPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5X3NzaXplX3QgcmVzdWx0ID0gc3RyaW5nX2ZpbmRfaW50ZXJuYWwoc2VsZiwgYXJncywgKzEpOwotCWlmIChyZXN1bHQgPT0gLTIpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBQeUludF9Gcm9tU3NpemVfdChyZXN1bHQpOworICAgIFB5X3NzaXplX3QgcmVzdWx0ID0gc3RyaW5nX2ZpbmRfaW50ZXJuYWwoc2VsZiwgYXJncywgKzEpOworICAgIGlmIChyZXN1bHQgPT0gLTIpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeUludF9Gcm9tU3NpemVfdChyZXN1bHQpOwogfQogCiAKQEAgLTIwMDUsMTUgKzIwMDUsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdHJpbmdfaW5kZXgoUHlTdHJpbmdPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5X3NzaXplX3QgcmVzdWx0ID0gc3RyaW5nX2ZpbmRfaW50ZXJuYWwoc2VsZiwgYXJncywgKzEpOwotCWlmIChyZXN1bHQgPT0gLTIpCi0JCXJldHVybiBOVUxMOwotCWlmIChyZXN1bHQgPT0gLTEpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJInN1YnN0cmluZyBub3QgZm91bmQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBQeUludF9Gcm9tU3NpemVfdChyZXN1bHQpOworICAgIFB5X3NzaXplX3QgcmVzdWx0ID0gc3RyaW5nX2ZpbmRfaW50ZXJuYWwoc2VsZiwgYXJncywgKzEpOworICAgIGlmIChyZXN1bHQgPT0gLTIpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChyZXN1bHQgPT0gLTEpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAic3Vic3RyaW5nIG5vdCBmb3VuZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KHJlc3VsdCk7CiB9CiAKIApAQCAtMjAyOSwxMCArMjAyOSwxMCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHN0cmluZ19yZmluZChQeVN0cmluZ09iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlfc3NpemVfdCByZXN1bHQgPSBzdHJpbmdfZmluZF9pbnRlcm5hbChzZWxmLCBhcmdzLCAtMSk7Ci0JaWYgKHJlc3VsdCA9PSAtMikKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KHJlc3VsdCk7CisgICAgUHlfc3NpemVfdCByZXN1bHQgPSBzdHJpbmdfZmluZF9pbnRlcm5hbChzZWxmLCBhcmdzLCAtMSk7CisgICAgaWYgKHJlc3VsdCA9PSAtMikKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KHJlc3VsdCk7CiB9CiAKIApAQCAtMjA0NCwxMTUgKzIwNDQsMTE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3RyaW5nX3JpbmRleChQeVN0cmluZ09iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlfc3NpemVfdCByZXN1bHQgPSBzdHJpbmdfZmluZF9pbnRlcm5hbChzZWxmLCBhcmdzLCAtMSk7Ci0JaWYgKHJlc3VsdCA9PSAtMikKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKHJlc3VsdCA9PSAtMSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkic3Vic3RyaW5nIG5vdCBmb3VuZCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KHJlc3VsdCk7CisgICAgUHlfc3NpemVfdCByZXN1bHQgPSBzdHJpbmdfZmluZF9pbnRlcm5hbChzZWxmLCBhcmdzLCAtMSk7CisgICAgaWYgKHJlc3VsdCA9PSAtMikKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKHJlc3VsdCA9PSAtMSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJzdWJzdHJpbmcgbm90IGZvdW5kIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QocmVzdWx0KTsKIH0KIAogCiBQeV9MT0NBTF9JTkxJTkUoUHlPYmplY3QgKikKIGRvX3hzdHJpcChQeVN0cmluZ09iamVjdCAqc2VsZiwgaW50IHN0cmlwdHlwZSwgUHlPYmplY3QgKnNlcG9iaikKIHsKLQljaGFyICpzID0gUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpOwotCVB5X3NzaXplX3QgbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUoc2VsZik7Ci0JY2hhciAqc2VwID0gUHlTdHJpbmdfQVNfU1RSSU5HKHNlcG9iaik7Ci0JUHlfc3NpemVfdCBzZXBsZW4gPSBQeVN0cmluZ19HRVRfU0laRShzZXBvYmopOwotCVB5X3NzaXplX3QgaSwgajsKKyAgICBjaGFyICpzID0gUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpOworICAgIFB5X3NzaXplX3QgbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUoc2VsZik7CisgICAgY2hhciAqc2VwID0gUHlTdHJpbmdfQVNfU1RSSU5HKHNlcG9iaik7CisgICAgUHlfc3NpemVfdCBzZXBsZW4gPSBQeVN0cmluZ19HRVRfU0laRShzZXBvYmopOworICAgIFB5X3NzaXplX3QgaSwgajsKIAotCWkgPSAwOwotCWlmIChzdHJpcHR5cGUgIT0gUklHSFRTVFJJUCkgewotCQl3aGlsZSAoaSA8IGxlbiAmJiBtZW1jaHIoc2VwLCBQeV9DSEFSTUFTSyhzW2ldKSwgc2VwbGVuKSkgewotCQkJaSsrOwotCQl9Ci0JfQorICAgIGkgPSAwOworICAgIGlmIChzdHJpcHR5cGUgIT0gUklHSFRTVFJJUCkgeworICAgICAgICB3aGlsZSAoaSA8IGxlbiAmJiBtZW1jaHIoc2VwLCBQeV9DSEFSTUFTSyhzW2ldKSwgc2VwbGVuKSkgeworICAgICAgICAgICAgaSsrOworICAgICAgICB9CisgICAgfQogCi0JaiA9IGxlbjsKLQlpZiAoc3RyaXB0eXBlICE9IExFRlRTVFJJUCkgewotCQlkbyB7Ci0JCQlqLS07Ci0JCX0gd2hpbGUgKGogPj0gaSAmJiBtZW1jaHIoc2VwLCBQeV9DSEFSTUFTSyhzW2pdKSwgc2VwbGVuKSk7Ci0JCWorKzsKLQl9CisgICAgaiA9IGxlbjsKKyAgICBpZiAoc3RyaXB0eXBlICE9IExFRlRTVFJJUCkgeworICAgICAgICBkbyB7CisgICAgICAgICAgICBqLS07CisgICAgICAgIH0gd2hpbGUgKGogPj0gaSAmJiBtZW1jaHIoc2VwLCBQeV9DSEFSTUFTSyhzW2pdKSwgc2VwbGVuKSk7CisgICAgICAgIGorKzsKKyAgICB9CiAKLQlpZiAoaSA9PSAwICYmIGogPT0gbGVuICYmIFB5U3RyaW5nX0NoZWNrRXhhY3Qoc2VsZikpIHsKLQkJUHlfSU5DUkVGKHNlbGYpOwotCQlyZXR1cm4gKFB5T2JqZWN0KilzZWxmOwotCX0KLQllbHNlCi0JCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzK2ksIGotaSk7CisgICAgaWYgKGkgPT0gMCAmJiBqID09IGxlbiAmJiBQeVN0cmluZ19DaGVja0V4YWN0KHNlbGYpKSB7CisgICAgICAgIFB5X0lOQ1JFRihzZWxmKTsKKyAgICAgICAgcmV0dXJuIChQeU9iamVjdCopc2VsZjsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocytpLCBqLWkpOwogfQogCiAKIFB5X0xPQ0FMX0lOTElORShQeU9iamVjdCAqKQogZG9fc3RyaXAoUHlTdHJpbmdPYmplY3QgKnNlbGYsIGludCBzdHJpcHR5cGUpCiB7Ci0JY2hhciAqcyA9IFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKTsKLQlQeV9zc2l6ZV90IGxlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpLCBpLCBqOworICAgIGNoYXIgKnMgPSBQeVN0cmluZ19BU19TVFJJTkcoc2VsZik7CisgICAgUHlfc3NpemVfdCBsZW4gPSBQeVN0cmluZ19HRVRfU0laRShzZWxmKSwgaSwgajsKIAotCWkgPSAwOwotCWlmIChzdHJpcHR5cGUgIT0gUklHSFRTVFJJUCkgewotCQl3aGlsZSAoaSA8IGxlbiAmJiBpc3NwYWNlKFB5X0NIQVJNQVNLKHNbaV0pKSkgewotCQkJaSsrOwotCQl9Ci0JfQorICAgIGkgPSAwOworICAgIGlmIChzdHJpcHR5cGUgIT0gUklHSFRTVFJJUCkgeworICAgICAgICB3aGlsZSAoaSA8IGxlbiAmJiBpc3NwYWNlKFB5X0NIQVJNQVNLKHNbaV0pKSkgeworICAgICAgICAgICAgaSsrOworICAgICAgICB9CisgICAgfQogCi0JaiA9IGxlbjsKLQlpZiAoc3RyaXB0eXBlICE9IExFRlRTVFJJUCkgewotCQlkbyB7Ci0JCQlqLS07Ci0JCX0gd2hpbGUgKGogPj0gaSAmJiBpc3NwYWNlKFB5X0NIQVJNQVNLKHNbal0pKSk7Ci0JCWorKzsKLQl9CisgICAgaiA9IGxlbjsKKyAgICBpZiAoc3RyaXB0eXBlICE9IExFRlRTVFJJUCkgeworICAgICAgICBkbyB7CisgICAgICAgICAgICBqLS07CisgICAgICAgIH0gd2hpbGUgKGogPj0gaSAmJiBpc3NwYWNlKFB5X0NIQVJNQVNLKHNbal0pKSk7CisgICAgICAgIGorKzsKKyAgICB9CiAKLQlpZiAoaSA9PSAwICYmIGogPT0gbGVuICYmIFB5U3RyaW5nX0NoZWNrRXhhY3Qoc2VsZikpIHsKLQkJUHlfSU5DUkVGKHNlbGYpOwotCQlyZXR1cm4gKFB5T2JqZWN0KilzZWxmOwotCX0KLQllbHNlCi0JCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzK2ksIGotaSk7CisgICAgaWYgKGkgPT0gMCAmJiBqID09IGxlbiAmJiBQeVN0cmluZ19DaGVja0V4YWN0KHNlbGYpKSB7CisgICAgICAgIFB5X0lOQ1JFRihzZWxmKTsKKyAgICAgICAgcmV0dXJuIChQeU9iamVjdCopc2VsZjsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocytpLCBqLWkpOwogfQogCiAKIFB5X0xPQ0FMX0lOTElORShQeU9iamVjdCAqKQogZG9fYXJnc3RyaXAoUHlTdHJpbmdPYmplY3QgKnNlbGYsIGludCBzdHJpcHR5cGUsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICpzZXAgPSBOVUxMOworICAgIFB5T2JqZWN0ICpzZXAgPSBOVUxMOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsIChjaGFyICopc3RyaXBmb3JtYXRbc3RyaXB0eXBlXSwgJnNlcCkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAoY2hhciAqKXN0cmlwZm9ybWF0W3N0cmlwdHlwZV0sICZzZXApKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChzZXAgIT0gTlVMTCAmJiBzZXAgIT0gUHlfTm9uZSkgewotCQlpZiAoUHlTdHJpbmdfQ2hlY2soc2VwKSkKLQkJCXJldHVybiBkb194c3RyaXAoc2VsZiwgc3RyaXB0eXBlLCBzZXApOworICAgIGlmIChzZXAgIT0gTlVMTCAmJiBzZXAgIT0gUHlfTm9uZSkgeworICAgICAgICBpZiAoUHlTdHJpbmdfQ2hlY2soc2VwKSkKKyAgICAgICAgICAgIHJldHVybiBkb194c3RyaXAoc2VsZiwgc3RyaXB0eXBlLCBzZXApOwogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQkJZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrKHNlcCkpIHsKLQkJCVB5T2JqZWN0ICp1bmlzZWxmID0gUHlVbmljb2RlX0Zyb21PYmplY3QoKFB5T2JqZWN0ICopc2VsZik7Ci0JCQlQeU9iamVjdCAqcmVzOwotCQkJaWYgKHVuaXNlbGY9PU5VTEwpCi0JCQkJcmV0dXJuIE5VTEw7Ci0JCQlyZXMgPSBfUHlVbmljb2RlX1hTdHJpcCgoUHlVbmljb2RlT2JqZWN0ICopdW5pc2VsZiwKLQkJCQlzdHJpcHR5cGUsIHNlcCk7Ci0JCQlQeV9ERUNSRUYodW5pc2VsZik7Ci0JCQlyZXR1cm4gcmVzOwotCQl9CisgICAgICAgIGVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayhzZXApKSB7CisgICAgICAgICAgICBQeU9iamVjdCAqdW5pc2VsZiA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KChQeU9iamVjdCAqKXNlbGYpOworICAgICAgICAgICAgUHlPYmplY3QgKnJlczsKKyAgICAgICAgICAgIGlmICh1bmlzZWxmPT1OVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgcmVzID0gX1B5VW5pY29kZV9YU3RyaXAoKFB5VW5pY29kZU9iamVjdCAqKXVuaXNlbGYsCisgICAgICAgICAgICAgICAgc3RyaXB0eXBlLCBzZXApOworICAgICAgICAgICAgUHlfREVDUkVGKHVuaXNlbGYpOworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQogI2VuZGlmCi0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCQkJICAgICAiJXMgYXJnIG11c3QgYmUgTm9uZSwgc3RyIG9yIHVuaWNvZGUiLAorICAgICAgICAgICAgICAgICAgICAgIiVzIGFyZyBtdXN0IGJlIE5vbmUsIHN0ciBvciB1bmljb2RlIiwKICNlbHNlCi0JCQkgICAgICIlcyBhcmcgbXVzdCBiZSBOb25lIG9yIHN0ciIsCisgICAgICAgICAgICAgICAgICAgICAiJXMgYXJnIG11c3QgYmUgTm9uZSBvciBzdHIiLAogI2VuZGlmCi0JCQkgICAgIFNUUklQTkFNRShzdHJpcHR5cGUpKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgICAgICAgICAgICAgICAgICAgU1RSSVBOQU1FKHN0cmlwdHlwZSkpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlyZXR1cm4gZG9fc3RyaXAoc2VsZiwgc3RyaXB0eXBlKTsKKyAgICByZXR1cm4gZG9fc3RyaXAoc2VsZiwgc3RyaXB0eXBlKTsKIH0KIAogCkBAIC0yMTY3LDEwICsyMTY3LDEwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3RyaW5nX3N0cmlwKFB5U3RyaW5nT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpZiAoUHlUdXBsZV9HRVRfU0laRShhcmdzKSA9PSAwKQotCQlyZXR1cm4gZG9fc3RyaXAoc2VsZiwgQk9USFNUUklQKTsgLyogQ29tbW9uIGNhc2UgKi8KLQllbHNlCi0JCXJldHVybiBkb19hcmdzdHJpcChzZWxmLCBCT1RIU1RSSVAsIGFyZ3MpOworICAgIGlmIChQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpID09IDApCisgICAgICAgIHJldHVybiBkb19zdHJpcChzZWxmLCBCT1RIU1RSSVApOyAvKiBDb21tb24gY2FzZSAqLworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGRvX2FyZ3N0cmlwKHNlbGYsIEJPVEhTVFJJUCwgYXJncyk7CiB9CiAKIApAQCAtMjE4NCwxMCArMjE4NCwxMCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHN0cmluZ19sc3RyaXAoUHlTdHJpbmdPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWlmIChQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpID09IDApCi0JCXJldHVybiBkb19zdHJpcChzZWxmLCBMRUZUU1RSSVApOyAvKiBDb21tb24gY2FzZSAqLwotCWVsc2UKLQkJcmV0dXJuIGRvX2FyZ3N0cmlwKHNlbGYsIExFRlRTVFJJUCwgYXJncyk7CisgICAgaWYgKFB5VHVwbGVfR0VUX1NJWkUoYXJncykgPT0gMCkKKyAgICAgICAgcmV0dXJuIGRvX3N0cmlwKHNlbGYsIExFRlRTVFJJUCk7IC8qIENvbW1vbiBjYXNlICovCisgICAgZWxzZQorICAgICAgICByZXR1cm4gZG9fYXJnc3RyaXAoc2VsZiwgTEVGVFNUUklQLCBhcmdzKTsKIH0KIAogCkBAIC0yMjAxLDEwICsyMjAxLDEwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3RyaW5nX3JzdHJpcChQeVN0cmluZ09iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaWYgKFB5VHVwbGVfR0VUX1NJWkUoYXJncykgPT0gMCkKLQkJcmV0dXJuIGRvX3N0cmlwKHNlbGYsIFJJR0hUU1RSSVApOyAvKiBDb21tb24gY2FzZSAqLwotCWVsc2UKLQkJcmV0dXJuIGRvX2FyZ3N0cmlwKHNlbGYsIFJJR0hUU1RSSVAsIGFyZ3MpOworICAgIGlmIChQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpID09IDApCisgICAgICAgIHJldHVybiBkb19zdHJpcChzZWxmLCBSSUdIVFNUUklQKTsgLyogQ29tbW9uIGNhc2UgKi8KKyAgICBlbHNlCisgICAgICAgIHJldHVybiBkb19hcmdzdHJpcChzZWxmLCBSSUdIVFNUUklQLCBhcmdzKTsKIH0KIAogCkBAIC0yMjIxLDI1ICsyMjIxLDI1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3RyaW5nX2xvd2VyKFB5U3RyaW5nT2JqZWN0ICpzZWxmKQogewotCWNoYXIgKnM7Ci0JUHlfc3NpemVfdCBpLCBuID0gUHlTdHJpbmdfR0VUX1NJWkUoc2VsZik7Ci0JUHlPYmplY3QgKm5ld29iajsKKyAgICBjaGFyICpzOworICAgIFB5X3NzaXplX3QgaSwgbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpOworICAgIFB5T2JqZWN0ICpuZXdvYmo7CiAKLQluZXdvYmogPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBuKTsKLQlpZiAoIW5ld29iaikKLQkJcmV0dXJuIE5VTEw7CisgICAgbmV3b2JqID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbik7CisgICAgaWYgKCFuZXdvYmopCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JcyA9IFB5U3RyaW5nX0FTX1NUUklORyhuZXdvYmopOworICAgIHMgPSBQeVN0cmluZ19BU19TVFJJTkcobmV3b2JqKTsKIAotCVB5X01FTUNQWShzLCBQeVN0cmluZ19BU19TVFJJTkcoc2VsZiksIG4pOworICAgIFB5X01FTUNQWShzLCBQeVN0cmluZ19BU19TVFJJTkcoc2VsZiksIG4pOwogCi0JZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQlpbnQgYyA9IFB5X0NIQVJNQVNLKHNbaV0pOwotCQlpZiAoaXN1cHBlcihjKSkKLQkJCXNbaV0gPSBfdG9sb3dlcihjKTsKLQl9CisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICBpbnQgYyA9IFB5X0NIQVJNQVNLKHNbaV0pOworICAgICAgICBpZiAoaXN1cHBlcihjKSkKKyAgICAgICAgICAgIHNbaV0gPSBfdG9sb3dlcihjKTsKKyAgICB9CiAKLQlyZXR1cm4gbmV3b2JqOworICAgIHJldHVybiBuZXdvYmo7CiB9CiAKIFB5RG9jX1NUUlZBUih1cHBlcl9fZG9jX18sCkBAIC0yMjU0LDI1ICsyMjU0LDI1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3RyaW5nX3VwcGVyKFB5U3RyaW5nT2JqZWN0ICpzZWxmKQogewotCWNoYXIgKnM7Ci0JUHlfc3NpemVfdCBpLCBuID0gUHlTdHJpbmdfR0VUX1NJWkUoc2VsZik7Ci0JUHlPYmplY3QgKm5ld29iajsKKyAgICBjaGFyICpzOworICAgIFB5X3NzaXplX3QgaSwgbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpOworICAgIFB5T2JqZWN0ICpuZXdvYmo7CiAKLQluZXdvYmogPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBuKTsKLQlpZiAoIW5ld29iaikKLQkJcmV0dXJuIE5VTEw7CisgICAgbmV3b2JqID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbik7CisgICAgaWYgKCFuZXdvYmopCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JcyA9IFB5U3RyaW5nX0FTX1NUUklORyhuZXdvYmopOworICAgIHMgPSBQeVN0cmluZ19BU19TVFJJTkcobmV3b2JqKTsKIAotCVB5X01FTUNQWShzLCBQeVN0cmluZ19BU19TVFJJTkcoc2VsZiksIG4pOworICAgIFB5X01FTUNQWShzLCBQeVN0cmluZ19BU19TVFJJTkcoc2VsZiksIG4pOwogCi0JZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQlpbnQgYyA9IFB5X0NIQVJNQVNLKHNbaV0pOwotCQlpZiAoaXNsb3dlcihjKSkKLQkJCXNbaV0gPSBfdG91cHBlcihjKTsKLQl9CisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICBpbnQgYyA9IFB5X0NIQVJNQVNLKHNbaV0pOworICAgICAgICBpZiAoaXNsb3dlcihjKSkKKyAgICAgICAgICAgIHNbaV0gPSBfdG91cHBlcihjKTsKKyAgICB9CiAKLQlyZXR1cm4gbmV3b2JqOworICAgIHJldHVybiBuZXdvYmo7CiB9CiAKIFB5RG9jX1NUUlZBUih0aXRsZV9fZG9jX18sCkBAIC0yMjg0LDMwICsyMjg0LDMwIEBACiBzdGF0aWMgUHlPYmplY3QqCiBzdHJpbmdfdGl0bGUoUHlTdHJpbmdPYmplY3QgKnNlbGYpCiB7Ci0JY2hhciAqcyA9IFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKSwgKnNfbmV3OwotCVB5X3NzaXplX3QgaSwgbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpOwotCWludCBwcmV2aW91c19pc19jYXNlZCA9IDA7Ci0JUHlPYmplY3QgKm5ld29iajsKKyAgICBjaGFyICpzID0gUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpLCAqc19uZXc7CisgICAgUHlfc3NpemVfdCBpLCBuID0gUHlTdHJpbmdfR0VUX1NJWkUoc2VsZik7CisgICAgaW50IHByZXZpb3VzX2lzX2Nhc2VkID0gMDsKKyAgICBQeU9iamVjdCAqbmV3b2JqOwogCi0JbmV3b2JqID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbik7Ci0JaWYgKG5ld29iaiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlzX25ldyA9IFB5U3RyaW5nX0FzU3RyaW5nKG5ld29iaik7Ci0JZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQlpbnQgYyA9IFB5X0NIQVJNQVNLKCpzKyspOwotCQlpZiAoaXNsb3dlcihjKSkgewotCQkJaWYgKCFwcmV2aW91c19pc19jYXNlZCkKLQkJCSAgICBjID0gdG91cHBlcihjKTsKLQkJCXByZXZpb3VzX2lzX2Nhc2VkID0gMTsKLQkJfSBlbHNlIGlmIChpc3VwcGVyKGMpKSB7Ci0JCQlpZiAocHJldmlvdXNfaXNfY2FzZWQpCi0JCQkgICAgYyA9IHRvbG93ZXIoYyk7Ci0JCQlwcmV2aW91c19pc19jYXNlZCA9IDE7Ci0JCX0gZWxzZQotCQkJcHJldmlvdXNfaXNfY2FzZWQgPSAwOwotCQkqc19uZXcrKyA9IGM7Ci0JfQotCXJldHVybiBuZXdvYmo7CisgICAgbmV3b2JqID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbik7CisgICAgaWYgKG5ld29iaiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBzX25ldyA9IFB5U3RyaW5nX0FzU3RyaW5nKG5ld29iaik7CisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICBpbnQgYyA9IFB5X0NIQVJNQVNLKCpzKyspOworICAgICAgICBpZiAoaXNsb3dlcihjKSkgeworICAgICAgICAgICAgaWYgKCFwcmV2aW91c19pc19jYXNlZCkKKyAgICAgICAgICAgICAgICBjID0gdG91cHBlcihjKTsKKyAgICAgICAgICAgIHByZXZpb3VzX2lzX2Nhc2VkID0gMTsKKyAgICAgICAgfSBlbHNlIGlmIChpc3VwcGVyKGMpKSB7CisgICAgICAgICAgICBpZiAocHJldmlvdXNfaXNfY2FzZWQpCisgICAgICAgICAgICAgICAgYyA9IHRvbG93ZXIoYyk7CisgICAgICAgICAgICBwcmV2aW91c19pc19jYXNlZCA9IDE7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgcHJldmlvdXNfaXNfY2FzZWQgPSAwOworICAgICAgICAqc19uZXcrKyA9IGM7CisgICAgfQorICAgIHJldHVybiBuZXdvYmo7CiB9CiAKIFB5RG9jX1NUUlZBUihjYXBpdGFsaXplX19kb2NfXywKQEAgLTIzMTksMzEgKzIzMTksMzEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdHJpbmdfY2FwaXRhbGl6ZShQeVN0cmluZ09iamVjdCAqc2VsZikKIHsKLQljaGFyICpzID0gUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpLCAqc19uZXc7Ci0JUHlfc3NpemVfdCBpLCBuID0gUHlTdHJpbmdfR0VUX1NJWkUoc2VsZik7Ci0JUHlPYmplY3QgKm5ld29iajsKKyAgICBjaGFyICpzID0gUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpLCAqc19uZXc7CisgICAgUHlfc3NpemVfdCBpLCBuID0gUHlTdHJpbmdfR0VUX1NJWkUoc2VsZik7CisgICAgUHlPYmplY3QgKm5ld29iajsKIAotCW5ld29iaiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIG4pOwotCWlmIChuZXdvYmogPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0Jc19uZXcgPSBQeVN0cmluZ19Bc1N0cmluZyhuZXdvYmopOwotCWlmICgwIDwgbikgewotCQlpbnQgYyA9IFB5X0NIQVJNQVNLKCpzKyspOwotCQlpZiAoaXNsb3dlcihjKSkKLQkJCSpzX25ldyA9IHRvdXBwZXIoYyk7Ci0JCWVsc2UKLQkJCSpzX25ldyA9IGM7Ci0JCXNfbmV3Kys7Ci0JfQotCWZvciAoaSA9IDE7IGkgPCBuOyBpKyspIHsKLQkJaW50IGMgPSBQeV9DSEFSTUFTSygqcysrKTsKLQkJaWYgKGlzdXBwZXIoYykpCi0JCQkqc19uZXcgPSB0b2xvd2VyKGMpOwotCQllbHNlCi0JCQkqc19uZXcgPSBjOwotCQlzX25ldysrOwotCX0KLQlyZXR1cm4gbmV3b2JqOworICAgIG5ld29iaiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIG4pOworICAgIGlmIChuZXdvYmogPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgc19uZXcgPSBQeVN0cmluZ19Bc1N0cmluZyhuZXdvYmopOworICAgIGlmICgwIDwgbikgeworICAgICAgICBpbnQgYyA9IFB5X0NIQVJNQVNLKCpzKyspOworICAgICAgICBpZiAoaXNsb3dlcihjKSkKKyAgICAgICAgICAgICpzX25ldyA9IHRvdXBwZXIoYyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICpzX25ldyA9IGM7CisgICAgICAgIHNfbmV3Kys7CisgICAgfQorICAgIGZvciAoaSA9IDE7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgaW50IGMgPSBQeV9DSEFSTUFTSygqcysrKTsKKyAgICAgICAgaWYgKGlzdXBwZXIoYykpCisgICAgICAgICAgICAqc19uZXcgPSB0b2xvd2VyKGMpOworICAgICAgICBlbHNlCisgICAgICAgICAgICAqc19uZXcgPSBjOworICAgICAgICBzX25ldysrOworICAgIH0KKyAgICByZXR1cm4gbmV3b2JqOwogfQogCiAKQEAgLTIzNTcsMzcgKzIzNTcsMzcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdHJpbmdfY291bnQoUHlTdHJpbmdPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICpzdWJfb2JqOwotCWNvbnN0IGNoYXIgKnN0ciA9IFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKSwgKnN1YjsKLQlQeV9zc2l6ZV90IHN1Yl9sZW47Ci0JUHlfc3NpemVfdCBzdGFydCA9IDAsIGVuZCA9IFBZX1NTSVpFX1RfTUFYOworICAgIFB5T2JqZWN0ICpzdWJfb2JqOworICAgIGNvbnN0IGNoYXIgKnN0ciA9IFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKSwgKnN1YjsKKyAgICBQeV9zc2l6ZV90IHN1Yl9sZW47CisgICAgUHlfc3NpemVfdCBzdGFydCA9IDAsIGVuZCA9IFBZX1NTSVpFX1RfTUFYOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfE8mTyY6Y291bnQiLCAmc3ViX29iaiwKLQkJX1B5RXZhbF9TbGljZUluZGV4LCAmc3RhcnQsIF9QeUV2YWxfU2xpY2VJbmRleCwgJmVuZCkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3xPJk8mOmNvdW50IiwgJnN1Yl9vYmosCisgICAgICAgIF9QeUV2YWxfU2xpY2VJbmRleCwgJnN0YXJ0LCBfUHlFdmFsX1NsaWNlSW5kZXgsICZlbmQpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChQeVN0cmluZ19DaGVjayhzdWJfb2JqKSkgewotCQlzdWIgPSBQeVN0cmluZ19BU19TVFJJTkcoc3ViX29iaik7Ci0JCXN1Yl9sZW4gPSBQeVN0cmluZ19HRVRfU0laRShzdWJfb2JqKTsKLQl9CisgICAgaWYgKFB5U3RyaW5nX0NoZWNrKHN1Yl9vYmopKSB7CisgICAgICAgIHN1YiA9IFB5U3RyaW5nX0FTX1NUUklORyhzdWJfb2JqKTsKKyAgICAgICAgc3ViX2xlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHN1Yl9vYmopOworICAgIH0KICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrKHN1Yl9vYmopKSB7Ci0JCVB5X3NzaXplX3QgY291bnQ7Ci0JCWNvdW50ID0gUHlVbmljb2RlX0NvdW50KChQeU9iamVjdCAqKXNlbGYsIHN1Yl9vYmosIHN0YXJ0LCBlbmQpOwotCQlpZiAoY291bnQgPT0gLTEpCi0JCQlyZXR1cm4gTlVMTDsKLQkJZWxzZQotCQkgICAgCXJldHVybiBQeUludF9Gcm9tU3NpemVfdChjb3VudCk7Ci0JfQorICAgIGVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayhzdWJfb2JqKSkgeworICAgICAgICBQeV9zc2l6ZV90IGNvdW50OworICAgICAgICBjb3VudCA9IFB5VW5pY29kZV9Db3VudCgoUHlPYmplY3QgKilzZWxmLCBzdWJfb2JqLCBzdGFydCwgZW5kKTsKKyAgICAgICAgaWYgKGNvdW50ID09IC0xKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBQeUludF9Gcm9tU3NpemVfdChjb3VudCk7CisgICAgfQogI2VuZGlmCi0JZWxzZSBpZiAoUHlPYmplY3RfQXNDaGFyQnVmZmVyKHN1Yl9vYmosICZzdWIsICZzdWJfbGVuKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgZWxzZSBpZiAoUHlPYmplY3RfQXNDaGFyQnVmZmVyKHN1Yl9vYmosICZzdWIsICZzdWJfbGVuKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlzdHJpbmdfYWRqdXN0X2luZGljZXMoJnN0YXJ0LCAmZW5kLCBQeVN0cmluZ19HRVRfU0laRShzZWxmKSk7CisgICAgc3RyaW5nX2FkanVzdF9pbmRpY2VzKCZzdGFydCwgJmVuZCwgUHlTdHJpbmdfR0VUX1NJWkUoc2VsZikpOwogCi0JcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KAotCQlzdHJpbmdsaWJfY291bnQoc3RyICsgc3RhcnQsIGVuZCAtIHN0YXJ0LCBzdWIsIHN1Yl9sZW4pCi0JCSk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KAorICAgICAgICBzdHJpbmdsaWJfY291bnQoc3RyICsgc3RhcnQsIGVuZCAtIHN0YXJ0LCBzdWIsIHN1Yl9sZW4pCisgICAgICAgICk7CiB9CiAKIFB5RG9jX1NUUlZBUihzd2FwY2FzZV9fZG9jX18sCkBAIC0yMzk5LDI3ICsyMzk5LDI3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3RyaW5nX3N3YXBjYXNlKFB5U3RyaW5nT2JqZWN0ICpzZWxmKQogewotCWNoYXIgKnMgPSBQeVN0cmluZ19BU19TVFJJTkcoc2VsZiksICpzX25ldzsKLQlQeV9zc2l6ZV90IGksIG4gPSBQeVN0cmluZ19HRVRfU0laRShzZWxmKTsKLQlQeU9iamVjdCAqbmV3b2JqOworICAgIGNoYXIgKnMgPSBQeVN0cmluZ19BU19TVFJJTkcoc2VsZiksICpzX25ldzsKKyAgICBQeV9zc2l6ZV90IGksIG4gPSBQeVN0cmluZ19HRVRfU0laRShzZWxmKTsKKyAgICBQeU9iamVjdCAqbmV3b2JqOwogCi0JbmV3b2JqID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbik7Ci0JaWYgKG5ld29iaiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlzX25ldyA9IFB5U3RyaW5nX0FzU3RyaW5nKG5ld29iaik7Ci0JZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQlpbnQgYyA9IFB5X0NIQVJNQVNLKCpzKyspOwotCQlpZiAoaXNsb3dlcihjKSkgewotCQkJKnNfbmV3ID0gdG91cHBlcihjKTsKLQkJfQotCQllbHNlIGlmIChpc3VwcGVyKGMpKSB7Ci0JCQkqc19uZXcgPSB0b2xvd2VyKGMpOwotCQl9Ci0JCWVsc2UKLQkJCSpzX25ldyA9IGM7Ci0JCXNfbmV3Kys7Ci0JfQotCXJldHVybiBuZXdvYmo7CisgICAgbmV3b2JqID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbik7CisgICAgaWYgKG5ld29iaiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBzX25ldyA9IFB5U3RyaW5nX0FzU3RyaW5nKG5ld29iaik7CisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICBpbnQgYyA9IFB5X0NIQVJNQVNLKCpzKyspOworICAgICAgICBpZiAoaXNsb3dlcihjKSkgeworICAgICAgICAgICAgKnNfbmV3ID0gdG91cHBlcihjKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChpc3VwcGVyKGMpKSB7CisgICAgICAgICAgICAqc19uZXcgPSB0b2xvd2VyKGMpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICpzX25ldyA9IGM7CisgICAgICAgIHNfbmV3Kys7CisgICAgfQorICAgIHJldHVybiBuZXdvYmo7CiB9CiAKIApAQCAtMjQzNCwxMTggKzI0MzQsMTE4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3RyaW5nX3RyYW5zbGF0ZShQeVN0cmluZ09iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmVnaXN0ZXIgY2hhciAqaW5wdXQsICpvdXRwdXQ7Ci0JY29uc3QgY2hhciAqdGFibGU7Ci0JcmVnaXN0ZXIgUHlfc3NpemVfdCBpLCBjLCBjaGFuZ2VkID0gMDsKLQlQeU9iamVjdCAqaW5wdXRfb2JqID0gKFB5T2JqZWN0KilzZWxmOwotCWNvbnN0IGNoYXIgKm91dHB1dF9zdGFydCwgKmRlbF90YWJsZT1OVUxMOwotCVB5X3NzaXplX3QgaW5sZW4sIHRhYmxlbiwgZGVsbGVuID0gMDsKLQlQeU9iamVjdCAqcmVzdWx0OwotCWludCB0cmFuc190YWJsZVsyNTZdOwotCVB5T2JqZWN0ICp0YWJsZW9iaiwgKmRlbG9iaiA9IE5VTEw7CisgICAgcmVnaXN0ZXIgY2hhciAqaW5wdXQsICpvdXRwdXQ7CisgICAgY29uc3QgY2hhciAqdGFibGU7CisgICAgcmVnaXN0ZXIgUHlfc3NpemVfdCBpLCBjLCBjaGFuZ2VkID0gMDsKKyAgICBQeU9iamVjdCAqaW5wdXRfb2JqID0gKFB5T2JqZWN0KilzZWxmOworICAgIGNvbnN0IGNoYXIgKm91dHB1dF9zdGFydCwgKmRlbF90YWJsZT1OVUxMOworICAgIFB5X3NzaXplX3QgaW5sZW4sIHRhYmxlbiwgZGVsbGVuID0gMDsKKyAgICBQeU9iamVjdCAqcmVzdWx0OworICAgIGludCB0cmFuc190YWJsZVsyNTZdOworICAgIFB5T2JqZWN0ICp0YWJsZW9iaiwgKmRlbG9iaiA9IE5VTEw7CiAKLQlpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJ0cmFuc2xhdGUiLCAxLCAyLAotCQkJICAgICAgJnRhYmxlb2JqLCAmZGVsb2JqKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAidHJhbnNsYXRlIiwgMSwgMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRhYmxlb2JqLCAmZGVsb2JqKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoUHlTdHJpbmdfQ2hlY2sodGFibGVvYmopKSB7Ci0JCXRhYmxlID0gUHlTdHJpbmdfQVNfU1RSSU5HKHRhYmxlb2JqKTsKLQkJdGFibGVuID0gUHlTdHJpbmdfR0VUX1NJWkUodGFibGVvYmopOwotCX0KLQllbHNlIGlmICh0YWJsZW9iaiA9PSBQeV9Ob25lKSB7Ci0JCXRhYmxlID0gTlVMTDsKLQkJdGFibGVuID0gMjU2OwotCX0KKyAgICBpZiAoUHlTdHJpbmdfQ2hlY2sodGFibGVvYmopKSB7CisgICAgICAgIHRhYmxlID0gUHlTdHJpbmdfQVNfU1RSSU5HKHRhYmxlb2JqKTsKKyAgICAgICAgdGFibGVuID0gUHlTdHJpbmdfR0VUX1NJWkUodGFibGVvYmopOworICAgIH0KKyAgICBlbHNlIGlmICh0YWJsZW9iaiA9PSBQeV9Ob25lKSB7CisgICAgICAgIHRhYmxlID0gTlVMTDsKKyAgICAgICAgdGFibGVuID0gMjU2OworICAgIH0KICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrKHRhYmxlb2JqKSkgewotCQkvKiBVbmljb2RlIC50cmFuc2xhdGUoKSBkb2VzIG5vdCBzdXBwb3J0IHRoZSBkZWxldGVjaGFycwotCQkgICBwYXJhbWV0ZXI7IGluc3RlYWQgYSBtYXBwaW5nIHRvIE5vbmUgd2lsbCBjYXVzZSBjaGFyYWN0ZXJzCi0JCSAgIHRvIGJlIGRlbGV0ZWQuICovCi0JCWlmIChkZWxvYmogIT0gTlVMTCkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCSJkZWxldGlvbnMgYXJlIGltcGxlbWVudGVkIGRpZmZlcmVudGx5IGZvciB1bmljb2RlIik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlyZXR1cm4gUHlVbmljb2RlX1RyYW5zbGF0ZSgoUHlPYmplY3QgKilzZWxmLCB0YWJsZW9iaiwgTlVMTCk7Ci0JfQorICAgIGVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayh0YWJsZW9iaikpIHsKKyAgICAgICAgLyogVW5pY29kZSAudHJhbnNsYXRlKCkgZG9lcyBub3Qgc3VwcG9ydCB0aGUgZGVsZXRlY2hhcnMKKyAgICAgICAgICAgcGFyYW1ldGVyOyBpbnN0ZWFkIGEgbWFwcGluZyB0byBOb25lIHdpbGwgY2F1c2UgY2hhcmFjdGVycworICAgICAgICAgICB0byBiZSBkZWxldGVkLiAqLworICAgICAgICBpZiAoZGVsb2JqICE9IE5VTEwpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAiZGVsZXRpb25zIGFyZSBpbXBsZW1lbnRlZCBkaWZmZXJlbnRseSBmb3IgdW5pY29kZSIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFB5VW5pY29kZV9UcmFuc2xhdGUoKFB5T2JqZWN0ICopc2VsZiwgdGFibGVvYmosIE5VTEwpOworICAgIH0KICNlbmRpZgotCWVsc2UgaWYgKFB5T2JqZWN0X0FzQ2hhckJ1ZmZlcih0YWJsZW9iaiwgJnRhYmxlLCAmdGFibGVuKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgZWxzZSBpZiAoUHlPYmplY3RfQXNDaGFyQnVmZmVyKHRhYmxlb2JqLCAmdGFibGUsICZ0YWJsZW4pKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmICh0YWJsZW4gIT0gMjU2KSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkgICJ0cmFuc2xhdGlvbiB0YWJsZSBtdXN0IGJlIDI1NiBjaGFyYWN0ZXJzIGxvbmciKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICh0YWJsZW4gIT0gMjU2KSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICJ0cmFuc2xhdGlvbiB0YWJsZSBtdXN0IGJlIDI1NiBjaGFyYWN0ZXJzIGxvbmciKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaWYgKGRlbG9iaiAhPSBOVUxMKSB7Ci0JCWlmIChQeVN0cmluZ19DaGVjayhkZWxvYmopKSB7Ci0JCQlkZWxfdGFibGUgPSBQeVN0cmluZ19BU19TVFJJTkcoZGVsb2JqKTsKLQkJCWRlbGxlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKGRlbG9iaik7Ci0JCX0KKyAgICBpZiAoZGVsb2JqICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKFB5U3RyaW5nX0NoZWNrKGRlbG9iaikpIHsKKyAgICAgICAgICAgIGRlbF90YWJsZSA9IFB5U3RyaW5nX0FTX1NUUklORyhkZWxvYmopOworICAgICAgICAgICAgZGVsbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUoZGVsb2JqKTsKKyAgICAgICAgfQogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQkJZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrKGRlbG9iaikpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkiZGVsZXRpb25zIGFyZSBpbXBsZW1lbnRlZCBkaWZmZXJlbnRseSBmb3IgdW5pY29kZSIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KKyAgICAgICAgZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrKGRlbG9iaikpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAiZGVsZXRpb25zIGFyZSBpbXBsZW1lbnRlZCBkaWZmZXJlbnRseSBmb3IgdW5pY29kZSIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KICNlbmRpZgotCQllbHNlIGlmIChQeU9iamVjdF9Bc0NoYXJCdWZmZXIoZGVsb2JqLCAmZGVsX3RhYmxlLCAmZGVsbGVuKSkKLQkJCXJldHVybiBOVUxMOwotCX0KLQllbHNlIHsKLQkJZGVsX3RhYmxlID0gTlVMTDsKLQkJZGVsbGVuID0gMDsKLQl9CisgICAgICAgIGVsc2UgaWYgKFB5T2JqZWN0X0FzQ2hhckJ1ZmZlcihkZWxvYmosICZkZWxfdGFibGUsICZkZWxsZW4pKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBkZWxfdGFibGUgPSBOVUxMOworICAgICAgICBkZWxsZW4gPSAwOworICAgIH0KIAotCWlubGVuID0gUHlTdHJpbmdfR0VUX1NJWkUoaW5wdXRfb2JqKTsKLQlyZXN1bHQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKU5VTEwsIGlubGVuKTsKLQlpZiAocmVzdWx0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCW91dHB1dF9zdGFydCA9IG91dHB1dCA9IFB5U3RyaW5nX0FzU3RyaW5nKHJlc3VsdCk7Ci0JaW5wdXQgPSBQeVN0cmluZ19BU19TVFJJTkcoaW5wdXRfb2JqKTsKKyAgICBpbmxlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKGlucHV0X29iaik7CisgICAgcmVzdWx0ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilOVUxMLCBpbmxlbik7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBvdXRwdXRfc3RhcnQgPSBvdXRwdXQgPSBQeVN0cmluZ19Bc1N0cmluZyhyZXN1bHQpOworICAgIGlucHV0ID0gUHlTdHJpbmdfQVNfU1RSSU5HKGlucHV0X29iaik7CiAKLQlpZiAoZGVsbGVuID09IDAgJiYgdGFibGUgIT0gTlVMTCkgewotCQkvKiBJZiBubyBkZWxldGlvbnMgYXJlIHJlcXVpcmVkLCB1c2UgZmFzdGVyIGNvZGUgKi8KLQkJZm9yIChpID0gaW5sZW47IC0taSA+PSAwOyApIHsKLQkJCWMgPSBQeV9DSEFSTUFTSygqaW5wdXQrKyk7Ci0JCQlpZiAoUHlfQ0hBUk1BU0soKCpvdXRwdXQrKyA9IHRhYmxlW2NdKSkgIT0gYykKLQkJCQljaGFuZ2VkID0gMTsKLQkJfQotCQlpZiAoY2hhbmdlZCB8fCAhUHlTdHJpbmdfQ2hlY2tFeGFjdChpbnB1dF9vYmopKQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCVB5X0lOQ1JFRihpbnB1dF9vYmopOwotCQlyZXR1cm4gaW5wdXRfb2JqOwotCX0KKyAgICBpZiAoZGVsbGVuID09IDAgJiYgdGFibGUgIT0gTlVMTCkgeworICAgICAgICAvKiBJZiBubyBkZWxldGlvbnMgYXJlIHJlcXVpcmVkLCB1c2UgZmFzdGVyIGNvZGUgKi8KKyAgICAgICAgZm9yIChpID0gaW5sZW47IC0taSA+PSAwOyApIHsKKyAgICAgICAgICAgIGMgPSBQeV9DSEFSTUFTSygqaW5wdXQrKyk7CisgICAgICAgICAgICBpZiAoUHlfQ0hBUk1BU0soKCpvdXRwdXQrKyA9IHRhYmxlW2NdKSkgIT0gYykKKyAgICAgICAgICAgICAgICBjaGFuZ2VkID0gMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2hhbmdlZCB8fCAhUHlTdHJpbmdfQ2hlY2tFeGFjdChpbnB1dF9vYmopKQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgIFB5X0lOQ1JFRihpbnB1dF9vYmopOworICAgICAgICByZXR1cm4gaW5wdXRfb2JqOworICAgIH0KIAotCWlmICh0YWJsZSA9PSBOVUxMKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKLQkJCXRyYW5zX3RhYmxlW2ldID0gUHlfQ0hBUk1BU0soaSk7Ci0JfSBlbHNlIHsKLQkJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQotCQkJdHJhbnNfdGFibGVbaV0gPSBQeV9DSEFSTUFTSyh0YWJsZVtpXSk7Ci0JfQorICAgIGlmICh0YWJsZSA9PSBOVUxMKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKKyAgICAgICAgICAgIHRyYW5zX3RhYmxlW2ldID0gUHlfQ0hBUk1BU0soaSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQorICAgICAgICAgICAgdHJhbnNfdGFibGVbaV0gPSBQeV9DSEFSTUFTSyh0YWJsZVtpXSk7CisgICAgfQogCi0JZm9yIChpID0gMDsgaSA8IGRlbGxlbjsgaSsrKQotCQl0cmFuc190YWJsZVsoaW50KSBQeV9DSEFSTUFTSyhkZWxfdGFibGVbaV0pXSA9IC0xOworICAgIGZvciAoaSA9IDA7IGkgPCBkZWxsZW47IGkrKykKKyAgICAgICAgdHJhbnNfdGFibGVbKGludCkgUHlfQ0hBUk1BU0soZGVsX3RhYmxlW2ldKV0gPSAtMTsKIAotCWZvciAoaSA9IGlubGVuOyAtLWkgPj0gMDsgKSB7Ci0JCWMgPSBQeV9DSEFSTUFTSygqaW5wdXQrKyk7Ci0JCWlmICh0cmFuc190YWJsZVtjXSAhPSAtMSkKLQkJCWlmIChQeV9DSEFSTUFTSygqb3V0cHV0KysgPSAoY2hhcil0cmFuc190YWJsZVtjXSkgPT0gYykKLQkJCQljb250aW51ZTsKLQkJY2hhbmdlZCA9IDE7Ci0JfQotCWlmICghY2hhbmdlZCAmJiBQeVN0cmluZ19DaGVja0V4YWN0KGlucHV0X29iaikpIHsKLQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCVB5X0lOQ1JFRihpbnB1dF9vYmopOwotCQlyZXR1cm4gaW5wdXRfb2JqOwotCX0KLQkvKiBGaXggdGhlIHNpemUgb2YgdGhlIHJlc3VsdGluZyBzdHJpbmcgKi8KLQlpZiAoaW5sZW4gPiAwKQotCQlfUHlTdHJpbmdfUmVzaXplKCZyZXN1bHQsIG91dHB1dCAtIG91dHB1dF9zdGFydCk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBmb3IgKGkgPSBpbmxlbjsgLS1pID49IDA7ICkgeworICAgICAgICBjID0gUHlfQ0hBUk1BU0soKmlucHV0KyspOworICAgICAgICBpZiAodHJhbnNfdGFibGVbY10gIT0gLTEpCisgICAgICAgICAgICBpZiAoUHlfQ0hBUk1BU0soKm91dHB1dCsrID0gKGNoYXIpdHJhbnNfdGFibGVbY10pID09IGMpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGNoYW5nZWQgPSAxOworICAgIH0KKyAgICBpZiAoIWNoYW5nZWQgJiYgUHlTdHJpbmdfQ2hlY2tFeGFjdChpbnB1dF9vYmopKSB7CisgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICBQeV9JTkNSRUYoaW5wdXRfb2JqKTsKKyAgICAgICAgcmV0dXJuIGlucHV0X29iajsKKyAgICB9CisgICAgLyogRml4IHRoZSBzaXplIG9mIHRoZSByZXN1bHRpbmcgc3RyaW5nICovCisgICAgaWYgKGlubGVuID4gMCkKKyAgICAgICAgX1B5U3RyaW5nX1Jlc2l6ZSgmcmVzdWx0LCBvdXRwdXQgLSBvdXRwdXRfc3RhcnQpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIApAQCAtMjU1NCw3ICsyNTU0LDcgQEAKIAogLyogZmluZCBhbmQgY291bnQgY2hhcmFjdGVycyBhbmQgc3Vic3RyaW5ncyAqLwogCi0jZGVmaW5lIGZpbmRjaGFyKHRhcmdldCwgdGFyZ2V0X2xlbiwgYykJCQkJXAorI2RlZmluZSBmaW5kY2hhcih0YXJnZXQsIHRhcmdldF9sZW4sIGMpICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgKChjaGFyICopbWVtY2hyKChjb25zdCB2b2lkICopKHRhcmdldCksIGMsIHRhcmdldF9sZW4pKQogCiAvKiBTdHJpbmcgb3BzIG11c3QgcmV0dXJuIGEgc3RyaW5nLiAgKi8KQEAgLTI1NjIsMTE2ICsyNTYyLDExNiBAQAogUHlfTE9DQUwoUHlTdHJpbmdPYmplY3QgKikKIHJldHVybl9zZWxmKFB5U3RyaW5nT2JqZWN0ICpzZWxmKQogewotCWlmIChQeVN0cmluZ19DaGVja0V4YWN0KHNlbGYpKSB7Ci0JCVB5X0lOQ1JFRihzZWxmKTsKLQkJcmV0dXJuIHNlbGY7Ci0JfQotCXJldHVybiAoUHlTdHJpbmdPYmplY3QgKilQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgKLQkJUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpLAotCQlQeVN0cmluZ19HRVRfU0laRShzZWxmKSk7CisgICAgaWYgKFB5U3RyaW5nX0NoZWNrRXhhY3Qoc2VsZikpIHsKKyAgICAgICAgUHlfSU5DUkVGKHNlbGYpOworICAgICAgICByZXR1cm4gc2VsZjsKKyAgICB9CisgICAgcmV0dXJuIChQeVN0cmluZ09iamVjdCAqKVB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKAorICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcoc2VsZiksCisgICAgICAgIFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpKTsKIH0KIAogUHlfTE9DQUxfSU5MSU5FKFB5X3NzaXplX3QpCiBjb3VudGNoYXIoY29uc3QgY2hhciAqdGFyZ2V0LCBpbnQgdGFyZ2V0X2xlbiwgY2hhciBjLCBQeV9zc2l6ZV90IG1heGNvdW50KQogewotCVB5X3NzaXplX3QgY291bnQ9MDsKLQljb25zdCBjaGFyICpzdGFydD10YXJnZXQ7Ci0JY29uc3QgY2hhciAqZW5kPXRhcmdldCt0YXJnZXRfbGVuOworICAgIFB5X3NzaXplX3QgY291bnQ9MDsKKyAgICBjb25zdCBjaGFyICpzdGFydD10YXJnZXQ7CisgICAgY29uc3QgY2hhciAqZW5kPXRhcmdldCt0YXJnZXRfbGVuOwogCi0Jd2hpbGUgKCAoc3RhcnQ9ZmluZGNoYXIoc3RhcnQsIGVuZC1zdGFydCwgYykpICE9IE5VTEwgKSB7Ci0JCWNvdW50Kys7Ci0JCWlmIChjb3VudCA+PSBtYXhjb3VudCkKLQkJCWJyZWFrOwotCQlzdGFydCArPSAxOwotCX0KLQlyZXR1cm4gY291bnQ7CisgICAgd2hpbGUgKCAoc3RhcnQ9ZmluZGNoYXIoc3RhcnQsIGVuZC1zdGFydCwgYykpICE9IE5VTEwgKSB7CisgICAgICAgIGNvdW50Kys7CisgICAgICAgIGlmIChjb3VudCA+PSBtYXhjb3VudCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBzdGFydCArPSAxOworICAgIH0KKyAgICByZXR1cm4gY291bnQ7CiB9CiAKIFB5X0xPQ0FMKFB5X3NzaXplX3QpCiBmaW5kc3RyaW5nKGNvbnN0IGNoYXIgKnRhcmdldCwgUHlfc3NpemVfdCB0YXJnZXRfbGVuLAotCSAgIGNvbnN0IGNoYXIgKnBhdHRlcm4sIFB5X3NzaXplX3QgcGF0dGVybl9sZW4sCi0JICAgUHlfc3NpemVfdCBzdGFydCwKLQkgICBQeV9zc2l6ZV90IGVuZCwKLQkgICBpbnQgZGlyZWN0aW9uKQorICAgICAgICAgICBjb25zdCBjaGFyICpwYXR0ZXJuLCBQeV9zc2l6ZV90IHBhdHRlcm5fbGVuLAorICAgICAgICAgICBQeV9zc2l6ZV90IHN0YXJ0LAorICAgICAgICAgICBQeV9zc2l6ZV90IGVuZCwKKyAgICAgICAgICAgaW50IGRpcmVjdGlvbikKIHsKLQlpZiAoc3RhcnQgPCAwKSB7Ci0JCXN0YXJ0ICs9IHRhcmdldF9sZW47Ci0JCWlmIChzdGFydCA8IDApCi0JCQlzdGFydCA9IDA7Ci0JfQotCWlmIChlbmQgPiB0YXJnZXRfbGVuKSB7Ci0JCWVuZCA9IHRhcmdldF9sZW47Ci0JfSBlbHNlIGlmIChlbmQgPCAwKSB7Ci0JCWVuZCArPSB0YXJnZXRfbGVuOwotCQlpZiAoZW5kIDwgMCkKLQkJCWVuZCA9IDA7Ci0JfQorICAgIGlmIChzdGFydCA8IDApIHsKKyAgICAgICAgc3RhcnQgKz0gdGFyZ2V0X2xlbjsKKyAgICAgICAgaWYgKHN0YXJ0IDwgMCkKKyAgICAgICAgICAgIHN0YXJ0ID0gMDsKKyAgICB9CisgICAgaWYgKGVuZCA+IHRhcmdldF9sZW4pIHsKKyAgICAgICAgZW5kID0gdGFyZ2V0X2xlbjsKKyAgICB9IGVsc2UgaWYgKGVuZCA8IDApIHsKKyAgICAgICAgZW5kICs9IHRhcmdldF9sZW47CisgICAgICAgIGlmIChlbmQgPCAwKQorICAgICAgICAgICAgZW5kID0gMDsKKyAgICB9CiAKLQkvKiB6ZXJvLWxlbmd0aCBzdWJzdHJpbmdzIGFsd2F5cyBtYXRjaCBhdCB0aGUgZmlyc3QgYXR0ZW1wdCAqLwotCWlmIChwYXR0ZXJuX2xlbiA9PSAwKQotCQlyZXR1cm4gKGRpcmVjdGlvbiA+IDApID8gc3RhcnQgOiBlbmQ7CisgICAgLyogemVyby1sZW5ndGggc3Vic3RyaW5ncyBhbHdheXMgbWF0Y2ggYXQgdGhlIGZpcnN0IGF0dGVtcHQgKi8KKyAgICBpZiAocGF0dGVybl9sZW4gPT0gMCkKKyAgICAgICAgcmV0dXJuIChkaXJlY3Rpb24gPiAwKSA/IHN0YXJ0IDogZW5kOwogCi0JZW5kIC09IHBhdHRlcm5fbGVuOworICAgIGVuZCAtPSBwYXR0ZXJuX2xlbjsKIAotCWlmIChkaXJlY3Rpb24gPCAwKSB7Ci0JCWZvciAoOyBlbmQgPj0gc3RhcnQ7IGVuZC0tKQotCQkJaWYgKFB5X1NUUklOR19NQVRDSCh0YXJnZXQsIGVuZCwgcGF0dGVybiwgcGF0dGVybl9sZW4pKQotCQkJCXJldHVybiBlbmQ7Ci0JfSBlbHNlIHsKLQkJZm9yICg7IHN0YXJ0IDw9IGVuZDsgc3RhcnQrKykKLQkJCWlmIChQeV9TVFJJTkdfTUFUQ0godGFyZ2V0LCBzdGFydCwgcGF0dGVybiwgcGF0dGVybl9sZW4pKQotCQkJCXJldHVybiBzdGFydDsKLQl9Ci0JcmV0dXJuIC0xOworICAgIGlmIChkaXJlY3Rpb24gPCAwKSB7CisgICAgICAgIGZvciAoOyBlbmQgPj0gc3RhcnQ7IGVuZC0tKQorICAgICAgICAgICAgaWYgKFB5X1NUUklOR19NQVRDSCh0YXJnZXQsIGVuZCwgcGF0dGVybiwgcGF0dGVybl9sZW4pKQorICAgICAgICAgICAgICAgIHJldHVybiBlbmQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yICg7IHN0YXJ0IDw9IGVuZDsgc3RhcnQrKykKKyAgICAgICAgICAgIGlmIChQeV9TVFJJTkdfTUFUQ0godGFyZ2V0LCBzdGFydCwgcGF0dGVybiwgcGF0dGVybl9sZW4pKQorICAgICAgICAgICAgICAgIHJldHVybiBzdGFydDsKKyAgICB9CisgICAgcmV0dXJuIC0xOwogfQogCiBQeV9MT0NBTF9JTkxJTkUoUHlfc3NpemVfdCkKIGNvdW50c3RyaW5nKGNvbnN0IGNoYXIgKnRhcmdldCwgUHlfc3NpemVfdCB0YXJnZXRfbGVuLAotCSAgICBjb25zdCBjaGFyICpwYXR0ZXJuLCBQeV9zc2l6ZV90IHBhdHRlcm5fbGVuLAotCSAgICBQeV9zc2l6ZV90IHN0YXJ0LAotCSAgICBQeV9zc2l6ZV90IGVuZCwKLQkgICAgaW50IGRpcmVjdGlvbiwgUHlfc3NpemVfdCBtYXhjb3VudCkKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBhdHRlcm4sIFB5X3NzaXplX3QgcGF0dGVybl9sZW4sCisgICAgICAgICAgICBQeV9zc2l6ZV90IHN0YXJ0LAorICAgICAgICAgICAgUHlfc3NpemVfdCBlbmQsCisgICAgICAgICAgICBpbnQgZGlyZWN0aW9uLCBQeV9zc2l6ZV90IG1heGNvdW50KQogewotCVB5X3NzaXplX3QgY291bnQ9MDsKKyAgICBQeV9zc2l6ZV90IGNvdW50PTA7CiAKLQlpZiAoc3RhcnQgPCAwKSB7Ci0JCXN0YXJ0ICs9IHRhcmdldF9sZW47Ci0JCWlmIChzdGFydCA8IDApCi0JCQlzdGFydCA9IDA7Ci0JfQotCWlmIChlbmQgPiB0YXJnZXRfbGVuKSB7Ci0JCWVuZCA9IHRhcmdldF9sZW47Ci0JfSBlbHNlIGlmIChlbmQgPCAwKSB7Ci0JCWVuZCArPSB0YXJnZXRfbGVuOwotCQlpZiAoZW5kIDwgMCkKLQkJCWVuZCA9IDA7Ci0JfQorICAgIGlmIChzdGFydCA8IDApIHsKKyAgICAgICAgc3RhcnQgKz0gdGFyZ2V0X2xlbjsKKyAgICAgICAgaWYgKHN0YXJ0IDwgMCkKKyAgICAgICAgICAgIHN0YXJ0ID0gMDsKKyAgICB9CisgICAgaWYgKGVuZCA+IHRhcmdldF9sZW4pIHsKKyAgICAgICAgZW5kID0gdGFyZ2V0X2xlbjsKKyAgICB9IGVsc2UgaWYgKGVuZCA8IDApIHsKKyAgICAgICAgZW5kICs9IHRhcmdldF9sZW47CisgICAgICAgIGlmIChlbmQgPCAwKQorICAgICAgICAgICAgZW5kID0gMDsKKyAgICB9CiAKLQkvKiB6ZXJvLWxlbmd0aCBzdWJzdHJpbmdzIG1hdGNoIGV2ZXJ5d2hlcmUgKi8KLQlpZiAocGF0dGVybl9sZW4gPT0gMCB8fCBtYXhjb3VudCA9PSAwKSB7Ci0JCWlmICh0YXJnZXRfbGVuKzEgPCBtYXhjb3VudCkKLQkJCXJldHVybiB0YXJnZXRfbGVuKzE7Ci0JCXJldHVybiBtYXhjb3VudDsKLQl9CisgICAgLyogemVyby1sZW5ndGggc3Vic3RyaW5ncyBtYXRjaCBldmVyeXdoZXJlICovCisgICAgaWYgKHBhdHRlcm5fbGVuID09IDAgfHwgbWF4Y291bnQgPT0gMCkgeworICAgICAgICBpZiAodGFyZ2V0X2xlbisxIDwgbWF4Y291bnQpCisgICAgICAgICAgICByZXR1cm4gdGFyZ2V0X2xlbisxOworICAgICAgICByZXR1cm4gbWF4Y291bnQ7CisgICAgfQogCi0JZW5kIC09IHBhdHRlcm5fbGVuOwotCWlmIChkaXJlY3Rpb24gPCAwKSB7Ci0JCWZvciAoOyAoZW5kID49IHN0YXJ0KTsgZW5kLS0pCi0JCQlpZiAoUHlfU1RSSU5HX01BVENIKHRhcmdldCwgZW5kLCBwYXR0ZXJuLCBwYXR0ZXJuX2xlbikpIHsKLQkJCQljb3VudCsrOwotCQkJCWlmICgtLW1heGNvdW50IDw9IDApIGJyZWFrOwotCQkJCWVuZCAtPSBwYXR0ZXJuX2xlbi0xOwotCQkJfQotCX0gZWxzZSB7Ci0JCWZvciAoOyAoc3RhcnQgPD0gZW5kKTsgc3RhcnQrKykKLQkJCWlmIChQeV9TVFJJTkdfTUFUQ0godGFyZ2V0LCBzdGFydCwgcGF0dGVybiwgcGF0dGVybl9sZW4pKSB7Ci0JCQkJY291bnQrKzsKLQkJCQlpZiAoLS1tYXhjb3VudCA8PSAwKQotCQkJCQlicmVhazsKLQkJCQlzdGFydCArPSBwYXR0ZXJuX2xlbi0xOwotCQkJfQotCX0KLQlyZXR1cm4gY291bnQ7CisgICAgZW5kIC09IHBhdHRlcm5fbGVuOworICAgIGlmIChkaXJlY3Rpb24gPCAwKSB7CisgICAgICAgIGZvciAoOyAoZW5kID49IHN0YXJ0KTsgZW5kLS0pCisgICAgICAgICAgICBpZiAoUHlfU1RSSU5HX01BVENIKHRhcmdldCwgZW5kLCBwYXR0ZXJuLCBwYXR0ZXJuX2xlbikpIHsKKyAgICAgICAgICAgICAgICBjb3VudCsrOworICAgICAgICAgICAgICAgIGlmICgtLW1heGNvdW50IDw9IDApIGJyZWFrOworICAgICAgICAgICAgICAgIGVuZCAtPSBwYXR0ZXJuX2xlbi0xOworICAgICAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoOyAoc3RhcnQgPD0gZW5kKTsgc3RhcnQrKykKKyAgICAgICAgICAgIGlmIChQeV9TVFJJTkdfTUFUQ0godGFyZ2V0LCBzdGFydCwgcGF0dGVybiwgcGF0dGVybl9sZW4pKSB7CisgICAgICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgICAgICAgICBpZiAoLS1tYXhjb3VudCA8PSAwKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBzdGFydCArPSBwYXR0ZXJuX2xlbi0xOworICAgICAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gY291bnQ7CiB9CiAKIApAQCAtMjY4MCw0NjAgKzI2ODAsNDYwIEBACiAvKiBsZW4oc2VsZik+PTEsIGZyb209IiIsIGxlbih0byk+PTEsIG1heGNvdW50Pj0xICovCiBQeV9MT0NBTChQeVN0cmluZ09iamVjdCAqKQogcmVwbGFjZV9pbnRlcmxlYXZlKFB5U3RyaW5nT2JqZWN0ICpzZWxmLAotCQkgICBjb25zdCBjaGFyICp0b19zLCBQeV9zc2l6ZV90IHRvX2xlbiwKLQkJICAgUHlfc3NpemVfdCBtYXhjb3VudCkKKyAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp0b19zLCBQeV9zc2l6ZV90IHRvX2xlbiwKKyAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IG1heGNvdW50KQogewotCWNoYXIgKnNlbGZfcywgKnJlc3VsdF9zOwotCVB5X3NzaXplX3Qgc2VsZl9sZW4sIHJlc3VsdF9sZW47Ci0JUHlfc3NpemVfdCBjb3VudCwgaSwgcHJvZHVjdDsKLQlQeVN0cmluZ09iamVjdCAqcmVzdWx0OworICAgIGNoYXIgKnNlbGZfcywgKnJlc3VsdF9zOworICAgIFB5X3NzaXplX3Qgc2VsZl9sZW4sIHJlc3VsdF9sZW47CisgICAgUHlfc3NpemVfdCBjb3VudCwgaSwgcHJvZHVjdDsKKyAgICBQeVN0cmluZ09iamVjdCAqcmVzdWx0OwogCi0Jc2VsZl9sZW4gPSBQeVN0cmluZ19HRVRfU0laRShzZWxmKTsKKyAgICBzZWxmX2xlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpOwogCi0JLyogMSBhdCB0aGUgZW5kIHBsdXMgMSBhZnRlciBldmVyeSBjaGFyYWN0ZXIgKi8KLQljb3VudCA9IHNlbGZfbGVuKzE7Ci0JaWYgKG1heGNvdW50IDwgY291bnQpIAotCQljb3VudCA9IG1heGNvdW50OworICAgIC8qIDEgYXQgdGhlIGVuZCBwbHVzIDEgYWZ0ZXIgZXZlcnkgY2hhcmFjdGVyICovCisgICAgY291bnQgPSBzZWxmX2xlbisxOworICAgIGlmIChtYXhjb3VudCA8IGNvdW50KQorICAgICAgICBjb3VudCA9IG1heGNvdW50OwogCi0JLyogQ2hlY2sgZm9yIG92ZXJmbG93ICovCi0JLyogICByZXN1bHRfbGVuID0gY291bnQgKiB0b19sZW4gKyBzZWxmX2xlbjsgKi8KLQlwcm9kdWN0ID0gY291bnQgKiB0b19sZW47Ci0JaWYgKHByb2R1Y3QgLyB0b19sZW4gIT0gY291bnQpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0JCQkJInJlcGxhY2Ugc3RyaW5nIGlzIHRvbyBsb25nIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXN1bHRfbGVuID0gcHJvZHVjdCArIHNlbGZfbGVuOwotCWlmIChyZXN1bHRfbGVuIDwgMCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJCQkicmVwbGFjZSBzdHJpbmcgaXMgdG9vIGxvbmciKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotICAKLQlpZiAoISAocmVzdWx0ID0gKFB5U3RyaW5nT2JqZWN0ICopCi0JICAgICAgICAgICAgICAgICBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCByZXN1bHRfbGVuKSkgKQotCQlyZXR1cm4gTlVMTDsKKyAgICAvKiBDaGVjayBmb3Igb3ZlcmZsb3cgKi8KKyAgICAvKiAgIHJlc3VsdF9sZW4gPSBjb3VudCAqIHRvX2xlbiArIHNlbGZfbGVuOyAqLworICAgIHByb2R1Y3QgPSBjb3VudCAqIHRvX2xlbjsKKyAgICBpZiAocHJvZHVjdCAvIHRvX2xlbiAhPSBjb3VudCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJyZXBsYWNlIHN0cmluZyBpcyB0b28gbG9uZyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmVzdWx0X2xlbiA9IHByb2R1Y3QgKyBzZWxmX2xlbjsKKyAgICBpZiAocmVzdWx0X2xlbiA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAicmVwbGFjZSBzdHJpbmcgaXMgdG9vIGxvbmciKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0Jc2VsZl9zID0gUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpOwotCXJlc3VsdF9zID0gUHlTdHJpbmdfQVNfU1RSSU5HKHJlc3VsdCk7CisgICAgaWYgKCEgKHJlc3VsdCA9IChQeVN0cmluZ09iamVjdCAqKQorICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgcmVzdWx0X2xlbikpICkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkvKiBUT0RPOiBzcGVjaWFsIGNhc2Ugc2luZ2xlIGNoYXJhY3Rlciwgd2hpY2ggZG9lc24ndCBuZWVkIG1lbWNweSAqLworICAgIHNlbGZfcyA9IFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKTsKKyAgICByZXN1bHRfcyA9IFB5U3RyaW5nX0FTX1NUUklORyhyZXN1bHQpOwogCi0JLyogTGF5IHRoZSBmaXJzdCBvbmUgZG93biAoZ3VhcmFudGVlZCB0aGlzIHdpbGwgb2NjdXIpICovCi0JUHlfTUVNQ1BZKHJlc3VsdF9zLCB0b19zLCB0b19sZW4pOwotCXJlc3VsdF9zICs9IHRvX2xlbjsKLQljb3VudCAtPSAxOwotICAKLQlmb3IgKGk9MDsgaTxjb3VudDsgaSsrKSB7Ci0JCSpyZXN1bHRfcysrID0gKnNlbGZfcysrOwotCQlQeV9NRU1DUFkocmVzdWx0X3MsIHRvX3MsIHRvX2xlbik7Ci0JCXJlc3VsdF9zICs9IHRvX2xlbjsKLQl9CisgICAgLyogVE9ETzogc3BlY2lhbCBjYXNlIHNpbmdsZSBjaGFyYWN0ZXIsIHdoaWNoIGRvZXNuJ3QgbmVlZCBtZW1jcHkgKi8KIAotCS8qIENvcHkgdGhlIHJlc3Qgb2YgdGhlIG9yaWdpbmFsIHN0cmluZyAqLwotCVB5X01FTUNQWShyZXN1bHRfcywgc2VsZl9zLCBzZWxmX2xlbi1pKTsKKyAgICAvKiBMYXkgdGhlIGZpcnN0IG9uZSBkb3duIChndWFyYW50ZWVkIHRoaXMgd2lsbCBvY2N1cikgKi8KKyAgICBQeV9NRU1DUFkocmVzdWx0X3MsIHRvX3MsIHRvX2xlbik7CisgICAgcmVzdWx0X3MgKz0gdG9fbGVuOworICAgIGNvdW50IC09IDE7CiAKLQlyZXR1cm4gcmVzdWx0OworICAgIGZvciAoaT0wOyBpPGNvdW50OyBpKyspIHsKKyAgICAgICAgKnJlc3VsdF9zKysgPSAqc2VsZl9zKys7CisgICAgICAgIFB5X01FTUNQWShyZXN1bHRfcywgdG9fcywgdG9fbGVuKTsKKyAgICAgICAgcmVzdWx0X3MgKz0gdG9fbGVuOworICAgIH0KKworICAgIC8qIENvcHkgdGhlIHJlc3Qgb2YgdGhlIG9yaWdpbmFsIHN0cmluZyAqLworICAgIFB5X01FTUNQWShyZXN1bHRfcywgc2VsZl9zLCBzZWxmX2xlbi1pKTsKKworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIC8qIFNwZWNpYWwgY2FzZSBmb3IgZGVsZXRpbmcgYSBzaW5nbGUgY2hhcmFjdGVyICovCiAvKiBsZW4oc2VsZik+PTEsIGxlbihmcm9tKT09MSwgdG89IiIsIG1heGNvdW50Pj0xICovCiBQeV9MT0NBTChQeVN0cmluZ09iamVjdCAqKQogcmVwbGFjZV9kZWxldGVfc2luZ2xlX2NoYXJhY3RlcihQeVN0cmluZ09iamVjdCAqc2VsZiwKLQkJCQljaGFyIGZyb21fYywgUHlfc3NpemVfdCBtYXhjb3VudCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBmcm9tX2MsIFB5X3NzaXplX3QgbWF4Y291bnQpCiB7Ci0JY2hhciAqc2VsZl9zLCAqcmVzdWx0X3M7Ci0JY2hhciAqc3RhcnQsICpuZXh0LCAqZW5kOwotCVB5X3NzaXplX3Qgc2VsZl9sZW4sIHJlc3VsdF9sZW47Ci0JUHlfc3NpemVfdCBjb3VudDsKLQlQeVN0cmluZ09iamVjdCAqcmVzdWx0OworICAgIGNoYXIgKnNlbGZfcywgKnJlc3VsdF9zOworICAgIGNoYXIgKnN0YXJ0LCAqbmV4dCwgKmVuZDsKKyAgICBQeV9zc2l6ZV90IHNlbGZfbGVuLCByZXN1bHRfbGVuOworICAgIFB5X3NzaXplX3QgY291bnQ7CisgICAgUHlTdHJpbmdPYmplY3QgKnJlc3VsdDsKIAotCXNlbGZfbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUoc2VsZik7Ci0Jc2VsZl9zID0gUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpOworICAgIHNlbGZfbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUoc2VsZik7CisgICAgc2VsZl9zID0gUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpOwogCi0JY291bnQgPSBjb3VudGNoYXIoc2VsZl9zLCBzZWxmX2xlbiwgZnJvbV9jLCBtYXhjb3VudCk7Ci0JaWYgKGNvdW50ID09IDApIHsKLQkJcmV0dXJuIHJldHVybl9zZWxmKHNlbGYpOwotCX0KLSAgCi0JcmVzdWx0X2xlbiA9IHNlbGZfbGVuIC0gY291bnQ7ICAvKiBmcm9tX2xlbiA9PSAxICovCi0JYXNzZXJ0KHJlc3VsdF9sZW4+PTApOworICAgIGNvdW50ID0gY291bnRjaGFyKHNlbGZfcywgc2VsZl9sZW4sIGZyb21fYywgbWF4Y291bnQpOworICAgIGlmIChjb3VudCA9PSAwKSB7CisgICAgICAgIHJldHVybiByZXR1cm5fc2VsZihzZWxmKTsKKyAgICB9CiAKLQlpZiAoIChyZXN1bHQgPSAoUHlTdHJpbmdPYmplY3QgKikKLQkgICAgICAgICAgICAgICAgUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgcmVzdWx0X2xlbikpID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXJlc3VsdF9zID0gUHlTdHJpbmdfQVNfU1RSSU5HKHJlc3VsdCk7CisgICAgcmVzdWx0X2xlbiA9IHNlbGZfbGVuIC0gY291bnQ7ICAvKiBmcm9tX2xlbiA9PSAxICovCisgICAgYXNzZXJ0KHJlc3VsdF9sZW4+PTApOwogCi0Jc3RhcnQgPSBzZWxmX3M7Ci0JZW5kID0gc2VsZl9zICsgc2VsZl9sZW47Ci0Jd2hpbGUgKGNvdW50LS0gPiAwKSB7Ci0JCW5leHQgPSBmaW5kY2hhcihzdGFydCwgZW5kLXN0YXJ0LCBmcm9tX2MpOwotCQlpZiAobmV4dCA9PSBOVUxMKQotCQkJYnJlYWs7Ci0JCVB5X01FTUNQWShyZXN1bHRfcywgc3RhcnQsIG5leHQtc3RhcnQpOwotCQlyZXN1bHRfcyArPSAobmV4dC1zdGFydCk7Ci0JCXN0YXJ0ID0gbmV4dCsxOwotCX0KLQlQeV9NRU1DUFkocmVzdWx0X3MsIHN0YXJ0LCBlbmQtc3RhcnQpOworICAgIGlmICggKHJlc3VsdCA9IChQeVN0cmluZ09iamVjdCAqKQorICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCByZXN1bHRfbGVuKSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmVzdWx0X3MgPSBQeVN0cmluZ19BU19TVFJJTkcocmVzdWx0KTsKIAotCXJldHVybiByZXN1bHQ7CisgICAgc3RhcnQgPSBzZWxmX3M7CisgICAgZW5kID0gc2VsZl9zICsgc2VsZl9sZW47CisgICAgd2hpbGUgKGNvdW50LS0gPiAwKSB7CisgICAgICAgIG5leHQgPSBmaW5kY2hhcihzdGFydCwgZW5kLXN0YXJ0LCBmcm9tX2MpOworICAgICAgICBpZiAobmV4dCA9PSBOVUxMKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIFB5X01FTUNQWShyZXN1bHRfcywgc3RhcnQsIG5leHQtc3RhcnQpOworICAgICAgICByZXN1bHRfcyArPSAobmV4dC1zdGFydCk7CisgICAgICAgIHN0YXJ0ID0gbmV4dCsxOworICAgIH0KKyAgICBQeV9NRU1DUFkocmVzdWx0X3MsIHN0YXJ0LCBlbmQtc3RhcnQpOworCisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogLyogbGVuKHNlbGYpPj0xLCBsZW4oZnJvbSk+PTIsIHRvPSIiLCBtYXhjb3VudD49MSAqLwogCiBQeV9MT0NBTChQeVN0cmluZ09iamVjdCAqKQogcmVwbGFjZV9kZWxldGVfc3Vic3RyaW5nKFB5U3RyaW5nT2JqZWN0ICpzZWxmLAotCQkJIGNvbnN0IGNoYXIgKmZyb21fcywgUHlfc3NpemVfdCBmcm9tX2xlbiwKLQkJCSBQeV9zc2l6ZV90IG1heGNvdW50KSB7Ci0JY2hhciAqc2VsZl9zLCAqcmVzdWx0X3M7Ci0JY2hhciAqc3RhcnQsICpuZXh0LCAqZW5kOwotCVB5X3NzaXplX3Qgc2VsZl9sZW4sIHJlc3VsdF9sZW47Ci0JUHlfc3NpemVfdCBjb3VudCwgb2Zmc2V0OwotCVB5U3RyaW5nT2JqZWN0ICpyZXN1bHQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZnJvbV9zLCBQeV9zc2l6ZV90IGZyb21fbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgbWF4Y291bnQpIHsKKyAgICBjaGFyICpzZWxmX3MsICpyZXN1bHRfczsKKyAgICBjaGFyICpzdGFydCwgKm5leHQsICplbmQ7CisgICAgUHlfc3NpemVfdCBzZWxmX2xlbiwgcmVzdWx0X2xlbjsKKyAgICBQeV9zc2l6ZV90IGNvdW50LCBvZmZzZXQ7CisgICAgUHlTdHJpbmdPYmplY3QgKnJlc3VsdDsKIAotCXNlbGZfbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUoc2VsZik7Ci0Jc2VsZl9zID0gUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpOworICAgIHNlbGZfbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUoc2VsZik7CisgICAgc2VsZl9zID0gUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpOwogCi0JY291bnQgPSBjb3VudHN0cmluZyhzZWxmX3MsIHNlbGZfbGVuLAotCQkJICAgIGZyb21fcywgZnJvbV9sZW4sCi0JCQkgICAgMCwgc2VsZl9sZW4sIDEsCi0JCQkgICAgbWF4Y291bnQpOworICAgIGNvdW50ID0gY291bnRzdHJpbmcoc2VsZl9zLCBzZWxmX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZyb21fcywgZnJvbV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAwLCBzZWxmX2xlbiwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1heGNvdW50KTsKIAotCWlmIChjb3VudCA9PSAwKSB7Ci0JCS8qIG5vIG1hdGNoZXMgKi8KLQkJcmV0dXJuIHJldHVybl9zZWxmKHNlbGYpOwotCX0KKyAgICBpZiAoY291bnQgPT0gMCkgeworICAgICAgICAvKiBubyBtYXRjaGVzICovCisgICAgICAgIHJldHVybiByZXR1cm5fc2VsZihzZWxmKTsKKyAgICB9CiAKLQlyZXN1bHRfbGVuID0gc2VsZl9sZW4gLSAoY291bnQgKiBmcm9tX2xlbik7Ci0JYXNzZXJ0IChyZXN1bHRfbGVuPj0wKTsKKyAgICByZXN1bHRfbGVuID0gc2VsZl9sZW4gLSAoY291bnQgKiBmcm9tX2xlbik7CisgICAgYXNzZXJ0IChyZXN1bHRfbGVuPj0wKTsKIAotCWlmICggKHJlc3VsdCA9IChQeVN0cmluZ09iamVjdCAqKQotCSAgICAgIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIHJlc3VsdF9sZW4pKSA9PSBOVUxMICkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCAocmVzdWx0ID0gKFB5U3RyaW5nT2JqZWN0ICopCisgICAgICAgICAgUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgcmVzdWx0X2xlbikpID09IE5VTEwgKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXJlc3VsdF9zID0gUHlTdHJpbmdfQVNfU1RSSU5HKHJlc3VsdCk7CisgICAgcmVzdWx0X3MgPSBQeVN0cmluZ19BU19TVFJJTkcocmVzdWx0KTsKIAotCXN0YXJ0ID0gc2VsZl9zOwotCWVuZCA9IHNlbGZfcyArIHNlbGZfbGVuOwotCXdoaWxlIChjb3VudC0tID4gMCkgewotCQlvZmZzZXQgPSBmaW5kc3RyaW5nKHN0YXJ0LCBlbmQtc3RhcnQsCi0JCQkJICAgIGZyb21fcywgZnJvbV9sZW4sCi0JCQkJICAgIDAsIGVuZC1zdGFydCwgRk9SV0FSRCk7Ci0JCWlmIChvZmZzZXQgPT0gLTEpCi0JCQlicmVhazsKLQkJbmV4dCA9IHN0YXJ0ICsgb2Zmc2V0OworICAgIHN0YXJ0ID0gc2VsZl9zOworICAgIGVuZCA9IHNlbGZfcyArIHNlbGZfbGVuOworICAgIHdoaWxlIChjb3VudC0tID4gMCkgeworICAgICAgICBvZmZzZXQgPSBmaW5kc3RyaW5nKHN0YXJ0LCBlbmQtc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbV9zLCBmcm9tX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBlbmQtc3RhcnQsIEZPUldBUkQpOworICAgICAgICBpZiAob2Zmc2V0ID09IC0xKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIG5leHQgPSBzdGFydCArIG9mZnNldDsKIAotCQlQeV9NRU1DUFkocmVzdWx0X3MsIHN0YXJ0LCBuZXh0LXN0YXJ0KTsKKyAgICAgICAgUHlfTUVNQ1BZKHJlc3VsdF9zLCBzdGFydCwgbmV4dC1zdGFydCk7CiAKLQkJcmVzdWx0X3MgKz0gKG5leHQtc3RhcnQpOwotCQlzdGFydCA9IG5leHQrZnJvbV9sZW47Ci0JfQotCVB5X01FTUNQWShyZXN1bHRfcywgc3RhcnQsIGVuZC1zdGFydCk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgcmVzdWx0X3MgKz0gKG5leHQtc3RhcnQpOworICAgICAgICBzdGFydCA9IG5leHQrZnJvbV9sZW47CisgICAgfQorICAgIFB5X01FTUNQWShyZXN1bHRfcywgc3RhcnQsIGVuZC1zdGFydCk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogLyogbGVuKHNlbGYpPj0xLCBsZW4oZnJvbSk9PWxlbih0byk9PTEsIG1heGNvdW50Pj0xICovCiBQeV9MT0NBTChQeVN0cmluZ09iamVjdCAqKQogcmVwbGFjZV9zaW5nbGVfY2hhcmFjdGVyX2luX3BsYWNlKFB5U3RyaW5nT2JqZWN0ICpzZWxmLAotCQkJCSAgY2hhciBmcm9tX2MsIGNoYXIgdG9fYywKLQkJCQkgIFB5X3NzaXplX3QgbWF4Y291bnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBmcm9tX2MsIGNoYXIgdG9fYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IG1heGNvdW50KQogewotCWNoYXIgKnNlbGZfcywgKnJlc3VsdF9zLCAqc3RhcnQsICplbmQsICpuZXh0OwotCVB5X3NzaXplX3Qgc2VsZl9sZW47Ci0JUHlTdHJpbmdPYmplY3QgKnJlc3VsdDsKKyAgICBjaGFyICpzZWxmX3MsICpyZXN1bHRfcywgKnN0YXJ0LCAqZW5kLCAqbmV4dDsKKyAgICBQeV9zc2l6ZV90IHNlbGZfbGVuOworICAgIFB5U3RyaW5nT2JqZWN0ICpyZXN1bHQ7CiAKLQkvKiBUaGUgcmVzdWx0IHN0cmluZyB3aWxsIGJlIHRoZSBzYW1lIHNpemUgKi8KLQlzZWxmX3MgPSBQeVN0cmluZ19BU19TVFJJTkcoc2VsZik7Ci0Jc2VsZl9sZW4gPSBQeVN0cmluZ19HRVRfU0laRShzZWxmKTsKKyAgICAvKiBUaGUgcmVzdWx0IHN0cmluZyB3aWxsIGJlIHRoZSBzYW1lIHNpemUgKi8KKyAgICBzZWxmX3MgPSBQeVN0cmluZ19BU19TVFJJTkcoc2VsZik7CisgICAgc2VsZl9sZW4gPSBQeVN0cmluZ19HRVRfU0laRShzZWxmKTsKIAotCW5leHQgPSBmaW5kY2hhcihzZWxmX3MsIHNlbGZfbGVuLCBmcm9tX2MpOworICAgIG5leHQgPSBmaW5kY2hhcihzZWxmX3MsIHNlbGZfbGVuLCBmcm9tX2MpOwogCi0JaWYgKG5leHQgPT0gTlVMTCkgewotCQkvKiBObyBtYXRjaGVzOyByZXR1cm4gdGhlIG9yaWdpbmFsIHN0cmluZyAqLwotCQlyZXR1cm4gcmV0dXJuX3NlbGYoc2VsZik7Ci0JfQorICAgIGlmIChuZXh0ID09IE5VTEwpIHsKKyAgICAgICAgLyogTm8gbWF0Y2hlczsgcmV0dXJuIHRoZSBvcmlnaW5hbCBzdHJpbmcgKi8KKyAgICAgICAgcmV0dXJuIHJldHVybl9zZWxmKHNlbGYpOworICAgIH0KIAotCS8qIE5lZWQgdG8gbWFrZSBhIG5ldyBzdHJpbmcgKi8KLQlyZXN1bHQgPSAoUHlTdHJpbmdPYmplY3QgKikgUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgc2VsZl9sZW4pOwotCWlmIChyZXN1bHQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JcmVzdWx0X3MgPSBQeVN0cmluZ19BU19TVFJJTkcocmVzdWx0KTsKLQlQeV9NRU1DUFkocmVzdWx0X3MsIHNlbGZfcywgc2VsZl9sZW4pOworICAgIC8qIE5lZWQgdG8gbWFrZSBhIG5ldyBzdHJpbmcgKi8KKyAgICByZXN1bHQgPSAoUHlTdHJpbmdPYmplY3QgKikgUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgc2VsZl9sZW4pOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmVzdWx0X3MgPSBQeVN0cmluZ19BU19TVFJJTkcocmVzdWx0KTsKKyAgICBQeV9NRU1DUFkocmVzdWx0X3MsIHNlbGZfcywgc2VsZl9sZW4pOwogCi0JLyogY2hhbmdlIGV2ZXJ5dGhpbmcgaW4tcGxhY2UsIHN0YXJ0aW5nIHdpdGggdGhpcyBvbmUgKi8KLQlzdGFydCA9ICByZXN1bHRfcyArIChuZXh0LXNlbGZfcyk7Ci0JKnN0YXJ0ID0gdG9fYzsKLQlzdGFydCsrOwotCWVuZCA9IHJlc3VsdF9zICsgc2VsZl9sZW47CisgICAgLyogY2hhbmdlIGV2ZXJ5dGhpbmcgaW4tcGxhY2UsIHN0YXJ0aW5nIHdpdGggdGhpcyBvbmUgKi8KKyAgICBzdGFydCA9ICByZXN1bHRfcyArIChuZXh0LXNlbGZfcyk7CisgICAgKnN0YXJ0ID0gdG9fYzsKKyAgICBzdGFydCsrOworICAgIGVuZCA9IHJlc3VsdF9zICsgc2VsZl9sZW47CiAKLQl3aGlsZSAoLS1tYXhjb3VudCA+IDApIHsKLQkJbmV4dCA9IGZpbmRjaGFyKHN0YXJ0LCBlbmQtc3RhcnQsIGZyb21fYyk7Ci0JCWlmIChuZXh0ID09IE5VTEwpCi0JCQlicmVhazsKLQkJKm5leHQgPSB0b19jOwotCQlzdGFydCA9IG5leHQrMTsKLQl9CisgICAgd2hpbGUgKC0tbWF4Y291bnQgPiAwKSB7CisgICAgICAgIG5leHQgPSBmaW5kY2hhcihzdGFydCwgZW5kLXN0YXJ0LCBmcm9tX2MpOworICAgICAgICBpZiAobmV4dCA9PSBOVUxMKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICpuZXh0ID0gdG9fYzsKKyAgICAgICAgc3RhcnQgPSBuZXh0KzE7CisgICAgfQogCi0JcmV0dXJuIHJlc3VsdDsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiAvKiBsZW4oc2VsZik+PTEsIGxlbihmcm9tKT09bGVuKHRvKT49MiwgbWF4Y291bnQ+PTEgKi8KIFB5X0xPQ0FMKFB5U3RyaW5nT2JqZWN0ICopCiByZXBsYWNlX3N1YnN0cmluZ19pbl9wbGFjZShQeVN0cmluZ09iamVjdCAqc2VsZiwKLQkJCSAgIGNvbnN0IGNoYXIgKmZyb21fcywgUHlfc3NpemVfdCBmcm9tX2xlbiwKLQkJCSAgIGNvbnN0IGNoYXIgKnRvX3MsIFB5X3NzaXplX3QgdG9fbGVuLAotCQkJICAgUHlfc3NpemVfdCBtYXhjb3VudCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZyb21fcywgUHlfc3NpemVfdCBmcm9tX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnRvX3MsIFB5X3NzaXplX3QgdG9fbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBtYXhjb3VudCkKIHsKLQljaGFyICpyZXN1bHRfcywgKnN0YXJ0LCAqZW5kOwotCWNoYXIgKnNlbGZfczsKLQlQeV9zc2l6ZV90IHNlbGZfbGVuLCBvZmZzZXQ7Ci0JUHlTdHJpbmdPYmplY3QgKnJlc3VsdDsKKyAgICBjaGFyICpyZXN1bHRfcywgKnN0YXJ0LCAqZW5kOworICAgIGNoYXIgKnNlbGZfczsKKyAgICBQeV9zc2l6ZV90IHNlbGZfbGVuLCBvZmZzZXQ7CisgICAgUHlTdHJpbmdPYmplY3QgKnJlc3VsdDsKIAotCS8qIFRoZSByZXN1bHQgc3RyaW5nIHdpbGwgYmUgdGhlIHNhbWUgc2l6ZSAqLworICAgIC8qIFRoZSByZXN1bHQgc3RyaW5nIHdpbGwgYmUgdGhlIHNhbWUgc2l6ZSAqLwogCi0Jc2VsZl9zID0gUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpOwotCXNlbGZfbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUoc2VsZik7CisgICAgc2VsZl9zID0gUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpOworICAgIHNlbGZfbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUoc2VsZik7CiAKLQlvZmZzZXQgPSBmaW5kc3RyaW5nKHNlbGZfcywgc2VsZl9sZW4sCi0JCQkgICAgZnJvbV9zLCBmcm9tX2xlbiwKLQkJCSAgICAwLCBzZWxmX2xlbiwgRk9SV0FSRCk7Ci0JaWYgKG9mZnNldCA9PSAtMSkgewotCQkvKiBObyBtYXRjaGVzOyByZXR1cm4gdGhlIG9yaWdpbmFsIHN0cmluZyAqLwotCQlyZXR1cm4gcmV0dXJuX3NlbGYoc2VsZik7Ci0JfQorICAgIG9mZnNldCA9IGZpbmRzdHJpbmcoc2VsZl9zLCBzZWxmX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZyb21fcywgZnJvbV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAwLCBzZWxmX2xlbiwgRk9SV0FSRCk7CisgICAgaWYgKG9mZnNldCA9PSAtMSkgeworICAgICAgICAvKiBObyBtYXRjaGVzOyByZXR1cm4gdGhlIG9yaWdpbmFsIHN0cmluZyAqLworICAgICAgICByZXR1cm4gcmV0dXJuX3NlbGYoc2VsZik7CisgICAgfQogCi0JLyogTmVlZCB0byBtYWtlIGEgbmV3IHN0cmluZyAqLwotCXJlc3VsdCA9IChQeVN0cmluZ09iamVjdCAqKSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBzZWxmX2xlbik7Ci0JaWYgKHJlc3VsdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlyZXN1bHRfcyA9IFB5U3RyaW5nX0FTX1NUUklORyhyZXN1bHQpOwotCVB5X01FTUNQWShyZXN1bHRfcywgc2VsZl9zLCBzZWxmX2xlbik7CisgICAgLyogTmVlZCB0byBtYWtlIGEgbmV3IHN0cmluZyAqLworICAgIHJlc3VsdCA9IChQeVN0cmluZ09iamVjdCAqKSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBzZWxmX2xlbik7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXN1bHRfcyA9IFB5U3RyaW5nX0FTX1NUUklORyhyZXN1bHQpOworICAgIFB5X01FTUNQWShyZXN1bHRfcywgc2VsZl9zLCBzZWxmX2xlbik7CiAKLQkvKiBjaGFuZ2UgZXZlcnl0aGluZyBpbi1wbGFjZSwgc3RhcnRpbmcgd2l0aCB0aGlzIG9uZSAqLwotCXN0YXJ0ID0gIHJlc3VsdF9zICsgb2Zmc2V0OwotCVB5X01FTUNQWShzdGFydCwgdG9fcywgZnJvbV9sZW4pOwotCXN0YXJ0ICs9IGZyb21fbGVuOwotCWVuZCA9IHJlc3VsdF9zICsgc2VsZl9sZW47CisgICAgLyogY2hhbmdlIGV2ZXJ5dGhpbmcgaW4tcGxhY2UsIHN0YXJ0aW5nIHdpdGggdGhpcyBvbmUgKi8KKyAgICBzdGFydCA9ICByZXN1bHRfcyArIG9mZnNldDsKKyAgICBQeV9NRU1DUFkoc3RhcnQsIHRvX3MsIGZyb21fbGVuKTsKKyAgICBzdGFydCArPSBmcm9tX2xlbjsKKyAgICBlbmQgPSByZXN1bHRfcyArIHNlbGZfbGVuOwogCi0Jd2hpbGUgKCAtLW1heGNvdW50ID4gMCkgewotCQlvZmZzZXQgPSBmaW5kc3RyaW5nKHN0YXJ0LCBlbmQtc3RhcnQsCi0JCQkJICAgIGZyb21fcywgZnJvbV9sZW4sCi0JCQkJICAgIDAsIGVuZC1zdGFydCwgRk9SV0FSRCk7Ci0JCWlmIChvZmZzZXQ9PS0xKQotCQkJYnJlYWs7Ci0JCVB5X01FTUNQWShzdGFydCtvZmZzZXQsIHRvX3MsIGZyb21fbGVuKTsKLQkJc3RhcnQgKz0gb2Zmc2V0K2Zyb21fbGVuOwotCX0KKyAgICB3aGlsZSAoIC0tbWF4Y291bnQgPiAwKSB7CisgICAgICAgIG9mZnNldCA9IGZpbmRzdHJpbmcoc3RhcnQsIGVuZC1zdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tX3MsIGZyb21fbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIGVuZC1zdGFydCwgRk9SV0FSRCk7CisgICAgICAgIGlmIChvZmZzZXQ9PS0xKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIFB5X01FTUNQWShzdGFydCtvZmZzZXQsIHRvX3MsIGZyb21fbGVuKTsKKyAgICAgICAgc3RhcnQgKz0gb2Zmc2V0K2Zyb21fbGVuOworICAgIH0KIAotCXJldHVybiByZXN1bHQ7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogLyogbGVuKHNlbGYpPj0xLCBsZW4oZnJvbSk9PTEsIGxlbih0byk+PTIsIG1heGNvdW50Pj0xICovCiBQeV9MT0NBTChQeVN0cmluZ09iamVjdCAqKQogcmVwbGFjZV9zaW5nbGVfY2hhcmFjdGVyKFB5U3RyaW5nT2JqZWN0ICpzZWxmLAotCQkJIGNoYXIgZnJvbV9jLAotCQkJIGNvbnN0IGNoYXIgKnRvX3MsIFB5X3NzaXplX3QgdG9fbGVuLAotCQkJIFB5X3NzaXplX3QgbWF4Y291bnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBmcm9tX2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdG9fcywgUHlfc3NpemVfdCB0b19sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBtYXhjb3VudCkKIHsKLQljaGFyICpzZWxmX3MsICpyZXN1bHRfczsKLQljaGFyICpzdGFydCwgKm5leHQsICplbmQ7Ci0JUHlfc3NpemVfdCBzZWxmX2xlbiwgcmVzdWx0X2xlbjsKLQlQeV9zc2l6ZV90IGNvdW50LCBwcm9kdWN0OwotCVB5U3RyaW5nT2JqZWN0ICpyZXN1bHQ7CisgICAgY2hhciAqc2VsZl9zLCAqcmVzdWx0X3M7CisgICAgY2hhciAqc3RhcnQsICpuZXh0LCAqZW5kOworICAgIFB5X3NzaXplX3Qgc2VsZl9sZW4sIHJlc3VsdF9sZW47CisgICAgUHlfc3NpemVfdCBjb3VudCwgcHJvZHVjdDsKKyAgICBQeVN0cmluZ09iamVjdCAqcmVzdWx0OwogCi0Jc2VsZl9zID0gUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpOwotCXNlbGZfbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUoc2VsZik7CisgICAgc2VsZl9zID0gUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpOworICAgIHNlbGZfbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUoc2VsZik7CiAKLQljb3VudCA9IGNvdW50Y2hhcihzZWxmX3MsIHNlbGZfbGVuLCBmcm9tX2MsIG1heGNvdW50KTsKLQlpZiAoY291bnQgPT0gMCkgewotCQkvKiBubyBtYXRjaGVzLCByZXR1cm4gdW5jaGFuZ2VkICovCi0JCXJldHVybiByZXR1cm5fc2VsZihzZWxmKTsKLQl9CisgICAgY291bnQgPSBjb3VudGNoYXIoc2VsZl9zLCBzZWxmX2xlbiwgZnJvbV9jLCBtYXhjb3VudCk7CisgICAgaWYgKGNvdW50ID09IDApIHsKKyAgICAgICAgLyogbm8gbWF0Y2hlcywgcmV0dXJuIHVuY2hhbmdlZCAqLworICAgICAgICByZXR1cm4gcmV0dXJuX3NlbGYoc2VsZik7CisgICAgfQogCi0JLyogdXNlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gY3VycmVudCBhbmQgbmV3LCBoZW5jZSB0aGUgIi0xIiAqLwotCS8qICAgcmVzdWx0X2xlbiA9IHNlbGZfbGVuICsgY291bnQgKiAodG9fbGVuLTEpICAqLwotCXByb2R1Y3QgPSBjb3VudCAqICh0b19sZW4tMSk7Ci0JaWYgKHByb2R1Y3QgLyAodG9fbGVuLTEpICE9IGNvdW50KSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLCAicmVwbGFjZSBzdHJpbmcgaXMgdG9vIGxvbmciKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJlc3VsdF9sZW4gPSBzZWxmX2xlbiArIHByb2R1Y3Q7Ci0JaWYgKHJlc3VsdF9sZW4gPCAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLCAicmVwbGFjZSBzdHJpbmcgaXMgdG9vIGxvbmciKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIC8qIHVzZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGN1cnJlbnQgYW5kIG5ldywgaGVuY2UgdGhlICItMSIgKi8KKyAgICAvKiAgIHJlc3VsdF9sZW4gPSBzZWxmX2xlbiArIGNvdW50ICogKHRvX2xlbi0xKSAgKi8KKyAgICBwcm9kdWN0ID0gY291bnQgKiAodG9fbGVuLTEpOworICAgIGlmIChwcm9kdWN0IC8gKHRvX2xlbi0xKSAhPSBjb3VudCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwgInJlcGxhY2Ugc3RyaW5nIGlzIHRvbyBsb25nIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXN1bHRfbGVuID0gc2VsZl9sZW4gKyBwcm9kdWN0OworICAgIGlmIChyZXN1bHRfbGVuIDwgMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwgInJlcGxhY2Ugc3RyaW5nIGlzIHRvbyBsb25nIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWlmICggKHJlc3VsdCA9IChQeVN0cmluZ09iamVjdCAqKQotCSAgICAgIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIHJlc3VsdF9sZW4pKSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlyZXN1bHRfcyA9IFB5U3RyaW5nX0FTX1NUUklORyhyZXN1bHQpOworICAgIGlmICggKHJlc3VsdCA9IChQeVN0cmluZ09iamVjdCAqKQorICAgICAgICAgIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIHJlc3VsdF9sZW4pKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXN1bHRfcyA9IFB5U3RyaW5nX0FTX1NUUklORyhyZXN1bHQpOwogCi0Jc3RhcnQgPSBzZWxmX3M7Ci0JZW5kID0gc2VsZl9zICsgc2VsZl9sZW47Ci0Jd2hpbGUgKGNvdW50LS0gPiAwKSB7Ci0JCW5leHQgPSBmaW5kY2hhcihzdGFydCwgZW5kLXN0YXJ0LCBmcm9tX2MpOwotCQlpZiAobmV4dCA9PSBOVUxMKSAKLQkJCWJyZWFrOworICAgIHN0YXJ0ID0gc2VsZl9zOworICAgIGVuZCA9IHNlbGZfcyArIHNlbGZfbGVuOworICAgIHdoaWxlIChjb3VudC0tID4gMCkgeworICAgICAgICBuZXh0ID0gZmluZGNoYXIoc3RhcnQsIGVuZC1zdGFydCwgZnJvbV9jKTsKKyAgICAgICAgaWYgKG5leHQgPT0gTlVMTCkKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWlmIChuZXh0ID09IHN0YXJ0KSB7Ci0JCQkvKiByZXBsYWNlIHdpdGggdGhlICd0bycgKi8KLQkJCVB5X01FTUNQWShyZXN1bHRfcywgdG9fcywgdG9fbGVuKTsKLQkJCXJlc3VsdF9zICs9IHRvX2xlbjsKLQkJCXN0YXJ0ICs9IDE7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBjb3B5IHRoZSB1bmNoYW5nZWQgb2xkIHRoZW4gdGhlICd0bycgKi8KLQkJCVB5X01FTUNQWShyZXN1bHRfcywgc3RhcnQsIG5leHQtc3RhcnQpOwotCQkJcmVzdWx0X3MgKz0gKG5leHQtc3RhcnQpOwotCQkJUHlfTUVNQ1BZKHJlc3VsdF9zLCB0b19zLCB0b19sZW4pOwotCQkJcmVzdWx0X3MgKz0gdG9fbGVuOwotCQkJc3RhcnQgPSBuZXh0KzE7Ci0JCX0KLQl9Ci0JLyogQ29weSB0aGUgcmVtYWluZGVyIG9mIHRoZSByZW1haW5pbmcgc3RyaW5nICovCi0JUHlfTUVNQ1BZKHJlc3VsdF9zLCBzdGFydCwgZW5kLXN0YXJ0KTsKKyAgICAgICAgaWYgKG5leHQgPT0gc3RhcnQpIHsKKyAgICAgICAgICAgIC8qIHJlcGxhY2Ugd2l0aCB0aGUgJ3RvJyAqLworICAgICAgICAgICAgUHlfTUVNQ1BZKHJlc3VsdF9zLCB0b19zLCB0b19sZW4pOworICAgICAgICAgICAgcmVzdWx0X3MgKz0gdG9fbGVuOworICAgICAgICAgICAgc3RhcnQgKz0gMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIGNvcHkgdGhlIHVuY2hhbmdlZCBvbGQgdGhlbiB0aGUgJ3RvJyAqLworICAgICAgICAgICAgUHlfTUVNQ1BZKHJlc3VsdF9zLCBzdGFydCwgbmV4dC1zdGFydCk7CisgICAgICAgICAgICByZXN1bHRfcyArPSAobmV4dC1zdGFydCk7CisgICAgICAgICAgICBQeV9NRU1DUFkocmVzdWx0X3MsIHRvX3MsIHRvX2xlbik7CisgICAgICAgICAgICByZXN1bHRfcyArPSB0b19sZW47CisgICAgICAgICAgICBzdGFydCA9IG5leHQrMTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBDb3B5IHRoZSByZW1haW5kZXIgb2YgdGhlIHJlbWFpbmluZyBzdHJpbmcgKi8KKyAgICBQeV9NRU1DUFkocmVzdWx0X3MsIHN0YXJ0LCBlbmQtc3RhcnQpOwogCi0JcmV0dXJuIHJlc3VsdDsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiAvKiBsZW4oc2VsZik+PTEsIGxlbihmcm9tKT49MiwgbGVuKHRvKT49MiwgbWF4Y291bnQ+PTEgKi8KIFB5X0xPQ0FMKFB5U3RyaW5nT2JqZWN0ICopCiByZXBsYWNlX3N1YnN0cmluZyhQeVN0cmluZ09iamVjdCAqc2VsZiwKLQkJICBjb25zdCBjaGFyICpmcm9tX3MsIFB5X3NzaXplX3QgZnJvbV9sZW4sCi0JCSAgY29uc3QgY2hhciAqdG9fcywgUHlfc3NpemVfdCB0b19sZW4sCi0JCSAgUHlfc3NpemVfdCBtYXhjb3VudCkgewotCWNoYXIgKnNlbGZfcywgKnJlc3VsdF9zOwotCWNoYXIgKnN0YXJ0LCAqbmV4dCwgKmVuZDsKLQlQeV9zc2l6ZV90IHNlbGZfbGVuLCByZXN1bHRfbGVuOwotCVB5X3NzaXplX3QgY291bnQsIG9mZnNldCwgcHJvZHVjdDsKLQlQeVN0cmluZ09iamVjdCAqcmVzdWx0OworICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZnJvbV9zLCBQeV9zc2l6ZV90IGZyb21fbGVuLAorICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdG9fcywgUHlfc3NpemVfdCB0b19sZW4sCisgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IG1heGNvdW50KSB7CisgICAgY2hhciAqc2VsZl9zLCAqcmVzdWx0X3M7CisgICAgY2hhciAqc3RhcnQsICpuZXh0LCAqZW5kOworICAgIFB5X3NzaXplX3Qgc2VsZl9sZW4sIHJlc3VsdF9sZW47CisgICAgUHlfc3NpemVfdCBjb3VudCwgb2Zmc2V0LCBwcm9kdWN0OworICAgIFB5U3RyaW5nT2JqZWN0ICpyZXN1bHQ7CiAKLQlzZWxmX3MgPSBQeVN0cmluZ19BU19TVFJJTkcoc2VsZik7Ci0Jc2VsZl9sZW4gPSBQeVN0cmluZ19HRVRfU0laRShzZWxmKTsKKyAgICBzZWxmX3MgPSBQeVN0cmluZ19BU19TVFJJTkcoc2VsZik7CisgICAgc2VsZl9sZW4gPSBQeVN0cmluZ19HRVRfU0laRShzZWxmKTsKIAotCWNvdW50ID0gY291bnRzdHJpbmcoc2VsZl9zLCBzZWxmX2xlbiwKLQkJCSAgICBmcm9tX3MsIGZyb21fbGVuLAotCQkJICAgIDAsIHNlbGZfbGVuLCBGT1JXQVJELCBtYXhjb3VudCk7Ci0JaWYgKGNvdW50ID09IDApIHsKLQkJLyogbm8gbWF0Y2hlcywgcmV0dXJuIHVuY2hhbmdlZCAqLwotCQlyZXR1cm4gcmV0dXJuX3NlbGYoc2VsZik7Ci0JfQorICAgIGNvdW50ID0gY291bnRzdHJpbmcoc2VsZl9zLCBzZWxmX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZyb21fcywgZnJvbV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAwLCBzZWxmX2xlbiwgRk9SV0FSRCwgbWF4Y291bnQpOworICAgIGlmIChjb3VudCA9PSAwKSB7CisgICAgICAgIC8qIG5vIG1hdGNoZXMsIHJldHVybiB1bmNoYW5nZWQgKi8KKyAgICAgICAgcmV0dXJuIHJldHVybl9zZWxmKHNlbGYpOworICAgIH0KIAotCS8qIENoZWNrIGZvciBvdmVyZmxvdyAqLwotCS8qICAgIHJlc3VsdF9sZW4gPSBzZWxmX2xlbiArIGNvdW50ICogKHRvX2xlbi1mcm9tX2xlbikgKi8KLQlwcm9kdWN0ID0gY291bnQgKiAodG9fbGVuLWZyb21fbGVuKTsKLQlpZiAocHJvZHVjdCAvICh0b19sZW4tZnJvbV9sZW4pICE9IGNvdW50KSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLCAicmVwbGFjZSBzdHJpbmcgaXMgdG9vIGxvbmciKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJlc3VsdF9sZW4gPSBzZWxmX2xlbiArIHByb2R1Y3Q7Ci0JaWYgKHJlc3VsdF9sZW4gPCAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLCAicmVwbGFjZSBzdHJpbmcgaXMgdG9vIGxvbmciKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIC8qIENoZWNrIGZvciBvdmVyZmxvdyAqLworICAgIC8qICAgIHJlc3VsdF9sZW4gPSBzZWxmX2xlbiArIGNvdW50ICogKHRvX2xlbi1mcm9tX2xlbikgKi8KKyAgICBwcm9kdWN0ID0gY291bnQgKiAodG9fbGVuLWZyb21fbGVuKTsKKyAgICBpZiAocHJvZHVjdCAvICh0b19sZW4tZnJvbV9sZW4pICE9IGNvdW50KSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLCAicmVwbGFjZSBzdHJpbmcgaXMgdG9vIGxvbmciKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJlc3VsdF9sZW4gPSBzZWxmX2xlbiArIHByb2R1Y3Q7CisgICAgaWYgKHJlc3VsdF9sZW4gPCAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLCAicmVwbGFjZSBzdHJpbmcgaXMgdG9vIGxvbmciKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaWYgKCAocmVzdWx0ID0gKFB5U3RyaW5nT2JqZWN0ICopCi0JICAgICAgUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgcmVzdWx0X2xlbikpID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXJlc3VsdF9zID0gUHlTdHJpbmdfQVNfU1RSSU5HKHJlc3VsdCk7CisgICAgaWYgKCAocmVzdWx0ID0gKFB5U3RyaW5nT2JqZWN0ICopCisgICAgICAgICAgUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgcmVzdWx0X2xlbikpID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJlc3VsdF9zID0gUHlTdHJpbmdfQVNfU1RSSU5HKHJlc3VsdCk7CiAKLQlzdGFydCA9IHNlbGZfczsKLQllbmQgPSBzZWxmX3MgKyBzZWxmX2xlbjsKLQl3aGlsZSAoY291bnQtLSA+IDApIHsKLQkJb2Zmc2V0ID0gZmluZHN0cmluZyhzdGFydCwgZW5kLXN0YXJ0LAotCQkJCSAgICBmcm9tX3MsIGZyb21fbGVuLAotCQkJCSAgICAwLCBlbmQtc3RhcnQsIEZPUldBUkQpOwotCQlpZiAob2Zmc2V0ID09IC0xKQotCQkJYnJlYWs7Ci0JCW5leHQgPSBzdGFydCtvZmZzZXQ7Ci0JCWlmIChuZXh0ID09IHN0YXJ0KSB7Ci0JCQkvKiByZXBsYWNlIHdpdGggdGhlICd0bycgKi8KLQkJCVB5X01FTUNQWShyZXN1bHRfcywgdG9fcywgdG9fbGVuKTsKLQkJCXJlc3VsdF9zICs9IHRvX2xlbjsKLQkJCXN0YXJ0ICs9IGZyb21fbGVuOwotCQl9IGVsc2UgewotCQkJLyogY29weSB0aGUgdW5jaGFuZ2VkIG9sZCB0aGVuIHRoZSAndG8nICovCi0JCQlQeV9NRU1DUFkocmVzdWx0X3MsIHN0YXJ0LCBuZXh0LXN0YXJ0KTsKLQkJCXJlc3VsdF9zICs9IChuZXh0LXN0YXJ0KTsKLQkJCVB5X01FTUNQWShyZXN1bHRfcywgdG9fcywgdG9fbGVuKTsKLQkJCXJlc3VsdF9zICs9IHRvX2xlbjsKLQkJCXN0YXJ0ID0gbmV4dCtmcm9tX2xlbjsKLQkJfQotCX0KLQkvKiBDb3B5IHRoZSByZW1haW5kZXIgb2YgdGhlIHJlbWFpbmluZyBzdHJpbmcgKi8KLQlQeV9NRU1DUFkocmVzdWx0X3MsIHN0YXJ0LCBlbmQtc3RhcnQpOworICAgIHN0YXJ0ID0gc2VsZl9zOworICAgIGVuZCA9IHNlbGZfcyArIHNlbGZfbGVuOworICAgIHdoaWxlIChjb3VudC0tID4gMCkgeworICAgICAgICBvZmZzZXQgPSBmaW5kc3RyaW5nKHN0YXJ0LCBlbmQtc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbV9zLCBmcm9tX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBlbmQtc3RhcnQsIEZPUldBUkQpOworICAgICAgICBpZiAob2Zmc2V0ID09IC0xKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIG5leHQgPSBzdGFydCtvZmZzZXQ7CisgICAgICAgIGlmIChuZXh0ID09IHN0YXJ0KSB7CisgICAgICAgICAgICAvKiByZXBsYWNlIHdpdGggdGhlICd0bycgKi8KKyAgICAgICAgICAgIFB5X01FTUNQWShyZXN1bHRfcywgdG9fcywgdG9fbGVuKTsKKyAgICAgICAgICAgIHJlc3VsdF9zICs9IHRvX2xlbjsKKyAgICAgICAgICAgIHN0YXJ0ICs9IGZyb21fbGVuOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogY29weSB0aGUgdW5jaGFuZ2VkIG9sZCB0aGVuIHRoZSAndG8nICovCisgICAgICAgICAgICBQeV9NRU1DUFkocmVzdWx0X3MsIHN0YXJ0LCBuZXh0LXN0YXJ0KTsKKyAgICAgICAgICAgIHJlc3VsdF9zICs9IChuZXh0LXN0YXJ0KTsKKyAgICAgICAgICAgIFB5X01FTUNQWShyZXN1bHRfcywgdG9fcywgdG9fbGVuKTsKKyAgICAgICAgICAgIHJlc3VsdF9zICs9IHRvX2xlbjsKKyAgICAgICAgICAgIHN0YXJ0ID0gbmV4dCtmcm9tX2xlbjsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBDb3B5IHRoZSByZW1haW5kZXIgb2YgdGhlIHJlbWFpbmluZyBzdHJpbmcgKi8KKyAgICBQeV9NRU1DUFkocmVzdWx0X3MsIHN0YXJ0LCBlbmQtc3RhcnQpOwogCi0JcmV0dXJuIHJlc3VsdDsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiAKIFB5X0xPQ0FMKFB5U3RyaW5nT2JqZWN0ICopCiByZXBsYWNlKFB5U3RyaW5nT2JqZWN0ICpzZWxmLAotCWNvbnN0IGNoYXIgKmZyb21fcywgUHlfc3NpemVfdCBmcm9tX2xlbiwKLQljb25zdCBjaGFyICp0b19zLCBQeV9zc2l6ZV90IHRvX2xlbiwKLQlQeV9zc2l6ZV90IG1heGNvdW50KQorICAgIGNvbnN0IGNoYXIgKmZyb21fcywgUHlfc3NpemVfdCBmcm9tX2xlbiwKKyAgICBjb25zdCBjaGFyICp0b19zLCBQeV9zc2l6ZV90IHRvX2xlbiwKKyAgICBQeV9zc2l6ZV90IG1heGNvdW50KQogewotCWlmIChtYXhjb3VudCA8IDApIHsKLQkJbWF4Y291bnQgPSBQWV9TU0laRV9UX01BWDsKLQl9IGVsc2UgaWYgKG1heGNvdW50ID09IDAgfHwgUHlTdHJpbmdfR0VUX1NJWkUoc2VsZikgPT0gMCkgewotCQkvKiBub3RoaW5nIHRvIGRvOyByZXR1cm4gdGhlIG9yaWdpbmFsIHN0cmluZyAqLwotCQlyZXR1cm4gcmV0dXJuX3NlbGYoc2VsZik7Ci0JfQorICAgIGlmIChtYXhjb3VudCA8IDApIHsKKyAgICAgICAgbWF4Y291bnQgPSBQWV9TU0laRV9UX01BWDsKKyAgICB9IGVsc2UgaWYgKG1heGNvdW50ID09IDAgfHwgUHlTdHJpbmdfR0VUX1NJWkUoc2VsZikgPT0gMCkgeworICAgICAgICAvKiBub3RoaW5nIHRvIGRvOyByZXR1cm4gdGhlIG9yaWdpbmFsIHN0cmluZyAqLworICAgICAgICByZXR1cm4gcmV0dXJuX3NlbGYoc2VsZik7CisgICAgfQogCi0JaWYgKG1heGNvdW50ID09IDAgfHwKLQkgICAgKGZyb21fbGVuID09IDAgJiYgdG9fbGVuID09IDApKSB7Ci0JCS8qIG5vdGhpbmcgdG8gZG87IHJldHVybiB0aGUgb3JpZ2luYWwgc3RyaW5nICovCi0JCXJldHVybiByZXR1cm5fc2VsZihzZWxmKTsKLQl9CisgICAgaWYgKG1heGNvdW50ID09IDAgfHwKKyAgICAgICAgKGZyb21fbGVuID09IDAgJiYgdG9fbGVuID09IDApKSB7CisgICAgICAgIC8qIG5vdGhpbmcgdG8gZG87IHJldHVybiB0aGUgb3JpZ2luYWwgc3RyaW5nICovCisgICAgICAgIHJldHVybiByZXR1cm5fc2VsZihzZWxmKTsKKyAgICB9CiAKLQkvKiBIYW5kbGUgemVyby1sZW5ndGggc3BlY2lhbCBjYXNlcyAqLworICAgIC8qIEhhbmRsZSB6ZXJvLWxlbmd0aCBzcGVjaWFsIGNhc2VzICovCiAKLQlpZiAoZnJvbV9sZW4gPT0gMCkgewotCQkvKiBpbnNlcnQgdGhlICd0bycgc3RyaW5nIGV2ZXJ5d2hlcmUuICAgKi8KLQkJLyogICAgPj4+ICJQeXRob24iLnJlcGxhY2UoIiIsICIuIikgICAgICovCi0JCS8qICAgICcuUC55LnQuaC5vLm4uJyAgICAgICAgICAgICAgICAgICAqLwotCQlyZXR1cm4gcmVwbGFjZV9pbnRlcmxlYXZlKHNlbGYsIHRvX3MsIHRvX2xlbiwgbWF4Y291bnQpOwotCX0KKyAgICBpZiAoZnJvbV9sZW4gPT0gMCkgeworICAgICAgICAvKiBpbnNlcnQgdGhlICd0bycgc3RyaW5nIGV2ZXJ5d2hlcmUuICAgKi8KKyAgICAgICAgLyogICAgPj4+ICJQeXRob24iLnJlcGxhY2UoIiIsICIuIikgICAgICovCisgICAgICAgIC8qICAgICcuUC55LnQuaC5vLm4uJyAgICAgICAgICAgICAgICAgICAqLworICAgICAgICByZXR1cm4gcmVwbGFjZV9pbnRlcmxlYXZlKHNlbGYsIHRvX3MsIHRvX2xlbiwgbWF4Y291bnQpOworICAgIH0KIAotCS8qIEV4Y2VwdCBmb3IgIiIucmVwbGFjZSgiIiwgIkEiKSA9PSAiQSIgdGhlcmUgaXMgbm8gd2F5IGJleW9uZCB0aGlzICovCi0JLyogcG9pbnQgZm9yIGFuIGVtcHR5IHNlbGYgc3RyaW5nIHRvIGdlbmVyYXRlIGEgbm9uLWVtcHR5IHN0cmluZyAqLwotCS8qIFNwZWNpYWwgY2FzZSBzbyB0aGUgcmVtYWluaW5nIGNvZGUgYWx3YXlzIGdldHMgYSBub24tZW1wdHkgc3RyaW5nICovCi0JaWYgKFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpID09IDApIHsKLQkJcmV0dXJuIHJldHVybl9zZWxmKHNlbGYpOwotCX0KKyAgICAvKiBFeGNlcHQgZm9yICIiLnJlcGxhY2UoIiIsICJBIikgPT0gIkEiIHRoZXJlIGlzIG5vIHdheSBiZXlvbmQgdGhpcyAqLworICAgIC8qIHBvaW50IGZvciBhbiBlbXB0eSBzZWxmIHN0cmluZyB0byBnZW5lcmF0ZSBhIG5vbi1lbXB0eSBzdHJpbmcgKi8KKyAgICAvKiBTcGVjaWFsIGNhc2Ugc28gdGhlIHJlbWFpbmluZyBjb2RlIGFsd2F5cyBnZXRzIGEgbm9uLWVtcHR5IHN0cmluZyAqLworICAgIGlmIChQeVN0cmluZ19HRVRfU0laRShzZWxmKSA9PSAwKSB7CisgICAgICAgIHJldHVybiByZXR1cm5fc2VsZihzZWxmKTsKKyAgICB9CiAKLQlpZiAodG9fbGVuID09IDApIHsKLQkJLyogZGVsZXRlIGFsbCBvY2N1cmFuY2VzIG9mICdmcm9tJyBzdHJpbmcgKi8KLQkJaWYgKGZyb21fbGVuID09IDEpIHsKLQkJCXJldHVybiByZXBsYWNlX2RlbGV0ZV9zaW5nbGVfY2hhcmFjdGVyKAotCQkJCXNlbGYsIGZyb21fc1swXSwgbWF4Y291bnQpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHJlcGxhY2VfZGVsZXRlX3N1YnN0cmluZyhzZWxmLCBmcm9tX3MsIGZyb21fbGVuLCBtYXhjb3VudCk7Ci0JCX0KLQl9CisgICAgaWYgKHRvX2xlbiA9PSAwKSB7CisgICAgICAgIC8qIGRlbGV0ZSBhbGwgb2NjdXJhbmNlcyBvZiAnZnJvbScgc3RyaW5nICovCisgICAgICAgIGlmIChmcm9tX2xlbiA9PSAxKSB7CisgICAgICAgICAgICByZXR1cm4gcmVwbGFjZV9kZWxldGVfc2luZ2xlX2NoYXJhY3RlcigKKyAgICAgICAgICAgICAgICBzZWxmLCBmcm9tX3NbMF0sIG1heGNvdW50KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiByZXBsYWNlX2RlbGV0ZV9zdWJzdHJpbmcoc2VsZiwgZnJvbV9zLCBmcm9tX2xlbiwgbWF4Y291bnQpOworICAgICAgICB9CisgICAgfQogCi0JLyogSGFuZGxlIHNwZWNpYWwgY2FzZSB3aGVyZSBib3RoIHN0cmluZ3MgaGF2ZSB0aGUgc2FtZSBsZW5ndGggKi8KKyAgICAvKiBIYW5kbGUgc3BlY2lhbCBjYXNlIHdoZXJlIGJvdGggc3RyaW5ncyBoYXZlIHRoZSBzYW1lIGxlbmd0aCAqLwogCi0JaWYgKGZyb21fbGVuID09IHRvX2xlbikgewotCQlpZiAoZnJvbV9sZW4gPT0gMSkgewotCQkJcmV0dXJuIHJlcGxhY2Vfc2luZ2xlX2NoYXJhY3Rlcl9pbl9wbGFjZSgKLQkJCQlzZWxmLAotCQkJCWZyb21fc1swXSwKLQkJCQl0b19zWzBdLAotCQkJCW1heGNvdW50KTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiByZXBsYWNlX3N1YnN0cmluZ19pbl9wbGFjZSgKLQkJCQlzZWxmLCBmcm9tX3MsIGZyb21fbGVuLCB0b19zLCB0b19sZW4sIG1heGNvdW50KTsKLQkJfQotCX0KKyAgICBpZiAoZnJvbV9sZW4gPT0gdG9fbGVuKSB7CisgICAgICAgIGlmIChmcm9tX2xlbiA9PSAxKSB7CisgICAgICAgICAgICByZXR1cm4gcmVwbGFjZV9zaW5nbGVfY2hhcmFjdGVyX2luX3BsYWNlKAorICAgICAgICAgICAgICAgIHNlbGYsCisgICAgICAgICAgICAgICAgZnJvbV9zWzBdLAorICAgICAgICAgICAgICAgIHRvX3NbMF0sCisgICAgICAgICAgICAgICAgbWF4Y291bnQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIHJlcGxhY2Vfc3Vic3RyaW5nX2luX3BsYWNlKAorICAgICAgICAgICAgICAgIHNlbGYsIGZyb21fcywgZnJvbV9sZW4sIHRvX3MsIHRvX2xlbiwgbWF4Y291bnQpOworICAgICAgICB9CisgICAgfQogCi0JLyogT3RoZXJ3aXNlIHVzZSB0aGUgbW9yZSBnZW5lcmljIGFsZ29yaXRobXMgKi8KLQlpZiAoZnJvbV9sZW4gPT0gMSkgewotCQlyZXR1cm4gcmVwbGFjZV9zaW5nbGVfY2hhcmFjdGVyKHNlbGYsIGZyb21fc1swXSwKLQkJCQkJCXRvX3MsIHRvX2xlbiwgbWF4Y291bnQpOwotCX0gZWxzZSB7Ci0JCS8qIGxlbignZnJvbScpPj0yLCBsZW4oJ3RvJyk+PTEgKi8KLQkJcmV0dXJuIHJlcGxhY2Vfc3Vic3RyaW5nKHNlbGYsIGZyb21fcywgZnJvbV9sZW4sIHRvX3MsIHRvX2xlbiwgbWF4Y291bnQpOwotCX0KKyAgICAvKiBPdGhlcndpc2UgdXNlIHRoZSBtb3JlIGdlbmVyaWMgYWxnb3JpdGhtcyAqLworICAgIGlmIChmcm9tX2xlbiA9PSAxKSB7CisgICAgICAgIHJldHVybiByZXBsYWNlX3NpbmdsZV9jaGFyYWN0ZXIoc2VsZiwgZnJvbV9zWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvX3MsIHRvX2xlbiwgbWF4Y291bnQpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIGxlbignZnJvbScpPj0yLCBsZW4oJ3RvJyk+PTEgKi8KKyAgICAgICAgcmV0dXJuIHJlcGxhY2Vfc3Vic3RyaW5nKHNlbGYsIGZyb21fcywgZnJvbV9sZW4sIHRvX3MsIHRvX2xlbiwgbWF4Y291bnQpOworICAgIH0KIH0KIAogUHlEb2NfU1RSVkFSKHJlcGxhY2VfX2RvY19fLApAQCAtMzE0Niw0MSArMzE0Niw0MSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHN0cmluZ19yZXBsYWNlKFB5U3RyaW5nT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeV9zc2l6ZV90IGNvdW50ID0gLTE7Ci0JUHlPYmplY3QgKmZyb20sICp0bzsKLQljb25zdCBjaGFyICpmcm9tX3MsICp0b19zOwotCVB5X3NzaXplX3QgZnJvbV9sZW4sIHRvX2xlbjsKKyAgICBQeV9zc2l6ZV90IGNvdW50ID0gLTE7CisgICAgUHlPYmplY3QgKmZyb20sICp0bzsKKyAgICBjb25zdCBjaGFyICpmcm9tX3MsICp0b19zOworICAgIFB5X3NzaXplX3QgZnJvbV9sZW4sIHRvX2xlbjsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT098bjpyZXBsYWNlIiwgJmZyb20sICZ0bywgJmNvdW50KSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPT3xuOnJlcGxhY2UiLCAmZnJvbSwgJnRvLCAmY291bnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChQeVN0cmluZ19DaGVjayhmcm9tKSkgewotCQlmcm9tX3MgPSBQeVN0cmluZ19BU19TVFJJTkcoZnJvbSk7Ci0JCWZyb21fbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUoZnJvbSk7Ci0JfQorICAgIGlmIChQeVN0cmluZ19DaGVjayhmcm9tKSkgeworICAgICAgICBmcm9tX3MgPSBQeVN0cmluZ19BU19TVFJJTkcoZnJvbSk7CisgICAgICAgIGZyb21fbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUoZnJvbSk7CisgICAgfQogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQlpZiAoUHlVbmljb2RlX0NoZWNrKGZyb20pKQotCQlyZXR1cm4gUHlVbmljb2RlX1JlcGxhY2UoKFB5T2JqZWN0ICopc2VsZiwKLQkJCQkJIGZyb20sIHRvLCBjb3VudCk7CisgICAgaWYgKFB5VW5pY29kZV9DaGVjayhmcm9tKSkKKyAgICAgICAgcmV0dXJuIFB5VW5pY29kZV9SZXBsYWNlKChQeU9iamVjdCAqKXNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tLCB0bywgY291bnQpOwogI2VuZGlmCi0JZWxzZSBpZiAoUHlPYmplY3RfQXNDaGFyQnVmZmVyKGZyb20sICZmcm9tX3MsICZmcm9tX2xlbikpCi0JCXJldHVybiBOVUxMOworICAgIGVsc2UgaWYgKFB5T2JqZWN0X0FzQ2hhckJ1ZmZlcihmcm9tLCAmZnJvbV9zLCAmZnJvbV9sZW4pKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChQeVN0cmluZ19DaGVjayh0bykpIHsKLQkJdG9fcyA9IFB5U3RyaW5nX0FTX1NUUklORyh0byk7Ci0JCXRvX2xlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHRvKTsKLQl9CisgICAgaWYgKFB5U3RyaW5nX0NoZWNrKHRvKSkgeworICAgICAgICB0b19zID0gUHlTdHJpbmdfQVNfU1RSSU5HKHRvKTsKKyAgICAgICAgdG9fbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUodG8pOworICAgIH0KICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrKHRvKSkKLQkJcmV0dXJuIFB5VW5pY29kZV9SZXBsYWNlKChQeU9iamVjdCAqKXNlbGYsCi0JCQkJCSBmcm9tLCB0bywgY291bnQpOworICAgIGVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayh0bykpCisgICAgICAgIHJldHVybiBQeVVuaWNvZGVfUmVwbGFjZSgoUHlPYmplY3QgKilzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSwgdG8sIGNvdW50KTsKICNlbmRpZgotCWVsc2UgaWYgKFB5T2JqZWN0X0FzQ2hhckJ1ZmZlcih0bywgJnRvX3MsICZ0b19sZW4pKQotCQlyZXR1cm4gTlVMTDsKKyAgICBlbHNlIGlmIChQeU9iamVjdF9Bc0NoYXJCdWZmZXIodG8sICZ0b19zLCAmdG9fbGVuKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlyZXR1cm4gKFB5T2JqZWN0ICopcmVwbGFjZSgoUHlTdHJpbmdPYmplY3QgKikgc2VsZiwKLQkJCQkgICBmcm9tX3MsIGZyb21fbGVuLAotCQkJCSAgIHRvX3MsIHRvX2xlbiwgY291bnQpOworICAgIHJldHVybiAoUHlPYmplY3QgKilyZXBsYWNlKChQeVN0cmluZ09iamVjdCAqKSBzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21fcywgZnJvbV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9fcywgdG9fbGVuLCBjb3VudCk7CiB9CiAKIC8qKiBFbmQgREFMS0UgKiovCkBAIC0zMTkxLDQzICszMTkxLDQzIEBACiAgKi8KIFB5X0xPQ0FMKGludCkKIF9zdHJpbmdfdGFpbG1hdGNoKFB5U3RyaW5nT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqc3Vic3RyLCBQeV9zc2l6ZV90IHN0YXJ0LAotCQkgIFB5X3NzaXplX3QgZW5kLCBpbnQgZGlyZWN0aW9uKQorICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBlbmQsIGludCBkaXJlY3Rpb24pCiB7Ci0JUHlfc3NpemVfdCBsZW4gPSBQeVN0cmluZ19HRVRfU0laRShzZWxmKTsKLQlQeV9zc2l6ZV90IHNsZW47Ci0JY29uc3QgY2hhciogc3ViOwotCWNvbnN0IGNoYXIqIHN0cjsKKyAgICBQeV9zc2l6ZV90IGxlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpOworICAgIFB5X3NzaXplX3Qgc2xlbjsKKyAgICBjb25zdCBjaGFyKiBzdWI7CisgICAgY29uc3QgY2hhciogc3RyOwogCi0JaWYgKFB5U3RyaW5nX0NoZWNrKHN1YnN0cikpIHsKLQkJc3ViID0gUHlTdHJpbmdfQVNfU1RSSU5HKHN1YnN0cik7Ci0JCXNsZW4gPSBQeVN0cmluZ19HRVRfU0laRShzdWJzdHIpOwotCX0KKyAgICBpZiAoUHlTdHJpbmdfQ2hlY2soc3Vic3RyKSkgeworICAgICAgICBzdWIgPSBQeVN0cmluZ19BU19TVFJJTkcoc3Vic3RyKTsKKyAgICAgICAgc2xlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHN1YnN0cik7CisgICAgfQogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQllbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2soc3Vic3RyKSkKLQkJcmV0dXJuIFB5VW5pY29kZV9UYWlsbWF0Y2goKFB5T2JqZWN0ICopc2VsZiwKLQkJCQkJICAgc3Vic3RyLCBzdGFydCwgZW5kLCBkaXJlY3Rpb24pOworICAgIGVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayhzdWJzdHIpKQorICAgICAgICByZXR1cm4gUHlVbmljb2RlX1RhaWxtYXRjaCgoUHlPYmplY3QgKilzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzdHIsIHN0YXJ0LCBlbmQsIGRpcmVjdGlvbik7CiAjZW5kaWYKLQllbHNlIGlmIChQeU9iamVjdF9Bc0NoYXJCdWZmZXIoc3Vic3RyLCAmc3ViLCAmc2xlbikpCi0JCXJldHVybiAtMTsKLQlzdHIgPSBQeVN0cmluZ19BU19TVFJJTkcoc2VsZik7CisgICAgZWxzZSBpZiAoUHlPYmplY3RfQXNDaGFyQnVmZmVyKHN1YnN0ciwgJnN1YiwgJnNsZW4pKQorICAgICAgICByZXR1cm4gLTE7CisgICAgc3RyID0gUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpOwogCi0Jc3RyaW5nX2FkanVzdF9pbmRpY2VzKCZzdGFydCwgJmVuZCwgbGVuKTsKKyAgICBzdHJpbmdfYWRqdXN0X2luZGljZXMoJnN0YXJ0LCAmZW5kLCBsZW4pOwogCi0JaWYgKGRpcmVjdGlvbiA8IDApIHsKLQkJLyogc3RhcnRzd2l0aCAqLwotCQlpZiAoc3RhcnQrc2xlbiA+IGxlbikKLQkJCXJldHVybiAwOwotCX0gZWxzZSB7Ci0JCS8qIGVuZHN3aXRoICovCi0JCWlmIChlbmQtc3RhcnQgPCBzbGVuIHx8IHN0YXJ0ID4gbGVuKQotCQkJcmV0dXJuIDA7CisgICAgaWYgKGRpcmVjdGlvbiA8IDApIHsKKyAgICAgICAgLyogc3RhcnRzd2l0aCAqLworICAgICAgICBpZiAoc3RhcnQrc2xlbiA+IGxlbikKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIGVuZHN3aXRoICovCisgICAgICAgIGlmIChlbmQtc3RhcnQgPCBzbGVuIHx8IHN0YXJ0ID4gbGVuKQorICAgICAgICAgICAgcmV0dXJuIDA7CiAKLQkJaWYgKGVuZC1zbGVuID4gc3RhcnQpCi0JCQlzdGFydCA9IGVuZCAtIHNsZW47Ci0JfQotCWlmIChlbmQtc3RhcnQgPj0gc2xlbikKLQkJcmV0dXJuICEgbWVtY21wKHN0citzdGFydCwgc3ViLCBzbGVuKTsKLQlyZXR1cm4gMDsKKyAgICAgICAgaWYgKGVuZC1zbGVuID4gc3RhcnQpCisgICAgICAgICAgICBzdGFydCA9IGVuZCAtIHNsZW47CisgICAgfQorICAgIGlmIChlbmQtc3RhcnQgPj0gc2xlbikKKyAgICAgICAgcmV0dXJuICEgbWVtY21wKHN0citzdGFydCwgc3ViLCBzbGVuKTsKKyAgICByZXR1cm4gMDsKIH0KIAogCkBAIC0zMjQyLDMzICszMjQyLDMzIEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3RyaW5nX3N0YXJ0c3dpdGgoUHlTdHJpbmdPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5X3NzaXplX3Qgc3RhcnQgPSAwOwotCVB5X3NzaXplX3QgZW5kID0gUFlfU1NJWkVfVF9NQVg7Ci0JUHlPYmplY3QgKnN1Ym9iajsKLQlpbnQgcmVzdWx0OworICAgIFB5X3NzaXplX3Qgc3RhcnQgPSAwOworICAgIFB5X3NzaXplX3QgZW5kID0gUFlfU1NJWkVfVF9NQVg7CisgICAgUHlPYmplY3QgKnN1Ym9iajsKKyAgICBpbnQgcmVzdWx0OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfE8mTyY6c3RhcnRzd2l0aCIsICZzdWJvYmosCi0JCV9QeUV2YWxfU2xpY2VJbmRleCwgJnN0YXJ0LCBfUHlFdmFsX1NsaWNlSW5kZXgsICZlbmQpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoUHlUdXBsZV9DaGVjayhzdWJvYmopKSB7Ci0JCVB5X3NzaXplX3QgaTsKLQkJZm9yIChpID0gMDsgaSA8IFB5VHVwbGVfR0VUX1NJWkUoc3Vib2JqKTsgaSsrKSB7Ci0JCQlyZXN1bHQgPSBfc3RyaW5nX3RhaWxtYXRjaChzZWxmLAotCQkJCQlQeVR1cGxlX0dFVF9JVEVNKHN1Ym9iaiwgaSksCi0JCQkJCXN0YXJ0LCBlbmQsIC0xKTsKLQkJCWlmIChyZXN1bHQgPT0gLTEpCi0JCQkJcmV0dXJuIE5VTEw7Ci0JCQllbHNlIGlmIChyZXN1bHQpIHsKLQkJCQlQeV9SRVRVUk5fVFJVRTsKLQkJCX0KLQkJfQotCQlQeV9SRVRVUk5fRkFMU0U7Ci0JfQotCXJlc3VsdCA9IF9zdHJpbmdfdGFpbG1hdGNoKHNlbGYsIHN1Ym9iaiwgc3RhcnQsIGVuZCwgLTEpOwotCWlmIChyZXN1bHQgPT0gLTEpCi0JCXJldHVybiBOVUxMOwotCWVsc2UKLQkJcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZyhyZXN1bHQpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3xPJk8mOnN0YXJ0c3dpdGgiLCAmc3Vib2JqLAorICAgICAgICBfUHlFdmFsX1NsaWNlSW5kZXgsICZzdGFydCwgX1B5RXZhbF9TbGljZUluZGV4LCAmZW5kKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKFB5VHVwbGVfQ2hlY2soc3Vib2JqKSkgeworICAgICAgICBQeV9zc2l6ZV90IGk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBQeVR1cGxlX0dFVF9TSVpFKHN1Ym9iaik7IGkrKykgeworICAgICAgICAgICAgcmVzdWx0ID0gX3N0cmluZ190YWlsbWF0Y2goc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVR1cGxlX0dFVF9JVEVNKHN1Ym9iaiwgaSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQsIGVuZCwgLTEpOworICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSAtMSkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIGVsc2UgaWYgKHJlc3VsdCkgeworICAgICAgICAgICAgICAgIFB5X1JFVFVSTl9UUlVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFB5X1JFVFVSTl9GQUxTRTsKKyAgICB9CisgICAgcmVzdWx0ID0gX3N0cmluZ190YWlsbWF0Y2goc2VsZiwgc3Vib2JqLCBzdGFydCwgZW5kLCAtMSk7CisgICAgaWYgKHJlc3VsdCA9PSAtMSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKHJlc3VsdCk7CiB9CiAKIApAQCAtMzI4MywzMyArMzI4MywzMyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHN0cmluZ19lbmRzd2l0aChQeVN0cmluZ09iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlfc3NpemVfdCBzdGFydCA9IDA7Ci0JUHlfc3NpemVfdCBlbmQgPSBQWV9TU0laRV9UX01BWDsKLQlQeU9iamVjdCAqc3Vib2JqOwotCWludCByZXN1bHQ7CisgICAgUHlfc3NpemVfdCBzdGFydCA9IDA7CisgICAgUHlfc3NpemVfdCBlbmQgPSBQWV9TU0laRV9UX01BWDsKKyAgICBQeU9iamVjdCAqc3Vib2JqOworICAgIGludCByZXN1bHQ7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98TyZPJjplbmRzd2l0aCIsICZzdWJvYmosCi0JCV9QeUV2YWxfU2xpY2VJbmRleCwgJnN0YXJ0LCBfUHlFdmFsX1NsaWNlSW5kZXgsICZlbmQpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoUHlUdXBsZV9DaGVjayhzdWJvYmopKSB7Ci0JCVB5X3NzaXplX3QgaTsKLQkJZm9yIChpID0gMDsgaSA8IFB5VHVwbGVfR0VUX1NJWkUoc3Vib2JqKTsgaSsrKSB7Ci0JCQlyZXN1bHQgPSBfc3RyaW5nX3RhaWxtYXRjaChzZWxmLAotCQkJCQlQeVR1cGxlX0dFVF9JVEVNKHN1Ym9iaiwgaSksCi0JCQkJCXN0YXJ0LCBlbmQsICsxKTsKLQkJCWlmIChyZXN1bHQgPT0gLTEpCi0JCQkJcmV0dXJuIE5VTEw7Ci0JCQllbHNlIGlmIChyZXN1bHQpIHsKLQkJCQlQeV9SRVRVUk5fVFJVRTsKLQkJCX0KLQkJfQotCQlQeV9SRVRVUk5fRkFMU0U7Ci0JfQotCXJlc3VsdCA9IF9zdHJpbmdfdGFpbG1hdGNoKHNlbGYsIHN1Ym9iaiwgc3RhcnQsIGVuZCwgKzEpOwotCWlmIChyZXN1bHQgPT0gLTEpCi0JCXJldHVybiBOVUxMOwotCWVsc2UKLQkJcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZyhyZXN1bHQpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3xPJk8mOmVuZHN3aXRoIiwgJnN1Ym9iaiwKKyAgICAgICAgX1B5RXZhbF9TbGljZUluZGV4LCAmc3RhcnQsIF9QeUV2YWxfU2xpY2VJbmRleCwgJmVuZCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChQeVR1cGxlX0NoZWNrKHN1Ym9iaikpIHsKKyAgICAgICAgUHlfc3NpemVfdCBpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgUHlUdXBsZV9HRVRfU0laRShzdWJvYmopOyBpKyspIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IF9zdHJpbmdfdGFpbG1hdGNoKHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlUdXBsZV9HRVRfSVRFTShzdWJvYmosIGkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0LCBlbmQsICsxKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gLTEpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICBlbHNlIGlmIChyZXN1bHQpIHsKKyAgICAgICAgICAgICAgICBQeV9SRVRVUk5fVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBQeV9SRVRVUk5fRkFMU0U7CisgICAgfQorICAgIHJlc3VsdCA9IF9zdHJpbmdfdGFpbG1hdGNoKHNlbGYsIHN1Ym9iaiwgc3RhcnQsIGVuZCwgKzEpOworICAgIGlmIChyZXN1bHQgPT0gLTEpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZyhyZXN1bHQpOwogfQogCiAKQEAgLTMzMzEsMTcgKzMzMzEsMTcgQEAKICAgICBQeU9iamVjdCAqdjsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifHNzOmVuY29kZSIsICZlbmNvZGluZywgJmVycm9ycykpCi0gICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBOVUxMOwogICAgIHYgPSBQeVN0cmluZ19Bc0VuY29kZWRPYmplY3QoKFB5T2JqZWN0ICopc2VsZiwgZW5jb2RpbmcsIGVycm9ycyk7CiAgICAgaWYgKHYgPT0gTlVMTCkKLSAgICAgICAgZ290byBvbkVycm9yOworICAgIGdvdG8gb25FcnJvcjsKICAgICBpZiAoIVB5U3RyaW5nX0NoZWNrKHYpICYmICFQeVVuaWNvZGVfQ2hlY2sodikpIHsKLSAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJlbmNvZGVyIGRpZCBub3QgcmV0dXJuIGEgc3RyaW5nL3VuaWNvZGUgb2JqZWN0ICIKLSAgICAgICAgICAgICAgICAgICAgICIodHlwZT0lLjQwMHMpIiwKLSAgICAgICAgICAgICAgICAgICAgIFB5X1RZUEUodiktPnRwX25hbWUpOwotICAgICAgICBQeV9ERUNSRUYodik7Ci0gICAgICAgIHJldHVybiBOVUxMOworICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICJlbmNvZGVyIGRpZCBub3QgcmV0dXJuIGEgc3RyaW5nL3VuaWNvZGUgb2JqZWN0ICIKKyAgICAgICAgICAgICAgICAgIih0eXBlPSUuNDAwcykiLAorICAgICAgICAgICAgICAgICBQeV9UWVBFKHYpLT50cF9uYW1lKTsKKyAgICBQeV9ERUNSRUYodik7CisgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogICAgIHJldHVybiB2OwogCkBAIC0zMzY4LDE3ICszMzY4LDE3IEBACiAgICAgUHlPYmplY3QgKnY7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxzczpkZWNvZGUiLCAmZW5jb2RpbmcsICZlcnJvcnMpKQotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gTlVMTDsKICAgICB2ID0gUHlTdHJpbmdfQXNEZWNvZGVkT2JqZWN0KChQeU9iamVjdCAqKXNlbGYsIGVuY29kaW5nLCBlcnJvcnMpOwogICAgIGlmICh2ID09IE5VTEwpCi0gICAgICAgIGdvdG8gb25FcnJvcjsKKyAgICBnb3RvIG9uRXJyb3I7CiAgICAgaWYgKCFQeVN0cmluZ19DaGVjayh2KSAmJiAhUHlVbmljb2RlX0NoZWNrKHYpKSB7Ci0gICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiZGVjb2RlciBkaWQgbm90IHJldHVybiBhIHN0cmluZy91bmljb2RlIG9iamVjdCAiCi0gICAgICAgICAgICAgICAgICAgICAiKHR5cGU9JS40MDBzKSIsCi0gICAgICAgICAgICAgICAgICAgICBQeV9UWVBFKHYpLT50cF9uYW1lKTsKLSAgICAgICAgUHlfREVDUkVGKHYpOwotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAiZGVjb2RlciBkaWQgbm90IHJldHVybiBhIHN0cmluZy91bmljb2RlIG9iamVjdCAiCisgICAgICAgICAgICAgICAgICIodHlwZT0lLjQwMHMpIiwKKyAgICAgICAgICAgICAgICAgUHlfVFlQRSh2KS0+dHBfbmFtZSk7CisgICAgUHlfREVDUkVGKHYpOworICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICByZXR1cm4gdjsKIApAQCAtMzQwMyw2NSArMzQwMyw2NSBAQAogICAgIGludCB0YWJzaXplID0gODsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifGk6ZXhwYW5kdGFicyIsICZ0YWJzaXplKSkKLQlyZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gTlVMTDsKIAogICAgIC8qIEZpcnN0IHBhc3M6IGRldGVybWluZSBzaXplIG9mIG91dHB1dCBzdHJpbmcgKi8KICAgICBpID0gMDsgLyogY2hhcnMgdXAgdG8gYW5kIGluY2x1ZGluZyBtb3N0IHJlY2VudCBcbiBvciBcciAqLwogICAgIGogPSAwOyAvKiBjaGFycyBzaW5jZSBtb3N0IHJlY2VudCBcbiBvciBcciAodXNlIGluIHRhYiBjYWxjdWxhdGlvbnMpICovCiAgICAgZSA9IFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKSArIFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpOyAvKiBlbmQgb2YgaW5wdXQgKi8KICAgICBmb3IgKHAgPSBQeVN0cmluZ19BU19TVFJJTkcoc2VsZik7IHAgPCBlOyBwKyspCi0gICAgICAgIGlmICgqcCA9PSAnXHQnKSB7Ci0JICAgIGlmICh0YWJzaXplID4gMCkgewotCQlpbmNyID0gdGFic2l6ZSAtIChqICUgdGFic2l6ZSk7Ci0JCWlmIChqID4gUFlfU1NJWkVfVF9NQVggLSBpbmNyKQotCQkgICAgZ290byBvdmVyZmxvdzE7Ci0JCWogKz0gaW5jcjsKLSAgICAgICAgICAgIH0KLQl9Ci0gICAgICAgIGVsc2UgewotCSAgICBpZiAoaiA+IFBZX1NTSVpFX1RfTUFYIC0gMSkKLQkJZ290byBvdmVyZmxvdzE7Ci0gICAgICAgICAgICBqKys7Ci0gICAgICAgICAgICBpZiAoKnAgPT0gJ1xuJyB8fCAqcCA9PSAnXHInKSB7Ci0JCWlmIChpID4gUFlfU1NJWkVfVF9NQVggLSBqKQotCQkgICAgZ290byBvdmVyZmxvdzE7Ci0gICAgICAgICAgICAgICAgaSArPSBqOwotICAgICAgICAgICAgICAgIGogPSAwOwotICAgICAgICAgICAgfQorICAgIGlmICgqcCA9PSAnXHQnKSB7CisgICAgICAgIGlmICh0YWJzaXplID4gMCkgeworICAgICAgICBpbmNyID0gdGFic2l6ZSAtIChqICUgdGFic2l6ZSk7CisgICAgICAgIGlmIChqID4gUFlfU1NJWkVfVF9NQVggLSBpbmNyKQorICAgICAgICAgICAgZ290byBvdmVyZmxvdzE7CisgICAgICAgIGogKz0gaW5jcjsKICAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKGogPiBQWV9TU0laRV9UX01BWCAtIDEpCisgICAgICAgIGdvdG8gb3ZlcmZsb3cxOworICAgICAgICBqKys7CisgICAgICAgIGlmICgqcCA9PSAnXG4nIHx8ICpwID09ICdccicpIHsKKyAgICAgICAgaWYgKGkgPiBQWV9TU0laRV9UX01BWCAtIGopCisgICAgICAgICAgICBnb3RvIG92ZXJmbG93MTsKKyAgICAgICAgaSArPSBqOworICAgICAgICBqID0gMDsKKyAgICAgICAgfQorICAgIH0KIAogICAgIGlmIChpID4gUFlfU1NJWkVfVF9NQVggLSBqKQotCWdvdG8gb3ZlcmZsb3cxOworICAgIGdvdG8gb3ZlcmZsb3cxOwogCiAgICAgLyogU2Vjb25kIHBhc3M6IGNyZWF0ZSBvdXRwdXQgc3RyaW5nIGFuZCBmaWxsIGl0ICovCiAgICAgdSA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGkgKyBqKTsKICAgICBpZiAoIXUpCi0gICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBOVUxMOwogCiAgICAgaiA9IDA7IC8qIHNhbWUgYXMgaW4gZmlyc3QgcGFzcyAqLwogICAgIHEgPSBQeVN0cmluZ19BU19TVFJJTkcodSk7IC8qIG5leHQgb3V0cHV0IGNoYXIgKi8KICAgICBxZSA9IFB5U3RyaW5nX0FTX1NUUklORyh1KSArIFB5U3RyaW5nX0dFVF9TSVpFKHUpOyAvKiBlbmQgb2Ygb3V0cHV0ICovCiAKICAgICBmb3IgKHAgPSBQeVN0cmluZ19BU19TVFJJTkcoc2VsZik7IHAgPCBlOyBwKyspCi0gICAgICAgIGlmICgqcCA9PSAnXHQnKSB7Ci0JICAgIGlmICh0YWJzaXplID4gMCkgewotCQlpID0gdGFic2l6ZSAtIChqICUgdGFic2l6ZSk7Ci0JCWogKz0gaTsKLQkJd2hpbGUgKGktLSkgewotCQkgICAgaWYgKHEgPj0gcWUpCi0JCQlnb3RvIG92ZXJmbG93MjsKLQkJICAgICpxKysgPSAnICc7Ci0JCX0KLQkgICAgfQotCX0KLQllbHNlIHsKLQkgICAgaWYgKHEgPj0gcWUpCi0JCWdvdG8gb3ZlcmZsb3cyOwotCSAgICAqcSsrID0gKnA7Ci0gICAgICAgICAgICBqKys7Ci0gICAgICAgICAgICBpZiAoKnAgPT0gJ1xuJyB8fCAqcCA9PSAnXHInKQotICAgICAgICAgICAgICAgIGogPSAwOworICAgIGlmICgqcCA9PSAnXHQnKSB7CisgICAgICAgIGlmICh0YWJzaXplID4gMCkgeworICAgICAgICBpID0gdGFic2l6ZSAtIChqICUgdGFic2l6ZSk7CisgICAgICAgIGogKz0gaTsKKyAgICAgICAgd2hpbGUgKGktLSkgeworICAgICAgICAgICAgaWYgKHEgPj0gcWUpCisgICAgICAgICAgICBnb3RvIG92ZXJmbG93MjsKKyAgICAgICAgICAgICpxKysgPSAnICc7CiAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKHEgPj0gcWUpCisgICAgICAgIGdvdG8gb3ZlcmZsb3cyOworICAgICAgICAqcSsrID0gKnA7CisgICAgICAgIGorKzsKKyAgICAgICAgaWYgKCpwID09ICdcbicgfHwgKnAgPT0gJ1xyJykKKyAgICAgICAgaiA9IDA7CisgICAgfQogCiAgICAgcmV0dXJuIHU7CiAKQEAgLTM0NzgsMjYgKzM0NzgsMjYgQEAKICAgICBQeU9iamVjdCAqdTsKIAogICAgIGlmIChsZWZ0IDwgMCkKLSAgICAgICAgbGVmdCA9IDA7CisgICAgbGVmdCA9IDA7CiAgICAgaWYgKHJpZ2h0IDwgMCkKLSAgICAgICAgcmlnaHQgPSAwOworICAgIHJpZ2h0ID0gMDsKIAogICAgIGlmIChsZWZ0ID09IDAgJiYgcmlnaHQgPT0gMCAmJiBQeVN0cmluZ19DaGVja0V4YWN0KHNlbGYpKSB7Ci0gICAgICAgIFB5X0lOQ1JFRihzZWxmKTsKLSAgICAgICAgcmV0dXJuIChQeU9iamVjdCAqKXNlbGY7CisgICAgUHlfSU5DUkVGKHNlbGYpOworICAgIHJldHVybiAoUHlPYmplY3QgKilzZWxmOwogICAgIH0KIAogICAgIHUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLAotCQkJCSAgIGxlZnQgKyBQeVN0cmluZ19HRVRfU0laRShzZWxmKSArIHJpZ2h0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCArIFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpICsgcmlnaHQpOwogICAgIGlmICh1KSB7Ci0gICAgICAgIGlmIChsZWZ0KQotICAgICAgICAgICAgbWVtc2V0KFB5U3RyaW5nX0FTX1NUUklORyh1KSwgZmlsbCwgbGVmdCk7Ci0gICAgICAgIFB5X01FTUNQWShQeVN0cmluZ19BU19TVFJJTkcodSkgKyBsZWZ0LAotCSAgICAgICBQeVN0cmluZ19BU19TVFJJTkcoc2VsZiksCi0JICAgICAgIFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpKTsKLSAgICAgICAgaWYgKHJpZ2h0KQotICAgICAgICAgICAgbWVtc2V0KFB5U3RyaW5nX0FTX1NUUklORyh1KSArIGxlZnQgKyBQeVN0cmluZ19HRVRfU0laRShzZWxmKSwKLQkJICAgZmlsbCwgcmlnaHQpOworICAgIGlmIChsZWZ0KQorICAgICAgICBtZW1zZXQoUHlTdHJpbmdfQVNfU1RSSU5HKHUpLCBmaWxsLCBsZWZ0KTsKKyAgICBQeV9NRU1DUFkoUHlTdHJpbmdfQVNfU1RSSU5HKHUpICsgbGVmdCwKKyAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpLAorICAgICAgICAgICBQeVN0cmluZ19HRVRfU0laRShzZWxmKSk7CisgICAgaWYgKHJpZ2h0KQorICAgICAgICBtZW1zZXQoUHlTdHJpbmdfQVNfU1RSSU5HKHUpICsgbGVmdCArIFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpLAorICAgICAgICAgICBmaWxsLCByaWdodCk7CiAgICAgfQogCiAgICAgcmV0dXJuIHU7CkBAIC0zNTE2LDExICszNTE2LDExIEBACiAgICAgY2hhciBmaWxsY2hhciA9ICcgJzsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibnxjOmxqdXN0IiwgJndpZHRoLCAmZmlsbGNoYXIpKQotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gTlVMTDsKIAogICAgIGlmIChQeVN0cmluZ19HRVRfU0laRShzZWxmKSA+PSB3aWR0aCAmJiBQeVN0cmluZ19DaGVja0V4YWN0KHNlbGYpKSB7Ci0gICAgICAgIFB5X0lOQ1JFRihzZWxmKTsKLSAgICAgICAgcmV0dXJuIChQeU9iamVjdCopIHNlbGY7CisgICAgUHlfSU5DUkVGKHNlbGYpOworICAgIHJldHVybiAoUHlPYmplY3QqKSBzZWxmOwogICAgIH0KIAogICAgIHJldHVybiBwYWQoc2VsZiwgMCwgd2lkdGggLSBQeVN0cmluZ19HRVRfU0laRShzZWxmKSwgZmlsbGNoYXIpOwpAQCAtMzU0MCwxMSArMzU0MCwxMSBAQAogICAgIGNoYXIgZmlsbGNoYXIgPSAnICc7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIm58YzpyanVzdCIsICZ3aWR0aCwgJmZpbGxjaGFyKSkKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIE5VTEw7CiAKICAgICBpZiAoUHlTdHJpbmdfR0VUX1NJWkUoc2VsZikgPj0gd2lkdGggJiYgUHlTdHJpbmdfQ2hlY2tFeGFjdChzZWxmKSkgewotICAgICAgICBQeV9JTkNSRUYoc2VsZik7Ci0gICAgICAgIHJldHVybiAoUHlPYmplY3QqKSBzZWxmOworICAgIFB5X0lOQ1JFRihzZWxmKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0Kikgc2VsZjsKICAgICB9CiAKICAgICByZXR1cm4gcGFkKHNlbGYsIHdpZHRoIC0gUHlTdHJpbmdfR0VUX1NJWkUoc2VsZiksIDAsIGZpbGxjaGFyKTsKQEAgLTM1NjUsMTEgKzM1NjUsMTEgQEAKICAgICBjaGFyIGZpbGxjaGFyID0gJyAnOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJufGM6Y2VudGVyIiwgJndpZHRoLCAmZmlsbGNoYXIpKQotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gTlVMTDsKIAogICAgIGlmIChQeVN0cmluZ19HRVRfU0laRShzZWxmKSA+PSB3aWR0aCAmJiBQeVN0cmluZ19DaGVja0V4YWN0KHNlbGYpKSB7Ci0gICAgICAgIFB5X0lOQ1JFRihzZWxmKTsKLSAgICAgICAgcmV0dXJuIChQeU9iamVjdCopIHNlbGY7CisgICAgUHlfSU5DUkVGKHNlbGYpOworICAgIHJldHVybiAoUHlPYmplY3QqKSBzZWxmOwogICAgIH0KIAogICAgIG1hcmcgPSB3aWR0aCAtIFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpOwpAQCAtMzU5MywxOCArMzU5MywxOCBAQAogICAgIFB5X3NzaXplX3Qgd2lkdGg7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIm46emZpbGwiLCAmd2lkdGgpKQotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gTlVMTDsKIAogICAgIGlmIChQeVN0cmluZ19HRVRfU0laRShzZWxmKSA+PSB3aWR0aCkgewotICAgICAgICBpZiAoUHlTdHJpbmdfQ2hlY2tFeGFjdChzZWxmKSkgewotICAgICAgICAgICAgUHlfSU5DUkVGKHNlbGYpOwotICAgICAgICAgICAgcmV0dXJuIChQeU9iamVjdCopIHNlbGY7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKAotICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKSwKLSAgICAgICAgICAgICAgICBQeVN0cmluZ19HRVRfU0laRShzZWxmKQotICAgICAgICAgICAgKTsKKyAgICBpZiAoUHlTdHJpbmdfQ2hlY2tFeGFjdChzZWxmKSkgeworICAgICAgICBQeV9JTkNSRUYoc2VsZik7CisgICAgICAgIHJldHVybiAoUHlPYmplY3QqKSBzZWxmOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgKKyAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpLAorICAgICAgICBQeVN0cmluZ19HRVRfU0laRShzZWxmKQorICAgICAgICApOwogICAgIH0KIAogICAgIGZpbGwgPSB3aWR0aCAtIFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpOwpAQCAtMzYxMiwxMyArMzYxMiwxMyBAQAogICAgIHMgPSBwYWQoc2VsZiwgZmlsbCwgMCwgJzAnKTsKIAogICAgIGlmIChzID09IE5VTEwpCi0gICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBOVUxMOwogCiAgICAgcCA9IFB5U3RyaW5nX0FTX1NUUklORyhzKTsKICAgICBpZiAocFtmaWxsXSA9PSAnKycgfHwgcFtmaWxsXSA9PSAnLScpIHsKLSAgICAgICAgLyogbW92ZSBzaWduIHRvIGJlZ2lubmluZyBvZiBzdHJpbmcgKi8KLSAgICAgICAgcFswXSA9IHBbZmlsbF07Ci0gICAgICAgIHBbZmlsbF0gPSAnMCc7CisgICAgLyogbW92ZSBzaWduIHRvIGJlZ2lubmluZyBvZiBzdHJpbmcgKi8KKyAgICBwWzBdID0gcFtmaWxsXTsKKyAgICBwW2ZpbGxdID0gJzAnOwogICAgIH0KIAogICAgIHJldHVybiAoUHlPYmplY3QqKSBzOwpAQCAtMzYzNCwyMiArMzYzNCwyMiBAQAogc3RyaW5nX2lzc3BhY2UoUHlTdHJpbmdPYmplY3QgKnNlbGYpCiB7CiAgICAgcmVnaXN0ZXIgY29uc3QgdW5zaWduZWQgY2hhciAqcAotICAgICAgICA9ICh1bnNpZ25lZCBjaGFyICopIFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKTsKKyAgICA9ICh1bnNpZ25lZCBjaGFyICopIFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKTsKICAgICByZWdpc3RlciBjb25zdCB1bnNpZ25lZCBjaGFyICplOwogCiAgICAgLyogU2hvcnRjdXQgZm9yIHNpbmdsZSBjaGFyYWN0ZXIgc3RyaW5ncyAqLwogICAgIGlmIChQeVN0cmluZ19HRVRfU0laRShzZWxmKSA9PSAxICYmCi0JaXNzcGFjZSgqcCkpCi0JcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygxKTsKKyAgICBpc3NwYWNlKCpwKSkKKyAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKDEpOwogCiAgICAgLyogU3BlY2lhbCBjYXNlIGZvciBlbXB0eSBzdHJpbmdzICovCiAgICAgaWYgKFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpID09IDApCi0JcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygwKTsKKyAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKDApOwogCiAgICAgZSA9IHAgKyBQeVN0cmluZ19HRVRfU0laRShzZWxmKTsKICAgICBmb3IgKDsgcCA8IGU7IHArKykgewotCWlmICghaXNzcGFjZSgqcCkpCi0JICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoMCk7CisgICAgaWYgKCFpc3NwYWNlKCpwKSkKKyAgICAgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygwKTsKICAgICB9CiAgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygxKTsKIH0KQEAgLTM2NjUsMjIgKzM2NjUsMjIgQEAKIHN0cmluZ19pc2FscGhhKFB5U3RyaW5nT2JqZWN0ICpzZWxmKQogewogICAgIHJlZ2lzdGVyIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnAKLSAgICAgICAgPSAodW5zaWduZWQgY2hhciAqKSBQeVN0cmluZ19BU19TVFJJTkcoc2VsZik7CisgICAgPSAodW5zaWduZWQgY2hhciAqKSBQeVN0cmluZ19BU19TVFJJTkcoc2VsZik7CiAgICAgcmVnaXN0ZXIgY29uc3QgdW5zaWduZWQgY2hhciAqZTsKIAogICAgIC8qIFNob3J0Y3V0IGZvciBzaW5nbGUgY2hhcmFjdGVyIHN0cmluZ3MgKi8KICAgICBpZiAoUHlTdHJpbmdfR0VUX1NJWkUoc2VsZikgPT0gMSAmJgotCWlzYWxwaGEoKnApKQotCXJldHVybiBQeUJvb2xfRnJvbUxvbmcoMSk7CisgICAgaXNhbHBoYSgqcCkpCisgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygxKTsKIAogICAgIC8qIFNwZWNpYWwgY2FzZSBmb3IgZW1wdHkgc3RyaW5ncyAqLwogICAgIGlmIChQeVN0cmluZ19HRVRfU0laRShzZWxmKSA9PSAwKQotCXJldHVybiBQeUJvb2xfRnJvbUxvbmcoMCk7CisgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygwKTsKIAogICAgIGUgPSBwICsgUHlTdHJpbmdfR0VUX1NJWkUoc2VsZik7CiAgICAgZm9yICg7IHAgPCBlOyBwKyspIHsKLQlpZiAoIWlzYWxwaGEoKnApKQotCSAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKDApOworICAgIGlmICghaXNhbHBoYSgqcCkpCisgICAgICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoMCk7CiAgICAgfQogICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoMSk7CiB9CkBAIC0zNjk2LDIyICszNjk2LDIyIEBACiBzdHJpbmdfaXNhbG51bShQeVN0cmluZ09iamVjdCAqc2VsZikKIHsKICAgICByZWdpc3RlciBjb25zdCB1bnNpZ25lZCBjaGFyICpwCi0gICAgICAgID0gKHVuc2lnbmVkIGNoYXIgKikgUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpOworICAgID0gKHVuc2lnbmVkIGNoYXIgKikgUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpOwogICAgIHJlZ2lzdGVyIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmU7CiAKICAgICAvKiBTaG9ydGN1dCBmb3Igc2luZ2xlIGNoYXJhY3RlciBzdHJpbmdzICovCiAgICAgaWYgKFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpID09IDEgJiYKLQlpc2FsbnVtKCpwKSkKLQlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKDEpOworICAgIGlzYWxudW0oKnApKQorICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoMSk7CiAKICAgICAvKiBTcGVjaWFsIGNhc2UgZm9yIGVtcHR5IHN0cmluZ3MgKi8KICAgICBpZiAoUHlTdHJpbmdfR0VUX1NJWkUoc2VsZikgPT0gMCkKLQlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKDApOworICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoMCk7CiAKICAgICBlID0gcCArIFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpOwogICAgIGZvciAoOyBwIDwgZTsgcCsrKSB7Ci0JaWYgKCFpc2FsbnVtKCpwKSkKLQkgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygwKTsKKyAgICBpZiAoIWlzYWxudW0oKnApKQorICAgICAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKDApOwogICAgIH0KICAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKDEpOwogfQpAQCAtMzcyNywyMiArMzcyNywyMiBAQAogc3RyaW5nX2lzZGlnaXQoUHlTdHJpbmdPYmplY3QgKnNlbGYpCiB7CiAgICAgcmVnaXN0ZXIgY29uc3QgdW5zaWduZWQgY2hhciAqcAotICAgICAgICA9ICh1bnNpZ25lZCBjaGFyICopIFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKTsKKyAgICA9ICh1bnNpZ25lZCBjaGFyICopIFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKTsKICAgICByZWdpc3RlciBjb25zdCB1bnNpZ25lZCBjaGFyICplOwogCiAgICAgLyogU2hvcnRjdXQgZm9yIHNpbmdsZSBjaGFyYWN0ZXIgc3RyaW5ncyAqLwogICAgIGlmIChQeVN0cmluZ19HRVRfU0laRShzZWxmKSA9PSAxICYmCi0JaXNkaWdpdCgqcCkpCi0JcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygxKTsKKyAgICBpc2RpZ2l0KCpwKSkKKyAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKDEpOwogCiAgICAgLyogU3BlY2lhbCBjYXNlIGZvciBlbXB0eSBzdHJpbmdzICovCiAgICAgaWYgKFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpID09IDApCi0JcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygwKTsKKyAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKDApOwogCiAgICAgZSA9IHAgKyBQeVN0cmluZ19HRVRfU0laRShzZWxmKTsKICAgICBmb3IgKDsgcCA8IGU7IHArKykgewotCWlmICghaXNkaWdpdCgqcCkpCi0JICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoMCk7CisgICAgaWYgKCFpc2RpZ2l0KCpwKSkKKyAgICAgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygwKTsKICAgICB9CiAgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygxKTsKIH0KQEAgLTM3NTgsMjUgKzM3NTgsMjUgQEAKIHN0cmluZ19pc2xvd2VyKFB5U3RyaW5nT2JqZWN0ICpzZWxmKQogewogICAgIHJlZ2lzdGVyIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnAKLSAgICAgICAgPSAodW5zaWduZWQgY2hhciAqKSBQeVN0cmluZ19BU19TVFJJTkcoc2VsZik7CisgICAgPSAodW5zaWduZWQgY2hhciAqKSBQeVN0cmluZ19BU19TVFJJTkcoc2VsZik7CiAgICAgcmVnaXN0ZXIgY29uc3QgdW5zaWduZWQgY2hhciAqZTsKICAgICBpbnQgY2FzZWQ7CiAKICAgICAvKiBTaG9ydGN1dCBmb3Igc2luZ2xlIGNoYXJhY3RlciBzdHJpbmdzICovCiAgICAgaWYgKFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpID09IDEpCi0JcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZyhpc2xvd2VyKCpwKSAhPSAwKTsKKyAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKGlzbG93ZXIoKnApICE9IDApOwogCiAgICAgLyogU3BlY2lhbCBjYXNlIGZvciBlbXB0eSBzdHJpbmdzICovCiAgICAgaWYgKFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpID09IDApCi0JcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygwKTsKKyAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKDApOwogCiAgICAgZSA9IHAgKyBQeVN0cmluZ19HRVRfU0laRShzZWxmKTsKICAgICBjYXNlZCA9IDA7CiAgICAgZm9yICg7IHAgPCBlOyBwKyspIHsKLQlpZiAoaXN1cHBlcigqcCkpCi0JICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoMCk7Ci0JZWxzZSBpZiAoIWNhc2VkICYmIGlzbG93ZXIoKnApKQotCSAgICBjYXNlZCA9IDE7CisgICAgaWYgKGlzdXBwZXIoKnApKQorICAgICAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKDApOworICAgIGVsc2UgaWYgKCFjYXNlZCAmJiBpc2xvd2VyKCpwKSkKKyAgICAgICAgY2FzZWQgPSAxOwogICAgIH0KICAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKGNhc2VkKTsKIH0KQEAgLTM3OTIsMjUgKzM3OTIsMjUgQEAKIHN0cmluZ19pc3VwcGVyKFB5U3RyaW5nT2JqZWN0ICpzZWxmKQogewogICAgIHJlZ2lzdGVyIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnAKLSAgICAgICAgPSAodW5zaWduZWQgY2hhciAqKSBQeVN0cmluZ19BU19TVFJJTkcoc2VsZik7CisgICAgPSAodW5zaWduZWQgY2hhciAqKSBQeVN0cmluZ19BU19TVFJJTkcoc2VsZik7CiAgICAgcmVnaXN0ZXIgY29uc3QgdW5zaWduZWQgY2hhciAqZTsKICAgICBpbnQgY2FzZWQ7CiAKICAgICAvKiBTaG9ydGN1dCBmb3Igc2luZ2xlIGNoYXJhY3RlciBzdHJpbmdzICovCiAgICAgaWYgKFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpID09IDEpCi0JcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZyhpc3VwcGVyKCpwKSAhPSAwKTsKKyAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKGlzdXBwZXIoKnApICE9IDApOwogCiAgICAgLyogU3BlY2lhbCBjYXNlIGZvciBlbXB0eSBzdHJpbmdzICovCiAgICAgaWYgKFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpID09IDApCi0JcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygwKTsKKyAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKDApOwogCiAgICAgZSA9IHAgKyBQeVN0cmluZ19HRVRfU0laRShzZWxmKTsKICAgICBjYXNlZCA9IDA7CiAgICAgZm9yICg7IHAgPCBlOyBwKyspIHsKLQlpZiAoaXNsb3dlcigqcCkpCi0JICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoMCk7Ci0JZWxzZSBpZiAoIWNhc2VkICYmIGlzdXBwZXIoKnApKQotCSAgICBjYXNlZCA9IDE7CisgICAgaWYgKGlzbG93ZXIoKnApKQorICAgICAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKDApOworICAgIGVsc2UgaWYgKCFjYXNlZCAmJiBpc3VwcGVyKCpwKSkKKyAgICAgICAgY2FzZWQgPSAxOwogICAgIH0KICAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKGNhc2VkKTsKIH0KQEAgLTM4MjgsMzggKzM4MjgsMzggQEAKIHN0cmluZ19pc3RpdGxlKFB5U3RyaW5nT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdW5jYXNlZCkKIHsKICAgICByZWdpc3RlciBjb25zdCB1bnNpZ25lZCBjaGFyICpwCi0gICAgICAgID0gKHVuc2lnbmVkIGNoYXIgKikgUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpOworICAgID0gKHVuc2lnbmVkIGNoYXIgKikgUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpOwogICAgIHJlZ2lzdGVyIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmU7CiAgICAgaW50IGNhc2VkLCBwcmV2aW91c19pc19jYXNlZDsKIAogICAgIC8qIFNob3J0Y3V0IGZvciBzaW5nbGUgY2hhcmFjdGVyIHN0cmluZ3MgKi8KICAgICBpZiAoUHlTdHJpbmdfR0VUX1NJWkUoc2VsZikgPT0gMSkKLQlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKGlzdXBwZXIoKnApICE9IDApOworICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoaXN1cHBlcigqcCkgIT0gMCk7CiAKICAgICAvKiBTcGVjaWFsIGNhc2UgZm9yIGVtcHR5IHN0cmluZ3MgKi8KICAgICBpZiAoUHlTdHJpbmdfR0VUX1NJWkUoc2VsZikgPT0gMCkKLQlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKDApOworICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoMCk7CiAKICAgICBlID0gcCArIFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpOwogICAgIGNhc2VkID0gMDsKICAgICBwcmV2aW91c19pc19jYXNlZCA9IDA7CiAgICAgZm9yICg7IHAgPCBlOyBwKyspIHsKLQlyZWdpc3RlciBjb25zdCB1bnNpZ25lZCBjaGFyIGNoID0gKnA7CisgICAgcmVnaXN0ZXIgY29uc3QgdW5zaWduZWQgY2hhciBjaCA9ICpwOwogCi0JaWYgKGlzdXBwZXIoY2gpKSB7Ci0JICAgIGlmIChwcmV2aW91c19pc19jYXNlZCkKLQkJcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygwKTsKLQkgICAgcHJldmlvdXNfaXNfY2FzZWQgPSAxOwotCSAgICBjYXNlZCA9IDE7Ci0JfQotCWVsc2UgaWYgKGlzbG93ZXIoY2gpKSB7Ci0JICAgIGlmICghcHJldmlvdXNfaXNfY2FzZWQpCi0JCXJldHVybiBQeUJvb2xfRnJvbUxvbmcoMCk7Ci0JICAgIHByZXZpb3VzX2lzX2Nhc2VkID0gMTsKLQkgICAgY2FzZWQgPSAxOwotCX0KLQllbHNlCi0JICAgIHByZXZpb3VzX2lzX2Nhc2VkID0gMDsKKyAgICBpZiAoaXN1cHBlcihjaCkpIHsKKyAgICAgICAgaWYgKHByZXZpb3VzX2lzX2Nhc2VkKQorICAgICAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKDApOworICAgICAgICBwcmV2aW91c19pc19jYXNlZCA9IDE7CisgICAgICAgIGNhc2VkID0gMTsKKyAgICB9CisgICAgZWxzZSBpZiAoaXNsb3dlcihjaCkpIHsKKyAgICAgICAgaWYgKCFwcmV2aW91c19pc19jYXNlZCkKKyAgICAgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygwKTsKKyAgICAgICAgcHJldmlvdXNfaXNfY2FzZWQgPSAxOworICAgICAgICBjYXNlZCA9IDE7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcHJldmlvdXNfaXNfY2FzZWQgPSAwOwogICAgIH0KICAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKGNhc2VkKTsKIH0KQEAgLTM4ODQsNyArMzg4NCw3IEBACiAgICAgY2hhciAqZGF0YTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifGk6c3BsaXRsaW5lcyIsICZrZWVwZW5kcykpCi0gICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBOVUxMOwogCiAgICAgZGF0YSA9IFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKTsKICAgICBsZW4gPSBQeVN0cmluZ19HRVRfU0laRShzZWxmKTsKQEAgLTM4OTksMzEgKzM4OTksMzEgQEAKIAogICAgIGxpc3QgPSBQeUxpc3RfTmV3KDApOwogICAgIGlmICghbGlzdCkKLSAgICAgICAgZ290byBvbkVycm9yOworICAgIGdvdG8gb25FcnJvcjsKIAogICAgIGZvciAoaSA9IGogPSAwOyBpIDwgbGVuOyApIHsKLQlQeV9zc2l6ZV90IGVvbDsKKyAgICBQeV9zc2l6ZV90IGVvbDsKIAotCS8qIEZpbmQgYSBsaW5lIGFuZCBhcHBlbmQgaXQgKi8KLQl3aGlsZSAoaSA8IGxlbiAmJiBkYXRhW2ldICE9ICdcbicgJiYgZGF0YVtpXSAhPSAnXHInKQotCSAgICBpKys7CisgICAgLyogRmluZCBhIGxpbmUgYW5kIGFwcGVuZCBpdCAqLworICAgIHdoaWxlIChpIDwgbGVuICYmIGRhdGFbaV0gIT0gJ1xuJyAmJiBkYXRhW2ldICE9ICdccicpCisgICAgICAgIGkrKzsKIAotCS8qIFNraXAgdGhlIGxpbmUgYnJlYWsgcmVhZGluZyBDUkxGIGFzIG9uZSBsaW5lIGJyZWFrICovCi0JZW9sID0gaTsKLQlpZiAoaSA8IGxlbikgewotCSAgICBpZiAoZGF0YVtpXSA9PSAnXHInICYmIGkgKyAxIDwgbGVuICYmCi0JCWRhdGFbaSsxXSA9PSAnXG4nKQotCQlpICs9IDI7Ci0JICAgIGVsc2UKLQkJaSsrOwotCSAgICBpZiAoa2VlcGVuZHMpCi0JCWVvbCA9IGk7Ci0JfQotCVNQTElUX0FQUEVORChkYXRhLCBqLCBlb2wpOwotCWogPSBpOworICAgIC8qIFNraXAgdGhlIGxpbmUgYnJlYWsgcmVhZGluZyBDUkxGIGFzIG9uZSBsaW5lIGJyZWFrICovCisgICAgZW9sID0gaTsKKyAgICBpZiAoaSA8IGxlbikgeworICAgICAgICBpZiAoZGF0YVtpXSA9PSAnXHInICYmIGkgKyAxIDwgbGVuICYmCisgICAgICAgIGRhdGFbaSsxXSA9PSAnXG4nKQorICAgICAgICBpICs9IDI7CisgICAgICAgIGVsc2UKKyAgICAgICAgaSsrOworICAgICAgICBpZiAoa2VlcGVuZHMpCisgICAgICAgIGVvbCA9IGk7CisgICAgfQorICAgIFNQTElUX0FQUEVORChkYXRhLCBqLCBlb2wpOworICAgIGogPSBpOwogICAgIH0KICAgICBpZiAoaiA8IGxlbikgewotCVNQTElUX0FQUEVORChkYXRhLCBqLCBsZW4pOworICAgIFNQTElUX0FQUEVORChkYXRhLCBqLCBsZW4pOwogICAgIH0KIAogICAgIHJldHVybiBsaXN0OwpAQCAtMzkzOSw5ICszOTM5LDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdHJpbmdfc2l6ZW9mKFB5U3RyaW5nT2JqZWN0ICp2KQogewotCVB5X3NzaXplX3QgcmVzOwotCXJlcyA9IHNpemVvZihQeVN0cmluZ09iamVjdCkgKyB2LT5vYl9zaXplICogdi0+b2JfdHlwZS0+dHBfaXRlbXNpemU7Ci0JcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KHJlcyk7CisgICAgUHlfc3NpemVfdCByZXM7CisgICAgcmVzID0gc2l6ZW9mKFB5U3RyaW5nT2JqZWN0KSArIHYtPm9iX3NpemUgKiB2LT5vYl90eXBlLT50cF9pdGVtc2l6ZTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QocmVzKTsKIH0KIAogI3VuZGVmIFNQTElUX0FQUEVORApAQCAtMzk1Miw3ICszOTUyLDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdHJpbmdfZ2V0bmV3YXJncyhQeVN0cmluZ09iamVjdCAqdikKIHsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKHMjKSIsIHYtPm9iX3N2YWwsIFB5X1NJWkUodikpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIocyMpIiwgdi0+b2Jfc3ZhbCwgUHlfU0laRSh2KSk7CiB9CiAKIApAQCAtMzk3MywyMCArMzk3MywyMCBAQAogICAgIC8qIElmIDIueCwgY29udmVydCBmb3JtYXRfc3BlYyB0byB0aGUgc2FtZSB0eXBlIGFzIHZhbHVlICovCiAgICAgLyogVGhpcyBpcyB0byBhbGxvdyB0aGluZ3MgbGlrZSB1JycuZm9ybWF0KCcnKSAqLwogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTzpfX2Zvcm1hdF9fIiwgJmZvcm1hdF9zcGVjKSkKLSAgICAgICAgZ290byBkb25lOworICAgIGdvdG8gZG9uZTsKICAgICBpZiAoIShQeVN0cmluZ19DaGVjayhmb3JtYXRfc3BlYykgfHwgUHlVbmljb2RlX0NoZWNrKGZvcm1hdF9zcGVjKSkpIHsKLSAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgIl9fZm9ybWF0X18gYXJnIG11c3QgYmUgc3RyICIKLQkJICAgICAib3IgdW5pY29kZSwgbm90ICVzIiwgUHlfVFlQRShmb3JtYXRfc3BlYyktPnRwX25hbWUpOwotCWdvdG8gZG9uZTsKKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAiX19mb3JtYXRfXyBhcmcgbXVzdCBiZSBzdHIgIgorICAgICAgICAgICAgICAgICAib3IgdW5pY29kZSwgbm90ICVzIiwgUHlfVFlQRShmb3JtYXRfc3BlYyktPnRwX25hbWUpOworICAgIGdvdG8gZG9uZTsKICAgICB9CiAgICAgdG1wID0gUHlPYmplY3RfU3RyKGZvcm1hdF9zcGVjKTsKICAgICBpZiAodG1wID09IE5VTEwpCi0gICAgICAgIGdvdG8gZG9uZTsKKyAgICBnb3RvIGRvbmU7CiAgICAgZm9ybWF0X3NwZWMgPSB0bXA7CiAKICAgICByZXN1bHQgPSBfUHlCeXRlc19Gb3JtYXRBZHZhbmNlZChzZWxmLAotCQkJCSAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKGZvcm1hdF9zcGVjKSwKLQkJCQkgICAgIFB5U3RyaW5nX0dFVF9TSVpFKGZvcm1hdF9zcGVjKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKGZvcm1hdF9zcGVjKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19HRVRfU0laRShmb3JtYXRfc3BlYykpOwogZG9uZToKICAgICBQeV9YREVDUkVGKHRtcCk7CiAgICAgcmV0dXJuIHJlc3VsdDsKQEAgLTQwMDAsNjEgKzQwMDAsNjEgQEAKIAogc3RhdGljIFB5TWV0aG9kRGVmCiBzdHJpbmdfbWV0aG9kc1tdID0gewotCS8qIENvdW50ZXJwYXJ0cyBvZiB0aGUgb2Jzb2xldGUgc3Ryb3Btb2R1bGUgZnVuY3Rpb25zOyBleGNlcHQKLQkgICBzdHJpbmcubWFrZXRyYW5zKCkuICovCi0JeyJqb2luIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ19qb2luLCBNRVRIX08sIGpvaW5fX2RvY19ffSwKLQl7InNwbGl0IiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ19zcGxpdCwgTUVUSF9WQVJBUkdTLCBzcGxpdF9fZG9jX199LAotCXsicnNwbGl0IiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ19yc3BsaXQsIE1FVEhfVkFSQVJHUywgcnNwbGl0X19kb2NfX30sCi0JeyJsb3dlciIsIChQeUNGdW5jdGlvbilzdHJpbmdfbG93ZXIsIE1FVEhfTk9BUkdTLCBsb3dlcl9fZG9jX199LAotCXsidXBwZXIiLCAoUHlDRnVuY3Rpb24pc3RyaW5nX3VwcGVyLCBNRVRIX05PQVJHUywgdXBwZXJfX2RvY19ffSwKLQl7ImlzbG93ZXIiLCAoUHlDRnVuY3Rpb24pc3RyaW5nX2lzbG93ZXIsIE1FVEhfTk9BUkdTLCBpc2xvd2VyX19kb2NfX30sCi0JeyJpc3VwcGVyIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ19pc3VwcGVyLCBNRVRIX05PQVJHUywgaXN1cHBlcl9fZG9jX199LAotCXsiaXNzcGFjZSIsIChQeUNGdW5jdGlvbilzdHJpbmdfaXNzcGFjZSwgTUVUSF9OT0FSR1MsIGlzc3BhY2VfX2RvY19ffSwKLQl7ImlzZGlnaXQiLCAoUHlDRnVuY3Rpb24pc3RyaW5nX2lzZGlnaXQsIE1FVEhfTk9BUkdTLCBpc2RpZ2l0X19kb2NfX30sCi0JeyJpc3RpdGxlIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ19pc3RpdGxlLCBNRVRIX05PQVJHUywgaXN0aXRsZV9fZG9jX199LAotCXsiaXNhbHBoYSIsIChQeUNGdW5jdGlvbilzdHJpbmdfaXNhbHBoYSwgTUVUSF9OT0FSR1MsIGlzYWxwaGFfX2RvY19ffSwKLQl7ImlzYWxudW0iLCAoUHlDRnVuY3Rpb24pc3RyaW5nX2lzYWxudW0sIE1FVEhfTk9BUkdTLCBpc2FsbnVtX19kb2NfX30sCi0JeyJjYXBpdGFsaXplIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ19jYXBpdGFsaXplLCBNRVRIX05PQVJHUywKLQkgY2FwaXRhbGl6ZV9fZG9jX199LAotCXsiY291bnQiLCAoUHlDRnVuY3Rpb24pc3RyaW5nX2NvdW50LCBNRVRIX1ZBUkFSR1MsIGNvdW50X19kb2NfX30sCi0JeyJlbmRzd2l0aCIsIChQeUNGdW5jdGlvbilzdHJpbmdfZW5kc3dpdGgsIE1FVEhfVkFSQVJHUywKLQkgZW5kc3dpdGhfX2RvY19ffSwKLQl7InBhcnRpdGlvbiIsIChQeUNGdW5jdGlvbilzdHJpbmdfcGFydGl0aW9uLCBNRVRIX08sIHBhcnRpdGlvbl9fZG9jX199LAotCXsiZmluZCIsIChQeUNGdW5jdGlvbilzdHJpbmdfZmluZCwgTUVUSF9WQVJBUkdTLCBmaW5kX19kb2NfX30sCi0JeyJpbmRleCIsIChQeUNGdW5jdGlvbilzdHJpbmdfaW5kZXgsIE1FVEhfVkFSQVJHUywgaW5kZXhfX2RvY19ffSwKLQl7ImxzdHJpcCIsIChQeUNGdW5jdGlvbilzdHJpbmdfbHN0cmlwLCBNRVRIX1ZBUkFSR1MsIGxzdHJpcF9fZG9jX199LAotCXsicmVwbGFjZSIsIChQeUNGdW5jdGlvbilzdHJpbmdfcmVwbGFjZSwgTUVUSF9WQVJBUkdTLCByZXBsYWNlX19kb2NfX30sCi0JeyJyZmluZCIsIChQeUNGdW5jdGlvbilzdHJpbmdfcmZpbmQsIE1FVEhfVkFSQVJHUywgcmZpbmRfX2RvY19ffSwKLQl7InJpbmRleCIsIChQeUNGdW5jdGlvbilzdHJpbmdfcmluZGV4LCBNRVRIX1ZBUkFSR1MsIHJpbmRleF9fZG9jX199LAotCXsicnN0cmlwIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ19yc3RyaXAsIE1FVEhfVkFSQVJHUywgcnN0cmlwX19kb2NfX30sCi0JeyJycGFydGl0aW9uIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ19ycGFydGl0aW9uLCBNRVRIX08sCi0JIHJwYXJ0aXRpb25fX2RvY19ffSwKLQl7InN0YXJ0c3dpdGgiLCAoUHlDRnVuY3Rpb24pc3RyaW5nX3N0YXJ0c3dpdGgsIE1FVEhfVkFSQVJHUywKLQkgc3RhcnRzd2l0aF9fZG9jX199LAotCXsic3RyaXAiLCAoUHlDRnVuY3Rpb24pc3RyaW5nX3N0cmlwLCBNRVRIX1ZBUkFSR1MsIHN0cmlwX19kb2NfX30sCi0JeyJzd2FwY2FzZSIsIChQeUNGdW5jdGlvbilzdHJpbmdfc3dhcGNhc2UsIE1FVEhfTk9BUkdTLAotCSBzd2FwY2FzZV9fZG9jX199LAotCXsidHJhbnNsYXRlIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ190cmFuc2xhdGUsIE1FVEhfVkFSQVJHUywKLQkgdHJhbnNsYXRlX19kb2NfX30sCi0JeyJ0aXRsZSIsIChQeUNGdW5jdGlvbilzdHJpbmdfdGl0bGUsIE1FVEhfTk9BUkdTLCB0aXRsZV9fZG9jX199LAotCXsibGp1c3QiLCAoUHlDRnVuY3Rpb24pc3RyaW5nX2xqdXN0LCBNRVRIX1ZBUkFSR1MsIGxqdXN0X19kb2NfX30sCi0JeyJyanVzdCIsIChQeUNGdW5jdGlvbilzdHJpbmdfcmp1c3QsIE1FVEhfVkFSQVJHUywgcmp1c3RfX2RvY19ffSwKLQl7ImNlbnRlciIsIChQeUNGdW5jdGlvbilzdHJpbmdfY2VudGVyLCBNRVRIX1ZBUkFSR1MsIGNlbnRlcl9fZG9jX199LAotCXsiemZpbGwiLCAoUHlDRnVuY3Rpb24pc3RyaW5nX3pmaWxsLCBNRVRIX1ZBUkFSR1MsIHpmaWxsX19kb2NfX30sCi0JeyJmb3JtYXQiLCAoUHlDRnVuY3Rpb24pIGRvX3N0cmluZ19mb3JtYXQsIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsIGZvcm1hdF9fZG9jX199LAotCXsiX19mb3JtYXRfXyIsIChQeUNGdW5jdGlvbikgc3RyaW5nX19mb3JtYXRfXywgTUVUSF9WQVJBUkdTLCBwX2Zvcm1hdF9fZG9jX199LAotCXsiX2Zvcm1hdHRlcl9maWVsZF9uYW1lX3NwbGl0IiwgKFB5Q0Z1bmN0aW9uKSBmb3JtYXR0ZXJfZmllbGRfbmFtZV9zcGxpdCwgTUVUSF9OT0FSR1N9LAotCXsiX2Zvcm1hdHRlcl9wYXJzZXIiLCAoUHlDRnVuY3Rpb24pIGZvcm1hdHRlcl9wYXJzZXIsIE1FVEhfTk9BUkdTfSwKLQl7ImVuY29kZSIsIChQeUNGdW5jdGlvbilzdHJpbmdfZW5jb2RlLCBNRVRIX1ZBUkFSR1MsIGVuY29kZV9fZG9jX199LAotCXsiZGVjb2RlIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ19kZWNvZGUsIE1FVEhfVkFSQVJHUywgZGVjb2RlX19kb2NfX30sCi0JeyJleHBhbmR0YWJzIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ19leHBhbmR0YWJzLCBNRVRIX1ZBUkFSR1MsCi0JIGV4cGFuZHRhYnNfX2RvY19ffSwKLQl7InNwbGl0bGluZXMiLCAoUHlDRnVuY3Rpb24pc3RyaW5nX3NwbGl0bGluZXMsIE1FVEhfVkFSQVJHUywKLQkgc3BsaXRsaW5lc19fZG9jX199LAotCXsiX19zaXplb2ZfXyIsIChQeUNGdW5jdGlvbilzdHJpbmdfc2l6ZW9mLCBNRVRIX05PQVJHUywKLQkgc2l6ZW9mX19kb2NfX30sCi0JeyJfX2dldG5ld2FyZ3NfXyIsCShQeUNGdW5jdGlvbilzdHJpbmdfZ2V0bmV3YXJncywJTUVUSF9OT0FSR1N9LAotCXtOVUxMLCAgICAgTlVMTH0JCSAgICAgLyogc2VudGluZWwgKi8KKyAgICAvKiBDb3VudGVycGFydHMgb2YgdGhlIG9ic29sZXRlIHN0cm9wbW9kdWxlIGZ1bmN0aW9uczsgZXhjZXB0CisgICAgICAgc3RyaW5nLm1ha2V0cmFucygpLiAqLworICAgIHsiam9pbiIsIChQeUNGdW5jdGlvbilzdHJpbmdfam9pbiwgTUVUSF9PLCBqb2luX19kb2NfX30sCisgICAgeyJzcGxpdCIsIChQeUNGdW5jdGlvbilzdHJpbmdfc3BsaXQsIE1FVEhfVkFSQVJHUywgc3BsaXRfX2RvY19ffSwKKyAgICB7InJzcGxpdCIsIChQeUNGdW5jdGlvbilzdHJpbmdfcnNwbGl0LCBNRVRIX1ZBUkFSR1MsIHJzcGxpdF9fZG9jX199LAorICAgIHsibG93ZXIiLCAoUHlDRnVuY3Rpb24pc3RyaW5nX2xvd2VyLCBNRVRIX05PQVJHUywgbG93ZXJfX2RvY19ffSwKKyAgICB7InVwcGVyIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ191cHBlciwgTUVUSF9OT0FSR1MsIHVwcGVyX19kb2NfX30sCisgICAgeyJpc2xvd2VyIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ19pc2xvd2VyLCBNRVRIX05PQVJHUywgaXNsb3dlcl9fZG9jX199LAorICAgIHsiaXN1cHBlciIsIChQeUNGdW5jdGlvbilzdHJpbmdfaXN1cHBlciwgTUVUSF9OT0FSR1MsIGlzdXBwZXJfX2RvY19ffSwKKyAgICB7Imlzc3BhY2UiLCAoUHlDRnVuY3Rpb24pc3RyaW5nX2lzc3BhY2UsIE1FVEhfTk9BUkdTLCBpc3NwYWNlX19kb2NfX30sCisgICAgeyJpc2RpZ2l0IiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ19pc2RpZ2l0LCBNRVRIX05PQVJHUywgaXNkaWdpdF9fZG9jX199LAorICAgIHsiaXN0aXRsZSIsIChQeUNGdW5jdGlvbilzdHJpbmdfaXN0aXRsZSwgTUVUSF9OT0FSR1MsIGlzdGl0bGVfX2RvY19ffSwKKyAgICB7ImlzYWxwaGEiLCAoUHlDRnVuY3Rpb24pc3RyaW5nX2lzYWxwaGEsIE1FVEhfTk9BUkdTLCBpc2FscGhhX19kb2NfX30sCisgICAgeyJpc2FsbnVtIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ19pc2FsbnVtLCBNRVRIX05PQVJHUywgaXNhbG51bV9fZG9jX199LAorICAgIHsiY2FwaXRhbGl6ZSIsIChQeUNGdW5jdGlvbilzdHJpbmdfY2FwaXRhbGl6ZSwgTUVUSF9OT0FSR1MsCisgICAgIGNhcGl0YWxpemVfX2RvY19ffSwKKyAgICB7ImNvdW50IiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ19jb3VudCwgTUVUSF9WQVJBUkdTLCBjb3VudF9fZG9jX199LAorICAgIHsiZW5kc3dpdGgiLCAoUHlDRnVuY3Rpb24pc3RyaW5nX2VuZHN3aXRoLCBNRVRIX1ZBUkFSR1MsCisgICAgIGVuZHN3aXRoX19kb2NfX30sCisgICAgeyJwYXJ0aXRpb24iLCAoUHlDRnVuY3Rpb24pc3RyaW5nX3BhcnRpdGlvbiwgTUVUSF9PLCBwYXJ0aXRpb25fX2RvY19ffSwKKyAgICB7ImZpbmQiLCAoUHlDRnVuY3Rpb24pc3RyaW5nX2ZpbmQsIE1FVEhfVkFSQVJHUywgZmluZF9fZG9jX199LAorICAgIHsiaW5kZXgiLCAoUHlDRnVuY3Rpb24pc3RyaW5nX2luZGV4LCBNRVRIX1ZBUkFSR1MsIGluZGV4X19kb2NfX30sCisgICAgeyJsc3RyaXAiLCAoUHlDRnVuY3Rpb24pc3RyaW5nX2xzdHJpcCwgTUVUSF9WQVJBUkdTLCBsc3RyaXBfX2RvY19ffSwKKyAgICB7InJlcGxhY2UiLCAoUHlDRnVuY3Rpb24pc3RyaW5nX3JlcGxhY2UsIE1FVEhfVkFSQVJHUywgcmVwbGFjZV9fZG9jX199LAorICAgIHsicmZpbmQiLCAoUHlDRnVuY3Rpb24pc3RyaW5nX3JmaW5kLCBNRVRIX1ZBUkFSR1MsIHJmaW5kX19kb2NfX30sCisgICAgeyJyaW5kZXgiLCAoUHlDRnVuY3Rpb24pc3RyaW5nX3JpbmRleCwgTUVUSF9WQVJBUkdTLCByaW5kZXhfX2RvY19ffSwKKyAgICB7InJzdHJpcCIsIChQeUNGdW5jdGlvbilzdHJpbmdfcnN0cmlwLCBNRVRIX1ZBUkFSR1MsIHJzdHJpcF9fZG9jX199LAorICAgIHsicnBhcnRpdGlvbiIsIChQeUNGdW5jdGlvbilzdHJpbmdfcnBhcnRpdGlvbiwgTUVUSF9PLAorICAgICBycGFydGl0aW9uX19kb2NfX30sCisgICAgeyJzdGFydHN3aXRoIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ19zdGFydHN3aXRoLCBNRVRIX1ZBUkFSR1MsCisgICAgIHN0YXJ0c3dpdGhfX2RvY19ffSwKKyAgICB7InN0cmlwIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ19zdHJpcCwgTUVUSF9WQVJBUkdTLCBzdHJpcF9fZG9jX199LAorICAgIHsic3dhcGNhc2UiLCAoUHlDRnVuY3Rpb24pc3RyaW5nX3N3YXBjYXNlLCBNRVRIX05PQVJHUywKKyAgICAgc3dhcGNhc2VfX2RvY19ffSwKKyAgICB7InRyYW5zbGF0ZSIsIChQeUNGdW5jdGlvbilzdHJpbmdfdHJhbnNsYXRlLCBNRVRIX1ZBUkFSR1MsCisgICAgIHRyYW5zbGF0ZV9fZG9jX199LAorICAgIHsidGl0bGUiLCAoUHlDRnVuY3Rpb24pc3RyaW5nX3RpdGxlLCBNRVRIX05PQVJHUywgdGl0bGVfX2RvY19ffSwKKyAgICB7ImxqdXN0IiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ19sanVzdCwgTUVUSF9WQVJBUkdTLCBsanVzdF9fZG9jX199LAorICAgIHsicmp1c3QiLCAoUHlDRnVuY3Rpb24pc3RyaW5nX3JqdXN0LCBNRVRIX1ZBUkFSR1MsIHJqdXN0X19kb2NfX30sCisgICAgeyJjZW50ZXIiLCAoUHlDRnVuY3Rpb24pc3RyaW5nX2NlbnRlciwgTUVUSF9WQVJBUkdTLCBjZW50ZXJfX2RvY19ffSwKKyAgICB7InpmaWxsIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ196ZmlsbCwgTUVUSF9WQVJBUkdTLCB6ZmlsbF9fZG9jX199LAorICAgIHsiZm9ybWF0IiwgKFB5Q0Z1bmN0aW9uKSBkb19zdHJpbmdfZm9ybWF0LCBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLCBmb3JtYXRfX2RvY19ffSwKKyAgICB7Il9fZm9ybWF0X18iLCAoUHlDRnVuY3Rpb24pIHN0cmluZ19fZm9ybWF0X18sIE1FVEhfVkFSQVJHUywgcF9mb3JtYXRfX2RvY19ffSwKKyAgICB7Il9mb3JtYXR0ZXJfZmllbGRfbmFtZV9zcGxpdCIsIChQeUNGdW5jdGlvbikgZm9ybWF0dGVyX2ZpZWxkX25hbWVfc3BsaXQsIE1FVEhfTk9BUkdTfSwKKyAgICB7Il9mb3JtYXR0ZXJfcGFyc2VyIiwgKFB5Q0Z1bmN0aW9uKSBmb3JtYXR0ZXJfcGFyc2VyLCBNRVRIX05PQVJHU30sCisgICAgeyJlbmNvZGUiLCAoUHlDRnVuY3Rpb24pc3RyaW5nX2VuY29kZSwgTUVUSF9WQVJBUkdTLCBlbmNvZGVfX2RvY19ffSwKKyAgICB7ImRlY29kZSIsIChQeUNGdW5jdGlvbilzdHJpbmdfZGVjb2RlLCBNRVRIX1ZBUkFSR1MsIGRlY29kZV9fZG9jX199LAorICAgIHsiZXhwYW5kdGFicyIsIChQeUNGdW5jdGlvbilzdHJpbmdfZXhwYW5kdGFicywgTUVUSF9WQVJBUkdTLAorICAgICBleHBhbmR0YWJzX19kb2NfX30sCisgICAgeyJzcGxpdGxpbmVzIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ19zcGxpdGxpbmVzLCBNRVRIX1ZBUkFSR1MsCisgICAgIHNwbGl0bGluZXNfX2RvY19ffSwKKyAgICB7Il9fc2l6ZW9mX18iLCAoUHlDRnVuY3Rpb24pc3RyaW5nX3NpemVvZiwgTUVUSF9OT0FSR1MsCisgICAgIHNpemVvZl9fZG9jX199LAorICAgIHsiX19nZXRuZXdhcmdzX18iLCAgICAgICAgICAoUHlDRnVuY3Rpb24pc3RyaW5nX2dldG5ld2FyZ3MsIE1FVEhfTk9BUkdTfSwKKyAgICB7TlVMTCwgICAgIE5VTEx9ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKgpAQCAtNDA2MywxMTEgKzQwNjMsMTExIEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3RyaW5nX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlQeU9iamVjdCAqeCA9IE5VTEw7Ci0Jc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJvYmplY3QiLCAwfTsKKyAgICBQeU9iamVjdCAqeCA9IE5VTEw7CisgICAgc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJvYmplY3QiLCAwfTsKIAotCWlmICh0eXBlICE9ICZQeVN0cmluZ19UeXBlKQotCQlyZXR1cm4gc3RyX3N1YnR5cGVfbmV3KHR5cGUsIGFyZ3MsIGt3ZHMpOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJ8TzpzdHIiLCBrd2xpc3QsICZ4KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKHggPT0gTlVMTCkKLQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoIiIpOwotCXJldHVybiBQeU9iamVjdF9TdHIoeCk7CisgICAgaWYgKHR5cGUgIT0gJlB5U3RyaW5nX1R5cGUpCisgICAgICAgIHJldHVybiBzdHJfc3VidHlwZV9uZXcodHlwZSwgYXJncywga3dkcyk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgInxPOnN0ciIsIGt3bGlzdCwgJngpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoeCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZygiIik7CisgICAgcmV0dXJuIFB5T2JqZWN0X1N0cih4KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHN0cl9zdWJ0eXBlX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlQeU9iamVjdCAqdG1wLCAqcG5ldzsKLQlQeV9zc2l6ZV90IG47CisgICAgUHlPYmplY3QgKnRtcCwgKnBuZXc7CisgICAgUHlfc3NpemVfdCBuOwogCi0JYXNzZXJ0KFB5VHlwZV9Jc1N1YnR5cGUodHlwZSwgJlB5U3RyaW5nX1R5cGUpKTsKLQl0bXAgPSBzdHJpbmdfbmV3KCZQeVN0cmluZ19UeXBlLCBhcmdzLCBrd2RzKTsKLQlpZiAodG1wID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWFzc2VydChQeVN0cmluZ19DaGVja0V4YWN0KHRtcCkpOwotCW4gPSBQeVN0cmluZ19HRVRfU0laRSh0bXApOwotCXBuZXcgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCBuKTsKLQlpZiAocG5ldyAhPSBOVUxMKSB7Ci0JCVB5X01FTUNQWShQeVN0cmluZ19BU19TVFJJTkcocG5ldyksIFB5U3RyaW5nX0FTX1NUUklORyh0bXApLCBuKzEpOwotCQkoKFB5U3RyaW5nT2JqZWN0ICopcG5ldyktPm9iX3NoYXNoID0KLQkJCSgoUHlTdHJpbmdPYmplY3QgKil0bXApLT5vYl9zaGFzaDsKLQkJKChQeVN0cmluZ09iamVjdCAqKXBuZXcpLT5vYl9zc3RhdGUgPSBTU1RBVEVfTk9UX0lOVEVSTkVEOwotCX0KLQlQeV9ERUNSRUYodG1wKTsKLQlyZXR1cm4gcG5ldzsKKyAgICBhc3NlcnQoUHlUeXBlX0lzU3VidHlwZSh0eXBlLCAmUHlTdHJpbmdfVHlwZSkpOworICAgIHRtcCA9IHN0cmluZ19uZXcoJlB5U3RyaW5nX1R5cGUsIGFyZ3MsIGt3ZHMpOworICAgIGlmICh0bXAgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYXNzZXJ0KFB5U3RyaW5nX0NoZWNrRXhhY3QodG1wKSk7CisgICAgbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHRtcCk7CisgICAgcG5ldyA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIG4pOworICAgIGlmIChwbmV3ICE9IE5VTEwpIHsKKyAgICAgICAgUHlfTUVNQ1BZKFB5U3RyaW5nX0FTX1NUUklORyhwbmV3KSwgUHlTdHJpbmdfQVNfU1RSSU5HKHRtcCksIG4rMSk7CisgICAgICAgICgoUHlTdHJpbmdPYmplY3QgKilwbmV3KS0+b2Jfc2hhc2ggPQorICAgICAgICAgICAgKChQeVN0cmluZ09iamVjdCAqKXRtcCktPm9iX3NoYXNoOworICAgICAgICAoKFB5U3RyaW5nT2JqZWN0ICopcG5ldyktPm9iX3NzdGF0ZSA9IFNTVEFURV9OT1RfSU5URVJORUQ7CisgICAgfQorICAgIFB5X0RFQ1JFRih0bXApOworICAgIHJldHVybiBwbmV3OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYmFzZXN0cmluZ19uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCSJUaGUgYmFzZXN0cmluZyB0eXBlIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQiKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAiVGhlIGJhc2VzdHJpbmcgdHlwZSBjYW5ub3QgYmUgaW5zdGFudGlhdGVkIik7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdHJpbmdfbW9kKFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdykKIHsKLQlpZiAoIVB5U3RyaW5nX0NoZWNrKHYpKSB7Ci0JCVB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7Ci0JCXJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKLQl9Ci0JcmV0dXJuIFB5U3RyaW5nX0Zvcm1hdCh2LCB3KTsKKyAgICBpZiAoIVB5U3RyaW5nX0NoZWNrKHYpKSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7CisgICAgICAgIHJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKKyAgICB9CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zvcm1hdCh2LCB3KTsKIH0KIAogUHlEb2NfU1RSVkFSKGJhc2VzdHJpbmdfZG9jLAogIlR5cGUgYmFzZXN0cmluZyBjYW5ub3QgYmUgaW5zdGFudGlhdGVkOyBpdCBpcyB0aGUgYmFzZSBmb3Igc3RyIGFuZCB1bmljb2RlLiIpOwogCiBzdGF0aWMgUHlOdW1iZXJNZXRob2RzIHN0cmluZ19hc19udW1iZXIgPSB7Ci0JMCwJCQkvKm5iX2FkZCovCi0JMCwJCQkvKm5iX3N1YnRyYWN0Ki8KLQkwLAkJCS8qbmJfbXVsdGlwbHkqLwotCTAsIAkJCS8qbmJfZGl2aWRlKi8KLQlzdHJpbmdfbW9kLAkJLypuYl9yZW1haW5kZXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKm5iX2FkZCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbmJfc3VidHJhY3QqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKm5iX211bHRpcGx5Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLypuYl9kaXZpZGUqLworICAgIHN0cmluZ19tb2QsICAgICAgICAgICAgICAgICAvKm5iX3JlbWFpbmRlciovCiB9OwogCiAKIFB5VHlwZU9iamVjdCBQeUJhc2VTdHJpbmdfVHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQotCSJiYXNlc3RyaW5nIiwKLQkwLAotCTAsCi0gCTAsCQkJIAkJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJIAkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkwLAkJIAkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJIAkJCS8qIHRwX2hhc2ggKi8KLQkwLAkJCQkJLyogdHBfY2FsbCAqLwotCTAsCQkJCQkvKiB0cF9zdHIgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQliYXNlc3RyaW5nX2RvYywJCQkJLyogdHBfZG9jICovCi0JMCwJCQkJCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkJLyogdHBfaXRlcm5leHQgKi8KLQkwLAkJCQkJLyogdHBfbWV0aG9kcyAqLwotCTAsCQkJCQkvKiB0cF9tZW1iZXJzICovCi0JMCwJCQkJCS8qIHRwX2dldHNldCAqLwotCSZQeUJhc2VPYmplY3RfVHlwZSwJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJCS8qIHRwX2RpY3QgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2luaXQgKi8KLQkwLAkJCQkJLyogdHBfYWxsb2MgKi8KLQliYXNlc3RyaW5nX25ldywJCQkJLyogdHBfbmV3ICovCi0JMCwJCSAgICAgICAgICAgICAgICAJLyogdHBfZnJlZSAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCisgICAgImJhc2VzdHJpbmciLAorICAgIDAsCisgICAgMCwKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KKyAgICBiYXNlc3RyaW5nX2RvYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAmUHlCYXNlT2JqZWN0X1R5cGUsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIGJhc2VzdHJpbmdfbmV3LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCiB9OwogCiBQeURvY19TVFJWQVIoc3RyaW5nX2RvYywKQEAgLTQxNzcsNzAgKzQxNzcsNzAgQEAKIElmIHRoZSBhcmd1bWVudCBpcyBhIHN0cmluZywgdGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgc2FtZSBvYmplY3QuIik7CiAKIFB5VHlwZU9iamVjdCBQeVN0cmluZ19UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCi0JInN0ciIsCi0Jc2l6ZW9mKFB5U3RyaW5nT2JqZWN0KSwKLQlzaXplb2YoY2hhciksCi0gCXN0cmluZ19kZWFsbG9jLCAJCQkvKiB0cF9kZWFsbG9jICovCi0JKHByaW50ZnVuYylzdHJpbmdfcHJpbnQsIAkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQlzdHJpbmdfcmVwciwgCQkJCS8qIHRwX3JlcHIgKi8KLQkmc3RyaW5nX2FzX251bWJlciwJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkmc3RyaW5nX2FzX3NlcXVlbmNlLAkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JJnN0cmluZ19hc19tYXBwaW5nLAkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpc3RyaW5nX2hhc2gsIAkJCS8qIHRwX2hhc2ggKi8KLQkwLAkJCQkJLyogdHBfY2FsbCAqLwotCXN0cmluZ19zdHIsCQkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkmc3RyaW5nX2FzX2J1ZmZlciwJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0NIRUNLVFlQRVMgfAotCQlQeV9UUEZMQUdTX0JBU0VUWVBFIHwgUHlfVFBGTEFHU19TVFJJTkdfU1VCQ0xBU1MgfAotCQlQeV9UUEZMQUdTX0hBVkVfTkVXQlVGRkVSLAkvKiB0cF9mbGFncyAqLwotCXN0cmluZ19kb2MsCQkJCS8qIHRwX2RvYyAqLwotCTAsCQkJCQkvKiB0cF90cmF2ZXJzZSAqLwotCTAsCQkJCQkvKiB0cF9jbGVhciAqLwotCShyaWNoY21wZnVuYylzdHJpbmdfcmljaGNvbXBhcmUsCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkJLyogdHBfaXRlcm5leHQgKi8KLQlzdHJpbmdfbWV0aG9kcywJCQkJLyogdHBfbWV0aG9kcyAqLwotCTAsCQkJCQkvKiB0cF9tZW1iZXJzICovCi0JMCwJCQkJCS8qIHRwX2dldHNldCAqLwotCSZQeUJhc2VTdHJpbmdfVHlwZSwJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJCS8qIHRwX2RpY3QgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2luaXQgKi8KLQkwLAkJCQkJLyogdHBfYWxsb2MgKi8KLQlzdHJpbmdfbmV3LAkJCQkvKiB0cF9uZXcgKi8KLQlQeU9iamVjdF9EZWwsCSAgICAgICAgICAgICAgICAJLyogdHBfZnJlZSAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCisgICAgInN0ciIsCisgICAgc2l6ZW9mKFB5U3RyaW5nT2JqZWN0KSwKKyAgICBzaXplb2YoY2hhciksCisgICAgc3RyaW5nX2RlYWxsb2MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgKHByaW50ZnVuYylzdHJpbmdfcHJpbnQsICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIHN0cmluZ19yZXByLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgICZzdHJpbmdfYXNfbnVtYmVyLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgJnN0cmluZ19hc19zZXF1ZW5jZSwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgICZzdHJpbmdfYXNfbWFwcGluZywgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIChoYXNoZnVuYylzdHJpbmdfaGFzaCwgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIHN0cmluZ19zdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAmc3RyaW5nX2FzX2J1ZmZlciwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfQ0hFQ0tUWVBFUyB8CisgICAgICAgIFB5X1RQRkxBR1NfQkFTRVRZUEUgfCBQeV9UUEZMQUdTX1NUUklOR19TVUJDTEFTUyB8CisgICAgICAgIFB5X1RQRkxBR1NfSEFWRV9ORVdCVUZGRVIsICAgICAgICAgICAgICAvKiB0cF9mbGFncyAqLworICAgIHN0cmluZ19kb2MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAocmljaGNtcGZ1bmMpc3RyaW5nX3JpY2hjb21wYXJlLCAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICBzdHJpbmdfbWV0aG9kcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgICZQeUJhc2VTdHJpbmdfVHlwZSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgc3RyaW5nX25ldywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICBQeU9iamVjdF9EZWwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KIH07CiAKIHZvaWQKIFB5U3RyaW5nX0NvbmNhdChyZWdpc3RlciBQeU9iamVjdCAqKnB2LCByZWdpc3RlciBQeU9iamVjdCAqdykKIHsKLQlyZWdpc3RlciBQeU9iamVjdCAqdjsKLQlpZiAoKnB2ID09IE5VTEwpCi0JCXJldHVybjsKLQlpZiAodyA9PSBOVUxMIHx8ICFQeVN0cmluZ19DaGVjaygqcHYpKSB7Ci0JCVB5X0RFQ1JFRigqcHYpOwotCQkqcHYgPSBOVUxMOwotCQlyZXR1cm47Ci0JfQotCXYgPSBzdHJpbmdfY29uY2F0KChQeVN0cmluZ09iamVjdCAqKSAqcHYsIHcpOwotCVB5X0RFQ1JFRigqcHYpOwotCSpwdiA9IHY7CisgICAgcmVnaXN0ZXIgUHlPYmplY3QgKnY7CisgICAgaWYgKCpwdiA9PSBOVUxMKQorICAgICAgICByZXR1cm47CisgICAgaWYgKHcgPT0gTlVMTCB8fCAhUHlTdHJpbmdfQ2hlY2soKnB2KSkgeworICAgICAgICBQeV9ERUNSRUYoKnB2KTsKKyAgICAgICAgKnB2ID0gTlVMTDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICB2ID0gc3RyaW5nX2NvbmNhdCgoUHlTdHJpbmdPYmplY3QgKikgKnB2LCB3KTsKKyAgICBQeV9ERUNSRUYoKnB2KTsKKyAgICAqcHYgPSB2OwogfQogCiB2b2lkCiBQeVN0cmluZ19Db25jYXRBbmREZWwocmVnaXN0ZXIgUHlPYmplY3QgKipwdiwgcmVnaXN0ZXIgUHlPYmplY3QgKncpCiB7Ci0JUHlTdHJpbmdfQ29uY2F0KHB2LCB3KTsKLQlQeV9YREVDUkVGKHcpOworICAgIFB5U3RyaW5nX0NvbmNhdChwdiwgdyk7CisgICAgUHlfWERFQ1JFRih3KTsKIH0KIAogCkBAIC00MjYxLDMyICs0MjYxLDMyIEBACiBpbnQKIF9QeVN0cmluZ19SZXNpemUoUHlPYmplY3QgKipwdiwgUHlfc3NpemVfdCBuZXdzaXplKQogewotCXJlZ2lzdGVyIFB5T2JqZWN0ICp2OwotCXJlZ2lzdGVyIFB5U3RyaW5nT2JqZWN0ICpzdjsKLQl2ID0gKnB2OwotCWlmICghUHlTdHJpbmdfQ2hlY2sodikgfHwgUHlfUkVGQ05UKHYpICE9IDEgfHwgbmV3c2l6ZSA8IDAgfHwKLQkgICAgUHlTdHJpbmdfQ0hFQ0tfSU5URVJORUQodikpIHsKLQkJKnB2ID0gMDsKLQkJUHlfREVDUkVGKHYpOwotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIC0xOwotCX0KLQkvKiBYWFggVU5SRUYvTkVXUkVGIGludGVyZmFjZSBzaG91bGQgYmUgbW9yZSBzeW1tZXRyaWNhbCAqLwotCV9QeV9ERUNfUkVGVE9UQUw7Ci0JX1B5X0ZvcmdldFJlZmVyZW5jZSh2KTsKLQkqcHYgPSAoUHlPYmplY3QgKikKLQkJUHlPYmplY3RfUkVBTExPQygoY2hhciAqKXYsIHNpemVvZihQeVN0cmluZ09iamVjdCkgKyBuZXdzaXplKTsKLQlpZiAoKnB2ID09IE5VTEwpIHsKLQkJUHlPYmplY3RfRGVsKHYpOwotCQlQeUVycl9Ob01lbW9yeSgpOwotCQlyZXR1cm4gLTE7Ci0JfQotCV9QeV9OZXdSZWZlcmVuY2UoKnB2KTsKLQlzdiA9IChQeVN0cmluZ09iamVjdCAqKSAqcHY7Ci0JUHlfU0laRShzdikgPSBuZXdzaXplOwotCXN2LT5vYl9zdmFsW25ld3NpemVdID0gJ1wwJzsKLQlzdi0+b2Jfc2hhc2ggPSAtMTsJLyogaW52YWxpZGF0ZSBjYWNoZWQgaGFzaCB2YWx1ZSAqLwotCXJldHVybiAwOworICAgIHJlZ2lzdGVyIFB5T2JqZWN0ICp2OworICAgIHJlZ2lzdGVyIFB5U3RyaW5nT2JqZWN0ICpzdjsKKyAgICB2ID0gKnB2OworICAgIGlmICghUHlTdHJpbmdfQ2hlY2sodikgfHwgUHlfUkVGQ05UKHYpICE9IDEgfHwgbmV3c2l6ZSA8IDAgfHwKKyAgICAgICAgUHlTdHJpbmdfQ0hFQ0tfSU5URVJORUQodikpIHsKKyAgICAgICAgKnB2ID0gMDsKKyAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICAvKiBYWFggVU5SRUYvTkVXUkVGIGludGVyZmFjZSBzaG91bGQgYmUgbW9yZSBzeW1tZXRyaWNhbCAqLworICAgIF9QeV9ERUNfUkVGVE9UQUw7CisgICAgX1B5X0ZvcmdldFJlZmVyZW5jZSh2KTsKKyAgICAqcHYgPSAoUHlPYmplY3QgKikKKyAgICAgICAgUHlPYmplY3RfUkVBTExPQygoY2hhciAqKXYsIHNpemVvZihQeVN0cmluZ09iamVjdCkgKyBuZXdzaXplKTsKKyAgICBpZiAoKnB2ID09IE5VTEwpIHsKKyAgICAgICAgUHlPYmplY3RfRGVsKHYpOworICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIF9QeV9OZXdSZWZlcmVuY2UoKnB2KTsKKyAgICBzdiA9IChQeVN0cmluZ09iamVjdCAqKSAqcHY7CisgICAgUHlfU0laRShzdikgPSBuZXdzaXplOworICAgIHN2LT5vYl9zdmFsW25ld3NpemVdID0gJ1wwJzsKKyAgICBzdi0+b2Jfc2hhc2ggPSAtMTsgICAgICAgICAgLyogaW52YWxpZGF0ZSBjYWNoZWQgaGFzaCB2YWx1ZSAqLworICAgIHJldHVybiAwOwogfQogCiAvKiBIZWxwZXJzIGZvciBmb3JtYXRzdHJpbmcgKi8KQEAgLTQyOTQsODkgKzQyOTQsODkgQEAKIFB5X0xPQ0FMX0lOTElORShQeU9iamVjdCAqKQogZ2V0bmV4dGFyZyhQeU9iamVjdCAqYXJncywgUHlfc3NpemVfdCBhcmdsZW4sIFB5X3NzaXplX3QgKnBfYXJnaWR4KQogewotCVB5X3NzaXplX3QgYXJnaWR4ID0gKnBfYXJnaWR4OwotCWlmIChhcmdpZHggPCBhcmdsZW4pIHsKLQkJKCpwX2FyZ2lkeCkrKzsKLQkJaWYgKGFyZ2xlbiA8IDApCi0JCQlyZXR1cm4gYXJnczsKLQkJZWxzZQotCQkJcmV0dXJuIFB5VHVwbGVfR2V0SXRlbShhcmdzLCBhcmdpZHgpOwotCX0KLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJIm5vdCBlbm91Z2ggYXJndW1lbnRzIGZvciBmb3JtYXQgc3RyaW5nIik7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlfc3NpemVfdCBhcmdpZHggPSAqcF9hcmdpZHg7CisgICAgaWYgKGFyZ2lkeCA8IGFyZ2xlbikgeworICAgICAgICAoKnBfYXJnaWR4KSsrOworICAgICAgICBpZiAoYXJnbGVuIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBhcmdzOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gUHlUdXBsZV9HZXRJdGVtKGFyZ3MsIGFyZ2lkeCk7CisgICAgfQorICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICJub3QgZW5vdWdoIGFyZ3VtZW50cyBmb3IgZm9ybWF0IHN0cmluZyIpOworICAgIHJldHVybiBOVUxMOwogfQogCiAvKiBGb3JtYXQgY29kZXMKLSAqIEZfTEpVU1QJJy0nCi0gKiBGX1NJR04JJysnCi0gKiBGX0JMQU5LCScgJwotICogRl9BTFQJJyMnCi0gKiBGX1pFUk8JJzAnCisgKiBGX0xKVVNUICAgICAgJy0nCisgKiBGX1NJR04gICAgICAgJysnCisgKiBGX0JMQU5LICAgICAgJyAnCisgKiBGX0FMVCAgICAgICAgJyMnCisgKiBGX1pFUk8gICAgICAgJzAnCiAgKi8KICNkZWZpbmUgRl9MSlVTVCAoMTw8MCkKLSNkZWZpbmUgRl9TSUdOCSgxPDwxKQorI2RlZmluZSBGX1NJR04gICgxPDwxKQogI2RlZmluZSBGX0JMQU5LICgxPDwyKQotI2RlZmluZSBGX0FMVAkoMTw8MykKLSNkZWZpbmUgRl9aRVJPCSgxPDw0KQorI2RlZmluZSBGX0FMVCAgICgxPDwzKQorI2RlZmluZSBGX1pFUk8gICgxPDw0KQogCiBQeV9MT0NBTF9JTkxJTkUoaW50KQogZm9ybWF0ZmxvYXQoY2hhciAqYnVmLCBzaXplX3QgYnVmbGVuLCBpbnQgZmxhZ3MsCiAgICAgICAgICAgICBpbnQgcHJlYywgaW50IHR5cGUsIFB5T2JqZWN0ICp2KQogewotCS8qIGZtdCA9ICclIy4nICsgYHByZWNgICsgYHR5cGVgCi0JICAgd29yc3QgY2FzZSBsZW5ndGggPSAzICsgMTAgKGxlbiBvZiBJTlRfTUFYKSArIDEgPSAxNCAodXNlIDIwKSovCi0JY2hhciBmbXRbMjBdOwotCWRvdWJsZSB4OwotCXggPSBQeUZsb2F0X0FzRG91YmxlKHYpOwotCWlmICh4ID09IC0xLjAgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAiZmxvYXQgYXJndW1lbnQgcmVxdWlyZWQsICIKLQkJCSAgICAgIm5vdCAlLjIwMHMiLCBQeV9UWVBFKHYpLT50cF9uYW1lKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAocHJlYyA8IDApCi0JCXByZWMgPSA2OworICAgIC8qIGZtdCA9ICclIy4nICsgYHByZWNgICsgYHR5cGVgCisgICAgICAgd29yc3QgY2FzZSBsZW5ndGggPSAzICsgMTAgKGxlbiBvZiBJTlRfTUFYKSArIDEgPSAxNCAodXNlIDIwKSovCisgICAgY2hhciBmbXRbMjBdOworICAgIGRvdWJsZSB4OworICAgIHggPSBQeUZsb2F0X0FzRG91YmxlKHYpOworICAgIGlmICh4ID09IC0xLjAgJiYgUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAiZmxvYXQgYXJndW1lbnQgcmVxdWlyZWQsICIKKyAgICAgICAgICAgICAgICAgICAgICJub3QgJS4yMDBzIiwgUHlfVFlQRSh2KS0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKHByZWMgPCAwKQorICAgICAgICBwcmVjID0gNjsKICNpZiBTSVpFT0ZfSU5UID4gNAotCS8qIG1ha2Ugc3VyZSB0aGF0IHRoZSBkZWNpbWFsIHJlcHJlc2VudGF0aW9uIG9mIHByZWNpc2lvbiByZWFsbHkgZG9lcwotCSAgIG5lZWQgYXQgbW9zdCAxMCBkaWdpdHM6IHBsYXRmb3JtcyB3aXRoIHNpemVvZihpbnQpID09IDggZXhpc3QhICovCi0JaWYgKHByZWMgPiAweDdmZmZmZmZmKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJCSJvdXRyYWdlb3VzbHkgbGFyZ2UgcHJlY2lzaW9uICIKLQkJCQkiZm9yIGZvcm1hdHRlZCBmbG9hdCIpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIC8qIG1ha2Ugc3VyZSB0aGF0IHRoZSBkZWNpbWFsIHJlcHJlc2VudGF0aW9uIG9mIHByZWNpc2lvbiByZWFsbHkgZG9lcworICAgICAgIG5lZWQgYXQgbW9zdCAxMCBkaWdpdHM6IHBsYXRmb3JtcyB3aXRoIHNpemVvZihpbnQpID09IDggZXhpc3QhICovCisgICAgaWYgKHByZWMgPiAweDdmZmZmZmZmKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIm91dHJhZ2VvdXNseSBsYXJnZSBwcmVjaXNpb24gIgorICAgICAgICAgICAgICAgICAgICAgICAgImZvciBmb3JtYXR0ZWQgZmxvYXQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KICNlbmRpZgogCi0JaWYgKHR5cGUgPT0gJ2YnICYmIGZhYnMoeCkgPj0gMWU1MCkKLQkJdHlwZSA9ICdnJzsKLQkvKiBXb3JzdCBjYXNlIGxlbmd0aCBjYWxjIHRvIGVuc3VyZSBubyBidWZmZXIgb3ZlcnJ1bjoKKyAgICBpZiAodHlwZSA9PSAnZicgJiYgZmFicyh4KSA+PSAxZTUwKQorICAgICAgICB0eXBlID0gJ2cnOworICAgIC8qIFdvcnN0IGNhc2UgbGVuZ3RoIGNhbGMgdG8gZW5zdXJlIG5vIGJ1ZmZlciBvdmVycnVuOgogCi0JICAgJ2cnIGZvcm1hdHM6Ci0JICAgICBmbXQgPSAlIy48cHJlYz5nCi0JICAgICBidWYgPSAnLScgKyBbMC05XSpwcmVjICsgJy4nICsgJ2UrJyArIChsb25nZXN0IGV4cAotCSAgICAgICAgZm9yIGFueSBkb3VibGUgcmVwLikKLQkgICAgIGxlbiA9IDEgKyBwcmVjICsgMSArIDIgKyA1ID0gOSArIHByZWMKKyAgICAgICAnZycgZm9ybWF0czoKKyAgICAgICAgIGZtdCA9ICUjLjxwcmVjPmcKKyAgICAgICAgIGJ1ZiA9ICctJyArIFswLTldKnByZWMgKyAnLicgKyAnZSsnICsgKGxvbmdlc3QgZXhwCisgICAgICAgIGZvciBhbnkgZG91YmxlIHJlcC4pCisgICAgICAgICBsZW4gPSAxICsgcHJlYyArIDEgKyAyICsgNSA9IDkgKyBwcmVjCiAKLQkgICAnZicgZm9ybWF0czoKLQkgICAgIGJ1ZiA9ICctJyArIFswLTldKnggKyAnLicgKyBbMC05XSpwcmVjICh3aXRoIHggPCA1MCkKLQkgICAgIGxlbiA9IDEgKyA1MCArIDEgKyBwcmVjID0gNTIgKyBwcmVjCisgICAgICAgJ2YnIGZvcm1hdHM6CisgICAgICAgICBidWYgPSAnLScgKyBbMC05XSp4ICsgJy4nICsgWzAtOV0qcHJlYyAod2l0aCB4IDwgNTApCisgICAgICAgICBsZW4gPSAxICsgNTAgKyAxICsgcHJlYyA9IDUyICsgcHJlYwogCi0JICAgSWYgcHJlYz0wIHRoZSBlZmZlY3RpdmUgcHJlY2lzaW9uIGlzIDEgKHRoZSBsZWFkaW5nIGRpZ2l0IGlzCi0JICAgYWx3YXlzIGdpdmVuKSwgdGhlcmVmb3JlIGluY3JlYXNlIHRoZSBsZW5ndGggYnkgb25lLgorICAgICAgIElmIHByZWM9MCB0aGUgZWZmZWN0aXZlIHByZWNpc2lvbiBpcyAxICh0aGUgbGVhZGluZyBkaWdpdCBpcworICAgICAgIGFsd2F5cyBnaXZlbiksIHRoZXJlZm9yZSBpbmNyZWFzZSB0aGUgbGVuZ3RoIGJ5IG9uZS4KIAotCSovCi0JaWYgKCgodHlwZSA9PSAnZycgfHwgdHlwZSA9PSAnRycpICYmCi0gICAgICAgICAgICAgIGJ1ZmxlbiA8PSAoc2l6ZV90KTEwICsgKHNpemVfdClwcmVjKSB8fAotCSAgICAodHlwZSA9PSAnZicgJiYgYnVmbGVuIDw9IChzaXplX3QpNTMgKyAoc2l6ZV90KXByZWMpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJImZvcm1hdHRlZCBmbG9hdCBpcyB0b28gbG9uZyAocHJlY2lzaW9uIHRvbyBsYXJnZT8pIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JUHlPU19zbnByaW50ZihmbXQsIHNpemVvZihmbXQpLCAiJSUlcy4lZCVjIiwKLQkJICAgICAgKGZsYWdzJkZfQUxUKSA/ICIjIiA6ICIiLAotCQkgICAgICBwcmVjLCB0eXBlKTsKLQlQeU9TX2FzY2lpX2Zvcm1hdGQoYnVmLCBidWZsZW4sIGZtdCwgeCk7Ci0JcmV0dXJuIChpbnQpc3RybGVuKGJ1Zik7CisgICAgKi8KKyAgICBpZiAoKCh0eXBlID09ICdnJyB8fCB0eXBlID09ICdHJykgJiYKKyAgICAgICAgICBidWZsZW4gPD0gKHNpemVfdCkxMCArIChzaXplX3QpcHJlYykgfHwKKyAgICAgICAgKHR5cGUgPT0gJ2YnICYmIGJ1ZmxlbiA8PSAoc2l6ZV90KTUzICsgKHNpemVfdClwcmVjKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICJmb3JtYXR0ZWQgZmxvYXQgaXMgdG9vIGxvbmcgKHByZWNpc2lvbiB0b28gbGFyZ2U/KSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIFB5T1Nfc25wcmludGYoZm10LCBzaXplb2YoZm10KSwgIiUlJXMuJWQlYyIsCisgICAgICAgICAgICAgICAgICAoZmxhZ3MmRl9BTFQpID8gIiMiIDogIiIsCisgICAgICAgICAgICAgICAgICBwcmVjLCB0eXBlKTsKKyAgICBQeU9TX2FzY2lpX2Zvcm1hdGQoYnVmLCBidWZsZW4sIGZtdCwgeCk7CisgICAgcmV0dXJuIChpbnQpc3RybGVuKGJ1Zik7CiB9CiAKIC8qIF9QeVN0cmluZ19Gb3JtYXRMb25nIGVtdWxhdGVzIHRoZSBmb3JtYXQgY29kZXMgZCwgdSwgbywgeCBhbmQgWCwgYW5kCkBAIC00MzkyLDIyNiArNDM5MiwyMjYgQEAKICAqICAgICAgICAgc2V0IGluIGZsYWdzLiAgVGhlIGNhc2Ugb2YgaGV4IGRpZ2l0cyB3aWxsIGJlIGNvcnJlY3QsCiAgKiAgICAgVGhlcmUgd2lsbCBiZSBhdCBsZWFzdCBwcmVjIGRpZ2l0cywgemVyby1maWxsZWQgb24gdGhlIGxlZnQgaWYKICAqICAgICAgICAgbmVjZXNzYXJ5IHRvIGdldCB0aGF0IG1hbnkuCi0gKiB2YWwJCW9iamVjdCB0byBiZSBjb252ZXJ0ZWQKLSAqIGZsYWdzCWJpdG1hc2sgb2YgZm9ybWF0IGZsYWdzOyBvbmx5IEZfQUxUIGlzIGxvb2tlZCBhdAotICogcHJlYwkJbWluaW11bSBudW1iZXIgb2YgZGlnaXRzOyAwLWZpbGwgb24gbGVmdCBpZiBuZWVkZWQKLSAqIHR5cGUJCWEgY2hhcmFjdGVyIGluIFtkdW94WF07IHUgYWN0cyB0aGUgc2FtZSBhcyBkCisgKiB2YWwgICAgICAgICAgb2JqZWN0IHRvIGJlIGNvbnZlcnRlZAorICogZmxhZ3MgICAgICAgIGJpdG1hc2sgb2YgZm9ybWF0IGZsYWdzOyBvbmx5IEZfQUxUIGlzIGxvb2tlZCBhdAorICogcHJlYyAgICAgICAgIG1pbmltdW0gbnVtYmVyIG9mIGRpZ2l0czsgMC1maWxsIG9uIGxlZnQgaWYgbmVlZGVkCisgKiB0eXBlICAgICAgICAgYSBjaGFyYWN0ZXIgaW4gW2R1b3hYXTsgdSBhY3RzIHRoZSBzYW1lIGFzIGQKICAqCiAgKiBDQVVUSU9OOiAgbywgeCBhbmQgWCBjb252ZXJzaW9ucyBvbiByZWd1bGFyIGludHMgY2FuIG5ldmVyCiAgKiBwcm9kdWNlIGEgJy0nIHNpZ24sIGJ1dCBjYW4gZm9yIFB5dGhvbidzIHVuYm91bmRlZCBpbnRzLgogICovCiBQeU9iamVjdCoKIF9QeVN0cmluZ19Gb3JtYXRMb25nKFB5T2JqZWN0ICp2YWwsIGludCBmbGFncywgaW50IHByZWMsIGludCB0eXBlLAotCQkgICAgIGNoYXIgKipwYnVmLCBpbnQgKnBsZW4pCisgICAgICAgICAgICAgICAgICAgICBjaGFyICoqcGJ1ZiwgaW50ICpwbGVuKQogewotCVB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOwotCWNoYXIgKmJ1ZjsKLQlQeV9zc2l6ZV90IGk7Ci0JaW50IHNpZ247CS8qIDEgaWYgJy0nLCBlbHNlIDAgKi8KLQlpbnQgbGVuOwkvKiBudW1iZXIgb2YgY2hhcmFjdGVycyAqLwotCVB5X3NzaXplX3QgbGxlbjsKLQlpbnQgbnVtZGlnaXRzOwkvKiBsZW4gPT0gbnVtbm9uZGlnaXRzICsgbnVtZGlnaXRzICovCi0JaW50IG51bW5vbmRpZ2l0cyA9IDA7CisgICAgUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7CisgICAgY2hhciAqYnVmOworICAgIFB5X3NzaXplX3QgaTsKKyAgICBpbnQgc2lnbjsgICAgICAgICAgIC8qIDEgaWYgJy0nLCBlbHNlIDAgKi8KKyAgICBpbnQgbGVuOyAgICAgICAgICAgIC8qIG51bWJlciBvZiBjaGFyYWN0ZXJzICovCisgICAgUHlfc3NpemVfdCBsbGVuOworICAgIGludCBudW1kaWdpdHM7ICAgICAgLyogbGVuID09IG51bW5vbmRpZ2l0cyArIG51bWRpZ2l0cyAqLworICAgIGludCBudW1ub25kaWdpdHMgPSAwOwogCi0Jc3dpdGNoICh0eXBlKSB7Ci0JY2FzZSAnZCc6Ci0JY2FzZSAndSc6Ci0JCXJlc3VsdCA9IFB5X1RZUEUodmFsKS0+dHBfc3RyKHZhbCk7Ci0JCWJyZWFrOwotCWNhc2UgJ28nOgotCQlyZXN1bHQgPSBQeV9UWVBFKHZhbCktPnRwX2FzX251bWJlci0+bmJfb2N0KHZhbCk7Ci0JCWJyZWFrOwotCWNhc2UgJ3gnOgotCWNhc2UgJ1gnOgotCQludW1ub25kaWdpdHMgPSAyOwotCQlyZXN1bHQgPSBQeV9UWVBFKHZhbCktPnRwX2FzX251bWJlci0+bmJfaGV4KHZhbCk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWFzc2VydCghIid0eXBlJyBub3QgaW4gW2R1b3hYXSIpOwotCX0KLQlpZiAoIXJlc3VsdCkKLQkJcmV0dXJuIE5VTEw7CisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSAnZCc6CisgICAgY2FzZSAndSc6CisgICAgICAgIHJlc3VsdCA9IFB5X1RZUEUodmFsKS0+dHBfc3RyKHZhbCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJ28nOgorICAgICAgICByZXN1bHQgPSBQeV9UWVBFKHZhbCktPnRwX2FzX251bWJlci0+bmJfb2N0KHZhbCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJ3gnOgorICAgIGNhc2UgJ1gnOgorICAgICAgICBudW1ub25kaWdpdHMgPSAyOworICAgICAgICByZXN1bHQgPSBQeV9UWVBFKHZhbCktPnRwX2FzX251bWJlci0+bmJfaGV4KHZhbCk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGFzc2VydCghIid0eXBlJyBub3QgaW4gW2R1b3hYXSIpOworICAgIH0KKyAgICBpZiAoIXJlc3VsdCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlidWYgPSBQeVN0cmluZ19Bc1N0cmluZyhyZXN1bHQpOwotCWlmICghYnVmKSB7Ci0JCVB5X0RFQ1JFRihyZXN1bHQpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgYnVmID0gUHlTdHJpbmdfQXNTdHJpbmcocmVzdWx0KTsKKyAgICBpZiAoIWJ1ZikgeworICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JLyogVG8gbW9kaWZ5IHRoZSBzdHJpbmcgaW4tcGxhY2UsIHRoZXJlIGNhbiBvbmx5IGJlIG9uZSByZWZlcmVuY2UuICovCi0JaWYgKFB5X1JFRkNOVChyZXN1bHQpICE9IDEpIHsKLQkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlsbGVuID0gUHlTdHJpbmdfU2l6ZShyZXN1bHQpOwotCWlmIChsbGVuID4gSU5UX01BWCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgInN0cmluZyB0b28gbGFyZ2UgaW4gX1B5U3RyaW5nX0Zvcm1hdExvbmciKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWxlbiA9IChpbnQpbGxlbjsKLQlpZiAoYnVmW2xlbi0xXSA9PSAnTCcpIHsKLQkJLS1sZW47Ci0JCWJ1ZltsZW5dID0gJ1wwJzsKLQl9Ci0Jc2lnbiA9IGJ1ZlswXSA9PSAnLSc7Ci0JbnVtbm9uZGlnaXRzICs9IHNpZ247Ci0JbnVtZGlnaXRzID0gbGVuIC0gbnVtbm9uZGlnaXRzOwotCWFzc2VydChudW1kaWdpdHMgPiAwKTsKKyAgICAvKiBUbyBtb2RpZnkgdGhlIHN0cmluZyBpbi1wbGFjZSwgdGhlcmUgY2FuIG9ubHkgYmUgb25lIHJlZmVyZW5jZS4gKi8KKyAgICBpZiAoUHlfUkVGQ05UKHJlc3VsdCkgIT0gMSkgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGxsZW4gPSBQeVN0cmluZ19TaXplKHJlc3VsdCk7CisgICAgaWYgKGxsZW4gPiBJTlRfTUFYKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAic3RyaW5nIHRvbyBsYXJnZSBpbiBfUHlTdHJpbmdfRm9ybWF0TG9uZyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgbGVuID0gKGludClsbGVuOworICAgIGlmIChidWZbbGVuLTFdID09ICdMJykgeworICAgICAgICAtLWxlbjsKKyAgICAgICAgYnVmW2xlbl0gPSAnXDAnOworICAgIH0KKyAgICBzaWduID0gYnVmWzBdID09ICctJzsKKyAgICBudW1ub25kaWdpdHMgKz0gc2lnbjsKKyAgICBudW1kaWdpdHMgPSBsZW4gLSBudW1ub25kaWdpdHM7CisgICAgYXNzZXJ0KG51bWRpZ2l0cyA+IDApOwogCi0JLyogR2V0IHJpZCBvZiBiYXNlIG1hcmtlciB1bmxlc3MgRl9BTFQgKi8KLQlpZiAoKGZsYWdzICYgRl9BTFQpID09IDApIHsKLQkJLyogTmVlZCB0byBza2lwIDB4LCAwWCBvciAwLiAqLwotCQlpbnQgc2tpcHBlZCA9IDA7Ci0JCXN3aXRjaCAodHlwZSkgewotCQljYXNlICdvJzoKLQkJCWFzc2VydChidWZbc2lnbl0gPT0gJzAnKTsKLQkJCS8qIElmIDAgaXMgb25seSBkaWdpdCwgbGVhdmUgaXQgYWxvbmUuICovCi0JCQlpZiAobnVtZGlnaXRzID4gMSkgewotCQkJCXNraXBwZWQgPSAxOwotCQkJCS0tbnVtZGlnaXRzOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgJ3gnOgotCQljYXNlICdYJzoKLQkJCWFzc2VydChidWZbc2lnbl0gPT0gJzAnKTsKLQkJCWFzc2VydChidWZbc2lnbiArIDFdID09ICd4Jyk7Ci0JCQlza2lwcGVkID0gMjsKLQkJCW51bW5vbmRpZ2l0cyAtPSAyOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKHNraXBwZWQpIHsKLQkJCWJ1ZiArPSBza2lwcGVkOwotCQkJbGVuIC09IHNraXBwZWQ7Ci0JCQlpZiAoc2lnbikKLQkJCQlidWZbMF0gPSAnLSc7Ci0JCX0KLQkJYXNzZXJ0KGxlbiA9PSBudW1ub25kaWdpdHMgKyBudW1kaWdpdHMpOwotCQlhc3NlcnQobnVtZGlnaXRzID4gMCk7Ci0JfQorICAgIC8qIEdldCByaWQgb2YgYmFzZSBtYXJrZXIgdW5sZXNzIEZfQUxUICovCisgICAgaWYgKChmbGFncyAmIEZfQUxUKSA9PSAwKSB7CisgICAgICAgIC8qIE5lZWQgdG8gc2tpcCAweCwgMFggb3IgMC4gKi8KKyAgICAgICAgaW50IHNraXBwZWQgPSAwOworICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgY2FzZSAnbyc6CisgICAgICAgICAgICBhc3NlcnQoYnVmW3NpZ25dID09ICcwJyk7CisgICAgICAgICAgICAvKiBJZiAwIGlzIG9ubHkgZGlnaXQsIGxlYXZlIGl0IGFsb25lLiAqLworICAgICAgICAgICAgaWYgKG51bWRpZ2l0cyA+IDEpIHsKKyAgICAgICAgICAgICAgICBza2lwcGVkID0gMTsKKyAgICAgICAgICAgICAgICAtLW51bWRpZ2l0czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICd4JzoKKyAgICAgICAgY2FzZSAnWCc6CisgICAgICAgICAgICBhc3NlcnQoYnVmW3NpZ25dID09ICcwJyk7CisgICAgICAgICAgICBhc3NlcnQoYnVmW3NpZ24gKyAxXSA9PSAneCcpOworICAgICAgICAgICAgc2tpcHBlZCA9IDI7CisgICAgICAgICAgICBudW1ub25kaWdpdHMgLT0gMjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChza2lwcGVkKSB7CisgICAgICAgICAgICBidWYgKz0gc2tpcHBlZDsKKyAgICAgICAgICAgIGxlbiAtPSBza2lwcGVkOworICAgICAgICAgICAgaWYgKHNpZ24pCisgICAgICAgICAgICAgICAgYnVmWzBdID0gJy0nOworICAgICAgICB9CisgICAgICAgIGFzc2VydChsZW4gPT0gbnVtbm9uZGlnaXRzICsgbnVtZGlnaXRzKTsKKyAgICAgICAgYXNzZXJ0KG51bWRpZ2l0cyA+IDApOworICAgIH0KIAotCS8qIEZpbGwgd2l0aCBsZWFkaW5nIHplcm9lcyB0byBtZWV0IG1pbmltdW0gd2lkdGguICovCi0JaWYgKHByZWMgPiBudW1kaWdpdHMpIHsKLQkJUHlPYmplY3QgKnIxID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwKLQkJCQkJbnVtbm9uZGlnaXRzICsgcHJlYyk7Ci0JCWNoYXIgKmIxOwotCQlpZiAoIXIxKSB7Ci0JCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWIxID0gUHlTdHJpbmdfQVNfU1RSSU5HKHIxKTsKLQkJZm9yIChpID0gMDsgaSA8IG51bW5vbmRpZ2l0czsgKytpKQotCQkJKmIxKysgPSAqYnVmKys7Ci0JCWZvciAoaSA9IDA7IGkgPCBwcmVjIC0gbnVtZGlnaXRzOyBpKyspCi0JCQkqYjErKyA9ICcwJzsKLQkJZm9yIChpID0gMDsgaSA8IG51bWRpZ2l0czsgaSsrKQotCQkJKmIxKysgPSAqYnVmKys7Ci0JCSpiMSA9ICdcMCc7Ci0JCVB5X0RFQ1JFRihyZXN1bHQpOwotCQlyZXN1bHQgPSByMTsKLQkJYnVmID0gUHlTdHJpbmdfQVNfU1RSSU5HKHJlc3VsdCk7Ci0JCWxlbiA9IG51bW5vbmRpZ2l0cyArIHByZWM7Ci0JfQorICAgIC8qIEZpbGwgd2l0aCBsZWFkaW5nIHplcm9lcyB0byBtZWV0IG1pbmltdW0gd2lkdGguICovCisgICAgaWYgKHByZWMgPiBudW1kaWdpdHMpIHsKKyAgICAgICAgUHlPYmplY3QgKnIxID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtbm9uZGlnaXRzICsgcHJlYyk7CisgICAgICAgIGNoYXIgKmIxOworICAgICAgICBpZiAoIXIxKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGIxID0gUHlTdHJpbmdfQVNfU1RSSU5HKHIxKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bW5vbmRpZ2l0czsgKytpKQorICAgICAgICAgICAgKmIxKysgPSAqYnVmKys7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwcmVjIC0gbnVtZGlnaXRzOyBpKyspCisgICAgICAgICAgICAqYjErKyA9ICcwJzsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bWRpZ2l0czsgaSsrKQorICAgICAgICAgICAgKmIxKysgPSAqYnVmKys7CisgICAgICAgICpiMSA9ICdcMCc7CisgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICByZXN1bHQgPSByMTsKKyAgICAgICAgYnVmID0gUHlTdHJpbmdfQVNfU1RSSU5HKHJlc3VsdCk7CisgICAgICAgIGxlbiA9IG51bW5vbmRpZ2l0cyArIHByZWM7CisgICAgfQogCi0JLyogRml4IHVwIGNhc2UgZm9yIGhleCBjb252ZXJzaW9ucy4gKi8KLQlpZiAodHlwZSA9PSAnWCcpIHsKLQkJLyogTmVlZCB0byBjb252ZXJ0IGFsbCBsb3dlciBjYXNlIGxldHRlcnMgdG8gdXBwZXIgY2FzZS4KLQkJICAgYW5kIG5lZWQgdG8gY29udmVydCAweCB0byAwWCAoYW5kIC0weCB0byAtMFgpLiAqLwotCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCi0JCQlpZiAoYnVmW2ldID49ICdhJyAmJiBidWZbaV0gPD0gJ3gnKQotCQkJCWJ1ZltpXSAtPSAnYSctJ0EnOwotCX0KLQkqcGJ1ZiA9IGJ1ZjsKLQkqcGxlbiA9IGxlbjsKLQlyZXR1cm4gcmVzdWx0OworICAgIC8qIEZpeCB1cCBjYXNlIGZvciBoZXggY29udmVyc2lvbnMuICovCisgICAgaWYgKHR5cGUgPT0gJ1gnKSB7CisgICAgICAgIC8qIE5lZWQgdG8gY29udmVydCBhbGwgbG93ZXIgY2FzZSBsZXR0ZXJzIHRvIHVwcGVyIGNhc2UuCisgICAgICAgICAgIGFuZCBuZWVkIHRvIGNvbnZlcnQgMHggdG8gMFggKGFuZCAtMHggdG8gLTBYKS4gKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorICAgICAgICAgICAgaWYgKGJ1ZltpXSA+PSAnYScgJiYgYnVmW2ldIDw9ICd4JykKKyAgICAgICAgICAgICAgICBidWZbaV0gLT0gJ2EnLSdBJzsKKyAgICB9CisgICAgKnBidWYgPSBidWY7CisgICAgKnBsZW4gPSBsZW47CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogUHlfTE9DQUxfSU5MSU5FKGludCkKIGZvcm1hdGludChjaGFyICpidWYsIHNpemVfdCBidWZsZW4sIGludCBmbGFncywKICAgICAgICAgICBpbnQgcHJlYywgaW50IHR5cGUsIFB5T2JqZWN0ICp2KQogewotCS8qIGZtdCA9ICclIy4nICsgYHByZWNgICsgJ2wnICsgYHR5cGVgCi0JICAgd29yc3QgY2FzZSBsZW5ndGggPSAzICsgMTkgKHdvcnN0IGxlbiBvZiBJTlRfTUFYIG9uIDY0LWJpdCBtYWNoaW5lKQotCSAgICsgMSArIDEgPSAyNCAqLwotCWNoYXIgZm10WzY0XTsJLyogcGxlbnR5IGJpZyBlbm91Z2ghICovCi0JY2hhciAqc2lnbjsKLQlsb25nIHg7CisgICAgLyogZm10ID0gJyUjLicgKyBgcHJlY2AgKyAnbCcgKyBgdHlwZWAKKyAgICAgICB3b3JzdCBjYXNlIGxlbmd0aCA9IDMgKyAxOSAod29yc3QgbGVuIG9mIElOVF9NQVggb24gNjQtYml0IG1hY2hpbmUpCisgICAgICAgKyAxICsgMSA9IDI0ICovCisgICAgY2hhciBmbXRbNjRdOyAgICAgICAvKiBwbGVudHkgYmlnIGVub3VnaCEgKi8KKyAgICBjaGFyICpzaWduOworICAgIGxvbmcgeDsKIAotCXggPSBQeUludF9Bc0xvbmcodik7Ci0JaWYgKHggPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAiaW50IGFyZ3VtZW50IHJlcXVpcmVkLCBub3QgJS4yMDBzIiwKLQkJCSAgICAgUHlfVFlQRSh2KS0+dHBfbmFtZSk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKHggPCAwICYmIHR5cGUgPT0gJ3UnKSB7Ci0JCXR5cGUgPSAnZCc7Ci0JfQotCWlmICh4IDwgMCAmJiAodHlwZSA9PSAneCcgfHwgdHlwZSA9PSAnWCcgfHwgdHlwZSA9PSAnbycpKQotCQlzaWduID0gIi0iOwotCWVsc2UKLQkJc2lnbiA9ICIiOwotCWlmIChwcmVjIDwgMCkKLQkJcHJlYyA9IDE7CisgICAgeCA9IFB5SW50X0FzTG9uZyh2KTsKKyAgICBpZiAoeCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICJpbnQgYXJndW1lbnQgcmVxdWlyZWQsIG5vdCAlLjIwMHMiLAorICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRSh2KS0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKHggPCAwICYmIHR5cGUgPT0gJ3UnKSB7CisgICAgICAgIHR5cGUgPSAnZCc7CisgICAgfQorICAgIGlmICh4IDwgMCAmJiAodHlwZSA9PSAneCcgfHwgdHlwZSA9PSAnWCcgfHwgdHlwZSA9PSAnbycpKQorICAgICAgICBzaWduID0gIi0iOworICAgIGVsc2UKKyAgICAgICAgc2lnbiA9ICIiOworICAgIGlmIChwcmVjIDwgMCkKKyAgICAgICAgcHJlYyA9IDE7CiAKLQlpZiAoKGZsYWdzICYgRl9BTFQpICYmCi0JICAgICh0eXBlID09ICd4JyB8fCB0eXBlID09ICdYJykpIHsKLQkJLyogV2hlbiBjb252ZXJ0aW5nIHVuZGVyICUjeCBvciAlI1gsIHRoZXJlIGFyZSBhIG51bWJlcgotCQkgKiBvZiBpc3N1ZXMgdGhhdCBjYXVzZSBwYWluOgotCQkgKiAtIHdoZW4gMCBpcyBiZWluZyBjb252ZXJ0ZWQsIHRoZSBDIHN0YW5kYXJkIGxlYXZlcyBvZmYKLQkJICogICB0aGUgJzB4JyBvciAnMFgnLCB3aGljaCBpcyBpbmNvbnNpc3RlbnQgd2l0aCBvdGhlcgotCQkgKiAgICUjeC8lI1ggY29udmVyc2lvbnMgYW5kIGluY29uc2lzdGVudCB3aXRoIFB5dGhvbidzCi0JCSAqICAgaGV4KCkgZnVuY3Rpb24KLQkJICogLSB0aGVyZSBhcmUgcGxhdGZvcm1zIHRoYXQgdmlvbGF0ZSB0aGUgc3RhbmRhcmQgYW5kCi0JCSAqICAgY29udmVydCAwIHdpdGggdGhlICcweCcgb3IgJzBYJwotCQkgKiAgIChNZXRyb3dlcmtzLCBDb21wYXEgVHJ1NjQpCi0JCSAqIC0gdGhlcmUgYXJlIHBsYXRmb3JtcyB0aGF0IGdpdmUgJzB4JyB3aGVuIGNvbnZlcnRpbmcKLQkJICogICB1bmRlciAlI1gsIGJ1dCBjb252ZXJ0IDAgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZQotCQkgKiAgIHN0YW5kYXJkIChPUy8yIEVNWCkKLQkJICoKLQkJICogV2UgY2FuIGFjaGlldmUgdGhlIGRlc2lyZWQgY29uc2lzdGVuY3kgYnkgaW5zZXJ0aW5nIG91cgotCQkgKiBvd24gJzB4JyBvciAnMFgnIHByZWZpeCwgYW5kIHN1YnN0aXR1dGluZyAleC8lWCBpbiBwbGFjZQotCQkgKiBvZiAlI3gvJSNYLgotCQkgKgotCQkgKiBOb3RlIHRoYXQgdGhpcyBpcyB0aGUgc2FtZSBhcHByb2FjaCBhcyB1c2VkIGluCi0JCSAqIGZvcm1hdGludCgpIGluIHVuaWNvZGVvYmplY3QuYwotCQkgKi8KLQkJUHlPU19zbnByaW50ZihmbXQsIHNpemVvZihmbXQpLCAiJXMwJWMlJS4lZGwlYyIsCi0JCQkgICAgICBzaWduLCB0eXBlLCBwcmVjLCB0eXBlKTsKLQl9Ci0JZWxzZSB7Ci0JCVB5T1Nfc25wcmludGYoZm10LCBzaXplb2YoZm10KSwgIiVzJSUlcy4lZGwlYyIsCi0JCQkgICAgICBzaWduLCAoZmxhZ3MmRl9BTFQpID8gIiMiIDogIiIsCi0JCQkgICAgICBwcmVjLCB0eXBlKTsKLQl9CisgICAgaWYgKChmbGFncyAmIEZfQUxUKSAmJgorICAgICAgICAodHlwZSA9PSAneCcgfHwgdHlwZSA9PSAnWCcpKSB7CisgICAgICAgIC8qIFdoZW4gY29udmVydGluZyB1bmRlciAlI3ggb3IgJSNYLCB0aGVyZSBhcmUgYSBudW1iZXIKKyAgICAgICAgICogb2YgaXNzdWVzIHRoYXQgY2F1c2UgcGFpbjoKKyAgICAgICAgICogLSB3aGVuIDAgaXMgYmVpbmcgY29udmVydGVkLCB0aGUgQyBzdGFuZGFyZCBsZWF2ZXMgb2ZmCisgICAgICAgICAqICAgdGhlICcweCcgb3IgJzBYJywgd2hpY2ggaXMgaW5jb25zaXN0ZW50IHdpdGggb3RoZXIKKyAgICAgICAgICogICAlI3gvJSNYIGNvbnZlcnNpb25zIGFuZCBpbmNvbnNpc3RlbnQgd2l0aCBQeXRob24ncworICAgICAgICAgKiAgIGhleCgpIGZ1bmN0aW9uCisgICAgICAgICAqIC0gdGhlcmUgYXJlIHBsYXRmb3JtcyB0aGF0IHZpb2xhdGUgdGhlIHN0YW5kYXJkIGFuZAorICAgICAgICAgKiAgIGNvbnZlcnQgMCB3aXRoIHRoZSAnMHgnIG9yICcwWCcKKyAgICAgICAgICogICAoTWV0cm93ZXJrcywgQ29tcGFxIFRydTY0KQorICAgICAgICAgKiAtIHRoZXJlIGFyZSBwbGF0Zm9ybXMgdGhhdCBnaXZlICcweCcgd2hlbiBjb252ZXJ0aW5nCisgICAgICAgICAqICAgdW5kZXIgJSNYLCBidXQgY29udmVydCAwIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUKKyAgICAgICAgICogICBzdGFuZGFyZCAoT1MvMiBFTVgpCisgICAgICAgICAqCisgICAgICAgICAqIFdlIGNhbiBhY2hpZXZlIHRoZSBkZXNpcmVkIGNvbnNpc3RlbmN5IGJ5IGluc2VydGluZyBvdXIKKyAgICAgICAgICogb3duICcweCcgb3IgJzBYJyBwcmVmaXgsIGFuZCBzdWJzdGl0dXRpbmcgJXgvJVggaW4gcGxhY2UKKyAgICAgICAgICogb2YgJSN4LyUjWC4KKyAgICAgICAgICoKKyAgICAgICAgICogTm90ZSB0aGF0IHRoaXMgaXMgdGhlIHNhbWUgYXBwcm9hY2ggYXMgdXNlZCBpbgorICAgICAgICAgKiBmb3JtYXRpbnQoKSBpbiB1bmljb2Rlb2JqZWN0LmMKKyAgICAgICAgICovCisgICAgICAgIFB5T1Nfc25wcmludGYoZm10LCBzaXplb2YoZm10KSwgIiVzMCVjJSUuJWRsJWMiLAorICAgICAgICAgICAgICAgICAgICAgIHNpZ24sIHR5cGUsIHByZWMsIHR5cGUpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgUHlPU19zbnByaW50ZihmbXQsIHNpemVvZihmbXQpLCAiJXMlJSVzLiVkbCVjIiwKKyAgICAgICAgICAgICAgICAgICAgICBzaWduLCAoZmxhZ3MmRl9BTFQpID8gIiMiIDogIiIsCisgICAgICAgICAgICAgICAgICAgICAgcHJlYywgdHlwZSk7CisgICAgfQogCi0JLyogYnVmID0gJysnLyctJy8nJyArICcwJy8nMHgnLycnICsgJ1swLTldJyptYXgocHJlYywgbGVuKHggaW4gb2N0YWwpKQotCSAqIHdvcnN0IGNhc2UgYnVmID0gJy0weCcgKyBbMC05XSpwcmVjLCB3aGVyZSBwcmVjID49IDExCi0JICovCi0JaWYgKGJ1ZmxlbiA8PSAxNCB8fCBidWZsZW4gPD0gKHNpemVfdCkzICsgKHNpemVfdClwcmVjKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkgICAgImZvcm1hdHRlZCBpbnRlZ2VyIGlzIHRvbyBsb25nIChwcmVjaXNpb24gdG9vIGxhcmdlPykiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoc2lnblswXSkKLQkJUHlPU19zbnByaW50ZihidWYsIGJ1ZmxlbiwgZm10LCAteCk7Ci0JZWxzZQotCQlQeU9TX3NucHJpbnRmKGJ1ZiwgYnVmbGVuLCBmbXQsIHgpOwotCXJldHVybiAoaW50KXN0cmxlbihidWYpOworICAgIC8qIGJ1ZiA9ICcrJy8nLScvJycgKyAnMCcvJzB4Jy8nJyArICdbMC05XScqbWF4KHByZWMsIGxlbih4IGluIG9jdGFsKSkKKyAgICAgKiB3b3JzdCBjYXNlIGJ1ZiA9ICctMHgnICsgWzAtOV0qcHJlYywgd2hlcmUgcHJlYyA+PSAxMQorICAgICAqLworICAgIGlmIChidWZsZW4gPD0gMTQgfHwgYnVmbGVuIDw9IChzaXplX3QpMyArIChzaXplX3QpcHJlYykgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICJmb3JtYXR0ZWQgaW50ZWdlciBpcyB0b28gbG9uZyAocHJlY2lzaW9uIHRvbyBsYXJnZT8pIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKHNpZ25bMF0pCisgICAgICAgIFB5T1Nfc25wcmludGYoYnVmLCBidWZsZW4sIGZtdCwgLXgpOworICAgIGVsc2UKKyAgICAgICAgUHlPU19zbnByaW50ZihidWYsIGJ1ZmxlbiwgZm10LCB4KTsKKyAgICByZXR1cm4gKGludClzdHJsZW4oYnVmKTsKIH0KIAogUHlfTE9DQUxfSU5MSU5FKGludCkKIGZvcm1hdGNoYXIoY2hhciAqYnVmLCBzaXplX3QgYnVmbGVuLCBQeU9iamVjdCAqdikKIHsKLQkvKiBwcmVzdW1lIHRoYXQgdGhlIGJ1ZmZlciBpcyBhdCBsZWFzdCAyIGNoYXJhY3RlcnMgbG9uZyAqLwotCWlmIChQeVN0cmluZ19DaGVjayh2KSkgewotCQlpZiAoIVB5QXJnX1BhcnNlKHYsICJjOyVjIHJlcXVpcmVzIGludCBvciBjaGFyIiwgJmJ1ZlswXSkpCi0JCQlyZXR1cm4gLTE7Ci0JfQotCWVsc2UgewotCQlpZiAoIVB5QXJnX1BhcnNlKHYsICJiOyVjIHJlcXVpcmVzIGludCBvciBjaGFyIiwgJmJ1ZlswXSkpCi0JCQlyZXR1cm4gLTE7Ci0JfQotCWJ1ZlsxXSA9ICdcMCc7Ci0JcmV0dXJuIDE7CisgICAgLyogcHJlc3VtZSB0aGF0IHRoZSBidWZmZXIgaXMgYXQgbGVhc3QgMiBjaGFyYWN0ZXJzIGxvbmcgKi8KKyAgICBpZiAoUHlTdHJpbmdfQ2hlY2sodikpIHsKKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZSh2LCAiYzslYyByZXF1aXJlcyBpbnQgb3IgY2hhciIsICZidWZbMF0pKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZSh2LCAiYjslYyByZXF1aXJlcyBpbnQgb3IgY2hhciIsICZidWZbMF0pKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBidWZbMV0gPSAnXDAnOworICAgIHJldHVybiAxOwogfQogCiAvKiBmbXQlKHYxLHYyLC4uLikgaXMgcm91Z2hseSBlcXVpdmFsZW50IHRvIHNwcmludGYoZm10LCB2MSwgdjIsIC4uLikKQEAgLTQ2MjcsNjE2ICs0NjI3LDYxNiBAQAogUHlPYmplY3QgKgogUHlTdHJpbmdfRm9ybWF0KFB5T2JqZWN0ICpmb3JtYXQsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKmZtdCwgKnJlczsKLQlQeV9zc2l6ZV90IGFyZ2xlbiwgYXJnaWR4OwotCVB5X3NzaXplX3QgcmVzbGVuLCByZXNjbnQsIGZtdGNudDsKLQlpbnQgYXJnc19vd25lZCA9IDA7Ci0JUHlPYmplY3QgKnJlc3VsdCwgKm9yaWdfYXJnczsKKyAgICBjaGFyICpmbXQsICpyZXM7CisgICAgUHlfc3NpemVfdCBhcmdsZW4sIGFyZ2lkeDsKKyAgICBQeV9zc2l6ZV90IHJlc2xlbiwgcmVzY250LCBmbXRjbnQ7CisgICAgaW50IGFyZ3Nfb3duZWQgPSAwOworICAgIFB5T2JqZWN0ICpyZXN1bHQsICpvcmlnX2FyZ3M7CiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCVB5T2JqZWN0ICp2LCAqdzsKKyAgICBQeU9iamVjdCAqdiwgKnc7CiAjZW5kaWYKLQlQeU9iamVjdCAqZGljdCA9IE5VTEw7Ci0JaWYgKGZvcm1hdCA9PSBOVUxMIHx8ICFQeVN0cmluZ19DaGVjayhmb3JtYXQpIHx8IGFyZ3MgPT0gTlVMTCkgewotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCW9yaWdfYXJncyA9IGFyZ3M7Ci0JZm10ID0gUHlTdHJpbmdfQVNfU1RSSU5HKGZvcm1hdCk7Ci0JZm10Y250ID0gUHlTdHJpbmdfR0VUX1NJWkUoZm9ybWF0KTsKLQlyZXNsZW4gPSByZXNjbnQgPSBmbXRjbnQgKyAxMDA7Ci0JcmVzdWx0ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilOVUxMLCByZXNsZW4pOwotCWlmIChyZXN1bHQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JcmVzID0gUHlTdHJpbmdfQXNTdHJpbmcocmVzdWx0KTsKLQlpZiAoUHlUdXBsZV9DaGVjayhhcmdzKSkgewotCQlhcmdsZW4gPSBQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpOwotCQlhcmdpZHggPSAwOwotCX0KLQllbHNlIHsKLQkJYXJnbGVuID0gLTE7Ci0JCWFyZ2lkeCA9IC0yOwotCX0KLQlpZiAoUHlfVFlQRShhcmdzKS0+dHBfYXNfbWFwcGluZyAmJiAhUHlUdXBsZV9DaGVjayhhcmdzKSAmJgotCSAgICAhUHlPYmplY3RfVHlwZUNoZWNrKGFyZ3MsICZQeUJhc2VTdHJpbmdfVHlwZSkpCi0JCWRpY3QgPSBhcmdzOwotCXdoaWxlICgtLWZtdGNudCA+PSAwKSB7Ci0JCWlmICgqZm10ICE9ICclJykgewotCQkJaWYgKC0tcmVzY250IDwgMCkgewotCQkJCXJlc2NudCA9IGZtdGNudCArIDEwMDsKLQkJCQlyZXNsZW4gKz0gcmVzY250OwotCQkJCWlmIChfUHlTdHJpbmdfUmVzaXplKCZyZXN1bHQsIHJlc2xlbikgPCAwKQotCQkJCQlyZXR1cm4gTlVMTDsKLQkJCQlyZXMgPSBQeVN0cmluZ19BU19TVFJJTkcocmVzdWx0KQotCQkJCQkrIHJlc2xlbiAtIHJlc2NudDsKLQkJCQktLXJlc2NudDsKLQkJCX0KLQkJCSpyZXMrKyA9ICpmbXQrKzsKLQkJfQotCQllbHNlIHsKLQkJCS8qIEdvdCBhIGZvcm1hdCBzcGVjaWZpZXIgKi8KLQkJCWludCBmbGFncyA9IDA7Ci0JCQlQeV9zc2l6ZV90IHdpZHRoID0gLTE7Ci0JCQlpbnQgcHJlYyA9IC0xOwotCQkJaW50IGMgPSAnXDAnOwotCQkJaW50IGZpbGw7Ci0JCQlpbnQgaXNudW1vazsKLQkJCVB5T2JqZWN0ICp2ID0gTlVMTDsKLQkJCVB5T2JqZWN0ICp0ZW1wID0gTlVMTDsKLQkJCWNoYXIgKnBidWY7Ci0JCQlpbnQgc2lnbjsKLQkJCVB5X3NzaXplX3QgbGVuOwotCQkJY2hhciBmb3JtYXRidWZbRk9STUFUQlVGTEVOXTsKLQkJCSAgICAgLyogRm9yIGZvcm1hdHtmbG9hdCxpbnQsY2hhcn0oKSAqLworICAgIFB5T2JqZWN0ICpkaWN0ID0gTlVMTDsKKyAgICBpZiAoZm9ybWF0ID09IE5VTEwgfHwgIVB5U3RyaW5nX0NoZWNrKGZvcm1hdCkgfHwgYXJncyA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgb3JpZ19hcmdzID0gYXJnczsKKyAgICBmbXQgPSBQeVN0cmluZ19BU19TVFJJTkcoZm9ybWF0KTsKKyAgICBmbXRjbnQgPSBQeVN0cmluZ19HRVRfU0laRShmb3JtYXQpOworICAgIHJlc2xlbiA9IHJlc2NudCA9IGZtdGNudCArIDEwMDsKKyAgICByZXN1bHQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKU5VTEwsIHJlc2xlbik7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXMgPSBQeVN0cmluZ19Bc1N0cmluZyhyZXN1bHQpOworICAgIGlmIChQeVR1cGxlX0NoZWNrKGFyZ3MpKSB7CisgICAgICAgIGFyZ2xlbiA9IFB5VHVwbGVfR0VUX1NJWkUoYXJncyk7CisgICAgICAgIGFyZ2lkeCA9IDA7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBhcmdsZW4gPSAtMTsKKyAgICAgICAgYXJnaWR4ID0gLTI7CisgICAgfQorICAgIGlmIChQeV9UWVBFKGFyZ3MpLT50cF9hc19tYXBwaW5nICYmICFQeVR1cGxlX0NoZWNrKGFyZ3MpICYmCisgICAgICAgICFQeU9iamVjdF9UeXBlQ2hlY2soYXJncywgJlB5QmFzZVN0cmluZ19UeXBlKSkKKyAgICAgICAgZGljdCA9IGFyZ3M7CisgICAgd2hpbGUgKC0tZm10Y250ID49IDApIHsKKyAgICAgICAgaWYgKCpmbXQgIT0gJyUnKSB7CisgICAgICAgICAgICBpZiAoLS1yZXNjbnQgPCAwKSB7CisgICAgICAgICAgICAgICAgcmVzY250ID0gZm10Y250ICsgMTAwOworICAgICAgICAgICAgICAgIHJlc2xlbiArPSByZXNjbnQ7CisgICAgICAgICAgICAgICAgaWYgKF9QeVN0cmluZ19SZXNpemUoJnJlc3VsdCwgcmVzbGVuKSA8IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgIHJlcyA9IFB5U3RyaW5nX0FTX1NUUklORyhyZXN1bHQpCisgICAgICAgICAgICAgICAgICAgICsgcmVzbGVuIC0gcmVzY250OworICAgICAgICAgICAgICAgIC0tcmVzY250OworICAgICAgICAgICAgfQorICAgICAgICAgICAgKnJlcysrID0gKmZtdCsrOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLyogR290IGEgZm9ybWF0IHNwZWNpZmllciAqLworICAgICAgICAgICAgaW50IGZsYWdzID0gMDsKKyAgICAgICAgICAgIFB5X3NzaXplX3Qgd2lkdGggPSAtMTsKKyAgICAgICAgICAgIGludCBwcmVjID0gLTE7CisgICAgICAgICAgICBpbnQgYyA9ICdcMCc7CisgICAgICAgICAgICBpbnQgZmlsbDsKKyAgICAgICAgICAgIGludCBpc251bW9rOworICAgICAgICAgICAgUHlPYmplY3QgKnYgPSBOVUxMOworICAgICAgICAgICAgUHlPYmplY3QgKnRlbXAgPSBOVUxMOworICAgICAgICAgICAgY2hhciAqcGJ1ZjsKKyAgICAgICAgICAgIGludCBzaWduOworICAgICAgICAgICAgUHlfc3NpemVfdCBsZW47CisgICAgICAgICAgICBjaGFyIGZvcm1hdGJ1ZltGT1JNQVRCVUZMRU5dOworICAgICAgICAgICAgICAgICAvKiBGb3IgZm9ybWF0e2Zsb2F0LGludCxjaGFyfSgpICovCiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCQkJY2hhciAqZm10X3N0YXJ0ID0gZm10OwotCQkJUHlfc3NpemVfdCBhcmdpZHhfc3RhcnQgPSBhcmdpZHg7CisgICAgICAgICAgICBjaGFyICpmbXRfc3RhcnQgPSBmbXQ7CisgICAgICAgICAgICBQeV9zc2l6ZV90IGFyZ2lkeF9zdGFydCA9IGFyZ2lkeDsKICNlbmRpZgogCi0JCQlmbXQrKzsKLQkJCWlmICgqZm10ID09ICcoJykgewotCQkJCWNoYXIgKmtleXN0YXJ0OwotCQkJCVB5X3NzaXplX3Qga2V5bGVuOwotCQkJCVB5T2JqZWN0ICprZXk7Ci0JCQkJaW50IHBjb3VudCA9IDE7CisgICAgICAgICAgICBmbXQrKzsKKyAgICAgICAgICAgIGlmICgqZm10ID09ICcoJykgeworICAgICAgICAgICAgICAgIGNoYXIgKmtleXN0YXJ0OworICAgICAgICAgICAgICAgIFB5X3NzaXplX3Qga2V5bGVuOworICAgICAgICAgICAgICAgIFB5T2JqZWN0ICprZXk7CisgICAgICAgICAgICAgICAgaW50IHBjb3VudCA9IDE7CiAKLQkJCQlpZiAoZGljdCA9PSBOVUxMKSB7Ci0JCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJCQkgImZvcm1hdCByZXF1aXJlcyBhIG1hcHBpbmciKTsKLQkJCQkJZ290byBlcnJvcjsKLQkJCQl9Ci0JCQkJKytmbXQ7Ci0JCQkJLS1mbXRjbnQ7Ci0JCQkJa2V5c3RhcnQgPSBmbXQ7Ci0JCQkJLyogU2tpcCBvdmVyIGJhbGFuY2VkIHBhcmVudGhlc2VzICovCi0JCQkJd2hpbGUgKHBjb3VudCA+IDAgJiYgLS1mbXRjbnQgPj0gMCkgewotCQkJCQlpZiAoKmZtdCA9PSAnKScpCi0JCQkJCQktLXBjb3VudDsKLQkJCQkJZWxzZSBpZiAoKmZtdCA9PSAnKCcpCi0JCQkJCQkrK3Bjb3VudDsKLQkJCQkJZm10Kys7Ci0JCQkJfQotCQkJCWtleWxlbiA9IGZtdCAtIGtleXN0YXJ0IC0gMTsKLQkJCQlpZiAoZm10Y250IDwgMCB8fCBwY291bnQgPiAwKSB7Ci0JCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCQkJICAgImluY29tcGxldGUgZm9ybWF0IGtleSIpOwotCQkJCQlnb3RvIGVycm9yOwotCQkJCX0KLQkJCQlrZXkgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShrZXlzdGFydCwKLQkJCQkJCQkJIGtleWxlbik7Ci0JCQkJaWYgKGtleSA9PSBOVUxMKQotCQkJCQlnb3RvIGVycm9yOwotCQkJCWlmIChhcmdzX293bmVkKSB7Ci0JCQkJCVB5X0RFQ1JFRihhcmdzKTsKLQkJCQkJYXJnc19vd25lZCA9IDA7Ci0JCQkJfQotCQkJCWFyZ3MgPSBQeU9iamVjdF9HZXRJdGVtKGRpY3QsIGtleSk7Ci0JCQkJUHlfREVDUkVGKGtleSk7Ci0JCQkJaWYgKGFyZ3MgPT0gTlVMTCkgewotCQkJCQlnb3RvIGVycm9yOwotCQkJCX0KLQkJCQlhcmdzX293bmVkID0gMTsKLQkJCQlhcmdsZW4gPSAtMTsKLQkJCQlhcmdpZHggPSAtMjsKLQkJCX0KLQkJCXdoaWxlICgtLWZtdGNudCA+PSAwKSB7Ci0JCQkJc3dpdGNoIChjID0gKmZtdCsrKSB7Ci0JCQkJY2FzZSAnLSc6IGZsYWdzIHw9IEZfTEpVU1Q7IGNvbnRpbnVlOwotCQkJCWNhc2UgJysnOiBmbGFncyB8PSBGX1NJR047IGNvbnRpbnVlOwotCQkJCWNhc2UgJyAnOiBmbGFncyB8PSBGX0JMQU5LOyBjb250aW51ZTsKLQkJCQljYXNlICcjJzogZmxhZ3MgfD0gRl9BTFQ7IGNvbnRpbnVlOwotCQkJCWNhc2UgJzAnOiBmbGFncyB8PSBGX1pFUk87IGNvbnRpbnVlOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChjID09ICcqJykgewotCQkJCXYgPSBnZXRuZXh0YXJnKGFyZ3MsIGFyZ2xlbiwgJmFyZ2lkeCk7Ci0JCQkJaWYgKHYgPT0gTlVMTCkKLQkJCQkJZ290byBlcnJvcjsKLQkJCQlpZiAoIVB5SW50X0NoZWNrKHYpKSB7Ci0JCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJCQkJIiogd2FudHMgaW50Iik7Ci0JCQkJCWdvdG8gZXJyb3I7Ci0JCQkJfQotCQkJCXdpZHRoID0gUHlJbnRfQXNMb25nKHYpOwotCQkJCWlmICh3aWR0aCA8IDApIHsKLQkJCQkJZmxhZ3MgfD0gRl9MSlVTVDsKLQkJCQkJd2lkdGggPSAtd2lkdGg7Ci0JCQkJfQotCQkJCWlmICgtLWZtdGNudCA+PSAwKQotCQkJCQljID0gKmZtdCsrOwotCQkJfQotCQkJZWxzZSBpZiAoYyA+PSAwICYmIGlzZGlnaXQoYykpIHsKLQkJCQl3aWR0aCA9IGMgLSAnMCc7Ci0JCQkJd2hpbGUgKC0tZm10Y250ID49IDApIHsKLQkJCQkJYyA9IFB5X0NIQVJNQVNLKCpmbXQrKyk7Ci0JCQkJCWlmICghaXNkaWdpdChjKSkKLQkJCQkJCWJyZWFrOwotCQkJCQlpZiAoKHdpZHRoKjEwKSAvIDEwICE9IHdpZHRoKSB7Ci0JCQkJCQlQeUVycl9TZXRTdHJpbmcoCi0JCQkJCQkJUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkJCQkid2lkdGggdG9vIGJpZyIpOwotCQkJCQkJZ290byBlcnJvcjsKLQkJCQkJfQotCQkJCQl3aWR0aCA9IHdpZHRoKjEwICsgKGMgLSAnMCcpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChjID09ICcuJykgewotCQkJCXByZWMgPSAwOwotCQkJCWlmICgtLWZtdGNudCA+PSAwKQotCQkJCQljID0gKmZtdCsrOwotCQkJCWlmIChjID09ICcqJykgewotCQkJCQl2ID0gZ2V0bmV4dGFyZyhhcmdzLCBhcmdsZW4sICZhcmdpZHgpOwotCQkJCQlpZiAodiA9PSBOVUxMKQotCQkJCQkJZ290byBlcnJvcjsKLQkJCQkJaWYgKCFQeUludF9DaGVjayh2KSkgewotCQkJCQkJUHlFcnJfU2V0U3RyaW5nKAotCQkJCQkJCVB5RXhjX1R5cGVFcnJvciwKLQkJCQkJCQkiKiB3YW50cyBpbnQiKTsKLQkJCQkJCWdvdG8gZXJyb3I7Ci0JCQkJCX0KLQkJCQkJcHJlYyA9IFB5SW50X0FzTG9uZyh2KTsKLQkJCQkJaWYgKHByZWMgPCAwKQotCQkJCQkJcHJlYyA9IDA7Ci0JCQkJCWlmICgtLWZtdGNudCA+PSAwKQotCQkJCQkJYyA9ICpmbXQrKzsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoYyA+PSAwICYmIGlzZGlnaXQoYykpIHsKLQkJCQkJcHJlYyA9IGMgLSAnMCc7Ci0JCQkJCXdoaWxlICgtLWZtdGNudCA+PSAwKSB7Ci0JCQkJCQljID0gUHlfQ0hBUk1BU0soKmZtdCsrKTsKLQkJCQkJCWlmICghaXNkaWdpdChjKSkKLQkJCQkJCQlicmVhazsKLQkJCQkJCWlmICgocHJlYyoxMCkgLyAxMCAhPSBwcmVjKSB7Ci0JCQkJCQkJUHlFcnJfU2V0U3RyaW5nKAotCQkJCQkJCSAgICBQeUV4Y19WYWx1ZUVycm9yLAotCQkJCQkJCSAgICAicHJlYyB0b28gYmlnIik7Ci0JCQkJCQkJZ290byBlcnJvcjsKLQkJCQkJCX0KLQkJCQkJCXByZWMgPSBwcmVjKjEwICsgKGMgLSAnMCcpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSAvKiBwcmVjICovCi0JCQlpZiAoZm10Y250ID49IDApIHsKLQkJCQlpZiAoYyA9PSAnaCcgfHwgYyA9PSAnbCcgfHwgYyA9PSAnTCcpIHsKLQkJCQkJaWYgKC0tZm10Y250ID49IDApCi0JCQkJCQljID0gKmZtdCsrOwotCQkJCX0KLQkJCX0KLQkJCWlmIChmbXRjbnQgPCAwKSB7Ci0JCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJCQkiaW5jb21wbGV0ZSBmb3JtYXQiKTsKLQkJCQlnb3RvIGVycm9yOwotCQkJfQotCQkJaWYgKGMgIT0gJyUnKSB7Ci0JCQkJdiA9IGdldG5leHRhcmcoYXJncywgYXJnbGVuLCAmYXJnaWR4KTsKLQkJCQlpZiAodiA9PSBOVUxMKQotCQkJCQlnb3RvIGVycm9yOwotCQkJfQotCQkJc2lnbiA9IDA7Ci0JCQlmaWxsID0gJyAnOwotCQkJc3dpdGNoIChjKSB7Ci0JCQljYXNlICclJzoKLQkJCQlwYnVmID0gIiUiOwotCQkJCWxlbiA9IDE7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICdzJzoKLSNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JCQkJaWYgKFB5VW5pY29kZV9DaGVjayh2KSkgewotCQkJCQlmbXQgPSBmbXRfc3RhcnQ7Ci0JCQkJCWFyZ2lkeCA9IGFyZ2lkeF9zdGFydDsKLQkJCQkJZ290byB1bmljb2RlOwotCQkJCX0KLSNlbmRpZgotCQkJCXRlbXAgPSBfUHlPYmplY3RfU3RyKHYpOwotI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQkJCQlpZiAodGVtcCAhPSBOVUxMICYmIFB5VW5pY29kZV9DaGVjayh0ZW1wKSkgewotCQkJCQlQeV9ERUNSRUYodGVtcCk7Ci0JCQkJCWZtdCA9IGZtdF9zdGFydDsKLQkJCQkJYXJnaWR4ID0gYXJnaWR4X3N0YXJ0OwotCQkJCQlnb3RvIHVuaWNvZGU7Ci0JCQkJfQotI2VuZGlmCi0JCQkJLyogRmFsbCB0aHJvdWdoICovCi0JCQljYXNlICdyJzoKLQkJCQlpZiAoYyA9PSAncicpCi0JCQkJCXRlbXAgPSBQeU9iamVjdF9SZXByKHYpOwotCQkJCWlmICh0ZW1wID09IE5VTEwpCi0JCQkJCWdvdG8gZXJyb3I7Ci0JCQkJaWYgKCFQeVN0cmluZ19DaGVjayh0ZW1wKSkgewotCQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCQkgICIlcyBhcmd1bWVudCBoYXMgbm9uLXN0cmluZyBzdHIoKSIpOwotCQkJCQlQeV9ERUNSRUYodGVtcCk7Ci0JCQkJCWdvdG8gZXJyb3I7Ci0JCQkJfQotCQkJCXBidWYgPSBQeVN0cmluZ19BU19TVFJJTkcodGVtcCk7Ci0JCQkJbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUodGVtcCk7Ci0JCQkJaWYgKHByZWMgPj0gMCAmJiBsZW4gPiBwcmVjKQotCQkJCQlsZW4gPSBwcmVjOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnaSc6Ci0JCQljYXNlICdkJzoKLQkJCWNhc2UgJ3UnOgotCQkJY2FzZSAnbyc6Ci0JCQljYXNlICd4JzoKLQkJCWNhc2UgJ1gnOgotCQkJCWlmIChjID09ICdpJykKLQkJCQkJYyA9ICdkJzsKLQkJCQlpc251bW9rID0gMDsKLQkJCQlpZiAoUHlOdW1iZXJfQ2hlY2sodikpIHsKLQkJCQkJUHlPYmplY3QgKmlvYmo9TlVMTDsKLQotCQkJCQlpZiAoUHlJbnRfQ2hlY2sodikgfHwgKFB5TG9uZ19DaGVjayh2KSkpIHsKLQkJCQkJCWlvYmogPSB2OwotCQkJCQkJUHlfSU5DUkVGKGlvYmopOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJaW9iaiA9IFB5TnVtYmVyX0ludCh2KTsKLQkJCQkJCWlmIChpb2JqPT1OVUxMKSBpb2JqID0gUHlOdW1iZXJfTG9uZyh2KTsKLQkJCQkJfQotCQkJCQlpZiAoaW9iaiE9TlVMTCkgewotCQkJCQkJaWYgKFB5SW50X0NoZWNrKGlvYmopKSB7Ci0JCQkJCQkJaXNudW1vayA9IDE7Ci0JCQkJCQkJcGJ1ZiA9IGZvcm1hdGJ1ZjsKLQkJCQkJCQlsZW4gPSBmb3JtYXRpbnQocGJ1ZiwKLQkJCQkJCQkJCXNpemVvZihmb3JtYXRidWYpLAotCQkJCQkJCQkJZmxhZ3MsIHByZWMsIGMsIGlvYmopOwotCQkJCQkJCVB5X0RFQ1JFRihpb2JqKTsKLQkJCQkJCQlpZiAobGVuIDwgMCkKLQkJCQkJCQkJZ290byBlcnJvcjsKLQkJCQkJCQlzaWduID0gMTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKFB5TG9uZ19DaGVjayhpb2JqKSkgewotCQkJCQkJCWludCBpbGVuOwotCQkJCQkJCQotCQkJCQkJCWlzbnVtb2sgPSAxOwotCQkJCQkJCXRlbXAgPSBfUHlTdHJpbmdfRm9ybWF0TG9uZyhpb2JqLCBmbGFncywKLQkJCQkJCQkJcHJlYywgYywgJnBidWYsICZpbGVuKTsKLQkJCQkJCQlQeV9ERUNSRUYoaW9iaik7Ci0JCQkJCQkJbGVuID0gaWxlbjsKLQkJCQkJCQlpZiAoIXRlbXApCi0JCQkJCQkJCWdvdG8gZXJyb3I7Ci0JCQkJCQkJc2lnbiA9IDE7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlQeV9ERUNSRUYoaW9iaik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKCFpc251bW9rKSB7Ci0JCQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsIAotCQkJCQkgICAgIiUlJWMgZm9ybWF0OiBhIG51bWJlciBpcyByZXF1aXJlZCwgIgotCQkJCQkgICAgIm5vdCAlLjIwMHMiLCBjLCBQeV9UWVBFKHYpLT50cF9uYW1lKTsKLQkJCQkJZ290byBlcnJvcjsKLQkJCQl9Ci0JCQkJaWYgKGZsYWdzICYgRl9aRVJPKQotCQkJCQlmaWxsID0gJzAnOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnZSc6Ci0JCQljYXNlICdFJzoKLQkJCWNhc2UgJ2YnOgotCQkJY2FzZSAnRic6Ci0JCQljYXNlICdnJzoKLQkJCWNhc2UgJ0cnOgotCQkJCWlmIChjID09ICdGJykKLQkJCQkJYyA9ICdmJzsKLQkJCQlwYnVmID0gZm9ybWF0YnVmOwotCQkJCWxlbiA9IGZvcm1hdGZsb2F0KHBidWYsIHNpemVvZihmb3JtYXRidWYpLAotCQkJCQkJICBmbGFncywgcHJlYywgYywgdik7Ci0JCQkJaWYgKGxlbiA8IDApCi0JCQkJCWdvdG8gZXJyb3I7Ci0JCQkJc2lnbiA9IDE7Ci0JCQkJaWYgKGZsYWdzICYgRl9aRVJPKQotCQkJCQlmaWxsID0gJzAnOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnYyc6Ci0jaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCQkJCWlmIChQeVVuaWNvZGVfQ2hlY2sodikpIHsKLQkJCQkJZm10ID0gZm10X3N0YXJ0OwotCQkJCQlhcmdpZHggPSBhcmdpZHhfc3RhcnQ7Ci0JCQkJCWdvdG8gdW5pY29kZTsKLQkJCQl9Ci0jZW5kaWYKLQkJCQlwYnVmID0gZm9ybWF0YnVmOwotCQkJCWxlbiA9IGZvcm1hdGNoYXIocGJ1Ziwgc2l6ZW9mKGZvcm1hdGJ1ZiksIHYpOwotCQkJCWlmIChsZW4gPCAwKQotCQkJCQlnb3RvIGVycm9yOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkgICJ1bnN1cHBvcnRlZCBmb3JtYXQgY2hhcmFjdGVyICclYycgKDB4JXgpICIKLQkJCQkgICJhdCBpbmRleCAlemQiLAotCQkJCSAgYywgYywKLQkJCQkgIChQeV9zc2l6ZV90KShmbXQgLSAxIC0KLQkJCQkJICAgICAgIFB5U3RyaW5nX0FzU3RyaW5nKGZvcm1hdCkpKTsKLQkJCQlnb3RvIGVycm9yOwotCQkJfQotCQkJaWYgKHNpZ24pIHsKLQkJCQlpZiAoKnBidWYgPT0gJy0nIHx8ICpwYnVmID09ICcrJykgewotCQkJCQlzaWduID0gKnBidWYrKzsKLQkJCQkJbGVuLS07Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGZsYWdzICYgRl9TSUdOKQotCQkJCQlzaWduID0gJysnOwotCQkJCWVsc2UgaWYgKGZsYWdzICYgRl9CTEFOSykKLQkJCQkJc2lnbiA9ICcgJzsKLQkJCQllbHNlCi0JCQkJCXNpZ24gPSAwOwotCQkJfQotCQkJaWYgKHdpZHRoIDwgbGVuKQotCQkJCXdpZHRoID0gbGVuOwotCQkJaWYgKHJlc2NudCAtIChzaWduICE9IDApIDwgd2lkdGgpIHsKLQkJCQlyZXNsZW4gLT0gcmVzY250OwotCQkJCXJlc2NudCA9IHdpZHRoICsgZm10Y250ICsgMTAwOwotCQkJCXJlc2xlbiArPSByZXNjbnQ7Ci0JCQkJaWYgKHJlc2xlbiA8IDApIHsKLQkJCQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCQkJCVB5X1hERUNSRUYodGVtcCk7Ci0JCQkJCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCQkJCX0KLQkJCQlpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmcmVzdWx0LCByZXNsZW4pIDwgMCkgewotCQkJCQlQeV9YREVDUkVGKHRlbXApOwotCQkJCQlyZXR1cm4gTlVMTDsKLQkJCQl9Ci0JCQkJcmVzID0gUHlTdHJpbmdfQVNfU1RSSU5HKHJlc3VsdCkKLQkJCQkJKyByZXNsZW4gLSByZXNjbnQ7Ci0JCQl9Ci0JCQlpZiAoc2lnbikgewotCQkJCWlmIChmaWxsICE9ICcgJykKLQkJCQkJKnJlcysrID0gc2lnbjsKLQkJCQlyZXNjbnQtLTsKLQkJCQlpZiAod2lkdGggPiBsZW4pCi0JCQkJCXdpZHRoLS07Ci0JCQl9Ci0JCQlpZiAoKGZsYWdzICYgRl9BTFQpICYmIChjID09ICd4JyB8fCBjID09ICdYJykpIHsKLQkJCQlhc3NlcnQocGJ1ZlswXSA9PSAnMCcpOwotCQkJCWFzc2VydChwYnVmWzFdID09IGMpOwotCQkJCWlmIChmaWxsICE9ICcgJykgewotCQkJCQkqcmVzKysgPSAqcGJ1ZisrOwotCQkJCQkqcmVzKysgPSAqcGJ1ZisrOwotCQkJCX0KLQkJCQlyZXNjbnQgLT0gMjsKLQkJCQl3aWR0aCAtPSAyOwotCQkJCWlmICh3aWR0aCA8IDApCi0JCQkJCXdpZHRoID0gMDsKLQkJCQlsZW4gLT0gMjsKLQkJCX0KLQkJCWlmICh3aWR0aCA+IGxlbiAmJiAhKGZsYWdzICYgRl9MSlVTVCkpIHsKLQkJCQlkbyB7Ci0JCQkJCS0tcmVzY250OwotCQkJCQkqcmVzKysgPSBmaWxsOwotCQkJCX0gd2hpbGUgKC0td2lkdGggPiBsZW4pOwotCQkJfQotCQkJaWYgKGZpbGwgPT0gJyAnKSB7Ci0JCQkJaWYgKHNpZ24pCi0JCQkJCSpyZXMrKyA9IHNpZ247Ci0JCQkJaWYgKChmbGFncyAmIEZfQUxUKSAmJgotCQkJCSAgICAoYyA9PSAneCcgfHwgYyA9PSAnWCcpKSB7Ci0JCQkJCWFzc2VydChwYnVmWzBdID09ICcwJyk7Ci0JCQkJCWFzc2VydChwYnVmWzFdID09IGMpOwotCQkJCQkqcmVzKysgPSAqcGJ1ZisrOwotCQkJCQkqcmVzKysgPSAqcGJ1ZisrOwotCQkJCX0KLQkJCX0KLQkJCVB5X01FTUNQWShyZXMsIHBidWYsIGxlbik7Ci0JCQlyZXMgKz0gbGVuOwotCQkJcmVzY250IC09IGxlbjsKLQkJCXdoaWxlICgtLXdpZHRoID49IGxlbikgewotCQkJCS0tcmVzY250OwotCQkJCSpyZXMrKyA9ICcgJzsKLQkJCX0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaWN0ICYmIChhcmdpZHggPCBhcmdsZW4pICYmIGMgIT0gJyUnKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vdCBhbGwgYXJndW1lbnRzIGNvbnZlcnRlZCBkdXJpbmcgc3RyaW5nIGZvcm1hdHRpbmciKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfWERFQ1JFRih0ZW1wKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgICAgICBpZiAoZGljdCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmb3JtYXQgcmVxdWlyZXMgYSBtYXBwaW5nIik7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICsrZm10OworICAgICAgICAgICAgICAgIC0tZm10Y250OworICAgICAgICAgICAgICAgIGtleXN0YXJ0ID0gZm10OworICAgICAgICAgICAgICAgIC8qIFNraXAgb3ZlciBiYWxhbmNlZCBwYXJlbnRoZXNlcyAqLworICAgICAgICAgICAgICAgIHdoaWxlIChwY291bnQgPiAwICYmIC0tZm10Y250ID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCpmbXQgPT0gJyknKQorICAgICAgICAgICAgICAgICAgICAgICAgLS1wY291bnQ7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCpmbXQgPT0gJygnKQorICAgICAgICAgICAgICAgICAgICAgICAgKytwY291bnQ7CisgICAgICAgICAgICAgICAgICAgIGZtdCsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBrZXlsZW4gPSBmbXQgLSBrZXlzdGFydCAtIDE7CisgICAgICAgICAgICAgICAgaWYgKGZtdGNudCA8IDAgfHwgcGNvdW50ID4gMCkgeworICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5jb21wbGV0ZSBmb3JtYXQga2V5Iik7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGtleSA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGtleXN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleWxlbik7CisgICAgICAgICAgICAgICAgaWYgKGtleSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgIGlmIChhcmdzX293bmVkKSB7CisgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihhcmdzKTsKKyAgICAgICAgICAgICAgICAgICAgYXJnc19vd25lZCA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGFyZ3MgPSBQeU9iamVjdF9HZXRJdGVtKGRpY3QsIGtleSk7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGtleSk7CisgICAgICAgICAgICAgICAgaWYgKGFyZ3MgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhcmdzX293bmVkID0gMTsKKyAgICAgICAgICAgICAgICBhcmdsZW4gPSAtMTsKKyAgICAgICAgICAgICAgICBhcmdpZHggPSAtMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdoaWxlICgtLWZtdGNudCA+PSAwKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChjID0gKmZtdCsrKSB7CisgICAgICAgICAgICAgICAgY2FzZSAnLSc6IGZsYWdzIHw9IEZfTEpVU1Q7IGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGNhc2UgJysnOiBmbGFncyB8PSBGX1NJR047IGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGNhc2UgJyAnOiBmbGFncyB8PSBGX0JMQU5LOyBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBjYXNlICcjJzogZmxhZ3MgfD0gRl9BTFQ7IGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGNhc2UgJzAnOiBmbGFncyB8PSBGX1pFUk87IGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjID09ICcqJykgeworICAgICAgICAgICAgICAgIHYgPSBnZXRuZXh0YXJnKGFyZ3MsIGFyZ2xlbiwgJmFyZ2lkeCk7CisgICAgICAgICAgICAgICAgaWYgKHYgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgICAgICBpZiAoIVB5SW50X0NoZWNrKHYpKSB7CisgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKiB3YW50cyBpbnQiKTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd2lkdGggPSBQeUludF9Bc0xvbmcodik7CisgICAgICAgICAgICAgICAgaWYgKHdpZHRoIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBmbGFncyB8PSBGX0xKVVNUOworICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IC13aWR0aDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKC0tZm10Y250ID49IDApCisgICAgICAgICAgICAgICAgICAgIGMgPSAqZm10Kys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChjID49IDAgJiYgaXNkaWdpdChjKSkgeworICAgICAgICAgICAgICAgIHdpZHRoID0gYyAtICcwJzsKKyAgICAgICAgICAgICAgICB3aGlsZSAoLS1mbXRjbnQgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICBjID0gUHlfQ0hBUk1BU0soKmZtdCsrKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFpc2RpZ2l0KGMpKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGlmICgod2lkdGgqMTApIC8gMTAgIT0gd2lkdGgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aWR0aCB0b28gYmlnIik7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHdpZHRoID0gd2lkdGgqMTAgKyAoYyAtICcwJyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGMgPT0gJy4nKSB7CisgICAgICAgICAgICAgICAgcHJlYyA9IDA7CisgICAgICAgICAgICAgICAgaWYgKC0tZm10Y250ID49IDApCisgICAgICAgICAgICAgICAgICAgIGMgPSAqZm10Kys7CisgICAgICAgICAgICAgICAgaWYgKGMgPT0gJyonKSB7CisgICAgICAgICAgICAgICAgICAgIHYgPSBnZXRuZXh0YXJnKGFyZ3MsIGFyZ2xlbiwgJmFyZ2lkeCk7CisgICAgICAgICAgICAgICAgICAgIGlmICh2ID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgICAgICBpZiAoIVB5SW50X0NoZWNrKHYpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIqIHdhbnRzIGludCIpOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwcmVjID0gUHlJbnRfQXNMb25nKHYpOworICAgICAgICAgICAgICAgICAgICBpZiAocHJlYyA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICBwcmVjID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKC0tZm10Y250ID49IDApCisgICAgICAgICAgICAgICAgICAgICAgICBjID0gKmZtdCsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChjID49IDAgJiYgaXNkaWdpdChjKSkgeworICAgICAgICAgICAgICAgICAgICBwcmVjID0gYyAtICcwJzsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKC0tZm10Y250ID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGMgPSBQeV9DSEFSTUFTSygqZm10KyspOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc2RpZ2l0KGMpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwcmVjKjEwKSAvIDEwICE9IHByZWMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcmVjIHRvbyBiaWciKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICAgICAgICAgICAgICAgICAgfQotCQkJUHlfWERFQ1JFRih0ZW1wKTsKLQkJfSAvKiAnJScgKi8KLQl9IC8qIHVudGlsIGVuZCAqLwotCWlmIChhcmdpZHggPCBhcmdsZW4gJiYgIWRpY3QpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkibm90IGFsbCBhcmd1bWVudHMgY29udmVydGVkIGR1cmluZyBzdHJpbmcgZm9ybWF0dGluZyIpOwotCQlnb3RvIGVycm9yOwotCX0KLQlpZiAoYXJnc19vd25lZCkgewotCQlQeV9ERUNSRUYoYXJncyk7Ci0JfQotCV9QeVN0cmluZ19SZXNpemUoJnJlc3VsdCwgcmVzbGVuIC0gcmVzY250KTsKLQlyZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgICAgICAgICAgICAgcHJlYyA9IHByZWMqMTAgKyAoYyAtICcwJyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IC8qIHByZWMgKi8KKyAgICAgICAgICAgIGlmIChmbXRjbnQgPj0gMCkgeworICAgICAgICAgICAgICAgIGlmIChjID09ICdoJyB8fCBjID09ICdsJyB8fCBjID09ICdMJykgeworICAgICAgICAgICAgICAgICAgICBpZiAoLS1mbXRjbnQgPj0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGMgPSAqZm10Kys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGZtdGNudCA8IDApIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluY29tcGxldGUgZm9ybWF0Iik7CisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjICE9ICclJykgeworICAgICAgICAgICAgICAgIHYgPSBnZXRuZXh0YXJnKGFyZ3MsIGFyZ2xlbiwgJmFyZ2lkeCk7CisgICAgICAgICAgICAgICAgaWYgKHYgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNpZ24gPSAwOworICAgICAgICAgICAgZmlsbCA9ICcgJzsKKyAgICAgICAgICAgIHN3aXRjaCAoYykgeworICAgICAgICAgICAgY2FzZSAnJSc6CisgICAgICAgICAgICAgICAgcGJ1ZiA9ICIlIjsKKyAgICAgICAgICAgICAgICBsZW4gPSAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAncyc6CisjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQorICAgICAgICAgICAgICAgIGlmIChQeVVuaWNvZGVfQ2hlY2sodikpIHsKKyAgICAgICAgICAgICAgICAgICAgZm10ID0gZm10X3N0YXJ0OworICAgICAgICAgICAgICAgICAgICBhcmdpZHggPSBhcmdpZHhfc3RhcnQ7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gdW5pY29kZTsKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgICAgICB0ZW1wID0gX1B5T2JqZWN0X1N0cih2KTsKKyNpZmRlZiBQeV9VU0lOR19VTklDT0RFCisgICAgICAgICAgICAgICAgaWYgKHRlbXAgIT0gTlVMTCAmJiBQeVVuaWNvZGVfQ2hlY2sodGVtcCkpIHsKKyAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHRlbXApOworICAgICAgICAgICAgICAgICAgICBmbXQgPSBmbXRfc3RhcnQ7CisgICAgICAgICAgICAgICAgICAgIGFyZ2lkeCA9IGFyZ2lkeF9zdGFydDsKKyAgICAgICAgICAgICAgICAgICAgZ290byB1bmljb2RlOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgICAgIC8qIEZhbGwgdGhyb3VnaCAqLworICAgICAgICAgICAgY2FzZSAncic6CisgICAgICAgICAgICAgICAgaWYgKGMgPT0gJ3InKQorICAgICAgICAgICAgICAgICAgICB0ZW1wID0gUHlPYmplY3RfUmVwcih2KTsKKyAgICAgICAgICAgICAgICBpZiAodGVtcCA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgIGlmICghUHlTdHJpbmdfQ2hlY2sodGVtcCkpIHsKKyAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAiJXMgYXJndW1lbnQgaGFzIG5vbi1zdHJpbmcgc3RyKCkiKTsKKyAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHRlbXApOworICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwYnVmID0gUHlTdHJpbmdfQVNfU1RSSU5HKHRlbXApOworICAgICAgICAgICAgICAgIGxlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHRlbXApOworICAgICAgICAgICAgICAgIGlmIChwcmVjID49IDAgJiYgbGVuID4gcHJlYykKKyAgICAgICAgICAgICAgICAgICAgbGVuID0gcHJlYzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ2knOgorICAgICAgICAgICAgY2FzZSAnZCc6CisgICAgICAgICAgICBjYXNlICd1JzoKKyAgICAgICAgICAgIGNhc2UgJ28nOgorICAgICAgICAgICAgY2FzZSAneCc6CisgICAgICAgICAgICBjYXNlICdYJzoKKyAgICAgICAgICAgICAgICBpZiAoYyA9PSAnaScpCisgICAgICAgICAgICAgICAgICAgIGMgPSAnZCc7CisgICAgICAgICAgICAgICAgaXNudW1vayA9IDA7CisgICAgICAgICAgICAgICAgaWYgKFB5TnVtYmVyX0NoZWNrKHYpKSB7CisgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICppb2JqPU5VTEw7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKFB5SW50X0NoZWNrKHYpIHx8IChQeUxvbmdfQ2hlY2sodikpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpb2JqID0gdjsKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihpb2JqKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlvYmogPSBQeU51bWJlcl9JbnQodik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW9iaj09TlVMTCkgaW9iaiA9IFB5TnVtYmVyX0xvbmcodik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGlvYmohPU5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChQeUludF9DaGVjayhpb2JqKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzbnVtb2sgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBidWYgPSBmb3JtYXRidWY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gZm9ybWF0aW50KHBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihmb3JtYXRidWYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywgcHJlYywgYywgaW9iaik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGlvYmopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZW4gPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ24gPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoUHlMb25nX0NoZWNrKGlvYmopKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlsZW47CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc251bW9rID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wID0gX1B5U3RyaW5nX0Zvcm1hdExvbmcoaW9iaiwgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWMsIGMsICZwYnVmLCAmaWxlbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGlvYmopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiA9IGlsZW47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0ZW1wKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ24gPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGlvYmopOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghaXNudW1vaykgeworICAgICAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIiUlJWMgZm9ybWF0OiBhIG51bWJlciBpcyByZXF1aXJlZCwgIgorICAgICAgICAgICAgICAgICAgICAgICAgIm5vdCAlLjIwMHMiLCBjLCBQeV9UWVBFKHYpLT50cF9uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGZsYWdzICYgRl9aRVJPKQorICAgICAgICAgICAgICAgICAgICBmaWxsID0gJzAnOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnZSc6CisgICAgICAgICAgICBjYXNlICdFJzoKKyAgICAgICAgICAgIGNhc2UgJ2YnOgorICAgICAgICAgICAgY2FzZSAnRic6CisgICAgICAgICAgICBjYXNlICdnJzoKKyAgICAgICAgICAgIGNhc2UgJ0cnOgorICAgICAgICAgICAgICAgIGlmIChjID09ICdGJykKKyAgICAgICAgICAgICAgICAgICAgYyA9ICdmJzsKKyAgICAgICAgICAgICAgICBwYnVmID0gZm9ybWF0YnVmOworICAgICAgICAgICAgICAgIGxlbiA9IGZvcm1hdGZsb2F0KHBidWYsIHNpemVvZihmb3JtYXRidWYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLCBwcmVjLCBjLCB2KTsKKyAgICAgICAgICAgICAgICBpZiAobGVuIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgICAgICBzaWduID0gMTsKKyAgICAgICAgICAgICAgICBpZiAoZmxhZ3MgJiBGX1pFUk8pCisgICAgICAgICAgICAgICAgICAgIGZpbGwgPSAnMCc7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdjJzoKKyNpZmRlZiBQeV9VU0lOR19VTklDT0RFCisgICAgICAgICAgICAgICAgaWYgKFB5VW5pY29kZV9DaGVjayh2KSkgeworICAgICAgICAgICAgICAgICAgICBmbXQgPSBmbXRfc3RhcnQ7CisgICAgICAgICAgICAgICAgICAgIGFyZ2lkeCA9IGFyZ2lkeF9zdGFydDsKKyAgICAgICAgICAgICAgICAgICAgZ290byB1bmljb2RlOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgICAgIHBidWYgPSBmb3JtYXRidWY7CisgICAgICAgICAgICAgICAgbGVuID0gZm9ybWF0Y2hhcihwYnVmLCBzaXplb2YoZm9ybWF0YnVmKSwgdik7CisgICAgICAgICAgICAgICAgaWYgKGxlbiA8IDApCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgInVuc3VwcG9ydGVkIGZvcm1hdCBjaGFyYWN0ZXIgJyVjJyAoMHgleCkgIgorICAgICAgICAgICAgICAgICAgImF0IGluZGV4ICV6ZCIsCisgICAgICAgICAgICAgICAgICBjLCBjLAorICAgICAgICAgICAgICAgICAgKFB5X3NzaXplX3QpKGZtdCAtIDEgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FzU3RyaW5nKGZvcm1hdCkpKTsKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNpZ24pIHsKKyAgICAgICAgICAgICAgICBpZiAoKnBidWYgPT0gJy0nIHx8ICpwYnVmID09ICcrJykgeworICAgICAgICAgICAgICAgICAgICBzaWduID0gKnBidWYrKzsKKyAgICAgICAgICAgICAgICAgICAgbGVuLS07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGZsYWdzICYgRl9TSUdOKQorICAgICAgICAgICAgICAgICAgICBzaWduID0gJysnOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKGZsYWdzICYgRl9CTEFOSykKKyAgICAgICAgICAgICAgICAgICAgc2lnbiA9ICcgJzsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHNpZ24gPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHdpZHRoIDwgbGVuKQorICAgICAgICAgICAgICAgIHdpZHRoID0gbGVuOworICAgICAgICAgICAgaWYgKHJlc2NudCAtIChzaWduICE9IDApIDwgd2lkdGgpIHsKKyAgICAgICAgICAgICAgICByZXNsZW4gLT0gcmVzY250OworICAgICAgICAgICAgICAgIHJlc2NudCA9IHdpZHRoICsgZm10Y250ICsgMTAwOworICAgICAgICAgICAgICAgIHJlc2xlbiArPSByZXNjbnQ7CisgICAgICAgICAgICAgICAgaWYgKHJlc2xlbiA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgICAgICAgICAgICAgIFB5X1hERUNSRUYodGVtcCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmcmVzdWx0LCByZXNsZW4pIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBQeV9YREVDUkVGKHRlbXApOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVzID0gUHlTdHJpbmdfQVNfU1RSSU5HKHJlc3VsdCkKKyAgICAgICAgICAgICAgICAgICAgKyByZXNsZW4gLSByZXNjbnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2lnbikgeworICAgICAgICAgICAgICAgIGlmIChmaWxsICE9ICcgJykKKyAgICAgICAgICAgICAgICAgICAgKnJlcysrID0gc2lnbjsKKyAgICAgICAgICAgICAgICByZXNjbnQtLTsKKyAgICAgICAgICAgICAgICBpZiAod2lkdGggPiBsZW4pCisgICAgICAgICAgICAgICAgICAgIHdpZHRoLS07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKGZsYWdzICYgRl9BTFQpICYmIChjID09ICd4JyB8fCBjID09ICdYJykpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnQocGJ1ZlswXSA9PSAnMCcpOworICAgICAgICAgICAgICAgIGFzc2VydChwYnVmWzFdID09IGMpOworICAgICAgICAgICAgICAgIGlmIChmaWxsICE9ICcgJykgeworICAgICAgICAgICAgICAgICAgICAqcmVzKysgPSAqcGJ1ZisrOworICAgICAgICAgICAgICAgICAgICAqcmVzKysgPSAqcGJ1ZisrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXNjbnQgLT0gMjsKKyAgICAgICAgICAgICAgICB3aWR0aCAtPSAyOworICAgICAgICAgICAgICAgIGlmICh3aWR0aCA8IDApCisgICAgICAgICAgICAgICAgICAgIHdpZHRoID0gMDsKKyAgICAgICAgICAgICAgICBsZW4gLT0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh3aWR0aCA+IGxlbiAmJiAhKGZsYWdzICYgRl9MSlVTVCkpIHsKKyAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgIC0tcmVzY250OworICAgICAgICAgICAgICAgICAgICAqcmVzKysgPSBmaWxsOworICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0td2lkdGggPiBsZW4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGZpbGwgPT0gJyAnKSB7CisgICAgICAgICAgICAgICAgaWYgKHNpZ24pCisgICAgICAgICAgICAgICAgICAgICpyZXMrKyA9IHNpZ247CisgICAgICAgICAgICAgICAgaWYgKChmbGFncyAmIEZfQUxUKSAmJgorICAgICAgICAgICAgICAgICAgICAoYyA9PSAneCcgfHwgYyA9PSAnWCcpKSB7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydChwYnVmWzBdID09ICcwJyk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydChwYnVmWzFdID09IGMpOworICAgICAgICAgICAgICAgICAgICAqcmVzKysgPSAqcGJ1ZisrOworICAgICAgICAgICAgICAgICAgICAqcmVzKysgPSAqcGJ1ZisrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5X01FTUNQWShyZXMsIHBidWYsIGxlbik7CisgICAgICAgICAgICByZXMgKz0gbGVuOworICAgICAgICAgICAgcmVzY250IC09IGxlbjsKKyAgICAgICAgICAgIHdoaWxlICgtLXdpZHRoID49IGxlbikgeworICAgICAgICAgICAgICAgIC0tcmVzY250OworICAgICAgICAgICAgICAgICpyZXMrKyA9ICcgJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChkaWN0ICYmIChhcmdpZHggPCBhcmdsZW4pICYmIGMgIT0gJyUnKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJub3QgYWxsIGFyZ3VtZW50cyBjb252ZXJ0ZWQgZHVyaW5nIHN0cmluZyBmb3JtYXR0aW5nIik7CisgICAgICAgICAgICAgICAgUHlfWERFQ1JFRih0ZW1wKTsKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlfWERFQ1JFRih0ZW1wKTsKKyAgICAgICAgfSAvKiAnJScgKi8KKyAgICB9IC8qIHVudGlsIGVuZCAqLworICAgIGlmIChhcmdpZHggPCBhcmdsZW4gJiYgIWRpY3QpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJub3QgYWxsIGFyZ3VtZW50cyBjb252ZXJ0ZWQgZHVyaW5nIHN0cmluZyBmb3JtYXR0aW5nIik7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorICAgIGlmIChhcmdzX293bmVkKSB7CisgICAgICAgIFB5X0RFQ1JFRihhcmdzKTsKKyAgICB9CisgICAgX1B5U3RyaW5nX1Jlc2l6ZSgmcmVzdWx0LCByZXNsZW4gLSByZXNjbnQpOworICAgIHJldHVybiByZXN1bHQ7CiAKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCiAgdW5pY29kZToKLQlpZiAoYXJnc19vd25lZCkgewotCQlQeV9ERUNSRUYoYXJncyk7Ci0JCWFyZ3Nfb3duZWQgPSAwOwotCX0KLQkvKiBGaWRkbGUgYXJncyByaWdodCAocmVtb3ZlIHRoZSBmaXJzdCBhcmdpZHggYXJndW1lbnRzKSAqLwotCWlmIChQeVR1cGxlX0NoZWNrKG9yaWdfYXJncykgJiYgYXJnaWR4ID4gMCkgewotCQlQeU9iamVjdCAqdjsKLQkJUHlfc3NpemVfdCBuID0gUHlUdXBsZV9HRVRfU0laRShvcmlnX2FyZ3MpIC0gYXJnaWR4OwotCQl2ID0gUHlUdXBsZV9OZXcobik7Ci0JCWlmICh2ID09IE5VTEwpCi0JCQlnb3RvIGVycm9yOwotCQl3aGlsZSAoLS1uID49IDApIHsKLQkJCVB5T2JqZWN0ICp3ID0gUHlUdXBsZV9HRVRfSVRFTShvcmlnX2FyZ3MsIG4gKyBhcmdpZHgpOwotCQkJUHlfSU5DUkVGKHcpOwotCQkJUHlUdXBsZV9TRVRfSVRFTSh2LCBuLCB3KTsKLQkJfQotCQlhcmdzID0gdjsKLQl9IGVsc2UgewotCQlQeV9JTkNSRUYob3JpZ19hcmdzKTsKLQkJYXJncyA9IG9yaWdfYXJnczsKLQl9Ci0JYXJnc19vd25lZCA9IDE7Ci0JLyogVGFrZSB3aGF0IHdlIGhhdmUgb2YgdGhlIHJlc3VsdCBhbmQgbGV0IHRoZSBVbmljb2RlIGZvcm1hdHRpbmcKLQkgICBmdW5jdGlvbiBmb3JtYXQgdGhlIHJlc3Qgb2YgdGhlIGlucHV0LiAqLwotCXJlc2NudCA9IHJlcyAtIFB5U3RyaW5nX0FTX1NUUklORyhyZXN1bHQpOwotCWlmIChfUHlTdHJpbmdfUmVzaXplKCZyZXN1bHQsIHJlc2NudCkpCi0JCWdvdG8gZXJyb3I7Ci0JZm10Y250ID0gUHlTdHJpbmdfR0VUX1NJWkUoZm9ybWF0KSAtIFwKLQkJIChmbXQgLSBQeVN0cmluZ19BU19TVFJJTkcoZm9ybWF0KSk7Ci0JZm9ybWF0ID0gUHlVbmljb2RlX0RlY29kZShmbXQsIGZtdGNudCwgTlVMTCwgTlVMTCk7Ci0JaWYgKGZvcm1hdCA9PSBOVUxMKQotCQlnb3RvIGVycm9yOwotCXYgPSBQeVVuaWNvZGVfRm9ybWF0KGZvcm1hdCwgYXJncyk7Ci0JUHlfREVDUkVGKGZvcm1hdCk7Ci0JaWYgKHYgPT0gTlVMTCkKLQkJZ290byBlcnJvcjsKLQkvKiBQYXN0ZSB3aGF0IHdlIGhhdmUgKHJlc3VsdCkgdG8gd2hhdCB0aGUgVW5pY29kZSBmb3JtYXR0aW5nCi0JICAgZnVuY3Rpb24gcmV0dXJuZWQgKHYpIGFuZCByZXR1cm4gdGhlIHJlc3VsdCAob3IgZXJyb3IpICovCi0JdyA9IFB5VW5pY29kZV9Db25jYXQocmVzdWx0LCB2KTsKLQlQeV9ERUNSRUYocmVzdWx0KTsKLQlQeV9ERUNSRUYodik7Ci0JUHlfREVDUkVGKGFyZ3MpOwotCXJldHVybiB3OworICAgIGlmIChhcmdzX293bmVkKSB7CisgICAgICAgIFB5X0RFQ1JFRihhcmdzKTsKKyAgICAgICAgYXJnc19vd25lZCA9IDA7CisgICAgfQorICAgIC8qIEZpZGRsZSBhcmdzIHJpZ2h0IChyZW1vdmUgdGhlIGZpcnN0IGFyZ2lkeCBhcmd1bWVudHMpICovCisgICAgaWYgKFB5VHVwbGVfQ2hlY2sob3JpZ19hcmdzKSAmJiBhcmdpZHggPiAwKSB7CisgICAgICAgIFB5T2JqZWN0ICp2OworICAgICAgICBQeV9zc2l6ZV90IG4gPSBQeVR1cGxlX0dFVF9TSVpFKG9yaWdfYXJncykgLSBhcmdpZHg7CisgICAgICAgIHYgPSBQeVR1cGxlX05ldyhuKTsKKyAgICAgICAgaWYgKHYgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIHdoaWxlICgtLW4gPj0gMCkgeworICAgICAgICAgICAgUHlPYmplY3QgKncgPSBQeVR1cGxlX0dFVF9JVEVNKG9yaWdfYXJncywgbiArIGFyZ2lkeCk7CisgICAgICAgICAgICBQeV9JTkNSRUYodyk7CisgICAgICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKHYsIG4sIHcpOworICAgICAgICB9CisgICAgICAgIGFyZ3MgPSB2OworICAgIH0gZWxzZSB7CisgICAgICAgIFB5X0lOQ1JFRihvcmlnX2FyZ3MpOworICAgICAgICBhcmdzID0gb3JpZ19hcmdzOworICAgIH0KKyAgICBhcmdzX293bmVkID0gMTsKKyAgICAvKiBUYWtlIHdoYXQgd2UgaGF2ZSBvZiB0aGUgcmVzdWx0IGFuZCBsZXQgdGhlIFVuaWNvZGUgZm9ybWF0dGluZworICAgICAgIGZ1bmN0aW9uIGZvcm1hdCB0aGUgcmVzdCBvZiB0aGUgaW5wdXQuICovCisgICAgcmVzY250ID0gcmVzIC0gUHlTdHJpbmdfQVNfU1RSSU5HKHJlc3VsdCk7CisgICAgaWYgKF9QeVN0cmluZ19SZXNpemUoJnJlc3VsdCwgcmVzY250KSkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBmbXRjbnQgPSBQeVN0cmluZ19HRVRfU0laRShmb3JtYXQpIC0gXAorICAgICAgICAgICAgIChmbXQgLSBQeVN0cmluZ19BU19TVFJJTkcoZm9ybWF0KSk7CisgICAgZm9ybWF0ID0gUHlVbmljb2RlX0RlY29kZShmbXQsIGZtdGNudCwgTlVMTCwgTlVMTCk7CisgICAgaWYgKGZvcm1hdCA9PSBOVUxMKQorICAgICAgICBnb3RvIGVycm9yOworICAgIHYgPSBQeVVuaWNvZGVfRm9ybWF0KGZvcm1hdCwgYXJncyk7CisgICAgUHlfREVDUkVGKGZvcm1hdCk7CisgICAgaWYgKHYgPT0gTlVMTCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICAvKiBQYXN0ZSB3aGF0IHdlIGhhdmUgKHJlc3VsdCkgdG8gd2hhdCB0aGUgVW5pY29kZSBmb3JtYXR0aW5nCisgICAgICAgZnVuY3Rpb24gcmV0dXJuZWQgKHYpIGFuZCByZXR1cm4gdGhlIHJlc3VsdCAob3IgZXJyb3IpICovCisgICAgdyA9IFB5VW5pY29kZV9Db25jYXQocmVzdWx0LCB2KTsKKyAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICBQeV9ERUNSRUYodik7CisgICAgUHlfREVDUkVGKGFyZ3MpOworICAgIHJldHVybiB3OwogI2VuZGlmIC8qIFB5X1VTSU5HX1VOSUNPREUgKi8KIAogIGVycm9yOgotCVB5X0RFQ1JFRihyZXN1bHQpOwotCWlmIChhcmdzX293bmVkKSB7Ci0JCVB5X0RFQ1JFRihhcmdzKTsKLQl9Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgaWYgKGFyZ3Nfb3duZWQpIHsKKyAgICAgICAgUHlfREVDUkVGKGFyZ3MpOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKIH0KIAogdm9pZAogUHlTdHJpbmdfSW50ZXJuSW5QbGFjZShQeU9iamVjdCAqKnApCiB7Ci0JcmVnaXN0ZXIgUHlTdHJpbmdPYmplY3QgKnMgPSAoUHlTdHJpbmdPYmplY3QgKikoKnApOwotCVB5T2JqZWN0ICp0OwotCWlmIChzID09IE5VTEwgfHwgIVB5U3RyaW5nX0NoZWNrKHMpKQotCQlQeV9GYXRhbEVycm9yKCJQeVN0cmluZ19JbnRlcm5JblBsYWNlOiBzdHJpbmdzIG9ubHkgcGxlYXNlISIpOwotCS8qIElmIGl0J3MgYSBzdHJpbmcgc3ViY2xhc3MsIHdlIGRvbid0IHJlYWxseSBrbm93IHdoYXQgcHV0dGluZwotCSAgIGl0IGluIHRoZSBpbnRlcm5lZCBkaWN0IG1pZ2h0IGRvLiAqLwotCWlmICghUHlTdHJpbmdfQ2hlY2tFeGFjdChzKSkKLQkJcmV0dXJuOwotCWlmIChQeVN0cmluZ19DSEVDS19JTlRFUk5FRChzKSkKLQkJcmV0dXJuOwotCWlmIChpbnRlcm5lZCA9PSBOVUxMKSB7Ci0JCWludGVybmVkID0gUHlEaWN0X05ldygpOwotCQlpZiAoaW50ZXJuZWQgPT0gTlVMTCkgewotCQkJUHlFcnJfQ2xlYXIoKTsgLyogRG9uJ3QgbGVhdmUgYW4gZXhjZXB0aW9uICovCi0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0JdCA9IFB5RGljdF9HZXRJdGVtKGludGVybmVkLCAoUHlPYmplY3QgKilzKTsKLQlpZiAodCkgewotCQlQeV9JTkNSRUYodCk7Ci0JCVB5X0RFQ1JFRigqcCk7Ci0JCSpwID0gdDsKLQkJcmV0dXJuOwotCX0KKyAgICByZWdpc3RlciBQeVN0cmluZ09iamVjdCAqcyA9IChQeVN0cmluZ09iamVjdCAqKSgqcCk7CisgICAgUHlPYmplY3QgKnQ7CisgICAgaWYgKHMgPT0gTlVMTCB8fCAhUHlTdHJpbmdfQ2hlY2socykpCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIlB5U3RyaW5nX0ludGVybkluUGxhY2U6IHN0cmluZ3Mgb25seSBwbGVhc2UhIik7CisgICAgLyogSWYgaXQncyBhIHN0cmluZyBzdWJjbGFzcywgd2UgZG9uJ3QgcmVhbGx5IGtub3cgd2hhdCBwdXR0aW5nCisgICAgICAgaXQgaW4gdGhlIGludGVybmVkIGRpY3QgbWlnaHQgZG8uICovCisgICAgaWYgKCFQeVN0cmluZ19DaGVja0V4YWN0KHMpKQorICAgICAgICByZXR1cm47CisgICAgaWYgKFB5U3RyaW5nX0NIRUNLX0lOVEVSTkVEKHMpKQorICAgICAgICByZXR1cm47CisgICAgaWYgKGludGVybmVkID09IE5VTEwpIHsKKyAgICAgICAgaW50ZXJuZWQgPSBQeURpY3RfTmV3KCk7CisgICAgICAgIGlmIChpbnRlcm5lZCA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeUVycl9DbGVhcigpOyAvKiBEb24ndCBsZWF2ZSBhbiBleGNlcHRpb24gKi8KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICB0ID0gUHlEaWN0X0dldEl0ZW0oaW50ZXJuZWQsIChQeU9iamVjdCAqKXMpOworICAgIGlmICh0KSB7CisgICAgICAgIFB5X0lOQ1JFRih0KTsKKyAgICAgICAgUHlfREVDUkVGKCpwKTsKKyAgICAgICAgKnAgPSB0OworICAgICAgICByZXR1cm47CisgICAgfQogCi0JaWYgKFB5RGljdF9TZXRJdGVtKGludGVybmVkLCAoUHlPYmplY3QgKilzLCAoUHlPYmplY3QgKilzKSA8IDApIHsKLQkJUHlFcnJfQ2xlYXIoKTsKLQkJcmV0dXJuOwotCX0KLQkvKiBUaGUgdHdvIHJlZmVyZW5jZXMgaW4gaW50ZXJuZWQgYXJlIG5vdCBjb3VudGVkIGJ5IHJlZmNudC4KLQkgICBUaGUgc3RyaW5nIGRlYWxsb2NhdG9yIHdpbGwgdGFrZSBjYXJlIG9mIHRoaXMgKi8KLQlQeV9SRUZDTlQocykgLT0gMjsKLQlQeVN0cmluZ19DSEVDS19JTlRFUk5FRChzKSA9IFNTVEFURV9JTlRFUk5FRF9NT1JUQUw7CisgICAgaWYgKFB5RGljdF9TZXRJdGVtKGludGVybmVkLCAoUHlPYmplY3QgKilzLCAoUHlPYmplY3QgKilzKSA8IDApIHsKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvKiBUaGUgdHdvIHJlZmVyZW5jZXMgaW4gaW50ZXJuZWQgYXJlIG5vdCBjb3VudGVkIGJ5IHJlZmNudC4KKyAgICAgICBUaGUgc3RyaW5nIGRlYWxsb2NhdG9yIHdpbGwgdGFrZSBjYXJlIG9mIHRoaXMgKi8KKyAgICBQeV9SRUZDTlQocykgLT0gMjsKKyAgICBQeVN0cmluZ19DSEVDS19JTlRFUk5FRChzKSA9IFNTVEFURV9JTlRFUk5FRF9NT1JUQUw7CiB9CiAKIHZvaWQKIFB5U3RyaW5nX0ludGVybkltbW9ydGFsKFB5T2JqZWN0ICoqcCkKIHsKLQlQeVN0cmluZ19JbnRlcm5JblBsYWNlKHApOwotCWlmIChQeVN0cmluZ19DSEVDS19JTlRFUk5FRCgqcCkgIT0gU1NUQVRFX0lOVEVSTkVEX0lNTU9SVEFMKSB7Ci0JCVB5U3RyaW5nX0NIRUNLX0lOVEVSTkVEKCpwKSA9IFNTVEFURV9JTlRFUk5FRF9JTU1PUlRBTDsKLQkJUHlfSU5DUkVGKCpwKTsKLQl9CisgICAgUHlTdHJpbmdfSW50ZXJuSW5QbGFjZShwKTsKKyAgICBpZiAoUHlTdHJpbmdfQ0hFQ0tfSU5URVJORUQoKnApICE9IFNTVEFURV9JTlRFUk5FRF9JTU1PUlRBTCkgeworICAgICAgICBQeVN0cmluZ19DSEVDS19JTlRFUk5FRCgqcCkgPSBTU1RBVEVfSU5URVJORURfSU1NT1JUQUw7CisgICAgICAgIFB5X0lOQ1JFRigqcCk7CisgICAgfQogfQogCiAKIFB5T2JqZWN0ICoKIFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoY29uc3QgY2hhciAqY3ApCiB7Ci0JUHlPYmplY3QgKnMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGNwKTsKLQlpZiAocyA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlQeVN0cmluZ19JbnRlcm5JblBsYWNlKCZzKTsKLQlyZXR1cm4gczsKKyAgICBQeU9iamVjdCAqcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoY3ApOworICAgIGlmIChzID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5U3RyaW5nX0ludGVybkluUGxhY2UoJnMpOworICAgIHJldHVybiBzOwogfQogCiB2b2lkCiBQeVN0cmluZ19GaW5pKHZvaWQpCiB7Ci0JaW50IGk7Ci0JZm9yIChpID0gMDsgaSA8IFVDSEFSX01BWCArIDE7IGkrKykgewotCQlQeV9YREVDUkVGKGNoYXJhY3RlcnNbaV0pOwotCQljaGFyYWN0ZXJzW2ldID0gTlVMTDsKLQl9Ci0JUHlfWERFQ1JFRihudWxsc3RyaW5nKTsKLQludWxsc3RyaW5nID0gTlVMTDsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgVUNIQVJfTUFYICsgMTsgaSsrKSB7CisgICAgICAgIFB5X1hERUNSRUYoY2hhcmFjdGVyc1tpXSk7CisgICAgICAgIGNoYXJhY3RlcnNbaV0gPSBOVUxMOworICAgIH0KKyAgICBQeV9YREVDUkVGKG51bGxzdHJpbmcpOworICAgIG51bGxzdHJpbmcgPSBOVUxMOwogfQogCiB2b2lkIF9QeV9SZWxlYXNlSW50ZXJuZWRTdHJpbmdzKHZvaWQpCiB7Ci0JUHlPYmplY3QgKmtleXM7Ci0JUHlTdHJpbmdPYmplY3QgKnM7Ci0JUHlfc3NpemVfdCBpLCBuOwotCVB5X3NzaXplX3QgaW1tb3J0YWxfc2l6ZSA9IDAsIG1vcnRhbF9zaXplID0gMDsKKyAgICBQeU9iamVjdCAqa2V5czsKKyAgICBQeVN0cmluZ09iamVjdCAqczsKKyAgICBQeV9zc2l6ZV90IGksIG47CisgICAgUHlfc3NpemVfdCBpbW1vcnRhbF9zaXplID0gMCwgbW9ydGFsX3NpemUgPSAwOwogCi0JaWYgKGludGVybmVkID09IE5VTEwgfHwgIVB5RGljdF9DaGVjayhpbnRlcm5lZCkpCi0JCXJldHVybjsKLQlrZXlzID0gUHlEaWN0X0tleXMoaW50ZXJuZWQpOwotCWlmIChrZXlzID09IE5VTEwgfHwgIVB5TGlzdF9DaGVjayhrZXlzKSkgewotCQlQeUVycl9DbGVhcigpOwotCQlyZXR1cm47Ci0JfQorICAgIGlmIChpbnRlcm5lZCA9PSBOVUxMIHx8ICFQeURpY3RfQ2hlY2soaW50ZXJuZWQpKQorICAgICAgICByZXR1cm47CisgICAga2V5cyA9IFB5RGljdF9LZXlzKGludGVybmVkKTsKKyAgICBpZiAoa2V5cyA9PSBOVUxMIHx8ICFQeUxpc3RfQ2hlY2soa2V5cykpIHsKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KIAotCS8qIFNpbmNlIF9QeV9SZWxlYXNlSW50ZXJuZWRTdHJpbmdzKCkgaXMgaW50ZW5kZWQgdG8gaGVscCBhIGxlYWsKLQkgICBkZXRlY3RvciwgaW50ZXJuZWQgc3RyaW5ncyBhcmUgbm90IGZvcmNpYmx5IGRlYWxsb2NhdGVkOyByYXRoZXIsIHdlCi0JICAgZ2l2ZSB0aGVtIHRoZWlyIHN0b2xlbiByZWZlcmVuY2VzIGJhY2ssIGFuZCB0aGVuIGNsZWFyIGFuZCBERUNSRUYKLQkgICB0aGUgaW50ZXJuZWQgZGljdC4gKi8KKyAgICAvKiBTaW5jZSBfUHlfUmVsZWFzZUludGVybmVkU3RyaW5ncygpIGlzIGludGVuZGVkIHRvIGhlbHAgYSBsZWFrCisgICAgICAgZGV0ZWN0b3IsIGludGVybmVkIHN0cmluZ3MgYXJlIG5vdCBmb3JjaWJseSBkZWFsbG9jYXRlZDsgcmF0aGVyLCB3ZQorICAgICAgIGdpdmUgdGhlbSB0aGVpciBzdG9sZW4gcmVmZXJlbmNlcyBiYWNrLCBhbmQgdGhlbiBjbGVhciBhbmQgREVDUkVGCisgICAgICAgdGhlIGludGVybmVkIGRpY3QuICovCiAKLQluID0gUHlMaXN0X0dFVF9TSVpFKGtleXMpOwotCWZwcmludGYoc3RkZXJyLCAicmVsZWFzaW5nICUiIFBZX0ZPUk1BVF9TSVpFX1QgImQgaW50ZXJuZWQgc3RyaW5nc1xuIiwKLQkJbik7Ci0JZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQlzID0gKFB5U3RyaW5nT2JqZWN0ICopIFB5TGlzdF9HRVRfSVRFTShrZXlzLCBpKTsKLQkJc3dpdGNoIChzLT5vYl9zc3RhdGUpIHsKLQkJY2FzZSBTU1RBVEVfTk9UX0lOVEVSTkVEOgotCQkJLyogWFhYIFNob3VsZG4ndCBoYXBwZW4gKi8KLQkJCWJyZWFrOwotCQljYXNlIFNTVEFURV9JTlRFUk5FRF9JTU1PUlRBTDoKLQkJCVB5X1JFRkNOVChzKSArPSAxOwotCQkJaW1tb3J0YWxfc2l6ZSArPSBQeV9TSVpFKHMpOwotCQkJYnJlYWs7Ci0JCWNhc2UgU1NUQVRFX0lOVEVSTkVEX01PUlRBTDoKLQkJCVB5X1JFRkNOVChzKSArPSAyOwotCQkJbW9ydGFsX3NpemUgKz0gUHlfU0laRShzKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJUHlfRmF0YWxFcnJvcigiSW5jb25zaXN0ZW50IGludGVybmVkIHN0cmluZyBzdGF0ZS4iKTsKLQkJfQotCQlzLT5vYl9zc3RhdGUgPSBTU1RBVEVfTk9UX0lOVEVSTkVEOwotCX0KLQlmcHJpbnRmKHN0ZGVyciwgInRvdGFsIHNpemUgb2YgYWxsIGludGVybmVkIHN0cmluZ3M6ICIKLQkJCSIlIiBQWV9GT1JNQVRfU0laRV9UICJkLyUiIFBZX0ZPUk1BVF9TSVpFX1QgImQgIgotCQkJIm1vcnRhbC9pbW1vcnRhbFxuIiwgbW9ydGFsX3NpemUsIGltbW9ydGFsX3NpemUpOwotCVB5X0RFQ1JFRihrZXlzKTsKLQlQeURpY3RfQ2xlYXIoaW50ZXJuZWQpOwotCVB5X0RFQ1JFRihpbnRlcm5lZCk7Ci0JaW50ZXJuZWQgPSBOVUxMOworICAgIG4gPSBQeUxpc3RfR0VUX1NJWkUoa2V5cyk7CisgICAgZnByaW50ZihzdGRlcnIsICJyZWxlYXNpbmcgJSIgUFlfRk9STUFUX1NJWkVfVCAiZCBpbnRlcm5lZCBzdHJpbmdzXG4iLAorICAgICAgICBuKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIHMgPSAoUHlTdHJpbmdPYmplY3QgKikgUHlMaXN0X0dFVF9JVEVNKGtleXMsIGkpOworICAgICAgICBzd2l0Y2ggKHMtPm9iX3NzdGF0ZSkgeworICAgICAgICBjYXNlIFNTVEFURV9OT1RfSU5URVJORUQ6CisgICAgICAgICAgICAvKiBYWFggU2hvdWxkbid0IGhhcHBlbiAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU1NUQVRFX0lOVEVSTkVEX0lNTU9SVEFMOgorICAgICAgICAgICAgUHlfUkVGQ05UKHMpICs9IDE7CisgICAgICAgICAgICBpbW1vcnRhbF9zaXplICs9IFB5X1NJWkUocyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTU1RBVEVfSU5URVJORURfTU9SVEFMOgorICAgICAgICAgICAgUHlfUkVGQ05UKHMpICs9IDI7CisgICAgICAgICAgICBtb3J0YWxfc2l6ZSArPSBQeV9TSVpFKHMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBQeV9GYXRhbEVycm9yKCJJbmNvbnNpc3RlbnQgaW50ZXJuZWQgc3RyaW5nIHN0YXRlLiIpOworICAgICAgICB9CisgICAgICAgIHMtPm9iX3NzdGF0ZSA9IFNTVEFURV9OT1RfSU5URVJORUQ7CisgICAgfQorICAgIGZwcmludGYoc3RkZXJyLCAidG90YWwgc2l6ZSBvZiBhbGwgaW50ZXJuZWQgc3RyaW5nczogIgorICAgICAgICAgICAgICAgICAgICAiJSIgUFlfRk9STUFUX1NJWkVfVCAiZC8lIiBQWV9GT1JNQVRfU0laRV9UICJkICIKKyAgICAgICAgICAgICAgICAgICAgIm1vcnRhbC9pbW1vcnRhbFxuIiwgbW9ydGFsX3NpemUsIGltbW9ydGFsX3NpemUpOworICAgIFB5X0RFQ1JFRihrZXlzKTsKKyAgICBQeURpY3RfQ2xlYXIoaW50ZXJuZWQpOworICAgIFB5X0RFQ1JFRihpbnRlcm5lZCk7CisgICAgaW50ZXJuZWQgPSBOVUxMOwogfQpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9zdHJ1Y3RzZXEuYyBiL09iamVjdHMvc3RydWN0c2VxLmMKaW5kZXggYWQyNDZhMS4uNThlMTVjYiAxMDA2NDQKLS0tIGEvT2JqZWN0cy9zdHJ1Y3RzZXEuYworKysgYi9PYmplY3RzL3N0cnVjdHNlcS5jCkBAIC05LDcgKzksNyBAQAogc3RhdGljIGNoYXIgcmVhbF9sZW5ndGhfa2V5W10gPSAibl9maWVsZHMiOwogc3RhdGljIGNoYXIgdW5uYW1lZF9maWVsZHNfa2V5W10gPSAibl91bm5hbWVkX2ZpZWxkcyI7CiAKLS8qIEZpZWxkcyB3aXRoIHRoaXMgbmFtZSBoYXZlIG9ubHkgYSBmaWVsZCBpbmRleCwgbm90IGEgZmllbGQgbmFtZS4gCisvKiBGaWVsZHMgd2l0aCB0aGlzIG5hbWUgaGF2ZSBvbmx5IGEgZmllbGQgaW5kZXgsIG5vdCBhIGZpZWxkIG5hbWUuCiAgICBUaGV5IGFyZSBvbmx5IGFsbG93ZWQgZm9yIGluZGljZXMgPCBuX3Zpc2libGVfZmllbGRzLiAqLwogY2hhciAqUHlTdHJ1Y3RTZXF1ZW5jZV9Vbm5hbWVkRmllbGQgPSAidW5uYW1lZCBmaWVsZCI7CiAKQEAgLTI5LDUxMSArMjksNTExIEBACiBQeU9iamVjdCAqCiBQeVN0cnVjdFNlcXVlbmNlX05ldyhQeVR5cGVPYmplY3QgKnR5cGUpCiB7Ci0JUHlTdHJ1Y3RTZXF1ZW5jZSAqb2JqOworICAgIFB5U3RydWN0U2VxdWVuY2UgKm9iajsKIAotCW9iaiA9IFB5T2JqZWN0X05ldyhQeVN0cnVjdFNlcXVlbmNlLCB0eXBlKTsKLQlpZiAob2JqID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCVB5X1NJWkUob2JqKSA9IFZJU0lCTEVfU0laRV9UUCh0eXBlKTsKKyAgICBvYmogPSBQeU9iamVjdF9OZXcoUHlTdHJ1Y3RTZXF1ZW5jZSwgdHlwZSk7CisgICAgaWYgKG9iaiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQeV9TSVpFKG9iaikgPSBWSVNJQkxFX1NJWkVfVFAodHlwZSk7CiAKLQlyZXR1cm4gKFB5T2JqZWN0Kikgb2JqOworICAgIHJldHVybiAoUHlPYmplY3QqKSBvYmo7CiB9CiAKIHN0YXRpYyB2b2lkCiBzdHJ1Y3RzZXFfZGVhbGxvYyhQeVN0cnVjdFNlcXVlbmNlICpvYmopCiB7Ci0JUHlfc3NpemVfdCBpLCBzaXplOworICAgIFB5X3NzaXplX3QgaSwgc2l6ZTsKIAotCXNpemUgPSBSRUFMX1NJWkUob2JqKTsKLQlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7Ci0JCVB5X1hERUNSRUYob2JqLT5vYl9pdGVtW2ldKTsKLQl9Ci0JUHlPYmplY3RfRGVsKG9iaik7CisgICAgc2l6ZSA9IFJFQUxfU0laRShvYmopOworICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKKyAgICAgICAgUHlfWERFQ1JFRihvYmotPm9iX2l0ZW1baV0pOworICAgIH0KKyAgICBQeU9iamVjdF9EZWwob2JqKTsKIH0KIAogc3RhdGljIFB5X3NzaXplX3QKIHN0cnVjdHNlcV9sZW5ndGgoUHlTdHJ1Y3RTZXF1ZW5jZSAqb2JqKQogewotCXJldHVybiBWSVNJQkxFX1NJWkUob2JqKTsKKyAgICByZXR1cm4gVklTSUJMRV9TSVpFKG9iaik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCoKIHN0cnVjdHNlcV9pdGVtKFB5U3RydWN0U2VxdWVuY2UgKm9iaiwgUHlfc3NpemVfdCBpKQogewotCWlmIChpIDwgMCB8fCBpID49IFZJU0lCTEVfU0laRShvYmopKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLCAidHVwbGUgaW5kZXggb3V0IG9mIHJhbmdlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlQeV9JTkNSRUYob2JqLT5vYl9pdGVtW2ldKTsKLQlyZXR1cm4gb2JqLT5vYl9pdGVtW2ldOworICAgIGlmIChpIDwgMCB8fCBpID49IFZJU0lCTEVfU0laRShvYmopKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLCAidHVwbGUgaW5kZXggb3V0IG9mIHJhbmdlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeV9JTkNSRUYob2JqLT5vYl9pdGVtW2ldKTsKKyAgICByZXR1cm4gb2JqLT5vYl9pdGVtW2ldOwogfQogCiBzdGF0aWMgUHlPYmplY3QqCiBzdHJ1Y3RzZXFfc2xpY2UoUHlTdHJ1Y3RTZXF1ZW5jZSAqb2JqLCBQeV9zc2l6ZV90IGxvdywgUHlfc3NpemVfdCBoaWdoKQogewotCVB5VHVwbGVPYmplY3QgKm5wOwotCVB5X3NzaXplX3QgaTsKKyAgICBQeVR1cGxlT2JqZWN0ICpucDsKKyAgICBQeV9zc2l6ZV90IGk7CiAKLQlpZiAobG93IDwgMCkKLQkJbG93ID0gMDsKLQlpZiAoaGlnaCA+IFZJU0lCTEVfU0laRShvYmopKQotCQloaWdoID0gVklTSUJMRV9TSVpFKG9iaik7Ci0JaWYgKGhpZ2ggPCBsb3cpCi0JCWhpZ2ggPSBsb3c7Ci0JbnAgPSAoUHlUdXBsZU9iamVjdCAqKVB5VHVwbGVfTmV3KGhpZ2gtbG93KTsKLQlpZiAobnAgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JZm9yKGkgPSBsb3c7IGkgPCBoaWdoOyArK2kpIHsKLQkJUHlPYmplY3QgKnYgPSBvYmotPm9iX2l0ZW1baV07Ci0JCVB5X0lOQ1JFRih2KTsKLQkJUHlUdXBsZV9TRVRfSVRFTShucCwgaS1sb3csIHYpOwotCX0KLQlyZXR1cm4gKFB5T2JqZWN0ICopIG5wOworICAgIGlmIChsb3cgPCAwKQorICAgICAgICBsb3cgPSAwOworICAgIGlmIChoaWdoID4gVklTSUJMRV9TSVpFKG9iaikpCisgICAgICAgIGhpZ2ggPSBWSVNJQkxFX1NJWkUob2JqKTsKKyAgICBpZiAoaGlnaCA8IGxvdykKKyAgICAgICAgaGlnaCA9IGxvdzsKKyAgICBucCA9IChQeVR1cGxlT2JqZWN0ICopUHlUdXBsZV9OZXcoaGlnaC1sb3cpOworICAgIGlmIChucCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBmb3IoaSA9IGxvdzsgaSA8IGhpZ2g7ICsraSkgeworICAgICAgICBQeU9iamVjdCAqdiA9IG9iai0+b2JfaXRlbVtpXTsKKyAgICAgICAgUHlfSU5DUkVGKHYpOworICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKG5wLCBpLWxvdywgdik7CisgICAgfQorICAgIHJldHVybiAoUHlPYmplY3QgKikgbnA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdHJ1Y3RzZXFfc3Vic2NyaXB0KFB5U3RydWN0U2VxdWVuY2UgKnNlbGYsIFB5T2JqZWN0ICppdGVtKQogewotCWlmIChQeUluZGV4X0NoZWNrKGl0ZW0pKSB7Ci0JCVB5X3NzaXplX3QgaSA9IFB5TnVtYmVyX0FzU3NpemVfdChpdGVtLCBQeUV4Y19JbmRleEVycm9yKTsKLQkJaWYgKGkgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJCXJldHVybiBOVUxMOworICAgIGlmIChQeUluZGV4X0NoZWNrKGl0ZW0pKSB7CisgICAgICAgIFB5X3NzaXplX3QgaSA9IFB5TnVtYmVyX0FzU3NpemVfdChpdGVtLCBQeUV4Y19JbmRleEVycm9yKTsKKyAgICAgICAgaWYgKGkgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogCi0JCWlmIChpIDwgMCkKLQkJCWkgKz0gVklTSUJMRV9TSVpFKHNlbGYpOworICAgICAgICBpZiAoaSA8IDApCisgICAgICAgICAgICBpICs9IFZJU0lCTEVfU0laRShzZWxmKTsKIAotCQlpZiAoaSA8IDAgfHwgaSA+PSBWSVNJQkxFX1NJWkUoc2VsZikpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLAotCQkJCSJ0dXBsZSBpbmRleCBvdXQgb2YgcmFuZ2UiKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCVB5X0lOQ1JFRihzZWxmLT5vYl9pdGVtW2ldKTsKLQkJcmV0dXJuIHNlbGYtPm9iX2l0ZW1baV07Ci0JfQotCWVsc2UgaWYgKFB5U2xpY2VfQ2hlY2soaXRlbSkpIHsKLQkJUHlfc3NpemVfdCBzdGFydCwgc3RvcCwgc3RlcCwgc2xpY2VsZW4sIGN1ciwgaTsKLQkJUHlPYmplY3QgKnJlc3VsdDsKLQkJCi0JCWlmIChQeVNsaWNlX0dldEluZGljZXNFeCgoUHlTbGljZU9iamVjdCAqKWl0ZW0sCi0JCQkJCSBWSVNJQkxFX1NJWkUoc2VsZiksICZzdGFydCwgJnN0b3AsCi0JCQkJCSAmc3RlcCwgJnNsaWNlbGVuKSA8IDApIHsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWlmIChzbGljZWxlbiA8PSAwKQotCQkJcmV0dXJuIFB5VHVwbGVfTmV3KDApOwotCQlyZXN1bHQgPSBQeVR1cGxlX05ldyhzbGljZWxlbik7Ci0JCWlmIChyZXN1bHQgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQlmb3IgKGN1ciA9IHN0YXJ0LCBpID0gMDsgaSA8IHNsaWNlbGVuOwotCQkgICAgIGN1ciArPSBzdGVwLCBpKyspIHsKLQkJCVB5T2JqZWN0ICp2ID0gc2VsZi0+b2JfaXRlbVtjdXJdOwotCQkJUHlfSU5DUkVGKHYpOwotCQkJUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIGksIHYpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCWVsc2UgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJzdHJ1Y3RzZXEgaW5kZXggbXVzdCBiZSBpbnRlZ2VyIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICAgICAgaWYgKGkgPCAwIHx8IGkgPj0gVklTSUJMRV9TSVpFKHNlbGYpKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwKKyAgICAgICAgICAgICAgICAidHVwbGUgaW5kZXggb3V0IG9mIHJhbmdlIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBQeV9JTkNSRUYoc2VsZi0+b2JfaXRlbVtpXSk7CisgICAgICAgIHJldHVybiBzZWxmLT5vYl9pdGVtW2ldOworICAgIH0KKyAgICBlbHNlIGlmIChQeVNsaWNlX0NoZWNrKGl0ZW0pKSB7CisgICAgICAgIFB5X3NzaXplX3Qgc3RhcnQsIHN0b3AsIHN0ZXAsIHNsaWNlbGVuLCBjdXIsIGk7CisgICAgICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisKKyAgICAgICAgaWYgKFB5U2xpY2VfR2V0SW5kaWNlc0V4KChQeVNsaWNlT2JqZWN0ICopaXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZJU0lCTEVfU0laRShzZWxmKSwgJnN0YXJ0LCAmc3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGVwLCAmc2xpY2VsZW4pIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNsaWNlbGVuIDw9IDApCisgICAgICAgICAgICByZXR1cm4gUHlUdXBsZV9OZXcoMCk7CisgICAgICAgIHJlc3VsdCA9IFB5VHVwbGVfTmV3KHNsaWNlbGVuKTsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGZvciAoY3VyID0gc3RhcnQsIGkgPSAwOyBpIDwgc2xpY2VsZW47CisgICAgICAgICAgICAgY3VyICs9IHN0ZXAsIGkrKykgeworICAgICAgICAgICAgUHlPYmplY3QgKnYgPSBzZWxmLT5vYl9pdGVtW2N1cl07CisgICAgICAgICAgICBQeV9JTkNSRUYodik7CisgICAgICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKHJlc3VsdCwgaSwgdik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAic3RydWN0c2VxIGluZGV4IG11c3QgYmUgaW50ZWdlciIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdHJ1Y3RzZXFfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCVB5T2JqZWN0ICphcmcgPSBOVUxMOwotCVB5T2JqZWN0ICpkaWN0ID0gTlVMTDsKLQlQeU9iamVjdCAqb2I7Ci0JUHlTdHJ1Y3RTZXF1ZW5jZSAqcmVzID0gTlVMTDsKLQlQeV9zc2l6ZV90IGxlbiwgbWluX2xlbiwgbWF4X2xlbiwgaSwgbl91bm5hbWVkX2ZpZWxkczsKLQlzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7InNlcXVlbmNlIiwgImRpY3QiLCAwfTsKKyAgICBQeU9iamVjdCAqYXJnID0gTlVMTDsKKyAgICBQeU9iamVjdCAqZGljdCA9IE5VTEw7CisgICAgUHlPYmplY3QgKm9iOworICAgIFB5U3RydWN0U2VxdWVuY2UgKnJlcyA9IE5VTEw7CisgICAgUHlfc3NpemVfdCBsZW4sIG1pbl9sZW4sIG1heF9sZW4sIGksIG5fdW5uYW1lZF9maWVsZHM7CisgICAgc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJzZXF1ZW5jZSIsICJkaWN0IiwgMH07CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAiT3xPOnN0cnVjdHNlcSIsIAotCQkJCQkga3dsaXN0LCAmYXJnLCAmZGljdCkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJPfE86c3RydWN0c2VxIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrd2xpc3QsICZhcmcsICZkaWN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlhcmcgPSBQeVNlcXVlbmNlX0Zhc3QoYXJnLCAiY29uc3RydWN0b3IgcmVxdWlyZXMgYSBzZXF1ZW5jZSIpOworICAgIGFyZyA9IFB5U2VxdWVuY2VfRmFzdChhcmcsICJjb25zdHJ1Y3RvciByZXF1aXJlcyBhIHNlcXVlbmNlIik7CiAKLQlpZiAoIWFyZykgewkJCQkKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICghYXJnKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWlmIChkaWN0ICYmICFQeURpY3RfQ2hlY2soZGljdCkpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgCi0JCQkgICAgICIlLjUwMHMoKSB0YWtlcyBhIGRpY3QgYXMgc2Vjb25kIGFyZywgaWYgYW55IiwKLQkJCSAgICAgdHlwZS0+dHBfbmFtZSk7Ci0JCVB5X0RFQ1JFRihhcmcpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKGRpY3QgJiYgIVB5RGljdF9DaGVjayhkaWN0KSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIiUuNTAwcygpIHRha2VzIGEgZGljdCBhcyBzZWNvbmQgYXJnLCBpZiBhbnkiLAorICAgICAgICAgICAgICAgICAgICAgdHlwZS0+dHBfbmFtZSk7CisgICAgICAgIFB5X0RFQ1JFRihhcmcpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlsZW4gPSBQeVNlcXVlbmNlX0Zhc3RfR0VUX1NJWkUoYXJnKTsKLQltaW5fbGVuID0gVklTSUJMRV9TSVpFX1RQKHR5cGUpOwotCW1heF9sZW4gPSBSRUFMX1NJWkVfVFAodHlwZSk7Ci0Jbl91bm5hbWVkX2ZpZWxkcyA9IFVOTkFNRURfRklFTERTX1RQKHR5cGUpOworICAgIGxlbiA9IFB5U2VxdWVuY2VfRmFzdF9HRVRfU0laRShhcmcpOworICAgIG1pbl9sZW4gPSBWSVNJQkxFX1NJWkVfVFAodHlwZSk7CisgICAgbWF4X2xlbiA9IFJFQUxfU0laRV9UUCh0eXBlKTsKKyAgICBuX3VubmFtZWRfZmllbGRzID0gVU5OQU1FRF9GSUVMRFNfVFAodHlwZSk7CiAKLQlpZiAobWluX2xlbiAhPSBtYXhfbGVuKSB7Ci0JCWlmIChsZW4gPCBtaW5fbGVuKSB7Ci0JCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAKLQkgICAgICAgIiUuNTAwcygpIHRha2VzIGFuIGF0IGxlYXN0ICV6ZC1zZXF1ZW5jZSAoJXpkLXNlcXVlbmNlIGdpdmVuKSIsCi0JCQkJICAgICB0eXBlLT50cF9uYW1lLCBtaW5fbGVuLCBsZW4pOwotCQkJUHlfREVDUkVGKGFyZyk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQorICAgIGlmIChtaW5fbGVuICE9IG1heF9sZW4pIHsKKyAgICAgICAgaWYgKGxlbiA8IG1pbl9sZW4pIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICIlLjUwMHMoKSB0YWtlcyBhbiBhdCBsZWFzdCAlemQtc2VxdWVuY2UgKCV6ZC1zZXF1ZW5jZSBnaXZlbikiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZS0+dHBfbmFtZSwgbWluX2xlbiwgbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGFyZyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CiAKLQkJaWYgKGxlbiA+IG1heF9sZW4pIHsKLQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsIAotCSAgICAgICAiJS41MDBzKCkgdGFrZXMgYW4gYXQgbW9zdCAlemQtc2VxdWVuY2UgKCV6ZC1zZXF1ZW5jZSBnaXZlbikiLAotCQkJCSAgICAgdHlwZS0+dHBfbmFtZSwgbWF4X2xlbiwgbGVuKTsKLQkJCVB5X0RFQ1JFRihhcmcpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9IAotCWVsc2UgewotCQlpZiAobGVuICE9IG1pbl9sZW4pIHsKLQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsIAotCSAgICAgICAiJS41MDBzKCkgdGFrZXMgYSAlemQtc2VxdWVuY2UgKCV6ZC1zZXF1ZW5jZSBnaXZlbikiLAotCQkJCSAgICAgdHlwZS0+dHBfbmFtZSwgbWluX2xlbiwgbGVuKTsKLQkJCVB5X0RFQ1JFRihhcmcpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9CisgICAgICAgIGlmIChsZW4gPiBtYXhfbGVuKSB7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAiJS41MDBzKCkgdGFrZXMgYW4gYXQgbW9zdCAlemQtc2VxdWVuY2UgKCV6ZC1zZXF1ZW5jZSBnaXZlbikiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZS0+dHBfbmFtZSwgbWF4X2xlbiwgbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGFyZyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZiAobGVuICE9IG1pbl9sZW4pIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICIlLjUwMHMoKSB0YWtlcyBhICV6ZC1zZXF1ZW5jZSAoJXpkLXNlcXVlbmNlIGdpdmVuKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLT50cF9uYW1lLCBtaW5fbGVuLCBsZW4pOworICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoYXJnKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CiAKLQlyZXMgPSAoUHlTdHJ1Y3RTZXF1ZW5jZSopIFB5U3RydWN0U2VxdWVuY2VfTmV3KHR5cGUpOwotCWlmIChyZXMgPT0gTlVMTCkgewotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKSB7Ci0JCVB5T2JqZWN0ICp2ID0gUHlTZXF1ZW5jZV9GYXN0X0dFVF9JVEVNKGFyZywgaSk7Ci0JCVB5X0lOQ1JFRih2KTsKLQkJcmVzLT5vYl9pdGVtW2ldID0gdjsKLQl9Ci0JZm9yICg7IGkgPCBtYXhfbGVuOyArK2kpIHsKLQkJaWYgKGRpY3QgJiYgKG9iID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoCi0JCQlkaWN0LCB0eXBlLT50cF9tZW1iZXJzW2ktbl91bm5hbWVkX2ZpZWxkc10ubmFtZSkpKSB7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlvYiA9IFB5X05vbmU7Ci0JCX0KLQkJUHlfSU5DUkVGKG9iKTsKLQkJcmVzLT5vYl9pdGVtW2ldID0gb2I7Ci0JfQotCQotCVB5X0RFQ1JFRihhcmcpOwotCXJldHVybiAoUHlPYmplY3QqKSByZXM7CisgICAgcmVzID0gKFB5U3RydWN0U2VxdWVuY2UqKSBQeVN0cnVjdFNlcXVlbmNlX05ldyh0eXBlKTsKKyAgICBpZiAocmVzID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkgeworICAgICAgICBQeU9iamVjdCAqdiA9IFB5U2VxdWVuY2VfRmFzdF9HRVRfSVRFTShhcmcsIGkpOworICAgICAgICBQeV9JTkNSRUYodik7CisgICAgICAgIHJlcy0+b2JfaXRlbVtpXSA9IHY7CisgICAgfQorICAgIGZvciAoOyBpIDwgbWF4X2xlbjsgKytpKSB7CisgICAgICAgIGlmIChkaWN0ICYmIChvYiA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKAorICAgICAgICAgICAgZGljdCwgdHlwZS0+dHBfbWVtYmVyc1tpLW5fdW5uYW1lZF9maWVsZHNdLm5hbWUpKSkgeworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgb2IgPSBQeV9Ob25lOworICAgICAgICB9CisgICAgICAgIFB5X0lOQ1JFRihvYik7CisgICAgICAgIHJlcy0+b2JfaXRlbVtpXSA9IG9iOworICAgIH0KKworICAgIFB5X0RFQ1JFRihhcmcpOworICAgIHJldHVybiAoUHlPYmplY3QqKSByZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBtYWtlX3R1cGxlKFB5U3RydWN0U2VxdWVuY2UgKm9iaikKIHsKLQlyZXR1cm4gc3RydWN0c2VxX3NsaWNlKG9iaiwgMCwgVklTSUJMRV9TSVpFKG9iaikpOworICAgIHJldHVybiBzdHJ1Y3RzZXFfc2xpY2Uob2JqLCAwLCBWSVNJQkxFX1NJWkUob2JqKSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdHJ1Y3RzZXFfcmVwcihQeVN0cnVjdFNlcXVlbmNlICpvYmopCiB7Ci0JLyogYnVmZmVyIGFuZCB0eXBlIHNpemUgd2VyZSBjaG9zZW4gd2VsbCBjb25zaWRlcmVkLiAqLworICAgIC8qIGJ1ZmZlciBhbmQgdHlwZSBzaXplIHdlcmUgY2hvc2VuIHdlbGwgY29uc2lkZXJlZC4gKi8KICNkZWZpbmUgUkVQUl9CVUZGRVJfU0laRSA1MTIKICNkZWZpbmUgVFlQRV9NQVhTSVpFIDEwMAogCi0JUHlPYmplY3QgKnR1cDsKLQlQeVR5cGVPYmplY3QgKnR5cCA9IFB5X1RZUEUob2JqKTsKLQlpbnQgaSwgcmVtb3ZlbGFzdCA9IDA7Ci0JUHlfc3NpemVfdCBsZW47Ci0JY2hhciBidWZbUkVQUl9CVUZGRVJfU0laRV07Ci0JY2hhciAqZW5kb2ZidWYsICpwYnVmID0gYnVmOworICAgIFB5T2JqZWN0ICp0dXA7CisgICAgUHlUeXBlT2JqZWN0ICp0eXAgPSBQeV9UWVBFKG9iaik7CisgICAgaW50IGksIHJlbW92ZWxhc3QgPSAwOworICAgIFB5X3NzaXplX3QgbGVuOworICAgIGNoYXIgYnVmW1JFUFJfQlVGRkVSX1NJWkVdOworICAgIGNoYXIgKmVuZG9mYnVmLCAqcGJ1ZiA9IGJ1ZjsKIAotCS8qIHBvaW50ZXIgdG8gZW5kIG9mIHdyaXRlYWJsZSBidWZmZXI7IHNhZmVzIHNwYWNlIGZvciAiLi4uKVwwIiAqLwotCWVuZG9mYnVmPSAmYnVmW1JFUFJfQlVGRkVSX1NJWkUtNV07CisgICAgLyogcG9pbnRlciB0byBlbmQgb2Ygd3JpdGVhYmxlIGJ1ZmZlcjsgc2FmZXMgc3BhY2UgZm9yICIuLi4pXDAiICovCisgICAgZW5kb2ZidWY9ICZidWZbUkVQUl9CVUZGRVJfU0laRS01XTsKIAotCWlmICgodHVwID0gbWFrZV90dXBsZShvYmopKSA9PSBOVUxMKSB7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoKHR1cCA9IG1ha2VfdHVwbGUob2JqKSkgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQkvKiAidHlwZW5hbWUoIiwgbGltaXRlZCB0byAgVFlQRV9NQVhTSVpFICovCi0JbGVuID0gc3RybGVuKHR5cC0+dHBfbmFtZSkgPiBUWVBFX01BWFNJWkUgPyBUWVBFX01BWFNJWkUgOgotCQkJCQkJICAgIHN0cmxlbih0eXAtPnRwX25hbWUpOwotCXN0cm5jcHkocGJ1ZiwgdHlwLT50cF9uYW1lLCBsZW4pOwotCXBidWYgKz0gbGVuOwotCSpwYnVmKysgPSAnKCc7CisgICAgLyogInR5cGVuYW1lKCIsIGxpbWl0ZWQgdG8gIFRZUEVfTUFYU0laRSAqLworICAgIGxlbiA9IHN0cmxlbih0eXAtPnRwX25hbWUpID4gVFlQRV9NQVhTSVpFID8gVFlQRV9NQVhTSVpFIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJsZW4odHlwLT50cF9uYW1lKTsKKyAgICBzdHJuY3B5KHBidWYsIHR5cC0+dHBfbmFtZSwgbGVuKTsKKyAgICBwYnVmICs9IGxlbjsKKyAgICAqcGJ1ZisrID0gJygnOwogCi0JZm9yIChpPTA7IGkgPCBWSVNJQkxFX1NJWkUob2JqKTsgaSsrKSB7Ci0JCVB5T2JqZWN0ICp2YWwsICpyZXByOwotCQljaGFyICpjbmFtZSwgKmNyZXByOworICAgIGZvciAoaT0wOyBpIDwgVklTSUJMRV9TSVpFKG9iaik7IGkrKykgeworICAgICAgICBQeU9iamVjdCAqdmFsLCAqcmVwcjsKKyAgICAgICAgY2hhciAqY25hbWUsICpjcmVwcjsKIAotCQljbmFtZSA9IHR5cC0+dHBfbWVtYmVyc1tpXS5uYW1lOwotCQkKLQkJdmFsID0gUHlUdXBsZV9HZXRJdGVtKHR1cCwgaSk7Ci0JCWlmIChjbmFtZSA9PSBOVUxMIHx8IHZhbCA9PSBOVUxMKSB7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlyZXByID0gUHlPYmplY3RfUmVwcih2YWwpOwotCQlpZiAocmVwciA9PSBOVUxMKSB7Ci0JCQlQeV9ERUNSRUYodHVwKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWNyZXByID0gUHlTdHJpbmdfQXNTdHJpbmcocmVwcik7Ci0JCWlmIChjcmVwciA9PSBOVUxMKSB7Ci0JCQlQeV9ERUNSRUYodHVwKTsKLQkJCVB5X0RFQ1JFRihyZXByKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCQotCQkvKiArIDM6IGtlZXAgc3BhY2UgZm9yICI9IiBhbmQgIiwgIiAqLwotIAkJbGVuID0gc3RybGVuKGNuYW1lKSArIHN0cmxlbihjcmVwcikgKyAzOwotCQlpZiAoKHBidWYrbGVuKSA8PSBlbmRvZmJ1ZikgewotCQkJc3RyY3B5KHBidWYsIGNuYW1lKTsKLQkJCXBidWYgKz0gc3RybGVuKGNuYW1lKTsKLQkJCSpwYnVmKysgPSAnPSc7Ci0JCQlzdHJjcHkocGJ1ZiwgY3JlcHIpOwotCQkJcGJ1ZiArPSBzdHJsZW4oY3JlcHIpOwotCQkJKnBidWYrKyA9ICcsJzsKLQkJCSpwYnVmKysgPSAnICc7Ci0JCQlyZW1vdmVsYXN0ID0gMTsKLQkJCVB5X0RFQ1JFRihyZXByKTsKLQkJfQotCQllbHNlIHsKLQkJCXN0cmNweShwYnVmLCAiLi4uIik7Ci0JCQlwYnVmICs9IDM7Ci0JCQlyZW1vdmVsYXN0ID0gMDsKLQkJCVB5X0RFQ1JFRihyZXByKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCVB5X0RFQ1JFRih0dXApOwotCWlmIChyZW1vdmVsYXN0KSB7Ci0JCS8qIG92ZXJ3cml0ZSBsYXN0ICIsICIgKi8KLQkJcGJ1Zi09MjsKLQl9Ci0JKnBidWYrKyA9ICcpJzsKLQkqcGJ1ZiA9ICdcMCc7CisgICAgICAgIGNuYW1lID0gdHlwLT50cF9tZW1iZXJzW2ldLm5hbWU7CiAKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOworICAgICAgICB2YWwgPSBQeVR1cGxlX0dldEl0ZW0odHVwLCBpKTsKKyAgICAgICAgaWYgKGNuYW1lID09IE5VTEwgfHwgdmFsID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHJlcHIgPSBQeU9iamVjdF9SZXByKHZhbCk7CisgICAgICAgIGlmIChyZXByID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih0dXApOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgY3JlcHIgPSBQeVN0cmluZ19Bc1N0cmluZyhyZXByKTsKKyAgICAgICAgaWYgKGNyZXByID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih0dXApOworICAgICAgICAgICAgUHlfREVDUkVGKHJlcHIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgICAvKiArIDM6IGtlZXAgc3BhY2UgZm9yICI9IiBhbmQgIiwgIiAqLworICAgICAgICBsZW4gPSBzdHJsZW4oY25hbWUpICsgc3RybGVuKGNyZXByKSArIDM7CisgICAgICAgIGlmICgocGJ1ZitsZW4pIDw9IGVuZG9mYnVmKSB7CisgICAgICAgICAgICBzdHJjcHkocGJ1ZiwgY25hbWUpOworICAgICAgICAgICAgcGJ1ZiArPSBzdHJsZW4oY25hbWUpOworICAgICAgICAgICAgKnBidWYrKyA9ICc9JzsKKyAgICAgICAgICAgIHN0cmNweShwYnVmLCBjcmVwcik7CisgICAgICAgICAgICBwYnVmICs9IHN0cmxlbihjcmVwcik7CisgICAgICAgICAgICAqcGJ1ZisrID0gJywnOworICAgICAgICAgICAgKnBidWYrKyA9ICcgJzsKKyAgICAgICAgICAgIHJlbW92ZWxhc3QgPSAxOworICAgICAgICAgICAgUHlfREVDUkVGKHJlcHIpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgc3RyY3B5KHBidWYsICIuLi4iKTsKKyAgICAgICAgICAgIHBidWYgKz0gMzsKKyAgICAgICAgICAgIHJlbW92ZWxhc3QgPSAwOworICAgICAgICAgICAgUHlfREVDUkVGKHJlcHIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgUHlfREVDUkVGKHR1cCk7CisgICAgaWYgKHJlbW92ZWxhc3QpIHsKKyAgICAgICAgLyogb3ZlcndyaXRlIGxhc3QgIiwgIiAqLworICAgICAgICBwYnVmLT0yOworICAgIH0KKyAgICAqcGJ1ZisrID0gJyknOworICAgICpwYnVmID0gJ1wwJzsKKworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdHJ1Y3RzZXFfY29uY2F0KFB5U3RydWN0U2VxdWVuY2UgKm9iaiwgUHlPYmplY3QgKmIpCiB7Ci0JUHlPYmplY3QgKnR1cCwgKnJlc3VsdDsKLQl0dXAgPSBtYWtlX3R1cGxlKG9iaik7Ci0JcmVzdWx0ID0gUHlTZXF1ZW5jZV9Db25jYXQodHVwLCBiKTsKLQlQeV9ERUNSRUYodHVwKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIFB5T2JqZWN0ICp0dXAsICpyZXN1bHQ7CisgICAgdHVwID0gbWFrZV90dXBsZShvYmopOworICAgIHJlc3VsdCA9IFB5U2VxdWVuY2VfQ29uY2F0KHR1cCwgYik7CisgICAgUHlfREVDUkVGKHR1cCk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHN0cnVjdHNlcV9yZXBlYXQoUHlTdHJ1Y3RTZXF1ZW5jZSAqb2JqLCBQeV9zc2l6ZV90IG4pCiB7Ci0JUHlPYmplY3QgKnR1cCwgKnJlc3VsdDsKLQl0dXAgPSBtYWtlX3R1cGxlKG9iaik7Ci0JcmVzdWx0ID0gUHlTZXF1ZW5jZV9SZXBlYXQodHVwLCBuKTsKLQlQeV9ERUNSRUYodHVwKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIFB5T2JqZWN0ICp0dXAsICpyZXN1bHQ7CisgICAgdHVwID0gbWFrZV90dXBsZShvYmopOworICAgIHJlc3VsdCA9IFB5U2VxdWVuY2VfUmVwZWF0KHR1cCwgbik7CisgICAgUHlfREVDUkVGKHR1cCk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIGludAogc3RydWN0c2VxX2NvbnRhaW5zKFB5U3RydWN0U2VxdWVuY2UgKm9iaiwgUHlPYmplY3QgKm8pCiB7Ci0JUHlPYmplY3QgKnR1cDsKLQlpbnQgcmVzdWx0OwotCXR1cCA9IG1ha2VfdHVwbGUob2JqKTsKLQlpZiAoIXR1cCkKLQkJcmV0dXJuIC0xOwotCXJlc3VsdCA9IFB5U2VxdWVuY2VfQ29udGFpbnModHVwLCBvKTsKLQlQeV9ERUNSRUYodHVwKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIFB5T2JqZWN0ICp0dXA7CisgICAgaW50IHJlc3VsdDsKKyAgICB0dXAgPSBtYWtlX3R1cGxlKG9iaik7CisgICAgaWYgKCF0dXApCisgICAgICAgIHJldHVybiAtMTsKKyAgICByZXN1bHQgPSBQeVNlcXVlbmNlX0NvbnRhaW5zKHR1cCwgbyk7CisgICAgUHlfREVDUkVGKHR1cCk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIGxvbmcKIHN0cnVjdHNlcV9oYXNoKFB5T2JqZWN0ICpvYmopCiB7Ci0JUHlPYmplY3QgKnR1cDsKLQlsb25nIHJlc3VsdDsKLQl0dXAgPSBtYWtlX3R1cGxlKChQeVN0cnVjdFNlcXVlbmNlKikgb2JqKTsKLQlpZiAoIXR1cCkKLQkJcmV0dXJuIC0xOwotCXJlc3VsdCA9IFB5T2JqZWN0X0hhc2godHVwKTsKLQlQeV9ERUNSRUYodHVwKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIFB5T2JqZWN0ICp0dXA7CisgICAgbG9uZyByZXN1bHQ7CisgICAgdHVwID0gbWFrZV90dXBsZSgoUHlTdHJ1Y3RTZXF1ZW5jZSopIG9iaik7CisgICAgaWYgKCF0dXApCisgICAgICAgIHJldHVybiAtMTsKKyAgICByZXN1bHQgPSBQeU9iamVjdF9IYXNoKHR1cCk7CisgICAgUHlfREVDUkVGKHR1cCk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHN0cnVjdHNlcV9yaWNoY29tcGFyZShQeU9iamVjdCAqb2JqLCBQeU9iamVjdCAqbzIsIGludCBvcCkKIHsKLQlQeU9iamVjdCAqdHVwLCAqcmVzdWx0OwotCXR1cCA9IG1ha2VfdHVwbGUoKFB5U3RydWN0U2VxdWVuY2UqKSBvYmopOwotCXJlc3VsdCA9IFB5T2JqZWN0X1JpY2hDb21wYXJlKHR1cCwgbzIsIG9wKTsKLQlQeV9ERUNSRUYodHVwKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIFB5T2JqZWN0ICp0dXAsICpyZXN1bHQ7CisgICAgdHVwID0gbWFrZV90dXBsZSgoUHlTdHJ1Y3RTZXF1ZW5jZSopIG9iaik7CisgICAgcmVzdWx0ID0gUHlPYmplY3RfUmljaENvbXBhcmUodHVwLCBvMiwgb3ApOworICAgIFB5X0RFQ1JFRih0dXApOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdHJ1Y3RzZXFfcmVkdWNlKFB5U3RydWN0U2VxdWVuY2UqIHNlbGYpCiB7Ci0JUHlPYmplY3QqIHR1cDsKLQlQeU9iamVjdCogZGljdDsKLQlQeU9iamVjdCogcmVzdWx0OwotCVB5X3NzaXplX3Qgbl9maWVsZHMsIG5fdmlzaWJsZV9maWVsZHMsIG5fdW5uYW1lZF9maWVsZHM7Ci0JaW50IGk7Ci0JCi0Jbl9maWVsZHMgPSBSRUFMX1NJWkUoc2VsZik7Ci0Jbl92aXNpYmxlX2ZpZWxkcyA9IFZJU0lCTEVfU0laRShzZWxmKTsKLQluX3VubmFtZWRfZmllbGRzID0gVU5OQU1FRF9GSUVMRFMoc2VsZik7Ci0JdHVwID0gUHlUdXBsZV9OZXcobl92aXNpYmxlX2ZpZWxkcyk7Ci0JaWYgKCF0dXApIHsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIFB5T2JqZWN0KiB0dXA7CisgICAgUHlPYmplY3QqIGRpY3Q7CisgICAgUHlPYmplY3QqIHJlc3VsdDsKKyAgICBQeV9zc2l6ZV90IG5fZmllbGRzLCBuX3Zpc2libGVfZmllbGRzLCBuX3VubmFtZWRfZmllbGRzOworICAgIGludCBpOwogCi0JZGljdCA9IFB5RGljdF9OZXcoKTsKLQlpZiAoIWRpY3QpIHsKLQkJUHlfREVDUkVGKHR1cCk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBuX2ZpZWxkcyA9IFJFQUxfU0laRShzZWxmKTsKKyAgICBuX3Zpc2libGVfZmllbGRzID0gVklTSUJMRV9TSVpFKHNlbGYpOworICAgIG5fdW5uYW1lZF9maWVsZHMgPSBVTk5BTUVEX0ZJRUxEUyhzZWxmKTsKKyAgICB0dXAgPSBQeVR1cGxlX05ldyhuX3Zpc2libGVfZmllbGRzKTsKKyAgICBpZiAoIXR1cCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlmb3IgKGkgPSAwOyBpIDwgbl92aXNpYmxlX2ZpZWxkczsgaSsrKSB7Ci0JCVB5X0lOQ1JFRihzZWxmLT5vYl9pdGVtW2ldKTsKLQkJUHlUdXBsZV9TRVRfSVRFTSh0dXAsIGksIHNlbGYtPm9iX2l0ZW1baV0pOwotCX0KLQkKLQlmb3IgKDsgaSA8IG5fZmllbGRzOyBpKyspIHsKLQkJY2hhciAqbiA9IFB5X1RZUEUoc2VsZiktPnRwX21lbWJlcnNbaS1uX3VubmFtZWRfZmllbGRzXS5uYW1lOwotCQlQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCBuLAotCQkJCSAgICAgc2VsZi0+b2JfaXRlbVtpXSk7Ci0JfQorICAgIGRpY3QgPSBQeURpY3RfTmV3KCk7CisgICAgaWYgKCFkaWN0KSB7CisgICAgICAgIFB5X0RFQ1JFRih0dXApOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlyZXN1bHQgPSBQeV9CdWlsZFZhbHVlKCIoTyhPTykpIiwgUHlfVFlQRShzZWxmKSwgdHVwLCBkaWN0KTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbl92aXNpYmxlX2ZpZWxkczsgaSsrKSB7CisgICAgICAgIFB5X0lOQ1JFRihzZWxmLT5vYl9pdGVtW2ldKTsKKyAgICAgICAgUHlUdXBsZV9TRVRfSVRFTSh0dXAsIGksIHNlbGYtPm9iX2l0ZW1baV0pOworICAgIH0KIAotCVB5X0RFQ1JFRih0dXApOwotCVB5X0RFQ1JFRihkaWN0KTsKKyAgICBmb3IgKDsgaSA8IG5fZmllbGRzOyBpKyspIHsKKyAgICAgICAgY2hhciAqbiA9IFB5X1RZUEUoc2VsZiktPnRwX21lbWJlcnNbaS1uX3VubmFtZWRfZmllbGRzXS5uYW1lOworICAgICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5vYl9pdGVtW2ldKTsKKyAgICB9CiAKLQlyZXR1cm4gcmVzdWx0OworICAgIHJlc3VsdCA9IFB5X0J1aWxkVmFsdWUoIihPKE9PKSkiLCBQeV9UWVBFKHNlbGYpLCB0dXAsIGRpY3QpOworCisgICAgUHlfREVDUkVGKHR1cCk7CisgICAgUHlfREVDUkVGKGRpY3QpOworCisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIFB5U2VxdWVuY2VNZXRob2RzIHN0cnVjdHNlcV9hc19zZXF1ZW5jZSA9IHsKLQkobGVuZnVuYylzdHJ1Y3RzZXFfbGVuZ3RoLAotCShiaW5hcnlmdW5jKXN0cnVjdHNlcV9jb25jYXQsICAgICAgICAgICAvKiBzcV9jb25jYXQgKi8KLQkoc3NpemVhcmdmdW5jKXN0cnVjdHNlcV9yZXBlYXQsICAgICAgICAgLyogc3FfcmVwZWF0ICovCi0JKHNzaXplYXJnZnVuYylzdHJ1Y3RzZXFfaXRlbSwJCS8qIHNxX2l0ZW0gKi8KLQkoc3NpemVzc2l6ZWFyZ2Z1bmMpc3RydWN0c2VxX3NsaWNlLAkvKiBzcV9zbGljZSAqLwotCTAsCQkJCQkvKiBzcV9hc3NfaXRlbSAqLwotCTAsCQkJCQkvKiBzcV9hc3Nfc2xpY2UgKi8KLQkob2Jqb2JqcHJvYylzdHJ1Y3RzZXFfY29udGFpbnMsCSAgICAgICAgLyogc3FfY29udGFpbnMgKi8KKyAgICAobGVuZnVuYylzdHJ1Y3RzZXFfbGVuZ3RoLAorICAgIChiaW5hcnlmdW5jKXN0cnVjdHNlcV9jb25jYXQsICAgICAgICAgICAvKiBzcV9jb25jYXQgKi8KKyAgICAoc3NpemVhcmdmdW5jKXN0cnVjdHNlcV9yZXBlYXQsICAgICAgICAgLyogc3FfcmVwZWF0ICovCisgICAgKHNzaXplYXJnZnVuYylzdHJ1Y3RzZXFfaXRlbSwgICAgICAgICAgICAgICAvKiBzcV9pdGVtICovCisgICAgKHNzaXplc3NpemVhcmdmdW5jKXN0cnVjdHNlcV9zbGljZSwgICAgICAgICAvKiBzcV9zbGljZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3FfYXNzX2l0ZW0gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNxX2Fzc19zbGljZSAqLworICAgIChvYmpvYmpwcm9jKXN0cnVjdHNlcV9jb250YWlucywgICAgICAgICAgICAgLyogc3FfY29udGFpbnMgKi8KIH07CiAKIHN0YXRpYyBQeU1hcHBpbmdNZXRob2RzIHN0cnVjdHNlcV9hc19tYXBwaW5nID0gewotCShsZW5mdW5jKXN0cnVjdHNlcV9sZW5ndGgsCi0JKGJpbmFyeWZ1bmMpc3RydWN0c2VxX3N1YnNjcmlwdCwKKyAgICAobGVuZnVuYylzdHJ1Y3RzZXFfbGVuZ3RoLAorICAgIChiaW5hcnlmdW5jKXN0cnVjdHNlcV9zdWJzY3JpcHQsCiB9OwogCiBzdGF0aWMgUHlNZXRob2REZWYgc3RydWN0c2VxX21ldGhvZHNbXSA9IHsKLQl7Il9fcmVkdWNlX18iLCAoUHlDRnVuY3Rpb24pc3RydWN0c2VxX3JlZHVjZSwgCi0JIE1FVEhfTk9BUkdTLCBOVUxMfSwKLQl7TlVMTCwgTlVMTH0KKyAgICB7Il9fcmVkdWNlX18iLCAoUHlDRnVuY3Rpb24pc3RydWN0c2VxX3JlZHVjZSwKKyAgICAgTUVUSF9OT0FSR1MsIE5VTEx9LAorICAgIHtOVUxMLCBOVUxMfQogfTsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBfc3RydWN0X3NlcXVlbmNlX3RlbXBsYXRlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCi0JTlVMTCwJICAgICAgICAgICAgICAgICAgICAgCQkvKiB0cF9uYW1lICovCi0gICAgICAgIDAsCQkgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KLQkwLAkgICAgICAgICAgICAgICAgICAgICAgCQkvKiB0cF9pdGVtc2l6ZSAqLwotCShkZXN0cnVjdG9yKXN0cnVjdHNlcV9kZWFsbG9jLAkgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIC8qIHRwX3ByaW50ICovCi0JMCwJCQkgCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLCAgICAgICAgICAgICAgIAkJCS8qIHRwX2NvbXBhcmUgKi8KLQkocmVwcmZ1bmMpc3RydWN0c2VxX3JlcHIsICAgICAgICAgICAgIAkvKiB0cF9yZXByICovCi0JMCwJCQkJCS8qIHRwX2FzX251bWJlciAqLwotCSZzdHJ1Y3RzZXFfYXNfc2VxdWVuY2UsCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkmc3RydWN0c2VxX2FzX21hcHBpbmcsCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCXN0cnVjdHNlcV9oYXNoLAkJCQkvKiB0cF9oYXNoICovCi0JMCwgICAgICAgICAgICAgIAkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkJLyogdHBfc3RyICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgIAkJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkgICAgICAgICAgICAgICAgICAgICAgICAgICAJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxULCAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCi0JTlVMTCwJIAkJICAgICAgICAgCS8qIHRwX2RvYyAqLwotCTAsCQkJCQkvKiB0cF90cmF2ZXJzZSAqLwotCTAsCQkJCQkvKiB0cF9jbGVhciAqLwotCXN0cnVjdHNlcV9yaWNoY29tcGFyZSwJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCTAsCQkJCQkvKiB0cF9pdGVyICovCi0JMCwJCQkJCS8qIHRwX2l0ZXJuZXh0ICovCi0Jc3RydWN0c2VxX21ldGhvZHMsICAgICAgCQkvKiB0cF9tZXRob2RzICovCi0gICAgICAgIE5VTEwsCQkJICAgICAgICAgICAgIAkvKiB0cF9tZW1iZXJzICovCi0JMCwJCQkgICAgICAgICAgCS8qIHRwX2dldHNldCAqLwotCTAsCQkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJCS8qIHRwX2RpY3QgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLwotCTAsCQkJCQkvKiB0cF9pbml0ICovCi0JMCwJCQkJCS8qIHRwX2FsbG9jICovCi0Jc3RydWN0c2VxX25ldywJCQkJLyogdHBfbmV3ICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAoZGVzdHJ1Y3RvcilzdHJ1Y3RzZXFfZGVhbGxvYywgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgKHJlcHJmdW5jKXN0cnVjdHNlcV9yZXByLCAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAmc3RydWN0c2VxX2FzX3NlcXVlbmNlLCAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgJnN0cnVjdHNlcV9hc19tYXBwaW5nLCAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgc3RydWN0c2VxX2hhc2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIHN0cnVjdHNlcV9yaWNoY29tcGFyZSwgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIHN0cnVjdHNlcV9tZXRob2RzLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBzdHJ1Y3RzZXFfbmV3LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLwogfTsKIAogdm9pZAogUHlTdHJ1Y3RTZXF1ZW5jZV9Jbml0VHlwZShQeVR5cGVPYmplY3QgKnR5cGUsIFB5U3RydWN0U2VxdWVuY2VfRGVzYyAqZGVzYykKIHsKLQlQeU9iamVjdCAqZGljdDsKLQlQeU1lbWJlckRlZiogbWVtYmVyczsKLQlpbnQgbl9tZW1iZXJzLCBuX3VubmFtZWRfbWVtYmVycywgaSwgazsKKyAgICBQeU9iamVjdCAqZGljdDsKKyAgICBQeU1lbWJlckRlZiogbWVtYmVyczsKKyAgICBpbnQgbl9tZW1iZXJzLCBuX3VubmFtZWRfbWVtYmVycywgaSwgazsKIAogI2lmZGVmIFB5X1RSQUNFX1JFRlMKLQkvKiBpZiB0aGUgdHlwZSBvYmplY3Qgd2FzIGNoYWluZWQsIHVuY2hhaW4gaXQgZmlyc3QKLQkgICBiZWZvcmUgb3ZlcndyaXRpbmcgaXRzIHN0b3JhZ2UgKi8KLQlpZiAodHlwZS0+X29iX25leHQpIHsKLQkJX1B5X0ZvcmdldFJlZmVyZW5jZSgoUHlPYmplY3QqKXR5cGUpOwotCX0KKyAgICAvKiBpZiB0aGUgdHlwZSBvYmplY3Qgd2FzIGNoYWluZWQsIHVuY2hhaW4gaXQgZmlyc3QKKyAgICAgICBiZWZvcmUgb3ZlcndyaXRpbmcgaXRzIHN0b3JhZ2UgKi8KKyAgICBpZiAodHlwZS0+X29iX25leHQpIHsKKyAgICAgICAgX1B5X0ZvcmdldFJlZmVyZW5jZSgoUHlPYmplY3QqKXR5cGUpOworICAgIH0KICNlbmRpZgogCi0Jbl91bm5hbWVkX21lbWJlcnMgPSAwOwotCWZvciAoaSA9IDA7IGRlc2MtPmZpZWxkc1tpXS5uYW1lICE9IE5VTEw7ICsraSkKLQkJaWYgKGRlc2MtPmZpZWxkc1tpXS5uYW1lID09IFB5U3RydWN0U2VxdWVuY2VfVW5uYW1lZEZpZWxkKQotCQkJbl91bm5hbWVkX21lbWJlcnMrKzsKLQluX21lbWJlcnMgPSBpOworICAgIG5fdW5uYW1lZF9tZW1iZXJzID0gMDsKKyAgICBmb3IgKGkgPSAwOyBkZXNjLT5maWVsZHNbaV0ubmFtZSAhPSBOVUxMOyArK2kpCisgICAgICAgIGlmIChkZXNjLT5maWVsZHNbaV0ubmFtZSA9PSBQeVN0cnVjdFNlcXVlbmNlX1VubmFtZWRGaWVsZCkKKyAgICAgICAgICAgIG5fdW5uYW1lZF9tZW1iZXJzKys7CisgICAgbl9tZW1iZXJzID0gaTsKIAotCW1lbWNweSh0eXBlLCAmX3N0cnVjdF9zZXF1ZW5jZV90ZW1wbGF0ZSwgc2l6ZW9mKFB5VHlwZU9iamVjdCkpOwotCXR5cGUtPnRwX25hbWUgPSBkZXNjLT5uYW1lOwotCXR5cGUtPnRwX2RvYyA9IGRlc2MtPmRvYzsKLQl0eXBlLT50cF9iYXNpY3NpemUgPSBzaXplb2YoUHlTdHJ1Y3RTZXF1ZW5jZSkrCi0JCXNpemVvZihQeU9iamVjdCopKihuX21lbWJlcnMtMSk7Ci0JdHlwZS0+dHBfaXRlbXNpemUgPSAwOworICAgIG1lbWNweSh0eXBlLCAmX3N0cnVjdF9zZXF1ZW5jZV90ZW1wbGF0ZSwgc2l6ZW9mKFB5VHlwZU9iamVjdCkpOworICAgIHR5cGUtPnRwX25hbWUgPSBkZXNjLT5uYW1lOworICAgIHR5cGUtPnRwX2RvYyA9IGRlc2MtPmRvYzsKKyAgICB0eXBlLT50cF9iYXNpY3NpemUgPSBzaXplb2YoUHlTdHJ1Y3RTZXF1ZW5jZSkrCisgICAgICAgIHNpemVvZihQeU9iamVjdCopKihuX21lbWJlcnMtMSk7CisgICAgdHlwZS0+dHBfaXRlbXNpemUgPSAwOwogCi0JbWVtYmVycyA9IFB5TWVtX05FVyhQeU1lbWJlckRlZiwgbl9tZW1iZXJzLW5fdW5uYW1lZF9tZW1iZXJzKzEpOwotCWlmIChtZW1iZXJzID09IE5VTEwpCi0JCXJldHVybjsKLQkKLQlmb3IgKGkgPSBrID0gMDsgaSA8IG5fbWVtYmVyczsgKytpKSB7Ci0JCWlmIChkZXNjLT5maWVsZHNbaV0ubmFtZSA9PSBQeVN0cnVjdFNlcXVlbmNlX1VubmFtZWRGaWVsZCkKLQkJCWNvbnRpbnVlOwotCQltZW1iZXJzW2tdLm5hbWUgPSBkZXNjLT5maWVsZHNbaV0ubmFtZTsKLQkJbWVtYmVyc1trXS50eXBlID0gVF9PQkpFQ1Q7Ci0JCW1lbWJlcnNba10ub2Zmc2V0ID0gb2Zmc2V0b2YoUHlTdHJ1Y3RTZXF1ZW5jZSwgb2JfaXRlbSkKLQkJICArIGkgKiBzaXplb2YoUHlPYmplY3QqKTsKLQkJbWVtYmVyc1trXS5mbGFncyA9IFJFQURPTkxZOwotCQltZW1iZXJzW2tdLmRvYyA9IGRlc2MtPmZpZWxkc1tpXS5kb2M7Ci0JCWsrKzsKLQl9Ci0JbWVtYmVyc1trXS5uYW1lID0gTlVMTDsKKyAgICBtZW1iZXJzID0gUHlNZW1fTkVXKFB5TWVtYmVyRGVmLCBuX21lbWJlcnMtbl91bm5hbWVkX21lbWJlcnMrMSk7CisgICAgaWYgKG1lbWJlcnMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOwogCi0JdHlwZS0+dHBfbWVtYmVycyA9IG1lbWJlcnM7CisgICAgZm9yIChpID0gayA9IDA7IGkgPCBuX21lbWJlcnM7ICsraSkgeworICAgICAgICBpZiAoZGVzYy0+ZmllbGRzW2ldLm5hbWUgPT0gUHlTdHJ1Y3RTZXF1ZW5jZV9Vbm5hbWVkRmllbGQpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgbWVtYmVyc1trXS5uYW1lID0gZGVzYy0+ZmllbGRzW2ldLm5hbWU7CisgICAgICAgIG1lbWJlcnNba10udHlwZSA9IFRfT0JKRUNUOworICAgICAgICBtZW1iZXJzW2tdLm9mZnNldCA9IG9mZnNldG9mKFB5U3RydWN0U2VxdWVuY2UsIG9iX2l0ZW0pCisgICAgICAgICAgKyBpICogc2l6ZW9mKFB5T2JqZWN0Kik7CisgICAgICAgIG1lbWJlcnNba10uZmxhZ3MgPSBSRUFET05MWTsKKyAgICAgICAgbWVtYmVyc1trXS5kb2MgPSBkZXNjLT5maWVsZHNbaV0uZG9jOworICAgICAgICBrKys7CisgICAgfQorICAgIG1lbWJlcnNba10ubmFtZSA9IE5VTEw7CiAKLQlpZiAoUHlUeXBlX1JlYWR5KHR5cGUpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0lOQ1JFRih0eXBlKTsKKyAgICB0eXBlLT50cF9tZW1iZXJzID0gbWVtYmVyczsKIAotCWRpY3QgPSB0eXBlLT50cF9kaWN0OwotI2RlZmluZSBTRVRfRElDVF9GUk9NX0lOVChrZXksIHZhbHVlKQkJCQlcCi0JZG8gewkJCQkJCQlcCi0JCVB5T2JqZWN0ICp2ID0gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIHZhbHVlKTsJXAotCQlpZiAodiAhPSBOVUxMKSB7CQkJCVwKLQkJCVB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsIGtleSwgdik7CVwKLQkJCVB5X0RFQ1JFRih2KTsJCQkJXAotCQl9CQkJCQkJXAotCX0gd2hpbGUgKDApCisgICAgaWYgKFB5VHlwZV9SZWFkeSh0eXBlKSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9JTkNSRUYodHlwZSk7CiAKLQlTRVRfRElDVF9GUk9NX0lOVCh2aXNpYmxlX2xlbmd0aF9rZXksIGRlc2MtPm5faW5fc2VxdWVuY2UpOwotCVNFVF9ESUNUX0ZST01fSU5UKHJlYWxfbGVuZ3RoX2tleSwgbl9tZW1iZXJzKTsKLQlTRVRfRElDVF9GUk9NX0lOVCh1bm5hbWVkX2ZpZWxkc19rZXksIG5fdW5uYW1lZF9tZW1iZXJzKTsKKyAgICBkaWN0ID0gdHlwZS0+dHBfZGljdDsKKyNkZWZpbmUgU0VUX0RJQ1RfRlJPTV9JTlQoa2V5LCB2YWx1ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBQeU9iamVjdCAqdiA9IFB5SW50X0Zyb21Mb25nKChsb25nKSB2YWx1ZSk7ICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKHYgIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCBrZXksIHYpOyAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgUHlfREVDUkVGKHYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSAoMCkKKworICAgIFNFVF9ESUNUX0ZST01fSU5UKHZpc2libGVfbGVuZ3RoX2tleSwgZGVzYy0+bl9pbl9zZXF1ZW5jZSk7CisgICAgU0VUX0RJQ1RfRlJPTV9JTlQocmVhbF9sZW5ndGhfa2V5LCBuX21lbWJlcnMpOworICAgIFNFVF9ESUNUX0ZST01fSU5UKHVubmFtZWRfZmllbGRzX2tleSwgbl91bm5hbWVkX21lbWJlcnMpOwogfQpkaWZmIC0tZ2l0IGEvT2JqZWN0cy90dXBsZW9iamVjdC5jIGIvT2JqZWN0cy90dXBsZW9iamVjdC5jCmluZGV4IDkyZmMxZjQuLmJiYzc4ZjQgMTAwNjQ0Ci0tLSBhL09iamVjdHMvdHVwbGVvYmplY3QuYworKysgYi9PYmplY3RzL3R1cGxlb2JqZWN0LmMKQEAgLTUsOSArNSw5IEBACiAKIC8qIFNwZWVkIG9wdGltaXphdGlvbiB0byBhdm9pZCBmcmVxdWVudCBtYWxsb2MvZnJlZSBvZiBzbWFsbCB0dXBsZXMgKi8KICNpZm5kZWYgUHlUdXBsZV9NQVhTQVZFU0laRQotI2RlZmluZSBQeVR1cGxlX01BWFNBVkVTSVpFCTIwICAvKiBMYXJnZXN0IHR1cGxlIHRvIHNhdmUgb24gZnJlZSBsaXN0ICovCisjZGVmaW5lIFB5VHVwbGVfTUFYU0FWRVNJWkUgICAgIDIwICAvKiBMYXJnZXN0IHR1cGxlIHRvIHNhdmUgb24gZnJlZSBsaXN0ICovCiAjZW5kaWYKLSNpZm5kZWYgUHlUdXBsZV9NQVhGUkVFTElTVCAKKyNpZm5kZWYgUHlUdXBsZV9NQVhGUkVFTElTVAogI2RlZmluZSBQeVR1cGxlX01BWEZSRUVMSVNUICAyMDAwICAvKiBNYXhpbXVtIG51bWJlciBvZiB0dXBsZXMgb2YgZWFjaCBzaXplIHRvIHNhdmUgKi8KICNlbmRpZgogCkBAIC0yNiwxMzIgKzI2LDEzMiBAQAogUHlPYmplY3QgKgogUHlUdXBsZV9OZXcocmVnaXN0ZXIgUHlfc3NpemVfdCBzaXplKQogewotCXJlZ2lzdGVyIFB5VHVwbGVPYmplY3QgKm9wOwotCVB5X3NzaXplX3QgaTsKLQlpZiAoc2l6ZSA8IDApIHsKLQkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICByZWdpc3RlciBQeVR1cGxlT2JqZWN0ICpvcDsKKyAgICBQeV9zc2l6ZV90IGk7CisgICAgaWYgKHNpemUgPCAwKSB7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAjaWYgUHlUdXBsZV9NQVhTQVZFU0laRSA+IDAKLQlpZiAoc2l6ZSA9PSAwICYmIGZyZWVfbGlzdFswXSkgewotCQlvcCA9IGZyZWVfbGlzdFswXTsKLQkJUHlfSU5DUkVGKG9wKTsKKyAgICBpZiAoc2l6ZSA9PSAwICYmIGZyZWVfbGlzdFswXSkgeworICAgICAgICBvcCA9IGZyZWVfbGlzdFswXTsKKyAgICAgICAgUHlfSU5DUkVGKG9wKTsKICNpZmRlZiBDT1VOVF9BTExPQ1MKLQkJdHVwbGVfemVyb19hbGxvY3MrKzsKKyAgICAgICAgdHVwbGVfemVyb19hbGxvY3MrKzsKICNlbmRpZgotCQlyZXR1cm4gKFB5T2JqZWN0ICopIG9wOwotCX0KLQlpZiAoc2l6ZSA8IFB5VHVwbGVfTUFYU0FWRVNJWkUgJiYgKG9wID0gZnJlZV9saXN0W3NpemVdKSAhPSBOVUxMKSB7Ci0JCWZyZWVfbGlzdFtzaXplXSA9IChQeVR1cGxlT2JqZWN0ICopIG9wLT5vYl9pdGVtWzBdOwotCQludW1mcmVlW3NpemVdLS07CisgICAgICAgIHJldHVybiAoUHlPYmplY3QgKikgb3A7CisgICAgfQorICAgIGlmIChzaXplIDwgUHlUdXBsZV9NQVhTQVZFU0laRSAmJiAob3AgPSBmcmVlX2xpc3Rbc2l6ZV0pICE9IE5VTEwpIHsKKyAgICAgICAgZnJlZV9saXN0W3NpemVdID0gKFB5VHVwbGVPYmplY3QgKikgb3AtPm9iX2l0ZW1bMF07CisgICAgICAgIG51bWZyZWVbc2l6ZV0tLTsKICNpZmRlZiBDT1VOVF9BTExPQ1MKLQkJZmFzdF90dXBsZV9hbGxvY3MrKzsKKyAgICAgICAgZmFzdF90dXBsZV9hbGxvY3MrKzsKICNlbmRpZgotCQkvKiBJbmxpbmUgUHlPYmplY3RfSW5pdFZhciAqLworICAgICAgICAvKiBJbmxpbmUgUHlPYmplY3RfSW5pdFZhciAqLwogI2lmZGVmIFB5X1RSQUNFX1JFRlMKLQkJUHlfU0laRShvcCkgPSBzaXplOwotCQlQeV9UWVBFKG9wKSA9ICZQeVR1cGxlX1R5cGU7CisgICAgICAgIFB5X1NJWkUob3ApID0gc2l6ZTsKKyAgICAgICAgUHlfVFlQRShvcCkgPSAmUHlUdXBsZV9UeXBlOwogI2VuZGlmCi0JCV9QeV9OZXdSZWZlcmVuY2UoKFB5T2JqZWN0ICopb3ApOwotCX0KLQllbHNlCisgICAgICAgIF9QeV9OZXdSZWZlcmVuY2UoKFB5T2JqZWN0ICopb3ApOworICAgIH0KKyAgICBlbHNlCiAjZW5kaWYKLQl7Ci0JCVB5X3NzaXplX3QgbmJ5dGVzID0gc2l6ZSAqIHNpemVvZihQeU9iamVjdCAqKTsKLQkJLyogQ2hlY2sgZm9yIG92ZXJmbG93ICovCi0JCWlmIChuYnl0ZXMgLyBzaXplb2YoUHlPYmplY3QgKikgIT0gKHNpemVfdClzaXplIHx8Ci0JCSAgICAobmJ5dGVzID4gUFlfU1NJWkVfVF9NQVggLSBzaXplb2YoUHlUdXBsZU9iamVjdCkgLSBzaXplb2YoUHlPYmplY3QgKikpKQotCQl7Ci0JCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQkJfQotCQluYnl0ZXMgKz0gc2l6ZW9mKFB5VHVwbGVPYmplY3QpIC0gc2l6ZW9mKFB5T2JqZWN0ICopOworICAgIHsKKyAgICAgICAgUHlfc3NpemVfdCBuYnl0ZXMgPSBzaXplICogc2l6ZW9mKFB5T2JqZWN0ICopOworICAgICAgICAvKiBDaGVjayBmb3Igb3ZlcmZsb3cgKi8KKyAgICAgICAgaWYgKG5ieXRlcyAvIHNpemVvZihQeU9iamVjdCAqKSAhPSAoc2l6ZV90KXNpemUgfHwKKyAgICAgICAgICAgIChuYnl0ZXMgPiBQWV9TU0laRV9UX01BWCAtIHNpemVvZihQeVR1cGxlT2JqZWN0KSAtIHNpemVvZihQeU9iamVjdCAqKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICB9CisgICAgICAgIG5ieXRlcyArPSBzaXplb2YoUHlUdXBsZU9iamVjdCkgLSBzaXplb2YoUHlPYmplY3QgKik7CiAKLQkJb3AgPSBQeU9iamVjdF9HQ19OZXdWYXIoUHlUdXBsZU9iamVjdCwgJlB5VHVwbGVfVHlwZSwgc2l6ZSk7Ci0JCWlmIChvcCA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCWZvciAoaT0wOyBpIDwgc2l6ZTsgaSsrKQotCQlvcC0+b2JfaXRlbVtpXSA9IE5VTEw7CisgICAgICAgIG9wID0gUHlPYmplY3RfR0NfTmV3VmFyKFB5VHVwbGVPYmplY3QsICZQeVR1cGxlX1R5cGUsIHNpemUpOworICAgICAgICBpZiAob3AgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBmb3IgKGk9MDsgaSA8IHNpemU7IGkrKykKKyAgICAgICAgb3AtPm9iX2l0ZW1baV0gPSBOVUxMOwogI2lmIFB5VHVwbGVfTUFYU0FWRVNJWkUgPiAwCi0JaWYgKHNpemUgPT0gMCkgewotCQlmcmVlX2xpc3RbMF0gPSBvcDsKLQkJKytudW1mcmVlWzBdOwotCQlQeV9JTkNSRUYob3ApOwkvKiBleHRyYSBJTkNSRUYgc28gdGhhdCB0aGlzIGlzIG5ldmVyIGZyZWVkICovCi0JfQorICAgIGlmIChzaXplID09IDApIHsKKyAgICAgICAgZnJlZV9saXN0WzBdID0gb3A7CisgICAgICAgICsrbnVtZnJlZVswXTsKKyAgICAgICAgUHlfSU5DUkVGKG9wKTsgICAgICAgICAgLyogZXh0cmEgSU5DUkVGIHNvIHRoYXQgdGhpcyBpcyBuZXZlciBmcmVlZCAqLworICAgIH0KICNlbmRpZgotCV9QeU9iamVjdF9HQ19UUkFDSyhvcCk7Ci0JcmV0dXJuIChQeU9iamVjdCAqKSBvcDsKKyAgICBfUHlPYmplY3RfR0NfVFJBQ0sob3ApOworICAgIHJldHVybiAoUHlPYmplY3QgKikgb3A7CiB9CiAKIFB5X3NzaXplX3QKIFB5VHVwbGVfU2l6ZShyZWdpc3RlciBQeU9iamVjdCAqb3ApCiB7Ci0JaWYgKCFQeVR1cGxlX0NoZWNrKG9wKSkgewotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIC0xOwotCX0KLQllbHNlCi0JCXJldHVybiBQeV9TSVpFKG9wKTsKKyAgICBpZiAoIVB5VHVwbGVfQ2hlY2sob3ApKSB7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIFB5X1NJWkUob3ApOwogfQogCiBQeU9iamVjdCAqCiBQeVR1cGxlX0dldEl0ZW0ocmVnaXN0ZXIgUHlPYmplY3QgKm9wLCByZWdpc3RlciBQeV9zc2l6ZV90IGkpCiB7Ci0JaWYgKCFQeVR1cGxlX0NoZWNrKG9wKSkgewotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChpIDwgMCB8fCBpID49IFB5X1NJWkUob3ApKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLCAidHVwbGUgaW5kZXggb3V0IG9mIHJhbmdlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gKChQeVR1cGxlT2JqZWN0ICopb3ApIC0+IG9iX2l0ZW1baV07CisgICAgaWYgKCFQeVR1cGxlX0NoZWNrKG9wKSkgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChpIDwgMCB8fCBpID49IFB5X1NJWkUob3ApKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLCAidHVwbGUgaW5kZXggb3V0IG9mIHJhbmdlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gKChQeVR1cGxlT2JqZWN0ICopb3ApIC0+IG9iX2l0ZW1baV07CiB9CiAKIGludAogUHlUdXBsZV9TZXRJdGVtKHJlZ2lzdGVyIFB5T2JqZWN0ICpvcCwgcmVnaXN0ZXIgUHlfc3NpemVfdCBpLCBQeU9iamVjdCAqbmV3aXRlbSkKIHsKLQlyZWdpc3RlciBQeU9iamVjdCAqb2xkaXRlbTsKLQlyZWdpc3RlciBQeU9iamVjdCAqKnA7Ci0JaWYgKCFQeVR1cGxlX0NoZWNrKG9wKSB8fCBvcC0+b2JfcmVmY250ICE9IDEpIHsKLQkJUHlfWERFQ1JFRihuZXdpdGVtKTsKLQkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKGkgPCAwIHx8IGkgPj0gUHlfU0laRShvcCkpIHsKLQkJUHlfWERFQ1JFRihuZXdpdGVtKTsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsCi0JCQkJInR1cGxlIGFzc2lnbm1lbnQgaW5kZXggb3V0IG9mIHJhbmdlIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JcCA9ICgoUHlUdXBsZU9iamVjdCAqKW9wKSAtPiBvYl9pdGVtICsgaTsKLQlvbGRpdGVtID0gKnA7Ci0JKnAgPSBuZXdpdGVtOwotCVB5X1hERUNSRUYob2xkaXRlbSk7Ci0JcmV0dXJuIDA7CisgICAgcmVnaXN0ZXIgUHlPYmplY3QgKm9sZGl0ZW07CisgICAgcmVnaXN0ZXIgUHlPYmplY3QgKipwOworICAgIGlmICghUHlUdXBsZV9DaGVjayhvcCkgfHwgb3AtPm9iX3JlZmNudCAhPSAxKSB7CisgICAgICAgIFB5X1hERUNSRUYobmV3aXRlbSk7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChpIDwgMCB8fCBpID49IFB5X1NJWkUob3ApKSB7CisgICAgICAgIFB5X1hERUNSRUYobmV3aXRlbSk7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInR1cGxlIGFzc2lnbm1lbnQgaW5kZXggb3V0IG9mIHJhbmdlIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcCA9ICgoUHlUdXBsZU9iamVjdCAqKW9wKSAtPiBvYl9pdGVtICsgaTsKKyAgICBvbGRpdGVtID0gKnA7CisgICAgKnAgPSBuZXdpdGVtOworICAgIFB5X1hERUNSRUYob2xkaXRlbSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIFB5T2JqZWN0ICoKIFB5VHVwbGVfUGFjayhQeV9zc2l6ZV90IG4sIC4uLikKIHsKLQlQeV9zc2l6ZV90IGk7Ci0JUHlPYmplY3QgKm87Ci0JUHlPYmplY3QgKnJlc3VsdDsKLQlQeU9iamVjdCAqKml0ZW1zOwotCXZhX2xpc3QgdmFyZ3M7CisgICAgUHlfc3NpemVfdCBpOworICAgIFB5T2JqZWN0ICpvOworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisgICAgUHlPYmplY3QgKippdGVtczsKKyAgICB2YV9saXN0IHZhcmdzOwogCi0JdmFfc3RhcnQodmFyZ3MsIG4pOwotCXJlc3VsdCA9IFB5VHVwbGVfTmV3KG4pOwotCWlmIChyZXN1bHQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JaXRlbXMgPSAoKFB5VHVwbGVPYmplY3QgKilyZXN1bHQpLT5vYl9pdGVtOwotCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJbyA9IHZhX2FyZyh2YXJncywgUHlPYmplY3QgKik7Ci0JCVB5X0lOQ1JFRihvKTsKLQkJaXRlbXNbaV0gPSBvOwotCX0KLQl2YV9lbmQodmFyZ3MpOwotCXJldHVybiByZXN1bHQ7CisgICAgdmFfc3RhcnQodmFyZ3MsIG4pOworICAgIHJlc3VsdCA9IFB5VHVwbGVfTmV3KG4pOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaXRlbXMgPSAoKFB5VHVwbGVPYmplY3QgKilyZXN1bHQpLT5vYl9pdGVtOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgbyA9IHZhX2FyZyh2YXJncywgUHlPYmplY3QgKik7CisgICAgICAgIFB5X0lOQ1JFRihvKTsKKyAgICAgICAgaXRlbXNbaV0gPSBvOworICAgIH0KKyAgICB2YV9lbmQodmFyZ3MpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIApAQCAtMTYwLDQzMCArMTYwLDQzMCBAQAogc3RhdGljIHZvaWQKIHR1cGxlZGVhbGxvYyhyZWdpc3RlciBQeVR1cGxlT2JqZWN0ICpvcCkKIHsKLQlyZWdpc3RlciBQeV9zc2l6ZV90IGk7Ci0JcmVnaXN0ZXIgUHlfc3NpemVfdCBsZW4gPSAgUHlfU0laRShvcCk7Ci0JUHlPYmplY3RfR0NfVW5UcmFjayhvcCk7Ci0JUHlfVFJBU0hDQU5fU0FGRV9CRUdJTihvcCkKLQlpZiAobGVuID4gMCkgewotCQlpID0gbGVuOwotCQl3aGlsZSAoLS1pID49IDApCi0JCQlQeV9YREVDUkVGKG9wLT5vYl9pdGVtW2ldKTsKKyAgICByZWdpc3RlciBQeV9zc2l6ZV90IGk7CisgICAgcmVnaXN0ZXIgUHlfc3NpemVfdCBsZW4gPSAgUHlfU0laRShvcCk7CisgICAgUHlPYmplY3RfR0NfVW5UcmFjayhvcCk7CisgICAgUHlfVFJBU0hDQU5fU0FGRV9CRUdJTihvcCkKKyAgICBpZiAobGVuID4gMCkgeworICAgICAgICBpID0gbGVuOworICAgICAgICB3aGlsZSAoLS1pID49IDApCisgICAgICAgICAgICBQeV9YREVDUkVGKG9wLT5vYl9pdGVtW2ldKTsKICNpZiBQeVR1cGxlX01BWFNBVkVTSVpFID4gMAotCQlpZiAobGVuIDwgUHlUdXBsZV9NQVhTQVZFU0laRSAmJgotCQkgICAgbnVtZnJlZVtsZW5dIDwgUHlUdXBsZV9NQVhGUkVFTElTVCAmJgotCQkgICAgUHlfVFlQRShvcCkgPT0gJlB5VHVwbGVfVHlwZSkKLQkJewotCQkJb3AtPm9iX2l0ZW1bMF0gPSAoUHlPYmplY3QgKikgZnJlZV9saXN0W2xlbl07Ci0JCQludW1mcmVlW2xlbl0rKzsKLQkJCWZyZWVfbGlzdFtsZW5dID0gb3A7Ci0JCQlnb3RvIGRvbmU7IC8qIHJldHVybiAqLwotCQl9CisgICAgICAgIGlmIChsZW4gPCBQeVR1cGxlX01BWFNBVkVTSVpFICYmCisgICAgICAgICAgICBudW1mcmVlW2xlbl0gPCBQeVR1cGxlX01BWEZSRUVMSVNUICYmCisgICAgICAgICAgICBQeV9UWVBFKG9wKSA9PSAmUHlUdXBsZV9UeXBlKQorICAgICAgICB7CisgICAgICAgICAgICBvcC0+b2JfaXRlbVswXSA9IChQeU9iamVjdCAqKSBmcmVlX2xpc3RbbGVuXTsKKyAgICAgICAgICAgIG51bWZyZWVbbGVuXSsrOworICAgICAgICAgICAgZnJlZV9saXN0W2xlbl0gPSBvcDsKKyAgICAgICAgICAgIGdvdG8gZG9uZTsgLyogcmV0dXJuICovCisgICAgICAgIH0KICNlbmRpZgotCX0KLQlQeV9UWVBFKG9wKS0+dHBfZnJlZSgoUHlPYmplY3QgKilvcCk7CisgICAgfQorICAgIFB5X1RZUEUob3ApLT50cF9mcmVlKChQeU9iamVjdCAqKW9wKTsKIGRvbmU6Ci0JUHlfVFJBU0hDQU5fU0FGRV9FTkQob3ApCisgICAgUHlfVFJBU0hDQU5fU0FGRV9FTkQob3ApCiB9CiAKIHN0YXRpYyBpbnQKIHR1cGxlcHJpbnQoUHlUdXBsZU9iamVjdCAqb3AsIEZJTEUgKmZwLCBpbnQgZmxhZ3MpCiB7Ci0JUHlfc3NpemVfdCBpOwotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlmcHJpbnRmKGZwLCAiKCIpOwotCVB5X0VORF9BTExPV19USFJFQURTCi0JZm9yIChpID0gMDsgaSA8IFB5X1NJWkUob3ApOyBpKyspIHsKLQkJaWYgKGkgPiAwKSB7Ci0JCQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JCQlmcHJpbnRmKGZwLCAiLCAiKTsKLQkJCVB5X0VORF9BTExPV19USFJFQURTCi0JCX0KLQkJaWYgKFB5T2JqZWN0X1ByaW50KG9wLT5vYl9pdGVtW2ldLCBmcCwgMCkgIT0gMCkKLQkJCXJldHVybiAtMTsKLQl9Ci0JaSA9IFB5X1NJWkUob3ApOwotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlpZiAoaSA9PSAxKQotCQlmcHJpbnRmKGZwLCAiLCIpOwotCWZwcmludGYoZnAsICIpIik7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQlyZXR1cm4gMDsKKyAgICBQeV9zc2l6ZV90IGk7CisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIGZwcmludGYoZnAsICIoIik7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBmb3IgKGkgPSAwOyBpIDwgUHlfU0laRShvcCk7IGkrKykgeworICAgICAgICBpZiAoaSA+IDApIHsKKyAgICAgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgICAgIGZwcmludGYoZnAsICIsICIpOworICAgICAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgfQorICAgICAgICBpZiAoUHlPYmplY3RfUHJpbnQob3AtPm9iX2l0ZW1baV0sIGZwLCAwKSAhPSAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpID0gUHlfU0laRShvcCk7CisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIGlmIChpID09IDEpCisgICAgICAgIGZwcmludGYoZnAsICIsIik7CisgICAgZnByaW50ZihmcCwgIikiKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogdHVwbGVyZXByKFB5VHVwbGVPYmplY3QgKnYpCiB7Ci0JUHlfc3NpemVfdCBpLCBuOwotCVB5T2JqZWN0ICpzLCAqdGVtcDsKLQlQeU9iamVjdCAqcGllY2VzLCAqcmVzdWx0ID0gTlVMTDsKKyAgICBQeV9zc2l6ZV90IGksIG47CisgICAgUHlPYmplY3QgKnMsICp0ZW1wOworICAgIFB5T2JqZWN0ICpwaWVjZXMsICpyZXN1bHQgPSBOVUxMOwogCi0JbiA9IFB5X1NJWkUodik7Ci0JaWYgKG4gPT0gMCkKLQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoIigpIik7CisgICAgbiA9IFB5X1NJWkUodik7CisgICAgaWYgKG4gPT0gMCkKKyAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoIigpIik7CiAKLQkvKiBXaGlsZSBub3QgbXV0YWJsZSwgaXQgaXMgc3RpbGwgcG9zc2libGUgdG8gZW5kIHVwIHdpdGggYSBjeWNsZSBpbiBhCi0JICAgdHVwbGUgdGhyb3VnaCBhbiBvYmplY3QgdGhhdCBzdG9yZXMgaXRzZWxmIHdpdGhpbiBhIHR1cGxlIChhbmQgdGh1cwotCSAgIGluZmluaXRlbHkgYXNrcyBmb3IgdGhlIHJlcHIgb2YgaXRzZWxmKS4gVGhpcyBzaG91bGQgb25seSBiZQotCSAgIHBvc3NpYmxlIHdpdGhpbiBhIHR5cGUuICovCi0JaSA9IFB5X1JlcHJFbnRlcigoUHlPYmplY3QgKil2KTsKLQlpZiAoaSAhPSAwKSB7Ci0JCXJldHVybiBpID4gMCA/IFB5U3RyaW5nX0Zyb21TdHJpbmcoIiguLi4pIikgOiBOVUxMOwotCX0KKyAgICAvKiBXaGlsZSBub3QgbXV0YWJsZSwgaXQgaXMgc3RpbGwgcG9zc2libGUgdG8gZW5kIHVwIHdpdGggYSBjeWNsZSBpbiBhCisgICAgICAgdHVwbGUgdGhyb3VnaCBhbiBvYmplY3QgdGhhdCBzdG9yZXMgaXRzZWxmIHdpdGhpbiBhIHR1cGxlIChhbmQgdGh1cworICAgICAgIGluZmluaXRlbHkgYXNrcyBmb3IgdGhlIHJlcHIgb2YgaXRzZWxmKS4gVGhpcyBzaG91bGQgb25seSBiZQorICAgICAgIHBvc3NpYmxlIHdpdGhpbiBhIHR5cGUuICovCisgICAgaSA9IFB5X1JlcHJFbnRlcigoUHlPYmplY3QgKil2KTsKKyAgICBpZiAoaSAhPSAwKSB7CisgICAgICAgIHJldHVybiBpID4gMCA/IFB5U3RyaW5nX0Zyb21TdHJpbmcoIiguLi4pIikgOiBOVUxMOworICAgIH0KIAotCXBpZWNlcyA9IFB5VHVwbGVfTmV3KG4pOwotCWlmIChwaWVjZXMgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgcGllY2VzID0gUHlUdXBsZV9OZXcobik7CisgICAgaWYgKHBpZWNlcyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCS8qIERvIHJlcHIoKSBvbiBlYWNoIGVsZW1lbnQuICovCi0JZm9yIChpID0gMDsgaSA8IG47ICsraSkgewotCQlpZiAoUHlfRW50ZXJSZWN1cnNpdmVDYWxsKCIgd2hpbGUgZ2V0dGluZyB0aGUgcmVwciBvZiBhIHR1cGxlIikpCi0JCQlnb3RvIERvbmU7Ci0JCXMgPSBQeU9iamVjdF9SZXByKHYtPm9iX2l0ZW1baV0pOwotCQlQeV9MZWF2ZVJlY3Vyc2l2ZUNhbGwoKTsKLQkJaWYgKHMgPT0gTlVMTCkKLQkJCWdvdG8gRG9uZTsKLQkJUHlUdXBsZV9TRVRfSVRFTShwaWVjZXMsIGksIHMpOwotCX0KKyAgICAvKiBEbyByZXByKCkgb24gZWFjaCBlbGVtZW50LiAqLworICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKKyAgICAgICAgaWYgKFB5X0VudGVyUmVjdXJzaXZlQ2FsbCgiIHdoaWxlIGdldHRpbmcgdGhlIHJlcHIgb2YgYSB0dXBsZSIpKQorICAgICAgICAgICAgZ290byBEb25lOworICAgICAgICBzID0gUHlPYmplY3RfUmVwcih2LT5vYl9pdGVtW2ldKTsKKyAgICAgICAgUHlfTGVhdmVSZWN1cnNpdmVDYWxsKCk7CisgICAgICAgIGlmIChzID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIERvbmU7CisgICAgICAgIFB5VHVwbGVfU0VUX0lURU0ocGllY2VzLCBpLCBzKTsKKyAgICB9CiAKLQkvKiBBZGQgIigpIiBkZWNvcmF0aW9ucyB0byB0aGUgZmlyc3QgYW5kIGxhc3QgaXRlbXMuICovCi0JYXNzZXJ0KG4gPiAwKTsKLQlzID0gUHlTdHJpbmdfRnJvbVN0cmluZygiKCIpOwotCWlmIChzID09IE5VTEwpCi0JCWdvdG8gRG9uZTsKLQl0ZW1wID0gUHlUdXBsZV9HRVRfSVRFTShwaWVjZXMsIDApOwotCVB5U3RyaW5nX0NvbmNhdEFuZERlbCgmcywgdGVtcCk7Ci0JUHlUdXBsZV9TRVRfSVRFTShwaWVjZXMsIDAsIHMpOwotCWlmIChzID09IE5VTEwpCi0JCWdvdG8gRG9uZTsKKyAgICAvKiBBZGQgIigpIiBkZWNvcmF0aW9ucyB0byB0aGUgZmlyc3QgYW5kIGxhc3QgaXRlbXMuICovCisgICAgYXNzZXJ0KG4gPiAwKTsKKyAgICBzID0gUHlTdHJpbmdfRnJvbVN0cmluZygiKCIpOworICAgIGlmIChzID09IE5VTEwpCisgICAgICAgIGdvdG8gRG9uZTsKKyAgICB0ZW1wID0gUHlUdXBsZV9HRVRfSVRFTShwaWVjZXMsIDApOworICAgIFB5U3RyaW5nX0NvbmNhdEFuZERlbCgmcywgdGVtcCk7CisgICAgUHlUdXBsZV9TRVRfSVRFTShwaWVjZXMsIDAsIHMpOworICAgIGlmIChzID09IE5VTEwpCisgICAgICAgIGdvdG8gRG9uZTsKIAotCXMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKG4gPT0gMSA/ICIsKSIgOiAiKSIpOwotCWlmIChzID09IE5VTEwpCi0JCWdvdG8gRG9uZTsKLQl0ZW1wID0gUHlUdXBsZV9HRVRfSVRFTShwaWVjZXMsIG4tMSk7Ci0JUHlTdHJpbmdfQ29uY2F0QW5kRGVsKCZ0ZW1wLCBzKTsKLQlQeVR1cGxlX1NFVF9JVEVNKHBpZWNlcywgbi0xLCB0ZW1wKTsKLQlpZiAodGVtcCA9PSBOVUxMKQotCQlnb3RvIERvbmU7CisgICAgcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmcobiA9PSAxID8gIiwpIiA6ICIpIik7CisgICAgaWYgKHMgPT0gTlVMTCkKKyAgICAgICAgZ290byBEb25lOworICAgIHRlbXAgPSBQeVR1cGxlX0dFVF9JVEVNKHBpZWNlcywgbi0xKTsKKyAgICBQeVN0cmluZ19Db25jYXRBbmREZWwoJnRlbXAsIHMpOworICAgIFB5VHVwbGVfU0VUX0lURU0ocGllY2VzLCBuLTEsIHRlbXApOworICAgIGlmICh0ZW1wID09IE5VTEwpCisgICAgICAgIGdvdG8gRG9uZTsKIAotCS8qIFBhc3RlIHRoZW0gYWxsIHRvZ2V0aGVyIHdpdGggIiwgIiBiZXR3ZWVuLiAqLwotCXMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCIsICIpOwotCWlmIChzID09IE5VTEwpCi0JCWdvdG8gRG9uZTsKLQlyZXN1bHQgPSBfUHlTdHJpbmdfSm9pbihzLCBwaWVjZXMpOwotCVB5X0RFQ1JFRihzKTsJCisgICAgLyogUGFzdGUgdGhlbSBhbGwgdG9nZXRoZXIgd2l0aCAiLCAiIGJldHdlZW4uICovCisgICAgcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIiwgIik7CisgICAgaWYgKHMgPT0gTlVMTCkKKyAgICAgICAgZ290byBEb25lOworICAgIHJlc3VsdCA9IF9QeVN0cmluZ19Kb2luKHMsIHBpZWNlcyk7CisgICAgUHlfREVDUkVGKHMpOwogCiBEb25lOgotCVB5X0RFQ1JFRihwaWVjZXMpOwotCVB5X1JlcHJMZWF2ZSgoUHlPYmplY3QgKil2KTsKLQlyZXR1cm4gcmVzdWx0OworICAgIFB5X0RFQ1JFRihwaWVjZXMpOworICAgIFB5X1JlcHJMZWF2ZSgoUHlPYmplY3QgKil2KTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCi0vKiBUaGUgYWRkZW5kIDgyNTIwLCB3YXMgc2VsZWN0ZWQgZnJvbSB0aGUgcmFuZ2UoMCwgMTAwMDAwMCkgZm9yIAotICAgZ2VuZXJhdGluZyB0aGUgZ3JlYXRlc3QgbnVtYmVyIG9mIHByaW1lIG11bHRpcGxpZXJzIGZvciB0dXBsZXMgCisvKiBUaGUgYWRkZW5kIDgyNTIwLCB3YXMgc2VsZWN0ZWQgZnJvbSB0aGUgcmFuZ2UoMCwgMTAwMDAwMCkgZm9yCisgICBnZW5lcmF0aW5nIHRoZSBncmVhdGVzdCBudW1iZXIgb2YgcHJpbWUgbXVsdGlwbGllcnMgZm9yIHR1cGxlcwogICAgdXB0byBsZW5ndGggZWlnaHQ6CiAKLSAgICAgMTA4MjUyNywgMTE2NTA0OSwgMTA4MjUzMSwgMTE2NTA1NywgMTI0NzU4MSwgMTMzMDEwMywgMTA4MjUzMywgCisgICAgIDEwODI1MjcsIDExNjUwNDksIDEwODI1MzEsIDExNjUwNTcsIDEyNDc1ODEsIDEzMzAxMDMsIDEwODI1MzMsCiAgICAgIDEzMzAxMTEsIDE0MTI2MzMsIDExNjUwNjksIDEyNDc1OTksIDE0OTUxNzcsIDE1Nzc2OTkKICovCiAKIHN0YXRpYyBsb25nCiB0dXBsZWhhc2goUHlUdXBsZU9iamVjdCAqdikKIHsKLQlyZWdpc3RlciBsb25nIHgsIHk7Ci0JcmVnaXN0ZXIgUHlfc3NpemVfdCBsZW4gPSBQeV9TSVpFKHYpOwotCXJlZ2lzdGVyIFB5T2JqZWN0ICoqcDsKLQlsb25nIG11bHQgPSAxMDAwMDAzTDsKLQl4ID0gMHgzNDU2NzhMOwotCXAgPSB2LT5vYl9pdGVtOwotCXdoaWxlICgtLWxlbiA+PSAwKSB7Ci0JCXkgPSBQeU9iamVjdF9IYXNoKCpwKyspOwotCQlpZiAoeSA9PSAtMSkKLQkJCXJldHVybiAtMTsKLQkJeCA9ICh4IF4geSkgKiBtdWx0OwotCQkvKiB0aGUgY2FzdCBtaWdodCB0cnVuY2F0ZSBsZW47IHRoYXQgZG9lc24ndCBjaGFuZ2UgaGFzaCBzdGFiaWxpdHkgKi8KLQkJbXVsdCArPSAobG9uZykoODI1MjBMICsgbGVuICsgbGVuKTsKLQl9Ci0JeCArPSA5NzUzMUw7Ci0JaWYgKHggPT0gLTEpCi0JCXggPSAtMjsKLQlyZXR1cm4geDsKKyAgICByZWdpc3RlciBsb25nIHgsIHk7CisgICAgcmVnaXN0ZXIgUHlfc3NpemVfdCBsZW4gPSBQeV9TSVpFKHYpOworICAgIHJlZ2lzdGVyIFB5T2JqZWN0ICoqcDsKKyAgICBsb25nIG11bHQgPSAxMDAwMDAzTDsKKyAgICB4ID0gMHgzNDU2NzhMOworICAgIHAgPSB2LT5vYl9pdGVtOworICAgIHdoaWxlICgtLWxlbiA+PSAwKSB7CisgICAgICAgIHkgPSBQeU9iamVjdF9IYXNoKCpwKyspOworICAgICAgICBpZiAoeSA9PSAtMSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgeCA9ICh4IF4geSkgKiBtdWx0OworICAgICAgICAvKiB0aGUgY2FzdCBtaWdodCB0cnVuY2F0ZSBsZW47IHRoYXQgZG9lc24ndCBjaGFuZ2UgaGFzaCBzdGFiaWxpdHkgKi8KKyAgICAgICAgbXVsdCArPSAobG9uZykoODI1MjBMICsgbGVuICsgbGVuKTsKKyAgICB9CisgICAgeCArPSA5NzUzMUw7CisgICAgaWYgKHggPT0gLTEpCisgICAgICAgIHggPSAtMjsKKyAgICByZXR1cm4geDsKIH0KIAogc3RhdGljIFB5X3NzaXplX3QKIHR1cGxlbGVuZ3RoKFB5VHVwbGVPYmplY3QgKmEpCiB7Ci0JcmV0dXJuIFB5X1NJWkUoYSk7CisgICAgcmV0dXJuIFB5X1NJWkUoYSk7CiB9CiAKIHN0YXRpYyBpbnQKIHR1cGxlY29udGFpbnMoUHlUdXBsZU9iamVjdCAqYSwgUHlPYmplY3QgKmVsKQogewotCVB5X3NzaXplX3QgaTsKLQlpbnQgY21wOworICAgIFB5X3NzaXplX3QgaTsKKyAgICBpbnQgY21wOwogCi0JZm9yIChpID0gMCwgY21wID0gMCA7IGNtcCA9PSAwICYmIGkgPCBQeV9TSVpFKGEpOyArK2kpCi0JCWNtcCA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChlbCwgUHlUdXBsZV9HRVRfSVRFTShhLCBpKSwKLQkJCQkJCSAgIFB5X0VRKTsKLQlyZXR1cm4gY21wOworICAgIGZvciAoaSA9IDAsIGNtcCA9IDAgOyBjbXAgPT0gMCAmJiBpIDwgUHlfU0laRShhKTsgKytpKQorICAgICAgICBjbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woZWwsIFB5VHVwbGVfR0VUX0lURU0oYSwgaSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfRVEpOworICAgIHJldHVybiBjbXA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB0dXBsZWl0ZW0ocmVnaXN0ZXIgUHlUdXBsZU9iamVjdCAqYSwgcmVnaXN0ZXIgUHlfc3NpemVfdCBpKQogewotCWlmIChpIDwgMCB8fCBpID49IFB5X1NJWkUoYSkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsICJ0dXBsZSBpbmRleCBvdXQgb2YgcmFuZ2UiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5X0lOQ1JFRihhLT5vYl9pdGVtW2ldKTsKLQlyZXR1cm4gYS0+b2JfaXRlbVtpXTsKKyAgICBpZiAoaSA8IDAgfHwgaSA+PSBQeV9TSVpFKGEpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLCAidHVwbGUgaW5kZXggb3V0IG9mIHJhbmdlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeV9JTkNSRUYoYS0+b2JfaXRlbVtpXSk7CisgICAgcmV0dXJuIGEtPm9iX2l0ZW1baV07CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCi10dXBsZXNsaWNlKHJlZ2lzdGVyIFB5VHVwbGVPYmplY3QgKmEsIHJlZ2lzdGVyIFB5X3NzaXplX3QgaWxvdywgCi0JICAgcmVnaXN0ZXIgUHlfc3NpemVfdCBpaGlnaCkKK3R1cGxlc2xpY2UocmVnaXN0ZXIgUHlUdXBsZU9iamVjdCAqYSwgcmVnaXN0ZXIgUHlfc3NpemVfdCBpbG93LAorICAgICAgICAgICByZWdpc3RlciBQeV9zc2l6ZV90IGloaWdoKQogewotCXJlZ2lzdGVyIFB5VHVwbGVPYmplY3QgKm5wOwotCVB5T2JqZWN0ICoqc3JjLCAqKmRlc3Q7Ci0JcmVnaXN0ZXIgUHlfc3NpemVfdCBpOwotCVB5X3NzaXplX3QgbGVuOwotCWlmIChpbG93IDwgMCkKLQkJaWxvdyA9IDA7Ci0JaWYgKGloaWdoID4gUHlfU0laRShhKSkKLQkJaWhpZ2ggPSBQeV9TSVpFKGEpOwotCWlmIChpaGlnaCA8IGlsb3cpCi0JCWloaWdoID0gaWxvdzsKLQlpZiAoaWxvdyA9PSAwICYmIGloaWdoID09IFB5X1NJWkUoYSkgJiYgUHlUdXBsZV9DaGVja0V4YWN0KGEpKSB7Ci0JCVB5X0lOQ1JFRihhKTsKLQkJcmV0dXJuIChQeU9iamVjdCAqKWE7Ci0JfQotCWxlbiA9IGloaWdoIC0gaWxvdzsKLQlucCA9IChQeVR1cGxlT2JqZWN0ICopUHlUdXBsZV9OZXcobGVuKTsKLQlpZiAobnAgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0Jc3JjID0gYS0+b2JfaXRlbSArIGlsb3c7Ci0JZGVzdCA9IG5wLT5vYl9pdGVtOwotCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQlQeU9iamVjdCAqdiA9IHNyY1tpXTsKLQkJUHlfSU5DUkVGKHYpOwotCQlkZXN0W2ldID0gdjsKLQl9Ci0JcmV0dXJuIChQeU9iamVjdCAqKW5wOworICAgIHJlZ2lzdGVyIFB5VHVwbGVPYmplY3QgKm5wOworICAgIFB5T2JqZWN0ICoqc3JjLCAqKmRlc3Q7CisgICAgcmVnaXN0ZXIgUHlfc3NpemVfdCBpOworICAgIFB5X3NzaXplX3QgbGVuOworICAgIGlmIChpbG93IDwgMCkKKyAgICAgICAgaWxvdyA9IDA7CisgICAgaWYgKGloaWdoID4gUHlfU0laRShhKSkKKyAgICAgICAgaWhpZ2ggPSBQeV9TSVpFKGEpOworICAgIGlmIChpaGlnaCA8IGlsb3cpCisgICAgICAgIGloaWdoID0gaWxvdzsKKyAgICBpZiAoaWxvdyA9PSAwICYmIGloaWdoID09IFB5X1NJWkUoYSkgJiYgUHlUdXBsZV9DaGVja0V4YWN0KGEpKSB7CisgICAgICAgIFB5X0lOQ1JFRihhKTsKKyAgICAgICAgcmV0dXJuIChQeU9iamVjdCAqKWE7CisgICAgfQorICAgIGxlbiA9IGloaWdoIC0gaWxvdzsKKyAgICBucCA9IChQeVR1cGxlT2JqZWN0ICopUHlUdXBsZV9OZXcobGVuKTsKKyAgICBpZiAobnAgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgc3JjID0gYS0+b2JfaXRlbSArIGlsb3c7CisgICAgZGVzdCA9IG5wLT5vYl9pdGVtOworICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICBQeU9iamVjdCAqdiA9IHNyY1tpXTsKKyAgICAgICAgUHlfSU5DUkVGKHYpOworICAgICAgICBkZXN0W2ldID0gdjsKKyAgICB9CisgICAgcmV0dXJuIChQeU9iamVjdCAqKW5wOwogfQogCiBQeU9iamVjdCAqCiBQeVR1cGxlX0dldFNsaWNlKFB5T2JqZWN0ICpvcCwgUHlfc3NpemVfdCBpLCBQeV9zc2l6ZV90IGopCiB7Ci0JaWYgKG9wID09IE5VTEwgfHwgIVB5VHVwbGVfQ2hlY2sob3ApKSB7Ci0JCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIHR1cGxlc2xpY2UoKFB5VHVwbGVPYmplY3QgKilvcCwgaSwgaik7CisgICAgaWYgKG9wID09IE5VTEwgfHwgIVB5VHVwbGVfQ2hlY2sob3ApKSB7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIHR1cGxlc2xpY2UoKFB5VHVwbGVPYmplY3QgKilvcCwgaSwgaik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB0dXBsZWNvbmNhdChyZWdpc3RlciBQeVR1cGxlT2JqZWN0ICphLCByZWdpc3RlciBQeU9iamVjdCAqYmIpCiB7Ci0JcmVnaXN0ZXIgUHlfc3NpemVfdCBzaXplOwotCXJlZ2lzdGVyIFB5X3NzaXplX3QgaTsKLQlQeU9iamVjdCAqKnNyYywgKipkZXN0OwotCVB5VHVwbGVPYmplY3QgKm5wOwotCWlmICghUHlUdXBsZV9DaGVjayhiYikpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLSAgICAgICAJCSAgICAgImNhbiBvbmx5IGNvbmNhdGVuYXRlIHR1cGxlIChub3QgXCIlLjIwMHNcIikgdG8gdHVwbGUiLAotCQkJICAgICBQeV9UWVBFKGJiKS0+dHBfbmFtZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICByZWdpc3RlciBQeV9zc2l6ZV90IHNpemU7CisgICAgcmVnaXN0ZXIgUHlfc3NpemVfdCBpOworICAgIFB5T2JqZWN0ICoqc3JjLCAqKmRlc3Q7CisgICAgUHlUdXBsZU9iamVjdCAqbnA7CisgICAgaWYgKCFQeVR1cGxlX0NoZWNrKGJiKSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICJjYW4gb25seSBjb25jYXRlbmF0ZSB0dXBsZSAobm90IFwiJS4yMDBzXCIpIHRvIHR1cGxlIiwKKyAgICAgICAgICAgICAgICAgUHlfVFlQRShiYiktPnRwX25hbWUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAjZGVmaW5lIGIgKChQeVR1cGxlT2JqZWN0ICopYmIpCi0Jc2l6ZSA9IFB5X1NJWkUoYSkgKyBQeV9TSVpFKGIpOwotCWlmIChzaXplIDwgMCkKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JbnAgPSAoUHlUdXBsZU9iamVjdCAqKSBQeVR1cGxlX05ldyhzaXplKTsKLQlpZiAobnAgPT0gTlVMTCkgewotCQlyZXR1cm4gTlVMTDsKLQl9Ci0Jc3JjID0gYS0+b2JfaXRlbTsKLQlkZXN0ID0gbnAtPm9iX2l0ZW07Ci0JZm9yIChpID0gMDsgaSA8IFB5X1NJWkUoYSk7IGkrKykgewotCQlQeU9iamVjdCAqdiA9IHNyY1tpXTsKLQkJUHlfSU5DUkVGKHYpOwotCQlkZXN0W2ldID0gdjsKLQl9Ci0Jc3JjID0gYi0+b2JfaXRlbTsKLQlkZXN0ID0gbnAtPm9iX2l0ZW0gKyBQeV9TSVpFKGEpOwotCWZvciAoaSA9IDA7IGkgPCBQeV9TSVpFKGIpOyBpKyspIHsKLQkJUHlPYmplY3QgKnYgPSBzcmNbaV07Ci0JCVB5X0lOQ1JFRih2KTsKLQkJZGVzdFtpXSA9IHY7Ci0JfQotCXJldHVybiAoUHlPYmplY3QgKilucDsKKyAgICBzaXplID0gUHlfU0laRShhKSArIFB5X1NJWkUoYik7CisgICAgaWYgKHNpemUgPCAwKQorICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICBucCA9IChQeVR1cGxlT2JqZWN0ICopIFB5VHVwbGVfTmV3KHNpemUpOworICAgIGlmIChucCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBzcmMgPSBhLT5vYl9pdGVtOworICAgIGRlc3QgPSBucC0+b2JfaXRlbTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgUHlfU0laRShhKTsgaSsrKSB7CisgICAgICAgIFB5T2JqZWN0ICp2ID0gc3JjW2ldOworICAgICAgICBQeV9JTkNSRUYodik7CisgICAgICAgIGRlc3RbaV0gPSB2OworICAgIH0KKyAgICBzcmMgPSBiLT5vYl9pdGVtOworICAgIGRlc3QgPSBucC0+b2JfaXRlbSArIFB5X1NJWkUoYSk7CisgICAgZm9yIChpID0gMDsgaSA8IFB5X1NJWkUoYik7IGkrKykgeworICAgICAgICBQeU9iamVjdCAqdiA9IHNyY1tpXTsKKyAgICAgICAgUHlfSU5DUkVGKHYpOworICAgICAgICBkZXN0W2ldID0gdjsKKyAgICB9CisgICAgcmV0dXJuIChQeU9iamVjdCAqKW5wOwogI3VuZGVmIGIKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHR1cGxlcmVwZWF0KFB5VHVwbGVPYmplY3QgKmEsIFB5X3NzaXplX3QgbikKIHsKLQlQeV9zc2l6ZV90IGksIGo7Ci0JUHlfc3NpemVfdCBzaXplOwotCVB5VHVwbGVPYmplY3QgKm5wOwotCVB5T2JqZWN0ICoqcCwgKippdGVtczsKLQlpZiAobiA8IDApCi0JCW4gPSAwOwotCWlmIChQeV9TSVpFKGEpID09IDAgfHwgbiA9PSAxKSB7Ci0JCWlmIChQeVR1cGxlX0NoZWNrRXhhY3QoYSkpIHsKLQkJCS8qIFNpbmNlIHR1cGxlcyBhcmUgaW1tdXRhYmxlLCB3ZSBjYW4gcmV0dXJuIGEgc2hhcmVkCi0JCQkgICBjb3B5IGluIHRoaXMgY2FzZSAqLwotCQkJUHlfSU5DUkVGKGEpOwotCQkJcmV0dXJuIChQeU9iamVjdCAqKWE7Ci0JCX0KLQkJaWYgKFB5X1NJWkUoYSkgPT0gMCkKLQkJCXJldHVybiBQeVR1cGxlX05ldygwKTsKLQl9Ci0Jc2l6ZSA9IFB5X1NJWkUoYSkgKiBuOwotCWlmIChzaXplL1B5X1NJWkUoYSkgIT0gbikKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JbnAgPSAoUHlUdXBsZU9iamVjdCAqKSBQeVR1cGxlX05ldyhzaXplKTsKLQlpZiAobnAgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JcCA9IG5wLT5vYl9pdGVtOwotCWl0ZW1zID0gYS0+b2JfaXRlbTsKLQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCWZvciAoaiA9IDA7IGogPCBQeV9TSVpFKGEpOyBqKyspIHsKLQkJCSpwID0gaXRlbXNbal07Ci0JCQlQeV9JTkNSRUYoKnApOwotCQkJcCsrOwotCQl9Ci0JfQotCXJldHVybiAoUHlPYmplY3QgKikgbnA7CisgICAgUHlfc3NpemVfdCBpLCBqOworICAgIFB5X3NzaXplX3Qgc2l6ZTsKKyAgICBQeVR1cGxlT2JqZWN0ICpucDsKKyAgICBQeU9iamVjdCAqKnAsICoqaXRlbXM7CisgICAgaWYgKG4gPCAwKQorICAgICAgICBuID0gMDsKKyAgICBpZiAoUHlfU0laRShhKSA9PSAwIHx8IG4gPT0gMSkgeworICAgICAgICBpZiAoUHlUdXBsZV9DaGVja0V4YWN0KGEpKSB7CisgICAgICAgICAgICAvKiBTaW5jZSB0dXBsZXMgYXJlIGltbXV0YWJsZSwgd2UgY2FuIHJldHVybiBhIHNoYXJlZAorICAgICAgICAgICAgICAgY29weSBpbiB0aGlzIGNhc2UgKi8KKyAgICAgICAgICAgIFB5X0lOQ1JFRihhKTsKKyAgICAgICAgICAgIHJldHVybiAoUHlPYmplY3QgKilhOworICAgICAgICB9CisgICAgICAgIGlmIChQeV9TSVpFKGEpID09IDApCisgICAgICAgICAgICByZXR1cm4gUHlUdXBsZV9OZXcoMCk7CisgICAgfQorICAgIHNpemUgPSBQeV9TSVpFKGEpICogbjsKKyAgICBpZiAoc2l6ZS9QeV9TSVpFKGEpICE9IG4pCisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIG5wID0gKFB5VHVwbGVPYmplY3QgKikgUHlUdXBsZV9OZXcoc2l6ZSk7CisgICAgaWYgKG5wID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHAgPSBucC0+b2JfaXRlbTsKKyAgICBpdGVtcyA9IGEtPm9iX2l0ZW07CisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgUHlfU0laRShhKTsgaisrKSB7CisgICAgICAgICAgICAqcCA9IGl0ZW1zW2pdOworICAgICAgICAgICAgUHlfSU5DUkVGKCpwKTsKKyAgICAgICAgICAgIHArKzsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gKFB5T2JqZWN0ICopIG5wOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogdHVwbGVpbmRleChQeVR1cGxlT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeV9zc2l6ZV90IGksIHN0YXJ0PTAsIHN0b3A9UHlfU0laRShzZWxmKTsKLQlQeU9iamVjdCAqdjsKKyAgICBQeV9zc2l6ZV90IGksIHN0YXJ0PTAsIHN0b3A9UHlfU0laRShzZWxmKTsKKyAgICBQeU9iamVjdCAqdjsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3xPJk8mOmluZGV4IiwgJnYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9QeUV2YWxfU2xpY2VJbmRleCwgJnN0YXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUHlFdmFsX1NsaWNlSW5kZXgsICZzdG9wKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKHN0YXJ0IDwgMCkgewotCQlzdGFydCArPSBQeV9TSVpFKHNlbGYpOwotCQlpZiAoc3RhcnQgPCAwKQotCQkJc3RhcnQgPSAwOwotCX0KLQlpZiAoc3RvcCA8IDApIHsKLQkJc3RvcCArPSBQeV9TSVpFKHNlbGYpOwotCQlpZiAoc3RvcCA8IDApCi0JCQlzdG9wID0gMDsKLQl9Ci0JZm9yIChpID0gc3RhcnQ7IGkgPCBzdG9wICYmIGkgPCBQeV9TSVpFKHNlbGYpOyBpKyspIHsKLQkJaW50IGNtcCA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChzZWxmLT5vYl9pdGVtW2ldLCB2LCBQeV9FUSk7Ci0JCWlmIChjbXAgPiAwKQotCQkJcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KGkpOwotCQllbHNlIGlmIChjbXAgPCAwKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAidHVwbGUuaW5kZXgoeCk6IHggbm90IGluIGxpc3QiKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98TyZPJjppbmRleCIsICZ2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUHlFdmFsX1NsaWNlSW5kZXgsICZzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1B5RXZhbF9TbGljZUluZGV4LCAmc3RvcCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChzdGFydCA8IDApIHsKKyAgICAgICAgc3RhcnQgKz0gUHlfU0laRShzZWxmKTsKKyAgICAgICAgaWYgKHN0YXJ0IDwgMCkKKyAgICAgICAgICAgIHN0YXJ0ID0gMDsKKyAgICB9CisgICAgaWYgKHN0b3AgPCAwKSB7CisgICAgICAgIHN0b3AgKz0gUHlfU0laRShzZWxmKTsKKyAgICAgICAgaWYgKHN0b3AgPCAwKQorICAgICAgICAgICAgc3RvcCA9IDA7CisgICAgfQorICAgIGZvciAoaSA9IHN0YXJ0OyBpIDwgc3RvcCAmJiBpIDwgUHlfU0laRShzZWxmKTsgaSsrKSB7CisgICAgICAgIGludCBjbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woc2VsZi0+b2JfaXRlbVtpXSwgdiwgUHlfRVEpOworICAgICAgICBpZiAoY21wID4gMCkKKyAgICAgICAgICAgIHJldHVybiBQeUludF9Gcm9tU3NpemVfdChpKTsKKyAgICAgICAgZWxzZSBpZiAoY21wIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgInR1cGxlLmluZGV4KHgpOiB4IG5vdCBpbiBsaXN0Iik7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB0dXBsZWNvdW50KFB5VHVwbGVPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp2KQogewotCVB5X3NzaXplX3QgY291bnQgPSAwOwotCVB5X3NzaXplX3QgaTsKKyAgICBQeV9zc2l6ZV90IGNvdW50ID0gMDsKKyAgICBQeV9zc2l6ZV90IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgUHlfU0laRShzZWxmKTsgaSsrKSB7Ci0JCWludCBjbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woc2VsZi0+b2JfaXRlbVtpXSwgdiwgUHlfRVEpOwotCQlpZiAoY21wID4gMCkKLQkJCWNvdW50Kys7Ci0JCWVsc2UgaWYgKGNtcCA8IDApCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KGNvdW50KTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgUHlfU0laRShzZWxmKTsgaSsrKSB7CisgICAgICAgIGludCBjbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woc2VsZi0+b2JfaXRlbVtpXSwgdiwgUHlfRVEpOworICAgICAgICBpZiAoY21wID4gMCkKKyAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgIGVsc2UgaWYgKGNtcCA8IDApCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KGNvdW50KTsKIH0KIAogc3RhdGljIGludAogdHVwbGV0cmF2ZXJzZShQeVR1cGxlT2JqZWN0ICpvLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlQeV9zc2l6ZV90IGk7CisgICAgUHlfc3NpemVfdCBpOwogCi0JZm9yIChpID0gUHlfU0laRShvKTsgLS1pID49IDA7ICkKLQkJUHlfVklTSVQoby0+b2JfaXRlbVtpXSk7Ci0JcmV0dXJuIDA7CisgICAgZm9yIChpID0gUHlfU0laRShvKTsgLS1pID49IDA7ICkKKyAgICAgICAgUHlfVklTSVQoby0+b2JfaXRlbVtpXSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB0dXBsZXJpY2hjb21wYXJlKFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdywgaW50IG9wKQogewotCVB5VHVwbGVPYmplY3QgKnZ0LCAqd3Q7Ci0JUHlfc3NpemVfdCBpOwotCVB5X3NzaXplX3Qgdmxlbiwgd2xlbjsKKyAgICBQeVR1cGxlT2JqZWN0ICp2dCwgKnd0OworICAgIFB5X3NzaXplX3QgaTsKKyAgICBQeV9zc2l6ZV90IHZsZW4sIHdsZW47CiAKLQlpZiAoIVB5VHVwbGVfQ2hlY2sodikgfHwgIVB5VHVwbGVfQ2hlY2sodykpIHsKLQkJUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKLQkJcmV0dXJuIFB5X05vdEltcGxlbWVudGVkOwotCX0KKyAgICBpZiAoIVB5VHVwbGVfQ2hlY2sodikgfHwgIVB5VHVwbGVfQ2hlY2sodykpIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKKyAgICAgICAgcmV0dXJuIFB5X05vdEltcGxlbWVudGVkOworICAgIH0KIAotCXZ0ID0gKFB5VHVwbGVPYmplY3QgKil2OwotCXd0ID0gKFB5VHVwbGVPYmplY3QgKil3OworICAgIHZ0ID0gKFB5VHVwbGVPYmplY3QgKil2OworICAgIHd0ID0gKFB5VHVwbGVPYmplY3QgKil3OwogCi0JdmxlbiA9IFB5X1NJWkUodnQpOwotCXdsZW4gPSBQeV9TSVpFKHd0KTsKKyAgICB2bGVuID0gUHlfU0laRSh2dCk7CisgICAgd2xlbiA9IFB5X1NJWkUod3QpOwogCi0JLyogTm90ZTogIHRoZSBjb3JyZXNwb25kaW5nIGNvZGUgZm9yIGxpc3RzIGhhcyBhbiAiZWFybHkgb3V0IiB0ZXN0Ci0JICogaGVyZSB3aGVuIG9wIGlzIEVRIG9yIE5FIGFuZCB0aGUgbGVuZ3RocyBkaWZmZXIuICBUaGF0IHBheXMgdGhlcmUsCi0JICogYnV0IFRpbSB3YXMgdW5hYmxlIHRvIGZpbmQgYW55IHJlYWwgY29kZSB3aGVyZSBFUS9ORSB0dXBsZQotCSAqIGNvbXBhcmVzIGRvbid0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoLCBzbyB0ZXN0aW5nIGZvciBpdCBoZXJlIHdvdWxkCi0JICogaGF2ZSBjb3N0IHdpdGhvdXQgYmVuZWZpdC4KLQkgKi8KKyAgICAvKiBOb3RlOiAgdGhlIGNvcnJlc3BvbmRpbmcgY29kZSBmb3IgbGlzdHMgaGFzIGFuICJlYXJseSBvdXQiIHRlc3QKKyAgICAgKiBoZXJlIHdoZW4gb3AgaXMgRVEgb3IgTkUgYW5kIHRoZSBsZW5ndGhzIGRpZmZlci4gIFRoYXQgcGF5cyB0aGVyZSwKKyAgICAgKiBidXQgVGltIHdhcyB1bmFibGUgdG8gZmluZCBhbnkgcmVhbCBjb2RlIHdoZXJlIEVRL05FIHR1cGxlCisgICAgICogY29tcGFyZXMgZG9uJ3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGgsIHNvIHRlc3RpbmcgZm9yIGl0IGhlcmUgd291bGQKKyAgICAgKiBoYXZlIGNvc3Qgd2l0aG91dCBiZW5lZml0LgorICAgICAqLwogCi0JLyogU2VhcmNoIGZvciB0aGUgZmlyc3QgaW5kZXggd2hlcmUgaXRlbXMgYXJlIGRpZmZlcmVudC4KLQkgKiBOb3RlIHRoYXQgYmVjYXVzZSB0dXBsZXMgYXJlIGltbXV0YWJsZSwgaXQncyBzYWZlIHRvIHJldXNlCi0JICogdmxlbiBhbmQgd2xlbiBhY3Jvc3MgdGhlIGNvbXBhcmlzb24gY2FsbHMuCi0JICovCi0JZm9yIChpID0gMDsgaSA8IHZsZW4gJiYgaSA8IHdsZW47IGkrKykgewotCQlpbnQgayA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbCh2dC0+b2JfaXRlbVtpXSwKLQkJCQkJCSB3dC0+b2JfaXRlbVtpXSwgUHlfRVEpOwotCQlpZiAoayA8IDApCi0JCQlyZXR1cm4gTlVMTDsKLQkJaWYgKCFrKQotCQkJYnJlYWs7Ci0JfQorICAgIC8qIFNlYXJjaCBmb3IgdGhlIGZpcnN0IGluZGV4IHdoZXJlIGl0ZW1zIGFyZSBkaWZmZXJlbnQuCisgICAgICogTm90ZSB0aGF0IGJlY2F1c2UgdHVwbGVzIGFyZSBpbW11dGFibGUsIGl0J3Mgc2FmZSB0byByZXVzZQorICAgICAqIHZsZW4gYW5kIHdsZW4gYWNyb3NzIHRoZSBjb21wYXJpc29uIGNhbGxzLgorICAgICAqLworICAgIGZvciAoaSA9IDA7IGkgPCB2bGVuICYmIGkgPCB3bGVuOyBpKyspIHsKKyAgICAgICAgaW50IGsgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2wodnQtPm9iX2l0ZW1baV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHd0LT5vYl9pdGVtW2ldLCBQeV9FUSk7CisgICAgICAgIGlmIChrIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBpZiAoIWspCisgICAgICAgICAgICBicmVhazsKKyAgICB9CiAKLQlpZiAoaSA+PSB2bGVuIHx8IGkgPj0gd2xlbikgewotCQkvKiBObyBtb3JlIGl0ZW1zIHRvIGNvbXBhcmUgLS0gY29tcGFyZSBzaXplcyAqLwotCQlpbnQgY21wOwotCQlQeU9iamVjdCAqcmVzOwotCQlzd2l0Y2ggKG9wKSB7Ci0JCWNhc2UgUHlfTFQ6IGNtcCA9IHZsZW4gPCAgd2xlbjsgYnJlYWs7Ci0JCWNhc2UgUHlfTEU6IGNtcCA9IHZsZW4gPD0gd2xlbjsgYnJlYWs7Ci0JCWNhc2UgUHlfRVE6IGNtcCA9IHZsZW4gPT0gd2xlbjsgYnJlYWs7Ci0JCWNhc2UgUHlfTkU6IGNtcCA9IHZsZW4gIT0gd2xlbjsgYnJlYWs7Ci0JCWNhc2UgUHlfR1Q6IGNtcCA9IHZsZW4gPiAgd2xlbjsgYnJlYWs7Ci0JCWNhc2UgUHlfR0U6IGNtcCA9IHZsZW4gPj0gd2xlbjsgYnJlYWs7Ci0JCWRlZmF1bHQ6IHJldHVybiBOVUxMOyAvKiBjYW5ub3QgaGFwcGVuICovCi0JCX0KLQkJaWYgKGNtcCkKLQkJCXJlcyA9IFB5X1RydWU7Ci0JCWVsc2UKLQkJCXJlcyA9IFB5X0ZhbHNlOwotCQlQeV9JTkNSRUYocmVzKTsKLQkJcmV0dXJuIHJlczsKLQl9CisgICAgaWYgKGkgPj0gdmxlbiB8fCBpID49IHdsZW4pIHsKKyAgICAgICAgLyogTm8gbW9yZSBpdGVtcyB0byBjb21wYXJlIC0tIGNvbXBhcmUgc2l6ZXMgKi8KKyAgICAgICAgaW50IGNtcDsKKyAgICAgICAgUHlPYmplY3QgKnJlczsKKyAgICAgICAgc3dpdGNoIChvcCkgeworICAgICAgICBjYXNlIFB5X0xUOiBjbXAgPSB2bGVuIDwgIHdsZW47IGJyZWFrOworICAgICAgICBjYXNlIFB5X0xFOiBjbXAgPSB2bGVuIDw9IHdsZW47IGJyZWFrOworICAgICAgICBjYXNlIFB5X0VROiBjbXAgPSB2bGVuID09IHdsZW47IGJyZWFrOworICAgICAgICBjYXNlIFB5X05FOiBjbXAgPSB2bGVuICE9IHdsZW47IGJyZWFrOworICAgICAgICBjYXNlIFB5X0dUOiBjbXAgPSB2bGVuID4gIHdsZW47IGJyZWFrOworICAgICAgICBjYXNlIFB5X0dFOiBjbXAgPSB2bGVuID49IHdsZW47IGJyZWFrOworICAgICAgICBkZWZhdWx0OiByZXR1cm4gTlVMTDsgLyogY2Fubm90IGhhcHBlbiAqLworICAgICAgICB9CisgICAgICAgIGlmIChjbXApCisgICAgICAgICAgICByZXMgPSBQeV9UcnVlOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXMgPSBQeV9GYWxzZTsKKyAgICAgICAgUHlfSU5DUkVGKHJlcyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQogCi0JLyogV2UgaGF2ZSBhbiBpdGVtIHRoYXQgZGlmZmVycyAtLSBzaG9ydGN1dHMgZm9yIEVRL05FICovCi0JaWYgKG9wID09IFB5X0VRKSB7Ci0JCVB5X0lOQ1JFRihQeV9GYWxzZSk7Ci0JCXJldHVybiBQeV9GYWxzZTsKLQl9Ci0JaWYgKG9wID09IFB5X05FKSB7Ci0JCVB5X0lOQ1JFRihQeV9UcnVlKTsKLQkJcmV0dXJuIFB5X1RydWU7Ci0JfQorICAgIC8qIFdlIGhhdmUgYW4gaXRlbSB0aGF0IGRpZmZlcnMgLS0gc2hvcnRjdXRzIGZvciBFUS9ORSAqLworICAgIGlmIChvcCA9PSBQeV9FUSkgeworICAgICAgICBQeV9JTkNSRUYoUHlfRmFsc2UpOworICAgICAgICByZXR1cm4gUHlfRmFsc2U7CisgICAgfQorICAgIGlmIChvcCA9PSBQeV9ORSkgeworICAgICAgICBQeV9JTkNSRUYoUHlfVHJ1ZSk7CisgICAgICAgIHJldHVybiBQeV9UcnVlOworICAgIH0KIAotCS8qIENvbXBhcmUgdGhlIGZpbmFsIGl0ZW0gYWdhaW4gdXNpbmcgdGhlIHByb3BlciBvcGVyYXRvciAqLwotCXJldHVybiBQeU9iamVjdF9SaWNoQ29tcGFyZSh2dC0+b2JfaXRlbVtpXSwgd3QtPm9iX2l0ZW1baV0sIG9wKTsKKyAgICAvKiBDb21wYXJlIHRoZSBmaW5hbCBpdGVtIGFnYWluIHVzaW5nIHRoZSBwcm9wZXIgb3BlcmF0b3IgKi8KKyAgICByZXR1cm4gUHlPYmplY3RfUmljaENvbXBhcmUodnQtPm9iX2l0ZW1baV0sIHd0LT5vYl9pdGVtW2ldLCBvcCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC01OTIsNDEgKzU5Miw0MSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHR1cGxlX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlQeU9iamVjdCAqYXJnID0gTlVMTDsKLQlzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7InNlcXVlbmNlIiwgMH07CisgICAgUHlPYmplY3QgKmFyZyA9IE5VTEw7CisgICAgc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJzZXF1ZW5jZSIsIDB9OwogCi0JaWYgKHR5cGUgIT0gJlB5VHVwbGVfVHlwZSkKLQkJcmV0dXJuIHR1cGxlX3N1YnR5cGVfbmV3KHR5cGUsIGFyZ3MsIGt3ZHMpOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJ8Tzp0dXBsZSIsIGt3bGlzdCwgJmFyZykpCi0JCXJldHVybiBOVUxMOworICAgIGlmICh0eXBlICE9ICZQeVR1cGxlX1R5cGUpCisgICAgICAgIHJldHVybiB0dXBsZV9zdWJ0eXBlX25ldyh0eXBlLCBhcmdzLCBrd2RzKTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAifE86dHVwbGUiLCBrd2xpc3QsICZhcmcpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChhcmcgPT0gTlVMTCkKLQkJcmV0dXJuIFB5VHVwbGVfTmV3KDApOwotCWVsc2UKLQkJcmV0dXJuIFB5U2VxdWVuY2VfVHVwbGUoYXJnKTsKKyAgICBpZiAoYXJnID09IE5VTEwpCisgICAgICAgIHJldHVybiBQeVR1cGxlX05ldygwKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBQeVNlcXVlbmNlX1R1cGxlKGFyZyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB0dXBsZV9zdWJ0eXBlX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlQeU9iamVjdCAqdG1wLCAqbmV3b2JqLCAqaXRlbTsKLQlQeV9zc2l6ZV90IGksIG47CisgICAgUHlPYmplY3QgKnRtcCwgKm5ld29iaiwgKml0ZW07CisgICAgUHlfc3NpemVfdCBpLCBuOwogCi0JYXNzZXJ0KFB5VHlwZV9Jc1N1YnR5cGUodHlwZSwgJlB5VHVwbGVfVHlwZSkpOwotCXRtcCA9IHR1cGxlX25ldygmUHlUdXBsZV9UeXBlLCBhcmdzLCBrd2RzKTsKLQlpZiAodG1wID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWFzc2VydChQeVR1cGxlX0NoZWNrKHRtcCkpOwotCW5ld29iaiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIG4gPSBQeVR1cGxlX0dFVF9TSVpFKHRtcCkpOwotCWlmIChuZXdvYmogPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQlpdGVtID0gUHlUdXBsZV9HRVRfSVRFTSh0bXAsIGkpOwotCQlQeV9JTkNSRUYoaXRlbSk7Ci0JCVB5VHVwbGVfU0VUX0lURU0obmV3b2JqLCBpLCBpdGVtKTsKLQl9Ci0JUHlfREVDUkVGKHRtcCk7Ci0JcmV0dXJuIG5ld29iajsKKyAgICBhc3NlcnQoUHlUeXBlX0lzU3VidHlwZSh0eXBlLCAmUHlUdXBsZV9UeXBlKSk7CisgICAgdG1wID0gdHVwbGVfbmV3KCZQeVR1cGxlX1R5cGUsIGFyZ3MsIGt3ZHMpOworICAgIGlmICh0bXAgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYXNzZXJ0KFB5VHVwbGVfQ2hlY2sodG1wKSk7CisgICAgbmV3b2JqID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgbiA9IFB5VHVwbGVfR0VUX1NJWkUodG1wKSk7CisgICAgaWYgKG5ld29iaiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIGl0ZW0gPSBQeVR1cGxlX0dFVF9JVEVNKHRtcCwgaSk7CisgICAgICAgIFB5X0lOQ1JFRihpdGVtKTsKKyAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShuZXdvYmosIGksIGl0ZW0pOworICAgIH0KKyAgICBQeV9ERUNSRUYodG1wKTsKKyAgICByZXR1cm4gbmV3b2JqOwogfQogCiBQeURvY19TVFJWQVIodHVwbGVfZG9jLApAQCAtNjM2LDg2ICs2MzYsODYgQEAKIElmIHRoZSBhcmd1bWVudCBpcyBhIHR1cGxlLCB0aGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBzYW1lIG9iamVjdC4iKTsKIAogc3RhdGljIFB5U2VxdWVuY2VNZXRob2RzIHR1cGxlX2FzX3NlcXVlbmNlID0gewotCShsZW5mdW5jKXR1cGxlbGVuZ3RoLAkJCS8qIHNxX2xlbmd0aCAqLwotCShiaW5hcnlmdW5jKXR1cGxlY29uY2F0LAkJLyogc3FfY29uY2F0ICovCi0JKHNzaXplYXJnZnVuYyl0dXBsZXJlcGVhdCwJCS8qIHNxX3JlcGVhdCAqLwotCShzc2l6ZWFyZ2Z1bmMpdHVwbGVpdGVtLAkJLyogc3FfaXRlbSAqLwotCShzc2l6ZXNzaXplYXJnZnVuYyl0dXBsZXNsaWNlLAkJLyogc3Ffc2xpY2UgKi8KLQkwLAkJCQkJLyogc3FfYXNzX2l0ZW0gKi8KLQkwLAkJCQkJLyogc3FfYXNzX3NsaWNlICovCi0JKG9iam9ianByb2MpdHVwbGVjb250YWlucywJCS8qIHNxX2NvbnRhaW5zICovCisgICAgKGxlbmZ1bmMpdHVwbGVsZW5ndGgsICAgICAgICAgICAgICAgICAgICAgICAvKiBzcV9sZW5ndGggKi8KKyAgICAoYmluYXJ5ZnVuYyl0dXBsZWNvbmNhdCwgICAgICAgICAgICAgICAgICAgIC8qIHNxX2NvbmNhdCAqLworICAgIChzc2l6ZWFyZ2Z1bmMpdHVwbGVyZXBlYXQsICAgICAgICAgICAgICAgICAgLyogc3FfcmVwZWF0ICovCisgICAgKHNzaXplYXJnZnVuYyl0dXBsZWl0ZW0sICAgICAgICAgICAgICAgICAgICAvKiBzcV9pdGVtICovCisgICAgKHNzaXplc3NpemVhcmdmdW5jKXR1cGxlc2xpY2UsICAgICAgICAgICAgICAvKiBzcV9zbGljZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3FfYXNzX2l0ZW0gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNxX2Fzc19zbGljZSAqLworICAgIChvYmpvYmpwcm9jKXR1cGxlY29udGFpbnMsICAgICAgICAgICAgICAgICAgLyogc3FfY29udGFpbnMgKi8KIH07CiAKIHN0YXRpYyBQeU9iamVjdCoKIHR1cGxlc3Vic2NyaXB0KFB5VHVwbGVPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBpdGVtKQogewotCWlmIChQeUluZGV4X0NoZWNrKGl0ZW0pKSB7Ci0JCVB5X3NzaXplX3QgaSA9IFB5TnVtYmVyX0FzU3NpemVfdChpdGVtLCBQeUV4Y19JbmRleEVycm9yKTsKLQkJaWYgKGkgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJCXJldHVybiBOVUxMOwotCQlpZiAoaSA8IDApCi0JCQlpICs9IFB5VHVwbGVfR0VUX1NJWkUoc2VsZik7Ci0JCXJldHVybiB0dXBsZWl0ZW0oc2VsZiwgaSk7Ci0JfQotCWVsc2UgaWYgKFB5U2xpY2VfQ2hlY2soaXRlbSkpIHsKLQkJUHlfc3NpemVfdCBzdGFydCwgc3RvcCwgc3RlcCwgc2xpY2VsZW5ndGgsIGN1ciwgaTsKLQkJUHlPYmplY3QqIHJlc3VsdDsKLQkJUHlPYmplY3QqIGl0OwotCQlQeU9iamVjdCAqKnNyYywgKipkZXN0OworICAgIGlmIChQeUluZGV4X0NoZWNrKGl0ZW0pKSB7CisgICAgICAgIFB5X3NzaXplX3QgaSA9IFB5TnVtYmVyX0FzU3NpemVfdChpdGVtLCBQeUV4Y19JbmRleEVycm9yKTsKKyAgICAgICAgaWYgKGkgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBpZiAoaSA8IDApCisgICAgICAgICAgICBpICs9IFB5VHVwbGVfR0VUX1NJWkUoc2VsZik7CisgICAgICAgIHJldHVybiB0dXBsZWl0ZW0oc2VsZiwgaSk7CisgICAgfQorICAgIGVsc2UgaWYgKFB5U2xpY2VfQ2hlY2soaXRlbSkpIHsKKyAgICAgICAgUHlfc3NpemVfdCBzdGFydCwgc3RvcCwgc3RlcCwgc2xpY2VsZW5ndGgsIGN1ciwgaTsKKyAgICAgICAgUHlPYmplY3QqIHJlc3VsdDsKKyAgICAgICAgUHlPYmplY3QqIGl0OworICAgICAgICBQeU9iamVjdCAqKnNyYywgKipkZXN0OwogCi0JCWlmIChQeVNsaWNlX0dldEluZGljZXNFeCgoUHlTbGljZU9iamVjdCopaXRlbSwKLQkJCQkgUHlUdXBsZV9HRVRfU0laRShzZWxmKSwKLQkJCQkgJnN0YXJ0LCAmc3RvcCwgJnN0ZXAsICZzbGljZWxlbmd0aCkgPCAwKSB7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQorICAgICAgICBpZiAoUHlTbGljZV9HZXRJbmRpY2VzRXgoKFB5U2xpY2VPYmplY3QqKWl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlUdXBsZV9HRVRfU0laRShzZWxmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhcnQsICZzdG9wLCAmc3RlcCwgJnNsaWNlbGVuZ3RoKSA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CiAKLQkJaWYgKHNsaWNlbGVuZ3RoIDw9IDApIHsKLQkJCXJldHVybiBQeVR1cGxlX05ldygwKTsKLQkJfQotCQllbHNlIGlmIChzdGFydCA9PSAwICYmIHN0ZXAgPT0gMSAmJgotCQkJIHNsaWNlbGVuZ3RoID09IFB5VHVwbGVfR0VUX1NJWkUoc2VsZikgJiYKLQkJCSBQeVR1cGxlX0NoZWNrRXhhY3Qoc2VsZikpIHsKLQkJCVB5X0lOQ1JFRihzZWxmKTsKLQkJCXJldHVybiAoUHlPYmplY3QgKilzZWxmOwotCQl9Ci0JCWVsc2UgewotCQkJcmVzdWx0ID0gUHlUdXBsZV9OZXcoc2xpY2VsZW5ndGgpOwotCQkJaWYgKCFyZXN1bHQpIHJldHVybiBOVUxMOworICAgICAgICBpZiAoc2xpY2VsZW5ndGggPD0gMCkgeworICAgICAgICAgICAgcmV0dXJuIFB5VHVwbGVfTmV3KDApOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHN0YXJ0ID09IDAgJiYgc3RlcCA9PSAxICYmCisgICAgICAgICAgICAgICAgIHNsaWNlbGVuZ3RoID09IFB5VHVwbGVfR0VUX1NJWkUoc2VsZikgJiYKKyAgICAgICAgICAgICAgICAgUHlUdXBsZV9DaGVja0V4YWN0KHNlbGYpKSB7CisgICAgICAgICAgICBQeV9JTkNSRUYoc2VsZik7CisgICAgICAgICAgICByZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IFB5VHVwbGVfTmV3KHNsaWNlbGVuZ3RoKTsKKyAgICAgICAgICAgIGlmICghcmVzdWx0KSByZXR1cm4gTlVMTDsKIAotCQkJc3JjID0gc2VsZi0+b2JfaXRlbTsKLQkJCWRlc3QgPSAoKFB5VHVwbGVPYmplY3QgKilyZXN1bHQpLT5vYl9pdGVtOwotCQkJZm9yIChjdXIgPSBzdGFydCwgaSA9IDA7IGkgPCBzbGljZWxlbmd0aDsgCi0JCQkgICAgIGN1ciArPSBzdGVwLCBpKyspIHsKLQkJCQlpdCA9IHNyY1tjdXJdOwotCQkJCVB5X0lOQ1JFRihpdCk7Ci0JCQkJZGVzdFtpXSA9IGl0OwotCQkJfQotCQkJCi0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JfQotCWVsc2UgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAKLQkJCSAgICAgInR1cGxlIGluZGljZXMgbXVzdCBiZSBpbnRlZ2Vycywgbm90ICUuMjAwcyIsCi0JCQkgICAgIFB5X1RZUEUoaXRlbSktPnRwX25hbWUpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgICAgICAgICBzcmMgPSBzZWxmLT5vYl9pdGVtOworICAgICAgICAgICAgZGVzdCA9ICgoUHlUdXBsZU9iamVjdCAqKXJlc3VsdCktPm9iX2l0ZW07CisgICAgICAgICAgICBmb3IgKGN1ciA9IHN0YXJ0LCBpID0gMDsgaSA8IHNsaWNlbGVuZ3RoOworICAgICAgICAgICAgICAgICBjdXIgKz0gc3RlcCwgaSsrKSB7CisgICAgICAgICAgICAgICAgaXQgPSBzcmNbY3VyXTsKKyAgICAgICAgICAgICAgICBQeV9JTkNSRUYoaXQpOworICAgICAgICAgICAgICAgIGRlc3RbaV0gPSBpdDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJ0dXBsZSBpbmRpY2VzIG11c3QgYmUgaW50ZWdlcnMsIG5vdCAlLjIwMHMiLAorICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRShpdGVtKS0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHR1cGxlX2dldG5ld2FyZ3MoUHlUdXBsZU9iamVjdCAqdikKIHsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKE4pIiwgdHVwbGVzbGljZSh2LCAwLCBQeV9TSVpFKHYpKSk7Ci0JCisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihOKSIsIHR1cGxlc2xpY2UodiwgMCwgUHlfU0laRSh2KSkpOworCiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB0dXBsZV9zaXplb2YoUHlUdXBsZU9iamVjdCAqc2VsZikKIHsKLQlQeV9zc2l6ZV90IHJlczsKKyAgICBQeV9zc2l6ZV90IHJlczsKIAotCXJlcyA9IFB5VHVwbGVfVHlwZS50cF9iYXNpY3NpemUgKyBQeV9TSVpFKHNlbGYpICogc2l6ZW9mKFB5T2JqZWN0ICopOwotCXJldHVybiBQeUludF9Gcm9tU3NpemVfdChyZXMpOworICAgIHJlcyA9IFB5VHVwbGVfVHlwZS50cF9iYXNpY3NpemUgKyBQeV9TSVpFKHNlbGYpICogc2l6ZW9mKFB5T2JqZWN0ICopOworICAgIHJldHVybiBQeUludF9Gcm9tU3NpemVfdChyZXMpOwogfQogCiBQeURvY19TVFJWQVIoaW5kZXhfZG9jLApAQCAtNzI4LDYyICs3MjgsNjIgQEAKICJULl9fc2l6ZW9mX18oKSAtLSBzaXplIG9mIFQgaW4gbWVtb3J5LCBpbiBieXRlcyIpOwogCiBzdGF0aWMgUHlNZXRob2REZWYgdHVwbGVfbWV0aG9kc1tdID0gewotCXsiX19nZXRuZXdhcmdzX18iLAkoUHlDRnVuY3Rpb24pdHVwbGVfZ2V0bmV3YXJncywJTUVUSF9OT0FSR1N9LAotCXsiX19zaXplb2ZfXyIsCShQeUNGdW5jdGlvbil0dXBsZV9zaXplb2YsIE1FVEhfTk9BUkdTLCBzaXplb2ZfZG9jfSwKLQl7ImluZGV4IiwJKFB5Q0Z1bmN0aW9uKXR1cGxlaW5kZXgsICBNRVRIX1ZBUkFSR1MsIGluZGV4X2RvY30sCi0JeyJjb3VudCIsCShQeUNGdW5jdGlvbil0dXBsZWNvdW50LCAgTUVUSF9PLCBjb3VudF9kb2N9LAotCXtOVUxMLAkJTlVMTH0JCS8qIHNlbnRpbmVsICovCisgICAgeyJfX2dldG5ld2FyZ3NfXyIsICAgICAgICAgIChQeUNGdW5jdGlvbil0dXBsZV9nZXRuZXdhcmdzLCAgTUVUSF9OT0FSR1N9LAorICAgIHsiX19zaXplb2ZfXyIsICAgICAgKFB5Q0Z1bmN0aW9uKXR1cGxlX3NpemVvZiwgTUVUSF9OT0FSR1MsIHNpemVvZl9kb2N9LAorICAgIHsiaW5kZXgiLCAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXR1cGxlaW5kZXgsICBNRVRIX1ZBUkFSR1MsIGluZGV4X2RvY30sCisgICAgeyJjb3VudCIsICAgICAgICAgICAoUHlDRnVuY3Rpb24pdHVwbGVjb3VudCwgIE1FVEhfTywgY291bnRfZG9jfSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogc3RhdGljIFB5TWFwcGluZ01ldGhvZHMgdHVwbGVfYXNfbWFwcGluZyA9IHsKLQkobGVuZnVuYyl0dXBsZWxlbmd0aCwKLQkoYmluYXJ5ZnVuYyl0dXBsZXN1YnNjcmlwdCwKLQkwCisgICAgKGxlbmZ1bmMpdHVwbGVsZW5ndGgsCisgICAgKGJpbmFyeWZ1bmMpdHVwbGVzdWJzY3JpcHQsCisgICAgMAogfTsKIAogc3RhdGljIFB5T2JqZWN0ICp0dXBsZV9pdGVyKFB5T2JqZWN0ICpzZXEpOwogCiBQeVR5cGVPYmplY3QgUHlUdXBsZV9UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCi0JInR1cGxlIiwKLQlzaXplb2YoUHlUdXBsZU9iamVjdCkgLSBzaXplb2YoUHlPYmplY3QgKiksCi0Jc2l6ZW9mKFB5T2JqZWN0ICopLAotCShkZXN0cnVjdG9yKXR1cGxlZGVhbGxvYywJCS8qIHRwX2RlYWxsb2MgKi8KLQkocHJpbnRmdW5jKXR1cGxlcHJpbnQsCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkocmVwcmZ1bmMpdHVwbGVyZXByLAkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JJnR1cGxlX2FzX3NlcXVlbmNlLAkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JJnR1cGxlX2FzX21hcHBpbmcsCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYyl0dXBsZWhhc2gsCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDIHwKLQkJUHlfVFBGTEFHU19CQVNFVFlQRSB8IFB5X1RQRkxBR1NfVFVQTEVfU1VCQ0xBU1MsIC8qIHRwX2ZsYWdzICovCi0JdHVwbGVfZG9jLAkJCQkvKiB0cF9kb2MgKi8KLSAJKHRyYXZlcnNlcHJvYyl0dXBsZXRyYXZlcnNlLAkJLyogdHBfdHJhdmVyc2UgKi8KLQkwLAkJCQkJLyogdHBfY2xlYXIgKi8KLQl0dXBsZXJpY2hjb21wYXJlLAkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JdHVwbGVfaXRlciwJICAgIAkJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkJLyogdHBfaXRlcm5leHQgKi8KLQl0dXBsZV9tZXRob2RzLAkJCQkvKiB0cF9tZXRob2RzICovCi0JMCwJCQkJCS8qIHRwX21lbWJlcnMgKi8KLQkwLAkJCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaW5pdCAqLwotCTAsCQkJCQkvKiB0cF9hbGxvYyAqLwotCXR1cGxlX25ldywJCQkJLyogdHBfbmV3ICovCi0JUHlPYmplY3RfR0NfRGVsLCAgICAgICAgCQkvKiB0cF9mcmVlICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKKyAgICAidHVwbGUiLAorICAgIHNpemVvZihQeVR1cGxlT2JqZWN0KSAtIHNpemVvZihQeU9iamVjdCAqKSwKKyAgICBzaXplb2YoUHlPYmplY3QgKiksCisgICAgKGRlc3RydWN0b3IpdHVwbGVkZWFsbG9jLCAgICAgICAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgKHByaW50ZnVuYyl0dXBsZXByaW50LCAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIChyZXByZnVuYyl0dXBsZXJlcHIsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgJnR1cGxlX2FzX3NlcXVlbmNlLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgICZ0dXBsZV9hc19tYXBwaW5nLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIChoYXNoZnVuYyl0dXBsZWhhc2gsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQyB8CisgICAgICAgIFB5X1RQRkxBR1NfQkFTRVRZUEUgfCBQeV9UUEZMQUdTX1RVUExFX1NVQkNMQVNTLCAvKiB0cF9mbGFncyAqLworICAgIHR1cGxlX2RvYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgKHRyYXZlcnNlcHJvYyl0dXBsZXRyYXZlcnNlLCAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICB0dXBsZXJpY2hjb21wYXJlLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIHR1cGxlX2l0ZXIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICB0dXBsZV9tZXRob2RzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgdHVwbGVfbmV3LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICBQeU9iamVjdF9HQ19EZWwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KIH07CiAKIC8qIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gYnJlYWtzIHRoZSBub3Rpb24gdGhhdCB0dXBsZXMgYXJlIGltbXV0YWJsZToKQEAgLTc5NiwyMDMgKzc5NiwyMDMgQEAKIGludAogX1B5VHVwbGVfUmVzaXplKFB5T2JqZWN0ICoqcHYsIFB5X3NzaXplX3QgbmV3c2l6ZSkKIHsKLQlyZWdpc3RlciBQeVR1cGxlT2JqZWN0ICp2OwotCXJlZ2lzdGVyIFB5VHVwbGVPYmplY3QgKnN2OwotCVB5X3NzaXplX3QgaTsKLQlQeV9zc2l6ZV90IG9sZHNpemU7CisgICAgcmVnaXN0ZXIgUHlUdXBsZU9iamVjdCAqdjsKKyAgICByZWdpc3RlciBQeVR1cGxlT2JqZWN0ICpzdjsKKyAgICBQeV9zc2l6ZV90IGk7CisgICAgUHlfc3NpemVfdCBvbGRzaXplOwogCi0JdiA9IChQeVR1cGxlT2JqZWN0ICopICpwdjsKLQlpZiAodiA9PSBOVUxMIHx8IFB5X1RZUEUodikgIT0gJlB5VHVwbGVfVHlwZSB8fAotCSAgICAoUHlfU0laRSh2KSAhPSAwICYmIFB5X1JFRkNOVCh2KSAhPSAxKSkgewotCQkqcHYgPSAwOwotCQlQeV9YREVDUkVGKHYpOwotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlvbGRzaXplID0gUHlfU0laRSh2KTsKLQlpZiAob2xkc2l6ZSA9PSBuZXdzaXplKQotCQlyZXR1cm4gMDsKKyAgICB2ID0gKFB5VHVwbGVPYmplY3QgKikgKnB2OworICAgIGlmICh2ID09IE5VTEwgfHwgUHlfVFlQRSh2KSAhPSAmUHlUdXBsZV9UeXBlIHx8CisgICAgICAgIChQeV9TSVpFKHYpICE9IDAgJiYgUHlfUkVGQ05UKHYpICE9IDEpKSB7CisgICAgICAgICpwdiA9IDA7CisgICAgICAgIFB5X1hERUNSRUYodik7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG9sZHNpemUgPSBQeV9TSVpFKHYpOworICAgIGlmIChvbGRzaXplID09IG5ld3NpemUpCisgICAgICAgIHJldHVybiAwOwogCi0JaWYgKG9sZHNpemUgPT0gMCkgewotCQkvKiBFbXB0eSB0dXBsZXMgYXJlIG9mdGVuIHNoYXJlZCwgc28gd2Ugc2hvdWxkIG5ldmVyIAotCQkgICByZXNpemUgdGhlbSBpbi1wbGFjZSBldmVuIGlmIHdlIGRvIG93biB0aGUgb25seQotCQkgICAoY3VycmVudCkgcmVmZXJlbmNlICovCi0JCVB5X0RFQ1JFRih2KTsKLQkJKnB2ID0gUHlUdXBsZV9OZXcobmV3c2l6ZSk7Ci0JCXJldHVybiAqcHYgPT0gTlVMTCA/IC0xIDogMDsKLQl9CisgICAgaWYgKG9sZHNpemUgPT0gMCkgeworICAgICAgICAvKiBFbXB0eSB0dXBsZXMgYXJlIG9mdGVuIHNoYXJlZCwgc28gd2Ugc2hvdWxkIG5ldmVyCisgICAgICAgICAgIHJlc2l6ZSB0aGVtIGluLXBsYWNlIGV2ZW4gaWYgd2UgZG8gb3duIHRoZSBvbmx5CisgICAgICAgICAgIChjdXJyZW50KSByZWZlcmVuY2UgKi8KKyAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAqcHYgPSBQeVR1cGxlX05ldyhuZXdzaXplKTsKKyAgICAgICAgcmV0dXJuICpwdiA9PSBOVUxMID8gLTEgOiAwOworICAgIH0KIAotCS8qIFhYWCBVTlJFRi9ORVdSRUYgaW50ZXJmYWNlIHNob3VsZCBiZSBtb3JlIHN5bW1ldHJpY2FsICovCi0JX1B5X0RFQ19SRUZUT1RBTDsKLQlfUHlPYmplY3RfR0NfVU5UUkFDSyh2KTsKLQlfUHlfRm9yZ2V0UmVmZXJlbmNlKChQeU9iamVjdCAqKSB2KTsKLQkvKiBERUNSRUYgaXRlbXMgZGVsZXRlZCBieSBzaHJpbmthZ2UgKi8KLQlmb3IgKGkgPSBuZXdzaXplOyBpIDwgb2xkc2l6ZTsgaSsrKSB7Ci0JCVB5X1hERUNSRUYodi0+b2JfaXRlbVtpXSk7Ci0JCXYtPm9iX2l0ZW1baV0gPSBOVUxMOwotCX0KLQlzdiA9IFB5T2JqZWN0X0dDX1Jlc2l6ZShQeVR1cGxlT2JqZWN0LCB2LCBuZXdzaXplKTsKLQlpZiAoc3YgPT0gTlVMTCkgewotCQkqcHYgPSBOVUxMOwotCQlQeU9iamVjdF9HQ19EZWwodik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JX1B5X05ld1JlZmVyZW5jZSgoUHlPYmplY3QgKikgc3YpOwotCS8qIFplcm8gb3V0IGl0ZW1zIGFkZGVkIGJ5IGdyb3dpbmcgKi8KLQlpZiAobmV3c2l6ZSA+IG9sZHNpemUpCi0JCW1lbXNldCgmc3YtPm9iX2l0ZW1bb2xkc2l6ZV0sIDAsCi0JCSAgICAgICBzaXplb2YoKnN2LT5vYl9pdGVtKSAqIChuZXdzaXplIC0gb2xkc2l6ZSkpOwotCSpwdiA9IChQeU9iamVjdCAqKSBzdjsKLQlfUHlPYmplY3RfR0NfVFJBQ0soc3YpOwotCXJldHVybiAwOworICAgIC8qIFhYWCBVTlJFRi9ORVdSRUYgaW50ZXJmYWNlIHNob3VsZCBiZSBtb3JlIHN5bW1ldHJpY2FsICovCisgICAgX1B5X0RFQ19SRUZUT1RBTDsKKyAgICBfUHlPYmplY3RfR0NfVU5UUkFDSyh2KTsKKyAgICBfUHlfRm9yZ2V0UmVmZXJlbmNlKChQeU9iamVjdCAqKSB2KTsKKyAgICAvKiBERUNSRUYgaXRlbXMgZGVsZXRlZCBieSBzaHJpbmthZ2UgKi8KKyAgICBmb3IgKGkgPSBuZXdzaXplOyBpIDwgb2xkc2l6ZTsgaSsrKSB7CisgICAgICAgIFB5X1hERUNSRUYodi0+b2JfaXRlbVtpXSk7CisgICAgICAgIHYtPm9iX2l0ZW1baV0gPSBOVUxMOworICAgIH0KKyAgICBzdiA9IFB5T2JqZWN0X0dDX1Jlc2l6ZShQeVR1cGxlT2JqZWN0LCB2LCBuZXdzaXplKTsKKyAgICBpZiAoc3YgPT0gTlVMTCkgeworICAgICAgICAqcHYgPSBOVUxMOworICAgICAgICBQeU9iamVjdF9HQ19EZWwodik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgX1B5X05ld1JlZmVyZW5jZSgoUHlPYmplY3QgKikgc3YpOworICAgIC8qIFplcm8gb3V0IGl0ZW1zIGFkZGVkIGJ5IGdyb3dpbmcgKi8KKyAgICBpZiAobmV3c2l6ZSA+IG9sZHNpemUpCisgICAgICAgIG1lbXNldCgmc3YtPm9iX2l0ZW1bb2xkc2l6ZV0sIDAsCisgICAgICAgICAgICAgICBzaXplb2YoKnN2LT5vYl9pdGVtKSAqIChuZXdzaXplIC0gb2xkc2l6ZSkpOworICAgICpwdiA9IChQeU9iamVjdCAqKSBzdjsKKyAgICBfUHlPYmplY3RfR0NfVFJBQ0soc3YpOworICAgIHJldHVybiAwOwogfQogCiBpbnQKIFB5VHVwbGVfQ2xlYXJGcmVlTGlzdCh2b2lkKQogewotCWludCBmcmVlbGlzdF9zaXplID0gMDsKKyAgICBpbnQgZnJlZWxpc3Rfc2l6ZSA9IDA7CiAjaWYgUHlUdXBsZV9NQVhTQVZFU0laRSA+IDAKLQlpbnQgaTsKLQlmb3IgKGkgPSAxOyBpIDwgUHlUdXBsZV9NQVhTQVZFU0laRTsgaSsrKSB7Ci0JCVB5VHVwbGVPYmplY3QgKnAsICpxOwotCQlwID0gZnJlZV9saXN0W2ldOwotCQlmcmVlbGlzdF9zaXplICs9IG51bWZyZWVbaV07Ci0JCWZyZWVfbGlzdFtpXSA9IE5VTEw7Ci0JCW51bWZyZWVbaV0gPSAwOwotCQl3aGlsZSAocCkgewotCQkJcSA9IHA7Ci0JCQlwID0gKFB5VHVwbGVPYmplY3QgKikocC0+b2JfaXRlbVswXSk7Ci0JCQlQeU9iamVjdF9HQ19EZWwocSk7Ci0JCX0KLQl9CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMTsgaSA8IFB5VHVwbGVfTUFYU0FWRVNJWkU7IGkrKykgeworICAgICAgICBQeVR1cGxlT2JqZWN0ICpwLCAqcTsKKyAgICAgICAgcCA9IGZyZWVfbGlzdFtpXTsKKyAgICAgICAgZnJlZWxpc3Rfc2l6ZSArPSBudW1mcmVlW2ldOworICAgICAgICBmcmVlX2xpc3RbaV0gPSBOVUxMOworICAgICAgICBudW1mcmVlW2ldID0gMDsKKyAgICAgICAgd2hpbGUgKHApIHsKKyAgICAgICAgICAgIHEgPSBwOworICAgICAgICAgICAgcCA9IChQeVR1cGxlT2JqZWN0ICopKHAtPm9iX2l0ZW1bMF0pOworICAgICAgICAgICAgUHlPYmplY3RfR0NfRGVsKHEpOworICAgICAgICB9CisgICAgfQogI2VuZGlmCi0JcmV0dXJuIGZyZWVsaXN0X3NpemU7CisgICAgcmV0dXJuIGZyZWVsaXN0X3NpemU7CiB9Ci0JCisKIHZvaWQKIFB5VHVwbGVfRmluaSh2b2lkKQogewogI2lmIFB5VHVwbGVfTUFYU0FWRVNJWkUgPiAwCi0JLyogZW1wdHkgdHVwbGVzIGFyZSB1c2VkIGFsbCBvdmVyIHRoZSBwbGFjZSBhbmQgYXBwbGljYXRpb25zIG1heQotCSAqIHJlbHkgb24gdGhlIGZhY3QgdGhhdCBhbiBlbXB0eSB0dXBsZSBpcyBhIHNpbmdsZXRvbi4gKi8KLQlQeV9YREVDUkVGKGZyZWVfbGlzdFswXSk7Ci0JZnJlZV9saXN0WzBdID0gTlVMTDsKKyAgICAvKiBlbXB0eSB0dXBsZXMgYXJlIHVzZWQgYWxsIG92ZXIgdGhlIHBsYWNlIGFuZCBhcHBsaWNhdGlvbnMgbWF5CisgICAgICogcmVseSBvbiB0aGUgZmFjdCB0aGF0IGFuIGVtcHR5IHR1cGxlIGlzIGEgc2luZ2xldG9uLiAqLworICAgIFB5X1hERUNSRUYoZnJlZV9saXN0WzBdKTsKKyAgICBmcmVlX2xpc3RbMF0gPSBOVUxMOwogCi0JKHZvaWQpUHlUdXBsZV9DbGVhckZyZWVMaXN0KCk7CisgICAgKHZvaWQpUHlUdXBsZV9DbGVhckZyZWVMaXN0KCk7CiAjZW5kaWYKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqIFR1cGxlIEl0ZXJhdG9yICoqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCWxvbmcgaXRfaW5kZXg7Ci0JUHlUdXBsZU9iamVjdCAqaXRfc2VxOyAvKiBTZXQgdG8gTlVMTCB3aGVuIGl0ZXJhdG9yIGlzIGV4aGF1c3RlZCAqLworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBsb25nIGl0X2luZGV4OworICAgIFB5VHVwbGVPYmplY3QgKml0X3NlcTsgLyogU2V0IHRvIE5VTEwgd2hlbiBpdGVyYXRvciBpcyBleGhhdXN0ZWQgKi8KIH0gdHVwbGVpdGVyb2JqZWN0OwogCiBzdGF0aWMgdm9pZAogdHVwbGVpdGVyX2RlYWxsb2ModHVwbGVpdGVyb2JqZWN0ICppdCkKIHsKLQlfUHlPYmplY3RfR0NfVU5UUkFDSyhpdCk7Ci0JUHlfWERFQ1JFRihpdC0+aXRfc2VxKTsKLQlQeU9iamVjdF9HQ19EZWwoaXQpOworICAgIF9QeU9iamVjdF9HQ19VTlRSQUNLKGl0KTsKKyAgICBQeV9YREVDUkVGKGl0LT5pdF9zZXEpOworICAgIFB5T2JqZWN0X0dDX0RlbChpdCk7CiB9CiAKIHN0YXRpYyBpbnQKIHR1cGxlaXRlcl90cmF2ZXJzZSh0dXBsZWl0ZXJvYmplY3QgKml0LCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlQeV9WSVNJVChpdC0+aXRfc2VxKTsKLQlyZXR1cm4gMDsKKyAgICBQeV9WSVNJVChpdC0+aXRfc2VxKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHR1cGxlaXRlcl9uZXh0KHR1cGxlaXRlcm9iamVjdCAqaXQpCiB7Ci0JUHlUdXBsZU9iamVjdCAqc2VxOwotCVB5T2JqZWN0ICppdGVtOworICAgIFB5VHVwbGVPYmplY3QgKnNlcTsKKyAgICBQeU9iamVjdCAqaXRlbTsKIAotCWFzc2VydChpdCAhPSBOVUxMKTsKLQlzZXEgPSBpdC0+aXRfc2VxOwotCWlmIChzZXEgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JYXNzZXJ0KFB5VHVwbGVfQ2hlY2soc2VxKSk7CisgICAgYXNzZXJ0KGl0ICE9IE5VTEwpOworICAgIHNlcSA9IGl0LT5pdF9zZXE7CisgICAgaWYgKHNlcSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBhc3NlcnQoUHlUdXBsZV9DaGVjayhzZXEpKTsKIAotCWlmIChpdC0+aXRfaW5kZXggPCBQeVR1cGxlX0dFVF9TSVpFKHNlcSkpIHsKLQkJaXRlbSA9IFB5VHVwbGVfR0VUX0lURU0oc2VxLCBpdC0+aXRfaW5kZXgpOwotCQkrK2l0LT5pdF9pbmRleDsKLQkJUHlfSU5DUkVGKGl0ZW0pOwotCQlyZXR1cm4gaXRlbTsKLQl9CisgICAgaWYgKGl0LT5pdF9pbmRleCA8IFB5VHVwbGVfR0VUX1NJWkUoc2VxKSkgeworICAgICAgICBpdGVtID0gUHlUdXBsZV9HRVRfSVRFTShzZXEsIGl0LT5pdF9pbmRleCk7CisgICAgICAgICsraXQtPml0X2luZGV4OworICAgICAgICBQeV9JTkNSRUYoaXRlbSk7CisgICAgICAgIHJldHVybiBpdGVtOworICAgIH0KIAotCVB5X0RFQ1JFRihzZXEpOwotCWl0LT5pdF9zZXEgPSBOVUxMOwotCXJldHVybiBOVUxMOworICAgIFB5X0RFQ1JFRihzZXEpOworICAgIGl0LT5pdF9zZXEgPSBOVUxMOworICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogdHVwbGVpdGVyX2xlbih0dXBsZWl0ZXJvYmplY3QgKml0KQogewotCVB5X3NzaXplX3QgbGVuID0gMDsKLQlpZiAoaXQtPml0X3NlcSkKLQkJbGVuID0gUHlUdXBsZV9HRVRfU0laRShpdC0+aXRfc2VxKSAtIGl0LT5pdF9pbmRleDsKLQlyZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QobGVuKTsKKyAgICBQeV9zc2l6ZV90IGxlbiA9IDA7CisgICAgaWYgKGl0LT5pdF9zZXEpCisgICAgICAgIGxlbiA9IFB5VHVwbGVfR0VUX1NJWkUoaXQtPml0X3NlcSkgLSBpdC0+aXRfaW5kZXg7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KGxlbik7CiB9CiAKIFB5RG9jX1NUUlZBUihsZW5ndGhfaGludF9kb2MsICJQcml2YXRlIG1ldGhvZCByZXR1cm5pbmcgYW4gZXN0aW1hdGUgb2YgbGVuKGxpc3QoaXQpKS4iKTsKIAogc3RhdGljIFB5TWV0aG9kRGVmIHR1cGxlaXRlcl9tZXRob2RzW10gPSB7Ci0JeyJfX2xlbmd0aF9oaW50X18iLCAoUHlDRnVuY3Rpb24pdHVwbGVpdGVyX2xlbiwgTUVUSF9OT0FSR1MsIGxlbmd0aF9oaW50X2RvY30sCi0gCXtOVUxMLAkJTlVMTH0JCS8qIHNlbnRpbmVsICovCisgICAgeyJfX2xlbmd0aF9oaW50X18iLCAoUHlDRnVuY3Rpb24pdHVwbGVpdGVyX2xlbiwgTUVUSF9OT0FSR1MsIGxlbmd0aF9oaW50X2RvY30sCisgICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIFB5VHlwZU9iamVjdCBQeVR1cGxlSXRlcl9UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCi0JInR1cGxlaXRlcmF0b3IiLAkJCS8qIHRwX25hbWUgKi8KLQlzaXplb2YodHVwbGVpdGVyb2JqZWN0KSwJCS8qIHRwX2Jhc2ljc2l6ZSAqLwotCTAsCQkJCQkvKiB0cF9pdGVtc2l6ZSAqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3Rvcil0dXBsZWl0ZXJfZGVhbGxvYywJCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfcmVwciAqLwotCTAsCQkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCQkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsLyogdHBfZmxhZ3MgKi8KLQkwLAkJCQkJLyogdHBfZG9jICovCi0JKHRyYXZlcnNlcHJvYyl0dXBsZWl0ZXJfdHJhdmVyc2UsCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JUHlPYmplY3RfU2VsZkl0ZXIsCQkJLyogdHBfaXRlciAqLwotCShpdGVybmV4dGZ1bmMpdHVwbGVpdGVyX25leHQsCQkvKiB0cF9pdGVybmV4dCAqLwotCXR1cGxlaXRlcl9tZXRob2RzLAkJCS8qIHRwX21ldGhvZHMgKi8KLQkwLAorICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCisgICAgInR1cGxlaXRlcmF0b3IiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCisgICAgc2l6ZW9mKHR1cGxlaXRlcm9iamVjdCksICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKXR1cGxlaXRlcl9kZWFsbG9jLCAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2MpdHVwbGVpdGVyX3RyYXZlcnNlLCAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICBQeU9iamVjdF9TZWxmSXRlciwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAoaXRlcm5leHRmdW5jKXR1cGxlaXRlcl9uZXh0LCAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgdHVwbGVpdGVyX21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwKIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB0dXBsZV9pdGVyKFB5T2JqZWN0ICpzZXEpCiB7Ci0JdHVwbGVpdGVyb2JqZWN0ICppdDsKKyAgICB0dXBsZWl0ZXJvYmplY3QgKml0OwogCi0JaWYgKCFQeVR1cGxlX0NoZWNrKHNlcSkpIHsKLQkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpdCA9IFB5T2JqZWN0X0dDX05ldyh0dXBsZWl0ZXJvYmplY3QsICZQeVR1cGxlSXRlcl9UeXBlKTsKLQlpZiAoaXQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JaXQtPml0X2luZGV4ID0gMDsKLQlQeV9JTkNSRUYoc2VxKTsKLQlpdC0+aXRfc2VxID0gKFB5VHVwbGVPYmplY3QgKilzZXE7Ci0JX1B5T2JqZWN0X0dDX1RSQUNLKGl0KTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgaWYgKCFQeVR1cGxlX0NoZWNrKHNlcSkpIHsKKyAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpdCA9IFB5T2JqZWN0X0dDX05ldyh0dXBsZWl0ZXJvYmplY3QsICZQeVR1cGxlSXRlcl9UeXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaXQtPml0X2luZGV4ID0gMDsKKyAgICBQeV9JTkNSRUYoc2VxKTsKKyAgICBpdC0+aXRfc2VxID0gKFB5VHVwbGVPYmplY3QgKilzZXE7CisgICAgX1B5T2JqZWN0X0dDX1RSQUNLKGl0KTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CmRpZmYgLS1naXQgYS9PYmplY3RzL3R5cGVvYmplY3QuYyBiL09iamVjdHMvdHlwZW9iamVjdC5jCmluZGV4IDBiYTQyY2UuLjMwZTdhMmQgMTAwNjQ0Ci0tLSBhL09iamVjdHMvdHlwZW9iamVjdC5jCisrKyBiL09iamVjdHMvdHlwZW9iamVjdC5jCkBAIC0xMiwyMiArMTIsMjIgQEAKICAgIHRoZXkgbm9ybWFsbHkgd291bGQuICBUaGlzIGlzIHdoeSB0aGUgbWF4aW11bSBzaXplIGlzIGxpbWl0ZWQgdG8KICAgIE1DQUNIRV9NQVhfQVRUUl9TSVpFLCBzaW5jZSBpdCBtaWdodCBiZSBhIHByb2JsZW0gaWYgdmVyeSBsYXJnZQogICAgc3RyaW5ncyBhcmUgdXNlZCBhcyBhdHRyaWJ1dGUgbmFtZXMuICovCi0jZGVmaW5lIE1DQUNIRV9NQVhfQVRUUl9TSVpFCTEwMAotI2RlZmluZSBNQ0FDSEVfU0laRV9FWFAJCTEwCi0jZGVmaW5lIE1DQUNIRV9IQVNIKHZlcnNpb24sIG5hbWVfaGFzaCkJCQkJCVwKLQkJKCgodW5zaWduZWQgaW50KSh2ZXJzaW9uKSAqICh1bnNpZ25lZCBpbnQpKG5hbWVfaGFzaCkpCVwKLQkJID4+ICg4KnNpemVvZih1bnNpZ25lZCBpbnQpIC0gTUNBQ0hFX1NJWkVfRVhQKSkKKyNkZWZpbmUgTUNBQ0hFX01BWF9BVFRSX1NJWkUgICAgMTAwCisjZGVmaW5lIE1DQUNIRV9TSVpFX0VYUCAgICAgICAgIDEwCisjZGVmaW5lIE1DQUNIRV9IQVNIKHZlcnNpb24sIG5hbWVfaGFzaCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICgoKHVuc2lnbmVkIGludCkodmVyc2lvbikgKiAodW5zaWduZWQgaW50KShuYW1lX2hhc2gpKSAgICAgICAgICBcCisgICAgICAgICA+PiAoOCpzaXplb2YodW5zaWduZWQgaW50KSAtIE1DQUNIRV9TSVpFX0VYUCkpCiAjZGVmaW5lIE1DQUNIRV9IQVNIX01FVEhPRCh0eXBlLCBuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCU1DQUNIRV9IQVNIKCh0eXBlKS0+dHBfdmVyc2lvbl90YWcsICAgICAgICAgICAgICAgICAgICAgXAotCQkgICAgICAgICAgICAoKFB5U3RyaW5nT2JqZWN0ICopKG5hbWUpKS0+b2Jfc2hhc2gpCisgICAgICAgIE1DQUNIRV9IQVNIKCh0eXBlKS0+dHBfdmVyc2lvbl90YWcsICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAoKFB5U3RyaW5nT2JqZWN0ICopKG5hbWUpKS0+b2Jfc2hhc2gpCiAjZGVmaW5lIE1DQUNIRV9DQUNIRUFCTEVfTkFNRShuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCVB5U3RyaW5nX0NoZWNrRXhhY3QobmFtZSkgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQlQeVN0cmluZ19HRVRfU0laRShuYW1lKSA8PSBNQ0FDSEVfTUFYX0FUVFJfU0laRQorICAgICAgICBQeVN0cmluZ19DaGVja0V4YWN0KG5hbWUpICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgUHlTdHJpbmdfR0VUX1NJWkUobmFtZSkgPD0gTUNBQ0hFX01BWF9BVFRSX1NJWkUKIAogc3RydWN0IG1ldGhvZF9jYWNoZV9lbnRyeSB7Ci0JdW5zaWduZWQgaW50IHZlcnNpb247Ci0JUHlPYmplY3QgKm5hbWU7CQkvKiByZWZlcmVuY2UgdG8gZXhhY3RseSBhIHN0ciBvciBOb25lICovCi0JUHlPYmplY3QgKnZhbHVlOwkvKiBib3Jyb3dlZCAqLworICAgIHVuc2lnbmVkIGludCB2ZXJzaW9uOworICAgIFB5T2JqZWN0ICpuYW1lOyAgICAgICAgICAgICAvKiByZWZlcmVuY2UgdG8gZXhhY3RseSBhIHN0ciBvciBOb25lICovCisgICAgUHlPYmplY3QgKnZhbHVlOyAgICAgICAgICAgIC8qIGJvcnJvd2VkICovCiB9OwogCiBzdGF0aWMgc3RydWN0IG1ldGhvZF9jYWNoZV9lbnRyeSBtZXRob2RfY2FjaGVbMSA8PCBNQ0FDSEVfU0laRV9FWFBdOwpAQCAtMzYsMzEzICszNiwzMTMgQEAKIHVuc2lnbmVkIGludAogUHlUeXBlX0NsZWFyQ2FjaGUodm9pZCkKIHsKLQlQeV9zc2l6ZV90IGk7Ci0JdW5zaWduZWQgaW50IGN1cl92ZXJzaW9uX3RhZyA9IG5leHRfdmVyc2lvbl90YWcgLSAxOwotCQotCWZvciAoaSA9IDA7IGkgPCAoMSA8PCBNQ0FDSEVfU0laRV9FWFApOyBpKyspIHsKLQkJbWV0aG9kX2NhY2hlW2ldLnZlcnNpb24gPSAwOwotCQlQeV9DTEVBUihtZXRob2RfY2FjaGVbaV0ubmFtZSk7Ci0JCW1ldGhvZF9jYWNoZVtpXS52YWx1ZSA9IE5VTEw7Ci0JfQotCW5leHRfdmVyc2lvbl90YWcgPSAwOwotCS8qIG1hcmsgYWxsIHZlcnNpb24gdGFncyBhcyBpbnZhbGlkICovCi0JUHlUeXBlX01vZGlmaWVkKCZQeUJhc2VPYmplY3RfVHlwZSk7Ci0JcmV0dXJuIGN1cl92ZXJzaW9uX3RhZzsKKyAgICBQeV9zc2l6ZV90IGk7CisgICAgdW5zaWduZWQgaW50IGN1cl92ZXJzaW9uX3RhZyA9IG5leHRfdmVyc2lvbl90YWcgLSAxOworCisgICAgZm9yIChpID0gMDsgaSA8ICgxIDw8IE1DQUNIRV9TSVpFX0VYUCk7IGkrKykgeworICAgICAgICBtZXRob2RfY2FjaGVbaV0udmVyc2lvbiA9IDA7CisgICAgICAgIFB5X0NMRUFSKG1ldGhvZF9jYWNoZVtpXS5uYW1lKTsKKyAgICAgICAgbWV0aG9kX2NhY2hlW2ldLnZhbHVlID0gTlVMTDsKKyAgICB9CisgICAgbmV4dF92ZXJzaW9uX3RhZyA9IDA7CisgICAgLyogbWFyayBhbGwgdmVyc2lvbiB0YWdzIGFzIGludmFsaWQgKi8KKyAgICBQeVR5cGVfTW9kaWZpZWQoJlB5QmFzZU9iamVjdF9UeXBlKTsKKyAgICByZXR1cm4gY3VyX3ZlcnNpb25fdGFnOwogfQogCiB2b2lkCiBQeVR5cGVfTW9kaWZpZWQoUHlUeXBlT2JqZWN0ICp0eXBlKQogewotCS8qIEludmFsaWRhdGUgYW55IGNhY2hlZCBkYXRhIGZvciB0aGUgc3BlY2lmaWVkIHR5cGUgYW5kIGFsbAotCSAgIHN1YmNsYXNzZXMuICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhZnRlciB0aGUgYmFzZQotCSAgIGNsYXNzZXMsIG1ybywgb3IgYXR0cmlidXRlcyBvZiB0aGUgdHlwZSBhcmUgYWx0ZXJlZC4KKyAgICAvKiBJbnZhbGlkYXRlIGFueSBjYWNoZWQgZGF0YSBmb3IgdGhlIHNwZWNpZmllZCB0eXBlIGFuZCBhbGwKKyAgICAgICBzdWJjbGFzc2VzLiAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYWZ0ZXIgdGhlIGJhc2UKKyAgICAgICBjbGFzc2VzLCBtcm8sIG9yIGF0dHJpYnV0ZXMgb2YgdGhlIHR5cGUgYXJlIGFsdGVyZWQuCiAKLQkgICBJbnZhcmlhbnRzOgorICAgICAgIEludmFyaWFudHM6CiAKLQkgICAtIFB5X1RQRkxBR1NfVkFMSURfVkVSU0lPTl9UQUcgaXMgbmV2ZXIgc2V0IGlmCi0JICAgICBQeV9UUEZMQUdTX0hBVkVfVkVSU0lPTl9UQUcgaXMgbm90IHNldCAoZS5nLiBvbiB0eXBlCi0JICAgICBvYmplY3RzIGNvbWluZyBmcm9tIG5vbi1yZWNvbXBpbGVkIGV4dGVuc2lvbiBtb2R1bGVzKQorICAgICAgIC0gUHlfVFBGTEFHU19WQUxJRF9WRVJTSU9OX1RBRyBpcyBuZXZlciBzZXQgaWYKKyAgICAgICAgIFB5X1RQRkxBR1NfSEFWRV9WRVJTSU9OX1RBRyBpcyBub3Qgc2V0IChlLmcuIG9uIHR5cGUKKyAgICAgICAgIG9iamVjdHMgY29taW5nIGZyb20gbm9uLXJlY29tcGlsZWQgZXh0ZW5zaW9uIG1vZHVsZXMpCiAKLQkgICAtIGJlZm9yZSBQeV9UUEZMQUdTX1ZBTElEX1ZFUlNJT05fVEFHIGNhbiBiZSBzZXQgb24gYSB0eXBlLAotCSAgICAgaXQgbXVzdCBmaXJzdCBiZSBzZXQgb24gYWxsIHN1cGVyIHR5cGVzLgorICAgICAgIC0gYmVmb3JlIFB5X1RQRkxBR1NfVkFMSURfVkVSU0lPTl9UQUcgY2FuIGJlIHNldCBvbiBhIHR5cGUsCisgICAgICAgICBpdCBtdXN0IGZpcnN0IGJlIHNldCBvbiBhbGwgc3VwZXIgdHlwZXMuCiAKLQkgICBUaGlzIGZ1bmN0aW9uIGNsZWFycyB0aGUgUHlfVFBGTEFHU19WQUxJRF9WRVJTSU9OX1RBRyBvZiBhCi0JICAgdHlwZSAoc28gaXQgbXVzdCBmaXJzdCBjbGVhciBpdCBvbiBhbGwgc3ViY2xhc3NlcykuICBUaGUKLQkgICB0cF92ZXJzaW9uX3RhZyB2YWx1ZSBpcyBtZWFuaW5nbGVzcyB1bmxlc3MgdGhpcyBmbGFnIGlzIHNldC4KLQkgICBXZSBkb24ndCBhc3NpZ24gbmV3IHZlcnNpb24gdGFncyBlYWdlcmx5LCBidXQgb25seSBhcwotCSAgIG5lZWRlZC4KLQkgKi8KLQlQeU9iamVjdCAqcmF3LCAqcmVmOwotCVB5X3NzaXplX3QgaSwgbjsKKyAgICAgICBUaGlzIGZ1bmN0aW9uIGNsZWFycyB0aGUgUHlfVFBGTEFHU19WQUxJRF9WRVJTSU9OX1RBRyBvZiBhCisgICAgICAgdHlwZSAoc28gaXQgbXVzdCBmaXJzdCBjbGVhciBpdCBvbiBhbGwgc3ViY2xhc3NlcykuICBUaGUKKyAgICAgICB0cF92ZXJzaW9uX3RhZyB2YWx1ZSBpcyBtZWFuaW5nbGVzcyB1bmxlc3MgdGhpcyBmbGFnIGlzIHNldC4KKyAgICAgICBXZSBkb24ndCBhc3NpZ24gbmV3IHZlcnNpb24gdGFncyBlYWdlcmx5LCBidXQgb25seSBhcworICAgICAgIG5lZWRlZC4KKyAgICAgKi8KKyAgICBQeU9iamVjdCAqcmF3LCAqcmVmOworICAgIFB5X3NzaXplX3QgaSwgbjsKIAotCWlmICghUHlUeXBlX0hhc0ZlYXR1cmUodHlwZSwgUHlfVFBGTEFHU19WQUxJRF9WRVJTSU9OX1RBRykpCi0JCXJldHVybjsKKyAgICBpZiAoIVB5VHlwZV9IYXNGZWF0dXJlKHR5cGUsIFB5X1RQRkxBR1NfVkFMSURfVkVSU0lPTl9UQUcpKQorICAgICAgICByZXR1cm47CiAKLQlyYXcgPSB0eXBlLT50cF9zdWJjbGFzc2VzOwotCWlmIChyYXcgIT0gTlVMTCkgewotCQluID0gUHlMaXN0X0dFVF9TSVpFKHJhdyk7Ci0JCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJCXJlZiA9IFB5TGlzdF9HRVRfSVRFTShyYXcsIGkpOwotCQkJcmVmID0gUHlXZWFrcmVmX0dFVF9PQkpFQ1QocmVmKTsKLQkJCWlmIChyZWYgIT0gUHlfTm9uZSkgewotCQkJCVB5VHlwZV9Nb2RpZmllZCgoUHlUeXBlT2JqZWN0ICopcmVmKTsKLQkJCX0KLQkJfQotCX0KLQl0eXBlLT50cF9mbGFncyAmPSB+UHlfVFBGTEFHU19WQUxJRF9WRVJTSU9OX1RBRzsKKyAgICByYXcgPSB0eXBlLT50cF9zdWJjbGFzc2VzOworICAgIGlmIChyYXcgIT0gTlVMTCkgeworICAgICAgICBuID0gUHlMaXN0X0dFVF9TSVpFKHJhdyk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICAgIHJlZiA9IFB5TGlzdF9HRVRfSVRFTShyYXcsIGkpOworICAgICAgICAgICAgcmVmID0gUHlXZWFrcmVmX0dFVF9PQkpFQ1QocmVmKTsKKyAgICAgICAgICAgIGlmIChyZWYgIT0gUHlfTm9uZSkgeworICAgICAgICAgICAgICAgIFB5VHlwZV9Nb2RpZmllZCgoUHlUeXBlT2JqZWN0ICopcmVmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICB0eXBlLT50cF9mbGFncyAmPSB+UHlfVFBGTEFHU19WQUxJRF9WRVJTSU9OX1RBRzsKIH0KIAogc3RhdGljIHZvaWQKIHR5cGVfbXJvX21vZGlmaWVkKFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmJhc2VzKSB7Ci0JLyoKLQkgICBDaGVjayB0aGF0IGFsbCBiYXNlIGNsYXNzZXMgb3IgZWxlbWVudHMgb2YgdGhlIG1ybyBvZiB0eXBlIGFyZQotCSAgIGFibGUgdG8gYmUgY2FjaGVkLiAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYWZ0ZXIgdGhlIGJhc2UKLQkgICBjbGFzc2VzIG9yIG1ybyBvZiB0aGUgdHlwZSBhcmUgYWx0ZXJlZC4KKyAgICAvKgorICAgICAgIENoZWNrIHRoYXQgYWxsIGJhc2UgY2xhc3NlcyBvciBlbGVtZW50cyBvZiB0aGUgbXJvIG9mIHR5cGUgYXJlCisgICAgICAgYWJsZSB0byBiZSBjYWNoZWQuICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhZnRlciB0aGUgYmFzZQorICAgICAgIGNsYXNzZXMgb3IgbXJvIG9mIHRoZSB0eXBlIGFyZSBhbHRlcmVkLgogCi0JICAgVW5zZXQgSEFWRV9WRVJTSU9OX1RBRyBhbmQgVkFMSURfVkVSU0lPTl9UQUcgaWYgdGhlIHR5cGUKLQkgICBpbmhlcml0cyBmcm9tIGFuIG9sZC1zdHlsZSBjbGFzcywgZWl0aGVyIGRpcmVjdGx5IG9yIGlmIGl0Ci0JICAgYXBwZWFycyBpbiB0aGUgTVJPIG9mIGEgbmV3LXN0eWxlIGNsYXNzLiAgTm8gc3VwcG9ydCBlaXRoZXIgZm9yCi0JICAgY3VzdG9tIE1ST3MgdGhhdCBpbmNsdWRlIHR5cGVzIHRoYXQgYXJlIG5vdCBvZmZpY2lhbGx5IHN1cGVyCi0JICAgdHlwZXMuCisgICAgICAgVW5zZXQgSEFWRV9WRVJTSU9OX1RBRyBhbmQgVkFMSURfVkVSU0lPTl9UQUcgaWYgdGhlIHR5cGUKKyAgICAgICBpbmhlcml0cyBmcm9tIGFuIG9sZC1zdHlsZSBjbGFzcywgZWl0aGVyIGRpcmVjdGx5IG9yIGlmIGl0CisgICAgICAgYXBwZWFycyBpbiB0aGUgTVJPIG9mIGEgbmV3LXN0eWxlIGNsYXNzLiAgTm8gc3VwcG9ydCBlaXRoZXIgZm9yCisgICAgICAgY3VzdG9tIE1ST3MgdGhhdCBpbmNsdWRlIHR5cGVzIHRoYXQgYXJlIG5vdCBvZmZpY2lhbGx5IHN1cGVyCisgICAgICAgdHlwZXMuCiAKLQkgICBDYWxsZWQgZnJvbSBtcm9faW50ZXJuYWwsIHdoaWNoIHdpbGwgc3Vic2VxdWVudGx5IGJlIGNhbGxlZCBvbgotCSAgIGVhY2ggc3ViY2xhc3Mgd2hlbiB0aGVpciBtcm8gaXMgcmVjdXJzaXZlbHkgdXBkYXRlZC4KLQkgKi8KLQlQeV9zc2l6ZV90IGksIG47Ci0JaW50IGNsZWFyID0gMDsKKyAgICAgICBDYWxsZWQgZnJvbSBtcm9faW50ZXJuYWwsIHdoaWNoIHdpbGwgc3Vic2VxdWVudGx5IGJlIGNhbGxlZCBvbgorICAgICAgIGVhY2ggc3ViY2xhc3Mgd2hlbiB0aGVpciBtcm8gaXMgcmVjdXJzaXZlbHkgdXBkYXRlZC4KKyAgICAgKi8KKyAgICBQeV9zc2l6ZV90IGksIG47CisgICAgaW50IGNsZWFyID0gMDsKIAotCWlmICghUHlUeXBlX0hhc0ZlYXR1cmUodHlwZSwgUHlfVFBGTEFHU19IQVZFX1ZFUlNJT05fVEFHKSkKLQkJcmV0dXJuOworICAgIGlmICghUHlUeXBlX0hhc0ZlYXR1cmUodHlwZSwgUHlfVFBGTEFHU19IQVZFX1ZFUlNJT05fVEFHKSkKKyAgICAgICAgcmV0dXJuOwogCi0JbiA9IFB5VHVwbGVfR0VUX1NJWkUoYmFzZXMpOwotCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJUHlPYmplY3QgKmIgPSBQeVR1cGxlX0dFVF9JVEVNKGJhc2VzLCBpKTsKLQkJUHlUeXBlT2JqZWN0ICpjbHM7CisgICAgbiA9IFB5VHVwbGVfR0VUX1NJWkUoYmFzZXMpOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgUHlPYmplY3QgKmIgPSBQeVR1cGxlX0dFVF9JVEVNKGJhc2VzLCBpKTsKKyAgICAgICAgUHlUeXBlT2JqZWN0ICpjbHM7CiAKLQkJaWYgKCFQeVR5cGVfQ2hlY2soYikgKSB7Ci0JCQljbGVhciA9IDE7Ci0JCQlicmVhazsKLQkJfQorICAgICAgICBpZiAoIVB5VHlwZV9DaGVjayhiKSApIHsKKyAgICAgICAgICAgIGNsZWFyID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CiAKLQkJY2xzID0gKFB5VHlwZU9iamVjdCAqKWI7CisgICAgICAgIGNscyA9IChQeVR5cGVPYmplY3QgKiliOwogCi0JCWlmICghUHlUeXBlX0hhc0ZlYXR1cmUoY2xzLCBQeV9UUEZMQUdTX0hBVkVfVkVSU0lPTl9UQUcpIHx8Ci0JCSAgICAhUHlUeXBlX0lzU3VidHlwZSh0eXBlLCBjbHMpKSB7Ci0JCQljbGVhciA9IDE7Ci0JCQlicmVhazsKLQkJfQotCX0KKyAgICAgICAgaWYgKCFQeVR5cGVfSGFzRmVhdHVyZShjbHMsIFB5X1RQRkxBR1NfSEFWRV9WRVJTSU9OX1RBRykgfHwKKyAgICAgICAgICAgICFQeVR5cGVfSXNTdWJ0eXBlKHR5cGUsIGNscykpIHsKKyAgICAgICAgICAgIGNsZWFyID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQogCi0JaWYgKGNsZWFyKQotCQl0eXBlLT50cF9mbGFncyAmPSB+KFB5X1RQRkxBR1NfSEFWRV9WRVJTSU9OX1RBR3wKLQkJICAgICAgICAgICAgICAgICAgICBQeV9UUEZMQUdTX1ZBTElEX1ZFUlNJT05fVEFHKTsKKyAgICBpZiAoY2xlYXIpCisgICAgICAgIHR5cGUtPnRwX2ZsYWdzICY9IH4oUHlfVFBGTEFHU19IQVZFX1ZFUlNJT05fVEFHfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X1RQRkxBR1NfVkFMSURfVkVSU0lPTl9UQUcpOwogfQogCiBzdGF0aWMgaW50CiBhc3NpZ25fdmVyc2lvbl90YWcoUHlUeXBlT2JqZWN0ICp0eXBlKQogewotCS8qIEVuc3VyZSB0aGF0IHRoZSB0cF92ZXJzaW9uX3RhZyBpcyB2YWxpZCBhbmQgc2V0Ci0JICAgUHlfVFBGTEFHU19WQUxJRF9WRVJTSU9OX1RBRy4gIFRvIHJlc3BlY3QgdGhlIGludmFyaWFudCwgdGhpcwotCSAgIG11c3QgZmlyc3QgYmUgZG9uZSBvbiBhbGwgc3VwZXIgY2xhc3Nlcy4gIFJldHVybiAwIGlmIHRoaXMKLQkgICBjYW5ub3QgYmUgZG9uZSwgMSBpZiBQeV9UUEZMQUdTX1ZBTElEX1ZFUlNJT05fVEFHLgotCSovCi0JUHlfc3NpemVfdCBpLCBuOwotCVB5T2JqZWN0ICpiYXNlczsKKyAgICAvKiBFbnN1cmUgdGhhdCB0aGUgdHBfdmVyc2lvbl90YWcgaXMgdmFsaWQgYW5kIHNldAorICAgICAgIFB5X1RQRkxBR1NfVkFMSURfVkVSU0lPTl9UQUcuICBUbyByZXNwZWN0IHRoZSBpbnZhcmlhbnQsIHRoaXMKKyAgICAgICBtdXN0IGZpcnN0IGJlIGRvbmUgb24gYWxsIHN1cGVyIGNsYXNzZXMuICBSZXR1cm4gMCBpZiB0aGlzCisgICAgICAgY2Fubm90IGJlIGRvbmUsIDEgaWYgUHlfVFBGTEFHU19WQUxJRF9WRVJTSU9OX1RBRy4KKyAgICAqLworICAgIFB5X3NzaXplX3QgaSwgbjsKKyAgICBQeU9iamVjdCAqYmFzZXM7CiAKLQlpZiAoUHlUeXBlX0hhc0ZlYXR1cmUodHlwZSwgUHlfVFBGTEFHU19WQUxJRF9WRVJTSU9OX1RBRykpCi0JCXJldHVybiAxOwotCWlmICghUHlUeXBlX0hhc0ZlYXR1cmUodHlwZSwgUHlfVFBGTEFHU19IQVZFX1ZFUlNJT05fVEFHKSkKLQkJcmV0dXJuIDA7Ci0JaWYgKCFQeVR5cGVfSGFzRmVhdHVyZSh0eXBlLCBQeV9UUEZMQUdTX1JFQURZKSkKLQkJcmV0dXJuIDA7CisgICAgaWYgKFB5VHlwZV9IYXNGZWF0dXJlKHR5cGUsIFB5X1RQRkxBR1NfVkFMSURfVkVSU0lPTl9UQUcpKQorICAgICAgICByZXR1cm4gMTsKKyAgICBpZiAoIVB5VHlwZV9IYXNGZWF0dXJlKHR5cGUsIFB5X1RQRkxBR1NfSEFWRV9WRVJTSU9OX1RBRykpCisgICAgICAgIHJldHVybiAwOworICAgIGlmICghUHlUeXBlX0hhc0ZlYXR1cmUodHlwZSwgUHlfVFBGTEFHU19SRUFEWSkpCisgICAgICAgIHJldHVybiAwOwogCi0JdHlwZS0+dHBfdmVyc2lvbl90YWcgPSBuZXh0X3ZlcnNpb25fdGFnKys7Ci0JLyogZm9yIHN0cmVzcy10ZXN0aW5nOiBuZXh0X3ZlcnNpb25fdGFnICY9IDB4RkY7ICovCisgICAgdHlwZS0+dHBfdmVyc2lvbl90YWcgPSBuZXh0X3ZlcnNpb25fdGFnKys7CisgICAgLyogZm9yIHN0cmVzcy10ZXN0aW5nOiBuZXh0X3ZlcnNpb25fdGFnICY9IDB4RkY7ICovCiAKLQlpZiAodHlwZS0+dHBfdmVyc2lvbl90YWcgPT0gMCkgewotCQkvKiB3cmFwLWFyb3VuZCBvciBqdXN0IHN0YXJ0aW5nIFB5dGhvbiAtIGNsZWFyIHRoZSB3aG9sZQotCQkgICBjYWNoZSBieSBmaWxsaW5nIG5hbWVzIHdpdGggcmVmZXJlbmNlcyB0byBQeV9Ob25lLgotCQkgICBWYWx1ZXMgYXJlIGFsc28gc2V0IHRvIE5VTEwgZm9yIGFkZGVkIHByb3RlY3Rpb24sIGFzIHRoZXkKLQkJICAgYXJlIGJvcnJvd2VkIHJlZmVyZW5jZSAqLwotCQlmb3IgKGkgPSAwOyBpIDwgKDEgPDwgTUNBQ0hFX1NJWkVfRVhQKTsgaSsrKSB7Ci0JCQltZXRob2RfY2FjaGVbaV0udmFsdWUgPSBOVUxMOwotCQkJUHlfWERFQ1JFRihtZXRob2RfY2FjaGVbaV0ubmFtZSk7Ci0JCQltZXRob2RfY2FjaGVbaV0ubmFtZSA9IFB5X05vbmU7Ci0JCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCX0KLQkJLyogbWFyayBhbGwgdmVyc2lvbiB0YWdzIGFzIGludmFsaWQgKi8KLQkJUHlUeXBlX01vZGlmaWVkKCZQeUJhc2VPYmplY3RfVHlwZSk7Ci0JCXJldHVybiAxOwotCX0KLQliYXNlcyA9IHR5cGUtPnRwX2Jhc2VzOwotCW4gPSBQeVR1cGxlX0dFVF9TSVpFKGJhc2VzKTsKLQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCVB5T2JqZWN0ICpiID0gUHlUdXBsZV9HRVRfSVRFTShiYXNlcywgaSk7Ci0JCWFzc2VydChQeVR5cGVfQ2hlY2soYikpOwotCQlpZiAoIWFzc2lnbl92ZXJzaW9uX3RhZygoUHlUeXBlT2JqZWN0ICopYikpCi0JCQlyZXR1cm4gMDsKLQl9Ci0JdHlwZS0+dHBfZmxhZ3MgfD0gUHlfVFBGTEFHU19WQUxJRF9WRVJTSU9OX1RBRzsKLQlyZXR1cm4gMTsKKyAgICBpZiAodHlwZS0+dHBfdmVyc2lvbl90YWcgPT0gMCkgeworICAgICAgICAvKiB3cmFwLWFyb3VuZCBvciBqdXN0IHN0YXJ0aW5nIFB5dGhvbiAtIGNsZWFyIHRoZSB3aG9sZQorICAgICAgICAgICBjYWNoZSBieSBmaWxsaW5nIG5hbWVzIHdpdGggcmVmZXJlbmNlcyB0byBQeV9Ob25lLgorICAgICAgICAgICBWYWx1ZXMgYXJlIGFsc28gc2V0IHRvIE5VTEwgZm9yIGFkZGVkIHByb3RlY3Rpb24sIGFzIHRoZXkKKyAgICAgICAgICAgYXJlIGJvcnJvd2VkIHJlZmVyZW5jZSAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKDEgPDwgTUNBQ0hFX1NJWkVfRVhQKTsgaSsrKSB7CisgICAgICAgICAgICBtZXRob2RfY2FjaGVbaV0udmFsdWUgPSBOVUxMOworICAgICAgICAgICAgUHlfWERFQ1JFRihtZXRob2RfY2FjaGVbaV0ubmFtZSk7CisgICAgICAgICAgICBtZXRob2RfY2FjaGVbaV0ubmFtZSA9IFB5X05vbmU7CisgICAgICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIH0KKyAgICAgICAgLyogbWFyayBhbGwgdmVyc2lvbiB0YWdzIGFzIGludmFsaWQgKi8KKyAgICAgICAgUHlUeXBlX01vZGlmaWVkKCZQeUJhc2VPYmplY3RfVHlwZSk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBiYXNlcyA9IHR5cGUtPnRwX2Jhc2VzOworICAgIG4gPSBQeVR1cGxlX0dFVF9TSVpFKGJhc2VzKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIFB5T2JqZWN0ICpiID0gUHlUdXBsZV9HRVRfSVRFTShiYXNlcywgaSk7CisgICAgICAgIGFzc2VydChQeVR5cGVfQ2hlY2soYikpOworICAgICAgICBpZiAoIWFzc2lnbl92ZXJzaW9uX3RhZygoUHlUeXBlT2JqZWN0ICopYikpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgdHlwZS0+dHBfZmxhZ3MgfD0gUHlfVFBGTEFHU19WQUxJRF9WRVJTSU9OX1RBRzsKKyAgICByZXR1cm4gMTsKIH0KIAogCiBzdGF0aWMgUHlNZW1iZXJEZWYgdHlwZV9tZW1iZXJzW10gPSB7Ci0JeyJfX2Jhc2ljc2l6ZV9fIiwgVF9JTlQsIG9mZnNldG9mKFB5VHlwZU9iamVjdCx0cF9iYXNpY3NpemUpLFJFQURPTkxZfSwKLQl7Il9faXRlbXNpemVfXyIsIFRfSU5ULCBvZmZzZXRvZihQeVR5cGVPYmplY3QsIHRwX2l0ZW1zaXplKSwgUkVBRE9OTFl9LAotCXsiX19mbGFnc19fIiwgVF9MT05HLCBvZmZzZXRvZihQeVR5cGVPYmplY3QsIHRwX2ZsYWdzKSwgUkVBRE9OTFl9LAotCXsiX193ZWFrcmVmb2Zmc2V0X18iLCBUX0xPTkcsCi0JIG9mZnNldG9mKFB5VHlwZU9iamVjdCwgdHBfd2Vha2xpc3RvZmZzZXQpLCBSRUFET05MWX0sCi0JeyJfX2Jhc2VfXyIsIFRfT0JKRUNULCBvZmZzZXRvZihQeVR5cGVPYmplY3QsIHRwX2Jhc2UpLCBSRUFET05MWX0sCi0JeyJfX2RpY3RvZmZzZXRfXyIsIFRfTE9ORywKLQkgb2Zmc2V0b2YoUHlUeXBlT2JqZWN0LCB0cF9kaWN0b2Zmc2V0KSwgUkVBRE9OTFl9LAotCXsiX19tcm9fXyIsIFRfT0JKRUNULCBvZmZzZXRvZihQeVR5cGVPYmplY3QsIHRwX21ybyksIFJFQURPTkxZfSwKLQl7MH0KKyAgICB7Il9fYmFzaWNzaXplX18iLCBUX0lOVCwgb2Zmc2V0b2YoUHlUeXBlT2JqZWN0LHRwX2Jhc2ljc2l6ZSksUkVBRE9OTFl9LAorICAgIHsiX19pdGVtc2l6ZV9fIiwgVF9JTlQsIG9mZnNldG9mKFB5VHlwZU9iamVjdCwgdHBfaXRlbXNpemUpLCBSRUFET05MWX0sCisgICAgeyJfX2ZsYWdzX18iLCBUX0xPTkcsIG9mZnNldG9mKFB5VHlwZU9iamVjdCwgdHBfZmxhZ3MpLCBSRUFET05MWX0sCisgICAgeyJfX3dlYWtyZWZvZmZzZXRfXyIsIFRfTE9ORywKKyAgICAgb2Zmc2V0b2YoUHlUeXBlT2JqZWN0LCB0cF93ZWFrbGlzdG9mZnNldCksIFJFQURPTkxZfSwKKyAgICB7Il9fYmFzZV9fIiwgVF9PQkpFQ1QsIG9mZnNldG9mKFB5VHlwZU9iamVjdCwgdHBfYmFzZSksIFJFQURPTkxZfSwKKyAgICB7Il9fZGljdG9mZnNldF9fIiwgVF9MT05HLAorICAgICBvZmZzZXRvZihQeVR5cGVPYmplY3QsIHRwX2RpY3RvZmZzZXQpLCBSRUFET05MWX0sCisgICAgeyJfX21yb19fIiwgVF9PQkpFQ1QsIG9mZnNldG9mKFB5VHlwZU9iamVjdCwgdHBfbXJvKSwgUkVBRE9OTFl9LAorICAgIHswfQogfTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIHR5cGVfbmFtZShQeVR5cGVPYmplY3QgKnR5cGUsIHZvaWQgKmNvbnRleHQpCiB7Ci0JY29uc3QgY2hhciAqczsKKyAgICBjb25zdCBjaGFyICpzOwogCi0JaWYgKHR5cGUtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IRUFQVFlQRSkgewotCQlQeUhlYXBUeXBlT2JqZWN0KiBldCA9IChQeUhlYXBUeXBlT2JqZWN0Kil0eXBlOworICAgIGlmICh0eXBlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEVBUFRZUEUpIHsKKyAgICAgICAgUHlIZWFwVHlwZU9iamVjdCogZXQgPSAoUHlIZWFwVHlwZU9iamVjdCopdHlwZTsKIAotCQlQeV9JTkNSRUYoZXQtPmh0X25hbWUpOwotCQlyZXR1cm4gZXQtPmh0X25hbWU7Ci0JfQotCWVsc2UgewotCQlzID0gc3RycmNocih0eXBlLT50cF9uYW1lLCAnLicpOwotCQlpZiAocyA9PSBOVUxMKQotCQkJcyA9IHR5cGUtPnRwX25hbWU7Ci0JCWVsc2UKLQkJCXMrKzsKLQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcocyk7Ci0JfQorICAgICAgICBQeV9JTkNSRUYoZXQtPmh0X25hbWUpOworICAgICAgICByZXR1cm4gZXQtPmh0X25hbWU7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBzID0gc3RycmNocih0eXBlLT50cF9uYW1lLCAnLicpOworICAgICAgICBpZiAocyA9PSBOVUxMKQorICAgICAgICAgICAgcyA9IHR5cGUtPnRwX25hbWU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHMrKzsKKyAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcocyk7CisgICAgfQogfQogCiBzdGF0aWMgaW50CiB0eXBlX3NldF9uYW1lKFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKnZhbHVlLCB2b2lkICpjb250ZXh0KQogewotCVB5SGVhcFR5cGVPYmplY3QqIGV0OworICAgIFB5SGVhcFR5cGVPYmplY3QqIGV0OwogCi0JaWYgKCEodHlwZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hFQVBUWVBFKSkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJICAgICAiY2FuJ3Qgc2V0ICVzLl9fbmFtZV9fIiwgdHlwZS0+dHBfbmFtZSk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKCF2YWx1ZSkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJICAgICAiY2FuJ3QgZGVsZXRlICVzLl9fbmFtZV9fIiwgdHlwZS0+dHBfbmFtZSk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKCFQeVN0cmluZ19DaGVjayh2YWx1ZSkpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAgImNhbiBvbmx5IGFzc2lnbiBzdHJpbmcgdG8gJXMuX19uYW1lX18sIG5vdCAnJXMnIiwKLQkJCSAgICAgdHlwZS0+dHBfbmFtZSwgUHlfVFlQRSh2YWx1ZSktPnRwX25hbWUpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmIChzdHJsZW4oUHlTdHJpbmdfQVNfU1RSSU5HKHZhbHVlKSkKLQkgICAgIT0gKHNpemVfdClQeVN0cmluZ19HRVRfU0laRSh2YWx1ZSkpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkgICAgICJfX25hbWVfXyBtdXN0IG5vdCBjb250YWluIG51bGwgYnl0ZXMiKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICBpZiAoISh0eXBlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEVBUFRZUEUpKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiY2FuJ3Qgc2V0ICVzLl9fbmFtZV9fIiwgdHlwZS0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKCF2YWx1ZSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgImNhbid0IGRlbGV0ZSAlcy5fX25hbWVfXyIsIHR5cGUtPnRwX25hbWUpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICghUHlTdHJpbmdfQ2hlY2sodmFsdWUpKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiY2FuIG9ubHkgYXNzaWduIHN0cmluZyB0byAlcy5fX25hbWVfXywgbm90ICclcyciLAorICAgICAgICAgICAgICAgICAgICAgdHlwZS0+dHBfbmFtZSwgUHlfVFlQRSh2YWx1ZSktPnRwX25hbWUpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChzdHJsZW4oUHlTdHJpbmdfQVNfU1RSSU5HKHZhbHVlKSkKKyAgICAgICAgIT0gKHNpemVfdClQeVN0cmluZ19HRVRfU0laRSh2YWx1ZSkpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiX19uYW1lX18gbXVzdCBub3QgY29udGFpbiBudWxsIGJ5dGVzIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQlldCA9IChQeUhlYXBUeXBlT2JqZWN0Kil0eXBlOworICAgIGV0ID0gKFB5SGVhcFR5cGVPYmplY3QqKXR5cGU7CiAKLQlQeV9JTkNSRUYodmFsdWUpOworICAgIFB5X0lOQ1JFRih2YWx1ZSk7CiAKLQlQeV9ERUNSRUYoZXQtPmh0X25hbWUpOwotCWV0LT5odF9uYW1lID0gdmFsdWU7CisgICAgUHlfREVDUkVGKGV0LT5odF9uYW1lKTsKKyAgICBldC0+aHRfbmFtZSA9IHZhbHVlOwogCi0JdHlwZS0+dHBfbmFtZSA9IFB5U3RyaW5nX0FTX1NUUklORyh2YWx1ZSk7CisgICAgdHlwZS0+dHBfbmFtZSA9IFB5U3RyaW5nX0FTX1NUUklORyh2YWx1ZSk7CiAKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHR5cGVfbW9kdWxlKFB5VHlwZU9iamVjdCAqdHlwZSwgdm9pZCAqY29udGV4dCkKIHsKLQlQeU9iamVjdCAqbW9kOwotCWNoYXIgKnM7CisgICAgUHlPYmplY3QgKm1vZDsKKyAgICBjaGFyICpzOwogCi0JaWYgKHR5cGUtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IRUFQVFlQRSkgewotCQltb2QgPSBQeURpY3RfR2V0SXRlbVN0cmluZyh0eXBlLT50cF9kaWN0LCAiX19tb2R1bGVfXyIpOwotCQlpZiAoIW1vZCkgeyAKLQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19BdHRyaWJ1dGVFcnJvciwgIl9fbW9kdWxlX18iKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JCVB5X1hJTkNSRUYobW9kKTsKLQkJcmV0dXJuIG1vZDsKLQl9Ci0JZWxzZSB7Ci0JCXMgPSBzdHJyY2hyKHR5cGUtPnRwX25hbWUsICcuJyk7Ci0JCWlmIChzICE9IE5VTEwpCi0JCQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoCi0JCQkgICAgdHlwZS0+dHBfbmFtZSwgKFB5X3NzaXplX3QpKHMgLSB0eXBlLT50cF9uYW1lKSk7Ci0JCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKCJfX2J1aWx0aW5fXyIpOwotCX0KKyAgICBpZiAodHlwZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hFQVBUWVBFKSB7CisgICAgICAgIG1vZCA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKHR5cGUtPnRwX2RpY3QsICJfX21vZHVsZV9fIik7CisgICAgICAgIGlmICghbW9kKSB7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfQXR0cmlidXRlRXJyb3IsICJfX21vZHVsZV9fIik7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBQeV9YSU5DUkVGKG1vZCk7CisgICAgICAgIHJldHVybiBtb2Q7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBzID0gc3RycmNocih0eXBlLT50cF9uYW1lLCAnLicpOworICAgICAgICBpZiAocyAhPSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKAorICAgICAgICAgICAgICAgIHR5cGUtPnRwX25hbWUsIChQeV9zc2l6ZV90KShzIC0gdHlwZS0+dHBfbmFtZSkpOworICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZygiX19idWlsdGluX18iKTsKKyAgICB9CiB9CiAKIHN0YXRpYyBpbnQKIHR5cGVfc2V0X21vZHVsZShQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICp2YWx1ZSwgdm9pZCAqY29udGV4dCkKIHsKLQlpZiAoISh0eXBlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEVBUFRZUEUpKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgICJjYW4ndCBzZXQgJXMuX19tb2R1bGVfXyIsIHR5cGUtPnRwX25hbWUpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmICghdmFsdWUpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAgImNhbid0IGRlbGV0ZSAlcy5fX21vZHVsZV9fIiwgdHlwZS0+dHBfbmFtZSk7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgaWYgKCEodHlwZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hFQVBUWVBFKSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgImNhbid0IHNldCAlcy5fX21vZHVsZV9fIiwgdHlwZS0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKCF2YWx1ZSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgImNhbid0IGRlbGV0ZSAlcy5fX21vZHVsZV9fIiwgdHlwZS0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQlQeVR5cGVfTW9kaWZpZWQodHlwZSk7CisgICAgUHlUeXBlX01vZGlmaWVkKHR5cGUpOwogCi0JcmV0dXJuIFB5RGljdF9TZXRJdGVtU3RyaW5nKHR5cGUtPnRwX2RpY3QsICJfX21vZHVsZV9fIiwgdmFsdWUpOworICAgIHJldHVybiBQeURpY3RfU2V0SXRlbVN0cmluZyh0eXBlLT50cF9kaWN0LCAiX19tb2R1bGVfXyIsIHZhbHVlKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHR5cGVfYWJzdHJhY3RtZXRob2RzKFB5VHlwZU9iamVjdCAqdHlwZSwgdm9pZCAqY29udGV4dCkKIHsKLQlQeU9iamVjdCAqbW9kID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcodHlwZS0+dHBfZGljdCwKLQkJCQkJICAgICAiX19hYnN0cmFjdG1ldGhvZHNfXyIpOwotCWlmICghbW9kKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19BdHRyaWJ1dGVFcnJvciwgIl9fYWJzdHJhY3RtZXRob2RzX18iKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5X1hJTkNSRUYobW9kKTsKLQlyZXR1cm4gbW9kOworICAgIFB5T2JqZWN0ICptb2QgPSBQeURpY3RfR2V0SXRlbVN0cmluZyh0eXBlLT50cF9kaWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX19hYnN0cmFjdG1ldGhvZHNfXyIpOworICAgIGlmICghbW9kKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19BdHRyaWJ1dGVFcnJvciwgIl9fYWJzdHJhY3RtZXRob2RzX18iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5X1hJTkNSRUYobW9kKTsKKyAgICByZXR1cm4gbW9kOwogfQogCiBzdGF0aWMgaW50CiB0eXBlX3NldF9hYnN0cmFjdG1ldGhvZHMoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqdmFsdWUsIHZvaWQgKmNvbnRleHQpCiB7Ci0JLyogX19hYnN0cmFjdG1ldGhvZHNfXyBzaG91bGQgb25seSBiZSBzZXQgb25jZSBvbiBhIHR5cGUsIGluCi0JICAgYWJjLkFCQ01ldGEuX19uZXdfXywgc28gdGhpcyBmdW5jdGlvbiBkb2Vzbid0IGRvIGFueXRoaW5nCi0JICAgc3BlY2lhbCB0byB1cGRhdGUgc3ViY2xhc3Nlcy4KLQkqLwotCWludCByZXMgPSBQeURpY3RfU2V0SXRlbVN0cmluZyh0eXBlLT50cF9kaWN0LAotCQkJCSAgICAgICAiX19hYnN0cmFjdG1ldGhvZHNfXyIsIHZhbHVlKTsKLQlpZiAocmVzID09IDApIHsKLQkJUHlUeXBlX01vZGlmaWVkKHR5cGUpOwotCQlpZiAodmFsdWUgJiYgUHlPYmplY3RfSXNUcnVlKHZhbHVlKSkgewotCQkJdHlwZS0+dHBfZmxhZ3MgfD0gUHlfVFBGTEFHU19JU19BQlNUUkFDVDsKLQkJfQotCQllbHNlIHsKLQkJCXR5cGUtPnRwX2ZsYWdzICY9IH5QeV9UUEZMQUdTX0lTX0FCU1RSQUNUOwotCQl9Ci0JfQotCXJldHVybiByZXM7CisgICAgLyogX19hYnN0cmFjdG1ldGhvZHNfXyBzaG91bGQgb25seSBiZSBzZXQgb25jZSBvbiBhIHR5cGUsIGluCisgICAgICAgYWJjLkFCQ01ldGEuX19uZXdfXywgc28gdGhpcyBmdW5jdGlvbiBkb2Vzbid0IGRvIGFueXRoaW5nCisgICAgICAgc3BlY2lhbCB0byB1cGRhdGUgc3ViY2xhc3Nlcy4KKyAgICAqLworICAgIGludCByZXMgPSBQeURpY3RfU2V0SXRlbVN0cmluZyh0eXBlLT50cF9kaWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX19hYnN0cmFjdG1ldGhvZHNfXyIsIHZhbHVlKTsKKyAgICBpZiAocmVzID09IDApIHsKKyAgICAgICAgUHlUeXBlX01vZGlmaWVkKHR5cGUpOworICAgICAgICBpZiAodmFsdWUgJiYgUHlPYmplY3RfSXNUcnVlKHZhbHVlKSkgeworICAgICAgICAgICAgdHlwZS0+dHBfZmxhZ3MgfD0gUHlfVFBGTEFHU19JU19BQlNUUkFDVDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHR5cGUtPnRwX2ZsYWdzICY9IH5QeV9UUEZMQUdTX0lTX0FCU1RSQUNUOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB0eXBlX2dldF9iYXNlcyhQeVR5cGVPYmplY3QgKnR5cGUsIHZvaWQgKmNvbnRleHQpCiB7Ci0JUHlfSU5DUkVGKHR5cGUtPnRwX2Jhc2VzKTsKLQlyZXR1cm4gdHlwZS0+dHBfYmFzZXM7CisgICAgUHlfSU5DUkVGKHR5cGUtPnRwX2Jhc2VzKTsKKyAgICByZXR1cm4gdHlwZS0+dHBfYmFzZXM7CiB9CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgKmJlc3RfYmFzZShQeU9iamVjdCAqKTsKQEAgLTM1NCw0MzMgKzM1NCw0MzMgQEAKIAogdHlwZWRlZiBpbnQgKCp1cGRhdGVfY2FsbGJhY2spKFB5VHlwZU9iamVjdCAqLCB2b2lkICopOwogc3RhdGljIGludCB1cGRhdGVfc3ViY2xhc3NlcyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICpuYW1lLAotCQkJICAgICB1cGRhdGVfY2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQgKmRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVfY2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQgKmRhdGEpOwogc3RhdGljIGludCByZWN1cnNlX2Rvd25fc3ViY2xhc3NlcyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICpuYW1lLAotCQkJCSAgIHVwZGF0ZV9jYWxsYmFjayBjYWxsYmFjaywgdm9pZCAqZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZV9jYWxsYmFjayBjYWxsYmFjaywgdm9pZCAqZGF0YSk7CiAKIHN0YXRpYyBpbnQKIG1yb19zdWJjbGFzc2VzKFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QqIHRlbXApCiB7Ci0JUHlUeXBlT2JqZWN0ICpzdWJjbGFzczsKLQlQeU9iamVjdCAqcmVmLCAqc3ViY2xhc3NlcywgKm9sZF9tcm87Ci0JUHlfc3NpemVfdCBpLCBuOworICAgIFB5VHlwZU9iamVjdCAqc3ViY2xhc3M7CisgICAgUHlPYmplY3QgKnJlZiwgKnN1YmNsYXNzZXMsICpvbGRfbXJvOworICAgIFB5X3NzaXplX3QgaSwgbjsKIAotCXN1YmNsYXNzZXMgPSB0eXBlLT50cF9zdWJjbGFzc2VzOwotCWlmIChzdWJjbGFzc2VzID09IE5VTEwpCi0JCXJldHVybiAwOwotCWFzc2VydChQeUxpc3RfQ2hlY2soc3ViY2xhc3NlcykpOwotCW4gPSBQeUxpc3RfR0VUX1NJWkUoc3ViY2xhc3Nlcyk7Ci0JZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQlyZWYgPSBQeUxpc3RfR0VUX0lURU0oc3ViY2xhc3NlcywgaSk7Ci0JCWFzc2VydChQeVdlYWtyZWZfQ2hlY2tSZWYocmVmKSk7Ci0JCXN1YmNsYXNzID0gKFB5VHlwZU9iamVjdCAqKVB5V2Vha3JlZl9HRVRfT0JKRUNUKHJlZik7Ci0JCWFzc2VydChzdWJjbGFzcyAhPSBOVUxMKTsKLQkJaWYgKChQeU9iamVjdCAqKXN1YmNsYXNzID09IFB5X05vbmUpCi0JCQljb250aW51ZTsKLQkJYXNzZXJ0KFB5VHlwZV9DaGVjayhzdWJjbGFzcykpOwotCQlvbGRfbXJvID0gc3ViY2xhc3MtPnRwX21ybzsKLQkJaWYgKG1yb19pbnRlcm5hbChzdWJjbGFzcykgPCAwKSB7Ci0JCQlzdWJjbGFzcy0+dHBfbXJvID0gb2xkX21ybzsKLQkJCXJldHVybiAtMTsKLQkJfQotCQllbHNlIHsKLQkJCVB5T2JqZWN0KiB0dXBsZTsKLQkJCXR1cGxlID0gUHlUdXBsZV9QYWNrKDIsIHN1YmNsYXNzLCBvbGRfbXJvKTsKLQkJCVB5X0RFQ1JFRihvbGRfbXJvKTsKLQkJCWlmICghdHVwbGUpCi0JCQkJcmV0dXJuIC0xOwotCQkJaWYgKFB5TGlzdF9BcHBlbmQodGVtcCwgdHVwbGUpIDwgMCkKLQkJCQlyZXR1cm4gLTE7Ci0JCQlQeV9ERUNSRUYodHVwbGUpOwotCQl9Ci0JCWlmIChtcm9fc3ViY2xhc3NlcyhzdWJjbGFzcywgdGVtcCkgPCAwKQotCQkJcmV0dXJuIC0xOwotCX0KLQlyZXR1cm4gMDsKKyAgICBzdWJjbGFzc2VzID0gdHlwZS0+dHBfc3ViY2xhc3NlczsKKyAgICBpZiAoc3ViY2xhc3NlcyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gMDsKKyAgICBhc3NlcnQoUHlMaXN0X0NoZWNrKHN1YmNsYXNzZXMpKTsKKyAgICBuID0gUHlMaXN0X0dFVF9TSVpFKHN1YmNsYXNzZXMpOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgcmVmID0gUHlMaXN0X0dFVF9JVEVNKHN1YmNsYXNzZXMsIGkpOworICAgICAgICBhc3NlcnQoUHlXZWFrcmVmX0NoZWNrUmVmKHJlZikpOworICAgICAgICBzdWJjbGFzcyA9IChQeVR5cGVPYmplY3QgKilQeVdlYWtyZWZfR0VUX09CSkVDVChyZWYpOworICAgICAgICBhc3NlcnQoc3ViY2xhc3MgIT0gTlVMTCk7CisgICAgICAgIGlmICgoUHlPYmplY3QgKilzdWJjbGFzcyA9PSBQeV9Ob25lKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGFzc2VydChQeVR5cGVfQ2hlY2soc3ViY2xhc3MpKTsKKyAgICAgICAgb2xkX21ybyA9IHN1YmNsYXNzLT50cF9tcm87CisgICAgICAgIGlmIChtcm9faW50ZXJuYWwoc3ViY2xhc3MpIDwgMCkgeworICAgICAgICAgICAgc3ViY2xhc3MtPnRwX21ybyA9IG9sZF9tcm87CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBQeU9iamVjdCogdHVwbGU7CisgICAgICAgICAgICB0dXBsZSA9IFB5VHVwbGVfUGFjaygyLCBzdWJjbGFzcywgb2xkX21ybyk7CisgICAgICAgICAgICBQeV9ERUNSRUYob2xkX21ybyk7CisgICAgICAgICAgICBpZiAoIXR1cGxlKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIGlmIChQeUxpc3RfQXBwZW5kKHRlbXAsIHR1cGxlKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgUHlfREVDUkVGKHR1cGxlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobXJvX3N1YmNsYXNzZXMoc3ViY2xhc3MsIHRlbXApIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIHR5cGVfc2V0X2Jhc2VzKFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKnZhbHVlLCB2b2lkICpjb250ZXh0KQogewotCVB5X3NzaXplX3QgaTsKLQlpbnQgciA9IDA7Ci0JUHlPYmplY3QgKm9iLCAqdGVtcDsKLQlQeVR5cGVPYmplY3QgKm5ld19iYXNlLCAqb2xkX2Jhc2U7Ci0JUHlPYmplY3QgKm9sZF9iYXNlcywgKm9sZF9tcm87CisgICAgUHlfc3NpemVfdCBpOworICAgIGludCByID0gMDsKKyAgICBQeU9iamVjdCAqb2IsICp0ZW1wOworICAgIFB5VHlwZU9iamVjdCAqbmV3X2Jhc2UsICpvbGRfYmFzZTsKKyAgICBQeU9iamVjdCAqb2xkX2Jhc2VzLCAqb2xkX21ybzsKIAotCWlmICghKHR5cGUtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IRUFQVFlQRSkpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAgImNhbid0IHNldCAlcy5fX2Jhc2VzX18iLCB0eXBlLT50cF9uYW1lKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoIXZhbHVlKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgICJjYW4ndCBkZWxldGUgJXMuX19iYXNlc19fIiwgdHlwZS0+dHBfbmFtZSk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKCFQeVR1cGxlX0NoZWNrKHZhbHVlKSkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkgICAgICJjYW4gb25seSBhc3NpZ24gdHVwbGUgdG8gJXMuX19iYXNlc19fLCBub3QgJXMiLAotCQkJICAgICB0eXBlLT50cF9uYW1lLCBQeV9UWVBFKHZhbHVlKS0+dHBfbmFtZSk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKFB5VHVwbGVfR0VUX1NJWkUodmFsdWUpID09IDApIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJICAgICAiY2FuIG9ubHkgYXNzaWduIG5vbi1lbXB0eSB0dXBsZSB0byAlcy5fX2Jhc2VzX18sIG5vdCAoKSIsCi0JCQkgICAgIHR5cGUtPnRwX25hbWUpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWZvciAoaSA9IDA7IGkgPCBQeVR1cGxlX0dFVF9TSVpFKHZhbHVlKTsgaSsrKSB7Ci0JCW9iID0gUHlUdXBsZV9HRVRfSVRFTSh2YWx1ZSwgaSk7Ci0JCWlmICghUHlDbGFzc19DaGVjayhvYikgJiYgIVB5VHlwZV9DaGVjayhvYikpIHsKLQkJCVB5RXJyX0Zvcm1hdCgKLQkJCQlQeUV4Y19UeXBlRXJyb3IsCi0JIiVzLl9fYmFzZXNfXyBtdXN0IGJlIHR1cGxlIG9mIG9sZC0gb3IgbmV3LXN0eWxlIGNsYXNzZXMsIG5vdCAnJXMnIiwKLQkJCQl0eXBlLT50cF9uYW1lLCBQeV9UWVBFKG9iKS0+dHBfbmFtZSk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJaWYgKFB5VHlwZV9DaGVjayhvYikpIHsKLQkJCWlmIChQeVR5cGVfSXNTdWJ0eXBlKChQeVR5cGVPYmplY3QqKW9iLCB0eXBlKSkgewotCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkiYSBfX2Jhc2VzX18gaXRlbSBjYXVzZXMgYW4gaW5oZXJpdGFuY2UgY3ljbGUiKTsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQl9CisgICAgaWYgKCEodHlwZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hFQVBUWVBFKSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgImNhbid0IHNldCAlcy5fX2Jhc2VzX18iLCB0eXBlLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoIXZhbHVlKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiY2FuJ3QgZGVsZXRlICVzLl9fYmFzZXNfXyIsIHR5cGUtPnRwX25hbWUpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICghUHlUdXBsZV9DaGVjayh2YWx1ZSkpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAiY2FuIG9ubHkgYXNzaWduIHR1cGxlIHRvICVzLl9fYmFzZXNfXywgbm90ICVzIiwKKyAgICAgICAgICAgICAgICAgdHlwZS0+dHBfbmFtZSwgUHlfVFlQRSh2YWx1ZSktPnRwX25hbWUpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChQeVR1cGxlX0dFVF9TSVpFKHZhbHVlKSA9PSAwKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgImNhbiBvbmx5IGFzc2lnbiBub24tZW1wdHkgdHVwbGUgdG8gJXMuX19iYXNlc19fLCBub3QgKCkiLAorICAgICAgICAgICAgICAgICB0eXBlLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgUHlUdXBsZV9HRVRfU0laRSh2YWx1ZSk7IGkrKykgeworICAgICAgICBvYiA9IFB5VHVwbGVfR0VUX0lURU0odmFsdWUsIGkpOworICAgICAgICBpZiAoIVB5Q2xhc3NfQ2hlY2sob2IpICYmICFQeVR5cGVfQ2hlY2sob2IpKSB7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoCisgICAgICAgICAgICAgICAgUHlFeGNfVHlwZUVycm9yLAorICAgICIlcy5fX2Jhc2VzX18gbXVzdCBiZSB0dXBsZSBvZiBvbGQtIG9yIG5ldy1zdHlsZSBjbGFzc2VzLCBub3QgJyVzJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZS0+dHBfbmFtZSwgUHlfVFlQRShvYiktPnRwX25hbWUpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKFB5VHlwZV9DaGVjayhvYikpIHsKKyAgICAgICAgICAgIGlmIChQeVR5cGVfSXNTdWJ0eXBlKChQeVR5cGVPYmplY3QqKW9iLCB0eXBlKSkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAiYSBfX2Jhc2VzX18gaXRlbSBjYXVzZXMgYW4gaW5oZXJpdGFuY2UgY3ljbGUiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAKLQluZXdfYmFzZSA9IGJlc3RfYmFzZSh2YWx1ZSk7CisgICAgbmV3X2Jhc2UgPSBiZXN0X2Jhc2UodmFsdWUpOwogCi0JaWYgKCFuZXdfYmFzZSkgewotCQlyZXR1cm4gLTE7Ci0JfQorICAgIGlmICghbmV3X2Jhc2UpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCWlmICghY29tcGF0aWJsZV9mb3JfYXNzaWdubWVudCh0eXBlLT50cF9iYXNlLCBuZXdfYmFzZSwgIl9fYmFzZXNfXyIpKQotCQlyZXR1cm4gLTE7CisgICAgaWYgKCFjb21wYXRpYmxlX2Zvcl9hc3NpZ25tZW50KHR5cGUtPnRwX2Jhc2UsIG5ld19iYXNlLCAiX19iYXNlc19fIikpCisgICAgICAgIHJldHVybiAtMTsKIAotCVB5X0lOQ1JFRihuZXdfYmFzZSk7Ci0JUHlfSU5DUkVGKHZhbHVlKTsKKyAgICBQeV9JTkNSRUYobmV3X2Jhc2UpOworICAgIFB5X0lOQ1JFRih2YWx1ZSk7CiAKLQlvbGRfYmFzZXMgPSB0eXBlLT50cF9iYXNlczsKLQlvbGRfYmFzZSA9IHR5cGUtPnRwX2Jhc2U7Ci0Jb2xkX21ybyA9IHR5cGUtPnRwX21ybzsKKyAgICBvbGRfYmFzZXMgPSB0eXBlLT50cF9iYXNlczsKKyAgICBvbGRfYmFzZSA9IHR5cGUtPnRwX2Jhc2U7CisgICAgb2xkX21ybyA9IHR5cGUtPnRwX21ybzsKIAotCXR5cGUtPnRwX2Jhc2VzID0gdmFsdWU7Ci0JdHlwZS0+dHBfYmFzZSA9IG5ld19iYXNlOworICAgIHR5cGUtPnRwX2Jhc2VzID0gdmFsdWU7CisgICAgdHlwZS0+dHBfYmFzZSA9IG5ld19iYXNlOwogCi0JaWYgKG1yb19pbnRlcm5hbCh0eXBlKSA8IDApIHsKLQkJZ290byBiYWlsOwotCX0KKyAgICBpZiAobXJvX2ludGVybmFsKHR5cGUpIDwgMCkgeworICAgICAgICBnb3RvIGJhaWw7CisgICAgfQogCi0JdGVtcCA9IFB5TGlzdF9OZXcoMCk7Ci0JaWYgKCF0ZW1wKQotCQlnb3RvIGJhaWw7CisgICAgdGVtcCA9IFB5TGlzdF9OZXcoMCk7CisgICAgaWYgKCF0ZW1wKQorICAgICAgICBnb3RvIGJhaWw7CiAKLQlyID0gbXJvX3N1YmNsYXNzZXModHlwZSwgdGVtcCk7CisgICAgciA9IG1yb19zdWJjbGFzc2VzKHR5cGUsIHRlbXApOwogCi0JaWYgKHIgPCAwKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBQeUxpc3RfU2l6ZSh0ZW1wKTsgaSsrKSB7Ci0JCQlQeVR5cGVPYmplY3QqIGNsczsKLQkJCVB5T2JqZWN0KiBtcm87Ci0JCQlQeUFyZ19VbnBhY2tUdXBsZShQeUxpc3RfR0VUX0lURU0odGVtcCwgaSksCi0JCQkJCSAiIiwgMiwgMiwgJmNscywgJm1ybyk7Ci0JCQlQeV9JTkNSRUYobXJvKTsKLQkJCW9iID0gY2xzLT50cF9tcm87Ci0JCQljbHMtPnRwX21ybyA9IG1ybzsKLQkJCVB5X0RFQ1JFRihvYik7Ci0JCX0KLQkJUHlfREVDUkVGKHRlbXApOwotCQlnb3RvIGJhaWw7Ci0JfQorICAgIGlmIChyIDwgMCkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgUHlMaXN0X1NpemUodGVtcCk7IGkrKykgeworICAgICAgICAgICAgUHlUeXBlT2JqZWN0KiBjbHM7CisgICAgICAgICAgICBQeU9iamVjdCogbXJvOworICAgICAgICAgICAgUHlBcmdfVW5wYWNrVHVwbGUoUHlMaXN0X0dFVF9JVEVNKHRlbXAsIGkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwgMiwgMiwgJmNscywgJm1ybyk7CisgICAgICAgICAgICBQeV9JTkNSRUYobXJvKTsKKyAgICAgICAgICAgIG9iID0gY2xzLT50cF9tcm87CisgICAgICAgICAgICBjbHMtPnRwX21ybyA9IG1ybzsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihvYik7CisgICAgICAgIH0KKyAgICAgICAgUHlfREVDUkVGKHRlbXApOworICAgICAgICBnb3RvIGJhaWw7CisgICAgfQogCi0JUHlfREVDUkVGKHRlbXApOworICAgIFB5X0RFQ1JFRih0ZW1wKTsKIAotCS8qIGFueSBiYXNlIHRoYXQgd2FzIGluIF9fYmFzZXNfXyBidXQgbm93IGlzbid0LCB3ZQotCSAgIG5lZWQgdG8gcmVtb3ZlIHx0eXBlfCBmcm9tIGl0cyB0cF9zdWJjbGFzc2VzLgotCSAgIGNvbnZlcnNlbHksIGFueSBjbGFzcyBub3cgaW4gX19iYXNlc19fIHRoYXQgd2Fzbid0Ci0JICAgbmVlZHMgdG8gaGF2ZSB8dHlwZXwgYWRkZWQgdG8gaXRzIHN1YmNsYXNzZXMuICovCisgICAgLyogYW55IGJhc2UgdGhhdCB3YXMgaW4gX19iYXNlc19fIGJ1dCBub3cgaXNuJ3QsIHdlCisgICAgICAgbmVlZCB0byByZW1vdmUgfHR5cGV8IGZyb20gaXRzIHRwX3N1YmNsYXNzZXMuCisgICAgICAgY29udmVyc2VseSwgYW55IGNsYXNzIG5vdyBpbiBfX2Jhc2VzX18gdGhhdCB3YXNuJ3QKKyAgICAgICBuZWVkcyB0byBoYXZlIHx0eXBlfCBhZGRlZCB0byBpdHMgc3ViY2xhc3Nlcy4gKi8KIAotCS8qIGZvciBub3csIHNvZCB0aGF0OiBqdXN0IHJlbW92ZSBmcm9tIGFsbCBvbGRfYmFzZXMsCi0JICAgYWRkIHRvIGFsbCBuZXdfYmFzZXMgKi8KKyAgICAvKiBmb3Igbm93LCBzb2QgdGhhdDoganVzdCByZW1vdmUgZnJvbSBhbGwgb2xkX2Jhc2VzLAorICAgICAgIGFkZCB0byBhbGwgbmV3X2Jhc2VzICovCiAKLQlmb3IgKGkgPSBQeVR1cGxlX0dFVF9TSVpFKG9sZF9iYXNlcykgLSAxOyBpID49IDA7IGktLSkgewotCQlvYiA9IFB5VHVwbGVfR0VUX0lURU0ob2xkX2Jhc2VzLCBpKTsKLQkJaWYgKFB5VHlwZV9DaGVjayhvYikpIHsKLQkJCXJlbW92ZV9zdWJjbGFzcygKLQkJCQkoUHlUeXBlT2JqZWN0KilvYiwgdHlwZSk7Ci0JCX0KLQl9CisgICAgZm9yIChpID0gUHlUdXBsZV9HRVRfU0laRShvbGRfYmFzZXMpIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgb2IgPSBQeVR1cGxlX0dFVF9JVEVNKG9sZF9iYXNlcywgaSk7CisgICAgICAgIGlmIChQeVR5cGVfQ2hlY2sob2IpKSB7CisgICAgICAgICAgICByZW1vdmVfc3ViY2xhc3MoCisgICAgICAgICAgICAgICAgKFB5VHlwZU9iamVjdCopb2IsIHR5cGUpOworICAgICAgICB9CisgICAgfQogCi0JZm9yIChpID0gUHlUdXBsZV9HRVRfU0laRSh2YWx1ZSkgLSAxOyBpID49IDA7IGktLSkgewotCQlvYiA9IFB5VHVwbGVfR0VUX0lURU0odmFsdWUsIGkpOwotCQlpZiAoUHlUeXBlX0NoZWNrKG9iKSkgewotCQkJaWYgKGFkZF9zdWJjbGFzcygoUHlUeXBlT2JqZWN0KilvYiwgdHlwZSkgPCAwKQotCQkJCXIgPSAtMTsKLQkJfQotCX0KKyAgICBmb3IgKGkgPSBQeVR1cGxlX0dFVF9TSVpFKHZhbHVlKSAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgIG9iID0gUHlUdXBsZV9HRVRfSVRFTSh2YWx1ZSwgaSk7CisgICAgICAgIGlmIChQeVR5cGVfQ2hlY2sob2IpKSB7CisgICAgICAgICAgICBpZiAoYWRkX3N1YmNsYXNzKChQeVR5cGVPYmplY3QqKW9iLCB0eXBlKSA8IDApCisgICAgICAgICAgICAgICAgciA9IC0xOworICAgICAgICB9CisgICAgfQogCi0JdXBkYXRlX2FsbF9zbG90cyh0eXBlKTsKKyAgICB1cGRhdGVfYWxsX3Nsb3RzKHR5cGUpOwogCi0JUHlfREVDUkVGKG9sZF9iYXNlcyk7Ci0JUHlfREVDUkVGKG9sZF9iYXNlKTsKLQlQeV9ERUNSRUYob2xkX21ybyk7CisgICAgUHlfREVDUkVGKG9sZF9iYXNlcyk7CisgICAgUHlfREVDUkVGKG9sZF9iYXNlKTsKKyAgICBQeV9ERUNSRUYob2xkX21ybyk7CiAKLQlyZXR1cm4gcjsKKyAgICByZXR1cm4gcjsKIAogICBiYWlsOgotCVB5X0RFQ1JFRih0eXBlLT50cF9iYXNlcyk7Ci0JUHlfREVDUkVGKHR5cGUtPnRwX2Jhc2UpOwotCWlmICh0eXBlLT50cF9tcm8gIT0gb2xkX21ybykgewotCQlQeV9ERUNSRUYodHlwZS0+dHBfbXJvKTsKLQl9CisgICAgUHlfREVDUkVGKHR5cGUtPnRwX2Jhc2VzKTsKKyAgICBQeV9ERUNSRUYodHlwZS0+dHBfYmFzZSk7CisgICAgaWYgKHR5cGUtPnRwX21ybyAhPSBvbGRfbXJvKSB7CisgICAgICAgIFB5X0RFQ1JFRih0eXBlLT50cF9tcm8pOworICAgIH0KIAotCXR5cGUtPnRwX2Jhc2VzID0gb2xkX2Jhc2VzOwotCXR5cGUtPnRwX2Jhc2UgPSBvbGRfYmFzZTsKLQl0eXBlLT50cF9tcm8gPSBvbGRfbXJvOworICAgIHR5cGUtPnRwX2Jhc2VzID0gb2xkX2Jhc2VzOworICAgIHR5cGUtPnRwX2Jhc2UgPSBvbGRfYmFzZTsKKyAgICB0eXBlLT50cF9tcm8gPSBvbGRfbXJvOwogCi0JcmV0dXJuIC0xOworICAgIHJldHVybiAtMTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHR5cGVfZGljdChQeVR5cGVPYmplY3QgKnR5cGUsIHZvaWQgKmNvbnRleHQpCiB7Ci0JaWYgKHR5cGUtPnRwX2RpY3QgPT0gTlVMTCkgewotCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCXJldHVybiBQeV9Ob25lOwotCX0KLQlyZXR1cm4gUHlEaWN0UHJveHlfTmV3KHR5cGUtPnRwX2RpY3QpOworICAgIGlmICh0eXBlLT50cF9kaWN0ID09IE5VTEwpIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICB9CisgICAgcmV0dXJuIFB5RGljdFByb3h5X05ldyh0eXBlLT50cF9kaWN0KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHR5cGVfZ2V0X2RvYyhQeVR5cGVPYmplY3QgKnR5cGUsIHZvaWQgKmNvbnRleHQpCiB7Ci0JUHlPYmplY3QgKnJlc3VsdDsKLQlpZiAoISh0eXBlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEVBUFRZUEUpICYmIHR5cGUtPnRwX2RvYyAhPSBOVUxMKQotCQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyh0eXBlLT50cF9kb2MpOwotCXJlc3VsdCA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKHR5cGUtPnRwX2RpY3QsICJfX2RvY19fIik7Ci0JaWYgKHJlc3VsdCA9PSBOVUxMKSB7Ci0JCXJlc3VsdCA9IFB5X05vbmU7Ci0JCVB5X0lOQ1JFRihyZXN1bHQpOwotCX0KLQllbHNlIGlmIChQeV9UWVBFKHJlc3VsdCktPnRwX2Rlc2NyX2dldCkgewotCQlyZXN1bHQgPSBQeV9UWVBFKHJlc3VsdCktPnRwX2Rlc2NyX2dldChyZXN1bHQsIE5VTEwsCi0JCQkJCQkgICAgICAgKFB5T2JqZWN0ICopdHlwZSk7Ci0JfQotCWVsc2UgewotCQlQeV9JTkNSRUYocmVzdWx0KTsKLQl9Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBQeU9iamVjdCAqcmVzdWx0OworICAgIGlmICghKHR5cGUtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IRUFQVFlQRSkgJiYgdHlwZS0+dHBfZG9jICE9IE5VTEwpCisgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKHR5cGUtPnRwX2RvYyk7CisgICAgcmVzdWx0ID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcodHlwZS0+dHBfZGljdCwgIl9fZG9jX18iKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpIHsKKyAgICAgICAgcmVzdWx0ID0gUHlfTm9uZTsKKyAgICAgICAgUHlfSU5DUkVGKHJlc3VsdCk7CisgICAgfQorICAgIGVsc2UgaWYgKFB5X1RZUEUocmVzdWx0KS0+dHBfZGVzY3JfZ2V0KSB7CisgICAgICAgIHJlc3VsdCA9IFB5X1RZUEUocmVzdWx0KS0+dHBfZGVzY3JfZ2V0KHJlc3VsdCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFB5T2JqZWN0ICopdHlwZSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeV9JTkNSRUYocmVzdWx0KTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHR5cGVfX19pbnN0YW5jZWNoZWNrX18oUHlPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICppbnN0KQogewotCXN3aXRjaCAoX1B5T2JqZWN0X1JlYWxJc0luc3RhbmNlKGluc3QsIHR5cGUpKSB7Ci0JY2FzZSAtMToKLQkJcmV0dXJuIE5VTEw7Ci0JY2FzZSAwOgotCQlQeV9SRVRVUk5fRkFMU0U7Ci0JZGVmYXVsdDoKLQkJUHlfUkVUVVJOX1RSVUU7Ci0JfQorICAgIHN3aXRjaCAoX1B5T2JqZWN0X1JlYWxJc0luc3RhbmNlKGluc3QsIHR5cGUpKSB7CisgICAgY2FzZSAtMToKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgY2FzZSAwOgorICAgICAgICBQeV9SRVRVUk5fRkFMU0U7CisgICAgZGVmYXVsdDoKKyAgICAgICAgUHlfUkVUVVJOX1RSVUU7CisgICAgfQogfQogCiAKIHN0YXRpYyBQeU9iamVjdCAqCiB0eXBlX2dldF9pbnN0YW5jZWNoZWNrKFB5T2JqZWN0ICp0eXBlLCB2b2lkICpjb250ZXh0KQogewotCXN0YXRpYyBQeU1ldGhvZERlZiBtbCA9IHsiX19pbnN0YW5jZWNoZWNrX18iLAotCQkJCSB0eXBlX19faW5zdGFuY2VjaGVja19fLCBNRVRIX08gfTsKLQlyZXR1cm4gUHlDRnVuY3Rpb25fTmV3KCZtbCwgdHlwZSk7CisgICAgc3RhdGljIFB5TWV0aG9kRGVmIG1sID0geyJfX2luc3RhbmNlY2hlY2tfXyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVfX19pbnN0YW5jZWNoZWNrX18sIE1FVEhfTyB9OworICAgIHJldHVybiBQeUNGdW5jdGlvbl9OZXcoJm1sLCB0eXBlKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHR5cGVfX19zdWJjbGFzc2NoZWNrX18oUHlPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICppbnN0KQogewotCXN3aXRjaCAoX1B5T2JqZWN0X1JlYWxJc1N1YmNsYXNzKGluc3QsIHR5cGUpKSB7Ci0JY2FzZSAtMToKLQkJcmV0dXJuIE5VTEw7Ci0JY2FzZSAwOgotCQlQeV9SRVRVUk5fRkFMU0U7Ci0JZGVmYXVsdDoKLQkJUHlfUkVUVVJOX1RSVUU7Ci0JfQorICAgIHN3aXRjaCAoX1B5T2JqZWN0X1JlYWxJc1N1YmNsYXNzKGluc3QsIHR5cGUpKSB7CisgICAgY2FzZSAtMToKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgY2FzZSAwOgorICAgICAgICBQeV9SRVRVUk5fRkFMU0U7CisgICAgZGVmYXVsdDoKKyAgICAgICAgUHlfUkVUVVJOX1RSVUU7CisgICAgfQogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogdHlwZV9nZXRfc3ViY2xhc3NjaGVjayhQeU9iamVjdCAqdHlwZSwgdm9pZCAqY29udGV4dCkKIHsKLQlzdGF0aWMgUHlNZXRob2REZWYgbWwgPSB7Il9fc3ViY2xhc3NjaGVja19fIiwKLQkJCQkgdHlwZV9fX3N1YmNsYXNzY2hlY2tfXywgTUVUSF9PIH07Ci0JcmV0dXJuIFB5Q0Z1bmN0aW9uX05ldygmbWwsIHR5cGUpOworICAgIHN0YXRpYyBQeU1ldGhvZERlZiBtbCA9IHsiX19zdWJjbGFzc2NoZWNrX18iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlX19fc3ViY2xhc3NjaGVja19fLCBNRVRIX08gfTsKKyAgICByZXR1cm4gUHlDRnVuY3Rpb25fTmV3KCZtbCwgdHlwZSk7CiB9CiAKIHN0YXRpYyBQeUdldFNldERlZiB0eXBlX2dldHNldHNbXSA9IHsKLQl7Il9fbmFtZV9fIiwgKGdldHRlcil0eXBlX25hbWUsIChzZXR0ZXIpdHlwZV9zZXRfbmFtZSwgTlVMTH0sCi0JeyJfX2Jhc2VzX18iLCAoZ2V0dGVyKXR5cGVfZ2V0X2Jhc2VzLCAoc2V0dGVyKXR5cGVfc2V0X2Jhc2VzLCBOVUxMfSwKLQl7Il9fbW9kdWxlX18iLCAoZ2V0dGVyKXR5cGVfbW9kdWxlLCAoc2V0dGVyKXR5cGVfc2V0X21vZHVsZSwgTlVMTH0sCi0JeyJfX2Fic3RyYWN0bWV0aG9kc19fIiwgKGdldHRlcil0eXBlX2Fic3RyYWN0bWV0aG9kcywKLQkgKHNldHRlcil0eXBlX3NldF9hYnN0cmFjdG1ldGhvZHMsIE5VTEx9LAotCXsiX19kaWN0X18iLCAgKGdldHRlcil0eXBlX2RpY3QsICBOVUxMLCBOVUxMfSwKLQl7Il9fZG9jX18iLCAoZ2V0dGVyKXR5cGVfZ2V0X2RvYywgTlVMTCwgTlVMTH0sCi0JeyJfX2luc3RhbmNlY2hlY2tfXyIsIChnZXR0ZXIpdHlwZV9nZXRfaW5zdGFuY2VjaGVjaywgTlVMTCwgTlVMTH0sCi0JeyJfX3N1YmNsYXNzY2hlY2tfXyIsIChnZXR0ZXIpdHlwZV9nZXRfc3ViY2xhc3NjaGVjaywgTlVMTCwgTlVMTH0sCi0JezB9CisgICAgeyJfX25hbWVfXyIsIChnZXR0ZXIpdHlwZV9uYW1lLCAoc2V0dGVyKXR5cGVfc2V0X25hbWUsIE5VTEx9LAorICAgIHsiX19iYXNlc19fIiwgKGdldHRlcil0eXBlX2dldF9iYXNlcywgKHNldHRlcil0eXBlX3NldF9iYXNlcywgTlVMTH0sCisgICAgeyJfX21vZHVsZV9fIiwgKGdldHRlcil0eXBlX21vZHVsZSwgKHNldHRlcil0eXBlX3NldF9tb2R1bGUsIE5VTEx9LAorICAgIHsiX19hYnN0cmFjdG1ldGhvZHNfXyIsIChnZXR0ZXIpdHlwZV9hYnN0cmFjdG1ldGhvZHMsCisgICAgIChzZXR0ZXIpdHlwZV9zZXRfYWJzdHJhY3RtZXRob2RzLCBOVUxMfSwKKyAgICB7Il9fZGljdF9fIiwgIChnZXR0ZXIpdHlwZV9kaWN0LCAgTlVMTCwgTlVMTH0sCisgICAgeyJfX2RvY19fIiwgKGdldHRlcil0eXBlX2dldF9kb2MsIE5VTEwsIE5VTEx9LAorICAgIHsiX19pbnN0YW5jZWNoZWNrX18iLCAoZ2V0dGVyKXR5cGVfZ2V0X2luc3RhbmNlY2hlY2ssIE5VTEwsIE5VTEx9LAorICAgIHsiX19zdWJjbGFzc2NoZWNrX18iLCAoZ2V0dGVyKXR5cGVfZ2V0X3N1YmNsYXNzY2hlY2ssIE5VTEwsIE5VTEx9LAorICAgIHswfQogfTsKIAogCiBzdGF0aWMgUHlPYmplY3QqCiB0eXBlX3JpY2hjb21wYXJlKFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdywgaW50IG9wKQogewotCVB5T2JqZWN0ICpyZXN1bHQ7Ci0JUHlfdWludHB0cl90IHZ2LCB3dzsKLQlpbnQgYzsKKyAgICBQeU9iamVjdCAqcmVzdWx0OworICAgIFB5X3VpbnRwdHJfdCB2diwgd3c7CisgICAgaW50IGM7CiAKLQkvKiBNYWtlIHN1cmUgYm90aCBhcmd1bWVudHMgYXJlIHR5cGVzLiAqLwotCWlmICghUHlUeXBlX0NoZWNrKHYpIHx8ICFQeVR5cGVfQ2hlY2sodykgfHwKLQkgICAgLyogSWYgdGhlcmUgaXMgYSBfX2NtcF9fIG1ldGhvZCBkZWZpbmVkLCBsZXQgaXQgYmUgY2FsbGVkIGluc3RlYWQKLQkgICAgICAgb2Ygb3VyIGR1bWIgZnVuY3Rpb24gZGVzaWduZWQgbWVyZWx5IHRvIHdhcm4uICBTZWUgYnVnCi0JICAgICAgICM3NDkxLiAqLwotCSAgICBQeV9UWVBFKHYpLT50cF9jb21wYXJlIHx8IFB5X1RZUEUodyktPnRwX2NvbXBhcmUpIHsKLQkJcmVzdWx0ID0gUHlfTm90SW1wbGVtZW50ZWQ7Ci0JCWdvdG8gb3V0OwotCX0KKyAgICAvKiBNYWtlIHN1cmUgYm90aCBhcmd1bWVudHMgYXJlIHR5cGVzLiAqLworICAgIGlmICghUHlUeXBlX0NoZWNrKHYpIHx8ICFQeVR5cGVfQ2hlY2sodykgfHwKKyAgICAgICAgLyogSWYgdGhlcmUgaXMgYSBfX2NtcF9fIG1ldGhvZCBkZWZpbmVkLCBsZXQgaXQgYmUgY2FsbGVkIGluc3RlYWQKKyAgICAgICAgICAgb2Ygb3VyIGR1bWIgZnVuY3Rpb24gZGVzaWduZWQgbWVyZWx5IHRvIHdhcm4uICBTZWUgYnVnCisgICAgICAgICAgICM3NDkxLiAqLworICAgICAgICBQeV9UWVBFKHYpLT50cF9jb21wYXJlIHx8IFB5X1RZUEUodyktPnRwX2NvbXBhcmUpIHsKKyAgICAgICAgcmVzdWx0ID0gUHlfTm90SW1wbGVtZW50ZWQ7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KIAotCS8qIFB5M0sgd2FybmluZyBpZiBjb21wYXJpc29uIGlzbid0ID09IG9yICE9ICAqLwotCWlmIChQeV9QeTNrV2FybmluZ0ZsYWcgJiYgb3AgIT0gUHlfRVEgJiYgb3AgIT0gUHlfTkUgJiYKLQkJUHlFcnJfV2FybkV4KFB5RXhjX0RlcHJlY2F0aW9uV2FybmluZywKLQkJCSAgICJ0eXBlIGluZXF1YWxpdHkgY29tcGFyaXNvbnMgbm90IHN1cHBvcnRlZCAiCi0JCQkgICAiaW4gMy54IiwgMSkgPCAwKSB7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICAvKiBQeTNLIHdhcm5pbmcgaWYgY29tcGFyaXNvbiBpc24ndCA9PSBvciAhPSAgKi8KKyAgICBpZiAoUHlfUHkza1dhcm5pbmdGbGFnICYmIG9wICE9IFB5X0VRICYmIG9wICE9IFB5X05FICYmCisgICAgICAgIFB5RXJyX1dhcm5FeChQeUV4Y19EZXByZWNhdGlvbldhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgInR5cGUgaW5lcXVhbGl0eSBjb21wYXJpc29ucyBub3Qgc3VwcG9ydGVkICIKKyAgICAgICAgICAgICAgICAgICAiaW4gMy54IiwgMSkgPCAwKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCS8qIENvbXBhcmUgYWRkcmVzc2VzICovCi0JdnYgPSAoUHlfdWludHB0cl90KXY7Ci0Jd3cgPSAoUHlfdWludHB0cl90KXc7Ci0Jc3dpdGNoIChvcCkgewotCWNhc2UgUHlfTFQ6IGMgPSB2diA8ICB3dzsgYnJlYWs7Ci0JY2FzZSBQeV9MRTogYyA9IHZ2IDw9IHd3OyBicmVhazsKLQljYXNlIFB5X0VROiBjID0gdnYgPT0gd3c7IGJyZWFrOwotCWNhc2UgUHlfTkU6IGMgPSB2diAhPSB3dzsgYnJlYWs7Ci0JY2FzZSBQeV9HVDogYyA9IHZ2ID4gIHd3OyBicmVhazsKLQljYXNlIFB5X0dFOiBjID0gdnYgPj0gd3c7IGJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJlc3VsdCA9IFB5X05vdEltcGxlbWVudGVkOwotCQlnb3RvIG91dDsKLQl9Ci0JcmVzdWx0ID0gYyA/IFB5X1RydWUgOiBQeV9GYWxzZTsKKyAgICAvKiBDb21wYXJlIGFkZHJlc3NlcyAqLworICAgIHZ2ID0gKFB5X3VpbnRwdHJfdCl2OworICAgIHd3ID0gKFB5X3VpbnRwdHJfdCl3OworICAgIHN3aXRjaCAob3ApIHsKKyAgICBjYXNlIFB5X0xUOiBjID0gdnYgPCAgd3c7IGJyZWFrOworICAgIGNhc2UgUHlfTEU6IGMgPSB2diA8PSB3dzsgYnJlYWs7CisgICAgY2FzZSBQeV9FUTogYyA9IHZ2ID09IHd3OyBicmVhazsKKyAgICBjYXNlIFB5X05FOiBjID0gdnYgIT0gd3c7IGJyZWFrOworICAgIGNhc2UgUHlfR1Q6IGMgPSB2diA+ICB3dzsgYnJlYWs7CisgICAgY2FzZSBQeV9HRTogYyA9IHZ2ID49IHd3OyBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXN1bHQgPSBQeV9Ob3RJbXBsZW1lbnRlZDsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorICAgIHJlc3VsdCA9IGMgPyBQeV9UcnVlIDogUHlfRmFsc2U7CiAKICAgLyogaW5jcmVmIGFuZCByZXR1cm4gKi8KICAgb3V0OgotCVB5X0lOQ1JFRihyZXN1bHQpOwotCXJldHVybiByZXN1bHQ7CisgICAgUHlfSU5DUkVGKHJlc3VsdCk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHR5cGVfcmVwcihQeVR5cGVPYmplY3QgKnR5cGUpCiB7Ci0JUHlPYmplY3QgKm1vZCwgKm5hbWUsICpydG47Ci0JY2hhciAqa2luZDsKKyAgICBQeU9iamVjdCAqbW9kLCAqbmFtZSwgKnJ0bjsKKyAgICBjaGFyICpraW5kOwogCi0JbW9kID0gdHlwZV9tb2R1bGUodHlwZSwgTlVMTCk7Ci0JaWYgKG1vZCA9PSBOVUxMKQotCQlQeUVycl9DbGVhcigpOwotCWVsc2UgaWYgKCFQeVN0cmluZ19DaGVjayhtb2QpKSB7Ci0JCVB5X0RFQ1JFRihtb2QpOwotCQltb2QgPSBOVUxMOwotCX0KLQluYW1lID0gdHlwZV9uYW1lKHR5cGUsIE5VTEwpOwotCWlmIChuYW1lID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIG1vZCA9IHR5cGVfbW9kdWxlKHR5cGUsIE5VTEwpOworICAgIGlmIChtb2QgPT0gTlVMTCkKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICBlbHNlIGlmICghUHlTdHJpbmdfQ2hlY2sobW9kKSkgeworICAgICAgICBQeV9ERUNSRUYobW9kKTsKKyAgICAgICAgbW9kID0gTlVMTDsKKyAgICB9CisgICAgbmFtZSA9IHR5cGVfbmFtZSh0eXBlLCBOVUxMKTsKKyAgICBpZiAobmFtZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmICh0eXBlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEVBUFRZUEUpCi0JCWtpbmQgPSAiY2xhc3MiOwotCWVsc2UKLQkJa2luZCA9ICJ0eXBlIjsKKyAgICBpZiAodHlwZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hFQVBUWVBFKQorICAgICAgICBraW5kID0gImNsYXNzIjsKKyAgICBlbHNlCisgICAgICAgIGtpbmQgPSAidHlwZSI7CiAKLQlpZiAobW9kICE9IE5VTEwgJiYgc3RyY21wKFB5U3RyaW5nX0FTX1NUUklORyhtb2QpLCAiX19idWlsdGluX18iKSkgewotCQlydG4gPSBQeVN0cmluZ19Gcm9tRm9ybWF0KCI8JXMgJyVzLiVzJz4iLAotCQkJCQkgIGtpbmQsCi0JCQkJCSAgUHlTdHJpbmdfQVNfU1RSSU5HKG1vZCksCi0JCQkJCSAgUHlTdHJpbmdfQVNfU1RSSU5HKG5hbWUpKTsKLQl9Ci0JZWxzZQotCQlydG4gPSBQeVN0cmluZ19Gcm9tRm9ybWF0KCI8JXMgJyVzJz4iLCBraW5kLCB0eXBlLT50cF9uYW1lKTsKKyAgICBpZiAobW9kICE9IE5VTEwgJiYgc3RyY21wKFB5U3RyaW5nX0FTX1NUUklORyhtb2QpLCAiX19idWlsdGluX18iKSkgeworICAgICAgICBydG4gPSBQeVN0cmluZ19Gcm9tRm9ybWF0KCI8JXMgJyVzLiVzJz4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKG1vZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKG5hbWUpKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBydG4gPSBQeVN0cmluZ19Gcm9tRm9ybWF0KCI8JXMgJyVzJz4iLCBraW5kLCB0eXBlLT50cF9uYW1lKTsKIAotCVB5X1hERUNSRUYobW9kKTsKLQlQeV9ERUNSRUYobmFtZSk7Ci0JcmV0dXJuIHJ0bjsKKyAgICBQeV9YREVDUkVGKG1vZCk7CisgICAgUHlfREVDUkVGKG5hbWUpOworICAgIHJldHVybiBydG47CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB0eXBlX2NhbGwoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JUHlPYmplY3QgKm9iajsKKyAgICBQeU9iamVjdCAqb2JqOwogCi0JaWYgKHR5cGUtPnRwX25ldyA9PSBOVUxMKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgICJjYW5ub3QgY3JlYXRlICclLjEwMHMnIGluc3RhbmNlcyIsCi0JCQkgICAgIHR5cGUtPnRwX25hbWUpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKHR5cGUtPnRwX25ldyA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiY2Fubm90IGNyZWF0ZSAnJS4xMDBzJyBpbnN0YW5jZXMiLAorICAgICAgICAgICAgICAgICAgICAgdHlwZS0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCW9iaiA9IHR5cGUtPnRwX25ldyh0eXBlLCBhcmdzLCBrd2RzKTsKLQlpZiAob2JqICE9IE5VTEwpIHsKLQkJLyogVWdseSBleGNlcHRpb246IHdoZW4gdGhlIGNhbGwgd2FzIHR5cGUoc29tZXRoaW5nKSwKLQkJICAgZG9uJ3QgY2FsbCB0cF9pbml0IG9uIHRoZSByZXN1bHQuICovCi0JCWlmICh0eXBlID09ICZQeVR5cGVfVHlwZSAmJgotCQkgICAgUHlUdXBsZV9DaGVjayhhcmdzKSAmJiBQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpID09IDEgJiYKLQkJICAgIChrd2RzID09IE5VTEwgfHwKLQkJICAgICAoUHlEaWN0X0NoZWNrKGt3ZHMpICYmIFB5RGljdF9TaXplKGt3ZHMpID09IDApKSkKLQkJCXJldHVybiBvYmo7Ci0JCS8qIElmIHRoZSByZXR1cm5lZCBvYmplY3QgaXMgbm90IGFuIGluc3RhbmNlIG9mIHR5cGUsCi0JCSAgIGl0IHdvbid0IGJlIGluaXRpYWxpemVkLiAqLwotCQlpZiAoIVB5VHlwZV9Jc1N1YnR5cGUob2JqLT5vYl90eXBlLCB0eXBlKSkKLQkJCXJldHVybiBvYmo7Ci0JCXR5cGUgPSBvYmotPm9iX3R5cGU7Ci0JCWlmIChQeVR5cGVfSGFzRmVhdHVyZSh0eXBlLCBQeV9UUEZMQUdTX0hBVkVfQ0xBU1MpICYmCi0JCSAgICB0eXBlLT50cF9pbml0ICE9IE5VTEwgJiYKLQkJICAgIHR5cGUtPnRwX2luaXQob2JqLCBhcmdzLCBrd2RzKSA8IDApIHsKLQkJCVB5X0RFQ1JFRihvYmopOwotCQkJb2JqID0gTlVMTDsKLQkJfQotCX0KLQlyZXR1cm4gb2JqOworICAgIG9iaiA9IHR5cGUtPnRwX25ldyh0eXBlLCBhcmdzLCBrd2RzKTsKKyAgICBpZiAob2JqICE9IE5VTEwpIHsKKyAgICAgICAgLyogVWdseSBleGNlcHRpb246IHdoZW4gdGhlIGNhbGwgd2FzIHR5cGUoc29tZXRoaW5nKSwKKyAgICAgICAgICAgZG9uJ3QgY2FsbCB0cF9pbml0IG9uIHRoZSByZXN1bHQuICovCisgICAgICAgIGlmICh0eXBlID09ICZQeVR5cGVfVHlwZSAmJgorICAgICAgICAgICAgUHlUdXBsZV9DaGVjayhhcmdzKSAmJiBQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpID09IDEgJiYKKyAgICAgICAgICAgIChrd2RzID09IE5VTEwgfHwKKyAgICAgICAgICAgICAoUHlEaWN0X0NoZWNrKGt3ZHMpICYmIFB5RGljdF9TaXplKGt3ZHMpID09IDApKSkKKyAgICAgICAgICAgIHJldHVybiBvYmo7CisgICAgICAgIC8qIElmIHRoZSByZXR1cm5lZCBvYmplY3QgaXMgbm90IGFuIGluc3RhbmNlIG9mIHR5cGUsCisgICAgICAgICAgIGl0IHdvbid0IGJlIGluaXRpYWxpemVkLiAqLworICAgICAgICBpZiAoIVB5VHlwZV9Jc1N1YnR5cGUob2JqLT5vYl90eXBlLCB0eXBlKSkKKyAgICAgICAgICAgIHJldHVybiBvYmo7CisgICAgICAgIHR5cGUgPSBvYmotPm9iX3R5cGU7CisgICAgICAgIGlmIChQeVR5cGVfSGFzRmVhdHVyZSh0eXBlLCBQeV9UUEZMQUdTX0hBVkVfQ0xBU1MpICYmCisgICAgICAgICAgICB0eXBlLT50cF9pbml0ICE9IE5VTEwgJiYKKyAgICAgICAgICAgIHR5cGUtPnRwX2luaXQob2JqLCBhcmdzLCBrd2RzKSA8IDApIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihvYmopOworICAgICAgICAgICAgb2JqID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gb2JqOwogfQogCiBQeU9iamVjdCAqCiBQeVR5cGVfR2VuZXJpY0FsbG9jKFB5VHlwZU9iamVjdCAqdHlwZSwgUHlfc3NpemVfdCBuaXRlbXMpCiB7Ci0JUHlPYmplY3QgKm9iajsKLQljb25zdCBzaXplX3Qgc2l6ZSA9IF9QeU9iamVjdF9WQVJfU0laRSh0eXBlLCBuaXRlbXMrMSk7Ci0JLyogbm90ZSB0aGF0IHdlIG5lZWQgdG8gYWRkIG9uZSwgZm9yIHRoZSBzZW50aW5lbCAqLworICAgIFB5T2JqZWN0ICpvYmo7CisgICAgY29uc3Qgc2l6ZV90IHNpemUgPSBfUHlPYmplY3RfVkFSX1NJWkUodHlwZSwgbml0ZW1zKzEpOworICAgIC8qIG5vdGUgdGhhdCB3ZSBuZWVkIHRvIGFkZCBvbmUsIGZvciB0aGUgc2VudGluZWwgKi8KIAotCWlmIChQeVR5cGVfSVNfR0ModHlwZSkpCi0JCW9iaiA9IF9QeU9iamVjdF9HQ19NYWxsb2Moc2l6ZSk7Ci0JZWxzZQotCQlvYmogPSAoUHlPYmplY3QgKilQeU9iamVjdF9NQUxMT0Moc2l6ZSk7CisgICAgaWYgKFB5VHlwZV9JU19HQyh0eXBlKSkKKyAgICAgICAgb2JqID0gX1B5T2JqZWN0X0dDX01hbGxvYyhzaXplKTsKKyAgICBlbHNlCisgICAgICAgIG9iaiA9IChQeU9iamVjdCAqKVB5T2JqZWN0X01BTExPQyhzaXplKTsKIAotCWlmIChvYmogPT0gTlVMTCkKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgaWYgKG9iaiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKIAotCW1lbXNldChvYmosICdcMCcsIHNpemUpOworICAgIG1lbXNldChvYmosICdcMCcsIHNpemUpOwogCi0JaWYgKHR5cGUtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IRUFQVFlQRSkKLQkJUHlfSU5DUkVGKHR5cGUpOworICAgIGlmICh0eXBlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEVBUFRZUEUpCisgICAgICAgIFB5X0lOQ1JFRih0eXBlKTsKIAotCWlmICh0eXBlLT50cF9pdGVtc2l6ZSA9PSAwKQotCQlQeU9iamVjdF9JTklUKG9iaiwgdHlwZSk7Ci0JZWxzZQotCQkodm9pZCkgUHlPYmplY3RfSU5JVF9WQVIoKFB5VmFyT2JqZWN0ICopb2JqLCB0eXBlLCBuaXRlbXMpOworICAgIGlmICh0eXBlLT50cF9pdGVtc2l6ZSA9PSAwKQorICAgICAgICBQeU9iamVjdF9JTklUKG9iaiwgdHlwZSk7CisgICAgZWxzZQorICAgICAgICAodm9pZCkgUHlPYmplY3RfSU5JVF9WQVIoKFB5VmFyT2JqZWN0ICopb2JqLCB0eXBlLCBuaXRlbXMpOwogCi0JaWYgKFB5VHlwZV9JU19HQyh0eXBlKSkKLQkJX1B5T2JqZWN0X0dDX1RSQUNLKG9iaik7Ci0JcmV0dXJuIG9iajsKKyAgICBpZiAoUHlUeXBlX0lTX0dDKHR5cGUpKQorICAgICAgICBfUHlPYmplY3RfR0NfVFJBQ0sob2JqKTsKKyAgICByZXR1cm4gb2JqOwogfQogCiBQeU9iamVjdCAqCiBQeVR5cGVfR2VuZXJpY05ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlyZXR1cm4gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7CisgICAgcmV0dXJuIHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOwogfQogCiAvKiBIZWxwZXJzIGZvciBzdWJ0eXBpbmcgKi8KQEAgLTc4OCwzNDEgKzc4OCwzNDEgQEAKIHN0YXRpYyBpbnQKIHRyYXZlcnNlX3Nsb3RzKFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKnNlbGYsIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotCVB5X3NzaXplX3QgaSwgbjsKLQlQeU1lbWJlckRlZiAqbXA7CisgICAgUHlfc3NpemVfdCBpLCBuOworICAgIFB5TWVtYmVyRGVmICptcDsKIAotCW4gPSBQeV9TSVpFKHR5cGUpOwotCW1wID0gUHlIZWFwVHlwZV9HRVRfTUVNQkVSUygoUHlIZWFwVHlwZU9iamVjdCAqKXR5cGUpOwotCWZvciAoaSA9IDA7IGkgPCBuOyBpKyssIG1wKyspIHsKLQkJaWYgKG1wLT50eXBlID09IFRfT0JKRUNUX0VYKSB7Ci0JCQljaGFyICphZGRyID0gKGNoYXIgKilzZWxmICsgbXAtPm9mZnNldDsKLQkJCVB5T2JqZWN0ICpvYmogPSAqKFB5T2JqZWN0ICoqKWFkZHI7Ci0JCQlpZiAob2JqICE9IE5VTEwpIHsKLQkJCQlpbnQgZXJyID0gdmlzaXQob2JqLCBhcmcpOwotCQkJCWlmIChlcnIpCi0JCQkJCXJldHVybiBlcnI7Ci0JCQl9Ci0JCX0KLQl9Ci0JcmV0dXJuIDA7CisgICAgbiA9IFB5X1NJWkUodHlwZSk7CisgICAgbXAgPSBQeUhlYXBUeXBlX0dFVF9NRU1CRVJTKChQeUhlYXBUeXBlT2JqZWN0ICopdHlwZSk7CisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKywgbXArKykgeworICAgICAgICBpZiAobXAtPnR5cGUgPT0gVF9PQkpFQ1RfRVgpIHsKKyAgICAgICAgICAgIGNoYXIgKmFkZHIgPSAoY2hhciAqKXNlbGYgKyBtcC0+b2Zmc2V0OworICAgICAgICAgICAgUHlPYmplY3QgKm9iaiA9ICooUHlPYmplY3QgKiopYWRkcjsKKyAgICAgICAgICAgIGlmIChvYmogIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGludCBlcnIgPSB2aXNpdChvYmosIGFyZyk7CisgICAgICAgICAgICAgICAgaWYgKGVycikKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogc3VidHlwZV90cmF2ZXJzZShQeU9iamVjdCAqc2VsZiwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JUHlUeXBlT2JqZWN0ICp0eXBlLCAqYmFzZTsKLQl0cmF2ZXJzZXByb2MgYmFzZXRyYXZlcnNlOworICAgIFB5VHlwZU9iamVjdCAqdHlwZSwgKmJhc2U7CisgICAgdHJhdmVyc2Vwcm9jIGJhc2V0cmF2ZXJzZTsKIAotCS8qIEZpbmQgdGhlIG5lYXJlc3QgYmFzZSB3aXRoIGEgZGlmZmVyZW50IHRwX3RyYXZlcnNlLAotCSAgIGFuZCB0cmF2ZXJzZSBzbG90cyB3aGlsZSB3ZSdyZSBhdCBpdCAqLwotCXR5cGUgPSBQeV9UWVBFKHNlbGYpOwotCWJhc2UgPSB0eXBlOwotCXdoaWxlICgoYmFzZXRyYXZlcnNlID0gYmFzZS0+dHBfdHJhdmVyc2UpID09IHN1YnR5cGVfdHJhdmVyc2UpIHsKLQkJaWYgKFB5X1NJWkUoYmFzZSkpIHsKLQkJCWludCBlcnIgPSB0cmF2ZXJzZV9zbG90cyhiYXNlLCBzZWxmLCB2aXNpdCwgYXJnKTsKLQkJCWlmIChlcnIpCi0JCQkJcmV0dXJuIGVycjsKLQkJfQotCQliYXNlID0gYmFzZS0+dHBfYmFzZTsKLQkJYXNzZXJ0KGJhc2UpOwotCX0KKyAgICAvKiBGaW5kIHRoZSBuZWFyZXN0IGJhc2Ugd2l0aCBhIGRpZmZlcmVudCB0cF90cmF2ZXJzZSwKKyAgICAgICBhbmQgdHJhdmVyc2Ugc2xvdHMgd2hpbGUgd2UncmUgYXQgaXQgKi8KKyAgICB0eXBlID0gUHlfVFlQRShzZWxmKTsKKyAgICBiYXNlID0gdHlwZTsKKyAgICB3aGlsZSAoKGJhc2V0cmF2ZXJzZSA9IGJhc2UtPnRwX3RyYXZlcnNlKSA9PSBzdWJ0eXBlX3RyYXZlcnNlKSB7CisgICAgICAgIGlmIChQeV9TSVpFKGJhc2UpKSB7CisgICAgICAgICAgICBpbnQgZXJyID0gdHJhdmVyc2Vfc2xvdHMoYmFzZSwgc2VsZiwgdmlzaXQsIGFyZyk7CisgICAgICAgICAgICBpZiAoZXJyKQorICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICAgICAgYmFzZSA9IGJhc2UtPnRwX2Jhc2U7CisgICAgICAgIGFzc2VydChiYXNlKTsKKyAgICB9CiAKLQlpZiAodHlwZS0+dHBfZGljdG9mZnNldCAhPSBiYXNlLT50cF9kaWN0b2Zmc2V0KSB7Ci0JCVB5T2JqZWN0ICoqZGljdHB0ciA9IF9QeU9iamVjdF9HZXREaWN0UHRyKHNlbGYpOwotCQlpZiAoZGljdHB0ciAmJiAqZGljdHB0cikKLQkJCVB5X1ZJU0lUKCpkaWN0cHRyKTsKLQl9CisgICAgaWYgKHR5cGUtPnRwX2RpY3RvZmZzZXQgIT0gYmFzZS0+dHBfZGljdG9mZnNldCkgeworICAgICAgICBQeU9iamVjdCAqKmRpY3RwdHIgPSBfUHlPYmplY3RfR2V0RGljdFB0cihzZWxmKTsKKyAgICAgICAgaWYgKGRpY3RwdHIgJiYgKmRpY3RwdHIpCisgICAgICAgICAgICBQeV9WSVNJVCgqZGljdHB0cik7CisgICAgfQogCi0JaWYgKHR5cGUtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IRUFQVFlQRSkKLQkJLyogRm9yIGEgaGVhcHR5cGUsIHRoZSBpbnN0YW5jZXMgY291bnQgYXMgcmVmZXJlbmNlcwotCQkgICB0byB0aGUgdHlwZS4JIFRyYXZlcnNlIHRoZSB0eXBlIHNvIHRoZSBjb2xsZWN0b3IKLQkJICAgY2FuIGZpbmQgY3ljbGVzIGludm9sdmluZyB0aGlzIGxpbmsuICovCi0JCVB5X1ZJU0lUKHR5cGUpOworICAgIGlmICh0eXBlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEVBUFRZUEUpCisgICAgICAgIC8qIEZvciBhIGhlYXB0eXBlLCB0aGUgaW5zdGFuY2VzIGNvdW50IGFzIHJlZmVyZW5jZXMKKyAgICAgICAgICAgdG8gdGhlIHR5cGUuICAgICAgICAgIFRyYXZlcnNlIHRoZSB0eXBlIHNvIHRoZSBjb2xsZWN0b3IKKyAgICAgICAgICAgY2FuIGZpbmQgY3ljbGVzIGludm9sdmluZyB0aGlzIGxpbmsuICovCisgICAgICAgIFB5X1ZJU0lUKHR5cGUpOwogCi0JaWYgKGJhc2V0cmF2ZXJzZSkKLQkJcmV0dXJuIGJhc2V0cmF2ZXJzZShzZWxmLCB2aXNpdCwgYXJnKTsKLQlyZXR1cm4gMDsKKyAgICBpZiAoYmFzZXRyYXZlcnNlKQorICAgICAgICByZXR1cm4gYmFzZXRyYXZlcnNlKHNlbGYsIHZpc2l0LCBhcmcpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZAogY2xlYXJfc2xvdHMoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqc2VsZikKIHsKLQlQeV9zc2l6ZV90IGksIG47Ci0JUHlNZW1iZXJEZWYgKm1wOworICAgIFB5X3NzaXplX3QgaSwgbjsKKyAgICBQeU1lbWJlckRlZiAqbXA7CiAKLQluID0gUHlfU0laRSh0eXBlKTsKLQltcCA9IFB5SGVhcFR5cGVfR0VUX01FTUJFUlMoKFB5SGVhcFR5cGVPYmplY3QgKil0eXBlKTsKLQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrLCBtcCsrKSB7Ci0JCWlmIChtcC0+dHlwZSA9PSBUX09CSkVDVF9FWCAmJiAhKG1wLT5mbGFncyAmIFJFQURPTkxZKSkgewotCQkJY2hhciAqYWRkciA9IChjaGFyICopc2VsZiArIG1wLT5vZmZzZXQ7Ci0JCQlQeU9iamVjdCAqb2JqID0gKihQeU9iamVjdCAqKilhZGRyOwotCQkJaWYgKG9iaiAhPSBOVUxMKSB7Ci0JCQkJKihQeU9iamVjdCAqKilhZGRyID0gTlVMTDsKLQkJCQlQeV9ERUNSRUYob2JqKTsKLQkJCX0KLQkJfQotCX0KKyAgICBuID0gUHlfU0laRSh0eXBlKTsKKyAgICBtcCA9IFB5SGVhcFR5cGVfR0VUX01FTUJFUlMoKFB5SGVhcFR5cGVPYmplY3QgKil0eXBlKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrLCBtcCsrKSB7CisgICAgICAgIGlmIChtcC0+dHlwZSA9PSBUX09CSkVDVF9FWCAmJiAhKG1wLT5mbGFncyAmIFJFQURPTkxZKSkgeworICAgICAgICAgICAgY2hhciAqYWRkciA9IChjaGFyICopc2VsZiArIG1wLT5vZmZzZXQ7CisgICAgICAgICAgICBQeU9iamVjdCAqb2JqID0gKihQeU9iamVjdCAqKilhZGRyOworICAgICAgICAgICAgaWYgKG9iaiAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgKihQeU9iamVjdCAqKilhZGRyID0gTlVMTDsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYob2JqKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIH0KIAogc3RhdGljIGludAogc3VidHlwZV9jbGVhcihQeU9iamVjdCAqc2VsZikKIHsKLQlQeVR5cGVPYmplY3QgKnR5cGUsICpiYXNlOwotCWlucXVpcnkgYmFzZWNsZWFyOworICAgIFB5VHlwZU9iamVjdCAqdHlwZSwgKmJhc2U7CisgICAgaW5xdWlyeSBiYXNlY2xlYXI7CiAKLQkvKiBGaW5kIHRoZSBuZWFyZXN0IGJhc2Ugd2l0aCBhIGRpZmZlcmVudCB0cF9jbGVhcgotCSAgIGFuZCBjbGVhciBzbG90cyB3aGlsZSB3ZSdyZSBhdCBpdCAqLwotCXR5cGUgPSBQeV9UWVBFKHNlbGYpOwotCWJhc2UgPSB0eXBlOwotCXdoaWxlICgoYmFzZWNsZWFyID0gYmFzZS0+dHBfY2xlYXIpID09IHN1YnR5cGVfY2xlYXIpIHsKLQkJaWYgKFB5X1NJWkUoYmFzZSkpCi0JCQljbGVhcl9zbG90cyhiYXNlLCBzZWxmKTsKLQkJYmFzZSA9IGJhc2UtPnRwX2Jhc2U7Ci0JCWFzc2VydChiYXNlKTsKLQl9CisgICAgLyogRmluZCB0aGUgbmVhcmVzdCBiYXNlIHdpdGggYSBkaWZmZXJlbnQgdHBfY2xlYXIKKyAgICAgICBhbmQgY2xlYXIgc2xvdHMgd2hpbGUgd2UncmUgYXQgaXQgKi8KKyAgICB0eXBlID0gUHlfVFlQRShzZWxmKTsKKyAgICBiYXNlID0gdHlwZTsKKyAgICB3aGlsZSAoKGJhc2VjbGVhciA9IGJhc2UtPnRwX2NsZWFyKSA9PSBzdWJ0eXBlX2NsZWFyKSB7CisgICAgICAgIGlmIChQeV9TSVpFKGJhc2UpKQorICAgICAgICAgICAgY2xlYXJfc2xvdHMoYmFzZSwgc2VsZik7CisgICAgICAgIGJhc2UgPSBiYXNlLT50cF9iYXNlOworICAgICAgICBhc3NlcnQoYmFzZSk7CisgICAgfQogCi0JLyogVGhlcmUncyBubyBuZWVkIHRvIGNsZWFyIHRoZSBpbnN0YW5jZSBkaWN0IChpZiBhbnkpOwotCSAgIHRoZSBjb2xsZWN0b3Igd2lsbCBjYWxsIGl0cyB0cF9jbGVhciBoYW5kbGVyLiAqLworICAgIC8qIFRoZXJlJ3Mgbm8gbmVlZCB0byBjbGVhciB0aGUgaW5zdGFuY2UgZGljdCAoaWYgYW55KTsKKyAgICAgICB0aGUgY29sbGVjdG9yIHdpbGwgY2FsbCBpdHMgdHBfY2xlYXIgaGFuZGxlci4gKi8KIAotCWlmIChiYXNlY2xlYXIpCi0JCXJldHVybiBiYXNlY2xlYXIoc2VsZik7Ci0JcmV0dXJuIDA7CisgICAgaWYgKGJhc2VjbGVhcikKKyAgICAgICAgcmV0dXJuIGJhc2VjbGVhcihzZWxmKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQKIHN1YnR5cGVfZGVhbGxvYyhQeU9iamVjdCAqc2VsZikKIHsKLQlQeVR5cGVPYmplY3QgKnR5cGUsICpiYXNlOwotCWRlc3RydWN0b3IgYmFzZWRlYWxsb2M7CisgICAgUHlUeXBlT2JqZWN0ICp0eXBlLCAqYmFzZTsKKyAgICBkZXN0cnVjdG9yIGJhc2VkZWFsbG9jOwogCi0JLyogRXh0cmFjdCB0aGUgdHlwZTsgd2UgZXhwZWN0IGl0IHRvIGJlIGEgaGVhcCB0eXBlICovCi0JdHlwZSA9IFB5X1RZUEUoc2VsZik7Ci0JYXNzZXJ0KHR5cGUtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IRUFQVFlQRSk7CisgICAgLyogRXh0cmFjdCB0aGUgdHlwZTsgd2UgZXhwZWN0IGl0IHRvIGJlIGEgaGVhcCB0eXBlICovCisgICAgdHlwZSA9IFB5X1RZUEUoc2VsZik7CisgICAgYXNzZXJ0KHR5cGUtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IRUFQVFlQRSk7CiAKLQkvKiBUZXN0IHdoZXRoZXIgdGhlIHR5cGUgaGFzIEdDIGV4YWN0bHkgb25jZSAqLworICAgIC8qIFRlc3Qgd2hldGhlciB0aGUgdHlwZSBoYXMgR0MgZXhhY3RseSBvbmNlICovCiAKLQlpZiAoIVB5VHlwZV9JU19HQyh0eXBlKSkgewotCQkvKiBJdCdzIHJlYWxseSByYXJlIHRvIGZpbmQgYSBkeW5hbWljIHR5cGUgdGhhdCBkb2Vzbid0IGhhdmUKLQkJICAgR0M7IGl0IGNhbiBvbmx5IGhhcHBlbiB3aGVuIGRlcml2aW5nIGZyb20gJ29iamVjdCcgYW5kIG5vdAotCQkgICBhZGRpbmcgYW55IHNsb3RzIG9yIGluc3RhbmNlIHZhcmlhYmxlcy4gIFRoaXMgYWxsb3dzCi0JCSAgIGNlcnRhaW4gc2ltcGxpZmljYXRpb25zOiB0aGVyZSdzIG5vIG5lZWQgdG8gY2FsbAotCQkgICBjbGVhcl9zbG90cygpLCBvciBERUNSRUYgdGhlIGRpY3QsIG9yIGNsZWFyIHdlYWtyZWZzLiAqLworICAgIGlmICghUHlUeXBlX0lTX0dDKHR5cGUpKSB7CisgICAgICAgIC8qIEl0J3MgcmVhbGx5IHJhcmUgdG8gZmluZCBhIGR5bmFtaWMgdHlwZSB0aGF0IGRvZXNuJ3QgaGF2ZQorICAgICAgICAgICBHQzsgaXQgY2FuIG9ubHkgaGFwcGVuIHdoZW4gZGVyaXZpbmcgZnJvbSAnb2JqZWN0JyBhbmQgbm90CisgICAgICAgICAgIGFkZGluZyBhbnkgc2xvdHMgb3IgaW5zdGFuY2UgdmFyaWFibGVzLiAgVGhpcyBhbGxvd3MKKyAgICAgICAgICAgY2VydGFpbiBzaW1wbGlmaWNhdGlvbnM6IHRoZXJlJ3Mgbm8gbmVlZCB0byBjYWxsCisgICAgICAgICAgIGNsZWFyX3Nsb3RzKCksIG9yIERFQ1JFRiB0aGUgZGljdCwgb3IgY2xlYXIgd2Vha3JlZnMuICovCiAKLQkJLyogTWF5YmUgY2FsbCBmaW5hbGl6ZXI7IGV4aXQgZWFybHkgaWYgcmVzdXJyZWN0ZWQgKi8KLQkJaWYgKHR5cGUtPnRwX2RlbCkgewotCQkJdHlwZS0+dHBfZGVsKHNlbGYpOwotCQkJaWYgKHNlbGYtPm9iX3JlZmNudCA+IDApCi0JCQkJcmV0dXJuOwotCQl9CisgICAgICAgIC8qIE1heWJlIGNhbGwgZmluYWxpemVyOyBleGl0IGVhcmx5IGlmIHJlc3VycmVjdGVkICovCisgICAgICAgIGlmICh0eXBlLT50cF9kZWwpIHsKKyAgICAgICAgICAgIHR5cGUtPnRwX2RlbChzZWxmKTsKKyAgICAgICAgICAgIGlmIChzZWxmLT5vYl9yZWZjbnQgPiAwKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQogCi0JCS8qIEZpbmQgdGhlIG5lYXJlc3QgYmFzZSB3aXRoIGEgZGlmZmVyZW50IHRwX2RlYWxsb2MgKi8KLQkJYmFzZSA9IHR5cGU7Ci0JCXdoaWxlICgoYmFzZWRlYWxsb2MgPSBiYXNlLT50cF9kZWFsbG9jKSA9PSBzdWJ0eXBlX2RlYWxsb2MpIHsKLQkJCWFzc2VydChQeV9TSVpFKGJhc2UpID09IDApOwotCQkJYmFzZSA9IGJhc2UtPnRwX2Jhc2U7Ci0JCQlhc3NlcnQoYmFzZSk7Ci0JCX0KKyAgICAgICAgLyogRmluZCB0aGUgbmVhcmVzdCBiYXNlIHdpdGggYSBkaWZmZXJlbnQgdHBfZGVhbGxvYyAqLworICAgICAgICBiYXNlID0gdHlwZTsKKyAgICAgICAgd2hpbGUgKChiYXNlZGVhbGxvYyA9IGJhc2UtPnRwX2RlYWxsb2MpID09IHN1YnR5cGVfZGVhbGxvYykgeworICAgICAgICAgICAgYXNzZXJ0KFB5X1NJWkUoYmFzZSkgPT0gMCk7CisgICAgICAgICAgICBiYXNlID0gYmFzZS0+dHBfYmFzZTsKKyAgICAgICAgICAgIGFzc2VydChiYXNlKTsKKyAgICAgICAgfQogCi0JCS8qIEV4dHJhY3QgdGhlIHR5cGUgYWdhaW47IHRwX2RlbCBtYXkgaGF2ZSBjaGFuZ2VkIGl0ICovCi0JCXR5cGUgPSBQeV9UWVBFKHNlbGYpOworICAgICAgICAvKiBFeHRyYWN0IHRoZSB0eXBlIGFnYWluOyB0cF9kZWwgbWF5IGhhdmUgY2hhbmdlZCBpdCAqLworICAgICAgICB0eXBlID0gUHlfVFlQRShzZWxmKTsKIAotCQkvKiBDYWxsIHRoZSBiYXNlIHRwX2RlYWxsb2MoKSAqLwotCQlhc3NlcnQoYmFzZWRlYWxsb2MpOwotCQliYXNlZGVhbGxvYyhzZWxmKTsKKyAgICAgICAgLyogQ2FsbCB0aGUgYmFzZSB0cF9kZWFsbG9jKCkgKi8KKyAgICAgICAgYXNzZXJ0KGJhc2VkZWFsbG9jKTsKKyAgICAgICAgYmFzZWRlYWxsb2Moc2VsZik7CiAKLQkJLyogQ2FuJ3QgcmVmZXJlbmNlIHNlbGYgYmV5b25kIHRoaXMgcG9pbnQgKi8KLQkJUHlfREVDUkVGKHR5cGUpOworICAgICAgICAvKiBDYW4ndCByZWZlcmVuY2Ugc2VsZiBiZXlvbmQgdGhpcyBwb2ludCAqLworICAgICAgICBQeV9ERUNSRUYodHlwZSk7CiAKLQkJLyogRG9uZSAqLwotCQlyZXR1cm47Ci0JfQorICAgICAgICAvKiBEb25lICovCisgICAgICAgIHJldHVybjsKKyAgICB9CiAKLQkvKiBXZSBnZXQgaGVyZSBvbmx5IGlmIHRoZSB0eXBlIGhhcyBHQyAqLworICAgIC8qIFdlIGdldCBoZXJlIG9ubHkgaWYgdGhlIHR5cGUgaGFzIEdDICovCiAKLQkvKiBVblRyYWNrIGFuZCByZS1UcmFjayBhcm91bmQgdGhlIHRyYXNoY2FuIG1hY3JvLCBhbGFzICovCi0JLyogU2VlIGV4cGxhbmF0aW9uIGF0IGVuZCBvZiBmdW5jdGlvbiBmb3IgZnVsbCBkaXNjbG9zdXJlICovCi0JUHlPYmplY3RfR0NfVW5UcmFjayhzZWxmKTsKLQkrK19QeVRyYXNoX2RlbGV0ZV9uZXN0aW5nOwotCVB5X1RSQVNIQ0FOX1NBRkVfQkVHSU4oc2VsZik7Ci0JLS1fUHlUcmFzaF9kZWxldGVfbmVzdGluZzsKLQkvKiBETyBOT1QgcmVzdG9yZSBHQyB0cmFja2luZyBhdCB0aGlzIHBvaW50LiAgd2Vha3JlZiBjYWxsYmFja3MKLQkgKiAoaWYgYW55LCBhbmQgd2hldGhlciBkaXJlY3RseSBoZXJlIG9yIGluZGlyZWN0bHkgaW4gc29tZXRoaW5nIHdlCi0JICogY2FsbCkgbWF5IHRyaWdnZXIgR0MsIGFuZCBpZiBzZWxmIGlzIHRyYWNrZWQgYXQgdGhhdCBwb2ludCwgaXQKLQkgKiB3aWxsIGxvb2sgbGlrZSB0cmFzaCB0byBHQyBhbmQgR0Mgd2lsbCB0cnkgdG8gZGVsZXRlIHNlbGYgYWdhaW4uCi0JICovCisgICAgLyogVW5UcmFjayBhbmQgcmUtVHJhY2sgYXJvdW5kIHRoZSB0cmFzaGNhbiBtYWNybywgYWxhcyAqLworICAgIC8qIFNlZSBleHBsYW5hdGlvbiBhdCBlbmQgb2YgZnVuY3Rpb24gZm9yIGZ1bGwgZGlzY2xvc3VyZSAqLworICAgIFB5T2JqZWN0X0dDX1VuVHJhY2soc2VsZik7CisgICAgKytfUHlUcmFzaF9kZWxldGVfbmVzdGluZzsKKyAgICBQeV9UUkFTSENBTl9TQUZFX0JFR0lOKHNlbGYpOworICAgIC0tX1B5VHJhc2hfZGVsZXRlX25lc3Rpbmc7CisgICAgLyogRE8gTk9UIHJlc3RvcmUgR0MgdHJhY2tpbmcgYXQgdGhpcyBwb2ludC4gIHdlYWtyZWYgY2FsbGJhY2tzCisgICAgICogKGlmIGFueSwgYW5kIHdoZXRoZXIgZGlyZWN0bHkgaGVyZSBvciBpbmRpcmVjdGx5IGluIHNvbWV0aGluZyB3ZQorICAgICAqIGNhbGwpIG1heSB0cmlnZ2VyIEdDLCBhbmQgaWYgc2VsZiBpcyB0cmFja2VkIGF0IHRoYXQgcG9pbnQsIGl0CisgICAgICogd2lsbCBsb29rIGxpa2UgdHJhc2ggdG8gR0MgYW5kIEdDIHdpbGwgdHJ5IHRvIGRlbGV0ZSBzZWxmIGFnYWluLgorICAgICAqLwogCi0JLyogRmluZCB0aGUgbmVhcmVzdCBiYXNlIHdpdGggYSBkaWZmZXJlbnQgdHBfZGVhbGxvYyAqLwotCWJhc2UgPSB0eXBlOwotCXdoaWxlICgoYmFzZWRlYWxsb2MgPSBiYXNlLT50cF9kZWFsbG9jKSA9PSBzdWJ0eXBlX2RlYWxsb2MpIHsKLQkJYmFzZSA9IGJhc2UtPnRwX2Jhc2U7Ci0JCWFzc2VydChiYXNlKTsKLQl9CisgICAgLyogRmluZCB0aGUgbmVhcmVzdCBiYXNlIHdpdGggYSBkaWZmZXJlbnQgdHBfZGVhbGxvYyAqLworICAgIGJhc2UgPSB0eXBlOworICAgIHdoaWxlICgoYmFzZWRlYWxsb2MgPSBiYXNlLT50cF9kZWFsbG9jKSA9PSBzdWJ0eXBlX2RlYWxsb2MpIHsKKyAgICAgICAgYmFzZSA9IGJhc2UtPnRwX2Jhc2U7CisgICAgICAgIGFzc2VydChiYXNlKTsKKyAgICB9CiAKLQkvKiBJZiB3ZSBhZGRlZCBhIHdlYWtsaXN0LCB3ZSBjbGVhciBpdC4JIERvIHRoaXMgKmJlZm9yZSogY2FsbGluZwotCSAgIHRoZSBmaW5hbGl6ZXIgKF9fZGVsX18pLCBjbGVhcmluZyBzbG90cywgb3IgY2xlYXJpbmcgdGhlIGluc3RhbmNlCi0JICAgZGljdC4gKi8KKyAgICAvKiBJZiB3ZSBhZGRlZCBhIHdlYWtsaXN0LCB3ZSBjbGVhciBpdC4gICAgICBEbyB0aGlzICpiZWZvcmUqIGNhbGxpbmcKKyAgICAgICB0aGUgZmluYWxpemVyIChfX2RlbF9fKSwgY2xlYXJpbmcgc2xvdHMsIG9yIGNsZWFyaW5nIHRoZSBpbnN0YW5jZQorICAgICAgIGRpY3QuICovCiAKLQlpZiAodHlwZS0+dHBfd2Vha2xpc3RvZmZzZXQgJiYgIWJhc2UtPnRwX3dlYWtsaXN0b2Zmc2V0KQotCQlQeU9iamVjdF9DbGVhcldlYWtSZWZzKHNlbGYpOworICAgIGlmICh0eXBlLT50cF93ZWFrbGlzdG9mZnNldCAmJiAhYmFzZS0+dHBfd2Vha2xpc3RvZmZzZXQpCisgICAgICAgIFB5T2JqZWN0X0NsZWFyV2Vha1JlZnMoc2VsZik7CiAKLQkvKiBNYXliZSBjYWxsIGZpbmFsaXplcjsgZXhpdCBlYXJseSBpZiByZXN1cnJlY3RlZCAqLwotCWlmICh0eXBlLT50cF9kZWwpIHsKLQkJX1B5T2JqZWN0X0dDX1RSQUNLKHNlbGYpOwotCQl0eXBlLT50cF9kZWwoc2VsZik7Ci0JCWlmIChzZWxmLT5vYl9yZWZjbnQgPiAwKQotCQkJZ290byBlbmRsYWJlbDsJLyogcmVzdXJyZWN0ZWQgKi8KLQkJZWxzZQotCQkJX1B5T2JqZWN0X0dDX1VOVFJBQ0soc2VsZik7Ci0JCS8qIE5ldyB3ZWFrcmVmcyBjb3VsZCBiZSBjcmVhdGVkIGR1cmluZyB0aGUgZmluYWxpemVyIGNhbGwuCi0JCSAgICBJZiB0aGlzIG9jY3VycywgY2xlYXIgdGhlbSBvdXQgd2l0aG91dCBjYWxsaW5nIHRoZWlyCi0JCSAgICBmaW5hbGl6ZXJzIHNpbmNlIHRoZXkgbWlnaHQgcmVseSBvbiBwYXJ0IG9mIHRoZSBvYmplY3QKLQkJICAgIGJlaW5nIGZpbmFsaXplZCB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gZGVzdHJveWVkLiAqLwotCQlpZiAodHlwZS0+dHBfd2Vha2xpc3RvZmZzZXQgJiYgIWJhc2UtPnRwX3dlYWtsaXN0b2Zmc2V0KSB7Ci0JCQkvKiBNb2RlbGVkIGFmdGVyIEdFVF9XRUFLUkVGU19MSVNUUFRSKCkgKi8KLQkJCVB5V2Vha1JlZmVyZW5jZSAqKmxpc3QgPSAoUHlXZWFrUmVmZXJlbmNlICoqKSBcCi0JCQkJUHlPYmplY3RfR0VUX1dFQUtSRUZTX0xJU1RQVFIoc2VsZik7Ci0JCQl3aGlsZSAoKmxpc3QpCi0JCQkJX1B5V2Vha3JlZl9DbGVhclJlZigqbGlzdCk7Ci0JCX0KLQl9CisgICAgLyogTWF5YmUgY2FsbCBmaW5hbGl6ZXI7IGV4aXQgZWFybHkgaWYgcmVzdXJyZWN0ZWQgKi8KKyAgICBpZiAodHlwZS0+dHBfZGVsKSB7CisgICAgICAgIF9QeU9iamVjdF9HQ19UUkFDSyhzZWxmKTsKKyAgICAgICAgdHlwZS0+dHBfZGVsKHNlbGYpOworICAgICAgICBpZiAoc2VsZi0+b2JfcmVmY250ID4gMCkKKyAgICAgICAgICAgIGdvdG8gZW5kbGFiZWw7ICAgICAgICAgICAgICAvKiByZXN1cnJlY3RlZCAqLworICAgICAgICBlbHNlCisgICAgICAgICAgICBfUHlPYmplY3RfR0NfVU5UUkFDSyhzZWxmKTsKKyAgICAgICAgLyogTmV3IHdlYWtyZWZzIGNvdWxkIGJlIGNyZWF0ZWQgZHVyaW5nIHRoZSBmaW5hbGl6ZXIgY2FsbC4KKyAgICAgICAgICAgIElmIHRoaXMgb2NjdXJzLCBjbGVhciB0aGVtIG91dCB3aXRob3V0IGNhbGxpbmcgdGhlaXIKKyAgICAgICAgICAgIGZpbmFsaXplcnMgc2luY2UgdGhleSBtaWdodCByZWx5IG9uIHBhcnQgb2YgdGhlIG9iamVjdAorICAgICAgICAgICAgYmVpbmcgZmluYWxpemVkIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBkZXN0cm95ZWQuICovCisgICAgICAgIGlmICh0eXBlLT50cF93ZWFrbGlzdG9mZnNldCAmJiAhYmFzZS0+dHBfd2Vha2xpc3RvZmZzZXQpIHsKKyAgICAgICAgICAgIC8qIE1vZGVsZWQgYWZ0ZXIgR0VUX1dFQUtSRUZTX0xJU1RQVFIoKSAqLworICAgICAgICAgICAgUHlXZWFrUmVmZXJlbmNlICoqbGlzdCA9IChQeVdlYWtSZWZlcmVuY2UgKiopIFwKKyAgICAgICAgICAgICAgICBQeU9iamVjdF9HRVRfV0VBS1JFRlNfTElTVFBUUihzZWxmKTsKKyAgICAgICAgICAgIHdoaWxlICgqbGlzdCkKKyAgICAgICAgICAgICAgICBfUHlXZWFrcmVmX0NsZWFyUmVmKCpsaXN0KTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qICBDbGVhciBzbG90cyB1cCB0byB0aGUgbmVhcmVzdCBiYXNlIHdpdGggYSBkaWZmZXJlbnQgdHBfZGVhbGxvYyAqLwotCWJhc2UgPSB0eXBlOwotCXdoaWxlICgoYmFzZWRlYWxsb2MgPSBiYXNlLT50cF9kZWFsbG9jKSA9PSBzdWJ0eXBlX2RlYWxsb2MpIHsKLQkJaWYgKFB5X1NJWkUoYmFzZSkpCi0JCQljbGVhcl9zbG90cyhiYXNlLCBzZWxmKTsKLQkJYmFzZSA9IGJhc2UtPnRwX2Jhc2U7Ci0JCWFzc2VydChiYXNlKTsKLQl9CisgICAgLyogIENsZWFyIHNsb3RzIHVwIHRvIHRoZSBuZWFyZXN0IGJhc2Ugd2l0aCBhIGRpZmZlcmVudCB0cF9kZWFsbG9jICovCisgICAgYmFzZSA9IHR5cGU7CisgICAgd2hpbGUgKChiYXNlZGVhbGxvYyA9IGJhc2UtPnRwX2RlYWxsb2MpID09IHN1YnR5cGVfZGVhbGxvYykgeworICAgICAgICBpZiAoUHlfU0laRShiYXNlKSkKKyAgICAgICAgICAgIGNsZWFyX3Nsb3RzKGJhc2UsIHNlbGYpOworICAgICAgICBiYXNlID0gYmFzZS0+dHBfYmFzZTsKKyAgICAgICAgYXNzZXJ0KGJhc2UpOworICAgIH0KIAotCS8qIElmIHdlIGFkZGVkIGEgZGljdCwgREVDUkVGIGl0ICovCi0JaWYgKHR5cGUtPnRwX2RpY3RvZmZzZXQgJiYgIWJhc2UtPnRwX2RpY3RvZmZzZXQpIHsKLQkJUHlPYmplY3QgKipkaWN0cHRyID0gX1B5T2JqZWN0X0dldERpY3RQdHIoc2VsZik7Ci0JCWlmIChkaWN0cHRyICE9IE5VTEwpIHsKLQkJCVB5T2JqZWN0ICpkaWN0ID0gKmRpY3RwdHI7Ci0JCQlpZiAoZGljdCAhPSBOVUxMKSB7Ci0JCQkJUHlfREVDUkVGKGRpY3QpOwotCQkJCSpkaWN0cHRyID0gTlVMTDsKLQkJCX0KLQkJfQotCX0KKyAgICAvKiBJZiB3ZSBhZGRlZCBhIGRpY3QsIERFQ1JFRiBpdCAqLworICAgIGlmICh0eXBlLT50cF9kaWN0b2Zmc2V0ICYmICFiYXNlLT50cF9kaWN0b2Zmc2V0KSB7CisgICAgICAgIFB5T2JqZWN0ICoqZGljdHB0ciA9IF9QeU9iamVjdF9HZXREaWN0UHRyKHNlbGYpOworICAgICAgICBpZiAoZGljdHB0ciAhPSBOVUxMKSB7CisgICAgICAgICAgICBQeU9iamVjdCAqZGljdCA9ICpkaWN0cHRyOworICAgICAgICAgICAgaWYgKGRpY3QgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihkaWN0KTsKKyAgICAgICAgICAgICAgICAqZGljdHB0ciA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAKLQkvKiBFeHRyYWN0IHRoZSB0eXBlIGFnYWluOyB0cF9kZWwgbWF5IGhhdmUgY2hhbmdlZCBpdCAqLwotCXR5cGUgPSBQeV9UWVBFKHNlbGYpOworICAgIC8qIEV4dHJhY3QgdGhlIHR5cGUgYWdhaW47IHRwX2RlbCBtYXkgaGF2ZSBjaGFuZ2VkIGl0ICovCisgICAgdHlwZSA9IFB5X1RZUEUoc2VsZik7CiAKLQkvKiBDYWxsIHRoZSBiYXNlIHRwX2RlYWxsb2MoKTsgZmlyc3QgcmV0cmFjayBzZWxmIGlmCi0JICogYmFzZWRlYWxsb2Mga25vd3MgYWJvdXQgZ2MuCi0JICovCi0JaWYgKFB5VHlwZV9JU19HQyhiYXNlKSkKLQkJX1B5T2JqZWN0X0dDX1RSQUNLKHNlbGYpOwotCWFzc2VydChiYXNlZGVhbGxvYyk7Ci0JYmFzZWRlYWxsb2Moc2VsZik7CisgICAgLyogQ2FsbCB0aGUgYmFzZSB0cF9kZWFsbG9jKCk7IGZpcnN0IHJldHJhY2sgc2VsZiBpZgorICAgICAqIGJhc2VkZWFsbG9jIGtub3dzIGFib3V0IGdjLgorICAgICAqLworICAgIGlmIChQeVR5cGVfSVNfR0MoYmFzZSkpCisgICAgICAgIF9QeU9iamVjdF9HQ19UUkFDSyhzZWxmKTsKKyAgICBhc3NlcnQoYmFzZWRlYWxsb2MpOworICAgIGJhc2VkZWFsbG9jKHNlbGYpOwogCi0JLyogQ2FuJ3QgcmVmZXJlbmNlIHNlbGYgYmV5b25kIHRoaXMgcG9pbnQgKi8KLQlQeV9ERUNSRUYodHlwZSk7CisgICAgLyogQ2FuJ3QgcmVmZXJlbmNlIHNlbGYgYmV5b25kIHRoaXMgcG9pbnQgKi8KKyAgICBQeV9ERUNSRUYodHlwZSk7CiAKICAgZW5kbGFiZWw6Ci0JKytfUHlUcmFzaF9kZWxldGVfbmVzdGluZzsKLQlQeV9UUkFTSENBTl9TQUZFX0VORChzZWxmKTsKLQktLV9QeVRyYXNoX2RlbGV0ZV9uZXN0aW5nOworICAgICsrX1B5VHJhc2hfZGVsZXRlX25lc3Rpbmc7CisgICAgUHlfVFJBU0hDQU5fU0FGRV9FTkQoc2VsZik7CisgICAgLS1fUHlUcmFzaF9kZWxldGVfbmVzdGluZzsKIAotCS8qIEV4cGxhbmF0aW9uIG9mIHRoZSB3ZWlyZG5lc3MgYXJvdW5kIHRoZSB0cmFzaGNhbiBtYWNyb3M6CisgICAgLyogRXhwbGFuYXRpb24gb2YgdGhlIHdlaXJkbmVzcyBhcm91bmQgdGhlIHRyYXNoY2FuIG1hY3JvczoKIAotCSAgIFEuIFdoYXQgZG8gdGhlIHRyYXNoY2FuIG1hY3JvcyBkbz8KKyAgICAgICBRLiBXaGF0IGRvIHRoZSB0cmFzaGNhbiBtYWNyb3MgZG8/CiAKLQkgICBBLiBSZWFkIHRoZSBjb21tZW50IHRpdGxlZCAiVHJhc2hjYW4gbWVjaGFuaXNtIiBpbiBvYmplY3QuaC4KLQkgICAgICBGb3Igb25lLCB0aGlzIGV4cGxhaW5zIHdoeSB0aGVyZSBtdXN0IGJlIGEgY2FsbCB0byBHQy11bnRyYWNrCi0JICAgICAgYmVmb3JlIHRoZSB0cmFzaGNhbiBiZWdpbiBtYWNyby4JV2l0aG91dCB1bmRlcnN0YW5kaW5nIHRoZQotCSAgICAgIHRyYXNoY2FuIGNvZGUsIHRoZSBhbnN3ZXJzIHRvIHRoZSBmb2xsb3dpbmcgcXVlc3Rpb25zIGRvbid0IG1ha2UKLQkgICAgICBzZW5zZS4KKyAgICAgICBBLiBSZWFkIHRoZSBjb21tZW50IHRpdGxlZCAiVHJhc2hjYW4gbWVjaGFuaXNtIiBpbiBvYmplY3QuaC4KKyAgICAgICAgICBGb3Igb25lLCB0aGlzIGV4cGxhaW5zIHdoeSB0aGVyZSBtdXN0IGJlIGEgY2FsbCB0byBHQy11bnRyYWNrCisgICAgICAgICAgYmVmb3JlIHRoZSB0cmFzaGNhbiBiZWdpbiBtYWNyby4gICAgICBXaXRob3V0IHVuZGVyc3RhbmRpbmcgdGhlCisgICAgICAgICAgdHJhc2hjYW4gY29kZSwgdGhlIGFuc3dlcnMgdG8gdGhlIGZvbGxvd2luZyBxdWVzdGlvbnMgZG9uJ3QgbWFrZQorICAgICAgICAgIHNlbnNlLgogCi0JICAgUS4gV2h5IGRvIHdlIEdDLXVudHJhY2sgYmVmb3JlIHRoZSB0cmFzaGNhbiBhbmQgdGhlbiBpbW1lZGlhdGVseQotCSAgICAgIEdDLXRyYWNrIGFnYWluIGFmdGVyd2FyZD8KKyAgICAgICBRLiBXaHkgZG8gd2UgR0MtdW50cmFjayBiZWZvcmUgdGhlIHRyYXNoY2FuIGFuZCB0aGVuIGltbWVkaWF0ZWx5CisgICAgICAgICAgR0MtdHJhY2sgYWdhaW4gYWZ0ZXJ3YXJkPwogCi0JICAgQS4gSW4gdGhlIGNhc2UgdGhhdCB0aGUgYmFzZSBjbGFzcyBpcyBHQy1hd2FyZSwgdGhlIGJhc2UgY2xhc3MKLQkgICAgICBwcm9iYWJseSBHQy11bnRyYWNrcyB0aGUgb2JqZWN0LglJZiBpdCBkb2VzIHRoYXQgdXNpbmcgdGhlCi0JICAgICAgVU5UUkFDSyBtYWNybywgdGhpcyB3aWxsIGNyYXNoIHdoZW4gdGhlIG9iamVjdCBpcyBhbHJlYWR5Ci0JICAgICAgdW50cmFja2VkLiAgQmVjYXVzZSB3ZSBkb24ndCBrbm93IHdoYXQgdGhlIGJhc2UgY2xhc3MgZG9lcywgdGhlCi0JICAgICAgb25seSBzYWZlIHRoaW5nIGlzIHRvIG1ha2Ugc3VyZSB0aGUgb2JqZWN0IGlzIHRyYWNrZWQgd2hlbiB3ZQotCSAgICAgIGNhbGwgdGhlIGJhc2UgY2xhc3MgZGVhbGxvYy4gIEJ1dC4uLiAgVGhlIHRyYXNoY2FuIGJlZ2luIG1hY3JvCi0JICAgICAgcmVxdWlyZXMgdGhhdCB0aGUgb2JqZWN0IGlzICp1bnRyYWNrZWQqIGJlZm9yZSBpdCBpcyBjYWxsZWQuICBTbwotCSAgICAgIHRoZSBkYW5jZSBiZWNvbWVzOgorICAgICAgIEEuIEluIHRoZSBjYXNlIHRoYXQgdGhlIGJhc2UgY2xhc3MgaXMgR0MtYXdhcmUsIHRoZSBiYXNlIGNsYXNzCisgICAgICAgICAgcHJvYmFibHkgR0MtdW50cmFja3MgdGhlIG9iamVjdC4gICAgICBJZiBpdCBkb2VzIHRoYXQgdXNpbmcgdGhlCisgICAgICAgICAgVU5UUkFDSyBtYWNybywgdGhpcyB3aWxsIGNyYXNoIHdoZW4gdGhlIG9iamVjdCBpcyBhbHJlYWR5CisgICAgICAgICAgdW50cmFja2VkLiAgQmVjYXVzZSB3ZSBkb24ndCBrbm93IHdoYXQgdGhlIGJhc2UgY2xhc3MgZG9lcywgdGhlCisgICAgICAgICAgb25seSBzYWZlIHRoaW5nIGlzIHRvIG1ha2Ugc3VyZSB0aGUgb2JqZWN0IGlzIHRyYWNrZWQgd2hlbiB3ZQorICAgICAgICAgIGNhbGwgdGhlIGJhc2UgY2xhc3MgZGVhbGxvYy4gIEJ1dC4uLiAgVGhlIHRyYXNoY2FuIGJlZ2luIG1hY3JvCisgICAgICAgICAgcmVxdWlyZXMgdGhhdCB0aGUgb2JqZWN0IGlzICp1bnRyYWNrZWQqIGJlZm9yZSBpdCBpcyBjYWxsZWQuICBTbworICAgICAgICAgIHRoZSBkYW5jZSBiZWNvbWVzOgogCi0JCSBHQyB1bnRyYWNrCi0JCSB0cmFzaGNhbiBiZWdpbgotCQkgR0MgdHJhY2sKKyAgICAgICAgIEdDIHVudHJhY2sKKyAgICAgICAgIHRyYXNoY2FuIGJlZ2luCisgICAgICAgICBHQyB0cmFjawogCi0JICAgUS4gV2h5IGRpZCB0aGUgbGFzdCBxdWVzdGlvbiBzYXkgImltbWVkaWF0ZWx5IEdDLXRyYWNrIGFnYWluIj8KLQkgICAgICBJdCdzIG5vd2hlcmUgbmVhciBpbW1lZGlhdGVseS4KKyAgICAgICBRLiBXaHkgZGlkIHRoZSBsYXN0IHF1ZXN0aW9uIHNheSAiaW1tZWRpYXRlbHkgR0MtdHJhY2sgYWdhaW4iPworICAgICAgICAgIEl0J3Mgbm93aGVyZSBuZWFyIGltbWVkaWF0ZWx5LgogCi0JICAgQS4gQmVjYXVzZSB0aGUgY29kZSAqdXNlZCogdG8gcmUtdHJhY2sgaW1tZWRpYXRlbHkuCUJhZCBJZGVhLgotCSAgICAgIHNlbGYgaGFzIGEgcmVmY291bnQgb2YgMCwgYW5kIGlmIGdjIGV2ZXIgZ2V0cyBpdHMgaGFuZHMgb24gaXQKLQkgICAgICAod2hpY2ggY2FuIGhhcHBlbiBpZiBhbnkgd2Vha3JlZiBjYWxsYmFjayBnZXRzIGludm9rZWQpLCBpdAotCSAgICAgIGxvb2tzIGxpa2UgdHJhc2ggdG8gZ2MgdG9vLCBhbmQgZ2MgYWxzbyB0cmllcyB0byBkZWxldGUgc2VsZgotCSAgICAgIHRoZW4uICBCdXQgd2UncmUgYWxyZWFkeSBkZWxldGluZyBzZWxmLiAgRG91YmxlIGRlYWxsb2N0aW9uIGlzCi0JICAgICAgYSBzdWJ0bGUgZGlzYXN0ZXIuCisgICAgICAgQS4gQmVjYXVzZSB0aGUgY29kZSAqdXNlZCogdG8gcmUtdHJhY2sgaW1tZWRpYXRlbHkuICAgICAgQmFkIElkZWEuCisgICAgICAgICAgc2VsZiBoYXMgYSByZWZjb3VudCBvZiAwLCBhbmQgaWYgZ2MgZXZlciBnZXRzIGl0cyBoYW5kcyBvbiBpdAorICAgICAgICAgICh3aGljaCBjYW4gaGFwcGVuIGlmIGFueSB3ZWFrcmVmIGNhbGxiYWNrIGdldHMgaW52b2tlZCksIGl0CisgICAgICAgICAgbG9va3MgbGlrZSB0cmFzaCB0byBnYyB0b28sIGFuZCBnYyBhbHNvIHRyaWVzIHRvIGRlbGV0ZSBzZWxmCisgICAgICAgICAgdGhlbi4gIEJ1dCB3ZSdyZSBhbHJlYWR5IGRlbGV0aW5nIHNlbGYuICBEb3VibGUgZGVhbGxvY3Rpb24gaXMKKyAgICAgICAgICBhIHN1YnRsZSBkaXNhc3Rlci4KIAotCSAgIFEuIFdoeSB0aGUgYml6YXJyZSAobmV0LXplcm8pIG1hbmlwdWxhdGlvbiBvZgotCSAgICAgIF9QeVRyYXNoX2RlbGV0ZV9uZXN0aW5nIGFyb3VuZCB0aGUgdHJhc2hjYW4gbWFjcm9zPworICAgICAgIFEuIFdoeSB0aGUgYml6YXJyZSAobmV0LXplcm8pIG1hbmlwdWxhdGlvbiBvZgorICAgICAgICAgIF9QeVRyYXNoX2RlbGV0ZV9uZXN0aW5nIGFyb3VuZCB0aGUgdHJhc2hjYW4gbWFjcm9zPwogCi0JICAgQS4gU29tZSBiYXNlIGNsYXNzZXMgKGUuZy4gbGlzdCkgYWxzbyB1c2UgdGhlIHRyYXNoY2FuIG1lY2hhbmlzbS4KLQkgICAgICBUaGUgZm9sbG93aW5nIHNjZW5hcmlvIHVzZWQgdG8gYmUgcG9zc2libGU6CisgICAgICAgQS4gU29tZSBiYXNlIGNsYXNzZXMgKGUuZy4gbGlzdCkgYWxzbyB1c2UgdGhlIHRyYXNoY2FuIG1lY2hhbmlzbS4KKyAgICAgICAgICBUaGUgZm9sbG93aW5nIHNjZW5hcmlvIHVzZWQgdG8gYmUgcG9zc2libGU6CiAKLQkgICAgICAtIHN1cHBvc2UgdGhlIHRyYXNoY2FuIGxldmVsIGlzIG9uZSBiZWxvdyB0aGUgdHJhc2hjYW4gbGltaXQKKyAgICAgICAgICAtIHN1cHBvc2UgdGhlIHRyYXNoY2FuIGxldmVsIGlzIG9uZSBiZWxvdyB0aGUgdHJhc2hjYW4gbGltaXQKIAotCSAgICAgIC0gc3VidHlwZV9kZWFsbG9jKCkgaXMgY2FsbGVkCisgICAgICAgICAgLSBzdWJ0eXBlX2RlYWxsb2MoKSBpcyBjYWxsZWQKIAotCSAgICAgIC0gdGhlIHRyYXNoY2FuIGxpbWl0IGlzIG5vdCB5ZXQgcmVhY2hlZCwgc28gdGhlIHRyYXNoY2FuIGxldmVsCi0JCWlzIGluY3JlbWVudGVkIGFuZCB0aGUgY29kZSBiZXR3ZWVuIHRyYXNoY2FuIGJlZ2luIGFuZCBlbmQgaXMKLQkJZXhlY3V0ZWQKKyAgICAgICAgICAtIHRoZSB0cmFzaGNhbiBsaW1pdCBpcyBub3QgeWV0IHJlYWNoZWQsIHNvIHRoZSB0cmFzaGNhbiBsZXZlbAorICAgICAgICBpcyBpbmNyZW1lbnRlZCBhbmQgdGhlIGNvZGUgYmV0d2VlbiB0cmFzaGNhbiBiZWdpbiBhbmQgZW5kIGlzCisgICAgICAgIGV4ZWN1dGVkCiAKLQkgICAgICAtIHRoaXMgZGVzdHJveXMgbXVjaCBvZiB0aGUgb2JqZWN0J3MgY29udGVudHMsIGluY2x1ZGluZyBpdHMKLQkJc2xvdHMgYW5kIF9fZGljdF9fCisgICAgICAgICAgLSB0aGlzIGRlc3Ryb3lzIG11Y2ggb2YgdGhlIG9iamVjdCdzIGNvbnRlbnRzLCBpbmNsdWRpbmcgaXRzCisgICAgICAgIHNsb3RzIGFuZCBfX2RpY3RfXwogCi0JICAgICAgLSBiYXNlZGVhbGxvYygpIGlzIGNhbGxlZDsgdGhpcyBpcyByZWFsbHkgbGlzdF9kZWFsbG9jKCksIG9yCi0JCXNvbWUgb3RoZXIgdHlwZSB3aGljaCBhbHNvIHVzZXMgdGhlIHRyYXNoY2FuIG1hY3JvcworICAgICAgICAgIC0gYmFzZWRlYWxsb2MoKSBpcyBjYWxsZWQ7IHRoaXMgaXMgcmVhbGx5IGxpc3RfZGVhbGxvYygpLCBvcgorICAgICAgICBzb21lIG90aGVyIHR5cGUgd2hpY2ggYWxzbyB1c2VzIHRoZSB0cmFzaGNhbiBtYWNyb3MKIAotCSAgICAgIC0gdGhlIHRyYXNoY2FuIGxpbWl0IGlzIG5vdyByZWFjaGVkLCBzbyB0aGUgb2JqZWN0IGlzIHB1dCBvbiB0aGUKLQkJdHJhc2hjYW4ncyB0by1iZS1kZWxldGVkLWxhdGVyIGxpc3QKKyAgICAgICAgICAtIHRoZSB0cmFzaGNhbiBsaW1pdCBpcyBub3cgcmVhY2hlZCwgc28gdGhlIG9iamVjdCBpcyBwdXQgb24gdGhlCisgICAgICAgIHRyYXNoY2FuJ3MgdG8tYmUtZGVsZXRlZC1sYXRlciBsaXN0CiAKLQkgICAgICAtIGJhc2VkZWFsbG9jKCkgcmV0dXJucworICAgICAgICAgIC0gYmFzZWRlYWxsb2MoKSByZXR1cm5zCiAKLQkgICAgICAtIHN1YnR5cGVfZGVhbGxvYygpIGRlY3JlZnMgdGhlIG9iamVjdCdzIHR5cGUKKyAgICAgICAgICAtIHN1YnR5cGVfZGVhbGxvYygpIGRlY3JlZnMgdGhlIG9iamVjdCdzIHR5cGUKIAotCSAgICAgIC0gc3VidHlwZV9kZWFsbG9jKCkgcmV0dXJucworICAgICAgICAgIC0gc3VidHlwZV9kZWFsbG9jKCkgcmV0dXJucwogCi0JICAgICAgLSBsYXRlciwgdGhlIHRyYXNoY2FuIGNvZGUgc3RhcnRzIGRlbGV0aW5nIHRoZSBvYmplY3RzIGZyb20gaXRzCi0JCXRvLWJlLWRlbGV0ZWQtbGF0ZXIgbGlzdAorICAgICAgICAgIC0gbGF0ZXIsIHRoZSB0cmFzaGNhbiBjb2RlIHN0YXJ0cyBkZWxldGluZyB0aGUgb2JqZWN0cyBmcm9tIGl0cworICAgICAgICB0by1iZS1kZWxldGVkLWxhdGVyIGxpc3QKIAotCSAgICAgIC0gc3VidHlwZV9kZWFsbG9jKCkgaXMgY2FsbGVkICpBR0FJTiogZm9yIHRoZSBzYW1lIG9iamVjdAorICAgICAgICAgIC0gc3VidHlwZV9kZWFsbG9jKCkgaXMgY2FsbGVkICpBR0FJTiogZm9yIHRoZSBzYW1lIG9iamVjdAogCi0JICAgICAgLSBhdCB0aGUgdmVyeSBsZWFzdCAoaWYgdGhlIGRlc3Ryb3llZCBzbG90cyBhbmQgX19kaWN0X18gZG9uJ3QKLQkJY2F1c2UgcHJvYmxlbXMpIHRoZSBvYmplY3QncyB0eXBlIGdldHMgZGVjcmVmJ2VkIGEgc2Vjb25kCi0JCXRpbWUsIHdoaWNoIGlzICpCQUQqISEhCisgICAgICAgICAgLSBhdCB0aGUgdmVyeSBsZWFzdCAoaWYgdGhlIGRlc3Ryb3llZCBzbG90cyBhbmQgX19kaWN0X18gZG9uJ3QKKyAgICAgICAgY2F1c2UgcHJvYmxlbXMpIHRoZSBvYmplY3QncyB0eXBlIGdldHMgZGVjcmVmJ2VkIGEgc2Vjb25kCisgICAgICAgIHRpbWUsIHdoaWNoIGlzICpCQUQqISEhCiAKLQkgICAgICBUaGUgcmVtZWR5IGlzIHRvIG1ha2Ugc3VyZSB0aGF0IGlmIHRoZSBjb2RlIGJldHdlZW4gdHJhc2hjYW4KLQkgICAgICBiZWdpbiBhbmQgZW5kIGluIHN1YnR5cGVfZGVhbGxvYygpIGlzIGNhbGxlZCwgdGhlIGNvZGUgYmV0d2VlbgotCSAgICAgIHRyYXNoY2FuIGJlZ2luIGFuZCBlbmQgaW4gYmFzZWRlYWxsb2MoKSB3aWxsIGFsc28gYmUgY2FsbGVkLgotCSAgICAgIFRoaXMgaXMgZG9uZSBieSBkZWNyZW1lbnRpbmcgdGhlIGxldmVsIGFmdGVyIHBhc3NpbmcgaW50byB0aGUKLQkgICAgICB0cmFzaGNhbiBibG9jaywgYW5kIGluY3JlbWVudGluZyBpdCBqdXN0IGJlZm9yZSBsZWF2aW5nIHRoZQotCSAgICAgIGJsb2NrLgorICAgICAgICAgIFRoZSByZW1lZHkgaXMgdG8gbWFrZSBzdXJlIHRoYXQgaWYgdGhlIGNvZGUgYmV0d2VlbiB0cmFzaGNhbgorICAgICAgICAgIGJlZ2luIGFuZCBlbmQgaW4gc3VidHlwZV9kZWFsbG9jKCkgaXMgY2FsbGVkLCB0aGUgY29kZSBiZXR3ZWVuCisgICAgICAgICAgdHJhc2hjYW4gYmVnaW4gYW5kIGVuZCBpbiBiYXNlZGVhbGxvYygpIHdpbGwgYWxzbyBiZSBjYWxsZWQuCisgICAgICAgICAgVGhpcyBpcyBkb25lIGJ5IGRlY3JlbWVudGluZyB0aGUgbGV2ZWwgYWZ0ZXIgcGFzc2luZyBpbnRvIHRoZQorICAgICAgICAgIHRyYXNoY2FuIGJsb2NrLCBhbmQgaW5jcmVtZW50aW5nIGl0IGp1c3QgYmVmb3JlIGxlYXZpbmcgdGhlCisgICAgICAgICAgYmxvY2suCiAKLQkgICAgICBCdXQgbm93IGl0J3MgcG9zc2libGUgdGhhdCBhIGNoYWluIG9mIG9iamVjdHMgY29uc2lzdGluZyBzb2xlbHkKLQkgICAgICBvZiBvYmplY3RzIHdob3NlIGRlYWxsb2NhdG9yIGlzIHN1YnR5cGVfZGVhbGxvYygpIHdpbGwgZGVmZWF0Ci0JICAgICAgdGhlIHRyYXNoY2FuIG1lY2hhbmlzbSBjb21wbGV0ZWx5OiB0aGUgZGVjcmVtZW50ZWQgbGV2ZWwgbWVhbnMKLQkgICAgICB0aGF0IHRoZSBlZmZlY3RpdmUgbGV2ZWwgbmV2ZXIgcmVhY2hlcyB0aGUgbGltaXQuCSBUaGVyZWZvcmUsIHdlCi0JICAgICAgKmluY3JlbWVudCogdGhlIGxldmVsICpiZWZvcmUqIGVudGVyaW5nIHRoZSB0cmFzaGNhbiBibG9jaywgYW5kCi0JICAgICAgbWF0Y2hpbmdseSBkZWNyZW1lbnQgaXQgYWZ0ZXIgbGVhdmluZy4gIFRoaXMgbWVhbnMgdGhlIHRyYXNoY2FuCi0JICAgICAgY29kZSB3aWxsIHRyaWdnZXIgYSBsaXR0bGUgZWFybHksIGJ1dCB0aGF0J3Mgbm8gYmlnIGRlYWwuCisgICAgICAgICAgQnV0IG5vdyBpdCdzIHBvc3NpYmxlIHRoYXQgYSBjaGFpbiBvZiBvYmplY3RzIGNvbnNpc3Rpbmcgc29sZWx5CisgICAgICAgICAgb2Ygb2JqZWN0cyB3aG9zZSBkZWFsbG9jYXRvciBpcyBzdWJ0eXBlX2RlYWxsb2MoKSB3aWxsIGRlZmVhdAorICAgICAgICAgIHRoZSB0cmFzaGNhbiBtZWNoYW5pc20gY29tcGxldGVseTogdGhlIGRlY3JlbWVudGVkIGxldmVsIG1lYW5zCisgICAgICAgICAgdGhhdCB0aGUgZWZmZWN0aXZlIGxldmVsIG5ldmVyIHJlYWNoZXMgdGhlIGxpbWl0LiAgICAgIFRoZXJlZm9yZSwgd2UKKyAgICAgICAgICAqaW5jcmVtZW50KiB0aGUgbGV2ZWwgKmJlZm9yZSogZW50ZXJpbmcgdGhlIHRyYXNoY2FuIGJsb2NrLCBhbmQKKyAgICAgICAgICBtYXRjaGluZ2x5IGRlY3JlbWVudCBpdCBhZnRlciBsZWF2aW5nLiAgVGhpcyBtZWFucyB0aGUgdHJhc2hjYW4KKyAgICAgICAgICBjb2RlIHdpbGwgdHJpZ2dlciBhIGxpdHRsZSBlYXJseSwgYnV0IHRoYXQncyBubyBiaWcgZGVhbC4KIAotCSAgIFEuIEFyZSB0aGVyZSBhbnkgbGl2ZSBleGFtcGxlcyBvZiBjb2RlIGluIG5lZWQgb2YgYWxsIHRoaXMKLQkgICAgICBjb21wbGV4aXR5PworICAgICAgIFEuIEFyZSB0aGVyZSBhbnkgbGl2ZSBleGFtcGxlcyBvZiBjb2RlIGluIG5lZWQgb2YgYWxsIHRoaXMKKyAgICAgICAgICBjb21wbGV4aXR5PwogCi0JICAgQS4gWWVzLiAgU2VlIFNGIGJ1ZyA2Njg0MzMgZm9yIGNvZGUgdGhhdCBjcmFzaGVkICh3aGVuIFB5dGhvbiB3YXMKLQkgICAgICBjb21waWxlZCBpbiBkZWJ1ZyBtb2RlKSBiZWZvcmUgdGhlIHRyYXNoY2FuIGxldmVsIG1hbmlwdWxhdGlvbnMKLQkgICAgICB3ZXJlIGFkZGVkLiAgRm9yIG1vcmUgZGlzY3Vzc2lvbiwgc2VlIFNGIHBhdGNoZXMgNTgxNzQyLCA1NzUwNzMKLQkgICAgICBhbmQgYnVnIDU3NDIwNy4KLQkqLworICAgICAgIEEuIFllcy4gIFNlZSBTRiBidWcgNjY4NDMzIGZvciBjb2RlIHRoYXQgY3Jhc2hlZCAod2hlbiBQeXRob24gd2FzCisgICAgICAgICAgY29tcGlsZWQgaW4gZGVidWcgbW9kZSkgYmVmb3JlIHRoZSB0cmFzaGNhbiBsZXZlbCBtYW5pcHVsYXRpb25zCisgICAgICAgICAgd2VyZSBhZGRlZC4gIEZvciBtb3JlIGRpc2N1c3Npb24sIHNlZSBTRiBwYXRjaGVzIDU4MTc0MiwgNTc1MDczCisgICAgICAgICAgYW5kIGJ1ZyA1NzQyMDcuCisgICAgKi8KIH0KIAogc3RhdGljIFB5VHlwZU9iamVjdCAqc29saWRfYmFzZShQeVR5cGVPYmplY3QgKnR5cGUpOwpAQCAtMTEzMiwzOSArMTEzMiwzOSBAQAogaW50CiBQeVR5cGVfSXNTdWJ0eXBlKFB5VHlwZU9iamVjdCAqYSwgUHlUeXBlT2JqZWN0ICpiKQogewotCVB5T2JqZWN0ICptcm87CisgICAgUHlPYmplY3QgKm1ybzsKIAotCWlmICghKGEtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IQVZFX0NMQVNTKSkKLQkJcmV0dXJuIGIgPT0gYSB8fCBiID09ICZQeUJhc2VPYmplY3RfVHlwZTsKKyAgICBpZiAoIShhLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEFWRV9DTEFTUykpCisgICAgICAgIHJldHVybiBiID09IGEgfHwgYiA9PSAmUHlCYXNlT2JqZWN0X1R5cGU7CiAKLQltcm8gPSBhLT50cF9tcm87Ci0JaWYgKG1ybyAhPSBOVUxMKSB7Ci0JCS8qIERlYWwgd2l0aCBtdWx0aXBsZSBpbmhlcml0YW5jZSB3aXRob3V0IHJlY3Vyc2lvbgotCQkgICBieSB3YWxraW5nIHRoZSBNUk8gdHVwbGUgKi8KLQkJUHlfc3NpemVfdCBpLCBuOwotCQlhc3NlcnQoUHlUdXBsZV9DaGVjayhtcm8pKTsKLQkJbiA9IFB5VHVwbGVfR0VUX1NJWkUobXJvKTsKLQkJZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQkJaWYgKFB5VHVwbGVfR0VUX0lURU0obXJvLCBpKSA9PSAoUHlPYmplY3QgKiliKQotCQkJCXJldHVybiAxOwotCQl9Ci0JCXJldHVybiAwOwotCX0KLQllbHNlIHsKLQkJLyogYSBpcyBub3QgY29tcGxldGVseSBpbml0aWxpemVkIHlldDsgZm9sbG93IHRwX2Jhc2UgKi8KLQkJZG8gewotCQkJaWYgKGEgPT0gYikKLQkJCQlyZXR1cm4gMTsKLQkJCWEgPSBhLT50cF9iYXNlOwotCQl9IHdoaWxlIChhICE9IE5VTEwpOwotCQlyZXR1cm4gYiA9PSAmUHlCYXNlT2JqZWN0X1R5cGU7Ci0JfQorICAgIG1ybyA9IGEtPnRwX21ybzsKKyAgICBpZiAobXJvICE9IE5VTEwpIHsKKyAgICAgICAgLyogRGVhbCB3aXRoIG11bHRpcGxlIGluaGVyaXRhbmNlIHdpdGhvdXQgcmVjdXJzaW9uCisgICAgICAgICAgIGJ5IHdhbGtpbmcgdGhlIE1STyB0dXBsZSAqLworICAgICAgICBQeV9zc2l6ZV90IGksIG47CisgICAgICAgIGFzc2VydChQeVR1cGxlX0NoZWNrKG1ybykpOworICAgICAgICBuID0gUHlUdXBsZV9HRVRfU0laRShtcm8pOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgICAgICBpZiAoUHlUdXBsZV9HRVRfSVRFTShtcm8sIGkpID09IChQeU9iamVjdCAqKWIpCisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvKiBhIGlzIG5vdCBjb21wbGV0ZWx5IGluaXRpbGl6ZWQgeWV0OyBmb2xsb3cgdHBfYmFzZSAqLworICAgICAgICBkbyB7CisgICAgICAgICAgICBpZiAoYSA9PSBiKQorICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgYSA9IGEtPnRwX2Jhc2U7CisgICAgICAgIH0gd2hpbGUgKGEgIT0gTlVMTCk7CisgICAgICAgIHJldHVybiBiID09ICZQeUJhc2VPYmplY3RfVHlwZTsKKyAgICB9CiB9CiAKIC8qIEludGVybmFsIHJvdXRpbmVzIHRvIGRvIGEgbWV0aG9kIGxvb2t1cCBpbiB0aGUgdHlwZQogICAgd2l0aG91dCBsb29raW5nIGluIHRoZSBpbnN0YW5jZSBkaWN0aW9uYXJ5CiAgICAoc28gd2UgY2FuJ3QgdXNlIFB5T2JqZWN0X0dldEF0dHIpIGJ1dCBzdGlsbCBiaW5kaW5nCi0gICBpdCB0byB0aGUgaW5zdGFuY2UuCVRoZSBhcmd1bWVudHMgYXJlIHRoZSBvYmplY3QsCisgICBpdCB0byB0aGUgaW5zdGFuY2UuICBUaGUgYXJndW1lbnRzIGFyZSB0aGUgb2JqZWN0LAogICAgdGhlIG1ldGhvZCBuYW1lIGFzIGEgQyBzdHJpbmcsIGFuZCB0aGUgYWRkcmVzcyBvZiBhCiAgICBzdGF0aWMgdmFyaWFibGUgdXNlZCB0byBjYWNoZSB0aGUgaW50ZXJuZWQgUHl0aG9uIHN0cmluZy4KIApAQCAtMTE3OSw2OSArMTE3OSw2OSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGxvb2t1cF9tYXliZShQeU9iamVjdCAqc2VsZiwgY2hhciAqYXR0cnN0ciwgUHlPYmplY3QgKiphdHRyb2JqKQogewotCVB5T2JqZWN0ICpyZXM7CisgICAgUHlPYmplY3QgKnJlczsKIAotCWlmICgqYXR0cm9iaiA9PSBOVUxMKSB7Ci0JCSphdHRyb2JqID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZyhhdHRyc3RyKTsKLQkJaWYgKCphdHRyb2JqID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmVzID0gX1B5VHlwZV9Mb29rdXAoUHlfVFlQRShzZWxmKSwgKmF0dHJvYmopOwotCWlmIChyZXMgIT0gTlVMTCkgewotCQlkZXNjcmdldGZ1bmMgZjsKLQkJaWYgKChmID0gUHlfVFlQRShyZXMpLT50cF9kZXNjcl9nZXQpID09IE5VTEwpCi0JCQlQeV9JTkNSRUYocmVzKTsKLQkJZWxzZQotCQkJcmVzID0gZihyZXMsIHNlbGYsIChQeU9iamVjdCAqKShQeV9UWVBFKHNlbGYpKSk7Ci0JfQotCXJldHVybiByZXM7CisgICAgaWYgKCphdHRyb2JqID09IE5VTEwpIHsKKyAgICAgICAgKmF0dHJvYmogPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKGF0dHJzdHIpOworICAgICAgICBpZiAoKmF0dHJvYmogPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXMgPSBfUHlUeXBlX0xvb2t1cChQeV9UWVBFKHNlbGYpLCAqYXR0cm9iaik7CisgICAgaWYgKHJlcyAhPSBOVUxMKSB7CisgICAgICAgIGRlc2NyZ2V0ZnVuYyBmOworICAgICAgICBpZiAoKGYgPSBQeV9UWVBFKHJlcyktPnRwX2Rlc2NyX2dldCkgPT0gTlVMTCkKKyAgICAgICAgICAgIFB5X0lOQ1JFRihyZXMpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXMgPSBmKHJlcywgc2VsZiwgKFB5T2JqZWN0ICopKFB5X1RZUEUoc2VsZikpKTsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGxvb2t1cF9tZXRob2QoUHlPYmplY3QgKnNlbGYsIGNoYXIgKmF0dHJzdHIsIFB5T2JqZWN0ICoqYXR0cm9iaikKIHsKLQlQeU9iamVjdCAqcmVzID0gbG9va3VwX21heWJlKHNlbGYsIGF0dHJzdHIsIGF0dHJvYmopOwotCWlmIChyZXMgPT0gTlVMTCAmJiAhUHlFcnJfT2NjdXJyZWQoKSkKLQkJUHlFcnJfU2V0T2JqZWN0KFB5RXhjX0F0dHJpYnV0ZUVycm9yLCAqYXR0cm9iaik7Ci0JcmV0dXJuIHJlczsKKyAgICBQeU9iamVjdCAqcmVzID0gbG9va3VwX21heWJlKHNlbGYsIGF0dHJzdHIsIGF0dHJvYmopOworICAgIGlmIChyZXMgPT0gTlVMTCAmJiAhUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgUHlFcnJfU2V0T2JqZWN0KFB5RXhjX0F0dHJpYnV0ZUVycm9yLCAqYXR0cm9iaik7CisgICAgcmV0dXJuIHJlczsKIH0KIAogLyogQSB2YXJpYXRpb24gb2YgUHlPYmplY3RfQ2FsbE1ldGhvZCB0aGF0IHVzZXMgbG9va3VwX21ldGhvZCgpCi0gICBpbnN0ZWFkIG9mIFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoKS4JIFRoaXMgdXNlcyB0aGUgc2FtZSBjb252ZW50aW9uCisgICBpbnN0ZWFkIG9mIFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoKS4gIFRoaXMgdXNlcyB0aGUgc2FtZSBjb252ZW50aW9uCiAgICBhcyBsb29rdXBfbWV0aG9kIHRvIGNhY2hlIHRoZSBpbnRlcm5lZCBuYW1lIHN0cmluZyBvYmplY3QuICovCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjYWxsX21ldGhvZChQeU9iamVjdCAqbywgY2hhciAqbmFtZSwgUHlPYmplY3QgKipuYW1lb2JqLCBjaGFyICpmb3JtYXQsIC4uLikKIHsKLQl2YV9saXN0IHZhOwotCVB5T2JqZWN0ICphcmdzLCAqZnVuYyA9IDAsICpyZXR2YWw7Ci0JdmFfc3RhcnQodmEsIGZvcm1hdCk7CisgICAgdmFfbGlzdCB2YTsKKyAgICBQeU9iamVjdCAqYXJncywgKmZ1bmMgPSAwLCAqcmV0dmFsOworICAgIHZhX3N0YXJ0KHZhLCBmb3JtYXQpOwogCi0JZnVuYyA9IGxvb2t1cF9tYXliZShvLCBuYW1lLCBuYW1lb2JqKTsKLQlpZiAoZnVuYyA9PSBOVUxMKSB7Ci0JCXZhX2VuZCh2YSk7Ci0JCWlmICghUHlFcnJfT2NjdXJyZWQoKSkKLQkJCVB5RXJyX1NldE9iamVjdChQeUV4Y19BdHRyaWJ1dGVFcnJvciwgKm5hbWVvYmopOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgZnVuYyA9IGxvb2t1cF9tYXliZShvLCBuYW1lLCBuYW1lb2JqKTsKKyAgICBpZiAoZnVuYyA9PSBOVUxMKSB7CisgICAgICAgIHZhX2VuZCh2YSk7CisgICAgICAgIGlmICghUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIFB5RXJyX1NldE9iamVjdChQeUV4Y19BdHRyaWJ1dGVFcnJvciwgKm5hbWVvYmopOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlpZiAoZm9ybWF0ICYmICpmb3JtYXQpCi0JCWFyZ3MgPSBQeV9WYUJ1aWxkVmFsdWUoZm9ybWF0LCB2YSk7Ci0JZWxzZQotCQlhcmdzID0gUHlUdXBsZV9OZXcoMCk7CisgICAgaWYgKGZvcm1hdCAmJiAqZm9ybWF0KQorICAgICAgICBhcmdzID0gUHlfVmFCdWlsZFZhbHVlKGZvcm1hdCwgdmEpOworICAgIGVsc2UKKyAgICAgICAgYXJncyA9IFB5VHVwbGVfTmV3KDApOwogCi0JdmFfZW5kKHZhKTsKKyAgICB2YV9lbmQodmEpOwogCi0JaWYgKGFyZ3MgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKGFyZ3MgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlhc3NlcnQoUHlUdXBsZV9DaGVjayhhcmdzKSk7Ci0JcmV0dmFsID0gUHlPYmplY3RfQ2FsbChmdW5jLCBhcmdzLCBOVUxMKTsKKyAgICBhc3NlcnQoUHlUdXBsZV9DaGVjayhhcmdzKSk7CisgICAgcmV0dmFsID0gUHlPYmplY3RfQ2FsbChmdW5jLCBhcmdzLCBOVUxMKTsKIAotCVB5X0RFQ1JFRihhcmdzKTsKLQlQeV9ERUNSRUYoZnVuYyk7CisgICAgUHlfREVDUkVGKGFyZ3MpOworICAgIFB5X0RFQ1JFRihmdW5jKTsKIAotCXJldHVybiByZXR2YWw7CisgICAgcmV0dXJuIHJldHZhbDsKIH0KIAogLyogQ2xvbmUgb2YgY2FsbF9tZXRob2QoKSB0aGF0IHJldHVybnMgTm90SW1wbGVtZW50ZWQgd2hlbiB0aGUgbG9va3VwIGZhaWxzLiAqLwpAQCAtMTI0OSw3OCArMTI0OSw3OCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGNhbGxfbWF5YmUoUHlPYmplY3QgKm8sIGNoYXIgKm5hbWUsIFB5T2JqZWN0ICoqbmFtZW9iaiwgY2hhciAqZm9ybWF0LCAuLi4pCiB7Ci0JdmFfbGlzdCB2YTsKLQlQeU9iamVjdCAqYXJncywgKmZ1bmMgPSAwLCAqcmV0dmFsOwotCXZhX3N0YXJ0KHZhLCBmb3JtYXQpOworICAgIHZhX2xpc3QgdmE7CisgICAgUHlPYmplY3QgKmFyZ3MsICpmdW5jID0gMCwgKnJldHZhbDsKKyAgICB2YV9zdGFydCh2YSwgZm9ybWF0KTsKIAotCWZ1bmMgPSBsb29rdXBfbWF5YmUobywgbmFtZSwgbmFtZW9iaik7Ci0JaWYgKGZ1bmMgPT0gTlVMTCkgewotCQl2YV9lbmQodmEpOwotCQlpZiAoIVB5RXJyX09jY3VycmVkKCkpIHsKLQkJCVB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7Ci0JCQlyZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7Ci0JCX0KLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGZ1bmMgPSBsb29rdXBfbWF5YmUobywgbmFtZSwgbmFtZW9iaik7CisgICAgaWYgKGZ1bmMgPT0gTlVMTCkgeworICAgICAgICB2YV9lbmQodmEpOworICAgICAgICBpZiAoIVB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7CisgICAgICAgICAgICByZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaWYgKGZvcm1hdCAmJiAqZm9ybWF0KQotCQlhcmdzID0gUHlfVmFCdWlsZFZhbHVlKGZvcm1hdCwgdmEpOwotCWVsc2UKLQkJYXJncyA9IFB5VHVwbGVfTmV3KDApOworICAgIGlmIChmb3JtYXQgJiYgKmZvcm1hdCkKKyAgICAgICAgYXJncyA9IFB5X1ZhQnVpbGRWYWx1ZShmb3JtYXQsIHZhKTsKKyAgICBlbHNlCisgICAgICAgIGFyZ3MgPSBQeVR1cGxlX05ldygwKTsKIAotCXZhX2VuZCh2YSk7CisgICAgdmFfZW5kKHZhKTsKIAotCWlmIChhcmdzID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIGlmIChhcmdzID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JYXNzZXJ0KFB5VHVwbGVfQ2hlY2soYXJncykpOwotCXJldHZhbCA9IFB5T2JqZWN0X0NhbGwoZnVuYywgYXJncywgTlVMTCk7CisgICAgYXNzZXJ0KFB5VHVwbGVfQ2hlY2soYXJncykpOworICAgIHJldHZhbCA9IFB5T2JqZWN0X0NhbGwoZnVuYywgYXJncywgTlVMTCk7CiAKLQlQeV9ERUNSRUYoYXJncyk7Ci0JUHlfREVDUkVGKGZ1bmMpOworICAgIFB5X0RFQ1JFRihhcmdzKTsKKyAgICBQeV9ERUNSRUYoZnVuYyk7CiAKLQlyZXR1cm4gcmV0dmFsOworICAgIHJldHVybiByZXR2YWw7CiB9CiAKIHN0YXRpYyBpbnQKIGZpbGxfY2xhc3NpY19tcm8oUHlPYmplY3QgKm1ybywgUHlPYmplY3QgKmNscykKIHsKLQlQeU9iamVjdCAqYmFzZXMsICpiYXNlOwotCVB5X3NzaXplX3QgaSwgbjsKKyAgICBQeU9iamVjdCAqYmFzZXMsICpiYXNlOworICAgIFB5X3NzaXplX3QgaSwgbjsKIAotCWFzc2VydChQeUxpc3RfQ2hlY2sobXJvKSk7Ci0JYXNzZXJ0KFB5Q2xhc3NfQ2hlY2soY2xzKSk7Ci0JaSA9IFB5U2VxdWVuY2VfQ29udGFpbnMobXJvLCBjbHMpOwotCWlmIChpIDwgMCkKLQkJcmV0dXJuIC0xOwotCWlmICghaSkgewotCQlpZiAoUHlMaXN0X0FwcGVuZChtcm8sIGNscykgPCAwKQotCQkJcmV0dXJuIC0xOwotCX0KLQliYXNlcyA9ICgoUHlDbGFzc09iamVjdCAqKWNscyktPmNsX2Jhc2VzOwotCWFzc2VydChiYXNlcyAmJiBQeVR1cGxlX0NoZWNrKGJhc2VzKSk7Ci0JbiA9IFB5VHVwbGVfR0VUX1NJWkUoYmFzZXMpOwotCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJYmFzZSA9IFB5VHVwbGVfR0VUX0lURU0oYmFzZXMsIGkpOwotCQlpZiAoZmlsbF9jbGFzc2ljX21ybyhtcm8sIGJhc2UpIDwgMCkKLQkJCXJldHVybiAtMTsKLQl9Ci0JcmV0dXJuIDA7CisgICAgYXNzZXJ0KFB5TGlzdF9DaGVjayhtcm8pKTsKKyAgICBhc3NlcnQoUHlDbGFzc19DaGVjayhjbHMpKTsKKyAgICBpID0gUHlTZXF1ZW5jZV9Db250YWlucyhtcm8sIGNscyk7CisgICAgaWYgKGkgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKCFpKSB7CisgICAgICAgIGlmIChQeUxpc3RfQXBwZW5kKG1ybywgY2xzKSA8IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGJhc2VzID0gKChQeUNsYXNzT2JqZWN0ICopY2xzKS0+Y2xfYmFzZXM7CisgICAgYXNzZXJ0KGJhc2VzICYmIFB5VHVwbGVfQ2hlY2soYmFzZXMpKTsKKyAgICBuID0gUHlUdXBsZV9HRVRfU0laRShiYXNlcyk7CisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICBiYXNlID0gUHlUdXBsZV9HRVRfSVRFTShiYXNlcywgaSk7CisgICAgICAgIGlmIChmaWxsX2NsYXNzaWNfbXJvKG1ybywgYmFzZSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNsYXNzaWNfbXJvKFB5T2JqZWN0ICpjbHMpCiB7Ci0JUHlPYmplY3QgKm1ybzsKKyAgICBQeU9iamVjdCAqbXJvOwogCi0JYXNzZXJ0KFB5Q2xhc3NfQ2hlY2soY2xzKSk7Ci0JbXJvID0gUHlMaXN0X05ldygwKTsKLQlpZiAobXJvICE9IE5VTEwpIHsKLQkJaWYgKGZpbGxfY2xhc3NpY19tcm8obXJvLCBjbHMpID09IDApCi0JCQlyZXR1cm4gbXJvOwotCQlQeV9ERUNSRUYobXJvKTsKLQl9Ci0JcmV0dXJuIE5VTEw7CisgICAgYXNzZXJ0KFB5Q2xhc3NfQ2hlY2soY2xzKSk7CisgICAgbXJvID0gUHlMaXN0X05ldygwKTsKKyAgICBpZiAobXJvICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKGZpbGxfY2xhc3NpY19tcm8obXJvLCBjbHMpID09IDApCisgICAgICAgICAgICByZXR1cm4gbXJvOworICAgICAgICBQeV9ERUNSRUYobXJvKTsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIC8qCkBAIC0xMzUzLDYzICsxMzUzLDYzIEBACiAKIHN0YXRpYyBpbnQKIHRhaWxfY29udGFpbnMoUHlPYmplY3QgKmxpc3QsIGludCB3aGVuY2UsIFB5T2JqZWN0ICpvKSB7Ci0JUHlfc3NpemVfdCBqLCBzaXplOwotCXNpemUgPSBQeUxpc3RfR0VUX1NJWkUobGlzdCk7CisgICAgUHlfc3NpemVfdCBqLCBzaXplOworICAgIHNpemUgPSBQeUxpc3RfR0VUX1NJWkUobGlzdCk7CiAKLQlmb3IgKGogPSB3aGVuY2UrMTsgaiA8IHNpemU7IGorKykgewotCQlpZiAoUHlMaXN0X0dFVF9JVEVNKGxpc3QsIGopID09IG8pCi0JCQlyZXR1cm4gMTsKLQl9Ci0JcmV0dXJuIDA7CisgICAgZm9yIChqID0gd2hlbmNlKzE7IGogPCBzaXplOyBqKyspIHsKKyAgICAgICAgaWYgKFB5TGlzdF9HRVRfSVRFTShsaXN0LCBqKSA9PSBvKQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY2xhc3NfbmFtZShQeU9iamVjdCAqY2xzKQogewotCVB5T2JqZWN0ICpuYW1lID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhjbHMsICJfX25hbWVfXyIpOwotCWlmIChuYW1lID09IE5VTEwpIHsKLQkJUHlFcnJfQ2xlYXIoKTsKLQkJUHlfWERFQ1JFRihuYW1lKTsKLQkJbmFtZSA9IFB5T2JqZWN0X1JlcHIoY2xzKTsKLQl9Ci0JaWYgKG5hbWUgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFQeVN0cmluZ19DaGVjayhuYW1lKSkgewotCQlQeV9ERUNSRUYobmFtZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gbmFtZTsKKyAgICBQeU9iamVjdCAqbmFtZSA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoY2xzLCAiX19uYW1lX18iKTsKKyAgICBpZiAobmFtZSA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIFB5X1hERUNSRUYobmFtZSk7CisgICAgICAgIG5hbWUgPSBQeU9iamVjdF9SZXByKGNscyk7CisgICAgfQorICAgIGlmIChuYW1lID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHlTdHJpbmdfQ2hlY2sobmFtZSkpIHsKKyAgICAgICAgUHlfREVDUkVGKG5hbWUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIG5hbWU7CiB9CiAKIHN0YXRpYyBpbnQKIGNoZWNrX2R1cGxpY2F0ZXMoUHlPYmplY3QgKmxpc3QpCiB7Ci0JUHlfc3NpemVfdCBpLCBqLCBuOwotCS8qIExldCdzIHVzZSBhIHF1YWRyYXRpYyB0aW1lIGFsZ29yaXRobSwKLQkgICBhc3N1bWluZyB0aGF0IHRoZSBiYXNlcyBsaXN0cyBpcyBzaG9ydC4KLQkqLwotCW4gPSBQeUxpc3RfR0VUX1NJWkUobGlzdCk7Ci0JZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQlQeU9iamVjdCAqbyA9IFB5TGlzdF9HRVRfSVRFTShsaXN0LCBpKTsKLQkJZm9yIChqID0gaSArIDE7IGogPCBuOyBqKyspIHsKLQkJCWlmIChQeUxpc3RfR0VUX0lURU0obGlzdCwgaikgPT0gbykgewotCQkJCW8gPSBjbGFzc19uYW1lKG8pOwotCQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkJCSAgICAgImR1cGxpY2F0ZSBiYXNlIGNsYXNzICVzIiwKLQkJCQkJICAgICBvID8gUHlTdHJpbmdfQVNfU1RSSU5HKG8pIDogIj8iKTsKLQkJCQlQeV9YREVDUkVGKG8pOwotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfQotCX0KLQlyZXR1cm4gMDsKKyAgICBQeV9zc2l6ZV90IGksIGosIG47CisgICAgLyogTGV0J3MgdXNlIGEgcXVhZHJhdGljIHRpbWUgYWxnb3JpdGhtLAorICAgICAgIGFzc3VtaW5nIHRoYXQgdGhlIGJhc2VzIGxpc3RzIGlzIHNob3J0LgorICAgICovCisgICAgbiA9IFB5TGlzdF9HRVRfU0laRShsaXN0KTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIFB5T2JqZWN0ICpvID0gUHlMaXN0X0dFVF9JVEVNKGxpc3QsIGkpOworICAgICAgICBmb3IgKGogPSBpICsgMTsgaiA8IG47IGorKykgeworICAgICAgICAgICAgaWYgKFB5TGlzdF9HRVRfSVRFTShsaXN0LCBqKSA9PSBvKSB7CisgICAgICAgICAgICAgICAgbyA9IGNsYXNzX25hbWUobyk7CisgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImR1cGxpY2F0ZSBiYXNlIGNsYXNzICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbyA/IFB5U3RyaW5nX0FTX1NUUklORyhvKSA6ICI/Iik7CisgICAgICAgICAgICAgICAgUHlfWERFQ1JFRihvKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIC8qIFJhaXNlIGEgVHlwZUVycm9yIGZvciBhbiBNUk8gb3JkZXIgZGlzYWdyZWVtZW50LgogCiAgICBJdCdzIGhhcmQgdG8gcHJvZHVjZSBhIGdvb2QgZXJyb3IgbWVzc2FnZS4gIEluIHRoZSBhYnNlbmNlIG9mIGJldHRlcgogICAgaW5zaWdodCBpbnRvIGVycm9yIHJlcG9ydGluZywgcmVwb3J0IHRoZSBjbGFzc2VzIHRoYXQgd2VyZSBjYW5kaWRhdGVzCi0gICB0byBiZSBwdXQgbmV4dCBpbnRvIHRoZSBNUk8uCSBUaGVyZSBpcyBzb21lIGNvbmZsaWN0IGJldHdlZW4gdGhlCisgICB0byBiZSBwdXQgbmV4dCBpbnRvIHRoZSBNUk8uICBUaGVyZSBpcyBzb21lIGNvbmZsaWN0IGJldHdlZW4gdGhlCiAgICBvcmRlciBpbiB3aGljaCB0aGV5IHNob3VsZCBiZSBwdXQgaW4gdGhlIE1STywgYnV0IGl0J3MgaGFyZCB0bwogICAgZGlhZ25vc2Ugd2hhdCBjb25zdHJhaW50IGNhbid0IGJlIHNhdGlzZmllZC4KICovCkBAIC0xNDE3LDI1OCArMTQxNywyNTggQEAKIHN0YXRpYyB2b2lkCiBzZXRfbXJvX2Vycm9yKFB5T2JqZWN0ICp0b19tZXJnZSwgaW50ICpyZW1haW4pCiB7Ci0JUHlfc3NpemVfdCBpLCBuLCBvZmYsIHRvX21lcmdlX3NpemU7Ci0JY2hhciBidWZbMTAwMF07Ci0JUHlPYmplY3QgKmssICp2OwotCVB5T2JqZWN0ICpzZXQgPSBQeURpY3RfTmV3KCk7Ci0JaWYgKCFzZXQpIHJldHVybjsKKyAgICBQeV9zc2l6ZV90IGksIG4sIG9mZiwgdG9fbWVyZ2Vfc2l6ZTsKKyAgICBjaGFyIGJ1ZlsxMDAwXTsKKyAgICBQeU9iamVjdCAqaywgKnY7CisgICAgUHlPYmplY3QgKnNldCA9IFB5RGljdF9OZXcoKTsKKyAgICBpZiAoIXNldCkgcmV0dXJuOwogCi0JdG9fbWVyZ2Vfc2l6ZSA9IFB5TGlzdF9HRVRfU0laRSh0b19tZXJnZSk7Ci0JZm9yIChpID0gMDsgaSA8IHRvX21lcmdlX3NpemU7IGkrKykgewotCQlQeU9iamVjdCAqTCA9IFB5TGlzdF9HRVRfSVRFTSh0b19tZXJnZSwgaSk7Ci0JCWlmIChyZW1haW5baV0gPCBQeUxpc3RfR0VUX1NJWkUoTCkpIHsKLQkJCVB5T2JqZWN0ICpjID0gUHlMaXN0X0dFVF9JVEVNKEwsIHJlbWFpbltpXSk7Ci0JCQlpZiAoUHlEaWN0X1NldEl0ZW0oc2V0LCBjLCBQeV9Ob25lKSA8IDApIHsKLQkJCQlQeV9ERUNSRUYoc2V0KTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQl9Ci0JbiA9IFB5RGljdF9TaXplKHNldCk7CisgICAgdG9fbWVyZ2Vfc2l6ZSA9IFB5TGlzdF9HRVRfU0laRSh0b19tZXJnZSk7CisgICAgZm9yIChpID0gMDsgaSA8IHRvX21lcmdlX3NpemU7IGkrKykgeworICAgICAgICBQeU9iamVjdCAqTCA9IFB5TGlzdF9HRVRfSVRFTSh0b19tZXJnZSwgaSk7CisgICAgICAgIGlmIChyZW1haW5baV0gPCBQeUxpc3RfR0VUX1NJWkUoTCkpIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpjID0gUHlMaXN0X0dFVF9JVEVNKEwsIHJlbWFpbltpXSk7CisgICAgICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW0oc2V0LCBjLCBQeV9Ob25lKSA8IDApIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoc2V0KTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgbiA9IFB5RGljdF9TaXplKHNldCk7CiAKLQlvZmYgPSBQeU9TX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJDYW5ub3QgY3JlYXRlIGEgXAorICAgIG9mZiA9IFB5T1Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIkNhbm5vdCBjcmVhdGUgYSBcCiBjb25zaXN0ZW50IG1ldGhvZCByZXNvbHV0aW9uXG5vcmRlciAoTVJPKSBmb3IgYmFzZXMiKTsKLQlpID0gMDsKLQl3aGlsZSAoUHlEaWN0X05leHQoc2V0LCAmaSwgJmssICZ2KSAmJiAoc2l6ZV90KW9mZiA8IHNpemVvZihidWYpKSB7Ci0JCVB5T2JqZWN0ICpuYW1lID0gY2xhc3NfbmFtZShrKTsKLQkJb2ZmICs9IFB5T1Nfc25wcmludGYoYnVmICsgb2ZmLCBzaXplb2YoYnVmKSAtIG9mZiwgIiAlcyIsCi0JCQkJICAgICBuYW1lID8gUHlTdHJpbmdfQVNfU1RSSU5HKG5hbWUpIDogIj8iKTsKLQkJUHlfWERFQ1JFRihuYW1lKTsKLQkJaWYgKC0tbiAmJiAoc2l6ZV90KShvZmYrMSkgPCBzaXplb2YoYnVmKSkgewotCQkJYnVmW29mZisrXSA9ICcsJzsKLQkJCWJ1ZltvZmZdID0gJ1wwJzsKLQkJfQotCX0KLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCBidWYpOwotCVB5X0RFQ1JFRihzZXQpOworICAgIGkgPSAwOworICAgIHdoaWxlIChQeURpY3RfTmV4dChzZXQsICZpLCAmaywgJnYpICYmIChzaXplX3Qpb2ZmIDwgc2l6ZW9mKGJ1ZikpIHsKKyAgICAgICAgUHlPYmplY3QgKm5hbWUgPSBjbGFzc19uYW1lKGspOworICAgICAgICBvZmYgKz0gUHlPU19zbnByaW50ZihidWYgKyBvZmYsIHNpemVvZihidWYpIC0gb2ZmLCAiICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA/IFB5U3RyaW5nX0FTX1NUUklORyhuYW1lKSA6ICI/Iik7CisgICAgICAgIFB5X1hERUNSRUYobmFtZSk7CisgICAgICAgIGlmICgtLW4gJiYgKHNpemVfdCkob2ZmKzEpIDwgc2l6ZW9mKGJ1ZikpIHsKKyAgICAgICAgICAgIGJ1ZltvZmYrK10gPSAnLCc7CisgICAgICAgICAgICBidWZbb2ZmXSA9ICdcMCc7CisgICAgICAgIH0KKyAgICB9CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgYnVmKTsKKyAgICBQeV9ERUNSRUYoc2V0KTsKIH0KIAogc3RhdGljIGludAogcG1lcmdlKFB5T2JqZWN0ICphY2MsIFB5T2JqZWN0KiB0b19tZXJnZSkgewotCVB5X3NzaXplX3QgaSwgaiwgdG9fbWVyZ2Vfc2l6ZSwgZW1wdHlfY250OwotCWludCAqcmVtYWluOwotCWludCBvazsKKyAgICBQeV9zc2l6ZV90IGksIGosIHRvX21lcmdlX3NpemUsIGVtcHR5X2NudDsKKyAgICBpbnQgKnJlbWFpbjsKKyAgICBpbnQgb2s7CiAKLQl0b19tZXJnZV9zaXplID0gUHlMaXN0X0dFVF9TSVpFKHRvX21lcmdlKTsKKyAgICB0b19tZXJnZV9zaXplID0gUHlMaXN0X0dFVF9TSVpFKHRvX21lcmdlKTsKIAotCS8qIHJlbWFpbiBzdG9yZXMgYW4gaW5kZXggaW50byBlYWNoIHN1Ymxpc3Qgb2YgdG9fbWVyZ2UuCi0JICAgcmVtYWluW2ldIGlzIHRoZSBpbmRleCBvZiB0aGUgbmV4dCBiYXNlIGluIHRvX21lcmdlW2ldCi0JICAgdGhhdCBpcyBub3QgaW5jbHVkZWQgaW4gYWNjLgotCSovCi0JcmVtYWluID0gKGludCAqKVB5TWVtX01BTExPQyhTSVpFT0ZfSU5UKnRvX21lcmdlX3NpemUpOwotCWlmIChyZW1haW4gPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCWZvciAoaSA9IDA7IGkgPCB0b19tZXJnZV9zaXplOyBpKyspCi0JCXJlbWFpbltpXSA9IDA7CisgICAgLyogcmVtYWluIHN0b3JlcyBhbiBpbmRleCBpbnRvIGVhY2ggc3VibGlzdCBvZiB0b19tZXJnZS4KKyAgICAgICByZW1haW5baV0gaXMgdGhlIGluZGV4IG9mIHRoZSBuZXh0IGJhc2UgaW4gdG9fbWVyZ2VbaV0KKyAgICAgICB0aGF0IGlzIG5vdCBpbmNsdWRlZCBpbiBhY2MuCisgICAgKi8KKyAgICByZW1haW4gPSAoaW50ICopUHlNZW1fTUFMTE9DKFNJWkVPRl9JTlQqdG9fbWVyZ2Vfc2l6ZSk7CisgICAgaWYgKHJlbWFpbiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAgZm9yIChpID0gMDsgaSA8IHRvX21lcmdlX3NpemU7IGkrKykKKyAgICAgICAgcmVtYWluW2ldID0gMDsKIAogICBhZ2FpbjoKLQllbXB0eV9jbnQgPSAwOwotCWZvciAoaSA9IDA7IGkgPCB0b19tZXJnZV9zaXplOyBpKyspIHsKLQkJUHlPYmplY3QgKmNhbmRpZGF0ZTsKKyAgICBlbXB0eV9jbnQgPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCB0b19tZXJnZV9zaXplOyBpKyspIHsKKyAgICAgICAgUHlPYmplY3QgKmNhbmRpZGF0ZTsKIAotCQlQeU9iamVjdCAqY3VyX2xpc3QgPSBQeUxpc3RfR0VUX0lURU0odG9fbWVyZ2UsIGkpOworICAgICAgICBQeU9iamVjdCAqY3VyX2xpc3QgPSBQeUxpc3RfR0VUX0lURU0odG9fbWVyZ2UsIGkpOwogCi0JCWlmIChyZW1haW5baV0gPj0gUHlMaXN0X0dFVF9TSVpFKGN1cl9saXN0KSkgewotCQkJZW1wdHlfY250Kys7Ci0JCQljb250aW51ZTsKLQkJfQorICAgICAgICBpZiAocmVtYWluW2ldID49IFB5TGlzdF9HRVRfU0laRShjdXJfbGlzdCkpIHsKKyAgICAgICAgICAgIGVtcHR5X2NudCsrOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KIAotCQkvKiBDaG9vc2UgbmV4dCBjYW5kaWRhdGUgZm9yIE1STy4KKyAgICAgICAgLyogQ2hvb3NlIG5leHQgY2FuZGlkYXRlIGZvciBNUk8uCiAKLQkJICAgVGhlIGlucHV0IHNlcXVlbmNlcyBhbG9uZSBjYW4gZGV0ZXJtaW5lIHRoZSBjaG9pY2UuCi0JCSAgIElmIG5vdCwgY2hvb3NlIHRoZSBjbGFzcyB3aGljaCBhcHBlYXJzIGluIHRoZSBNUk8KLQkJICAgb2YgdGhlIGVhcmxpZXN0IGRpcmVjdCBzdXBlcmNsYXNzIG9mIHRoZSBuZXcgY2xhc3MuCi0JCSovCisgICAgICAgICAgIFRoZSBpbnB1dCBzZXF1ZW5jZXMgYWxvbmUgY2FuIGRldGVybWluZSB0aGUgY2hvaWNlLgorICAgICAgICAgICBJZiBub3QsIGNob29zZSB0aGUgY2xhc3Mgd2hpY2ggYXBwZWFycyBpbiB0aGUgTVJPCisgICAgICAgICAgIG9mIHRoZSBlYXJsaWVzdCBkaXJlY3Qgc3VwZXJjbGFzcyBvZiB0aGUgbmV3IGNsYXNzLgorICAgICAgICAqLwogCi0JCWNhbmRpZGF0ZSA9IFB5TGlzdF9HRVRfSVRFTShjdXJfbGlzdCwgcmVtYWluW2ldKTsKLQkJZm9yIChqID0gMDsgaiA8IHRvX21lcmdlX3NpemU7IGorKykgewotCQkJUHlPYmplY3QgKmpfbHN0ID0gUHlMaXN0X0dFVF9JVEVNKHRvX21lcmdlLCBqKTsKLQkJCWlmICh0YWlsX2NvbnRhaW5zKGpfbHN0LCByZW1haW5bal0sIGNhbmRpZGF0ZSkpIHsKLQkJCQlnb3RvIHNraXA7IC8qIGNvbnRpbnVlIG91dGVyIGxvb3AgKi8KLQkJCX0KLQkJfQotCQlvayA9IFB5TGlzdF9BcHBlbmQoYWNjLCBjYW5kaWRhdGUpOwotCQlpZiAob2sgPCAwKSB7Ci0JCQlQeU1lbV9GcmVlKHJlbWFpbik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJZm9yIChqID0gMDsgaiA8IHRvX21lcmdlX3NpemU7IGorKykgewotCQkJUHlPYmplY3QgKmpfbHN0ID0gUHlMaXN0X0dFVF9JVEVNKHRvX21lcmdlLCBqKTsKLQkJCWlmIChyZW1haW5bal0gPCBQeUxpc3RfR0VUX1NJWkUoal9sc3QpICYmCi0JCQkgICAgUHlMaXN0X0dFVF9JVEVNKGpfbHN0LCByZW1haW5bal0pID09IGNhbmRpZGF0ZSkgewotCQkJCXJlbWFpbltqXSsrOwotCQkJfQotCQl9Ci0JCWdvdG8gYWdhaW47Ci0JICBza2lwOiA7Ci0JfQorICAgICAgICBjYW5kaWRhdGUgPSBQeUxpc3RfR0VUX0lURU0oY3VyX2xpc3QsIHJlbWFpbltpXSk7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCB0b19tZXJnZV9zaXplOyBqKyspIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpqX2xzdCA9IFB5TGlzdF9HRVRfSVRFTSh0b19tZXJnZSwgaik7CisgICAgICAgICAgICBpZiAodGFpbF9jb250YWlucyhqX2xzdCwgcmVtYWluW2pdLCBjYW5kaWRhdGUpKSB7CisgICAgICAgICAgICAgICAgZ290byBza2lwOyAvKiBjb250aW51ZSBvdXRlciBsb29wICovCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgb2sgPSBQeUxpc3RfQXBwZW5kKGFjYywgY2FuZGlkYXRlKTsKKyAgICAgICAgaWYgKG9rIDwgMCkgeworICAgICAgICAgICAgUHlNZW1fRnJlZShyZW1haW4pOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGZvciAoaiA9IDA7IGogPCB0b19tZXJnZV9zaXplOyBqKyspIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpqX2xzdCA9IFB5TGlzdF9HRVRfSVRFTSh0b19tZXJnZSwgaik7CisgICAgICAgICAgICBpZiAocmVtYWluW2pdIDwgUHlMaXN0X0dFVF9TSVpFKGpfbHN0KSAmJgorICAgICAgICAgICAgICAgIFB5TGlzdF9HRVRfSVRFTShqX2xzdCwgcmVtYWluW2pdKSA9PSBjYW5kaWRhdGUpIHsKKyAgICAgICAgICAgICAgICByZW1haW5bal0rKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBnb3RvIGFnYWluOworICAgICAgc2tpcDogOworICAgIH0KIAotCWlmIChlbXB0eV9jbnQgPT0gdG9fbWVyZ2Vfc2l6ZSkgewotCQlQeU1lbV9GUkVFKHJlbWFpbik7Ci0JCXJldHVybiAwOwotCX0KLQlzZXRfbXJvX2Vycm9yKHRvX21lcmdlLCByZW1haW4pOwotCVB5TWVtX0ZSRUUocmVtYWluKTsKLQlyZXR1cm4gLTE7CisgICAgaWYgKGVtcHR5X2NudCA9PSB0b19tZXJnZV9zaXplKSB7CisgICAgICAgIFB5TWVtX0ZSRUUocmVtYWluKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHNldF9tcm9fZXJyb3IodG9fbWVyZ2UsIHJlbWFpbik7CisgICAgUHlNZW1fRlJFRShyZW1haW4pOworICAgIHJldHVybiAtMTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG1yb19pbXBsZW1lbnRhdGlvbihQeVR5cGVPYmplY3QgKnR5cGUpCiB7Ci0JUHlfc3NpemVfdCBpLCBuOwotCWludCBvazsKLQlQeU9iamVjdCAqYmFzZXMsICpyZXN1bHQ7Ci0JUHlPYmplY3QgKnRvX21lcmdlLCAqYmFzZXNfYXNsaXN0OworICAgIFB5X3NzaXplX3QgaSwgbjsKKyAgICBpbnQgb2s7CisgICAgUHlPYmplY3QgKmJhc2VzLCAqcmVzdWx0OworICAgIFB5T2JqZWN0ICp0b19tZXJnZSwgKmJhc2VzX2FzbGlzdDsKIAotCWlmICh0eXBlLT50cF9kaWN0ID09IE5VTEwpIHsKLQkJaWYgKFB5VHlwZV9SZWFkeSh0eXBlKSA8IDApCi0JCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKHR5cGUtPnRwX2RpY3QgPT0gTlVMTCkgeworICAgICAgICBpZiAoUHlUeXBlX1JlYWR5KHR5cGUpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCS8qIEZpbmQgYSBzdXBlcmNsYXNzIGxpbmVhcml6YXRpb24gdGhhdCBob25vcnMgdGhlIGNvbnN0cmFpbnRzCi0JICAgb2YgdGhlIGV4cGxpY2l0IGxpc3RzIG9mIGJhc2VzIGFuZCB0aGUgY29uc3RyYWludHMgaW1wbGllZCBieQotCSAgIGVhY2ggYmFzZSBjbGFzcy4KKyAgICAvKiBGaW5kIGEgc3VwZXJjbGFzcyBsaW5lYXJpemF0aW9uIHRoYXQgaG9ub3JzIHRoZSBjb25zdHJhaW50cworICAgICAgIG9mIHRoZSBleHBsaWNpdCBsaXN0cyBvZiBiYXNlcyBhbmQgdGhlIGNvbnN0cmFpbnRzIGltcGxpZWQgYnkKKyAgICAgICBlYWNoIGJhc2UgY2xhc3MuCiAKLQkgICB0b19tZXJnZSBpcyBhIGxpc3Qgb2YgbGlzdHMsIHdoZXJlIGVhY2ggbGlzdCBpcyBhIHN1cGVyY2xhc3MKLQkgICBsaW5lYXJpemF0aW9uIGltcGxpZWQgYnkgYSBiYXNlIGNsYXNzLiAgVGhlIGxhc3QgZWxlbWVudCBvZgotCSAgIHRvX21lcmdlIGlzIHRoZSBkZWNsYXJlZCBsaXN0IG9mIGJhc2VzLgotCSovCisgICAgICAgdG9fbWVyZ2UgaXMgYSBsaXN0IG9mIGxpc3RzLCB3aGVyZSBlYWNoIGxpc3QgaXMgYSBzdXBlcmNsYXNzCisgICAgICAgbGluZWFyaXphdGlvbiBpbXBsaWVkIGJ5IGEgYmFzZSBjbGFzcy4gIFRoZSBsYXN0IGVsZW1lbnQgb2YKKyAgICAgICB0b19tZXJnZSBpcyB0aGUgZGVjbGFyZWQgbGlzdCBvZiBiYXNlcy4KKyAgICAqLwogCi0JYmFzZXMgPSB0eXBlLT50cF9iYXNlczsKLQluID0gUHlUdXBsZV9HRVRfU0laRShiYXNlcyk7CisgICAgYmFzZXMgPSB0eXBlLT50cF9iYXNlczsKKyAgICBuID0gUHlUdXBsZV9HRVRfU0laRShiYXNlcyk7CiAKLQl0b19tZXJnZSA9IFB5TGlzdF9OZXcobisxKTsKLQlpZiAodG9fbWVyZ2UgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgdG9fbWVyZ2UgPSBQeUxpc3RfTmV3KG4rMSk7CisgICAgaWYgKHRvX21lcmdlID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQlQeU9iamVjdCAqYmFzZSA9IFB5VHVwbGVfR0VUX0lURU0oYmFzZXMsIGkpOwotCQlQeU9iamVjdCAqcGFyZW50TVJPOwotCQlpZiAoUHlUeXBlX0NoZWNrKGJhc2UpKQotCQkJcGFyZW50TVJPID0gUHlTZXF1ZW5jZV9MaXN0KAotCQkJCSgoUHlUeXBlT2JqZWN0KiliYXNlKS0+dHBfbXJvKTsKLQkJZWxzZQotCQkJcGFyZW50TVJPID0gY2xhc3NpY19tcm8oYmFzZSk7Ci0JCWlmIChwYXJlbnRNUk8gPT0gTlVMTCkgewotCQkJUHlfREVDUkVGKHRvX21lcmdlKTsKLQkJCXJldHVybiBOVUxMOwotCQl9CisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICBQeU9iamVjdCAqYmFzZSA9IFB5VHVwbGVfR0VUX0lURU0oYmFzZXMsIGkpOworICAgICAgICBQeU9iamVjdCAqcGFyZW50TVJPOworICAgICAgICBpZiAoUHlUeXBlX0NoZWNrKGJhc2UpKQorICAgICAgICAgICAgcGFyZW50TVJPID0gUHlTZXF1ZW5jZV9MaXN0KAorICAgICAgICAgICAgICAgICgoUHlUeXBlT2JqZWN0KiliYXNlKS0+dHBfbXJvKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcGFyZW50TVJPID0gY2xhc3NpY19tcm8oYmFzZSk7CisgICAgICAgIGlmIChwYXJlbnRNUk8gPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKHRvX21lcmdlKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CiAKLQkJUHlMaXN0X1NFVF9JVEVNKHRvX21lcmdlLCBpLCBwYXJlbnRNUk8pOwotCX0KKyAgICAgICAgUHlMaXN0X1NFVF9JVEVNKHRvX21lcmdlLCBpLCBwYXJlbnRNUk8pOworICAgIH0KIAotCWJhc2VzX2FzbGlzdCA9IFB5U2VxdWVuY2VfTGlzdChiYXNlcyk7Ci0JaWYgKGJhc2VzX2FzbGlzdCA9PSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRih0b19tZXJnZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQkvKiBUaGlzIGlzIGp1c3QgYSBiYXNpYyBzYW5pdHkgY2hlY2suICovCi0JaWYgKGNoZWNrX2R1cGxpY2F0ZXMoYmFzZXNfYXNsaXN0KSA8IDApIHsKLQkJUHlfREVDUkVGKHRvX21lcmdlKTsKLQkJUHlfREVDUkVGKGJhc2VzX2FzbGlzdCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlQeUxpc3RfU0VUX0lURU0odG9fbWVyZ2UsIG4sIGJhc2VzX2FzbGlzdCk7CisgICAgYmFzZXNfYXNsaXN0ID0gUHlTZXF1ZW5jZV9MaXN0KGJhc2VzKTsKKyAgICBpZiAoYmFzZXNfYXNsaXN0ID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKHRvX21lcmdlKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIC8qIFRoaXMgaXMganVzdCBhIGJhc2ljIHNhbml0eSBjaGVjay4gKi8KKyAgICBpZiAoY2hlY2tfZHVwbGljYXRlcyhiYXNlc19hc2xpc3QpIDwgMCkgeworICAgICAgICBQeV9ERUNSRUYodG9fbWVyZ2UpOworICAgICAgICBQeV9ERUNSRUYoYmFzZXNfYXNsaXN0KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5TGlzdF9TRVRfSVRFTSh0b19tZXJnZSwgbiwgYmFzZXNfYXNsaXN0KTsKIAotCXJlc3VsdCA9IFB5X0J1aWxkVmFsdWUoIltPXSIsIChQeU9iamVjdCAqKXR5cGUpOwotCWlmIChyZXN1bHQgPT0gTlVMTCkgewotCQlQeV9ERUNSRUYodG9fbWVyZ2UpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgcmVzdWx0ID0gUHlfQnVpbGRWYWx1ZSgiW09dIiwgKFB5T2JqZWN0ICopdHlwZSk7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRih0b19tZXJnZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCW9rID0gcG1lcmdlKHJlc3VsdCwgdG9fbWVyZ2UpOwotCVB5X0RFQ1JFRih0b19tZXJnZSk7Ci0JaWYgKG9rIDwgMCkgewotCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIG9rID0gcG1lcmdlKHJlc3VsdCwgdG9fbWVyZ2UpOworICAgIFB5X0RFQ1JFRih0b19tZXJnZSk7CisgICAgaWYgKG9rIDwgMCkgeworICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JcmV0dXJuIHJlc3VsdDsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbXJvX2V4dGVybmFsKFB5T2JqZWN0ICpzZWxmKQogewotCVB5VHlwZU9iamVjdCAqdHlwZSA9IChQeVR5cGVPYmplY3QgKilzZWxmOworICAgIFB5VHlwZU9iamVjdCAqdHlwZSA9IChQeVR5cGVPYmplY3QgKilzZWxmOwogCi0JcmV0dXJuIG1yb19pbXBsZW1lbnRhdGlvbih0eXBlKTsKKyAgICByZXR1cm4gbXJvX2ltcGxlbWVudGF0aW9uKHR5cGUpOwogfQogCiBzdGF0aWMgaW50CiBtcm9faW50ZXJuYWwoUHlUeXBlT2JqZWN0ICp0eXBlKQogewotCVB5T2JqZWN0ICptcm8sICpyZXN1bHQsICp0dXBsZTsKLQlpbnQgY2hlY2tpdCA9IDA7CisgICAgUHlPYmplY3QgKm1ybywgKnJlc3VsdCwgKnR1cGxlOworICAgIGludCBjaGVja2l0ID0gMDsKIAotCWlmIChQeV9UWVBFKHR5cGUpID09ICZQeVR5cGVfVHlwZSkgewotCQlyZXN1bHQgPSBtcm9faW1wbGVtZW50YXRpb24odHlwZSk7Ci0JfQotCWVsc2UgewotCQlzdGF0aWMgUHlPYmplY3QgKm1yb19zdHI7Ci0JCWNoZWNraXQgPSAxOwotCQltcm8gPSBsb29rdXBfbWV0aG9kKChQeU9iamVjdCAqKXR5cGUsICJtcm8iLCAmbXJvX3N0cik7Ci0JCWlmIChtcm8gPT0gTlVMTCkKLQkJCXJldHVybiAtMTsKLQkJcmVzdWx0ID0gUHlPYmplY3RfQ2FsbE9iamVjdChtcm8sIE5VTEwpOwotCQlQeV9ERUNSRUYobXJvKTsKLQl9Ci0JaWYgKHJlc3VsdCA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0JdHVwbGUgPSBQeVNlcXVlbmNlX1R1cGxlKHJlc3VsdCk7Ci0JUHlfREVDUkVGKHJlc3VsdCk7Ci0JaWYgKHR1cGxlID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQlpZiAoY2hlY2tpdCkgewotCQlQeV9zc2l6ZV90IGksIGxlbjsKLQkJUHlPYmplY3QgKmNsczsKLQkJUHlUeXBlT2JqZWN0ICpzb2xpZDsKKyAgICBpZiAoUHlfVFlQRSh0eXBlKSA9PSAmUHlUeXBlX1R5cGUpIHsKKyAgICAgICAgcmVzdWx0ID0gbXJvX2ltcGxlbWVudGF0aW9uKHR5cGUpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgc3RhdGljIFB5T2JqZWN0ICptcm9fc3RyOworICAgICAgICBjaGVja2l0ID0gMTsKKyAgICAgICAgbXJvID0gbG9va3VwX21ldGhvZCgoUHlPYmplY3QgKil0eXBlLCAibXJvIiwgJm1yb19zdHIpOworICAgICAgICBpZiAobXJvID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIHJlc3VsdCA9IFB5T2JqZWN0X0NhbGxPYmplY3QobXJvLCBOVUxMKTsKKyAgICAgICAgUHlfREVDUkVGKG1ybyk7CisgICAgfQorICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHR1cGxlID0gUHlTZXF1ZW5jZV9UdXBsZShyZXN1bHQpOworICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgIGlmICh0dXBsZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKGNoZWNraXQpIHsKKyAgICAgICAgUHlfc3NpemVfdCBpLCBsZW47CisgICAgICAgIFB5T2JqZWN0ICpjbHM7CisgICAgICAgIFB5VHlwZU9iamVjdCAqc29saWQ7CiAKLQkJc29saWQgPSBzb2xpZF9iYXNlKHR5cGUpOworICAgICAgICBzb2xpZCA9IHNvbGlkX2Jhc2UodHlwZSk7CiAKLQkJbGVuID0gUHlUdXBsZV9HRVRfU0laRSh0dXBsZSk7CisgICAgICAgIGxlbiA9IFB5VHVwbGVfR0VUX1NJWkUodHVwbGUpOwogCi0JCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJUHlUeXBlT2JqZWN0ICp0OwotCQkJY2xzID0gUHlUdXBsZV9HRVRfSVRFTSh0dXBsZSwgaSk7Ci0JCQlpZiAoUHlDbGFzc19DaGVjayhjbHMpKSAKLQkJCQljb250aW51ZTsKLQkJCWVsc2UgaWYgKCFQeVR5cGVfQ2hlY2soY2xzKSkgewotCQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgICJtcm8oKSByZXR1cm5lZCBhIG5vbi1jbGFzcyAoJyUuNTAwcycpIiwKLQkJCQkJICAgICBQeV9UWVBFKGNscyktPnRwX25hbWUpOwotCQkJCVB5X0RFQ1JFRih0dXBsZSk7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQkJdCA9IChQeVR5cGVPYmplY3QqKWNsczsKLQkJCWlmICghUHlUeXBlX0lzU3VidHlwZShzb2xpZCwgc29saWRfYmFzZSh0KSkpIHsKLQkJCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkgICAgICJtcm8oKSByZXR1cm5lZCBiYXNlIHdpdGggdW5zdWl0YWJsZSBsYXlvdXQgKCclLjUwMHMnKSIsCi0JCQkJCSAgICAgdC0+dHBfbmFtZSk7Ci0JCQkJUHlfREVDUkVGKHR1cGxlKTsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQl9Ci0JdHlwZS0+dHBfbXJvID0gdHVwbGU7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICAgICAgUHlUeXBlT2JqZWN0ICp0OworICAgICAgICAgICAgY2xzID0gUHlUdXBsZV9HRVRfSVRFTSh0dXBsZSwgaSk7CisgICAgICAgICAgICBpZiAoUHlDbGFzc19DaGVjayhjbHMpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgZWxzZSBpZiAoIVB5VHlwZV9DaGVjayhjbHMpKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgIm1ybygpIHJldHVybmVkIGEgbm9uLWNsYXNzICgnJS41MDBzJykiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRShjbHMpLT50cF9uYW1lKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYodHVwbGUpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHQgPSAoUHlUeXBlT2JqZWN0KiljbHM7CisgICAgICAgICAgICBpZiAoIVB5VHlwZV9Jc1N1YnR5cGUoc29saWQsIHNvbGlkX2Jhc2UodCkpKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAibXJvKCkgcmV0dXJuZWQgYmFzZSB3aXRoIHVuc3VpdGFibGUgbGF5b3V0ICgnJS41MDBzJykiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQtPnRwX25hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHR1cGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICB0eXBlLT50cF9tcm8gPSB0dXBsZTsKIAotCXR5cGVfbXJvX21vZGlmaWVkKHR5cGUsIHR5cGUtPnRwX21ybyk7Ci0JLyogY29ybmVyIGNhc2U6IHRoZSBvbGQtc3R5bGUgc3VwZXIgY2xhc3MgbWlnaHQgaGF2ZSBiZWVuIGhpZGRlbgotCSAgIGZyb20gdGhlIGN1c3RvbSBNUk8gKi8KLQl0eXBlX21yb19tb2RpZmllZCh0eXBlLCB0eXBlLT50cF9iYXNlcyk7CisgICAgdHlwZV9tcm9fbW9kaWZpZWQodHlwZSwgdHlwZS0+dHBfbXJvKTsKKyAgICAvKiBjb3JuZXIgY2FzZTogdGhlIG9sZC1zdHlsZSBzdXBlciBjbGFzcyBtaWdodCBoYXZlIGJlZW4gaGlkZGVuCisgICAgICAgZnJvbSB0aGUgY3VzdG9tIE1STyAqLworICAgIHR5cGVfbXJvX21vZGlmaWVkKHR5cGUsIHR5cGUtPnRwX2Jhc2VzKTsKIAotCVB5VHlwZV9Nb2RpZmllZCh0eXBlKTsKKyAgICBQeVR5cGVfTW9kaWZpZWQodHlwZSk7CiAKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKIH0KIAogCkBAIC0xNjc4LDkyICsxNjc4LDkyIEBACiBzdGF0aWMgUHlUeXBlT2JqZWN0ICoKIGJlc3RfYmFzZShQeU9iamVjdCAqYmFzZXMpCiB7Ci0JUHlfc3NpemVfdCBpLCBuOwotCVB5VHlwZU9iamVjdCAqYmFzZSwgKndpbm5lciwgKmNhbmRpZGF0ZSwgKmJhc2VfaTsKLQlQeU9iamVjdCAqYmFzZV9wcm90bzsKKyAgICBQeV9zc2l6ZV90IGksIG47CisgICAgUHlUeXBlT2JqZWN0ICpiYXNlLCAqd2lubmVyLCAqY2FuZGlkYXRlLCAqYmFzZV9pOworICAgIFB5T2JqZWN0ICpiYXNlX3Byb3RvOwogCi0JYXNzZXJ0KFB5VHVwbGVfQ2hlY2soYmFzZXMpKTsKLQluID0gUHlUdXBsZV9HRVRfU0laRShiYXNlcyk7Ci0JYXNzZXJ0KG4gPiAwKTsKLQliYXNlID0gTlVMTDsKLQl3aW5uZXIgPSBOVUxMOwotCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJYmFzZV9wcm90byA9IFB5VHVwbGVfR0VUX0lURU0oYmFzZXMsIGkpOwotCQlpZiAoUHlDbGFzc19DaGVjayhiYXNlX3Byb3RvKSkKLQkJCWNvbnRpbnVlOwotCQlpZiAoIVB5VHlwZV9DaGVjayhiYXNlX3Byb3RvKSkgewotCQkJUHlFcnJfU2V0U3RyaW5nKAotCQkJCVB5RXhjX1R5cGVFcnJvciwKLQkJCQkiYmFzZXMgbXVzdCBiZSB0eXBlcyIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJYmFzZV9pID0gKFB5VHlwZU9iamVjdCAqKWJhc2VfcHJvdG87Ci0JCWlmIChiYXNlX2ktPnRwX2RpY3QgPT0gTlVMTCkgewotCQkJaWYgKFB5VHlwZV9SZWFkeShiYXNlX2kpIDwgMCkKLQkJCQlyZXR1cm4gTlVMTDsKLQkJfQotCQljYW5kaWRhdGUgPSBzb2xpZF9iYXNlKGJhc2VfaSk7Ci0JCWlmICh3aW5uZXIgPT0gTlVMTCkgewotCQkJd2lubmVyID0gY2FuZGlkYXRlOwotCQkJYmFzZSA9IGJhc2VfaTsKLQkJfQotCQllbHNlIGlmIChQeVR5cGVfSXNTdWJ0eXBlKHdpbm5lciwgY2FuZGlkYXRlKSkKLQkJCTsKLQkJZWxzZSBpZiAoUHlUeXBlX0lzU3VidHlwZShjYW5kaWRhdGUsIHdpbm5lcikpIHsKLQkJCXdpbm5lciA9IGNhbmRpZGF0ZTsKLQkJCWJhc2UgPSBiYXNlX2k7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoCi0JCQkJUHlFeGNfVHlwZUVycm9yLAotCQkJCSJtdWx0aXBsZSBiYXNlcyBoYXZlICIKLQkJCQkiaW5zdGFuY2UgbGF5LW91dCBjb25mbGljdCIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9Ci0JaWYgKGJhc2UgPT0gTlVMTCkKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCSJhIG5ldy1zdHlsZSBjbGFzcyBjYW4ndCBoYXZlIG9ubHkgY2xhc3NpYyBiYXNlcyIpOwotCXJldHVybiBiYXNlOworICAgIGFzc2VydChQeVR1cGxlX0NoZWNrKGJhc2VzKSk7CisgICAgbiA9IFB5VHVwbGVfR0VUX1NJWkUoYmFzZXMpOworICAgIGFzc2VydChuID4gMCk7CisgICAgYmFzZSA9IE5VTEw7CisgICAgd2lubmVyID0gTlVMTDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIGJhc2VfcHJvdG8gPSBQeVR1cGxlX0dFVF9JVEVNKGJhc2VzLCBpKTsKKyAgICAgICAgaWYgKFB5Q2xhc3NfQ2hlY2soYmFzZV9wcm90bykpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKCFQeVR5cGVfQ2hlY2soYmFzZV9wcm90bykpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZygKKyAgICAgICAgICAgICAgICBQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgImJhc2VzIG11c3QgYmUgdHlwZXMiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGJhc2VfaSA9IChQeVR5cGVPYmplY3QgKiliYXNlX3Byb3RvOworICAgICAgICBpZiAoYmFzZV9pLT50cF9kaWN0ID09IE5VTEwpIHsKKyAgICAgICAgICAgIGlmIChQeVR5cGVfUmVhZHkoYmFzZV9pKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgY2FuZGlkYXRlID0gc29saWRfYmFzZShiYXNlX2kpOworICAgICAgICBpZiAod2lubmVyID09IE5VTEwpIHsKKyAgICAgICAgICAgIHdpbm5lciA9IGNhbmRpZGF0ZTsKKyAgICAgICAgICAgIGJhc2UgPSBiYXNlX2k7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoUHlUeXBlX0lzU3VidHlwZSh3aW5uZXIsIGNhbmRpZGF0ZSkpCisgICAgICAgICAgICA7CisgICAgICAgIGVsc2UgaWYgKFB5VHlwZV9Jc1N1YnR5cGUoY2FuZGlkYXRlLCB3aW5uZXIpKSB7CisgICAgICAgICAgICB3aW5uZXIgPSBjYW5kaWRhdGU7CisgICAgICAgICAgICBiYXNlID0gYmFzZV9pOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKAorICAgICAgICAgICAgICAgIFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAibXVsdGlwbGUgYmFzZXMgaGF2ZSAiCisgICAgICAgICAgICAgICAgImluc3RhbmNlIGxheS1vdXQgY29uZmxpY3QiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorICAgIGlmIChiYXNlID09IE5VTEwpCisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAiYSBuZXctc3R5bGUgY2xhc3MgY2FuJ3QgaGF2ZSBvbmx5IGNsYXNzaWMgYmFzZXMiKTsKKyAgICByZXR1cm4gYmFzZTsKIH0KIAogc3RhdGljIGludAogZXh0cmFfaXZhcnMoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeVR5cGVPYmplY3QgKmJhc2UpCiB7Ci0Jc2l6ZV90IHRfc2l6ZSA9IHR5cGUtPnRwX2Jhc2ljc2l6ZTsKLQlzaXplX3QgYl9zaXplID0gYmFzZS0+dHBfYmFzaWNzaXplOworICAgIHNpemVfdCB0X3NpemUgPSB0eXBlLT50cF9iYXNpY3NpemU7CisgICAgc2l6ZV90IGJfc2l6ZSA9IGJhc2UtPnRwX2Jhc2ljc2l6ZTsKIAotCWFzc2VydCh0X3NpemUgPj0gYl9zaXplKTsgLyogRWxzZSB0eXBlIHNtYWxsZXIgdGhhbiBiYXNlISAqLwotCWlmICh0eXBlLT50cF9pdGVtc2l6ZSB8fCBiYXNlLT50cF9pdGVtc2l6ZSkgewotCQkvKiBJZiBpdGVtc2l6ZSBpcyBpbnZvbHZlZCwgc3RyaWN0ZXIgcnVsZXMgKi8KLQkJcmV0dXJuIHRfc2l6ZSAhPSBiX3NpemUgfHwKLQkJCXR5cGUtPnRwX2l0ZW1zaXplICE9IGJhc2UtPnRwX2l0ZW1zaXplOwotCX0KLQlpZiAodHlwZS0+dHBfd2Vha2xpc3RvZmZzZXQgJiYgYmFzZS0+dHBfd2Vha2xpc3RvZmZzZXQgPT0gMCAmJgotCSAgICB0eXBlLT50cF93ZWFrbGlzdG9mZnNldCArIHNpemVvZihQeU9iamVjdCAqKSA9PSB0X3NpemUgJiYKLQkgICAgdHlwZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hFQVBUWVBFKQotCQl0X3NpemUgLT0gc2l6ZW9mKFB5T2JqZWN0ICopOwotCWlmICh0eXBlLT50cF9kaWN0b2Zmc2V0ICYmIGJhc2UtPnRwX2RpY3RvZmZzZXQgPT0gMCAmJgotCSAgICB0eXBlLT50cF9kaWN0b2Zmc2V0ICsgc2l6ZW9mKFB5T2JqZWN0ICopID09IHRfc2l6ZSAmJgotCSAgICB0eXBlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEVBUFRZUEUpCi0JCXRfc2l6ZSAtPSBzaXplb2YoUHlPYmplY3QgKik7CisgICAgYXNzZXJ0KHRfc2l6ZSA+PSBiX3NpemUpOyAvKiBFbHNlIHR5cGUgc21hbGxlciB0aGFuIGJhc2UhICovCisgICAgaWYgKHR5cGUtPnRwX2l0ZW1zaXplIHx8IGJhc2UtPnRwX2l0ZW1zaXplKSB7CisgICAgICAgIC8qIElmIGl0ZW1zaXplIGlzIGludm9sdmVkLCBzdHJpY3RlciBydWxlcyAqLworICAgICAgICByZXR1cm4gdF9zaXplICE9IGJfc2l6ZSB8fAorICAgICAgICAgICAgdHlwZS0+dHBfaXRlbXNpemUgIT0gYmFzZS0+dHBfaXRlbXNpemU7CisgICAgfQorICAgIGlmICh0eXBlLT50cF93ZWFrbGlzdG9mZnNldCAmJiBiYXNlLT50cF93ZWFrbGlzdG9mZnNldCA9PSAwICYmCisgICAgICAgIHR5cGUtPnRwX3dlYWtsaXN0b2Zmc2V0ICsgc2l6ZW9mKFB5T2JqZWN0ICopID09IHRfc2l6ZSAmJgorICAgICAgICB0eXBlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEVBUFRZUEUpCisgICAgICAgIHRfc2l6ZSAtPSBzaXplb2YoUHlPYmplY3QgKik7CisgICAgaWYgKHR5cGUtPnRwX2RpY3RvZmZzZXQgJiYgYmFzZS0+dHBfZGljdG9mZnNldCA9PSAwICYmCisgICAgICAgIHR5cGUtPnRwX2RpY3RvZmZzZXQgKyBzaXplb2YoUHlPYmplY3QgKikgPT0gdF9zaXplICYmCisgICAgICAgIHR5cGUtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IRUFQVFlQRSkKKyAgICAgICAgdF9zaXplIC09IHNpemVvZihQeU9iamVjdCAqKTsKIAotCXJldHVybiB0X3NpemUgIT0gYl9zaXplOworICAgIHJldHVybiB0X3NpemUgIT0gYl9zaXplOwogfQogCiBzdGF0aWMgUHlUeXBlT2JqZWN0ICoKIHNvbGlkX2Jhc2UoUHlUeXBlT2JqZWN0ICp0eXBlKQogewotCVB5VHlwZU9iamVjdCAqYmFzZTsKKyAgICBQeVR5cGVPYmplY3QgKmJhc2U7CiAKLQlpZiAodHlwZS0+dHBfYmFzZSkKLQkJYmFzZSA9IHNvbGlkX2Jhc2UodHlwZS0+dHBfYmFzZSk7Ci0JZWxzZQotCQliYXNlID0gJlB5QmFzZU9iamVjdF9UeXBlOwotCWlmIChleHRyYV9pdmFycyh0eXBlLCBiYXNlKSkKLQkJcmV0dXJuIHR5cGU7Ci0JZWxzZQotCQlyZXR1cm4gYmFzZTsKKyAgICBpZiAodHlwZS0+dHBfYmFzZSkKKyAgICAgICAgYmFzZSA9IHNvbGlkX2Jhc2UodHlwZS0+dHBfYmFzZSk7CisgICAgZWxzZQorICAgICAgICBiYXNlID0gJlB5QmFzZU9iamVjdF9UeXBlOworICAgIGlmIChleHRyYV9pdmFycyh0eXBlLCBiYXNlKSkKKyAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gYmFzZTsKIH0KIAogc3RhdGljIHZvaWQgb2JqZWN0X2RlYWxsb2MoUHlPYmplY3QgKik7CkBAIC0xNzc5LDE5MSArMTc3OSwxOTEgQEAKIHN0YXRpYyBQeVR5cGVPYmplY3QgKgogZ2V0X2J1aWx0aW5fYmFzZV93aXRoX2RpY3QoUHlUeXBlT2JqZWN0ICp0eXBlKQogewotCXdoaWxlICh0eXBlLT50cF9iYXNlICE9IE5VTEwpIHsKLQkJaWYgKHR5cGUtPnRwX2RpY3RvZmZzZXQgIT0gMCAmJgotCQkgICAgISh0eXBlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEVBUFRZUEUpKQotCQkJcmV0dXJuIHR5cGU7Ci0JCXR5cGUgPSB0eXBlLT50cF9iYXNlOwotCX0KLQlyZXR1cm4gTlVMTDsKKyAgICB3aGlsZSAodHlwZS0+dHBfYmFzZSAhPSBOVUxMKSB7CisgICAgICAgIGlmICh0eXBlLT50cF9kaWN0b2Zmc2V0ICE9IDAgJiYKKyAgICAgICAgICAgICEodHlwZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hFQVBUWVBFKSkKKyAgICAgICAgICAgIHJldHVybiB0eXBlOworICAgICAgICB0eXBlID0gdHlwZS0+dHBfYmFzZTsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZXRfZGljdF9kZXNjcmlwdG9yKFB5VHlwZU9iamVjdCAqdHlwZSkKIHsKLQlzdGF0aWMgUHlPYmplY3QgKmRpY3Rfc3RyOwotCVB5T2JqZWN0ICpkZXNjcjsKKyAgICBzdGF0aWMgUHlPYmplY3QgKmRpY3Rfc3RyOworICAgIFB5T2JqZWN0ICpkZXNjcjsKIAotCWlmIChkaWN0X3N0ciA9PSBOVUxMKSB7Ci0JCWRpY3Rfc3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19kaWN0X18iKTsKLQkJaWYgKGRpY3Rfc3RyID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZGVzY3IgPSBfUHlUeXBlX0xvb2t1cCh0eXBlLCBkaWN0X3N0cik7Ci0JaWYgKGRlc2NyID09IE5VTEwgfHwgIVB5RGVzY3JfSXNEYXRhKGRlc2NyKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKGRpY3Rfc3RyID09IE5VTEwpIHsKKyAgICAgICAgZGljdF9zdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2RpY3RfXyIpOworICAgICAgICBpZiAoZGljdF9zdHIgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBkZXNjciA9IF9QeVR5cGVfTG9va3VwKHR5cGUsIGRpY3Rfc3RyKTsKKyAgICBpZiAoZGVzY3IgPT0gTlVMTCB8fCAhUHlEZXNjcl9Jc0RhdGEoZGVzY3IpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXJldHVybiBkZXNjcjsKKyAgICByZXR1cm4gZGVzY3I7CiB9CiAKIHN0YXRpYyB2b2lkCiByYWlzZV9kaWN0X2Rlc2NyX2Vycm9yKFB5T2JqZWN0ICpvYmopCiB7Ci0JUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJICAgICAidGhpcyBfX2RpY3RfXyBkZXNjcmlwdG9yIGRvZXMgbm90IHN1cHBvcnQgIgotCQkgICAgICInJS4yMDBzJyBvYmplY3RzIiwgb2JqLT5vYl90eXBlLT50cF9uYW1lKTsKKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAidGhpcyBfX2RpY3RfXyBkZXNjcmlwdG9yIGRvZXMgbm90IHN1cHBvcnQgIgorICAgICAgICAgICAgICAgICAiJyUuMjAwcycgb2JqZWN0cyIsIG9iai0+b2JfdHlwZS0+dHBfbmFtZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdWJ0eXBlX2RpY3QoUHlPYmplY3QgKm9iaiwgdm9pZCAqY29udGV4dCkKIHsKLQlQeU9iamVjdCAqKmRpY3RwdHI7Ci0JUHlPYmplY3QgKmRpY3Q7Ci0JUHlUeXBlT2JqZWN0ICpiYXNlOworICAgIFB5T2JqZWN0ICoqZGljdHB0cjsKKyAgICBQeU9iamVjdCAqZGljdDsKKyAgICBQeVR5cGVPYmplY3QgKmJhc2U7CiAKLQliYXNlID0gZ2V0X2J1aWx0aW5fYmFzZV93aXRoX2RpY3Qob2JqLT5vYl90eXBlKTsKLQlpZiAoYmFzZSAhPSBOVUxMKSB7Ci0JCWRlc2NyZ2V0ZnVuYyBmdW5jOwotCQlQeU9iamVjdCAqZGVzY3IgPSBnZXRfZGljdF9kZXNjcmlwdG9yKGJhc2UpOwotCQlpZiAoZGVzY3IgPT0gTlVMTCkgewotCQkJcmFpc2VfZGljdF9kZXNjcl9lcnJvcihvYmopOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJZnVuYyA9IGRlc2NyLT5vYl90eXBlLT50cF9kZXNjcl9nZXQ7Ci0JCWlmIChmdW5jID09IE5VTEwpIHsKLQkJCXJhaXNlX2RpY3RfZGVzY3JfZXJyb3Iob2JqKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCXJldHVybiBmdW5jKGRlc2NyLCBvYmosIChQeU9iamVjdCAqKShvYmotPm9iX3R5cGUpKTsKLQl9CisgICAgYmFzZSA9IGdldF9idWlsdGluX2Jhc2Vfd2l0aF9kaWN0KG9iai0+b2JfdHlwZSk7CisgICAgaWYgKGJhc2UgIT0gTlVMTCkgeworICAgICAgICBkZXNjcmdldGZ1bmMgZnVuYzsKKyAgICAgICAgUHlPYmplY3QgKmRlc2NyID0gZ2V0X2RpY3RfZGVzY3JpcHRvcihiYXNlKTsKKyAgICAgICAgaWYgKGRlc2NyID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJhaXNlX2RpY3RfZGVzY3JfZXJyb3Iob2JqKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGZ1bmMgPSBkZXNjci0+b2JfdHlwZS0+dHBfZGVzY3JfZ2V0OworICAgICAgICBpZiAoZnVuYyA9PSBOVUxMKSB7CisgICAgICAgICAgICByYWlzZV9kaWN0X2Rlc2NyX2Vycm9yKG9iaik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZnVuYyhkZXNjciwgb2JqLCAoUHlPYmplY3QgKikob2JqLT5vYl90eXBlKSk7CisgICAgfQogCi0JZGljdHB0ciA9IF9QeU9iamVjdF9HZXREaWN0UHRyKG9iaik7Ci0JaWYgKGRpY3RwdHIgPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfQXR0cmlidXRlRXJyb3IsCi0JCQkJIlRoaXMgb2JqZWN0IGhhcyBubyBfX2RpY3RfXyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZGljdCA9ICpkaWN0cHRyOwotCWlmIChkaWN0ID09IE5VTEwpCi0JCSpkaWN0cHRyID0gZGljdCA9IFB5RGljdF9OZXcoKTsKLQlQeV9YSU5DUkVGKGRpY3QpOwotCXJldHVybiBkaWN0OworICAgIGRpY3RwdHIgPSBfUHlPYmplY3RfR2V0RGljdFB0cihvYmopOworICAgIGlmIChkaWN0cHRyID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0F0dHJpYnV0ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIlRoaXMgb2JqZWN0IGhhcyBubyBfX2RpY3RfXyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZGljdCA9ICpkaWN0cHRyOworICAgIGlmIChkaWN0ID09IE5VTEwpCisgICAgICAgICpkaWN0cHRyID0gZGljdCA9IFB5RGljdF9OZXcoKTsKKyAgICBQeV9YSU5DUkVGKGRpY3QpOworICAgIHJldHVybiBkaWN0OwogfQogCiBzdGF0aWMgaW50CiBzdWJ0eXBlX3NldGRpY3QoUHlPYmplY3QgKm9iaiwgUHlPYmplY3QgKnZhbHVlLCB2b2lkICpjb250ZXh0KQogewotCVB5T2JqZWN0ICoqZGljdHB0cjsKLQlQeU9iamVjdCAqZGljdDsKLQlQeVR5cGVPYmplY3QgKmJhc2U7CisgICAgUHlPYmplY3QgKipkaWN0cHRyOworICAgIFB5T2JqZWN0ICpkaWN0OworICAgIFB5VHlwZU9iamVjdCAqYmFzZTsKIAotCWJhc2UgPSBnZXRfYnVpbHRpbl9iYXNlX3dpdGhfZGljdChvYmotPm9iX3R5cGUpOwotCWlmIChiYXNlICE9IE5VTEwpIHsKLQkJZGVzY3JzZXRmdW5jIGZ1bmM7Ci0JCVB5T2JqZWN0ICpkZXNjciA9IGdldF9kaWN0X2Rlc2NyaXB0b3IoYmFzZSk7Ci0JCWlmIChkZXNjciA9PSBOVUxMKSB7Ci0JCQlyYWlzZV9kaWN0X2Rlc2NyX2Vycm9yKG9iaik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJZnVuYyA9IGRlc2NyLT5vYl90eXBlLT50cF9kZXNjcl9zZXQ7Ci0JCWlmIChmdW5jID09IE5VTEwpIHsKLQkJCXJhaXNlX2RpY3RfZGVzY3JfZXJyb3Iob2JqKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlyZXR1cm4gZnVuYyhkZXNjciwgb2JqLCB2YWx1ZSk7Ci0JfQorICAgIGJhc2UgPSBnZXRfYnVpbHRpbl9iYXNlX3dpdGhfZGljdChvYmotPm9iX3R5cGUpOworICAgIGlmIChiYXNlICE9IE5VTEwpIHsKKyAgICAgICAgZGVzY3JzZXRmdW5jIGZ1bmM7CisgICAgICAgIFB5T2JqZWN0ICpkZXNjciA9IGdldF9kaWN0X2Rlc2NyaXB0b3IoYmFzZSk7CisgICAgICAgIGlmIChkZXNjciA9PSBOVUxMKSB7CisgICAgICAgICAgICByYWlzZV9kaWN0X2Rlc2NyX2Vycm9yKG9iaik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgZnVuYyA9IGRlc2NyLT5vYl90eXBlLT50cF9kZXNjcl9zZXQ7CisgICAgICAgIGlmIChmdW5jID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJhaXNlX2RpY3RfZGVzY3JfZXJyb3Iob2JqKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZnVuYyhkZXNjciwgb2JqLCB2YWx1ZSk7CisgICAgfQogCi0JZGljdHB0ciA9IF9QeU9iamVjdF9HZXREaWN0UHRyKG9iaik7Ci0JaWYgKGRpY3RwdHIgPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfQXR0cmlidXRlRXJyb3IsCi0JCQkJIlRoaXMgb2JqZWN0IGhhcyBubyBfX2RpY3RfXyIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmICh2YWx1ZSAhPSBOVUxMICYmICFQeURpY3RfQ2hlY2sodmFsdWUpKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgICJfX2RpY3RfXyBtdXN0IGJlIHNldCB0byBhIGRpY3Rpb25hcnksICIKLQkJCSAgICAgIm5vdCBhICclLjIwMHMnIiwgUHlfVFlQRSh2YWx1ZSktPnRwX25hbWUpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWRpY3QgPSAqZGljdHB0cjsKLQlQeV9YSU5DUkVGKHZhbHVlKTsKLQkqZGljdHB0ciA9IHZhbHVlOwotCVB5X1hERUNSRUYoZGljdCk7Ci0JcmV0dXJuIDA7CisgICAgZGljdHB0ciA9IF9QeU9iamVjdF9HZXREaWN0UHRyKG9iaik7CisgICAgaWYgKGRpY3RwdHIgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfQXR0cmlidXRlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiVGhpcyBvYmplY3QgaGFzIG5vIF9fZGljdF9fIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKHZhbHVlICE9IE5VTEwgJiYgIVB5RGljdF9DaGVjayh2YWx1ZSkpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJfX2RpY3RfXyBtdXN0IGJlIHNldCB0byBhIGRpY3Rpb25hcnksICIKKyAgICAgICAgICAgICAgICAgICAgICJub3QgYSAnJS4yMDBzJyIsIFB5X1RZUEUodmFsdWUpLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBkaWN0ID0gKmRpY3RwdHI7CisgICAgUHlfWElOQ1JFRih2YWx1ZSk7CisgICAgKmRpY3RwdHIgPSB2YWx1ZTsKKyAgICBQeV9YREVDUkVGKGRpY3QpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc3VidHlwZV9nZXR3ZWFrcmVmKFB5T2JqZWN0ICpvYmosIHZvaWQgKmNvbnRleHQpCiB7Ci0JUHlPYmplY3QgKip3ZWFrbGlzdHB0cjsKLQlQeU9iamVjdCAqcmVzdWx0OworICAgIFB5T2JqZWN0ICoqd2Vha2xpc3RwdHI7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKIAotCWlmIChQeV9UWVBFKG9iaiktPnRwX3dlYWtsaXN0b2Zmc2V0ID09IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0F0dHJpYnV0ZUVycm9yLAotCQkJCSJUaGlzIG9iamVjdCBoYXMgbm8gX193ZWFrcmVmX18iKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWFzc2VydChQeV9UWVBFKG9iaiktPnRwX3dlYWtsaXN0b2Zmc2V0ID4gMCk7Ci0JYXNzZXJ0KFB5X1RZUEUob2JqKS0+dHBfd2Vha2xpc3RvZmZzZXQgKyBzaXplb2YoUHlPYmplY3QgKikgPD0KLQkgICAgICAgKHNpemVfdCkoUHlfVFlQRShvYmopLT50cF9iYXNpY3NpemUpKTsKLQl3ZWFrbGlzdHB0ciA9IChQeU9iamVjdCAqKikKLQkJKChjaGFyICopb2JqICsgUHlfVFlQRShvYmopLT50cF93ZWFrbGlzdG9mZnNldCk7Ci0JaWYgKCp3ZWFrbGlzdHB0ciA9PSBOVUxMKQotCQlyZXN1bHQgPSBQeV9Ob25lOwotCWVsc2UKLQkJcmVzdWx0ID0gKndlYWtsaXN0cHRyOwotCVB5X0lOQ1JFRihyZXN1bHQpOwotCXJldHVybiByZXN1bHQ7CisgICAgaWYgKFB5X1RZUEUob2JqKS0+dHBfd2Vha2xpc3RvZmZzZXQgPT0gMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfQXR0cmlidXRlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiVGhpcyBvYmplY3QgaGFzIG5vIF9fd2Vha3JlZl9fIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBhc3NlcnQoUHlfVFlQRShvYmopLT50cF93ZWFrbGlzdG9mZnNldCA+IDApOworICAgIGFzc2VydChQeV9UWVBFKG9iaiktPnRwX3dlYWtsaXN0b2Zmc2V0ICsgc2l6ZW9mKFB5T2JqZWN0ICopIDw9CisgICAgICAgICAgIChzaXplX3QpKFB5X1RZUEUob2JqKS0+dHBfYmFzaWNzaXplKSk7CisgICAgd2Vha2xpc3RwdHIgPSAoUHlPYmplY3QgKiopCisgICAgICAgICgoY2hhciAqKW9iaiArIFB5X1RZUEUob2JqKS0+dHBfd2Vha2xpc3RvZmZzZXQpOworICAgIGlmICgqd2Vha2xpc3RwdHIgPT0gTlVMTCkKKyAgICAgICAgcmVzdWx0ID0gUHlfTm9uZTsKKyAgICBlbHNlCisgICAgICAgIHJlc3VsdCA9ICp3ZWFrbGlzdHB0cjsKKyAgICBQeV9JTkNSRUYocmVzdWx0KTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiAvKiBUaHJlZSB2YXJpYW50cyBvbiB0aGUgc3VidHlwZV9nZXRzZXRzIGxpc3QuICovCiAKIHN0YXRpYyBQeUdldFNldERlZiBzdWJ0eXBlX2dldHNldHNfZnVsbFtdID0gewotCXsiX19kaWN0X18iLCBzdWJ0eXBlX2RpY3QsIHN1YnR5cGVfc2V0ZGljdCwKLQkgUHlEb2NfU1RSKCJkaWN0aW9uYXJ5IGZvciBpbnN0YW5jZSB2YXJpYWJsZXMgKGlmIGRlZmluZWQpIil9LAotCXsiX193ZWFrcmVmX18iLCBzdWJ0eXBlX2dldHdlYWtyZWYsIE5VTEwsCi0JIFB5RG9jX1NUUigibGlzdCBvZiB3ZWFrIHJlZmVyZW5jZXMgdG8gdGhlIG9iamVjdCAoaWYgZGVmaW5lZCkiKX0sCi0JezB9CisgICAgeyJfX2RpY3RfXyIsIHN1YnR5cGVfZGljdCwgc3VidHlwZV9zZXRkaWN0LAorICAgICBQeURvY19TVFIoImRpY3Rpb25hcnkgZm9yIGluc3RhbmNlIHZhcmlhYmxlcyAoaWYgZGVmaW5lZCkiKX0sCisgICAgeyJfX3dlYWtyZWZfXyIsIHN1YnR5cGVfZ2V0d2Vha3JlZiwgTlVMTCwKKyAgICAgUHlEb2NfU1RSKCJsaXN0IG9mIHdlYWsgcmVmZXJlbmNlcyB0byB0aGUgb2JqZWN0IChpZiBkZWZpbmVkKSIpfSwKKyAgICB7MH0KIH07CiAKIHN0YXRpYyBQeUdldFNldERlZiBzdWJ0eXBlX2dldHNldHNfZGljdF9vbmx5W10gPSB7Ci0JeyJfX2RpY3RfXyIsIHN1YnR5cGVfZGljdCwgc3VidHlwZV9zZXRkaWN0LAotCSBQeURvY19TVFIoImRpY3Rpb25hcnkgZm9yIGluc3RhbmNlIHZhcmlhYmxlcyAoaWYgZGVmaW5lZCkiKX0sCi0JezB9CisgICAgeyJfX2RpY3RfXyIsIHN1YnR5cGVfZGljdCwgc3VidHlwZV9zZXRkaWN0LAorICAgICBQeURvY19TVFIoImRpY3Rpb25hcnkgZm9yIGluc3RhbmNlIHZhcmlhYmxlcyAoaWYgZGVmaW5lZCkiKX0sCisgICAgezB9CiB9OwogCiBzdGF0aWMgUHlHZXRTZXREZWYgc3VidHlwZV9nZXRzZXRzX3dlYWtyZWZfb25seVtdID0gewotCXsiX193ZWFrcmVmX18iLCBzdWJ0eXBlX2dldHdlYWtyZWYsIE5VTEwsCi0JIFB5RG9jX1NUUigibGlzdCBvZiB3ZWFrIHJlZmVyZW5jZXMgdG8gdGhlIG9iamVjdCAoaWYgZGVmaW5lZCkiKX0sCi0JezB9CisgICAgeyJfX3dlYWtyZWZfXyIsIHN1YnR5cGVfZ2V0d2Vha3JlZiwgTlVMTCwKKyAgICAgUHlEb2NfU1RSKCJsaXN0IG9mIHdlYWsgcmVmZXJlbmNlcyB0byB0aGUgb2JqZWN0IChpZiBkZWZpbmVkKSIpfSwKKyAgICB7MH0KIH07CiAKIHN0YXRpYyBpbnQKIHZhbGlkX2lkZW50aWZpZXIoUHlPYmplY3QgKnMpCiB7Ci0JdW5zaWduZWQgY2hhciAqcDsKLQlQeV9zc2l6ZV90IGksIG47CisgICAgdW5zaWduZWQgY2hhciAqcDsKKyAgICBQeV9zc2l6ZV90IGksIG47CiAKLQlpZiAoIVB5U3RyaW5nX0NoZWNrKHMpKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgICJfX3Nsb3RzX18gaXRlbXMgbXVzdCBiZSBzdHJpbmdzLCBub3QgJyUuMjAwcyciLAotCQkJICAgICBQeV9UWVBFKHMpLT50cF9uYW1lKTsKLQkJcmV0dXJuIDA7Ci0JfQotCXAgPSAodW5zaWduZWQgY2hhciAqKSBQeVN0cmluZ19BU19TVFJJTkcocyk7Ci0JbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHMpOwotCS8qIFdlIG11c3QgcmVqZWN0IGFuIGVtcHR5IG5hbWUuICBBcyBhIGhhY2ssIHdlIGJ1bXAgdGhlCi0JICAgbGVuZ3RoIHRvIDEgc28gdGhhdCB0aGUgbG9vcCB3aWxsIGJhbGsgb24gdGhlIHRyYWlsaW5nIFwwLiAqLwotCWlmIChuID09IDApCi0JCW4gPSAxOwotCWZvciAoaSA9IDA7IGkgPCBuOyBpKyssIHArKykgewotCQlpZiAoIShpID09IDAgPyBpc2FscGhhKCpwKSA6IGlzYWxudW0oKnApKSAmJiAqcCAhPSAnXycpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJCSJfX3Nsb3RzX18gbXVzdCBiZSBpZGVudGlmaWVycyIpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0JcmV0dXJuIDE7CisgICAgaWYgKCFQeVN0cmluZ19DaGVjayhzKSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIl9fc2xvdHNfXyBpdGVtcyBtdXN0IGJlIHN0cmluZ3MsIG5vdCAnJS4yMDBzJyIsCisgICAgICAgICAgICAgICAgICAgICBQeV9UWVBFKHMpLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHAgPSAodW5zaWduZWQgY2hhciAqKSBQeVN0cmluZ19BU19TVFJJTkcocyk7CisgICAgbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHMpOworICAgIC8qIFdlIG11c3QgcmVqZWN0IGFuIGVtcHR5IG5hbWUuICBBcyBhIGhhY2ssIHdlIGJ1bXAgdGhlCisgICAgICAgbGVuZ3RoIHRvIDEgc28gdGhhdCB0aGUgbG9vcCB3aWxsIGJhbGsgb24gdGhlIHRyYWlsaW5nIFwwLiAqLworICAgIGlmIChuID09IDApCisgICAgICAgIG4gPSAxOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyssIHArKykgeworICAgICAgICBpZiAoIShpID09IDAgPyBpc2FscGhhKCpwKSA6IGlzYWxudW0oKnApKSAmJiAqcCAhPSAnXycpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9fc2xvdHNfXyBtdXN0IGJlIGlkZW50aWZpZXJzIik7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMTsKIH0KIAogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKQEAgLTE5NzIsMzMgKzE5NzIsMzMgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBfdW5pY29kZV90b19zdHJpbmcoUHlPYmplY3QgKnNsb3RzLCBQeV9zc2l6ZV90IG5zbG90cykKIHsKLQlQeU9iamVjdCAqdG1wID0gTlVMTDsKLQlQeU9iamVjdCAqc2xvdF9uYW1lLCAqbmV3X25hbWU7Ci0JUHlfc3NpemVfdCBpOworICAgIFB5T2JqZWN0ICp0bXAgPSBOVUxMOworICAgIFB5T2JqZWN0ICpzbG90X25hbWUsICpuZXdfbmFtZTsKKyAgICBQeV9zc2l6ZV90IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgbnNsb3RzOyBpKyspIHsKLQkJaWYgKFB5VW5pY29kZV9DaGVjayhzbG90X25hbWUgPSBQeVR1cGxlX0dFVF9JVEVNKHNsb3RzLCBpKSkpIHsKLQkJCWlmICh0bXAgPT0gTlVMTCkgewotCQkJCXRtcCA9IFB5U2VxdWVuY2VfTGlzdChzbG90cyk7Ci0JCQkJaWYgKHRtcCA9PSBOVUxMKQotCQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJCW5ld19uYW1lID0gX1B5VW5pY29kZV9Bc0RlZmF1bHRFbmNvZGVkU3RyaW5nKHNsb3RfbmFtZSwKLQkJCQkJCQkJICAgICBOVUxMKTsKLQkJCWlmIChuZXdfbmFtZSA9PSBOVUxMKSB7Ci0JCQkJUHlfREVDUkVGKHRtcCk7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCQlQeV9JTkNSRUYobmV3X25hbWUpOwotCQkJUHlMaXN0X1NFVF9JVEVNKHRtcCwgaSwgbmV3X25hbWUpOwotCQkJUHlfREVDUkVGKHNsb3RfbmFtZSk7Ci0JCX0KLQl9Ci0JaWYgKHRtcCAhPSBOVUxMKSB7Ci0JCXNsb3RzID0gUHlMaXN0X0FzVHVwbGUodG1wKTsKLQkJUHlfREVDUkVGKHRtcCk7Ci0JfQotCXJldHVybiBzbG90czsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnNsb3RzOyBpKyspIHsKKyAgICAgICAgaWYgKFB5VW5pY29kZV9DaGVjayhzbG90X25hbWUgPSBQeVR1cGxlX0dFVF9JVEVNKHNsb3RzLCBpKSkpIHsKKyAgICAgICAgICAgIGlmICh0bXAgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHRtcCA9IFB5U2VxdWVuY2VfTGlzdChzbG90cyk7CisgICAgICAgICAgICAgICAgaWYgKHRtcCA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5ld19uYW1lID0gX1B5VW5pY29kZV9Bc0RlZmF1bHRFbmNvZGVkU3RyaW5nKHNsb3RfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICAgICAgaWYgKG5ld19uYW1lID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYodG1wKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5X0lOQ1JFRihuZXdfbmFtZSk7CisgICAgICAgICAgICBQeUxpc3RfU0VUX0lURU0odG1wLCBpLCBuZXdfbmFtZSk7CisgICAgICAgICAgICBQeV9ERUNSRUYoc2xvdF9uYW1lKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAodG1wICE9IE5VTEwpIHsKKyAgICAgICAgc2xvdHMgPSBQeUxpc3RfQXNUdXBsZSh0bXApOworICAgICAgICBQeV9ERUNSRUYodG1wKTsKKyAgICB9CisgICAgcmV0dXJuIHNsb3RzOwogfQogI2VuZGlmCiAKQEAgLTIwMDksNDQ4ICsyMDA5LDQ0OCBAQAogc3RhdGljIGludAogdHlwZV9pbml0KFB5T2JqZWN0ICpjbHMsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlpbnQgcmVzOworICAgIGludCByZXM7CiAKLQlhc3NlcnQoYXJncyAhPSBOVUxMICYmIFB5VHVwbGVfQ2hlY2soYXJncykpOwotCWFzc2VydChrd2RzID09IE5VTEwgfHwgUHlEaWN0X0NoZWNrKGt3ZHMpKTsKKyAgICBhc3NlcnQoYXJncyAhPSBOVUxMICYmIFB5VHVwbGVfQ2hlY2soYXJncykpOworICAgIGFzc2VydChrd2RzID09IE5VTEwgfHwgUHlEaWN0X0NoZWNrKGt3ZHMpKTsKIAotCWlmIChrd2RzICE9IE5VTEwgJiYgUHlEaWN0X0NoZWNrKGt3ZHMpICYmIFB5RGljdF9TaXplKGt3ZHMpICE9IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkidHlwZS5fX2luaXRfXygpIHRha2VzIG5vIGtleXdvcmQgYXJndW1lbnRzIik7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgaWYgKGt3ZHMgIT0gTlVMTCAmJiBQeURpY3RfQ2hlY2soa3dkcykgJiYgUHlEaWN0X1NpemUoa3dkcykgIT0gMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUuX19pbml0X18oKSB0YWtlcyBubyBrZXl3b3JkIGFyZ3VtZW50cyIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JaWYgKGFyZ3MgIT0gTlVMTCAmJiBQeVR1cGxlX0NoZWNrKGFyZ3MpICYmCi0JICAgIChQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpICE9IDEgJiYgUHlUdXBsZV9HRVRfU0laRShhcmdzKSAhPSAzKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJ0eXBlLl9faW5pdF9fKCkgdGFrZXMgMSBvciAzIGFyZ3VtZW50cyIpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIGlmIChhcmdzICE9IE5VTEwgJiYgUHlUdXBsZV9DaGVjayhhcmdzKSAmJgorICAgICAgICAoUHlUdXBsZV9HRVRfU0laRShhcmdzKSAhPSAxICYmIFB5VHVwbGVfR0VUX1NJWkUoYXJncykgIT0gMykpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlLl9faW5pdF9fKCkgdGFrZXMgMSBvciAzIGFyZ3VtZW50cyIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JLyogQ2FsbCBvYmplY3QuX19pbml0X18oc2VsZikgbm93LiAqLwotCS8qIFhYWCBDb3VsZCBjYWxsIHN1cGVyKHR5cGUsIGNscykuX19pbml0X18oKSBidXQgd2hhdCdzIHRoZSBwb2ludD8gKi8KLQlhcmdzID0gUHlUdXBsZV9HZXRTbGljZShhcmdzLCAwLCAwKTsKLQlyZXMgPSBvYmplY3RfaW5pdChjbHMsIGFyZ3MsIE5VTEwpOwotCVB5X0RFQ1JFRihhcmdzKTsKLQlyZXR1cm4gcmVzOworICAgIC8qIENhbGwgb2JqZWN0Ll9faW5pdF9fKHNlbGYpIG5vdy4gKi8KKyAgICAvKiBYWFggQ291bGQgY2FsbCBzdXBlcih0eXBlLCBjbHMpLl9faW5pdF9fKCkgYnV0IHdoYXQncyB0aGUgcG9pbnQ/ICovCisgICAgYXJncyA9IFB5VHVwbGVfR2V0U2xpY2UoYXJncywgMCwgMCk7CisgICAgcmVzID0gb2JqZWN0X2luaXQoY2xzLCBhcmdzLCBOVUxMKTsKKyAgICBQeV9ERUNSRUYoYXJncyk7CisgICAgcmV0dXJuIHJlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHR5cGVfbmV3KFB5VHlwZU9iamVjdCAqbWV0YXR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlQeU9iamVjdCAqbmFtZSwgKmJhc2VzLCAqZGljdDsKLQlzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7Im5hbWUiLCAiYmFzZXMiLCAiZGljdCIsIDB9OwotCVB5T2JqZWN0ICpzbG90cywgKnRtcCwgKm5ld3Nsb3RzOwotCVB5VHlwZU9iamVjdCAqdHlwZSwgKmJhc2UsICp0bXB0eXBlLCAqd2lubmVyOwotCVB5SGVhcFR5cGVPYmplY3QgKmV0OwotCVB5TWVtYmVyRGVmICptcDsKLQlQeV9zc2l6ZV90IGksIG5iYXNlcywgbnNsb3RzLCBzbG90b2Zmc2V0LCBhZGRfZGljdCwgYWRkX3dlYWs7Ci0JaW50IGosIG1heV9hZGRfZGljdCwgbWF5X2FkZF93ZWFrOworICAgIFB5T2JqZWN0ICpuYW1lLCAqYmFzZXMsICpkaWN0OworICAgIHN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsibmFtZSIsICJiYXNlcyIsICJkaWN0IiwgMH07CisgICAgUHlPYmplY3QgKnNsb3RzLCAqdG1wLCAqbmV3c2xvdHM7CisgICAgUHlUeXBlT2JqZWN0ICp0eXBlLCAqYmFzZSwgKnRtcHR5cGUsICp3aW5uZXI7CisgICAgUHlIZWFwVHlwZU9iamVjdCAqZXQ7CisgICAgUHlNZW1iZXJEZWYgKm1wOworICAgIFB5X3NzaXplX3QgaSwgbmJhc2VzLCBuc2xvdHMsIHNsb3RvZmZzZXQsIGFkZF9kaWN0LCBhZGRfd2VhazsKKyAgICBpbnQgaiwgbWF5X2FkZF9kaWN0LCBtYXlfYWRkX3dlYWs7CiAKLQlhc3NlcnQoYXJncyAhPSBOVUxMICYmIFB5VHVwbGVfQ2hlY2soYXJncykpOwotCWFzc2VydChrd2RzID09IE5VTEwgfHwgUHlEaWN0X0NoZWNrKGt3ZHMpKTsKKyAgICBhc3NlcnQoYXJncyAhPSBOVUxMICYmIFB5VHVwbGVfQ2hlY2soYXJncykpOworICAgIGFzc2VydChrd2RzID09IE5VTEwgfHwgUHlEaWN0X0NoZWNrKGt3ZHMpKTsKIAotCS8qIFNwZWNpYWwgY2FzZTogdHlwZSh4KSBzaG91bGQgcmV0dXJuIHgtPm9iX3R5cGUgKi8KLQl7Ci0JCWNvbnN0IFB5X3NzaXplX3QgbmFyZ3MgPSBQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpOwotCQljb25zdCBQeV9zc2l6ZV90IG5rd2RzID0ga3dkcyA9PSBOVUxMID8gMCA6IFB5RGljdF9TaXplKGt3ZHMpOworICAgIC8qIFNwZWNpYWwgY2FzZTogdHlwZSh4KSBzaG91bGQgcmV0dXJuIHgtPm9iX3R5cGUgKi8KKyAgICB7CisgICAgICAgIGNvbnN0IFB5X3NzaXplX3QgbmFyZ3MgPSBQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpOworICAgICAgICBjb25zdCBQeV9zc2l6ZV90IG5rd2RzID0ga3dkcyA9PSBOVUxMID8gMCA6IFB5RGljdF9TaXplKGt3ZHMpOwogCi0JCWlmIChQeVR5cGVfQ2hlY2tFeGFjdChtZXRhdHlwZSkgJiYgbmFyZ3MgPT0gMSAmJiBua3dkcyA9PSAwKSB7Ci0JCQlQeU9iamVjdCAqeCA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgMCk7Ci0JCQlQeV9JTkNSRUYoUHlfVFlQRSh4KSk7Ci0JCQlyZXR1cm4gKFB5T2JqZWN0ICopIFB5X1RZUEUoeCk7Ci0JCX0KKyAgICAgICAgaWYgKFB5VHlwZV9DaGVja0V4YWN0KG1ldGF0eXBlKSAmJiBuYXJncyA9PSAxICYmIG5rd2RzID09IDApIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICp4ID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCAwKTsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihQeV9UWVBFKHgpKTsKKyAgICAgICAgICAgIHJldHVybiAoUHlPYmplY3QgKikgUHlfVFlQRSh4KTsKKyAgICAgICAgfQogCi0JCS8qIFNGIGJ1ZyA0NzUzMjcgLS0gaWYgdGhhdCBkaWRuJ3QgdHJpZ2dlciwgd2UgbmVlZCAzCi0JCSAgIGFyZ3VtZW50cy4gYnV0IFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyBiZWxvdyBtYXkgZ2l2ZQotCQkgICBhIG1zZyBzYXlpbmcgdHlwZSgpIG5lZWRzIGV4YWN0bHkgMy4gKi8KLQkJaWYgKG5hcmdzICsgbmt3ZHMgIT0gMykgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkJInR5cGUoKSB0YWtlcyAxIG9yIDMgYXJndW1lbnRzIik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KKyAgICAgICAgLyogU0YgYnVnIDQ3NTMyNyAtLSBpZiB0aGF0IGRpZG4ndCB0cmlnZ2VyLCB3ZSBuZWVkIDMKKyAgICAgICAgICAgYXJndW1lbnRzLiBidXQgUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzIGJlbG93IG1heSBnaXZlCisgICAgICAgICAgIGEgbXNnIHNheWluZyB0eXBlKCkgbmVlZHMgZXhhY3RseSAzLiAqLworICAgICAgICBpZiAobmFyZ3MgKyBua3dkcyAhPSAzKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlKCkgdGFrZXMgMSBvciAzIGFyZ3VtZW50cyIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKiBDaGVjayBhcmd1bWVudHM6IChuYW1lLCBiYXNlcywgZGljdCkgKi8KLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAiU08hTyE6dHlwZSIsIGt3bGlzdCwKLQkJCQkJICZuYW1lLAotCQkJCQkgJlB5VHVwbGVfVHlwZSwgJmJhc2VzLAotCQkJCQkgJlB5RGljdF9UeXBlLCAmZGljdCkpCi0JCXJldHVybiBOVUxMOworICAgIC8qIENoZWNrIGFyZ3VtZW50czogKG5hbWUsIGJhc2VzLCBkaWN0KSAqLworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJTTyFPITp0eXBlIiwga3dsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZQeVR1cGxlX1R5cGUsICZiYXNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmUHlEaWN0X1R5cGUsICZkaWN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkvKiBEZXRlcm1pbmUgdGhlIHByb3BlciBtZXRhdHlwZSB0byBkZWFsIHdpdGggdGhpcywKLQkgICBhbmQgY2hlY2sgZm9yIG1ldGF0eXBlIGNvbmZsaWN0cyB3aGlsZSB3ZSdyZSBhdCBpdC4KLQkgICBOb3RlIHRoYXQgaWYgc29tZSBvdGhlciBtZXRhdHlwZSB3aW5zIHRvIGNvbnRyYWN0LAotCSAgIGl0J3MgcG9zc2libGUgdGhhdCBpdHMgaW5zdGFuY2VzIGFyZSBub3QgdHlwZXMuICovCi0JbmJhc2VzID0gUHlUdXBsZV9HRVRfU0laRShiYXNlcyk7Ci0Jd2lubmVyID0gbWV0YXR5cGU7Ci0JZm9yIChpID0gMDsgaSA8IG5iYXNlczsgaSsrKSB7Ci0JCXRtcCA9IFB5VHVwbGVfR0VUX0lURU0oYmFzZXMsIGkpOwotCQl0bXB0eXBlID0gdG1wLT5vYl90eXBlOwotCQlpZiAodG1wdHlwZSA9PSAmUHlDbGFzc19UeXBlKQotCQkJY29udGludWU7IC8qIFNwZWNpYWwgY2FzZSBjbGFzc2ljIGNsYXNzZXMgKi8KLQkJaWYgKFB5VHlwZV9Jc1N1YnR5cGUod2lubmVyLCB0bXB0eXBlKSkKLQkJCWNvbnRpbnVlOwotCQlpZiAoUHlUeXBlX0lzU3VidHlwZSh0bXB0eXBlLCB3aW5uZXIpKSB7Ci0JCQl3aW5uZXIgPSB0bXB0eXBlOwotCQkJY29udGludWU7Ci0JCX0KLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkibWV0YWNsYXNzIGNvbmZsaWN0OiAiCi0JCQkJInRoZSBtZXRhY2xhc3Mgb2YgYSBkZXJpdmVkIGNsYXNzICIKLQkJCQkibXVzdCBiZSBhIChub24tc3RyaWN0KSBzdWJjbGFzcyAiCi0JCQkJIm9mIHRoZSBtZXRhY2xhc3NlcyBvZiBhbGwgaXRzIGJhc2VzIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAod2lubmVyICE9IG1ldGF0eXBlKSB7Ci0JCWlmICh3aW5uZXItPnRwX25ldyAhPSB0eXBlX25ldykgLyogUGFzcyBpdCB0byB0aGUgd2lubmVyICovCi0JCQlyZXR1cm4gd2lubmVyLT50cF9uZXcod2lubmVyLCBhcmdzLCBrd2RzKTsKLQkJbWV0YXR5cGUgPSB3aW5uZXI7Ci0JfQorICAgIC8qIERldGVybWluZSB0aGUgcHJvcGVyIG1ldGF0eXBlIHRvIGRlYWwgd2l0aCB0aGlzLAorICAgICAgIGFuZCBjaGVjayBmb3IgbWV0YXR5cGUgY29uZmxpY3RzIHdoaWxlIHdlJ3JlIGF0IGl0LgorICAgICAgIE5vdGUgdGhhdCBpZiBzb21lIG90aGVyIG1ldGF0eXBlIHdpbnMgdG8gY29udHJhY3QsCisgICAgICAgaXQncyBwb3NzaWJsZSB0aGF0IGl0cyBpbnN0YW5jZXMgYXJlIG5vdCB0eXBlcy4gKi8KKyAgICBuYmFzZXMgPSBQeVR1cGxlX0dFVF9TSVpFKGJhc2VzKTsKKyAgICB3aW5uZXIgPSBtZXRhdHlwZTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbmJhc2VzOyBpKyspIHsKKyAgICAgICAgdG1wID0gUHlUdXBsZV9HRVRfSVRFTShiYXNlcywgaSk7CisgICAgICAgIHRtcHR5cGUgPSB0bXAtPm9iX3R5cGU7CisgICAgICAgIGlmICh0bXB0eXBlID09ICZQeUNsYXNzX1R5cGUpCisgICAgICAgICAgICBjb250aW51ZTsgLyogU3BlY2lhbCBjYXNlIGNsYXNzaWMgY2xhc3NlcyAqLworICAgICAgICBpZiAoUHlUeXBlX0lzU3VidHlwZSh3aW5uZXIsIHRtcHR5cGUpKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmIChQeVR5cGVfSXNTdWJ0eXBlKHRtcHR5cGUsIHdpbm5lcikpIHsKKyAgICAgICAgICAgIHdpbm5lciA9IHRtcHR5cGU7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIm1ldGFjbGFzcyBjb25mbGljdDogIgorICAgICAgICAgICAgICAgICAgICAgICAgInRoZSBtZXRhY2xhc3Mgb2YgYSBkZXJpdmVkIGNsYXNzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJtdXN0IGJlIGEgKG5vbi1zdHJpY3QpIHN1YmNsYXNzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJvZiB0aGUgbWV0YWNsYXNzZXMgb2YgYWxsIGl0cyBiYXNlcyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKHdpbm5lciAhPSBtZXRhdHlwZSkgeworICAgICAgICBpZiAod2lubmVyLT50cF9uZXcgIT0gdHlwZV9uZXcpIC8qIFBhc3MgaXQgdG8gdGhlIHdpbm5lciAqLworICAgICAgICAgICAgcmV0dXJuIHdpbm5lci0+dHBfbmV3KHdpbm5lciwgYXJncywga3dkcyk7CisgICAgICAgIG1ldGF0eXBlID0gd2lubmVyOworICAgIH0KIAotCS8qIEFkanVzdCBmb3IgZW1wdHkgdHVwbGUgYmFzZXMgKi8KLQlpZiAobmJhc2VzID09IDApIHsKLQkJYmFzZXMgPSBQeVR1cGxlX1BhY2soMSwgJlB5QmFzZU9iamVjdF9UeXBlKTsKLQkJaWYgKGJhc2VzID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQkJbmJhc2VzID0gMTsKLQl9Ci0JZWxzZQotCQlQeV9JTkNSRUYoYmFzZXMpOworICAgIC8qIEFkanVzdCBmb3IgZW1wdHkgdHVwbGUgYmFzZXMgKi8KKyAgICBpZiAobmJhc2VzID09IDApIHsKKyAgICAgICAgYmFzZXMgPSBQeVR1cGxlX1BhY2soMSwgJlB5QmFzZU9iamVjdF9UeXBlKTsKKyAgICAgICAgaWYgKGJhc2VzID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgbmJhc2VzID0gMTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBQeV9JTkNSRUYoYmFzZXMpOwogCi0JLyogWFhYIEZyb20gaGVyZSB1bnRpbCB0eXBlIGlzIGFsbG9jYXRlZCwgInJldHVybiBOVUxMIiBsZWFrcyBiYXNlcyEgKi8KKyAgICAvKiBYWFggRnJvbSBoZXJlIHVudGlsIHR5cGUgaXMgYWxsb2NhdGVkLCAicmV0dXJuIE5VTEwiIGxlYWtzIGJhc2VzISAqLwogCi0JLyogQ2FsY3VsYXRlIGJlc3QgYmFzZSwgYW5kIGNoZWNrIHRoYXQgYWxsIGJhc2VzIGFyZSB0eXBlIG9iamVjdHMgKi8KLQliYXNlID0gYmVzdF9iYXNlKGJhc2VzKTsKLQlpZiAoYmFzZSA9PSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRihiYXNlcyk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoIVB5VHlwZV9IYXNGZWF0dXJlKGJhc2UsIFB5X1RQRkxBR1NfQkFTRVRZUEUpKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgICJ0eXBlICclLjEwMHMnIGlzIG5vdCBhbiBhY2NlcHRhYmxlIGJhc2UgdHlwZSIsCi0JCQkgICAgIGJhc2UtPnRwX25hbWUpOwotCQlQeV9ERUNSRUYoYmFzZXMpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgLyogQ2FsY3VsYXRlIGJlc3QgYmFzZSwgYW5kIGNoZWNrIHRoYXQgYWxsIGJhc2VzIGFyZSB0eXBlIG9iamVjdHMgKi8KKyAgICBiYXNlID0gYmVzdF9iYXNlKGJhc2VzKTsKKyAgICBpZiAoYmFzZSA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihiYXNlcyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoIVB5VHlwZV9IYXNGZWF0dXJlKGJhc2UsIFB5X1RQRkxBR1NfQkFTRVRZUEUpKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAidHlwZSAnJS4xMDBzJyBpcyBub3QgYW4gYWNjZXB0YWJsZSBiYXNlIHR5cGUiLAorICAgICAgICAgICAgICAgICAgICAgYmFzZS0+dHBfbmFtZSk7CisgICAgICAgIFB5X0RFQ1JFRihiYXNlcyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCS8qIENoZWNrIGZvciBhIF9fc2xvdHNfXyBzZXF1ZW5jZSB2YXJpYWJsZSBpbiBkaWN0LCBhbmQgY291bnQgaXQgKi8KLQlzbG90cyA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKGRpY3QsICJfX3Nsb3RzX18iKTsKLQluc2xvdHMgPSAwOwotCWFkZF9kaWN0ID0gMDsKLQlhZGRfd2VhayA9IDA7Ci0JbWF5X2FkZF9kaWN0ID0gYmFzZS0+dHBfZGljdG9mZnNldCA9PSAwOwotCW1heV9hZGRfd2VhayA9IGJhc2UtPnRwX3dlYWtsaXN0b2Zmc2V0ID09IDAgJiYgYmFzZS0+dHBfaXRlbXNpemUgPT0gMDsKLQlpZiAoc2xvdHMgPT0gTlVMTCkgewotCQlpZiAobWF5X2FkZF9kaWN0KSB7Ci0JCQlhZGRfZGljdCsrOwotCQl9Ci0JCWlmIChtYXlfYWRkX3dlYWspIHsKLQkJCWFkZF93ZWFrKys7Ci0JCX0KLQl9Ci0JZWxzZSB7Ci0JCS8qIEhhdmUgc2xvdHMgKi8KKyAgICAvKiBDaGVjayBmb3IgYSBfX3Nsb3RzX18gc2VxdWVuY2UgdmFyaWFibGUgaW4gZGljdCwgYW5kIGNvdW50IGl0ICovCisgICAgc2xvdHMgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhkaWN0LCAiX19zbG90c19fIik7CisgICAgbnNsb3RzID0gMDsKKyAgICBhZGRfZGljdCA9IDA7CisgICAgYWRkX3dlYWsgPSAwOworICAgIG1heV9hZGRfZGljdCA9IGJhc2UtPnRwX2RpY3RvZmZzZXQgPT0gMDsKKyAgICBtYXlfYWRkX3dlYWsgPSBiYXNlLT50cF93ZWFrbGlzdG9mZnNldCA9PSAwICYmIGJhc2UtPnRwX2l0ZW1zaXplID09IDA7CisgICAgaWYgKHNsb3RzID09IE5VTEwpIHsKKyAgICAgICAgaWYgKG1heV9hZGRfZGljdCkgeworICAgICAgICAgICAgYWRkX2RpY3QrKzsKKyAgICAgICAgfQorICAgICAgICBpZiAobWF5X2FkZF93ZWFrKSB7CisgICAgICAgICAgICBhZGRfd2VhaysrOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvKiBIYXZlIHNsb3RzICovCiAKLQkJLyogTWFrZSBpdCBpbnRvIGEgdHVwbGUgKi8KLQkJaWYgKFB5U3RyaW5nX0NoZWNrKHNsb3RzKSB8fCBQeVVuaWNvZGVfQ2hlY2soc2xvdHMpKQotCQkJc2xvdHMgPSBQeVR1cGxlX1BhY2soMSwgc2xvdHMpOwotCQllbHNlCi0JCQlzbG90cyA9IFB5U2VxdWVuY2VfVHVwbGUoc2xvdHMpOwotCQlpZiAoc2xvdHMgPT0gTlVMTCkgewotCQkJUHlfREVDUkVGKGJhc2VzKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWFzc2VydChQeVR1cGxlX0NoZWNrKHNsb3RzKSk7CisgICAgICAgIC8qIE1ha2UgaXQgaW50byBhIHR1cGxlICovCisgICAgICAgIGlmIChQeVN0cmluZ19DaGVjayhzbG90cykgfHwgUHlVbmljb2RlX0NoZWNrKHNsb3RzKSkKKyAgICAgICAgICAgIHNsb3RzID0gUHlUdXBsZV9QYWNrKDEsIHNsb3RzKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc2xvdHMgPSBQeVNlcXVlbmNlX1R1cGxlKHNsb3RzKTsKKyAgICAgICAgaWYgKHNsb3RzID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihiYXNlcyk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnQoUHlUdXBsZV9DaGVjayhzbG90cykpOwogCi0JCS8qIEFyZSBzbG90cyBhbGxvd2VkPyAqLwotCQluc2xvdHMgPSBQeVR1cGxlX0dFVF9TSVpFKHNsb3RzKTsKLQkJaWYgKG5zbG90cyA+IDAgJiYgYmFzZS0+dHBfaXRlbXNpemUgIT0gMCkgewotCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCQkgICAgICJub25lbXB0eSBfX3Nsb3RzX18gIgotCQkJCSAgICAgIm5vdCBzdXBwb3J0ZWQgZm9yIHN1YnR5cGUgb2YgJyVzJyIsCi0JCQkJICAgICBiYXNlLT50cF9uYW1lKTsKLQkJICBiYWRfc2xvdHM6Ci0JCQlQeV9ERUNSRUYoYmFzZXMpOwotCQkJUHlfREVDUkVGKHNsb3RzKTsKLQkJCXJldHVybiBOVUxMOwotCQl9CisgICAgICAgIC8qIEFyZSBzbG90cyBhbGxvd2VkPyAqLworICAgICAgICBuc2xvdHMgPSBQeVR1cGxlX0dFVF9TSVpFKHNsb3RzKTsKKyAgICAgICAgaWYgKG5zbG90cyA+IDAgJiYgYmFzZS0+dHBfaXRlbXNpemUgIT0gMCkgeworICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAibm9uZW1wdHkgX19zbG90c19fICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAibm90IHN1cHBvcnRlZCBmb3Igc3VidHlwZSBvZiAnJXMnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlLT50cF9uYW1lKTsKKyAgICAgICAgICBiYWRfc2xvdHM6CisgICAgICAgICAgICBQeV9ERUNSRUYoYmFzZXMpOworICAgICAgICAgICAgUHlfREVDUkVGKHNsb3RzKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CiAKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JCXRtcCA9IF91bmljb2RlX3RvX3N0cmluZyhzbG90cywgbnNsb3RzKTsKLQkJaWYgKHRtcCA9PSBOVUxMKQotCQkJZ290byBiYWRfc2xvdHM7Ci0JCWlmICh0bXAgIT0gc2xvdHMpIHsKLQkJCVB5X0RFQ1JFRihzbG90cyk7Ci0JCQlzbG90cyA9IHRtcDsKLQkJfQorICAgICAgICB0bXAgPSBfdW5pY29kZV90b19zdHJpbmcoc2xvdHMsIG5zbG90cyk7CisgICAgICAgIGlmICh0bXAgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gYmFkX3Nsb3RzOworICAgICAgICBpZiAodG1wICE9IHNsb3RzKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoc2xvdHMpOworICAgICAgICAgICAgc2xvdHMgPSB0bXA7CisgICAgICAgIH0KICNlbmRpZgotCQkvKiBDaGVjayBmb3IgdmFsaWQgc2xvdCBuYW1lcyBhbmQgdHdvIHNwZWNpYWwgY2FzZXMgKi8KLQkJZm9yIChpID0gMDsgaSA8IG5zbG90czsgaSsrKSB7Ci0JCQlQeU9iamVjdCAqdG1wID0gUHlUdXBsZV9HRVRfSVRFTShzbG90cywgaSk7Ci0JCQljaGFyICpzOwotCQkJaWYgKCF2YWxpZF9pZGVudGlmaWVyKHRtcCkpCi0JCQkJZ290byBiYWRfc2xvdHM7Ci0JCQlhc3NlcnQoUHlTdHJpbmdfQ2hlY2sodG1wKSk7Ci0JCQlzID0gUHlTdHJpbmdfQVNfU1RSSU5HKHRtcCk7Ci0JCQlpZiAoc3RyY21wKHMsICJfX2RpY3RfXyIpID09IDApIHsKLQkJCQlpZiAoIW1heV9hZGRfZGljdCB8fCBhZGRfZGljdCkgewotCQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCQkJIl9fZGljdF9fIHNsb3QgZGlzYWxsb3dlZDogIgotCQkJCQkJIndlIGFscmVhZHkgZ290IG9uZSIpOwotCQkJCQlnb3RvIGJhZF9zbG90czsKLQkJCQl9Ci0JCQkJYWRkX2RpY3QrKzsKLQkJCX0KLQkJCWlmIChzdHJjbXAocywgIl9fd2Vha3JlZl9fIikgPT0gMCkgewotCQkJCWlmICghbWF5X2FkZF93ZWFrIHx8IGFkZF93ZWFrKSB7Ci0JCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJCQkiX193ZWFrcmVmX18gc2xvdCBkaXNhbGxvd2VkOiAiCi0JCQkJCQkiZWl0aGVyIHdlIGFscmVhZHkgZ290IG9uZSwgIgotCQkJCQkJIm9yIF9faXRlbXNpemVfXyAhPSAwIik7Ci0JCQkJCWdvdG8gYmFkX3Nsb3RzOwotCQkJCX0KLQkJCQlhZGRfd2VhaysrOwotCQkJfQotCQl9CisgICAgICAgIC8qIENoZWNrIGZvciB2YWxpZCBzbG90IG5hbWVzIGFuZCB0d28gc3BlY2lhbCBjYXNlcyAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnNsb3RzOyBpKyspIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICp0bXAgPSBQeVR1cGxlX0dFVF9JVEVNKHNsb3RzLCBpKTsKKyAgICAgICAgICAgIGNoYXIgKnM7CisgICAgICAgICAgICBpZiAoIXZhbGlkX2lkZW50aWZpZXIodG1wKSkKKyAgICAgICAgICAgICAgICBnb3RvIGJhZF9zbG90czsKKyAgICAgICAgICAgIGFzc2VydChQeVN0cmluZ19DaGVjayh0bXApKTsKKyAgICAgICAgICAgIHMgPSBQeVN0cmluZ19BU19TVFJJTkcodG1wKTsKKyAgICAgICAgICAgIGlmIChzdHJjbXAocywgIl9fZGljdF9fIikgPT0gMCkgeworICAgICAgICAgICAgICAgIGlmICghbWF5X2FkZF9kaWN0IHx8IGFkZF9kaWN0KSB7CisgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiX19kaWN0X18gc2xvdCBkaXNhbGxvd2VkOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAid2UgYWxyZWFkeSBnb3Qgb25lIik7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gYmFkX3Nsb3RzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhZGRfZGljdCsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0cmNtcChzLCAiX193ZWFrcmVmX18iKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKCFtYXlfYWRkX3dlYWsgfHwgYWRkX3dlYWspIHsKKyAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJfX3dlYWtyZWZfXyBzbG90IGRpc2FsbG93ZWQ6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJlaXRoZXIgd2UgYWxyZWFkeSBnb3Qgb25lLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAib3IgX19pdGVtc2l6ZV9fICE9IDAiKTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBiYWRfc2xvdHM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGFkZF93ZWFrKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQkvKiBDb3B5IHNsb3RzIGludG8gYSBsaXN0LCBtYW5nbGUgbmFtZXMgYW5kIHNvcnQgdGhlbS4KLQkJICAgU29ydGVkIG5hbWVzIGFyZSBuZWVkZWQgZm9yIF9fY2xhc3NfXyBhc3NpZ25tZW50LgotCQkgICBDb252ZXJ0IHRoZW0gYmFjayB0byB0dXBsZSBhdCB0aGUgZW5kLgotCQkqLwotCQluZXdzbG90cyA9IFB5TGlzdF9OZXcobnNsb3RzIC0gYWRkX2RpY3QgLSBhZGRfd2Vhayk7Ci0JCWlmIChuZXdzbG90cyA9PSBOVUxMKQotCQkJZ290byBiYWRfc2xvdHM7Ci0JCWZvciAoaSA9IGogPSAwOyBpIDwgbnNsb3RzOyBpKyspIHsKLQkJCWNoYXIgKnM7Ci0JCQl0bXAgPSBQeVR1cGxlX0dFVF9JVEVNKHNsb3RzLCBpKTsKLQkJCXMgPSBQeVN0cmluZ19BU19TVFJJTkcodG1wKTsKLQkJCWlmICgoYWRkX2RpY3QgJiYgc3RyY21wKHMsICJfX2RpY3RfXyIpID09IDApIHx8Ci0JCQkgICAgKGFkZF93ZWFrICYmIHN0cmNtcChzLCAiX193ZWFrcmVmX18iKSA9PSAwKSkKLQkJCQljb250aW51ZTsKLQkJCXRtcCA9X1B5X01hbmdsZShuYW1lLCB0bXApOwotCQkJaWYgKCF0bXApCi0JCQkgICAgZ290byBiYWRfc2xvdHM7Ci0JCQlQeUxpc3RfU0VUX0lURU0obmV3c2xvdHMsIGosIHRtcCk7Ci0JCQlqKys7Ci0JCX0KLQkJYXNzZXJ0KGogPT0gbnNsb3RzIC0gYWRkX2RpY3QgLSBhZGRfd2Vhayk7Ci0JCW5zbG90cyA9IGo7Ci0JCVB5X0RFQ1JFRihzbG90cyk7Ci0JCWlmIChQeUxpc3RfU29ydChuZXdzbG90cykgPT0gLTEpIHsKLQkJCVB5X0RFQ1JFRihiYXNlcyk7Ci0JCQlQeV9ERUNSRUYobmV3c2xvdHMpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJc2xvdHMgPSBQeUxpc3RfQXNUdXBsZShuZXdzbG90cyk7Ci0JCVB5X0RFQ1JFRihuZXdzbG90cyk7Ci0JCWlmIChzbG90cyA9PSBOVUxMKSB7Ci0JCQlQeV9ERUNSRUYoYmFzZXMpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KKyAgICAgICAgLyogQ29weSBzbG90cyBpbnRvIGEgbGlzdCwgbWFuZ2xlIG5hbWVzIGFuZCBzb3J0IHRoZW0uCisgICAgICAgICAgIFNvcnRlZCBuYW1lcyBhcmUgbmVlZGVkIGZvciBfX2NsYXNzX18gYXNzaWdubWVudC4KKyAgICAgICAgICAgQ29udmVydCB0aGVtIGJhY2sgdG8gdHVwbGUgYXQgdGhlIGVuZC4KKyAgICAgICAgKi8KKyAgICAgICAgbmV3c2xvdHMgPSBQeUxpc3RfTmV3KG5zbG90cyAtIGFkZF9kaWN0IC0gYWRkX3dlYWspOworICAgICAgICBpZiAobmV3c2xvdHMgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gYmFkX3Nsb3RzOworICAgICAgICBmb3IgKGkgPSBqID0gMDsgaSA8IG5zbG90czsgaSsrKSB7CisgICAgICAgICAgICBjaGFyICpzOworICAgICAgICAgICAgdG1wID0gUHlUdXBsZV9HRVRfSVRFTShzbG90cywgaSk7CisgICAgICAgICAgICBzID0gUHlTdHJpbmdfQVNfU1RSSU5HKHRtcCk7CisgICAgICAgICAgICBpZiAoKGFkZF9kaWN0ICYmIHN0cmNtcChzLCAiX19kaWN0X18iKSA9PSAwKSB8fAorICAgICAgICAgICAgICAgIChhZGRfd2VhayAmJiBzdHJjbXAocywgIl9fd2Vha3JlZl9fIikgPT0gMCkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB0bXAgPV9QeV9NYW5nbGUobmFtZSwgdG1wKTsKKyAgICAgICAgICAgIGlmICghdG1wKQorICAgICAgICAgICAgICAgIGdvdG8gYmFkX3Nsb3RzOworICAgICAgICAgICAgUHlMaXN0X1NFVF9JVEVNKG5ld3Nsb3RzLCBqLCB0bXApOworICAgICAgICAgICAgaisrOworICAgICAgICB9CisgICAgICAgIGFzc2VydChqID09IG5zbG90cyAtIGFkZF9kaWN0IC0gYWRkX3dlYWspOworICAgICAgICBuc2xvdHMgPSBqOworICAgICAgICBQeV9ERUNSRUYoc2xvdHMpOworICAgICAgICBpZiAoUHlMaXN0X1NvcnQobmV3c2xvdHMpID09IC0xKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoYmFzZXMpOworICAgICAgICAgICAgUHlfREVDUkVGKG5ld3Nsb3RzKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHNsb3RzID0gUHlMaXN0X0FzVHVwbGUobmV3c2xvdHMpOworICAgICAgICBQeV9ERUNSRUYobmV3c2xvdHMpOworICAgICAgICBpZiAoc2xvdHMgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKGJhc2VzKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CiAKLQkJLyogU2Vjb25kYXJ5IGJhc2VzIG1heSBwcm92aWRlIHdlYWtyZWZzIG9yIGRpY3QgKi8KLQkJaWYgKG5iYXNlcyA+IDEgJiYKLQkJICAgICgobWF5X2FkZF9kaWN0ICYmICFhZGRfZGljdCkgfHwKLQkJICAgICAobWF5X2FkZF93ZWFrICYmICFhZGRfd2VhaykpKSB7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgbmJhc2VzOyBpKyspIHsKLQkJCQl0bXAgPSBQeVR1cGxlX0dFVF9JVEVNKGJhc2VzLCBpKTsKLQkJCQlpZiAodG1wID09IChQeU9iamVjdCAqKWJhc2UpCi0JCQkJCWNvbnRpbnVlOyAvKiBTa2lwIHByaW1hcnkgYmFzZSAqLwotCQkJCWlmIChQeUNsYXNzX0NoZWNrKHRtcCkpIHsKLQkJCQkJLyogQ2xhc3NpYyBiYXNlIGNsYXNzIHByb3ZpZGVzIGJvdGggKi8KLQkJCQkJaWYgKG1heV9hZGRfZGljdCAmJiAhYWRkX2RpY3QpCi0JCQkJCQlhZGRfZGljdCsrOwotCQkJCQlpZiAobWF5X2FkZF93ZWFrICYmICFhZGRfd2VhaykKLQkJCQkJCWFkZF93ZWFrKys7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlhc3NlcnQoUHlUeXBlX0NoZWNrKHRtcCkpOwotCQkJCXRtcHR5cGUgPSAoUHlUeXBlT2JqZWN0ICopdG1wOwotCQkJCWlmIChtYXlfYWRkX2RpY3QgJiYgIWFkZF9kaWN0ICYmCi0JCQkJICAgIHRtcHR5cGUtPnRwX2RpY3RvZmZzZXQgIT0gMCkKLQkJCQkJYWRkX2RpY3QrKzsKLQkJCQlpZiAobWF5X2FkZF93ZWFrICYmICFhZGRfd2VhayAmJgotCQkJCSAgICB0bXB0eXBlLT50cF93ZWFrbGlzdG9mZnNldCAhPSAwKQotCQkJCQlhZGRfd2VhaysrOwotCQkJCWlmIChtYXlfYWRkX2RpY3QgJiYgIWFkZF9kaWN0KQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAobWF5X2FkZF93ZWFrICYmICFhZGRfd2VhaykKLQkJCQkJY29udGludWU7Ci0JCQkJLyogTm90aGluZyBtb3JlIHRvIGNoZWNrICovCi0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9CisgICAgICAgIC8qIFNlY29uZGFyeSBiYXNlcyBtYXkgcHJvdmlkZSB3ZWFrcmVmcyBvciBkaWN0ICovCisgICAgICAgIGlmIChuYmFzZXMgPiAxICYmCisgICAgICAgICAgICAoKG1heV9hZGRfZGljdCAmJiAhYWRkX2RpY3QpIHx8CisgICAgICAgICAgICAgKG1heV9hZGRfd2VhayAmJiAhYWRkX3dlYWspKSkgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG5iYXNlczsgaSsrKSB7CisgICAgICAgICAgICAgICAgdG1wID0gUHlUdXBsZV9HRVRfSVRFTShiYXNlcywgaSk7CisgICAgICAgICAgICAgICAgaWYgKHRtcCA9PSAoUHlPYmplY3QgKiliYXNlKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgLyogU2tpcCBwcmltYXJ5IGJhc2UgKi8KKyAgICAgICAgICAgICAgICBpZiAoUHlDbGFzc19DaGVjayh0bXApKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIENsYXNzaWMgYmFzZSBjbGFzcyBwcm92aWRlcyBib3RoICovCisgICAgICAgICAgICAgICAgICAgIGlmIChtYXlfYWRkX2RpY3QgJiYgIWFkZF9kaWN0KQorICAgICAgICAgICAgICAgICAgICAgICAgYWRkX2RpY3QrKzsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1heV9hZGRfd2VhayAmJiAhYWRkX3dlYWspCisgICAgICAgICAgICAgICAgICAgICAgICBhZGRfd2VhaysrOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYXNzZXJ0KFB5VHlwZV9DaGVjayh0bXApKTsKKyAgICAgICAgICAgICAgICB0bXB0eXBlID0gKFB5VHlwZU9iamVjdCAqKXRtcDsKKyAgICAgICAgICAgICAgICBpZiAobWF5X2FkZF9kaWN0ICYmICFhZGRfZGljdCAmJgorICAgICAgICAgICAgICAgICAgICB0bXB0eXBlLT50cF9kaWN0b2Zmc2V0ICE9IDApCisgICAgICAgICAgICAgICAgICAgIGFkZF9kaWN0Kys7CisgICAgICAgICAgICAgICAgaWYgKG1heV9hZGRfd2VhayAmJiAhYWRkX3dlYWsgJiYKKyAgICAgICAgICAgICAgICAgICAgdG1wdHlwZS0+dHBfd2Vha2xpc3RvZmZzZXQgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgYWRkX3dlYWsrKzsKKyAgICAgICAgICAgICAgICBpZiAobWF5X2FkZF9kaWN0ICYmICFhZGRfZGljdCkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgaWYgKG1heV9hZGRfd2VhayAmJiAhYWRkX3dlYWspCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIC8qIE5vdGhpbmcgbW9yZSB0byBjaGVjayAqLworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogCi0JLyogWFhYIEZyb20gaGVyZSB1bnRpbCB0eXBlIGlzIHNhZmVseSBhbGxvY2F0ZWQsCi0JICAgInJldHVybiBOVUxMIiBtYXkgbGVhayBzbG90cyEgKi8KKyAgICAvKiBYWFggRnJvbSBoZXJlIHVudGlsIHR5cGUgaXMgc2FmZWx5IGFsbG9jYXRlZCwKKyAgICAgICAicmV0dXJuIE5VTEwiIG1heSBsZWFrIHNsb3RzISAqLwogCi0JLyogQWxsb2NhdGUgdGhlIHR5cGUgb2JqZWN0ICovCi0JdHlwZSA9IChQeVR5cGVPYmplY3QgKiltZXRhdHlwZS0+dHBfYWxsb2MobWV0YXR5cGUsIG5zbG90cyk7Ci0JaWYgKHR5cGUgPT0gTlVMTCkgewotCQlQeV9YREVDUkVGKHNsb3RzKTsKLQkJUHlfREVDUkVGKGJhc2VzKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIC8qIEFsbG9jYXRlIHRoZSB0eXBlIG9iamVjdCAqLworICAgIHR5cGUgPSAoUHlUeXBlT2JqZWN0ICopbWV0YXR5cGUtPnRwX2FsbG9jKG1ldGF0eXBlLCBuc2xvdHMpOworICAgIGlmICh0eXBlID09IE5VTEwpIHsKKyAgICAgICAgUHlfWERFQ1JFRihzbG90cyk7CisgICAgICAgIFB5X0RFQ1JFRihiYXNlcyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCS8qIEtlZXAgbmFtZSBhbmQgc2xvdHMgYWxpdmUgaW4gdGhlIGV4dGVuZGVkIHR5cGUgb2JqZWN0ICovCi0JZXQgPSAoUHlIZWFwVHlwZU9iamVjdCAqKXR5cGU7Ci0JUHlfSU5DUkVGKG5hbWUpOwotCWV0LT5odF9uYW1lID0gbmFtZTsKLQlldC0+aHRfc2xvdHMgPSBzbG90czsKKyAgICAvKiBLZWVwIG5hbWUgYW5kIHNsb3RzIGFsaXZlIGluIHRoZSBleHRlbmRlZCB0eXBlIG9iamVjdCAqLworICAgIGV0ID0gKFB5SGVhcFR5cGVPYmplY3QgKil0eXBlOworICAgIFB5X0lOQ1JFRihuYW1lKTsKKyAgICBldC0+aHRfbmFtZSA9IG5hbWU7CisgICAgZXQtPmh0X3Nsb3RzID0gc2xvdHM7CiAKLQkvKiBJbml0aWFsaXplIHRwX2ZsYWdzICovCi0JdHlwZS0+dHBfZmxhZ3MgPSBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hFQVBUWVBFIHwKLQkJUHlfVFBGTEFHU19CQVNFVFlQRTsKLQlpZiAoYmFzZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hBVkVfR0MpCi0JCXR5cGUtPnRwX2ZsYWdzIHw9IFB5X1RQRkxBR1NfSEFWRV9HQzsKKyAgICAvKiBJbml0aWFsaXplIHRwX2ZsYWdzICovCisgICAgdHlwZS0+dHBfZmxhZ3MgPSBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hFQVBUWVBFIHwKKyAgICAgICAgUHlfVFBGTEFHU19CQVNFVFlQRTsKKyAgICBpZiAoYmFzZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hBVkVfR0MpCisgICAgICAgIHR5cGUtPnRwX2ZsYWdzIHw9IFB5X1RQRkxBR1NfSEFWRV9HQzsKIAotCS8qIEl0J3MgYSBuZXctc3R5bGUgbnVtYmVyIHVubGVzcyBpdCBzcGVjaWZpY2FsbHkgaW5oZXJpdHMgYW55Ci0JICAgb2xkLXN0eWxlIG51bWVyaWMgYmVoYXZpb3IgKi8KLQlpZiAoKGJhc2UtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19DSEVDS1RZUEVTKSB8fAotCSAgICAoYmFzZS0+dHBfYXNfbnVtYmVyID09IE5VTEwpKQotCQl0eXBlLT50cF9mbGFncyB8PSBQeV9UUEZMQUdTX0NIRUNLVFlQRVM7CisgICAgLyogSXQncyBhIG5ldy1zdHlsZSBudW1iZXIgdW5sZXNzIGl0IHNwZWNpZmljYWxseSBpbmhlcml0cyBhbnkKKyAgICAgICBvbGQtc3R5bGUgbnVtZXJpYyBiZWhhdmlvciAqLworICAgIGlmICgoYmFzZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0NIRUNLVFlQRVMpIHx8CisgICAgICAgIChiYXNlLT50cF9hc19udW1iZXIgPT0gTlVMTCkpCisgICAgICAgIHR5cGUtPnRwX2ZsYWdzIHw9IFB5X1RQRkxBR1NfQ0hFQ0tUWVBFUzsKIAotCS8qIEluaXRpYWxpemUgZXNzZW50aWFsIGZpZWxkcyAqLwotCXR5cGUtPnRwX2FzX251bWJlciA9ICZldC0+YXNfbnVtYmVyOwotCXR5cGUtPnRwX2FzX3NlcXVlbmNlID0gJmV0LT5hc19zZXF1ZW5jZTsKLQl0eXBlLT50cF9hc19tYXBwaW5nID0gJmV0LT5hc19tYXBwaW5nOwotCXR5cGUtPnRwX2FzX2J1ZmZlciA9ICZldC0+YXNfYnVmZmVyOwotCXR5cGUtPnRwX25hbWUgPSBQeVN0cmluZ19BU19TVFJJTkcobmFtZSk7CisgICAgLyogSW5pdGlhbGl6ZSBlc3NlbnRpYWwgZmllbGRzICovCisgICAgdHlwZS0+dHBfYXNfbnVtYmVyID0gJmV0LT5hc19udW1iZXI7CisgICAgdHlwZS0+dHBfYXNfc2VxdWVuY2UgPSAmZXQtPmFzX3NlcXVlbmNlOworICAgIHR5cGUtPnRwX2FzX21hcHBpbmcgPSAmZXQtPmFzX21hcHBpbmc7CisgICAgdHlwZS0+dHBfYXNfYnVmZmVyID0gJmV0LT5hc19idWZmZXI7CisgICAgdHlwZS0+dHBfbmFtZSA9IFB5U3RyaW5nX0FTX1NUUklORyhuYW1lKTsKIAotCS8qIFNldCB0cF9iYXNlIGFuZCB0cF9iYXNlcyAqLwotCXR5cGUtPnRwX2Jhc2VzID0gYmFzZXM7Ci0JUHlfSU5DUkVGKGJhc2UpOwotCXR5cGUtPnRwX2Jhc2UgPSBiYXNlOworICAgIC8qIFNldCB0cF9iYXNlIGFuZCB0cF9iYXNlcyAqLworICAgIHR5cGUtPnRwX2Jhc2VzID0gYmFzZXM7CisgICAgUHlfSU5DUkVGKGJhc2UpOworICAgIHR5cGUtPnRwX2Jhc2UgPSBiYXNlOwogCi0JLyogSW5pdGlhbGl6ZSB0cF9kaWN0IGZyb20gcGFzc2VkLWluIGRpY3QgKi8KLQl0eXBlLT50cF9kaWN0ID0gZGljdCA9IFB5RGljdF9Db3B5KGRpY3QpOwotCWlmIChkaWN0ID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKHR5cGUpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgLyogSW5pdGlhbGl6ZSB0cF9kaWN0IGZyb20gcGFzc2VkLWluIGRpY3QgKi8KKyAgICB0eXBlLT50cF9kaWN0ID0gZGljdCA9IFB5RGljdF9Db3B5KGRpY3QpOworICAgIGlmIChkaWN0ID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKHR5cGUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQkvKiBTZXQgX19tb2R1bGVfXyBpbiB0aGUgZGljdCAqLwotCWlmIChQeURpY3RfR2V0SXRlbVN0cmluZyhkaWN0LCAiX19tb2R1bGVfXyIpID09IE5VTEwpIHsKLQkJdG1wID0gUHlFdmFsX0dldEdsb2JhbHMoKTsKLQkJaWYgKHRtcCAhPSBOVUxMKSB7Ci0JCQl0bXAgPSBQeURpY3RfR2V0SXRlbVN0cmluZyh0bXAsICJfX25hbWVfXyIpOwotCQkJaWYgKHRtcCAhPSBOVUxMKSB7Ci0JCQkJaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsICJfX21vZHVsZV9fIiwKLQkJCQkJCQkgdG1wKSA8IDApCi0JCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQl9Ci0JfQorICAgIC8qIFNldCBfX21vZHVsZV9fIGluIHRoZSBkaWN0ICovCisgICAgaWYgKFB5RGljdF9HZXRJdGVtU3RyaW5nKGRpY3QsICJfX21vZHVsZV9fIikgPT0gTlVMTCkgeworICAgICAgICB0bXAgPSBQeUV2YWxfR2V0R2xvYmFscygpOworICAgICAgICBpZiAodG1wICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHRtcCA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKHRtcCwgIl9fbmFtZV9fIik7CisgICAgICAgICAgICBpZiAodG1wICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgIl9fbW9kdWxlX18iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXApIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAKLQkvKiBTZXQgdHBfZG9jIHRvIGEgY29weSBvZiBkaWN0WydfX2RvY19fJ10sIGlmIHRoZSBsYXR0ZXIgaXMgdGhlcmUKLQkgICBhbmQgaXMgYSBzdHJpbmcuICBUaGUgX19kb2NfXyBhY2Nlc3NvciB3aWxsIGZpcnN0IGxvb2sgZm9yIHRwX2RvYzsKLQkgICBpZiB0aGF0IGZhaWxzLCBpdCB3aWxsIHN0aWxsIGxvb2sgaW50byBfX2RpY3RfXy4KLQkqLwotCXsKLQkJUHlPYmplY3QgKmRvYyA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKGRpY3QsICJfX2RvY19fIik7Ci0JCWlmIChkb2MgIT0gTlVMTCAmJiBQeVN0cmluZ19DaGVjayhkb2MpKSB7Ci0JCQljb25zdCBzaXplX3QgbiA9IChzaXplX3QpUHlTdHJpbmdfR0VUX1NJWkUoZG9jKTsKLQkJCWNoYXIgKnRwX2RvYyA9IChjaGFyICopUHlPYmplY3RfTUFMTE9DKG4rMSk7Ci0JCQlpZiAodHBfZG9jID09IE5VTEwpIHsKLQkJCQlQeV9ERUNSRUYodHlwZSk7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCQltZW1jcHkodHBfZG9jLCBQeVN0cmluZ19BU19TVFJJTkcoZG9jKSwgbisxKTsKLQkJCXR5cGUtPnRwX2RvYyA9IHRwX2RvYzsKLQkJfQotCX0KKyAgICAvKiBTZXQgdHBfZG9jIHRvIGEgY29weSBvZiBkaWN0WydfX2RvY19fJ10sIGlmIHRoZSBsYXR0ZXIgaXMgdGhlcmUKKyAgICAgICBhbmQgaXMgYSBzdHJpbmcuICBUaGUgX19kb2NfXyBhY2Nlc3NvciB3aWxsIGZpcnN0IGxvb2sgZm9yIHRwX2RvYzsKKyAgICAgICBpZiB0aGF0IGZhaWxzLCBpdCB3aWxsIHN0aWxsIGxvb2sgaW50byBfX2RpY3RfXy4KKyAgICAqLworICAgIHsKKyAgICAgICAgUHlPYmplY3QgKmRvYyA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKGRpY3QsICJfX2RvY19fIik7CisgICAgICAgIGlmIChkb2MgIT0gTlVMTCAmJiBQeVN0cmluZ19DaGVjayhkb2MpKSB7CisgICAgICAgICAgICBjb25zdCBzaXplX3QgbiA9IChzaXplX3QpUHlTdHJpbmdfR0VUX1NJWkUoZG9jKTsKKyAgICAgICAgICAgIGNoYXIgKnRwX2RvYyA9IChjaGFyICopUHlPYmplY3RfTUFMTE9DKG4rMSk7CisgICAgICAgICAgICBpZiAodHBfZG9jID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYodHlwZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtZW1jcHkodHBfZG9jLCBQeVN0cmluZ19BU19TVFJJTkcoZG9jKSwgbisxKTsKKyAgICAgICAgICAgIHR5cGUtPnRwX2RvYyA9IHRwX2RvYzsKKyAgICAgICAgfQorICAgIH0KIAotCS8qIFNwZWNpYWwtY2FzZSBfX25ld19fOiBpZiBpdCdzIGEgcGxhaW4gZnVuY3Rpb24sCi0JICAgbWFrZSBpdCBhIHN0YXRpYyBmdW5jdGlvbiAqLwotCXRtcCA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKGRpY3QsICJfX25ld19fIik7Ci0JaWYgKHRtcCAhPSBOVUxMICYmIFB5RnVuY3Rpb25fQ2hlY2sodG1wKSkgewotCQl0bXAgPSBQeVN0YXRpY01ldGhvZF9OZXcodG1wKTsKLQkJaWYgKHRtcCA9PSBOVUxMKSB7Ci0JCQlQeV9ERUNSRUYodHlwZSk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCAiX19uZXdfXyIsIHRtcCk7Ci0JCVB5X0RFQ1JFRih0bXApOwotCX0KKyAgICAvKiBTcGVjaWFsLWNhc2UgX19uZXdfXzogaWYgaXQncyBhIHBsYWluIGZ1bmN0aW9uLAorICAgICAgIG1ha2UgaXQgYSBzdGF0aWMgZnVuY3Rpb24gKi8KKyAgICB0bXAgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhkaWN0LCAiX19uZXdfXyIpOworICAgIGlmICh0bXAgIT0gTlVMTCAmJiBQeUZ1bmN0aW9uX0NoZWNrKHRtcCkpIHsKKyAgICAgICAgdG1wID0gUHlTdGF0aWNNZXRob2RfTmV3KHRtcCk7CisgICAgICAgIGlmICh0bXAgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKHR5cGUpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgIl9fbmV3X18iLCB0bXApOworICAgICAgICBQeV9ERUNSRUYodG1wKTsKKyAgICB9CiAKLQkvKiBBZGQgZGVzY3JpcHRvcnMgZm9yIGN1c3RvbSBzbG90cyBmcm9tIF9fc2xvdHNfXywgb3IgZm9yIF9fZGljdF9fICovCi0JbXAgPSBQeUhlYXBUeXBlX0dFVF9NRU1CRVJTKGV0KTsKLQlzbG90b2Zmc2V0ID0gYmFzZS0+dHBfYmFzaWNzaXplOwotCWlmIChzbG90cyAhPSBOVUxMKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBuc2xvdHM7IGkrKywgbXArKykgewotCQkJbXAtPm5hbWUgPSBQeVN0cmluZ19BU19TVFJJTkcoCi0JCQkJUHlUdXBsZV9HRVRfSVRFTShzbG90cywgaSkpOwotCQkJbXAtPnR5cGUgPSBUX09CSkVDVF9FWDsKLQkJCW1wLT5vZmZzZXQgPSBzbG90b2Zmc2V0OworICAgIC8qIEFkZCBkZXNjcmlwdG9ycyBmb3IgY3VzdG9tIHNsb3RzIGZyb20gX19zbG90c19fLCBvciBmb3IgX19kaWN0X18gKi8KKyAgICBtcCA9IFB5SGVhcFR5cGVfR0VUX01FTUJFUlMoZXQpOworICAgIHNsb3RvZmZzZXQgPSBiYXNlLT50cF9iYXNpY3NpemU7CisgICAgaWYgKHNsb3RzICE9IE5VTEwpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG5zbG90czsgaSsrLCBtcCsrKSB7CisgICAgICAgICAgICBtcC0+bmFtZSA9IFB5U3RyaW5nX0FTX1NUUklORygKKyAgICAgICAgICAgICAgICBQeVR1cGxlX0dFVF9JVEVNKHNsb3RzLCBpKSk7CisgICAgICAgICAgICBtcC0+dHlwZSA9IFRfT0JKRUNUX0VYOworICAgICAgICAgICAgbXAtPm9mZnNldCA9IHNsb3RvZmZzZXQ7CiAKLQkJCS8qIF9fZGljdF9fIGFuZCBfX3dlYWtyZWZfXyBhcmUgYWxyZWFkeSBmaWx0ZXJlZCBvdXQgKi8KLQkJCWFzc2VydChzdHJjbXAobXAtPm5hbWUsICJfX2RpY3RfXyIpICE9IDApOwotCQkJYXNzZXJ0KHN0cmNtcChtcC0+bmFtZSwgIl9fd2Vha3JlZl9fIikgIT0gMCk7CisgICAgICAgICAgICAvKiBfX2RpY3RfXyBhbmQgX193ZWFrcmVmX18gYXJlIGFscmVhZHkgZmlsdGVyZWQgb3V0ICovCisgICAgICAgICAgICBhc3NlcnQoc3RyY21wKG1wLT5uYW1lLCAiX19kaWN0X18iKSAhPSAwKTsKKyAgICAgICAgICAgIGFzc2VydChzdHJjbXAobXAtPm5hbWUsICJfX3dlYWtyZWZfXyIpICE9IDApOwogCi0JCQlzbG90b2Zmc2V0ICs9IHNpemVvZihQeU9iamVjdCAqKTsKLQkJfQotCX0KLQlpZiAoYWRkX2RpY3QpIHsKLQkJaWYgKGJhc2UtPnRwX2l0ZW1zaXplKQotCQkJdHlwZS0+dHBfZGljdG9mZnNldCA9IC0obG9uZylzaXplb2YoUHlPYmplY3QgKik7Ci0JCWVsc2UKLQkJCXR5cGUtPnRwX2RpY3RvZmZzZXQgPSBzbG90b2Zmc2V0OwotCQlzbG90b2Zmc2V0ICs9IHNpemVvZihQeU9iamVjdCAqKTsKLQl9Ci0JaWYgKGFkZF93ZWFrKSB7Ci0JCWFzc2VydCghYmFzZS0+dHBfaXRlbXNpemUpOwotCQl0eXBlLT50cF93ZWFrbGlzdG9mZnNldCA9IHNsb3RvZmZzZXQ7Ci0JCXNsb3RvZmZzZXQgKz0gc2l6ZW9mKFB5T2JqZWN0ICopOwotCX0KLQl0eXBlLT50cF9iYXNpY3NpemUgPSBzbG90b2Zmc2V0OwotCXR5cGUtPnRwX2l0ZW1zaXplID0gYmFzZS0+dHBfaXRlbXNpemU7Ci0JdHlwZS0+dHBfbWVtYmVycyA9IFB5SGVhcFR5cGVfR0VUX01FTUJFUlMoZXQpOworICAgICAgICAgICAgc2xvdG9mZnNldCArPSBzaXplb2YoUHlPYmplY3QgKik7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGFkZF9kaWN0KSB7CisgICAgICAgIGlmIChiYXNlLT50cF9pdGVtc2l6ZSkKKyAgICAgICAgICAgIHR5cGUtPnRwX2RpY3RvZmZzZXQgPSAtKGxvbmcpc2l6ZW9mKFB5T2JqZWN0ICopOworICAgICAgICBlbHNlCisgICAgICAgICAgICB0eXBlLT50cF9kaWN0b2Zmc2V0ID0gc2xvdG9mZnNldDsKKyAgICAgICAgc2xvdG9mZnNldCArPSBzaXplb2YoUHlPYmplY3QgKik7CisgICAgfQorICAgIGlmIChhZGRfd2VhaykgeworICAgICAgICBhc3NlcnQoIWJhc2UtPnRwX2l0ZW1zaXplKTsKKyAgICAgICAgdHlwZS0+dHBfd2Vha2xpc3RvZmZzZXQgPSBzbG90b2Zmc2V0OworICAgICAgICBzbG90b2Zmc2V0ICs9IHNpemVvZihQeU9iamVjdCAqKTsKKyAgICB9CisgICAgdHlwZS0+dHBfYmFzaWNzaXplID0gc2xvdG9mZnNldDsKKyAgICB0eXBlLT50cF9pdGVtc2l6ZSA9IGJhc2UtPnRwX2l0ZW1zaXplOworICAgIHR5cGUtPnRwX21lbWJlcnMgPSBQeUhlYXBUeXBlX0dFVF9NRU1CRVJTKGV0KTsKIAotCWlmICh0eXBlLT50cF93ZWFrbGlzdG9mZnNldCAmJiB0eXBlLT50cF9kaWN0b2Zmc2V0KQotCQl0eXBlLT50cF9nZXRzZXQgPSBzdWJ0eXBlX2dldHNldHNfZnVsbDsKLQllbHNlIGlmICh0eXBlLT50cF93ZWFrbGlzdG9mZnNldCAmJiAhdHlwZS0+dHBfZGljdG9mZnNldCkKLQkJdHlwZS0+dHBfZ2V0c2V0ID0gc3VidHlwZV9nZXRzZXRzX3dlYWtyZWZfb25seTsKLQllbHNlIGlmICghdHlwZS0+dHBfd2Vha2xpc3RvZmZzZXQgJiYgdHlwZS0+dHBfZGljdG9mZnNldCkKLQkJdHlwZS0+dHBfZ2V0c2V0ID0gc3VidHlwZV9nZXRzZXRzX2RpY3Rfb25seTsKLQllbHNlCi0JCXR5cGUtPnRwX2dldHNldCA9IE5VTEw7CisgICAgaWYgKHR5cGUtPnRwX3dlYWtsaXN0b2Zmc2V0ICYmIHR5cGUtPnRwX2RpY3RvZmZzZXQpCisgICAgICAgIHR5cGUtPnRwX2dldHNldCA9IHN1YnR5cGVfZ2V0c2V0c19mdWxsOworICAgIGVsc2UgaWYgKHR5cGUtPnRwX3dlYWtsaXN0b2Zmc2V0ICYmICF0eXBlLT50cF9kaWN0b2Zmc2V0KQorICAgICAgICB0eXBlLT50cF9nZXRzZXQgPSBzdWJ0eXBlX2dldHNldHNfd2Vha3JlZl9vbmx5OworICAgIGVsc2UgaWYgKCF0eXBlLT50cF93ZWFrbGlzdG9mZnNldCAmJiB0eXBlLT50cF9kaWN0b2Zmc2V0KQorICAgICAgICB0eXBlLT50cF9nZXRzZXQgPSBzdWJ0eXBlX2dldHNldHNfZGljdF9vbmx5OworICAgIGVsc2UKKyAgICAgICAgdHlwZS0+dHBfZ2V0c2V0ID0gTlVMTDsKIAotCS8qIFNwZWNpYWwgY2FzZSBzb21lIHNsb3RzICovCi0JaWYgKHR5cGUtPnRwX2RpY3RvZmZzZXQgIT0gMCB8fCBuc2xvdHMgPiAwKSB7Ci0JCWlmIChiYXNlLT50cF9nZXRhdHRyID09IE5VTEwgJiYgYmFzZS0+dHBfZ2V0YXR0cm8gPT0gTlVMTCkKLQkJCXR5cGUtPnRwX2dldGF0dHJvID0gUHlPYmplY3RfR2VuZXJpY0dldEF0dHI7Ci0JCWlmIChiYXNlLT50cF9zZXRhdHRyID09IE5VTEwgJiYgYmFzZS0+dHBfc2V0YXR0cm8gPT0gTlVMTCkKLQkJCXR5cGUtPnRwX3NldGF0dHJvID0gUHlPYmplY3RfR2VuZXJpY1NldEF0dHI7Ci0JfQotCXR5cGUtPnRwX2RlYWxsb2MgPSBzdWJ0eXBlX2RlYWxsb2M7CisgICAgLyogU3BlY2lhbCBjYXNlIHNvbWUgc2xvdHMgKi8KKyAgICBpZiAodHlwZS0+dHBfZGljdG9mZnNldCAhPSAwIHx8IG5zbG90cyA+IDApIHsKKyAgICAgICAgaWYgKGJhc2UtPnRwX2dldGF0dHIgPT0gTlVMTCAmJiBiYXNlLT50cF9nZXRhdHRybyA9PSBOVUxMKQorICAgICAgICAgICAgdHlwZS0+dHBfZ2V0YXR0cm8gPSBQeU9iamVjdF9HZW5lcmljR2V0QXR0cjsKKyAgICAgICAgaWYgKGJhc2UtPnRwX3NldGF0dHIgPT0gTlVMTCAmJiBiYXNlLT50cF9zZXRhdHRybyA9PSBOVUxMKQorICAgICAgICAgICAgdHlwZS0+dHBfc2V0YXR0cm8gPSBQeU9iamVjdF9HZW5lcmljU2V0QXR0cjsKKyAgICB9CisgICAgdHlwZS0+dHBfZGVhbGxvYyA9IHN1YnR5cGVfZGVhbGxvYzsKIAotCS8qIEVuYWJsZSBHQyB1bmxlc3MgdGhlcmUgYXJlIHJlYWxseSBubyBpbnN0YW5jZSB2YXJpYWJsZXMgcG9zc2libGUgKi8KLQlpZiAoISh0eXBlLT50cF9iYXNpY3NpemUgPT0gc2l6ZW9mKFB5T2JqZWN0KSAmJgotCSAgICAgIHR5cGUtPnRwX2l0ZW1zaXplID09IDApKQotCQl0eXBlLT50cF9mbGFncyB8PSBQeV9UUEZMQUdTX0hBVkVfR0M7CisgICAgLyogRW5hYmxlIEdDIHVubGVzcyB0aGVyZSBhcmUgcmVhbGx5IG5vIGluc3RhbmNlIHZhcmlhYmxlcyBwb3NzaWJsZSAqLworICAgIGlmICghKHR5cGUtPnRwX2Jhc2ljc2l6ZSA9PSBzaXplb2YoUHlPYmplY3QpICYmCisgICAgICAgICAgdHlwZS0+dHBfaXRlbXNpemUgPT0gMCkpCisgICAgICAgIHR5cGUtPnRwX2ZsYWdzIHw9IFB5X1RQRkxBR1NfSEFWRV9HQzsKIAotCS8qIEFsd2F5cyBvdmVycmlkZSBhbGxvY2F0aW9uIHN0cmF0ZWd5IHRvIHVzZSByZWd1bGFyIGhlYXAgKi8KLQl0eXBlLT50cF9hbGxvYyA9IFB5VHlwZV9HZW5lcmljQWxsb2M7Ci0JaWYgKHR5cGUtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IQVZFX0dDKSB7Ci0JCXR5cGUtPnRwX2ZyZWUgPSBQeU9iamVjdF9HQ19EZWw7Ci0JCXR5cGUtPnRwX3RyYXZlcnNlID0gc3VidHlwZV90cmF2ZXJzZTsKLQkJdHlwZS0+dHBfY2xlYXIgPSBzdWJ0eXBlX2NsZWFyOwotCX0KLQllbHNlCi0JCXR5cGUtPnRwX2ZyZWUgPSBQeU9iamVjdF9EZWw7CisgICAgLyogQWx3YXlzIG92ZXJyaWRlIGFsbG9jYXRpb24gc3RyYXRlZ3kgdG8gdXNlIHJlZ3VsYXIgaGVhcCAqLworICAgIHR5cGUtPnRwX2FsbG9jID0gUHlUeXBlX0dlbmVyaWNBbGxvYzsKKyAgICBpZiAodHlwZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hBVkVfR0MpIHsKKyAgICAgICAgdHlwZS0+dHBfZnJlZSA9IFB5T2JqZWN0X0dDX0RlbDsKKyAgICAgICAgdHlwZS0+dHBfdHJhdmVyc2UgPSBzdWJ0eXBlX3RyYXZlcnNlOworICAgICAgICB0eXBlLT50cF9jbGVhciA9IHN1YnR5cGVfY2xlYXI7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgdHlwZS0+dHBfZnJlZSA9IFB5T2JqZWN0X0RlbDsKIAotCS8qIEluaXRpYWxpemUgdGhlIHJlc3QgKi8KLQlpZiAoUHlUeXBlX1JlYWR5KHR5cGUpIDwgMCkgewotCQlQeV9ERUNSRUYodHlwZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICAvKiBJbml0aWFsaXplIHRoZSByZXN0ICovCisgICAgaWYgKFB5VHlwZV9SZWFkeSh0eXBlKSA8IDApIHsKKyAgICAgICAgUHlfREVDUkVGKHR5cGUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQkvKiBQdXQgdGhlIHByb3BlciBzbG90cyBpbiBwbGFjZSAqLwotCWZpeHVwX3Nsb3RfZGlzcGF0Y2hlcnModHlwZSk7CisgICAgLyogUHV0IHRoZSBwcm9wZXIgc2xvdHMgaW4gcGxhY2UgKi8KKyAgICBmaXh1cF9zbG90X2Rpc3BhdGNoZXJzKHR5cGUpOwogCi0JcmV0dXJuIChQeU9iamVjdCAqKXR5cGU7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKXR5cGU7CiB9CiAKIC8qIEludGVybmFsIEFQSSB0byBsb29rIGZvciBhIG5hbWUgdGhyb3VnaCB0aGUgTVJPLgpAQCAtMjQ1OCw1NCArMjQ1OCw1NCBAQAogUHlPYmplY3QgKgogX1B5VHlwZV9Mb29rdXAoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqbmFtZSkKIHsKLQlQeV9zc2l6ZV90IGksIG47Ci0JUHlPYmplY3QgKm1ybywgKnJlcywgKmJhc2UsICpkaWN0OwotCXVuc2lnbmVkIGludCBoOworICAgIFB5X3NzaXplX3QgaSwgbjsKKyAgICBQeU9iamVjdCAqbXJvLCAqcmVzLCAqYmFzZSwgKmRpY3Q7CisgICAgdW5zaWduZWQgaW50IGg7CiAKLQlpZiAoTUNBQ0hFX0NBQ0hFQUJMRV9OQU1FKG5hbWUpICYmCi0JICAgIFB5VHlwZV9IYXNGZWF0dXJlKHR5cGUsIFB5X1RQRkxBR1NfVkFMSURfVkVSU0lPTl9UQUcpKSB7Ci0JCS8qIGZhc3QgcGF0aCAqLwotCQloID0gTUNBQ0hFX0hBU0hfTUVUSE9EKHR5cGUsIG5hbWUpOwotCQlpZiAobWV0aG9kX2NhY2hlW2hdLnZlcnNpb24gPT0gdHlwZS0+dHBfdmVyc2lvbl90YWcgJiYKLQkJICAgIG1ldGhvZF9jYWNoZVtoXS5uYW1lID09IG5hbWUpCi0JCSAgICByZXR1cm4gbWV0aG9kX2NhY2hlW2hdLnZhbHVlOwotCX0KKyAgICBpZiAoTUNBQ0hFX0NBQ0hFQUJMRV9OQU1FKG5hbWUpICYmCisgICAgICAgIFB5VHlwZV9IYXNGZWF0dXJlKHR5cGUsIFB5X1RQRkxBR1NfVkFMSURfVkVSU0lPTl9UQUcpKSB7CisgICAgICAgIC8qIGZhc3QgcGF0aCAqLworICAgICAgICBoID0gTUNBQ0hFX0hBU0hfTUVUSE9EKHR5cGUsIG5hbWUpOworICAgICAgICBpZiAobWV0aG9kX2NhY2hlW2hdLnZlcnNpb24gPT0gdHlwZS0+dHBfdmVyc2lvbl90YWcgJiYKKyAgICAgICAgICAgIG1ldGhvZF9jYWNoZVtoXS5uYW1lID09IG5hbWUpCisgICAgICAgICAgICByZXR1cm4gbWV0aG9kX2NhY2hlW2hdLnZhbHVlOworICAgIH0KIAotCS8qIExvb2sgaW4gdHBfZGljdCBvZiB0eXBlcyBpbiBNUk8gKi8KLQltcm8gPSB0eXBlLT50cF9tcm87CisgICAgLyogTG9vayBpbiB0cF9kaWN0IG9mIHR5cGVzIGluIE1STyAqLworICAgIG1ybyA9IHR5cGUtPnRwX21ybzsKIAotCS8qIElmIG1ybyBpcyBOVUxMLCB0aGUgdHlwZSBpcyBlaXRoZXIgbm90IHlldCBpbml0aWFsaXplZAotCSAgIGJ5IFB5VHlwZV9SZWFkeSgpLCBvciBhbHJlYWR5IGNsZWFyZWQgYnkgdHlwZV9jbGVhcigpLgotCSAgIEVpdGhlciB3YXkgdGhlIHNhZmVzdCB0aGluZyB0byBkbyBpcyB0byByZXR1cm4gTlVMTC4gKi8KLQlpZiAobXJvID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIC8qIElmIG1ybyBpcyBOVUxMLCB0aGUgdHlwZSBpcyBlaXRoZXIgbm90IHlldCBpbml0aWFsaXplZAorICAgICAgIGJ5IFB5VHlwZV9SZWFkeSgpLCBvciBhbHJlYWR5IGNsZWFyZWQgYnkgdHlwZV9jbGVhcigpLgorICAgICAgIEVpdGhlciB3YXkgdGhlIHNhZmVzdCB0aGluZyB0byBkbyBpcyB0byByZXR1cm4gTlVMTC4gKi8KKyAgICBpZiAobXJvID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JcmVzID0gTlVMTDsKLQlhc3NlcnQoUHlUdXBsZV9DaGVjayhtcm8pKTsKLQluID0gUHlUdXBsZV9HRVRfU0laRShtcm8pOwotCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJYmFzZSA9IFB5VHVwbGVfR0VUX0lURU0obXJvLCBpKTsKLQkJaWYgKFB5Q2xhc3NfQ2hlY2soYmFzZSkpCi0JCQlkaWN0ID0gKChQeUNsYXNzT2JqZWN0ICopYmFzZSktPmNsX2RpY3Q7Ci0JCWVsc2UgewotCQkJYXNzZXJ0KFB5VHlwZV9DaGVjayhiYXNlKSk7Ci0JCQlkaWN0ID0gKChQeVR5cGVPYmplY3QgKiliYXNlKS0+dHBfZGljdDsKLQkJfQotCQlhc3NlcnQoZGljdCAmJiBQeURpY3RfQ2hlY2soZGljdCkpOwotCQlyZXMgPSBQeURpY3RfR2V0SXRlbShkaWN0LCBuYW1lKTsKLQkJaWYgKHJlcyAhPSBOVUxMKQotCQkJYnJlYWs7Ci0JfQorICAgIHJlcyA9IE5VTEw7CisgICAgYXNzZXJ0KFB5VHVwbGVfQ2hlY2sobXJvKSk7CisgICAgbiA9IFB5VHVwbGVfR0VUX1NJWkUobXJvKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIGJhc2UgPSBQeVR1cGxlX0dFVF9JVEVNKG1ybywgaSk7CisgICAgICAgIGlmIChQeUNsYXNzX0NoZWNrKGJhc2UpKQorICAgICAgICAgICAgZGljdCA9ICgoUHlDbGFzc09iamVjdCAqKWJhc2UpLT5jbF9kaWN0OworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGFzc2VydChQeVR5cGVfQ2hlY2soYmFzZSkpOworICAgICAgICAgICAgZGljdCA9ICgoUHlUeXBlT2JqZWN0ICopYmFzZSktPnRwX2RpY3Q7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0KGRpY3QgJiYgUHlEaWN0X0NoZWNrKGRpY3QpKTsKKyAgICAgICAgcmVzID0gUHlEaWN0X0dldEl0ZW0oZGljdCwgbmFtZSk7CisgICAgICAgIGlmIChyZXMgIT0gTlVMTCkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KIAotCWlmIChNQ0FDSEVfQ0FDSEVBQkxFX05BTUUobmFtZSkgJiYgYXNzaWduX3ZlcnNpb25fdGFnKHR5cGUpKSB7Ci0JCWggPSBNQ0FDSEVfSEFTSF9NRVRIT0QodHlwZSwgbmFtZSk7Ci0JCW1ldGhvZF9jYWNoZVtoXS52ZXJzaW9uID0gdHlwZS0+dHBfdmVyc2lvbl90YWc7Ci0JCW1ldGhvZF9jYWNoZVtoXS52YWx1ZSA9IHJlczsgIC8qIGJvcnJvd2VkICovCi0JCVB5X0lOQ1JFRihuYW1lKTsKLQkJUHlfREVDUkVGKG1ldGhvZF9jYWNoZVtoXS5uYW1lKTsKLQkJbWV0aG9kX2NhY2hlW2hdLm5hbWUgPSBuYW1lOwotCX0KLQlyZXR1cm4gcmVzOworICAgIGlmIChNQ0FDSEVfQ0FDSEVBQkxFX05BTUUobmFtZSkgJiYgYXNzaWduX3ZlcnNpb25fdGFnKHR5cGUpKSB7CisgICAgICAgIGggPSBNQ0FDSEVfSEFTSF9NRVRIT0QodHlwZSwgbmFtZSk7CisgICAgICAgIG1ldGhvZF9jYWNoZVtoXS52ZXJzaW9uID0gdHlwZS0+dHBfdmVyc2lvbl90YWc7CisgICAgICAgIG1ldGhvZF9jYWNoZVtoXS52YWx1ZSA9IHJlczsgIC8qIGJvcnJvd2VkICovCisgICAgICAgIFB5X0lOQ1JFRihuYW1lKTsKKyAgICAgICAgUHlfREVDUkVGKG1ldGhvZF9jYWNoZVtoXS5uYW1lKTsKKyAgICAgICAgbWV0aG9kX2NhY2hlW2hdLm5hbWUgPSBuYW1lOworICAgIH0KKyAgICByZXR1cm4gcmVzOwogfQogCiAvKiBUaGlzIGlzIHNpbWlsYXIgdG8gUHlPYmplY3RfR2VuZXJpY0dldEF0dHIoKSwKQEAgLTI1MTMsMTUyICsyNTEzLDE1MiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHR5cGVfZ2V0YXR0cm8oUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqbmFtZSkKIHsKLQlQeVR5cGVPYmplY3QgKm1ldGF0eXBlID0gUHlfVFlQRSh0eXBlKTsKLQlQeU9iamVjdCAqbWV0YV9hdHRyaWJ1dGUsICphdHRyaWJ1dGU7Ci0JZGVzY3JnZXRmdW5jIG1ldGFfZ2V0OworICAgIFB5VHlwZU9iamVjdCAqbWV0YXR5cGUgPSBQeV9UWVBFKHR5cGUpOworICAgIFB5T2JqZWN0ICptZXRhX2F0dHJpYnV0ZSwgKmF0dHJpYnV0ZTsKKyAgICBkZXNjcmdldGZ1bmMgbWV0YV9nZXQ7CiAKLQkvKiBJbml0aWFsaXplIHRoaXMgdHlwZSAod2UnbGwgYXNzdW1lIHRoZSBtZXRhdHlwZSBpcyBpbml0aWFsaXplZCkgKi8KLQlpZiAodHlwZS0+dHBfZGljdCA9PSBOVUxMKSB7Ci0JCWlmIChQeVR5cGVfUmVhZHkodHlwZSkgPCAwKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIC8qIEluaXRpYWxpemUgdGhpcyB0eXBlICh3ZSdsbCBhc3N1bWUgdGhlIG1ldGF0eXBlIGlzIGluaXRpYWxpemVkKSAqLworICAgIGlmICh0eXBlLT50cF9kaWN0ID09IE5VTEwpIHsKKyAgICAgICAgaWYgKFB5VHlwZV9SZWFkeSh0eXBlKSA8IDApCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQkvKiBObyByZWFkYWJsZSBkZXNjcmlwdG9yIGZvdW5kIHlldCAqLwotCW1ldGFfZ2V0ID0gTlVMTDsKKyAgICAvKiBObyByZWFkYWJsZSBkZXNjcmlwdG9yIGZvdW5kIHlldCAqLworICAgIG1ldGFfZ2V0ID0gTlVMTDsKIAotCS8qIExvb2sgZm9yIHRoZSBhdHRyaWJ1dGUgaW4gdGhlIG1ldGF0eXBlICovCi0JbWV0YV9hdHRyaWJ1dGUgPSBfUHlUeXBlX0xvb2t1cChtZXRhdHlwZSwgbmFtZSk7CisgICAgLyogTG9vayBmb3IgdGhlIGF0dHJpYnV0ZSBpbiB0aGUgbWV0YXR5cGUgKi8KKyAgICBtZXRhX2F0dHJpYnV0ZSA9IF9QeVR5cGVfTG9va3VwKG1ldGF0eXBlLCBuYW1lKTsKIAotCWlmIChtZXRhX2F0dHJpYnV0ZSAhPSBOVUxMKSB7Ci0JCW1ldGFfZ2V0ID0gUHlfVFlQRShtZXRhX2F0dHJpYnV0ZSktPnRwX2Rlc2NyX2dldDsKKyAgICBpZiAobWV0YV9hdHRyaWJ1dGUgIT0gTlVMTCkgeworICAgICAgICBtZXRhX2dldCA9IFB5X1RZUEUobWV0YV9hdHRyaWJ1dGUpLT50cF9kZXNjcl9nZXQ7CiAKLQkJaWYgKG1ldGFfZ2V0ICE9IE5VTEwgJiYgUHlEZXNjcl9Jc0RhdGEobWV0YV9hdHRyaWJ1dGUpKSB7Ci0JCQkvKiBEYXRhIGRlc2NyaXB0b3JzIGltcGxlbWVudCB0cF9kZXNjcl9zZXQgdG8gaW50ZXJjZXB0Ci0JCQkgKiB3cml0ZXMuIEFzc3VtZSB0aGUgYXR0cmlidXRlIGlzIG5vdCBvdmVycmlkZGVuIGluCi0JCQkgKiB0eXBlJ3MgdHBfZGljdCAoYW5kIGJhc2VzKTogY2FsbCB0aGUgZGVzY3JpcHRvciBub3cuCi0JCQkgKi8KLQkJCXJldHVybiBtZXRhX2dldChtZXRhX2F0dHJpYnV0ZSwgKFB5T2JqZWN0ICopdHlwZSwKLQkJCQkJKFB5T2JqZWN0ICopbWV0YXR5cGUpOwotCQl9Ci0JCVB5X0lOQ1JFRihtZXRhX2F0dHJpYnV0ZSk7Ci0JfQorICAgICAgICBpZiAobWV0YV9nZXQgIT0gTlVMTCAmJiBQeURlc2NyX0lzRGF0YShtZXRhX2F0dHJpYnV0ZSkpIHsKKyAgICAgICAgICAgIC8qIERhdGEgZGVzY3JpcHRvcnMgaW1wbGVtZW50IHRwX2Rlc2NyX3NldCB0byBpbnRlcmNlcHQKKyAgICAgICAgICAgICAqIHdyaXRlcy4gQXNzdW1lIHRoZSBhdHRyaWJ1dGUgaXMgbm90IG92ZXJyaWRkZW4gaW4KKyAgICAgICAgICAgICAqIHR5cGUncyB0cF9kaWN0IChhbmQgYmFzZXMpOiBjYWxsIHRoZSBkZXNjcmlwdG9yIG5vdy4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcmV0dXJuIG1ldGFfZ2V0KG1ldGFfYXR0cmlidXRlLCAoUHlPYmplY3QgKil0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQeU9iamVjdCAqKW1ldGF0eXBlKTsKKyAgICAgICAgfQorICAgICAgICBQeV9JTkNSRUYobWV0YV9hdHRyaWJ1dGUpOworICAgIH0KIAotCS8qIE5vIGRhdGEgZGVzY3JpcHRvciBmb3VuZCBvbiBtZXRhdHlwZS4gTG9vayBpbiB0cF9kaWN0IG9mIHRoaXMKLQkgKiB0eXBlIGFuZCBpdHMgYmFzZXMgKi8KLQlhdHRyaWJ1dGUgPSBfUHlUeXBlX0xvb2t1cCh0eXBlLCBuYW1lKTsKLQlpZiAoYXR0cmlidXRlICE9IE5VTEwpIHsKLQkJLyogSW1wbGVtZW50IGRlc2NyaXB0b3IgZnVuY3Rpb25hbGl0eSwgaWYgYW55ICovCi0JCWRlc2NyZ2V0ZnVuYyBsb2NhbF9nZXQgPSBQeV9UWVBFKGF0dHJpYnV0ZSktPnRwX2Rlc2NyX2dldDsKKyAgICAvKiBObyBkYXRhIGRlc2NyaXB0b3IgZm91bmQgb24gbWV0YXR5cGUuIExvb2sgaW4gdHBfZGljdCBvZiB0aGlzCisgICAgICogdHlwZSBhbmQgaXRzIGJhc2VzICovCisgICAgYXR0cmlidXRlID0gX1B5VHlwZV9Mb29rdXAodHlwZSwgbmFtZSk7CisgICAgaWYgKGF0dHJpYnV0ZSAhPSBOVUxMKSB7CisgICAgICAgIC8qIEltcGxlbWVudCBkZXNjcmlwdG9yIGZ1bmN0aW9uYWxpdHksIGlmIGFueSAqLworICAgICAgICBkZXNjcmdldGZ1bmMgbG9jYWxfZ2V0ID0gUHlfVFlQRShhdHRyaWJ1dGUpLT50cF9kZXNjcl9nZXQ7CiAKLQkJUHlfWERFQ1JFRihtZXRhX2F0dHJpYnV0ZSk7CisgICAgICAgIFB5X1hERUNSRUYobWV0YV9hdHRyaWJ1dGUpOwogCi0JCWlmIChsb2NhbF9nZXQgIT0gTlVMTCkgewotCQkJLyogTlVMTCAybmQgYXJndW1lbnQgaW5kaWNhdGVzIHRoZSBkZXNjcmlwdG9yIHdhcwotCQkJICogZm91bmQgb24gdGhlIHRhcmdldCBvYmplY3QgaXRzZWxmIChvciBhIGJhc2UpICAqLwotCQkJcmV0dXJuIGxvY2FsX2dldChhdHRyaWJ1dGUsIChQeU9iamVjdCAqKU5VTEwsCi0JCQkJCSAoUHlPYmplY3QgKil0eXBlKTsKLQkJfQorICAgICAgICBpZiAobG9jYWxfZ2V0ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIC8qIE5VTEwgMm5kIGFyZ3VtZW50IGluZGljYXRlcyB0aGUgZGVzY3JpcHRvciB3YXMKKyAgICAgICAgICAgICAqIGZvdW5kIG9uIHRoZSB0YXJnZXQgb2JqZWN0IGl0c2VsZiAob3IgYSBiYXNlKSAgKi8KKyAgICAgICAgICAgIHJldHVybiBsb2NhbF9nZXQoYXR0cmlidXRlLCAoUHlPYmplY3QgKilOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUHlPYmplY3QgKil0eXBlKTsKKyAgICAgICAgfQogCi0JCVB5X0lOQ1JFRihhdHRyaWJ1dGUpOwotCQlyZXR1cm4gYXR0cmlidXRlOwotCX0KKyAgICAgICAgUHlfSU5DUkVGKGF0dHJpYnV0ZSk7CisgICAgICAgIHJldHVybiBhdHRyaWJ1dGU7CisgICAgfQogCi0JLyogTm8gYXR0cmlidXRlIGZvdW5kIGluIGxvY2FsIF9fZGljdF9fIChvciBiYXNlcyk6IHVzZSB0aGUKLQkgKiBkZXNjcmlwdG9yIGZyb20gdGhlIG1ldGF0eXBlLCBpZiBhbnkgKi8KLQlpZiAobWV0YV9nZXQgIT0gTlVMTCkgewotCQlQeU9iamVjdCAqcmVzOwotCQlyZXMgPSBtZXRhX2dldChtZXRhX2F0dHJpYnV0ZSwgKFB5T2JqZWN0ICopdHlwZSwKLQkJCSAgICAgICAoUHlPYmplY3QgKiltZXRhdHlwZSk7Ci0JCVB5X0RFQ1JFRihtZXRhX2F0dHJpYnV0ZSk7Ci0JCXJldHVybiByZXM7Ci0JfQorICAgIC8qIE5vIGF0dHJpYnV0ZSBmb3VuZCBpbiBsb2NhbCBfX2RpY3RfXyAob3IgYmFzZXMpOiB1c2UgdGhlCisgICAgICogZGVzY3JpcHRvciBmcm9tIHRoZSBtZXRhdHlwZSwgaWYgYW55ICovCisgICAgaWYgKG1ldGFfZ2V0ICE9IE5VTEwpIHsKKyAgICAgICAgUHlPYmplY3QgKnJlczsKKyAgICAgICAgcmVzID0gbWV0YV9nZXQobWV0YV9hdHRyaWJ1dGUsIChQeU9iamVjdCAqKXR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgIChQeU9iamVjdCAqKW1ldGF0eXBlKTsKKyAgICAgICAgUHlfREVDUkVGKG1ldGFfYXR0cmlidXRlKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CiAKLQkvKiBJZiBhbiBvcmRpbmFyeSBhdHRyaWJ1dGUgd2FzIGZvdW5kIG9uIHRoZSBtZXRhdHlwZSwgcmV0dXJuIGl0IG5vdyAqLwotCWlmIChtZXRhX2F0dHJpYnV0ZSAhPSBOVUxMKSB7Ci0JCXJldHVybiBtZXRhX2F0dHJpYnV0ZTsKLQl9CisgICAgLyogSWYgYW4gb3JkaW5hcnkgYXR0cmlidXRlIHdhcyBmb3VuZCBvbiB0aGUgbWV0YXR5cGUsIHJldHVybiBpdCBub3cgKi8KKyAgICBpZiAobWV0YV9hdHRyaWJ1dGUgIT0gTlVMTCkgeworICAgICAgICByZXR1cm4gbWV0YV9hdHRyaWJ1dGU7CisgICAgfQogCi0JLyogR2l2ZSB1cCAqLwotCVB5RXJyX0Zvcm1hdChQeUV4Y19BdHRyaWJ1dGVFcnJvciwKLQkJCSAidHlwZSBvYmplY3QgJyUuNTBzJyBoYXMgbm8gYXR0cmlidXRlICclLjQwMHMnIiwKLQkJCSB0eXBlLT50cF9uYW1lLCBQeVN0cmluZ19BU19TVFJJTkcobmFtZSkpOwotCXJldHVybiBOVUxMOworICAgIC8qIEdpdmUgdXAgKi8KKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfQXR0cmlidXRlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAidHlwZSBvYmplY3QgJyUuNTBzJyBoYXMgbm8gYXR0cmlidXRlICclLjQwMHMnIiwKKyAgICAgICAgICAgICAgICAgICAgIHR5cGUtPnRwX25hbWUsIFB5U3RyaW5nX0FTX1NUUklORyhuYW1lKSk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBpbnQKIHR5cGVfc2V0YXR0cm8oUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqbmFtZSwgUHlPYmplY3QgKnZhbHVlKQogewotCWlmICghKHR5cGUtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IRUFQVFlQRSkpIHsKLQkJUHlFcnJfRm9ybWF0KAotCQkJUHlFeGNfVHlwZUVycm9yLAotCQkJImNhbid0IHNldCBhdHRyaWJ1dGVzIG9mIGJ1aWx0LWluL2V4dGVuc2lvbiB0eXBlICclcyciLAotCQkJdHlwZS0+dHBfbmFtZSk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyKChQeU9iamVjdCAqKXR5cGUsIG5hbWUsIHZhbHVlKSA8IDApCi0JCXJldHVybiAtMTsKLQlyZXR1cm4gdXBkYXRlX3Nsb3QodHlwZSwgbmFtZSk7CisgICAgaWYgKCEodHlwZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hFQVBUWVBFKSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoCisgICAgICAgICAgICBQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAiY2FuJ3Qgc2V0IGF0dHJpYnV0ZXMgb2YgYnVpbHQtaW4vZXh0ZW5zaW9uIHR5cGUgJyVzJyIsCisgICAgICAgICAgICB0eXBlLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoUHlPYmplY3RfR2VuZXJpY1NldEF0dHIoKFB5T2JqZWN0ICopdHlwZSwgbmFtZSwgdmFsdWUpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHJldHVybiB1cGRhdGVfc2xvdCh0eXBlLCBuYW1lKTsKIH0KIAogc3RhdGljIHZvaWQKIHR5cGVfZGVhbGxvYyhQeVR5cGVPYmplY3QgKnR5cGUpCiB7Ci0JUHlIZWFwVHlwZU9iamVjdCAqZXQ7CisgICAgUHlIZWFwVHlwZU9iamVjdCAqZXQ7CiAKLQkvKiBBc3NlcnQgdGhpcyBpcyBhIGhlYXAtYWxsb2NhdGVkIHR5cGUgb2JqZWN0ICovCi0JYXNzZXJ0KHR5cGUtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IRUFQVFlQRSk7Ci0JX1B5T2JqZWN0X0dDX1VOVFJBQ0sodHlwZSk7Ci0JUHlPYmplY3RfQ2xlYXJXZWFrUmVmcygoUHlPYmplY3QgKil0eXBlKTsKLQlldCA9IChQeUhlYXBUeXBlT2JqZWN0ICopdHlwZTsKLQlQeV9YREVDUkVGKHR5cGUtPnRwX2Jhc2UpOwotCVB5X1hERUNSRUYodHlwZS0+dHBfZGljdCk7Ci0JUHlfWERFQ1JFRih0eXBlLT50cF9iYXNlcyk7Ci0JUHlfWERFQ1JFRih0eXBlLT50cF9tcm8pOwotCVB5X1hERUNSRUYodHlwZS0+dHBfY2FjaGUpOwotCVB5X1hERUNSRUYodHlwZS0+dHBfc3ViY2xhc3Nlcyk7Ci0JLyogQSB0eXBlJ3MgdHBfZG9jIGlzIGhlYXAgYWxsb2NhdGVkLCB1bmxpa2UgdGhlIHRwX2RvYyBzbG90cwotCSAqIG9mIG1vc3Qgb3RoZXIgb2JqZWN0cy4gIEl0J3Mgb2theSB0byBjYXN0IGl0IHRvIGNoYXIgKi4KLQkgKi8KLQlQeU9iamVjdF9GcmVlKChjaGFyICopdHlwZS0+dHBfZG9jKTsKLQlQeV9YREVDUkVGKGV0LT5odF9uYW1lKTsKLQlQeV9YREVDUkVGKGV0LT5odF9zbG90cyk7Ci0JUHlfVFlQRSh0eXBlKS0+dHBfZnJlZSgoUHlPYmplY3QgKil0eXBlKTsKKyAgICAvKiBBc3NlcnQgdGhpcyBpcyBhIGhlYXAtYWxsb2NhdGVkIHR5cGUgb2JqZWN0ICovCisgICAgYXNzZXJ0KHR5cGUtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IRUFQVFlQRSk7CisgICAgX1B5T2JqZWN0X0dDX1VOVFJBQ0sodHlwZSk7CisgICAgUHlPYmplY3RfQ2xlYXJXZWFrUmVmcygoUHlPYmplY3QgKil0eXBlKTsKKyAgICBldCA9IChQeUhlYXBUeXBlT2JqZWN0ICopdHlwZTsKKyAgICBQeV9YREVDUkVGKHR5cGUtPnRwX2Jhc2UpOworICAgIFB5X1hERUNSRUYodHlwZS0+dHBfZGljdCk7CisgICAgUHlfWERFQ1JFRih0eXBlLT50cF9iYXNlcyk7CisgICAgUHlfWERFQ1JFRih0eXBlLT50cF9tcm8pOworICAgIFB5X1hERUNSRUYodHlwZS0+dHBfY2FjaGUpOworICAgIFB5X1hERUNSRUYodHlwZS0+dHBfc3ViY2xhc3Nlcyk7CisgICAgLyogQSB0eXBlJ3MgdHBfZG9jIGlzIGhlYXAgYWxsb2NhdGVkLCB1bmxpa2UgdGhlIHRwX2RvYyBzbG90cworICAgICAqIG9mIG1vc3Qgb3RoZXIgb2JqZWN0cy4gIEl0J3Mgb2theSB0byBjYXN0IGl0IHRvIGNoYXIgKi4KKyAgICAgKi8KKyAgICBQeU9iamVjdF9GcmVlKChjaGFyICopdHlwZS0+dHBfZG9jKTsKKyAgICBQeV9YREVDUkVGKGV0LT5odF9uYW1lKTsKKyAgICBQeV9YREVDUkVGKGV0LT5odF9zbG90cyk7CisgICAgUHlfVFlQRSh0eXBlKS0+dHBfZnJlZSgoUHlPYmplY3QgKil0eXBlKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHR5cGVfc3ViY2xhc3NlcyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzX2lnbm9yZWQpCiB7Ci0JUHlPYmplY3QgKmxpc3QsICpyYXcsICpyZWY7Ci0JUHlfc3NpemVfdCBpLCBuOworICAgIFB5T2JqZWN0ICpsaXN0LCAqcmF3LCAqcmVmOworICAgIFB5X3NzaXplX3QgaSwgbjsKIAotCWxpc3QgPSBQeUxpc3RfTmV3KDApOwotCWlmIChsaXN0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXJhdyA9IHR5cGUtPnRwX3N1YmNsYXNzZXM7Ci0JaWYgKHJhdyA9PSBOVUxMKQotCQlyZXR1cm4gbGlzdDsKLQlhc3NlcnQoUHlMaXN0X0NoZWNrKHJhdykpOwotCW4gPSBQeUxpc3RfR0VUX1NJWkUocmF3KTsKLQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCXJlZiA9IFB5TGlzdF9HRVRfSVRFTShyYXcsIGkpOwotCQlhc3NlcnQoUHlXZWFrcmVmX0NoZWNrUmVmKHJlZikpOwotCQlyZWYgPSBQeVdlYWtyZWZfR0VUX09CSkVDVChyZWYpOwotCQlpZiAocmVmICE9IFB5X05vbmUpIHsKLQkJCWlmIChQeUxpc3RfQXBwZW5kKGxpc3QsIHJlZikgPCAwKSB7Ci0JCQkJUHlfREVDUkVGKGxpc3QpOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQl9Ci0JfQotCXJldHVybiBsaXN0OworICAgIGxpc3QgPSBQeUxpc3RfTmV3KDApOworICAgIGlmIChsaXN0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJhdyA9IHR5cGUtPnRwX3N1YmNsYXNzZXM7CisgICAgaWYgKHJhdyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gbGlzdDsKKyAgICBhc3NlcnQoUHlMaXN0X0NoZWNrKHJhdykpOworICAgIG4gPSBQeUxpc3RfR0VUX1NJWkUocmF3KTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIHJlZiA9IFB5TGlzdF9HRVRfSVRFTShyYXcsIGkpOworICAgICAgICBhc3NlcnQoUHlXZWFrcmVmX0NoZWNrUmVmKHJlZikpOworICAgICAgICByZWYgPSBQeVdlYWtyZWZfR0VUX09CSkVDVChyZWYpOworICAgICAgICBpZiAocmVmICE9IFB5X05vbmUpIHsKKyAgICAgICAgICAgIGlmIChQeUxpc3RfQXBwZW5kKGxpc3QsIHJlZikgPCAwKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGxpc3QpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBsaXN0OwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgdHlwZV9tZXRob2RzW10gPSB7Ci0JeyJtcm8iLCAoUHlDRnVuY3Rpb24pbXJvX2V4dGVybmFsLCBNRVRIX05PQVJHUywKLQkgUHlEb2NfU1RSKCJtcm8oKSAtPiBsaXN0XG5yZXR1cm4gYSB0eXBlJ3MgbWV0aG9kIHJlc29sdXRpb24gb3JkZXIiKX0sCi0JeyJfX3N1YmNsYXNzZXNfXyIsIChQeUNGdW5jdGlvbil0eXBlX3N1YmNsYXNzZXMsIE1FVEhfTk9BUkdTLAotCSBQeURvY19TVFIoIl9fc3ViY2xhc3Nlc19fKCkgLT4gbGlzdCBvZiBpbW1lZGlhdGUgc3ViY2xhc3NlcyIpfSwKLQl7MH0KKyAgICB7Im1ybyIsIChQeUNGdW5jdGlvbiltcm9fZXh0ZXJuYWwsIE1FVEhfTk9BUkdTLAorICAgICBQeURvY19TVFIoIm1ybygpIC0+IGxpc3RcbnJldHVybiBhIHR5cGUncyBtZXRob2QgcmVzb2x1dGlvbiBvcmRlciIpfSwKKyAgICB7Il9fc3ViY2xhc3Nlc19fIiwgKFB5Q0Z1bmN0aW9uKXR5cGVfc3ViY2xhc3NlcywgTUVUSF9OT0FSR1MsCisgICAgIFB5RG9jX1NUUigiX19zdWJjbGFzc2VzX18oKSAtPiBsaXN0IG9mIGltbWVkaWF0ZSBzdWJjbGFzc2VzIil9LAorICAgIHswfQogfTsKIAogUHlEb2NfU1RSVkFSKHR5cGVfZG9jLApAQCAtMjY2OCwxMDkgKzI2NjgsMTA5IEBACiBzdGF0aWMgaW50CiB0eXBlX3RyYXZlcnNlKFB5VHlwZU9iamVjdCAqdHlwZSwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JLyogQmVjYXVzZSBvZiB0eXBlX2lzX2djKCksIHRoZSBjb2xsZWN0b3Igb25seSBjYWxscyB0aGlzCi0JICAgZm9yIGhlYXB0eXBlcy4gKi8KLQlhc3NlcnQodHlwZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hFQVBUWVBFKTsKKyAgICAvKiBCZWNhdXNlIG9mIHR5cGVfaXNfZ2MoKSwgdGhlIGNvbGxlY3RvciBvbmx5IGNhbGxzIHRoaXMKKyAgICAgICBmb3IgaGVhcHR5cGVzLiAqLworICAgIGFzc2VydCh0eXBlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEVBUFRZUEUpOwogCi0JUHlfVklTSVQodHlwZS0+dHBfZGljdCk7Ci0JUHlfVklTSVQodHlwZS0+dHBfY2FjaGUpOwotCVB5X1ZJU0lUKHR5cGUtPnRwX21ybyk7Ci0JUHlfVklTSVQodHlwZS0+dHBfYmFzZXMpOwotCVB5X1ZJU0lUKHR5cGUtPnRwX2Jhc2UpOworICAgIFB5X1ZJU0lUKHR5cGUtPnRwX2RpY3QpOworICAgIFB5X1ZJU0lUKHR5cGUtPnRwX2NhY2hlKTsKKyAgICBQeV9WSVNJVCh0eXBlLT50cF9tcm8pOworICAgIFB5X1ZJU0lUKHR5cGUtPnRwX2Jhc2VzKTsKKyAgICBQeV9WSVNJVCh0eXBlLT50cF9iYXNlKTsKIAotCS8qIFRoZXJlJ3Mgbm8gbmVlZCB0byB2aXNpdCB0eXBlLT50cF9zdWJjbGFzc2VzIG9yCi0JICAgKChQeUhlYXBUeXBlT2JqZWN0ICopdHlwZSktPmh0X3Nsb3RzLCBiZWNhdXNlIHRoZXkgY2FuJ3QgYmUgaW52b2x2ZWQKLQkgICBpbiBjeWNsZXM7IHRwX3N1YmNsYXNzZXMgaXMgYSBsaXN0IG9mIHdlYWsgcmVmZXJlbmNlcywKLQkgICBhbmQgc2xvdHMgaXMgYSB0dXBsZSBvZiBzdHJpbmdzLiAqLworICAgIC8qIFRoZXJlJ3Mgbm8gbmVlZCB0byB2aXNpdCB0eXBlLT50cF9zdWJjbGFzc2VzIG9yCisgICAgICAgKChQeUhlYXBUeXBlT2JqZWN0ICopdHlwZSktPmh0X3Nsb3RzLCBiZWNhdXNlIHRoZXkgY2FuJ3QgYmUgaW52b2x2ZWQKKyAgICAgICBpbiBjeWNsZXM7IHRwX3N1YmNsYXNzZXMgaXMgYSBsaXN0IG9mIHdlYWsgcmVmZXJlbmNlcywKKyAgICAgICBhbmQgc2xvdHMgaXMgYSB0dXBsZSBvZiBzdHJpbmdzLiAqLwogCi0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIHR5cGVfY2xlYXIoUHlUeXBlT2JqZWN0ICp0eXBlKQogewotCS8qIEJlY2F1c2Ugb2YgdHlwZV9pc19nYygpLCB0aGUgY29sbGVjdG9yIG9ubHkgY2FsbHMgdGhpcwotCSAgIGZvciBoZWFwdHlwZXMuICovCi0JYXNzZXJ0KHR5cGUtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IRUFQVFlQRSk7CisgICAgLyogQmVjYXVzZSBvZiB0eXBlX2lzX2djKCksIHRoZSBjb2xsZWN0b3Igb25seSBjYWxscyB0aGlzCisgICAgICAgZm9yIGhlYXB0eXBlcy4gKi8KKyAgICBhc3NlcnQodHlwZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hFQVBUWVBFKTsKIAotCS8qIFRoZSBvbmx5IGZpZWxkIHdlIG5lZWQgdG8gY2xlYXIgaXMgdHBfbXJvLCB3aGljaCBpcyBwYXJ0IG9mIGEKLQkgICBoYXJkIGN5Y2xlIChpdHMgZmlyc3QgZWxlbWVudCBpcyB0aGUgY2xhc3MgaXRzZWxmKSB0aGF0IHdvbid0Ci0JICAgYmUgYnJva2VuIG90aGVyd2lzZSAoaXQncyBhIHR1cGxlIGFuZCB0dXBsZXMgZG9uJ3QgaGF2ZSBhCi0JICAgdHBfY2xlYXIgaGFuZGxlcikuICBOb25lIG9mIHRoZSBvdGhlciBmaWVsZHMgbmVlZCB0byBiZQotCSAgIGNsZWFyZWQsIGFuZCBoZXJlJ3Mgd2h5OgorICAgIC8qIFRoZSBvbmx5IGZpZWxkIHdlIG5lZWQgdG8gY2xlYXIgaXMgdHBfbXJvLCB3aGljaCBpcyBwYXJ0IG9mIGEKKyAgICAgICBoYXJkIGN5Y2xlIChpdHMgZmlyc3QgZWxlbWVudCBpcyB0aGUgY2xhc3MgaXRzZWxmKSB0aGF0IHdvbid0CisgICAgICAgYmUgYnJva2VuIG90aGVyd2lzZSAoaXQncyBhIHR1cGxlIGFuZCB0dXBsZXMgZG9uJ3QgaGF2ZSBhCisgICAgICAgdHBfY2xlYXIgaGFuZGxlcikuICBOb25lIG9mIHRoZSBvdGhlciBmaWVsZHMgbmVlZCB0byBiZQorICAgICAgIGNsZWFyZWQsIGFuZCBoZXJlJ3Mgd2h5OgogCi0JICAgdHBfZGljdDoKLQkgICAgICAgSXQgaXMgYSBkaWN0LCBzbyB0aGUgY29sbGVjdG9yIHdpbGwgY2FsbCBpdHMgdHBfY2xlYXIuCisgICAgICAgdHBfZGljdDoKKyAgICAgICAgICAgSXQgaXMgYSBkaWN0LCBzbyB0aGUgY29sbGVjdG9yIHdpbGwgY2FsbCBpdHMgdHBfY2xlYXIuCiAKLQkgICB0cF9jYWNoZToKLQkgICAgICAgTm90IHVzZWQ7IGlmIGl0IHdlcmUsIGl0IHdvdWxkIGJlIGEgZGljdC4KKyAgICAgICB0cF9jYWNoZToKKyAgICAgICAgICAgTm90IHVzZWQ7IGlmIGl0IHdlcmUsIGl0IHdvdWxkIGJlIGEgZGljdC4KIAotCSAgIHRwX2Jhc2VzLCB0cF9iYXNlOgotCSAgICAgICBJZiB0aGVzZSBhcmUgaW52b2x2ZWQgaW4gYSBjeWNsZSwgdGhlcmUgbXVzdCBiZSBhdCBsZWFzdAotCSAgICAgICBvbmUgb3RoZXIsIG11dGFibGUgb2JqZWN0IGluIHRoZSBjeWNsZSwgZS5nLiBhIGJhc2UKLQkgICAgICAgY2xhc3MncyBkaWN0OyB0aGUgY3ljbGUgd2lsbCBiZSBicm9rZW4gdGhhdCB3YXkuCisgICAgICAgdHBfYmFzZXMsIHRwX2Jhc2U6CisgICAgICAgICAgIElmIHRoZXNlIGFyZSBpbnZvbHZlZCBpbiBhIGN5Y2xlLCB0aGVyZSBtdXN0IGJlIGF0IGxlYXN0CisgICAgICAgICAgIG9uZSBvdGhlciwgbXV0YWJsZSBvYmplY3QgaW4gdGhlIGN5Y2xlLCBlLmcuIGEgYmFzZQorICAgICAgICAgICBjbGFzcydzIGRpY3Q7IHRoZSBjeWNsZSB3aWxsIGJlIGJyb2tlbiB0aGF0IHdheS4KIAotCSAgIHRwX3N1YmNsYXNzZXM6Ci0JICAgICAgIEEgbGlzdCBvZiB3ZWFrIHJlZmVyZW5jZXMgY2FuJ3QgYmUgcGFydCBvZiBhIGN5Y2xlOyBhbmQKLQkgICAgICAgbGlzdHMgaGF2ZSB0aGVpciBvd24gdHBfY2xlYXIuCisgICAgICAgdHBfc3ViY2xhc3NlczoKKyAgICAgICAgICAgQSBsaXN0IG9mIHdlYWsgcmVmZXJlbmNlcyBjYW4ndCBiZSBwYXJ0IG9mIGEgY3ljbGU7IGFuZAorICAgICAgICAgICBsaXN0cyBoYXZlIHRoZWlyIG93biB0cF9jbGVhci4KIAotCSAgIHNsb3RzIChpbiBQeUhlYXBUeXBlT2JqZWN0KToKLQkgICAgICAgQSB0dXBsZSBvZiBzdHJpbmdzIGNhbid0IGJlIHBhcnQgb2YgYSBjeWNsZS4KLQkqLworICAgICAgIHNsb3RzIChpbiBQeUhlYXBUeXBlT2JqZWN0KToKKyAgICAgICAgICAgQSB0dXBsZSBvZiBzdHJpbmdzIGNhbid0IGJlIHBhcnQgb2YgYSBjeWNsZS4KKyAgICAqLwogCi0JUHlfQ0xFQVIodHlwZS0+dHBfbXJvKTsKKyAgICBQeV9DTEVBUih0eXBlLT50cF9tcm8pOwogCi0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIHR5cGVfaXNfZ2MoUHlUeXBlT2JqZWN0ICp0eXBlKQogewotCXJldHVybiB0eXBlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEVBUFRZUEU7CisgICAgcmV0dXJuIHR5cGUtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IRUFQVFlQRTsKIH0KIAogUHlUeXBlT2JqZWN0IFB5VHlwZV9UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCi0JInR5cGUiLAkJCQkJLyogdHBfbmFtZSAqLwotCXNpemVvZihQeUhlYXBUeXBlT2JqZWN0KSwJCS8qIHRwX2Jhc2ljc2l6ZSAqLwotCXNpemVvZihQeU1lbWJlckRlZiksCQkJLyogdHBfaXRlbXNpemUgKi8KLQkoZGVzdHJ1Y3Rvcil0eXBlX2RlYWxsb2MsCQkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkocmVwcmZ1bmMpdHlwZV9yZXByLAkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpX1B5X0hhc2hQb2ludGVyLAkJLyogdHBfaGFzaCAqLwotCSh0ZXJuYXJ5ZnVuYyl0eXBlX2NhbGwsCQkJLyogdHBfY2FsbCAqLwotCTAsCQkJCQkvKiB0cF9zdHIgKi8KLQkoZ2V0YXR0cm9mdW5jKXR5cGVfZ2V0YXR0cm8sCQkvKiB0cF9nZXRhdHRybyAqLwotCShzZXRhdHRyb2Z1bmMpdHlwZV9zZXRhdHRybywJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQyB8Ci0JCVB5X1RQRkxBR1NfQkFTRVRZUEUgfCBQeV9UUEZMQUdTX1RZUEVfU1VCQ0xBU1MsCS8qIHRwX2ZsYWdzICovCi0JdHlwZV9kb2MsCQkJCS8qIHRwX2RvYyAqLwotCSh0cmF2ZXJzZXByb2MpdHlwZV90cmF2ZXJzZSwJCS8qIHRwX3RyYXZlcnNlICovCi0JKGlucXVpcnkpdHlwZV9jbGVhciwJCQkvKiB0cF9jbGVhciAqLwotCXR5cGVfcmljaGNvbXBhcmUsCQkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCW9mZnNldG9mKFB5VHlwZU9iamVjdCwgdHBfd2Vha2xpc3QpLAkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCTAsCQkJCQkvKiB0cF9pdGVyICovCi0JMCwJCQkJCS8qIHRwX2l0ZXJuZXh0ICovCi0JdHlwZV9tZXRob2RzLAkJCQkvKiB0cF9tZXRob2RzICovCi0JdHlwZV9tZW1iZXJzLAkJCQkvKiB0cF9tZW1iZXJzICovCi0JdHlwZV9nZXRzZXRzLAkJCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCQkvKiB0cF9kaWN0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KLQlvZmZzZXRvZihQeVR5cGVPYmplY3QsIHRwX2RpY3QpLAkvKiB0cF9kaWN0b2Zmc2V0ICovCi0JdHlwZV9pbml0LAkJCQkvKiB0cF9pbml0ICovCi0JMCwJCQkJCS8qIHRwX2FsbG9jICovCi0JdHlwZV9uZXcsCQkJCS8qIHRwX25ldyAqLwotCVB5T2JqZWN0X0dDX0RlbCwJCQkvKiB0cF9mcmVlICovCi0JKGlucXVpcnkpdHlwZV9pc19nYywJCQkvKiB0cF9pc19nYyAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCisgICAgInR5cGUiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCisgICAgc2l6ZW9mKFB5SGVhcFR5cGVPYmplY3QpLCAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICBzaXplb2YoUHlNZW1iZXJEZWYpLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgKGRlc3RydWN0b3IpdHlwZV9kZWFsbG9jLCAgICAgICAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAocmVwcmZ1bmMpdHlwZV9yZXByLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAoaGFzaGZ1bmMpX1B5X0hhc2hQb2ludGVyLCAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAodGVybmFyeWZ1bmMpdHlwZV9jYWxsLCAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIChnZXRhdHRyb2Z1bmMpdHlwZV9nZXRhdHRybywgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAoc2V0YXR0cm9mdW5jKXR5cGVfc2V0YXR0cm8sICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MgfAorICAgICAgICBQeV9UUEZMQUdTX0JBU0VUWVBFIHwgUHlfVFBGTEFHU19UWVBFX1NVQkNMQVNTLCAgICAgICAgIC8qIHRwX2ZsYWdzICovCisgICAgdHlwZV9kb2MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAodHJhdmVyc2Vwcm9jKXR5cGVfdHJhdmVyc2UsICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgKGlucXVpcnkpdHlwZV9jbGVhciwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIHR5cGVfcmljaGNvbXBhcmUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgb2Zmc2V0b2YoUHlUeXBlT2JqZWN0LCB0cF93ZWFrbGlzdCksICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICB0eXBlX21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICB0eXBlX21lbWJlcnMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICB0eXBlX2dldHNldHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICBvZmZzZXRvZihQeVR5cGVPYmplY3QsIHRwX2RpY3QpLCAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICB0eXBlX2luaXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgdHlwZV9uZXcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICBQeU9iamVjdF9HQ19EZWwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KKyAgICAoaW5xdWlyeSl0eXBlX2lzX2djLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2lzX2djICovCiB9OwogCiAKQEAgLTI4MjMsMjgyICsyODIzLDI4MiBAQAogc3RhdGljIGludAogZXhjZXNzX2FyZ3MoUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCXJldHVybiBQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpIHx8Ci0JCShrd2RzICYmIFB5RGljdF9DaGVjayhrd2RzKSAmJiBQeURpY3RfU2l6ZShrd2RzKSk7CisgICAgcmV0dXJuIFB5VHVwbGVfR0VUX1NJWkUoYXJncykgfHwKKyAgICAgICAgKGt3ZHMgJiYgUHlEaWN0X0NoZWNrKGt3ZHMpICYmIFB5RGljdF9TaXplKGt3ZHMpKTsKIH0KIAogc3RhdGljIGludAogb2JqZWN0X2luaXQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlpbnQgZXJyID0gMDsKLQlpZiAoZXhjZXNzX2FyZ3MoYXJncywga3dkcykpIHsKLQkJUHlUeXBlT2JqZWN0ICp0eXBlID0gUHlfVFlQRShzZWxmKTsKLQkJaWYgKHR5cGUtPnRwX2luaXQgIT0gb2JqZWN0X2luaXQgJiYKLQkJICAgIHR5cGUtPnRwX25ldyAhPSBvYmplY3RfbmV3KQotCQl7Ci0JCQllcnIgPSBQeUVycl9XYXJuRXgoUHlFeGNfRGVwcmVjYXRpb25XYXJuaW5nLAotCQkJCSAgICJvYmplY3QuX19pbml0X18oKSB0YWtlcyBubyBwYXJhbWV0ZXJzIiwKLQkJCQkgICAxKTsKLQkJfQotCQllbHNlIGlmICh0eXBlLT50cF9pbml0ICE9IG9iamVjdF9pbml0IHx8Ci0JCQkgdHlwZS0+dHBfbmV3ID09IG9iamVjdF9uZXcpCi0JCXsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJIm9iamVjdC5fX2luaXRfXygpIHRha2VzIG5vIHBhcmFtZXRlcnMiKTsKLQkJCWVyciA9IC0xOwotCQl9Ci0JfQotCXJldHVybiBlcnI7CisgICAgaW50IGVyciA9IDA7CisgICAgaWYgKGV4Y2Vzc19hcmdzKGFyZ3MsIGt3ZHMpKSB7CisgICAgICAgIFB5VHlwZU9iamVjdCAqdHlwZSA9IFB5X1RZUEUoc2VsZik7CisgICAgICAgIGlmICh0eXBlLT50cF9pbml0ICE9IG9iamVjdF9pbml0ICYmCisgICAgICAgICAgICB0eXBlLT50cF9uZXcgIT0gb2JqZWN0X25ldykKKyAgICAgICAgeworICAgICAgICAgICAgZXJyID0gUHlFcnJfV2FybkV4KFB5RXhjX0RlcHJlY2F0aW9uV2FybmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgIm9iamVjdC5fX2luaXRfXygpIHRha2VzIG5vIHBhcmFtZXRlcnMiLAorICAgICAgICAgICAgICAgICAgICAgICAxKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh0eXBlLT50cF9pbml0ICE9IG9iamVjdF9pbml0IHx8CisgICAgICAgICAgICAgICAgIHR5cGUtPnRwX25ldyA9PSBvYmplY3RfbmV3KQorICAgICAgICB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICJvYmplY3QuX19pbml0X18oKSB0YWtlcyBubyBwYXJhbWV0ZXJzIik7CisgICAgICAgICAgICBlcnIgPSAtMTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogb2JqZWN0X25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlpbnQgZXJyID0gMDsKLQlpZiAoZXhjZXNzX2FyZ3MoYXJncywga3dkcykpIHsKLQkJaWYgKHR5cGUtPnRwX25ldyAhPSBvYmplY3RfbmV3ICYmCi0JCSAgICB0eXBlLT50cF9pbml0ICE9IG9iamVjdF9pbml0KQotCQl7Ci0JCQllcnIgPSBQeUVycl9XYXJuRXgoUHlFeGNfRGVwcmVjYXRpb25XYXJuaW5nLAotCQkJCSAgICJvYmplY3QuX19uZXdfXygpIHRha2VzIG5vIHBhcmFtZXRlcnMiLAotCQkJCSAgIDEpOwotCQl9Ci0JCWVsc2UgaWYgKHR5cGUtPnRwX25ldyAhPSBvYmplY3RfbmV3IHx8Ci0JCQkgdHlwZS0+dHBfaW5pdCA9PSBvYmplY3RfaW5pdCkKLQkJewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkib2JqZWN0Ll9fbmV3X18oKSB0YWtlcyBubyBwYXJhbWV0ZXJzIik7Ci0JCQllcnIgPSAtMTsKLQkJfQotCX0KLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIE5VTEw7CisgICAgaW50IGVyciA9IDA7CisgICAgaWYgKGV4Y2Vzc19hcmdzKGFyZ3MsIGt3ZHMpKSB7CisgICAgICAgIGlmICh0eXBlLT50cF9uZXcgIT0gb2JqZWN0X25ldyAmJgorICAgICAgICAgICAgdHlwZS0+dHBfaW5pdCAhPSBvYmplY3RfaW5pdCkKKyAgICAgICAgeworICAgICAgICAgICAgZXJyID0gUHlFcnJfV2FybkV4KFB5RXhjX0RlcHJlY2F0aW9uV2FybmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgIm9iamVjdC5fX25ld19fKCkgdGFrZXMgbm8gcGFyYW1ldGVycyIsCisgICAgICAgICAgICAgICAgICAgICAgIDEpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHR5cGUtPnRwX25ldyAhPSBvYmplY3RfbmV3IHx8CisgICAgICAgICAgICAgICAgIHR5cGUtPnRwX2luaXQgPT0gb2JqZWN0X2luaXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgIm9iamVjdC5fX25ld19fKCkgdGFrZXMgbm8gcGFyYW1ldGVycyIpOworICAgICAgICAgICAgZXJyID0gLTE7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGVyciA8IDApCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKHR5cGUtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19JU19BQlNUUkFDVCkgewotCQlzdGF0aWMgUHlPYmplY3QgKmNvbW1hID0gTlVMTDsKLQkJUHlPYmplY3QgKmFic3RyYWN0X21ldGhvZHMgPSBOVUxMOwotCQlQeU9iamVjdCAqYnVpbHRpbnM7Ci0JCVB5T2JqZWN0ICpzb3J0ZWQ7Ci0JCVB5T2JqZWN0ICpzb3J0ZWRfbWV0aG9kcyA9IE5VTEw7Ci0JCVB5T2JqZWN0ICpqb2luZWQgPSBOVUxMOwotCQljb25zdCBjaGFyICpqb2luZWRfc3RyOworICAgIGlmICh0eXBlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSVNfQUJTVFJBQ1QpIHsKKyAgICAgICAgc3RhdGljIFB5T2JqZWN0ICpjb21tYSA9IE5VTEw7CisgICAgICAgIFB5T2JqZWN0ICphYnN0cmFjdF9tZXRob2RzID0gTlVMTDsKKyAgICAgICAgUHlPYmplY3QgKmJ1aWx0aW5zOworICAgICAgICBQeU9iamVjdCAqc29ydGVkOworICAgICAgICBQeU9iamVjdCAqc29ydGVkX21ldGhvZHMgPSBOVUxMOworICAgICAgICBQeU9iamVjdCAqam9pbmVkID0gTlVMTDsKKyAgICAgICAgY29uc3QgY2hhciAqam9pbmVkX3N0cjsKIAotCQkvKiBDb21wdXRlICIsICIuam9pbihzb3J0ZWQodHlwZS5fX2Fic3RyYWN0bWV0aG9kc19fKSkKLQkJICAgaW50byBqb2luZWQuICovCi0JCWFic3RyYWN0X21ldGhvZHMgPSB0eXBlX2Fic3RyYWN0bWV0aG9kcyh0eXBlLCBOVUxMKTsKLQkJaWYgKGFic3RyYWN0X21ldGhvZHMgPT0gTlVMTCkKLQkJCWdvdG8gZXJyb3I7Ci0JCWJ1aWx0aW5zID0gUHlFdmFsX0dldEJ1aWx0aW5zKCk7Ci0JCWlmIChidWlsdGlucyA9PSBOVUxMKQotCQkJZ290byBlcnJvcjsKLQkJc29ydGVkID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoYnVpbHRpbnMsICJzb3J0ZWQiKTsKLQkJaWYgKHNvcnRlZCA9PSBOVUxMKQotCQkJZ290byBlcnJvcjsKLQkJc29ydGVkX21ldGhvZHMgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKHNvcnRlZCwKLQkJCQkJCQkgICAgICBhYnN0cmFjdF9tZXRob2RzLAotCQkJCQkJCSAgICAgIE5VTEwpOwotCQlpZiAoc29ydGVkX21ldGhvZHMgPT0gTlVMTCkKLQkJCWdvdG8gZXJyb3I7Ci0JCWlmIChjb21tYSA9PSBOVUxMKSB7Ci0JCQljb21tYSA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIiwgIik7Ci0JCQlpZiAoY29tbWEgPT0gTlVMTCkKLQkJCQlnb3RvIGVycm9yOwotCQl9Ci0JCWpvaW5lZCA9IFB5T2JqZWN0X0NhbGxNZXRob2QoY29tbWEsICJqb2luIiwKLQkJCQkJICAgICAiTyIsICBzb3J0ZWRfbWV0aG9kcyk7Ci0JCWlmIChqb2luZWQgPT0gTlVMTCkKLQkJCWdvdG8gZXJyb3I7Ci0JCWpvaW5lZF9zdHIgPSBQeVN0cmluZ19Bc1N0cmluZyhqb2luZWQpOwotCQlpZiAoam9pbmVkX3N0ciA9PSBOVUxMKQotCQkJZ290byBlcnJvcjsKKyAgICAgICAgLyogQ29tcHV0ZSAiLCAiLmpvaW4oc29ydGVkKHR5cGUuX19hYnN0cmFjdG1ldGhvZHNfXykpCisgICAgICAgICAgIGludG8gam9pbmVkLiAqLworICAgICAgICBhYnN0cmFjdF9tZXRob2RzID0gdHlwZV9hYnN0cmFjdG1ldGhvZHModHlwZSwgTlVMTCk7CisgICAgICAgIGlmIChhYnN0cmFjdF9tZXRob2RzID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICBidWlsdGlucyA9IFB5RXZhbF9HZXRCdWlsdGlucygpOworICAgICAgICBpZiAoYnVpbHRpbnMgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIHNvcnRlZCA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKGJ1aWx0aW5zLCAic29ydGVkIik7CisgICAgICAgIGlmIChzb3J0ZWQgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIHNvcnRlZF9tZXRob2RzID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhzb3J0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYnN0cmFjdF9tZXRob2RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAgIGlmIChzb3J0ZWRfbWV0aG9kcyA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgaWYgKGNvbW1hID09IE5VTEwpIHsKKyAgICAgICAgICAgIGNvbW1hID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiLCAiKTsKKyAgICAgICAgICAgIGlmIChjb21tYSA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgam9pbmVkID0gUHlPYmplY3RfQ2FsbE1ldGhvZChjb21tYSwgImpvaW4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPIiwgIHNvcnRlZF9tZXRob2RzKTsKKyAgICAgICAgaWYgKGpvaW5lZCA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgam9pbmVkX3N0ciA9IFB5U3RyaW5nX0FzU3RyaW5nKGpvaW5lZCk7CisgICAgICAgIGlmIChqb2luZWRfc3RyID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGVycm9yOwogCi0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgICJDYW4ndCBpbnN0YW50aWF0ZSBhYnN0cmFjdCBjbGFzcyAlcyAiCi0JCQkgICAgICJ3aXRoIGFic3RyYWN0IG1ldGhvZHMgJXMiLAotCQkJICAgICB0eXBlLT50cF9uYW1lLAotCQkJICAgICBqb2luZWRfc3RyKTsKLQllcnJvcjoKLQkJUHlfWERFQ1JFRihqb2luZWQpOwotCQlQeV9YREVDUkVGKHNvcnRlZF9tZXRob2RzKTsKLQkJUHlfWERFQ1JFRihhYnN0cmFjdF9tZXRob2RzKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJDYW4ndCBpbnN0YW50aWF0ZSBhYnN0cmFjdCBjbGFzcyAlcyAiCisgICAgICAgICAgICAgICAgICAgICAid2l0aCBhYnN0cmFjdCBtZXRob2RzICVzIiwKKyAgICAgICAgICAgICAgICAgICAgIHR5cGUtPnRwX25hbWUsCisgICAgICAgICAgICAgICAgICAgICBqb2luZWRfc3RyKTsKKyAgICBlcnJvcjoKKyAgICAgICAgUHlfWERFQ1JFRihqb2luZWQpOworICAgICAgICBQeV9YREVDUkVGKHNvcnRlZF9tZXRob2RzKTsKKyAgICAgICAgUHlfWERFQ1JFRihhYnN0cmFjdF9tZXRob2RzKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKIH0KIAogc3RhdGljIHZvaWQKIG9iamVjdF9kZWFsbG9jKFB5T2JqZWN0ICpzZWxmKQogewotCVB5X1RZUEUoc2VsZiktPnRwX2ZyZWUoc2VsZik7CisgICAgUHlfVFlQRShzZWxmKS0+dHBfZnJlZShzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG9iamVjdF9yZXByKFB5T2JqZWN0ICpzZWxmKQogewotCVB5VHlwZU9iamVjdCAqdHlwZTsKLQlQeU9iamVjdCAqbW9kLCAqbmFtZSwgKnJ0bjsKKyAgICBQeVR5cGVPYmplY3QgKnR5cGU7CisgICAgUHlPYmplY3QgKm1vZCwgKm5hbWUsICpydG47CiAKLQl0eXBlID0gUHlfVFlQRShzZWxmKTsKLQltb2QgPSB0eXBlX21vZHVsZSh0eXBlLCBOVUxMKTsKLQlpZiAobW9kID09IE5VTEwpCi0JCVB5RXJyX0NsZWFyKCk7Ci0JZWxzZSBpZiAoIVB5U3RyaW5nX0NoZWNrKG1vZCkpIHsKLQkJUHlfREVDUkVGKG1vZCk7Ci0JCW1vZCA9IE5VTEw7Ci0JfQotCW5hbWUgPSB0eXBlX25hbWUodHlwZSwgTlVMTCk7Ci0JaWYgKG5hbWUgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKG1vZCAhPSBOVUxMICYmIHN0cmNtcChQeVN0cmluZ19BU19TVFJJTkcobW9kKSwgIl9fYnVpbHRpbl9fIikpCi0JCXJ0biA9IFB5U3RyaW5nX0Zyb21Gb3JtYXQoIjwlcy4lcyBvYmplY3QgYXQgJXA+IiwKLQkJCQkJICBQeVN0cmluZ19BU19TVFJJTkcobW9kKSwKLQkJCQkJICBQeVN0cmluZ19BU19TVFJJTkcobmFtZSksCi0JCQkJCSAgc2VsZik7Ci0JZWxzZQotCQlydG4gPSBQeVN0cmluZ19Gcm9tRm9ybWF0KCI8JXMgb2JqZWN0IGF0ICVwPiIsCi0JCQkJCSAgdHlwZS0+dHBfbmFtZSwgc2VsZik7Ci0JUHlfWERFQ1JFRihtb2QpOwotCVB5X0RFQ1JFRihuYW1lKTsKLQlyZXR1cm4gcnRuOworICAgIHR5cGUgPSBQeV9UWVBFKHNlbGYpOworICAgIG1vZCA9IHR5cGVfbW9kdWxlKHR5cGUsIE5VTEwpOworICAgIGlmIChtb2QgPT0gTlVMTCkKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICBlbHNlIGlmICghUHlTdHJpbmdfQ2hlY2sobW9kKSkgeworICAgICAgICBQeV9ERUNSRUYobW9kKTsKKyAgICAgICAgbW9kID0gTlVMTDsKKyAgICB9CisgICAgbmFtZSA9IHR5cGVfbmFtZSh0eXBlLCBOVUxMKTsKKyAgICBpZiAobmFtZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAobW9kICE9IE5VTEwgJiYgc3RyY21wKFB5U3RyaW5nX0FTX1NUUklORyhtb2QpLCAiX19idWlsdGluX18iKSkKKyAgICAgICAgcnRuID0gUHlTdHJpbmdfRnJvbUZvcm1hdCgiPCVzLiVzIG9iamVjdCBhdCAlcD4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FTX1NUUklORyhtb2QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FTX1NUUklORyhuYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmKTsKKyAgICBlbHNlCisgICAgICAgIHJ0biA9IFB5U3RyaW5nX0Zyb21Gb3JtYXQoIjwlcyBvYmplY3QgYXQgJXA+IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLT50cF9uYW1lLCBzZWxmKTsKKyAgICBQeV9YREVDUkVGKG1vZCk7CisgICAgUHlfREVDUkVGKG5hbWUpOworICAgIHJldHVybiBydG47CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBvYmplY3Rfc3RyKFB5T2JqZWN0ICpzZWxmKQogewotCXVuYXJ5ZnVuYyBmOworICAgIHVuYXJ5ZnVuYyBmOwogCi0JZiA9IFB5X1RZUEUoc2VsZiktPnRwX3JlcHI7Ci0JaWYgKGYgPT0gTlVMTCkKLQkJZiA9IG9iamVjdF9yZXByOwotCXJldHVybiBmKHNlbGYpOworICAgIGYgPSBQeV9UWVBFKHNlbGYpLT50cF9yZXByOworICAgIGlmIChmID09IE5VTEwpCisgICAgICAgIGYgPSBvYmplY3RfcmVwcjsKKyAgICByZXR1cm4gZihzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG9iamVjdF9nZXRfY2xhc3MoUHlPYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JUHlfSU5DUkVGKFB5X1RZUEUoc2VsZikpOwotCXJldHVybiAoUHlPYmplY3QgKikoUHlfVFlQRShzZWxmKSk7CisgICAgUHlfSU5DUkVGKFB5X1RZUEUoc2VsZikpOworICAgIHJldHVybiAoUHlPYmplY3QgKikoUHlfVFlQRShzZWxmKSk7CiB9CiAKIHN0YXRpYyBpbnQKIGVxdWl2X3N0cnVjdHMoUHlUeXBlT2JqZWN0ICphLCBQeVR5cGVPYmplY3QgKmIpCiB7Ci0JcmV0dXJuIGEgPT0gYiB8fAotCSAgICAgICAoYSAhPSBOVUxMICYmCi0JCWIgIT0gTlVMTCAmJgotCQlhLT50cF9iYXNpY3NpemUgPT0gYi0+dHBfYmFzaWNzaXplICYmCi0JCWEtPnRwX2l0ZW1zaXplID09IGItPnRwX2l0ZW1zaXplICYmCi0JCWEtPnRwX2RpY3RvZmZzZXQgPT0gYi0+dHBfZGljdG9mZnNldCAmJgotCQlhLT50cF93ZWFrbGlzdG9mZnNldCA9PSBiLT50cF93ZWFrbGlzdG9mZnNldCAmJgotCQkoKGEtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IQVZFX0dDKSA9PQotCQkgKGItPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IQVZFX0dDKSkpOworICAgIHJldHVybiBhID09IGIgfHwKKyAgICAgICAgICAgKGEgIT0gTlVMTCAmJgorICAgICAgICBiICE9IE5VTEwgJiYKKyAgICAgICAgYS0+dHBfYmFzaWNzaXplID09IGItPnRwX2Jhc2ljc2l6ZSAmJgorICAgICAgICBhLT50cF9pdGVtc2l6ZSA9PSBiLT50cF9pdGVtc2l6ZSAmJgorICAgICAgICBhLT50cF9kaWN0b2Zmc2V0ID09IGItPnRwX2RpY3RvZmZzZXQgJiYKKyAgICAgICAgYS0+dHBfd2Vha2xpc3RvZmZzZXQgPT0gYi0+dHBfd2Vha2xpc3RvZmZzZXQgJiYKKyAgICAgICAgKChhLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEFWRV9HQykgPT0KKyAgICAgICAgIChiLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEFWRV9HQykpKTsKIH0KIAogc3RhdGljIGludAogc2FtZV9zbG90c19hZGRlZChQeVR5cGVPYmplY3QgKmEsIFB5VHlwZU9iamVjdCAqYikKIHsKLQlQeVR5cGVPYmplY3QgKmJhc2UgPSBhLT50cF9iYXNlOwotCVB5X3NzaXplX3Qgc2l6ZTsKLQlQeU9iamVjdCAqc2xvdHNfYSwgKnNsb3RzX2I7CisgICAgUHlUeXBlT2JqZWN0ICpiYXNlID0gYS0+dHBfYmFzZTsKKyAgICBQeV9zc2l6ZV90IHNpemU7CisgICAgUHlPYmplY3QgKnNsb3RzX2EsICpzbG90c19iOwogCi0JaWYgKGJhc2UgIT0gYi0+dHBfYmFzZSkKLQkJcmV0dXJuIDA7Ci0JaWYgKGVxdWl2X3N0cnVjdHMoYSwgYmFzZSkgJiYgZXF1aXZfc3RydWN0cyhiLCBiYXNlKSkKLQkJcmV0dXJuIDE7Ci0Jc2l6ZSA9IGJhc2UtPnRwX2Jhc2ljc2l6ZTsKLQlpZiAoYS0+dHBfZGljdG9mZnNldCA9PSBzaXplICYmIGItPnRwX2RpY3RvZmZzZXQgPT0gc2l6ZSkKLQkJc2l6ZSArPSBzaXplb2YoUHlPYmplY3QgKik7Ci0JaWYgKGEtPnRwX3dlYWtsaXN0b2Zmc2V0ID09IHNpemUgJiYgYi0+dHBfd2Vha2xpc3RvZmZzZXQgPT0gc2l6ZSkKLQkJc2l6ZSArPSBzaXplb2YoUHlPYmplY3QgKik7CisgICAgaWYgKGJhc2UgIT0gYi0+dHBfYmFzZSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKGVxdWl2X3N0cnVjdHMoYSwgYmFzZSkgJiYgZXF1aXZfc3RydWN0cyhiLCBiYXNlKSkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgc2l6ZSA9IGJhc2UtPnRwX2Jhc2ljc2l6ZTsKKyAgICBpZiAoYS0+dHBfZGljdG9mZnNldCA9PSBzaXplICYmIGItPnRwX2RpY3RvZmZzZXQgPT0gc2l6ZSkKKyAgICAgICAgc2l6ZSArPSBzaXplb2YoUHlPYmplY3QgKik7CisgICAgaWYgKGEtPnRwX3dlYWtsaXN0b2Zmc2V0ID09IHNpemUgJiYgYi0+dHBfd2Vha2xpc3RvZmZzZXQgPT0gc2l6ZSkKKyAgICAgICAgc2l6ZSArPSBzaXplb2YoUHlPYmplY3QgKik7CiAKLQkvKiBDaGVjayBzbG90cyBjb21wbGlhbmNlICovCi0Jc2xvdHNfYSA9ICgoUHlIZWFwVHlwZU9iamVjdCAqKWEpLT5odF9zbG90czsKLQlzbG90c19iID0gKChQeUhlYXBUeXBlT2JqZWN0ICopYiktPmh0X3Nsb3RzOwotCWlmIChzbG90c19hICYmIHNsb3RzX2IpIHsKLQkJaWYgKFB5T2JqZWN0X0NvbXBhcmUoc2xvdHNfYSwgc2xvdHNfYikgIT0gMCkKLQkJCXJldHVybiAwOwotCQlzaXplICs9IHNpemVvZihQeU9iamVjdCAqKSAqIFB5VHVwbGVfR0VUX1NJWkUoc2xvdHNfYSk7Ci0JfQotCXJldHVybiBzaXplID09IGEtPnRwX2Jhc2ljc2l6ZSAmJiBzaXplID09IGItPnRwX2Jhc2ljc2l6ZTsKKyAgICAvKiBDaGVjayBzbG90cyBjb21wbGlhbmNlICovCisgICAgc2xvdHNfYSA9ICgoUHlIZWFwVHlwZU9iamVjdCAqKWEpLT5odF9zbG90czsKKyAgICBzbG90c19iID0gKChQeUhlYXBUeXBlT2JqZWN0ICopYiktPmh0X3Nsb3RzOworICAgIGlmIChzbG90c19hICYmIHNsb3RzX2IpIHsKKyAgICAgICAgaWYgKFB5T2JqZWN0X0NvbXBhcmUoc2xvdHNfYSwgc2xvdHNfYikgIT0gMCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBzaXplICs9IHNpemVvZihQeU9iamVjdCAqKSAqIFB5VHVwbGVfR0VUX1NJWkUoc2xvdHNfYSk7CisgICAgfQorICAgIHJldHVybiBzaXplID09IGEtPnRwX2Jhc2ljc2l6ZSAmJiBzaXplID09IGItPnRwX2Jhc2ljc2l6ZTsKIH0KIAogc3RhdGljIGludAogY29tcGF0aWJsZV9mb3JfYXNzaWdubWVudChQeVR5cGVPYmplY3QqIG9sZHRvLCBQeVR5cGVPYmplY3QqIG5ld3RvLCBjaGFyKiBhdHRyKQogewotCVB5VHlwZU9iamVjdCAqbmV3YmFzZSwgKm9sZGJhc2U7CisgICAgUHlUeXBlT2JqZWN0ICpuZXdiYXNlLCAqb2xkYmFzZTsKIAotCWlmIChuZXd0by0+dHBfZGVhbGxvYyAhPSBvbGR0by0+dHBfZGVhbGxvYyB8fAotCSAgICBuZXd0by0+dHBfZnJlZSAhPSBvbGR0by0+dHBfZnJlZSkKLQl7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgICIlcyBhc3NpZ25tZW50OiAiCi0JCQkgICAgICInJXMnIGRlYWxsb2NhdG9yIGRpZmZlcnMgZnJvbSAnJXMnIiwKLQkJCSAgICAgYXR0ciwKLQkJCSAgICAgbmV3dG8tPnRwX25hbWUsCi0JCQkgICAgIG9sZHRvLT50cF9uYW1lKTsKLQkJcmV0dXJuIDA7Ci0JfQotCW5ld2Jhc2UgPSBuZXd0bzsKLQlvbGRiYXNlID0gb2xkdG87Ci0Jd2hpbGUgKGVxdWl2X3N0cnVjdHMobmV3YmFzZSwgbmV3YmFzZS0+dHBfYmFzZSkpCi0JCW5ld2Jhc2UgPSBuZXdiYXNlLT50cF9iYXNlOwotCXdoaWxlIChlcXVpdl9zdHJ1Y3RzKG9sZGJhc2UsIG9sZGJhc2UtPnRwX2Jhc2UpKQotCQlvbGRiYXNlID0gb2xkYmFzZS0+dHBfYmFzZTsKLQlpZiAobmV3YmFzZSAhPSBvbGRiYXNlICYmCi0JICAgIChuZXdiYXNlLT50cF9iYXNlICE9IG9sZGJhc2UtPnRwX2Jhc2UgfHwKLQkgICAgICFzYW1lX3Nsb3RzX2FkZGVkKG5ld2Jhc2UsIG9sZGJhc2UpKSkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJICAgICAiJXMgYXNzaWdubWVudDogIgotCQkJICAgICAiJyVzJyBvYmplY3QgbGF5b3V0IGRpZmZlcnMgZnJvbSAnJXMnIiwKLQkJCSAgICAgYXR0ciwKLQkJCSAgICAgbmV3dG8tPnRwX25hbWUsCi0JCQkgICAgIG9sZHRvLT50cF9uYW1lKTsKLQkJcmV0dXJuIDA7Ci0JfQorICAgIGlmIChuZXd0by0+dHBfZGVhbGxvYyAhPSBvbGR0by0+dHBfZGVhbGxvYyB8fAorICAgICAgICBuZXd0by0+dHBfZnJlZSAhPSBvbGR0by0+dHBfZnJlZSkKKyAgICB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiJXMgYXNzaWdubWVudDogIgorICAgICAgICAgICAgICAgICAgICAgIiclcycgZGVhbGxvY2F0b3IgZGlmZmVycyBmcm9tICclcyciLAorICAgICAgICAgICAgICAgICAgICAgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgIG5ld3RvLT50cF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgb2xkdG8tPnRwX25hbWUpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgbmV3YmFzZSA9IG5ld3RvOworICAgIG9sZGJhc2UgPSBvbGR0bzsKKyAgICB3aGlsZSAoZXF1aXZfc3RydWN0cyhuZXdiYXNlLCBuZXdiYXNlLT50cF9iYXNlKSkKKyAgICAgICAgbmV3YmFzZSA9IG5ld2Jhc2UtPnRwX2Jhc2U7CisgICAgd2hpbGUgKGVxdWl2X3N0cnVjdHMob2xkYmFzZSwgb2xkYmFzZS0+dHBfYmFzZSkpCisgICAgICAgIG9sZGJhc2UgPSBvbGRiYXNlLT50cF9iYXNlOworICAgIGlmIChuZXdiYXNlICE9IG9sZGJhc2UgJiYKKyAgICAgICAgKG5ld2Jhc2UtPnRwX2Jhc2UgIT0gb2xkYmFzZS0+dHBfYmFzZSB8fAorICAgICAgICAgIXNhbWVfc2xvdHNfYWRkZWQobmV3YmFzZSwgb2xkYmFzZSkpKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiJXMgYXNzaWdubWVudDogIgorICAgICAgICAgICAgICAgICAgICAgIiclcycgb2JqZWN0IGxheW91dCBkaWZmZXJzIGZyb20gJyVzJyIsCisgICAgICAgICAgICAgICAgICAgICBhdHRyLAorICAgICAgICAgICAgICAgICAgICAgbmV3dG8tPnRwX25hbWUsCisgICAgICAgICAgICAgICAgICAgICBvbGR0by0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KIAotCXJldHVybiAxOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgaW50CiBvYmplY3Rfc2V0X2NsYXNzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdmFsdWUsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JUHlUeXBlT2JqZWN0ICpvbGR0byA9IFB5X1RZUEUoc2VsZik7Ci0JUHlUeXBlT2JqZWN0ICpuZXd0bzsKKyAgICBQeVR5cGVPYmplY3QgKm9sZHRvID0gUHlfVFlQRShzZWxmKTsKKyAgICBQeVR5cGVPYmplY3QgKm5ld3RvOwogCi0JaWYgKHZhbHVlID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiY2FuJ3QgZGVsZXRlIF9fY2xhc3NfXyBhdHRyaWJ1dGUiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoIVB5VHlwZV9DaGVjayh2YWx1ZSkpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJICAiX19jbGFzc19fIG11c3QgYmUgc2V0IHRvIG5ldy1zdHlsZSBjbGFzcywgbm90ICclcycgb2JqZWN0IiwKLQkJICBQeV9UWVBFKHZhbHVlKS0+dHBfbmFtZSk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JbmV3dG8gPSAoUHlUeXBlT2JqZWN0ICopdmFsdWU7Ci0JaWYgKCEobmV3dG8tPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IRUFQVFlQRSkgfHwKLQkgICAgIShvbGR0by0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hFQVBUWVBFKSkKLQl7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgICJfX2NsYXNzX18gYXNzaWdubWVudDogb25seSBmb3IgaGVhcCB0eXBlcyIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmIChjb21wYXRpYmxlX2Zvcl9hc3NpZ25tZW50KG5ld3RvLCBvbGR0bywgIl9fY2xhc3NfXyIpKSB7Ci0JCVB5X0lOQ1JFRihuZXd0byk7Ci0JCVB5X1RZUEUoc2VsZikgPSBuZXd0bzsKLQkJUHlfREVDUkVGKG9sZHRvKTsKLQkJcmV0dXJuIDA7Ci0JfQotCWVsc2UgewotCQlyZXR1cm4gLTE7Ci0JfQorICAgIGlmICh2YWx1ZSA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiY2FuJ3QgZGVsZXRlIF9fY2xhc3NfXyBhdHRyaWJ1dGUiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoIVB5VHlwZV9DaGVjayh2YWx1ZSkpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAiX19jbGFzc19fIG11c3QgYmUgc2V0IHRvIG5ldy1zdHlsZSBjbGFzcywgbm90ICclcycgb2JqZWN0IiwKKyAgICAgICAgICBQeV9UWVBFKHZhbHVlKS0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbmV3dG8gPSAoUHlUeXBlT2JqZWN0ICopdmFsdWU7CisgICAgaWYgKCEobmV3dG8tPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IRUFQVFlQRSkgfHwKKyAgICAgICAgIShvbGR0by0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hFQVBUWVBFKSkKKyAgICB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiX19jbGFzc19fIGFzc2lnbm1lbnQ6IG9ubHkgZm9yIGhlYXAgdHlwZXMiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoY29tcGF0aWJsZV9mb3JfYXNzaWdubWVudChuZXd0bywgb2xkdG8sICJfX2NsYXNzX18iKSkgeworICAgICAgICBQeV9JTkNSRUYobmV3dG8pOworICAgICAgICBQeV9UWVBFKHNlbGYpID0gbmV3dG87CisgICAgICAgIFB5X0RFQ1JFRihvbGR0byk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIH0KIAogc3RhdGljIFB5R2V0U2V0RGVmIG9iamVjdF9nZXRzZXRzW10gPSB7Ci0JeyJfX2NsYXNzX18iLCBvYmplY3RfZ2V0X2NsYXNzLCBvYmplY3Rfc2V0X2NsYXNzLAotCSBQeURvY19TVFIoInRoZSBvYmplY3QncyBjbGFzcyIpfSwKLQl7MH0KKyAgICB7Il9fY2xhc3NfXyIsIG9iamVjdF9nZXRfY2xhc3MsIG9iamVjdF9zZXRfY2xhc3MsCisgICAgIFB5RG9jX1NUUigidGhlIG9iamVjdCdzIGNsYXNzIil9LAorICAgIHswfQogfTsKIAogCkBAIC0zMTEyLDE5MCArMzExMiwxOTAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbXBvcnRfY29weXJlZyh2b2lkKQogewotCXN0YXRpYyBQeU9iamVjdCAqY29weXJlZ19zdHI7CisgICAgc3RhdGljIFB5T2JqZWN0ICpjb3B5cmVnX3N0cjsKIAotCWlmICghY29weXJlZ19zdHIpIHsKLQkJY29weXJlZ19zdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJjb3B5X3JlZyIpOwotCQlpZiAoY29weXJlZ19zdHIgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoIWNvcHlyZWdfc3RyKSB7CisgICAgICAgIGNvcHlyZWdfc3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiY29weV9yZWciKTsKKyAgICAgICAgaWYgKGNvcHlyZWdfc3RyID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlyZXR1cm4gUHlJbXBvcnRfSW1wb3J0KGNvcHlyZWdfc3RyKTsKKyAgICByZXR1cm4gUHlJbXBvcnRfSW1wb3J0KGNvcHlyZWdfc3RyKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNsb3RuYW1lcyhQeU9iamVjdCAqY2xzKQogewotCVB5T2JqZWN0ICpjbHNkaWN0OwotCVB5T2JqZWN0ICpjb3B5cmVnOwotCVB5T2JqZWN0ICpzbG90bmFtZXM7CisgICAgUHlPYmplY3QgKmNsc2RpY3Q7CisgICAgUHlPYmplY3QgKmNvcHlyZWc7CisgICAgUHlPYmplY3QgKnNsb3RuYW1lczsKIAotCWlmICghUHlUeXBlX0NoZWNrKGNscykpIHsKLQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQlyZXR1cm4gUHlfTm9uZTsKLQl9CisgICAgaWYgKCFQeVR5cGVfQ2hlY2soY2xzKSkgeworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIHJldHVybiBQeV9Ob25lOworICAgIH0KIAotCWNsc2RpY3QgPSAoKFB5VHlwZU9iamVjdCAqKWNscyktPnRwX2RpY3Q7Ci0Jc2xvdG5hbWVzID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoY2xzZGljdCwgIl9fc2xvdG5hbWVzX18iKTsKLQlpZiAoc2xvdG5hbWVzICE9IE5VTEwgJiYgUHlMaXN0X0NoZWNrKHNsb3RuYW1lcykpIHsKLQkJUHlfSU5DUkVGKHNsb3RuYW1lcyk7Ci0JCXJldHVybiBzbG90bmFtZXM7Ci0JfQorICAgIGNsc2RpY3QgPSAoKFB5VHlwZU9iamVjdCAqKWNscyktPnRwX2RpY3Q7CisgICAgc2xvdG5hbWVzID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoY2xzZGljdCwgIl9fc2xvdG5hbWVzX18iKTsKKyAgICBpZiAoc2xvdG5hbWVzICE9IE5VTEwgJiYgUHlMaXN0X0NoZWNrKHNsb3RuYW1lcykpIHsKKyAgICAgICAgUHlfSU5DUkVGKHNsb3RuYW1lcyk7CisgICAgICAgIHJldHVybiBzbG90bmFtZXM7CisgICAgfQogCi0JY29weXJlZyA9IGltcG9ydF9jb3B5cmVnKCk7Ci0JaWYgKGNvcHlyZWcgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgY29weXJlZyA9IGltcG9ydF9jb3B5cmVnKCk7CisgICAgaWYgKGNvcHlyZWcgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlzbG90bmFtZXMgPSBQeU9iamVjdF9DYWxsTWV0aG9kKGNvcHlyZWcsICJfc2xvdG5hbWVzIiwgIk8iLCBjbHMpOwotCVB5X0RFQ1JFRihjb3B5cmVnKTsKLQlpZiAoc2xvdG5hbWVzICE9IE5VTEwgJiYKLQkgICAgc2xvdG5hbWVzICE9IFB5X05vbmUgJiYKLQkgICAgIVB5TGlzdF9DaGVjayhzbG90bmFtZXMpKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCSJjb3B5X3JlZy5fc2xvdG5hbWVzIGRpZG4ndCByZXR1cm4gYSBsaXN0IG9yIE5vbmUiKTsKLQkJUHlfREVDUkVGKHNsb3RuYW1lcyk7Ci0JCXNsb3RuYW1lcyA9IE5VTEw7Ci0JfQorICAgIHNsb3RuYW1lcyA9IFB5T2JqZWN0X0NhbGxNZXRob2QoY29weXJlZywgIl9zbG90bmFtZXMiLCAiTyIsIGNscyk7CisgICAgUHlfREVDUkVGKGNvcHlyZWcpOworICAgIGlmIChzbG90bmFtZXMgIT0gTlVMTCAmJgorICAgICAgICBzbG90bmFtZXMgIT0gUHlfTm9uZSAmJgorICAgICAgICAhUHlMaXN0X0NoZWNrKHNsb3RuYW1lcykpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgImNvcHlfcmVnLl9zbG90bmFtZXMgZGlkbid0IHJldHVybiBhIGxpc3Qgb3IgTm9uZSIpOworICAgICAgICBQeV9ERUNSRUYoc2xvdG5hbWVzKTsKKyAgICAgICAgc2xvdG5hbWVzID0gTlVMTDsKKyAgICB9CiAKLQlyZXR1cm4gc2xvdG5hbWVzOworICAgIHJldHVybiBzbG90bmFtZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiByZWR1Y2VfMihQeU9iamVjdCAqb2JqKQogewotCVB5T2JqZWN0ICpjbHMsICpnZXRuZXdhcmdzOwotCVB5T2JqZWN0ICphcmdzID0gTlVMTCwgKmFyZ3MyID0gTlVMTDsKLQlQeU9iamVjdCAqZ2V0c3RhdGUgPSBOVUxMLCAqc3RhdGUgPSBOVUxMLCAqbmFtZXMgPSBOVUxMOwotCVB5T2JqZWN0ICpzbG90cyA9IE5VTEwsICpsaXN0aXRlbXMgPSBOVUxMLCAqZGljdGl0ZW1zID0gTlVMTDsKLQlQeU9iamVjdCAqY29weXJlZyA9IE5VTEwsICpuZXdvYmogPSBOVUxMLCAqcmVzID0gTlVMTDsKLQlQeV9zc2l6ZV90IGksIG47CisgICAgUHlPYmplY3QgKmNscywgKmdldG5ld2FyZ3M7CisgICAgUHlPYmplY3QgKmFyZ3MgPSBOVUxMLCAqYXJnczIgPSBOVUxMOworICAgIFB5T2JqZWN0ICpnZXRzdGF0ZSA9IE5VTEwsICpzdGF0ZSA9IE5VTEwsICpuYW1lcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKnNsb3RzID0gTlVMTCwgKmxpc3RpdGVtcyA9IE5VTEwsICpkaWN0aXRlbXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpjb3B5cmVnID0gTlVMTCwgKm5ld29iaiA9IE5VTEwsICpyZXMgPSBOVUxMOworICAgIFB5X3NzaXplX3QgaSwgbjsKIAotCWNscyA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcob2JqLCAiX19jbGFzc19fIik7Ci0JaWYgKGNscyA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBjbHMgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKG9iaiwgIl9fY2xhc3NfXyIpOworICAgIGlmIChjbHMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlnZXRuZXdhcmdzID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhvYmosICJfX2dldG5ld2FyZ3NfXyIpOwotCWlmIChnZXRuZXdhcmdzICE9IE5VTEwpIHsKLQkJYXJncyA9IFB5T2JqZWN0X0NhbGxPYmplY3QoZ2V0bmV3YXJncywgTlVMTCk7Ci0JCVB5X0RFQ1JFRihnZXRuZXdhcmdzKTsKLQkJaWYgKGFyZ3MgIT0gTlVMTCAmJiAhUHlUdXBsZV9DaGVjayhhcmdzKSkgewotCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiX19nZXRuZXdhcmdzX18gc2hvdWxkIHJldHVybiBhIHR1cGxlLCAiCi0JCQkJIm5vdCAnJS4yMDBzJyIsIFB5X1RZUEUoYXJncyktPnRwX25hbWUpOwotCQkJZ290byBlbmQ7Ci0JCX0KLQl9Ci0JZWxzZSB7Ci0JCVB5RXJyX0NsZWFyKCk7Ci0JCWFyZ3MgPSBQeVR1cGxlX05ldygwKTsKLQl9Ci0JaWYgKGFyZ3MgPT0gTlVMTCkKLQkJZ290byBlbmQ7CisgICAgZ2V0bmV3YXJncyA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcob2JqLCAiX19nZXRuZXdhcmdzX18iKTsKKyAgICBpZiAoZ2V0bmV3YXJncyAhPSBOVUxMKSB7CisgICAgICAgIGFyZ3MgPSBQeU9iamVjdF9DYWxsT2JqZWN0KGdldG5ld2FyZ3MsIE5VTEwpOworICAgICAgICBQeV9ERUNSRUYoZ2V0bmV3YXJncyk7CisgICAgICAgIGlmIChhcmdzICE9IE5VTEwgJiYgIVB5VHVwbGVfQ2hlY2soYXJncykpIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgIl9fZ2V0bmV3YXJnc19fIHNob3VsZCByZXR1cm4gYSB0dXBsZSwgIgorICAgICAgICAgICAgICAgICJub3QgJyUuMjAwcyciLCBQeV9UWVBFKGFyZ3MpLT50cF9uYW1lKTsKKyAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBhcmdzID0gUHlUdXBsZV9OZXcoMCk7CisgICAgfQorICAgIGlmIChhcmdzID09IE5VTEwpCisgICAgICAgIGdvdG8gZW5kOwogCi0JZ2V0c3RhdGUgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKG9iaiwgIl9fZ2V0c3RhdGVfXyIpOwotCWlmIChnZXRzdGF0ZSAhPSBOVUxMKSB7Ci0JCXN0YXRlID0gUHlPYmplY3RfQ2FsbE9iamVjdChnZXRzdGF0ZSwgTlVMTCk7Ci0JCVB5X0RFQ1JFRihnZXRzdGF0ZSk7Ci0JCWlmIChzdGF0ZSA9PSBOVUxMKQotCQkJZ290byBlbmQ7Ci0JfQotCWVsc2UgewotCQlQeUVycl9DbGVhcigpOwotCQlzdGF0ZSA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcob2JqLCAiX19kaWN0X18iKTsKLQkJaWYgKHN0YXRlID09IE5VTEwpIHsKLQkJCVB5RXJyX0NsZWFyKCk7Ci0JCQlzdGF0ZSA9IFB5X05vbmU7Ci0JCQlQeV9JTkNSRUYoc3RhdGUpOwotCQl9Ci0JCW5hbWVzID0gc2xvdG5hbWVzKGNscyk7Ci0JCWlmIChuYW1lcyA9PSBOVUxMKQotCQkJZ290byBlbmQ7Ci0JCWlmIChuYW1lcyAhPSBQeV9Ob25lKSB7Ci0JCQlhc3NlcnQoUHlMaXN0X0NoZWNrKG5hbWVzKSk7Ci0JCQlzbG90cyA9IFB5RGljdF9OZXcoKTsKLQkJCWlmIChzbG90cyA9PSBOVUxMKQotCQkJCWdvdG8gZW5kOwotCQkJbiA9IDA7Ci0JCQkvKiBDYW4ndCBwcmUtY29tcHV0ZSB0aGUgbGlzdCBzaXplOyB0aGUgbGlzdAotCQkJICAgaXMgc3RvcmVkIG9uIHRoZSBjbGFzcyBzbyBhY2Nlc3NpYmxlIHRvIG90aGVyCi0JCQkgICB0aHJlYWRzLCB3aGljaCBtYXkgYmUgcnVuIGJ5IERFQ1JFRiAqLwotCQkJZm9yIChpID0gMDsgaSA8IFB5TGlzdF9HRVRfU0laRShuYW1lcyk7IGkrKykgewotCQkJCVB5T2JqZWN0ICpuYW1lLCAqdmFsdWU7Ci0JCQkJbmFtZSA9IFB5TGlzdF9HRVRfSVRFTShuYW1lcywgaSk7Ci0JCQkJdmFsdWUgPSBQeU9iamVjdF9HZXRBdHRyKG9iaiwgbmFtZSk7Ci0JCQkJaWYgKHZhbHVlID09IE5VTEwpCi0JCQkJCVB5RXJyX0NsZWFyKCk7Ci0JCQkJZWxzZSB7Ci0JCQkJCWludCBlcnIgPSBQeURpY3RfU2V0SXRlbShzbG90cywgbmFtZSwKLQkJCQkJCQkJIHZhbHVlKTsKLQkJCQkJUHlfREVDUkVGKHZhbHVlKTsKLQkJCQkJaWYgKGVycikKLQkJCQkJCWdvdG8gZW5kOwotCQkJCQluKys7Ci0JCQkJfQotCQkJfQotCQkJaWYgKG4pIHsKLQkJCQlzdGF0ZSA9IFB5X0J1aWxkVmFsdWUoIihOTykiLCBzdGF0ZSwgc2xvdHMpOwotCQkJCWlmIChzdGF0ZSA9PSBOVUxMKQotCQkJCQlnb3RvIGVuZDsKLQkJCX0KLQkJfQotCX0KKyAgICBnZXRzdGF0ZSA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcob2JqLCAiX19nZXRzdGF0ZV9fIik7CisgICAgaWYgKGdldHN0YXRlICE9IE5VTEwpIHsKKyAgICAgICAgc3RhdGUgPSBQeU9iamVjdF9DYWxsT2JqZWN0KGdldHN0YXRlLCBOVUxMKTsKKyAgICAgICAgUHlfREVDUkVGKGdldHN0YXRlKTsKKyAgICAgICAgaWYgKHN0YXRlID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIHN0YXRlID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhvYmosICJfX2RpY3RfXyIpOworICAgICAgICBpZiAoc3RhdGUgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgIHN0YXRlID0gUHlfTm9uZTsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihzdGF0ZSk7CisgICAgICAgIH0KKyAgICAgICAgbmFtZXMgPSBzbG90bmFtZXMoY2xzKTsKKyAgICAgICAgaWYgKG5hbWVzID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgaWYgKG5hbWVzICE9IFB5X05vbmUpIHsKKyAgICAgICAgICAgIGFzc2VydChQeUxpc3RfQ2hlY2sobmFtZXMpKTsKKyAgICAgICAgICAgIHNsb3RzID0gUHlEaWN0X05ldygpOworICAgICAgICAgICAgaWYgKHNsb3RzID09IE5VTEwpCisgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgICAgICBuID0gMDsKKyAgICAgICAgICAgIC8qIENhbid0IHByZS1jb21wdXRlIHRoZSBsaXN0IHNpemU7IHRoZSBsaXN0CisgICAgICAgICAgICAgICBpcyBzdG9yZWQgb24gdGhlIGNsYXNzIHNvIGFjY2Vzc2libGUgdG8gb3RoZXIKKyAgICAgICAgICAgICAgIHRocmVhZHMsIHdoaWNoIG1heSBiZSBydW4gYnkgREVDUkVGICovCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgUHlMaXN0X0dFVF9TSVpFKG5hbWVzKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgUHlPYmplY3QgKm5hbWUsICp2YWx1ZTsKKyAgICAgICAgICAgICAgICBuYW1lID0gUHlMaXN0X0dFVF9JVEVNKG5hbWVzLCBpKTsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IFB5T2JqZWN0X0dldEF0dHIob2JqLCBuYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGVyciA9IFB5RGljdF9TZXRJdGVtKHNsb3RzLCBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUpOworICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYodmFsdWUpOworICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKQorICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgICAgICAgICAgICAgIG4rKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobikgeworICAgICAgICAgICAgICAgIHN0YXRlID0gUHlfQnVpbGRWYWx1ZSgiKE5PKSIsIHN0YXRlLCBzbG90cyk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXRlID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogCi0JaWYgKCFQeUxpc3RfQ2hlY2sob2JqKSkgewotCQlsaXN0aXRlbXMgPSBQeV9Ob25lOwotCQlQeV9JTkNSRUYobGlzdGl0ZW1zKTsKLQl9Ci0JZWxzZSB7Ci0JCWxpc3RpdGVtcyA9IFB5T2JqZWN0X0dldEl0ZXIob2JqKTsKLQkJaWYgKGxpc3RpdGVtcyA9PSBOVUxMKQotCQkJZ290byBlbmQ7Ci0JfQorICAgIGlmICghUHlMaXN0X0NoZWNrKG9iaikpIHsKKyAgICAgICAgbGlzdGl0ZW1zID0gUHlfTm9uZTsKKyAgICAgICAgUHlfSU5DUkVGKGxpc3RpdGVtcyk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBsaXN0aXRlbXMgPSBQeU9iamVjdF9HZXRJdGVyKG9iaik7CisgICAgICAgIGlmIChsaXN0aXRlbXMgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gZW5kOworICAgIH0KIAotCWlmICghUHlEaWN0X0NoZWNrKG9iaikpIHsKLQkJZGljdGl0ZW1zID0gUHlfTm9uZTsKLQkJUHlfSU5DUkVGKGRpY3RpdGVtcyk7Ci0JfQotCWVsc2UgewotCQlkaWN0aXRlbXMgPSBQeU9iamVjdF9DYWxsTWV0aG9kKG9iaiwgIml0ZXJpdGVtcyIsICIiKTsKLQkJaWYgKGRpY3RpdGVtcyA9PSBOVUxMKQotCQkJZ290byBlbmQ7Ci0JfQorICAgIGlmICghUHlEaWN0X0NoZWNrKG9iaikpIHsKKyAgICAgICAgZGljdGl0ZW1zID0gUHlfTm9uZTsKKyAgICAgICAgUHlfSU5DUkVGKGRpY3RpdGVtcyk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBkaWN0aXRlbXMgPSBQeU9iamVjdF9DYWxsTWV0aG9kKG9iaiwgIml0ZXJpdGVtcyIsICIiKTsKKyAgICAgICAgaWYgKGRpY3RpdGVtcyA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBlbmQ7CisgICAgfQogCi0JY29weXJlZyA9IGltcG9ydF9jb3B5cmVnKCk7Ci0JaWYgKGNvcHlyZWcgPT0gTlVMTCkKLQkJZ290byBlbmQ7Ci0JbmV3b2JqID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhjb3B5cmVnLCAiX19uZXdvYmpfXyIpOwotCWlmIChuZXdvYmogPT0gTlVMTCkKLQkJZ290byBlbmQ7CisgICAgY29weXJlZyA9IGltcG9ydF9jb3B5cmVnKCk7CisgICAgaWYgKGNvcHlyZWcgPT0gTlVMTCkKKyAgICAgICAgZ290byBlbmQ7CisgICAgbmV3b2JqID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhjb3B5cmVnLCAiX19uZXdvYmpfXyIpOworICAgIGlmIChuZXdvYmogPT0gTlVMTCkKKyAgICAgICAgZ290byBlbmQ7CiAKLQluID0gUHlUdXBsZV9HRVRfU0laRShhcmdzKTsKLQlhcmdzMiA9IFB5VHVwbGVfTmV3KG4rMSk7Ci0JaWYgKGFyZ3MyID09IE5VTEwpCi0JCWdvdG8gZW5kOwotCVB5VHVwbGVfU0VUX0lURU0oYXJnczIsIDAsIGNscyk7Ci0JY2xzID0gTlVMTDsKLQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCVB5T2JqZWN0ICp2ID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCBpKTsKLQkJUHlfSU5DUkVGKHYpOwotCQlQeVR1cGxlX1NFVF9JVEVNKGFyZ3MyLCBpKzEsIHYpOwotCX0KKyAgICBuID0gUHlUdXBsZV9HRVRfU0laRShhcmdzKTsKKyAgICBhcmdzMiA9IFB5VHVwbGVfTmV3KG4rMSk7CisgICAgaWYgKGFyZ3MyID09IE5VTEwpCisgICAgICAgIGdvdG8gZW5kOworICAgIFB5VHVwbGVfU0VUX0lURU0oYXJnczIsIDAsIGNscyk7CisgICAgY2xzID0gTlVMTDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIFB5T2JqZWN0ICp2ID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCBpKTsKKyAgICAgICAgUHlfSU5DUkVGKHYpOworICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKGFyZ3MyLCBpKzEsIHYpOworICAgIH0KIAotCXJlcyA9IFB5VHVwbGVfUGFjayg1LCBuZXdvYmosIGFyZ3MyLCBzdGF0ZSwgbGlzdGl0ZW1zLCBkaWN0aXRlbXMpOworICAgIHJlcyA9IFB5VHVwbGVfUGFjayg1LCBuZXdvYmosIGFyZ3MyLCBzdGF0ZSwgbGlzdGl0ZW1zLCBkaWN0aXRlbXMpOwogCiAgIGVuZDoKLQlQeV9YREVDUkVGKGNscyk7Ci0JUHlfWERFQ1JFRihhcmdzKTsKLQlQeV9YREVDUkVGKGFyZ3MyKTsKLQlQeV9YREVDUkVGKHNsb3RzKTsKLQlQeV9YREVDUkVGKHN0YXRlKTsKLQlQeV9YREVDUkVGKG5hbWVzKTsKLQlQeV9YREVDUkVGKGxpc3RpdGVtcyk7Ci0JUHlfWERFQ1JFRihkaWN0aXRlbXMpOwotCVB5X1hERUNSRUYoY29weXJlZyk7Ci0JUHlfWERFQ1JFRihuZXdvYmopOwotCXJldHVybiByZXM7CisgICAgUHlfWERFQ1JFRihjbHMpOworICAgIFB5X1hERUNSRUYoYXJncyk7CisgICAgUHlfWERFQ1JFRihhcmdzMik7CisgICAgUHlfWERFQ1JFRihzbG90cyk7CisgICAgUHlfWERFQ1JFRihzdGF0ZSk7CisgICAgUHlfWERFQ1JFRihuYW1lcyk7CisgICAgUHlfWERFQ1JFRihsaXN0aXRlbXMpOworICAgIFB5X1hERUNSRUYoZGljdGl0ZW1zKTsKKyAgICBQeV9YREVDUkVGKGNvcHlyZWcpOworICAgIFB5X1hERUNSRUYobmV3b2JqKTsKKyAgICByZXR1cm4gcmVzOwogfQogCiAvKgpAQCAtMzMxNiw3OSArMzMxNiw3OSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIF9jb21tb25fcmVkdWNlKFB5T2JqZWN0ICpzZWxmLCBpbnQgcHJvdG8pCiB7Ci0JUHlPYmplY3QgKmNvcHlyZWcsICpyZXM7CisgICAgUHlPYmplY3QgKmNvcHlyZWcsICpyZXM7CiAKLQlpZiAocHJvdG8gPj0gMikKLQkJcmV0dXJuIHJlZHVjZV8yKHNlbGYpOworICAgIGlmIChwcm90byA+PSAyKQorICAgICAgICByZXR1cm4gcmVkdWNlXzIoc2VsZik7CiAKLQljb3B5cmVnID0gaW1wb3J0X2NvcHlyZWcoKTsKLQlpZiAoIWNvcHlyZWcpCi0JCXJldHVybiBOVUxMOworICAgIGNvcHlyZWcgPSBpbXBvcnRfY29weXJlZygpOworICAgIGlmICghY29weXJlZykKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlyZXMgPSBQeUV2YWxfQ2FsbE1ldGhvZChjb3B5cmVnLCAiX3JlZHVjZV9leCIsICIoT2kpIiwgc2VsZiwgcHJvdG8pOwotCVB5X0RFQ1JFRihjb3B5cmVnKTsKKyAgICByZXMgPSBQeUV2YWxfQ2FsbE1ldGhvZChjb3B5cmVnLCAiX3JlZHVjZV9leCIsICIoT2kpIiwgc2VsZiwgcHJvdG8pOworICAgIFB5X0RFQ1JFRihjb3B5cmVnKTsKIAotCXJldHVybiByZXM7CisgICAgcmV0dXJuIHJlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG9iamVjdF9yZWR1Y2UoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBwcm90byA9IDA7CisgICAgaW50IHByb3RvID0gMDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifGk6X19yZWR1Y2VfXyIsICZwcm90bykpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifGk6X19yZWR1Y2VfXyIsICZwcm90bykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JcmV0dXJuIF9jb21tb25fcmVkdWNlKHNlbGYsIHByb3RvKTsKKyAgICByZXR1cm4gX2NvbW1vbl9yZWR1Y2Uoc2VsZiwgcHJvdG8pOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogb2JqZWN0X3JlZHVjZV9leChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKnJlZHVjZSwgKnJlczsKLQlpbnQgcHJvdG8gPSAwOworICAgIFB5T2JqZWN0ICpyZWR1Y2UsICpyZXM7CisgICAgaW50IHByb3RvID0gMDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifGk6X19yZWR1Y2VfZXhfXyIsICZwcm90bykpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifGk6X19yZWR1Y2VfZXhfXyIsICZwcm90bykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JcmVkdWNlID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhzZWxmLCAiX19yZWR1Y2VfXyIpOwotCWlmIChyZWR1Y2UgPT0gTlVMTCkKLQkJUHlFcnJfQ2xlYXIoKTsKLQllbHNlIHsKLQkJUHlPYmplY3QgKmNscywgKmNsc3JlZHVjZSwgKm9ianJlZHVjZTsKLQkJaW50IG92ZXJyaWRlOwotCQljbHMgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHNlbGYsICJfX2NsYXNzX18iKTsKLQkJaWYgKGNscyA9PSBOVUxMKSB7Ci0JCQlQeV9ERUNSRUYocmVkdWNlKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWNsc3JlZHVjZSA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoY2xzLCAiX19yZWR1Y2VfXyIpOwotCQlQeV9ERUNSRUYoY2xzKTsKLQkJaWYgKGNsc3JlZHVjZSA9PSBOVUxMKSB7Ci0JCQlQeV9ERUNSRUYocmVkdWNlKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCW9ianJlZHVjZSA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKFB5QmFzZU9iamVjdF9UeXBlLnRwX2RpY3QsCi0JCQkJCQkgIl9fcmVkdWNlX18iKTsKLQkJb3ZlcnJpZGUgPSAoY2xzcmVkdWNlICE9IG9ianJlZHVjZSk7Ci0JCVB5X0RFQ1JFRihjbHNyZWR1Y2UpOwotCQlpZiAob3ZlcnJpZGUpIHsKLQkJCXJlcyA9IFB5T2JqZWN0X0NhbGxPYmplY3QocmVkdWNlLCBOVUxMKTsKLQkJCVB5X0RFQ1JFRihyZWR1Y2UpOwotCQkJcmV0dXJuIHJlczsKLQkJfQotCQllbHNlCi0JCQlQeV9ERUNSRUYocmVkdWNlKTsKLQl9CisgICAgcmVkdWNlID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhzZWxmLCAiX19yZWR1Y2VfXyIpOworICAgIGlmIChyZWR1Y2UgPT0gTlVMTCkKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICBlbHNlIHsKKyAgICAgICAgUHlPYmplY3QgKmNscywgKmNsc3JlZHVjZSwgKm9ianJlZHVjZTsKKyAgICAgICAgaW50IG92ZXJyaWRlOworICAgICAgICBjbHMgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHNlbGYsICJfX2NsYXNzX18iKTsKKyAgICAgICAgaWYgKGNscyA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYocmVkdWNlKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGNsc3JlZHVjZSA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoY2xzLCAiX19yZWR1Y2VfXyIpOworICAgICAgICBQeV9ERUNSRUYoY2xzKTsKKyAgICAgICAgaWYgKGNsc3JlZHVjZSA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYocmVkdWNlKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIG9ianJlZHVjZSA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKFB5QmFzZU9iamVjdF9UeXBlLnRwX2RpY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfX3JlZHVjZV9fIik7CisgICAgICAgIG92ZXJyaWRlID0gKGNsc3JlZHVjZSAhPSBvYmpyZWR1Y2UpOworICAgICAgICBQeV9ERUNSRUYoY2xzcmVkdWNlKTsKKyAgICAgICAgaWYgKG92ZXJyaWRlKSB7CisgICAgICAgICAgICByZXMgPSBQeU9iamVjdF9DYWxsT2JqZWN0KHJlZHVjZSwgTlVMTCk7CisgICAgICAgICAgICBQeV9ERUNSRUYocmVkdWNlKTsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgUHlfREVDUkVGKHJlZHVjZSk7CisgICAgfQogCi0JcmV0dXJuIF9jb21tb25fcmVkdWNlKHNlbGYsIHByb3RvKTsKKyAgICByZXR1cm4gX2NvbW1vbl9yZWR1Y2Uoc2VsZiwgcHJvdG8pOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogb2JqZWN0X3N1YmNsYXNzaG9vayhQeU9iamVjdCAqY2xzLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOwotCXJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKKyAgICBQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOworICAgIHJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKIH0KIAogUHlEb2NfU1RSVkFSKG9iamVjdF9zdWJjbGFzc2hvb2tfZG9jLApAQCAtMzQwNCwxMTQgKzM0MDQsMTE0IEBACiAKICAgIGNsYXNzIG9iamVjdDoKICAgICAgICBkZWYgX19mb3JtYXRfXyhzZWxmLCBmb3JtYXRfc3BlYyk6Ci0gICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZm9ybWF0X3NwZWMsIHN0cik6Ci0gICAgICAgICAgICAgICByZXR1cm4gZm9ybWF0KHN0cihzZWxmKSwgZm9ybWF0X3NwZWMpCi0gICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShmb3JtYXRfc3BlYywgdW5pY29kZSk6Ci0gICAgICAgICAgICAgICByZXR1cm4gZm9ybWF0KHVuaWNvZGUoc2VsZiksIGZvcm1hdF9zcGVjKQorICAgICAgIGlmIGlzaW5zdGFuY2UoZm9ybWF0X3NwZWMsIHN0cik6CisgICAgICAgICAgIHJldHVybiBmb3JtYXQoc3RyKHNlbGYpLCBmb3JtYXRfc3BlYykKKyAgICAgICBlbGlmIGlzaW5zdGFuY2UoZm9ybWF0X3NwZWMsIHVuaWNvZGUpOgorICAgICAgICAgICByZXR1cm4gZm9ybWF0KHVuaWNvZGUoc2VsZiksIGZvcm1hdF9zcGVjKQogKi8KIHN0YXRpYyBQeU9iamVjdCAqCiBvYmplY3RfZm9ybWF0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLSAgICAgICAgUHlPYmplY3QgKmZvcm1hdF9zcGVjOwotICAgICAgICBQeU9iamVjdCAqc2VsZl9hc19zdHIgPSBOVUxMOwotICAgICAgICBQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKLSAgICAgICAgUHlPYmplY3QgKmZvcm1hdF9tZXRoID0gTlVMTDsKKyAgICBQeU9iamVjdCAqZm9ybWF0X3NwZWM7CisgICAgUHlPYmplY3QgKnNlbGZfYXNfc3RyID0gTlVMTDsKKyAgICBQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKKyAgICBQeU9iamVjdCAqZm9ybWF0X21ldGggPSBOVUxMOwogCi0gICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTzpfX2Zvcm1hdF9fIiwgJmZvcm1hdF9zcGVjKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLQlpZiAoUHlVbmljb2RlX0NoZWNrKGZvcm1hdF9zcGVjKSkgewotCSAgICAgICAgc2VsZl9hc19zdHIgPSBQeU9iamVjdF9Vbmljb2RlKHNlbGYpOwotCX0gZWxzZSBpZiAoUHlTdHJpbmdfQ2hlY2soZm9ybWF0X3NwZWMpKSB7Ci0JICAgICAgICBzZWxmX2FzX3N0ciA9IFB5T2JqZWN0X1N0cihzZWxmKTsKLQl9IGVsc2UgewotCSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImFyZ3VtZW50IHRvIF9fZm9ybWF0X18gbXVzdCBiZSB1bmljb2RlIG9yIHN0ciIpOwotCSAgICAgICAgcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTzpfX2Zvcm1hdF9fIiwgJmZvcm1hdF9zcGVjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKFB5VW5pY29kZV9DaGVjayhmb3JtYXRfc3BlYykpIHsKKyAgICAgICAgc2VsZl9hc19zdHIgPSBQeU9iamVjdF9Vbmljb2RlKHNlbGYpOworICAgIH0gZWxzZSBpZiAoUHlTdHJpbmdfQ2hlY2soZm9ybWF0X3NwZWMpKSB7CisgICAgICAgIHNlbGZfYXNfc3RyID0gUHlPYmplY3RfU3RyKHNlbGYpOworICAgIH0gZWxzZSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJhcmd1bWVudCB0byBfX2Zvcm1hdF9fIG11c3QgYmUgdW5pY29kZSBvciBzdHIiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0gICAgICAgIGlmIChzZWxmX2FzX3N0ciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgLyogZmluZCB0aGUgZm9ybWF0IGZ1bmN0aW9uICovCi0gICAgICAgICAgICAgICAgZm9ybWF0X21ldGggPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHNlbGZfYXNfc3RyLCAiX19mb3JtYXRfXyIpOwotICAgICAgICAgICAgICAgIGlmIChmb3JtYXRfbWV0aCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIC8qIGFuZCBjYWxsIGl0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGZvcm1hdF9tZXRoLCBmb3JtYXRfc3BlYywgTlVMTCk7Ci0gICAgICAgICAgICAgICAgfQorICAgIGlmIChzZWxmX2FzX3N0ciAhPSBOVUxMKSB7CisgICAgICAgIC8qIGZpbmQgdGhlIGZvcm1hdCBmdW5jdGlvbiAqLworICAgICAgICBmb3JtYXRfbWV0aCA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoc2VsZl9hc19zdHIsICJfX2Zvcm1hdF9fIik7CisgICAgICAgIGlmIChmb3JtYXRfbWV0aCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAvKiBhbmQgY2FsbCBpdCAqLworICAgICAgICAgICAgcmVzdWx0ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhmb3JtYXRfbWV0aCwgZm9ybWF0X3NwZWMsIE5VTEwpOwogICAgICAgICB9CisgICAgfQogCi0gICAgICAgIFB5X1hERUNSRUYoc2VsZl9hc19zdHIpOwotICAgICAgICBQeV9YREVDUkVGKGZvcm1hdF9tZXRoKTsKKyAgICBQeV9YREVDUkVGKHNlbGZfYXNfc3RyKTsKKyAgICBQeV9YREVDUkVGKGZvcm1hdF9tZXRoKTsKIAotICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBvYmplY3Rfc2l6ZW9mKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeV9zc2l6ZV90IHJlcywgaXNpemU7CisgICAgUHlfc3NpemVfdCByZXMsIGlzaXplOwogCi0JcmVzID0gMDsKLQlpc2l6ZSA9IHNlbGYtPm9iX3R5cGUtPnRwX2l0ZW1zaXplOwotCWlmIChpc2l6ZSA+IDApCi0JCXJlcyA9IHNlbGYtPm9iX3R5cGUtPm9iX3NpemUgKiBpc2l6ZTsKLQlyZXMgKz0gc2VsZi0+b2JfdHlwZS0+dHBfYmFzaWNzaXplOworICAgIHJlcyA9IDA7CisgICAgaXNpemUgPSBzZWxmLT5vYl90eXBlLT50cF9pdGVtc2l6ZTsKKyAgICBpZiAoaXNpemUgPiAwKQorICAgICAgICByZXMgPSBzZWxmLT5vYl90eXBlLT5vYl9zaXplICogaXNpemU7CisgICAgcmVzICs9IHNlbGYtPm9iX3R5cGUtPnRwX2Jhc2ljc2l6ZTsKIAotCXJldHVybiBQeUludF9Gcm9tU3NpemVfdChyZXMpOwkgCisgICAgcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KHJlcyk7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBvYmplY3RfbWV0aG9kc1tdID0gewotCXsiX19yZWR1Y2VfZXhfXyIsIG9iamVjdF9yZWR1Y2VfZXgsIE1FVEhfVkFSQVJHUywKLQkgUHlEb2NfU1RSKCJoZWxwZXIgZm9yIHBpY2tsZSIpfSwKLQl7Il9fcmVkdWNlX18iLCBvYmplY3RfcmVkdWNlLCBNRVRIX1ZBUkFSR1MsCi0JIFB5RG9jX1NUUigiaGVscGVyIGZvciBwaWNrbGUiKX0sCi0JeyJfX3N1YmNsYXNzaG9va19fIiwgb2JqZWN0X3N1YmNsYXNzaG9vaywgTUVUSF9DTEFTUyB8IE1FVEhfVkFSQVJHUywKLQkgb2JqZWN0X3N1YmNsYXNzaG9va19kb2N9LAotICAgICAgICB7Il9fZm9ybWF0X18iLCBvYmplY3RfZm9ybWF0LCBNRVRIX1ZBUkFSR1MsCi0gICAgICAgICBQeURvY19TVFIoImRlZmF1bHQgb2JqZWN0IGZvcm1hdHRlciIpfSwKLSAgICAgICAgeyJfX3NpemVvZl9fIiwgb2JqZWN0X3NpemVvZiwgTUVUSF9OT0FSR1MsCi0gICAgICAgICBQeURvY19TVFIoIl9fc2l6ZW9mX18oKSAtPiBzaXplIG9mIG9iamVjdCBpbiBtZW1vcnksIGluIGJ5dGVzIil9LAotCXswfQorICAgIHsiX19yZWR1Y2VfZXhfXyIsIG9iamVjdF9yZWR1Y2VfZXgsIE1FVEhfVkFSQVJHUywKKyAgICAgUHlEb2NfU1RSKCJoZWxwZXIgZm9yIHBpY2tsZSIpfSwKKyAgICB7Il9fcmVkdWNlX18iLCBvYmplY3RfcmVkdWNlLCBNRVRIX1ZBUkFSR1MsCisgICAgIFB5RG9jX1NUUigiaGVscGVyIGZvciBwaWNrbGUiKX0sCisgICAgeyJfX3N1YmNsYXNzaG9va19fIiwgb2JqZWN0X3N1YmNsYXNzaG9vaywgTUVUSF9DTEFTUyB8IE1FVEhfVkFSQVJHUywKKyAgICAgb2JqZWN0X3N1YmNsYXNzaG9va19kb2N9LAorICAgIHsiX19mb3JtYXRfXyIsIG9iamVjdF9mb3JtYXQsIE1FVEhfVkFSQVJHUywKKyAgICAgUHlEb2NfU1RSKCJkZWZhdWx0IG9iamVjdCBmb3JtYXR0ZXIiKX0sCisgICAgeyJfX3NpemVvZl9fIiwgb2JqZWN0X3NpemVvZiwgTUVUSF9OT0FSR1MsCisgICAgIFB5RG9jX1NUUigiX19zaXplb2ZfXygpIC0+IHNpemUgb2Ygb2JqZWN0IGluIG1lbW9yeSwgaW4gYnl0ZXMiKX0sCisgICAgezB9CiB9OwogCiAKIFB5VHlwZU9iamVjdCBQeUJhc2VPYmplY3RfVHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQotCSJvYmplY3QiLAkJCQkvKiB0cF9uYW1lICovCi0Jc2l6ZW9mKFB5T2JqZWN0KSwJCQkvKiB0cF9iYXNpY3NpemUgKi8KLQkwLAkJCQkJLyogdHBfaXRlbXNpemUgKi8KLQlvYmplY3RfZGVhbGxvYywJCQkJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfY29tcGFyZSAqLwotCW9iamVjdF9yZXByLAkJCQkvKiB0cF9yZXByICovCi0JMCwJCQkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JKGhhc2hmdW5jKV9QeV9IYXNoUG9pbnRlciwJCS8qIHRwX2hhc2ggKi8KLQkwLAkJCQkJLyogdHBfY2FsbCAqLwotCW9iamVjdF9zdHIsCQkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkJLyogdHBfZ2V0YXR0cm8gKi8KLQlQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCi0JUHlEb2NfU1RSKCJUaGUgbW9zdCBiYXNlIHR5cGUiKSwJLyogdHBfZG9jICovCi0JMCwJCQkJCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkJLyogdHBfaXRlcm5leHQgKi8KLQlvYmplY3RfbWV0aG9kcywJCQkJLyogdHBfbWV0aG9kcyAqLwotCTAsCQkJCQkvKiB0cF9tZW1iZXJzICovCi0Jb2JqZWN0X2dldHNldHMsCQkJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJCS8qIHRwX2RpY3QgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCi0Jb2JqZWN0X2luaXQsCQkJCS8qIHRwX2luaXQgKi8KLQlQeVR5cGVfR2VuZXJpY0FsbG9jLAkJCS8qIHRwX2FsbG9jICovCi0Jb2JqZWN0X25ldywJCQkJLyogdHBfbmV3ICovCi0JUHlPYmplY3RfRGVsLAkJCQkvKiB0cF9mcmVlICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKKyAgICAib2JqZWN0IiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICBzaXplb2YoUHlPYmplY3QpLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICBvYmplY3RfZGVhbGxvYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgb2JqZWN0X3JlcHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKV9QeV9IYXNoUG9pbnRlciwgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgb2JqZWN0X3N0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KKyAgICBQeURvY19TVFIoIlRoZSBtb3N0IGJhc2UgdHlwZSIpLCAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgb2JqZWN0X21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgb2JqZWN0X2dldHNldHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgb2JqZWN0X2luaXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgUHlUeXBlX0dlbmVyaWNBbGxvYywgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIG9iamVjdF9uZXcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgUHlPYmplY3RfRGVsLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCiB9OwogCiAKQEAgLTM1MjAsMTkwICszNTIwLDE5MCBAQAogc3RhdGljIGludAogYWRkX21ldGhvZHMoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU1ldGhvZERlZiAqbWV0aCkKIHsKLQlQeU9iamVjdCAqZGljdCA9IHR5cGUtPnRwX2RpY3Q7CisgICAgUHlPYmplY3QgKmRpY3QgPSB0eXBlLT50cF9kaWN0OwogCi0JZm9yICg7IG1ldGgtPm1sX25hbWUgIT0gTlVMTDsgbWV0aCsrKSB7Ci0JCVB5T2JqZWN0ICpkZXNjcjsKLQkJaWYgKFB5RGljdF9HZXRJdGVtU3RyaW5nKGRpY3QsIG1ldGgtPm1sX25hbWUpICYmCi0JCQkhKG1ldGgtPm1sX2ZsYWdzICYgTUVUSF9DT0VYSVNUKSkKLQkJCQljb250aW51ZTsKLQkJaWYgKG1ldGgtPm1sX2ZsYWdzICYgTUVUSF9DTEFTUykgewotCQkJaWYgKG1ldGgtPm1sX2ZsYWdzICYgTUVUSF9TVEFUSUMpIHsKLQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkgICAgICJtZXRob2QgY2Fubm90IGJlIGJvdGggY2xhc3MgYW5kIHN0YXRpYyIpOwotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJCWRlc2NyID0gUHlEZXNjcl9OZXdDbGFzc01ldGhvZCh0eXBlLCBtZXRoKTsKLQkJfQotCQllbHNlIGlmIChtZXRoLT5tbF9mbGFncyAmIE1FVEhfU1RBVElDKSB7Ci0JCQlQeU9iamVjdCAqY2Z1bmMgPSBQeUNGdW5jdGlvbl9OZXcobWV0aCwgTlVMTCk7Ci0JCQlpZiAoY2Z1bmMgPT0gTlVMTCkKLQkJCQlyZXR1cm4gLTE7Ci0JCQlkZXNjciA9IFB5U3RhdGljTWV0aG9kX05ldyhjZnVuYyk7Ci0JCQlQeV9ERUNSRUYoY2Z1bmMpOwotCQl9Ci0JCWVsc2UgewotCQkJZGVzY3IgPSBQeURlc2NyX05ld01ldGhvZCh0eXBlLCBtZXRoKTsKLQkJfQotCQlpZiAoZGVzY3IgPT0gTlVMTCkKLQkJCXJldHVybiAtMTsKLQkJaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsIG1ldGgtPm1sX25hbWUsIGRlc2NyKSA8IDApCi0JCQlyZXR1cm4gLTE7Ci0JCVB5X0RFQ1JFRihkZXNjcik7Ci0JfQotCXJldHVybiAwOworICAgIGZvciAoOyBtZXRoLT5tbF9uYW1lICE9IE5VTEw7IG1ldGgrKykgeworICAgICAgICBQeU9iamVjdCAqZGVzY3I7CisgICAgICAgIGlmIChQeURpY3RfR2V0SXRlbVN0cmluZyhkaWN0LCBtZXRoLT5tbF9uYW1lKSAmJgorICAgICAgICAgICAgIShtZXRoLT5tbF9mbGFncyAmIE1FVEhfQ09FWElTVCkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmIChtZXRoLT5tbF9mbGFncyAmIE1FVEhfQ0xBU1MpIHsKKyAgICAgICAgICAgIGlmIChtZXRoLT5tbF9mbGFncyAmIE1FVEhfU1RBVElDKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAibWV0aG9kIGNhbm5vdCBiZSBib3RoIGNsYXNzIGFuZCBzdGF0aWMiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZXNjciA9IFB5RGVzY3JfTmV3Q2xhc3NNZXRob2QodHlwZSwgbWV0aCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAobWV0aC0+bWxfZmxhZ3MgJiBNRVRIX1NUQVRJQykgeworICAgICAgICAgICAgUHlPYmplY3QgKmNmdW5jID0gUHlDRnVuY3Rpb25fTmV3KG1ldGgsIE5VTEwpOworICAgICAgICAgICAgaWYgKGNmdW5jID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgZGVzY3IgPSBQeVN0YXRpY01ldGhvZF9OZXcoY2Z1bmMpOworICAgICAgICAgICAgUHlfREVDUkVGKGNmdW5jKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGRlc2NyID0gUHlEZXNjcl9OZXdNZXRob2QodHlwZSwgbWV0aCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRlc2NyID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCBtZXRoLT5tbF9uYW1lLCBkZXNjcikgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBQeV9ERUNSRUYoZGVzY3IpOworICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogYWRkX21lbWJlcnMoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU1lbWJlckRlZiAqbWVtYikKIHsKLQlQeU9iamVjdCAqZGljdCA9IHR5cGUtPnRwX2RpY3Q7CisgICAgUHlPYmplY3QgKmRpY3QgPSB0eXBlLT50cF9kaWN0OwogCi0JZm9yICg7IG1lbWItPm5hbWUgIT0gTlVMTDsgbWVtYisrKSB7Ci0JCVB5T2JqZWN0ICpkZXNjcjsKLQkJaWYgKFB5RGljdF9HZXRJdGVtU3RyaW5nKGRpY3QsIG1lbWItPm5hbWUpKQotCQkJY29udGludWU7Ci0JCWRlc2NyID0gUHlEZXNjcl9OZXdNZW1iZXIodHlwZSwgbWVtYik7Ci0JCWlmIChkZXNjciA9PSBOVUxMKQotCQkJcmV0dXJuIC0xOwotCQlpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgbWVtYi0+bmFtZSwgZGVzY3IpIDwgMCkKLQkJCXJldHVybiAtMTsKLQkJUHlfREVDUkVGKGRlc2NyKTsKLQl9Ci0JcmV0dXJuIDA7CisgICAgZm9yICg7IG1lbWItPm5hbWUgIT0gTlVMTDsgbWVtYisrKSB7CisgICAgICAgIFB5T2JqZWN0ICpkZXNjcjsKKyAgICAgICAgaWYgKFB5RGljdF9HZXRJdGVtU3RyaW5nKGRpY3QsIG1lbWItPm5hbWUpKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGRlc2NyID0gUHlEZXNjcl9OZXdNZW1iZXIodHlwZSwgbWVtYik7CisgICAgICAgIGlmIChkZXNjciA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgbWVtYi0+bmFtZSwgZGVzY3IpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgUHlfREVDUkVGKGRlc2NyKTsKKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIGFkZF9nZXRzZXQoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeUdldFNldERlZiAqZ3NwKQogewotCVB5T2JqZWN0ICpkaWN0ID0gdHlwZS0+dHBfZGljdDsKKyAgICBQeU9iamVjdCAqZGljdCA9IHR5cGUtPnRwX2RpY3Q7CiAKLQlmb3IgKDsgZ3NwLT5uYW1lICE9IE5VTEw7IGdzcCsrKSB7Ci0JCVB5T2JqZWN0ICpkZXNjcjsKLQkJaWYgKFB5RGljdF9HZXRJdGVtU3RyaW5nKGRpY3QsIGdzcC0+bmFtZSkpCi0JCQljb250aW51ZTsKLQkJZGVzY3IgPSBQeURlc2NyX05ld0dldFNldCh0eXBlLCBnc3ApOworICAgIGZvciAoOyBnc3AtPm5hbWUgIT0gTlVMTDsgZ3NwKyspIHsKKyAgICAgICAgUHlPYmplY3QgKmRlc2NyOworICAgICAgICBpZiAoUHlEaWN0X0dldEl0ZW1TdHJpbmcoZGljdCwgZ3NwLT5uYW1lKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBkZXNjciA9IFB5RGVzY3JfTmV3R2V0U2V0KHR5cGUsIGdzcCk7CiAKLQkJaWYgKGRlc2NyID09IE5VTEwpCi0JCQlyZXR1cm4gLTE7Ci0JCWlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCBnc3AtPm5hbWUsIGRlc2NyKSA8IDApCi0JCQlyZXR1cm4gLTE7Ci0JCVB5X0RFQ1JFRihkZXNjcik7Ci0JfQotCXJldHVybiAwOworICAgICAgICBpZiAoZGVzY3IgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsIGdzcC0+bmFtZSwgZGVzY3IpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgUHlfREVDUkVGKGRlc2NyKTsKKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkCiBpbmhlcml0X3NwZWNpYWwoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeVR5cGVPYmplY3QgKmJhc2UpCiB7Ci0JUHlfc3NpemVfdCBvbGRzaXplLCBuZXdzaXplOworICAgIFB5X3NzaXplX3Qgb2xkc2l6ZSwgbmV3c2l6ZTsKIAotCS8qIFNwZWNpYWwgZmxhZyBtYWdpYyAqLwotCWlmICghdHlwZS0+dHBfYXNfYnVmZmVyICYmIGJhc2UtPnRwX2FzX2J1ZmZlcikgewotCQl0eXBlLT50cF9mbGFncyAmPSB+UHlfVFBGTEFHU19IQVZFX0dFVENIQVJCVUZGRVI7Ci0JCXR5cGUtPnRwX2ZsYWdzIHw9Ci0JCQliYXNlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEFWRV9HRVRDSEFSQlVGRkVSOwotCX0KLQlpZiAoIXR5cGUtPnRwX2FzX3NlcXVlbmNlICYmIGJhc2UtPnRwX2FzX3NlcXVlbmNlKSB7Ci0JCXR5cGUtPnRwX2ZsYWdzICY9IH5QeV9UUEZMQUdTX0hBVkVfU0VRVUVOQ0VfSU47Ci0JCXR5cGUtPnRwX2ZsYWdzIHw9IGJhc2UtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IQVZFX1NFUVVFTkNFX0lOOwotCX0KLQlpZiAoKHR5cGUtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IQVZFX0lOUExBQ0VPUFMpICE9Ci0JICAgIChiYXNlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEFWRV9JTlBMQUNFT1BTKSkgewotCQlpZiAoKCF0eXBlLT50cF9hc19udW1iZXIgJiYgYmFzZS0+dHBfYXNfbnVtYmVyKSB8fAotCQkgICAgKCF0eXBlLT50cF9hc19zZXF1ZW5jZSAmJiBiYXNlLT50cF9hc19zZXF1ZW5jZSkpIHsKLQkJCXR5cGUtPnRwX2ZsYWdzICY9IH5QeV9UUEZMQUdTX0hBVkVfSU5QTEFDRU9QUzsKLQkJCWlmICghdHlwZS0+dHBfYXNfbnVtYmVyICYmICF0eXBlLT50cF9hc19zZXF1ZW5jZSkgewotCQkJCXR5cGUtPnRwX2ZsYWdzIHw9IGJhc2UtPnRwX2ZsYWdzICYKLQkJCQkJUHlfVFBGTEFHU19IQVZFX0lOUExBQ0VPUFM7Ci0JCQl9Ci0JCX0KLQkJLyogV293ICovCi0JfQotCWlmICghdHlwZS0+dHBfYXNfbnVtYmVyICYmIGJhc2UtPnRwX2FzX251bWJlcikgewotCQl0eXBlLT50cF9mbGFncyAmPSB+UHlfVFBGTEFHU19DSEVDS1RZUEVTOwotCQl0eXBlLT50cF9mbGFncyB8PSBiYXNlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfQ0hFQ0tUWVBFUzsKLQl9CisgICAgLyogU3BlY2lhbCBmbGFnIG1hZ2ljICovCisgICAgaWYgKCF0eXBlLT50cF9hc19idWZmZXIgJiYgYmFzZS0+dHBfYXNfYnVmZmVyKSB7CisgICAgICAgIHR5cGUtPnRwX2ZsYWdzICY9IH5QeV9UUEZMQUdTX0hBVkVfR0VUQ0hBUkJVRkZFUjsKKyAgICAgICAgdHlwZS0+dHBfZmxhZ3MgfD0KKyAgICAgICAgICAgIGJhc2UtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IQVZFX0dFVENIQVJCVUZGRVI7CisgICAgfQorICAgIGlmICghdHlwZS0+dHBfYXNfc2VxdWVuY2UgJiYgYmFzZS0+dHBfYXNfc2VxdWVuY2UpIHsKKyAgICAgICAgdHlwZS0+dHBfZmxhZ3MgJj0gflB5X1RQRkxBR1NfSEFWRV9TRVFVRU5DRV9JTjsKKyAgICAgICAgdHlwZS0+dHBfZmxhZ3MgfD0gYmFzZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hBVkVfU0VRVUVOQ0VfSU47CisgICAgfQorICAgIGlmICgodHlwZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hBVkVfSU5QTEFDRU9QUykgIT0KKyAgICAgICAgKGJhc2UtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IQVZFX0lOUExBQ0VPUFMpKSB7CisgICAgICAgIGlmICgoIXR5cGUtPnRwX2FzX251bWJlciAmJiBiYXNlLT50cF9hc19udW1iZXIpIHx8CisgICAgICAgICAgICAoIXR5cGUtPnRwX2FzX3NlcXVlbmNlICYmIGJhc2UtPnRwX2FzX3NlcXVlbmNlKSkgeworICAgICAgICAgICAgdHlwZS0+dHBfZmxhZ3MgJj0gflB5X1RQRkxBR1NfSEFWRV9JTlBMQUNFT1BTOworICAgICAgICAgICAgaWYgKCF0eXBlLT50cF9hc19udW1iZXIgJiYgIXR5cGUtPnRwX2FzX3NlcXVlbmNlKSB7CisgICAgICAgICAgICAgICAgdHlwZS0+dHBfZmxhZ3MgfD0gYmFzZS0+dHBfZmxhZ3MgJgorICAgICAgICAgICAgICAgICAgICBQeV9UUEZMQUdTX0hBVkVfSU5QTEFDRU9QUzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiBXb3cgKi8KKyAgICB9CisgICAgaWYgKCF0eXBlLT50cF9hc19udW1iZXIgJiYgYmFzZS0+dHBfYXNfbnVtYmVyKSB7CisgICAgICAgIHR5cGUtPnRwX2ZsYWdzICY9IH5QeV9UUEZMQUdTX0NIRUNLVFlQRVM7CisgICAgICAgIHR5cGUtPnRwX2ZsYWdzIHw9IGJhc2UtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19DSEVDS1RZUEVTOworICAgIH0KIAotCS8qIENvcHlpbmcgYmFzaWNzaXplIGlzIGNvbm5lY3RlZCB0byB0aGUgR0MgZmxhZ3MgKi8KLQlvbGRzaXplID0gYmFzZS0+dHBfYmFzaWNzaXplOwotCW5ld3NpemUgPSB0eXBlLT50cF9iYXNpY3NpemUgPyB0eXBlLT50cF9iYXNpY3NpemUgOiBvbGRzaXplOwotCWlmICghKHR5cGUtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IQVZFX0dDKSAmJgotCSAgICAoYmFzZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hBVkVfR0MpICYmCi0JICAgICh0eXBlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEFWRV9SSUNIQ09NUEFSRS8qR0Mgc2xvdHMgZXhpc3QqLykgJiYKLQkgICAgKCF0eXBlLT50cF90cmF2ZXJzZSAmJiAhdHlwZS0+dHBfY2xlYXIpKSB7Ci0JCXR5cGUtPnRwX2ZsYWdzIHw9IFB5X1RQRkxBR1NfSEFWRV9HQzsKLQkJaWYgKHR5cGUtPnRwX3RyYXZlcnNlID09IE5VTEwpCi0JCQl0eXBlLT50cF90cmF2ZXJzZSA9IGJhc2UtPnRwX3RyYXZlcnNlOwotCQlpZiAodHlwZS0+dHBfY2xlYXIgPT0gTlVMTCkKLQkJCXR5cGUtPnRwX2NsZWFyID0gYmFzZS0+dHBfY2xlYXI7Ci0JfQotCWlmICh0eXBlLT50cF9mbGFncyAmIGJhc2UtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IQVZFX0NMQVNTKSB7Ci0JCS8qIFRoZSBjb25kaXRpb24gYmVsb3cgY291bGQgdXNlIHNvbWUgZXhwbGFuYXRpb24uCi0JCSAgIEl0IGFwcGVhcnMgdGhhdCB0cF9uZXcgaXMgbm90IGluaGVyaXRlZCBmb3Igc3RhdGljIHR5cGVzCi0JCSAgIHdob3NlIGJhc2UgY2xhc3MgaXMgJ29iamVjdCc7IHRoaXMgc2VlbXMgdG8gYmUgYSBwcmVjYXV0aW9uCi0JCSAgIHNvIHRoYXQgb2xkIGV4dGVuc2lvbiB0eXBlcyBkb24ndCBzdWRkZW5seSBiZWNvbWUKLQkJICAgY2FsbGFibGUgKG9iamVjdC5fX25ld19fIHdvdWxkbid0IGluc3VyZSB0aGUgaW52YXJpYW50cwotCQkgICB0aGF0IHRoZSBleHRlbnNpb24gdHlwZSdzIG93biBmYWN0b3J5IGZ1bmN0aW9uIGVuc3VyZXMpLgotCQkgICBIZWFwIHR5cGVzLCBvZiBjb3Vyc2UsIGFyZSB1bmRlciBvdXIgY29udHJvbCwgc28gdGhleSBkbwotCQkgICBpbmhlcml0IHRwX25ldzsgc3RhdGljIGV4dGVuc2lvbiB0eXBlcyB0aGF0IHNwZWNpZnkgc29tZQotCQkgICBvdGhlciBidWlsdC1pbiB0eXBlIGFzIHRoZSBkZWZhdWx0IGFyZSBjb25zaWRlcmVkCi0JCSAgIG5ldy1zdHlsZS1hd2FyZSBzbyB0aGV5IGFsc28gaW5oZXJpdCBvYmplY3QuX19uZXdfXy4gKi8KLQkJaWYgKGJhc2UgIT0gJlB5QmFzZU9iamVjdF9UeXBlIHx8Ci0JCSAgICAodHlwZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hFQVBUWVBFKSkgewotCQkJaWYgKHR5cGUtPnRwX25ldyA9PSBOVUxMKQotCQkJCXR5cGUtPnRwX25ldyA9IGJhc2UtPnRwX25ldzsKLQkJfQotCX0KLQl0eXBlLT50cF9iYXNpY3NpemUgPSBuZXdzaXplOworICAgIC8qIENvcHlpbmcgYmFzaWNzaXplIGlzIGNvbm5lY3RlZCB0byB0aGUgR0MgZmxhZ3MgKi8KKyAgICBvbGRzaXplID0gYmFzZS0+dHBfYmFzaWNzaXplOworICAgIG5ld3NpemUgPSB0eXBlLT50cF9iYXNpY3NpemUgPyB0eXBlLT50cF9iYXNpY3NpemUgOiBvbGRzaXplOworICAgIGlmICghKHR5cGUtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IQVZFX0dDKSAmJgorICAgICAgICAoYmFzZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hBVkVfR0MpICYmCisgICAgICAgICh0eXBlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEFWRV9SSUNIQ09NUEFSRS8qR0Mgc2xvdHMgZXhpc3QqLykgJiYKKyAgICAgICAgKCF0eXBlLT50cF90cmF2ZXJzZSAmJiAhdHlwZS0+dHBfY2xlYXIpKSB7CisgICAgICAgIHR5cGUtPnRwX2ZsYWdzIHw9IFB5X1RQRkxBR1NfSEFWRV9HQzsKKyAgICAgICAgaWYgKHR5cGUtPnRwX3RyYXZlcnNlID09IE5VTEwpCisgICAgICAgICAgICB0eXBlLT50cF90cmF2ZXJzZSA9IGJhc2UtPnRwX3RyYXZlcnNlOworICAgICAgICBpZiAodHlwZS0+dHBfY2xlYXIgPT0gTlVMTCkKKyAgICAgICAgICAgIHR5cGUtPnRwX2NsZWFyID0gYmFzZS0+dHBfY2xlYXI7CisgICAgfQorICAgIGlmICh0eXBlLT50cF9mbGFncyAmIGJhc2UtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IQVZFX0NMQVNTKSB7CisgICAgICAgIC8qIFRoZSBjb25kaXRpb24gYmVsb3cgY291bGQgdXNlIHNvbWUgZXhwbGFuYXRpb24uCisgICAgICAgICAgIEl0IGFwcGVhcnMgdGhhdCB0cF9uZXcgaXMgbm90IGluaGVyaXRlZCBmb3Igc3RhdGljIHR5cGVzCisgICAgICAgICAgIHdob3NlIGJhc2UgY2xhc3MgaXMgJ29iamVjdCc7IHRoaXMgc2VlbXMgdG8gYmUgYSBwcmVjYXV0aW9uCisgICAgICAgICAgIHNvIHRoYXQgb2xkIGV4dGVuc2lvbiB0eXBlcyBkb24ndCBzdWRkZW5seSBiZWNvbWUKKyAgICAgICAgICAgY2FsbGFibGUgKG9iamVjdC5fX25ld19fIHdvdWxkbid0IGluc3VyZSB0aGUgaW52YXJpYW50cworICAgICAgICAgICB0aGF0IHRoZSBleHRlbnNpb24gdHlwZSdzIG93biBmYWN0b3J5IGZ1bmN0aW9uIGVuc3VyZXMpLgorICAgICAgICAgICBIZWFwIHR5cGVzLCBvZiBjb3Vyc2UsIGFyZSB1bmRlciBvdXIgY29udHJvbCwgc28gdGhleSBkbworICAgICAgICAgICBpbmhlcml0IHRwX25ldzsgc3RhdGljIGV4dGVuc2lvbiB0eXBlcyB0aGF0IHNwZWNpZnkgc29tZQorICAgICAgICAgICBvdGhlciBidWlsdC1pbiB0eXBlIGFzIHRoZSBkZWZhdWx0IGFyZSBjb25zaWRlcmVkCisgICAgICAgICAgIG5ldy1zdHlsZS1hd2FyZSBzbyB0aGV5IGFsc28gaW5oZXJpdCBvYmplY3QuX19uZXdfXy4gKi8KKyAgICAgICAgaWYgKGJhc2UgIT0gJlB5QmFzZU9iamVjdF9UeXBlIHx8CisgICAgICAgICAgICAodHlwZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hFQVBUWVBFKSkgeworICAgICAgICAgICAgaWYgKHR5cGUtPnRwX25ldyA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHR5cGUtPnRwX25ldyA9IGJhc2UtPnRwX25ldzsKKyAgICAgICAgfQorICAgIH0KKyAgICB0eXBlLT50cF9iYXNpY3NpemUgPSBuZXdzaXplOwogCi0JLyogQ29weSBvdGhlciBub24tZnVuY3Rpb24gc2xvdHMgKi8KKyAgICAvKiBDb3B5IG90aGVyIG5vbi1mdW5jdGlvbiBzbG90cyAqLwogCiAjdW5kZWYgQ09QWVZBTAogI2RlZmluZSBDT1BZVkFMKFNMT1QpIFwKLQlpZiAodHlwZS0+U0xPVCA9PSAwKSB0eXBlLT5TTE9UID0gYmFzZS0+U0xPVAorICAgIGlmICh0eXBlLT5TTE9UID09IDApIHR5cGUtPlNMT1QgPSBiYXNlLT5TTE9UCiAKLQlDT1BZVkFMKHRwX2l0ZW1zaXplKTsKLQlpZiAodHlwZS0+dHBfZmxhZ3MgJiBiYXNlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEFWRV9XRUFLUkVGUykgewotCQlDT1BZVkFMKHRwX3dlYWtsaXN0b2Zmc2V0KTsKLQl9Ci0JaWYgKHR5cGUtPnRwX2ZsYWdzICYgYmFzZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hBVkVfQ0xBU1MpIHsKLQkJQ09QWVZBTCh0cF9kaWN0b2Zmc2V0KTsKLQl9CisgICAgQ09QWVZBTCh0cF9pdGVtc2l6ZSk7CisgICAgaWYgKHR5cGUtPnRwX2ZsYWdzICYgYmFzZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hBVkVfV0VBS1JFRlMpIHsKKyAgICAgICAgQ09QWVZBTCh0cF93ZWFrbGlzdG9mZnNldCk7CisgICAgfQorICAgIGlmICh0eXBlLT50cF9mbGFncyAmIGJhc2UtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IQVZFX0NMQVNTKSB7CisgICAgICAgIENPUFlWQUwodHBfZGljdG9mZnNldCk7CisgICAgfQogCi0JLyogU2V0dXAgZmFzdCBzdWJjbGFzcyBmbGFncyAqLwotCWlmIChQeVR5cGVfSXNTdWJ0eXBlKGJhc2UsIChQeVR5cGVPYmplY3QqKVB5RXhjX0Jhc2VFeGNlcHRpb24pKQotCQl0eXBlLT50cF9mbGFncyB8PSBQeV9UUEZMQUdTX0JBU0VfRVhDX1NVQkNMQVNTOwotCWVsc2UgaWYgKFB5VHlwZV9Jc1N1YnR5cGUoYmFzZSwgJlB5VHlwZV9UeXBlKSkKLQkJdHlwZS0+dHBfZmxhZ3MgfD0gUHlfVFBGTEFHU19UWVBFX1NVQkNMQVNTOwotCWVsc2UgaWYgKFB5VHlwZV9Jc1N1YnR5cGUoYmFzZSwgJlB5SW50X1R5cGUpKQotCQl0eXBlLT50cF9mbGFncyB8PSBQeV9UUEZMQUdTX0lOVF9TVUJDTEFTUzsKLQllbHNlIGlmIChQeVR5cGVfSXNTdWJ0eXBlKGJhc2UsICZQeUxvbmdfVHlwZSkpCi0JCXR5cGUtPnRwX2ZsYWdzIHw9IFB5X1RQRkxBR1NfTE9OR19TVUJDTEFTUzsKLQllbHNlIGlmIChQeVR5cGVfSXNTdWJ0eXBlKGJhc2UsICZQeVN0cmluZ19UeXBlKSkKLQkJdHlwZS0+dHBfZmxhZ3MgfD0gUHlfVFBGTEFHU19TVFJJTkdfU1VCQ0xBU1M7CisgICAgLyogU2V0dXAgZmFzdCBzdWJjbGFzcyBmbGFncyAqLworICAgIGlmIChQeVR5cGVfSXNTdWJ0eXBlKGJhc2UsIChQeVR5cGVPYmplY3QqKVB5RXhjX0Jhc2VFeGNlcHRpb24pKQorICAgICAgICB0eXBlLT50cF9mbGFncyB8PSBQeV9UUEZMQUdTX0JBU0VfRVhDX1NVQkNMQVNTOworICAgIGVsc2UgaWYgKFB5VHlwZV9Jc1N1YnR5cGUoYmFzZSwgJlB5VHlwZV9UeXBlKSkKKyAgICAgICAgdHlwZS0+dHBfZmxhZ3MgfD0gUHlfVFBGTEFHU19UWVBFX1NVQkNMQVNTOworICAgIGVsc2UgaWYgKFB5VHlwZV9Jc1N1YnR5cGUoYmFzZSwgJlB5SW50X1R5cGUpKQorICAgICAgICB0eXBlLT50cF9mbGFncyB8PSBQeV9UUEZMQUdTX0lOVF9TVUJDTEFTUzsKKyAgICBlbHNlIGlmIChQeVR5cGVfSXNTdWJ0eXBlKGJhc2UsICZQeUxvbmdfVHlwZSkpCisgICAgICAgIHR5cGUtPnRwX2ZsYWdzIHw9IFB5X1RQRkxBR1NfTE9OR19TVUJDTEFTUzsKKyAgICBlbHNlIGlmIChQeVR5cGVfSXNTdWJ0eXBlKGJhc2UsICZQeVN0cmluZ19UeXBlKSkKKyAgICAgICAgdHlwZS0+dHBfZmxhZ3MgfD0gUHlfVFBGTEFHU19TVFJJTkdfU1VCQ0xBU1M7CiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCWVsc2UgaWYgKFB5VHlwZV9Jc1N1YnR5cGUoYmFzZSwgJlB5VW5pY29kZV9UeXBlKSkKLQkJdHlwZS0+dHBfZmxhZ3MgfD0gUHlfVFBGTEFHU19VTklDT0RFX1NVQkNMQVNTOworICAgIGVsc2UgaWYgKFB5VHlwZV9Jc1N1YnR5cGUoYmFzZSwgJlB5VW5pY29kZV9UeXBlKSkKKyAgICAgICAgdHlwZS0+dHBfZmxhZ3MgfD0gUHlfVFBGTEFHU19VTklDT0RFX1NVQkNMQVNTOwogI2VuZGlmCi0JZWxzZSBpZiAoUHlUeXBlX0lzU3VidHlwZShiYXNlLCAmUHlUdXBsZV9UeXBlKSkKLQkJdHlwZS0+dHBfZmxhZ3MgfD0gUHlfVFBGTEFHU19UVVBMRV9TVUJDTEFTUzsKLQllbHNlIGlmIChQeVR5cGVfSXNTdWJ0eXBlKGJhc2UsICZQeUxpc3RfVHlwZSkpCi0JCXR5cGUtPnRwX2ZsYWdzIHw9IFB5X1RQRkxBR1NfTElTVF9TVUJDTEFTUzsKLQllbHNlIGlmIChQeVR5cGVfSXNTdWJ0eXBlKGJhc2UsICZQeURpY3RfVHlwZSkpCi0JCXR5cGUtPnRwX2ZsYWdzIHw9IFB5X1RQRkxBR1NfRElDVF9TVUJDTEFTUzsKKyAgICBlbHNlIGlmIChQeVR5cGVfSXNTdWJ0eXBlKGJhc2UsICZQeVR1cGxlX1R5cGUpKQorICAgICAgICB0eXBlLT50cF9mbGFncyB8PSBQeV9UUEZMQUdTX1RVUExFX1NVQkNMQVNTOworICAgIGVsc2UgaWYgKFB5VHlwZV9Jc1N1YnR5cGUoYmFzZSwgJlB5TGlzdF9UeXBlKSkKKyAgICAgICAgdHlwZS0+dHBfZmxhZ3MgfD0gUHlfVFBGTEFHU19MSVNUX1NVQkNMQVNTOworICAgIGVsc2UgaWYgKFB5VHlwZV9Jc1N1YnR5cGUoYmFzZSwgJlB5RGljdF9UeXBlKSkKKyAgICAgICAgdHlwZS0+dHBfZmxhZ3MgfD0gUHlfVFBGTEFHU19ESUNUX1NVQkNMQVNTOwogfQogCiBzdGF0aWMgaW50CiBvdmVycmlkZXNfbmFtZShQeVR5cGVPYmplY3QgKnR5cGUsIGNoYXIgKm5hbWUpCiB7Ci0JUHlPYmplY3QgKmRpY3QgPSB0eXBlLT50cF9kaWN0OworICAgIFB5T2JqZWN0ICpkaWN0ID0gdHlwZS0+dHBfZGljdDsKIAotCWFzc2VydChkaWN0ICE9IE5VTEwpOwotCWlmIChQeURpY3RfR2V0SXRlbVN0cmluZyhkaWN0LCBuYW1lKSAhPSBOVUxMKSB7Ci0JCXJldHVybiAxOwotCX0KLQlyZXR1cm4gMDsKKyAgICBhc3NlcnQoZGljdCAhPSBOVUxMKTsKKyAgICBpZiAoUHlEaWN0X0dldEl0ZW1TdHJpbmcoZGljdCwgbmFtZSkgIT0gTlVMTCkgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKICNkZWZpbmUgT1ZFUlJJREVTX0hBU0goeCkgICAgICAgb3ZlcnJpZGVzX25hbWUoeCwgIl9faGFzaF9fIikKQEAgLTM3MTMsNyArMzcxMyw3IEBACiBzdGF0aWMgdm9pZAogaW5oZXJpdF9zbG90cyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5VHlwZU9iamVjdCAqYmFzZSkKIHsKLQlQeVR5cGVPYmplY3QgKmJhc2ViYXNlOworICAgIFB5VHlwZU9iamVjdCAqYmFzZWJhc2U7CiAKICN1bmRlZiBTTE9UREVGSU5FRAogI3VuZGVmIENPUFlTTE9UCkBAIC0zNzIzLDE4NSArMzcyMywxODUgQEAKICN1bmRlZiBDT1BZQlVGCiAKICNkZWZpbmUgU0xPVERFRklORUQoU0xPVCkgXAotCShiYXNlLT5TTE9UICE9IDAgJiYgXAotCSAoYmFzZWJhc2UgPT0gTlVMTCB8fCBiYXNlLT5TTE9UICE9IGJhc2ViYXNlLT5TTE9UKSkKKyAgICAoYmFzZS0+U0xPVCAhPSAwICYmIFwKKyAgICAgKGJhc2ViYXNlID09IE5VTEwgfHwgYmFzZS0+U0xPVCAhPSBiYXNlYmFzZS0+U0xPVCkpCiAKICNkZWZpbmUgQ09QWVNMT1QoU0xPVCkgXAotCWlmICghdHlwZS0+U0xPVCAmJiBTTE9UREVGSU5FRChTTE9UKSkgdHlwZS0+U0xPVCA9IGJhc2UtPlNMT1QKKyAgICBpZiAoIXR5cGUtPlNMT1QgJiYgU0xPVERFRklORUQoU0xPVCkpIHR5cGUtPlNMT1QgPSBiYXNlLT5TTE9UCiAKICNkZWZpbmUgQ09QWU5VTShTTE9UKSBDT1BZU0xPVCh0cF9hc19udW1iZXItPlNMT1QpCiAjZGVmaW5lIENPUFlTRVEoU0xPVCkgQ09QWVNMT1QodHBfYXNfc2VxdWVuY2UtPlNMT1QpCiAjZGVmaW5lIENPUFlNQVAoU0xPVCkgQ09QWVNMT1QodHBfYXNfbWFwcGluZy0+U0xPVCkKICNkZWZpbmUgQ09QWUJVRihTTE9UKSBDT1BZU0xPVCh0cF9hc19idWZmZXItPlNMT1QpCiAKLQkvKiBUaGlzIHdvbid0IGluaGVyaXQgaW5kaXJlY3Qgc2xvdHMgKGZyb20gdHBfYXNfbnVtYmVyIGV0Yy4pCi0JICAgaWYgdHlwZSBkb2Vzbid0IHByb3ZpZGUgdGhlIHNwYWNlLiAqLworICAgIC8qIFRoaXMgd29uJ3QgaW5oZXJpdCBpbmRpcmVjdCBzbG90cyAoZnJvbSB0cF9hc19udW1iZXIgZXRjLikKKyAgICAgICBpZiB0eXBlIGRvZXNuJ3QgcHJvdmlkZSB0aGUgc3BhY2UuICovCiAKLQlpZiAodHlwZS0+dHBfYXNfbnVtYmVyICE9IE5VTEwgJiYgYmFzZS0+dHBfYXNfbnVtYmVyICE9IE5VTEwpIHsKLQkJYmFzZWJhc2UgPSBiYXNlLT50cF9iYXNlOwotCQlpZiAoYmFzZWJhc2UtPnRwX2FzX251bWJlciA9PSBOVUxMKQotCQkJYmFzZWJhc2UgPSBOVUxMOwotCQlDT1BZTlVNKG5iX2FkZCk7Ci0JCUNPUFlOVU0obmJfc3VidHJhY3QpOwotCQlDT1BZTlVNKG5iX211bHRpcGx5KTsKLQkJQ09QWU5VTShuYl9kaXZpZGUpOwotCQlDT1BZTlVNKG5iX3JlbWFpbmRlcik7Ci0JCUNPUFlOVU0obmJfZGl2bW9kKTsKLQkJQ09QWU5VTShuYl9wb3dlcik7Ci0JCUNPUFlOVU0obmJfbmVnYXRpdmUpOwotCQlDT1BZTlVNKG5iX3Bvc2l0aXZlKTsKLQkJQ09QWU5VTShuYl9hYnNvbHV0ZSk7Ci0JCUNPUFlOVU0obmJfbm9uemVybyk7Ci0JCUNPUFlOVU0obmJfaW52ZXJ0KTsKLQkJQ09QWU5VTShuYl9sc2hpZnQpOwotCQlDT1BZTlVNKG5iX3JzaGlmdCk7Ci0JCUNPUFlOVU0obmJfYW5kKTsKLQkJQ09QWU5VTShuYl94b3IpOwotCQlDT1BZTlVNKG5iX29yKTsKLQkJQ09QWU5VTShuYl9jb2VyY2UpOwotCQlDT1BZTlVNKG5iX2ludCk7Ci0JCUNPUFlOVU0obmJfbG9uZyk7Ci0JCUNPUFlOVU0obmJfZmxvYXQpOwotCQlDT1BZTlVNKG5iX29jdCk7Ci0JCUNPUFlOVU0obmJfaGV4KTsKLQkJQ09QWU5VTShuYl9pbnBsYWNlX2FkZCk7Ci0JCUNPUFlOVU0obmJfaW5wbGFjZV9zdWJ0cmFjdCk7Ci0JCUNPUFlOVU0obmJfaW5wbGFjZV9tdWx0aXBseSk7Ci0JCUNPUFlOVU0obmJfaW5wbGFjZV9kaXZpZGUpOwotCQlDT1BZTlVNKG5iX2lucGxhY2VfcmVtYWluZGVyKTsKLQkJQ09QWU5VTShuYl9pbnBsYWNlX3Bvd2VyKTsKLQkJQ09QWU5VTShuYl9pbnBsYWNlX2xzaGlmdCk7Ci0JCUNPUFlOVU0obmJfaW5wbGFjZV9yc2hpZnQpOwotCQlDT1BZTlVNKG5iX2lucGxhY2VfYW5kKTsKLQkJQ09QWU5VTShuYl9pbnBsYWNlX3hvcik7Ci0JCUNPUFlOVU0obmJfaW5wbGFjZV9vcik7Ci0JCWlmIChiYXNlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfQ0hFQ0tUWVBFUykgewotCQkJQ09QWU5VTShuYl90cnVlX2RpdmlkZSk7Ci0JCQlDT1BZTlVNKG5iX2Zsb29yX2RpdmlkZSk7Ci0JCQlDT1BZTlVNKG5iX2lucGxhY2VfdHJ1ZV9kaXZpZGUpOwotCQkJQ09QWU5VTShuYl9pbnBsYWNlX2Zsb29yX2RpdmlkZSk7Ci0JCX0KLQkJaWYgKGJhc2UtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IQVZFX0lOREVYKSB7Ci0JCQlDT1BZTlVNKG5iX2luZGV4KTsKLQkJfQotCX0KKyAgICBpZiAodHlwZS0+dHBfYXNfbnVtYmVyICE9IE5VTEwgJiYgYmFzZS0+dHBfYXNfbnVtYmVyICE9IE5VTEwpIHsKKyAgICAgICAgYmFzZWJhc2UgPSBiYXNlLT50cF9iYXNlOworICAgICAgICBpZiAoYmFzZWJhc2UtPnRwX2FzX251bWJlciA9PSBOVUxMKQorICAgICAgICAgICAgYmFzZWJhc2UgPSBOVUxMOworICAgICAgICBDT1BZTlVNKG5iX2FkZCk7CisgICAgICAgIENPUFlOVU0obmJfc3VidHJhY3QpOworICAgICAgICBDT1BZTlVNKG5iX211bHRpcGx5KTsKKyAgICAgICAgQ09QWU5VTShuYl9kaXZpZGUpOworICAgICAgICBDT1BZTlVNKG5iX3JlbWFpbmRlcik7CisgICAgICAgIENPUFlOVU0obmJfZGl2bW9kKTsKKyAgICAgICAgQ09QWU5VTShuYl9wb3dlcik7CisgICAgICAgIENPUFlOVU0obmJfbmVnYXRpdmUpOworICAgICAgICBDT1BZTlVNKG5iX3Bvc2l0aXZlKTsKKyAgICAgICAgQ09QWU5VTShuYl9hYnNvbHV0ZSk7CisgICAgICAgIENPUFlOVU0obmJfbm9uemVybyk7CisgICAgICAgIENPUFlOVU0obmJfaW52ZXJ0KTsKKyAgICAgICAgQ09QWU5VTShuYl9sc2hpZnQpOworICAgICAgICBDT1BZTlVNKG5iX3JzaGlmdCk7CisgICAgICAgIENPUFlOVU0obmJfYW5kKTsKKyAgICAgICAgQ09QWU5VTShuYl94b3IpOworICAgICAgICBDT1BZTlVNKG5iX29yKTsKKyAgICAgICAgQ09QWU5VTShuYl9jb2VyY2UpOworICAgICAgICBDT1BZTlVNKG5iX2ludCk7CisgICAgICAgIENPUFlOVU0obmJfbG9uZyk7CisgICAgICAgIENPUFlOVU0obmJfZmxvYXQpOworICAgICAgICBDT1BZTlVNKG5iX29jdCk7CisgICAgICAgIENPUFlOVU0obmJfaGV4KTsKKyAgICAgICAgQ09QWU5VTShuYl9pbnBsYWNlX2FkZCk7CisgICAgICAgIENPUFlOVU0obmJfaW5wbGFjZV9zdWJ0cmFjdCk7CisgICAgICAgIENPUFlOVU0obmJfaW5wbGFjZV9tdWx0aXBseSk7CisgICAgICAgIENPUFlOVU0obmJfaW5wbGFjZV9kaXZpZGUpOworICAgICAgICBDT1BZTlVNKG5iX2lucGxhY2VfcmVtYWluZGVyKTsKKyAgICAgICAgQ09QWU5VTShuYl9pbnBsYWNlX3Bvd2VyKTsKKyAgICAgICAgQ09QWU5VTShuYl9pbnBsYWNlX2xzaGlmdCk7CisgICAgICAgIENPUFlOVU0obmJfaW5wbGFjZV9yc2hpZnQpOworICAgICAgICBDT1BZTlVNKG5iX2lucGxhY2VfYW5kKTsKKyAgICAgICAgQ09QWU5VTShuYl9pbnBsYWNlX3hvcik7CisgICAgICAgIENPUFlOVU0obmJfaW5wbGFjZV9vcik7CisgICAgICAgIGlmIChiYXNlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfQ0hFQ0tUWVBFUykgeworICAgICAgICAgICAgQ09QWU5VTShuYl90cnVlX2RpdmlkZSk7CisgICAgICAgICAgICBDT1BZTlVNKG5iX2Zsb29yX2RpdmlkZSk7CisgICAgICAgICAgICBDT1BZTlVNKG5iX2lucGxhY2VfdHJ1ZV9kaXZpZGUpOworICAgICAgICAgICAgQ09QWU5VTShuYl9pbnBsYWNlX2Zsb29yX2RpdmlkZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJhc2UtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IQVZFX0lOREVYKSB7CisgICAgICAgICAgICBDT1BZTlVNKG5iX2luZGV4KTsKKyAgICAgICAgfQorICAgIH0KIAotCWlmICh0eXBlLT50cF9hc19zZXF1ZW5jZSAhPSBOVUxMICYmIGJhc2UtPnRwX2FzX3NlcXVlbmNlICE9IE5VTEwpIHsKLQkJYmFzZWJhc2UgPSBiYXNlLT50cF9iYXNlOwotCQlpZiAoYmFzZWJhc2UtPnRwX2FzX3NlcXVlbmNlID09IE5VTEwpCi0JCQliYXNlYmFzZSA9IE5VTEw7Ci0JCUNPUFlTRVEoc3FfbGVuZ3RoKTsKLQkJQ09QWVNFUShzcV9jb25jYXQpOwotCQlDT1BZU0VRKHNxX3JlcGVhdCk7Ci0JCUNPUFlTRVEoc3FfaXRlbSk7Ci0JCUNPUFlTRVEoc3Ffc2xpY2UpOwotCQlDT1BZU0VRKHNxX2Fzc19pdGVtKTsKLQkJQ09QWVNFUShzcV9hc3Nfc2xpY2UpOwotCQlDT1BZU0VRKHNxX2NvbnRhaW5zKTsKLQkJQ09QWVNFUShzcV9pbnBsYWNlX2NvbmNhdCk7Ci0JCUNPUFlTRVEoc3FfaW5wbGFjZV9yZXBlYXQpOwotCX0KKyAgICBpZiAodHlwZS0+dHBfYXNfc2VxdWVuY2UgIT0gTlVMTCAmJiBiYXNlLT50cF9hc19zZXF1ZW5jZSAhPSBOVUxMKSB7CisgICAgICAgIGJhc2ViYXNlID0gYmFzZS0+dHBfYmFzZTsKKyAgICAgICAgaWYgKGJhc2ViYXNlLT50cF9hc19zZXF1ZW5jZSA9PSBOVUxMKQorICAgICAgICAgICAgYmFzZWJhc2UgPSBOVUxMOworICAgICAgICBDT1BZU0VRKHNxX2xlbmd0aCk7CisgICAgICAgIENPUFlTRVEoc3FfY29uY2F0KTsKKyAgICAgICAgQ09QWVNFUShzcV9yZXBlYXQpOworICAgICAgICBDT1BZU0VRKHNxX2l0ZW0pOworICAgICAgICBDT1BZU0VRKHNxX3NsaWNlKTsKKyAgICAgICAgQ09QWVNFUShzcV9hc3NfaXRlbSk7CisgICAgICAgIENPUFlTRVEoc3FfYXNzX3NsaWNlKTsKKyAgICAgICAgQ09QWVNFUShzcV9jb250YWlucyk7CisgICAgICAgIENPUFlTRVEoc3FfaW5wbGFjZV9jb25jYXQpOworICAgICAgICBDT1BZU0VRKHNxX2lucGxhY2VfcmVwZWF0KTsKKyAgICB9CiAKLQlpZiAodHlwZS0+dHBfYXNfbWFwcGluZyAhPSBOVUxMICYmIGJhc2UtPnRwX2FzX21hcHBpbmcgIT0gTlVMTCkgewotCQliYXNlYmFzZSA9IGJhc2UtPnRwX2Jhc2U7Ci0JCWlmIChiYXNlYmFzZS0+dHBfYXNfbWFwcGluZyA9PSBOVUxMKQotCQkJYmFzZWJhc2UgPSBOVUxMOwotCQlDT1BZTUFQKG1wX2xlbmd0aCk7Ci0JCUNPUFlNQVAobXBfc3Vic2NyaXB0KTsKLQkJQ09QWU1BUChtcF9hc3Nfc3Vic2NyaXB0KTsKLQl9CisgICAgaWYgKHR5cGUtPnRwX2FzX21hcHBpbmcgIT0gTlVMTCAmJiBiYXNlLT50cF9hc19tYXBwaW5nICE9IE5VTEwpIHsKKyAgICAgICAgYmFzZWJhc2UgPSBiYXNlLT50cF9iYXNlOworICAgICAgICBpZiAoYmFzZWJhc2UtPnRwX2FzX21hcHBpbmcgPT0gTlVMTCkKKyAgICAgICAgICAgIGJhc2ViYXNlID0gTlVMTDsKKyAgICAgICAgQ09QWU1BUChtcF9sZW5ndGgpOworICAgICAgICBDT1BZTUFQKG1wX3N1YnNjcmlwdCk7CisgICAgICAgIENPUFlNQVAobXBfYXNzX3N1YnNjcmlwdCk7CisgICAgfQogCi0JaWYgKHR5cGUtPnRwX2FzX2J1ZmZlciAhPSBOVUxMICYmIGJhc2UtPnRwX2FzX2J1ZmZlciAhPSBOVUxMKSB7Ci0JCWJhc2ViYXNlID0gYmFzZS0+dHBfYmFzZTsKLQkJaWYgKGJhc2ViYXNlLT50cF9hc19idWZmZXIgPT0gTlVMTCkKLQkJCWJhc2ViYXNlID0gTlVMTDsKLQkJQ09QWUJVRihiZl9nZXRyZWFkYnVmZmVyKTsKLQkJQ09QWUJVRihiZl9nZXR3cml0ZWJ1ZmZlcik7Ci0JCUNPUFlCVUYoYmZfZ2V0c2VnY291bnQpOwotCQlDT1BZQlVGKGJmX2dldGNoYXJidWZmZXIpOwotCQlDT1BZQlVGKGJmX2dldGJ1ZmZlcik7Ci0JCUNPUFlCVUYoYmZfcmVsZWFzZWJ1ZmZlcik7Ci0JfQorICAgIGlmICh0eXBlLT50cF9hc19idWZmZXIgIT0gTlVMTCAmJiBiYXNlLT50cF9hc19idWZmZXIgIT0gTlVMTCkgeworICAgICAgICBiYXNlYmFzZSA9IGJhc2UtPnRwX2Jhc2U7CisgICAgICAgIGlmIChiYXNlYmFzZS0+dHBfYXNfYnVmZmVyID09IE5VTEwpCisgICAgICAgICAgICBiYXNlYmFzZSA9IE5VTEw7CisgICAgICAgIENPUFlCVUYoYmZfZ2V0cmVhZGJ1ZmZlcik7CisgICAgICAgIENPUFlCVUYoYmZfZ2V0d3JpdGVidWZmZXIpOworICAgICAgICBDT1BZQlVGKGJmX2dldHNlZ2NvdW50KTsKKyAgICAgICAgQ09QWUJVRihiZl9nZXRjaGFyYnVmZmVyKTsKKyAgICAgICAgQ09QWUJVRihiZl9nZXRidWZmZXIpOworICAgICAgICBDT1BZQlVGKGJmX3JlbGVhc2VidWZmZXIpOworICAgIH0KIAotCWJhc2ViYXNlID0gYmFzZS0+dHBfYmFzZTsKKyAgICBiYXNlYmFzZSA9IGJhc2UtPnRwX2Jhc2U7CiAKLQlDT1BZU0xPVCh0cF9kZWFsbG9jKTsKLQlDT1BZU0xPVCh0cF9wcmludCk7Ci0JaWYgKHR5cGUtPnRwX2dldGF0dHIgPT0gTlVMTCAmJiB0eXBlLT50cF9nZXRhdHRybyA9PSBOVUxMKSB7Ci0JCXR5cGUtPnRwX2dldGF0dHIgPSBiYXNlLT50cF9nZXRhdHRyOwotCQl0eXBlLT50cF9nZXRhdHRybyA9IGJhc2UtPnRwX2dldGF0dHJvOwotCX0KLQlpZiAodHlwZS0+dHBfc2V0YXR0ciA9PSBOVUxMICYmIHR5cGUtPnRwX3NldGF0dHJvID09IE5VTEwpIHsKLQkJdHlwZS0+dHBfc2V0YXR0ciA9IGJhc2UtPnRwX3NldGF0dHI7Ci0JCXR5cGUtPnRwX3NldGF0dHJvID0gYmFzZS0+dHBfc2V0YXR0cm87Ci0JfQotCS8qIHRwX2NvbXBhcmUgc2VlIHRwX3JpY2hjb21wYXJlICovCi0JQ09QWVNMT1QodHBfcmVwcik7Ci0JLyogdHBfaGFzaCBzZWUgdHBfcmljaGNvbXBhcmUgKi8KLQlDT1BZU0xPVCh0cF9jYWxsKTsKLQlDT1BZU0xPVCh0cF9zdHIpOwotCWlmICh0eXBlLT50cF9mbGFncyAmIGJhc2UtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IQVZFX1JJQ0hDT01QQVJFKSB7Ci0JCWlmICh0eXBlLT50cF9jb21wYXJlID09IE5VTEwgJiYKLQkJICAgIHR5cGUtPnRwX3JpY2hjb21wYXJlID09IE5VTEwgJiYKLQkJICAgIHR5cGUtPnRwX2hhc2ggPT0gTlVMTCkKLQkJewotCQkJdHlwZS0+dHBfY29tcGFyZSA9IGJhc2UtPnRwX2NvbXBhcmU7Ci0JCQl0eXBlLT50cF9yaWNoY29tcGFyZSA9IGJhc2UtPnRwX3JpY2hjb21wYXJlOwotCQkJdHlwZS0+dHBfaGFzaCA9IGJhc2UtPnRwX2hhc2g7Ci0JCQkvKiBDaGVjayBmb3IgY2hhbmdlcyB0byBpbmhlcml0ZWQgbWV0aG9kcyBpbiBQeTNrKi8KLQkJCWlmIChQeV9QeTNrV2FybmluZ0ZsYWcpIHsKLQkJCQlpZiAoYmFzZS0+dHBfaGFzaCAmJgotCQkJCQkJKGJhc2UtPnRwX2hhc2ggIT0gUHlPYmplY3RfSGFzaE5vdEltcGxlbWVudGVkKSAmJgotCQkJCQkJIU9WRVJSSURFU19IQVNIKHR5cGUpKSB7Ci0JCQkJCWlmIChPVkVSUklERVNfQ01QKHR5cGUpKSB7Ci0JCQkJCQlQeUVycl9XYXJuUHkzaygiT3ZlcnJpZGluZyAiCi0JCQkJCQkgICJfX2NtcF9fIGJsb2NrcyBpbmhlcml0YW5jZSAiCi0JCQkJCQkgICJvZiBfX2hhc2hfXyBpbiAzLngiLAotCQkJCQkJICAxKTsKLQkJCQkJfQotCQkJCQlpZiAoT1ZFUlJJREVTX0VRKHR5cGUpKSB7Ci0JCQkJCQlQeUVycl9XYXJuUHkzaygiT3ZlcnJpZGluZyAiCi0JCQkJCQkgICJfX2VxX18gYmxvY2tzIGluaGVyaXRhbmNlICIKLQkJCQkJCSAgIm9mIF9faGFzaF9fIGluIDMueCIsCi0JCQkJCQkgIDEpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCWVsc2UgewotCQlDT1BZU0xPVCh0cF9jb21wYXJlKTsKLQl9Ci0JaWYgKHR5cGUtPnRwX2ZsYWdzICYgYmFzZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hBVkVfSVRFUikgewotCQlDT1BZU0xPVCh0cF9pdGVyKTsKLQkJQ09QWVNMT1QodHBfaXRlcm5leHQpOwotCX0KLQlpZiAodHlwZS0+dHBfZmxhZ3MgJiBiYXNlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEFWRV9DTEFTUykgewotCQlDT1BZU0xPVCh0cF9kZXNjcl9nZXQpOwotCQlDT1BZU0xPVCh0cF9kZXNjcl9zZXQpOwotCQlDT1BZU0xPVCh0cF9kaWN0b2Zmc2V0KTsKLQkJQ09QWVNMT1QodHBfaW5pdCk7Ci0JCUNPUFlTTE9UKHRwX2FsbG9jKTsKLQkJQ09QWVNMT1QodHBfaXNfZ2MpOwotCQlpZiAoKHR5cGUtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IQVZFX0dDKSA9PQotCQkgICAgKGJhc2UtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IQVZFX0dDKSkgewotCQkJLyogVGhleSBhZ3JlZSBhYm91dCBnYy4gKi8KLQkJCUNPUFlTTE9UKHRwX2ZyZWUpOwotCQl9Ci0JCWVsc2UgaWYgKCh0eXBlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEFWRV9HQykgJiYKLQkJCSB0eXBlLT50cF9mcmVlID09IE5VTEwgJiYKLQkJCSBiYXNlLT50cF9mcmVlID09IF9QeU9iamVjdF9EZWwpIHsKLQkJCS8qIEEgYml0IG9mIG1hZ2ljIHRvIHBsdWcgaW4gdGhlIGNvcnJlY3QgZGVmYXVsdAotCQkJICogdHBfZnJlZSBmdW5jdGlvbiB3aGVuIGEgZGVyaXZlZCBjbGFzcyBhZGRzIGdjLAotCQkJICogZGlkbid0IGRlZmluZSB0cF9mcmVlLCBhbmQgdGhlIGJhc2UgdXNlcyB0aGUKLQkJCSAqIGRlZmF1bHQgbm9uLWdjIHRwX2ZyZWUuCi0JCQkgKi8KLQkJCXR5cGUtPnRwX2ZyZWUgPSBQeU9iamVjdF9HQ19EZWw7Ci0JCX0KLQkJLyogZWxzZSB0aGV5IGRpZG4ndCBhZ3JlZSBhYm91dCBnYywgYW5kIHRoZXJlIGlzbid0IHNvbWV0aGluZwotCQkgKiBvYnZpb3VzIHRvIGJlIGRvbmUgLS0gdGhlIHR5cGUgaXMgb24gaXRzIG93bi4KLQkJICovCi0JfQorICAgIENPUFlTTE9UKHRwX2RlYWxsb2MpOworICAgIENPUFlTTE9UKHRwX3ByaW50KTsKKyAgICBpZiAodHlwZS0+dHBfZ2V0YXR0ciA9PSBOVUxMICYmIHR5cGUtPnRwX2dldGF0dHJvID09IE5VTEwpIHsKKyAgICAgICAgdHlwZS0+dHBfZ2V0YXR0ciA9IGJhc2UtPnRwX2dldGF0dHI7CisgICAgICAgIHR5cGUtPnRwX2dldGF0dHJvID0gYmFzZS0+dHBfZ2V0YXR0cm87CisgICAgfQorICAgIGlmICh0eXBlLT50cF9zZXRhdHRyID09IE5VTEwgJiYgdHlwZS0+dHBfc2V0YXR0cm8gPT0gTlVMTCkgeworICAgICAgICB0eXBlLT50cF9zZXRhdHRyID0gYmFzZS0+dHBfc2V0YXR0cjsKKyAgICAgICAgdHlwZS0+dHBfc2V0YXR0cm8gPSBiYXNlLT50cF9zZXRhdHRybzsKKyAgICB9CisgICAgLyogdHBfY29tcGFyZSBzZWUgdHBfcmljaGNvbXBhcmUgKi8KKyAgICBDT1BZU0xPVCh0cF9yZXByKTsKKyAgICAvKiB0cF9oYXNoIHNlZSB0cF9yaWNoY29tcGFyZSAqLworICAgIENPUFlTTE9UKHRwX2NhbGwpOworICAgIENPUFlTTE9UKHRwX3N0cik7CisgICAgaWYgKHR5cGUtPnRwX2ZsYWdzICYgYmFzZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hBVkVfUklDSENPTVBBUkUpIHsKKyAgICAgICAgaWYgKHR5cGUtPnRwX2NvbXBhcmUgPT0gTlVMTCAmJgorICAgICAgICAgICAgdHlwZS0+dHBfcmljaGNvbXBhcmUgPT0gTlVMTCAmJgorICAgICAgICAgICAgdHlwZS0+dHBfaGFzaCA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB0eXBlLT50cF9jb21wYXJlID0gYmFzZS0+dHBfY29tcGFyZTsKKyAgICAgICAgICAgIHR5cGUtPnRwX3JpY2hjb21wYXJlID0gYmFzZS0+dHBfcmljaGNvbXBhcmU7CisgICAgICAgICAgICB0eXBlLT50cF9oYXNoID0gYmFzZS0+dHBfaGFzaDsKKyAgICAgICAgICAgIC8qIENoZWNrIGZvciBjaGFuZ2VzIHRvIGluaGVyaXRlZCBtZXRob2RzIGluIFB5M2sqLworICAgICAgICAgICAgaWYgKFB5X1B5M2tXYXJuaW5nRmxhZykgeworICAgICAgICAgICAgICAgIGlmIChiYXNlLT50cF9oYXNoICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiYXNlLT50cF9oYXNoICE9IFB5T2JqZWN0X0hhc2hOb3RJbXBsZW1lbnRlZCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIU9WRVJSSURFU19IQVNIKHR5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChPVkVSUklERVNfQ01QKHR5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBQeUVycl9XYXJuUHkzaygiT3ZlcnJpZGluZyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJfX2NtcF9fIGJsb2NrcyBpbmhlcml0YW5jZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJvZiBfX2hhc2hfXyBpbiAzLngiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoT1ZFUlJJREVTX0VRKHR5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBQeUVycl9XYXJuUHkzaygiT3ZlcnJpZGluZyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJfX2VxX18gYmxvY2tzIGluaGVyaXRhbmNlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIm9mIF9faGFzaF9fIGluIDMueCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBDT1BZU0xPVCh0cF9jb21wYXJlKTsKKyAgICB9CisgICAgaWYgKHR5cGUtPnRwX2ZsYWdzICYgYmFzZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hBVkVfSVRFUikgeworICAgICAgICBDT1BZU0xPVCh0cF9pdGVyKTsKKyAgICAgICAgQ09QWVNMT1QodHBfaXRlcm5leHQpOworICAgIH0KKyAgICBpZiAodHlwZS0+dHBfZmxhZ3MgJiBiYXNlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEFWRV9DTEFTUykgeworICAgICAgICBDT1BZU0xPVCh0cF9kZXNjcl9nZXQpOworICAgICAgICBDT1BZU0xPVCh0cF9kZXNjcl9zZXQpOworICAgICAgICBDT1BZU0xPVCh0cF9kaWN0b2Zmc2V0KTsKKyAgICAgICAgQ09QWVNMT1QodHBfaW5pdCk7CisgICAgICAgIENPUFlTTE9UKHRwX2FsbG9jKTsKKyAgICAgICAgQ09QWVNMT1QodHBfaXNfZ2MpOworICAgICAgICBpZiAoKHR5cGUtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IQVZFX0dDKSA9PQorICAgICAgICAgICAgKGJhc2UtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IQVZFX0dDKSkgeworICAgICAgICAgICAgLyogVGhleSBhZ3JlZSBhYm91dCBnYy4gKi8KKyAgICAgICAgICAgIENPUFlTTE9UKHRwX2ZyZWUpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCh0eXBlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEFWRV9HQykgJiYKKyAgICAgICAgICAgICAgICAgdHlwZS0+dHBfZnJlZSA9PSBOVUxMICYmCisgICAgICAgICAgICAgICAgIGJhc2UtPnRwX2ZyZWUgPT0gX1B5T2JqZWN0X0RlbCkgeworICAgICAgICAgICAgLyogQSBiaXQgb2YgbWFnaWMgdG8gcGx1ZyBpbiB0aGUgY29ycmVjdCBkZWZhdWx0CisgICAgICAgICAgICAgKiB0cF9mcmVlIGZ1bmN0aW9uIHdoZW4gYSBkZXJpdmVkIGNsYXNzIGFkZHMgZ2MsCisgICAgICAgICAgICAgKiBkaWRuJ3QgZGVmaW5lIHRwX2ZyZWUsIGFuZCB0aGUgYmFzZSB1c2VzIHRoZQorICAgICAgICAgICAgICogZGVmYXVsdCBub24tZ2MgdHBfZnJlZS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgdHlwZS0+dHBfZnJlZSA9IFB5T2JqZWN0X0dDX0RlbDsKKyAgICAgICAgfQorICAgICAgICAvKiBlbHNlIHRoZXkgZGlkbid0IGFncmVlIGFib3V0IGdjLCBhbmQgdGhlcmUgaXNuJ3Qgc29tZXRoaW5nCisgICAgICAgICAqIG9idmlvdXMgdG8gYmUgZG9uZSAtLSB0aGUgdHlwZSBpcyBvbiBpdHMgb3duLgorICAgICAgICAgKi8KKyAgICB9CiB9CiAKIHN0YXRpYyBpbnQgYWRkX29wZXJhdG9ycyhQeVR5cGVPYmplY3QgKik7CkBAIC0zOTA5LDI0NCArMzkwOSwyNDQgQEAKIGludAogUHlUeXBlX1JlYWR5KFB5VHlwZU9iamVjdCAqdHlwZSkKIHsKLQlQeU9iamVjdCAqZGljdCwgKmJhc2VzOwotCVB5VHlwZU9iamVjdCAqYmFzZTsKLQlQeV9zc2l6ZV90IGksIG47CisgICAgUHlPYmplY3QgKmRpY3QsICpiYXNlczsKKyAgICBQeVR5cGVPYmplY3QgKmJhc2U7CisgICAgUHlfc3NpemVfdCBpLCBuOwogCi0JaWYgKHR5cGUtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19SRUFEWSkgewotCQlhc3NlcnQodHlwZS0+dHBfZGljdCAhPSBOVUxMKTsKLQkJcmV0dXJuIDA7Ci0JfQotCWFzc2VydCgodHlwZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX1JFQURZSU5HKSA9PSAwKTsKKyAgICBpZiAodHlwZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX1JFQURZKSB7CisgICAgICAgIGFzc2VydCh0eXBlLT50cF9kaWN0ICE9IE5VTEwpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgYXNzZXJ0KCh0eXBlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfUkVBRFlJTkcpID09IDApOwogCi0JdHlwZS0+dHBfZmxhZ3MgfD0gUHlfVFBGTEFHU19SRUFEWUlORzsKKyAgICB0eXBlLT50cF9mbGFncyB8PSBQeV9UUEZMQUdTX1JFQURZSU5HOwogCiAjaWZkZWYgUHlfVFJBQ0VfUkVGUwotCS8qIFB5VHlwZV9SZWFkeSBpcyB0aGUgY2xvc2VzdCB0aGluZyB3ZSBoYXZlIHRvIGEgY2hva2UgcG9pbnQKLQkgKiBmb3IgdHlwZSBvYmplY3RzLCBzbyBpcyB0aGUgYmVzdCBwbGFjZSBJIGNhbiB0aGluayBvZiB0byB0cnkKLQkgKiB0byBnZXQgdHlwZSBvYmplY3RzIGludG8gdGhlIGRvdWJseS1saW5rZWQgbGlzdCBvZiBhbGwgb2JqZWN0cy4KLQkgKiBTdGlsbCwgbm90IGFsbCB0eXBlIG9iamVjdHMgZ28gdGhydSBQeVR5cGVfUmVhZHkuCi0JICovCi0JX1B5X0FkZFRvQWxsT2JqZWN0cygoUHlPYmplY3QgKil0eXBlLCAwKTsKKyAgICAvKiBQeVR5cGVfUmVhZHkgaXMgdGhlIGNsb3Nlc3QgdGhpbmcgd2UgaGF2ZSB0byBhIGNob2tlIHBvaW50CisgICAgICogZm9yIHR5cGUgb2JqZWN0cywgc28gaXMgdGhlIGJlc3QgcGxhY2UgSSBjYW4gdGhpbmsgb2YgdG8gdHJ5CisgICAgICogdG8gZ2V0IHR5cGUgb2JqZWN0cyBpbnRvIHRoZSBkb3VibHktbGlua2VkIGxpc3Qgb2YgYWxsIG9iamVjdHMuCisgICAgICogU3RpbGwsIG5vdCBhbGwgdHlwZSBvYmplY3RzIGdvIHRocnUgUHlUeXBlX1JlYWR5LgorICAgICAqLworICAgIF9QeV9BZGRUb0FsbE9iamVjdHMoKFB5T2JqZWN0ICopdHlwZSwgMCk7CiAjZW5kaWYKIAotCS8qIEluaXRpYWxpemUgdHBfYmFzZSAoZGVmYXVsdHMgdG8gQmFzZU9iamVjdCB1bmxlc3MgdGhhdCdzIHVzKSAqLwotCWJhc2UgPSB0eXBlLT50cF9iYXNlOwotCWlmIChiYXNlID09IE5VTEwgJiYgdHlwZSAhPSAmUHlCYXNlT2JqZWN0X1R5cGUpIHsKLQkJYmFzZSA9IHR5cGUtPnRwX2Jhc2UgPSAmUHlCYXNlT2JqZWN0X1R5cGU7Ci0JCVB5X0lOQ1JFRihiYXNlKTsKLQl9CisgICAgLyogSW5pdGlhbGl6ZSB0cF9iYXNlIChkZWZhdWx0cyB0byBCYXNlT2JqZWN0IHVubGVzcyB0aGF0J3MgdXMpICovCisgICAgYmFzZSA9IHR5cGUtPnRwX2Jhc2U7CisgICAgaWYgKGJhc2UgPT0gTlVMTCAmJiB0eXBlICE9ICZQeUJhc2VPYmplY3RfVHlwZSkgeworICAgICAgICBiYXNlID0gdHlwZS0+dHBfYmFzZSA9ICZQeUJhc2VPYmplY3RfVHlwZTsKKyAgICAgICAgUHlfSU5DUkVGKGJhc2UpOworICAgIH0KIAotCS8qIE5vdyB0aGUgb25seSB3YXkgYmFzZSBjYW4gc3RpbGwgYmUgTlVMTCBpcyBpZiB0eXBlIGlzCi0JICogJlB5QmFzZU9iamVjdF9UeXBlLgotCSAqLworICAgIC8qIE5vdyB0aGUgb25seSB3YXkgYmFzZSBjYW4gc3RpbGwgYmUgTlVMTCBpcyBpZiB0eXBlIGlzCisgICAgICogJlB5QmFzZU9iamVjdF9UeXBlLgorICAgICAqLwogCi0JLyogSW5pdGlhbGl6ZSB0aGUgYmFzZSBjbGFzcyAqLwotCWlmIChiYXNlICYmIGJhc2UtPnRwX2RpY3QgPT0gTlVMTCkgewotCQlpZiAoUHlUeXBlX1JlYWR5KGJhc2UpIDwgMCkKLQkJCWdvdG8gZXJyb3I7Ci0JfQorICAgIC8qIEluaXRpYWxpemUgdGhlIGJhc2UgY2xhc3MgKi8KKyAgICBpZiAoYmFzZSAmJiBiYXNlLT50cF9kaWN0ID09IE5VTEwpIHsKKyAgICAgICAgaWYgKFB5VHlwZV9SZWFkeShiYXNlKSA8IDApCisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgIH0KIAotCS8qIEluaXRpYWxpemUgb2JfdHlwZSBpZiBOVUxMLglUaGlzIG1lYW5zIGV4dGVuc2lvbnMgdGhhdCB3YW50IHRvIGJlCi0JICAgY29tcGlsYWJsZSBzZXBhcmF0ZWx5IG9uIFdpbmRvd3MgY2FuIGNhbGwgUHlUeXBlX1JlYWR5KCkgaW5zdGVhZCBvZgotCSAgIGluaXRpYWxpemluZyB0aGUgb2JfdHlwZSBmaWVsZCBvZiB0aGVpciB0eXBlIG9iamVjdHMuICovCi0JLyogVGhlIHRlc3QgZm9yIGJhc2UgIT0gTlVMTCBpcyByZWFsbHkgdW5uZWNlc3NhcnksIHNpbmNlIGJhc2UgaXMgb25seQotCSAgIE5VTEwgd2hlbiB0eXBlIGlzICZQeUJhc2VPYmplY3RfVHlwZSwgYW5kIHdlIGtub3cgaXRzIG9iX3R5cGUgaXMKLQkgICBub3QgTlVMTCAoaXQncyBpbml0aWFsaXplZCB0byAmUHlUeXBlX1R5cGUpLgkgQnV0IGNvdmVyaXR5IGRvZXNuJ3QKLQkgICBrbm93IHRoYXQuICovCi0JaWYgKFB5X1RZUEUodHlwZSkgPT0gTlVMTCAmJiBiYXNlICE9IE5VTEwpCi0JCVB5X1RZUEUodHlwZSkgPSBQeV9UWVBFKGJhc2UpOworICAgIC8qIEluaXRpYWxpemUgb2JfdHlwZSBpZiBOVUxMLiAgICAgIFRoaXMgbWVhbnMgZXh0ZW5zaW9ucyB0aGF0IHdhbnQgdG8gYmUKKyAgICAgICBjb21waWxhYmxlIHNlcGFyYXRlbHkgb24gV2luZG93cyBjYW4gY2FsbCBQeVR5cGVfUmVhZHkoKSBpbnN0ZWFkIG9mCisgICAgICAgaW5pdGlhbGl6aW5nIHRoZSBvYl90eXBlIGZpZWxkIG9mIHRoZWlyIHR5cGUgb2JqZWN0cy4gKi8KKyAgICAvKiBUaGUgdGVzdCBmb3IgYmFzZSAhPSBOVUxMIGlzIHJlYWxseSB1bm5lY2Vzc2FyeSwgc2luY2UgYmFzZSBpcyBvbmx5CisgICAgICAgTlVMTCB3aGVuIHR5cGUgaXMgJlB5QmFzZU9iamVjdF9UeXBlLCBhbmQgd2Uga25vdyBpdHMgb2JfdHlwZSBpcworICAgICAgIG5vdCBOVUxMIChpdCdzIGluaXRpYWxpemVkIHRvICZQeVR5cGVfVHlwZSkuICAgICAgQnV0IGNvdmVyaXR5IGRvZXNuJ3QKKyAgICAgICBrbm93IHRoYXQuICovCisgICAgaWYgKFB5X1RZUEUodHlwZSkgPT0gTlVMTCAmJiBiYXNlICE9IE5VTEwpCisgICAgICAgIFB5X1RZUEUodHlwZSkgPSBQeV9UWVBFKGJhc2UpOwogCi0JLyogSW5pdGlhbGl6ZSB0cF9iYXNlcyAqLwotCWJhc2VzID0gdHlwZS0+dHBfYmFzZXM7Ci0JaWYgKGJhc2VzID09IE5VTEwpIHsKLQkJaWYgKGJhc2UgPT0gTlVMTCkKLQkJCWJhc2VzID0gUHlUdXBsZV9OZXcoMCk7Ci0JCWVsc2UKLQkJCWJhc2VzID0gUHlUdXBsZV9QYWNrKDEsIGJhc2UpOwotCQlpZiAoYmFzZXMgPT0gTlVMTCkKLQkJCWdvdG8gZXJyb3I7Ci0JCXR5cGUtPnRwX2Jhc2VzID0gYmFzZXM7Ci0JfQorICAgIC8qIEluaXRpYWxpemUgdHBfYmFzZXMgKi8KKyAgICBiYXNlcyA9IHR5cGUtPnRwX2Jhc2VzOworICAgIGlmIChiYXNlcyA9PSBOVUxMKSB7CisgICAgICAgIGlmIChiYXNlID09IE5VTEwpCisgICAgICAgICAgICBiYXNlcyA9IFB5VHVwbGVfTmV3KDApOworICAgICAgICBlbHNlCisgICAgICAgICAgICBiYXNlcyA9IFB5VHVwbGVfUGFjaygxLCBiYXNlKTsKKyAgICAgICAgaWYgKGJhc2VzID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB0eXBlLT50cF9iYXNlcyA9IGJhc2VzOworICAgIH0KIAotCS8qIEluaXRpYWxpemUgdHBfZGljdCAqLwotCWRpY3QgPSB0eXBlLT50cF9kaWN0OwotCWlmIChkaWN0ID09IE5VTEwpIHsKLQkJZGljdCA9IFB5RGljdF9OZXcoKTsKLQkJaWYgKGRpY3QgPT0gTlVMTCkKLQkJCWdvdG8gZXJyb3I7Ci0JCXR5cGUtPnRwX2RpY3QgPSBkaWN0OwotCX0KKyAgICAvKiBJbml0aWFsaXplIHRwX2RpY3QgKi8KKyAgICBkaWN0ID0gdHlwZS0+dHBfZGljdDsKKyAgICBpZiAoZGljdCA9PSBOVUxMKSB7CisgICAgICAgIGRpY3QgPSBQeURpY3RfTmV3KCk7CisgICAgICAgIGlmIChkaWN0ID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB0eXBlLT50cF9kaWN0ID0gZGljdDsKKyAgICB9CiAKLQkvKiBBZGQgdHlwZS1zcGVjaWZpYyBkZXNjcmlwdG9ycyB0byB0cF9kaWN0ICovCi0JaWYgKGFkZF9vcGVyYXRvcnModHlwZSkgPCAwKQotCQlnb3RvIGVycm9yOwotCWlmICh0eXBlLT50cF9tZXRob2RzICE9IE5VTEwpIHsKLQkJaWYgKGFkZF9tZXRob2RzKHR5cGUsIHR5cGUtPnRwX21ldGhvZHMpIDwgMCkKLQkJCWdvdG8gZXJyb3I7Ci0JfQotCWlmICh0eXBlLT50cF9tZW1iZXJzICE9IE5VTEwpIHsKLQkJaWYgKGFkZF9tZW1iZXJzKHR5cGUsIHR5cGUtPnRwX21lbWJlcnMpIDwgMCkKLQkJCWdvdG8gZXJyb3I7Ci0JfQotCWlmICh0eXBlLT50cF9nZXRzZXQgIT0gTlVMTCkgewotCQlpZiAoYWRkX2dldHNldCh0eXBlLCB0eXBlLT50cF9nZXRzZXQpIDwgMCkKLQkJCWdvdG8gZXJyb3I7Ci0JfQorICAgIC8qIEFkZCB0eXBlLXNwZWNpZmljIGRlc2NyaXB0b3JzIHRvIHRwX2RpY3QgKi8KKyAgICBpZiAoYWRkX29wZXJhdG9ycyh0eXBlKSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgaWYgKHR5cGUtPnRwX21ldGhvZHMgIT0gTlVMTCkgeworICAgICAgICBpZiAoYWRkX21ldGhvZHModHlwZSwgdHlwZS0+dHBfbWV0aG9kcykgPCAwKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgaWYgKHR5cGUtPnRwX21lbWJlcnMgIT0gTlVMTCkgeworICAgICAgICBpZiAoYWRkX21lbWJlcnModHlwZSwgdHlwZS0+dHBfbWVtYmVycykgPCAwKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgaWYgKHR5cGUtPnRwX2dldHNldCAhPSBOVUxMKSB7CisgICAgICAgIGlmIChhZGRfZ2V0c2V0KHR5cGUsIHR5cGUtPnRwX2dldHNldCkgPCAwKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CiAKLQkvKiBDYWxjdWxhdGUgbWV0aG9kIHJlc29sdXRpb24gb3JkZXIgKi8KLQlpZiAobXJvX2ludGVybmFsKHR5cGUpIDwgMCkgewotCQlnb3RvIGVycm9yOwotCX0KKyAgICAvKiBDYWxjdWxhdGUgbWV0aG9kIHJlc29sdXRpb24gb3JkZXIgKi8KKyAgICBpZiAobXJvX2ludGVybmFsKHR5cGUpIDwgMCkgeworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KIAotCS8qIEluaGVyaXQgc3BlY2lhbCBmbGFncyBmcm9tIGRvbWluYW50IGJhc2UgKi8KLQlpZiAodHlwZS0+dHBfYmFzZSAhPSBOVUxMKQotCQlpbmhlcml0X3NwZWNpYWwodHlwZSwgdHlwZS0+dHBfYmFzZSk7CisgICAgLyogSW5oZXJpdCBzcGVjaWFsIGZsYWdzIGZyb20gZG9taW5hbnQgYmFzZSAqLworICAgIGlmICh0eXBlLT50cF9iYXNlICE9IE5VTEwpCisgICAgICAgIGluaGVyaXRfc3BlY2lhbCh0eXBlLCB0eXBlLT50cF9iYXNlKTsKIAotCS8qIEluaXRpYWxpemUgdHBfZGljdCBwcm9wZXJseSAqLwotCWJhc2VzID0gdHlwZS0+dHBfbXJvOwotCWFzc2VydChiYXNlcyAhPSBOVUxMKTsKLQlhc3NlcnQoUHlUdXBsZV9DaGVjayhiYXNlcykpOwotCW4gPSBQeVR1cGxlX0dFVF9TSVpFKGJhc2VzKTsKLQlmb3IgKGkgPSAxOyBpIDwgbjsgaSsrKSB7Ci0JCVB5T2JqZWN0ICpiID0gUHlUdXBsZV9HRVRfSVRFTShiYXNlcywgaSk7Ci0JCWlmIChQeVR5cGVfQ2hlY2soYikpCi0JCQlpbmhlcml0X3Nsb3RzKHR5cGUsIChQeVR5cGVPYmplY3QgKiliKTsKLQl9CisgICAgLyogSW5pdGlhbGl6ZSB0cF9kaWN0IHByb3Blcmx5ICovCisgICAgYmFzZXMgPSB0eXBlLT50cF9tcm87CisgICAgYXNzZXJ0KGJhc2VzICE9IE5VTEwpOworICAgIGFzc2VydChQeVR1cGxlX0NoZWNrKGJhc2VzKSk7CisgICAgbiA9IFB5VHVwbGVfR0VUX1NJWkUoYmFzZXMpOworICAgIGZvciAoaSA9IDE7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgUHlPYmplY3QgKmIgPSBQeVR1cGxlX0dFVF9JVEVNKGJhc2VzLCBpKTsKKyAgICAgICAgaWYgKFB5VHlwZV9DaGVjayhiKSkKKyAgICAgICAgICAgIGluaGVyaXRfc2xvdHModHlwZSwgKFB5VHlwZU9iamVjdCAqKWIpOworICAgIH0KIAotCS8qIFNhbml0eSBjaGVjayBmb3IgdHBfZnJlZS4gKi8KLQlpZiAoUHlUeXBlX0lTX0dDKHR5cGUpICYmICh0eXBlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfQkFTRVRZUEUpICYmCi0JICAgICh0eXBlLT50cF9mcmVlID09IE5VTEwgfHwgdHlwZS0+dHBfZnJlZSA9PSBQeU9iamVjdF9EZWwpKSB7Ci0JCS8qIFRoaXMgYmFzZSBjbGFzcyBuZWVkcyB0byBjYWxsIHRwX2ZyZWUsIGJ1dCBkb2Vzbid0IGhhdmUKLQkJICogb25lLCBvciBpdHMgdHBfZnJlZSBpcyBmb3Igbm9uLWdjJ2VkIG9iamVjdHMuCi0JCSAqLwotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAidHlwZSAnJS4xMDBzJyBwYXJ0aWNpcGF0ZXMgaW4gIgotCQkJICAgICAiZ2MgYW5kIGlzIGEgYmFzZSB0eXBlIGJ1dCBoYXMgaW5hcHByb3ByaWF0ZSAiCi0JCQkgICAgICJ0cF9mcmVlIHNsb3QiLAotCQkJICAgICB0eXBlLT50cF9uYW1lKTsKLQkJZ290byBlcnJvcjsKLQl9CisgICAgLyogU2FuaXR5IGNoZWNrIGZvciB0cF9mcmVlLiAqLworICAgIGlmIChQeVR5cGVfSVNfR0ModHlwZSkgJiYgKHR5cGUtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19CQVNFVFlQRSkgJiYKKyAgICAgICAgKHR5cGUtPnRwX2ZyZWUgPT0gTlVMTCB8fCB0eXBlLT50cF9mcmVlID09IFB5T2JqZWN0X0RlbCkpIHsKKyAgICAgICAgLyogVGhpcyBiYXNlIGNsYXNzIG5lZWRzIHRvIGNhbGwgdHBfZnJlZSwgYnV0IGRvZXNuJ3QgaGF2ZQorICAgICAgICAgKiBvbmUsIG9yIGl0cyB0cF9mcmVlIGlzIGZvciBub24tZ2MnZWQgb2JqZWN0cy4KKyAgICAgICAgICovCisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICJ0eXBlICclLjEwMHMnIHBhcnRpY2lwYXRlcyBpbiAiCisgICAgICAgICAgICAgICAgICAgICAiZ2MgYW5kIGlzIGEgYmFzZSB0eXBlIGJ1dCBoYXMgaW5hcHByb3ByaWF0ZSAiCisgICAgICAgICAgICAgICAgICAgICAidHBfZnJlZSBzbG90IiwKKyAgICAgICAgICAgICAgICAgICAgIHR5cGUtPnRwX25hbWUpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KIAotCS8qIGlmIHRoZSB0eXBlIGRpY3Rpb25hcnkgZG9lc24ndCBjb250YWluIGEgX19kb2NfXywgc2V0IGl0IGZyb20KLQkgICB0aGUgdHBfZG9jIHNsb3QuCi0JICovCi0JaWYgKFB5RGljdF9HZXRJdGVtU3RyaW5nKHR5cGUtPnRwX2RpY3QsICJfX2RvY19fIikgPT0gTlVMTCkgewotCQlpZiAodHlwZS0+dHBfZG9jICE9IE5VTEwpIHsKLQkJCVB5T2JqZWN0ICpkb2MgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKHR5cGUtPnRwX2RvYyk7Ci0JCQlpZiAoZG9jID09IE5VTEwpCi0JCQkJZ290byBlcnJvcjsKLQkJCVB5RGljdF9TZXRJdGVtU3RyaW5nKHR5cGUtPnRwX2RpY3QsICJfX2RvY19fIiwgZG9jKTsKLQkJCVB5X0RFQ1JFRihkb2MpOwotCQl9IGVsc2UgewotCQkJUHlEaWN0X1NldEl0ZW1TdHJpbmcodHlwZS0+dHBfZGljdCwKLQkJCQkJICAgICAiX19kb2NfXyIsIFB5X05vbmUpOwotCQl9Ci0JfQorICAgIC8qIGlmIHRoZSB0eXBlIGRpY3Rpb25hcnkgZG9lc24ndCBjb250YWluIGEgX19kb2NfXywgc2V0IGl0IGZyb20KKyAgICAgICB0aGUgdHBfZG9jIHNsb3QuCisgICAgICovCisgICAgaWYgKFB5RGljdF9HZXRJdGVtU3RyaW5nKHR5cGUtPnRwX2RpY3QsICJfX2RvY19fIikgPT0gTlVMTCkgeworICAgICAgICBpZiAodHlwZS0+dHBfZG9jICE9IE5VTEwpIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpkb2MgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKHR5cGUtPnRwX2RvYyk7CisgICAgICAgICAgICBpZiAoZG9jID09IE5VTEwpCisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKHR5cGUtPnRwX2RpY3QsICJfX2RvY19fIiwgZG9jKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihkb2MpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcodHlwZS0+dHBfZGljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfX2RvY19fIiwgUHlfTm9uZSk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKiBTb21lIG1vcmUgc3BlY2lhbCBzdHVmZiAqLwotCWJhc2UgPSB0eXBlLT50cF9iYXNlOwotCWlmIChiYXNlICE9IE5VTEwpIHsKLQkJaWYgKHR5cGUtPnRwX2FzX251bWJlciA9PSBOVUxMKQotCQkJdHlwZS0+dHBfYXNfbnVtYmVyID0gYmFzZS0+dHBfYXNfbnVtYmVyOwotCQlpZiAodHlwZS0+dHBfYXNfc2VxdWVuY2UgPT0gTlVMTCkKLQkJCXR5cGUtPnRwX2FzX3NlcXVlbmNlID0gYmFzZS0+dHBfYXNfc2VxdWVuY2U7Ci0JCWlmICh0eXBlLT50cF9hc19tYXBwaW5nID09IE5VTEwpCi0JCQl0eXBlLT50cF9hc19tYXBwaW5nID0gYmFzZS0+dHBfYXNfbWFwcGluZzsKLQkJaWYgKHR5cGUtPnRwX2FzX2J1ZmZlciA9PSBOVUxMKQotCQkJdHlwZS0+dHBfYXNfYnVmZmVyID0gYmFzZS0+dHBfYXNfYnVmZmVyOwotCX0KKyAgICAvKiBTb21lIG1vcmUgc3BlY2lhbCBzdHVmZiAqLworICAgIGJhc2UgPSB0eXBlLT50cF9iYXNlOworICAgIGlmIChiYXNlICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKHR5cGUtPnRwX2FzX251bWJlciA9PSBOVUxMKQorICAgICAgICAgICAgdHlwZS0+dHBfYXNfbnVtYmVyID0gYmFzZS0+dHBfYXNfbnVtYmVyOworICAgICAgICBpZiAodHlwZS0+dHBfYXNfc2VxdWVuY2UgPT0gTlVMTCkKKyAgICAgICAgICAgIHR5cGUtPnRwX2FzX3NlcXVlbmNlID0gYmFzZS0+dHBfYXNfc2VxdWVuY2U7CisgICAgICAgIGlmICh0eXBlLT50cF9hc19tYXBwaW5nID09IE5VTEwpCisgICAgICAgICAgICB0eXBlLT50cF9hc19tYXBwaW5nID0gYmFzZS0+dHBfYXNfbWFwcGluZzsKKyAgICAgICAgaWYgKHR5cGUtPnRwX2FzX2J1ZmZlciA9PSBOVUxMKQorICAgICAgICAgICAgdHlwZS0+dHBfYXNfYnVmZmVyID0gYmFzZS0+dHBfYXNfYnVmZmVyOworICAgIH0KIAotCS8qIExpbmsgaW50byBlYWNoIGJhc2UgY2xhc3MncyBsaXN0IG9mIHN1YmNsYXNzZXMgKi8KLQliYXNlcyA9IHR5cGUtPnRwX2Jhc2VzOwotCW4gPSBQeVR1cGxlX0dFVF9TSVpFKGJhc2VzKTsKLQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCVB5T2JqZWN0ICpiID0gUHlUdXBsZV9HRVRfSVRFTShiYXNlcywgaSk7Ci0JCWlmIChQeVR5cGVfQ2hlY2soYikgJiYKLQkJICAgIGFkZF9zdWJjbGFzcygoUHlUeXBlT2JqZWN0ICopYiwgdHlwZSkgPCAwKQotCQkJZ290byBlcnJvcjsKLQl9CisgICAgLyogTGluayBpbnRvIGVhY2ggYmFzZSBjbGFzcydzIGxpc3Qgb2Ygc3ViY2xhc3NlcyAqLworICAgIGJhc2VzID0gdHlwZS0+dHBfYmFzZXM7CisgICAgbiA9IFB5VHVwbGVfR0VUX1NJWkUoYmFzZXMpOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgUHlPYmplY3QgKmIgPSBQeVR1cGxlX0dFVF9JVEVNKGJhc2VzLCBpKTsKKyAgICAgICAgaWYgKFB5VHlwZV9DaGVjayhiKSAmJgorICAgICAgICAgICAgYWRkX3N1YmNsYXNzKChQeVR5cGVPYmplY3QgKiliLCB0eXBlKSA8IDApCisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgIH0KIAotCS8qIEFsbCBkb25lIC0tIHNldCB0aGUgcmVhZHkgZmxhZyAqLwotCWFzc2VydCh0eXBlLT50cF9kaWN0ICE9IE5VTEwpOwotCXR5cGUtPnRwX2ZsYWdzID0KLQkJKHR5cGUtPnRwX2ZsYWdzICYgflB5X1RQRkxBR1NfUkVBRFlJTkcpIHwgUHlfVFBGTEFHU19SRUFEWTsKLQlyZXR1cm4gMDsKKyAgICAvKiBBbGwgZG9uZSAtLSBzZXQgdGhlIHJlYWR5IGZsYWcgKi8KKyAgICBhc3NlcnQodHlwZS0+dHBfZGljdCAhPSBOVUxMKTsKKyAgICB0eXBlLT50cF9mbGFncyA9CisgICAgICAgICh0eXBlLT50cF9mbGFncyAmIH5QeV9UUEZMQUdTX1JFQURZSU5HKSB8IFB5X1RQRkxBR1NfUkVBRFk7CisgICAgcmV0dXJuIDA7CiAKICAgZXJyb3I6Ci0JdHlwZS0+dHBfZmxhZ3MgJj0gflB5X1RQRkxBR1NfUkVBRFlJTkc7Ci0JcmV0dXJuIC0xOworICAgIHR5cGUtPnRwX2ZsYWdzICY9IH5QeV9UUEZMQUdTX1JFQURZSU5HOworICAgIHJldHVybiAtMTsKIH0KIAogc3RhdGljIGludAogYWRkX3N1YmNsYXNzKFB5VHlwZU9iamVjdCAqYmFzZSwgUHlUeXBlT2JqZWN0ICp0eXBlKQogewotCVB5X3NzaXplX3QgaTsKLQlpbnQgcmVzdWx0OwotCVB5T2JqZWN0ICpsaXN0LCAqcmVmLCAqbmV3b2JqOworICAgIFB5X3NzaXplX3QgaTsKKyAgICBpbnQgcmVzdWx0OworICAgIFB5T2JqZWN0ICpsaXN0LCAqcmVmLCAqbmV3b2JqOwogCi0JbGlzdCA9IGJhc2UtPnRwX3N1YmNsYXNzZXM7Ci0JaWYgKGxpc3QgPT0gTlVMTCkgewotCQliYXNlLT50cF9zdWJjbGFzc2VzID0gbGlzdCA9IFB5TGlzdF9OZXcoMCk7Ci0JCWlmIChsaXN0ID09IE5VTEwpCi0JCQlyZXR1cm4gLTE7Ci0JfQotCWFzc2VydChQeUxpc3RfQ2hlY2sobGlzdCkpOwotCW5ld29iaiA9IFB5V2Vha3JlZl9OZXdSZWYoKFB5T2JqZWN0ICopdHlwZSwgTlVMTCk7Ci0JaSA9IFB5TGlzdF9HRVRfU0laRShsaXN0KTsKLQl3aGlsZSAoLS1pID49IDApIHsKLQkJcmVmID0gUHlMaXN0X0dFVF9JVEVNKGxpc3QsIGkpOwotCQlhc3NlcnQoUHlXZWFrcmVmX0NoZWNrUmVmKHJlZikpOwotCQlpZiAoUHlXZWFrcmVmX0dFVF9PQkpFQ1QocmVmKSA9PSBQeV9Ob25lKQotCQkJcmV0dXJuIFB5TGlzdF9TZXRJdGVtKGxpc3QsIGksIG5ld29iaik7Ci0JfQotCXJlc3VsdCA9IFB5TGlzdF9BcHBlbmQobGlzdCwgbmV3b2JqKTsKLQlQeV9ERUNSRUYobmV3b2JqKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIGxpc3QgPSBiYXNlLT50cF9zdWJjbGFzc2VzOworICAgIGlmIChsaXN0ID09IE5VTEwpIHsKKyAgICAgICAgYmFzZS0+dHBfc3ViY2xhc3NlcyA9IGxpc3QgPSBQeUxpc3RfTmV3KDApOworICAgICAgICBpZiAobGlzdCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBhc3NlcnQoUHlMaXN0X0NoZWNrKGxpc3QpKTsKKyAgICBuZXdvYmogPSBQeVdlYWtyZWZfTmV3UmVmKChQeU9iamVjdCAqKXR5cGUsIE5VTEwpOworICAgIGkgPSBQeUxpc3RfR0VUX1NJWkUobGlzdCk7CisgICAgd2hpbGUgKC0taSA+PSAwKSB7CisgICAgICAgIHJlZiA9IFB5TGlzdF9HRVRfSVRFTShsaXN0LCBpKTsKKyAgICAgICAgYXNzZXJ0KFB5V2Vha3JlZl9DaGVja1JlZihyZWYpKTsKKyAgICAgICAgaWYgKFB5V2Vha3JlZl9HRVRfT0JKRUNUKHJlZikgPT0gUHlfTm9uZSkKKyAgICAgICAgICAgIHJldHVybiBQeUxpc3RfU2V0SXRlbShsaXN0LCBpLCBuZXdvYmopOworICAgIH0KKyAgICByZXN1bHQgPSBQeUxpc3RfQXBwZW5kKGxpc3QsIG5ld29iaik7CisgICAgUHlfREVDUkVGKG5ld29iaik7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIHZvaWQKIHJlbW92ZV9zdWJjbGFzcyhQeVR5cGVPYmplY3QgKmJhc2UsIFB5VHlwZU9iamVjdCAqdHlwZSkKIHsKLQlQeV9zc2l6ZV90IGk7Ci0JUHlPYmplY3QgKmxpc3QsICpyZWY7CisgICAgUHlfc3NpemVfdCBpOworICAgIFB5T2JqZWN0ICpsaXN0LCAqcmVmOwogCi0JbGlzdCA9IGJhc2UtPnRwX3N1YmNsYXNzZXM7Ci0JaWYgKGxpc3QgPT0gTlVMTCkgewotCQlyZXR1cm47Ci0JfQotCWFzc2VydChQeUxpc3RfQ2hlY2sobGlzdCkpOwotCWkgPSBQeUxpc3RfR0VUX1NJWkUobGlzdCk7Ci0Jd2hpbGUgKC0taSA+PSAwKSB7Ci0JCXJlZiA9IFB5TGlzdF9HRVRfSVRFTShsaXN0LCBpKTsKLQkJYXNzZXJ0KFB5V2Vha3JlZl9DaGVja1JlZihyZWYpKTsKLQkJaWYgKFB5V2Vha3JlZl9HRVRfT0JKRUNUKHJlZikgPT0gKFB5T2JqZWN0Kil0eXBlKSB7Ci0JCQkvKiB0aGlzIGNhbid0IGZhaWwsIHJpZ2h0PyAqLwotCQkJUHlTZXF1ZW5jZV9EZWxJdGVtKGxpc3QsIGkpOwotCQkJcmV0dXJuOwotCQl9Ci0JfQorICAgIGxpc3QgPSBiYXNlLT50cF9zdWJjbGFzc2VzOworICAgIGlmIChsaXN0ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBhc3NlcnQoUHlMaXN0X0NoZWNrKGxpc3QpKTsKKyAgICBpID0gUHlMaXN0X0dFVF9TSVpFKGxpc3QpOworICAgIHdoaWxlICgtLWkgPj0gMCkgeworICAgICAgICByZWYgPSBQeUxpc3RfR0VUX0lURU0obGlzdCwgaSk7CisgICAgICAgIGFzc2VydChQeVdlYWtyZWZfQ2hlY2tSZWYocmVmKSk7CisgICAgICAgIGlmIChQeVdlYWtyZWZfR0VUX09CSkVDVChyZWYpID09IChQeU9iamVjdCopdHlwZSkgeworICAgICAgICAgICAgLyogdGhpcyBjYW4ndCBmYWlsLCByaWdodD8gKi8KKyAgICAgICAgICAgIFB5U2VxdWVuY2VfRGVsSXRlbShsaXN0LCBpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KIH0KIAogc3RhdGljIGludAogY2hlY2tfbnVtX2FyZ3MoUHlPYmplY3QgKm9iLCBpbnQgbikKIHsKLQlpZiAoIVB5VHVwbGVfQ2hlY2tFeGFjdChvYikpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAotCQkgICAgIlB5QXJnX1VucGFja1R1cGxlKCkgYXJndW1lbnQgbGlzdCBpcyBub3QgYSB0dXBsZSIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKG4gPT0gUHlUdXBsZV9HRVRfU0laRShvYikpCi0JCXJldHVybiAxOwotCVB5RXJyX0Zvcm1hdCgKLQkgICAgUHlFeGNfVHlwZUVycm9yLCAKLQkgICAgImV4cGVjdGVkICVkIGFyZ3VtZW50cywgZ290ICV6ZCIsIG4sIFB5VHVwbGVfR0VUX1NJWkUob2IpKTsKLQlyZXR1cm4gMDsKKyAgICBpZiAoIVB5VHVwbGVfQ2hlY2tFeGFjdChvYikpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgIlB5QXJnX1VucGFja1R1cGxlKCkgYXJndW1lbnQgbGlzdCBpcyBub3QgYSB0dXBsZSIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKG4gPT0gUHlUdXBsZV9HRVRfU0laRShvYikpCisgICAgICAgIHJldHVybiAxOworICAgIFB5RXJyX0Zvcm1hdCgKKyAgICAgICAgUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAiZXhwZWN0ZWQgJWQgYXJndW1lbnRzLCBnb3QgJXpkIiwgbiwgUHlUdXBsZV9HRVRfU0laRShvYikpOworICAgIHJldHVybiAwOwogfQogCiAvKiBHZW5lcmljIHdyYXBwZXJzIGZvciBvdmVybG9hZGFibGUgJ29wZXJhdG9ycycgc3VjaCBhcyBfX2dldGl0ZW1fXyAqLwogCiAvKiBUaGVyZSdzIGEgd3JhcHBlciAqZnVuY3Rpb24qIGZvciBlYWNoIGRpc3RpbmN0IGZ1bmN0aW9uIHR5cGVkZWYgdXNlZAotICAgZm9yIHR5cGUgb2JqZWN0IHNsb3RzIChlLmcuIGJpbmFyeWZ1bmMsIHRlcm5hcnlmdW5jLCBldGMuKS4JVGhlcmUncyBhCisgICBmb3IgdHlwZSBvYmplY3Qgc2xvdHMgKGUuZy4gYmluYXJ5ZnVuYywgdGVybmFyeWZ1bmMsIGV0Yy4pLiAgVGhlcmUncyBhCiAgICB3cmFwcGVyICp0YWJsZSogZm9yIGVhY2ggZGlzdGluY3Qgb3BlcmF0aW9uIChlLmcuIF9fbGVuX18sIF9fYWRkX18pLgogICAgTW9zdCB0YWJsZXMgaGF2ZSBvbmx5IG9uZSBlbnRyeTsgdGhlIHRhYmxlcyBmb3IgYmluYXJ5IG9wZXJhdG9ycyBoYXZlIHR3bwogICAgZW50cmllcywgb25lIHJlZ3VsYXIgYW5kIG9uZSB3aXRoIHJldmVyc2VkIGFyZ3VtZW50cy4gKi8KQEAgLTQxNTQsMzU3ICs0MTU0LDM1NyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHdyYXBfbGVuZnVuYyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIHZvaWQgKndyYXBwZWQpCiB7Ci0JbGVuZnVuYyBmdW5jID0gKGxlbmZ1bmMpd3JhcHBlZDsKLQlQeV9zc2l6ZV90IHJlczsKKyAgICBsZW5mdW5jIGZ1bmMgPSAobGVuZnVuYyl3cmFwcGVkOworICAgIFB5X3NzaXplX3QgcmVzOwogCi0JaWYgKCFjaGVja19udW1fYXJncyhhcmdzLCAwKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmVzID0gKCpmdW5jKShzZWxmKTsKLQlpZiAocmVzID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZylyZXMpOworICAgIGlmICghY2hlY2tfbnVtX2FyZ3MoYXJncywgMCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJlcyA9ICgqZnVuYykoc2VsZik7CisgICAgaWYgKHJlcyA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpcmVzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHdyYXBfaW5xdWlyeXByZWQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCB2b2lkICp3cmFwcGVkKQogewotCWlucXVpcnkgZnVuYyA9IChpbnF1aXJ5KXdyYXBwZWQ7Ci0JaW50IHJlczsKKyAgICBpbnF1aXJ5IGZ1bmMgPSAoaW5xdWlyeSl3cmFwcGVkOworICAgIGludCByZXM7CiAKLQlpZiAoIWNoZWNrX251bV9hcmdzKGFyZ3MsIDApKQotCQlyZXR1cm4gTlVMTDsKLQlyZXMgPSAoKmZ1bmMpKHNlbGYpOwotCWlmIChyZXMgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygobG9uZylyZXMpOworICAgIGlmICghY2hlY2tfbnVtX2FyZ3MoYXJncywgMCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJlcyA9ICgqZnVuYykoc2VsZik7CisgICAgaWYgKHJlcyA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKChsb25nKXJlcyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB3cmFwX2JpbmFyeWZ1bmMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCB2b2lkICp3cmFwcGVkKQogewotCWJpbmFyeWZ1bmMgZnVuYyA9IChiaW5hcnlmdW5jKXdyYXBwZWQ7Ci0JUHlPYmplY3QgKm90aGVyOworICAgIGJpbmFyeWZ1bmMgZnVuYyA9IChiaW5hcnlmdW5jKXdyYXBwZWQ7CisgICAgUHlPYmplY3QgKm90aGVyOwogCi0JaWYgKCFjaGVja19udW1fYXJncyhhcmdzLCAxKSkKLQkJcmV0dXJuIE5VTEw7Ci0Jb3RoZXIgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDApOwotCXJldHVybiAoKmZ1bmMpKHNlbGYsIG90aGVyKTsKKyAgICBpZiAoIWNoZWNrX251bV9hcmdzKGFyZ3MsIDEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBvdGhlciA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgMCk7CisgICAgcmV0dXJuICgqZnVuYykoc2VsZiwgb3RoZXIpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogd3JhcF9iaW5hcnlmdW5jX2woUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCB2b2lkICp3cmFwcGVkKQogewotCWJpbmFyeWZ1bmMgZnVuYyA9IChiaW5hcnlmdW5jKXdyYXBwZWQ7Ci0JUHlPYmplY3QgKm90aGVyOworICAgIGJpbmFyeWZ1bmMgZnVuYyA9IChiaW5hcnlmdW5jKXdyYXBwZWQ7CisgICAgUHlPYmplY3QgKm90aGVyOwogCi0JaWYgKCFjaGVja19udW1fYXJncyhhcmdzLCAxKSkKLQkJcmV0dXJuIE5VTEw7Ci0Jb3RoZXIgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDApOwotCWlmICghKHNlbGYtPm9iX3R5cGUtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19DSEVDS1RZUEVTKSAmJgotCSAgICAhUHlUeXBlX0lzU3VidHlwZShvdGhlci0+b2JfdHlwZSwgc2VsZi0+b2JfdHlwZSkpIHsKLQkJUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKLQkJcmV0dXJuIFB5X05vdEltcGxlbWVudGVkOwotCX0KLQlyZXR1cm4gKCpmdW5jKShzZWxmLCBvdGhlcik7CisgICAgaWYgKCFjaGVja19udW1fYXJncyhhcmdzLCAxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgb3RoZXIgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDApOworICAgIGlmICghKHNlbGYtPm9iX3R5cGUtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19DSEVDS1RZUEVTKSAmJgorICAgICAgICAhUHlUeXBlX0lzU3VidHlwZShvdGhlci0+b2JfdHlwZSwgc2VsZi0+b2JfdHlwZSkpIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKKyAgICAgICAgcmV0dXJuIFB5X05vdEltcGxlbWVudGVkOworICAgIH0KKyAgICByZXR1cm4gKCpmdW5jKShzZWxmLCBvdGhlcik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB3cmFwX2JpbmFyeWZ1bmNfcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIHZvaWQgKndyYXBwZWQpCiB7Ci0JYmluYXJ5ZnVuYyBmdW5jID0gKGJpbmFyeWZ1bmMpd3JhcHBlZDsKLQlQeU9iamVjdCAqb3RoZXI7CisgICAgYmluYXJ5ZnVuYyBmdW5jID0gKGJpbmFyeWZ1bmMpd3JhcHBlZDsKKyAgICBQeU9iamVjdCAqb3RoZXI7CiAKLQlpZiAoIWNoZWNrX251bV9hcmdzKGFyZ3MsIDEpKQotCQlyZXR1cm4gTlVMTDsKLQlvdGhlciA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgMCk7Ci0JaWYgKCEoc2VsZi0+b2JfdHlwZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0NIRUNLVFlQRVMpICYmCi0JICAgICFQeVR5cGVfSXNTdWJ0eXBlKG90aGVyLT5vYl90eXBlLCBzZWxmLT5vYl90eXBlKSkgewotCQlQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOwotCQlyZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7Ci0JfQotCXJldHVybiAoKmZ1bmMpKG90aGVyLCBzZWxmKTsKKyAgICBpZiAoIWNoZWNrX251bV9hcmdzKGFyZ3MsIDEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBvdGhlciA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgMCk7CisgICAgaWYgKCEoc2VsZi0+b2JfdHlwZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0NIRUNLVFlQRVMpICYmCisgICAgICAgICFQeVR5cGVfSXNTdWJ0eXBlKG90aGVyLT5vYl90eXBlLCBzZWxmLT5vYl90eXBlKSkgeworICAgICAgICBQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOworICAgICAgICByZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7CisgICAgfQorICAgIHJldHVybiAoKmZ1bmMpKG90aGVyLCBzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHdyYXBfY29lcmNlZnVuYyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIHZvaWQgKndyYXBwZWQpCiB7Ci0JY29lcmNpb24gZnVuYyA9IChjb2VyY2lvbil3cmFwcGVkOwotCVB5T2JqZWN0ICpvdGhlciwgKnJlczsKLQlpbnQgb2s7CisgICAgY29lcmNpb24gZnVuYyA9IChjb2VyY2lvbil3cmFwcGVkOworICAgIFB5T2JqZWN0ICpvdGhlciwgKnJlczsKKyAgICBpbnQgb2s7CiAKLQlpZiAoIWNoZWNrX251bV9hcmdzKGFyZ3MsIDEpKQotCQlyZXR1cm4gTlVMTDsKLQlvdGhlciA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgMCk7Ci0Jb2sgPSBmdW5jKCZzZWxmLCAmb3RoZXIpOwotCWlmIChvayA8IDApCi0JCXJldHVybiBOVUxMOwotCWlmIChvayA+IDApIHsKLQkJUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKLQkJcmV0dXJuIFB5X05vdEltcGxlbWVudGVkOwotCX0KLQlyZXMgPSBQeVR1cGxlX05ldygyKTsKLQlpZiAocmVzID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKHNlbGYpOwotCQlQeV9ERUNSRUYob3RoZXIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JUHlUdXBsZV9TRVRfSVRFTShyZXMsIDAsIHNlbGYpOwotCVB5VHVwbGVfU0VUX0lURU0ocmVzLCAxLCBvdGhlcik7Ci0JcmV0dXJuIHJlczsKKyAgICBpZiAoIWNoZWNrX251bV9hcmdzKGFyZ3MsIDEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBvdGhlciA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgMCk7CisgICAgb2sgPSBmdW5jKCZzZWxmLCAmb3RoZXIpOworICAgIGlmIChvayA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChvayA+IDApIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKKyAgICAgICAgcmV0dXJuIFB5X05vdEltcGxlbWVudGVkOworICAgIH0KKyAgICByZXMgPSBQeVR1cGxlX05ldygyKTsKKyAgICBpZiAocmVzID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKHNlbGYpOworICAgICAgICBQeV9ERUNSRUYob3RoZXIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlUdXBsZV9TRVRfSVRFTShyZXMsIDAsIHNlbGYpOworICAgIFB5VHVwbGVfU0VUX0lURU0ocmVzLCAxLCBvdGhlcik7CisgICAgcmV0dXJuIHJlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHdyYXBfdGVybmFyeWZ1bmMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCB2b2lkICp3cmFwcGVkKQogewotCXRlcm5hcnlmdW5jIGZ1bmMgPSAodGVybmFyeWZ1bmMpd3JhcHBlZDsKLQlQeU9iamVjdCAqb3RoZXI7Ci0JUHlPYmplY3QgKnRoaXJkID0gUHlfTm9uZTsKKyAgICB0ZXJuYXJ5ZnVuYyBmdW5jID0gKHRlcm5hcnlmdW5jKXdyYXBwZWQ7CisgICAgUHlPYmplY3QgKm90aGVyOworICAgIFB5T2JqZWN0ICp0aGlyZCA9IFB5X05vbmU7CiAKLQkvKiBOb3RlOiBUaGlzIHdyYXBwZXIgb25seSB3b3JrcyBmb3IgX19wb3dfXygpICovCisgICAgLyogTm90ZTogVGhpcyB3cmFwcGVyIG9ubHkgd29ya3MgZm9yIF9fcG93X18oKSAqLwogCi0JaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiIiwgMSwgMiwgJm90aGVyLCAmdGhpcmQpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gKCpmdW5jKShzZWxmLCBvdGhlciwgdGhpcmQpOworICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgIiIsIDEsIDIsICZvdGhlciwgJnRoaXJkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuICgqZnVuYykoc2VsZiwgb3RoZXIsIHRoaXJkKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHdyYXBfdGVybmFyeWZ1bmNfcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIHZvaWQgKndyYXBwZWQpCiB7Ci0JdGVybmFyeWZ1bmMgZnVuYyA9ICh0ZXJuYXJ5ZnVuYyl3cmFwcGVkOwotCVB5T2JqZWN0ICpvdGhlcjsKLQlQeU9iamVjdCAqdGhpcmQgPSBQeV9Ob25lOworICAgIHRlcm5hcnlmdW5jIGZ1bmMgPSAodGVybmFyeWZ1bmMpd3JhcHBlZDsKKyAgICBQeU9iamVjdCAqb3RoZXI7CisgICAgUHlPYmplY3QgKnRoaXJkID0gUHlfTm9uZTsKIAotCS8qIE5vdGU6IFRoaXMgd3JhcHBlciBvbmx5IHdvcmtzIGZvciBfX3Bvd19fKCkgKi8KKyAgICAvKiBOb3RlOiBUaGlzIHdyYXBwZXIgb25seSB3b3JrcyBmb3IgX19wb3dfXygpICovCiAKLQlpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICIiLCAxLCAyLCAmb3RoZXIsICZ0aGlyZCkpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiAoKmZ1bmMpKG90aGVyLCBzZWxmLCB0aGlyZCk7CisgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiIiwgMSwgMiwgJm90aGVyLCAmdGhpcmQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gKCpmdW5jKShvdGhlciwgc2VsZiwgdGhpcmQpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogd3JhcF91bmFyeWZ1bmMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCB2b2lkICp3cmFwcGVkKQogewotCXVuYXJ5ZnVuYyBmdW5jID0gKHVuYXJ5ZnVuYyl3cmFwcGVkOworICAgIHVuYXJ5ZnVuYyBmdW5jID0gKHVuYXJ5ZnVuYyl3cmFwcGVkOwogCi0JaWYgKCFjaGVja19udW1fYXJncyhhcmdzLCAwKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuICgqZnVuYykoc2VsZik7CisgICAgaWYgKCFjaGVja19udW1fYXJncyhhcmdzLCAwKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuICgqZnVuYykoc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB3cmFwX2luZGV4YXJnZnVuYyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIHZvaWQgKndyYXBwZWQpCiB7Ci0Jc3NpemVhcmdmdW5jIGZ1bmMgPSAoc3NpemVhcmdmdW5jKXdyYXBwZWQ7Ci0JUHlPYmplY3QqIG87Ci0JUHlfc3NpemVfdCBpOworICAgIHNzaXplYXJnZnVuYyBmdW5jID0gKHNzaXplYXJnZnVuYyl3cmFwcGVkOworICAgIFB5T2JqZWN0KiBvOworICAgIFB5X3NzaXplX3QgaTsKIAotCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgIiIsIDEsIDEsICZvKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaSA9IFB5TnVtYmVyX0FzU3NpemVfdChvLCBQeUV4Y19PdmVyZmxvd0Vycm9yKTsKLQlpZiAoaSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gKCpmdW5jKShzZWxmLCBpKTsKKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICIiLCAxLCAxLCAmbykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGkgPSBQeU51bWJlcl9Bc1NzaXplX3QobywgUHlFeGNfT3ZlcmZsb3dFcnJvcik7CisgICAgaWYgKGkgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuICgqZnVuYykoc2VsZiwgaSk7CiB9CiAKIHN0YXRpYyBQeV9zc2l6ZV90CiBnZXRpbmRleChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZykKIHsKLQlQeV9zc2l6ZV90IGk7CisgICAgUHlfc3NpemVfdCBpOwogCi0JaSA9IFB5TnVtYmVyX0FzU3NpemVfdChhcmcsIFB5RXhjX092ZXJmbG93RXJyb3IpOwotCWlmIChpID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiAtMTsKLQlpZiAoaSA8IDApIHsKLQkJUHlTZXF1ZW5jZU1ldGhvZHMgKnNxID0gUHlfVFlQRShzZWxmKS0+dHBfYXNfc2VxdWVuY2U7Ci0JCWlmIChzcSAmJiBzcS0+c3FfbGVuZ3RoKSB7Ci0JCQlQeV9zc2l6ZV90IG4gPSAoKnNxLT5zcV9sZW5ndGgpKHNlbGYpOwotCQkJaWYgKG4gPCAwKQotCQkJCXJldHVybiAtMTsKLQkJCWkgKz0gbjsKLQkJfQotCX0KLQlyZXR1cm4gaTsKKyAgICBpID0gUHlOdW1iZXJfQXNTc2l6ZV90KGFyZywgUHlFeGNfT3ZlcmZsb3dFcnJvcik7CisgICAgaWYgKGkgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmIChpIDwgMCkgeworICAgICAgICBQeVNlcXVlbmNlTWV0aG9kcyAqc3EgPSBQeV9UWVBFKHNlbGYpLT50cF9hc19zZXF1ZW5jZTsKKyAgICAgICAgaWYgKHNxICYmIHNxLT5zcV9sZW5ndGgpIHsKKyAgICAgICAgICAgIFB5X3NzaXplX3QgbiA9ICgqc3EtPnNxX2xlbmd0aCkoc2VsZik7CisgICAgICAgICAgICBpZiAobiA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgaSArPSBuOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogd3JhcF9zcV9pdGVtKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgdm9pZCAqd3JhcHBlZCkKIHsKLQlzc2l6ZWFyZ2Z1bmMgZnVuYyA9IChzc2l6ZWFyZ2Z1bmMpd3JhcHBlZDsKLQlQeU9iamVjdCAqYXJnOwotCVB5X3NzaXplX3QgaTsKKyAgICBzc2l6ZWFyZ2Z1bmMgZnVuYyA9IChzc2l6ZWFyZ2Z1bmMpd3JhcHBlZDsKKyAgICBQeU9iamVjdCAqYXJnOworICAgIFB5X3NzaXplX3QgaTsKIAotCWlmIChQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpID09IDEpIHsKLQkJYXJnID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCAwKTsKLQkJaSA9IGdldGluZGV4KHNlbGYsIGFyZyk7Ci0JCWlmIChpID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCQlyZXR1cm4gTlVMTDsKLQkJcmV0dXJuICgqZnVuYykoc2VsZiwgaSk7Ci0JfQotCWNoZWNrX251bV9hcmdzKGFyZ3MsIDEpOwotCWFzc2VydChQeUVycl9PY2N1cnJlZCgpKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoUHlUdXBsZV9HRVRfU0laRShhcmdzKSA9PSAxKSB7CisgICAgICAgIGFyZyA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgMCk7CisgICAgICAgIGkgPSBnZXRpbmRleChzZWxmLCBhcmcpOworICAgICAgICBpZiAoaSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiAoKmZ1bmMpKHNlbGYsIGkpOworICAgIH0KKyAgICBjaGVja19udW1fYXJncyhhcmdzLCAxKTsKKyAgICBhc3NlcnQoUHlFcnJfT2NjdXJyZWQoKSk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB3cmFwX3NzaXplc3NpemVhcmdmdW5jKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgdm9pZCAqd3JhcHBlZCkKIHsKLQlzc2l6ZXNzaXplYXJnZnVuYyBmdW5jID0gKHNzaXplc3NpemVhcmdmdW5jKXdyYXBwZWQ7Ci0JUHlfc3NpemVfdCBpLCBqOworICAgIHNzaXplc3NpemVhcmdmdW5jIGZ1bmMgPSAoc3NpemVzc2l6ZWFyZ2Z1bmMpd3JhcHBlZDsKKyAgICBQeV9zc2l6ZV90IGksIGo7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIm5uIiwgJmksICZqKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuICgqZnVuYykoc2VsZiwgaSwgaik7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJubiIsICZpLCAmaikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiAoKmZ1bmMpKHNlbGYsIGksIGopOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogd3JhcF9zcV9zZXRpdGVtKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgdm9pZCAqd3JhcHBlZCkKIHsKLQlzc2l6ZW9iamFyZ3Byb2MgZnVuYyA9IChzc2l6ZW9iamFyZ3Byb2Mpd3JhcHBlZDsKLQlQeV9zc2l6ZV90IGk7Ci0JaW50IHJlczsKLQlQeU9iamVjdCAqYXJnLCAqdmFsdWU7CisgICAgc3NpemVvYmphcmdwcm9jIGZ1bmMgPSAoc3NpemVvYmphcmdwcm9jKXdyYXBwZWQ7CisgICAgUHlfc3NpemVfdCBpOworICAgIGludCByZXM7CisgICAgUHlPYmplY3QgKmFyZywgKnZhbHVlOwogCi0JaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiIiwgMiwgMiwgJmFyZywgJnZhbHVlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaSA9IGdldGluZGV4KHNlbGYsIGFyZyk7Ci0JaWYgKGkgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmVzID0gKCpmdW5jKShzZWxmLCBpLCB2YWx1ZSk7Ci0JaWYgKHJlcyA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gTlVMTDsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiIiwgMiwgMiwgJmFyZywgJnZhbHVlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaSA9IGdldGluZGV4KHNlbGYsIGFyZyk7CisgICAgaWYgKGkgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmVzID0gKCpmdW5jKShzZWxmLCBpLCB2YWx1ZSk7CisgICAgaWYgKHJlcyA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB3cmFwX3NxX2RlbGl0ZW0oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCB2b2lkICp3cmFwcGVkKQogewotCXNzaXplb2JqYXJncHJvYyBmdW5jID0gKHNzaXplb2JqYXJncHJvYyl3cmFwcGVkOwotCVB5X3NzaXplX3QgaTsKLQlpbnQgcmVzOwotCVB5T2JqZWN0ICphcmc7CisgICAgc3NpemVvYmphcmdwcm9jIGZ1bmMgPSAoc3NpemVvYmphcmdwcm9jKXdyYXBwZWQ7CisgICAgUHlfc3NpemVfdCBpOworICAgIGludCByZXM7CisgICAgUHlPYmplY3QgKmFyZzsKIAotCWlmICghY2hlY2tfbnVtX2FyZ3MoYXJncywgMSkpCi0JCXJldHVybiBOVUxMOwotCWFyZyA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgMCk7Ci0JaSA9IGdldGluZGV4KHNlbGYsIGFyZyk7Ci0JaWYgKGkgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmVzID0gKCpmdW5jKShzZWxmLCBpLCBOVUxMKTsKLQlpZiAocmVzID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiBOVUxMOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAoIWNoZWNrX251bV9hcmdzKGFyZ3MsIDEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBhcmcgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDApOworICAgIGkgPSBnZXRpbmRleChzZWxmLCBhcmcpOworICAgIGlmIChpID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJlcyA9ICgqZnVuYykoc2VsZiwgaSwgTlVMTCk7CisgICAgaWYgKHJlcyA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB3cmFwX3NzaXplc3NpemVvYmphcmdwcm9jKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgdm9pZCAqd3JhcHBlZCkKIHsKLQlzc2l6ZXNzaXplb2JqYXJncHJvYyBmdW5jID0gKHNzaXplc3NpemVvYmphcmdwcm9jKXdyYXBwZWQ7Ci0JUHlfc3NpemVfdCBpLCBqOwotCWludCByZXM7Ci0JUHlPYmplY3QgKnZhbHVlOworICAgIHNzaXplc3NpemVvYmphcmdwcm9jIGZ1bmMgPSAoc3NpemVzc2l6ZW9iamFyZ3Byb2Mpd3JhcHBlZDsKKyAgICBQeV9zc2l6ZV90IGksIGo7CisgICAgaW50IHJlczsKKyAgICBQeU9iamVjdCAqdmFsdWU7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIm5uTyIsICZpLCAmaiwgJnZhbHVlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmVzID0gKCpmdW5jKShzZWxmLCBpLCBqLCB2YWx1ZSk7Ci0JaWYgKHJlcyA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gTlVMTDsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJubk8iLCAmaSwgJmosICZ2YWx1ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJlcyA9ICgqZnVuYykoc2VsZiwgaSwgaiwgdmFsdWUpOworICAgIGlmIChyZXMgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogd3JhcF9kZWxzbGljZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIHZvaWQgKndyYXBwZWQpCiB7Ci0Jc3NpemVzc2l6ZW9iamFyZ3Byb2MgZnVuYyA9IChzc2l6ZXNzaXplb2JqYXJncHJvYyl3cmFwcGVkOwotCVB5X3NzaXplX3QgaSwgajsKLQlpbnQgcmVzOworICAgIHNzaXplc3NpemVvYmphcmdwcm9jIGZ1bmMgPSAoc3NpemVzc2l6ZW9iamFyZ3Byb2Mpd3JhcHBlZDsKKyAgICBQeV9zc2l6ZV90IGksIGo7CisgICAgaW50IHJlczsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibm4iLCAmaSwgJmopKQotCQlyZXR1cm4gTlVMTDsKLQlyZXMgPSAoKmZ1bmMpKHNlbGYsIGksIGosIE5VTEwpOwotCWlmIChyZXMgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibm4iLCAmaSwgJmopKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXMgPSAoKmZ1bmMpKHNlbGYsIGksIGosIE5VTEwpOworICAgIGlmIChyZXMgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiBYWFggb2Jqb2JqcHJvYyBpcyBhIG1pc25vbWVyOyBzaG91bGQgYmUgb2JqYXJncHJlZCAqLwogc3RhdGljIFB5T2JqZWN0ICoKIHdyYXBfb2Jqb2JqcHJvYyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIHZvaWQgKndyYXBwZWQpCiB7Ci0Jb2Jqb2JqcHJvYyBmdW5jID0gKG9iam9ianByb2Mpd3JhcHBlZDsKLQlpbnQgcmVzOwotCVB5T2JqZWN0ICp2YWx1ZTsKKyAgICBvYmpvYmpwcm9jIGZ1bmMgPSAob2Jqb2JqcHJvYyl3cmFwcGVkOworICAgIGludCByZXM7CisgICAgUHlPYmplY3QgKnZhbHVlOwogCi0JaWYgKCFjaGVja19udW1fYXJncyhhcmdzLCAxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JdmFsdWUgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDApOwotCXJlcyA9ICgqZnVuYykoc2VsZiwgdmFsdWUpOwotCWlmIChyZXMgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZWxzZQotCQlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKHJlcyk7CisgICAgaWYgKCFjaGVja19udW1fYXJncyhhcmdzLCAxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgdmFsdWUgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDApOworICAgIHJlcyA9ICgqZnVuYykoc2VsZiwgdmFsdWUpOworICAgIGlmIChyZXMgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKHJlcyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB3cmFwX29iam9iamFyZ3Byb2MoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCB2b2lkICp3cmFwcGVkKQogewotCW9iam9iamFyZ3Byb2MgZnVuYyA9IChvYmpvYmphcmdwcm9jKXdyYXBwZWQ7Ci0JaW50IHJlczsKLQlQeU9iamVjdCAqa2V5LCAqdmFsdWU7CisgICAgb2Jqb2JqYXJncHJvYyBmdW5jID0gKG9iam9iamFyZ3Byb2Mpd3JhcHBlZDsKKyAgICBpbnQgcmVzOworICAgIFB5T2JqZWN0ICprZXksICp2YWx1ZTsKIAotCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgIiIsIDIsIDIsICZrZXksICZ2YWx1ZSkpCi0JCXJldHVybiBOVUxMOwotCXJlcyA9ICgqZnVuYykoc2VsZiwga2V5LCB2YWx1ZSk7Ci0JaWYgKHJlcyA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gTlVMTDsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiIiwgMiwgMiwgJmtleSwgJnZhbHVlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmVzID0gKCpmdW5jKShzZWxmLCBrZXksIHZhbHVlKTsKKyAgICBpZiAocmVzID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHdyYXBfZGVsaXRlbShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIHZvaWQgKndyYXBwZWQpCiB7Ci0Jb2Jqb2JqYXJncHJvYyBmdW5jID0gKG9iam9iamFyZ3Byb2Mpd3JhcHBlZDsKLQlpbnQgcmVzOwotCVB5T2JqZWN0ICprZXk7CisgICAgb2Jqb2JqYXJncHJvYyBmdW5jID0gKG9iam9iamFyZ3Byb2Mpd3JhcHBlZDsKKyAgICBpbnQgcmVzOworICAgIFB5T2JqZWN0ICprZXk7CiAKLQlpZiAoIWNoZWNrX251bV9hcmdzKGFyZ3MsIDEpKQotCQlyZXR1cm4gTlVMTDsKLQlrZXkgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDApOwotCXJlcyA9ICgqZnVuYykoc2VsZiwga2V5LCBOVUxMKTsKLQlpZiAocmVzID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiBOVUxMOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAoIWNoZWNrX251bV9hcmdzKGFyZ3MsIDEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBrZXkgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDApOworICAgIHJlcyA9ICgqZnVuYykoc2VsZiwga2V5LCBOVUxMKTsKKyAgICBpZiAocmVzID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHdyYXBfY21wZnVuYyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIHZvaWQgKndyYXBwZWQpCiB7Ci0JY21wZnVuYyBmdW5jID0gKGNtcGZ1bmMpd3JhcHBlZDsKLQlpbnQgcmVzOwotCVB5T2JqZWN0ICpvdGhlcjsKKyAgICBjbXBmdW5jIGZ1bmMgPSAoY21wZnVuYyl3cmFwcGVkOworICAgIGludCByZXM7CisgICAgUHlPYmplY3QgKm90aGVyOwogCi0JaWYgKCFjaGVja19udW1fYXJncyhhcmdzLCAxKSkKLQkJcmV0dXJuIE5VTEw7Ci0Jb3RoZXIgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDApOwotCWlmIChQeV9UWVBFKG90aGVyKS0+dHBfY29tcGFyZSAhPSBmdW5jICYmCi0JICAgICFQeVR5cGVfSXNTdWJ0eXBlKFB5X1RZUEUob3RoZXIpLCBQeV9UWVBFKHNlbGYpKSkgewotCQlQeUVycl9Gb3JtYXQoCi0JCQlQeUV4Y19UeXBlRXJyb3IsCi0JCQkiJXMuX19jbXBfXyh4LHkpIHJlcXVpcmVzIHkgdG8gYmUgYSAnJXMnLCBub3QgYSAnJXMnIiwKLQkJCVB5X1RZUEUoc2VsZiktPnRwX25hbWUsCi0JCQlQeV9UWVBFKHNlbGYpLT50cF9uYW1lLAotCQkJUHlfVFlQRShvdGhlciktPnRwX25hbWUpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmVzID0gKCpmdW5jKShzZWxmLCBvdGhlcik7Ci0JaWYgKFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZylyZXMpOworICAgIGlmICghY2hlY2tfbnVtX2FyZ3MoYXJncywgMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG90aGVyID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCAwKTsKKyAgICBpZiAoUHlfVFlQRShvdGhlciktPnRwX2NvbXBhcmUgIT0gZnVuYyAmJgorICAgICAgICAhUHlUeXBlX0lzU3VidHlwZShQeV9UWVBFKG90aGVyKSwgUHlfVFlQRShzZWxmKSkpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KAorICAgICAgICAgICAgUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgIiVzLl9fY21wX18oeCx5KSByZXF1aXJlcyB5IHRvIGJlIGEgJyVzJywgbm90IGEgJyVzJyIsCisgICAgICAgICAgICBQeV9UWVBFKHNlbGYpLT50cF9uYW1lLAorICAgICAgICAgICAgUHlfVFlQRShzZWxmKS0+dHBfbmFtZSwKKyAgICAgICAgICAgIFB5X1RZUEUob3RoZXIpLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJlcyA9ICgqZnVuYykoc2VsZiwgb3RoZXIpOworICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpcmVzKTsKIH0KIAogLyogSGVscGVyIHRvIGNoZWNrIGZvciBvYmplY3QuX19zZXRhdHRyX18gb3IgX19kZWxhdHRyX18gYXBwbGllZCB0byBhIHR5cGUuCkBAIC00NTEyLDkwICs0NTEyLDkwIEBACiBzdGF0aWMgaW50CiBoYWNrY2hlY2soUHlPYmplY3QgKnNlbGYsIHNldGF0dHJvZnVuYyBmdW5jLCBjaGFyICp3aGF0KQogewotCVB5VHlwZU9iamVjdCAqdHlwZSA9IFB5X1RZUEUoc2VsZik7Ci0Jd2hpbGUgKHR5cGUgJiYgdHlwZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hFQVBUWVBFKQotCQl0eXBlID0gdHlwZS0+dHBfYmFzZTsKLQkvKiBJZiB0eXBlIGlzIE5VTEwgbm93LCB0aGlzIGlzIGEgcmVhbGx5IHdlaXJkIHR5cGUuCi0JICAgSW4gdGhlIHNwaXJpdCBvZiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSAoPyksIGp1c3Qgc2h1dCB1cC4gKi8KLQlpZiAodHlwZSAmJiB0eXBlLT50cF9zZXRhdHRybyAhPSBmdW5jKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgICJjYW4ndCBhcHBseSB0aGlzICVzIHRvICVzIG9iamVjdCIsCi0JCQkgICAgIHdoYXQsCi0JCQkgICAgIHR5cGUtPnRwX25hbWUpOwotCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIDE7CisgICAgUHlUeXBlT2JqZWN0ICp0eXBlID0gUHlfVFlQRShzZWxmKTsKKyAgICB3aGlsZSAodHlwZSAmJiB0eXBlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEVBUFRZUEUpCisgICAgICAgIHR5cGUgPSB0eXBlLT50cF9iYXNlOworICAgIC8qIElmIHR5cGUgaXMgTlVMTCBub3csIHRoaXMgaXMgYSByZWFsbHkgd2VpcmQgdHlwZS4KKyAgICAgICBJbiB0aGUgc3Bpcml0IG9mIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5ICg/KSwganVzdCBzaHV0IHVwLiAqLworICAgIGlmICh0eXBlICYmIHR5cGUtPnRwX3NldGF0dHJvICE9IGZ1bmMpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJjYW4ndCBhcHBseSB0aGlzICVzIHRvICVzIG9iamVjdCIsCisgICAgICAgICAgICAgICAgICAgICB3aGF0LAorICAgICAgICAgICAgICAgICAgICAgdHlwZS0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHdyYXBfc2V0YXR0cihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIHZvaWQgKndyYXBwZWQpCiB7Ci0Jc2V0YXR0cm9mdW5jIGZ1bmMgPSAoc2V0YXR0cm9mdW5jKXdyYXBwZWQ7Ci0JaW50IHJlczsKLQlQeU9iamVjdCAqbmFtZSwgKnZhbHVlOworICAgIHNldGF0dHJvZnVuYyBmdW5jID0gKHNldGF0dHJvZnVuYyl3cmFwcGVkOworICAgIGludCByZXM7CisgICAgUHlPYmplY3QgKm5hbWUsICp2YWx1ZTsKIAotCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgIiIsIDIsIDIsICZuYW1lLCAmdmFsdWUpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWhhY2tjaGVjayhzZWxmLCBmdW5jLCAiX19zZXRhdHRyX18iKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmVzID0gKCpmdW5jKShzZWxmLCBuYW1lLCB2YWx1ZSk7Ci0JaWYgKHJlcyA8IDApCi0JCXJldHVybiBOVUxMOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICIiLCAyLCAyLCAmbmFtZSwgJnZhbHVlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFoYWNrY2hlY2soc2VsZiwgZnVuYywgIl9fc2V0YXR0cl9fIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJlcyA9ICgqZnVuYykoc2VsZiwgbmFtZSwgdmFsdWUpOworICAgIGlmIChyZXMgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB3cmFwX2RlbGF0dHIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCB2b2lkICp3cmFwcGVkKQogewotCXNldGF0dHJvZnVuYyBmdW5jID0gKHNldGF0dHJvZnVuYyl3cmFwcGVkOwotCWludCByZXM7Ci0JUHlPYmplY3QgKm5hbWU7CisgICAgc2V0YXR0cm9mdW5jIGZ1bmMgPSAoc2V0YXR0cm9mdW5jKXdyYXBwZWQ7CisgICAgaW50IHJlczsKKyAgICBQeU9iamVjdCAqbmFtZTsKIAotCWlmICghY2hlY2tfbnVtX2FyZ3MoYXJncywgMSkpCi0JCXJldHVybiBOVUxMOwotCW5hbWUgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDApOwotCWlmICghaGFja2NoZWNrKHNlbGYsIGZ1bmMsICJfX2RlbGF0dHJfXyIpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXMgPSAoKmZ1bmMpKHNlbGYsIG5hbWUsIE5VTEwpOwotCWlmIChyZXMgPCAwKQotCQlyZXR1cm4gTlVMTDsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKCFjaGVja19udW1fYXJncyhhcmdzLCAxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbmFtZSA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgMCk7CisgICAgaWYgKCFoYWNrY2hlY2soc2VsZiwgZnVuYywgIl9fZGVsYXR0cl9fIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJlcyA9ICgqZnVuYykoc2VsZiwgbmFtZSwgTlVMTCk7CisgICAgaWYgKHJlcyA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHdyYXBfaGFzaGZ1bmMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCB2b2lkICp3cmFwcGVkKQogewotCWhhc2hmdW5jIGZ1bmMgPSAoaGFzaGZ1bmMpd3JhcHBlZDsKLQlsb25nIHJlczsKKyAgICBoYXNoZnVuYyBmdW5jID0gKGhhc2hmdW5jKXdyYXBwZWQ7CisgICAgbG9uZyByZXM7CiAKLQlpZiAoIWNoZWNrX251bV9hcmdzKGFyZ3MsIDApKQotCQlyZXR1cm4gTlVMTDsKLQlyZXMgPSAoKmZ1bmMpKHNlbGYpOwotCWlmIChyZXMgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKHJlcyk7CisgICAgaWYgKCFjaGVja19udW1fYXJncyhhcmdzLCAwKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmVzID0gKCpmdW5jKShzZWxmKTsKKyAgICBpZiAocmVzID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhyZXMpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogd3JhcF9jYWxsKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgdm9pZCAqd3JhcHBlZCwgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JdGVybmFyeWZ1bmMgZnVuYyA9ICh0ZXJuYXJ5ZnVuYyl3cmFwcGVkOworICAgIHRlcm5hcnlmdW5jIGZ1bmMgPSAodGVybmFyeWZ1bmMpd3JhcHBlZDsKIAotCXJldHVybiAoKmZ1bmMpKHNlbGYsIGFyZ3MsIGt3ZHMpOworICAgIHJldHVybiAoKmZ1bmMpKHNlbGYsIGFyZ3MsIGt3ZHMpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogd3JhcF9yaWNoY21wZnVuYyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIHZvaWQgKndyYXBwZWQsIGludCBvcCkKIHsKLQlyaWNoY21wZnVuYyBmdW5jID0gKHJpY2hjbXBmdW5jKXdyYXBwZWQ7Ci0JUHlPYmplY3QgKm90aGVyOworICAgIHJpY2hjbXBmdW5jIGZ1bmMgPSAocmljaGNtcGZ1bmMpd3JhcHBlZDsKKyAgICBQeU9iamVjdCAqb3RoZXI7CiAKLQlpZiAoIWNoZWNrX251bV9hcmdzKGFyZ3MsIDEpKQotCQlyZXR1cm4gTlVMTDsKLQlvdGhlciA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgMCk7Ci0JcmV0dXJuICgqZnVuYykoc2VsZiwgb3RoZXIsIG9wKTsKKyAgICBpZiAoIWNoZWNrX251bV9hcmdzKGFyZ3MsIDEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBvdGhlciA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgMCk7CisgICAgcmV0dXJuICgqZnVuYykoc2VsZiwgb3RoZXIsIG9wKTsKIH0KIAogI3VuZGVmIFJJQ0hDTVBfV1JBUFBFUgpAQCAtNDYwMyw3ICs0NjAzLDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqIFwKIHJpY2hjbXBfIyNOQU1FKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgdm9pZCAqd3JhcHBlZCkgXAogeyBcCi0JcmV0dXJuIHdyYXBfcmljaGNtcGZ1bmMoc2VsZiwgYXJncywgd3JhcHBlZCwgT1ApOyBcCisgICAgcmV0dXJuIHdyYXBfcmljaGNtcGZ1bmMoc2VsZiwgYXJncywgd3JhcHBlZCwgT1ApOyBcCiB9CiAKIFJJQ0hDTVBfV1JBUFBFUihsdCwgUHlfTFQpCkBAIC00NjE2LDE2NCArNDYxNiwxNjQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiB3cmFwX25leHQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCB2b2lkICp3cmFwcGVkKQogewotCXVuYXJ5ZnVuYyBmdW5jID0gKHVuYXJ5ZnVuYyl3cmFwcGVkOwotCVB5T2JqZWN0ICpyZXM7CisgICAgdW5hcnlmdW5jIGZ1bmMgPSAodW5hcnlmdW5jKXdyYXBwZWQ7CisgICAgUHlPYmplY3QgKnJlczsKIAotCWlmICghY2hlY2tfbnVtX2FyZ3MoYXJncywgMCkpCi0JCXJldHVybiBOVUxMOwotCXJlcyA9ICgqZnVuYykoc2VsZik7Ci0JaWYgKHJlcyA9PSBOVUxMICYmICFQeUVycl9PY2N1cnJlZCgpKQotCQlQeUVycl9TZXROb25lKFB5RXhjX1N0b3BJdGVyYXRpb24pOwotCXJldHVybiByZXM7CisgICAgaWYgKCFjaGVja19udW1fYXJncyhhcmdzLCAwKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmVzID0gKCpmdW5jKShzZWxmKTsKKyAgICBpZiAocmVzID09IE5VTEwgJiYgIVB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIFB5RXJyX1NldE5vbmUoUHlFeGNfU3RvcEl0ZXJhdGlvbik7CisgICAgcmV0dXJuIHJlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHdyYXBfZGVzY3JfZ2V0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgdm9pZCAqd3JhcHBlZCkKIHsKLQlkZXNjcmdldGZ1bmMgZnVuYyA9IChkZXNjcmdldGZ1bmMpd3JhcHBlZDsKLQlQeU9iamVjdCAqb2JqOwotCVB5T2JqZWN0ICp0eXBlID0gTlVMTDsKKyAgICBkZXNjcmdldGZ1bmMgZnVuYyA9IChkZXNjcmdldGZ1bmMpd3JhcHBlZDsKKyAgICBQeU9iamVjdCAqb2JqOworICAgIFB5T2JqZWN0ICp0eXBlID0gTlVMTDsKIAotCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgIiIsIDEsIDIsICZvYmosICZ0eXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKG9iaiA9PSBQeV9Ob25lKQotCQlvYmogPSBOVUxMOwotCWlmICh0eXBlID09IFB5X05vbmUpCi0JCXR5cGUgPSBOVUxMOwotCWlmICh0eXBlID09IE5VTEwgJiZvYmogPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJfX2dldF9fKE5vbmUsIE5vbmUpIGlzIGludmFsaWQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiAoKmZ1bmMpKHNlbGYsIG9iaiwgdHlwZSk7CisgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiIiwgMSwgMiwgJm9iaiwgJnR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAob2JqID09IFB5X05vbmUpCisgICAgICAgIG9iaiA9IE5VTEw7CisgICAgaWYgKHR5cGUgPT0gUHlfTm9uZSkKKyAgICAgICAgdHlwZSA9IE5VTEw7CisgICAgaWYgKHR5cGUgPT0gTlVMTCAmJm9iaiA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiX19nZXRfXyhOb25lLCBOb25lKSBpcyBpbnZhbGlkIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gKCpmdW5jKShzZWxmLCBvYmosIHR5cGUpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogd3JhcF9kZXNjcl9zZXQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCB2b2lkICp3cmFwcGVkKQogewotCWRlc2Nyc2V0ZnVuYyBmdW5jID0gKGRlc2Nyc2V0ZnVuYyl3cmFwcGVkOwotCVB5T2JqZWN0ICpvYmosICp2YWx1ZTsKLQlpbnQgcmV0OworICAgIGRlc2Nyc2V0ZnVuYyBmdW5jID0gKGRlc2Nyc2V0ZnVuYyl3cmFwcGVkOworICAgIFB5T2JqZWN0ICpvYmosICp2YWx1ZTsKKyAgICBpbnQgcmV0OwogCi0JaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiIiwgMiwgMiwgJm9iaiwgJnZhbHVlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0ID0gKCpmdW5jKShzZWxmLCBvYmosIHZhbHVlKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIE5VTEw7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgIiIsIDIsIDIsICZvYmosICZ2YWx1ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldCA9ICgqZnVuYykoc2VsZiwgb2JqLCB2YWx1ZSk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHdyYXBfZGVzY3JfZGVsZXRlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgdm9pZCAqd3JhcHBlZCkKIHsKLQlkZXNjcnNldGZ1bmMgZnVuYyA9IChkZXNjcnNldGZ1bmMpd3JhcHBlZDsKLQlQeU9iamVjdCAqb2JqOwotCWludCByZXQ7CisgICAgZGVzY3JzZXRmdW5jIGZ1bmMgPSAoZGVzY3JzZXRmdW5jKXdyYXBwZWQ7CisgICAgUHlPYmplY3QgKm9iajsKKyAgICBpbnQgcmV0OwogCi0JaWYgKCFjaGVja19udW1fYXJncyhhcmdzLCAxKSkKLQkJcmV0dXJuIE5VTEw7Ci0Jb2JqID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCAwKTsKLQlyZXQgPSAoKmZ1bmMpKHNlbGYsIG9iaiwgTlVMTCk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiBOVUxMOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAoIWNoZWNrX251bV9hcmdzKGFyZ3MsIDEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBvYmogPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDApOworICAgIHJldCA9ICgqZnVuYykoc2VsZiwgb2JqLCBOVUxMKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogd3JhcF9pbml0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgdm9pZCAqd3JhcHBlZCwgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JaW5pdHByb2MgZnVuYyA9IChpbml0cHJvYyl3cmFwcGVkOworICAgIGluaXRwcm9jIGZ1bmMgPSAoaW5pdHByb2Mpd3JhcHBlZDsKIAotCWlmIChmdW5jKHNlbGYsIGFyZ3MsIGt3ZHMpIDwgMCkKLQkJcmV0dXJuIE5VTEw7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGlmIChmdW5jKHNlbGYsIGFyZ3MsIGt3ZHMpIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogdHBfbmV3X3dyYXBwZXIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlQeVR5cGVPYmplY3QgKnR5cGUsICpzdWJ0eXBlLCAqc3RhdGljYmFzZTsKLQlQeU9iamVjdCAqYXJnMCwgKnJlczsKKyAgICBQeVR5cGVPYmplY3QgKnR5cGUsICpzdWJ0eXBlLCAqc3RhdGljYmFzZTsKKyAgICBQeU9iamVjdCAqYXJnMCwgKnJlczsKIAotCWlmIChzZWxmID09IE5VTEwgfHwgIVB5VHlwZV9DaGVjayhzZWxmKSkKLQkJUHlfRmF0YWxFcnJvcigiX19uZXdfXygpIGNhbGxlZCB3aXRoIG5vbi10eXBlICdzZWxmJyIpOwotCXR5cGUgPSAoUHlUeXBlT2JqZWN0ICopc2VsZjsKLQlpZiAoIVB5VHVwbGVfQ2hlY2soYXJncykgfHwgUHlUdXBsZV9HRVRfU0laRShhcmdzKSA8IDEpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAgIiVzLl9fbmV3X18oKTogbm90IGVub3VnaCBhcmd1bWVudHMiLAotCQkJICAgICB0eXBlLT50cF9uYW1lKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWFyZzAgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDApOwotCWlmICghUHlUeXBlX0NoZWNrKGFyZzApKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgICIlcy5fX25ld19fKFgpOiBYIGlzIG5vdCBhIHR5cGUgb2JqZWN0ICglcykiLAotCQkJICAgICB0eXBlLT50cF9uYW1lLAotCQkJICAgICBQeV9UWVBFKGFyZzApLT50cF9uYW1lKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXN1YnR5cGUgPSAoUHlUeXBlT2JqZWN0ICopYXJnMDsKLQlpZiAoIVB5VHlwZV9Jc1N1YnR5cGUoc3VidHlwZSwgdHlwZSkpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAgIiVzLl9fbmV3X18oJXMpOiAlcyBpcyBub3QgYSBzdWJ0eXBlIG9mICVzIiwKLQkJCSAgICAgdHlwZS0+dHBfbmFtZSwKLQkJCSAgICAgc3VidHlwZS0+dHBfbmFtZSwKLQkJCSAgICAgc3VidHlwZS0+dHBfbmFtZSwKLQkJCSAgICAgdHlwZS0+dHBfbmFtZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoc2VsZiA9PSBOVUxMIHx8ICFQeVR5cGVfQ2hlY2soc2VsZikpCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIl9fbmV3X18oKSBjYWxsZWQgd2l0aCBub24tdHlwZSAnc2VsZiciKTsKKyAgICB0eXBlID0gKFB5VHlwZU9iamVjdCAqKXNlbGY7CisgICAgaWYgKCFQeVR1cGxlX0NoZWNrKGFyZ3MpIHx8IFB5VHVwbGVfR0VUX1NJWkUoYXJncykgPCAxKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiJXMuX19uZXdfXygpOiBub3QgZW5vdWdoIGFyZ3VtZW50cyIsCisgICAgICAgICAgICAgICAgICAgICB0eXBlLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGFyZzAgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDApOworICAgIGlmICghUHlUeXBlX0NoZWNrKGFyZzApKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiJXMuX19uZXdfXyhYKTogWCBpcyBub3QgYSB0eXBlIG9iamVjdCAoJXMpIiwKKyAgICAgICAgICAgICAgICAgICAgIHR5cGUtPnRwX25hbWUsCisgICAgICAgICAgICAgICAgICAgICBQeV9UWVBFKGFyZzApLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHN1YnR5cGUgPSAoUHlUeXBlT2JqZWN0ICopYXJnMDsKKyAgICBpZiAoIVB5VHlwZV9Jc1N1YnR5cGUoc3VidHlwZSwgdHlwZSkpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICIlcy5fX25ld19fKCVzKTogJXMgaXMgbm90IGEgc3VidHlwZSBvZiAlcyIsCisgICAgICAgICAgICAgICAgICAgICB0eXBlLT50cF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgc3VidHlwZS0+dHBfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIHN1YnR5cGUtPnRwX25hbWUsCisgICAgICAgICAgICAgICAgICAgICB0eXBlLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JLyogQ2hlY2sgdGhhdCB0aGUgdXNlIGRvZXNuJ3QgZG8gc29tZXRoaW5nIHNpbGx5IGFuZCB1bnNhZmUgbGlrZQotCSAgIG9iamVjdC5fX25ld19fKGRpY3QpLiAgVG8gZG8gdGhpcywgd2UgY2hlY2sgdGhhdCB0aGUKLQkgICBtb3N0IGRlcml2ZWQgYmFzZSB0aGF0J3Mgbm90IGEgaGVhcCB0eXBlIGlzIHRoaXMgdHlwZS4gKi8KLQlzdGF0aWNiYXNlID0gc3VidHlwZTsKLQl3aGlsZSAoc3RhdGljYmFzZSAmJiAoc3RhdGljYmFzZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hFQVBUWVBFKSkKLQkJc3RhdGljYmFzZSA9IHN0YXRpY2Jhc2UtPnRwX2Jhc2U7Ci0JLyogSWYgc3RhdGljYmFzZSBpcyBOVUxMIG5vdywgaXQgaXMgYSByZWFsbHkgd2VpcmQgdHlwZS4KLQkgICBJbiB0aGUgc3Bpcml0IG9mIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5ICg/KSwganVzdCBzaHV0IHVwLiAqLwotCWlmIChzdGF0aWNiYXNlICYmIHN0YXRpY2Jhc2UtPnRwX25ldyAhPSB0eXBlLT50cF9uZXcpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAgIiVzLl9fbmV3X18oJXMpIGlzIG5vdCBzYWZlLCB1c2UgJXMuX19uZXdfXygpIiwKLQkJCSAgICAgdHlwZS0+dHBfbmFtZSwKLQkJCSAgICAgc3VidHlwZS0+dHBfbmFtZSwKLQkJCSAgICAgc3RhdGljYmFzZSA9PSBOVUxMID8gIj8iIDogc3RhdGljYmFzZS0+dHBfbmFtZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICAvKiBDaGVjayB0aGF0IHRoZSB1c2UgZG9lc24ndCBkbyBzb21ldGhpbmcgc2lsbHkgYW5kIHVuc2FmZSBsaWtlCisgICAgICAgb2JqZWN0Ll9fbmV3X18oZGljdCkuICBUbyBkbyB0aGlzLCB3ZSBjaGVjayB0aGF0IHRoZQorICAgICAgIG1vc3QgZGVyaXZlZCBiYXNlIHRoYXQncyBub3QgYSBoZWFwIHR5cGUgaXMgdGhpcyB0eXBlLiAqLworICAgIHN0YXRpY2Jhc2UgPSBzdWJ0eXBlOworICAgIHdoaWxlIChzdGF0aWNiYXNlICYmIChzdGF0aWNiYXNlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEVBUFRZUEUpKQorICAgICAgICBzdGF0aWNiYXNlID0gc3RhdGljYmFzZS0+dHBfYmFzZTsKKyAgICAvKiBJZiBzdGF0aWNiYXNlIGlzIE5VTEwgbm93LCBpdCBpcyBhIHJlYWxseSB3ZWlyZCB0eXBlLgorICAgICAgIEluIHRoZSBzcGlyaXQgb2YgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgKD8pLCBqdXN0IHNodXQgdXAuICovCisgICAgaWYgKHN0YXRpY2Jhc2UgJiYgc3RhdGljYmFzZS0+dHBfbmV3ICE9IHR5cGUtPnRwX25ldykgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIiVzLl9fbmV3X18oJXMpIGlzIG5vdCBzYWZlLCB1c2UgJXMuX19uZXdfXygpIiwKKyAgICAgICAgICAgICAgICAgICAgIHR5cGUtPnRwX25hbWUsCisgICAgICAgICAgICAgICAgICAgICBzdWJ0eXBlLT50cF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgc3RhdGljYmFzZSA9PSBOVUxMID8gIj8iIDogc3RhdGljYmFzZS0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWFyZ3MgPSBQeVR1cGxlX0dldFNsaWNlKGFyZ3MsIDEsIFB5VHVwbGVfR0VUX1NJWkUoYXJncykpOwotCWlmIChhcmdzID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXJlcyA9IHR5cGUtPnRwX25ldyhzdWJ0eXBlLCBhcmdzLCBrd2RzKTsKLQlQeV9ERUNSRUYoYXJncyk7Ci0JcmV0dXJuIHJlczsKKyAgICBhcmdzID0gUHlUdXBsZV9HZXRTbGljZShhcmdzLCAxLCBQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpKTsKKyAgICBpZiAoYXJncyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXMgPSB0eXBlLT50cF9uZXcoc3VidHlwZSwgYXJncywga3dkcyk7CisgICAgUHlfREVDUkVGKGFyZ3MpOworICAgIHJldHVybiByZXM7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgUHlNZXRob2REZWYgdHBfbmV3X21ldGhvZGRlZltdID0gewotCXsiX19uZXdfXyIsIChQeUNGdW5jdGlvbil0cF9uZXdfd3JhcHBlciwgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsCi0JIFB5RG9jX1NUUigiVC5fX25ld19fKFMsIC4uLikgLT4gIgotCQkgICAiYSBuZXcgb2JqZWN0IHdpdGggdHlwZSBTLCBhIHN1YnR5cGUgb2YgVCIpfSwKLQl7MH0KKyAgICB7Il9fbmV3X18iLCAoUHlDRnVuY3Rpb24pdHBfbmV3X3dyYXBwZXIsIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLAorICAgICBQeURvY19TVFIoIlQuX19uZXdfXyhTLCAuLi4pIC0+ICIKKyAgICAgICAgICAgICAgICJhIG5ldyBvYmplY3Qgd2l0aCB0eXBlIFMsIGEgc3VidHlwZSBvZiBUIil9LAorICAgIHswfQogfTsKIAogc3RhdGljIGludAogYWRkX3RwX25ld193cmFwcGVyKFB5VHlwZU9iamVjdCAqdHlwZSkKIHsKLQlQeU9iamVjdCAqZnVuYzsKKyAgICBQeU9iamVjdCAqZnVuYzsKIAotCWlmIChQeURpY3RfR2V0SXRlbVN0cmluZyh0eXBlLT50cF9kaWN0LCAiX19uZXdfXyIpICE9IE5VTEwpCi0JCXJldHVybiAwOwotCWZ1bmMgPSBQeUNGdW5jdGlvbl9OZXcodHBfbmV3X21ldGhvZGRlZiwgKFB5T2JqZWN0ICopdHlwZSk7Ci0JaWYgKGZ1bmMgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCWlmIChQeURpY3RfU2V0SXRlbVN0cmluZyh0eXBlLT50cF9kaWN0LCAiX19uZXdfXyIsIGZ1bmMpKSB7Ci0JCVB5X0RFQ1JFRihmdW5jKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlQeV9ERUNSRUYoZnVuYyk7Ci0JcmV0dXJuIDA7CisgICAgaWYgKFB5RGljdF9HZXRJdGVtU3RyaW5nKHR5cGUtPnRwX2RpY3QsICJfX25ld19fIikgIT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgZnVuYyA9IFB5Q0Z1bmN0aW9uX05ldyh0cF9uZXdfbWV0aG9kZGVmLCAoUHlPYmplY3QgKil0eXBlKTsKKyAgICBpZiAoZnVuYyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKHR5cGUtPnRwX2RpY3QsICJfX25ld19fIiwgZnVuYykpIHsKKyAgICAgICAgUHlfREVDUkVGKGZ1bmMpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIFB5X0RFQ1JFRihmdW5jKTsKKyAgICByZXR1cm4gMDsKIH0KIAogLyogU2xvdCB3cmFwcGVycyB0aGF0IGNhbGwgdGhlIGNvcnJlc3BvbmRpbmcgX19mb29fXyBzbG90LiAgU2VlIGNvbW1lbnRzCkBAIC00NzgzLDE2ICs0NzgzLDE2IEBACiBzdGF0aWMgUHlPYmplY3QgKiBcCiBGVU5DTkFNRShQeU9iamVjdCAqc2VsZikgXAogeyBcCi0Jc3RhdGljIFB5T2JqZWN0ICpjYWNoZV9zdHI7IFwKLQlyZXR1cm4gY2FsbF9tZXRob2Qoc2VsZiwgT1BTVFIsICZjYWNoZV9zdHIsICIoKSIpOyBcCisgICAgc3RhdGljIFB5T2JqZWN0ICpjYWNoZV9zdHI7IFwKKyAgICByZXR1cm4gY2FsbF9tZXRob2Qoc2VsZiwgT1BTVFIsICZjYWNoZV9zdHIsICIoKSIpOyBcCiB9CiAKICNkZWZpbmUgU0xPVDEoRlVOQ05BTUUsIE9QU1RSLCBBUkcxVFlQRSwgQVJHQ09ERVMpIFwKIHN0YXRpYyBQeU9iamVjdCAqIFwKIEZVTkNOQU1FKFB5T2JqZWN0ICpzZWxmLCBBUkcxVFlQRSBhcmcxKSBcCiB7IFwKLQlzdGF0aWMgUHlPYmplY3QgKmNhY2hlX3N0cjsgXAotCXJldHVybiBjYWxsX21ldGhvZChzZWxmLCBPUFNUUiwgJmNhY2hlX3N0ciwgIigiIEFSR0NPREVTICIpIiwgYXJnMSk7IFwKKyAgICBzdGF0aWMgUHlPYmplY3QgKmNhY2hlX3N0cjsgXAorICAgIHJldHVybiBjYWxsX21ldGhvZChzZWxmLCBPUFNUUiwgJmNhY2hlX3N0ciwgIigiIEFSR0NPREVTICIpIiwgYXJnMSk7IFwKIH0KIAogLyogQm9vbGVhbiBoZWxwZXIgZm9yIFNMT1QxQklORlVMTCgpLgpAQCAtNDgwMCwzMyArNDgwMCwzMyBAQAogc3RhdGljIGludAogbWV0aG9kX2lzX292ZXJsb2FkZWQoUHlPYmplY3QgKmxlZnQsIFB5T2JqZWN0ICpyaWdodCwgY2hhciAqbmFtZSkKIHsKLQlQeU9iamVjdCAqYSwgKmI7Ci0JaW50IG9rOworICAgIFB5T2JqZWN0ICphLCAqYjsKKyAgICBpbnQgb2s7CiAKLQliID0gUHlPYmplY3RfR2V0QXR0clN0cmluZygoUHlPYmplY3QgKikoUHlfVFlQRShyaWdodCkpLCBuYW1lKTsKLQlpZiAoYiA9PSBOVUxMKSB7Ci0JCVB5RXJyX0NsZWFyKCk7Ci0JCS8qIElmIHJpZ2h0IGRvZXNuJ3QgaGF2ZSBpdCwgaXQncyBub3Qgb3ZlcmxvYWRlZCAqLwotCQlyZXR1cm4gMDsKLQl9CisgICAgYiA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoKFB5T2JqZWN0ICopKFB5X1RZUEUocmlnaHQpKSwgbmFtZSk7CisgICAgaWYgKGIgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAvKiBJZiByaWdodCBkb2Vzbid0IGhhdmUgaXQsIGl0J3Mgbm90IG92ZXJsb2FkZWQgKi8KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCi0JYSA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoKFB5T2JqZWN0ICopKFB5X1RZUEUobGVmdCkpLCBuYW1lKTsKLQlpZiAoYSA9PSBOVUxMKSB7Ci0JCVB5RXJyX0NsZWFyKCk7Ci0JCVB5X0RFQ1JFRihiKTsKLQkJLyogSWYgcmlnaHQgaGFzIGl0IGJ1dCBsZWZ0IGRvZXNuJ3QsIGl0J3Mgb3ZlcmxvYWRlZCAqLwotCQlyZXR1cm4gMTsKLQl9CisgICAgYSA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoKFB5T2JqZWN0ICopKFB5X1RZUEUobGVmdCkpLCBuYW1lKTsKKyAgICBpZiAoYSA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIFB5X0RFQ1JFRihiKTsKKyAgICAgICAgLyogSWYgcmlnaHQgaGFzIGl0IGJ1dCBsZWZ0IGRvZXNuJ3QsIGl0J3Mgb3ZlcmxvYWRlZCAqLworICAgICAgICByZXR1cm4gMTsKKyAgICB9CiAKLQlvayA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChhLCBiLCBQeV9ORSk7Ci0JUHlfREVDUkVGKGEpOwotCVB5X0RFQ1JFRihiKTsKLQlpZiAob2sgPCAwKSB7Ci0JCVB5RXJyX0NsZWFyKCk7Ci0JCXJldHVybiAwOwotCX0KKyAgICBvayA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChhLCBiLCBQeV9ORSk7CisgICAgUHlfREVDUkVGKGEpOworICAgIFB5X0RFQ1JFRihiKTsKKyAgICBpZiAob2sgPCAwKSB7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KIAotCXJldHVybiBvazsKKyAgICByZXR1cm4gb2s7CiB9CiAKIApAQCAtNDgzNCw2OCArNDgzNCw2OCBAQAogc3RhdGljIFB5T2JqZWN0ICogXAogRlVOQ05BTUUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpvdGhlcikgXAogeyBcCi0Jc3RhdGljIFB5T2JqZWN0ICpjYWNoZV9zdHIsICpyY2FjaGVfc3RyOyBcCi0JaW50IGRvX290aGVyID0gUHlfVFlQRShzZWxmKSAhPSBQeV9UWVBFKG90aGVyKSAmJiBcCi0JICAgIFB5X1RZUEUob3RoZXIpLT50cF9hc19udW1iZXIgIT0gTlVMTCAmJiBcCi0JICAgIFB5X1RZUEUob3RoZXIpLT50cF9hc19udW1iZXItPlNMT1ROQU1FID09IFRFU1RGVU5DOyBcCi0JaWYgKFB5X1RZUEUoc2VsZiktPnRwX2FzX251bWJlciAhPSBOVUxMICYmIFwKLQkgICAgUHlfVFlQRShzZWxmKS0+dHBfYXNfbnVtYmVyLT5TTE9UTkFNRSA9PSBURVNURlVOQykgeyBcCi0JCVB5T2JqZWN0ICpyOyBcCi0JCWlmIChkb19vdGhlciAmJiBcCi0JCSAgICBQeVR5cGVfSXNTdWJ0eXBlKFB5X1RZUEUob3RoZXIpLCBQeV9UWVBFKHNlbGYpKSAmJiBcCi0JCSAgICBtZXRob2RfaXNfb3ZlcmxvYWRlZChzZWxmLCBvdGhlciwgUk9QU1RSKSkgeyBcCi0JCQlyID0gY2FsbF9tYXliZSggXAotCQkJCW90aGVyLCBST1BTVFIsICZyY2FjaGVfc3RyLCAiKE8pIiwgc2VsZik7IFwKLQkJCWlmIChyICE9IFB5X05vdEltcGxlbWVudGVkKSBcCi0JCQkJcmV0dXJuIHI7IFwKLQkJCVB5X0RFQ1JFRihyKTsgXAotCQkJZG9fb3RoZXIgPSAwOyBcCi0JCX0gXAotCQlyID0gY2FsbF9tYXliZSggXAotCQkJc2VsZiwgT1BTVFIsICZjYWNoZV9zdHIsICIoTykiLCBvdGhlcik7IFwKLQkJaWYgKHIgIT0gUHlfTm90SW1wbGVtZW50ZWQgfHwgXAotCQkgICAgUHlfVFlQRShvdGhlcikgPT0gUHlfVFlQRShzZWxmKSkgXAotCQkJcmV0dXJuIHI7IFwKLQkJUHlfREVDUkVGKHIpOyBcCi0JfSBcCi0JaWYgKGRvX290aGVyKSB7IFwKLQkJcmV0dXJuIGNhbGxfbWF5YmUoIFwKLQkJCW90aGVyLCBST1BTVFIsICZyY2FjaGVfc3RyLCAiKE8pIiwgc2VsZik7IFwKLQl9IFwKLQlQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOyBcCi0JcmV0dXJuIFB5X05vdEltcGxlbWVudGVkOyBcCisgICAgc3RhdGljIFB5T2JqZWN0ICpjYWNoZV9zdHIsICpyY2FjaGVfc3RyOyBcCisgICAgaW50IGRvX290aGVyID0gUHlfVFlQRShzZWxmKSAhPSBQeV9UWVBFKG90aGVyKSAmJiBcCisgICAgICAgIFB5X1RZUEUob3RoZXIpLT50cF9hc19udW1iZXIgIT0gTlVMTCAmJiBcCisgICAgICAgIFB5X1RZUEUob3RoZXIpLT50cF9hc19udW1iZXItPlNMT1ROQU1FID09IFRFU1RGVU5DOyBcCisgICAgaWYgKFB5X1RZUEUoc2VsZiktPnRwX2FzX251bWJlciAhPSBOVUxMICYmIFwKKyAgICAgICAgUHlfVFlQRShzZWxmKS0+dHBfYXNfbnVtYmVyLT5TTE9UTkFNRSA9PSBURVNURlVOQykgeyBcCisgICAgICAgIFB5T2JqZWN0ICpyOyBcCisgICAgICAgIGlmIChkb19vdGhlciAmJiBcCisgICAgICAgICAgICBQeVR5cGVfSXNTdWJ0eXBlKFB5X1RZUEUob3RoZXIpLCBQeV9UWVBFKHNlbGYpKSAmJiBcCisgICAgICAgICAgICBtZXRob2RfaXNfb3ZlcmxvYWRlZChzZWxmLCBvdGhlciwgUk9QU1RSKSkgeyBcCisgICAgICAgICAgICByID0gY2FsbF9tYXliZSggXAorICAgICAgICAgICAgICAgIG90aGVyLCBST1BTVFIsICZyY2FjaGVfc3RyLCAiKE8pIiwgc2VsZik7IFwKKyAgICAgICAgICAgIGlmIChyICE9IFB5X05vdEltcGxlbWVudGVkKSBcCisgICAgICAgICAgICAgICAgcmV0dXJuIHI7IFwKKyAgICAgICAgICAgIFB5X0RFQ1JFRihyKTsgXAorICAgICAgICAgICAgZG9fb3RoZXIgPSAwOyBcCisgICAgICAgIH0gXAorICAgICAgICByID0gY2FsbF9tYXliZSggXAorICAgICAgICAgICAgc2VsZiwgT1BTVFIsICZjYWNoZV9zdHIsICIoTykiLCBvdGhlcik7IFwKKyAgICAgICAgaWYgKHIgIT0gUHlfTm90SW1wbGVtZW50ZWQgfHwgXAorICAgICAgICAgICAgUHlfVFlQRShvdGhlcikgPT0gUHlfVFlQRShzZWxmKSkgXAorICAgICAgICAgICAgcmV0dXJuIHI7IFwKKyAgICAgICAgUHlfREVDUkVGKHIpOyBcCisgICAgfSBcCisgICAgaWYgKGRvX290aGVyKSB7IFwKKyAgICAgICAgcmV0dXJuIGNhbGxfbWF5YmUoIFwKKyAgICAgICAgICAgIG90aGVyLCBST1BTVFIsICZyY2FjaGVfc3RyLCAiKE8pIiwgc2VsZik7IFwKKyAgICB9IFwKKyAgICBQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOyBcCisgICAgcmV0dXJuIFB5X05vdEltcGxlbWVudGVkOyBcCiB9CiAKICNkZWZpbmUgU0xPVDFCSU4oRlVOQ05BTUUsIFNMT1ROQU1FLCBPUFNUUiwgUk9QU1RSKSBcCi0JU0xPVDFCSU5GVUxMKEZVTkNOQU1FLCBGVU5DTkFNRSwgU0xPVE5BTUUsIE9QU1RSLCBST1BTVFIpCisgICAgU0xPVDFCSU5GVUxMKEZVTkNOQU1FLCBGVU5DTkFNRSwgU0xPVE5BTUUsIE9QU1RSLCBST1BTVFIpCiAKICNkZWZpbmUgU0xPVDIoRlVOQ05BTUUsIE9QU1RSLCBBUkcxVFlQRSwgQVJHMlRZUEUsIEFSR0NPREVTKSBcCiBzdGF0aWMgUHlPYmplY3QgKiBcCiBGVU5DTkFNRShQeU9iamVjdCAqc2VsZiwgQVJHMVRZUEUgYXJnMSwgQVJHMlRZUEUgYXJnMikgXAogeyBcCi0Jc3RhdGljIFB5T2JqZWN0ICpjYWNoZV9zdHI7IFwKLQlyZXR1cm4gY2FsbF9tZXRob2Qoc2VsZiwgT1BTVFIsICZjYWNoZV9zdHIsIFwKLQkJCSAgICIoIiBBUkdDT0RFUyAiKSIsIGFyZzEsIGFyZzIpOyBcCisgICAgc3RhdGljIFB5T2JqZWN0ICpjYWNoZV9zdHI7IFwKKyAgICByZXR1cm4gY2FsbF9tZXRob2Qoc2VsZiwgT1BTVFIsICZjYWNoZV9zdHIsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIigiIEFSR0NPREVTICIpIiwgYXJnMSwgYXJnMik7IFwKIH0KIAogc3RhdGljIFB5X3NzaXplX3QKIHNsb3Rfc3FfbGVuZ3RoKFB5T2JqZWN0ICpzZWxmKQogewotCXN0YXRpYyBQeU9iamVjdCAqbGVuX3N0cjsKLQlQeU9iamVjdCAqcmVzID0gY2FsbF9tZXRob2Qoc2VsZiwgIl9fbGVuX18iLCAmbGVuX3N0ciwgIigpIik7Ci0JUHlfc3NpemVfdCBsZW47CisgICAgc3RhdGljIFB5T2JqZWN0ICpsZW5fc3RyOworICAgIFB5T2JqZWN0ICpyZXMgPSBjYWxsX21ldGhvZChzZWxmLCAiX19sZW5fXyIsICZsZW5fc3RyLCAiKCkiKTsKKyAgICBQeV9zc2l6ZV90IGxlbjsKIAotCWlmIChyZXMgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCWxlbiA9IFB5SW50X0FzU3NpemVfdChyZXMpOwotCVB5X0RFQ1JFRihyZXMpOwotCWlmIChsZW4gPCAwKSB7Ci0JCWlmICghUHlFcnJfT2NjdXJyZWQoKSkKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCQkiX19sZW5fXygpIHNob3VsZCByZXR1cm4gPj0gMCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXJldHVybiBsZW47CisgICAgaWYgKHJlcyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAgbGVuID0gUHlJbnRfQXNTc2l6ZV90KHJlcyk7CisgICAgUHlfREVDUkVGKHJlcyk7CisgICAgaWYgKGxlbiA8IDApIHsKKyAgICAgICAgaWYgKCFQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9fbGVuX18oKSBzaG91bGQgcmV0dXJuID49IDAiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gbGVuOwogfQogCiAvKiBTdXBlci1vcHRpbWl6ZWQgdmVyc2lvbiBvZiBzbG90X3NxX2l0ZW0uCkBAIC00OTAzLDEzMSArNDkwMywxMzEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzbG90X3NxX2l0ZW0oUHlPYmplY3QgKnNlbGYsIFB5X3NzaXplX3QgaSkKIHsKLQlzdGF0aWMgUHlPYmplY3QgKmdldGl0ZW1fc3RyOwotCVB5T2JqZWN0ICpmdW5jLCAqYXJncyA9IE5VTEwsICppdmFsID0gTlVMTCwgKnJldHZhbCA9IE5VTEw7Ci0JZGVzY3JnZXRmdW5jIGY7CisgICAgc3RhdGljIFB5T2JqZWN0ICpnZXRpdGVtX3N0cjsKKyAgICBQeU9iamVjdCAqZnVuYywgKmFyZ3MgPSBOVUxMLCAqaXZhbCA9IE5VTEwsICpyZXR2YWwgPSBOVUxMOworICAgIGRlc2NyZ2V0ZnVuYyBmOwogCi0JaWYgKGdldGl0ZW1fc3RyID09IE5VTEwpIHsKLQkJZ2V0aXRlbV9zdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2dldGl0ZW1fXyIpOwotCQlpZiAoZ2V0aXRlbV9zdHIgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCX0KLQlmdW5jID0gX1B5VHlwZV9Mb29rdXAoUHlfVFlQRShzZWxmKSwgZ2V0aXRlbV9zdHIpOwotCWlmIChmdW5jICE9IE5VTEwpIHsKLQkJaWYgKChmID0gUHlfVFlQRShmdW5jKS0+dHBfZGVzY3JfZ2V0KSA9PSBOVUxMKQotCQkJUHlfSU5DUkVGKGZ1bmMpOwotCQllbHNlIHsKLQkJCWZ1bmMgPSBmKGZ1bmMsIHNlbGYsIChQeU9iamVjdCAqKShQeV9UWVBFKHNlbGYpKSk7Ci0JCQlpZiAoZnVuYyA9PSBOVUxMKSB7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCX0KLQkJaXZhbCA9IFB5SW50X0Zyb21Tc2l6ZV90KGkpOwotCQlpZiAoaXZhbCAhPSBOVUxMKSB7Ci0JCQlhcmdzID0gUHlUdXBsZV9OZXcoMSk7Ci0JCQlpZiAoYXJncyAhPSBOVUxMKSB7Ci0JCQkJUHlUdXBsZV9TRVRfSVRFTShhcmdzLCAwLCBpdmFsKTsKLQkJCQlyZXR2YWwgPSBQeU9iamVjdF9DYWxsKGZ1bmMsIGFyZ3MsIE5VTEwpOwotCQkJCVB5X1hERUNSRUYoYXJncyk7Ci0JCQkJUHlfWERFQ1JFRihmdW5jKTsKLQkJCQlyZXR1cm4gcmV0dmFsOwotCQkJfQotCQl9Ci0JfQotCWVsc2UgewotCQlQeUVycl9TZXRPYmplY3QoUHlFeGNfQXR0cmlidXRlRXJyb3IsIGdldGl0ZW1fc3RyKTsKLQl9Ci0JUHlfWERFQ1JFRihhcmdzKTsKLQlQeV9YREVDUkVGKGl2YWwpOwotCVB5X1hERUNSRUYoZnVuYyk7Ci0JcmV0dXJuIE5VTEw7CisgICAgaWYgKGdldGl0ZW1fc3RyID09IE5VTEwpIHsKKyAgICAgICAgZ2V0aXRlbV9zdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2dldGl0ZW1fXyIpOworICAgICAgICBpZiAoZ2V0aXRlbV9zdHIgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBmdW5jID0gX1B5VHlwZV9Mb29rdXAoUHlfVFlQRShzZWxmKSwgZ2V0aXRlbV9zdHIpOworICAgIGlmIChmdW5jICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKChmID0gUHlfVFlQRShmdW5jKS0+dHBfZGVzY3JfZ2V0KSA9PSBOVUxMKQorICAgICAgICAgICAgUHlfSU5DUkVGKGZ1bmMpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGZ1bmMgPSBmKGZ1bmMsIHNlbGYsIChQeU9iamVjdCAqKShQeV9UWVBFKHNlbGYpKSk7CisgICAgICAgICAgICBpZiAoZnVuYyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaXZhbCA9IFB5SW50X0Zyb21Tc2l6ZV90KGkpOworICAgICAgICBpZiAoaXZhbCAhPSBOVUxMKSB7CisgICAgICAgICAgICBhcmdzID0gUHlUdXBsZV9OZXcoMSk7CisgICAgICAgICAgICBpZiAoYXJncyAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShhcmdzLCAwLCBpdmFsKTsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSBQeU9iamVjdF9DYWxsKGZ1bmMsIGFyZ3MsIE5VTEwpOworICAgICAgICAgICAgICAgIFB5X1hERUNSRUYoYXJncyk7CisgICAgICAgICAgICAgICAgUHlfWERFQ1JFRihmdW5jKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeUVycl9TZXRPYmplY3QoUHlFeGNfQXR0cmlidXRlRXJyb3IsIGdldGl0ZW1fc3RyKTsKKyAgICB9CisgICAgUHlfWERFQ1JFRihhcmdzKTsKKyAgICBQeV9YREVDUkVGKGl2YWwpOworICAgIFB5X1hERUNSRUYoZnVuYyk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCoKIHNsb3Rfc3Ffc2xpY2UoUHlPYmplY3QgKnNlbGYsIFB5X3NzaXplX3QgaSwgUHlfc3NpemVfdCBqKQogewotCXN0YXRpYyBQeU9iamVjdCAqZ2V0c2xpY2Vfc3RyOwotCQotCWlmIChQeUVycl9XYXJuUHkzaygiaW4gMy54LCBfX2dldHNsaWNlX18gaGFzIGJlZW4gcmVtb3ZlZDsgIgotCQkJICAgICJ1c2UgX19nZXRpdGVtX18iLCAxKSA8IDApCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBjYWxsX21ldGhvZChzZWxmLCAiX19nZXRzbGljZV9fIiwgJmdldHNsaWNlX3N0ciwKLQkJIm5uIiwgaSwgaik7CisgICAgc3RhdGljIFB5T2JqZWN0ICpnZXRzbGljZV9zdHI7CisKKyAgICBpZiAoUHlFcnJfV2FyblB5M2soImluIDMueCwgX19nZXRzbGljZV9fIGhhcyBiZWVuIHJlbW92ZWQ7ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJ1c2UgX19nZXRpdGVtX18iLCAxKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBjYWxsX21ldGhvZChzZWxmLCAiX19nZXRzbGljZV9fIiwgJmdldHNsaWNlX3N0ciwKKyAgICAgICAgIm5uIiwgaSwgaik7CiB9CiAKIHN0YXRpYyBpbnQKIHNsb3Rfc3FfYXNzX2l0ZW0oUHlPYmplY3QgKnNlbGYsIFB5X3NzaXplX3QgaW5kZXgsIFB5T2JqZWN0ICp2YWx1ZSkKIHsKLQlQeU9iamVjdCAqcmVzOwotCXN0YXRpYyBQeU9iamVjdCAqZGVsaXRlbV9zdHIsICpzZXRpdGVtX3N0cjsKKyAgICBQeU9iamVjdCAqcmVzOworICAgIHN0YXRpYyBQeU9iamVjdCAqZGVsaXRlbV9zdHIsICpzZXRpdGVtX3N0cjsKIAotCWlmICh2YWx1ZSA9PSBOVUxMKQotCQlyZXMgPSBjYWxsX21ldGhvZChzZWxmLCAiX19kZWxpdGVtX18iLCAmZGVsaXRlbV9zdHIsCi0JCQkJICAiKG4pIiwgaW5kZXgpOwotCWVsc2UKLQkJcmVzID0gY2FsbF9tZXRob2Qoc2VsZiwgIl9fc2V0aXRlbV9fIiwgJnNldGl0ZW1fc3RyLAotCQkJCSAgIihuTykiLCBpbmRleCwgdmFsdWUpOwotCWlmIChyZXMgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCVB5X0RFQ1JFRihyZXMpOwotCXJldHVybiAwOworICAgIGlmICh2YWx1ZSA9PSBOVUxMKQorICAgICAgICByZXMgPSBjYWxsX21ldGhvZChzZWxmLCAiX19kZWxpdGVtX18iLCAmZGVsaXRlbV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICIobikiLCBpbmRleCk7CisgICAgZWxzZQorICAgICAgICByZXMgPSBjYWxsX21ldGhvZChzZWxmLCAiX19zZXRpdGVtX18iLCAmc2V0aXRlbV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICIobk8pIiwgaW5kZXgsIHZhbHVlKTsKKyAgICBpZiAocmVzID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBQeV9ERUNSRUYocmVzKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogc2xvdF9zcV9hc3Nfc2xpY2UoUHlPYmplY3QgKnNlbGYsIFB5X3NzaXplX3QgaSwgUHlfc3NpemVfdCBqLCBQeU9iamVjdCAqdmFsdWUpCiB7Ci0JUHlPYmplY3QgKnJlczsKLQlzdGF0aWMgUHlPYmplY3QgKmRlbHNsaWNlX3N0ciwgKnNldHNsaWNlX3N0cjsKLQkKLQlpZiAodmFsdWUgPT0gTlVMTCkgewotCQlpZiAoUHlFcnJfV2FyblB5M2soImluIDMueCwgX19kZWxzbGljZV9fIGhhcyBiZWVuIHJlbW92ZWQ7ICIKLQkJCQkgICAidXNlIF9fZGVsaXRlbV9fIiwgMSkgPCAwKQotCQkJcmV0dXJuIC0xOwotCQlyZXMgPSBjYWxsX21ldGhvZChzZWxmLCAiX19kZWxzbGljZV9fIiwgJmRlbHNsaWNlX3N0ciwKLQkJCQkgICIobm4pIiwgaSwgaik7Ci0JfQotCWVsc2UgewotCQlpZiAoUHlFcnJfV2FyblB5M2soImluIDMueCwgX19zZXRzbGljZV9fIGhhcyBiZWVuIHJlbW92ZWQ7ICIKLQkJCQkJInVzZSBfX3NldGl0ZW1fXyIsIDEpIDwgMCkKLQkJCXJldHVybiAtMTsJCQotCQlyZXMgPSBjYWxsX21ldGhvZChzZWxmLCAiX19zZXRzbGljZV9fIiwgJnNldHNsaWNlX3N0ciwKLQkJCSAgIihubk8pIiwgaSwgaiwgdmFsdWUpOwotCX0KLQlpZiAocmVzID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQlQeV9ERUNSRUYocmVzKTsKLQlyZXR1cm4gMDsKKyAgICBQeU9iamVjdCAqcmVzOworICAgIHN0YXRpYyBQeU9iamVjdCAqZGVsc2xpY2Vfc3RyLCAqc2V0c2xpY2Vfc3RyOworCisgICAgaWYgKHZhbHVlID09IE5VTEwpIHsKKyAgICAgICAgaWYgKFB5RXJyX1dhcm5QeTNrKCJpbiAzLngsIF9fZGVsc2xpY2VfXyBoYXMgYmVlbiByZW1vdmVkOyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNlIF9fZGVsaXRlbV9fIiwgMSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICByZXMgPSBjYWxsX21ldGhvZChzZWxmLCAiX19kZWxzbGljZV9fIiwgJmRlbHNsaWNlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIihubikiLCBpLCBqKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGlmIChQeUVycl9XYXJuUHkzaygiaW4gMy54LCBfX3NldHNsaWNlX18gaGFzIGJlZW4gcmVtb3ZlZDsgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNlIF9fc2V0aXRlbV9fIiwgMSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICByZXMgPSBjYWxsX21ldGhvZChzZWxmLCAiX19zZXRzbGljZV9fIiwgJnNldHNsaWNlX3N0ciwKKyAgICAgICAgICAgICAgICAgICIobm5PKSIsIGksIGosIHZhbHVlKTsKKyAgICB9CisgICAgaWYgKHJlcyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAgUHlfREVDUkVGKHJlcyk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIHNsb3Rfc3FfY29udGFpbnMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp2YWx1ZSkKIHsKLQlQeU9iamVjdCAqZnVuYywgKnJlcywgKmFyZ3M7Ci0JaW50IHJlc3VsdCA9IC0xOworICAgIFB5T2JqZWN0ICpmdW5jLCAqcmVzLCAqYXJnczsKKyAgICBpbnQgcmVzdWx0ID0gLTE7CiAKLQlzdGF0aWMgUHlPYmplY3QgKmNvbnRhaW5zX3N0cjsKKyAgICBzdGF0aWMgUHlPYmplY3QgKmNvbnRhaW5zX3N0cjsKIAotCWZ1bmMgPSBsb29rdXBfbWF5YmUoc2VsZiwgIl9fY29udGFpbnNfXyIsICZjb250YWluc19zdHIpOwotCWlmIChmdW5jICE9IE5VTEwpIHsKLQkJYXJncyA9IFB5VHVwbGVfUGFjaygxLCB2YWx1ZSk7Ci0JCWlmIChhcmdzID09IE5VTEwpCi0JCQlyZXMgPSBOVUxMOwotCQllbHNlIHsKLQkJCXJlcyA9IFB5T2JqZWN0X0NhbGwoZnVuYywgYXJncywgTlVMTCk7Ci0JCQlQeV9ERUNSRUYoYXJncyk7Ci0JCX0KLQkJUHlfREVDUkVGKGZ1bmMpOwotCQlpZiAocmVzICE9IE5VTEwpIHsKLQkJCXJlc3VsdCA9IFB5T2JqZWN0X0lzVHJ1ZShyZXMpOwotCQkJUHlfREVDUkVGKHJlcyk7Ci0JCX0KLQl9Ci0JZWxzZSBpZiAoISBQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCS8qIFBvc3NpYmxlIHJlc3VsdHM6IC0xIGFuZCAxICovCi0JCXJlc3VsdCA9IChpbnQpX1B5U2VxdWVuY2VfSXRlclNlYXJjaChzZWxmLCB2YWx1ZSwKLQkJCQkJCSBQWV9JVEVSU0VBUkNIX0NPTlRBSU5TKTsKLQl9Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBmdW5jID0gbG9va3VwX21heWJlKHNlbGYsICJfX2NvbnRhaW5zX18iLCAmY29udGFpbnNfc3RyKTsKKyAgICBpZiAoZnVuYyAhPSBOVUxMKSB7CisgICAgICAgIGFyZ3MgPSBQeVR1cGxlX1BhY2soMSwgdmFsdWUpOworICAgICAgICBpZiAoYXJncyA9PSBOVUxMKQorICAgICAgICAgICAgcmVzID0gTlVMTDsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICByZXMgPSBQeU9iamVjdF9DYWxsKGZ1bmMsIGFyZ3MsIE5VTEwpOworICAgICAgICAgICAgUHlfREVDUkVGKGFyZ3MpOworICAgICAgICB9CisgICAgICAgIFB5X0RFQ1JFRihmdW5jKTsKKyAgICAgICAgaWYgKHJlcyAhPSBOVUxMKSB7CisgICAgICAgICAgICByZXN1bHQgPSBQeU9iamVjdF9Jc1RydWUocmVzKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihyZXMpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKCEgUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICAvKiBQb3NzaWJsZSByZXN1bHRzOiAtMSBhbmQgMSAqLworICAgICAgICByZXN1bHQgPSAoaW50KV9QeVNlcXVlbmNlX0l0ZXJTZWFyY2goc2VsZiwgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBZX0lURVJTRUFSQ0hfQ09OVEFJTlMpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiAjZGVmaW5lIHNsb3RfbXBfbGVuZ3RoIHNsb3Rfc3FfbGVuZ3RoCkBAIC01MDM3LDE5ICs1MDM3LDE5IEBACiBzdGF0aWMgaW50CiBzbG90X21wX2Fzc19zdWJzY3JpcHQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICprZXksIFB5T2JqZWN0ICp2YWx1ZSkKIHsKLQlQeU9iamVjdCAqcmVzOwotCXN0YXRpYyBQeU9iamVjdCAqZGVsaXRlbV9zdHIsICpzZXRpdGVtX3N0cjsKKyAgICBQeU9iamVjdCAqcmVzOworICAgIHN0YXRpYyBQeU9iamVjdCAqZGVsaXRlbV9zdHIsICpzZXRpdGVtX3N0cjsKIAotCWlmICh2YWx1ZSA9PSBOVUxMKQotCQlyZXMgPSBjYWxsX21ldGhvZChzZWxmLCAiX19kZWxpdGVtX18iLCAmZGVsaXRlbV9zdHIsCi0JCQkJICAiKE8pIiwga2V5KTsKLQllbHNlCi0JCXJlcyA9IGNhbGxfbWV0aG9kKHNlbGYsICJfX3NldGl0ZW1fXyIsICZzZXRpdGVtX3N0ciwKLQkJCQkgIihPTykiLCBrZXksIHZhbHVlKTsKLQlpZiAocmVzID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQlQeV9ERUNSRUYocmVzKTsKLQlyZXR1cm4gMDsKKyAgICBpZiAodmFsdWUgPT0gTlVMTCkKKyAgICAgICAgcmVzID0gY2FsbF9tZXRob2Qoc2VsZiwgIl9fZGVsaXRlbV9fIiwgJmRlbGl0ZW1fc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiKE8pIiwga2V5KTsKKyAgICBlbHNlCisgICAgICAgIHJlcyA9IGNhbGxfbWV0aG9kKHNlbGYsICJfX3NldGl0ZW1fXyIsICZzZXRpdGVtX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiKE9PKSIsIGtleSwgdmFsdWUpOworICAgIGlmIChyZXMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIFB5X0RFQ1JFRihyZXMpOworICAgIHJldHVybiAwOwogfQogCiBTTE9UMUJJTihzbG90X25iX2FkZCwgbmJfYWRkLCAiX19hZGRfXyIsICJfX3JhZGRfXyIpCkBAIC01MDYyLDI1ICs1MDYyLDI1IEBACiBzdGF0aWMgUHlPYmplY3QgKnNsb3RfbmJfcG93ZXIoUHlPYmplY3QgKiwgUHlPYmplY3QgKiwgUHlPYmplY3QgKik7CiAKIFNMT1QxQklORlVMTChzbG90X25iX3Bvd2VyX2JpbmFyeSwgc2xvdF9uYl9wb3dlciwKLQkgICAgIG5iX3Bvd2VyLCAiX19wb3dfXyIsICJfX3Jwb3dfXyIpCisgICAgICAgICAgICAgbmJfcG93ZXIsICJfX3Bvd19fIiwgIl9fcnBvd19fIikKIAogc3RhdGljIFB5T2JqZWN0ICoKIHNsb3RfbmJfcG93ZXIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpvdGhlciwgUHlPYmplY3QgKm1vZHVsdXMpCiB7Ci0Jc3RhdGljIFB5T2JqZWN0ICpwb3dfc3RyOworICAgIHN0YXRpYyBQeU9iamVjdCAqcG93X3N0cjsKIAotCWlmIChtb2R1bHVzID09IFB5X05vbmUpCi0JCXJldHVybiBzbG90X25iX3Bvd2VyX2JpbmFyeShzZWxmLCBvdGhlcik7Ci0JLyogVGhyZWUtYXJnIHBvd2VyIGRvZXNuJ3QgdXNlIF9fcnBvd19fLiAgQnV0IHRlcm5hcnlfb3AKLQkgICBjYW4gY2FsbCB0aGlzIHdoZW4gdGhlIHNlY29uZCBhcmd1bWVudCdzIHR5cGUgdXNlcwotCSAgIHNsb3RfbmJfcG93ZXIsIHNvIGNoZWNrIGJlZm9yZSBjYWxsaW5nIHNlbGYuX19wb3dfXy4gKi8KLQlpZiAoUHlfVFlQRShzZWxmKS0+dHBfYXNfbnVtYmVyICE9IE5VTEwgJiYKLQkgICAgUHlfVFlQRShzZWxmKS0+dHBfYXNfbnVtYmVyLT5uYl9wb3dlciA9PSBzbG90X25iX3Bvd2VyKSB7Ci0JCXJldHVybiBjYWxsX21ldGhvZChzZWxmLCAiX19wb3dfXyIsICZwb3dfc3RyLAotCQkJCSAgICIoT08pIiwgb3RoZXIsIG1vZHVsdXMpOwotCX0KLQlQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOwotCXJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKKyAgICBpZiAobW9kdWx1cyA9PSBQeV9Ob25lKQorICAgICAgICByZXR1cm4gc2xvdF9uYl9wb3dlcl9iaW5hcnkoc2VsZiwgb3RoZXIpOworICAgIC8qIFRocmVlLWFyZyBwb3dlciBkb2Vzbid0IHVzZSBfX3Jwb3dfXy4gIEJ1dCB0ZXJuYXJ5X29wCisgICAgICAgY2FuIGNhbGwgdGhpcyB3aGVuIHRoZSBzZWNvbmQgYXJndW1lbnQncyB0eXBlIHVzZXMKKyAgICAgICBzbG90X25iX3Bvd2VyLCBzbyBjaGVjayBiZWZvcmUgY2FsbGluZyBzZWxmLl9fcG93X18uICovCisgICAgaWYgKFB5X1RZUEUoc2VsZiktPnRwX2FzX251bWJlciAhPSBOVUxMICYmCisgICAgICAgIFB5X1RZUEUoc2VsZiktPnRwX2FzX251bWJlci0+bmJfcG93ZXIgPT0gc2xvdF9uYl9wb3dlcikgeworICAgICAgICByZXR1cm4gY2FsbF9tZXRob2Qoc2VsZiwgIl9fcG93X18iLCAmcG93X3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIoT08pIiwgb3RoZXIsIG1vZHVsdXMpOworICAgIH0KKyAgICBQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOworICAgIHJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKIH0KIAogU0xPVDAoc2xvdF9uYl9uZWdhdGl2ZSwgIl9fbmVnX18iKQpAQCAtNTA5MCw0OSArNTA5MCw0OSBAQAogc3RhdGljIGludAogc2xvdF9uYl9ub256ZXJvKFB5T2JqZWN0ICpzZWxmKQogewotCVB5T2JqZWN0ICpmdW5jLCAqYXJnczsKLQlzdGF0aWMgUHlPYmplY3QgKm5vbnplcm9fc3RyLCAqbGVuX3N0cjsKLQlpbnQgcmVzdWx0ID0gLTE7Ci0JaW50IHVzaW5nX2xlbiA9IDA7CisgICAgUHlPYmplY3QgKmZ1bmMsICphcmdzOworICAgIHN0YXRpYyBQeU9iamVjdCAqbm9uemVyb19zdHIsICpsZW5fc3RyOworICAgIGludCByZXN1bHQgPSAtMTsKKyAgICBpbnQgdXNpbmdfbGVuID0gMDsKIAotCWZ1bmMgPSBsb29rdXBfbWF5YmUoc2VsZiwgIl9fbm9uemVyb19fIiwgJm5vbnplcm9fc3RyKTsKLQlpZiAoZnVuYyA9PSBOVUxMKSB7Ci0JCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIC0xOwotCQlmdW5jID0gbG9va3VwX21heWJlKHNlbGYsICJfX2xlbl9fIiwgJmxlbl9zdHIpOwotCQlpZiAoZnVuYyA9PSBOVUxMKQotCQkJcmV0dXJuIFB5RXJyX09jY3VycmVkKCkgPyAtMSA6IDE7Ci0JCXVzaW5nX2xlbiA9IDE7Ci0JfQotCWFyZ3MgPSBQeVR1cGxlX05ldygwKTsKLQlpZiAoYXJncyAhPSBOVUxMKSB7Ci0JCVB5T2JqZWN0ICp0ZW1wID0gUHlPYmplY3RfQ2FsbChmdW5jLCBhcmdzLCBOVUxMKTsKLQkJUHlfREVDUkVGKGFyZ3MpOwotCQlpZiAodGVtcCAhPSBOVUxMKSB7Ci0JCQlpZiAoUHlJbnRfQ2hlY2tFeGFjdCh0ZW1wKSB8fCBQeUJvb2xfQ2hlY2sodGVtcCkpCi0JCQkJcmVzdWx0ID0gUHlPYmplY3RfSXNUcnVlKHRlbXApOwotCQkJZWxzZSB7Ci0JCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCQkJICAgICAiJXMgc2hvdWxkIHJldHVybiAiCi0JCQkJCSAgICAgImJvb2wgb3IgaW50LCByZXR1cm5lZCAlcyIsCi0JCQkJCSAgICAgKHVzaW5nX2xlbiA/ICJfX2xlbl9fIgotCQkJCQkgICAgICAgICAgICAgICAgOiAiX19ub256ZXJvX18iKSwKLQkJCQkJICAgICB0ZW1wLT5vYl90eXBlLT50cF9uYW1lKTsKLQkJCQlyZXN1bHQgPSAtMTsKLQkJCX0KLQkJCVB5X0RFQ1JFRih0ZW1wKTsKLQkJfQotCX0KLQlQeV9ERUNSRUYoZnVuYyk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBmdW5jID0gbG9va3VwX21heWJlKHNlbGYsICJfX25vbnplcm9fXyIsICZub256ZXJvX3N0cik7CisgICAgaWYgKGZ1bmMgPT0gTlVMTCkgeworICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgZnVuYyA9IGxvb2t1cF9tYXliZShzZWxmLCAiX19sZW5fXyIsICZsZW5fc3RyKTsKKyAgICAgICAgaWYgKGZ1bmMgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBQeUVycl9PY2N1cnJlZCgpID8gLTEgOiAxOworICAgICAgICB1c2luZ19sZW4gPSAxOworICAgIH0KKyAgICBhcmdzID0gUHlUdXBsZV9OZXcoMCk7CisgICAgaWYgKGFyZ3MgIT0gTlVMTCkgeworICAgICAgICBQeU9iamVjdCAqdGVtcCA9IFB5T2JqZWN0X0NhbGwoZnVuYywgYXJncywgTlVMTCk7CisgICAgICAgIFB5X0RFQ1JFRihhcmdzKTsKKyAgICAgICAgaWYgKHRlbXAgIT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKFB5SW50X0NoZWNrRXhhY3QodGVtcCkgfHwgUHlCb29sX0NoZWNrKHRlbXApKQorICAgICAgICAgICAgICAgIHJlc3VsdCA9IFB5T2JqZWN0X0lzVHJ1ZSh0ZW1wKTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcyBzaG91bGQgcmV0dXJuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJvb2wgb3IgaW50LCByZXR1cm5lZCAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1c2luZ19sZW4gPyAiX19sZW5fXyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJfX25vbnplcm9fXyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wLT5vYl90eXBlLT50cF9uYW1lKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5X0RFQ1JFRih0ZW1wKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBQeV9ERUNSRUYoZnVuYyk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogCiBzdGF0aWMgUHlPYmplY3QgKgogc2xvdF9uYl9pbmRleChQeU9iamVjdCAqc2VsZikKIHsKLQlzdGF0aWMgUHlPYmplY3QgKmluZGV4X3N0cjsKLQlyZXR1cm4gY2FsbF9tZXRob2Qoc2VsZiwgIl9faW5kZXhfXyIsICZpbmRleF9zdHIsICIoKSIpOworICAgIHN0YXRpYyBQeU9iamVjdCAqaW5kZXhfc3RyOworICAgIHJldHVybiBjYWxsX21ldGhvZChzZWxmLCAiX19pbmRleF9fIiwgJmluZGV4X3N0ciwgIigpIik7CiB9CiAKIApAQCAtNTE0Niw1OSArNTE0Niw1OSBAQAogc3RhdGljIGludAogc2xvdF9uYl9jb2VyY2UoUHlPYmplY3QgKiphLCBQeU9iamVjdCAqKmIpCiB7Ci0Jc3RhdGljIFB5T2JqZWN0ICpjb2VyY2Vfc3RyOwotCVB5T2JqZWN0ICpzZWxmID0gKmEsICpvdGhlciA9ICpiOworICAgIHN0YXRpYyBQeU9iamVjdCAqY29lcmNlX3N0cjsKKyAgICBQeU9iamVjdCAqc2VsZiA9ICphLCAqb3RoZXIgPSAqYjsKIAotCWlmIChzZWxmLT5vYl90eXBlLT50cF9hc19udW1iZXIgIT0gTlVMTCAmJgotCSAgICBzZWxmLT5vYl90eXBlLT50cF9hc19udW1iZXItPm5iX2NvZXJjZSA9PSBzbG90X25iX2NvZXJjZSkgewotCQlQeU9iamVjdCAqcjsKLQkJciA9IGNhbGxfbWF5YmUoCi0JCQlzZWxmLCAiX19jb2VyY2VfXyIsICZjb2VyY2Vfc3RyLCAiKE8pIiwgb3RoZXIpOwotCQlpZiAociA9PSBOVUxMKQotCQkJcmV0dXJuIC0xOwotCQlpZiAociA9PSBQeV9Ob3RJbXBsZW1lbnRlZCkgewotCQkJUHlfREVDUkVGKHIpOwotCQl9Ci0JCWVsc2UgewotCQkJaWYgKCFQeVR1cGxlX0NoZWNrKHIpIHx8IFB5VHVwbGVfR0VUX1NJWkUocikgIT0gMikgewotCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJCSJfX2NvZXJjZV9fIGRpZG4ndCByZXR1cm4gYSAyLXR1cGxlIik7Ci0JCQkJUHlfREVDUkVGKHIpOwotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJCSphID0gUHlUdXBsZV9HRVRfSVRFTShyLCAwKTsKLQkJCVB5X0lOQ1JFRigqYSk7Ci0JCQkqYiA9IFB5VHVwbGVfR0VUX0lURU0ociwgMSk7Ci0JCQlQeV9JTkNSRUYoKmIpOwotCQkJUHlfREVDUkVGKHIpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0JaWYgKG90aGVyLT5vYl90eXBlLT50cF9hc19udW1iZXIgIT0gTlVMTCAmJgotCSAgICBvdGhlci0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyLT5uYl9jb2VyY2UgPT0gc2xvdF9uYl9jb2VyY2UpIHsKLQkJUHlPYmplY3QgKnI7Ci0JCXIgPSBjYWxsX21heWJlKAotCQkJb3RoZXIsICJfX2NvZXJjZV9fIiwgJmNvZXJjZV9zdHIsICIoTykiLCBzZWxmKTsKLQkJaWYgKHIgPT0gTlVMTCkKLQkJCXJldHVybiAtMTsKLQkJaWYgKHIgPT0gUHlfTm90SW1wbGVtZW50ZWQpIHsKLQkJCVB5X0RFQ1JFRihyKTsKLQkJCXJldHVybiAxOwotCQl9Ci0JCWlmICghUHlUdXBsZV9DaGVjayhyKSB8fCBQeVR1cGxlX0dFVF9TSVpFKHIpICE9IDIpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJCSJfX2NvZXJjZV9fIGRpZG4ndCByZXR1cm4gYSAyLXR1cGxlIik7Ci0JCQlQeV9ERUNSRUYocik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJKmEgPSBQeVR1cGxlX0dFVF9JVEVNKHIsIDEpOwotCQlQeV9JTkNSRUYoKmEpOwotCQkqYiA9IFB5VHVwbGVfR0VUX0lURU0ociwgMCk7Ci0JCVB5X0lOQ1JFRigqYik7Ci0JCVB5X0RFQ1JFRihyKTsKLQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiAxOworICAgIGlmIChzZWxmLT5vYl90eXBlLT50cF9hc19udW1iZXIgIT0gTlVMTCAmJgorICAgICAgICBzZWxmLT5vYl90eXBlLT50cF9hc19udW1iZXItPm5iX2NvZXJjZSA9PSBzbG90X25iX2NvZXJjZSkgeworICAgICAgICBQeU9iamVjdCAqcjsKKyAgICAgICAgciA9IGNhbGxfbWF5YmUoCisgICAgICAgICAgICBzZWxmLCAiX19jb2VyY2VfXyIsICZjb2VyY2Vfc3RyLCAiKE8pIiwgb3RoZXIpOworICAgICAgICBpZiAociA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBpZiAociA9PSBQeV9Ob3RJbXBsZW1lbnRlZCkgeworICAgICAgICAgICAgUHlfREVDUkVGKHIpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKCFQeVR1cGxlX0NoZWNrKHIpIHx8IFB5VHVwbGVfR0VUX1NJWkUocikgIT0gMikgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICJfX2NvZXJjZV9fIGRpZG4ndCByZXR1cm4gYSAyLXR1cGxlIik7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHIpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICphID0gUHlUdXBsZV9HRVRfSVRFTShyLCAwKTsKKyAgICAgICAgICAgIFB5X0lOQ1JFRigqYSk7CisgICAgICAgICAgICAqYiA9IFB5VHVwbGVfR0VUX0lURU0ociwgMSk7CisgICAgICAgICAgICBQeV9JTkNSRUYoKmIpOworICAgICAgICAgICAgUHlfREVDUkVGKHIpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKG90aGVyLT5vYl90eXBlLT50cF9hc19udW1iZXIgIT0gTlVMTCAmJgorICAgICAgICBvdGhlci0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyLT5uYl9jb2VyY2UgPT0gc2xvdF9uYl9jb2VyY2UpIHsKKyAgICAgICAgUHlPYmplY3QgKnI7CisgICAgICAgIHIgPSBjYWxsX21heWJlKAorICAgICAgICAgICAgb3RoZXIsICJfX2NvZXJjZV9fIiwgJmNvZXJjZV9zdHIsICIoTykiLCBzZWxmKTsKKyAgICAgICAgaWYgKHIgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaWYgKHIgPT0gUHlfTm90SW1wbGVtZW50ZWQpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihyKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgIGlmICghUHlUdXBsZV9DaGVjayhyKSB8fCBQeVR1cGxlX0dFVF9TSVpFKHIpICE9IDIpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9fY29lcmNlX18gZGlkbid0IHJldHVybiBhIDItdHVwbGUiKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihyKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICAqYSA9IFB5VHVwbGVfR0VUX0lURU0ociwgMSk7CisgICAgICAgIFB5X0lOQ1JFRigqYSk7CisgICAgICAgICpiID0gUHlUdXBsZV9HRVRfSVRFTShyLCAwKTsKKyAgICAgICAgUHlfSU5DUkVGKCpiKTsKKyAgICAgICAgUHlfREVDUkVGKHIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIDE7CiB9CiAKIFNMT1QwKHNsb3RfbmJfaW50LCAiX19pbnRfXyIpCkBAIC01MjEyLDExICs1MjEyLDExIEBACiBTTE9UMShzbG90X25iX2lucGxhY2VfZGl2aWRlLCAiX19pZGl2X18iLCBQeU9iamVjdCAqLCAiTyIpCiBTTE9UMShzbG90X25iX2lucGxhY2VfcmVtYWluZGVyLCAiX19pbW9kX18iLCBQeU9iamVjdCAqLCAiTyIpCiAvKiBDYW4ndCB1c2UgU0xPVDEgaGVyZSwgYmVjYXVzZSBuYl9pbnBsYWNlX3Bvd2VyIGlzIHRlcm5hcnkgKi8KLXN0YXRpYyBQeU9iamVjdCAqIAotc2xvdF9uYl9pbnBsYWNlX3Bvd2VyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqIGFyZzEsIFB5T2JqZWN0ICphcmcyKSAKLXsgCi0gIHN0YXRpYyBQeU9iamVjdCAqY2FjaGVfc3RyOyAKLSAgcmV0dXJuIGNhbGxfbWV0aG9kKHNlbGYsICJfX2lwb3dfXyIsICZjYWNoZV9zdHIsICIoIiAiTyIgIikiLCBhcmcxKTsgCitzdGF0aWMgUHlPYmplY3QgKgorc2xvdF9uYl9pbnBsYWNlX3Bvd2VyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqIGFyZzEsIFB5T2JqZWN0ICphcmcyKQoreworICBzdGF0aWMgUHlPYmplY3QgKmNhY2hlX3N0cjsKKyAgcmV0dXJuIGNhbGxfbWV0aG9kKHNlbGYsICJfX2lwb3dfXyIsICZjYWNoZV9zdHIsICIoIiAiTyIgIikiLCBhcmcxKTsKIH0KIFNMT1QxKHNsb3RfbmJfaW5wbGFjZV9sc2hpZnQsICJfX2lsc2hpZnRfXyIsIFB5T2JqZWN0ICosICJPIikKIFNMT1QxKHNsb3RfbmJfaW5wbGFjZV9yc2hpZnQsICJfX2lyc2hpZnRfXyIsIFB5T2JqZWN0ICosICJPIikKQEAgLTUyMjQsNyArNTIyNCw3IEBACiBTTE9UMShzbG90X25iX2lucGxhY2VfeG9yLCAiX19peG9yX18iLCBQeU9iamVjdCAqLCAiTyIpCiBTTE9UMShzbG90X25iX2lucGxhY2Vfb3IsICJfX2lvcl9fIiwgUHlPYmplY3QgKiwgIk8iKQogU0xPVDFCSU4oc2xvdF9uYl9mbG9vcl9kaXZpZGUsIG5iX2Zsb29yX2RpdmlkZSwKLQkgIl9fZmxvb3JkaXZfXyIsICJfX3JmbG9vcmRpdl9fIikKKyAgICAgICAgICJfX2Zsb29yZGl2X18iLCAiX19yZmxvb3JkaXZfXyIpCiBTTE9UMUJJTihzbG90X25iX3RydWVfZGl2aWRlLCBuYl90cnVlX2RpdmlkZSwgIl9fdHJ1ZWRpdl9fIiwgIl9fcnRydWVkaXZfXyIpCiBTTE9UMShzbG90X25iX2lucGxhY2VfZmxvb3JfZGl2aWRlLCAiX19pZmxvb3JkaXZfXyIsIFB5T2JqZWN0ICosICJPIikKIFNMT1QxKHNsb3RfbmJfaW5wbGFjZV90cnVlX2RpdmlkZSwgIl9faXRydWVkaXZfXyIsIFB5T2JqZWN0ICosICJPIikKQEAgLTUyMzIsMTQ4ICs1MjMyLDE0OCBAQAogc3RhdGljIGludAogaGFsZl9jb21wYXJlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqb3RoZXIpCiB7Ci0JUHlPYmplY3QgKmZ1bmMsICphcmdzLCAqcmVzOwotCXN0YXRpYyBQeU9iamVjdCAqY21wX3N0cjsKLQlQeV9zc2l6ZV90IGM7CisgICAgUHlPYmplY3QgKmZ1bmMsICphcmdzLCAqcmVzOworICAgIHN0YXRpYyBQeU9iamVjdCAqY21wX3N0cjsKKyAgICBQeV9zc2l6ZV90IGM7CiAKLQlmdW5jID0gbG9va3VwX21ldGhvZChzZWxmLCAiX19jbXBfXyIsICZjbXBfc3RyKTsKLQlpZiAoZnVuYyA9PSBOVUxMKSB7Ci0JCVB5RXJyX0NsZWFyKCk7Ci0JfQotCWVsc2UgewotCQlhcmdzID0gUHlUdXBsZV9QYWNrKDEsIG90aGVyKTsKLQkJaWYgKGFyZ3MgPT0gTlVMTCkKLQkJCXJlcyA9IE5VTEw7Ci0JCWVsc2UgewotCQkJcmVzID0gUHlPYmplY3RfQ2FsbChmdW5jLCBhcmdzLCBOVUxMKTsKLQkJCVB5X0RFQ1JFRihhcmdzKTsKLQkJfQotCQlQeV9ERUNSRUYoZnVuYyk7Ci0JCWlmIChyZXMgIT0gUHlfTm90SW1wbGVtZW50ZWQpIHsKLQkJCWlmIChyZXMgPT0gTlVMTCkKLQkJCQlyZXR1cm4gLTI7Ci0JCQljID0gUHlJbnRfQXNMb25nKHJlcyk7Ci0JCQlQeV9ERUNSRUYocmVzKTsKLQkJCWlmIChjID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCQkJcmV0dXJuIC0yOwotCQkJcmV0dXJuIChjIDwgMCkgPyAtMSA6IChjID4gMCkgPyAxIDogMDsKLQkJfQotCQlQeV9ERUNSRUYocmVzKTsKLQl9Ci0JcmV0dXJuIDI7CisgICAgZnVuYyA9IGxvb2t1cF9tZXRob2Qoc2VsZiwgIl9fY21wX18iLCAmY21wX3N0cik7CisgICAgaWYgKGZ1bmMgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9DbGVhcigpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgYXJncyA9IFB5VHVwbGVfUGFjaygxLCBvdGhlcik7CisgICAgICAgIGlmIChhcmdzID09IE5VTEwpCisgICAgICAgICAgICByZXMgPSBOVUxMOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHJlcyA9IFB5T2JqZWN0X0NhbGwoZnVuYywgYXJncywgTlVMTCk7CisgICAgICAgICAgICBQeV9ERUNSRUYoYXJncyk7CisgICAgICAgIH0KKyAgICAgICAgUHlfREVDUkVGKGZ1bmMpOworICAgICAgICBpZiAocmVzICE9IFB5X05vdEltcGxlbWVudGVkKSB7CisgICAgICAgICAgICBpZiAocmVzID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0yOworICAgICAgICAgICAgYyA9IFB5SW50X0FzTG9uZyhyZXMpOworICAgICAgICAgICAgUHlfREVDUkVGKHJlcyk7CisgICAgICAgICAgICBpZiAoYyA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgICAgIHJldHVybiAtMjsKKyAgICAgICAgICAgIHJldHVybiAoYyA8IDApID8gLTEgOiAoYyA+IDApID8gMSA6IDA7CisgICAgICAgIH0KKyAgICAgICAgUHlfREVDUkVGKHJlcyk7CisgICAgfQorICAgIHJldHVybiAyOwogfQogCiAvKiBUaGlzIHNsb3QgaXMgcHVibGlzaGVkIGZvciB0aGUgYmVuZWZpdCBvZiB0cnlfM3dheV9jb21wYXJlIGluIG9iamVjdC5jICovCiBpbnQKIF9QeU9iamVjdF9TbG90Q29tcGFyZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm90aGVyKQogewotCWludCBjOworICAgIGludCBjOwogCi0JaWYgKFB5X1RZUEUoc2VsZiktPnRwX2NvbXBhcmUgPT0gX1B5T2JqZWN0X1Nsb3RDb21wYXJlKSB7Ci0JCWMgPSBoYWxmX2NvbXBhcmUoc2VsZiwgb3RoZXIpOwotCQlpZiAoYyA8PSAxKQotCQkJcmV0dXJuIGM7Ci0JfQotCWlmIChQeV9UWVBFKG90aGVyKS0+dHBfY29tcGFyZSA9PSBfUHlPYmplY3RfU2xvdENvbXBhcmUpIHsKLQkJYyA9IGhhbGZfY29tcGFyZShvdGhlciwgc2VsZik7Ci0JCWlmIChjIDwgLTEpCi0JCQlyZXR1cm4gLTI7Ci0JCWlmIChjIDw9IDEpCi0JCQlyZXR1cm4gLWM7Ci0JfQotCXJldHVybiAodm9pZCAqKXNlbGYgPCAodm9pZCAqKW90aGVyID8gLTEgOgotCQkodm9pZCAqKXNlbGYgPiAodm9pZCAqKW90aGVyID8gMSA6IDA7CisgICAgaWYgKFB5X1RZUEUoc2VsZiktPnRwX2NvbXBhcmUgPT0gX1B5T2JqZWN0X1Nsb3RDb21wYXJlKSB7CisgICAgICAgIGMgPSBoYWxmX2NvbXBhcmUoc2VsZiwgb3RoZXIpOworICAgICAgICBpZiAoYyA8PSAxKQorICAgICAgICAgICAgcmV0dXJuIGM7CisgICAgfQorICAgIGlmIChQeV9UWVBFKG90aGVyKS0+dHBfY29tcGFyZSA9PSBfUHlPYmplY3RfU2xvdENvbXBhcmUpIHsKKyAgICAgICAgYyA9IGhhbGZfY29tcGFyZShvdGhlciwgc2VsZik7CisgICAgICAgIGlmIChjIDwgLTEpCisgICAgICAgICAgICByZXR1cm4gLTI7CisgICAgICAgIGlmIChjIDw9IDEpCisgICAgICAgICAgICByZXR1cm4gLWM7CisgICAgfQorICAgIHJldHVybiAodm9pZCAqKXNlbGYgPCAodm9pZCAqKW90aGVyID8gLTEgOgorICAgICAgICAodm9pZCAqKXNlbGYgPiAodm9pZCAqKW90aGVyID8gMSA6IDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzbG90X3RwX3JlcHIoUHlPYmplY3QgKnNlbGYpCiB7Ci0JUHlPYmplY3QgKmZ1bmMsICpyZXM7Ci0Jc3RhdGljIFB5T2JqZWN0ICpyZXByX3N0cjsKKyAgICBQeU9iamVjdCAqZnVuYywgKnJlczsKKyAgICBzdGF0aWMgUHlPYmplY3QgKnJlcHJfc3RyOwogCi0JZnVuYyA9IGxvb2t1cF9tZXRob2Qoc2VsZiwgIl9fcmVwcl9fIiwgJnJlcHJfc3RyKTsKLQlpZiAoZnVuYyAhPSBOVUxMKSB7Ci0JCXJlcyA9IFB5RXZhbF9DYWxsT2JqZWN0KGZ1bmMsIE5VTEwpOwotCQlQeV9ERUNSRUYoZnVuYyk7Ci0JCXJldHVybiByZXM7Ci0JfQotCVB5RXJyX0NsZWFyKCk7Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21Gb3JtYXQoIjwlcyBvYmplY3QgYXQgJXA+IiwKLQkJCQkgICBQeV9UWVBFKHNlbGYpLT50cF9uYW1lLCBzZWxmKTsKKyAgICBmdW5jID0gbG9va3VwX21ldGhvZChzZWxmLCAiX19yZXByX18iLCAmcmVwcl9zdHIpOworICAgIGlmIChmdW5jICE9IE5VTEwpIHsKKyAgICAgICAgcmVzID0gUHlFdmFsX0NhbGxPYmplY3QoZnVuYywgTlVMTCk7CisgICAgICAgIFB5X0RFQ1JFRihmdW5jKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbUZvcm1hdCgiPCVzIG9iamVjdCBhdCAlcD4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X1RZUEUoc2VsZiktPnRwX25hbWUsIHNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc2xvdF90cF9zdHIoUHlPYmplY3QgKnNlbGYpCiB7Ci0JUHlPYmplY3QgKmZ1bmMsICpyZXM7Ci0Jc3RhdGljIFB5T2JqZWN0ICpzdHJfc3RyOworICAgIFB5T2JqZWN0ICpmdW5jLCAqcmVzOworICAgIHN0YXRpYyBQeU9iamVjdCAqc3RyX3N0cjsKIAotCWZ1bmMgPSBsb29rdXBfbWV0aG9kKHNlbGYsICJfX3N0cl9fIiwgJnN0cl9zdHIpOwotCWlmIChmdW5jICE9IE5VTEwpIHsKLQkJcmVzID0gUHlFdmFsX0NhbGxPYmplY3QoZnVuYywgTlVMTCk7Ci0JCVB5X0RFQ1JFRihmdW5jKTsKLQkJcmV0dXJuIHJlczsKLQl9Ci0JZWxzZSB7Ci0JCVB5RXJyX0NsZWFyKCk7Ci0JCXJldHVybiBzbG90X3RwX3JlcHIoc2VsZik7Ci0JfQorICAgIGZ1bmMgPSBsb29rdXBfbWV0aG9kKHNlbGYsICJfX3N0cl9fIiwgJnN0cl9zdHIpOworICAgIGlmIChmdW5jICE9IE5VTEwpIHsKKyAgICAgICAgcmVzID0gUHlFdmFsX0NhbGxPYmplY3QoZnVuYywgTlVMTCk7CisgICAgICAgIFB5X0RFQ1JFRihmdW5jKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIHJldHVybiBzbG90X3RwX3JlcHIoc2VsZik7CisgICAgfQogfQogCiBzdGF0aWMgbG9uZwogc2xvdF90cF9oYXNoKFB5T2JqZWN0ICpzZWxmKQogewotCVB5T2JqZWN0ICpmdW5jOwotCXN0YXRpYyBQeU9iamVjdCAqaGFzaF9zdHIsICplcV9zdHIsICpjbXBfc3RyOwotCWxvbmcgaDsKKyAgICBQeU9iamVjdCAqZnVuYzsKKyAgICBzdGF0aWMgUHlPYmplY3QgKmhhc2hfc3RyLCAqZXFfc3RyLCAqY21wX3N0cjsKKyAgICBsb25nIGg7CiAKLQlmdW5jID0gbG9va3VwX21ldGhvZChzZWxmLCAiX19oYXNoX18iLCAmaGFzaF9zdHIpOworICAgIGZ1bmMgPSBsb29rdXBfbWV0aG9kKHNlbGYsICJfX2hhc2hfXyIsICZoYXNoX3N0cik7CiAKLQlpZiAoZnVuYyAhPSBOVUxMICYmIGZ1bmMgIT0gUHlfTm9uZSkgewotCQlQeU9iamVjdCAqcmVzID0gUHlFdmFsX0NhbGxPYmplY3QoZnVuYywgTlVMTCk7Ci0JCVB5X0RFQ1JFRihmdW5jKTsKLQkJaWYgKHJlcyA9PSBOVUxMKQotCQkJcmV0dXJuIC0xOwotCQlpZiAoUHlMb25nX0NoZWNrKHJlcykpCi0JCQloID0gUHlMb25nX1R5cGUudHBfaGFzaChyZXMpOwotCQllbHNlCi0JCQloID0gUHlJbnRfQXNMb25nKHJlcyk7Ci0JCVB5X0RFQ1JFRihyZXMpOwotCX0KLQllbHNlIHsKLQkJUHlfWERFQ1JFRihmdW5jKTsgLyogbWF5IGJlIE5vbmUgKi8KLQkJUHlFcnJfQ2xlYXIoKTsKLQkJZnVuYyA9IGxvb2t1cF9tZXRob2Qoc2VsZiwgIl9fZXFfXyIsICZlcV9zdHIpOwotCQlpZiAoZnVuYyA9PSBOVUxMKSB7Ci0JCQlQeUVycl9DbGVhcigpOwotCQkJZnVuYyA9IGxvb2t1cF9tZXRob2Qoc2VsZiwgIl9fY21wX18iLCAmY21wX3N0cik7Ci0JCX0KLQkJaWYgKGZ1bmMgIT0gTlVMTCkgewotCQkJUHlfREVDUkVGKGZ1bmMpOwotCQkJcmV0dXJuIFB5T2JqZWN0X0hhc2hOb3RJbXBsZW1lbnRlZChzZWxmKTsKLQkJfQotCQlQeUVycl9DbGVhcigpOwotCQloID0gX1B5X0hhc2hQb2ludGVyKCh2b2lkICopc2VsZik7Ci0JfQotCWlmIChoID09IC0xICYmICFQeUVycl9PY2N1cnJlZCgpKQotCQloID0gLTI7Ci0JcmV0dXJuIGg7CisgICAgaWYgKGZ1bmMgIT0gTlVMTCAmJiBmdW5jICE9IFB5X05vbmUpIHsKKyAgICAgICAgUHlPYmplY3QgKnJlcyA9IFB5RXZhbF9DYWxsT2JqZWN0KGZ1bmMsIE5VTEwpOworICAgICAgICBQeV9ERUNSRUYoZnVuYyk7CisgICAgICAgIGlmIChyZXMgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaWYgKFB5TG9uZ19DaGVjayhyZXMpKQorICAgICAgICAgICAgaCA9IFB5TG9uZ19UeXBlLnRwX2hhc2gocmVzKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaCA9IFB5SW50X0FzTG9uZyhyZXMpOworICAgICAgICBQeV9ERUNSRUYocmVzKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5X1hERUNSRUYoZnVuYyk7IC8qIG1heSBiZSBOb25lICovCisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIGZ1bmMgPSBsb29rdXBfbWV0aG9kKHNlbGYsICJfX2VxX18iLCAmZXFfc3RyKTsKKyAgICAgICAgaWYgKGZ1bmMgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgIGZ1bmMgPSBsb29rdXBfbWV0aG9kKHNlbGYsICJfX2NtcF9fIiwgJmNtcF9zdHIpOworICAgICAgICB9CisgICAgICAgIGlmIChmdW5jICE9IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihmdW5jKTsKKyAgICAgICAgICAgIHJldHVybiBQeU9iamVjdF9IYXNoTm90SW1wbGVtZW50ZWQoc2VsZik7CisgICAgICAgIH0KKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgaCA9IF9QeV9IYXNoUG9pbnRlcigodm9pZCAqKXNlbGYpOworICAgIH0KKyAgICBpZiAoaCA9PSAtMSAmJiAhUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgaCA9IC0yOworICAgIHJldHVybiBoOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc2xvdF90cF9jYWxsKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0Jc3RhdGljIFB5T2JqZWN0ICpjYWxsX3N0cjsKLQlQeU9iamVjdCAqbWV0aCA9IGxvb2t1cF9tZXRob2Qoc2VsZiwgIl9fY2FsbF9fIiwgJmNhbGxfc3RyKTsKLQlQeU9iamVjdCAqcmVzOworICAgIHN0YXRpYyBQeU9iamVjdCAqY2FsbF9zdHI7CisgICAgUHlPYmplY3QgKm1ldGggPSBsb29rdXBfbWV0aG9kKHNlbGYsICJfX2NhbGxfXyIsICZjYWxsX3N0cik7CisgICAgUHlPYmplY3QgKnJlczsKIAotCWlmIChtZXRoID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIGlmIChtZXRoID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JcmVzID0gUHlPYmplY3RfQ2FsbChtZXRoLCBhcmdzLCBrd2RzKTsKKyAgICByZXMgPSBQeU9iamVjdF9DYWxsKG1ldGgsIGFyZ3MsIGt3ZHMpOwogCi0JUHlfREVDUkVGKG1ldGgpOwotCXJldHVybiByZXM7CisgICAgUHlfREVDUkVGKG1ldGgpOworICAgIHJldHVybiByZXM7CiB9CiAKIC8qIFRoZXJlIGFyZSB0d28gc2xvdCBkaXNwYXRjaCBmdW5jdGlvbnMgZm9yIHRwX2dldGF0dHJvLgpAQCAtNTM5MCwxMDAgKzUzOTAsMTAwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogc2xvdF90cF9nZXRhdHRybyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm5hbWUpCiB7Ci0Jc3RhdGljIFB5T2JqZWN0ICpnZXRhdHRyaWJ1dGVfc3RyID0gTlVMTDsKLQlyZXR1cm4gY2FsbF9tZXRob2Qoc2VsZiwgIl9fZ2V0YXR0cmlidXRlX18iLCAmZ2V0YXR0cmlidXRlX3N0ciwKLQkJCSAgICIoTykiLCBuYW1lKTsKKyAgICBzdGF0aWMgUHlPYmplY3QgKmdldGF0dHJpYnV0ZV9zdHIgPSBOVUxMOworICAgIHJldHVybiBjYWxsX21ldGhvZChzZWxmLCAiX19nZXRhdHRyaWJ1dGVfXyIsICZnZXRhdHRyaWJ1dGVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAiKE8pIiwgbmFtZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjYWxsX2F0dHJpYnV0ZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmF0dHIsIFB5T2JqZWN0ICpuYW1lKQogewotCVB5T2JqZWN0ICpyZXMsICpkZXNjciA9IE5VTEw7Ci0JZGVzY3JnZXRmdW5jIGYgPSBQeV9UWVBFKGF0dHIpLT50cF9kZXNjcl9nZXQ7CisgICAgUHlPYmplY3QgKnJlcywgKmRlc2NyID0gTlVMTDsKKyAgICBkZXNjcmdldGZ1bmMgZiA9IFB5X1RZUEUoYXR0ciktPnRwX2Rlc2NyX2dldDsKIAotCWlmIChmICE9IE5VTEwpIHsKLQkJZGVzY3IgPSBmKGF0dHIsIHNlbGYsIChQeU9iamVjdCAqKShQeV9UWVBFKHNlbGYpKSk7Ci0JCWlmIChkZXNjciA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWVsc2UKLQkJCWF0dHIgPSBkZXNjcjsKLQl9Ci0JcmVzID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhhdHRyLCBuYW1lLCBOVUxMKTsKLQlQeV9YREVDUkVGKGRlc2NyKTsKLQlyZXR1cm4gcmVzOworICAgIGlmIChmICE9IE5VTEwpIHsKKyAgICAgICAgZGVzY3IgPSBmKGF0dHIsIHNlbGYsIChQeU9iamVjdCAqKShQeV9UWVBFKHNlbGYpKSk7CisgICAgICAgIGlmIChkZXNjciA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGF0dHIgPSBkZXNjcjsKKyAgICB9CisgICAgcmVzID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhhdHRyLCBuYW1lLCBOVUxMKTsKKyAgICBQeV9YREVDUkVGKGRlc2NyKTsKKyAgICByZXR1cm4gcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc2xvdF90cF9nZXRhdHRyX2hvb2soUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpuYW1lKQogewotCVB5VHlwZU9iamVjdCAqdHAgPSBQeV9UWVBFKHNlbGYpOwotCVB5T2JqZWN0ICpnZXRhdHRyLCAqZ2V0YXR0cmlidXRlLCAqcmVzOwotCXN0YXRpYyBQeU9iamVjdCAqZ2V0YXR0cmlidXRlX3N0ciA9IE5VTEw7Ci0Jc3RhdGljIFB5T2JqZWN0ICpnZXRhdHRyX3N0ciA9IE5VTEw7CisgICAgUHlUeXBlT2JqZWN0ICp0cCA9IFB5X1RZUEUoc2VsZik7CisgICAgUHlPYmplY3QgKmdldGF0dHIsICpnZXRhdHRyaWJ1dGUsICpyZXM7CisgICAgc3RhdGljIFB5T2JqZWN0ICpnZXRhdHRyaWJ1dGVfc3RyID0gTlVMTDsKKyAgICBzdGF0aWMgUHlPYmplY3QgKmdldGF0dHJfc3RyID0gTlVMTDsKIAotCWlmIChnZXRhdHRyX3N0ciA9PSBOVUxMKSB7Ci0JCWdldGF0dHJfc3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19nZXRhdHRyX18iKTsKLQkJaWYgKGdldGF0dHJfc3RyID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKGdldGF0dHJpYnV0ZV9zdHIgPT0gTlVMTCkgewotCQlnZXRhdHRyaWJ1dGVfc3RyID0KLQkJCVB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fZ2V0YXR0cmlidXRlX18iKTsKLQkJaWYgKGdldGF0dHJpYnV0ZV9zdHIgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCX0KLQkvKiBzcGVlZCBoYWNrOiB3ZSBjb3VsZCB1c2UgbG9va3VwX21heWJlLCBidXQgdGhhdCB3b3VsZCByZXNvbHZlIHRoZQotCSAgIG1ldGhvZCBmdWxseSBmb3IgZWFjaCBhdHRyaWJ1dGUgbG9va3VwIGZvciBjbGFzc2VzIHdpdGgKLQkgICBfX2dldGF0dHJfXywgZXZlbiB3aGVuIHRoZSBhdHRyaWJ1dGUgaXMgcHJlc2VudC4gU28gd2UgdXNlCi0JICAgX1B5VHlwZV9Mb29rdXAgYW5kIGNyZWF0ZSB0aGUgbWV0aG9kIG9ubHkgd2hlbiBuZWVkZWQsIHdpdGgKLQkgICBjYWxsX2F0dHJpYnV0ZS4gKi8KLQlnZXRhdHRyID0gX1B5VHlwZV9Mb29rdXAodHAsIGdldGF0dHJfc3RyKTsKLQlpZiAoZ2V0YXR0ciA9PSBOVUxMKSB7Ci0JCS8qIE5vIF9fZ2V0YXR0cl9fIGhvb2s6IHVzZSBhIHNpbXBsZXIgZGlzcGF0Y2hlciAqLwotCQl0cC0+dHBfZ2V0YXR0cm8gPSBzbG90X3RwX2dldGF0dHJvOwotCQlyZXR1cm4gc2xvdF90cF9nZXRhdHRybyhzZWxmLCBuYW1lKTsKLQl9Ci0JUHlfSU5DUkVGKGdldGF0dHIpOwotCS8qIHNwZWVkIGhhY2s6IHdlIGNvdWxkIHVzZSBsb29rdXBfbWF5YmUsIGJ1dCB0aGF0IHdvdWxkIHJlc29sdmUgdGhlCi0JICAgbWV0aG9kIGZ1bGx5IGZvciBlYWNoIGF0dHJpYnV0ZSBsb29rdXAgZm9yIGNsYXNzZXMgd2l0aAotCSAgIF9fZ2V0YXR0cl9fLCBldmVuIHdoZW4gc2VsZiBoYXMgdGhlIGRlZmF1bHQgX19nZXRhdHRyaWJ1dGVfXwotCSAgIG1ldGhvZC4gU28gd2UgdXNlIF9QeVR5cGVfTG9va3VwIGFuZCBjcmVhdGUgdGhlIG1ldGhvZCBvbmx5IHdoZW4KLQkgICBuZWVkZWQsIHdpdGggY2FsbF9hdHRyaWJ1dGUuICovCi0JZ2V0YXR0cmlidXRlID0gX1B5VHlwZV9Mb29rdXAodHAsIGdldGF0dHJpYnV0ZV9zdHIpOwotCWlmIChnZXRhdHRyaWJ1dGUgPT0gTlVMTCB8fAotCSAgICAoUHlfVFlQRShnZXRhdHRyaWJ1dGUpID09ICZQeVdyYXBwZXJEZXNjcl9UeXBlICYmCi0JICAgICAoKFB5V3JhcHBlckRlc2NyT2JqZWN0ICopZ2V0YXR0cmlidXRlKS0+ZF93cmFwcGVkID09Ci0JICAgICAodm9pZCAqKVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyKSkKLQkJcmVzID0gUHlPYmplY3RfR2VuZXJpY0dldEF0dHIoc2VsZiwgbmFtZSk7Ci0JZWxzZSB7Ci0JCVB5X0lOQ1JFRihnZXRhdHRyaWJ1dGUpOwotCQlyZXMgPSBjYWxsX2F0dHJpYnV0ZShzZWxmLCBnZXRhdHRyaWJ1dGUsIG5hbWUpOwotCQlQeV9ERUNSRUYoZ2V0YXR0cmlidXRlKTsKLQl9Ci0JaWYgKHJlcyA9PSBOVUxMICYmIFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfQXR0cmlidXRlRXJyb3IpKSB7Ci0JCVB5RXJyX0NsZWFyKCk7Ci0JCXJlcyA9IGNhbGxfYXR0cmlidXRlKHNlbGYsIGdldGF0dHIsIG5hbWUpOwotCX0KLQlQeV9ERUNSRUYoZ2V0YXR0cik7Ci0JcmV0dXJuIHJlczsKKyAgICBpZiAoZ2V0YXR0cl9zdHIgPT0gTlVMTCkgeworICAgICAgICBnZXRhdHRyX3N0ciA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fZ2V0YXR0cl9fIik7CisgICAgICAgIGlmIChnZXRhdHRyX3N0ciA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChnZXRhdHRyaWJ1dGVfc3RyID09IE5VTEwpIHsKKyAgICAgICAgZ2V0YXR0cmlidXRlX3N0ciA9CisgICAgICAgICAgICBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2dldGF0dHJpYnV0ZV9fIik7CisgICAgICAgIGlmIChnZXRhdHRyaWJ1dGVfc3RyID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgLyogc3BlZWQgaGFjazogd2UgY291bGQgdXNlIGxvb2t1cF9tYXliZSwgYnV0IHRoYXQgd291bGQgcmVzb2x2ZSB0aGUKKyAgICAgICBtZXRob2QgZnVsbHkgZm9yIGVhY2ggYXR0cmlidXRlIGxvb2t1cCBmb3IgY2xhc3NlcyB3aXRoCisgICAgICAgX19nZXRhdHRyX18sIGV2ZW4gd2hlbiB0aGUgYXR0cmlidXRlIGlzIHByZXNlbnQuIFNvIHdlIHVzZQorICAgICAgIF9QeVR5cGVfTG9va3VwIGFuZCBjcmVhdGUgdGhlIG1ldGhvZCBvbmx5IHdoZW4gbmVlZGVkLCB3aXRoCisgICAgICAgY2FsbF9hdHRyaWJ1dGUuICovCisgICAgZ2V0YXR0ciA9IF9QeVR5cGVfTG9va3VwKHRwLCBnZXRhdHRyX3N0cik7CisgICAgaWYgKGdldGF0dHIgPT0gTlVMTCkgeworICAgICAgICAvKiBObyBfX2dldGF0dHJfXyBob29rOiB1c2UgYSBzaW1wbGVyIGRpc3BhdGNoZXIgKi8KKyAgICAgICAgdHAtPnRwX2dldGF0dHJvID0gc2xvdF90cF9nZXRhdHRybzsKKyAgICAgICAgcmV0dXJuIHNsb3RfdHBfZ2V0YXR0cm8oc2VsZiwgbmFtZSk7CisgICAgfQorICAgIFB5X0lOQ1JFRihnZXRhdHRyKTsKKyAgICAvKiBzcGVlZCBoYWNrOiB3ZSBjb3VsZCB1c2UgbG9va3VwX21heWJlLCBidXQgdGhhdCB3b3VsZCByZXNvbHZlIHRoZQorICAgICAgIG1ldGhvZCBmdWxseSBmb3IgZWFjaCBhdHRyaWJ1dGUgbG9va3VwIGZvciBjbGFzc2VzIHdpdGgKKyAgICAgICBfX2dldGF0dHJfXywgZXZlbiB3aGVuIHNlbGYgaGFzIHRoZSBkZWZhdWx0IF9fZ2V0YXR0cmlidXRlX18KKyAgICAgICBtZXRob2QuIFNvIHdlIHVzZSBfUHlUeXBlX0xvb2t1cCBhbmQgY3JlYXRlIHRoZSBtZXRob2Qgb25seSB3aGVuCisgICAgICAgbmVlZGVkLCB3aXRoIGNhbGxfYXR0cmlidXRlLiAqLworICAgIGdldGF0dHJpYnV0ZSA9IF9QeVR5cGVfTG9va3VwKHRwLCBnZXRhdHRyaWJ1dGVfc3RyKTsKKyAgICBpZiAoZ2V0YXR0cmlidXRlID09IE5VTEwgfHwKKyAgICAgICAgKFB5X1RZUEUoZ2V0YXR0cmlidXRlKSA9PSAmUHlXcmFwcGVyRGVzY3JfVHlwZSAmJgorICAgICAgICAgKChQeVdyYXBwZXJEZXNjck9iamVjdCAqKWdldGF0dHJpYnV0ZSktPmRfd3JhcHBlZCA9PQorICAgICAgICAgKHZvaWQgKilQeU9iamVjdF9HZW5lcmljR2V0QXR0cikpCisgICAgICAgIHJlcyA9IFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyKHNlbGYsIG5hbWUpOworICAgIGVsc2UgeworICAgICAgICBQeV9JTkNSRUYoZ2V0YXR0cmlidXRlKTsKKyAgICAgICAgcmVzID0gY2FsbF9hdHRyaWJ1dGUoc2VsZiwgZ2V0YXR0cmlidXRlLCBuYW1lKTsKKyAgICAgICAgUHlfREVDUkVGKGdldGF0dHJpYnV0ZSk7CisgICAgfQorICAgIGlmIChyZXMgPT0gTlVMTCAmJiBQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkgeworICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICByZXMgPSBjYWxsX2F0dHJpYnV0ZShzZWxmLCBnZXRhdHRyLCBuYW1lKTsKKyAgICB9CisgICAgUHlfREVDUkVGKGdldGF0dHIpOworICAgIHJldHVybiByZXM7CiB9CiAKIHN0YXRpYyBpbnQKIHNsb3RfdHBfc2V0YXR0cm8oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpuYW1lLCBQeU9iamVjdCAqdmFsdWUpCiB7Ci0JUHlPYmplY3QgKnJlczsKLQlzdGF0aWMgUHlPYmplY3QgKmRlbGF0dHJfc3RyLCAqc2V0YXR0cl9zdHI7CisgICAgUHlPYmplY3QgKnJlczsKKyAgICBzdGF0aWMgUHlPYmplY3QgKmRlbGF0dHJfc3RyLCAqc2V0YXR0cl9zdHI7CiAKLQlpZiAodmFsdWUgPT0gTlVMTCkKLQkJcmVzID0gY2FsbF9tZXRob2Qoc2VsZiwgIl9fZGVsYXR0cl9fIiwgJmRlbGF0dHJfc3RyLAotCQkJCSAgIihPKSIsIG5hbWUpOwotCWVsc2UKLQkJcmVzID0gY2FsbF9tZXRob2Qoc2VsZiwgIl9fc2V0YXR0cl9fIiwgJnNldGF0dHJfc3RyLAotCQkJCSAgIihPTykiLCBuYW1lLCB2YWx1ZSk7Ci0JaWYgKHJlcyA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0JUHlfREVDUkVGKHJlcyk7Ci0JcmV0dXJuIDA7CisgICAgaWYgKHZhbHVlID09IE5VTEwpCisgICAgICAgIHJlcyA9IGNhbGxfbWV0aG9kKHNlbGYsICJfX2RlbGF0dHJfXyIsICZkZWxhdHRyX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIihPKSIsIG5hbWUpOworICAgIGVsc2UKKyAgICAgICAgcmVzID0gY2FsbF9tZXRob2Qoc2VsZiwgIl9fc2V0YXR0cl9fIiwgJnNldGF0dHJfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiKE9PKSIsIG5hbWUsIHZhbHVlKTsKKyAgICBpZiAocmVzID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBQeV9ERUNSRUYocmVzKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGNoYXIgKm5hbWVfb3BbXSA9IHsKQEAgLTU0OTgsMjQ0ICs1NDk4LDI0NCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGhhbGZfcmljaGNvbXBhcmUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpvdGhlciwgaW50IG9wKQogewotCVB5T2JqZWN0ICpmdW5jLCAqYXJncywgKnJlczsKLQlzdGF0aWMgUHlPYmplY3QgKm9wX3N0cls2XTsKKyAgICBQeU9iamVjdCAqZnVuYywgKmFyZ3MsICpyZXM7CisgICAgc3RhdGljIFB5T2JqZWN0ICpvcF9zdHJbNl07CiAKLQlmdW5jID0gbG9va3VwX21ldGhvZChzZWxmLCBuYW1lX29wW29wXSwgJm9wX3N0cltvcF0pOwotCWlmIChmdW5jID09IE5VTEwpIHsKLQkJUHlFcnJfQ2xlYXIoKTsKLQkJUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKLQkJcmV0dXJuIFB5X05vdEltcGxlbWVudGVkOwotCX0KLQlhcmdzID0gUHlUdXBsZV9QYWNrKDEsIG90aGVyKTsKLQlpZiAoYXJncyA9PSBOVUxMKQotCQlyZXMgPSBOVUxMOwotCWVsc2UgewotCQlyZXMgPSBQeU9iamVjdF9DYWxsKGZ1bmMsIGFyZ3MsIE5VTEwpOwotCQlQeV9ERUNSRUYoYXJncyk7Ci0JfQotCVB5X0RFQ1JFRihmdW5jKTsKLQlyZXR1cm4gcmVzOworICAgIGZ1bmMgPSBsb29rdXBfbWV0aG9kKHNlbGYsIG5hbWVfb3Bbb3BdLCAmb3Bfc3RyW29wXSk7CisgICAgaWYgKGZ1bmMgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOworICAgICAgICByZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7CisgICAgfQorICAgIGFyZ3MgPSBQeVR1cGxlX1BhY2soMSwgb3RoZXIpOworICAgIGlmIChhcmdzID09IE5VTEwpCisgICAgICAgIHJlcyA9IE5VTEw7CisgICAgZWxzZSB7CisgICAgICAgIHJlcyA9IFB5T2JqZWN0X0NhbGwoZnVuYywgYXJncywgTlVMTCk7CisgICAgICAgIFB5X0RFQ1JFRihhcmdzKTsKKyAgICB9CisgICAgUHlfREVDUkVGKGZ1bmMpOworICAgIHJldHVybiByZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzbG90X3RwX3JpY2hjb21wYXJlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqb3RoZXIsIGludCBvcCkKIHsKLQlQeU9iamVjdCAqcmVzOworICAgIFB5T2JqZWN0ICpyZXM7CiAKLQlpZiAoUHlfVFlQRShzZWxmKS0+dHBfcmljaGNvbXBhcmUgPT0gc2xvdF90cF9yaWNoY29tcGFyZSkgewotCQlyZXMgPSBoYWxmX3JpY2hjb21wYXJlKHNlbGYsIG90aGVyLCBvcCk7Ci0JCWlmIChyZXMgIT0gUHlfTm90SW1wbGVtZW50ZWQpCi0JCQlyZXR1cm4gcmVzOwotCQlQeV9ERUNSRUYocmVzKTsKLQl9Ci0JaWYgKFB5X1RZUEUob3RoZXIpLT50cF9yaWNoY29tcGFyZSA9PSBzbG90X3RwX3JpY2hjb21wYXJlKSB7Ci0JCXJlcyA9IGhhbGZfcmljaGNvbXBhcmUob3RoZXIsIHNlbGYsIF9QeV9Td2FwcGVkT3Bbb3BdKTsKLQkJaWYgKHJlcyAhPSBQeV9Ob3RJbXBsZW1lbnRlZCkgewotCQkJcmV0dXJuIHJlczsKLQkJfQotCQlQeV9ERUNSRUYocmVzKTsKLQl9Ci0JUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKLQlyZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7CisgICAgaWYgKFB5X1RZUEUoc2VsZiktPnRwX3JpY2hjb21wYXJlID09IHNsb3RfdHBfcmljaGNvbXBhcmUpIHsKKyAgICAgICAgcmVzID0gaGFsZl9yaWNoY29tcGFyZShzZWxmLCBvdGhlciwgb3ApOworICAgICAgICBpZiAocmVzICE9IFB5X05vdEltcGxlbWVudGVkKQorICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgUHlfREVDUkVGKHJlcyk7CisgICAgfQorICAgIGlmIChQeV9UWVBFKG90aGVyKS0+dHBfcmljaGNvbXBhcmUgPT0gc2xvdF90cF9yaWNoY29tcGFyZSkgeworICAgICAgICByZXMgPSBoYWxmX3JpY2hjb21wYXJlKG90aGVyLCBzZWxmLCBfUHlfU3dhcHBlZE9wW29wXSk7CisgICAgICAgIGlmIChyZXMgIT0gUHlfTm90SW1wbGVtZW50ZWQpIHsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICAgICAgUHlfREVDUkVGKHJlcyk7CisgICAgfQorICAgIFB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7CisgICAgcmV0dXJuIFB5X05vdEltcGxlbWVudGVkOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc2xvdF90cF9pdGVyKFB5T2JqZWN0ICpzZWxmKQogewotCVB5T2JqZWN0ICpmdW5jLCAqcmVzOwotCXN0YXRpYyBQeU9iamVjdCAqaXRlcl9zdHIsICpnZXRpdGVtX3N0cjsKKyAgICBQeU9iamVjdCAqZnVuYywgKnJlczsKKyAgICBzdGF0aWMgUHlPYmplY3QgKml0ZXJfc3RyLCAqZ2V0aXRlbV9zdHI7CiAKLQlmdW5jID0gbG9va3VwX21ldGhvZChzZWxmLCAiX19pdGVyX18iLCAmaXRlcl9zdHIpOwotCWlmIChmdW5jICE9IE5VTEwpIHsKLQkJUHlPYmplY3QgKmFyZ3M7Ci0JCWFyZ3MgPSByZXMgPSBQeVR1cGxlX05ldygwKTsKLQkJaWYgKGFyZ3MgIT0gTlVMTCkgewotCQkJcmVzID0gUHlPYmplY3RfQ2FsbChmdW5jLCBhcmdzLCBOVUxMKTsKLQkJCVB5X0RFQ1JFRihhcmdzKTsKLQkJfQotCQlQeV9ERUNSRUYoZnVuYyk7Ci0JCXJldHVybiByZXM7Ci0JfQotCVB5RXJyX0NsZWFyKCk7Ci0JZnVuYyA9IGxvb2t1cF9tZXRob2Qoc2VsZiwgIl9fZ2V0aXRlbV9fIiwgJmdldGl0ZW1fc3RyKTsKLQlpZiAoZnVuYyA9PSBOVUxMKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgICInJS4yMDBzJyBvYmplY3QgaXMgbm90IGl0ZXJhYmxlIiwKLQkJCSAgICAgUHlfVFlQRShzZWxmKS0+dHBfbmFtZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlQeV9ERUNSRUYoZnVuYyk7Ci0JcmV0dXJuIFB5U2VxSXRlcl9OZXcoc2VsZik7CisgICAgZnVuYyA9IGxvb2t1cF9tZXRob2Qoc2VsZiwgIl9faXRlcl9fIiwgJml0ZXJfc3RyKTsKKyAgICBpZiAoZnVuYyAhPSBOVUxMKSB7CisgICAgICAgIFB5T2JqZWN0ICphcmdzOworICAgICAgICBhcmdzID0gcmVzID0gUHlUdXBsZV9OZXcoMCk7CisgICAgICAgIGlmIChhcmdzICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHJlcyA9IFB5T2JqZWN0X0NhbGwoZnVuYywgYXJncywgTlVMTCk7CisgICAgICAgICAgICBQeV9ERUNSRUYoYXJncyk7CisgICAgICAgIH0KKyAgICAgICAgUHlfREVDUkVGKGZ1bmMpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKyAgICBQeUVycl9DbGVhcigpOworICAgIGZ1bmMgPSBsb29rdXBfbWV0aG9kKHNlbGYsICJfX2dldGl0ZW1fXyIsICZnZXRpdGVtX3N0cik7CisgICAgaWYgKGZ1bmMgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIiclLjIwMHMnIG9iamVjdCBpcyBub3QgaXRlcmFibGUiLAorICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRShzZWxmKS0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeV9ERUNSRUYoZnVuYyk7CisgICAgcmV0dXJuIFB5U2VxSXRlcl9OZXcoc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzbG90X3RwX2l0ZXJuZXh0KFB5T2JqZWN0ICpzZWxmKQogewotCXN0YXRpYyBQeU9iamVjdCAqbmV4dF9zdHI7Ci0JcmV0dXJuIGNhbGxfbWV0aG9kKHNlbGYsICJuZXh0IiwgJm5leHRfc3RyLCAiKCkiKTsKKyAgICBzdGF0aWMgUHlPYmplY3QgKm5leHRfc3RyOworICAgIHJldHVybiBjYWxsX21ldGhvZChzZWxmLCAibmV4dCIsICZuZXh0X3N0ciwgIigpIik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzbG90X3RwX2Rlc2NyX2dldChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm9iaiwgUHlPYmplY3QgKnR5cGUpCiB7Ci0JUHlUeXBlT2JqZWN0ICp0cCA9IFB5X1RZUEUoc2VsZik7Ci0JUHlPYmplY3QgKmdldDsKLQlzdGF0aWMgUHlPYmplY3QgKmdldF9zdHIgPSBOVUxMOworICAgIFB5VHlwZU9iamVjdCAqdHAgPSBQeV9UWVBFKHNlbGYpOworICAgIFB5T2JqZWN0ICpnZXQ7CisgICAgc3RhdGljIFB5T2JqZWN0ICpnZXRfc3RyID0gTlVMTDsKIAotCWlmIChnZXRfc3RyID09IE5VTEwpIHsKLQkJZ2V0X3N0ciA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fZ2V0X18iKTsKLQkJaWYgKGdldF9zdHIgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCX0KLQlnZXQgPSBfUHlUeXBlX0xvb2t1cCh0cCwgZ2V0X3N0cik7Ci0JaWYgKGdldCA9PSBOVUxMKSB7Ci0JCS8qIEF2b2lkIGZ1cnRoZXIgc2xvd2Rvd25zICovCi0JCWlmICh0cC0+dHBfZGVzY3JfZ2V0ID09IHNsb3RfdHBfZGVzY3JfZ2V0KQotCQkJdHAtPnRwX2Rlc2NyX2dldCA9IE5VTEw7Ci0JCVB5X0lOQ1JFRihzZWxmKTsKLQkJcmV0dXJuIHNlbGY7Ci0JfQotCWlmIChvYmogPT0gTlVMTCkKLQkJb2JqID0gUHlfTm9uZTsKLQlpZiAodHlwZSA9PSBOVUxMKQotCQl0eXBlID0gUHlfTm9uZTsKLQlyZXR1cm4gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhnZXQsIHNlbGYsIG9iaiwgdHlwZSwgTlVMTCk7CisgICAgaWYgKGdldF9zdHIgPT0gTlVMTCkgeworICAgICAgICBnZXRfc3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19nZXRfXyIpOworICAgICAgICBpZiAoZ2V0X3N0ciA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGdldCA9IF9QeVR5cGVfTG9va3VwKHRwLCBnZXRfc3RyKTsKKyAgICBpZiAoZ2V0ID09IE5VTEwpIHsKKyAgICAgICAgLyogQXZvaWQgZnVydGhlciBzbG93ZG93bnMgKi8KKyAgICAgICAgaWYgKHRwLT50cF9kZXNjcl9nZXQgPT0gc2xvdF90cF9kZXNjcl9nZXQpCisgICAgICAgICAgICB0cC0+dHBfZGVzY3JfZ2V0ID0gTlVMTDsKKyAgICAgICAgUHlfSU5DUkVGKHNlbGYpOworICAgICAgICByZXR1cm4gc2VsZjsKKyAgICB9CisgICAgaWYgKG9iaiA9PSBOVUxMKQorICAgICAgICBvYmogPSBQeV9Ob25lOworICAgIGlmICh0eXBlID09IE5VTEwpCisgICAgICAgIHR5cGUgPSBQeV9Ob25lOworICAgIHJldHVybiBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGdldCwgc2VsZiwgb2JqLCB0eXBlLCBOVUxMKTsKIH0KIAogc3RhdGljIGludAogc2xvdF90cF9kZXNjcl9zZXQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp0YXJnZXQsIFB5T2JqZWN0ICp2YWx1ZSkKIHsKLQlQeU9iamVjdCAqcmVzOwotCXN0YXRpYyBQeU9iamVjdCAqZGVsX3N0ciwgKnNldF9zdHI7CisgICAgUHlPYmplY3QgKnJlczsKKyAgICBzdGF0aWMgUHlPYmplY3QgKmRlbF9zdHIsICpzZXRfc3RyOwogCi0JaWYgKHZhbHVlID09IE5VTEwpCi0JCXJlcyA9IGNhbGxfbWV0aG9kKHNlbGYsICJfX2RlbGV0ZV9fIiwgJmRlbF9zdHIsCi0JCQkJICAiKE8pIiwgdGFyZ2V0KTsKLQllbHNlCi0JCXJlcyA9IGNhbGxfbWV0aG9kKHNlbGYsICJfX3NldF9fIiwgJnNldF9zdHIsCi0JCQkJICAiKE9PKSIsIHRhcmdldCwgdmFsdWUpOwotCWlmIChyZXMgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCVB5X0RFQ1JFRihyZXMpOwotCXJldHVybiAwOworICAgIGlmICh2YWx1ZSA9PSBOVUxMKQorICAgICAgICByZXMgPSBjYWxsX21ldGhvZChzZWxmLCAiX19kZWxldGVfXyIsICZkZWxfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiKE8pIiwgdGFyZ2V0KTsKKyAgICBlbHNlCisgICAgICAgIHJlcyA9IGNhbGxfbWV0aG9kKHNlbGYsICJfX3NldF9fIiwgJnNldF9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICIoT08pIiwgdGFyZ2V0LCB2YWx1ZSk7CisgICAgaWYgKHJlcyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAgUHlfREVDUkVGKHJlcyk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIHNsb3RfdHBfaW5pdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCXN0YXRpYyBQeU9iamVjdCAqaW5pdF9zdHI7Ci0JUHlPYmplY3QgKm1ldGggPSBsb29rdXBfbWV0aG9kKHNlbGYsICJfX2luaXRfXyIsICZpbml0X3N0cik7Ci0JUHlPYmplY3QgKnJlczsKKyAgICBzdGF0aWMgUHlPYmplY3QgKmluaXRfc3RyOworICAgIFB5T2JqZWN0ICptZXRoID0gbG9va3VwX21ldGhvZChzZWxmLCAiX19pbml0X18iLCAmaW5pdF9zdHIpOworICAgIFB5T2JqZWN0ICpyZXM7CiAKLQlpZiAobWV0aCA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0JcmVzID0gUHlPYmplY3RfQ2FsbChtZXRoLCBhcmdzLCBrd2RzKTsKLQlQeV9ERUNSRUYobWV0aCk7Ci0JaWYgKHJlcyA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0JaWYgKHJlcyAhPSBQeV9Ob25lKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgICJfX2luaXRfXygpIHNob3VsZCByZXR1cm4gTm9uZSwgbm90ICclLjIwMHMnIiwKLQkJCSAgICAgUHlfVFlQRShyZXMpLT50cF9uYW1lKTsKLQkJUHlfREVDUkVGKHJlcyk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JUHlfREVDUkVGKHJlcyk7Ci0JcmV0dXJuIDA7CisgICAgaWYgKG1ldGggPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHJlcyA9IFB5T2JqZWN0X0NhbGwobWV0aCwgYXJncywga3dkcyk7CisgICAgUHlfREVDUkVGKG1ldGgpOworICAgIGlmIChyZXMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmIChyZXMgIT0gUHlfTm9uZSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIl9faW5pdF9fKCkgc2hvdWxkIHJldHVybiBOb25lLCBub3QgJyUuMjAwcyciLAorICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRShyZXMpLT50cF9uYW1lKTsKKyAgICAgICAgUHlfREVDUkVGKHJlcyk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgUHlfREVDUkVGKHJlcyk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzbG90X3RwX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlzdGF0aWMgUHlPYmplY3QgKm5ld19zdHI7Ci0JUHlPYmplY3QgKmZ1bmM7Ci0JUHlPYmplY3QgKm5ld2FyZ3MsICp4OwotCVB5X3NzaXplX3QgaSwgbjsKKyAgICBzdGF0aWMgUHlPYmplY3QgKm5ld19zdHI7CisgICAgUHlPYmplY3QgKmZ1bmM7CisgICAgUHlPYmplY3QgKm5ld2FyZ3MsICp4OworICAgIFB5X3NzaXplX3QgaSwgbjsKIAotCWlmIChuZXdfc3RyID09IE5VTEwpIHsKLQkJbmV3X3N0ciA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fbmV3X18iKTsKLQkJaWYgKG5ld19zdHIgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCX0KLQlmdW5jID0gUHlPYmplY3RfR2V0QXR0cigoUHlPYmplY3QgKil0eXBlLCBuZXdfc3RyKTsKLQlpZiAoZnVuYyA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlhc3NlcnQoUHlUdXBsZV9DaGVjayhhcmdzKSk7Ci0JbiA9IFB5VHVwbGVfR0VUX1NJWkUoYXJncyk7Ci0JbmV3YXJncyA9IFB5VHVwbGVfTmV3KG4rMSk7Ci0JaWYgKG5ld2FyZ3MgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JUHlfSU5DUkVGKHR5cGUpOwotCVB5VHVwbGVfU0VUX0lURU0obmV3YXJncywgMCwgKFB5T2JqZWN0ICopdHlwZSk7Ci0JZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQl4ID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCBpKTsKLQkJUHlfSU5DUkVGKHgpOwotCQlQeVR1cGxlX1NFVF9JVEVNKG5ld2FyZ3MsIGkrMSwgeCk7Ci0JfQotCXggPSBQeU9iamVjdF9DYWxsKGZ1bmMsIG5ld2FyZ3MsIGt3ZHMpOwotCVB5X0RFQ1JFRihuZXdhcmdzKTsKLQlQeV9ERUNSRUYoZnVuYyk7Ci0JcmV0dXJuIHg7CisgICAgaWYgKG5ld19zdHIgPT0gTlVMTCkgeworICAgICAgICBuZXdfc3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19uZXdfXyIpOworICAgICAgICBpZiAobmV3X3N0ciA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGZ1bmMgPSBQeU9iamVjdF9HZXRBdHRyKChQeU9iamVjdCAqKXR5cGUsIG5ld19zdHIpOworICAgIGlmIChmdW5jID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGFzc2VydChQeVR1cGxlX0NoZWNrKGFyZ3MpKTsKKyAgICBuID0gUHlUdXBsZV9HRVRfU0laRShhcmdzKTsKKyAgICBuZXdhcmdzID0gUHlUdXBsZV9OZXcobisxKTsKKyAgICBpZiAobmV3YXJncyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQeV9JTkNSRUYodHlwZSk7CisgICAgUHlUdXBsZV9TRVRfSVRFTShuZXdhcmdzLCAwLCAoUHlPYmplY3QgKil0eXBlKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIHggPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIGkpOworICAgICAgICBQeV9JTkNSRUYoeCk7CisgICAgICAgIFB5VHVwbGVfU0VUX0lURU0obmV3YXJncywgaSsxLCB4KTsKKyAgICB9CisgICAgeCA9IFB5T2JqZWN0X0NhbGwoZnVuYywgbmV3YXJncywga3dkcyk7CisgICAgUHlfREVDUkVGKG5ld2FyZ3MpOworICAgIFB5X0RFQ1JFRihmdW5jKTsKKyAgICByZXR1cm4geDsKIH0KIAogc3RhdGljIHZvaWQKIHNsb3RfdHBfZGVsKFB5T2JqZWN0ICpzZWxmKQogewotCXN0YXRpYyBQeU9iamVjdCAqZGVsX3N0ciA9IE5VTEw7Ci0JUHlPYmplY3QgKmRlbCwgKnJlczsKLQlQeU9iamVjdCAqZXJyb3JfdHlwZSwgKmVycm9yX3ZhbHVlLCAqZXJyb3JfdHJhY2ViYWNrOworICAgIHN0YXRpYyBQeU9iamVjdCAqZGVsX3N0ciA9IE5VTEw7CisgICAgUHlPYmplY3QgKmRlbCwgKnJlczsKKyAgICBQeU9iamVjdCAqZXJyb3JfdHlwZSwgKmVycm9yX3ZhbHVlLCAqZXJyb3JfdHJhY2ViYWNrOwogCi0JLyogVGVtcG9yYXJpbHkgcmVzdXJyZWN0IHRoZSBvYmplY3QuICovCi0JYXNzZXJ0KHNlbGYtPm9iX3JlZmNudCA9PSAwKTsKLQlzZWxmLT5vYl9yZWZjbnQgPSAxOworICAgIC8qIFRlbXBvcmFyaWx5IHJlc3VycmVjdCB0aGUgb2JqZWN0LiAqLworICAgIGFzc2VydChzZWxmLT5vYl9yZWZjbnQgPT0gMCk7CisgICAgc2VsZi0+b2JfcmVmY250ID0gMTsKIAotCS8qIFNhdmUgdGhlIGN1cnJlbnQgZXhjZXB0aW9uLCBpZiBhbnkuICovCi0JUHlFcnJfRmV0Y2goJmVycm9yX3R5cGUsICZlcnJvcl92YWx1ZSwgJmVycm9yX3RyYWNlYmFjayk7CisgICAgLyogU2F2ZSB0aGUgY3VycmVudCBleGNlcHRpb24sIGlmIGFueS4gKi8KKyAgICBQeUVycl9GZXRjaCgmZXJyb3JfdHlwZSwgJmVycm9yX3ZhbHVlLCAmZXJyb3JfdHJhY2ViYWNrKTsKIAotCS8qIEV4ZWN1dGUgX19kZWxfXyBtZXRob2QsIGlmIGFueS4gKi8KLQlkZWwgPSBsb29rdXBfbWF5YmUoc2VsZiwgIl9fZGVsX18iLCAmZGVsX3N0cik7Ci0JaWYgKGRlbCAhPSBOVUxMKSB7Ci0JCXJlcyA9IFB5RXZhbF9DYWxsT2JqZWN0KGRlbCwgTlVMTCk7Ci0JCWlmIChyZXMgPT0gTlVMTCkKLQkJCVB5RXJyX1dyaXRlVW5yYWlzYWJsZShkZWwpOwotCQllbHNlCi0JCQlQeV9ERUNSRUYocmVzKTsKLQkJUHlfREVDUkVGKGRlbCk7Ci0JfQorICAgIC8qIEV4ZWN1dGUgX19kZWxfXyBtZXRob2QsIGlmIGFueS4gKi8KKyAgICBkZWwgPSBsb29rdXBfbWF5YmUoc2VsZiwgIl9fZGVsX18iLCAmZGVsX3N0cik7CisgICAgaWYgKGRlbCAhPSBOVUxMKSB7CisgICAgICAgIHJlcyA9IFB5RXZhbF9DYWxsT2JqZWN0KGRlbCwgTlVMTCk7CisgICAgICAgIGlmIChyZXMgPT0gTlVMTCkKKyAgICAgICAgICAgIFB5RXJyX1dyaXRlVW5yYWlzYWJsZShkZWwpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBQeV9ERUNSRUYocmVzKTsKKyAgICAgICAgUHlfREVDUkVGKGRlbCk7CisgICAgfQogCi0JLyogUmVzdG9yZSB0aGUgc2F2ZWQgZXhjZXB0aW9uLiAqLwotCVB5RXJyX1Jlc3RvcmUoZXJyb3JfdHlwZSwgZXJyb3JfdmFsdWUsIGVycm9yX3RyYWNlYmFjayk7CisgICAgLyogUmVzdG9yZSB0aGUgc2F2ZWQgZXhjZXB0aW9uLiAqLworICAgIFB5RXJyX1Jlc3RvcmUoZXJyb3JfdHlwZSwgZXJyb3JfdmFsdWUsIGVycm9yX3RyYWNlYmFjayk7CiAKLQkvKiBVbmRvIHRoZSB0ZW1wb3JhcnkgcmVzdXJyZWN0aW9uOyBjYW4ndCB1c2UgREVDUkVGIGhlcmUsIGl0IHdvdWxkCi0JICogY2F1c2UgYSByZWN1cnNpdmUgY2FsbC4KLQkgKi8KLQlhc3NlcnQoc2VsZi0+b2JfcmVmY250ID4gMCk7Ci0JaWYgKC0tc2VsZi0+b2JfcmVmY250ID09IDApCi0JCXJldHVybjsJLyogdGhpcyBpcyB0aGUgbm9ybWFsIHBhdGggb3V0ICovCisgICAgLyogVW5kbyB0aGUgdGVtcG9yYXJ5IHJlc3VycmVjdGlvbjsgY2FuJ3QgdXNlIERFQ1JFRiBoZXJlLCBpdCB3b3VsZAorICAgICAqIGNhdXNlIGEgcmVjdXJzaXZlIGNhbGwuCisgICAgICovCisgICAgYXNzZXJ0KHNlbGYtPm9iX3JlZmNudCA+IDApOworICAgIGlmICgtLXNlbGYtPm9iX3JlZmNudCA9PSAwKQorICAgICAgICByZXR1cm47ICAgICAgICAgLyogdGhpcyBpcyB0aGUgbm9ybWFsIHBhdGggb3V0ICovCiAKLQkvKiBfX2RlbF9fIHJlc3VycmVjdGVkIGl0ISAgTWFrZSBpdCBsb29rIGxpa2UgdGhlIG9yaWdpbmFsIFB5X0RFQ1JFRgotCSAqIG5ldmVyIGhhcHBlbmVkLgotCSAqLwotCXsKLQkJUHlfc3NpemVfdCByZWZjbnQgPSBzZWxmLT5vYl9yZWZjbnQ7Ci0JCV9QeV9OZXdSZWZlcmVuY2Uoc2VsZik7Ci0JCXNlbGYtPm9iX3JlZmNudCA9IHJlZmNudDsKLQl9Ci0JYXNzZXJ0KCFQeVR5cGVfSVNfR0MoUHlfVFlQRShzZWxmKSkgfHwKLQkgICAgICAgX1B5X0FTX0dDKHNlbGYpLT5nYy5nY19yZWZzICE9IF9QeUdDX1JFRlNfVU5UUkFDS0VEKTsKLQkvKiBJZiBQeV9SRUZfREVCVUcsIF9QeV9OZXdSZWZlcmVuY2UgYnVtcGVkIF9QeV9SZWZUb3RhbCwgc28KLQkgKiB3ZSBuZWVkIHRvIHVuZG8gdGhhdC4gKi8KLQlfUHlfREVDX1JFRlRPVEFMOwotCS8qIElmIFB5X1RSQUNFX1JFRlMsIF9QeV9OZXdSZWZlcmVuY2UgcmUtYWRkZWQgc2VsZiB0byB0aGUgb2JqZWN0Ci0JICogY2hhaW4sIHNvIG5vIG1vcmUgdG8gZG8gdGhlcmUuCi0JICogSWYgQ09VTlRfQUxMT0NTLCB0aGUgb3JpZ2luYWwgZGVjcmVmIGJ1bXBlZCB0cF9mcmVlcywgYW5kCi0JICogX1B5X05ld1JlZmVyZW5jZSBidW1wZWQgdHBfYWxsb2NzOiAgYm90aCBvZiB0aG9zZSBuZWVkIHRvIGJlCi0JICogdW5kb25lLgotCSAqLworICAgIC8qIF9fZGVsX18gcmVzdXJyZWN0ZWQgaXQhICBNYWtlIGl0IGxvb2sgbGlrZSB0aGUgb3JpZ2luYWwgUHlfREVDUkVGCisgICAgICogbmV2ZXIgaGFwcGVuZWQuCisgICAgICovCisgICAgeworICAgICAgICBQeV9zc2l6ZV90IHJlZmNudCA9IHNlbGYtPm9iX3JlZmNudDsKKyAgICAgICAgX1B5X05ld1JlZmVyZW5jZShzZWxmKTsKKyAgICAgICAgc2VsZi0+b2JfcmVmY250ID0gcmVmY250OworICAgIH0KKyAgICBhc3NlcnQoIVB5VHlwZV9JU19HQyhQeV9UWVBFKHNlbGYpKSB8fAorICAgICAgICAgICBfUHlfQVNfR0Moc2VsZiktPmdjLmdjX3JlZnMgIT0gX1B5R0NfUkVGU19VTlRSQUNLRUQpOworICAgIC8qIElmIFB5X1JFRl9ERUJVRywgX1B5X05ld1JlZmVyZW5jZSBidW1wZWQgX1B5X1JlZlRvdGFsLCBzbworICAgICAqIHdlIG5lZWQgdG8gdW5kbyB0aGF0LiAqLworICAgIF9QeV9ERUNfUkVGVE9UQUw7CisgICAgLyogSWYgUHlfVFJBQ0VfUkVGUywgX1B5X05ld1JlZmVyZW5jZSByZS1hZGRlZCBzZWxmIHRvIHRoZSBvYmplY3QKKyAgICAgKiBjaGFpbiwgc28gbm8gbW9yZSB0byBkbyB0aGVyZS4KKyAgICAgKiBJZiBDT1VOVF9BTExPQ1MsIHRoZSBvcmlnaW5hbCBkZWNyZWYgYnVtcGVkIHRwX2ZyZWVzLCBhbmQKKyAgICAgKiBfUHlfTmV3UmVmZXJlbmNlIGJ1bXBlZCB0cF9hbGxvY3M6ICBib3RoIG9mIHRob3NlIG5lZWQgdG8gYmUKKyAgICAgKiB1bmRvbmUuCisgICAgICovCiAjaWZkZWYgQ09VTlRfQUxMT0NTCi0JLS1QeV9UWVBFKHNlbGYpLT50cF9mcmVlczsKLQktLVB5X1RZUEUoc2VsZiktPnRwX2FsbG9jczsKKyAgICAtLVB5X1RZUEUoc2VsZiktPnRwX2ZyZWVzOworICAgIC0tUHlfVFlQRShzZWxmKS0+dHBfYWxsb2NzOwogI2VuZGlmCiB9CiAKQEAgLTU3NjQsMjY3ICs1NzY0LDI2NyBAQAogI3VuZGVmIFJCSU5TTE9UCiAKICNkZWZpbmUgVFBTTE9UKE5BTUUsIFNMT1QsIEZVTkNUSU9OLCBXUkFQUEVSLCBET0MpIFwKLQl7TkFNRSwgb2Zmc2V0b2YoUHlUeXBlT2JqZWN0LCBTTE9UKSwgKHZvaWQgKikoRlVOQ1RJT04pLCBXUkFQUEVSLCBcCi0JIFB5RG9jX1NUUihET0MpfQorICAgIHtOQU1FLCBvZmZzZXRvZihQeVR5cGVPYmplY3QsIFNMT1QpLCAodm9pZCAqKShGVU5DVElPTiksIFdSQVBQRVIsIFwKKyAgICAgUHlEb2NfU1RSKERPQyl9CiAjZGVmaW5lIEZMU0xPVChOQU1FLCBTTE9ULCBGVU5DVElPTiwgV1JBUFBFUiwgRE9DLCBGTEFHUykgXAotCXtOQU1FLCBvZmZzZXRvZihQeVR5cGVPYmplY3QsIFNMT1QpLCAodm9pZCAqKShGVU5DVElPTiksIFdSQVBQRVIsIFwKLQkgUHlEb2NfU1RSKERPQyksIEZMQUdTfQorICAgIHtOQU1FLCBvZmZzZXRvZihQeVR5cGVPYmplY3QsIFNMT1QpLCAodm9pZCAqKShGVU5DVElPTiksIFdSQVBQRVIsIFwKKyAgICAgUHlEb2NfU1RSKERPQyksIEZMQUdTfQogI2RlZmluZSBFVFNMT1QoTkFNRSwgU0xPVCwgRlVOQ1RJT04sIFdSQVBQRVIsIERPQykgXAotCXtOQU1FLCBvZmZzZXRvZihQeUhlYXBUeXBlT2JqZWN0LCBTTE9UKSwgKHZvaWQgKikoRlVOQ1RJT04pLCBXUkFQUEVSLCBcCi0JIFB5RG9jX1NUUihET0MpfQorICAgIHtOQU1FLCBvZmZzZXRvZihQeUhlYXBUeXBlT2JqZWN0LCBTTE9UKSwgKHZvaWQgKikoRlVOQ1RJT04pLCBXUkFQUEVSLCBcCisgICAgIFB5RG9jX1NUUihET0MpfQogI2RlZmluZSBTUVNMT1QoTkFNRSwgU0xPVCwgRlVOQ1RJT04sIFdSQVBQRVIsIERPQykgXAotCUVUU0xPVChOQU1FLCBhc19zZXF1ZW5jZS5TTE9ULCBGVU5DVElPTiwgV1JBUFBFUiwgRE9DKQorICAgIEVUU0xPVChOQU1FLCBhc19zZXF1ZW5jZS5TTE9ULCBGVU5DVElPTiwgV1JBUFBFUiwgRE9DKQogI2RlZmluZSBNUFNMT1QoTkFNRSwgU0xPVCwgRlVOQ1RJT04sIFdSQVBQRVIsIERPQykgXAotCUVUU0xPVChOQU1FLCBhc19tYXBwaW5nLlNMT1QsIEZVTkNUSU9OLCBXUkFQUEVSLCBET0MpCisgICAgRVRTTE9UKE5BTUUsIGFzX21hcHBpbmcuU0xPVCwgRlVOQ1RJT04sIFdSQVBQRVIsIERPQykKICNkZWZpbmUgTkJTTE9UKE5BTUUsIFNMT1QsIEZVTkNUSU9OLCBXUkFQUEVSLCBET0MpIFwKLQlFVFNMT1QoTkFNRSwgYXNfbnVtYmVyLlNMT1QsIEZVTkNUSU9OLCBXUkFQUEVSLCBET0MpCisgICAgRVRTTE9UKE5BTUUsIGFzX251bWJlci5TTE9ULCBGVU5DVElPTiwgV1JBUFBFUiwgRE9DKQogI2RlZmluZSBVTlNMT1QoTkFNRSwgU0xPVCwgRlVOQ1RJT04sIFdSQVBQRVIsIERPQykgXAotCUVUU0xPVChOQU1FLCBhc19udW1iZXIuU0xPVCwgRlVOQ1RJT04sIFdSQVBQRVIsIFwKLQkgICAgICAgInguIiBOQU1FICIoKSA8PT0+ICIgRE9DKQorICAgIEVUU0xPVChOQU1FLCBhc19udW1iZXIuU0xPVCwgRlVOQ1RJT04sIFdSQVBQRVIsIFwKKyAgICAgICAgICAgInguIiBOQU1FICIoKSA8PT0+ICIgRE9DKQogI2RlZmluZSBJQlNMT1QoTkFNRSwgU0xPVCwgRlVOQ1RJT04sIFdSQVBQRVIsIERPQykgXAotCUVUU0xPVChOQU1FLCBhc19udW1iZXIuU0xPVCwgRlVOQ1RJT04sIFdSQVBQRVIsIFwKLQkgICAgICAgInguIiBOQU1FICIoeSkgPD09PiB4IiBET0MgInkiKQorICAgIEVUU0xPVChOQU1FLCBhc19udW1iZXIuU0xPVCwgRlVOQ1RJT04sIFdSQVBQRVIsIFwKKyAgICAgICAgICAgInguIiBOQU1FICIoeSkgPD09PiB4IiBET0MgInkiKQogI2RlZmluZSBCSU5TTE9UKE5BTUUsIFNMT1QsIEZVTkNUSU9OLCBET0MpIFwKLQlFVFNMT1QoTkFNRSwgYXNfbnVtYmVyLlNMT1QsIEZVTkNUSU9OLCB3cmFwX2JpbmFyeWZ1bmNfbCwgXAotCSAgICAgICAieC4iIE5BTUUgIih5KSA8PT0+IHgiIERPQyAieSIpCisgICAgRVRTTE9UKE5BTUUsIGFzX251bWJlci5TTE9ULCBGVU5DVElPTiwgd3JhcF9iaW5hcnlmdW5jX2wsIFwKKyAgICAgICAgICAgInguIiBOQU1FICIoeSkgPD09PiB4IiBET0MgInkiKQogI2RlZmluZSBSQklOU0xPVChOQU1FLCBTTE9ULCBGVU5DVElPTiwgRE9DKSBcCi0JRVRTTE9UKE5BTUUsIGFzX251bWJlci5TTE9ULCBGVU5DVElPTiwgd3JhcF9iaW5hcnlmdW5jX3IsIFwKLQkgICAgICAgInguIiBOQU1FICIoeSkgPD09PiB5IiBET0MgIngiKQorICAgIEVUU0xPVChOQU1FLCBhc19udW1iZXIuU0xPVCwgRlVOQ1RJT04sIHdyYXBfYmluYXJ5ZnVuY19yLCBcCisgICAgICAgICAgICJ4LiIgTkFNRSAiKHkpIDw9PT4geSIgRE9DICJ4IikKICNkZWZpbmUgQklOU0xPVE5PVElORklYKE5BTUUsIFNMT1QsIEZVTkNUSU9OLCBET0MpIFwKLQlFVFNMT1QoTkFNRSwgYXNfbnVtYmVyLlNMT1QsIEZVTkNUSU9OLCB3cmFwX2JpbmFyeWZ1bmNfbCwgXAotCSAgICAgICAieC4iIE5BTUUgIih5KSA8PT0+ICIgRE9DKQorICAgIEVUU0xPVChOQU1FLCBhc19udW1iZXIuU0xPVCwgRlVOQ1RJT04sIHdyYXBfYmluYXJ5ZnVuY19sLCBcCisgICAgICAgICAgICJ4LiIgTkFNRSAiKHkpIDw9PT4gIiBET0MpCiAjZGVmaW5lIFJCSU5TTE9UTk9USU5GSVgoTkFNRSwgU0xPVCwgRlVOQ1RJT04sIERPQykgXAotCUVUU0xPVChOQU1FLCBhc19udW1iZXIuU0xPVCwgRlVOQ1RJT04sIHdyYXBfYmluYXJ5ZnVuY19yLCBcCi0JICAgICAgICJ4LiIgTkFNRSAiKHkpIDw9PT4gIiBET0MpCisgICAgRVRTTE9UKE5BTUUsIGFzX251bWJlci5TTE9ULCBGVU5DVElPTiwgd3JhcF9iaW5hcnlmdW5jX3IsIFwKKyAgICAgICAgICAgInguIiBOQU1FICIoeSkgPD09PiAiIERPQykKIAogc3RhdGljIHNsb3RkZWYgc2xvdGRlZnNbXSA9IHsKLQlTUVNMT1QoIl9fbGVuX18iLCBzcV9sZW5ndGgsIHNsb3Rfc3FfbGVuZ3RoLCB3cmFwX2xlbmZ1bmMsCi0JICAgICAgICJ4Ll9fbGVuX18oKSA8PT0+IGxlbih4KSIpLAotCS8qIEhlYXAgdHlwZXMgZGVmaW5pbmcgX19hZGRfXy9fX211bF9fIGhhdmUgc3FfY29uY2F0L3NxX3JlcGVhdCA9PSBOVUxMLgotCSAgIFRoZSBsb2dpYyBpbiBhYnN0cmFjdC5jIGFsd2F5cyBmYWxscyBiYWNrIHRvIG5iX2FkZC9uYl9tdWx0aXBseSBpbgotCSAgIHRoaXMgY2FzZS4gIERlZmluaW5nIGJvdGggdGhlIG5iXyogYW5kIHRoZSBzcV8qIHNsb3RzIHRvIGNhbGwgdGhlCi0JICAgdXNlci1kZWZpbmVkIG1ldGhvZHMgaGFzIHVuZXhwZWN0ZWQgc2lkZS1lZmZlY3RzLCBhcyBzaG93biBieQotCSAgIHRlc3RfZGVzY3Iubm90aW1wbGVtZW50ZWQoKSAqLwotCVNRU0xPVCgiX19hZGRfXyIsIHNxX2NvbmNhdCwgTlVMTCwgd3JhcF9iaW5hcnlmdW5jLAotCSAgInguX19hZGRfXyh5KSA8PT0+IHgreSIpLAotCVNRU0xPVCgiX19tdWxfXyIsIHNxX3JlcGVhdCwgTlVMTCwgd3JhcF9pbmRleGFyZ2Z1bmMsCi0JICAieC5fX211bF9fKG4pIDw9PT4geCpuIiksCi0JU1FTTE9UKCJfX3JtdWxfXyIsIHNxX3JlcGVhdCwgTlVMTCwgd3JhcF9pbmRleGFyZ2Z1bmMsCi0JICAieC5fX3JtdWxfXyhuKSA8PT0+IG4qeCIpLAotCVNRU0xPVCgiX19nZXRpdGVtX18iLCBzcV9pdGVtLCBzbG90X3NxX2l0ZW0sIHdyYXBfc3FfaXRlbSwKLQkgICAgICAgInguX19nZXRpdGVtX18oeSkgPD09PiB4W3ldIiksCi0JU1FTTE9UKCJfX2dldHNsaWNlX18iLCBzcV9zbGljZSwgc2xvdF9zcV9zbGljZSwgd3JhcF9zc2l6ZXNzaXplYXJnZnVuYywKLQkgICAgICAgInguX19nZXRzbGljZV9fKGksIGopIDw9PT4geFtpOmpdXG5cCi0JICAgICAgIFxuXAotCSAgICAgICBVc2Ugb2YgbmVnYXRpdmUgaW5kaWNlcyBpcyBub3Qgc3VwcG9ydGVkLiIpLAotCVNRU0xPVCgiX19zZXRpdGVtX18iLCBzcV9hc3NfaXRlbSwgc2xvdF9zcV9hc3NfaXRlbSwgd3JhcF9zcV9zZXRpdGVtLAotCSAgICAgICAieC5fX3NldGl0ZW1fXyhpLCB5KSA8PT0+IHhbaV09eSIpLAotCVNRU0xPVCgiX19kZWxpdGVtX18iLCBzcV9hc3NfaXRlbSwgc2xvdF9zcV9hc3NfaXRlbSwgd3JhcF9zcV9kZWxpdGVtLAotCSAgICAgICAieC5fX2RlbGl0ZW1fXyh5KSA8PT0+IGRlbCB4W3ldIiksCi0JU1FTTE9UKCJfX3NldHNsaWNlX18iLCBzcV9hc3Nfc2xpY2UsIHNsb3Rfc3FfYXNzX3NsaWNlLAotCSAgICAgICB3cmFwX3NzaXplc3NpemVvYmphcmdwcm9jLAotCSAgICAgICAieC5fX3NldHNsaWNlX18oaSwgaiwgeSkgPD09PiB4W2k6al09eVxuXAotCSAgICAgICBcblwKLQkgICAgICAgVXNlICBvZiBuZWdhdGl2ZSBpbmRpY2VzIGlzIG5vdCBzdXBwb3J0ZWQuIiksCi0JU1FTTE9UKCJfX2RlbHNsaWNlX18iLCBzcV9hc3Nfc2xpY2UsIHNsb3Rfc3FfYXNzX3NsaWNlLCB3cmFwX2RlbHNsaWNlLAotCSAgICAgICAieC5fX2RlbHNsaWNlX18oaSwgaikgPD09PiBkZWwgeFtpOmpdXG5cCi0JICAgICAgIFxuXAotCSAgICAgICBVc2Ugb2YgbmVnYXRpdmUgaW5kaWNlcyBpcyBub3Qgc3VwcG9ydGVkLiIpLAotCVNRU0xPVCgiX19jb250YWluc19fIiwgc3FfY29udGFpbnMsIHNsb3Rfc3FfY29udGFpbnMsIHdyYXBfb2Jqb2JqcHJvYywKLQkgICAgICAgInguX19jb250YWluc19fKHkpIDw9PT4geSBpbiB4IiksCi0JU1FTTE9UKCJfX2lhZGRfXyIsIHNxX2lucGxhY2VfY29uY2F0LCBOVUxMLAotCSAgd3JhcF9iaW5hcnlmdW5jLCAieC5fX2lhZGRfXyh5KSA8PT0+IHgrPXkiKSwKLQlTUVNMT1QoIl9faW11bF9fIiwgc3FfaW5wbGFjZV9yZXBlYXQsIE5VTEwsCi0JICB3cmFwX2luZGV4YXJnZnVuYywgInguX19pbXVsX18oeSkgPD09PiB4Kj15IiksCisgICAgU1FTTE9UKCJfX2xlbl9fIiwgc3FfbGVuZ3RoLCBzbG90X3NxX2xlbmd0aCwgd3JhcF9sZW5mdW5jLAorICAgICAgICAgICAieC5fX2xlbl9fKCkgPD09PiBsZW4oeCkiKSwKKyAgICAvKiBIZWFwIHR5cGVzIGRlZmluaW5nIF9fYWRkX18vX19tdWxfXyBoYXZlIHNxX2NvbmNhdC9zcV9yZXBlYXQgPT0gTlVMTC4KKyAgICAgICBUaGUgbG9naWMgaW4gYWJzdHJhY3QuYyBhbHdheXMgZmFsbHMgYmFjayB0byBuYl9hZGQvbmJfbXVsdGlwbHkgaW4KKyAgICAgICB0aGlzIGNhc2UuICBEZWZpbmluZyBib3RoIHRoZSBuYl8qIGFuZCB0aGUgc3FfKiBzbG90cyB0byBjYWxsIHRoZQorICAgICAgIHVzZXItZGVmaW5lZCBtZXRob2RzIGhhcyB1bmV4cGVjdGVkIHNpZGUtZWZmZWN0cywgYXMgc2hvd24gYnkKKyAgICAgICB0ZXN0X2Rlc2NyLm5vdGltcGxlbWVudGVkKCkgKi8KKyAgICBTUVNMT1QoIl9fYWRkX18iLCBzcV9jb25jYXQsIE5VTEwsIHdyYXBfYmluYXJ5ZnVuYywKKyAgICAgICJ4Ll9fYWRkX18oeSkgPD09PiB4K3kiKSwKKyAgICBTUVNMT1QoIl9fbXVsX18iLCBzcV9yZXBlYXQsIE5VTEwsIHdyYXBfaW5kZXhhcmdmdW5jLAorICAgICAgInguX19tdWxfXyhuKSA8PT0+IHgqbiIpLAorICAgIFNRU0xPVCgiX19ybXVsX18iLCBzcV9yZXBlYXQsIE5VTEwsIHdyYXBfaW5kZXhhcmdmdW5jLAorICAgICAgInguX19ybXVsX18obikgPD09PiBuKngiKSwKKyAgICBTUVNMT1QoIl9fZ2V0aXRlbV9fIiwgc3FfaXRlbSwgc2xvdF9zcV9pdGVtLCB3cmFwX3NxX2l0ZW0sCisgICAgICAgICAgICJ4Ll9fZ2V0aXRlbV9fKHkpIDw9PT4geFt5XSIpLAorICAgIFNRU0xPVCgiX19nZXRzbGljZV9fIiwgc3Ffc2xpY2UsIHNsb3Rfc3Ffc2xpY2UsIHdyYXBfc3NpemVzc2l6ZWFyZ2Z1bmMsCisgICAgICAgICAgICJ4Ll9fZ2V0c2xpY2VfXyhpLCBqKSA8PT0+IHhbaTpqXVxuXAorICAgICAgICAgICBcblwKKyAgICAgICAgICAgVXNlIG9mIG5lZ2F0aXZlIGluZGljZXMgaXMgbm90IHN1cHBvcnRlZC4iKSwKKyAgICBTUVNMT1QoIl9fc2V0aXRlbV9fIiwgc3FfYXNzX2l0ZW0sIHNsb3Rfc3FfYXNzX2l0ZW0sIHdyYXBfc3Ffc2V0aXRlbSwKKyAgICAgICAgICAgInguX19zZXRpdGVtX18oaSwgeSkgPD09PiB4W2ldPXkiKSwKKyAgICBTUVNMT1QoIl9fZGVsaXRlbV9fIiwgc3FfYXNzX2l0ZW0sIHNsb3Rfc3FfYXNzX2l0ZW0sIHdyYXBfc3FfZGVsaXRlbSwKKyAgICAgICAgICAgInguX19kZWxpdGVtX18oeSkgPD09PiBkZWwgeFt5XSIpLAorICAgIFNRU0xPVCgiX19zZXRzbGljZV9fIiwgc3FfYXNzX3NsaWNlLCBzbG90X3NxX2Fzc19zbGljZSwKKyAgICAgICAgICAgd3JhcF9zc2l6ZXNzaXplb2JqYXJncHJvYywKKyAgICAgICAgICAgInguX19zZXRzbGljZV9fKGksIGosIHkpIDw9PT4geFtpOmpdPXlcblwKKyAgICAgICAgICAgXG5cCisgICAgICAgICAgIFVzZSAgb2YgbmVnYXRpdmUgaW5kaWNlcyBpcyBub3Qgc3VwcG9ydGVkLiIpLAorICAgIFNRU0xPVCgiX19kZWxzbGljZV9fIiwgc3FfYXNzX3NsaWNlLCBzbG90X3NxX2Fzc19zbGljZSwgd3JhcF9kZWxzbGljZSwKKyAgICAgICAgICAgInguX19kZWxzbGljZV9fKGksIGopIDw9PT4gZGVsIHhbaTpqXVxuXAorICAgICAgICAgICBcblwKKyAgICAgICAgICAgVXNlIG9mIG5lZ2F0aXZlIGluZGljZXMgaXMgbm90IHN1cHBvcnRlZC4iKSwKKyAgICBTUVNMT1QoIl9fY29udGFpbnNfXyIsIHNxX2NvbnRhaW5zLCBzbG90X3NxX2NvbnRhaW5zLCB3cmFwX29iam9ianByb2MsCisgICAgICAgICAgICJ4Ll9fY29udGFpbnNfXyh5KSA8PT0+IHkgaW4geCIpLAorICAgIFNRU0xPVCgiX19pYWRkX18iLCBzcV9pbnBsYWNlX2NvbmNhdCwgTlVMTCwKKyAgICAgIHdyYXBfYmluYXJ5ZnVuYywgInguX19pYWRkX18oeSkgPD09PiB4Kz15IiksCisgICAgU1FTTE9UKCJfX2ltdWxfXyIsIHNxX2lucGxhY2VfcmVwZWF0LCBOVUxMLAorICAgICAgd3JhcF9pbmRleGFyZ2Z1bmMsICJ4Ll9faW11bF9fKHkpIDw9PT4geCo9eSIpLAogCi0JTVBTTE9UKCJfX2xlbl9fIiwgbXBfbGVuZ3RoLCBzbG90X21wX2xlbmd0aCwgd3JhcF9sZW5mdW5jLAotCSAgICAgICAieC5fX2xlbl9fKCkgPD09PiBsZW4oeCkiKSwKLQlNUFNMT1QoIl9fZ2V0aXRlbV9fIiwgbXBfc3Vic2NyaXB0LCBzbG90X21wX3N1YnNjcmlwdCwKLQkgICAgICAgd3JhcF9iaW5hcnlmdW5jLAotCSAgICAgICAieC5fX2dldGl0ZW1fXyh5KSA8PT0+IHhbeV0iKSwKLQlNUFNMT1QoIl9fc2V0aXRlbV9fIiwgbXBfYXNzX3N1YnNjcmlwdCwgc2xvdF9tcF9hc3Nfc3Vic2NyaXB0LAotCSAgICAgICB3cmFwX29iam9iamFyZ3Byb2MsCi0JICAgICAgICJ4Ll9fc2V0aXRlbV9fKGksIHkpIDw9PT4geFtpXT15IiksCi0JTVBTTE9UKCJfX2RlbGl0ZW1fXyIsIG1wX2Fzc19zdWJzY3JpcHQsIHNsb3RfbXBfYXNzX3N1YnNjcmlwdCwKLQkgICAgICAgd3JhcF9kZWxpdGVtLAotCSAgICAgICAieC5fX2RlbGl0ZW1fXyh5KSA8PT0+IGRlbCB4W3ldIiksCisgICAgTVBTTE9UKCJfX2xlbl9fIiwgbXBfbGVuZ3RoLCBzbG90X21wX2xlbmd0aCwgd3JhcF9sZW5mdW5jLAorICAgICAgICAgICAieC5fX2xlbl9fKCkgPD09PiBsZW4oeCkiKSwKKyAgICBNUFNMT1QoIl9fZ2V0aXRlbV9fIiwgbXBfc3Vic2NyaXB0LCBzbG90X21wX3N1YnNjcmlwdCwKKyAgICAgICAgICAgd3JhcF9iaW5hcnlmdW5jLAorICAgICAgICAgICAieC5fX2dldGl0ZW1fXyh5KSA8PT0+IHhbeV0iKSwKKyAgICBNUFNMT1QoIl9fc2V0aXRlbV9fIiwgbXBfYXNzX3N1YnNjcmlwdCwgc2xvdF9tcF9hc3Nfc3Vic2NyaXB0LAorICAgICAgICAgICB3cmFwX29iam9iamFyZ3Byb2MsCisgICAgICAgICAgICJ4Ll9fc2V0aXRlbV9fKGksIHkpIDw9PT4geFtpXT15IiksCisgICAgTVBTTE9UKCJfX2RlbGl0ZW1fXyIsIG1wX2Fzc19zdWJzY3JpcHQsIHNsb3RfbXBfYXNzX3N1YnNjcmlwdCwKKyAgICAgICAgICAgd3JhcF9kZWxpdGVtLAorICAgICAgICAgICAieC5fX2RlbGl0ZW1fXyh5KSA8PT0+IGRlbCB4W3ldIiksCiAKLQlCSU5TTE9UKCJfX2FkZF9fIiwgbmJfYWRkLCBzbG90X25iX2FkZCwKLQkJIisiKSwKLQlSQklOU0xPVCgiX19yYWRkX18iLCBuYl9hZGQsIHNsb3RfbmJfYWRkLAotCQkgIisiKSwKLQlCSU5TTE9UKCJfX3N1Yl9fIiwgbmJfc3VidHJhY3QsIHNsb3RfbmJfc3VidHJhY3QsCi0JCSItIiksCi0JUkJJTlNMT1QoIl9fcnN1Yl9fIiwgbmJfc3VidHJhY3QsIHNsb3RfbmJfc3VidHJhY3QsCi0JCSAiLSIpLAotCUJJTlNMT1QoIl9fbXVsX18iLCBuYl9tdWx0aXBseSwgc2xvdF9uYl9tdWx0aXBseSwKLQkJIioiKSwKLQlSQklOU0xPVCgiX19ybXVsX18iLCBuYl9tdWx0aXBseSwgc2xvdF9uYl9tdWx0aXBseSwKLQkJICIqIiksCi0JQklOU0xPVCgiX19kaXZfXyIsIG5iX2RpdmlkZSwgc2xvdF9uYl9kaXZpZGUsCi0JCSIvIiksCi0JUkJJTlNMT1QoIl9fcmRpdl9fIiwgbmJfZGl2aWRlLCBzbG90X25iX2RpdmlkZSwKLQkJICIvIiksCi0JQklOU0xPVCgiX19tb2RfXyIsIG5iX3JlbWFpbmRlciwgc2xvdF9uYl9yZW1haW5kZXIsCi0JCSIlIiksCi0JUkJJTlNMT1QoIl9fcm1vZF9fIiwgbmJfcmVtYWluZGVyLCBzbG90X25iX3JlbWFpbmRlciwKLQkJICIlIiksCi0JQklOU0xPVE5PVElORklYKCJfX2Rpdm1vZF9fIiwgbmJfZGl2bW9kLCBzbG90X25iX2Rpdm1vZCwKLQkJImRpdm1vZCh4LCB5KSIpLAotCVJCSU5TTE9UTk9USU5GSVgoIl9fcmRpdm1vZF9fIiwgbmJfZGl2bW9kLCBzbG90X25iX2Rpdm1vZCwKLQkJICJkaXZtb2QoeSwgeCkiKSwKLQlOQlNMT1QoIl9fcG93X18iLCBuYl9wb3dlciwgc2xvdF9uYl9wb3dlciwgd3JhcF90ZXJuYXJ5ZnVuYywKLQkgICAgICAgInguX19wb3dfXyh5Wywgel0pIDw9PT4gcG93KHgsIHlbLCB6XSkiKSwKLQlOQlNMT1QoIl9fcnBvd19fIiwgbmJfcG93ZXIsIHNsb3RfbmJfcG93ZXIsIHdyYXBfdGVybmFyeWZ1bmNfciwKLQkgICAgICAgInkuX19ycG93X18oeFssIHpdKSA8PT0+IHBvdyh4LCB5Wywgel0pIiksCi0JVU5TTE9UKCJfX25lZ19fIiwgbmJfbmVnYXRpdmUsIHNsb3RfbmJfbmVnYXRpdmUsIHdyYXBfdW5hcnlmdW5jLCAiLXgiKSwKLQlVTlNMT1QoIl9fcG9zX18iLCBuYl9wb3NpdGl2ZSwgc2xvdF9uYl9wb3NpdGl2ZSwgd3JhcF91bmFyeWZ1bmMsICIreCIpLAotCVVOU0xPVCgiX19hYnNfXyIsIG5iX2Fic29sdXRlLCBzbG90X25iX2Fic29sdXRlLCB3cmFwX3VuYXJ5ZnVuYywKLQkgICAgICAgImFicyh4KSIpLAotCVVOU0xPVCgiX19ub256ZXJvX18iLCBuYl9ub256ZXJvLCBzbG90X25iX25vbnplcm8sIHdyYXBfaW5xdWlyeXByZWQsCi0JICAgICAgICJ4ICE9IDAiKSwKLQlVTlNMT1QoIl9faW52ZXJ0X18iLCBuYl9pbnZlcnQsIHNsb3RfbmJfaW52ZXJ0LCB3cmFwX3VuYXJ5ZnVuYywgIn54IiksCi0JQklOU0xPVCgiX19sc2hpZnRfXyIsIG5iX2xzaGlmdCwgc2xvdF9uYl9sc2hpZnQsICI8PCIpLAotCVJCSU5TTE9UKCJfX3Jsc2hpZnRfXyIsIG5iX2xzaGlmdCwgc2xvdF9uYl9sc2hpZnQsICI8PCIpLAotCUJJTlNMT1QoIl9fcnNoaWZ0X18iLCBuYl9yc2hpZnQsIHNsb3RfbmJfcnNoaWZ0LCAiPj4iKSwKLQlSQklOU0xPVCgiX19ycnNoaWZ0X18iLCBuYl9yc2hpZnQsIHNsb3RfbmJfcnNoaWZ0LCAiPj4iKSwKLQlCSU5TTE9UKCJfX2FuZF9fIiwgbmJfYW5kLCBzbG90X25iX2FuZCwgIiYiKSwKLQlSQklOU0xPVCgiX19yYW5kX18iLCBuYl9hbmQsIHNsb3RfbmJfYW5kLCAiJiIpLAotCUJJTlNMT1QoIl9feG9yX18iLCBuYl94b3IsIHNsb3RfbmJfeG9yLCAiXiIpLAotCVJCSU5TTE9UKCJfX3J4b3JfXyIsIG5iX3hvciwgc2xvdF9uYl94b3IsICJeIiksCi0JQklOU0xPVCgiX19vcl9fIiwgbmJfb3IsIHNsb3RfbmJfb3IsICJ8IiksCi0JUkJJTlNMT1QoIl9fcm9yX18iLCBuYl9vciwgc2xvdF9uYl9vciwgInwiKSwKLQlOQlNMT1QoIl9fY29lcmNlX18iLCBuYl9jb2VyY2UsIHNsb3RfbmJfY29lcmNlLCB3cmFwX2NvZXJjZWZ1bmMsCi0JICAgICAgICJ4Ll9fY29lcmNlX18oeSkgPD09PiBjb2VyY2UoeCwgeSkiKSwKLQlVTlNMT1QoIl9faW50X18iLCBuYl9pbnQsIHNsb3RfbmJfaW50LCB3cmFwX3VuYXJ5ZnVuYywKLQkgICAgICAgImludCh4KSIpLAotCVVOU0xPVCgiX19sb25nX18iLCBuYl9sb25nLCBzbG90X25iX2xvbmcsIHdyYXBfdW5hcnlmdW5jLAotCSAgICAgICAibG9uZyh4KSIpLAotCVVOU0xPVCgiX19mbG9hdF9fIiwgbmJfZmxvYXQsIHNsb3RfbmJfZmxvYXQsIHdyYXBfdW5hcnlmdW5jLAotCSAgICAgICAiZmxvYXQoeCkiKSwKLQlVTlNMT1QoIl9fb2N0X18iLCBuYl9vY3QsIHNsb3RfbmJfb2N0LCB3cmFwX3VuYXJ5ZnVuYywKLQkgICAgICAgIm9jdCh4KSIpLAotCVVOU0xPVCgiX19oZXhfXyIsIG5iX2hleCwgc2xvdF9uYl9oZXgsIHdyYXBfdW5hcnlmdW5jLAotCSAgICAgICAiaGV4KHgpIiksCi0JTkJTTE9UKCJfX2luZGV4X18iLCBuYl9pbmRleCwgc2xvdF9uYl9pbmRleCwgd3JhcF91bmFyeWZ1bmMsIAotCSAgICAgICAieFt5OnpdIDw9PT4geFt5Ll9faW5kZXhfXygpOnouX19pbmRleF9fKCldIiksCi0JSUJTTE9UKCJfX2lhZGRfXyIsIG5iX2lucGxhY2VfYWRkLCBzbG90X25iX2lucGxhY2VfYWRkLAotCSAgICAgICB3cmFwX2JpbmFyeWZ1bmMsICIrIiksCi0JSUJTTE9UKCJfX2lzdWJfXyIsIG5iX2lucGxhY2Vfc3VidHJhY3QsIHNsb3RfbmJfaW5wbGFjZV9zdWJ0cmFjdCwKLQkgICAgICAgd3JhcF9iaW5hcnlmdW5jLCAiLSIpLAotCUlCU0xPVCgiX19pbXVsX18iLCBuYl9pbnBsYWNlX211bHRpcGx5LCBzbG90X25iX2lucGxhY2VfbXVsdGlwbHksCi0JICAgICAgIHdyYXBfYmluYXJ5ZnVuYywgIioiKSwKLQlJQlNMT1QoIl9faWRpdl9fIiwgbmJfaW5wbGFjZV9kaXZpZGUsIHNsb3RfbmJfaW5wbGFjZV9kaXZpZGUsCi0JICAgICAgIHdyYXBfYmluYXJ5ZnVuYywgIi8iKSwKLQlJQlNMT1QoIl9faW1vZF9fIiwgbmJfaW5wbGFjZV9yZW1haW5kZXIsIHNsb3RfbmJfaW5wbGFjZV9yZW1haW5kZXIsCi0JICAgICAgIHdyYXBfYmluYXJ5ZnVuYywgIiUiKSwKLQlJQlNMT1QoIl9faXBvd19fIiwgbmJfaW5wbGFjZV9wb3dlciwgc2xvdF9uYl9pbnBsYWNlX3Bvd2VyLAotCSAgICAgICB3cmFwX2JpbmFyeWZ1bmMsICIqKiIpLAotCUlCU0xPVCgiX19pbHNoaWZ0X18iLCBuYl9pbnBsYWNlX2xzaGlmdCwgc2xvdF9uYl9pbnBsYWNlX2xzaGlmdCwKLQkgICAgICAgd3JhcF9iaW5hcnlmdW5jLCAiPDwiKSwKLQlJQlNMT1QoIl9faXJzaGlmdF9fIiwgbmJfaW5wbGFjZV9yc2hpZnQsIHNsb3RfbmJfaW5wbGFjZV9yc2hpZnQsCi0JICAgICAgIHdyYXBfYmluYXJ5ZnVuYywgIj4+IiksCi0JSUJTTE9UKCJfX2lhbmRfXyIsIG5iX2lucGxhY2VfYW5kLCBzbG90X25iX2lucGxhY2VfYW5kLAotCSAgICAgICB3cmFwX2JpbmFyeWZ1bmMsICImIiksCi0JSUJTTE9UKCJfX2l4b3JfXyIsIG5iX2lucGxhY2VfeG9yLCBzbG90X25iX2lucGxhY2VfeG9yLAotCSAgICAgICB3cmFwX2JpbmFyeWZ1bmMsICJeIiksCi0JSUJTTE9UKCJfX2lvcl9fIiwgbmJfaW5wbGFjZV9vciwgc2xvdF9uYl9pbnBsYWNlX29yLAotCSAgICAgICB3cmFwX2JpbmFyeWZ1bmMsICJ8IiksCi0JQklOU0xPVCgiX19mbG9vcmRpdl9fIiwgbmJfZmxvb3JfZGl2aWRlLCBzbG90X25iX2Zsb29yX2RpdmlkZSwgIi8vIiksCi0JUkJJTlNMT1QoIl9fcmZsb29yZGl2X18iLCBuYl9mbG9vcl9kaXZpZGUsIHNsb3RfbmJfZmxvb3JfZGl2aWRlLCAiLy8iKSwKLQlCSU5TTE9UKCJfX3RydWVkaXZfXyIsIG5iX3RydWVfZGl2aWRlLCBzbG90X25iX3RydWVfZGl2aWRlLCAiLyIpLAotCVJCSU5TTE9UKCJfX3J0cnVlZGl2X18iLCBuYl90cnVlX2RpdmlkZSwgc2xvdF9uYl90cnVlX2RpdmlkZSwgIi8iKSwKLQlJQlNMT1QoIl9faWZsb29yZGl2X18iLCBuYl9pbnBsYWNlX2Zsb29yX2RpdmlkZSwKLQkgICAgICAgc2xvdF9uYl9pbnBsYWNlX2Zsb29yX2RpdmlkZSwgd3JhcF9iaW5hcnlmdW5jLCAiLy8iKSwKLQlJQlNMT1QoIl9faXRydWVkaXZfXyIsIG5iX2lucGxhY2VfdHJ1ZV9kaXZpZGUsCi0JICAgICAgIHNsb3RfbmJfaW5wbGFjZV90cnVlX2RpdmlkZSwgd3JhcF9iaW5hcnlmdW5jLCAiLyIpLAorICAgIEJJTlNMT1QoIl9fYWRkX18iLCBuYl9hZGQsIHNsb3RfbmJfYWRkLAorICAgICAgICAiKyIpLAorICAgIFJCSU5TTE9UKCJfX3JhZGRfXyIsIG5iX2FkZCwgc2xvdF9uYl9hZGQsCisgICAgICAgICAgICAgIisiKSwKKyAgICBCSU5TTE9UKCJfX3N1Yl9fIiwgbmJfc3VidHJhY3QsIHNsb3RfbmJfc3VidHJhY3QsCisgICAgICAgICItIiksCisgICAgUkJJTlNMT1QoIl9fcnN1Yl9fIiwgbmJfc3VidHJhY3QsIHNsb3RfbmJfc3VidHJhY3QsCisgICAgICAgICAgICAgIi0iKSwKKyAgICBCSU5TTE9UKCJfX211bF9fIiwgbmJfbXVsdGlwbHksIHNsb3RfbmJfbXVsdGlwbHksCisgICAgICAgICIqIiksCisgICAgUkJJTlNMT1QoIl9fcm11bF9fIiwgbmJfbXVsdGlwbHksIHNsb3RfbmJfbXVsdGlwbHksCisgICAgICAgICAgICAgIioiKSwKKyAgICBCSU5TTE9UKCJfX2Rpdl9fIiwgbmJfZGl2aWRlLCBzbG90X25iX2RpdmlkZSwKKyAgICAgICAgIi8iKSwKKyAgICBSQklOU0xPVCgiX19yZGl2X18iLCBuYl9kaXZpZGUsIHNsb3RfbmJfZGl2aWRlLAorICAgICAgICAgICAgICIvIiksCisgICAgQklOU0xPVCgiX19tb2RfXyIsIG5iX3JlbWFpbmRlciwgc2xvdF9uYl9yZW1haW5kZXIsCisgICAgICAgICIlIiksCisgICAgUkJJTlNMT1QoIl9fcm1vZF9fIiwgbmJfcmVtYWluZGVyLCBzbG90X25iX3JlbWFpbmRlciwKKyAgICAgICAgICAgICAiJSIpLAorICAgIEJJTlNMT1ROT1RJTkZJWCgiX19kaXZtb2RfXyIsIG5iX2Rpdm1vZCwgc2xvdF9uYl9kaXZtb2QsCisgICAgICAgICJkaXZtb2QoeCwgeSkiKSwKKyAgICBSQklOU0xPVE5PVElORklYKCJfX3JkaXZtb2RfXyIsIG5iX2Rpdm1vZCwgc2xvdF9uYl9kaXZtb2QsCisgICAgICAgICAgICAgImRpdm1vZCh5LCB4KSIpLAorICAgIE5CU0xPVCgiX19wb3dfXyIsIG5iX3Bvd2VyLCBzbG90X25iX3Bvd2VyLCB3cmFwX3Rlcm5hcnlmdW5jLAorICAgICAgICAgICAieC5fX3Bvd19fKHlbLCB6XSkgPD09PiBwb3coeCwgeVssIHpdKSIpLAorICAgIE5CU0xPVCgiX19ycG93X18iLCBuYl9wb3dlciwgc2xvdF9uYl9wb3dlciwgd3JhcF90ZXJuYXJ5ZnVuY19yLAorICAgICAgICAgICAieS5fX3Jwb3dfXyh4Wywgel0pIDw9PT4gcG93KHgsIHlbLCB6XSkiKSwKKyAgICBVTlNMT1QoIl9fbmVnX18iLCBuYl9uZWdhdGl2ZSwgc2xvdF9uYl9uZWdhdGl2ZSwgd3JhcF91bmFyeWZ1bmMsICIteCIpLAorICAgIFVOU0xPVCgiX19wb3NfXyIsIG5iX3Bvc2l0aXZlLCBzbG90X25iX3Bvc2l0aXZlLCB3cmFwX3VuYXJ5ZnVuYywgIit4IiksCisgICAgVU5TTE9UKCJfX2Fic19fIiwgbmJfYWJzb2x1dGUsIHNsb3RfbmJfYWJzb2x1dGUsIHdyYXBfdW5hcnlmdW5jLAorICAgICAgICAgICAiYWJzKHgpIiksCisgICAgVU5TTE9UKCJfX25vbnplcm9fXyIsIG5iX25vbnplcm8sIHNsb3RfbmJfbm9uemVybywgd3JhcF9pbnF1aXJ5cHJlZCwKKyAgICAgICAgICAgInggIT0gMCIpLAorICAgIFVOU0xPVCgiX19pbnZlcnRfXyIsIG5iX2ludmVydCwgc2xvdF9uYl9pbnZlcnQsIHdyYXBfdW5hcnlmdW5jLCAifngiKSwKKyAgICBCSU5TTE9UKCJfX2xzaGlmdF9fIiwgbmJfbHNoaWZ0LCBzbG90X25iX2xzaGlmdCwgIjw8IiksCisgICAgUkJJTlNMT1QoIl9fcmxzaGlmdF9fIiwgbmJfbHNoaWZ0LCBzbG90X25iX2xzaGlmdCwgIjw8IiksCisgICAgQklOU0xPVCgiX19yc2hpZnRfXyIsIG5iX3JzaGlmdCwgc2xvdF9uYl9yc2hpZnQsICI+PiIpLAorICAgIFJCSU5TTE9UKCJfX3Jyc2hpZnRfXyIsIG5iX3JzaGlmdCwgc2xvdF9uYl9yc2hpZnQsICI+PiIpLAorICAgIEJJTlNMT1QoIl9fYW5kX18iLCBuYl9hbmQsIHNsb3RfbmJfYW5kLCAiJiIpLAorICAgIFJCSU5TTE9UKCJfX3JhbmRfXyIsIG5iX2FuZCwgc2xvdF9uYl9hbmQsICImIiksCisgICAgQklOU0xPVCgiX194b3JfXyIsIG5iX3hvciwgc2xvdF9uYl94b3IsICJeIiksCisgICAgUkJJTlNMT1QoIl9fcnhvcl9fIiwgbmJfeG9yLCBzbG90X25iX3hvciwgIl4iKSwKKyAgICBCSU5TTE9UKCJfX29yX18iLCBuYl9vciwgc2xvdF9uYl9vciwgInwiKSwKKyAgICBSQklOU0xPVCgiX19yb3JfXyIsIG5iX29yLCBzbG90X25iX29yLCAifCIpLAorICAgIE5CU0xPVCgiX19jb2VyY2VfXyIsIG5iX2NvZXJjZSwgc2xvdF9uYl9jb2VyY2UsIHdyYXBfY29lcmNlZnVuYywKKyAgICAgICAgICAgInguX19jb2VyY2VfXyh5KSA8PT0+IGNvZXJjZSh4LCB5KSIpLAorICAgIFVOU0xPVCgiX19pbnRfXyIsIG5iX2ludCwgc2xvdF9uYl9pbnQsIHdyYXBfdW5hcnlmdW5jLAorICAgICAgICAgICAiaW50KHgpIiksCisgICAgVU5TTE9UKCJfX2xvbmdfXyIsIG5iX2xvbmcsIHNsb3RfbmJfbG9uZywgd3JhcF91bmFyeWZ1bmMsCisgICAgICAgICAgICJsb25nKHgpIiksCisgICAgVU5TTE9UKCJfX2Zsb2F0X18iLCBuYl9mbG9hdCwgc2xvdF9uYl9mbG9hdCwgd3JhcF91bmFyeWZ1bmMsCisgICAgICAgICAgICJmbG9hdCh4KSIpLAorICAgIFVOU0xPVCgiX19vY3RfXyIsIG5iX29jdCwgc2xvdF9uYl9vY3QsIHdyYXBfdW5hcnlmdW5jLAorICAgICAgICAgICAib2N0KHgpIiksCisgICAgVU5TTE9UKCJfX2hleF9fIiwgbmJfaGV4LCBzbG90X25iX2hleCwgd3JhcF91bmFyeWZ1bmMsCisgICAgICAgICAgICJoZXgoeCkiKSwKKyAgICBOQlNMT1QoIl9faW5kZXhfXyIsIG5iX2luZGV4LCBzbG90X25iX2luZGV4LCB3cmFwX3VuYXJ5ZnVuYywKKyAgICAgICAgICAgInhbeTp6XSA8PT0+IHhbeS5fX2luZGV4X18oKTp6Ll9faW5kZXhfXygpXSIpLAorICAgIElCU0xPVCgiX19pYWRkX18iLCBuYl9pbnBsYWNlX2FkZCwgc2xvdF9uYl9pbnBsYWNlX2FkZCwKKyAgICAgICAgICAgd3JhcF9iaW5hcnlmdW5jLCAiKyIpLAorICAgIElCU0xPVCgiX19pc3ViX18iLCBuYl9pbnBsYWNlX3N1YnRyYWN0LCBzbG90X25iX2lucGxhY2Vfc3VidHJhY3QsCisgICAgICAgICAgIHdyYXBfYmluYXJ5ZnVuYywgIi0iKSwKKyAgICBJQlNMT1QoIl9faW11bF9fIiwgbmJfaW5wbGFjZV9tdWx0aXBseSwgc2xvdF9uYl9pbnBsYWNlX211bHRpcGx5LAorICAgICAgICAgICB3cmFwX2JpbmFyeWZ1bmMsICIqIiksCisgICAgSUJTTE9UKCJfX2lkaXZfXyIsIG5iX2lucGxhY2VfZGl2aWRlLCBzbG90X25iX2lucGxhY2VfZGl2aWRlLAorICAgICAgICAgICB3cmFwX2JpbmFyeWZ1bmMsICIvIiksCisgICAgSUJTTE9UKCJfX2ltb2RfXyIsIG5iX2lucGxhY2VfcmVtYWluZGVyLCBzbG90X25iX2lucGxhY2VfcmVtYWluZGVyLAorICAgICAgICAgICB3cmFwX2JpbmFyeWZ1bmMsICIlIiksCisgICAgSUJTTE9UKCJfX2lwb3dfXyIsIG5iX2lucGxhY2VfcG93ZXIsIHNsb3RfbmJfaW5wbGFjZV9wb3dlciwKKyAgICAgICAgICAgd3JhcF9iaW5hcnlmdW5jLCAiKioiKSwKKyAgICBJQlNMT1QoIl9faWxzaGlmdF9fIiwgbmJfaW5wbGFjZV9sc2hpZnQsIHNsb3RfbmJfaW5wbGFjZV9sc2hpZnQsCisgICAgICAgICAgIHdyYXBfYmluYXJ5ZnVuYywgIjw8IiksCisgICAgSUJTTE9UKCJfX2lyc2hpZnRfXyIsIG5iX2lucGxhY2VfcnNoaWZ0LCBzbG90X25iX2lucGxhY2VfcnNoaWZ0LAorICAgICAgICAgICB3cmFwX2JpbmFyeWZ1bmMsICI+PiIpLAorICAgIElCU0xPVCgiX19pYW5kX18iLCBuYl9pbnBsYWNlX2FuZCwgc2xvdF9uYl9pbnBsYWNlX2FuZCwKKyAgICAgICAgICAgd3JhcF9iaW5hcnlmdW5jLCAiJiIpLAorICAgIElCU0xPVCgiX19peG9yX18iLCBuYl9pbnBsYWNlX3hvciwgc2xvdF9uYl9pbnBsYWNlX3hvciwKKyAgICAgICAgICAgd3JhcF9iaW5hcnlmdW5jLCAiXiIpLAorICAgIElCU0xPVCgiX19pb3JfXyIsIG5iX2lucGxhY2Vfb3IsIHNsb3RfbmJfaW5wbGFjZV9vciwKKyAgICAgICAgICAgd3JhcF9iaW5hcnlmdW5jLCAifCIpLAorICAgIEJJTlNMT1QoIl9fZmxvb3JkaXZfXyIsIG5iX2Zsb29yX2RpdmlkZSwgc2xvdF9uYl9mbG9vcl9kaXZpZGUsICIvLyIpLAorICAgIFJCSU5TTE9UKCJfX3JmbG9vcmRpdl9fIiwgbmJfZmxvb3JfZGl2aWRlLCBzbG90X25iX2Zsb29yX2RpdmlkZSwgIi8vIiksCisgICAgQklOU0xPVCgiX190cnVlZGl2X18iLCBuYl90cnVlX2RpdmlkZSwgc2xvdF9uYl90cnVlX2RpdmlkZSwgIi8iKSwKKyAgICBSQklOU0xPVCgiX19ydHJ1ZWRpdl9fIiwgbmJfdHJ1ZV9kaXZpZGUsIHNsb3RfbmJfdHJ1ZV9kaXZpZGUsICIvIiksCisgICAgSUJTTE9UKCJfX2lmbG9vcmRpdl9fIiwgbmJfaW5wbGFjZV9mbG9vcl9kaXZpZGUsCisgICAgICAgICAgIHNsb3RfbmJfaW5wbGFjZV9mbG9vcl9kaXZpZGUsIHdyYXBfYmluYXJ5ZnVuYywgIi8vIiksCisgICAgSUJTTE9UKCJfX2l0cnVlZGl2X18iLCBuYl9pbnBsYWNlX3RydWVfZGl2aWRlLAorICAgICAgICAgICBzbG90X25iX2lucGxhY2VfdHJ1ZV9kaXZpZGUsIHdyYXBfYmluYXJ5ZnVuYywgIi8iKSwKIAotCVRQU0xPVCgiX19zdHJfXyIsIHRwX3N0ciwgc2xvdF90cF9zdHIsIHdyYXBfdW5hcnlmdW5jLAotCSAgICAgICAieC5fX3N0cl9fKCkgPD09PiBzdHIoeCkiKSwKLQlUUFNMT1QoIl9fc3RyX18iLCB0cF9wcmludCwgTlVMTCwgTlVMTCwgIiIpLAotCVRQU0xPVCgiX19yZXByX18iLCB0cF9yZXByLCBzbG90X3RwX3JlcHIsIHdyYXBfdW5hcnlmdW5jLAotCSAgICAgICAieC5fX3JlcHJfXygpIDw9PT4gcmVwcih4KSIpLAotCVRQU0xPVCgiX19yZXByX18iLCB0cF9wcmludCwgTlVMTCwgTlVMTCwgIiIpLAotCVRQU0xPVCgiX19jbXBfXyIsIHRwX2NvbXBhcmUsIF9QeU9iamVjdF9TbG90Q29tcGFyZSwgd3JhcF9jbXBmdW5jLAotCSAgICAgICAieC5fX2NtcF9fKHkpIDw9PT4gY21wKHgseSkiKSwKLQlUUFNMT1QoIl9faGFzaF9fIiwgdHBfaGFzaCwgc2xvdF90cF9oYXNoLCB3cmFwX2hhc2hmdW5jLAotCSAgICAgICAieC5fX2hhc2hfXygpIDw9PT4gaGFzaCh4KSIpLAotCUZMU0xPVCgiX19jYWxsX18iLCB0cF9jYWxsLCBzbG90X3RwX2NhbGwsICh3cmFwcGVyZnVuYyl3cmFwX2NhbGwsCi0JICAgICAgICJ4Ll9fY2FsbF9fKC4uLikgPD09PiB4KC4uLikiLCBQeVdyYXBwZXJGbGFnX0tFWVdPUkRTKSwKLQlUUFNMT1QoIl9fZ2V0YXR0cmlidXRlX18iLCB0cF9nZXRhdHRybywgc2xvdF90cF9nZXRhdHRyX2hvb2ssCi0JICAgICAgIHdyYXBfYmluYXJ5ZnVuYywgInguX19nZXRhdHRyaWJ1dGVfXygnbmFtZScpIDw9PT4geC5uYW1lIiksCi0JVFBTTE9UKCJfX2dldGF0dHJpYnV0ZV9fIiwgdHBfZ2V0YXR0ciwgTlVMTCwgTlVMTCwgIiIpLAotCVRQU0xPVCgiX19nZXRhdHRyX18iLCB0cF9nZXRhdHRybywgc2xvdF90cF9nZXRhdHRyX2hvb2ssIE5VTEwsICIiKSwKLQlUUFNMT1QoIl9fZ2V0YXR0cl9fIiwgdHBfZ2V0YXR0ciwgTlVMTCwgTlVMTCwgIiIpLAotCVRQU0xPVCgiX19zZXRhdHRyX18iLCB0cF9zZXRhdHRybywgc2xvdF90cF9zZXRhdHRybywgd3JhcF9zZXRhdHRyLAotCSAgICAgICAieC5fX3NldGF0dHJfXygnbmFtZScsIHZhbHVlKSA8PT0+IHgubmFtZSA9IHZhbHVlIiksCi0JVFBTTE9UKCJfX3NldGF0dHJfXyIsIHRwX3NldGF0dHIsIE5VTEwsIE5VTEwsICIiKSwKLQlUUFNMT1QoIl9fZGVsYXR0cl9fIiwgdHBfc2V0YXR0cm8sIHNsb3RfdHBfc2V0YXR0cm8sIHdyYXBfZGVsYXR0ciwKLQkgICAgICAgInguX19kZWxhdHRyX18oJ25hbWUnKSA8PT0+IGRlbCB4Lm5hbWUiKSwKLQlUUFNMT1QoIl9fZGVsYXR0cl9fIiwgdHBfc2V0YXR0ciwgTlVMTCwgTlVMTCwgIiIpLAotCVRQU0xPVCgiX19sdF9fIiwgdHBfcmljaGNvbXBhcmUsIHNsb3RfdHBfcmljaGNvbXBhcmUsIHJpY2hjbXBfbHQsCi0JICAgICAgICJ4Ll9fbHRfXyh5KSA8PT0+IHg8eSIpLAotCVRQU0xPVCgiX19sZV9fIiwgdHBfcmljaGNvbXBhcmUsIHNsb3RfdHBfcmljaGNvbXBhcmUsIHJpY2hjbXBfbGUsCi0JICAgICAgICJ4Ll9fbGVfXyh5KSA8PT0+IHg8PXkiKSwKLQlUUFNMT1QoIl9fZXFfXyIsIHRwX3JpY2hjb21wYXJlLCBzbG90X3RwX3JpY2hjb21wYXJlLCByaWNoY21wX2VxLAotCSAgICAgICAieC5fX2VxX18oeSkgPD09PiB4PT15IiksCi0JVFBTTE9UKCJfX25lX18iLCB0cF9yaWNoY29tcGFyZSwgc2xvdF90cF9yaWNoY29tcGFyZSwgcmljaGNtcF9uZSwKLQkgICAgICAgInguX19uZV9fKHkpIDw9PT4geCE9eSIpLAotCVRQU0xPVCgiX19ndF9fIiwgdHBfcmljaGNvbXBhcmUsIHNsb3RfdHBfcmljaGNvbXBhcmUsIHJpY2hjbXBfZ3QsCi0JICAgICAgICJ4Ll9fZ3RfXyh5KSA8PT0+IHg+eSIpLAotCVRQU0xPVCgiX19nZV9fIiwgdHBfcmljaGNvbXBhcmUsIHNsb3RfdHBfcmljaGNvbXBhcmUsIHJpY2hjbXBfZ2UsCi0JICAgICAgICJ4Ll9fZ2VfXyh5KSA8PT0+IHg+PXkiKSwKLQlUUFNMT1QoIl9faXRlcl9fIiwgdHBfaXRlciwgc2xvdF90cF9pdGVyLCB3cmFwX3VuYXJ5ZnVuYywKLQkgICAgICAgInguX19pdGVyX18oKSA8PT0+IGl0ZXIoeCkiKSwKLQlUUFNMT1QoIm5leHQiLCB0cF9pdGVybmV4dCwgc2xvdF90cF9pdGVybmV4dCwgd3JhcF9uZXh0LAotCSAgICAgICAieC5uZXh0KCkgLT4gdGhlIG5leHQgdmFsdWUsIG9yIHJhaXNlIFN0b3BJdGVyYXRpb24iKSwKLQlUUFNMT1QoIl9fZ2V0X18iLCB0cF9kZXNjcl9nZXQsIHNsb3RfdHBfZGVzY3JfZ2V0LCB3cmFwX2Rlc2NyX2dldCwKLQkgICAgICAgImRlc2NyLl9fZ2V0X18ob2JqWywgdHlwZV0pIC0+IHZhbHVlIiksCi0JVFBTTE9UKCJfX3NldF9fIiwgdHBfZGVzY3Jfc2V0LCBzbG90X3RwX2Rlc2NyX3NldCwgd3JhcF9kZXNjcl9zZXQsCi0JICAgICAgICJkZXNjci5fX3NldF9fKG9iaiwgdmFsdWUpIiksCi0JVFBTTE9UKCJfX2RlbGV0ZV9fIiwgdHBfZGVzY3Jfc2V0LCBzbG90X3RwX2Rlc2NyX3NldCwKLQkgICAgICAgd3JhcF9kZXNjcl9kZWxldGUsICJkZXNjci5fX2RlbGV0ZV9fKG9iaikiKSwKLQlGTFNMT1QoIl9faW5pdF9fIiwgdHBfaW5pdCwgc2xvdF90cF9pbml0LCAod3JhcHBlcmZ1bmMpd3JhcF9pbml0LAotCSAgICAgICAieC5fX2luaXRfXyguLi4pIGluaXRpYWxpemVzIHg7ICIKLQkgICAgICAgInNlZSB4Ll9fY2xhc3NfXy5fX2RvY19fIGZvciBzaWduYXR1cmUiLAotCSAgICAgICBQeVdyYXBwZXJGbGFnX0tFWVdPUkRTKSwKLQlUUFNMT1QoIl9fbmV3X18iLCB0cF9uZXcsIHNsb3RfdHBfbmV3LCBOVUxMLCAiIiksCi0JVFBTTE9UKCJfX2RlbF9fIiwgdHBfZGVsLCBzbG90X3RwX2RlbCwgTlVMTCwgIiIpLAotCXtOVUxMfQorICAgIFRQU0xPVCgiX19zdHJfXyIsIHRwX3N0ciwgc2xvdF90cF9zdHIsIHdyYXBfdW5hcnlmdW5jLAorICAgICAgICAgICAieC5fX3N0cl9fKCkgPD09PiBzdHIoeCkiKSwKKyAgICBUUFNMT1QoIl9fc3RyX18iLCB0cF9wcmludCwgTlVMTCwgTlVMTCwgIiIpLAorICAgIFRQU0xPVCgiX19yZXByX18iLCB0cF9yZXByLCBzbG90X3RwX3JlcHIsIHdyYXBfdW5hcnlmdW5jLAorICAgICAgICAgICAieC5fX3JlcHJfXygpIDw9PT4gcmVwcih4KSIpLAorICAgIFRQU0xPVCgiX19yZXByX18iLCB0cF9wcmludCwgTlVMTCwgTlVMTCwgIiIpLAorICAgIFRQU0xPVCgiX19jbXBfXyIsIHRwX2NvbXBhcmUsIF9QeU9iamVjdF9TbG90Q29tcGFyZSwgd3JhcF9jbXBmdW5jLAorICAgICAgICAgICAieC5fX2NtcF9fKHkpIDw9PT4gY21wKHgseSkiKSwKKyAgICBUUFNMT1QoIl9faGFzaF9fIiwgdHBfaGFzaCwgc2xvdF90cF9oYXNoLCB3cmFwX2hhc2hmdW5jLAorICAgICAgICAgICAieC5fX2hhc2hfXygpIDw9PT4gaGFzaCh4KSIpLAorICAgIEZMU0xPVCgiX19jYWxsX18iLCB0cF9jYWxsLCBzbG90X3RwX2NhbGwsICh3cmFwcGVyZnVuYyl3cmFwX2NhbGwsCisgICAgICAgICAgICJ4Ll9fY2FsbF9fKC4uLikgPD09PiB4KC4uLikiLCBQeVdyYXBwZXJGbGFnX0tFWVdPUkRTKSwKKyAgICBUUFNMT1QoIl9fZ2V0YXR0cmlidXRlX18iLCB0cF9nZXRhdHRybywgc2xvdF90cF9nZXRhdHRyX2hvb2ssCisgICAgICAgICAgIHdyYXBfYmluYXJ5ZnVuYywgInguX19nZXRhdHRyaWJ1dGVfXygnbmFtZScpIDw9PT4geC5uYW1lIiksCisgICAgVFBTTE9UKCJfX2dldGF0dHJpYnV0ZV9fIiwgdHBfZ2V0YXR0ciwgTlVMTCwgTlVMTCwgIiIpLAorICAgIFRQU0xPVCgiX19nZXRhdHRyX18iLCB0cF9nZXRhdHRybywgc2xvdF90cF9nZXRhdHRyX2hvb2ssIE5VTEwsICIiKSwKKyAgICBUUFNMT1QoIl9fZ2V0YXR0cl9fIiwgdHBfZ2V0YXR0ciwgTlVMTCwgTlVMTCwgIiIpLAorICAgIFRQU0xPVCgiX19zZXRhdHRyX18iLCB0cF9zZXRhdHRybywgc2xvdF90cF9zZXRhdHRybywgd3JhcF9zZXRhdHRyLAorICAgICAgICAgICAieC5fX3NldGF0dHJfXygnbmFtZScsIHZhbHVlKSA8PT0+IHgubmFtZSA9IHZhbHVlIiksCisgICAgVFBTTE9UKCJfX3NldGF0dHJfXyIsIHRwX3NldGF0dHIsIE5VTEwsIE5VTEwsICIiKSwKKyAgICBUUFNMT1QoIl9fZGVsYXR0cl9fIiwgdHBfc2V0YXR0cm8sIHNsb3RfdHBfc2V0YXR0cm8sIHdyYXBfZGVsYXR0ciwKKyAgICAgICAgICAgInguX19kZWxhdHRyX18oJ25hbWUnKSA8PT0+IGRlbCB4Lm5hbWUiKSwKKyAgICBUUFNMT1QoIl9fZGVsYXR0cl9fIiwgdHBfc2V0YXR0ciwgTlVMTCwgTlVMTCwgIiIpLAorICAgIFRQU0xPVCgiX19sdF9fIiwgdHBfcmljaGNvbXBhcmUsIHNsb3RfdHBfcmljaGNvbXBhcmUsIHJpY2hjbXBfbHQsCisgICAgICAgICAgICJ4Ll9fbHRfXyh5KSA8PT0+IHg8eSIpLAorICAgIFRQU0xPVCgiX19sZV9fIiwgdHBfcmljaGNvbXBhcmUsIHNsb3RfdHBfcmljaGNvbXBhcmUsIHJpY2hjbXBfbGUsCisgICAgICAgICAgICJ4Ll9fbGVfXyh5KSA8PT0+IHg8PXkiKSwKKyAgICBUUFNMT1QoIl9fZXFfXyIsIHRwX3JpY2hjb21wYXJlLCBzbG90X3RwX3JpY2hjb21wYXJlLCByaWNoY21wX2VxLAorICAgICAgICAgICAieC5fX2VxX18oeSkgPD09PiB4PT15IiksCisgICAgVFBTTE9UKCJfX25lX18iLCB0cF9yaWNoY29tcGFyZSwgc2xvdF90cF9yaWNoY29tcGFyZSwgcmljaGNtcF9uZSwKKyAgICAgICAgICAgInguX19uZV9fKHkpIDw9PT4geCE9eSIpLAorICAgIFRQU0xPVCgiX19ndF9fIiwgdHBfcmljaGNvbXBhcmUsIHNsb3RfdHBfcmljaGNvbXBhcmUsIHJpY2hjbXBfZ3QsCisgICAgICAgICAgICJ4Ll9fZ3RfXyh5KSA8PT0+IHg+eSIpLAorICAgIFRQU0xPVCgiX19nZV9fIiwgdHBfcmljaGNvbXBhcmUsIHNsb3RfdHBfcmljaGNvbXBhcmUsIHJpY2hjbXBfZ2UsCisgICAgICAgICAgICJ4Ll9fZ2VfXyh5KSA8PT0+IHg+PXkiKSwKKyAgICBUUFNMT1QoIl9faXRlcl9fIiwgdHBfaXRlciwgc2xvdF90cF9pdGVyLCB3cmFwX3VuYXJ5ZnVuYywKKyAgICAgICAgICAgInguX19pdGVyX18oKSA8PT0+IGl0ZXIoeCkiKSwKKyAgICBUUFNMT1QoIm5leHQiLCB0cF9pdGVybmV4dCwgc2xvdF90cF9pdGVybmV4dCwgd3JhcF9uZXh0LAorICAgICAgICAgICAieC5uZXh0KCkgLT4gdGhlIG5leHQgdmFsdWUsIG9yIHJhaXNlIFN0b3BJdGVyYXRpb24iKSwKKyAgICBUUFNMT1QoIl9fZ2V0X18iLCB0cF9kZXNjcl9nZXQsIHNsb3RfdHBfZGVzY3JfZ2V0LCB3cmFwX2Rlc2NyX2dldCwKKyAgICAgICAgICAgImRlc2NyLl9fZ2V0X18ob2JqWywgdHlwZV0pIC0+IHZhbHVlIiksCisgICAgVFBTTE9UKCJfX3NldF9fIiwgdHBfZGVzY3Jfc2V0LCBzbG90X3RwX2Rlc2NyX3NldCwgd3JhcF9kZXNjcl9zZXQsCisgICAgICAgICAgICJkZXNjci5fX3NldF9fKG9iaiwgdmFsdWUpIiksCisgICAgVFBTTE9UKCJfX2RlbGV0ZV9fIiwgdHBfZGVzY3Jfc2V0LCBzbG90X3RwX2Rlc2NyX3NldCwKKyAgICAgICAgICAgd3JhcF9kZXNjcl9kZWxldGUsICJkZXNjci5fX2RlbGV0ZV9fKG9iaikiKSwKKyAgICBGTFNMT1QoIl9faW5pdF9fIiwgdHBfaW5pdCwgc2xvdF90cF9pbml0LCAod3JhcHBlcmZ1bmMpd3JhcF9pbml0LAorICAgICAgICAgICAieC5fX2luaXRfXyguLi4pIGluaXRpYWxpemVzIHg7ICIKKyAgICAgICAgICAgInNlZSB4Ll9fY2xhc3NfXy5fX2RvY19fIGZvciBzaWduYXR1cmUiLAorICAgICAgICAgICBQeVdyYXBwZXJGbGFnX0tFWVdPUkRTKSwKKyAgICBUUFNMT1QoIl9fbmV3X18iLCB0cF9uZXcsIHNsb3RfdHBfbmV3LCBOVUxMLCAiIiksCisgICAgVFBTTE9UKCJfX2RlbF9fIiwgdHBfZGVsLCBzbG90X3RwX2RlbCwgTlVMTCwgIiIpLAorICAgIHtOVUxMfQogfTsKIAogLyogR2l2ZW4gYSB0eXBlIHBvaW50ZXIgYW5kIGFuIG9mZnNldCBnb3R0ZW4gZnJvbSBhIHNsb3RkZWYgZW50cnksIHJldHVybiBhCi0gICBwb2ludGVyIHRvIHRoZSBhY3R1YWwgc2xvdC4JVGhpcyBpcyBub3QgcXVpdGUgdGhlIHNhbWUgYXMgc2ltcGx5IGFkZGluZworICAgcG9pbnRlciB0byB0aGUgYWN0dWFsIHNsb3QuICBUaGlzIGlzIG5vdCBxdWl0ZSB0aGUgc2FtZSBhcyBzaW1wbHkgYWRkaW5nCiAgICB0aGUgb2Zmc2V0IHRvIHRoZSB0eXBlIHBvaW50ZXIsIHNpbmNlIGl0IHRha2VzIGNhcmUgdG8gaW5kaXJlY3QgdGhyb3VnaCB0aGUKICAgIHByb3BlciBpbmRpcmVjdGlvbiBwb2ludGVyIChhc19idWZmZXIsIGV0Yy4pOyBpdCByZXR1cm5zIE5VTEwgaWYgdGhlCiAgICBpbmRpcmVjdGlvbiBwb2ludGVyIGlzIE5VTEwuICovCiBzdGF0aWMgdm9pZCAqKgogc2xvdHB0cihQeVR5cGVPYmplY3QgKnR5cGUsIGludCBpb2Zmc2V0KQogewotCWNoYXIgKnB0cjsKLQlsb25nIG9mZnNldCA9IGlvZmZzZXQ7CisgICAgY2hhciAqcHRyOworICAgIGxvbmcgb2Zmc2V0ID0gaW9mZnNldDsKIAotCS8qIE5vdGU6IHRoaXMgZGVwZW5kcyBvbiB0aGUgb3JkZXIgb2YgdGhlIG1lbWJlcnMgb2YgUHlIZWFwVHlwZU9iamVjdCEgKi8KLQlhc3NlcnQob2Zmc2V0ID49IDApOwotCWFzc2VydCgoc2l6ZV90KW9mZnNldCA8IG9mZnNldG9mKFB5SGVhcFR5cGVPYmplY3QsIGFzX2J1ZmZlcikpOwotCWlmICgoc2l6ZV90KW9mZnNldCA+PSBvZmZzZXRvZihQeUhlYXBUeXBlT2JqZWN0LCBhc19zZXF1ZW5jZSkpIHsKLQkJcHRyID0gKGNoYXIgKil0eXBlLT50cF9hc19zZXF1ZW5jZTsKLQkJb2Zmc2V0IC09IG9mZnNldG9mKFB5SGVhcFR5cGVPYmplY3QsIGFzX3NlcXVlbmNlKTsKLQl9Ci0JZWxzZSBpZiAoKHNpemVfdClvZmZzZXQgPj0gb2Zmc2V0b2YoUHlIZWFwVHlwZU9iamVjdCwgYXNfbWFwcGluZykpIHsKLQkJcHRyID0gKGNoYXIgKil0eXBlLT50cF9hc19tYXBwaW5nOwotCQlvZmZzZXQgLT0gb2Zmc2V0b2YoUHlIZWFwVHlwZU9iamVjdCwgYXNfbWFwcGluZyk7Ci0JfQotCWVsc2UgaWYgKChzaXplX3Qpb2Zmc2V0ID49IG9mZnNldG9mKFB5SGVhcFR5cGVPYmplY3QsIGFzX251bWJlcikpIHsKLQkJcHRyID0gKGNoYXIgKil0eXBlLT50cF9hc19udW1iZXI7Ci0JCW9mZnNldCAtPSBvZmZzZXRvZihQeUhlYXBUeXBlT2JqZWN0LCBhc19udW1iZXIpOwotCX0KLQllbHNlIHsKLQkJcHRyID0gKGNoYXIgKil0eXBlOwotCX0KLQlpZiAocHRyICE9IE5VTEwpCi0JCXB0ciArPSBvZmZzZXQ7Ci0JcmV0dXJuICh2b2lkICoqKXB0cjsKKyAgICAvKiBOb3RlOiB0aGlzIGRlcGVuZHMgb24gdGhlIG9yZGVyIG9mIHRoZSBtZW1iZXJzIG9mIFB5SGVhcFR5cGVPYmplY3QhICovCisgICAgYXNzZXJ0KG9mZnNldCA+PSAwKTsKKyAgICBhc3NlcnQoKHNpemVfdClvZmZzZXQgPCBvZmZzZXRvZihQeUhlYXBUeXBlT2JqZWN0LCBhc19idWZmZXIpKTsKKyAgICBpZiAoKHNpemVfdClvZmZzZXQgPj0gb2Zmc2V0b2YoUHlIZWFwVHlwZU9iamVjdCwgYXNfc2VxdWVuY2UpKSB7CisgICAgICAgIHB0ciA9IChjaGFyICopdHlwZS0+dHBfYXNfc2VxdWVuY2U7CisgICAgICAgIG9mZnNldCAtPSBvZmZzZXRvZihQeUhlYXBUeXBlT2JqZWN0LCBhc19zZXF1ZW5jZSk7CisgICAgfQorICAgIGVsc2UgaWYgKChzaXplX3Qpb2Zmc2V0ID49IG9mZnNldG9mKFB5SGVhcFR5cGVPYmplY3QsIGFzX21hcHBpbmcpKSB7CisgICAgICAgIHB0ciA9IChjaGFyICopdHlwZS0+dHBfYXNfbWFwcGluZzsKKyAgICAgICAgb2Zmc2V0IC09IG9mZnNldG9mKFB5SGVhcFR5cGVPYmplY3QsIGFzX21hcHBpbmcpOworICAgIH0KKyAgICBlbHNlIGlmICgoc2l6ZV90KW9mZnNldCA+PSBvZmZzZXRvZihQeUhlYXBUeXBlT2JqZWN0LCBhc19udW1iZXIpKSB7CisgICAgICAgIHB0ciA9IChjaGFyICopdHlwZS0+dHBfYXNfbnVtYmVyOworICAgICAgICBvZmZzZXQgLT0gb2Zmc2V0b2YoUHlIZWFwVHlwZU9iamVjdCwgYXNfbnVtYmVyKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHB0ciA9IChjaGFyICopdHlwZTsKKyAgICB9CisgICAgaWYgKHB0ciAhPSBOVUxMKQorICAgICAgICBwdHIgKz0gb2Zmc2V0OworICAgIHJldHVybiAodm9pZCAqKilwdHI7CiB9CiAKIC8qIExlbmd0aCBvZiBhcnJheSBvZiBzbG90ZGVmIHBvaW50ZXJzIHVzZWQgdG8gc3RvcmUgc2xvdHMgd2l0aCB0aGUKQEAgLTYwMzgsMzcgKzYwMzgsMzcgQEAKIHN0YXRpYyB2b2lkICoqCiByZXNvbHZlX3Nsb3RkdXBzKFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKm5hbWUpCiB7Ci0JLyogWFhYIE1heWJlIHRoaXMgY291bGQgYmUgb3B0aW1pemVkIG1vcmUgLS0gYnV0IGlzIGl0IHdvcnRoIGl0PyAqLworICAgIC8qIFhYWCBNYXliZSB0aGlzIGNvdWxkIGJlIG9wdGltaXplZCBtb3JlIC0tIGJ1dCBpcyBpdCB3b3J0aCBpdD8gKi8KIAotCS8qIHBuYW1lIGFuZCBwdHJzIGFjdCBhcyBhIGxpdHRsZSBjYWNoZSAqLwotCXN0YXRpYyBQeU9iamVjdCAqcG5hbWU7Ci0Jc3RhdGljIHNsb3RkZWYgKnB0cnNbTUFYX0VRVUlWXTsKLQlzbG90ZGVmICpwLCAqKnBwOwotCXZvaWQgKipyZXMsICoqcHRyOworICAgIC8qIHBuYW1lIGFuZCBwdHJzIGFjdCBhcyBhIGxpdHRsZSBjYWNoZSAqLworICAgIHN0YXRpYyBQeU9iamVjdCAqcG5hbWU7CisgICAgc3RhdGljIHNsb3RkZWYgKnB0cnNbTUFYX0VRVUlWXTsKKyAgICBzbG90ZGVmICpwLCAqKnBwOworICAgIHZvaWQgKipyZXMsICoqcHRyOwogCi0JaWYgKHBuYW1lICE9IG5hbWUpIHsKLQkJLyogQ29sbGVjdCBhbGwgc2xvdGRlZnMgdGhhdCBtYXRjaCBuYW1lIGludG8gcHRycy4gKi8KLQkJcG5hbWUgPSBuYW1lOwotCQlwcCA9IHB0cnM7Ci0JCWZvciAocCA9IHNsb3RkZWZzOyBwLT5uYW1lX3N0cm9iajsgcCsrKSB7Ci0JCQlpZiAocC0+bmFtZV9zdHJvYmogPT0gbmFtZSkKLQkJCQkqcHArKyA9IHA7Ci0JCX0KLQkJKnBwID0gTlVMTDsKLQl9CisgICAgaWYgKHBuYW1lICE9IG5hbWUpIHsKKyAgICAgICAgLyogQ29sbGVjdCBhbGwgc2xvdGRlZnMgdGhhdCBtYXRjaCBuYW1lIGludG8gcHRycy4gKi8KKyAgICAgICAgcG5hbWUgPSBuYW1lOworICAgICAgICBwcCA9IHB0cnM7CisgICAgICAgIGZvciAocCA9IHNsb3RkZWZzOyBwLT5uYW1lX3N0cm9iajsgcCsrKSB7CisgICAgICAgICAgICBpZiAocC0+bmFtZV9zdHJvYmogPT0gbmFtZSkKKyAgICAgICAgICAgICAgICAqcHArKyA9IHA7CisgICAgICAgIH0KKyAgICAgICAgKnBwID0gTlVMTDsKKyAgICB9CiAKLQkvKiBMb29rIGluIGFsbCBtYXRjaGluZyBzbG90cyBvZiB0aGUgdHlwZTsgaWYgZXhhY3RseSBvbmUgb2YgdGhlc2UgaGFzCi0JICAgYSBmaWxsZWQtaW4gc2xvdCwgcmV0dXJuIGl0cyB2YWx1ZS4JT3RoZXJ3aXNlIHJldHVybiBOVUxMLiAqLwotCXJlcyA9IE5VTEw7Ci0JZm9yIChwcCA9IHB0cnM7ICpwcDsgcHArKykgewotCQlwdHIgPSBzbG90cHRyKHR5cGUsICgqcHApLT5vZmZzZXQpOwotCQlpZiAocHRyID09IE5VTEwgfHwgKnB0ciA9PSBOVUxMKQotCQkJY29udGludWU7Ci0JCWlmIChyZXMgIT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQlyZXMgPSBwdHI7Ci0JfQotCXJldHVybiByZXM7CisgICAgLyogTG9vayBpbiBhbGwgbWF0Y2hpbmcgc2xvdHMgb2YgdGhlIHR5cGU7IGlmIGV4YWN0bHkgb25lIG9mIHRoZXNlIGhhcworICAgICAgIGEgZmlsbGVkLWluIHNsb3QsIHJldHVybiBpdHMgdmFsdWUuICAgICAgT3RoZXJ3aXNlIHJldHVybiBOVUxMLiAqLworICAgIHJlcyA9IE5VTEw7CisgICAgZm9yIChwcCA9IHB0cnM7ICpwcDsgcHArKykgeworICAgICAgICBwdHIgPSBzbG90cHRyKHR5cGUsICgqcHApLT5vZmZzZXQpOworICAgICAgICBpZiAocHRyID09IE5VTEwgfHwgKnB0ciA9PSBOVUxMKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmIChyZXMgIT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICByZXMgPSBwdHI7CisgICAgfQorICAgIHJldHVybiByZXM7CiB9CiAKIC8qIENvbW1vbiBjb2RlIGZvciB1cGRhdGVfc2xvdHNfY2FsbGJhY2soKSBhbmQgZml4dXBfc2xvdF9kaXNwYXRjaGVycygpLiAgVGhpcwpAQCAtNjA4MCw3NyArNjA4MCw3NyBAQAogc3RhdGljIHNsb3RkZWYgKgogdXBkYXRlX29uZV9zbG90KFB5VHlwZU9iamVjdCAqdHlwZSwgc2xvdGRlZiAqcCkKIHsKLQlQeU9iamVjdCAqZGVzY3I7Ci0JUHlXcmFwcGVyRGVzY3JPYmplY3QgKmQ7Ci0Jdm9pZCAqZ2VuZXJpYyA9IE5VTEwsICpzcGVjaWZpYyA9IE5VTEw7Ci0JaW50IHVzZV9nZW5lcmljID0gMDsKLQlpbnQgb2Zmc2V0ID0gcC0+b2Zmc2V0OwotCXZvaWQgKipwdHIgPSBzbG90cHRyKHR5cGUsIG9mZnNldCk7CisgICAgUHlPYmplY3QgKmRlc2NyOworICAgIFB5V3JhcHBlckRlc2NyT2JqZWN0ICpkOworICAgIHZvaWQgKmdlbmVyaWMgPSBOVUxMLCAqc3BlY2lmaWMgPSBOVUxMOworICAgIGludCB1c2VfZ2VuZXJpYyA9IDA7CisgICAgaW50IG9mZnNldCA9IHAtPm9mZnNldDsKKyAgICB2b2lkICoqcHRyID0gc2xvdHB0cih0eXBlLCBvZmZzZXQpOwogCi0JaWYgKHB0ciA9PSBOVUxMKSB7Ci0JCWRvIHsKLQkJCSsrcDsKLQkJfSB3aGlsZSAocC0+b2Zmc2V0ID09IG9mZnNldCk7Ci0JCXJldHVybiBwOwotCX0KLQlkbyB7Ci0JCWRlc2NyID0gX1B5VHlwZV9Mb29rdXAodHlwZSwgcC0+bmFtZV9zdHJvYmopOwotCQlpZiAoZGVzY3IgPT0gTlVMTCkKLQkJCWNvbnRpbnVlOwotCQlpZiAoUHlfVFlQRShkZXNjcikgPT0gJlB5V3JhcHBlckRlc2NyX1R5cGUpIHsKLQkJCXZvaWQgKip0cHRyID0gcmVzb2x2ZV9zbG90ZHVwcyh0eXBlLCBwLT5uYW1lX3N0cm9iaik7Ci0JCQlpZiAodHB0ciA9PSBOVUxMIHx8IHRwdHIgPT0gcHRyKQotCQkJCWdlbmVyaWMgPSBwLT5mdW5jdGlvbjsKLQkJCWQgPSAoUHlXcmFwcGVyRGVzY3JPYmplY3QgKilkZXNjcjsKLQkJCWlmIChkLT5kX2Jhc2UtPndyYXBwZXIgPT0gcC0+d3JhcHBlciAmJgotCQkJICAgIFB5VHlwZV9Jc1N1YnR5cGUodHlwZSwgZC0+ZF90eXBlKSkKLQkJCXsKLQkJCQlpZiAoc3BlY2lmaWMgPT0gTlVMTCB8fAotCQkJCSAgICBzcGVjaWZpYyA9PSBkLT5kX3dyYXBwZWQpCi0JCQkJCXNwZWNpZmljID0gZC0+ZF93cmFwcGVkOwotCQkJCWVsc2UKLQkJCQkJdXNlX2dlbmVyaWMgPSAxOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKFB5X1RZUEUoZGVzY3IpID09ICZQeUNGdW5jdGlvbl9UeXBlICYmCi0JCQkgUHlDRnVuY3Rpb25fR0VUX0ZVTkNUSU9OKGRlc2NyKSA9PQotCQkJIChQeUNGdW5jdGlvbil0cF9uZXdfd3JhcHBlciAmJgotCQkJIHN0cmNtcChwLT5uYW1lLCAiX19uZXdfXyIpID09IDApCi0JCXsKLQkJCS8qIFRoZSBfX25ld19fIHdyYXBwZXIgaXMgbm90IGEgd3JhcHBlciBkZXNjcmlwdG9yLAotCQkJICAgc28gbXVzdCBiZSBzcGVjaWFsLWNhc2VkIGRpZmZlcmVudGx5LgotCQkJICAgSWYgd2UgZG9uJ3QgZG8gdGhpcywgY3JlYXRpbmcgYW4gaW5zdGFuY2Ugd2lsbAotCQkJICAgYWx3YXlzIHVzZSBzbG90X3RwX25ldyB3aGljaCB3aWxsIGxvb2sgdXAKLQkJCSAgIF9fbmV3X18gaW4gdGhlIE1STyB3aGljaCB3aWxsIGNhbGwgdHBfbmV3X3dyYXBwZXIKLQkJCSAgIHdoaWNoIHdpbGwgbG9vayB0aHJvdWdoIHRoZSBiYXNlIGNsYXNzZXMgbG9va2luZwotCQkJICAgZm9yIGEgc3RhdGljIGJhc2UgYW5kIGNhbGwgaXRzIHRwX25ldyAodXN1YWxseQotCQkJICAgUHlUeXBlX0dlbmVyaWNOZXcpLCBhZnRlciBwZXJmb3JtaW5nIHZhcmlvdXMKLQkJCSAgIHNhbml0eSBjaGVja3MgYW5kIGNvbnN0cnVjdGluZyBhIG5ldyBhcmd1bWVudAotCQkJICAgbGlzdC4gIEN1dCBhbGwgdGhhdCBub25zZW5zZSBzaG9ydCAtLSB0aGlzIHNwZWVkcwotCQkJICAgdXAgaW5zdGFuY2UgY3JlYXRpb24gdHJlbWVuZG91c2x5LiAqLwotCQkJc3BlY2lmaWMgPSAodm9pZCAqKXR5cGUtPnRwX25ldzsKLQkJCS8qIFhYWCBJJ20gbm90IDEwMCUgc3VyZSB0aGF0IHRoZXJlIGlzbid0IGEgaG9sZQotCQkJICAgaW4gdGhpcyByZWFzb25pbmcgdGhhdCByZXF1aXJlcyBhZGRpdGlvbmFsCi0JCQkgICBzYW5pdHkgY2hlY2tzLiAgSSdsbCBidXkgdGhlIGZpcnN0IHBlcnNvbiB0bwotCQkJICAgcG9pbnQgb3V0IGEgYnVnIGluIHRoaXMgcmVhc29uaW5nIGEgYmVlci4gKi8KLQkJfQotCQllbHNlIGlmIChkZXNjciA9PSBQeV9Ob25lICYmCi0JCQkgc3RyY21wKHAtPm5hbWUsICJfX2hhc2hfXyIpID09IDApIHsKLQkJCS8qIFdlIHNwZWNpZmljYWxseSBhbGxvdyBfX2hhc2hfXyB0byBiZSBzZXQgdG8gTm9uZQotCQkJICAgdG8gcHJldmVudCBpbmhlcml0YW5jZSBvZiB0aGUgZGVmYXVsdAotCQkJICAgaW1wbGVtZW50YXRpb24gZnJvbSBvYmplY3QuX19oYXNoX18gKi8KLQkJCXNwZWNpZmljID0gUHlPYmplY3RfSGFzaE5vdEltcGxlbWVudGVkOwotCQl9Ci0JCWVsc2UgewotCQkJdXNlX2dlbmVyaWMgPSAxOwotCQkJZ2VuZXJpYyA9IHAtPmZ1bmN0aW9uOwotCQl9Ci0JfSB3aGlsZSAoKCsrcCktPm9mZnNldCA9PSBvZmZzZXQpOwotCWlmIChzcGVjaWZpYyAmJiAhdXNlX2dlbmVyaWMpCi0JCSpwdHIgPSBzcGVjaWZpYzsKLQllbHNlCi0JCSpwdHIgPSBnZW5lcmljOwotCXJldHVybiBwOworICAgIGlmIChwdHIgPT0gTlVMTCkgeworICAgICAgICBkbyB7CisgICAgICAgICAgICArK3A7CisgICAgICAgIH0gd2hpbGUgKHAtPm9mZnNldCA9PSBvZmZzZXQpOworICAgICAgICByZXR1cm4gcDsKKyAgICB9CisgICAgZG8geworICAgICAgICBkZXNjciA9IF9QeVR5cGVfTG9va3VwKHR5cGUsIHAtPm5hbWVfc3Ryb2JqKTsKKyAgICAgICAgaWYgKGRlc2NyID09IE5VTEwpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKFB5X1RZUEUoZGVzY3IpID09ICZQeVdyYXBwZXJEZXNjcl9UeXBlKSB7CisgICAgICAgICAgICB2b2lkICoqdHB0ciA9IHJlc29sdmVfc2xvdGR1cHModHlwZSwgcC0+bmFtZV9zdHJvYmopOworICAgICAgICAgICAgaWYgKHRwdHIgPT0gTlVMTCB8fCB0cHRyID09IHB0cikKKyAgICAgICAgICAgICAgICBnZW5lcmljID0gcC0+ZnVuY3Rpb247CisgICAgICAgICAgICBkID0gKFB5V3JhcHBlckRlc2NyT2JqZWN0ICopZGVzY3I7CisgICAgICAgICAgICBpZiAoZC0+ZF9iYXNlLT53cmFwcGVyID09IHAtPndyYXBwZXIgJiYKKyAgICAgICAgICAgICAgICBQeVR5cGVfSXNTdWJ0eXBlKHR5cGUsIGQtPmRfdHlwZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHNwZWNpZmljID09IE5VTEwgfHwKKyAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWMgPT0gZC0+ZF93cmFwcGVkKQorICAgICAgICAgICAgICAgICAgICBzcGVjaWZpYyA9IGQtPmRfd3JhcHBlZDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHVzZV9nZW5lcmljID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChQeV9UWVBFKGRlc2NyKSA9PSAmUHlDRnVuY3Rpb25fVHlwZSAmJgorICAgICAgICAgICAgICAgICBQeUNGdW5jdGlvbl9HRVRfRlVOQ1RJT04oZGVzY3IpID09CisgICAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbil0cF9uZXdfd3JhcHBlciAmJgorICAgICAgICAgICAgICAgICBzdHJjbXAocC0+bmFtZSwgIl9fbmV3X18iKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBUaGUgX19uZXdfXyB3cmFwcGVyIGlzIG5vdCBhIHdyYXBwZXIgZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgIHNvIG11c3QgYmUgc3BlY2lhbC1jYXNlZCBkaWZmZXJlbnRseS4KKyAgICAgICAgICAgICAgIElmIHdlIGRvbid0IGRvIHRoaXMsIGNyZWF0aW5nIGFuIGluc3RhbmNlIHdpbGwKKyAgICAgICAgICAgICAgIGFsd2F5cyB1c2Ugc2xvdF90cF9uZXcgd2hpY2ggd2lsbCBsb29rIHVwCisgICAgICAgICAgICAgICBfX25ld19fIGluIHRoZSBNUk8gd2hpY2ggd2lsbCBjYWxsIHRwX25ld193cmFwcGVyCisgICAgICAgICAgICAgICB3aGljaCB3aWxsIGxvb2sgdGhyb3VnaCB0aGUgYmFzZSBjbGFzc2VzIGxvb2tpbmcKKyAgICAgICAgICAgICAgIGZvciBhIHN0YXRpYyBiYXNlIGFuZCBjYWxsIGl0cyB0cF9uZXcgKHVzdWFsbHkKKyAgICAgICAgICAgICAgIFB5VHlwZV9HZW5lcmljTmV3KSwgYWZ0ZXIgcGVyZm9ybWluZyB2YXJpb3VzCisgICAgICAgICAgICAgICBzYW5pdHkgY2hlY2tzIGFuZCBjb25zdHJ1Y3RpbmcgYSBuZXcgYXJndW1lbnQKKyAgICAgICAgICAgICAgIGxpc3QuICBDdXQgYWxsIHRoYXQgbm9uc2Vuc2Ugc2hvcnQgLS0gdGhpcyBzcGVlZHMKKyAgICAgICAgICAgICAgIHVwIGluc3RhbmNlIGNyZWF0aW9uIHRyZW1lbmRvdXNseS4gKi8KKyAgICAgICAgICAgIHNwZWNpZmljID0gKHZvaWQgKil0eXBlLT50cF9uZXc7CisgICAgICAgICAgICAvKiBYWFggSSdtIG5vdCAxMDAlIHN1cmUgdGhhdCB0aGVyZSBpc24ndCBhIGhvbGUKKyAgICAgICAgICAgICAgIGluIHRoaXMgcmVhc29uaW5nIHRoYXQgcmVxdWlyZXMgYWRkaXRpb25hbAorICAgICAgICAgICAgICAgc2FuaXR5IGNoZWNrcy4gIEknbGwgYnV5IHRoZSBmaXJzdCBwZXJzb24gdG8KKyAgICAgICAgICAgICAgIHBvaW50IG91dCBhIGJ1ZyBpbiB0aGlzIHJlYXNvbmluZyBhIGJlZXIuICovCisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoZGVzY3IgPT0gUHlfTm9uZSAmJgorICAgICAgICAgICAgICAgICBzdHJjbXAocC0+bmFtZSwgIl9faGFzaF9fIikgPT0gMCkgeworICAgICAgICAgICAgLyogV2Ugc3BlY2lmaWNhbGx5IGFsbG93IF9faGFzaF9fIHRvIGJlIHNldCB0byBOb25lCisgICAgICAgICAgICAgICB0byBwcmV2ZW50IGluaGVyaXRhbmNlIG9mIHRoZSBkZWZhdWx0CisgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBmcm9tIG9iamVjdC5fX2hhc2hfXyAqLworICAgICAgICAgICAgc3BlY2lmaWMgPSBQeU9iamVjdF9IYXNoTm90SW1wbGVtZW50ZWQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICB1c2VfZ2VuZXJpYyA9IDE7CisgICAgICAgICAgICBnZW5lcmljID0gcC0+ZnVuY3Rpb247CisgICAgICAgIH0KKyAgICB9IHdoaWxlICgoKytwKS0+b2Zmc2V0ID09IG9mZnNldCk7CisgICAgaWYgKHNwZWNpZmljICYmICF1c2VfZ2VuZXJpYykKKyAgICAgICAgKnB0ciA9IHNwZWNpZmljOworICAgIGVsc2UKKyAgICAgICAgKnB0ciA9IGdlbmVyaWM7CisgICAgcmV0dXJuIHA7CiB9CiAKIC8qIEluIHRoZSB0eXBlLCB1cGRhdGUgdGhlIHNsb3RzIHdob3NlIHNsb3RkZWZzIGFyZSBnYXRoZXJlZCBpbiB0aGUgcHAgYXJyYXkuCkBAIC02MTU4LDExICs2MTU4LDExIEBACiBzdGF0aWMgaW50CiB1cGRhdGVfc2xvdHNfY2FsbGJhY2soUHlUeXBlT2JqZWN0ICp0eXBlLCB2b2lkICpkYXRhKQogewotCXNsb3RkZWYgKipwcCA9IChzbG90ZGVmICoqKWRhdGE7CisgICAgc2xvdGRlZiAqKnBwID0gKHNsb3RkZWYgKiopZGF0YTsKIAotCWZvciAoOyAqcHA7IHBwKyspCi0JCXVwZGF0ZV9vbmVfc2xvdCh0eXBlLCAqcHApOwotCXJldHVybiAwOworICAgIGZvciAoOyAqcHA7IHBwKyspCisgICAgICAgIHVwZGF0ZV9vbmVfc2xvdCh0eXBlLCAqcHApOworICAgIHJldHVybiAwOwogfQogCiAvKiBDb21wYXJpc29uIGZ1bmN0aW9uIGZvciBxc29ydCgpIHRvIGNvbXBhcmUgc2xvdGRlZnMgYnkgdGhlaXIgb2Zmc2V0LCBhbmQKQEAgLTYxNzAsMTQgKzYxNzAsMTQgQEAKIHN0YXRpYyBpbnQKIHNsb3RkZWZfY21wKGNvbnN0IHZvaWQgKmFhLCBjb25zdCB2b2lkICpiYikKIHsKLQljb25zdCBzbG90ZGVmICphID0gKGNvbnN0IHNsb3RkZWYgKilhYSwgKmIgPSAoY29uc3Qgc2xvdGRlZiAqKWJiOwotCWludCBjID0gYS0+b2Zmc2V0IC0gYi0+b2Zmc2V0OwotCWlmIChjICE9IDApCi0JCXJldHVybiBjOwotCWVsc2UKLQkJLyogQ2Fubm90IHVzZSBhLWIsIGFzIHRoaXMgZ2l2ZXMgb2ZmX3QsIAotCQkgICB3aGljaCBtYXkgbG9zZSBwcmVjaXNpb24gd2hlbiBjb252ZXJ0ZWQgdG8gaW50LiAqLwotCQlyZXR1cm4gKGEgPiBiKSA/IDEgOiAoYSA8IGIpID8gLTEgOiAwOworICAgIGNvbnN0IHNsb3RkZWYgKmEgPSAoY29uc3Qgc2xvdGRlZiAqKWFhLCAqYiA9IChjb25zdCBzbG90ZGVmICopYmI7CisgICAgaW50IGMgPSBhLT5vZmZzZXQgLSBiLT5vZmZzZXQ7CisgICAgaWYgKGMgIT0gMCkKKyAgICAgICAgcmV0dXJuIGM7CisgICAgZWxzZQorICAgICAgICAvKiBDYW5ub3QgdXNlIGEtYiwgYXMgdGhpcyBnaXZlcyBvZmZfdCwKKyAgICAgICAgICAgd2hpY2ggbWF5IGxvc2UgcHJlY2lzaW9uIHdoZW4gY29udmVydGVkIHRvIGludC4gKi8KKyAgICAgICAgcmV0dXJuIChhID4gYikgPyAxIDogKGEgPCBiKSA/IC0xIDogMDsKIH0KIAogLyogSW5pdGlhbGl6ZSB0aGUgc2xvdGRlZnMgdGFibGUgYnkgYWRkaW5nIGludGVybmVkIHN0cmluZyBvYmplY3RzIGZvciB0aGUKQEAgLTYxODUsNTYgKzYxODUsNTYgQEAKIHN0YXRpYyB2b2lkCiBpbml0X3Nsb3RkZWZzKHZvaWQpCiB7Ci0Jc2xvdGRlZiAqcDsKLQlzdGF0aWMgaW50IGluaXRpYWxpemVkID0gMDsKKyAgICBzbG90ZGVmICpwOworICAgIHN0YXRpYyBpbnQgaW5pdGlhbGl6ZWQgPSAwOwogCi0JaWYgKGluaXRpYWxpemVkKQotCQlyZXR1cm47Ci0JZm9yIChwID0gc2xvdGRlZnM7IHAtPm5hbWU7IHArKykgewotCQlwLT5uYW1lX3N0cm9iaiA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcocC0+bmFtZSk7Ci0JCWlmICghcC0+bmFtZV9zdHJvYmopCi0JCQlQeV9GYXRhbEVycm9yKCJPdXQgb2YgbWVtb3J5IGludGVybmluZyBzbG90ZGVmIG5hbWVzIik7Ci0JfQotCXFzb3J0KCh2b2lkICopc2xvdGRlZnMsIChzaXplX3QpKHAtc2xvdGRlZnMpLCBzaXplb2Yoc2xvdGRlZiksCi0JICAgICAgc2xvdGRlZl9jbXApOwotCWluaXRpYWxpemVkID0gMTsKKyAgICBpZiAoaW5pdGlhbGl6ZWQpCisgICAgICAgIHJldHVybjsKKyAgICBmb3IgKHAgPSBzbG90ZGVmczsgcC0+bmFtZTsgcCsrKSB7CisgICAgICAgIHAtPm5hbWVfc3Ryb2JqID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZyhwLT5uYW1lKTsKKyAgICAgICAgaWYgKCFwLT5uYW1lX3N0cm9iaikKKyAgICAgICAgICAgIFB5X0ZhdGFsRXJyb3IoIk91dCBvZiBtZW1vcnkgaW50ZXJuaW5nIHNsb3RkZWYgbmFtZXMiKTsKKyAgICB9CisgICAgcXNvcnQoKHZvaWQgKilzbG90ZGVmcywgKHNpemVfdCkocC1zbG90ZGVmcyksIHNpemVvZihzbG90ZGVmKSwKKyAgICAgICAgICBzbG90ZGVmX2NtcCk7CisgICAgaW5pdGlhbGl6ZWQgPSAxOwogfQogCiAvKiBVcGRhdGUgdGhlIHNsb3RzIGFmdGVyIGFzc2lnbm1lbnQgdG8gYSBjbGFzcyAodHlwZSkgYXR0cmlidXRlLiAqLwogc3RhdGljIGludAogdXBkYXRlX3Nsb3QoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqbmFtZSkKIHsKLQlzbG90ZGVmICpwdHJzW01BWF9FUVVJVl07Ci0Jc2xvdGRlZiAqcDsKLQlzbG90ZGVmICoqcHA7Ci0JaW50IG9mZnNldDsKKyAgICBzbG90ZGVmICpwdHJzW01BWF9FUVVJVl07CisgICAgc2xvdGRlZiAqcDsKKyAgICBzbG90ZGVmICoqcHA7CisgICAgaW50IG9mZnNldDsKIAotCS8qIENsZWFyIHRoZSBWQUxJRF9WRVJTSU9OIGZsYWcgb2YgJ3R5cGUnIGFuZCBhbGwgaXRzCi0JICAgc3ViY2xhc3Nlcy4gIFRoaXMgY291bGQgcG9zc2libHkgYmUgdW5pZmllZCB3aXRoIHRoZQotCSAgIHVwZGF0ZV9zdWJjbGFzc2VzKCkgcmVjdXJzaW9uIGJlbG93LCBidXQgY2FyZWZ1bGx5OgotCSAgIHRoZXkgZWFjaCBoYXZlIHRoZWlyIG93biBjb25kaXRpb25zIG9uIHdoaWNoIHRvIHN0b3AKLQkgICByZWN1cnNpbmcgaW50byBzdWJjbGFzc2VzLiAqLwotCVB5VHlwZV9Nb2RpZmllZCh0eXBlKTsKKyAgICAvKiBDbGVhciB0aGUgVkFMSURfVkVSU0lPTiBmbGFnIG9mICd0eXBlJyBhbmQgYWxsIGl0cworICAgICAgIHN1YmNsYXNzZXMuICBUaGlzIGNvdWxkIHBvc3NpYmx5IGJlIHVuaWZpZWQgd2l0aCB0aGUKKyAgICAgICB1cGRhdGVfc3ViY2xhc3NlcygpIHJlY3Vyc2lvbiBiZWxvdywgYnV0IGNhcmVmdWxseToKKyAgICAgICB0aGV5IGVhY2ggaGF2ZSB0aGVpciBvd24gY29uZGl0aW9ucyBvbiB3aGljaCB0byBzdG9wCisgICAgICAgcmVjdXJzaW5nIGludG8gc3ViY2xhc3Nlcy4gKi8KKyAgICBQeVR5cGVfTW9kaWZpZWQodHlwZSk7CiAKLQlpbml0X3Nsb3RkZWZzKCk7Ci0JcHAgPSBwdHJzOwotCWZvciAocCA9IHNsb3RkZWZzOyBwLT5uYW1lOyBwKyspIHsKLQkJLyogWFhYIGFzc3VtZSBuYW1lIGlzIGludGVybmVkISAqLwotCQlpZiAocC0+bmFtZV9zdHJvYmogPT0gbmFtZSkKLQkJCSpwcCsrID0gcDsKLQl9Ci0JKnBwID0gTlVMTDsKLQlmb3IgKHBwID0gcHRyczsgKnBwOyBwcCsrKSB7Ci0JCXAgPSAqcHA7Ci0JCW9mZnNldCA9IHAtPm9mZnNldDsKLQkJd2hpbGUgKHAgPiBzbG90ZGVmcyAmJiAocC0xKS0+b2Zmc2V0ID09IG9mZnNldCkKLQkJCS0tcDsKLQkJKnBwID0gcDsKLQl9Ci0JaWYgKHB0cnNbMF0gPT0gTlVMTCkKLQkJcmV0dXJuIDA7IC8qIE5vdCBhbiBhdHRyaWJ1dGUgdGhhdCBhZmZlY3RzIGFueSBzbG90cyAqLwotCXJldHVybiB1cGRhdGVfc3ViY2xhc3Nlcyh0eXBlLCBuYW1lLAotCQkJCSB1cGRhdGVfc2xvdHNfY2FsbGJhY2ssICh2b2lkICopcHRycyk7CisgICAgaW5pdF9zbG90ZGVmcygpOworICAgIHBwID0gcHRyczsKKyAgICBmb3IgKHAgPSBzbG90ZGVmczsgcC0+bmFtZTsgcCsrKSB7CisgICAgICAgIC8qIFhYWCBhc3N1bWUgbmFtZSBpcyBpbnRlcm5lZCEgKi8KKyAgICAgICAgaWYgKHAtPm5hbWVfc3Ryb2JqID09IG5hbWUpCisgICAgICAgICAgICAqcHArKyA9IHA7CisgICAgfQorICAgICpwcCA9IE5VTEw7CisgICAgZm9yIChwcCA9IHB0cnM7ICpwcDsgcHArKykgeworICAgICAgICBwID0gKnBwOworICAgICAgICBvZmZzZXQgPSBwLT5vZmZzZXQ7CisgICAgICAgIHdoaWxlIChwID4gc2xvdGRlZnMgJiYgKHAtMSktPm9mZnNldCA9PSBvZmZzZXQpCisgICAgICAgICAgICAtLXA7CisgICAgICAgICpwcCA9IHA7CisgICAgfQorICAgIGlmIChwdHJzWzBdID09IE5VTEwpCisgICAgICAgIHJldHVybiAwOyAvKiBOb3QgYW4gYXR0cmlidXRlIHRoYXQgYWZmZWN0cyBhbnkgc2xvdHMgKi8KKyAgICByZXR1cm4gdXBkYXRlX3N1YmNsYXNzZXModHlwZSwgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlX3Nsb3RzX2NhbGxiYWNrLCAodm9pZCAqKXB0cnMpOwogfQogCiAvKiBTdG9yZSB0aGUgcHJvcGVyIGZ1bmN0aW9ucyBpbiB0aGUgc2xvdCBkaXNwYXRjaGVzIGF0IGNsYXNzICh0eXBlKQpAQCAtNjI0MywyMyArNjI0MywyMyBAQAogc3RhdGljIHZvaWQKIGZpeHVwX3Nsb3RfZGlzcGF0Y2hlcnMoUHlUeXBlT2JqZWN0ICp0eXBlKQogewotCXNsb3RkZWYgKnA7CisgICAgc2xvdGRlZiAqcDsKIAotCWluaXRfc2xvdGRlZnMoKTsKLQlmb3IgKHAgPSBzbG90ZGVmczsgcC0+bmFtZTsgKQotCQlwID0gdXBkYXRlX29uZV9zbG90KHR5cGUsIHApOworICAgIGluaXRfc2xvdGRlZnMoKTsKKyAgICBmb3IgKHAgPSBzbG90ZGVmczsgcC0+bmFtZTsgKQorICAgICAgICBwID0gdXBkYXRlX29uZV9zbG90KHR5cGUsIHApOwogfQogCiBzdGF0aWMgdm9pZAogdXBkYXRlX2FsbF9zbG90cyhQeVR5cGVPYmplY3QqIHR5cGUpCiB7Ci0Jc2xvdGRlZiAqcDsKKyAgICBzbG90ZGVmICpwOwogCi0JaW5pdF9zbG90ZGVmcygpOwotCWZvciAocCA9IHNsb3RkZWZzOyBwLT5uYW1lOyBwKyspIHsKLQkJLyogdXBkYXRlX3Nsb3QgcmV0dXJucyBpbnQgYnV0IGNhbid0IGFjdHVhbGx5IGZhaWwgKi8KLQkJdXBkYXRlX3Nsb3QodHlwZSwgcC0+bmFtZV9zdHJvYmopOwotCX0KKyAgICBpbml0X3Nsb3RkZWZzKCk7CisgICAgZm9yIChwID0gc2xvdGRlZnM7IHAtPm5hbWU7IHArKykgeworICAgICAgICAvKiB1cGRhdGVfc2xvdCByZXR1cm5zIGludCBidXQgY2FuJ3QgYWN0dWFsbHkgZmFpbCAqLworICAgICAgICB1cGRhdGVfc2xvdCh0eXBlLCBwLT5uYW1lX3N0cm9iaik7CisgICAgfQogfQogCiAvKiByZWN1cnNlX2Rvd25fc3ViY2xhc3NlcygpIGFuZCB1cGRhdGVfc3ViY2xhc3NlcygpIGFyZSBtdXR1YWxseQpAQCAtNjI2OCw1NiArNjI2OCw1NiBAQAogCiBzdGF0aWMgaW50CiB1cGRhdGVfc3ViY2xhc3NlcyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICpuYW1lLAotCQkgIHVwZGF0ZV9jYWxsYmFjayBjYWxsYmFjaywgdm9pZCAqZGF0YSkKKyAgICAgICAgICAgICAgICAgIHVwZGF0ZV9jYWxsYmFjayBjYWxsYmFjaywgdm9pZCAqZGF0YSkKIHsKLQlpZiAoY2FsbGJhY2sodHlwZSwgZGF0YSkgPCAwKQotCQlyZXR1cm4gLTE7Ci0JcmV0dXJuIHJlY3Vyc2VfZG93bl9zdWJjbGFzc2VzKHR5cGUsIG5hbWUsIGNhbGxiYWNrLCBkYXRhKTsKKyAgICBpZiAoY2FsbGJhY2sodHlwZSwgZGF0YSkgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisgICAgcmV0dXJuIHJlY3Vyc2VfZG93bl9zdWJjbGFzc2VzKHR5cGUsIG5hbWUsIGNhbGxiYWNrLCBkYXRhKTsKIH0KIAogc3RhdGljIGludAogcmVjdXJzZV9kb3duX3N1YmNsYXNzZXMoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqbmFtZSwKLQkJCXVwZGF0ZV9jYWxsYmFjayBjYWxsYmFjaywgdm9pZCAqZGF0YSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZV9jYWxsYmFjayBjYWxsYmFjaywgdm9pZCAqZGF0YSkKIHsKLQlQeVR5cGVPYmplY3QgKnN1YmNsYXNzOwotCVB5T2JqZWN0ICpyZWYsICpzdWJjbGFzc2VzLCAqZGljdDsKLQlQeV9zc2l6ZV90IGksIG47CisgICAgUHlUeXBlT2JqZWN0ICpzdWJjbGFzczsKKyAgICBQeU9iamVjdCAqcmVmLCAqc3ViY2xhc3NlcywgKmRpY3Q7CisgICAgUHlfc3NpemVfdCBpLCBuOwogCi0Jc3ViY2xhc3NlcyA9IHR5cGUtPnRwX3N1YmNsYXNzZXM7Ci0JaWYgKHN1YmNsYXNzZXMgPT0gTlVMTCkKLQkJcmV0dXJuIDA7Ci0JYXNzZXJ0KFB5TGlzdF9DaGVjayhzdWJjbGFzc2VzKSk7Ci0JbiA9IFB5TGlzdF9HRVRfU0laRShzdWJjbGFzc2VzKTsKLQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCXJlZiA9IFB5TGlzdF9HRVRfSVRFTShzdWJjbGFzc2VzLCBpKTsKLQkJYXNzZXJ0KFB5V2Vha3JlZl9DaGVja1JlZihyZWYpKTsKLQkJc3ViY2xhc3MgPSAoUHlUeXBlT2JqZWN0ICopUHlXZWFrcmVmX0dFVF9PQkpFQ1QocmVmKTsKLQkJYXNzZXJ0KHN1YmNsYXNzICE9IE5VTEwpOwotCQlpZiAoKFB5T2JqZWN0ICopc3ViY2xhc3MgPT0gUHlfTm9uZSkKLQkJCWNvbnRpbnVlOwotCQlhc3NlcnQoUHlUeXBlX0NoZWNrKHN1YmNsYXNzKSk7Ci0JCS8qIEF2b2lkIHJlY3Vyc2luZyBkb3duIGludG8gdW5hZmZlY3RlZCBjbGFzc2VzICovCi0JCWRpY3QgPSBzdWJjbGFzcy0+dHBfZGljdDsKLQkJaWYgKGRpY3QgIT0gTlVMTCAmJiBQeURpY3RfQ2hlY2soZGljdCkgJiYKLQkJICAgIFB5RGljdF9HZXRJdGVtKGRpY3QsIG5hbWUpICE9IE5VTEwpCi0JCQljb250aW51ZTsKLQkJaWYgKHVwZGF0ZV9zdWJjbGFzc2VzKHN1YmNsYXNzLCBuYW1lLCBjYWxsYmFjaywgZGF0YSkgPCAwKQotCQkJcmV0dXJuIC0xOwotCX0KLQlyZXR1cm4gMDsKKyAgICBzdWJjbGFzc2VzID0gdHlwZS0+dHBfc3ViY2xhc3NlczsKKyAgICBpZiAoc3ViY2xhc3NlcyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gMDsKKyAgICBhc3NlcnQoUHlMaXN0X0NoZWNrKHN1YmNsYXNzZXMpKTsKKyAgICBuID0gUHlMaXN0X0dFVF9TSVpFKHN1YmNsYXNzZXMpOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgcmVmID0gUHlMaXN0X0dFVF9JVEVNKHN1YmNsYXNzZXMsIGkpOworICAgICAgICBhc3NlcnQoUHlXZWFrcmVmX0NoZWNrUmVmKHJlZikpOworICAgICAgICBzdWJjbGFzcyA9IChQeVR5cGVPYmplY3QgKilQeVdlYWtyZWZfR0VUX09CSkVDVChyZWYpOworICAgICAgICBhc3NlcnQoc3ViY2xhc3MgIT0gTlVMTCk7CisgICAgICAgIGlmICgoUHlPYmplY3QgKilzdWJjbGFzcyA9PSBQeV9Ob25lKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGFzc2VydChQeVR5cGVfQ2hlY2soc3ViY2xhc3MpKTsKKyAgICAgICAgLyogQXZvaWQgcmVjdXJzaW5nIGRvd24gaW50byB1bmFmZmVjdGVkIGNsYXNzZXMgKi8KKyAgICAgICAgZGljdCA9IHN1YmNsYXNzLT50cF9kaWN0OworICAgICAgICBpZiAoZGljdCAhPSBOVUxMICYmIFB5RGljdF9DaGVjayhkaWN0KSAmJgorICAgICAgICAgICAgUHlEaWN0X0dldEl0ZW0oZGljdCwgbmFtZSkgIT0gTlVMTCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAodXBkYXRlX3N1YmNsYXNzZXMoc3ViY2xhc3MsIG5hbWUsIGNhbGxiYWNrLCBkYXRhKSA8IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiAwOwogfQogCiAvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBQeVR5cGVfUmVhZHkoKSB0byBwb3B1bGF0ZSB0aGUgdHlwZSdzCiAgICBkaWN0aW9uYXJ5IHdpdGggbWV0aG9kIGRlc2NyaXB0b3JzIGZvciBmdW5jdGlvbiBzbG90cy4gIEZvciBlYWNoCiAgICBmdW5jdGlvbiBzbG90IChsaWtlIHRwX3JlcHIpIHRoYXQncyBkZWZpbmVkIGluIHRoZSB0eXBlLCBvbmUgb3IgbW9yZQogICAgY29ycmVzcG9uZGluZyBkZXNjcmlwdG9ycyBhcmUgYWRkZWQgaW4gdGhlIHR5cGUncyB0cF9kaWN0IGRpY3Rpb25hcnkKLSAgIHVuZGVyIHRoZSBhcHByb3ByaWF0ZSBuYW1lIChsaWtlIF9fcmVwcl9fKS4JU29tZSBmdW5jdGlvbiBzbG90cworICAgdW5kZXIgdGhlIGFwcHJvcHJpYXRlIG5hbWUgKGxpa2UgX19yZXByX18pLiAgU29tZSBmdW5jdGlvbiBzbG90cwogICAgY2F1c2UgbW9yZSB0aGFuIG9uZSBkZXNjcmlwdG9yIHRvIGJlIGFkZGVkIChmb3IgZXhhbXBsZSwgdGhlIG5iX2FkZAogICAgc2xvdCBhZGRzIGJvdGggX19hZGRfXyBhbmQgX19yYWRkX18gZGVzY3JpcHRvcnMpIGFuZCBzb21lIGZ1bmN0aW9uCiAgICBzbG90cyBjb21wZXRlIGZvciB0aGUgc2FtZSBkZXNjcmlwdG9yIChmb3IgZXhhbXBsZSBib3RoIHNxX2l0ZW0gYW5kCiAgICBtcF9zdWJzY3JpcHQgZ2VuZXJhdGUgYSBfX2dldGl0ZW1fXyBkZXNjcmlwdG9yKS4KIAotICAgSW4gdGhlIGxhdHRlciBjYXNlLCB0aGUgZmlyc3Qgc2xvdGRlZiBlbnRyeSBlbmNvdXRlcmVkIHdpbnMuCSBTaW5jZQorICAgSW4gdGhlIGxhdHRlciBjYXNlLCB0aGUgZmlyc3Qgc2xvdGRlZiBlbnRyeSBlbmNvdXRlcmVkIHdpbnMuICBTaW5jZQogICAgc2xvdGRlZiBlbnRyaWVzIGFyZSBzb3J0ZWQgYnkgdGhlIG9mZnNldCBvZiB0aGUgc2xvdCBpbiB0aGUKICAgIFB5SGVhcFR5cGVPYmplY3QsIHRoaXMgZ2l2ZXMgdXMgc29tZSBjb250cm9sIG92ZXIgZGlzYW1iaWd1YXRpbmcKICAgIGJldHdlZW4gY29tcGV0aW5nIHNsb3RzOiB0aGUgbWVtYmVycyBvZiBQeUhlYXBUeXBlT2JqZWN0IGFyZSBsaXN0ZWQKQEAgLTYzNDAsMjgyICs2MzQwLDI4MiBAQAogc3RhdGljIGludAogYWRkX29wZXJhdG9ycyhQeVR5cGVPYmplY3QgKnR5cGUpCiB7Ci0JUHlPYmplY3QgKmRpY3QgPSB0eXBlLT50cF9kaWN0OwotCXNsb3RkZWYgKnA7Ci0JUHlPYmplY3QgKmRlc2NyOwotCXZvaWQgKipwdHI7CisgICAgUHlPYmplY3QgKmRpY3QgPSB0eXBlLT50cF9kaWN0OworICAgIHNsb3RkZWYgKnA7CisgICAgUHlPYmplY3QgKmRlc2NyOworICAgIHZvaWQgKipwdHI7CiAKLQlpbml0X3Nsb3RkZWZzKCk7Ci0JZm9yIChwID0gc2xvdGRlZnM7IHAtPm5hbWU7IHArKykgewotCQlpZiAocC0+d3JhcHBlciA9PSBOVUxMKQotCQkJY29udGludWU7Ci0JCXB0ciA9IHNsb3RwdHIodHlwZSwgcC0+b2Zmc2V0KTsKLQkJaWYgKCFwdHIgfHwgISpwdHIpCi0JCQljb250aW51ZTsKLQkJaWYgKFB5RGljdF9HZXRJdGVtKGRpY3QsIHAtPm5hbWVfc3Ryb2JqKSkKLQkJCWNvbnRpbnVlOwotCQlpZiAoKnB0ciA9PSBQeU9iamVjdF9IYXNoTm90SW1wbGVtZW50ZWQpIHsKLQkJCS8qIENsYXNzZXMgbWF5IHByZXZlbnQgdGhlIGluaGVyaXRhbmNlIG9mIHRoZSB0cF9oYXNoCi0JCQkgICBzbG90IGJ5IHN0b3JpbmcgUHlPYmplY3RfSGFzaE5vdEltcGxlbWVudGVkIGluIGl0LiBNYWtlIGl0Ci0gCQkJICAgdmlzaWJsZSBhcyBhIE5vbmUgdmFsdWUgZm9yIHRoZSBfX2hhc2hfXyBhdHRyaWJ1dGUuICovCi0JCQlpZiAoUHlEaWN0X1NldEl0ZW0oZGljdCwgcC0+bmFtZV9zdHJvYmosIFB5X05vbmUpIDwgMCkKLQkJCQlyZXR1cm4gLTE7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlkZXNjciA9IFB5RGVzY3JfTmV3V3JhcHBlcih0eXBlLCBwLCAqcHRyKTsKLQkJCWlmIChkZXNjciA9PSBOVUxMKQotCQkJCXJldHVybiAtMTsKLQkJCWlmIChQeURpY3RfU2V0SXRlbShkaWN0LCBwLT5uYW1lX3N0cm9iaiwgZGVzY3IpIDwgMCkKLQkJCQlyZXR1cm4gLTE7Ci0JCQlQeV9ERUNSRUYoZGVzY3IpOwotCQl9Ci0JfQotCWlmICh0eXBlLT50cF9uZXcgIT0gTlVMTCkgewotCQlpZiAoYWRkX3RwX25ld193cmFwcGVyKHR5cGUpIDwgMCkKLQkJCXJldHVybiAtMTsKLQl9Ci0JcmV0dXJuIDA7CisgICAgaW5pdF9zbG90ZGVmcygpOworICAgIGZvciAocCA9IHNsb3RkZWZzOyBwLT5uYW1lOyBwKyspIHsKKyAgICAgICAgaWYgKHAtPndyYXBwZXIgPT0gTlVMTCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBwdHIgPSBzbG90cHRyKHR5cGUsIHAtPm9mZnNldCk7CisgICAgICAgIGlmICghcHRyIHx8ICEqcHRyKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmIChQeURpY3RfR2V0SXRlbShkaWN0LCBwLT5uYW1lX3N0cm9iaikpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKCpwdHIgPT0gUHlPYmplY3RfSGFzaE5vdEltcGxlbWVudGVkKSB7CisgICAgICAgICAgICAvKiBDbGFzc2VzIG1heSBwcmV2ZW50IHRoZSBpbmhlcml0YW5jZSBvZiB0aGUgdHBfaGFzaAorICAgICAgICAgICAgICAgc2xvdCBieSBzdG9yaW5nIFB5T2JqZWN0X0hhc2hOb3RJbXBsZW1lbnRlZCBpbiBpdC4gTWFrZSBpdAorICAgICAgICAgICAgICAgdmlzaWJsZSBhcyBhIE5vbmUgdmFsdWUgZm9yIHRoZSBfX2hhc2hfXyBhdHRyaWJ1dGUuICovCisgICAgICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW0oZGljdCwgcC0+bmFtZV9zdHJvYmosIFB5X05vbmUpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBkZXNjciA9IFB5RGVzY3JfTmV3V3JhcHBlcih0eXBlLCBwLCAqcHRyKTsKKyAgICAgICAgICAgIGlmIChkZXNjciA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbShkaWN0LCBwLT5uYW1lX3N0cm9iaiwgZGVzY3IpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBQeV9ERUNSRUYoZGVzY3IpOworICAgICAgICB9CisgICAgfQorICAgIGlmICh0eXBlLT50cF9uZXcgIT0gTlVMTCkgeworICAgICAgICBpZiAoYWRkX3RwX25ld193cmFwcGVyKHR5cGUpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIAogLyogQ29vcGVyYXRpdmUgJ3N1cGVyJyAqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCVB5VHlwZU9iamVjdCAqdHlwZTsKLQlQeU9iamVjdCAqb2JqOwotCVB5VHlwZU9iamVjdCAqb2JqX3R5cGU7CisgICAgUHlPYmplY3RfSEVBRAorICAgIFB5VHlwZU9iamVjdCAqdHlwZTsKKyAgICBQeU9iamVjdCAqb2JqOworICAgIFB5VHlwZU9iamVjdCAqb2JqX3R5cGU7CiB9IHN1cGVyb2JqZWN0OwogCiBzdGF0aWMgUHlNZW1iZXJEZWYgc3VwZXJfbWVtYmVyc1tdID0gewotCXsiX190aGlzY2xhc3NfXyIsIFRfT0JKRUNULCBvZmZzZXRvZihzdXBlcm9iamVjdCwgdHlwZSksIFJFQURPTkxZLAotCSAidGhlIGNsYXNzIGludm9raW5nIHN1cGVyKCkifSwKLQl7Il9fc2VsZl9fIiwgIFRfT0JKRUNULCBvZmZzZXRvZihzdXBlcm9iamVjdCwgb2JqKSwgUkVBRE9OTFksCi0JICJ0aGUgaW5zdGFuY2UgaW52b2tpbmcgc3VwZXIoKTsgbWF5IGJlIE5vbmUifSwKLQl7Il9fc2VsZl9jbGFzc19fIiwgVF9PQkpFQ1QsIG9mZnNldG9mKHN1cGVyb2JqZWN0LCBvYmpfdHlwZSksIFJFQURPTkxZLAotCSAidGhlIHR5cGUgb2YgdGhlIGluc3RhbmNlIGludm9raW5nIHN1cGVyKCk7IG1heSBiZSBOb25lIn0sCi0JezB9CisgICAgeyJfX3RoaXNjbGFzc19fIiwgVF9PQkpFQ1QsIG9mZnNldG9mKHN1cGVyb2JqZWN0LCB0eXBlKSwgUkVBRE9OTFksCisgICAgICJ0aGUgY2xhc3MgaW52b2tpbmcgc3VwZXIoKSJ9LAorICAgIHsiX19zZWxmX18iLCAgVF9PQkpFQ1QsIG9mZnNldG9mKHN1cGVyb2JqZWN0LCBvYmopLCBSRUFET05MWSwKKyAgICAgInRoZSBpbnN0YW5jZSBpbnZva2luZyBzdXBlcigpOyBtYXkgYmUgTm9uZSJ9LAorICAgIHsiX19zZWxmX2NsYXNzX18iLCBUX09CSkVDVCwgb2Zmc2V0b2Yoc3VwZXJvYmplY3QsIG9ial90eXBlKSwgUkVBRE9OTFksCisgICAgICJ0aGUgdHlwZSBvZiB0aGUgaW5zdGFuY2UgaW52b2tpbmcgc3VwZXIoKTsgbWF5IGJlIE5vbmUifSwKKyAgICB7MH0KIH07CiAKIHN0YXRpYyB2b2lkCiBzdXBlcl9kZWFsbG9jKFB5T2JqZWN0ICpzZWxmKQogewotCXN1cGVyb2JqZWN0ICpzdSA9IChzdXBlcm9iamVjdCAqKXNlbGY7CisgICAgc3VwZXJvYmplY3QgKnN1ID0gKHN1cGVyb2JqZWN0ICopc2VsZjsKIAotCV9QeU9iamVjdF9HQ19VTlRSQUNLKHNlbGYpOwotCVB5X1hERUNSRUYoc3UtPm9iaik7Ci0JUHlfWERFQ1JFRihzdS0+dHlwZSk7Ci0JUHlfWERFQ1JFRihzdS0+b2JqX3R5cGUpOwotCVB5X1RZUEUoc2VsZiktPnRwX2ZyZWUoc2VsZik7CisgICAgX1B5T2JqZWN0X0dDX1VOVFJBQ0soc2VsZik7CisgICAgUHlfWERFQ1JFRihzdS0+b2JqKTsKKyAgICBQeV9YREVDUkVGKHN1LT50eXBlKTsKKyAgICBQeV9YREVDUkVGKHN1LT5vYmpfdHlwZSk7CisgICAgUHlfVFlQRShzZWxmKS0+dHBfZnJlZShzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHN1cGVyX3JlcHIoUHlPYmplY3QgKnNlbGYpCiB7Ci0Jc3VwZXJvYmplY3QgKnN1ID0gKHN1cGVyb2JqZWN0ICopc2VsZjsKKyAgICBzdXBlcm9iamVjdCAqc3UgPSAoc3VwZXJvYmplY3QgKilzZWxmOwogCi0JaWYgKHN1LT5vYmpfdHlwZSkKLQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21Gb3JtYXQoCi0JCQkiPHN1cGVyOiA8Y2xhc3MgJyVzJz4sIDwlcyBvYmplY3Q+PiIsCi0JCQlzdS0+dHlwZSA/IHN1LT50eXBlLT50cF9uYW1lIDogIk5VTEwiLAotCQkJc3UtPm9ial90eXBlLT50cF9uYW1lKTsKLQllbHNlCi0JCXJldHVybiBQeVN0cmluZ19Gcm9tRm9ybWF0KAotCQkJIjxzdXBlcjogPGNsYXNzICclcyc+LCBOVUxMPiIsCi0JCQlzdS0+dHlwZSA/IHN1LT50eXBlLT50cF9uYW1lIDogIk5VTEwiKTsKKyAgICBpZiAoc3UtPm9ial90eXBlKQorICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbUZvcm1hdCgKKyAgICAgICAgICAgICI8c3VwZXI6IDxjbGFzcyAnJXMnPiwgPCVzIG9iamVjdD4+IiwKKyAgICAgICAgICAgIHN1LT50eXBlID8gc3UtPnR5cGUtPnRwX25hbWUgOiAiTlVMTCIsCisgICAgICAgICAgICBzdS0+b2JqX3R5cGUtPnRwX25hbWUpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21Gb3JtYXQoCisgICAgICAgICAgICAiPHN1cGVyOiA8Y2xhc3MgJyVzJz4sIE5VTEw+IiwKKyAgICAgICAgICAgIHN1LT50eXBlID8gc3UtPnR5cGUtPnRwX25hbWUgOiAiTlVMTCIpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc3VwZXJfZ2V0YXR0cm8oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpuYW1lKQogewotCXN1cGVyb2JqZWN0ICpzdSA9IChzdXBlcm9iamVjdCAqKXNlbGY7Ci0JaW50IHNraXAgPSBzdS0+b2JqX3R5cGUgPT0gTlVMTDsKKyAgICBzdXBlcm9iamVjdCAqc3UgPSAoc3VwZXJvYmplY3QgKilzZWxmOworICAgIGludCBza2lwID0gc3UtPm9ial90eXBlID09IE5VTEw7CiAKLQlpZiAoIXNraXApIHsKLQkJLyogV2Ugd2FudCBfX2NsYXNzX18gdG8gcmV0dXJuIHRoZSBjbGFzcyBvZiB0aGUgc3VwZXIgb2JqZWN0Ci0JCSAgIChpLmUuIHN1cGVyLCBvciBhIHN1YmNsYXNzKSwgbm90IHRoZSBjbGFzcyBvZiBzdS0+b2JqLiAqLwotCQlza2lwID0gKFB5U3RyaW5nX0NoZWNrKG5hbWUpICYmCi0JCQlQeVN0cmluZ19HRVRfU0laRShuYW1lKSA9PSA5ICYmCi0JCQlzdHJjbXAoUHlTdHJpbmdfQVNfU1RSSU5HKG5hbWUpLCAiX19jbGFzc19fIikgPT0gMCk7Ci0JfQorICAgIGlmICghc2tpcCkgeworICAgICAgICAvKiBXZSB3YW50IF9fY2xhc3NfXyB0byByZXR1cm4gdGhlIGNsYXNzIG9mIHRoZSBzdXBlciBvYmplY3QKKyAgICAgICAgICAgKGkuZS4gc3VwZXIsIG9yIGEgc3ViY2xhc3MpLCBub3QgdGhlIGNsYXNzIG9mIHN1LT5vYmouICovCisgICAgICAgIHNraXAgPSAoUHlTdHJpbmdfQ2hlY2sobmFtZSkgJiYKKyAgICAgICAgICAgIFB5U3RyaW5nX0dFVF9TSVpFKG5hbWUpID09IDkgJiYKKyAgICAgICAgICAgIHN0cmNtcChQeVN0cmluZ19BU19TVFJJTkcobmFtZSksICJfX2NsYXNzX18iKSA9PSAwKTsKKyAgICB9CiAKLQlpZiAoIXNraXApIHsKLQkJUHlPYmplY3QgKm1ybywgKnJlcywgKnRtcCwgKmRpY3Q7Ci0JCVB5VHlwZU9iamVjdCAqc3RhcnR0eXBlOwotCQlkZXNjcmdldGZ1bmMgZjsKLQkJUHlfc3NpemVfdCBpLCBuOworICAgIGlmICghc2tpcCkgeworICAgICAgICBQeU9iamVjdCAqbXJvLCAqcmVzLCAqdG1wLCAqZGljdDsKKyAgICAgICAgUHlUeXBlT2JqZWN0ICpzdGFydHR5cGU7CisgICAgICAgIGRlc2NyZ2V0ZnVuYyBmOworICAgICAgICBQeV9zc2l6ZV90IGksIG47CiAKLQkJc3RhcnR0eXBlID0gc3UtPm9ial90eXBlOwotCQltcm8gPSBzdGFydHR5cGUtPnRwX21ybzsKKyAgICAgICAgc3RhcnR0eXBlID0gc3UtPm9ial90eXBlOworICAgICAgICBtcm8gPSBzdGFydHR5cGUtPnRwX21ybzsKIAotCQlpZiAobXJvID09IE5VTEwpCi0JCQluID0gMDsKLQkJZWxzZSB7Ci0JCQlhc3NlcnQoUHlUdXBsZV9DaGVjayhtcm8pKTsKLQkJCW4gPSBQeVR1cGxlX0dFVF9TSVpFKG1ybyk7Ci0JCX0KLQkJZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQkJaWYgKChQeU9iamVjdCAqKShzdS0+dHlwZSkgPT0gUHlUdXBsZV9HRVRfSVRFTShtcm8sIGkpKQotCQkJCWJyZWFrOwotCQl9Ci0JCWkrKzsKLQkJcmVzID0gTlVMTDsKLQkJZm9yICg7IGkgPCBuOyBpKyspIHsKLQkJCXRtcCA9IFB5VHVwbGVfR0VUX0lURU0obXJvLCBpKTsKLQkJCWlmIChQeVR5cGVfQ2hlY2sodG1wKSkKLQkJCQlkaWN0ID0gKChQeVR5cGVPYmplY3QgKil0bXApLT50cF9kaWN0OwotCQkJZWxzZSBpZiAoUHlDbGFzc19DaGVjayh0bXApKQotCQkJCWRpY3QgPSAoKFB5Q2xhc3NPYmplY3QgKil0bXApLT5jbF9kaWN0OwotCQkJZWxzZQotCQkJCWNvbnRpbnVlOwotCQkJcmVzID0gUHlEaWN0X0dldEl0ZW0oZGljdCwgbmFtZSk7Ci0JCQlpZiAocmVzICE9IE5VTEwpIHsKLQkJCQlQeV9JTkNSRUYocmVzKTsKLQkJCQlmID0gUHlfVFlQRShyZXMpLT50cF9kZXNjcl9nZXQ7Ci0JCQkJaWYgKGYgIT0gTlVMTCkgewotCQkJCQl0bXAgPSBmKHJlcywKLQkJCQkJCS8qIE9ubHkgcGFzcyAnb2JqJyBwYXJhbSBpZgotCQkJCQkJICAgdGhpcyBpcyBpbnN0YW5jZS1tb2RlIHN1cGVyIAotCQkJCQkJICAgKFNlZSBTRiBJRCAjNzQzNjI3KQotCQkJCQkJKi8KLQkJCQkJCShzdS0+b2JqID09IChQeU9iamVjdCAqKQotCQkJCQkJCSAgICBzdS0+b2JqX3R5cGUgCi0JCQkJCQkJPyAoUHlPYmplY3QgKilOVUxMIAotCQkJCQkJCTogc3UtPm9iaiksCi0JCQkJCQkoUHlPYmplY3QgKilzdGFydHR5cGUpOwotCQkJCQlQeV9ERUNSRUYocmVzKTsKLQkJCQkJcmVzID0gdG1wOwotCQkJCX0KLQkJCQlyZXR1cm4gcmVzOwotCQkJfQotCQl9Ci0JfQotCXJldHVybiBQeU9iamVjdF9HZW5lcmljR2V0QXR0cihzZWxmLCBuYW1lKTsKKyAgICAgICAgaWYgKG1ybyA9PSBOVUxMKQorICAgICAgICAgICAgbiA9IDA7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgYXNzZXJ0KFB5VHVwbGVfQ2hlY2sobXJvKSk7CisgICAgICAgICAgICBuID0gUHlUdXBsZV9HRVRfU0laRShtcm8pOworICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICAgIGlmICgoUHlPYmplY3QgKikoc3UtPnR5cGUpID09IFB5VHVwbGVfR0VUX0lURU0obXJvLCBpKSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpKys7CisgICAgICAgIHJlcyA9IE5VTEw7CisgICAgICAgIGZvciAoOyBpIDwgbjsgaSsrKSB7CisgICAgICAgICAgICB0bXAgPSBQeVR1cGxlX0dFVF9JVEVNKG1ybywgaSk7CisgICAgICAgICAgICBpZiAoUHlUeXBlX0NoZWNrKHRtcCkpCisgICAgICAgICAgICAgICAgZGljdCA9ICgoUHlUeXBlT2JqZWN0ICopdG1wKS0+dHBfZGljdDsKKyAgICAgICAgICAgIGVsc2UgaWYgKFB5Q2xhc3NfQ2hlY2sodG1wKSkKKyAgICAgICAgICAgICAgICBkaWN0ID0gKChQeUNsYXNzT2JqZWN0ICopdG1wKS0+Y2xfZGljdDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIHJlcyA9IFB5RGljdF9HZXRJdGVtKGRpY3QsIG5hbWUpOworICAgICAgICAgICAgaWYgKHJlcyAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlfSU5DUkVGKHJlcyk7CisgICAgICAgICAgICAgICAgZiA9IFB5X1RZUEUocmVzKS0+dHBfZGVzY3JfZ2V0OworICAgICAgICAgICAgICAgIGlmIChmICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgdG1wID0gZihyZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBPbmx5IHBhc3MgJ29iaicgcGFyYW0gaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgaXMgaW5zdGFuY2UtbW9kZSBzdXBlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNlZSBTRiBJRCAjNzQzNjI3KQorICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIChzdS0+b2JqID09IChQeU9iamVjdCAqKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3UtPm9ial90eXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAoUHlPYmplY3QgKilOVUxMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBzdS0+b2JqKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChQeU9iamVjdCAqKXN0YXJ0dHlwZSk7CisgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihyZXMpOworICAgICAgICAgICAgICAgICAgICByZXMgPSB0bXA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyKHNlbGYsIG5hbWUpOwogfQogCiBzdGF0aWMgUHlUeXBlT2JqZWN0ICoKIHN1cGVyY2hlY2soUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqb2JqKQogewotCS8qIENoZWNrIHRoYXQgYSBzdXBlcigpIGNhbGwgbWFrZXMgc2Vuc2UuICBSZXR1cm4gYSB0eXBlIG9iamVjdC4KKyAgICAvKiBDaGVjayB0aGF0IGEgc3VwZXIoKSBjYWxsIG1ha2VzIHNlbnNlLiAgUmV0dXJuIGEgdHlwZSBvYmplY3QuCiAKLQkgICBvYmogY2FuIGJlIGEgbmV3LXN0eWxlIGNsYXNzLCBvciBhbiBpbnN0YW5jZSBvZiBvbmU6CisgICAgICAgb2JqIGNhbiBiZSBhIG5ldy1zdHlsZSBjbGFzcywgb3IgYW4gaW5zdGFuY2Ugb2Ygb25lOgogCi0JICAgLSBJZiBpdCBpcyBhIGNsYXNzLCBpdCBtdXN0IGJlIGEgc3ViY2xhc3Mgb2YgJ3R5cGUnLgkgVGhpcyBjYXNlIGlzCi0JICAgICB1c2VkIGZvciBjbGFzcyBtZXRob2RzOyB0aGUgcmV0dXJuIHZhbHVlIGlzIG9iai4KKyAgICAgICAtIElmIGl0IGlzIGEgY2xhc3MsIGl0IG11c3QgYmUgYSBzdWJjbGFzcyBvZiAndHlwZScuICAgICAgVGhpcyBjYXNlIGlzCisgICAgICAgICB1c2VkIGZvciBjbGFzcyBtZXRob2RzOyB0aGUgcmV0dXJuIHZhbHVlIGlzIG9iai4KIAotCSAgIC0gSWYgaXQgaXMgYW4gaW5zdGFuY2UsIGl0IG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgJ3R5cGUnLiAgVGhpcyBpcwotCSAgICAgdGhlIG5vcm1hbCBjYXNlOyB0aGUgcmV0dXJuIHZhbHVlIGlzIG9iai5fX2NsYXNzX18uCisgICAgICAgLSBJZiBpdCBpcyBhbiBpbnN0YW5jZSwgaXQgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiAndHlwZScuICBUaGlzIGlzCisgICAgICAgICB0aGUgbm9ybWFsIGNhc2U7IHRoZSByZXR1cm4gdmFsdWUgaXMgb2JqLl9fY2xhc3NfXy4KIAotCSAgIEJ1dC4uLiB3aGVuIG9iaiBpcyBhbiBpbnN0YW5jZSwgd2Ugd2FudCB0byBhbGxvdyBmb3IgdGhlIGNhc2Ugd2hlcmUKLQkgICBQeV9UWVBFKG9iaikgaXMgbm90IGEgc3ViY2xhc3Mgb2YgdHlwZSwgYnV0IG9iai5fX2NsYXNzX18gaXMhCi0JICAgVGhpcyB3aWxsIGFsbG93IHVzaW5nIHN1cGVyKCkgd2l0aCBhIHByb3h5IGZvciBvYmouCi0JKi8KKyAgICAgICBCdXQuLi4gd2hlbiBvYmogaXMgYW4gaW5zdGFuY2UsIHdlIHdhbnQgdG8gYWxsb3cgZm9yIHRoZSBjYXNlIHdoZXJlCisgICAgICAgUHlfVFlQRShvYmopIGlzIG5vdCBhIHN1YmNsYXNzIG9mIHR5cGUsIGJ1dCBvYmouX19jbGFzc19fIGlzIQorICAgICAgIFRoaXMgd2lsbCBhbGxvdyB1c2luZyBzdXBlcigpIHdpdGggYSBwcm94eSBmb3Igb2JqLgorICAgICovCiAKLQkvKiBDaGVjayBmb3IgZmlyc3QgYnVsbGV0IGFib3ZlIChzcGVjaWFsIGNhc2UpICovCi0JaWYgKFB5VHlwZV9DaGVjayhvYmopICYmIFB5VHlwZV9Jc1N1YnR5cGUoKFB5VHlwZU9iamVjdCAqKW9iaiwgdHlwZSkpIHsKLQkJUHlfSU5DUkVGKG9iaik7Ci0JCXJldHVybiAoUHlUeXBlT2JqZWN0ICopb2JqOwotCX0KKyAgICAvKiBDaGVjayBmb3IgZmlyc3QgYnVsbGV0IGFib3ZlIChzcGVjaWFsIGNhc2UpICovCisgICAgaWYgKFB5VHlwZV9DaGVjayhvYmopICYmIFB5VHlwZV9Jc1N1YnR5cGUoKFB5VHlwZU9iamVjdCAqKW9iaiwgdHlwZSkpIHsKKyAgICAgICAgUHlfSU5DUkVGKG9iaik7CisgICAgICAgIHJldHVybiAoUHlUeXBlT2JqZWN0ICopb2JqOworICAgIH0KIAotCS8qIE5vcm1hbCBjYXNlICovCi0JaWYgKFB5VHlwZV9Jc1N1YnR5cGUoUHlfVFlQRShvYmopLCB0eXBlKSkgewotCQlQeV9JTkNSRUYoUHlfVFlQRShvYmopKTsKLQkJcmV0dXJuIFB5X1RZUEUob2JqKTsKLQl9Ci0JZWxzZSB7Ci0JCS8qIFRyeSB0aGUgc2xvdyB3YXkgKi8KLQkJc3RhdGljIFB5T2JqZWN0ICpjbGFzc19zdHIgPSBOVUxMOwotCQlQeU9iamVjdCAqY2xhc3NfYXR0cjsKKyAgICAvKiBOb3JtYWwgY2FzZSAqLworICAgIGlmIChQeVR5cGVfSXNTdWJ0eXBlKFB5X1RZUEUob2JqKSwgdHlwZSkpIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X1RZUEUob2JqKSk7CisgICAgICAgIHJldHVybiBQeV9UWVBFKG9iaik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvKiBUcnkgdGhlIHNsb3cgd2F5ICovCisgICAgICAgIHN0YXRpYyBQeU9iamVjdCAqY2xhc3Nfc3RyID0gTlVMTDsKKyAgICAgICAgUHlPYmplY3QgKmNsYXNzX2F0dHI7CiAKLQkJaWYgKGNsYXNzX3N0ciA9PSBOVUxMKSB7Ci0JCQljbGFzc19zdHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCJfX2NsYXNzX18iKTsKLQkJCWlmIChjbGFzc19zdHIgPT0gTlVMTCkKLQkJCQlyZXR1cm4gTlVMTDsKLQkJfQorICAgICAgICBpZiAoY2xhc3Nfc3RyID09IE5VTEwpIHsKKyAgICAgICAgICAgIGNsYXNzX3N0ciA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIl9fY2xhc3NfXyIpOworICAgICAgICAgICAgaWYgKGNsYXNzX3N0ciA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CiAKLQkJY2xhc3NfYXR0ciA9IFB5T2JqZWN0X0dldEF0dHIob2JqLCBjbGFzc19zdHIpOworICAgICAgICBjbGFzc19hdHRyID0gUHlPYmplY3RfR2V0QXR0cihvYmosIGNsYXNzX3N0cik7CiAKLQkJaWYgKGNsYXNzX2F0dHIgIT0gTlVMTCAmJgotCQkgICAgUHlUeXBlX0NoZWNrKGNsYXNzX2F0dHIpICYmCi0JCSAgICAoUHlUeXBlT2JqZWN0ICopY2xhc3NfYXR0ciAhPSBQeV9UWVBFKG9iaikpCi0JCXsKLQkJCWludCBvayA9IFB5VHlwZV9Jc1N1YnR5cGUoCi0JCQkJKFB5VHlwZU9iamVjdCAqKWNsYXNzX2F0dHIsIHR5cGUpOwotCQkJaWYgKG9rKQotCQkJCXJldHVybiAoUHlUeXBlT2JqZWN0ICopY2xhc3NfYXR0cjsKLQkJfQorICAgICAgICBpZiAoY2xhc3NfYXR0ciAhPSBOVUxMICYmCisgICAgICAgICAgICBQeVR5cGVfQ2hlY2soY2xhc3NfYXR0cikgJiYKKyAgICAgICAgICAgIChQeVR5cGVPYmplY3QgKiljbGFzc19hdHRyICE9IFB5X1RZUEUob2JqKSkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IG9rID0gUHlUeXBlX0lzU3VidHlwZSgKKyAgICAgICAgICAgICAgICAoUHlUeXBlT2JqZWN0ICopY2xhc3NfYXR0ciwgdHlwZSk7CisgICAgICAgICAgICBpZiAob2spCisgICAgICAgICAgICAgICAgcmV0dXJuIChQeVR5cGVPYmplY3QgKiljbGFzc19hdHRyOworICAgICAgICB9CiAKLQkJaWYgKGNsYXNzX2F0dHIgPT0gTlVMTCkKLQkJCVB5RXJyX0NsZWFyKCk7Ci0JCWVsc2UKLQkJCVB5X0RFQ1JFRihjbGFzc19hdHRyKTsKLQl9CisgICAgICAgIGlmIChjbGFzc19hdHRyID09IE5VTEwpCisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBQeV9ERUNSRUYoY2xhc3NfYXR0cik7CisgICAgfQogCi0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCSJzdXBlcih0eXBlLCBvYmopOiAiCi0JCQkib2JqIG11c3QgYmUgYW4gaW5zdGFuY2Ugb3Igc3VidHlwZSBvZiB0eXBlIik7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgInN1cGVyKHR5cGUsIG9iaik6ICIKKyAgICAgICAgICAgICAgICAgICAgIm9iaiBtdXN0IGJlIGFuIGluc3RhbmNlIG9yIHN1YnR5cGUgb2YgdHlwZSIpOworICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc3VwZXJfZGVzY3JfZ2V0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqb2JqLCBQeU9iamVjdCAqdHlwZSkKIHsKLQlzdXBlcm9iamVjdCAqc3UgPSAoc3VwZXJvYmplY3QgKilzZWxmOwotCXN1cGVyb2JqZWN0ICpuZXdvYmo7CisgICAgc3VwZXJvYmplY3QgKnN1ID0gKHN1cGVyb2JqZWN0ICopc2VsZjsKKyAgICBzdXBlcm9iamVjdCAqbmV3b2JqOwogCi0JaWYgKG9iaiA9PSBOVUxMIHx8IG9iaiA9PSBQeV9Ob25lIHx8IHN1LT5vYmogIT0gTlVMTCkgewotCQkvKiBOb3QgYmluZGluZyB0byBhbiBvYmplY3QsIG9yIGFscmVhZHkgYm91bmQgKi8KLQkJUHlfSU5DUkVGKHNlbGYpOwotCQlyZXR1cm4gc2VsZjsKLQl9Ci0JaWYgKFB5X1RZUEUoc3UpICE9ICZQeVN1cGVyX1R5cGUpCi0JCS8qIElmIHN1IGlzIGFuIGluc3RhbmNlIG9mIGEgKHN0cmljdCkgc3ViY2xhc3Mgb2Ygc3VwZXIsCi0JCSAgIGNhbGwgaXRzIHR5cGUgKi8KLQkJcmV0dXJuIFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoKFB5T2JqZWN0ICopUHlfVFlQRShzdSksCi0JCQkJCQkgICAgc3UtPnR5cGUsIG9iaiwgTlVMTCk7Ci0JZWxzZSB7Ci0JCS8qIElubGluZSB0aGUgY29tbW9uIGNhc2UgKi8KLQkJUHlUeXBlT2JqZWN0ICpvYmpfdHlwZSA9IHN1cGVyY2hlY2soc3UtPnR5cGUsIG9iaik7Ci0JCWlmIChvYmpfdHlwZSA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCW5ld29iaiA9IChzdXBlcm9iamVjdCAqKVB5U3VwZXJfVHlwZS50cF9uZXcoJlB5U3VwZXJfVHlwZSwKLQkJCQkJCQkgTlVMTCwgTlVMTCk7Ci0JCWlmIChuZXdvYmogPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQlQeV9JTkNSRUYoc3UtPnR5cGUpOwotCQlQeV9JTkNSRUYob2JqKTsKLQkJbmV3b2JqLT50eXBlID0gc3UtPnR5cGU7Ci0JCW5ld29iai0+b2JqID0gb2JqOwotCQluZXdvYmotPm9ial90eXBlID0gb2JqX3R5cGU7Ci0JCXJldHVybiAoUHlPYmplY3QgKiluZXdvYmo7Ci0JfQorICAgIGlmIChvYmogPT0gTlVMTCB8fCBvYmogPT0gUHlfTm9uZSB8fCBzdS0+b2JqICE9IE5VTEwpIHsKKyAgICAgICAgLyogTm90IGJpbmRpbmcgdG8gYW4gb2JqZWN0LCBvciBhbHJlYWR5IGJvdW5kICovCisgICAgICAgIFB5X0lOQ1JFRihzZWxmKTsKKyAgICAgICAgcmV0dXJuIHNlbGY7CisgICAgfQorICAgIGlmIChQeV9UWVBFKHN1KSAhPSAmUHlTdXBlcl9UeXBlKQorICAgICAgICAvKiBJZiBzdSBpcyBhbiBpbnN0YW5jZSBvZiBhIChzdHJpY3QpIHN1YmNsYXNzIG9mIHN1cGVyLAorICAgICAgICAgICBjYWxsIGl0cyB0eXBlICovCisgICAgICAgIHJldHVybiBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKChQeU9iamVjdCAqKVB5X1RZUEUoc3UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdS0+dHlwZSwgb2JqLCBOVUxMKTsKKyAgICBlbHNlIHsKKyAgICAgICAgLyogSW5saW5lIHRoZSBjb21tb24gY2FzZSAqLworICAgICAgICBQeVR5cGVPYmplY3QgKm9ial90eXBlID0gc3VwZXJjaGVjayhzdS0+dHlwZSwgb2JqKTsKKyAgICAgICAgaWYgKG9ial90eXBlID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgbmV3b2JqID0gKHN1cGVyb2JqZWN0ICopUHlTdXBlcl9UeXBlLnRwX25ldygmUHlTdXBlcl9UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwpOworICAgICAgICBpZiAobmV3b2JqID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgUHlfSU5DUkVGKHN1LT50eXBlKTsKKyAgICAgICAgUHlfSU5DUkVGKG9iaik7CisgICAgICAgIG5ld29iai0+dHlwZSA9IHN1LT50eXBlOworICAgICAgICBuZXdvYmotPm9iaiA9IG9iajsKKyAgICAgICAgbmV3b2JqLT5vYmpfdHlwZSA9IG9ial90eXBlOworICAgICAgICByZXR1cm4gKFB5T2JqZWN0ICopbmV3b2JqOworICAgIH0KIH0KIAogc3RhdGljIGludAogc3VwZXJfaW5pdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCXN1cGVyb2JqZWN0ICpzdSA9IChzdXBlcm9iamVjdCAqKXNlbGY7Ci0JUHlUeXBlT2JqZWN0ICp0eXBlOwotCVB5T2JqZWN0ICpvYmogPSBOVUxMOwotCVB5VHlwZU9iamVjdCAqb2JqX3R5cGUgPSBOVUxMOworICAgIHN1cGVyb2JqZWN0ICpzdSA9IChzdXBlcm9iamVjdCAqKXNlbGY7CisgICAgUHlUeXBlT2JqZWN0ICp0eXBlOworICAgIFB5T2JqZWN0ICpvYmogPSBOVUxMOworICAgIFB5VHlwZU9iamVjdCAqb2JqX3R5cGUgPSBOVUxMOwogCi0JaWYgKCFfUHlBcmdfTm9LZXl3b3Jkcygic3VwZXIiLCBrd2RzKSkKLQkJcmV0dXJuIC0xOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyF8TzpzdXBlciIsICZQeVR5cGVfVHlwZSwgJnR5cGUsICZvYmopKQotCQlyZXR1cm4gLTE7Ci0JaWYgKG9iaiA9PSBQeV9Ob25lKQotCQlvYmogPSBOVUxMOwotCWlmIChvYmogIT0gTlVMTCkgewotCQlvYmpfdHlwZSA9IHN1cGVyY2hlY2sodHlwZSwgb2JqKTsKLQkJaWYgKG9ial90eXBlID09IE5VTEwpCi0JCQlyZXR1cm4gLTE7Ci0JCVB5X0lOQ1JFRihvYmopOwotCX0KLQlQeV9JTkNSRUYodHlwZSk7Ci0Jc3UtPnR5cGUgPSB0eXBlOwotCXN1LT5vYmogPSBvYmo7Ci0Jc3UtPm9ial90eXBlID0gb2JqX3R5cGU7Ci0JcmV0dXJuIDA7CisgICAgaWYgKCFfUHlBcmdfTm9LZXl3b3Jkcygic3VwZXIiLCBrd2RzKSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyF8TzpzdXBlciIsICZQeVR5cGVfVHlwZSwgJnR5cGUsICZvYmopKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKG9iaiA9PSBQeV9Ob25lKQorICAgICAgICBvYmogPSBOVUxMOworICAgIGlmIChvYmogIT0gTlVMTCkgeworICAgICAgICBvYmpfdHlwZSA9IHN1cGVyY2hlY2sodHlwZSwgb2JqKTsKKyAgICAgICAgaWYgKG9ial90eXBlID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIFB5X0lOQ1JFRihvYmopOworICAgIH0KKyAgICBQeV9JTkNSRUYodHlwZSk7CisgICAgc3UtPnR5cGUgPSB0eXBlOworICAgIHN1LT5vYmogPSBvYmo7CisgICAgc3UtPm9ial90eXBlID0gb2JqX3R5cGU7CisgICAgcmV0dXJuIDA7CiB9CiAKIFB5RG9jX1NUUlZBUihzdXBlcl9kb2MsCkBAIC02NjI1LDYwICs2NjI1LDYwIEBACiAiVHlwaWNhbCB1c2UgdG8gY2FsbCBhIGNvb3BlcmF0aXZlIHN1cGVyY2xhc3MgbWV0aG9kOlxuIgogImNsYXNzIEMoQik6XG4iCiAiICAgIGRlZiBtZXRoKHNlbGYsIGFyZyk6XG4iCi0iCSBzdXBlcihDLCBzZWxmKS5tZXRoKGFyZykiKTsKKyIgICAgICAgIHN1cGVyKEMsIHNlbGYpLm1ldGgoYXJnKSIpOwogCiBzdGF0aWMgaW50CiBzdXBlcl90cmF2ZXJzZShQeU9iamVjdCAqc2VsZiwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0Jc3VwZXJvYmplY3QgKnN1ID0gKHN1cGVyb2JqZWN0ICopc2VsZjsKKyAgICBzdXBlcm9iamVjdCAqc3UgPSAoc3VwZXJvYmplY3QgKilzZWxmOwogCi0JUHlfVklTSVQoc3UtPm9iaik7Ci0JUHlfVklTSVQoc3UtPnR5cGUpOwotCVB5X1ZJU0lUKHN1LT5vYmpfdHlwZSk7CisgICAgUHlfVklTSVQoc3UtPm9iaik7CisgICAgUHlfVklTSVQoc3UtPnR5cGUpOworICAgIFB5X1ZJU0lUKHN1LT5vYmpfdHlwZSk7CiAKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKIH0KIAogUHlUeXBlT2JqZWN0IFB5U3VwZXJfVHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQotCSJzdXBlciIsCQkJCS8qIHRwX25hbWUgKi8KLQlzaXplb2Yoc3VwZXJvYmplY3QpLAkJCS8qIHRwX2Jhc2ljc2l6ZSAqLwotCTAsCQkJCQkvKiB0cF9pdGVtc2l6ZSAqLwotCS8qIG1ldGhvZHMgKi8KLQlzdXBlcl9kZWFsbG9jLAkJCQkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9jb21wYXJlICovCi0Jc3VwZXJfcmVwciwJCQkJLyogdHBfcmVwciAqLwotCTAsCQkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkJLyogdHBfc3RyICovCi0Jc3VwZXJfZ2V0YXR0cm8sCQkJCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQyB8Ci0JCVB5X1RQRkxBR1NfQkFTRVRZUEUsCQkvKiB0cF9mbGFncyAqLwotCXN1cGVyX2RvYywJCQkJLyogdHBfZG9jICovCi0Jc3VwZXJfdHJhdmVyc2UsCQkJCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkJLyogdHBfaXRlcm5leHQgKi8KLQkwLAkJCQkJLyogdHBfbWV0aG9kcyAqLwotCXN1cGVyX21lbWJlcnMsCQkJCS8qIHRwX21lbWJlcnMgKi8KLQkwLAkJCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkJLyogdHBfZGljdCAqLwotCXN1cGVyX2Rlc2NyX2dldCwJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQlzdXBlcl9pbml0LAkJCQkvKiB0cF9pbml0ICovCi0JUHlUeXBlX0dlbmVyaWNBbGxvYywJCQkvKiB0cF9hbGxvYyAqLwotCVB5VHlwZV9HZW5lcmljTmV3LAkJCS8qIHRwX25ldyAqLwotCVB5T2JqZWN0X0dDX0RlbCwJCQkvKiB0cF9mcmVlICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKKyAgICAic3VwZXIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICBzaXplb2Yoc3VwZXJvYmplY3QpLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgc3VwZXJfZGVhbGxvYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIHN1cGVyX3JlcHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgc3VwZXJfZ2V0YXR0cm8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQyB8CisgICAgICAgIFB5X1RQRkxBR1NfQkFTRVRZUEUsICAgICAgICAgICAgICAgICAgICAvKiB0cF9mbGFncyAqLworICAgIHN1cGVyX2RvYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgc3VwZXJfdHJhdmVyc2UsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICBzdXBlcl9tZW1iZXJzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIHN1cGVyX2Rlc2NyX2dldCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICBzdXBlcl9pbml0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICBQeVR5cGVfR2VuZXJpY0FsbG9jLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgUHlUeXBlX0dlbmVyaWNOZXcsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICBQeU9iamVjdF9HQ19EZWwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KIH07CmRpZmYgLS1naXQgYS9PYmplY3RzL3VuaWNvZGVjdHlwZS5jIGIvT2JqZWN0cy91bmljb2RlY3R5cGUuYwppbmRleCAyYWZhZmI4Li43OGM0MGI1IDEwMDY0NAotLS0gYS9PYmplY3RzL3VuaWNvZGVjdHlwZS5jCisrKyBiL09iamVjdHMvdW5pY29kZWN0eXBlLmMKQEAgLTM5LDEyICszOSwxMiBAQAogCiAjaWZkZWYgUHlfVU5JQ09ERV9XSURFCiAgICAgaWYgKGNvZGUgPj0gMHgxMTAwMDApCi0gICAgICAgIGluZGV4ID0gMDsKKyAgICBpbmRleCA9IDA7CiAgICAgZWxzZQogI2VuZGlmCiAgICAgewotICAgICAgICBpbmRleCA9IGluZGV4MVsoY29kZT4+U0hJRlQpXTsKLSAgICAgICAgaW5kZXggPSBpbmRleDJbKGluZGV4PDxTSElGVCkrKGNvZGUmKCgxPDxTSElGVCktMSkpXTsKKyAgICBpbmRleCA9IGluZGV4MVsoY29kZT4+U0hJRlQpXTsKKyAgICBpbmRleCA9IGluZGV4MlsoaW5kZXg8PFNISUZUKSsoY29kZSYoKDE8PFNISUZUKS0xKSldOwogICAgIH0KIAogICAgIHJldHVybiAmX1B5VW5pY29kZV9UeXBlUmVjb3Jkc1tpbmRleF07CkBAIC02NCw5ICs2NCw5IEBACiAgICAgY2FzZSAweDAwODU6IC8qIE5FWFQgTElORSAqLwogICAgIGNhc2UgMHgyMDI4OiAvKiBMSU5FIFNFUEFSQVRPUiAqLwogICAgIGNhc2UgMHgyMDI5OiAvKiBQQVJBR1JBUEggU0VQQVJBVE9SICovCi0JcmV0dXJuIDE7CisgICAgcmV0dXJuIDE7CiAgICAgZGVmYXVsdDoKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKICAgICB9CiB9CiAKQEAgLTc5LDEwICs3OSwxMCBAQAogICAgIGludCBkZWx0YSA9IGN0eXBlLT50aXRsZTsKIAogICAgIGlmIChjdHlwZS0+ZmxhZ3MgJiBOT0RFTFRBX01BU0spCi0JcmV0dXJuIGRlbHRhOworICAgIHJldHVybiBkZWx0YTsKIAogICAgIGlmIChkZWx0YSA+PSAzMjc2OCkKLQkgICAgZGVsdGEgLT0gNjU1MzY7CisgICAgICAgIGRlbHRhIC09IDY1NTM2OwogCiAgICAgcmV0dXJuIGNoICsgZGVsdGE7CiB9CkBAIC0xMTAsNyArMTEwLDcgQEAKIGludCBfUHlVbmljb2RlX0lzRGVjaW1hbERpZ2l0KFB5X1VOSUNPREUgY2gpCiB7CiAgICAgaWYgKF9QeVVuaWNvZGVfVG9EZWNpbWFsRGlnaXQoY2gpIDwgMCkKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKICAgICByZXR1cm4gMTsKIH0KIApAQCAtMTI3LDcgKzEyNyw3IEBACiBpbnQgX1B5VW5pY29kZV9Jc0RpZ2l0KFB5X1VOSUNPREUgY2gpCiB7CiAgICAgaWYgKF9QeVVuaWNvZGVfVG9EaWdpdChjaCkgPCAwKQotCXJldHVybiAwOworICAgIHJldHVybiAwOwogICAgIHJldHVybiAxOwogfQogCkBAIC0xNDAsMTMgKzE0MCwxMyBAQAogewogICAgIHN3aXRjaCAoY2gpIHsKICAgICBjYXNlIDB4MEYzMzoKLSAgICAgICAgcmV0dXJuIChkb3VibGUpIC0xIC8gMjsKKyAgICByZXR1cm4gKGRvdWJsZSkgLTEgLyAyOwogICAgIGNhc2UgMHgxN0YwOgogICAgIGNhc2UgMHgzMDA3OgogI2lmZGVmIFB5X1VOSUNPREVfV0lERQogICAgIGNhc2UgMHgxMDE4QToKICNlbmRpZgotCXJldHVybiAoZG91YmxlKSAwOworICAgIHJldHVybiAoZG91YmxlKSAwOwogICAgIGNhc2UgMHgwOUY0OgogICAgIGNhc2UgMHgxN0YxOgogICAgIGNhc2UgMHgyMTVGOgpAQCAtMTY1LDcgKzE2NSw3IEBACiAgICAgY2FzZSAweDEwMzIwOgogICAgIGNhc2UgMHgxMDNEMToKICNlbmRpZgotCXJldHVybiAoZG91YmxlKSAxOworICAgIHJldHVybiAoZG91YmxlKSAxOwogICAgIGNhc2UgMHgwMEJEOgogICAgIGNhc2UgMHgwRjJBOgogICAgIGNhc2UgMHgyQ0ZEOgpAQCAtMTc0LDIwICsxNzQsMjAgQEAKICAgICBjYXNlIDB4MTAxNzU6CiAgICAgY2FzZSAweDEwMTc2OgogI2VuZGlmCi0JcmV0dXJuIChkb3VibGUpIDEgLyAyOworICAgIHJldHVybiAoZG91YmxlKSAxIC8gMjsKICAgICBjYXNlIDB4MjE1MzoKLQlyZXR1cm4gKGRvdWJsZSkgMSAvIDM7CisgICAgcmV0dXJuIChkb3VibGUpIDEgLyAzOwogICAgIGNhc2UgMHgwMEJDOgogI2lmZGVmIFB5X1VOSUNPREVfV0lERQogICAgIGNhc2UgMHgxMDE0MDoKICNlbmRpZgotCXJldHVybiAoZG91YmxlKSAxIC8gNDsKKyAgICByZXR1cm4gKGRvdWJsZSkgMSAvIDQ7CiAgICAgY2FzZSAweDIxNTU6Ci0JcmV0dXJuIChkb3VibGUpIDEgLyA1OworICAgIHJldHVybiAoZG91YmxlKSAxIC8gNTsKICAgICBjYXNlIDB4MjE1OToKLQlyZXR1cm4gKGRvdWJsZSkgMSAvIDY7CisgICAgcmV0dXJuIChkb3VibGUpIDEgLyA2OwogICAgIGNhc2UgMHgyMTVCOgotCXJldHVybiAoZG91YmxlKSAxIC8gODsKKyAgICByZXR1cm4gKGRvdWJsZSkgMSAvIDg7CiAgICAgY2FzZSAweDBCRjA6CiAgICAgY2FzZSAweDEzNzI6CiAgICAgY2FzZSAweDIxNjk6CkBAIC0yMTYsNyArMjE2LDcgQEAKICAgICBjYXNlIDB4MTAzRDM6CiAgICAgY2FzZSAweDEwQTQ0OgogI2VuZGlmCi0JcmV0dXJuIChkb3VibGUpIDEwOworICAgIHJldHVybiAoZG91YmxlKSAxMDsKICAgICBjYXNlIDB4MEJGMToKICAgICBjYXNlIDB4MTM3QjoKICAgICBjYXNlIDB4MjE2RDoKQEAgLTIyOSw3ICsyMjksNyBAQAogICAgIGNhc2UgMHgxMDNENToKICAgICBjYXNlIDB4MTBBNDY6CiAjZW5kaWYKLQlyZXR1cm4gKGRvdWJsZSkgMTAwOworICAgIHJldHVybiAoZG91YmxlKSAxMDA7CiAgICAgY2FzZSAweDBCRjI6CiAgICAgY2FzZSAweDIxNkY6CiAgICAgY2FzZSAweDIxN0Y6CkBAIC0yNDEsNzUgKzI0MSw3NSBAQAogICAgIGNhc2UgMHgxMDE3MToKICAgICBjYXNlIDB4MTBBNDc6CiAjZW5kaWYKLQlyZXR1cm4gKGRvdWJsZSkgMTAwMDsKKyAgICByZXR1cm4gKGRvdWJsZSkgMTAwMDsKICAgICBjYXNlIDB4MTM3QzoKICAgICBjYXNlIDB4MjE4MjoKICNpZmRlZiBQeV9VTklDT0RFX1dJREUKICAgICBjYXNlIDB4MTAxMkI6CiAgICAgY2FzZSAweDEwMTU1OgogI2VuZGlmCi0JcmV0dXJuIChkb3VibGUpIDEwMDAwOworICAgIHJldHVybiAoZG91YmxlKSAxMDAwMDsKICAgICBjYXNlIDB4MjE2QToKICAgICBjYXNlIDB4MjE3QToKICAgICBjYXNlIDB4MjQ2QToKICAgICBjYXNlIDB4MjQ3RToKICAgICBjYXNlIDB4MjQ5MjoKICAgICBjYXNlIDB4MjRFQjoKLQlyZXR1cm4gKGRvdWJsZSkgMTE7CisgICAgcmV0dXJuIChkb3VibGUpIDExOwogICAgIGNhc2UgMHgwRjJGOgotICAgICAgICByZXR1cm4gKGRvdWJsZSkgMTEgLyAyOworICAgIHJldHVybiAoZG91YmxlKSAxMSAvIDI7CiAgICAgY2FzZSAweDIxNkI6CiAgICAgY2FzZSAweDIxN0I6CiAgICAgY2FzZSAweDI0NkI6CiAgICAgY2FzZSAweDI0N0Y6CiAgICAgY2FzZSAweDI0OTM6CiAgICAgY2FzZSAweDI0RUM6Ci0JcmV0dXJuIChkb3VibGUpIDEyOworICAgIHJldHVybiAoZG91YmxlKSAxMjsKICAgICBjYXNlIDB4MjQ2QzoKICAgICBjYXNlIDB4MjQ4MDoKICAgICBjYXNlIDB4MjQ5NDoKICAgICBjYXNlIDB4MjRFRDoKLQlyZXR1cm4gKGRvdWJsZSkgMTM7CisgICAgcmV0dXJuIChkb3VibGUpIDEzOwogICAgIGNhc2UgMHgwRjMwOgotICAgICAgICByZXR1cm4gKGRvdWJsZSkgMTMgLyAyOworICAgIHJldHVybiAoZG91YmxlKSAxMyAvIDI7CiAgICAgY2FzZSAweDI0NkQ6CiAgICAgY2FzZSAweDI0ODE6CiAgICAgY2FzZSAweDI0OTU6CiAgICAgY2FzZSAweDI0RUU6Ci0JcmV0dXJuIChkb3VibGUpIDE0OworICAgIHJldHVybiAoZG91YmxlKSAxNDsKICAgICBjYXNlIDB4MjQ2RToKICAgICBjYXNlIDB4MjQ4MjoKICAgICBjYXNlIDB4MjQ5NjoKICAgICBjYXNlIDB4MjRFRjoKLQlyZXR1cm4gKGRvdWJsZSkgMTU7CisgICAgcmV0dXJuIChkb3VibGUpIDE1OwogICAgIGNhc2UgMHgwRjMxOgotICAgICAgICByZXR1cm4gKGRvdWJsZSkgMTUgLyAyOworICAgIHJldHVybiAoZG91YmxlKSAxNSAvIDI7CiAgICAgY2FzZSAweDA5Rjk6CiAgICAgY2FzZSAweDI0NkY6CiAgICAgY2FzZSAweDI0ODM6CiAgICAgY2FzZSAweDI0OTc6CiAgICAgY2FzZSAweDI0RjA6Ci0JcmV0dXJuIChkb3VibGUpIDE2OworICAgIHJldHVybiAoZG91YmxlKSAxNjsKICAgICBjYXNlIDB4MTZFRToKICAgICBjYXNlIDB4MjQ3MDoKICAgICBjYXNlIDB4MjQ4NDoKICAgICBjYXNlIDB4MjQ5ODoKICAgICBjYXNlIDB4MjRGMToKLQlyZXR1cm4gKGRvdWJsZSkgMTc7CisgICAgcmV0dXJuIChkb3VibGUpIDE3OwogICAgIGNhc2UgMHgwRjMyOgotICAgICAgICByZXR1cm4gKGRvdWJsZSkgMTcgLyAyOworICAgIHJldHVybiAoZG91YmxlKSAxNyAvIDI7CiAgICAgY2FzZSAweDE2RUY6CiAgICAgY2FzZSAweDI0NzE6CiAgICAgY2FzZSAweDI0ODU6CiAgICAgY2FzZSAweDI0OTk6CiAgICAgY2FzZSAweDI0RjI6Ci0JcmV0dXJuIChkb3VibGUpIDE4OworICAgIHJldHVybiAoZG91YmxlKSAxODsKICAgICBjYXNlIDB4MTZGMDoKICAgICBjYXNlIDB4MjQ3MjoKICAgICBjYXNlIDB4MjQ4NjoKICAgICBjYXNlIDB4MjQ5QToKICAgICBjYXNlIDB4MjRGMzoKLQlyZXR1cm4gKGRvdWJsZSkgMTk7CisgICAgcmV0dXJuIChkb3VibGUpIDE5OwogICAgIGNhc2UgMHgwOUY1OgogICAgIGNhc2UgMHgxN0YyOgogICAgIGNhc2UgMHgyMTYxOgpAQCAtMzI2LDE0ICszMjYsMTQgQEAKICAgICBjYXNlIDB4MTAxNUU6CiAgICAgY2FzZSAweDEwM0QyOgogI2VuZGlmCi0JcmV0dXJuIChkb3VibGUpIDI7CisgICAgcmV0dXJuIChkb3VibGUpIDI7CiAgICAgY2FzZSAweDIxNTQ6CiAjaWZkZWYgUHlfVU5JQ09ERV9XSURFCiAgICAgY2FzZSAweDEwMTc3OgogI2VuZGlmCi0JcmV0dXJuIChkb3VibGUpIDIgLyAzOworICAgIHJldHVybiAoZG91YmxlKSAyIC8gMzsKICAgICBjYXNlIDB4MjE1NjoKLSAgICAgICAgcmV0dXJuIChkb3VibGUpIDIgLyA1OworICAgIHJldHVybiAoZG91YmxlKSAyIC8gNTsKICAgICBjYXNlIDB4MTM3MzoKICAgICBjYXNlIDB4MjQ3MzoKICAgICBjYXNlIDB4MjQ4NzoKQEAgLTM0NSwzMyArMzQ1LDMzIEBACiAgICAgY2FzZSAweDEwM0Q0OgogICAgIGNhc2UgMHgxMEE0NToKICNlbmRpZgotICAgICAgICByZXR1cm4gKGRvdWJsZSkgMjA7CisgICAgcmV0dXJuIChkb3VibGUpIDIwOwogI2lmZGVmIFB5X1VOSUNPREVfV0lERQogICAgIGNhc2UgMHgxMDExQToKLSAgICAgICAgcmV0dXJuIChkb3VibGUpIDIwMDsKKyAgICByZXR1cm4gKGRvdWJsZSkgMjAwOwogICAgIGNhc2UgMHgxMDEyMzoKLSAgICAgICAgcmV0dXJuIChkb3VibGUpIDIwMDA7CisgICAgcmV0dXJuIChkb3VibGUpIDIwMDA7CiAgICAgY2FzZSAweDEwMTJDOgotICAgICAgICByZXR1cm4gKGRvdWJsZSkgMjAwMDA7CisgICAgcmV0dXJuIChkb3VibGUpIDIwMDAwOwogI2VuZGlmCiAgICAgY2FzZSAweDMyNTE6Ci0gICAgICAgIHJldHVybiAoZG91YmxlKSAyMTsKKyAgICByZXR1cm4gKGRvdWJsZSkgMjE7CiAgICAgY2FzZSAweDMyNTI6Ci0gICAgICAgIHJldHVybiAoZG91YmxlKSAyMjsKKyAgICByZXR1cm4gKGRvdWJsZSkgMjI7CiAgICAgY2FzZSAweDMyNTM6Ci0gICAgICAgIHJldHVybiAoZG91YmxlKSAyMzsKKyAgICByZXR1cm4gKGRvdWJsZSkgMjM7CiAgICAgY2FzZSAweDMyNTQ6Ci0gICAgICAgIHJldHVybiAoZG91YmxlKSAyNDsKKyAgICByZXR1cm4gKGRvdWJsZSkgMjQ7CiAgICAgY2FzZSAweDMyNTU6Ci0gICAgICAgIHJldHVybiAoZG91YmxlKSAyNTsKKyAgICByZXR1cm4gKGRvdWJsZSkgMjU7CiAgICAgY2FzZSAweDMyNTY6Ci0gICAgICAgIHJldHVybiAoZG91YmxlKSAyNjsKKyAgICByZXR1cm4gKGRvdWJsZSkgMjY7CiAgICAgY2FzZSAweDMyNTc6Ci0gICAgICAgIHJldHVybiAoZG91YmxlKSAyNzsKKyAgICByZXR1cm4gKGRvdWJsZSkgMjc7CiAgICAgY2FzZSAweDMyNTg6Ci0gICAgICAgIHJldHVybiAoZG91YmxlKSAyODsKKyAgICByZXR1cm4gKGRvdWJsZSkgMjg7CiAgICAgY2FzZSAweDMyNTk6Ci0gICAgICAgIHJldHVybiAoZG91YmxlKSAyOTsKKyAgICByZXR1cm4gKGRvdWJsZSkgMjk7CiAgICAgY2FzZSAweDA5RjY6CiAgICAgY2FzZSAweDE3RjM6CiAgICAgY2FzZSAweDIxNjI6CkBAIC0zODMsMTggKzM4MywxOCBAQAogI2lmZGVmIFB5X1VOSUNPREVfV0lERQogICAgIGNhc2UgMHgxMDEwOToKICNlbmRpZgotCXJldHVybiAoZG91YmxlKSAzOworICAgIHJldHVybiAoZG91YmxlKSAzOwogICAgIGNhc2UgMHgwRjJCOgotICAgICAgICByZXR1cm4gKGRvdWJsZSkgMyAvIDI7CisgICAgcmV0dXJuIChkb3VibGUpIDMgLyAyOwogICAgIGNhc2UgMHgwMEJFOgogI2lmZGVmIFB5X1VOSUNPREVfV0lERQogICAgIGNhc2UgMHgxMDE3ODoKICNlbmRpZgotCXJldHVybiAoZG91YmxlKSAzIC8gNDsKKyAgICByZXR1cm4gKGRvdWJsZSkgMyAvIDQ7CiAgICAgY2FzZSAweDIxNTc6Ci0JcmV0dXJuIChkb3VibGUpIDMgLyA1OworICAgIHJldHVybiAoZG91YmxlKSAzIC8gNTsKICAgICBjYXNlIDB4MjE1QzoKLQlyZXR1cm4gKGRvdWJsZSkgMyAvIDg7CisgICAgcmV0dXJuIChkb3VibGUpIDMgLyA4OwogICAgIGNhc2UgMHgxMzc0OgogICAgIGNhc2UgMHgzMDNBOgogICAgIGNhc2UgMHgzMjVBOgpAQCAtNDAyLDM0ICs0MDIsMzQgQEAKICAgICBjYXNlIDB4MTAxMTI6CiAgICAgY2FzZSAweDEwMTY1OgogI2VuZGlmCi0JcmV0dXJuIChkb3VibGUpIDMwOworICAgIHJldHVybiAoZG91YmxlKSAzMDsKICNpZmRlZiBQeV9VTklDT0RFX1dJREUKICAgICBjYXNlIDB4MTAxMUI6CiAgICAgY2FzZSAweDEwMTZCOgotICAgICAgICByZXR1cm4gKGRvdWJsZSkgMzAwOworICAgIHJldHVybiAoZG91YmxlKSAzMDA7CiAgICAgY2FzZSAweDEwMTI0OgotICAgICAgICByZXR1cm4gKGRvdWJsZSkgMzAwMDsKKyAgICByZXR1cm4gKGRvdWJsZSkgMzAwMDsKICAgICBjYXNlIDB4MTAxMkQ6Ci0gICAgICAgIHJldHVybiAoZG91YmxlKSAzMDAwMDsKKyAgICByZXR1cm4gKGRvdWJsZSkgMzAwMDA7CiAjZW5kaWYKICAgICBjYXNlIDB4MzI1QjoKLSAgICAgICAgcmV0dXJuIChkb3VibGUpIDMxOworICAgIHJldHVybiAoZG91YmxlKSAzMTsKICAgICBjYXNlIDB4MzI1QzoKLSAgICAgICAgcmV0dXJuIChkb3VibGUpIDMyOworICAgIHJldHVybiAoZG91YmxlKSAzMjsKICAgICBjYXNlIDB4MzI1RDoKLSAgICAgICAgcmV0dXJuIChkb3VibGUpIDMzOworICAgIHJldHVybiAoZG91YmxlKSAzMzsKICAgICBjYXNlIDB4MzI1RToKLSAgICAgICAgcmV0dXJuIChkb3VibGUpIDM0OworICAgIHJldHVybiAoZG91YmxlKSAzNDsKICAgICBjYXNlIDB4MzI1RjoKLSAgICAgICAgcmV0dXJuIChkb3VibGUpIDM1OworICAgIHJldHVybiAoZG91YmxlKSAzNTsKICAgICBjYXNlIDB4MzJCMToKLSAgICAgICAgcmV0dXJuIChkb3VibGUpIDM2OworICAgIHJldHVybiAoZG91YmxlKSAzNjsKICAgICBjYXNlIDB4MzJCMjoKLSAgICAgICAgcmV0dXJuIChkb3VibGUpIDM3OworICAgIHJldHVybiAoZG91YmxlKSAzNzsKICAgICBjYXNlIDB4MzJCMzoKLSAgICAgICAgcmV0dXJuIChkb3VibGUpIDM4OworICAgIHJldHVybiAoZG91YmxlKSAzODsKICAgICBjYXNlIDB4MzJCNDoKLSAgICAgICAgcmV0dXJuIChkb3VibGUpIDM5OworICAgIHJldHVybiAoZG91YmxlKSAzOTsKICAgICBjYXNlIDB4MDlGNzoKICAgICBjYXNlIDB4MTdGNDoKICAgICBjYXNlIDB4MjE2MzoKQEAgLTQ0MSw0MSArNDQxLDQxIEBACiAjaWZkZWYgUHlfVU5JQ09ERV9XSURFCiAgICAgY2FzZSAweDEwMTBBOgogI2VuZGlmCi0JcmV0dXJuIChkb3VibGUpIDQ7CisgICAgcmV0dXJuIChkb3VibGUpIDQ7CiAgICAgY2FzZSAweDIxNTg6Ci0JcmV0dXJuIChkb3VibGUpIDQgLyA1OworICAgIHJldHVybiAoZG91YmxlKSA0IC8gNTsKICAgICBjYXNlIDB4MTM3NToKICAgICBjYXNlIDB4MzJCNToKICNpZmRlZiBQeV9VTklDT0RFX1dJREUKICAgICBjYXNlIDB4MTAxMTM6CiAjZW5kaWYKLSAgICAgICAgcmV0dXJuIChkb3VibGUpIDQwOworICAgIHJldHVybiAoZG91YmxlKSA0MDsKICNpZmRlZiBQeV9VTklDT0RFX1dJREUKICAgICBjYXNlIDB4MTAxMUM6Ci0gICAgICAgIHJldHVybiAoZG91YmxlKSA0MDA7CisgICAgcmV0dXJuIChkb3VibGUpIDQwMDsKICAgICBjYXNlIDB4MTAxMjU6Ci0gICAgICAgIHJldHVybiAoZG91YmxlKSA0MDAwOworICAgIHJldHVybiAoZG91YmxlKSA0MDAwOwogICAgIGNhc2UgMHgxMDEyRToKLSAgICAgICAgcmV0dXJuIChkb3VibGUpIDQwMDAwOworICAgIHJldHVybiAoZG91YmxlKSA0MDAwMDsKICNlbmRpZgogICAgIGNhc2UgMHgzMkI2OgotICAgICAgICByZXR1cm4gKGRvdWJsZSkgNDE7CisgICAgcmV0dXJuIChkb3VibGUpIDQxOwogICAgIGNhc2UgMHgzMkI3OgotICAgICAgICByZXR1cm4gKGRvdWJsZSkgNDI7CisgICAgcmV0dXJuIChkb3VibGUpIDQyOwogICAgIGNhc2UgMHgzMkI4OgotICAgICAgICByZXR1cm4gKGRvdWJsZSkgNDM7CisgICAgcmV0dXJuIChkb3VibGUpIDQzOwogICAgIGNhc2UgMHgzMkI5OgotICAgICAgICByZXR1cm4gKGRvdWJsZSkgNDQ7CisgICAgcmV0dXJuIChkb3VibGUpIDQ0OwogICAgIGNhc2UgMHgzMkJBOgotICAgICAgICByZXR1cm4gKGRvdWJsZSkgNDU7CisgICAgcmV0dXJuIChkb3VibGUpIDQ1OwogICAgIGNhc2UgMHgzMkJCOgotICAgICAgICByZXR1cm4gKGRvdWJsZSkgNDY7CisgICAgcmV0dXJuIChkb3VibGUpIDQ2OwogICAgIGNhc2UgMHgzMkJDOgotICAgICAgICByZXR1cm4gKGRvdWJsZSkgNDc7CisgICAgcmV0dXJuIChkb3VibGUpIDQ3OwogICAgIGNhc2UgMHgzMkJEOgotICAgICAgICByZXR1cm4gKGRvdWJsZSkgNDg7CisgICAgcmV0dXJuIChkb3VibGUpIDQ4OwogICAgIGNhc2UgMHgzMkJFOgotICAgICAgICByZXR1cm4gKGRvdWJsZSkgNDk7CisgICAgcmV0dXJuIChkb3VibGUpIDQ5OwogICAgIGNhc2UgMHgxN0Y1OgogICAgIGNhc2UgMHgyMTY0OgogICAgIGNhc2UgMHgyMTc0OgpAQCAtNDkxLDEzICs0OTEsMTMgQEAKICAgICBjYXNlIDB4MTAxNzM6CiAgICAgY2FzZSAweDEwMzIxOgogI2VuZGlmCi0JcmV0dXJuIChkb3VibGUpIDU7CisgICAgcmV0dXJuIChkb3VibGUpIDU7CiAgICAgY2FzZSAweDBGMkM6Ci0gICAgICAgIHJldHVybiAoZG91YmxlKSA1IC8gMjsKKyAgICByZXR1cm4gKGRvdWJsZSkgNSAvIDI7CiAgICAgY2FzZSAweDIxNUE6Ci0JcmV0dXJuIChkb3VibGUpIDUgLyA2OworICAgIHJldHVybiAoZG91YmxlKSA1IC8gNjsKICAgICBjYXNlIDB4MjE1RDoKLQlyZXR1cm4gKGRvdWJsZSkgNSAvIDg7CisgICAgcmV0dXJuIChkb3VibGUpIDUgLyA4OwogICAgIGNhc2UgMHgxMzc2OgogICAgIGNhc2UgMHgyMTZDOgogICAgIGNhc2UgMHgyMTdDOgpAQCAtNTE0LDcgKzUxNCw3IEBACiAgICAgY2FzZSAweDEwMTc0OgogICAgIGNhc2UgMHgxMDMyMzoKICNlbmRpZgotCXJldHVybiAoZG91YmxlKSA1MDsKKyAgICByZXR1cm4gKGRvdWJsZSkgNTA7CiAgICAgY2FzZSAweDIxNkU6CiAgICAgY2FzZSAweDIxN0U6CiAjaWZkZWYgUHlfVU5JQ09ERV9XSURFCkBAIC01MjgsNyArNTI4LDcgQEAKICAgICBjYXNlIDB4MTAxNkY6CiAgICAgY2FzZSAweDEwMTcwOgogI2VuZGlmCi0JcmV0dXJuIChkb3VibGUpIDUwMDsKKyAgICByZXR1cm4gKGRvdWJsZSkgNTAwOwogICAgIGNhc2UgMHgyMTgxOgogI2lmZGVmIFB5X1VOSUNPREVfV0lERQogICAgIGNhc2UgMHgxMDEyNjoKQEAgLTUzNiwxMiArNTM2LDEyIEBACiAgICAgY2FzZSAweDEwMTRFOgogICAgIGNhc2UgMHgxMDE3MjoKICNlbmRpZgotCXJldHVybiAoZG91YmxlKSA1MDAwOworICAgIHJldHVybiAoZG91YmxlKSA1MDAwOwogI2lmZGVmIFB5X1VOSUNPREVfV0lERQogICAgIGNhc2UgMHgxMDEyRjoKICAgICBjYXNlIDB4MTAxNDc6CiAgICAgY2FzZSAweDEwMTU2OgotICAgICAgICByZXR1cm4gKGRvdWJsZSkgNTAwMDA7CisgICAgcmV0dXJuIChkb3VibGUpIDUwMDAwOwogI2VuZGlmCiAgICAgY2FzZSAweDE3RjY6CiAgICAgY2FzZSAweDIxNjU6CkBAIC01NTIsMTkgKzU1MiwxOSBAQAogI2lmZGVmIFB5X1VOSUNPREVfV0lERQogICAgIGNhc2UgMHgxMDEwQzoKICNlbmRpZgotCXJldHVybiAoZG91YmxlKSA2OworICAgIHJldHVybiAoZG91YmxlKSA2OwogICAgIGNhc2UgMHgxMzc3OgogI2lmZGVmIFB5X1VOSUNPREVfV0lERQogICAgIGNhc2UgMHgxMDExNToKICNlbmRpZgotCXJldHVybiAoZG91YmxlKSA2MDsKKyAgICByZXR1cm4gKGRvdWJsZSkgNjA7CiAjaWZkZWYgUHlfVU5JQ09ERV9XSURFCiAgICAgY2FzZSAweDEwMTFFOgotICAgICAgICByZXR1cm4gKGRvdWJsZSkgNjAwOworICAgIHJldHVybiAoZG91YmxlKSA2MDA7CiAgICAgY2FzZSAweDEwMTI3OgotICAgICAgICByZXR1cm4gKGRvdWJsZSkgNjAwMDsKKyAgICByZXR1cm4gKGRvdWJsZSkgNjAwMDsKICAgICBjYXNlIDB4MTAxMzA6Ci0gICAgICAgIHJldHVybiAoZG91YmxlKSA2MDAwMDsKKyAgICByZXR1cm4gKGRvdWJsZSkgNjAwMDA7CiAjZW5kaWYKICAgICBjYXNlIDB4MTdGNzoKICAgICBjYXNlIDB4MjE2NjoKQEAgLTU3NSwyMyArNTc1LDIzIEBACiAjaWZkZWYgUHlfVU5JQ09ERV9XSURFCiAgICAgY2FzZSAweDEwMTBEOgogI2VuZGlmCi0JcmV0dXJuIChkb3VibGUpIDc7CisgICAgcmV0dXJuIChkb3VibGUpIDc7CiAgICAgY2FzZSAweDBGMkQ6Ci0gICAgICAgIHJldHVybiAoZG91YmxlKSA3IC8gMjsKKyAgICByZXR1cm4gKGRvdWJsZSkgNyAvIDI7CiAgICAgY2FzZSAweDIxNUU6Ci0JcmV0dXJuIChkb3VibGUpIDcgLyA4OworICAgIHJldHVybiAoZG91YmxlKSA3IC8gODsKICAgICBjYXNlIDB4MTM3ODoKICNpZmRlZiBQeV9VTklDT0RFX1dJREUKICAgICBjYXNlIDB4MTAxMTY6CiAjZW5kaWYKLQlyZXR1cm4gKGRvdWJsZSkgNzA7CisgICAgcmV0dXJuIChkb3VibGUpIDcwOwogI2lmZGVmIFB5X1VOSUNPREVfV0lERQogICAgIGNhc2UgMHgxMDExRjoKLSAgICAgICAgcmV0dXJuIChkb3VibGUpIDcwMDsKKyAgICByZXR1cm4gKGRvdWJsZSkgNzAwOwogICAgIGNhc2UgMHgxMDEyODoKLSAgICAgICAgcmV0dXJuIChkb3VibGUpIDcwMDA7CisgICAgcmV0dXJuIChkb3VibGUpIDcwMDA7CiAgICAgY2FzZSAweDEwMTMxOgotICAgICAgICByZXR1cm4gKGRvdWJsZSkgNzAwMDA7CisgICAgcmV0dXJuIChkb3VibGUpIDcwMDAwOwogI2VuZGlmCiAgICAgY2FzZSAweDE3Rjg6CiAgICAgY2FzZSAweDIxNjc6CkBAIC02MDIsMTkgKzYwMiwxOSBAQAogI2lmZGVmIFB5X1VOSUNPREVfV0lERQogICAgIGNhc2UgMHgxMDEwRToKICNlbmRpZgotCXJldHVybiAoZG91YmxlKSA4OworICAgIHJldHVybiAoZG91YmxlKSA4OwogICAgIGNhc2UgMHgxMzc5OgogI2lmZGVmIFB5X1VOSUNPREVfV0lERQogICAgIGNhc2UgMHgxMDExNzoKICNlbmRpZgotCXJldHVybiAoZG91YmxlKSA4MDsKKyAgICByZXR1cm4gKGRvdWJsZSkgODA7CiAjaWZkZWYgUHlfVU5JQ09ERV9XSURFCiAgICAgY2FzZSAweDEwMTIwOgotICAgICAgICByZXR1cm4gKGRvdWJsZSkgODAwOworICAgIHJldHVybiAoZG91YmxlKSA4MDA7CiAgICAgY2FzZSAweDEwMTI5OgotICAgICAgICByZXR1cm4gKGRvdWJsZSkgODAwMDsKKyAgICByZXR1cm4gKGRvdWJsZSkgODAwMDsKICAgICBjYXNlIDB4MTAxMzI6Ci0gICAgICAgIHJldHVybiAoZG91YmxlKSA4MDAwMDsKKyAgICByZXR1cm4gKGRvdWJsZSkgODAwMDA7CiAjZW5kaWYKICAgICBjYXNlIDB4MTdGOToKICAgICBjYXNlIDB4MjE2ODoKQEAgLTYyNSwyNSArNjI1LDI1IEBACiAjaWZkZWYgUHlfVU5JQ09ERV9XSURFCiAgICAgY2FzZSAweDEwMTBGOgogI2VuZGlmCi0JcmV0dXJuIChkb3VibGUpIDk7CisgICAgcmV0dXJuIChkb3VibGUpIDk7CiAgICAgY2FzZSAweDBGMkU6Ci0gICAgICAgIHJldHVybiAoZG91YmxlKSA5IC8gMjsKKyAgICByZXR1cm4gKGRvdWJsZSkgOSAvIDI7CiAgICAgY2FzZSAweDEzN0E6CiAjaWZkZWYgUHlfVU5JQ09ERV9XSURFCiAgICAgY2FzZSAweDEwMTE4OgogI2VuZGlmCi0JcmV0dXJuIChkb3VibGUpIDkwOworICAgIHJldHVybiAoZG91YmxlKSA5MDsKICNpZmRlZiBQeV9VTklDT0RFX1dJREUKICAgICBjYXNlIDB4MTAxMjE6CiAgICAgY2FzZSAweDEwMzRBOgotICAgICAgICByZXR1cm4gKGRvdWJsZSkgOTAwOworICAgIHJldHVybiAoZG91YmxlKSA5MDA7CiAgICAgY2FzZSAweDEwMTJBOgotICAgICAgICByZXR1cm4gKGRvdWJsZSkgOTAwMDsKKyAgICByZXR1cm4gKGRvdWJsZSkgOTAwMDsKICAgICBjYXNlIDB4MTAxMzM6Ci0gICAgICAgIHJldHVybiAoZG91YmxlKSA5MDAwMDsKKyAgICByZXR1cm4gKGRvdWJsZSkgOTAwMDA7CiAjZW5kaWYKICAgICBkZWZhdWx0OgotCXJldHVybiAoZG91YmxlKSBfUHlVbmljb2RlX1RvRGlnaXQoY2gpOworICAgIHJldHVybiAoZG91YmxlKSBfUHlVbmljb2RlX1RvRGlnaXQoY2gpOwogICAgIH0KIH0KIApAQCAtNjkwLDkgKzY5MCw5IEBACiAgICAgY2FzZSAweDIwMkY6IC8qIE5BUlJPVyBOTy1CUkVBSyBTUEFDRSAqLwogICAgIGNhc2UgMHgyMDVGOiAvKiBNRURJVU0gTUFUSEVNQVRJQ0FMIFNQQUNFICovCiAgICAgY2FzZSAweDMwMDA6IC8qIElERU9HUkFQSElDIFNQQUNFICovCi0JcmV0dXJuIDE7CisgICAgcmV0dXJuIDE7CiAgICAgZGVmYXVsdDoKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKICAgICB9CiB9CiAKQEAgLTcyNCw5ICs3MjQsOSBAQAogICAgIGNvbnN0IF9QeVVuaWNvZGVfVHlwZVJlY29yZCAqY3R5cGUgPSBnZXR0eXBlcmVjb3JkKGNoKTsKICAgICBpbnQgZGVsdGEgPSBjdHlwZS0+dXBwZXI7CiAgICAgaWYgKGN0eXBlLT5mbGFncyAmIE5PREVMVEFfTUFTSykKLQlyZXR1cm4gZGVsdGE7CisgICAgcmV0dXJuIGRlbHRhOwogICAgIGlmIChkZWx0YSA+PSAzMjc2OCkKLQkgICAgZGVsdGEgLT0gNjU1MzY7CisgICAgICAgIGRlbHRhIC09IDY1NTM2OwogICAgIHJldHVybiBjaCArIGRlbHRhOwogfQogCkBAIC03MzgsOSArNzM4LDkgQEAKICAgICBjb25zdCBfUHlVbmljb2RlX1R5cGVSZWNvcmQgKmN0eXBlID0gZ2V0dHlwZXJlY29yZChjaCk7CiAgICAgaW50IGRlbHRhID0gY3R5cGUtPmxvd2VyOwogICAgIGlmIChjdHlwZS0+ZmxhZ3MgJiBOT0RFTFRBX01BU0spCi0JcmV0dXJuIGRlbHRhOworICAgIHJldHVybiBkZWx0YTsKICAgICBpZiAoZGVsdGEgPj0gMzI3NjgpCi0JICAgIGRlbHRhIC09IDY1NTM2OworICAgICAgICBkZWx0YSAtPSA2NTUzNjsKICAgICByZXR1cm4gY2ggKyBkZWx0YTsKIH0KIApkaWZmIC0tZ2l0IGEvT2JqZWN0cy93ZWFrcmVmb2JqZWN0LmMgYi9PYmplY3RzL3dlYWtyZWZvYmplY3QuYwppbmRleCAxYTk5OGI2Li4wZTQ2ZDkyIDEwMDY0NAotLS0gYS9PYmplY3RzL3dlYWtyZWZvYmplY3QuYworKysgYi9PYmplY3RzL3dlYWtyZWZvYmplY3QuYwpAQCAtNTcsOSArNTcsOSBAQAogICAgICAgICAgICAgUHlXZWFrcmVmX0dFVF9PQkpFQ1Qoc2VsZikpOwogCiAgICAgICAgIGlmICgqbGlzdCA9PSBzZWxmKQotCSAgICAvKiBJZiAnc2VsZicgaXMgdGhlIGVuZCBvZiB0aGUgbGlzdCAoYW5kIHRodXMgc2VsZi0+d3JfbmV4dCA9PSBOVUxMKQotCSAgICAgICB0aGVuIHRoZSB3ZWFrcmVmIGxpc3QgaXRzZWxmIChhbmQgdGh1cyB0aGUgdmFsdWUgb2YgKmxpc3QpIHdpbGwKLQkgICAgICAgZW5kIHVwIGJlaW5nIHNldCB0byBOVUxMLiAqLworICAgICAgICAgICAgLyogSWYgJ3NlbGYnIGlzIHRoZSBlbmQgb2YgdGhlIGxpc3QgKGFuZCB0aHVzIHNlbGYtPndyX25leHQgPT0gTlVMTCkKKyAgICAgICAgICAgICAgIHRoZW4gdGhlIHdlYWtyZWYgbGlzdCBpdHNlbGYgKGFuZCB0aHVzIHRoZSB2YWx1ZSBvZiAqbGlzdCkgd2lsbAorICAgICAgICAgICAgICAgZW5kIHVwIGJlaW5nIHNldCB0byBOVUxMLiAqLwogICAgICAgICAgICAgKmxpc3QgPSBzZWxmLT53cl9uZXh0OwogICAgICAgICBzZWxmLT53cl9vYmplY3QgPSBQeV9Ob25lOwogICAgICAgICBpZiAoc2VsZi0+d3JfcHJldiAhPSBOVUxMKQpAQCAtMTYxLDIxICsxNjEsMjEgQEAKICAgICAgICAgUHlPU19zbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCAiPHdlYWtyZWYgYXQgJXA7IGRlYWQ+Iiwgc2VsZik7CiAgICAgfQogICAgIGVsc2UgewotCWNoYXIgKm5hbWUgPSBOVUxMOwotCVB5T2JqZWN0ICpuYW1lb2JqID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhQeVdlYWtyZWZfR0VUX09CSkVDVChzZWxmKSwKLQkJCQkJCSAgICJfX25hbWVfXyIpOwotCWlmIChuYW1lb2JqID09IE5VTEwpCi0JCVB5RXJyX0NsZWFyKCk7Ci0JZWxzZSBpZiAoUHlTdHJpbmdfQ2hlY2sobmFtZW9iaikpCi0JCW5hbWUgPSBQeVN0cmluZ19BU19TVFJJTkcobmFtZW9iaik7CisgICAgICAgIGNoYXIgKm5hbWUgPSBOVUxMOworICAgICAgICBQeU9iamVjdCAqbmFtZW9iaiA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoUHlXZWFrcmVmX0dFVF9PQkpFQ1Qoc2VsZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX19uYW1lX18iKTsKKyAgICAgICAgaWYgKG5hbWVvYmogPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBlbHNlIGlmIChQeVN0cmluZ19DaGVjayhuYW1lb2JqKSkKKyAgICAgICAgICAgICAgICBuYW1lID0gUHlTdHJpbmdfQVNfU1RSSU5HKG5hbWVvYmopOwogICAgICAgICBQeU9TX3NucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksCi0JCSAgICAgIG5hbWUgPyAiPHdlYWtyZWYgYXQgJXA7IHRvICclLjUwcycgYXQgJXAgKCVzKT4iCi0JCSAgICAgICAgICAgOiAiPHdlYWtyZWYgYXQgJXA7IHRvICclLjUwcycgYXQgJXA+IiwKLQkJICAgICAgc2VsZiwKLQkJICAgICAgUHlfVFlQRShQeVdlYWtyZWZfR0VUX09CSkVDVChzZWxmKSktPnRwX25hbWUsCi0JCSAgICAgIFB5V2Vha3JlZl9HRVRfT0JKRUNUKHNlbGYpLAotCQkgICAgICBuYW1lKTsKLQlQeV9YREVDUkVGKG5hbWVvYmopOworICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPyAiPHdlYWtyZWYgYXQgJXA7IHRvICclLjUwcycgYXQgJXAgKCVzKT4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICI8d2Vha3JlZiBhdCAlcDsgdG8gJyUuNTBzJyBhdCAlcD4iLAorICAgICAgICAgICAgICAgICAgICAgIHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRShQeVdlYWtyZWZfR0VUX09CSkVDVChzZWxmKSktPnRwX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgUHlXZWFrcmVmX0dFVF9PQkpFQ1Qoc2VsZiksCisgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7CisgICAgICAgIFB5X1hERUNSRUYobmFtZW9iaik7CiAgICAgfQogICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1ZmZlcik7CiB9CkBAIC0zMzcsMTAgKzMzNywxMCBAQAogICAgIHNpemVvZihQeVdlYWtSZWZlcmVuY2UpLAogICAgIDAsCiAgICAgd2Vha3JlZl9kZWFsbG9jLCAgICAgICAgICAgIC8qdHBfZGVhbGxvYyovCi0gICAgMCwJICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9wcmludCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcHJpbnQqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHIqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHIqLwotICAgIDAsCSAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY29tcGFyZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY29tcGFyZSovCiAgICAgKHJlcHJmdW5jKXdlYWtyZWZfcmVwciwgICAgIC8qdHBfcmVwciovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbnVtYmVyKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19zZXF1ZW5jZSovCkBAIC0zNTYsNyArMzU2LDcgQEAKICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kb2MqLwogICAgICh0cmF2ZXJzZXByb2MpZ2NfdHJhdmVyc2UsICAvKnRwX3RyYXZlcnNlKi8KICAgICAoaW5xdWlyeSlnY19jbGVhciwgICAgICAgICAgLyp0cF9jbGVhciovCi0gICAgKHJpY2hjbXBmdW5jKXdlYWtyZWZfcmljaGNvbXBhcmUsCS8qdHBfcmljaGNvbXBhcmUqLworICAgIChyaWNoY21wZnVuYyl3ZWFrcmVmX3JpY2hjb21wYXJlLCAgIC8qdHBfcmljaGNvbXBhcmUqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVyKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVybmV4dCovCkBAIC00MzYsOSArNDM2LDkgQEAKICNkZWZpbmUgV1JBUF9NRVRIT0QobWV0aG9kLCBzcGVjaWFsKSBcCiAgICAgc3RhdGljIFB5T2JqZWN0ICogXAogICAgIG1ldGhvZChQeU9iamVjdCAqcHJveHkpIHsgXAotCSAgICBVTldSQVAocHJveHkpOyBcCi0JCXJldHVybiBQeU9iamVjdF9DYWxsTWV0aG9kKHByb3h5LCBzcGVjaWFsLCAiIik7IFwKLQl9CisgICAgICAgICAgICBVTldSQVAocHJveHkpOyBcCisgICAgICAgICAgICAgICAgcmV0dXJuIFB5T2JqZWN0X0NhbGxNZXRob2QocHJveHksIHNwZWNpYWwsICIiKTsgXAorICAgICAgICB9CiAKIAogLyogZGlyZWN0IHNsb3RzICovCkBAIC00NTIsOSArNDUyLDkgQEAKIHsKICAgICBjaGFyIGJ1ZlsxNjBdOwogICAgIFB5T1Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwKLQkJICAiPHdlYWtwcm94eSBhdCAlcCB0byAlLjEwMHMgYXQgJXA+IiwgcHJveHksCi0JCSAgUHlfVFlQRShQeVdlYWtyZWZfR0VUX09CSkVDVChwcm94eSkpLT50cF9uYW1lLAotCQkgIFB5V2Vha3JlZl9HRVRfT0JKRUNUKHByb3h5KSk7CisgICAgICAgICAgICAgICAgICAiPHdlYWtwcm94eSBhdCAlcCB0byAlLjEwMHMgYXQgJXA+IiwgcHJveHksCisgICAgICAgICAgICAgICAgICBQeV9UWVBFKFB5V2Vha3JlZl9HRVRfT0JKRUNUKHByb3h5KSktPnRwX25hbWUsCisgICAgICAgICAgICAgICAgICBQeVdlYWtyZWZfR0VUX09CSkVDVChwcm94eSkpOwogICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CiB9CiAKQEAgLTYwNCw4ICs2MDQsOCBAQAogCiAKIHN0YXRpYyBQeU1ldGhvZERlZiBwcm94eV9tZXRob2RzW10gPSB7Ci0JeyJfX3VuaWNvZGVfXyIsIChQeUNGdW5jdGlvbilwcm94eV91bmljb2RlLCBNRVRIX05PQVJHU30sCi0Je05VTEwsIE5VTEx9CisgICAgICAgIHsiX191bmljb2RlX18iLCAoUHlDRnVuY3Rpb24pcHJveHlfdW5pY29kZSwgTUVUSF9OT0FSR1N9LAorICAgICAgICB7TlVMTCwgTlVMTH0KIH07CiAKIApAQCAtNjc3LDIwICs2NzcsMjAgQEAKICAgICAwLAogICAgIC8qIG1ldGhvZHMgKi8KICAgICAoZGVzdHJ1Y3Rvcilwcm94eV9kZWFsbG9jLCAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCi0gICAgMCwJCQkJICAgICAgICAvKiB0cF9wcmludCAqLwotICAgIDAsCQkJCSAgICAgICAgLyogdHBfZ2V0YXR0ciAqLwotICAgIDAsIAkJCQkgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KLSAgICBwcm94eV9jb21wYXJlLAkJICAgICAgICAvKiB0cF9jb21wYXJlICovCi0gICAgKHJlcHJmdW5jKXByb3h5X3JlcHIsCSAgICAgICAgLyogdHBfcmVwciAqLwotICAgICZwcm94eV9hc19udW1iZXIsCQkgICAgICAgIC8qIHRwX2FzX251bWJlciAqLwotICAgICZwcm94eV9hc19zZXF1ZW5jZSwJCSAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KLSAgICAmcHJveHlfYXNfbWFwcGluZywJCSAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLwotICAgIDAsCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLwotICAgIDAsCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICBwcm94eV9jb21wYXJlLCAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgKHJlcHJmdW5jKXByb3h5X3JlcHIsICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgICZwcm94eV9hc19udW1iZXIsICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgICZwcm94eV9hc19zZXF1ZW5jZSwgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgJnByb3h5X2FzX21hcHBpbmcsICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCiAgICAgcHJveHlfc3RyLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCiAgICAgcHJveHlfZ2V0YXR0ciwgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KICAgICAoc2V0YXR0cm9mdW5jKXByb3h5X3NldGF0dHIsICAgICAgICAvKiB0cF9zZXRhdHRybyAqLwotICAgIDAsCQkJCSAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCiAgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDCiAgICAgfCBQeV9UUEZMQUdTX0NIRUNLVFlQRVMsICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KQEAgLTcwMCw3ICs3MDAsNyBAQAogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCiAgICAgKGdldGl0ZXJmdW5jKXByb3h5X2l0ZXIsICAgICAgICAgICAgLyogdHBfaXRlciAqLwogICAgIChpdGVybmV4dGZ1bmMpcHJveHlfaXRlcm5leHQsICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCi0JcHJveHlfbWV0aG9kcywgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgICAgICBwcm94eV9tZXRob2RzLCAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCiB9OwogCiAKQEAgLTcxMiwyMCArNzEyLDIwIEBACiAgICAgMCwKICAgICAvKiBtZXRob2RzICovCiAgICAgKGRlc3RydWN0b3IpcHJveHlfZGVhbGxvYywgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLwotICAgIDAsCQkJCSAgICAgICAgLyogdHBfcHJpbnQgKi8KLSAgICAwLAkJCQkgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KLSAgICAwLCAJCQkJICAgICAgICAvKiB0cF9zZXRhdHRyICovCi0gICAgcHJveHlfY29tcGFyZSwJCSAgICAgICAgLyogdHBfY29tcGFyZSAqLwotICAgICh1bmFyeWZ1bmMpcHJveHlfcmVwciwJICAgICAgICAvKiB0cF9yZXByICovCi0gICAgJnByb3h5X2FzX251bWJlciwJCSAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCi0gICAgJnByb3h5X2FzX3NlcXVlbmNlLAkJICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLwotICAgICZwcm94eV9hc19tYXBwaW5nLAkJICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCi0gICAgMCwJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCi0gICAgcHJveHlfY2FsbCwJICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLwotICAgIHByb3h5X3N0ciwJICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIHByb3h5X2NvbXBhcmUsICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAodW5hcnlmdW5jKXByb3h5X3JlcHIsICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgJnByb3h5X2FzX251bWJlciwgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgJnByb3h5X2FzX3NlcXVlbmNlLCAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAmcHJveHlfYXNfbWFwcGluZywgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIHByb3h5X2NhbGwsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICBwcm94eV9zdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KICAgICBwcm94eV9nZXRhdHRyLCAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLwogICAgIChzZXRhdHRyb2Z1bmMpcHJveHlfc2V0YXR0ciwgICAgICAgIC8qIHRwX3NldGF0dHJvICovCi0gICAgMCwJCQkJICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KICAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MKICAgICB8IFB5X1RQRkxBR1NfQ0hFQ0tUWVBFUywgICAgICAgICAgICAvKiB0cF9mbGFncyAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLwpAQCAtNzQ4LDcgKzc0OCw3IEBACiAKICAgICBpZiAoIVB5VHlwZV9TVVBQT1JUU19XRUFLUkVGUyhQeV9UWVBFKG9iKSkpIHsKICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJICAgICAiY2Fubm90IGNyZWF0ZSB3ZWFrIHJlZmVyZW5jZSB0byAnJXMnIG9iamVjdCIsCisgICAgICAgICAgICAgICAgICAgICAiY2Fubm90IGNyZWF0ZSB3ZWFrIHJlZmVyZW5jZSB0byAnJXMnIG9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICBQeV9UWVBFKG9iKS0+dHBfbmFtZSk7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KQEAgLTgwNyw3ICs4MDcsNyBAQAogCiAgICAgaWYgKCFQeVR5cGVfU1VQUE9SVFNfV0VBS1JFRlMoUHlfVFlQRShvYikpKSB7CiAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCSAgICAgImNhbm5vdCBjcmVhdGUgd2VhayByZWZlcmVuY2UgdG8gJyVzJyBvYmplY3QiLAorICAgICAgICAgICAgICAgICAgICAgImNhbm5vdCBjcmVhdGUgd2VhayByZWZlcmVuY2UgdG8gJyVzJyBvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRShvYiktPnRwX25hbWUpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CkBAIC05MzIsNyArOTMyLDcgQEAKICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICBQeU9iamVjdCAqdHVwbGU7CiAgICAgICAgICAgICBQeV9zc2l6ZV90IGkgPSAwOwotICAgIAorCiAgICAgICAgICAgICB0dXBsZSA9IFB5VHVwbGVfTmV3KGNvdW50ICogMik7CiAgICAgICAgICAgICBpZiAodHVwbGUgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIGlmIChyZXN0b3JlX2Vycm9yKQpkaWZmIC0tZ2l0IGEvUEMvVlM3LjEvbWFrZV9idWlsZGluZm8uYyBiL1BDL1ZTNy4xL21ha2VfYnVpbGRpbmZvLmMKaW5kZXggMjc1ODBiYi4uMmFhMmI2NiAxMDA2NDQKLS0tIGEvUEMvVlM3LjEvbWFrZV9idWlsZGluZm8uYworKysgYi9QQy9WUzcuMS9tYWtlX2J1aWxkaW5mby5jCkBAIC0yMSw3MiArMjEsNzIgQEAKIAogaW50IG1ha2VfYnVpbGRpbmZvMigpCiB7Ci0Jc3RydWN0IF9zdGF0IHN0OwotCUhLRVkgaFRvcnRvaXNlOwotCWNoYXIgY29tbWFuZFs1MDBdOwotCURXT1JEIHR5cGUsIHNpemU7Ci0JaWYgKF9zdGF0KCIuc3ZuIiwgJnN0KSA8IDApCi0JCXJldHVybiAwOwotCS8qIEFsbG93IHN1cHByZXNzaW9uIG9mIHN1YndjcmV2LmV4ZSBpbnZvY2F0aW9uIGlmIGEgbm9fc3Vid2NyZXYgZmlsZSBpcyBwcmVzZW50LiAqLwotCWlmIChfc3RhdCgibm9fc3Vid2NyZXYiLCAmc3QpID09IDApCi0JCXJldHVybiAwOwotCWlmIChSZWdPcGVuS2V5KEhLRVlfTE9DQUxfTUFDSElORSwgIlNvZnR3YXJlXFxUb3J0b2lzZVNWTiIsICZoVG9ydG9pc2UpICE9IEVSUk9SX1NVQ0NFU1MgJiYKLQkgICAgUmVnT3BlbktleShIS0VZX0NVUlJFTlRfVVNFUiwgIlNvZnR3YXJlXFxUb3J0b2lzZVNWTiIsICZoVG9ydG9pc2UpICE9IEVSUk9SX1NVQ0NFU1MpCi0JCS8qIFRvcnRvaXNlIG5vdCBpbnN0YWxsZWQgKi8KLQkJcmV0dXJuIDA7Ci0JY29tbWFuZFswXSA9ICciJzsgIC8qIHF1b3RlIHRoZSBwYXRoIHRvIHRoZSBleGVjdXRhYmxlICovCi0Jc2l6ZSA9IHNpemVvZihjb21tYW5kKSAtIDE7Ci0JaWYgKFJlZ1F1ZXJ5VmFsdWVFeChoVG9ydG9pc2UsICJEaXJlY3RvcnkiLCAwLCAmdHlwZSwgY29tbWFuZCsxLCAmc2l6ZSkgIT0gRVJST1JfU1VDQ0VTUyB8fAotCSAgICB0eXBlICE9IFJFR19TWikKLQkJLyogUmVnaXN0cnkgY29ycnVwdGVkICovCi0JCXJldHVybiAwOwotCXN0cmNhdChjb21tYW5kLCAiYmluXFxzdWJ3Y3Jldi5leGUiKTsKLQlpZiAoX3N0YXQoY29tbWFuZCsxLCAmc3QpIDwgMCkKLQkJLyogc3Vid2NyZXYuZXhlIG5vdCBwYXJ0IG9mIHRoZSByZWxlYXNlICovCi0JCXJldHVybiAwOwotCXN0cmNhdChjb21tYW5kLCAiXCIgLi5cXC4uIC4uXFwuLlxcTW9kdWxlc1xcZ2V0YnVpbGRpbmZvLmMgZ2V0YnVpbGRpbmZvMi5jIik7Ci0JcHV0cyhjb21tYW5kKTsgZmZsdXNoKHN0ZG91dCk7Ci0JaWYgKHN5c3RlbShjb21tYW5kKSA8IDApCi0JCXJldHVybiAwOwotCXJldHVybiAxOworICAgIHN0cnVjdCBfc3RhdCBzdDsKKyAgICBIS0VZIGhUb3J0b2lzZTsKKyAgICBjaGFyIGNvbW1hbmRbNTAwXTsKKyAgICBEV09SRCB0eXBlLCBzaXplOworICAgIGlmIChfc3RhdCgiLnN2biIsICZzdCkgPCAwKQorICAgICAgICByZXR1cm4gMDsKKyAgICAvKiBBbGxvdyBzdXBwcmVzc2lvbiBvZiBzdWJ3Y3Jldi5leGUgaW52b2NhdGlvbiBpZiBhIG5vX3N1YndjcmV2IGZpbGUgaXMgcHJlc2VudC4gKi8KKyAgICBpZiAoX3N0YXQoIm5vX3N1YndjcmV2IiwgJnN0KSA9PSAwKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoUmVnT3BlbktleShIS0VZX0xPQ0FMX01BQ0hJTkUsICJTb2Z0d2FyZVxcVG9ydG9pc2VTVk4iLCAmaFRvcnRvaXNlKSAhPSBFUlJPUl9TVUNDRVNTICYmCisgICAgICAgIFJlZ09wZW5LZXkoSEtFWV9DVVJSRU5UX1VTRVIsICJTb2Z0d2FyZVxcVG9ydG9pc2VTVk4iLCAmaFRvcnRvaXNlKSAhPSBFUlJPUl9TVUNDRVNTKQorICAgICAgICAvKiBUb3J0b2lzZSBub3QgaW5zdGFsbGVkICovCisgICAgICAgIHJldHVybiAwOworICAgIGNvbW1hbmRbMF0gPSAnIic7ICAvKiBxdW90ZSB0aGUgcGF0aCB0byB0aGUgZXhlY3V0YWJsZSAqLworICAgIHNpemUgPSBzaXplb2YoY29tbWFuZCkgLSAxOworICAgIGlmIChSZWdRdWVyeVZhbHVlRXgoaFRvcnRvaXNlLCAiRGlyZWN0b3J5IiwgMCwgJnR5cGUsIGNvbW1hbmQrMSwgJnNpemUpICE9IEVSUk9SX1NVQ0NFU1MgfHwKKyAgICAgICAgdHlwZSAhPSBSRUdfU1opCisgICAgICAgIC8qIFJlZ2lzdHJ5IGNvcnJ1cHRlZCAqLworICAgICAgICByZXR1cm4gMDsKKyAgICBzdHJjYXQoY29tbWFuZCwgImJpblxcc3Vid2NyZXYuZXhlIik7CisgICAgaWYgKF9zdGF0KGNvbW1hbmQrMSwgJnN0KSA8IDApCisgICAgICAgIC8qIHN1YndjcmV2LmV4ZSBub3QgcGFydCBvZiB0aGUgcmVsZWFzZSAqLworICAgICAgICByZXR1cm4gMDsKKyAgICBzdHJjYXQoY29tbWFuZCwgIlwiIC4uXFwuLiAuLlxcLi5cXE1vZHVsZXNcXGdldGJ1aWxkaW5mby5jIGdldGJ1aWxkaW5mbzIuYyIpOworICAgIHB1dHMoY29tbWFuZCk7IGZmbHVzaChzdGRvdXQpOworICAgIGlmIChzeXN0ZW0oY29tbWFuZCkgPCAwKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gMTsKIH0KIAogaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqYXJndltdKQogewotCWNoYXIgY29tbWFuZFs1MDBdID0gImNsLmV4ZSAtYyAtRF9XSU4zMiAtRFVTRV9ETF9FWFBPUlQgLURfV0lORE9XUyAtRFdJTjMyIC1EX1dJTkRMTCAiOwotCWludCBkb191bmxpbmssIHJlc3VsdDsKLQlpZiAoYXJnYyAhPSAyKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAibWFrZV9idWlsZGluZm8gJChDb25maWd1cmF0aW9uTmFtZSlcbiIpOwotCQlyZXR1cm4gRVhJVF9GQUlMVVJFOwotCX0KLQlpZiAoc3RyY21wKGFyZ3ZbMV0sICJSZWxlYXNlIikgPT0gMCkgewotCQlzdHJjYXQoY29tbWFuZCwgIi1NRCAiKTsKLQl9Ci0JZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMV0sICJEZWJ1ZyIpID09IDApIHsKLQkJc3RyY2F0KGNvbW1hbmQsICItRF9ERUJVRyAtTURkICIpOwotCX0KLQllbHNlIGlmIChzdHJjbXAoYXJndlsxXSwgIlJlbGVhc2VJdGFuaXVtIikgPT0gMCkgewotCQlzdHJjYXQoY29tbWFuZCwgIi1NRCAvVVNFQ0w6TVNfSVRBTklVTSAiKTsKLQl9Ci0JZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMV0sICJSZWxlYXNlQU1ENjQiKSA9PSAwKSB7Ci0JCXN0cmNhdChjb21tYW5kLCAiLU1EICIpOwotCQlzdHJjYXQoY29tbWFuZCwgIi1NRCAvVVNFQ0w6TVNfT1BURVJPTiAiKTsKLQl9Ci0JZWxzZSB7Ci0JCWZwcmludGYoc3RkZXJyLCAidW5zdXBwb3J0ZWQgY29uZmlndXJhdGlvbiAlc1xuIiwgYXJndlsxXSk7Ci0JCXJldHVybiBFWElUX0ZBSUxVUkU7Ci0JfQorICAgIGNoYXIgY29tbWFuZFs1MDBdID0gImNsLmV4ZSAtYyAtRF9XSU4zMiAtRFVTRV9ETF9FWFBPUlQgLURfV0lORE9XUyAtRFdJTjMyIC1EX1dJTkRMTCAiOworICAgIGludCBkb191bmxpbmssIHJlc3VsdDsKKyAgICBpZiAoYXJnYyAhPSAyKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAibWFrZV9idWlsZGluZm8gJChDb25maWd1cmF0aW9uTmFtZSlcbiIpOworICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgIH0KKyAgICBpZiAoc3RyY21wKGFyZ3ZbMV0sICJSZWxlYXNlIikgPT0gMCkgeworICAgICAgICBzdHJjYXQoY29tbWFuZCwgIi1NRCAiKTsKKyAgICB9CisgICAgZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMV0sICJEZWJ1ZyIpID09IDApIHsKKyAgICAgICAgc3RyY2F0KGNvbW1hbmQsICItRF9ERUJVRyAtTURkICIpOworICAgIH0KKyAgICBlbHNlIGlmIChzdHJjbXAoYXJndlsxXSwgIlJlbGVhc2VJdGFuaXVtIikgPT0gMCkgeworICAgICAgICBzdHJjYXQoY29tbWFuZCwgIi1NRCAvVVNFQ0w6TVNfSVRBTklVTSAiKTsKKyAgICB9CisgICAgZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMV0sICJSZWxlYXNlQU1ENjQiKSA9PSAwKSB7CisgICAgICAgIHN0cmNhdChjb21tYW5kLCAiLU1EICIpOworICAgICAgICBzdHJjYXQoY29tbWFuZCwgIi1NRCAvVVNFQ0w6TVNfT1BURVJPTiAiKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAidW5zdXBwb3J0ZWQgY29uZmlndXJhdGlvbiAlc1xuIiwgYXJndlsxXSk7CisgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgfQogCi0JaWYgKChkb191bmxpbmsgPSBtYWtlX2J1aWxkaW5mbzIoKSkpCi0JCXN0cmNhdChjb21tYW5kLCAiZ2V0YnVpbGRpbmZvMi5jIC1EU1VCV0NSRVYgIik7Ci0JZWxzZQotCQlzdHJjYXQoY29tbWFuZCwgIi4uXFwuLlxcTW9kdWxlc1xcZ2V0YnVpbGRpbmZvLmMiKTsKLQlzdHJjYXQoY29tbWFuZCwgIiAtRm9nZXRidWlsZGluZm8ubyAtSS4uXFwuLlxcSW5jbHVkZSAtSS4uXFwuLlxcUEMiKTsKLQlwdXRzKGNvbW1hbmQpOyBmZmx1c2goc3Rkb3V0KTsKLQlyZXN1bHQgPSBzeXN0ZW0oY29tbWFuZCk7Ci0JaWYgKGRvX3VubGluaykKLQkJdW5saW5rKCJnZXRidWlsZGluZm8yLmMiKTsKLQlpZiAocmVzdWx0IDwgMCkKLQkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKLQlyZXR1cm4gMDsKKyAgICBpZiAoKGRvX3VubGluayA9IG1ha2VfYnVpbGRpbmZvMigpKSkKKyAgICAgICAgc3RyY2F0KGNvbW1hbmQsICJnZXRidWlsZGluZm8yLmMgLURTVUJXQ1JFViAiKTsKKyAgICBlbHNlCisgICAgICAgIHN0cmNhdChjb21tYW5kLCAiLi5cXC4uXFxNb2R1bGVzXFxnZXRidWlsZGluZm8uYyIpOworICAgIHN0cmNhdChjb21tYW5kLCAiIC1Gb2dldGJ1aWxkaW5mby5vIC1JLi5cXC4uXFxJbmNsdWRlIC1JLi5cXC4uXFxQQyIpOworICAgIHB1dHMoY29tbWFuZCk7IGZmbHVzaChzdGRvdXQpOworICAgIHJlc3VsdCA9IHN5c3RlbShjb21tYW5kKTsKKyAgICBpZiAoZG9fdW5saW5rKQorICAgICAgICB1bmxpbmsoImdldGJ1aWxkaW5mbzIuYyIpOworICAgIGlmIChyZXN1bHQgPCAwKQorICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgIHJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvUEMvVlM4LjAvbWFrZV9idWlsZGluZm8uYyBiL1BDL1ZTOC4wL21ha2VfYnVpbGRpbmZvLmMKaW5kZXggMTMzY2ZlZS4uOGNjM2RhMiAxMDA2NDQKLS0tIGEvUEMvVlM4LjAvbWFrZV9idWlsZGluZm8uYworKysgYi9QQy9WUzguMC9tYWtlX2J1aWxkaW5mby5jCkBAIC0yMyw3MiArMjMsNzIgQEAKIAogaW50IG1ha2VfYnVpbGRpbmZvMigpCiB7Ci0Jc3RydWN0IF9zdGF0IHN0OwotCUhLRVkgaFRvcnRvaXNlOwotCWNoYXIgY29tbWFuZFtDTURfU0laRSsxXTsKLQlEV09SRCB0eXBlLCBzaXplOwotCWlmIChfc3RhdCgiLnN2biIsICZzdCkgPCAwKQotCQlyZXR1cm4gMDsKLQkvKiBBbGxvdyBzdXBwcmVzc2lvbiBvZiBzdWJ3Y3Jldi5leGUgaW52b2NhdGlvbiBpZiBhIG5vX3N1YndjcmV2IGZpbGUgaXMgcHJlc2VudC4gKi8KLQlpZiAoX3N0YXQoIm5vX3N1YndjcmV2IiwgJnN0KSA9PSAwKQotCQlyZXR1cm4gMDsKLQlpZiAoUmVnT3BlbktleShIS0VZX0xPQ0FMX01BQ0hJTkUsICJTb2Z0d2FyZVxcVG9ydG9pc2VTVk4iLCAmaFRvcnRvaXNlKSAhPSBFUlJPUl9TVUNDRVNTICYmCi0JICAgIFJlZ09wZW5LZXkoSEtFWV9DVVJSRU5UX1VTRVIsICJTb2Z0d2FyZVxcVG9ydG9pc2VTVk4iLCAmaFRvcnRvaXNlKSAhPSBFUlJPUl9TVUNDRVNTKQotCQkvKiBUb3J0b2lzZSBub3QgaW5zdGFsbGVkICovCi0JCXJldHVybiAwOwotCWNvbW1hbmRbMF0gPSAnIic7ICAvKiBxdW90ZSB0aGUgcGF0aCB0byB0aGUgZXhlY3V0YWJsZSAqLwotCXNpemUgPSBzaXplb2YoY29tbWFuZCkgLSAxOwotCWlmIChSZWdRdWVyeVZhbHVlRXgoaFRvcnRvaXNlLCAiRGlyZWN0b3J5IiwgMCwgJnR5cGUsIGNvbW1hbmQrMSwgJnNpemUpICE9IEVSUk9SX1NVQ0NFU1MgfHwKLQkgICAgdHlwZSAhPSBSRUdfU1opCi0JCS8qIFJlZ2lzdHJ5IGNvcnJ1cHRlZCAqLwotCQlyZXR1cm4gMDsKLQlzdHJjYXRfcyhjb21tYW5kLCBDTURfU0laRSwgImJpblxcc3Vid2NyZXYuZXhlIik7Ci0JaWYgKF9zdGF0KGNvbW1hbmQrMSwgJnN0KSA8IDApCi0JCS8qIHN1YndjcmV2LmV4ZSBub3QgcGFydCBvZiB0aGUgcmVsZWFzZSAqLwotCQlyZXR1cm4gMDsKLQlzdHJjYXRfcyhjb21tYW5kLCBDTURfU0laRSwgIlwiIC4uXFwuLiAuLlxcLi5cXE1vZHVsZXNcXGdldGJ1aWxkaW5mby5jIGdldGJ1aWxkaW5mbzIuYyIpOwotCXB1dHMoY29tbWFuZCk7IGZmbHVzaChzdGRvdXQpOwotCWlmIChzeXN0ZW0oY29tbWFuZCkgPCAwKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gMTsKKyAgICBzdHJ1Y3QgX3N0YXQgc3Q7CisgICAgSEtFWSBoVG9ydG9pc2U7CisgICAgY2hhciBjb21tYW5kW0NNRF9TSVpFKzFdOworICAgIERXT1JEIHR5cGUsIHNpemU7CisgICAgaWYgKF9zdGF0KCIuc3ZuIiwgJnN0KSA8IDApCisgICAgICAgIHJldHVybiAwOworICAgIC8qIEFsbG93IHN1cHByZXNzaW9uIG9mIHN1YndjcmV2LmV4ZSBpbnZvY2F0aW9uIGlmIGEgbm9fc3Vid2NyZXYgZmlsZSBpcyBwcmVzZW50LiAqLworICAgIGlmIChfc3RhdCgibm9fc3Vid2NyZXYiLCAmc3QpID09IDApCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChSZWdPcGVuS2V5KEhLRVlfTE9DQUxfTUFDSElORSwgIlNvZnR3YXJlXFxUb3J0b2lzZVNWTiIsICZoVG9ydG9pc2UpICE9IEVSUk9SX1NVQ0NFU1MgJiYKKyAgICAgICAgUmVnT3BlbktleShIS0VZX0NVUlJFTlRfVVNFUiwgIlNvZnR3YXJlXFxUb3J0b2lzZVNWTiIsICZoVG9ydG9pc2UpICE9IEVSUk9SX1NVQ0NFU1MpCisgICAgICAgIC8qIFRvcnRvaXNlIG5vdCBpbnN0YWxsZWQgKi8KKyAgICAgICAgcmV0dXJuIDA7CisgICAgY29tbWFuZFswXSA9ICciJzsgIC8qIHF1b3RlIHRoZSBwYXRoIHRvIHRoZSBleGVjdXRhYmxlICovCisgICAgc2l6ZSA9IHNpemVvZihjb21tYW5kKSAtIDE7CisgICAgaWYgKFJlZ1F1ZXJ5VmFsdWVFeChoVG9ydG9pc2UsICJEaXJlY3RvcnkiLCAwLCAmdHlwZSwgY29tbWFuZCsxLCAmc2l6ZSkgIT0gRVJST1JfU1VDQ0VTUyB8fAorICAgICAgICB0eXBlICE9IFJFR19TWikKKyAgICAgICAgLyogUmVnaXN0cnkgY29ycnVwdGVkICovCisgICAgICAgIHJldHVybiAwOworICAgIHN0cmNhdF9zKGNvbW1hbmQsIENNRF9TSVpFLCAiYmluXFxzdWJ3Y3Jldi5leGUiKTsKKyAgICBpZiAoX3N0YXQoY29tbWFuZCsxLCAmc3QpIDwgMCkKKyAgICAgICAgLyogc3Vid2NyZXYuZXhlIG5vdCBwYXJ0IG9mIHRoZSByZWxlYXNlICovCisgICAgICAgIHJldHVybiAwOworICAgIHN0cmNhdF9zKGNvbW1hbmQsIENNRF9TSVpFLCAiXCIgLi5cXC4uIC4uXFwuLlxcTW9kdWxlc1xcZ2V0YnVpbGRpbmZvLmMgZ2V0YnVpbGRpbmZvMi5jIik7CisgICAgcHV0cyhjb21tYW5kKTsgZmZsdXNoKHN0ZG91dCk7CisgICAgaWYgKHN5c3RlbShjb21tYW5kKSA8IDApCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiAxOwogfQogCiBpbnQgbWFpbihpbnQgYXJnYywgY2hhciphcmd2W10pCiB7Ci0JY2hhciBjb21tYW5kWzUwMF0gPSAiY2wuZXhlIC1jIC1EX1dJTjMyIC1EVVNFX0RMX0VYUE9SVCAtRF9XSU5ET1dTIC1EV0lOMzIgLURfV0lORExMICI7Ci0JaW50IGRvX3VubGluaywgcmVzdWx0OwotCWlmIChhcmdjICE9IDIpIHsKLQkJZnByaW50ZihzdGRlcnIsICJtYWtlX2J1aWxkaW5mbyAkKENvbmZpZ3VyYXRpb25OYW1lKVxuIik7Ci0JCXJldHVybiBFWElUX0ZBSUxVUkU7Ci0JfQotCWlmIChzdHJjbXAoYXJndlsxXSwgIlJlbGVhc2UiKSA9PSAwKSB7Ci0JCXN0cmNhdF9zKGNvbW1hbmQsIENNRF9TSVpFLCAiLU1EICIpOwotCX0KLQllbHNlIGlmIChzdHJjbXAoYXJndlsxXSwgIkRlYnVnIikgPT0gMCkgewotCQlzdHJjYXRfcyhjb21tYW5kLCBDTURfU0laRSwgIi1EX0RFQlVHIC1NRGQgIik7Ci0JfQotCWVsc2UgaWYgKHN0cmNtcChhcmd2WzFdLCAiUmVsZWFzZUl0YW5pdW0iKSA9PSAwKSB7Ci0JCXN0cmNhdF9zKGNvbW1hbmQsIENNRF9TSVpFLCAiLU1EIC9VU0VDTDpNU19JVEFOSVVNICIpOwotCX0KLQllbHNlIGlmIChzdHJjbXAoYXJndlsxXSwgIlJlbGVhc2VBTUQ2NCIpID09IDApIHsKLQkJc3RyY2F0X3MoY29tbWFuZCwgQ01EX1NJWkUsICItTUQgIik7Ci0JCXN0cmNhdF9zKGNvbW1hbmQsIENNRF9TSVpFLCAiLU1EIC9VU0VDTDpNU19PUFRFUk9OICIpOwotCX0KLQllbHNlIHsKLQkJZnByaW50ZihzdGRlcnIsICJ1bnN1cHBvcnRlZCBjb25maWd1cmF0aW9uICVzXG4iLCBhcmd2WzFdKTsKLQkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKLQl9CisgICAgY2hhciBjb21tYW5kWzUwMF0gPSAiY2wuZXhlIC1jIC1EX1dJTjMyIC1EVVNFX0RMX0VYUE9SVCAtRF9XSU5ET1dTIC1EV0lOMzIgLURfV0lORExMICI7CisgICAgaW50IGRvX3VubGluaywgcmVzdWx0OworICAgIGlmIChhcmdjICE9IDIpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJtYWtlX2J1aWxkaW5mbyAkKENvbmZpZ3VyYXRpb25OYW1lKVxuIik7CisgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgfQorICAgIGlmIChzdHJjbXAoYXJndlsxXSwgIlJlbGVhc2UiKSA9PSAwKSB7CisgICAgICAgIHN0cmNhdF9zKGNvbW1hbmQsIENNRF9TSVpFLCAiLU1EICIpOworICAgIH0KKyAgICBlbHNlIGlmIChzdHJjbXAoYXJndlsxXSwgIkRlYnVnIikgPT0gMCkgeworICAgICAgICBzdHJjYXRfcyhjb21tYW5kLCBDTURfU0laRSwgIi1EX0RFQlVHIC1NRGQgIik7CisgICAgfQorICAgIGVsc2UgaWYgKHN0cmNtcChhcmd2WzFdLCAiUmVsZWFzZUl0YW5pdW0iKSA9PSAwKSB7CisgICAgICAgIHN0cmNhdF9zKGNvbW1hbmQsIENNRF9TSVpFLCAiLU1EIC9VU0VDTDpNU19JVEFOSVVNICIpOworICAgIH0KKyAgICBlbHNlIGlmIChzdHJjbXAoYXJndlsxXSwgIlJlbGVhc2VBTUQ2NCIpID09IDApIHsKKyAgICAgICAgc3RyY2F0X3MoY29tbWFuZCwgQ01EX1NJWkUsICItTUQgIik7CisgICAgICAgIHN0cmNhdF9zKGNvbW1hbmQsIENNRF9TSVpFLCAiLU1EIC9VU0VDTDpNU19PUFRFUk9OICIpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJ1bnN1cHBvcnRlZCBjb25maWd1cmF0aW9uICVzXG4iLCBhcmd2WzFdKTsKKyAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICB9CiAKLQlpZiAoKGRvX3VubGluayA9IG1ha2VfYnVpbGRpbmZvMigpKSkKLQkJc3RyY2F0X3MoY29tbWFuZCwgQ01EX1NJWkUsICJnZXRidWlsZGluZm8yLmMgLURTVUJXQ1JFViAiKTsKLQllbHNlCi0JCXN0cmNhdF9zKGNvbW1hbmQsIENNRF9TSVpFLCAiLi5cXC4uXFxNb2R1bGVzXFxnZXRidWlsZGluZm8uYyIpOwotCXN0cmNhdF9zKGNvbW1hbmQsIENNRF9TSVpFLCAiIC1Gb2dldGJ1aWxkaW5mby5vIC1JLi5cXC4uXFxJbmNsdWRlIC1JLi5cXC4uXFxQQyIpOwotCXB1dHMoY29tbWFuZCk7IGZmbHVzaChzdGRvdXQpOwotCXJlc3VsdCA9IHN5c3RlbShjb21tYW5kKTsKLQlpZiAoZG9fdW5saW5rKQotCQlfdW5saW5rKCJnZXRidWlsZGluZm8yLmMiKTsKLQlpZiAocmVzdWx0IDwgMCkKLQkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKLQlyZXR1cm4gMDsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisgICAgaWYgKChkb191bmxpbmsgPSBtYWtlX2J1aWxkaW5mbzIoKSkpCisgICAgICAgIHN0cmNhdF9zKGNvbW1hbmQsIENNRF9TSVpFLCAiZ2V0YnVpbGRpbmZvMi5jIC1EU1VCV0NSRVYgIik7CisgICAgZWxzZQorICAgICAgICBzdHJjYXRfcyhjb21tYW5kLCBDTURfU0laRSwgIi4uXFwuLlxcTW9kdWxlc1xcZ2V0YnVpbGRpbmZvLmMiKTsKKyAgICBzdHJjYXRfcyhjb21tYW5kLCBDTURfU0laRSwgIiAtRm9nZXRidWlsZGluZm8ubyAtSS4uXFwuLlxcSW5jbHVkZSAtSS4uXFwuLlxcUEMiKTsKKyAgICBwdXRzKGNvbW1hbmQpOyBmZmx1c2goc3Rkb3V0KTsKKyAgICByZXN1bHQgPSBzeXN0ZW0oY29tbWFuZCk7CisgICAgaWYgKGRvX3VubGluaykKKyAgICAgICAgX3VubGluaygiZ2V0YnVpbGRpbmZvMi5jIik7CisgICAgaWYgKHJlc3VsdCA8IDApCisgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9QQy9fbXNpLmMgYi9QQy9fbXNpLmMKaW5kZXggNThiMjUzMC4uNTc0ZGRkZSAxMDA2NDQKLS0tIGEvUEMvX21zaS5jCisrKyBiL1BDL19tc2kuYwpAQCAtMjAsMTkgKzIwLDE5IEBACiAgICAgVVVJRCByZXN1bHQ7CiAgICAgY2hhciAqY3Jlc3VsdDsKICAgICBQeU9iamVjdCAqb3Jlc3VsdDsKLSAgICAKKwogICAgIC8qIE1heSByZXR1cm4gb2ssIGxvY2FsIG9ubHksIGFuZCBubyBhZGRyZXNzLgogICAgICAgIEZvciBsb2NhbCBvbmx5LCB0aGUgZG9jdW1lbnRhdGlvbiBzYXlzIHdlIHN0aWxsIGdldCBhIHV1aWQuCiAgICAgICAgRm9yIFJQQ19TX1VVSURfTk9fQUREUkVTUywgaXQncyBub3QgY2xlYXIgd2hldGhlciB3ZSBjYW4KICAgICAgICB1c2UgdGhlIHJlc3VsdC4gKi8KICAgICBpZiAoVXVpZENyZWF0ZSgmcmVzdWx0KSA9PSBSUENfU19VVUlEX05PX0FERFJFU1MpIHsKLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgInByb2Nlc3NpbmcgJ25vIGFkZHJlc3MnIHJlc3VsdCIpOwotCXJldHVybiBOVUxMOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgInByb2Nlc3NpbmcgJ25vIGFkZHJlc3MnIHJlc3VsdCIpOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKICAgICBpZiAoVXVpZFRvU3RyaW5nKCZyZXN1bHQsICZjcmVzdWx0KSA9PSBSUENfU19PVVRfT0ZfTUVNT1JZKSB7Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX01lbW9yeUVycm9yLCAib3V0IG9mIG1lbW9yeSBpbiB1dWlkZ2VuIik7Ci0JcmV0dXJuIE5VTEw7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19NZW1vcnlFcnJvciwgIm91dCBvZiBtZW1vcnkgaW4gdXVpZGdlbiIpOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKICAgICBvcmVzdWx0ID0gUHlTdHJpbmdfRnJvbVN0cmluZyhjcmVzdWx0KTsKQEAgLTU3LDcgKzU3LDcgQEAKIHsKICAgICBpbnQgcmVzdWx0ID0gX29wZW4ocHN6RmlsZSwgb2ZsYWcsIHBtb2RlKTsKICAgICBpZiAocmVzdWx0ID09IC0xKQotCSplcnIgPSBlcnJubzsKKyAgICAgICAgKmVyciA9IGVycm5vOwogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKQEAgLTY1LDcgKzY1LDcgQEAKIHsKICAgICBVSU5UIHJlc3VsdCA9IChVSU5UKV9yZWFkKGhmLCBtZW1vcnksIGNiKTsKICAgICBpZiAocmVzdWx0ICE9IGNiKQotCSplcnIgPSBlcnJubzsKKyAgICAgICAgKmVyciA9IGVycm5vOwogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKQEAgLTczLDcgKzczLDcgQEAKIHsKICAgICBVSU5UIHJlc3VsdCA9IChVSU5UKV93cml0ZShoZiwgbWVtb3J5LCBjYik7CiAgICAgaWYgKHJlc3VsdCAhPSBjYikKLQkqZXJyID0gZXJybm87CisgICAgICAgICplcnIgPSBlcnJubzsKICAgICByZXR1cm4gcmVzdWx0OwogfQogCkBAIC04MSw3ICs4MSw3IEBACiB7CiAgICAgaW50IHJlc3VsdCA9IF9jbG9zZShoZik7CiAgICAgaWYgKHJlc3VsdCAhPSAwKQotCSplcnIgPSBlcnJubzsKKyAgICAgICAgKmVyciA9IGVycm5vOwogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKQEAgLTg5LDcgKzg5LDcgQEAKIHsKICAgICBsb25nIHJlc3VsdCA9IChsb25nKV9sc2VlayhoZiwgZGlzdCwgc2Vla3R5cGUpOwogICAgIGlmIChyZXN1bHQgPT0gLTEpCi0JKmVyciA9IGVycm5vOworICAgICAgICAqZXJyID0gZXJybm87CiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIApAQCAtOTcsNyArOTcsNyBAQAogewogICAgIGludCByZXN1bHQgPSByZW1vdmUocHN6RmlsZSk7CiAgICAgaWYgKHJlc3VsdCAhPSAwKQotCSplcnIgPSBlcnJubzsKKyAgICAgICAgKmVyciA9IGVycm5vOwogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKQEAgLTExMCw5ICsxMTAsOSBAQAogewogICAgIGNoYXIgKm5hbWUgPSBfdGVtcG5hbSgiIiwgInRtcCIpOwogICAgIGlmICgobmFtZSAhPSBOVUxMKSAmJiAoKGludClzdHJsZW4obmFtZSkgPCBjYlRlbXBOYW1lKSkgewotCXN0cmNweShwc3pUZW1wTmFtZSwgbmFtZSk7Ci0JZnJlZShuYW1lKTsKLQlyZXR1cm4gVFJVRTsKKyAgICAgICAgc3RyY3B5KHBzelRlbXBOYW1lLCBuYW1lKTsKKyAgICAgICAgZnJlZShuYW1lKTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogCiAgICAgaWYgKG5hbWUpIGZyZWUobmFtZSk7CkBAIC0xMjIsMTAgKzEyMiwxMCBAQAogc3RhdGljIEZORkNJU1RBVFVTKGNiX3N0YXR1cykKIHsKICAgICBpZiAocHYpIHsKLQlQeU9iamVjdCAqcmVzdWx0ID0gUHlPYmplY3RfQ2FsbE1ldGhvZChwdiwgInN0YXR1cyIsICJpaWkiLCB0eXBlU3RhdHVzLCBjYjEsIGNiMik7Ci0JaWYgKHJlc3VsdCA9PSBOVUxMKQotCSAgICByZXR1cm4gLTE7Ci0JUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBQeU9iamVjdF9DYWxsTWV0aG9kKHB2LCAic3RhdHVzIiwgImlpaSIsIHR5cGVTdGF0dXMsIGNiMSwgY2IyKTsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKICAgICB9CiAgICAgcmV0dXJuIDA7CiB9CkBAIC0xMzMsMTggKzEzMywxOCBAQAogc3RhdGljIEZORkNJR0VUTkVYVENBQklORVQoY2JfZ2V0bmV4dGNhYmluZXQpCiB7CiAgICAgaWYgKHB2KSB7Ci0JUHlPYmplY3QgKnJlc3VsdCA9IFB5T2JqZWN0X0NhbGxNZXRob2QocHYsICJnZXRuZXh0Y2FiaW5ldCIsICJpIiwgcGNjYWItPmlDYWIpOwotCWlmIChyZXN1bHQgPT0gTlVMTCkKLQkgICAgcmV0dXJuIC0xOwotCWlmICghUHlTdHJpbmdfQ2hlY2socmVzdWx0KSkgewotCSAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAKLQkJIkluY29ycmVjdCByZXR1cm4gdHlwZSAlcyBmcm9tIGdldG5leHRjYWJpbmV0IiwKLQkJcmVzdWx0LT5vYl90eXBlLT50cF9uYW1lKTsKLQkgICAgUHlfREVDUkVGKHJlc3VsdCk7Ci0JICAgIHJldHVybiBGQUxTRTsKLQl9Ci0Jc3RybmNweShwY2NhYi0+c3pDYWIsIFB5U3RyaW5nX0FzU3RyaW5nKHJlc3VsdCksIHNpemVvZihwY2NhYi0+c3pDYWIpKTsKLQlyZXR1cm4gVFJVRTsKKyAgICAgICAgUHlPYmplY3QgKnJlc3VsdCA9IFB5T2JqZWN0X0NhbGxNZXRob2QocHYsICJnZXRuZXh0Y2FiaW5ldCIsICJpIiwgcGNjYWItPmlDYWIpOworICAgICAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmICghUHlTdHJpbmdfQ2hlY2socmVzdWx0KSkgeworICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAiSW5jb3JyZWN0IHJldHVybiB0eXBlICVzIGZyb20gZ2V0bmV4dGNhYmluZXQiLAorICAgICAgICAgICAgICAgIHJlc3VsdC0+b2JfdHlwZS0+dHBfbmFtZSk7CisgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICBzdHJuY3B5KHBjY2FiLT5zekNhYiwgUHlTdHJpbmdfQXNTdHJpbmcocmVzdWx0KSwgc2l6ZW9mKHBjY2FiLT5zekNhYikpOworICAgICAgICByZXR1cm4gVFJVRTsKICAgICB9CiAgICAgcmV0dXJuIEZBTFNFOwogfQpAQCAtMTU3LDIxICsxNTcsMjEgQEAKIAogICAgIC8qIE5lZWQgV2luMzIgaGFuZGxlIHRvIGdldCB0aW1lIHN0YW1wcyAqLwogICAgIGhhbmRsZSA9IENyZWF0ZUZpbGUocHN6TmFtZSwgR0VORVJJQ19SRUFELCBGSUxFX1NIQVJFX1JFQUQsIE5VTEwsCi0JT1BFTl9FWElTVElORywgRklMRV9BVFRSSUJVVEVfTk9STUFMLCBOVUxMKTsKKyAgICAgICAgT1BFTl9FWElTVElORywgRklMRV9BVFRSSUJVVEVfTk9STUFMLCBOVUxMKTsKICAgICBpZiAoaGFuZGxlID09IElOVkFMSURfSEFORExFX1ZBTFVFKQotCXJldHVybiAtMTsKKyAgICAgICAgcmV0dXJuIC0xOwogCiAgICAgaWYgKEdldEZpbGVJbmZvcm1hdGlvbkJ5SGFuZGxlKGhhbmRsZSwgJmJoZmkpID09IEZBTFNFKQogICAgIHsKLQlDbG9zZUhhbmRsZShoYW5kbGUpOwotCXJldHVybiAtMTsKKyAgICAgICAgQ2xvc2VIYW5kbGUoaGFuZGxlKTsKKyAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIAogICAgIEZpbGVUaW1lVG9Mb2NhbEZpbGVUaW1lKCZiaGZpLmZ0TGFzdFdyaXRlVGltZSwgJmZpbGV0aW1lKTsKICAgICBGaWxlVGltZVRvRG9zRGF0ZVRpbWUoJmZpbGV0aW1lLCBwZGF0ZSwgcHRpbWUpOwogCi0gICAgKnBhdHRyaWJzID0gKGludCkoYmhmaS5kd0ZpbGVBdHRyaWJ1dGVzICYgCi0JKF9BX1JET05MWSB8IF9BX1NZU1RFTSB8IF9BX0hJRERFTiB8IF9BX0FSQ0gpKTsKKyAgICAqcGF0dHJpYnMgPSAoaW50KShiaGZpLmR3RmlsZUF0dHJpYnV0ZXMgJgorICAgICAgICAoX0FfUkRPTkxZIHwgX0FfU1lTVEVNIHwgX0FfSElEREVOIHwgX0FfQVJDSCkpOwogCiAgICAgQ2xvc2VIYW5kbGUoaGFuZGxlKTsKIApAQCAtMTg5LDExICsxODksMTEgQEAKIAogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzTzpGQ0lDcmVhdGUiLCAmY2FibmFtZSwgJmZpbGVzKSkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICBpZiAoIVB5TGlzdF9DaGVjayhmaWxlcykpIHsKLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiRkNJQ3JlYXRlIGV4cGVjdHMgYSBsaXN0Iik7Ci0JcmV0dXJuIE5VTEw7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJGQ0lDcmVhdGUgZXhwZWN0cyBhIGxpc3QiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCiAgICAgY2NhYi5jYiA9IElOVF9NQVg7IC8qIG5vIG5lZWQgdG8gc3BsaXQgQ0FCIGludG8gbXVsdGlwbGUgbWVkaWEgKi8KQEAgLTIwOSw0OSArMjA5LDQ5IEBACiAgICAgY2NhYi5zekRpc2tbMF0gPSAnXDAnOwogCiAgICAgZm9yIChpID0gMCwgcCA9IGNhYm5hbWU7ICpwOyBwID0gQ2hhck5leHQocCkpCi0JaWYgKCpwID09ICdcXCcgfHwgKnAgPT0gJy8nKQotCSAgICBpID0gcCAtIGNhYm5hbWUgKyAxOworICAgICAgICBpZiAoKnAgPT0gJ1xcJyB8fCAqcCA9PSAnLycpCisgICAgICAgICAgICBpID0gcCAtIGNhYm5hbWUgKyAxOwogCiAgICAgaWYgKGkgPj0gc2l6ZW9mKGNjYWIuc3pDYWJQYXRoKSB8fAotCXN0cmxlbihjYWJuYW1lK2kpID49IHNpemVvZihjY2FiLnN6Q2FiKSkgewotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAicGF0aCBuYW1lIHRvbyBsb25nIik7Ci0JcmV0dXJuIDA7CisgICAgICAgIHN0cmxlbihjYWJuYW1lK2kpID49IHNpemVvZihjY2FiLnN6Q2FiKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgInBhdGggbmFtZSB0b28gbG9uZyIpOworICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKICAgICBpZiAoaSA+IDApIHsKLQltZW1jcHkoY2NhYi5zekNhYlBhdGgsIGNhYm5hbWUsIGkpOwotCWNjYWIuc3pDYWJQYXRoW2ldID0gJ1wwJzsKLQlzdHJjcHkoY2NhYi5zekNhYiwgY2FibmFtZStpKTsKKyAgICAgICAgbWVtY3B5KGNjYWIuc3pDYWJQYXRoLCBjYWJuYW1lLCBpKTsKKyAgICAgICAgY2NhYi5zekNhYlBhdGhbaV0gPSAnXDAnOworICAgICAgICBzdHJjcHkoY2NhYi5zekNhYiwgY2FibmFtZStpKTsKICAgICB9IGVsc2UgewotCXN0cmNweShjY2FiLnN6Q2FiUGF0aCwgIi5cXCIpOwotCXN0cmNweShjY2FiLnN6Q2FiLCBjYWJuYW1lKTsKKyAgICAgICAgc3RyY3B5KGNjYWIuc3pDYWJQYXRoLCAiLlxcIik7CisgICAgICAgIHN0cmNweShjY2FiLnN6Q2FiLCBjYWJuYW1lKTsKICAgICB9CiAKICAgICBoZmNpID0gRkNJQ3JlYXRlKCZlcmYsIGNiX2ZpbGVwbGFjZWQsIGNiX2FsbG9jLCBjYl9mcmVlLAotCWNiX29wZW4sIGNiX3JlYWQsIGNiX3dyaXRlLCBjYl9jbG9zZSwgY2Jfc2VlaywgY2JfZGVsZXRlLAotCWNiX2dldHRlbXBmaWxlLCAmY2NhYiwgTlVMTCk7CisgICAgICAgIGNiX29wZW4sIGNiX3JlYWQsIGNiX3dyaXRlLCBjYl9jbG9zZSwgY2Jfc2VlaywgY2JfZGVsZXRlLAorICAgICAgICBjYl9nZXR0ZW1wZmlsZSwgJmNjYWIsIE5VTEwpOwogCiAgICAgaWYgKGhmY2kgPT0gTlVMTCkgewotCVB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLCAiRkNJIGVycm9yICVkIiwgZXJmLmVyZk9wZXIpOwotCXJldHVybiBOVUxMOworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwgIkZDSSBlcnJvciAlZCIsIGVyZi5lcmZPcGVyKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCiAgICAgZm9yIChpPTA7IGkgPCBQeUxpc3RfR0VUX1NJWkUoZmlsZXMpOyBpKyspIHsKLQlQeU9iamVjdCAqaXRlbSA9IFB5TGlzdF9HRVRfSVRFTShmaWxlcywgaSk7Ci0JY2hhciAqZmlsZW5hbWUsICpjYWJuYW1lOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShpdGVtLCAic3MiLCAmZmlsZW5hbWUsICZjYWJuYW1lKSkKLQkgICAgZ290byBlcnI7Ci0JaWYgKCFGQ0lBZGRGaWxlKGhmY2ksIGZpbGVuYW1lLCBjYWJuYW1lLCBGQUxTRSwgCi0JICAgIGNiX2dldG5leHRjYWJpbmV0LCBjYl9zdGF0dXMsIGNiX2dldG9wZW5pbmZvLAotCSAgICB0Y29tcFRZUEVfTVNaSVApKQotCSAgICBnb3RvIGVycjsKKyAgICAgICAgUHlPYmplY3QgKml0ZW0gPSBQeUxpc3RfR0VUX0lURU0oZmlsZXMsIGkpOworICAgICAgICBjaGFyICpmaWxlbmFtZSwgKmNhYm5hbWU7CisgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShpdGVtLCAic3MiLCAmZmlsZW5hbWUsICZjYWJuYW1lKSkKKyAgICAgICAgICAgIGdvdG8gZXJyOworICAgICAgICBpZiAoIUZDSUFkZEZpbGUoaGZjaSwgZmlsZW5hbWUsIGNhYm5hbWUsIEZBTFNFLAorICAgICAgICAgICAgY2JfZ2V0bmV4dGNhYmluZXQsIGNiX3N0YXR1cywgY2JfZ2V0b3BlbmluZm8sCisgICAgICAgICAgICB0Y29tcFRZUEVfTVNaSVApKQorICAgICAgICAgICAgZ290byBlcnI7CiAgICAgfQogCiAgICAgaWYgKCFGQ0lGbHVzaENhYmluZXQoaGZjaSwgRkFMU0UsIGNiX2dldG5leHRjYWJpbmV0LCBjYl9zdGF0dXMpKQotCWdvdG8gZXJyOworICAgICAgICBnb3RvIGVycjsKIAogICAgIGlmICghRkNJRGVzdHJveShoZmNpKSkKLQlnb3RvIGVycjsKKyAgICAgICAgZ290byBlcnI7CiAKICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CiAgICAgcmV0dXJuIFB5X05vbmU7CkBAIC0yNjYsNyArMjY2LDcgQEAKICAgICBNU0lIQU5ETEUgaDsKIH1tc2lvYmo7CiAKLXN0YXRpYyB2b2lkIAorc3RhdGljIHZvaWQKIG1zaW9ial9kZWFsbG9jKG1zaW9iaiogbXNpZGIpCiB7CiAgICAgTXNpQ2xvc2VIYW5kbGUobXNpZGItPmgpOwpAQCAtMjkyLDQxICsyOTIsNDEgQEAKICAgICBNU0lIQU5ETEUgZXJyID0gTXNpR2V0TGFzdEVycm9yUmVjb3JkKCk7CiAKICAgICBpZiAoZXJyID09IDApIHsKLQlzd2l0Y2goc3RhdHVzKSB7Ci0JY2FzZSBFUlJPUl9BQ0NFU1NfREVOSUVEOgotCSAgICBQeUVycl9TZXRTdHJpbmcoTVNJRXJyb3IsICJhY2Nlc3MgZGVuaWVkIik7Ci0JICAgIHJldHVybiBOVUxMOwotCWNhc2UgRVJST1JfRlVOQ1RJT05fRkFJTEVEOgotCSAgICBQeUVycl9TZXRTdHJpbmcoTVNJRXJyb3IsICJmdW5jdGlvbiBmYWlsZWQiKTsKLQkgICAgcmV0dXJuIE5VTEw7Ci0JY2FzZSBFUlJPUl9JTlZBTElEX0RBVEE6Ci0JICAgIFB5RXJyX1NldFN0cmluZyhNU0lFcnJvciwgImludmFsaWQgZGF0YSIpOwotCSAgICByZXR1cm4gTlVMTDsKLQljYXNlIEVSUk9SX0lOVkFMSURfSEFORExFOgotCSAgICBQeUVycl9TZXRTdHJpbmcoTVNJRXJyb3IsICJpbnZhbGlkIGhhbmRsZSIpOwotCSAgICByZXR1cm4gTlVMTDsKLQljYXNlIEVSUk9SX0lOVkFMSURfU1RBVEU6Ci0JICAgIFB5RXJyX1NldFN0cmluZyhNU0lFcnJvciwgImludmFsaWQgc3RhdGUiKTsKLQkgICAgcmV0dXJuIE5VTEw7Ci0JY2FzZSBFUlJPUl9JTlZBTElEX1BBUkFNRVRFUjoKLQkgICAgUHlFcnJfU2V0U3RyaW5nKE1TSUVycm9yLCAiaW52YWxpZCBwYXJhbWV0ZXIiKTsKLQkgICAgcmV0dXJuIE5VTEw7Ci0JZGVmYXVsdDoKLQkgICAgUHlFcnJfRm9ybWF0KE1TSUVycm9yLCAidW5rbm93biBlcnJvciAleCIsIHN0YXR1cyk7Ci0JICAgIHJldHVybiBOVUxMOwotCX0KKyAgICAgICAgc3dpdGNoKHN0YXR1cykgeworICAgICAgICBjYXNlIEVSUk9SX0FDQ0VTU19ERU5JRUQ6CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoTVNJRXJyb3IsICJhY2Nlc3MgZGVuaWVkIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgY2FzZSBFUlJPUl9GVU5DVElPTl9GQUlMRUQ6CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoTVNJRXJyb3IsICJmdW5jdGlvbiBmYWlsZWQiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBjYXNlIEVSUk9SX0lOVkFMSURfREFUQToKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhNU0lFcnJvciwgImludmFsaWQgZGF0YSIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGNhc2UgRVJST1JfSU5WQUxJRF9IQU5ETEU6CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoTVNJRXJyb3IsICJpbnZhbGlkIGhhbmRsZSIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGNhc2UgRVJST1JfSU5WQUxJRF9TVEFURToKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhNU0lFcnJvciwgImludmFsaWQgc3RhdGUiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBjYXNlIEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSOgorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKE1TSUVycm9yLCAiaW52YWxpZCBwYXJhbWV0ZXIiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgUHlFcnJfRm9ybWF0KE1TSUVycm9yLCAidW5rbm93biBlcnJvciAleCIsIHN0YXR1cyk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQogICAgIH0KIAogICAgIGNvZGUgPSBNc2lSZWNvcmRHZXRJbnRlZ2VyKGVyciwgMSk7IC8qIFhYWCBjb2RlICovCiAgICAgaWYgKE1zaUZvcm1hdFJlY29yZCgwLCBlcnIsIHJlcywgJnNpemUpID09IEVSUk9SX01PUkVfREFUQSkgewotCXJlcyA9IG1hbGxvYyhzaXplKzEpOwotCU1zaUZvcm1hdFJlY29yZCgwLCBlcnIsIHJlcywgJnNpemUpOwotCXJlc1tzaXplXT0nXDAnOworICAgICAgICByZXMgPSBtYWxsb2Moc2l6ZSsxKTsKKyAgICAgICAgTXNpRm9ybWF0UmVjb3JkKDAsIGVyciwgcmVzLCAmc2l6ZSk7CisgICAgICAgIHJlc1tzaXplXT0nXDAnOwogICAgIH0KICAgICBNc2lDbG9zZUhhbmRsZShlcnIpOwogICAgIFB5RXJyX1NldFN0cmluZyhNU0lFcnJvciwgcmVzKTsKICAgICBpZiAocmVzICE9IGJ1ZikKLQlmcmVlKHJlcyk7CisgICAgICAgIGZyZWUocmVzKTsKICAgICByZXR1cm4gTlVMTDsKIH0KIApAQCAtMzQzLDcgKzM0Myw3IEBACiB7CiAgICAgdW5zaWduZWQgaW50IGZpZWxkOwogICAgIGludCBzdGF0dXM7Ci0gICAgCisKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIkk6R2V0SW50ZWdlciIsICZmaWVsZCkpCiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIHN0YXR1cyA9IE1zaVJlY29yZEdldEludGVnZXIocmVjb3JkLT5oLCBmaWVsZCk7CkBAIC0zNjMsNyArMzYzLDcgQEAKICAgICBjaGFyICpyZXMgPSBidWY7CiAgICAgRFdPUkQgc2l6ZSA9IHNpemVvZihidWYpOwogICAgIFB5T2JqZWN0KiBzdHJpbmc7Ci0gICAgCisKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIkk6R2V0U3RyaW5nIiwgJmZpZWxkKSkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgc3RhdHVzID0gTXNpUmVjb3JkR2V0U3RyaW5nKHJlY29yZC0+aCwgZmllbGQsIHJlcywgJnNpemUpOwpAQCAtMzg2LDcgKzM4Niw3IEBACiB7CiAgICAgaW50IHN0YXR1cyA9IE1zaVJlY29yZENsZWFyRGF0YShyZWNvcmQtPmgpOwogICAgIGlmIChzdGF0dXMgIT0gRVJST1JfU1VDQ0VTUykKLQlyZXR1cm4gbXNpZXJyb3Ioc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIG1zaWVycm9yKHN0YXR1cyk7CiAKICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CiAgICAgcmV0dXJuIFB5X05vbmU7CkBAIC00MDAsMTAgKzQwMCwxMCBAQAogICAgIGNoYXIgKmRhdGE7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlzOlNldFN0cmluZyIsICZmaWVsZCwgJmRhdGEpKQotCXJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIGlmICgoc3RhdHVzID0gTXNpUmVjb3JkU2V0U3RyaW5nKHJlY29yZC0+aCwgZmllbGQsIGRhdGEpKSAhPSBFUlJPUl9TVUNDRVNTKQotCXJldHVybiBtc2llcnJvcihzdGF0dXMpOworICAgICAgICByZXR1cm4gbXNpZXJyb3Ioc3RhdHVzKTsKIAogICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKICAgICByZXR1cm4gUHlfTm9uZTsKQEAgLTQxNywxMCArNDE3LDEwIEBACiAgICAgY2hhciAqZGF0YTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaXM6U2V0U3RyZWFtIiwgJmZpZWxkLCAmZGF0YSkpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgaWYgKChzdGF0dXMgPSBNc2lSZWNvcmRTZXRTdHJlYW0ocmVjb3JkLT5oLCBmaWVsZCwgZGF0YSkpICE9IEVSUk9SX1NVQ0NFU1MpCi0JcmV0dXJuIG1zaWVycm9yKHN0YXR1cyk7CisgICAgICAgIHJldHVybiBtc2llcnJvcihzdGF0dXMpOwogCiAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwogICAgIHJldHVybiBQeV9Ob25lOwpAQCAtNDM0LDEwICs0MzQsMTAgQEAKICAgICBpbnQgZGF0YTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaWk6U2V0SW50ZWdlciIsICZmaWVsZCwgJmRhdGEpKQotCXJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIGlmICgoc3RhdHVzID0gTXNpUmVjb3JkU2V0SW50ZWdlcihyZWNvcmQtPmgsIGZpZWxkLCBkYXRhKSkgIT0gRVJST1JfU1VDQ0VTUykKLQlyZXR1cm4gbXNpZXJyb3Ioc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIG1zaWVycm9yKHN0YXR1cyk7CiAKICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CiAgICAgcmV0dXJuIFB5X05vbmU7CkBAIC00NDYsMzkgKzQ0NiwzOSBAQAogCiAKIHN0YXRpYyBQeU1ldGhvZERlZiByZWNvcmRfbWV0aG9kc1tdID0gewotICAgIHsgIkdldEZpZWxkQ291bnQiLCAoUHlDRnVuY3Rpb24pcmVjb3JkX2dldGZpZWxkY291bnQsIE1FVEhfTk9BUkdTLCAKLQlQeURvY19TVFIoIkdldEZpZWxkQ291bnQoKSAtPiBpbnRcbldyYXBzIE1zaVJlY29yZEdldEZpZWxkQ291bnQiKX0sCisgICAgeyAiR2V0RmllbGRDb3VudCIsIChQeUNGdW5jdGlvbilyZWNvcmRfZ2V0ZmllbGRjb3VudCwgTUVUSF9OT0FSR1MsCisgICAgICAgIFB5RG9jX1NUUigiR2V0RmllbGRDb3VudCgpIC0+IGludFxuV3JhcHMgTXNpUmVjb3JkR2V0RmllbGRDb3VudCIpfSwKICAgICB7ICJHZXRJbnRlZ2VyIiwgKFB5Q0Z1bmN0aW9uKXJlY29yZF9nZXRpbnRlZ2VyLCBNRVRIX1ZBUkFSR1MsCiAgICAgUHlEb2NfU1RSKCJHZXRJbnRlZ2VyKGZpZWxkKSAtPiBpbnRcbldyYXBzIE1zaVJlY29yZEdldEludGVnZXIiKX0sCiAgICAgeyAiR2V0U3RyaW5nIiwgKFB5Q0Z1bmN0aW9uKXJlY29yZF9nZXRzdHJpbmcsIE1FVEhfVkFSQVJHUywKICAgICBQeURvY19TVFIoIkdldFN0cmluZyhmaWVsZCkgLT4gc3RyaW5nXG5XcmFwcyBNc2lSZWNvcmRHZXRTdHJpbmciKX0sCi0gICAgeyAiU2V0U3RyaW5nIiwgKFB5Q0Z1bmN0aW9uKXJlY29yZF9zZXRzdHJpbmcsIE1FVEhfVkFSQVJHUywgCi0JUHlEb2NfU1RSKCJTZXRTdHJpbmcoZmllbGQsc3RyKSAtPiBOb25lXG5XcmFwcyBNc2lSZWNvcmRTZXRTdHJpbmciKX0sCi0gICAgeyAiU2V0U3RyZWFtIiwgKFB5Q0Z1bmN0aW9uKXJlY29yZF9zZXRzdHJlYW0sIE1FVEhfVkFSQVJHUywgCi0JUHlEb2NfU1RSKCJTZXRTdHJlYW0oZmllbGQsZmlsZW5hbWUpIC0+IE5vbmVcbldyYXBzIE1zaVJlY29yZFNldEludGVnZXIiKX0sCi0gICAgeyAiU2V0SW50ZWdlciIsIChQeUNGdW5jdGlvbilyZWNvcmRfc2V0aW50ZWdlciwgTUVUSF9WQVJBUkdTLCAKLQlQeURvY19TVFIoIlNldEludGVnZXIoZmllbGQsaW50KSAtPiBOb25lXG5XcmFwcyBNc2lSZWNvcmRTZXRJbnRlZ2VyIil9LAotICAgIHsgIkNsZWFyRGF0YSIsIChQeUNGdW5jdGlvbilyZWNvcmRfY2xlYXJkYXRhLCBNRVRIX05PQVJHUywgCi0JUHlEb2NfU1RSKCJDbGVhckRhdGEoKSAtPiBpbnRcbldyYXBzIE1zaVJlY29yZEdDbGVhckRhdGEiKX0sCisgICAgeyAiU2V0U3RyaW5nIiwgKFB5Q0Z1bmN0aW9uKXJlY29yZF9zZXRzdHJpbmcsIE1FVEhfVkFSQVJHUywKKyAgICAgICAgUHlEb2NfU1RSKCJTZXRTdHJpbmcoZmllbGQsc3RyKSAtPiBOb25lXG5XcmFwcyBNc2lSZWNvcmRTZXRTdHJpbmciKX0sCisgICAgeyAiU2V0U3RyZWFtIiwgKFB5Q0Z1bmN0aW9uKXJlY29yZF9zZXRzdHJlYW0sIE1FVEhfVkFSQVJHUywKKyAgICAgICAgUHlEb2NfU1RSKCJTZXRTdHJlYW0oZmllbGQsZmlsZW5hbWUpIC0+IE5vbmVcbldyYXBzIE1zaVJlY29yZFNldEludGVnZXIiKX0sCisgICAgeyAiU2V0SW50ZWdlciIsIChQeUNGdW5jdGlvbilyZWNvcmRfc2V0aW50ZWdlciwgTUVUSF9WQVJBUkdTLAorICAgICAgICBQeURvY19TVFIoIlNldEludGVnZXIoZmllbGQsaW50KSAtPiBOb25lXG5XcmFwcyBNc2lSZWNvcmRTZXRJbnRlZ2VyIil9LAorICAgIHsgIkNsZWFyRGF0YSIsIChQeUNGdW5jdGlvbilyZWNvcmRfY2xlYXJkYXRhLCBNRVRIX05PQVJHUywKKyAgICAgICAgUHlEb2NfU1RSKCJDbGVhckRhdGEoKSAtPiBpbnRcbldyYXBzIE1zaVJlY29yZEdDbGVhckRhdGEiKX0sCiAgICAgeyBOVUxMLCBOVUxMIH0KIH07CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgcmVjb3JkX1R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JIl9tc2kuUmVjb3JkIiwJCS8qdHBfbmFtZSovCi0Jc2l6ZW9mKG1zaW9iaiksCS8qdHBfYmFzaWNzaXplKi8KLQkwLAkJCS8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3Rvciltc2lvYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KLQkwLAkJCS8qdHBfcHJpbnQqLwotCTAsCQkJLyp0cF9nZXRhdHRyKi8KLQkwLAkJCS8qdHBfc2V0YXR0ciovCi0JMCwJCQkvKnRwX2NvbXBhcmUqLwotCTAsCQkJLyp0cF9yZXByKi8KLQkwLAkJCS8qdHBfYXNfbnVtYmVyKi8KLQkwLAkJCS8qdHBfYXNfc2VxdWVuY2UqLwotCTAsCQkJLyp0cF9hc19tYXBwaW5nKi8KLQkwLAkJCS8qdHBfaGFzaCovCisgICAgICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQorICAgICAgICAiX21zaS5SZWNvcmQiLCAgICAgICAgICAvKnRwX25hbWUqLworICAgICAgICBzaXplb2YobXNpb2JqKSwgLyp0cF9iYXNpY3NpemUqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZW1zaXplKi8KKyAgICAgICAgLyogbWV0aG9kcyAqLworICAgICAgICAoZGVzdHJ1Y3Rvciltc2lvYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9wcmludCovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0YXR0ciovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc2V0YXR0ciovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY29tcGFyZSovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmVwciovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbnVtYmVyKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19zZXF1ZW5jZSovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbWFwcGluZyovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaGFzaCovCiAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY2FsbCovCiAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc3RyKi8KICAgICAgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsLyp0cF9nZXRhdHRybyovCkBAIC01MTMsOCArNTEzLDggQEAKICAgICBtc2lvYmogKnJlc3VsdCA9IFB5T2JqZWN0X05FVyhzdHJ1Y3QgbXNpb2JqLCAmcmVjb3JkX1R5cGUpOwogCiAgICAgaWYgKCFyZXN1bHQpIHsKLQlNc2lDbG9zZUhhbmRsZShoKTsKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgTXNpQ2xvc2VIYW5kbGUoaCk7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAogICAgIHJlc3VsdC0+aCA9IGg7CkBAIC01MzcsMjcgKzUzNywyNyBAQAogICAgIERXT1JEIHNzaXplID0gc2l6ZW9mKHN2YWwpOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOkdldFByb3BlcnR5IiwgJmZpZWxkKSkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLSAgICBzdGF0dXMgPSBNc2lTdW1tYXJ5SW5mb0dldFByb3BlcnR5KHNpLT5oLCBmaWVsZCwgJnR5cGUsICZpdmFsLCAKLQkmZnZhbCwgc3ZhbCwgJnNzaXplKTsKKyAgICBzdGF0dXMgPSBNc2lTdW1tYXJ5SW5mb0dldFByb3BlcnR5KHNpLT5oLCBmaWVsZCwgJnR5cGUsICZpdmFsLAorICAgICAgICAmZnZhbCwgc3ZhbCwgJnNzaXplKTsKICAgICBpZiAoc3RhdHVzID09IEVSUk9SX01PUkVfREFUQSkgewotCXN2YWwgPSBtYWxsb2Moc3NpemUpOwotICAgICAgICBzdGF0dXMgPSBNc2lTdW1tYXJ5SW5mb0dldFByb3BlcnR5KHNpLT5oLCBmaWVsZCwgJnR5cGUsICZpdmFsLCAKLSAgICAJICAgICZmdmFsLCBzdmFsLCAmc3NpemUpOworICAgICAgICBzdmFsID0gbWFsbG9jKHNzaXplKTsKKyAgICAgICAgc3RhdHVzID0gTXNpU3VtbWFyeUluZm9HZXRQcm9wZXJ0eShzaS0+aCwgZmllbGQsICZ0eXBlLCAmaXZhbCwKKyAgICAgICAgICAgICZmdmFsLCBzdmFsLCAmc3NpemUpOwogICAgIH0KIAogICAgIHN3aXRjaCh0eXBlKSB7Ci0JY2FzZSBWVF9JMjogY2FzZSBWVF9JNDoKLQkgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKGl2YWwpOwotCWNhc2UgVlRfRklMRVRJTUU6Ci0JICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yLCAiRklMRVRJTUUgcmVzdWx0Iik7Ci0JICAgIHJldHVybiBOVUxMOwotCWNhc2UgVlRfTFBTVFI6Ci0JICAgIHJlc3VsdCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHN2YWwsIHNzaXplKTsKLQkgICAgaWYgKHN2YWwgIT0gc2J1ZikKLQkJZnJlZShzdmFsKTsKLQkgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgY2FzZSBWVF9JMjogY2FzZSBWVF9JNDoKKyAgICAgICAgICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhpdmFsKTsKKyAgICAgICAgY2FzZSBWVF9GSUxFVElNRToKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yLCAiRklMRVRJTUUgcmVzdWx0Iik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgY2FzZSBWVF9MUFNUUjoKKyAgICAgICAgICAgIHJlc3VsdCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHN2YWwsIHNzaXplKTsKKyAgICAgICAgICAgIGlmIChzdmFsICE9IHNidWYpCisgICAgICAgICAgICAgICAgZnJlZShzdmFsKTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yLCAicmVzdWx0IG9mIHR5cGUgJWQiLCB0eXBlKTsKICAgICByZXR1cm4gTlVMTDsKQEAgLTU3MSw3ICs1NzEsNyBAQAogCiAgICAgc3RhdHVzID0gTXNpU3VtbWFyeUluZm9HZXRQcm9wZXJ0eUNvdW50KHNpLT5oLCAmcmVzdWx0KTsKICAgICBpZiAoc3RhdHVzICE9IEVSUk9SX1NVQ0NFU1MpCi0JcmV0dXJuIG1zaWVycm9yKHN0YXR1cyk7CisgICAgICAgIHJldHVybiBtc2llcnJvcihzdGF0dXMpOwogCiAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHJlc3VsdCk7CiB9CkBAIC01ODQsMjEgKzU4NCwyMSBAQAogICAgIFB5T2JqZWN0KiBkYXRhOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpTzpTZXRQcm9wZXJ0eSIsICZmaWVsZCwgJmRhdGEpKQotCXJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIGlmIChQeVN0cmluZ19DaGVjayhkYXRhKSkgewotCXN0YXR1cyA9IE1zaVN1bW1hcnlJbmZvU2V0UHJvcGVydHkoc2ktPmgsIGZpZWxkLCBWVF9MUFNUUiwKLQkgICAgMCwgTlVMTCwgUHlTdHJpbmdfQXNTdHJpbmcoZGF0YSkpOworICAgICAgICBzdGF0dXMgPSBNc2lTdW1tYXJ5SW5mb1NldFByb3BlcnR5KHNpLT5oLCBmaWVsZCwgVlRfTFBTVFIsCisgICAgICAgICAgICAwLCBOVUxMLCBQeVN0cmluZ19Bc1N0cmluZyhkYXRhKSk7CiAgICAgfSBlbHNlIGlmIChQeUludF9DaGVjayhkYXRhKSkgewotCXN0YXR1cyA9IE1zaVN1bW1hcnlJbmZvU2V0UHJvcGVydHkoc2ktPmgsIGZpZWxkLCBWVF9JNCwKLQkgICAgUHlJbnRfQXNMb25nKGRhdGEpLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgc3RhdHVzID0gTXNpU3VtbWFyeUluZm9TZXRQcm9wZXJ0eShzaS0+aCwgZmllbGQsIFZUX0k0LAorICAgICAgICAgICAgUHlJbnRfQXNMb25nKGRhdGEpLCBOVUxMLCBOVUxMKTsKICAgICB9IGVsc2UgewotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJ1bnN1cHBvcnRlZCB0eXBlIik7Ci0JcmV0dXJuIE5VTEw7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJ1bnN1cHBvcnRlZCB0eXBlIik7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICAKKwogICAgIGlmIChzdGF0dXMgIT0gRVJST1JfU1VDQ0VTUykKLQlyZXR1cm4gbXNpZXJyb3Ioc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIG1zaWVycm9yKHN0YXR1cyk7CiAKICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CiAgICAgcmV0dXJuIFB5X05vbmU7CkBAIC02MTIsMzkgKzYxMiwzOSBAQAogCiAgICAgc3RhdHVzID0gTXNpU3VtbWFyeUluZm9QZXJzaXN0KHNpLT5oKTsKICAgICBpZiAoc3RhdHVzICE9IEVSUk9SX1NVQ0NFU1MpCi0JcmV0dXJuIG1zaWVycm9yKHN0YXR1cyk7CisgICAgICAgIHJldHVybiBtc2llcnJvcihzdGF0dXMpOwogICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKICAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIHN1bW1hcnlfbWV0aG9kc1tdID0gewotICAgIHsgIkdldFByb3BlcnR5IiwgKFB5Q0Z1bmN0aW9uKXN1bW1hcnlfZ2V0cHJvcGVydHksIE1FVEhfVkFSQVJHUywgCi0JUHlEb2NfU1RSKCJHZXRQcm9wZXJ0eShwcm9waWQpIC0+IHZhbHVlXG5XcmFwcyBNc2lTdW1tYXJ5SW5mb0dldFByb3BlcnR5Iil9LAotICAgIHsgIkdldFByb3BlcnR5Q291bnQiLCAoUHlDRnVuY3Rpb24pc3VtbWFyeV9nZXRwcm9wZXJ0eWNvdW50LCBNRVRIX05PQVJHUywgCi0JUHlEb2NfU1RSKCJHZXRQcm9wZXJ0eSgpIC0+IGludFxuV3JhcHMgTXNpU3VtbWFyeUluZm9HZXRQcm9wZXJ0eUNvdW50Iil9LAotICAgIHsgIlNldFByb3BlcnR5IiwgKFB5Q0Z1bmN0aW9uKXN1bW1hcnlfc2V0cHJvcGVydHksIE1FVEhfVkFSQVJHUywgCi0JUHlEb2NfU1RSKCJTZXRQcm9wZXJ0eSh2YWx1ZSkgLT4gTm9uZVxuV3JhcHMgTXNpU3VtbWFyeUluZm9Qcm9wZXJ0eSIpfSwKLSAgICB7ICJQZXJzaXN0IiwgKFB5Q0Z1bmN0aW9uKXN1bW1hcnlfcGVyc2lzdCwgTUVUSF9OT0FSR1MsIAotCVB5RG9jX1NUUigiUGVyc2lzdCgpIC0+IE5vbmVcbldyYXBzIE1zaVN1bW1hcnlJbmZvUGVyc2lzdCIpfSwKKyAgICB7ICJHZXRQcm9wZXJ0eSIsIChQeUNGdW5jdGlvbilzdW1tYXJ5X2dldHByb3BlcnR5LCBNRVRIX1ZBUkFSR1MsCisgICAgICAgIFB5RG9jX1NUUigiR2V0UHJvcGVydHkocHJvcGlkKSAtPiB2YWx1ZVxuV3JhcHMgTXNpU3VtbWFyeUluZm9HZXRQcm9wZXJ0eSIpfSwKKyAgICB7ICJHZXRQcm9wZXJ0eUNvdW50IiwgKFB5Q0Z1bmN0aW9uKXN1bW1hcnlfZ2V0cHJvcGVydHljb3VudCwgTUVUSF9OT0FSR1MsCisgICAgICAgIFB5RG9jX1NUUigiR2V0UHJvcGVydHkoKSAtPiBpbnRcbldyYXBzIE1zaVN1bW1hcnlJbmZvR2V0UHJvcGVydHlDb3VudCIpfSwKKyAgICB7ICJTZXRQcm9wZXJ0eSIsIChQeUNGdW5jdGlvbilzdW1tYXJ5X3NldHByb3BlcnR5LCBNRVRIX1ZBUkFSR1MsCisgICAgICAgIFB5RG9jX1NUUigiU2V0UHJvcGVydHkodmFsdWUpIC0+IE5vbmVcbldyYXBzIE1zaVN1bW1hcnlJbmZvUHJvcGVydHkiKX0sCisgICAgeyAiUGVyc2lzdCIsIChQeUNGdW5jdGlvbilzdW1tYXJ5X3BlcnNpc3QsIE1FVEhfTk9BUkdTLAorICAgICAgICBQeURvY19TVFIoIlBlcnNpc3QoKSAtPiBOb25lXG5XcmFwcyBNc2lTdW1tYXJ5SW5mb1BlcnNpc3QiKX0sCiAgICAgeyBOVUxMLCBOVUxMIH0KIH07CiAKIHN0YXRpYyBQeVR5cGVPYmplY3Qgc3VtbWFyeV9UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotCSJfbXNpLlN1bW1hcnlJbmZvcm1hdGlvbiIsCQkvKnRwX25hbWUqLwotCXNpemVvZihtc2lvYmopLAkvKnRwX2Jhc2ljc2l6ZSovCi0JMCwJCQkvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpbXNpb2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCi0JMCwJCQkvKnRwX3ByaW50Ki8KLQkwLAkJCS8qdHBfZ2V0YXR0ciovCi0JMCwJCQkvKnRwX3NldGF0dHIqLwotCTAsCQkJLyp0cF9jb21wYXJlKi8KLQkwLAkJCS8qdHBfcmVwciovCi0JMCwJCQkvKnRwX2FzX251bWJlciovCi0JMCwJCQkvKnRwX2FzX3NlcXVlbmNlKi8KLQkwLAkJCS8qdHBfYXNfbWFwcGluZyovCi0JMCwJCQkvKnRwX2hhc2gqLworICAgICAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAgICAgIl9tc2kuU3VtbWFyeUluZm9ybWF0aW9uIiwgICAgICAgICAgICAgIC8qdHBfbmFtZSovCisgICAgICAgIHNpemVvZihtc2lvYmopLCAvKnRwX2Jhc2ljc2l6ZSovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlbXNpemUqLworICAgICAgICAvKiBtZXRob2RzICovCisgICAgICAgIChkZXN0cnVjdG9yKW1zaW9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3ByaW50Ki8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRhdHRyKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRyKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jb21wYXJlKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9yZXByKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19udW1iZXIqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX3NlcXVlbmNlKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19tYXBwaW5nKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9oYXNoKi8KICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jYWxsKi8KICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zdHIqLwogICAgICAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwvKnRwX2dldGF0dHJvKi8KQEAgLTY4Myw3ICs2ODMsNyBAQAogICAgIFB5T2JqZWN0ICpvcGFyYW1zID0gUHlfTm9uZTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTzpFeGVjdXRlIiwgJm9wYXJhbXMpKQotCXJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIGlmIChvcGFyYW1zICE9IFB5X05vbmUpIHsKICAgICAgICAgaWYgKG9wYXJhbXMtPm9iX3R5cGUgIT0gJnJlY29yZF9UeXBlKSB7CkBAIC02OTUsNyArNjk1LDcgQEAKIAogICAgIHN0YXR1cyA9IE1zaVZpZXdFeGVjdXRlKHZpZXctPmgsIHBhcmFtcyk7CiAgICAgaWYgKHN0YXR1cyAhPSBFUlJPUl9TVUNDRVNTKQotCXJldHVybiBtc2llcnJvcihzdGF0dXMpOworICAgICAgICByZXR1cm4gbXNpZXJyb3Ioc3RhdHVzKTsKIAogICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKICAgICByZXR1cm4gUHlfTm9uZTsKQEAgLTcwOCw3ICs3MDgsNyBAQAogICAgIE1TSUhBTkRMRSByZXN1bHQ7CiAKICAgICBpZiAoKHN0YXR1cyA9IE1zaVZpZXdGZXRjaCh2aWV3LT5oLCAmcmVzdWx0KSkgIT0gRVJST1JfU1VDQ0VTUykKLQlyZXR1cm4gbXNpZXJyb3Ioc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIG1zaWVycm9yKHN0YXR1cyk7CiAKICAgICByZXR1cm4gcmVjb3JkX25ldyhyZXN1bHQpOwogfQpAQCAtNzIxLDEwICs3MjEsMTAgQEAKICAgICBNU0lIQU5ETEUgcmVzdWx0OwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOkdldENvbHVtbkluZm8iLCAma2luZCkpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgaWYgKChzdGF0dXMgPSBNc2lWaWV3R2V0Q29sdW1uSW5mbyh2aWV3LT5oLCBraW5kLCAmcmVzdWx0KSkgIT0gRVJST1JfU1VDQ0VTUykKLQlyZXR1cm4gbXNpZXJyb3Ioc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIG1zaWVycm9yKHN0YXR1cyk7CiAKICAgICByZXR1cm4gcmVjb3JkX25ldyhyZXN1bHQpOwogfQpAQCAtNzM3LDE1ICs3MzcsMTUgQEAKICAgICBpbnQgc3RhdHVzOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpTzpNb2RpZnkiLCAma2luZCwgJmRhdGEpKQotCXJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIGlmIChkYXRhLT5vYl90eXBlICE9ICZyZWNvcmRfVHlwZSkgewotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJNb2RpZnkgZXhwZWN0cyBhIHJlY29yZCBvYmplY3QiKTsKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIk1vZGlmeSBleHBlY3RzIGEgcmVjb3JkIG9iamVjdCIpOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKICAgICBpZiAoKHN0YXR1cyA9IE1zaVZpZXdNb2RpZnkodmlldy0+aCwga2luZCwgKChtc2lvYmoqKWRhdGEpLT5oKSkgIT0gRVJST1JfU1VDQ0VTUykKLQlyZXR1cm4gbXNpZXJyb3Ioc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIG1zaWVycm9yKHN0YXR1cyk7CiAKICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CiAgICAgcmV0dXJuIFB5X05vbmU7CkBAIC03NTcsNDIgKzc1Nyw0MiBAQAogICAgIGludCBzdGF0dXM7CiAKICAgICBpZiAoKHN0YXR1cyA9IE1zaVZpZXdDbG9zZSh2aWV3LT5oKSkgIT0gRVJST1JfU1VDQ0VTUykKLQlyZXR1cm4gbXNpZXJyb3Ioc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIG1zaWVycm9yKHN0YXR1cyk7CiAKICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CiAgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiB2aWV3X21ldGhvZHNbXSA9IHsKLSAgICB7ICJFeGVjdXRlIiwgKFB5Q0Z1bmN0aW9uKXZpZXdfZXhlY3V0ZSwgTUVUSF9WQVJBUkdTLCAKLQlQeURvY19TVFIoIkV4ZWN1dGUocGFyYW1zPU5vbmUpIC0+IE5vbmVcbldyYXBzIE1zaVZpZXdFeGVjdXRlIil9LAorICAgIHsgIkV4ZWN1dGUiLCAoUHlDRnVuY3Rpb24pdmlld19leGVjdXRlLCBNRVRIX1ZBUkFSR1MsCisgICAgICAgIFB5RG9jX1NUUigiRXhlY3V0ZShwYXJhbXM9Tm9uZSkgLT4gTm9uZVxuV3JhcHMgTXNpVmlld0V4ZWN1dGUiKX0sCiAgICAgeyAiR2V0Q29sdW1uSW5mbyIsIChQeUNGdW5jdGlvbil2aWV3X2dldGNvbHVtbmluZm8sIE1FVEhfVkFSQVJHUywKLQlQeURvY19TVFIoIkdldENvbHVtbkluZm8oKSAtPiByZXN1bHRcbldyYXBzIE1zaUdldENvbHVtbkluZm8iKX0sCisgICAgICAgIFB5RG9jX1NUUigiR2V0Q29sdW1uSW5mbygpIC0+IHJlc3VsdFxuV3JhcHMgTXNpR2V0Q29sdW1uSW5mbyIpfSwKICAgICB7ICJGZXRjaCIsIChQeUNGdW5jdGlvbil2aWV3X2ZldGNoLCBNRVRIX05PQVJHUywKLQlQeURvY19TVFIoIkZldGNoKCkgLT4gcmVzdWx0XG5XcmFwcyBNc2lWaWV3RmV0Y2giKX0sCisgICAgICAgIFB5RG9jX1NUUigiRmV0Y2goKSAtPiByZXN1bHRcbldyYXBzIE1zaVZpZXdGZXRjaCIpfSwKICAgICB7ICJNb2RpZnkiLCAoUHlDRnVuY3Rpb24pdmlld19tb2RpZnksIE1FVEhfVkFSQVJHUywKLQlQeURvY19TVFIoIk1vZGlmeShtb2RlLHJlY29yZCkgLT4gTm9uZVxuV3JhcHMgTXNpVmlld01vZGlmeSIpfSwKKyAgICAgICAgUHlEb2NfU1RSKCJNb2RpZnkobW9kZSxyZWNvcmQpIC0+IE5vbmVcbldyYXBzIE1zaVZpZXdNb2RpZnkiKX0sCiAgICAgeyAiQ2xvc2UiLCAoUHlDRnVuY3Rpb24pdmlld19jbG9zZSwgTUVUSF9OT0FSR1MsCi0JUHlEb2NfU1RSKCJDbG9zZSgpIC0+IHJlc3VsdFxuV3JhcHMgTXNpVmlld0Nsb3NlIil9LAorICAgICAgICBQeURvY19TVFIoIkNsb3NlKCkgLT4gcmVzdWx0XG5XcmFwcyBNc2lWaWV3Q2xvc2UiKX0sCiAgICAgeyBOVUxMLCBOVUxMIH0KIH07CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgbXNpdmlld19UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotCSJfbXNpLlZpZXciLAkJLyp0cF9uYW1lKi8KLQlzaXplb2YobXNpb2JqKSwJLyp0cF9iYXNpY3NpemUqLwotCTAsCQkJLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKW1zaW9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsCQkJLyp0cF9wcmludCovCi0JMCwJCQkvKnRwX2dldGF0dHIqLwotCTAsCQkJLyp0cF9zZXRhdHRyKi8KLQkwLAkJCS8qdHBfY29tcGFyZSovCi0JMCwJCQkvKnRwX3JlcHIqLwotCTAsCQkJLyp0cF9hc19udW1iZXIqLwotCTAsCQkJLyp0cF9hc19zZXF1ZW5jZSovCi0JMCwJCQkvKnRwX2FzX21hcHBpbmcqLwotCTAsCQkJLyp0cF9oYXNoKi8KKyAgICAgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisgICAgICAgICJfbXNpLlZpZXciLCAgICAgICAgICAgIC8qdHBfbmFtZSovCisgICAgICAgIHNpemVvZihtc2lvYmopLCAvKnRwX2Jhc2ljc2l6ZSovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlbXNpemUqLworICAgICAgICAvKiBtZXRob2RzICovCisgICAgICAgIChkZXN0cnVjdG9yKW1zaW9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3ByaW50Ki8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRhdHRyKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRyKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jb21wYXJlKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9yZXByKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19udW1iZXIqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX3NlcXVlbmNlKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19tYXBwaW5nKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9oYXNoKi8KICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jYWxsKi8KICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zdHIqLwogICAgICAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwvKnRwX2dldGF0dHJvKi8KQEAgLTgzMiwxNSArODMyLDE1IEBACiAgICAgbXNpb2JqICpyZXN1bHQ7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6T3BlblZpZXciLCAmc3FsKSkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICBpZiAoKHN0YXR1cyA9IE1zaURhdGFiYXNlT3BlblZpZXcobXNpZGItPmgsIHNxbCwgJmhWaWV3KSkgIT0gRVJST1JfU1VDQ0VTUykKLQlyZXR1cm4gbXNpZXJyb3Ioc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIG1zaWVycm9yKHN0YXR1cyk7CiAKICAgICByZXN1bHQgPSBQeU9iamVjdF9ORVcoc3RydWN0IG1zaW9iaiwgJm1zaXZpZXdfVHlwZSk7CiAgICAgaWYgKCFyZXN1bHQpIHsKLQlNc2lDbG9zZUhhbmRsZShoVmlldyk7Ci0JcmV0dXJuIE5VTEw7CisgICAgICAgIE1zaUNsb3NlSGFuZGxlKGhWaWV3KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCiAgICAgcmVzdWx0LT5oID0gaFZpZXc7CkBAIC04NTMsNyArODUzLDcgQEAKICAgICBpbnQgc3RhdHVzOwogCiAgICAgaWYgKChzdGF0dXMgPSBNc2lEYXRhYmFzZUNvbW1pdChtc2lkYi0+aCkpICE9IEVSUk9SX1NVQ0NFU1MpCi0JcmV0dXJuIG1zaWVycm9yKHN0YXR1cyk7CisgICAgICAgIHJldHVybiBtc2llcnJvcihzdGF0dXMpOwogCiAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwogICAgIHJldHVybiBQeV9Ob25lOwpAQCAtODY4LDE2ICs4NjgsMTYgQEAKICAgICBtc2lvYmogKm9yZXN1bHQ7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6R2V0U3VtbWFyeUluZm9ybWF0aW9uIiwgJmNvdW50KSkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICBzdGF0dXMgPSBNc2lHZXRTdW1tYXJ5SW5mb3JtYXRpb24oZGItPmgsIE5VTEwsIGNvdW50LCAmcmVzdWx0KTsKICAgICBpZiAoc3RhdHVzICE9IEVSUk9SX1NVQ0NFU1MpCi0JcmV0dXJuIG1zaWVycm9yKHN0YXR1cyk7CisgICAgICAgIHJldHVybiBtc2llcnJvcihzdGF0dXMpOwogCiAgICAgb3Jlc3VsdCA9IFB5T2JqZWN0X05FVyhzdHJ1Y3QgbXNpb2JqLCAmc3VtbWFyeV9UeXBlKTsKICAgICBpZiAoIXJlc3VsdCkgewotCU1zaUNsb3NlSGFuZGxlKHJlc3VsdCk7Ci0JcmV0dXJuIE5VTEw7CisgICAgICAgIE1zaUNsb3NlSGFuZGxlKHJlc3VsdCk7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAogICAgIG9yZXN1bHQtPmggPSByZXN1bHQ7CkBAIC04ODUsMzEgKzg4NSwzMSBAQAogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgZGJfbWV0aG9kc1tdID0gewotICAgIHsgIk9wZW5WaWV3IiwgKFB5Q0Z1bmN0aW9uKW1zaWRiX29wZW52aWV3LCBNRVRIX1ZBUkFSR1MsIAotCVB5RG9jX1NUUigiT3BlblZpZXcoc3FsKSAtPiB2aWV3b2JqXG5XcmFwcyBNc2lEYXRhYmFzZU9wZW5WaWV3Iil9LAorICAgIHsgIk9wZW5WaWV3IiwgKFB5Q0Z1bmN0aW9uKW1zaWRiX29wZW52aWV3LCBNRVRIX1ZBUkFSR1MsCisgICAgICAgIFB5RG9jX1NUUigiT3BlblZpZXcoc3FsKSAtPiB2aWV3b2JqXG5XcmFwcyBNc2lEYXRhYmFzZU9wZW5WaWV3Iil9LAogICAgIHsgIkNvbW1pdCIsIChQeUNGdW5jdGlvbiltc2lkYl9jb21taXQsIE1FVEhfTk9BUkdTLAotCVB5RG9jX1NUUigiQ29tbWl0KCkgLT4gTm9uZVxuV3JhcHMgTXNpRGF0YWJhc2VDb21taXQiKX0sCi0gICAgeyAiR2V0U3VtbWFyeUluZm9ybWF0aW9uIiwgKFB5Q0Z1bmN0aW9uKW1zaWRiX2dldHN1bW1hcnlpbmZvcm1hdGlvbiwgTUVUSF9WQVJBUkdTLCAKLQlQeURvY19TVFIoIkdldFN1bW1hcnlJbmZvcm1hdGlvbih1cGRhdGVDb3VudCkgLT4gdmlld29ialxuV3JhcHMgTXNpR2V0U3VtbWFyeUluZm9ybWF0aW9uIil9LAorICAgICAgICBQeURvY19TVFIoIkNvbW1pdCgpIC0+IE5vbmVcbldyYXBzIE1zaURhdGFiYXNlQ29tbWl0Iil9LAorICAgIHsgIkdldFN1bW1hcnlJbmZvcm1hdGlvbiIsIChQeUNGdW5jdGlvbiltc2lkYl9nZXRzdW1tYXJ5aW5mb3JtYXRpb24sIE1FVEhfVkFSQVJHUywKKyAgICAgICAgUHlEb2NfU1RSKCJHZXRTdW1tYXJ5SW5mb3JtYXRpb24odXBkYXRlQ291bnQpIC0+IHZpZXdvYmpcbldyYXBzIE1zaUdldFN1bW1hcnlJbmZvcm1hdGlvbiIpfSwKICAgICB7IE5VTEwsIE5VTEwgfQogfTsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBtc2lkYl9UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotCSJfbXNpLkRhdGFiYXNlIiwJCS8qdHBfbmFtZSovCi0Jc2l6ZW9mKG1zaW9iaiksCS8qdHBfYmFzaWNzaXplKi8KLQkwLAkJCS8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3Rvciltc2lvYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KLQkwLAkJCS8qdHBfcHJpbnQqLwotCTAsCQkJLyp0cF9nZXRhdHRyKi8KLQkwLAkJCS8qdHBfc2V0YXR0ciovCi0JMCwJCQkvKnRwX2NvbXBhcmUqLwotCTAsCQkJLyp0cF9yZXByKi8KLQkwLAkJCS8qdHBfYXNfbnVtYmVyKi8KLQkwLAkJCS8qdHBfYXNfc2VxdWVuY2UqLwotCTAsCQkJLyp0cF9hc19tYXBwaW5nKi8KLQkwLAkJCS8qdHBfaGFzaCovCisgICAgICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQorICAgICAgICAiX21zaS5EYXRhYmFzZSIsICAgICAgICAgICAgICAgIC8qdHBfbmFtZSovCisgICAgICAgIHNpemVvZihtc2lvYmopLCAvKnRwX2Jhc2ljc2l6ZSovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlbXNpemUqLworICAgICAgICAvKiBtZXRob2RzICovCisgICAgICAgIChkZXN0cnVjdG9yKW1zaW9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3ByaW50Ki8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRhdHRyKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRyKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jb21wYXJlKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9yZXByKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19udW1iZXIqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX3NlcXVlbmNlKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19tYXBwaW5nKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9oYXNoKi8KICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jYWxsKi8KICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zdHIqLwogICAgICAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwvKnRwX2dldGF0dHJvKi8KQEAgLTk0NSwxOCArOTQ1LDE4IEBACiAgICAgaW50IHBlcnNpc3Q7CiAgICAgTVNJSEFORExFIGg7CiAgICAgbXNpb2JqICpyZXN1bHQ7Ci0gICAgCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzaTpNU0lPcGVuRGF0YWJhc2UiLCAmcGF0aCwgJnBlcnNpc3QpKQotCXJldHVybiBOVUxMOwogCi0Jc3RhdHVzID0gTXNpT3BlbkRhdGFiYXNlKHBhdGgsIChMUENTVFIpcGVyc2lzdCwgJmgpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic2k6TVNJT3BlbkRhdGFiYXNlIiwgJnBhdGgsICZwZXJzaXN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICAgICAgc3RhdHVzID0gTXNpT3BlbkRhdGFiYXNlKHBhdGgsIChMUENTVFIpcGVyc2lzdCwgJmgpOwogICAgIGlmIChzdGF0dXMgIT0gRVJST1JfU1VDQ0VTUykKLQlyZXR1cm4gbXNpZXJyb3Ioc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIG1zaWVycm9yKHN0YXR1cyk7CiAKICAgICByZXN1bHQgPSBQeU9iamVjdF9ORVcoc3RydWN0IG1zaW9iaiwgJm1zaWRiX1R5cGUpOwogICAgIGlmICghcmVzdWx0KSB7Ci0JTXNpQ2xvc2VIYW5kbGUoaCk7Ci0JcmV0dXJuIE5VTEw7CisgICAgICAgIE1zaUNsb3NlSGFuZGxlKGgpOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAgICAgcmVzdWx0LT5oID0gaDsKICAgICByZXR1cm4gKFB5T2JqZWN0KilyZXN1bHQ7CkBAIC05NjksMTEgKzk2OSwxMSBAQAogICAgIE1TSUhBTkRMRSBoOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOkNyZWF0ZVJlY29yZCIsICZjb3VudCkpCi0JcmV0dXJuIE5VTEw7Ci0gICAgCisgICAgICAgIHJldHVybiBOVUxMOworCiAgICAgaCA9IE1zaUNyZWF0ZVJlY29yZChjb3VudCk7CiAgICAgaWYgKGggPT0gMCkKLQlyZXR1cm4gbXNpZXJyb3IoMCk7CisgICAgICAgIHJldHVybiBtc2llcnJvcigwKTsKIAogICAgIHJldHVybiByZWNvcmRfbmV3KGgpOwogfQpAQCAtOTgxLDE0ICs5ODEsMTQgQEAKIAogc3RhdGljIFB5TWV0aG9kRGVmIG1zaV9tZXRob2RzW10gPSB7CiAgICAgICAgIHsiVXVpZENyZWF0ZSIsIChQeUNGdW5jdGlvbil1dWlkY3JlYXRlLCBNRVRIX05PQVJHUywKLQkJUHlEb2NfU1RSKCJVdWlkQ3JlYXRlKCkgLT4gc3RyaW5nIil9LAotCXsiRkNJQ3JlYXRlIiwJKFB5Q0Z1bmN0aW9uKWZjaWNyZWF0ZSwJTUVUSF9WQVJBUkdTLAotCQlQeURvY19TVFIoImZjaWNyZWF0ZShjYWJuYW1lLGZpbGVzKSAtPiBOb25lIil9LAotCXsiT3BlbkRhdGFiYXNlIiwgKFB5Q0Z1bmN0aW9uKW1zaW9wZW5kYiwgTUVUSF9WQVJBUkdTLAotCVB5RG9jX1NUUigiT3BlbkRhdGFiYXNlKG5hbWUsIGZsYWdzKSAtPiBkYm9ialxuV3JhcHMgTXNpT3BlbkRhdGFiYXNlIil9LAotCXsiQ3JlYXRlUmVjb3JkIiwgKFB5Q0Z1bmN0aW9uKWNyZWF0ZXJlY29yZCwgTUVUSF9WQVJBUkdTLAotCVB5RG9jX1NUUigiT3BlbkRhdGFiYXNlKG5hbWUsIGZsYWdzKSAtPiBkYm9ialxuV3JhcHMgTXNpQ3JlYXRlUmVjb3JkIil9LAotCXtOVUxMLAkJTlVMTH0JCS8qIHNlbnRpbmVsICovCisgICAgICAgICAgICAgICAgUHlEb2NfU1RSKCJVdWlkQ3JlYXRlKCkgLT4gc3RyaW5nIil9LAorICAgICAgICB7IkZDSUNyZWF0ZSIsICAgKFB5Q0Z1bmN0aW9uKWZjaWNyZWF0ZSwgTUVUSF9WQVJBUkdTLAorICAgICAgICAgICAgICAgIFB5RG9jX1NUUigiZmNpY3JlYXRlKGNhYm5hbWUsZmlsZXMpIC0+IE5vbmUiKX0sCisgICAgICAgIHsiT3BlbkRhdGFiYXNlIiwgKFB5Q0Z1bmN0aW9uKW1zaW9wZW5kYiwgTUVUSF9WQVJBUkdTLAorICAgICAgICBQeURvY19TVFIoIk9wZW5EYXRhYmFzZShuYW1lLCBmbGFncykgLT4gZGJvYmpcbldyYXBzIE1zaU9wZW5EYXRhYmFzZSIpfSwKKyAgICAgICAgeyJDcmVhdGVSZWNvcmQiLCAoUHlDRnVuY3Rpb24pY3JlYXRlcmVjb3JkLCBNRVRIX1ZBUkFSR1MsCisgICAgICAgIFB5RG9jX1NUUigiT3BlbkRhdGFiYXNlKG5hbWUsIGZsYWdzKSAtPiBkYm9ialxuV3JhcHMgTXNpQ3JlYXRlUmVjb3JkIil9LAorICAgICAgICB7TlVMTCwgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiBzdGF0aWMgY2hhciBtc2lfZG9jW10gPSAiRG9jdW1lbnRhdGlvbiI7CkBAIC0xMDAwLDcgKzEwMDAsNyBAQAogCiAgICAgbSA9IFB5X0luaXRNb2R1bGUzKCJfbXNpIiwgbXNpX21ldGhvZHMsIG1zaV9kb2MpOwogICAgIGlmIChtID09IE5VTEwpCi0JcmV0dXJuOworICAgICAgICByZXR1cm47CiAKICAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTVNJREJPUEVOX0NSRUFURURJUkVDVCIsIChpbnQpTVNJREJPUEVOX0NSRUFURURJUkVDVCk7CiAgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk1TSURCT1BFTl9DUkVBVEUiLCAoaW50KU1TSURCT1BFTl9DUkVBVEUpOwpAQCAtMTA0Niw2ICsxMDQ2LDYgQEAKIAogICAgIE1TSUVycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uICgiX21zaS5NU0lFcnJvciIsIE5VTEwsIE5VTEwpOwogICAgIGlmICghTVNJRXJyb3IpCi0JcmV0dXJuOworICAgICAgICByZXR1cm47CiAgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJNU0lFcnJvciIsIE1TSUVycm9yKTsKIH0KZGlmZiAtLWdpdCBhL1BDL19zdWJwcm9jZXNzLmMgYi9QQy9fc3VicHJvY2Vzcy5jCmluZGV4IDUzODlkNzkuLjZiMzQxNzUgMTAwNjQ0Ci0tLSBhL1BDL19zdWJwcm9jZXNzLmMKKysrIGIvUEMvX3N1YnByb2Nlc3MuYwpAQCAtNDksOCArNDksOCBAQAogICAgdGhlIHdyYXBwZXIgaXMgdXNlZCB0byBwcm92aWRlIERldGFjaCBhbmQgQ2xvc2UgbWV0aG9kcyAqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCUhBTkRMRSBoYW5kbGU7CisgICAgUHlPYmplY3RfSEVBRAorICAgIEhBTkRMRSBoYW5kbGU7CiB9IHNwX2hhbmRsZV9vYmplY3Q7CiAKIHN0YXRpY2ZvcndhcmQgUHlUeXBlT2JqZWN0IHNwX2hhbmRsZV90eXBlOwpAQCAtNTgsOTcgKzU4LDk3IEBACiBzdGF0aWMgUHlPYmplY3QqCiBzcF9oYW5kbGVfbmV3KEhBTkRMRSBoYW5kbGUpCiB7Ci0Jc3BfaGFuZGxlX29iamVjdCogc2VsZjsKKyAgICBzcF9oYW5kbGVfb2JqZWN0KiBzZWxmOwogCi0Jc2VsZiA9IFB5T2JqZWN0X05FVyhzcF9oYW5kbGVfb2JqZWN0LCAmc3BfaGFuZGxlX3R5cGUpOwotCWlmIChzZWxmID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIHNlbGYgPSBQeU9iamVjdF9ORVcoc3BfaGFuZGxlX29iamVjdCwgJnNwX2hhbmRsZV90eXBlKTsKKyAgICBpZiAoc2VsZiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXNlbGYtPmhhbmRsZSA9IGhhbmRsZTsKKyAgICBzZWxmLT5oYW5kbGUgPSBoYW5kbGU7CiAKLQlyZXR1cm4gKFB5T2JqZWN0Kikgc2VsZjsKKyAgICByZXR1cm4gKFB5T2JqZWN0Kikgc2VsZjsKIH0KIAogI2lmIGRlZmluZWQoTVNfV0lOMzIpICYmICFkZWZpbmVkKE1TX1dJTjY0KQotI2RlZmluZSBIQU5ETEVfVE9fUFlOVU0oaGFuZGxlKQlQeUludF9Gcm9tTG9uZygobG9uZykgaGFuZGxlKQotI2RlZmluZSBQWV9IQU5ETEVfUEFSQU0JImwiCisjZGVmaW5lIEhBTkRMRV9UT19QWU5VTShoYW5kbGUpIFB5SW50X0Zyb21Mb25nKChsb25nKSBoYW5kbGUpCisjZGVmaW5lIFBZX0hBTkRMRV9QQVJBTSAibCIKICNlbHNlCi0jZGVmaW5lIEhBTkRMRV9UT19QWU5VTShoYW5kbGUpCVB5TG9uZ19Gcm9tTG9uZ0xvbmcoKGxvbmcgbG9uZykgaGFuZGxlKQotI2RlZmluZSBQWV9IQU5ETEVfUEFSQU0JIkwiCisjZGVmaW5lIEhBTkRMRV9UT19QWU5VTShoYW5kbGUpIFB5TG9uZ19Gcm9tTG9uZ0xvbmcoKGxvbmcgbG9uZykgaGFuZGxlKQorI2RlZmluZSBQWV9IQU5ETEVfUEFSQU0gIkwiCiAjZW5kaWYKIAogc3RhdGljIFB5T2JqZWN0Kgogc3BfaGFuZGxlX2RldGFjaChzcF9oYW5kbGVfb2JqZWN0KiBzZWxmLCBQeU9iamVjdCogYXJncykKIHsKLQlIQU5ETEUgaGFuZGxlOworICAgIEhBTkRMRSBoYW5kbGU7CiAKLQlpZiAoISBQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6RGV0YWNoIikpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghIFB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpEZXRhY2giKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQloYW5kbGUgPSBzZWxmLT5oYW5kbGU7CisgICAgaGFuZGxlID0gc2VsZi0+aGFuZGxlOwogCi0Jc2VsZi0+aGFuZGxlID0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7CisgICAgc2VsZi0+aGFuZGxlID0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7CiAKLQkvKiBub3RlOiByZXR1cm4gdGhlIGN1cnJlbnQgaGFuZGxlLCBhcyBhbiBpbnRlZ2VyICovCi0JcmV0dXJuIEhBTkRMRV9UT19QWU5VTShoYW5kbGUpOworICAgIC8qIG5vdGU6IHJldHVybiB0aGUgY3VycmVudCBoYW5kbGUsIGFzIGFuIGludGVnZXIgKi8KKyAgICByZXR1cm4gSEFORExFX1RPX1BZTlVNKGhhbmRsZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCoKIHNwX2hhbmRsZV9jbG9zZShzcF9oYW5kbGVfb2JqZWN0KiBzZWxmLCBQeU9iamVjdCogYXJncykKIHsKLQlpZiAoISBQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6Q2xvc2UiKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCEgUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOkNsb3NlIikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKHNlbGYtPmhhbmRsZSAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgewotCQlDbG9zZUhhbmRsZShzZWxmLT5oYW5kbGUpOwotCQlzZWxmLT5oYW5kbGUgPSBJTlZBTElEX0hBTkRMRV9WQUxVRTsKLQl9Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGlmIChzZWxmLT5oYW5kbGUgIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKKyAgICAgICAgQ2xvc2VIYW5kbGUoc2VsZi0+aGFuZGxlKTsKKyAgICAgICAgc2VsZi0+aGFuZGxlID0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7CisgICAgfQorICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIHZvaWQKIHNwX2hhbmRsZV9kZWFsbG9jKHNwX2hhbmRsZV9vYmplY3QqIHNlbGYpCiB7Ci0JaWYgKHNlbGYtPmhhbmRsZSAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRSkKLQkJQ2xvc2VIYW5kbGUoc2VsZi0+aGFuZGxlKTsKLQlQeU9iamVjdF9GUkVFKHNlbGYpOworICAgIGlmIChzZWxmLT5oYW5kbGUgIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpCisgICAgICAgIENsb3NlSGFuZGxlKHNlbGYtPmhhbmRsZSk7CisgICAgUHlPYmplY3RfRlJFRShzZWxmKTsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIHNwX2hhbmRsZV9tZXRob2RzW10gPSB7Ci0JeyJEZXRhY2giLCAoUHlDRnVuY3Rpb24pIHNwX2hhbmRsZV9kZXRhY2gsIE1FVEhfVkFSQVJHU30sCi0JeyJDbG9zZSIsICAoUHlDRnVuY3Rpb24pIHNwX2hhbmRsZV9jbG9zZSwgIE1FVEhfVkFSQVJHU30sCi0Je05VTEwsIE5VTEx9CisgICAgeyJEZXRhY2giLCAoUHlDRnVuY3Rpb24pIHNwX2hhbmRsZV9kZXRhY2gsIE1FVEhfVkFSQVJHU30sCisgICAgeyJDbG9zZSIsICAoUHlDRnVuY3Rpb24pIHNwX2hhbmRsZV9jbG9zZSwgIE1FVEhfVkFSQVJHU30sCisgICAge05VTEwsIE5VTEx9CiB9OwogCiBzdGF0aWMgUHlPYmplY3QqCiBzcF9oYW5kbGVfZ2V0YXR0cihzcF9oYW5kbGVfb2JqZWN0KiBzZWxmLCBjaGFyKiBuYW1lKQogewotCXJldHVybiBQeV9GaW5kTWV0aG9kKHNwX2hhbmRsZV9tZXRob2RzLCAoUHlPYmplY3QqKSBzZWxmLCBuYW1lKTsKKyAgICByZXR1cm4gUHlfRmluZE1ldGhvZChzcF9oYW5kbGVfbWV0aG9kcywgKFB5T2JqZWN0Kikgc2VsZiwgbmFtZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCoKIHNwX2hhbmRsZV9hc19pbnQoc3BfaGFuZGxlX29iamVjdCogc2VsZikKIHsKLQlyZXR1cm4gSEFORExFX1RPX1BZTlVNKHNlbGYtPmhhbmRsZSk7CisgICAgcmV0dXJuIEhBTkRMRV9UT19QWU5VTShzZWxmLT5oYW5kbGUpOwogfQogCiBzdGF0aWMgUHlOdW1iZXJNZXRob2RzIHNwX2hhbmRsZV9hc19udW1iZXI7CiAKIHN0YXRpY2hlcmUgUHlUeXBlT2JqZWN0IHNwX2hhbmRsZV90eXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQotCTAsCQkJCS8qb2Jfc2l6ZSovCi0JIl9zdWJwcm9jZXNzX2hhbmRsZSIsIHNpemVvZihzcF9oYW5kbGVfb2JqZWN0KSwgMCwKLQkoZGVzdHJ1Y3Rvcikgc3BfaGFuZGxlX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCi0JMCwgLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKSBzcF9oYW5kbGVfZ2V0YXR0ciwvKnRwX2dldGF0dHIqLwotCTAsCQkJCS8qdHBfc2V0YXR0ciovCi0JMCwJCQkJLyp0cF9jb21wYXJlKi8KLQkwLAkJCQkvKnRwX3JlcHIqLwotCSZzcF9oYW5kbGVfYXNfbnVtYmVyLAkJLyp0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkvKnRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJLyp0cF9hc19tYXBwaW5nICovCi0JMAkJCQkvKnRwX2hhc2gqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb2Jfc2l6ZSovCisgICAgIl9zdWJwcm9jZXNzX2hhbmRsZSIsIHNpemVvZihzcF9oYW5kbGVfb2JqZWN0KSwgMCwKKyAgICAoZGVzdHJ1Y3Rvcikgc3BfaGFuZGxlX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgMCwgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKSBzcF9oYW5kbGVfZ2V0YXR0ciwvKnRwX2dldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc2V0YXR0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jb21wYXJlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3JlcHIqLworICAgICZzcF9oYW5kbGVfYXNfbnVtYmVyLCAgICAgICAgICAgICAgIC8qdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbWFwcGluZyAqLworICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaGFzaCovCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMTY0LDI2ICsxNjQsMjYgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzcF9HZXRTdGRIYW5kbGUoUHlPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKQogewotCUhBTkRMRSBoYW5kbGU7Ci0JaW50IHN0ZF9oYW5kbGU7CisgICAgSEFORExFIGhhbmRsZTsKKyAgICBpbnQgc3RkX2hhbmRsZTsKIAotCWlmICghIFB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6R2V0U3RkSGFuZGxlIiwgJnN0ZF9oYW5kbGUpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoISBQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOkdldFN0ZEhhbmRsZSIsICZzdGRfaGFuZGxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JaGFuZGxlID0gR2V0U3RkSGFuZGxlKChEV09SRCkgc3RkX2hhbmRsZSk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgaGFuZGxlID0gR2V0U3RkSGFuZGxlKChEV09SRCkgc3RkX2hhbmRsZSk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKIAotCWlmIChoYW5kbGUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpCi0JCXJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0VycihHZXRMYXN0RXJyb3IoKSk7CisgICAgaWYgKGhhbmRsZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkKKyAgICAgICAgcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyKEdldExhc3RFcnJvcigpKTsKIAotCWlmICghIGhhbmRsZSkgewotCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCXJldHVybiBQeV9Ob25lOwotCX0KKyAgICBpZiAoISBoYW5kbGUpIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICB9CiAKLQkvKiBub3RlOiByZXR1cm5zIGludGVnZXIsIG5vdCBoYW5kbGUgb2JqZWN0ICovCi0JcmV0dXJuIEhBTkRMRV9UT19QWU5VTShoYW5kbGUpOworICAgIC8qIG5vdGU6IHJldHVybnMgaW50ZWdlciwgbm90IGhhbmRsZSBvYmplY3QgKi8KKyAgICByZXR1cm4gSEFORExFX1RPX1BZTlVNKGhhbmRsZSk7CiB9CiAKIFB5RG9jX1NUUlZBUihHZXRDdXJyZW50UHJvY2Vzc19kb2MsCkBAIC0xOTQsMTAgKzE5NCwxMCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNwX0dldEN1cnJlbnRQcm9jZXNzKFB5T2JqZWN0KiBzZWxmLCBQeU9iamVjdCogYXJncykKIHsKLQlpZiAoISBQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6R2V0Q3VycmVudFByb2Nlc3MiKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCEgUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOkdldEN1cnJlbnRQcm9jZXNzIikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JcmV0dXJuIHNwX2hhbmRsZV9uZXcoR2V0Q3VycmVudFByb2Nlc3MoKSk7CisgICAgcmV0dXJuIHNwX2hhbmRsZV9uZXcoR2V0Q3VycmVudFByb2Nlc3MoKSk7CiB9CiAKIFB5RG9jX1NUUlZBUihEdXBsaWNhdGVIYW5kbGVfZG9jLApAQCAtMjE0LDQzICsyMTQsNDMgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzcF9EdXBsaWNhdGVIYW5kbGUoUHlPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKQogewotCUhBTkRMRSB0YXJnZXRfaGFuZGxlOwotCUJPT0wgcmVzdWx0OworICAgIEhBTkRMRSB0YXJnZXRfaGFuZGxlOworICAgIEJPT0wgcmVzdWx0OwogCi0JSEFORExFIHNvdXJjZV9wcm9jZXNzX2hhbmRsZTsKLQlIQU5ETEUgc291cmNlX2hhbmRsZTsKLQlIQU5ETEUgdGFyZ2V0X3Byb2Nlc3NfaGFuZGxlOwotCWludCBkZXNpcmVkX2FjY2VzczsKLQlpbnQgaW5oZXJpdF9oYW5kbGU7Ci0JaW50IG9wdGlvbnMgPSAwOworICAgIEhBTkRMRSBzb3VyY2VfcHJvY2Vzc19oYW5kbGU7CisgICAgSEFORExFIHNvdXJjZV9oYW5kbGU7CisgICAgSEFORExFIHRhcmdldF9wcm9jZXNzX2hhbmRsZTsKKyAgICBpbnQgZGVzaXJlZF9hY2Nlc3M7CisgICAgaW50IGluaGVyaXRfaGFuZGxlOworICAgIGludCBvcHRpb25zID0gMDsKIAotCWlmICghIFB5QXJnX1BhcnNlVHVwbGUoYXJncywKLQkJCSAgICAgICBQWV9IQU5ETEVfUEFSQU0gUFlfSEFORExFX1BBUkFNIFBZX0hBTkRMRV9QQVJBTQotCQkJICAgICAgICJpaXxpOkR1cGxpY2F0ZUhhbmRsZSIsCi0JICAgICAgICAgICAgICAgICAgICAgICAmc291cmNlX3Byb2Nlc3NfaGFuZGxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgJnNvdXJjZV9oYW5kbGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAmdGFyZ2V0X3Byb2Nlc3NfaGFuZGxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgJmRlc2lyZWRfYWNjZXNzLAotCSAgICAgICAgICAgICAgICAgICAgICAgJmluaGVyaXRfaGFuZGxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgJm9wdGlvbnMpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoISBQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBQWV9IQU5ETEVfUEFSQU0gUFlfSEFORExFX1BBUkFNIFBZX0hBTkRMRV9QQVJBTQorICAgICAgICAgICAgICAgICAgICAgICAgICAgImlpfGk6RHVwbGljYXRlSGFuZGxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZzb3VyY2VfcHJvY2Vzc19oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmc291cmNlX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0YXJnZXRfcHJvY2Vzc19oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVzaXJlZF9hY2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5oZXJpdF9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3B0aW9ucykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCXJlc3VsdCA9IER1cGxpY2F0ZUhhbmRsZSgKLQkJc291cmNlX3Byb2Nlc3NfaGFuZGxlLAotCQlzb3VyY2VfaGFuZGxlLAotCQl0YXJnZXRfcHJvY2Vzc19oYW5kbGUsCi0JCSZ0YXJnZXRfaGFuZGxlLAotCQlkZXNpcmVkX2FjY2VzcywKLQkJaW5oZXJpdF9oYW5kbGUsCi0JCW9wdGlvbnMKLQkpOwotCVB5X0VORF9BTExPV19USFJFQURTCisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIHJlc3VsdCA9IER1cGxpY2F0ZUhhbmRsZSgKKyAgICAgICAgc291cmNlX3Byb2Nlc3NfaGFuZGxlLAorICAgICAgICBzb3VyY2VfaGFuZGxlLAorICAgICAgICB0YXJnZXRfcHJvY2Vzc19oYW5kbGUsCisgICAgICAgICZ0YXJnZXRfaGFuZGxlLAorICAgICAgICBkZXNpcmVkX2FjY2VzcywKKyAgICAgICAgaW5oZXJpdF9oYW5kbGUsCisgICAgICAgIG9wdGlvbnMKKyAgICApOworICAgIFB5X0VORF9BTExPV19USFJFQURTCiAKLQlpZiAoISByZXN1bHQpCi0JCXJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0VycihHZXRMYXN0RXJyb3IoKSk7CisgICAgaWYgKCEgcmVzdWx0KQorICAgICAgICByZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnIoR2V0TGFzdEVycm9yKCkpOwogCi0JcmV0dXJuIHNwX2hhbmRsZV9uZXcodGFyZ2V0X2hhbmRsZSk7CisgICAgcmV0dXJuIHNwX2hhbmRsZV9uZXcodGFyZ2V0X2hhbmRsZSk7CiB9CiAKIFB5RG9jX1NUUlZBUihDcmVhdGVQaXBlX2RvYywKQEAgLTI2NCwyNSArMjY0LDI1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3BfQ3JlYXRlUGlwZShQeU9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZ3MpCiB7Ci0JSEFORExFIHJlYWRfcGlwZTsKLQlIQU5ETEUgd3JpdGVfcGlwZTsKLQlCT09MIHJlc3VsdDsKKyAgICBIQU5ETEUgcmVhZF9waXBlOworICAgIEhBTkRMRSB3cml0ZV9waXBlOworICAgIEJPT0wgcmVzdWx0OwogCi0JUHlPYmplY3QqIHBpcGVfYXR0cmlidXRlczsgLyogaWdub3JlZCAqLwotCWludCBzaXplOworICAgIFB5T2JqZWN0KiBwaXBlX2F0dHJpYnV0ZXM7IC8qIGlnbm9yZWQgKi8KKyAgICBpbnQgc2l6ZTsKIAotCWlmICghIFB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9pOkNyZWF0ZVBpcGUiLCAmcGlwZV9hdHRyaWJ1dGVzLCAmc2l6ZSkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghIFB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9pOkNyZWF0ZVBpcGUiLCAmcGlwZV9hdHRyaWJ1dGVzLCAmc2l6ZSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCXJlc3VsdCA9IENyZWF0ZVBpcGUoJnJlYWRfcGlwZSwgJndyaXRlX3BpcGUsIE5VTEwsIHNpemUpOwotCVB5X0VORF9BTExPV19USFJFQURTCisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIHJlc3VsdCA9IENyZWF0ZVBpcGUoJnJlYWRfcGlwZSwgJndyaXRlX3BpcGUsIE5VTEwsIHNpemUpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCiAKLQlpZiAoISByZXN1bHQpCi0JCXJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0VycihHZXRMYXN0RXJyb3IoKSk7CisgICAgaWYgKCEgcmVzdWx0KQorICAgICAgICByZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnIoR2V0TGFzdEVycm9yKCkpOwogCi0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoCi0JCSJOTiIsIHNwX2hhbmRsZV9uZXcocmVhZF9waXBlKSwgc3BfaGFuZGxlX25ldyh3cml0ZV9waXBlKSk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoCisgICAgICAgICJOTiIsIHNwX2hhbmRsZV9uZXcocmVhZF9waXBlKSwgc3BfaGFuZGxlX25ldyh3cml0ZV9waXBlKSk7CiB9CiAKIC8qIGhlbHBlcnMgZm9yIGNyZWF0ZXByb2Nlc3MgKi8KQEAgLTI5MCwxMTAgKzI5MCwxMTAgQEAKIHN0YXRpYyBpbnQKIGdldGludChQeU9iamVjdCogb2JqLCBjaGFyKiBuYW1lKQogewotCVB5T2JqZWN0KiB2YWx1ZTsKLQlpbnQgcmV0OworICAgIFB5T2JqZWN0KiB2YWx1ZTsKKyAgICBpbnQgcmV0OwogCi0JdmFsdWUgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKG9iaiwgbmFtZSk7Ci0JaWYgKCEgdmFsdWUpIHsKLQkJUHlFcnJfQ2xlYXIoKTsgLyogRklYTUU6IHByb3BhZ2F0ZSBlcnJvcj8gKi8KLQkJcmV0dXJuIDA7Ci0JfQotCXJldCA9IChpbnQpIFB5SW50X0FzTG9uZyh2YWx1ZSk7Ci0JUHlfREVDUkVGKHZhbHVlKTsKLQlyZXR1cm4gcmV0OworICAgIHZhbHVlID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhvYmosIG5hbWUpOworICAgIGlmICghIHZhbHVlKSB7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7IC8qIEZJWE1FOiBwcm9wYWdhdGUgZXJyb3I/ICovCisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXQgPSAoaW50KSBQeUludF9Bc0xvbmcodmFsdWUpOworICAgIFB5X0RFQ1JFRih2YWx1ZSk7CisgICAgcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIEhBTkRMRQogZ2V0aGFuZGxlKFB5T2JqZWN0KiBvYmosIGNoYXIqIG5hbWUpCiB7Ci0Jc3BfaGFuZGxlX29iamVjdCogdmFsdWU7Ci0JSEFORExFIHJldDsKKyAgICBzcF9oYW5kbGVfb2JqZWN0KiB2YWx1ZTsKKyAgICBIQU5ETEUgcmV0OwogCi0JdmFsdWUgPSAoc3BfaGFuZGxlX29iamVjdCopIFB5T2JqZWN0X0dldEF0dHJTdHJpbmcob2JqLCBuYW1lKTsKLQlpZiAoISB2YWx1ZSkgewotCQlQeUVycl9DbGVhcigpOyAvKiBGSVhNRTogcHJvcGFnYXRlIGVycm9yPyAqLwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKHZhbHVlLT5vYl90eXBlICE9ICZzcF9oYW5kbGVfdHlwZSkKLQkJcmV0ID0gTlVMTDsKLQllbHNlCi0JCXJldCA9IHZhbHVlLT5oYW5kbGU7Ci0JUHlfREVDUkVGKHZhbHVlKTsKLQlyZXR1cm4gcmV0OworICAgIHZhbHVlID0gKHNwX2hhbmRsZV9vYmplY3QqKSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKG9iaiwgbmFtZSk7CisgICAgaWYgKCEgdmFsdWUpIHsKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsgLyogRklYTUU6IHByb3BhZ2F0ZSBlcnJvcj8gKi8KKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmICh2YWx1ZS0+b2JfdHlwZSAhPSAmc3BfaGFuZGxlX3R5cGUpCisgICAgICAgIHJldCA9IE5VTEw7CisgICAgZWxzZQorICAgICAgICByZXQgPSB2YWx1ZS0+aGFuZGxlOworICAgIFB5X0RFQ1JFRih2YWx1ZSk7CisgICAgcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIFB5T2JqZWN0KgogZ2V0ZW52aXJvbm1lbnQoUHlPYmplY3QqIGVudmlyb25tZW50KQogewotCWludCBpLCBlbnZzaXplOwotCVB5T2JqZWN0KiBvdXQgPSBOVUxMOwotCVB5T2JqZWN0KiBrZXlzOwotCVB5T2JqZWN0KiB2YWx1ZXM7Ci0JY2hhciogcDsKKyAgICBpbnQgaSwgZW52c2l6ZTsKKyAgICBQeU9iamVjdCogb3V0ID0gTlVMTDsKKyAgICBQeU9iamVjdCoga2V5czsKKyAgICBQeU9iamVjdCogdmFsdWVzOworICAgIGNoYXIqIHA7CiAKLQkvKiBjb252ZXJ0IGVudmlyb25tZW50IGRpY3Rpb25hcnkgdG8gd2luZG93cyBlbnZpcm9tZW50IHN0cmluZyAqLwotCWlmICghIFB5TWFwcGluZ19DaGVjayhlbnZpcm9ubWVudCkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKAotCQkgICAgUHlFeGNfVHlwZUVycm9yLCAiZW52aXJvbm1lbnQgbXVzdCBiZSBkaWN0aW9uYXJ5IG9yIE5vbmUiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIC8qIGNvbnZlcnQgZW52aXJvbm1lbnQgZGljdGlvbmFyeSB0byB3aW5kb3dzIGVudmlyb21lbnQgc3RyaW5nICovCisgICAgaWYgKCEgUHlNYXBwaW5nX0NoZWNrKGVudmlyb25tZW50KSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoCisgICAgICAgICAgICBQeUV4Y19UeXBlRXJyb3IsICJlbnZpcm9ubWVudCBtdXN0IGJlIGRpY3Rpb25hcnkgb3IgTm9uZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQllbnZzaXplID0gUHlNYXBwaW5nX0xlbmd0aChlbnZpcm9ubWVudCk7CisgICAgZW52c2l6ZSA9IFB5TWFwcGluZ19MZW5ndGgoZW52aXJvbm1lbnQpOwogCi0Ja2V5cyA9IFB5TWFwcGluZ19LZXlzKGVudmlyb25tZW50KTsKLQl2YWx1ZXMgPSBQeU1hcHBpbmdfVmFsdWVzKGVudmlyb25tZW50KTsKLQlpZiAoIWtleXMgfHwgIXZhbHVlcykKLQkJZ290byBlcnJvcjsKKyAgICBrZXlzID0gUHlNYXBwaW5nX0tleXMoZW52aXJvbm1lbnQpOworICAgIHZhbHVlcyA9IFB5TWFwcGluZ19WYWx1ZXMoZW52aXJvbm1lbnQpOworICAgIGlmICgha2V5cyB8fCAhdmFsdWVzKQorICAgICAgICBnb3RvIGVycm9yOwogCi0Jb3V0ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgMjA0OCk7Ci0JaWYgKCEgb3V0KQotCQlnb3RvIGVycm9yOworICAgIG91dCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIDIwNDgpOworICAgIGlmICghIG91dCkKKyAgICAgICAgZ290byBlcnJvcjsKIAotCXAgPSBQeVN0cmluZ19BU19TVFJJTkcob3V0KTsKKyAgICBwID0gUHlTdHJpbmdfQVNfU1RSSU5HKG91dCk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgZW52c2l6ZTsgaSsrKSB7Ci0JCWludCBrc2l6ZSwgdnNpemUsIHRvdGFsc2l6ZTsKLQkJUHlPYmplY3QqIGtleSA9IFB5TGlzdF9HRVRfSVRFTShrZXlzLCBpKTsKLQkJUHlPYmplY3QqIHZhbHVlID0gUHlMaXN0X0dFVF9JVEVNKHZhbHVlcywgaSk7CisgICAgZm9yIChpID0gMDsgaSA8IGVudnNpemU7IGkrKykgeworICAgICAgICBpbnQga3NpemUsIHZzaXplLCB0b3RhbHNpemU7CisgICAgICAgIFB5T2JqZWN0KiBrZXkgPSBQeUxpc3RfR0VUX0lURU0oa2V5cywgaSk7CisgICAgICAgIFB5T2JqZWN0KiB2YWx1ZSA9IFB5TGlzdF9HRVRfSVRFTSh2YWx1ZXMsIGkpOwogCi0JCWlmICghIFB5U3RyaW5nX0NoZWNrKGtleSkgfHwgISBQeVN0cmluZ19DaGVjayh2YWx1ZSkpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJImVudmlyb25tZW50IGNhbiBvbmx5IGNvbnRhaW4gc3RyaW5ncyIpOwotCQkJZ290byBlcnJvcjsKLQkJfQotCQlrc2l6ZSA9IFB5U3RyaW5nX0dFVF9TSVpFKGtleSk7Ci0JCXZzaXplID0gUHlTdHJpbmdfR0VUX1NJWkUodmFsdWUpOwotCQl0b3RhbHNpemUgPSAocCAtIFB5U3RyaW5nX0FTX1NUUklORyhvdXQpKSArIGtzaXplICsgMSArCi0JCQkJCQkJICAgICB2c2l6ZSArIDEgKyAxOwotCQlpZiAodG90YWxzaXplID4gUHlTdHJpbmdfR0VUX1NJWkUob3V0KSkgewotCQkJaW50IG9mZnNldCA9IHAgLSBQeVN0cmluZ19BU19TVFJJTkcob3V0KTsKLQkJCV9QeVN0cmluZ19SZXNpemUoJm91dCwgdG90YWxzaXplICsgMTAyNCk7Ci0JCQlwID0gUHlTdHJpbmdfQVNfU1RSSU5HKG91dCkgKyBvZmZzZXQ7Ci0JCX0KLQkJbWVtY3B5KHAsIFB5U3RyaW5nX0FTX1NUUklORyhrZXkpLCBrc2l6ZSk7Ci0JCXAgKz0ga3NpemU7Ci0JCSpwKysgPSAnPSc7Ci0JCW1lbWNweShwLCBQeVN0cmluZ19BU19TVFJJTkcodmFsdWUpLCB2c2l6ZSk7Ci0JCXAgKz0gdnNpemU7Ci0JCSpwKysgPSAnXDAnOwotCX0KKyAgICAgICAgaWYgKCEgUHlTdHJpbmdfQ2hlY2soa2V5KSB8fCAhIFB5U3RyaW5nX0NoZWNrKHZhbHVlKSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAiZW52aXJvbm1lbnQgY2FuIG9ubHkgY29udGFpbiBzdHJpbmdzIik7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgICAgIGtzaXplID0gUHlTdHJpbmdfR0VUX1NJWkUoa2V5KTsKKyAgICAgICAgdnNpemUgPSBQeVN0cmluZ19HRVRfU0laRSh2YWx1ZSk7CisgICAgICAgIHRvdGFsc2l6ZSA9IChwIC0gUHlTdHJpbmdfQVNfU1RSSU5HKG91dCkpICsga3NpemUgKyAxICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnNpemUgKyAxICsgMTsKKyAgICAgICAgaWYgKHRvdGFsc2l6ZSA+IFB5U3RyaW5nX0dFVF9TSVpFKG91dCkpIHsKKyAgICAgICAgICAgIGludCBvZmZzZXQgPSBwIC0gUHlTdHJpbmdfQVNfU1RSSU5HKG91dCk7CisgICAgICAgICAgICBfUHlTdHJpbmdfUmVzaXplKCZvdXQsIHRvdGFsc2l6ZSArIDEwMjQpOworICAgICAgICAgICAgcCA9IFB5U3RyaW5nX0FTX1NUUklORyhvdXQpICsgb2Zmc2V0OworICAgICAgICB9CisgICAgICAgIG1lbWNweShwLCBQeVN0cmluZ19BU19TVFJJTkcoa2V5KSwga3NpemUpOworICAgICAgICBwICs9IGtzaXplOworICAgICAgICAqcCsrID0gJz0nOworICAgICAgICBtZW1jcHkocCwgUHlTdHJpbmdfQVNfU1RSSU5HKHZhbHVlKSwgdnNpemUpOworICAgICAgICBwICs9IHZzaXplOworICAgICAgICAqcCsrID0gJ1wwJzsKKyAgICB9CiAKLQkvKiBhZGQgdHJhaWxpbmcgbnVsbCBieXRlICovCi0JKnArKyA9ICdcMCc7Ci0JX1B5U3RyaW5nX1Jlc2l6ZSgmb3V0LCBwIC0gUHlTdHJpbmdfQVNfU1RSSU5HKG91dCkpOworICAgIC8qIGFkZCB0cmFpbGluZyBudWxsIGJ5dGUgKi8KKyAgICAqcCsrID0gJ1wwJzsKKyAgICBfUHlTdHJpbmdfUmVzaXplKCZvdXQsIHAgLSBQeVN0cmluZ19BU19TVFJJTkcob3V0KSk7CiAKLQkvKiBQeU9iamVjdF9QcmludChvdXQsIHN0ZG91dCwgMCk7ICovCisgICAgLyogUHlPYmplY3RfUHJpbnQob3V0LCBzdGRvdXQsIDApOyAqLwogCi0JUHlfWERFQ1JFRihrZXlzKTsKLQlQeV9YREVDUkVGKHZhbHVlcyk7CisgICAgUHlfWERFQ1JFRihrZXlzKTsKKyAgICBQeV9YREVDUkVGKHZhbHVlcyk7CiAKLQlyZXR1cm4gb3V0OworICAgIHJldHVybiBvdXQ7CiAKICBlcnJvcjoKLQlQeV9YREVDUkVGKG91dCk7Ci0JUHlfWERFQ1JFRihrZXlzKTsKLQlQeV9YREVDUkVGKHZhbHVlcyk7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlfWERFQ1JFRihvdXQpOworICAgIFB5X1hERUNSRUYoa2V5cyk7CisgICAgUHlfWERFQ1JFRih2YWx1ZXMpOworICAgIHJldHVybiBOVUxMOwogfQogCiBQeURvY19TVFJWQVIoQ3JlYXRlUHJvY2Vzc19kb2MsCkBAIC00MTEsNzcgKzQxMSw3NyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNwX0NyZWF0ZVByb2Nlc3MoUHlPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKQogewotCUJPT0wgcmVzdWx0OwotCVBST0NFU1NfSU5GT1JNQVRJT04gcGk7Ci0JU1RBUlRVUElORk8gc2k7Ci0JUHlPYmplY3QqIGVudmlyb25tZW50OworICAgIEJPT0wgcmVzdWx0OworICAgIFBST0NFU1NfSU5GT1JNQVRJT04gcGk7CisgICAgU1RBUlRVUElORk8gc2k7CisgICAgUHlPYmplY3QqIGVudmlyb25tZW50OwogCi0JY2hhciogYXBwbGljYXRpb25fbmFtZTsKLQljaGFyKiBjb21tYW5kX2xpbmU7Ci0JUHlPYmplY3QqIHByb2Nlc3NfYXR0cmlidXRlczsgLyogaWdub3JlZCAqLwotCVB5T2JqZWN0KiB0aHJlYWRfYXR0cmlidXRlczsgLyogaWdub3JlZCAqLwotCWludCBpbmhlcml0X2hhbmRsZXM7Ci0JaW50IGNyZWF0aW9uX2ZsYWdzOwotCVB5T2JqZWN0KiBlbnZfbWFwcGluZzsKLQljaGFyKiBjdXJyZW50X2RpcmVjdG9yeTsKLQlQeU9iamVjdCogc3RhcnR1cF9pbmZvOworICAgIGNoYXIqIGFwcGxpY2F0aW9uX25hbWU7CisgICAgY2hhciogY29tbWFuZF9saW5lOworICAgIFB5T2JqZWN0KiBwcm9jZXNzX2F0dHJpYnV0ZXM7IC8qIGlnbm9yZWQgKi8KKyAgICBQeU9iamVjdCogdGhyZWFkX2F0dHJpYnV0ZXM7IC8qIGlnbm9yZWQgKi8KKyAgICBpbnQgaW5oZXJpdF9oYW5kbGVzOworICAgIGludCBjcmVhdGlvbl9mbGFnczsKKyAgICBQeU9iamVjdCogZW52X21hcHBpbmc7CisgICAgY2hhciogY3VycmVudF9kaXJlY3Rvcnk7CisgICAgUHlPYmplY3QqIHN0YXJ0dXBfaW5mbzsKIAotCWlmICghIFB5QXJnX1BhcnNlVHVwbGUoYXJncywgInp6T09paU96TzpDcmVhdGVQcm9jZXNzIiwKLQkJCSAgICAgICAmYXBwbGljYXRpb25fbmFtZSwKLQkJCSAgICAgICAmY29tbWFuZF9saW5lLAotCQkJICAgICAgICZwcm9jZXNzX2F0dHJpYnV0ZXMsCi0JCQkgICAgICAgJnRocmVhZF9hdHRyaWJ1dGVzLAotCQkJICAgICAgICZpbmhlcml0X2hhbmRsZXMsCi0JCQkgICAgICAgJmNyZWF0aW9uX2ZsYWdzLAotCQkJICAgICAgICZlbnZfbWFwcGluZywKLQkJCSAgICAgICAmY3VycmVudF9kaXJlY3RvcnksCi0JCQkgICAgICAgJnN0YXJ0dXBfaW5mbykpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghIFB5QXJnX1BhcnNlVHVwbGUoYXJncywgInp6T09paU96TzpDcmVhdGVQcm9jZXNzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZhcHBsaWNhdGlvbl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbW1hbmRfbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcm9jZXNzX2F0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhyZWFkX2F0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5oZXJpdF9oYW5kbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNyZWF0aW9uX2ZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVudl9tYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmN1cnJlbnRfZGlyZWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0dXBfaW5mbykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JWmVyb01lbW9yeSgmc2ksIHNpemVvZihzaSkpOwotCXNpLmNiID0gc2l6ZW9mKHNpKTsKKyAgICBaZXJvTWVtb3J5KCZzaSwgc2l6ZW9mKHNpKSk7CisgICAgc2kuY2IgPSBzaXplb2Yoc2kpOwogCi0JLyogbm90ZTogd2Ugb25seSBzdXBwb3J0IGEgc21hbGwgc3Vic2V0IG9mIGFsbCBTSSBhdHRyaWJ1dGVzICovCi0Jc2kuZHdGbGFncyA9IGdldGludChzdGFydHVwX2luZm8sICJkd0ZsYWdzIik7Ci0Jc2kud1Nob3dXaW5kb3cgPSBnZXRpbnQoc3RhcnR1cF9pbmZvLCAid1Nob3dXaW5kb3ciKTsKLQlzaS5oU3RkSW5wdXQgPSBnZXRoYW5kbGUoc3RhcnR1cF9pbmZvLCAiaFN0ZElucHV0Iik7Ci0Jc2kuaFN0ZE91dHB1dCA9IGdldGhhbmRsZShzdGFydHVwX2luZm8sICJoU3RkT3V0cHV0Iik7Ci0Jc2kuaFN0ZEVycm9yID0gZ2V0aGFuZGxlKHN0YXJ0dXBfaW5mbywgImhTdGRFcnJvciIpOworICAgIC8qIG5vdGU6IHdlIG9ubHkgc3VwcG9ydCBhIHNtYWxsIHN1YnNldCBvZiBhbGwgU0kgYXR0cmlidXRlcyAqLworICAgIHNpLmR3RmxhZ3MgPSBnZXRpbnQoc3RhcnR1cF9pbmZvLCAiZHdGbGFncyIpOworICAgIHNpLndTaG93V2luZG93ID0gZ2V0aW50KHN0YXJ0dXBfaW5mbywgIndTaG93V2luZG93Iik7CisgICAgc2kuaFN0ZElucHV0ID0gZ2V0aGFuZGxlKHN0YXJ0dXBfaW5mbywgImhTdGRJbnB1dCIpOworICAgIHNpLmhTdGRPdXRwdXQgPSBnZXRoYW5kbGUoc3RhcnR1cF9pbmZvLCAiaFN0ZE91dHB1dCIpOworICAgIHNpLmhTdGRFcnJvciA9IGdldGhhbmRsZShzdGFydHVwX2luZm8sICJoU3RkRXJyb3IiKTsKIAotCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoZW52X21hcHBpbmcgPT0gUHlfTm9uZSkKLQkJZW52aXJvbm1lbnQgPSBOVUxMOwotCWVsc2UgewotCQllbnZpcm9ubWVudCA9IGdldGVudmlyb25tZW50KGVudl9tYXBwaW5nKTsKLQkJaWYgKCEgZW52aXJvbm1lbnQpCi0JCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKGVudl9tYXBwaW5nID09IFB5X05vbmUpCisgICAgICAgIGVudmlyb25tZW50ID0gTlVMTDsKKyAgICBlbHNlIHsKKyAgICAgICAgZW52aXJvbm1lbnQgPSBnZXRlbnZpcm9ubWVudChlbnZfbWFwcGluZyk7CisgICAgICAgIGlmICghIGVudmlyb25tZW50KQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCXJlc3VsdCA9IENyZWF0ZVByb2Nlc3MoYXBwbGljYXRpb25fbmFtZSwKLQkJCSAgICAgICBjb21tYW5kX2xpbmUsCi0JCQkgICAgICAgTlVMTCwKLQkJCSAgICAgICBOVUxMLAotCQkJICAgICAgIGluaGVyaXRfaGFuZGxlcywKLQkJCSAgICAgICBjcmVhdGlvbl9mbGFncywKLQkJCSAgICAgICBlbnZpcm9ubWVudCA/IFB5U3RyaW5nX0FTX1NUUklORyhlbnZpcm9ubWVudCkgOiBOVUxMLAotCQkJICAgICAgIGN1cnJlbnRfZGlyZWN0b3J5LAotCQkJICAgICAgICZzaSwKLQkJCSAgICAgICAmcGkpOwotCVB5X0VORF9BTExPV19USFJFQURTCisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIHJlc3VsdCA9IENyZWF0ZVByb2Nlc3MoYXBwbGljYXRpb25fbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRfbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5oZXJpdF9oYW5kbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRpb25fZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudCA/IFB5U3RyaW5nX0FTX1NUUklORyhlbnZpcm9ubWVudCkgOiBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9kaXJlY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGkpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCiAKLQlQeV9YREVDUkVGKGVudmlyb25tZW50KTsKKyAgICBQeV9YREVDUkVGKGVudmlyb25tZW50KTsKIAotCWlmICghIHJlc3VsdCkKLQkJcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyKEdldExhc3RFcnJvcigpKTsKKyAgICBpZiAoISByZXN1bHQpCisgICAgICAgIHJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0VycihHZXRMYXN0RXJyb3IoKSk7CiAKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTk5paSIsCi0JCQkgICAgIHNwX2hhbmRsZV9uZXcocGkuaFByb2Nlc3MpLAotCQkJICAgICBzcF9oYW5kbGVfbmV3KHBpLmhUaHJlYWQpLAotCQkJICAgICBwaS5kd1Byb2Nlc3NJZCwKLQkJCSAgICAgcGkuZHdUaHJlYWRJZCk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk5OaWkiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNwX2hhbmRsZV9uZXcocGkuaFByb2Nlc3MpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNwX2hhbmRsZV9uZXcocGkuaFRocmVhZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgcGkuZHdQcm9jZXNzSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgcGkuZHdUaHJlYWRJZCk7CiB9CiAKIFB5RG9jX1NUUlZBUihUZXJtaW5hdGVQcm9jZXNzX2RvYywKQEAgLTQ5MiwyMSArNDkyLDIxIEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3BfVGVybWluYXRlUHJvY2VzcyhQeU9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZ3MpCiB7Ci0JQk9PTCByZXN1bHQ7CisgICAgQk9PTCByZXN1bHQ7CiAKLQlIQU5ETEUgcHJvY2VzczsKLQlpbnQgZXhpdF9jb2RlOwotCWlmICghIFB5QXJnX1BhcnNlVHVwbGUoYXJncywgUFlfSEFORExFX1BBUkFNICJpOlRlcm1pbmF0ZVByb2Nlc3MiLAotCQkJICAgICAgICZwcm9jZXNzLCAmZXhpdF9jb2RlKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgSEFORExFIHByb2Nlc3M7CisgICAgaW50IGV4aXRfY29kZTsKKyAgICBpZiAoISBQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsIFBZX0hBTkRMRV9QQVJBTSAiaTpUZXJtaW5hdGVQcm9jZXNzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcm9jZXNzLCAmZXhpdF9jb2RlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlyZXN1bHQgPSBUZXJtaW5hdGVQcm9jZXNzKHByb2Nlc3MsIGV4aXRfY29kZSk7CisgICAgcmVzdWx0ID0gVGVybWluYXRlUHJvY2Vzcyhwcm9jZXNzLCBleGl0X2NvZGUpOwogCi0JaWYgKCEgcmVzdWx0KQotCQlyZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnIoR2V0TGFzdEVycm9yKCkpOworICAgIGlmICghIHJlc3VsdCkKKyAgICAgICAgcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyKEdldExhc3RFcnJvcigpKTsKIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIFB5RG9jX1NUUlZBUihHZXRFeGl0Q29kZVByb2Nlc3NfZG9jLApAQCAtNTE3LDE5ICs1MTcsMTkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzcF9HZXRFeGl0Q29kZVByb2Nlc3MoUHlPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKQogewotCURXT1JEIGV4aXRfY29kZTsKLQlCT09MIHJlc3VsdDsKKyAgICBEV09SRCBleGl0X2NvZGU7CisgICAgQk9PTCByZXN1bHQ7CiAKLQlIQU5ETEUgcHJvY2VzczsKLQlpZiAoISBQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsIFBZX0hBTkRMRV9QQVJBTSAiOkdldEV4aXRDb2RlUHJvY2VzcyIsICZwcm9jZXNzKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgSEFORExFIHByb2Nlc3M7CisgICAgaWYgKCEgUHlBcmdfUGFyc2VUdXBsZShhcmdzLCBQWV9IQU5ETEVfUEFSQU0gIjpHZXRFeGl0Q29kZVByb2Nlc3MiLCAmcHJvY2VzcykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JcmVzdWx0ID0gR2V0RXhpdENvZGVQcm9jZXNzKHByb2Nlc3MsICZleGl0X2NvZGUpOworICAgIHJlc3VsdCA9IEdldEV4aXRDb2RlUHJvY2Vzcyhwcm9jZXNzLCAmZXhpdF9jb2RlKTsKIAotCWlmICghIHJlc3VsdCkKLQkJcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyKEdldExhc3RFcnJvcigpKTsKKyAgICBpZiAoISByZXN1bHQpCisgICAgICAgIHJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0VycihHZXRMYXN0RXJyb3IoKSk7CiAKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoZXhpdF9jb2RlKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoZXhpdF9jb2RlKTsKIH0KIAogUHlEb2NfU1RSVkFSKFdhaXRGb3JTaW5nbGVPYmplY3RfZG9jLApAQCAtNTQyLDIzICs1NDIsMjMgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzcF9XYWl0Rm9yU2luZ2xlT2JqZWN0KFB5T2JqZWN0KiBzZWxmLCBQeU9iamVjdCogYXJncykKIHsKLQlEV09SRCByZXN1bHQ7CisgICAgRFdPUkQgcmVzdWx0OwogCi0JSEFORExFIGhhbmRsZTsKLQlpbnQgbWlsbGlzZWNvbmRzOwotCWlmICghIFB5QXJnX1BhcnNlVHVwbGUoYXJncywgUFlfSEFORExFX1BBUkFNICJpOldhaXRGb3JTaW5nbGVPYmplY3QiLAotCSAgICAgICAgICAgICAgICAgIAkgICAgICZoYW5kbGUsCi0JICAgICAgICAgICAgICAgICAgCSAgICAgJm1pbGxpc2Vjb25kcykpCi0JCXJldHVybiBOVUxMOworICAgIEhBTkRMRSBoYW5kbGU7CisgICAgaW50IG1pbGxpc2Vjb25kczsKKyAgICBpZiAoISBQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsIFBZX0hBTkRMRV9QQVJBTSAiaTpXYWl0Rm9yU2luZ2xlT2JqZWN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWlsbGlzZWNvbmRzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JcmVzdWx0ID0gV2FpdEZvclNpbmdsZU9iamVjdChoYW5kbGUsIChEV09SRCkgbWlsbGlzZWNvbmRzKTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICByZXN1bHQgPSBXYWl0Rm9yU2luZ2xlT2JqZWN0KGhhbmRsZSwgKERXT1JEKSBtaWxsaXNlY29uZHMpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCiAKLQlpZiAocmVzdWx0ID09IFdBSVRfRkFJTEVEKQotCQlyZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnIoR2V0TGFzdEVycm9yKCkpOworICAgIGlmIChyZXN1bHQgPT0gV0FJVF9GQUlMRUQpCisgICAgICAgIHJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0VycihHZXRMYXN0RXJyb3IoKSk7CiAKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGludCkgcmVzdWx0KTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGludCkgcmVzdWx0KTsKIH0KIAogUHlEb2NfU1RSVkFSKEdldFZlcnNpb25fZG9jLApAQCAtNTY5LDEwICs1NjksMTAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzcF9HZXRWZXJzaW9uKFB5T2JqZWN0KiBzZWxmLCBQeU9iamVjdCogYXJncykKIHsKLQlpZiAoISBQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6R2V0VmVyc2lvbiIpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoISBQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6R2V0VmVyc2lvbiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXJldHVybiBQeUludF9Gcm9tTG9uZygoaW50KSBHZXRWZXJzaW9uKCkpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygoaW50KSBHZXRWZXJzaW9uKCkpOwogfQogCiBQeURvY19TVFJWQVIoR2V0TW9kdWxlRmlsZU5hbWVfZG9jLApAQCAtNTkwLDQxICs1OTAsNDEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzcF9HZXRNb2R1bGVGaWxlTmFtZShQeU9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZ3MpCiB7Ci0JQk9PTCByZXN1bHQ7Ci0JSE1PRFVMRSBtb2R1bGU7Ci0JVENIQVIgZmlsZW5hbWVbTUFYX1BBVEhdOworICAgIEJPT0wgcmVzdWx0OworICAgIEhNT0RVTEUgbW9kdWxlOworICAgIFRDSEFSIGZpbGVuYW1lW01BWF9QQVRIXTsKIAotCWlmICghIFB5QXJnX1BhcnNlVHVwbGUoYXJncywgUFlfSEFORExFX1BBUkFNICI6R2V0TW9kdWxlRmlsZU5hbWUiLAotCQkJICAgICAgICZtb2R1bGUpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoISBQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsIFBZX0hBTkRMRV9QQVJBTSAiOkdldE1vZHVsZUZpbGVOYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZtb2R1bGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXJlc3VsdCA9IEdldE1vZHVsZUZpbGVOYW1lKG1vZHVsZSwgZmlsZW5hbWUsIE1BWF9QQVRIKTsKLQlmaWxlbmFtZVtNQVhfUEFUSC0xXSA9ICdcMCc7CisgICAgcmVzdWx0ID0gR2V0TW9kdWxlRmlsZU5hbWUobW9kdWxlLCBmaWxlbmFtZSwgTUFYX1BBVEgpOworICAgIGZpbGVuYW1lW01BWF9QQVRILTFdID0gJ1wwJzsKIAotCWlmICghIHJlc3VsdCkKLQkJcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyKEdldExhc3RFcnJvcigpKTsKKyAgICBpZiAoISByZXN1bHQpCisgICAgICAgIHJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0VycihHZXRMYXN0RXJyb3IoKSk7CiAKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhmaWxlbmFtZSk7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoZmlsZW5hbWUpOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgc3BfZnVuY3Rpb25zW10gPSB7Ci0JeyJHZXRTdGRIYW5kbGUiLCBzcF9HZXRTdGRIYW5kbGUsIE1FVEhfVkFSQVJHUywgR2V0U3RkSGFuZGxlX2RvY30sCi0JeyJHZXRDdXJyZW50UHJvY2VzcyIsIHNwX0dldEN1cnJlbnRQcm9jZXNzLAlNRVRIX1ZBUkFSR1MsIAotCQkJCQkJICBHZXRDdXJyZW50UHJvY2Vzc19kb2N9LAotCXsiRHVwbGljYXRlSGFuZGxlIiwJc3BfRHVwbGljYXRlSGFuZGxlLAlNRVRIX1ZBUkFSR1MsIAotCQkJCQkJRHVwbGljYXRlSGFuZGxlX2RvY30sCi0JeyJDcmVhdGVQaXBlIiwgc3BfQ3JlYXRlUGlwZSwgTUVUSF9WQVJBUkdTLCBDcmVhdGVQaXBlX2RvY30sCi0JeyJDcmVhdGVQcm9jZXNzIiwgc3BfQ3JlYXRlUHJvY2VzcywgTUVUSF9WQVJBUkdTLCBDcmVhdGVQcm9jZXNzX2RvY30sCi0JeyJUZXJtaW5hdGVQcm9jZXNzIiwgc3BfVGVybWluYXRlUHJvY2VzcywgTUVUSF9WQVJBUkdTLAotCQkJCQkJIFRlcm1pbmF0ZVByb2Nlc3NfZG9jfSwKLQl7IkdldEV4aXRDb2RlUHJvY2VzcyIsIHNwX0dldEV4aXRDb2RlUHJvY2VzcywgTUVUSF9WQVJBUkdTLAotCQkJCQkJICAgR2V0RXhpdENvZGVQcm9jZXNzX2RvY30sCi0JeyJXYWl0Rm9yU2luZ2xlT2JqZWN0Iiwgc3BfV2FpdEZvclNpbmdsZU9iamVjdCwgTUVUSF9WQVJBUkdTLAotCQkJCQkJCVdhaXRGb3JTaW5nbGVPYmplY3RfZG9jfSwKLQl7IkdldFZlcnNpb24iLCBzcF9HZXRWZXJzaW9uLCBNRVRIX1ZBUkFSR1MsIEdldFZlcnNpb25fZG9jfSwKLQl7IkdldE1vZHVsZUZpbGVOYW1lIiwgc3BfR2V0TW9kdWxlRmlsZU5hbWUsIE1FVEhfVkFSQVJHUywKLQkJCQkJCSAgR2V0TW9kdWxlRmlsZU5hbWVfZG9jfSwKLQl7TlVMTCwgTlVMTH0KKyAgICB7IkdldFN0ZEhhbmRsZSIsIHNwX0dldFN0ZEhhbmRsZSwgTUVUSF9WQVJBUkdTLCBHZXRTdGRIYW5kbGVfZG9jfSwKKyAgICB7IkdldEN1cnJlbnRQcm9jZXNzIiwgc3BfR2V0Q3VycmVudFByb2Nlc3MsICAgICAgICAgTUVUSF9WQVJBUkdTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldEN1cnJlbnRQcm9jZXNzX2RvY30sCisgICAgeyJEdXBsaWNhdGVIYW5kbGUiLCAgICAgICAgIHNwX0R1cGxpY2F0ZUhhbmRsZSwgICAgIE1FVEhfVkFSQVJHUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHVwbGljYXRlSGFuZGxlX2RvY30sCisgICAgeyJDcmVhdGVQaXBlIiwgc3BfQ3JlYXRlUGlwZSwgTUVUSF9WQVJBUkdTLCBDcmVhdGVQaXBlX2RvY30sCisgICAgeyJDcmVhdGVQcm9jZXNzIiwgc3BfQ3JlYXRlUHJvY2VzcywgTUVUSF9WQVJBUkdTLCBDcmVhdGVQcm9jZXNzX2RvY30sCisgICAgeyJUZXJtaW5hdGVQcm9jZXNzIiwgc3BfVGVybWluYXRlUHJvY2VzcywgTUVUSF9WQVJBUkdTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVybWluYXRlUHJvY2Vzc19kb2N9LAorICAgIHsiR2V0RXhpdENvZGVQcm9jZXNzIiwgc3BfR2V0RXhpdENvZGVQcm9jZXNzLCBNRVRIX1ZBUkFSR1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldEV4aXRDb2RlUHJvY2Vzc19kb2N9LAorICAgIHsiV2FpdEZvclNpbmdsZU9iamVjdCIsIHNwX1dhaXRGb3JTaW5nbGVPYmplY3QsIE1FVEhfVkFSQVJHUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXYWl0Rm9yU2luZ2xlT2JqZWN0X2RvY30sCisgICAgeyJHZXRWZXJzaW9uIiwgc3BfR2V0VmVyc2lvbiwgTUVUSF9WQVJBUkdTLCBHZXRWZXJzaW9uX2RvY30sCisgICAgeyJHZXRNb2R1bGVGaWxlTmFtZSIsIHNwX0dldE1vZHVsZUZpbGVOYW1lLCBNRVRIX1ZBUkFSR1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0TW9kdWxlRmlsZU5hbWVfZG9jfSwKKyAgICB7TlVMTCwgTlVMTH0KIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC02MzIsMTEgKzYzMiwxMSBAQAogc3RhdGljIHZvaWQKIGRlZmludChQeU9iamVjdCogZCwgY29uc3QgY2hhciogbmFtZSwgaW50IHZhbHVlKQogewotCVB5T2JqZWN0KiB2ID0gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIHZhbHVlKTsKLQlpZiAodikgewotCQlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAoY2hhciopIG5hbWUsIHYpOwotCQlQeV9ERUNSRUYodik7Ci0JfQorICAgIFB5T2JqZWN0KiB2ID0gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIHZhbHVlKTsKKyAgICBpZiAodikgeworICAgICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAoY2hhciopIG5hbWUsIHYpOworICAgICAgICBQeV9ERUNSRUYodik7CisgICAgfQogfQogCiAjaWYgUFlfVkVSU0lPTl9IRVggPj0gMHgwMjAzMDAwMApAQCAtNjQ2LDI3ICs2NDYsMjcgQEAKICNlbmRpZgogaW5pdF9zdWJwcm9jZXNzKCkKIHsKLQlQeU9iamVjdCAqZDsKLQlQeU9iamVjdCAqbTsKKyAgICBQeU9iamVjdCAqZDsKKyAgICBQeU9iamVjdCAqbTsKIAotCS8qIHBhdGNoIHVwIG9iamVjdCBkZXNjcmlwdG9ycyAqLwotCXNwX2hhbmRsZV90eXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7Ci0Jc3BfaGFuZGxlX2FzX251bWJlci5uYl9pbnQgPSAodW5hcnlmdW5jKSBzcF9oYW5kbGVfYXNfaW50OworICAgIC8qIHBhdGNoIHVwIG9iamVjdCBkZXNjcmlwdG9ycyAqLworICAgIHNwX2hhbmRsZV90eXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7CisgICAgc3BfaGFuZGxlX2FzX251bWJlci5uYl9pbnQgPSAodW5hcnlmdW5jKSBzcF9oYW5kbGVfYXNfaW50OwogCi0JbSA9IFB5X0luaXRNb2R1bGUoIl9zdWJwcm9jZXNzIiwgc3BfZnVuY3Rpb25zKTsKLQlpZiAobSA9PSBOVUxMKQotCQlyZXR1cm47Ci0JZCA9IFB5TW9kdWxlX0dldERpY3QobSk7CisgICAgbSA9IFB5X0luaXRNb2R1bGUoIl9zdWJwcm9jZXNzIiwgc3BfZnVuY3Rpb25zKTsKKyAgICBpZiAobSA9PSBOVUxMKQorICAgICAgICByZXR1cm47CisgICAgZCA9IFB5TW9kdWxlX0dldERpY3QobSk7CiAKLQkvKiBjb25zdGFudHMgKi8KLQlkZWZpbnQoZCwgIlNURF9JTlBVVF9IQU5ETEUiLCBTVERfSU5QVVRfSEFORExFKTsKLQlkZWZpbnQoZCwgIlNURF9PVVRQVVRfSEFORExFIiwgU1REX09VVFBVVF9IQU5ETEUpOwotCWRlZmludChkLCAiU1REX0VSUk9SX0hBTkRMRSIsIFNURF9FUlJPUl9IQU5ETEUpOwotCWRlZmludChkLCAiRFVQTElDQVRFX1NBTUVfQUNDRVNTIiwgRFVQTElDQVRFX1NBTUVfQUNDRVNTKTsKLQlkZWZpbnQoZCwgIlNUQVJURl9VU0VTVERIQU5ETEVTIiwgU1RBUlRGX1VTRVNUREhBTkRMRVMpOwotCWRlZmludChkLCAiU1RBUlRGX1VTRVNIT1dXSU5ET1ciLCBTVEFSVEZfVVNFU0hPV1dJTkRPVyk7Ci0JZGVmaW50KGQsICJTV19ISURFIiwgU1dfSElERSk7Ci0JZGVmaW50KGQsICJJTkZJTklURSIsIElORklOSVRFKTsKLQlkZWZpbnQoZCwgIldBSVRfT0JKRUNUXzAiLCBXQUlUX09CSkVDVF8wKTsKLQlkZWZpbnQoZCwgIkNSRUFURV9ORVdfQ09OU09MRSIsIENSRUFURV9ORVdfQ09OU09MRSk7CisgICAgLyogY29uc3RhbnRzICovCisgICAgZGVmaW50KGQsICJTVERfSU5QVVRfSEFORExFIiwgU1REX0lOUFVUX0hBTkRMRSk7CisgICAgZGVmaW50KGQsICJTVERfT1VUUFVUX0hBTkRMRSIsIFNURF9PVVRQVVRfSEFORExFKTsKKyAgICBkZWZpbnQoZCwgIlNURF9FUlJPUl9IQU5ETEUiLCBTVERfRVJST1JfSEFORExFKTsKKyAgICBkZWZpbnQoZCwgIkRVUExJQ0FURV9TQU1FX0FDQ0VTUyIsIERVUExJQ0FURV9TQU1FX0FDQ0VTUyk7CisgICAgZGVmaW50KGQsICJTVEFSVEZfVVNFU1RESEFORExFUyIsIFNUQVJURl9VU0VTVERIQU5ETEVTKTsKKyAgICBkZWZpbnQoZCwgIlNUQVJURl9VU0VTSE9XV0lORE9XIiwgU1RBUlRGX1VTRVNIT1dXSU5ET1cpOworICAgIGRlZmludChkLCAiU1dfSElERSIsIFNXX0hJREUpOworICAgIGRlZmludChkLCAiSU5GSU5JVEUiLCBJTkZJTklURSk7CisgICAgZGVmaW50KGQsICJXQUlUX09CSkVDVF8wIiwgV0FJVF9PQkpFQ1RfMCk7CisgICAgZGVmaW50KGQsICJDUkVBVEVfTkVXX0NPTlNPTEUiLCBDUkVBVEVfTkVXX0NPTlNPTEUpOwogfQpkaWZmIC0tZ2l0IGEvUEMvX3dpbnJlZy5jIGIvUEMvX3dpbnJlZy5jCmluZGV4IGU5NzM1YjIuLjFmYjY1NmIgMTAwNjQ0Ci0tLSBhL1BDL193aW5yZWcuYworKysgYi9QQy9fd2lucmVnLmMKQEAgLTQsNyArNCw3IEBACiAgIFdpbmRvd3MgUmVnaXN0cnkgYWNjZXNzIG1vZHVsZSBmb3IgUHl0aG9uLgogCiAgICogU2ltcGxlIHJlZ2lzdHJ5IGFjY2VzcyB3cml0dGVuIGJ5IE1hcmsgSGFtbW9uZCBpbiB3aW4zMmFwaQotCW1vZHVsZSBjaXJjYSAxOTk1LgorICAgIG1vZHVsZSBjaXJjYSAxOTk1LgogICAqIEJpbGwgVHV0dCBleHBhbmRlZCB0aGUgc3VwcG9ydCBzaWduaWZpY2FudGx5IG5vdCBsb25nIGFmdGVyLgogICAqIE51bWVyb3VzIG90aGVyIHBlb3BsZSBoYXZlIHN1Ym1pdHRlZCBwYXRjaGVzIHNpbmNlIHRoZW4uCiAgICogUmlwcGVkIGZyb20gd2luMzJhcGkgbW9kdWxlIDAzLUZlYi0yMDAwIGJ5IE1hcmsgSGFtbW9uZCwgYW5kCkBAIC0yOSw3ICsyOSw3IEBACiAgICB3YW50IHRvIGxvc2UgdGhpcyBpbmZvLi4uCiAqLwogI2RlZmluZSBQeUVycl9TZXRGcm9tV2luZG93c0VycldpdGhGdW5jdGlvbihyYywgZm5uYW1lKSBcCi0JUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnIocmMpCisgICAgUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnIocmMpCiAKIC8qIEZvcndhcmQgZGVjbGFyZXMgKi8KIApAQCAtMzU0LDggKzM1NCw4IEBACiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9WQVJfSEVBRAotCUhLRVkgaGtleTsKKyAgICBQeU9iamVjdF9WQVJfSEVBRAorICAgIEhLRVkgaGtleTsKIH0gUHlIS0VZT2JqZWN0OwogCiAjZGVmaW5lIFB5SEtFWV9DaGVjayhvcCkgKChvcCktPm9iX3R5cGUgPT0gJlB5SEtFWV9UeXBlKQpAQCAtMzY1LDExMiArMzY1LDExMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIFB5SEtFWV91bmFyeUZhaWx1cmVGdW5jKFB5T2JqZWN0ICpvYikKIHsKLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCBmYWlsTXNnKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCBmYWlsTXNnKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIHN0YXRpYyBQeU9iamVjdCAqCiBQeUhLRVlfYmluYXJ5RmFpbHVyZUZ1bmMoUHlPYmplY3QgKm9iMSwgUHlPYmplY3QgKm9iMikKIHsKLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCBmYWlsTXNnKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCBmYWlsTXNnKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIHN0YXRpYyBQeU9iamVjdCAqCiBQeUhLRVlfdGVybmFyeUZhaWx1cmVGdW5jKFB5T2JqZWN0ICpvYjEsIFB5T2JqZWN0ICpvYjIsIFB5T2JqZWN0ICpvYjMpCiB7Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgZmFpbE1zZyk7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgZmFpbE1zZyk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyB2b2lkCiBQeUhLRVlfZGVhbGxvY0Z1bmMoUHlPYmplY3QgKm9iKQogewotCS8qIENhbiBub3QgY2FsbCBQeUhLRVlfQ2xvc2UsIGFzIHRoZSBvYi0+dHBfdHlwZQotCSAgIGhhcyBhbHJlYWR5IGJlZW4gY2xlYXJlZCwgdGh1cyBjYXVzaW5nIHRoZSB0eXBlCi0JICAgY2hlY2sgdG8gZmFpbCEKLQkqLwotCVB5SEtFWU9iamVjdCAqb2JrZXkgPSAoUHlIS0VZT2JqZWN0ICopb2I7Ci0JaWYgKG9ia2V5LT5oa2V5KQotCQlSZWdDbG9zZUtleSgoSEtFWSlvYmtleS0+aGtleSk7Ci0JUHlPYmplY3RfREVMKG9iKTsKKyAgICAvKiBDYW4gbm90IGNhbGwgUHlIS0VZX0Nsb3NlLCBhcyB0aGUgb2ItPnRwX3R5cGUKKyAgICAgICBoYXMgYWxyZWFkeSBiZWVuIGNsZWFyZWQsIHRodXMgY2F1c2luZyB0aGUgdHlwZQorICAgICAgIGNoZWNrIHRvIGZhaWwhCisgICAgKi8KKyAgICBQeUhLRVlPYmplY3QgKm9ia2V5ID0gKFB5SEtFWU9iamVjdCAqKW9iOworICAgIGlmIChvYmtleS0+aGtleSkKKyAgICAgICAgUmVnQ2xvc2VLZXkoKEhLRVkpb2JrZXktPmhrZXkpOworICAgIFB5T2JqZWN0X0RFTChvYik7CiB9CiAKIHN0YXRpYyBpbnQKIFB5SEtFWV9ub256ZXJvRnVuYyhQeU9iamVjdCAqb2IpCiB7Ci0JcmV0dXJuICgoUHlIS0VZT2JqZWN0ICopb2IpLT5oa2V5ICE9IDA7CisgICAgcmV0dXJuICgoUHlIS0VZT2JqZWN0ICopb2IpLT5oa2V5ICE9IDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBQeUhLRVlfaW50RnVuYyhQeU9iamVjdCAqb2IpCiB7Ci0JUHlIS0VZT2JqZWN0ICpweWhrZXkgPSAoUHlIS0VZT2JqZWN0ICopb2I7Ci0JcmV0dXJuIFB5TG9uZ19Gcm9tVm9pZFB0cihweWhrZXktPmhrZXkpOworICAgIFB5SEtFWU9iamVjdCAqcHloa2V5ID0gKFB5SEtFWU9iamVjdCAqKW9iOworICAgIHJldHVybiBQeUxvbmdfRnJvbVZvaWRQdHIocHloa2V5LT5oa2V5KTsKIH0KIAogc3RhdGljIGludAogUHlIS0VZX3ByaW50RnVuYyhQeU9iamVjdCAqb2IsIEZJTEUgKmZwLCBpbnQgZmxhZ3MpCiB7Ci0JUHlIS0VZT2JqZWN0ICpweWhrZXkgPSAoUHlIS0VZT2JqZWN0ICopb2I7Ci0JY2hhciByZXNCdWZbMTYwXTsKLQl3c3ByaW50ZihyZXNCdWYsICI8UHlIS0VZIGF0ICVwICglcCk+IiwKLQkJIG9iLCBweWhrZXktPmhrZXkpOwotCWZwdXRzKHJlc0J1ZiwgZnApOwotCXJldHVybiAwOworICAgIFB5SEtFWU9iamVjdCAqcHloa2V5ID0gKFB5SEtFWU9iamVjdCAqKW9iOworICAgIGNoYXIgcmVzQnVmWzE2MF07CisgICAgd3NwcmludGYocmVzQnVmLCAiPFB5SEtFWSBhdCAlcCAoJXApPiIsCisgICAgICAgICAgICAgb2IsIHB5aGtleS0+aGtleSk7CisgICAgZnB1dHMocmVzQnVmLCBmcCk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBQeUhLRVlfc3RyRnVuYyhQeU9iamVjdCAqb2IpCiB7Ci0JUHlIS0VZT2JqZWN0ICpweWhrZXkgPSAoUHlIS0VZT2JqZWN0ICopb2I7Ci0JY2hhciByZXNCdWZbMTYwXTsKLQl3c3ByaW50ZihyZXNCdWYsICI8UHlIS0VZOiVwPiIsIHB5aGtleS0+aGtleSk7Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcocmVzQnVmKTsKKyAgICBQeUhLRVlPYmplY3QgKnB5aGtleSA9IChQeUhLRVlPYmplY3QgKilvYjsKKyAgICBjaGFyIHJlc0J1ZlsxNjBdOworICAgIHdzcHJpbnRmKHJlc0J1ZiwgIjxQeUhLRVk6JXA+IiwgcHloa2V5LT5oa2V5KTsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhyZXNCdWYpOwogfQogCiBzdGF0aWMgaW50CiBQeUhLRVlfY29tcGFyZUZ1bmMoUHlPYmplY3QgKm9iMSwgUHlPYmplY3QgKm9iMikKIHsKLQlQeUhLRVlPYmplY3QgKnB5aGtleTEgPSAoUHlIS0VZT2JqZWN0ICopb2IxOwotCVB5SEtFWU9iamVjdCAqcHloa2V5MiA9IChQeUhLRVlPYmplY3QgKilvYjI7Ci0JcmV0dXJuIHB5aGtleTEgPT0gcHloa2V5MiA/IDAgOgotCQkgKHB5aGtleTEgPCBweWhrZXkyID8gLTEgOiAxKTsKKyAgICBQeUhLRVlPYmplY3QgKnB5aGtleTEgPSAoUHlIS0VZT2JqZWN0ICopb2IxOworICAgIFB5SEtFWU9iamVjdCAqcHloa2V5MiA9IChQeUhLRVlPYmplY3QgKilvYjI7CisgICAgcmV0dXJuIHB5aGtleTEgPT0gcHloa2V5MiA/IDAgOgorICAgICAgICAgKHB5aGtleTEgPCBweWhrZXkyID8gLTEgOiAxKTsKIH0KIAogc3RhdGljIGxvbmcKIFB5SEtFWV9oYXNoRnVuYyhQeU9iamVjdCAqb2IpCiB7Ci0JLyogSnVzdCB1c2UgdGhlIGFkZHJlc3MuCi0JICAgWFhYIC0gc2hvdWxkIHdlIHVzZSB0aGUgaGFuZGxlIHZhbHVlPwotCSovCi0JcmV0dXJuIF9QeV9IYXNoUG9pbnRlcihvYik7CisgICAgLyogSnVzdCB1c2UgdGhlIGFkZHJlc3MuCisgICAgICAgWFhYIC0gc2hvdWxkIHdlIHVzZSB0aGUgaGFuZGxlIHZhbHVlPworICAgICovCisgICAgcmV0dXJuIF9QeV9IYXNoUG9pbnRlcihvYik7CiB9CiAKIAogc3RhdGljIFB5TnVtYmVyTWV0aG9kcyBQeUhLRVlfTnVtYmVyTWV0aG9kcyA9CiB7Ci0JUHlIS0VZX2JpbmFyeUZhaWx1cmVGdW5jLAkvKiBuYl9hZGQgKi8KLQlQeUhLRVlfYmluYXJ5RmFpbHVyZUZ1bmMsCS8qIG5iX3N1YnRyYWN0ICovCi0JUHlIS0VZX2JpbmFyeUZhaWx1cmVGdW5jLAkvKiBuYl9tdWx0aXBseSAqLwotCVB5SEtFWV9iaW5hcnlGYWlsdXJlRnVuYywJLyogbmJfZGl2aWRlICovCi0JUHlIS0VZX2JpbmFyeUZhaWx1cmVGdW5jLAkvKiBuYl9yZW1haW5kZXIgKi8KLQlQeUhLRVlfYmluYXJ5RmFpbHVyZUZ1bmMsCS8qIG5iX2Rpdm1vZCAqLwotCVB5SEtFWV90ZXJuYXJ5RmFpbHVyZUZ1bmMsCS8qIG5iX3Bvd2VyICovCi0JUHlIS0VZX3VuYXJ5RmFpbHVyZUZ1bmMsCS8qIG5iX25lZ2F0aXZlICovCi0JUHlIS0VZX3VuYXJ5RmFpbHVyZUZ1bmMsCS8qIG5iX3Bvc2l0aXZlICovCi0JUHlIS0VZX3VuYXJ5RmFpbHVyZUZ1bmMsCS8qIG5iX2Fic29sdXRlICovCi0JUHlIS0VZX25vbnplcm9GdW5jLAkJLyogbmJfbm9uemVybyAqLwotCVB5SEtFWV91bmFyeUZhaWx1cmVGdW5jLAkvKiBuYl9pbnZlcnQgKi8KLQlQeUhLRVlfYmluYXJ5RmFpbHVyZUZ1bmMsCS8qIG5iX2xzaGlmdCAqLwotCVB5SEtFWV9iaW5hcnlGYWlsdXJlRnVuYywJLyogbmJfcnNoaWZ0ICovCi0JUHlIS0VZX2JpbmFyeUZhaWx1cmVGdW5jLAkvKiBuYl9hbmQgKi8KLQlQeUhLRVlfYmluYXJ5RmFpbHVyZUZ1bmMsCS8qIG5iX3hvciAqLwotCVB5SEtFWV9iaW5hcnlGYWlsdXJlRnVuYywJLyogbmJfb3IgKi8KLQkwLAkJLyogbmJfY29lcmNlIChhbGxvd2VkIHRvIGJlIHplcm8pICovCi0JUHlIS0VZX2ludEZ1bmMsCQkJLyogbmJfaW50ICovCi0JUHlIS0VZX3VuYXJ5RmFpbHVyZUZ1bmMsCS8qIG5iX2xvbmcgKi8KLQlQeUhLRVlfdW5hcnlGYWlsdXJlRnVuYywJLyogbmJfZmxvYXQgKi8KLQlQeUhLRVlfdW5hcnlGYWlsdXJlRnVuYywJLyogbmJfb2N0ICovCi0JUHlIS0VZX3VuYXJ5RmFpbHVyZUZ1bmMsCS8qIG5iX2hleCAqLworICAgIFB5SEtFWV9iaW5hcnlGYWlsdXJlRnVuYywgICAgICAgICAgIC8qIG5iX2FkZCAqLworICAgIFB5SEtFWV9iaW5hcnlGYWlsdXJlRnVuYywgICAgICAgICAgIC8qIG5iX3N1YnRyYWN0ICovCisgICAgUHlIS0VZX2JpbmFyeUZhaWx1cmVGdW5jLCAgICAgICAgICAgLyogbmJfbXVsdGlwbHkgKi8KKyAgICBQeUhLRVlfYmluYXJ5RmFpbHVyZUZ1bmMsICAgICAgICAgICAvKiBuYl9kaXZpZGUgKi8KKyAgICBQeUhLRVlfYmluYXJ5RmFpbHVyZUZ1bmMsICAgICAgICAgICAvKiBuYl9yZW1haW5kZXIgKi8KKyAgICBQeUhLRVlfYmluYXJ5RmFpbHVyZUZ1bmMsICAgICAgICAgICAvKiBuYl9kaXZtb2QgKi8KKyAgICBQeUhLRVlfdGVybmFyeUZhaWx1cmVGdW5jLCAgICAgICAgICAvKiBuYl9wb3dlciAqLworICAgIFB5SEtFWV91bmFyeUZhaWx1cmVGdW5jLCAgICAgICAgICAgIC8qIG5iX25lZ2F0aXZlICovCisgICAgUHlIS0VZX3VuYXJ5RmFpbHVyZUZ1bmMsICAgICAgICAgICAgLyogbmJfcG9zaXRpdmUgKi8KKyAgICBQeUhLRVlfdW5hcnlGYWlsdXJlRnVuYywgICAgICAgICAgICAvKiBuYl9hYnNvbHV0ZSAqLworICAgIFB5SEtFWV9ub256ZXJvRnVuYywgICAgICAgICAgICAgICAgIC8qIG5iX25vbnplcm8gKi8KKyAgICBQeUhLRVlfdW5hcnlGYWlsdXJlRnVuYywgICAgICAgICAgICAvKiBuYl9pbnZlcnQgKi8KKyAgICBQeUhLRVlfYmluYXJ5RmFpbHVyZUZ1bmMsICAgICAgICAgICAvKiBuYl9sc2hpZnQgKi8KKyAgICBQeUhLRVlfYmluYXJ5RmFpbHVyZUZ1bmMsICAgICAgICAgICAvKiBuYl9yc2hpZnQgKi8KKyAgICBQeUhLRVlfYmluYXJ5RmFpbHVyZUZ1bmMsICAgICAgICAgICAvKiBuYl9hbmQgKi8KKyAgICBQeUhLRVlfYmluYXJ5RmFpbHVyZUZ1bmMsICAgICAgICAgICAvKiBuYl94b3IgKi8KKyAgICBQeUhLRVlfYmluYXJ5RmFpbHVyZUZ1bmMsICAgICAgICAgICAvKiBuYl9vciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyogbmJfY29lcmNlIChhbGxvd2VkIHRvIGJlIHplcm8pICovCisgICAgUHlIS0VZX2ludEZ1bmMsICAgICAgICAgICAgICAgICAgICAgLyogbmJfaW50ICovCisgICAgUHlIS0VZX3VuYXJ5RmFpbHVyZUZ1bmMsICAgICAgICAgICAgLyogbmJfbG9uZyAqLworICAgIFB5SEtFWV91bmFyeUZhaWx1cmVGdW5jLCAgICAgICAgICAgIC8qIG5iX2Zsb2F0ICovCisgICAgUHlIS0VZX3VuYXJ5RmFpbHVyZUZ1bmMsICAgICAgICAgICAgLyogbmJfb2N0ICovCisgICAgUHlIS0VZX3VuYXJ5RmFpbHVyZUZ1bmMsICAgICAgICAgICAgLyogbmJfaGV4ICovCiB9OwogCiAKQEAgLTQ4MCwzNCArNDgwLDM0IEBACiAvKiBUaGUgdHlwZSBpdHNlbGYgKi8KIFB5VHlwZU9iamVjdCBQeUhLRVlfVHlwZSA9CiB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKDAsIDApIC8qIGZpbGwgaW4gdHlwZSBhdCBtb2R1bGUgaW5pdCAqLwotCSJQeUhLRVkiLAotCXNpemVvZihQeUhLRVlPYmplY3QpLAotCTAsCi0JUHlIS0VZX2RlYWxsb2NGdW5jLAkJLyogdHBfZGVhbGxvYyAqLwotCVB5SEtFWV9wcmludEZ1bmMsCQkvKiB0cF9wcmludCAqLwotCVB5SEtFWV9nZXRhdHRyLAkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkvKiB0cF9zZXRhdHRyICovCi0JUHlIS0VZX2NvbXBhcmVGdW5jLAkJLyogdHBfY29tcGFyZSAqLwotCTAsCQkJCS8qIHRwX3JlcHIgKi8KLQkmUHlIS0VZX051bWJlck1ldGhvZHMsCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQlQeUhLRVlfaGFzaEZ1bmMsCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJLyogdHBfY2FsbCAqLwotCVB5SEtFWV9zdHJGdW5jLAkJCS8qIHRwX3N0ciAqLwotCTAsCQkJCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQkwLAkJCQkvKiB0cF9mbGFncyAqLwotCVB5SEtFWV9kb2MsCQkJLyogdHBfZG9jICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKDAsIDApIC8qIGZpbGwgaW4gdHlwZSBhdCBtb2R1bGUgaW5pdCAqLworICAgICJQeUhLRVkiLAorICAgIHNpemVvZihQeUhLRVlPYmplY3QpLAorICAgIDAsCisgICAgUHlIS0VZX2RlYWxsb2NGdW5jLCAgICAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIFB5SEtFWV9wcmludEZ1bmMsICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgUHlIS0VZX2dldGF0dHIsICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICBQeUhLRVlfY29tcGFyZUZ1bmMsICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgICZQeUhLRVlfTnVtYmVyTWV0aG9kcywgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIFB5SEtFWV9oYXNoRnVuYywgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgUHlIS0VZX3N0ckZ1bmMsICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCisgICAgUHlIS0VZX2RvYywgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCiB9OwogCiAjZGVmaW5lIE9GRihlKSBvZmZzZXRvZihQeUhLRVlPYmplY3QsIGUpCiAKIHN0YXRpYyBzdHJ1Y3QgbWVtYmVybGlzdCBQeUhLRVlfbWVtYmVybGlzdFtdID0gewotCXsiaGFuZGxlIiwgICAgICBUX0lOVCwgICAgICBPRkYoaGtleSl9LAotCXtOVUxMfSAgICAvKiBTZW50aW5lbCAqLworICAgIHsiaGFuZGxlIiwgICAgICBUX0lOVCwgICAgICBPRkYoaGtleSl9LAorICAgIHtOVUxMfSAgICAvKiBTZW50aW5lbCAqLwogfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNTE4LDYyICs1MTgsNjIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBQeUhLRVlfQ2xvc2VNZXRob2QoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOkNsb3NlIikpCi0JCXJldHVybiBOVUxMOwotCWlmICghUHlIS0VZX0Nsb3NlKHNlbGYpKQotCQlyZXR1cm4gTlVMTDsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6Q2xvc2UiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUhLRVlfQ2xvc2Uoc2VsZikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFB5SEtFWV9EZXRhY2hNZXRob2QoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXZvaWQqIHJldDsKLQlQeUhLRVlPYmplY3QgKnBUaGlzID0gKFB5SEtFWU9iamVjdCAqKXNlbGY7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6RGV0YWNoIikpCi0JCXJldHVybiBOVUxMOwotCXJldCA9ICh2b2lkKilwVGhpcy0+aGtleTsKLQlwVGhpcy0+aGtleSA9IDA7Ci0JcmV0dXJuIFB5TG9uZ19Gcm9tVm9pZFB0cihyZXQpOworICAgIHZvaWQqIHJldDsKKyAgICBQeUhLRVlPYmplY3QgKnBUaGlzID0gKFB5SEtFWU9iamVjdCAqKXNlbGY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6RGV0YWNoIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldCA9ICh2b2lkKilwVGhpcy0+aGtleTsKKyAgICBwVGhpcy0+aGtleSA9IDA7CisgICAgcmV0dXJuIFB5TG9uZ19Gcm9tVm9pZFB0cihyZXQpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogUHlIS0VZX0VudGVyKFB5T2JqZWN0ICpzZWxmKQogewotCVB5X1hJTkNSRUYoc2VsZik7Ci0JcmV0dXJuIHNlbGY7CisgICAgUHlfWElOQ1JFRihzZWxmKTsKKyAgICByZXR1cm4gc2VsZjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFB5SEtFWV9FeGl0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpZiAoIVB5SEtFWV9DbG9zZShzZWxmKSkKLQkJcmV0dXJuIE5VTEw7Ci0JUHlfUkVUVVJOX05PTkU7CisgICAgaWYgKCFQeUhLRVlfQ2xvc2Uoc2VsZikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5X1JFVFVSTl9OT05FOwogfQogCiAKIHN0YXRpYyBzdHJ1Y3QgUHlNZXRob2REZWYgUHlIS0VZX21ldGhvZHNbXSA9IHsKLQl7IkNsb3NlIiwgIFB5SEtFWV9DbG9zZU1ldGhvZCwgTUVUSF9WQVJBUkdTLCBQeUhLRVlfQ2xvc2VfZG9jfSwKLQl7IkRldGFjaCIsIFB5SEtFWV9EZXRhY2hNZXRob2QsIE1FVEhfVkFSQVJHUywgUHlIS0VZX0RldGFjaF9kb2N9LAotCXsiX19lbnRlcl9fIiwgKFB5Q0Z1bmN0aW9uKVB5SEtFWV9FbnRlciwgTUVUSF9OT0FSR1MsIE5VTEx9LAotCXsiX19leGl0X18iLCBQeUhLRVlfRXhpdCwgTUVUSF9WQVJBUkdTLCBOVUxMfSwKLQl7TlVMTH0KKyAgICB7IkNsb3NlIiwgIFB5SEtFWV9DbG9zZU1ldGhvZCwgTUVUSF9WQVJBUkdTLCBQeUhLRVlfQ2xvc2VfZG9jfSwKKyAgICB7IkRldGFjaCIsIFB5SEtFWV9EZXRhY2hNZXRob2QsIE1FVEhfVkFSQVJHUywgUHlIS0VZX0RldGFjaF9kb2N9LAorICAgIHsiX19lbnRlcl9fIiwgKFB5Q0Z1bmN0aW9uKVB5SEtFWV9FbnRlciwgTUVUSF9OT0FSR1MsIE5VTEx9LAorICAgIHsiX19leGl0X18iLCBQeUhLRVlfRXhpdCwgTUVUSF9WQVJBUkdTLCBOVUxMfSwKKyAgICB7TlVMTH0KIH07CiAKIC8qc3RhdGljKi8gUHlPYmplY3QgKgogUHlIS0VZX2dldGF0dHIoUHlPYmplY3QgKnNlbGYsIGNvbnN0IGNoYXIgKm5hbWUpCiB7Ci0JUHlPYmplY3QgKnJlczsKKyAgICBQeU9iamVjdCAqcmVzOwogCi0JcmVzID0gUHlfRmluZE1ldGhvZChQeUhLRVlfbWV0aG9kcywgc2VsZiwgbmFtZSk7Ci0JaWYgKHJlcyAhPSBOVUxMKQotCQlyZXR1cm4gcmVzOwotCVB5RXJyX0NsZWFyKCk7Ci0JaWYgKHN0cmNtcChuYW1lLCAiaGFuZGxlIikgPT0gMCkKLQkJcmV0dXJuIFB5TG9uZ19Gcm9tVm9pZFB0cigoKFB5SEtFWU9iamVjdCAqKXNlbGYpLT5oa2V5KTsKLQlyZXR1cm4gUHlNZW1iZXJfR2V0KChjaGFyICopc2VsZiwgUHlIS0VZX21lbWJlcmxpc3QsIG5hbWUpOworICAgIHJlcyA9IFB5X0ZpbmRNZXRob2QoUHlIS0VZX21ldGhvZHMsIHNlbGYsIG5hbWUpOworICAgIGlmIChyZXMgIT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICBQeUVycl9DbGVhcigpOworICAgIGlmIChzdHJjbXAobmFtZSwgImhhbmRsZSIpID09IDApCisgICAgICAgIHJldHVybiBQeUxvbmdfRnJvbVZvaWRQdHIoKChQeUhLRVlPYmplY3QgKilzZWxmKS0+aGtleSk7CisgICAgcmV0dXJuIFB5TWVtYmVyX0dldCgoY2hhciAqKXNlbGYsIFB5SEtFWV9tZW1iZXJsaXN0LCBuYW1lKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNTgyLDc0ICs1ODIsNzQgQEAKIFB5T2JqZWN0ICoKIFB5SEtFWV9OZXcoSEtFWSBoSW5pdCkKIHsKLQlQeUhLRVlPYmplY3QgKmtleSA9IFB5T2JqZWN0X05FVyhQeUhLRVlPYmplY3QsICZQeUhLRVlfVHlwZSk7Ci0JaWYgKGtleSkKLQkJa2V5LT5oa2V5ID0gaEluaXQ7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWtleTsKKyAgICBQeUhLRVlPYmplY3QgKmtleSA9IFB5T2JqZWN0X05FVyhQeUhLRVlPYmplY3QsICZQeUhLRVlfVHlwZSk7CisgICAgaWYgKGtleSkKKyAgICAgICAga2V5LT5oa2V5ID0gaEluaXQ7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWtleTsKIH0KIAogQk9PTAogUHlIS0VZX0Nsb3NlKFB5T2JqZWN0ICpvYl9oYW5kbGUpCiB7Ci0JTE9ORyByYzsKLQlQeUhLRVlPYmplY3QgKmtleTsKKyAgICBMT05HIHJjOworICAgIFB5SEtFWU9iamVjdCAqa2V5OwogCi0JaWYgKCFQeUhLRVlfQ2hlY2sob2JfaGFuZGxlKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYmFkIG9wZXJhbmQgdHlwZSIpOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCWtleSA9IChQeUhLRVlPYmplY3QgKilvYl9oYW5kbGU7Ci0JcmMgPSBrZXktPmhrZXkgPyBSZWdDbG9zZUtleSgoSEtFWSlrZXktPmhrZXkpIDogRVJST1JfU1VDQ0VTUzsKLQlrZXktPmhrZXkgPSAwOwotCWlmIChyYyAhPSBFUlJPUl9TVUNDRVNTKQotCQlQeUVycl9TZXRGcm9tV2luZG93c0VycldpdGhGdW5jdGlvbihyYywgIlJlZ0Nsb3NlS2V5Iik7Ci0JcmV0dXJuIHJjID09IEVSUk9SX1NVQ0NFU1M7CisgICAgaWYgKCFQeUhLRVlfQ2hlY2sob2JfaGFuZGxlKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYmFkIG9wZXJhbmQgdHlwZSIpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIGtleSA9IChQeUhLRVlPYmplY3QgKilvYl9oYW5kbGU7CisgICAgcmMgPSBrZXktPmhrZXkgPyBSZWdDbG9zZUtleSgoSEtFWSlrZXktPmhrZXkpIDogRVJST1JfU1VDQ0VTUzsKKyAgICBrZXktPmhrZXkgPSAwOworICAgIGlmIChyYyAhPSBFUlJPUl9TVUNDRVNTKQorICAgICAgICBQeUVycl9TZXRGcm9tV2luZG93c0VycldpdGhGdW5jdGlvbihyYywgIlJlZ0Nsb3NlS2V5Iik7CisgICAgcmV0dXJuIHJjID09IEVSUk9SX1NVQ0NFU1M7CiB9CiAKIEJPT0wKIFB5SEtFWV9Bc0hLRVkoUHlPYmplY3QgKm9iLCBIS0VZICpwSEFORExFLCBCT09MIGJOb25lT0spCiB7Ci0JaWYgKG9iID09IFB5X05vbmUpIHsKLQkJaWYgKCFiTm9uZU9LKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoCi0JCQkJICBQeUV4Y19UeXBlRXJyb3IsCi0JCQkJICAiTm9uZSBpcyBub3QgYSB2YWxpZCBIS0VZIGluIHRoaXMgY29udGV4dCIpOwotCQkJcmV0dXJuIEZBTFNFOwotCQl9Ci0JCSpwSEFORExFID0gKEhLRVkpMDsKLQl9Ci0JZWxzZSBpZiAoUHlIS0VZX0NoZWNrKG9iKSkgewotCQlQeUhLRVlPYmplY3QgKnBIID0gKFB5SEtFWU9iamVjdCAqKW9iOwotCQkqcEhBTkRMRSA9IHBILT5oa2V5OwotCX0KLQllbHNlIGlmIChQeUludF9DaGVjayhvYikgfHwgUHlMb25nX0NoZWNrKG9iKSkgewotCQkvKiBXZSBhbHNvIHN1cHBvcnQgaW50ZWdlcnMgKi8KLQkJUHlFcnJfQ2xlYXIoKTsKLQkJKnBIQU5ETEUgPSAoSEtFWSlQeUxvbmdfQXNWb2lkUHRyKG9iKTsKLQkJaWYgKFB5RXJyX09jY3VycmVkKCkpCi0JCQlyZXR1cm4gRkFMU0U7Ci0JfQotCWVsc2UgewotCQlQeUVycl9TZXRTdHJpbmcoCi0JCQkJUHlFeGNfVHlwZUVycm9yLAotCQkJIlRoZSBvYmplY3QgaXMgbm90IGEgUHlIS0VZIG9iamVjdCIpOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCXJldHVybiBUUlVFOworICAgIGlmIChvYiA9PSBQeV9Ob25lKSB7CisgICAgICAgIGlmICghYk5vbmVPSykgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgIFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAiTm9uZSBpcyBub3QgYSB2YWxpZCBIS0VZIGluIHRoaXMgY29udGV4dCIpOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICAgICpwSEFORExFID0gKEhLRVkpMDsKKyAgICB9CisgICAgZWxzZSBpZiAoUHlIS0VZX0NoZWNrKG9iKSkgeworICAgICAgICBQeUhLRVlPYmplY3QgKnBIID0gKFB5SEtFWU9iamVjdCAqKW9iOworICAgICAgICAqcEhBTkRMRSA9IHBILT5oa2V5OworICAgIH0KKyAgICBlbHNlIGlmIChQeUludF9DaGVjayhvYikgfHwgUHlMb25nX0NoZWNrKG9iKSkgeworICAgICAgICAvKiBXZSBhbHNvIHN1cHBvcnQgaW50ZWdlcnMgKi8KKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgKnBIQU5ETEUgPSAoSEtFWSlQeUxvbmdfQXNWb2lkUHRyKG9iKTsKKyAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICBQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAiVGhlIG9iamVjdCBpcyBub3QgYSBQeUhLRVkgb2JqZWN0Iik7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgcmV0dXJuIFRSVUU7CiB9CiAKIFB5T2JqZWN0ICoKIFB5SEtFWV9Gcm9tSEtFWShIS0VZIGgpCiB7Ci0JUHlIS0VZT2JqZWN0ICpvcDsKKyAgICBQeUhLRVlPYmplY3QgKm9wOwogCi0JLyogSW5saW5lIFB5T2JqZWN0X05ldyAqLwotCW9wID0gKFB5SEtFWU9iamVjdCAqKSBQeU9iamVjdF9NQUxMT0Moc2l6ZW9mKFB5SEtFWU9iamVjdCkpOwotCWlmIChvcCA9PSBOVUxMKQotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQlQeU9iamVjdF9JTklUKG9wLCAmUHlIS0VZX1R5cGUpOwotCW9wLT5oa2V5ID0gaDsKLQlyZXR1cm4gKFB5T2JqZWN0ICopb3A7CisgICAgLyogSW5saW5lIFB5T2JqZWN0X05ldyAqLworICAgIG9wID0gKFB5SEtFWU9iamVjdCAqKSBQeU9iamVjdF9NQUxMT0Moc2l6ZW9mKFB5SEtFWU9iamVjdCkpOworICAgIGlmIChvcCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICBQeU9iamVjdF9JTklUKG9wLCAmUHlIS0VZX1R5cGUpOworICAgIG9wLT5oa2V5ID0gaDsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopb3A7CiB9CiAKIApAQCAtNjU5LDMyICs2NTksMzIgQEAKIEJPT0wKIFB5V2luT2JqZWN0X0Nsb3NlSEtFWShQeU9iamVjdCAqb2JIYW5kbGUpCiB7Ci0JQk9PTCBvazsKLQlpZiAoUHlIS0VZX0NoZWNrKG9iSGFuZGxlKSkgewotCQlvayA9IFB5SEtFWV9DbG9zZShvYkhhbmRsZSk7Ci0JfQorICAgIEJPT0wgb2s7CisgICAgaWYgKFB5SEtFWV9DaGVjayhvYkhhbmRsZSkpIHsKKyAgICAgICAgb2sgPSBQeUhLRVlfQ2xvc2Uob2JIYW5kbGUpOworICAgIH0KICNpZiBTSVpFT0ZfTE9ORyA+PSBTSVpFT0ZfSEtFWQotCWVsc2UgaWYgKFB5SW50X0NoZWNrKG9iSGFuZGxlKSkgewotCQlsb25nIHJjID0gUmVnQ2xvc2VLZXkoKEhLRVkpUHlJbnRfQXNMb25nKG9iSGFuZGxlKSk7Ci0JCW9rID0gKHJjID09IEVSUk9SX1NVQ0NFU1MpOwotCQlpZiAoIW9rKQotCQkJUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnJXaXRoRnVuY3Rpb24ocmMsICJSZWdDbG9zZUtleSIpOwotCX0KKyAgICBlbHNlIGlmIChQeUludF9DaGVjayhvYkhhbmRsZSkpIHsKKyAgICAgICAgbG9uZyByYyA9IFJlZ0Nsb3NlS2V5KChIS0VZKVB5SW50X0FzTG9uZyhvYkhhbmRsZSkpOworICAgICAgICBvayA9IChyYyA9PSBFUlJPUl9TVUNDRVNTKTsKKyAgICAgICAgaWYgKCFvaykKKyAgICAgICAgICAgIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyV2l0aEZ1bmN0aW9uKHJjLCAiUmVnQ2xvc2VLZXkiKTsKKyAgICB9CiAjZWxzZQotCWVsc2UgaWYgKFB5TG9uZ19DaGVjayhvYkhhbmRsZSkpIHsKLQkJbG9uZyByYyA9IFJlZ0Nsb3NlS2V5KChIS0VZKVB5TG9uZ19Bc1ZvaWRQdHIob2JIYW5kbGUpKTsKLQkJb2sgPSAocmMgPT0gRVJST1JfU1VDQ0VTUyk7Ci0JCWlmICghb2spCi0JCQlQeUVycl9TZXRGcm9tV2luZG93c0VycldpdGhGdW5jdGlvbihyYywgIlJlZ0Nsb3NlS2V5Iik7Ci0JfQorICAgIGVsc2UgaWYgKFB5TG9uZ19DaGVjayhvYkhhbmRsZSkpIHsKKyAgICAgICAgbG9uZyByYyA9IFJlZ0Nsb3NlS2V5KChIS0VZKVB5TG9uZ19Bc1ZvaWRQdHIob2JIYW5kbGUpKTsKKyAgICAgICAgb2sgPSAocmMgPT0gRVJST1JfU1VDQ0VTUyk7CisgICAgICAgIGlmICghb2spCisgICAgICAgICAgICBQeUVycl9TZXRGcm9tV2luZG93c0VycldpdGhGdW5jdGlvbihyYywgIlJlZ0Nsb3NlS2V5Iik7CisgICAgfQogI2VuZGlmCi0JZWxzZSB7Ci0JCVB5RXJyX1NldFN0cmluZygKLQkJCVB5RXhjX1R5cGVFcnJvciwKLQkJCSJBIGhhbmRsZSBtdXN0IGJlIGEgSEtFWSBvYmplY3Qgb3IgYW4gaW50ZWdlciIpOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCXJldHVybiBvazsKKyAgICBlbHNlIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKAorICAgICAgICAgICAgUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgIkEgaGFuZGxlIG11c3QgYmUgYSBIS0VZIG9iamVjdCBvciBhbiBpbnRlZ2VyIik7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgcmV0dXJuIG9rOwogfQogCiAKQEAgLTcwMSwyOSArNzAxLDI5IEBACiBzdGF0aWMgdm9pZAogZml4dXBNdWx0aVNaKGNoYXIgKipzdHIsIGNoYXIgKmRhdGEsIGludCBsZW4pCiB7Ci0JY2hhciAqUDsKLQlpbnQgaTsKLQljaGFyICpROworICAgIGNoYXIgKlA7CisgICAgaW50IGk7CisgICAgY2hhciAqUTsKIAotCVEgPSBkYXRhICsgbGVuOwotCWZvciAoUCA9IGRhdGEsIGkgPSAwOyBQIDwgUSAmJiAqUCAhPSAnXDAnOyBQKyssIGkrKykgewotCQlzdHJbaV0gPSBQOwotCQlmb3IoOyAqUCAhPSAnXDAnOyBQKyspCi0JCQk7Ci0JfQorICAgIFEgPSBkYXRhICsgbGVuOworICAgIGZvciAoUCA9IGRhdGEsIGkgPSAwOyBQIDwgUSAmJiAqUCAhPSAnXDAnOyBQKyssIGkrKykgeworICAgICAgICBzdHJbaV0gPSBQOworICAgICAgICBmb3IoOyAqUCAhPSAnXDAnOyBQKyspCisgICAgICAgICAgICA7CisgICAgfQogfQogCiBzdGF0aWMgaW50CiBjb3VudFN0cmluZ3MoY2hhciAqZGF0YSwgaW50IGxlbikKIHsKLQlpbnQgc3RyaW5nczsKLQljaGFyICpQOwotCWNoYXIgKlEgPSBkYXRhICsgbGVuOworICAgIGludCBzdHJpbmdzOworICAgIGNoYXIgKlA7CisgICAgY2hhciAqUSA9IGRhdGEgKyBsZW47CiAKLQlmb3IgKFAgPSBkYXRhLCBzdHJpbmdzID0gMDsgUCA8IFEgJiYgKlAgIT0gJ1wwJzsgUCsrLCBzdHJpbmdzKyspCi0JCWZvciAoOyBQIDwgUSAmJiAqUCAhPSAnXDAnOyBQKyspCi0JCQk7Ci0JcmV0dXJuIHN0cmluZ3M7CisgICAgZm9yIChQID0gZGF0YSwgc3RyaW5ncyA9IDA7IFAgPCBRICYmICpQICE9ICdcMCc7IFArKywgc3RyaW5ncysrKQorICAgICAgICBmb3IgKDsgUCA8IFEgJiYgKlAgIT0gJ1wwJzsgUCsrKQorICAgICAgICAgICAgOworICAgIHJldHVybiBzdHJpbmdzOwogfQogCiAvKiBDb252ZXJ0IFB5T2JqZWN0IGludG8gUmVnaXN0cnkgZGF0YS4KQEAgLTczMSwyNDQgKzczMSwyNDQgQEAKIHN0YXRpYyBCT09MCiBQeTJSZWcoUHlPYmplY3QgKnZhbHVlLCBEV09SRCB0eXAsIEJZVEUgKipyZXREYXRhQnVmLCBEV09SRCAqcmV0RGF0YVNpemUpCiB7Ci0JUHlfc3NpemVfdCBpLGo7Ci0Jc3dpdGNoICh0eXApIHsKLQkJY2FzZSBSRUdfRFdPUkQ6Ci0JCQlpZiAodmFsdWUgIT0gUHlfTm9uZSAmJiAhUHlJbnRfQ2hlY2sodmFsdWUpKQotCQkJCXJldHVybiBGQUxTRTsKLQkJCSpyZXREYXRhQnVmID0gKEJZVEUgKilQeU1lbV9ORVcoRFdPUkQsIDEpOwotCQkJaWYgKCpyZXREYXRhQnVmPT1OVUxMKXsKLQkJCQlQeUVycl9Ob01lbW9yeSgpOwotCQkJCXJldHVybiBGQUxTRTsKLQkJCX0KLQkJCSpyZXREYXRhU2l6ZSA9IHNpemVvZihEV09SRCk7Ci0JCQlpZiAodmFsdWUgPT0gUHlfTm9uZSkgewotCQkJCURXT1JEIHplcm8gPSAwOwotCQkJCW1lbWNweSgqcmV0RGF0YUJ1ZiwgJnplcm8sIHNpemVvZihEV09SRCkpOwotCQkJfQotCQkJZWxzZQotCQkJCW1lbWNweSgqcmV0RGF0YUJ1ZiwKLQkJCQkgICAgICAgJlB5SW50X0FTX0xPTkcoKFB5SW50T2JqZWN0ICopdmFsdWUpLAotCQkJCSAgICAgICBzaXplb2YoRFdPUkQpKTsKLQkJCWJyZWFrOwotCQljYXNlIFJFR19TWjoKLQkJY2FzZSBSRUdfRVhQQU5EX1NaOgotCQkJewotCQkJaW50IG5lZWRfZGVjcmVmID0gMDsKLQkJCWlmICh2YWx1ZSA9PSBQeV9Ob25lKQotCQkJCSpyZXREYXRhU2l6ZSA9IDE7Ci0JCQllbHNlIHsKLQkJCQlpZiAoUHlVbmljb2RlX0NoZWNrKHZhbHVlKSkgewotCQkJCQl2YWx1ZSA9IFB5VW5pY29kZV9Bc0VuY29kZWRTdHJpbmcoCi0JCQkJCQkgICAgICB2YWx1ZSwKLQkJCQkJCSAgICAgICJtYmNzIiwKLQkJCQkJCSAgICAgIE5VTEwpOwotCQkJCQlpZiAodmFsdWU9PU5VTEwpCi0JCQkJCQlyZXR1cm4gRkFMU0U7Ci0JCQkJCW5lZWRfZGVjcmVmID0gMTsKLQkJCQl9Ci0JCQkJaWYgKCFQeVN0cmluZ19DaGVjayh2YWx1ZSkpCi0JCQkJCXJldHVybiBGQUxTRTsKLQkJCQkqcmV0RGF0YVNpemUgPSAxICsgc3RybGVuKAotCQkJCQlQeVN0cmluZ19BU19TVFJJTkcoCi0JCQkJCQkoUHlTdHJpbmdPYmplY3QgKil2YWx1ZSkpOwotCQkJfQotCQkJKnJldERhdGFCdWYgPSAoQllURSAqKVB5TWVtX05FVyhEV09SRCwgKnJldERhdGFTaXplKTsKLQkJCWlmICgqcmV0RGF0YUJ1Zj09TlVMTCl7Ci0JCQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJCQlyZXR1cm4gRkFMU0U7Ci0JCQl9Ci0JCQlpZiAodmFsdWUgPT0gUHlfTm9uZSkKLQkJCQlzdHJjcHkoKGNoYXIgKikqcmV0RGF0YUJ1ZiwgIiIpOwotCQkJZWxzZQotCQkJCXN0cmNweSgoY2hhciAqKSpyZXREYXRhQnVmLAotCQkJCSAgICAgICBQeVN0cmluZ19BU19TVFJJTkcoCi0JCQkJICAgICAgIAkJKFB5U3RyaW5nT2JqZWN0ICopdmFsdWUpKTsKLQkJCWlmIChuZWVkX2RlY3JlZikKLQkJCQlQeV9ERUNSRUYodmFsdWUpOwotCQkJYnJlYWs7Ci0JCQl9Ci0JCWNhc2UgUkVHX01VTFRJX1NaOgotCQkJewotCQkJCURXT1JEIHNpemUgPSAwOwotCQkJCWNoYXIgKlA7Ci0JCQkJUHlPYmplY3QgKipvYnMgPSBOVUxMOworICAgIFB5X3NzaXplX3QgaSxqOworICAgIHN3aXRjaCAodHlwKSB7CisgICAgICAgIGNhc2UgUkVHX0RXT1JEOgorICAgICAgICAgICAgaWYgKHZhbHVlICE9IFB5X05vbmUgJiYgIVB5SW50X0NoZWNrKHZhbHVlKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAqcmV0RGF0YUJ1ZiA9IChCWVRFICopUHlNZW1fTkVXKERXT1JELCAxKTsKKyAgICAgICAgICAgIGlmICgqcmV0RGF0YUJ1Zj09TlVMTCl7CisgICAgICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqcmV0RGF0YVNpemUgPSBzaXplb2YoRFdPUkQpOworICAgICAgICAgICAgaWYgKHZhbHVlID09IFB5X05vbmUpIHsKKyAgICAgICAgICAgICAgICBEV09SRCB6ZXJvID0gMDsKKyAgICAgICAgICAgICAgICBtZW1jcHkoKnJldERhdGFCdWYsICZ6ZXJvLCBzaXplb2YoRFdPUkQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBtZW1jcHkoKnJldERhdGFCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICZQeUludF9BU19MT05HKChQeUludE9iamVjdCAqKXZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKERXT1JEKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSRUdfU1o6CisgICAgICAgIGNhc2UgUkVHX0VYUEFORF9TWjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGludCBuZWVkX2RlY3JlZiA9IDA7CisgICAgICAgICAgICBpZiAodmFsdWUgPT0gUHlfTm9uZSkKKyAgICAgICAgICAgICAgICAqcmV0RGF0YVNpemUgPSAxOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKFB5VW5pY29kZV9DaGVjayh2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBQeVVuaWNvZGVfQXNFbmNvZGVkU3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYmNzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlPT1OVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgICAgICBuZWVkX2RlY3JlZiA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghUHlTdHJpbmdfQ2hlY2sodmFsdWUpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgKnJldERhdGFTaXplID0gMSArIHN0cmxlbigKKyAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKAorICAgICAgICAgICAgICAgICAgICAgICAgKFB5U3RyaW5nT2JqZWN0ICopdmFsdWUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpyZXREYXRhQnVmID0gKEJZVEUgKilQeU1lbV9ORVcoRFdPUkQsICpyZXREYXRhU2l6ZSk7CisgICAgICAgICAgICBpZiAoKnJldERhdGFCdWY9PU5VTEwpeworICAgICAgICAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHZhbHVlID09IFB5X05vbmUpCisgICAgICAgICAgICAgICAgc3RyY3B5KChjaGFyICopKnJldERhdGFCdWYsICIiKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBzdHJjcHkoKGNoYXIgKikqcmV0RGF0YUJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUHlTdHJpbmdPYmplY3QgKil2YWx1ZSkpOworICAgICAgICAgICAgaWYgKG5lZWRfZGVjcmVmKQorICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih2YWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgY2FzZSBSRUdfTVVMVElfU1o6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRFdPUkQgc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgY2hhciAqUDsKKyAgICAgICAgICAgICAgICBQeU9iamVjdCAqKm9icyA9IE5VTEw7CiAKLQkJCQlpZiAodmFsdWUgPT0gUHlfTm9uZSkKLQkJCQkJaSA9IDA7Ci0JCQkJZWxzZSB7Ci0JCQkJCWlmICghUHlMaXN0X0NoZWNrKHZhbHVlKSkKLQkJCQkJCXJldHVybiBGQUxTRTsKLQkJCQkJaSA9IFB5TGlzdF9TaXplKHZhbHVlKTsKLQkJCQl9Ci0JCQkJb2JzID0gbWFsbG9jKHNpemVvZihQeU9iamVjdCAqKSAqIGkpOwotCQkJCW1lbXNldChvYnMsIDAsIHNpemVvZihQeU9iamVjdCAqKSAqIGkpOwotCQkJCWZvciAoaiA9IDA7IGogPCBpOyBqKyspCi0JCQkJewotCQkJCQlQeU9iamVjdCAqdDsKLQkJCQkJdCA9IFB5TGlzdF9HRVRfSVRFTSgKLQkJCQkJCShQeUxpc3RPYmplY3QgKil2YWx1ZSxqKTsKLQkJCQkJaWYgKFB5U3RyaW5nX0NoZWNrKHQpKSB7Ci0JCQkJCQlvYnNbal0gPSB0OwotCQkJCQkJUHlfSU5DUkVGKHQpOwotCQkJCQl9IGVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayh0KSkgewotCQkJCQkJb2JzW2pdID0gUHlVbmljb2RlX0FzRW5jb2RlZFN0cmluZygKLQkJCQkJCQkJdCwKLQkJCQkJCQkJIm1iY3MiLAotCQkJCQkJCQlOVUxMKTsKLQkJCQkJCWlmIChvYnNbal09PU5VTEwpCi0JCQkJCQkJZ290byByZWdfbXVsdGlfZmFpbDsKLQkJCQkJfSBlbHNlCi0JCQkJCQlnb3RvIHJlZ19tdWx0aV9mYWlsOwotCQkJCQlzaXplICs9IDEgKyBzdHJsZW4oCi0JCQkJCQlQeVN0cmluZ19BU19TVFJJTkcoCi0JCQkJCQkJKFB5U3RyaW5nT2JqZWN0ICopb2JzW2pdKSk7Ci0JCQkJfQorICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBQeV9Ob25lKQorICAgICAgICAgICAgICAgICAgICBpID0gMDsKKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFQeUxpc3RfQ2hlY2sodmFsdWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgICAgICBpID0gUHlMaXN0X1NpemUodmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvYnMgPSBtYWxsb2Moc2l6ZW9mKFB5T2JqZWN0ICopICogaSk7CisgICAgICAgICAgICAgICAgbWVtc2V0KG9icywgMCwgc2l6ZW9mKFB5T2JqZWN0ICopICogaSk7CisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGk7IGorKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICp0OworICAgICAgICAgICAgICAgICAgICB0ID0gUHlMaXN0X0dFVF9JVEVNKAorICAgICAgICAgICAgICAgICAgICAgICAgKFB5TGlzdE9iamVjdCAqKXZhbHVlLGopOworICAgICAgICAgICAgICAgICAgICBpZiAoUHlTdHJpbmdfQ2hlY2sodCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9ic1tqXSA9IHQ7CisgICAgICAgICAgICAgICAgICAgICAgICBQeV9JTkNSRUYodCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrKHQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvYnNbal0gPSBQeVVuaWNvZGVfQXNFbmNvZGVkU3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1iY3MiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9ic1tqXT09TlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHJlZ19tdWx0aV9mYWlsOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gcmVnX211bHRpX2ZhaWw7CisgICAgICAgICAgICAgICAgICAgIHNpemUgKz0gMSArIHN0cmxlbigKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FTX1NUUklORygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUHlTdHJpbmdPYmplY3QgKilvYnNbal0pKTsKKyAgICAgICAgICAgICAgICB9CiAKLQkJCQkqcmV0RGF0YVNpemUgPSBzaXplICsgMTsKLQkJCQkqcmV0RGF0YUJ1ZiA9IChCWVRFICopUHlNZW1fTkVXKGNoYXIsCi0JCQkJCQkJICAgICAgICAqcmV0RGF0YVNpemUpOwotCQkJCWlmICgqcmV0RGF0YUJ1Zj09TlVMTCl7Ci0JCQkJCVB5RXJyX05vTWVtb3J5KCk7Ci0JCQkJCWdvdG8gcmVnX211bHRpX2ZhaWw7Ci0JCQkJfQotCQkJCVAgPSAoY2hhciAqKSpyZXREYXRhQnVmOworICAgICAgICAgICAgICAgICpyZXREYXRhU2l6ZSA9IHNpemUgKyAxOworICAgICAgICAgICAgICAgICpyZXREYXRhQnVmID0gKEJZVEUgKilQeU1lbV9ORVcoY2hhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpyZXREYXRhU2l6ZSk7CisgICAgICAgICAgICAgICAgaWYgKCpyZXREYXRhQnVmPT1OVUxMKXsKKyAgICAgICAgICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgICAgICAgICAgICAgZ290byByZWdfbXVsdGlfZmFpbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgUCA9IChjaGFyICopKnJldERhdGFCdWY7CiAKLQkJCQlmb3IgKGogPSAwOyBqIDwgaTsgaisrKQotCQkJCXsKLQkJCQkJUHlPYmplY3QgKnQ7Ci0JCQkJCXQgPSBvYnNbal07Ci0JCQkJCXN0cmNweShQLAotCQkJCQkgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKAotCQkJCQkgICAgICAgCQkoUHlTdHJpbmdPYmplY3QgKil0KSk7Ci0JCQkJCVAgKz0gMSArIHN0cmxlbigKLQkJCQkJCVB5U3RyaW5nX0FTX1NUUklORygKLQkJCQkJCQkoUHlTdHJpbmdPYmplY3QgKil0KSk7Ci0JCQkJCVB5X0RFQ1JFRihvYnNbal0pOwotCQkJCX0KLQkJCQkvKiBBbmQgZG91Ymx5LXRlcm1pbmF0ZSB0aGUgbGlzdC4uLiAqLwotCQkJCSpQID0gJ1wwJzsKLQkJCQlmcmVlKG9icyk7Ci0JCQkJYnJlYWs7Ci0JCQlyZWdfbXVsdGlfZmFpbDoKLQkJCQlpZiAob2JzKSB7Ci0JCQkJCWZvciAoaiA9IDA7IGogPCBpOyBqKyspCi0JCQkJCQlQeV9YREVDUkVGKG9ic1tqXSk7CisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGk7IGorKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICp0OworICAgICAgICAgICAgICAgICAgICB0ID0gb2JzW2pdOworICAgICAgICAgICAgICAgICAgICBzdHJjcHkoUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FTX1NUUklORygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQeVN0cmluZ09iamVjdCAqKXQpKTsKKyAgICAgICAgICAgICAgICAgICAgUCArPSAxICsgc3RybGVuKAorICAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQeVN0cmluZ09iamVjdCAqKXQpKTsKKyAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKG9ic1tqXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIEFuZCBkb3VibHktdGVybWluYXRlIHRoZSBsaXN0Li4uICovCisgICAgICAgICAgICAgICAgKlAgPSAnXDAnOworICAgICAgICAgICAgICAgIGZyZWUob2JzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHJlZ19tdWx0aV9mYWlsOgorICAgICAgICAgICAgICAgIGlmIChvYnMpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGk7IGorKykKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5X1hERUNSRUYob2JzW2pdKTsKIAotCQkJCQlmcmVlKG9icyk7Ci0JCQkJfQotCQkJCXJldHVybiBGQUxTRTsKLQkJCX0KLQkJY2FzZSBSRUdfQklOQVJZOgotCQkvKiBBTFNPIGhhbmRsZSBBTEwgdW5rbm93biBkYXRhIHR5cGVzIGhlcmUuICBFdmVuIGlmIHdlIGNhbid0Ci0JCSAgIHN1cHBvcnQgaXQgbmF0aXZlbHksIHdlIHNob3VsZCBoYW5kbGUgdGhlIGJpdHMuICovCi0JCWRlZmF1bHQ6Ci0JCQlpZiAodmFsdWUgPT0gUHlfTm9uZSkKLQkJCQkqcmV0RGF0YVNpemUgPSAwOwotCQkJZWxzZSB7Ci0JCQkJdm9pZCAqc3JjX2J1ZjsKLQkJCQlQeUJ1ZmZlclByb2NzICpwYiA9IHZhbHVlLT5vYl90eXBlLT50cF9hc19idWZmZXI7Ci0JCQkJaWYgKHBiPT1OVUxMKSB7Ci0JCQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkJCQkiT2JqZWN0cyBvZiB0eXBlICclcycgY2FuIG5vdCAiCi0JCQkJCQkiYmUgdXNlZCBhcyBiaW5hcnkgcmVnaXN0cnkgdmFsdWVzIiwKLQkJCQkJCXZhbHVlLT5vYl90eXBlLT50cF9uYW1lKTsKLQkJCQkJcmV0dXJuIEZBTFNFOwotCQkJCX0KLQkJCQkqcmV0RGF0YVNpemUgPSAoKnBiLT5iZl9nZXRyZWFkYnVmZmVyKSh2YWx1ZSwgMCwgJnNyY19idWYpOwotCQkJCSpyZXREYXRhQnVmID0gKEJZVEUgKilQeU1lbV9ORVcoY2hhciwKLQkJCQkJCQkJKnJldERhdGFTaXplKTsKLQkJCQlpZiAoKnJldERhdGFCdWY9PU5VTEwpewotCQkJCQlQeUVycl9Ob01lbW9yeSgpOwotCQkJCQlyZXR1cm4gRkFMU0U7Ci0JCQkJfQotCQkJCW1lbWNweSgqcmV0RGF0YUJ1Ziwgc3JjX2J1ZiwgKnJldERhdGFTaXplKTsKLQkJCX0KLQkJCWJyZWFrOwotCX0KLQlyZXR1cm4gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgZnJlZShvYnMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgIGNhc2UgUkVHX0JJTkFSWToKKyAgICAgICAgLyogQUxTTyBoYW5kbGUgQUxMIHVua25vd24gZGF0YSB0eXBlcyBoZXJlLiAgRXZlbiBpZiB3ZSBjYW4ndAorICAgICAgICAgICBzdXBwb3J0IGl0IG5hdGl2ZWx5LCB3ZSBzaG91bGQgaGFuZGxlIHRoZSBiaXRzLiAqLworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgaWYgKHZhbHVlID09IFB5X05vbmUpCisgICAgICAgICAgICAgICAgKnJldERhdGFTaXplID0gMDsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHZvaWQgKnNyY19idWY7CisgICAgICAgICAgICAgICAgUHlCdWZmZXJQcm9jcyAqcGIgPSB2YWx1ZS0+b2JfdHlwZS0+dHBfYXNfYnVmZmVyOworICAgICAgICAgICAgICAgIGlmIChwYj09TlVMTCkgeworICAgICAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIk9iamVjdHMgb2YgdHlwZSAnJXMnIGNhbiBub3QgIgorICAgICAgICAgICAgICAgICAgICAgICAgImJlIHVzZWQgYXMgYmluYXJ5IHJlZ2lzdHJ5IHZhbHVlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS0+b2JfdHlwZS0+dHBfbmFtZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKnJldERhdGFTaXplID0gKCpwYi0+YmZfZ2V0cmVhZGJ1ZmZlcikodmFsdWUsIDAsICZzcmNfYnVmKTsKKyAgICAgICAgICAgICAgICAqcmV0RGF0YUJ1ZiA9IChCWVRFICopUHlNZW1fTkVXKGNoYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcmV0RGF0YVNpemUpOworICAgICAgICAgICAgICAgIGlmICgqcmV0RGF0YUJ1Zj09TlVMTCl7CisgICAgICAgICAgICAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbWVtY3B5KCpyZXREYXRhQnVmLCBzcmNfYnVmLCAqcmV0RGF0YVNpemUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBUUlVFOwogfQogCiAvKiBDb252ZXJ0IFJlZ2lzdHJ5IGRhdGEgaW50byBQeU9iamVjdCovCiBzdGF0aWMgUHlPYmplY3QgKgogUmVnMlB5KGNoYXIgKnJldERhdGFCdWYsIERXT1JEIHJldERhdGFTaXplLCBEV09SRCB0eXApCiB7Ci0JUHlPYmplY3QgKm9iRGF0YTsKKyAgICBQeU9iamVjdCAqb2JEYXRhOwogCi0Jc3dpdGNoICh0eXApIHsKLQkJY2FzZSBSRUdfRFdPUkQ6Ci0JCQlpZiAocmV0RGF0YVNpemUgPT0gMCkKLQkJCQlvYkRhdGEgPSBQeV9CdWlsZFZhbHVlKCJpIiwgMCk7Ci0JCQllbHNlCi0JCQkJb2JEYXRhID0gUHlfQnVpbGRWYWx1ZSgiaSIsCi0JCQkJCQkgICAgICAgKihpbnQgKilyZXREYXRhQnVmKTsKLQkJCWJyZWFrOwotCQljYXNlIFJFR19TWjoKLQkJY2FzZSBSRUdfRVhQQU5EX1NaOgotCQkJLyogcmV0RGF0YUJ1ZiBtYXkgb3IgbWF5IG5vdCBoYXZlIGEgdHJhaWxpbmcgTlVMTCBpbgotCQkJICAgdGhlIGJ1ZmZlci4gKi8KLQkJCWlmIChyZXREYXRhU2l6ZSAmJiByZXREYXRhQnVmW3JldERhdGFTaXplLTFdID09ICdcMCcpCi0JCQkJLS1yZXREYXRhU2l6ZTsKLQkJCWlmIChyZXREYXRhU2l6ZSA9PTApCi0JCQkJcmV0RGF0YUJ1ZiA9ICIiOwotCQkJb2JEYXRhID0gUHlVbmljb2RlX0RlY29kZU1CQ1MocmV0RGF0YUJ1ZiwKLQkJCQkJCSAgICAgIHJldERhdGFTaXplLAotCQkJCQkJICAgICAgTlVMTCk7Ci0JCQlicmVhazsKLQkJY2FzZSBSRUdfTVVMVElfU1o6Ci0JCQlpZiAocmV0RGF0YVNpemUgPT0gMCkKLQkJCQlvYkRhdGEgPSBQeUxpc3RfTmV3KDApOwotCQkJZWxzZQotCQkJewotCQkJCWludCBpbmRleCA9IDA7Ci0JCQkJaW50IHMgPSBjb3VudFN0cmluZ3MocmV0RGF0YUJ1ZiwgcmV0RGF0YVNpemUpOwotCQkJCWNoYXIgKipzdHIgPSAoY2hhciAqKiltYWxsb2Moc2l6ZW9mKGNoYXIgKikqcyk7Ci0JCQkJaWYgKHN0ciA9PSBOVUxMKQotCQkJCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICBzd2l0Y2ggKHR5cCkgeworICAgICAgICBjYXNlIFJFR19EV09SRDoKKyAgICAgICAgICAgIGlmIChyZXREYXRhU2l6ZSA9PSAwKQorICAgICAgICAgICAgICAgIG9iRGF0YSA9IFB5X0J1aWxkVmFsdWUoImkiLCAwKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBvYkRhdGEgPSBQeV9CdWlsZFZhbHVlKCJpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICooaW50ICopcmV0RGF0YUJ1Zik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSRUdfU1o6CisgICAgICAgIGNhc2UgUkVHX0VYUEFORF9TWjoKKyAgICAgICAgICAgIC8qIHJldERhdGFCdWYgbWF5IG9yIG1heSBub3QgaGF2ZSBhIHRyYWlsaW5nIE5VTEwgaW4KKyAgICAgICAgICAgICAgIHRoZSBidWZmZXIuICovCisgICAgICAgICAgICBpZiAocmV0RGF0YVNpemUgJiYgcmV0RGF0YUJ1ZltyZXREYXRhU2l6ZS0xXSA9PSAnXDAnKQorICAgICAgICAgICAgICAgIC0tcmV0RGF0YVNpemU7CisgICAgICAgICAgICBpZiAocmV0RGF0YVNpemUgPT0wKQorICAgICAgICAgICAgICAgIHJldERhdGFCdWYgPSAiIjsKKyAgICAgICAgICAgIG9iRGF0YSA9IFB5VW5pY29kZV9EZWNvZGVNQkNTKHJldERhdGFCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXREYXRhU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUkVHX01VTFRJX1NaOgorICAgICAgICAgICAgaWYgKHJldERhdGFTaXplID09IDApCisgICAgICAgICAgICAgICAgb2JEYXRhID0gUHlMaXN0X05ldygwKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSAwOworICAgICAgICAgICAgICAgIGludCBzID0gY291bnRTdHJpbmdzKHJldERhdGFCdWYsIHJldERhdGFTaXplKTsKKyAgICAgICAgICAgICAgICBjaGFyICoqc3RyID0gKGNoYXIgKiopbWFsbG9jKHNpemVvZihjaGFyICopKnMpOworICAgICAgICAgICAgICAgIGlmIChzdHIgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CiAKLQkJCQlmaXh1cE11bHRpU1ooc3RyLCByZXREYXRhQnVmLCByZXREYXRhU2l6ZSk7Ci0JCQkJb2JEYXRhID0gUHlMaXN0X05ldyhzKTsKLQkJCQlpZiAob2JEYXRhID09IE5VTEwpCi0JCQkJCXJldHVybiBOVUxMOwotCQkJCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IHM7IGluZGV4KyspCi0JCQkJewotCQkJCQlzaXplX3QgbGVuID0gX21ic3RybGVuKHN0cltpbmRleF0pOwotCQkJCQlpZiAobGVuID4gSU5UX01BWCkgewotCQkJCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0JCQkJCQkJInJlZ2lzdHJ5IHN0cmluZyBpcyB0b28gbG9uZyBmb3IgYSBQeXRob24gc3RyaW5nIik7Ci0JCQkJCQlQeV9ERUNSRUYob2JEYXRhKTsKLQkJCQkJCXJldHVybiBOVUxMOwotCQkJCQl9Ci0JCQkJCVB5TGlzdF9TZXRJdGVtKG9iRGF0YSwKLQkJCQkJCSAgICAgICBpbmRleCwKLQkJCQkJCSAgICAgICBQeVVuaWNvZGVfRGVjb2RlTUJDUygKLQkJCQkJCSAgICAgICAgICAgIChjb25zdCBjaGFyICopc3RyW2luZGV4XSwKLQkJCQkJCQkgICAoaW50KWxlbiwKLQkJCQkJCQkgICAgTlVMTCkKLQkJCQkJCSAgICAgICApOwotCQkJCX0KLQkJCQlmcmVlKHN0cik7CisgICAgICAgICAgICAgICAgZml4dXBNdWx0aVNaKHN0ciwgcmV0RGF0YUJ1ZiwgcmV0RGF0YVNpemUpOworICAgICAgICAgICAgICAgIG9iRGF0YSA9IFB5TGlzdF9OZXcocyk7CisgICAgICAgICAgICAgICAgaWYgKG9iRGF0YSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBzOyBpbmRleCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbiA9IF9tYnN0cmxlbihzdHJbaW5kZXhdKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxlbiA+IElOVF9NQVgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWdpc3RyeSBzdHJpbmcgaXMgdG9vIGxvbmcgZm9yIGEgUHl0aG9uIHN0cmluZyIpOworICAgICAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKG9iRGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBQeUxpc3RfU2V0SXRlbShvYkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfRGVjb2RlTUJDUygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhciAqKXN0cltpbmRleF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KWxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmcmVlKHN0cik7CiAKLQkJCQlicmVhazsKLQkJCX0KLQkJY2FzZSBSRUdfQklOQVJZOgotCQkvKiBBTFNPIGhhbmRsZSBBTEwgdW5rbm93biBkYXRhIHR5cGVzIGhlcmUuICBFdmVuIGlmIHdlIGNhbid0Ci0JCSAgIHN1cHBvcnQgaXQgbmF0aXZlbHksIHdlIHNob3VsZCBoYW5kbGUgdGhlIGJpdHMuICovCi0JCWRlZmF1bHQ6Ci0JCQlpZiAocmV0RGF0YVNpemUgPT0gMCkgewotCQkJCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJCQlvYkRhdGEgPSBQeV9Ob25lOwotCQkJfQotCQkJZWxzZQotCQkJCW9iRGF0YSA9IFB5X0J1aWxkVmFsdWUoInMjIiwKLQkJCQkJIAkgICAgICAgKGNoYXIgKilyZXREYXRhQnVmLAotCQkJCQkgCSAgICAgICByZXREYXRhU2l6ZSk7Ci0JCQlicmVhazsKLQl9Ci0JaWYgKG9iRGF0YSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQllbHNlCi0JCXJldHVybiBvYkRhdGE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIGNhc2UgUkVHX0JJTkFSWToKKyAgICAgICAgLyogQUxTTyBoYW5kbGUgQUxMIHVua25vd24gZGF0YSB0eXBlcyBoZXJlLiAgRXZlbiBpZiB3ZSBjYW4ndAorICAgICAgICAgICBzdXBwb3J0IGl0IG5hdGl2ZWx5LCB3ZSBzaG91bGQgaGFuZGxlIHRoZSBiaXRzLiAqLworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgaWYgKHJldERhdGFTaXplID09IDApIHsKKyAgICAgICAgICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgICAgICAgICAgb2JEYXRhID0gUHlfTm9uZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBvYkRhdGEgPSBQeV9CdWlsZFZhbHVlKCJzIyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKXJldERhdGFCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXREYXRhU2l6ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKG9iRGF0YSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBvYkRhdGE7CiB9CiAKIC8qIFRoZSBQeXRob24gbWV0aG9kcyAqLwpAQCAtOTc2LDI4MSArOTc2LDI4MSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIFB5Q2xvc2VLZXkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICpvYktleTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk86Q2xvc2VLZXkiLCAmb2JLZXkpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIVB5SEtFWV9DbG9zZShvYktleSkpCi0JCXJldHVybiBOVUxMOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeU9iamVjdCAqb2JLZXk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPOkNsb3NlS2V5IiwgJm9iS2V5KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUhLRVlfQ2xvc2Uob2JLZXkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBQeUNvbm5lY3RSZWdpc3RyeShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JSEtFWSBoS2V5OwotCVB5T2JqZWN0ICpvYktleTsKLQljaGFyICpzekNvbXBOYW1lID0gTlVMTDsKLQlIS0VZIHJldEtleTsKLQlsb25nIHJjOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiek86Q29ubmVjdFJlZ2lzdHJ5IiwgJnN6Q29tcE5hbWUsICZvYktleSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghUHlIS0VZX0FzSEtFWShvYktleSwgJmhLZXksIEZBTFNFKSkKLQkJcmV0dXJuIE5VTEw7Ci0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCXJjID0gUmVnQ29ubmVjdFJlZ2lzdHJ5KHN6Q29tcE5hbWUsIGhLZXksICZyZXRLZXkpOwotCVB5X0VORF9BTExPV19USFJFQURTCi0JaWYgKHJjICE9IEVSUk9SX1NVQ0NFU1MpCi0JCXJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0VycldpdGhGdW5jdGlvbihyYywKLQkJCQkJCQkgICAiQ29ubmVjdFJlZ2lzdHJ5Iik7Ci0JcmV0dXJuIFB5SEtFWV9Gcm9tSEtFWShyZXRLZXkpOworICAgIEhLRVkgaEtleTsKKyAgICBQeU9iamVjdCAqb2JLZXk7CisgICAgY2hhciAqc3pDb21wTmFtZSA9IE5VTEw7CisgICAgSEtFWSByZXRLZXk7CisgICAgbG9uZyByYzsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInpPOkNvbm5lY3RSZWdpc3RyeSIsICZzekNvbXBOYW1lLCAmb2JLZXkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5SEtFWV9Bc0hLRVkob2JLZXksICZoS2V5LCBGQUxTRSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICByYyA9IFJlZ0Nvbm5lY3RSZWdpc3RyeShzekNvbXBOYW1lLCBoS2V5LCAmcmV0S2V5KTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIGlmIChyYyAhPSBFUlJPUl9TVUNDRVNTKQorICAgICAgICByZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnJXaXRoRnVuY3Rpb24ocmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ29ubmVjdFJlZ2lzdHJ5Iik7CisgICAgcmV0dXJuIFB5SEtFWV9Gcm9tSEtFWShyZXRLZXkpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogUHlDcmVhdGVLZXkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCUhLRVkgaEtleTsKLQlQeU9iamVjdCAqb2JLZXk7Ci0JY2hhciAqc3ViS2V5OwotCUhLRVkgcmV0S2V5OwotCWxvbmcgcmM7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPejpDcmVhdGVLZXkiLCAmb2JLZXksICZzdWJLZXkpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIVB5SEtFWV9Bc0hLRVkob2JLZXksICZoS2V5LCBGQUxTRSkpCi0JCXJldHVybiBOVUxMOwotCXJjID0gUmVnQ3JlYXRlS2V5KGhLZXksIHN1YktleSwgJnJldEtleSk7Ci0JaWYgKHJjICE9IEVSUk9SX1NVQ0NFU1MpCi0JCXJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0VycldpdGhGdW5jdGlvbihyYywgIkNyZWF0ZUtleSIpOwotCXJldHVybiBQeUhLRVlfRnJvbUhLRVkocmV0S2V5KTsKKyAgICBIS0VZIGhLZXk7CisgICAgUHlPYmplY3QgKm9iS2V5OworICAgIGNoYXIgKnN1YktleTsKKyAgICBIS0VZIHJldEtleTsKKyAgICBsb25nIHJjOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3o6Q3JlYXRlS2V5IiwgJm9iS2V5LCAmc3ViS2V5KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUhLRVlfQXNIS0VZKG9iS2V5LCAmaEtleSwgRkFMU0UpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByYyA9IFJlZ0NyZWF0ZUtleShoS2V5LCBzdWJLZXksICZyZXRLZXkpOworICAgIGlmIChyYyAhPSBFUlJPUl9TVUNDRVNTKQorICAgICAgICByZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnJXaXRoRnVuY3Rpb24ocmMsICJDcmVhdGVLZXkiKTsKKyAgICByZXR1cm4gUHlIS0VZX0Zyb21IS0VZKHJldEtleSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBQeURlbGV0ZUtleShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JSEtFWSBoS2V5OwotCVB5T2JqZWN0ICpvYktleTsKLQljaGFyICpzdWJLZXk7Ci0JbG9uZyByYzsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9zOkRlbGV0ZUtleSIsICZvYktleSwgJnN1YktleSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghUHlIS0VZX0FzSEtFWShvYktleSwgJmhLZXksIEZBTFNFKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmMgPSBSZWdEZWxldGVLZXkoaEtleSwgc3ViS2V5ICk7Ci0JaWYgKHJjICE9IEVSUk9SX1NVQ0NFU1MpCi0JCXJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0VycldpdGhGdW5jdGlvbihyYywgIlJlZ0RlbGV0ZUtleSIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBIS0VZIGhLZXk7CisgICAgUHlPYmplY3QgKm9iS2V5OworICAgIGNoYXIgKnN1YktleTsKKyAgICBsb25nIHJjOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3M6RGVsZXRlS2V5IiwgJm9iS2V5LCAmc3ViS2V5KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUhLRVlfQXNIS0VZKG9iS2V5LCAmaEtleSwgRkFMU0UpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByYyA9IFJlZ0RlbGV0ZUtleShoS2V5LCBzdWJLZXkgKTsKKyAgICBpZiAocmMgIT0gRVJST1JfU1VDQ0VTUykKKyAgICAgICAgcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyV2l0aEZ1bmN0aW9uKHJjLCAiUmVnRGVsZXRlS2V5Iik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogUHlEZWxldGVWYWx1ZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JSEtFWSBoS2V5OwotCVB5T2JqZWN0ICpvYktleTsKLQljaGFyICpzdWJLZXk7Ci0JbG9uZyByYzsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk96OkRlbGV0ZVZhbHVlIiwgJm9iS2V5LCAmc3ViS2V5KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFQeUhLRVlfQXNIS0VZKG9iS2V5LCAmaEtleSwgRkFMU0UpKQotCQlyZXR1cm4gTlVMTDsKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JcmMgPSBSZWdEZWxldGVWYWx1ZShoS2V5LCBzdWJLZXkpOwotCVB5X0VORF9BTExPV19USFJFQURTCi0JaWYgKHJjICE9RVJST1JfU1VDQ0VTUykKLQkJcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyV2l0aEZ1bmN0aW9uKHJjLAotCQkJCQkJCSAgICJSZWdEZWxldGVWYWx1ZSIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBIS0VZIGhLZXk7CisgICAgUHlPYmplY3QgKm9iS2V5OworICAgIGNoYXIgKnN1YktleTsKKyAgICBsb25nIHJjOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3o6RGVsZXRlVmFsdWUiLCAmb2JLZXksICZzdWJLZXkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5SEtFWV9Bc0hLRVkob2JLZXksICZoS2V5LCBGQUxTRSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICByYyA9IFJlZ0RlbGV0ZVZhbHVlKGhLZXksIHN1YktleSk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBpZiAocmMgIT1FUlJPUl9TVUNDRVNTKQorICAgICAgICByZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnJXaXRoRnVuY3Rpb24ocmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVnRGVsZXRlVmFsdWUiKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBQeUVudW1LZXkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCUhLRVkgaEtleTsKLQlQeU9iamVjdCAqb2JLZXk7Ci0JaW50IGluZGV4OwotCWxvbmcgcmM7Ci0JUHlPYmplY3QgKnJldFN0cjsKLQljaGFyIHRtcGJ1ZlsyNTZdOyAvKiBtYXgga2V5IG5hbWUgbGVuZ3RoIGlzIDI1NSAqLwotCURXT1JEIGxlbiA9IHNpemVvZih0bXBidWYpOyAvKiBpbmNsdWRlcyBOVUxMIHRlcm1pbmF0b3IgKi8KKyAgICBIS0VZIGhLZXk7CisgICAgUHlPYmplY3QgKm9iS2V5OworICAgIGludCBpbmRleDsKKyAgICBsb25nIHJjOworICAgIFB5T2JqZWN0ICpyZXRTdHI7CisgICAgY2hhciB0bXBidWZbMjU2XTsgLyogbWF4IGtleSBuYW1lIGxlbmd0aCBpcyAyNTUgKi8KKyAgICBEV09SRCBsZW4gPSBzaXplb2YodG1wYnVmKTsgLyogaW5jbHVkZXMgTlVMTCB0ZXJtaW5hdG9yICovCiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9pOkVudW1LZXkiLCAmb2JLZXksICZpbmRleCkpCi0JCXJldHVybiBOVUxMOwotCWlmICghUHlIS0VZX0FzSEtFWShvYktleSwgJmhLZXksIEZBTFNFKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPaTpFbnVtS2V5IiwgJm9iS2V5LCAmaW5kZXgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5SEtFWV9Bc0hLRVkob2JLZXksICZoS2V5LCBGQUxTRSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCXJjID0gUmVnRW51bUtleUV4KGhLZXksIGluZGV4LCB0bXBidWYsICZsZW4sIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOwotCVB5X0VORF9BTExPV19USFJFQURTCi0JaWYgKHJjICE9IEVSUk9SX1NVQ0NFU1MpCi0JCXJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0VycldpdGhGdW5jdGlvbihyYywgIlJlZ0VudW1LZXlFeCIpOworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICByYyA9IFJlZ0VudW1LZXlFeChoS2V5LCBpbmRleCwgdG1wYnVmLCAmbGVuLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIGlmIChyYyAhPSBFUlJPUl9TVUNDRVNTKQorICAgICAgICByZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnJXaXRoRnVuY3Rpb24ocmMsICJSZWdFbnVtS2V5RXgiKTsKIAotCXJldFN0ciA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHRtcGJ1ZiwgbGVuKTsKLQlyZXR1cm4gcmV0U3RyOyAgLyogY2FuIGJlIE5VTEwgKi8KKyAgICByZXRTdHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSh0bXBidWYsIGxlbik7CisgICAgcmV0dXJuIHJldFN0cjsgIC8qIGNhbiBiZSBOVUxMICovCiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBQeUVudW1WYWx1ZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JSEtFWSBoS2V5OwotCVB5T2JqZWN0ICpvYktleTsKLQlpbnQgaW5kZXg7Ci0JbG9uZyByYzsKLQljaGFyICpyZXRWYWx1ZUJ1ZjsKLQljaGFyICpyZXREYXRhQnVmOwotCURXT1JEIHJldFZhbHVlU2l6ZTsKLQlEV09SRCByZXREYXRhU2l6ZTsKLQlEV09SRCB0eXA7Ci0JUHlPYmplY3QgKm9iRGF0YTsKLQlQeU9iamVjdCAqcmV0VmFsOworICAgIEhLRVkgaEtleTsKKyAgICBQeU9iamVjdCAqb2JLZXk7CisgICAgaW50IGluZGV4OworICAgIGxvbmcgcmM7CisgICAgY2hhciAqcmV0VmFsdWVCdWY7CisgICAgY2hhciAqcmV0RGF0YUJ1ZjsKKyAgICBEV09SRCByZXRWYWx1ZVNpemU7CisgICAgRFdPUkQgcmV0RGF0YVNpemU7CisgICAgRFdPUkQgdHlwOworICAgIFB5T2JqZWN0ICpvYkRhdGE7CisgICAgUHlPYmplY3QgKnJldFZhbDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT2k6RW51bVZhbHVlIiwgJm9iS2V5LCAmaW5kZXgpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIVB5SEtFWV9Bc0hLRVkob2JLZXksICZoS2V5LCBGQUxTRSkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT2k6RW51bVZhbHVlIiwgJm9iS2V5LCAmaW5kZXgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5SEtFWV9Bc0hLRVkob2JLZXksICZoS2V5LCBGQUxTRSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKChyYyA9IFJlZ1F1ZXJ5SW5mb0tleShoS2V5LCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAotCQkJCSAgTlVMTCwKLQkJCQkgICZyZXRWYWx1ZVNpemUsICZyZXREYXRhU2l6ZSwgTlVMTCwgTlVMTCkpCi0JICAgICE9IEVSUk9SX1NVQ0NFU1MpCi0JCXJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0VycldpdGhGdW5jdGlvbihyYywKLQkJCQkJCQkgICAiUmVnUXVlcnlJbmZvS2V5Iik7Ci0JKytyZXRWYWx1ZVNpemU7ICAgIC8qIGluY2x1ZGUgbnVsbCB0ZXJtaW5hdG9ycyAqLwotCSsrcmV0RGF0YVNpemU7Ci0JcmV0VmFsdWVCdWYgPSAoY2hhciAqKVB5TWVtX01hbGxvYyhyZXRWYWx1ZVNpemUpOwotCWlmIChyZXRWYWx1ZUJ1ZiA9PSBOVUxMKQotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQlyZXREYXRhQnVmID0gKGNoYXIgKilQeU1lbV9NYWxsb2MocmV0RGF0YVNpemUpOwotCWlmIChyZXREYXRhQnVmID09IE5VTEwpIHsKLQkJUHlNZW1fRnJlZShyZXRWYWx1ZUJ1Zik7Ci0JCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCX0KKyAgICBpZiAoKHJjID0gUmVnUXVlcnlJbmZvS2V5KGhLZXksIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJldFZhbHVlU2l6ZSwgJnJldERhdGFTaXplLCBOVUxMLCBOVUxMKSkKKyAgICAgICAgIT0gRVJST1JfU1VDQ0VTUykKKyAgICAgICAgcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyV2l0aEZ1bmN0aW9uKHJjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlZ1F1ZXJ5SW5mb0tleSIpOworICAgICsrcmV0VmFsdWVTaXplOyAgICAvKiBpbmNsdWRlIG51bGwgdGVybWluYXRvcnMgKi8KKyAgICArK3JldERhdGFTaXplOworICAgIHJldFZhbHVlQnVmID0gKGNoYXIgKilQeU1lbV9NYWxsb2MocmV0VmFsdWVTaXplKTsKKyAgICBpZiAocmV0VmFsdWVCdWYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgcmV0RGF0YUJ1ZiA9IChjaGFyICopUHlNZW1fTWFsbG9jKHJldERhdGFTaXplKTsKKyAgICBpZiAocmV0RGF0YUJ1ZiA9PSBOVUxMKSB7CisgICAgICAgIFB5TWVtX0ZyZWUocmV0VmFsdWVCdWYpOworICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICB9CiAKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JcmMgPSBSZWdFbnVtVmFsdWUoaEtleSwKLQkJCSAgaW5kZXgsCi0JCQkgIHJldFZhbHVlQnVmLAotCQkJICAmcmV0VmFsdWVTaXplLAotCQkJICBOVUxMLAotCQkJICAmdHlwLAotCQkJICAoQllURSAqKXJldERhdGFCdWYsCi0JCQkgICZyZXREYXRhU2l6ZSk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgcmMgPSBSZWdFbnVtVmFsdWUoaEtleSwKKyAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICByZXRWYWx1ZUJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAmcmV0VmFsdWVTaXplLAorICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgJnR5cCwKKyAgICAgICAgICAgICAgICAgICAgICAoQllURSAqKXJldERhdGFCdWYsCisgICAgICAgICAgICAgICAgICAgICAgJnJldERhdGFTaXplKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogCi0JaWYgKHJjICE9IEVSUk9SX1NVQ0NFU1MpIHsKLQkJcmV0VmFsID0gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnJXaXRoRnVuY3Rpb24ocmMsCi0JCQkJCQkJICAgICAiUHlSZWdFbnVtVmFsdWUiKTsKLQkJZ290byBmYWlsOwotCX0KLQlvYkRhdGEgPSBSZWcyUHkocmV0RGF0YUJ1ZiwgcmV0RGF0YVNpemUsIHR5cCk7Ci0JaWYgKG9iRGF0YSA9PSBOVUxMKSB7Ci0JCXJldFZhbCA9IE5VTEw7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0JcmV0VmFsID0gUHlfQnVpbGRWYWx1ZSgic09pIiwgcmV0VmFsdWVCdWYsIG9iRGF0YSwgdHlwKTsKLQlQeV9ERUNSRUYob2JEYXRhKTsKKyAgICBpZiAocmMgIT0gRVJST1JfU1VDQ0VTUykgeworICAgICAgICByZXRWYWwgPSBQeUVycl9TZXRGcm9tV2luZG93c0VycldpdGhGdW5jdGlvbihyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlB5UmVnRW51bVZhbHVlIik7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisgICAgb2JEYXRhID0gUmVnMlB5KHJldERhdGFCdWYsIHJldERhdGFTaXplLCB0eXApOworICAgIGlmIChvYkRhdGEgPT0gTlVMTCkgeworICAgICAgICByZXRWYWwgPSBOVUxMOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorICAgIHJldFZhbCA9IFB5X0J1aWxkVmFsdWUoInNPaSIsIHJldFZhbHVlQnVmLCBvYkRhdGEsIHR5cCk7CisgICAgUHlfREVDUkVGKG9iRGF0YSk7CiAgIGZhaWw6Ci0JUHlNZW1fRnJlZShyZXRWYWx1ZUJ1Zik7Ci0JUHlNZW1fRnJlZShyZXREYXRhQnVmKTsKLQlyZXR1cm4gcmV0VmFsOworICAgIFB5TWVtX0ZyZWUocmV0VmFsdWVCdWYpOworICAgIFB5TWVtX0ZyZWUocmV0RGF0YUJ1Zik7CisgICAgcmV0dXJuIHJldFZhbDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFB5RXhwYW5kRW52aXJvbm1lbnRTdHJpbmdzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeV9VTklDT0RFICpyZXRWYWx1ZSA9IE5VTEw7Ci0JUHlfVU5JQ09ERSAqc3JjOwotCURXT1JEIHJldFZhbHVlU2l6ZTsKLQlEV09SRCByYzsKLQlQeU9iamVjdCAqbzsKKyAgICBQeV9VTklDT0RFICpyZXRWYWx1ZSA9IE5VTEw7CisgICAgUHlfVU5JQ09ERSAqc3JjOworICAgIERXT1JEIHJldFZhbHVlU2l6ZTsKKyAgICBEV09SRCByYzsKKyAgICBQeU9iamVjdCAqbzsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAidTpFeHBhbmRFbnZpcm9ubWVudFN0cmluZ3MiLCAmc3JjKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ1OkV4cGFuZEVudmlyb25tZW50U3RyaW5ncyIsICZzcmMpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXJldFZhbHVlU2l6ZSA9IEV4cGFuZEVudmlyb25tZW50U3RyaW5nc1coc3JjLCByZXRWYWx1ZSwgMCk7Ci0JaWYgKHJldFZhbHVlU2l6ZSA9PSAwKSB7Ci0JCXJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0VycldpdGhGdW5jdGlvbihyZXRWYWx1ZVNpemUsCi0JCQkJCQkiRXhwYW5kRW52aXJvbm1lbnRTdHJpbmdzIik7Ci0JfQotCXJldFZhbHVlID0gKFB5X1VOSUNPREUgKilQeU1lbV9NYWxsb2MocmV0VmFsdWVTaXplICogc2l6ZW9mKFB5X1VOSUNPREUpKTsKLQlpZiAocmV0VmFsdWUgPT0gTlVMTCkgewotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQl9CisgICAgcmV0VmFsdWVTaXplID0gRXhwYW5kRW52aXJvbm1lbnRTdHJpbmdzVyhzcmMsIHJldFZhbHVlLCAwKTsKKyAgICBpZiAocmV0VmFsdWVTaXplID09IDApIHsKKyAgICAgICAgcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyV2l0aEZ1bmN0aW9uKHJldFZhbHVlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwYW5kRW52aXJvbm1lbnRTdHJpbmdzIik7CisgICAgfQorICAgIHJldFZhbHVlID0gKFB5X1VOSUNPREUgKilQeU1lbV9NYWxsb2MocmV0VmFsdWVTaXplICogc2l6ZW9mKFB5X1VOSUNPREUpKTsKKyAgICBpZiAocmV0VmFsdWUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICB9CiAKLQlyYyA9IEV4cGFuZEVudmlyb25tZW50U3RyaW5nc1coc3JjLCByZXRWYWx1ZSwgcmV0VmFsdWVTaXplKTsKLQlpZiAocmMgPT0gMCkgewotCQlQeU1lbV9GcmVlKHJldFZhbHVlKTsKLQkJcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyV2l0aEZ1bmN0aW9uKHJldFZhbHVlU2l6ZSwKLQkJCQkJCSJFeHBhbmRFbnZpcm9ubWVudFN0cmluZ3MiKTsKLQl9Ci0JbyA9IFB5VW5pY29kZV9Gcm9tVW5pY29kZShyZXRWYWx1ZSwgd2NzbGVuKHJldFZhbHVlKSk7Ci0JUHlNZW1fRnJlZShyZXRWYWx1ZSk7Ci0JcmV0dXJuIG87CisgICAgcmMgPSBFeHBhbmRFbnZpcm9ubWVudFN0cmluZ3NXKHNyYywgcmV0VmFsdWUsIHJldFZhbHVlU2l6ZSk7CisgICAgaWYgKHJjID09IDApIHsKKyAgICAgICAgUHlNZW1fRnJlZShyZXRWYWx1ZSk7CisgICAgICAgIHJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0VycldpdGhGdW5jdGlvbihyZXRWYWx1ZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGFuZEVudmlyb25tZW50U3RyaW5ncyIpOworICAgIH0KKyAgICBvID0gUHlVbmljb2RlX0Zyb21Vbmljb2RlKHJldFZhbHVlLCB3Y3NsZW4ocmV0VmFsdWUpKTsKKyAgICBQeU1lbV9GcmVlKHJldFZhbHVlKTsKKyAgICByZXR1cm4gbzsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFB5Rmx1c2hLZXkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCUhLRVkgaEtleTsKLQlQeU9iamVjdCAqb2JLZXk7Ci0JbG9uZyByYzsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk86Rmx1c2hLZXkiLCAmb2JLZXkpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIVB5SEtFWV9Bc0hLRVkob2JLZXksICZoS2V5LCBGQUxTRSkpCi0JCXJldHVybiBOVUxMOwotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlyYyA9IFJlZ0ZsdXNoS2V5KGhLZXkpOwotCVB5X0VORF9BTExPV19USFJFQURTCi0JaWYgKHJjICE9IEVSUk9SX1NVQ0NFU1MpCi0JCXJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0VycldpdGhGdW5jdGlvbihyYywgIlJlZ0ZsdXNoS2V5Iik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIEhLRVkgaEtleTsKKyAgICBQeU9iamVjdCAqb2JLZXk7CisgICAgbG9uZyByYzsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk86Rmx1c2hLZXkiLCAmb2JLZXkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5SEtFWV9Bc0hLRVkob2JLZXksICZoS2V5LCBGQUxTRSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICByYyA9IFJlZ0ZsdXNoS2V5KGhLZXkpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgaWYgKHJjICE9IEVSUk9SX1NVQ0NFU1MpCisgICAgICAgIHJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0VycldpdGhGdW5jdGlvbihyYywgIlJlZ0ZsdXNoS2V5Iik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogc3RhdGljIFB5T2JqZWN0ICoKIFB5TG9hZEtleShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JSEtFWSBoS2V5OwotCVB5T2JqZWN0ICpvYktleTsKLQljaGFyICpzdWJLZXk7Ci0JY2hhciAqZmlsZU5hbWU7CisgICAgSEtFWSBoS2V5OworICAgIFB5T2JqZWN0ICpvYktleTsKKyAgICBjaGFyICpzdWJLZXk7CisgICAgY2hhciAqZmlsZU5hbWU7CiAKLQlsb25nIHJjOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3NzOkxvYWRLZXkiLCAmb2JLZXksICZzdWJLZXksICZmaWxlTmFtZSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghUHlIS0VZX0FzSEtFWShvYktleSwgJmhLZXksIEZBTFNFKSkKLQkJcmV0dXJuIE5VTEw7Ci0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCXJjID0gUmVnTG9hZEtleShoS2V5LCBzdWJLZXksIGZpbGVOYW1lICk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQlpZiAocmMgIT0gRVJST1JfU1VDQ0VTUykKLQkJcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyV2l0aEZ1bmN0aW9uKHJjLCAiUmVnTG9hZEtleSIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIHJjOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3NzOkxvYWRLZXkiLCAmb2JLZXksICZzdWJLZXksICZmaWxlTmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHlIS0VZX0FzSEtFWShvYktleSwgJmhLZXksIEZBTFNFKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIHJjID0gUmVnTG9hZEtleShoS2V5LCBzdWJLZXksIGZpbGVOYW1lICk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBpZiAocmMgIT0gRVJST1JfU1VDQ0VTUykKKyAgICAgICAgcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyV2l0aEZ1bmN0aW9uKHJjLCAiUmVnTG9hZEtleSIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFB5T3BlbktleShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JSEtFWSBoS2V5OwotCVB5T2JqZWN0ICpvYktleTsKKyAgICBIS0VZIGhLZXk7CisgICAgUHlPYmplY3QgKm9iS2V5OwogCi0JY2hhciAqc3ViS2V5OwotCWludCByZXMgPSAwOwotCUhLRVkgcmV0S2V5OwotCWxvbmcgcmM7Ci0JUkVHU0FNIHNhbSA9IEtFWV9SRUFEOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3p8aWk6T3BlbktleSIsICZvYktleSwgJnN1YktleSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJlcywgJnNhbSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghUHlIS0VZX0FzSEtFWShvYktleSwgJmhLZXksIEZBTFNFKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgY2hhciAqc3ViS2V5OworICAgIGludCByZXMgPSAwOworICAgIEhLRVkgcmV0S2V5OworICAgIGxvbmcgcmM7CisgICAgUkVHU0FNIHNhbSA9IEtFWV9SRUFEOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3p8aWk6T3BlbktleSIsICZvYktleSwgJnN1YktleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlcywgJnNhbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHlIS0VZX0FzSEtFWShvYktleSwgJmhLZXksIEZBTFNFKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JcmMgPSBSZWdPcGVuS2V5RXgoaEtleSwgc3ViS2V5LCByZXMsIHNhbSwgJnJldEtleSk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQlpZiAocmMgIT0gRVJST1JfU1VDQ0VTUykKLQkJcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyV2l0aEZ1bmN0aW9uKHJjLCAiUmVnT3BlbktleUV4Iik7Ci0JcmV0dXJuIFB5SEtFWV9Gcm9tSEtFWShyZXRLZXkpOworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICByYyA9IFJlZ09wZW5LZXlFeChoS2V5LCBzdWJLZXksIHJlcywgc2FtLCAmcmV0S2V5KTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIGlmIChyYyAhPSBFUlJPUl9TVUNDRVNTKQorICAgICAgICByZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnJXaXRoRnVuY3Rpb24ocmMsICJSZWdPcGVuS2V5RXgiKTsKKyAgICByZXR1cm4gUHlIS0VZX0Zyb21IS0VZKHJldEtleSk7CiB9CiAKIApAQCAtMTI2NiwxOCArMTI2NiwxOCBAQAogICBQeU9iamVjdCAqbDsKICAgUHlPYmplY3QgKnJldDsKICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPOlF1ZXJ5SW5mb0tleSIsICZvYktleSkpCi0JcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIE5VTEw7CiAgIGlmICghUHlIS0VZX0FzSEtFWShvYktleSwgJmhLZXksIEZBTFNFKSkKLQlyZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gTlVMTDsKICAgaWYgKChyYyA9IFJlZ1F1ZXJ5SW5mb0tleShoS2V5LCBOVUxMLCBOVUxMLCAwLCAmblN1YktleXMsIE5VTEwsIE5VTEwsCi0JCQkgICAgJm5WYWx1ZXMsICBOVUxMLCAgTlVMTCwgTlVMTCwgJmZ0KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmblZhbHVlcywgIE5VTEwsICBOVUxMLCBOVUxMLCAmZnQpKQogICAgICAgIT0gRVJST1JfU1VDQ0VTUykKLQlyZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnJXaXRoRnVuY3Rpb24ocmMsICJSZWdRdWVyeUluZm9LZXkiKTsKKyAgICByZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnJXaXRoRnVuY3Rpb24ocmMsICJSZWdRdWVyeUluZm9LZXkiKTsKICAgbGkuTG93UGFydCA9IGZ0LmR3TG93RGF0ZVRpbWU7CiAgIGxpLkhpZ2hQYXJ0ID0gZnQuZHdIaWdoRGF0ZVRpbWU7CiAgIGwgPSBQeUxvbmdfRnJvbUxvbmdMb25nKGxpLlF1YWRQYXJ0KTsKICAgaWYgKGwgPT0gTlVMTCkKLQlyZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gTlVMTDsKICAgcmV0ID0gUHlfQnVpbGRWYWx1ZSgiaWlPIiwgblN1YktleXMsIG5WYWx1ZXMsIGwpOwogICBQeV9ERUNSRUYobCk7CiAgIHJldHVybiByZXQ7CkBAIC0xMjg2LDMzNiArMTI4NiwzMzYgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBQeVF1ZXJ5VmFsdWUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCUhLRVkgaEtleTsKLQlQeU9iamVjdCAqb2JLZXk7Ci0JY2hhciAqc3ViS2V5OwotCWxvbmcgcmM7Ci0JUHlPYmplY3QgKnJldFN0cjsKLQljaGFyICpyZXRCdWY7Ci0JbG9uZyBidWZTaXplID0gMDsKKyAgICBIS0VZIGhLZXk7CisgICAgUHlPYmplY3QgKm9iS2V5OworICAgIGNoYXIgKnN1YktleTsKKyAgICBsb25nIHJjOworICAgIFB5T2JqZWN0ICpyZXRTdHI7CisgICAgY2hhciAqcmV0QnVmOworICAgIGxvbmcgYnVmU2l6ZSA9IDA7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk96OlF1ZXJ5VmFsdWUiLCAmb2JLZXksICZzdWJLZXkpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk96OlF1ZXJ5VmFsdWUiLCAmb2JLZXksICZzdWJLZXkpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmICghUHlIS0VZX0FzSEtFWShvYktleSwgJmhLZXksIEZBTFNFKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKChyYyA9IFJlZ1F1ZXJ5VmFsdWUoaEtleSwgc3ViS2V5LCBOVUxMLCAmYnVmU2l6ZSkpCi0JICAgICE9IEVSUk9SX1NVQ0NFU1MpCi0JCXJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0VycldpdGhGdW5jdGlvbihyYywKLQkJCQkJCQkgICAiUmVnUXVlcnlWYWx1ZSIpOwotCXJldFN0ciA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGJ1ZlNpemUpOwotCWlmIChyZXRTdHIgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0QnVmID0gUHlTdHJpbmdfQVNfU1RSSU5HKHJldFN0cik7Ci0JaWYgKChyYyA9IFJlZ1F1ZXJ5VmFsdWUoaEtleSwgc3ViS2V5LCByZXRCdWYsICZidWZTaXplKSkKLQkgICAgIT0gRVJST1JfU1VDQ0VTUykgewotCQlQeV9ERUNSRUYocmV0U3RyKTsKLQkJcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyV2l0aEZ1bmN0aW9uKHJjLAotCQkJCQkJCSAgICJSZWdRdWVyeVZhbHVlIik7Ci0JfQotCV9QeVN0cmluZ19SZXNpemUoJnJldFN0ciwgc3RybGVuKHJldEJ1ZikpOwotCXJldHVybiByZXRTdHI7CisgICAgaWYgKCFQeUhLRVlfQXNIS0VZKG9iS2V5LCAmaEtleSwgRkFMU0UpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoKHJjID0gUmVnUXVlcnlWYWx1ZShoS2V5LCBzdWJLZXksIE5VTEwsICZidWZTaXplKSkKKyAgICAgICAgIT0gRVJST1JfU1VDQ0VTUykKKyAgICAgICAgcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyV2l0aEZ1bmN0aW9uKHJjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlZ1F1ZXJ5VmFsdWUiKTsKKyAgICByZXRTdHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBidWZTaXplKTsKKyAgICBpZiAocmV0U3RyID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldEJ1ZiA9IFB5U3RyaW5nX0FTX1NUUklORyhyZXRTdHIpOworICAgIGlmICgocmMgPSBSZWdRdWVyeVZhbHVlKGhLZXksIHN1YktleSwgcmV0QnVmLCAmYnVmU2l6ZSkpCisgICAgICAgICE9IEVSUk9SX1NVQ0NFU1MpIHsKKyAgICAgICAgUHlfREVDUkVGKHJldFN0cik7CisgICAgICAgIHJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0VycldpdGhGdW5jdGlvbihyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZWdRdWVyeVZhbHVlIik7CisgICAgfQorICAgIF9QeVN0cmluZ19SZXNpemUoJnJldFN0ciwgc3RybGVuKHJldEJ1ZikpOworICAgIHJldHVybiByZXRTdHI7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBQeVF1ZXJ5VmFsdWVFeChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JSEtFWSBoS2V5OwotCVB5T2JqZWN0ICpvYktleTsKLQljaGFyICp2YWx1ZU5hbWU7CisgICAgSEtFWSBoS2V5OworICAgIFB5T2JqZWN0ICpvYktleTsKKyAgICBjaGFyICp2YWx1ZU5hbWU7CiAKLQlsb25nIHJjOwotCWNoYXIgKnJldEJ1ZjsKLQlEV09SRCBidWZTaXplID0gMDsKLQlEV09SRCB0eXA7Ci0JUHlPYmplY3QgKm9iRGF0YTsKLQlQeU9iamVjdCAqcmVzdWx0OworICAgIGxvbmcgcmM7CisgICAgY2hhciAqcmV0QnVmOworICAgIERXT1JEIGJ1ZlNpemUgPSAwOworICAgIERXT1JEIHR5cDsKKyAgICBQeU9iamVjdCAqb2JEYXRhOworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk96OlF1ZXJ5VmFsdWVFeCIsICZvYktleSwgJnZhbHVlTmFtZSkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3o6UXVlcnlWYWx1ZUV4IiwgJm9iS2V5LCAmdmFsdWVOYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoIVB5SEtFWV9Bc0hLRVkob2JLZXksICZoS2V5LCBGQUxTRSkpCi0JCXJldHVybiBOVUxMOwotCWlmICgocmMgPSBSZWdRdWVyeVZhbHVlRXgoaEtleSwgdmFsdWVOYW1lLAotCQkJCSAgTlVMTCwgTlVMTCwgTlVMTCwKLQkJCQkgICZidWZTaXplKSkKLQkgICAgIT0gRVJST1JfU1VDQ0VTUykKLQkJcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyV2l0aEZ1bmN0aW9uKHJjLAotCQkJCQkJCSAgICJSZWdRdWVyeVZhbHVlRXgiKTsKLQlyZXRCdWYgPSAoY2hhciAqKVB5TWVtX01hbGxvYyhidWZTaXplKTsKLQlpZiAocmV0QnVmID09IE5VTEwpCi0JCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCWlmICgocmMgPSBSZWdRdWVyeVZhbHVlRXgoaEtleSwgdmFsdWVOYW1lLCBOVUxMLAotCQkJCSAgJnR5cCwgKEJZVEUgKilyZXRCdWYsICZidWZTaXplKSkKLQkgICAgIT0gRVJST1JfU1VDQ0VTUykgewotCQlQeU1lbV9GcmVlKHJldEJ1Zik7Ci0JCXJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0VycldpdGhGdW5jdGlvbihyYywKLQkJCQkJCQkgICAiUmVnUXVlcnlWYWx1ZUV4Iik7Ci0JfQotCW9iRGF0YSA9IFJlZzJQeShyZXRCdWYsIGJ1ZlNpemUsIHR5cCk7Ci0JUHlNZW1fRnJlZSgodm9pZCAqKXJldEJ1Zik7Ci0JaWYgKG9iRGF0YSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlyZXN1bHQgPSBQeV9CdWlsZFZhbHVlKCJPaSIsIG9iRGF0YSwgdHlwKTsKLQlQeV9ERUNSRUYob2JEYXRhKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIGlmICghUHlIS0VZX0FzSEtFWShvYktleSwgJmhLZXksIEZBTFNFKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKChyYyA9IFJlZ1F1ZXJ5VmFsdWVFeChoS2V5LCB2YWx1ZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ1ZlNpemUpKQorICAgICAgICAhPSBFUlJPUl9TVUNDRVNTKQorICAgICAgICByZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnJXaXRoRnVuY3Rpb24ocmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVnUXVlcnlWYWx1ZUV4Iik7CisgICAgcmV0QnVmID0gKGNoYXIgKilQeU1lbV9NYWxsb2MoYnVmU2l6ZSk7CisgICAgaWYgKHJldEJ1ZiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICBpZiAoKHJjID0gUmVnUXVlcnlWYWx1ZUV4KGhLZXksIHZhbHVlTmFtZSwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0eXAsIChCWVRFICopcmV0QnVmLCAmYnVmU2l6ZSkpCisgICAgICAgICE9IEVSUk9SX1NVQ0NFU1MpIHsKKyAgICAgICAgUHlNZW1fRnJlZShyZXRCdWYpOworICAgICAgICByZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnJXaXRoRnVuY3Rpb24ocmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVnUXVlcnlWYWx1ZUV4Iik7CisgICAgfQorICAgIG9iRGF0YSA9IFJlZzJQeShyZXRCdWYsIGJ1ZlNpemUsIHR5cCk7CisgICAgUHlNZW1fRnJlZSgodm9pZCAqKXJldEJ1Zik7CisgICAgaWYgKG9iRGF0YSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXN1bHQgPSBQeV9CdWlsZFZhbHVlKCJPaSIsIG9iRGF0YSwgdHlwKTsKKyAgICBQeV9ERUNSRUYob2JEYXRhKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBQeVNhdmVLZXkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCUhLRVkgaEtleTsKLQlQeU9iamVjdCAqb2JLZXk7Ci0JY2hhciAqZmlsZU5hbWU7Ci0JTFBTRUNVUklUWV9BVFRSSUJVVEVTIHBTQSA9IE5VTEw7CisgICAgSEtFWSBoS2V5OworICAgIFB5T2JqZWN0ICpvYktleTsKKyAgICBjaGFyICpmaWxlTmFtZTsKKyAgICBMUFNFQ1VSSVRZX0FUVFJJQlVURVMgcFNBID0gTlVMTDsKIAotCWxvbmcgcmM7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPczpTYXZlS2V5IiwgJm9iS2V5LCAmZmlsZU5hbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIVB5SEtFWV9Bc0hLRVkob2JLZXksICZoS2V5LCBGQUxTRSkpCi0JCXJldHVybiBOVUxMOworICAgIGxvbmcgcmM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPczpTYXZlS2V5IiwgJm9iS2V5LCAmZmlsZU5hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5SEtFWV9Bc0hLRVkob2JLZXksICZoS2V5LCBGQUxTRSkpCisgICAgICAgIHJldHVybiBOVUxMOwogLyogIE9uZSBkYXkgd2UgbWF5IGdldCBzZWN1cml0eSBpbnRvIHRoZSBjb3JlPwotCWlmICghUHlXaW5PYmplY3RfQXNTRUNVUklUWV9BVFRSSUJVVEVTKG9iU0EsICZwU0EsIFRSVUUpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5V2luT2JqZWN0X0FzU0VDVVJJVFlfQVRUUklCVVRFUyhvYlNBLCAmcFNBLCBUUlVFKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAqLwotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlyYyA9IFJlZ1NhdmVLZXkoaEtleSwgZmlsZU5hbWUsIHBTQSApOwotCVB5X0VORF9BTExPV19USFJFQURTCi0JaWYgKHJjICE9IEVSUk9SX1NVQ0NFU1MpCi0JCXJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0VycldpdGhGdW5jdGlvbihyYywgIlJlZ1NhdmVLZXkiKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIHJjID0gUmVnU2F2ZUtleShoS2V5LCBmaWxlTmFtZSwgcFNBICk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBpZiAocmMgIT0gRVJST1JfU1VDQ0VTUykKKyAgICAgICAgcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyV2l0aEZ1bmN0aW9uKHJjLCAiUmVnU2F2ZUtleSIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFB5U2V0VmFsdWUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCUhLRVkgaEtleTsKLQlQeU9iamVjdCAqb2JLZXk7Ci0JY2hhciAqc3ViS2V5OwotCWNoYXIgKnN0cjsKLQlEV09SRCB0eXA7Ci0JRFdPUkQgbGVuOwotCWxvbmcgcmM7Ci0JUHlPYmplY3QgKm9iU3RyVmFsOwotCVB5T2JqZWN0ICpvYlN1YktleTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9PaU86U2V0VmFsdWUiLAotCQkJICAgICAgJm9iS2V5LAotCQkJICAgICAgJm9iU3ViS2V5LAotCQkJICAgICAgJnR5cCwKLQkJCSAgICAgICZvYlN0clZhbCkpCi0JCXJldHVybiBOVUxMOwotCWlmICghUHlIS0VZX0FzSEtFWShvYktleSwgJmhLZXksIEZBTFNFKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKHR5cCAhPSBSRUdfU1opIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiVHlwZSBtdXN0IGJlIF93aW5yZWcuUkVHX1NaIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQkvKiBYWFggLSBuZWVkIFVuaWNvZGUgc3VwcG9ydCAqLwotCXN0ciA9IFB5U3RyaW5nX0FzU3RyaW5nKG9iU3RyVmFsKTsKLQlpZiAoc3RyID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWxlbiA9IFB5U3RyaW5nX1NpemUob2JTdHJWYWwpOwotCWlmIChvYlN1YktleSA9PSBQeV9Ob25lKQotCQlzdWJLZXkgPSBOVUxMOwotCWVsc2UgewotCQlzdWJLZXkgPSBQeVN0cmluZ19Bc1N0cmluZyhvYlN1YktleSk7Ci0JCWlmIChzdWJLZXkgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCX0KLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JcmMgPSBSZWdTZXRWYWx1ZShoS2V5LCBzdWJLZXksIFJFR19TWiwgc3RyLCBsZW4rMSk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQlpZiAocmMgIT0gRVJST1JfU1VDQ0VTUykKLQkJcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyV2l0aEZ1bmN0aW9uKHJjLCAiUmVnU2V0VmFsdWUiKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgSEtFWSBoS2V5OworICAgIFB5T2JqZWN0ICpvYktleTsKKyAgICBjaGFyICpzdWJLZXk7CisgICAgY2hhciAqc3RyOworICAgIERXT1JEIHR5cDsKKyAgICBEV09SRCBsZW47CisgICAgbG9uZyByYzsKKyAgICBQeU9iamVjdCAqb2JTdHJWYWw7CisgICAgUHlPYmplY3QgKm9iU3ViS2V5OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT09pTzpTZXRWYWx1ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZvYktleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm9iU3ViS2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdHlwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmb2JTdHJWYWwpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5SEtFWV9Bc0hLRVkob2JLZXksICZoS2V5LCBGQUxTRSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICh0eXAgIT0gUkVHX1NaKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiVHlwZSBtdXN0IGJlIF93aW5yZWcuUkVHX1NaIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICAvKiBYWFggLSBuZWVkIFVuaWNvZGUgc3VwcG9ydCAqLworICAgIHN0ciA9IFB5U3RyaW5nX0FzU3RyaW5nKG9iU3RyVmFsKTsKKyAgICBpZiAoc3RyID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGxlbiA9IFB5U3RyaW5nX1NpemUob2JTdHJWYWwpOworICAgIGlmIChvYlN1YktleSA9PSBQeV9Ob25lKQorICAgICAgICBzdWJLZXkgPSBOVUxMOworICAgIGVsc2UgeworICAgICAgICBzdWJLZXkgPSBQeVN0cmluZ19Bc1N0cmluZyhvYlN1YktleSk7CisgICAgICAgIGlmIChzdWJLZXkgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgcmMgPSBSZWdTZXRWYWx1ZShoS2V5LCBzdWJLZXksIFJFR19TWiwgc3RyLCBsZW4rMSk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBpZiAocmMgIT0gRVJST1JfU1VDQ0VTUykKKyAgICAgICAgcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyV2l0aEZ1bmN0aW9uKHJjLCAiUmVnU2V0VmFsdWUiKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBQeVNldFZhbHVlRXgoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCUhLRVkgaEtleTsKLQlQeU9iamVjdCAqb2JLZXk7Ci0JY2hhciAqdmFsdWVOYW1lOwotCVB5T2JqZWN0ICpvYlJlczsKLQlQeU9iamVjdCAqdmFsdWU7Ci0JQllURSAqZGF0YTsKLQlEV09SRCBsZW47Ci0JRFdPUkQgdHlwOworICAgIEhLRVkgaEtleTsKKyAgICBQeU9iamVjdCAqb2JLZXk7CisgICAgY2hhciAqdmFsdWVOYW1lOworICAgIFB5T2JqZWN0ICpvYlJlczsKKyAgICBQeU9iamVjdCAqdmFsdWU7CisgICAgQllURSAqZGF0YTsKKyAgICBEV09SRCBsZW47CisgICAgRFdPUkQgdHlwOwogCi0JTE9ORyByYzsKKyAgICBMT05HIHJjOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPek9pTzpTZXRWYWx1ZUV4IiwKLQkJCSAgICAgICZvYktleSwKLQkJCSAgICAgICZ2YWx1ZU5hbWUsCi0JCQkgICAgICAmb2JSZXMsCi0JCQkgICAgICAmdHlwLAotCQkJICAgICAgJnZhbHVlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFQeUhLRVlfQXNIS0VZKG9iS2V5LCAmaEtleSwgRkFMU0UpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIVB5MlJlZyh2YWx1ZSwgdHlwLCAmZGF0YSwgJmxlbikpCi0JewotCQlpZiAoIVB5RXJyX09jY3VycmVkKCkpCi0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkgIkNvdWxkIG5vdCBjb252ZXJ0IHRoZSBkYXRhIHRvIHRoZSBzcGVjaWZpZWQgdHlwZS4iKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlyYyA9IFJlZ1NldFZhbHVlRXgoaEtleSwgdmFsdWVOYW1lLCAwLCB0eXAsIGRhdGEsIGxlbik7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQlQeU1lbV9ERUwoZGF0YSk7Ci0JaWYgKHJjICE9IEVSUk9SX1NVQ0NFU1MpCi0JCXJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0VycldpdGhGdW5jdGlvbihyYywKLQkJCQkJCQkgICAiUmVnU2V0VmFsdWVFeCIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk96T2lPOlNldFZhbHVlRXgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmb2JLZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZvYlJlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnR5cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUhLRVlfQXNIS0VZKG9iS2V5LCAmaEtleSwgRkFMU0UpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5MlJlZyh2YWx1ZSwgdHlwLCAmZGF0YSwgJmxlbikpCisgICAgeworICAgICAgICBpZiAoIVB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgY29udmVydCB0aGUgZGF0YSB0byB0aGUgc3BlY2lmaWVkIHR5cGUuIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgcmMgPSBSZWdTZXRWYWx1ZUV4KGhLZXksIHZhbHVlTmFtZSwgMCwgdHlwLCBkYXRhLCBsZW4pOworICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgUHlNZW1fREVMKGRhdGEpOworICAgIGlmIChyYyAhPSBFUlJPUl9TVUNDRVNTKQorICAgICAgICByZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnJXaXRoRnVuY3Rpb24ocmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVnU2V0VmFsdWVFeCIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFB5RGlzYWJsZVJlZmxlY3Rpb25LZXkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCUhLRVkgaEtleTsKLQlQeU9iamVjdCAqb2JLZXk7Ci0JSE1PRFVMRSBoTW9kOwotCXR5cGVkZWYgTE9ORyAoV0lOQVBJICpSRFJLRnVuYykoSEtFWSk7Ci0JUkRSS0Z1bmMgcGZuID0gTlVMTDsKLQlMT05HIHJjOworICAgIEhLRVkgaEtleTsKKyAgICBQeU9iamVjdCAqb2JLZXk7CisgICAgSE1PRFVMRSBoTW9kOworICAgIHR5cGVkZWYgTE9ORyAoV0lOQVBJICpSRFJLRnVuYykoSEtFWSk7CisgICAgUkRSS0Z1bmMgcGZuID0gTlVMTDsKKyAgICBMT05HIHJjOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPOkRpc2FibGVSZWZsZWN0aW9uS2V5IiwgJm9iS2V5KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFQeUhLRVlfQXNIS0VZKG9iS2V5LCAmaEtleSwgRkFMU0UpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk86RGlzYWJsZVJlZmxlY3Rpb25LZXkiLCAmb2JLZXkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5SEtFWV9Bc0hLRVkob2JLZXksICZoS2V5LCBGQUxTRSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JLy8gT25seSBhdmFpbGFibGUgb24gNjRiaXQgcGxhdGZvcm1zLCBzbyB3ZSBtdXN0IGxvYWQgaXQKLQkvLyBkeW5hbWljYWxseS4KLQloTW9kID0gR2V0TW9kdWxlSGFuZGxlKCJhZHZhcGkzMi5kbGwiKTsKLQlpZiAoaE1vZCkKLQkJcGZuID0gKFJEUktGdW5jKUdldFByb2NBZGRyZXNzKGhNb2QsCi0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVnRGlzYWJsZVJlZmxlY3Rpb25LZXkiKTsKLQlpZiAoIXBmbikgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwKLQkJICAgICAgICAgICAgICAgICJub3QgaW1wbGVtZW50ZWQgb24gdGhpcyBwbGF0Zm9ybSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCXJjID0gKCpwZm4pKGhLZXkpOwotCVB5X0VORF9BTExPV19USFJFQURTCi0JaWYgKHJjICE9IEVSUk9SX1NVQ0NFU1MpCi0JCXJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0VycldpdGhGdW5jdGlvbihyYywKLQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZWdEaXNhYmxlUmVmbGVjdGlvbktleSIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICAvLyBPbmx5IGF2YWlsYWJsZSBvbiA2NGJpdCBwbGF0Zm9ybXMsIHNvIHdlIG11c3QgbG9hZCBpdAorICAgIC8vIGR5bmFtaWNhbGx5LgorICAgIGhNb2QgPSBHZXRNb2R1bGVIYW5kbGUoImFkdmFwaTMyLmRsbCIpOworICAgIGlmIChoTW9kKQorICAgICAgICBwZm4gPSAoUkRSS0Z1bmMpR2V0UHJvY0FkZHJlc3MoaE1vZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZWdEaXNhYmxlUmVmbGVjdGlvbktleSIpOworICAgIGlmICghcGZuKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIm5vdCBpbXBsZW1lbnRlZCBvbiB0aGlzIHBsYXRmb3JtIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgcmMgPSAoKnBmbikoaEtleSk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBpZiAocmMgIT0gRVJST1JfU1VDQ0VTUykKKyAgICAgICAgcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyV2l0aEZ1bmN0aW9uKHJjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlZ0Rpc2FibGVSZWZsZWN0aW9uS2V5Iik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogUHlFbmFibGVSZWZsZWN0aW9uS2V5KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlIS0VZIGhLZXk7Ci0JUHlPYmplY3QgKm9iS2V5OwotCUhNT0RVTEUgaE1vZDsKLQl0eXBlZGVmIExPTkcgKFdJTkFQSSAqUkVSS0Z1bmMpKEhLRVkpOwotCVJFUktGdW5jIHBmbiA9IE5VTEw7Ci0JTE9ORyByYzsKKyAgICBIS0VZIGhLZXk7CisgICAgUHlPYmplY3QgKm9iS2V5OworICAgIEhNT0RVTEUgaE1vZDsKKyAgICB0eXBlZGVmIExPTkcgKFdJTkFQSSAqUkVSS0Z1bmMpKEhLRVkpOworICAgIFJFUktGdW5jIHBmbiA9IE5VTEw7CisgICAgTE9ORyByYzsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTzpFbmFibGVSZWZsZWN0aW9uS2V5IiwgJm9iS2V5KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFQeUhLRVlfQXNIS0VZKG9iS2V5LCAmaEtleSwgRkFMU0UpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk86RW5hYmxlUmVmbGVjdGlvbktleSIsICZvYktleSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHlIS0VZX0FzSEtFWShvYktleSwgJmhLZXksIEZBTFNFKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkvLyBPbmx5IGF2YWlsYWJsZSBvbiA2NGJpdCBwbGF0Zm9ybXMsIHNvIHdlIG11c3QgbG9hZCBpdAotCS8vIGR5bmFtaWNhbGx5LgotCWhNb2QgPSBHZXRNb2R1bGVIYW5kbGUoImFkdmFwaTMyLmRsbCIpOwotCWlmIChoTW9kKQotCQlwZm4gPSAoUkVSS0Z1bmMpR2V0UHJvY0FkZHJlc3MoaE1vZCwKLQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZWdFbmFibGVSZWZsZWN0aW9uS2V5Iik7Ci0JaWYgKCFwZm4pIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsCi0JCSAgICAgICAgICAgICAgICAibm90IGltcGxlbWVudGVkIG9uIHRoaXMgcGxhdGZvcm0iKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlyYyA9ICgqcGZuKShoS2V5KTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCWlmIChyYyAhPSBFUlJPUl9TVUNDRVNTKQotCQlyZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnJXaXRoRnVuY3Rpb24ocmMsCi0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVnRW5hYmxlUmVmbGVjdGlvbktleSIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICAvLyBPbmx5IGF2YWlsYWJsZSBvbiA2NGJpdCBwbGF0Zm9ybXMsIHNvIHdlIG11c3QgbG9hZCBpdAorICAgIC8vIGR5bmFtaWNhbGx5LgorICAgIGhNb2QgPSBHZXRNb2R1bGVIYW5kbGUoImFkdmFwaTMyLmRsbCIpOworICAgIGlmIChoTW9kKQorICAgICAgICBwZm4gPSAoUkVSS0Z1bmMpR2V0UHJvY0FkZHJlc3MoaE1vZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZWdFbmFibGVSZWZsZWN0aW9uS2V5Iik7CisgICAgaWYgKCFwZm4pIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAibm90IGltcGxlbWVudGVkIG9uIHRoaXMgcGxhdGZvcm0iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICByYyA9ICgqcGZuKShoS2V5KTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIGlmIChyYyAhPSBFUlJPUl9TVUNDRVNTKQorICAgICAgICByZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnJXaXRoRnVuY3Rpb24ocmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVnRW5hYmxlUmVmbGVjdGlvbktleSIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFB5UXVlcnlSZWZsZWN0aW9uS2V5KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlIS0VZIGhLZXk7Ci0JUHlPYmplY3QgKm9iS2V5OwotCUhNT0RVTEUgaE1vZDsKLQl0eXBlZGVmIExPTkcgKFdJTkFQSSAqUlFSS0Z1bmMpKEhLRVksIEJPT0wgKik7Ci0JUlFSS0Z1bmMgcGZuID0gTlVMTDsKLQlCT09MIHJlc3VsdDsKLQlMT05HIHJjOworICAgIEhLRVkgaEtleTsKKyAgICBQeU9iamVjdCAqb2JLZXk7CisgICAgSE1PRFVMRSBoTW9kOworICAgIHR5cGVkZWYgTE9ORyAoV0lOQVBJICpSUVJLRnVuYykoSEtFWSwgQk9PTCAqKTsKKyAgICBSUVJLRnVuYyBwZm4gPSBOVUxMOworICAgIEJPT0wgcmVzdWx0OworICAgIExPTkcgcmM7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk86UXVlcnlSZWZsZWN0aW9uS2V5IiwgJm9iS2V5KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFQeUhLRVlfQXNIS0VZKG9iS2V5LCAmaEtleSwgRkFMU0UpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk86UXVlcnlSZWZsZWN0aW9uS2V5IiwgJm9iS2V5KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUhLRVlfQXNIS0VZKG9iS2V5LCAmaEtleSwgRkFMU0UpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCS8vIE9ubHkgYXZhaWxhYmxlIG9uIDY0Yml0IHBsYXRmb3Jtcywgc28gd2UgbXVzdCBsb2FkIGl0Ci0JLy8gZHluYW1pY2FsbHkuCi0JaE1vZCA9IEdldE1vZHVsZUhhbmRsZSgiYWR2YXBpMzIuZGxsIik7Ci0JaWYgKGhNb2QpCi0JCXBmbiA9IChSUVJLRnVuYylHZXRQcm9jQWRkcmVzcyhoTW9kLAotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlZ1F1ZXJ5UmVmbGVjdGlvbktleSIpOwotCWlmICghcGZuKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yLAotCQkgICAgICAgICAgICAgICAgIm5vdCBpbXBsZW1lbnRlZCBvbiB0aGlzIHBsYXRmb3JtIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JcmMgPSAoKnBmbikoaEtleSwgJnJlc3VsdCk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQlpZiAocmMgIT0gRVJST1JfU1VDQ0VTUykKLQkJcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyV2l0aEZ1bmN0aW9uKHJjLAotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlZ1F1ZXJ5UmVmbGVjdGlvbktleSIpOwotCXJldHVybiBQeUJvb2xfRnJvbUxvbmcocmMpOworICAgIC8vIE9ubHkgYXZhaWxhYmxlIG9uIDY0Yml0IHBsYXRmb3Jtcywgc28gd2UgbXVzdCBsb2FkIGl0CisgICAgLy8gZHluYW1pY2FsbHkuCisgICAgaE1vZCA9IEdldE1vZHVsZUhhbmRsZSgiYWR2YXBpMzIuZGxsIik7CisgICAgaWYgKGhNb2QpCisgICAgICAgIHBmbiA9IChSUVJLRnVuYylHZXRQcm9jQWRkcmVzcyhoTW9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlZ1F1ZXJ5UmVmbGVjdGlvbktleSIpOworICAgIGlmICghcGZuKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIm5vdCBpbXBsZW1lbnRlZCBvbiB0aGlzIHBsYXRmb3JtIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgcmMgPSAoKnBmbikoaEtleSwgJnJlc3VsdCk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBpZiAocmMgIT0gRVJST1JfU1VDQ0VTUykKKyAgICAgICAgcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyV2l0aEZ1bmN0aW9uKHJjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlZ1F1ZXJ5UmVmbGVjdGlvbktleSIpOworICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcocmMpOwogfQogCiBzdGF0aWMgc3RydWN0IFB5TWV0aG9kRGVmIHdpbnJlZ19tZXRob2RzW10gPSB7Ci0JeyJDbG9zZUtleSIsICAgICAgICAgUHlDbG9zZUtleSwgICAgICAgIE1FVEhfVkFSQVJHUywgQ2xvc2VLZXlfZG9jfSwKLQl7IkNvbm5lY3RSZWdpc3RyeSIsICBQeUNvbm5lY3RSZWdpc3RyeSwgTUVUSF9WQVJBUkdTLCBDb25uZWN0UmVnaXN0cnlfZG9jfSwKLQl7IkNyZWF0ZUtleSIsICAgICAgICBQeUNyZWF0ZUtleSwgICAgICAgTUVUSF9WQVJBUkdTLCBDcmVhdGVLZXlfZG9jfSwKLQl7IkRlbGV0ZUtleSIsICAgICAgICBQeURlbGV0ZUtleSwgICAgICAgTUVUSF9WQVJBUkdTLCBEZWxldGVLZXlfZG9jfSwKLQl7IkRlbGV0ZVZhbHVlIiwgICAgICBQeURlbGV0ZVZhbHVlLCAgICAgTUVUSF9WQVJBUkdTLCBEZWxldGVWYWx1ZV9kb2N9LAotCXsiRGlzYWJsZVJlZmxlY3Rpb25LZXkiLCBQeURpc2FibGVSZWZsZWN0aW9uS2V5LCBNRVRIX1ZBUkFSR1MsIERpc2FibGVSZWZsZWN0aW9uS2V5X2RvY30sCi0JeyJFbmFibGVSZWZsZWN0aW9uS2V5IiwgIFB5RW5hYmxlUmVmbGVjdGlvbktleSwgIE1FVEhfVkFSQVJHUywgRW5hYmxlUmVmbGVjdGlvbktleV9kb2N9LAotCXsiRW51bUtleSIsICAgICAgICAgIFB5RW51bUtleSwgICAgICAgICBNRVRIX1ZBUkFSR1MsIEVudW1LZXlfZG9jfSwKLQl7IkVudW1WYWx1ZSIsICAgICAgICBQeUVudW1WYWx1ZSwgICAgICAgTUVUSF9WQVJBUkdTLCBFbnVtVmFsdWVfZG9jfSwKLQl7IkV4cGFuZEVudmlyb25tZW50U3RyaW5ncyIsIFB5RXhwYW5kRW52aXJvbm1lbnRTdHJpbmdzLCBNRVRIX1ZBUkFSR1MsCi0JCUV4cGFuZEVudmlyb25tZW50U3RyaW5nc19kb2MgfSwKLQl7IkZsdXNoS2V5IiwgICAgICAgICBQeUZsdXNoS2V5LCAgICAgICAgTUVUSF9WQVJBUkdTLCBGbHVzaEtleV9kb2N9LAotCXsiTG9hZEtleSIsICAgICAgICAgIFB5TG9hZEtleSwgICAgICAgICBNRVRIX1ZBUkFSR1MsIExvYWRLZXlfZG9jfSwKLQl7Ik9wZW5LZXkiLCAgICAgICAgICBQeU9wZW5LZXksICAgICAgICAgTUVUSF9WQVJBUkdTLCBPcGVuS2V5X2RvY30sCi0JeyJPcGVuS2V5RXgiLCAgICAgICAgUHlPcGVuS2V5LCAgICAgICAgIE1FVEhfVkFSQVJHUywgT3BlbktleUV4X2RvY30sCi0JeyJRdWVyeVZhbHVlIiwgICAgICAgUHlRdWVyeVZhbHVlLCAgICAgIE1FVEhfVkFSQVJHUywgUXVlcnlWYWx1ZV9kb2N9LAotCXsiUXVlcnlWYWx1ZUV4IiwgICAgIFB5UXVlcnlWYWx1ZUV4LCAgICBNRVRIX1ZBUkFSR1MsIFF1ZXJ5VmFsdWVFeF9kb2N9LAotCXsiUXVlcnlJbmZvS2V5IiwgICAgIFB5UXVlcnlJbmZvS2V5LCAgICBNRVRIX1ZBUkFSR1MsIFF1ZXJ5SW5mb0tleV9kb2N9LAotCXsiUXVlcnlSZWZsZWN0aW9uS2V5IixQeVF1ZXJ5UmVmbGVjdGlvbktleSxNRVRIX1ZBUkFSR1MsIFF1ZXJ5UmVmbGVjdGlvbktleV9kb2N9LAotCXsiU2F2ZUtleSIsICAgICAgICAgIFB5U2F2ZUtleSwgICAgICAgICBNRVRIX1ZBUkFSR1MsIFNhdmVLZXlfZG9jfSwKLQl7IlNldFZhbHVlIiwgICAgICAgICBQeVNldFZhbHVlLCAgICAgICAgTUVUSF9WQVJBUkdTLCBTZXRWYWx1ZV9kb2N9LAotCXsiU2V0VmFsdWVFeCIsICAgICAgIFB5U2V0VmFsdWVFeCwgICAgICBNRVRIX1ZBUkFSR1MsIFNldFZhbHVlRXhfZG9jfSwKLQlOVUxMLAorICAgIHsiQ2xvc2VLZXkiLCAgICAgICAgIFB5Q2xvc2VLZXksICAgICAgICBNRVRIX1ZBUkFSR1MsIENsb3NlS2V5X2RvY30sCisgICAgeyJDb25uZWN0UmVnaXN0cnkiLCAgUHlDb25uZWN0UmVnaXN0cnksIE1FVEhfVkFSQVJHUywgQ29ubmVjdFJlZ2lzdHJ5X2RvY30sCisgICAgeyJDcmVhdGVLZXkiLCAgICAgICAgUHlDcmVhdGVLZXksICAgICAgIE1FVEhfVkFSQVJHUywgQ3JlYXRlS2V5X2RvY30sCisgICAgeyJEZWxldGVLZXkiLCAgICAgICAgUHlEZWxldGVLZXksICAgICAgIE1FVEhfVkFSQVJHUywgRGVsZXRlS2V5X2RvY30sCisgICAgeyJEZWxldGVWYWx1ZSIsICAgICAgUHlEZWxldGVWYWx1ZSwgICAgIE1FVEhfVkFSQVJHUywgRGVsZXRlVmFsdWVfZG9jfSwKKyAgICB7IkRpc2FibGVSZWZsZWN0aW9uS2V5IiwgUHlEaXNhYmxlUmVmbGVjdGlvbktleSwgTUVUSF9WQVJBUkdTLCBEaXNhYmxlUmVmbGVjdGlvbktleV9kb2N9LAorICAgIHsiRW5hYmxlUmVmbGVjdGlvbktleSIsICBQeUVuYWJsZVJlZmxlY3Rpb25LZXksICBNRVRIX1ZBUkFSR1MsIEVuYWJsZVJlZmxlY3Rpb25LZXlfZG9jfSwKKyAgICB7IkVudW1LZXkiLCAgICAgICAgICBQeUVudW1LZXksICAgICAgICAgTUVUSF9WQVJBUkdTLCBFbnVtS2V5X2RvY30sCisgICAgeyJFbnVtVmFsdWUiLCAgICAgICAgUHlFbnVtVmFsdWUsICAgICAgIE1FVEhfVkFSQVJHUywgRW51bVZhbHVlX2RvY30sCisgICAgeyJFeHBhbmRFbnZpcm9ubWVudFN0cmluZ3MiLCBQeUV4cGFuZEVudmlyb25tZW50U3RyaW5ncywgTUVUSF9WQVJBUkdTLAorICAgICAgICBFeHBhbmRFbnZpcm9ubWVudFN0cmluZ3NfZG9jIH0sCisgICAgeyJGbHVzaEtleSIsICAgICAgICAgUHlGbHVzaEtleSwgICAgICAgIE1FVEhfVkFSQVJHUywgRmx1c2hLZXlfZG9jfSwKKyAgICB7IkxvYWRLZXkiLCAgICAgICAgICBQeUxvYWRLZXksICAgICAgICAgTUVUSF9WQVJBUkdTLCBMb2FkS2V5X2RvY30sCisgICAgeyJPcGVuS2V5IiwgICAgICAgICAgUHlPcGVuS2V5LCAgICAgICAgIE1FVEhfVkFSQVJHUywgT3BlbktleV9kb2N9LAorICAgIHsiT3BlbktleUV4IiwgICAgICAgIFB5T3BlbktleSwgICAgICAgICBNRVRIX1ZBUkFSR1MsIE9wZW5LZXlFeF9kb2N9LAorICAgIHsiUXVlcnlWYWx1ZSIsICAgICAgIFB5UXVlcnlWYWx1ZSwgICAgICBNRVRIX1ZBUkFSR1MsIFF1ZXJ5VmFsdWVfZG9jfSwKKyAgICB7IlF1ZXJ5VmFsdWVFeCIsICAgICBQeVF1ZXJ5VmFsdWVFeCwgICAgTUVUSF9WQVJBUkdTLCBRdWVyeVZhbHVlRXhfZG9jfSwKKyAgICB7IlF1ZXJ5SW5mb0tleSIsICAgICBQeVF1ZXJ5SW5mb0tleSwgICAgTUVUSF9WQVJBUkdTLCBRdWVyeUluZm9LZXlfZG9jfSwKKyAgICB7IlF1ZXJ5UmVmbGVjdGlvbktleSIsUHlRdWVyeVJlZmxlY3Rpb25LZXksTUVUSF9WQVJBUkdTLCBRdWVyeVJlZmxlY3Rpb25LZXlfZG9jfSwKKyAgICB7IlNhdmVLZXkiLCAgICAgICAgICBQeVNhdmVLZXksICAgICAgICAgTUVUSF9WQVJBUkdTLCBTYXZlS2V5X2RvY30sCisgICAgeyJTZXRWYWx1ZSIsICAgICAgICAgUHlTZXRWYWx1ZSwgICAgICAgIE1FVEhfVkFSQVJHUywgU2V0VmFsdWVfZG9jfSwKKyAgICB7IlNldFZhbHVlRXgiLCAgICAgICBQeVNldFZhbHVlRXgsICAgICAgTUVUSF9WQVJBUkdTLCBTZXRWYWx1ZUV4X2RvY30sCisgICAgTlVMTCwKIH07CiAKIHN0YXRpYyB2b2lkCiBpbnNpbnQoUHlPYmplY3QgKiBkLCBjaGFyICogbmFtZSwgbG9uZyB2YWx1ZSkKIHsKLQlQeU9iamVjdCAqdiA9IFB5SW50X0Zyb21Mb25nKHZhbHVlKTsKLQlpZiAoIXYgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgbmFtZSwgdikpCi0JCVB5RXJyX0NsZWFyKCk7Ci0JUHlfWERFQ1JFRih2KTsKKyAgICBQeU9iamVjdCAqdiA9IFB5SW50X0Zyb21Mb25nKHZhbHVlKTsKKyAgICBpZiAoIXYgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgbmFtZSwgdikpCisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgUHlfWERFQ1JFRih2KTsKIH0KIAogI2RlZmluZSBBRERfSU5UKHZhbCkgaW5zaW50KGQsICN2YWwsIHZhbCkKQEAgLTE2MjMsODggKzE2MjMsODggQEAKIHN0YXRpYyB2b2lkCiBpbnNrZXkoUHlPYmplY3QgKiBkLCBjaGFyICogbmFtZSwgSEtFWSBrZXkpCiB7Ci0JUHlPYmplY3QgKnYgPSBQeUxvbmdfRnJvbVZvaWRQdHIoa2V5KTsKLQlpZiAoIXYgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgbmFtZSwgdikpCi0JCVB5RXJyX0NsZWFyKCk7Ci0JUHlfWERFQ1JFRih2KTsKKyAgICBQeU9iamVjdCAqdiA9IFB5TG9uZ19Gcm9tVm9pZFB0cihrZXkpOworICAgIGlmICghdiB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCBuYW1lLCB2KSkKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICBQeV9YREVDUkVGKHYpOwogfQogCiAjZGVmaW5lIEFERF9LRVkodmFsKSBpbnNrZXkoZCwgI3ZhbCwgdmFsKQogCiBQeU1PRElOSVRfRlVOQyBpbml0X3dpbnJlZyh2b2lkKQogewotCVB5T2JqZWN0ICptLCAqZDsKLQltID0gUHlfSW5pdE1vZHVsZTMoIl93aW5yZWciLCB3aW5yZWdfbWV0aG9kcywgbW9kdWxlX2RvYyk7Ci0JaWYgKG0gPT0gTlVMTCkKLQkJcmV0dXJuOwotCWQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOwotCVB5SEtFWV9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7Ci0JUHlIS0VZX1R5cGUudHBfZG9jID0gUHlIS0VZX2RvYzsKLQlQeV9JTkNSRUYoJlB5SEtFWV9UeXBlKTsKLQlpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkhLRVlUeXBlIiwKLQkJCQkgKFB5T2JqZWN0ICopJlB5SEtFWV9UeXBlKSAhPSAwKQotCQlyZXR1cm47Ci0JUHlfSU5DUkVGKFB5RXhjX1dpbmRvd3NFcnJvcik7Ci0JaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJlcnJvciIsCi0JCQkJIFB5RXhjX1dpbmRvd3NFcnJvcikgIT0gMCkKLQkJcmV0dXJuOworICAgIFB5T2JqZWN0ICptLCAqZDsKKyAgICBtID0gUHlfSW5pdE1vZHVsZTMoIl93aW5yZWciLCB3aW5yZWdfbWV0aG9kcywgbW9kdWxlX2RvYyk7CisgICAgaWYgKG0gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOworICAgIGQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOworICAgIFB5SEtFWV9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7CisgICAgUHlIS0VZX1R5cGUudHBfZG9jID0gUHlIS0VZX2RvYzsKKyAgICBQeV9JTkNSRUYoJlB5SEtFWV9UeXBlKTsKKyAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkhLRVlUeXBlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFB5T2JqZWN0ICopJlB5SEtFWV9UeXBlKSAhPSAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfSU5DUkVGKFB5RXhjX1dpbmRvd3NFcnJvcik7CisgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJlcnJvciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXhjX1dpbmRvd3NFcnJvcikgIT0gMCkKKyAgICAgICAgcmV0dXJuOwogCi0JLyogQWRkIHRoZSByZWxldmFudCBjb25zdGFudHMgKi8KLQlBRERfS0VZKEhLRVlfQ0xBU1NFU19ST09UKTsKLQlBRERfS0VZKEhLRVlfQ1VSUkVOVF9VU0VSKTsKLQlBRERfS0VZKEhLRVlfTE9DQUxfTUFDSElORSk7Ci0JQUREX0tFWShIS0VZX1VTRVJTKTsKLQlBRERfS0VZKEhLRVlfUEVSRk9STUFOQ0VfREFUQSk7CisgICAgLyogQWRkIHRoZSByZWxldmFudCBjb25zdGFudHMgKi8KKyAgICBBRERfS0VZKEhLRVlfQ0xBU1NFU19ST09UKTsKKyAgICBBRERfS0VZKEhLRVlfQ1VSUkVOVF9VU0VSKTsKKyAgICBBRERfS0VZKEhLRVlfTE9DQUxfTUFDSElORSk7CisgICAgQUREX0tFWShIS0VZX1VTRVJTKTsKKyAgICBBRERfS0VZKEhLRVlfUEVSRk9STUFOQ0VfREFUQSk7CiAjaWZkZWYgSEtFWV9DVVJSRU5UX0NPTkZJRwotCUFERF9LRVkoSEtFWV9DVVJSRU5UX0NPTkZJRyk7CisgICAgQUREX0tFWShIS0VZX0NVUlJFTlRfQ09ORklHKTsKICNlbmRpZgogI2lmZGVmIEhLRVlfRFlOX0RBVEEKLQlBRERfS0VZKEhLRVlfRFlOX0RBVEEpOworICAgIEFERF9LRVkoSEtFWV9EWU5fREFUQSk7CiAjZW5kaWYKLQlBRERfSU5UKEtFWV9RVUVSWV9WQUxVRSk7Ci0JQUREX0lOVChLRVlfU0VUX1ZBTFVFKTsKLQlBRERfSU5UKEtFWV9DUkVBVEVfU1VCX0tFWSk7Ci0JQUREX0lOVChLRVlfRU5VTUVSQVRFX1NVQl9LRVlTKTsKLQlBRERfSU5UKEtFWV9OT1RJRlkpOwotCUFERF9JTlQoS0VZX0NSRUFURV9MSU5LKTsKLQlBRERfSU5UKEtFWV9SRUFEKTsKLQlBRERfSU5UKEtFWV9XUklURSk7Ci0JQUREX0lOVChLRVlfRVhFQ1VURSk7Ci0JQUREX0lOVChLRVlfQUxMX0FDQ0VTUyk7CisgICAgQUREX0lOVChLRVlfUVVFUllfVkFMVUUpOworICAgIEFERF9JTlQoS0VZX1NFVF9WQUxVRSk7CisgICAgQUREX0lOVChLRVlfQ1JFQVRFX1NVQl9LRVkpOworICAgIEFERF9JTlQoS0VZX0VOVU1FUkFURV9TVUJfS0VZUyk7CisgICAgQUREX0lOVChLRVlfTk9USUZZKTsKKyAgICBBRERfSU5UKEtFWV9DUkVBVEVfTElOSyk7CisgICAgQUREX0lOVChLRVlfUkVBRCk7CisgICAgQUREX0lOVChLRVlfV1JJVEUpOworICAgIEFERF9JTlQoS0VZX0VYRUNVVEUpOworICAgIEFERF9JTlQoS0VZX0FMTF9BQ0NFU1MpOwogI2lmZGVmIEtFWV9XT1c2NF82NEtFWQotCUFERF9JTlQoS0VZX1dPVzY0XzY0S0VZKTsKKyAgICBBRERfSU5UKEtFWV9XT1c2NF82NEtFWSk7CiAjZW5kaWYKICNpZmRlZiBLRVlfV09XNjRfMzJLRVkKLQlBRERfSU5UKEtFWV9XT1c2NF8zMktFWSk7CisgICAgQUREX0lOVChLRVlfV09XNjRfMzJLRVkpOwogI2VuZGlmCi0JQUREX0lOVChSRUdfT1BUSU9OX1JFU0VSVkVEKTsKLQlBRERfSU5UKFJFR19PUFRJT05fTk9OX1ZPTEFUSUxFKTsKLQlBRERfSU5UKFJFR19PUFRJT05fVk9MQVRJTEUpOwotCUFERF9JTlQoUkVHX09QVElPTl9DUkVBVEVfTElOSyk7Ci0JQUREX0lOVChSRUdfT1BUSU9OX0JBQ0tVUF9SRVNUT1JFKTsKLQlBRERfSU5UKFJFR19PUFRJT05fT1BFTl9MSU5LKTsKLQlBRERfSU5UKFJFR19MRUdBTF9PUFRJT04pOwotCUFERF9JTlQoUkVHX0NSRUFURURfTkVXX0tFWSk7Ci0JQUREX0lOVChSRUdfT1BFTkVEX0VYSVNUSU5HX0tFWSk7Ci0JQUREX0lOVChSRUdfV0hPTEVfSElWRV9WT0xBVElMRSk7Ci0JQUREX0lOVChSRUdfUkVGUkVTSF9ISVZFKTsKLQlBRERfSU5UKFJFR19OT19MQVpZX0ZMVVNIKTsKLQlBRERfSU5UKFJFR19OT1RJRllfQ0hBTkdFX05BTUUpOwotCUFERF9JTlQoUkVHX05PVElGWV9DSEFOR0VfQVRUUklCVVRFUyk7Ci0JQUREX0lOVChSRUdfTk9USUZZX0NIQU5HRV9MQVNUX1NFVCk7Ci0JQUREX0lOVChSRUdfTk9USUZZX0NIQU5HRV9TRUNVUklUWSk7Ci0JQUREX0lOVChSRUdfTEVHQUxfQ0hBTkdFX0ZJTFRFUik7Ci0JQUREX0lOVChSRUdfTk9ORSk7Ci0JQUREX0lOVChSRUdfU1opOwotCUFERF9JTlQoUkVHX0VYUEFORF9TWik7Ci0JQUREX0lOVChSRUdfQklOQVJZKTsKLQlBRERfSU5UKFJFR19EV09SRCk7Ci0JQUREX0lOVChSRUdfRFdPUkRfTElUVExFX0VORElBTik7Ci0JQUREX0lOVChSRUdfRFdPUkRfQklHX0VORElBTik7Ci0JQUREX0lOVChSRUdfTElOSyk7Ci0JQUREX0lOVChSRUdfTVVMVElfU1opOwotCUFERF9JTlQoUkVHX1JFU09VUkNFX0xJU1QpOwotCUFERF9JTlQoUkVHX0ZVTExfUkVTT1VSQ0VfREVTQ1JJUFRPUik7Ci0JQUREX0lOVChSRUdfUkVTT1VSQ0VfUkVRVUlSRU1FTlRTX0xJU1QpOworICAgIEFERF9JTlQoUkVHX09QVElPTl9SRVNFUlZFRCk7CisgICAgQUREX0lOVChSRUdfT1BUSU9OX05PTl9WT0xBVElMRSk7CisgICAgQUREX0lOVChSRUdfT1BUSU9OX1ZPTEFUSUxFKTsKKyAgICBBRERfSU5UKFJFR19PUFRJT05fQ1JFQVRFX0xJTkspOworICAgIEFERF9JTlQoUkVHX09QVElPTl9CQUNLVVBfUkVTVE9SRSk7CisgICAgQUREX0lOVChSRUdfT1BUSU9OX09QRU5fTElOSyk7CisgICAgQUREX0lOVChSRUdfTEVHQUxfT1BUSU9OKTsKKyAgICBBRERfSU5UKFJFR19DUkVBVEVEX05FV19LRVkpOworICAgIEFERF9JTlQoUkVHX09QRU5FRF9FWElTVElOR19LRVkpOworICAgIEFERF9JTlQoUkVHX1dIT0xFX0hJVkVfVk9MQVRJTEUpOworICAgIEFERF9JTlQoUkVHX1JFRlJFU0hfSElWRSk7CisgICAgQUREX0lOVChSRUdfTk9fTEFaWV9GTFVTSCk7CisgICAgQUREX0lOVChSRUdfTk9USUZZX0NIQU5HRV9OQU1FKTsKKyAgICBBRERfSU5UKFJFR19OT1RJRllfQ0hBTkdFX0FUVFJJQlVURVMpOworICAgIEFERF9JTlQoUkVHX05PVElGWV9DSEFOR0VfTEFTVF9TRVQpOworICAgIEFERF9JTlQoUkVHX05PVElGWV9DSEFOR0VfU0VDVVJJVFkpOworICAgIEFERF9JTlQoUkVHX0xFR0FMX0NIQU5HRV9GSUxURVIpOworICAgIEFERF9JTlQoUkVHX05PTkUpOworICAgIEFERF9JTlQoUkVHX1NaKTsKKyAgICBBRERfSU5UKFJFR19FWFBBTkRfU1opOworICAgIEFERF9JTlQoUkVHX0JJTkFSWSk7CisgICAgQUREX0lOVChSRUdfRFdPUkQpOworICAgIEFERF9JTlQoUkVHX0RXT1JEX0xJVFRMRV9FTkRJQU4pOworICAgIEFERF9JTlQoUkVHX0RXT1JEX0JJR19FTkRJQU4pOworICAgIEFERF9JTlQoUkVHX0xJTkspOworICAgIEFERF9JTlQoUkVHX01VTFRJX1NaKTsKKyAgICBBRERfSU5UKFJFR19SRVNPVVJDRV9MSVNUKTsKKyAgICBBRERfSU5UKFJFR19GVUxMX1JFU09VUkNFX0RFU0NSSVBUT1IpOworICAgIEFERF9JTlQoUkVHX1JFU09VUkNFX1JFUVVJUkVNRU5UU19MSVNUKTsKIH0KIApkaWZmIC0tZ2l0IGEvUEMvYmRpc3Rfd2luaW5zdC9hcmNoaXZlLmggYi9QQy9iZGlzdF93aW5pbnN0L2FyY2hpdmUuaAppbmRleCAzNWQyZmQ2Li4zMWE3ODA1IDEwMDY0NAotLS0gYS9QQy9iZGlzdF93aW5pbnN0L2FyY2hpdmUuaAorKysgYi9QQy9iZGlzdF93aW5pbnN0L2FyY2hpdmUuaApAQCAtMTQsNTUgKzE0LDU1IEBACiAgKi8KIAogc3RydWN0IGVvZl9jZGlyIHsKLQlsb25nIHRhZzsJLyogbXVzdCBiZSAweDA2MDU0YjUwICovCi0Jc2hvcnQgZGlza251bTsKLQlzaG9ydCBmaXJzdGRpc2s7Ci0Jc2hvcnQgblRvdGFsQ0RpclRoaXM7Ci0Jc2hvcnQgblRvdGFsQ0RpcjsKLQlsb25nIG5CeXRlc0NEaXI7Ci0JbG9uZyBvZnNDRGlyOwotCXNob3J0IGNvbW1lbnRsZW47CisgICAgbG9uZyB0YWc7ICAgICAgICAgICAvKiBtdXN0IGJlIDB4MDYwNTRiNTAgKi8KKyAgICBzaG9ydCBkaXNrbnVtOworICAgIHNob3J0IGZpcnN0ZGlzazsKKyAgICBzaG9ydCBuVG90YWxDRGlyVGhpczsKKyAgICBzaG9ydCBuVG90YWxDRGlyOworICAgIGxvbmcgbkJ5dGVzQ0RpcjsKKyAgICBsb25nIG9mc0NEaXI7CisgICAgc2hvcnQgY29tbWVudGxlbjsKIH07CiAKIHN0cnVjdCBjZGlyIHsKLQlsb25nIHRhZzsJLyogbXVzdCBiZSAweDAyMDE0YjUwICovCi0Jc2hvcnQgdmVyc2lvbl9tYWRlOwotCXNob3J0IHZlcnNpb25fZXh0cmFjdDsKLQlzaG9ydCBncF9iaXRmbGFnOwotCXNob3J0IGNvbXBfbWV0aG9kOwotCXNob3J0IGxhc3RfbW9kX2ZpbGVfdGltZTsKLQlzaG9ydCBsYXN0X21vZF9maWxlX2RhdGU7Ci0JbG9uZyBjcmMzMjsKLQlsb25nIGNvbXBfc2l6ZTsKLQlsb25nIHVuY29tcF9zaXplOwotCXNob3J0IGZuYW1lX2xlbmd0aDsKLQlzaG9ydCBleHRyYV9sZW5ndGg7Ci0Jc2hvcnQgY29tbWVudF9sZW5ndGg7Ci0Jc2hvcnQgZGlza251bV9zdGFydDsKLQlzaG9ydCBpbnRfZmlsZV9hdHRyOwotCWxvbmcgZXh0X2ZpbGVfYXR0cjsKLQlsb25nIG9mc19sb2NhbF9oZWFkZXI7CisgICAgbG9uZyB0YWc7ICAgICAgICAgICAvKiBtdXN0IGJlIDB4MDIwMTRiNTAgKi8KKyAgICBzaG9ydCB2ZXJzaW9uX21hZGU7CisgICAgc2hvcnQgdmVyc2lvbl9leHRyYWN0OworICAgIHNob3J0IGdwX2JpdGZsYWc7CisgICAgc2hvcnQgY29tcF9tZXRob2Q7CisgICAgc2hvcnQgbGFzdF9tb2RfZmlsZV90aW1lOworICAgIHNob3J0IGxhc3RfbW9kX2ZpbGVfZGF0ZTsKKyAgICBsb25nIGNyYzMyOworICAgIGxvbmcgY29tcF9zaXplOworICAgIGxvbmcgdW5jb21wX3NpemU7CisgICAgc2hvcnQgZm5hbWVfbGVuZ3RoOworICAgIHNob3J0IGV4dHJhX2xlbmd0aDsKKyAgICBzaG9ydCBjb21tZW50X2xlbmd0aDsKKyAgICBzaG9ydCBkaXNrbnVtX3N0YXJ0OworICAgIHNob3J0IGludF9maWxlX2F0dHI7CisgICAgbG9uZyBleHRfZmlsZV9hdHRyOworICAgIGxvbmcgb2ZzX2xvY2FsX2hlYWRlcjsKIH07CiAKIHN0cnVjdCBmaGRyIHsKLQlsb25nIHRhZzsJLyogbXVzdCBiZSAweDA0MDM0YjUwICovCi0Jc2hvcnQgdmVyc2lvbl9uZWVkZWQ7Ci0Jc2hvcnQgZmxhZ3M7Ci0Jc2hvcnQgbWV0aG9kOwotCXNob3J0IGxhc3RfbW9kX2ZpbGVfdGltZTsKLQlzaG9ydCBsYXN0X21vZF9maWxlX2RhdGU7Ci0JbG9uZyBjcmMzMjsKLQlsb25nIGNvbXBfc2l6ZTsKLQlsb25nIHVuY29tcF9zaXplOwotCXNob3J0IGZuYW1lX2xlbmd0aDsKLQlzaG9ydCBleHRyYV9sZW5ndGg7CisgICAgbG9uZyB0YWc7ICAgICAgICAgICAvKiBtdXN0IGJlIDB4MDQwMzRiNTAgKi8KKyAgICBzaG9ydCB2ZXJzaW9uX25lZWRlZDsKKyAgICBzaG9ydCBmbGFnczsKKyAgICBzaG9ydCBtZXRob2Q7CisgICAgc2hvcnQgbGFzdF9tb2RfZmlsZV90aW1lOworICAgIHNob3J0IGxhc3RfbW9kX2ZpbGVfZGF0ZTsKKyAgICBsb25nIGNyYzMyOworICAgIGxvbmcgY29tcF9zaXplOworICAgIGxvbmcgdW5jb21wX3NpemU7CisgICAgc2hvcnQgZm5hbWVfbGVuZ3RoOworICAgIHNob3J0IGV4dHJhX2xlbmd0aDsKIH07CiAKIAogc3RydWN0IG1ldGFfZGF0YV9oZHIgewotCWludCB0YWc7Ci0JaW50IHVuY29tcF9zaXplOwotCWludCBiaXRtYXBfc2l6ZTsKKyAgICBpbnQgdGFnOworICAgIGludCB1bmNvbXBfc2l6ZTsKKyAgICBpbnQgYml0bWFwX3NpemU7CiB9OwogCiAjcHJhZ21hIHBhY2soKQpAQCAtNzAsMjkgKzcwLDI5IEBACiAvKiBpbnN0YWxsYXRpb24gc2NoZW1lICovCiAKIHR5cGVkZWYgc3RydWN0IHRhZ1NDSEVNRSB7Ci0JY2hhciAqbmFtZTsKLQljaGFyICpwcmVmaXg7CisgICAgY2hhciAqbmFtZTsKKyAgICBjaGFyICpwcmVmaXg7CiB9IFNDSEVNRTsKIAogdHlwZWRlZiBpbnQgKCpOT1RJRllQUk9DKShpbnQgY29kZSwgTFBTVFIgdGV4dCwgLi4uKTsKIAogZXh0ZXJuIEJPT0wKIGV4dHJhY3RfZmlsZShjaGFyICpkc3QsIGNoYXIgKnNyYywgaW50IG1ldGhvZCwgaW50IGNvbXBfc2l6ZSwKLQkgICAgIGludCB1bmNvbXBfc2l6ZSwgTk9USUZZUFJPQyBub3RpZnkpOworICAgICAgICAgICAgIGludCB1bmNvbXBfc2l6ZSwgTk9USUZZUFJPQyBub3RpZnkpOwogCiBleHRlcm4gQk9PTAogdW56aXBfYXJjaGl2ZShTQ0hFTUUgKnNjaGVtZSwgY2hhciAqZGlybmFtZSwgY2hhciAqZGF0YSwKLQkgICAgICBEV09SRCBzaXplLCAgTk9USUZZUFJPQyBub3RpZnkpOworICAgICAgICAgICAgICBEV09SRCBzaXplLCAgTk9USUZZUFJPQyBub3RpZnkpOwogCiBleHRlcm4gY2hhciAqCiBtYXBfbmV3X2ZpbGUoRFdPUkQgZmxhZ3MsIGNoYXIgKmZpbGVuYW1lLCBjaGFyCi0JICAgICAqcGF0aG5hbWVfcGFydCwgaW50IHNpemUsCi0JICAgICBXT1JEIHdGYXREYXRlLCBXT1JEIHdGYXRUaW1lLAotCSAgICAgTk9USUZZUFJPQyBjYWxsYmFjayk7CisgICAgICAgICAgICAgKnBhdGhuYW1lX3BhcnQsIGludCBzaXplLAorICAgICAgICAgICAgIFdPUkQgd0ZhdERhdGUsIFdPUkQgd0ZhdFRpbWUsCisgICAgICAgICAgICAgTk9USUZZUFJPQyBjYWxsYmFjayk7CiAKIGV4dGVybiBCT09MCiBlbnN1cmVfZGlyZWN0b3J5IChjaGFyICpwYXRobmFtZSwgY2hhciAqbmV3X3BhcnQsCi0JCSAgTk9USUZZUFJPQyBjYWxsYmFjayk7CisgICAgICAgICAgICAgICAgICBOT1RJRllQUk9DIGNhbGxiYWNrKTsKIAogLyogY29kZXMgZm9yIE5PSVRJRllQUk9DICovCiAjZGVmaW5lIERJUl9DUkVBVEVEIDEKZGlmZiAtLWdpdCBhL1BDL2JkaXN0X3dpbmluc3QvZXh0cmFjdC5jIGIvUEMvYmRpc3Rfd2luaW5zdC9leHRyYWN0LmMKaW5kZXggYjQ5NWUxYy4uZmMyZDJiOSAxMDA2NDQKLS0tIGEvUEMvYmRpc3Rfd2luaW5zdC9leHRyYWN0LmMKKysrIGIvUEMvYmRpc3Rfd2luaW5zdC9leHRyYWN0LmMKQEAgLTE5LDE4MSArMTksMTgxIEBACiAvKiBDb252ZXJ0IHVuaXgtcGF0aCB0byBkb3MtcGF0aCAqLwogc3RhdGljIHZvaWQgbm9ybXBhdGgoY2hhciAqcGF0aCkKIHsKLQl3aGlsZSAocGF0aCAmJiAqcGF0aCkgewotCQlpZiAoKnBhdGggPT0gJy8nKQotCQkJKnBhdGggPSAnXFwnOwotCQkrK3BhdGg7Ci0JfQorICAgIHdoaWxlIChwYXRoICYmICpwYXRoKSB7CisgICAgICAgIGlmICgqcGF0aCA9PSAnLycpCisgICAgICAgICAgICAqcGF0aCA9ICdcXCc7CisgICAgICAgICsrcGF0aDsKKyAgICB9CiB9CiAKIEJPT0wgZW5zdXJlX2RpcmVjdG9yeShjaGFyICpwYXRobmFtZSwgY2hhciAqbmV3X3BhcnQsIE5PVElGWVBST0Mgbm90aWZ5KQogewotCXdoaWxlIChuZXdfcGFydCAmJiAqbmV3X3BhcnQgJiYgKG5ld19wYXJ0ID0gc3RyY2hyKG5ld19wYXJ0LCAnXFwnKSkpIHsKLQkJRFdPUkQgYXR0cjsKLQkJKm5ld19wYXJ0ID0gJ1wwJzsKLQkJYXR0ciA9IEdldEZpbGVBdHRyaWJ1dGVzKHBhdGhuYW1lKTsKLQkJaWYgKGF0dHIgPT0gLTEpIHsKLQkJCS8qIG5vdGhpbmcgZm91bmQgKi8KLQkJCWlmICghQ3JlYXRlRGlyZWN0b3J5KHBhdGhuYW1lLCBOVUxMKSAmJiBub3RpZnkpCi0JCQkJbm90aWZ5KFNZU1RFTV9FUlJPUiwKLQkJCQkgICAgICAgIkNyZWF0ZURpcmVjdG9yeSAoJXMpIiwgcGF0aG5hbWUpOwotCQkJZWxzZQotCQkJCW5vdGlmeShESVJfQ1JFQVRFRCwgcGF0aG5hbWUpOwotCQl9Ci0JCWlmIChhdHRyICYgRklMRV9BVFRSSUJVVEVfRElSRUNUT1JZKSB7Ci0JCQk7Ci0JCX0gZWxzZSB7Ci0JCQlTZXRMYXN0RXJyb3IoMTgzKTsKLQkJCWlmIChub3RpZnkpCi0JCQkJbm90aWZ5KFNZU1RFTV9FUlJPUiwKLQkJCQkgICAgICAgIkNyZWF0ZURpcmVjdG9yeSAoJXMpIiwgcGF0aG5hbWUpOwotCQl9Ci0JCSpuZXdfcGFydCA9ICdcXCc7Ci0JCSsrbmV3X3BhcnQ7Ci0JfQotCXJldHVybiBUUlVFOworICAgIHdoaWxlIChuZXdfcGFydCAmJiAqbmV3X3BhcnQgJiYgKG5ld19wYXJ0ID0gc3RyY2hyKG5ld19wYXJ0LCAnXFwnKSkpIHsKKyAgICAgICAgRFdPUkQgYXR0cjsKKyAgICAgICAgKm5ld19wYXJ0ID0gJ1wwJzsKKyAgICAgICAgYXR0ciA9IEdldEZpbGVBdHRyaWJ1dGVzKHBhdGhuYW1lKTsKKyAgICAgICAgaWYgKGF0dHIgPT0gLTEpIHsKKyAgICAgICAgICAgIC8qIG5vdGhpbmcgZm91bmQgKi8KKyAgICAgICAgICAgIGlmICghQ3JlYXRlRGlyZWN0b3J5KHBhdGhuYW1lLCBOVUxMKSAmJiBub3RpZnkpCisgICAgICAgICAgICAgICAgbm90aWZ5KFNZU1RFTV9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIkNyZWF0ZURpcmVjdG9yeSAoJXMpIiwgcGF0aG5hbWUpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG5vdGlmeShESVJfQ1JFQVRFRCwgcGF0aG5hbWUpOworICAgICAgICB9CisgICAgICAgIGlmIChhdHRyICYgRklMRV9BVFRSSUJVVEVfRElSRUNUT1JZKSB7CisgICAgICAgICAgICA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBTZXRMYXN0RXJyb3IoMTgzKTsKKyAgICAgICAgICAgIGlmIChub3RpZnkpCisgICAgICAgICAgICAgICAgbm90aWZ5KFNZU1RFTV9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIkNyZWF0ZURpcmVjdG9yeSAoJXMpIiwgcGF0aG5hbWUpOworICAgICAgICB9CisgICAgICAgICpuZXdfcGFydCA9ICdcXCc7CisgICAgICAgICsrbmV3X3BhcnQ7CisgICAgfQorICAgIHJldHVybiBUUlVFOwogfQogCiAvKiBYWFggU2hvdWxkIGJldHRlciBleHBsaWNpdGVseSBzcGVjaWZ5CiAgKiB1bmNvbXBfc2l6ZSBhbmQgZmlsZV90aW1lcyBpbnN0ZWFkIG9mIHBmaGRyIQogICovCiBjaGFyICptYXBfbmV3X2ZpbGUoRFdPUkQgZmxhZ3MsIGNoYXIgKmZpbGVuYW1lLAotCQkgICBjaGFyICpwYXRobmFtZV9wYXJ0LCBpbnQgc2l6ZSwKLQkJICAgV09SRCB3RmF0RGF0ZSwgV09SRCB3RmF0VGltZSwKLQkJICAgTk9USUZZUFJPQyBub3RpZnkpCisgICAgICAgICAgICAgICAgICAgY2hhciAqcGF0aG5hbWVfcGFydCwgaW50IHNpemUsCisgICAgICAgICAgICAgICAgICAgV09SRCB3RmF0RGF0ZSwgV09SRCB3RmF0VGltZSwKKyAgICAgICAgICAgICAgICAgICBOT1RJRllQUk9DIG5vdGlmeSkKIHsKLQlIQU5ETEUgaEZpbGUsIGhGaWxlTWFwcGluZzsKLQljaGFyICpkc3Q7Ci0JRklMRVRJTUUgZnQ7CisgICAgSEFORExFIGhGaWxlLCBoRmlsZU1hcHBpbmc7CisgICAgY2hhciAqZHN0OworICAgIEZJTEVUSU1FIGZ0OwogCiAgIHRyeV9hZ2FpbjoKLQlpZiAoIWZsYWdzKQotCQlmbGFncyA9IENSRUFURV9ORVc7Ci0JaEZpbGUgPSBDcmVhdGVGaWxlKGZpbGVuYW1lLAotCQkJICAgR0VORVJJQ19XUklURSB8IEdFTkVSSUNfUkVBRCwKLQkJCSAgIDAsIE5VTEwsCi0JCQkgICBmbGFncywKLQkJCSAgIEZJTEVfQVRUUklCVVRFX05PUk1BTCwgTlVMTCk7Ci0JaWYgKGhGaWxlID09IElOVkFMSURfSEFORExFX1ZBTFVFKSB7Ci0JCURXT1JEIHggPSBHZXRMYXN0RXJyb3IoKTsKLQkJc3dpdGNoICh4KSB7Ci0JCWNhc2UgRVJST1JfRklMRV9FWElTVFM6Ci0JCQlpZiAobm90aWZ5ICYmIG5vdGlmeShDQU5fT1ZFUldSSVRFLCBmaWxlbmFtZSkpCi0JCQkJaEZpbGUgPSBDcmVhdGVGaWxlKGZpbGVuYW1lLAotCQkJCQkJICAgR0VORVJJQ19XUklURXxHRU5FUklDX1JFQUQsCi0JCQkJCQkgICAwLCBOVUxMLAotCQkJCQkJICAgQ1JFQVRFX0FMV0FZUywKLQkJCQkJCSAgIEZJTEVfQVRUUklCVVRFX05PUk1BTCwKLQkJCQkJCSAgIE5VTEwpOwotCQkJZWxzZSB7Ci0JCQkJaWYgKG5vdGlmeSkKLQkJCQkJbm90aWZ5KEZJTEVfT1ZFUldSSVRURU4sIGZpbGVuYW1lKTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIEVSUk9SX1BBVEhfTk9UX0ZPVU5EOgotCQkJaWYgKGVuc3VyZV9kaXJlY3RvcnkoZmlsZW5hbWUsIHBhdGhuYW1lX3BhcnQsIG5vdGlmeSkpCi0JCQkJZ290byB0cnlfYWdhaW47Ci0JCQllbHNlCi0JCQkJcmV0dXJuIEZBTFNFOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlTZXRMYXN0RXJyb3IoeCk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlpZiAoaEZpbGUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKLQkJaWYgKG5vdGlmeSkKLQkJCW5vdGlmeSAoU1lTVEVNX0VSUk9SLCAiQ3JlYXRlRmlsZSAoJXMpIiwgZmlsZW5hbWUpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKCFmbGFncykKKyAgICAgICAgZmxhZ3MgPSBDUkVBVEVfTkVXOworICAgIGhGaWxlID0gQ3JlYXRlRmlsZShmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgR0VORVJJQ19XUklURSB8IEdFTkVSSUNfUkVBRCwKKyAgICAgICAgICAgICAgICAgICAgICAgMCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgIEZJTEVfQVRUUklCVVRFX05PUk1BTCwgTlVMTCk7CisgICAgaWYgKGhGaWxlID09IElOVkFMSURfSEFORExFX1ZBTFVFKSB7CisgICAgICAgIERXT1JEIHggPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgc3dpdGNoICh4KSB7CisgICAgICAgIGNhc2UgRVJST1JfRklMRV9FWElTVFM6CisgICAgICAgICAgICBpZiAobm90aWZ5ICYmIG5vdGlmeShDQU5fT1ZFUldSSVRFLCBmaWxlbmFtZSkpCisgICAgICAgICAgICAgICAgaEZpbGUgPSBDcmVhdGVGaWxlKGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRU5FUklDX1dSSVRFfEdFTkVSSUNfUkVBRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1JFQVRFX0FMV0FZUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklMRV9BVFRSSUJVVEVfTk9STUFMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChub3RpZnkpCisgICAgICAgICAgICAgICAgICAgIG5vdGlmeShGSUxFX09WRVJXUklUVEVOLCBmaWxlbmFtZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFUlJPUl9QQVRIX05PVF9GT1VORDoKKyAgICAgICAgICAgIGlmIChlbnN1cmVfZGlyZWN0b3J5KGZpbGVuYW1lLCBwYXRobmFtZV9wYXJ0LCBub3RpZnkpKQorICAgICAgICAgICAgICAgIGdvdG8gdHJ5X2FnYWluOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgU2V0TGFzdEVycm9yKHgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGhGaWxlID09IElOVkFMSURfSEFORExFX1ZBTFVFKSB7CisgICAgICAgIGlmIChub3RpZnkpCisgICAgICAgICAgICBub3RpZnkgKFNZU1RFTV9FUlJPUiwgIkNyZWF0ZUZpbGUgKCVzKSIsIGZpbGVuYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaWYgKG5vdGlmeSkKLQkJbm90aWZ5KEZJTEVfQ1JFQVRFRCwgZmlsZW5hbWUpOworICAgIGlmIChub3RpZnkpCisgICAgICAgIG5vdGlmeShGSUxFX0NSRUFURUQsIGZpbGVuYW1lKTsKIAotCURvc0RhdGVUaW1lVG9GaWxlVGltZSh3RmF0RGF0ZSwgd0ZhdFRpbWUsICZmdCk7Ci0JU2V0RmlsZVRpbWUoaEZpbGUsICZmdCwgJmZ0LCAmZnQpOworICAgIERvc0RhdGVUaW1lVG9GaWxlVGltZSh3RmF0RGF0ZSwgd0ZhdFRpbWUsICZmdCk7CisgICAgU2V0RmlsZVRpbWUoaEZpbGUsICZmdCwgJmZ0LCAmZnQpOwogCiAKLQlpZiAoc2l6ZSA9PSAwKSB7Ci0JCS8qIFdlIGNhbm5vdCBtYXAgYSB6ZXJvLWxlbmd0aCBmaWxlIChBbHNvIGl0IG1ha2VzCi0JCSAgIG5vIHNlbnNlICovCi0JCUNsb3NlSGFuZGxlKGhGaWxlKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChzaXplID09IDApIHsKKyAgICAgICAgLyogV2UgY2Fubm90IG1hcCBhIHplcm8tbGVuZ3RoIGZpbGUgKEFsc28gaXQgbWFrZXMKKyAgICAgICAgICAgbm8gc2Vuc2UgKi8KKyAgICAgICAgQ2xvc2VIYW5kbGUoaEZpbGUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQloRmlsZU1hcHBpbmcgPSBDcmVhdGVGaWxlTWFwcGluZyhoRmlsZSwKLQkJCQkJIE5VTEwsIFBBR0VfUkVBRFdSSVRFLCAwLCBzaXplLCBOVUxMKTsKKyAgICBoRmlsZU1hcHBpbmcgPSBDcmVhdGVGaWxlTWFwcGluZyhoRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBQQUdFX1JFQURXUklURSwgMCwgc2l6ZSwgTlVMTCk7CiAKLQlDbG9zZUhhbmRsZShoRmlsZSk7CisgICAgQ2xvc2VIYW5kbGUoaEZpbGUpOwogCi0JaWYgKGhGaWxlTWFwcGluZyA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgewotCQlpZiAobm90aWZ5KQotCQkJbm90aWZ5KFNZU1RFTV9FUlJPUiwKLQkJCSAgICAgICAiQ3JlYXRlRmlsZU1hcHBpbmcgKCVzKSIsIGZpbGVuYW1lKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChoRmlsZU1hcHBpbmcgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKKyAgICAgICAgaWYgKG5vdGlmeSkKKyAgICAgICAgICAgIG5vdGlmeShTWVNURU1fRVJST1IsCisgICAgICAgICAgICAgICAgICAgIkNyZWF0ZUZpbGVNYXBwaW5nICglcykiLCBmaWxlbmFtZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWRzdCA9IE1hcFZpZXdPZkZpbGUoaEZpbGVNYXBwaW5nLAotCQkJICAgIEZJTEVfTUFQX1dSSVRFLCAwLCAwLCAwKTsKKyAgICBkc3QgPSBNYXBWaWV3T2ZGaWxlKGhGaWxlTWFwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgIEZJTEVfTUFQX1dSSVRFLCAwLCAwLCAwKTsKIAotCUNsb3NlSGFuZGxlKGhGaWxlTWFwcGluZyk7CisgICAgQ2xvc2VIYW5kbGUoaEZpbGVNYXBwaW5nKTsKIAotCWlmICghZHN0KSB7Ci0JCWlmIChub3RpZnkpCi0JCQlub3RpZnkoU1lTVEVNX0VSUk9SLCAiTWFwVmlld09mRmlsZSAoJXMpIiwgZmlsZW5hbWUpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIGRzdDsKKyAgICBpZiAoIWRzdCkgeworICAgICAgICBpZiAobm90aWZ5KQorICAgICAgICAgICAgbm90aWZ5KFNZU1RFTV9FUlJPUiwgIk1hcFZpZXdPZkZpbGUgKCVzKSIsIGZpbGVuYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBkc3Q7CiB9CiAKIAogQk9PTAogZXh0cmFjdF9maWxlKGNoYXIgKmRzdCwgY2hhciAqc3JjLCBpbnQgbWV0aG9kLCBpbnQgY29tcF9zaXplLAotCSAgICAgaW50IHVuY29tcF9zaXplLCBOT1RJRllQUk9DIG5vdGlmeSkKKyAgICAgICAgICAgICBpbnQgdW5jb21wX3NpemUsIE5PVElGWVBST0Mgbm90aWZ5KQogewotCXpfc3RyZWFtIHpzdHJlYW07Ci0JaW50IHJlc3VsdDsKKyAgICB6X3N0cmVhbSB6c3RyZWFtOworICAgIGludCByZXN1bHQ7CiAKLQlpZiAobWV0aG9kID09IFpfREVGTEFURUQpIHsKLQkJaW50IHg7Ci0JCW1lbXNldCgmenN0cmVhbSwgMCwgc2l6ZW9mKHpzdHJlYW0pKTsKLQkJenN0cmVhbS5uZXh0X2luID0gc3JjOwotCQl6c3RyZWFtLmF2YWlsX2luID0gY29tcF9zaXplKzE7Ci0JCXpzdHJlYW0ubmV4dF9vdXQgPSBkc3Q7Ci0JCXpzdHJlYW0uYXZhaWxfb3V0ID0gdW5jb21wX3NpemU7CisgICAgaWYgKG1ldGhvZCA9PSBaX0RFRkxBVEVEKSB7CisgICAgICAgIGludCB4OworICAgICAgICBtZW1zZXQoJnpzdHJlYW0sIDAsIHNpemVvZih6c3RyZWFtKSk7CisgICAgICAgIHpzdHJlYW0ubmV4dF9pbiA9IHNyYzsKKyAgICAgICAgenN0cmVhbS5hdmFpbF9pbiA9IGNvbXBfc2l6ZSsxOworICAgICAgICB6c3RyZWFtLm5leHRfb3V0ID0gZHN0OworICAgICAgICB6c3RyZWFtLmF2YWlsX291dCA9IHVuY29tcF9zaXplOwogCiAvKiBBcHBhcmVudGx5IGFuIHVuZG9jdW1lbnRlZCBmZWF0dXJlIG9mIHpsaWI6IFNldCB3aW5kb3dzaXplCiAgICB0byBuZWdhdGl2ZSB2YWx1ZXMgdG8gc3VwcmVzcyB0aGUgZ3ppcCBoZWFkZXIgYW5kIGJlIGNvbXBhdGlibGUgd2l0aAogICAgemlwISAqLwotCQlyZXN1bHQgPSBUUlVFOwotCQlpZiAoWl9PSyAhPSAoeCA9IGluZmxhdGVJbml0MigmenN0cmVhbSwgLTE1KSkpIHsKLQkJCWlmIChub3RpZnkpCi0JCQkJbm90aWZ5KFpMSUJfRVJST1IsCi0JCQkJICAgICAgICJpbmZsYXRlSW5pdDIgcmV0dXJucyAlZCIsIHgpOwotCQkJcmVzdWx0ID0gRkFMU0U7Ci0JCQlnb3RvIGNsZWFudXA7Ci0JCX0KLQkJaWYgKFpfU1RSRUFNX0VORCAhPSAoeCA9IGluZmxhdGUoJnpzdHJlYW0sIFpfRklOSVNIKSkpIHsKLQkJCWlmIChub3RpZnkpCi0JCQkJbm90aWZ5KFpMSUJfRVJST1IsCi0JCQkJICAgICAgICJpbmZsYXRlIHJldHVybnMgJWQiLCB4KTsKLQkJCXJlc3VsdCA9IEZBTFNFOwotCQl9Ci0JICBjbGVhbnVwOgotCQlpZiAoWl9PSyAhPSAoeCA9IGluZmxhdGVFbmQoJnpzdHJlYW0pKSkgewotCQkJaWYgKG5vdGlmeSkKLQkJCQlub3RpZnkgKFpMSUJfRVJST1IsCi0JCQkJCSJpbmZsYXRlRW5kIHJldHVybnMgJWQiLCB4KTsKLQkJCXJlc3VsdCA9IEZBTFNFOwotCQl9Ci0JfSBlbHNlIGlmIChtZXRob2QgPT0gMCkgewotCQltZW1jcHkoZHN0LCBzcmMsIHVuY29tcF9zaXplKTsKLQkJcmVzdWx0ID0gVFJVRTsKLQl9IGVsc2UKLQkJcmVzdWx0ID0gRkFMU0U7Ci0JVW5tYXBWaWV3T2ZGaWxlKGRzdCk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgcmVzdWx0ID0gVFJVRTsKKyAgICAgICAgaWYgKFpfT0sgIT0gKHggPSBpbmZsYXRlSW5pdDIoJnpzdHJlYW0sIC0xNSkpKSB7CisgICAgICAgICAgICBpZiAobm90aWZ5KQorICAgICAgICAgICAgICAgIG5vdGlmeShaTElCX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiaW5mbGF0ZUluaXQyIHJldHVybnMgJWQiLCB4KTsKKyAgICAgICAgICAgIHJlc3VsdCA9IEZBTFNFOworICAgICAgICAgICAgZ290byBjbGVhbnVwOworICAgICAgICB9CisgICAgICAgIGlmIChaX1NUUkVBTV9FTkQgIT0gKHggPSBpbmZsYXRlKCZ6c3RyZWFtLCBaX0ZJTklTSCkpKSB7CisgICAgICAgICAgICBpZiAobm90aWZ5KQorICAgICAgICAgICAgICAgIG5vdGlmeShaTElCX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiaW5mbGF0ZSByZXR1cm5zICVkIiwgeCk7CisgICAgICAgICAgICByZXN1bHQgPSBGQUxTRTsKKyAgICAgICAgfQorICAgICAgY2xlYW51cDoKKyAgICAgICAgaWYgKFpfT0sgIT0gKHggPSBpbmZsYXRlRW5kKCZ6c3RyZWFtKSkpIHsKKyAgICAgICAgICAgIGlmIChub3RpZnkpCisgICAgICAgICAgICAgICAgbm90aWZ5IChaTElCX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAiaW5mbGF0ZUVuZCByZXR1cm5zICVkIiwgeCk7CisgICAgICAgICAgICByZXN1bHQgPSBGQUxTRTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAobWV0aG9kID09IDApIHsKKyAgICAgICAgbWVtY3B5KGRzdCwgc3JjLCB1bmNvbXBfc2l6ZSk7CisgICAgICAgIHJlc3VsdCA9IFRSVUU7CisgICAgfSBlbHNlCisgICAgICAgIHJlc3VsdCA9IEZBTFNFOworICAgIFVubWFwVmlld09mRmlsZShkc3QpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIC8qIE9wZW4gYSB6aXAtY29tcGF0aWJsZSBhcmNoaXZlIGFuZCBleHRyYWN0IGFsbCBmaWxlcwpAQCAtMjAxLDEyMSArMjAxLDEyMSBAQAogICovCiBCT09MCiB1bnppcF9hcmNoaXZlKFNDSEVNRSAqc2NoZW1lLCBjaGFyICpkaXJuYW1lLCBjaGFyICpkYXRhLCBEV09SRCBzaXplLAotCSAgICAgIE5PVElGWVBST0Mgbm90aWZ5KQorICAgICAgICAgICAgICBOT1RJRllQUk9DIG5vdGlmeSkKIHsKLQlpbnQgbjsKLQljaGFyIHBhdGhuYW1lW01BWF9QQVRIXTsKLQljaGFyICpuZXdfcGFydDsKKyAgICBpbnQgbjsKKyAgICBjaGFyIHBhdGhuYW1lW01BWF9QQVRIXTsKKyAgICBjaGFyICpuZXdfcGFydDsKIAotCS8qIHJlYWQgdGhlIGVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeSByZWNvcmQgKi8KLQlzdHJ1Y3QgZW9mX2NkaXIgKnBlID0gKHN0cnVjdCBlb2ZfY2RpciAqKSZkYXRhW3NpemUgLSBzaXplb2YKLQkJCQkJCSAgICAgICAoc3RydWN0IGVvZl9jZGlyKV07CisgICAgLyogcmVhZCB0aGUgZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5IHJlY29yZCAqLworICAgIHN0cnVjdCBlb2ZfY2RpciAqcGUgPSAoc3RydWN0IGVvZl9jZGlyICopJmRhdGFbc2l6ZSAtIHNpemVvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cnVjdCBlb2ZfY2RpcildOwogCi0JaW50IGFyY19zdGFydCA9IHNpemUgLSBzaXplb2YgKHN0cnVjdCBlb2ZfY2RpcikgLSBwZS0+bkJ5dGVzQ0RpciAtCi0JCXBlLT5vZnNDRGlyOworICAgIGludCBhcmNfc3RhcnQgPSBzaXplIC0gc2l6ZW9mIChzdHJ1Y3QgZW9mX2NkaXIpIC0gcGUtPm5CeXRlc0NEaXIgLQorICAgICAgICBwZS0+b2ZzQ0RpcjsKIAotCS8qIHNldCBwb3NpdGlvbiB0byBzdGFydCBvZiBjZW50cmFsIGRpcmVjdG9yeSAqLwotCWludCBwb3MgPSBhcmNfc3RhcnQgKyBwZS0+b2ZzQ0RpcjsKKyAgICAvKiBzZXQgcG9zaXRpb24gdG8gc3RhcnQgb2YgY2VudHJhbCBkaXJlY3RvcnkgKi8KKyAgICBpbnQgcG9zID0gYXJjX3N0YXJ0ICsgcGUtPm9mc0NEaXI7CiAKLQkvKiBtYWtlIHN1cmUgdGhpcyBpcyBhIHppcCBmaWxlICovCi0JaWYgKHBlLT50YWcgIT0gMHgwNjA1NGI1MCkKLQkJcmV0dXJuIEZBTFNFOwotICAgIAotCS8qIExvb3AgdGhyb3VnaCB0aGUgY2VudHJhbCBkaXJlY3RvcnksIHJlYWRpbmcgYWxsIGVudHJpZXMgKi8KLQlmb3IgKG4gPSAwOyBuIDwgcGUtPm5Ub3RhbENEaXI7ICsrbikgewotCQlpbnQgaTsKLQkJY2hhciAqZm5hbWU7Ci0JCWNoYXIgKnBjb21wOwotCQljaGFyICpkc3Q7Ci0JCXN0cnVjdCBjZGlyICpwY2RpcjsKLQkJc3RydWN0IGZoZHIgKnBmaGRyOworICAgIC8qIG1ha2Ugc3VyZSB0aGlzIGlzIGEgemlwIGZpbGUgKi8KKyAgICBpZiAocGUtPnRhZyAhPSAweDA2MDU0YjUwKQorICAgICAgICByZXR1cm4gRkFMU0U7CiAKLQkJcGNkaXIgPSAoc3RydWN0IGNkaXIgKikmZGF0YVtwb3NdOwotCQlwZmhkciA9IChzdHJ1Y3QgZmhkciAqKSZkYXRhW3BjZGlyLT5vZnNfbG9jYWxfaGVhZGVyICsKLQkJCQkJICAgICBhcmNfc3RhcnRdOworICAgIC8qIExvb3AgdGhyb3VnaCB0aGUgY2VudHJhbCBkaXJlY3RvcnksIHJlYWRpbmcgYWxsIGVudHJpZXMgKi8KKyAgICBmb3IgKG4gPSAwOyBuIDwgcGUtPm5Ub3RhbENEaXI7ICsrbikgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgY2hhciAqZm5hbWU7CisgICAgICAgIGNoYXIgKnBjb21wOworICAgICAgICBjaGFyICpkc3Q7CisgICAgICAgIHN0cnVjdCBjZGlyICpwY2RpcjsKKyAgICAgICAgc3RydWN0IGZoZHIgKnBmaGRyOwogCi0JCWlmIChwY2Rpci0+dGFnICE9IDB4MDIwMTRiNTApCi0JCQlyZXR1cm4gRkFMU0U7Ci0JCWlmIChwZmhkci0+dGFnICE9IDB4MDQwMzRiNTApCi0JCQlyZXR1cm4gRkFMU0U7Ci0JCXBvcyArPSBzaXplb2Yoc3RydWN0IGNkaXIpOwotCQlmbmFtZSA9IChjaGFyICopJmRhdGFbcG9zXTsgLyogVGhpcyBpcyBub3QgbnVsbCB0ZXJtaW5hdGVkISAqLwotCQlwb3MgKz0gcGNkaXItPmZuYW1lX2xlbmd0aCArIHBjZGlyLT5leHRyYV9sZW5ndGggKwotCQkJcGNkaXItPmNvbW1lbnRfbGVuZ3RoOworICAgICAgICBwY2RpciA9IChzdHJ1Y3QgY2RpciAqKSZkYXRhW3Bvc107CisgICAgICAgIHBmaGRyID0gKHN0cnVjdCBmaGRyICopJmRhdGFbcGNkaXItPm9mc19sb2NhbF9oZWFkZXIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyY19zdGFydF07CiAKLQkJcGNvbXAgPSAmZGF0YVtwY2Rpci0+b2ZzX2xvY2FsX2hlYWRlcgotCQkJICAgICAgKyBzaXplb2Yoc3RydWN0IGZoZHIpCi0JCQkgICAgICArIGFyY19zdGFydAotCQkJICAgICAgKyBwZmhkci0+Zm5hbWVfbGVuZ3RoCi0JCQkgICAgICArIHBmaGRyLT5leHRyYV9sZW5ndGhdOworICAgICAgICBpZiAocGNkaXItPnRhZyAhPSAweDAyMDE0YjUwKQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAocGZoZHItPnRhZyAhPSAweDA0MDM0YjUwKQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICBwb3MgKz0gc2l6ZW9mKHN0cnVjdCBjZGlyKTsKKyAgICAgICAgZm5hbWUgPSAoY2hhciAqKSZkYXRhW3Bvc107IC8qIFRoaXMgaXMgbm90IG51bGwgdGVybWluYXRlZCEgKi8KKyAgICAgICAgcG9zICs9IHBjZGlyLT5mbmFtZV9sZW5ndGggKyBwY2Rpci0+ZXh0cmFfbGVuZ3RoICsKKyAgICAgICAgICAgIHBjZGlyLT5jb21tZW50X2xlbmd0aDsKIAotCQkvKiBkaXJuYW1lIGlzIHRoZSBQeXRob24gaG9tZSBkaXJlY3RvcnkgKHByZWZpeCkgKi8KLQkJc3RyY3B5KHBhdGhuYW1lLCBkaXJuYW1lKTsKLQkJaWYgKHBhdGhuYW1lW3N0cmxlbihwYXRobmFtZSktMV0gIT0gJ1xcJykKLQkJCXN0cmNhdChwYXRobmFtZSwgIlxcIik7Ci0JCW5ld19wYXJ0ID0gJnBhdGhuYW1lW2xzdHJsZW4ocGF0aG5hbWUpXTsKLQkJLyogd2UgbXVzdCBub3cgbWF0Y2ggdGhlIGZpcnN0IHBhcnQgb2YgdGhlIHBhdGhuYW1lCi0JCSAqIGluIHRoZSBhcmNoaXZlIHRvIGEgY29tcG9uZW50IGluIHRoZSBpbnN0YWxsYXRpb24KLQkJICogc2NoZW1lIChQVVJFTElCLCBQTEFUTElCLCBIRUFERVJTLCBTQ1JJUFRTLCBvciBEQVRBKQotCQkgKiBhbmQgcmVwbGFjZSB0aGlzIHBhcnQgYnkgdGhlIG9uZSBpbiB0aGUgc2NoZW1lIHRvIHVzZQotCQkgKi8KLQkJZm9yIChpID0gMDsgc2NoZW1lW2ldLm5hbWU7ICsraSkgewotCQkJaWYgKDAgPT0gc3RybmljbXAoc2NoZW1lW2ldLm5hbWUsIGZuYW1lLAotCQkJCQkgIHN0cmxlbihzY2hlbWVbaV0ubmFtZSkpKSB7Ci0JCQkJY2hhciAqcmVzdDsKLQkJCQlpbnQgbGVuOwotCQkJCQotCQkJCS8qIGxlbmd0aCBvZiB0aGUgcmVwbGFjZWQgcGFydCAqLwotCQkJCWludCBuYW1lbGVuID0gc3RybGVuKHNjaGVtZVtpXS5uYW1lKTsKLQkJCQkKLQkJCQlzdHJjYXQocGF0aG5hbWUsIHNjaGVtZVtpXS5wcmVmaXgpOwotCQkJCQotCQkJCXJlc3QgPSBmbmFtZSArIG5hbWVsZW47Ci0JCQkJbGVuID0gcGZoZHItPmZuYW1lX2xlbmd0aCAtIG5hbWVsZW47Ci0JCQkJCi0JCQkJaWYgKChwYXRobmFtZVtzdHJsZW4ocGF0aG5hbWUpLTFdICE9ICdcXCcpCi0JCQkJICAgICYmIChwYXRobmFtZVtzdHJsZW4ocGF0aG5hbWUpLTFdICE9ICcvJykpCi0JCQkJCXN0cmNhdChwYXRobmFtZSwgIlxcIik7Ci0JCQkJLyogTm93IHRoYXQgcGF0aG5hbWUgZW5kcyB3aXRoIGEgc2VwYXJhdG9yLAotCQkJCSAqIHdlIG11c3QgbWFrZSBzdXJlIHJlc3QgZG9lcyBub3Qgc3RhcnQgd2l0aAotCQkJCSAqIGFuIGFkZGl0aW9uYWwgb25lLgotCQkJCSAqLwotCQkJCWlmICgocmVzdFswXSA9PSAnXFwnKSB8fCAocmVzdFswXSA9PSAnLycpKSB7Ci0JCQkJCSsrcmVzdDsKLQkJCQkJLS1sZW47Ci0JCQkJfQorICAgICAgICBwY29tcCA9ICZkYXRhW3BjZGlyLT5vZnNfbG9jYWxfaGVhZGVyCisgICAgICAgICAgICAgICAgICAgICAgKyBzaXplb2Yoc3RydWN0IGZoZHIpCisgICAgICAgICAgICAgICAgICAgICAgKyBhcmNfc3RhcnQKKyAgICAgICAgICAgICAgICAgICAgICArIHBmaGRyLT5mbmFtZV9sZW5ndGgKKyAgICAgICAgICAgICAgICAgICAgICArIHBmaGRyLT5leHRyYV9sZW5ndGhdOwogCi0JCQkJc3RybmNhdChwYXRobmFtZSwgcmVzdCwgbGVuKTsKLQkJCQlnb3RvIERvbmU7Ci0JCQl9Ci0JCX0KLQkJLyogbm8gcHJlZml4IHRvIHJlcGxhY2UgZm91bmQsIGdvIHVuY2hhbmdlZCAqLwotCQlzdHJuY2F0KHBhdGhuYW1lLCBmbmFtZSwgcGZoZHItPmZuYW1lX2xlbmd0aCk7Ci0JICBEb25lOgotCQlub3JtcGF0aChwYXRobmFtZSk7Ci0JCWlmIChwYXRobmFtZVtzdHJsZW4ocGF0aG5hbWUpLTFdICE9ICdcXCcpIHsKLQkJCS8qCi0JCQkgKiBUaGUgbG9jYWwgZmlsZSBoZWFkZXIgKHBmaGRyKSBkb2VzIG5vdCBhbHdheXMKLQkJCSAqIGNvbnRhaW4gdGhlIGNvbXByZXNzZWQgYW5kIHVuY29tcHJlc3NlZCBzaXplcyBvZgotCQkJICogdGhlIGRhdGEgZGVwZW5kaW5nIG9uIGJpdCAzIG9mIHRoZSBmbGFncyBmaWVsZC4gIFNvCi0JCQkgKiBpdCBzZWVtcyBiZXR0ZXIgdG8gdXNlIHRoZSBkYXRhIGZyb20gdGhlIGNlbnRyYWwKLQkJCSAqIGRpcmVjdG9yeSAocGNkaXIpLgotCQkJICovCi0JCQlkc3QgPSBtYXBfbmV3X2ZpbGUoMCwgcGF0aG5hbWUsIG5ld19wYXJ0LAotCQkJCQkgICBwY2Rpci0+dW5jb21wX3NpemUsCi0JCQkJCSAgIHBjZGlyLT5sYXN0X21vZF9maWxlX2RhdGUsCi0JCQkJCSAgIHBjZGlyLT5sYXN0X21vZF9maWxlX3RpbWUsIG5vdGlmeSk7Ci0JCQlpZiAoZHN0KSB7Ci0JCQkJaWYgKCFleHRyYWN0X2ZpbGUoZHN0LCBwY29tcCwgcGZoZHItPm1ldGhvZCwKLQkJCQkJCSAgcGNkaXItPmNvbXBfc2l6ZSwKLQkJCQkJCSAgcGNkaXItPnVuY29tcF9zaXplLAotCQkJCQkJICBub3RpZnkpKQotCQkJCQlyZXR1cm4gRkFMU0U7Ci0JCQl9IC8qIGVsc2UgPz8/ICovCi0JCX0KLQkJaWYgKG5vdGlmeSkKLQkJCW5vdGlmeShOVU1fRklMRVMsIG5ld19wYXJ0LCAoaW50KXBlLT5uVG90YWxDRGlyLAotCQkJICAgICAgIChpbnQpbisxKTsKLQl9Ci0JcmV0dXJuIFRSVUU7CisgICAgICAgIC8qIGRpcm5hbWUgaXMgdGhlIFB5dGhvbiBob21lIGRpcmVjdG9yeSAocHJlZml4KSAqLworICAgICAgICBzdHJjcHkocGF0aG5hbWUsIGRpcm5hbWUpOworICAgICAgICBpZiAocGF0aG5hbWVbc3RybGVuKHBhdGhuYW1lKS0xXSAhPSAnXFwnKQorICAgICAgICAgICAgc3RyY2F0KHBhdGhuYW1lLCAiXFwiKTsKKyAgICAgICAgbmV3X3BhcnQgPSAmcGF0aG5hbWVbbHN0cmxlbihwYXRobmFtZSldOworICAgICAgICAvKiB3ZSBtdXN0IG5vdyBtYXRjaCB0aGUgZmlyc3QgcGFydCBvZiB0aGUgcGF0aG5hbWUKKyAgICAgICAgICogaW4gdGhlIGFyY2hpdmUgdG8gYSBjb21wb25lbnQgaW4gdGhlIGluc3RhbGxhdGlvbgorICAgICAgICAgKiBzY2hlbWUgKFBVUkVMSUIsIFBMQVRMSUIsIEhFQURFUlMsIFNDUklQVFMsIG9yIERBVEEpCisgICAgICAgICAqIGFuZCByZXBsYWNlIHRoaXMgcGFydCBieSB0aGUgb25lIGluIHRoZSBzY2hlbWUgdG8gdXNlCisgICAgICAgICAqLworICAgICAgICBmb3IgKGkgPSAwOyBzY2hlbWVbaV0ubmFtZTsgKytpKSB7CisgICAgICAgICAgICBpZiAoMCA9PSBzdHJuaWNtcChzY2hlbWVbaV0ubmFtZSwgZm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJsZW4oc2NoZW1lW2ldLm5hbWUpKSkgeworICAgICAgICAgICAgICAgIGNoYXIgKnJlc3Q7CisgICAgICAgICAgICAgICAgaW50IGxlbjsKKworICAgICAgICAgICAgICAgIC8qIGxlbmd0aCBvZiB0aGUgcmVwbGFjZWQgcGFydCAqLworICAgICAgICAgICAgICAgIGludCBuYW1lbGVuID0gc3RybGVuKHNjaGVtZVtpXS5uYW1lKTsKKworICAgICAgICAgICAgICAgIHN0cmNhdChwYXRobmFtZSwgc2NoZW1lW2ldLnByZWZpeCk7CisKKyAgICAgICAgICAgICAgICByZXN0ID0gZm5hbWUgKyBuYW1lbGVuOworICAgICAgICAgICAgICAgIGxlbiA9IHBmaGRyLT5mbmFtZV9sZW5ndGggLSBuYW1lbGVuOworCisgICAgICAgICAgICAgICAgaWYgKChwYXRobmFtZVtzdHJsZW4ocGF0aG5hbWUpLTFdICE9ICdcXCcpCisgICAgICAgICAgICAgICAgICAgICYmIChwYXRobmFtZVtzdHJsZW4ocGF0aG5hbWUpLTFdICE9ICcvJykpCisgICAgICAgICAgICAgICAgICAgIHN0cmNhdChwYXRobmFtZSwgIlxcIik7CisgICAgICAgICAgICAgICAgLyogTm93IHRoYXQgcGF0aG5hbWUgZW5kcyB3aXRoIGEgc2VwYXJhdG9yLAorICAgICAgICAgICAgICAgICAqIHdlIG11c3QgbWFrZSBzdXJlIHJlc3QgZG9lcyBub3Qgc3RhcnQgd2l0aAorICAgICAgICAgICAgICAgICAqIGFuIGFkZGl0aW9uYWwgb25lLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmICgocmVzdFswXSA9PSAnXFwnKSB8fCAocmVzdFswXSA9PSAnLycpKSB7CisgICAgICAgICAgICAgICAgICAgICsrcmVzdDsKKyAgICAgICAgICAgICAgICAgICAgLS1sZW47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3RybmNhdChwYXRobmFtZSwgcmVzdCwgbGVuKTsKKyAgICAgICAgICAgICAgICBnb3RvIERvbmU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyogbm8gcHJlZml4IHRvIHJlcGxhY2UgZm91bmQsIGdvIHVuY2hhbmdlZCAqLworICAgICAgICBzdHJuY2F0KHBhdGhuYW1lLCBmbmFtZSwgcGZoZHItPmZuYW1lX2xlbmd0aCk7CisgICAgICBEb25lOgorICAgICAgICBub3JtcGF0aChwYXRobmFtZSk7CisgICAgICAgIGlmIChwYXRobmFtZVtzdHJsZW4ocGF0aG5hbWUpLTFdICE9ICdcXCcpIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBUaGUgbG9jYWwgZmlsZSBoZWFkZXIgKHBmaGRyKSBkb2VzIG5vdCBhbHdheXMKKyAgICAgICAgICAgICAqIGNvbnRhaW4gdGhlIGNvbXByZXNzZWQgYW5kIHVuY29tcHJlc3NlZCBzaXplcyBvZgorICAgICAgICAgICAgICogdGhlIGRhdGEgZGVwZW5kaW5nIG9uIGJpdCAzIG9mIHRoZSBmbGFncyBmaWVsZC4gIFNvCisgICAgICAgICAgICAgKiBpdCBzZWVtcyBiZXR0ZXIgdG8gdXNlIHRoZSBkYXRhIGZyb20gdGhlIGNlbnRyYWwKKyAgICAgICAgICAgICAqIGRpcmVjdG9yeSAocGNkaXIpLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBkc3QgPSBtYXBfbmV3X2ZpbGUoMCwgcGF0aG5hbWUsIG5ld19wYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjZGlyLT51bmNvbXBfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY2Rpci0+bGFzdF9tb2RfZmlsZV9kYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjZGlyLT5sYXN0X21vZF9maWxlX3RpbWUsIG5vdGlmeSk7CisgICAgICAgICAgICBpZiAoZHN0KSB7CisgICAgICAgICAgICAgICAgaWYgKCFleHRyYWN0X2ZpbGUoZHN0LCBwY29tcCwgcGZoZHItPm1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY2Rpci0+Y29tcF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjZGlyLT51bmNvbXBfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnkpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9IC8qIGVsc2UgPz8/ICovCisgICAgICAgIH0KKyAgICAgICAgaWYgKG5vdGlmeSkKKyAgICAgICAgICAgIG5vdGlmeShOVU1fRklMRVMsIG5ld19wYXJ0LCAoaW50KXBlLT5uVG90YWxDRGlyLAorICAgICAgICAgICAgICAgICAgIChpbnQpbisxKTsKKyAgICB9CisgICAgcmV0dXJuIFRSVUU7CiB9CmRpZmYgLS1naXQgYS9QQy9iZGlzdF93aW5pbnN0L2luc3RhbGwuYyBiL1BDL2JkaXN0X3dpbmluc3QvaW5zdGFsbC5jCmluZGV4IGFlOGQwZGIuLmQ1NDcyZWYgMTAwNjQ0Ci0tLSBhL1BDL2JkaXN0X3dpbmluc3QvaW5zdGFsbC5jCisrKyBiL1BDL2JkaXN0X3dpbmluc3QvaW5zdGFsbC5jCkBAIC0yMCwyMSArMjAsMjEgQEAKICAqCiAgKiBBdCBydW50aW1lLCB0aGUgZXhlZmlsZSBoYXMgYXBwZW5kZWQ6CiAgKiAtIGNvbXByZXNzZWQgc2V0dXAtZGF0YSBpbiBpbmktZm9ybWF0LCBjb250YWluaW5nIHRoZSBmb2xsb3dpbmcgc2VjdGlvbnM6Ci0gKglbbWV0YWRhdGFdCi0gKglhdXRob3I9R3JlZyBXYXJkCi0gKglhdXRob3JfZW1haWw9Z3dhcmRAcHl0aG9uLm5ldAotICoJZGVzY3JpcHRpb249UHl0aG9uIERpc3RyaWJ1dGlvbiBVdGlsaXRpZXMKLSAqCWxpY2VuY2U9UHl0aG9uCi0gKgluYW1lPURpc3R1dGlscwotICoJdXJsPWh0dHA6Ly93d3cucHl0aG9uLm9yZy9zaWdzL2Rpc3R1dGlscy1zaWcvCi0gKgl2ZXJzaW9uPTAuOXByZQorICogICAgICBbbWV0YWRhdGFdCisgKiAgICAgIGF1dGhvcj1HcmVnIFdhcmQKKyAqICAgICAgYXV0aG9yX2VtYWlsPWd3YXJkQHB5dGhvbi5uZXQKKyAqICAgICAgZGVzY3JpcHRpb249UHl0aG9uIERpc3RyaWJ1dGlvbiBVdGlsaXRpZXMKKyAqICAgICAgbGljZW5jZT1QeXRob24KKyAqICAgICAgbmFtZT1EaXN0dXRpbHMKKyAqICAgICAgdXJsPWh0dHA6Ly93d3cucHl0aG9uLm9yZy9zaWdzL2Rpc3R1dGlscy1zaWcvCisgKiAgICAgIHZlcnNpb249MC45cHJlCiAgKgotICoJW1NldHVwXQotICoJaW5mbz0gdGV4dCB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIGVkaXQtYm94Ci0gKgl0aXRsZT0gdG8gYmUgZGlzcGxheWVkIGJ5IHRoaXMgcHJvZ3JhbQotICoJdGFyZ2V0X3ZlcnNpb24gPSBpZiBwcmVzZW50LCBweXRob24gdmVyc2lvbiByZXF1aXJlZAotICoJcHljX2NvbXBpbGUgPSBpZiAwLCBkbyBub3QgY29tcGlsZSBweSB0byBweWMKLSAqCXB5b19jb21waWxlID0gaWYgMCwgZG8gbm90IGNvbXBpbGUgcHkgdG8gcHlvCisgKiAgICAgIFtTZXR1cF0KKyAqICAgICAgaW5mbz0gdGV4dCB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIGVkaXQtYm94CisgKiAgICAgIHRpdGxlPSB0byBiZSBkaXNwbGF5ZWQgYnkgdGhpcyBwcm9ncmFtCisgKiAgICAgIHRhcmdldF92ZXJzaW9uID0gaWYgcHJlc2VudCwgcHl0aG9uIHZlcnNpb24gcmVxdWlyZWQKKyAqICAgICAgcHljX2NvbXBpbGUgPSBpZiAwLCBkbyBub3QgY29tcGlsZSBweSB0byBweWMKKyAqICAgICAgcHlvX2NvbXBpbGUgPSBpZiAwLCBkbyBub3QgY29tcGlsZSBweSB0byBweW8KICAqCiAgKiAtIGEgc3RydWN0IG1ldGFfZGF0YV9oZHIsIGRlc2NyaWJpbmcgdGhlIGFib3ZlCiAgKiAtIGEgemlwLWZpbGUsIGNvbnRhaW5pbmcgdGhlIG1vZHVsZXMgdG8gYmUgaW5zdGFsbGVkLgpAQCAtMTE4LDI4ICsxMTgsMjggQEAKIEhXTkQgaHduZE1haW47CiBIV05EIGhEaWFsb2c7CiAKLWNoYXIgKmluaV9maWxlOwkJCS8qIEZ1bGwgcGF0aG5hbWUgb2YgaW5pLWZpbGUgKi8KK2NoYXIgKmluaV9maWxlOyAgICAgICAgICAgICAgICAgLyogRnVsbCBwYXRobmFtZSBvZiBpbmktZmlsZSAqLwogLyogRnJvbSBpbmktZmlsZSAqLwotY2hhciBpbmZvWzQwOTZdOwkJLyogW1NldHVwXSBpbmZvPSAqLwotY2hhciB0aXRsZVs4MF07CQkJLyogW1NldHVwXSB0aXRsZT0sIGNvbnRhaW5zIHBhY2thZ2UgbmFtZQotCQkJCSAgIGluY2x1ZGluZyB2ZXJzaW9uOiAiRGlzdHV0aWxzLTEuMC4xIiAqLwotY2hhciB0YXJnZXRfdmVyc2lvblsxMF07CS8qIFtTZXR1cF0gdGFyZ2V0X3ZlcnNpb249LCByZXF1aXJlZCBweXRob24KLQkJCQkgICB2ZXJzaW9uIG9yIGVtcHR5IHN0cmluZyAqLwotY2hhciBidWlsZF9pbmZvWzgwXTsJCS8qIFtTZXR1cF0gYnVpbGRfaW5mbz0sIGRpc3R1dGlscyB2ZXJzaW9uCi0JCQkJICAgYW5kIGJ1aWxkIGRhdGUgKi8KK2NoYXIgaW5mb1s0MDk2XTsgICAgICAgICAgICAgICAgLyogW1NldHVwXSBpbmZvPSAqLworY2hhciB0aXRsZVs4MF07ICAgICAgICAgICAgICAgICAvKiBbU2V0dXBdIHRpdGxlPSwgY29udGFpbnMgcGFja2FnZSBuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGluZyB2ZXJzaW9uOiAiRGlzdHV0aWxzLTEuMC4xIiAqLworY2hhciB0YXJnZXRfdmVyc2lvblsxMF07ICAgICAgICAvKiBbU2V0dXBdIHRhcmdldF92ZXJzaW9uPSwgcmVxdWlyZWQgcHl0aG9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb24gb3IgZW1wdHkgc3RyaW5nICovCitjaGFyIGJ1aWxkX2luZm9bODBdOyAgICAgICAgICAgIC8qIFtTZXR1cF0gYnVpbGRfaW5mbz0sIGRpc3R1dGlscyB2ZXJzaW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBidWlsZCBkYXRlICovCiAKLWNoYXIgbWV0YV9uYW1lWzgwXTsJCS8qIHBhY2thZ2UgbmFtZSB3aXRob3V0IHZlcnNpb24gbGlrZQotCQkJCSAgICdEaXN0dXRpbHMnICovCitjaGFyIG1ldGFfbmFtZVs4MF07ICAgICAgICAgICAgIC8qIHBhY2thZ2UgbmFtZSB3aXRob3V0IHZlcnNpb24gbGlrZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRGlzdHV0aWxzJyAqLwogY2hhciBpbnN0YWxsX3NjcmlwdFtNQVhfUEFUSF07CiBjaGFyICpwcmVfaW5zdGFsbF9zY3JpcHQ7IC8qIHJ1biBiZWZvcmUgd2UgaW5zdGFsbCBhIHNpbmdsZSBmaWxlICovCiAKIGNoYXIgdXNlcl9hY2Nlc3NfY29udHJvbFsxMF07IC8vIG9uZSBvZiAnYXV0bycsICdmb3JjZScsIG90aGVyd2lzZSBub25lLgogCi1pbnQgcHlfbWFqb3IsIHB5X21pbm9yOwkJLyogUHl0aG9uIHZlcnNpb24gc2VsZWN0ZWQgZm9yIGluc3RhbGxhdGlvbiAqLworaW50IHB5X21ham9yLCBweV9taW5vcjsgICAgICAgICAvKiBQeXRob24gdmVyc2lvbiBzZWxlY3RlZCBmb3IgaW5zdGFsbGF0aW9uICovCiAKLWNoYXIgKmFyY19kYXRhOwkJCS8qIG1lbW9yeSBtYXBwZWQgYXJjaGl2ZSAqLwotRFdPUkQgYXJjX3NpemU7CQkJLyogbnVtYmVyIG9mIGJ5dGVzIGluIGFyY2hpdmUgKi8KLWludCBleGVfc2l6ZTsJCQkvKiBudW1iZXIgb2YgYnl0ZXMgZm9yIGV4ZS1maWxlIHBvcnRpb24gKi8KK2NoYXIgKmFyY19kYXRhOyAgICAgICAgICAgICAgICAgLyogbWVtb3J5IG1hcHBlZCBhcmNoaXZlICovCitEV09SRCBhcmNfc2l6ZTsgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBieXRlcyBpbiBhcmNoaXZlICovCitpbnQgZXhlX3NpemU7ICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBieXRlcyBmb3IgZXhlLWZpbGUgcG9ydGlvbiAqLwogY2hhciBweXRob25fZGlyW01BWF9QQVRIXTsKIGNoYXIgcHl0aG9uZGxsW01BWF9QQVRIXTsKIEJPT0wgcHljX2NvbXBpbGUsIHB5b19jb21waWxlOwpAQCAtMTQ3LDcgKzE0Nyw3IEBACiAgICB0aGUgcGVybWlzc2lvbnMgb2YgdGhlIGN1cnJlbnQgdXNlci4gKi8KIEhLRVkgaGtleV9yb290ID0gKEhLRVkpLTE7CiAKLUJPT0wgc3VjY2VzczsJCQkvKiBJbnN0YWxsYXRpb24gc3VjY2Vzc2Z1bGw/ICovCitCT09MIHN1Y2Nlc3M7ICAgICAgICAgICAgICAgICAgIC8qIEluc3RhbGxhdGlvbiBzdWNjZXNzZnVsbD8gKi8KIGNoYXIgKmZhaWx1cmVfcmVhc29uID0gTlVMTDsKIAogSEFORExFIGhCaXRtYXA7CkBAIC0xNjUsMTI4ICsxNjUsMTI4IEBACiAvKiBOb3RlOiBJZiBzY2hlbWUucHJlZml4IGlzIG5vbmVtcHR5LCBpdCBtdXN0IGVuZCB3aXRoIGEgJ1wnISAqLwogLyogTm90ZTogcHVyZWxpYiBtdXN0IGJlIHRoZSBGSVJTVCBlbnRyeSEgKi8KIFNDSEVNRSBvbGRfc2NoZW1lW10gPSB7Ci0JeyAiUFVSRUxJQiIsICIiIH0sCi0JeyAiUExBVExJQiIsICIiIH0sCi0JeyAiSEVBREVSUyIsICIiIH0sIC8qICdJbmNsdWRlL2Rpc3RfbmFtZScgcGFydCBhbHJlYWR5IGluIGFyY2hpdmUgKi8KLQl7ICJTQ1JJUFRTIiwgIlNjcmlwdHNcXCIgfSwKLQl7ICJEQVRBIiwgIiIgfSwKLQl7IE5VTEwsIE5VTEwgfSwKKyAgICB7ICJQVVJFTElCIiwgIiIgfSwKKyAgICB7ICJQTEFUTElCIiwgIiIgfSwKKyAgICB7ICJIRUFERVJTIiwgIiIgfSwgLyogJ0luY2x1ZGUvZGlzdF9uYW1lJyBwYXJ0IGFscmVhZHkgaW4gYXJjaGl2ZSAqLworICAgIHsgIlNDUklQVFMiLCAiU2NyaXB0c1xcIiB9LAorICAgIHsgIkRBVEEiLCAiIiB9LAorICAgIHsgTlVMTCwgTlVMTCB9LAogfTsKIAogU0NIRU1FIG5ld19zY2hlbWVbXSA9IHsKLQl7ICJQVVJFTElCIiwgIkxpYlxcc2l0ZS1wYWNrYWdlc1xcIiB9LAotCXsgIlBMQVRMSUIiLCAiTGliXFxzaXRlLXBhY2thZ2VzXFwiIH0sCi0JeyAiSEVBREVSUyIsICIiIH0sIC8qICdJbmNsdWRlL2Rpc3RfbmFtZScgcGFydCBhbHJlYWR5IGluIGFyY2hpdmUgKi8KLQl7ICJTQ1JJUFRTIiwgIlNjcmlwdHNcXCIgfSwKLQl7ICJEQVRBIiwgIiIgfSwKLQl7IE5VTEwsIE5VTEwgfSwKKyAgICB7ICJQVVJFTElCIiwgIkxpYlxcc2l0ZS1wYWNrYWdlc1xcIiB9LAorICAgIHsgIlBMQVRMSUIiLCAiTGliXFxzaXRlLXBhY2thZ2VzXFwiIH0sCisgICAgeyAiSEVBREVSUyIsICIiIH0sIC8qICdJbmNsdWRlL2Rpc3RfbmFtZScgcGFydCBhbHJlYWR5IGluIGFyY2hpdmUgKi8KKyAgICB7ICJTQ1JJUFRTIiwgIlNjcmlwdHNcXCIgfSwKKyAgICB7ICJEQVRBIiwgIiIgfSwKKyAgICB7IE5VTEwsIE5VTEwgfSwKIH07CiAKIHN0YXRpYyB2b2lkIHVuZXNjYXBlKGNoYXIgKmRzdCwgY2hhciAqc3JjLCB1bnNpZ25lZCBzaXplKQogewotCWNoYXIgKmVvbjsKLQljaGFyIGNoOworICAgIGNoYXIgKmVvbjsKKyAgICBjaGFyIGNoOwogCi0Jd2hpbGUgKHNyYyAmJiAqc3JjICYmIChzaXplID4gMikpIHsKLQkJaWYgKCpzcmMgPT0gJ1xcJykgewotCQkJc3dpdGNoICgqKytzcmMpIHsKLQkJCWNhc2UgJ24nOgotCQkJCSsrc3JjOwotCQkJCSpkc3QrKyA9ICdccic7Ci0JCQkJKmRzdCsrID0gJ1xuJzsKLQkJCQlzaXplIC09IDI7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICdyJzoKLQkJCQkrK3NyYzsKLQkJCQkqZHN0KysgPSAnXHInOwotCQkJCS0tc2l6ZTsKLQkJCQlicmVhazsKLQkJCWNhc2UgJzAnOiBjYXNlICcxJzogY2FzZSAnMic6IGNhc2UgJzMnOgotCQkJCWNoID0gKGNoYXIpc3RydG9sKHNyYywgJmVvbiwgOCk7Ci0JCQkJaWYgKGNoID09ICdcbicpIHsKLQkJCQkJKmRzdCsrID0gJ1xyJzsKLQkJCQkJLS1zaXplOwotCQkJCX0KLQkJCQkqZHN0KysgPSBjaDsKLQkJCQktLXNpemU7Ci0JCQkJc3JjID0gZW9uOwotCQkJfQotCQl9IGVsc2UgewotCQkJKmRzdCsrID0gKnNyYysrOwotCQkJLS1zaXplOwotCQl9Ci0JfQotCSpkc3QgPSAnXDAnOworICAgIHdoaWxlIChzcmMgJiYgKnNyYyAmJiAoc2l6ZSA+IDIpKSB7CisgICAgICAgIGlmICgqc3JjID09ICdcXCcpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoKisrc3JjKSB7CisgICAgICAgICAgICBjYXNlICduJzoKKyAgICAgICAgICAgICAgICArK3NyYzsKKyAgICAgICAgICAgICAgICAqZHN0KysgPSAnXHInOworICAgICAgICAgICAgICAgICpkc3QrKyA9ICdcbic7CisgICAgICAgICAgICAgICAgc2l6ZSAtPSAyOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAncic6CisgICAgICAgICAgICAgICAgKytzcmM7CisgICAgICAgICAgICAgICAgKmRzdCsrID0gJ1xyJzsKKyAgICAgICAgICAgICAgICAtLXNpemU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICcwJzogY2FzZSAnMSc6IGNhc2UgJzInOiBjYXNlICczJzoKKyAgICAgICAgICAgICAgICBjaCA9IChjaGFyKXN0cnRvbChzcmMsICZlb24sIDgpOworICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnXG4nKSB7CisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9ICdccic7CisgICAgICAgICAgICAgICAgICAgIC0tc2l6ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKmRzdCsrID0gY2g7CisgICAgICAgICAgICAgICAgLS1zaXplOworICAgICAgICAgICAgICAgIHNyYyA9IGVvbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICpkc3QrKyA9ICpzcmMrKzsKKyAgICAgICAgICAgIC0tc2l6ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICAqZHN0ID0gJ1wwJzsKIH0KIAogc3RhdGljIHN0cnVjdCB0YWdGaWxlIHsKLQljaGFyICpwYXRoOwotCXN0cnVjdCB0YWdGaWxlICpuZXh0OworICAgIGNoYXIgKnBhdGg7CisgICAgc3RydWN0IHRhZ0ZpbGUgKm5leHQ7CiB9ICpmaWxlX2xpc3QgPSBOVUxMOwogCiBzdGF0aWMgdm9pZCBzZXRfZmFpbHVyZV9yZWFzb24oY2hhciAqcmVhc29uKQogewogICAgIGlmIChmYWlsdXJlX3JlYXNvbikKLQlmcmVlKGZhaWx1cmVfcmVhc29uKTsKKyAgICBmcmVlKGZhaWx1cmVfcmVhc29uKTsKICAgICBmYWlsdXJlX3JlYXNvbiA9IHN0cmR1cChyZWFzb24pOwogICAgIHN1Y2Nlc3MgPSBGQUxTRTsKIH0KIHN0YXRpYyBjaGFyICpnZXRfZmFpbHVyZV9yZWFzb24oKQogewogICAgIGlmICghZmFpbHVyZV9yZWFzb24pCi0JcmV0dXJuICJJbnN0YWxsYXRpb24gZmFpbGVkLiI7CisgICAgcmV0dXJuICJJbnN0YWxsYXRpb24gZmFpbGVkLiI7CiAgICAgcmV0dXJuIGZhaWx1cmVfcmVhc29uOwogfQogCiBzdGF0aWMgdm9pZCBhZGRfdG9fZmlsZWxpc3QoY2hhciAqcGF0aCkKIHsKLQlzdHJ1Y3QgdGFnRmlsZSAqcDsKLQlwID0gKHN0cnVjdCB0YWdGaWxlICopbWFsbG9jKHNpemVvZihzdHJ1Y3QgdGFnRmlsZSkpOwotCXAtPnBhdGggPSBzdHJkdXAocGF0aCk7Ci0JcC0+bmV4dCA9IGZpbGVfbGlzdDsKLQlmaWxlX2xpc3QgPSBwOworICAgIHN0cnVjdCB0YWdGaWxlICpwOworICAgIHAgPSAoc3RydWN0IHRhZ0ZpbGUgKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCB0YWdGaWxlKSk7CisgICAgcC0+cGF0aCA9IHN0cmR1cChwYXRoKTsKKyAgICBwLT5uZXh0ID0gZmlsZV9saXN0OworICAgIGZpbGVfbGlzdCA9IHA7CiB9CiAKIHN0YXRpYyBpbnQgZG9fY29tcGlsZV9maWxlcyhpbnQgKF9fY2RlY2wgKiBQeVJ1bl9TaW1wbGVTdHJpbmcpKGNoYXIgKiksCi0JCQkgICAgIGludCBvcHRpbWl6ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9wdGltaXplKQogewotCXN0cnVjdCB0YWdGaWxlICpwOwotCWludCB0b3RhbCwgbjsKLQljaGFyIEJ1ZmZlcltNQVhfUEFUSCArIDY0XTsKLQlpbnQgZXJyb3JzID0gMDsKKyAgICBzdHJ1Y3QgdGFnRmlsZSAqcDsKKyAgICBpbnQgdG90YWwsIG47CisgICAgY2hhciBCdWZmZXJbTUFYX1BBVEggKyA2NF07CisgICAgaW50IGVycm9ycyA9IDA7CiAKLQl0b3RhbCA9IDA7Ci0JcCA9IGZpbGVfbGlzdDsKLQl3aGlsZSAocCkgewotCQkrK3RvdGFsOwotCQlwID0gcC0+bmV4dDsKLQl9Ci0JU2VuZERsZ0l0ZW1NZXNzYWdlKGhEaWFsb2csIElEQ19QUk9HUkVTUywgUEJNX1NFVFJBTkdFLCAwLAotCQkJICAgIE1BS0VMUEFSQU0oMCwgdG90YWwpKTsKLQlTZW5kRGxnSXRlbU1lc3NhZ2UoaERpYWxvZywgSURDX1BST0dSRVNTLCBQQk1fU0VUUE9TLCAwLCAwKTsKKyAgICB0b3RhbCA9IDA7CisgICAgcCA9IGZpbGVfbGlzdDsKKyAgICB3aGlsZSAocCkgeworICAgICAgICArK3RvdGFsOworICAgICAgICBwID0gcC0+bmV4dDsKKyAgICB9CisgICAgU2VuZERsZ0l0ZW1NZXNzYWdlKGhEaWFsb2csIElEQ19QUk9HUkVTUywgUEJNX1NFVFJBTkdFLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgTUFLRUxQQVJBTSgwLCB0b3RhbCkpOworICAgIFNlbmREbGdJdGVtTWVzc2FnZShoRGlhbG9nLCBJRENfUFJPR1JFU1MsIFBCTV9TRVRQT1MsIDAsIDApOwogCi0JbiA9IDA7Ci0JcCA9IGZpbGVfbGlzdDsKLQl3aGlsZSAocCkgewotCQkrK247Ci0JCXdzcHJpbnRmKEJ1ZmZlciwKLQkJCSAgImltcG9ydCBweV9jb21waWxlOyBweV9jb21waWxlLmNvbXBpbGUgKHInJXMnKSIsCi0JCQkgIHAtPnBhdGgpOwotCQlpZiAoUHlSdW5fU2ltcGxlU3RyaW5nKEJ1ZmZlcikpIHsKLQkJCSsrZXJyb3JzOwotCQl9Ci0JCS8qIFdlIHNlbmQgdGhlIG5vdGlmaWNhdGlvbiBldmVuIGlmIHRoZSBmaWxlcyBjb3VsZCBub3QKLQkJICogYmUgY3JlYXRlZCBzbyB0aGF0IHRoZSB1bmluc3RhbGxlciB3aWxsIHJlbW92ZSB0aGVtCi0JCSAqIGluIGNhc2UgdGhleSBhcmUgY3JlYXRlZCBsYXRlci4KLQkJICovCi0JCXdzcHJpbnRmKEJ1ZmZlciwgIiVzJWMiLCBwLT5wYXRoLCBvcHRpbWl6ZSA/ICdvJyA6ICdjJyk7Ci0JCW5vdGlmeShGSUxFX0NSRUFURUQsIEJ1ZmZlcik7CisgICAgbiA9IDA7CisgICAgcCA9IGZpbGVfbGlzdDsKKyAgICB3aGlsZSAocCkgeworICAgICAgICArK247CisgICAgICAgIHdzcHJpbnRmKEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICJpbXBvcnQgcHlfY29tcGlsZTsgcHlfY29tcGlsZS5jb21waWxlIChyJyVzJykiLAorICAgICAgICAgICAgICAgICAgcC0+cGF0aCk7CisgICAgICAgIGlmIChQeVJ1bl9TaW1wbGVTdHJpbmcoQnVmZmVyKSkgeworICAgICAgICAgICAgKytlcnJvcnM7CisgICAgICAgIH0KKyAgICAgICAgLyogV2Ugc2VuZCB0aGUgbm90aWZpY2F0aW9uIGV2ZW4gaWYgdGhlIGZpbGVzIGNvdWxkIG5vdAorICAgICAgICAgKiBiZSBjcmVhdGVkIHNvIHRoYXQgdGhlIHVuaW5zdGFsbGVyIHdpbGwgcmVtb3ZlIHRoZW0KKyAgICAgICAgICogaW4gY2FzZSB0aGV5IGFyZSBjcmVhdGVkIGxhdGVyLgorICAgICAgICAgKi8KKyAgICAgICAgd3NwcmludGYoQnVmZmVyLCAiJXMlYyIsIHAtPnBhdGgsIG9wdGltaXplID8gJ28nIDogJ2MnKTsKKyAgICAgICAgbm90aWZ5KEZJTEVfQ1JFQVRFRCwgQnVmZmVyKTsKIAotCQlTZW5kRGxnSXRlbU1lc3NhZ2UoaERpYWxvZywgSURDX1BST0dSRVNTLCBQQk1fU0VUUE9TLCBuLCAwKTsKLQkJU2V0RGxnSXRlbVRleHQoaERpYWxvZywgSURDX0lORk8sIHAtPnBhdGgpOwotCQlwID0gcC0+bmV4dDsKLQl9Ci0JcmV0dXJuIGVycm9yczsKKyAgICAgICAgU2VuZERsZ0l0ZW1NZXNzYWdlKGhEaWFsb2csIElEQ19QUk9HUkVTUywgUEJNX1NFVFBPUywgbiwgMCk7CisgICAgICAgIFNldERsZ0l0ZW1UZXh0KGhEaWFsb2csIElEQ19JTkZPLCBwLT5wYXRoKTsKKyAgICAgICAgcCA9IHAtPm5leHQ7CisgICAgfQorICAgIHJldHVybiBlcnJvcnM7CiB9CiAKICNkZWZpbmUgREVDTFBST0MoZGxsLCByZXN1bHQsIG5hbWUsIGFyZ3MpXApAQCAtMzA2LDQ3ICszMDYsNDcgQEAKICAqLwogc3RhdGljIGludCBjb21waWxlX2ZpbGVsaXN0KEhJTlNUQU5DRSBoUHl0aG9uLCBCT09MIG9wdGltaXplX2ZsYWcpCiB7Ci0JREVDTFBST0MoaFB5dGhvbiwgdm9pZCwgUHlfSW5pdGlhbGl6ZSwgKHZvaWQpKTsKLQlERUNMUFJPQyhoUHl0aG9uLCB2b2lkLCBQeV9TZXRQcm9ncmFtTmFtZSwgKGNoYXIgKikpOwotCURFQ0xQUk9DKGhQeXRob24sIHZvaWQsIFB5X0ZpbmFsaXplLCAodm9pZCkpOwotCURFQ0xQUk9DKGhQeXRob24sIGludCwgUHlSdW5fU2ltcGxlU3RyaW5nLCAoY2hhciAqKSk7Ci0JREVDTFBST0MoaFB5dGhvbiwgUHlPYmplY3QgKiwgUHlTeXNfR2V0T2JqZWN0LCAoY2hhciAqKSk7Ci0JREVDTFZBUihoUHl0aG9uLCBpbnQsIFB5X09wdGltaXplRmxhZyk7CisgICAgREVDTFBST0MoaFB5dGhvbiwgdm9pZCwgUHlfSW5pdGlhbGl6ZSwgKHZvaWQpKTsKKyAgICBERUNMUFJPQyhoUHl0aG9uLCB2b2lkLCBQeV9TZXRQcm9ncmFtTmFtZSwgKGNoYXIgKikpOworICAgIERFQ0xQUk9DKGhQeXRob24sIHZvaWQsIFB5X0ZpbmFsaXplLCAodm9pZCkpOworICAgIERFQ0xQUk9DKGhQeXRob24sIGludCwgUHlSdW5fU2ltcGxlU3RyaW5nLCAoY2hhciAqKSk7CisgICAgREVDTFBST0MoaFB5dGhvbiwgUHlPYmplY3QgKiwgUHlTeXNfR2V0T2JqZWN0LCAoY2hhciAqKSk7CisgICAgREVDTFZBUihoUHl0aG9uLCBpbnQsIFB5X09wdGltaXplRmxhZyk7CiAKLQlpbnQgZXJyb3JzID0gMDsKLQlzdHJ1Y3QgdGFnRmlsZSAqcCA9IGZpbGVfbGlzdDsKKyAgICBpbnQgZXJyb3JzID0gMDsKKyAgICBzdHJ1Y3QgdGFnRmlsZSAqcCA9IGZpbGVfbGlzdDsKIAotCWlmICghcCkKLQkJcmV0dXJuIDA7CisgICAgaWYgKCFwKQorICAgICAgICByZXR1cm4gMDsKIAotCWlmICghUHlfSW5pdGlhbGl6ZSB8fCAhUHlfU2V0UHJvZ3JhbU5hbWUgfHwgIVB5X0ZpbmFsaXplKQotCQlyZXR1cm4gLTE7CisgICAgaWYgKCFQeV9Jbml0aWFsaXplIHx8ICFQeV9TZXRQcm9ncmFtTmFtZSB8fCAhUHlfRmluYWxpemUpCisgICAgICAgIHJldHVybiAtMTsKIAotCWlmICghUHlSdW5fU2ltcGxlU3RyaW5nIHx8ICFQeVN5c19HZXRPYmplY3QgfHwgIVB5X09wdGltaXplRmxhZykKLQkJcmV0dXJuIC0xOworICAgIGlmICghUHlSdW5fU2ltcGxlU3RyaW5nIHx8ICFQeVN5c19HZXRPYmplY3QgfHwgIVB5X09wdGltaXplRmxhZykKKyAgICAgICAgcmV0dXJuIC0xOwogCi0JKlB5X09wdGltaXplRmxhZyA9IG9wdGltaXplX2ZsYWcgPyAxIDogMDsKLQlQeV9TZXRQcm9ncmFtTmFtZShtb2R1bGVuYW1lKTsKLQlQeV9Jbml0aWFsaXplKCk7CisgICAgKlB5X09wdGltaXplRmxhZyA9IG9wdGltaXplX2ZsYWcgPyAxIDogMDsKKyAgICBQeV9TZXRQcm9ncmFtTmFtZShtb2R1bGVuYW1lKTsKKyAgICBQeV9Jbml0aWFsaXplKCk7CiAKLQllcnJvcnMgKz0gZG9fY29tcGlsZV9maWxlcyhQeVJ1bl9TaW1wbGVTdHJpbmcsIG9wdGltaXplX2ZsYWcpOwotCVB5X0ZpbmFsaXplKCk7CisgICAgZXJyb3JzICs9IGRvX2NvbXBpbGVfZmlsZXMoUHlSdW5fU2ltcGxlU3RyaW5nLCBvcHRpbWl6ZV9mbGFnKTsKKyAgICBQeV9GaW5hbGl6ZSgpOwogCi0JcmV0dXJuIGVycm9yczsKKyAgICByZXR1cm4gZXJyb3JzOwogfQogCiB0eXBlZGVmIFB5T2JqZWN0ICooKlB5Q0Z1bmN0aW9uKShQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKIAogc3RydWN0IFB5TWV0aG9kRGVmIHsKLQljaGFyCSptbF9uYW1lOwotCVB5Q0Z1bmN0aW9uICBtbF9tZXRoOwotCWludAkJIG1sX2ZsYWdzOwotCWNoYXIJKm1sX2RvYzsKKyAgICBjaGFyICAgICAgICAqbWxfbmFtZTsKKyAgICBQeUNGdW5jdGlvbiAgbWxfbWV0aDsKKyAgICBpbnQgICAgICAgICAgICAgICAgICBtbF9mbGFnczsKKyAgICBjaGFyICAgICAgICAqbWxfZG9jOwogfTsKIHR5cGVkZWYgc3RydWN0IFB5TWV0aG9kRGVmIFB5TWV0aG9kRGVmOwogCiAvLyBYWFggLSBhbGwgb2YgdGhlc2UgYXJlIHBvdGVudGlhbGx5IGZyYWdpbGUhICBXZSBsb2FkIGFuZCB1bmxvYWQKLS8vIHRoZSBQeXRob24gRExMIG11bHRpcGxlIHRpbWVzIC0gc28gc3RvcmluZyBmdW5jdGlvbnMgcG9pbnRlcnMgCisvLyB0aGUgUHl0aG9uIERMTCBtdWx0aXBsZSB0aW1lcyAtIHNvIHN0b3JpbmcgZnVuY3Rpb25zIHBvaW50ZXJzCiAvLyBpcyBkYW5nZXJvdXMgKGFsdGhvdWdoIHRoaW5ncyAqbG9vayogT0sgYXQgcHJlc2VudCkKIC8vIEJldHRlciBtaWdodCBiZSB0byByb2xsIHByZXBhcmVfc2NyaXB0X2Vudmlyb25tZW50KCkgaW50bwogLy8gTG9hZFB5dGhvbkRsbCgpLCBhbmQgY3JlYXRlIGEgbmV3IFVubG9hZFB5dGhvbkRMTCgpIHdoaWNoIGFsc28KQEAgLTM2MywyNDkgKzM2MywyNDkgQEAKICNkZWZpbmUgREVGX0NTSURMKG5hbWUpIHsgbmFtZSwgI25hbWUgfQogCiBzdHJ1Y3QgewotCWludCBuRm9sZGVyOwotCWNoYXIgKm5hbWU7CisgICAgaW50IG5Gb2xkZXI7CisgICAgY2hhciAqbmFtZTsKIH0gY3NpZGxfbmFtZXNbXSA9IHsKLQkvKiBTdGFydHVwIG1lbnUgZm9yIGFsbCB1c2Vycy4KLQkgICBOVCBvbmx5ICovCi0JREVGX0NTSURMKENTSURMX0NPTU1PTl9TVEFSVE1FTlUpLAotCS8qIFN0YXJ0dXAgbWVudS4gKi8KLQlERUZfQ1NJREwoQ1NJRExfU1RBUlRNRU5VKSwKKyAgICAvKiBTdGFydHVwIG1lbnUgZm9yIGFsbCB1c2Vycy4KKyAgICAgICBOVCBvbmx5ICovCisgICAgREVGX0NTSURMKENTSURMX0NPTU1PTl9TVEFSVE1FTlUpLAorICAgIC8qIFN0YXJ0dXAgbWVudS4gKi8KKyAgICBERUZfQ1NJREwoQ1NJRExfU1RBUlRNRU5VKSwKIAogLyogICAgREVGX0NTSURMKENTSURMX0NPTU1PTl9BUFBEQVRBKSwgKi8KIC8qICAgIERFRl9DU0lETChDU0lETF9MT0NBTF9BUFBEQVRBKSwgKi8KLQkvKiBSZXBvc2l0b3J5IGZvciBhcHBsaWNhdGlvbi1zcGVjaWZpYyBkYXRhLgotCSAgIE5lZWRzIEludGVybmV0IEV4cGxvcmVyIDQuMCAqLwotCURFRl9DU0lETChDU0lETF9BUFBEQVRBKSwKKyAgICAvKiBSZXBvc2l0b3J5IGZvciBhcHBsaWNhdGlvbi1zcGVjaWZpYyBkYXRhLgorICAgICAgIE5lZWRzIEludGVybmV0IEV4cGxvcmVyIDQuMCAqLworICAgIERFRl9DU0lETChDU0lETF9BUFBEQVRBKSwKIAotCS8qIFRoZSBkZXNrdG9wIGZvciBhbGwgdXNlcnMuCi0JICAgTlQgb25seSAqLwotCURFRl9DU0lETChDU0lETF9DT01NT05fREVTS1RPUERJUkVDVE9SWSksCi0JLyogVGhlIGRlc2t0b3AuICovCi0JREVGX0NTSURMKENTSURMX0RFU0tUT1BESVJFQ1RPUlkpLAorICAgIC8qIFRoZSBkZXNrdG9wIGZvciBhbGwgdXNlcnMuCisgICAgICAgTlQgb25seSAqLworICAgIERFRl9DU0lETChDU0lETF9DT01NT05fREVTS1RPUERJUkVDVE9SWSksCisgICAgLyogVGhlIGRlc2t0b3AuICovCisgICAgREVGX0NTSURMKENTSURMX0RFU0tUT1BESVJFQ1RPUlkpLAogCi0JLyogU3RhcnR1cCBmb2xkZXIgZm9yIGFsbCB1c2Vycy4KLQkgICBOVCBvbmx5ICovCi0JREVGX0NTSURMKENTSURMX0NPTU1PTl9TVEFSVFVQKSwKLQkvKiBTdGFydHVwIGZvbGRlci4gKi8KLQlERUZfQ1NJREwoQ1NJRExfU1RBUlRVUCksCisgICAgLyogU3RhcnR1cCBmb2xkZXIgZm9yIGFsbCB1c2Vycy4KKyAgICAgICBOVCBvbmx5ICovCisgICAgREVGX0NTSURMKENTSURMX0NPTU1PTl9TVEFSVFVQKSwKKyAgICAvKiBTdGFydHVwIGZvbGRlci4gKi8KKyAgICBERUZfQ1NJREwoQ1NJRExfU1RBUlRVUCksCiAKLQkvKiBQcm9ncmFtcyBpdGVtIGluIHRoZSBzdGFydCBtZW51IGZvciBhbGwgdXNlcnMuCi0JICAgTlQgb25seSAqLwotCURFRl9DU0lETChDU0lETF9DT01NT05fUFJPR1JBTVMpLAotCS8qIFByb2dyYW0gaXRlbSBpbiB0aGUgdXNlcidzIHN0YXJ0IG1lbnUuICovCi0JREVGX0NTSURMKENTSURMX1BST0dSQU1TKSwKKyAgICAvKiBQcm9ncmFtcyBpdGVtIGluIHRoZSBzdGFydCBtZW51IGZvciBhbGwgdXNlcnMuCisgICAgICAgTlQgb25seSAqLworICAgIERFRl9DU0lETChDU0lETF9DT01NT05fUFJPR1JBTVMpLAorICAgIC8qIFByb2dyYW0gaXRlbSBpbiB0aGUgdXNlcidzIHN0YXJ0IG1lbnUuICovCisgICAgREVGX0NTSURMKENTSURMX1BST0dSQU1TKSwKIAogLyogICAgREVGX0NTSURMKENTSURMX1BST0dSQU1fRklMRVNfQ09NTU9OKSwgKi8KIC8qICAgIERFRl9DU0lETChDU0lETF9QUk9HUkFNX0ZJTEVTKSwgKi8KIAotCS8qIFZpcnR1YWwgZm9sZGVyIGNvbnRhaW5pbmcgZm9udHMuICovCi0JREVGX0NTSURMKENTSURMX0ZPTlRTKSwKKyAgICAvKiBWaXJ0dWFsIGZvbGRlciBjb250YWluaW5nIGZvbnRzLiAqLworICAgIERFRl9DU0lETChDU0lETF9GT05UUyksCiB9OwogCiAjZGVmaW5lIERJTShhKSAoc2l6ZW9mKGEpIC8gc2l6ZW9mKChhKVswXSkpCiAKIHN0YXRpYyBQeU9iamVjdCAqRmlsZUNyZWF0ZWQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKnBhdGg7Ci0JaWYgKCFnX1B5QXJnX1BhcnNlVHVwbGUoYXJncywgInMiLCAmcGF0aCkpCi0JCXJldHVybiBOVUxMOwotCW5vdGlmeShGSUxFX0NSRUFURUQsIHBhdGgpOwotCXJldHVybiBnX1B5X0J1aWxkVmFsdWUoIiIpOworICAgIGNoYXIgKnBhdGg7CisgICAgaWYgKCFnX1B5QXJnX1BhcnNlVHVwbGUoYXJncywgInMiLCAmcGF0aCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG5vdGlmeShGSUxFX0NSRUFURUQsIHBhdGgpOworICAgIHJldHVybiBnX1B5X0J1aWxkVmFsdWUoIiIpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRpcmVjdG9yeUNyZWF0ZWQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKnBhdGg7Ci0JaWYgKCFnX1B5QXJnX1BhcnNlVHVwbGUoYXJncywgInMiLCAmcGF0aCkpCi0JCXJldHVybiBOVUxMOwotCW5vdGlmeShESVJfQ1JFQVRFRCwgcGF0aCk7Ci0JcmV0dXJuIGdfUHlfQnVpbGRWYWx1ZSgiIik7CisgICAgY2hhciAqcGF0aDsKKyAgICBpZiAoIWdfUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyIsICZwYXRoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbm90aWZ5KERJUl9DUkVBVEVELCBwYXRoKTsKKyAgICByZXR1cm4gZ19QeV9CdWlsZFZhbHVlKCIiKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpHZXRTcGVjaWFsRm9sZGVyUGF0aChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqbmFtZTsKLQljaGFyIGxwc3pQYXRoW01BWF9QQVRIXTsKLQlpbnQgaTsKLQlzdGF0aWMgSFJFU1VMVCAoV0lOQVBJICpNeV9TSEdldFNwZWNpYWxGb2xkZXJQYXRoKShIV05EIGh3bmQsCi0JCQkJCQkJICAgTFBUU1RSIGxwc3pQYXRoLAotCQkJCQkJCSAgIGludCBuRm9sZGVyLAotCQkJCQkJCSAgIEJPT0wgZkNyZWF0ZSk7CisgICAgY2hhciAqbmFtZTsKKyAgICBjaGFyIGxwc3pQYXRoW01BWF9QQVRIXTsKKyAgICBpbnQgaTsKKyAgICBzdGF0aWMgSFJFU1VMVCAoV0lOQVBJICpNeV9TSEdldFNwZWNpYWxGb2xkZXJQYXRoKShIV05EIGh3bmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBUU1RSIGxwc3pQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuRm9sZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wgZkNyZWF0ZSk7CiAKLQlpZiAoIU15X1NIR2V0U3BlY2lhbEZvbGRlclBhdGgpIHsKLQkJSElOU1RBTkNFIGhMaWIgPSBMb2FkTGlicmFyeSgic2hlbGwzMi5kbGwiKTsKLQkJaWYgKCFoTGliKSB7Ci0JCQlnX1B5RXJyX0Zvcm1hdChnX1B5RXhjX09TRXJyb3IsCi0JCQkJICAgICAgICJmdW5jdGlvbiBub3QgYXZhaWxhYmxlIik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlNeV9TSEdldFNwZWNpYWxGb2xkZXJQYXRoID0gKEJPT0wgKFdJTkFQSSAqKShIV05ELCBMUFRTVFIsCi0JCQkJCQkJICAgICBpbnQsIEJPT0wpKQotCQkJR2V0UHJvY0FkZHJlc3MoaExpYiwKLQkJCQkgICAgICAgIlNIR2V0U3BlY2lhbEZvbGRlclBhdGhBIik7Ci0JfQorICAgIGlmICghTXlfU0hHZXRTcGVjaWFsRm9sZGVyUGF0aCkgeworICAgICAgICBISU5TVEFOQ0UgaExpYiA9IExvYWRMaWJyYXJ5KCJzaGVsbDMyLmRsbCIpOworICAgICAgICBpZiAoIWhMaWIpIHsKKyAgICAgICAgICAgIGdfUHlFcnJfRm9ybWF0KGdfUHlFeGNfT1NFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJmdW5jdGlvbiBub3QgYXZhaWxhYmxlIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBNeV9TSEdldFNwZWNpYWxGb2xkZXJQYXRoID0gKEJPT0wgKFdJTkFQSSAqKShIV05ELCBMUFRTVFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCwgQk9PTCkpCisgICAgICAgICAgICBHZXRQcm9jQWRkcmVzcyhoTGliLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNIR2V0U3BlY2lhbEZvbGRlclBhdGhBIik7CisgICAgfQogCi0JaWYgKCFnX1B5QXJnX1BhcnNlVHVwbGUoYXJncywgInMiLCAmbmFtZSkpCi0JCXJldHVybiBOVUxMOwotICAgIAotCWlmICghTXlfU0hHZXRTcGVjaWFsRm9sZGVyUGF0aCkgewotCQlnX1B5RXJyX0Zvcm1hdChnX1B5RXhjX09TRXJyb3IsICJmdW5jdGlvbiBub3QgYXZhaWxhYmxlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoIWdfUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyIsICZuYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlmb3IgKGkgPSAwOyBpIDwgRElNKGNzaWRsX25hbWVzKTsgKytpKSB7Ci0JCWlmICgwID09IHN0cmNtcGkoY3NpZGxfbmFtZXNbaV0ubmFtZSwgbmFtZSkpIHsKLQkJCWludCBuRm9sZGVyOwotCQkJbkZvbGRlciA9IGNzaWRsX25hbWVzW2ldLm5Gb2xkZXI7Ci0JCQlpZiAoTXlfU0hHZXRTcGVjaWFsRm9sZGVyUGF0aChOVUxMLCBscHN6UGF0aCwKLQkJCQkJCSAgICAgIG5Gb2xkZXIsIDApKQotCQkJCXJldHVybiBnX1B5X0J1aWxkVmFsdWUoInMiLCBscHN6UGF0aCk7Ci0JCQllbHNlIHsKLQkJCQlnX1B5RXJyX0Zvcm1hdChnX1B5RXhjX09TRXJyb3IsCi0JCQkJCSAgICAgICAibm8gc3VjaCBmb2xkZXIgKCVzKSIsIG5hbWUpOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQkKLQkJfQotCX07Ci0JZ19QeUVycl9Gb3JtYXQoZ19QeUV4Y19WYWx1ZUVycm9yLCAidW5rbm93biBDU0lETCAoJXMpIiwgbmFtZSk7Ci0JcmV0dXJuIE5VTEw7CisgICAgaWYgKCFNeV9TSEdldFNwZWNpYWxGb2xkZXJQYXRoKSB7CisgICAgICAgIGdfUHlFcnJfRm9ybWF0KGdfUHlFeGNfT1NFcnJvciwgImZ1bmN0aW9uIG5vdCBhdmFpbGFibGUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IERJTShjc2lkbF9uYW1lcyk7ICsraSkgeworICAgICAgICBpZiAoMCA9PSBzdHJjbXBpKGNzaWRsX25hbWVzW2ldLm5hbWUsIG5hbWUpKSB7CisgICAgICAgICAgICBpbnQgbkZvbGRlcjsKKyAgICAgICAgICAgIG5Gb2xkZXIgPSBjc2lkbF9uYW1lc1tpXS5uRm9sZGVyOworICAgICAgICAgICAgaWYgKE15X1NIR2V0U3BlY2lhbEZvbGRlclBhdGgoTlVMTCwgbHBzelBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuRm9sZGVyLCAwKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZ19QeV9CdWlsZFZhbHVlKCJzIiwgbHBzelBhdGgpOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgZ19QeUVycl9Gb3JtYXQoZ19QeUV4Y19PU0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJubyBzdWNoIGZvbGRlciAoJXMpIiwgbmFtZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgIH07CisgICAgZ19QeUVycl9Gb3JtYXQoZ19QeUV4Y19WYWx1ZUVycm9yLCAidW5rbm93biBDU0lETCAoJXMpIiwgbmFtZSk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3JlYXRlU2hvcnRjdXQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKnBhdGg7IC8qIHBhdGggYW5kIGZpbGVuYW1lICovCi0JY2hhciAqZGVzY3JpcHRpb247Ci0JY2hhciAqZmlsZW5hbWU7CisgICAgY2hhciAqcGF0aDsgLyogcGF0aCBhbmQgZmlsZW5hbWUgKi8KKyAgICBjaGFyICpkZXNjcmlwdGlvbjsKKyAgICBjaGFyICpmaWxlbmFtZTsKIAotCWNoYXIgKmFyZ3VtZW50cyA9IE5VTEw7Ci0JY2hhciAqaWNvbnBhdGggPSBOVUxMOwotCWludCBpY29uaW5kZXggPSAwOwotCWNoYXIgKndvcmtkaXIgPSBOVUxMOworICAgIGNoYXIgKmFyZ3VtZW50cyA9IE5VTEw7CisgICAgY2hhciAqaWNvbnBhdGggPSBOVUxMOworICAgIGludCBpY29uaW5kZXggPSAwOworICAgIGNoYXIgKndvcmtkaXIgPSBOVUxMOwogCi0JV0NIQVIgd3N6RmlsZW5hbWVbTUFYX1BBVEhdOworICAgIFdDSEFSIHdzekZpbGVuYW1lW01BWF9QQVRIXTsKIAotCUlTaGVsbExpbmsgKnBzMSA9IE5VTEw7Ci0JSVBlcnNpc3RGaWxlICpwUGYgPSBOVUxMOworICAgIElTaGVsbExpbmsgKnBzMSA9IE5VTEw7CisgICAgSVBlcnNpc3RGaWxlICpwUGYgPSBOVUxMOwogCi0JSFJFU1VMVCBocjsKKyAgICBIUkVTVUxUIGhyOwogCi0JaHIgPSBDb0luaXRpYWxpemUoTlVMTCk7Ci0JaWYgKEZBSUxFRChocikpIHsKLQkJZ19QeUVycl9Gb3JtYXQoZ19QeUV4Y19PU0Vycm9yLAotCQkJICAgICAgICJDb0luaXRpYWxpemUgZmFpbGVkLCBlcnJvciAweCV4IiwgaHIpOwotCQlnb3RvIGVycm9yOwotCX0KKyAgICBociA9IENvSW5pdGlhbGl6ZShOVUxMKTsKKyAgICBpZiAoRkFJTEVEKGhyKSkgeworICAgICAgICBnX1B5RXJyX0Zvcm1hdChnX1B5RXhjX09TRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICJDb0luaXRpYWxpemUgZmFpbGVkLCBlcnJvciAweCV4IiwgaHIpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KIAotCWlmICghZ19QeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzc3N8c3NzaSIsCi0JCQkJJnBhdGgsICZkZXNjcmlwdGlvbiwgJmZpbGVuYW1lLAotCQkJCSZhcmd1bWVudHMsICZ3b3JrZGlyLCAmaWNvbnBhdGgsICZpY29uaW5kZXgpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdfUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic3NzfHNzc2kiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXRoLCAmZGVzY3JpcHRpb24sICZmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXJndW1lbnRzLCAmd29ya2RpciwgJmljb25wYXRoLCAmaWNvbmluZGV4KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlociA9IENvQ3JlYXRlSW5zdGFuY2UoJkNMU0lEX1NoZWxsTGluaywKLQkJCSAgICAgIE5VTEwsCi0JCQkgICAgICBDTFNDVFhfSU5QUk9DX1NFUlZFUiwKLQkJCSAgICAgICZJSURfSVNoZWxsTGluaywKLQkJCSAgICAgICZwczEpOwotCWlmIChGQUlMRUQoaHIpKSB7Ci0JCWdfUHlFcnJfRm9ybWF0KGdfUHlFeGNfT1NFcnJvciwKLQkJCSAgICAgICAiQ29DcmVhdGVJbnN0YW5jZSBmYWlsZWQsIGVycm9yIDB4JXgiLCBocik7Ci0JCWdvdG8gZXJyb3I7Ci0JfQorICAgIGhyID0gQ29DcmVhdGVJbnN0YW5jZSgmQ0xTSURfU2hlbGxMaW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDTFNDVFhfSU5QUk9DX1NFUlZFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJklJRF9JU2hlbGxMaW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcHMxKTsKKyAgICBpZiAoRkFJTEVEKGhyKSkgeworICAgICAgICBnX1B5RXJyX0Zvcm1hdChnX1B5RXhjX09TRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICJDb0NyZWF0ZUluc3RhbmNlIGZhaWxlZCwgZXJyb3IgMHgleCIsIGhyKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CiAKLQlociA9IHBzMS0+bHBWdGJsLT5RdWVyeUludGVyZmFjZShwczEsICZJSURfSVBlcnNpc3RGaWxlLAotCQkJCQkgKHZvaWQgKiopJnBQZik7Ci0JaWYgKEZBSUxFRChocikpIHsKLQkJZ19QeUVycl9Gb3JtYXQoZ19QeUV4Y19PU0Vycm9yLAotCQkJICAgICAgICJRdWVyeUludGVyZmFjZShJUGVyc2lzdEZpbGUpIGVycm9yIDB4JXgiLCBocik7Ci0JCWdvdG8gZXJyb3I7Ci0JfQorICAgIGhyID0gcHMxLT5scFZ0YmwtPlF1ZXJ5SW50ZXJmYWNlKHBzMSwgJklJRF9JUGVyc2lzdEZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiopJnBQZik7CisgICAgaWYgKEZBSUxFRChocikpIHsKKyAgICAgICAgZ19QeUVycl9Gb3JtYXQoZ19QeUV4Y19PU0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAiUXVlcnlJbnRlcmZhY2UoSVBlcnNpc3RGaWxlKSBlcnJvciAweCV4IiwgaHIpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KIAogCi0JaHIgPSBwczEtPmxwVnRibC0+U2V0UGF0aChwczEsIHBhdGgpOwotCWlmIChGQUlMRUQoaHIpKSB7Ci0JCWdfUHlFcnJfRm9ybWF0KGdfUHlFeGNfT1NFcnJvciwKLQkJCSAgICAgICAiU2V0UGF0aCgpIGZhaWxlZCwgZXJyb3IgMHgleCIsIGhyKTsKLQkJZ290byBlcnJvcjsKLQl9CisgICAgaHIgPSBwczEtPmxwVnRibC0+U2V0UGF0aChwczEsIHBhdGgpOworICAgIGlmIChGQUlMRUQoaHIpKSB7CisgICAgICAgIGdfUHlFcnJfRm9ybWF0KGdfUHlFeGNfT1NFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIlNldFBhdGgoKSBmYWlsZWQsIGVycm9yIDB4JXgiLCBocik7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQogCi0JaHIgPSBwczEtPmxwVnRibC0+U2V0RGVzY3JpcHRpb24ocHMxLCBkZXNjcmlwdGlvbik7Ci0JaWYgKEZBSUxFRChocikpIHsKLQkJZ19QeUVycl9Gb3JtYXQoZ19QeUV4Y19PU0Vycm9yLAotCQkJICAgICAgICJTZXREZXNjcmlwdGlvbigpIGZhaWxlZCwgZXJyb3IgMHgleCIsIGhyKTsKLQkJZ290byBlcnJvcjsKLQl9CisgICAgaHIgPSBwczEtPmxwVnRibC0+U2V0RGVzY3JpcHRpb24ocHMxLCBkZXNjcmlwdGlvbik7CisgICAgaWYgKEZBSUxFRChocikpIHsKKyAgICAgICAgZ19QeUVycl9Gb3JtYXQoZ19QeUV4Y19PU0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAiU2V0RGVzY3JpcHRpb24oKSBmYWlsZWQsIGVycm9yIDB4JXgiLCBocik7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQogCi0JaWYgKGFyZ3VtZW50cykgewotCQlociA9IHBzMS0+bHBWdGJsLT5TZXRBcmd1bWVudHMocHMxLCBhcmd1bWVudHMpOwotCQlpZiAoRkFJTEVEKGhyKSkgewotCQkJZ19QeUVycl9Gb3JtYXQoZ19QeUV4Y19PU0Vycm9yLAotCQkJCSAgICAgICAiU2V0QXJndW1lbnRzKCkgZXJyb3IgMHgleCIsIGhyKTsKLQkJCWdvdG8gZXJyb3I7Ci0JCX0KLQl9CisgICAgaWYgKGFyZ3VtZW50cykgeworICAgICAgICBociA9IHBzMS0+bHBWdGJsLT5TZXRBcmd1bWVudHMocHMxLCBhcmd1bWVudHMpOworICAgICAgICBpZiAoRkFJTEVEKGhyKSkgeworICAgICAgICAgICAgZ19QeUVycl9Gb3JtYXQoZ19QeUV4Y19PU0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNldEFyZ3VtZW50cygpIGVycm9yIDB4JXgiLCBocik7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgfQogCi0JaWYgKGljb25wYXRoKSB7Ci0JCWhyID0gcHMxLT5scFZ0YmwtPlNldEljb25Mb2NhdGlvbihwczEsIGljb25wYXRoLCBpY29uaW5kZXgpOwotCQlpZiAoRkFJTEVEKGhyKSkgewotCQkJZ19QeUVycl9Gb3JtYXQoZ19QeUV4Y19PU0Vycm9yLAotCQkJCSAgICAgICAiU2V0SWNvbkxvY2F0aW9uKCkgZXJyb3IgMHgleCIsIGhyKTsKLQkJCWdvdG8gZXJyb3I7Ci0JCX0KLQl9CisgICAgaWYgKGljb25wYXRoKSB7CisgICAgICAgIGhyID0gcHMxLT5scFZ0YmwtPlNldEljb25Mb2NhdGlvbihwczEsIGljb25wYXRoLCBpY29uaW5kZXgpOworICAgICAgICBpZiAoRkFJTEVEKGhyKSkgeworICAgICAgICAgICAgZ19QeUVycl9Gb3JtYXQoZ19QeUV4Y19PU0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNldEljb25Mb2NhdGlvbigpIGVycm9yIDB4JXgiLCBocik7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgfQogCi0JaWYgKHdvcmtkaXIpIHsKLQkJaHIgPSBwczEtPmxwVnRibC0+U2V0V29ya2luZ0RpcmVjdG9yeShwczEsIHdvcmtkaXIpOwotCQlpZiAoRkFJTEVEKGhyKSkgewotCQkJZ19QeUVycl9Gb3JtYXQoZ19QeUV4Y19PU0Vycm9yLAotCQkJCSAgICAgICAiU2V0V29ya2luZ0RpcmVjdG9yeSgpIGVycm9yIDB4JXgiLCBocik7Ci0JCQlnb3RvIGVycm9yOwotCQl9Ci0JfQorICAgIGlmICh3b3JrZGlyKSB7CisgICAgICAgIGhyID0gcHMxLT5scFZ0YmwtPlNldFdvcmtpbmdEaXJlY3RvcnkocHMxLCB3b3JrZGlyKTsKKyAgICAgICAgaWYgKEZBSUxFRChocikpIHsKKyAgICAgICAgICAgIGdfUHlFcnJfRm9ybWF0KGdfUHlFeGNfT1NFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZXRXb3JraW5nRGlyZWN0b3J5KCkgZXJyb3IgMHgleCIsIGhyKTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICB9CiAKLQlNdWx0aUJ5dGVUb1dpZGVDaGFyKENQX0FDUCwgMCwKLQkJCSAgICBmaWxlbmFtZSwgLTEsCi0JCQkgICAgd3N6RmlsZW5hbWUsIE1BWF9QQVRIKTsKLQkJCQotCWhyID0gcFBmLT5scFZ0YmwtPlNhdmUocFBmLCB3c3pGaWxlbmFtZSwgVFJVRSk7Ci0JaWYgKEZBSUxFRChocikpIHsKLQkJZ19QeUVycl9Gb3JtYXQoZ19QeUV4Y19PU0Vycm9yLAotCQkJICAgICAgICJGYWlsZWQgdG8gY3JlYXRlIHNob3J0Y3V0ICclcycgLSBlcnJvciAweCV4IiwgZmlsZW5hbWUsIGhyKTsKLQkJZ290byBlcnJvcjsKLQl9Ci0gICAgCi0JcFBmLT5scFZ0YmwtPlJlbGVhc2UocFBmKTsKLQlwczEtPmxwVnRibC0+UmVsZWFzZShwczEpOwotCUNvVW5pbml0aWFsaXplKCk7Ci0JcmV0dXJuIGdfUHlfQnVpbGRWYWx1ZSgiIik7Ci0gICAgCisgICAgTXVsdGlCeXRlVG9XaWRlQ2hhcihDUF9BQ1AsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSwgLTEsCisgICAgICAgICAgICAgICAgICAgICAgICB3c3pGaWxlbmFtZSwgTUFYX1BBVEgpOworCisgICAgaHIgPSBwUGYtPmxwVnRibC0+U2F2ZShwUGYsIHdzekZpbGVuYW1lLCBUUlVFKTsKKyAgICBpZiAoRkFJTEVEKGhyKSkgeworICAgICAgICBnX1B5RXJyX0Zvcm1hdChnX1B5RXhjX09TRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gY3JlYXRlIHNob3J0Y3V0ICclcycgLSBlcnJvciAweCV4IiwgZmlsZW5hbWUsIGhyKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICBwUGYtPmxwVnRibC0+UmVsZWFzZShwUGYpOworICAgIHBzMS0+bHBWdGJsLT5SZWxlYXNlKHBzMSk7CisgICAgQ29VbmluaXRpYWxpemUoKTsKKyAgICByZXR1cm4gZ19QeV9CdWlsZFZhbHVlKCIiKTsKKwogICBlcnJvcjoKLQlpZiAocFBmKQotCQlwUGYtPmxwVnRibC0+UmVsZWFzZShwUGYpOworICAgIGlmIChwUGYpCisgICAgICAgIHBQZi0+bHBWdGJsLT5SZWxlYXNlKHBQZik7CiAKLQlpZiAocHMxKQotCQlwczEtPmxwVnRibC0+UmVsZWFzZShwczEpOworICAgIGlmIChwczEpCisgICAgICAgIHBzMS0+bHBWdGJsLT5SZWxlYXNlKHBzMSk7CiAKLQlDb1VuaW5pdGlhbGl6ZSgpOworICAgIENvVW5pbml0aWFsaXplKCk7CiAKLQlyZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpQeU1lc3NhZ2VCb3goUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCByYzsKLQljaGFyICp0ZXh0LCAqY2FwdGlvbjsKLQlpbnQgZmxhZ3M7Ci0JaWYgKCFnX1B5QXJnX1BhcnNlVHVwbGUoYXJncywgInNzaSIsICZ0ZXh0LCAmY2FwdGlvbiwgJmZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmMgPSBNZXNzYWdlQm94KEdldEZvY3VzKCksIHRleHQsIGNhcHRpb24sIGZsYWdzKTsKLQlyZXR1cm4gZ19QeV9CdWlsZFZhbHVlKCJpIiwgcmMpOworICAgIGludCByYzsKKyAgICBjaGFyICp0ZXh0LCAqY2FwdGlvbjsKKyAgICBpbnQgZmxhZ3M7CisgICAgaWYgKCFnX1B5QXJnX1BhcnNlVHVwbGUoYXJncywgInNzaSIsICZ0ZXh0LCAmY2FwdGlvbiwgJmZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmMgPSBNZXNzYWdlQm94KEdldEZvY3VzKCksIHRleHQsIGNhcHRpb24sIGZsYWdzKTsKKyAgICByZXR1cm4gZ19QeV9CdWlsZFZhbHVlKCJpIiwgcmMpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdldFJvb3RIS2V5KFB5T2JqZWN0ICpzZWxmKQogewotCXJldHVybiBnX1B5TG9uZ19Gcm9tVm9pZFB0cihoa2V5X3Jvb3QpOworICAgIHJldHVybiBnX1B5TG9uZ19Gcm9tVm9pZFB0cihoa2V5X3Jvb3QpOwogfQogCiAjZGVmaW5lIE1FVEhfVkFSQVJHUyAweDAwMDEKQEAgLTYxMyw3NCArNjEzLDc0IEBACiB0eXBlZGVmIFB5T2JqZWN0ICooKlB5Q0Z1bmN0aW9uKShQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKIAogUHlNZXRob2REZWYgbWV0aFtdID0gewotCXsiY3JlYXRlX3Nob3J0Y3V0IiwgQ3JlYXRlU2hvcnRjdXQsIE1FVEhfVkFSQVJHUywgTlVMTH0sCi0JeyJnZXRfc3BlY2lhbF9mb2xkZXJfcGF0aCIsIEdldFNwZWNpYWxGb2xkZXJQYXRoLCBNRVRIX1ZBUkFSR1MsIE5VTEx9LAotCXsiZ2V0X3Jvb3RfaGtleSIsIChQeUNGdW5jdGlvbilHZXRSb290SEtleSwgTUVUSF9OT0FSR1MsIE5VTEx9LAotCXsiZmlsZV9jcmVhdGVkIiwgRmlsZUNyZWF0ZWQsIE1FVEhfVkFSQVJHUywgTlVMTH0sCi0JeyJkaXJlY3RvcnlfY3JlYXRlZCIsIERpcmVjdG9yeUNyZWF0ZWQsIE1FVEhfVkFSQVJHUywgTlVMTH0sCi0JeyJtZXNzYWdlX2JveCIsIFB5TWVzc2FnZUJveCwgTUVUSF9WQVJBUkdTLCBOVUxMfSwKKyAgICB7ImNyZWF0ZV9zaG9ydGN1dCIsIENyZWF0ZVNob3J0Y3V0LCBNRVRIX1ZBUkFSR1MsIE5VTEx9LAorICAgIHsiZ2V0X3NwZWNpYWxfZm9sZGVyX3BhdGgiLCBHZXRTcGVjaWFsRm9sZGVyUGF0aCwgTUVUSF9WQVJBUkdTLCBOVUxMfSwKKyAgICB7ImdldF9yb290X2hrZXkiLCAoUHlDRnVuY3Rpb24pR2V0Um9vdEhLZXksIE1FVEhfTk9BUkdTLCBOVUxMfSwKKyAgICB7ImZpbGVfY3JlYXRlZCIsIEZpbGVDcmVhdGVkLCBNRVRIX1ZBUkFSR1MsIE5VTEx9LAorICAgIHsiZGlyZWN0b3J5X2NyZWF0ZWQiLCBEaXJlY3RvcnlDcmVhdGVkLCBNRVRIX1ZBUkFSR1MsIE5VTEx9LAorICAgIHsibWVzc2FnZV9ib3giLCBQeU1lc3NhZ2VCb3gsIE1FVEhfVkFSQVJHUywgTlVMTH0sCiB9OwogCiBzdGF0aWMgSElOU1RBTkNFIExvYWRQeXRob25EbGwoY2hhciAqZm5hbWUpCiB7Ci0JY2hhciBmdWxscGF0aFtfTUFYX1BBVEhdOwotCUxPTkcgc2l6ZSA9IHNpemVvZihmdWxscGF0aCk7Ci0JY2hhciBzdWJrZXlfbmFtZVs4MF07Ci0JY2hhciBidWZmZXJbMjYwICsgMTJdOwotCUhJTlNUQU5DRSBoOworICAgIGNoYXIgZnVsbHBhdGhbX01BWF9QQVRIXTsKKyAgICBMT05HIHNpemUgPSBzaXplb2YoZnVsbHBhdGgpOworICAgIGNoYXIgc3Via2V5X25hbWVbODBdOworICAgIGNoYXIgYnVmZmVyWzI2MCArIDEyXTsKKyAgICBISU5TVEFOQ0UgaDsKIAotCS8qIG1ha2Ugc3VyZSBQWVRIT05IT01FIGlzIHNldCwgdG8gdGhhdCBzeXMucGF0aCBpcyBpbml0aWFsaXplZCBjb3JyZWN0bHkgKi8KLQl3c3ByaW50ZihidWZmZXIsICJQWVRIT05IT01FPSVzIiwgcHl0aG9uX2Rpcik7Ci0JX3B1dGVudihidWZmZXIpOwotCWggPSBMb2FkTGlicmFyeShmbmFtZSk7Ci0JaWYgKGgpCi0JCXJldHVybiBoOwotCXdzcHJpbnRmKHN1YmtleV9uYW1lLAotCQkgIlNPRlRXQVJFXFxQeXRob25cXFB5dGhvbkNvcmVcXCVkLiVkXFxJbnN0YWxsUGF0aCIsCi0JCSBweV9tYWpvciwgcHlfbWlub3IpOwotCWlmIChFUlJPUl9TVUNDRVNTICE9IFJlZ1F1ZXJ5VmFsdWUoSEtFWV9DVVJSRU5UX1VTRVIsIHN1YmtleV9uYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVsbHBhdGgsICZzaXplKSAmJgotCSAgICBFUlJPUl9TVUNDRVNTICE9IFJlZ1F1ZXJ5VmFsdWUoSEtFWV9MT0NBTF9NQUNISU5FLCBzdWJrZXlfbmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGxwYXRoLCAmc2l6ZSkpCi0JCXJldHVybiBOVUxMOwotCXN0cmNhdChmdWxscGF0aCwgIlxcIik7Ci0Jc3RyY2F0KGZ1bGxwYXRoLCBmbmFtZSk7Ci0JcmV0dXJuIExvYWRMaWJyYXJ5KGZ1bGxwYXRoKTsKKyAgICAvKiBtYWtlIHN1cmUgUFlUSE9OSE9NRSBpcyBzZXQsIHRvIHRoYXQgc3lzLnBhdGggaXMgaW5pdGlhbGl6ZWQgY29ycmVjdGx5ICovCisgICAgd3NwcmludGYoYnVmZmVyLCAiUFlUSE9OSE9NRT0lcyIsIHB5dGhvbl9kaXIpOworICAgIF9wdXRlbnYoYnVmZmVyKTsKKyAgICBoID0gTG9hZExpYnJhcnkoZm5hbWUpOworICAgIGlmIChoKQorICAgICAgICByZXR1cm4gaDsKKyAgICB3c3ByaW50ZihzdWJrZXlfbmFtZSwKKyAgICAgICAgICAgICAiU09GVFdBUkVcXFB5dGhvblxcUHl0aG9uQ29yZVxcJWQuJWRcXEluc3RhbGxQYXRoIiwKKyAgICAgICAgICAgICBweV9tYWpvciwgcHlfbWlub3IpOworICAgIGlmIChFUlJPUl9TVUNDRVNTICE9IFJlZ1F1ZXJ5VmFsdWUoSEtFWV9DVVJSRU5UX1VTRVIsIHN1YmtleV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVsbHBhdGgsICZzaXplKSAmJgorICAgICAgICBFUlJPUl9TVUNDRVNTICE9IFJlZ1F1ZXJ5VmFsdWUoSEtFWV9MT0NBTF9NQUNISU5FLCBzdWJrZXlfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGxwYXRoLCAmc2l6ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHN0cmNhdChmdWxscGF0aCwgIlxcIik7CisgICAgc3RyY2F0KGZ1bGxwYXRoLCBmbmFtZSk7CisgICAgcmV0dXJuIExvYWRMaWJyYXJ5KGZ1bGxwYXRoKTsKIH0KIAogc3RhdGljIGludCBwcmVwYXJlX3NjcmlwdF9lbnZpcm9ubWVudChISU5TVEFOQ0UgaFB5dGhvbikKIHsKLQlQeU9iamVjdCAqbW9kOwotCURFQ0xQUk9DKGhQeXRob24sIFB5T2JqZWN0ICosIFB5SW1wb3J0X0ltcG9ydE1vZHVsZSwgKGNoYXIgKikpOwotCURFQ0xQUk9DKGhQeXRob24sIGludCwgUHlPYmplY3RfU2V0QXR0clN0cmluZywgKFB5T2JqZWN0ICosIGNoYXIgKiwgUHlPYmplY3QgKikpOwotCURFQ0xQUk9DKGhQeXRob24sIFB5T2JqZWN0ICosIFB5T2JqZWN0X0dldEF0dHJTdHJpbmcsIChQeU9iamVjdCAqLCBjaGFyICopKTsKLQlERUNMUFJPQyhoUHl0aG9uLCBQeU9iamVjdCAqLCBQeUNGdW5jdGlvbl9OZXcsIChQeU1ldGhvZERlZiAqLCBQeU9iamVjdCAqKSk7Ci0JREVDTFBST0MoaFB5dGhvbiwgUHlPYmplY3QgKiwgUHlfQnVpbGRWYWx1ZSwgKGNoYXIgKiwgLi4uKSk7Ci0JREVDTFBST0MoaFB5dGhvbiwgaW50LCBQeUFyZ19QYXJzZVR1cGxlLCAoUHlPYmplY3QgKiwgY2hhciAqLCAuLi4pKTsKLQlERUNMUFJPQyhoUHl0aG9uLCBQeU9iamVjdCAqLCBQeUVycl9Gb3JtYXQsIChQeU9iamVjdCAqLCBjaGFyICopKTsKLQlERUNMUFJPQyhoUHl0aG9uLCBQeU9iamVjdCAqLCBQeUxvbmdfRnJvbVZvaWRQdHIsICh2b2lkICopKTsKLQlpZiAoIVB5SW1wb3J0X0ltcG9ydE1vZHVsZSB8fCAhUHlPYmplY3RfR2V0QXR0clN0cmluZyB8fCAKLQkgICAgIVB5T2JqZWN0X1NldEF0dHJTdHJpbmcgfHwgIVB5Q0Z1bmN0aW9uX05ldykKLQkJcmV0dXJuIDE7Ci0JaWYgKCFQeV9CdWlsZFZhbHVlIHx8ICFQeUFyZ19QYXJzZVR1cGxlIHx8ICFQeUVycl9Gb3JtYXQpCi0JCXJldHVybiAxOworICAgIFB5T2JqZWN0ICptb2Q7CisgICAgREVDTFBST0MoaFB5dGhvbiwgUHlPYmplY3QgKiwgUHlJbXBvcnRfSW1wb3J0TW9kdWxlLCAoY2hhciAqKSk7CisgICAgREVDTFBST0MoaFB5dGhvbiwgaW50LCBQeU9iamVjdF9TZXRBdHRyU3RyaW5nLCAoUHlPYmplY3QgKiwgY2hhciAqLCBQeU9iamVjdCAqKSk7CisgICAgREVDTFBST0MoaFB5dGhvbiwgUHlPYmplY3QgKiwgUHlPYmplY3RfR2V0QXR0clN0cmluZywgKFB5T2JqZWN0ICosIGNoYXIgKikpOworICAgIERFQ0xQUk9DKGhQeXRob24sIFB5T2JqZWN0ICosIFB5Q0Z1bmN0aW9uX05ldywgKFB5TWV0aG9kRGVmICosIFB5T2JqZWN0ICopKTsKKyAgICBERUNMUFJPQyhoUHl0aG9uLCBQeU9iamVjdCAqLCBQeV9CdWlsZFZhbHVlLCAoY2hhciAqLCAuLi4pKTsKKyAgICBERUNMUFJPQyhoUHl0aG9uLCBpbnQsIFB5QXJnX1BhcnNlVHVwbGUsIChQeU9iamVjdCAqLCBjaGFyICosIC4uLikpOworICAgIERFQ0xQUk9DKGhQeXRob24sIFB5T2JqZWN0ICosIFB5RXJyX0Zvcm1hdCwgKFB5T2JqZWN0ICosIGNoYXIgKikpOworICAgIERFQ0xQUk9DKGhQeXRob24sIFB5T2JqZWN0ICosIFB5TG9uZ19Gcm9tVm9pZFB0ciwgKHZvaWQgKikpOworICAgIGlmICghUHlJbXBvcnRfSW1wb3J0TW9kdWxlIHx8ICFQeU9iamVjdF9HZXRBdHRyU3RyaW5nIHx8CisgICAgICAgICFQeU9iamVjdF9TZXRBdHRyU3RyaW5nIHx8ICFQeUNGdW5jdGlvbl9OZXcpCisgICAgICAgIHJldHVybiAxOworICAgIGlmICghUHlfQnVpbGRWYWx1ZSB8fCAhUHlBcmdfUGFyc2VUdXBsZSB8fCAhUHlFcnJfRm9ybWF0KQorICAgICAgICByZXR1cm4gMTsKIAotCW1vZCA9IFB5SW1wb3J0X0ltcG9ydE1vZHVsZSgiX19idWlsdGluX18iKTsKLQlpZiAobW9kKSB7Ci0JCWludCBpOwotCQlnX1B5RXhjX1ZhbHVlRXJyb3IgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKG1vZCwgIlZhbHVlRXJyb3IiKTsKLQkJZ19QeUV4Y19PU0Vycm9yID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhtb2QsICJPU0Vycm9yIik7Ci0JCWZvciAoaSA9IDA7IGkgPCBESU0obWV0aCk7ICsraSkgewotCQkJUHlPYmplY3RfU2V0QXR0clN0cmluZyhtb2QsIG1ldGhbaV0ubWxfbmFtZSwKLQkJCQkJICAgICAgIFB5Q0Z1bmN0aW9uX05ldygmbWV0aFtpXSwgTlVMTCkpOwotCQl9Ci0JfQotCWdfUHlfQnVpbGRWYWx1ZSA9IFB5X0J1aWxkVmFsdWU7Ci0JZ19QeUFyZ19QYXJzZVR1cGxlID0gUHlBcmdfUGFyc2VUdXBsZTsKLQlnX1B5RXJyX0Zvcm1hdCA9IFB5RXJyX0Zvcm1hdDsKLQlnX1B5TG9uZ19Gcm9tVm9pZFB0ciA9IFB5TG9uZ19Gcm9tVm9pZFB0cjsKKyAgICBtb2QgPSBQeUltcG9ydF9JbXBvcnRNb2R1bGUoIl9fYnVpbHRpbl9fIik7CisgICAgaWYgKG1vZCkgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgZ19QeUV4Y19WYWx1ZUVycm9yID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhtb2QsICJWYWx1ZUVycm9yIik7CisgICAgICAgIGdfUHlFeGNfT1NFcnJvciA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcobW9kLCAiT1NFcnJvciIpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgRElNKG1ldGgpOyArK2kpIHsKKyAgICAgICAgICAgIFB5T2JqZWN0X1NldEF0dHJTdHJpbmcobW9kLCBtZXRoW2ldLm1sX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5Q0Z1bmN0aW9uX05ldygmbWV0aFtpXSwgTlVMTCkpOworICAgICAgICB9CisgICAgfQorICAgIGdfUHlfQnVpbGRWYWx1ZSA9IFB5X0J1aWxkVmFsdWU7CisgICAgZ19QeUFyZ19QYXJzZVR1cGxlID0gUHlBcmdfUGFyc2VUdXBsZTsKKyAgICBnX1B5RXJyX0Zvcm1hdCA9IFB5RXJyX0Zvcm1hdDsKKyAgICBnX1B5TG9uZ19Gcm9tVm9pZFB0ciA9IFB5TG9uZ19Gcm9tVm9pZFB0cjsKIAotCXJldHVybiAwOworICAgIHJldHVybiAwOwogfQogCiAvKgpAQCAtNjk2LDQ3MyArNjk2LDQ3MyBAQAogc3RhdGljIGludAogZG9fcnVuX2luc3RhbGxzY3JpcHQoSElOU1RBTkNFIGhQeXRob24sIGNoYXIgKnBhdGhuYW1lLCBpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiB7Ci0JaW50IGZoLCByZXN1bHQ7Ci0JREVDTFBST0MoaFB5dGhvbiwgdm9pZCwgUHlfSW5pdGlhbGl6ZSwgKHZvaWQpKTsKLQlERUNMUFJPQyhoUHl0aG9uLCBpbnQsIFB5U3lzX1NldEFyZ3YsIChpbnQsIGNoYXIgKiopKTsKLQlERUNMUFJPQyhoUHl0aG9uLCBpbnQsIFB5UnVuX1NpbXBsZVN0cmluZywgKGNoYXIgKikpOwotCURFQ0xQUk9DKGhQeXRob24sIHZvaWQsIFB5X0ZpbmFsaXplLCAodm9pZCkpOwotCURFQ0xQUk9DKGhQeXRob24sIFB5T2JqZWN0ICosIFB5X0J1aWxkVmFsdWUsIChjaGFyICosIC4uLikpOwotCURFQ0xQUk9DKGhQeXRob24sIFB5T2JqZWN0ICosIFB5Q0Z1bmN0aW9uX05ldywKLQkJIChQeU1ldGhvZERlZiAqLCBQeU9iamVjdCAqKSk7Ci0JREVDTFBST0MoaFB5dGhvbiwgaW50LCBQeUFyZ19QYXJzZVR1cGxlLCAoUHlPYmplY3QgKiwgY2hhciAqLCAuLi4pKTsKLQlERUNMUFJPQyhoUHl0aG9uLCBQeU9iamVjdCAqLCBQeUVycl9Gb3JtYXQsIChQeU9iamVjdCAqLCBjaGFyICopKTsKKyAgICBpbnQgZmgsIHJlc3VsdDsKKyAgICBERUNMUFJPQyhoUHl0aG9uLCB2b2lkLCBQeV9Jbml0aWFsaXplLCAodm9pZCkpOworICAgIERFQ0xQUk9DKGhQeXRob24sIGludCwgUHlTeXNfU2V0QXJndiwgKGludCwgY2hhciAqKikpOworICAgIERFQ0xQUk9DKGhQeXRob24sIGludCwgUHlSdW5fU2ltcGxlU3RyaW5nLCAoY2hhciAqKSk7CisgICAgREVDTFBST0MoaFB5dGhvbiwgdm9pZCwgUHlfRmluYWxpemUsICh2b2lkKSk7CisgICAgREVDTFBST0MoaFB5dGhvbiwgUHlPYmplY3QgKiwgUHlfQnVpbGRWYWx1ZSwgKGNoYXIgKiwgLi4uKSk7CisgICAgREVDTFBST0MoaFB5dGhvbiwgUHlPYmplY3QgKiwgUHlDRnVuY3Rpb25fTmV3LAorICAgICAgICAgICAgIChQeU1ldGhvZERlZiAqLCBQeU9iamVjdCAqKSk7CisgICAgREVDTFBST0MoaFB5dGhvbiwgaW50LCBQeUFyZ19QYXJzZVR1cGxlLCAoUHlPYmplY3QgKiwgY2hhciAqLCAuLi4pKTsKKyAgICBERUNMUFJPQyhoUHl0aG9uLCBQeU9iamVjdCAqLCBQeUVycl9Gb3JtYXQsIChQeU9iamVjdCAqLCBjaGFyICopKTsKIAotCWlmICghUHlfSW5pdGlhbGl6ZSB8fCAhUHlTeXNfU2V0QXJndgotCSAgICB8fCAhUHlSdW5fU2ltcGxlU3RyaW5nIHx8ICFQeV9GaW5hbGl6ZSkKLQkJcmV0dXJuIDE7Ci0JCi0JaWYgKCFQeV9CdWlsZFZhbHVlIHx8ICFQeUFyZ19QYXJzZVR1cGxlIHx8ICFQeUVycl9Gb3JtYXQpCi0JCXJldHVybiAxOworICAgIGlmICghUHlfSW5pdGlhbGl6ZSB8fCAhUHlTeXNfU2V0QXJndgorICAgICAgICB8fCAhUHlSdW5fU2ltcGxlU3RyaW5nIHx8ICFQeV9GaW5hbGl6ZSkKKyAgICAgICAgcmV0dXJuIDE7CiAKLQlpZiAoIVB5Q0Z1bmN0aW9uX05ldyB8fCAhUHlBcmdfUGFyc2VUdXBsZSB8fCAhUHlFcnJfRm9ybWF0KQotCQlyZXR1cm4gMTsKKyAgICBpZiAoIVB5X0J1aWxkVmFsdWUgfHwgIVB5QXJnX1BhcnNlVHVwbGUgfHwgIVB5RXJyX0Zvcm1hdCkKKyAgICAgICAgcmV0dXJuIDE7CiAKLQlpZiAocGF0aG5hbWUgPT0gTlVMTCB8fCBwYXRobmFtZVswXSA9PSAnXDAnKQotCQlyZXR1cm4gMjsKKyAgICBpZiAoIVB5Q0Z1bmN0aW9uX05ldyB8fCAhUHlBcmdfUGFyc2VUdXBsZSB8fCAhUHlFcnJfRm9ybWF0KQorICAgICAgICByZXR1cm4gMTsKIAotCWZoID0gb3BlbihwYXRobmFtZSwgX09fUkRPTkxZKTsKLQlpZiAoLTEgPT0gZmgpIHsKLQkJZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3Qgb3BlbiBwb3N0aW5zdGFsbC1zY3JpcHQgJXNcbiIsCi0JCQlwYXRobmFtZSk7Ci0JCXJldHVybiAzOwotCX0KKyAgICBpZiAocGF0aG5hbWUgPT0gTlVMTCB8fCBwYXRobmFtZVswXSA9PSAnXDAnKQorICAgICAgICByZXR1cm4gMjsKIAotCVNldERsZ0l0ZW1UZXh0KGhEaWFsb2csIElEQ19JTkZPLCAiUnVubmluZyBTY3JpcHQuLi4iKTsKKyAgICBmaCA9IG9wZW4ocGF0aG5hbWUsIF9PX1JET05MWSk7CisgICAgaWYgKC0xID09IGZoKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IG9wZW4gcG9zdGluc3RhbGwtc2NyaXB0ICVzXG4iLAorICAgICAgICAgICAgcGF0aG5hbWUpOworICAgICAgICByZXR1cm4gMzsKKyAgICB9CiAKLQlQeV9Jbml0aWFsaXplKCk7CisgICAgU2V0RGxnSXRlbVRleHQoaERpYWxvZywgSURDX0lORk8sICJSdW5uaW5nIFNjcmlwdC4uLiIpOwogCi0JcHJlcGFyZV9zY3JpcHRfZW52aXJvbm1lbnQoaFB5dGhvbik7Ci0JUHlTeXNfU2V0QXJndihhcmdjLCBhcmd2KTsKLQlyZXN1bHQgPSAzOwotCXsKLQkJc3RydWN0IF9zdGF0IHN0YXRidWY7Ci0JCWlmKDAgPT0gX2ZzdGF0KGZoLCAmc3RhdGJ1ZikpIHsKLQkJCWNoYXIgKnNjcmlwdCA9IGFsbG9jYShzdGF0YnVmLnN0X3NpemUgKyA1KTsKLQkJCWludCBuID0gcmVhZChmaCwgc2NyaXB0LCBzdGF0YnVmLnN0X3NpemUpOwotCQkJaWYgKG4gPiAwKSB7Ci0JCQkJc2NyaXB0W25dID0gJ1xuJzsKLQkJCQlzY3JpcHRbbisxXSA9IDA7Ci0JCQkJcmVzdWx0ID0gUHlSdW5fU2ltcGxlU3RyaW5nKHNjcmlwdCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JUHlfRmluYWxpemUoKTsKKyAgICBQeV9Jbml0aWFsaXplKCk7CiAKLQljbG9zZShmaCk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBwcmVwYXJlX3NjcmlwdF9lbnZpcm9ubWVudChoUHl0aG9uKTsKKyAgICBQeVN5c19TZXRBcmd2KGFyZ2MsIGFyZ3YpOworICAgIHJlc3VsdCA9IDM7CisgICAgeworICAgICAgICBzdHJ1Y3QgX3N0YXQgc3RhdGJ1ZjsKKyAgICAgICAgaWYoMCA9PSBfZnN0YXQoZmgsICZzdGF0YnVmKSkgeworICAgICAgICAgICAgY2hhciAqc2NyaXB0ID0gYWxsb2NhKHN0YXRidWYuc3Rfc2l6ZSArIDUpOworICAgICAgICAgICAgaW50IG4gPSByZWFkKGZoLCBzY3JpcHQsIHN0YXRidWYuc3Rfc2l6ZSk7CisgICAgICAgICAgICBpZiAobiA+IDApIHsKKyAgICAgICAgICAgICAgICBzY3JpcHRbbl0gPSAnXG4nOworICAgICAgICAgICAgICAgIHNjcmlwdFtuKzFdID0gMDsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBQeVJ1bl9TaW1wbGVTdHJpbmcoc2NyaXB0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBQeV9GaW5hbGl6ZSgpOworCisgICAgY2xvc2UoZmgpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBpbnQKIHJ1bl9pbnN0YWxsc2NyaXB0KGNoYXIgKnBhdGhuYW1lLCBpbnQgYXJnYywgY2hhciAqKmFyZ3YsIGNoYXIgKipwT3V0cHV0KQogewotCUhJTlNUQU5DRSBoUHl0aG9uOwotCWludCByZXN1bHQgPSAxOwotCWludCBvdXRfYnVmX3NpemU7Ci0JSEFORExFIHJlZGlyZWN0ZWQsIG9sZF9zdGRlcnIsIG9sZF9zdGRvdXQ7Ci0JY2hhciAqdGVtcG5hbWU7CisgICAgSElOU1RBTkNFIGhQeXRob247CisgICAgaW50IHJlc3VsdCA9IDE7CisgICAgaW50IG91dF9idWZfc2l6ZTsKKyAgICBIQU5ETEUgcmVkaXJlY3RlZCwgb2xkX3N0ZGVyciwgb2xkX3N0ZG91dDsKKyAgICBjaGFyICp0ZW1wbmFtZTsKIAotCSpwT3V0cHV0ID0gTlVMTDsKKyAgICAqcE91dHB1dCA9IE5VTEw7CiAKLQl0ZW1wbmFtZSA9IHRlbXBuYW0oTlVMTCwgTlVMTCk7Ci0JLy8gV2UgdXNlIGEgc3RhdGljIENSVCB3aGlsZSB0aGUgUHl0aG9uIHZlcnNpb24gd2UgbG9hZCB1c2VzCi0JLy8gdGhlIENSVCBmcm9tIG9uZSBvZiB2YXJpb3VzIHBvc3NpYmlsZSBETExzLiAgQXMgYSByZXN1bHQgd2UKLQkvLyBuZWVkIHRvIHJlZGlyZWN0IHRoZSBzdGFuZGFyZCBoYW5kbGVzIHVzaW5nIHRoZSBBUEkgcmF0aGVyCi0JLy8gdGhhbiB0aGUgQ1JULgotCXJlZGlyZWN0ZWQgPSBDcmVhdGVGaWxlKAotCQkJCQl0ZW1wbmFtZSwKLQkJCQkJR0VORVJJQ19XUklURSB8IEdFTkVSSUNfUkVBRCwKLQkJCQkJRklMRV9TSEFSRV9SRUFELAotCQkJCQlOVUxMLAotCQkJCQlDUkVBVEVfQUxXQVlTLAotCQkJCQlGSUxFX0FUVFJJQlVURV9OT1JNQUwgfCBGSUxFX0ZMQUdfV1JJVEVfVEhST1VHSCwKLQkJCQkJTlVMTCk7Ci0Jb2xkX3N0ZG91dCA9IEdldFN0ZEhhbmRsZShTVERfT1VUUFVUX0hBTkRMRSk7Ci0Jb2xkX3N0ZGVyciA9IEdldFN0ZEhhbmRsZShTVERfRVJST1JfSEFORExFKTsKLQlTZXRTdGRIYW5kbGUoU1REX09VVFBVVF9IQU5ETEUsIHJlZGlyZWN0ZWQpOwotCVNldFN0ZEhhbmRsZShTVERfRVJST1JfSEFORExFLCByZWRpcmVjdGVkKTsKKyAgICB0ZW1wbmFtZSA9IHRlbXBuYW0oTlVMTCwgTlVMTCk7CisgICAgLy8gV2UgdXNlIGEgc3RhdGljIENSVCB3aGlsZSB0aGUgUHl0aG9uIHZlcnNpb24gd2UgbG9hZCB1c2VzCisgICAgLy8gdGhlIENSVCBmcm9tIG9uZSBvZiB2YXJpb3VzIHBvc3NpYmlsZSBETExzLiAgQXMgYSByZXN1bHQgd2UKKyAgICAvLyBuZWVkIHRvIHJlZGlyZWN0IHRoZSBzdGFuZGFyZCBoYW5kbGVzIHVzaW5nIHRoZSBBUEkgcmF0aGVyCisgICAgLy8gdGhhbiB0aGUgQ1JULgorICAgIHJlZGlyZWN0ZWQgPSBDcmVhdGVGaWxlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRU5FUklDX1dSSVRFIHwgR0VORVJJQ19SRUFELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklMRV9TSEFSRV9SRUFELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENSRUFURV9BTFdBWVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSUxFX0FUVFJJQlVURV9OT1JNQUwgfCBGSUxFX0ZMQUdfV1JJVEVfVEhST1VHSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgIG9sZF9zdGRvdXQgPSBHZXRTdGRIYW5kbGUoU1REX09VVFBVVF9IQU5ETEUpOworICAgIG9sZF9zdGRlcnIgPSBHZXRTdGRIYW5kbGUoU1REX0VSUk9SX0hBTkRMRSk7CisgICAgU2V0U3RkSGFuZGxlKFNURF9PVVRQVVRfSEFORExFLCByZWRpcmVjdGVkKTsKKyAgICBTZXRTdGRIYW5kbGUoU1REX0VSUk9SX0hBTkRMRSwgcmVkaXJlY3RlZCk7CiAKLQloUHl0aG9uID0gTG9hZFB5dGhvbkRsbChweXRob25kbGwpOwotCWlmIChoUHl0aG9uKSB7Ci0JCXJlc3VsdCA9IGRvX3J1bl9pbnN0YWxsc2NyaXB0KGhQeXRob24sIHBhdGhuYW1lLCBhcmdjLCBhcmd2KTsKLQkJRnJlZUxpYnJhcnkoaFB5dGhvbik7Ci0JfSBlbHNlIHsKLQkJZnByaW50ZihzdGRlcnIsICIqKiogQ291bGQgbm90IGxvYWQgUHl0aG9uICoqKiIpOwotCX0KLQlTZXRTdGRIYW5kbGUoU1REX09VVFBVVF9IQU5ETEUsIG9sZF9zdGRvdXQpOwotCVNldFN0ZEhhbmRsZShTVERfRVJST1JfSEFORExFLCBvbGRfc3RkZXJyKTsKLQlvdXRfYnVmX3NpemUgPSBtaW4oR2V0RmlsZVNpemUocmVkaXJlY3RlZCwgTlVMTCksIDQwOTYpOwotCSpwT3V0cHV0ID0gbWFsbG9jKG91dF9idWZfc2l6ZSsxKTsKLQlpZiAoKnBPdXRwdXQpIHsKLQkJRFdPUkQgbnJlYWQgPSAwOwotCQlTZXRGaWxlUG9pbnRlcihyZWRpcmVjdGVkLCAwLCAwLCBGSUxFX0JFR0lOKTsKLQkJUmVhZEZpbGUocmVkaXJlY3RlZCwgKnBPdXRwdXQsIG91dF9idWZfc2l6ZSwgJm5yZWFkLCBOVUxMKTsKLQkJKCpwT3V0cHV0KVtucmVhZF0gPSAnXDAnOwotCX0KLQlDbG9zZUhhbmRsZShyZWRpcmVjdGVkKTsKLQlEZWxldGVGaWxlKHRlbXBuYW1lKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIGhQeXRob24gPSBMb2FkUHl0aG9uRGxsKHB5dGhvbmRsbCk7CisgICAgaWYgKGhQeXRob24pIHsKKyAgICAgICAgcmVzdWx0ID0gZG9fcnVuX2luc3RhbGxzY3JpcHQoaFB5dGhvbiwgcGF0aG5hbWUsIGFyZ2MsIGFyZ3YpOworICAgICAgICBGcmVlTGlicmFyeShoUHl0aG9uKTsKKyAgICB9IGVsc2UgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIioqKiBDb3VsZCBub3QgbG9hZCBQeXRob24gKioqIik7CisgICAgfQorICAgIFNldFN0ZEhhbmRsZShTVERfT1VUUFVUX0hBTkRMRSwgb2xkX3N0ZG91dCk7CisgICAgU2V0U3RkSGFuZGxlKFNURF9FUlJPUl9IQU5ETEUsIG9sZF9zdGRlcnIpOworICAgIG91dF9idWZfc2l6ZSA9IG1pbihHZXRGaWxlU2l6ZShyZWRpcmVjdGVkLCBOVUxMKSwgNDA5Nik7CisgICAgKnBPdXRwdXQgPSBtYWxsb2Mob3V0X2J1Zl9zaXplKzEpOworICAgIGlmICgqcE91dHB1dCkgeworICAgICAgICBEV09SRCBucmVhZCA9IDA7CisgICAgICAgIFNldEZpbGVQb2ludGVyKHJlZGlyZWN0ZWQsIDAsIDAsIEZJTEVfQkVHSU4pOworICAgICAgICBSZWFkRmlsZShyZWRpcmVjdGVkLCAqcE91dHB1dCwgb3V0X2J1Zl9zaXplLCAmbnJlYWQsIE5VTEwpOworICAgICAgICAoKnBPdXRwdXQpW25yZWFkXSA9ICdcMCc7CisgICAgfQorICAgIENsb3NlSGFuZGxlKHJlZGlyZWN0ZWQpOworICAgIERlbGV0ZUZpbGUodGVtcG5hbWUpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBpbnQgZG9fcnVuX3NpbXBsZV9zY3JpcHQoSElOU1RBTkNFIGhQeXRob24sIGNoYXIgKnNjcmlwdCkKIHsKLQlpbnQgcmM7Ci0JREVDTFBST0MoaFB5dGhvbiwgdm9pZCwgUHlfSW5pdGlhbGl6ZSwgKHZvaWQpKTsKLQlERUNMUFJPQyhoUHl0aG9uLCB2b2lkLCBQeV9TZXRQcm9ncmFtTmFtZSwgKGNoYXIgKikpOwotCURFQ0xQUk9DKGhQeXRob24sIHZvaWQsIFB5X0ZpbmFsaXplLCAodm9pZCkpOwotCURFQ0xQUk9DKGhQeXRob24sIGludCwgUHlSdW5fU2ltcGxlU3RyaW5nLCAoY2hhciAqKSk7Ci0JREVDTFBST0MoaFB5dGhvbiwgdm9pZCwgUHlFcnJfUHJpbnQsICh2b2lkKSk7CisgICAgaW50IHJjOworICAgIERFQ0xQUk9DKGhQeXRob24sIHZvaWQsIFB5X0luaXRpYWxpemUsICh2b2lkKSk7CisgICAgREVDTFBST0MoaFB5dGhvbiwgdm9pZCwgUHlfU2V0UHJvZ3JhbU5hbWUsIChjaGFyICopKTsKKyAgICBERUNMUFJPQyhoUHl0aG9uLCB2b2lkLCBQeV9GaW5hbGl6ZSwgKHZvaWQpKTsKKyAgICBERUNMUFJPQyhoUHl0aG9uLCBpbnQsIFB5UnVuX1NpbXBsZVN0cmluZywgKGNoYXIgKikpOworICAgIERFQ0xQUk9DKGhQeXRob24sIHZvaWQsIFB5RXJyX1ByaW50LCAodm9pZCkpOwogCi0JaWYgKCFQeV9Jbml0aWFsaXplIHx8ICFQeV9TZXRQcm9ncmFtTmFtZSB8fCAhUHlfRmluYWxpemUgfHwgCi0JICAgICFQeVJ1bl9TaW1wbGVTdHJpbmcgfHwgIVB5RXJyX1ByaW50KQotCQlyZXR1cm4gLTE7CisgICAgaWYgKCFQeV9Jbml0aWFsaXplIHx8ICFQeV9TZXRQcm9ncmFtTmFtZSB8fCAhUHlfRmluYWxpemUgfHwKKyAgICAgICAgIVB5UnVuX1NpbXBsZVN0cmluZyB8fCAhUHlFcnJfUHJpbnQpCisgICAgICAgIHJldHVybiAtMTsKIAotCVB5X1NldFByb2dyYW1OYW1lKG1vZHVsZW5hbWUpOwotCVB5X0luaXRpYWxpemUoKTsKLQlwcmVwYXJlX3NjcmlwdF9lbnZpcm9ubWVudChoUHl0aG9uKTsKLQlyYyA9IFB5UnVuX1NpbXBsZVN0cmluZyhzY3JpcHQpOwotCWlmIChyYykKLQkJUHlFcnJfUHJpbnQoKTsKLQlQeV9GaW5hbGl6ZSgpOwotCXJldHVybiByYzsKKyAgICBQeV9TZXRQcm9ncmFtTmFtZShtb2R1bGVuYW1lKTsKKyAgICBQeV9Jbml0aWFsaXplKCk7CisgICAgcHJlcGFyZV9zY3JpcHRfZW52aXJvbm1lbnQoaFB5dGhvbik7CisgICAgcmMgPSBQeVJ1bl9TaW1wbGVTdHJpbmcoc2NyaXB0KTsKKyAgICBpZiAocmMpCisgICAgICAgIFB5RXJyX1ByaW50KCk7CisgICAgUHlfRmluYWxpemUoKTsKKyAgICByZXR1cm4gcmM7CiB9CiAKIHN0YXRpYyBpbnQgcnVuX3NpbXBsZV9zY3JpcHQoY2hhciAqc2NyaXB0KQogewotCWludCByYzsKLQlISU5TVEFOQ0UgaFB5dGhvbjsKLQljaGFyICp0ZW1wbmFtZSA9IHRlbXBuYW0oTlVMTCwgTlVMTCk7Ci0JLy8gUmVkaXJlY3Qgb3V0cHV0IHVzaW5nIHdpbjMyIEFQSSAtIHNlZSBjb21tZW50cyBhYm92ZS4uLgotCUhBTkRMRSByZWRpcmVjdGVkID0gQ3JlYXRlRmlsZSgKLQkJCQkJdGVtcG5hbWUsCi0JCQkJCUdFTkVSSUNfV1JJVEUgfCBHRU5FUklDX1JFQUQsCi0JCQkJCUZJTEVfU0hBUkVfUkVBRCwKLQkJCQkJTlVMTCwKLQkJCQkJQ1JFQVRFX0FMV0FZUywKLQkJCQkJRklMRV9BVFRSSUJVVEVfTk9STUFMIHwgRklMRV9GTEFHX1dSSVRFX1RIUk9VR0gsCi0JCQkJCU5VTEwpOwotCUhBTkRMRSBvbGRfc3Rkb3V0ID0gR2V0U3RkSGFuZGxlKFNURF9PVVRQVVRfSEFORExFKTsKLQlIQU5ETEUgb2xkX3N0ZGVyciA9IEdldFN0ZEhhbmRsZShTVERfRVJST1JfSEFORExFKTsKLQlTZXRTdGRIYW5kbGUoU1REX09VVFBVVF9IQU5ETEUsIHJlZGlyZWN0ZWQpOwotCVNldFN0ZEhhbmRsZShTVERfRVJST1JfSEFORExFLCByZWRpcmVjdGVkKTsKKyAgICBpbnQgcmM7CisgICAgSElOU1RBTkNFIGhQeXRob247CisgICAgY2hhciAqdGVtcG5hbWUgPSB0ZW1wbmFtKE5VTEwsIE5VTEwpOworICAgIC8vIFJlZGlyZWN0IG91dHB1dCB1c2luZyB3aW4zMiBBUEkgLSBzZWUgY29tbWVudHMgYWJvdmUuLi4KKyAgICBIQU5ETEUgcmVkaXJlY3RlZCA9IENyZWF0ZUZpbGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFTkVSSUNfV1JJVEUgfCBHRU5FUklDX1JFQUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSUxFX1NIQVJFX1JFQUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1JFQVRFX0FMV0FZUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJTEVfQVRUUklCVVRFX05PUk1BTCB8IEZJTEVfRkxBR19XUklURV9USFJPVUdILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgSEFORExFIG9sZF9zdGRvdXQgPSBHZXRTdGRIYW5kbGUoU1REX09VVFBVVF9IQU5ETEUpOworICAgIEhBTkRMRSBvbGRfc3RkZXJyID0gR2V0U3RkSGFuZGxlKFNURF9FUlJPUl9IQU5ETEUpOworICAgIFNldFN0ZEhhbmRsZShTVERfT1VUUFVUX0hBTkRMRSwgcmVkaXJlY3RlZCk7CisgICAgU2V0U3RkSGFuZGxlKFNURF9FUlJPUl9IQU5ETEUsIHJlZGlyZWN0ZWQpOwogCi0JaFB5dGhvbiA9IExvYWRQeXRob25EbGwocHl0aG9uZGxsKTsKLQlpZiAoIWhQeXRob24pIHsKLQkJY2hhciByZWFzb25bMTI4XTsKLQkJd3NwcmludGYocmVhc29uLCAiQ2FuJ3QgbG9hZCBQeXRob24gZm9yIHByZS1pbnN0YWxsIHNjcmlwdCAoJWQpIiwgR2V0TGFzdEVycm9yKCkpOwotCQlzZXRfZmFpbHVyZV9yZWFzb24ocmVhc29uKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlyYyA9IGRvX3J1bl9zaW1wbGVfc2NyaXB0KGhQeXRob24sIHNjcmlwdCk7Ci0JRnJlZUxpYnJhcnkoaFB5dGhvbik7Ci0JU2V0U3RkSGFuZGxlKFNURF9PVVRQVVRfSEFORExFLCBvbGRfc3Rkb3V0KTsKLQlTZXRTdGRIYW5kbGUoU1REX0VSUk9SX0hBTkRMRSwgb2xkX3N0ZGVycik7Ci0JLyogV2Ugb25seSBjYXJlIGFib3V0IHRoZSBvdXRwdXQgd2hlbiB3ZSBmYWlsLiAgSWYgdGhlIHNjcmlwdCB3b3JrcwotCSAgIE9LLCB0aGVuIHdlIGRpc2NhcmQgaXQKLQkqLwotCWlmIChyYykgewotCQlpbnQgZXJyX2J1Zl9zaXplOwotCQljaGFyICplcnJfYnVmOwotCQljb25zdCBjaGFyICpwcmVmaXggPSAiUnVubmluZyB0aGUgcHJlLWluc3RhbGxhdGlvbiBzY3JpcHQgZmFpbGVkXHJcbiI7Ci0JCWludCBwcmVmaXhfbGVuID0gc3RybGVuKHByZWZpeCk7Ci0JCWVycl9idWZfc2l6ZSA9IEdldEZpbGVTaXplKHJlZGlyZWN0ZWQsIE5VTEwpOwotCQlpZiAoZXJyX2J1Zl9zaXplPT1JTlZBTElEX0ZJTEVfU0laRSkgLy8gYW4gZXJyb3IgLSBsZXQncyB0cnkgYW55d2F5Li4uCi0JCQllcnJfYnVmX3NpemUgPSA0MDk2OwotCQllcnJfYnVmID0gbWFsbG9jKHByZWZpeF9sZW4gKyBlcnJfYnVmX3NpemUgKyAxKTsKLQkJaWYgKGVycl9idWYpIHsKLQkJCURXT1JEIG4gPSAwOwotCQkJc3RyY3B5KGVycl9idWYsIHByZWZpeCk7Ci0JCQlTZXRGaWxlUG9pbnRlcihyZWRpcmVjdGVkLCAwLCAwLCBGSUxFX0JFR0lOKTsKLQkJCVJlYWRGaWxlKHJlZGlyZWN0ZWQsIGVycl9idWYrcHJlZml4X2xlbiwgZXJyX2J1Zl9zaXplLCAmbiwgTlVMTCk7Ci0JCQllcnJfYnVmW3ByZWZpeF9sZW4rbl0gPSAnXDAnOwotCQkJc2V0X2ZhaWx1cmVfcmVhc29uKGVycl9idWYpOwotCQkJZnJlZShlcnJfYnVmKTsKLQkJfSBlbHNlIHsKLQkJCXNldF9mYWlsdXJlX3JlYXNvbigiT3V0IG9mIG1lbW9yeSEiKTsKLQkJfQotCX0KLQlDbG9zZUhhbmRsZShyZWRpcmVjdGVkKTsKLQlEZWxldGVGaWxlKHRlbXBuYW1lKTsKLQlyZXR1cm4gcmM7CisgICAgaFB5dGhvbiA9IExvYWRQeXRob25EbGwocHl0aG9uZGxsKTsKKyAgICBpZiAoIWhQeXRob24pIHsKKyAgICAgICAgY2hhciByZWFzb25bMTI4XTsKKyAgICAgICAgd3NwcmludGYocmVhc29uLCAiQ2FuJ3QgbG9hZCBQeXRob24gZm9yIHByZS1pbnN0YWxsIHNjcmlwdCAoJWQpIiwgR2V0TGFzdEVycm9yKCkpOworICAgICAgICBzZXRfZmFpbHVyZV9yZWFzb24ocmVhc29uKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByYyA9IGRvX3J1bl9zaW1wbGVfc2NyaXB0KGhQeXRob24sIHNjcmlwdCk7CisgICAgRnJlZUxpYnJhcnkoaFB5dGhvbik7CisgICAgU2V0U3RkSGFuZGxlKFNURF9PVVRQVVRfSEFORExFLCBvbGRfc3Rkb3V0KTsKKyAgICBTZXRTdGRIYW5kbGUoU1REX0VSUk9SX0hBTkRMRSwgb2xkX3N0ZGVycik7CisgICAgLyogV2Ugb25seSBjYXJlIGFib3V0IHRoZSBvdXRwdXQgd2hlbiB3ZSBmYWlsLiAgSWYgdGhlIHNjcmlwdCB3b3JrcworICAgICAgIE9LLCB0aGVuIHdlIGRpc2NhcmQgaXQKKyAgICAqLworICAgIGlmIChyYykgeworICAgICAgICBpbnQgZXJyX2J1Zl9zaXplOworICAgICAgICBjaGFyICplcnJfYnVmOworICAgICAgICBjb25zdCBjaGFyICpwcmVmaXggPSAiUnVubmluZyB0aGUgcHJlLWluc3RhbGxhdGlvbiBzY3JpcHQgZmFpbGVkXHJcbiI7CisgICAgICAgIGludCBwcmVmaXhfbGVuID0gc3RybGVuKHByZWZpeCk7CisgICAgICAgIGVycl9idWZfc2l6ZSA9IEdldEZpbGVTaXplKHJlZGlyZWN0ZWQsIE5VTEwpOworICAgICAgICBpZiAoZXJyX2J1Zl9zaXplPT1JTlZBTElEX0ZJTEVfU0laRSkgLy8gYW4gZXJyb3IgLSBsZXQncyB0cnkgYW55d2F5Li4uCisgICAgICAgICAgICBlcnJfYnVmX3NpemUgPSA0MDk2OworICAgICAgICBlcnJfYnVmID0gbWFsbG9jKHByZWZpeF9sZW4gKyBlcnJfYnVmX3NpemUgKyAxKTsKKyAgICAgICAgaWYgKGVycl9idWYpIHsKKyAgICAgICAgICAgIERXT1JEIG4gPSAwOworICAgICAgICAgICAgc3RyY3B5KGVycl9idWYsIHByZWZpeCk7CisgICAgICAgICAgICBTZXRGaWxlUG9pbnRlcihyZWRpcmVjdGVkLCAwLCAwLCBGSUxFX0JFR0lOKTsKKyAgICAgICAgICAgIFJlYWRGaWxlKHJlZGlyZWN0ZWQsIGVycl9idWYrcHJlZml4X2xlbiwgZXJyX2J1Zl9zaXplLCAmbiwgTlVMTCk7CisgICAgICAgICAgICBlcnJfYnVmW3ByZWZpeF9sZW4rbl0gPSAnXDAnOworICAgICAgICAgICAgc2V0X2ZhaWx1cmVfcmVhc29uKGVycl9idWYpOworICAgICAgICAgICAgZnJlZShlcnJfYnVmKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNldF9mYWlsdXJlX3JlYXNvbigiT3V0IG9mIG1lbW9yeSEiKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBDbG9zZUhhbmRsZShyZWRpcmVjdGVkKTsKKyAgICBEZWxldGVGaWxlKHRlbXBuYW1lKTsKKyAgICByZXR1cm4gcmM7CiB9CiAKIAogc3RhdGljIEJPT0wgU3lzdGVtRXJyb3IoaW50IGVycm9yLCBjaGFyICptc2cpCiB7Ci0JY2hhciBCdWZmZXJbMTAyNF07Ci0JaW50IG47CisgICAgY2hhciBCdWZmZXJbMTAyNF07CisgICAgaW50IG47CiAKLQlpZiAoZXJyb3IpIHsKLQkJTFBWT0lEIGxwTXNnQnVmOwotCQlGb3JtYXRNZXNzYWdlKCAKLQkJCUZPUk1BVF9NRVNTQUdFX0FMTE9DQVRFX0JVRkZFUiB8IAotCQkJRk9STUFUX01FU1NBR0VfRlJPTV9TWVNURU0sCi0JCQlOVUxMLAotCQkJZXJyb3IsCi0JCQlNQUtFTEFOR0lEKExBTkdfTkVVVFJBTCwgU1VCTEFOR19ERUZBVUxUKSwKLQkJCShMUFNUUikmbHBNc2dCdWYsCi0JCQkwLAotCQkJTlVMTCAKLQkJCSk7Ci0JCXN0cm5jcHkoQnVmZmVyLCBscE1zZ0J1Ziwgc2l6ZW9mKEJ1ZmZlcikpOwotCQlMb2NhbEZyZWUobHBNc2dCdWYpOwotCX0gZWxzZQotCQlCdWZmZXJbMF0gPSAnXDAnOwotCW4gPSBsc3RybGVuKEJ1ZmZlcik7Ci0JX3NucHJpbnRmKEJ1ZmZlcituLCBzaXplb2YoQnVmZmVyKS1uLCBtc2cpOwotCU1lc3NhZ2VCb3goaHduZE1haW4sIEJ1ZmZlciwgIlJ1bnRpbWUgRXJyb3IiLCBNQl9PSyB8IE1CX0lDT05TVE9QKTsKLQlyZXR1cm4gRkFMU0U7CisgICAgaWYgKGVycm9yKSB7CisgICAgICAgIExQVk9JRCBscE1zZ0J1ZjsKKyAgICAgICAgRm9ybWF0TWVzc2FnZSgKKyAgICAgICAgICAgIEZPUk1BVF9NRVNTQUdFX0FMTE9DQVRFX0JVRkZFUiB8CisgICAgICAgICAgICBGT1JNQVRfTUVTU0FHRV9GUk9NX1NZU1RFTSwKKyAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICBlcnJvciwKKyAgICAgICAgICAgIE1BS0VMQU5HSUQoTEFOR19ORVVUUkFMLCBTVUJMQU5HX0RFRkFVTFQpLAorICAgICAgICAgICAgKExQU1RSKSZscE1zZ0J1ZiwKKyAgICAgICAgICAgIDAsCisgICAgICAgICAgICBOVUxMCisgICAgICAgICAgICApOworICAgICAgICBzdHJuY3B5KEJ1ZmZlciwgbHBNc2dCdWYsIHNpemVvZihCdWZmZXIpKTsKKyAgICAgICAgTG9jYWxGcmVlKGxwTXNnQnVmKTsKKyAgICB9IGVsc2UKKyAgICAgICAgQnVmZmVyWzBdID0gJ1wwJzsKKyAgICBuID0gbHN0cmxlbihCdWZmZXIpOworICAgIF9zbnByaW50ZihCdWZmZXIrbiwgc2l6ZW9mKEJ1ZmZlciktbiwgbXNnKTsKKyAgICBNZXNzYWdlQm94KGh3bmRNYWluLCBCdWZmZXIsICJSdW50aW1lIEVycm9yIiwgTUJfT0sgfCBNQl9JQ09OU1RPUCk7CisgICAgcmV0dXJuIEZBTFNFOwogfQogCiBzdGF0aWMgQk9PTCBub3RpZnkgKGludCBjb2RlLCBjaGFyICpmbXQsIC4uLikKIHsKLQljaGFyIEJ1ZmZlclsxMDI0XTsKLQl2YV9saXN0IG1hcmtlcjsKLQlCT09MIHJlc3VsdCA9IFRSVUU7Ci0JaW50IGEsIGI7Ci0JY2hhciAqY3A7CisgICAgY2hhciBCdWZmZXJbMTAyNF07CisgICAgdmFfbGlzdCBtYXJrZXI7CisgICAgQk9PTCByZXN1bHQgPSBUUlVFOworICAgIGludCBhLCBiOworICAgIGNoYXIgKmNwOwogCi0JdmFfc3RhcnQobWFya2VyLCBmbXQpOwotCV92c25wcmludGYoQnVmZmVyLCBzaXplb2YoQnVmZmVyKSwgZm10LCBtYXJrZXIpOworICAgIHZhX3N0YXJ0KG1hcmtlciwgZm10KTsKKyAgICBfdnNucHJpbnRmKEJ1ZmZlciwgc2l6ZW9mKEJ1ZmZlciksIGZtdCwgbWFya2VyKTsKIAotCXN3aXRjaCAoY29kZSkgeworICAgIHN3aXRjaCAoY29kZSkgewogLyogUXVlc3Rpb25zICovCi0JY2FzZSBDQU5fT1ZFUldSSVRFOgotCQlicmVhazsKKyAgICBjYXNlIENBTl9PVkVSV1JJVEU6CisgICAgICAgIGJyZWFrOwogCiAvKiBJbmZvcm1hdGlvbiBub3RpZmljYXRpb24gKi8KLQljYXNlIERJUl9DUkVBVEVEOgotCQlpZiAobG9nZmlsZSkKLQkJCWZwcmludGYobG9nZmlsZSwgIjEwMCBNYWRlIERpcjogJXNcbiIsIGZtdCk7Ci0JCWJyZWFrOworICAgIGNhc2UgRElSX0NSRUFURUQ6CisgICAgICAgIGlmIChsb2dmaWxlKQorICAgICAgICAgICAgZnByaW50Zihsb2dmaWxlLCAiMTAwIE1hZGUgRGlyOiAlc1xuIiwgZm10KTsKKyAgICAgICAgYnJlYWs7CiAKLQljYXNlIEZJTEVfQ1JFQVRFRDoKLQkJaWYgKGxvZ2ZpbGUpCi0JCQlmcHJpbnRmKGxvZ2ZpbGUsICIyMDAgRmlsZSBDb3B5OiAlc1xuIiwgZm10KTsKLQkJZ290byBhZGRfdG9fZmlsZWxpc3RfbGFiZWw7Ci0JCWJyZWFrOworICAgIGNhc2UgRklMRV9DUkVBVEVEOgorICAgICAgICBpZiAobG9nZmlsZSkKKyAgICAgICAgICAgIGZwcmludGYobG9nZmlsZSwgIjIwMCBGaWxlIENvcHk6ICVzXG4iLCBmbXQpOworICAgICAgICBnb3RvIGFkZF90b19maWxlbGlzdF9sYWJlbDsKKyAgICAgICAgYnJlYWs7CiAKLQljYXNlIEZJTEVfT1ZFUldSSVRURU46Ci0JCWlmIChsb2dmaWxlKQotCQkJZnByaW50Zihsb2dmaWxlLCAiMjAwIEZpbGUgT3ZlcndyaXRlOiAlc1xuIiwgZm10KTsKLQkgIGFkZF90b19maWxlbGlzdF9sYWJlbDoKLQkJaWYgKChjcCA9IHN0cnJjaHIoZm10LCAnLicpKSAmJiAoMCA9PSBzdHJjbXAgKGNwLCAiLnB5IikpKQotCQkJYWRkX3RvX2ZpbGVsaXN0KGZtdCk7Ci0JCWJyZWFrOworICAgIGNhc2UgRklMRV9PVkVSV1JJVFRFTjoKKyAgICAgICAgaWYgKGxvZ2ZpbGUpCisgICAgICAgICAgICBmcHJpbnRmKGxvZ2ZpbGUsICIyMDAgRmlsZSBPdmVyd3JpdGU6ICVzXG4iLCBmbXQpOworICAgICAgYWRkX3RvX2ZpbGVsaXN0X2xhYmVsOgorICAgICAgICBpZiAoKGNwID0gc3RycmNocihmbXQsICcuJykpICYmICgwID09IHN0cmNtcCAoY3AsICIucHkiKSkpCisgICAgICAgICAgICBhZGRfdG9fZmlsZWxpc3QoZm10KTsKKyAgICAgICAgYnJlYWs7CiAKIC8qIEVycm9yIE1lc3NhZ2VzICovCi0JY2FzZSBaTElCX0VSUk9SOgotCQlNZXNzYWdlQm94KEdldEZvY3VzKCksIEJ1ZmZlciwgIkVycm9yIiwKLQkJCSAgICBNQl9PSyB8IE1CX0lDT05XQVJOSU5HKTsKLQkJYnJlYWs7CisgICAgY2FzZSBaTElCX0VSUk9SOgorICAgICAgICBNZXNzYWdlQm94KEdldEZvY3VzKCksIEJ1ZmZlciwgIkVycm9yIiwKKyAgICAgICAgICAgICAgICAgICAgTUJfT0sgfCBNQl9JQ09OV0FSTklORyk7CisgICAgICAgIGJyZWFrOwogCi0JY2FzZSBTWVNURU1fRVJST1I6Ci0JCVN5c3RlbUVycm9yKEdldExhc3RFcnJvcigpLCBCdWZmZXIpOwotCQlicmVhazsKKyAgICBjYXNlIFNZU1RFTV9FUlJPUjoKKyAgICAgICAgU3lzdGVtRXJyb3IoR2V0TGFzdEVycm9yKCksIEJ1ZmZlcik7CisgICAgICAgIGJyZWFrOwogCi0JY2FzZSBOVU1fRklMRVM6Ci0JCWEgPSB2YV9hcmcobWFya2VyLCBpbnQpOwotCQliID0gdmFfYXJnKG1hcmtlciwgaW50KTsKLQkJU2VuZE1lc3NhZ2UoaERpYWxvZywgV01fTlVNRklMRVMsIDAsIE1BS0VMUEFSQU0oMCwgYSkpOwotCQlTZW5kTWVzc2FnZShoRGlhbG9nLCBXTV9ORVhURklMRSwgYiwoTFBBUkFNKWZtdCk7Ci0JfQotCXZhX2VuZChtYXJrZXIpOwotICAgIAotCXJldHVybiByZXN1bHQ7CisgICAgY2FzZSBOVU1fRklMRVM6CisgICAgICAgIGEgPSB2YV9hcmcobWFya2VyLCBpbnQpOworICAgICAgICBiID0gdmFfYXJnKG1hcmtlciwgaW50KTsKKyAgICAgICAgU2VuZE1lc3NhZ2UoaERpYWxvZywgV01fTlVNRklMRVMsIDAsIE1BS0VMUEFSQU0oMCwgYSkpOworICAgICAgICBTZW5kTWVzc2FnZShoRGlhbG9nLCBXTV9ORVhURklMRSwgYiwoTFBBUkFNKWZtdCk7CisgICAgfQorICAgIHZhX2VuZChtYXJrZXIpOworCisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIGNoYXIgKk1hcEV4aXN0aW5nRmlsZShjaGFyICpwYXRobmFtZSwgRFdPUkQgKnBzaXplKQogewotCUhBTkRMRSBoRmlsZSwgaEZpbGVNYXBwaW5nOwotCURXT1JEIG5TaXplTG93LCBuU2l6ZUhpZ2g7Ci0JY2hhciAqZGF0YTsKKyAgICBIQU5ETEUgaEZpbGUsIGhGaWxlTWFwcGluZzsKKyAgICBEV09SRCBuU2l6ZUxvdywgblNpemVIaWdoOworICAgIGNoYXIgKmRhdGE7CiAKLQloRmlsZSA9IENyZWF0ZUZpbGUocGF0aG5hbWUsCi0JCQkgICAgR0VORVJJQ19SRUFELCBGSUxFX1NIQVJFX1JFQUQsIE5VTEwsCi0JCQkgICAgT1BFTl9FWElTVElORywKLQkJCSAgICBGSUxFX0FUVFJJQlVURV9OT1JNQUwsIE5VTEwpOwotCWlmIChoRmlsZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkKLQkJcmV0dXJuIE5VTEw7Ci0JblNpemVMb3cgPSBHZXRGaWxlU2l6ZShoRmlsZSwgJm5TaXplSGlnaCk7Ci0JaEZpbGVNYXBwaW5nID0gQ3JlYXRlRmlsZU1hcHBpbmcoaEZpbGUsCi0JCQkJCSAgTlVMTCwgUEFHRV9SRUFET05MWSwgMCwgMCwgTlVMTCk7Ci0JQ2xvc2VIYW5kbGUoaEZpbGUpOworICAgIGhGaWxlID0gQ3JlYXRlRmlsZShwYXRobmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEdFTkVSSUNfUkVBRCwgRklMRV9TSEFSRV9SRUFELCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgT1BFTl9FWElTVElORywKKyAgICAgICAgICAgICAgICAgICAgICAgIEZJTEVfQVRUUklCVVRFX05PUk1BTCwgTlVMTCk7CisgICAgaWYgKGhGaWxlID09IElOVkFMSURfSEFORExFX1ZBTFVFKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBuU2l6ZUxvdyA9IEdldEZpbGVTaXplKGhGaWxlLCAmblNpemVIaWdoKTsKKyAgICBoRmlsZU1hcHBpbmcgPSBDcmVhdGVGaWxlTWFwcGluZyhoRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgUEFHRV9SRUFET05MWSwgMCwgMCwgTlVMTCk7CisgICAgQ2xvc2VIYW5kbGUoaEZpbGUpOwogCi0JaWYgKGhGaWxlTWFwcGluZyA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkKLQkJcmV0dXJuIE5VTEw7Ci0gICAgCi0JZGF0YSA9IE1hcFZpZXdPZkZpbGUoaEZpbGVNYXBwaW5nLAotCQkJICAgICAgRklMRV9NQVBfUkVBRCwgMCwgMCwgMCk7CisgICAgaWYgKGhGaWxlTWFwcGluZyA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlDbG9zZUhhbmRsZShoRmlsZU1hcHBpbmcpOwotCSpwc2l6ZSA9IG5TaXplTG93OwotCXJldHVybiBkYXRhOworICAgIGRhdGEgPSBNYXBWaWV3T2ZGaWxlKGhGaWxlTWFwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRklMRV9NQVBfUkVBRCwgMCwgMCwgMCk7CisKKyAgICBDbG9zZUhhbmRsZShoRmlsZU1hcHBpbmcpOworICAgICpwc2l6ZSA9IG5TaXplTG93OworICAgIHJldHVybiBkYXRhOwogfQogCiAKIHN0YXRpYyB2b2lkIGNyZWF0ZV9iaXRtYXAoSFdORCBod25kKQogewotCUJJVE1BUEZJTEVIRUFERVIgKmJmaDsKLQlCSVRNQVBJTkZPICpiaTsKLQlIREMgaGRjOworICAgIEJJVE1BUEZJTEVIRUFERVIgKmJmaDsKKyAgICBCSVRNQVBJTkZPICpiaTsKKyAgICBIREMgaGRjOwogCi0JaWYgKCFiaXRtYXBfYnl0ZXMpCi0JCXJldHVybjsKKyAgICBpZiAoIWJpdG1hcF9ieXRlcykKKyAgICAgICAgcmV0dXJuOwogCi0JaWYgKGhCaXRtYXApCi0JCXJldHVybjsKKyAgICBpZiAoaEJpdG1hcCkKKyAgICAgICAgcmV0dXJuOwogCi0JaGRjID0gR2V0REMoaHduZCk7CisgICAgaGRjID0gR2V0REMoaHduZCk7CiAKLQliZmggPSAoQklUTUFQRklMRUhFQURFUiAqKWJpdG1hcF9ieXRlczsKLQliaSA9IChCSVRNQVBJTkZPICopKGJpdG1hcF9ieXRlcyArIHNpemVvZihCSVRNQVBGSUxFSEVBREVSKSk7CisgICAgYmZoID0gKEJJVE1BUEZJTEVIRUFERVIgKiliaXRtYXBfYnl0ZXM7CisgICAgYmkgPSAoQklUTUFQSU5GTyAqKShiaXRtYXBfYnl0ZXMgKyBzaXplb2YoQklUTUFQRklMRUhFQURFUikpOwogCi0JaEJpdG1hcCA9IENyZWF0ZURJQml0bWFwKGhkYywKLQkJCQkgJmJpLT5ibWlIZWFkZXIsCi0JCQkJIENCTV9JTklULAotCQkJCSBiaXRtYXBfYnl0ZXMgKyBiZmgtPmJmT2ZmQml0cywKLQkJCQkgYmksCi0JCQkJIERJQl9SR0JfQ09MT1JTKTsKLQlSZWxlYXNlREMoaHduZCwgaGRjKTsKKyAgICBoQml0bWFwID0gQ3JlYXRlRElCaXRtYXAoaGRjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYmktPmJtaUhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JNX0lOSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdG1hcF9ieXRlcyArIGJmaC0+YmZPZmZCaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElCX1JHQl9DT0xPUlMpOworICAgIFJlbGVhc2VEQyhod25kLCBoZGMpOwogfQogCiAvKiBFeHRyYWN0IGV2ZXJ5dGhpbmcgd2UgbmVlZCB0byBiZWdpbiB0aGUgaW5zdGFsbGF0aW9uLiAgQ3VycmVudGx5IHRoaXMKICAgIGlzIHRoZSBJTkkgZmlsZW5hbWUgd2l0aCBpbnN0YWxsIGRhdGEsIGFuZCB0aGUgcmF3IHByZS1pbnN0YWxsIHNjcmlwdAogKi8KIHN0YXRpYyBCT09MIEV4dHJhY3RJbnN0YWxsRGF0YShjaGFyICpkYXRhLCBEV09SRCBzaXplLCBpbnQgKnBleGVfc2l6ZSwKLQkJCSAgICAgICBjaGFyICoqb3V0X2luaV9maWxlLCBjaGFyICoqb3V0X3ByZWluc3RhbGxfc2NyaXB0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKipvdXRfaW5pX2ZpbGUsIGNoYXIgKipvdXRfcHJlaW5zdGFsbF9zY3JpcHQpCiB7Ci0JLyogcmVhZCB0aGUgZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5IHJlY29yZCAqLwotCXN0cnVjdCBlb2ZfY2RpciAqcGUgPSAoc3RydWN0IGVvZl9jZGlyICopJmRhdGFbc2l6ZSAtIHNpemVvZgotCQkJCQkJICAgICAgIChzdHJ1Y3QgZW9mX2NkaXIpXTsKLSAgICAKLQlpbnQgYXJjX3N0YXJ0ID0gc2l6ZSAtIHNpemVvZiAoc3RydWN0IGVvZl9jZGlyKSAtIHBlLT5uQnl0ZXNDRGlyIC0KLQkJcGUtPm9mc0NEaXI7CisgICAgLyogcmVhZCB0aGUgZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5IHJlY29yZCAqLworICAgIHN0cnVjdCBlb2ZfY2RpciAqcGUgPSAoc3RydWN0IGVvZl9jZGlyICopJmRhdGFbc2l6ZSAtIHNpemVvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cnVjdCBlb2ZfY2RpcildOwogCi0JaW50IG9mcyA9IGFyY19zdGFydCAtIHNpemVvZiAoc3RydWN0IG1ldGFfZGF0YV9oZHIpOworICAgIGludCBhcmNfc3RhcnQgPSBzaXplIC0gc2l6ZW9mIChzdHJ1Y3QgZW9mX2NkaXIpIC0gcGUtPm5CeXRlc0NEaXIgLQorICAgICAgICBwZS0+b2ZzQ0RpcjsKIAotCS8qIHJlYWQgbWV0YV9kYXRhIGluZm8gKi8KLQlzdHJ1Y3QgbWV0YV9kYXRhX2hkciAqcG1kID0gKHN0cnVjdCBtZXRhX2RhdGFfaGRyICopJmRhdGFbb2ZzXTsKLQljaGFyICpzcmMsICpkc3Q7Ci0JY2hhciAqaW5pX2ZpbGU7Ci0JY2hhciB0ZW1wZGlyW01BWF9QQVRIXTsKKyAgICBpbnQgb2ZzID0gYXJjX3N0YXJ0IC0gc2l6ZW9mIChzdHJ1Y3QgbWV0YV9kYXRhX2hkcik7CiAKLQkvKiBlbnN1cmUgdGhhdCBpZiB3ZSBmYWlsLCB3ZSBkb24ndCBoYXZlIGdhcmJhZ2Ugb3V0IHBvaW50ZXJzICovCi0JKm91dF9pbmlfZmlsZSA9ICpvdXRfcHJlaW5zdGFsbF9zY3JpcHQgPSBOVUxMOworICAgIC8qIHJlYWQgbWV0YV9kYXRhIGluZm8gKi8KKyAgICBzdHJ1Y3QgbWV0YV9kYXRhX2hkciAqcG1kID0gKHN0cnVjdCBtZXRhX2RhdGFfaGRyICopJmRhdGFbb2ZzXTsKKyAgICBjaGFyICpzcmMsICpkc3Q7CisgICAgY2hhciAqaW5pX2ZpbGU7CisgICAgY2hhciB0ZW1wZGlyW01BWF9QQVRIXTsKIAotCWlmIChwZS0+dGFnICE9IDB4MDYwNTRiNTApIHsKLQkJcmV0dXJuIEZBTFNFOwotCX0KKyAgICAvKiBlbnN1cmUgdGhhdCBpZiB3ZSBmYWlsLCB3ZSBkb24ndCBoYXZlIGdhcmJhZ2Ugb3V0IHBvaW50ZXJzICovCisgICAgKm91dF9pbmlfZmlsZSA9ICpvdXRfcHJlaW5zdGFsbF9zY3JpcHQgPSBOVUxMOwogCi0JaWYgKHBtZC0+dGFnICE9IDB4MTIzNDU2N0IpIHsKLQkJcmV0dXJuIFN5c3RlbUVycm9yKDAsCi0JCQkgICAiSW52YWxpZCBjZmdkYXRhIG1hZ2ljIG51bWJlciAoc2VlIGJkaXN0X3dpbmluc3QucHkpIik7Ci0JfQotCWlmIChvZnMgPCAwKSB7Ci0JCXJldHVybiBGQUxTRTsKLQl9CisgICAgaWYgKHBlLT50YWcgIT0gMHgwNjA1NGI1MCkgeworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQogCi0JaWYgKHBtZC0+Yml0bWFwX3NpemUpIHsKLQkJLyogU3RvcmUgcG9pbnRlciB0byBiaXRtYXAgYnl0ZXMgKi8KLQkJYml0bWFwX2J5dGVzID0gKGNoYXIgKilwbWQgLSBwbWQtPnVuY29tcF9zaXplIC0gcG1kLT5iaXRtYXBfc2l6ZTsKLQl9CisgICAgaWYgKHBtZC0+dGFnICE9IDB4MTIzNDU2N0IpIHsKKyAgICAgICAgcmV0dXJuIFN5c3RlbUVycm9yKDAsCisgICAgICAgICAgICAgICAgICAgIkludmFsaWQgY2ZnZGF0YSBtYWdpYyBudW1iZXIgKHNlZSBiZGlzdF93aW5pbnN0LnB5KSIpOworICAgIH0KKyAgICBpZiAob2ZzIDwgMCkgeworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQogCi0JKnBleGVfc2l6ZSA9IG9mcyAtIHBtZC0+dW5jb21wX3NpemUgLSBwbWQtPmJpdG1hcF9zaXplOworICAgIGlmIChwbWQtPmJpdG1hcF9zaXplKSB7CisgICAgICAgIC8qIFN0b3JlIHBvaW50ZXIgdG8gYml0bWFwIGJ5dGVzICovCisgICAgICAgIGJpdG1hcF9ieXRlcyA9IChjaGFyICopcG1kIC0gcG1kLT51bmNvbXBfc2l6ZSAtIHBtZC0+Yml0bWFwX3NpemU7CisgICAgfQogCi0Jc3JjID0gKChjaGFyICopcG1kKSAtIHBtZC0+dW5jb21wX3NpemU7Ci0JaW5pX2ZpbGUgPSBtYWxsb2MoTUFYX1BBVEgpOyAvKiB3aWxsIGJlIHJldHVybmVkLCBzbyBkbyBub3QgZnJlZSBpdCAqLwotCWlmICghaW5pX2ZpbGUpCi0JCXJldHVybiBGQUxTRTsKLQlpZiAoIUdldFRlbXBQYXRoKHNpemVvZih0ZW1wZGlyKSwgdGVtcGRpcikKLQkgICAgfHwgIUdldFRlbXBGaWxlTmFtZSh0ZW1wZGlyLCAifmR1IiwgMCwgaW5pX2ZpbGUpKSB7Ci0JCVN5c3RlbUVycm9yKEdldExhc3RFcnJvcigpLAotCQkJICAgICAiQ291bGQgbm90IGNyZWF0ZSB0ZW1wb3JhcnkgZmlsZSIpOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQotICAgIAotCWRzdCA9IG1hcF9uZXdfZmlsZShDUkVBVEVfQUxXQVlTLCBpbmlfZmlsZSwgTlVMTCwgcG1kLT51bmNvbXBfc2l6ZSwKLQkJCSAgICAwLCAwLCBOVUxMLypub3RpZnkqLyk7Ci0JaWYgKCFkc3QpCi0JCXJldHVybiBGQUxTRTsKLQkvKiBVcCB0byB0aGUgZmlyc3QgXDAgaXMgdGhlIElOSSBmaWxlIGRhdGEuICovCi0Jc3RybmNweShkc3QsIHNyYywgcG1kLT51bmNvbXBfc2l6ZSk7Ci0Jc3JjICs9IHN0cmxlbihkc3QpICsgMTsKLQkvKiBVcCB0byBuZXh0IFwwIGlzIHRoZSBwcmUtaW5zdGFsbCBzY3JpcHQgKi8KLQkqb3V0X3ByZWluc3RhbGxfc2NyaXB0ID0gc3RyZHVwKHNyYyk7Ci0JKm91dF9pbmlfZmlsZSA9IGluaV9maWxlOwotCVVubWFwVmlld09mRmlsZShkc3QpOwotCXJldHVybiBUUlVFOworICAgICpwZXhlX3NpemUgPSBvZnMgLSBwbWQtPnVuY29tcF9zaXplIC0gcG1kLT5iaXRtYXBfc2l6ZTsKKworICAgIHNyYyA9ICgoY2hhciAqKXBtZCkgLSBwbWQtPnVuY29tcF9zaXplOworICAgIGluaV9maWxlID0gbWFsbG9jKE1BWF9QQVRIKTsgLyogd2lsbCBiZSByZXR1cm5lZCwgc28gZG8gbm90IGZyZWUgaXQgKi8KKyAgICBpZiAoIWluaV9maWxlKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgaWYgKCFHZXRUZW1wUGF0aChzaXplb2YodGVtcGRpciksIHRlbXBkaXIpCisgICAgICAgIHx8ICFHZXRUZW1wRmlsZU5hbWUodGVtcGRpciwgIn5kdSIsIDAsIGluaV9maWxlKSkgeworICAgICAgICBTeXN0ZW1FcnJvcihHZXRMYXN0RXJyb3IoKSwKKyAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgY3JlYXRlIHRlbXBvcmFyeSBmaWxlIik7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICBkc3QgPSBtYXBfbmV3X2ZpbGUoQ1JFQVRFX0FMV0FZUywgaW5pX2ZpbGUsIE5VTEwsIHBtZC0+dW5jb21wX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCBOVUxMLypub3RpZnkqLyk7CisgICAgaWYgKCFkc3QpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAvKiBVcCB0byB0aGUgZmlyc3QgXDAgaXMgdGhlIElOSSBmaWxlIGRhdGEuICovCisgICAgc3RybmNweShkc3QsIHNyYywgcG1kLT51bmNvbXBfc2l6ZSk7CisgICAgc3JjICs9IHN0cmxlbihkc3QpICsgMTsKKyAgICAvKiBVcCB0byBuZXh0IFwwIGlzIHRoZSBwcmUtaW5zdGFsbCBzY3JpcHQgKi8KKyAgICAqb3V0X3ByZWluc3RhbGxfc2NyaXB0ID0gc3RyZHVwKHNyYyk7CisgICAgKm91dF9pbmlfZmlsZSA9IGluaV9maWxlOworICAgIFVubWFwVmlld09mRmlsZShkc3QpOworICAgIHJldHVybiBUUlVFOwogfQogCiBzdGF0aWMgdm9pZCBQdW1wTWVzc2FnZXModm9pZCkKIHsKLQlNU0cgbXNnOwotCXdoaWxlIChQZWVrTWVzc2FnZSgmbXNnLCBOVUxMLCAwLCAwLCBQTV9SRU1PVkUpKSB7Ci0JCVRyYW5zbGF0ZU1lc3NhZ2UoJm1zZyk7Ci0JCURpc3BhdGNoTWVzc2FnZSgmbXNnKTsKLQl9CisgICAgTVNHIG1zZzsKKyAgICB3aGlsZSAoUGVla01lc3NhZ2UoJm1zZywgTlVMTCwgMCwgMCwgUE1fUkVNT1ZFKSkgeworICAgICAgICBUcmFuc2xhdGVNZXNzYWdlKCZtc2cpOworICAgICAgICBEaXNwYXRjaE1lc3NhZ2UoJm1zZyk7CisgICAgfQogfQogCiBMUkVTVUxUIENBTExCQUNLCiBXaW5kb3dQcm9jKEhXTkQgaHduZCwgVUlOVCBtc2csIFdQQVJBTSB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCiB7Ci0JSERDIGhkYzsKLQlIRk9OVCBoRm9udDsKLQlpbnQgaDsKLQlQQUlOVFNUUlVDVCBwczsKLQlzd2l0Y2ggKG1zZykgewotCWNhc2UgV01fUEFJTlQ6Ci0JCWhkYyA9IEJlZ2luUGFpbnQoaHduZCwgJnBzKTsKLQkJaCA9IEdldFN5c3RlbU1ldHJpY3MoU01fQ1lTQ1JFRU4pIC8gMTA7Ci0JCWhGb250ID0gQ3JlYXRlRm9udChoLCAwLCAwLCAwLCA3MDAsIFRSVUUsCi0JCQkJICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsICJUaW1lcyBSb21hbiIpOwotCQloRm9udCA9IFNlbGVjdE9iamVjdChoZGMsIGhGb250KTsKLQkJU2V0QmtNb2RlKGhkYywgVFJBTlNQQVJFTlQpOwotCQlUZXh0T3V0KGhkYywgMTUsIDE1LCB0aXRsZSwgc3RybGVuKHRpdGxlKSk7Ci0JCVNldFRleHRDb2xvcihoZGMsIFJHQigyNTUsIDI1NSwgMjU1KSk7Ci0JCVRleHRPdXQoaGRjLCAxMCwgMTAsIHRpdGxlLCBzdHJsZW4odGl0bGUpKTsKLQkJRGVsZXRlT2JqZWN0KFNlbGVjdE9iamVjdChoZGMsIGhGb250KSk7Ci0JCUVuZFBhaW50KGh3bmQsICZwcyk7Ci0JCXJldHVybiAwOwotCX0KLQlyZXR1cm4gRGVmV2luZG93UHJvYyhod25kLCBtc2csIHdQYXJhbSwgbFBhcmFtKTsKKyAgICBIREMgaGRjOworICAgIEhGT05UIGhGb250OworICAgIGludCBoOworICAgIFBBSU5UU1RSVUNUIHBzOworICAgIHN3aXRjaCAobXNnKSB7CisgICAgY2FzZSBXTV9QQUlOVDoKKyAgICAgICAgaGRjID0gQmVnaW5QYWludChod25kLCAmcHMpOworICAgICAgICBoID0gR2V0U3lzdGVtTWV0cmljcyhTTV9DWVNDUkVFTikgLyAxMDsKKyAgICAgICAgaEZvbnQgPSBDcmVhdGVGb250KGgsIDAsIDAsIDAsIDcwMCwgVFJVRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAiVGltZXMgUm9tYW4iKTsKKyAgICAgICAgaEZvbnQgPSBTZWxlY3RPYmplY3QoaGRjLCBoRm9udCk7CisgICAgICAgIFNldEJrTW9kZShoZGMsIFRSQU5TUEFSRU5UKTsKKyAgICAgICAgVGV4dE91dChoZGMsIDE1LCAxNSwgdGl0bGUsIHN0cmxlbih0aXRsZSkpOworICAgICAgICBTZXRUZXh0Q29sb3IoaGRjLCBSR0IoMjU1LCAyNTUsIDI1NSkpOworICAgICAgICBUZXh0T3V0KGhkYywgMTAsIDEwLCB0aXRsZSwgc3RybGVuKHRpdGxlKSk7CisgICAgICAgIERlbGV0ZU9iamVjdChTZWxlY3RPYmplY3QoaGRjLCBoRm9udCkpOworICAgICAgICBFbmRQYWludChod25kLCAmcHMpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIERlZldpbmRvd1Byb2MoaHduZCwgbXNnLCB3UGFyYW0sIGxQYXJhbSk7CiB9CiAKIHN0YXRpYyBIV05EIENyZWF0ZUJhY2tncm91bmQoY2hhciAqdGl0bGUpCiB7Ci0JV05EQ0xBU1Mgd2M7Ci0JSFdORCBod25kOwotCWNoYXIgYnVmZmVyWzQwOTZdOworICAgIFdORENMQVNTIHdjOworICAgIEhXTkQgaHduZDsKKyAgICBjaGFyIGJ1ZmZlcls0MDk2XTsKIAotCXdjLnN0eWxlID0gQ1NfVlJFRFJBVyB8IENTX0hSRURSQVc7Ci0Jd2MubHBmblduZFByb2MgPSBXaW5kb3dQcm9jOwotCXdjLmNiV25kRXh0cmEgPSAwOwotCXdjLmNiQ2xzRXh0cmEgPSAwOwotCXdjLmhJbnN0YW5jZSA9IEdldE1vZHVsZUhhbmRsZShOVUxMKTsKLQl3Yy5oSWNvbiA9IE5VTEw7Ci0Jd2MuaEN1cnNvciA9IExvYWRDdXJzb3IoTlVMTCwgSURDX0FSUk9XKTsKLQl3Yy5oYnJCYWNrZ3JvdW5kID0gQ3JlYXRlU29saWRCcnVzaChSR0IoMCwgMCwgMTI4KSk7Ci0Jd2MubHBzek1lbnVOYW1lID0gTlVMTDsKLQl3Yy5scHN6Q2xhc3NOYW1lID0gIlNldHVwV2luZG93Q2xhc3MiOworICAgIHdjLnN0eWxlID0gQ1NfVlJFRFJBVyB8IENTX0hSRURSQVc7CisgICAgd2MubHBmblduZFByb2MgPSBXaW5kb3dQcm9jOworICAgIHdjLmNiV25kRXh0cmEgPSAwOworICAgIHdjLmNiQ2xzRXh0cmEgPSAwOworICAgIHdjLmhJbnN0YW5jZSA9IEdldE1vZHVsZUhhbmRsZShOVUxMKTsKKyAgICB3Yy5oSWNvbiA9IE5VTEw7CisgICAgd2MuaEN1cnNvciA9IExvYWRDdXJzb3IoTlVMTCwgSURDX0FSUk9XKTsKKyAgICB3Yy5oYnJCYWNrZ3JvdW5kID0gQ3JlYXRlU29saWRCcnVzaChSR0IoMCwgMCwgMTI4KSk7CisgICAgd2MubHBzek1lbnVOYW1lID0gTlVMTDsKKyAgICB3Yy5scHN6Q2xhc3NOYW1lID0gIlNldHVwV2luZG93Q2xhc3MiOwogCi0JaWYgKCFSZWdpc3RlckNsYXNzKCZ3YykpCi0JCU1lc3NhZ2VCb3goaHduZE1haW4sCi0JCQkgICAgIkNvdWxkIG5vdCByZWdpc3RlciB3aW5kb3cgY2xhc3MiLAotCQkJICAgICJTZXR1cC5leGUiLCBNQl9PSyk7CisgICAgaWYgKCFSZWdpc3RlckNsYXNzKCZ3YykpCisgICAgICAgIE1lc3NhZ2VCb3goaHduZE1haW4sCisgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgcmVnaXN0ZXIgd2luZG93IGNsYXNzIiwKKyAgICAgICAgICAgICAgICAgICAgIlNldHVwLmV4ZSIsIE1CX09LKTsKIAotCXdzcHJpbnRmKGJ1ZmZlciwgIlNldHVwICVzIiwgdGl0bGUpOwotCWh3bmQgPSBDcmVhdGVXaW5kb3coIlNldHVwV2luZG93Q2xhc3MiLAotCQkJICAgICBidWZmZXIsCi0JCQkgICAgIDAsCi0JCQkgICAgIDAsIDAsCi0JCQkgICAgIEdldFN5c3RlbU1ldHJpY3MoU01fQ1hGVUxMU0NSRUVOKSwKLQkJCSAgICAgR2V0U3lzdGVtTWV0cmljcyhTTV9DWUZVTExTQ1JFRU4pLAotCQkJICAgICBOVUxMLAotCQkJICAgICBOVUxMLAotCQkJICAgICBHZXRNb2R1bGVIYW5kbGUoTlVMTCksCi0JCQkgICAgIE5VTEwpOwotCVNob3dXaW5kb3coaHduZCwgU1dfU0hPV01BWElNSVpFRCk7Ci0JVXBkYXRlV2luZG93KGh3bmQpOwotCXJldHVybiBod25kOworICAgIHdzcHJpbnRmKGJ1ZmZlciwgIlNldHVwICVzIiwgdGl0bGUpOworICAgIGh3bmQgPSBDcmVhdGVXaW5kb3coIlNldHVwV2luZG93Q2xhc3MiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgR2V0U3lzdGVtTWV0cmljcyhTTV9DWEZVTExTQ1JFRU4pLAorICAgICAgICAgICAgICAgICAgICAgICAgIEdldFN5c3RlbU1ldHJpY3MoU01fQ1lGVUxMU0NSRUVOKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgR2V0TW9kdWxlSGFuZGxlKE5VTEwpLAorICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgIFNob3dXaW5kb3coaHduZCwgU1dfU0hPV01BWElNSVpFRCk7CisgICAgVXBkYXRlV2luZG93KGh3bmQpOworICAgIHJldHVybiBod25kOwogfQogCiAvKgpAQCAtMTE3MCwxNiArMTE3MCwxNiBAQAogICovCiBzdGF0aWMgdm9pZCBDZW50ZXJXaW5kb3coSFdORCBod25kKQogewotCVJFQ1QgcmM7Ci0JaW50IHcsIGg7CisgICAgUkVDVCByYzsKKyAgICBpbnQgdywgaDsKIAotCUdldFdpbmRvd1JlY3QoaHduZCwgJnJjKTsKLQl3ID0gR2V0U3lzdGVtTWV0cmljcyhTTV9DWFNDUkVFTik7Ci0JaCA9IEdldFN5c3RlbU1ldHJpY3MoU01fQ1lTQ1JFRU4pOwotCU1vdmVXaW5kb3coaHduZCwKLQkJICAgKHcgLSAocmMucmlnaHQtcmMubGVmdCkpLzIsCi0JCSAgIChoIC0gKHJjLmJvdHRvbS1yYy50b3ApKS8yLAotCQkgICAgcmMucmlnaHQtcmMubGVmdCwgcmMuYm90dG9tLXJjLnRvcCwgRkFMU0UpOworICAgIEdldFdpbmRvd1JlY3QoaHduZCwgJnJjKTsKKyAgICB3ID0gR2V0U3lzdGVtTWV0cmljcyhTTV9DWFNDUkVFTik7CisgICAgaCA9IEdldFN5c3RlbU1ldHJpY3MoU01fQ1lTQ1JFRU4pOworICAgIE1vdmVXaW5kb3coaHduZCwKKyAgICAgICAgICAgICAgICh3IC0gKHJjLnJpZ2h0LXJjLmxlZnQpKS8yLAorICAgICAgICAgICAgICAgKGggLSAocmMuYm90dG9tLXJjLnRvcCkpLzIsCisgICAgICAgICAgICAgICAgcmMucmlnaHQtcmMubGVmdCwgcmMuYm90dG9tLXJjLnRvcCwgRkFMU0UpOwogfQogCiAjaW5jbHVkZSA8cHJzaHQuaD4KQEAgLTExODcsNDUgKzExODcsNDUgQEAKIEJPT0wgQ0FMTEJBQ0sKIEludHJvRGxnUHJvYyhIV05EIGh3bmQsIFVJTlQgbXNnLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQogewotCUxQTk1IRFIgbHBubTsKLQljaGFyIEJ1ZmZlcls0MDk2XTsKKyAgICBMUE5NSERSIGxwbm07CisgICAgY2hhciBCdWZmZXJbNDA5Nl07CiAKLQlzd2l0Y2ggKG1zZykgewotCWNhc2UgV01fSU5JVERJQUxPRzoKLQkJY3JlYXRlX2JpdG1hcChod25kKTsKLQkJaWYoaEJpdG1hcCkKLQkJCVNlbmREbGdJdGVtTWVzc2FnZShod25kLCBJRENfQklUTUFQLCBTVE1fU0VUSU1BR0UsCi0JCQkJCSAgIElNQUdFX0JJVE1BUCwgKExQQVJBTSloQml0bWFwKTsKLQkJQ2VudGVyV2luZG93KEdldFBhcmVudChod25kKSk7Ci0JCXdzcHJpbnRmKEJ1ZmZlciwKLQkJCSAgIlRoaXMgV2l6YXJkIHdpbGwgaW5zdGFsbCAlcyBvbiB5b3VyIGNvbXB1dGVyLiAiCi0JCQkgICJDbGljayBOZXh0IHRvIGNvbnRpbnVlICIKLQkJCSAgIm9yIENhbmNlbCB0byBleGl0IHRoZSBTZXR1cCBXaXphcmQuIiwKLQkJCSAgbWV0YV9uYW1lKTsKLQkJU2V0RGxnSXRlbVRleHQoaHduZCwgSURDX1RJVExFLCBCdWZmZXIpOwotCQlTZXREbGdJdGVtVGV4dChod25kLCBJRENfSU5UUk9fVEVYVCwgaW5mbyk7Ci0JCVNldERsZ0l0ZW1UZXh0KGh3bmQsIElEQ19CVUlMRF9JTkZPLCBidWlsZF9pbmZvKTsKLQkJcmV0dXJuIEZBTFNFOworICAgIHN3aXRjaCAobXNnKSB7CisgICAgY2FzZSBXTV9JTklURElBTE9HOgorICAgICAgICBjcmVhdGVfYml0bWFwKGh3bmQpOworICAgICAgICBpZihoQml0bWFwKQorICAgICAgICAgICAgU2VuZERsZ0l0ZW1NZXNzYWdlKGh3bmQsIElEQ19CSVRNQVAsIFNUTV9TRVRJTUFHRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTUFHRV9CSVRNQVAsIChMUEFSQU0paEJpdG1hcCk7CisgICAgICAgIENlbnRlcldpbmRvdyhHZXRQYXJlbnQoaHduZCkpOworICAgICAgICB3c3ByaW50ZihCdWZmZXIsCisgICAgICAgICAgICAgICAgICAiVGhpcyBXaXphcmQgd2lsbCBpbnN0YWxsICVzIG9uIHlvdXIgY29tcHV0ZXIuICIKKyAgICAgICAgICAgICAgICAgICJDbGljayBOZXh0IHRvIGNvbnRpbnVlICIKKyAgICAgICAgICAgICAgICAgICJvciBDYW5jZWwgdG8gZXhpdCB0aGUgU2V0dXAgV2l6YXJkLiIsCisgICAgICAgICAgICAgICAgICBtZXRhX25hbWUpOworICAgICAgICBTZXREbGdJdGVtVGV4dChod25kLCBJRENfVElUTEUsIEJ1ZmZlcik7CisgICAgICAgIFNldERsZ0l0ZW1UZXh0KGh3bmQsIElEQ19JTlRST19URVhULCBpbmZvKTsKKyAgICAgICAgU2V0RGxnSXRlbVRleHQoaHduZCwgSURDX0JVSUxEX0lORk8sIGJ1aWxkX2luZm8pOworICAgICAgICByZXR1cm4gRkFMU0U7CiAKLQljYXNlIFdNX05PVElGWToKLQkJbHBubSA9IChMUE5NSERSKSBsUGFyYW07CisgICAgY2FzZSBXTV9OT1RJRlk6CisgICAgICAgIGxwbm0gPSAoTFBOTUhEUikgbFBhcmFtOwogCi0JCXN3aXRjaCAobHBubS0+Y29kZSkgewotCQljYXNlIFBTTl9TRVRBQ1RJVkU6Ci0JCQlQcm9wU2hlZXRfU2V0V2l6QnV0dG9ucyhHZXRQYXJlbnQoaHduZCksIFBTV0laQl9ORVhUKTsKLQkJCWJyZWFrOworICAgICAgICBzd2l0Y2ggKGxwbm0tPmNvZGUpIHsKKyAgICAgICAgY2FzZSBQU05fU0VUQUNUSVZFOgorICAgICAgICAgICAgUHJvcFNoZWV0X1NldFdpekJ1dHRvbnMoR2V0UGFyZW50KGh3bmQpLCBQU1dJWkJfTkVYVCk7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIFBTTl9XSVpORVhUOgotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgUFNOX1dJWk5FWFQ6CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIFBTTl9SRVNFVDoKLQkJCWJyZWFrOwotCQkKLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCQl9Ci0JfQotCXJldHVybiBGQUxTRTsKKyAgICAgICAgY2FzZSBQU05fUkVTRVQ6CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEZBTFNFOwogfQogCiAjaWZkZWYgVVNFX09USEVSX1BZVEhPTl9WRVJTSU9OUwpAQCAtMTIzNywxMzMgKzEyMzcsMTMzIEBACiBpbnQgYm91bmRfaW1hZ2VfbWlub3I7CiAKIHN0YXRpYyBCT09MIF9fc3RkY2FsbCBTdGF0dXNSb3V0aW5lKElNQUdFSExQX1NUQVRVU19SRUFTT04gcmVhc29uLAotCQkJCSAgICBQU1RSIEltYWdlTmFtZSwKLQkJCQkgICAgUFNUUiBEbGxOYW1lLAotCQkJCSAgICBVTE9ORyBWYSwKLQkJCQkgICAgVUxPTkcgUGFyYW1ldGVyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNUUiBJbWFnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1RSIERsbE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTE9ORyBWYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVMT05HIFBhcmFtZXRlcikKIHsKLQljaGFyIGZuYW1lW19NQVhfUEFUSF07Ci0JaW50IGludF92ZXJzaW9uOworICAgIGNoYXIgZm5hbWVbX01BWF9QQVRIXTsKKyAgICBpbnQgaW50X3ZlcnNpb247CiAKLQlzd2l0Y2gocmVhc29uKSB7Ci0JY2FzZSBCaW5kT3V0T2ZNZW1vcnk6Ci0JY2FzZSBCaW5kUnZhVG9WYUZhaWxlZDoKLQljYXNlIEJpbmROb1Jvb21JbkltYWdlOgotCWNhc2UgQmluZEltcG9ydFByb2NlZHVyZUZhaWxlZDoKLQkJYnJlYWs7CisgICAgc3dpdGNoKHJlYXNvbikgeworICAgIGNhc2UgQmluZE91dE9mTWVtb3J5OgorICAgIGNhc2UgQmluZFJ2YVRvVmFGYWlsZWQ6CisgICAgY2FzZSBCaW5kTm9Sb29tSW5JbWFnZToKKyAgICBjYXNlIEJpbmRJbXBvcnRQcm9jZWR1cmVGYWlsZWQ6CisgICAgICAgIGJyZWFrOwogCi0JY2FzZSBCaW5kSW1wb3J0UHJvY2VkdXJlOgotCWNhc2UgQmluZEZvcndhcmRlcjoKLQljYXNlIEJpbmRGb3J3YXJkZXJOT1Q6Ci0JY2FzZSBCaW5kSW1hZ2VNb2RpZmllZDoKLQljYXNlIEJpbmRFeHBhbmRGaWxlSGVhZGVyczoKLQljYXNlIEJpbmRJbWFnZUNvbXBsZXRlOgotCWNhc2UgQmluZFN5bWJvbHNOb3RVcGRhdGVkOgotCWNhc2UgQmluZE1pc21hdGNoZWRTeW1ib2xzOgotCWNhc2UgQmluZEltcG9ydE1vZHVsZUZhaWxlZDoKLQkJYnJlYWs7CisgICAgY2FzZSBCaW5kSW1wb3J0UHJvY2VkdXJlOgorICAgIGNhc2UgQmluZEZvcndhcmRlcjoKKyAgICBjYXNlIEJpbmRGb3J3YXJkZXJOT1Q6CisgICAgY2FzZSBCaW5kSW1hZ2VNb2RpZmllZDoKKyAgICBjYXNlIEJpbmRFeHBhbmRGaWxlSGVhZGVyczoKKyAgICBjYXNlIEJpbmRJbWFnZUNvbXBsZXRlOgorICAgIGNhc2UgQmluZFN5bWJvbHNOb3RVcGRhdGVkOgorICAgIGNhc2UgQmluZE1pc21hdGNoZWRTeW1ib2xzOgorICAgIGNhc2UgQmluZEltcG9ydE1vZHVsZUZhaWxlZDoKKyAgICAgICAgYnJlYWs7CiAKLQljYXNlIEJpbmRJbXBvcnRNb2R1bGU6Ci0JCWlmICgxID09IHNzY2FuZihEbGxOYW1lLCAicHl0aG9uJWQiLCAmaW50X3ZlcnNpb24pKSB7Ci0JCQlTZWFyY2hQYXRoKE5VTEwsIERsbE5hbWUsIE5VTEwsIHNpemVvZihmbmFtZSksCi0JCQkJICAgZm5hbWUsIE5VTEwpOwotCQkJc3RyY3B5KGJvdW5kX2ltYWdlX2RsbCwgZm5hbWUpOwotCQkJYm91bmRfaW1hZ2VfbWFqb3IgPSBpbnRfdmVyc2lvbiAvIDEwOwotCQkJYm91bmRfaW1hZ2VfbWlub3IgPSBpbnRfdmVyc2lvbiAlIDEwOwotCQkJT3V0cHV0RGVidWdTdHJpbmcoIkJPVU5EICIpOwotCQkJT3V0cHV0RGVidWdTdHJpbmcoZm5hbWUpOwotCQkJT3V0cHV0RGVidWdTdHJpbmcoIlxuIik7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCXJldHVybiBUUlVFOworICAgIGNhc2UgQmluZEltcG9ydE1vZHVsZToKKyAgICAgICAgaWYgKDEgPT0gc3NjYW5mKERsbE5hbWUsICJweXRob24lZCIsICZpbnRfdmVyc2lvbikpIHsKKyAgICAgICAgICAgIFNlYXJjaFBhdGgoTlVMTCwgRGxsTmFtZSwgTlVMTCwgc2l6ZW9mKGZuYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgZm5hbWUsIE5VTEwpOworICAgICAgICAgICAgc3RyY3B5KGJvdW5kX2ltYWdlX2RsbCwgZm5hbWUpOworICAgICAgICAgICAgYm91bmRfaW1hZ2VfbWFqb3IgPSBpbnRfdmVyc2lvbiAvIDEwOworICAgICAgICAgICAgYm91bmRfaW1hZ2VfbWlub3IgPSBpbnRfdmVyc2lvbiAlIDEwOworICAgICAgICAgICAgT3V0cHV0RGVidWdTdHJpbmcoIkJPVU5EICIpOworICAgICAgICAgICAgT3V0cHV0RGVidWdTdHJpbmcoZm5hbWUpOworICAgICAgICAgICAgT3V0cHV0RGVidWdTdHJpbmcoIlxuIik7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBUUlVFOwogfQogCiAvKgogICovCiBzdGF0aWMgTFBTVFIgZ2V0X3N5c19wcmVmaXgoTFBTVFIgZXhlLCBMUFNUUiBkbGwpCiB7Ci0Jdm9pZCAoX19jZGVjbCAqIFB5X0luaXRpYWxpemUpKHZvaWQpOwotCXZvaWQgKF9fY2RlY2wgKiBQeV9TZXRQcm9ncmFtTmFtZSkoY2hhciAqKTsKLQl2b2lkIChfX2NkZWNsICogUHlfRmluYWxpemUpKHZvaWQpOwotCXZvaWQqIChfX2NkZWNsICogUHlTeXNfR2V0T2JqZWN0KShjaGFyICopOwotCXZvaWQgKF9fY2RlY2wgKiBQeVN5c19TZXRBcmd2KShpbnQsIGNoYXIgKiopOwotCWNoYXIqIChfX2NkZWNsICogUHlfR2V0UHJlZml4KSh2b2lkKTsKLQljaGFyKiAoX19jZGVjbCAqIFB5X0dldFBhdGgpKHZvaWQpOwotCUhJTlNUQU5DRSBoUHl0aG9uOwotCUxQU1RSIHByZWZpeCA9IE5VTEw7Ci0JaW50IChfX2NkZWNsICogUHlSdW5fU2ltcGxlU3RyaW5nKShjaGFyICopOworICAgIHZvaWQgKF9fY2RlY2wgKiBQeV9Jbml0aWFsaXplKSh2b2lkKTsKKyAgICB2b2lkIChfX2NkZWNsICogUHlfU2V0UHJvZ3JhbU5hbWUpKGNoYXIgKik7CisgICAgdm9pZCAoX19jZGVjbCAqIFB5X0ZpbmFsaXplKSh2b2lkKTsKKyAgICB2b2lkKiAoX19jZGVjbCAqIFB5U3lzX0dldE9iamVjdCkoY2hhciAqKTsKKyAgICB2b2lkIChfX2NkZWNsICogUHlTeXNfU2V0QXJndikoaW50LCBjaGFyICoqKTsKKyAgICBjaGFyKiAoX19jZGVjbCAqIFB5X0dldFByZWZpeCkodm9pZCk7CisgICAgY2hhciogKF9fY2RlY2wgKiBQeV9HZXRQYXRoKSh2b2lkKTsKKyAgICBISU5TVEFOQ0UgaFB5dGhvbjsKKyAgICBMUFNUUiBwcmVmaXggPSBOVUxMOworICAgIGludCAoX19jZGVjbCAqIFB5UnVuX1NpbXBsZVN0cmluZykoY2hhciAqKTsKIAotCXsKLQkJY2hhciBCdWZmZXJbMjU2XTsKLQkJd3NwcmludGYoQnVmZmVyLCAiUFlUSE9OSE9NRT0lcyIsIGV4ZSk7Ci0JCSpzdHJyY2hyKEJ1ZmZlciwgJ1xcJykgPSAnXDAnOwotLy8JTWVzc2FnZUJveChHZXRGb2N1cygpLCBCdWZmZXIsICJQWVRIT05IT01FIiwgTUJfT0spOwotCQlfcHV0ZW52KEJ1ZmZlcik7Ci0JCV9wdXRlbnYoIlBZVEhPTlBBVEg9Iik7Ci0JfQorICAgIHsKKyAgICAgICAgY2hhciBCdWZmZXJbMjU2XTsKKyAgICAgICAgd3NwcmludGYoQnVmZmVyLCAiUFlUSE9OSE9NRT0lcyIsIGV4ZSk7CisgICAgICAgICpzdHJyY2hyKEJ1ZmZlciwgJ1xcJykgPSAnXDAnOworLy8gICAgICBNZXNzYWdlQm94KEdldEZvY3VzKCksIEJ1ZmZlciwgIlBZVEhPTkhPTUUiLCBNQl9PSyk7CisgICAgICAgICAgICAgICAgX3B1dGVudihCdWZmZXIpOworICAgICAgICAgICAgICAgIF9wdXRlbnYoIlBZVEhPTlBBVEg9Iik7CisgICAgfQogCi0JaFB5dGhvbiA9IExvYWRMaWJyYXJ5KGRsbCk7Ci0JaWYgKCFoUHl0aG9uKQotCQlyZXR1cm4gTlVMTDsKLQlQeV9Jbml0aWFsaXplID0gKHZvaWQgKCopKHZvaWQpKUdldFByb2NBZGRyZXNzCi0JCShoUHl0aG9uLCJQeV9Jbml0aWFsaXplIik7CisgICAgaFB5dGhvbiA9IExvYWRMaWJyYXJ5KGRsbCk7CisgICAgaWYgKCFoUHl0aG9uKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQeV9Jbml0aWFsaXplID0gKHZvaWQgKCopKHZvaWQpKUdldFByb2NBZGRyZXNzCisgICAgICAgIChoUHl0aG9uLCJQeV9Jbml0aWFsaXplIik7CiAKLQlQeVN5c19TZXRBcmd2ID0gKHZvaWQgKCopKGludCwgY2hhciAqKikpR2V0UHJvY0FkZHJlc3MKLQkJKGhQeXRob24sIlB5U3lzX1NldEFyZ3YiKTsKKyAgICBQeVN5c19TZXRBcmd2ID0gKHZvaWQgKCopKGludCwgY2hhciAqKikpR2V0UHJvY0FkZHJlc3MKKyAgICAgICAgKGhQeXRob24sIlB5U3lzX1NldEFyZ3YiKTsKIAotCVB5UnVuX1NpbXBsZVN0cmluZyA9IChpbnQgKCopKGNoYXIgKikpR2V0UHJvY0FkZHJlc3MKLQkJKGhQeXRob24sIlB5UnVuX1NpbXBsZVN0cmluZyIpOworICAgIFB5UnVuX1NpbXBsZVN0cmluZyA9IChpbnQgKCopKGNoYXIgKikpR2V0UHJvY0FkZHJlc3MKKyAgICAgICAgKGhQeXRob24sIlB5UnVuX1NpbXBsZVN0cmluZyIpOwogCi0JUHlfU2V0UHJvZ3JhbU5hbWUgPSAodm9pZCAoKikoY2hhciAqKSlHZXRQcm9jQWRkcmVzcwotCQkoaFB5dGhvbiwiUHlfU2V0UHJvZ3JhbU5hbWUiKTsKKyAgICBQeV9TZXRQcm9ncmFtTmFtZSA9ICh2b2lkICgqKShjaGFyICopKUdldFByb2NBZGRyZXNzCisgICAgICAgIChoUHl0aG9uLCJQeV9TZXRQcm9ncmFtTmFtZSIpOwogCi0JUHlTeXNfR2V0T2JqZWN0ID0gKHZvaWQqICgqKShjaGFyICopKUdldFByb2NBZGRyZXNzCi0JCShoUHl0aG9uLCJQeVN5c19HZXRPYmplY3QiKTsKKyAgICBQeVN5c19HZXRPYmplY3QgPSAodm9pZCogKCopKGNoYXIgKikpR2V0UHJvY0FkZHJlc3MKKyAgICAgICAgKGhQeXRob24sIlB5U3lzX0dldE9iamVjdCIpOwogCi0JUHlfR2V0UHJlZml4ID0gKGNoYXIgKiAoKikodm9pZCkpR2V0UHJvY0FkZHJlc3MKLQkJKGhQeXRob24sIlB5X0dldFByZWZpeCIpOworICAgIFB5X0dldFByZWZpeCA9IChjaGFyICogKCopKHZvaWQpKUdldFByb2NBZGRyZXNzCisgICAgICAgIChoUHl0aG9uLCJQeV9HZXRQcmVmaXgiKTsKIAotCVB5X0dldFBhdGggPSAoY2hhciAqICgqKSh2b2lkKSlHZXRQcm9jQWRkcmVzcwotCQkoaFB5dGhvbiwiUHlfR2V0UGF0aCIpOworICAgIFB5X0dldFBhdGggPSAoY2hhciAqICgqKSh2b2lkKSlHZXRQcm9jQWRkcmVzcworICAgICAgICAoaFB5dGhvbiwiUHlfR2V0UGF0aCIpOwogCi0JUHlfRmluYWxpemUgPSAodm9pZCAoKikodm9pZCkpR2V0UHJvY0FkZHJlc3MoaFB5dGhvbiwKLQkJCQkJCSAgICAgICJQeV9GaW5hbGl6ZSIpOwotCVB5X1NldFByb2dyYW1OYW1lKGV4ZSk7Ci0JUHlfSW5pdGlhbGl6ZSgpOwotCVB5U3lzX1NldEFyZ3YoMSwgJmV4ZSk7CisgICAgUHlfRmluYWxpemUgPSAodm9pZCAoKikodm9pZCkpR2V0UHJvY0FkZHJlc3MoaFB5dGhvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlB5X0ZpbmFsaXplIik7CisgICAgUHlfU2V0UHJvZ3JhbU5hbWUoZXhlKTsKKyAgICBQeV9Jbml0aWFsaXplKCk7CisgICAgUHlTeXNfU2V0QXJndigxLCAmZXhlKTsKIAotCU1lc3NhZ2VCb3goR2V0Rm9jdXMoKSwgUHlfR2V0UHJlZml4KCksICJQUkVGSVgiLCBNQl9PSyk7Ci0JTWVzc2FnZUJveChHZXRGb2N1cygpLCBQeV9HZXRQYXRoKCksICJQQVRIIiwgTUJfT0spOworICAgIE1lc3NhZ2VCb3goR2V0Rm9jdXMoKSwgUHlfR2V0UHJlZml4KCksICJQUkVGSVgiLCBNQl9PSyk7CisgICAgTWVzc2FnZUJveChHZXRGb2N1cygpLCBQeV9HZXRQYXRoKCksICJQQVRIIiwgTUJfT0spOwogCi0JUHlfRmluYWxpemUoKTsKLQlGcmVlTGlicmFyeShoUHl0aG9uKTsKKyAgICBQeV9GaW5hbGl6ZSgpOworICAgIEZyZWVMaWJyYXJ5KGhQeXRob24pOwogCi0JcmV0dXJuIHByZWZpeDsKKyAgICByZXR1cm4gcHJlZml4OwogfQogCiBzdGF0aWMgQk9PTAogQ2hlY2tQeXRob25FeGUoTFBTVFIgcGF0aG5hbWUsIExQU1RSIHZlcnNpb24sIGludCAqcG1ham9yLCBpbnQgKnBtaW5vcikKIHsKLQlib3VuZF9pbWFnZV9kbGxbMF0gPSAnXDAnOwotCWlmICghQmluZEltYWdlRXgoQklORF9OT19CT1VORF9JTVBPUlRTIHwgQklORF9OT19VUERBVEUgfCBCSU5EX0FMTF9JTUFHRVMsCi0JCQkgcGF0aG5hbWUsCi0JCQkgTlVMTCwKLQkJCSBOVUxMLAotCQkJIFN0YXR1c1JvdXRpbmUpKQotCQlyZXR1cm4gU3lzdGVtRXJyb3IoMCwgIkNvdWxkIG5vdCBiaW5kIGltYWdlIik7Ci0JaWYgKGJvdW5kX2ltYWdlX2RsbFswXSA9PSAnXDAnKQotCQlyZXR1cm4gU3lzdGVtRXJyb3IoMCwgIkRvZXMgbm90IHNlZW0gdG8gYmUgYSBweXRob24gZXhlY3V0YWJsZSIpOwotCSpwbWFqb3IgPSBib3VuZF9pbWFnZV9tYWpvcjsKLQkqcG1pbm9yID0gYm91bmRfaW1hZ2VfbWlub3I7Ci0JaWYgKHZlcnNpb24gJiYgKnZlcnNpb24pIHsKLQkJY2hhciBjb3JlX3ZlcnNpb25bMTJdOwotCQl3c3ByaW50Zihjb3JlX3ZlcnNpb24sICIlZC4lZCIsIGJvdW5kX2ltYWdlX21ham9yLCBib3VuZF9pbWFnZV9taW5vcik7Ci0JCWlmIChzdHJjbXAodmVyc2lvbiwgY29yZV92ZXJzaW9uKSkKLQkJCXJldHVybiBTeXN0ZW1FcnJvcigwLCAiV3JvbmcgUHl0aG9uIHZlcnNpb24iKTsKLQl9Ci0JZ2V0X3N5c19wcmVmaXgocGF0aG5hbWUsIGJvdW5kX2ltYWdlX2RsbCk7Ci0JcmV0dXJuIFRSVUU7CisgICAgYm91bmRfaW1hZ2VfZGxsWzBdID0gJ1wwJzsKKyAgICBpZiAoIUJpbmRJbWFnZUV4KEJJTkRfTk9fQk9VTkRfSU1QT1JUUyB8IEJJTkRfTk9fVVBEQVRFIHwgQklORF9BTExfSU1BR0VTLAorICAgICAgICAgICAgICAgICAgICAgcGF0aG5hbWUsCisgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgIFN0YXR1c1JvdXRpbmUpKQorICAgICAgICByZXR1cm4gU3lzdGVtRXJyb3IoMCwgIkNvdWxkIG5vdCBiaW5kIGltYWdlIik7CisgICAgaWYgKGJvdW5kX2ltYWdlX2RsbFswXSA9PSAnXDAnKQorICAgICAgICByZXR1cm4gU3lzdGVtRXJyb3IoMCwgIkRvZXMgbm90IHNlZW0gdG8gYmUgYSBweXRob24gZXhlY3V0YWJsZSIpOworICAgICpwbWFqb3IgPSBib3VuZF9pbWFnZV9tYWpvcjsKKyAgICAqcG1pbm9yID0gYm91bmRfaW1hZ2VfbWlub3I7CisgICAgaWYgKHZlcnNpb24gJiYgKnZlcnNpb24pIHsKKyAgICAgICAgY2hhciBjb3JlX3ZlcnNpb25bMTJdOworICAgICAgICB3c3ByaW50Zihjb3JlX3ZlcnNpb24sICIlZC4lZCIsIGJvdW5kX2ltYWdlX21ham9yLCBib3VuZF9pbWFnZV9taW5vcik7CisgICAgICAgIGlmIChzdHJjbXAodmVyc2lvbiwgY29yZV92ZXJzaW9uKSkKKyAgICAgICAgICAgIHJldHVybiBTeXN0ZW1FcnJvcigwLCAiV3JvbmcgUHl0aG9uIHZlcnNpb24iKTsKKyAgICB9CisgICAgZ2V0X3N5c19wcmVmaXgocGF0aG5hbWUsIGJvdW5kX2ltYWdlX2RsbCk7CisgICAgcmV0dXJuIFRSVUU7CiB9CiAKIC8qCkBAIC0xMzcyLDQ4ICsxMzcyLDQ4IEBACiAgKi8KIHN0YXRpYyBCT09MIEdldE90aGVyUHl0aG9uVmVyc2lvbihIV05EIGh3bmQsIExQU1RSIHZlcnNpb24pCiB7Ci0JY2hhciB2ZXJzX25hbWVbX01BWF9QQVRIICsgODBdOwotCURXT1JEIGl0ZW1pbmRleDsKLQlPUEVORklMRU5BTUUgb2Y7Ci0JY2hhciBwYXRobmFtZVtfTUFYX1BBVEhdOwotCURXT1JEIHJlc3VsdDsKKyAgICBjaGFyIHZlcnNfbmFtZVtfTUFYX1BBVEggKyA4MF07CisgICAgRFdPUkQgaXRlbWluZGV4OworICAgIE9QRU5GSUxFTkFNRSBvZjsKKyAgICBjaGFyIHBhdGhuYW1lW19NQVhfUEFUSF07CisgICAgRFdPUkQgcmVzdWx0OwogCi0Jc3RyY3B5KHBhdGhuYW1lLCAicHl0aG9uLmV4ZSIpOworICAgIHN0cmNweShwYXRobmFtZSwgInB5dGhvbi5leGUiKTsKIAotCW1lbXNldCgmb2YsIDAsIHNpemVvZihvZikpOwotCW9mLmxTdHJ1Y3RTaXplID0gc2l6ZW9mKE9QRU5GSUxFTkFNRSk7Ci0Jb2YuaHduZE93bmVyID0gR2V0UGFyZW50KGh3bmQpOwotCW9mLmhJbnN0YW5jZSA9IE5VTEw7Ci0Jb2YubHBzdHJGaWx0ZXIgPSAicHl0aG9uLmV4ZVwwcHl0aG9uLmV4ZVwwIjsKLQlvZi5scHN0ckN1c3RvbUZpbHRlciA9IE5VTEw7Ci0Jb2Yubk1heEN1c3RGaWx0ZXIgPSAwOwotCW9mLm5GaWx0ZXJJbmRleCA9IDE7Ci0Jb2YubHBzdHJGaWxlID0gcGF0aG5hbWU7Ci0Jb2Yubk1heEZpbGUgPSBzaXplb2YocGF0aG5hbWUpOwotCW9mLmxwc3RyRmlsZVRpdGxlID0gTlVMTDsKLQlvZi5uTWF4RmlsZVRpdGxlID0gMDsKLQlvZi5scHN0ckluaXRpYWxEaXIgPSBOVUxMOwotCW9mLmxwc3RyVGl0bGUgPSAiUHl0aG9uIGV4ZWN1dGFibGUiOwotCW9mLkZsYWdzID0gT0ZOX0ZJTEVNVVNURVhJU1QgfCBPRk5fUEFUSE1VU1RFWElTVDsKLQlvZi5scHN0ckRlZkV4dCA9ICJleGUiOworICAgIG1lbXNldCgmb2YsIDAsIHNpemVvZihvZikpOworICAgIG9mLmxTdHJ1Y3RTaXplID0gc2l6ZW9mKE9QRU5GSUxFTkFNRSk7CisgICAgb2YuaHduZE93bmVyID0gR2V0UGFyZW50KGh3bmQpOworICAgIG9mLmhJbnN0YW5jZSA9IE5VTEw7CisgICAgb2YubHBzdHJGaWx0ZXIgPSAicHl0aG9uLmV4ZVwwcHl0aG9uLmV4ZVwwIjsKKyAgICBvZi5scHN0ckN1c3RvbUZpbHRlciA9IE5VTEw7CisgICAgb2Yubk1heEN1c3RGaWx0ZXIgPSAwOworICAgIG9mLm5GaWx0ZXJJbmRleCA9IDE7CisgICAgb2YubHBzdHJGaWxlID0gcGF0aG5hbWU7CisgICAgb2Yubk1heEZpbGUgPSBzaXplb2YocGF0aG5hbWUpOworICAgIG9mLmxwc3RyRmlsZVRpdGxlID0gTlVMTDsKKyAgICBvZi5uTWF4RmlsZVRpdGxlID0gMDsKKyAgICBvZi5scHN0ckluaXRpYWxEaXIgPSBOVUxMOworICAgIG9mLmxwc3RyVGl0bGUgPSAiUHl0aG9uIGV4ZWN1dGFibGUiOworICAgIG9mLkZsYWdzID0gT0ZOX0ZJTEVNVVNURVhJU1QgfCBPRk5fUEFUSE1VU1RFWElTVDsKKyAgICBvZi5scHN0ckRlZkV4dCA9ICJleGUiOwogCi0JcmVzdWx0ID0gR2V0T3BlbkZpbGVOYW1lKCZvZik7Ci0JaWYgKHJlc3VsdCkgewotCQlpbnQgbWFqb3IsIG1pbm9yOwotCQlpZiAoIUNoZWNrUHl0aG9uRXhlKHBhdGhuYW1lLCB2ZXJzaW9uLCAmbWFqb3IsICZtaW5vcikpIHsKLQkJCXJldHVybiBGQUxTRTsKLQkJfQotCQkqc3RycmNocihwYXRobmFtZSwgJ1xcJykgPSAnXDAnOwotCQl3c3ByaW50Zih2ZXJzX25hbWUsICJQeXRob24gVmVyc2lvbiAlZC4lZCBpbiAlcyIsCi0JCQkgIG1ham9yLCBtaW5vciwgcGF0aG5hbWUpOwotCQlpdGVtaW5kZXggPSBTZW5kTWVzc2FnZShod25kLCBMQl9JTlNFUlRTVFJJTkcsIC0xLAotCQkJCQkoTFBBUkFNKShMUFNUUil2ZXJzX25hbWUpOwotCQlTZW5kTWVzc2FnZShod25kLCBMQl9TRVRDVVJTRUwsIGl0ZW1pbmRleCwgMCk7Ci0JCVNlbmRNZXNzYWdlKGh3bmQsIExCX1NFVElURU1EQVRBLCBpdGVtaW5kZXgsCi0JCQkgICAgKExQQVJBTSkoTFBTVFIpc3RyZHVwKHBhdGhuYW1lKSk7Ci0JCXJldHVybiBUUlVFOwotCX0KLQlyZXR1cm4gRkFMU0U7CisgICAgcmVzdWx0ID0gR2V0T3BlbkZpbGVOYW1lKCZvZik7CisgICAgaWYgKHJlc3VsdCkgeworICAgICAgICBpbnQgbWFqb3IsIG1pbm9yOworICAgICAgICBpZiAoIUNoZWNrUHl0aG9uRXhlKHBhdGhuYW1lLCB2ZXJzaW9uLCAmbWFqb3IsICZtaW5vcikpIHsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICAqc3RycmNocihwYXRobmFtZSwgJ1xcJykgPSAnXDAnOworICAgICAgICB3c3ByaW50Zih2ZXJzX25hbWUsICJQeXRob24gVmVyc2lvbiAlZC4lZCBpbiAlcyIsCisgICAgICAgICAgICAgICAgICBtYWpvciwgbWlub3IsIHBhdGhuYW1lKTsKKyAgICAgICAgaXRlbWluZGV4ID0gU2VuZE1lc3NhZ2UoaHduZCwgTEJfSU5TRVJUU1RSSU5HLCAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExQQVJBTSkoTFBTVFIpdmVyc19uYW1lKTsKKyAgICAgICAgU2VuZE1lc3NhZ2UoaHduZCwgTEJfU0VUQ1VSU0VMLCBpdGVtaW5kZXgsIDApOworICAgICAgICBTZW5kTWVzc2FnZShod25kLCBMQl9TRVRJVEVNREFUQSwgaXRlbWluZGV4LAorICAgICAgICAgICAgICAgICAgICAoTFBBUkFNKShMUFNUUilzdHJkdXAocGF0aG5hbWUpKTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICAgIHJldHVybiBGQUxTRTsKIH0KICNlbmRpZiAvKiBVU0VfT1RIRVJfUFlUSE9OX1ZFUlNJT05TICovCiAKQEAgLTE0MzAsNzEgKzE0MzAsNzEgQEAKICAqLwogc3RhdGljIEJPT0wgR2V0UHl0aG9uVmVyc2lvbnMoSFdORCBod25kLCBIS0VZIGhrUm9vdCwgTFBTVFIgdmVyc2lvbikKIHsKLQlEV09SRCBpbmRleCA9IDA7Ci0JY2hhciBjb3JlX3ZlcnNpb25bODBdOwotCUhLRVkgaEtleTsKLQlCT09MIHJlc3VsdCA9IFRSVUU7Ci0JRFdPUkQgYnVmc2l6ZTsKKyAgICBEV09SRCBpbmRleCA9IDA7CisgICAgY2hhciBjb3JlX3ZlcnNpb25bODBdOworICAgIEhLRVkgaEtleTsKKyAgICBCT09MIHJlc3VsdCA9IFRSVUU7CisgICAgRFdPUkQgYnVmc2l6ZTsKIAotCWlmIChFUlJPUl9TVUNDRVNTICE9IFJlZ09wZW5LZXlFeChoa1Jvb3QsCi0JCQkJCSAgICJTb2Z0d2FyZVxcUHl0aG9uXFxQeXRob25Db3JlIiwKLQkJCQkJICAgMCwJS0VZX1JFQUQsICZoS2V5KSkKLQkJcmV0dXJuIEZBTFNFOwotCWJ1ZnNpemUgPSBzaXplb2YoY29yZV92ZXJzaW9uKTsKLQl3aGlsZSAoRVJST1JfU1VDQ0VTUyA9PSBSZWdFbnVtS2V5RXgoaEtleSwgaW5kZXgsCi0JCQkJCSAgICAgIGNvcmVfdmVyc2lvbiwgJmJ1ZnNpemUsIE5VTEwsCi0JCQkJCSAgICAgIE5VTEwsIE5VTEwsIE5VTEwpKSB7Ci0JCWNoYXIgc3Via2V5X25hbWVbODBdLCB2ZXJzX25hbWVbODBdOwotCQlpbnQgaXRlbWluZGV4OwotCQlEV09SRCB2YWx1ZV9zaXplOwotCQlIS0VZIGhrOworICAgIGlmIChFUlJPUl9TVUNDRVNTICE9IFJlZ09wZW5LZXlFeChoa1Jvb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU29mdHdhcmVcXFB5dGhvblxcUHl0aG9uQ29yZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICBLRVlfUkVBRCwgJmhLZXkpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgYnVmc2l6ZSA9IHNpemVvZihjb3JlX3ZlcnNpb24pOworICAgIHdoaWxlIChFUlJPUl9TVUNDRVNTID09IFJlZ0VudW1LZXlFeChoS2V5LCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcmVfdmVyc2lvbiwgJmJ1ZnNpemUsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMKSkgeworICAgICAgICBjaGFyIHN1YmtleV9uYW1lWzgwXSwgdmVyc19uYW1lWzgwXTsKKyAgICAgICAgaW50IGl0ZW1pbmRleDsKKyAgICAgICAgRFdPUkQgdmFsdWVfc2l6ZTsKKyAgICAgICAgSEtFWSBoazsKIAotCQlidWZzaXplID0gc2l6ZW9mKGNvcmVfdmVyc2lvbik7Ci0JCSsraW5kZXg7Ci0JCWlmICh2ZXJzaW9uICYmICp2ZXJzaW9uICYmIHN0cmNtcCh2ZXJzaW9uLCBjb3JlX3ZlcnNpb24pKQotCQkJY29udGludWU7CisgICAgICAgIGJ1ZnNpemUgPSBzaXplb2YoY29yZV92ZXJzaW9uKTsKKyAgICAgICAgKytpbmRleDsKKyAgICAgICAgaWYgKHZlcnNpb24gJiYgKnZlcnNpb24gJiYgc3RyY21wKHZlcnNpb24sIGNvcmVfdmVyc2lvbikpCisgICAgICAgICAgICBjb250aW51ZTsKIAotCQl3c3ByaW50Zih2ZXJzX25hbWUsICJQeXRob24gVmVyc2lvbiAlcyAoZm91bmQgaW4gcmVnaXN0cnkpIiwKLQkJCSAgY29yZV92ZXJzaW9uKTsKLQkJd3NwcmludGYoc3Via2V5X25hbWUsCi0JCQkgICJTb2Z0d2FyZVxcUHl0aG9uXFxQeXRob25Db3JlXFwlc1xcSW5zdGFsbFBhdGgiLAotCQkJICBjb3JlX3ZlcnNpb24pOwotCQlpZiAoRVJST1JfU1VDQ0VTUyA9PSBSZWdPcGVuS2V5RXgoaGtSb290LCBzdWJrZXlfbmFtZSwgMCwgS0VZX1JFQUQsICZoaykpIHsKLQkJCUluc3RhbGxlZFZlcnNpb25JbmZvICppdmkgPSAKLQkJCSAgICAgIChJbnN0YWxsZWRWZXJzaW9uSW5mbyAqKW1hbGxvYyhzaXplb2YoSW5zdGFsbGVkVmVyc2lvbkluZm8pKTsKLQkJCXZhbHVlX3NpemUgPSBzaXplb2YoaXZpLT5wcmVmaXgpOwotCQkJaWYgKGl2aSAmJiAKLQkJCSAgICBFUlJPUl9TVUNDRVNTID09IFJlZ1F1ZXJ5VmFsdWVFeChoaywgTlVMTCwgTlVMTCwgTlVMTCwKLQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdmktPnByZWZpeCwgJnZhbHVlX3NpemUpKSB7Ci0JCQkJaXRlbWluZGV4ID0gU2VuZE1lc3NhZ2UoaHduZCwgTEJfQUREU1RSSU5HLCAwLAotCQkJCSAgICAgICAgICAgICAgICAgICAgICAgIChMUEFSQU0pKExQU1RSKXZlcnNfbmFtZSk7Ci0JCQkJaXZpLT5oa2V5ID0gaGtSb290OwotCQkJCVNlbmRNZXNzYWdlKGh3bmQsIExCX1NFVElURU1EQVRBLCBpdGVtaW5kZXgsCi0JCQkJICAgICAgICAgICAgKExQQVJBTSkoTFBTVFIpaXZpKTsKLQkJCX0KLQkJCVJlZ0Nsb3NlS2V5KGhrKTsKLQkJfQotCX0KLQlSZWdDbG9zZUtleShoS2V5KTsKLQlyZXR1cm4gcmVzdWx0OworICAgICAgICB3c3ByaW50Zih2ZXJzX25hbWUsICJQeXRob24gVmVyc2lvbiAlcyAoZm91bmQgaW4gcmVnaXN0cnkpIiwKKyAgICAgICAgICAgICAgICAgIGNvcmVfdmVyc2lvbik7CisgICAgICAgIHdzcHJpbnRmKHN1YmtleV9uYW1lLAorICAgICAgICAgICAgICAgICAgIlNvZnR3YXJlXFxQeXRob25cXFB5dGhvbkNvcmVcXCVzXFxJbnN0YWxsUGF0aCIsCisgICAgICAgICAgICAgICAgICBjb3JlX3ZlcnNpb24pOworICAgICAgICBpZiAoRVJST1JfU1VDQ0VTUyA9PSBSZWdPcGVuS2V5RXgoaGtSb290LCBzdWJrZXlfbmFtZSwgMCwgS0VZX1JFQUQsICZoaykpIHsKKyAgICAgICAgICAgIEluc3RhbGxlZFZlcnNpb25JbmZvICppdmkgPQorICAgICAgICAgICAgICAgICAgKEluc3RhbGxlZFZlcnNpb25JbmZvICopbWFsbG9jKHNpemVvZihJbnN0YWxsZWRWZXJzaW9uSW5mbykpOworICAgICAgICAgICAgdmFsdWVfc2l6ZSA9IHNpemVvZihpdmktPnByZWZpeCk7CisgICAgICAgICAgICBpZiAoaXZpICYmCisgICAgICAgICAgICAgICAgRVJST1JfU1VDQ0VTUyA9PSBSZWdRdWVyeVZhbHVlRXgoaGssIE5VTEwsIE5VTEwsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXZpLT5wcmVmaXgsICZ2YWx1ZV9zaXplKSkgeworICAgICAgICAgICAgICAgIGl0ZW1pbmRleCA9IFNlbmRNZXNzYWdlKGh3bmQsIExCX0FERFNUUklORywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFBBUkFNKShMUFNUUil2ZXJzX25hbWUpOworICAgICAgICAgICAgICAgIGl2aS0+aGtleSA9IGhrUm9vdDsKKyAgICAgICAgICAgICAgICBTZW5kTWVzc2FnZShod25kLCBMQl9TRVRJVEVNREFUQSwgaXRlbWluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMUEFSQU0pKExQU1RSKWl2aSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBSZWdDbG9zZUtleShoayk7CisgICAgICAgIH0KKyAgICB9CisgICAgUmVnQ2xvc2VLZXkoaEtleSk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogLyogRGV0ZXJtaW5lIGlmIHRoZSBjdXJyZW50IHVzZXIgY2FuIHdyaXRlIHRvIEhLRVlfTE9DQUxfTUFDSElORSAqLwogQk9PTCBIYXNMb2NhbE1hY2hpbmVQcml2cygpCiB7Ci0JCUhLRVkgaEtleTsKLQkJRFdPUkQgcmVzdWx0OwotCQlzdGF0aWMgY2hhciBLZXlOYW1lW10gPSAKLQkJCSJTb2Z0d2FyZVxcTWljcm9zb2Z0XFxXaW5kb3dzXFxDdXJyZW50VmVyc2lvblxcVW5pbnN0YWxsIjsKKyAgICAgICAgICAgICAgICBIS0VZIGhLZXk7CisgICAgICAgICAgICAgICAgRFdPUkQgcmVzdWx0OworICAgICAgICAgICAgICAgIHN0YXRpYyBjaGFyIEtleU5hbWVbXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAiU29mdHdhcmVcXE1pY3Jvc29mdFxcV2luZG93c1xcQ3VycmVudFZlcnNpb25cXFVuaW5zdGFsbCI7CiAKLQkJcmVzdWx0ID0gUmVnT3BlbktleUV4KEhLRVlfTE9DQUxfTUFDSElORSwKLQkJCQkJICBLZXlOYW1lLAotCQkJCQkgIDAsCi0JCQkJCSAgS0VZX0NSRUFURV9TVUJfS0VZLAotCQkJCQkgICZoS2V5KTsKLQkJaWYgKHJlc3VsdD09MCkKLQkJCVJlZ0Nsb3NlS2V5KGhLZXkpOwotCQlyZXR1cm4gcmVzdWx0PT0wOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IFJlZ09wZW5LZXlFeChIS0VZX0xPQ0FMX01BQ0hJTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtFWV9DUkVBVEVfU1VCX0tFWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoS2V5KTsKKyAgICAgICAgICAgICAgICBpZiAocmVzdWx0PT0wKQorICAgICAgICAgICAgICAgICAgICAgICAgUmVnQ2xvc2VLZXkoaEtleSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdD09MDsKIH0KIAogLy8gQ2hlY2sgdGhlIHJvb3QgcmVnaXN0cnkga2V5IHRvIHVzZSAtIGVpdGhlciBIS0xNIG9yIEhLQ1UuCkBAIC0xNTA3LDg2ICsxNTA3LDg2IEBACiAvLyBXZSBhc3N1bWUgaGtleV9yb290IGlzIGFscmVhZHkgc2V0IHRvIHdoZXJlIFB5dGhvbiBpdHNlbGYgaXMgaW5zdGFsbGVkLgogdm9pZCBDaGVja1Jvb3RLZXkoSFdORCBod25kKQogewotCWlmIChoa2V5X3Jvb3Q9PUhLRVlfQ1VSUkVOVF9VU0VSKSB7Ci0JCTsgLy8gYXMgYWJvdmUsIGFsd2F5cyBpbnN0YWxsIG91cnNlbGYgaW4gSEtDVSB0b28uCi0JfSBlbHNlIGlmIChoa2V5X3Jvb3Q9PUhLRVlfTE9DQUxfTUFDSElORSkgewotCQkvLyBQeXRob24gaW4gSEtMTSwgYnV0IHdlIG1heSBvciBtYXkgbm90IGhhdmUgcGVybWlzc2lvbnMgdGhlcmUuCi0JCS8vIE9wZW4gdGhlIHVuaW5zdGFsbCBrZXkgd2l0aCAnY3JlYXRlJyBwZXJtaXNzaW9ucyAtIGlmIHRoaXMgZmFpbHMsCi0JCS8vIHdlIGRvbid0IGhhdmUgcGVybWlzc2lvbi4KLQkJaWYgKCFIYXNMb2NhbE1hY2hpbmVQcml2cygpKQotCQkJaGtleV9yb290ID0gSEtFWV9DVVJSRU5UX1VTRVI7Ci0JfSBlbHNlIHsKLQkJTWVzc2FnZUJveChod25kLCAiRG9uJ3Qga25vdyBQeXRob24ncyBpbnN0YWxsYXRpb24gdHlwZSIsCi0JCQkJICAgIlN0cmFuZ2UiLCBNQl9PSyB8IE1CX0lDT05TVE9QKTsKLQkJLyogRGVmYXVsdCB0byB3aGVyZXZlciB0aGV5IGNhbiwgYnV0IHByZWZlcnJpbmcgSEtMTSAqLwotCQloa2V5X3Jvb3QgPSBIYXNMb2NhbE1hY2hpbmVQcml2cygpID8gSEtFWV9MT0NBTF9NQUNISU5FIDogSEtFWV9DVVJSRU5UX1VTRVI7Ci0JfQorICAgIGlmIChoa2V5X3Jvb3Q9PUhLRVlfQ1VSUkVOVF9VU0VSKSB7CisgICAgICAgIDsgLy8gYXMgYWJvdmUsIGFsd2F5cyBpbnN0YWxsIG91cnNlbGYgaW4gSEtDVSB0b28uCisgICAgfSBlbHNlIGlmIChoa2V5X3Jvb3Q9PUhLRVlfTE9DQUxfTUFDSElORSkgeworICAgICAgICAvLyBQeXRob24gaW4gSEtMTSwgYnV0IHdlIG1heSBvciBtYXkgbm90IGhhdmUgcGVybWlzc2lvbnMgdGhlcmUuCisgICAgICAgIC8vIE9wZW4gdGhlIHVuaW5zdGFsbCBrZXkgd2l0aCAnY3JlYXRlJyBwZXJtaXNzaW9ucyAtIGlmIHRoaXMgZmFpbHMsCisgICAgICAgIC8vIHdlIGRvbid0IGhhdmUgcGVybWlzc2lvbi4KKyAgICAgICAgaWYgKCFIYXNMb2NhbE1hY2hpbmVQcml2cygpKQorICAgICAgICAgICAgaGtleV9yb290ID0gSEtFWV9DVVJSRU5UX1VTRVI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTWVzc2FnZUJveChod25kLCAiRG9uJ3Qga25vdyBQeXRob24ncyBpbnN0YWxsYXRpb24gdHlwZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3RyYW5nZSIsIE1CX09LIHwgTUJfSUNPTlNUT1ApOworICAgICAgICAvKiBEZWZhdWx0IHRvIHdoZXJldmVyIHRoZXkgY2FuLCBidXQgcHJlZmVycmluZyBIS0xNICovCisgICAgICAgIGhrZXlfcm9vdCA9IEhhc0xvY2FsTWFjaGluZVByaXZzKCkgPyBIS0VZX0xPQ0FMX01BQ0hJTkUgOiBIS0VZX0NVUlJFTlRfVVNFUjsKKyAgICB9CiB9CiAKIC8qIFJldHVybiB0aGUgaW5zdGFsbGF0aW9uIHNjaGVtZSBkZXBlbmRpbmcgb24gUHl0aG9uIHZlcnNpb24gbnVtYmVyICovCiBTQ0hFTUUgKkdldFNjaGVtZShpbnQgbWFqb3IsIGludCBtaW5vcikKIHsKLQlpZiAobWFqb3IgPiAyKQotCQlyZXR1cm4gbmV3X3NjaGVtZTsKLQllbHNlIGlmKChtYWpvciA9PSAyKSAmJiAobWlub3IgPj0gMikpCi0JCXJldHVybiBuZXdfc2NoZW1lOwotCXJldHVybiBvbGRfc2NoZW1lOworICAgIGlmIChtYWpvciA+IDIpCisgICAgICAgIHJldHVybiBuZXdfc2NoZW1lOworICAgIGVsc2UgaWYoKG1ham9yID09IDIpICYmIChtaW5vciA+PSAyKSkKKyAgICAgICAgcmV0dXJuIG5ld19zY2hlbWU7CisgICAgcmV0dXJuIG9sZF9zY2hlbWU7CiB9CiAKIEJPT0wgQ0FMTEJBQ0sKIFNlbGVjdFB5dGhvbkRsZ1Byb2MoSFdORCBod25kLCBVSU5UIG1zZywgV1BBUkFNIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKIHsKLQlMUE5NSERSIGxwbm07CisgICAgTFBOTUhEUiBscG5tOwogCi0Jc3dpdGNoIChtc2cpIHsKLQljYXNlIFdNX0lOSVRESUFMT0c6Ci0JCWlmIChoQml0bWFwKQotCQkJU2VuZERsZ0l0ZW1NZXNzYWdlKGh3bmQsIElEQ19CSVRNQVAsIFNUTV9TRVRJTUFHRSwKLQkJCQkJICAgSU1BR0VfQklUTUFQLCAoTFBBUkFNKWhCaXRtYXApOwotCQlHZXRQeXRob25WZXJzaW9ucyhHZXREbGdJdGVtKGh3bmQsIElEQ19WRVJTSU9OU19MSVNUKSwKLQkJCQkgICBIS0VZX0xPQ0FMX01BQ0hJTkUsIHRhcmdldF92ZXJzaW9uKTsKLQkJR2V0UHl0aG9uVmVyc2lvbnMoR2V0RGxnSXRlbShod25kLCBJRENfVkVSU0lPTlNfTElTVCksCi0JCQkJICAgSEtFWV9DVVJSRU5UX1VTRVIsIHRhcmdldF92ZXJzaW9uKTsKLQkJewkvKiBzZWxlY3QgdGhlIGxhc3QgZW50cnkgd2hpY2ggaXMgdGhlIGhpZ2hlc3QgcHl0aG9uCi0JCQkgICB2ZXJzaW9uIGZvdW5kICovCi0JCQlpbnQgY291bnQ7Ci0JCQljb3VudCA9IFNlbmREbGdJdGVtTWVzc2FnZShod25kLCBJRENfVkVSU0lPTlNfTElTVCwKLQkJCQkJCSAgICBMQl9HRVRDT1VOVCwgMCwgMCk7Ci0JCQlpZiAoY291bnQgJiYgY291bnQgIT0gTEJfRVJSKQotCQkJCVNlbmREbGdJdGVtTWVzc2FnZShod25kLCBJRENfVkVSU0lPTlNfTElTVCwgTEJfU0VUQ1VSU0VMLAotCQkJCQkJICAgIGNvdW50LTEsIDApOwotCSAgICAKLQkJCS8qIElmIGEgc3BlY2lmaWMgUHl0aG9uIHZlcnNpb24gaXMgcmVxdWlyZWQsCi0JCQkgKiBkaXNwbGF5IGEgcHJvbWluZW50IG5vdGljZSBzaG93aW5nIHRoaXMgZmFjdC4KLQkJCSAqLwotCQkJaWYgKHRhcmdldF92ZXJzaW9uICYmIHRhcmdldF92ZXJzaW9uWzBdKSB7Ci0JCQkJY2hhciBidWZmZXJbNDA5Nl07Ci0JCQkJd3NwcmludGYoYnVmZmVyLAotCQkJCQkgIlB5dGhvbiAlcyBpcyByZXF1aXJlZCBmb3IgdGhpcyBwYWNrYWdlLiAiCi0JCQkJCSAiU2VsZWN0IGluc3RhbGxhdGlvbiB0byB1c2U6IiwKLQkJCQkJIHRhcmdldF92ZXJzaW9uKTsKLQkJCQlTZXREbGdJdGVtVGV4dChod25kLCBJRENfVElUTEUsIGJ1ZmZlcik7Ci0JCQl9CisgICAgc3dpdGNoIChtc2cpIHsKKyAgICBjYXNlIFdNX0lOSVRESUFMT0c6CisgICAgICAgIGlmIChoQml0bWFwKQorICAgICAgICAgICAgU2VuZERsZ0l0ZW1NZXNzYWdlKGh3bmQsIElEQ19CSVRNQVAsIFNUTV9TRVRJTUFHRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTUFHRV9CSVRNQVAsIChMUEFSQU0paEJpdG1hcCk7CisgICAgICAgIEdldFB5dGhvblZlcnNpb25zKEdldERsZ0l0ZW0oaHduZCwgSURDX1ZFUlNJT05TX0xJU1QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSEtFWV9MT0NBTF9NQUNISU5FLCB0YXJnZXRfdmVyc2lvbik7CisgICAgICAgIEdldFB5dGhvblZlcnNpb25zKEdldERsZ0l0ZW0oaHduZCwgSURDX1ZFUlNJT05TX0xJU1QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSEtFWV9DVVJSRU5UX1VTRVIsIHRhcmdldF92ZXJzaW9uKTsKKyAgICAgICAgeyAgICAgICAgICAgICAgIC8qIHNlbGVjdCB0aGUgbGFzdCBlbnRyeSB3aGljaCBpcyB0aGUgaGlnaGVzdCBweXRob24KKyAgICAgICAgICAgICAgICAgICB2ZXJzaW9uIGZvdW5kICovCisgICAgICAgICAgICBpbnQgY291bnQ7CisgICAgICAgICAgICBjb3VudCA9IFNlbmREbGdJdGVtTWVzc2FnZShod25kLCBJRENfVkVSU0lPTlNfTElTVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMQl9HRVRDT1VOVCwgMCwgMCk7CisgICAgICAgICAgICBpZiAoY291bnQgJiYgY291bnQgIT0gTEJfRVJSKQorICAgICAgICAgICAgICAgIFNlbmREbGdJdGVtTWVzc2FnZShod25kLCBJRENfVkVSU0lPTlNfTElTVCwgTEJfU0VUQ1VSU0VMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQtMSwgMCk7CiAKLQkJCWlmIChjb3VudCA9PSAwKSB7Ci0JCQkJY2hhciBCdWZmZXJbNDA5Nl07Ci0JCQkJY2hhciAqbXNnOwotCQkJCWlmICh0YXJnZXRfdmVyc2lvbiAmJiB0YXJnZXRfdmVyc2lvblswXSkgewotCQkJCQl3c3ByaW50ZihCdWZmZXIsCi0JCQkJCQkgIlB5dGhvbiB2ZXJzaW9uICVzIHJlcXVpcmVkLCB3aGljaCB3YXMgbm90IGZvdW5kIgotCQkJCQkJICIgaW4gdGhlIHJlZ2lzdHJ5LiIsIHRhcmdldF92ZXJzaW9uKTsKLQkJCQkJbXNnID0gQnVmZmVyOwotCQkJCX0gZWxzZQotCQkJCQltc2cgPSAiTm8gUHl0aG9uIGluc3RhbGxhdGlvbiBmb3VuZCBpbiB0aGUgcmVnaXN0cnkuIjsKLQkJCQlNZXNzYWdlQm94KGh3bmQsIG1zZywgIkNhbm5vdCBpbnN0YWxsIiwKLQkJCQkJICAgTUJfT0sgfCBNQl9JQ09OU1RPUCk7Ci0JCQl9Ci0JCX0KLQkJZ290byBVcGRhdGVJbnN0YWxsRGlyOwotCQlicmVhazsKKyAgICAgICAgICAgIC8qIElmIGEgc3BlY2lmaWMgUHl0aG9uIHZlcnNpb24gaXMgcmVxdWlyZWQsCisgICAgICAgICAgICAgKiBkaXNwbGF5IGEgcHJvbWluZW50IG5vdGljZSBzaG93aW5nIHRoaXMgZmFjdC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKHRhcmdldF92ZXJzaW9uICYmIHRhcmdldF92ZXJzaW9uWzBdKSB7CisgICAgICAgICAgICAgICAgY2hhciBidWZmZXJbNDA5Nl07CisgICAgICAgICAgICAgICAgd3NwcmludGYoYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICJQeXRob24gJXMgaXMgcmVxdWlyZWQgZm9yIHRoaXMgcGFja2FnZS4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICJTZWxlY3QgaW5zdGFsbGF0aW9uIHRvIHVzZToiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF92ZXJzaW9uKTsKKyAgICAgICAgICAgICAgICBTZXREbGdJdGVtVGV4dChod25kLCBJRENfVElUTEUsIGJ1ZmZlcik7CisgICAgICAgICAgICB9CiAKLQljYXNlIFdNX0NPTU1BTkQ6Ci0JCXN3aXRjaCAoTE9XT1JEKHdQYXJhbSkpIHsKKyAgICAgICAgICAgIGlmIChjb3VudCA9PSAwKSB7CisgICAgICAgICAgICAgICAgY2hhciBCdWZmZXJbNDA5Nl07CisgICAgICAgICAgICAgICAgY2hhciAqbXNnOworICAgICAgICAgICAgICAgIGlmICh0YXJnZXRfdmVyc2lvbiAmJiB0YXJnZXRfdmVyc2lvblswXSkgeworICAgICAgICAgICAgICAgICAgICB3c3ByaW50ZihCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQeXRob24gdmVyc2lvbiAlcyByZXF1aXJlZCwgd2hpY2ggd2FzIG5vdCBmb3VuZCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBpbiB0aGUgcmVnaXN0cnkuIiwgdGFyZ2V0X3ZlcnNpb24pOworICAgICAgICAgICAgICAgICAgICBtc2cgPSBCdWZmZXI7CisgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgIG1zZyA9ICJObyBQeXRob24gaW5zdGFsbGF0aW9uIGZvdW5kIGluIHRoZSByZWdpc3RyeS4iOworICAgICAgICAgICAgICAgIE1lc3NhZ2VCb3goaHduZCwgbXNnLCAiQ2Fubm90IGluc3RhbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTUJfT0sgfCBNQl9JQ09OU1RPUCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZ290byBVcGRhdGVJbnN0YWxsRGlyOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgV01fQ09NTUFORDoKKyAgICAgICAgc3dpdGNoIChMT1dPUkQod1BhcmFtKSkgewogLyoKICAgY2FzZSBJRENfT1RIRVJQWVRIT046CiAgIGlmIChHZXRPdGhlclB5dGhvblZlcnNpb24oR2V0RGxnSXRlbShod25kLCBJRENfVkVSU0lPTlNfTElTVCksCkBAIC0xNTk0LDMwNyArMTU5NCwzMDcgQEAKICAgZ290byBVcGRhdGVJbnN0YWxsRGlyOwogICBicmVhazsKICovCi0JCWNhc2UgSURDX1ZFUlNJT05TX0xJU1Q6Ci0JCQlzd2l0Y2ggKEhJV09SRCh3UGFyYW0pKSB7Ci0JCQkJaW50IGlkOwotCQkJY2FzZSBMQk5fU0VMQ0hBTkdFOgotCQkJICBVcGRhdGVJbnN0YWxsRGlyOgotCQkJCVByb3BTaGVldF9TZXRXaXpCdXR0b25zKEdldFBhcmVudChod25kKSwKLQkJCQkJCQlQU1dJWkJfQkFDSyB8IFBTV0laQl9ORVhUKTsKLQkJCQlpZCA9IFNlbmREbGdJdGVtTWVzc2FnZShod25kLCBJRENfVkVSU0lPTlNfTElTVCwKLQkJCQkJCQkgTEJfR0VUQ1VSU0VMLCAwLCAwKTsKLQkJCQlpZiAoaWQgPT0gTEJfRVJSKSB7Ci0JCQkJCVByb3BTaGVldF9TZXRXaXpCdXR0b25zKEdldFBhcmVudChod25kKSwKLQkJCQkJCQkJUFNXSVpCX0JBQ0spOwotCQkJCQlTZXREbGdJdGVtVGV4dChod25kLCBJRENfUEFUSCwgIiIpOwotCQkJCQlTZXREbGdJdGVtVGV4dChod25kLCBJRENfSU5TVEFMTF9QQVRILCAiIik7Ci0JCQkJCXN0cmNweShweXRob25fZGlyLCAiIik7Ci0JCQkJCXN0cmNweShweXRob25kbGwsICIiKTsKLQkJCQl9IGVsc2UgewotCQkJCQljaGFyICpwYnVmOwotCQkJCQlpbnQgcmVzdWx0OwotCQkJCQlJbnN0YWxsZWRWZXJzaW9uSW5mbyAqaXZpOwotCQkJCQlQcm9wU2hlZXRfU2V0V2l6QnV0dG9ucyhHZXRQYXJlbnQoaHduZCksCi0JCQkJCQkJCVBTV0laQl9CQUNLIHwgUFNXSVpCX05FWFQpOwotCQkJCQkvKiBHZXQgdGhlIHB5dGhvbiBkaXJlY3RvcnkgKi8KLSAgICAgICAgICAgICAgICAgICAgaXZpID0gKEluc3RhbGxlZFZlcnNpb25JbmZvICopCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbmREbGdJdGVtTWVzc2FnZShod25kLAotCQkJCQkJCQkJSURDX1ZFUlNJT05TX0xJU1QsCi0JCQkJCQkJCQlMQl9HRVRJVEVNREFUQSwKLQkJCQkJCQkJCWlkLAotCQkJCQkJCQkJMCk7Ci0gICAgICAgICAgICAgICAgICAgIGhrZXlfcm9vdCA9IGl2aS0+aGtleTsKLQkJCQkJc3RyY3B5KHB5dGhvbl9kaXIsIGl2aS0+cHJlZml4KTsKLQkJCQkJU2V0RGxnSXRlbVRleHQoaHduZCwgSURDX1BBVEgsIHB5dGhvbl9kaXIpOwotCQkJCQkvKiByZXRyaWV2ZSB0aGUgcHl0aG9uIHZlcnNpb24gYW5kIHB5dGhvbmRsbCB0byB1c2UgKi8KLQkJCQkJcmVzdWx0ID0gU2VuZERsZ0l0ZW1NZXNzYWdlKGh3bmQsIElEQ19WRVJTSU9OU19MSVNULAotCQkJCQkJCQkgICAgIExCX0dFVFRFWFRMRU4sIChXUEFSQU0paWQsIDApOwotCQkJCQlwYnVmID0gKGNoYXIgKiltYWxsb2MocmVzdWx0ICsgMSk7Ci0JCQkJCWlmIChwYnVmKSB7Ci0JCQkJCQkvKiBndWVzcyB0aGUgbmFtZSBvZiB0aGUgcHl0aG9uLWRsbCAqLwotCQkJCQkJU2VuZERsZ0l0ZW1NZXNzYWdlKGh3bmQsIElEQ19WRVJTSU9OU19MSVNULAotCQkJCQkJCQkgICAgTEJfR0VUVEVYVCwgKFdQQVJBTSlpZCwKLQkJCQkJCQkJICAgIChMUEFSQU0pcGJ1Zik7Ci0JCQkJCQlyZXN1bHQgPSBzc2NhbmYocGJ1ZiwgIlB5dGhvbiBWZXJzaW9uICVkLiVkIiwKLQkJCQkJCQkJICZweV9tYWpvciwgJnB5X21pbm9yKTsKLQkJCQkJCWlmIChyZXN1bHQgPT0gMikgeworICAgICAgICBjYXNlIElEQ19WRVJTSU9OU19MSVNUOgorICAgICAgICAgICAgc3dpdGNoIChISVdPUkQod1BhcmFtKSkgeworICAgICAgICAgICAgICAgIGludCBpZDsKKyAgICAgICAgICAgIGNhc2UgTEJOX1NFTENIQU5HRToKKyAgICAgICAgICAgICAgVXBkYXRlSW5zdGFsbERpcjoKKyAgICAgICAgICAgICAgICBQcm9wU2hlZXRfU2V0V2l6QnV0dG9ucyhHZXRQYXJlbnQoaHduZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNXSVpCX0JBQ0sgfCBQU1dJWkJfTkVYVCk7CisgICAgICAgICAgICAgICAgaWQgPSBTZW5kRGxnSXRlbU1lc3NhZ2UoaHduZCwgSURDX1ZFUlNJT05TX0xJU1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExCX0dFVENVUlNFTCwgMCwgMCk7CisgICAgICAgICAgICAgICAgaWYgKGlkID09IExCX0VSUikgeworICAgICAgICAgICAgICAgICAgICBQcm9wU2hlZXRfU2V0V2l6QnV0dG9ucyhHZXRQYXJlbnQoaHduZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTV0laQl9CQUNLKTsKKyAgICAgICAgICAgICAgICAgICAgU2V0RGxnSXRlbVRleHQoaHduZCwgSURDX1BBVEgsICIiKTsKKyAgICAgICAgICAgICAgICAgICAgU2V0RGxnSXRlbVRleHQoaHduZCwgSURDX0lOU1RBTExfUEFUSCwgIiIpOworICAgICAgICAgICAgICAgICAgICBzdHJjcHkocHl0aG9uX2RpciwgIiIpOworICAgICAgICAgICAgICAgICAgICBzdHJjcHkocHl0aG9uZGxsLCAiIik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhciAqcGJ1ZjsKKyAgICAgICAgICAgICAgICAgICAgaW50IHJlc3VsdDsKKyAgICAgICAgICAgICAgICAgICAgSW5zdGFsbGVkVmVyc2lvbkluZm8gKml2aTsKKyAgICAgICAgICAgICAgICAgICAgUHJvcFNoZWV0X1NldFdpekJ1dHRvbnMoR2V0UGFyZW50KGh3bmQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1dJWkJfQkFDSyB8IFBTV0laQl9ORVhUKTsKKyAgICAgICAgICAgICAgICAgICAgLyogR2V0IHRoZSBweXRob24gZGlyZWN0b3J5ICovCisgICAgICAgICAgICBpdmkgPSAoSW5zdGFsbGVkVmVyc2lvbkluZm8gKikKKyAgICAgICAgICAgICAgICAgICAgICAgIFNlbmREbGdJdGVtTWVzc2FnZShod25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEQ19WRVJTSU9OU19MSVNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExCX0dFVElURU1EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworICAgICAgICAgICAgaGtleV9yb290ID0gaXZpLT5oa2V5OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJjcHkocHl0aG9uX2RpciwgaXZpLT5wcmVmaXgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXREbGdJdGVtVGV4dChod25kLCBJRENfUEFUSCwgcHl0aG9uX2Rpcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJldHJpZXZlIHRoZSBweXRob24gdmVyc2lvbiBhbmQgcHl0aG9uZGxsIHRvIHVzZSAqLworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBTZW5kRGxnSXRlbU1lc3NhZ2UoaHduZCwgSURDX1ZFUlNJT05TX0xJU1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEJfR0VUVEVYVExFTiwgKFdQQVJBTSlpZCwgMCk7CisgICAgICAgICAgICAgICAgICAgIHBidWYgPSAoY2hhciAqKW1hbGxvYyhyZXN1bHQgKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBidWYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGd1ZXNzIHRoZSBuYW1lIG9mIHRoZSBweXRob24tZGxsICovCisgICAgICAgICAgICAgICAgICAgICAgICBTZW5kRGxnSXRlbU1lc3NhZ2UoaHduZCwgSURDX1ZFUlNJT05TX0xJU1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExCX0dFVFRFWFQsIChXUEFSQU0paWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMUEFSQU0pcGJ1Zik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBzc2NhbmYocGJ1ZiwgIlB5dGhvbiBWZXJzaW9uICVkLiVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnB5X21ham9yLCAmcHlfbWlub3IpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSAyKSB7CiAjaWZkZWYgX0RFQlVHCi0JCQkJCQkJd3NwcmludGYocHl0aG9uZGxsLCAicHl0aG9uJWQlZF9kLmRsbCIsCi0JCQkJCQkJCSBweV9tYWpvciwgcHlfbWlub3IpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzcHJpbnRmKHB5dGhvbmRsbCwgInB5dGhvbiVkJWRfZC5kbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB5X21ham9yLCBweV9taW5vcik7CiAjZWxzZQotCQkJCQkJCXdzcHJpbnRmKHB5dGhvbmRsbCwgInB5dGhvbiVkJWQuZGxsIiwKLQkJCQkJCQkJIHB5X21ham9yLCBweV9taW5vcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NwcmludGYocHl0aG9uZGxsLCAicHl0aG9uJWQlZC5kbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB5X21ham9yLCBweV9taW5vcik7CiAjZW5kaWYKLQkJCQkJCX0KLQkJCQkJCWZyZWUocGJ1Zik7Ci0JCQkJCX0gZWxzZQotCQkJCQkJc3RyY3B5KHB5dGhvbmRsbCwgIiIpOwotCQkJCQkvKiByZXRyaWV2ZSB0aGUgc2NoZW1lIGZvciB0aGlzIHZlcnNpb24gKi8KLQkJCQkJewotCQkJCQkJY2hhciBpbnN0YWxsX3BhdGhbX01BWF9QQVRIXTsKLQkJCQkJCVNDSEVNRSAqc2NoZW1lID0gR2V0U2NoZW1lKHB5X21ham9yLCBweV9taW5vcik7Ci0JCQkJCQlzdHJjcHkoaW5zdGFsbF9wYXRoLCBweXRob25fZGlyKTsKLQkJCQkJCWlmIChpbnN0YWxsX3BhdGhbc3RybGVuKGluc3RhbGxfcGF0aCktMV0gIT0gJ1xcJykKLQkJCQkJCQlzdHJjYXQoaW5zdGFsbF9wYXRoLCAiXFwiKTsKLQkJCQkJCXN0cmNhdChpbnN0YWxsX3BhdGgsIHNjaGVtZVswXS5wcmVmaXgpOwotCQkJCQkJU2V0RGxnSXRlbVRleHQoaHduZCwgSURDX0lOU1RBTExfUEFUSCwgaW5zdGFsbF9wYXRoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0JCXJldHVybiAwOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShwYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJjcHkocHl0aG9uZGxsLCAiIik7CisgICAgICAgICAgICAgICAgICAgIC8qIHJldHJpZXZlIHRoZSBzY2hlbWUgZm9yIHRoaXMgdmVyc2lvbiAqLworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGluc3RhbGxfcGF0aFtfTUFYX1BBVEhdOworICAgICAgICAgICAgICAgICAgICAgICAgU0NIRU1FICpzY2hlbWUgPSBHZXRTY2hlbWUocHlfbWFqb3IsIHB5X21pbm9yKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmNweShpbnN0YWxsX3BhdGgsIHB5dGhvbl9kaXIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluc3RhbGxfcGF0aFtzdHJsZW4oaW5zdGFsbF9wYXRoKS0xXSAhPSAnXFwnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmNhdChpbnN0YWxsX3BhdGgsICJcXCIpOworICAgICAgICAgICAgICAgICAgICAgICAgc3RyY2F0KGluc3RhbGxfcGF0aCwgc2NoZW1lWzBdLnByZWZpeCk7CisgICAgICAgICAgICAgICAgICAgICAgICBTZXREbGdJdGVtVGV4dChod25kLCBJRENfSU5TVEFMTF9QQVRILCBpbnN0YWxsX3BhdGgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CiAKLQljYXNlIFdNX05PVElGWToKLQkJbHBubSA9IChMUE5NSERSKSBsUGFyYW07CisgICAgY2FzZSBXTV9OT1RJRlk6CisgICAgICAgIGxwbm0gPSAoTFBOTUhEUikgbFBhcmFtOwogCi0JCXN3aXRjaCAobHBubS0+Y29kZSkgewotCQkJaW50IGlkOwotCQljYXNlIFBTTl9TRVRBQ1RJVkU6Ci0JCQlpZCA9IFNlbmREbGdJdGVtTWVzc2FnZShod25kLCBJRENfVkVSU0lPTlNfTElTVCwKLQkJCQkJCSBMQl9HRVRDVVJTRUwsIDAsIDApOwotCQkJaWYgKGlkID09IExCX0VSUikKLQkJCQlQcm9wU2hlZXRfU2V0V2l6QnV0dG9ucyhHZXRQYXJlbnQoaHduZCksCi0JCQkJCQkJUFNXSVpCX0JBQ0spOwotCQkJZWxzZQotCQkJCVByb3BTaGVldF9TZXRXaXpCdXR0b25zKEdldFBhcmVudChod25kKSwKLQkJCQkJCQlQU1dJWkJfQkFDSyB8IFBTV0laQl9ORVhUKTsKLQkJCWJyZWFrOworICAgICAgICBzd2l0Y2ggKGxwbm0tPmNvZGUpIHsKKyAgICAgICAgICAgIGludCBpZDsKKyAgICAgICAgY2FzZSBQU05fU0VUQUNUSVZFOgorICAgICAgICAgICAgaWQgPSBTZW5kRGxnSXRlbU1lc3NhZ2UoaHduZCwgSURDX1ZFUlNJT05TX0xJU1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEJfR0VUQ1VSU0VMLCAwLCAwKTsKKyAgICAgICAgICAgIGlmIChpZCA9PSBMQl9FUlIpCisgICAgICAgICAgICAgICAgUHJvcFNoZWV0X1NldFdpekJ1dHRvbnMoR2V0UGFyZW50KGh3bmQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTV0laQl9CQUNLKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBQcm9wU2hlZXRfU2V0V2l6QnV0dG9ucyhHZXRQYXJlbnQoaHduZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNXSVpCX0JBQ0sgfCBQU1dJWkJfTkVYVCk7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIFBTTl9XSVpORVhUOgotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgUFNOX1dJWk5FWFQ6CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIFBTTl9XSVpGSU5JU0g6Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBQU05fV0laRklOSVNIOgorICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBQU05fUkVTRVQ6Ci0JCQlicmVhazsKLQkJCi0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQkJfQotCX0KLQlyZXR1cm4gMDsKKyAgICAgICAgY2FzZSBQU05fUkVTRVQ6CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBCT09MIE9wZW5Mb2dmaWxlKGNoYXIgKmRpcikKIHsKLQljaGFyIGJ1ZmZlcltfTUFYX1BBVEgrMV07Ci0JdGltZV90IGx0aW1lOwotCXN0cnVjdCB0bSAqbm93OwotCWxvbmcgcmVzdWx0OwotCUhLRVkgaEtleSwgaFN1YmtleTsKLQljaGFyIHN1YmtleV9uYW1lWzI1Nl07Ci0Jc3RhdGljIGNoYXIgS2V5TmFtZVtdID0gCi0JCSJTb2Z0d2FyZVxcTWljcm9zb2Z0XFxXaW5kb3dzXFxDdXJyZW50VmVyc2lvblxcVW5pbnN0YWxsIjsKLQljb25zdCBjaGFyICpyb290X25hbWUgPSAoaGtleV9yb290PT1IS0VZX0xPQ0FMX01BQ0hJTkUgPwotCSAgICAgICAgICAgICAgICAgICAgICAgICJIS0VZX0xPQ0FMX01BQ0hJTkUiIDogIkhLRVlfQ1VSUkVOVF9VU0VSIik7Ci0JRFdPUkQgZGlzcG9zaXRpb247CisgICAgY2hhciBidWZmZXJbX01BWF9QQVRIKzFdOworICAgIHRpbWVfdCBsdGltZTsKKyAgICBzdHJ1Y3QgdG0gKm5vdzsKKyAgICBsb25nIHJlc3VsdDsKKyAgICBIS0VZIGhLZXksIGhTdWJrZXk7CisgICAgY2hhciBzdWJrZXlfbmFtZVsyNTZdOworICAgIHN0YXRpYyBjaGFyIEtleU5hbWVbXSA9CisgICAgICAgICJTb2Z0d2FyZVxcTWljcm9zb2Z0XFxXaW5kb3dzXFxDdXJyZW50VmVyc2lvblxcVW5pbnN0YWxsIjsKKyAgICBjb25zdCBjaGFyICpyb290X25hbWUgPSAoaGtleV9yb290PT1IS0VZX0xPQ0FMX01BQ0hJTkUgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIS0VZX0xPQ0FMX01BQ0hJTkUiIDogIkhLRVlfQ1VSUkVOVF9VU0VSIik7CisgICAgRFdPUkQgZGlzcG9zaXRpb247CiAKLQkvKiBVc2UgQ3JlYXRlLCBhcyB0aGUgVW5pbnN0YWxsIHN1YmtleSBtYXkgbm90IGV4aXN0IHVuZGVyIEhLQ1UuCi0JICAgVXNlIENyZWF0ZUtleUV4LCBzbyB3ZSBjYW4gc3BlY2lmeSBhIFNBTSBzcGVjaWZ5aW5nIHdyaXRlIGFjY2VzcwotCSovCi0JCXJlc3VsdCA9IFJlZ0NyZWF0ZUtleUV4KGhrZXlfcm9vdCwKLQkJCSAgICAgIEtleU5hbWUsCi0JCQkgICAgICAwLCAvKiByZXNlcnZlZCAqLwotCQkJICAgICAgTlVMTCwgLyogY2xhc3MgKi8KLQkJCSAgICAgIDAsIC8qIG9wdGlvbnMgKi8KLQkJCSAgICAgIEtFWV9DUkVBVEVfU1VCX0tFWSwgLyogc2FtICovCi0JCQkgICAgICBOVUxMLCAvKiBzZWN1cml0eSAqLwotCQkJICAgICAgJmhLZXksIC8qIHJlc3VsdCBrZXkgKi8KLQkJCSAgICAgIE5VTEwpOyAvKiBkaXNwb3NpdGlvbiAqLwotCWlmIChyZXN1bHQgIT0gRVJST1JfU1VDQ0VTUykgewotCQlpZiAocmVzdWx0ID09IEVSUk9SX0FDQ0VTU19ERU5JRUQpIHsKLQkJCS8qIFRoaXMgc2hvdWxkIG5vIGxvbmdlciBiZSBhYmxlIHRvIGhhcHBlbiAtIHdlIGhhdmUgYWxyZWFkeQotCQkJICAgY2hlY2tlZCBpZiB0aGV5IGhhdmUgcGVybWlzc2lvbnMgaW4gSEtMTSwgYW5kIGFsbCB1c2VycwotCQkJICAgc2hvdWxkIGhhdmUgd3JpdGUgYWNjZXNzIHRvIEhLQ1UuCi0JCQkqLwotCQkJTWVzc2FnZUJveChHZXRGb2N1cygpLAotCQkJCSAgICJZb3UgZG8gbm90IHNlZW0gdG8gaGF2ZSBzdWZmaWNpZW50IGFjY2VzcyByaWdodHNcbiIKLQkJCQkgICAib24gdGhpcyBtYWNoaW5lIHRvIGluc3RhbGwgdGhpcyBzb2Z0d2FyZSIsCi0JCQkJICAgTlVMTCwKLQkJCQkgICBNQl9PSyB8IE1CX0lDT05TVE9QKTsKLQkJCXJldHVybiBGQUxTRTsKLQkJfSBlbHNlIHsKLQkJCU1lc3NhZ2VCb3goR2V0Rm9jdXMoKSwgS2V5TmFtZSwgIkNvdWxkIG5vdCBvcGVuIGtleSIsIE1CX09LKTsKLQkJfQotCX0KKyAgICAvKiBVc2UgQ3JlYXRlLCBhcyB0aGUgVW5pbnN0YWxsIHN1YmtleSBtYXkgbm90IGV4aXN0IHVuZGVyIEhLQ1UuCisgICAgICAgVXNlIENyZWF0ZUtleUV4LCBzbyB3ZSBjYW4gc3BlY2lmeSBhIFNBTSBzcGVjaWZ5aW5nIHdyaXRlIGFjY2VzcworICAgICovCisgICAgICAgIHJlc3VsdCA9IFJlZ0NyZWF0ZUtleUV4KGhrZXlfcm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICBLZXlOYW1lLAorICAgICAgICAgICAgICAgICAgICAgIDAsIC8qIHJlc2VydmVkICovCisgICAgICAgICAgICAgICAgICBOVUxMLCAvKiBjbGFzcyAqLworICAgICAgICAgICAgICAgICAgMCwgLyogb3B0aW9ucyAqLworICAgICAgICAgICAgICAgICAgS0VZX0NSRUFURV9TVUJfS0VZLCAvKiBzYW0gKi8KKyAgICAgICAgICAgICAgICAgIE5VTEwsIC8qIHNlY3VyaXR5ICovCisgICAgICAgICAgICAgICAgICAmaEtleSwgLyogcmVzdWx0IGtleSAqLworICAgICAgICAgICAgICAgICAgTlVMTCk7IC8qIGRpc3Bvc2l0aW9uICovCisgICAgaWYgKHJlc3VsdCAhPSBFUlJPUl9TVUNDRVNTKSB7CisgICAgICAgIGlmIChyZXN1bHQgPT0gRVJST1JfQUNDRVNTX0RFTklFRCkgeworICAgICAgICAgICAgLyogVGhpcyBzaG91bGQgbm8gbG9uZ2VyIGJlIGFibGUgdG8gaGFwcGVuIC0gd2UgaGF2ZSBhbHJlYWR5CisgICAgICAgICAgICAgICBjaGVja2VkIGlmIHRoZXkgaGF2ZSBwZXJtaXNzaW9ucyBpbiBIS0xNLCBhbmQgYWxsIHVzZXJzCisgICAgICAgICAgICAgICBzaG91bGQgaGF2ZSB3cml0ZSBhY2Nlc3MgdG8gSEtDVS4KKyAgICAgICAgICAgICovCisgICAgICAgICAgICBNZXNzYWdlQm94KEdldEZvY3VzKCksCisgICAgICAgICAgICAgICAgICAgICAgICJZb3UgZG8gbm90IHNlZW0gdG8gaGF2ZSBzdWZmaWNpZW50IGFjY2VzcyByaWdodHNcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgIm9uIHRoaXMgbWFjaGluZSB0byBpbnN0YWxsIHRoaXMgc29mdHdhcmUiLAorICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICBNQl9PSyB8IE1CX0lDT05TVE9QKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIE1lc3NhZ2VCb3goR2V0Rm9jdXMoKSwgS2V5TmFtZSwgIkNvdWxkIG5vdCBvcGVuIGtleSIsIE1CX09LKTsKKyAgICAgICAgfQorICAgIH0KIAotCXNwcmludGYoYnVmZmVyLCAiJXNcXCVzLXdpbmluc3QubG9nIiwgZGlyLCBtZXRhX25hbWUpOwotCWxvZ2ZpbGUgPSBmb3BlbihidWZmZXIsICJhIik7Ci0JdGltZSgmbHRpbWUpOwotCW5vdyA9IGxvY2FsdGltZSgmbHRpbWUpOwotCXN0cmZ0aW1lKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksCi0JCSAiKioqIEluc3RhbGxhdGlvbiBzdGFydGVkICVZLyVtLyVkICVIOiVNICoqKlxuIiwKLQkJIGxvY2FsdGltZSgmbHRpbWUpKTsKLQlmcHJpbnRmKGxvZ2ZpbGUsIGJ1ZmZlcik7Ci0JZnByaW50Zihsb2dmaWxlLCAiU291cmNlOiAlc1xuIiwgbW9kdWxlbmFtZSk7CisgICAgc3ByaW50ZihidWZmZXIsICIlc1xcJXMtd2luaW5zdC5sb2ciLCBkaXIsIG1ldGFfbmFtZSk7CisgICAgbG9nZmlsZSA9IGZvcGVuKGJ1ZmZlciwgImEiKTsKKyAgICB0aW1lKCZsdGltZSk7CisgICAgbm93ID0gbG9jYWx0aW1lKCZsdGltZSk7CisgICAgc3RyZnRpbWUoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwKKyAgICAgICAgICAgICAiKioqIEluc3RhbGxhdGlvbiBzdGFydGVkICVZLyVtLyVkICVIOiVNICoqKlxuIiwKKyAgICAgICAgICAgICBsb2NhbHRpbWUoJmx0aW1lKSk7CisgICAgZnByaW50Zihsb2dmaWxlLCBidWZmZXIpOworICAgIGZwcmludGYobG9nZmlsZSwgIlNvdXJjZTogJXNcbiIsIG1vZHVsZW5hbWUpOwogCi0JLyogUm9vdCBrZXkgbXVzdCBiZSBmaXJzdCBlbnRyeSBwcm9jZXNzZWQgYnkgdW5pbnN0YWxsZXIuICovCi0JZnByaW50Zihsb2dmaWxlLCAiOTk5IFJvb3QgS2V5OiAlc1xuIiwgcm9vdF9uYW1lKTsKKyAgICAvKiBSb290IGtleSBtdXN0IGJlIGZpcnN0IGVudHJ5IHByb2Nlc3NlZCBieSB1bmluc3RhbGxlci4gKi8KKyAgICBmcHJpbnRmKGxvZ2ZpbGUsICI5OTkgUm9vdCBLZXk6ICVzXG4iLCByb290X25hbWUpOwogCi0Jc3ByaW50ZihzdWJrZXlfbmFtZSwgIiVzLXB5JWQuJWQiLCBtZXRhX25hbWUsIHB5X21ham9yLCBweV9taW5vcik7CisgICAgc3ByaW50ZihzdWJrZXlfbmFtZSwgIiVzLXB5JWQuJWQiLCBtZXRhX25hbWUsIHB5X21ham9yLCBweV9taW5vcik7CiAKLQlyZXN1bHQgPSBSZWdDcmVhdGVLZXlFeChoS2V5LCBzdWJrZXlfbmFtZSwKLQkJCQkwLCBOVUxMLCAwLAotCQkJCUtFWV9XUklURSwKLQkJCQlOVUxMLAotCQkJCSZoU3Via2V5LAotCQkJCSZkaXNwb3NpdGlvbik7CisgICAgcmVzdWx0ID0gUmVnQ3JlYXRlS2V5RXgoaEtleSwgc3Via2V5X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgTlVMTCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBLRVlfV1JJVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaFN1YmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGlzcG9zaXRpb24pOwogCi0JaWYgKHJlc3VsdCAhPSBFUlJPUl9TVUNDRVNTKQotCQlNZXNzYWdlQm94KEdldEZvY3VzKCksIHN1YmtleV9uYW1lLCAiQ291bGQgbm90IGNyZWF0ZSBrZXkiLCBNQl9PSyk7CisgICAgaWYgKHJlc3VsdCAhPSBFUlJPUl9TVUNDRVNTKQorICAgICAgICBNZXNzYWdlQm94KEdldEZvY3VzKCksIHN1YmtleV9uYW1lLCAiQ291bGQgbm90IGNyZWF0ZSBrZXkiLCBNQl9PSyk7CiAKLQlSZWdDbG9zZUtleShoS2V5KTsKKyAgICBSZWdDbG9zZUtleShoS2V5KTsKIAotCWlmIChkaXNwb3NpdGlvbiA9PSBSRUdfQ1JFQVRFRF9ORVdfS0VZKQotCQlmcHJpbnRmKGxvZ2ZpbGUsICIwMjAgUmVnIERCIEtleTogWyVzXSVzXG4iLCBLZXlOYW1lLCBzdWJrZXlfbmFtZSk7CisgICAgaWYgKGRpc3Bvc2l0aW9uID09IFJFR19DUkVBVEVEX05FV19LRVkpCisgICAgICAgIGZwcmludGYobG9nZmlsZSwgIjAyMCBSZWcgREIgS2V5OiBbJXNdJXNcbiIsIEtleU5hbWUsIHN1YmtleV9uYW1lKTsKIAotCXNwcmludGYoYnVmZmVyLCAiUHl0aG9uICVkLiVkICVzIiwgcHlfbWFqb3IsIHB5X21pbm9yLCB0aXRsZSk7CisgICAgc3ByaW50ZihidWZmZXIsICJQeXRob24gJWQuJWQgJXMiLCBweV9tYWpvciwgcHlfbWlub3IsIHRpdGxlKTsKIAotCXJlc3VsdCA9IFJlZ1NldFZhbHVlRXgoaFN1YmtleSwgIkRpc3BsYXlOYW1lIiwKLQkJCSAgICAgICAwLAotCQkJICAgICAgIFJFR19TWiwKLQkJCSAgICAgICBidWZmZXIsCi0JCQkgICAgICAgc3RybGVuKGJ1ZmZlcikrMSk7CisgICAgcmVzdWx0ID0gUmVnU2V0VmFsdWVFeChoU3Via2V5LCAiRGlzcGxheU5hbWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR19TWiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbihidWZmZXIpKzEpOwogCi0JaWYgKHJlc3VsdCAhPSBFUlJPUl9TVUNDRVNTKQotCQlNZXNzYWdlQm94KEdldEZvY3VzKCksIGJ1ZmZlciwgIkNvdWxkIG5vdCBzZXQga2V5IHZhbHVlIiwgTUJfT0spOworICAgIGlmIChyZXN1bHQgIT0gRVJST1JfU1VDQ0VTUykKKyAgICAgICAgTWVzc2FnZUJveChHZXRGb2N1cygpLCBidWZmZXIsICJDb3VsZCBub3Qgc2V0IGtleSB2YWx1ZSIsIE1CX09LKTsKIAotCWZwcmludGYobG9nZmlsZSwgIjA0MCBSZWcgREIgVmFsdWU6IFslc1xcJXNdJXM9JXNcbiIsCi0JCUtleU5hbWUsIHN1YmtleV9uYW1lLCAiRGlzcGxheU5hbWUiLCBidWZmZXIpOworICAgIGZwcmludGYobG9nZmlsZSwgIjA0MCBSZWcgREIgVmFsdWU6IFslc1xcJXNdJXM9JXNcbiIsCisgICAgICAgIEtleU5hbWUsIHN1YmtleV9uYW1lLCAiRGlzcGxheU5hbWUiLCBidWZmZXIpOwogCi0JewotCQlGSUxFICpmcDsKLQkJc3ByaW50ZihidWZmZXIsICIlc1xcUmVtb3ZlJXMuZXhlIiwgZGlyLCBtZXRhX25hbWUpOwotCQlmcCA9IGZvcGVuKGJ1ZmZlciwgIndiIik7Ci0JCWZ3cml0ZShhcmNfZGF0YSwgZXhlX3NpemUsIDEsIGZwKTsKLQkJZmNsb3NlKGZwKTsKKyAgICB7CisgICAgICAgIEZJTEUgKmZwOworICAgICAgICBzcHJpbnRmKGJ1ZmZlciwgIiVzXFxSZW1vdmUlcy5leGUiLCBkaXIsIG1ldGFfbmFtZSk7CisgICAgICAgIGZwID0gZm9wZW4oYnVmZmVyLCAid2IiKTsKKyAgICAgICAgZndyaXRlKGFyY19kYXRhLCBleGVfc2l6ZSwgMSwgZnApOworICAgICAgICBmY2xvc2UoZnApOwogCi0JCXNwcmludGYoYnVmZmVyLCAiXCIlc1xcUmVtb3ZlJXMuZXhlXCIgLXUgXCIlc1xcJXMtd2luaW5zdC5sb2dcIiIsCi0JCQlkaXIsIG1ldGFfbmFtZSwgZGlyLCBtZXRhX25hbWUpOworICAgICAgICBzcHJpbnRmKGJ1ZmZlciwgIlwiJXNcXFJlbW92ZSVzLmV4ZVwiIC11IFwiJXNcXCVzLXdpbmluc3QubG9nXCIiLAorICAgICAgICAgICAgZGlyLCBtZXRhX25hbWUsIGRpciwgbWV0YV9uYW1lKTsKIAotCQlyZXN1bHQgPSBSZWdTZXRWYWx1ZUV4KGhTdWJrZXksICJVbmluc3RhbGxTdHJpbmciLAotCQkJCSAgICAgICAwLAotCQkJCSAgICAgICBSRUdfU1osCi0JCQkJICAgICAgIGJ1ZmZlciwKLQkJCQkgICAgICAgc3RybGVuKGJ1ZmZlcikrMSk7Ci0JCi0JCWlmIChyZXN1bHQgIT0gRVJST1JfU1VDQ0VTUykKLQkJCU1lc3NhZ2VCb3goR2V0Rm9jdXMoKSwgYnVmZmVyLCAiQ291bGQgbm90IHNldCBrZXkgdmFsdWUiLCBNQl9PSyk7CisgICAgICAgIHJlc3VsdCA9IFJlZ1NldFZhbHVlRXgoaFN1YmtleSwgIlVuaW5zdGFsbFN0cmluZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUdfU1osCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbihidWZmZXIpKzEpOwogCi0JCWZwcmludGYobG9nZmlsZSwgIjA0MCBSZWcgREIgVmFsdWU6IFslc1xcJXNdJXM9JXNcbiIsCi0JCQlLZXlOYW1lLCBzdWJrZXlfbmFtZSwgIlVuaW5zdGFsbFN0cmluZyIsIGJ1ZmZlcik7Ci0JfQotCXJldHVybiBUUlVFOworICAgICAgICBpZiAocmVzdWx0ICE9IEVSUk9SX1NVQ0NFU1MpCisgICAgICAgICAgICBNZXNzYWdlQm94KEdldEZvY3VzKCksIGJ1ZmZlciwgIkNvdWxkIG5vdCBzZXQga2V5IHZhbHVlIiwgTUJfT0spOworCisgICAgICAgIGZwcmludGYobG9nZmlsZSwgIjA0MCBSZWcgREIgVmFsdWU6IFslc1xcJXNdJXM9JXNcbiIsCisgICAgICAgICAgICBLZXlOYW1lLCBzdWJrZXlfbmFtZSwgIlVuaW5zdGFsbFN0cmluZyIsIGJ1ZmZlcik7CisgICAgfQorICAgIHJldHVybiBUUlVFOwogfQogCiBzdGF0aWMgdm9pZCBDbG9zZUxvZ2ZpbGUodm9pZCkKIHsKLQljaGFyIGJ1ZmZlcltfTUFYX1BBVEgrMV07Ci0JdGltZV90IGx0aW1lOwotCXN0cnVjdCB0bSAqbm93OworICAgIGNoYXIgYnVmZmVyW19NQVhfUEFUSCsxXTsKKyAgICB0aW1lX3QgbHRpbWU7CisgICAgc3RydWN0IHRtICpub3c7CiAKLQl0aW1lKCZsdGltZSk7Ci0Jbm93ID0gbG9jYWx0aW1lKCZsdGltZSk7Ci0Jc3RyZnRpbWUoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwKLQkJICIqKiogSW5zdGFsbGF0aW9uIGZpbmlzaGVkICVZLyVtLyVkICVIOiVNICoqKlxuIiwKLQkJIGxvY2FsdGltZSgmbHRpbWUpKTsKLQlmcHJpbnRmKGxvZ2ZpbGUsIGJ1ZmZlcik7Ci0JaWYgKGxvZ2ZpbGUpCi0JCWZjbG9zZShsb2dmaWxlKTsKKyAgICB0aW1lKCZsdGltZSk7CisgICAgbm93ID0gbG9jYWx0aW1lKCZsdGltZSk7CisgICAgc3RyZnRpbWUoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwKKyAgICAgICAgICAgICAiKioqIEluc3RhbGxhdGlvbiBmaW5pc2hlZCAlWS8lbS8lZCAlSDolTSAqKipcbiIsCisgICAgICAgICAgICAgbG9jYWx0aW1lKCZsdGltZSkpOworICAgIGZwcmludGYobG9nZmlsZSwgYnVmZmVyKTsKKyAgICBpZiAobG9nZmlsZSkKKyAgICAgICAgZmNsb3NlKGxvZ2ZpbGUpOwogfQogCiBCT09MIENBTExCQUNLCiBJbnN0YWxsRmlsZXNEbGdQcm9jKEhXTkQgaHduZCwgVUlOVCBtc2csIFdQQVJBTSB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCiB7Ci0JTFBOTUhEUiBscG5tOwotCWNoYXIgQnVmZmVyWzQwOTZdOwotCVNDSEVNRSAqc2NoZW1lOworICAgIExQTk1IRFIgbHBubTsKKyAgICBjaGFyIEJ1ZmZlcls0MDk2XTsKKyAgICBTQ0hFTUUgKnNjaGVtZTsKIAotCXN3aXRjaCAobXNnKSB7Ci0JY2FzZSBXTV9JTklURElBTE9HOgotCQlpZiAoaEJpdG1hcCkKLQkJCVNlbmREbGdJdGVtTWVzc2FnZShod25kLCBJRENfQklUTUFQLCBTVE1fU0VUSU1BR0UsCi0JCQkJCSAgIElNQUdFX0JJVE1BUCwgKExQQVJBTSloQml0bWFwKTsKLQkJd3NwcmludGYoQnVmZmVyLAotCQkJICAiQ2xpY2sgTmV4dCB0byBiZWdpbiB0aGUgaW5zdGFsbGF0aW9uIG9mICVzLiAiCi0JCQkgICJJZiB5b3Ugd2FudCB0byByZXZpZXcgb3IgY2hhbmdlIGFueSBvZiB5b3VyICIKLQkJCSAgIiBpbnN0YWxsYXRpb24gc2V0dGluZ3MsIGNsaWNrIEJhY2suICIKLQkJCSAgIkNsaWNrIENhbmNlbCB0byBleGl0IHRoZSB3aXphcmQuIiwKLQkJCSAgbWV0YV9uYW1lKTsKLQkJU2V0RGxnSXRlbVRleHQoaHduZCwgSURDX1RJVExFLCBCdWZmZXIpOwotCQlTZXREbGdJdGVtVGV4dChod25kLCBJRENfSU5GTywgIlJlYWR5IHRvIGluc3RhbGwiKTsKLQkJYnJlYWs7CisgICAgc3dpdGNoIChtc2cpIHsKKyAgICBjYXNlIFdNX0lOSVRESUFMT0c6CisgICAgICAgIGlmIChoQml0bWFwKQorICAgICAgICAgICAgU2VuZERsZ0l0ZW1NZXNzYWdlKGh3bmQsIElEQ19CSVRNQVAsIFNUTV9TRVRJTUFHRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTUFHRV9CSVRNQVAsIChMUEFSQU0paEJpdG1hcCk7CisgICAgICAgIHdzcHJpbnRmKEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICJDbGljayBOZXh0IHRvIGJlZ2luIHRoZSBpbnN0YWxsYXRpb24gb2YgJXMuICIKKyAgICAgICAgICAgICAgICAgICJJZiB5b3Ugd2FudCB0byByZXZpZXcgb3IgY2hhbmdlIGFueSBvZiB5b3VyICIKKyAgICAgICAgICAgICAgICAgICIgaW5zdGFsbGF0aW9uIHNldHRpbmdzLCBjbGljayBCYWNrLiAiCisgICAgICAgICAgICAgICAgICAiQ2xpY2sgQ2FuY2VsIHRvIGV4aXQgdGhlIHdpemFyZC4iLAorICAgICAgICAgICAgICAgICAgbWV0YV9uYW1lKTsKKyAgICAgICAgU2V0RGxnSXRlbVRleHQoaHduZCwgSURDX1RJVExFLCBCdWZmZXIpOworICAgICAgICBTZXREbGdJdGVtVGV4dChod25kLCBJRENfSU5GTywgIlJlYWR5IHRvIGluc3RhbGwiKTsKKyAgICAgICAgYnJlYWs7CiAKLQljYXNlIFdNX05VTUZJTEVTOgotCQlTZW5kRGxnSXRlbU1lc3NhZ2UoaHduZCwgSURDX1BST0dSRVNTLCBQQk1fU0VUUkFOR0UsIDAsIGxQYXJhbSk7Ci0JCVB1bXBNZXNzYWdlcygpOwotCQlyZXR1cm4gVFJVRTsKKyAgICBjYXNlIFdNX05VTUZJTEVTOgorICAgICAgICBTZW5kRGxnSXRlbU1lc3NhZ2UoaHduZCwgSURDX1BST0dSRVNTLCBQQk1fU0VUUkFOR0UsIDAsIGxQYXJhbSk7CisgICAgICAgIFB1bXBNZXNzYWdlcygpOworICAgICAgICByZXR1cm4gVFJVRTsKIAotCWNhc2UgV01fTkVYVEZJTEU6Ci0JCVNlbmREbGdJdGVtTWVzc2FnZShod25kLCBJRENfUFJPR1JFU1MsIFBCTV9TRVRQT1MsIHdQYXJhbSwKLQkJCQkgICAgMCk7Ci0JCVNldERsZ0l0ZW1UZXh0KGh3bmQsIElEQ19JTkZPLCAoTFBTVFIpbFBhcmFtKTsKLQkJUHVtcE1lc3NhZ2VzKCk7Ci0JCXJldHVybiBUUlVFOworICAgIGNhc2UgV01fTkVYVEZJTEU6CisgICAgICAgIFNlbmREbGdJdGVtTWVzc2FnZShod25kLCBJRENfUFJPR1JFU1MsIFBCTV9TRVRQT1MsIHdQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICAgICAgU2V0RGxnSXRlbVRleHQoaHduZCwgSURDX0lORk8sIChMUFNUUilsUGFyYW0pOworICAgICAgICBQdW1wTWVzc2FnZXMoKTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAKLQljYXNlIFdNX05PVElGWToKLQkJbHBubSA9IChMUE5NSERSKSBsUGFyYW07CisgICAgY2FzZSBXTV9OT1RJRlk6CisgICAgICAgIGxwbm0gPSAoTFBOTUhEUikgbFBhcmFtOwogCi0JCXN3aXRjaCAobHBubS0+Y29kZSkgewotCQljYXNlIFBTTl9TRVRBQ1RJVkU6Ci0JCQlQcm9wU2hlZXRfU2V0V2l6QnV0dG9ucyhHZXRQYXJlbnQoaHduZCksCi0JCQkJCQlQU1dJWkJfQkFDSyB8IFBTV0laQl9ORVhUKTsKLQkJCWJyZWFrOworICAgICAgICBzd2l0Y2ggKGxwbm0tPmNvZGUpIHsKKyAgICAgICAgY2FzZSBQU05fU0VUQUNUSVZFOgorICAgICAgICAgICAgUHJvcFNoZWV0X1NldFdpekJ1dHRvbnMoR2V0UGFyZW50KGh3bmQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNXSVpCX0JBQ0sgfCBQU1dJWkJfTkVYVCk7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIFBTTl9XSVpGSU5JU0g6Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBQU05fV0laRklOSVNIOgorICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBQU05fV0laTkVYVDoKLQkJCS8qIEhhbmRsZSBhIE5leHQgYnV0dG9uIGNsaWNrIGhlcmUgKi8KLQkJCWhEaWFsb2cgPSBod25kOwotCQkJc3VjY2VzcyA9IFRSVUU7CisgICAgICAgIGNhc2UgUFNOX1dJWk5FWFQ6CisgICAgICAgICAgICAvKiBIYW5kbGUgYSBOZXh0IGJ1dHRvbiBjbGljayBoZXJlICovCisgICAgICAgICAgICBoRGlhbG9nID0gaHduZDsKKyAgICAgICAgICAgIHN1Y2Nlc3MgPSBUUlVFOwogCi0JCQkvKiBEaXNhYmxlIHRoZSBidXR0b25zIHdoaWxlIHdlIHdvcmsuICBTZW5kaW5nIENBTkNFTFRPQ0xPU0UgaGFzCi0JCQkgIHRoZSBlZmZlY3Qgb2YgZGlzYWJsaW5nIHRoZSBjYW5jZWwgYnV0dG9uLCB3aGljaCBpcyBhKSBhcyB3ZQotCQkJICBkbyBldmVyeXRoaW5nIHN5bmNocm9ub3VzbHkgd2UgY2FuJ3QgY2FuY2VsLCBhbmQgYikgdGhlIG5leHQKLQkJCSAgc3RlcCBpcyAnZmluaXNoZWQnLCB3aGVuIGl0IGlzIHRvbyBsYXRlIHRvIGNhbmNlbCBhbnl3YXkuCi0JCQkgIFRoZSBuZXh0IHN0ZXAgYmVpbmcgJ0ZpbmlzaGVkJyBtZWFucyB3ZSBhbHNvIGRvbid0IG5lZWQgdG8KLQkJCSAgcmVzdG9yZSB0aGUgYnV0dG9uIHN0YXRlIGJhY2sgKi8KLQkJCVByb3BTaGVldF9TZXRXaXpCdXR0b25zKEdldFBhcmVudChod25kKSwgMCk7Ci0JCQlTZW5kTWVzc2FnZShHZXRQYXJlbnQoaHduZCksIFBTTV9DQU5DRUxUT0NMT1NFLCAwLCAwKTsKLQkJCS8qIE1ha2Ugc3VyZSB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBuYW1lIGVuZHMgaW4gYSAqLwotCQkJLyogYmFja3NsYXNoICovCi0JCQlpZiAocHl0aG9uX2RpcltzdHJsZW4ocHl0aG9uX2RpciktMV0gIT0gJ1xcJykKLQkJCQlzdHJjYXQocHl0aG9uX2RpciwgIlxcIik7Ci0JCQkvKiBTdHJpcCB0aGUgdHJhaWxpbmcgYmFja3NsYXNoIGFnYWluICovCi0JCQlweXRob25fZGlyW3N0cmxlbihweXRob25fZGlyKS0xXSA9ICdcMCc7Ci0gICAgICAgICAgICAKLQkJCUNoZWNrUm9vdEtleShod25kKTsKLQkgICAgCi0JCQlpZiAoIU9wZW5Mb2dmaWxlKHB5dGhvbl9kaXIpKQotCQkJCWJyZWFrOworICAgICAgICAgICAgLyogRGlzYWJsZSB0aGUgYnV0dG9ucyB3aGlsZSB3ZSB3b3JrLiAgU2VuZGluZyBDQU5DRUxUT0NMT1NFIGhhcworICAgICAgICAgICAgICB0aGUgZWZmZWN0IG9mIGRpc2FibGluZyB0aGUgY2FuY2VsIGJ1dHRvbiwgd2hpY2ggaXMgYSkgYXMgd2UKKyAgICAgICAgICAgICAgZG8gZXZlcnl0aGluZyBzeW5jaHJvbm91c2x5IHdlIGNhbid0IGNhbmNlbCwgYW5kIGIpIHRoZSBuZXh0CisgICAgICAgICAgICAgIHN0ZXAgaXMgJ2ZpbmlzaGVkJywgd2hlbiBpdCBpcyB0b28gbGF0ZSB0byBjYW5jZWwgYW55d2F5LgorICAgICAgICAgICAgICBUaGUgbmV4dCBzdGVwIGJlaW5nICdGaW5pc2hlZCcgbWVhbnMgd2UgYWxzbyBkb24ndCBuZWVkIHRvCisgICAgICAgICAgICAgIHJlc3RvcmUgdGhlIGJ1dHRvbiBzdGF0ZSBiYWNrICovCisgICAgICAgICAgICBQcm9wU2hlZXRfU2V0V2l6QnV0dG9ucyhHZXRQYXJlbnQoaHduZCksIDApOworICAgICAgICAgICAgU2VuZE1lc3NhZ2UoR2V0UGFyZW50KGh3bmQpLCBQU01fQ0FOQ0VMVE9DTE9TRSwgMCwgMCk7CisgICAgICAgICAgICAvKiBNYWtlIHN1cmUgdGhlIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkgbmFtZSBlbmRzIGluIGEgKi8KKyAgICAgICAgICAgIC8qIGJhY2tzbGFzaCAqLworICAgICAgICAgICAgaWYgKHB5dGhvbl9kaXJbc3RybGVuKHB5dGhvbl9kaXIpLTFdICE9ICdcXCcpCisgICAgICAgICAgICAgICAgc3RyY2F0KHB5dGhvbl9kaXIsICJcXCIpOworICAgICAgICAgICAgLyogU3RyaXAgdGhlIHRyYWlsaW5nIGJhY2tzbGFzaCBhZ2FpbiAqLworICAgICAgICAgICAgcHl0aG9uX2RpcltzdHJsZW4ocHl0aG9uX2RpciktMV0gPSAnXDAnOworCisgICAgICAgICAgICBDaGVja1Jvb3RLZXkoaHduZCk7CisKKyAgICAgICAgICAgIGlmICghT3BlbkxvZ2ZpbGUocHl0aG9uX2RpcikpCisgICAgICAgICAgICAgICAgYnJlYWs7CiAKIC8qCiAgKiBUaGUgc2NoZW1lIHdlIGhhdmUgdG8gdXNlIGRlcGVuZHMgb24gdGhlIFB5dGhvbiB2ZXJzaW9uLi4uCkBAIC0xOTE1LDIwMiArMTkxNSwyMDIgQEAKICAnZGF0YScgICA6ICckYmFzZScsCiAgfQogKi8KLQkJCXNjaGVtZSA9IEdldFNjaGVtZShweV9tYWpvciwgcHlfbWlub3IpOwotCQkJLyogUnVuIHRoZSBwcmUtaW5zdGFsbCBzY3JpcHQuICovCi0JCQlpZiAocHJlX2luc3RhbGxfc2NyaXB0ICYmICpwcmVfaW5zdGFsbF9zY3JpcHQpIHsKLQkJCQlTZXREbGdJdGVtVGV4dCAoaHduZCwgSURDX1RJVExFLAotCQkJCQkJIlJ1bm5pbmcgcHJlLWluc3RhbGxhdGlvbiBzY3JpcHQiKTsKLQkJCQlydW5fc2ltcGxlX3NjcmlwdChwcmVfaW5zdGFsbF9zY3JpcHQpOwotCQkJfQotCQkJaWYgKCFzdWNjZXNzKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQkvKiBFeHRyYWN0IGFsbCBmaWxlcyBmcm9tIHRoZSBhcmNoaXZlICovCi0JCQlTZXREbGdJdGVtVGV4dChod25kLCBJRENfVElUTEUsICJJbnN0YWxsaW5nIGZpbGVzLi4uIik7Ci0JCQlpZiAoIXVuemlwX2FyY2hpdmUgKHNjaGVtZSwKLQkJCQkJICAgIHB5dGhvbl9kaXIsIGFyY19kYXRhLAotCQkJCQkgICAgYXJjX3NpemUsIG5vdGlmeSkpCi0JCQkJc2V0X2ZhaWx1cmVfcmVhc29uKCJGYWlsZWQgdG8gdW56aXAgaW5zdGFsbGF0aW9uIGZpbGVzIik7Ci0JCQkvKiBDb21waWxlIHRoZSBweS1maWxlcyAqLwotCQkJaWYgKHN1Y2Nlc3MgJiYgcHljX2NvbXBpbGUpIHsKLQkJCQlpbnQgZXJyb3JzOwotCQkJCUhJTlNUQU5DRSBoUHl0aG9uOwotCQkJCVNldERsZ0l0ZW1UZXh0KGh3bmQsIElEQ19USVRMRSwKLQkJCQkJCSJDb21waWxpbmcgZmlsZXMgdG8gLnB5Yy4uLiIpOworICAgICAgICAgICAgc2NoZW1lID0gR2V0U2NoZW1lKHB5X21ham9yLCBweV9taW5vcik7CisgICAgICAgICAgICAvKiBSdW4gdGhlIHByZS1pbnN0YWxsIHNjcmlwdC4gKi8KKyAgICAgICAgICAgIGlmIChwcmVfaW5zdGFsbF9zY3JpcHQgJiYgKnByZV9pbnN0YWxsX3NjcmlwdCkgeworICAgICAgICAgICAgICAgIFNldERsZ0l0ZW1UZXh0IChod25kLCBJRENfVElUTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSdW5uaW5nIHByZS1pbnN0YWxsYXRpb24gc2NyaXB0Iik7CisgICAgICAgICAgICAgICAgcnVuX3NpbXBsZV9zY3JpcHQocHJlX2luc3RhbGxfc2NyaXB0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghc3VjY2VzcykgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogRXh0cmFjdCBhbGwgZmlsZXMgZnJvbSB0aGUgYXJjaGl2ZSAqLworICAgICAgICAgICAgU2V0RGxnSXRlbVRleHQoaHduZCwgSURDX1RJVExFLCAiSW5zdGFsbGluZyBmaWxlcy4uLiIpOworICAgICAgICAgICAgaWYgKCF1bnppcF9hcmNoaXZlIChzY2hlbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB5dGhvbl9kaXIsIGFyY19kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmNfc2l6ZSwgbm90aWZ5KSkKKyAgICAgICAgICAgICAgICBzZXRfZmFpbHVyZV9yZWFzb24oIkZhaWxlZCB0byB1bnppcCBpbnN0YWxsYXRpb24gZmlsZXMiKTsKKyAgICAgICAgICAgIC8qIENvbXBpbGUgdGhlIHB5LWZpbGVzICovCisgICAgICAgICAgICBpZiAoc3VjY2VzcyAmJiBweWNfY29tcGlsZSkgeworICAgICAgICAgICAgICAgIGludCBlcnJvcnM7CisgICAgICAgICAgICAgICAgSElOU1RBTkNFIGhQeXRob247CisgICAgICAgICAgICAgICAgU2V0RGxnSXRlbVRleHQoaHduZCwgSURDX1RJVExFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ29tcGlsaW5nIGZpbGVzIHRvIC5weWMuLi4iKTsKIAotCQkJCVNldERsZ0l0ZW1UZXh0KGhEaWFsb2csIElEQ19JTkZPLCAiTG9hZGluZyBweXRob24uLi4iKTsKLQkJCQloUHl0aG9uID0gTG9hZFB5dGhvbkRsbChweXRob25kbGwpOwotCQkJCWlmIChoUHl0aG9uKSB7Ci0JCQkJCWVycm9ycyA9IGNvbXBpbGVfZmlsZWxpc3QoaFB5dGhvbiwgRkFMU0UpOwotCQkJCQlGcmVlTGlicmFyeShoUHl0aG9uKTsKLQkJCQl9Ci0JCQkJLyogQ29tcGlsYXRpb24gZXJyb3JzIGFyZSBpbnRlbnRpb25hbGx5IGlnbm9yZWQ6Ci0JCQkJICogUHl0aG9uMi4wIGNvbnRhaW5zIGEgYnVnIHdoaWNoIHdpbGwgcmVzdWx0Ci0JCQkJICogaW4gc3lzLnBhdGggY29udGFpbmluZyBnYXJiYWdlIHVuZGVyIGNlcnRhaW4KLQkJCQkgKiBjaXJjdW1zdGFuY2VzLCBhbmQgYW4gZXJyb3IgbWVzc2FnZSB3aWxsIG9ubHkKLQkJCQkgKiBjb25mdXNlIHRoZSB1c2VyLgotCQkJCSAqLwotCQkJfQotCQkJaWYgKHN1Y2Nlc3MgJiYgcHlvX2NvbXBpbGUpIHsKLQkJCQlpbnQgZXJyb3JzOwotCQkJCUhJTlNUQU5DRSBoUHl0aG9uOwotCQkJCVNldERsZ0l0ZW1UZXh0KGh3bmQsIElEQ19USVRMRSwKLQkJCQkJCSJDb21waWxpbmcgZmlsZXMgdG8gLnB5by4uLiIpOworICAgICAgICAgICAgICAgIFNldERsZ0l0ZW1UZXh0KGhEaWFsb2csIElEQ19JTkZPLCAiTG9hZGluZyBweXRob24uLi4iKTsKKyAgICAgICAgICAgICAgICBoUHl0aG9uID0gTG9hZFB5dGhvbkRsbChweXRob25kbGwpOworICAgICAgICAgICAgICAgIGlmIChoUHl0aG9uKSB7CisgICAgICAgICAgICAgICAgICAgIGVycm9ycyA9IGNvbXBpbGVfZmlsZWxpc3QoaFB5dGhvbiwgRkFMU0UpOworICAgICAgICAgICAgICAgICAgICBGcmVlTGlicmFyeShoUHl0aG9uKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLyogQ29tcGlsYXRpb24gZXJyb3JzIGFyZSBpbnRlbnRpb25hbGx5IGlnbm9yZWQ6CisgICAgICAgICAgICAgICAgICogUHl0aG9uMi4wIGNvbnRhaW5zIGEgYnVnIHdoaWNoIHdpbGwgcmVzdWx0CisgICAgICAgICAgICAgICAgICogaW4gc3lzLnBhdGggY29udGFpbmluZyBnYXJiYWdlIHVuZGVyIGNlcnRhaW4KKyAgICAgICAgICAgICAgICAgKiBjaXJjdW1zdGFuY2VzLCBhbmQgYW4gZXJyb3IgbWVzc2FnZSB3aWxsIG9ubHkKKyAgICAgICAgICAgICAgICAgKiBjb25mdXNlIHRoZSB1c2VyLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN1Y2Nlc3MgJiYgcHlvX2NvbXBpbGUpIHsKKyAgICAgICAgICAgICAgICBpbnQgZXJyb3JzOworICAgICAgICAgICAgICAgIEhJTlNUQU5DRSBoUHl0aG9uOworICAgICAgICAgICAgICAgIFNldERsZ0l0ZW1UZXh0KGh3bmQsIElEQ19USVRMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvbXBpbGluZyBmaWxlcyB0byAucHlvLi4uIik7CiAKLQkJCQlTZXREbGdJdGVtVGV4dChoRGlhbG9nLCBJRENfSU5GTywgIkxvYWRpbmcgcHl0aG9uLi4uIik7Ci0JCQkJaFB5dGhvbiA9IExvYWRQeXRob25EbGwocHl0aG9uZGxsKTsKLQkJCQlpZiAoaFB5dGhvbikgewotCQkJCQllcnJvcnMgPSBjb21waWxlX2ZpbGVsaXN0KGhQeXRob24sIFRSVUUpOwotCQkJCQlGcmVlTGlicmFyeShoUHl0aG9uKTsKLQkJCQl9Ci0JCQkJLyogRXJyb3JzIGlnbm9yZWQ6IHNlZSBhYm92ZSAqLwotCQkJfQorICAgICAgICAgICAgICAgIFNldERsZ0l0ZW1UZXh0KGhEaWFsb2csIElEQ19JTkZPLCAiTG9hZGluZyBweXRob24uLi4iKTsKKyAgICAgICAgICAgICAgICBoUHl0aG9uID0gTG9hZFB5dGhvbkRsbChweXRob25kbGwpOworICAgICAgICAgICAgICAgIGlmIChoUHl0aG9uKSB7CisgICAgICAgICAgICAgICAgICAgIGVycm9ycyA9IGNvbXBpbGVfZmlsZWxpc3QoaFB5dGhvbiwgVFJVRSk7CisgICAgICAgICAgICAgICAgICAgIEZyZWVMaWJyYXJ5KGhQeXRob24pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvKiBFcnJvcnMgaWdub3JlZDogc2VlIGFib3ZlICovCisgICAgICAgICAgICB9CiAKIAotCQkJYnJlYWs7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIFBTTl9SRVNFVDoKLQkJCWJyZWFrOwotCQkKLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCQl9Ci0JfQotCXJldHVybiAwOworICAgICAgICBjYXNlIFBTTl9SRVNFVDoKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogCiBCT09MIENBTExCQUNLCiBGaW5pc2hlZERsZ1Byb2MoSFdORCBod25kLCBVSU5UIG1zZywgV1BBUkFNIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKIHsKLQlMUE5NSERSIGxwbm07CisgICAgTFBOTUhEUiBscG5tOwogCi0Jc3dpdGNoIChtc2cpIHsKLQljYXNlIFdNX0lOSVRESUFMT0c6Ci0JCWlmIChoQml0bWFwKQotCQkJU2VuZERsZ0l0ZW1NZXNzYWdlKGh3bmQsIElEQ19CSVRNQVAsIFNUTV9TRVRJTUFHRSwKLQkJCQkJICAgSU1BR0VfQklUTUFQLCAoTFBBUkFNKWhCaXRtYXApOwotCQlpZiAoIXN1Y2Nlc3MpCi0JCQlTZXREbGdJdGVtVGV4dChod25kLCBJRENfSU5GTywgZ2V0X2ZhaWx1cmVfcmVhc29uKCkpOworICAgIHN3aXRjaCAobXNnKSB7CisgICAgY2FzZSBXTV9JTklURElBTE9HOgorICAgICAgICBpZiAoaEJpdG1hcCkKKyAgICAgICAgICAgIFNlbmREbGdJdGVtTWVzc2FnZShod25kLCBJRENfQklUTUFQLCBTVE1fU0VUSU1BR0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU1BR0VfQklUTUFQLCAoTFBBUkFNKWhCaXRtYXApOworICAgICAgICBpZiAoIXN1Y2Nlc3MpCisgICAgICAgICAgICBTZXREbGdJdGVtVGV4dChod25kLCBJRENfSU5GTywgZ2V0X2ZhaWx1cmVfcmVhc29uKCkpOwogCi0JCS8qIGFzeW5jIGRlbGF5OiB3aWxsIHNob3cgdGhlIGRpYWxvZyBib3ggY29tcGxldGVseSBiZWZvcmUKLQkJICAgdGhlIGluc3RhbGxfc2NyaXB0IGlzIHN0YXJ0ZWQgKi8KLQkJUG9zdE1lc3NhZ2UoaHduZCwgV01fVVNFUiwgMCwgMEwpOwotCQlyZXR1cm4gVFJVRTsKKyAgICAgICAgLyogYXN5bmMgZGVsYXk6IHdpbGwgc2hvdyB0aGUgZGlhbG9nIGJveCBjb21wbGV0ZWx5IGJlZm9yZQorICAgICAgICAgICB0aGUgaW5zdGFsbF9zY3JpcHQgaXMgc3RhcnRlZCAqLworICAgICAgICBQb3N0TWVzc2FnZShod25kLCBXTV9VU0VSLCAwLCAwTCk7CisgICAgICAgIHJldHVybiBUUlVFOwogCi0JY2FzZSBXTV9VU0VSOgorICAgIGNhc2UgV01fVVNFUjoKIAotCQlpZiAoc3VjY2VzcyAmJiBpbnN0YWxsX3NjcmlwdCAmJiBpbnN0YWxsX3NjcmlwdFswXSkgewotCQkJY2hhciBmbmFtZVtNQVhfUEFUSF07Ci0JCQljaGFyICpidWZmZXI7Ci0JCQlIQ1VSU09SIGhDdXJzb3I7Ci0JCQlpbnQgcmVzdWx0OworICAgICAgICBpZiAoc3VjY2VzcyAmJiBpbnN0YWxsX3NjcmlwdCAmJiBpbnN0YWxsX3NjcmlwdFswXSkgeworICAgICAgICAgICAgY2hhciBmbmFtZVtNQVhfUEFUSF07CisgICAgICAgICAgICBjaGFyICpidWZmZXI7CisgICAgICAgICAgICBIQ1VSU09SIGhDdXJzb3I7CisgICAgICAgICAgICBpbnQgcmVzdWx0OwogCi0JCQljaGFyICphcmd2WzNdID0ge05VTEwsICItaW5zdGFsbCIsIE5VTEx9OworICAgICAgICAgICAgY2hhciAqYXJndlszXSA9IHtOVUxMLCAiLWluc3RhbGwiLCBOVUxMfTsKIAotCQkJU2V0RGxnSXRlbVRleHQoaHduZCwgSURDX1RJVExFLAotCQkJCQkiUGxlYXNlIHdhaXQgd2hpbGUgcnVubmluZyBwb3N0aW5zdGFsbCBzY3JpcHQuLi4iKTsKLQkJCXN0cmNweShmbmFtZSwgcHl0aG9uX2Rpcik7Ci0JCQlzdHJjYXQoZm5hbWUsICJcXFNjcmlwdHNcXCIpOwotCQkJc3RyY2F0KGZuYW1lLCBpbnN0YWxsX3NjcmlwdCk7CisgICAgICAgICAgICBTZXREbGdJdGVtVGV4dChod25kLCBJRENfVElUTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBsZWFzZSB3YWl0IHdoaWxlIHJ1bm5pbmcgcG9zdGluc3RhbGwgc2NyaXB0Li4uIik7CisgICAgICAgICAgICBzdHJjcHkoZm5hbWUsIHB5dGhvbl9kaXIpOworICAgICAgICAgICAgc3RyY2F0KGZuYW1lLCAiXFxTY3JpcHRzXFwiKTsKKyAgICAgICAgICAgIHN0cmNhdChmbmFtZSwgaW5zdGFsbF9zY3JpcHQpOwogCi0JCQlpZiAobG9nZmlsZSkKLQkJCQlmcHJpbnRmKGxvZ2ZpbGUsICIzMDAgUnVuIFNjcmlwdDogWyVzXSVzXG4iLCBweXRob25kbGwsIGZuYW1lKTsKKyAgICAgICAgICAgIGlmIChsb2dmaWxlKQorICAgICAgICAgICAgICAgIGZwcmludGYobG9nZmlsZSwgIjMwMCBSdW4gU2NyaXB0OiBbJXNdJXNcbiIsIHB5dGhvbmRsbCwgZm5hbWUpOwogCi0JCQloQ3Vyc29yID0gU2V0Q3Vyc29yKExvYWRDdXJzb3IoTlVMTCwgSURDX1dBSVQpKTsKKyAgICAgICAgICAgIGhDdXJzb3IgPSBTZXRDdXJzb3IoTG9hZEN1cnNvcihOVUxMLCBJRENfV0FJVCkpOwogCi0JCQlhcmd2WzBdID0gZm5hbWU7CisgICAgICAgICAgICBhcmd2WzBdID0gZm5hbWU7CiAKLQkJCXJlc3VsdCA9IHJ1bl9pbnN0YWxsc2NyaXB0KGZuYW1lLCAyLCBhcmd2LCAmYnVmZmVyKTsKLQkJCWlmICgwICE9IHJlc3VsdCkgewotCQkJCWZwcmludGYoc3RkZXJyLCAiKioqIHJ1bl9pbnN0YWxsc2NyaXB0OiBpbnRlcm5hbCBlcnJvciAweCVYICoqKlxuIiwgcmVzdWx0KTsKLQkJCX0KLQkJCWlmIChidWZmZXIpCi0JCQkJU2V0RGxnSXRlbVRleHQoaHduZCwgSURDX0lORk8sIGJ1ZmZlcik7Ci0JCQlTZXREbGdJdGVtVGV4dChod25kLCBJRENfVElUTEUsCi0JCQkJCSJQb3N0aW5zdGFsbCBzY3JpcHQgZmluaXNoZWQuXG4iCi0JCQkJCSJDbGljayB0aGUgRmluaXNoIGJ1dHRvbiB0byBleGl0IHRoZSBTZXR1cCB3aXphcmQuIik7CisgICAgICAgICAgICByZXN1bHQgPSBydW5faW5zdGFsbHNjcmlwdChmbmFtZSwgMiwgYXJndiwgJmJ1ZmZlcik7CisgICAgICAgICAgICBpZiAoMCAhPSByZXN1bHQpIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIioqKiBydW5faW5zdGFsbHNjcmlwdDogaW50ZXJuYWwgZXJyb3IgMHglWCAqKipcbiIsIHJlc3VsdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYnVmZmVyKQorICAgICAgICAgICAgICAgIFNldERsZ0l0ZW1UZXh0KGh3bmQsIElEQ19JTkZPLCBidWZmZXIpOworICAgICAgICAgICAgU2V0RGxnSXRlbVRleHQoaHduZCwgSURDX1RJVExFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQb3N0aW5zdGFsbCBzY3JpcHQgZmluaXNoZWQuXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNsaWNrIHRoZSBGaW5pc2ggYnV0dG9uIHRvIGV4aXQgdGhlIFNldHVwIHdpemFyZC4iKTsKIAotCQkJZnJlZShidWZmZXIpOwotCQkJU2V0Q3Vyc29yKGhDdXJzb3IpOwotCQkJQ2xvc2VMb2dmaWxlKCk7Ci0JCX0KKyAgICAgICAgICAgIGZyZWUoYnVmZmVyKTsKKyAgICAgICAgICAgIFNldEN1cnNvcihoQ3Vyc29yKTsKKyAgICAgICAgICAgIENsb3NlTG9nZmlsZSgpOworICAgICAgICB9CiAKLQkJcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiBUUlVFOwogCi0JY2FzZSBXTV9OT1RJRlk6Ci0JCWxwbm0gPSAoTFBOTUhEUikgbFBhcmFtOworICAgIGNhc2UgV01fTk9USUZZOgorICAgICAgICBscG5tID0gKExQTk1IRFIpIGxQYXJhbTsKIAotCQlzd2l0Y2ggKGxwbm0tPmNvZGUpIHsKLQkJY2FzZSBQU05fU0VUQUNUSVZFOiAvKiBFbmFibGUgdGhlIEZpbmlzaCBidXR0b24gKi8KLQkJCVByb3BTaGVldF9TZXRXaXpCdXR0b25zKEdldFBhcmVudChod25kKSwgUFNXSVpCX0ZJTklTSCk7Ci0JCQlicmVhazsKKyAgICAgICAgc3dpdGNoIChscG5tLT5jb2RlKSB7CisgICAgICAgIGNhc2UgUFNOX1NFVEFDVElWRTogLyogRW5hYmxlIHRoZSBGaW5pc2ggYnV0dG9uICovCisgICAgICAgICAgICBQcm9wU2hlZXRfU2V0V2l6QnV0dG9ucyhHZXRQYXJlbnQoaHduZCksIFBTV0laQl9GSU5JU0gpOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBQU05fV0laTkVYVDoKLQkJCWJyZWFrOworICAgICAgICBjYXNlIFBTTl9XSVpORVhUOgorICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBQU05fV0laRklOSVNIOgotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgUFNOX1dJWkZJTklTSDoKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgUFNOX1JFU0VUOgotCQkJYnJlYWs7Ci0JCQotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JcmV0dXJuIDA7CisgICAgICAgIGNhc2UgUFNOX1JFU0VUOgorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOwogfQogCiB2b2lkIFJ1bldpemFyZChIV05EIGh3bmQpCiB7Ci0JUFJPUFNIRUVUUEFHRSAgIHBzcCA9ICAgICAgIHswfTsKLQlIUFJPUFNIRUVUUEFHRSAgYWhwc3BbNF0gPSAgezB9OwotCVBST1BTSEVFVEhFQURFUiBwc2ggPSAgICAgICB7MH07CisgICAgUFJPUFNIRUVUUEFHRSAgIHBzcCA9ICAgICAgIHswfTsKKyAgICBIUFJPUFNIRUVUUEFHRSAgYWhwc3BbNF0gPSAgezB9OworICAgIFBST1BTSEVFVEhFQURFUiBwc2ggPSAgICAgICB7MH07CiAKLQkvKiBEaXNwbGF5IG1vZHVsZSBpbmZvcm1hdGlvbiAqLwotCXBzcC5kd1NpemUgPSAgICAgICAgc2l6ZW9mKHBzcCk7Ci0JcHNwLmR3RmxhZ3MgPSAgICAgICBQU1BfREVGQVVMVHxQU1BfSElERUhFQURFUjsKLQlwc3AuaEluc3RhbmNlID0gICAgIEdldE1vZHVsZUhhbmRsZSAoTlVMTCk7Ci0JcHNwLmxQYXJhbSA9ICAgICAgICAwOwotCXBzcC5wZm5EbGdQcm9jID0gICAgSW50cm9EbGdQcm9jOwotCXBzcC5wc3pUZW1wbGF0ZSA9ICAgTUFLRUlOVFJFU09VUkNFKElERF9JTlRSTyk7CisgICAgLyogRGlzcGxheSBtb2R1bGUgaW5mb3JtYXRpb24gKi8KKyAgICBwc3AuZHdTaXplID0gICAgICAgIHNpemVvZihwc3ApOworICAgIHBzcC5kd0ZsYWdzID0gICAgICAgUFNQX0RFRkFVTFR8UFNQX0hJREVIRUFERVI7CisgICAgcHNwLmhJbnN0YW5jZSA9ICAgICBHZXRNb2R1bGVIYW5kbGUgKE5VTEwpOworICAgIHBzcC5sUGFyYW0gPSAgICAgICAgMDsKKyAgICBwc3AucGZuRGxnUHJvYyA9ICAgIEludHJvRGxnUHJvYzsKKyAgICBwc3AucHN6VGVtcGxhdGUgPSAgIE1BS0VJTlRSRVNPVVJDRShJRERfSU5UUk8pOwogCi0JYWhwc3BbMF0gPSAgICAgICAgICBDcmVhdGVQcm9wZXJ0eVNoZWV0UGFnZSgmcHNwKTsKKyAgICBhaHBzcFswXSA9ICAgICAgICAgIENyZWF0ZVByb3BlcnR5U2hlZXRQYWdlKCZwc3ApOwogCi0JLyogU2VsZWN0IHB5dGhvbiB2ZXJzaW9uIHRvIHVzZSAqLwotCXBzcC5kd0ZsYWdzID0gICAgICAgUFNQX0RFRkFVTFR8UFNQX0hJREVIRUFERVI7Ci0JcHNwLnBzelRlbXBsYXRlID0gICAgICAgTUFLRUlOVFJFU09VUkNFKElERF9TRUxFQ1RQWVRIT04pOwotCXBzcC5wZm5EbGdQcm9jID0gICAgICAgIFNlbGVjdFB5dGhvbkRsZ1Byb2M7CisgICAgLyogU2VsZWN0IHB5dGhvbiB2ZXJzaW9uIHRvIHVzZSAqLworICAgIHBzcC5kd0ZsYWdzID0gICAgICAgUFNQX0RFRkFVTFR8UFNQX0hJREVIRUFERVI7CisgICAgcHNwLnBzelRlbXBsYXRlID0gICAgICAgTUFLRUlOVFJFU09VUkNFKElERF9TRUxFQ1RQWVRIT04pOworICAgIHBzcC5wZm5EbGdQcm9jID0gICAgICAgIFNlbGVjdFB5dGhvbkRsZ1Byb2M7CiAKLQlhaHBzcFsxXSA9ICAgICAgICAgICAgICBDcmVhdGVQcm9wZXJ0eVNoZWV0UGFnZSgmcHNwKTsKKyAgICBhaHBzcFsxXSA9ICAgICAgICAgICAgICBDcmVhdGVQcm9wZXJ0eVNoZWV0UGFnZSgmcHNwKTsKIAotCS8qIEluc3RhbGwgdGhlIGZpbGVzICovCi0JcHNwLmR3RmxhZ3MgPQkgICAgUFNQX0RFRkFVTFR8UFNQX0hJREVIRUFERVI7Ci0JcHNwLnBzelRlbXBsYXRlID0gICAgICAgTUFLRUlOVFJFU09VUkNFKElERF9JTlNUQUxMRklMRVMpOwotCXBzcC5wZm5EbGdQcm9jID0gICAgICAgIEluc3RhbGxGaWxlc0RsZ1Byb2M7CisgICAgLyogSW5zdGFsbCB0aGUgZmlsZXMgKi8KKyAgICBwc3AuZHdGbGFncyA9ICAgICAgICAgICBQU1BfREVGQVVMVHxQU1BfSElERUhFQURFUjsKKyAgICBwc3AucHN6VGVtcGxhdGUgPSAgICAgICBNQUtFSU5UUkVTT1VSQ0UoSUREX0lOU1RBTExGSUxFUyk7CisgICAgcHNwLnBmbkRsZ1Byb2MgPSAgICAgICAgSW5zdGFsbEZpbGVzRGxnUHJvYzsKIAotCWFocHNwWzJdID0gICAgICAgICAgICAgIENyZWF0ZVByb3BlcnR5U2hlZXRQYWdlKCZwc3ApOworICAgIGFocHNwWzJdID0gICAgICAgICAgICAgIENyZWF0ZVByb3BlcnR5U2hlZXRQYWdlKCZwc3ApOwogCi0JLyogU2hvdyBzdWNjZXNzIG9yIGZhaWx1cmUgKi8KLQlwc3AuZHdGbGFncyA9ICAgICAgICAgICBQU1BfREVGQVVMVHxQU1BfSElERUhFQURFUjsKLQlwc3AucHN6VGVtcGxhdGUgPSAgICAgICBNQUtFSU5UUkVTT1VSQ0UoSUREX0ZJTklTSEVEKTsKLQlwc3AucGZuRGxnUHJvYyA9ICAgICAgICBGaW5pc2hlZERsZ1Byb2M7CisgICAgLyogU2hvdyBzdWNjZXNzIG9yIGZhaWx1cmUgKi8KKyAgICBwc3AuZHdGbGFncyA9ICAgICAgICAgICBQU1BfREVGQVVMVHxQU1BfSElERUhFQURFUjsKKyAgICBwc3AucHN6VGVtcGxhdGUgPSAgICAgICBNQUtFSU5UUkVTT1VSQ0UoSUREX0ZJTklTSEVEKTsKKyAgICBwc3AucGZuRGxnUHJvYyA9ICAgICAgICBGaW5pc2hlZERsZ1Byb2M7CiAKLQlhaHBzcFszXSA9ICAgICAgICAgICAgICBDcmVhdGVQcm9wZXJ0eVNoZWV0UGFnZSgmcHNwKTsKKyAgICBhaHBzcFszXSA9ICAgICAgICAgICAgICBDcmVhdGVQcm9wZXJ0eVNoZWV0UGFnZSgmcHNwKTsKIAotCS8qIENyZWF0ZSB0aGUgcHJvcGVydHkgc2hlZXQgKi8KLQlwc2guZHdTaXplID0gICAgICAgICAgICBzaXplb2YocHNoKTsKLQlwc2guaEluc3RhbmNlID0gICAgICAgICBHZXRNb2R1bGVIYW5kbGUoTlVMTCk7Ci0JcHNoLmh3bmRQYXJlbnQgPSAgICAgICAgaHduZDsKLQlwc2gucGhwYWdlID0gICAgICAgICAgICBhaHBzcDsKLQlwc2guZHdGbGFncyA9ICAgICAgICAgICBQU0hfV0laQVJELyo5NyovLyp8UFNIX1dBVEVSTUFSS3xQU0hfSEVBREVSKi87Ci0JCXBzaC5wc3pibVdhdGVybWFyayA9ICAgIE5VTEw7Ci0JCXBzaC5wc3pibUhlYWRlciA9ICAgICAgIE5VTEw7Ci0JCXBzaC5uU3RhcnRQYWdlID0gICAgICAgIDA7Ci0JCXBzaC5uUGFnZXMgPSAgICAgICAgICAgIDQ7CisgICAgLyogQ3JlYXRlIHRoZSBwcm9wZXJ0eSBzaGVldCAqLworICAgIHBzaC5kd1NpemUgPSAgICAgICAgICAgIHNpemVvZihwc2gpOworICAgIHBzaC5oSW5zdGFuY2UgPSAgICAgICAgIEdldE1vZHVsZUhhbmRsZShOVUxMKTsKKyAgICBwc2guaHduZFBhcmVudCA9ICAgICAgICBod25kOworICAgIHBzaC5waHBhZ2UgPSAgICAgICAgICAgIGFocHNwOworICAgIHBzaC5kd0ZsYWdzID0gICAgICAgICAgIFBTSF9XSVpBUkQvKjk3Ki8vKnxQU0hfV0FURVJNQVJLfFBTSF9IRUFERVIqLzsKKyAgICAgICAgcHNoLnBzemJtV2F0ZXJtYXJrID0gICAgTlVMTDsKKyAgICAgICAgcHNoLnBzemJtSGVhZGVyID0gICAgICAgTlVMTDsKKyAgICAgICAgcHNoLm5TdGFydFBhZ2UgPSAgICAgICAgMDsKKyAgICAgICAgcHNoLm5QYWdlcyA9ICAgICAgICAgICAgNDsKIAotCQlQcm9wZXJ0eVNoZWV0KCZwc2gpOworICAgICAgICBQcm9wZXJ0eVNoZWV0KCZwc2gpOwogfQogCiAvLyBzdWJ0bHkgZGlmZmVyZW50IGZyb20gSGFzTG9jYWxNYWNoaW5lUHJpdnMoKSwgaW4gdGhhdCBhZnRlciBleGVjdXRpbmcKQEAgLTIxMTgsMTYgKzIxMTgsMTYgQEAKIC8vIHN1Y2ggaW1wbGljYXRpb24gZm9yIEhhc0xvY2FsTWFjaGluZVByaXZzCiBCT09MIE15SXNVc2VyQW5BZG1pbigpCiB7Ci0JdHlwZWRlZiBCT09MIChXSU5BUEkgKlBGTklzVXNlckFuQWRtaW4pKCk7Ci0Jc3RhdGljIFBGTklzVXNlckFuQWRtaW4gcGZuSXNVc2VyQW5BZG1pbiA9IE5VTEw7Ci0JSE1PRFVMRSBzaGVsbDMyOwotCS8vIFRoaXMgZnVuY3Rpb24gaXNuJ3QgZ3VhcmFudGVlZCB0byBiZSBhdmFpbGFibGUgKGFuZCBpdCBjYW4ndCBodXJ0IAotCS8vIHRvIGxlYXZlIHRoZSBsaWJyYXJ5IGxvYWRlZCkKLQlpZiAoMCA9PSAoc2hlbGwzMj1Mb2FkTGlicmFyeSgic2hlbGwzMi5kbGwiKSkpCi0JCXJldHVybiBGQUxTRTsKLQlpZiAoMCA9PSAocGZuSXNVc2VyQW5BZG1pbj0oUEZOSXNVc2VyQW5BZG1pbilHZXRQcm9jQWRkcmVzcyhzaGVsbDMyLCAiSXNVc2VyQW5BZG1pbiIpKSkKLQkJcmV0dXJuIEZBTFNFOwotCXJldHVybiAoKnBmbklzVXNlckFuQWRtaW4pKCk7CisgICAgdHlwZWRlZiBCT09MIChXSU5BUEkgKlBGTklzVXNlckFuQWRtaW4pKCk7CisgICAgc3RhdGljIFBGTklzVXNlckFuQWRtaW4gcGZuSXNVc2VyQW5BZG1pbiA9IE5VTEw7CisgICAgSE1PRFVMRSBzaGVsbDMyOworICAgIC8vIFRoaXMgZnVuY3Rpb24gaXNuJ3QgZ3VhcmFudGVlZCB0byBiZSBhdmFpbGFibGUgKGFuZCBpdCBjYW4ndCBodXJ0CisgICAgLy8gdG8gbGVhdmUgdGhlIGxpYnJhcnkgbG9hZGVkKQorICAgIGlmICgwID09IChzaGVsbDMyPUxvYWRMaWJyYXJ5KCJzaGVsbDMyLmRsbCIpKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIGlmICgwID09IChwZm5Jc1VzZXJBbkFkbWluPShQRk5Jc1VzZXJBbkFkbWluKUdldFByb2NBZGRyZXNzKHNoZWxsMzIsICJJc1VzZXJBbkFkbWluIikpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuICgqcGZuSXNVc2VyQW5BZG1pbikoKTsKIH0KIAogLy8gU29tZSBtYWdpYyBmb3IgVmlzdGEncyBVQUMuICBJZiB0aGVyZSBpcyBhIHRhcmdldF92ZXJzaW9uLCBhbmQKQEAgLTIxMzksMzggKzIxMzksMzggQEAKIC8vIFJldHVybnMgVFJVRSBpZiB3ZSBzaG91bGQgc3Bhd24gYW4gZWxldmF0ZWQgY2hpbGQKIEJPT0wgTmVlZEF1dG9VQUMoKQogewotCUhLRVkgaGs7Ci0JY2hhciBrZXlfbmFtZVs4MF07Ci0JLy8gbm8gUHl0aG9uIHZlcnNpb24gaW5mbyA9PSB3ZSBjYW4ndCBrbm93IHlldC4KLQlpZiAodGFyZ2V0X3ZlcnNpb25bMF0gPT0gJ1wwJykKLQkJcmV0dXJuIEZBTFNFOwotCS8vIHNlZSBob3cgcHl0aG9uIGlzIGN1cnJlbnQgaW5zdGFsbGVkCi0Jd3NwcmludGYoa2V5X25hbWUsCi0JCQkgIlNvZnR3YXJlXFxQeXRob25cXFB5dGhvbkNvcmVcXCVzXFxJbnN0YWxsUGF0aCIsCi0JCQkgdGFyZ2V0X3ZlcnNpb24pOwotCWlmIChFUlJPUl9TVUNDRVNTICE9IFJlZ09wZW5LZXlFeChIS0VZX0xPQ0FMX01BQ0hJTkUsIAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlfbmFtZSwgMCwgS0VZX1JFQUQsICZoaykpCi0JCXJldHVybiBGQUxTRTsKLQlSZWdDbG9zZUtleShoayk7Ci0JLy8gUHl0aG9uIGlzIGluc3RhbGxlZCBpbiBIS0xNIC0gd2UgbXVzdCBlbGV2YXRlLgotCXJldHVybiBUUlVFOworICAgIEhLRVkgaGs7CisgICAgY2hhciBrZXlfbmFtZVs4MF07CisgICAgLy8gbm8gUHl0aG9uIHZlcnNpb24gaW5mbyA9PSB3ZSBjYW4ndCBrbm93IHlldC4KKyAgICBpZiAodGFyZ2V0X3ZlcnNpb25bMF0gPT0gJ1wwJykKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIC8vIHNlZSBob3cgcHl0aG9uIGlzIGN1cnJlbnQgaW5zdGFsbGVkCisgICAgd3NwcmludGYoa2V5X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAiU29mdHdhcmVcXFB5dGhvblxcUHl0aG9uQ29yZVxcJXNcXEluc3RhbGxQYXRoIiwKKyAgICAgICAgICAgICAgICAgICAgIHRhcmdldF92ZXJzaW9uKTsKKyAgICBpZiAoRVJST1JfU1VDQ0VTUyAhPSBSZWdPcGVuS2V5RXgoSEtFWV9MT0NBTF9NQUNISU5FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlfbmFtZSwgMCwgS0VZX1JFQUQsICZoaykpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICBSZWdDbG9zZUtleShoayk7CisgICAgLy8gUHl0aG9uIGlzIGluc3RhbGxlZCBpbiBIS0xNIC0gd2UgbXVzdCBlbGV2YXRlLgorICAgIHJldHVybiBUUlVFOwogfQogCiAvLyBSZXR1cm5zIFRSVUUgaWYgdGhlIHBsYXRmb3JtIHN1cHBvcnRzIFVBQy4KIEJPT0wgUGxhdGZvcm1TdXBwb3J0c1VBQygpCiB7Ci0JLy8gTm90ZSB0aGF0IHdpbjJrIGRvZXMgc2VlbSB0byBzdXBwb3J0IFNoZWxsRXhlY3V0ZSB3aXRoICdydW5hcycsCi0JLy8gYnV0IGRvZXMgKm5vdCogc3VwcG9ydCBJc1VzZXJBbkFkbWluIC0gc28gd2UganVzdCBwcmV0ZW5kIHRoaW5ncwotCS8vIG9ubHkgd29yayBvbiBYUCBhbmQgbGF0ZXIuCi0JQk9PTCBiSXNXaW5kb3dzWFBvckxhdGVyOwotCU9TVkVSU0lPTklORk8gd2ludmVyaW5mbzsKLQl3aW52ZXJpbmZvLmR3T1NWZXJzaW9uSW5mb1NpemUgPSBzaXplb2Yod2ludmVyaW5mbyk7Ci0JaWYgKCFHZXRWZXJzaW9uRXgoJndpbnZlcmluZm8pKQotCQlyZXR1cm4gRkFMU0U7IC8vIHNvbWV0aGluZyBiYWQgaGFzIGdvbmUgd3JvbmcKLQliSXNXaW5kb3dzWFBvckxhdGVyID0gCisgICAgLy8gTm90ZSB0aGF0IHdpbjJrIGRvZXMgc2VlbSB0byBzdXBwb3J0IFNoZWxsRXhlY3V0ZSB3aXRoICdydW5hcycsCisgICAgLy8gYnV0IGRvZXMgKm5vdCogc3VwcG9ydCBJc1VzZXJBbkFkbWluIC0gc28gd2UganVzdCBwcmV0ZW5kIHRoaW5ncworICAgIC8vIG9ubHkgd29yayBvbiBYUCBhbmQgbGF0ZXIuCisgICAgQk9PTCBiSXNXaW5kb3dzWFBvckxhdGVyOworICAgIE9TVkVSU0lPTklORk8gd2ludmVyaW5mbzsKKyAgICB3aW52ZXJpbmZvLmR3T1NWZXJzaW9uSW5mb1NpemUgPSBzaXplb2Yod2ludmVyaW5mbyk7CisgICAgaWYgKCFHZXRWZXJzaW9uRXgoJndpbnZlcmluZm8pKQorICAgICAgICByZXR1cm4gRkFMU0U7IC8vIHNvbWV0aGluZyBiYWQgaGFzIGdvbmUgd3JvbmcKKyAgICBiSXNXaW5kb3dzWFBvckxhdGVyID0KICAgICAgICAoICh3aW52ZXJpbmZvLmR3TWFqb3JWZXJzaW9uID4gNSkgfHwKICAgICAgICAoICh3aW52ZXJpbmZvLmR3TWFqb3JWZXJzaW9uID09IDUpICYmICh3aW52ZXJpbmZvLmR3TWlub3JWZXJzaW9uID49IDEpICkpOwotCXJldHVybiBiSXNXaW5kb3dzWFBvckxhdGVyOworICAgIHJldHVybiBiSXNXaW5kb3dzWFBvckxhdGVyOwogfQogCiAvLyBTcGF3biBvdXJzZWxmIGFzIGFuIGVsZXZhdGVkIGFwcGxpY2F0aW9uLiAgT24gZmFpbHVyZSwgYSBtZXNzYWdlIGlzCkBAIC0yMTc4LDk3ICsyMTc4LDk3IEBACiAvLyBvbiBlcnJvci4KIHZvaWQgU3Bhd25VQUMoKQogewotCS8vIGludGVyZXN0aW5nIGZhaWx1cmUgc2NlbmFyaW8gdGhhdCBoYXMgYmVlbiBzZWVuOiBpbml0aWFsIGV4ZWN1dGFibGUKLQkvLyBydW5zIGZyb20gYSBuZXR3b3JrIGRyaXZlIC0gYnV0IG9uY2UgZWxldmF0ZWQsIHRoYXQgbmV0d29yayBzaGFyZQotCS8vIGlzbid0IHNlZW4sIGFuZCBTaGVsbEV4ZWN1dGUgZmFpbHMgd2l0aCBTRV9FUlJfQUNDRVNTREVOSUVELgotCWludCByZXQgPSAoaW50KVNoZWxsRXhlY3V0ZSgwLCAicnVuYXMiLCBtb2R1bGVuYW1lLCAiIiwgTlVMTCwgCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNXX1NIT1dOT1JNQUwpOwotCWlmIChyZXQgPD0gMzIpIHsKLQkJY2hhciBtc2dbMTI4XTsKLQkJd3NwcmludGYobXNnLCAiRmFpbGVkIHRvIHN0YXJ0IGVsZXZhdGVkIHByb2Nlc3MgKFNoZWxsRXhlY3V0ZSByZXR1cm5lZCAlZCkiLCByZXQpOwotCQlNZXNzYWdlQm94KDAsIG1zZywgIlNldHVwIiwgTUJfT0sgfCBNQl9JQ09ORVJST1IpOwotCX0KKyAgICAvLyBpbnRlcmVzdGluZyBmYWlsdXJlIHNjZW5hcmlvIHRoYXQgaGFzIGJlZW4gc2VlbjogaW5pdGlhbCBleGVjdXRhYmxlCisgICAgLy8gcnVucyBmcm9tIGEgbmV0d29yayBkcml2ZSAtIGJ1dCBvbmNlIGVsZXZhdGVkLCB0aGF0IG5ldHdvcmsgc2hhcmUKKyAgICAvLyBpc24ndCBzZWVuLCBhbmQgU2hlbGxFeGVjdXRlIGZhaWxzIHdpdGggU0VfRVJSX0FDQ0VTU0RFTklFRC4KKyAgICBpbnQgcmV0ID0gKGludClTaGVsbEV4ZWN1dGUoMCwgInJ1bmFzIiwgbW9kdWxlbmFtZSwgIiIsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNXX1NIT1dOT1JNQUwpOworICAgIGlmIChyZXQgPD0gMzIpIHsKKyAgICAgICAgY2hhciBtc2dbMTI4XTsKKyAgICAgICAgd3NwcmludGYobXNnLCAiRmFpbGVkIHRvIHN0YXJ0IGVsZXZhdGVkIHByb2Nlc3MgKFNoZWxsRXhlY3V0ZSByZXR1cm5lZCAlZCkiLCByZXQpOworICAgICAgICBNZXNzYWdlQm94KDAsIG1zZywgIlNldHVwIiwgTUJfT0sgfCBNQl9JQ09ORVJST1IpOworICAgIH0KIH0KIAogaW50IERvSW5zdGFsbCh2b2lkKQogewotCWNoYXIgaW5pX2J1ZmZlcls0MDk2XTsKKyAgICBjaGFyIGluaV9idWZmZXJbNDA5Nl07CiAKLQkvKiBSZWFkIGluc3RhbGxhdGlvbiBpbmZvcm1hdGlvbiAqLwotCUdldFByaXZhdGVQcm9maWxlU3RyaW5nKCJTZXR1cCIsICJ0aXRsZSIsICIiLCBpbmlfYnVmZmVyLAotCQkJCSBzaXplb2YoaW5pX2J1ZmZlciksIGluaV9maWxlKTsKLQl1bmVzY2FwZSh0aXRsZSwgaW5pX2J1ZmZlciwgc2l6ZW9mKHRpdGxlKSk7CisgICAgLyogUmVhZCBpbnN0YWxsYXRpb24gaW5mb3JtYXRpb24gKi8KKyAgICBHZXRQcml2YXRlUHJvZmlsZVN0cmluZygiU2V0dXAiLCAidGl0bGUiLCAiIiwgaW5pX2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGluaV9idWZmZXIpLCBpbmlfZmlsZSk7CisgICAgdW5lc2NhcGUodGl0bGUsIGluaV9idWZmZXIsIHNpemVvZih0aXRsZSkpOwogCi0JR2V0UHJpdmF0ZVByb2ZpbGVTdHJpbmcoIlNldHVwIiwgImluZm8iLCAiIiwgaW5pX2J1ZmZlciwKLQkJCQkgc2l6ZW9mKGluaV9idWZmZXIpLCBpbmlfZmlsZSk7Ci0JdW5lc2NhcGUoaW5mbywgaW5pX2J1ZmZlciwgc2l6ZW9mKGluZm8pKTsKKyAgICBHZXRQcml2YXRlUHJvZmlsZVN0cmluZygiU2V0dXAiLCAiaW5mbyIsICIiLCBpbmlfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoaW5pX2J1ZmZlciksIGluaV9maWxlKTsKKyAgICB1bmVzY2FwZShpbmZvLCBpbmlfYnVmZmVyLCBzaXplb2YoaW5mbykpOwogCi0JR2V0UHJpdmF0ZVByb2ZpbGVTdHJpbmcoIlNldHVwIiwgImJ1aWxkX2luZm8iLCAiIiwgYnVpbGRfaW5mbywKLQkJCQkgc2l6ZW9mKGJ1aWxkX2luZm8pLCBpbmlfZmlsZSk7CisgICAgR2V0UHJpdmF0ZVByb2ZpbGVTdHJpbmcoIlNldHVwIiwgImJ1aWxkX2luZm8iLCAiIiwgYnVpbGRfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGJ1aWxkX2luZm8pLCBpbmlfZmlsZSk7CiAKLQlweWNfY29tcGlsZSA9IEdldFByaXZhdGVQcm9maWxlSW50KCJTZXR1cCIsICJ0YXJnZXRfY29tcGlsZSIsIDEsCi0JCQkJCSAgICBpbmlfZmlsZSk7Ci0JcHlvX2NvbXBpbGUgPSBHZXRQcml2YXRlUHJvZmlsZUludCgiU2V0dXAiLCAidGFyZ2V0X29wdGltaXplIiwgMSwKLQkJCQkJICAgIGluaV9maWxlKTsKKyAgICBweWNfY29tcGlsZSA9IEdldFByaXZhdGVQcm9maWxlSW50KCJTZXR1cCIsICJ0YXJnZXRfY29tcGlsZSIsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pX2ZpbGUpOworICAgIHB5b19jb21waWxlID0gR2V0UHJpdmF0ZVByb2ZpbGVJbnQoIlNldHVwIiwgInRhcmdldF9vcHRpbWl6ZSIsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pX2ZpbGUpOwogCi0JR2V0UHJpdmF0ZVByb2ZpbGVTdHJpbmcoIlNldHVwIiwgInRhcmdldF92ZXJzaW9uIiwgIiIsCi0JCQkJIHRhcmdldF92ZXJzaW9uLCBzaXplb2YodGFyZ2V0X3ZlcnNpb24pLAotCQkJCSBpbmlfZmlsZSk7CisgICAgR2V0UHJpdmF0ZVByb2ZpbGVTdHJpbmcoIlNldHVwIiwgInRhcmdldF92ZXJzaW9uIiwgIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF92ZXJzaW9uLCBzaXplb2YodGFyZ2V0X3ZlcnNpb24pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmlfZmlsZSk7CiAKLQlHZXRQcml2YXRlUHJvZmlsZVN0cmluZygibWV0YWRhdGEiLCAibmFtZSIsICIiLAotCQkJCSBtZXRhX25hbWUsIHNpemVvZihtZXRhX25hbWUpLAotCQkJCSBpbmlfZmlsZSk7CisgICAgR2V0UHJpdmF0ZVByb2ZpbGVTdHJpbmcoIm1ldGFkYXRhIiwgIm5hbWUiLCAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YV9uYW1lLCBzaXplb2YobWV0YV9uYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pX2ZpbGUpOwogCi0JR2V0UHJpdmF0ZVByb2ZpbGVTdHJpbmcoIlNldHVwIiwgImluc3RhbGxfc2NyaXB0IiwgIiIsCi0JCQkJIGluc3RhbGxfc2NyaXB0LCBzaXplb2YoaW5zdGFsbF9zY3JpcHQpLAotCQkJCSBpbmlfZmlsZSk7CisgICAgR2V0UHJpdmF0ZVByb2ZpbGVTdHJpbmcoIlNldHVwIiwgImluc3RhbGxfc2NyaXB0IiwgIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbGxfc2NyaXB0LCBzaXplb2YoaW5zdGFsbF9zY3JpcHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmlfZmlsZSk7CiAKLQlHZXRQcml2YXRlUHJvZmlsZVN0cmluZygiU2V0dXAiLCAidXNlcl9hY2Nlc3NfY29udHJvbCIsICIiLAotCQkJCSB1c2VyX2FjY2Vzc19jb250cm9sLCBzaXplb2YodXNlcl9hY2Nlc3NfY29udHJvbCksIGluaV9maWxlKTsKKyAgICBHZXRQcml2YXRlUHJvZmlsZVN0cmluZygiU2V0dXAiLCAidXNlcl9hY2Nlc3NfY29udHJvbCIsICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyX2FjY2Vzc19jb250cm9sLCBzaXplb2YodXNlcl9hY2Nlc3NfY29udHJvbCksIGluaV9maWxlKTsKIAotCS8vIFNlZSBpZiB3ZSBuZWVkIHRvIGRvIHRoZSBWaXN0YSBVQUMgbWFnaWMuCi0JaWYgKHN0cmNtcCh1c2VyX2FjY2Vzc19jb250cm9sLCAiZm9yY2UiKT09MCkgewotCQlpZiAoUGxhdGZvcm1TdXBwb3J0c1VBQygpICYmICFNeUlzVXNlckFuQWRtaW4oKSkgewotCQkJU3Bhd25VQUMoKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JCS8vIGFscmVhZHkgYWRtaW4gLSBrZWVwIGdvaW5nCi0JfSBlbHNlIGlmIChzdHJjbXAodXNlcl9hY2Nlc3NfY29udHJvbCwgImF1dG8iKT09MCkgewotCQkvLyBDaGVjayBpZiBpdCBsb29rcyBsaWtlIHdlIG5lZWQgVUFDIGNvbnRyb2wsIGJhc2VkCi0JCS8vIG9uIGhvdyBQeXRob24gaXRzZWxmIHdhcyBpbnN0YWxsZWQuCi0JCWlmIChQbGF0Zm9ybVN1cHBvcnRzVUFDKCkgJiYgIU15SXNVc2VyQW5BZG1pbigpICYmIE5lZWRBdXRvVUFDKCkpIHsKLQkJCVNwYXduVUFDKCk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0gZWxzZSB7Ci0JCS8vIGRpc3BsYXkgYSB3YXJuaW5nIGFib3V0IHVua25vd24gdmFsdWVzIC0gb25seSB0aGUgZGV2ZWxvcGVyCi0JCS8vIG9mIHRoZSBleHRlbnNpb24gd2lsbCBzZWUgaXQgKHVudGlsIHRoZXkgZml4IGl0ISkKLQkJaWYgKHVzZXJfYWNjZXNzX2NvbnRyb2xbMF0gJiYgc3RyY21wKHVzZXJfYWNjZXNzX2NvbnRyb2wsICJub25lIikgIT0gMCkgewotCQkJTWVzc2FnZUJveChHZXRGb2N1cygpLCAiQmFkIHVzZXJfYWNjZXNzX2NvbnRyb2wgdmFsdWUiLCAib29wcyIsIE1CX09LKTsKLQkJLy8gbm90aGluZyB0byBkby4KLQkJfQotCX0KKyAgICAvLyBTZWUgaWYgd2UgbmVlZCB0byBkbyB0aGUgVmlzdGEgVUFDIG1hZ2ljLgorICAgIGlmIChzdHJjbXAodXNlcl9hY2Nlc3NfY29udHJvbCwgImZvcmNlIik9PTApIHsKKyAgICAgICAgaWYgKFBsYXRmb3JtU3VwcG9ydHNVQUMoKSAmJiAhTXlJc1VzZXJBbkFkbWluKCkpIHsKKyAgICAgICAgICAgIFNwYXduVUFDKCk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICAvLyBhbHJlYWR5IGFkbWluIC0ga2VlcCBnb2luZworICAgIH0gZWxzZSBpZiAoc3RyY21wKHVzZXJfYWNjZXNzX2NvbnRyb2wsICJhdXRvIik9PTApIHsKKyAgICAgICAgLy8gQ2hlY2sgaWYgaXQgbG9va3MgbGlrZSB3ZSBuZWVkIFVBQyBjb250cm9sLCBiYXNlZAorICAgICAgICAvLyBvbiBob3cgUHl0aG9uIGl0c2VsZiB3YXMgaW5zdGFsbGVkLgorICAgICAgICBpZiAoUGxhdGZvcm1TdXBwb3J0c1VBQygpICYmICFNeUlzVXNlckFuQWRtaW4oKSAmJiBOZWVkQXV0b1VBQygpKSB7CisgICAgICAgICAgICBTcGF3blVBQygpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvLyBkaXNwbGF5IGEgd2FybmluZyBhYm91dCB1bmtub3duIHZhbHVlcyAtIG9ubHkgdGhlIGRldmVsb3BlcgorICAgICAgICAvLyBvZiB0aGUgZXh0ZW5zaW9uIHdpbGwgc2VlIGl0ICh1bnRpbCB0aGV5IGZpeCBpdCEpCisgICAgICAgIGlmICh1c2VyX2FjY2Vzc19jb250cm9sWzBdICYmIHN0cmNtcCh1c2VyX2FjY2Vzc19jb250cm9sLCAibm9uZSIpICE9IDApIHsKKyAgICAgICAgICAgIE1lc3NhZ2VCb3goR2V0Rm9jdXMoKSwgIkJhZCB1c2VyX2FjY2Vzc19jb250cm9sIHZhbHVlIiwgIm9vcHMiLCBNQl9PSyk7CisgICAgICAgIC8vIG5vdGhpbmcgdG8gZG8uCisgICAgICAgIH0KKyAgICB9CiAKLQlod25kTWFpbiA9IENyZWF0ZUJhY2tncm91bmQodGl0bGUpOworICAgIGh3bmRNYWluID0gQ3JlYXRlQmFja2dyb3VuZCh0aXRsZSk7CiAKLQlSdW5XaXphcmQoaHduZE1haW4pOworICAgIFJ1bldpemFyZChod25kTWFpbik7CiAKLQkvKiBDbGVhbiB1cCAqLwotCVVubWFwVmlld09mRmlsZShhcmNfZGF0YSk7Ci0JaWYgKGluaV9maWxlKQotCQlEZWxldGVGaWxlKGluaV9maWxlKTsKKyAgICAvKiBDbGVhbiB1cCAqLworICAgIFVubWFwVmlld09mRmlsZShhcmNfZGF0YSk7CisgICAgaWYgKGluaV9maWxlKQorICAgICAgICBEZWxldGVGaWxlKGluaV9maWxlKTsKIAotCWlmIChoQml0bWFwKQotCQlEZWxldGVPYmplY3QoaEJpdG1hcCk7CisgICAgaWYgKGhCaXRtYXApCisgICAgICAgIERlbGV0ZU9iamVjdChoQml0bWFwKTsKIAotCXJldHVybiAwOworICAgIHJldHVybiAwOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKiogdW5pbnN0YWxsIHNlY3Rpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgaW50IGNvbXBhcmUoY29uc3Qgdm9pZCAqcDEsIGNvbnN0IHZvaWQgKnAyKQogewotCXJldHVybiBzdHJjbXAoKihjaGFyICoqKXAyLCAqKGNoYXIgKiopcDEpOworICAgIHJldHVybiBzdHJjbXAoKihjaGFyICoqKXAyLCAqKGNoYXIgKiopcDEpOwogfQogCiAvKgpAQCAtMjI4MiwzNzkgKzIyODIsMzc5IEBACiAgKi8KIHZvaWQgcmVtb3ZlX2V4ZSh2b2lkKQogewotCWNoYXIgZXhlbmFtZVtfTUFYX1BBVEhdOwotCWNoYXIgYmF0bmFtZVtfTUFYX1BBVEhdOwotCUZJTEUgKmZwOwotCVNUQVJUVVBJTkZPIHNpOwotCVBST0NFU1NfSU5GT1JNQVRJT04gcGk7CisgICAgY2hhciBleGVuYW1lW19NQVhfUEFUSF07CisgICAgY2hhciBiYXRuYW1lW19NQVhfUEFUSF07CisgICAgRklMRSAqZnA7CisgICAgU1RBUlRVUElORk8gc2k7CisgICAgUFJPQ0VTU19JTkZPUk1BVElPTiBwaTsKIAotCUdldE1vZHVsZUZpbGVOYW1lKE5VTEwsIGV4ZW5hbWUsIHNpemVvZihleGVuYW1lKSk7Ci0Jc3ByaW50ZihiYXRuYW1lLCAiJXMuYmF0IiwgZXhlbmFtZSk7Ci0JZnAgPSBmb3BlbihiYXRuYW1lLCAidyIpOwotCWZwcmludGYoZnAsICI6UmVwZWF0XG4iKTsKLQlmcHJpbnRmKGZwLCAiZGVsIFwiJXNcIlxuIiwgZXhlbmFtZSk7Ci0JZnByaW50ZihmcCwgImlmIGV4aXN0IFwiJXNcIiBnb3RvIFJlcGVhdFxuIiwgZXhlbmFtZSk7Ci0JZnByaW50ZihmcCwgImRlbCBcIiVzXCJcbiIsIGJhdG5hbWUpOwotCWZjbG9zZShmcCk7Ci0gICAgCi0JWmVyb01lbW9yeSgmc2ksIHNpemVvZihzaSkpOwotCXNpLmNiID0gc2l6ZW9mKHNpKTsKLQlzaS5kd0ZsYWdzID0gU1RBUlRGX1VTRVNIT1dXSU5ET1c7Ci0Jc2kud1Nob3dXaW5kb3cgPSBTV19ISURFOwotCWlmIChDcmVhdGVQcm9jZXNzKE5VTEwsCi0JCQkgIGJhdG5hbWUsCi0JCQkgIE5VTEwsCi0JCQkgIE5VTEwsCi0JCQkgIEZBTFNFLAotCQkJICBDUkVBVEVfU1VTUEVOREVEIHwgSURMRV9QUklPUklUWV9DTEFTUywKLQkJCSAgTlVMTCwKLQkJCSAgIlxcIiwKLQkJCSAgJnNpLAotCQkJICAmcGkpKSB7Ci0JCVNldFRocmVhZFByaW9yaXR5KHBpLmhUaHJlYWQsIFRIUkVBRF9QUklPUklUWV9JRExFKTsKLQkJU2V0VGhyZWFkUHJpb3JpdHkoR2V0Q3VycmVudFRocmVhZCgpLCBUSFJFQURfUFJJT1JJVFlfVElNRV9DUklUSUNBTCk7Ci0JCVNldFByaW9yaXR5Q2xhc3MoR2V0Q3VycmVudFByb2Nlc3MoKSwgSElHSF9QUklPUklUWV9DTEFTUyk7Ci0JCUNsb3NlSGFuZGxlKHBpLmhQcm9jZXNzKTsKLQkJUmVzdW1lVGhyZWFkKHBpLmhUaHJlYWQpOwotCQlDbG9zZUhhbmRsZShwaS5oVGhyZWFkKTsKLQl9CisgICAgR2V0TW9kdWxlRmlsZU5hbWUoTlVMTCwgZXhlbmFtZSwgc2l6ZW9mKGV4ZW5hbWUpKTsKKyAgICBzcHJpbnRmKGJhdG5hbWUsICIlcy5iYXQiLCBleGVuYW1lKTsKKyAgICBmcCA9IGZvcGVuKGJhdG5hbWUsICJ3Iik7CisgICAgZnByaW50ZihmcCwgIjpSZXBlYXRcbiIpOworICAgIGZwcmludGYoZnAsICJkZWwgXCIlc1wiXG4iLCBleGVuYW1lKTsKKyAgICBmcHJpbnRmKGZwLCAiaWYgZXhpc3QgXCIlc1wiIGdvdG8gUmVwZWF0XG4iLCBleGVuYW1lKTsKKyAgICBmcHJpbnRmKGZwLCAiZGVsIFwiJXNcIlxuIiwgYmF0bmFtZSk7CisgICAgZmNsb3NlKGZwKTsKKworICAgIFplcm9NZW1vcnkoJnNpLCBzaXplb2Yoc2kpKTsKKyAgICBzaS5jYiA9IHNpemVvZihzaSk7CisgICAgc2kuZHdGbGFncyA9IFNUQVJURl9VU0VTSE9XV0lORE9XOworICAgIHNpLndTaG93V2luZG93ID0gU1dfSElERTsKKyAgICBpZiAoQ3JlYXRlUHJvY2VzcyhOVUxMLAorICAgICAgICAgICAgICAgICAgICAgIGJhdG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgIEZBTFNFLAorICAgICAgICAgICAgICAgICAgICAgIENSRUFURV9TVVNQRU5ERUQgfCBJRExFX1BSSU9SSVRZX0NMQVNTLAorICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgIlxcIiwKKyAgICAgICAgICAgICAgICAgICAgICAmc2ksCisgICAgICAgICAgICAgICAgICAgICAgJnBpKSkgeworICAgICAgICBTZXRUaHJlYWRQcmlvcml0eShwaS5oVGhyZWFkLCBUSFJFQURfUFJJT1JJVFlfSURMRSk7CisgICAgICAgIFNldFRocmVhZFByaW9yaXR5KEdldEN1cnJlbnRUaHJlYWQoKSwgVEhSRUFEX1BSSU9SSVRZX1RJTUVfQ1JJVElDQUwpOworICAgICAgICBTZXRQcmlvcml0eUNsYXNzKEdldEN1cnJlbnRQcm9jZXNzKCksIEhJR0hfUFJJT1JJVFlfQ0xBU1MpOworICAgICAgICBDbG9zZUhhbmRsZShwaS5oUHJvY2Vzcyk7CisgICAgICAgIFJlc3VtZVRocmVhZChwaS5oVGhyZWFkKTsKKyAgICAgICAgQ2xvc2VIYW5kbGUocGkuaFRocmVhZCk7CisgICAgfQogfQogCiB2b2lkIERlbGV0ZVJlZ2lzdHJ5S2V5KGNoYXIgKnN0cmluZykKIHsKLQljaGFyICprZXluYW1lOwotCWNoYXIgKnN1YmtleW5hbWU7Ci0JY2hhciAqZGVsaW07Ci0JSEtFWSBoS2V5OwotCWxvbmcgcmVzdWx0OwotCWNoYXIgKmxpbmU7CisgICAgY2hhciAqa2V5bmFtZTsKKyAgICBjaGFyICpzdWJrZXluYW1lOworICAgIGNoYXIgKmRlbGltOworICAgIEhLRVkgaEtleTsKKyAgICBsb25nIHJlc3VsdDsKKyAgICBjaGFyICpsaW5lOwogCi0JbGluZSA9IHN0cmR1cChzdHJpbmcpOyAvKiBzbyB3ZSBjYW4gY2hhbmdlIGl0ICovCisgICAgbGluZSA9IHN0cmR1cChzdHJpbmcpOyAvKiBzbyB3ZSBjYW4gY2hhbmdlIGl0ICovCiAKLQlrZXluYW1lID0gc3RyY2hyKGxpbmUsICdbJyk7Ci0JaWYgKCFrZXluYW1lKQotCQlyZXR1cm47Ci0JKytrZXluYW1lOworICAgIGtleW5hbWUgPSBzdHJjaHIobGluZSwgJ1snKTsKKyAgICBpZiAoIWtleW5hbWUpCisgICAgICAgIHJldHVybjsKKyAgICArK2tleW5hbWU7CiAKLQlzdWJrZXluYW1lID0gc3RyY2hyKGtleW5hbWUsICddJyk7Ci0JaWYgKCFzdWJrZXluYW1lKQotCQlyZXR1cm47Ci0JKnN1YmtleW5hbWUrKz0nXDAnOwotCWRlbGltID0gc3RyY2hyKHN1YmtleW5hbWUsICdcbicpOwotCWlmIChkZWxpbSkKLQkJKmRlbGltID0gJ1wwJzsKKyAgICBzdWJrZXluYW1lID0gc3RyY2hyKGtleW5hbWUsICddJyk7CisgICAgaWYgKCFzdWJrZXluYW1lKQorICAgICAgICByZXR1cm47CisgICAgKnN1YmtleW5hbWUrKz0nXDAnOworICAgIGRlbGltID0gc3RyY2hyKHN1YmtleW5hbWUsICdcbicpOworICAgIGlmIChkZWxpbSkKKyAgICAgICAgKmRlbGltID0gJ1wwJzsKIAotCXJlc3VsdCA9IFJlZ09wZW5LZXlFeChoa2V5X3Jvb3QsCi0JCQkgICAgICBrZXluYW1lLAotCQkJICAgICAgMCwKLQkJCSAgICAgIEtFWV9XUklURSwKLQkJCSAgICAgICZoS2V5KTsKLSAgICAKLQlpZiAocmVzdWx0ICE9IEVSUk9SX1NVQ0NFU1MpCi0JCU1lc3NhZ2VCb3goR2V0Rm9jdXMoKSwgc3RyaW5nLCAiQ291bGQgbm90IG9wZW4ga2V5IiwgTUJfT0spOwotCWVsc2UgewotCQlyZXN1bHQgPSBSZWdEZWxldGVLZXkoaEtleSwgc3Via2V5bmFtZSk7Ci0JCWlmIChyZXN1bHQgIT0gRVJST1JfU1VDQ0VTUyAmJiByZXN1bHQgIT0gRVJST1JfRklMRV9OT1RfRk9VTkQpCi0JCQlNZXNzYWdlQm94KEdldEZvY3VzKCksIHN0cmluZywgIkNvdWxkIG5vdCBkZWxldGUga2V5IiwgTUJfT0spOwotCQlSZWdDbG9zZUtleShoS2V5KTsKLQl9Ci0JZnJlZShsaW5lKTsKKyAgICByZXN1bHQgPSBSZWdPcGVuS2V5RXgoaGtleV9yb290LAorICAgICAgICAgICAgICAgICAgICAgICAgICBrZXluYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBLRVlfV1JJVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZoS2V5KTsKKworICAgIGlmIChyZXN1bHQgIT0gRVJST1JfU1VDQ0VTUykKKyAgICAgICAgTWVzc2FnZUJveChHZXRGb2N1cygpLCBzdHJpbmcsICJDb3VsZCBub3Qgb3BlbiBrZXkiLCBNQl9PSyk7CisgICAgZWxzZSB7CisgICAgICAgIHJlc3VsdCA9IFJlZ0RlbGV0ZUtleShoS2V5LCBzdWJrZXluYW1lKTsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBFUlJPUl9TVUNDRVNTICYmIHJlc3VsdCAhPSBFUlJPUl9GSUxFX05PVF9GT1VORCkKKyAgICAgICAgICAgIE1lc3NhZ2VCb3goR2V0Rm9jdXMoKSwgc3RyaW5nLCAiQ291bGQgbm90IGRlbGV0ZSBrZXkiLCBNQl9PSyk7CisgICAgICAgIFJlZ0Nsb3NlS2V5KGhLZXkpOworICAgIH0KKyAgICBmcmVlKGxpbmUpOwogfQogCiB2b2lkIERlbGV0ZVJlZ2lzdHJ5VmFsdWUoY2hhciAqc3RyaW5nKQogewotCWNoYXIgKmtleW5hbWU7Ci0JY2hhciAqdmFsdWVuYW1lOwotCWNoYXIgKnZhbHVlOwotCUhLRVkgaEtleTsKLQlsb25nIHJlc3VsdDsKLQljaGFyICpsaW5lOworICAgIGNoYXIgKmtleW5hbWU7CisgICAgY2hhciAqdmFsdWVuYW1lOworICAgIGNoYXIgKnZhbHVlOworICAgIEhLRVkgaEtleTsKKyAgICBsb25nIHJlc3VsdDsKKyAgICBjaGFyICpsaW5lOwogCi0JbGluZSA9IHN0cmR1cChzdHJpbmcpOyAvKiBzbyB3ZSBjYW4gY2hhbmdlIGl0ICovCisgICAgbGluZSA9IHN0cmR1cChzdHJpbmcpOyAvKiBzbyB3ZSBjYW4gY2hhbmdlIGl0ICovCiAKIC8qIEZvcm1hdCBpcyAnUmVnIERCIFZhbHVlOiBba2V5XW5hbWU9dmFsdWUnICovCi0Ja2V5bmFtZSA9IHN0cmNocihsaW5lLCAnWycpOwotCWlmICgha2V5bmFtZSkKLQkJcmV0dXJuOwotCSsra2V5bmFtZTsKLQl2YWx1ZW5hbWUgPSBzdHJjaHIoa2V5bmFtZSwgJ10nKTsKLQlpZiAoIXZhbHVlbmFtZSkKLQkJcmV0dXJuOwotCSp2YWx1ZW5hbWUrKyA9ICdcMCc7Ci0JdmFsdWUgPSBzdHJjaHIodmFsdWVuYW1lLCAnPScpOwotCWlmICghdmFsdWUpCi0JCXJldHVybjsKKyAgICBrZXluYW1lID0gc3RyY2hyKGxpbmUsICdbJyk7CisgICAgaWYgKCFrZXluYW1lKQorICAgICAgICByZXR1cm47CisgICAgKytrZXluYW1lOworICAgIHZhbHVlbmFtZSA9IHN0cmNocihrZXluYW1lLCAnXScpOworICAgIGlmICghdmFsdWVuYW1lKQorICAgICAgICByZXR1cm47CisgICAgKnZhbHVlbmFtZSsrID0gJ1wwJzsKKyAgICB2YWx1ZSA9IHN0cmNocih2YWx1ZW5hbWUsICc9Jyk7CisgICAgaWYgKCF2YWx1ZSkKKyAgICAgICAgcmV0dXJuOwogCi0JKnZhbHVlKysgPSAnXDAnOworICAgICp2YWx1ZSsrID0gJ1wwJzsKIAotCXJlc3VsdCA9IFJlZ09wZW5LZXlFeChoa2V5X3Jvb3QsCi0JCQkgICAgICBrZXluYW1lLAotCQkJICAgICAgMCwKLQkJCSAgICAgIEtFWV9XUklURSwKLQkJCSAgICAgICZoS2V5KTsKLQlpZiAocmVzdWx0ICE9IEVSUk9SX1NVQ0NFU1MpCi0JCU1lc3NhZ2VCb3goR2V0Rm9jdXMoKSwgc3RyaW5nLCAiQ291bGQgbm90IG9wZW4ga2V5IiwgTUJfT0spOwotCWVsc2UgewotCQlyZXN1bHQgPSBSZWdEZWxldGVWYWx1ZShoS2V5LCB2YWx1ZW5hbWUpOwotCQlpZiAocmVzdWx0ICE9IEVSUk9SX1NVQ0NFU1MgJiYgcmVzdWx0ICE9IEVSUk9SX0ZJTEVfTk9UX0ZPVU5EKQotCQkJTWVzc2FnZUJveChHZXRGb2N1cygpLCBzdHJpbmcsICJDb3VsZCBub3QgZGVsZXRlIHZhbHVlIiwgTUJfT0spOwotCQlSZWdDbG9zZUtleShoS2V5KTsKLQl9Ci0JZnJlZShsaW5lKTsKKyAgICByZXN1bHQgPSBSZWdPcGVuS2V5RXgoaGtleV9yb290LAorICAgICAgICAgICAgICAgICAgICAgICAgICBrZXluYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBLRVlfV1JJVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZoS2V5KTsKKyAgICBpZiAocmVzdWx0ICE9IEVSUk9SX1NVQ0NFU1MpCisgICAgICAgIE1lc3NhZ2VCb3goR2V0Rm9jdXMoKSwgc3RyaW5nLCAiQ291bGQgbm90IG9wZW4ga2V5IiwgTUJfT0spOworICAgIGVsc2UgeworICAgICAgICByZXN1bHQgPSBSZWdEZWxldGVWYWx1ZShoS2V5LCB2YWx1ZW5hbWUpOworICAgICAgICBpZiAocmVzdWx0ICE9IEVSUk9SX1NVQ0NFU1MgJiYgcmVzdWx0ICE9IEVSUk9SX0ZJTEVfTk9UX0ZPVU5EKQorICAgICAgICAgICAgTWVzc2FnZUJveChHZXRGb2N1cygpLCBzdHJpbmcsICJDb3VsZCBub3QgZGVsZXRlIHZhbHVlIiwgTUJfT0spOworICAgICAgICBSZWdDbG9zZUtleShoS2V5KTsKKyAgICB9CisgICAgZnJlZShsaW5lKTsKIH0KIAogQk9PTCBNeURlbGV0ZUZpbGUoY2hhciAqbGluZSkKIHsKLQljaGFyICpwYXRobmFtZSA9IHN0cmNocihsaW5lLCAnOicpOwotCWlmICghcGF0aG5hbWUpCi0JCXJldHVybiBGQUxTRTsKLQkrK3BhdGhuYW1lOwotCXdoaWxlIChpc3NwYWNlKCpwYXRobmFtZSkpCi0JCSsrcGF0aG5hbWU7Ci0JcmV0dXJuIERlbGV0ZUZpbGUocGF0aG5hbWUpOworICAgIGNoYXIgKnBhdGhuYW1lID0gc3RyY2hyKGxpbmUsICc6Jyk7CisgICAgaWYgKCFwYXRobmFtZSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICsrcGF0aG5hbWU7CisgICAgd2hpbGUgKGlzc3BhY2UoKnBhdGhuYW1lKSkKKyAgICAgICAgKytwYXRobmFtZTsKKyAgICByZXR1cm4gRGVsZXRlRmlsZShwYXRobmFtZSk7CiB9CiAKIEJPT0wgTXlSZW1vdmVEaXJlY3RvcnkoY2hhciAqbGluZSkKIHsKLQljaGFyICpwYXRobmFtZSA9IHN0cmNocihsaW5lLCAnOicpOwotCWlmICghcGF0aG5hbWUpCi0JCXJldHVybiBGQUxTRTsKLQkrK3BhdGhuYW1lOwotCXdoaWxlIChpc3NwYWNlKCpwYXRobmFtZSkpCi0JCSsrcGF0aG5hbWU7Ci0JcmV0dXJuIFJlbW92ZURpcmVjdG9yeShwYXRobmFtZSk7CisgICAgY2hhciAqcGF0aG5hbWUgPSBzdHJjaHIobGluZSwgJzonKTsKKyAgICBpZiAoIXBhdGhuYW1lKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgKytwYXRobmFtZTsKKyAgICB3aGlsZSAoaXNzcGFjZSgqcGF0aG5hbWUpKQorICAgICAgICArK3BhdGhuYW1lOworICAgIHJldHVybiBSZW1vdmVEaXJlY3RvcnkocGF0aG5hbWUpOwogfQogCiBCT09MIFJ1bl9SZW1vdmVTY3JpcHQoY2hhciAqbGluZSkKIHsKLQljaGFyICpkbGxuYW1lOwotCWNoYXIgKnNjcmlwdG5hbWU7Ci0Jc3RhdGljIGNoYXIgbGFzdHNjcmlwdFtNQVhfUEFUSF07CisgICAgY2hhciAqZGxsbmFtZTsKKyAgICBjaGFyICpzY3JpcHRuYW1lOworICAgIHN0YXRpYyBjaGFyIGxhc3RzY3JpcHRbTUFYX1BBVEhdOwogCiAvKiBGb3JtYXQgaXMgJ1J1biBTY3JpcHRzOiBbcHl0aG9uZGxsXXNjcmlwdG5hbWUnICovCiAvKiBYWFggQ3VycmVudGx5LCBweXRob25kbGwgY2FycmllcyBubyBwYXRoISEhICovCi0JZGxsbmFtZSA9IHN0cmNocihsaW5lLCAnWycpOwotCWlmICghZGxsbmFtZSkKLQkJcmV0dXJuIEZBTFNFOwotCSsrZGxsbmFtZTsKLQlzY3JpcHRuYW1lID0gc3RyY2hyKGRsbG5hbWUsICddJyk7Ci0JaWYgKCFzY3JpcHRuYW1lKQotCQlyZXR1cm4gRkFMU0U7Ci0JKnNjcmlwdG5hbWUrKyA9ICdcMCc7Ci0JLyogdGhpcyBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIG1vcmUgdGhhbiBvbmUgdGltZSB3aXRoIHRoZSBzYW1lCi0JICAgc2NyaXB0LCBvbmx5IHJ1biBpdCBvbmUgdGltZSAqLwotCWlmIChzdHJjbXAobGFzdHNjcmlwdCwgc2NyaXB0bmFtZSkpIHsKLQkJY2hhciAqYXJndlszXSA9IHtOVUxMLCAiLXJlbW92ZSIsIE5VTEx9OwotCQljaGFyICpidWZmZXIgPSBOVUxMOworICAgIGRsbG5hbWUgPSBzdHJjaHIobGluZSwgJ1snKTsKKyAgICBpZiAoIWRsbG5hbWUpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICArK2RsbG5hbWU7CisgICAgc2NyaXB0bmFtZSA9IHN0cmNocihkbGxuYW1lLCAnXScpOworICAgIGlmICghc2NyaXB0bmFtZSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICpzY3JpcHRuYW1lKysgPSAnXDAnOworICAgIC8qIHRoaXMgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCBtb3JlIHRoYW4gb25lIHRpbWUgd2l0aCB0aGUgc2FtZQorICAgICAgIHNjcmlwdCwgb25seSBydW4gaXQgb25lIHRpbWUgKi8KKyAgICBpZiAoc3RyY21wKGxhc3RzY3JpcHQsIHNjcmlwdG5hbWUpKSB7CisgICAgICAgIGNoYXIgKmFyZ3ZbM10gPSB7TlVMTCwgIi1yZW1vdmUiLCBOVUxMfTsKKyAgICAgICAgY2hhciAqYnVmZmVyID0gTlVMTDsKIAotCQlhcmd2WzBdID0gc2NyaXB0bmFtZTsKKyAgICAgICAgYXJndlswXSA9IHNjcmlwdG5hbWU7CiAKLQkJaWYgKDAgIT0gcnVuX2luc3RhbGxzY3JpcHQoc2NyaXB0bmFtZSwgMiwgYXJndiwgJmJ1ZmZlcikpCi0JCQlmcHJpbnRmKHN0ZGVyciwgIioqKiBDb3VsZCBub3QgcnVuIGluc3RhbGxhdGlvbiBzY3JpcHQgKioqIik7CisgICAgICAgIGlmICgwICE9IHJ1bl9pbnN0YWxsc2NyaXB0KHNjcmlwdG5hbWUsIDIsIGFyZ3YsICZidWZmZXIpKQorICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIqKiogQ291bGQgbm90IHJ1biBpbnN0YWxsYXRpb24gc2NyaXB0ICoqKiIpOwogCi0JCWlmIChidWZmZXIgJiYgYnVmZmVyWzBdKQotCQkJTWVzc2FnZUJveChHZXRGb2N1cygpLCBidWZmZXIsICJ1bmluc3RhbGwtc2NyaXB0IiwgTUJfT0spOwotCQlmcmVlKGJ1ZmZlcik7CisgICAgICAgIGlmIChidWZmZXIgJiYgYnVmZmVyWzBdKQorICAgICAgICAgICAgTWVzc2FnZUJveChHZXRGb2N1cygpLCBidWZmZXIsICJ1bmluc3RhbGwtc2NyaXB0IiwgTUJfT0spOworICAgICAgICBmcmVlKGJ1ZmZlcik7CiAKLQkJc3RyY3B5KGxhc3RzY3JpcHQsIHNjcmlwdG5hbWUpOwotCX0KLQlyZXR1cm4gVFJVRTsKKyAgICAgICAgc3RyY3B5KGxhc3RzY3JpcHQsIHNjcmlwdG5hbWUpOworICAgIH0KKyAgICByZXR1cm4gVFJVRTsKIH0KIAogaW50IERvVW5pbnN0YWxsKGludCBhcmdjLCBjaGFyICoqYXJndikKIHsKLQlGSUxFICpsb2dmaWxlOwotCWNoYXIgYnVmZmVyWzQwOTZdOwotCWludCBuTGluZXMgPSAwOwotCWludCBpOwotCWNoYXIgKmNwOwotCWludCBuRmlsZXMgPSAwOwotCWludCBuRGlycyA9IDA7Ci0JaW50IG5FcnJvcnMgPSAwOwotCWNoYXIgKipsaW5lczsKLQlpbnQgbGluZXNfYnVmZmVyX3NpemUgPSAxMDsKLSAgICAKLQlpZiAoYXJnYyAhPSAzKSB7Ci0JCU1lc3NhZ2VCb3goTlVMTCwKLQkJCSAgICJXcm9uZyBudW1iZXIgb2YgYXJncyIsCi0JCQkgICBOVUxMLAotCQkJICAgTUJfT0spOwotCQlyZXR1cm4gMTsgLyogRXJyb3IgKi8KLQl9Ci0JaWYgKHN0cmNtcChhcmd2WzFdLCAiLXUiKSkgewotCQlNZXNzYWdlQm94KE5VTEwsCi0JCQkgICAiMi4gYXJnIGlzIG5vdCAtdSIsCi0JCQkgICBOVUxMLAotCQkJICAgTUJfT0spOwotCQlyZXR1cm4gMTsgLyogRXJyb3IgKi8KLQl9CisgICAgRklMRSAqbG9nZmlsZTsKKyAgICBjaGFyIGJ1ZmZlcls0MDk2XTsKKyAgICBpbnQgbkxpbmVzID0gMDsKKyAgICBpbnQgaTsKKyAgICBjaGFyICpjcDsKKyAgICBpbnQgbkZpbGVzID0gMDsKKyAgICBpbnQgbkRpcnMgPSAwOworICAgIGludCBuRXJyb3JzID0gMDsKKyAgICBjaGFyICoqbGluZXM7CisgICAgaW50IGxpbmVzX2J1ZmZlcl9zaXplID0gMTA7CiAKLQlsb2dmaWxlID0gZm9wZW4oYXJndlsyXSwgInIiKTsKLQlpZiAoIWxvZ2ZpbGUpIHsKLQkJTWVzc2FnZUJveChOVUxMLAotCQkJICAgImNvdWxkIG5vdCBvcGVuIGxvZ2ZpbGUiLAotCQkJICAgTlVMTCwKLQkJCSAgIE1CX09LKTsKLQkJcmV0dXJuIDE7IC8qIEVycm9yICovCi0JfQotICAgIAotCWxpbmVzID0gKGNoYXIgKiopbWFsbG9jKHNpemVvZihjaGFyICopICogbGluZXNfYnVmZmVyX3NpemUpOwotCWlmICghbGluZXMpCi0JCXJldHVybiBTeXN0ZW1FcnJvcigwLCAiT3V0IG9mIG1lbW9yeSIpOworICAgIGlmIChhcmdjICE9IDMpIHsKKyAgICAgICAgTWVzc2FnZUJveChOVUxMLAorICAgICAgICAgICAgICAgICAgICJXcm9uZyBudW1iZXIgb2YgYXJncyIsCisgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICBNQl9PSyk7CisgICAgICAgIHJldHVybiAxOyAvKiBFcnJvciAqLworICAgIH0KKyAgICBpZiAoc3RyY21wKGFyZ3ZbMV0sICItdSIpKSB7CisgICAgICAgIE1lc3NhZ2VCb3goTlVMTCwKKyAgICAgICAgICAgICAgICAgICAiMi4gYXJnIGlzIG5vdCAtdSIsCisgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICBNQl9PSyk7CisgICAgICAgIHJldHVybiAxOyAvKiBFcnJvciAqLworICAgIH0KIAotCS8qIFJlYWQgdGhlIHdob2xlIGxvZ2ZpbGUsIHJlYWxsb2FjdGluZyB0aGUgYnVmZmVyICovCi0Jd2hpbGUgKGZnZXRzKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksIGxvZ2ZpbGUpKSB7Ci0JCWludCBsZW4gPSBzdHJsZW4oYnVmZmVyKTsKLQkJLyogcmVtb3ZlIHRyYWlsaW5nIHdoaXRlIHNwYWNlICovCi0JCXdoaWxlIChpc3NwYWNlKGJ1ZmZlcltsZW4tMV0pKQotCQkJbGVuIC09IDE7Ci0JCWJ1ZmZlcltsZW5dID0gJ1wwJzsKLQkJbGluZXNbbkxpbmVzKytdID0gc3RyZHVwKGJ1ZmZlcik7Ci0JCWlmIChuTGluZXMgPj0gbGluZXNfYnVmZmVyX3NpemUpIHsKLQkJCWxpbmVzX2J1ZmZlcl9zaXplICs9IDEwOwotCQkJbGluZXMgPSAoY2hhciAqKilyZWFsbG9jKGxpbmVzLAotCQkJCQkJIHNpemVvZihjaGFyICopICogbGluZXNfYnVmZmVyX3NpemUpOwotCQkJaWYgKCFsaW5lcykKLQkJCQlyZXR1cm4gU3lzdGVtRXJyb3IoMCwgIk91dCBvZiBtZW1vcnkiKTsKLQkJfQotCX0KLQlmY2xvc2UobG9nZmlsZSk7CisgICAgbG9nZmlsZSA9IGZvcGVuKGFyZ3ZbMl0sICJyIik7CisgICAgaWYgKCFsb2dmaWxlKSB7CisgICAgICAgIE1lc3NhZ2VCb3goTlVMTCwKKyAgICAgICAgICAgICAgICAgICAiY291bGQgbm90IG9wZW4gbG9nZmlsZSIsCisgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICBNQl9PSyk7CisgICAgICAgIHJldHVybiAxOyAvKiBFcnJvciAqLworICAgIH0KIAotCS8qIFNvcnQgYWxsIHRoZSBsaW5lcywgc28gdGhhdCBoaWdoZXN0IDMtZGlnaXQgY29kZXMgYXJlIGZpcnN0ICovCi0JcXNvcnQoJmxpbmVzWzBdLCBuTGluZXMsIHNpemVvZihjaGFyICopLAotCSAgICAgIGNvbXBhcmUpOworICAgIGxpbmVzID0gKGNoYXIgKiopbWFsbG9jKHNpemVvZihjaGFyICopICogbGluZXNfYnVmZmVyX3NpemUpOworICAgIGlmICghbGluZXMpCisgICAgICAgIHJldHVybiBTeXN0ZW1FcnJvcigwLCAiT3V0IG9mIG1lbW9yeSIpOwogCi0JaWYgKElEWUVTICE9IE1lc3NhZ2VCb3goTlVMTCwKLQkJCQkiQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIHJlbW92ZVxuIgotCQkJCSJ0aGlzIHBhY2thZ2UgZnJvbSB5b3VyIGNvbXB1dGVyPyIsCi0JCQkJIlBsZWFzZSBjb25maXJtIiwKLQkJCQlNQl9ZRVNOTyB8IE1CX0lDT05RVUVTVElPTikpCi0JCXJldHVybiAwOworICAgIC8qIFJlYWQgdGhlIHdob2xlIGxvZ2ZpbGUsIHJlYWxsb2FjdGluZyB0aGUgYnVmZmVyICovCisgICAgd2hpbGUgKGZnZXRzKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksIGxvZ2ZpbGUpKSB7CisgICAgICAgIGludCBsZW4gPSBzdHJsZW4oYnVmZmVyKTsKKyAgICAgICAgLyogcmVtb3ZlIHRyYWlsaW5nIHdoaXRlIHNwYWNlICovCisgICAgICAgIHdoaWxlIChpc3NwYWNlKGJ1ZmZlcltsZW4tMV0pKQorICAgICAgICAgICAgbGVuIC09IDE7CisgICAgICAgIGJ1ZmZlcltsZW5dID0gJ1wwJzsKKyAgICAgICAgbGluZXNbbkxpbmVzKytdID0gc3RyZHVwKGJ1ZmZlcik7CisgICAgICAgIGlmIChuTGluZXMgPj0gbGluZXNfYnVmZmVyX3NpemUpIHsKKyAgICAgICAgICAgIGxpbmVzX2J1ZmZlcl9zaXplICs9IDEwOworICAgICAgICAgICAgbGluZXMgPSAoY2hhciAqKilyZWFsbG9jKGxpbmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihjaGFyICopICogbGluZXNfYnVmZmVyX3NpemUpOworICAgICAgICAgICAgaWYgKCFsaW5lcykKKyAgICAgICAgICAgICAgICByZXR1cm4gU3lzdGVtRXJyb3IoMCwgIk91dCBvZiBtZW1vcnkiKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBmY2xvc2UobG9nZmlsZSk7CiAKLQloa2V5X3Jvb3QgPSBIS0VZX0xPQ0FMX01BQ0hJTkU7Ci0JY3AgPSAiIjsKLQlmb3IgKGkgPSAwOyBpIDwgbkxpbmVzOyArK2kpIHsKLQkJLyogSWdub3JlIGR1cGxpY2F0ZSBsaW5lcyAqLwotCQlpZiAoc3RyY21wKGNwLCBsaW5lc1tpXSkpIHsKLQkJCWludCBpZ247Ci0JCQljcCA9IGxpbmVzW2ldOwotCQkJLyogUGFyc2UgdGhlIGxpbmVzICovCi0JCQlpZiAoMiA9PSBzc2NhbmYoY3AsICIlZCBSb290IEtleTogJXMiLCAmaWduLCAmYnVmZmVyKSkgewotCQkJCWlmIChzdHJjbXAoYnVmZmVyLCAiSEtFWV9DVVJSRU5UX1VTRVIiKT09MCkKLQkJCQkJaGtleV9yb290ID0gSEtFWV9DVVJSRU5UX1VTRVI7Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIEhLTE0gLSBjaGVjayB0aGV5IGhhdmUgcGVybWlzc2lvbnMuCi0JCQkJCWlmICghSGFzTG9jYWxNYWNoaW5lUHJpdnMoKSkgewotCQkJCQkJTWVzc2FnZUJveChHZXRGb2N1cygpLAotCQkJCQkJCSAgICJZb3UgZG8gbm90IHNlZW0gdG8gaGF2ZSBzdWZmaWNpZW50IGFjY2VzcyByaWdodHNcbiIKLQkJCQkJCQkgICAib24gdGhpcyBtYWNoaW5lIHRvIHVuaW5zdGFsbCB0aGlzIHNvZnR3YXJlIiwKLQkJCQkJCQkgICBOVUxMLAotCQkJCQkJCSAgIE1CX09LIHwgTUJfSUNPTlNUT1ApOwotCQkJCQkJcmV0dXJuIDE7IC8qIEVycm9yICovCi0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKDIgPT0gc3NjYW5mKGNwLCAiJWQgTWFkZSBEaXI6ICVzIiwgJmlnbiwgJmJ1ZmZlcikpIHsKLQkJCQlpZiAoTXlSZW1vdmVEaXJlY3RvcnkoY3ApKQotCQkJCQkrK25EaXJzOwotCQkJCWVsc2UgewotCQkJCQlpbnQgY29kZSA9IEdldExhc3RFcnJvcigpOwotCQkJCQlpZiAoY29kZSAhPSAyICYmIGNvZGUgIT0gMykgeyAvKiBmaWxlIG9yIHBhdGggbm90IGZvdW5kICovCi0JCQkJCQkrK25FcnJvcnM7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKDIgPT0gc3NjYW5mKGNwLCAiJWQgRmlsZSBDb3B5OiAlcyIsICZpZ24sICZidWZmZXIpKSB7Ci0JCQkJaWYgKE15RGVsZXRlRmlsZShjcCkpCi0JCQkJCSsrbkZpbGVzOwotCQkJCWVsc2UgewotCQkJCQlpbnQgY29kZSA9IEdldExhc3RFcnJvcigpOwotCQkJCQlpZiAoY29kZSAhPSAyICYmIGNvZGUgIT0gMykgeyAvKiBmaWxlIG9yIHBhdGggbm90IGZvdW5kICovCi0JCQkJCQkrK25FcnJvcnM7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKDIgPT0gc3NjYW5mKGNwLCAiJWQgRmlsZSBPdmVyd3JpdGU6ICVzIiwgJmlnbiwgJmJ1ZmZlcikpIHsKLQkJCQlpZiAoTXlEZWxldGVGaWxlKGNwKSkKLQkJCQkJKytuRmlsZXM7Ci0JCQkJZWxzZSB7Ci0JCQkJCWludCBjb2RlID0gR2V0TGFzdEVycm9yKCk7Ci0JCQkJCWlmIChjb2RlICE9IDIgJiYgY29kZSAhPSAzKSB7IC8qIGZpbGUgb3IgcGF0aCBub3QgZm91bmQgKi8KLQkJCQkJCSsrbkVycm9yczsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSBpZiAoMiA9PSBzc2NhbmYoY3AsICIlZCBSZWcgREIgS2V5OiAlcyIsICZpZ24sICZidWZmZXIpKSB7Ci0JCQkJRGVsZXRlUmVnaXN0cnlLZXkoY3ApOwotCQkJfSBlbHNlIGlmICgyID09IHNzY2FuZihjcCwgIiVkIFJlZyBEQiBWYWx1ZTogJXMiLCAmaWduLCAmYnVmZmVyKSkgewotCQkJCURlbGV0ZVJlZ2lzdHJ5VmFsdWUoY3ApOwotCQkJfSBlbHNlIGlmICgyID09IHNzY2FuZihjcCwgIiVkIFJ1biBTY3JpcHQ6ICVzIiwgJmlnbiwgJmJ1ZmZlcikpIHsKLQkJCQlSdW5fUmVtb3ZlU2NyaXB0KGNwKTsKLQkJCX0KLQkJfQotCX0KKyAgICAvKiBTb3J0IGFsbCB0aGUgbGluZXMsIHNvIHRoYXQgaGlnaGVzdCAzLWRpZ2l0IGNvZGVzIGFyZSBmaXJzdCAqLworICAgIHFzb3J0KCZsaW5lc1swXSwgbkxpbmVzLCBzaXplb2YoY2hhciAqKSwKKyAgICAgICAgICBjb21wYXJlKTsKIAotCWlmIChEZWxldGVGaWxlKGFyZ3ZbMl0pKSB7Ci0JCSsrbkZpbGVzOwotCX0gZWxzZSB7Ci0JCSsrbkVycm9yczsKLQkJU3lzdGVtRXJyb3IoR2V0TGFzdEVycm9yKCksIGFyZ3ZbMl0pOwotCX0KLQlpZiAobkVycm9ycykKLQkJd3NwcmludGYoYnVmZmVyLAotCQkJICIlZCBmaWxlcyBhbmQgJWQgZGlyZWN0b3JpZXMgcmVtb3ZlZFxuIgotCQkJICIlZCBmaWxlcyBvciBkaXJlY3RvcmllcyBjb3VsZCBub3QgYmUgcmVtb3ZlZCIsCi0JCQkgbkZpbGVzLCBuRGlycywgbkVycm9ycyk7Ci0JZWxzZQotCQl3c3ByaW50ZihidWZmZXIsICIlZCBmaWxlcyBhbmQgJWQgZGlyZWN0b3JpZXMgcmVtb3ZlZCIsCi0JCQkgbkZpbGVzLCBuRGlycyk7Ci0JTWVzc2FnZUJveChOVUxMLCBidWZmZXIsICJVbmluc3RhbGwgRmluaXNoZWQhIiwKLQkJICAgTUJfT0sgfCBNQl9JQ09OSU5GT1JNQVRJT04pOwotCXJlbW92ZV9leGUoKTsKLQlyZXR1cm4gMDsKKyAgICBpZiAoSURZRVMgIT0gTWVzc2FnZUJveChOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gcmVtb3ZlXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcGFja2FnZSBmcm9tIHlvdXIgY29tcHV0ZXI/IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUGxlYXNlIGNvbmZpcm0iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1CX1lFU05PIHwgTUJfSUNPTlFVRVNUSU9OKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBoa2V5X3Jvb3QgPSBIS0VZX0xPQ0FMX01BQ0hJTkU7CisgICAgY3AgPSAiIjsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbkxpbmVzOyArK2kpIHsKKyAgICAgICAgLyogSWdub3JlIGR1cGxpY2F0ZSBsaW5lcyAqLworICAgICAgICBpZiAoc3RyY21wKGNwLCBsaW5lc1tpXSkpIHsKKyAgICAgICAgICAgIGludCBpZ247CisgICAgICAgICAgICBjcCA9IGxpbmVzW2ldOworICAgICAgICAgICAgLyogUGFyc2UgdGhlIGxpbmVzICovCisgICAgICAgICAgICBpZiAoMiA9PSBzc2NhbmYoY3AsICIlZCBSb290IEtleTogJXMiLCAmaWduLCAmYnVmZmVyKSkgeworICAgICAgICAgICAgICAgIGlmIChzdHJjbXAoYnVmZmVyLCAiSEtFWV9DVVJSRU5UX1VTRVIiKT09MCkKKyAgICAgICAgICAgICAgICAgICAgaGtleV9yb290ID0gSEtFWV9DVVJSRU5UX1VTRVI7CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEhLTE0gLSBjaGVjayB0aGV5IGhhdmUgcGVybWlzc2lvbnMuCisgICAgICAgICAgICAgICAgICAgIGlmICghSGFzTG9jYWxNYWNoaW5lUHJpdnMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUJveChHZXRGb2N1cygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWW91IGRvIG5vdCBzZWVtIHRvIGhhdmUgc3VmZmljaWVudCBhY2Nlc3MgcmlnaHRzXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvbiB0aGlzIG1hY2hpbmUgdG8gdW5pbnN0YWxsIHRoaXMgc29mdHdhcmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQl9PSyB8IE1CX0lDT05TVE9QKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOyAvKiBFcnJvciAqLworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmICgyID09IHNzY2FuZihjcCwgIiVkIE1hZGUgRGlyOiAlcyIsICZpZ24sICZidWZmZXIpKSB7CisgICAgICAgICAgICAgICAgaWYgKE15UmVtb3ZlRGlyZWN0b3J5KGNwKSkKKyAgICAgICAgICAgICAgICAgICAgKytuRGlyczsKKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGNvZGUgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgIT0gMiAmJiBjb2RlICE9IDMpIHsgLyogZmlsZSBvciBwYXRoIG5vdCBmb3VuZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgKytuRXJyb3JzOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmICgyID09IHNzY2FuZihjcCwgIiVkIEZpbGUgQ29weTogJXMiLCAmaWduLCAmYnVmZmVyKSkgeworICAgICAgICAgICAgICAgIGlmIChNeURlbGV0ZUZpbGUoY3ApKQorICAgICAgICAgICAgICAgICAgICArK25GaWxlczsKKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGNvZGUgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgIT0gMiAmJiBjb2RlICE9IDMpIHsgLyogZmlsZSBvciBwYXRoIG5vdCBmb3VuZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgKytuRXJyb3JzOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmICgyID09IHNzY2FuZihjcCwgIiVkIEZpbGUgT3ZlcndyaXRlOiAlcyIsICZpZ24sICZidWZmZXIpKSB7CisgICAgICAgICAgICAgICAgaWYgKE15RGVsZXRlRmlsZShjcCkpCisgICAgICAgICAgICAgICAgICAgICsrbkZpbGVzOworICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpbnQgY29kZSA9IEdldExhc3RFcnJvcigpOworICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSAhPSAyICYmIGNvZGUgIT0gMykgeyAvKiBmaWxlIG9yIHBhdGggbm90IGZvdW5kICovCisgICAgICAgICAgICAgICAgICAgICAgICArK25FcnJvcnM7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKDIgPT0gc3NjYW5mKGNwLCAiJWQgUmVnIERCIEtleTogJXMiLCAmaWduLCAmYnVmZmVyKSkgeworICAgICAgICAgICAgICAgIERlbGV0ZVJlZ2lzdHJ5S2V5KGNwKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoMiA9PSBzc2NhbmYoY3AsICIlZCBSZWcgREIgVmFsdWU6ICVzIiwgJmlnbiwgJmJ1ZmZlcikpIHsKKyAgICAgICAgICAgICAgICBEZWxldGVSZWdpc3RyeVZhbHVlKGNwKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoMiA9PSBzc2NhbmYoY3AsICIlZCBSdW4gU2NyaXB0OiAlcyIsICZpZ24sICZidWZmZXIpKSB7CisgICAgICAgICAgICAgICAgUnVuX1JlbW92ZVNjcmlwdChjcCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoRGVsZXRlRmlsZShhcmd2WzJdKSkgeworICAgICAgICArK25GaWxlczsKKyAgICB9IGVsc2UgeworICAgICAgICArK25FcnJvcnM7CisgICAgICAgIFN5c3RlbUVycm9yKEdldExhc3RFcnJvcigpLCBhcmd2WzJdKTsKKyAgICB9CisgICAgaWYgKG5FcnJvcnMpCisgICAgICAgIHdzcHJpbnRmKGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgIiVkIGZpbGVzIGFuZCAlZCBkaXJlY3RvcmllcyByZW1vdmVkXG4iCisgICAgICAgICAgICAgICAgICIlZCBmaWxlcyBvciBkaXJlY3RvcmllcyBjb3VsZCBub3QgYmUgcmVtb3ZlZCIsCisgICAgICAgICAgICAgICAgIG5GaWxlcywgbkRpcnMsIG5FcnJvcnMpOworICAgIGVsc2UKKyAgICAgICAgd3NwcmludGYoYnVmZmVyLCAiJWQgZmlsZXMgYW5kICVkIGRpcmVjdG9yaWVzIHJlbW92ZWQiLAorICAgICAgICAgICAgICAgICBuRmlsZXMsIG5EaXJzKTsKKyAgICBNZXNzYWdlQm94KE5VTEwsIGJ1ZmZlciwgIlVuaW5zdGFsbCBGaW5pc2hlZCEiLAorICAgICAgICAgICAgICAgTUJfT0sgfCBNQl9JQ09OSU5GT1JNQVRJT04pOworICAgIHJlbW92ZV9leGUoKTsKKyAgICByZXR1cm4gMDsKIH0KIAogaW50IFdJTkFQSSBXaW5NYWluKEhJTlNUQU5DRSBoSW5zdCwgSElOU1RBTkNFIGhQcmV2SW5zdCwKLQkJICAgIExQU1RSIGxwc3pDbWRMaW5lLCBJTlQgbkNtZFNob3cpCisgICAgICAgICAgICAgICAgICAgIExQU1RSIGxwc3pDbWRMaW5lLCBJTlQgbkNtZFNob3cpCiB7Ci0JZXh0ZXJuIGludCBfX2FyZ2M7Ci0JZXh0ZXJuIGNoYXIgKipfX2FyZ3Y7Ci0JY2hhciAqYmFzZW5hbWU7CisgICAgZXh0ZXJuIGludCBfX2FyZ2M7CisgICAgZXh0ZXJuIGNoYXIgKipfX2FyZ3Y7CisgICAgY2hhciAqYmFzZW5hbWU7CiAKLQlHZXRNb2R1bGVGaWxlTmFtZShOVUxMLCBtb2R1bGVuYW1lLCBzaXplb2YobW9kdWxlbmFtZSkpOworICAgIEdldE1vZHVsZUZpbGVOYW1lKE5VTEwsIG1vZHVsZW5hbWUsIHNpemVvZihtb2R1bGVuYW1lKSk7CiAKLQkvKiBNYXAgdGhlIGV4ZWN1dGFibGUgZmlsZSB0byBtZW1vcnkgKi8KLQlhcmNfZGF0YSA9IE1hcEV4aXN0aW5nRmlsZShtb2R1bGVuYW1lLCAmYXJjX3NpemUpOwotCWlmICghYXJjX2RhdGEpIHsKLQkJU3lzdGVtRXJyb3IoR2V0TGFzdEVycm9yKCksICJDb3VsZCBub3Qgb3BlbiBhcmNoaXZlIik7Ci0JCXJldHVybiAxOwotCX0KKyAgICAvKiBNYXAgdGhlIGV4ZWN1dGFibGUgZmlsZSB0byBtZW1vcnkgKi8KKyAgICBhcmNfZGF0YSA9IE1hcEV4aXN0aW5nRmlsZShtb2R1bGVuYW1lLCAmYXJjX3NpemUpOworICAgIGlmICghYXJjX2RhdGEpIHsKKyAgICAgICAgU3lzdGVtRXJyb3IoR2V0TGFzdEVycm9yKCksICJDb3VsZCBub3Qgb3BlbiBhcmNoaXZlIik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KIAotCS8qIE9LLiBTbyB0aGlzIHByb2dyYW0gY2FuIGFjdCBhcyBpbnN0YWxsZXIgKHNlbGYtZXh0cmFjdGluZwotCSAqIHppcC1maWxlLCBvciBhcyB1bmluc3RhbGxlciB3aGVuIHN0YXJ0ZWQgd2l0aCAnLXUgbG9nZmlsZScKLQkgKiBjb21tYW5kIGxpbmUgZmxhZ3MuCi0JICoKLQkgKiBUaGUgaW5zdGFsbGVyIGlzIHVzdWFsbHkgc3RhcnRlZCB3aXRob3V0IGNvbW1hbmQgbGluZSBmbGFncywKLQkgKiBhbmQgdGhlIHVuaW5zdGFsbGVyIGlzIHVzdWFsbHkgc3RhcnRlZCB3aXRoIHRoZSAnLXUgbG9nZmlsZScKLQkgKiBmbGFnLiBXaGF0IHRvIGRvIGlmIHNvbWUgaW5ub2NlbnQgdXNlciBkb3VibGUtY2xpY2tzIHRoZQotCSAqIGV4ZS1maWxlPwotCSAqIFRoZSBmb2xsb3dpbmcgaW1wbGVtZW50cyBhIGRlZmVuc2l2ZSBzdHJhdGVneS4uLgotCSAqLworICAgIC8qIE9LLiBTbyB0aGlzIHByb2dyYW0gY2FuIGFjdCBhcyBpbnN0YWxsZXIgKHNlbGYtZXh0cmFjdGluZworICAgICAqIHppcC1maWxlLCBvciBhcyB1bmluc3RhbGxlciB3aGVuIHN0YXJ0ZWQgd2l0aCAnLXUgbG9nZmlsZScKKyAgICAgKiBjb21tYW5kIGxpbmUgZmxhZ3MuCisgICAgICoKKyAgICAgKiBUaGUgaW5zdGFsbGVyIGlzIHVzdWFsbHkgc3RhcnRlZCB3aXRob3V0IGNvbW1hbmQgbGluZSBmbGFncywKKyAgICAgKiBhbmQgdGhlIHVuaW5zdGFsbGVyIGlzIHVzdWFsbHkgc3RhcnRlZCB3aXRoIHRoZSAnLXUgbG9nZmlsZScKKyAgICAgKiBmbGFnLiBXaGF0IHRvIGRvIGlmIHNvbWUgaW5ub2NlbnQgdXNlciBkb3VibGUtY2xpY2tzIHRoZQorICAgICAqIGV4ZS1maWxlPworICAgICAqIFRoZSBmb2xsb3dpbmcgaW1wbGVtZW50cyBhIGRlZmVuc2l2ZSBzdHJhdGVneS4uLgorICAgICAqLwogCi0JLyogVHJ5IHRvIGV4dHJhY3QgdGhlIGNvbmZpZ3VyYXRpb24gZGF0YSBpbnRvIGEgdGVtcG9yYXJ5IGZpbGUgKi8KLQlpZiAoRXh0cmFjdEluc3RhbGxEYXRhKGFyY19kYXRhLCBhcmNfc2l6ZSwgJmV4ZV9zaXplLAotCQkJICAgICAgICZpbmlfZmlsZSwgJnByZV9pbnN0YWxsX3NjcmlwdCkpCi0JCXJldHVybiBEb0luc3RhbGwoKTsKKyAgICAvKiBUcnkgdG8gZXh0cmFjdCB0aGUgY29uZmlndXJhdGlvbiBkYXRhIGludG8gYSB0ZW1wb3JhcnkgZmlsZSAqLworICAgIGlmIChFeHRyYWN0SW5zdGFsbERhdGEoYXJjX2RhdGEsIGFyY19zaXplLCAmZXhlX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5pX2ZpbGUsICZwcmVfaW5zdGFsbF9zY3JpcHQpKQorICAgICAgICByZXR1cm4gRG9JbnN0YWxsKCk7CiAKLQlpZiAoIWluaV9maWxlICYmIF9fYXJnYyA+IDEpIHsKLQkJcmV0dXJuIERvVW5pbnN0YWxsKF9fYXJnYywgX19hcmd2KTsKLQl9CisgICAgaWYgKCFpbmlfZmlsZSAmJiBfX2FyZ2MgPiAxKSB7CisgICAgICAgIHJldHVybiBEb1VuaW5zdGFsbChfX2FyZ2MsIF9fYXJndik7CisgICAgfQogCiAKLQliYXNlbmFtZSA9IHN0cnJjaHIobW9kdWxlbmFtZSwgJ1xcJyk7Ci0JaWYgKGJhc2VuYW1lKQotCQkrK2Jhc2VuYW1lOworICAgIGJhc2VuYW1lID0gc3RycmNocihtb2R1bGVuYW1lLCAnXFwnKTsKKyAgICBpZiAoYmFzZW5hbWUpCisgICAgICAgICsrYmFzZW5hbWU7CiAKLQkvKiBMYXN0IGd1ZXNzIGFib3V0IHRoZSBwdXJwb3NlIG9mIHRoaXMgcHJvZ3JhbSAqLwotCWlmIChiYXNlbmFtZSAmJiAoMCA9PSBzdHJuY21wKGJhc2VuYW1lLCAiUmVtb3ZlIiwgNikpKQotCQlTeXN0ZW1FcnJvcigwLCAiVGhpcyBwcm9ncmFtIGlzIG5vcm1hbGx5IHN0YXJ0ZWQgYnkgd2luZG93cyIpOwotCWVsc2UKLQkJU3lzdGVtRXJyb3IoMCwgIlNldHVwIHByb2dyYW0gaW52YWxpZCBvciBkYW1hZ2VkIik7Ci0JcmV0dXJuIDE7CisgICAgLyogTGFzdCBndWVzcyBhYm91dCB0aGUgcHVycG9zZSBvZiB0aGlzIHByb2dyYW0gKi8KKyAgICBpZiAoYmFzZW5hbWUgJiYgKDAgPT0gc3RybmNtcChiYXNlbmFtZSwgIlJlbW92ZSIsIDYpKSkKKyAgICAgICAgU3lzdGVtRXJyb3IoMCwgIlRoaXMgcHJvZ3JhbSBpcyBub3JtYWxseSBzdGFydGVkIGJ5IHdpbmRvd3MiKTsKKyAgICBlbHNlCisgICAgICAgIFN5c3RlbUVycm9yKDAsICJTZXR1cCBwcm9ncmFtIGludmFsaWQgb3IgZGFtYWdlZCIpOworICAgIHJldHVybiAxOwogfQpkaWZmIC0tZ2l0IGEvUEMvY29uZmlnLmMgYi9QQy9jb25maWcuYwppbmRleCBhNWUxNTMwLi4zZmQ4ZGI3IDEwMDY0NAotLS0gYS9QQy9jb25maWcuYworKysgYi9QQy9jb25maWcuYwpAQCAtNzgsOTQgKzc4LDk0IEBACiAKIHN0cnVjdCBfaW5pdHRhYiBfUHlJbXBvcnRfSW5pdHRhYltdID0gewogCi0gICAgICAgIHsiYXJyYXkiLCBpbml0YXJyYXl9LAotCXsiX2FzdCIsIGluaXRfYXN0fSwKKyAgICB7ImFycmF5IiwgaW5pdGFycmF5fSwKKyAgICB7Il9hc3QiLCBpbml0X2FzdH0sCiAjaWZkZWYgTVNfV0lORE9XUwogI2lmbmRlZiBNU19XSU5JNjQKLSAgICAgICAgeyJhdWRpb29wIiwgaW5pdGF1ZGlvb3B9LAorICAgIHsiYXVkaW9vcCIsIGluaXRhdWRpb29wfSwKICNlbmRpZgogI2VuZGlmCi0gICAgICAgIHsiYmluYXNjaWkiLCBpbml0YmluYXNjaWl9LAotICAgICAgICB7ImNtYXRoIiwgaW5pdGNtYXRofSwKLSAgICAgICAgeyJlcnJubyIsIGluaXRlcnJub30sCi0gICAgICAgIHsiZnV0dXJlX2J1aWx0aW5zIiwgaW5pdGZ1dHVyZV9idWlsdGluc30sCi0gICAgICAgIHsiZ2MiLCBpbml0Z2N9LAorICAgIHsiYmluYXNjaWkiLCBpbml0YmluYXNjaWl9LAorICAgIHsiY21hdGgiLCBpbml0Y21hdGh9LAorICAgIHsiZXJybm8iLCBpbml0ZXJybm99LAorICAgIHsiZnV0dXJlX2J1aWx0aW5zIiwgaW5pdGZ1dHVyZV9idWlsdGluc30sCisgICAgeyJnYyIsIGluaXRnY30sCiAjaWZuZGVmIE1TX1dJTkk2NAotICAgICAgICB7ImltYWdlb3AiLCBpbml0aW1hZ2VvcH0sCisgICAgeyJpbWFnZW9wIiwgaW5pdGltYWdlb3B9LAogI2VuZGlmCi0gICAgICAgIHsibWF0aCIsIGluaXRtYXRofSwKLSAgICAgICAgeyJfbWQ1IiwgaW5pdF9tZDV9LAotICAgICAgICB7Im50IiwgaW5pdG50fSwgLyogVXNlIHRoZSBOVCBvcyBmdW5jdGlvbnMsIG5vdCBwb3NpeCAqLwotICAgICAgICB7Im9wZXJhdG9yIiwgaW5pdG9wZXJhdG9yfSwKLSAgICAgICAgeyJzaWduYWwiLCBpbml0c2lnbmFsfSwKLSAgICAgICAgeyJfc2hhIiwgaW5pdF9zaGF9LAotICAgICAgICB7Il9zaGEyNTYiLCBpbml0X3NoYTI1Nn0sCi0gICAgICAgIHsiX3NoYTUxMiIsIGluaXRfc2hhNTEyfSwKLSAgICAgICAgeyJzdHJvcCIsIGluaXRzdHJvcH0sCi0gICAgICAgIHsidGltZSIsIGluaXR0aW1lfSwKKyAgICB7Im1hdGgiLCBpbml0bWF0aH0sCisgICAgeyJfbWQ1IiwgaW5pdF9tZDV9LAorICAgIHsibnQiLCBpbml0bnR9LCAvKiBVc2UgdGhlIE5UIG9zIGZ1bmN0aW9ucywgbm90IHBvc2l4ICovCisgICAgeyJvcGVyYXRvciIsIGluaXRvcGVyYXRvcn0sCisgICAgeyJzaWduYWwiLCBpbml0c2lnbmFsfSwKKyAgICB7Il9zaGEiLCBpbml0X3NoYX0sCisgICAgeyJfc2hhMjU2IiwgaW5pdF9zaGEyNTZ9LAorICAgIHsiX3NoYTUxMiIsIGluaXRfc2hhNTEyfSwKKyAgICB7InN0cm9wIiwgaW5pdHN0cm9wfSwKKyAgICB7InRpbWUiLCBpbml0dGltZX0sCiAjaWZkZWYgV0lUSF9USFJFQUQKLSAgICAgICAgeyJ0aHJlYWQiLCBpbml0dGhyZWFkfSwKKyAgICB7InRocmVhZCIsIGluaXR0aHJlYWR9LAogI2VuZGlmCi0gICAgICAgIHsiY1N0cmluZ0lPIiwgaW5pdGNTdHJpbmdJT30sCi0gICAgICAgIHsiY1BpY2tsZSIsIGluaXRjUGlja2xlfSwKKyAgICB7ImNTdHJpbmdJTyIsIGluaXRjU3RyaW5nSU99LAorICAgIHsiY1BpY2tsZSIsIGluaXRjUGlja2xlfSwKICNpZmRlZiBXSU4zMgotICAgICAgICB7Im1zdmNydCIsIGluaXRtc3ZjcnR9LAotICAgICAgICB7Il9sb2NhbGUiLCBpbml0X2xvY2FsZX0sCisgICAgeyJtc3ZjcnQiLCBpbml0bXN2Y3J0fSwKKyAgICB7Il9sb2NhbGUiLCBpbml0X2xvY2FsZX0sCiAjZW5kaWYKLQkvKiBYWFggU2hvdWxkIF9zdWJwcm9jZXNzIGdvIGluIGEgV0lOMzIgYmxvY2s/ICBub3QgV0lONjQ/ICovCi0JeyJfc3VicHJvY2VzcyIsIGluaXRfc3VicHJvY2Vzc30sCisgICAgLyogWFhYIFNob3VsZCBfc3VicHJvY2VzcyBnbyBpbiBhIFdJTjMyIGJsb2NrPyAgbm90IFdJTjY0PyAqLworICAgIHsiX3N1YnByb2Nlc3MiLCBpbml0X3N1YnByb2Nlc3N9LAogCi0gICAgICAgIHsiX2NvZGVjcyIsIGluaXRfY29kZWNzfSwKLQl7Il93ZWFrcmVmIiwgaW5pdF93ZWFrcmVmfSwKLQl7Il9ob3RzaG90IiwgaW5pdF9ob3RzaG90fSwKLQl7Il9yYW5kb20iLCBpbml0X3JhbmRvbX0sCi0gICAgICAgIHsiX2Jpc2VjdCIsIGluaXRfYmlzZWN0fSwKLSAgICAgICAgeyJfaGVhcHEiLCBpbml0X2hlYXBxfSwKLQl7Il9sc3Byb2YiLCBpbml0X2xzcHJvZn0sCi0JeyJpdGVydG9vbHMiLCBpbml0aXRlcnRvb2xzfSwKLSAgICAgICAgeyJfY29sbGVjdGlvbnMiLCBpbml0X2NvbGxlY3Rpb25zfSwKLQl7Il9zeW10YWJsZSIsIGluaXRfc3ltdGFibGV9LAotCXsibW1hcCIsIGluaXRtbWFwfSwKLQl7Il9jc3YiLCBpbml0X2Nzdn0sCi0JeyJfc3JlIiwgaW5pdF9zcmV9LAotCXsicGFyc2VyIiwgaW5pdHBhcnNlcn0sCi0JeyJfd2lucmVnIiwgaW5pdF93aW5yZWd9LAotCXsiX3N0cnVjdCIsIGluaXRfc3RydWN0fSwKLQl7ImRhdGV0aW1lIiwgaW5pdGRhdGV0aW1lfSwKLQl7Il9maWxlaW8iLCBpbml0X2ZpbGVpb30sCi0JeyJfYnl0ZXNpbyIsIGluaXRfYnl0ZXNpb30sCi0JeyJfZnVuY3Rvb2xzIiwgaW5pdF9mdW5jdG9vbHN9LAotCXsiX2pzb24iLCBpbml0X2pzb259LAorICAgIHsiX2NvZGVjcyIsIGluaXRfY29kZWNzfSwKKyAgICB7Il93ZWFrcmVmIiwgaW5pdF93ZWFrcmVmfSwKKyAgICB7Il9ob3RzaG90IiwgaW5pdF9ob3RzaG90fSwKKyAgICB7Il9yYW5kb20iLCBpbml0X3JhbmRvbX0sCisgICAgeyJfYmlzZWN0IiwgaW5pdF9iaXNlY3R9LAorICAgIHsiX2hlYXBxIiwgaW5pdF9oZWFwcX0sCisgICAgeyJfbHNwcm9mIiwgaW5pdF9sc3Byb2Z9LAorICAgIHsiaXRlcnRvb2xzIiwgaW5pdGl0ZXJ0b29sc30sCisgICAgeyJfY29sbGVjdGlvbnMiLCBpbml0X2NvbGxlY3Rpb25zfSwKKyAgICB7Il9zeW10YWJsZSIsIGluaXRfc3ltdGFibGV9LAorICAgIHsibW1hcCIsIGluaXRtbWFwfSwKKyAgICB7Il9jc3YiLCBpbml0X2Nzdn0sCisgICAgeyJfc3JlIiwgaW5pdF9zcmV9LAorICAgIHsicGFyc2VyIiwgaW5pdHBhcnNlcn0sCisgICAgeyJfd2lucmVnIiwgaW5pdF93aW5yZWd9LAorICAgIHsiX3N0cnVjdCIsIGluaXRfc3RydWN0fSwKKyAgICB7ImRhdGV0aW1lIiwgaW5pdGRhdGV0aW1lfSwKKyAgICB7Il9maWxlaW8iLCBpbml0X2ZpbGVpb30sCisgICAgeyJfYnl0ZXNpbyIsIGluaXRfYnl0ZXNpb30sCisgICAgeyJfZnVuY3Rvb2xzIiwgaW5pdF9mdW5jdG9vbHN9LAorICAgIHsiX2pzb24iLCBpbml0X2pzb259LAogCi0JeyJ4eHN1YnR5cGUiLCBpbml0eHhzdWJ0eXBlfSwKLQl7InppcGltcG9ydCIsIGluaXR6aXBpbXBvcnR9LAotCXsiemxpYiIsIGluaXR6bGlifSwKLQkKLQkvKiBDSksgY29kZWNzICovCi0JeyJfbXVsdGlieXRlY29kZWMiLCBpbml0X211bHRpYnl0ZWNvZGVjfSwKLQl7Il9jb2RlY3NfY24iLCBpbml0X2NvZGVjc19jbn0sCi0JeyJfY29kZWNzX2hrIiwgaW5pdF9jb2RlY3NfaGt9LAotCXsiX2NvZGVjc19pc28yMDIyIiwgaW5pdF9jb2RlY3NfaXNvMjAyMn0sCi0JeyJfY29kZWNzX2pwIiwgaW5pdF9jb2RlY3NfanB9LAotCXsiX2NvZGVjc19rciIsIGluaXRfY29kZWNzX2tyfSwKLQl7Il9jb2RlY3NfdHciLCBpbml0X2NvZGVjc190d30sCisgICAgeyJ4eHN1YnR5cGUiLCBpbml0eHhzdWJ0eXBlfSwKKyAgICB7InppcGltcG9ydCIsIGluaXR6aXBpbXBvcnR9LAorICAgIHsiemxpYiIsIGluaXR6bGlifSwKKworICAgIC8qIENKSyBjb2RlY3MgKi8KKyAgICB7Il9tdWx0aWJ5dGVjb2RlYyIsIGluaXRfbXVsdGlieXRlY29kZWN9LAorICAgIHsiX2NvZGVjc19jbiIsIGluaXRfY29kZWNzX2NufSwKKyAgICB7Il9jb2RlY3NfaGsiLCBpbml0X2NvZGVjc19oa30sCisgICAgeyJfY29kZWNzX2lzbzIwMjIiLCBpbml0X2NvZGVjc19pc28yMDIyfSwKKyAgICB7Il9jb2RlY3NfanAiLCBpbml0X2NvZGVjc19qcH0sCisgICAgeyJfY29kZWNzX2tyIiwgaW5pdF9jb2RlY3Nfa3J9LAorICAgIHsiX2NvZGVjc190dyIsIGluaXRfY29kZWNzX3R3fSwKIAogLyogdG9vbHMvZnJlZXplL21ha2Vjb25maWcucHkgbWFya2VyIGZvciBhZGRpdGlvbmFsICJfaW5pdHRhYiIgZW50cmllcyAqLwogLyogLS0gQURETU9EVUxFIE1BUktFUiAyIC0tICovCiAKLSAgICAgICAgLyogVGhpcyBtb2R1bGUgImxpdmVzIGluIiB3aXRoIG1hcnNoYWwuYyAqLwotICAgICAgICB7Im1hcnNoYWwiLCBQeU1hcnNoYWxfSW5pdH0sCisgICAgLyogVGhpcyBtb2R1bGUgImxpdmVzIGluIiB3aXRoIG1hcnNoYWwuYyAqLworICAgIHsibWFyc2hhbCIsIFB5TWFyc2hhbF9Jbml0fSwKIAotICAgICAgICAvKiBUaGlzIGxpdmVzIGl0IHdpdGggaW1wb3J0LmMgKi8KLSAgICAgICAgeyJpbXAiLCBpbml0aW1wfSwKKyAgICAvKiBUaGlzIGxpdmVzIGl0IHdpdGggaW1wb3J0LmMgKi8KKyAgICB7ImltcCIsIGluaXRpbXB9LAogCi0gICAgICAgIC8qIFRoZXNlIGVudHJpZXMgYXJlIGhlcmUgZm9yIHN5cy5idWlsdGluX21vZHVsZV9uYW1lcyAqLwotICAgICAgICB7Il9fbWFpbl9fIiwgTlVMTH0sCi0gICAgICAgIHsiX19idWlsdGluX18iLCBOVUxMfSwKLSAgICAgICAgeyJzeXMiLCBOVUxMfSwKLQl7ImV4Y2VwdGlvbnMiLCBOVUxMfSwKLSAgICAgICAgeyJfd2FybmluZ3MiLCBfUHlXYXJuaW5nc19Jbml0fSwKKyAgICAvKiBUaGVzZSBlbnRyaWVzIGFyZSBoZXJlIGZvciBzeXMuYnVpbHRpbl9tb2R1bGVfbmFtZXMgKi8KKyAgICB7Il9fbWFpbl9fIiwgTlVMTH0sCisgICAgeyJfX2J1aWx0aW5fXyIsIE5VTEx9LAorICAgIHsic3lzIiwgTlVMTH0sCisgICAgeyJleGNlcHRpb25zIiwgTlVMTH0sCisgICAgeyJfd2FybmluZ3MiLCBfUHlXYXJuaW5nc19Jbml0fSwKIAotICAgICAgICAvKiBTZW50aW5lbCAqLwotICAgICAgICB7MCwgMH0KKyAgICAvKiBTZW50aW5lbCAqLworICAgIHswLCAwfQogfTsKZGlmZiAtLWdpdCBhL1BDL2RsX250LmMgYi9QQy9kbF9udC5jCmluZGV4IGY4YWY4MDIuLmVmMWNlMDkgMTAwNjQ0Ci0tLSBhL1BDL2RsX250LmMKKysrIGIvUEMvZGxfbnQuYwpAQCAtMyw3ICszLDcgQEAKIEVudHJ5IHBvaW50IGZvciB0aGUgV2luZG93cyBOVCBETEwuCiAKIEFib3V0IHRoZSBvbmx5IHJlYXNvbiBmb3IgaGF2aW5nIHRoaXMsIGlzIHNvIGluaXRhbGwoKSBjYW4gYXV0b21hdGljYWxseQotYmUgY2FsbGVkLCByZW1vdmluZyB0aGF0IGJ1cmRlbiAoYW5kIHBvc3NpYmxlIHNvdXJjZSBvZiBmcnVzdHJhdGlvbiBpZiAKK2JlIGNhbGxlZCwgcmVtb3ZpbmcgdGhhdCBidXJkZW4gKGFuZCBwb3NzaWJsZSBzb3VyY2Ugb2YgZnJ1c3RyYXRpb24gaWYKIGZvcmdvdHRlbikgZnJvbSB0aGUgcHJvZ3JhbW1lci4KIAogKi8KQEAgLTQ2LDYxICs0Niw2MSBAQAogCiB2b2lkIF9Mb2FkQWN0Q3R4UG9pbnRlcnMoKQogewotCUhJTlNUQU5DRSBoS2VybmVsMzIgPSBHZXRNb2R1bGVIYW5kbGVXKEwia2VybmVsMzIuZGxsIik7Ci0JaWYgKGhLZXJuZWwzMikKLQkJcGZuR2V0Q3VycmVudEFjdEN0eCA9IChQRk5fR0VUQ1VSUkVOVEFDVENUWCkgR2V0UHJvY0FkZHJlc3MoaEtlcm5lbDMyLCAiR2V0Q3VycmVudEFjdEN0eCIpOwotCS8vIElmIHdlIGNhbid0IGxvYWQgR2V0Q3VycmVudEFjdEN0eCAoaWUsIHByZSBYUCkgLCBkb24ndCBib3RoZXIgd2l0aCB0aGUgcmVzdC4KLQlpZiAocGZuR2V0Q3VycmVudEFjdEN0eCkgewotCQlwZm5BY3RpdmF0ZUFjdEN0eCA9IChQRk5fQUNUSVZBVEVBQ1RDVFgpIEdldFByb2NBZGRyZXNzKGhLZXJuZWwzMiwgIkFjdGl2YXRlQWN0Q3R4Iik7Ci0JCXBmbkRlYWN0aXZhdGVBY3RDdHggPSAoUEZOX0RFQUNUSVZBVEVBQ1RDVFgpIEdldFByb2NBZGRyZXNzKGhLZXJuZWwzMiwgIkRlYWN0aXZhdGVBY3RDdHgiKTsKLQkJcGZuQWRkUmVmQWN0Q3R4ID0gKFBGTl9BRERSRUZBQ1RDVFgpIEdldFByb2NBZGRyZXNzKGhLZXJuZWwzMiwgIkFkZFJlZkFjdEN0eCIpOwotCQlwZm5SZWxlYXNlQWN0Q3R4ID0gKFBGTl9SRUxFQVNFQUNUQ1RYKSBHZXRQcm9jQWRkcmVzcyhoS2VybmVsMzIsICJSZWxlYXNlQWN0Q3R4Iik7Ci0JfQorICAgIEhJTlNUQU5DRSBoS2VybmVsMzIgPSBHZXRNb2R1bGVIYW5kbGVXKEwia2VybmVsMzIuZGxsIik7CisgICAgaWYgKGhLZXJuZWwzMikKKyAgICAgICAgcGZuR2V0Q3VycmVudEFjdEN0eCA9IChQRk5fR0VUQ1VSUkVOVEFDVENUWCkgR2V0UHJvY0FkZHJlc3MoaEtlcm5lbDMyLCAiR2V0Q3VycmVudEFjdEN0eCIpOworICAgIC8vIElmIHdlIGNhbid0IGxvYWQgR2V0Q3VycmVudEFjdEN0eCAoaWUsIHByZSBYUCkgLCBkb24ndCBib3RoZXIgd2l0aCB0aGUgcmVzdC4KKyAgICBpZiAocGZuR2V0Q3VycmVudEFjdEN0eCkgeworICAgICAgICBwZm5BY3RpdmF0ZUFjdEN0eCA9IChQRk5fQUNUSVZBVEVBQ1RDVFgpIEdldFByb2NBZGRyZXNzKGhLZXJuZWwzMiwgIkFjdGl2YXRlQWN0Q3R4Iik7CisgICAgICAgIHBmbkRlYWN0aXZhdGVBY3RDdHggPSAoUEZOX0RFQUNUSVZBVEVBQ1RDVFgpIEdldFByb2NBZGRyZXNzKGhLZXJuZWwzMiwgIkRlYWN0aXZhdGVBY3RDdHgiKTsKKyAgICAgICAgcGZuQWRkUmVmQWN0Q3R4ID0gKFBGTl9BRERSRUZBQ1RDVFgpIEdldFByb2NBZGRyZXNzKGhLZXJuZWwzMiwgIkFkZFJlZkFjdEN0eCIpOworICAgICAgICBwZm5SZWxlYXNlQWN0Q3R4ID0gKFBGTl9SRUxFQVNFQUNUQ1RYKSBHZXRQcm9jQWRkcmVzcyhoS2VybmVsMzIsICJSZWxlYXNlQWN0Q3R4Iik7CisgICAgfQogfQogCiBVTE9OR19QVFIgX1B5X0FjdGl2YXRlQWN0Q3R4KCkKIHsKLQlVTE9OR19QVFIgcmV0ID0gMDsKLQlpZiAoUHlXaW5fRExMaEFjdGl2YXRpb25Db250ZXh0ICYmIHBmbkFjdGl2YXRlQWN0Q3R4KQotCQlpZiAoISgqcGZuQWN0aXZhdGVBY3RDdHgpKFB5V2luX0RMTGhBY3RpdmF0aW9uQ29udGV4dCwgJnJldCkpIHsKLQkJCU91dHB1dERlYnVnU3RyaW5nKCJQeXRob24gZmFpbGVkIHRvIGFjdGl2YXRlIHRoZSBhY3RpdmF0aW9uIGNvbnRleHQgYmVmb3JlIGxvYWRpbmcgYSBETExcbiIpOwotCQkJcmV0ID0gMDsgLy8gbm8gcHJvbWlzZSB0aGUgZmFpbGluZyBmdW5jdGlvbiBkaWRuJ3QgY2hhbmdlIGl0IQotCQl9Ci0JcmV0dXJuIHJldDsKKyAgICBVTE9OR19QVFIgcmV0ID0gMDsKKyAgICBpZiAoUHlXaW5fRExMaEFjdGl2YXRpb25Db250ZXh0ICYmIHBmbkFjdGl2YXRlQWN0Q3R4KQorICAgICAgICBpZiAoISgqcGZuQWN0aXZhdGVBY3RDdHgpKFB5V2luX0RMTGhBY3RpdmF0aW9uQ29udGV4dCwgJnJldCkpIHsKKyAgICAgICAgICAgIE91dHB1dERlYnVnU3RyaW5nKCJQeXRob24gZmFpbGVkIHRvIGFjdGl2YXRlIHRoZSBhY3RpdmF0aW9uIGNvbnRleHQgYmVmb3JlIGxvYWRpbmcgYSBETExcbiIpOworICAgICAgICAgICAgcmV0ID0gMDsgLy8gbm8gcHJvbWlzZSB0aGUgZmFpbGluZyBmdW5jdGlvbiBkaWRuJ3QgY2hhbmdlIGl0IQorICAgICAgICB9CisgICAgcmV0dXJuIHJldDsKIH0KIAogdm9pZCBfUHlfRGVhY3RpdmF0ZUFjdEN0eChVTE9OR19QVFIgY29va2llKQogewotCWlmIChjb29raWUgJiYgcGZuRGVhY3RpdmF0ZUFjdEN0eCkKLQkJaWYgKCEoKnBmbkRlYWN0aXZhdGVBY3RDdHgpKDAsIGNvb2tpZSkpCi0JCQlPdXRwdXREZWJ1Z1N0cmluZygiUHl0aG9uIGZhaWxlZCB0byBkZS1hY3RpdmF0ZSB0aGUgYWN0aXZhdGlvbiBjb250ZXh0XG4iKTsKKyAgICBpZiAoY29va2llICYmIHBmbkRlYWN0aXZhdGVBY3RDdHgpCisgICAgICAgIGlmICghKCpwZm5EZWFjdGl2YXRlQWN0Q3R4KSgwLCBjb29raWUpKQorICAgICAgICAgICAgT3V0cHV0RGVidWdTdHJpbmcoIlB5dGhvbiBmYWlsZWQgdG8gZGUtYWN0aXZhdGUgdGhlIGFjdGl2YXRpb24gY29udGV4dFxuIik7CiB9CiAKLUJPT0wJV0lOQVBJCURsbE1haW4gKEhBTkRMRSBoSW5zdCwgCi0JCQkJCQlVTE9ORyB1bF9yZWFzb25fZm9yX2NhbGwsCi0JCQkJCQlMUFZPSUQgbHBSZXNlcnZlZCkKK0JPT0wgICAgV0lOQVBJICBEbGxNYWluIChIQU5ETEUgaEluc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTE9ORyB1bF9yZWFzb25fZm9yX2NhbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFZPSUQgbHBSZXNlcnZlZCkKIHsKLQlzd2l0Y2ggKHVsX3JlYXNvbl9mb3JfY2FsbCkKLQl7Ci0JCWNhc2UgRExMX1BST0NFU1NfQVRUQUNIOgotCQkJUHlXaW5fRExMaE1vZHVsZSA9IGhJbnN0OwotCQkJLy8gMTAwMCBpcyBhIG1hZ2ljIG51bWJlciBJIHBpY2tlZCBvdXQgb2YgdGhlIGFpci4gIENvdWxkIGRvIHdpdGggYSAjZGVmaW5lLCBJIHNwb3NlLi4uCi0JCQlMb2FkU3RyaW5nKGhJbnN0LCAxMDAwLCBkbGxWZXJzaW9uQnVmZmVyLCBzaXplb2YoZGxsVmVyc2lvbkJ1ZmZlcikpOworICAgIHN3aXRjaCAodWxfcmVhc29uX2Zvcl9jYWxsKQorICAgIHsKKyAgICAgICAgY2FzZSBETExfUFJPQ0VTU19BVFRBQ0g6CisgICAgICAgICAgICBQeVdpbl9ETExoTW9kdWxlID0gaEluc3Q7CisgICAgICAgICAgICAvLyAxMDAwIGlzIGEgbWFnaWMgbnVtYmVyIEkgcGlja2VkIG91dCBvZiB0aGUgYWlyLiAgQ291bGQgZG8gd2l0aCBhICNkZWZpbmUsIEkgc3Bvc2UuLi4KKyAgICAgICAgICAgIExvYWRTdHJpbmcoaEluc3QsIDEwMDAsIGRsbFZlcnNpb25CdWZmZXIsIHNpemVvZihkbGxWZXJzaW9uQnVmZmVyKSk7CiAKLQkJCS8vIGFuZCBjYXB0dXJlIG91ciBhY3RpdmF0aW9uIGNvbnRleHQgZm9yIHVzZSB3aGVuIGxvYWRpbmcgZXh0ZW5zaW9ucy4KLQkJCV9Mb2FkQWN0Q3R4UG9pbnRlcnMoKTsKLQkJCWlmIChwZm5HZXRDdXJyZW50QWN0Q3R4ICYmIHBmbkFkZFJlZkFjdEN0eCkKLQkJCQlpZiAoKCpwZm5HZXRDdXJyZW50QWN0Q3R4KSgmUHlXaW5fRExMaEFjdGl2YXRpb25Db250ZXh0KSkKLQkJCQkJaWYgKCEoKnBmbkFkZFJlZkFjdEN0eCkoUHlXaW5fRExMaEFjdGl2YXRpb25Db250ZXh0KSkKLQkJCQkJCU91dHB1dERlYnVnU3RyaW5nKCJQeXRob24gZmFpbGVkIHRvIGxvYWQgdGhlIGRlZmF1bHQgYWN0aXZhdGlvbiBjb250ZXh0XG4iKTsKLQkJCWJyZWFrOworICAgICAgICAgICAgLy8gYW5kIGNhcHR1cmUgb3VyIGFjdGl2YXRpb24gY29udGV4dCBmb3IgdXNlIHdoZW4gbG9hZGluZyBleHRlbnNpb25zLgorICAgICAgICAgICAgX0xvYWRBY3RDdHhQb2ludGVycygpOworICAgICAgICAgICAgaWYgKHBmbkdldEN1cnJlbnRBY3RDdHggJiYgcGZuQWRkUmVmQWN0Q3R4KQorICAgICAgICAgICAgICAgIGlmICgoKnBmbkdldEN1cnJlbnRBY3RDdHgpKCZQeVdpbl9ETExoQWN0aXZhdGlvbkNvbnRleHQpKQorICAgICAgICAgICAgICAgICAgICBpZiAoISgqcGZuQWRkUmVmQWN0Q3R4KShQeVdpbl9ETExoQWN0aXZhdGlvbkNvbnRleHQpKQorICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0RGVidWdTdHJpbmcoIlB5dGhvbiBmYWlsZWQgdG8gbG9hZCB0aGUgZGVmYXVsdCBhY3RpdmF0aW9uIGNvbnRleHRcbiIpOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBETExfUFJPQ0VTU19ERVRBQ0g6Ci0JCQlpZiAocGZuUmVsZWFzZUFjdEN0eCkKLQkJCQkoKnBmblJlbGVhc2VBY3RDdHgpKFB5V2luX0RMTGhBY3RpdmF0aW9uQ29udGV4dCk7Ci0JCQlicmVhazsKLQl9Ci0JcmV0dXJuIFRSVUU7CisgICAgICAgIGNhc2UgRExMX1BST0NFU1NfREVUQUNIOgorICAgICAgICAgICAgaWYgKHBmblJlbGVhc2VBY3RDdHgpCisgICAgICAgICAgICAgICAgKCpwZm5SZWxlYXNlQWN0Q3R4KShQeVdpbl9ETExoQWN0aXZhdGlvbkNvbnRleHQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBUUlVFOwogfQogCiAjZW5kaWYgLyogUHlfRU5BQkxFX1NIQVJFRCAqLwpkaWZmIC0tZ2l0IGEvUEMvZXJybWFwLmggYi9QQy9lcnJtYXAuaAppbmRleCA1OWFlZWExLi5kMjI1YWE0IDEwMDY0NAotLS0gYS9QQy9lcnJtYXAuaAorKysgYi9QQy9lcnJtYXAuaApAQCAtMSw3OCArMSw3OCBAQAogLyogR2VuZXJhdGVkIGZpbGUuIERvIG5vdCBlZGl0LiAqLwogaW50IHdpbmVycm9yX3RvX2Vycm5vKGludCB3aW5lcnJvcikKIHsKLQlzd2l0Y2god2luZXJyb3IpIHsKLQkJY2FzZSAyOiByZXR1cm4gMjsKLQkJY2FzZSAzOiByZXR1cm4gMjsKLQkJY2FzZSA0OiByZXR1cm4gMjQ7Ci0JCWNhc2UgNTogcmV0dXJuIDEzOwotCQljYXNlIDY6IHJldHVybiA5OwotCQljYXNlIDc6IHJldHVybiAxMjsKLQkJY2FzZSA4OiByZXR1cm4gMTI7Ci0JCWNhc2UgOTogcmV0dXJuIDEyOwotCQljYXNlIDEwOiByZXR1cm4gNzsKLQkJY2FzZSAxMTogcmV0dXJuIDg7Ci0JCWNhc2UgMTU6IHJldHVybiAyOwotCQljYXNlIDE2OiByZXR1cm4gMTM7Ci0JCWNhc2UgMTc6IHJldHVybiAxODsKLQkJY2FzZSAxODogcmV0dXJuIDI7Ci0JCWNhc2UgMTk6IHJldHVybiAxMzsKLQkJY2FzZSAyMDogcmV0dXJuIDEzOwotCQljYXNlIDIxOiByZXR1cm4gMTM7Ci0JCWNhc2UgMjI6IHJldHVybiAxMzsKLQkJY2FzZSAyMzogcmV0dXJuIDEzOwotCQljYXNlIDI0OiByZXR1cm4gMTM7Ci0JCWNhc2UgMjU6IHJldHVybiAxMzsKLQkJY2FzZSAyNjogcmV0dXJuIDEzOwotCQljYXNlIDI3OiByZXR1cm4gMTM7Ci0JCWNhc2UgMjg6IHJldHVybiAxMzsKLQkJY2FzZSAyOTogcmV0dXJuIDEzOwotCQljYXNlIDMwOiByZXR1cm4gMTM7Ci0JCWNhc2UgMzE6IHJldHVybiAxMzsKLQkJY2FzZSAzMjogcmV0dXJuIDEzOwotCQljYXNlIDMzOiByZXR1cm4gMTM7Ci0JCWNhc2UgMzQ6IHJldHVybiAxMzsKLQkJY2FzZSAzNTogcmV0dXJuIDEzOwotCQljYXNlIDM2OiByZXR1cm4gMTM7Ci0JCWNhc2UgNTM6IHJldHVybiAyOwotCQljYXNlIDY1OiByZXR1cm4gMTM7Ci0JCWNhc2UgNjc6IHJldHVybiAyOwotCQljYXNlIDgwOiByZXR1cm4gMTc7Ci0JCWNhc2UgODI6IHJldHVybiAxMzsKLQkJY2FzZSA4MzogcmV0dXJuIDEzOwotCQljYXNlIDg5OiByZXR1cm4gMTE7Ci0JCWNhc2UgMTA4OiByZXR1cm4gMTM7Ci0JCWNhc2UgMTA5OiByZXR1cm4gMzI7Ci0JCWNhc2UgMTEyOiByZXR1cm4gMjg7Ci0JCWNhc2UgMTE0OiByZXR1cm4gOTsKLQkJY2FzZSAxMjg6IHJldHVybiAxMDsKLQkJY2FzZSAxMjk6IHJldHVybiAxMDsKLQkJY2FzZSAxMzA6IHJldHVybiA5OwotCQljYXNlIDEzMjogcmV0dXJuIDEzOwotCQljYXNlIDE0NTogcmV0dXJuIDQxOwotCQljYXNlIDE1ODogcmV0dXJuIDEzOwotCQljYXNlIDE2MTogcmV0dXJuIDI7Ci0JCWNhc2UgMTY0OiByZXR1cm4gMTE7Ci0JCWNhc2UgMTY3OiByZXR1cm4gMTM7Ci0JCWNhc2UgMTgzOiByZXR1cm4gMTc7Ci0JCWNhc2UgMTg4OiByZXR1cm4gODsKLQkJY2FzZSAxODk6IHJldHVybiA4OwotCQljYXNlIDE5MDogcmV0dXJuIDg7Ci0JCWNhc2UgMTkxOiByZXR1cm4gODsKLQkJY2FzZSAxOTI6IHJldHVybiA4OwotCQljYXNlIDE5MzogcmV0dXJuIDg7Ci0JCWNhc2UgMTk0OiByZXR1cm4gODsKLQkJY2FzZSAxOTU6IHJldHVybiA4OwotCQljYXNlIDE5NjogcmV0dXJuIDg7Ci0JCWNhc2UgMTk3OiByZXR1cm4gODsKLQkJY2FzZSAxOTg6IHJldHVybiA4OwotCQljYXNlIDE5OTogcmV0dXJuIDg7Ci0JCWNhc2UgMjAwOiByZXR1cm4gODsKLQkJY2FzZSAyMDE6IHJldHVybiA4OwotCQljYXNlIDIwMjogcmV0dXJuIDg7Ci0JCWNhc2UgMjA2OiByZXR1cm4gMjsKLQkJY2FzZSAyMTU6IHJldHVybiAxMTsKLQkJY2FzZSAxODE2OiByZXR1cm4gMTI7Ci0JCWRlZmF1bHQ6IHJldHVybiBFSU5WQUw7Ci0JfQorICAgIHN3aXRjaCh3aW5lcnJvcikgeworICAgICAgICBjYXNlIDI6IHJldHVybiAyOworICAgICAgICBjYXNlIDM6IHJldHVybiAyOworICAgICAgICBjYXNlIDQ6IHJldHVybiAyNDsKKyAgICAgICAgY2FzZSA1OiByZXR1cm4gMTM7CisgICAgICAgIGNhc2UgNjogcmV0dXJuIDk7CisgICAgICAgIGNhc2UgNzogcmV0dXJuIDEyOworICAgICAgICBjYXNlIDg6IHJldHVybiAxMjsKKyAgICAgICAgY2FzZSA5OiByZXR1cm4gMTI7CisgICAgICAgIGNhc2UgMTA6IHJldHVybiA3OworICAgICAgICBjYXNlIDExOiByZXR1cm4gODsKKyAgICAgICAgY2FzZSAxNTogcmV0dXJuIDI7CisgICAgICAgIGNhc2UgMTY6IHJldHVybiAxMzsKKyAgICAgICAgY2FzZSAxNzogcmV0dXJuIDE4OworICAgICAgICBjYXNlIDE4OiByZXR1cm4gMjsKKyAgICAgICAgY2FzZSAxOTogcmV0dXJuIDEzOworICAgICAgICBjYXNlIDIwOiByZXR1cm4gMTM7CisgICAgICAgIGNhc2UgMjE6IHJldHVybiAxMzsKKyAgICAgICAgY2FzZSAyMjogcmV0dXJuIDEzOworICAgICAgICBjYXNlIDIzOiByZXR1cm4gMTM7CisgICAgICAgIGNhc2UgMjQ6IHJldHVybiAxMzsKKyAgICAgICAgY2FzZSAyNTogcmV0dXJuIDEzOworICAgICAgICBjYXNlIDI2OiByZXR1cm4gMTM7CisgICAgICAgIGNhc2UgMjc6IHJldHVybiAxMzsKKyAgICAgICAgY2FzZSAyODogcmV0dXJuIDEzOworICAgICAgICBjYXNlIDI5OiByZXR1cm4gMTM7CisgICAgICAgIGNhc2UgMzA6IHJldHVybiAxMzsKKyAgICAgICAgY2FzZSAzMTogcmV0dXJuIDEzOworICAgICAgICBjYXNlIDMyOiByZXR1cm4gMTM7CisgICAgICAgIGNhc2UgMzM6IHJldHVybiAxMzsKKyAgICAgICAgY2FzZSAzNDogcmV0dXJuIDEzOworICAgICAgICBjYXNlIDM1OiByZXR1cm4gMTM7CisgICAgICAgIGNhc2UgMzY6IHJldHVybiAxMzsKKyAgICAgICAgY2FzZSA1MzogcmV0dXJuIDI7CisgICAgICAgIGNhc2UgNjU6IHJldHVybiAxMzsKKyAgICAgICAgY2FzZSA2NzogcmV0dXJuIDI7CisgICAgICAgIGNhc2UgODA6IHJldHVybiAxNzsKKyAgICAgICAgY2FzZSA4MjogcmV0dXJuIDEzOworICAgICAgICBjYXNlIDgzOiByZXR1cm4gMTM7CisgICAgICAgIGNhc2UgODk6IHJldHVybiAxMTsKKyAgICAgICAgY2FzZSAxMDg6IHJldHVybiAxMzsKKyAgICAgICAgY2FzZSAxMDk6IHJldHVybiAzMjsKKyAgICAgICAgY2FzZSAxMTI6IHJldHVybiAyODsKKyAgICAgICAgY2FzZSAxMTQ6IHJldHVybiA5OworICAgICAgICBjYXNlIDEyODogcmV0dXJuIDEwOworICAgICAgICBjYXNlIDEyOTogcmV0dXJuIDEwOworICAgICAgICBjYXNlIDEzMDogcmV0dXJuIDk7CisgICAgICAgIGNhc2UgMTMyOiByZXR1cm4gMTM7CisgICAgICAgIGNhc2UgMTQ1OiByZXR1cm4gNDE7CisgICAgICAgIGNhc2UgMTU4OiByZXR1cm4gMTM7CisgICAgICAgIGNhc2UgMTYxOiByZXR1cm4gMjsKKyAgICAgICAgY2FzZSAxNjQ6IHJldHVybiAxMTsKKyAgICAgICAgY2FzZSAxNjc6IHJldHVybiAxMzsKKyAgICAgICAgY2FzZSAxODM6IHJldHVybiAxNzsKKyAgICAgICAgY2FzZSAxODg6IHJldHVybiA4OworICAgICAgICBjYXNlIDE4OTogcmV0dXJuIDg7CisgICAgICAgIGNhc2UgMTkwOiByZXR1cm4gODsKKyAgICAgICAgY2FzZSAxOTE6IHJldHVybiA4OworICAgICAgICBjYXNlIDE5MjogcmV0dXJuIDg7CisgICAgICAgIGNhc2UgMTkzOiByZXR1cm4gODsKKyAgICAgICAgY2FzZSAxOTQ6IHJldHVybiA4OworICAgICAgICBjYXNlIDE5NTogcmV0dXJuIDg7CisgICAgICAgIGNhc2UgMTk2OiByZXR1cm4gODsKKyAgICAgICAgY2FzZSAxOTc6IHJldHVybiA4OworICAgICAgICBjYXNlIDE5ODogcmV0dXJuIDg7CisgICAgICAgIGNhc2UgMTk5OiByZXR1cm4gODsKKyAgICAgICAgY2FzZSAyMDA6IHJldHVybiA4OworICAgICAgICBjYXNlIDIwMTogcmV0dXJuIDg7CisgICAgICAgIGNhc2UgMjAyOiByZXR1cm4gODsKKyAgICAgICAgY2FzZSAyMDY6IHJldHVybiAyOworICAgICAgICBjYXNlIDIxNTogcmV0dXJuIDExOworICAgICAgICBjYXNlIDE4MTY6IHJldHVybiAxMjsKKyAgICAgICAgZGVmYXVsdDogcmV0dXJuIEVJTlZBTDsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9QQy9mcm96ZW5fZGxsbWFpbi5jIGIvUEMvZnJvemVuX2RsbG1haW4uYwppbmRleCBmYmI0NzEzLi5hOGNjODg1IDEwMDY0NAotLS0gYS9QQy9mcm96ZW5fZGxsbWFpbi5jCisrKyBiL1BDL2Zyb3plbl9kbGxtYWluLmMKQEAgLTksNyArOSw3IEBACiAKIFRoZSBzb2x1dGlvbiBpczoKICogRWFjaCBtb2R1bGUgY2hlY2tzIGZvciBhIGZyb3plbiBidWlsZCwgYW5kIGlmIHNvLCBkZWZpbmVzIGl0cyBETExNYWluCi0gIGZ1bmN0aW9uIGFzICJfX2RlY2xzcGVjKGRsbGV4cG9ydCkgRGxsTWFpbiVtb2R1bGUlIiAKKyAgZnVuY3Rpb24gYXMgIl9fZGVjbHNwZWMoZGxsZXhwb3J0KSBEbGxNYWluJW1vZHVsZSUiCiAgIChlZywgRGxsTWFpbnB5dGhvbmNvbSwgb3IgRGxsTWFpbnB5d2ludHlwZXMpCiAKICogVGhlIGZyb3plbiAuRVhFLy5ETEwgbGlua3MgYWdhaW5zdCB0aGlzIG1vZHVsZSwgd2hpY2ggcHJvdmlkZXMKQEAgLTQ3LDEwICs0NywxMCBAQAogI2luY2x1ZGUgIndpbmRvd3MuaCIKIAogc3RhdGljIGNoYXIgKnBvc3NpYmxlTW9kdWxlc1tdID0gewotCSJweXdpbnR5cGVzIiwKLQkicHl0aG9uY29tIiwKLQkid2luMzJ1aSIsCi0JTlVMTCwKKyAgICAicHl3aW50eXBlcyIsCisgICAgInB5dGhvbmNvbSIsCisgICAgIndpbjMydWkiLAorICAgIE5VTEwsCiB9OwogCiBCT09MIENhbGxNb2R1bGVEbGxNYWluKGNoYXIgKm1vZE5hbWUsIERXT1JEIGR3UmVhc29uKTsKQEAgLTYyLDczICs2Miw3MyBAQAogKi8KIHZvaWQgUHlXaW5GcmVlemVfRXhlSW5pdCh2b2lkKQogewotCWNoYXIgKiptb2ROYW1lOwotCWZvciAobW9kTmFtZSA9IHBvc3NpYmxlTW9kdWxlczsqbW9kTmFtZTsqbW9kTmFtZSsrKSB7Ci0vKgkJcHJpbnRmKCJJbml0aWFsaXNpbmcgJyVzJ1xuIiwgKm1vZE5hbWUpOyAqLwotCQlDYWxsTW9kdWxlRGxsTWFpbigqbW9kTmFtZSwgRExMX1BST0NFU1NfQVRUQUNIKTsKLQl9CisgICAgY2hhciAqKm1vZE5hbWU7CisgICAgZm9yIChtb2ROYW1lID0gcG9zc2libGVNb2R1bGVzOyptb2ROYW1lOyptb2ROYW1lKyspIHsKKy8qICAgICAgICAgICAgICBwcmludGYoIkluaXRpYWxpc2luZyAnJXMnXG4iLCAqbW9kTmFtZSk7ICovCisgICAgICAgIENhbGxNb2R1bGVEbGxNYWluKCptb2ROYW1lLCBETExfUFJPQ0VTU19BVFRBQ0gpOworICAgIH0KIH0KIAogLyoKICAgQ2FsbGVkIGJ5IGEgZnJvemVuIC5FWEUgb25seSwgc28gdGhhdCBidWlsdC1pbiBleHRlbnNpb24KLSAgbW9kdWxlcyBhcmUgY2xlYW5lZCB1cCAKKyAgbW9kdWxlcyBhcmUgY2xlYW5lZCB1cAogKi8KIHZvaWQgUHlXaW5GcmVlemVfRXhlVGVybSh2b2lkKQogewotCS8vIE11c3QgZ28gYmFja3dhcmRzCi0JY2hhciAqKm1vZE5hbWU7Ci0JZm9yIChtb2ROYW1lID0gcG9zc2libGVNb2R1bGVzKyhzaXplb2YocG9zc2libGVNb2R1bGVzKSAvIHNpemVvZihjaGFyICopKS0yOwotCSAgICAgbW9kTmFtZSA+PSBwb3NzaWJsZU1vZHVsZXM7Ci0JICAgICAqbW9kTmFtZS0tKSB7Ci0vKgkJcHJpbnRmKCJUZXJtaW5hdGluZyAnJXMnXG4iLCAqbW9kTmFtZSk7Ki8KLQkJQ2FsbE1vZHVsZURsbE1haW4oKm1vZE5hbWUsIERMTF9QUk9DRVNTX0RFVEFDSCk7Ci0JfQorICAgIC8vIE11c3QgZ28gYmFja3dhcmRzCisgICAgY2hhciAqKm1vZE5hbWU7CisgICAgZm9yIChtb2ROYW1lID0gcG9zc2libGVNb2R1bGVzKyhzaXplb2YocG9zc2libGVNb2R1bGVzKSAvIHNpemVvZihjaGFyICopKS0yOworICAgICAgICAgbW9kTmFtZSA+PSBwb3NzaWJsZU1vZHVsZXM7CisgICAgICAgICAqbW9kTmFtZS0tKSB7CisvKiAgICAgICAgICAgICAgcHJpbnRmKCJUZXJtaW5hdGluZyAnJXMnXG4iLCAqbW9kTmFtZSk7Ki8KKyAgICAgICAgQ2FsbE1vZHVsZURsbE1haW4oKm1vZE5hbWUsIERMTF9QUk9DRVNTX0RFVEFDSCk7CisgICAgfQogfQogCiBCT09MIFdJTkFQSSBEbGxNYWluKEhJTlNUQU5DRSBoSW5zdGFuY2UsIERXT1JEIGR3UmVhc29uLCBMUFZPSUQgbHBSZXNlcnZlZCkKIHsKLQlCT09MIHJldCA9IFRSVUU7Ci0Jc3dpdGNoIChkd1JlYXNvbikgewotCQljYXNlIERMTF9QUk9DRVNTX0FUVEFDSDogCi0JCXsKLQkJCWNoYXIgKiptb2ROYW1lOwotCQkJZm9yIChtb2ROYW1lID0gcG9zc2libGVNb2R1bGVzOyptb2ROYW1lOyptb2ROYW1lKyspIHsKLQkJCQlCT09MIG9rID0gQ2FsbE1vZHVsZURsbE1haW4oKm1vZE5hbWUsIGR3UmVhc29uKTsKLQkJCQlpZiAoIW9rKQotCQkJCQlyZXQgPSBGQUxTRTsKLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0JCWNhc2UgRExMX1BST0NFU1NfREVUQUNIOiAKLQkJewotCQkJLy8gTXVzdCBnbyBiYWNrd2FyZHMKLQkJCWNoYXIgKiptb2ROYW1lOwotCQkJZm9yIChtb2ROYW1lID0gcG9zc2libGVNb2R1bGVzKyhzaXplb2YocG9zc2libGVNb2R1bGVzKSAvIHNpemVvZihjaGFyICopKS0yOwotCQkJICAgICBtb2ROYW1lID49IHBvc3NpYmxlTW9kdWxlczsKLQkJCSAgICAgKm1vZE5hbWUtLSkKLQkJCQlDYWxsTW9kdWxlRGxsTWFpbigqbW9kTmFtZSwgRExMX1BST0NFU1NfREVUQUNIKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCXJldHVybiByZXQ7CisgICAgQk9PTCByZXQgPSBUUlVFOworICAgIHN3aXRjaCAoZHdSZWFzb24pIHsKKyAgICAgICAgY2FzZSBETExfUFJPQ0VTU19BVFRBQ0g6CisgICAgICAgIHsKKyAgICAgICAgICAgIGNoYXIgKiptb2ROYW1lOworICAgICAgICAgICAgZm9yIChtb2ROYW1lID0gcG9zc2libGVNb2R1bGVzOyptb2ROYW1lOyptb2ROYW1lKyspIHsKKyAgICAgICAgICAgICAgICBCT09MIG9rID0gQ2FsbE1vZHVsZURsbE1haW4oKm1vZE5hbWUsIGR3UmVhc29uKTsKKyAgICAgICAgICAgICAgICBpZiAoIW9rKQorICAgICAgICAgICAgICAgICAgICByZXQgPSBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgRExMX1BST0NFU1NfREVUQUNIOgorICAgICAgICB7CisgICAgICAgICAgICAvLyBNdXN0IGdvIGJhY2t3YXJkcworICAgICAgICAgICAgY2hhciAqKm1vZE5hbWU7CisgICAgICAgICAgICBmb3IgKG1vZE5hbWUgPSBwb3NzaWJsZU1vZHVsZXMrKHNpemVvZihwb3NzaWJsZU1vZHVsZXMpIC8gc2l6ZW9mKGNoYXIgKikpLTI7CisgICAgICAgICAgICAgICAgIG1vZE5hbWUgPj0gcG9zc2libGVNb2R1bGVzOworICAgICAgICAgICAgICAgICAqbW9kTmFtZS0tKQorICAgICAgICAgICAgICAgIENhbGxNb2R1bGVEbGxNYWluKCptb2ROYW1lLCBETExfUFJPQ0VTU19ERVRBQ0gpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJldDsKIH0KIAogQk9PTCBDYWxsTW9kdWxlRGxsTWFpbihjaGFyICptb2ROYW1lLCBEV09SRCBkd1JlYXNvbikKIHsKLQlCT09MIChXSU5BUEkgKiBwZm5kbGxtYWluKShISU5TVEFOQ0UsIERXT1JELCBMUFZPSUQpOworICAgIEJPT0wgKFdJTkFQSSAqIHBmbmRsbG1haW4pKEhJTlNUQU5DRSwgRFdPUkQsIExQVk9JRCk7CiAKLQljaGFyIGZ1bmNOYW1lWzI1NV07Ci0JSE1PRFVMRSBobW9kID0gR2V0TW9kdWxlSGFuZGxlKE5VTEwpOwotCXN0cmNweShmdW5jTmFtZSwgIl9EbGxNYWluIik7Ci0Jc3RyY2F0KGZ1bmNOYW1lLCBtb2ROYW1lKTsKLQlzdHJjYXQoZnVuY05hbWUsICJAMTIiKTsgLy8gc3RkY2FsbCBjb252ZW50aW9uLgotCXBmbmRsbG1haW4gPSAoQk9PTCAoV0lOQVBJICopKEhJTlNUQU5DRSwgRFdPUkQsIExQVk9JRCkpR2V0UHJvY0FkZHJlc3MoaG1vZCwgZnVuY05hbWUpOwotCWlmIChwZm5kbGxtYWluPT1OVUxMKSB7Ci0JCS8qIE5vIGZ1bmN0aW9uIGJ5IHRoYXQgbmFtZSBleHBvcnRlZCAtIHRoZW4gdGhhdCBtb2R1bGUgZG9lcwotIAkJICAgbm90IGFwcGVhciBpbiBvdXIgZnJvemVuIHByb2dyYW0gLSByZXR1cm4gT0sKLSAgICAgICAgICAgICAgICAqLwotCQlyZXR1cm4gVFJVRTsKLQl9Ci0JcmV0dXJuICgqcGZuZGxsbWFpbikoaG1vZCwgZHdSZWFzb24sIE5VTEwpOworICAgIGNoYXIgZnVuY05hbWVbMjU1XTsKKyAgICBITU9EVUxFIGhtb2QgPSBHZXRNb2R1bGVIYW5kbGUoTlVMTCk7CisgICAgc3RyY3B5KGZ1bmNOYW1lLCAiX0RsbE1haW4iKTsKKyAgICBzdHJjYXQoZnVuY05hbWUsIG1vZE5hbWUpOworICAgIHN0cmNhdChmdW5jTmFtZSwgIkAxMiIpOyAvLyBzdGRjYWxsIGNvbnZlbnRpb24uCisgICAgcGZuZGxsbWFpbiA9IChCT09MIChXSU5BUEkgKikoSElOU1RBTkNFLCBEV09SRCwgTFBWT0lEKSlHZXRQcm9jQWRkcmVzcyhobW9kLCBmdW5jTmFtZSk7CisgICAgaWYgKHBmbmRsbG1haW49PU5VTEwpIHsKKyAgICAgICAgLyogTm8gZnVuY3Rpb24gYnkgdGhhdCBuYW1lIGV4cG9ydGVkIC0gdGhlbiB0aGF0IG1vZHVsZSBkb2VzCisgICAgICAgICAgIG5vdCBhcHBlYXIgaW4gb3VyIGZyb3plbiBwcm9ncmFtIC0gcmV0dXJuIE9LCisgICAgICAgICovCisgICAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgICByZXR1cm4gKCpwZm5kbGxtYWluKShobW9kLCBkd1JlYXNvbiwgTlVMTCk7CiB9CiAKZGlmZiAtLWdpdCBhL1BDL2dlbmVycm1hcC5jIGIvUEMvZ2VuZXJybWFwLmMKaW5kZXggMmIyNTA2My4uYmYxMDgxYiAxMDA2NDQKLS0tIGEvUEMvZ2VuZXJybWFwLmMKKysrIGIvUEMvZ2VuZXJybWFwLmMKQEAgLTUsMTYgKzUsMTYgQEAKIAogaW50IG1haW4oKQogewotCWludCBpOwotCXByaW50ZigiLyogR2VuZXJhdGVkIGZpbGUuIERvIG5vdCBlZGl0LiAqL1xuIik7Ci0JcHJpbnRmKCJpbnQgd2luZXJyb3JfdG9fZXJybm8oaW50IHdpbmVycm9yKVxuIik7Ci0JcHJpbnRmKCJ7XG5cdHN3aXRjaCh3aW5lcnJvcikge1xuIik7Ci0JZm9yKGk9MTsgaSA8IDY1MDAwOyBpKyspIHsKLQkJX2Rvc21hcGVycihpKTsKLQkJaWYgKGVycm5vID09IEVJTlZBTCkKLQkJCWNvbnRpbnVlOwotCQlwcmludGYoIlx0XHRjYXNlICVkOiByZXR1cm4gJWQ7XG4iLCBpLCBlcnJubyk7Ci0JfQotCXByaW50ZigiXHRcdGRlZmF1bHQ6IHJldHVybiBFSU5WQUw7XG4iKTsKLQlwcmludGYoIlx0fVxufVxuIik7CisgICAgaW50IGk7CisgICAgcHJpbnRmKCIvKiBHZW5lcmF0ZWQgZmlsZS4gRG8gbm90IGVkaXQuICovXG4iKTsKKyAgICBwcmludGYoImludCB3aW5lcnJvcl90b19lcnJubyhpbnQgd2luZXJyb3IpXG4iKTsKKyAgICBwcmludGYoIntcblx0c3dpdGNoKHdpbmVycm9yKSB7XG4iKTsKKyAgICBmb3IoaT0xOyBpIDwgNjUwMDA7IGkrKykgeworICAgICAgICBfZG9zbWFwZXJyKGkpOworICAgICAgICBpZiAoZXJybm8gPT0gRUlOVkFMKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIHByaW50ZigiXHRcdGNhc2UgJWQ6IHJldHVybiAlZDtcbiIsIGksIGVycm5vKTsKKyAgICB9CisgICAgcHJpbnRmKCJcdFx0ZGVmYXVsdDogcmV0dXJuIEVJTlZBTDtcbiIpOworICAgIHByaW50ZigiXHR9XG59XG4iKTsKIH0KZGlmZiAtLWdpdCBhL1BDL2dldHBhdGhwLmMgYi9QQy9nZXRwYXRocC5jCmluZGV4IDc4ZjQ0NjUuLjQ2MWY5ZmMgMTAwNjQ0Ci0tLSBhL1BDL2dldHBhdGhwLmMKKysrIGIvUEMvZ2V0cGF0aHAuYwpAQCAtNCw4ICs0LDggQEAKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgUEFUSCBSVUxFUyBGT1IgV0lORE9XUzoKLSAgIFRoaXMgZGVzY3JpYmVzIGhvdyBzeXMucGF0aCBpcyBmb3JtZWQgb24gV2luZG93cy4gIEl0IGRlc2NyaWJlcyB0aGUgCi0gICBmdW5jdGlvbmFsaXR5LCBub3QgdGhlIGltcGxlbWVudGF0aW9uIChpZSwgdGhlIG9yZGVyIGluIHdoaWNoIHRoZXNlIAorICAgVGhpcyBkZXNjcmliZXMgaG93IHN5cy5wYXRoIGlzIGZvcm1lZCBvbiBXaW5kb3dzLiAgSXQgZGVzY3JpYmVzIHRoZQorICAgZnVuY3Rpb25hbGl0eSwgbm90IHRoZSBpbXBsZW1lbnRhdGlvbiAoaWUsIHRoZSBvcmRlciBpbiB3aGljaCB0aGVzZQogICAgYXJlIGFjdHVhbGx5IGZldGNoZWQgaXMgZGlmZmVyZW50KQogCiAgICAqIFB5dGhvbiBhbHdheXMgYWRkcyBhbiBlbXB0eSBlbnRyeSBhdCB0aGUgc3RhcnQsIHdoaWNoIGNvcnJlc3BvbmRzCkBAIC0yNCwxNSArMjQsMTUgQEAKICAgICogV2UgYXR0ZW1wdCB0byBsb2NhdGUgdGhlICJQeXRob24gSG9tZSIgLSBpZiB0aGUgUFlUSE9OSE9NRSBlbnYgdmFyCiAgICAgIGlzIHNldCwgd2UgYmVsaWV2ZSBpdC4gIE90aGVyd2lzZSwgd2UgdXNlIHRoZSBwYXRoIG9mIG91ciBob3N0IC5FWEUncwogICAgICB0byB0cnkgYW5kIGxvY2F0ZSBvdXIgImxhbmRtYXJrIiAobGliXFxvcy5weSkgYW5kIGRlZHVjZSBvdXIgaG9tZS4KLSAgICAgLSBJZiB3ZSBETyBoYXZlIGEgUHl0aG9uIEhvbWU6IFRoZSByZWxldmFudCBzdWItZGlyZWN0b3JpZXMgKExpYiwgCisgICAgIC0gSWYgd2UgRE8gaGF2ZSBhIFB5dGhvbiBIb21lOiBUaGUgcmVsZXZhbnQgc3ViLWRpcmVjdG9yaWVzIChMaWIsCiAgICAgICAgcGxhdC13aW4sIGxpYi10aywgZXRjKSBhcmUgYmFzZWQgb24gdGhlIFB5dGhvbiBIb21lCiAgICAgIC0gSWYgd2UgRE8gTk9UIGhhdmUgYSBQeXRob24gSG9tZSwgdGhlIGNvcmUgUHl0aG9uIFBhdGggaXMKLSAgICAgICBsb2FkZWQgZnJvbSB0aGUgcmVnaXN0cnkuICBUaGlzIGlzIHRoZSBtYWluIFB5dGhvblBhdGgga2V5LCAKKyAgICAgICBsb2FkZWQgZnJvbSB0aGUgcmVnaXN0cnkuICBUaGlzIGlzIHRoZSBtYWluIFB5dGhvblBhdGgga2V5LAogICAgICAgIGFuZCBib3RoIEhLTE0gYW5kIEhLQ1UgYXJlIGNvbWJpbmVkIHRvIGZvcm0gdGhlIHBhdGgpCiAKICAgICogSWZmIC0gd2UgY2FuIG5vdCBsb2NhdGUgdGhlIFB5dGhvbiBIb21lLCBoYXZlIG5vdCBoYWQgYSBQWVRIT05QQVRICiAgICAgIHNwZWNpZmllZCwgYW5kIGNhbid0IGxvY2F0ZSBhbnkgUmVnaXN0cnkgZW50cmllcyAoaWUsIHdlIGhhdmUgX25vdGhpbmdfCi0gICAgIHdlIGNhbiBhc3N1bWUgaXMgYSBnb29kIHBhdGgpLCBhIGRlZmF1bHQgcGF0aCB3aXRoIHJlbGF0aXZlIGVudHJpZXMgaXMgCisgICAgIHdlIGNhbiBhc3N1bWUgaXMgYSBnb29kIHBhdGgpLCBhIGRlZmF1bHQgcGF0aCB3aXRoIHJlbGF0aXZlIGVudHJpZXMgaXMKICAgICAgdXNlZCAoZWcuIC5cTGliOy5ccGxhdC13aW4sIGV0YykKIAogCkBAIC00Miw5ICs0Miw5IEBACiAgICAgdGhlIGNvcmUgcGF0aCBpcyBkZWR1Y2VkLCBhbmQgdGhlIGNvcmUgcGF0aHMgaW4gdGhlIHJlZ2lzdHJ5IGFyZQogICAgIGlnbm9yZWQuICBPdGhlciAiYXBwbGljYXRpb24gcGF0aHMiIGluIHRoZSByZWdpc3RyeSBhcmUgYWx3YXlzIHJlYWQuCiAKLSAgKiBXaGVuIFB5dGhvbiBpcyBob3N0ZWQgaW4gYW5vdGhlciBleGUgKGRpZmZlcmVudCBkaXJlY3RvcnksIGVtYmVkZGVkIHZpYSAKKyAgKiBXaGVuIFB5dGhvbiBpcyBob3N0ZWQgaW4gYW5vdGhlciBleGUgKGRpZmZlcmVudCBkaXJlY3RvcnksIGVtYmVkZGVkIHZpYQogICAgIENPTSwgZXRjKSwgdGhlIFB5dGhvbiBIb21lIHdpbGwgbm90IGJlIGRlZHVjZWQsIHNvIHRoZSBjb3JlIHBhdGggZnJvbQotICAgIHRoZSByZWdpc3RyeSBpcyB1c2VkLiAgT3RoZXIgImFwcGxpY2F0aW9uIHBhdGhzIiBpbiB0aGUgcmVnaXN0cnkgYXJlIAorICAgIHRoZSByZWdpc3RyeSBpcyB1c2VkLiAgT3RoZXIgImFwcGxpY2F0aW9uIHBhdGhzIiBpbiB0aGUgcmVnaXN0cnkgYXJlCiAgICAgYWx3YXlzIHJlYWQuCiAKICAgKiBJZiBQeXRob24gY2FuJ3QgZmluZCBpdHMgaG9tZSBhbmQgdGhlcmUgaXMgbm8gcmVnaXN0cnkgKGVnLCBmcm96ZW4KQEAgLTkyLDEyICs5MiwxMiBAQAogCiAKIHN0YXRpYyBpbnQKLWlzX3NlcChjaGFyIGNoKQkvKiBkZXRlcm1pbmUgaWYgImNoIiBpcyBhIHNlcGFyYXRvciBjaGFyYWN0ZXIgKi8KK2lzX3NlcChjaGFyIGNoKSAvKiBkZXRlcm1pbmUgaWYgImNoIiBpcyBhIHNlcGFyYXRvciBjaGFyYWN0ZXIgKi8KIHsKICNpZmRlZiBBTFRTRVAKLQlyZXR1cm4gY2ggPT0gU0VQIHx8IGNoID09IEFMVFNFUDsKKyAgICByZXR1cm4gY2ggPT0gU0VQIHx8IGNoID09IEFMVFNFUDsKICNlbHNlCi0JcmV0dXJuIGNoID09IFNFUDsKKyAgICByZXR1cm4gY2ggPT0gU0VQOwogI2VuZGlmCiB9CiAKQEAgLTEwNywzNiArMTA3LDM2IEBACiBzdGF0aWMgdm9pZAogcmVkdWNlKGNoYXIgKmRpcikKIHsKLQlzaXplX3QgaSA9IHN0cmxlbihkaXIpOwotCXdoaWxlIChpID4gMCAmJiAhaXNfc2VwKGRpcltpXSkpCi0JCS0taTsKLQlkaXJbaV0gPSAnXDAnOworICAgIHNpemVfdCBpID0gc3RybGVuKGRpcik7CisgICAgd2hpbGUgKGkgPiAwICYmICFpc19zZXAoZGlyW2ldKSkKKyAgICAgICAgLS1pOworICAgIGRpcltpXSA9ICdcMCc7CiB9Ci0JCisKIAogc3RhdGljIGludAogZXhpc3RzKGNoYXIgKmZpbGVuYW1lKQogewotCXN0cnVjdCBzdGF0IGJ1ZjsKLQlyZXR1cm4gc3RhdChmaWxlbmFtZSwgJmJ1ZikgPT0gMDsKKyAgICBzdHJ1Y3Qgc3RhdCBidWY7CisgICAgcmV0dXJuIHN0YXQoZmlsZW5hbWUsICZidWYpID09IDA7CiB9CiAKLS8qIEFzc3VtZXMgJ2ZpbGVuYW1lJyBNQVhQQVRITEVOKzEgYnl0ZXMgbG9uZyAtIAorLyogQXNzdW1lcyAnZmlsZW5hbWUnIE1BWFBBVEhMRU4rMSBieXRlcyBsb25nIC0KICAgIG1heSBleHRlbmQgJ2ZpbGVuYW1lJyBieSBvbmUgY2hhcmFjdGVyLgogKi8KIHN0YXRpYyBpbnQKLWlzbW9kdWxlKGNoYXIgKmZpbGVuYW1lKQkvKiBJcyBtb2R1bGUgLS0gY2hlY2sgZm9yIC5weWMvLnB5byB0b28gKi8KK2lzbW9kdWxlKGNoYXIgKmZpbGVuYW1lKSAgICAgICAgLyogSXMgbW9kdWxlIC0tIGNoZWNrIGZvciAucHljLy5weW8gdG9vICovCiB7Ci0JaWYgKGV4aXN0cyhmaWxlbmFtZSkpCi0JCXJldHVybiAxOworICAgIGlmIChleGlzdHMoZmlsZW5hbWUpKQorICAgICAgICByZXR1cm4gMTsKIAotCS8qIENoZWNrIGZvciB0aGUgY29tcGlsZWQgdmVyc2lvbiBvZiBwcmVmaXguICovCi0JaWYgKHN0cmxlbihmaWxlbmFtZSkgPCBNQVhQQVRITEVOKSB7Ci0JCXN0cmNhdChmaWxlbmFtZSwgUHlfT3B0aW1pemVGbGFnID8gIm8iIDogImMiKTsKLQkJaWYgKGV4aXN0cyhmaWxlbmFtZSkpCi0JCQlyZXR1cm4gMTsKLQl9Ci0JcmV0dXJuIDA7CisgICAgLyogQ2hlY2sgZm9yIHRoZSBjb21waWxlZCB2ZXJzaW9uIG9mIHByZWZpeC4gKi8KKyAgICBpZiAoc3RybGVuKGZpbGVuYW1lKSA8IE1BWFBBVEhMRU4pIHsKKyAgICAgICAgc3RyY2F0KGZpbGVuYW1lLCBQeV9PcHRpbWl6ZUZsYWcgPyAibyIgOiAiYyIpOworICAgICAgICBpZiAoZXhpc3RzKGZpbGVuYW1lKSkKKyAgICAgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogLyogQWRkIGEgcGF0aCBjb21wb25lbnQsIGJ5IGFwcGVuZGluZyBzdHVmZiB0byBidWZmZXIuCkBAIC0xNTEsMjEgKzE1MSwyMSBAQAogc3RhdGljIHZvaWQKIGpvaW4oY2hhciAqYnVmZmVyLCBjaGFyICpzdHVmZikKIHsKLQlzaXplX3QgbiwgazsKLQlpZiAoaXNfc2VwKHN0dWZmWzBdKSkKLQkJbiA9IDA7Ci0JZWxzZSB7Ci0JCW4gPSBzdHJsZW4oYnVmZmVyKTsKLQkJaWYgKG4gPiAwICYmICFpc19zZXAoYnVmZmVyW24tMV0pICYmIG4gPCBNQVhQQVRITEVOKQotCQkJYnVmZmVyW24rK10gPSBTRVA7Ci0JfQotCWlmIChuID4gTUFYUEFUSExFTikKLQkJUHlfRmF0YWxFcnJvcigiYnVmZmVyIG92ZXJmbG93IGluIGdldHBhdGhwLmMncyBqb2lucGF0aCgpIik7Ci0JayA9IHN0cmxlbihzdHVmZik7Ci0JaWYgKG4gKyBrID4gTUFYUEFUSExFTikKLQkJayA9IE1BWFBBVEhMRU4gLSBuOwotCXN0cm5jcHkoYnVmZmVyK24sIHN0dWZmLCBrKTsKLQlidWZmZXJbbitrXSA9ICdcMCc7CisgICAgc2l6ZV90IG4sIGs7CisgICAgaWYgKGlzX3NlcChzdHVmZlswXSkpCisgICAgICAgIG4gPSAwOworICAgIGVsc2UgeworICAgICAgICBuID0gc3RybGVuKGJ1ZmZlcik7CisgICAgICAgIGlmIChuID4gMCAmJiAhaXNfc2VwKGJ1ZmZlcltuLTFdKSAmJiBuIDwgTUFYUEFUSExFTikKKyAgICAgICAgICAgIGJ1ZmZlcltuKytdID0gU0VQOworICAgIH0KKyAgICBpZiAobiA+IE1BWFBBVEhMRU4pCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoImJ1ZmZlciBvdmVyZmxvdyBpbiBnZXRwYXRocC5jJ3Mgam9pbnBhdGgoKSIpOworICAgIGsgPSBzdHJsZW4oc3R1ZmYpOworICAgIGlmIChuICsgayA+IE1BWFBBVEhMRU4pCisgICAgICAgIGsgPSBNQVhQQVRITEVOIC0gbjsKKyAgICBzdHJuY3B5KGJ1ZmZlcituLCBzdHVmZiwgayk7CisgICAgYnVmZmVyW24ra10gPSAnXDAnOwogfQogCiAvKiBnb3RsYW5kbWFyayBvbmx5IGNhbGxlZCBieSBzZWFyY2hfZm9yX3ByZWZpeCwgd2hpY2ggZW5zdXJlcwpAQCAtMTc1LDI5ICsxNzUsMjkgQEAKIHN0YXRpYyBpbnQKIGdvdGxhbmRtYXJrKGNoYXIgKmxhbmRtYXJrKQogewotCWludCBvazsKLQlQeV9zc2l6ZV90IG47CisgICAgaW50IG9rOworICAgIFB5X3NzaXplX3QgbjsKIAotCW4gPSBzdHJsZW4ocHJlZml4KTsKLQlqb2luKHByZWZpeCwgbGFuZG1hcmspOwotCW9rID0gaXNtb2R1bGUocHJlZml4KTsKLQlwcmVmaXhbbl0gPSAnXDAnOwotCXJldHVybiBvazsKKyAgICBuID0gc3RybGVuKHByZWZpeCk7CisgICAgam9pbihwcmVmaXgsIGxhbmRtYXJrKTsKKyAgICBvayA9IGlzbW9kdWxlKHByZWZpeCk7CisgICAgcHJlZml4W25dID0gJ1wwJzsKKyAgICByZXR1cm4gb2s7CiB9CiAKLS8qIGFzc3VtZXMgYXJndjBfcGF0aCBpcyBNQVhQQVRITEVOKzEgYnl0ZXMgbG9uZywgYWxyZWFkeSBcMCB0ZXJtJ2QuIAorLyogYXNzdW1lcyBhcmd2MF9wYXRoIGlzIE1BWFBBVEhMRU4rMSBieXRlcyBsb25nLCBhbHJlYWR5IFwwIHRlcm0nZC4KICAgIGFzc3VtcHRpb24gcHJvdmlkZWQgYnkgb25seSBjYWxsZXIsIGNhbGN1bGF0ZV9wYXRoKCkgKi8KIHN0YXRpYyBpbnQKIHNlYXJjaF9mb3JfcHJlZml4KGNoYXIgKmFyZ3YwX3BhdGgsIGNoYXIgKmxhbmRtYXJrKQogewotCS8qIFNlYXJjaCBmcm9tIGFyZ3YwX3BhdGgsIHVudGlsIGxhbmRtYXJrIGlzIGZvdW5kICovCi0Jc3RyY3B5KHByZWZpeCwgYXJndjBfcGF0aCk7Ci0JZG8gewotCQlpZiAoZ290bGFuZG1hcmsobGFuZG1hcmspKQotCQkJcmV0dXJuIDE7Ci0JCXJlZHVjZShwcmVmaXgpOwotCX0gd2hpbGUgKHByZWZpeFswXSk7Ci0JcmV0dXJuIDA7CisgICAgLyogU2VhcmNoIGZyb20gYXJndjBfcGF0aCwgdW50aWwgbGFuZG1hcmsgaXMgZm91bmQgKi8KKyAgICBzdHJjcHkocHJlZml4LCBhcmd2MF9wYXRoKTsKKyAgICBkbyB7CisgICAgICAgIGlmIChnb3RsYW5kbWFyayhsYW5kbWFyaykpCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgcmVkdWNlKHByZWZpeCk7CisgICAgfSB3aGlsZSAocHJlZml4WzBdKTsKKyAgICByZXR1cm4gMDsKIH0KIAogI2lmZGVmIE1TX1dJTkRPV1MKQEAgLTIyMywxNDYgKzIyMywxNDYgQEAKIHN0YXRpYyBjaGFyICoKIGdldHB5dGhvbnJlZ3BhdGgoSEtFWSBrZXlCYXNlLCBpbnQgc2tpcGNvcmUpCiB7Ci0JSEtFWSBuZXdLZXkgPSAwOwotCURXT1JEIGRhdGFTaXplID0gMDsKLQlEV09SRCBudW1LZXlzID0gMDsKLQlMT05HIHJjOwotCWNoYXIgKnJldHZhbCA9IE5VTEw7Ci0JVENIQVIgKmRhdGFCdWYgPSBOVUxMOwotCXN0YXRpYyBjb25zdCBUQ0hBUiBrZXlQcmVmaXhbXSA9IF9UKCJTb2Z0d2FyZVxcUHl0aG9uXFxQeXRob25Db3JlXFwiKTsKLQlzdGF0aWMgY29uc3QgVENIQVIga2V5U3VmZml4W10gPSBfVCgiXFxQeXRob25QYXRoIik7Ci0Jc2l6ZV90IHZlcnNpb25MZW47Ci0JRFdPUkQgaW5kZXg7Ci0JVENIQVIgKmtleUJ1ZiA9IE5VTEw7Ci0JVENIQVIgKmtleUJ1ZlB0cjsKLQlUQ0hBUiAqKnBwUGF0aHMgPSBOVUxMOworICAgIEhLRVkgbmV3S2V5ID0gMDsKKyAgICBEV09SRCBkYXRhU2l6ZSA9IDA7CisgICAgRFdPUkQgbnVtS2V5cyA9IDA7CisgICAgTE9ORyByYzsKKyAgICBjaGFyICpyZXR2YWwgPSBOVUxMOworICAgIFRDSEFSICpkYXRhQnVmID0gTlVMTDsKKyAgICBzdGF0aWMgY29uc3QgVENIQVIga2V5UHJlZml4W10gPSBfVCgiU29mdHdhcmVcXFB5dGhvblxcUHl0aG9uQ29yZVxcIik7CisgICAgc3RhdGljIGNvbnN0IFRDSEFSIGtleVN1ZmZpeFtdID0gX1QoIlxcUHl0aG9uUGF0aCIpOworICAgIHNpemVfdCB2ZXJzaW9uTGVuOworICAgIERXT1JEIGluZGV4OworICAgIFRDSEFSICprZXlCdWYgPSBOVUxMOworICAgIFRDSEFSICprZXlCdWZQdHI7CisgICAgVENIQVIgKipwcFBhdGhzID0gTlVMTDsKIAotCS8qIFRyaWVkIHRvIHVzZSBzeXNnZXQoIndpbnZlciIpIGJ1dCBoZXJlIGlzIHRvbyBlYXJseSA6LSggKi8KLQl2ZXJzaW9uTGVuID0gX3Rjc2xlbihQeVdpbl9ETExWZXJzaW9uU3RyaW5nKTsKLQkvKiBTcGFjZSBmb3IgYWxsIHRoZSBjaGFycywgcGx1cyBvbmUgXDAgKi8KLQlrZXlCdWYgPSBrZXlCdWZQdHIgPSBtYWxsb2Moc2l6ZW9mKGtleVByZWZpeCkgKyAKLQkJICAgICAgICAgICAgICAgICAgICBzaXplb2YoVENIQVIpKih2ZXJzaW9uTGVuLTEpICsgCi0JCQkJICAgIHNpemVvZihrZXlTdWZmaXgpKTsKLQlpZiAoa2V5QnVmPT1OVUxMKSBnb3RvIGRvbmU7CisgICAgLyogVHJpZWQgdG8gdXNlIHN5c2dldCgid2ludmVyIikgYnV0IGhlcmUgaXMgdG9vIGVhcmx5IDotKCAqLworICAgIHZlcnNpb25MZW4gPSBfdGNzbGVuKFB5V2luX0RMTFZlcnNpb25TdHJpbmcpOworICAgIC8qIFNwYWNlIGZvciBhbGwgdGhlIGNoYXJzLCBwbHVzIG9uZSBcMCAqLworICAgIGtleUJ1ZiA9IGtleUJ1ZlB0ciA9IG1hbGxvYyhzaXplb2Yoa2V5UHJlZml4KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihUQ0hBUikqKHZlcnNpb25MZW4tMSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoa2V5U3VmZml4KSk7CisgICAgaWYgKGtleUJ1Zj09TlVMTCkgZ290byBkb25lOwogCi0JbWVtY3B5KGtleUJ1ZlB0ciwga2V5UHJlZml4LCBzaXplb2Yoa2V5UHJlZml4KS1zaXplb2YoVENIQVIpKTsKLQlrZXlCdWZQdHIgKz0gc2l6ZW9mKGtleVByZWZpeCkvc2l6ZW9mKFRDSEFSKSAtIDE7Ci0JbWVtY3B5KGtleUJ1ZlB0ciwgUHlXaW5fRExMVmVyc2lvblN0cmluZywgdmVyc2lvbkxlbiAqIHNpemVvZihUQ0hBUikpOwotCWtleUJ1ZlB0ciArPSB2ZXJzaW9uTGVuOwotCS8qIE5VTEwgY29tZXMgd2l0aCB0aGlzIG9uZSEgKi8KLQltZW1jcHkoa2V5QnVmUHRyLCBrZXlTdWZmaXgsIHNpemVvZihrZXlTdWZmaXgpKTsKLQkvKiBPcGVuIHRoZSByb290IFB5dGhvbiBrZXkgKi8KLQlyYz1SZWdPcGVuS2V5RXgoa2V5QmFzZSwKLQkgICAgICAgICAgICAgICAga2V5QnVmLCAvKiBzdWJrZXkgKi8KLQkgICAgICAgICAgICAgICAgMCwgLyogcmVzZXJ2ZWQgKi8KLQkgICAgICAgICAgICAgICAgS0VZX1JFQUQsCi0JICAgICAgICAgICAgICAgICZuZXdLZXkpOwotCWlmIChyYyE9RVJST1JfU1VDQ0VTUykgZ290byBkb25lOwotCS8qIEZpbmQgb3V0IGhvdyBiaWcgb3VyIGNvcmUgYnVmZmVyIGlzLCBhbmQgaG93IG1hbnkgc3Via2V5cyB3ZSBoYXZlICovCi0JcmMgPSBSZWdRdWVyeUluZm9LZXkobmV3S2V5LCBOVUxMLCBOVUxMLCBOVUxMLCAmbnVtS2V5cywgTlVMTCwgTlVMTCwgCi0JICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsICZkYXRhU2l6ZSwgTlVMTCwgTlVMTCk7Ci0JaWYgKHJjIT1FUlJPUl9TVUNDRVNTKSBnb3RvIGRvbmU7Ci0JaWYgKHNraXBjb3JlKSBkYXRhU2l6ZSA9IDA7IC8qIE9ubHkgY291bnQgY29yZSBvbmVzIGlmIHdlIHdhbnQgdGhlbSEgKi8KLQkvKiBBbGxvY2F0ZSBhIHRlbXAgYXJyYXkgb2YgY2hhciBidWZmZXJzLCBzbyB3ZSBvbmx5IG5lZWQgdG8gbG9vcCAKLQkgICByZWFkaW5nIHRoZSByZWdpc3RyeSBvbmNlCi0JKi8KLQlwcFBhdGhzID0gbWFsbG9jKCBzaXplb2YoVENIQVIgKikgKiBudW1LZXlzICk7Ci0JaWYgKHBwUGF0aHM9PU5VTEwpIGdvdG8gZG9uZTsKLQltZW1zZXQocHBQYXRocywgMCwgc2l6ZW9mKFRDSEFSICopICogbnVtS2V5cyk7Ci0JLyogTG9vcCBvdmVyIGFsbCBzdWJrZXlzLCBhbGxvY2F0aW5nIGEgdGVtcCBzdWItYnVmZmVyLiAqLwotCWZvcihpbmRleD0wO2luZGV4PG51bUtleXM7aW5kZXgrKykgewotCQlUQ0hBUiBrZXlCdWZbTUFYX1BBVEgrMV07Ci0JCUhLRVkgc3ViS2V5ID0gMDsKLQkJRFdPUkQgcmVxZFNpemUgPSBNQVhfUEFUSCsxOwotCQkvKiBHZXQgdGhlIHN1Yi1rZXkgbmFtZSAqLwotCQlEV09SRCByYyA9IFJlZ0VudW1LZXlFeChuZXdLZXksIGluZGV4LCBrZXlCdWYsICZyZXFkU2l6ZSwKLQkJICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCApOwotCQlpZiAocmMhPUVSUk9SX1NVQ0NFU1MpIGdvdG8gZG9uZTsKLQkJLyogT3BlbiB0aGUgc3ViLWtleSAqLwotCQlyYz1SZWdPcGVuS2V5RXgobmV3S2V5LAotCQkJCQkJa2V5QnVmLCAvKiBzdWJrZXkgKi8KLQkJCQkJCTAsIC8qIHJlc2VydmVkICovCi0JCQkJCQlLRVlfUkVBRCwKLQkJCQkJCSZzdWJLZXkpOwotCQlpZiAocmMhPUVSUk9SX1NVQ0NFU1MpIGdvdG8gZG9uZTsKLQkJLyogRmluZCB0aGUgdmFsdWUgb2YgdGhlIGJ1ZmZlciBzaXplLCBtYWxsb2MsIHRoZW4gcmVhZCBpdCAqLwotCQlSZWdRdWVyeVZhbHVlRXgoc3ViS2V5LCBOVUxMLCAwLCBOVUxMLCBOVUxMLCAmcmVxZFNpemUpOwotCQlpZiAocmVxZFNpemUpIHsKLQkJCXBwUGF0aHNbaW5kZXhdID0gbWFsbG9jKHJlcWRTaXplKTsKLQkJCWlmIChwcFBhdGhzW2luZGV4XSkgewotCQkJCVJlZ1F1ZXJ5VmFsdWVFeChzdWJLZXksIE5VTEwsIDAsIE5VTEwsIAotCQkJCSAgICAgICAgICAgICAgICAoTFBCWVRFKXBwUGF0aHNbaW5kZXhdLCAKLQkJCQkgICAgICAgICAgICAgICAgJnJlcWRTaXplKTsKLQkJCQlkYXRhU2l6ZSArPSByZXFkU2l6ZSArIDE7IC8qIDEgZm9yIHRoZSAiOyIgKi8KLQkJCX0KLQkJfQotCQlSZWdDbG9zZUtleShzdWJLZXkpOwotCX0KKyAgICBtZW1jcHkoa2V5QnVmUHRyLCBrZXlQcmVmaXgsIHNpemVvZihrZXlQcmVmaXgpLXNpemVvZihUQ0hBUikpOworICAgIGtleUJ1ZlB0ciArPSBzaXplb2Yoa2V5UHJlZml4KS9zaXplb2YoVENIQVIpIC0gMTsKKyAgICBtZW1jcHkoa2V5QnVmUHRyLCBQeVdpbl9ETExWZXJzaW9uU3RyaW5nLCB2ZXJzaW9uTGVuICogc2l6ZW9mKFRDSEFSKSk7CisgICAga2V5QnVmUHRyICs9IHZlcnNpb25MZW47CisgICAgLyogTlVMTCBjb21lcyB3aXRoIHRoaXMgb25lISAqLworICAgIG1lbWNweShrZXlCdWZQdHIsIGtleVN1ZmZpeCwgc2l6ZW9mKGtleVN1ZmZpeCkpOworICAgIC8qIE9wZW4gdGhlIHJvb3QgUHl0aG9uIGtleSAqLworICAgIHJjPVJlZ09wZW5LZXlFeChrZXlCYXNlLAorICAgICAgICAgICAgICAgICAgICBrZXlCdWYsIC8qIHN1YmtleSAqLworICAgICAgICAgICAgMCwgLyogcmVzZXJ2ZWQgKi8KKyAgICAgICAgICAgIEtFWV9SRUFELAorICAgICAgICAgICAgJm5ld0tleSk7CisgICAgaWYgKHJjIT1FUlJPUl9TVUNDRVNTKSBnb3RvIGRvbmU7CisgICAgLyogRmluZCBvdXQgaG93IGJpZyBvdXIgY29yZSBidWZmZXIgaXMsIGFuZCBob3cgbWFueSBzdWJrZXlzIHdlIGhhdmUgKi8KKyAgICByYyA9IFJlZ1F1ZXJ5SW5mb0tleShuZXdLZXksIE5VTEwsIE5VTEwsIE5VTEwsICZudW1LZXlzLCBOVUxMLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCAmZGF0YVNpemUsIE5VTEwsIE5VTEwpOworICAgIGlmIChyYyE9RVJST1JfU1VDQ0VTUykgZ290byBkb25lOworICAgIGlmIChza2lwY29yZSkgZGF0YVNpemUgPSAwOyAvKiBPbmx5IGNvdW50IGNvcmUgb25lcyBpZiB3ZSB3YW50IHRoZW0hICovCisgICAgLyogQWxsb2NhdGUgYSB0ZW1wIGFycmF5IG9mIGNoYXIgYnVmZmVycywgc28gd2Ugb25seSBuZWVkIHRvIGxvb3AKKyAgICAgICByZWFkaW5nIHRoZSByZWdpc3RyeSBvbmNlCisgICAgKi8KKyAgICBwcFBhdGhzID0gbWFsbG9jKCBzaXplb2YoVENIQVIgKikgKiBudW1LZXlzICk7CisgICAgaWYgKHBwUGF0aHM9PU5VTEwpIGdvdG8gZG9uZTsKKyAgICBtZW1zZXQocHBQYXRocywgMCwgc2l6ZW9mKFRDSEFSICopICogbnVtS2V5cyk7CisgICAgLyogTG9vcCBvdmVyIGFsbCBzdWJrZXlzLCBhbGxvY2F0aW5nIGEgdGVtcCBzdWItYnVmZmVyLiAqLworICAgIGZvcihpbmRleD0wO2luZGV4PG51bUtleXM7aW5kZXgrKykgeworICAgICAgICBUQ0hBUiBrZXlCdWZbTUFYX1BBVEgrMV07CisgICAgICAgIEhLRVkgc3ViS2V5ID0gMDsKKyAgICAgICAgRFdPUkQgcmVxZFNpemUgPSBNQVhfUEFUSCsxOworICAgICAgICAvKiBHZXQgdGhlIHN1Yi1rZXkgbmFtZSAqLworICAgICAgICBEV09SRCByYyA9IFJlZ0VudW1LZXlFeChuZXdLZXksIGluZGV4LCBrZXlCdWYsICZyZXFkU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCApOworICAgICAgICBpZiAocmMhPUVSUk9SX1NVQ0NFU1MpIGdvdG8gZG9uZTsKKyAgICAgICAgLyogT3BlbiB0aGUgc3ViLWtleSAqLworICAgICAgICByYz1SZWdPcGVuS2V5RXgobmV3S2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleUJ1ZiwgLyogc3Via2V5ICovCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKiByZXNlcnZlZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgS0VZX1JFQUQsCisgICAgICAgICAgICAgICAgICAgICAgICAmc3ViS2V5KTsKKyAgICAgICAgaWYgKHJjIT1FUlJPUl9TVUNDRVNTKSBnb3RvIGRvbmU7CisgICAgICAgIC8qIEZpbmQgdGhlIHZhbHVlIG9mIHRoZSBidWZmZXIgc2l6ZSwgbWFsbG9jLCB0aGVuIHJlYWQgaXQgKi8KKyAgICAgICAgUmVnUXVlcnlWYWx1ZUV4KHN1YktleSwgTlVMTCwgMCwgTlVMTCwgTlVMTCwgJnJlcWRTaXplKTsKKyAgICAgICAgaWYgKHJlcWRTaXplKSB7CisgICAgICAgICAgICBwcFBhdGhzW2luZGV4XSA9IG1hbGxvYyhyZXFkU2l6ZSk7CisgICAgICAgICAgICBpZiAocHBQYXRoc1tpbmRleF0pIHsKKyAgICAgICAgICAgICAgICBSZWdRdWVyeVZhbHVlRXgoc3ViS2V5LCBOVUxMLCAwLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFBCWVRFKXBwUGF0aHNbaW5kZXhdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVxZFNpemUpOworICAgICAgICAgICAgICAgIGRhdGFTaXplICs9IHJlcWRTaXplICsgMTsgLyogMSBmb3IgdGhlICI7IiAqLworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFJlZ0Nsb3NlS2V5KHN1YktleSk7CisgICAgfQogCi0JLyogcmV0dXJuIG51bGwgaWYgbm8gcGF0aCB0byByZXR1cm4gKi8KLQlpZiAoZGF0YVNpemUgPT0gMCkgZ290byBkb25lOworICAgIC8qIHJldHVybiBudWxsIGlmIG5vIHBhdGggdG8gcmV0dXJuICovCisgICAgaWYgKGRhdGFTaXplID09IDApIGdvdG8gZG9uZTsKIAotCS8qIG9yaWdpbmFsIGRhdGFzaXplIGZyb20gUmVnUXVlcnlJbmZvIGRvZXNuJ3QgaW5jbHVkZSB0aGUgXDAgKi8KLQlkYXRhQnVmID0gbWFsbG9jKChkYXRhU2l6ZSsxKSAqIHNpemVvZihUQ0hBUikpOwotCWlmIChkYXRhQnVmKSB7Ci0JCVRDSEFSICpzekN1ciA9IGRhdGFCdWY7Ci0JCURXT1JEIHJlcWRTaXplID0gZGF0YVNpemU7Ci0JCS8qIENvcHkgb3VyIGNvbGxlY3RlZCBzdHJpbmdzICovCi0JCWZvciAoaW5kZXg9MDtpbmRleDxudW1LZXlzO2luZGV4KyspIHsKLQkJCWlmIChpbmRleCA+IDApIHsKLQkJCQkqKHN6Q3VyKyspID0gX1QoJzsnKTsKLQkJCQlkYXRhU2l6ZS0tOwotCQkJfQotCQkJaWYgKHBwUGF0aHNbaW5kZXhdKSB7Ci0JCQkJUHlfc3NpemVfdCBsZW4gPSBfdGNzbGVuKHBwUGF0aHNbaW5kZXhdKTsKLQkJCQlfdGNzbmNweShzekN1ciwgcHBQYXRoc1tpbmRleF0sIGxlbik7Ci0JCQkJc3pDdXIgKz0gbGVuOwotCQkJCWFzc2VydChkYXRhU2l6ZSA+IChEV09SRClsZW4pOwotCQkJCWRhdGFTaXplIC09IChEV09SRClsZW47Ci0JCQl9Ci0JCX0KLQkJaWYgKHNraXBjb3JlKQotCQkJKnN6Q3VyID0gJ1wwJzsKLQkJZWxzZSB7Ci0JCQkvKiBJZiB3ZSBoYXZlIG5vIHZhbHVlcywgd2UgZG9udCBuZWVkIGEgJzsnICovCi0JCQlpZiAobnVtS2V5cykgewotCQkJCSooc3pDdXIrKykgPSBfVCgnOycpOwotCQkJCWRhdGFTaXplLS07Ci0JCQl9Ci0JCQkvKiBOb3cgYXBwZW5kIHRoZSBjb3JlIHBhdGggZW50cmllcyAtIAotCQkJICAgdGhpcyB3aWxsIGluY2x1ZGUgdGhlIE5VTEwgCi0JCQkqLwotCQkJcmMgPSBSZWdRdWVyeVZhbHVlRXgobmV3S2V5LCBOVUxMLCAwLCBOVUxMLCAKLQkJCSAgICAgICAgICAgICAgICAgICAgIChMUEJZVEUpc3pDdXIsICZkYXRhU2l6ZSk7Ci0JCX0KLQkJLyogQW5kIHNldCB0aGUgcmVzdWx0IC0gY2FsbGVyIG11c3QgZnJlZSAKLQkJICAgSWYgTUJDUywgaXQgaXMgZmluZSBhcyBpcy4gIElmIFVuaWNvZGUsIGFsbG9jYXRlIG5ldwotCQkgICBidWZmZXIgYW5kIGNvbnZlcnQuCi0JCSovCisgICAgLyogb3JpZ2luYWwgZGF0YXNpemUgZnJvbSBSZWdRdWVyeUluZm8gZG9lc24ndCBpbmNsdWRlIHRoZSBcMCAqLworICAgIGRhdGFCdWYgPSBtYWxsb2MoKGRhdGFTaXplKzEpICogc2l6ZW9mKFRDSEFSKSk7CisgICAgaWYgKGRhdGFCdWYpIHsKKyAgICAgICAgVENIQVIgKnN6Q3VyID0gZGF0YUJ1ZjsKKyAgICAgICAgRFdPUkQgcmVxZFNpemUgPSBkYXRhU2l6ZTsKKyAgICAgICAgLyogQ29weSBvdXIgY29sbGVjdGVkIHN0cmluZ3MgKi8KKyAgICAgICAgZm9yIChpbmRleD0wO2luZGV4PG51bUtleXM7aW5kZXgrKykgeworICAgICAgICAgICAgaWYgKGluZGV4ID4gMCkgeworICAgICAgICAgICAgICAgICooc3pDdXIrKykgPSBfVCgnOycpOworICAgICAgICAgICAgICAgIGRhdGFTaXplLS07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocHBQYXRoc1tpbmRleF0pIHsKKyAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IGxlbiA9IF90Y3NsZW4ocHBQYXRoc1tpbmRleF0pOworICAgICAgICAgICAgICAgIF90Y3NuY3B5KHN6Q3VyLCBwcFBhdGhzW2luZGV4XSwgbGVuKTsKKyAgICAgICAgICAgICAgICBzekN1ciArPSBsZW47CisgICAgICAgICAgICAgICAgYXNzZXJ0KGRhdGFTaXplID4gKERXT1JEKWxlbik7CisgICAgICAgICAgICAgICAgZGF0YVNpemUgLT0gKERXT1JEKWxlbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoc2tpcGNvcmUpCisgICAgICAgICAgICAqc3pDdXIgPSAnXDAnOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8qIElmIHdlIGhhdmUgbm8gdmFsdWVzLCB3ZSBkb250IG5lZWQgYSAnOycgKi8KKyAgICAgICAgICAgIGlmIChudW1LZXlzKSB7CisgICAgICAgICAgICAgICAgKihzekN1cisrKSA9IF9UKCc7Jyk7CisgICAgICAgICAgICAgICAgZGF0YVNpemUtLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIE5vdyBhcHBlbmQgdGhlIGNvcmUgcGF0aCBlbnRyaWVzIC0KKyAgICAgICAgICAgICAgIHRoaXMgd2lsbCBpbmNsdWRlIHRoZSBOVUxMCisgICAgICAgICAgICAqLworICAgICAgICAgICAgcmMgPSBSZWdRdWVyeVZhbHVlRXgobmV3S2V5LCBOVUxMLCAwLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExQQllURSlzekN1ciwgJmRhdGFTaXplKTsKKyAgICAgICAgfQorICAgICAgICAvKiBBbmQgc2V0IHRoZSByZXN1bHQgLSBjYWxsZXIgbXVzdCBmcmVlCisgICAgICAgICAgIElmIE1CQ1MsIGl0IGlzIGZpbmUgYXMgaXMuICBJZiBVbmljb2RlLCBhbGxvY2F0ZSBuZXcKKyAgICAgICAgICAgYnVmZmVyIGFuZCBjb252ZXJ0LgorICAgICAgICAqLwogI2lmZGVmIFVOSUNPREUKLQkJcmV0dmFsID0gKGNoYXIgKiltYWxsb2MocmVxZFNpemUrMSk7Ci0JCWlmIChyZXR2YWwpCi0JCQlXaWRlQ2hhclRvTXVsdGlCeXRlKENQX0FDUCwgMCwgCi0JCQkJCWRhdGFCdWYsIC0xLCAvKiBzb3VyY2UgKi8gCi0JCQkJCXJldHZhbCwgcmVxZFNpemUrMSwgLyogZGVzdCAqLwotCQkJCQlOVUxMLCBOVUxMKTsKLQkJZnJlZShkYXRhQnVmKTsKKyAgICAgICAgcmV0dmFsID0gKGNoYXIgKiltYWxsb2MocmVxZFNpemUrMSk7CisgICAgICAgIGlmIChyZXR2YWwpCisgICAgICAgICAgICBXaWRlQ2hhclRvTXVsdGlCeXRlKENQX0FDUCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhQnVmLCAtMSwgLyogc291cmNlICovCisgICAgICAgICAgICAgICAgICAgIHJldHZhbCwgcmVxZFNpemUrMSwgLyogZGVzdCAqLworICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMKTsKKyAgICAgICAgZnJlZShkYXRhQnVmKTsKICNlbHNlCi0JCXJldHZhbCA9IGRhdGFCdWY7CisgICAgICAgIHJldHZhbCA9IGRhdGFCdWY7CiAjZW5kaWYKLQl9CisgICAgfQogZG9uZToKLQkvKiBMb29wIGZyZWVpbmcgbXkgdGVtcCBidWZmZXJzICovCi0JaWYgKHBwUGF0aHMpIHsKLQkJZm9yKGluZGV4PTA7aW5kZXg8bnVtS2V5cztpbmRleCsrKQotCQkJaWYgKHBwUGF0aHNbaW5kZXhdKSBmcmVlKHBwUGF0aHNbaW5kZXhdKTsKLQkJZnJlZShwcFBhdGhzKTsKLQl9Ci0JaWYgKG5ld0tleSkKLQkJUmVnQ2xvc2VLZXkobmV3S2V5KTsKLQlpZiAoa2V5QnVmKQotCQlmcmVlKGtleUJ1Zik7Ci0JcmV0dXJuIHJldHZhbDsKKyAgICAvKiBMb29wIGZyZWVpbmcgbXkgdGVtcCBidWZmZXJzICovCisgICAgaWYgKHBwUGF0aHMpIHsKKyAgICAgICAgZm9yKGluZGV4PTA7aW5kZXg8bnVtS2V5cztpbmRleCsrKQorICAgICAgICAgICAgaWYgKHBwUGF0aHNbaW5kZXhdKSBmcmVlKHBwUGF0aHNbaW5kZXhdKTsKKyAgICAgICAgZnJlZShwcFBhdGhzKTsKKyAgICB9CisgICAgaWYgKG5ld0tleSkKKyAgICAgICAgUmVnQ2xvc2VLZXkobmV3S2V5KTsKKyAgICBpZiAoa2V5QnVmKQorICAgICAgICBmcmVlKGtleUJ1Zik7CisgICAgcmV0dXJuIHJldHZhbDsKIH0KICNlbmRpZiAvKiBQeV9FTkFCTEVfU0hBUkVEICovCiAjZW5kaWYgLyogTVNfV0lORE9XUyAqLwpAQCAtMzcwLDMxNCArMzcwLDMxNCBAQAogc3RhdGljIHZvaWQKIGdldF9wcm9ncGF0aCh2b2lkKQogewotCWV4dGVybiBjaGFyICpQeV9HZXRQcm9ncmFtTmFtZSh2b2lkKTsKLQljaGFyICpwYXRoID0gZ2V0ZW52KCJQQVRIIik7Ci0JY2hhciAqcHJvZyA9IFB5X0dldFByb2dyYW1OYW1lKCk7CisgICAgZXh0ZXJuIGNoYXIgKlB5X0dldFByb2dyYW1OYW1lKHZvaWQpOworICAgIGNoYXIgKnBhdGggPSBnZXRlbnYoIlBBVEgiKTsKKyAgICBjaGFyICpwcm9nID0gUHlfR2V0UHJvZ3JhbU5hbWUoKTsKIAogI2lmZGVmIE1TX1dJTkRPV1MKLQlleHRlcm4gSEFORExFIFB5V2luX0RMTGhNb2R1bGU7CisgICAgZXh0ZXJuIEhBTkRMRSBQeVdpbl9ETExoTW9kdWxlOwogI2lmZGVmIFVOSUNPREUKLQlXQ0hBUiB3cHJvZ3BhdGhbTUFYUEFUSExFTisxXTsKLQkvKiBXaW5kb3dzIGRvY3VtZW50cyB0aGF0IEdldE1vZHVsZUZpbGVOYW1lKCkgd2lsbCAidHJ1bmNhdGUiLAotCSAgIGJ1dCBtYWtlcyBubyBtZW50aW9uIG9mIHRoZSBudWxsIHRlcm1pbmF0b3IuICBQbGF5IGl0IHNhZmUuCi0JICAgUExVUyBXaW5kb3dzIGl0c2VsZiBkZWZpbmVzIE1BWF9QQVRIIGFzIHRoZSBzYW1lLCBidXQgYW55d2F5Li4uCi0JKi8KKyAgICBXQ0hBUiB3cHJvZ3BhdGhbTUFYUEFUSExFTisxXTsKKyAgICAvKiBXaW5kb3dzIGRvY3VtZW50cyB0aGF0IEdldE1vZHVsZUZpbGVOYW1lKCkgd2lsbCAidHJ1bmNhdGUiLAorICAgICAgIGJ1dCBtYWtlcyBubyBtZW50aW9uIG9mIHRoZSBudWxsIHRlcm1pbmF0b3IuICBQbGF5IGl0IHNhZmUuCisgICAgICAgUExVUyBXaW5kb3dzIGl0c2VsZiBkZWZpbmVzIE1BWF9QQVRIIGFzIHRoZSBzYW1lLCBidXQgYW55d2F5Li4uCisgICAgKi8KICNpZmRlZiBQeV9FTkFCTEVfU0hBUkVECi0Jd3Byb2dwYXRoW01BWFBBVEhMRU5dPV9UKCdcMCcpOwotCWlmIChQeVdpbl9ETExoTW9kdWxlICYmCi0JICAgIEdldE1vZHVsZUZpbGVOYW1lKFB5V2luX0RMTGhNb2R1bGUsIHdwcm9ncGF0aCwgTUFYUEFUSExFTikpIHsKLQkJV2lkZUNoYXJUb011bHRpQnl0ZShDUF9BQ1AsIDAsIAotCQkgICAgICAgICAgICAgICAgICAgIHdwcm9ncGF0aCwgLTEsIAotCQkgICAgICAgICAgICAgICAgICAgIGRsbHBhdGgsIE1BWFBBVEhMRU4rMSwgCi0JCSAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCk7Ci0JfQorICAgIHdwcm9ncGF0aFtNQVhQQVRITEVOXT1fVCgnXDAnKTsKKyAgICBpZiAoUHlXaW5fRExMaE1vZHVsZSAmJgorICAgICAgICBHZXRNb2R1bGVGaWxlTmFtZShQeVdpbl9ETExoTW9kdWxlLCB3cHJvZ3BhdGgsIE1BWFBBVEhMRU4pKSB7CisgICAgICAgIFdpZGVDaGFyVG9NdWx0aUJ5dGUoQ1BfQUNQLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdwcm9ncGF0aCwgLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGxscGF0aCwgTUFYUEFUSExFTisxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwpOworICAgIH0KICNlbHNlCi0JZGxscGF0aFswXSA9IDA7CisgICAgZGxscGF0aFswXSA9IDA7CiAjZW5kaWYKLQl3cHJvZ3BhdGhbTUFYUEFUSExFTl09X1QoJ1wwJyk7Ci0JaWYgKEdldE1vZHVsZUZpbGVOYW1lKE5VTEwsIHdwcm9ncGF0aCwgTUFYUEFUSExFTikpIHsKLQkJV2lkZUNoYXJUb011bHRpQnl0ZShDUF9BQ1AsIDAsIAotCQkgICAgICAgICAgICAgICAgICAgIHdwcm9ncGF0aCwgLTEsIAotCQkgICAgICAgICAgICAgICAgICAgIHByb2dwYXRoLCBNQVhQQVRITEVOKzEsIAotCQkgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwpOwotCQlyZXR1cm47Ci0JfQorICAgIHdwcm9ncGF0aFtNQVhQQVRITEVOXT1fVCgnXDAnKTsKKyAgICBpZiAoR2V0TW9kdWxlRmlsZU5hbWUoTlVMTCwgd3Byb2dwYXRoLCBNQVhQQVRITEVOKSkgeworICAgICAgICBXaWRlQ2hhclRvTXVsdGlCeXRlKENQX0FDUCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cHJvZ3BhdGgsIC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2dwYXRoLCBNQVhQQVRITEVOKzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAjZWxzZQotCS8qIHN0YXRpYyBpbml0IG9mIHByb2dwYXRoIGVuc3VyZXMgZmluYWwgY2hhciByZW1haW5zIFwwICovCisgICAgLyogc3RhdGljIGluaXQgb2YgcHJvZ3BhdGggZW5zdXJlcyBmaW5hbCBjaGFyIHJlbWFpbnMgXDAgKi8KICNpZmRlZiBQeV9FTkFCTEVfU0hBUkVECi0JaWYgKFB5V2luX0RMTGhNb2R1bGUpCi0JCWlmICghR2V0TW9kdWxlRmlsZU5hbWUoUHlXaW5fRExMaE1vZHVsZSwgZGxscGF0aCwgTUFYUEFUSExFTikpCi0JCQlkbGxwYXRoWzBdID0gMDsKKyAgICBpZiAoUHlXaW5fRExMaE1vZHVsZSkKKyAgICAgICAgaWYgKCFHZXRNb2R1bGVGaWxlTmFtZShQeVdpbl9ETExoTW9kdWxlLCBkbGxwYXRoLCBNQVhQQVRITEVOKSkKKyAgICAgICAgICAgIGRsbHBhdGhbMF0gPSAwOwogI2Vsc2UKLQlkbGxwYXRoWzBdID0gMDsKKyAgICBkbGxwYXRoWzBdID0gMDsKICNlbmRpZgotCWlmIChHZXRNb2R1bGVGaWxlTmFtZShOVUxMLCBwcm9ncGF0aCwgTUFYUEFUSExFTikpCi0JCXJldHVybjsKKyAgICBpZiAoR2V0TW9kdWxlRmlsZU5hbWUoTlVMTCwgcHJvZ3BhdGgsIE1BWFBBVEhMRU4pKQorICAgICAgICByZXR1cm47CiAjZW5kaWYKICNlbmRpZgotCWlmIChwcm9nID09IE5VTEwgfHwgKnByb2cgPT0gJ1wwJykKLQkJcHJvZyA9ICJweXRob24iOworICAgIGlmIChwcm9nID09IE5VTEwgfHwgKnByb2cgPT0gJ1wwJykKKyAgICAgICAgcHJvZyA9ICJweXRob24iOwogCi0JLyogSWYgdGhlcmUgaXMgbm8gc2xhc2ggaW4gdGhlIGFyZ3YwIHBhdGgsIHRoZW4gd2UgaGF2ZSB0bwotCSAqIGFzc3VtZSBweXRob24gaXMgb24gdGhlIHVzZXIncyAkUEFUSCwgc2luY2UgdGhlcmUncyBubwotCSAqIG90aGVyIHdheSB0byBmaW5kIGEgZGlyZWN0b3J5IHRvIHN0YXJ0IHRoZSBzZWFyY2ggZnJvbS4gIElmCi0JICogJFBBVEggaXNuJ3QgZXhwb3J0ZWQsIHlvdSBsb3NlLgotCSAqLworICAgIC8qIElmIHRoZXJlIGlzIG5vIHNsYXNoIGluIHRoZSBhcmd2MCBwYXRoLCB0aGVuIHdlIGhhdmUgdG8KKyAgICAgKiBhc3N1bWUgcHl0aG9uIGlzIG9uIHRoZSB1c2VyJ3MgJFBBVEgsIHNpbmNlIHRoZXJlJ3Mgbm8KKyAgICAgKiBvdGhlciB3YXkgdG8gZmluZCBhIGRpcmVjdG9yeSB0byBzdGFydCB0aGUgc2VhcmNoIGZyb20uICBJZgorICAgICAqICRQQVRIIGlzbid0IGV4cG9ydGVkLCB5b3UgbG9zZS4KKyAgICAgKi8KICNpZmRlZiBBTFRTRVAKLQlpZiAoc3RyY2hyKHByb2csIFNFUCkgfHwgc3RyY2hyKHByb2csIEFMVFNFUCkpCisgICAgaWYgKHN0cmNocihwcm9nLCBTRVApIHx8IHN0cmNocihwcm9nLCBBTFRTRVApKQogI2Vsc2UKLQlpZiAoc3RyY2hyKHByb2csIFNFUCkpCisgICAgaWYgKHN0cmNocihwcm9nLCBTRVApKQogI2VuZGlmCi0JCXN0cm5jcHkocHJvZ3BhdGgsIHByb2csIE1BWFBBVEhMRU4pOwotCWVsc2UgaWYgKHBhdGgpIHsKLQkJd2hpbGUgKDEpIHsKLQkJCWNoYXIgKmRlbGltID0gc3RyY2hyKHBhdGgsIERFTElNKTsKKyAgICAgICAgc3RybmNweShwcm9ncGF0aCwgcHJvZywgTUFYUEFUSExFTik7CisgICAgZWxzZSBpZiAocGF0aCkgeworICAgICAgICB3aGlsZSAoMSkgeworICAgICAgICAgICAgY2hhciAqZGVsaW0gPSBzdHJjaHIocGF0aCwgREVMSU0pOwogCi0JCQlpZiAoZGVsaW0pIHsKLQkJCQlzaXplX3QgbGVuID0gZGVsaW0gLSBwYXRoOwotCQkJCS8qIGVuc3VyZSB3ZSBjYW4ndCBvdmVyd3JpdGUgYnVmZmVyICovCi0JCQkJbGVuID0gbWluKE1BWFBBVEhMRU4sbGVuKTsKLQkJCQlzdHJuY3B5KHByb2dwYXRoLCBwYXRoLCBsZW4pOwotCQkJCSoocHJvZ3BhdGggKyBsZW4pID0gJ1wwJzsKLQkJCX0KLQkJCWVsc2UKLQkJCQlzdHJuY3B5KHByb2dwYXRoLCBwYXRoLCBNQVhQQVRITEVOKTsKKyAgICAgICAgICAgIGlmIChkZWxpbSkgeworICAgICAgICAgICAgICAgIHNpemVfdCBsZW4gPSBkZWxpbSAtIHBhdGg7CisgICAgICAgICAgICAgICAgLyogZW5zdXJlIHdlIGNhbid0IG92ZXJ3cml0ZSBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICBsZW4gPSBtaW4oTUFYUEFUSExFTixsZW4pOworICAgICAgICAgICAgICAgIHN0cm5jcHkocHJvZ3BhdGgsIHBhdGgsIGxlbik7CisgICAgICAgICAgICAgICAgKihwcm9ncGF0aCArIGxlbikgPSAnXDAnOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHN0cm5jcHkocHJvZ3BhdGgsIHBhdGgsIE1BWFBBVEhMRU4pOwogCi0JCQkvKiBqb2luKCkgaXMgc2FmZSBmb3IgTUFYUEFUSExFTisxIHNpemUgYnVmZmVyICovCi0JCQlqb2luKHByb2dwYXRoLCBwcm9nKTsKLQkJCWlmIChleGlzdHMocHJvZ3BhdGgpKQotCQkJCWJyZWFrOworICAgICAgICAgICAgLyogam9pbigpIGlzIHNhZmUgZm9yIE1BWFBBVEhMRU4rMSBzaXplIGJ1ZmZlciAqLworICAgICAgICAgICAgam9pbihwcm9ncGF0aCwgcHJvZyk7CisgICAgICAgICAgICBpZiAoZXhpc3RzKHByb2dwYXRoKSkKKyAgICAgICAgICAgICAgICBicmVhazsKIAotCQkJaWYgKCFkZWxpbSkgewotCQkJCXByb2dwYXRoWzBdID0gJ1wwJzsKLQkJCQlicmVhazsKLQkJCX0KLQkJCXBhdGggPSBkZWxpbSArIDE7Ci0JCX0KLQl9Ci0JZWxzZQotCQlwcm9ncGF0aFswXSA9ICdcMCc7CisgICAgICAgICAgICBpZiAoIWRlbGltKSB7CisgICAgICAgICAgICAgICAgcHJvZ3BhdGhbMF0gPSAnXDAnOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGF0aCA9IGRlbGltICsgMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgICAgIHByb2dwYXRoWzBdID0gJ1wwJzsKIH0KIAogc3RhdGljIHZvaWQKIGNhbGN1bGF0ZV9wYXRoKHZvaWQpCiB7Ci0JY2hhciBhcmd2MF9wYXRoW01BWFBBVEhMRU4rMV07Ci0JY2hhciAqYnVmOwotCXNpemVfdCBidWZzejsKLQljaGFyICpweXRob25ob21lID0gUHlfR2V0UHl0aG9uSG9tZSgpOwotCWNoYXIgKmVudnBhdGggPSBQeV9HRVRFTlYoIlBZVEhPTlBBVEgiKTsKKyAgICBjaGFyIGFyZ3YwX3BhdGhbTUFYUEFUSExFTisxXTsKKyAgICBjaGFyICpidWY7CisgICAgc2l6ZV90IGJ1ZnN6OworICAgIGNoYXIgKnB5dGhvbmhvbWUgPSBQeV9HZXRQeXRob25Ib21lKCk7CisgICAgY2hhciAqZW52cGF0aCA9IFB5X0dFVEVOVigiUFlUSE9OUEFUSCIpOwogCiAjaWZkZWYgTVNfV0lORE9XUwotCWludCBza2lwaG9tZSwgc2tpcGRlZmF1bHQ7Ci0JY2hhciAqbWFjaGluZXBhdGggPSBOVUxMOwotCWNoYXIgKnVzZXJwYXRoID0gTlVMTDsKLQljaGFyIHppcF9wYXRoW01BWFBBVEhMRU4rMV07Ci0Jc2l6ZV90IGxlbjsKKyAgICBpbnQgc2tpcGhvbWUsIHNraXBkZWZhdWx0OworICAgIGNoYXIgKm1hY2hpbmVwYXRoID0gTlVMTDsKKyAgICBjaGFyICp1c2VycGF0aCA9IE5VTEw7CisgICAgY2hhciB6aXBfcGF0aFtNQVhQQVRITEVOKzFdOworICAgIHNpemVfdCBsZW47CiAjZW5kaWYKIAotCWdldF9wcm9ncGF0aCgpOwotCS8qIHByb2dwYXRoIGd1YXJhbnRlZWQgXDAgdGVybWluYXRlZCBpbiBNQVhQQVRIKzEgYnl0ZXMuICovCi0Jc3RyY3B5KGFyZ3YwX3BhdGgsIHByb2dwYXRoKTsKLQlyZWR1Y2UoYXJndjBfcGF0aCk7Ci0JaWYgKHB5dGhvbmhvbWUgPT0gTlVMTCB8fCAqcHl0aG9uaG9tZSA9PSAnXDAnKSB7Ci0JCWlmIChzZWFyY2hfZm9yX3ByZWZpeChhcmd2MF9wYXRoLCBMQU5ETUFSSykpCi0JCQlweXRob25ob21lID0gcHJlZml4OwotCQllbHNlCi0JCQlweXRob25ob21lID0gTlVMTDsKLQl9Ci0JZWxzZQotCQlzdHJuY3B5KHByZWZpeCwgcHl0aG9uaG9tZSwgTUFYUEFUSExFTik7CisgICAgZ2V0X3Byb2dwYXRoKCk7CisgICAgLyogcHJvZ3BhdGggZ3VhcmFudGVlZCBcMCB0ZXJtaW5hdGVkIGluIE1BWFBBVEgrMSBieXRlcy4gKi8KKyAgICBzdHJjcHkoYXJndjBfcGF0aCwgcHJvZ3BhdGgpOworICAgIHJlZHVjZShhcmd2MF9wYXRoKTsKKyAgICBpZiAocHl0aG9uaG9tZSA9PSBOVUxMIHx8ICpweXRob25ob21lID09ICdcMCcpIHsKKyAgICAgICAgaWYgKHNlYXJjaF9mb3JfcHJlZml4KGFyZ3YwX3BhdGgsIExBTkRNQVJLKSkKKyAgICAgICAgICAgIHB5dGhvbmhvbWUgPSBwcmVmaXg7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHB5dGhvbmhvbWUgPSBOVUxMOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHN0cm5jcHkocHJlZml4LCBweXRob25ob21lLCBNQVhQQVRITEVOKTsKIAotCWlmIChlbnZwYXRoICYmICplbnZwYXRoID09ICdcMCcpCi0JCWVudnBhdGggPSBOVUxMOworICAgIGlmIChlbnZwYXRoICYmICplbnZwYXRoID09ICdcMCcpCisgICAgICAgIGVudnBhdGggPSBOVUxMOwogCiAKICNpZmRlZiBNU19XSU5ET1dTCi0JLyogQ2FsY3VsYXRlIHppcCBhcmNoaXZlIHBhdGggKi8KLQlpZiAoZGxscGF0aFswXSkJCS8qIHVzZSBuYW1lIG9mIHB5dGhvbiBETEwgKi8KLQkJc3RybmNweSh6aXBfcGF0aCwgZGxscGF0aCwgTUFYUEFUSExFTik7Ci0JZWxzZQkJCS8qIHVzZSBuYW1lIG9mIGV4ZWN1dGFibGUgcHJvZ3JhbSAqLwotCQlzdHJuY3B5KHppcF9wYXRoLCBwcm9ncGF0aCwgTUFYUEFUSExFTik7Ci0JemlwX3BhdGhbTUFYUEFUSExFTl0gPSAnXDAnOwotCWxlbiA9IHN0cmxlbih6aXBfcGF0aCk7Ci0JaWYgKGxlbiA+IDQpIHsKLQkJemlwX3BhdGhbbGVuLTNdID0gJ3onOwkvKiBjaGFuZ2UgZW5kaW5nIHRvICJ6aXAiICovCi0JCXppcF9wYXRoW2xlbi0yXSA9ICdpJzsKLQkJemlwX3BhdGhbbGVuLTFdID0gJ3AnOwotCX0KLQllbHNlIHsKLQkJemlwX3BhdGhbMF0gPSAwOwotCX0KLSAKLQlza2lwaG9tZSA9IHB5dGhvbmhvbWU9PU5VTEwgPyAwIDogMTsKKyAgICAvKiBDYWxjdWxhdGUgemlwIGFyY2hpdmUgcGF0aCAqLworICAgIGlmIChkbGxwYXRoWzBdKSAgICAgICAgICAgICAvKiB1c2UgbmFtZSBvZiBweXRob24gRExMICovCisgICAgICAgIHN0cm5jcHkoemlwX3BhdGgsIGRsbHBhdGgsIE1BWFBBVEhMRU4pOworICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAvKiB1c2UgbmFtZSBvZiBleGVjdXRhYmxlIHByb2dyYW0gKi8KKyAgICAgICAgc3RybmNweSh6aXBfcGF0aCwgcHJvZ3BhdGgsIE1BWFBBVEhMRU4pOworICAgIHppcF9wYXRoW01BWFBBVEhMRU5dID0gJ1wwJzsKKyAgICBsZW4gPSBzdHJsZW4oemlwX3BhdGgpOworICAgIGlmIChsZW4gPiA0KSB7CisgICAgICAgIHppcF9wYXRoW2xlbi0zXSA9ICd6JzsgICAgICAgICAgLyogY2hhbmdlIGVuZGluZyB0byAiemlwIiAqLworICAgICAgICB6aXBfcGF0aFtsZW4tMl0gPSAnaSc7CisgICAgICAgIHppcF9wYXRoW2xlbi0xXSA9ICdwJzsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHppcF9wYXRoWzBdID0gMDsKKyAgICB9CisKKyAgICBza2lwaG9tZSA9IHB5dGhvbmhvbWU9PU5VTEwgPyAwIDogMTsKICNpZmRlZiBQeV9FTkFCTEVfU0hBUkVECi0JbWFjaGluZXBhdGggPSBnZXRweXRob25yZWdwYXRoKEhLRVlfTE9DQUxfTUFDSElORSwgc2tpcGhvbWUpOwotCXVzZXJwYXRoID0gZ2V0cHl0aG9ucmVncGF0aChIS0VZX0NVUlJFTlRfVVNFUiwgc2tpcGhvbWUpOworICAgIG1hY2hpbmVwYXRoID0gZ2V0cHl0aG9ucmVncGF0aChIS0VZX0xPQ0FMX01BQ0hJTkUsIHNraXBob21lKTsKKyAgICB1c2VycGF0aCA9IGdldHB5dGhvbnJlZ3BhdGgoSEtFWV9DVVJSRU5UX1VTRVIsIHNraXBob21lKTsKICNlbmRpZgotCS8qIFdlIG9ubHkgdXNlIHRoZSBkZWZhdWx0IHJlbGF0aXZlIFBZVEhPTlBBVEggaWYgd2UgaGF2ZW50Ci0JICAgYW55dGhpbmcgYmV0dGVyIHRvIHVzZSEgKi8KLQlza2lwZGVmYXVsdCA9IGVudnBhdGghPU5VTEwgfHwgcHl0aG9uaG9tZSE9TlVMTCB8fCBcCi0JCSAgICAgIG1hY2hpbmVwYXRoIT1OVUxMIHx8IHVzZXJwYXRoIT1OVUxMOworICAgIC8qIFdlIG9ubHkgdXNlIHRoZSBkZWZhdWx0IHJlbGF0aXZlIFBZVEhPTlBBVEggaWYgd2UgaGF2ZW50CisgICAgICAgYW55dGhpbmcgYmV0dGVyIHRvIHVzZSEgKi8KKyAgICBza2lwZGVmYXVsdCA9IGVudnBhdGghPU5VTEwgfHwgcHl0aG9uaG9tZSE9TlVMTCB8fCBcCisgICAgICAgICAgICAgICAgICBtYWNoaW5lcGF0aCE9TlVMTCB8fCB1c2VycGF0aCE9TlVMTDsKICNlbmRpZgogCi0JLyogV2UgbmVlZCB0byBjb25zdHJ1Y3QgYSBwYXRoIGZyb20gdGhlIGZvbGxvd2luZyBwYXJ0cy4KLQkgICAoMSkgdGhlIFBZVEhPTlBBVEggZW52aXJvbm1lbnQgdmFyaWFibGUsIGlmIHNldDsKLQkgICAoMikgZm9yIFdpbjMyLCB0aGUgemlwIGFyY2hpdmUgZmlsZSBwYXRoOwotCSAgICgzKSBmb3IgV2luMzIsIHRoZSBtYWNoaW5lcGF0aCBhbmQgdXNlcnBhdGgsIGlmIHNldDsKLQkgICAoNCkgdGhlIFBZVEhPTlBBVEggY29uZmlnIG1hY3JvLCB3aXRoIHRoZSBsZWFkaW5nICIuIgotCSAgICAgICBvZiBlYWNoIGNvbXBvbmVudCByZXBsYWNlZCB3aXRoIHB5dGhvbmhvbWUsIGlmIHNldDsKLQkgICAoNSkgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBleGVjdXRhYmxlIChhcmd2MF9wYXRoKS4KLQkgICBUaGUgbGVuZ3RoIGNhbGN1bGF0aW9uIGNhbGN1bGF0ZXMgIzQgZmlyc3QuCi0JICAgRXh0cmEgcnVsZXM6Ci0JICAgLSBJZiBQWVRIT05IT01FIGlzIHNldCAoaW4gYW55IHdheSkgaXRlbSAoMykgaXMgaWdub3JlZC4KLQkgICAtIElmIHJlZ2lzdHJ5IHZhbHVlcyBhcmUgdXNlZCwgKDQpIGFuZCAoNSkgYXJlIGlnbm9yZWQuCi0JKi8KKyAgICAvKiBXZSBuZWVkIHRvIGNvbnN0cnVjdCBhIHBhdGggZnJvbSB0aGUgZm9sbG93aW5nIHBhcnRzLgorICAgICAgICgxKSB0aGUgUFlUSE9OUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZSwgaWYgc2V0OworICAgICAgICgyKSBmb3IgV2luMzIsIHRoZSB6aXAgYXJjaGl2ZSBmaWxlIHBhdGg7CisgICAgICAgKDMpIGZvciBXaW4zMiwgdGhlIG1hY2hpbmVwYXRoIGFuZCB1c2VycGF0aCwgaWYgc2V0OworICAgICAgICg0KSB0aGUgUFlUSE9OUEFUSCBjb25maWcgbWFjcm8sIHdpdGggdGhlIGxlYWRpbmcgIi4iCisgICAgICAgICAgIG9mIGVhY2ggY29tcG9uZW50IHJlcGxhY2VkIHdpdGggcHl0aG9uaG9tZSwgaWYgc2V0OworICAgICAgICg1KSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGV4ZWN1dGFibGUgKGFyZ3YwX3BhdGgpLgorICAgICAgIFRoZSBsZW5ndGggY2FsY3VsYXRpb24gY2FsY3VsYXRlcyAjNCBmaXJzdC4KKyAgICAgICBFeHRyYSBydWxlczoKKyAgICAgICAtIElmIFBZVEhPTkhPTUUgaXMgc2V0IChpbiBhbnkgd2F5KSBpdGVtICgzKSBpcyBpZ25vcmVkLgorICAgICAgIC0gSWYgcmVnaXN0cnkgdmFsdWVzIGFyZSB1c2VkLCAoNCkgYW5kICg1KSBhcmUgaWdub3JlZC4KKyAgICAqLwogCi0JLyogQ2FsY3VsYXRlIHNpemUgb2YgcmV0dXJuIGJ1ZmZlciAqLwotCWlmIChweXRob25ob21lICE9IE5VTEwpIHsKLQkJY2hhciAqcDsKLQkJYnVmc3ogPSAxOwkKLQkJZm9yIChwID0gUFlUSE9OUEFUSDsgKnA7IHArKykgewotCQkJaWYgKCpwID09IERFTElNKQotCQkJCWJ1ZnN6Kys7IC8qIG51bWJlciBvZiBERUxJTSBwbHVzIG9uZSAqLwotCQl9Ci0JCWJ1ZnN6ICo9IHN0cmxlbihweXRob25ob21lKTsKLQl9Ci0JZWxzZQotCQlidWZzeiA9IDA7Ci0JYnVmc3ogKz0gc3RybGVuKFBZVEhPTlBBVEgpICsgMTsKLQlidWZzeiArPSBzdHJsZW4oYXJndjBfcGF0aCkgKyAxOworICAgIC8qIENhbGN1bGF0ZSBzaXplIG9mIHJldHVybiBidWZmZXIgKi8KKyAgICBpZiAocHl0aG9uaG9tZSAhPSBOVUxMKSB7CisgICAgICAgIGNoYXIgKnA7CisgICAgICAgIGJ1ZnN6ID0gMTsKKyAgICAgICAgZm9yIChwID0gUFlUSE9OUEFUSDsgKnA7IHArKykgeworICAgICAgICAgICAgaWYgKCpwID09IERFTElNKQorICAgICAgICAgICAgICAgIGJ1ZnN6Kys7IC8qIG51bWJlciBvZiBERUxJTSBwbHVzIG9uZSAqLworICAgICAgICB9CisgICAgICAgIGJ1ZnN6ICo9IHN0cmxlbihweXRob25ob21lKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBidWZzeiA9IDA7CisgICAgYnVmc3ogKz0gc3RybGVuKFBZVEhPTlBBVEgpICsgMTsKKyAgICBidWZzeiArPSBzdHJsZW4oYXJndjBfcGF0aCkgKyAxOwogI2lmZGVmIE1TX1dJTkRPV1MKLQlpZiAodXNlcnBhdGgpCi0JCWJ1ZnN6ICs9IHN0cmxlbih1c2VycGF0aCkgKyAxOwotCWlmIChtYWNoaW5lcGF0aCkKLQkJYnVmc3ogKz0gc3RybGVuKG1hY2hpbmVwYXRoKSArIDE7Ci0JYnVmc3ogKz0gc3RybGVuKHppcF9wYXRoKSArIDE7CisgICAgaWYgKHVzZXJwYXRoKQorICAgICAgICBidWZzeiArPSBzdHJsZW4odXNlcnBhdGgpICsgMTsKKyAgICBpZiAobWFjaGluZXBhdGgpCisgICAgICAgIGJ1ZnN6ICs9IHN0cmxlbihtYWNoaW5lcGF0aCkgKyAxOworICAgIGJ1ZnN6ICs9IHN0cmxlbih6aXBfcGF0aCkgKyAxOwogI2VuZGlmCi0JaWYgKGVudnBhdGggIT0gTlVMTCkKLQkJYnVmc3ogKz0gc3RybGVuKGVudnBhdGgpICsgMTsKKyAgICBpZiAoZW52cGF0aCAhPSBOVUxMKQorICAgICAgICBidWZzeiArPSBzdHJsZW4oZW52cGF0aCkgKyAxOwogCi0JbW9kdWxlX3NlYXJjaF9wYXRoID0gYnVmID0gbWFsbG9jKGJ1ZnN6KTsKLQlpZiAoYnVmID09IE5VTEwpIHsKLQkJLyogV2UgY2FuJ3QgZXhpdCwgc28gcHJpbnQgYSB3YXJuaW5nIGFuZCBsaW1wIGFsb25nICovCi0JCWZwcmludGYoc3RkZXJyLCAiQ2FuJ3QgbWFsbG9jIGR5bmFtaWMgUFlUSE9OUEFUSC5cbiIpOwotCQlpZiAoZW52cGF0aCkgewotCQkJZnByaW50ZihzdGRlcnIsICJVc2luZyBlbnZpcm9ubWVudCAkUFlUSE9OUEFUSC5cbiIpOwotCQkJbW9kdWxlX3NlYXJjaF9wYXRoID0gZW52cGF0aDsKLQkJfQotCQllbHNlIHsKLQkJCWZwcmludGYoc3RkZXJyLCAiVXNpbmcgZGVmYXVsdCBzdGF0aWMgcGF0aC5cbiIpOwotCQkJbW9kdWxlX3NlYXJjaF9wYXRoID0gUFlUSE9OUEFUSDsKLQkJfQorICAgIG1vZHVsZV9zZWFyY2hfcGF0aCA9IGJ1ZiA9IG1hbGxvYyhidWZzeik7CisgICAgaWYgKGJ1ZiA9PSBOVUxMKSB7CisgICAgICAgIC8qIFdlIGNhbid0IGV4aXQsIHNvIHByaW50IGEgd2FybmluZyBhbmQgbGltcCBhbG9uZyAqLworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNhbid0IG1hbGxvYyBkeW5hbWljIFBZVEhPTlBBVEguXG4iKTsKKyAgICAgICAgaWYgKGVudnBhdGgpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVXNpbmcgZW52aXJvbm1lbnQgJFBZVEhPTlBBVEguXG4iKTsKKyAgICAgICAgICAgIG1vZHVsZV9zZWFyY2hfcGF0aCA9IGVudnBhdGg7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVzaW5nIGRlZmF1bHQgc3RhdGljIHBhdGguXG4iKTsKKyAgICAgICAgICAgIG1vZHVsZV9zZWFyY2hfcGF0aCA9IFBZVEhPTlBBVEg7CisgICAgICAgIH0KICNpZmRlZiBNU19XSU5ET1dTCi0JCWlmIChtYWNoaW5lcGF0aCkKLQkJCWZyZWUobWFjaGluZXBhdGgpOwotCQlpZiAodXNlcnBhdGgpCi0JCQlmcmVlKHVzZXJwYXRoKTsKKyAgICAgICAgaWYgKG1hY2hpbmVwYXRoKQorICAgICAgICAgICAgZnJlZShtYWNoaW5lcGF0aCk7CisgICAgICAgIGlmICh1c2VycGF0aCkKKyAgICAgICAgICAgIGZyZWUodXNlcnBhdGgpOwogI2VuZGlmIC8qIE1TX1dJTkRPV1MgKi8KLQkJcmV0dXJuOwotCX0KKyAgICAgICAgcmV0dXJuOworICAgIH0KIAotCWlmIChlbnZwYXRoKSB7Ci0JCXN0cmNweShidWYsIGVudnBhdGgpOwotCQlidWYgPSBzdHJjaHIoYnVmLCAnXDAnKTsKLQkJKmJ1ZisrID0gREVMSU07Ci0JfQorICAgIGlmIChlbnZwYXRoKSB7CisgICAgICAgIHN0cmNweShidWYsIGVudnBhdGgpOworICAgICAgICBidWYgPSBzdHJjaHIoYnVmLCAnXDAnKTsKKyAgICAgICAgKmJ1ZisrID0gREVMSU07CisgICAgfQogI2lmZGVmIE1TX1dJTkRPV1MKLQlpZiAoemlwX3BhdGhbMF0pIHsKLQkJc3RyY3B5KGJ1ZiwgemlwX3BhdGgpOwotCQlidWYgPSBzdHJjaHIoYnVmLCAnXDAnKTsKLQkJKmJ1ZisrID0gREVMSU07Ci0JfQotCWlmICh1c2VycGF0aCkgewotCQlzdHJjcHkoYnVmLCB1c2VycGF0aCk7Ci0JCWJ1ZiA9IHN0cmNocihidWYsICdcMCcpOwotCQkqYnVmKysgPSBERUxJTTsKLQkJZnJlZSh1c2VycGF0aCk7Ci0JfQotCWlmIChtYWNoaW5lcGF0aCkgewotCQlzdHJjcHkoYnVmLCBtYWNoaW5lcGF0aCk7Ci0JCWJ1ZiA9IHN0cmNocihidWYsICdcMCcpOwotCQkqYnVmKysgPSBERUxJTTsKLQkJZnJlZShtYWNoaW5lcGF0aCk7Ci0JfQotCWlmIChweXRob25ob21lID09IE5VTEwpIHsKLQkJaWYgKCFza2lwZGVmYXVsdCkgewotCQkJc3RyY3B5KGJ1ZiwgUFlUSE9OUEFUSCk7Ci0JCQlidWYgPSBzdHJjaHIoYnVmLCAnXDAnKTsKLQkJfQotCX0KKyAgICBpZiAoemlwX3BhdGhbMF0pIHsKKyAgICAgICAgc3RyY3B5KGJ1ZiwgemlwX3BhdGgpOworICAgICAgICBidWYgPSBzdHJjaHIoYnVmLCAnXDAnKTsKKyAgICAgICAgKmJ1ZisrID0gREVMSU07CisgICAgfQorICAgIGlmICh1c2VycGF0aCkgeworICAgICAgICBzdHJjcHkoYnVmLCB1c2VycGF0aCk7CisgICAgICAgIGJ1ZiA9IHN0cmNocihidWYsICdcMCcpOworICAgICAgICAqYnVmKysgPSBERUxJTTsKKyAgICAgICAgZnJlZSh1c2VycGF0aCk7CisgICAgfQorICAgIGlmIChtYWNoaW5lcGF0aCkgeworICAgICAgICBzdHJjcHkoYnVmLCBtYWNoaW5lcGF0aCk7CisgICAgICAgIGJ1ZiA9IHN0cmNocihidWYsICdcMCcpOworICAgICAgICAqYnVmKysgPSBERUxJTTsKKyAgICAgICAgZnJlZShtYWNoaW5lcGF0aCk7CisgICAgfQorICAgIGlmIChweXRob25ob21lID09IE5VTEwpIHsKKyAgICAgICAgaWYgKCFza2lwZGVmYXVsdCkgeworICAgICAgICAgICAgc3RyY3B5KGJ1ZiwgUFlUSE9OUEFUSCk7CisgICAgICAgICAgICBidWYgPSBzdHJjaHIoYnVmLCAnXDAnKTsKKyAgICAgICAgfQorICAgIH0KICNlbHNlCi0JaWYgKHB5dGhvbmhvbWUgPT0gTlVMTCkgewotCQlzdHJjcHkoYnVmLCBQWVRIT05QQVRIKTsKLQkJYnVmID0gc3RyY2hyKGJ1ZiwgJ1wwJyk7Ci0JfQorICAgIGlmIChweXRob25ob21lID09IE5VTEwpIHsKKyAgICAgICAgc3RyY3B5KGJ1ZiwgUFlUSE9OUEFUSCk7CisgICAgICAgIGJ1ZiA9IHN0cmNocihidWYsICdcMCcpOworICAgIH0KICNlbmRpZiAvKiBNU19XSU5ET1dTICovCi0JZWxzZSB7Ci0JCWNoYXIgKnAgPSBQWVRIT05QQVRIOwotCQljaGFyICpxOwotCQlzaXplX3QgbjsKLQkJZm9yICg7OykgewotCQkJcSA9IHN0cmNocihwLCBERUxJTSk7Ci0JCQlpZiAocSA9PSBOVUxMKQotCQkJCW4gPSBzdHJsZW4ocCk7Ci0JCQllbHNlCi0JCQkJbiA9IHEtcDsKLQkJCWlmIChwWzBdID09ICcuJyAmJiBpc19zZXAocFsxXSkpIHsKLQkJCQlzdHJjcHkoYnVmLCBweXRob25ob21lKTsKLQkJCQlidWYgPSBzdHJjaHIoYnVmLCAnXDAnKTsKLQkJCQlwKys7Ci0JCQkJbi0tOwotCQkJfQotCQkJc3RybmNweShidWYsIHAsIG4pOwotCQkJYnVmICs9IG47Ci0JCQlpZiAocSA9PSBOVUxMKQotCQkJCWJyZWFrOwotCQkJKmJ1ZisrID0gREVMSU07Ci0JCQlwID0gcSsxOwotCQl9Ci0JfQotCWlmIChhcmd2MF9wYXRoKSB7Ci0JCSpidWYrKyA9IERFTElNOwotCQlzdHJjcHkoYnVmLCBhcmd2MF9wYXRoKTsKLQkJYnVmID0gc3RyY2hyKGJ1ZiwgJ1wwJyk7Ci0JfQotCSpidWYgPSAnXDAnOwotCS8qIE5vdyB0byBwdWxsIG9uZSBsYXN0IGhhY2svdHJpY2suICBJZiBzeXMucHJlZml4IGlzCi0JICAgZW1wdHksIHRoZW4gdHJ5IGFuZCBmaW5kIGl0IHNvbWV3aGVyZSBvbiB0aGUgcGF0aHMKLQkgICB3ZSBjYWxjdWxhdGVkLiAgV2Ugc2NhbiBiYWNrd2FyZHMsIGFzIG91ciBnZW5lcmFsIHBvbGljeQotCSAgIGlzIHRoYXQgUHl0aG9uIGNvcmUgZGlyZWN0b3JpZXMgYXJlIGF0IHRoZSAqZW5kKiBvZgotCSAgIHN5cy5wYXRoLiAgV2UgYXNzdW1lIHRoYXQgb3VyICJsaWIiIGRpcmVjdG9yeSBpcwotCSAgIG9uIHRoZSBwYXRoLCBhbmQgdGhhdCBvdXIgJ3ByZWZpeCcgZGlyZWN0b3J5IGlzCi0JICAgdGhlIHBhcmVudCBvZiB0aGF0LgotCSovCi0JaWYgKCpwcmVmaXg9PSdcMCcpIHsKLQkJY2hhciBsb29rQnVmW01BWFBBVEhMRU4rMV07Ci0JCWNoYXIgKmxvb2sgPSBidWYgLSAxOyAvKiAnYnVmJyBpcyBhdCB0aGUgZW5kIG9mIHRoZSBidWZmZXIgKi8KLQkJd2hpbGUgKDEpIHsKLQkJCVB5X3NzaXplX3QgbmNoYXJzOwotCQkJY2hhciAqbG9va0VuZCA9IGxvb2s7Ci0JCQkvKiAnbG9vaycgd2lsbCBlbmQgdXAgb25lIGNoYXJhY3RlciBiZWZvcmUgdGhlCi0JCQkgICBzdGFydCBvZiB0aGUgcGF0aCBpbiBxdWVzdGlvbiAtIGV2ZW4gaWYgdGhpcwotCQkJICAgaXMgb25lIGNoYXJhY3RlciBiZWZvcmUgdGhlIHN0YXJ0IG9mIHRoZSBidWZmZXIKLQkJCSovCi0JCQl3aGlsZSAobG9vayA+PSBtb2R1bGVfc2VhcmNoX3BhdGggJiYgKmxvb2sgIT0gREVMSU0pCi0JCQkJbG9vay0tOwotCQkJbmNoYXJzID0gbG9va0VuZC1sb29rOwotCQkJc3RybmNweShsb29rQnVmLCBsb29rKzEsIG5jaGFycyk7Ci0JCQlsb29rQnVmW25jaGFyc10gPSAnXDAnOwotCQkJLyogVXAgb25lIGxldmVsIHRvIHRoZSBwYXJlbnQgKi8KLQkJCXJlZHVjZShsb29rQnVmKTsKLQkJCWlmIChzZWFyY2hfZm9yX3ByZWZpeChsb29rQnVmLCBMQU5ETUFSSykpIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJCS8qIElmIHdlIGFyZSBvdXQgb2YgcGF0aHMgdG8gc2VhcmNoIC0gZ2l2ZSB1cCAqLwotCQkJaWYgKGxvb2sgPCBtb2R1bGVfc2VhcmNoX3BhdGgpCi0JCQkJYnJlYWs7Ci0JCQlsb29rLS07Ci0JCX0KLQl9CisgICAgZWxzZSB7CisgICAgICAgIGNoYXIgKnAgPSBQWVRIT05QQVRIOworICAgICAgICBjaGFyICpxOworICAgICAgICBzaXplX3QgbjsKKyAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgcSA9IHN0cmNocihwLCBERUxJTSk7CisgICAgICAgICAgICBpZiAocSA9PSBOVUxMKQorICAgICAgICAgICAgICAgIG4gPSBzdHJsZW4ocCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbiA9IHEtcDsKKyAgICAgICAgICAgIGlmIChwWzBdID09ICcuJyAmJiBpc19zZXAocFsxXSkpIHsKKyAgICAgICAgICAgICAgICBzdHJjcHkoYnVmLCBweXRob25ob21lKTsKKyAgICAgICAgICAgICAgICBidWYgPSBzdHJjaHIoYnVmLCAnXDAnKTsKKyAgICAgICAgICAgICAgICBwKys7CisgICAgICAgICAgICAgICAgbi0tOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RybmNweShidWYsIHAsIG4pOworICAgICAgICAgICAgYnVmICs9IG47CisgICAgICAgICAgICBpZiAocSA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgKmJ1ZisrID0gREVMSU07CisgICAgICAgICAgICBwID0gcSsxOworICAgICAgICB9CisgICAgfQorICAgIGlmIChhcmd2MF9wYXRoKSB7CisgICAgICAgICpidWYrKyA9IERFTElNOworICAgICAgICBzdHJjcHkoYnVmLCBhcmd2MF9wYXRoKTsKKyAgICAgICAgYnVmID0gc3RyY2hyKGJ1ZiwgJ1wwJyk7CisgICAgfQorICAgICpidWYgPSAnXDAnOworICAgIC8qIE5vdyB0byBwdWxsIG9uZSBsYXN0IGhhY2svdHJpY2suICBJZiBzeXMucHJlZml4IGlzCisgICAgICAgZW1wdHksIHRoZW4gdHJ5IGFuZCBmaW5kIGl0IHNvbWV3aGVyZSBvbiB0aGUgcGF0aHMKKyAgICAgICB3ZSBjYWxjdWxhdGVkLiAgV2Ugc2NhbiBiYWNrd2FyZHMsIGFzIG91ciBnZW5lcmFsIHBvbGljeQorICAgICAgIGlzIHRoYXQgUHl0aG9uIGNvcmUgZGlyZWN0b3JpZXMgYXJlIGF0IHRoZSAqZW5kKiBvZgorICAgICAgIHN5cy5wYXRoLiAgV2UgYXNzdW1lIHRoYXQgb3VyICJsaWIiIGRpcmVjdG9yeSBpcworICAgICAgIG9uIHRoZSBwYXRoLCBhbmQgdGhhdCBvdXIgJ3ByZWZpeCcgZGlyZWN0b3J5IGlzCisgICAgICAgdGhlIHBhcmVudCBvZiB0aGF0LgorICAgICovCisgICAgaWYgKCpwcmVmaXg9PSdcMCcpIHsKKyAgICAgICAgY2hhciBsb29rQnVmW01BWFBBVEhMRU4rMV07CisgICAgICAgIGNoYXIgKmxvb2sgPSBidWYgLSAxOyAvKiAnYnVmJyBpcyBhdCB0aGUgZW5kIG9mIHRoZSBidWZmZXIgKi8KKyAgICAgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgICAgIFB5X3NzaXplX3QgbmNoYXJzOworICAgICAgICAgICAgY2hhciAqbG9va0VuZCA9IGxvb2s7CisgICAgICAgICAgICAvKiAnbG9vaycgd2lsbCBlbmQgdXAgb25lIGNoYXJhY3RlciBiZWZvcmUgdGhlCisgICAgICAgICAgICAgICBzdGFydCBvZiB0aGUgcGF0aCBpbiBxdWVzdGlvbiAtIGV2ZW4gaWYgdGhpcworICAgICAgICAgICAgICAgaXMgb25lIGNoYXJhY3RlciBiZWZvcmUgdGhlIHN0YXJ0IG9mIHRoZSBidWZmZXIKKyAgICAgICAgICAgICovCisgICAgICAgICAgICB3aGlsZSAobG9vayA+PSBtb2R1bGVfc2VhcmNoX3BhdGggJiYgKmxvb2sgIT0gREVMSU0pCisgICAgICAgICAgICAgICAgbG9vay0tOworICAgICAgICAgICAgbmNoYXJzID0gbG9va0VuZC1sb29rOworICAgICAgICAgICAgc3RybmNweShsb29rQnVmLCBsb29rKzEsIG5jaGFycyk7CisgICAgICAgICAgICBsb29rQnVmW25jaGFyc10gPSAnXDAnOworICAgICAgICAgICAgLyogVXAgb25lIGxldmVsIHRvIHRoZSBwYXJlbnQgKi8KKyAgICAgICAgICAgIHJlZHVjZShsb29rQnVmKTsKKyAgICAgICAgICAgIGlmIChzZWFyY2hfZm9yX3ByZWZpeChsb29rQnVmLCBMQU5ETUFSSykpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIElmIHdlIGFyZSBvdXQgb2YgcGF0aHMgdG8gc2VhcmNoIC0gZ2l2ZSB1cCAqLworICAgICAgICAgICAgaWYgKGxvb2sgPCBtb2R1bGVfc2VhcmNoX3BhdGgpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBsb29rLS07CisgICAgICAgIH0KKyAgICB9CiB9CiAKIApAQCAtNjg2LDI5ICs2ODYsMjkgQEAKIGNoYXIgKgogUHlfR2V0UGF0aCh2b2lkKQogewotCWlmICghbW9kdWxlX3NlYXJjaF9wYXRoKQotCQljYWxjdWxhdGVfcGF0aCgpOwotCXJldHVybiBtb2R1bGVfc2VhcmNoX3BhdGg7CisgICAgaWYgKCFtb2R1bGVfc2VhcmNoX3BhdGgpCisgICAgICAgIGNhbGN1bGF0ZV9wYXRoKCk7CisgICAgcmV0dXJuIG1vZHVsZV9zZWFyY2hfcGF0aDsKIH0KIAogY2hhciAqCiBQeV9HZXRQcmVmaXgodm9pZCkKIHsKLQlpZiAoIW1vZHVsZV9zZWFyY2hfcGF0aCkKLQkJY2FsY3VsYXRlX3BhdGgoKTsKLQlyZXR1cm4gcHJlZml4OworICAgIGlmICghbW9kdWxlX3NlYXJjaF9wYXRoKQorICAgICAgICBjYWxjdWxhdGVfcGF0aCgpOworICAgIHJldHVybiBwcmVmaXg7CiB9CiAKIGNoYXIgKgogUHlfR2V0RXhlY1ByZWZpeCh2b2lkKQogewotCXJldHVybiBQeV9HZXRQcmVmaXgoKTsKKyAgICByZXR1cm4gUHlfR2V0UHJlZml4KCk7CiB9CiAKIGNoYXIgKgogUHlfR2V0UHJvZ3JhbUZ1bGxQYXRoKHZvaWQpCiB7Ci0JaWYgKCFtb2R1bGVfc2VhcmNoX3BhdGgpCi0JCWNhbGN1bGF0ZV9wYXRoKCk7Ci0JcmV0dXJuIHByb2dwYXRoOworICAgIGlmICghbW9kdWxlX3NlYXJjaF9wYXRoKQorICAgICAgICBjYWxjdWxhdGVfcGF0aCgpOworICAgIHJldHVybiBwcm9ncGF0aDsKIH0KZGlmZiAtLWdpdCBhL1BDL2ltcG9ydF9udC5jIGIvUEMvaW1wb3J0X250LmMKaW5kZXggZTdkMTUyYS4uMTk2YTc3NCAxMDA2NDQKLS0tIGEvUEMvaW1wb3J0X250LmMKKysrIGIvUEMvaW1wb3J0X250LmMKQEAgLTEsNiArMSw2IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAotIGltcG9ydF9udC5jIAorIGltcG9ydF9udC5jCiAKICAgV2luMzIgc3BlY2lmaWMgaW1wb3J0IGNvZGUuCiAKQEAgLTE2LDcxICsxNiw3MSBAQAogZXh0ZXJuIGNvbnN0IGNoYXIgKlB5V2luX0RMTFZlcnNpb25TdHJpbmc7CiAKIEZJTEUgKlB5V2luX0ZpbmRSZWdpc3RlcmVkTW9kdWxlKGNvbnN0IGNoYXIgKm1vZHVsZU5hbWUsCi0JCQkJIHN0cnVjdCBmaWxlZGVzY3IgKipwcEZpbGVEZXNjLAotCQkJCSBjaGFyICpwYXRoQnVmLAotCQkJCSBQeV9zc2l6ZV90IHBhdGhMZW4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZmlsZWRlc2NyICoqcHBGaWxlRGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnBhdGhCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IHBhdGhMZW4pCiB7Ci0JY2hhciAqbW9kdWxlS2V5OwotCWNvbnN0IGNoYXIga2V5UHJlZml4W10gPSAiU29mdHdhcmVcXFB5dGhvblxcUHl0aG9uQ29yZVxcIjsKLQljb25zdCBjaGFyIGtleVN1ZmZpeFtdID0gIlxcTW9kdWxlc1xcIjsKKyAgICBjaGFyICptb2R1bGVLZXk7CisgICAgY29uc3QgY2hhciBrZXlQcmVmaXhbXSA9ICJTb2Z0d2FyZVxcUHl0aG9uXFxQeXRob25Db3JlXFwiOworICAgIGNvbnN0IGNoYXIga2V5U3VmZml4W10gPSAiXFxNb2R1bGVzXFwiOwogI2lmZGVmIF9ERUJVRwotCS8qIEluIGRlYnVnZ2luZyBidWlsZHMsIHdlIF9tdXN0XyBoYXZlIHRoZSBkZWJ1ZyB2ZXJzaW9uCi0JICogcmVnaXN0ZXJlZC4KLQkgKi8KLQljb25zdCBjaGFyIGRlYnVnU3RyaW5nW10gPSAiXFxEZWJ1ZyI7CisgICAgLyogSW4gZGVidWdnaW5nIGJ1aWxkcywgd2UgX211c3RfIGhhdmUgdGhlIGRlYnVnIHZlcnNpb24KKyAgICAgKiByZWdpc3RlcmVkLgorICAgICAqLworICAgIGNvbnN0IGNoYXIgZGVidWdTdHJpbmdbXSA9ICJcXERlYnVnIjsKICNlbHNlCi0JY29uc3QgY2hhciBkZWJ1Z1N0cmluZ1tdID0gIiI7CisgICAgY29uc3QgY2hhciBkZWJ1Z1N0cmluZ1tdID0gIiI7CiAjZW5kaWYKLQlzdHJ1Y3QgZmlsZWRlc2NyICpmZHAgPSBOVUxMOwotCUZJTEUgKmZwOwotCUhLRVkga2V5QmFzZSA9IEhLRVlfQ1VSUkVOVF9VU0VSOwotCWludCBtb2ROYW1lU2l6ZTsKLQlsb25nIHJlZ1N0YXQ7CisgICAgc3RydWN0IGZpbGVkZXNjciAqZmRwID0gTlVMTDsKKyAgICBGSUxFICpmcDsKKyAgICBIS0VZIGtleUJhc2UgPSBIS0VZX0NVUlJFTlRfVVNFUjsKKyAgICBpbnQgbW9kTmFtZVNpemU7CisgICAgbG9uZyByZWdTdGF0OwogCi0JLyogQ2FsY3VsYXRlIHRoZSBzaXplIGZvciB0aGUgc3ByaW50ZiBidWZmZXIuCi0JICogR2V0IHRoZSBzaXplIG9mIHRoZSBjaGFycyBvbmx5LCBwbHVzIDEgTlVMTC4KLQkgKi8KLQlzaXplX3QgYnVmU2l6ZSA9IHNpemVvZihrZXlQcmVmaXgpLTEgKwotCSAgICAgICAgICAgICAgICAgc3RybGVuKFB5V2luX0RMTFZlcnNpb25TdHJpbmcpICsKLQkgICAgICAgICAgICAgICAgIHNpemVvZihrZXlTdWZmaXgpICsKLQkgICAgICAgICAgICAgICAgIHN0cmxlbihtb2R1bGVOYW1lKSArCi0JICAgICAgICAgICAgICAgICBzaXplb2YoZGVidWdTdHJpbmcpIC0gMTsKLQkvKiBhbGxvY2EgPT0gbm8gZnJlZSByZXF1aXJlZCwgYnV0IG1lbW9yeSBvbmx5IGxvY2FsIHRvIGZuLAotCSAqIGFsc28gbm8gaGVhcCBmcmFnbWVudGF0aW9uIQotCSAqLwotCW1vZHVsZUtleSA9IGFsbG9jYShidWZTaXplKTsgCi0JUHlPU19zbnByaW50Zihtb2R1bGVLZXksIGJ1ZlNpemUsCi0JCSAgICAgICJTb2Z0d2FyZVxcUHl0aG9uXFxQeXRob25Db3JlXFwlc1xcTW9kdWxlc1xcJXMlcyIsCi0JCSAgICAgIFB5V2luX0RMTFZlcnNpb25TdHJpbmcsIG1vZHVsZU5hbWUsIGRlYnVnU3RyaW5nKTsKKyAgICAvKiBDYWxjdWxhdGUgdGhlIHNpemUgZm9yIHRoZSBzcHJpbnRmIGJ1ZmZlci4KKyAgICAgKiBHZXQgdGhlIHNpemUgb2YgdGhlIGNoYXJzIG9ubHksIHBsdXMgMSBOVUxMLgorICAgICAqLworICAgIHNpemVfdCBidWZTaXplID0gc2l6ZW9mKGtleVByZWZpeCktMSArCisgICAgICAgICAgICAgICAgICAgICBzdHJsZW4oUHlXaW5fRExMVmVyc2lvblN0cmluZykgKworICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGtleVN1ZmZpeCkgKworICAgICAgICAgICAgICAgICAgICAgc3RybGVuKG1vZHVsZU5hbWUpICsKKyAgICAgICAgICAgICAgICAgICAgIHNpemVvZihkZWJ1Z1N0cmluZykgLSAxOworICAgIC8qIGFsbG9jYSA9PSBubyBmcmVlIHJlcXVpcmVkLCBidXQgbWVtb3J5IG9ubHkgbG9jYWwgdG8gZm4sCisgICAgICogYWxzbyBubyBoZWFwIGZyYWdtZW50YXRpb24hCisgICAgICovCisgICAgbW9kdWxlS2V5ID0gYWxsb2NhKGJ1ZlNpemUpOworICAgIFB5T1Nfc25wcmludGYobW9kdWxlS2V5LCBidWZTaXplLAorICAgICAgICAgICAgICAgICAgIlNvZnR3YXJlXFxQeXRob25cXFB5dGhvbkNvcmVcXCVzXFxNb2R1bGVzXFwlcyVzIiwKKyAgICAgICAgICAgICAgICAgIFB5V2luX0RMTFZlcnNpb25TdHJpbmcsIG1vZHVsZU5hbWUsIGRlYnVnU3RyaW5nKTsKIAotCWFzc2VydChwYXRoTGVuIDwgSU5UX01BWCk7Ci0JbW9kTmFtZVNpemUgPSAoaW50KXBhdGhMZW47Ci0JcmVnU3RhdCA9IFJlZ1F1ZXJ5VmFsdWUoa2V5QmFzZSwgbW9kdWxlS2V5LCBwYXRoQnVmLCAmbW9kTmFtZVNpemUpOwotCWlmIChyZWdTdGF0ICE9IEVSUk9SX1NVQ0NFU1MpIHsKLQkJLyogTm8gdXNlciBzZXR0aW5nIC0gbG9va3VwIGluIG1hY2hpbmUgc2V0dGluZ3MgKi8KLQkJa2V5QmFzZSA9IEhLRVlfTE9DQUxfTUFDSElORTsKLQkJLyogYmUgYW5hbCAtIGZhaWx1cmUgbWF5IGhhdmUgcmVzZXQgc2l6ZSBwYXJhbSAqLwotCQltb2ROYW1lU2l6ZSA9IChpbnQpcGF0aExlbjsKLQkJcmVnU3RhdCA9IFJlZ1F1ZXJ5VmFsdWUoa2V5QmFzZSwgbW9kdWxlS2V5LCAKLQkJICAgICAgICAgICAgICAgICAgICAgICAgcGF0aEJ1ZiwgJm1vZE5hbWVTaXplKTsKKyAgICBhc3NlcnQocGF0aExlbiA8IElOVF9NQVgpOworICAgIG1vZE5hbWVTaXplID0gKGludClwYXRoTGVuOworICAgIHJlZ1N0YXQgPSBSZWdRdWVyeVZhbHVlKGtleUJhc2UsIG1vZHVsZUtleSwgcGF0aEJ1ZiwgJm1vZE5hbWVTaXplKTsKKyAgICBpZiAocmVnU3RhdCAhPSBFUlJPUl9TVUNDRVNTKSB7CisgICAgICAgIC8qIE5vIHVzZXIgc2V0dGluZyAtIGxvb2t1cCBpbiBtYWNoaW5lIHNldHRpbmdzICovCisgICAgICAgIGtleUJhc2UgPSBIS0VZX0xPQ0FMX01BQ0hJTkU7CisgICAgICAgIC8qIGJlIGFuYWwgLSBmYWlsdXJlIG1heSBoYXZlIHJlc2V0IHNpemUgcGFyYW0gKi8KKyAgICAgICAgbW9kTmFtZVNpemUgPSAoaW50KXBhdGhMZW47CisgICAgICAgIHJlZ1N0YXQgPSBSZWdRdWVyeVZhbHVlKGtleUJhc2UsIG1vZHVsZUtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aEJ1ZiwgJm1vZE5hbWVTaXplKTsKIAotCQlpZiAocmVnU3RhdCAhPSBFUlJPUl9TVUNDRVNTKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCS8qIHVzZSB0aGUgZmlsZSBleHRlbnNpb24gdG8gbG9jYXRlIHRoZSB0eXBlIGVudHJ5LiAqLwotCWZvciAoZmRwID0gX1B5SW1wb3J0X0ZpbGV0YWI7IGZkcC0+c3VmZml4ICE9IE5VTEw7IGZkcCsrKSB7Ci0JCXNpemVfdCBleHRMZW4gPSBzdHJsZW4oZmRwLT5zdWZmaXgpOwotCQlhc3NlcnQobW9kTmFtZVNpemUgPj0gMCk7IC8qIGVsc2UgY2FzdCB0byBzaXplX3QgaXMgd3JvbmcgKi8KLQkJaWYgKChzaXplX3QpbW9kTmFtZVNpemUgPiBleHRMZW4gJiYKLQkJICAgIHN0cm5pY21wKHBhdGhCdWYgKyAoKHNpemVfdCltb2ROYW1lU2l6ZS1leHRMZW4tMSksCi0JCSAgICAgICAgICAgICBmZHAtPnN1ZmZpeCwKLQkJICAgICAgICAgICAgIGV4dExlbikgPT0gMCkKLQkJCWJyZWFrOwotCX0KLQlpZiAoZmRwLT5zdWZmaXggPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JZnAgPSBmb3BlbihwYXRoQnVmLCBmZHAtPm1vZGUpOwotCWlmIChmcCAhPSBOVUxMKQotCQkqcHBGaWxlRGVzYyA9IGZkcDsKLQlyZXR1cm4gZnA7CisgICAgICAgIGlmIChyZWdTdGF0ICE9IEVSUk9SX1NVQ0NFU1MpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgLyogdXNlIHRoZSBmaWxlIGV4dGVuc2lvbiB0byBsb2NhdGUgdGhlIHR5cGUgZW50cnkuICovCisgICAgZm9yIChmZHAgPSBfUHlJbXBvcnRfRmlsZXRhYjsgZmRwLT5zdWZmaXggIT0gTlVMTDsgZmRwKyspIHsKKyAgICAgICAgc2l6ZV90IGV4dExlbiA9IHN0cmxlbihmZHAtPnN1ZmZpeCk7CisgICAgICAgIGFzc2VydChtb2ROYW1lU2l6ZSA+PSAwKTsgLyogZWxzZSBjYXN0IHRvIHNpemVfdCBpcyB3cm9uZyAqLworICAgICAgICBpZiAoKHNpemVfdCltb2ROYW1lU2l6ZSA+IGV4dExlbiAmJgorICAgICAgICAgICAgc3RybmljbXAocGF0aEJ1ZiArICgoc2l6ZV90KW1vZE5hbWVTaXplLWV4dExlbi0xKSwKKyAgICAgICAgICAgICAgICAgICAgIGZkcC0+c3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgZXh0TGVuKSA9PSAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChmZHAtPnN1ZmZpeCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBmcCA9IGZvcGVuKHBhdGhCdWYsIGZkcC0+bW9kZSk7CisgICAgaWYgKGZwICE9IE5VTEwpCisgICAgICAgICpwcEZpbGVEZXNjID0gZmRwOworICAgIHJldHVybiBmcDsKIH0KZGlmZiAtLWdpdCBhL1BDL21ha2VfdmVyc2lvbmluZm8uYyBiL1BDL21ha2VfdmVyc2lvbmluZm8uYwppbmRleCBiOWY5Yjg4Li5lOTY5NjcxIDEwMDY0NAotLS0gYS9QQy9tYWtlX3ZlcnNpb25pbmZvLmMKKysrIGIvUEMvbWFrZV92ZXJzaW9uaW5mby5jCkBAIC0yMiwxNyArMjIsMTcgQEAKICAqLwogaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogewotCXByaW50ZigiLyogVGhpcyBmaWxlIGNyZWF0ZWQgYnkgbWFrZV92ZXJzaW9uaW5mby5leGUgKi9cbiIpOwotCXByaW50ZigiI2RlZmluZSBGSUVMRDMgJWRcbiIsCi0JCVBZX01JQ1JPX1ZFUlNJT04qMTAwMCArIFBZX1JFTEVBU0VfTEVWRUwqMTAgKyBQWV9SRUxFQVNFX1NFUklBTCk7Ci0JcHJpbnRmKCIjZGVmaW5lIE1TX0RMTF9JRCBcIiVkLiVkXCJcbiIsCi0JICAgICAgIFBZX01BSk9SX1ZFUlNJT04sIFBZX01JTk9SX1ZFUlNJT04pOwotCXByaW50ZigiI2lmbmRlZiBfREVCVUdcbiIpOwotCXByaW50ZigiI2RlZmluZSBQWVRIT05fRExMX05BTUUgXCJweXRob24lZCVkLmRsbFwiXG4iLAotCSAgICAgICBQWV9NQUpPUl9WRVJTSU9OLCBQWV9NSU5PUl9WRVJTSU9OKTsKLQlwcmludGYoIiNlbHNlXG4iKTsKLQlwcmludGYoIiNkZWZpbmUgUFlUSE9OX0RMTF9OQU1FIFwicHl0aG9uJWQlZF9kLmRsbFwiXG4iLAotCSAgICAgICBQWV9NQUpPUl9WRVJTSU9OLCBQWV9NSU5PUl9WRVJTSU9OKTsKLQlwcmludGYoIiNlbmRpZlxuIik7Ci0JcmV0dXJuIDA7CisgICAgcHJpbnRmKCIvKiBUaGlzIGZpbGUgY3JlYXRlZCBieSBtYWtlX3ZlcnNpb25pbmZvLmV4ZSAqL1xuIik7CisgICAgcHJpbnRmKCIjZGVmaW5lIEZJRUxEMyAlZFxuIiwKKyAgICAgICAgUFlfTUlDUk9fVkVSU0lPTioxMDAwICsgUFlfUkVMRUFTRV9MRVZFTCoxMCArIFBZX1JFTEVBU0VfU0VSSUFMKTsKKyAgICBwcmludGYoIiNkZWZpbmUgTVNfRExMX0lEIFwiJWQuJWRcIlxuIiwKKyAgICAgICAgICAgUFlfTUFKT1JfVkVSU0lPTiwgUFlfTUlOT1JfVkVSU0lPTik7CisgICAgcHJpbnRmKCIjaWZuZGVmIF9ERUJVR1xuIik7CisgICAgcHJpbnRmKCIjZGVmaW5lIFBZVEhPTl9ETExfTkFNRSBcInB5dGhvbiVkJWQuZGxsXCJcbiIsCisgICAgICAgICAgIFBZX01BSk9SX1ZFUlNJT04sIFBZX01JTk9SX1ZFUlNJT04pOworICAgIHByaW50ZigiI2Vsc2VcbiIpOworICAgIHByaW50ZigiI2RlZmluZSBQWVRIT05fRExMX05BTUUgXCJweXRob24lZCVkX2QuZGxsXCJcbiIsCisgICAgICAgICAgIFBZX01BSk9SX1ZFUlNJT04sIFBZX01JTk9SX1ZFUlNJT04pOworICAgIHByaW50ZigiI2VuZGlmXG4iKTsKKyAgICByZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL1BDL21zdmNydG1vZHVsZS5jIGIvUEMvbXN2Y3J0bW9kdWxlLmMKaW5kZXggNGZlNGViNC4uNDE4OTY1ZCAxMDA3NTUKLS0tIGEvUEMvbXN2Y3J0bW9kdWxlLmMKKysrIGIvUEMvbXN2Y3J0bW9kdWxlLmMKQEAgLTEsMTggKzEsMTggQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAotCW1zdmNydG1vZHVsZS5jCisgICAgbXN2Y3J0bW9kdWxlLmMKIAotCUEgUHl0aG9uIGludGVyZmFjZSB0byB0aGUgTWljcm9zb2Z0IFZpc3VhbCBDIFJ1bnRpbWUKLQlMaWJyYXJ5LCBwcm92aWRpbmcgYWNjZXNzIHRvIHRob3NlIG5vbi1wb3J0YWJsZSwgYnV0Ci0Jc3RpbGwgdXNlZnVsIHJvdXRpbmVzLgorICAgIEEgUHl0aG9uIGludGVyZmFjZSB0byB0aGUgTWljcm9zb2Z0IFZpc3VhbCBDIFJ1bnRpbWUKKyAgICBMaWJyYXJ5LCBwcm92aWRpbmcgYWNjZXNzIHRvIHRob3NlIG5vbi1wb3J0YWJsZSwgYnV0CisgICAgc3RpbGwgdXNlZnVsIHJvdXRpbmVzLgogCi0JT25seSBldmVyIGNvbXBpbGVkIHdpdGggYW4gTVMgY29tcGlsZXIsIHNvIG5vIGF0dGVtcHQKLQloYXMgYmVlbiBtYWRlIHRvIGF2b2lkIE1TIGxhbmd1YWdlIGV4dGVuc2lvbnMsIGV0Yy4uLgorICAgIE9ubHkgZXZlciBjb21waWxlZCB3aXRoIGFuIE1TIGNvbXBpbGVyLCBzbyBubyBhdHRlbXB0CisgICAgaGFzIGJlZW4gbWFkZSB0byBhdm9pZCBNUyBsYW5ndWFnZSBleHRlbnNpb25zLCBldGMuLi4KIAotCVRoaXMgbWF5IG9ubHkgd29yayBvbiBOVCBvciA5NS4uLgorICAgIFRoaXMgbWF5IG9ubHkgd29yayBvbiBOVCBvciA5NS4uLgogCi0JQXV0aG9yOiBNYXJrIEhhbW1vbmQgYW5kIEd1aWRvIHZhbiBSb3NzdW0uCi0JTWFpbnRlbmFuY2U6IEd1aWRvIHZhbiBSb3NzdW0uCisgICAgQXV0aG9yOiBNYXJrIEhhbW1vbmQgYW5kIEd1aWRvIHZhbiBSb3NzdW0uCisgICAgTWFpbnRlbmFuY2U6IEd1aWRvIHZhbiBSb3NzdW0uCiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCkBAIC0zMyw5MCArMzMsOTAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBtc3ZjcnRfaGVhcG1pbihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6aGVhcG1pbiIpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpoZWFwbWluIikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKF9oZWFwbWluKCkgIT0gMCkKLQkJcmV0dXJuIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKKyAgICBpZiAoX2hlYXBtaW4oKSAhPSAwKQorICAgICAgICByZXR1cm4gUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOwogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLy8gUGVyZm9ybSBsb2NraW5nIG9wZXJhdGlvbnMgb24gYSBDIHJ1bnRpbWUgZmlsZSBkZXNjcmlwdG9yLgogc3RhdGljIFB5T2JqZWN0ICoKIG1zdmNydF9sb2NraW5nKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgZmQ7Ci0JaW50IG1vZGU7Ci0JbG9uZyBuYnl0ZXM7Ci0JaW50IGVycjsKKyAgICBpbnQgZmQ7CisgICAgaW50IG1vZGU7CisgICAgbG9uZyBuYnl0ZXM7CisgICAgaW50IGVycjsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaWlsOmxvY2tpbmciLCAmZmQsICZtb2RlLCAmbmJ5dGVzKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpaWw6bG9ja2luZyIsICZmZCwgJm1vZGUsICZuYnl0ZXMpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQllcnIgPSBfbG9ja2luZyhmZCwgbW9kZSwgbmJ5dGVzKTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCWlmIChlcnIgIT0gMCkKLQkJcmV0dXJuIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgZXJyID0gX2xvY2tpbmcoZmQsIG1vZGUsIG5ieXRlcyk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBpZiAoZXJyICE9IDApCisgICAgICAgIHJldHVybiBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7CiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvLyBTZXQgdGhlIGZpbGUgdHJhbnNsYXRpb24gbW9kZSBmb3IgYSBDIHJ1bnRpbWUgZmlsZSBkZXNjcmlwdG9yLgogc3RhdGljIFB5T2JqZWN0ICoKIG1zdmNydF9zZXRtb2RlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgZmQ7Ci0JaW50IGZsYWdzOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCJpaTpzZXRtb2RlIiwgJmZkLCAmZmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpbnQgZmQ7CisgICAgaW50IGZsYWdzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCJpaTpzZXRtb2RlIiwgJmZkLCAmZmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWZsYWdzID0gX3NldG1vZGUoZmQsIGZsYWdzKTsKLQlpZiAoZmxhZ3MgPT0gLTEpCi0JCXJldHVybiBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7CisgICAgZmxhZ3MgPSBfc2V0bW9kZShmZCwgZmxhZ3MpOworICAgIGlmIChmbGFncyA9PSAtMSkKKyAgICAgICAgcmV0dXJuIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKIAotCXJldHVybiBQeUludF9Gcm9tTG9uZyhmbGFncyk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKGZsYWdzKTsKIH0KIAogLy8gQ29udmVydCBhbiBPUyBmaWxlIGhhbmRsZSB0byBhIEMgcnVudGltZSBmaWxlIGRlc2NyaXB0b3IuCiBzdGF0aWMgUHlPYmplY3QgKgogbXN2Y3J0X29wZW5fb3NmaGFuZGxlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGhhbmRsZTsKLQlpbnQgZmxhZ3M7Ci0JaW50IGZkOworICAgIGxvbmcgaGFuZGxlOworICAgIGludCBmbGFnczsKKyAgICBpbnQgZmQ7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImxpOm9wZW5fb3NmaGFuZGxlIiwgJmhhbmRsZSwgJmZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsaTpvcGVuX29zZmhhbmRsZSIsICZoYW5kbGUsICZmbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JZmQgPSBfb3Blbl9vc2ZoYW5kbGUoaGFuZGxlLCBmbGFncyk7Ci0JaWYgKGZkID09IC0xKQotCQlyZXR1cm4gUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOworICAgIGZkID0gX29wZW5fb3NmaGFuZGxlKGhhbmRsZSwgZmxhZ3MpOworICAgIGlmIChmZCA9PSAtMSkKKyAgICAgICAgcmV0dXJuIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKIAotCXJldHVybiBQeUludF9Gcm9tTG9uZyhmZCk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKGZkKTsKIH0KIAogLy8gQ29udmVydCBhIEMgcnVudGltZSBmaWxlIGRlc2NyaXB0b3IgdG8gYW4gT1MgZmlsZSBoYW5kbGUuCiBzdGF0aWMgUHlPYmplY3QgKgogbXN2Y3J0X2dldF9vc2ZoYW5kbGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBmZDsKLQlQeV9pbnRwdHJfdCBoYW5kbGU7CisgICAgaW50IGZkOworICAgIFB5X2ludHB0cl90IGhhbmRsZTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCJpOmdldF9vc2ZoYW5kbGUiLCAmZmQpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywiaTpnZXRfb3NmaGFuZGxlIiwgJmZkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQloYW5kbGUgPSBfZ2V0X29zZmhhbmRsZShmZCk7Ci0JaWYgKGhhbmRsZSA9PSAtMSkKLQkJcmV0dXJuIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKKyAgICBoYW5kbGUgPSBfZ2V0X29zZmhhbmRsZShmZCk7CisgICAgaWYgKGhhbmRsZSA9PSAtMSkKKyAgICAgICAgcmV0dXJuIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKIAotCS8qIHRlY2huaWNhbGx5ICdoYW5kbGUnIGlzIG5vdCBhIHBvaW50ZXIsIGJ1dCBhIGludGVnZXIgYXMKLQkgICBsYXJnZSBhcyBhIHBvaW50ZXIsIFB5dGhvbidzICpWb2lkUHRyIGludGVyZmFjZSBpcyB0aGUKLQkgICBtb3N0IGFwcHJvcHJpYXRlIGhlcmUgKi8KLQlyZXR1cm4gUHlMb25nX0Zyb21Wb2lkUHRyKCh2b2lkKiloYW5kbGUpOworICAgIC8qIHRlY2huaWNhbGx5ICdoYW5kbGUnIGlzIG5vdCBhIHBvaW50ZXIsIGJ1dCBhIGludGVnZXIgYXMKKyAgICAgICBsYXJnZSBhcyBhIHBvaW50ZXIsIFB5dGhvbidzICpWb2lkUHRyIGludGVyZmFjZSBpcyB0aGUKKyAgICAgICBtb3N0IGFwcHJvcHJpYXRlIGhlcmUgKi8KKyAgICByZXR1cm4gUHlMb25nX0Zyb21Wb2lkUHRyKCh2b2lkKiloYW5kbGUpOwogfQogCiAvKiBDb25zb2xlIEkvTyAqLwpAQCAtMTI0LDExMyArMTI0LDExMyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIG1zdmNydF9rYmhpdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IG9rOworICAgIGludCBvazsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOmtiaGl0IikpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOmtiaGl0IikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0Jb2sgPSBfa2JoaXQoKTsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcob2spOworICAgIG9rID0gX2tiaGl0KCk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKG9rKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG1zdmNydF9nZXRjaChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IGNoOwotCWNoYXIgc1sxXTsKKyAgICBpbnQgY2g7CisgICAgY2hhciBzWzFdOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6Z2V0Y2giKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6Z2V0Y2giKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JY2ggPSBfZ2V0Y2goKTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCXNbMF0gPSBjaDsKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocywgMSk7CisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIGNoID0gX2dldGNoKCk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBzWzBdID0gY2g7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHMsIDEpOwogfQogCiAjaWZkZWYgX1dDT05JT19ERUZJTkVECiBzdGF0aWMgUHlPYmplY3QgKgogbXN2Y3J0X2dldHdjaChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlfVU5JQ09ERSBjaDsKLQlQeV9VTklDT0RFIHVbMV07CisgICAgUHlfVU5JQ09ERSBjaDsKKyAgICBQeV9VTklDT0RFIHVbMV07CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpnZXR3Y2giKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6Z2V0d2NoIikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCWNoID0gX2dldHdjaCgpOwotCVB5X0VORF9BTExPV19USFJFQURTCi0JdVswXSA9IGNoOwotCXJldHVybiBQeVVuaWNvZGVfRnJvbVVuaWNvZGUodSwgMSk7CisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIGNoID0gX2dldHdjaCgpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgdVswXSA9IGNoOworICAgIHJldHVybiBQeVVuaWNvZGVfRnJvbVVuaWNvZGUodSwgMSk7CiB9CiAjZW5kaWYKIAogc3RhdGljIFB5T2JqZWN0ICoKIG1zdmNydF9nZXRjaGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBjaDsKLQljaGFyIHNbMV07CisgICAgaW50IGNoOworICAgIGNoYXIgc1sxXTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOmdldGNoZSIpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpnZXRjaGUiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JY2ggPSBfZ2V0Y2hlKCk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQlzWzBdID0gY2g7Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHMsIDEpOworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICBjaCA9IF9nZXRjaGUoKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIHNbMF0gPSBjaDsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocywgMSk7CiB9CiAKICNpZmRlZiBfV0NPTklPX0RFRklORUQKIHN0YXRpYyBQeU9iamVjdCAqCiBtc3ZjcnRfZ2V0d2NoZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlfVU5JQ09ERSBjaDsKLQlQeV9VTklDT0RFIHNbMV07CisgICAgUHlfVU5JQ09ERSBjaDsKKyAgICBQeV9VTklDT0RFIHNbMV07CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpnZXR3Y2hlIikpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOmdldHdjaGUiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JY2ggPSBfZ2V0d2NoZSgpOwotCVB5X0VORF9BTExPV19USFJFQURTCi0Jc1swXSA9IGNoOwotCXJldHVybiBQeVVuaWNvZGVfRnJvbVVuaWNvZGUocywgMSk7CisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIGNoID0gX2dldHdjaGUoKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIHNbMF0gPSBjaDsKKyAgICByZXR1cm4gUHlVbmljb2RlX0Zyb21Vbmljb2RlKHMsIDEpOwogfQogI2VuZGlmCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBtc3ZjcnRfcHV0Y2goUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgY2g7CisgICAgY2hhciBjaDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiYzpwdXRjaCIsICZjaCkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiYzpwdXRjaCIsICZjaCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JX3B1dGNoKGNoKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgX3B1dGNoKGNoKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKICNpZmRlZiBfV0NPTklPX0RFRklORUQKIHN0YXRpYyBQeU9iamVjdCAqCiBtc3ZjcnRfcHV0d2NoKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeV9VTklDT0RFICpjaDsKLQlpbnQgc2l6ZTsKKyAgICBQeV9VTklDT0RFICpjaDsKKyAgICBpbnQgc2l6ZTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAidSM6cHV0d2NoIiwgJmNoLCAmc2l6ZSkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAidSM6cHV0d2NoIiwgJmNoLCAmc2l6ZSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKHNpemUgPT0gMCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCSJFeHBlY3RlZCB1bmljb2RlIHN0cmluZyBvZiBsZW5ndGggMSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JX3B1dHdjaCgqY2gpOwotCVB5X1JFVFVSTl9OT05FOworICAgIGlmIChzaXplID09IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAiRXhwZWN0ZWQgdW5pY29kZSBzdHJpbmcgb2YgbGVuZ3RoIDEiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIF9wdXR3Y2goKmNoKTsKKyAgICBQeV9SRVRVUk5fTk9ORTsKIAogfQogI2VuZGlmCkBAIC0yMzgsMTAwICsyMzgsMTAwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogbXN2Y3J0X3VuZ2V0Y2goUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgY2g7CisgICAgY2hhciBjaDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiYzp1bmdldGNoIiwgJmNoKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJjOnVuZ2V0Y2giLCAmY2gpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChfdW5nZXRjaChjaCkgPT0gRU9GKQotCQlyZXR1cm4gUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAoX3VuZ2V0Y2goY2gpID09IEVPRikKKyAgICAgICAgcmV0dXJuIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKICNpZmRlZiBfV0NPTklPX0RFRklORUQKIHN0YXRpYyBQeU9iamVjdCAqCiBtc3ZjcnRfdW5nZXR3Y2goUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5X1VOSUNPREUgY2g7CisgICAgUHlfVU5JQ09ERSBjaDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAidTp1bmdldHdjaCIsICZjaCkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAidTp1bmdldHdjaCIsICZjaCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKF91bmdldGNoKGNoKSA9PSBFT0YpCi0JCXJldHVybiBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGlmIChfdW5nZXRjaChjaCkgPT0gRU9GKQorICAgICAgICByZXR1cm4gUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KICNlbmRpZgogCiBzdGF0aWMgdm9pZAogaW5zZXJ0aW50KFB5T2JqZWN0ICpkLCBjaGFyICpuYW1lLCBpbnQgdmFsdWUpCiB7Ci0JUHlPYmplY3QgKnYgPSBQeUludF9Gcm9tTG9uZygobG9uZykgdmFsdWUpOwotCWlmICh2ID09IE5VTEwpIHsKLQkJLyogRG9uJ3QgYm90aGVyIHJlcG9ydGluZyB0aGlzIGVycm9yICovCi0JCVB5RXJyX0NsZWFyKCk7Ci0JfQotCWVsc2UgewotCQlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCBuYW1lLCB2KTsKLQkJUHlfREVDUkVGKHYpOwotCX0KKyAgICBQeU9iamVjdCAqdiA9IFB5SW50X0Zyb21Mb25nKChsb25nKSB2YWx1ZSk7CisgICAgaWYgKHYgPT0gTlVMTCkgeworICAgICAgICAvKiBEb24ndCBib3RoZXIgcmVwb3J0aW5nIHRoaXMgZXJyb3IgKi8KKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsIG5hbWUsIHYpOworICAgICAgICBQeV9ERUNSRUYodik7CisgICAgfQogfQogCiAKIC8qIExpc3Qgb2YgZnVuY3Rpb25zIGV4cG9ydGVkIGJ5IHRoaXMgbW9kdWxlICovCiBzdGF0aWMgc3RydWN0IFB5TWV0aG9kRGVmIG1zdmNydF9mdW5jdGlvbnNbXSA9IHsKLQl7ImhlYXBtaW4iLAkJbXN2Y3J0X2hlYXBtaW4sIE1FVEhfVkFSQVJHU30sCi0JeyJsb2NraW5nIiwgICAgICAgICAgICAgbXN2Y3J0X2xvY2tpbmcsIE1FVEhfVkFSQVJHU30sCi0JeyJzZXRtb2RlIiwJCW1zdmNydF9zZXRtb2RlLCBNRVRIX1ZBUkFSR1N9LAotCXsib3Blbl9vc2ZoYW5kbGUiLAltc3ZjcnRfb3Blbl9vc2ZoYW5kbGUsIE1FVEhfVkFSQVJHU30sCi0JeyJnZXRfb3NmaGFuZGxlIiwJbXN2Y3J0X2dldF9vc2ZoYW5kbGUsIE1FVEhfVkFSQVJHU30sCi0JeyJrYmhpdCIsCQltc3ZjcnRfa2JoaXQsIE1FVEhfVkFSQVJHU30sCi0JeyJnZXRjaCIsCQltc3ZjcnRfZ2V0Y2gsIE1FVEhfVkFSQVJHU30sCi0JeyJnZXRjaGUiLAkJbXN2Y3J0X2dldGNoZSwgTUVUSF9WQVJBUkdTfSwKLQl7InB1dGNoIiwJCW1zdmNydF9wdXRjaCwgTUVUSF9WQVJBUkdTfSwKLQl7InVuZ2V0Y2giLAkJbXN2Y3J0X3VuZ2V0Y2gsIE1FVEhfVkFSQVJHU30sCisgICAgeyJoZWFwbWluIiwgICAgICAgICAgICAgICAgIG1zdmNydF9oZWFwbWluLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsibG9ja2luZyIsICAgICAgICAgICAgIG1zdmNydF9sb2NraW5nLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsic2V0bW9kZSIsICAgICAgICAgICAgICAgICBtc3ZjcnRfc2V0bW9kZSwgTUVUSF9WQVJBUkdTfSwKKyAgICB7Im9wZW5fb3NmaGFuZGxlIiwgICAgICAgICAgbXN2Y3J0X29wZW5fb3NmaGFuZGxlLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsiZ2V0X29zZmhhbmRsZSIsICAgICAgICAgICBtc3ZjcnRfZ2V0X29zZmhhbmRsZSwgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImtiaGl0IiwgICAgICAgICAgICAgICAgICAgbXN2Y3J0X2tiaGl0LCBNRVRIX1ZBUkFSR1N9LAorICAgIHsiZ2V0Y2giLCAgICAgICAgICAgICAgICAgICBtc3ZjcnRfZ2V0Y2gsIE1FVEhfVkFSQVJHU30sCisgICAgeyJnZXRjaGUiLCAgICAgICAgICAgICAgICAgIG1zdmNydF9nZXRjaGUsIE1FVEhfVkFSQVJHU30sCisgICAgeyJwdXRjaCIsICAgICAgICAgICAgICAgICAgIG1zdmNydF9wdXRjaCwgTUVUSF9WQVJBUkdTfSwKKyAgICB7InVuZ2V0Y2giLCAgICAgICAgICAgICAgICAgbXN2Y3J0X3VuZ2V0Y2gsIE1FVEhfVkFSQVJHU30sCiAjaWZkZWYgX1dDT05JT19ERUZJTkVECi0JeyJnZXR3Y2giLAkJbXN2Y3J0X2dldHdjaCwgTUVUSF9WQVJBUkdTfSwKLQl7ImdldHdjaGUiLAkJbXN2Y3J0X2dldHdjaGUsIE1FVEhfVkFSQVJHU30sCi0JeyJwdXR3Y2giLAkJbXN2Y3J0X3B1dHdjaCwgTUVUSF9WQVJBUkdTfSwKLQl7InVuZ2V0d2NoIiwJCW1zdmNydF91bmdldHdjaCwgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImdldHdjaCIsICAgICAgICAgICAgICAgICAgbXN2Y3J0X2dldHdjaCwgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImdldHdjaGUiLCAgICAgICAgICAgICAgICAgbXN2Y3J0X2dldHdjaGUsIE1FVEhfVkFSQVJHU30sCisgICAgeyJwdXR3Y2giLCAgICAgICAgICAgICAgICAgIG1zdmNydF9wdXR3Y2gsIE1FVEhfVkFSQVJHU30sCisgICAgeyJ1bmdldHdjaCIsICAgICAgICAgICAgICAgIG1zdmNydF91bmdldHdjaCwgTUVUSF9WQVJBUkdTfSwKICNlbmRpZgotCXtOVUxMLAkJCU5VTEx9CisgICAge05VTEwsICAgICAgICAgICAgICAgICAgICAgIE5VTEx9CiB9OwogCiBQeU1PRElOSVRfRlVOQwogaW5pdG1zdmNydCh2b2lkKQogewotCWludCBzdDsKLQlQeU9iamVjdCAqZDsKLQlQeU9iamVjdCAqbSA9IFB5X0luaXRNb2R1bGUoIm1zdmNydCIsIG1zdmNydF9mdW5jdGlvbnMpOwotCWlmIChtID09IE5VTEwpCi0JCXJldHVybjsKLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICBpbnQgc3Q7CisgICAgUHlPYmplY3QgKmQ7CisgICAgUHlPYmplY3QgKm0gPSBQeV9Jbml0TW9kdWxlKCJtc3ZjcnQiLCBtc3ZjcnRfZnVuY3Rpb25zKTsKKyAgICBpZiAobSA9PSBOVUxMKQorICAgICAgICByZXR1cm47CisgICAgZCA9IFB5TW9kdWxlX0dldERpY3QobSk7CiAKLQkvKiBjb25zdGFudHMgZm9yIHRoZSBsb2NraW5nKCkgZnVuY3Rpb24ncyBtb2RlIGFyZ3VtZW50ICovCi0JaW5zZXJ0aW50KGQsICJMS19MT0NLIiwgX0xLX0xPQ0spOwotCWluc2VydGludChkLCAiTEtfTkJMQ0siLCBfTEtfTkJMQ0spOwotCWluc2VydGludChkLCAiTEtfTkJSTENLIiwgX0xLX05CUkxDSyk7Ci0JaW5zZXJ0aW50KGQsICJMS19STENLIiwgX0xLX1JMQ0spOwotCWluc2VydGludChkLCAiTEtfVU5MQ0siLCBfTEtfVU5MQ0spOworICAgIC8qIGNvbnN0YW50cyBmb3IgdGhlIGxvY2tpbmcoKSBmdW5jdGlvbidzIG1vZGUgYXJndW1lbnQgKi8KKyAgICBpbnNlcnRpbnQoZCwgIkxLX0xPQ0siLCBfTEtfTE9DSyk7CisgICAgaW5zZXJ0aW50KGQsICJMS19OQkxDSyIsIF9MS19OQkxDSyk7CisgICAgaW5zZXJ0aW50KGQsICJMS19OQlJMQ0siLCBfTEtfTkJSTENLKTsKKyAgICBpbnNlcnRpbnQoZCwgIkxLX1JMQ0siLCBfTEtfUkxDSyk7CisgICAgaW5zZXJ0aW50KGQsICJMS19VTkxDSyIsIF9MS19VTkxDSyk7CiAKLQkvKiBjb25zdGFudHMgZm9yIHRoZSBjcnQgdmVyc2lvbnMgKi8KKyAgICAvKiBjb25zdGFudHMgZm9yIHRoZSBjcnQgdmVyc2lvbnMgKi8KICNpZmRlZiBfVkNfQVNTRU1CTFlfUFVCTElDS0VZVE9LRU4KLQlzdCA9IFB5TW9kdWxlX0FkZFN0cmluZ0NvbnN0YW50KG0sICJWQ19BU1NFTUJMWV9QVUJMSUNLRVlUT0tFTiIsCi0JCQkJCV9WQ19BU1NFTUJMWV9QVUJMSUNLRVlUT0tFTik7Ci0JaWYgKHN0IDwgMClyZXR1cm47CisgICAgc3QgPSBQeU1vZHVsZV9BZGRTdHJpbmdDb25zdGFudChtLCAiVkNfQVNTRU1CTFlfUFVCTElDS0VZVE9LRU4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1ZDX0FTU0VNQkxZX1BVQkxJQ0tFWVRPS0VOKTsKKyAgICBpZiAoc3QgPCAwKXJldHVybjsKICNlbmRpZgogI2lmZGVmIF9DUlRfQVNTRU1CTFlfVkVSU0lPTgotCXN0ID0gUHlNb2R1bGVfQWRkU3RyaW5nQ29uc3RhbnQobSwgIkNSVF9BU1NFTUJMWV9WRVJTSU9OIiwKLQkJCQkJX0NSVF9BU1NFTUJMWV9WRVJTSU9OKTsKLQlpZiAoc3QgPCAwKXJldHVybjsKKyAgICBzdCA9IFB5TW9kdWxlX0FkZFN0cmluZ0NvbnN0YW50KG0sICJDUlRfQVNTRU1CTFlfVkVSU0lPTiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQ1JUX0FTU0VNQkxZX1ZFUlNJT04pOworICAgIGlmIChzdCA8IDApcmV0dXJuOwogI2VuZGlmCiAjaWZkZWYgX19MSUJSQVJJRVNfQVNTRU1CTFlfTkFNRV9QUkVGSVgKLQlzdCA9IFB5TW9kdWxlX0FkZFN0cmluZ0NvbnN0YW50KG0sICJMSUJSQVJJRVNfQVNTRU1CTFlfTkFNRV9QUkVGSVgiLAotCQkJCQlfX0xJQlJBUklFU19BU1NFTUJMWV9OQU1FX1BSRUZJWCk7Ci0JaWYgKHN0IDwgMClyZXR1cm47CisgICAgc3QgPSBQeU1vZHVsZV9BZGRTdHJpbmdDb25zdGFudChtLCAiTElCUkFSSUVTX0FTU0VNQkxZX05BTUVfUFJFRklYIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fTElCUkFSSUVTX0FTU0VNQkxZX05BTUVfUFJFRklYKTsKKyAgICBpZiAoc3QgPCAwKXJldHVybjsKICNlbmRpZgogfQpkaWZmIC0tZ2l0IGEvUEMvb3MyZW14L2NvbmZpZy5jIGIvUEMvb3MyZW14L2NvbmZpZy5jCmluZGV4IDQwODM4MWMuLmNiYWIyNWMgMTAwNjQ0Ci0tLSBhL1BDL29zMmVteC9jb25maWcuYworKysgYi9QQy9vczJlbXgvY29uZmlnLmMKQEAgLTEwMiw4MSArMTAyLDgxIEBACiAKIHN0cnVjdCBfaW5pdHRhYiBfUHlJbXBvcnRfSW5pdHRhYltdID0gewogCi0JeyJvczIiLCBpbml0b3MyfSwKLQl7InNpZ25hbCIsIGluaXRzaWduYWx9LAorICAgIHsib3MyIiwgaW5pdG9zMn0sCisgICAgeyJzaWduYWwiLCBpbml0c2lnbmFsfSwKICNpZmRlZiBXSVRIX1RIUkVBRAotCXsidGhyZWFkIiwgaW5pdHRocmVhZH0sCisgICAgeyJ0aHJlYWQiLCBpbml0dGhyZWFkfSwKICNlbmRpZgotCXsiX2NvZGVjcyIsIGluaXRfY29kZWNzfSwKLQl7Il9jc3YiLCBpbml0X2Nzdn0sCi0JeyJfbG9jYWxlIiwgaW5pdF9sb2NhbGV9LAotCXsiX3JhbmRvbSIsIGluaXRfcmFuZG9tfSwKLQl7Il9zcmUiLCBpbml0X3NyZX0sCi0JeyJfc3ltdGFibGUiLCBpbml0X3N5bXRhYmxlfSwKLQl7Il93ZWFrcmVmIiwgaW5pdF93ZWFrcmVmfSwKLQl7ImFycmF5IiwgaW5pdGFycmF5fSwKLQl7ImJpbmFzY2lpIiwgaW5pdGJpbmFzY2lpfSwKLQl7ImNQaWNrbGUiLCBpbml0Y1BpY2tsZX0sCi0JeyJjU3RyaW5nSU8iLCBpbml0Y1N0cmluZ0lPfSwKLQl7Il9jb2xsZWN0aW9ucyIsIGluaXRfY29sbGVjdGlvbnN9LAotCXsiY21hdGgiLCBpbml0Y21hdGh9LAotCXsiZGF0ZXRpbWUiLCBpbml0ZGF0ZXRpbWV9LAotCXsiZGwiLCBpbml0ZGx9LAotCXsiZXJybm8iLCBpbml0ZXJybm99LAotCXsiZmNudGwiLCBpbml0ZmNudGx9LAotCXsiX2ZpbGVpbyIsIGluaXRfZmlsZWlvfSwKLQl7Il9mdW5jdG9vbHMiLCBpbml0X2Z1bmN0b29sc30sCi0JeyJfaGVhcHEiLCBpbml0X2hlYXBxfSwKLQl7ImltYWdlb3AiLCBpbml0aW1hZ2VvcH0sCi0JeyJpdGVydG9vbHMiLCBpbml0aXRlcnRvb2xzfSwKLQl7Im1hdGgiLCBpbml0bWF0aH0sCi0JeyJfbWQ1IiwgaW5pdF9tZDV9LAotCXsib3BlcmF0b3IiLCBpbml0b3BlcmF0b3J9LAotCXsiX3NoYSIsIGluaXRfc2hhfSwKLQl7Il9zaGEyNTYiLCBpbml0X3NoYTI1Nn0sCi0JeyJfc2hhNTEyIiwgaW5pdF9zaGE1MTJ9LAotCXsic3Ryb3AiLCBpbml0c3Ryb3B9LAotCXsiX3N0cnVjdCIsIGluaXRfc3RydWN0fSwKLQl7InRlcm1pb3MiLCBpbml0dGVybWlvc30sCi0JeyJ0aW1lIiwgaW5pdHRpbWV9LAotCXsidGltaW5nIiwgaW5pdHRpbWluZ30sCi0JeyJ4eHN1YnR5cGUiLCBpbml0eHhzdWJ0eXBlfSwKLQl7InppcGltcG9ydCIsIGluaXR6aXBpbXBvcnR9LAorICAgIHsiX2NvZGVjcyIsIGluaXRfY29kZWNzfSwKKyAgICB7Il9jc3YiLCBpbml0X2Nzdn0sCisgICAgeyJfbG9jYWxlIiwgaW5pdF9sb2NhbGV9LAorICAgIHsiX3JhbmRvbSIsIGluaXRfcmFuZG9tfSwKKyAgICB7Il9zcmUiLCBpbml0X3NyZX0sCisgICAgeyJfc3ltdGFibGUiLCBpbml0X3N5bXRhYmxlfSwKKyAgICB7Il93ZWFrcmVmIiwgaW5pdF93ZWFrcmVmfSwKKyAgICB7ImFycmF5IiwgaW5pdGFycmF5fSwKKyAgICB7ImJpbmFzY2lpIiwgaW5pdGJpbmFzY2lpfSwKKyAgICB7ImNQaWNrbGUiLCBpbml0Y1BpY2tsZX0sCisgICAgeyJjU3RyaW5nSU8iLCBpbml0Y1N0cmluZ0lPfSwKKyAgICB7Il9jb2xsZWN0aW9ucyIsIGluaXRfY29sbGVjdGlvbnN9LAorICAgIHsiY21hdGgiLCBpbml0Y21hdGh9LAorICAgIHsiZGF0ZXRpbWUiLCBpbml0ZGF0ZXRpbWV9LAorICAgIHsiZGwiLCBpbml0ZGx9LAorICAgIHsiZXJybm8iLCBpbml0ZXJybm99LAorICAgIHsiZmNudGwiLCBpbml0ZmNudGx9LAorICAgIHsiX2ZpbGVpbyIsIGluaXRfZmlsZWlvfSwKKyAgICB7Il9mdW5jdG9vbHMiLCBpbml0X2Z1bmN0b29sc30sCisgICAgeyJfaGVhcHEiLCBpbml0X2hlYXBxfSwKKyAgICB7ImltYWdlb3AiLCBpbml0aW1hZ2VvcH0sCisgICAgeyJpdGVydG9vbHMiLCBpbml0aXRlcnRvb2xzfSwKKyAgICB7Im1hdGgiLCBpbml0bWF0aH0sCisgICAgeyJfbWQ1IiwgaW5pdF9tZDV9LAorICAgIHsib3BlcmF0b3IiLCBpbml0b3BlcmF0b3J9LAorICAgIHsiX3NoYSIsIGluaXRfc2hhfSwKKyAgICB7Il9zaGEyNTYiLCBpbml0X3NoYTI1Nn0sCisgICAgeyJfc2hhNTEyIiwgaW5pdF9zaGE1MTJ9LAorICAgIHsic3Ryb3AiLCBpbml0c3Ryb3B9LAorICAgIHsiX3N0cnVjdCIsIGluaXRfc3RydWN0fSwKKyAgICB7InRlcm1pb3MiLCBpbml0dGVybWlvc30sCisgICAgeyJ0aW1lIiwgaW5pdHRpbWV9LAorICAgIHsidGltaW5nIiwgaW5pdHRpbWluZ30sCisgICAgeyJ4eHN1YnR5cGUiLCBpbml0eHhzdWJ0eXBlfSwKKyAgICB7InppcGltcG9ydCIsIGluaXR6aXBpbXBvcnR9LAogI2lmICFIQVZFX0RZTkFNSUNfTE9BRElORwotCXsiX2N1cnNlcyIsIGluaXRfY3Vyc2VzfSwKLQl7Il9jdXJzZXNfcGFuZWwiLCBpbml0X2N1cnNlc19wYW5lbH0sCi0JeyJfaG90c2hvdCIsIGluaXRfaG90c2hvdH0sCi0JeyJfdGVzdGNhcGkiLCBpbml0X3Rlc3RjYXBpfSwKLQl7ImJzZGRiMTg1IiwgaW5pdGJzZGRiMTg1fSwKLQl7ImJ6MiIsIGluaXRiejJ9LAotCXsiZnBlY3RsIiwgaW5pdGZwZWN0bH0sCi0JeyJmcGV0ZXN0IiwgaW5pdGZwZXRlc3R9LAotCXsicGFyc2VyIiwgaW5pdHBhcnNlcn0sCi0JeyJwd2QiLCBpbml0cHdkfSwKLQl7InVuaWNvZGVkYXRhIiwgaW5pdHVuaWNvZGVkYXRhfSwKLQl7InpsaWIiLCBpbml0emxpYn0sCisgICAgeyJfY3Vyc2VzIiwgaW5pdF9jdXJzZXN9LAorICAgIHsiX2N1cnNlc19wYW5lbCIsIGluaXRfY3Vyc2VzX3BhbmVsfSwKKyAgICB7Il9ob3RzaG90IiwgaW5pdF9ob3RzaG90fSwKKyAgICB7Il90ZXN0Y2FwaSIsIGluaXRfdGVzdGNhcGl9LAorICAgIHsiYnNkZGIxODUiLCBpbml0YnNkZGIxODV9LAorICAgIHsiYnoyIiwgaW5pdGJ6Mn0sCisgICAgeyJmcGVjdGwiLCBpbml0ZnBlY3RsfSwKKyAgICB7ImZwZXRlc3QiLCBpbml0ZnBldGVzdH0sCisgICAgeyJwYXJzZXIiLCBpbml0cGFyc2VyfSwKKyAgICB7InB3ZCIsIGluaXRwd2R9LAorICAgIHsidW5pY29kZWRhdGEiLCBpbml0dW5pY29kZWRhdGF9LAorICAgIHsiemxpYiIsIGluaXR6bGlifSwKICNpZmRlZiBVU0VfU09DS0VUCi0JeyJfc29ja2V0IiwgaW5pdF9zb2NrZXR9LAotCXsic2VsZWN0IiwgaW5pdHNlbGVjdH0sCisgICAgeyJfc29ja2V0IiwgaW5pdF9zb2NrZXR9LAorICAgIHsic2VsZWN0IiwgaW5pdHNlbGVjdH0sCiAjZW5kaWYKICNlbmRpZgogLyogLS0gQURETU9EVUxFIE1BUktFUiAyIC0tICovCiAKLQkvKiBUaGlzIG1vZHVsZSAibGl2ZXMgaW4iIHdpdGggbWFyc2hhbC5jICovCi0JeyJtYXJzaGFsIiwgUHlNYXJzaGFsX0luaXR9LAorICAgIC8qIFRoaXMgbW9kdWxlICJsaXZlcyBpbiIgd2l0aCBtYXJzaGFsLmMgKi8KKyAgICB7Im1hcnNoYWwiLCBQeU1hcnNoYWxfSW5pdH0sCiAKLQkvKiBUaGlzIGxpdmVzIGl0IHdpdGggaW1wb3J0LmMgKi8KLQl7ImltcCIsIGluaXRpbXB9LAorICAgIC8qIFRoaXMgbGl2ZXMgaXQgd2l0aCBpbXBvcnQuYyAqLworICAgIHsiaW1wIiwgaW5pdGltcH0sCiAKLQkvKiBUaGVzZSBlbnRyaWVzIGFyZSBoZXJlIGZvciBzeXMuYnVpbHRpbl9tb2R1bGVfbmFtZXMgKi8KLQl7Il9fbWFpbl9fIiwgTlVMTH0sCi0JeyJfX2J1aWx0aW5fXyIsIE5VTEx9LAotCXsic3lzIiwgTlVMTH0sCi0JeyJleGNlcHRpb25zIiwgTlVMTH0sCisgICAgLyogVGhlc2UgZW50cmllcyBhcmUgaGVyZSBmb3Igc3lzLmJ1aWx0aW5fbW9kdWxlX25hbWVzICovCisgICAgeyJfX21haW5fXyIsIE5VTEx9LAorICAgIHsiX19idWlsdGluX18iLCBOVUxMfSwKKyAgICB7InN5cyIsIE5VTEx9LAorICAgIHsiZXhjZXB0aW9ucyIsIE5VTEx9LAogCi0JLyogVGhpcyBsaXZlcyBpbiBnY21vZHVsZS5jICovCi0JeyJnYyIsIGluaXRnY30sCisgICAgLyogVGhpcyBsaXZlcyBpbiBnY21vZHVsZS5jICovCisgICAgeyJnYyIsIGluaXRnY30sCiAKLQkvKiBTZW50aW5lbCAqLwotCXswLCAwfQorICAgIC8qIFNlbnRpbmVsICovCisgICAgezAsIDB9CiB9OwpkaWZmIC0tZ2l0IGEvUEMvb3MyZW14L2RsZmNuLmMgYi9QQy9vczJlbXgvZGxmY24uYwppbmRleCA5ZTg4ZDVlLi40N2MwNDZjIDEwMDY0NAotLS0gYS9QQy9vczJlbXgvZGxmY24uYworKysgYi9QQy9vczJlbXgvZGxmY24uYwpAQCAtNDYsMTc4ICs0NiwxNzggQEAKICNpbmNsdWRlIDxtYWxsb2MuaD4KIAogdHlwZWRlZiBzdHJ1Y3QgX3RyYWNrX3JlYyB7Ci0JY2hhciAqbmFtZTsKLQlITU9EVUxFIGhhbmRsZTsKLQl2b2lkICppZDsKLQlzdHJ1Y3QgX3RyYWNrX3JlYyAqbmV4dDsKKyAgICBjaGFyICpuYW1lOworICAgIEhNT0RVTEUgaGFuZGxlOworICAgIHZvaWQgKmlkOworICAgIHN0cnVjdCBfdHJhY2tfcmVjICpuZXh0OwogfSB0RExMY2hhaW4sICpETExjaGFpbjsKIAotc3RhdGljIERMTGNoYWluIGRsbG9hZCA9IE5VTEw7CS8qIEEgc2ltcGxlIGNoYWluZWQgbGlzdCBvZiBETEwgbmFtZXMgKi8KLXN0YXRpYyBjaGFyIGRsZXJyIFsyNTZdOwkvKiBsYXN0IGVycm9yIHRleHQgc3RyaW5nICovCitzdGF0aWMgRExMY2hhaW4gZGxsb2FkID0gTlVMTDsgIC8qIEEgc2ltcGxlIGNoYWluZWQgbGlzdCBvZiBETEwgbmFtZXMgKi8KK3N0YXRpYyBjaGFyIGRsZXJyIFsyNTZdOyAgICAgICAgLyogbGFzdCBlcnJvciB0ZXh0IHN0cmluZyAqLwogc3RhdGljIHZvaWQgKmxhc3RfaWQ7CiAKIHN0YXRpYyBETExjaGFpbiBmaW5kX2lkKHZvaWQgKmlkKQogewotCURMTGNoYWluIHRtcDsKKyAgICBETExjaGFpbiB0bXA7CiAKLQlmb3IgKHRtcCA9IGRsbG9hZDsgdG1wOyB0bXAgPSB0bXAtPm5leHQpCi0JCWlmIChpZCA9PSB0bXAtPmlkKQotCQkJcmV0dXJuIHRtcDsKKyAgICBmb3IgKHRtcCA9IGRsbG9hZDsgdG1wOyB0bXAgPSB0bXAtPm5leHQpCisgICAgICAgIGlmIChpZCA9PSB0bXAtPmlkKQorICAgICAgICAgICAgcmV0dXJuIHRtcDsKIAotCXJldHVybiBOVUxMOworICAgIHJldHVybiBOVUxMOwogfQogCiAvKiBsb2FkIGEgZHluYW1pYy1saW5rIGxpYnJhcnkgYW5kIHJldHVybiBoYW5kbGUgKi8KIHZvaWQgKmRsb3BlbihjaGFyICpmaWxlbmFtZSwgaW50IGZsYWdzKQogewotCUhNT0RVTEUgaG07Ci0JRExMY2hhaW4gdG1wOwotCWNoYXIgZXJyWzI1Nl07Ci0JY2hhciAqZXJydHh0OwotCWludCByYyA9IDAsIHNldF9jaGFpbiA9IDA7CisgICAgSE1PRFVMRSBobTsKKyAgICBETExjaGFpbiB0bXA7CisgICAgY2hhciBlcnJbMjU2XTsKKyAgICBjaGFyICplcnJ0eHQ7CisgICAgaW50IHJjID0gMCwgc2V0X2NoYWluID0gMDsKIAotCWZvciAodG1wID0gZGxsb2FkOyB0bXA7IHRtcCA9IHRtcC0+bmV4dCkKLQkJaWYgKHN0cm5pY21wKHRtcC0+bmFtZSwgZmlsZW5hbWUsIDk5OSkgPT0gMCkKLQkJCWJyZWFrOworICAgIGZvciAodG1wID0gZGxsb2FkOyB0bXA7IHRtcCA9IHRtcC0+bmV4dCkKKyAgICAgICAgaWYgKHN0cm5pY21wKHRtcC0+bmFtZSwgZmlsZW5hbWUsIDk5OSkgPT0gMCkKKyAgICAgICAgICAgIGJyZWFrOwogCi0JaWYgKCF0bXApCi0JewotCQl0bXAgPSAoRExMY2hhaW4pIG1hbGxvYyhzaXplb2YodERMTGNoYWluKSk7Ci0JCWlmICghdG1wKQotCQkJZ290byBub21lbTsKLQkJdG1wLT5uYW1lID0gc3RyZHVwKGZpbGVuYW1lKTsKLQkJdG1wLT5uZXh0ID0gZGxsb2FkOwotCQlzZXRfY2hhaW4gPSAxOwotCX0KKyAgICBpZiAoIXRtcCkKKyAgICB7CisgICAgICAgIHRtcCA9IChETExjaGFpbikgbWFsbG9jKHNpemVvZih0RExMY2hhaW4pKTsKKyAgICAgICAgaWYgKCF0bXApCisgICAgICAgICAgICBnb3RvIG5vbWVtOworICAgICAgICB0bXAtPm5hbWUgPSBzdHJkdXAoZmlsZW5hbWUpOworICAgICAgICB0bXAtPm5leHQgPSBkbGxvYWQ7CisgICAgICAgIHNldF9jaGFpbiA9IDE7CisgICAgfQogCi0Jc3dpdGNoIChyYyA9IERvc0xvYWRNb2R1bGUoKFBTWikmZXJyLCBzaXplb2YoZXJyKSwgZmlsZW5hbWUsICZobSkpCi0JewotCQljYXNlIE5PX0VSUk9SOgotCQkJdG1wLT5oYW5kbGUgPSBobTsKLQkJCWlmIChzZXRfY2hhaW4pCi0JCQl7Ci0JCQkJZG8KLQkJCQkJbGFzdF9pZCsrOwotCQkJCXdoaWxlICgobGFzdF9pZCA9PSAwKSB8fCAoZmluZF9pZChsYXN0X2lkKSkpOwotCQkJCXRtcC0+aWQgPSBsYXN0X2lkOwotCQkJCWRsbG9hZCA9IHRtcDsKLQkJCX0KLQkJCXJldHVybiB0bXAtPmlkOwotCQljYXNlIEVSUk9SX0ZJTEVfTk9UX0ZPVU5EOgotCQljYXNlIEVSUk9SX1BBVEhfTk9UX0ZPVU5EOgotCQkJZXJydHh0ID0gIm1vZHVsZSBgJXMnIG5vdCBmb3VuZCI7Ci0JCQlicmVhazsKLQkJY2FzZSBFUlJPUl9UT09fTUFOWV9PUEVOX0ZJTEVTOgotCQljYXNlIEVSUk9SX05PVF9FTk9VR0hfTUVNT1JZOgotCQljYXNlIEVSUk9SX1NIQVJJTkdfQlVGRkVSX0VYQ0VFREVEOgorICAgIHN3aXRjaCAocmMgPSBEb3NMb2FkTW9kdWxlKChQU1opJmVyciwgc2l6ZW9mKGVyciksIGZpbGVuYW1lLCAmaG0pKQorICAgIHsKKyAgICAgICAgY2FzZSBOT19FUlJPUjoKKyAgICAgICAgICAgIHRtcC0+aGFuZGxlID0gaG07CisgICAgICAgICAgICBpZiAoc2V0X2NoYWluKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRvCisgICAgICAgICAgICAgICAgICAgIGxhc3RfaWQrKzsKKyAgICAgICAgICAgICAgICB3aGlsZSAoKGxhc3RfaWQgPT0gMCkgfHwgKGZpbmRfaWQobGFzdF9pZCkpKTsKKyAgICAgICAgICAgICAgICB0bXAtPmlkID0gbGFzdF9pZDsKKyAgICAgICAgICAgICAgICBkbGxvYWQgPSB0bXA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdG1wLT5pZDsKKyAgICAgICAgY2FzZSBFUlJPUl9GSUxFX05PVF9GT1VORDoKKyAgICAgICAgY2FzZSBFUlJPUl9QQVRIX05PVF9GT1VORDoKKyAgICAgICAgICAgIGVycnR4dCA9ICJtb2R1bGUgYCVzJyBub3QgZm91bmQiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRVJST1JfVE9PX01BTllfT1BFTl9GSUxFUzoKKyAgICAgICAgY2FzZSBFUlJPUl9OT1RfRU5PVUdIX01FTU9SWToKKyAgICAgICAgY2FzZSBFUlJPUl9TSEFSSU5HX0JVRkZFUl9FWENFRURFRDoKIG5vbWVtOgotCQkJZXJydHh0ID0gIm91dCBvZiBzeXN0ZW0gcmVzb3VyY2VzIjsKLQkJCWJyZWFrOwotCQljYXNlIEVSUk9SX0FDQ0VTU19ERU5JRUQ6Ci0JCQllcnJ0eHQgPSAiYWNjZXNzIGRlbmllZCI7Ci0JCQlicmVhazsKLQkJY2FzZSBFUlJPUl9CQURfRk9STUFUOgotCQljYXNlIEVSUk9SX0lOVkFMSURfU0VHTUVOVF9OVU1CRVI6Ci0JCWNhc2UgRVJST1JfSU5WQUxJRF9PUkRJTkFMOgotCQljYXNlIEVSUk9SX0lOVkFMSURfTU9EVUxFVFlQRToKLQkJY2FzZSBFUlJPUl9JTlZBTElEX0VYRV9TSUdOQVRVUkU6Ci0JCWNhc2UgRVJST1JfRVhFX01BUktFRF9JTlZBTElEOgotCQljYXNlIEVSUk9SX0lURVJBVEVEX0RBVEFfRVhDRUVEU182NEs6Ci0JCWNhc2UgRVJST1JfSU5WQUxJRF9NSU5BTExPQ1NJWkU6Ci0JCWNhc2UgRVJST1JfSU5WQUxJRF9TRUdEUEw6Ci0JCWNhc2UgRVJST1JfQVVUT0RBVEFTRUdfRVhDRUVEU182NEs6Ci0JCWNhc2UgRVJST1JfUkVMT0NTUkNfQ0hBSU5fRVhDRUVEU19TRUdMSU1JVDoKLQkJCWVycnR4dCA9ICJpbnZhbGlkIG1vZHVsZSBmb3JtYXQiOwotCQkJYnJlYWs7Ci0JCWNhc2UgRVJST1JfSU5WQUxJRF9OQU1FOgotCQkJZXJydHh0ID0gImZpbGVuYW1lIGRvZXNuJ3QgbWF0Y2ggbW9kdWxlIG5hbWUiOwotCQkJYnJlYWs7Ci0JCWNhc2UgRVJST1JfU0hBUklOR19WSU9MQVRJT046Ci0JCWNhc2UgRVJST1JfTE9DS19WSU9MQVRJT046Ci0JCQllcnJ0eHQgPSAic2hhcmluZyB2aW9sYXRpb24iOwotCQkJYnJlYWs7Ci0JCWNhc2UgRVJST1JfSU5JVF9ST1VUSU5FX0ZBSUxFRDoKLQkJCWVycnR4dCA9ICJtb2R1bGUgaW5pdGlhbGl6YXRpb24gZmFpbGVkIjsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJZXJydHh0ID0gImNhdXNlIGAlcycsIGVycm9yIGNvZGUgPSAlZCI7Ci0JCQlicmVhazsKLQl9Ci0Jc25wcmludGYoZGxlcnIsIHNpemVvZihkbGVyciksIGVycnR4dCwgJmVyciwgcmMpOwotCWlmICh0bXApCi0JewotCQlpZiAodG1wLT5uYW1lKQotCQkJZnJlZSh0bXAtPm5hbWUpOwotCQlmcmVlKHRtcCk7Ci0JfQotCXJldHVybiAwOworICAgICAgICAgICAgZXJydHh0ID0gIm91dCBvZiBzeXN0ZW0gcmVzb3VyY2VzIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVSUk9SX0FDQ0VTU19ERU5JRUQ6CisgICAgICAgICAgICBlcnJ0eHQgPSAiYWNjZXNzIGRlbmllZCI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFUlJPUl9CQURfRk9STUFUOgorICAgICAgICBjYXNlIEVSUk9SX0lOVkFMSURfU0VHTUVOVF9OVU1CRVI6CisgICAgICAgIGNhc2UgRVJST1JfSU5WQUxJRF9PUkRJTkFMOgorICAgICAgICBjYXNlIEVSUk9SX0lOVkFMSURfTU9EVUxFVFlQRToKKyAgICAgICAgY2FzZSBFUlJPUl9JTlZBTElEX0VYRV9TSUdOQVRVUkU6CisgICAgICAgIGNhc2UgRVJST1JfRVhFX01BUktFRF9JTlZBTElEOgorICAgICAgICBjYXNlIEVSUk9SX0lURVJBVEVEX0RBVEFfRVhDRUVEU182NEs6CisgICAgICAgIGNhc2UgRVJST1JfSU5WQUxJRF9NSU5BTExPQ1NJWkU6CisgICAgICAgIGNhc2UgRVJST1JfSU5WQUxJRF9TRUdEUEw6CisgICAgICAgIGNhc2UgRVJST1JfQVVUT0RBVEFTRUdfRVhDRUVEU182NEs6CisgICAgICAgIGNhc2UgRVJST1JfUkVMT0NTUkNfQ0hBSU5fRVhDRUVEU19TRUdMSU1JVDoKKyAgICAgICAgICAgIGVycnR4dCA9ICJpbnZhbGlkIG1vZHVsZSBmb3JtYXQiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRVJST1JfSU5WQUxJRF9OQU1FOgorICAgICAgICAgICAgZXJydHh0ID0gImZpbGVuYW1lIGRvZXNuJ3QgbWF0Y2ggbW9kdWxlIG5hbWUiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRVJST1JfU0hBUklOR19WSU9MQVRJT046CisgICAgICAgIGNhc2UgRVJST1JfTE9DS19WSU9MQVRJT046CisgICAgICAgICAgICBlcnJ0eHQgPSAic2hhcmluZyB2aW9sYXRpb24iOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRVJST1JfSU5JVF9ST1VUSU5FX0ZBSUxFRDoKKyAgICAgICAgICAgIGVycnR4dCA9ICJtb2R1bGUgaW5pdGlhbGl6YXRpb24gZmFpbGVkIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZXJydHh0ID0gImNhdXNlIGAlcycsIGVycm9yIGNvZGUgPSAlZCI7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgc25wcmludGYoZGxlcnIsIHNpemVvZihkbGVyciksIGVycnR4dCwgJmVyciwgcmMpOworICAgIGlmICh0bXApCisgICAgeworICAgICAgICBpZiAodG1wLT5uYW1lKQorICAgICAgICAgICAgZnJlZSh0bXAtPm5hbWUpOworICAgICAgICBmcmVlKHRtcCk7CisgICAgfQorICAgIHJldHVybiAwOwogfQogCiAvKiByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBgc3ltYm9sJyBpbiBETEwgKi8KIHZvaWQgKmRsc3ltKHZvaWQgKmhhbmRsZSwgY2hhciAqc3ltYm9sKQogewotCWludCByYyA9IDA7Ci0JUEZOIGFkZHI7Ci0JY2hhciAqZXJydHh0OwotCWludCBzeW1vcmQgPSAwOwotCURMTGNoYWluIHRtcCA9IGZpbmRfaWQoaGFuZGxlKTsKKyAgICBpbnQgcmMgPSAwOworICAgIFBGTiBhZGRyOworICAgIGNoYXIgKmVycnR4dDsKKyAgICBpbnQgc3ltb3JkID0gMDsKKyAgICBETExjaGFpbiB0bXAgPSBmaW5kX2lkKGhhbmRsZSk7CiAKLQlpZiAoIXRtcCkKLQkJZ290byBpbnZfaGFuZGxlOworICAgIGlmICghdG1wKQorICAgICAgICBnb3RvIGludl9oYW5kbGU7CiAKLQlpZiAoKnN5bWJvbCA9PSAnIycpCi0JCXN5bW9yZCA9IGF0b2koc3ltYm9sICsgMSk7CisgICAgaWYgKCpzeW1ib2wgPT0gJyMnKQorICAgICAgICBzeW1vcmQgPSBhdG9pKHN5bWJvbCArIDEpOwogCi0Jc3dpdGNoIChyYyA9IERvc1F1ZXJ5UHJvY0FkZHIodG1wLT5oYW5kbGUsIHN5bW9yZCwgc3ltYm9sLCAmYWRkcikpCi0JewotCQljYXNlIE5PX0VSUk9SOgotCQkJcmV0dXJuICh2b2lkICopYWRkcjsKLQkJY2FzZSBFUlJPUl9JTlZBTElEX0hBTkRMRToKKyAgICBzd2l0Y2ggKHJjID0gRG9zUXVlcnlQcm9jQWRkcih0bXAtPmhhbmRsZSwgc3ltb3JkLCBzeW1ib2wsICZhZGRyKSkKKyAgICB7CisgICAgICAgIGNhc2UgTk9fRVJST1I6CisgICAgICAgICAgICByZXR1cm4gKHZvaWQgKilhZGRyOworICAgICAgICBjYXNlIEVSUk9SX0lOVkFMSURfSEFORExFOgogaW52X2hhbmRsZToKLQkJCWVycnR4dCA9ICJpbnZhbGlkIG1vZHVsZSBoYW5kbGUiOwotCQkJYnJlYWs7Ci0JCWNhc2UgRVJST1JfUFJPQ19OT1RfRk9VTkQ6Ci0JCWNhc2UgRVJST1JfSU5WQUxJRF9OQU1FOgotCQkJZXJydHh0ID0gIm5vIHN5bWJvbCBgJXMnIGluIG1vZHVsZSI7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWVycnR4dCA9ICJzeW1ib2wgYCVzJywgZXJyb3IgY29kZSA9ICVkIjsKLQkJCWJyZWFrOwotCX0KLQlzbnByaW50ZihkbGVyciwgc2l6ZW9mKGRsZXJyKSwgZXJydHh0LCBzeW1ib2wsIHJjKTsKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIGVycnR4dCA9ICJpbnZhbGlkIG1vZHVsZSBoYW5kbGUiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRVJST1JfUFJPQ19OT1RfRk9VTkQ6CisgICAgICAgIGNhc2UgRVJST1JfSU5WQUxJRF9OQU1FOgorICAgICAgICAgICAgZXJydHh0ID0gIm5vIHN5bWJvbCBgJXMnIGluIG1vZHVsZSI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGVycnR4dCA9ICJzeW1ib2wgYCVzJywgZXJyb3IgY29kZSA9ICVkIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBzbnByaW50ZihkbGVyciwgc2l6ZW9mKGRsZXJyKSwgZXJydHh0LCBzeW1ib2wsIHJjKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogLyogZnJlZSBkeW5hbWljYWx5LWxpbmtlZCBsaWJyYXJ5ICovCiBpbnQgZGxjbG9zZSh2b2lkICpoYW5kbGUpCiB7Ci0JaW50IHJjOwotCURMTGNoYWluIHRtcCA9IGZpbmRfaWQoaGFuZGxlKTsKKyAgICBpbnQgcmM7CisgICAgRExMY2hhaW4gdG1wID0gZmluZF9pZChoYW5kbGUpOwogCi0JaWYgKCF0bXApCi0JCWdvdG8gaW52X2hhbmRsZTsKKyAgICBpZiAoIXRtcCkKKyAgICAgICAgZ290byBpbnZfaGFuZGxlOwogCi0Jc3dpdGNoIChyYyA9IERvc0ZyZWVNb2R1bGUodG1wLT5oYW5kbGUpKQotCXsKLQkJY2FzZSBOT19FUlJPUjoKLQkJCWZyZWUodG1wLT5uYW1lKTsKLQkJCWRsbG9hZCA9IHRtcC0+bmV4dDsKLQkJCWZyZWUodG1wKTsKLQkJCXJldHVybiAwOwotCQljYXNlIEVSUk9SX0lOVkFMSURfSEFORExFOgorICAgIHN3aXRjaCAocmMgPSBEb3NGcmVlTW9kdWxlKHRtcC0+aGFuZGxlKSkKKyAgICB7CisgICAgICAgIGNhc2UgTk9fRVJST1I6CisgICAgICAgICAgICBmcmVlKHRtcC0+bmFtZSk7CisgICAgICAgICAgICBkbGxvYWQgPSB0bXAtPm5leHQ7CisgICAgICAgICAgICBmcmVlKHRtcCk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgY2FzZSBFUlJPUl9JTlZBTElEX0hBTkRMRToKIGludl9oYW5kbGU6Ci0JCQlzdHJjcHkoZGxlcnIsICJpbnZhbGlkIG1vZHVsZSBoYW5kbGUiKTsKLQkJCXJldHVybiAtMTsKLQkJY2FzZSBFUlJPUl9JTlZBTElEX0FDQ0VTUzoKLQkJCXN0cmNweShkbGVyciwgImFjY2VzcyBkZW5pZWQiKTsKLQkJCXJldHVybiAtMTsKLQkJZGVmYXVsdDoKLQkJCXJldHVybiAtMTsKLQl9CisgICAgICAgICAgICBzdHJjcHkoZGxlcnIsICJpbnZhbGlkIG1vZHVsZSBoYW5kbGUiKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgY2FzZSBFUlJPUl9JTlZBTElEX0FDQ0VTUzoKKyAgICAgICAgICAgIHN0cmNweShkbGVyciwgImFjY2VzcyBkZW5pZWQiKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiB9CiAKIC8qIHJldHVybiBhIHN0cmluZyBkZXNjcmliaW5nIGxhc3Qgb2NjdXJyZWQgZGwgZXJyb3IgKi8KIGNoYXIgKmRsZXJyb3IoKQogewotCXJldHVybiBkbGVycjsKKyAgICByZXR1cm4gZGxlcnI7CiB9CmRpZmYgLS1naXQgYS9QQy9vczJlbXgvZGxsZW50cnkuYyBiL1BDL29zMmVteC9kbGxlbnRyeS5jCmluZGV4IGRiZjljOTguLjljY2NhMWMgMTAwNjQ0Ci0tLSBhL1BDL29zMmVteC9kbGxlbnRyeS5jCisrKyBiL1BDL29zMmVteC9kbGxlbnRyeS5jCkBAIC00LDcgKzQsNyBAQAogCiAjZGVmaW5lIE5VTEwgMAogCi0jZGVmaW5lIFJFRihzKQlleHRlcm4gdm9pZCBzKCk7IHZvaWQgKl9fX19yZWZfIyNzID0gJnM7CisjZGVmaW5lIFJFRihzKSAgZXh0ZXJuIHZvaWQgcygpOyB2b2lkICpfX19fcmVmXyMjcyA9ICZzOwogCiAvKiBNYWtlIHJlZmVyZW5jZXMgdG8gaW1wb3J0ZWQgc3ltYm9scyB0byBwdWxsIHRoZW0gZnJvbSBzdGF0aWMgbGlicmFyeSAqLwogUkVGKFB5X01haW4pOwpAQCAtMTgsMjUgKzE4LDI1IEBACiAKIHVuc2lnbmVkIGxvbmcgX0RMTF9Jbml0VGVybSh1bnNpZ25lZCBsb25nIG1vZF9oYW5kbGUsIHVuc2lnbmVkIGxvbmcgZmxhZykKIHsKLQlzd2l0Y2ggKGZsYWcpCi0JewotCQljYXNlIDA6Ci0JCQlpZiAoX0NSVF9pbml0KCkpCi0JCQkJcmV0dXJuIDA7Ci0JCQlfX2N0b3JkdG9ySW5pdCgpOworICAgIHN3aXRjaCAoZmxhZykKKyAgICB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIGlmIChfQ1JUX2luaXQoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIF9fY3RvcmR0b3JJbml0KCk7CiAKLQkJCS8qIElnbm9yZSBmYXRhbCBzaWduYWxzICovCi0JCQlzaWduYWwoU0lHU0VHViwgU0lHX0lHTik7Ci0JCQlzaWduYWwoU0lHRlBFLCBTSUdfSUdOKTsKKyAgICAgICAgICAgIC8qIElnbm9yZSBmYXRhbCBzaWduYWxzICovCisgICAgICAgICAgICBzaWduYWwoU0lHU0VHViwgU0lHX0lHTik7CisgICAgICAgICAgICBzaWduYWwoU0lHRlBFLCBTSUdfSUdOKTsKIAotCQkJcmV0dXJuIDE7CisgICAgICAgICAgICByZXR1cm4gMTsKIAotCQljYXNlIDE6Ci0JCQlfX2N0b3JkdG9yVGVybSgpOwotCQkJX0NSVF90ZXJtKCk7Ci0JCQlyZXR1cm4gMTsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgX19jdG9yZHRvclRlcm0oKTsKKyAgICAgICAgICAgIF9DUlRfdGVybSgpOworICAgICAgICAgICAgcmV0dXJuIDE7CiAKLQkJZGVmYXVsdDoKLQkJCXJldHVybiAwOwotCX0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL1BDL29zMmVteC9nZXRwYXRocC5jIGIvUEMvb3MyZW14L2dldHBhdGhwLmMKaW5kZXggNTgzOWVhYi4uNGZhYTUwNSAxMDA2NDQKLS0tIGEvUEMvb3MyZW14L2dldHBhdGhwLmMKKysrIGIvUEMvb3MyZW14L2dldHBhdGhwLmMKQEAgLTQsOCArNCw4IEBACiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFBBVEggUlVMRVMgRk9SIE9TLzIrRU1YOgotICAgVGhpcyBkZXNjcmliZXMgaG93IHN5cy5wYXRoIGlzIGZvcm1lZCBvbiBPUy8yK0VNWC4gIEl0IGRlc2NyaWJlcyB0aGUgCi0gICBmdW5jdGlvbmFsaXR5LCBub3QgdGhlIGltcGxlbWVudGF0aW9uIChpZSwgdGhlIG9yZGVyIGluIHdoaWNoIHRoZXNlIAorICAgVGhpcyBkZXNjcmliZXMgaG93IHN5cy5wYXRoIGlzIGZvcm1lZCBvbiBPUy8yK0VNWC4gIEl0IGRlc2NyaWJlcyB0aGUKKyAgIGZ1bmN0aW9uYWxpdHksIG5vdCB0aGUgaW1wbGVtZW50YXRpb24gKGllLCB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlc2UKICAgIGFyZSBhY3R1YWxseSBmZXRjaGVkIGlzIGRpZmZlcmVudCkKIAogICAgKiBQeXRob24gYWx3YXlzIGFkZHMgYW4gZW1wdHkgZW50cnkgYXQgdGhlIHN0YXJ0LCB3aGljaCBjb3JyZXNwb25kcwpAQCAtMTYsMTAgKzE2LDEwIEBACiAgICAqIFdlIGF0dGVtcHQgdG8gbG9jYXRlIHRoZSAiUHl0aG9uIEhvbWUiIC0gaWYgdGhlIFBZVEhPTkhPTUUgZW52IHZhcgogICAgICBpcyBzZXQsIHdlIGJlbGlldmUgaXQuICBPdGhlcndpc2UsIHdlIHVzZSB0aGUgcGF0aCBvZiBvdXIgaG9zdCAuRVhFJ3MKICAgICAgdG8gdHJ5IGFuZCBsb2NhdGUgb3VyICJsYW5kbWFyayIgKGxpYlxcb3MucHkpIGFuZCBkZWR1Y2Ugb3VyIGhvbWUuCi0gICAgIC0gSWYgd2UgRE8gaGF2ZSBhIFB5dGhvbiBIb21lOiBUaGUgcmVsZXZhbnQgc3ViLWRpcmVjdG9yaWVzIChMaWIsIAorICAgICAtIElmIHdlIERPIGhhdmUgYSBQeXRob24gSG9tZTogVGhlIHJlbGV2YW50IHN1Yi1kaXJlY3RvcmllcyAoTGliLAogICAgICAgIHBsYXQtd2luLCBsaWItdGssIGV0YykgYXJlIGJhc2VkIG9uIHRoZSBQeXRob24gSG9tZQogICAgICAtIElmIHdlIERPIE5PVCBoYXZlIGEgUHl0aG9uIEhvbWUsIHRoZSBjb3JlIFB5dGhvbiBQYXRoIGlzCi0gICAgICAgbG9hZGVkIGZyb20gdGhlIHJlZ2lzdHJ5LiAgVGhpcyBpcyB0aGUgbWFpbiBQeXRob25QYXRoIGtleSwgCisgICAgICAgbG9hZGVkIGZyb20gdGhlIHJlZ2lzdHJ5LiAgVGhpcyBpcyB0aGUgbWFpbiBQeXRob25QYXRoIGtleSwKICAgICAgICBhbmQgYm90aCBIS0xNIGFuZCBIS0NVIGFyZSBjb21iaW5lZCB0byBmb3JtIHRoZSBwYXRoKQogCiAgICAqIElmZiAtIHdlIGNhbiBub3QgbG9jYXRlIHRoZSBQeXRob24gSG9tZSwgYW5kIGhhdmUgbm90IGhhZCBhIFBZVEhPTlBBVEgKQEAgLTMyLDkgKzMyLDkgQEAKICAgICAoZWl0aGVyIGFuIGluc3RhbGxlZCB2ZXJzaW9uLCBvciBkaXJlY3RseSBmcm9tIHRoZSBQQ2J1aWxkIGRpcmVjdG9yeSksCiAgICAgdGhlIGNvcmUgcGF0aCBpcyBkZWR1Y2VkLgogCi0gICogV2hlbiBQeXRob24gaXMgaG9zdGVkIGluIGFub3RoZXIgZXhlIChkaWZmZXJlbnQgZGlyZWN0b3J5LCBlbWJlZGRlZCB2aWEgCisgICogV2hlbiBQeXRob24gaXMgaG9zdGVkIGluIGFub3RoZXIgZXhlIChkaWZmZXJlbnQgZGlyZWN0b3J5LCBlbWJlZGRlZCB2aWEKICAgICBDT00sIGV0YyksIHRoZSBQeXRob24gSG9tZSB3aWxsIG5vdCBiZSBkZWR1Y2VkLCBzbyB0aGUgY29yZSBwYXRoIGZyb20KLSAgICB0aGUgcmVnaXN0cnkgaXMgdXNlZC4gIE90aGVyICJhcHBsaWNhdGlvbiBwYXRocyAiaW4gdGhlIHJlZ2lzdHJ5IGFyZSAKKyAgICB0aGUgcmVnaXN0cnkgaXMgdXNlZC4gIE90aGVyICJhcHBsaWNhdGlvbiBwYXRocyAiaW4gdGhlIHJlZ2lzdHJ5IGFyZQogICAgIGFsd2F5cyByZWFkLgogCiAgICogSWYgUHl0aG9uIGNhbid0IGZpbmQgaXRzIGhvbWUgYW5kIHRoZXJlIGlzIG5vIHJlZ2lzdHJ5IChlZywgZnJvemVuCkBAIC04NSwxMiArODUsMTIgQEAKIAogCiBzdGF0aWMgaW50Ci1pc19zZXAoY2hhciBjaCkJLyogZGV0ZXJtaW5lIGlmICJjaCIgaXMgYSBzZXBhcmF0b3IgY2hhcmFjdGVyICovCitpc19zZXAoY2hhciBjaCkgLyogZGV0ZXJtaW5lIGlmICJjaCIgaXMgYSBzZXBhcmF0b3IgY2hhcmFjdGVyICovCiB7CiAjaWZkZWYgQUxUU0VQCi0JcmV0dXJuIGNoID09IFNFUCB8fCBjaCA9PSBBTFRTRVA7CisgICAgcmV0dXJuIGNoID09IFNFUCB8fCBjaCA9PSBBTFRTRVA7CiAjZWxzZQotCXJldHVybiBjaCA9PSBTRVA7CisgICAgcmV0dXJuIGNoID09IFNFUDsKICNlbmRpZgogfQogCkBAIC0xMDAsMzYgKzEwMCwzNiBAQAogc3RhdGljIHZvaWQKIHJlZHVjZShjaGFyICpkaXIpCiB7Ci0Jc2l6ZV90IGkgPSBzdHJsZW4oZGlyKTsKLQl3aGlsZSAoaSA+IDAgJiYgIWlzX3NlcChkaXJbaV0pKQotCQktLWk7Ci0JZGlyW2ldID0gJ1wwJzsKKyAgICBzaXplX3QgaSA9IHN0cmxlbihkaXIpOworICAgIHdoaWxlIChpID4gMCAmJiAhaXNfc2VwKGRpcltpXSkpCisgICAgICAgIC0taTsKKyAgICBkaXJbaV0gPSAnXDAnOwogfQotCQorCiBzdGF0aWMgaW50CiBleGlzdHMoY2hhciAqZmlsZW5hbWUpCiB7Ci0Jc3RydWN0IHN0YXQgYnVmOwotCXJldHVybiBzdGF0KGZpbGVuYW1lLCAmYnVmKSA9PSAwOworICAgIHN0cnVjdCBzdGF0IGJ1ZjsKKyAgICByZXR1cm4gc3RhdChmaWxlbmFtZSwgJmJ1ZikgPT0gMDsKIH0KIAogLyogSXMgbW9kdWxlICAoY2hlY2sgZm9yIC5weWMvLnB5byB0b28pCi0gKiBBc3N1bWVzICdmaWxlbmFtZScgTUFYUEFUSExFTisxIGJ5dGVzIGxvbmcgLSAKKyAqIEFzc3VtZXMgJ2ZpbGVuYW1lJyBNQVhQQVRITEVOKzEgYnl0ZXMgbG9uZyAtCiAgKiBtYXkgZXh0ZW5kICdmaWxlbmFtZScgYnkgb25lIGNoYXJhY3Rlci4KICAqLwogc3RhdGljIGludAogaXNtb2R1bGUoY2hhciAqZmlsZW5hbWUpCiB7Ci0JaWYgKGV4aXN0cyhmaWxlbmFtZSkpCi0JCXJldHVybiAxOworICAgIGlmIChleGlzdHMoZmlsZW5hbWUpKQorICAgICAgICByZXR1cm4gMTsKIAotCS8qIENoZWNrIGZvciB0aGUgY29tcGlsZWQgdmVyc2lvbiBvZiBwcmVmaXguICovCi0JaWYgKHN0cmxlbihmaWxlbmFtZSkgPCBNQVhQQVRITEVOKSB7Ci0JCXN0cmNhdChmaWxlbmFtZSwgUHlfT3B0aW1pemVGbGFnID8gIm8iIDogImMiKTsKLQkJaWYgKGV4aXN0cyhmaWxlbmFtZSkpCi0JCQlyZXR1cm4gMTsKLQl9Ci0JcmV0dXJuIDA7CisgICAgLyogQ2hlY2sgZm9yIHRoZSBjb21waWxlZCB2ZXJzaW9uIG9mIHByZWZpeC4gKi8KKyAgICBpZiAoc3RybGVuKGZpbGVuYW1lKSA8IE1BWFBBVEhMRU4pIHsKKyAgICAgICAgc3RyY2F0KGZpbGVuYW1lLCBQeV9PcHRpbWl6ZUZsYWcgPyAibyIgOiAiYyIpOworICAgICAgICBpZiAoZXhpc3RzKGZpbGVuYW1lKSkKKyAgICAgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogLyogQWRkIGEgcGF0aCBjb21wb25lbnQsIGJ5IGFwcGVuZGluZyBzdHVmZiB0byBidWZmZXIuCkBAIC0xNDUsMjEgKzE0NSwyMSBAQAogc3RhdGljIHZvaWQKIGpvaW4oY2hhciAqYnVmZmVyLCBjaGFyICpzdHVmZikKIHsKLQlzaXplX3QgbiwgazsKLQlpZiAoaXNfc2VwKHN0dWZmWzBdKSkKLQkJbiA9IDA7Ci0JZWxzZSB7Ci0JCW4gPSBzdHJsZW4oYnVmZmVyKTsKLQkJaWYgKG4gPiAwICYmICFpc19zZXAoYnVmZmVyW24tMV0pICYmIG4gPCBNQVhQQVRITEVOKQotCQkJYnVmZmVyW24rK10gPSBTRVA7Ci0JfQotCWlmIChuID4gTUFYUEFUSExFTikKLQkJUHlfRmF0YWxFcnJvcigiYnVmZmVyIG92ZXJmbG93IGluIGdldHBhdGhwLmMncyBqb2lucGF0aCgpIik7Ci0JayA9IHN0cmxlbihzdHVmZik7Ci0JaWYgKG4gKyBrID4gTUFYUEFUSExFTikKLQkJayA9IE1BWFBBVEhMRU4gLSBuOwotCXN0cm5jcHkoYnVmZmVyK24sIHN0dWZmLCBrKTsKLQlidWZmZXJbbitrXSA9ICdcMCc7CisgICAgc2l6ZV90IG4sIGs7CisgICAgaWYgKGlzX3NlcChzdHVmZlswXSkpCisgICAgICAgIG4gPSAwOworICAgIGVsc2UgeworICAgICAgICBuID0gc3RybGVuKGJ1ZmZlcik7CisgICAgICAgIGlmIChuID4gMCAmJiAhaXNfc2VwKGJ1ZmZlcltuLTFdKSAmJiBuIDwgTUFYUEFUSExFTikKKyAgICAgICAgICAgIGJ1ZmZlcltuKytdID0gU0VQOworICAgIH0KKyAgICBpZiAobiA+IE1BWFBBVEhMRU4pCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoImJ1ZmZlciBvdmVyZmxvdyBpbiBnZXRwYXRocC5jJ3Mgam9pbnBhdGgoKSIpOworICAgIGsgPSBzdHJsZW4oc3R1ZmYpOworICAgIGlmIChuICsgayA+IE1BWFBBVEhMRU4pCisgICAgICAgIGsgPSBNQVhQQVRITEVOIC0gbjsKKyAgICBzdHJuY3B5KGJ1ZmZlcituLCBzdHVmZiwgayk7CisgICAgYnVmZmVyW24ra10gPSAnXDAnOwogfQogCiAvKiBnb3RsYW5kbWFyayBvbmx5IGNhbGxlZCBieSBzZWFyY2hfZm9yX3ByZWZpeCwgd2hpY2ggZW5zdXJlcwpAQCAtMTY5LDIxOSArMTY5LDIxOSBAQAogc3RhdGljIGludAogZ290bGFuZG1hcmsoY2hhciAqbGFuZG1hcmspCiB7Ci0JaW50IG4sIG9rOworICAgIGludCBuLCBvazsKIAotCW4gPSBzdHJsZW4ocHJlZml4KTsKLQlqb2luKHByZWZpeCwgbGFuZG1hcmspOwotCW9rID0gaXNtb2R1bGUocHJlZml4KTsKLQlwcmVmaXhbbl0gPSAnXDAnOwotCXJldHVybiBvazsKKyAgICBuID0gc3RybGVuKHByZWZpeCk7CisgICAgam9pbihwcmVmaXgsIGxhbmRtYXJrKTsKKyAgICBvayA9IGlzbW9kdWxlKHByZWZpeCk7CisgICAgcHJlZml4W25dID0gJ1wwJzsKKyAgICByZXR1cm4gb2s7CiB9CiAKLS8qIGFzc3VtZXMgYXJndjBfcGF0aCBpcyBNQVhQQVRITEVOKzEgYnl0ZXMgbG9uZywgYWxyZWFkeSBcMCB0ZXJtJ2QuIAorLyogYXNzdW1lcyBhcmd2MF9wYXRoIGlzIE1BWFBBVEhMRU4rMSBieXRlcyBsb25nLCBhbHJlYWR5IFwwIHRlcm0nZC4KICAqIGFzc3VtcHRpb24gcHJvdmlkZWQgYnkgb25seSBjYWxsZXIsIGNhbGN1bGF0ZV9wYXRoKCkKICAqLwogc3RhdGljIGludAogc2VhcmNoX2Zvcl9wcmVmaXgoY2hhciAqYXJndjBfcGF0aCwgY2hhciAqbGFuZG1hcmspCiB7Ci0JLyogU2VhcmNoIGZyb20gYXJndjBfcGF0aCwgdW50aWwgbGFuZG1hcmsgaXMgZm91bmQgKi8KLQlzdHJjcHkocHJlZml4LCBhcmd2MF9wYXRoKTsKLQlkbyB7Ci0JCWlmIChnb3RsYW5kbWFyayhsYW5kbWFyaykpCi0JCQlyZXR1cm4gMTsKLQkJcmVkdWNlKHByZWZpeCk7Ci0JfSB3aGlsZSAocHJlZml4WzBdKTsKLQlyZXR1cm4gMDsKKyAgICAvKiBTZWFyY2ggZnJvbSBhcmd2MF9wYXRoLCB1bnRpbCBsYW5kbWFyayBpcyBmb3VuZCAqLworICAgIHN0cmNweShwcmVmaXgsIGFyZ3YwX3BhdGgpOworICAgIGRvIHsKKyAgICAgICAgaWYgKGdvdGxhbmRtYXJrKGxhbmRtYXJrKSkKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICByZWR1Y2UocHJlZml4KTsKKyAgICB9IHdoaWxlIChwcmVmaXhbMF0pOworICAgIHJldHVybiAwOwogfQogCiAKIHN0YXRpYyB2b2lkCiBnZXRfcHJvZ3BhdGgodm9pZCkKIHsKLQlleHRlcm4gY2hhciAqUHlfR2V0UHJvZ3JhbU5hbWUodm9pZCk7Ci0JY2hhciAqcGF0aCA9IGdldGVudigiUEFUSCIpOwotCWNoYXIgKnByb2cgPSBQeV9HZXRQcm9ncmFtTmFtZSgpOworICAgIGV4dGVybiBjaGFyICpQeV9HZXRQcm9ncmFtTmFtZSh2b2lkKTsKKyAgICBjaGFyICpwYXRoID0gZ2V0ZW52KCJQQVRIIik7CisgICAgY2hhciAqcHJvZyA9IFB5X0dldFByb2dyYW1OYW1lKCk7CiAKLQlQUElCIHBpYjsKLQlpZiAoKERvc0dldEluZm9CbG9ja3MoTlVMTCwgJnBpYikgPT0gMCkgJiYKLQkgICAgKERvc1F1ZXJ5TW9kdWxlTmFtZShwaWItPnBpYl9obXRlLCBzaXplb2YocHJvZ3BhdGgpLCBwcm9ncGF0aCkgPT0gMCkpCi0JCXJldHVybjsKKyAgICBQUElCIHBpYjsKKyAgICBpZiAoKERvc0dldEluZm9CbG9ja3MoTlVMTCwgJnBpYikgPT0gMCkgJiYKKyAgICAgICAgKERvc1F1ZXJ5TW9kdWxlTmFtZShwaWItPnBpYl9obXRlLCBzaXplb2YocHJvZ3BhdGgpLCBwcm9ncGF0aCkgPT0gMCkpCisgICAgICAgIHJldHVybjsKIAotCWlmIChwcm9nID09IE5VTEwgfHwgKnByb2cgPT0gJ1wwJykKLQkJcHJvZyA9ICJweXRob24iOworICAgIGlmIChwcm9nID09IE5VTEwgfHwgKnByb2cgPT0gJ1wwJykKKyAgICAgICAgcHJvZyA9ICJweXRob24iOwogCi0JLyogSWYgdGhlcmUgaXMgbm8gc2xhc2ggaW4gdGhlIGFyZ3YwIHBhdGgsIHRoZW4gd2UgaGF2ZSB0bwotCSAqIGFzc3VtZSBweXRob24gaXMgb24gdGhlIHVzZXIncyAkUEFUSCwgc2luY2UgdGhlcmUncyBubwotCSAqIG90aGVyIHdheSB0byBmaW5kIGEgZGlyZWN0b3J5IHRvIHN0YXJ0IHRoZSBzZWFyY2ggZnJvbS4gIElmCi0JICogJFBBVEggaXNuJ3QgZXhwb3J0ZWQsIHlvdSBsb3NlLgotCSAqLworICAgIC8qIElmIHRoZXJlIGlzIG5vIHNsYXNoIGluIHRoZSBhcmd2MCBwYXRoLCB0aGVuIHdlIGhhdmUgdG8KKyAgICAgKiBhc3N1bWUgcHl0aG9uIGlzIG9uIHRoZSB1c2VyJ3MgJFBBVEgsIHNpbmNlIHRoZXJlJ3Mgbm8KKyAgICAgKiBvdGhlciB3YXkgdG8gZmluZCBhIGRpcmVjdG9yeSB0byBzdGFydCB0aGUgc2VhcmNoIGZyb20uICBJZgorICAgICAqICRQQVRIIGlzbid0IGV4cG9ydGVkLCB5b3UgbG9zZS4KKyAgICAgKi8KICNpZmRlZiBBTFRTRVAKLQlpZiAoc3RyY2hyKHByb2csIFNFUCkgfHwgc3RyY2hyKHByb2csIEFMVFNFUCkpCisgICAgaWYgKHN0cmNocihwcm9nLCBTRVApIHx8IHN0cmNocihwcm9nLCBBTFRTRVApKQogI2Vsc2UKLQlpZiAoc3RyY2hyKHByb2csIFNFUCkpCisgICAgaWYgKHN0cmNocihwcm9nLCBTRVApKQogI2VuZGlmCi0JCXN0cm5jcHkocHJvZ3BhdGgsIHByb2csIE1BWFBBVEhMRU4pOwotCWVsc2UgaWYgKHBhdGgpIHsKLQkJd2hpbGUgKDEpIHsKLQkJCWNoYXIgKmRlbGltID0gc3RyY2hyKHBhdGgsIERFTElNKTsKKyAgICAgICAgc3RybmNweShwcm9ncGF0aCwgcHJvZywgTUFYUEFUSExFTik7CisgICAgZWxzZSBpZiAocGF0aCkgeworICAgICAgICB3aGlsZSAoMSkgeworICAgICAgICAgICAgY2hhciAqZGVsaW0gPSBzdHJjaHIocGF0aCwgREVMSU0pOwogCi0JCQlpZiAoZGVsaW0pIHsKLQkJCQlzaXplX3QgbGVuID0gZGVsaW0gLSBwYXRoOwotCQkJCS8qIGVuc3VyZSB3ZSBjYW4ndCBvdmVyd3JpdGUgYnVmZmVyICovCisgICAgICAgICAgICBpZiAoZGVsaW0pIHsKKyAgICAgICAgICAgICAgICBzaXplX3QgbGVuID0gZGVsaW0gLSBwYXRoOworICAgICAgICAgICAgICAgIC8qIGVuc3VyZSB3ZSBjYW4ndCBvdmVyd3JpdGUgYnVmZmVyICovCiAjaWYgIWRlZmluZWQoUFlDQ19HQ0MpCi0JCQkJbGVuID0gbWluKE1BWFBBVEhMRU4sbGVuKTsKKyAgICAgICAgICAgICAgICBsZW4gPSBtaW4oTUFYUEFUSExFTixsZW4pOwogI2Vsc2UKLQkJCQlsZW4gPSBNQVhQQVRITEVOIDwgbGVuID8gTUFYUEFUSExFTiA6IGxlbjsKKyAgICAgICAgICAgICAgICBsZW4gPSBNQVhQQVRITEVOIDwgbGVuID8gTUFYUEFUSExFTiA6IGxlbjsKICNlbmRpZgotCQkJCXN0cm5jcHkocHJvZ3BhdGgsIHBhdGgsIGxlbik7Ci0JCQkJKihwcm9ncGF0aCArIGxlbikgPSAnXDAnOwotCQkJfQotCQkJZWxzZQotCQkJCXN0cm5jcHkocHJvZ3BhdGgsIHBhdGgsIE1BWFBBVEhMRU4pOworICAgICAgICAgICAgICAgIHN0cm5jcHkocHJvZ3BhdGgsIHBhdGgsIGxlbik7CisgICAgICAgICAgICAgICAgKihwcm9ncGF0aCArIGxlbikgPSAnXDAnOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHN0cm5jcHkocHJvZ3BhdGgsIHBhdGgsIE1BWFBBVEhMRU4pOwogCi0JCQkvKiBqb2luKCkgaXMgc2FmZSBmb3IgTUFYUEFUSExFTisxIHNpemUgYnVmZmVyICovCi0JCQlqb2luKHByb2dwYXRoLCBwcm9nKTsKLQkJCWlmIChleGlzdHMocHJvZ3BhdGgpKQotCQkJCWJyZWFrOworICAgICAgICAgICAgLyogam9pbigpIGlzIHNhZmUgZm9yIE1BWFBBVEhMRU4rMSBzaXplIGJ1ZmZlciAqLworICAgICAgICAgICAgam9pbihwcm9ncGF0aCwgcHJvZyk7CisgICAgICAgICAgICBpZiAoZXhpc3RzKHByb2dwYXRoKSkKKyAgICAgICAgICAgICAgICBicmVhazsKIAotCQkJaWYgKCFkZWxpbSkgewotCQkJCXByb2dwYXRoWzBdID0gJ1wwJzsKLQkJCQlicmVhazsKLQkJCX0KLQkJCXBhdGggPSBkZWxpbSArIDE7Ci0JCX0KLQl9Ci0JZWxzZQotCQlwcm9ncGF0aFswXSA9ICdcMCc7CisgICAgICAgICAgICBpZiAoIWRlbGltKSB7CisgICAgICAgICAgICAgICAgcHJvZ3BhdGhbMF0gPSAnXDAnOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGF0aCA9IGRlbGltICsgMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgICAgIHByb2dwYXRoWzBdID0gJ1wwJzsKIH0KIAogc3RhdGljIHZvaWQKIGNhbGN1bGF0ZV9wYXRoKHZvaWQpCiB7Ci0JY2hhciBhcmd2MF9wYXRoW01BWFBBVEhMRU4rMV07Ci0JY2hhciAqYnVmOwotCXNpemVfdCBidWZzejsKLQljaGFyICpweXRob25ob21lID0gUHlfR2V0UHl0aG9uSG9tZSgpOwotCWNoYXIgKmVudnBhdGggPSBnZXRlbnYoIlBZVEhPTlBBVEgiKTsKLQljaGFyIHppcF9wYXRoW01BWFBBVEhMRU4rMV07Ci0Jc2l6ZV90IGxlbjsKKyAgICBjaGFyIGFyZ3YwX3BhdGhbTUFYUEFUSExFTisxXTsKKyAgICBjaGFyICpidWY7CisgICAgc2l6ZV90IGJ1ZnN6OworICAgIGNoYXIgKnB5dGhvbmhvbWUgPSBQeV9HZXRQeXRob25Ib21lKCk7CisgICAgY2hhciAqZW52cGF0aCA9IGdldGVudigiUFlUSE9OUEFUSCIpOworICAgIGNoYXIgemlwX3BhdGhbTUFYUEFUSExFTisxXTsKKyAgICBzaXplX3QgbGVuOwogCi0JZ2V0X3Byb2dwYXRoKCk7Ci0JLyogcHJvZ3BhdGggZ3VhcmFudGVlZCBcMCB0ZXJtaW5hdGVkIGluIE1BWFBBVEgrMSBieXRlcy4gKi8KLQlzdHJjcHkoYXJndjBfcGF0aCwgcHJvZ3BhdGgpOwotCXJlZHVjZShhcmd2MF9wYXRoKTsKLQlpZiAocHl0aG9uaG9tZSA9PSBOVUxMIHx8ICpweXRob25ob21lID09ICdcMCcpIHsKLQkJaWYgKHNlYXJjaF9mb3JfcHJlZml4KGFyZ3YwX3BhdGgsIExBTkRNQVJLKSkKLQkJCXB5dGhvbmhvbWUgPSBwcmVmaXg7Ci0JCWVsc2UKLQkJCXB5dGhvbmhvbWUgPSBOVUxMOwotCX0KLQllbHNlCi0JCXN0cm5jcHkocHJlZml4LCBweXRob25ob21lLCBNQVhQQVRITEVOKTsKKyAgICBnZXRfcHJvZ3BhdGgoKTsKKyAgICAvKiBwcm9ncGF0aCBndWFyYW50ZWVkIFwwIHRlcm1pbmF0ZWQgaW4gTUFYUEFUSCsxIGJ5dGVzLiAqLworICAgIHN0cmNweShhcmd2MF9wYXRoLCBwcm9ncGF0aCk7CisgICAgcmVkdWNlKGFyZ3YwX3BhdGgpOworICAgIGlmIChweXRob25ob21lID09IE5VTEwgfHwgKnB5dGhvbmhvbWUgPT0gJ1wwJykgeworICAgICAgICBpZiAoc2VhcmNoX2Zvcl9wcmVmaXgoYXJndjBfcGF0aCwgTEFORE1BUkspKQorICAgICAgICAgICAgcHl0aG9uaG9tZSA9IHByZWZpeDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcHl0aG9uaG9tZSA9IE5VTEw7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgc3RybmNweShwcmVmaXgsIHB5dGhvbmhvbWUsIE1BWFBBVEhMRU4pOwogCi0JaWYgKGVudnBhdGggJiYgKmVudnBhdGggPT0gJ1wwJykKLQkJZW52cGF0aCA9IE5VTEw7CisgICAgaWYgKGVudnBhdGggJiYgKmVudnBhdGggPT0gJ1wwJykKKyAgICAgICAgZW52cGF0aCA9IE5VTEw7CiAKLQkvKiBDYWxjdWxhdGUgemlwIGFyY2hpdmUgcGF0aCAqLwotCXN0cm5jcHkoemlwX3BhdGgsIHByb2dwYXRoLCBNQVhQQVRITEVOKTsKLQl6aXBfcGF0aFtNQVhQQVRITEVOXSA9ICdcMCc7Ci0JbGVuID0gc3RybGVuKHppcF9wYXRoKTsKLQlpZiAobGVuID4gNCkgewotCQl6aXBfcGF0aFtsZW4tM10gPSAneic7ICAvKiBjaGFuZ2UgZW5kaW5nIHRvICJ6aXAiICovCi0JCXppcF9wYXRoW2xlbi0yXSA9ICdpJzsKLQkJemlwX3BhdGhbbGVuLTFdID0gJ3AnOwotCX0KLQllbHNlIHsKLQkJemlwX3BhdGhbMF0gPSAwOwotCX0KKyAgICAvKiBDYWxjdWxhdGUgemlwIGFyY2hpdmUgcGF0aCAqLworICAgIHN0cm5jcHkoemlwX3BhdGgsIHByb2dwYXRoLCBNQVhQQVRITEVOKTsKKyAgICB6aXBfcGF0aFtNQVhQQVRITEVOXSA9ICdcMCc7CisgICAgbGVuID0gc3RybGVuKHppcF9wYXRoKTsKKyAgICBpZiAobGVuID4gNCkgeworICAgICAgICB6aXBfcGF0aFtsZW4tM10gPSAneic7ICAvKiBjaGFuZ2UgZW5kaW5nIHRvICJ6aXAiICovCisgICAgICAgIHppcF9wYXRoW2xlbi0yXSA9ICdpJzsKKyAgICAgICAgemlwX3BhdGhbbGVuLTFdID0gJ3AnOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgemlwX3BhdGhbMF0gPSAwOworICAgIH0KIAotCS8qIFdlIG5lZWQgdG8gY29uc3RydWN0IGEgcGF0aCBmcm9tIHRoZSBmb2xsb3dpbmcgcGFydHMuCi0JICogKDEpIHRoZSBQWVRIT05QQVRIIGVudmlyb25tZW50IHZhcmlhYmxlLCBpZiBzZXQ7Ci0JICogKDIpIHRoZSB6aXAgYXJjaGl2ZSBmaWxlIHBhdGg7Ci0JICogKDMpIHRoZSBQWVRIT05QQVRIIGNvbmZpZyBtYWNybywgd2l0aCB0aGUgbGVhZGluZyAiLiIKLQkgKiAgICAgb2YgZWFjaCBjb21wb25lbnQgcmVwbGFjZWQgd2l0aCBweXRob25ob21lLCBpZiBzZXQ7Ci0JICogKDQpIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgZXhlY3V0YWJsZSAoYXJndjBfcGF0aCkuCi0JICogVGhlIGxlbmd0aCBjYWxjdWxhdGlvbiBjYWxjdWxhdGVzICMzIGZpcnN0LgotCSAqLworICAgIC8qIFdlIG5lZWQgdG8gY29uc3RydWN0IGEgcGF0aCBmcm9tIHRoZSBmb2xsb3dpbmcgcGFydHMuCisgICAgICogKDEpIHRoZSBQWVRIT05QQVRIIGVudmlyb25tZW50IHZhcmlhYmxlLCBpZiBzZXQ7CisgICAgICogKDIpIHRoZSB6aXAgYXJjaGl2ZSBmaWxlIHBhdGg7CisgICAgICogKDMpIHRoZSBQWVRIT05QQVRIIGNvbmZpZyBtYWNybywgd2l0aCB0aGUgbGVhZGluZyAiLiIKKyAgICAgKiAgICAgb2YgZWFjaCBjb21wb25lbnQgcmVwbGFjZWQgd2l0aCBweXRob25ob21lLCBpZiBzZXQ7CisgICAgICogKDQpIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgZXhlY3V0YWJsZSAoYXJndjBfcGF0aCkuCisgICAgICogVGhlIGxlbmd0aCBjYWxjdWxhdGlvbiBjYWxjdWxhdGVzICMzIGZpcnN0LgorICAgICAqLwogCi0JLyogQ2FsY3VsYXRlIHNpemUgb2YgcmV0dXJuIGJ1ZmZlciAqLwotCWlmIChweXRob25ob21lICE9IE5VTEwpIHsKLQkJY2hhciAqcDsKLQkJYnVmc3ogPSAxOwkKLQkJZm9yIChwID0gUFlUSE9OUEFUSDsgKnA7IHArKykgewotCQkJaWYgKCpwID09IERFTElNKQotCQkJCWJ1ZnN6Kys7IC8qIG51bWJlciBvZiBERUxJTSBwbHVzIG9uZSAqLwotCQl9Ci0JCWJ1ZnN6ICo9IHN0cmxlbihweXRob25ob21lKTsKLQl9Ci0JZWxzZQotCQlidWZzeiA9IDA7Ci0JYnVmc3ogKz0gc3RybGVuKFBZVEhPTlBBVEgpICsgMTsKLQlidWZzeiArPSBzdHJsZW4oYXJndjBfcGF0aCkgKyAxOwotCWJ1ZnN6ICs9IHN0cmxlbih6aXBfcGF0aCkgKyAxOwotCWlmIChlbnZwYXRoICE9IE5VTEwpCi0JCWJ1ZnN6ICs9IHN0cmxlbihlbnZwYXRoKSArIDE7CisgICAgLyogQ2FsY3VsYXRlIHNpemUgb2YgcmV0dXJuIGJ1ZmZlciAqLworICAgIGlmIChweXRob25ob21lICE9IE5VTEwpIHsKKyAgICAgICAgY2hhciAqcDsKKyAgICAgICAgYnVmc3ogPSAxOworICAgICAgICBmb3IgKHAgPSBQWVRIT05QQVRIOyAqcDsgcCsrKSB7CisgICAgICAgICAgICBpZiAoKnAgPT0gREVMSU0pCisgICAgICAgICAgICAgICAgYnVmc3orKzsgLyogbnVtYmVyIG9mIERFTElNIHBsdXMgb25lICovCisgICAgICAgIH0KKyAgICAgICAgYnVmc3ogKj0gc3RybGVuKHB5dGhvbmhvbWUpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIGJ1ZnN6ID0gMDsKKyAgICBidWZzeiArPSBzdHJsZW4oUFlUSE9OUEFUSCkgKyAxOworICAgIGJ1ZnN6ICs9IHN0cmxlbihhcmd2MF9wYXRoKSArIDE7CisgICAgYnVmc3ogKz0gc3RybGVuKHppcF9wYXRoKSArIDE7CisgICAgaWYgKGVudnBhdGggIT0gTlVMTCkKKyAgICAgICAgYnVmc3ogKz0gc3RybGVuKGVudnBhdGgpICsgMTsKIAotCW1vZHVsZV9zZWFyY2hfcGF0aCA9IGJ1ZiA9IG1hbGxvYyhidWZzeik7Ci0JaWYgKGJ1ZiA9PSBOVUxMKSB7Ci0JCS8qIFdlIGNhbid0IGV4aXQsIHNvIHByaW50IGEgd2FybmluZyBhbmQgbGltcCBhbG9uZyAqLwotCQlmcHJpbnRmKHN0ZGVyciwgIkNhbid0IG1hbGxvYyBkeW5hbWljIFBZVEhPTlBBVEguXG4iKTsKLQkJaWYgKGVudnBhdGgpIHsKLQkJCWZwcmludGYoc3RkZXJyLCAiVXNpbmcgZW52aXJvbm1lbnQgJFBZVEhPTlBBVEguXG4iKTsKLQkJCW1vZHVsZV9zZWFyY2hfcGF0aCA9IGVudnBhdGg7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmcHJpbnRmKHN0ZGVyciwgIlVzaW5nIGRlZmF1bHQgc3RhdGljIHBhdGguXG4iKTsKLQkJCW1vZHVsZV9zZWFyY2hfcGF0aCA9IFBZVEhPTlBBVEg7Ci0JCX0KLQkJcmV0dXJuOwotCX0KKyAgICBtb2R1bGVfc2VhcmNoX3BhdGggPSBidWYgPSBtYWxsb2MoYnVmc3opOworICAgIGlmIChidWYgPT0gTlVMTCkgeworICAgICAgICAvKiBXZSBjYW4ndCBleGl0LCBzbyBwcmludCBhIHdhcm5pbmcgYW5kIGxpbXAgYWxvbmcgKi8KKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJDYW4ndCBtYWxsb2MgZHluYW1pYyBQWVRIT05QQVRILlxuIik7CisgICAgICAgIGlmIChlbnZwYXRoKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVzaW5nIGVudmlyb25tZW50ICRQWVRIT05QQVRILlxuIik7CisgICAgICAgICAgICBtb2R1bGVfc2VhcmNoX3BhdGggPSBlbnZwYXRoOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJVc2luZyBkZWZhdWx0IHN0YXRpYyBwYXRoLlxuIik7CisgICAgICAgICAgICBtb2R1bGVfc2VhcmNoX3BhdGggPSBQWVRIT05QQVRIOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9CiAKLQlpZiAoZW52cGF0aCkgewotCQlzdHJjcHkoYnVmLCBlbnZwYXRoKTsKLQkJYnVmID0gc3RyY2hyKGJ1ZiwgJ1wwJyk7Ci0JCSpidWYrKyA9IERFTElNOwotCX0KLQlpZiAoemlwX3BhdGhbMF0pIHsKLQkJc3RyY3B5KGJ1ZiwgemlwX3BhdGgpOwotCQlidWYgPSBzdHJjaHIoYnVmLCAnXDAnKTsKLQkJKmJ1ZisrID0gREVMSU07Ci0JfQorICAgIGlmIChlbnZwYXRoKSB7CisgICAgICAgIHN0cmNweShidWYsIGVudnBhdGgpOworICAgICAgICBidWYgPSBzdHJjaHIoYnVmLCAnXDAnKTsKKyAgICAgICAgKmJ1ZisrID0gREVMSU07CisgICAgfQorICAgIGlmICh6aXBfcGF0aFswXSkgeworICAgICAgICBzdHJjcHkoYnVmLCB6aXBfcGF0aCk7CisgICAgICAgIGJ1ZiA9IHN0cmNocihidWYsICdcMCcpOworICAgICAgICAqYnVmKysgPSBERUxJTTsKKyAgICB9CiAKLQlpZiAocHl0aG9uaG9tZSA9PSBOVUxMKSB7Ci0JCXN0cmNweShidWYsIFBZVEhPTlBBVEgpOwotCQlidWYgPSBzdHJjaHIoYnVmLCAnXDAnKTsKLQl9Ci0JZWxzZSB7Ci0JCWNoYXIgKnAgPSBQWVRIT05QQVRIOwotCQljaGFyICpxOwotCQlzaXplX3QgbjsKLQkJZm9yICg7OykgewotCQkJcSA9IHN0cmNocihwLCBERUxJTSk7Ci0JCQlpZiAocSA9PSBOVUxMKQotCQkJCW4gPSBzdHJsZW4ocCk7Ci0JCQllbHNlCi0JCQkJbiA9IHEtcDsKLQkJCWlmIChwWzBdID09ICcuJyAmJiBpc19zZXAocFsxXSkpIHsKLQkJCQlzdHJjcHkoYnVmLCBweXRob25ob21lKTsKLQkJCQlidWYgPSBzdHJjaHIoYnVmLCAnXDAnKTsKLQkJCQlwKys7Ci0JCQkJbi0tOwotCQkJfQotCQkJc3RybmNweShidWYsIHAsIG4pOwotCQkJYnVmICs9IG47Ci0JCQlpZiAocSA9PSBOVUxMKQotCQkJCWJyZWFrOwotCQkJKmJ1ZisrID0gREVMSU07Ci0JCQlwID0gcSsxOwotCQl9Ci0JfQotCWlmIChhcmd2MF9wYXRoKSB7Ci0JCSpidWYrKyA9IERFTElNOwotCQlzdHJjcHkoYnVmLCBhcmd2MF9wYXRoKTsKLQkJYnVmID0gc3RyY2hyKGJ1ZiwgJ1wwJyk7Ci0JfQotCSpidWYgPSAnXDAnOworICAgIGlmIChweXRob25ob21lID09IE5VTEwpIHsKKyAgICAgICAgc3RyY3B5KGJ1ZiwgUFlUSE9OUEFUSCk7CisgICAgICAgIGJ1ZiA9IHN0cmNocihidWYsICdcMCcpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgY2hhciAqcCA9IFBZVEhPTlBBVEg7CisgICAgICAgIGNoYXIgKnE7CisgICAgICAgIHNpemVfdCBuOworICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICBxID0gc3RyY2hyKHAsIERFTElNKTsKKyAgICAgICAgICAgIGlmIChxID09IE5VTEwpCisgICAgICAgICAgICAgICAgbiA9IHN0cmxlbihwKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBuID0gcS1wOworICAgICAgICAgICAgaWYgKHBbMF0gPT0gJy4nICYmIGlzX3NlcChwWzFdKSkgeworICAgICAgICAgICAgICAgIHN0cmNweShidWYsIHB5dGhvbmhvbWUpOworICAgICAgICAgICAgICAgIGJ1ZiA9IHN0cmNocihidWYsICdcMCcpOworICAgICAgICAgICAgICAgIHArKzsKKyAgICAgICAgICAgICAgICBuLS07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdHJuY3B5KGJ1ZiwgcCwgbik7CisgICAgICAgICAgICBidWYgKz0gbjsKKyAgICAgICAgICAgIGlmIChxID09IE5VTEwpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAqYnVmKysgPSBERUxJTTsKKyAgICAgICAgICAgIHAgPSBxKzE7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGFyZ3YwX3BhdGgpIHsKKyAgICAgICAgKmJ1ZisrID0gREVMSU07CisgICAgICAgIHN0cmNweShidWYsIGFyZ3YwX3BhdGgpOworICAgICAgICBidWYgPSBzdHJjaHIoYnVmLCAnXDAnKTsKKyAgICB9CisgICAgKmJ1ZiA9ICdcMCc7CiB9CiAKIApAQCAtMzkwLDI5ICszOTAsMjkgQEAKIGNoYXIgKgogUHlfR2V0UGF0aCh2b2lkKQogewotCWlmICghbW9kdWxlX3NlYXJjaF9wYXRoKQotCQljYWxjdWxhdGVfcGF0aCgpOwotCXJldHVybiBtb2R1bGVfc2VhcmNoX3BhdGg7CisgICAgaWYgKCFtb2R1bGVfc2VhcmNoX3BhdGgpCisgICAgICAgIGNhbGN1bGF0ZV9wYXRoKCk7CisgICAgcmV0dXJuIG1vZHVsZV9zZWFyY2hfcGF0aDsKIH0KIAogY2hhciAqCiBQeV9HZXRQcmVmaXgodm9pZCkKIHsKLQlpZiAoIW1vZHVsZV9zZWFyY2hfcGF0aCkKLQkJY2FsY3VsYXRlX3BhdGgoKTsKLQlyZXR1cm4gcHJlZml4OworICAgIGlmICghbW9kdWxlX3NlYXJjaF9wYXRoKQorICAgICAgICBjYWxjdWxhdGVfcGF0aCgpOworICAgIHJldHVybiBwcmVmaXg7CiB9CiAKIGNoYXIgKgogUHlfR2V0RXhlY1ByZWZpeCh2b2lkKQogewotCXJldHVybiBQeV9HZXRQcmVmaXgoKTsKKyAgICByZXR1cm4gUHlfR2V0UHJlZml4KCk7CiB9CiAKIGNoYXIgKgogUHlfR2V0UHJvZ3JhbUZ1bGxQYXRoKHZvaWQpCiB7Ci0JaWYgKCFtb2R1bGVfc2VhcmNoX3BhdGgpCi0JCWNhbGN1bGF0ZV9wYXRoKCk7Ci0JcmV0dXJuIHByb2dwYXRoOworICAgIGlmICghbW9kdWxlX3NlYXJjaF9wYXRoKQorICAgICAgICBjYWxjdWxhdGVfcGF0aCgpOworICAgIHJldHVybiBwcm9ncGF0aDsKIH0KZGlmZiAtLWdpdCBhL1BDL29zMmVteC9weXRob25wbS5jIGIvUEMvb3MyZW14L3B5dGhvbnBtLmMKaW5kZXggNWFjY2JiZC4uYmE0N2Y0YiAxMDA2NDQKLS0tIGEvUEMvb3MyZW14L3B5dGhvbnBtLmMKKysrIGIvUEMvb3MyZW14L3B5dGhvbnBtLmMKQEAgLTI3LDEwICsyNywxMCBAQAogLyogdXNlIHN0cnVjdHVyZSB0byBwYXNzIGNvbW1hbmQgbGluZSB0byBQeXRob24gdGhyZWFkICovCiB0eXBlZGVmIHN0cnVjdAogewotCWludCBhcmdjOwotCWNoYXIgKiphcmd2OwotCUhXTkQgRnJhbWU7Ci0JaW50IHJ1bm5pbmc7CisgICAgaW50IGFyZ2M7CisgICAgY2hhciAqKmFyZ3Y7CisgICAgSFdORCBGcmFtZTsKKyAgICBpbnQgcnVubmluZzsKIH0gYXJnbGlzdDsKIAogLyogbWFrZSB0aGlzIGEgZ2xvYmFsIHRvIHNpbXBsaWZ5IGFjY2Vzcy4KQEAgLTQ1LDgwICs0NSw4MCBAQAogaW50CiBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKIHsKLQlVTE9ORyBGcmFtZUZsYWdzID0gRkNGX1RJVExFQkFSIHwKLQkJCSAgIEZDRl9TWVNNRU5VIHwKLQkJCSAgIEZDRl9TSVpFQk9SREVSIHwKLQkJCSAgIEZDRl9ISURFQlVUVE9OIHwKLQkJCSAgIEZDRl9TSEVMTFBPU0lUSU9OIHwKLQkJCSAgIEZDRl9UQVNLTElTVDsKLQlIQUIgaGFiOwotCUhNUSBobXE7Ci0JSFdORCBDbGllbnQ7Ci0JUU1TRyBxbXNnOwotCWFyZ2xpc3QgYXJnczsKLQlpbnQgcHl0aG9uX3RpZDsKKyAgICBVTE9ORyBGcmFtZUZsYWdzID0gRkNGX1RJVExFQkFSIHwKKyAgICAgICAgICAgICAgICAgICAgICAgRkNGX1NZU01FTlUgfAorICAgICAgICAgICAgICAgICAgICAgICBGQ0ZfU0laRUJPUkRFUiB8CisgICAgICAgICAgICAgICAgICAgICAgIEZDRl9ISURFQlVUVE9OIHwKKyAgICAgICAgICAgICAgICAgICAgICAgRkNGX1NIRUxMUE9TSVRJT04gfAorICAgICAgICAgICAgICAgICAgICAgICBGQ0ZfVEFTS0xJU1Q7CisgICAgSEFCIGhhYjsKKyAgICBITVEgaG1xOworICAgIEhXTkQgQ2xpZW50OworICAgIFFNU0cgcW1zZzsKKyAgICBhcmdsaXN0IGFyZ3M7CisgICAgaW50IHB5dGhvbl90aWQ7CiAKLQkvKiBpbml0IFBNIGFuZCBjcmVhdGUgbWVzc2FnZSBxdWV1ZSAqLwotCWhhYiA9IFdpbkluaXRpYWxpemUoMCk7Ci0JaG1xID0gV2luQ3JlYXRlTXNnUXVldWUoaGFiLCAwKTsKKyAgICAvKiBpbml0IFBNIGFuZCBjcmVhdGUgbWVzc2FnZSBxdWV1ZSAqLworICAgIGhhYiA9IFdpbkluaXRpYWxpemUoMCk7CisgICAgaG1xID0gV2luQ3JlYXRlTXNnUXVldWUoaGFiLCAwKTsKIAotCS8qIGNyZWF0ZSBhIChoaWRkZW4pIFdpbmRvdyB0byBob3VzZSB0aGUgd2luZG93IHByb2NlZHVyZSAqLwotCWFyZ3MuRnJhbWUgPSBXaW5DcmVhdGVTdGRXaW5kb3coSFdORF9ERVNLVE9QLAotCQkJCQkwLAotCQkJCQkmRnJhbWVGbGFncywKLQkJCQkJTlVMTCwKLQkJCQkJIlB5dGhvblBNIiwKLQkJCQkJMEwsCi0JCQkJCTAsCi0JCQkJCTAsCi0JCQkJCSZDbGllbnQpOworICAgIC8qIGNyZWF0ZSBhIChoaWRkZW4pIFdpbmRvdyB0byBob3VzZSB0aGUgd2luZG93IHByb2NlZHVyZSAqLworICAgIGFyZ3MuRnJhbWUgPSBXaW5DcmVhdGVTdGRXaW5kb3coSFdORF9ERVNLVE9QLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZGcmFtZUZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQeXRob25QTSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNsaWVudCk7CiAKLQkvKiBydW4gUHl0aG9uIGludGVycHJldGVyIGluIGEgdGhyZWFkICovCi0JYXJncy5hcmdjID0gYXJnYzsKLQlhcmdzLmFyZ3YgPSBhcmd2OwotCWFyZ3MucnVubmluZyA9IDA7Ci0JaWYgKC0xID09IChweXRob25fdGlkID0gX2JlZ2ludGhyZWFkKFB5dGhvblRocmVhZCwgTlVMTCwgMTAyNCAqIDEwMjQsICZhcmdzKSkpCi0JewotCQkvKiBjb3VsZG4ndCBzdGFydCB0aHJlYWQgKi8KLQkJV2luQWxhcm0oSFdORF9ERVNLVE9QLCBXQV9FUlJPUik7Ci0JCVB5dGhvblJDID0gMTsKLQl9Ci0JZWxzZQotCXsKLQkJLyogcHJvY2VzcyBQTSBtZXNzYWdlcywgdW50aWwgUHl0aG9uIGV4aXRzICovCi0JCXdoaWxlIChXaW5HZXRNc2coaGFiLCAmcW1zZywgTlVMTEhBTkRMRSwgMCwgMCkpCi0JCQlXaW5EaXNwYXRjaE1zZyhoYWIsICZxbXNnKTsKLQkJaWYgKGFyZ3MucnVubmluZyA+IDApCi0JCQlEb3NLaWxsVGhyZWFkKHB5dGhvbl90aWQpOwotCX0KLQkJCi0JLyogZGVzdHJveSB3aW5kb3csIHNodXRkb3duIG1lc3NhZ2UgcXVldWUgYW5kIFBNICovCi0JV2luRGVzdHJveVdpbmRvdyhhcmdzLkZyYW1lKTsKLQlXaW5EZXN0cm95TXNnUXVldWUoaG1xKTsKLQlXaW5UZXJtaW5hdGUoaGFiKTsKKyAgICAvKiBydW4gUHl0aG9uIGludGVycHJldGVyIGluIGEgdGhyZWFkICovCisgICAgYXJncy5hcmdjID0gYXJnYzsKKyAgICBhcmdzLmFyZ3YgPSBhcmd2OworICAgIGFyZ3MucnVubmluZyA9IDA7CisgICAgaWYgKC0xID09IChweXRob25fdGlkID0gX2JlZ2ludGhyZWFkKFB5dGhvblRocmVhZCwgTlVMTCwgMTAyNCAqIDEwMjQsICZhcmdzKSkpCisgICAgeworICAgICAgICAvKiBjb3VsZG4ndCBzdGFydCB0aHJlYWQgKi8KKyAgICAgICAgV2luQWxhcm0oSFdORF9ERVNLVE9QLCBXQV9FUlJPUik7CisgICAgICAgIFB5dGhvblJDID0gMTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogcHJvY2VzcyBQTSBtZXNzYWdlcywgdW50aWwgUHl0aG9uIGV4aXRzICovCisgICAgICAgIHdoaWxlIChXaW5HZXRNc2coaGFiLCAmcW1zZywgTlVMTEhBTkRMRSwgMCwgMCkpCisgICAgICAgICAgICBXaW5EaXNwYXRjaE1zZyhoYWIsICZxbXNnKTsKKyAgICAgICAgaWYgKGFyZ3MucnVubmluZyA+IDApCisgICAgICAgICAgICBEb3NLaWxsVGhyZWFkKHB5dGhvbl90aWQpOworICAgIH0KIAotCXJldHVybiBQeXRob25SQzsKKyAgICAvKiBkZXN0cm95IHdpbmRvdywgc2h1dGRvd24gbWVzc2FnZSBxdWV1ZSBhbmQgUE0gKi8KKyAgICBXaW5EZXN0cm95V2luZG93KGFyZ3MuRnJhbWUpOworICAgIFdpbkRlc3Ryb3lNc2dRdWV1ZShobXEpOworICAgIFdpblRlcm1pbmF0ZShoYWIpOworCisgICAgcmV0dXJuIFB5dGhvblJDOwogfQogCiB2b2lkIFB5dGhvblRocmVhZCh2b2lkICphcmdsKQogewotCUhBQiBoYWI7Ci0JYXJnbGlzdCAqYXJnczsKKyAgICBIQUIgaGFiOworICAgIGFyZ2xpc3QgKmFyZ3M7CiAKLQkvKiBQTSBpbml0aWFsaXNhdGlvbiAqLwotCWhhYiA9IFdpbkluaXRpYWxpemUoMCk7CisgICAgLyogUE0gaW5pdGlhbGlzYXRpb24gKi8KKyAgICBoYWIgPSBXaW5Jbml0aWFsaXplKDApOwogCi0JLyogc3RhcnQgUHl0aG9uICovCi0JYXJncyA9IChhcmdsaXN0ICopYXJnbDsKLQlhcmdzLT5ydW5uaW5nID0gMTsKLQlQeXRob25SQyA9IFB5X01haW4oYXJncy0+YXJnYywgYXJncy0+YXJndik7CisgICAgLyogc3RhcnQgUHl0aG9uICovCisgICAgYXJncyA9IChhcmdsaXN0ICopYXJnbDsKKyAgICBhcmdzLT5ydW5uaW5nID0gMTsKKyAgICBQeXRob25SQyA9IFB5X01haW4oYXJncy0+YXJnYywgYXJncy0+YXJndik7CiAKLQkvKiBlbnRlciBhIGNyaXRpY2FsIHNlY3Rpb24gYW5kIHNlbmQgdGhlIHRlcm1pbmF0aW9uIG1lc3NhZ2UgKi8KLQlEb3NFbnRlckNyaXRTZWMoKTsKLQlhcmdzLT5ydW5uaW5nID0gMDsKLQlXaW5Qb3N0TXNnKGFyZ3MtPkZyYW1lLCBXTV9RVUlULCBOVUxMLCBOVUxMKTsKKyAgICAvKiBlbnRlciBhIGNyaXRpY2FsIHNlY3Rpb24gYW5kIHNlbmQgdGhlIHRlcm1pbmF0aW9uIG1lc3NhZ2UgKi8KKyAgICBEb3NFbnRlckNyaXRTZWMoKTsKKyAgICBhcmdzLT5ydW5uaW5nID0gMDsKKyAgICBXaW5Qb3N0TXNnKGFyZ3MtPkZyYW1lLCBXTV9RVUlULCBOVUxMLCBOVUxMKTsKIAotCS8qIHNodXRkb3duIFBNIGFuZCB0ZXJtaW5hdGUgdGhyZWFkICovCi0JV2luVGVybWluYXRlKGhhYik7Ci0JX2VuZHRocmVhZCgpOworICAgIC8qIHNodXRkb3duIFBNIGFuZCB0ZXJtaW5hdGUgdGhyZWFkICovCisgICAgV2luVGVybWluYXRlKGhhYik7CisgICAgX2VuZHRocmVhZCgpOwogfQpkaWZmIC0tZ2l0IGEvUEMvb3MydmFjcHAvZ2V0cGF0aHAuYyBiL1BDL29zMnZhY3BwL2dldHBhdGhwLmMKaW5kZXggNjA3ZjJhMS4uNWJjMjgyNyAxMDA2NDQKLS0tIGEvUEMvb3MydmFjcHAvZ2V0cGF0aHAuYworKysgYi9QQy9vczJ2YWNwcC9nZXRwYXRocC5jCkBAIC01NSwxMiArNTUsMTIgQEAKIAogCiBzdGF0aWMgaW50Ci1pc19zZXAoY2hhciBjaCkJLyogZGV0ZXJtaW5lIGlmICJjaCIgaXMgYSBzZXBhcmF0b3IgY2hhcmFjdGVyICovCitpc19zZXAoY2hhciBjaCkgLyogZGV0ZXJtaW5lIGlmICJjaCIgaXMgYSBzZXBhcmF0b3IgY2hhcmFjdGVyICovCiB7CiAjaWZkZWYgQUxUU0VQCi0JcmV0dXJuIGNoID09IFNFUCB8fCBjaCA9PSBBTFRTRVA7CisgICAgcmV0dXJuIGNoID09IFNFUCB8fCBjaCA9PSBBTFRTRVA7CiAjZWxzZQotCXJldHVybiBjaCA9PSBTRVA7CisgICAgcmV0dXJuIGNoID09IFNFUDsKICNlbmRpZgogfQogCkBAIC02OCwxOCArNjgsMTggQEAKIHN0YXRpYyB2b2lkCiByZWR1Y2UoY2hhciAqZGlyKQogewotCWludCBpID0gc3RybGVuKGRpcik7Ci0Jd2hpbGUgKGkgPiAwICYmICFpc19zZXAoZGlyW2ldKSkKLQkJLS1pOwotCWRpcltpXSA9ICdcMCc7CisgICAgaW50IGkgPSBzdHJsZW4oZGlyKTsKKyAgICB3aGlsZSAoaSA+IDAgJiYgIWlzX3NlcChkaXJbaV0pKQorICAgICAgICAtLWk7CisgICAgZGlyW2ldID0gJ1wwJzsKIH0KLQkKKwogCiBzdGF0aWMgaW50CiBleGlzdHMoY2hhciAqZmlsZW5hbWUpCiB7Ci0Jc3RydWN0IHN0YXQgYnVmOwotCXJldHVybiBzdGF0KGZpbGVuYW1lLCAmYnVmKSA9PSAwOworICAgIHN0cnVjdCBzdGF0IGJ1ZjsKKyAgICByZXR1cm4gc3RhdChmaWxlbmFtZSwgJmJ1ZikgPT0gMDsKIH0KIAogCkBAIC05NSw0MiArOTUsNDIgQEAKIHN0YXRpYyB2b2lkCiBqb2luKGNoYXIgKmJ1ZmZlciwgY2hhciAqc3R1ZmYpCiB7Ci0JaW50IG4sIGs7Ci0JaWYgKGlzX3NlcChzdHVmZlswXSkpCi0JCW4gPSAwOwotCWVsc2UgewotCQluID0gc3RybGVuKGJ1ZmZlcik7Ci0JCWlmIChuID4gMCAmJiAhaXNfc2VwKGJ1ZmZlcltuLTFdKSAmJiBuIDwgTUFYUEFUSExFTikKLQkJCWJ1ZmZlcltuKytdID0gU0VQOwotCX0KLQlpZiAobiA+IE1BWFBBVEhMRU4pCi0JCVB5X0ZhdGFsRXJyb3IoImJ1ZmZlciBvdmVyZmxvdyBpbiBnZXRwYXRocC5jJ3Mgam9pbnBhdGgoKSIpOwotCWsgPSBzdHJsZW4oc3R1ZmYpOwotCWlmIChuICsgayA+IE1BWFBBVEhMRU4pCi0JCWsgPSBNQVhQQVRITEVOIC0gbjsKLQlzdHJuY3B5KGJ1ZmZlcituLCBzdHVmZiwgayk7Ci0JYnVmZmVyW24ra10gPSAnXDAnOworICAgIGludCBuLCBrOworICAgIGlmIChpc19zZXAoc3R1ZmZbMF0pKQorICAgICAgICBuID0gMDsKKyAgICBlbHNlIHsKKyAgICAgICAgbiA9IHN0cmxlbihidWZmZXIpOworICAgICAgICBpZiAobiA+IDAgJiYgIWlzX3NlcChidWZmZXJbbi0xXSkgJiYgbiA8IE1BWFBBVEhMRU4pCisgICAgICAgICAgICBidWZmZXJbbisrXSA9IFNFUDsKKyAgICB9CisgICAgaWYgKG4gPiBNQVhQQVRITEVOKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJidWZmZXIgb3ZlcmZsb3cgaW4gZ2V0cGF0aHAuYydzIGpvaW5wYXRoKCkiKTsKKyAgICBrID0gc3RybGVuKHN0dWZmKTsKKyAgICBpZiAobiArIGsgPiBNQVhQQVRITEVOKQorICAgICAgICBrID0gTUFYUEFUSExFTiAtIG47CisgICAgc3RybmNweShidWZmZXIrbiwgc3R1ZmYsIGspOworICAgIGJ1ZmZlcltuK2tdID0gJ1wwJzsKIH0KIAogCiBzdGF0aWMgaW50CiBzZWFyY2hfZm9yX3ByZWZpeChjaGFyICphcmd2MF9wYXRoLCBjaGFyICpsYW5kbWFyaykKIHsKLQlpbnQgbjsKKyAgICBpbnQgbjsKIAotCS8qIFNlYXJjaCBmcm9tIGFyZ3YwX3BhdGgsIHVudGlsIHJvb3QgaXMgZm91bmQgKi8KLQlzdHJjcHkocHJlZml4LCBhcmd2MF9wYXRoKTsKLQlkbyB7Ci0JCW4gPSBzdHJsZW4ocHJlZml4KTsKLQkJam9pbihwcmVmaXgsIGxhbmRtYXJrKTsKLQkJaWYgKGV4aXN0cyhwcmVmaXgpKSB7Ci0JCQlwcmVmaXhbbl0gPSAnXDAnOwotCQkJcmV0dXJuIDE7Ci0JCX0KLQkJcHJlZml4W25dID0gJ1wwJzsKLQkJcmVkdWNlKHByZWZpeCk7Ci0JfSB3aGlsZSAocHJlZml4WzBdKTsKLQlyZXR1cm4gMDsKKyAgICAvKiBTZWFyY2ggZnJvbSBhcmd2MF9wYXRoLCB1bnRpbCByb290IGlzIGZvdW5kICovCisgICAgc3RyY3B5KHByZWZpeCwgYXJndjBfcGF0aCk7CisgICAgZG8geworICAgICAgICBuID0gc3RybGVuKHByZWZpeCk7CisgICAgICAgIGpvaW4ocHJlZml4LCBsYW5kbWFyayk7CisgICAgICAgIGlmIChleGlzdHMocHJlZml4KSkgeworICAgICAgICAgICAgcHJlZml4W25dID0gJ1wwJzsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgIHByZWZpeFtuXSA9ICdcMCc7CisgICAgICAgIHJlZHVjZShwcmVmaXgpOworICAgIH0gd2hpbGUgKHByZWZpeFswXSk7CisgICAgcmV0dXJuIDA7CiB9CiAKICNpZmRlZiBNU19XSU4zMgpAQCAtMTQ3LDI5OSArMTQ3LDI5OSBAQAogc3RhdGljIGNoYXIgKgogZ2V0cHl0aG9ucmVncGF0aChIS0VZIGtleUJhc2UsIEJPT0wgYldpbjMycykKIHsKLQlIS0VZIG5ld0tleSA9IDA7Ci0JRFdPUkQgbmFtZVNpemUgPSAwOwotCURXT1JEIGRhdGFTaXplID0gMDsKLQlEV09SRCBudW1FbnRyaWVzID0gMDsKLQlMT05HIHJjOwotCWNoYXIgKnJldHZhbCA9IE5VTEw7Ci0JY2hhciAqZGF0YUJ1ZjsKLQljb25zdCBjaGFyIGtleVByZWZpeFtdID0gIlNvZnR3YXJlXFxQeXRob25cXFB5dGhvbkNvcmVcXCI7Ci0JY29uc3QgY2hhciBrZXlTdWZmaXhbXSA9ICJcXFB5dGhvblBhdGgiOwotCWludCB2ZXJzaW9uTGVuOwotCWNoYXIgKmtleUJ1ZjsKKyAgICBIS0VZIG5ld0tleSA9IDA7CisgICAgRFdPUkQgbmFtZVNpemUgPSAwOworICAgIERXT1JEIGRhdGFTaXplID0gMDsKKyAgICBEV09SRCBudW1FbnRyaWVzID0gMDsKKyAgICBMT05HIHJjOworICAgIGNoYXIgKnJldHZhbCA9IE5VTEw7CisgICAgY2hhciAqZGF0YUJ1ZjsKKyAgICBjb25zdCBjaGFyIGtleVByZWZpeFtdID0gIlNvZnR3YXJlXFxQeXRob25cXFB5dGhvbkNvcmVcXCI7CisgICAgY29uc3QgY2hhciBrZXlTdWZmaXhbXSA9ICJcXFB5dGhvblBhdGgiOworICAgIGludCB2ZXJzaW9uTGVuOworICAgIGNoYXIgKmtleUJ1ZjsKIAotCS8vIFRyaWVkIHRvIHVzZSBzeXNnZXQoIndpbnZlciIpIGJ1dCBoZXJlIGlzIHRvbyBlYXJseSA6LSgKLQl2ZXJzaW9uTGVuID0gc3RybGVuKFB5V2luX0RMTFZlcnNpb25TdHJpbmcpOwotCS8vIGFsbG9jYSA9PSBubyBmcmVlIHJlcXVpcmVkLCBidXQgbWVtb3J5IG9ubHkgbG9jYWwgdG8gZm4uCi0JLy8gYWxzbyBubyBoZWFwIGZyYWdtZW50YXRpb24hICBBbSBJIGJlaW5nIHNpbGx5PwotCWtleUJ1ZiA9IGFsbG9jYShzaXplb2Yoa2V5UHJlZml4KS0xICsgdmVyc2lvbkxlbiArIHNpemVvZihrZXlTdWZmaXgpKTsgLy8gY2hhcnMgb25seSwgcGx1cyAxIE5VTEwuCi0JLy8gbG90cyBvZiBjb25zdGFudHMgaGVyZSBmb3IgdGhlIGNvbXBpbGVyIHRvIG9wdGltaXplIGF3YXkgOi0pCi0JbWVtY3B5KGtleUJ1Ziwga2V5UHJlZml4LCBzaXplb2Yoa2V5UHJlZml4KS0xKTsKLQltZW1jcHkoa2V5QnVmK3NpemVvZihrZXlQcmVmaXgpLTEsIFB5V2luX0RMTFZlcnNpb25TdHJpbmcsIHZlcnNpb25MZW4pOwotCW1lbWNweShrZXlCdWYrc2l6ZW9mKGtleVByZWZpeCktMSt2ZXJzaW9uTGVuLCBrZXlTdWZmaXgsIHNpemVvZihrZXlTdWZmaXgpKTsgLy8gTlVMTCBjb21lcyB3aXRoIHRoaXMgb25lIQorICAgIC8vIFRyaWVkIHRvIHVzZSBzeXNnZXQoIndpbnZlciIpIGJ1dCBoZXJlIGlzIHRvbyBlYXJseSA6LSgKKyAgICB2ZXJzaW9uTGVuID0gc3RybGVuKFB5V2luX0RMTFZlcnNpb25TdHJpbmcpOworICAgIC8vIGFsbG9jYSA9PSBubyBmcmVlIHJlcXVpcmVkLCBidXQgbWVtb3J5IG9ubHkgbG9jYWwgdG8gZm4uCisgICAgLy8gYWxzbyBubyBoZWFwIGZyYWdtZW50YXRpb24hICBBbSBJIGJlaW5nIHNpbGx5PworICAgIGtleUJ1ZiA9IGFsbG9jYShzaXplb2Yoa2V5UHJlZml4KS0xICsgdmVyc2lvbkxlbiArIHNpemVvZihrZXlTdWZmaXgpKTsgLy8gY2hhcnMgb25seSwgcGx1cyAxIE5VTEwuCisgICAgLy8gbG90cyBvZiBjb25zdGFudHMgaGVyZSBmb3IgdGhlIGNvbXBpbGVyIHRvIG9wdGltaXplIGF3YXkgOi0pCisgICAgbWVtY3B5KGtleUJ1Ziwga2V5UHJlZml4LCBzaXplb2Yoa2V5UHJlZml4KS0xKTsKKyAgICBtZW1jcHkoa2V5QnVmK3NpemVvZihrZXlQcmVmaXgpLTEsIFB5V2luX0RMTFZlcnNpb25TdHJpbmcsIHZlcnNpb25MZW4pOworICAgIG1lbWNweShrZXlCdWYrc2l6ZW9mKGtleVByZWZpeCktMSt2ZXJzaW9uTGVuLCBrZXlTdWZmaXgsIHNpemVvZihrZXlTdWZmaXgpKTsgLy8gTlVMTCBjb21lcyB3aXRoIHRoaXMgb25lIQogCi0JcmM9UmVnT3BlbktleShrZXlCYXNlLAotCQkgICAgICBrZXlCdWYsCi0JCSAgICAgICZuZXdLZXkpOwotCWlmIChyYz09RVJST1JfU1VDQ0VTUykgewotCQlSZWdRdWVyeUluZm9LZXkobmV3S2V5LCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAKLQkJICAgICAgICAgICAgICAgICZudW1FbnRyaWVzLCAmbmFtZVNpemUsICZkYXRhU2l6ZSwgTlVMTCwgTlVMTCk7Ci0JfQotCWlmIChiV2luMzJzICYmIG51bUVudHJpZXM9PTAgJiYgZGF0YVNpemU9PTApIHsKLQkJLyogbXVzdCBoYXJkY29kZSBmb3IgV2luMzJzICovCi0JCW51bUVudHJpZXMgPSAxOwotCQlkYXRhU2l6ZSA9IDUxMTsKLQl9Ci0JaWYgKG51bUVudHJpZXMpIHsKLQkJLyogTG9vcCBvdmVyIGFsbCBzdWJrZXlzLiAqLwotCQkvKiBXaW4zMnMgZG9lc250IGtub3cgaG93IG1hbnkgc3Via2V5cywgc28gd2UgZG8KLQkJICAgaXQgdHdpY2UgKi8KLQkJY2hhciBrZXlCdWZbTUFYX1BBVEgrMV07Ci0JCWludCBpbmRleCA9IDA7Ci0JCWludCBvZmYgPSAwOwotCQlmb3IoaW5kZXg9MDs7aW5kZXgrKykgewotCQkJbG9uZyByZXFkU2l6ZSA9IDA7Ci0JCQlEV09SRCByYyA9IFJlZ0VudW1LZXkobmV3S2V5LAotCQkJCQkgICAgICBpbmRleCwga2V5QnVmLCBNQVhfUEFUSCsxKTsKLQkJCWlmIChyYykgYnJlYWs7Ci0JCQlyYyA9IFJlZ1F1ZXJ5VmFsdWUobmV3S2V5LCBrZXlCdWYsIE5VTEwsICZyZXFkU2l6ZSk7Ci0JCQlpZiAocmMpIGJyZWFrOwotCQkJaWYgKGJXaW4zMnMgJiYgcmVxZFNpemU9PTApIHJlcWRTaXplID0gNTEyOwotCQkJZGF0YVNpemUgKz0gcmVxZFNpemUgKyAxOyAvKiAxIGZvciB0aGUgIjsiICovCi0JCX0KLQkJZGF0YUJ1ZiA9IG1hbGxvYyhkYXRhU2l6ZSsxKTsKLQkJaWYgKGRhdGFCdWY9PU5VTEwpCi0JCQlyZXR1cm4gTlVMTDsgLyogcHJldHR5IHNlcmlvdXM/ICBSYWlzZSBlcnJvcj8gKi8KLQkJLyogTm93IGxvb3Agb3ZlciwgZ3JhYmJpbmcgdGhlIHBhdGhzLgotCQkgICBTdWJrZXlzIGJlZm9yZSBtYWluIGxpYnJhcnkgKi8KLQkJZm9yKGluZGV4PTA7O2luZGV4KyspIHsKLQkJCWludCBhZGp1c3Q7Ci0JCQlsb25nIHJlcWRTaXplID0gZGF0YVNpemU7Ci0JCQlEV09SRCByYyA9IFJlZ0VudW1LZXkobmV3S2V5LAotCQkJCQkgICAgICBpbmRleCwga2V5QnVmLE1BWF9QQVRIKzEpOwotCQkJaWYgKHJjKSBicmVhazsKLQkJCXJjID0gUmVnUXVlcnlWYWx1ZShuZXdLZXksCi0JCQkJCSAgIGtleUJ1ZiwgZGF0YUJ1ZitvZmYsICZyZXFkU2l6ZSk7Ci0JCQlpZiAocmMpIGJyZWFrOwotCQkJaWYgKHJlcWRTaXplPjEpIHsKLQkJCQkvKiBJZiBOb3RoaW5nLCBvciBvbmx5ICdcMCcgY29waWVkLiAqLwotCQkJCWFkanVzdCA9IHN0cmxlbihkYXRhQnVmK29mZik7Ci0JCQkJZGF0YVNpemUgLT0gYWRqdXN0OwotCQkJCW9mZiArPSBhZGp1c3Q7Ci0JCQkJZGF0YUJ1ZltvZmYrK10gPSAnOyc7Ci0JCQkJZGF0YUJ1ZltvZmZdID0gJ1wwJzsKLQkJCQlkYXRhU2l6ZS0tOwotCQkJfQotCQl9Ci0JCS8qIEFkZGl0aW9uYWxseSwgd2luMzJzIGRvZXNudCB3b3JrIGFzIGV4cGVjdGVkLCBzbwotCQkgICB0aGUgc3BlY2lmaWMgc3RybGVuKCkgaXMgcmVxdWlyZWQgZm9yIDMuMS4gKi8KLQkJcmMgPSBSZWdRdWVyeVZhbHVlKG5ld0tleSwgIiIsIGRhdGFCdWYrb2ZmLCAmZGF0YVNpemUpOwotCQlpZiAocmM9PUVSUk9SX1NVQ0NFU1MpIHsKLQkJCWlmIChzdHJsZW4oZGF0YUJ1Zik9PTApCi0JCQkJZnJlZShkYXRhQnVmKTsKLQkJCWVsc2UKLQkJCQlyZXR2YWwgPSBkYXRhQnVmOyAvKiBjYWxsZXIgd2lsbCBmcmVlICovCi0JCX0KLQkJZWxzZQotCQkJZnJlZShkYXRhQnVmKTsKLQl9CisgICAgcmM9UmVnT3BlbktleShrZXlCYXNlLAorICAgICAgICAgICAgICAgICAga2V5QnVmLAorICAgICAgICAgICAgICAgICAgJm5ld0tleSk7CisgICAgaWYgKHJjPT1FUlJPUl9TVUNDRVNTKSB7CisgICAgICAgIFJlZ1F1ZXJ5SW5mb0tleShuZXdLZXksIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAmbnVtRW50cmllcywgJm5hbWVTaXplLCAmZGF0YVNpemUsIE5VTEwsIE5VTEwpOworICAgIH0KKyAgICBpZiAoYldpbjMycyAmJiBudW1FbnRyaWVzPT0wICYmIGRhdGFTaXplPT0wKSB7CisgICAgICAgIC8qIG11c3QgaGFyZGNvZGUgZm9yIFdpbjMycyAqLworICAgICAgICBudW1FbnRyaWVzID0gMTsKKyAgICAgICAgZGF0YVNpemUgPSA1MTE7CisgICAgfQorICAgIGlmIChudW1FbnRyaWVzKSB7CisgICAgICAgIC8qIExvb3Agb3ZlciBhbGwgc3Via2V5cy4gKi8KKyAgICAgICAgLyogV2luMzJzIGRvZXNudCBrbm93IGhvdyBtYW55IHN1YmtleXMsIHNvIHdlIGRvCisgICAgICAgICAgIGl0IHR3aWNlICovCisgICAgICAgIGNoYXIga2V5QnVmW01BWF9QQVRIKzFdOworICAgICAgICBpbnQgaW5kZXggPSAwOworICAgICAgICBpbnQgb2ZmID0gMDsKKyAgICAgICAgZm9yKGluZGV4PTA7O2luZGV4KyspIHsKKyAgICAgICAgICAgIGxvbmcgcmVxZFNpemUgPSAwOworICAgICAgICAgICAgRFdPUkQgcmMgPSBSZWdFbnVtS2V5KG5ld0tleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwga2V5QnVmLCBNQVhfUEFUSCsxKTsKKyAgICAgICAgICAgIGlmIChyYykgYnJlYWs7CisgICAgICAgICAgICByYyA9IFJlZ1F1ZXJ5VmFsdWUobmV3S2V5LCBrZXlCdWYsIE5VTEwsICZyZXFkU2l6ZSk7CisgICAgICAgICAgICBpZiAocmMpIGJyZWFrOworICAgICAgICAgICAgaWYgKGJXaW4zMnMgJiYgcmVxZFNpemU9PTApIHJlcWRTaXplID0gNTEyOworICAgICAgICAgICAgZGF0YVNpemUgKz0gcmVxZFNpemUgKyAxOyAvKiAxIGZvciB0aGUgIjsiICovCisgICAgICAgIH0KKyAgICAgICAgZGF0YUJ1ZiA9IG1hbGxvYyhkYXRhU2l6ZSsxKTsKKyAgICAgICAgaWYgKGRhdGFCdWY9PU5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsgLyogcHJldHR5IHNlcmlvdXM/ICBSYWlzZSBlcnJvcj8gKi8KKyAgICAgICAgLyogTm93IGxvb3Agb3ZlciwgZ3JhYmJpbmcgdGhlIHBhdGhzLgorICAgICAgICAgICBTdWJrZXlzIGJlZm9yZSBtYWluIGxpYnJhcnkgKi8KKyAgICAgICAgZm9yKGluZGV4PTA7O2luZGV4KyspIHsKKyAgICAgICAgICAgIGludCBhZGp1c3Q7CisgICAgICAgICAgICBsb25nIHJlcWRTaXplID0gZGF0YVNpemU7CisgICAgICAgICAgICBEV09SRCByYyA9IFJlZ0VudW1LZXkobmV3S2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LCBrZXlCdWYsTUFYX1BBVEgrMSk7CisgICAgICAgICAgICBpZiAocmMpIGJyZWFrOworICAgICAgICAgICAgcmMgPSBSZWdRdWVyeVZhbHVlKG5ld0tleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlCdWYsIGRhdGFCdWYrb2ZmLCAmcmVxZFNpemUpOworICAgICAgICAgICAgaWYgKHJjKSBicmVhazsKKyAgICAgICAgICAgIGlmIChyZXFkU2l6ZT4xKSB7CisgICAgICAgICAgICAgICAgLyogSWYgTm90aGluZywgb3Igb25seSAnXDAnIGNvcGllZC4gKi8KKyAgICAgICAgICAgICAgICBhZGp1c3QgPSBzdHJsZW4oZGF0YUJ1ZitvZmYpOworICAgICAgICAgICAgICAgIGRhdGFTaXplIC09IGFkanVzdDsKKyAgICAgICAgICAgICAgICBvZmYgKz0gYWRqdXN0OworICAgICAgICAgICAgICAgIGRhdGFCdWZbb2ZmKytdID0gJzsnOworICAgICAgICAgICAgICAgIGRhdGFCdWZbb2ZmXSA9ICdcMCc7CisgICAgICAgICAgICAgICAgZGF0YVNpemUtLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiBBZGRpdGlvbmFsbHksIHdpbjMycyBkb2VzbnQgd29yayBhcyBleHBlY3RlZCwgc28KKyAgICAgICAgICAgdGhlIHNwZWNpZmljIHN0cmxlbigpIGlzIHJlcXVpcmVkIGZvciAzLjEuICovCisgICAgICAgIHJjID0gUmVnUXVlcnlWYWx1ZShuZXdLZXksICIiLCBkYXRhQnVmK29mZiwgJmRhdGFTaXplKTsKKyAgICAgICAgaWYgKHJjPT1FUlJPUl9TVUNDRVNTKSB7CisgICAgICAgICAgICBpZiAoc3RybGVuKGRhdGFCdWYpPT0wKQorICAgICAgICAgICAgICAgIGZyZWUoZGF0YUJ1Zik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dmFsID0gZGF0YUJ1ZjsgLyogY2FsbGVyIHdpbGwgZnJlZSAqLworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGZyZWUoZGF0YUJ1Zik7CisgICAgfQogCi0JaWYgKG5ld0tleSkKLQkJUmVnQ2xvc2VLZXkobmV3S2V5KTsKLQlyZXR1cm4gcmV0dmFsOworICAgIGlmIChuZXdLZXkpCisgICAgICAgIFJlZ0Nsb3NlS2V5KG5ld0tleSk7CisgICAgcmV0dXJuIHJldHZhbDsKIH0KICNlbmRpZiAvKiBNU19XSU4zMiAqLwogCiBzdGF0aWMgdm9pZAogZ2V0X3Byb2dwYXRoKHZvaWQpCiB7Ci0JZXh0ZXJuIGNoYXIgKlB5X0dldFByb2dyYW1OYW1lKHZvaWQpOwotCWNoYXIgKnBhdGggPSBnZXRlbnYoIlBBVEgiKTsKLQljaGFyICpwcm9nID0gUHlfR2V0UHJvZ3JhbU5hbWUoKTsKKyAgICBleHRlcm4gY2hhciAqUHlfR2V0UHJvZ3JhbU5hbWUodm9pZCk7CisgICAgY2hhciAqcGF0aCA9IGdldGVudigiUEFUSCIpOworICAgIGNoYXIgKnByb2cgPSBQeV9HZXRQcm9ncmFtTmFtZSgpOwogCiAjaWZkZWYgTVNfV0lOMzIKLQlpZiAoR2V0TW9kdWxlRmlsZU5hbWUoTlVMTCwgcHJvZ3BhdGgsIE1BWFBBVEhMRU4pKQotCQlyZXR1cm47CisgICAgaWYgKEdldE1vZHVsZUZpbGVOYW1lKE5VTEwsIHByb2dwYXRoLCBNQVhQQVRITEVOKSkKKyAgICAgICAgcmV0dXJuOwogI2VuZGlmCi0JaWYgKHByb2cgPT0gTlVMTCB8fCAqcHJvZyA9PSAnXDAnKQotCQlwcm9nID0gInB5dGhvbiI7CisgICAgaWYgKHByb2cgPT0gTlVMTCB8fCAqcHJvZyA9PSAnXDAnKQorICAgICAgICBwcm9nID0gInB5dGhvbiI7CiAKLQkvKiBJZiB0aGVyZSBpcyBubyBzbGFzaCBpbiB0aGUgYXJndjAgcGF0aCwgdGhlbiB3ZSBoYXZlIHRvCi0JICogYXNzdW1lIHB5dGhvbiBpcyBvbiB0aGUgdXNlcidzICRQQVRILCBzaW5jZSB0aGVyZSdzIG5vCi0JICogb3RoZXIgd2F5IHRvIGZpbmQgYSBkaXJlY3RvcnkgdG8gc3RhcnQgdGhlIHNlYXJjaCBmcm9tLiAgSWYKLQkgKiAkUEFUSCBpc24ndCBleHBvcnRlZCwgeW91IGxvc2UuCi0JICovCisgICAgLyogSWYgdGhlcmUgaXMgbm8gc2xhc2ggaW4gdGhlIGFyZ3YwIHBhdGgsIHRoZW4gd2UgaGF2ZSB0bworICAgICAqIGFzc3VtZSBweXRob24gaXMgb24gdGhlIHVzZXIncyAkUEFUSCwgc2luY2UgdGhlcmUncyBubworICAgICAqIG90aGVyIHdheSB0byBmaW5kIGEgZGlyZWN0b3J5IHRvIHN0YXJ0IHRoZSBzZWFyY2ggZnJvbS4gIElmCisgICAgICogJFBBVEggaXNuJ3QgZXhwb3J0ZWQsIHlvdSBsb3NlLgorICAgICAqLwogI2lmZGVmIEFMVFNFUAotCWlmIChzdHJjaHIocHJvZywgU0VQKSB8fCBzdHJjaHIocHJvZywgQUxUU0VQKSkKKyAgICBpZiAoc3RyY2hyKHByb2csIFNFUCkgfHwgc3RyY2hyKHByb2csIEFMVFNFUCkpCiAjZWxzZQotCWlmIChzdHJjaHIocHJvZywgU0VQKSkKKyAgICBpZiAoc3RyY2hyKHByb2csIFNFUCkpCiAjZW5kaWYKLQkJc3RyY3B5KHByb2dwYXRoLCBwcm9nKTsKLQllbHNlIGlmIChwYXRoKSB7Ci0JCXdoaWxlICgxKSB7Ci0JCQljaGFyICpkZWxpbSA9IHN0cmNocihwYXRoLCBERUxJTSk7CisgICAgICAgIHN0cmNweShwcm9ncGF0aCwgcHJvZyk7CisgICAgZWxzZSBpZiAocGF0aCkgeworICAgICAgICB3aGlsZSAoMSkgeworICAgICAgICAgICAgY2hhciAqZGVsaW0gPSBzdHJjaHIocGF0aCwgREVMSU0pOwogCi0JCQlpZiAoZGVsaW0pIHsKLQkJCQlpbnQgbGVuID0gZGVsaW0gLSBwYXRoOwotCQkJCXN0cm5jcHkocHJvZ3BhdGgsIHBhdGgsIGxlbik7Ci0JCQkJKihwcm9ncGF0aCArIGxlbikgPSAnXDAnOwotCQkJfQotCQkJZWxzZQotCQkJCXN0cmNweShwcm9ncGF0aCwgcGF0aCk7CisgICAgICAgICAgICBpZiAoZGVsaW0pIHsKKyAgICAgICAgICAgICAgICBpbnQgbGVuID0gZGVsaW0gLSBwYXRoOworICAgICAgICAgICAgICAgIHN0cm5jcHkocHJvZ3BhdGgsIHBhdGgsIGxlbik7CisgICAgICAgICAgICAgICAgKihwcm9ncGF0aCArIGxlbikgPSAnXDAnOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHN0cmNweShwcm9ncGF0aCwgcGF0aCk7CiAKLQkJCWpvaW4ocHJvZ3BhdGgsIHByb2cpOwotCQkJaWYgKGV4aXN0cyhwcm9ncGF0aCkpCi0JCQkJYnJlYWs7CisgICAgICAgICAgICBqb2luKHByb2dwYXRoLCBwcm9nKTsKKyAgICAgICAgICAgIGlmIChleGlzdHMocHJvZ3BhdGgpKQorICAgICAgICAgICAgICAgIGJyZWFrOwogCi0JCQlpZiAoIWRlbGltKSB7Ci0JCQkJcHJvZ3BhdGhbMF0gPSAnXDAnOwotCQkJCWJyZWFrOwotCQkJfQotCQkJcGF0aCA9IGRlbGltICsgMTsKLQkJfQotCX0KLQllbHNlCi0JCXByb2dwYXRoWzBdID0gJ1wwJzsKKyAgICAgICAgICAgIGlmICghZGVsaW0pIHsKKyAgICAgICAgICAgICAgICBwcm9ncGF0aFswXSA9ICdcMCc7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwYXRoID0gZGVsaW0gKyAxOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcHJvZ3BhdGhbMF0gPSAnXDAnOwogfQogCiBzdGF0aWMgdm9pZAogY2FsY3VsYXRlX3BhdGgodm9pZCkKIHsKLQljaGFyIGFyZ3YwX3BhdGhbTUFYUEFUSExFTisxXTsKLQljaGFyICpidWY7Ci0JaW50IGJ1ZnN6OwotCWNoYXIgKnB5dGhvbmhvbWUgPSBQeV9HZXRQeXRob25Ib21lKCk7Ci0JY2hhciAqZW52cGF0aCA9IFB5X0dFVEVOVigiUFlUSE9OUEFUSCIpOworICAgIGNoYXIgYXJndjBfcGF0aFtNQVhQQVRITEVOKzFdOworICAgIGNoYXIgKmJ1ZjsKKyAgICBpbnQgYnVmc3o7CisgICAgY2hhciAqcHl0aG9uaG9tZSA9IFB5X0dldFB5dGhvbkhvbWUoKTsKKyAgICBjaGFyICplbnZwYXRoID0gUHlfR0VURU5WKCJQWVRIT05QQVRIIik7CiAjaWZkZWYgTVNfV0lOMzIKLQljaGFyICptYWNoaW5lcGF0aCwgKnVzZXJwYXRoOworICAgIGNoYXIgKm1hY2hpbmVwYXRoLCAqdXNlcnBhdGg7CiAKLQkvKiBBcmUgd2UgcnVubmluZyB1bmRlciBXaW5kb3dzIDMuMSgxKSBXaW4zMnM/ICovCi0JaWYgKFB5V2luX0lzV2luMzJzKCkpIHsKLQkJLyogT25seSBDTEFTU0VTX1JPT1QgaXMgc3VwcG9ydGVkICovCi0JCW1hY2hpbmVwYXRoID0gZ2V0cHl0aG9ucmVncGF0aChIS0VZX0NMQVNTRVNfUk9PVCwgVFJVRSk7IAotCQl1c2VycGF0aCA9IE5VTEw7Ci0JfSBlbHNlIHsKLQkJbWFjaGluZXBhdGggPSBnZXRweXRob25yZWdwYXRoKEhLRVlfTE9DQUxfTUFDSElORSwgRkFMU0UpOwotCQl1c2VycGF0aCA9IGdldHB5dGhvbnJlZ3BhdGgoSEtFWV9DVVJSRU5UX1VTRVIsIEZBTFNFKTsKLQl9CisgICAgLyogQXJlIHdlIHJ1bm5pbmcgdW5kZXIgV2luZG93cyAzLjEoMSkgV2luMzJzPyAqLworICAgIGlmIChQeVdpbl9Jc1dpbjMycygpKSB7CisgICAgICAgIC8qIE9ubHkgQ0xBU1NFU19ST09UIGlzIHN1cHBvcnRlZCAqLworICAgICAgICBtYWNoaW5lcGF0aCA9IGdldHB5dGhvbnJlZ3BhdGgoSEtFWV9DTEFTU0VTX1JPT1QsIFRSVUUpOworICAgICAgICB1c2VycGF0aCA9IE5VTEw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbWFjaGluZXBhdGggPSBnZXRweXRob25yZWdwYXRoKEhLRVlfTE9DQUxfTUFDSElORSwgRkFMU0UpOworICAgICAgICB1c2VycGF0aCA9IGdldHB5dGhvbnJlZ3BhdGgoSEtFWV9DVVJSRU5UX1VTRVIsIEZBTFNFKTsKKyAgICB9CiAjZW5kaWYKIAotCWdldF9wcm9ncGF0aCgpOwotCXN0cmNweShhcmd2MF9wYXRoLCBwcm9ncGF0aCk7Ci0JcmVkdWNlKGFyZ3YwX3BhdGgpOwotCWlmIChweXRob25ob21lID09IE5VTEwgfHwgKnB5dGhvbmhvbWUgPT0gJ1wwJykgewotCQlpZiAoc2VhcmNoX2Zvcl9wcmVmaXgoYXJndjBfcGF0aCwgTEFORE1BUkspKQotCQkJcHl0aG9uaG9tZSA9IHByZWZpeDsKLQkJZWxzZQotCQkJcHl0aG9uaG9tZSA9IE5VTEw7Ci0JfQotCWVsc2UgewotICAgICAgICBjaGFyICpkZWxpbTsKKyAgICBnZXRfcHJvZ3BhdGgoKTsKKyAgICBzdHJjcHkoYXJndjBfcGF0aCwgcHJvZ3BhdGgpOworICAgIHJlZHVjZShhcmd2MF9wYXRoKTsKKyAgICBpZiAocHl0aG9uaG9tZSA9PSBOVUxMIHx8ICpweXRob25ob21lID09ICdcMCcpIHsKKyAgICAgICAgaWYgKHNlYXJjaF9mb3JfcHJlZml4KGFyZ3YwX3BhdGgsIExBTkRNQVJLKSkKKyAgICAgICAgICAgIHB5dGhvbmhvbWUgPSBwcmVmaXg7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHB5dGhvbmhvbWUgPSBOVUxMOworICAgIH0KKyAgICBlbHNlIHsKKyAgICBjaGFyICpkZWxpbTsKIAotCQlzdHJjcHkocHJlZml4LCBweXRob25ob21lKTsKKyAgICAgICAgc3RyY3B5KHByZWZpeCwgcHl0aG9uaG9tZSk7CiAKLSAgICAgICAgLyogRXh0cmFjdCBBbnkgT3B0aW9uYWwgVHJhaWxpbmcgRVhFQ19QUkVGSVggKi8KLSAgICAgICAgLyogZS5nLiBQWVRIT05IT01FPTxwcmVmaXg+OjxleGVjX3ByZWZpeD4gICAqLwotICAgICAgICBkZWxpbSA9IHN0cmNocihwcmVmaXgsIERFTElNKTsKLSAgICAgICAgaWYgKGRlbGltKSB7Ci0gICAgICAgICAgICAqZGVsaW0gPSAnXDAnOwotICAgICAgICAgICAgc3RyY3B5KGV4ZWNfcHJlZml4LCBkZWxpbSsxKTsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICBzdHJjcHkoZXhlY19wcmVmaXgsIEVYRUNfUFJFRklYKTsKKyAgICAvKiBFeHRyYWN0IEFueSBPcHRpb25hbCBUcmFpbGluZyBFWEVDX1BSRUZJWCAqLworICAgIC8qIGUuZy4gUFlUSE9OSE9NRT08cHJlZml4Pjo8ZXhlY19wcmVmaXg+ICAgKi8KKyAgICBkZWxpbSA9IHN0cmNocihwcmVmaXgsIERFTElNKTsKKyAgICBpZiAoZGVsaW0pIHsKKyAgICAgICAgKmRlbGltID0gJ1wwJzsKKyAgICAgICAgc3RyY3B5KGV4ZWNfcHJlZml4LCBkZWxpbSsxKTsKKyAgICB9IGVsc2UKKyAgICAgICAgc3RyY3B5KGV4ZWNfcHJlZml4LCBFWEVDX1BSRUZJWCk7CiAgICAgfQogCi0JaWYgKGVudnBhdGggJiYgKmVudnBhdGggPT0gJ1wwJykKLQkJZW52cGF0aCA9IE5VTEw7CisgICAgaWYgKGVudnBhdGggJiYgKmVudnBhdGggPT0gJ1wwJykKKyAgICAgICAgZW52cGF0aCA9IE5VTEw7CiAKLQkvKiBXZSBuZWVkIHRvIGNvbnN0cnVjdCBhIHBhdGggZnJvbSB0aGUgZm9sbG93aW5nIHBhcnRzOgotCSAgICgxKSB0aGUgUFlUSE9OUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZSwgaWYgc2V0OwotCSAgICgyKSBmb3IgV2luMzIsIHRoZSBtYWNoaW5lcGF0aCBhbmQgdXNlcnBhdGgsIGlmIHNldDsKLQkgICAoMykgdGhlIFBZVEhPTlBBVEggY29uZmlnIG1hY3JvLCB3aXRoIHRoZSBsZWFkaW5nICIuIgotCSAgICAgICBvZiBlYWNoIGNvbXBvbmVudCByZXBsYWNlZCB3aXRoIHB5dGhvbmhvbWUsIGlmIHNldDsKLQkgICAoNCkgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBleGVjdXRhYmxlIChhcmd2MF9wYXRoKS4KLQkgICBUaGUgbGVuZ3RoIGNhbGN1bGF0aW9uIGNhbGN1bGF0ZXMgIzMgZmlyc3QuCi0JKi8KKyAgICAvKiBXZSBuZWVkIHRvIGNvbnN0cnVjdCBhIHBhdGggZnJvbSB0aGUgZm9sbG93aW5nIHBhcnRzOgorICAgICAgICgxKSB0aGUgUFlUSE9OUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZSwgaWYgc2V0OworICAgICAgICgyKSBmb3IgV2luMzIsIHRoZSBtYWNoaW5lcGF0aCBhbmQgdXNlcnBhdGgsIGlmIHNldDsKKyAgICAgICAoMykgdGhlIFBZVEhPTlBBVEggY29uZmlnIG1hY3JvLCB3aXRoIHRoZSBsZWFkaW5nICIuIgorICAgICAgICAgICBvZiBlYWNoIGNvbXBvbmVudCByZXBsYWNlZCB3aXRoIHB5dGhvbmhvbWUsIGlmIHNldDsKKyAgICAgICAoNCkgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBleGVjdXRhYmxlIChhcmd2MF9wYXRoKS4KKyAgICAgICBUaGUgbGVuZ3RoIGNhbGN1bGF0aW9uIGNhbGN1bGF0ZXMgIzMgZmlyc3QuCisgICAgKi8KIAotCS8qIENhbGN1bGF0ZSBzaXplIG9mIHJldHVybiBidWZmZXIgKi8KLQlpZiAocHl0aG9uaG9tZSAhPSBOVUxMKSB7Ci0JCWNoYXIgKnA7Ci0JCWJ1ZnN6ID0gMTsJCi0JCWZvciAocCA9IFBZVEhPTlBBVEg7ICpwOyBwKyspIHsKLQkJCWlmICgqcCA9PSBERUxJTSkKLQkJCQlidWZzeisrOyAvKiBudW1iZXIgb2YgREVMSU0gcGx1cyBvbmUgKi8KLQkJfQotCQlidWZzeiAqPSBzdHJsZW4ocHl0aG9uaG9tZSk7Ci0JfQotCWVsc2UKLQkJYnVmc3ogPSAwOwotCWJ1ZnN6ICs9IHN0cmxlbihQWVRIT05QQVRIKSArIDE7Ci0JaWYgKGVudnBhdGggIT0gTlVMTCkKLQkJYnVmc3ogKz0gc3RybGVuKGVudnBhdGgpICsgMTsKLQlidWZzeiArPSBzdHJsZW4oYXJndjBfcGF0aCkgKyAxOworICAgIC8qIENhbGN1bGF0ZSBzaXplIG9mIHJldHVybiBidWZmZXIgKi8KKyAgICBpZiAocHl0aG9uaG9tZSAhPSBOVUxMKSB7CisgICAgICAgIGNoYXIgKnA7CisgICAgICAgIGJ1ZnN6ID0gMTsKKyAgICAgICAgZm9yIChwID0gUFlUSE9OUEFUSDsgKnA7IHArKykgeworICAgICAgICAgICAgaWYgKCpwID09IERFTElNKQorICAgICAgICAgICAgICAgIGJ1ZnN6Kys7IC8qIG51bWJlciBvZiBERUxJTSBwbHVzIG9uZSAqLworICAgICAgICB9CisgICAgICAgIGJ1ZnN6ICo9IHN0cmxlbihweXRob25ob21lKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBidWZzeiA9IDA7CisgICAgYnVmc3ogKz0gc3RybGVuKFBZVEhPTlBBVEgpICsgMTsKKyAgICBpZiAoZW52cGF0aCAhPSBOVUxMKQorICAgICAgICBidWZzeiArPSBzdHJsZW4oZW52cGF0aCkgKyAxOworICAgIGJ1ZnN6ICs9IHN0cmxlbihhcmd2MF9wYXRoKSArIDE7CiAjaWZkZWYgTVNfV0lOMzIKLQlpZiAobWFjaGluZXBhdGgpCi0JCWJ1ZnN6ICs9IHN0cmxlbihtYWNoaW5lcGF0aCkgKyAxOwotCWlmICh1c2VycGF0aCkKLQkJYnVmc3ogKz0gc3RybGVuKHVzZXJwYXRoKSArIDE7CisgICAgaWYgKG1hY2hpbmVwYXRoKQorICAgICAgICBidWZzeiArPSBzdHJsZW4obWFjaGluZXBhdGgpICsgMTsKKyAgICBpZiAodXNlcnBhdGgpCisgICAgICAgIGJ1ZnN6ICs9IHN0cmxlbih1c2VycGF0aCkgKyAxOwogI2VuZGlmCiAKLQltb2R1bGVfc2VhcmNoX3BhdGggPSBidWYgPSBtYWxsb2MoYnVmc3opOwotCWlmIChidWYgPT0gTlVMTCkgewotCQkvKiBXZSBjYW4ndCBleGl0LCBzbyBwcmludCBhIHdhcm5pbmcgYW5kIGxpbXAgYWxvbmcgKi8KLQkJZnByaW50ZihzdGRlcnIsICJDYW4ndCBtYWxsb2MgZHluYW1pYyBQWVRIT05QQVRILlxuIik7Ci0JCWlmIChlbnZwYXRoKSB7Ci0JCQlmcHJpbnRmKHN0ZGVyciwgIlVzaW5nIGRlZmF1bHQgc3RhdGljICRQWVRIT05QQVRILlxuIik7Ci0JCQltb2R1bGVfc2VhcmNoX3BhdGggPSBlbnZwYXRoOwotCQl9Ci0JCWVsc2UgewotCQkJZnByaW50ZihzdGRlcnIsICJVc2luZyBlbnZpcm9ubWVudCAkUFlUSE9OUEFUSC5cbiIpOwotCQkJbW9kdWxlX3NlYXJjaF9wYXRoID0gUFlUSE9OUEFUSDsKLQkJfQotCQlyZXR1cm47Ci0JfQorICAgIG1vZHVsZV9zZWFyY2hfcGF0aCA9IGJ1ZiA9IG1hbGxvYyhidWZzeik7CisgICAgaWYgKGJ1ZiA9PSBOVUxMKSB7CisgICAgICAgIC8qIFdlIGNhbid0IGV4aXQsIHNvIHByaW50IGEgd2FybmluZyBhbmQgbGltcCBhbG9uZyAqLworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNhbid0IG1hbGxvYyBkeW5hbWljIFBZVEhPTlBBVEguXG4iKTsKKyAgICAgICAgaWYgKGVudnBhdGgpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVXNpbmcgZGVmYXVsdCBzdGF0aWMgJFBZVEhPTlBBVEguXG4iKTsKKyAgICAgICAgICAgIG1vZHVsZV9zZWFyY2hfcGF0aCA9IGVudnBhdGg7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVzaW5nIGVudmlyb25tZW50ICRQWVRIT05QQVRILlxuIik7CisgICAgICAgICAgICBtb2R1bGVfc2VhcmNoX3BhdGggPSBQWVRIT05QQVRIOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9CiAKLQlpZiAoZW52cGF0aCkgewotCQlzdHJjcHkoYnVmLCBlbnZwYXRoKTsKLQkJYnVmID0gc3RyY2hyKGJ1ZiwgJ1wwJyk7Ci0JCSpidWYrKyA9IERFTElNOwotCX0KKyAgICBpZiAoZW52cGF0aCkgeworICAgICAgICBzdHJjcHkoYnVmLCBlbnZwYXRoKTsKKyAgICAgICAgYnVmID0gc3RyY2hyKGJ1ZiwgJ1wwJyk7CisgICAgICAgICpidWYrKyA9IERFTElNOworICAgIH0KICNpZmRlZiBNU19XSU4zMgotCWlmIChtYWNoaW5lcGF0aCkgewotCQlzdHJjcHkoYnVmLCBtYWNoaW5lcGF0aCk7Ci0JCWJ1ZiA9IHN0cmNocihidWYsICdcMCcpOwotCQkqYnVmKysgPSBERUxJTTsKLQl9Ci0JaWYgKHVzZXJwYXRoKSB7Ci0JCXN0cmNweShidWYsIHVzZXJwYXRoKTsKLQkJYnVmID0gc3RyY2hyKGJ1ZiwgJ1wwJyk7Ci0JCSpidWYrKyA9IERFTElNOwotCX0KKyAgICBpZiAobWFjaGluZXBhdGgpIHsKKyAgICAgICAgc3RyY3B5KGJ1ZiwgbWFjaGluZXBhdGgpOworICAgICAgICBidWYgPSBzdHJjaHIoYnVmLCAnXDAnKTsKKyAgICAgICAgKmJ1ZisrID0gREVMSU07CisgICAgfQorICAgIGlmICh1c2VycGF0aCkgeworICAgICAgICBzdHJjcHkoYnVmLCB1c2VycGF0aCk7CisgICAgICAgIGJ1ZiA9IHN0cmNocihidWYsICdcMCcpOworICAgICAgICAqYnVmKysgPSBERUxJTTsKKyAgICB9CiAjZW5kaWYKLQlpZiAocHl0aG9uaG9tZSA9PSBOVUxMKSB7Ci0JCXN0cmNweShidWYsIFBZVEhPTlBBVEgpOwotCQlidWYgPSBzdHJjaHIoYnVmLCAnXDAnKTsKLQl9Ci0JZWxzZSB7Ci0JCWNoYXIgKnAgPSBQWVRIT05QQVRIOwotCQljaGFyICpxOwotCQlpbnQgbjsKLQkJZm9yICg7OykgewotCQkJcSA9IHN0cmNocihwLCBERUxJTSk7Ci0JCQlpZiAocSA9PSBOVUxMKQotCQkJCW4gPSBzdHJsZW4ocCk7Ci0JCQllbHNlCi0JCQkJbiA9IHEtcDsKLQkJCWlmIChwWzBdID09ICcuJyAmJiBpc19zZXAocFsxXSkpIHsKLQkJCQlzdHJjcHkoYnVmLCBweXRob25ob21lKTsKLQkJCQlidWYgPSBzdHJjaHIoYnVmLCAnXDAnKTsKLQkJCQlwKys7Ci0JCQkJbi0tOwotCQkJfQotCQkJc3RybmNweShidWYsIHAsIG4pOwotCQkJYnVmICs9IG47Ci0JCQlpZiAocSA9PSBOVUxMKQotCQkJCWJyZWFrOwotCQkJKmJ1ZisrID0gREVMSU07Ci0JCQlwID0gcSsxOwotCQl9Ci0JfQotCWlmIChhcmd2MF9wYXRoKSB7Ci0JCSpidWYrKyA9IERFTElNOwotCQlzdHJjcHkoYnVmLCBhcmd2MF9wYXRoKTsKLQkJYnVmID0gc3RyY2hyKGJ1ZiwgJ1wwJyk7Ci0JfQotCSpidWYgPSAnXDAnOworICAgIGlmIChweXRob25ob21lID09IE5VTEwpIHsKKyAgICAgICAgc3RyY3B5KGJ1ZiwgUFlUSE9OUEFUSCk7CisgICAgICAgIGJ1ZiA9IHN0cmNocihidWYsICdcMCcpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgY2hhciAqcCA9IFBZVEhPTlBBVEg7CisgICAgICAgIGNoYXIgKnE7CisgICAgICAgIGludCBuOworICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICBxID0gc3RyY2hyKHAsIERFTElNKTsKKyAgICAgICAgICAgIGlmIChxID09IE5VTEwpCisgICAgICAgICAgICAgICAgbiA9IHN0cmxlbihwKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBuID0gcS1wOworICAgICAgICAgICAgaWYgKHBbMF0gPT0gJy4nICYmIGlzX3NlcChwWzFdKSkgeworICAgICAgICAgICAgICAgIHN0cmNweShidWYsIHB5dGhvbmhvbWUpOworICAgICAgICAgICAgICAgIGJ1ZiA9IHN0cmNocihidWYsICdcMCcpOworICAgICAgICAgICAgICAgIHArKzsKKyAgICAgICAgICAgICAgICBuLS07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdHJuY3B5KGJ1ZiwgcCwgbik7CisgICAgICAgICAgICBidWYgKz0gbjsKKyAgICAgICAgICAgIGlmIChxID09IE5VTEwpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAqYnVmKysgPSBERUxJTTsKKyAgICAgICAgICAgIHAgPSBxKzE7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGFyZ3YwX3BhdGgpIHsKKyAgICAgICAgKmJ1ZisrID0gREVMSU07CisgICAgICAgIHN0cmNweShidWYsIGFyZ3YwX3BhdGgpOworICAgICAgICBidWYgPSBzdHJjaHIoYnVmLCAnXDAnKTsKKyAgICB9CisgICAgKmJ1ZiA9ICdcMCc7CiB9CiAKIApAQCAtNDQ4LDM1ICs0NDgsMzUgQEAKIGNoYXIgKgogUHlfR2V0UGF0aCh2b2lkKQogewotCWlmICghbW9kdWxlX3NlYXJjaF9wYXRoKQotCQljYWxjdWxhdGVfcGF0aCgpOworICAgIGlmICghbW9kdWxlX3NlYXJjaF9wYXRoKQorICAgICAgICBjYWxjdWxhdGVfcGF0aCgpOwogCi0JcmV0dXJuIG1vZHVsZV9zZWFyY2hfcGF0aDsKKyAgICByZXR1cm4gbW9kdWxlX3NlYXJjaF9wYXRoOwogfQogCiBjaGFyICoKIFB5X0dldFByZWZpeCh2b2lkKQogewotCWlmICghbW9kdWxlX3NlYXJjaF9wYXRoKQotCQljYWxjdWxhdGVfcGF0aCgpOworICAgIGlmICghbW9kdWxlX3NlYXJjaF9wYXRoKQorICAgICAgICBjYWxjdWxhdGVfcGF0aCgpOwogCi0JcmV0dXJuIHByZWZpeDsKKyAgICByZXR1cm4gcHJlZml4OwogfQogCiBjaGFyICoKIFB5X0dldEV4ZWNQcmVmaXgodm9pZCkKIHsKLQlpZiAoIW1vZHVsZV9zZWFyY2hfcGF0aCkKLQkJY2FsY3VsYXRlX3BhdGgoKTsKKyAgICBpZiAoIW1vZHVsZV9zZWFyY2hfcGF0aCkKKyAgICAgICAgY2FsY3VsYXRlX3BhdGgoKTsKIAotCXJldHVybiBleGVjX3ByZWZpeDsKKyAgICByZXR1cm4gZXhlY19wcmVmaXg7CiB9CiAKIGNoYXIgKgogUHlfR2V0UHJvZ3JhbUZ1bGxQYXRoKHZvaWQpCiB7Ci0JaWYgKCFtb2R1bGVfc2VhcmNoX3BhdGgpCi0JCWNhbGN1bGF0ZV9wYXRoKCk7CisgICAgaWYgKCFtb2R1bGVfc2VhcmNoX3BhdGgpCisgICAgICAgIGNhbGN1bGF0ZV9wYXRoKCk7CiAKLQlyZXR1cm4gcHJvZ3BhdGg7CisgICAgcmV0dXJuIHByb2dwYXRoOwogfQpkaWZmIC0tZ2l0IGEvUEMvd2luc291bmQuYyBiL1BDL3dpbnNvdW5kLmMKaW5kZXggZTZmZjIyNi4uMDUzMDVkMiAxMDA2NDQKLS0tIGEvUEMvd2luc291bmQuYworKysgYi9QQy93aW5zb3VuZC5jCkBAIC03OCwxNCArNzgsMTQgQEAKICAgICBpbnQgb2s7CiAKICAgICBpZighUHlBcmdfUGFyc2VUdXBsZShhcmdzLCJ6I2k6UGxheVNvdW5kIiwmc291bmQsJmxlbmd0aCwmZmxhZ3MpKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBOVUxMOwogICAgIH0KIAogICAgIGlmKGZsYWdzJlNORF9BU1lOQyAmJiBmbGFncyAmU05EX01FTU9SWSkgewotCS8qIFNpZGVzdGVwIHJlZmVyZW5jZSBjb3VudGluZyBoZWFkYWNoZTsgdW5mb3J0dW5hdGVseSB0aGlzIGFsc28KLQkgICBwcmV2ZW50IFNORF9MT09QIGZyb20gbWVtb3J5LiAqLwotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCJDYW5ub3QgcGxheSBhc3luY2hyb25vdXNseSBmcm9tIG1lbW9yeSIpOwotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAvKiBTaWRlc3RlcCByZWZlcmVuY2UgY291bnRpbmcgaGVhZGFjaGU7IHVuZm9ydHVuYXRlbHkgdGhpcyBhbHNvCisgICAgICAgcHJldmVudCBTTkRfTE9PUCBmcm9tIG1lbW9yeS4gKi8KKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCJDYW5ub3QgcGxheSBhc3luY2hyb25vdXNseSBmcm9tIG1lbW9yeSIpOworICAgIHJldHVybiBOVUxMOwogICAgIH0KIAogICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKQEAgLTkzLDggKzkzLDggQEAKICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogICAgIGlmKCFvaykKICAgICB7Ci0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsIkZhaWxlZCB0byBwbGF5IHNvdW5kIik7Ci0gICAgICAgIHJldHVybiBOVUxMOworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsIkZhaWxlZCB0byBwbGF5IHNvdW5kIik7CisgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCiAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwpAQCAtMTA0LDQwICsxMDQsNDAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzb3VuZF9iZWVwKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgZnJlcTsKLQlpbnQgZHVyOwotCUJPT0wgb2s7CisgICAgaW50IGZyZXE7CisgICAgaW50IGR1cjsKKyAgICBCT09MIG9rOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpaTpCZWVwIiwgJmZyZXEsICAmZHVyKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpaTpCZWVwIiwgJmZyZXEsICAmZHVyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoZnJlcSA8IDM3IHx8IGZyZXEgPiAzMjc2NykgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkiZnJlcXVlbmN5IG11c3QgYmUgaW4gMzcgdGhydSAzMjc2NyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKGZyZXEgPCAzNyB8fCBmcmVxID4gMzI3NjcpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiZnJlcXVlbmN5IG11c3QgYmUgaW4gMzcgdGhydSAzMjc2NyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0Jb2sgPSBCZWVwKGZyZXEsIGR1cik7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQlpZiAoIW9rKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsIkZhaWxlZCB0byBiZWVwIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgb2sgPSBCZWVwKGZyZXEsIGR1cik7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBpZiAoIW9rKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsIkZhaWxlZCB0byBiZWVwIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzb3VuZF9tc2diZWVwKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgeCA9IE1CX09LOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifGk6TWVzc2FnZUJlZXAiLCAmeCkpCi0JCXJldHVybiBOVUxMOwotCU1lc3NhZ2VCZWVwKHgpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpbnQgeCA9IE1CX09LOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifGk6TWVzc2FnZUJlZXAiLCAmeCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE1lc3NhZ2VCZWVwKHgpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIHN0cnVjdCBQeU1ldGhvZERlZiBzb3VuZF9tZXRob2RzW10gPQpAQCAtMTU1LDcgKzE1NSw3IEBACiAgICAgUHlPYmplY3QgKnY9UHlMb25nX0Zyb21Mb25nKHZhbHVlKTsKICAgICBpZih2JiZrKQogICAgIHsKLSAgICAgICAgUHlEaWN0X1NldEl0ZW0oZGljdCxrLHYpOworICAgIFB5RGljdF9TZXRJdGVtKGRpY3Qsayx2KTsKICAgICB9CiAgICAgUHlfWERFQ1JFRihrKTsKICAgICBQeV9YREVDUkVGKHYpOwpAQCAtMTY2LDI4ICsxNjYsMjggQEAKIFB5TU9ESU5JVF9GVU5DCiBpbml0d2luc291bmQodm9pZCkKIHsKLQlQeU9iamVjdCAqZGljdDsKLQlQeU9iamVjdCAqbW9kdWxlID0gUHlfSW5pdE1vZHVsZTMoIndpbnNvdW5kIiwKLQkJCQkJICBzb3VuZF9tZXRob2RzLAotCQkJCQkgIHNvdW5kX21vZHVsZV9kb2MpOwotCWlmIChtb2R1bGUgPT0gTlVMTCkKLQkJcmV0dXJuOwotCWRpY3QgPSBQeU1vZHVsZV9HZXREaWN0KG1vZHVsZSk7CisgICAgUHlPYmplY3QgKmRpY3Q7CisgICAgUHlPYmplY3QgKm1vZHVsZSA9IFB5X0luaXRNb2R1bGUzKCJ3aW5zb3VuZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdW5kX21ldGhvZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdW5kX21vZHVsZV9kb2MpOworICAgIGlmIChtb2R1bGUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOworICAgIGRpY3QgPSBQeU1vZHVsZV9HZXREaWN0KG1vZHVsZSk7CiAKLQlBRERfREVGSU5FKFNORF9BU1lOQyk7Ci0JQUREX0RFRklORShTTkRfTk9ERUZBVUxUKTsKLQlBRERfREVGSU5FKFNORF9OT1NUT1ApOwotCUFERF9ERUZJTkUoU05EX05PV0FJVCk7Ci0JQUREX0RFRklORShTTkRfQUxJQVMpOwotCUFERF9ERUZJTkUoU05EX0ZJTEVOQU1FKTsKLQlBRERfREVGSU5FKFNORF9NRU1PUlkpOwotCUFERF9ERUZJTkUoU05EX1BVUkdFKTsKLQlBRERfREVGSU5FKFNORF9MT09QKTsKLQlBRERfREVGSU5FKFNORF9BUFBMSUNBVElPTik7CisgICAgQUREX0RFRklORShTTkRfQVNZTkMpOworICAgIEFERF9ERUZJTkUoU05EX05PREVGQVVMVCk7CisgICAgQUREX0RFRklORShTTkRfTk9TVE9QKTsKKyAgICBBRERfREVGSU5FKFNORF9OT1dBSVQpOworICAgIEFERF9ERUZJTkUoU05EX0FMSUFTKTsKKyAgICBBRERfREVGSU5FKFNORF9GSUxFTkFNRSk7CisgICAgQUREX0RFRklORShTTkRfTUVNT1JZKTsKKyAgICBBRERfREVGSU5FKFNORF9QVVJHRSk7CisgICAgQUREX0RFRklORShTTkRfTE9PUCk7CisgICAgQUREX0RFRklORShTTkRfQVBQTElDQVRJT04pOwogCi0JQUREX0RFRklORShNQl9PSyk7Ci0JQUREX0RFRklORShNQl9JQ09OQVNURVJJU0spOwotCUFERF9ERUZJTkUoTUJfSUNPTkVYQ0xBTUFUSU9OKTsKLQlBRERfREVGSU5FKE1CX0lDT05IQU5EKTsKLQlBRERfREVGSU5FKE1CX0lDT05RVUVTVElPTik7CisgICAgQUREX0RFRklORShNQl9PSyk7CisgICAgQUREX0RFRklORShNQl9JQ09OQVNURVJJU0spOworICAgIEFERF9ERUZJTkUoTUJfSUNPTkVYQ0xBTUFUSU9OKTsKKyAgICBBRERfREVGSU5FKE1CX0lDT05IQU5EKTsKKyAgICBBRERfREVGSU5FKE1CX0lDT05RVUVTVElPTik7CiB9CmRpZmYgLS1naXQgYS9QQ2J1aWxkL21ha2VfYnVpbGRpbmZvLmMgYi9QQ2J1aWxkL21ha2VfYnVpbGRpbmZvLmMKaW5kZXggMjJiOTg4Mi4uNWEzZDM4NSAxMDA2NDQKLS0tIGEvUENidWlsZC9tYWtlX2J1aWxkaW5mby5jCisrKyBiL1BDYnVpbGQvbWFrZV9idWlsZGluZm8uYwpAQCAtMjMsNzIgKzIzLDcyIEBACiAKIGludCBtYWtlX2J1aWxkaW5mbzIoKQogewotCXN0cnVjdCBfc3RhdCBzdDsKLQlIS0VZIGhUb3J0b2lzZTsKLQljaGFyIGNvbW1hbmRbQ01EX1NJWkUrMV07Ci0JRFdPUkQgdHlwZSwgc2l6ZTsKLQlpZiAoX3N0YXQoIi5zdm4iLCAmc3QpIDwgMCkKLQkJcmV0dXJuIDA7Ci0JLyogQWxsb3cgc3VwcHJlc3Npb24gb2Ygc3Vid2NyZXYuZXhlIGludm9jYXRpb24gaWYgYSBub19zdWJ3Y3JldiBmaWxlIGlzIHByZXNlbnQuICovCi0JaWYgKF9zdGF0KCJub19zdWJ3Y3JldiIsICZzdCkgPT0gMCkKLQkJcmV0dXJuIDA7Ci0JaWYgKFJlZ09wZW5LZXkoSEtFWV9MT0NBTF9NQUNISU5FLCAiU29mdHdhcmVcXFRvcnRvaXNlU1ZOIiwgJmhUb3J0b2lzZSkgIT0gRVJST1JfU1VDQ0VTUyAmJgotCSAgICBSZWdPcGVuS2V5KEhLRVlfQ1VSUkVOVF9VU0VSLCAiU29mdHdhcmVcXFRvcnRvaXNlU1ZOIiwgJmhUb3J0b2lzZSkgIT0gRVJST1JfU1VDQ0VTUykKLQkJLyogVG9ydG9pc2Ugbm90IGluc3RhbGxlZCAqLwotCQlyZXR1cm4gMDsKLQljb21tYW5kWzBdID0gJyInOyAgLyogcXVvdGUgdGhlIHBhdGggdG8gdGhlIGV4ZWN1dGFibGUgKi8KLQlzaXplID0gc2l6ZW9mKGNvbW1hbmQpIC0gMTsKLQlpZiAoUmVnUXVlcnlWYWx1ZUV4KGhUb3J0b2lzZSwgIkRpcmVjdG9yeSIsIDAsICZ0eXBlLCBjb21tYW5kKzEsICZzaXplKSAhPSBFUlJPUl9TVUNDRVNTIHx8Ci0JICAgIHR5cGUgIT0gUkVHX1NaKQotCQkvKiBSZWdpc3RyeSBjb3JydXB0ZWQgKi8KLQkJcmV0dXJuIDA7Ci0Jc3RyY2F0X3MoY29tbWFuZCwgQ01EX1NJWkUsICJiaW5cXHN1YndjcmV2LmV4ZSIpOwotCWlmIChfc3RhdChjb21tYW5kKzEsICZzdCkgPCAwKQotCQkvKiBzdWJ3Y3Jldi5leGUgbm90IHBhcnQgb2YgdGhlIHJlbGVhc2UgKi8KLQkJcmV0dXJuIDA7Ci0Jc3RyY2F0X3MoY29tbWFuZCwgQ01EX1NJWkUsICJcIiAuLiAuLlxcTW9kdWxlc1xcZ2V0YnVpbGRpbmZvLmMgZ2V0YnVpbGRpbmZvMi5jIik7Ci0JcHV0cyhjb21tYW5kKTsgZmZsdXNoKHN0ZG91dCk7Ci0JaWYgKHN5c3RlbShjb21tYW5kKSA8IDApCi0JCXJldHVybiAwOwotCXJldHVybiAxOworICAgIHN0cnVjdCBfc3RhdCBzdDsKKyAgICBIS0VZIGhUb3J0b2lzZTsKKyAgICBjaGFyIGNvbW1hbmRbQ01EX1NJWkUrMV07CisgICAgRFdPUkQgdHlwZSwgc2l6ZTsKKyAgICBpZiAoX3N0YXQoIi5zdm4iLCAmc3QpIDwgMCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgLyogQWxsb3cgc3VwcHJlc3Npb24gb2Ygc3Vid2NyZXYuZXhlIGludm9jYXRpb24gaWYgYSBub19zdWJ3Y3JldiBmaWxlIGlzIHByZXNlbnQuICovCisgICAgaWYgKF9zdGF0KCJub19zdWJ3Y3JldiIsICZzdCkgPT0gMCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKFJlZ09wZW5LZXkoSEtFWV9MT0NBTF9NQUNISU5FLCAiU29mdHdhcmVcXFRvcnRvaXNlU1ZOIiwgJmhUb3J0b2lzZSkgIT0gRVJST1JfU1VDQ0VTUyAmJgorICAgICAgICBSZWdPcGVuS2V5KEhLRVlfQ1VSUkVOVF9VU0VSLCAiU29mdHdhcmVcXFRvcnRvaXNlU1ZOIiwgJmhUb3J0b2lzZSkgIT0gRVJST1JfU1VDQ0VTUykKKyAgICAgICAgLyogVG9ydG9pc2Ugbm90IGluc3RhbGxlZCAqLworICAgICAgICByZXR1cm4gMDsKKyAgICBjb21tYW5kWzBdID0gJyInOyAgLyogcXVvdGUgdGhlIHBhdGggdG8gdGhlIGV4ZWN1dGFibGUgKi8KKyAgICBzaXplID0gc2l6ZW9mKGNvbW1hbmQpIC0gMTsKKyAgICBpZiAoUmVnUXVlcnlWYWx1ZUV4KGhUb3J0b2lzZSwgIkRpcmVjdG9yeSIsIDAsICZ0eXBlLCBjb21tYW5kKzEsICZzaXplKSAhPSBFUlJPUl9TVUNDRVNTIHx8CisgICAgICAgIHR5cGUgIT0gUkVHX1NaKQorICAgICAgICAvKiBSZWdpc3RyeSBjb3JydXB0ZWQgKi8KKyAgICAgICAgcmV0dXJuIDA7CisgICAgc3RyY2F0X3MoY29tbWFuZCwgQ01EX1NJWkUsICJiaW5cXHN1YndjcmV2LmV4ZSIpOworICAgIGlmIChfc3RhdChjb21tYW5kKzEsICZzdCkgPCAwKQorICAgICAgICAvKiBzdWJ3Y3Jldi5leGUgbm90IHBhcnQgb2YgdGhlIHJlbGVhc2UgKi8KKyAgICAgICAgcmV0dXJuIDA7CisgICAgc3RyY2F0X3MoY29tbWFuZCwgQ01EX1NJWkUsICJcIiAuLiAuLlxcTW9kdWxlc1xcZ2V0YnVpbGRpbmZvLmMgZ2V0YnVpbGRpbmZvMi5jIik7CisgICAgcHV0cyhjb21tYW5kKTsgZmZsdXNoKHN0ZG91dCk7CisgICAgaWYgKHN5c3RlbShjb21tYW5kKSA8IDApCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiAxOwogfQogCiBpbnQgbWFpbihpbnQgYXJnYywgY2hhciphcmd2W10pCiB7Ci0JY2hhciBjb21tYW5kWzUwMF0gPSAiY2wuZXhlIC1jIC1EX1dJTjMyIC1EVVNFX0RMX0VYUE9SVCAtRF9XSU5ET1dTIC1EV0lOMzIgLURfV0lORExMICI7Ci0JaW50IGRvX3VubGluaywgcmVzdWx0OwotCWlmIChhcmdjICE9IDIpIHsKLQkJZnByaW50ZihzdGRlcnIsICJtYWtlX2J1aWxkaW5mbyAkKENvbmZpZ3VyYXRpb25OYW1lKVxuIik7Ci0JCXJldHVybiBFWElUX0ZBSUxVUkU7Ci0JfQotCWlmIChzdHJjbXAoYXJndlsxXSwgIlJlbGVhc2UiKSA9PSAwKSB7Ci0JCXN0cmNhdF9zKGNvbW1hbmQsIENNRF9TSVpFLCAiLU1EICIpOwotCX0KLQllbHNlIGlmIChzdHJjbXAoYXJndlsxXSwgIkRlYnVnIikgPT0gMCkgewotCQlzdHJjYXRfcyhjb21tYW5kLCBDTURfU0laRSwgIi1EX0RFQlVHIC1NRGQgIik7Ci0JfQotCWVsc2UgaWYgKHN0cmNtcChhcmd2WzFdLCAiUmVsZWFzZUl0YW5pdW0iKSA9PSAwKSB7Ci0JCXN0cmNhdF9zKGNvbW1hbmQsIENNRF9TSVpFLCAiLU1EIC9VU0VDTDpNU19JVEFOSVVNICIpOwotCX0KLQllbHNlIGlmIChzdHJjbXAoYXJndlsxXSwgIlJlbGVhc2VBTUQ2NCIpID09IDApIHsKLQkJc3RyY2F0X3MoY29tbWFuZCwgQ01EX1NJWkUsICItTUQgIik7Ci0JCXN0cmNhdF9zKGNvbW1hbmQsIENNRF9TSVpFLCAiLU1EIC9VU0VDTDpNU19PUFRFUk9OICIpOwotCX0KLQllbHNlIHsKLQkJZnByaW50ZihzdGRlcnIsICJ1bnN1cHBvcnRlZCBjb25maWd1cmF0aW9uICVzXG4iLCBhcmd2WzFdKTsKLQkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKLQl9CisgICAgY2hhciBjb21tYW5kWzUwMF0gPSAiY2wuZXhlIC1jIC1EX1dJTjMyIC1EVVNFX0RMX0VYUE9SVCAtRF9XSU5ET1dTIC1EV0lOMzIgLURfV0lORExMICI7CisgICAgaW50IGRvX3VubGluaywgcmVzdWx0OworICAgIGlmIChhcmdjICE9IDIpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJtYWtlX2J1aWxkaW5mbyAkKENvbmZpZ3VyYXRpb25OYW1lKVxuIik7CisgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgfQorICAgIGlmIChzdHJjbXAoYXJndlsxXSwgIlJlbGVhc2UiKSA9PSAwKSB7CisgICAgICAgIHN0cmNhdF9zKGNvbW1hbmQsIENNRF9TSVpFLCAiLU1EICIpOworICAgIH0KKyAgICBlbHNlIGlmIChzdHJjbXAoYXJndlsxXSwgIkRlYnVnIikgPT0gMCkgeworICAgICAgICBzdHJjYXRfcyhjb21tYW5kLCBDTURfU0laRSwgIi1EX0RFQlVHIC1NRGQgIik7CisgICAgfQorICAgIGVsc2UgaWYgKHN0cmNtcChhcmd2WzFdLCAiUmVsZWFzZUl0YW5pdW0iKSA9PSAwKSB7CisgICAgICAgIHN0cmNhdF9zKGNvbW1hbmQsIENNRF9TSVpFLCAiLU1EIC9VU0VDTDpNU19JVEFOSVVNICIpOworICAgIH0KKyAgICBlbHNlIGlmIChzdHJjbXAoYXJndlsxXSwgIlJlbGVhc2VBTUQ2NCIpID09IDApIHsKKyAgICAgICAgc3RyY2F0X3MoY29tbWFuZCwgQ01EX1NJWkUsICItTUQgIik7CisgICAgICAgIHN0cmNhdF9zKGNvbW1hbmQsIENNRF9TSVpFLCAiLU1EIC9VU0VDTDpNU19PUFRFUk9OICIpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJ1bnN1cHBvcnRlZCBjb25maWd1cmF0aW9uICVzXG4iLCBhcmd2WzFdKTsKKyAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICB9CiAKLQlpZiAoKGRvX3VubGluayA9IG1ha2VfYnVpbGRpbmZvMigpKSkKLQkJc3RyY2F0X3MoY29tbWFuZCwgQ01EX1NJWkUsICJnZXRidWlsZGluZm8yLmMgLURTVUJXQ1JFViAiKTsKLQllbHNlCi0JCXN0cmNhdF9zKGNvbW1hbmQsIENNRF9TSVpFLCAiLi5cXE1vZHVsZXNcXGdldGJ1aWxkaW5mby5jIik7Ci0Jc3RyY2F0X3MoY29tbWFuZCwgQ01EX1NJWkUsICIgLUZvZ2V0YnVpbGRpbmZvLm8gLUkuLlxcSW5jbHVkZSAtSS4uXFxQQyIpOwotCXB1dHMoY29tbWFuZCk7IGZmbHVzaChzdGRvdXQpOwotCXJlc3VsdCA9IHN5c3RlbShjb21tYW5kKTsKLQlpZiAoZG9fdW5saW5rKQotCQlfdW5saW5rKCJnZXRidWlsZGluZm8yLmMiKTsKLQlpZiAocmVzdWx0IDwgMCkKLQkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKLQlyZXR1cm4gMDsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisgICAgaWYgKChkb191bmxpbmsgPSBtYWtlX2J1aWxkaW5mbzIoKSkpCisgICAgICAgIHN0cmNhdF9zKGNvbW1hbmQsIENNRF9TSVpFLCAiZ2V0YnVpbGRpbmZvMi5jIC1EU1VCV0NSRVYgIik7CisgICAgZWxzZQorICAgICAgICBzdHJjYXRfcyhjb21tYW5kLCBDTURfU0laRSwgIi4uXFxNb2R1bGVzXFxnZXRidWlsZGluZm8uYyIpOworICAgIHN0cmNhdF9zKGNvbW1hbmQsIENNRF9TSVpFLCAiIC1Gb2dldGJ1aWxkaW5mby5vIC1JLi5cXEluY2x1ZGUgLUkuLlxcUEMiKTsKKyAgICBwdXRzKGNvbW1hbmQpOyBmZmx1c2goc3Rkb3V0KTsKKyAgICByZXN1bHQgPSBzeXN0ZW0oY29tbWFuZCk7CisgICAgaWYgKGRvX3VubGluaykKKyAgICAgICAgX3VubGluaygiZ2V0YnVpbGRpbmZvMi5jIik7CisgICAgaWYgKHJlc3VsdCA8IDApCisgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9QYXJzZXIvYWNjZWxlci5jIGIvUGFyc2VyL2FjY2VsZXIuYwppbmRleCBiNDFiMjY1Li45YjE0MjYzIDEwMDY0NAotLS0gYS9QYXJzZXIvYWNjZWxlci5jCisrKyBiL1BhcnNlci9hY2NlbGVyLmMKQEAgLTIzLDEwMyArMjMsMTAzIEBACiB2b2lkCiBQeUdyYW1tYXJfQWRkQWNjZWxlcmF0b3JzKGdyYW1tYXIgKmcpCiB7Ci0JZGZhICpkOwotCWludCBpOwotCWQgPSBnLT5nX2RmYTsKLQlmb3IgKGkgPSBnLT5nX25kZmFzOyAtLWkgPj0gMDsgZCsrKQotCQlmaXhkZmEoZywgZCk7Ci0JZy0+Z19hY2NlbCA9IDE7CisgICAgZGZhICpkOworICAgIGludCBpOworICAgIGQgPSBnLT5nX2RmYTsKKyAgICBmb3IgKGkgPSBnLT5nX25kZmFzOyAtLWkgPj0gMDsgZCsrKQorICAgICAgICBmaXhkZmEoZywgZCk7CisgICAgZy0+Z19hY2NlbCA9IDE7CiB9CiAKIHZvaWQKIFB5R3JhbW1hcl9SZW1vdmVBY2NlbGVyYXRvcnMoZ3JhbW1hciAqZykKIHsKLQlkZmEgKmQ7Ci0JaW50IGk7Ci0JZy0+Z19hY2NlbCA9IDA7Ci0JZCA9IGctPmdfZGZhOwotCWZvciAoaSA9IGctPmdfbmRmYXM7IC0taSA+PSAwOyBkKyspIHsKLQkJc3RhdGUgKnM7Ci0JCWludCBqOwotCQlzID0gZC0+ZF9zdGF0ZTsKLQkJZm9yIChqID0gMDsgaiA8IGQtPmRfbnN0YXRlczsgaisrLCBzKyspIHsKLQkJCWlmIChzLT5zX2FjY2VsKQotCQkJCVB5T2JqZWN0X0ZSRUUocy0+c19hY2NlbCk7Ci0JCQlzLT5zX2FjY2VsID0gTlVMTDsKLQkJfQotCX0KKyAgICBkZmEgKmQ7CisgICAgaW50IGk7CisgICAgZy0+Z19hY2NlbCA9IDA7CisgICAgZCA9IGctPmdfZGZhOworICAgIGZvciAoaSA9IGctPmdfbmRmYXM7IC0taSA+PSAwOyBkKyspIHsKKyAgICAgICAgc3RhdGUgKnM7CisgICAgICAgIGludCBqOworICAgICAgICBzID0gZC0+ZF9zdGF0ZTsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGQtPmRfbnN0YXRlczsgaisrLCBzKyspIHsKKyAgICAgICAgICAgIGlmIChzLT5zX2FjY2VsKQorICAgICAgICAgICAgICAgIFB5T2JqZWN0X0ZSRUUocy0+c19hY2NlbCk7CisgICAgICAgICAgICBzLT5zX2FjY2VsID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KIH0KIAogc3RhdGljIHZvaWQKIGZpeGRmYShncmFtbWFyICpnLCBkZmEgKmQpCiB7Ci0Jc3RhdGUgKnM7Ci0JaW50IGo7Ci0JcyA9IGQtPmRfc3RhdGU7Ci0JZm9yIChqID0gMDsgaiA8IGQtPmRfbnN0YXRlczsgaisrLCBzKyspCi0JCWZpeHN0YXRlKGcsIHMpOworICAgIHN0YXRlICpzOworICAgIGludCBqOworICAgIHMgPSBkLT5kX3N0YXRlOworICAgIGZvciAoaiA9IDA7IGogPCBkLT5kX25zdGF0ZXM7IGorKywgcysrKQorICAgICAgICBmaXhzdGF0ZShnLCBzKTsKIH0KIAogc3RhdGljIHZvaWQKIGZpeHN0YXRlKGdyYW1tYXIgKmcsIHN0YXRlICpzKQogewotCWFyYyAqYTsKLQlpbnQgazsKLQlpbnQgKmFjY2VsOwotCWludCBubCA9IGctPmdfbGwubGxfbmxhYmVsczsKLQlzLT5zX2FjY2VwdCA9IDA7Ci0JYWNjZWwgPSAoaW50ICopIFB5T2JqZWN0X01BTExPQyhubCAqIHNpemVvZihpbnQpKTsKLQlpZiAoYWNjZWwgPT0gTlVMTCkgewotCQlmcHJpbnRmKHN0ZGVyciwgIm5vIG1lbSB0byBidWlsZCBwYXJzZXIgYWNjZWxlcmF0b3JzXG4iKTsKLQkJZXhpdCgxKTsKLQl9Ci0JZm9yIChrID0gMDsgayA8IG5sOyBrKyspCi0JCWFjY2VsW2tdID0gLTE7Ci0JYSA9IHMtPnNfYXJjOwotCWZvciAoayA9IHMtPnNfbmFyY3M7IC0tayA+PSAwOyBhKyspIHsKLQkJaW50IGxibCA9IGEtPmFfbGJsOwotCQlsYWJlbCAqbCA9ICZnLT5nX2xsLmxsX2xhYmVsW2xibF07Ci0JCWludCB0eXBlID0gbC0+bGJfdHlwZTsKLQkJaWYgKGEtPmFfYXJyb3cgPj0gKDEgPDwgNykpIHsKLQkJCXByaW50ZigiWFhYIHRvbyBtYW55IHN0YXRlcyFcbiIpOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKElTTk9OVEVSTUlOQUwodHlwZSkpIHsKLQkJCWRmYSAqZDEgPSBQeUdyYW1tYXJfRmluZERGQShnLCB0eXBlKTsKLQkJCWludCBpYml0OwotCQkJaWYgKHR5cGUgLSBOVF9PRkZTRVQgPj0gKDEgPDwgNykpIHsKLQkJCQlwcmludGYoIlhYWCB0b28gaGlnaCBub250ZXJtaW5hbCBudW1iZXIhXG4iKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWZvciAoaWJpdCA9IDA7IGliaXQgPCBnLT5nX2xsLmxsX25sYWJlbHM7IGliaXQrKykgewotCQkJCWlmICh0ZXN0Yml0KGQxLT5kX2ZpcnN0LCBpYml0KSkgewotCQkJCQlpZiAoYWNjZWxbaWJpdF0gIT0gLTEpCi0JCQkJCQlwcmludGYoIlhYWCBhbWJpZ3VpdHkhXG4iKTsKLQkJCQkJYWNjZWxbaWJpdF0gPSBhLT5hX2Fycm93IHwgKDEgPDwgNykgfAotCQkJCQkJKCh0eXBlIC0gTlRfT0ZGU0VUKSA8PCA4KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAobGJsID09IEVNUFRZKQotCQkJcy0+c19hY2NlcHQgPSAxOwotCQllbHNlIGlmIChsYmwgPj0gMCAmJiBsYmwgPCBubCkKLQkJCWFjY2VsW2xibF0gPSBhLT5hX2Fycm93OwotCX0KLQl3aGlsZSAobmwgPiAwICYmIGFjY2VsW25sLTFdID09IC0xKQotCQlubC0tOwotCWZvciAoayA9IDA7IGsgPCBubCAmJiBhY2NlbFtrXSA9PSAtMTspCi0JCWsrKzsKLQlpZiAoayA8IG5sKSB7Ci0JCWludCBpOwotCQlzLT5zX2FjY2VsID0gKGludCAqKSBQeU9iamVjdF9NQUxMT0MoKG5sLWspICogc2l6ZW9mKGludCkpOwotCQlpZiAocy0+c19hY2NlbCA9PSBOVUxMKSB7Ci0JCQlmcHJpbnRmKHN0ZGVyciwgIm5vIG1lbSB0byBhZGQgcGFyc2VyIGFjY2VsZXJhdG9yc1xuIik7Ci0JCQlleGl0KDEpOwotCQl9Ci0JCXMtPnNfbG93ZXIgPSBrOwotCQlzLT5zX3VwcGVyID0gbmw7Ci0JCWZvciAoaSA9IDA7IGsgPCBubDsgaSsrLCBrKyspCi0JCQlzLT5zX2FjY2VsW2ldID0gYWNjZWxba107Ci0JfQotCVB5T2JqZWN0X0ZSRUUoYWNjZWwpOworICAgIGFyYyAqYTsKKyAgICBpbnQgazsKKyAgICBpbnQgKmFjY2VsOworICAgIGludCBubCA9IGctPmdfbGwubGxfbmxhYmVsczsKKyAgICBzLT5zX2FjY2VwdCA9IDA7CisgICAgYWNjZWwgPSAoaW50ICopIFB5T2JqZWN0X01BTExPQyhubCAqIHNpemVvZihpbnQpKTsKKyAgICBpZiAoYWNjZWwgPT0gTlVMTCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIm5vIG1lbSB0byBidWlsZCBwYXJzZXIgYWNjZWxlcmF0b3JzXG4iKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisgICAgZm9yIChrID0gMDsgayA8IG5sOyBrKyspCisgICAgICAgIGFjY2VsW2tdID0gLTE7CisgICAgYSA9IHMtPnNfYXJjOworICAgIGZvciAoayA9IHMtPnNfbmFyY3M7IC0tayA+PSAwOyBhKyspIHsKKyAgICAgICAgaW50IGxibCA9IGEtPmFfbGJsOworICAgICAgICBsYWJlbCAqbCA9ICZnLT5nX2xsLmxsX2xhYmVsW2xibF07CisgICAgICAgIGludCB0eXBlID0gbC0+bGJfdHlwZTsKKyAgICAgICAgaWYgKGEtPmFfYXJyb3cgPj0gKDEgPDwgNykpIHsKKyAgICAgICAgICAgIHByaW50ZigiWFhYIHRvbyBtYW55IHN0YXRlcyFcbiIpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKElTTk9OVEVSTUlOQUwodHlwZSkpIHsKKyAgICAgICAgICAgIGRmYSAqZDEgPSBQeUdyYW1tYXJfRmluZERGQShnLCB0eXBlKTsKKyAgICAgICAgICAgIGludCBpYml0OworICAgICAgICAgICAgaWYgKHR5cGUgLSBOVF9PRkZTRVQgPj0gKDEgPDwgNykpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIlhYWCB0b28gaGlnaCBub250ZXJtaW5hbCBudW1iZXIhXG4iKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaWJpdCA9IDA7IGliaXQgPCBnLT5nX2xsLmxsX25sYWJlbHM7IGliaXQrKykgeworICAgICAgICAgICAgICAgIGlmICh0ZXN0Yml0KGQxLT5kX2ZpcnN0LCBpYml0KSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoYWNjZWxbaWJpdF0gIT0gLTEpCisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlhYWCBhbWJpZ3VpdHkhXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgYWNjZWxbaWJpdF0gPSBhLT5hX2Fycm93IHwgKDEgPDwgNykgfAorICAgICAgICAgICAgICAgICAgICAgICAgKCh0eXBlIC0gTlRfT0ZGU0VUKSA8PCA4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAobGJsID09IEVNUFRZKQorICAgICAgICAgICAgcy0+c19hY2NlcHQgPSAxOworICAgICAgICBlbHNlIGlmIChsYmwgPj0gMCAmJiBsYmwgPCBubCkKKyAgICAgICAgICAgIGFjY2VsW2xibF0gPSBhLT5hX2Fycm93OworICAgIH0KKyAgICB3aGlsZSAobmwgPiAwICYmIGFjY2VsW25sLTFdID09IC0xKQorICAgICAgICBubC0tOworICAgIGZvciAoayA9IDA7IGsgPCBubCAmJiBhY2NlbFtrXSA9PSAtMTspCisgICAgICAgIGsrKzsKKyAgICBpZiAoayA8IG5sKSB7CisgICAgICAgIGludCBpOworICAgICAgICBzLT5zX2FjY2VsID0gKGludCAqKSBQeU9iamVjdF9NQUxMT0MoKG5sLWspICogc2l6ZW9mKGludCkpOworICAgICAgICBpZiAocy0+c19hY2NlbCA9PSBOVUxMKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIm5vIG1lbSB0byBhZGQgcGFyc2VyIGFjY2VsZXJhdG9yc1xuIik7CisgICAgICAgICAgICBleGl0KDEpOworICAgICAgICB9CisgICAgICAgIHMtPnNfbG93ZXIgPSBrOworICAgICAgICBzLT5zX3VwcGVyID0gbmw7CisgICAgICAgIGZvciAoaSA9IDA7IGsgPCBubDsgaSsrLCBrKyspCisgICAgICAgICAgICBzLT5zX2FjY2VsW2ldID0gYWNjZWxba107CisgICAgfQorICAgIFB5T2JqZWN0X0ZSRUUoYWNjZWwpOwogfQpkaWZmIC0tZ2l0IGEvUGFyc2VyL2JpdHNldC5jIGIvUGFyc2VyL2JpdHNldC5jCmluZGV4IGI1NTQzYjguLmY1YmZkNDEgMTAwNjQ0Ci0tLSBhL1BhcnNlci9iaXRzZXQuYworKysgYi9QYXJzZXIvYml0c2V0LmMKQEAgLTcsNjAgKzcsNjAgQEAKIGJpdHNldAogbmV3Yml0c2V0KGludCBuYml0cykKIHsKLQlpbnQgbmJ5dGVzID0gTkJZVEVTKG5iaXRzKTsKLQliaXRzZXQgc3MgPSAoY2hhciAqKVB5T2JqZWN0X01BTExPQyhzaXplb2YoQllURSkgKiAgbmJ5dGVzKTsKLQkKLQlpZiAoc3MgPT0gTlVMTCkKLQkJUHlfRmF0YWxFcnJvcigibm8gbWVtIGZvciBiaXRzZXQiKTsKLQkKLQlzcyArPSBuYnl0ZXM7Ci0Jd2hpbGUgKC0tbmJ5dGVzID49IDApCi0JCSotLXNzID0gMDsKLQlyZXR1cm4gc3M7CisgICAgaW50IG5ieXRlcyA9IE5CWVRFUyhuYml0cyk7CisgICAgYml0c2V0IHNzID0gKGNoYXIgKilQeU9iamVjdF9NQUxMT0Moc2l6ZW9mKEJZVEUpICogIG5ieXRlcyk7CisKKyAgICBpZiAoc3MgPT0gTlVMTCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigibm8gbWVtIGZvciBiaXRzZXQiKTsKKworICAgIHNzICs9IG5ieXRlczsKKyAgICB3aGlsZSAoLS1uYnl0ZXMgPj0gMCkKKyAgICAgICAgKi0tc3MgPSAwOworICAgIHJldHVybiBzczsKIH0KIAogdm9pZAogZGVsYml0c2V0KGJpdHNldCBzcykKIHsKLQlQeU9iamVjdF9GUkVFKHNzKTsKKyAgICBQeU9iamVjdF9GUkVFKHNzKTsKIH0KIAogaW50CiBhZGRiaXQoYml0c2V0IHNzLCBpbnQgaWJpdCkKIHsKLQlpbnQgaWJ5dGUgPSBCSVQyQllURShpYml0KTsKLQlCWVRFIG1hc2sgPSBCSVQyTUFTSyhpYml0KTsKLQkKLQlpZiAoc3NbaWJ5dGVdICYgbWFzaykKLQkJcmV0dXJuIDA7IC8qIEJpdCBhbHJlYWR5IHNldCAqLwotCXNzW2lieXRlXSB8PSBtYXNrOwotCXJldHVybiAxOworICAgIGludCBpYnl0ZSA9IEJJVDJCWVRFKGliaXQpOworICAgIEJZVEUgbWFzayA9IEJJVDJNQVNLKGliaXQpOworCisgICAgaWYgKHNzW2lieXRlXSAmIG1hc2spCisgICAgICAgIHJldHVybiAwOyAvKiBCaXQgYWxyZWFkeSBzZXQgKi8KKyAgICBzc1tpYnl0ZV0gfD0gbWFzazsKKyAgICByZXR1cm4gMTsKIH0KIAogI2lmIDAgLyogTm93IGEgbWFjcm8gKi8KIGludAogdGVzdGJpdChiaXRzZXQgc3MsIGludCBpYml0KQogewotCXJldHVybiAoc3NbQklUMkJZVEUoaWJpdCldICYgQklUMk1BU0soaWJpdCkpICE9IDA7CisgICAgcmV0dXJuIChzc1tCSVQyQllURShpYml0KV0gJiBCSVQyTUFTSyhpYml0KSkgIT0gMDsKIH0KICNlbmRpZgogCiBpbnQKIHNhbWViaXRzZXQoYml0c2V0IHNzMSwgYml0c2V0IHNzMiwgaW50IG5iaXRzKQogewotCWludCBpOwotCQotCWZvciAoaSA9IE5CWVRFUyhuYml0cyk7IC0taSA+PSAwOyApCi0JCWlmICgqc3MxKysgIT0gKnNzMisrKQotCQkJcmV0dXJuIDA7Ci0JcmV0dXJuIDE7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSBOQllURVMobmJpdHMpOyAtLWkgPj0gMDsgKQorICAgICAgICBpZiAoKnNzMSsrICE9ICpzczIrKykKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiAxOwogfQogCiB2b2lkCiBtZXJnZWJpdHNldChiaXRzZXQgc3MxLCBiaXRzZXQgc3MyLCBpbnQgbmJpdHMpCiB7Ci0JaW50IGk7Ci0JCi0JZm9yIChpID0gTkJZVEVTKG5iaXRzKTsgLS1pID49IDA7ICkKLQkJKnNzMSsrIHw9ICpzczIrKzsKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IE5CWVRFUyhuYml0cyk7IC0taSA+PSAwOyApCisgICAgICAgICpzczErKyB8PSAqc3MyKys7CiB9CmRpZmYgLS1naXQgYS9QYXJzZXIvZmlyc3RzZXRzLmMgYi9QYXJzZXIvZmlyc3RzZXRzLmMKaW5kZXggMDA0NjdiMy4uZWU3NWQxYiAxMDA2NDQKLS0tIGEvUGFyc2VyL2ZpcnN0c2V0cy5jCisrKyBiL1BhcnNlci9maXJzdHNldHMuYwpAQCAtMTMsMTAxICsxMywxMDEgQEAKIHZvaWQKIGFkZGZpcnN0c2V0cyhncmFtbWFyICpnKQogewotCWludCBpOwotCWRmYSAqZDsKKyAgICBpbnQgaTsKKyAgICBkZmEgKmQ7CiAKLQlpZiAoUHlfRGVidWdGbGFnKQotCQlwcmludGYoIkFkZGluZyBGSVJTVCBzZXRzIC4uLlxuIik7Ci0JZm9yIChpID0gMDsgaSA8IGctPmdfbmRmYXM7IGkrKykgewotCQlkID0gJmctPmdfZGZhW2ldOwotCQlpZiAoZC0+ZF9maXJzdCA9PSBOVUxMKQotCQkJY2FsY2ZpcnN0c2V0KGcsIGQpOwotCX0KKyAgICBpZiAoUHlfRGVidWdGbGFnKQorICAgICAgICBwcmludGYoIkFkZGluZyBGSVJTVCBzZXRzIC4uLlxuIik7CisgICAgZm9yIChpID0gMDsgaSA8IGctPmdfbmRmYXM7IGkrKykgeworICAgICAgICBkID0gJmctPmdfZGZhW2ldOworICAgICAgICBpZiAoZC0+ZF9maXJzdCA9PSBOVUxMKQorICAgICAgICAgICAgY2FsY2ZpcnN0c2V0KGcsIGQpOworICAgIH0KIH0KIAogc3RhdGljIHZvaWQKIGNhbGNmaXJzdHNldChncmFtbWFyICpnLCBkZmEgKmQpCiB7Ci0JaW50IGksIGo7Ci0Jc3RhdGUgKnM7Ci0JYXJjICphOwotCWludCBuc3ltczsKLQlpbnQgKnN5bTsKLQlpbnQgbmJpdHM7Ci0Jc3RhdGljIGJpdHNldCBkdW1teTsKLQliaXRzZXQgcmVzdWx0OwotCWludCB0eXBlOwotCWRmYSAqZDE7Ci0JbGFiZWwgKmwwOwotCQotCWlmIChQeV9EZWJ1Z0ZsYWcpCi0JCXByaW50ZigiQ2FsY3VsYXRlIEZJUlNUIHNldCBmb3IgJyVzJ1xuIiwgZC0+ZF9uYW1lKTsKLQkKLQlpZiAoZHVtbXkgPT0gTlVMTCkKLQkJZHVtbXkgPSBuZXdiaXRzZXQoMSk7Ci0JaWYgKGQtPmRfZmlyc3QgPT0gZHVtbXkpIHsKLQkJZnByaW50ZihzdGRlcnIsICJMZWZ0LXJlY3Vyc2lvbiBmb3IgJyVzJ1xuIiwgZC0+ZF9uYW1lKTsKLQkJcmV0dXJuOwotCX0KLQlpZiAoZC0+ZF9maXJzdCAhPSBOVUxMKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAiUmUtY2FsY3VsYXRpbmcgRklSU1Qgc2V0IGZvciAnJXMnID8/P1xuIiwKLQkJCWQtPmRfbmFtZSk7Ci0JfQotCWQtPmRfZmlyc3QgPSBkdW1teTsKLQkKLQlsMCA9IGctPmdfbGwubGxfbGFiZWw7Ci0JbmJpdHMgPSBnLT5nX2xsLmxsX25sYWJlbHM7Ci0JcmVzdWx0ID0gbmV3Yml0c2V0KG5iaXRzKTsKLQkKLQlzeW0gPSAoaW50ICopUHlPYmplY3RfTUFMTE9DKHNpemVvZihpbnQpKTsKLQlpZiAoc3ltID09IE5VTEwpCi0JCVB5X0ZhdGFsRXJyb3IoIm5vIG1lbSBmb3IgbmV3IHN5bSBpbiBjYWxjZmlyc3RzZXQiKTsKLQluc3ltcyA9IDE7Ci0Jc3ltWzBdID0gZmluZGxhYmVsKCZnLT5nX2xsLCBkLT5kX3R5cGUsIChjaGFyICopTlVMTCk7Ci0JCi0JcyA9ICZkLT5kX3N0YXRlW2QtPmRfaW5pdGlhbF07Ci0JZm9yIChpID0gMDsgaSA8IHMtPnNfbmFyY3M7IGkrKykgewotCQlhID0gJnMtPnNfYXJjW2ldOwotCQlmb3IgKGogPSAwOyBqIDwgbnN5bXM7IGorKykgewotCQkJaWYgKHN5bVtqXSA9PSBhLT5hX2xibCkKLQkJCQlicmVhazsKLQkJfQotCQlpZiAoaiA+PSBuc3ltcykgeyAvKiBOZXcgbGFiZWwgKi8KLQkJCXN5bSA9IChpbnQgKilQeU9iamVjdF9SRUFMTE9DKHN5bSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoaW50KSAqIChuc3ltcyArIDEpKTsKLQkJCWlmIChzeW0gPT0gTlVMTCkKLQkJCQlQeV9GYXRhbEVycm9yKAotCQkJCSAgICAibm8gbWVtIHRvIHJlc2l6ZSBzeW0gaW4gY2FsY2ZpcnN0c2V0Iik7Ci0JCQlzeW1bbnN5bXMrK10gPSBhLT5hX2xibDsKLQkJCXR5cGUgPSBsMFthLT5hX2xibF0ubGJfdHlwZTsKLQkJCWlmIChJU05PTlRFUk1JTkFMKHR5cGUpKSB7Ci0JCQkJZDEgPSBQeUdyYW1tYXJfRmluZERGQShnLCB0eXBlKTsKLQkJCQlpZiAoZDEtPmRfZmlyc3QgPT0gZHVtbXkpIHsKLQkJCQkJZnByaW50ZihzdGRlcnIsCi0JCQkJCQkiTGVmdC1yZWN1cnNpb24gYmVsb3cgJyVzJ1xuIiwKLQkJCQkJCWQtPmRfbmFtZSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlpZiAoZDEtPmRfZmlyc3QgPT0gTlVMTCkKLQkJCQkJCWNhbGNmaXJzdHNldChnLCBkMSk7Ci0JCQkJCW1lcmdlYml0c2V0KHJlc3VsdCwKLQkJCQkJCSAgICBkMS0+ZF9maXJzdCwgbmJpdHMpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKElTVEVSTUlOQUwodHlwZSkpIHsKLQkJCQlhZGRiaXQocmVzdWx0LCBhLT5hX2xibCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JZC0+ZF9maXJzdCA9IHJlc3VsdDsKLQlpZiAoUHlfRGVidWdGbGFnKSB7Ci0JCXByaW50ZigiRklSU1Qgc2V0IGZvciAnJXMnOiB7IiwgZC0+ZF9uYW1lKTsKLQkJZm9yIChpID0gMDsgaSA8IG5iaXRzOyBpKyspIHsKLQkJCWlmICh0ZXN0Yml0KHJlc3VsdCwgaSkpCi0JCQkJcHJpbnRmKCIgJXMiLCBQeUdyYW1tYXJfTGFiZWxSZXByKCZsMFtpXSkpOwotCQl9Ci0JCXByaW50ZigiIH1cbiIpOwotCX0KKyAgICBpbnQgaSwgajsKKyAgICBzdGF0ZSAqczsKKyAgICBhcmMgKmE7CisgICAgaW50IG5zeW1zOworICAgIGludCAqc3ltOworICAgIGludCBuYml0czsKKyAgICBzdGF0aWMgYml0c2V0IGR1bW15OworICAgIGJpdHNldCByZXN1bHQ7CisgICAgaW50IHR5cGU7CisgICAgZGZhICpkMTsKKyAgICBsYWJlbCAqbDA7CiAKLQlQeU9iamVjdF9GUkVFKHN5bSk7CisgICAgaWYgKFB5X0RlYnVnRmxhZykKKyAgICAgICAgcHJpbnRmKCJDYWxjdWxhdGUgRklSU1Qgc2V0IGZvciAnJXMnXG4iLCBkLT5kX25hbWUpOworCisgICAgaWYgKGR1bW15ID09IE5VTEwpCisgICAgICAgIGR1bW15ID0gbmV3Yml0c2V0KDEpOworICAgIGlmIChkLT5kX2ZpcnN0ID09IGR1bW15KSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiTGVmdC1yZWN1cnNpb24gZm9yICclcydcbiIsIGQtPmRfbmFtZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKGQtPmRfZmlyc3QgIT0gTlVMTCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlJlLWNhbGN1bGF0aW5nIEZJUlNUIHNldCBmb3IgJyVzJyA/Pz9cbiIsCisgICAgICAgICAgICBkLT5kX25hbWUpOworICAgIH0KKyAgICBkLT5kX2ZpcnN0ID0gZHVtbXk7CisKKyAgICBsMCA9IGctPmdfbGwubGxfbGFiZWw7CisgICAgbmJpdHMgPSBnLT5nX2xsLmxsX25sYWJlbHM7CisgICAgcmVzdWx0ID0gbmV3Yml0c2V0KG5iaXRzKTsKKworICAgIHN5bSA9IChpbnQgKilQeU9iamVjdF9NQUxMT0Moc2l6ZW9mKGludCkpOworICAgIGlmIChzeW0gPT0gTlVMTCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigibm8gbWVtIGZvciBuZXcgc3ltIGluIGNhbGNmaXJzdHNldCIpOworICAgIG5zeW1zID0gMTsKKyAgICBzeW1bMF0gPSBmaW5kbGFiZWwoJmctPmdfbGwsIGQtPmRfdHlwZSwgKGNoYXIgKilOVUxMKTsKKworICAgIHMgPSAmZC0+ZF9zdGF0ZVtkLT5kX2luaXRpYWxdOworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5zX25hcmNzOyBpKyspIHsKKyAgICAgICAgYSA9ICZzLT5zX2FyY1tpXTsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IG5zeW1zOyBqKyspIHsKKyAgICAgICAgICAgIGlmIChzeW1bal0gPT0gYS0+YV9sYmwpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGogPj0gbnN5bXMpIHsgLyogTmV3IGxhYmVsICovCisgICAgICAgICAgICBzeW0gPSAoaW50ICopUHlPYmplY3RfUkVBTExPQyhzeW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoaW50KSAqIChuc3ltcyArIDEpKTsKKyAgICAgICAgICAgIGlmIChzeW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBQeV9GYXRhbEVycm9yKAorICAgICAgICAgICAgICAgICAgICAibm8gbWVtIHRvIHJlc2l6ZSBzeW0gaW4gY2FsY2ZpcnN0c2V0Iik7CisgICAgICAgICAgICBzeW1bbnN5bXMrK10gPSBhLT5hX2xibDsKKyAgICAgICAgICAgIHR5cGUgPSBsMFthLT5hX2xibF0ubGJfdHlwZTsKKyAgICAgICAgICAgIGlmIChJU05PTlRFUk1JTkFMKHR5cGUpKSB7CisgICAgICAgICAgICAgICAgZDEgPSBQeUdyYW1tYXJfRmluZERGQShnLCB0eXBlKTsKKyAgICAgICAgICAgICAgICBpZiAoZDEtPmRfZmlyc3QgPT0gZHVtbXkpIHsKKyAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAiTGVmdC1yZWN1cnNpb24gYmVsb3cgJyVzJ1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGQtPmRfbmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoZDEtPmRfZmlyc3QgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbGNmaXJzdHNldChnLCBkMSk7CisgICAgICAgICAgICAgICAgICAgIG1lcmdlYml0c2V0KHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZDEtPmRfZmlyc3QsIG5iaXRzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChJU1RFUk1JTkFMKHR5cGUpKSB7CisgICAgICAgICAgICAgICAgYWRkYml0KHJlc3VsdCwgYS0+YV9sYmwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGQtPmRfZmlyc3QgPSByZXN1bHQ7CisgICAgaWYgKFB5X0RlYnVnRmxhZykgeworICAgICAgICBwcmludGYoIkZJUlNUIHNldCBmb3IgJyVzJzogeyIsIGQtPmRfbmFtZSk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuYml0czsgaSsrKSB7CisgICAgICAgICAgICBpZiAodGVzdGJpdChyZXN1bHQsIGkpKQorICAgICAgICAgICAgICAgIHByaW50ZigiICVzIiwgUHlHcmFtbWFyX0xhYmVsUmVwcigmbDBbaV0pKTsKKyAgICAgICAgfQorICAgICAgICBwcmludGYoIiB9XG4iKTsKKyAgICB9CisKKyAgICBQeU9iamVjdF9GUkVFKHN5bSk7CiB9CmRpZmYgLS1naXQgYS9QYXJzZXIvZ3JhbW1hci5jIGIvUGFyc2VyL2dyYW1tYXIuYwppbmRleCA5ZTdjNDlhLi5mYTFkZDdjIDEwMDY0NAotLS0gYS9QYXJzZXIvZ3JhbW1hci5jCisrKyBiL1BhcnNlci9ncmFtbWFyLmMKQEAgLTE4LDk4ICsxOCw5OCBAQAogZ3JhbW1hciAqCiBuZXdncmFtbWFyKGludCBzdGFydCkKIHsKLQlncmFtbWFyICpnOwotCQotCWcgPSAoZ3JhbW1hciAqKVB5T2JqZWN0X01BTExPQyhzaXplb2YoZ3JhbW1hcikpOwotCWlmIChnID09IE5VTEwpCi0JCVB5X0ZhdGFsRXJyb3IoIm5vIG1lbSBmb3IgbmV3IGdyYW1tYXIiKTsKLQlnLT5nX25kZmFzID0gMDsKLQlnLT5nX2RmYSA9IE5VTEw7Ci0JZy0+Z19zdGFydCA9IHN0YXJ0OwotCWctPmdfbGwubGxfbmxhYmVscyA9IDA7Ci0JZy0+Z19sbC5sbF9sYWJlbCA9IE5VTEw7Ci0JZy0+Z19hY2NlbCA9IDA7Ci0JcmV0dXJuIGc7CisgICAgZ3JhbW1hciAqZzsKKworICAgIGcgPSAoZ3JhbW1hciAqKVB5T2JqZWN0X01BTExPQyhzaXplb2YoZ3JhbW1hcikpOworICAgIGlmIChnID09IE5VTEwpCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIm5vIG1lbSBmb3IgbmV3IGdyYW1tYXIiKTsKKyAgICBnLT5nX25kZmFzID0gMDsKKyAgICBnLT5nX2RmYSA9IE5VTEw7CisgICAgZy0+Z19zdGFydCA9IHN0YXJ0OworICAgIGctPmdfbGwubGxfbmxhYmVscyA9IDA7CisgICAgZy0+Z19sbC5sbF9sYWJlbCA9IE5VTEw7CisgICAgZy0+Z19hY2NlbCA9IDA7CisgICAgcmV0dXJuIGc7CiB9CiAKIGRmYSAqCiBhZGRkZmEoZ3JhbW1hciAqZywgaW50IHR5cGUsIGNoYXIgKm5hbWUpCiB7Ci0JZGZhICpkOwotCQotCWctPmdfZGZhID0gKGRmYSAqKVB5T2JqZWN0X1JFQUxMT0MoZy0+Z19kZmEsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZGZhKSAqIChnLT5nX25kZmFzICsgMSkpOwotCWlmIChnLT5nX2RmYSA9PSBOVUxMKQotCQlQeV9GYXRhbEVycm9yKCJubyBtZW0gdG8gcmVzaXplIGRmYSBpbiBhZGRkZmEiKTsKLQlkID0gJmctPmdfZGZhW2ctPmdfbmRmYXMrK107Ci0JZC0+ZF90eXBlID0gdHlwZTsKLQlkLT5kX25hbWUgPSBzdHJkdXAobmFtZSk7Ci0JZC0+ZF9uc3RhdGVzID0gMDsKLQlkLT5kX3N0YXRlID0gTlVMTDsKLQlkLT5kX2luaXRpYWwgPSAtMTsKLQlkLT5kX2ZpcnN0ID0gTlVMTDsKLQlyZXR1cm4gZDsgLyogT25seSB1c2Ugd2hpbGUgZnJlc2ghICovCisgICAgZGZhICpkOworCisgICAgZy0+Z19kZmEgPSAoZGZhICopUHlPYmplY3RfUkVBTExPQyhnLT5nX2RmYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZGZhKSAqIChnLT5nX25kZmFzICsgMSkpOworICAgIGlmIChnLT5nX2RmYSA9PSBOVUxMKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJubyBtZW0gdG8gcmVzaXplIGRmYSBpbiBhZGRkZmEiKTsKKyAgICBkID0gJmctPmdfZGZhW2ctPmdfbmRmYXMrK107CisgICAgZC0+ZF90eXBlID0gdHlwZTsKKyAgICBkLT5kX25hbWUgPSBzdHJkdXAobmFtZSk7CisgICAgZC0+ZF9uc3RhdGVzID0gMDsKKyAgICBkLT5kX3N0YXRlID0gTlVMTDsKKyAgICBkLT5kX2luaXRpYWwgPSAtMTsKKyAgICBkLT5kX2ZpcnN0ID0gTlVMTDsKKyAgICByZXR1cm4gZDsgLyogT25seSB1c2Ugd2hpbGUgZnJlc2ghICovCiB9CiAKIGludAogYWRkc3RhdGUoZGZhICpkKQogewotCXN0YXRlICpzOwotCQotCWQtPmRfc3RhdGUgPSAoc3RhdGUgKilQeU9iamVjdF9SRUFMTE9DKGQtPmRfc3RhdGUsCi0JCQkJICAgICAgc2l6ZW9mKHN0YXRlKSAqIChkLT5kX25zdGF0ZXMgKyAxKSk7Ci0JaWYgKGQtPmRfc3RhdGUgPT0gTlVMTCkKLQkJUHlfRmF0YWxFcnJvcigibm8gbWVtIHRvIHJlc2l6ZSBzdGF0ZSBpbiBhZGRzdGF0ZSIpOwotCXMgPSAmZC0+ZF9zdGF0ZVtkLT5kX25zdGF0ZXMrK107Ci0Jcy0+c19uYXJjcyA9IDA7Ci0Jcy0+c19hcmMgPSBOVUxMOwotCXMtPnNfbG93ZXIgPSAwOwotCXMtPnNfdXBwZXIgPSAwOwotCXMtPnNfYWNjZWwgPSBOVUxMOwotCXMtPnNfYWNjZXB0ID0gMDsKLQlyZXR1cm4gcyAtIGQtPmRfc3RhdGU7CisgICAgc3RhdGUgKnM7CisKKyAgICBkLT5kX3N0YXRlID0gKHN0YXRlICopUHlPYmplY3RfUkVBTExPQyhkLT5kX3N0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdGF0ZSkgKiAoZC0+ZF9uc3RhdGVzICsgMSkpOworICAgIGlmIChkLT5kX3N0YXRlID09IE5VTEwpCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIm5vIG1lbSB0byByZXNpemUgc3RhdGUgaW4gYWRkc3RhdGUiKTsKKyAgICBzID0gJmQtPmRfc3RhdGVbZC0+ZF9uc3RhdGVzKytdOworICAgIHMtPnNfbmFyY3MgPSAwOworICAgIHMtPnNfYXJjID0gTlVMTDsKKyAgICBzLT5zX2xvd2VyID0gMDsKKyAgICBzLT5zX3VwcGVyID0gMDsKKyAgICBzLT5zX2FjY2VsID0gTlVMTDsKKyAgICBzLT5zX2FjY2VwdCA9IDA7CisgICAgcmV0dXJuIHMgLSBkLT5kX3N0YXRlOwogfQogCiB2b2lkCiBhZGRhcmMoZGZhICpkLCBpbnQgZnJvbSwgaW50IHRvLCBpbnQgbGJsKQogewotCXN0YXRlICpzOwotCWFyYyAqYTsKLQkKLQlhc3NlcnQoMCA8PSBmcm9tICYmIGZyb20gPCBkLT5kX25zdGF0ZXMpOwotCWFzc2VydCgwIDw9IHRvICYmIHRvIDwgZC0+ZF9uc3RhdGVzKTsKLQkKLQlzID0gJmQtPmRfc3RhdGVbZnJvbV07Ci0Jcy0+c19hcmMgPSAoYXJjICopUHlPYmplY3RfUkVBTExPQyhzLT5zX2FyYywgc2l6ZW9mKGFyYykgKiAocy0+c19uYXJjcyArIDEpKTsKLQlpZiAocy0+c19hcmMgPT0gTlVMTCkKLQkJUHlfRmF0YWxFcnJvcigibm8gbWVtIHRvIHJlc2l6ZSBhcmMgbGlzdCBpbiBhZGRhcmMiKTsKLQlhID0gJnMtPnNfYXJjW3MtPnNfbmFyY3MrK107Ci0JYS0+YV9sYmwgPSBsYmw7Ci0JYS0+YV9hcnJvdyA9IHRvOworICAgIHN0YXRlICpzOworICAgIGFyYyAqYTsKKworICAgIGFzc2VydCgwIDw9IGZyb20gJiYgZnJvbSA8IGQtPmRfbnN0YXRlcyk7CisgICAgYXNzZXJ0KDAgPD0gdG8gJiYgdG8gPCBkLT5kX25zdGF0ZXMpOworCisgICAgcyA9ICZkLT5kX3N0YXRlW2Zyb21dOworICAgIHMtPnNfYXJjID0gKGFyYyAqKVB5T2JqZWN0X1JFQUxMT0Mocy0+c19hcmMsIHNpemVvZihhcmMpICogKHMtPnNfbmFyY3MgKyAxKSk7CisgICAgaWYgKHMtPnNfYXJjID09IE5VTEwpCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIm5vIG1lbSB0byByZXNpemUgYXJjIGxpc3QgaW4gYWRkYXJjIik7CisgICAgYSA9ICZzLT5zX2FyY1tzLT5zX25hcmNzKytdOworICAgIGEtPmFfbGJsID0gbGJsOworICAgIGEtPmFfYXJyb3cgPSB0bzsKIH0KIAogaW50CiBhZGRsYWJlbChsYWJlbGxpc3QgKmxsLCBpbnQgdHlwZSwgY2hhciAqc3RyKQogewotCWludCBpOwotCWxhYmVsICpsYjsKLQkKLQlmb3IgKGkgPSAwOyBpIDwgbGwtPmxsX25sYWJlbHM7IGkrKykgewotCQlpZiAobGwtPmxsX2xhYmVsW2ldLmxiX3R5cGUgPT0gdHlwZSAmJgotCQkJc3RyY21wKGxsLT5sbF9sYWJlbFtpXS5sYl9zdHIsIHN0cikgPT0gMCkKLQkJCXJldHVybiBpOwotCX0KLQlsbC0+bGxfbGFiZWwgPSAobGFiZWwgKilQeU9iamVjdF9SRUFMTE9DKGxsLT5sbF9sYWJlbCwKLQkJCQkJc2l6ZW9mKGxhYmVsKSAqIChsbC0+bGxfbmxhYmVscyArIDEpKTsKLQlpZiAobGwtPmxsX2xhYmVsID09IE5VTEwpCi0JCVB5X0ZhdGFsRXJyb3IoIm5vIG1lbSB0byByZXNpemUgbGFiZWxsaXN0IGluIGFkZGxhYmVsIik7Ci0JbGIgPSAmbGwtPmxsX2xhYmVsW2xsLT5sbF9ubGFiZWxzKytdOwotCWxiLT5sYl90eXBlID0gdHlwZTsKLQlsYi0+bGJfc3RyID0gc3RyZHVwKHN0cik7Ci0JaWYgKFB5X0RlYnVnRmxhZykKLQkJcHJpbnRmKCJMYWJlbCBAICU4cCwgJWQ6ICVzXG4iLCBsbCwgbGwtPmxsX25sYWJlbHMsCi0JCSAgICAgICBQeUdyYW1tYXJfTGFiZWxSZXByKGxiKSk7Ci0JcmV0dXJuIGxiIC0gbGwtPmxsX2xhYmVsOworICAgIGludCBpOworICAgIGxhYmVsICpsYjsKKworICAgIGZvciAoaSA9IDA7IGkgPCBsbC0+bGxfbmxhYmVsczsgaSsrKSB7CisgICAgICAgIGlmIChsbC0+bGxfbGFiZWxbaV0ubGJfdHlwZSA9PSB0eXBlICYmCisgICAgICAgICAgICBzdHJjbXAobGwtPmxsX2xhYmVsW2ldLmxiX3N0ciwgc3RyKSA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgfQorICAgIGxsLT5sbF9sYWJlbCA9IChsYWJlbCAqKVB5T2JqZWN0X1JFQUxMT0MobGwtPmxsX2xhYmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGxhYmVsKSAqIChsbC0+bGxfbmxhYmVscyArIDEpKTsKKyAgICBpZiAobGwtPmxsX2xhYmVsID09IE5VTEwpCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIm5vIG1lbSB0byByZXNpemUgbGFiZWxsaXN0IGluIGFkZGxhYmVsIik7CisgICAgbGIgPSAmbGwtPmxsX2xhYmVsW2xsLT5sbF9ubGFiZWxzKytdOworICAgIGxiLT5sYl90eXBlID0gdHlwZTsKKyAgICBsYi0+bGJfc3RyID0gc3RyZHVwKHN0cik7CisgICAgaWYgKFB5X0RlYnVnRmxhZykKKyAgICAgICAgcHJpbnRmKCJMYWJlbCBAICU4cCwgJWQ6ICVzXG4iLCBsbCwgbGwtPmxsX25sYWJlbHMsCisgICAgICAgICAgICAgICBQeUdyYW1tYXJfTGFiZWxSZXByKGxiKSk7CisgICAgcmV0dXJuIGxiIC0gbGwtPmxsX2xhYmVsOwogfQogCiAvKiBTYW1lLCBidXQgcmF0aGVyIGRpZXMgdGhhbiBhZGRzICovCkBAIC0xMTcsMTYgKzExNywxNiBAQAogaW50CiBmaW5kbGFiZWwobGFiZWxsaXN0ICpsbCwgaW50IHR5cGUsIGNoYXIgKnN0cikKIHsKLQlpbnQgaTsKLQkKLQlmb3IgKGkgPSAwOyBpIDwgbGwtPmxsX25sYWJlbHM7IGkrKykgewotCQlpZiAobGwtPmxsX2xhYmVsW2ldLmxiX3R5cGUgPT0gdHlwZSAvKiYmCi0JCQlzdHJjbXAobGwtPmxsX2xhYmVsW2ldLmxiX3N0ciwgc3RyKSA9PSAwKi8pCi0JCQlyZXR1cm4gaTsKLQl9Ci0JZnByaW50ZihzdGRlcnIsICJMYWJlbCAlZC8nJXMnIG5vdCBmb3VuZFxuIiwgdHlwZSwgc3RyKTsKLQlQeV9GYXRhbEVycm9yKCJncmFtbWFyLmM6ZmluZGxhYmVsKCkiKTsKLQlyZXR1cm4gMDsgLyogTWFrZSBnY2MgLVdhbGwgaGFwcHkgKi8KKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBsbC0+bGxfbmxhYmVsczsgaSsrKSB7CisgICAgICAgIGlmIChsbC0+bGxfbGFiZWxbaV0ubGJfdHlwZSA9PSB0eXBlIC8qJiYKKyAgICAgICAgICAgIHN0cmNtcChsbC0+bGxfbGFiZWxbaV0ubGJfc3RyLCBzdHIpID09IDAqLykKKyAgICAgICAgICAgIHJldHVybiBpOworICAgIH0KKyAgICBmcHJpbnRmKHN0ZGVyciwgIkxhYmVsICVkLyclcycgbm90IGZvdW5kXG4iLCB0eXBlLCBzdHIpOworICAgIFB5X0ZhdGFsRXJyb3IoImdyYW1tYXIuYzpmaW5kbGFiZWwoKSIpOworICAgIHJldHVybiAwOyAvKiBNYWtlIGdjYyAtV2FsbCBoYXBweSAqLwogfQogCiAvKiBGb3J3YXJkICovCkBAIC0xMzUsMTIwICsxMzUsMTIwIEBACiB2b2lkCiB0cmFuc2xhdGVsYWJlbHMoZ3JhbW1hciAqZykKIHsKLQlpbnQgaTsKKyAgICBpbnQgaTsKIAogI2lmZGVmIFB5X0RFQlVHCi0JcHJpbnRmKCJUcmFuc2xhdGluZyBsYWJlbHMgLi4uXG4iKTsKKyAgICBwcmludGYoIlRyYW5zbGF0aW5nIGxhYmVscyAuLi5cbiIpOwogI2VuZGlmCi0JLyogRG9uJ3QgdHJhbnNsYXRlIEVNUFRZICovCi0JZm9yIChpID0gRU1QVFkrMTsgaSA8IGctPmdfbGwubGxfbmxhYmVsczsgaSsrKQotCQl0cmFuc2xhYmVsKGcsICZnLT5nX2xsLmxsX2xhYmVsW2ldKTsKKyAgICAvKiBEb24ndCB0cmFuc2xhdGUgRU1QVFkgKi8KKyAgICBmb3IgKGkgPSBFTVBUWSsxOyBpIDwgZy0+Z19sbC5sbF9ubGFiZWxzOyBpKyspCisgICAgICAgIHRyYW5zbGFiZWwoZywgJmctPmdfbGwubGxfbGFiZWxbaV0pOwogfQogCiBzdGF0aWMgdm9pZAogdHJhbnNsYWJlbChncmFtbWFyICpnLCBsYWJlbCAqbGIpCiB7Ci0JaW50IGk7Ci0JCi0JaWYgKFB5X0RlYnVnRmxhZykKLQkJcHJpbnRmKCJUcmFuc2xhdGluZyBsYWJlbCAlcyAuLi5cbiIsIFB5R3JhbW1hcl9MYWJlbFJlcHIobGIpKTsKLQkKLQlpZiAobGItPmxiX3R5cGUgPT0gTkFNRSkgewotCQlmb3IgKGkgPSAwOyBpIDwgZy0+Z19uZGZhczsgaSsrKSB7Ci0JCQlpZiAoc3RyY21wKGxiLT5sYl9zdHIsIGctPmdfZGZhW2ldLmRfbmFtZSkgPT0gMCkgewotCQkJCWlmIChQeV9EZWJ1Z0ZsYWcpCi0JCQkJCXByaW50ZigKLQkJCQkJICAgICJMYWJlbCAlcyBpcyBub24tdGVybWluYWwgJWQuXG4iLAotCQkJCQkgICAgbGItPmxiX3N0ciwKLQkJCQkJICAgIGctPmdfZGZhW2ldLmRfdHlwZSk7Ci0JCQkJbGItPmxiX3R5cGUgPSBnLT5nX2RmYVtpXS5kX3R5cGU7Ci0JCQkJZnJlZShsYi0+bGJfc3RyKTsKLQkJCQlsYi0+bGJfc3RyID0gTlVMTDsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJZm9yIChpID0gMDsgaSA8IChpbnQpTl9UT0tFTlM7IGkrKykgewotCQkJaWYgKHN0cmNtcChsYi0+bGJfc3RyLCBfUHlQYXJzZXJfVG9rZW5OYW1lc1tpXSkgPT0gMCkgewotCQkJCWlmIChQeV9EZWJ1Z0ZsYWcpCi0JCQkJCXByaW50ZigiTGFiZWwgJXMgaXMgdGVybWluYWwgJWQuXG4iLAotCQkJCQkJbGItPmxiX3N0ciwgaSk7Ci0JCQkJbGItPmxiX3R5cGUgPSBpOwotCQkJCWZyZWUobGItPmxiX3N0cik7Ci0JCQkJbGItPmxiX3N0ciA9IE5VTEw7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXByaW50ZigiQ2FuJ3QgdHJhbnNsYXRlIE5BTUUgbGFiZWwgJyVzJ1xuIiwgbGItPmxiX3N0cik7Ci0JCXJldHVybjsKLQl9Ci0JCi0JaWYgKGxiLT5sYl90eXBlID09IFNUUklORykgewotCQlpZiAoaXNhbHBoYShQeV9DSEFSTUFTSyhsYi0+bGJfc3RyWzFdKSkgfHwKLQkJICAgIGxiLT5sYl9zdHJbMV0gPT0gJ18nKSB7Ci0JCQljaGFyICpwOwotCQkJY2hhciAqc3JjOwotCQkJY2hhciAqZGVzdDsKLQkJCXNpemVfdCBuYW1lX2xlbjsKLQkJCWlmIChQeV9EZWJ1Z0ZsYWcpCi0JCQkJcHJpbnRmKCJMYWJlbCAlcyBpcyBhIGtleXdvcmRcbiIsIGxiLT5sYl9zdHIpOwotCQkJbGItPmxiX3R5cGUgPSBOQU1FOwotCQkJc3JjID0gbGItPmxiX3N0ciArIDE7Ci0JCQlwID0gc3RyY2hyKHNyYywgJ1wnJyk7Ci0JCQlpZiAocCkKLQkJCQluYW1lX2xlbiA9IHAgLSBzcmM7Ci0JCQllbHNlCi0JCQkJbmFtZV9sZW4gPSBzdHJsZW4oc3JjKTsKLQkJCWRlc3QgPSAoY2hhciAqKW1hbGxvYyhuYW1lX2xlbiArIDEpOwotCQkJaWYgKCFkZXN0KSB7Ci0JCQkJcHJpbnRmKCJDYW4ndCBhbGxvYyBkZXN0ICclcydcbiIsIHNyYyk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJc3RybmNweShkZXN0LCBzcmMsIG5hbWVfbGVuKTsKLQkJCWRlc3RbbmFtZV9sZW5dID0gJ1wwJzsKLQkJCWZyZWUobGItPmxiX3N0cik7Ci0JCQlsYi0+bGJfc3RyID0gZGVzdDsKLQkJfQotCQllbHNlIGlmIChsYi0+bGJfc3RyWzJdID09IGxiLT5sYl9zdHJbMF0pIHsKLQkJCWludCB0eXBlID0gKGludCkgUHlUb2tlbl9PbmVDaGFyKGxiLT5sYl9zdHJbMV0pOwotCQkJaWYgKHR5cGUgIT0gT1ApIHsKLQkJCQlsYi0+bGJfdHlwZSA9IHR5cGU7Ci0JCQkJZnJlZShsYi0+bGJfc3RyKTsKLQkJCQlsYi0+bGJfc3RyID0gTlVMTDsKLQkJCX0KLQkJCWVsc2UKLQkJCQlwcmludGYoIlVua25vd24gT1AgbGFiZWwgJXNcbiIsCi0JCQkJCWxiLT5sYl9zdHIpOwotCQl9Ci0JCWVsc2UgaWYgKGxiLT5sYl9zdHJbMl0gJiYgbGItPmxiX3N0clszXSA9PSBsYi0+bGJfc3RyWzBdKSB7Ci0JCQlpbnQgdHlwZSA9IChpbnQpIFB5VG9rZW5fVHdvQ2hhcnMobGItPmxiX3N0clsxXSwKLQkJCQkJCSAgIGxiLT5sYl9zdHJbMl0pOwotCQkJaWYgKHR5cGUgIT0gT1ApIHsKLQkJCQlsYi0+bGJfdHlwZSA9IHR5cGU7Ci0JCQkJZnJlZShsYi0+bGJfc3RyKTsKLQkJCQlsYi0+bGJfc3RyID0gTlVMTDsKLQkJCX0KLQkJCWVsc2UKLQkJCQlwcmludGYoIlVua25vd24gT1AgbGFiZWwgJXNcbiIsCi0JCQkJCWxiLT5sYl9zdHIpOwotCQl9Ci0JCWVsc2UgaWYgKGxiLT5sYl9zdHJbMl0gJiYgbGItPmxiX3N0clszXSAmJiBsYi0+bGJfc3RyWzRdID09IGxiLT5sYl9zdHJbMF0pIHsKLQkJCWludCB0eXBlID0gKGludCkgUHlUb2tlbl9UaHJlZUNoYXJzKGxiLT5sYl9zdHJbMV0sCi0JCQkJCQkJICAgIGxiLT5sYl9zdHJbMl0sCi0JCQkJCQkJICAgIGxiLT5sYl9zdHJbM10pOwotCQkJaWYgKHR5cGUgIT0gT1ApIHsKLQkJCQlsYi0+bGJfdHlwZSA9IHR5cGU7Ci0JCQkJZnJlZShsYi0+bGJfc3RyKTsKLQkJCQlsYi0+bGJfc3RyID0gTlVMTDsKLQkJCX0KLQkJCWVsc2UKLQkJCQlwcmludGYoIlVua25vd24gT1AgbGFiZWwgJXNcbiIsCi0JCQkJCWxiLT5sYl9zdHIpOwotCQl9Ci0JCWVsc2UKLQkJCXByaW50ZigiQ2FuJ3QgdHJhbnNsYXRlIFNUUklORyBsYWJlbCAlc1xuIiwKLQkJCQlsYi0+bGJfc3RyKTsKLQl9Ci0JZWxzZQotCQlwcmludGYoIkNhbid0IHRyYW5zbGF0ZSBsYWJlbCAnJXMnXG4iLAotCQkgICAgICAgUHlHcmFtbWFyX0xhYmVsUmVwcihsYikpOworICAgIGludCBpOworCisgICAgaWYgKFB5X0RlYnVnRmxhZykKKyAgICAgICAgcHJpbnRmKCJUcmFuc2xhdGluZyBsYWJlbCAlcyAuLi5cbiIsIFB5R3JhbW1hcl9MYWJlbFJlcHIobGIpKTsKKworICAgIGlmIChsYi0+bGJfdHlwZSA9PSBOQU1FKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBnLT5nX25kZmFzOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChzdHJjbXAobGItPmxiX3N0ciwgZy0+Z19kZmFbaV0uZF9uYW1lKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKFB5X0RlYnVnRmxhZykKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKAorICAgICAgICAgICAgICAgICAgICAgICAgIkxhYmVsICVzIGlzIG5vbi10ZXJtaW5hbCAlZC5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBsYi0+bGJfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgZy0+Z19kZmFbaV0uZF90eXBlKTsKKyAgICAgICAgICAgICAgICBsYi0+bGJfdHlwZSA9IGctPmdfZGZhW2ldLmRfdHlwZTsKKyAgICAgICAgICAgICAgICBmcmVlKGxiLT5sYl9zdHIpOworICAgICAgICAgICAgICAgIGxiLT5sYl9zdHIgPSBOVUxMOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKGludClOX1RPS0VOUzsgaSsrKSB7CisgICAgICAgICAgICBpZiAoc3RyY21wKGxiLT5sYl9zdHIsIF9QeVBhcnNlcl9Ub2tlbk5hbWVzW2ldKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKFB5X0RlYnVnRmxhZykKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJMYWJlbCAlcyBpcyB0ZXJtaW5hbCAlZC5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBsYi0+bGJfc3RyLCBpKTsKKyAgICAgICAgICAgICAgICBsYi0+bGJfdHlwZSA9IGk7CisgICAgICAgICAgICAgICAgZnJlZShsYi0+bGJfc3RyKTsKKyAgICAgICAgICAgICAgICBsYi0+bGJfc3RyID0gTlVMTDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRmKCJDYW4ndCB0cmFuc2xhdGUgTkFNRSBsYWJlbCAnJXMnXG4iLCBsYi0+bGJfc3RyKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChsYi0+bGJfdHlwZSA9PSBTVFJJTkcpIHsKKyAgICAgICAgaWYgKGlzYWxwaGEoUHlfQ0hBUk1BU0sobGItPmxiX3N0clsxXSkpIHx8CisgICAgICAgICAgICBsYi0+bGJfc3RyWzFdID09ICdfJykgeworICAgICAgICAgICAgY2hhciAqcDsKKyAgICAgICAgICAgIGNoYXIgKnNyYzsKKyAgICAgICAgICAgIGNoYXIgKmRlc3Q7CisgICAgICAgICAgICBzaXplX3QgbmFtZV9sZW47CisgICAgICAgICAgICBpZiAoUHlfRGVidWdGbGFnKQorICAgICAgICAgICAgICAgIHByaW50ZigiTGFiZWwgJXMgaXMgYSBrZXl3b3JkXG4iLCBsYi0+bGJfc3RyKTsKKyAgICAgICAgICAgIGxiLT5sYl90eXBlID0gTkFNRTsKKyAgICAgICAgICAgIHNyYyA9IGxiLT5sYl9zdHIgKyAxOworICAgICAgICAgICAgcCA9IHN0cmNocihzcmMsICdcJycpOworICAgICAgICAgICAgaWYgKHApCisgICAgICAgICAgICAgICAgbmFtZV9sZW4gPSBwIC0gc3JjOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG5hbWVfbGVuID0gc3RybGVuKHNyYyk7CisgICAgICAgICAgICBkZXN0ID0gKGNoYXIgKiltYWxsb2MobmFtZV9sZW4gKyAxKTsKKyAgICAgICAgICAgIGlmICghZGVzdCkgeworICAgICAgICAgICAgICAgIHByaW50ZigiQ2FuJ3QgYWxsb2MgZGVzdCAnJXMnXG4iLCBzcmMpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0cm5jcHkoZGVzdCwgc3JjLCBuYW1lX2xlbik7CisgICAgICAgICAgICBkZXN0W25hbWVfbGVuXSA9ICdcMCc7CisgICAgICAgICAgICBmcmVlKGxiLT5sYl9zdHIpOworICAgICAgICAgICAgbGItPmxiX3N0ciA9IGRlc3Q7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAobGItPmxiX3N0clsyXSA9PSBsYi0+bGJfc3RyWzBdKSB7CisgICAgICAgICAgICBpbnQgdHlwZSA9IChpbnQpIFB5VG9rZW5fT25lQ2hhcihsYi0+bGJfc3RyWzFdKTsKKyAgICAgICAgICAgIGlmICh0eXBlICE9IE9QKSB7CisgICAgICAgICAgICAgICAgbGItPmxiX3R5cGUgPSB0eXBlOworICAgICAgICAgICAgICAgIGZyZWUobGItPmxiX3N0cik7CisgICAgICAgICAgICAgICAgbGItPmxiX3N0ciA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcHJpbnRmKCJVbmtub3duIE9QIGxhYmVsICVzXG4iLAorICAgICAgICAgICAgICAgICAgICBsYi0+bGJfc3RyKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChsYi0+bGJfc3RyWzJdICYmIGxiLT5sYl9zdHJbM10gPT0gbGItPmxiX3N0clswXSkgeworICAgICAgICAgICAgaW50IHR5cGUgPSAoaW50KSBQeVRva2VuX1R3b0NoYXJzKGxiLT5sYl9zdHJbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYi0+bGJfc3RyWzJdKTsKKyAgICAgICAgICAgIGlmICh0eXBlICE9IE9QKSB7CisgICAgICAgICAgICAgICAgbGItPmxiX3R5cGUgPSB0eXBlOworICAgICAgICAgICAgICAgIGZyZWUobGItPmxiX3N0cik7CisgICAgICAgICAgICAgICAgbGItPmxiX3N0ciA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcHJpbnRmKCJVbmtub3duIE9QIGxhYmVsICVzXG4iLAorICAgICAgICAgICAgICAgICAgICBsYi0+bGJfc3RyKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChsYi0+bGJfc3RyWzJdICYmIGxiLT5sYl9zdHJbM10gJiYgbGItPmxiX3N0cls0XSA9PSBsYi0+bGJfc3RyWzBdKSB7CisgICAgICAgICAgICBpbnQgdHlwZSA9IChpbnQpIFB5VG9rZW5fVGhyZWVDaGFycyhsYi0+bGJfc3RyWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGItPmxiX3N0clsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxiLT5sYl9zdHJbM10pOworICAgICAgICAgICAgaWYgKHR5cGUgIT0gT1ApIHsKKyAgICAgICAgICAgICAgICBsYi0+bGJfdHlwZSA9IHR5cGU7CisgICAgICAgICAgICAgICAgZnJlZShsYi0+bGJfc3RyKTsKKyAgICAgICAgICAgICAgICBsYi0+bGJfc3RyID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBwcmludGYoIlVua25vd24gT1AgbGFiZWwgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgIGxiLT5sYl9zdHIpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHByaW50ZigiQ2FuJ3QgdHJhbnNsYXRlIFNUUklORyBsYWJlbCAlc1xuIiwKKyAgICAgICAgICAgICAgICBsYi0+bGJfc3RyKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBwcmludGYoIkNhbid0IHRyYW5zbGF0ZSBsYWJlbCAnJXMnXG4iLAorICAgICAgICAgICAgICAgUHlHcmFtbWFyX0xhYmVsUmVwcihsYikpOwogfQpkaWZmIC0tZ2l0IGEvUGFyc2VyL2dyYW1tYXIxLmMgYi9QYXJzZXIvZ3JhbW1hcjEuYwppbmRleCBiNzY3MTlhLi4xZjdkMjY0IDEwMDY0NAotLS0gYS9QYXJzZXIvZ3JhbW1hcjEuYworKysgYi9QYXJzZXIvZ3JhbW1hcjEuYwpAQCAtMTEsNDcgKzExLDQ3IEBACiBkZmEgKgogUHlHcmFtbWFyX0ZpbmRERkEoZ3JhbW1hciAqZywgcmVnaXN0ZXIgaW50IHR5cGUpCiB7Ci0JcmVnaXN0ZXIgZGZhICpkOworICAgIHJlZ2lzdGVyIGRmYSAqZDsKICNpZiAxCi0JLyogTWFzc2l2ZSBzcGVlZC11cCAqLwotCWQgPSAmZy0+Z19kZmFbdHlwZSAtIE5UX09GRlNFVF07Ci0JYXNzZXJ0KGQtPmRfdHlwZSA9PSB0eXBlKTsKLQlyZXR1cm4gZDsKKyAgICAvKiBNYXNzaXZlIHNwZWVkLXVwICovCisgICAgZCA9ICZnLT5nX2RmYVt0eXBlIC0gTlRfT0ZGU0VUXTsKKyAgICBhc3NlcnQoZC0+ZF90eXBlID09IHR5cGUpOworICAgIHJldHVybiBkOwogI2Vsc2UKLQkvKiBPbGQsIHNsb3cgdmVyc2lvbiAqLwotCXJlZ2lzdGVyIGludCBpOwotCQotCWZvciAoaSA9IGctPmdfbmRmYXMsIGQgPSBnLT5nX2RmYTsgLS1pID49IDA7IGQrKykgewotCQlpZiAoZC0+ZF90eXBlID09IHR5cGUpCi0JCQlyZXR1cm4gZDsKLQl9Ci0JYXNzZXJ0KDApOwotCS8qIE5PVFJFQUNIRUQgKi8KKyAgICAvKiBPbGQsIHNsb3cgdmVyc2lvbiAqLworICAgIHJlZ2lzdGVyIGludCBpOworCisgICAgZm9yIChpID0gZy0+Z19uZGZhcywgZCA9IGctPmdfZGZhOyAtLWkgPj0gMDsgZCsrKSB7CisgICAgICAgIGlmIChkLT5kX3R5cGUgPT0gdHlwZSkKKyAgICAgICAgICAgIHJldHVybiBkOworICAgIH0KKyAgICBhc3NlcnQoMCk7CisgICAgLyogTk9UUkVBQ0hFRCAqLwogI2VuZGlmCiB9CiAKIGNoYXIgKgogUHlHcmFtbWFyX0xhYmVsUmVwcihsYWJlbCAqbGIpCiB7Ci0Jc3RhdGljIGNoYXIgYnVmWzEwMF07Ci0JCi0JaWYgKGxiLT5sYl90eXBlID09IEVORE1BUktFUikKLQkJcmV0dXJuICJFTVBUWSI7Ci0JZWxzZSBpZiAoSVNOT05URVJNSU5BTChsYi0+bGJfdHlwZSkpIHsKLQkJaWYgKGxiLT5sYl9zdHIgPT0gTlVMTCkgewotCQkJUHlPU19zbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiTlQlZCIsIGxiLT5sYl90eXBlKTsKLQkJCXJldHVybiBidWY7Ci0JCX0KLQkJZWxzZQotCQkJcmV0dXJuIGxiLT5sYl9zdHI7Ci0JfQotCWVsc2UgewotCQlpZiAobGItPmxiX3N0ciA9PSBOVUxMKQotCQkJcmV0dXJuIF9QeVBhcnNlcl9Ub2tlbk5hbWVzW2xiLT5sYl90eXBlXTsKLQkJZWxzZSB7Ci0JCQlQeU9TX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlLjMycyglLjMycykiLAotCQkJCV9QeVBhcnNlcl9Ub2tlbk5hbWVzW2xiLT5sYl90eXBlXSwgbGItPmxiX3N0cik7Ci0JCQlyZXR1cm4gYnVmOwotCQl9Ci0JfQorICAgIHN0YXRpYyBjaGFyIGJ1ZlsxMDBdOworCisgICAgaWYgKGxiLT5sYl90eXBlID09IEVORE1BUktFUikKKyAgICAgICAgcmV0dXJuICJFTVBUWSI7CisgICAgZWxzZSBpZiAoSVNOT05URVJNSU5BTChsYi0+bGJfdHlwZSkpIHsKKyAgICAgICAgaWYgKGxiLT5sYl9zdHIgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlPU19zbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiTlQlZCIsIGxiLT5sYl90eXBlKTsKKyAgICAgICAgICAgIHJldHVybiBidWY7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIGxiLT5sYl9zdHI7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZiAobGItPmxiX3N0ciA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIF9QeVBhcnNlcl9Ub2tlbk5hbWVzW2xiLT5sYl90eXBlXTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBQeU9TX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlLjMycyglLjMycykiLAorICAgICAgICAgICAgICAgIF9QeVBhcnNlcl9Ub2tlbk5hbWVzW2xiLT5sYl90eXBlXSwgbGItPmxiX3N0cik7CisgICAgICAgICAgICByZXR1cm4gYnVmOworICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvUGFyc2VyL2ludHJjaGVjay5jIGIvUGFyc2VyL2ludHJjaGVjay5jCmluZGV4IDEzNTYxOTEuLjFjODg4YTUgMTAwNjQ0Ci0tLSBhL1BhcnNlci9pbnRyY2hlY2suYworKysgYi9QYXJzZXIvaW50cmNoZWNrLmMKQEAgLTIxLDcgKzIxLDcgQEAKIGludAogUHlPU19JbnRlcnJ1cHRPY2N1cnJlZCh2b2lkKQogewotCV93eWllbGQoKTsKKyAgICBfd3lpZWxkKCk7CiB9CiAKICNkZWZpbmUgT0sKQEAgLTQ3LDcgKzQ3LDcgQEAKIHZvaWQKIFB5T1NfSW5pdEludGVycnVwdHModm9pZCkKIHsKLQlfZ28zMl93YW50X2N0cmxfYnJlYWsoMSAvKiBUUlVFICovKTsKKyAgICBfZ28zMl93YW50X2N0cmxfYnJlYWsoMSAvKiBUUlVFICovKTsKIH0KIAogdm9pZApAQCAtNTgsNyArNTgsNyBAQAogaW50CiBQeU9TX0ludGVycnVwdE9jY3VycmVkKHZvaWQpCiB7Ci0JcmV0dXJuIF9nbzMyX3dhc19jdHJsX2JyZWFrX2hpdCgpOworICAgIHJldHVybiBfZ28zMl93YXNfY3RybF9icmVha19oaXQoKTsKIH0KIAogI2Vsc2UgLyogIV9fR05VQ19fICovCkBAIC03OCwxMiArNzgsMTIgQEAKIGludAogUHlPU19JbnRlcnJ1cHRPY2N1cnJlZCh2b2lkKQogewotCWludCBpbnRlcnJ1cHRlZCA9IDA7Ci0Jd2hpbGUgKGtiaGl0KCkpIHsKLQkJaWYgKGdldGNoKCkgPT0gJ1wwMDMnKQotCQkJaW50ZXJydXB0ZWQgPSAxOwotCX0KLQlyZXR1cm4gaW50ZXJydXB0ZWQ7CisgICAgaW50IGludGVycnVwdGVkID0gMDsKKyAgICB3aGlsZSAoa2JoaXQoKSkgeworICAgICAgICBpZiAoZ2V0Y2goKSA9PSAnXDAwMycpCisgICAgICAgICAgICBpbnRlcnJ1cHRlZCA9IDE7CisgICAgfQorICAgIHJldHVybiBpbnRlcnJ1cHRlZDsKIH0KIAogI2VuZGlmIC8qIF9fR05VQ19fICovCkBAIC0xMDYsNyArMTA2LDcgQEAKIHZvaWQKIFB5RXJyX1NldEludGVycnVwdCh2b2lkKQogewotCWludGVycnVwdGVkID0gMTsKKyAgICBpbnRlcnJ1cHRlZCA9IDE7CiB9CiAKIGV4dGVybiBpbnQgUHlFcnJfQ2hlY2tTaWduYWxzKHZvaWQpOwpAQCAtMTE0LDMyICsxMTQsMzIgQEAKIHN0YXRpYyBpbnQKIGNoZWNrc2lnbmFsc193aXRoYXJnKHZvaWQgKiBhcmcpCiB7Ci0JcmV0dXJuIFB5RXJyX0NoZWNrU2lnbmFscygpOworICAgIHJldHVybiBQeUVycl9DaGVja1NpZ25hbHMoKTsKIH0KIAogc3RhdGljIHZvaWQKIGludGNhdGNoZXIoaW50IHNpZykKIHsKLQlleHRlcm4gdm9pZCBQeV9FeGl0KGludCk7Ci0Jc3RhdGljIGNoYXIgbWVzc2FnZVtdID0KKyAgICBleHRlcm4gdm9pZCBQeV9FeGl0KGludCk7CisgICAgc3RhdGljIGNoYXIgbWVzc2FnZVtdID0KICJweXRob246IHRvIGludGVycnVwdCBhIHRydWx5IGhhbmdpbmcgUHl0aG9uIHByb2dyYW0sIGludGVycnVwdCBvbmNlIG1vcmUuXG4iOwotCXN3aXRjaCAoaW50ZXJydXB0ZWQrKykgewotCWNhc2UgMDoKLQkJYnJlYWs7Ci0JY2FzZSAxOgorICAgIHN3aXRjaCAoaW50ZXJydXB0ZWQrKykgeworICAgIGNhc2UgMDoKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgogI2lmZGVmIFJJU0NPUwotCQlmcHJpbnRmKHN0ZGVyciwgbWVzc2FnZSk7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCBtZXNzYWdlKTsKICNlbHNlCi0JCXdyaXRlKDIsIG1lc3NhZ2UsIHN0cmxlbihtZXNzYWdlKSk7CisgICAgICAgIHdyaXRlKDIsIG1lc3NhZ2UsIHN0cmxlbihtZXNzYWdlKSk7CiAjZW5kaWYKLQkJYnJlYWs7Ci0JY2FzZSAyOgotCQlpbnRlcnJ1cHRlZCA9IDA7Ci0JCVB5X0V4aXQoMSk7Ci0JCWJyZWFrOwotCX0KLQlQeU9TX3NldHNpZyhTSUdJTlQsIGludGNhdGNoZXIpOwotCVB5X0FkZFBlbmRpbmdDYWxsKGNoZWNrc2lnbmFsc193aXRoYXJnLCBOVUxMKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgICBpbnRlcnJ1cHRlZCA9IDA7CisgICAgICAgIFB5X0V4aXQoMSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBQeU9TX3NldHNpZyhTSUdJTlQsIGludGNhdGNoZXIpOworICAgIFB5X0FkZFBlbmRpbmdDYWxsKGNoZWNrc2lnbmFsc193aXRoYXJnLCBOVUxMKTsKIH0KIAogc3RhdGljIHZvaWQgKCpvbGRfc2lnaW50aGFuZGxlcikoaW50KSA9IFNJR19ERkw7CkBAIC0xNDcsMjMgKzE0NywyMyBAQAogdm9pZAogUHlPU19Jbml0SW50ZXJydXB0cyh2b2lkKQogewotCWlmICgob2xkX3NpZ2ludGhhbmRsZXIgPSBQeU9TX3NldHNpZyhTSUdJTlQsIFNJR19JR04pKSAhPSBTSUdfSUdOKQotCQlQeU9TX3NldHNpZyhTSUdJTlQsIGludGNhdGNoZXIpOworICAgIGlmICgob2xkX3NpZ2ludGhhbmRsZXIgPSBQeU9TX3NldHNpZyhTSUdJTlQsIFNJR19JR04pKSAhPSBTSUdfSUdOKQorICAgICAgICBQeU9TX3NldHNpZyhTSUdJTlQsIGludGNhdGNoZXIpOwogfQogCiB2b2lkCiBQeU9TX0ZpbmlJbnRlcnJ1cHRzKHZvaWQpCiB7Ci0JUHlPU19zZXRzaWcoU0lHSU5ULCBvbGRfc2lnaW50aGFuZGxlcik7CisgICAgUHlPU19zZXRzaWcoU0lHSU5ULCBvbGRfc2lnaW50aGFuZGxlcik7CiB9CiAKIGludAogUHlPU19JbnRlcnJ1cHRPY2N1cnJlZCh2b2lkKQogewotCWlmICghaW50ZXJydXB0ZWQpCi0JCXJldHVybiAwOwotCWludGVycnVwdGVkID0gMDsKLQlyZXR1cm4gMTsKKyAgICBpZiAoIWludGVycnVwdGVkKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpbnRlcnJ1cHRlZCA9IDA7CisgICAgcmV0dXJuIDE7CiB9CiAKICNlbmRpZiAvKiAhT0sgKi8KQEAgLTE3Miw3ICsxNzIsNyBAQAogUHlPU19BZnRlckZvcmsodm9pZCkKIHsKICNpZmRlZiBXSVRIX1RIUkVBRAotCVB5RXZhbF9SZUluaXRUaHJlYWRzKCk7Ci0JUHlUaHJlYWRfUmVJbml0VExTKCk7CisgICAgUHlFdmFsX1JlSW5pdFRocmVhZHMoKTsKKyAgICBQeVRocmVhZF9SZUluaXRUTFMoKTsKICNlbmRpZgogfQpkaWZmIC0tZ2l0IGEvUGFyc2VyL2xpc3Rub2RlLmMgYi9QYXJzZXIvbGlzdG5vZGUuYwppbmRleCBjMGIzYjY2Li5iNWY4YWQyIDEwMDY0NAotLS0gYS9QYXJzZXIvbGlzdG5vZGUuYworKysgYi9QYXJzZXIvbGlzdG5vZGUuYwpAQCAtMTIsNyArMTIsNyBAQAogdm9pZAogUHlOb2RlX0xpc3RUcmVlKG5vZGUgKm4pCiB7Ci0JbGlzdG5vZGUoc3Rkb3V0LCBuKTsKKyAgICBsaXN0bm9kZShzdGRvdXQsIG4pOwogfQogCiBzdGF0aWMgaW50IGxldmVsLCBhdGJvbDsKQEAgLTIwLDQ3ICsyMCw0NyBAQAogc3RhdGljIHZvaWQKIGxpc3Rub2RlKEZJTEUgKmZwLCBub2RlICpuKQogewotCWxldmVsID0gMDsKLQlhdGJvbCA9IDE7Ci0JbGlzdDFub2RlKGZwLCBuKTsKKyAgICBsZXZlbCA9IDA7CisgICAgYXRib2wgPSAxOworICAgIGxpc3Qxbm9kZShmcCwgbik7CiB9CiAKIHN0YXRpYyB2b2lkCiBsaXN0MW5vZGUoRklMRSAqZnAsIG5vZGUgKm4pCiB7Ci0JaWYgKG4gPT0gMCkKLQkJcmV0dXJuOwotCWlmIChJU05PTlRFUk1JTkFMKFRZUEUobikpKSB7Ci0JCWludCBpOwotCQlmb3IgKGkgPSAwOyBpIDwgTkNIKG4pOyBpKyspCi0JCQlsaXN0MW5vZGUoZnAsIENISUxEKG4sIGkpKTsKLQl9Ci0JZWxzZSBpZiAoSVNURVJNSU5BTChUWVBFKG4pKSkgewotCQlzd2l0Y2ggKFRZUEUobikpIHsKLQkJY2FzZSBJTkRFTlQ6Ci0JCQkrK2xldmVsOwotCQkJYnJlYWs7Ci0JCWNhc2UgREVERU5UOgotCQkJLS1sZXZlbDsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJaWYgKGF0Ym9sKSB7Ci0JCQkJaW50IGk7Ci0JCQkJZm9yIChpID0gMDsgaSA8IGxldmVsOyArK2kpCi0JCQkJCWZwcmludGYoZnAsICJcdCIpOwotCQkJCWF0Ym9sID0gMDsKLQkJCX0KLQkJCWlmIChUWVBFKG4pID09IE5FV0xJTkUpIHsKLQkJCQlpZiAoU1RSKG4pICE9IE5VTEwpCi0JCQkJCWZwcmludGYoZnAsICIlcyIsIFNUUihuKSk7Ci0JCQkJZnByaW50ZihmcCwgIlxuIik7Ci0JCQkJYXRib2wgPSAxOwotCQkJfQotCQkJZWxzZQotCQkJCWZwcmludGYoZnAsICIlcyAiLCBTVFIobikpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JZWxzZQotCQlmcHJpbnRmKGZwLCAiPyAiKTsKKyAgICBpZiAobiA9PSAwKQorICAgICAgICByZXR1cm47CisgICAgaWYgKElTTk9OVEVSTUlOQUwoVFlQRShuKSkpIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBOQ0gobik7IGkrKykKKyAgICAgICAgICAgIGxpc3Qxbm9kZShmcCwgQ0hJTEQobiwgaSkpOworICAgIH0KKyAgICBlbHNlIGlmIChJU1RFUk1JTkFMKFRZUEUobikpKSB7CisgICAgICAgIHN3aXRjaCAoVFlQRShuKSkgeworICAgICAgICBjYXNlIElOREVOVDoKKyAgICAgICAgICAgICsrbGV2ZWw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBERURFTlQ6CisgICAgICAgICAgICAtLWxldmVsOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBpZiAoYXRib2wpIHsKKyAgICAgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGV2ZWw7ICsraSkKKyAgICAgICAgICAgICAgICAgICAgZnByaW50ZihmcCwgIlx0Iik7CisgICAgICAgICAgICAgICAgYXRib2wgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKFRZUEUobikgPT0gTkVXTElORSkgeworICAgICAgICAgICAgICAgIGlmIChTVFIobikgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgZnByaW50ZihmcCwgIiVzIiwgU1RSKG4pKTsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKGZwLCAiXG4iKTsKKyAgICAgICAgICAgICAgICBhdGJvbCA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZnByaW50ZihmcCwgIiVzICIsIFNUUihuKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgICAgIGZwcmludGYoZnAsICI/ICIpOwogfQpkaWZmIC0tZ2l0IGEvUGFyc2VyL21ldGFncmFtbWFyLmMgYi9QYXJzZXIvbWV0YWdyYW1tYXIuYwppbmRleCBiNjFiYzZkLi41MzgxMGI4IDEwMDY0NAotLS0gYS9QYXJzZXIvbWV0YWdyYW1tYXIuYworKysgYi9QYXJzZXIvbWV0YWdyYW1tYXIuYwpAQCAtNCwxNTIgKzQsMTUyIEBACiAjaW5jbHVkZSAiZ3JhbW1hci5oIgogI2luY2x1ZGUgInBnZW4uaCIKIHN0YXRpYyBhcmMgYXJjc18wXzBbM10gPSB7Ci0JezIsIDB9LAotCXszLCAwfSwKLQl7NCwgMX0sCisgICAgezIsIDB9LAorICAgIHszLCAwfSwKKyAgICB7NCwgMX0sCiB9Owogc3RhdGljIGFyYyBhcmNzXzBfMVsxXSA9IHsKLQl7MCwgMX0sCisgICAgezAsIDF9LAogfTsKIHN0YXRpYyBzdGF0ZSBzdGF0ZXNfMFsyXSA9IHsKLQl7MywgYXJjc18wXzB9LAotCXsxLCBhcmNzXzBfMX0sCisgICAgezMsIGFyY3NfMF8wfSwKKyAgICB7MSwgYXJjc18wXzF9LAogfTsKIHN0YXRpYyBhcmMgYXJjc18xXzBbMV0gPSB7Ci0JezUsIDF9LAorICAgIHs1LCAxfSwKIH07CiBzdGF0aWMgYXJjIGFyY3NfMV8xWzFdID0gewotCXs2LCAyfSwKKyAgICB7NiwgMn0sCiB9Owogc3RhdGljIGFyYyBhcmNzXzFfMlsxXSA9IHsKLQl7NywgM30sCisgICAgezcsIDN9LAogfTsKIHN0YXRpYyBhcmMgYXJjc18xXzNbMV0gPSB7Ci0JezMsIDR9LAorICAgIHszLCA0fSwKIH07CiBzdGF0aWMgYXJjIGFyY3NfMV80WzFdID0gewotCXswLCA0fSwKKyAgICB7MCwgNH0sCiB9Owogc3RhdGljIHN0YXRlIHN0YXRlc18xWzVdID0gewotCXsxLCBhcmNzXzFfMH0sCi0JezEsIGFyY3NfMV8xfSwKLQl7MSwgYXJjc18xXzJ9LAotCXsxLCBhcmNzXzFfM30sCi0JezEsIGFyY3NfMV80fSwKKyAgICB7MSwgYXJjc18xXzB9LAorICAgIHsxLCBhcmNzXzFfMX0sCisgICAgezEsIGFyY3NfMV8yfSwKKyAgICB7MSwgYXJjc18xXzN9LAorICAgIHsxLCBhcmNzXzFfNH0sCiB9Owogc3RhdGljIGFyYyBhcmNzXzJfMFsxXSA9IHsKLQl7OCwgMX0sCisgICAgezgsIDF9LAogfTsKIHN0YXRpYyBhcmMgYXJjc18yXzFbMl0gPSB7Ci0JezksIDB9LAotCXswLCAxfSwKKyAgICB7OSwgMH0sCisgICAgezAsIDF9LAogfTsKIHN0YXRpYyBzdGF0ZSBzdGF0ZXNfMlsyXSA9IHsKLQl7MSwgYXJjc18yXzB9LAotCXsyLCBhcmNzXzJfMX0sCisgICAgezEsIGFyY3NfMl8wfSwKKyAgICB7MiwgYXJjc18yXzF9LAogfTsKIHN0YXRpYyBhcmMgYXJjc18zXzBbMV0gPSB7Ci0JezEwLCAxfSwKKyAgICB7MTAsIDF9LAogfTsKIHN0YXRpYyBhcmMgYXJjc18zXzFbMl0gPSB7Ci0JezEwLCAxfSwKLQl7MCwgMX0sCisgICAgezEwLCAxfSwKKyAgICB7MCwgMX0sCiB9Owogc3RhdGljIHN0YXRlIHN0YXRlc18zWzJdID0gewotCXsxLCBhcmNzXzNfMH0sCi0JezIsIGFyY3NfM18xfSwKKyAgICB7MSwgYXJjc18zXzB9LAorICAgIHsyLCBhcmNzXzNfMX0sCiB9Owogc3RhdGljIGFyYyBhcmNzXzRfMFsyXSA9IHsKLQl7MTEsIDF9LAotCXsxMywgMn0sCisgICAgezExLCAxfSwKKyAgICB7MTMsIDJ9LAogfTsKIHN0YXRpYyBhcmMgYXJjc180XzFbMV0gPSB7Ci0JezcsIDN9LAorICAgIHs3LCAzfSwKIH07CiBzdGF0aWMgYXJjIGFyY3NfNF8yWzNdID0gewotCXsxNCwgNH0sCi0JezE1LCA0fSwKLQl7MCwgMn0sCisgICAgezE0LCA0fSwKKyAgICB7MTUsIDR9LAorICAgIHswLCAyfSwKIH07CiBzdGF0aWMgYXJjIGFyY3NfNF8zWzFdID0gewotCXsxMiwgNH0sCisgICAgezEyLCA0fSwKIH07CiBzdGF0aWMgYXJjIGFyY3NfNF80WzFdID0gewotCXswLCA0fSwKKyAgICB7MCwgNH0sCiB9Owogc3RhdGljIHN0YXRlIHN0YXRlc180WzVdID0gewotCXsyLCBhcmNzXzRfMH0sCi0JezEsIGFyY3NfNF8xfSwKLQl7MywgYXJjc180XzJ9LAotCXsxLCBhcmNzXzRfM30sCi0JezEsIGFyY3NfNF80fSwKKyAgICB7MiwgYXJjc180XzB9LAorICAgIHsxLCBhcmNzXzRfMX0sCisgICAgezMsIGFyY3NfNF8yfSwKKyAgICB7MSwgYXJjc180XzN9LAorICAgIHsxLCBhcmNzXzRfNH0sCiB9Owogc3RhdGljIGFyYyBhcmNzXzVfMFszXSA9IHsKLQl7NSwgMX0sCi0JezE2LCAxfSwKLQl7MTcsIDJ9LAorICAgIHs1LCAxfSwKKyAgICB7MTYsIDF9LAorICAgIHsxNywgMn0sCiB9Owogc3RhdGljIGFyYyBhcmNzXzVfMVsxXSA9IHsKLQl7MCwgMX0sCisgICAgezAsIDF9LAogfTsKIHN0YXRpYyBhcmMgYXJjc181XzJbMV0gPSB7Ci0JezcsIDN9LAorICAgIHs3LCAzfSwKIH07CiBzdGF0aWMgYXJjIGFyY3NfNV8zWzFdID0gewotCXsxOCwgMX0sCisgICAgezE4LCAxfSwKIH07CiBzdGF0aWMgc3RhdGUgc3RhdGVzXzVbNF0gPSB7Ci0JezMsIGFyY3NfNV8wfSwKLQl7MSwgYXJjc181XzF9LAotCXsxLCBhcmNzXzVfMn0sCi0JezEsIGFyY3NfNV8zfSwKKyAgICB7MywgYXJjc181XzB9LAorICAgIHsxLCBhcmNzXzVfMX0sCisgICAgezEsIGFyY3NfNV8yfSwKKyAgICB7MSwgYXJjc181XzN9LAogfTsKIHN0YXRpYyBkZmEgZGZhc1s2XSA9IHsKLQl7MjU2LCAiTVNUQVJUIiwgMCwgMiwgc3RhdGVzXzAsCi0JICJcMDcwXDAwMFwwMDAifSwKLQl7MjU3LCAiUlVMRSIsIDAsIDUsIHN0YXRlc18xLAotCSAiXDA0MFwwMDBcMDAwIn0sCi0JezI1OCwgIlJIUyIsIDAsIDIsIHN0YXRlc18yLAotCSAiXDA0MFwwMTBcMDAzIn0sCi0JezI1OSwgIkFMVCIsIDAsIDIsIHN0YXRlc18zLAotCSAiXDA0MFwwMTBcMDAzIn0sCi0JezI2MCwgIklURU0iLCAwLCA1LCBzdGF0ZXNfNCwKLQkgIlwwNDBcMDEwXDAwMyJ9LAotCXsyNjEsICJBVE9NIiwgMCwgNCwgc3RhdGVzXzUsCi0JICJcMDQwXDAwMFwwMDMifSwKKyAgICB7MjU2LCAiTVNUQVJUIiwgMCwgMiwgc3RhdGVzXzAsCisgICAgICJcMDcwXDAwMFwwMDAifSwKKyAgICB7MjU3LCAiUlVMRSIsIDAsIDUsIHN0YXRlc18xLAorICAgICAiXDA0MFwwMDBcMDAwIn0sCisgICAgezI1OCwgIlJIUyIsIDAsIDIsIHN0YXRlc18yLAorICAgICAiXDA0MFwwMTBcMDAzIn0sCisgICAgezI1OSwgIkFMVCIsIDAsIDIsIHN0YXRlc18zLAorICAgICAiXDA0MFwwMTBcMDAzIn0sCisgICAgezI2MCwgIklURU0iLCAwLCA1LCBzdGF0ZXNfNCwKKyAgICAgIlwwNDBcMDEwXDAwMyJ9LAorICAgIHsyNjEsICJBVE9NIiwgMCwgNCwgc3RhdGVzXzUsCisgICAgICJcMDQwXDAwMFwwMDMifSwKIH07CiBzdGF0aWMgbGFiZWwgbGFiZWxzWzE5XSA9IHsKLQl7MCwgIkVNUFRZIn0sCi0JezI1NiwgMH0sCi0JezI1NywgMH0sCi0JezQsIDB9LAotCXswLCAwfSwKLQl7MSwgMH0sCi0JezExLCAwfSwKLQl7MjU4LCAwfSwKLQl7MjU5LCAwfSwKLQl7MTgsIDB9LAotCXsyNjAsIDB9LAotCXs5LCAwfSwKLQl7MTAsIDB9LAotCXsyNjEsIDB9LAotCXsxNiwgMH0sCi0JezE0LCAwfSwKLQl7MywgMH0sCi0JezcsIDB9LAotCXs4LCAwfSwKKyAgICB7MCwgIkVNUFRZIn0sCisgICAgezI1NiwgMH0sCisgICAgezI1NywgMH0sCisgICAgezQsIDB9LAorICAgIHswLCAwfSwKKyAgICB7MSwgMH0sCisgICAgezExLCAwfSwKKyAgICB7MjU4LCAwfSwKKyAgICB7MjU5LCAwfSwKKyAgICB7MTgsIDB9LAorICAgIHsyNjAsIDB9LAorICAgIHs5LCAwfSwKKyAgICB7MTAsIDB9LAorICAgIHsyNjEsIDB9LAorICAgIHsxNiwgMH0sCisgICAgezE0LCAwfSwKKyAgICB7MywgMH0sCisgICAgezcsIDB9LAorICAgIHs4LCAwfSwKIH07CiBzdGF0aWMgZ3JhbW1hciBfUHlQYXJzZXJfR3JhbW1hciA9IHsKLQk2LAotCWRmYXMsCi0JezE5LCBsYWJlbHN9LAotCTI1NgorICAgIDYsCisgICAgZGZhcywKKyAgICB7MTksIGxhYmVsc30sCisgICAgMjU2CiB9OwogCiBncmFtbWFyICoKIG1ldGFfZ3JhbW1hcih2b2lkKQogewotCXJldHVybiAmX1B5UGFyc2VyX0dyYW1tYXI7CisgICAgcmV0dXJuICZfUHlQYXJzZXJfR3JhbW1hcjsKIH0KIAogZ3JhbW1hciAqCmRpZmYgLS1naXQgYS9QYXJzZXIvbXlyZWFkbGluZS5jIGIvUGFyc2VyL215cmVhZGxpbmUuYwppbmRleCAzMmExMDg4Li4xMjJmODk2IDEwMDY0NAotLS0gYS9QYXJzZXIvbXlyZWFkbGluZS5jCisrKyBiL1BhcnNlci9teXJlYWRsaW5lLmMKQEAgLTM5LDY3ICszOSw2NyBAQAogc3RhdGljIGludAogbXlfZmdldHMoY2hhciAqYnVmLCBpbnQgbGVuLCBGSUxFICpmcCkKIHsKLQljaGFyICpwOwotCWZvciAoOzspIHsKLQkJaWYgKFB5T1NfSW5wdXRIb29rICE9IE5VTEwpCi0JCQkodm9pZCkoUHlPU19JbnB1dEhvb2spKCk7Ci0JCWVycm5vID0gMDsKLQkJcCA9IGZnZXRzKGJ1ZiwgbGVuLCBmcCk7Ci0JCWlmIChwICE9IE5VTEwpCi0JCQlyZXR1cm4gMDsgLyogTm8gZXJyb3IgKi8KKyAgICBjaGFyICpwOworICAgIGZvciAoOzspIHsKKyAgICAgICAgaWYgKFB5T1NfSW5wdXRIb29rICE9IE5VTEwpCisgICAgICAgICAgICAodm9pZCkoUHlPU19JbnB1dEhvb2spKCk7CisgICAgICAgIGVycm5vID0gMDsKKyAgICAgICAgcCA9IGZnZXRzKGJ1ZiwgbGVuLCBmcCk7CisgICAgICAgIGlmIChwICE9IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gMDsgLyogTm8gZXJyb3IgKi8KICNpZmRlZiBNU19XSU5ET1dTCi0JCS8qIEluIHRoZSBjYXNlIG9mIGEgQ3RybCtDIG9yIHNvbWUgb3RoZXIgZXh0ZXJuYWwgZXZlbnQgCi0JCSAgIGludGVycnVwdGluZyB0aGUgb3BlcmF0aW9uOgotCQkgICBXaW4yay9OVDogRVJST1JfT1BFUkFUSU9OX0FCT1JURUQgaXMgdGhlIG1vc3QgcmVjZW50IFdpbjMyIAotCQkgICBlcnJvciBjb2RlIChhbmQgZmVvZigpIHJldHVybnMgVFJVRSkuCi0JCSAgIFdpbjl4OiBDdHJsK0Mgc2VlbXMgdG8gaGF2ZSBubyBlZmZlY3Qgb24gZmdldHMoKSByZXR1cm5pbmcKLQkJICAgZWFybHkgLSB0aGUgc2lnbmFsIGhhbmRsZXIgaXMgY2FsbGVkLCBidXQgdGhlIGZnZXRzKCkKLQkJICAgb25seSByZXR1cm5zICJub3JtYWxseSIgKGllLCB3aGVuIEVudGVyIGhpdCBvciBmZW9mKCkpCi0JCSovCi0JCWlmIChHZXRMYXN0RXJyb3IoKT09RVJST1JfT1BFUkFUSU9OX0FCT1JURUQpIHsKLQkJCS8qIFNpZ25hbHMgY29tZSBhc3luY2hyb25vdXNseSwgc28gd2Ugc2xlZXAgYSBicmllZiAKLQkJCSAgIG1vbWVudCBiZWZvcmUgY2hlY2tpbmcgaWYgdGhlIGhhbmRsZXIgaGFzIGJlZW4gCi0JCQkgICB0cmlnZ2VyZWQgKHdlIGNhbnQganVzdCByZXR1cm4gMSBiZWZvcmUgdGhlIAotCQkJICAgc2lnbmFsIGhhbmRsZXIgaGFzIGJlZW4gY2FsbGVkLCBhcyB0aGUgbGF0ZXIgCi0JCQkgICBzaWduYWwgbWF5IGJlIHRyZWF0ZWQgYXMgYSBzZXBhcmF0ZSBpbnRlcnJ1cHQpLgotCQkJKi8KLQkJCVNsZWVwKDEpOwotCQkJaWYgKFB5T1NfSW50ZXJydXB0T2NjdXJyZWQoKSkgewotCQkJCXJldHVybiAxOyAvKiBJbnRlcnJ1cHQgKi8KLQkJCX0KLQkJCS8qIEVpdGhlciB0aGUgc2xlZXAgd2Fzbid0IGxvbmcgZW5vdWdoIChuZWVkIGEKLQkJCSAgIHNob3J0IGxvb3AgcmV0cnlpbmc/KSBvciBub3QgaW50ZXJydXB0ZWQgYXQgYWxsCi0JCQkgICAoaW4gd2hpY2ggY2FzZSB3ZSBzaG91bGQgcmV2aXNpdCB0aGUgd2hvbGUgdGhpbmchKQotCQkJICAgTG9nZ2luZyBzb21lIHdhcm5pbmcgd291bGQgYmUgbmljZS4gIGFzc2VydCBpcyBub3QKLQkJCSAgIHZpYWJsZSBhcyB1bmRlciB0aGUgZGVidWdnZXIsIHRoZSB2YXJpb3VzIGRpYWxvZ3MKLQkJCSAgIG1lYW4gdGhlIGNvbmRpdGlvbiBpcyBub3QgdHJ1ZS4KLQkJCSovCi0JCX0KKyAgICAgICAgLyogSW4gdGhlIGNhc2Ugb2YgYSBDdHJsK0Mgb3Igc29tZSBvdGhlciBleHRlcm5hbCBldmVudAorICAgICAgICAgICBpbnRlcnJ1cHRpbmcgdGhlIG9wZXJhdGlvbjoKKyAgICAgICAgICAgV2luMmsvTlQ6IEVSUk9SX09QRVJBVElPTl9BQk9SVEVEIGlzIHRoZSBtb3N0IHJlY2VudCBXaW4zMgorICAgICAgICAgICBlcnJvciBjb2RlIChhbmQgZmVvZigpIHJldHVybnMgVFJVRSkuCisgICAgICAgICAgIFdpbjl4OiBDdHJsK0Mgc2VlbXMgdG8gaGF2ZSBubyBlZmZlY3Qgb24gZmdldHMoKSByZXR1cm5pbmcKKyAgICAgICAgICAgZWFybHkgLSB0aGUgc2lnbmFsIGhhbmRsZXIgaXMgY2FsbGVkLCBidXQgdGhlIGZnZXRzKCkKKyAgICAgICAgICAgb25seSByZXR1cm5zICJub3JtYWxseSIgKGllLCB3aGVuIEVudGVyIGhpdCBvciBmZW9mKCkpCisgICAgICAgICovCisgICAgICAgIGlmIChHZXRMYXN0RXJyb3IoKT09RVJST1JfT1BFUkFUSU9OX0FCT1JURUQpIHsKKyAgICAgICAgICAgIC8qIFNpZ25hbHMgY29tZSBhc3luY2hyb25vdXNseSwgc28gd2Ugc2xlZXAgYSBicmllZgorICAgICAgICAgICAgICAgbW9tZW50IGJlZm9yZSBjaGVja2luZyBpZiB0aGUgaGFuZGxlciBoYXMgYmVlbgorICAgICAgICAgICAgICAgdHJpZ2dlcmVkICh3ZSBjYW50IGp1c3QgcmV0dXJuIDEgYmVmb3JlIHRoZQorICAgICAgICAgICAgICAgc2lnbmFsIGhhbmRsZXIgaGFzIGJlZW4gY2FsbGVkLCBhcyB0aGUgbGF0ZXIKKyAgICAgICAgICAgICAgIHNpZ25hbCBtYXkgYmUgdHJlYXRlZCBhcyBhIHNlcGFyYXRlIGludGVycnVwdCkuCisgICAgICAgICAgICAqLworICAgICAgICAgICAgU2xlZXAoMSk7CisgICAgICAgICAgICBpZiAoUHlPU19JbnRlcnJ1cHRPY2N1cnJlZCgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7IC8qIEludGVycnVwdCAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogRWl0aGVyIHRoZSBzbGVlcCB3YXNuJ3QgbG9uZyBlbm91Z2ggKG5lZWQgYQorICAgICAgICAgICAgICAgc2hvcnQgbG9vcCByZXRyeWluZz8pIG9yIG5vdCBpbnRlcnJ1cHRlZCBhdCBhbGwKKyAgICAgICAgICAgICAgIChpbiB3aGljaCBjYXNlIHdlIHNob3VsZCByZXZpc2l0IHRoZSB3aG9sZSB0aGluZyEpCisgICAgICAgICAgICAgICBMb2dnaW5nIHNvbWUgd2FybmluZyB3b3VsZCBiZSBuaWNlLiAgYXNzZXJ0IGlzIG5vdAorICAgICAgICAgICAgICAgdmlhYmxlIGFzIHVuZGVyIHRoZSBkZWJ1Z2dlciwgdGhlIHZhcmlvdXMgZGlhbG9ncworICAgICAgICAgICAgICAgbWVhbiB0aGUgY29uZGl0aW9uIGlzIG5vdCB0cnVlLgorICAgICAgICAgICAgKi8KKyAgICAgICAgfQogI2VuZGlmIC8qIE1TX1dJTkRPV1MgKi8KLQkJaWYgKGZlb2YoZnApKSB7Ci0JCQlyZXR1cm4gLTE7IC8qIEVPRiAqLwotCQl9CisgICAgICAgIGlmIChmZW9mKGZwKSkgeworICAgICAgICAgICAgcmV0dXJuIC0xOyAvKiBFT0YgKi8KKyAgICAgICAgfQogI2lmZGVmIEVJTlRSCi0JCWlmIChlcnJubyA9PSBFSU5UUikgewotCQkJaW50IHM7CisgICAgICAgIGlmIChlcnJubyA9PSBFSU5UUikgeworICAgICAgICAgICAgaW50IHM7CiAjaWZkZWYgV0lUSF9USFJFQUQKLQkJCVB5RXZhbF9SZXN0b3JlVGhyZWFkKF9QeU9TX1JlYWRsaW5lVFN0YXRlKTsKKyAgICAgICAgICAgIFB5RXZhbF9SZXN0b3JlVGhyZWFkKF9QeU9TX1JlYWRsaW5lVFN0YXRlKTsKICNlbmRpZgotCQkJcyA9IFB5RXJyX0NoZWNrU2lnbmFscygpOworICAgICAgICAgICAgcyA9IFB5RXJyX0NoZWNrU2lnbmFscygpOwogI2lmZGVmIFdJVEhfVEhSRUFECi0JCQlQeUV2YWxfU2F2ZVRocmVhZCgpOworICAgICAgICAgICAgUHlFdmFsX1NhdmVUaHJlYWQoKTsKICNlbmRpZgotCQkJaWYgKHMgPCAwKSB7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9Ci0JCX0KKyAgICAgICAgICAgIGlmIChzIDwgMCkgeworICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgfQorICAgICAgICB9CiAjZW5kaWYKLQkJaWYgKFB5T1NfSW50ZXJydXB0T2NjdXJyZWQoKSkgewotCQkJcmV0dXJuIDE7IC8qIEludGVycnVwdCAqLwotCQl9Ci0JCXJldHVybiAtMjsgLyogRXJyb3IgKi8KLQl9Ci0JLyogTk9UUkVBQ0hFRCAqLworICAgICAgICBpZiAoUHlPU19JbnRlcnJ1cHRPY2N1cnJlZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gMTsgLyogSW50ZXJydXB0ICovCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIC0yOyAvKiBFcnJvciAqLworICAgIH0KKyAgICAvKiBOT1RSRUFDSEVEICovCiB9CiAKIApAQCAtMTA4LDUwICsxMDgsNTAgQEAKIGNoYXIgKgogUHlPU19TdGRpb1JlYWRsaW5lKEZJTEUgKnN5c19zdGRpbiwgRklMRSAqc3lzX3N0ZG91dCwgY2hhciAqcHJvbXB0KQogewotCXNpemVfdCBuOwotCWNoYXIgKnA7Ci0JbiA9IDEwMDsKLQlpZiAoKHAgPSAoY2hhciAqKVB5TWVtX01BTExPQyhuKSkgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JZmZsdXNoKHN5c19zdGRvdXQpOworICAgIHNpemVfdCBuOworICAgIGNoYXIgKnA7CisgICAgbiA9IDEwMDsKKyAgICBpZiAoKHAgPSAoY2hhciAqKVB5TWVtX01BTExPQyhuKSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZmZsdXNoKHN5c19zdGRvdXQpOwogI2lmbmRlZiBSSVNDT1MKLQlpZiAocHJvbXB0KQotCQlmcHJpbnRmKHN0ZGVyciwgIiVzIiwgcHJvbXB0KTsKKyAgICBpZiAocHJvbXB0KQorICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzIiwgcHJvbXB0KTsKICNlbHNlCi0JaWYgKHByb21wdCkgewotCQlpZihQeV9SSVNDT1NXaW1wRmxhZykKLQkJCWZwcmludGYoc3RkZXJyLCAiXHgwY3Ilc1x4MGMiLCBwcm9tcHQpOwotCQllbHNlCi0JCQlmcHJpbnRmKHN0ZGVyciwgIiVzIiwgcHJvbXB0KTsKLQl9CisgICAgaWYgKHByb21wdCkgeworICAgICAgICBpZihQeV9SSVNDT1NXaW1wRmxhZykKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiXHgwY3Ilc1x4MGMiLCBwcm9tcHQpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzIiwgcHJvbXB0KTsKKyAgICB9CiAjZW5kaWYKLQlmZmx1c2goc3RkZXJyKTsKLQlzd2l0Y2ggKG15X2ZnZXRzKHAsIChpbnQpbiwgc3lzX3N0ZGluKSkgewotCWNhc2UgMDogLyogTm9ybWFsIGNhc2UgKi8KLQkJYnJlYWs7Ci0JY2FzZSAxOiAvKiBJbnRlcnJ1cHQgKi8KLQkJUHlNZW1fRlJFRShwKTsKLQkJcmV0dXJuIE5VTEw7Ci0JY2FzZSAtMTogLyogRU9GICovCi0JY2FzZSAtMjogLyogRXJyb3IgKi8KLQlkZWZhdWx0OiAvKiBTaG91bGRuJ3QgaGFwcGVuICovCi0JCSpwID0gJ1wwJzsKLQkJYnJlYWs7Ci0JfQotCW4gPSBzdHJsZW4ocCk7Ci0Jd2hpbGUgKG4gPiAwICYmIHBbbi0xXSAhPSAnXG4nKSB7Ci0JCXNpemVfdCBpbmNyID0gbisyOwotCQlwID0gKGNoYXIgKilQeU1lbV9SRUFMTE9DKHAsIG4gKyBpbmNyKTsKLQkJaWYgKHAgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQlpZiAoaW5jciA+IElOVF9NQVgpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLCAiaW5wdXQgbGluZSB0b28gbG9uZyIpOwotCQl9Ci0JCWlmIChteV9mZ2V0cyhwK24sIChpbnQpaW5jciwgc3lzX3N0ZGluKSAhPSAwKQotCQkJYnJlYWs7Ci0JCW4gKz0gc3RybGVuKHArbik7Ci0JfQotCXJldHVybiAoY2hhciAqKVB5TWVtX1JFQUxMT0MocCwgbisxKTsKKyAgICBmZmx1c2goc3RkZXJyKTsKKyAgICBzd2l0Y2ggKG15X2ZnZXRzKHAsIChpbnQpbiwgc3lzX3N0ZGluKSkgeworICAgIGNhc2UgMDogLyogTm9ybWFsIGNhc2UgKi8KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOiAvKiBJbnRlcnJ1cHQgKi8KKyAgICAgICAgUHlNZW1fRlJFRShwKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgY2FzZSAtMTogLyogRU9GICovCisgICAgY2FzZSAtMjogLyogRXJyb3IgKi8KKyAgICBkZWZhdWx0OiAvKiBTaG91bGRuJ3QgaGFwcGVuICovCisgICAgICAgICpwID0gJ1wwJzsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIG4gPSBzdHJsZW4ocCk7CisgICAgd2hpbGUgKG4gPiAwICYmIHBbbi0xXSAhPSAnXG4nKSB7CisgICAgICAgIHNpemVfdCBpbmNyID0gbisyOworICAgICAgICBwID0gKGNoYXIgKilQeU1lbV9SRUFMTE9DKHAsIG4gKyBpbmNyKTsKKyAgICAgICAgaWYgKHAgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBpZiAoaW5jciA+IElOVF9NQVgpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLCAiaW5wdXQgbGluZSB0b28gbG9uZyIpOworICAgICAgICB9CisgICAgICAgIGlmIChteV9mZ2V0cyhwK24sIChpbnQpaW5jciwgc3lzX3N0ZGluKSAhPSAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIG4gKz0gc3RybGVuKHArbik7CisgICAgfQorICAgIHJldHVybiAoY2hhciAqKVB5TWVtX1JFQUxMT0MocCwgbisxKTsKIH0KIAogCkBAIC0xNjgsNTIgKzE2OCw1MiBAQAogY2hhciAqCiBQeU9TX1JlYWRsaW5lKEZJTEUgKnN5c19zdGRpbiwgRklMRSAqc3lzX3N0ZG91dCwgY2hhciAqcHJvbXB0KQogewotCWNoYXIgKnJ2OworICAgIGNoYXIgKnJ2OwogCi0JaWYgKF9QeU9TX1JlYWRsaW5lVFN0YXRlID09IFB5VGhyZWFkU3RhdGVfR0VUKCkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKLQkJCQkiY2FuJ3QgcmUtZW50ZXIgcmVhZGxpbmUiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCQorICAgIGlmIChfUHlPU19SZWFkbGluZVRTdGF0ZSA9PSBQeVRocmVhZFN0YXRlX0dFVCgpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiY2FuJ3QgcmUtZW50ZXIgcmVhZGxpbmUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaWYgKFB5T1NfUmVhZGxpbmVGdW5jdGlvblBvaW50ZXIgPT0gTlVMTCkgeworCisgICAgaWYgKFB5T1NfUmVhZGxpbmVGdW5jdGlvblBvaW50ZXIgPT0gTlVMTCkgewogI2lmZGVmIF9fVk1TCi0gICAgICAgICAgICAgICAgUHlPU19SZWFkbGluZUZ1bmN0aW9uUG9pbnRlciA9IHZtc19fU3RkaW9SZWFkbGluZTsKKyAgICAgICAgUHlPU19SZWFkbGluZUZ1bmN0aW9uUG9pbnRlciA9IHZtc19fU3RkaW9SZWFkbGluZTsKICNlbHNlCi0gICAgICAgICAgICAgICAgUHlPU19SZWFkbGluZUZ1bmN0aW9uUG9pbnRlciA9IFB5T1NfU3RkaW9SZWFkbGluZTsKKyAgICAgICAgUHlPU19SZWFkbGluZUZ1bmN0aW9uUG9pbnRlciA9IFB5T1NfU3RkaW9SZWFkbGluZTsKICNlbmRpZgotCX0KLQkKLSNpZmRlZiBXSVRIX1RIUkVBRAotCWlmIChfUHlPU19SZWFkbGluZUxvY2sgPT0gTlVMTCkgewotCQlfUHlPU19SZWFkbGluZUxvY2sgPSBQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKCk7CQkKLQl9Ci0jZW5kaWYKLQotCV9QeU9TX1JlYWRsaW5lVFN0YXRlID0gUHlUaHJlYWRTdGF0ZV9HRVQoKTsKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0jaWZkZWYgV0lUSF9USFJFQUQKLQlQeVRocmVhZF9hY3F1aXJlX2xvY2soX1B5T1NfUmVhZGxpbmVMb2NrLCAxKTsKLSNlbmRpZgotCi0gICAgICAgIC8qIFRoaXMgaXMgbmVlZGVkIHRvIGhhbmRsZSB0aGUgdW5saWtlbHkgY2FzZSB0aGF0IHRoZQotICAgICAgICAgKiBpbnRlcnByZXRlciBpcyBpbiBpbnRlcmFjdGl2ZSBtb2RlICphbmQqIHN0ZGluL291dCBhcmUgbm90Ci0gICAgICAgICAqIGEgdHR5LiAgVGhpcyBjYW4gaGFwcGVuLCBmb3IgZXhhbXBsZSBpZiBweXRob24gaXMgcnVuIGxpa2UKLSAgICAgICAgICogdGhpczogcHl0aG9uIC1pIDwgdGVzdDEucHkKLSAgICAgICAgICovCi0gICAgICAgIGlmICghaXNhdHR5IChmaWxlbm8gKHN5c19zdGRpbikpIHx8ICFpc2F0dHkgKGZpbGVubyAoc3lzX3N0ZG91dCkpKQotICAgICAgICAgICAgICAgIHJ2ID0gUHlPU19TdGRpb1JlYWRsaW5lIChzeXNfc3RkaW4sIHN5c19zdGRvdXQsIHByb21wdCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBydiA9ICgqUHlPU19SZWFkbGluZUZ1bmN0aW9uUG9pbnRlcikoc3lzX3N0ZGluLCBzeXNfc3Rkb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9tcHQpOwotCVB5X0VORF9BTExPV19USFJFQURTCisgICAgfQogCiAjaWZkZWYgV0lUSF9USFJFQUQKLQlQeVRocmVhZF9yZWxlYXNlX2xvY2soX1B5T1NfUmVhZGxpbmVMb2NrKTsKKyAgICBpZiAoX1B5T1NfUmVhZGxpbmVMb2NrID09IE5VTEwpIHsKKyAgICAgICAgX1B5T1NfUmVhZGxpbmVMb2NrID0gUHlUaHJlYWRfYWxsb2NhdGVfbG9jaygpOworICAgIH0KICNlbmRpZgogCi0JX1B5T1NfUmVhZGxpbmVUU3RhdGUgPSBOVUxMOworICAgIF9QeU9TX1JlYWRsaW5lVFN0YXRlID0gUHlUaHJlYWRTdGF0ZV9HRVQoKTsKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisjaWZkZWYgV0lUSF9USFJFQUQKKyAgICBQeVRocmVhZF9hY3F1aXJlX2xvY2soX1B5T1NfUmVhZGxpbmVMb2NrLCAxKTsKKyNlbmRpZgogCi0JcmV0dXJuIHJ2OworICAgIC8qIFRoaXMgaXMgbmVlZGVkIHRvIGhhbmRsZSB0aGUgdW5saWtlbHkgY2FzZSB0aGF0IHRoZQorICAgICAqIGludGVycHJldGVyIGlzIGluIGludGVyYWN0aXZlIG1vZGUgKmFuZCogc3RkaW4vb3V0IGFyZSBub3QKKyAgICAgKiBhIHR0eS4gIFRoaXMgY2FuIGhhcHBlbiwgZm9yIGV4YW1wbGUgaWYgcHl0aG9uIGlzIHJ1biBsaWtlCisgICAgICogdGhpczogcHl0aG9uIC1pIDwgdGVzdDEucHkKKyAgICAgKi8KKyAgICBpZiAoIWlzYXR0eSAoZmlsZW5vIChzeXNfc3RkaW4pKSB8fCAhaXNhdHR5IChmaWxlbm8gKHN5c19zdGRvdXQpKSkKKyAgICAgICAgcnYgPSBQeU9TX1N0ZGlvUmVhZGxpbmUgKHN5c19zdGRpbiwgc3lzX3N0ZG91dCwgcHJvbXB0KTsKKyAgICBlbHNlCisgICAgICAgIHJ2ID0gKCpQeU9TX1JlYWRsaW5lRnVuY3Rpb25Qb2ludGVyKShzeXNfc3RkaW4sIHN5c19zdGRvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9tcHQpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCisKKyNpZmRlZiBXSVRIX1RIUkVBRAorICAgIFB5VGhyZWFkX3JlbGVhc2VfbG9jayhfUHlPU19SZWFkbGluZUxvY2spOworI2VuZGlmCisKKyAgICBfUHlPU19SZWFkbGluZVRTdGF0ZSA9IE5VTEw7CisKKyAgICByZXR1cm4gcnY7CiB9CmRpZmYgLS1naXQgYS9QYXJzZXIvbm9kZS5jIGIvUGFyc2VyL25vZGUuYwppbmRleCBmNGM4NmNiLi45ZWJhNzZiIDEwMDY0NAotLS0gYS9QYXJzZXIvbm9kZS5jCisrKyBiL1BhcnNlci9ub2RlLmMKQEAgLTcsMzAgKzcsMzAgQEAKIG5vZGUgKgogUHlOb2RlX05ldyhpbnQgdHlwZSkKIHsKLQlub2RlICpuID0gKG5vZGUgKikgUHlPYmplY3RfTUFMTE9DKDEgKiBzaXplb2Yobm9kZSkpOwotCWlmIChuID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCW4tPm5fdHlwZSA9IHR5cGU7Ci0Jbi0+bl9zdHIgPSBOVUxMOwotCW4tPm5fbGluZW5vID0gMDsKLQluLT5uX25jaGlsZHJlbiA9IDA7Ci0Jbi0+bl9jaGlsZCA9IE5VTEw7Ci0JcmV0dXJuIG47CisgICAgbm9kZSAqbiA9IChub2RlICopIFB5T2JqZWN0X01BTExPQygxICogc2l6ZW9mKG5vZGUpKTsKKyAgICBpZiAobiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBuLT5uX3R5cGUgPSB0eXBlOworICAgIG4tPm5fc3RyID0gTlVMTDsKKyAgICBuLT5uX2xpbmVubyA9IDA7CisgICAgbi0+bl9uY2hpbGRyZW4gPSAwOworICAgIG4tPm5fY2hpbGQgPSBOVUxMOworICAgIHJldHVybiBuOwogfQogCiAvKiBTZWUgY29tbWVudHMgYXQgWFhYUk9VTkRVUCBiZWxvdy4gIFJldHVybnMgLTEgb24gb3ZlcmZsb3cuICovCiBzdGF0aWMgaW50CiBmYW5jeV9yb3VuZHVwKGludCBuKQogewotCS8qIFJvdW5kIHVwIHRvIHRoZSBjbG9zZXN0IHBvd2VyIG9mIDIgPj0gbi4gKi8KLQlpbnQgcmVzdWx0ID0gMjU2OwotCWFzc2VydChuID4gMTI4KTsKLQl3aGlsZSAocmVzdWx0IDwgbikgewotCQlyZXN1bHQgPDw9IDE7Ci0JCWlmIChyZXN1bHQgPD0gMCkKLQkJCXJldHVybiAtMTsKLQl9Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICAvKiBSb3VuZCB1cCB0byB0aGUgY2xvc2VzdCBwb3dlciBvZiAyID49IG4uICovCisgICAgaW50IHJlc3VsdCA9IDI1NjsKKyAgICBhc3NlcnQobiA+IDEyOCk7CisgICAgd2hpbGUgKHJlc3VsdCA8IG4pIHsKKyAgICAgICAgcmVzdWx0IDw8PSAxOworICAgICAgICBpZiAocmVzdWx0IDw9IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIC8qIEEgZ2ltbWljayB0byBtYWtlIG1hc3NpdmUgbnVtYmVycyBvZiByZWFsbG9jcyBxdWlja2VyLiAgVGhlIHJlc3VsdCBpcwpAQCAtNzAsNDYgKzcwLDQ2IEBACiAgKiBOb3RlIHRoYXQgdGhpcyB3b3VsZCBiZSBzdHJhaWdodGZvcndhcmQgaWYgYSBub2RlIHN0b3JlZCBpdHMgY3VycmVudAogICogY2FwYWNpdHkuICBUaGUgY29kZSBpcyB0cmlja3kgdG8gYXZvaWQgdGhhdC4KICAqLwotI2RlZmluZSBYWFhST1VORFVQKG4pICgobikgPD0gMSA/IChuKSA6IAkJXAotCQkgICAgICAgKG4pIDw9IDEyOCA/ICgoKG4pICsgMykgJiB+MykgOglcCi0JCSAgICAgICBmYW5jeV9yb3VuZHVwKG4pKQorI2RlZmluZSBYWFhST1VORFVQKG4pICgobikgPD0gMSA/IChuKSA6ICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAobikgPD0gMTI4ID8gKCgobikgKyAzKSAmIH4zKSA6ICAgICAgICAgIFwKKyAgICAgICAgICAgICAgIGZhbmN5X3JvdW5kdXAobikpCiAKIAogaW50CiBQeU5vZGVfQWRkQ2hpbGQocmVnaXN0ZXIgbm9kZSAqbjEsIGludCB0eXBlLCBjaGFyICpzdHIsIGludCBsaW5lbm8sIGludCBjb2xfb2Zmc2V0KQogewotCWNvbnN0IGludCBuY2ggPSBuMS0+bl9uY2hpbGRyZW47Ci0JaW50IGN1cnJlbnRfY2FwYWNpdHk7Ci0JaW50IHJlcXVpcmVkX2NhcGFjaXR5OwotCW5vZGUgKm47CisgICAgY29uc3QgaW50IG5jaCA9IG4xLT5uX25jaGlsZHJlbjsKKyAgICBpbnQgY3VycmVudF9jYXBhY2l0eTsKKyAgICBpbnQgcmVxdWlyZWRfY2FwYWNpdHk7CisgICAgbm9kZSAqbjsKIAotCWlmIChuY2ggPT0gSU5UX01BWCB8fCBuY2ggPCAwKQotCQlyZXR1cm4gRV9PVkVSRkxPVzsKKyAgICBpZiAobmNoID09IElOVF9NQVggfHwgbmNoIDwgMCkKKyAgICAgICAgcmV0dXJuIEVfT1ZFUkZMT1c7CiAKLQljdXJyZW50X2NhcGFjaXR5ID0gWFhYUk9VTkRVUChuY2gpOwotCXJlcXVpcmVkX2NhcGFjaXR5ID0gWFhYUk9VTkRVUChuY2ggKyAxKTsKLQlpZiAoY3VycmVudF9jYXBhY2l0eSA8IDAgfHwgcmVxdWlyZWRfY2FwYWNpdHkgPCAwKQotCQlyZXR1cm4gRV9PVkVSRkxPVzsKLQlpZiAoY3VycmVudF9jYXBhY2l0eSA8IHJlcXVpcmVkX2NhcGFjaXR5KSB7Ci0JCWlmIChyZXF1aXJlZF9jYXBhY2l0eSA+IFBZX1NJWkVfTUFYIC8gc2l6ZW9mKG5vZGUpKSB7Ci0JCQlyZXR1cm4gRV9OT01FTTsKLQkJfQotCQluID0gbjEtPm5fY2hpbGQ7Ci0JCW4gPSAobm9kZSAqKSBQeU9iamVjdF9SRUFMTE9DKG4sCi0JCQkJCSAgICAgIHJlcXVpcmVkX2NhcGFjaXR5ICogc2l6ZW9mKG5vZGUpKTsKLQkJaWYgKG4gPT0gTlVMTCkKLQkJCXJldHVybiBFX05PTUVNOwotCQluMS0+bl9jaGlsZCA9IG47Ci0JfQorICAgIGN1cnJlbnRfY2FwYWNpdHkgPSBYWFhST1VORFVQKG5jaCk7CisgICAgcmVxdWlyZWRfY2FwYWNpdHkgPSBYWFhST1VORFVQKG5jaCArIDEpOworICAgIGlmIChjdXJyZW50X2NhcGFjaXR5IDwgMCB8fCByZXF1aXJlZF9jYXBhY2l0eSA8IDApCisgICAgICAgIHJldHVybiBFX09WRVJGTE9XOworICAgIGlmIChjdXJyZW50X2NhcGFjaXR5IDwgcmVxdWlyZWRfY2FwYWNpdHkpIHsKKyAgICAgICAgaWYgKHJlcXVpcmVkX2NhcGFjaXR5ID4gUFlfU0laRV9NQVggLyBzaXplb2Yobm9kZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBFX05PTUVNOworICAgICAgICB9CisgICAgICAgIG4gPSBuMS0+bl9jaGlsZDsKKyAgICAgICAgbiA9IChub2RlICopIFB5T2JqZWN0X1JFQUxMT0MobiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWRfY2FwYWNpdHkgKiBzaXplb2Yobm9kZSkpOworICAgICAgICBpZiAobiA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIEVfTk9NRU07CisgICAgICAgIG4xLT5uX2NoaWxkID0gbjsKKyAgICB9CiAKLQluID0gJm4xLT5uX2NoaWxkW24xLT5uX25jaGlsZHJlbisrXTsKLQluLT5uX3R5cGUgPSB0eXBlOwotCW4tPm5fc3RyID0gc3RyOwotCW4tPm5fbGluZW5vID0gbGluZW5vOwotCW4tPm5fY29sX29mZnNldCA9IGNvbF9vZmZzZXQ7Ci0Jbi0+bl9uY2hpbGRyZW4gPSAwOwotCW4tPm5fY2hpbGQgPSBOVUxMOwotCXJldHVybiAwOworICAgIG4gPSAmbjEtPm5fY2hpbGRbbjEtPm5fbmNoaWxkcmVuKytdOworICAgIG4tPm5fdHlwZSA9IHR5cGU7CisgICAgbi0+bl9zdHIgPSBzdHI7CisgICAgbi0+bl9saW5lbm8gPSBsaW5lbm87CisgICAgbi0+bl9jb2xfb2Zmc2V0ID0gY29sX29mZnNldDsKKyAgICBuLT5uX25jaGlsZHJlbiA9IDA7CisgICAgbi0+bl9jaGlsZCA9IE5VTEw7CisgICAgcmV0dXJuIDA7CiB9CiAKIC8qIEZvcndhcmQgKi8KQEAgLTExOSwyMCArMTE5LDIwIEBACiB2b2lkCiBQeU5vZGVfRnJlZShub2RlICpuKQogewotCWlmIChuICE9IE5VTEwpIHsKLQkJZnJlZWNoaWxkcmVuKG4pOwotCQlQeU9iamVjdF9GUkVFKG4pOwotCX0KKyAgICBpZiAobiAhPSBOVUxMKSB7CisgICAgICAgIGZyZWVjaGlsZHJlbihuKTsKKyAgICAgICAgUHlPYmplY3RfRlJFRShuKTsKKyAgICB9CiB9CiAKIHN0YXRpYyB2b2lkCiBmcmVlY2hpbGRyZW4obm9kZSAqbikKIHsKLQlpbnQgaTsKLQlmb3IgKGkgPSBOQ0gobik7IC0taSA+PSAwOyApCi0JCWZyZWVjaGlsZHJlbihDSElMRChuLCBpKSk7Ci0JaWYgKG4tPm5fY2hpbGQgIT0gTlVMTCkKLQkJUHlPYmplY3RfRlJFRShuLT5uX2NoaWxkKTsKLQlpZiAoU1RSKG4pICE9IE5VTEwpCi0JCVB5T2JqZWN0X0ZSRUUoU1RSKG4pKTsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSBOQ0gobik7IC0taSA+PSAwOyApCisgICAgICAgIGZyZWVjaGlsZHJlbihDSElMRChuLCBpKSk7CisgICAgaWYgKG4tPm5fY2hpbGQgIT0gTlVMTCkKKyAgICAgICAgUHlPYmplY3RfRlJFRShuLT5uX2NoaWxkKTsKKyAgICBpZiAoU1RSKG4pICE9IE5VTEwpCisgICAgICAgIFB5T2JqZWN0X0ZSRUUoU1RSKG4pKTsKIH0KZGlmZiAtLWdpdCBhL1BhcnNlci9wYXJzZXIuYyBiL1BhcnNlci9wYXJzZXIuYwppbmRleCBlNTk3ZWEyLi5iNzUzYTE3IDEwMDY0NAotLS0gYS9QYXJzZXIvcGFyc2VyLmMKKysrIGIvUGFyc2VyL3BhcnNlci5jCkBAIC0yOSw3ICsyOSw3IEBACiBzdGF0aWMgdm9pZAogc19yZXNldChzdGFjayAqcykKIHsKLQlzLT5zX3RvcCA9ICZzLT5zX2Jhc2VbTUFYU1RBQ0tdOworICAgIHMtPnNfdG9wID0gJnMtPnNfYmFzZVtNQVhTVEFDS107CiB9CiAKICNkZWZpbmUgc19lbXB0eShzKSAoKHMpLT5zX3RvcCA9PSAmKHMpLT5zX2Jhc2VbTUFYU1RBQ0tdKQpAQCAtMzcsMTYgKzM3LDE2IEBACiBzdGF0aWMgaW50CiBzX3B1c2gocmVnaXN0ZXIgc3RhY2sgKnMsIGRmYSAqZCwgbm9kZSAqcGFyZW50KQogewotCXJlZ2lzdGVyIHN0YWNrZW50cnkgKnRvcDsKLQlpZiAocy0+c190b3AgPT0gcy0+c19iYXNlKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAic19wdXNoOiBwYXJzZXIgc3RhY2sgb3ZlcmZsb3dcbiIpOwotCQlyZXR1cm4gRV9OT01FTTsKLQl9Ci0JdG9wID0gLS1zLT5zX3RvcDsKLQl0b3AtPnNfZGZhID0gZDsKLQl0b3AtPnNfcGFyZW50ID0gcGFyZW50OwotCXRvcC0+c19zdGF0ZSA9IDA7Ci0JcmV0dXJuIDA7CisgICAgcmVnaXN0ZXIgc3RhY2tlbnRyeSAqdG9wOworICAgIGlmIChzLT5zX3RvcCA9PSBzLT5zX2Jhc2UpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJzX3B1c2g6IHBhcnNlciBzdGFjayBvdmVyZmxvd1xuIik7CisgICAgICAgIHJldHVybiBFX05PTUVNOworICAgIH0KKyAgICB0b3AgPSAtLXMtPnNfdG9wOworICAgIHRvcC0+c19kZmEgPSBkOworICAgIHRvcC0+c19wYXJlbnQgPSBwYXJlbnQ7CisgICAgdG9wLT5zX3N0YXRlID0gMDsKKyAgICByZXR1cm4gMDsKIH0KIAogI2lmZGVmIFB5X0RFQlVHCkBAIC01NCw5ICs1NCw5IEBACiBzdGF0aWMgdm9pZAogc19wb3AocmVnaXN0ZXIgc3RhY2sgKnMpCiB7Ci0JaWYgKHNfZW1wdHkocykpCi0JCVB5X0ZhdGFsRXJyb3IoInNfcG9wOiBwYXJzZXIgc3RhY2sgdW5kZXJmbG93IC0tIEZBVEFMIik7Ci0Jcy0+c190b3ArKzsKKyAgICBpZiAoc19lbXB0eShzKSkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigic19wb3A6IHBhcnNlciBzdGFjayB1bmRlcmZsb3cgLS0gRkFUQUwiKTsKKyAgICBzLT5zX3RvcCsrOwogfQogCiAjZWxzZSAvKiAhUHlfREVCVUcgKi8KQEAgLTcxLDM0ICs3MSwzNCBAQAogcGFyc2VyX3N0YXRlICoKIFB5UGFyc2VyX05ldyhncmFtbWFyICpnLCBpbnQgc3RhcnQpCiB7Ci0JcGFyc2VyX3N0YXRlICpwczsKLQkKLQlpZiAoIWctPmdfYWNjZWwpCi0JCVB5R3JhbW1hcl9BZGRBY2NlbGVyYXRvcnMoZyk7Ci0JcHMgPSAocGFyc2VyX3N0YXRlICopUHlNZW1fTUFMTE9DKHNpemVvZihwYXJzZXJfc3RhdGUpKTsKLQlpZiAocHMgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JcHMtPnBfZ3JhbW1hciA9IGc7CisgICAgcGFyc2VyX3N0YXRlICpwczsKKworICAgIGlmICghZy0+Z19hY2NlbCkKKyAgICAgICAgUHlHcmFtbWFyX0FkZEFjY2VsZXJhdG9ycyhnKTsKKyAgICBwcyA9IChwYXJzZXJfc3RhdGUgKilQeU1lbV9NQUxMT0Moc2l6ZW9mKHBhcnNlcl9zdGF0ZSkpOworICAgIGlmIChwcyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBwcy0+cF9ncmFtbWFyID0gZzsKICNpZmRlZiBQWV9QQVJTRVJfUkVRVUlSRVNfRlVUVVJFX0tFWVdPUkQKLQlwcy0+cF9mbGFncyA9IDA7CisgICAgcHMtPnBfZmxhZ3MgPSAwOwogI2VuZGlmCi0JcHMtPnBfdHJlZSA9IFB5Tm9kZV9OZXcoc3RhcnQpOwotCWlmIChwcy0+cF90cmVlID09IE5VTEwpIHsKLQkJUHlNZW1fRlJFRShwcyk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlzX3Jlc2V0KCZwcy0+cF9zdGFjayk7Ci0JKHZvaWQpIHNfcHVzaCgmcHMtPnBfc3RhY2ssIFB5R3JhbW1hcl9GaW5kREZBKGcsIHN0YXJ0KSwgcHMtPnBfdHJlZSk7Ci0JcmV0dXJuIHBzOworICAgIHBzLT5wX3RyZWUgPSBQeU5vZGVfTmV3KHN0YXJ0KTsKKyAgICBpZiAocHMtPnBfdHJlZSA9PSBOVUxMKSB7CisgICAgICAgIFB5TWVtX0ZSRUUocHMpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgc19yZXNldCgmcHMtPnBfc3RhY2spOworICAgICh2b2lkKSBzX3B1c2goJnBzLT5wX3N0YWNrLCBQeUdyYW1tYXJfRmluZERGQShnLCBzdGFydCksIHBzLT5wX3RyZWUpOworICAgIHJldHVybiBwczsKIH0KIAogdm9pZAogUHlQYXJzZXJfRGVsZXRlKHBhcnNlcl9zdGF0ZSAqcHMpCiB7Ci0JLyogTkIgSWYgeW91IHdhbnQgdG8gc2F2ZSB0aGUgcGFyc2UgdHJlZSwKLQkgICB5b3UgbXVzdCBzZXQgcF90cmVlIHRvIE5VTEwgYmVmb3JlIGNhbGxpbmcgZGVscGFyc2VyISAqLwotCVB5Tm9kZV9GcmVlKHBzLT5wX3RyZWUpOwotCVB5TWVtX0ZSRUUocHMpOworICAgIC8qIE5CIElmIHlvdSB3YW50IHRvIHNhdmUgdGhlIHBhcnNlIHRyZWUsCisgICAgICAgeW91IG11c3Qgc2V0IHBfdHJlZSB0byBOVUxMIGJlZm9yZSBjYWxsaW5nIGRlbHBhcnNlciEgKi8KKyAgICBQeU5vZGVfRnJlZShwcy0+cF90cmVlKTsKKyAgICBQeU1lbV9GUkVFKHBzKTsKIH0KIAogCkBAIC0xMDcsMjcgKzEwNywyNyBAQAogc3RhdGljIGludAogc2hpZnQocmVnaXN0ZXIgc3RhY2sgKnMsIGludCB0eXBlLCBjaGFyICpzdHIsIGludCBuZXdzdGF0ZSwgaW50IGxpbmVubywgaW50IGNvbF9vZmZzZXQpCiB7Ci0JaW50IGVycjsKLQlhc3NlcnQoIXNfZW1wdHkocykpOwotCWVyciA9IFB5Tm9kZV9BZGRDaGlsZChzLT5zX3RvcC0+c19wYXJlbnQsIHR5cGUsIHN0ciwgbGluZW5vLCBjb2xfb2Zmc2V0KTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCXMtPnNfdG9wLT5zX3N0YXRlID0gbmV3c3RhdGU7Ci0JcmV0dXJuIDA7CisgICAgaW50IGVycjsKKyAgICBhc3NlcnQoIXNfZW1wdHkocykpOworICAgIGVyciA9IFB5Tm9kZV9BZGRDaGlsZChzLT5zX3RvcC0+c19wYXJlbnQsIHR5cGUsIHN0ciwgbGluZW5vLCBjb2xfb2Zmc2V0KTsKKyAgICBpZiAoZXJyKQorICAgICAgICByZXR1cm4gZXJyOworICAgIHMtPnNfdG9wLT5zX3N0YXRlID0gbmV3c3RhdGU7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIHB1c2gocmVnaXN0ZXIgc3RhY2sgKnMsIGludCB0eXBlLCBkZmEgKmQsIGludCBuZXdzdGF0ZSwgaW50IGxpbmVubywgaW50IGNvbF9vZmZzZXQpCiB7Ci0JaW50IGVycjsKLQlyZWdpc3RlciBub2RlICpuOwotCW4gPSBzLT5zX3RvcC0+c19wYXJlbnQ7Ci0JYXNzZXJ0KCFzX2VtcHR5KHMpKTsKLQllcnIgPSBQeU5vZGVfQWRkQ2hpbGQobiwgdHlwZSwgKGNoYXIgKilOVUxMLCBsaW5lbm8sIGNvbF9vZmZzZXQpOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0Jcy0+c190b3AtPnNfc3RhdGUgPSBuZXdzdGF0ZTsKLQlyZXR1cm4gc19wdXNoKHMsIGQsIENISUxEKG4sIE5DSChuKS0xKSk7CisgICAgaW50IGVycjsKKyAgICByZWdpc3RlciBub2RlICpuOworICAgIG4gPSBzLT5zX3RvcC0+c19wYXJlbnQ7CisgICAgYXNzZXJ0KCFzX2VtcHR5KHMpKTsKKyAgICBlcnIgPSBQeU5vZGVfQWRkQ2hpbGQobiwgdHlwZSwgKGNoYXIgKilOVUxMLCBsaW5lbm8sIGNvbF9vZmZzZXQpOworICAgIGlmIChlcnIpCisgICAgICAgIHJldHVybiBlcnI7CisgICAgcy0+c190b3AtPnNfc3RhdGUgPSBuZXdzdGF0ZTsKKyAgICByZXR1cm4gc19wdXNoKHMsIGQsIENISUxEKG4sIE5DSChuKS0xKSk7CiB9CiAKIApAQCAtMTM2LDE4OSArMTM2LDE4OSBAQAogc3RhdGljIGludAogY2xhc3NpZnkocGFyc2VyX3N0YXRlICpwcywgaW50IHR5cGUsIGNoYXIgKnN0cikKIHsKLQlncmFtbWFyICpnID0gcHMtPnBfZ3JhbW1hcjsKLQlyZWdpc3RlciBpbnQgbiA9IGctPmdfbGwubGxfbmxhYmVsczsKLQkKLQlpZiAodHlwZSA9PSBOQU1FKSB7Ci0JCXJlZ2lzdGVyIGNoYXIgKnMgPSBzdHI7Ci0JCXJlZ2lzdGVyIGxhYmVsICpsID0gZy0+Z19sbC5sbF9sYWJlbDsKLQkJcmVnaXN0ZXIgaW50IGk7Ci0JCWZvciAoaSA9IG47IGkgPiAwOyBpLS0sIGwrKykgewotCQkJaWYgKGwtPmxiX3R5cGUgIT0gTkFNRSB8fCBsLT5sYl9zdHIgPT0gTlVMTCB8fAotCQkJICAgIGwtPmxiX3N0clswXSAhPSBzWzBdIHx8Ci0JCQkgICAgc3RyY21wKGwtPmxiX3N0ciwgcykgIT0gMCkKLQkJCQljb250aW51ZTsKKyAgICBncmFtbWFyICpnID0gcHMtPnBfZ3JhbW1hcjsKKyAgICByZWdpc3RlciBpbnQgbiA9IGctPmdfbGwubGxfbmxhYmVsczsKKworICAgIGlmICh0eXBlID09IE5BTUUpIHsKKyAgICAgICAgcmVnaXN0ZXIgY2hhciAqcyA9IHN0cjsKKyAgICAgICAgcmVnaXN0ZXIgbGFiZWwgKmwgPSBnLT5nX2xsLmxsX2xhYmVsOworICAgICAgICByZWdpc3RlciBpbnQgaTsKKyAgICAgICAgZm9yIChpID0gbjsgaSA+IDA7IGktLSwgbCsrKSB7CisgICAgICAgICAgICBpZiAobC0+bGJfdHlwZSAhPSBOQU1FIHx8IGwtPmxiX3N0ciA9PSBOVUxMIHx8CisgICAgICAgICAgICAgICAgbC0+bGJfc3RyWzBdICE9IHNbMF0gfHwKKyAgICAgICAgICAgICAgICBzdHJjbXAobC0+bGJfc3RyLCBzKSAhPSAwKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogI2lmZGVmIFBZX1BBUlNFUl9SRVFVSVJFU19GVVRVUkVfS0VZV09SRAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBzLT5wX2ZsYWdzICYgQ09fRlVUVVJFX1BSSU5UX0ZVTkNUSU9OICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc1swXSA9PSAncCcgJiYgc3RyY21wKHMsICJwcmludCIpID09IDApIHsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAvKiBubyBsb25nZXIgYSBrZXl3b3JkICovCi0gICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocHMtPnBfZmxhZ3MgJiBDT19GVVRVUkVfUFJJTlRfRlVOQ1RJT04gJiYKKyAgICAgICAgICAgICAgICBzWzBdID09ICdwJyAmJiBzdHJjbXAocywgInByaW50IikgPT0gMCkgeworICAgICAgICAgICAgICAgIGJyZWFrOyAvKiBubyBsb25nZXIgYSBrZXl3b3JkICovCisgICAgICAgICAgICB9CiAjZW5kaWYKLQkJCUQocHJpbnRmKCJJdCdzIGEga2V5d29yZFxuIikpOwotCQkJcmV0dXJuIG4gLSBpOwotCQl9Ci0JfQotCQotCXsKLQkJcmVnaXN0ZXIgbGFiZWwgKmwgPSBnLT5nX2xsLmxsX2xhYmVsOwotCQlyZWdpc3RlciBpbnQgaTsKLQkJZm9yIChpID0gbjsgaSA+IDA7IGktLSwgbCsrKSB7Ci0JCQlpZiAobC0+bGJfdHlwZSA9PSB0eXBlICYmIGwtPmxiX3N0ciA9PSBOVUxMKSB7Ci0JCQkJRChwcmludGYoIkl0J3MgYSB0b2tlbiB3ZSBrbm93XG4iKSk7Ci0JCQkJcmV0dXJuIG4gLSBpOwotCQkJfQotCQl9Ci0JfQotCQotCUQocHJpbnRmKCJJbGxlZ2FsIHRva2VuXG4iKSk7Ci0JcmV0dXJuIC0xOworICAgICAgICAgICAgRChwcmludGYoIkl0J3MgYSBrZXl3b3JkXG4iKSk7CisgICAgICAgICAgICByZXR1cm4gbiAtIGk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB7CisgICAgICAgIHJlZ2lzdGVyIGxhYmVsICpsID0gZy0+Z19sbC5sbF9sYWJlbDsKKyAgICAgICAgcmVnaXN0ZXIgaW50IGk7CisgICAgICAgIGZvciAoaSA9IG47IGkgPiAwOyBpLS0sIGwrKykgeworICAgICAgICAgICAgaWYgKGwtPmxiX3R5cGUgPT0gdHlwZSAmJiBsLT5sYl9zdHIgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIEQocHJpbnRmKCJJdCdzIGEgdG9rZW4gd2Uga25vd1xuIikpOworICAgICAgICAgICAgICAgIHJldHVybiBuIC0gaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEQocHJpbnRmKCJJbGxlZ2FsIHRva2VuXG4iKSk7CisgICAgcmV0dXJuIC0xOwogfQogCiAjaWZkZWYgUFlfUEFSU0VSX1JFUVVJUkVTX0ZVVFVSRV9LRVlXT1JECiBzdGF0aWMgdm9pZAogZnV0dXJlX2hhY2socGFyc2VyX3N0YXRlICpwcykKIHsKLQlub2RlICpuID0gcHMtPnBfc3RhY2suc190b3AtPnNfcGFyZW50OwotCW5vZGUgKmNoLCAqY2NoOwotCWludCBpOworICAgIG5vZGUgKm4gPSBwcy0+cF9zdGFjay5zX3RvcC0+c19wYXJlbnQ7CisgICAgbm9kZSAqY2gsICpjY2g7CisgICAgaW50IGk7CiAKLQkvKiBmcm9tIF9fZnV0dXJlX18gaW1wb3J0IC4uLiwgbXVzdCBoYXZlIGF0IGxlYXN0IDQgY2hpbGRyZW4gKi8KLQluID0gQ0hJTEQobiwgMCk7Ci0JaWYgKE5DSChuKSA8IDQpCi0JCXJldHVybjsKLQljaCA9IENISUxEKG4sIDApOwotCWlmIChTVFIoY2gpID09IE5VTEwgfHwgc3RyY21wKFNUUihjaCksICJmcm9tIikgIT0gMCkKLQkJcmV0dXJuOwotCWNoID0gQ0hJTEQobiwgMSk7Ci0JaWYgKE5DSChjaCkgPT0gMSAmJiBTVFIoQ0hJTEQoY2gsIDApKSAmJgotCSAgICBzdHJjbXAoU1RSKENISUxEKGNoLCAwKSksICJfX2Z1dHVyZV9fIikgIT0gMCkKLQkJcmV0dXJuOwotCWNoID0gQ0hJTEQobiwgMyk7Ci0JLyogY2ggY2FuIGJlIGEgc3RhciwgYSBwYXJlbnRoZXNpcyBvciBpbXBvcnRfYXNfbmFtZXMgKi8KLQlpZiAoVFlQRShjaCkgPT0gU1RBUikKLQkJcmV0dXJuOwotCWlmIChUWVBFKGNoKSA9PSBMUEFSKQotCQljaCA9IENISUxEKG4sIDQpOwotCQotCWZvciAoaSA9IDA7IGkgPCBOQ0goY2gpOyBpICs9IDIpIHsKLQkJY2NoID0gQ0hJTEQoY2gsIGkpOwotCQlpZiAoTkNIKGNjaCkgPj0gMSAmJiBUWVBFKENISUxEKGNjaCwgMCkpID09IE5BTUUpIHsKLQkJCWNoYXIgKnN0cl9jaCA9IFNUUihDSElMRChjY2gsIDApKTsKLQkJCWlmIChzdHJjbXAoc3RyX2NoLCBGVVRVUkVfV0lUSF9TVEFURU1FTlQpID09IDApIHsKLQkJCQlwcy0+cF9mbGFncyB8PSBDT19GVVRVUkVfV0lUSF9TVEFURU1FTlQ7Ci0JCQl9IGVsc2UgaWYgKHN0cmNtcChzdHJfY2gsIEZVVFVSRV9QUklOVF9GVU5DVElPTikgPT0gMCkgewotCQkJCXBzLT5wX2ZsYWdzIHw9IENPX0ZVVFVSRV9QUklOVF9GVU5DVElPTjsKLQkJCX0gZWxzZSBpZiAoc3RyY21wKHN0cl9jaCwgRlVUVVJFX1VOSUNPREVfTElURVJBTFMpID09IDApIHsKLQkJCQlwcy0+cF9mbGFncyB8PSBDT19GVVRVUkVfVU5JQ09ERV9MSVRFUkFMUzsKLQkJCX0KLQkJfQotCX0KKyAgICAvKiBmcm9tIF9fZnV0dXJlX18gaW1wb3J0IC4uLiwgbXVzdCBoYXZlIGF0IGxlYXN0IDQgY2hpbGRyZW4gKi8KKyAgICBuID0gQ0hJTEQobiwgMCk7CisgICAgaWYgKE5DSChuKSA8IDQpCisgICAgICAgIHJldHVybjsKKyAgICBjaCA9IENISUxEKG4sIDApOworICAgIGlmIChTVFIoY2gpID09IE5VTEwgfHwgc3RyY21wKFNUUihjaCksICJmcm9tIikgIT0gMCkKKyAgICAgICAgcmV0dXJuOworICAgIGNoID0gQ0hJTEQobiwgMSk7CisgICAgaWYgKE5DSChjaCkgPT0gMSAmJiBTVFIoQ0hJTEQoY2gsIDApKSAmJgorICAgICAgICBzdHJjbXAoU1RSKENISUxEKGNoLCAwKSksICJfX2Z1dHVyZV9fIikgIT0gMCkKKyAgICAgICAgcmV0dXJuOworICAgIGNoID0gQ0hJTEQobiwgMyk7CisgICAgLyogY2ggY2FuIGJlIGEgc3RhciwgYSBwYXJlbnRoZXNpcyBvciBpbXBvcnRfYXNfbmFtZXMgKi8KKyAgICBpZiAoVFlQRShjaCkgPT0gU1RBUikKKyAgICAgICAgcmV0dXJuOworICAgIGlmIChUWVBFKGNoKSA9PSBMUEFSKQorICAgICAgICBjaCA9IENISUxEKG4sIDQpOworCisgICAgZm9yIChpID0gMDsgaSA8IE5DSChjaCk7IGkgKz0gMikgeworICAgICAgICBjY2ggPSBDSElMRChjaCwgaSk7CisgICAgICAgIGlmIChOQ0goY2NoKSA+PSAxICYmIFRZUEUoQ0hJTEQoY2NoLCAwKSkgPT0gTkFNRSkgeworICAgICAgICAgICAgY2hhciAqc3RyX2NoID0gU1RSKENISUxEKGNjaCwgMCkpOworICAgICAgICAgICAgaWYgKHN0cmNtcChzdHJfY2gsIEZVVFVSRV9XSVRIX1NUQVRFTUVOVCkgPT0gMCkgeworICAgICAgICAgICAgICAgIHBzLT5wX2ZsYWdzIHw9IENPX0ZVVFVSRV9XSVRIX1NUQVRFTUVOVDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKHN0cl9jaCwgRlVUVVJFX1BSSU5UX0ZVTkNUSU9OKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgcHMtPnBfZmxhZ3MgfD0gQ09fRlVUVVJFX1BSSU5UX0ZVTkNUSU9OOworICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAoc3RyX2NoLCBGVVRVUkVfVU5JQ09ERV9MSVRFUkFMUykgPT0gMCkgeworICAgICAgICAgICAgICAgIHBzLT5wX2ZsYWdzIHw9IENPX0ZVVFVSRV9VTklDT0RFX0xJVEVSQUxTOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogfQogI2VuZGlmIC8qIGZ1dHVyZSBrZXl3b3JkICovCiAKIGludAogUHlQYXJzZXJfQWRkVG9rZW4ocmVnaXN0ZXIgcGFyc2VyX3N0YXRlICpwcywgcmVnaXN0ZXIgaW50IHR5cGUsIGNoYXIgKnN0ciwKLQkgICAgICAgICAgaW50IGxpbmVubywgaW50IGNvbF9vZmZzZXQsIGludCAqZXhwZWN0ZWRfcmV0KQorICAgICAgICAgICAgICAgICAgaW50IGxpbmVubywgaW50IGNvbF9vZmZzZXQsIGludCAqZXhwZWN0ZWRfcmV0KQogewotCXJlZ2lzdGVyIGludCBpbGFiZWw7Ci0JaW50IGVycjsKLQkKLQlEKHByaW50ZigiVG9rZW4gJXMvJyVzJyAuLi4gIiwgX1B5UGFyc2VyX1Rva2VuTmFtZXNbdHlwZV0sIHN0cikpOwotCQotCS8qIEZpbmQgb3V0IHdoaWNoIGxhYmVsIHRoaXMgdG9rZW4gaXMgKi8KLQlpbGFiZWwgPSBjbGFzc2lmeShwcywgdHlwZSwgc3RyKTsKLQlpZiAoaWxhYmVsIDwgMCkKLQkJcmV0dXJuIEVfU1lOVEFYOwotCQotCS8qIExvb3AgdW50aWwgdGhlIHRva2VuIGlzIHNoaWZ0ZWQgb3IgYW4gZXJyb3Igb2NjdXJyZWQgKi8KLQlmb3IgKDs7KSB7Ci0JCS8qIEZldGNoIHRoZSBjdXJyZW50IGRmYSBhbmQgc3RhdGUgKi8KLQkJcmVnaXN0ZXIgZGZhICpkID0gcHMtPnBfc3RhY2suc190b3AtPnNfZGZhOwotCQlyZWdpc3RlciBzdGF0ZSAqcyA9ICZkLT5kX3N0YXRlW3BzLT5wX3N0YWNrLnNfdG9wLT5zX3N0YXRlXTsKLQkJCi0JCUQocHJpbnRmKCIgREZBICclcycsIHN0YXRlICVkOiIsCi0JCQlkLT5kX25hbWUsIHBzLT5wX3N0YWNrLnNfdG9wLT5zX3N0YXRlKSk7Ci0JCQotCQkvKiBDaGVjayBhY2NlbGVyYXRvciAqLwotCQlpZiAocy0+c19sb3dlciA8PSBpbGFiZWwgJiYgaWxhYmVsIDwgcy0+c191cHBlcikgewotCQkJcmVnaXN0ZXIgaW50IHggPSBzLT5zX2FjY2VsW2lsYWJlbCAtIHMtPnNfbG93ZXJdOwotCQkJaWYgKHggIT0gLTEpIHsKLQkJCQlpZiAoeCAmICgxPDw3KSkgewotCQkJCQkvKiBQdXNoIG5vbi10ZXJtaW5hbCAqLwotCQkJCQlpbnQgbnQgPSAoeCA+PiA4KSArIE5UX09GRlNFVDsKLQkJCQkJaW50IGFycm93ID0geCAmICgoMTw8NyktMSk7Ci0JCQkJCWRmYSAqZDEgPSBQeUdyYW1tYXJfRmluZERGQSgKLQkJCQkJCXBzLT5wX2dyYW1tYXIsIG50KTsKLQkJCQkJaWYgKChlcnIgPSBwdXNoKCZwcy0+cF9zdGFjaywgbnQsIGQxLAotCQkJCQkJYXJyb3csIGxpbmVubywgY29sX29mZnNldCkpID4gMCkgewotCQkJCQkJRChwcmludGYoIiBNZW1FcnJvcjogcHVzaFxuIikpOwotCQkJCQkJcmV0dXJuIGVycjsKLQkJCQkJfQotCQkJCQlEKHByaW50ZigiIFB1c2ggLi4uXG4iKSk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQkKLQkJCQkvKiBTaGlmdCB0aGUgdG9rZW4gKi8KLQkJCQlpZiAoKGVyciA9IHNoaWZ0KCZwcy0+cF9zdGFjaywgdHlwZSwgc3RyLAotCQkJCQkJeCwgbGluZW5vLCBjb2xfb2Zmc2V0KSkgPiAwKSB7Ci0JCQkJCUQocHJpbnRmKCIgTWVtRXJyb3I6IHNoaWZ0LlxuIikpOwotCQkJCQlyZXR1cm4gZXJyOwotCQkJCX0KLQkJCQlEKHByaW50ZigiIFNoaWZ0LlxuIikpOwotCQkJCS8qIFBvcCB3aGlsZSB3ZSBhcmUgaW4gYW4gYWNjZXB0LW9ubHkgc3RhdGUgKi8KLQkJCQl3aGlsZSAocyA9ICZkLT5kX3N0YXRlCi0JCQkJCQlbcHMtPnBfc3RhY2suc190b3AtPnNfc3RhdGVdLAotCQkJCQlzLT5zX2FjY2VwdCAmJiBzLT5zX25hcmNzID09IDEpIHsKLQkJCQkJRChwcmludGYoIiAgREZBICclcycsIHN0YXRlICVkOiAiCi0JCQkJCQkgIkRpcmVjdCBwb3AuXG4iLAotCQkJCQkJIGQtPmRfbmFtZSwKLQkJCQkJCSBwcy0+cF9zdGFjay5zX3RvcC0+c19zdGF0ZSkpOworICAgIHJlZ2lzdGVyIGludCBpbGFiZWw7CisgICAgaW50IGVycjsKKworICAgIEQocHJpbnRmKCJUb2tlbiAlcy8nJXMnIC4uLiAiLCBfUHlQYXJzZXJfVG9rZW5OYW1lc1t0eXBlXSwgc3RyKSk7CisKKyAgICAvKiBGaW5kIG91dCB3aGljaCBsYWJlbCB0aGlzIHRva2VuIGlzICovCisgICAgaWxhYmVsID0gY2xhc3NpZnkocHMsIHR5cGUsIHN0cik7CisgICAgaWYgKGlsYWJlbCA8IDApCisgICAgICAgIHJldHVybiBFX1NZTlRBWDsKKworICAgIC8qIExvb3AgdW50aWwgdGhlIHRva2VuIGlzIHNoaWZ0ZWQgb3IgYW4gZXJyb3Igb2NjdXJyZWQgKi8KKyAgICBmb3IgKDs7KSB7CisgICAgICAgIC8qIEZldGNoIHRoZSBjdXJyZW50IGRmYSBhbmQgc3RhdGUgKi8KKyAgICAgICAgcmVnaXN0ZXIgZGZhICpkID0gcHMtPnBfc3RhY2suc190b3AtPnNfZGZhOworICAgICAgICByZWdpc3RlciBzdGF0ZSAqcyA9ICZkLT5kX3N0YXRlW3BzLT5wX3N0YWNrLnNfdG9wLT5zX3N0YXRlXTsKKworICAgICAgICBEKHByaW50ZigiIERGQSAnJXMnLCBzdGF0ZSAlZDoiLAorICAgICAgICAgICAgZC0+ZF9uYW1lLCBwcy0+cF9zdGFjay5zX3RvcC0+c19zdGF0ZSkpOworCisgICAgICAgIC8qIENoZWNrIGFjY2VsZXJhdG9yICovCisgICAgICAgIGlmIChzLT5zX2xvd2VyIDw9IGlsYWJlbCAmJiBpbGFiZWwgPCBzLT5zX3VwcGVyKSB7CisgICAgICAgICAgICByZWdpc3RlciBpbnQgeCA9IHMtPnNfYWNjZWxbaWxhYmVsIC0gcy0+c19sb3dlcl07CisgICAgICAgICAgICBpZiAoeCAhPSAtMSkgeworICAgICAgICAgICAgICAgIGlmICh4ICYgKDE8PDcpKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIFB1c2ggbm9uLXRlcm1pbmFsICovCisgICAgICAgICAgICAgICAgICAgIGludCBudCA9ICh4ID4+IDgpICsgTlRfT0ZGU0VUOworICAgICAgICAgICAgICAgICAgICBpbnQgYXJyb3cgPSB4ICYgKCgxPDw3KS0xKTsKKyAgICAgICAgICAgICAgICAgICAgZGZhICpkMSA9IFB5R3JhbW1hcl9GaW5kREZBKAorICAgICAgICAgICAgICAgICAgICAgICAgcHMtPnBfZ3JhbW1hciwgbnQpOworICAgICAgICAgICAgICAgICAgICBpZiAoKGVyciA9IHB1c2goJnBzLT5wX3N0YWNrLCBudCwgZDEsCisgICAgICAgICAgICAgICAgICAgICAgICBhcnJvdywgbGluZW5vLCBjb2xfb2Zmc2V0KSkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBEKHByaW50ZigiIE1lbUVycm9yOiBwdXNoXG4iKSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIEQocHJpbnRmKCIgUHVzaCAuLi5cbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogU2hpZnQgdGhlIHRva2VuICovCisgICAgICAgICAgICAgICAgaWYgKChlcnIgPSBzaGlmdCgmcHMtPnBfc3RhY2ssIHR5cGUsIHN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCwgbGluZW5vLCBjb2xfb2Zmc2V0KSkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIEQocHJpbnRmKCIgTWVtRXJyb3I6IHNoaWZ0LlxuIikpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBEKHByaW50ZigiIFNoaWZ0LlxuIikpOworICAgICAgICAgICAgICAgIC8qIFBvcCB3aGlsZSB3ZSBhcmUgaW4gYW4gYWNjZXB0LW9ubHkgc3RhdGUgKi8KKyAgICAgICAgICAgICAgICB3aGlsZSAocyA9ICZkLT5kX3N0YXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwcy0+cF9zdGFjay5zX3RvcC0+c19zdGF0ZV0sCisgICAgICAgICAgICAgICAgICAgIHMtPnNfYWNjZXB0ICYmIHMtPnNfbmFyY3MgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICBEKHByaW50ZigiICBERkEgJyVzJywgc3RhdGUgJWQ6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRpcmVjdCBwb3AuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLT5kX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzLT5wX3N0YWNrLnNfdG9wLT5zX3N0YXRlKSk7CiAjaWZkZWYgUFlfUEFSU0VSX1JFUVVJUkVTX0ZVVFVSRV9LRVlXT1JECi0JCQkJCWlmIChkLT5kX25hbWVbMF0gPT0gJ2knICYmCi0JCQkJCSAgICBzdHJjbXAoZC0+ZF9uYW1lLAotCQkJCQkJICAgImltcG9ydF9zdG10IikgPT0gMCkKLQkJCQkJCWZ1dHVyZV9oYWNrKHBzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGQtPmRfbmFtZVswXSA9PSAnaScgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmNtcChkLT5kX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW1wb3J0X3N0bXQiKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgZnV0dXJlX2hhY2socHMpOwogI2VuZGlmCi0JCQkJCXNfcG9wKCZwcy0+cF9zdGFjayk7Ci0JCQkJCWlmIChzX2VtcHR5KCZwcy0+cF9zdGFjaykpIHsKLQkJCQkJCUQocHJpbnRmKCIgIEFDQ0VQVC5cbiIpKTsKLQkJCQkJCXJldHVybiBFX0RPTkU7Ci0JCQkJCX0KLQkJCQkJZCA9IHBzLT5wX3N0YWNrLnNfdG9wLT5zX2RmYTsKLQkJCQl9Ci0JCQkJcmV0dXJuIEVfT0s7Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmIChzLT5zX2FjY2VwdCkgeworICAgICAgICAgICAgICAgICAgICBzX3BvcCgmcHMtPnBfc3RhY2spOworICAgICAgICAgICAgICAgICAgICBpZiAoc19lbXB0eSgmcHMtPnBfc3RhY2spKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBEKHByaW50ZigiICBBQ0NFUFQuXG4iKSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRV9ET05FOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGQgPSBwcy0+cF9zdGFjay5zX3RvcC0+c19kZmE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBFX09LOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHMtPnNfYWNjZXB0KSB7CiAjaWZkZWYgUFlfUEFSU0VSX1JFUVVJUkVTX0ZVVFVSRV9LRVlXT1JECi0JCQlpZiAoZC0+ZF9uYW1lWzBdID09ICdpJyAmJgotCQkJICAgIHN0cmNtcChkLT5kX25hbWUsICJpbXBvcnRfc3RtdCIpID09IDApCi0JCQkJZnV0dXJlX2hhY2socHMpOworICAgICAgICAgICAgaWYgKGQtPmRfbmFtZVswXSA9PSAnaScgJiYKKyAgICAgICAgICAgICAgICBzdHJjbXAoZC0+ZF9uYW1lLCAiaW1wb3J0X3N0bXQiKSA9PSAwKQorICAgICAgICAgICAgICAgIGZ1dHVyZV9oYWNrKHBzKTsKICNlbmRpZgotCQkJLyogUG9wIHRoaXMgZGZhIGFuZCB0cnkgYWdhaW4gKi8KLQkJCXNfcG9wKCZwcy0+cF9zdGFjayk7Ci0JCQlEKHByaW50ZigiIFBvcCAuLi5cbiIpKTsKLQkJCWlmIChzX2VtcHR5KCZwcy0+cF9zdGFjaykpIHsKLQkJCQlEKHByaW50ZigiIEVycm9yOiBib3R0b20gb2Ygc3RhY2suXG4iKSk7Ci0JCQkJcmV0dXJuIEVfU1lOVEFYOwotCQkJfQotCQkJY29udGludWU7Ci0JCX0KLQkJCi0JCS8qIFN0dWNrLCByZXBvcnQgc3ludGF4IGVycm9yICovCi0JCUQocHJpbnRmKCIgRXJyb3IuXG4iKSk7Ci0JCWlmIChleHBlY3RlZF9yZXQpIHsKLQkJCWlmIChzLT5zX2xvd2VyID09IHMtPnNfdXBwZXIgLSAxKSB7Ci0JCQkJLyogT25seSBvbmUgcG9zc2libGUgZXhwZWN0ZWQgdG9rZW4gKi8KLQkJCQkqZXhwZWN0ZWRfcmV0ID0gcHMtPnBfZ3JhbW1hci0+Ci0JCQkJICAgIGdfbGwubGxfbGFiZWxbcy0+c19sb3dlcl0ubGJfdHlwZTsKLQkJCX0KLQkJCWVsc2UgCi0JCSAgICAgICAgCSpleHBlY3RlZF9yZXQgPSAtMTsKLQkJfQotCQlyZXR1cm4gRV9TWU5UQVg7Ci0JfQorICAgICAgICAgICAgLyogUG9wIHRoaXMgZGZhIGFuZCB0cnkgYWdhaW4gKi8KKyAgICAgICAgICAgIHNfcG9wKCZwcy0+cF9zdGFjayk7CisgICAgICAgICAgICBEKHByaW50ZigiIFBvcCAuLi5cbiIpKTsKKyAgICAgICAgICAgIGlmIChzX2VtcHR5KCZwcy0+cF9zdGFjaykpIHsKKyAgICAgICAgICAgICAgICBEKHByaW50ZigiIEVycm9yOiBib3R0b20gb2Ygc3RhY2suXG4iKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVfU1lOVEFYOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAvKiBTdHVjaywgcmVwb3J0IHN5bnRheCBlcnJvciAqLworICAgICAgICBEKHByaW50ZigiIEVycm9yLlxuIikpOworICAgICAgICBpZiAoZXhwZWN0ZWRfcmV0KSB7CisgICAgICAgICAgICBpZiAocy0+c19sb3dlciA9PSBzLT5zX3VwcGVyIC0gMSkgeworICAgICAgICAgICAgICAgIC8qIE9ubHkgb25lIHBvc3NpYmxlIGV4cGVjdGVkIHRva2VuICovCisgICAgICAgICAgICAgICAgKmV4cGVjdGVkX3JldCA9IHBzLT5wX2dyYW1tYXItPgorICAgICAgICAgICAgICAgICAgICBnX2xsLmxsX2xhYmVsW3MtPnNfbG93ZXJdLmxiX3R5cGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgKmV4cGVjdGVkX3JldCA9IC0xOworICAgICAgICB9CisgICAgICAgIHJldHVybiBFX1NZTlRBWDsKKyAgICB9CiB9CiAKIApAQCAtMzI5LDYyICszMjksNjIgQEAKIHZvaWQKIGR1bXB0cmVlKGdyYW1tYXIgKmcsIG5vZGUgKm4pCiB7Ci0JaW50IGk7Ci0JCi0JaWYgKG4gPT0gTlVMTCkKLQkJcHJpbnRmKCJOSUwiKTsKLQllbHNlIHsKLQkJbGFiZWwgbDsKLQkJbC5sYl90eXBlID0gVFlQRShuKTsKLQkJbC5sYl9zdHIgPSBTVFIobik7Ci0JCXByaW50ZigiJXMiLCBQeUdyYW1tYXJfTGFiZWxSZXByKCZsKSk7Ci0JCWlmIChJU05PTlRFUk1JTkFMKFRZUEUobikpKSB7Ci0JCQlwcmludGYoIigiKTsKLQkJCWZvciAoaSA9IDA7IGkgPCBOQ0gobik7IGkrKykgewotCQkJCWlmIChpID4gMCkKLQkJCQkJcHJpbnRmKCIsIik7Ci0JCQkJZHVtcHRyZWUoZywgQ0hJTEQobiwgaSkpOwotCQkJfQotCQkJcHJpbnRmKCIpIik7Ci0JCX0KLQl9CisgICAgaW50IGk7CisKKyAgICBpZiAobiA9PSBOVUxMKQorICAgICAgICBwcmludGYoIk5JTCIpOworICAgIGVsc2UgeworICAgICAgICBsYWJlbCBsOworICAgICAgICBsLmxiX3R5cGUgPSBUWVBFKG4pOworICAgICAgICBsLmxiX3N0ciA9IFNUUihuKTsKKyAgICAgICAgcHJpbnRmKCIlcyIsIFB5R3JhbW1hcl9MYWJlbFJlcHIoJmwpKTsKKyAgICAgICAgaWYgKElTTk9OVEVSTUlOQUwoVFlQRShuKSkpIHsKKyAgICAgICAgICAgIHByaW50ZigiKCIpOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IE5DSChuKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGkgPiAwKQorICAgICAgICAgICAgICAgICAgICBwcmludGYoIiwiKTsKKyAgICAgICAgICAgICAgICBkdW1wdHJlZShnLCBDSElMRChuLCBpKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcmludGYoIikiKTsKKyAgICAgICAgfQorICAgIH0KIH0KIAogdm9pZAogc2hvd3RyZWUoZ3JhbW1hciAqZywgbm9kZSAqbikKIHsKLQlpbnQgaTsKLQkKLQlpZiAobiA9PSBOVUxMKQotCQlyZXR1cm47Ci0JaWYgKElTTk9OVEVSTUlOQUwoVFlQRShuKSkpIHsKLQkJZm9yIChpID0gMDsgaSA8IE5DSChuKTsgaSsrKQotCQkJc2hvd3RyZWUoZywgQ0hJTEQobiwgaSkpOwotCX0KLQllbHNlIGlmIChJU1RFUk1JTkFMKFRZUEUobikpKSB7Ci0JCXByaW50ZigiJXMiLCBfUHlQYXJzZXJfVG9rZW5OYW1lc1tUWVBFKG4pXSk7Ci0JCWlmIChUWVBFKG4pID09IE5VTUJFUiB8fCBUWVBFKG4pID09IE5BTUUpCi0JCQlwcmludGYoIiglcykiLCBTVFIobikpOwotCQlwcmludGYoIiAiKTsKLQl9Ci0JZWxzZQotCQlwcmludGYoIj8gIik7CisgICAgaW50IGk7CisKKyAgICBpZiAobiA9PSBOVUxMKQorICAgICAgICByZXR1cm47CisgICAgaWYgKElTTk9OVEVSTUlOQUwoVFlQRShuKSkpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IE5DSChuKTsgaSsrKQorICAgICAgICAgICAgc2hvd3RyZWUoZywgQ0hJTEQobiwgaSkpOworICAgIH0KKyAgICBlbHNlIGlmIChJU1RFUk1JTkFMKFRZUEUobikpKSB7CisgICAgICAgIHByaW50ZigiJXMiLCBfUHlQYXJzZXJfVG9rZW5OYW1lc1tUWVBFKG4pXSk7CisgICAgICAgIGlmIChUWVBFKG4pID09IE5VTUJFUiB8fCBUWVBFKG4pID09IE5BTUUpCisgICAgICAgICAgICBwcmludGYoIiglcykiLCBTVFIobikpOworICAgICAgICBwcmludGYoIiAiKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBwcmludGYoIj8gIik7CiB9CiAKIHZvaWQKIHByaW50dHJlZShwYXJzZXJfc3RhdGUgKnBzKQogewotCWlmIChQeV9EZWJ1Z0ZsYWcpIHsKLQkJcHJpbnRmKCJQYXJzZSB0cmVlOlxuIik7Ci0JCWR1bXB0cmVlKHBzLT5wX2dyYW1tYXIsIHBzLT5wX3RyZWUpOwotCQlwcmludGYoIlxuIik7Ci0JCXByaW50ZigiVG9rZW5zOlxuIik7Ci0JCXNob3d0cmVlKHBzLT5wX2dyYW1tYXIsIHBzLT5wX3RyZWUpOwotCQlwcmludGYoIlxuIik7Ci0JfQotCXByaW50ZigiTGlzdGluZzpcbiIpOwotCVB5Tm9kZV9MaXN0VHJlZShwcy0+cF90cmVlKTsKLQlwcmludGYoIlxuIik7CisgICAgaWYgKFB5X0RlYnVnRmxhZykgeworICAgICAgICBwcmludGYoIlBhcnNlIHRyZWU6XG4iKTsKKyAgICAgICAgZHVtcHRyZWUocHMtPnBfZ3JhbW1hciwgcHMtPnBfdHJlZSk7CisgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgcHJpbnRmKCJUb2tlbnM6XG4iKTsKKyAgICAgICAgc2hvd3RyZWUocHMtPnBfZ3JhbW1hciwgcHMtPnBfdHJlZSk7CisgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICB9CisgICAgcHJpbnRmKCJMaXN0aW5nOlxuIik7CisgICAgUHlOb2RlX0xpc3RUcmVlKHBzLT5wX3RyZWUpOworICAgIHByaW50ZigiXG4iKTsKIH0KIAogI2VuZGlmIC8qIFB5X0RFQlVHICovCkBAIC00MTksMTUgKzQxOSwxNSBAQAogCiBBcyBhbiBleGFtcGxlLCBjb25zaWRlciB0aGlzIGdyYW1tYXI6CiAKLWV4cHI6CXRlcm0gKE9QIHRlcm0pKgotdGVybToJQ09OU1RBTlQgfCAnKCcgZXhwciAnKScKK2V4cHI6ICAgdGVybSAoT1AgdGVybSkqCit0ZXJtOiAgIENPTlNUQU5UIHwgJygnIGV4cHIgJyknCiAKIFRoZSBERkEgY29ycmVzcG9uZGluZyB0byB0aGUgcnVsZSBmb3IgZXhwciBpczoKIAogLS0tLS0tLT4uLS0tdGVybS0tPi4tLS0tLS0tPgotCV4gICAgICAgICAgfAotCXwgICAgICAgICAgfAotCVwtLS0tT1AtLS0tLworICAgIF4gICAgICAgICAgfAorICAgIHwgICAgICAgICAgfAorICAgIFwtLS0tT1AtLS0tLwogCiBUaGUgcGFyc2UgdHJlZSBnZW5lcmF0ZWQgZm9yIHRoZSBpbnB1dCBhK2IgaXM6CiAKZGlmZiAtLWdpdCBhL1BhcnNlci9wYXJzZXRvay5jIGIvUGFyc2VyL3BhcnNldG9rLmMKaW5kZXggNzE3OTJkZC4uY2FkN2E4MCAxMDA2NDQKLS0tIGEvUGFyc2VyL3BhcnNldG9rLmMKKysrIGIvUGFyc2VyL3BhcnNldG9rLmMKQEAgLTIxLDg5ICsyMSw4OSBAQAogbm9kZSAqCiBQeVBhcnNlcl9QYXJzZVN0cmluZyhjb25zdCBjaGFyICpzLCBncmFtbWFyICpnLCBpbnQgc3RhcnQsIHBlcnJkZXRhaWwgKmVycl9yZXQpCiB7Ci0JcmV0dXJuIFB5UGFyc2VyX1BhcnNlU3RyaW5nRmxhZ3NGaWxlbmFtZShzLCBOVUxMLCBnLCBzdGFydCwgZXJyX3JldCwgMCk7CisgICAgcmV0dXJuIFB5UGFyc2VyX1BhcnNlU3RyaW5nRmxhZ3NGaWxlbmFtZShzLCBOVUxMLCBnLCBzdGFydCwgZXJyX3JldCwgMCk7CiB9CiAKIG5vZGUgKgogUHlQYXJzZXJfUGFyc2VTdHJpbmdGbGFncyhjb25zdCBjaGFyICpzLCBncmFtbWFyICpnLCBpbnQgc3RhcnQsCi0JCSAgICAgICAgICBwZXJyZGV0YWlsICplcnJfcmV0LCBpbnQgZmxhZ3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcnJkZXRhaWwgKmVycl9yZXQsIGludCBmbGFncykKIHsKLQlyZXR1cm4gUHlQYXJzZXJfUGFyc2VTdHJpbmdGbGFnc0ZpbGVuYW1lKHMsIE5VTEwsCi0JCQkJCQkgZywgc3RhcnQsIGVycl9yZXQsIGZsYWdzKTsKKyAgICByZXR1cm4gUHlQYXJzZXJfUGFyc2VTdHJpbmdGbGFnc0ZpbGVuYW1lKHMsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnLCBzdGFydCwgZXJyX3JldCwgZmxhZ3MpOwogfQogCiBub2RlICoKIFB5UGFyc2VyX1BhcnNlU3RyaW5nRmxhZ3NGaWxlbmFtZShjb25zdCBjaGFyICpzLCBjb25zdCBjaGFyICpmaWxlbmFtZSwKLQkJCSAgZ3JhbW1hciAqZywgaW50IHN0YXJ0LAotCQkgICAgICAgICAgcGVycmRldGFpbCAqZXJyX3JldCwgaW50IGZsYWdzKQorICAgICAgICAgICAgICAgICAgICAgICAgICBncmFtbWFyICpnLCBpbnQgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcnJkZXRhaWwgKmVycl9yZXQsIGludCBmbGFncykKIHsKLQlpbnQgaWZsYWdzID0gZmxhZ3M7Ci0JcmV0dXJuIFB5UGFyc2VyX1BhcnNlU3RyaW5nRmxhZ3NGaWxlbmFtZUV4KHMsIGZpbGVuYW1lLCBnLCBzdGFydCwKLQkJCQkJCSAgIGVycl9yZXQsICZpZmxhZ3MpOworICAgIGludCBpZmxhZ3MgPSBmbGFnczsKKyAgICByZXR1cm4gUHlQYXJzZXJfUGFyc2VTdHJpbmdGbGFnc0ZpbGVuYW1lRXgocywgZmlsZW5hbWUsIGcsIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJfcmV0LCAmaWZsYWdzKTsKIH0KIAogbm9kZSAqCiBQeVBhcnNlcl9QYXJzZVN0cmluZ0ZsYWdzRmlsZW5hbWVFeChjb25zdCBjaGFyICpzLCBjb25zdCBjaGFyICpmaWxlbmFtZSwKLQkJCSAgZ3JhbW1hciAqZywgaW50IHN0YXJ0LAotCQkgICAgICAgICAgcGVycmRldGFpbCAqZXJyX3JldCwgaW50ICpmbGFncykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhbW1hciAqZywgaW50IHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJyZGV0YWlsICplcnJfcmV0LCBpbnQgKmZsYWdzKQogewotCXN0cnVjdCB0b2tfc3RhdGUgKnRvazsKKyAgICBzdHJ1Y3QgdG9rX3N0YXRlICp0b2s7CiAKLQlpbml0ZXJyKGVycl9yZXQsIGZpbGVuYW1lKTsKKyAgICBpbml0ZXJyKGVycl9yZXQsIGZpbGVuYW1lKTsKIAotCWlmICgodG9rID0gUHlUb2tlbml6ZXJfRnJvbVN0cmluZyhzKSkgPT0gTlVMTCkgewotCQllcnJfcmV0LT5lcnJvciA9IFB5RXJyX09jY3VycmVkKCkgPyBFX0RFQ09ERSA6IEVfTk9NRU07Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoKHRvayA9IFB5VG9rZW5pemVyX0Zyb21TdHJpbmcocykpID09IE5VTEwpIHsKKyAgICAgICAgZXJyX3JldC0+ZXJyb3IgPSBQeUVycl9PY2N1cnJlZCgpID8gRV9ERUNPREUgOiBFX05PTUVNOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLSAgICAgICAgdG9rLT5maWxlbmFtZSA9IGZpbGVuYW1lID8gZmlsZW5hbWUgOiAiPHN0cmluZz4iOwotCWlmIChQeV9UYWJjaGVja0ZsYWcgfHwgUHlfVmVyYm9zZUZsYWcpIHsKLQkJdG9rLT5hbHR3YXJuaW5nID0gKHRvay0+ZmlsZW5hbWUgIT0gTlVMTCk7Ci0JCWlmIChQeV9UYWJjaGVja0ZsYWcgPj0gMikKLQkJCXRvay0+YWx0ZXJyb3IrKzsKLQl9CisgICAgdG9rLT5maWxlbmFtZSA9IGZpbGVuYW1lID8gZmlsZW5hbWUgOiAiPHN0cmluZz4iOworICAgIGlmIChQeV9UYWJjaGVja0ZsYWcgfHwgUHlfVmVyYm9zZUZsYWcpIHsKKyAgICAgICAgdG9rLT5hbHR3YXJuaW5nID0gKHRvay0+ZmlsZW5hbWUgIT0gTlVMTCk7CisgICAgICAgIGlmIChQeV9UYWJjaGVja0ZsYWcgPj0gMikKKyAgICAgICAgICAgIHRvay0+YWx0ZXJyb3IrKzsKKyAgICB9CiAKLQlyZXR1cm4gcGFyc2V0b2sodG9rLCBnLCBzdGFydCwgZXJyX3JldCwgZmxhZ3MpOworICAgIHJldHVybiBwYXJzZXRvayh0b2ssIGcsIHN0YXJ0LCBlcnJfcmV0LCBmbGFncyk7CiB9CiAKIC8qIFBhcnNlIGlucHV0IGNvbWluZyBmcm9tIGEgZmlsZS4gIFJldHVybiBlcnJvciBjb2RlLCBwcmludCBzb21lIGVycm9ycy4gKi8KIAogbm9kZSAqCiBQeVBhcnNlcl9QYXJzZUZpbGUoRklMRSAqZnAsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBncmFtbWFyICpnLCBpbnQgc3RhcnQsCi0JCSAgIGNoYXIgKnBzMSwgY2hhciAqcHMyLCBwZXJyZGV0YWlsICplcnJfcmV0KQorICAgICAgICAgICAgICAgICAgIGNoYXIgKnBzMSwgY2hhciAqcHMyLCBwZXJyZGV0YWlsICplcnJfcmV0KQogewotCXJldHVybiBQeVBhcnNlcl9QYXJzZUZpbGVGbGFncyhmcCwgZmlsZW5hbWUsIGcsIHN0YXJ0LCBwczEsIHBzMiwKLQkJCQkgICAgICAgZXJyX3JldCwgMCk7CisgICAgcmV0dXJuIFB5UGFyc2VyX1BhcnNlRmlsZUZsYWdzKGZwLCBmaWxlbmFtZSwgZywgc3RhcnQsIHBzMSwgcHMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJfcmV0LCAwKTsKIH0KIAogbm9kZSAqCiBQeVBhcnNlcl9QYXJzZUZpbGVGbGFncyhGSUxFICpmcCwgY29uc3QgY2hhciAqZmlsZW5hbWUsIGdyYW1tYXIgKmcsIGludCBzdGFydCwKLQkJCWNoYXIgKnBzMSwgY2hhciAqcHMyLCBwZXJyZGV0YWlsICplcnJfcmV0LCBpbnQgZmxhZ3MpCisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpwczEsIGNoYXIgKnBzMiwgcGVycmRldGFpbCAqZXJyX3JldCwgaW50IGZsYWdzKQogewotCWludCBpZmxhZ3MgPSBmbGFnczsKLQlyZXR1cm4gUHlQYXJzZXJfUGFyc2VGaWxlRmxhZ3NFeChmcCwgZmlsZW5hbWUsIGcsIHN0YXJ0LCBwczEsIHBzMiwgZXJyX3JldCwgJmlmbGFncyk7CisgICAgaW50IGlmbGFncyA9IGZsYWdzOworICAgIHJldHVybiBQeVBhcnNlcl9QYXJzZUZpbGVGbGFnc0V4KGZwLCBmaWxlbmFtZSwgZywgc3RhcnQsIHBzMSwgcHMyLCBlcnJfcmV0LCAmaWZsYWdzKTsKIH0KIAogbm9kZSAqCiBQeVBhcnNlcl9QYXJzZUZpbGVGbGFnc0V4KEZJTEUgKmZwLCBjb25zdCBjaGFyICpmaWxlbmFtZSwgZ3JhbW1hciAqZywgaW50IHN0YXJ0LAotCQkJICBjaGFyICpwczEsIGNoYXIgKnBzMiwgcGVycmRldGFpbCAqZXJyX3JldCwgaW50ICpmbGFncykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqcHMxLCBjaGFyICpwczIsIHBlcnJkZXRhaWwgKmVycl9yZXQsIGludCAqZmxhZ3MpCiB7Ci0Jc3RydWN0IHRva19zdGF0ZSAqdG9rOworICAgIHN0cnVjdCB0b2tfc3RhdGUgKnRvazsKIAotCWluaXRlcnIoZXJyX3JldCwgZmlsZW5hbWUpOworICAgIGluaXRlcnIoZXJyX3JldCwgZmlsZW5hbWUpOwogCi0JaWYgKCh0b2sgPSBQeVRva2VuaXplcl9Gcm9tRmlsZShmcCwgcHMxLCBwczIpKSA9PSBOVUxMKSB7Ci0JCWVycl9yZXQtPmVycm9yID0gRV9OT01FTTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXRvay0+ZmlsZW5hbWUgPSBmaWxlbmFtZTsKLQlpZiAoUHlfVGFiY2hlY2tGbGFnIHx8IFB5X1ZlcmJvc2VGbGFnKSB7Ci0JCXRvay0+YWx0d2FybmluZyA9IChmaWxlbmFtZSAhPSBOVUxMKTsKLQkJaWYgKFB5X1RhYmNoZWNrRmxhZyA+PSAyKQotCQkJdG9rLT5hbHRlcnJvcisrOwotCX0KKyAgICBpZiAoKHRvayA9IFB5VG9rZW5pemVyX0Zyb21GaWxlKGZwLCBwczEsIHBzMikpID09IE5VTEwpIHsKKyAgICAgICAgZXJyX3JldC0+ZXJyb3IgPSBFX05PTUVNOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgdG9rLT5maWxlbmFtZSA9IGZpbGVuYW1lOworICAgIGlmIChQeV9UYWJjaGVja0ZsYWcgfHwgUHlfVmVyYm9zZUZsYWcpIHsKKyAgICAgICAgdG9rLT5hbHR3YXJuaW5nID0gKGZpbGVuYW1lICE9IE5VTEwpOworICAgICAgICBpZiAoUHlfVGFiY2hlY2tGbGFnID49IDIpCisgICAgICAgICAgICB0b2stPmFsdGVycm9yKys7CisgICAgfQogCi0JcmV0dXJuIHBhcnNldG9rKHRvaywgZywgc3RhcnQsIGVycl9yZXQsIGZsYWdzKTsKKyAgICByZXR1cm4gcGFyc2V0b2sodG9rLCBnLCBzdGFydCwgZXJyX3JldCwgZmxhZ3MpOwogfQogCiAjaWYgMApAQCAtMTE2LDkgKzExNiw5IEBACiBzdGF0aWMgdm9pZAogd2Fybihjb25zdCBjaGFyICptc2csIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgbGluZW5vKQogewotCWlmIChmaWxlbmFtZSA9PSBOVUxMKQotCQlmaWxlbmFtZSA9ICI8c3RyaW5nPiI7Ci0JUHlTeXNfV3JpdGVTdGRlcnIobXNnLCBmaWxlbmFtZSwgbGluZW5vKTsKKyAgICBpZiAoZmlsZW5hbWUgPT0gTlVMTCkKKyAgICAgICAgZmlsZW5hbWUgPSAiPHN0cmluZz4iOworICAgIFB5U3lzX1dyaXRlU3RkZXJyKG1zZywgZmlsZW5hbWUsIGxpbmVubyk7CiB9CiAjZW5kaWYKIApAQCAtMTI3LDE0OSArMTI3LDE0OSBAQAogCiBzdGF0aWMgbm9kZSAqCiBwYXJzZXRvayhzdHJ1Y3QgdG9rX3N0YXRlICp0b2ssIGdyYW1tYXIgKmcsIGludCBzdGFydCwgcGVycmRldGFpbCAqZXJyX3JldCwKLQkgaW50ICpmbGFncykKKyAgICAgICAgIGludCAqZmxhZ3MpCiB7Ci0JcGFyc2VyX3N0YXRlICpwczsKLQlub2RlICpuOwotCWludCBzdGFydGVkID0gMCwgaGFuZGxpbmdfaW1wb3J0ID0gMCwgaGFuZGxpbmdfd2l0aCA9IDA7CisgICAgcGFyc2VyX3N0YXRlICpwczsKKyAgICBub2RlICpuOworICAgIGludCBzdGFydGVkID0gMCwgaGFuZGxpbmdfaW1wb3J0ID0gMCwgaGFuZGxpbmdfd2l0aCA9IDA7CiAKLQlpZiAoKHBzID0gUHlQYXJzZXJfTmV3KGcsIHN0YXJ0KSkgPT0gTlVMTCkgewotCQlmcHJpbnRmKHN0ZGVyciwgIm5vIG1lbSBmb3IgbmV3IHBhcnNlclxuIik7Ci0JCWVycl9yZXQtPmVycm9yID0gRV9OT01FTTsKLQkJUHlUb2tlbml6ZXJfRnJlZSh0b2spOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKChwcyA9IFB5UGFyc2VyX05ldyhnLCBzdGFydCkpID09IE5VTEwpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJubyBtZW0gZm9yIG5ldyBwYXJzZXJcbiIpOworICAgICAgICBlcnJfcmV0LT5lcnJvciA9IEVfTk9NRU07CisgICAgICAgIFB5VG9rZW5pemVyX0ZyZWUodG9rKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogI2lmZGVmIFBZX1BBUlNFUl9SRVFVSVJFU19GVVRVUkVfS0VZV09SRAotCWlmICgqZmxhZ3MgJiBQeVBBUlNFX1BSSU5UX0lTX0ZVTkNUSU9OKSB7Ci0JCXBzLT5wX2ZsYWdzIHw9IENPX0ZVVFVSRV9QUklOVF9GVU5DVElPTjsKLQl9Ci0JaWYgKCpmbGFncyAmIFB5UEFSU0VfVU5JQ09ERV9MSVRFUkFMUykgewotCQlwcy0+cF9mbGFncyB8PSBDT19GVVRVUkVfVU5JQ09ERV9MSVRFUkFMUzsKLQl9CisgICAgaWYgKCpmbGFncyAmIFB5UEFSU0VfUFJJTlRfSVNfRlVOQ1RJT04pIHsKKyAgICAgICAgcHMtPnBfZmxhZ3MgfD0gQ09fRlVUVVJFX1BSSU5UX0ZVTkNUSU9OOworICAgIH0KKyAgICBpZiAoKmZsYWdzICYgUHlQQVJTRV9VTklDT0RFX0xJVEVSQUxTKSB7CisgICAgICAgIHBzLT5wX2ZsYWdzIHw9IENPX0ZVVFVSRV9VTklDT0RFX0xJVEVSQUxTOworICAgIH0KIAogI2VuZGlmCiAKLQlmb3IgKDs7KSB7Ci0JCWNoYXIgKmEsICpiOwotCQlpbnQgdHlwZTsKLQkJc2l6ZV90IGxlbjsKLQkJY2hhciAqc3RyOwotCQlpbnQgY29sX29mZnNldDsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGNoYXIgKmEsICpiOworICAgICAgICBpbnQgdHlwZTsKKyAgICAgICAgc2l6ZV90IGxlbjsKKyAgICAgICAgY2hhciAqc3RyOworICAgICAgICBpbnQgY29sX29mZnNldDsKIAotCQl0eXBlID0gUHlUb2tlbml6ZXJfR2V0KHRvaywgJmEsICZiKTsKLQkJaWYgKHR5cGUgPT0gRVJST1JUT0tFTikgewotCQkJZXJyX3JldC0+ZXJyb3IgPSB0b2stPmRvbmU7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAodHlwZSA9PSBFTkRNQVJLRVIgJiYgc3RhcnRlZCkgewotCQkJdHlwZSA9IE5FV0xJTkU7IC8qIEFkZCBhbiBleHRyYSBuZXdsaW5lICovCi0JCQloYW5kbGluZ193aXRoID0gaGFuZGxpbmdfaW1wb3J0ID0gMDsKLQkJCXN0YXJ0ZWQgPSAwOwotCQkJLyogQWRkIHRoZSByaWdodCBudW1iZXIgb2YgZGVkZW50IHRva2VucywKLQkJCSAgIGV4Y2VwdCBpZiBhIGNlcnRhaW4gZmxhZyBpcyBnaXZlbiAtLQotCQkJICAgY29kZW9wLnB5IHVzZXMgdGhpcy4gKi8KLQkJCWlmICh0b2stPmluZGVudCAmJgotCQkJICAgICEoKmZsYWdzICYgUHlQQVJTRV9ET05UX0lNUExZX0RFREVOVCkpCi0JCQl7Ci0JCQkJdG9rLT5wZW5kaW4gPSAtdG9rLT5pbmRlbnQ7Ci0JCQkJdG9rLT5pbmRlbnQgPSAwOwotCQkJfQotCQl9Ci0JCWVsc2UKLQkJCXN0YXJ0ZWQgPSAxOwotCQlsZW4gPSBiIC0gYTsgLyogWFhYIHRoaXMgbWF5IGNvbXB1dGUgTlVMTCAtIE5VTEwgKi8KLQkJc3RyID0gKGNoYXIgKikgUHlPYmplY3RfTUFMTE9DKGxlbiArIDEpOwotCQlpZiAoc3RyID09IE5VTEwpIHsKLQkJCWZwcmludGYoc3RkZXJyLCAibm8gbWVtIGZvciBuZXh0IHRva2VuXG4iKTsKLQkJCWVycl9yZXQtPmVycm9yID0gRV9OT01FTTsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmIChsZW4gPiAwKQotCQkJc3RybmNweShzdHIsIGEsIGxlbik7Ci0JCXN0cltsZW5dID0gJ1wwJzsKKyAgICAgICAgdHlwZSA9IFB5VG9rZW5pemVyX0dldCh0b2ssICZhLCAmYik7CisgICAgICAgIGlmICh0eXBlID09IEVSUk9SVE9LRU4pIHsKKyAgICAgICAgICAgIGVycl9yZXQtPmVycm9yID0gdG9rLT5kb25lOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHR5cGUgPT0gRU5ETUFSS0VSICYmIHN0YXJ0ZWQpIHsKKyAgICAgICAgICAgIHR5cGUgPSBORVdMSU5FOyAvKiBBZGQgYW4gZXh0cmEgbmV3bGluZSAqLworICAgICAgICAgICAgaGFuZGxpbmdfd2l0aCA9IGhhbmRsaW5nX2ltcG9ydCA9IDA7CisgICAgICAgICAgICBzdGFydGVkID0gMDsKKyAgICAgICAgICAgIC8qIEFkZCB0aGUgcmlnaHQgbnVtYmVyIG9mIGRlZGVudCB0b2tlbnMsCisgICAgICAgICAgICAgICBleGNlcHQgaWYgYSBjZXJ0YWluIGZsYWcgaXMgZ2l2ZW4gLS0KKyAgICAgICAgICAgICAgIGNvZGVvcC5weSB1c2VzIHRoaXMuICovCisgICAgICAgICAgICBpZiAodG9rLT5pbmRlbnQgJiYKKyAgICAgICAgICAgICAgICAhKCpmbGFncyAmIFB5UEFSU0VfRE9OVF9JTVBMWV9ERURFTlQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRvay0+cGVuZGluID0gLXRvay0+aW5kZW50OworICAgICAgICAgICAgICAgIHRvay0+aW5kZW50ID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBzdGFydGVkID0gMTsKKyAgICAgICAgbGVuID0gYiAtIGE7IC8qIFhYWCB0aGlzIG1heSBjb21wdXRlIE5VTEwgLSBOVUxMICovCisgICAgICAgIHN0ciA9IChjaGFyICopIFB5T2JqZWN0X01BTExPQyhsZW4gKyAxKTsKKyAgICAgICAgaWYgKHN0ciA9PSBOVUxMKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIm5vIG1lbSBmb3IgbmV4dCB0b2tlblxuIik7CisgICAgICAgICAgICBlcnJfcmV0LT5lcnJvciA9IEVfTk9NRU07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAobGVuID4gMCkKKyAgICAgICAgICAgIHN0cm5jcHkoc3RyLCBhLCBsZW4pOworICAgICAgICBzdHJbbGVuXSA9ICdcMCc7CiAKICNpZmRlZiBQWV9QQVJTRVJfUkVRVUlSRVNfRlVUVVJFX0tFWVdPUkQKICNlbmRpZgotCQlpZiAoYSA+PSB0b2stPmxpbmVfc3RhcnQpCi0JCQljb2xfb2Zmc2V0ID0gYSAtIHRvay0+bGluZV9zdGFydDsKLQkJZWxzZQotCQkJY29sX29mZnNldCA9IC0xOwotCQkJCi0JCWlmICgoZXJyX3JldC0+ZXJyb3IgPQotCQkgICAgIFB5UGFyc2VyX0FkZFRva2VuKHBzLCAoaW50KXR5cGUsIHN0ciwgdG9rLT5saW5lbm8sIGNvbF9vZmZzZXQsCi0JCQkJICAgICAgICYoZXJyX3JldC0+ZXhwZWN0ZWQpKSkgIT0gRV9PSykgewotCQkJaWYgKGVycl9yZXQtPmVycm9yICE9IEVfRE9ORSkgewotCQkJCVB5T2JqZWN0X0ZSRUUoc3RyKTsKLQkJCQllcnJfcmV0LT50b2tlbiA9IHR5cGU7Ci0JCQl9CQkJCQotCQkJYnJlYWs7Ci0JCX0KLQl9CisgICAgICAgIGlmIChhID49IHRvay0+bGluZV9zdGFydCkKKyAgICAgICAgICAgIGNvbF9vZmZzZXQgPSBhIC0gdG9rLT5saW5lX3N0YXJ0OworICAgICAgICBlbHNlCisgICAgICAgICAgICBjb2xfb2Zmc2V0ID0gLTE7CiAKLQlpZiAoZXJyX3JldC0+ZXJyb3IgPT0gRV9ET05FKSB7Ci0JCW4gPSBwcy0+cF90cmVlOwotCQlwcy0+cF90cmVlID0gTlVMTDsKLQl9Ci0JZWxzZQotCQluID0gTlVMTDsKKyAgICAgICAgaWYgKChlcnJfcmV0LT5lcnJvciA9CisgICAgICAgICAgICAgUHlQYXJzZXJfQWRkVG9rZW4ocHMsIChpbnQpdHlwZSwgc3RyLCB0b2stPmxpbmVubywgY29sX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKGVycl9yZXQtPmV4cGVjdGVkKSkpICE9IEVfT0spIHsKKyAgICAgICAgICAgIGlmIChlcnJfcmV0LT5lcnJvciAhPSBFX0RPTkUpIHsKKyAgICAgICAgICAgICAgICBQeU9iamVjdF9GUkVFKHN0cik7CisgICAgICAgICAgICAgICAgZXJyX3JldC0+dG9rZW4gPSB0eXBlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZXJyX3JldC0+ZXJyb3IgPT0gRV9ET05FKSB7CisgICAgICAgIG4gPSBwcy0+cF90cmVlOworICAgICAgICBwcy0+cF90cmVlID0gTlVMTDsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBuID0gTlVMTDsKIAogI2lmZGVmIFBZX1BBUlNFUl9SRVFVSVJFU19GVVRVUkVfS0VZV09SRAotCSpmbGFncyA9IHBzLT5wX2ZsYWdzOworICAgICpmbGFncyA9IHBzLT5wX2ZsYWdzOwogI2VuZGlmCi0JUHlQYXJzZXJfRGVsZXRlKHBzKTsKKyAgICBQeVBhcnNlcl9EZWxldGUocHMpOwogCi0JaWYgKG4gPT0gTlVMTCkgewotCQlpZiAodG9rLT5saW5lbm8gPD0gMSAmJiB0b2stPmRvbmUgPT0gRV9FT0YpCi0JCQllcnJfcmV0LT5lcnJvciA9IEVfRU9GOwotCQllcnJfcmV0LT5saW5lbm8gPSB0b2stPmxpbmVubzsKLQkJaWYgKHRvay0+YnVmICE9IE5VTEwpIHsKLQkJCWNoYXIgKnRleHQgPSBOVUxMOwotCQkJc2l6ZV90IGxlbjsKLQkJCWFzc2VydCh0b2stPmN1ciAtIHRvay0+YnVmIDwgSU5UX01BWCk7Ci0JCQllcnJfcmV0LT5vZmZzZXQgPSAoaW50KSh0b2stPmN1ciAtIHRvay0+YnVmKTsKLQkJCWxlbiA9IHRvay0+aW5wIC0gdG9rLT5idWY7CisgICAgaWYgKG4gPT0gTlVMTCkgeworICAgICAgICBpZiAodG9rLT5saW5lbm8gPD0gMSAmJiB0b2stPmRvbmUgPT0gRV9FT0YpCisgICAgICAgICAgICBlcnJfcmV0LT5lcnJvciA9IEVfRU9GOworICAgICAgICBlcnJfcmV0LT5saW5lbm8gPSB0b2stPmxpbmVubzsKKyAgICAgICAgaWYgKHRvay0+YnVmICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGNoYXIgKnRleHQgPSBOVUxMOworICAgICAgICAgICAgc2l6ZV90IGxlbjsKKyAgICAgICAgICAgIGFzc2VydCh0b2stPmN1ciAtIHRvay0+YnVmIDwgSU5UX01BWCk7CisgICAgICAgICAgICBlcnJfcmV0LT5vZmZzZXQgPSAoaW50KSh0b2stPmN1ciAtIHRvay0+YnVmKTsKKyAgICAgICAgICAgIGxlbiA9IHRvay0+aW5wIC0gdG9rLT5idWY7CiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCQkJdGV4dCA9IFB5VG9rZW5pemVyX1Jlc3RvcmVFbmNvZGluZyh0b2ssIGxlbiwgJmVycl9yZXQtPm9mZnNldCk7CisgICAgICAgICAgICB0ZXh0ID0gUHlUb2tlbml6ZXJfUmVzdG9yZUVuY29kaW5nKHRvaywgbGVuLCAmZXJyX3JldC0+b2Zmc2V0KTsKIAogI2VuZGlmCi0JCQlpZiAodGV4dCA9PSBOVUxMKSB7Ci0JCQkJdGV4dCA9IChjaGFyICopIFB5T2JqZWN0X01BTExPQyhsZW4gKyAxKTsKLQkJCQlpZiAodGV4dCAhPSBOVUxMKSB7Ci0JCQkJCWlmIChsZW4gPiAwKQotCQkJCQkJc3RybmNweSh0ZXh0LCB0b2stPmJ1ZiwgbGVuKTsKLQkJCQkJdGV4dFtsZW5dID0gJ1wwJzsKLQkJCQl9Ci0JCQl9Ci0JCQllcnJfcmV0LT50ZXh0ID0gdGV4dDsKLQkJfQotCX0gZWxzZSBpZiAodG9rLT5lbmNvZGluZyAhPSBOVUxMKSB7Ci0JCW5vZGUqIHIgPSBQeU5vZGVfTmV3KGVuY29kaW5nX2RlY2wpOwotCQlpZiAoIXIpIHsKLQkJCWVycl9yZXQtPmVycm9yID0gRV9OT01FTTsKLQkJCW4gPSBOVUxMOwotCQkJZ290byBkb25lOwotCQl9Ci0JCXItPm5fc3RyID0gdG9rLT5lbmNvZGluZzsKLQkJci0+bl9uY2hpbGRyZW4gPSAxOwotCQlyLT5uX2NoaWxkID0gbjsKLQkJdG9rLT5lbmNvZGluZyA9IE5VTEw7Ci0JCW4gPSByOwotCX0KKyAgICAgICAgICAgIGlmICh0ZXh0ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICB0ZXh0ID0gKGNoYXIgKikgUHlPYmplY3RfTUFMTE9DKGxlbiArIDEpOworICAgICAgICAgICAgICAgIGlmICh0ZXh0ICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxlbiA+IDApCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJuY3B5KHRleHQsIHRvay0+YnVmLCBsZW4pOworICAgICAgICAgICAgICAgICAgICB0ZXh0W2xlbl0gPSAnXDAnOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVycl9yZXQtPnRleHQgPSB0ZXh0OworICAgICAgICB9CisgICAgfSBlbHNlIGlmICh0b2stPmVuY29kaW5nICE9IE5VTEwpIHsKKyAgICAgICAgbm9kZSogciA9IFB5Tm9kZV9OZXcoZW5jb2RpbmdfZGVjbCk7CisgICAgICAgIGlmICghcikgeworICAgICAgICAgICAgZXJyX3JldC0+ZXJyb3IgPSBFX05PTUVNOworICAgICAgICAgICAgbiA9IE5VTEw7CisgICAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgIH0KKyAgICAgICAgci0+bl9zdHIgPSB0b2stPmVuY29kaW5nOworICAgICAgICByLT5uX25jaGlsZHJlbiA9IDE7CisgICAgICAgIHItPm5fY2hpbGQgPSBuOworICAgICAgICB0b2stPmVuY29kaW5nID0gTlVMTDsKKyAgICAgICAgbiA9IHI7CisgICAgfQogCiBkb25lOgotCVB5VG9rZW5pemVyX0ZyZWUodG9rKTsKKyAgICBQeVRva2VuaXplcl9GcmVlKHRvayk7CiAKLQlyZXR1cm4gbjsKKyAgICByZXR1cm4gbjsKIH0KIAogc3RhdGljIHZvaWQKIGluaXRlcnIocGVycmRldGFpbCAqZXJyX3JldCwgY29uc3QgY2hhciAqZmlsZW5hbWUpCiB7Ci0JZXJyX3JldC0+ZXJyb3IgPSBFX09LOwotCWVycl9yZXQtPmZpbGVuYW1lID0gZmlsZW5hbWU7Ci0JZXJyX3JldC0+bGluZW5vID0gMDsKLQllcnJfcmV0LT5vZmZzZXQgPSAwOwotCWVycl9yZXQtPnRleHQgPSBOVUxMOwotCWVycl9yZXQtPnRva2VuID0gLTE7Ci0JZXJyX3JldC0+ZXhwZWN0ZWQgPSAtMTsKKyAgICBlcnJfcmV0LT5lcnJvciA9IEVfT0s7CisgICAgZXJyX3JldC0+ZmlsZW5hbWUgPSBmaWxlbmFtZTsKKyAgICBlcnJfcmV0LT5saW5lbm8gPSAwOworICAgIGVycl9yZXQtPm9mZnNldCA9IDA7CisgICAgZXJyX3JldC0+dGV4dCA9IE5VTEw7CisgICAgZXJyX3JldC0+dG9rZW4gPSAtMTsKKyAgICBlcnJfcmV0LT5leHBlY3RlZCA9IC0xOwogfQpkaWZmIC0tZ2l0IGEvUGFyc2VyL3BnZW4uYyBiL1BhcnNlci9wZ2VuLmMKaW5kZXggOTU5YTVkMy4uYmVhZjUzYiAxMDA2NDQKLS0tIGEvUGFyc2VyL3BnZW4uYworKysgYi9QYXJzZXIvcGdlbi5jCkBAIC0xNyw4NSArMTcsODUgQEAKIC8qIFBBUlQgT05FIC0tIENPTlNUUlVDVCBORkEgLS0gQ2YuIEFsZ29yaXRobSAzLjIgZnJvbSBbQWhvJlVsbG1hbiA3N10gKi8KIAogdHlwZWRlZiBzdHJ1Y3QgX25mYWFyYyB7Ci0JaW50CWFyX2xhYmVsOwotCWludAlhcl9hcnJvdzsKKyAgICBpbnQgICAgICAgICBhcl9sYWJlbDsKKyAgICBpbnQgICAgICAgICBhcl9hcnJvdzsKIH0gbmZhYXJjOwogCiB0eXBlZGVmIHN0cnVjdCBfbmZhc3RhdGUgewotCWludAlzdF9uYXJjczsKLQluZmFhcmMJKnN0X2FyYzsKKyAgICBpbnQgICAgICAgICBzdF9uYXJjczsKKyAgICBuZmFhcmMgICAgICAqc3RfYXJjOwogfSBuZmFzdGF0ZTsKIAogdHlwZWRlZiBzdHJ1Y3QgX25mYSB7Ci0JaW50CQluZl90eXBlOwotCWNoYXIJCSpuZl9uYW1lOwotCWludAkJbmZfbnN0YXRlczsKLQluZmFzdGF0ZQkqbmZfc3RhdGU7Ci0JaW50CQluZl9zdGFydCwgbmZfZmluaXNoOworICAgIGludCAgICAgICAgICAgICAgICAgbmZfdHlwZTsKKyAgICBjaGFyICAgICAgICAgICAgICAgICpuZl9uYW1lOworICAgIGludCAgICAgICAgICAgICAgICAgbmZfbnN0YXRlczsKKyAgICBuZmFzdGF0ZSAgICAgICAgICAgICpuZl9zdGF0ZTsKKyAgICBpbnQgICAgICAgICAgICAgICAgIG5mX3N0YXJ0LCBuZl9maW5pc2g7CiB9IG5mYTsKIAogLyogRm9yd2FyZCAqLwogc3RhdGljIHZvaWQgY29tcGlsZV9yaHMobGFiZWxsaXN0ICpsbCwKLQkJCW5mYSAqbmYsIG5vZGUgKm4sIGludCAqcGEsIGludCAqcGIpOworICAgICAgICAgICAgICAgICAgICAgICAgbmZhICpuZiwgbm9kZSAqbiwgaW50ICpwYSwgaW50ICpwYik7CiBzdGF0aWMgdm9pZCBjb21waWxlX2FsdChsYWJlbGxpc3QgKmxsLAotCQkJbmZhICpuZiwgbm9kZSAqbiwgaW50ICpwYSwgaW50ICpwYik7CisgICAgICAgICAgICAgICAgICAgICAgICBuZmEgKm5mLCBub2RlICpuLCBpbnQgKnBhLCBpbnQgKnBiKTsKIHN0YXRpYyB2b2lkIGNvbXBpbGVfaXRlbShsYWJlbGxpc3QgKmxsLAotCQkJIG5mYSAqbmYsIG5vZGUgKm4sIGludCAqcGEsIGludCAqcGIpOworICAgICAgICAgICAgICAgICAgICAgICAgIG5mYSAqbmYsIG5vZGUgKm4sIGludCAqcGEsIGludCAqcGIpOwogc3RhdGljIHZvaWQgY29tcGlsZV9hdG9tKGxhYmVsbGlzdCAqbGwsCi0JCQkgbmZhICpuZiwgbm9kZSAqbiwgaW50ICpwYSwgaW50ICpwYik7CisgICAgICAgICAgICAgICAgICAgICAgICAgbmZhICpuZiwgbm9kZSAqbiwgaW50ICpwYSwgaW50ICpwYik7CiAKIHN0YXRpYyBpbnQKIGFkZG5mYXN0YXRlKG5mYSAqbmYpCiB7Ci0JbmZhc3RhdGUgKnN0OwotCQotCW5mLT5uZl9zdGF0ZSA9IChuZmFzdGF0ZSAqKVB5T2JqZWN0X1JFQUxMT0MobmYtPm5mX3N0YXRlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihuZmFzdGF0ZSkgKiAobmYtPm5mX25zdGF0ZXMgKyAxKSk7Ci0JaWYgKG5mLT5uZl9zdGF0ZSA9PSBOVUxMKQotCQlQeV9GYXRhbEVycm9yKCJvdXQgb2YgbWVtIik7Ci0Jc3QgPSAmbmYtPm5mX3N0YXRlW25mLT5uZl9uc3RhdGVzKytdOwotCXN0LT5zdF9uYXJjcyA9IDA7Ci0Jc3QtPnN0X2FyYyA9IE5VTEw7Ci0JcmV0dXJuIHN0IC0gbmYtPm5mX3N0YXRlOworICAgIG5mYXN0YXRlICpzdDsKKworICAgIG5mLT5uZl9zdGF0ZSA9IChuZmFzdGF0ZSAqKVB5T2JqZWN0X1JFQUxMT0MobmYtPm5mX3N0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YobmZhc3RhdGUpICogKG5mLT5uZl9uc3RhdGVzICsgMSkpOworICAgIGlmIChuZi0+bmZfc3RhdGUgPT0gTlVMTCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigib3V0IG9mIG1lbSIpOworICAgIHN0ID0gJm5mLT5uZl9zdGF0ZVtuZi0+bmZfbnN0YXRlcysrXTsKKyAgICBzdC0+c3RfbmFyY3MgPSAwOworICAgIHN0LT5zdF9hcmMgPSBOVUxMOworICAgIHJldHVybiBzdCAtIG5mLT5uZl9zdGF0ZTsKIH0KIAogc3RhdGljIHZvaWQKIGFkZG5mYWFyYyhuZmEgKm5mLCBpbnQgZnJvbSwgaW50IHRvLCBpbnQgbGJsKQogewotCW5mYXN0YXRlICpzdDsKLQluZmFhcmMgKmFyOwotCQotCXN0ID0gJm5mLT5uZl9zdGF0ZVtmcm9tXTsKLQlzdC0+c3RfYXJjID0gKG5mYWFyYyAqKVB5T2JqZWN0X1JFQUxMT0Moc3QtPnN0X2FyYywKLQkJCQkgICAgICBzaXplb2YobmZhYXJjKSAqIChzdC0+c3RfbmFyY3MgKyAxKSk7Ci0JaWYgKHN0LT5zdF9hcmMgPT0gTlVMTCkKLQkJUHlfRmF0YWxFcnJvcigib3V0IG9mIG1lbSIpOwotCWFyID0gJnN0LT5zdF9hcmNbc3QtPnN0X25hcmNzKytdOwotCWFyLT5hcl9sYWJlbCA9IGxibDsKLQlhci0+YXJfYXJyb3cgPSB0bzsKKyAgICBuZmFzdGF0ZSAqc3Q7CisgICAgbmZhYXJjICphcjsKKworICAgIHN0ID0gJm5mLT5uZl9zdGF0ZVtmcm9tXTsKKyAgICBzdC0+c3RfYXJjID0gKG5mYWFyYyAqKVB5T2JqZWN0X1JFQUxMT0Moc3QtPnN0X2FyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YobmZhYXJjKSAqIChzdC0+c3RfbmFyY3MgKyAxKSk7CisgICAgaWYgKHN0LT5zdF9hcmMgPT0gTlVMTCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigib3V0IG9mIG1lbSIpOworICAgIGFyID0gJnN0LT5zdF9hcmNbc3QtPnN0X25hcmNzKytdOworICAgIGFyLT5hcl9sYWJlbCA9IGxibDsKKyAgICBhci0+YXJfYXJyb3cgPSB0bzsKIH0KIAogc3RhdGljIG5mYSAqCiBuZXduZmEoY2hhciAqbmFtZSkKIHsKLQluZmEgKm5mOwotCXN0YXRpYyBpbnQgdHlwZSA9IE5UX09GRlNFVDsgLyogQWxsIHR5cGVzIHdpbGwgYmUgZGlzanVuY3QgKi8KLQkKLQluZiA9IChuZmEgKilQeU9iamVjdF9NQUxMT0Moc2l6ZW9mKG5mYSkpOwotCWlmIChuZiA9PSBOVUxMKQotCQlQeV9GYXRhbEVycm9yKCJubyBtZW0gZm9yIG5ldyBuZmEiKTsKLQluZi0+bmZfdHlwZSA9IHR5cGUrKzsKLQluZi0+bmZfbmFtZSA9IG5hbWU7IC8qIFhYWCBzdHJkdXAobmFtZSkgPz8/ICovCi0JbmYtPm5mX25zdGF0ZXMgPSAwOwotCW5mLT5uZl9zdGF0ZSA9IE5VTEw7Ci0JbmYtPm5mX3N0YXJ0ID0gbmYtPm5mX2ZpbmlzaCA9IC0xOwotCXJldHVybiBuZjsKKyAgICBuZmEgKm5mOworICAgIHN0YXRpYyBpbnQgdHlwZSA9IE5UX09GRlNFVDsgLyogQWxsIHR5cGVzIHdpbGwgYmUgZGlzanVuY3QgKi8KKworICAgIG5mID0gKG5mYSAqKVB5T2JqZWN0X01BTExPQyhzaXplb2YobmZhKSk7CisgICAgaWYgKG5mID09IE5VTEwpCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIm5vIG1lbSBmb3IgbmV3IG5mYSIpOworICAgIG5mLT5uZl90eXBlID0gdHlwZSsrOworICAgIG5mLT5uZl9uYW1lID0gbmFtZTsgLyogWFhYIHN0cmR1cChuYW1lKSA/Pz8gKi8KKyAgICBuZi0+bmZfbnN0YXRlcyA9IDA7CisgICAgbmYtPm5mX3N0YXRlID0gTlVMTDsKKyAgICBuZi0+bmZfc3RhcnQgPSBuZi0+bmZfZmluaXNoID0gLTE7CisgICAgcmV0dXJuIG5mOwogfQogCiB0eXBlZGVmIHN0cnVjdCBfbmZhZ3JhbW1hciB7Ci0JaW50CQlncl9ubmZhczsKLQluZmEJCSoqZ3JfbmZhOwotCWxhYmVsbGlzdAlncl9sbDsKKyAgICBpbnQgICAgICAgICAgICAgICAgIGdyX25uZmFzOworICAgIG5mYSAgICAgICAgICAgICAgICAgKipncl9uZmE7CisgICAgbGFiZWxsaXN0ICAgICAgICAgICBncl9sbDsKIH0gbmZhZ3JhbW1hcjsKIAogLyogRm9yd2FyZCAqLwpAQCAtMTA0LDMyICsxMDQsMzIgQEAKIHN0YXRpYyBuZmFncmFtbWFyICoKIG5ld25mYWdyYW1tYXIodm9pZCkKIHsKLQluZmFncmFtbWFyICpncjsKLQkKLQlnciA9IChuZmFncmFtbWFyICopUHlPYmplY3RfTUFMTE9DKHNpemVvZihuZmFncmFtbWFyKSk7Ci0JaWYgKGdyID09IE5VTEwpCi0JCVB5X0ZhdGFsRXJyb3IoIm5vIG1lbSBmb3IgbmV3IG5mYSBncmFtbWFyIik7Ci0JZ3ItPmdyX25uZmFzID0gMDsKLQlnci0+Z3JfbmZhID0gTlVMTDsKLQlnci0+Z3JfbGwubGxfbmxhYmVscyA9IDA7Ci0JZ3ItPmdyX2xsLmxsX2xhYmVsID0gTlVMTDsKLQlhZGRsYWJlbCgmZ3ItPmdyX2xsLCBFTkRNQVJLRVIsICJFTVBUWSIpOwotCXJldHVybiBncjsKKyAgICBuZmFncmFtbWFyICpncjsKKworICAgIGdyID0gKG5mYWdyYW1tYXIgKilQeU9iamVjdF9NQUxMT0Moc2l6ZW9mKG5mYWdyYW1tYXIpKTsKKyAgICBpZiAoZ3IgPT0gTlVMTCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigibm8gbWVtIGZvciBuZXcgbmZhIGdyYW1tYXIiKTsKKyAgICBnci0+Z3Jfbm5mYXMgPSAwOworICAgIGdyLT5ncl9uZmEgPSBOVUxMOworICAgIGdyLT5ncl9sbC5sbF9ubGFiZWxzID0gMDsKKyAgICBnci0+Z3JfbGwubGxfbGFiZWwgPSBOVUxMOworICAgIGFkZGxhYmVsKCZnci0+Z3JfbGwsIEVORE1BUktFUiwgIkVNUFRZIik7CisgICAgcmV0dXJuIGdyOwogfQogCiBzdGF0aWMgbmZhICoKIGFkZG5mYShuZmFncmFtbWFyICpnciwgY2hhciAqbmFtZSkKIHsKLQluZmEgKm5mOwotCQotCW5mID0gbmV3bmZhKG5hbWUpOwotCWdyLT5ncl9uZmEgPSAobmZhICoqKVB5T2JqZWN0X1JFQUxMT0MoZ3ItPmdyX25mYSwKLQkJCQkgICAgICBzaXplb2YobmZhKikgKiAoZ3ItPmdyX25uZmFzICsgMSkpOwotCWlmIChnci0+Z3JfbmZhID09IE5VTEwpCi0JCVB5X0ZhdGFsRXJyb3IoIm91dCBvZiBtZW0iKTsKLQlnci0+Z3JfbmZhW2dyLT5ncl9ubmZhcysrXSA9IG5mOwotCWFkZGxhYmVsKCZnci0+Z3JfbGwsIE5BTUUsIG5mLT5uZl9uYW1lKTsKLQlyZXR1cm4gbmY7CisgICAgbmZhICpuZjsKKworICAgIG5mID0gbmV3bmZhKG5hbWUpOworICAgIGdyLT5ncl9uZmEgPSAobmZhICoqKVB5T2JqZWN0X1JFQUxMT0MoZ3ItPmdyX25mYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YobmZhKikgKiAoZ3ItPmdyX25uZmFzICsgMSkpOworICAgIGlmIChnci0+Z3JfbmZhID09IE5VTEwpCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIm91dCBvZiBtZW0iKTsKKyAgICBnci0+Z3JfbmZhW2dyLT5ncl9ubmZhcysrXSA9IG5mOworICAgIGFkZGxhYmVsKCZnci0+Z3JfbGwsIE5BTUUsIG5mLT5uZl9uYW1lKTsKKyAgICByZXR1cm4gbmY7CiB9CiAKICNpZmRlZiBQeV9ERUJVRwpAQCAtMTM3LDIwMyArMTM3LDIwMyBAQAogc3RhdGljIGNoYXIgUkVRTkZNVFtdID0gIm1ldGFjb21waWxlOiBsZXNzIHRoYW4gJWQgY2hpbGRyZW5cbiI7CiAKICNkZWZpbmUgUkVRTihpLCBjb3VudCkgXAotIAlpZiAoaSA8IGNvdW50KSB7IFwKLQkJZnByaW50ZihzdGRlcnIsIFJFUU5GTVQsIGNvdW50KTsgXAotCQlQeV9GYXRhbEVycm9yKCJSRVFOIik7IFwKLQl9IGVsc2UKKyAgICBpZiAoaSA8IGNvdW50KSB7IFwKKyAgICAgICAgZnByaW50ZihzdGRlcnIsIFJFUU5GTVQsIGNvdW50KTsgXAorICAgICAgICBQeV9GYXRhbEVycm9yKCJSRVFOIik7IFwKKyAgICB9IGVsc2UKIAogI2Vsc2UKLSNkZWZpbmUgUkVRTihpLCBjb3VudCkJLyogZW1wdHkgKi8KKyNkZWZpbmUgUkVRTihpLCBjb3VudCkgIC8qIGVtcHR5ICovCiAjZW5kaWYKIAogc3RhdGljIG5mYWdyYW1tYXIgKgogbWV0YWNvbXBpbGUobm9kZSAqbikKIHsKLQluZmFncmFtbWFyICpncjsKLQlpbnQgaTsKKyAgICBuZmFncmFtbWFyICpncjsKKyAgICBpbnQgaTsKIAotCWlmIChQeV9EZWJ1Z0ZsYWcpCi0JCXByaW50ZigiQ29tcGlsaW5nIChtZXRhLSkgcGFyc2UgdHJlZSBpbnRvIE5GQSBncmFtbWFyXG4iKTsKLQlnciA9IG5ld25mYWdyYW1tYXIoKTsKLQlSRVEobiwgTVNUQVJUKTsKLQlpID0gbi0+bl9uY2hpbGRyZW4gLSAxOyAvKiBMYXN0IGNoaWxkIGlzIEVORE1BUktFUiAqLwotCW4gPSBuLT5uX2NoaWxkOwotCWZvciAoOyAtLWkgPj0gMDsgbisrKSB7Ci0JCWlmIChuLT5uX3R5cGUgIT0gTkVXTElORSkKLQkJCWNvbXBpbGVfcnVsZShnciwgbik7Ci0JfQotCXJldHVybiBncjsKKyAgICBpZiAoUHlfRGVidWdGbGFnKQorICAgICAgICBwcmludGYoIkNvbXBpbGluZyAobWV0YS0pIHBhcnNlIHRyZWUgaW50byBORkEgZ3JhbW1hclxuIik7CisgICAgZ3IgPSBuZXduZmFncmFtbWFyKCk7CisgICAgUkVRKG4sIE1TVEFSVCk7CisgICAgaSA9IG4tPm5fbmNoaWxkcmVuIC0gMTsgLyogTGFzdCBjaGlsZCBpcyBFTkRNQVJLRVIgKi8KKyAgICBuID0gbi0+bl9jaGlsZDsKKyAgICBmb3IgKDsgLS1pID49IDA7IG4rKykgeworICAgICAgICBpZiAobi0+bl90eXBlICE9IE5FV0xJTkUpCisgICAgICAgICAgICBjb21waWxlX3J1bGUoZ3IsIG4pOworICAgIH0KKyAgICByZXR1cm4gZ3I7CiB9CiAKIHN0YXRpYyB2b2lkCiBjb21waWxlX3J1bGUobmZhZ3JhbW1hciAqZ3IsIG5vZGUgKm4pCiB7Ci0JbmZhICpuZjsKLQkKLQlSRVEobiwgUlVMRSk7Ci0JUkVRTihuLT5uX25jaGlsZHJlbiwgNCk7Ci0JbiA9IG4tPm5fY2hpbGQ7Ci0JUkVRKG4sIE5BTUUpOwotCW5mID0gYWRkbmZhKGdyLCBuLT5uX3N0cik7Ci0JbisrOwotCVJFUShuLCBDT0xPTik7Ci0JbisrOwotCVJFUShuLCBSSFMpOwotCWNvbXBpbGVfcmhzKCZnci0+Z3JfbGwsIG5mLCBuLCAmbmYtPm5mX3N0YXJ0LCAmbmYtPm5mX2ZpbmlzaCk7Ci0JbisrOwotCVJFUShuLCBORVdMSU5FKTsKKyAgICBuZmEgKm5mOworCisgICAgUkVRKG4sIFJVTEUpOworICAgIFJFUU4obi0+bl9uY2hpbGRyZW4sIDQpOworICAgIG4gPSBuLT5uX2NoaWxkOworICAgIFJFUShuLCBOQU1FKTsKKyAgICBuZiA9IGFkZG5mYShnciwgbi0+bl9zdHIpOworICAgIG4rKzsKKyAgICBSRVEobiwgQ09MT04pOworICAgIG4rKzsKKyAgICBSRVEobiwgUkhTKTsKKyAgICBjb21waWxlX3JocygmZ3ItPmdyX2xsLCBuZiwgbiwgJm5mLT5uZl9zdGFydCwgJm5mLT5uZl9maW5pc2gpOworICAgIG4rKzsKKyAgICBSRVEobiwgTkVXTElORSk7CiB9CiAKIHN0YXRpYyB2b2lkCiBjb21waWxlX3JocyhsYWJlbGxpc3QgKmxsLCBuZmEgKm5mLCBub2RlICpuLCBpbnQgKnBhLCBpbnQgKnBiKQogewotCWludCBpOwotCWludCBhLCBiOwotCQotCVJFUShuLCBSSFMpOwotCWkgPSBuLT5uX25jaGlsZHJlbjsKLQlSRVFOKGksIDEpOwotCW4gPSBuLT5uX2NoaWxkOwotCVJFUShuLCBBTFQpOwotCWNvbXBpbGVfYWx0KGxsLCBuZiwgbiwgcGEsIHBiKTsKLQlpZiAoLS1pIDw9IDApCi0JCXJldHVybjsKLQluKys7Ci0JYSA9ICpwYTsKLQliID0gKnBiOwotCSpwYSA9IGFkZG5mYXN0YXRlKG5mKTsKLQkqcGIgPSBhZGRuZmFzdGF0ZShuZik7Ci0JYWRkbmZhYXJjKG5mLCAqcGEsIGEsIEVNUFRZKTsKLQlhZGRuZmFhcmMobmYsIGIsICpwYiwgRU1QVFkpOwotCWZvciAoOyAtLWkgPj0gMDsgbisrKSB7Ci0JCVJFUShuLCBWQkFSKTsKLQkJUkVRTihpLCAxKTsKLQkJLS1pOwotCQluKys7Ci0JCVJFUShuLCBBTFQpOwotCQljb21waWxlX2FsdChsbCwgbmYsIG4sICZhLCAmYik7Ci0JCWFkZG5mYWFyYyhuZiwgKnBhLCBhLCBFTVBUWSk7Ci0JCWFkZG5mYWFyYyhuZiwgYiwgKnBiLCBFTVBUWSk7Ci0JfQorICAgIGludCBpOworICAgIGludCBhLCBiOworCisgICAgUkVRKG4sIFJIUyk7CisgICAgaSA9IG4tPm5fbmNoaWxkcmVuOworICAgIFJFUU4oaSwgMSk7CisgICAgbiA9IG4tPm5fY2hpbGQ7CisgICAgUkVRKG4sIEFMVCk7CisgICAgY29tcGlsZV9hbHQobGwsIG5mLCBuLCBwYSwgcGIpOworICAgIGlmICgtLWkgPD0gMCkKKyAgICAgICAgcmV0dXJuOworICAgIG4rKzsKKyAgICBhID0gKnBhOworICAgIGIgPSAqcGI7CisgICAgKnBhID0gYWRkbmZhc3RhdGUobmYpOworICAgICpwYiA9IGFkZG5mYXN0YXRlKG5mKTsKKyAgICBhZGRuZmFhcmMobmYsICpwYSwgYSwgRU1QVFkpOworICAgIGFkZG5mYWFyYyhuZiwgYiwgKnBiLCBFTVBUWSk7CisgICAgZm9yICg7IC0taSA+PSAwOyBuKyspIHsKKyAgICAgICAgUkVRKG4sIFZCQVIpOworICAgICAgICBSRVFOKGksIDEpOworICAgICAgICAtLWk7CisgICAgICAgIG4rKzsKKyAgICAgICAgUkVRKG4sIEFMVCk7CisgICAgICAgIGNvbXBpbGVfYWx0KGxsLCBuZiwgbiwgJmEsICZiKTsKKyAgICAgICAgYWRkbmZhYXJjKG5mLCAqcGEsIGEsIEVNUFRZKTsKKyAgICAgICAgYWRkbmZhYXJjKG5mLCBiLCAqcGIsIEVNUFRZKTsKKyAgICB9CiB9CiAKIHN0YXRpYyB2b2lkCiBjb21waWxlX2FsdChsYWJlbGxpc3QgKmxsLCBuZmEgKm5mLCBub2RlICpuLCBpbnQgKnBhLCBpbnQgKnBiKQogewotCWludCBpOwotCWludCBhLCBiOwotCQotCVJFUShuLCBBTFQpOwotCWkgPSBuLT5uX25jaGlsZHJlbjsKLQlSRVFOKGksIDEpOwotCW4gPSBuLT5uX2NoaWxkOwotCVJFUShuLCBJVEVNKTsKLQljb21waWxlX2l0ZW0obGwsIG5mLCBuLCBwYSwgcGIpOwotCS0taTsKLQluKys7Ci0JZm9yICg7IC0taSA+PSAwOyBuKyspIHsKLQkJUkVRKG4sIElURU0pOwotCQljb21waWxlX2l0ZW0obGwsIG5mLCBuLCAmYSwgJmIpOwotCQlhZGRuZmFhcmMobmYsICpwYiwgYSwgRU1QVFkpOwotCQkqcGIgPSBiOwotCX0KKyAgICBpbnQgaTsKKyAgICBpbnQgYSwgYjsKKworICAgIFJFUShuLCBBTFQpOworICAgIGkgPSBuLT5uX25jaGlsZHJlbjsKKyAgICBSRVFOKGksIDEpOworICAgIG4gPSBuLT5uX2NoaWxkOworICAgIFJFUShuLCBJVEVNKTsKKyAgICBjb21waWxlX2l0ZW0obGwsIG5mLCBuLCBwYSwgcGIpOworICAgIC0taTsKKyAgICBuKys7CisgICAgZm9yICg7IC0taSA+PSAwOyBuKyspIHsKKyAgICAgICAgUkVRKG4sIElURU0pOworICAgICAgICBjb21waWxlX2l0ZW0obGwsIG5mLCBuLCAmYSwgJmIpOworICAgICAgICBhZGRuZmFhcmMobmYsICpwYiwgYSwgRU1QVFkpOworICAgICAgICAqcGIgPSBiOworICAgIH0KIH0KIAogc3RhdGljIHZvaWQKIGNvbXBpbGVfaXRlbShsYWJlbGxpc3QgKmxsLCBuZmEgKm5mLCBub2RlICpuLCBpbnQgKnBhLCBpbnQgKnBiKQogewotCWludCBpOwotCWludCBhLCBiOwotCQotCVJFUShuLCBJVEVNKTsKLQlpID0gbi0+bl9uY2hpbGRyZW47Ci0JUkVRTihpLCAxKTsKLQluID0gbi0+bl9jaGlsZDsKLQlpZiAobi0+bl90eXBlID09IExTUUIpIHsKLQkJUkVRTihpLCAzKTsKLQkJbisrOwotCQlSRVEobiwgUkhTKTsKLQkJKnBhID0gYWRkbmZhc3RhdGUobmYpOwotCQkqcGIgPSBhZGRuZmFzdGF0ZShuZik7Ci0JCWFkZG5mYWFyYyhuZiwgKnBhLCAqcGIsIEVNUFRZKTsKLQkJY29tcGlsZV9yaHMobGwsIG5mLCBuLCAmYSwgJmIpOwotCQlhZGRuZmFhcmMobmYsICpwYSwgYSwgRU1QVFkpOwotCQlhZGRuZmFhcmMobmYsIGIsICpwYiwgRU1QVFkpOwotCQlSRVFOKGksIDEpOwotCQluKys7Ci0JCVJFUShuLCBSU1FCKTsKLQl9Ci0JZWxzZSB7Ci0JCWNvbXBpbGVfYXRvbShsbCwgbmYsIG4sIHBhLCBwYik7Ci0JCWlmICgtLWkgPD0gMCkKLQkJCXJldHVybjsKLQkJbisrOwotCQlhZGRuZmFhcmMobmYsICpwYiwgKnBhLCBFTVBUWSk7Ci0JCWlmIChuLT5uX3R5cGUgPT0gU1RBUikKLQkJCSpwYiA9ICpwYTsKLQkJZWxzZQotCQkJUkVRKG4sIFBMVVMpOwotCX0KKyAgICBpbnQgaTsKKyAgICBpbnQgYSwgYjsKKworICAgIFJFUShuLCBJVEVNKTsKKyAgICBpID0gbi0+bl9uY2hpbGRyZW47CisgICAgUkVRTihpLCAxKTsKKyAgICBuID0gbi0+bl9jaGlsZDsKKyAgICBpZiAobi0+bl90eXBlID09IExTUUIpIHsKKyAgICAgICAgUkVRTihpLCAzKTsKKyAgICAgICAgbisrOworICAgICAgICBSRVEobiwgUkhTKTsKKyAgICAgICAgKnBhID0gYWRkbmZhc3RhdGUobmYpOworICAgICAgICAqcGIgPSBhZGRuZmFzdGF0ZShuZik7CisgICAgICAgIGFkZG5mYWFyYyhuZiwgKnBhLCAqcGIsIEVNUFRZKTsKKyAgICAgICAgY29tcGlsZV9yaHMobGwsIG5mLCBuLCAmYSwgJmIpOworICAgICAgICBhZGRuZmFhcmMobmYsICpwYSwgYSwgRU1QVFkpOworICAgICAgICBhZGRuZmFhcmMobmYsIGIsICpwYiwgRU1QVFkpOworICAgICAgICBSRVFOKGksIDEpOworICAgICAgICBuKys7CisgICAgICAgIFJFUShuLCBSU1FCKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGNvbXBpbGVfYXRvbShsbCwgbmYsIG4sIHBhLCBwYik7CisgICAgICAgIGlmICgtLWkgPD0gMCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgbisrOworICAgICAgICBhZGRuZmFhcmMobmYsICpwYiwgKnBhLCBFTVBUWSk7CisgICAgICAgIGlmIChuLT5uX3R5cGUgPT0gU1RBUikKKyAgICAgICAgICAgICpwYiA9ICpwYTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgUkVRKG4sIFBMVVMpOworICAgIH0KIH0KIAogc3RhdGljIHZvaWQKIGNvbXBpbGVfYXRvbShsYWJlbGxpc3QgKmxsLCBuZmEgKm5mLCBub2RlICpuLCBpbnQgKnBhLCBpbnQgKnBiKQogewotCWludCBpOwotCQotCVJFUShuLCBBVE9NKTsKLQlpID0gbi0+bl9uY2hpbGRyZW47Ci0JUkVRTihpLCAxKTsKLQluID0gbi0+bl9jaGlsZDsKLQlpZiAobi0+bl90eXBlID09IExQQVIpIHsKLQkJUkVRTihpLCAzKTsKLQkJbisrOwotCQlSRVEobiwgUkhTKTsKLQkJY29tcGlsZV9yaHMobGwsIG5mLCBuLCBwYSwgcGIpOwotCQluKys7Ci0JCVJFUShuLCBSUEFSKTsKLQl9Ci0JZWxzZSBpZiAobi0+bl90eXBlID09IE5BTUUgfHwgbi0+bl90eXBlID09IFNUUklORykgewotCQkqcGEgPSBhZGRuZmFzdGF0ZShuZik7Ci0JCSpwYiA9IGFkZG5mYXN0YXRlKG5mKTsKLQkJYWRkbmZhYXJjKG5mLCAqcGEsICpwYiwgYWRkbGFiZWwobGwsIG4tPm5fdHlwZSwgbi0+bl9zdHIpKTsKLQl9Ci0JZWxzZQotCQlSRVEobiwgTkFNRSk7CisgICAgaW50IGk7CisKKyAgICBSRVEobiwgQVRPTSk7CisgICAgaSA9IG4tPm5fbmNoaWxkcmVuOworICAgIFJFUU4oaSwgMSk7CisgICAgbiA9IG4tPm5fY2hpbGQ7CisgICAgaWYgKG4tPm5fdHlwZSA9PSBMUEFSKSB7CisgICAgICAgIFJFUU4oaSwgMyk7CisgICAgICAgIG4rKzsKKyAgICAgICAgUkVRKG4sIFJIUyk7CisgICAgICAgIGNvbXBpbGVfcmhzKGxsLCBuZiwgbiwgcGEsIHBiKTsKKyAgICAgICAgbisrOworICAgICAgICBSRVEobiwgUlBBUik7CisgICAgfQorICAgIGVsc2UgaWYgKG4tPm5fdHlwZSA9PSBOQU1FIHx8IG4tPm5fdHlwZSA9PSBTVFJJTkcpIHsKKyAgICAgICAgKnBhID0gYWRkbmZhc3RhdGUobmYpOworICAgICAgICAqcGIgPSBhZGRuZmFzdGF0ZShuZik7CisgICAgICAgIGFkZG5mYWFyYyhuZiwgKnBhLCAqcGIsIGFkZGxhYmVsKGxsLCBuLT5uX3R5cGUsIG4tPm5fc3RyKSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgUkVRKG4sIE5BTUUpOwogfQogCiBzdGF0aWMgdm9pZAogZHVtcHN0YXRlKGxhYmVsbGlzdCAqbGwsIG5mYSAqbmYsIGludCBpc3RhdGUpCiB7Ci0JbmZhc3RhdGUgKnN0OwotCWludCBpOwotCW5mYWFyYyAqYXI7Ci0JCi0JcHJpbnRmKCIlYyUyZCVjIiwKLQkJaXN0YXRlID09IG5mLT5uZl9zdGFydCA/ICcqJyA6ICcgJywKLQkJaXN0YXRlLAotCQlpc3RhdGUgPT0gbmYtPm5mX2ZpbmlzaCA/ICcuJyA6ICcgJyk7Ci0Jc3QgPSAmbmYtPm5mX3N0YXRlW2lzdGF0ZV07Ci0JYXIgPSBzdC0+c3RfYXJjOwotCWZvciAoaSA9IDA7IGkgPCBzdC0+c3RfbmFyY3M7IGkrKykgewotCQlpZiAoaSA+IDApCi0JCQlwcmludGYoIlxuICAgICIpOwotCQlwcmludGYoIi0+ICUyZCAgJXMiLCBhci0+YXJfYXJyb3csCi0JCQlQeUdyYW1tYXJfTGFiZWxSZXByKCZsbC0+bGxfbGFiZWxbYXItPmFyX2xhYmVsXSkpOwotCQlhcisrOwotCX0KLQlwcmludGYoIlxuIik7CisgICAgbmZhc3RhdGUgKnN0OworICAgIGludCBpOworICAgIG5mYWFyYyAqYXI7CisKKyAgICBwcmludGYoIiVjJTJkJWMiLAorICAgICAgICBpc3RhdGUgPT0gbmYtPm5mX3N0YXJ0ID8gJyonIDogJyAnLAorICAgICAgICBpc3RhdGUsCisgICAgICAgIGlzdGF0ZSA9PSBuZi0+bmZfZmluaXNoID8gJy4nIDogJyAnKTsKKyAgICBzdCA9ICZuZi0+bmZfc3RhdGVbaXN0YXRlXTsKKyAgICBhciA9IHN0LT5zdF9hcmM7CisgICAgZm9yIChpID0gMDsgaSA8IHN0LT5zdF9uYXJjczsgaSsrKSB7CisgICAgICAgIGlmIChpID4gMCkKKyAgICAgICAgICAgIHByaW50ZigiXG4gICAgIik7CisgICAgICAgIHByaW50ZigiLT4gJTJkICAlcyIsIGFyLT5hcl9hcnJvdywKKyAgICAgICAgICAgIFB5R3JhbW1hcl9MYWJlbFJlcHIoJmxsLT5sbF9sYWJlbFthci0+YXJfbGFiZWxdKSk7CisgICAgICAgIGFyKys7CisgICAgfQorICAgIHByaW50ZigiXG4iKTsKIH0KIAogc3RhdGljIHZvaWQKIGR1bXBuZmEobGFiZWxsaXN0ICpsbCwgbmZhICpuZikKIHsKLQlpbnQgaTsKLQkKLQlwcmludGYoIk5GQSAnJXMnIGhhcyAlZCBzdGF0ZXM7IHN0YXJ0ICVkLCBmaW5pc2ggJWRcbiIsCi0JCW5mLT5uZl9uYW1lLCBuZi0+bmZfbnN0YXRlcywgbmYtPm5mX3N0YXJ0LCBuZi0+bmZfZmluaXNoKTsKLQlmb3IgKGkgPSAwOyBpIDwgbmYtPm5mX25zdGF0ZXM7IGkrKykKLQkJZHVtcHN0YXRlKGxsLCBuZiwgaSk7CisgICAgaW50IGk7CisKKyAgICBwcmludGYoIk5GQSAnJXMnIGhhcyAlZCBzdGF0ZXM7IHN0YXJ0ICVkLCBmaW5pc2ggJWRcbiIsCisgICAgICAgIG5mLT5uZl9uYW1lLCBuZi0+bmZfbnN0YXRlcywgbmYtPm5mX3N0YXJ0LCBuZi0+bmZfZmluaXNoKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbmYtPm5mX25zdGF0ZXM7IGkrKykKKyAgICAgICAgZHVtcHN0YXRlKGxsLCBuZiwgaSk7CiB9CiAKIApAQCAtMzQyLDE4NCArMzQyLDE4NCBAQAogc3RhdGljIHZvaWQKIGFkZGNsb3N1cmUoYml0c2V0IHNzLCBuZmEgKm5mLCBpbnQgaXN0YXRlKQogewotCWlmIChhZGRiaXQoc3MsIGlzdGF0ZSkpIHsKLQkJbmZhc3RhdGUgKnN0ID0gJm5mLT5uZl9zdGF0ZVtpc3RhdGVdOwotCQluZmFhcmMgKmFyID0gc3QtPnN0X2FyYzsKLQkJaW50IGk7Ci0JCQotCQlmb3IgKGkgPSBzdC0+c3RfbmFyY3M7IC0taSA+PSAwOyApIHsKLQkJCWlmIChhci0+YXJfbGFiZWwgPT0gRU1QVFkpCi0JCQkJYWRkY2xvc3VyZShzcywgbmYsIGFyLT5hcl9hcnJvdyk7Ci0JCQlhcisrOwotCQl9Ci0JfQorICAgIGlmIChhZGRiaXQoc3MsIGlzdGF0ZSkpIHsKKyAgICAgICAgbmZhc3RhdGUgKnN0ID0gJm5mLT5uZl9zdGF0ZVtpc3RhdGVdOworICAgICAgICBuZmFhcmMgKmFyID0gc3QtPnN0X2FyYzsKKyAgICAgICAgaW50IGk7CisKKyAgICAgICAgZm9yIChpID0gc3QtPnN0X25hcmNzOyAtLWkgPj0gMDsgKSB7CisgICAgICAgICAgICBpZiAoYXItPmFyX2xhYmVsID09IEVNUFRZKQorICAgICAgICAgICAgICAgIGFkZGNsb3N1cmUoc3MsIG5mLCBhci0+YXJfYXJyb3cpOworICAgICAgICAgICAgYXIrKzsKKyAgICAgICAgfQorICAgIH0KIH0KIAogdHlwZWRlZiBzdHJ1Y3QgX3NzX2FyYyB7Ci0JYml0c2V0CXNhX2JpdHNldDsKLQlpbnQJc2FfYXJyb3c7Ci0JaW50CXNhX2xhYmVsOworICAgIGJpdHNldCAgICAgIHNhX2JpdHNldDsKKyAgICBpbnQgICAgICAgICBzYV9hcnJvdzsKKyAgICBpbnQgICAgICAgICBzYV9sYWJlbDsKIH0gc3NfYXJjOwogCiB0eXBlZGVmIHN0cnVjdCBfc3Nfc3RhdGUgewotCWJpdHNldAlzc19zczsKLQlpbnQJc3NfbmFyY3M7Ci0Jc3RydWN0IF9zc19hcmMJKnNzX2FyYzsKLQlpbnQJc3NfZGVsZXRlZDsKLQlpbnQJc3NfZmluaXNoOwotCWludAlzc19yZW5hbWU7CisgICAgYml0c2V0ICAgICAgc3Nfc3M7CisgICAgaW50ICAgICAgICAgc3NfbmFyY3M7CisgICAgc3RydWN0IF9zc19hcmMgICAgICAqc3NfYXJjOworICAgIGludCAgICAgICAgIHNzX2RlbGV0ZWQ7CisgICAgaW50ICAgICAgICAgc3NfZmluaXNoOworICAgIGludCAgICAgICAgIHNzX3JlbmFtZTsKIH0gc3Nfc3RhdGU7CiAKIHR5cGVkZWYgc3RydWN0IF9zc19kZmEgewotCWludAlzZF9uc3RhdGVzOwotCXNzX3N0YXRlICpzZF9zdGF0ZTsKKyAgICBpbnQgICAgICAgICBzZF9uc3RhdGVzOworICAgIHNzX3N0YXRlICpzZF9zdGF0ZTsKIH0gc3NfZGZhOwogCiAvKiBGb3J3YXJkICovCiBzdGF0aWMgdm9pZCBwcmludHNzZGZhKGludCB4eF9uc3RhdGVzLCBzc19zdGF0ZSAqeHhfc3RhdGUsIGludCBuYml0cywKLQkJICAgICAgIGxhYmVsbGlzdCAqbGwsIGNoYXIgKm1zZyk7CisgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsbGlzdCAqbGwsIGNoYXIgKm1zZyk7CiBzdGF0aWMgdm9pZCBzaW1wbGlmeShpbnQgeHhfbnN0YXRlcywgc3Nfc3RhdGUgKnh4X3N0YXRlKTsKIHN0YXRpYyB2b2lkIGNvbnZlcnQoZGZhICpkLCBpbnQgeHhfbnN0YXRlcywgc3Nfc3RhdGUgKnh4X3N0YXRlKTsKIAogc3RhdGljIHZvaWQKIG1ha2VkZmEobmZhZ3JhbW1hciAqZ3IsIG5mYSAqbmYsIGRmYSAqZCkKIHsKLQlpbnQgbmJpdHMgPSBuZi0+bmZfbnN0YXRlczsKLQliaXRzZXQgc3M7Ci0JaW50IHh4X25zdGF0ZXM7Ci0Jc3Nfc3RhdGUgKnh4X3N0YXRlLCAqeXk7Ci0Jc3NfYXJjICp6ejsKLQlpbnQgaXN0YXRlLCBqc3RhdGUsIGlhcmMsIGphcmMsIGliaXQ7Ci0JbmZhc3RhdGUgKnN0OwotCW5mYWFyYyAqYXI7Ci0JCi0Jc3MgPSBuZXdiaXRzZXQobmJpdHMpOwotCWFkZGNsb3N1cmUoc3MsIG5mLCBuZi0+bmZfc3RhcnQpOwotCXh4X3N0YXRlID0gKHNzX3N0YXRlICopUHlPYmplY3RfTUFMTE9DKHNpemVvZihzc19zdGF0ZSkpOwotCWlmICh4eF9zdGF0ZSA9PSBOVUxMKQotCQlQeV9GYXRhbEVycm9yKCJubyBtZW0gZm9yIHh4X3N0YXRlIGluIG1ha2VkZmEiKTsKLQl4eF9uc3RhdGVzID0gMTsKLQl5eSA9ICZ4eF9zdGF0ZVswXTsKLQl5eS0+c3Nfc3MgPSBzczsKLQl5eS0+c3NfbmFyY3MgPSAwOwotCXl5LT5zc19hcmMgPSBOVUxMOwotCXl5LT5zc19kZWxldGVkID0gMDsKLQl5eS0+c3NfZmluaXNoID0gdGVzdGJpdChzcywgbmYtPm5mX2ZpbmlzaCk7Ci0JaWYgKHl5LT5zc19maW5pc2gpCi0JCXByaW50ZigiRXJyb3I6IG5vbnRlcm1pbmFsICclcycgbWF5IHByb2R1Y2UgZW1wdHkuXG4iLAotCQkJbmYtPm5mX25hbWUpOwotCQotCS8qIFRoaXMgYWxnb3JpdGhtIGlzIGZyb20gYSBib29rIHdyaXR0ZW4gYmVmb3JlCi0JICAgdGhlIGludmVudGlvbiBvZiBzdHJ1Y3R1cmVkIHByb2dyYW1taW5nLi4uICovCisgICAgaW50IG5iaXRzID0gbmYtPm5mX25zdGF0ZXM7CisgICAgYml0c2V0IHNzOworICAgIGludCB4eF9uc3RhdGVzOworICAgIHNzX3N0YXRlICp4eF9zdGF0ZSwgKnl5OworICAgIHNzX2FyYyAqeno7CisgICAgaW50IGlzdGF0ZSwganN0YXRlLCBpYXJjLCBqYXJjLCBpYml0OworICAgIG5mYXN0YXRlICpzdDsKKyAgICBuZmFhcmMgKmFyOwogCi0JLyogRm9yIGVhY2ggdW5tYXJrZWQgc3RhdGUuLi4gKi8KLQlmb3IgKGlzdGF0ZSA9IDA7IGlzdGF0ZSA8IHh4X25zdGF0ZXM7ICsraXN0YXRlKSB7Ci0JCXNpemVfdCBzaXplOwotCQl5eSA9ICZ4eF9zdGF0ZVtpc3RhdGVdOwotCQlzcyA9IHl5LT5zc19zczsKLQkJLyogRm9yIGFsbCBpdHMgc3RhdGVzLi4uICovCi0JCWZvciAoaWJpdCA9IDA7IGliaXQgPCBuZi0+bmZfbnN0YXRlczsgKytpYml0KSB7Ci0JCQlpZiAoIXRlc3RiaXQoc3MsIGliaXQpKQotCQkJCWNvbnRpbnVlOwotCQkJc3QgPSAmbmYtPm5mX3N0YXRlW2liaXRdOwotCQkJLyogRm9yIGFsbCBub24tZW1wdHkgYXJjcyBmcm9tIHRoaXMgc3RhdGUuLi4gKi8KLQkJCWZvciAoaWFyYyA9IDA7IGlhcmMgPCBzdC0+c3RfbmFyY3M7IGlhcmMrKykgewotCQkJCWFyID0gJnN0LT5zdF9hcmNbaWFyY107Ci0JCQkJaWYgKGFyLT5hcl9sYWJlbCA9PSBFTVBUWSkKLQkJCQkJY29udGludWU7Ci0JCQkJLyogTG9vayB1cCBpbiBsaXN0IG9mIGFyY3MgZnJvbSB0aGlzIHN0YXRlICovCi0JCQkJZm9yIChqYXJjID0gMDsgamFyYyA8IHl5LT5zc19uYXJjczsgKytqYXJjKSB7Ci0JCQkJCXp6ID0gJnl5LT5zc19hcmNbamFyY107Ci0JCQkJCWlmIChhci0+YXJfbGFiZWwgPT0genotPnNhX2xhYmVsKQotCQkJCQkJZ290byBmb3VuZDsKLQkJCQl9Ci0JCQkJLyogQWRkIG5ldyBhcmMgZm9yIHRoaXMgc3RhdGUgKi8KLQkJCQlzaXplID0gc2l6ZW9mKHNzX2FyYykgKiAoeXktPnNzX25hcmNzICsgMSk7Ci0JCQkJeXktPnNzX2FyYyA9IChzc19hcmMgKilQeU9iamVjdF9SRUFMTE9DKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXktPnNzX2FyYywgc2l6ZSk7Ci0JCQkJaWYgKHl5LT5zc19hcmMgPT0gTlVMTCkKLQkJCQkJUHlfRmF0YWxFcnJvcigib3V0IG9mIG1lbSIpOwotCQkJCXp6ID0gJnl5LT5zc19hcmNbeXktPnNzX25hcmNzKytdOwotCQkJCXp6LT5zYV9sYWJlbCA9IGFyLT5hcl9sYWJlbDsKLQkJCQl6ei0+c2FfYml0c2V0ID0gbmV3Yml0c2V0KG5iaXRzKTsKLQkJCQl6ei0+c2FfYXJyb3cgPSAtMTsKLQkJCSBmb3VuZDoJOwotCQkJCS8qIEFkZCBkZXN0aW5hdGlvbiAqLwotCQkJCWFkZGNsb3N1cmUoenotPnNhX2JpdHNldCwgbmYsIGFyLT5hcl9hcnJvdyk7Ci0JCQl9Ci0JCX0KLQkJLyogTm93IGxvb2sgdXAgYWxsIHRoZSBhcnJvdyBzdGF0ZXMgKi8KLQkJZm9yIChqYXJjID0gMDsgamFyYyA8IHh4X3N0YXRlW2lzdGF0ZV0uc3NfbmFyY3M7IGphcmMrKykgewotCQkJenogPSAmeHhfc3RhdGVbaXN0YXRlXS5zc19hcmNbamFyY107Ci0JCQlmb3IgKGpzdGF0ZSA9IDA7IGpzdGF0ZSA8IHh4X25zdGF0ZXM7IGpzdGF0ZSsrKSB7Ci0JCQkJaWYgKHNhbWViaXRzZXQoenotPnNhX2JpdHNldCwKLQkJCQkJeHhfc3RhdGVbanN0YXRlXS5zc19zcywgbmJpdHMpKSB7Ci0JCQkJCXp6LT5zYV9hcnJvdyA9IGpzdGF0ZTsKLQkJCQkJZ290byBkb25lOwotCQkJCX0KLQkJCX0KLQkJCXNpemUgPSBzaXplb2Yoc3Nfc3RhdGUpICogKHh4X25zdGF0ZXMgKyAxKTsKLQkJCXh4X3N0YXRlID0gKHNzX3N0YXRlICopUHlPYmplY3RfUkVBTExPQyh4eF9zdGF0ZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUpOwotCQkJaWYgKHh4X3N0YXRlID09IE5VTEwpCi0JCQkJUHlfRmF0YWxFcnJvcigib3V0IG9mIG1lbSIpOwotCQkJenotPnNhX2Fycm93ID0geHhfbnN0YXRlczsKLQkJCXl5ID0gJnh4X3N0YXRlW3h4X25zdGF0ZXMrK107Ci0JCQl5eS0+c3Nfc3MgPSB6ei0+c2FfYml0c2V0OwotCQkJeXktPnNzX25hcmNzID0gMDsKLQkJCXl5LT5zc19hcmMgPSBOVUxMOwotCQkJeXktPnNzX2RlbGV0ZWQgPSAwOwotCQkJeXktPnNzX2ZpbmlzaCA9IHRlc3RiaXQoeXktPnNzX3NzLCBuZi0+bmZfZmluaXNoKTsKLQkJIGRvbmU6CTsKLQkJfQotCX0KLQkKLQlpZiAoUHlfRGVidWdGbGFnKQotCQlwcmludHNzZGZhKHh4X25zdGF0ZXMsIHh4X3N0YXRlLCBuYml0cywgJmdyLT5ncl9sbCwKLQkJCQkJCSJiZWZvcmUgbWluaW1pemluZyIpOwotCQotCXNpbXBsaWZ5KHh4X25zdGF0ZXMsIHh4X3N0YXRlKTsKLQkKLQlpZiAoUHlfRGVidWdGbGFnKQotCQlwcmludHNzZGZhKHh4X25zdGF0ZXMsIHh4X3N0YXRlLCBuYml0cywgJmdyLT5ncl9sbCwKLQkJCQkJCSJhZnRlciBtaW5pbWl6aW5nIik7Ci0JCi0JY29udmVydChkLCB4eF9uc3RhdGVzLCB4eF9zdGF0ZSk7Ci0JCi0JLyogWFhYIGNsZWFudXAgKi8KLQlQeU9iamVjdF9GUkVFKHh4X3N0YXRlKTsKKyAgICBzcyA9IG5ld2JpdHNldChuYml0cyk7CisgICAgYWRkY2xvc3VyZShzcywgbmYsIG5mLT5uZl9zdGFydCk7CisgICAgeHhfc3RhdGUgPSAoc3Nfc3RhdGUgKilQeU9iamVjdF9NQUxMT0Moc2l6ZW9mKHNzX3N0YXRlKSk7CisgICAgaWYgKHh4X3N0YXRlID09IE5VTEwpCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIm5vIG1lbSBmb3IgeHhfc3RhdGUgaW4gbWFrZWRmYSIpOworICAgIHh4X25zdGF0ZXMgPSAxOworICAgIHl5ID0gJnh4X3N0YXRlWzBdOworICAgIHl5LT5zc19zcyA9IHNzOworICAgIHl5LT5zc19uYXJjcyA9IDA7CisgICAgeXktPnNzX2FyYyA9IE5VTEw7CisgICAgeXktPnNzX2RlbGV0ZWQgPSAwOworICAgIHl5LT5zc19maW5pc2ggPSB0ZXN0Yml0KHNzLCBuZi0+bmZfZmluaXNoKTsKKyAgICBpZiAoeXktPnNzX2ZpbmlzaCkKKyAgICAgICAgcHJpbnRmKCJFcnJvcjogbm9udGVybWluYWwgJyVzJyBtYXkgcHJvZHVjZSBlbXB0eS5cbiIsCisgICAgICAgICAgICBuZi0+bmZfbmFtZSk7CisKKyAgICAvKiBUaGlzIGFsZ29yaXRobSBpcyBmcm9tIGEgYm9vayB3cml0dGVuIGJlZm9yZQorICAgICAgIHRoZSBpbnZlbnRpb24gb2Ygc3RydWN0dXJlZCBwcm9ncmFtbWluZy4uLiAqLworCisgICAgLyogRm9yIGVhY2ggdW5tYXJrZWQgc3RhdGUuLi4gKi8KKyAgICBmb3IgKGlzdGF0ZSA9IDA7IGlzdGF0ZSA8IHh4X25zdGF0ZXM7ICsraXN0YXRlKSB7CisgICAgICAgIHNpemVfdCBzaXplOworICAgICAgICB5eSA9ICZ4eF9zdGF0ZVtpc3RhdGVdOworICAgICAgICBzcyA9IHl5LT5zc19zczsKKyAgICAgICAgLyogRm9yIGFsbCBpdHMgc3RhdGVzLi4uICovCisgICAgICAgIGZvciAoaWJpdCA9IDA7IGliaXQgPCBuZi0+bmZfbnN0YXRlczsgKytpYml0KSB7CisgICAgICAgICAgICBpZiAoIXRlc3RiaXQoc3MsIGliaXQpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgc3QgPSAmbmYtPm5mX3N0YXRlW2liaXRdOworICAgICAgICAgICAgLyogRm9yIGFsbCBub24tZW1wdHkgYXJjcyBmcm9tIHRoaXMgc3RhdGUuLi4gKi8KKyAgICAgICAgICAgIGZvciAoaWFyYyA9IDA7IGlhcmMgPCBzdC0+c3RfbmFyY3M7IGlhcmMrKykgeworICAgICAgICAgICAgICAgIGFyID0gJnN0LT5zdF9hcmNbaWFyY107CisgICAgICAgICAgICAgICAgaWYgKGFyLT5hcl9sYWJlbCA9PSBFTVBUWSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgLyogTG9vayB1cCBpbiBsaXN0IG9mIGFyY3MgZnJvbSB0aGlzIHN0YXRlICovCisgICAgICAgICAgICAgICAgZm9yIChqYXJjID0gMDsgamFyYyA8IHl5LT5zc19uYXJjczsgKytqYXJjKSB7CisgICAgICAgICAgICAgICAgICAgIHp6ID0gJnl5LT5zc19hcmNbamFyY107CisgICAgICAgICAgICAgICAgICAgIGlmIChhci0+YXJfbGFiZWwgPT0genotPnNhX2xhYmVsKQorICAgICAgICAgICAgICAgICAgICAgICAgZ290byBmb3VuZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLyogQWRkIG5ldyBhcmMgZm9yIHRoaXMgc3RhdGUgKi8KKyAgICAgICAgICAgICAgICBzaXplID0gc2l6ZW9mKHNzX2FyYykgKiAoeXktPnNzX25hcmNzICsgMSk7CisgICAgICAgICAgICAgICAgeXktPnNzX2FyYyA9IChzc19hcmMgKilQeU9iamVjdF9SRUFMTE9DKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5eS0+c3NfYXJjLCBzaXplKTsKKyAgICAgICAgICAgICAgICBpZiAoeXktPnNzX2FyYyA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICBQeV9GYXRhbEVycm9yKCJvdXQgb2YgbWVtIik7CisgICAgICAgICAgICAgICAgenogPSAmeXktPnNzX2FyY1t5eS0+c3NfbmFyY3MrK107CisgICAgICAgICAgICAgICAgenotPnNhX2xhYmVsID0gYXItPmFyX2xhYmVsOworICAgICAgICAgICAgICAgIHp6LT5zYV9iaXRzZXQgPSBuZXdiaXRzZXQobmJpdHMpOworICAgICAgICAgICAgICAgIHp6LT5zYV9hcnJvdyA9IC0xOworICAgICAgICAgICAgIGZvdW5kOiAgICAgICAgICAgICA7CisgICAgICAgICAgICAgICAgLyogQWRkIGRlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgYWRkY2xvc3VyZSh6ei0+c2FfYml0c2V0LCBuZiwgYXItPmFyX2Fycm93KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiBOb3cgbG9vayB1cCBhbGwgdGhlIGFycm93IHN0YXRlcyAqLworICAgICAgICBmb3IgKGphcmMgPSAwOyBqYXJjIDwgeHhfc3RhdGVbaXN0YXRlXS5zc19uYXJjczsgamFyYysrKSB7CisgICAgICAgICAgICB6eiA9ICZ4eF9zdGF0ZVtpc3RhdGVdLnNzX2FyY1tqYXJjXTsKKyAgICAgICAgICAgIGZvciAoanN0YXRlID0gMDsganN0YXRlIDwgeHhfbnN0YXRlczsganN0YXRlKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoc2FtZWJpdHNldCh6ei0+c2FfYml0c2V0LAorICAgICAgICAgICAgICAgICAgICB4eF9zdGF0ZVtqc3RhdGVdLnNzX3NzLCBuYml0cykpIHsKKyAgICAgICAgICAgICAgICAgICAgenotPnNhX2Fycm93ID0ganN0YXRlOworICAgICAgICAgICAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc2l6ZSA9IHNpemVvZihzc19zdGF0ZSkgKiAoeHhfbnN0YXRlcyArIDEpOworICAgICAgICAgICAgeHhfc3RhdGUgPSAoc3Nfc3RhdGUgKilQeU9iamVjdF9SRUFMTE9DKHh4X3N0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplKTsKKyAgICAgICAgICAgIGlmICh4eF9zdGF0ZSA9PSBOVUxMKQorICAgICAgICAgICAgICAgIFB5X0ZhdGFsRXJyb3IoIm91dCBvZiBtZW0iKTsKKyAgICAgICAgICAgIHp6LT5zYV9hcnJvdyA9IHh4X25zdGF0ZXM7CisgICAgICAgICAgICB5eSA9ICZ4eF9zdGF0ZVt4eF9uc3RhdGVzKytdOworICAgICAgICAgICAgeXktPnNzX3NzID0genotPnNhX2JpdHNldDsKKyAgICAgICAgICAgIHl5LT5zc19uYXJjcyA9IDA7CisgICAgICAgICAgICB5eS0+c3NfYXJjID0gTlVMTDsKKyAgICAgICAgICAgIHl5LT5zc19kZWxldGVkID0gMDsKKyAgICAgICAgICAgIHl5LT5zc19maW5pc2ggPSB0ZXN0Yml0KHl5LT5zc19zcywgbmYtPm5mX2ZpbmlzaCk7CisgICAgICAgICBkb25lOiAgICAgICAgICA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoUHlfRGVidWdGbGFnKQorICAgICAgICBwcmludHNzZGZhKHh4X25zdGF0ZXMsIHh4X3N0YXRlLCBuYml0cywgJmdyLT5ncl9sbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmVmb3JlIG1pbmltaXppbmciKTsKKworICAgIHNpbXBsaWZ5KHh4X25zdGF0ZXMsIHh4X3N0YXRlKTsKKworICAgIGlmIChQeV9EZWJ1Z0ZsYWcpCisgICAgICAgIHByaW50c3NkZmEoeHhfbnN0YXRlcywgeHhfc3RhdGUsIG5iaXRzLCAmZ3ItPmdyX2xsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZnRlciBtaW5pbWl6aW5nIik7CisKKyAgICBjb252ZXJ0KGQsIHh4X25zdGF0ZXMsIHh4X3N0YXRlKTsKKworICAgIC8qIFhYWCBjbGVhbnVwICovCisgICAgUHlPYmplY3RfRlJFRSh4eF9zdGF0ZSk7CiB9CiAKIHN0YXRpYyB2b2lkCiBwcmludHNzZGZhKGludCB4eF9uc3RhdGVzLCBzc19zdGF0ZSAqeHhfc3RhdGUsIGludCBuYml0cywKLQkgICBsYWJlbGxpc3QgKmxsLCBjaGFyICptc2cpCisgICAgICAgICAgIGxhYmVsbGlzdCAqbGwsIGNoYXIgKm1zZykKIHsKLQlpbnQgaSwgaWJpdCwgaWFyYzsKLQlzc19zdGF0ZSAqeXk7Ci0Jc3NfYXJjICp6ejsKLQkKLQlwcmludGYoIlN1YnNldCBERkEgJXNcbiIsIG1zZyk7Ci0JZm9yIChpID0gMDsgaSA8IHh4X25zdGF0ZXM7IGkrKykgewotCQl5eSA9ICZ4eF9zdGF0ZVtpXTsKLQkJaWYgKHl5LT5zc19kZWxldGVkKQotCQkJY29udGludWU7Ci0JCXByaW50ZigiIFN1YnNldCAlZCIsIGkpOwotCQlpZiAoeXktPnNzX2ZpbmlzaCkKLQkJCXByaW50ZigiIChmaW5pc2gpIik7Ci0JCXByaW50ZigiIHsgIik7Ci0JCWZvciAoaWJpdCA9IDA7IGliaXQgPCBuYml0czsgaWJpdCsrKSB7Ci0JCQlpZiAodGVzdGJpdCh5eS0+c3Nfc3MsIGliaXQpKQotCQkJCXByaW50ZigiJWQgIiwgaWJpdCk7Ci0JCX0KLQkJcHJpbnRmKCJ9XG4iKTsKLQkJZm9yIChpYXJjID0gMDsgaWFyYyA8IHl5LT5zc19uYXJjczsgaWFyYysrKSB7Ci0JCQl6eiA9ICZ5eS0+c3NfYXJjW2lhcmNdOwotCQkJcHJpbnRmKCIgIEFyYyB0byBzdGF0ZSAlZCwgbGFiZWwgJXNcbiIsCi0JCQkJenotPnNhX2Fycm93LAotCQkJCVB5R3JhbW1hcl9MYWJlbFJlcHIoCi0JCQkJCSZsbC0+bGxfbGFiZWxbenotPnNhX2xhYmVsXSkpOwotCQl9Ci0JfQorICAgIGludCBpLCBpYml0LCBpYXJjOworICAgIHNzX3N0YXRlICp5eTsKKyAgICBzc19hcmMgKnp6OworCisgICAgcHJpbnRmKCJTdWJzZXQgREZBICVzXG4iLCBtc2cpOworICAgIGZvciAoaSA9IDA7IGkgPCB4eF9uc3RhdGVzOyBpKyspIHsKKyAgICAgICAgeXkgPSAmeHhfc3RhdGVbaV07CisgICAgICAgIGlmICh5eS0+c3NfZGVsZXRlZCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBwcmludGYoIiBTdWJzZXQgJWQiLCBpKTsKKyAgICAgICAgaWYgKHl5LT5zc19maW5pc2gpCisgICAgICAgICAgICBwcmludGYoIiAoZmluaXNoKSIpOworICAgICAgICBwcmludGYoIiB7ICIpOworICAgICAgICBmb3IgKGliaXQgPSAwOyBpYml0IDwgbmJpdHM7IGliaXQrKykgeworICAgICAgICAgICAgaWYgKHRlc3RiaXQoeXktPnNzX3NzLCBpYml0KSkKKyAgICAgICAgICAgICAgICBwcmludGYoIiVkICIsIGliaXQpOworICAgICAgICB9CisgICAgICAgIHByaW50ZigifVxuIik7CisgICAgICAgIGZvciAoaWFyYyA9IDA7IGlhcmMgPCB5eS0+c3NfbmFyY3M7IGlhcmMrKykgeworICAgICAgICAgICAgenogPSAmeXktPnNzX2FyY1tpYXJjXTsKKyAgICAgICAgICAgIHByaW50ZigiICBBcmMgdG8gc3RhdGUgJWQsIGxhYmVsICVzXG4iLAorICAgICAgICAgICAgICAgIHp6LT5zYV9hcnJvdywKKyAgICAgICAgICAgICAgICBQeUdyYW1tYXJfTGFiZWxSZXByKAorICAgICAgICAgICAgICAgICAgICAmbGwtPmxsX2xhYmVsW3p6LT5zYV9sYWJlbF0pKTsKKyAgICAgICAgfQorICAgIH0KIH0KIAogCkBAIC01MzUsNTkgKzUzNSw1OSBAQAogc3RhdGljIGludAogc2FtZXN0YXRlKHNzX3N0YXRlICpzMSwgc3Nfc3RhdGUgKnMyKQogewotCWludCBpOwotCQotCWlmIChzMS0+c3NfbmFyY3MgIT0gczItPnNzX25hcmNzIHx8IHMxLT5zc19maW5pc2ggIT0gczItPnNzX2ZpbmlzaCkKLQkJcmV0dXJuIDA7Ci0JZm9yIChpID0gMDsgaSA8IHMxLT5zc19uYXJjczsgaSsrKSB7Ci0JCWlmIChzMS0+c3NfYXJjW2ldLnNhX2Fycm93ICE9IHMyLT5zc19hcmNbaV0uc2FfYXJyb3cgfHwKLQkJCXMxLT5zc19hcmNbaV0uc2FfbGFiZWwgIT0gczItPnNzX2FyY1tpXS5zYV9sYWJlbCkKLQkJCXJldHVybiAwOwotCX0KLQlyZXR1cm4gMTsKKyAgICBpbnQgaTsKKworICAgIGlmIChzMS0+c3NfbmFyY3MgIT0gczItPnNzX25hcmNzIHx8IHMxLT5zc19maW5pc2ggIT0gczItPnNzX2ZpbmlzaCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgZm9yIChpID0gMDsgaSA8IHMxLT5zc19uYXJjczsgaSsrKSB7CisgICAgICAgIGlmIChzMS0+c3NfYXJjW2ldLnNhX2Fycm93ICE9IHMyLT5zc19hcmNbaV0uc2FfYXJyb3cgfHwKKyAgICAgICAgICAgIHMxLT5zc19hcmNbaV0uc2FfbGFiZWwgIT0gczItPnNzX2FyY1tpXS5zYV9sYWJlbCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIHZvaWQKIHJlbmFtZXN0YXRlcyhpbnQgeHhfbnN0YXRlcywgc3Nfc3RhdGUgKnh4X3N0YXRlLCBpbnQgZnJvbSwgaW50IHRvKQogewotCWludCBpLCBqOwotCQotCWlmIChQeV9EZWJ1Z0ZsYWcpCi0JCXByaW50ZigiUmVuYW1lIHN0YXRlICVkIHRvICVkLlxuIiwgZnJvbSwgdG8pOwotCWZvciAoaSA9IDA7IGkgPCB4eF9uc3RhdGVzOyBpKyspIHsKLQkJaWYgKHh4X3N0YXRlW2ldLnNzX2RlbGV0ZWQpCi0JCQljb250aW51ZTsKLQkJZm9yIChqID0gMDsgaiA8IHh4X3N0YXRlW2ldLnNzX25hcmNzOyBqKyspIHsKLQkJCWlmICh4eF9zdGF0ZVtpXS5zc19hcmNbal0uc2FfYXJyb3cgPT0gZnJvbSkKLQkJCQl4eF9zdGF0ZVtpXS5zc19hcmNbal0uc2FfYXJyb3cgPSB0bzsKLQkJfQotCX0KKyAgICBpbnQgaSwgajsKKworICAgIGlmIChQeV9EZWJ1Z0ZsYWcpCisgICAgICAgIHByaW50ZigiUmVuYW1lIHN0YXRlICVkIHRvICVkLlxuIiwgZnJvbSwgdG8pOworICAgIGZvciAoaSA9IDA7IGkgPCB4eF9uc3RhdGVzOyBpKyspIHsKKyAgICAgICAgaWYgKHh4X3N0YXRlW2ldLnNzX2RlbGV0ZWQpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IHh4X3N0YXRlW2ldLnNzX25hcmNzOyBqKyspIHsKKyAgICAgICAgICAgIGlmICh4eF9zdGF0ZVtpXS5zc19hcmNbal0uc2FfYXJyb3cgPT0gZnJvbSkKKyAgICAgICAgICAgICAgICB4eF9zdGF0ZVtpXS5zc19hcmNbal0uc2FfYXJyb3cgPSB0bzsKKyAgICAgICAgfQorICAgIH0KIH0KIAogc3RhdGljIHZvaWQKIHNpbXBsaWZ5KGludCB4eF9uc3RhdGVzLCBzc19zdGF0ZSAqeHhfc3RhdGUpCiB7Ci0JaW50IGNoYW5nZXM7Ci0JaW50IGksIGo7Ci0JCi0JZG8gewotCQljaGFuZ2VzID0gMDsKLQkJZm9yIChpID0gMTsgaSA8IHh4X25zdGF0ZXM7IGkrKykgewotCQkJaWYgKHh4X3N0YXRlW2ldLnNzX2RlbGV0ZWQpCi0JCQkJY29udGludWU7Ci0JCQlmb3IgKGogPSAwOyBqIDwgaTsgaisrKSB7Ci0JCQkJaWYgKHh4X3N0YXRlW2pdLnNzX2RlbGV0ZWQpCi0JCQkJCWNvbnRpbnVlOwotCQkJCWlmIChzYW1lc3RhdGUoJnh4X3N0YXRlW2ldLCAmeHhfc3RhdGVbal0pKSB7Ci0JCQkJCXh4X3N0YXRlW2ldLnNzX2RlbGV0ZWQrKzsKLQkJCQkJcmVuYW1lc3RhdGVzKHh4X25zdGF0ZXMsIHh4X3N0YXRlLAotCQkJCQkJICAgICBpLCBqKTsKLQkJCQkJY2hhbmdlcysrOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9IHdoaWxlIChjaGFuZ2VzKTsKKyAgICBpbnQgY2hhbmdlczsKKyAgICBpbnQgaSwgajsKKworICAgIGRvIHsKKyAgICAgICAgY2hhbmdlcyA9IDA7CisgICAgICAgIGZvciAoaSA9IDE7IGkgPCB4eF9uc3RhdGVzOyBpKyspIHsKKyAgICAgICAgICAgIGlmICh4eF9zdGF0ZVtpXS5zc19kZWxldGVkKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGk7IGorKykgeworICAgICAgICAgICAgICAgIGlmICh4eF9zdGF0ZVtqXS5zc19kZWxldGVkKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBpZiAoc2FtZXN0YXRlKCZ4eF9zdGF0ZVtpXSwgJnh4X3N0YXRlW2pdKSkgeworICAgICAgICAgICAgICAgICAgICB4eF9zdGF0ZVtpXS5zc19kZWxldGVkKys7CisgICAgICAgICAgICAgICAgICAgIHJlbmFtZXN0YXRlcyh4eF9uc3RhdGVzLCB4eF9zdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIGopOworICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzKys7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gd2hpbGUgKGNoYW5nZXMpOwogfQogCiAKQEAgLTU5OCwzMiArNTk4LDMyIEBACiBzdGF0aWMgdm9pZAogY29udmVydChkZmEgKmQsIGludCB4eF9uc3RhdGVzLCBzc19zdGF0ZSAqeHhfc3RhdGUpCiB7Ci0JaW50IGksIGo7Ci0Jc3Nfc3RhdGUgKnl5OwotCXNzX2FyYyAqeno7Ci0JCi0JZm9yIChpID0gMDsgaSA8IHh4X25zdGF0ZXM7IGkrKykgewotCQl5eSA9ICZ4eF9zdGF0ZVtpXTsKLQkJaWYgKHl5LT5zc19kZWxldGVkKQotCQkJY29udGludWU7Ci0JCXl5LT5zc19yZW5hbWUgPSBhZGRzdGF0ZShkKTsKLQl9Ci0JCi0JZm9yIChpID0gMDsgaSA8IHh4X25zdGF0ZXM7IGkrKykgewotCQl5eSA9ICZ4eF9zdGF0ZVtpXTsKLQkJaWYgKHl5LT5zc19kZWxldGVkKQotCQkJY29udGludWU7Ci0JCWZvciAoaiA9IDA7IGogPCB5eS0+c3NfbmFyY3M7IGorKykgewotCQkJenogPSAmeXktPnNzX2FyY1tqXTsKLQkJCWFkZGFyYyhkLCB5eS0+c3NfcmVuYW1lLAotCQkJCXh4X3N0YXRlW3p6LT5zYV9hcnJvd10uc3NfcmVuYW1lLAotCQkJCXp6LT5zYV9sYWJlbCk7Ci0JCX0KLQkJaWYgKHl5LT5zc19maW5pc2gpCi0JCQlhZGRhcmMoZCwgeXktPnNzX3JlbmFtZSwgeXktPnNzX3JlbmFtZSwgMCk7Ci0JfQotCQotCWQtPmRfaW5pdGlhbCA9IDA7CisgICAgaW50IGksIGo7CisgICAgc3Nfc3RhdGUgKnl5OworICAgIHNzX2FyYyAqeno7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgeHhfbnN0YXRlczsgaSsrKSB7CisgICAgICAgIHl5ID0gJnh4X3N0YXRlW2ldOworICAgICAgICBpZiAoeXktPnNzX2RlbGV0ZWQpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgeXktPnNzX3JlbmFtZSA9IGFkZHN0YXRlKGQpOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCB4eF9uc3RhdGVzOyBpKyspIHsKKyAgICAgICAgeXkgPSAmeHhfc3RhdGVbaV07CisgICAgICAgIGlmICh5eS0+c3NfZGVsZXRlZCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgeXktPnNzX25hcmNzOyBqKyspIHsKKyAgICAgICAgICAgIHp6ID0gJnl5LT5zc19hcmNbal07CisgICAgICAgICAgICBhZGRhcmMoZCwgeXktPnNzX3JlbmFtZSwKKyAgICAgICAgICAgICAgICB4eF9zdGF0ZVt6ei0+c2FfYXJyb3ddLnNzX3JlbmFtZSwKKyAgICAgICAgICAgICAgICB6ei0+c2FfbGFiZWwpOworICAgICAgICB9CisgICAgICAgIGlmICh5eS0+c3NfZmluaXNoKQorICAgICAgICAgICAgYWRkYXJjKGQsIHl5LT5zc19yZW5hbWUsIHl5LT5zc19yZW5hbWUsIDApOworICAgIH0KKworICAgIGQtPmRfaW5pdGlhbCA9IDA7CiB9CiAKIApAQCAtNjMyLDQzICs2MzIsNDMgQEAKIHN0YXRpYyBncmFtbWFyICoKIG1ha2V0YWJsZXMobmZhZ3JhbW1hciAqZ3IpCiB7Ci0JaW50IGk7Ci0JbmZhICpuZjsKLQlkZmEgKmQ7Ci0JZ3JhbW1hciAqZzsKLQkKLQlpZiAoZ3ItPmdyX25uZmFzID09IDApCi0JCXJldHVybiBOVUxMOwotCWcgPSBuZXdncmFtbWFyKGdyLT5ncl9uZmFbMF0tPm5mX3R5cGUpOwotCQkJLyogWFhYIGZpcnN0IHJ1bGUgbXVzdCBiZSBzdGFydCBydWxlICovCi0JZy0+Z19sbCA9IGdyLT5ncl9sbDsKLQkKLQlmb3IgKGkgPSAwOyBpIDwgZ3ItPmdyX25uZmFzOyBpKyspIHsKLQkJbmYgPSBnci0+Z3JfbmZhW2ldOwotCQlpZiAoUHlfRGVidWdGbGFnKSB7Ci0JCQlwcmludGYoIkR1bXAgb2YgTkZBIGZvciAnJXMnIC4uLlxuIiwgbmYtPm5mX25hbWUpOwotCQkJZHVtcG5mYSgmZ3ItPmdyX2xsLCBuZik7Ci0JCQlwcmludGYoIk1ha2luZyBERkEgZm9yICclcycgLi4uXG4iLCBuZi0+bmZfbmFtZSk7Ci0JCX0KLQkJZCA9IGFkZGRmYShnLCBuZi0+bmZfdHlwZSwgbmYtPm5mX25hbWUpOwotCQltYWtlZGZhKGdyLCBnci0+Z3JfbmZhW2ldLCBkKTsKLQl9Ci0JCi0JcmV0dXJuIGc7CisgICAgaW50IGk7CisgICAgbmZhICpuZjsKKyAgICBkZmEgKmQ7CisgICAgZ3JhbW1hciAqZzsKKworICAgIGlmIChnci0+Z3Jfbm5mYXMgPT0gMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZyA9IG5ld2dyYW1tYXIoZ3ItPmdyX25mYVswXS0+bmZfdHlwZSk7CisgICAgICAgICAgICAgICAgICAgIC8qIFhYWCBmaXJzdCBydWxlIG11c3QgYmUgc3RhcnQgcnVsZSAqLworICAgIGctPmdfbGwgPSBnci0+Z3JfbGw7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZ3ItPmdyX25uZmFzOyBpKyspIHsKKyAgICAgICAgbmYgPSBnci0+Z3JfbmZhW2ldOworICAgICAgICBpZiAoUHlfRGVidWdGbGFnKSB7CisgICAgICAgICAgICBwcmludGYoIkR1bXAgb2YgTkZBIGZvciAnJXMnIC4uLlxuIiwgbmYtPm5mX25hbWUpOworICAgICAgICAgICAgZHVtcG5mYSgmZ3ItPmdyX2xsLCBuZik7CisgICAgICAgICAgICBwcmludGYoIk1ha2luZyBERkEgZm9yICclcycgLi4uXG4iLCBuZi0+bmZfbmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgZCA9IGFkZGRmYShnLCBuZi0+bmZfdHlwZSwgbmYtPm5mX25hbWUpOworICAgICAgICBtYWtlZGZhKGdyLCBnci0+Z3JfbmZhW2ldLCBkKTsKKyAgICB9CisKKyAgICByZXR1cm4gZzsKIH0KIAogZ3JhbW1hciAqCiBwZ2VuKG5vZGUgKm4pCiB7Ci0JbmZhZ3JhbW1hciAqZ3I7Ci0JZ3JhbW1hciAqZzsKLQkKLQlnciA9IG1ldGFjb21waWxlKG4pOwotCWcgPSBtYWtldGFibGVzKGdyKTsKLQl0cmFuc2xhdGVsYWJlbHMoZyk7Ci0JYWRkZmlyc3RzZXRzKGcpOwotCVB5T2JqZWN0X0ZSRUUoZ3IpOwotCXJldHVybiBnOworICAgIG5mYWdyYW1tYXIgKmdyOworICAgIGdyYW1tYXIgKmc7CisKKyAgICBnciA9IG1ldGFjb21waWxlKG4pOworICAgIGcgPSBtYWtldGFibGVzKGdyKTsKKyAgICB0cmFuc2xhdGVsYWJlbHMoZyk7CisgICAgYWRkZmlyc3RzZXRzKGcpOworICAgIFB5T2JqZWN0X0ZSRUUoZ3IpOworICAgIHJldHVybiBnOwogfQogCiBncmFtbWFyICoKQEAgLTcwMiw3ICs3MDIsNyBAQAogLS0tLS0tLS0tCiAKIFtBaG8mVWxsbWFuIDc3XQotCUFobyZVbGxtYW4sIFByaW5jaXBsZXMgb2YgQ29tcGlsZXIgRGVzaWduLCBBZGRpc29uLVdlc2xleSAxOTc3Ci0JKGZpcnN0IGVkaXRpb24pCisgICAgQWhvJlVsbG1hbiwgUHJpbmNpcGxlcyBvZiBDb21waWxlciBEZXNpZ24sIEFkZGlzb24tV2VzbGV5IDE5NzcKKyAgICAoZmlyc3QgZWRpdGlvbikKIAogKi8KZGlmZiAtLWdpdCBhL1BhcnNlci9wZ2VubWFpbi5jIGIvUGFyc2VyL3BnZW5tYWluLmMKaW5kZXggZmMyN2EyYy4uODhmYTdmMSAxMDA2NDQKLS0tIGEvUGFyc2VyL3BnZW5tYWluLmMKKysrIGIvUGFyc2VyL3BnZW5tYWluLmMKQEAgLTMwLDEwNCArMzAsMTA0IEBACiB2b2lkCiBQeV9FeGl0KGludCBzdHMpCiB7Ci0JZXhpdChzdHMpOworICAgIGV4aXQoc3RzKTsKIH0KIAogaW50CiBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKIHsKLQlncmFtbWFyICpnOwotCUZJTEUgKmZwOwotCWNoYXIgKmZpbGVuYW1lLCAqZ3JhbWluaXRfaCwgKmdyYW1pbml0X2M7Ci0JCi0JaWYgKGFyZ2MgIT0gNCkgewotCQlmcHJpbnRmKHN0ZGVyciwKLQkJCSJ1c2FnZTogJXMgZ3JhbW1hciBncmFtaW5pdC5oIGdyYW1pbml0LmNcbiIsIGFyZ3ZbMF0pOwotCQlQeV9FeGl0KDIpOwotCX0KLQlmaWxlbmFtZSA9IGFyZ3ZbMV07Ci0JZ3JhbWluaXRfaCA9IGFyZ3ZbMl07Ci0JZ3JhbWluaXRfYyA9IGFyZ3ZbM107Ci0JZyA9IGdldGdyYW1tYXIoZmlsZW5hbWUpOwotCWZwID0gZm9wZW4oZ3JhbWluaXRfYywgInciKTsKLQlpZiAoZnAgPT0gTlVMTCkgewotCQlwZXJyb3IoZ3JhbWluaXRfYyk7Ci0JCVB5X0V4aXQoMSk7Ci0JfQotCWlmIChQeV9EZWJ1Z0ZsYWcpCi0JCXByaW50ZigiV3JpdGluZyAlcyAuLi5cbiIsIGdyYW1pbml0X2MpOwotCXByaW50Z3JhbW1hcihnLCBmcCk7Ci0JZmNsb3NlKGZwKTsKLQlmcCA9IGZvcGVuKGdyYW1pbml0X2gsICJ3Iik7Ci0JaWYgKGZwID09IE5VTEwpIHsKLQkJcGVycm9yKGdyYW1pbml0X2gpOwotCQlQeV9FeGl0KDEpOwotCX0KLQlpZiAoUHlfRGVidWdGbGFnKQotCQlwcmludGYoIldyaXRpbmcgJXMgLi4uXG4iLCBncmFtaW5pdF9oKTsKLQlwcmludG5vbnRlcm1pbmFscyhnLCBmcCk7Ci0JZmNsb3NlKGZwKTsKLQlQeV9FeGl0KDApOwotCXJldHVybiAwOyAvKiBNYWtlIGdjYyAtV2FsbCBoYXBweSAqLworICAgIGdyYW1tYXIgKmc7CisgICAgRklMRSAqZnA7CisgICAgY2hhciAqZmlsZW5hbWUsICpncmFtaW5pdF9oLCAqZ3JhbWluaXRfYzsKKworICAgIGlmIChhcmdjICE9IDQpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAidXNhZ2U6ICVzIGdyYW1tYXIgZ3JhbWluaXQuaCBncmFtaW5pdC5jXG4iLCBhcmd2WzBdKTsKKyAgICAgICAgUHlfRXhpdCgyKTsKKyAgICB9CisgICAgZmlsZW5hbWUgPSBhcmd2WzFdOworICAgIGdyYW1pbml0X2ggPSBhcmd2WzJdOworICAgIGdyYW1pbml0X2MgPSBhcmd2WzNdOworICAgIGcgPSBnZXRncmFtbWFyKGZpbGVuYW1lKTsKKyAgICBmcCA9IGZvcGVuKGdyYW1pbml0X2MsICJ3Iik7CisgICAgaWYgKGZwID09IE5VTEwpIHsKKyAgICAgICAgcGVycm9yKGdyYW1pbml0X2MpOworICAgICAgICBQeV9FeGl0KDEpOworICAgIH0KKyAgICBpZiAoUHlfRGVidWdGbGFnKQorICAgICAgICBwcmludGYoIldyaXRpbmcgJXMgLi4uXG4iLCBncmFtaW5pdF9jKTsKKyAgICBwcmludGdyYW1tYXIoZywgZnApOworICAgIGZjbG9zZShmcCk7CisgICAgZnAgPSBmb3BlbihncmFtaW5pdF9oLCAidyIpOworICAgIGlmIChmcCA9PSBOVUxMKSB7CisgICAgICAgIHBlcnJvcihncmFtaW5pdF9oKTsKKyAgICAgICAgUHlfRXhpdCgxKTsKKyAgICB9CisgICAgaWYgKFB5X0RlYnVnRmxhZykKKyAgICAgICAgcHJpbnRmKCJXcml0aW5nICVzIC4uLlxuIiwgZ3JhbWluaXRfaCk7CisgICAgcHJpbnRub250ZXJtaW5hbHMoZywgZnApOworICAgIGZjbG9zZShmcCk7CisgICAgUHlfRXhpdCgwKTsKKyAgICByZXR1cm4gMDsgLyogTWFrZSBnY2MgLVdhbGwgaGFwcHkgKi8KIH0KIAogZ3JhbW1hciAqCiBnZXRncmFtbWFyKGNoYXIgKmZpbGVuYW1lKQogewotCUZJTEUgKmZwOwotCW5vZGUgKm47Ci0JZ3JhbW1hciAqZzAsICpnOwotCXBlcnJkZXRhaWwgZXJyOwotCQotCWZwID0gZm9wZW4oZmlsZW5hbWUsICJyIik7Ci0JaWYgKGZwID09IE5VTEwpIHsKLQkJcGVycm9yKGZpbGVuYW1lKTsKLQkJUHlfRXhpdCgxKTsKLQl9Ci0JZzAgPSBtZXRhX2dyYW1tYXIoKTsKLQluID0gUHlQYXJzZXJfUGFyc2VGaWxlKGZwLCBmaWxlbmFtZSwgZzAsIGcwLT5nX3N0YXJ0LAotCQkgICAgICAoY2hhciAqKU5VTEwsIChjaGFyICopTlVMTCwgJmVycik7Ci0JZmNsb3NlKGZwKTsKLQlpZiAobiA9PSBOVUxMKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAiUGFyc2luZyBlcnJvciAlZCwgbGluZSAlZC5cbiIsCi0JCQllcnIuZXJyb3IsIGVyci5saW5lbm8pOwotCQlpZiAoZXJyLnRleHQgIT0gTlVMTCkgewotCQkJc2l6ZV90IGk7Ci0JCQlmcHJpbnRmKHN0ZGVyciwgIiVzIiwgZXJyLnRleHQpOwotCQkJaSA9IHN0cmxlbihlcnIudGV4dCk7Ci0JCQlpZiAoaSA9PSAwIHx8IGVyci50ZXh0W2ktMV0gIT0gJ1xuJykKLQkJCQlmcHJpbnRmKHN0ZGVyciwgIlxuIik7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgZXJyLm9mZnNldDsgaSsrKSB7Ci0JCQkJaWYgKGVyci50ZXh0W2ldID09ICdcdCcpCi0JCQkJCXB1dGMoJ1x0Jywgc3RkZXJyKTsKLQkJCQllbHNlCi0JCQkJCXB1dGMoJyAnLCBzdGRlcnIpOwotCQkJfQotCQkJZnByaW50ZihzdGRlcnIsICJeXG4iKTsKLQkJCVB5T2JqZWN0X0ZSRUUoZXJyLnRleHQpOwotCQl9Ci0JCVB5X0V4aXQoMSk7Ci0JfQotCWcgPSBwZ2VuKG4pOwotCWlmIChnID09IE5VTEwpIHsKLQkJcHJpbnRmKCJCYWQgZ3JhbW1hci5cbiIpOwotCQlQeV9FeGl0KDEpOwotCX0KLQlyZXR1cm4gZzsKKyAgICBGSUxFICpmcDsKKyAgICBub2RlICpuOworICAgIGdyYW1tYXIgKmcwLCAqZzsKKyAgICBwZXJyZGV0YWlsIGVycjsKKworICAgIGZwID0gZm9wZW4oZmlsZW5hbWUsICJyIik7CisgICAgaWYgKGZwID09IE5VTEwpIHsKKyAgICAgICAgcGVycm9yKGZpbGVuYW1lKTsKKyAgICAgICAgUHlfRXhpdCgxKTsKKyAgICB9CisgICAgZzAgPSBtZXRhX2dyYW1tYXIoKTsKKyAgICBuID0gUHlQYXJzZXJfUGFyc2VGaWxlKGZwLCBmaWxlbmFtZSwgZzAsIGcwLT5nX3N0YXJ0LAorICAgICAgICAgICAgICAgICAgKGNoYXIgKilOVUxMLCAoY2hhciAqKU5VTEwsICZlcnIpOworICAgIGZjbG9zZShmcCk7CisgICAgaWYgKG4gPT0gTlVMTCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlBhcnNpbmcgZXJyb3IgJWQsIGxpbmUgJWQuXG4iLAorICAgICAgICAgICAgZXJyLmVycm9yLCBlcnIubGluZW5vKTsKKyAgICAgICAgaWYgKGVyci50ZXh0ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHNpemVfdCBpOworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlcyIsIGVyci50ZXh0KTsKKyAgICAgICAgICAgIGkgPSBzdHJsZW4oZXJyLnRleHQpOworICAgICAgICAgICAgaWYgKGkgPT0gMCB8fCBlcnIudGV4dFtpLTFdICE9ICdcbicpCisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJcbiIpOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGVyci5vZmZzZXQ7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChlcnIudGV4dFtpXSA9PSAnXHQnKQorICAgICAgICAgICAgICAgICAgICBwdXRjKCdcdCcsIHN0ZGVycik7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBwdXRjKCcgJywgc3RkZXJyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiXlxuIik7CisgICAgICAgICAgICBQeU9iamVjdF9GUkVFKGVyci50ZXh0KTsKKyAgICAgICAgfQorICAgICAgICBQeV9FeGl0KDEpOworICAgIH0KKyAgICBnID0gcGdlbihuKTsKKyAgICBpZiAoZyA9PSBOVUxMKSB7CisgICAgICAgIHByaW50ZigiQmFkIGdyYW1tYXIuXG4iKTsKKyAgICAgICAgUHlfRXhpdCgxKTsKKyAgICB9CisgICAgcmV0dXJuIGc7CiB9CiAKIC8qIENhbid0IGhhcHBlbiBpbiBwZ2VuICovCiBQeU9iamVjdCoKIFB5RXJyX09jY3VycmVkKCkKIHsKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKIH0KIAogdm9pZAogUHlfRmF0YWxFcnJvcihjb25zdCBjaGFyICptc2cpCiB7Ci0JZnByaW50ZihzdGRlcnIsICJwZ2VuOiBGQVRBTCBFUlJPUjogJXNcbiIsIG1zZyk7Ci0JUHlfRXhpdCgxKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgInBnZW46IEZBVEFMIEVSUk9SOiAlc1xuIiwgbXNnKTsKKyAgICBQeV9FeGl0KDEpOwogfQogCiAvKiBOby1ub25zZW5zZSBteV9yZWFkbGluZSgpIGZvciB0b2tlbml6ZXIuYyAqLwpAQCAtMTM1LDI4ICsxMzUsMjggQEAKIGNoYXIgKgogUHlPU19SZWFkbGluZShGSUxFICpzeXNfc3RkaW4sIEZJTEUgKnN5c19zdGRvdXQsIGNoYXIgKnByb21wdCkKIHsKLQlzaXplX3QgbiA9IDEwMDA7Ci0JY2hhciAqcCA9IChjaGFyICopUHlNZW1fTUFMTE9DKG4pOwotCWNoYXIgKnE7Ci0JaWYgKHAgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JZnByaW50ZihzdGRlcnIsICIlcyIsIHByb21wdCk7Ci0JcSA9IGZnZXRzKHAsIG4sIHN5c19zdGRpbik7Ci0JaWYgKHEgPT0gTlVMTCkgewotCQkqcCA9ICdcMCc7Ci0JCXJldHVybiBwOwotCX0KLQluID0gc3RybGVuKHApOwotCWlmIChuID4gMCAmJiBwW24tMV0gIT0gJ1xuJykKLQkJcFtuLTFdID0gJ1xuJzsKLQlyZXR1cm4gKGNoYXIgKilQeU1lbV9SRUFMTE9DKHAsIG4rMSk7CisgICAgc2l6ZV90IG4gPSAxMDAwOworICAgIGNoYXIgKnAgPSAoY2hhciAqKVB5TWVtX01BTExPQyhuKTsKKyAgICBjaGFyICpxOworICAgIGlmIChwID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGZwcmludGYoc3RkZXJyLCAiJXMiLCBwcm9tcHQpOworICAgIHEgPSBmZ2V0cyhwLCBuLCBzeXNfc3RkaW4pOworICAgIGlmIChxID09IE5VTEwpIHsKKyAgICAgICAgKnAgPSAnXDAnOworICAgICAgICByZXR1cm4gcDsKKyAgICB9CisgICAgbiA9IHN0cmxlbihwKTsKKyAgICBpZiAobiA+IDAgJiYgcFtuLTFdICE9ICdcbicpCisgICAgICAgIHBbbi0xXSA9ICdcbic7CisgICAgcmV0dXJuIChjaGFyICopUHlNZW1fUkVBTExPQyhwLCBuKzEpOwogfQogCiAvKiBOby1ub25zZW5zZSBmZ2V0cyAqLwogY2hhciAqCiBQeV9Vbml2ZXJzYWxOZXdsaW5lRmdldHMoY2hhciAqYnVmLCBpbnQgbiwgRklMRSAqc3RyZWFtLCBQeU9iamVjdCAqZm9iaikKIHsKLQlyZXR1cm4gZmdldHMoYnVmLCBuLCBzdHJlYW0pOworICAgIHJldHVybiBmZ2V0cyhidWYsIG4sIHN0cmVhbSk7CiB9CiAKIApAQCAtMTY1LDkgKzE2NSw5IEBACiB2b2lkCiBQeVN5c19Xcml0ZVN0ZGVycihjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKIHsKLQl2YV9saXN0IHZhOworICAgIHZhX2xpc3QgdmE7CiAKLQl2YV9zdGFydCh2YSwgZm9ybWF0KTsKLQl2ZnByaW50ZihzdGRlcnIsIGZvcm1hdCwgdmEpOwotCXZhX2VuZCh2YSk7CisgICAgdmFfc3RhcnQodmEsIGZvcm1hdCk7CisgICAgdmZwcmludGYoc3RkZXJyLCBmb3JtYXQsIHZhKTsKKyAgICB2YV9lbmQodmEpOwogfQpkaWZmIC0tZ2l0IGEvUGFyc2VyL3ByaW50Z3JhbW1hci5jIGIvUGFyc2VyL3ByaW50Z3JhbW1hci5jCmluZGV4IGFlMTgwZTEuLjNiNTRhMDUgMTAwNjQ0Ci0tLSBhL1BhcnNlci9wcmludGdyYW1tYXIuYworKysgYi9QYXJzZXIvcHJpbnRncmFtbWFyLmMKQEAgLTEzLDEwNSArMTMsMTA1IEBACiB2b2lkCiBwcmludGdyYW1tYXIoZ3JhbW1hciAqZywgRklMRSAqZnApCiB7Ci0JZnByaW50ZihmcCwgIi8qIEdlbmVyYXRlZCBieSBQYXJzZXIvcGdlbiAqL1xuXG4iKTsKLQlmcHJpbnRmKGZwLCAiI2luY2x1ZGUgXCJwZ2VuaGVhZGVycy5oXCJcbiIpOwotCWZwcmludGYoZnAsICIjaW5jbHVkZSBcImdyYW1tYXIuaFwiXG4iKTsKLQlmcHJpbnRmKGZwLCAiUHlBUElfREFUQShncmFtbWFyKSBfUHlQYXJzZXJfR3JhbW1hcjtcbiIpOwotCXByaW50ZGZhcyhnLCBmcCk7Ci0JcHJpbnRsYWJlbHMoZywgZnApOwotCWZwcmludGYoZnAsICJncmFtbWFyIF9QeVBhcnNlcl9HcmFtbWFyID0ge1xuIik7Ci0JZnByaW50ZihmcCwgIlx0JWQsXG4iLCBnLT5nX25kZmFzKTsKLQlmcHJpbnRmKGZwLCAiXHRkZmFzLFxuIik7Ci0JZnByaW50ZihmcCwgIlx0eyVkLCBsYWJlbHN9LFxuIiwgZy0+Z19sbC5sbF9ubGFiZWxzKTsKLQlmcHJpbnRmKGZwLCAiXHQlZFxuIiwgZy0+Z19zdGFydCk7Ci0JZnByaW50ZihmcCwgIn07XG4iKTsKKyAgICBmcHJpbnRmKGZwLCAiLyogR2VuZXJhdGVkIGJ5IFBhcnNlci9wZ2VuICovXG5cbiIpOworICAgIGZwcmludGYoZnAsICIjaW5jbHVkZSBcInBnZW5oZWFkZXJzLmhcIlxuIik7CisgICAgZnByaW50ZihmcCwgIiNpbmNsdWRlIFwiZ3JhbW1hci5oXCJcbiIpOworICAgIGZwcmludGYoZnAsICJQeUFQSV9EQVRBKGdyYW1tYXIpIF9QeVBhcnNlcl9HcmFtbWFyO1xuIik7CisgICAgcHJpbnRkZmFzKGcsIGZwKTsKKyAgICBwcmludGxhYmVscyhnLCBmcCk7CisgICAgZnByaW50ZihmcCwgImdyYW1tYXIgX1B5UGFyc2VyX0dyYW1tYXIgPSB7XG4iKTsKKyAgICBmcHJpbnRmKGZwLCAiXHQlZCxcbiIsIGctPmdfbmRmYXMpOworICAgIGZwcmludGYoZnAsICJcdGRmYXMsXG4iKTsKKyAgICBmcHJpbnRmKGZwLCAiXHR7JWQsIGxhYmVsc30sXG4iLCBnLT5nX2xsLmxsX25sYWJlbHMpOworICAgIGZwcmludGYoZnAsICJcdCVkXG4iLCBnLT5nX3N0YXJ0KTsKKyAgICBmcHJpbnRmKGZwLCAifTtcbiIpOwogfQogCiB2b2lkCiBwcmludG5vbnRlcm1pbmFscyhncmFtbWFyICpnLCBGSUxFICpmcCkKIHsKLQlkZmEgKmQ7Ci0JaW50IGk7Ci0JCi0JZnByaW50ZihmcCwgIi8qIEdlbmVyYXRlZCBieSBQYXJzZXIvcGdlbiAqL1xuXG4iKTsKLQkKLQlkID0gZy0+Z19kZmE7Ci0JZm9yIChpID0gZy0+Z19uZGZhczsgLS1pID49IDA7IGQrKykKLQkJZnByaW50ZihmcCwgIiNkZWZpbmUgJXMgJWRcbiIsIGQtPmRfbmFtZSwgZC0+ZF90eXBlKTsKKyAgICBkZmEgKmQ7CisgICAgaW50IGk7CisKKyAgICBmcHJpbnRmKGZwLCAiLyogR2VuZXJhdGVkIGJ5IFBhcnNlci9wZ2VuICovXG5cbiIpOworCisgICAgZCA9IGctPmdfZGZhOworICAgIGZvciAoaSA9IGctPmdfbmRmYXM7IC0taSA+PSAwOyBkKyspCisgICAgICAgIGZwcmludGYoZnAsICIjZGVmaW5lICVzICVkXG4iLCBkLT5kX25hbWUsIGQtPmRfdHlwZSk7CiB9CiAKIHN0YXRpYyB2b2lkCiBwcmludGFyY3MoaW50IGksIGRmYSAqZCwgRklMRSAqZnApCiB7Ci0JYXJjICphOwotCXN0YXRlICpzOwotCWludCBqLCBrOwotCQotCXMgPSBkLT5kX3N0YXRlOwotCWZvciAoaiA9IDA7IGogPCBkLT5kX25zdGF0ZXM7IGorKywgcysrKSB7Ci0JCWZwcmludGYoZnAsICJzdGF0aWMgYXJjIGFyY3NfJWRfJWRbJWRdID0ge1xuIiwKLQkJCWksIGosIHMtPnNfbmFyY3MpOwotCQlhID0gcy0+c19hcmM7Ci0JCWZvciAoayA9IDA7IGsgPCBzLT5zX25hcmNzOyBrKyssIGErKykKLQkJCWZwcmludGYoZnAsICJcdHslZCwgJWR9LFxuIiwgYS0+YV9sYmwsIGEtPmFfYXJyb3cpOwotCQlmcHJpbnRmKGZwLCAifTtcbiIpOwotCX0KKyAgICBhcmMgKmE7CisgICAgc3RhdGUgKnM7CisgICAgaW50IGosIGs7CisKKyAgICBzID0gZC0+ZF9zdGF0ZTsKKyAgICBmb3IgKGogPSAwOyBqIDwgZC0+ZF9uc3RhdGVzOyBqKyssIHMrKykgeworICAgICAgICBmcHJpbnRmKGZwLCAic3RhdGljIGFyYyBhcmNzXyVkXyVkWyVkXSA9IHtcbiIsCisgICAgICAgICAgICBpLCBqLCBzLT5zX25hcmNzKTsKKyAgICAgICAgYSA9IHMtPnNfYXJjOworICAgICAgICBmb3IgKGsgPSAwOyBrIDwgcy0+c19uYXJjczsgaysrLCBhKyspCisgICAgICAgICAgICBmcHJpbnRmKGZwLCAiXHR7JWQsICVkfSxcbiIsIGEtPmFfbGJsLCBhLT5hX2Fycm93KTsKKyAgICAgICAgZnByaW50ZihmcCwgIn07XG4iKTsKKyAgICB9CiB9CiAKIHN0YXRpYyB2b2lkCiBwcmludHN0YXRlcyhncmFtbWFyICpnLCBGSUxFICpmcCkKIHsKLQlzdGF0ZSAqczsKLQlkZmEgKmQ7Ci0JaW50IGksIGo7Ci0JCi0JZCA9IGctPmdfZGZhOwotCWZvciAoaSA9IDA7IGkgPCBnLT5nX25kZmFzOyBpKyssIGQrKykgewotCQlwcmludGFyY3MoaSwgZCwgZnApOwotCQlmcHJpbnRmKGZwLCAic3RhdGljIHN0YXRlIHN0YXRlc18lZFslZF0gPSB7XG4iLAotCQkJaSwgZC0+ZF9uc3RhdGVzKTsKLQkJcyA9IGQtPmRfc3RhdGU7Ci0JCWZvciAoaiA9IDA7IGogPCBkLT5kX25zdGF0ZXM7IGorKywgcysrKQotCQkJZnByaW50ZihmcCwgIlx0eyVkLCBhcmNzXyVkXyVkfSxcbiIsCi0JCQkJcy0+c19uYXJjcywgaSwgaik7Ci0JCWZwcmludGYoZnAsICJ9O1xuIik7Ci0JfQorICAgIHN0YXRlICpzOworICAgIGRmYSAqZDsKKyAgICBpbnQgaSwgajsKKworICAgIGQgPSBnLT5nX2RmYTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgZy0+Z19uZGZhczsgaSsrLCBkKyspIHsKKyAgICAgICAgcHJpbnRhcmNzKGksIGQsIGZwKTsKKyAgICAgICAgZnByaW50ZihmcCwgInN0YXRpYyBzdGF0ZSBzdGF0ZXNfJWRbJWRdID0ge1xuIiwKKyAgICAgICAgICAgIGksIGQtPmRfbnN0YXRlcyk7CisgICAgICAgIHMgPSBkLT5kX3N0YXRlOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgZC0+ZF9uc3RhdGVzOyBqKyssIHMrKykKKyAgICAgICAgICAgIGZwcmludGYoZnAsICJcdHslZCwgYXJjc18lZF8lZH0sXG4iLAorICAgICAgICAgICAgICAgIHMtPnNfbmFyY3MsIGksIGopOworICAgICAgICBmcHJpbnRmKGZwLCAifTtcbiIpOworICAgIH0KIH0KIAogc3RhdGljIHZvaWQKIHByaW50ZGZhcyhncmFtbWFyICpnLCBGSUxFICpmcCkKIHsKLQlkZmEgKmQ7Ci0JaW50IGksIGo7Ci0JCi0JcHJpbnRzdGF0ZXMoZywgZnApOwotCWZwcmludGYoZnAsICJzdGF0aWMgZGZhIGRmYXNbJWRdID0ge1xuIiwgZy0+Z19uZGZhcyk7Ci0JZCA9IGctPmdfZGZhOwotCWZvciAoaSA9IDA7IGkgPCBnLT5nX25kZmFzOyBpKyssIGQrKykgewotCQlmcHJpbnRmKGZwLCAiXHR7JWQsIFwiJXNcIiwgJWQsICVkLCBzdGF0ZXNfJWQsXG4iLAotCQkJZC0+ZF90eXBlLCBkLT5kX25hbWUsIGQtPmRfaW5pdGlhbCwgZC0+ZF9uc3RhdGVzLCBpKTsKLQkJZnByaW50ZihmcCwgIlx0IFwiIik7Ci0JCWZvciAoaiA9IDA7IGogPCBOQllURVMoZy0+Z19sbC5sbF9ubGFiZWxzKTsgaisrKQotCQkJZnByaW50ZihmcCwgIlxcJTAzbyIsIGQtPmRfZmlyc3Rbal0gJiAweGZmKTsKLQkJZnByaW50ZihmcCwgIlwifSxcbiIpOwotCX0KLQlmcHJpbnRmKGZwLCAifTtcbiIpOworICAgIGRmYSAqZDsKKyAgICBpbnQgaSwgajsKKworICAgIHByaW50c3RhdGVzKGcsIGZwKTsKKyAgICBmcHJpbnRmKGZwLCAic3RhdGljIGRmYSBkZmFzWyVkXSA9IHtcbiIsIGctPmdfbmRmYXMpOworICAgIGQgPSBnLT5nX2RmYTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgZy0+Z19uZGZhczsgaSsrLCBkKyspIHsKKyAgICAgICAgZnByaW50ZihmcCwgIlx0eyVkLCBcIiVzXCIsICVkLCAlZCwgc3RhdGVzXyVkLFxuIiwKKyAgICAgICAgICAgIGQtPmRfdHlwZSwgZC0+ZF9uYW1lLCBkLT5kX2luaXRpYWwsIGQtPmRfbnN0YXRlcywgaSk7CisgICAgICAgIGZwcmludGYoZnAsICJcdCBcIiIpOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgTkJZVEVTKGctPmdfbGwubGxfbmxhYmVscyk7IGorKykKKyAgICAgICAgICAgIGZwcmludGYoZnAsICJcXCUwM28iLCBkLT5kX2ZpcnN0W2pdICYgMHhmZik7CisgICAgICAgIGZwcmludGYoZnAsICJcIn0sXG4iKTsKKyAgICB9CisgICAgZnByaW50ZihmcCwgIn07XG4iKTsKIH0KIAogc3RhdGljIHZvaWQKIHByaW50bGFiZWxzKGdyYW1tYXIgKmcsIEZJTEUgKmZwKQogewotCWxhYmVsICpsOwotCWludCBpOwotCQotCWZwcmludGYoZnAsICJzdGF0aWMgbGFiZWwgbGFiZWxzWyVkXSA9IHtcbiIsIGctPmdfbGwubGxfbmxhYmVscyk7Ci0JbCA9IGctPmdfbGwubGxfbGFiZWw7Ci0JZm9yIChpID0gZy0+Z19sbC5sbF9ubGFiZWxzOyAtLWkgPj0gMDsgbCsrKSB7Ci0JCWlmIChsLT5sYl9zdHIgPT0gTlVMTCkKLQkJCWZwcmludGYoZnAsICJcdHslZCwgMH0sXG4iLCBsLT5sYl90eXBlKTsKLQkJZWxzZQotCQkJZnByaW50ZihmcCwgIlx0eyVkLCBcIiVzXCJ9LFxuIiwKLQkJCQlsLT5sYl90eXBlLCBsLT5sYl9zdHIpOwotCX0KLQlmcHJpbnRmKGZwLCAifTtcbiIpOworICAgIGxhYmVsICpsOworICAgIGludCBpOworCisgICAgZnByaW50ZihmcCwgInN0YXRpYyBsYWJlbCBsYWJlbHNbJWRdID0ge1xuIiwgZy0+Z19sbC5sbF9ubGFiZWxzKTsKKyAgICBsID0gZy0+Z19sbC5sbF9sYWJlbDsKKyAgICBmb3IgKGkgPSBnLT5nX2xsLmxsX25sYWJlbHM7IC0taSA+PSAwOyBsKyspIHsKKyAgICAgICAgaWYgKGwtPmxiX3N0ciA9PSBOVUxMKQorICAgICAgICAgICAgZnByaW50ZihmcCwgIlx0eyVkLCAwfSxcbiIsIGwtPmxiX3R5cGUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBmcHJpbnRmKGZwLCAiXHR7JWQsIFwiJXNcIn0sXG4iLAorICAgICAgICAgICAgICAgIGwtPmxiX3R5cGUsIGwtPmxiX3N0cik7CisgICAgfQorICAgIGZwcmludGYoZnAsICJ9O1xuIik7CiB9CmRpZmYgLS1naXQgYS9QYXJzZXIvdG9rZW5pemVyLmMgYi9QYXJzZXIvdG9rZW5pemVyLmMKaW5kZXggYjg0YTE1NC4uYTA4ZjE4MyAxMDA2NDQKLS0tIGEvUGFyc2VyL3Rva2VuaXplci5jCisrKyBiL1BhcnNlci90b2tlbml6ZXIuYwpAQCAtMzUsNjEgKzM1LDYxIEBACiAvKiBUb2tlbiBuYW1lcyAqLwogCiBjaGFyICpfUHlQYXJzZXJfVG9rZW5OYW1lc1tdID0gewotCSJFTkRNQVJLRVIiLAotCSJOQU1FIiwKLQkiTlVNQkVSIiwKLQkiU1RSSU5HIiwKLQkiTkVXTElORSIsCi0JIklOREVOVCIsCi0JIkRFREVOVCIsCi0JIkxQQVIiLAotCSJSUEFSIiwKLQkiTFNRQiIsCi0JIlJTUUIiLAotCSJDT0xPTiIsCi0JIkNPTU1BIiwKLQkiU0VNSSIsCi0JIlBMVVMiLAotCSJNSU5VUyIsCi0JIlNUQVIiLAotCSJTTEFTSCIsCi0JIlZCQVIiLAotCSJBTVBFUiIsCi0JIkxFU1MiLAotCSJHUkVBVEVSIiwKLQkiRVFVQUwiLAotCSJET1QiLAotCSJQRVJDRU5UIiwKLQkiQkFDS1FVT1RFIiwKLQkiTEJSQUNFIiwKLQkiUkJSQUNFIiwKLQkiRVFFUVVBTCIsCi0JIk5PVEVRVUFMIiwKLQkiTEVTU0VRVUFMIiwKLQkiR1JFQVRFUkVRVUFMIiwKLQkiVElMREUiLAotCSJDSVJDVU1GTEVYIiwKLQkiTEVGVFNISUZUIiwKLQkiUklHSFRTSElGVCIsCi0JIkRPVUJMRVNUQVIiLAotCSJQTFVTRVFVQUwiLAotCSJNSU5FUVVBTCIsCi0JIlNUQVJFUVVBTCIsCi0JIlNMQVNIRVFVQUwiLAotCSJQRVJDRU5URVFVQUwiLAotCSJBTVBFUkVRVUFMIiwKLQkiVkJBUkVRVUFMIiwKLQkiQ0lSQ1VNRkxFWEVRVUFMIiwKLQkiTEVGVFNISUZURVFVQUwiLAotCSJSSUdIVFNISUZURVFVQUwiLAotCSJET1VCTEVTVEFSRVFVQUwiLAotCSJET1VCTEVTTEFTSCIsCi0JIkRPVUJMRVNMQVNIRVFVQUwiLAotCSJBVCIsCi0JLyogVGhpcyB0YWJsZSBtdXN0IG1hdGNoIHRoZSAjZGVmaW5lcyBpbiB0b2tlbi5oISAqLwotCSJPUCIsCi0JIjxFUlJPUlRPS0VOPiIsCi0JIjxOX1RPS0VOUz4iCisgICAgIkVORE1BUktFUiIsCisgICAgIk5BTUUiLAorICAgICJOVU1CRVIiLAorICAgICJTVFJJTkciLAorICAgICJORVdMSU5FIiwKKyAgICAiSU5ERU5UIiwKKyAgICAiREVERU5UIiwKKyAgICAiTFBBUiIsCisgICAgIlJQQVIiLAorICAgICJMU1FCIiwKKyAgICAiUlNRQiIsCisgICAgIkNPTE9OIiwKKyAgICAiQ09NTUEiLAorICAgICJTRU1JIiwKKyAgICAiUExVUyIsCisgICAgIk1JTlVTIiwKKyAgICAiU1RBUiIsCisgICAgIlNMQVNIIiwKKyAgICAiVkJBUiIsCisgICAgIkFNUEVSIiwKKyAgICAiTEVTUyIsCisgICAgIkdSRUFURVIiLAorICAgICJFUVVBTCIsCisgICAgIkRPVCIsCisgICAgIlBFUkNFTlQiLAorICAgICJCQUNLUVVPVEUiLAorICAgICJMQlJBQ0UiLAorICAgICJSQlJBQ0UiLAorICAgICJFUUVRVUFMIiwKKyAgICAiTk9URVFVQUwiLAorICAgICJMRVNTRVFVQUwiLAorICAgICJHUkVBVEVSRVFVQUwiLAorICAgICJUSUxERSIsCisgICAgIkNJUkNVTUZMRVgiLAorICAgICJMRUZUU0hJRlQiLAorICAgICJSSUdIVFNISUZUIiwKKyAgICAiRE9VQkxFU1RBUiIsCisgICAgIlBMVVNFUVVBTCIsCisgICAgIk1JTkVRVUFMIiwKKyAgICAiU1RBUkVRVUFMIiwKKyAgICAiU0xBU0hFUVVBTCIsCisgICAgIlBFUkNFTlRFUVVBTCIsCisgICAgIkFNUEVSRVFVQUwiLAorICAgICJWQkFSRVFVQUwiLAorICAgICJDSVJDVU1GTEVYRVFVQUwiLAorICAgICJMRUZUU0hJRlRFUVVBTCIsCisgICAgIlJJR0hUU0hJRlRFUVVBTCIsCisgICAgIkRPVUJMRVNUQVJFUVVBTCIsCisgICAgIkRPVUJMRVNMQVNIIiwKKyAgICAiRE9VQkxFU0xBU0hFUVVBTCIsCisgICAgIkFUIiwKKyAgICAvKiBUaGlzIHRhYmxlIG11c3QgbWF0Y2ggdGhlICNkZWZpbmVzIGluIHRva2VuLmghICovCisgICAgIk9QIiwKKyAgICAiPEVSUk9SVE9LRU4+IiwKKyAgICAiPE5fVE9LRU5TPiIKIH07CiAKIApAQCAtOTgsMzYgKzk4LDM2IEBACiBzdGF0aWMgc3RydWN0IHRva19zdGF0ZSAqCiB0b2tfbmV3KHZvaWQpCiB7Ci0Jc3RydWN0IHRva19zdGF0ZSAqdG9rID0gKHN0cnVjdCB0b2tfc3RhdGUgKilQeU1lbV9NQUxMT0MoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IHRva19zdGF0ZSkpOwotCWlmICh0b2sgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JdG9rLT5idWYgPSB0b2stPmN1ciA9IHRvay0+ZW5kID0gdG9rLT5pbnAgPSB0b2stPnN0YXJ0ID0gTlVMTDsKLQl0b2stPmRvbmUgPSBFX09LOwotCXRvay0+ZnAgPSBOVUxMOwotCXRvay0+dGFic2l6ZSA9IFRBQlNJWkU7Ci0JdG9rLT5pbmRlbnQgPSAwOwotCXRvay0+aW5kc3RhY2tbMF0gPSAwOwotCXRvay0+YXRib2wgPSAxOwotCXRvay0+cGVuZGluID0gMDsKLQl0b2stPnByb21wdCA9IHRvay0+bmV4dHByb21wdCA9IE5VTEw7Ci0JdG9rLT5saW5lbm8gPSAwOwotCXRvay0+bGV2ZWwgPSAwOwotCXRvay0+ZmlsZW5hbWUgPSBOVUxMOwotCXRvay0+YWx0d2FybmluZyA9IDA7Ci0JdG9rLT5hbHRlcnJvciA9IDA7Ci0JdG9rLT5hbHR0YWJzaXplID0gMTsKLQl0b2stPmFsdGluZHN0YWNrWzBdID0gMDsKLQl0b2stPmRlY29kaW5nX3N0YXRlID0gMDsKLQl0b2stPmRlY29kaW5nX2VycmVkID0gMDsKLQl0b2stPnJlYWRfY29kaW5nX3NwZWMgPSAwOwotCXRvay0+ZW5jb2RpbmcgPSBOVUxMOwotICAgICAgICB0b2stPmNvbnRfbGluZSA9IDA7CisgICAgc3RydWN0IHRva19zdGF0ZSAqdG9rID0gKHN0cnVjdCB0b2tfc3RhdGUgKilQeU1lbV9NQUxMT0MoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QgdG9rX3N0YXRlKSk7CisgICAgaWYgKHRvayA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB0b2stPmJ1ZiA9IHRvay0+Y3VyID0gdG9rLT5lbmQgPSB0b2stPmlucCA9IHRvay0+c3RhcnQgPSBOVUxMOworICAgIHRvay0+ZG9uZSA9IEVfT0s7CisgICAgdG9rLT5mcCA9IE5VTEw7CisgICAgdG9rLT50YWJzaXplID0gVEFCU0laRTsKKyAgICB0b2stPmluZGVudCA9IDA7CisgICAgdG9rLT5pbmRzdGFja1swXSA9IDA7CisgICAgdG9rLT5hdGJvbCA9IDE7CisgICAgdG9rLT5wZW5kaW4gPSAwOworICAgIHRvay0+cHJvbXB0ID0gdG9rLT5uZXh0cHJvbXB0ID0gTlVMTDsKKyAgICB0b2stPmxpbmVubyA9IDA7CisgICAgdG9rLT5sZXZlbCA9IDA7CisgICAgdG9rLT5maWxlbmFtZSA9IE5VTEw7CisgICAgdG9rLT5hbHR3YXJuaW5nID0gMDsKKyAgICB0b2stPmFsdGVycm9yID0gMDsKKyAgICB0b2stPmFsdHRhYnNpemUgPSAxOworICAgIHRvay0+YWx0aW5kc3RhY2tbMF0gPSAwOworICAgIHRvay0+ZGVjb2Rpbmdfc3RhdGUgPSAwOworICAgIHRvay0+ZGVjb2RpbmdfZXJyZWQgPSAwOworICAgIHRvay0+cmVhZF9jb2Rpbmdfc3BlYyA9IDA7CisgICAgdG9rLT5lbmNvZGluZyA9IE5VTEw7CisgICAgdG9rLT5jb250X2xpbmUgPSAwOwogI2lmbmRlZiBQR0VOCi0JdG9rLT5kZWNvZGluZ19yZWFkbGluZSA9IE5VTEw7Ci0JdG9rLT5kZWNvZGluZ19idWZmZXIgPSBOVUxMOworICAgIHRvay0+ZGVjb2RpbmdfcmVhZGxpbmUgPSBOVUxMOworICAgIHRvay0+ZGVjb2RpbmdfYnVmZmVyID0gTlVMTDsKICNlbmRpZgotCXJldHVybiB0b2s7CisgICAgcmV0dXJuIHRvazsKIH0KIAogI2lmZGVmIFBHRU4KQEAgLTEzNSwxOSArMTM1LDE5IEBACiBzdGF0aWMgY2hhciAqCiBkZWNvZGluZ19mZ2V0cyhjaGFyICpzLCBpbnQgc2l6ZSwgc3RydWN0IHRva19zdGF0ZSAqdG9rKQogewotCXJldHVybiBmZ2V0cyhzLCBzaXplLCB0b2stPmZwKTsKKyAgICByZXR1cm4gZmdldHMocywgc2l6ZSwgdG9rLT5mcCk7CiB9CiAKIHN0YXRpYyBpbnQKIGRlY29kaW5nX2Zlb2Yoc3RydWN0IHRva19zdGF0ZSAqdG9rKQogewotCXJldHVybiBmZW9mKHRvay0+ZnApOworICAgIHJldHVybiBmZW9mKHRvay0+ZnApOwogfQogCiBzdGF0aWMgY29uc3QgY2hhciAqCiBkZWNvZGVfc3RyKGNvbnN0IGNoYXIgKnN0ciwgc3RydWN0IHRva19zdGF0ZSAqdG9rKQogewotCXJldHVybiBzdHI7CisgICAgcmV0dXJuIHN0cjsKIH0KIAogI2Vsc2UgLyogUEdFTiAqLwpAQCAtMTU1LDQ1ICsxNTUsNDUgQEAKIHN0YXRpYyBjaGFyICoKIGVycm9yX3JldChzdHJ1Y3QgdG9rX3N0YXRlICp0b2spIC8qIFhYWCAqLwogewotCXRvay0+ZGVjb2RpbmdfZXJyZWQgPSAxOwotCWlmICh0b2stPmZwICE9IE5VTEwgJiYgdG9rLT5idWYgIT0gTlVMTCkgLyogc2VlIFB5VG9rZW5pemVyX0ZyZWUgKi8KLQkJUHlNZW1fRlJFRSh0b2stPmJ1Zik7Ci0JdG9rLT5idWYgPSBOVUxMOwotCXJldHVybiBOVUxMOwkJLyogYXMgaWYgaXQgd2VyZSBFT0YgKi8KKyAgICB0b2stPmRlY29kaW5nX2VycmVkID0gMTsKKyAgICBpZiAodG9rLT5mcCAhPSBOVUxMICYmIHRvay0+YnVmICE9IE5VTEwpIC8qIHNlZSBQeVRva2VuaXplcl9GcmVlICovCisgICAgICAgIFB5TWVtX0ZSRUUodG9rLT5idWYpOworICAgIHRvay0+YnVmID0gTlVMTDsKKyAgICByZXR1cm4gTlVMTDsgICAgICAgICAgICAgICAgLyogYXMgaWYgaXQgd2VyZSBFT0YgKi8KIH0KIAogc3RhdGljIGNoYXIgKgogbmV3X3N0cmluZyhjb25zdCBjaGFyICpzLCBQeV9zc2l6ZV90IGxlbikKIHsKLQljaGFyKiByZXN1bHQgPSAoY2hhciAqKVB5TWVtX01BTExPQyhsZW4gKyAxKTsKLQlpZiAocmVzdWx0ICE9IE5VTEwpIHsKLQkJbWVtY3B5KHJlc3VsdCwgcywgbGVuKTsKLQkJcmVzdWx0W2xlbl0gPSAnXDAnOwotCX0KLQlyZXR1cm4gcmVzdWx0OworICAgIGNoYXIqIHJlc3VsdCA9IChjaGFyICopUHlNZW1fTUFMTE9DKGxlbiArIDEpOworICAgIGlmIChyZXN1bHQgIT0gTlVMTCkgeworICAgICAgICBtZW1jcHkocmVzdWx0LCBzLCBsZW4pOworICAgICAgICByZXN1bHRbbGVuXSA9ICdcMCc7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBjaGFyICoKLWdldF9ub3JtYWxfbmFtZShjaGFyICpzKQkvKiBmb3IgdXRmLTggYW5kIGxhdGluLTEgKi8KK2dldF9ub3JtYWxfbmFtZShjaGFyICpzKSAgICAgICAgLyogZm9yIHV0Zi04IGFuZCBsYXRpbi0xICovCiB7Ci0JY2hhciBidWZbMTNdOwotCWludCBpOwotCWZvciAoaSA9IDA7IGkgPCAxMjsgaSsrKSB7Ci0JCWludCBjID0gc1tpXTsKLQkJaWYgKGMgPT0gJ1wwJykgYnJlYWs7Ci0JCWVsc2UgaWYgKGMgPT0gJ18nKSBidWZbaV0gPSAnLSc7Ci0JCWVsc2UgYnVmW2ldID0gdG9sb3dlcihjKTsKLQl9Ci0JYnVmW2ldID0gJ1wwJzsKLQlpZiAoc3RyY21wKGJ1ZiwgInV0Zi04IikgPT0gMCB8fAotCSAgICBzdHJuY21wKGJ1ZiwgInV0Zi04LSIsIDYpID09IDApIHJldHVybiAidXRmLTgiOwotCWVsc2UgaWYgKHN0cmNtcChidWYsICJsYXRpbi0xIikgPT0gMCB8fAotCQkgc3RyY21wKGJ1ZiwgImlzby04ODU5LTEiKSA9PSAwIHx8Ci0JCSBzdHJjbXAoYnVmLCAiaXNvLWxhdGluLTEiKSA9PSAwIHx8Ci0JCSBzdHJuY21wKGJ1ZiwgImxhdGluLTEtIiwgOCkgPT0gMCB8fAotCQkgc3RybmNtcChidWYsICJpc28tODg1OS0xLSIsIDExKSA9PSAwIHx8Ci0JCSBzdHJuY21wKGJ1ZiwgImlzby1sYXRpbi0xLSIsIDEyKSA9PSAwKSByZXR1cm4gImlzby04ODU5LTEiOwotCWVsc2UgcmV0dXJuIHM7CisgICAgY2hhciBidWZbMTNdOworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCAxMjsgaSsrKSB7CisgICAgICAgIGludCBjID0gc1tpXTsKKyAgICAgICAgaWYgKGMgPT0gJ1wwJykgYnJlYWs7CisgICAgICAgIGVsc2UgaWYgKGMgPT0gJ18nKSBidWZbaV0gPSAnLSc7CisgICAgICAgIGVsc2UgYnVmW2ldID0gdG9sb3dlcihjKTsKKyAgICB9CisgICAgYnVmW2ldID0gJ1wwJzsKKyAgICBpZiAoc3RyY21wKGJ1ZiwgInV0Zi04IikgPT0gMCB8fAorICAgICAgICBzdHJuY21wKGJ1ZiwgInV0Zi04LSIsIDYpID09IDApIHJldHVybiAidXRmLTgiOworICAgIGVsc2UgaWYgKHN0cmNtcChidWYsICJsYXRpbi0xIikgPT0gMCB8fAorICAgICAgICAgICAgIHN0cmNtcChidWYsICJpc28tODg1OS0xIikgPT0gMCB8fAorICAgICAgICAgICAgIHN0cmNtcChidWYsICJpc28tbGF0aW4tMSIpID09IDAgfHwKKyAgICAgICAgICAgICBzdHJuY21wKGJ1ZiwgImxhdGluLTEtIiwgOCkgPT0gMCB8fAorICAgICAgICAgICAgIHN0cm5jbXAoYnVmLCAiaXNvLTg4NTktMS0iLCAxMSkgPT0gMCB8fAorICAgICAgICAgICAgIHN0cm5jbXAoYnVmLCAiaXNvLWxhdGluLTEtIiwgMTIpID09IDApIHJldHVybiAiaXNvLTg4NTktMSI7CisgICAgZWxzZSByZXR1cm4gczsKIH0KIAogLyogUmV0dXJuIHRoZSBjb2Rpbmcgc3BlYyBpbiBTLCBvciBOVUxMIGlmIG5vbmUgaXMgZm91bmQuICAqLwpAQCAtMjAxLDQzICsyMDEsNDMgQEAKIHN0YXRpYyBjaGFyICoKIGdldF9jb2Rpbmdfc3BlYyhjb25zdCBjaGFyICpzLCBQeV9zc2l6ZV90IHNpemUpCiB7Ci0JUHlfc3NpemVfdCBpOwotCS8qIENvZGluZyBzcGVjIG11c3QgYmUgaW4gYSBjb21tZW50LCBhbmQgdGhhdCBjb21tZW50IG11c3QgYmUKLSAgICAgICAgICogdGhlIG9ubHkgc3RhdGVtZW50IG9uIHRoZSBzb3VyY2UgY29kZSBsaW5lLiAqLwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZSAtIDY7IGkrKykgewotCQlpZiAoc1tpXSA9PSAnIycpCi0JCQlicmVhazsKLQkJaWYgKHNbaV0gIT0gJyAnICYmIHNbaV0gIT0gJ1x0JyAmJiBzW2ldICE9ICdcMDE0JykKLQkJCXJldHVybiBOVUxMOwotCX0KLQlmb3IgKDsgaSA8IHNpemUgLSA2OyBpKyspIHsgLyogWFhYIGluZWZmaWNpZW50IHNlYXJjaCAqLwotCQljb25zdCBjaGFyKiB0ID0gcyArIGk7Ci0JCWlmIChzdHJuY21wKHQsICJjb2RpbmciLCA2KSA9PSAwKSB7Ci0JCQljb25zdCBjaGFyKiBiZWdpbiA9IE5VTEw7Ci0JCQl0ICs9IDY7Ci0JCQlpZiAodFswXSAhPSAnOicgJiYgdFswXSAhPSAnPScpCi0JCQkJY29udGludWU7Ci0JCQlkbyB7Ci0JCQkJdCsrOwotCQkJfSB3aGlsZSAodFswXSA9PSAnXHgyMCcgfHwgdFswXSA9PSAnXHQnKTsKKyAgICBQeV9zc2l6ZV90IGk7CisgICAgLyogQ29kaW5nIHNwZWMgbXVzdCBiZSBpbiBhIGNvbW1lbnQsIGFuZCB0aGF0IGNvbW1lbnQgbXVzdCBiZQorICAgICAqIHRoZSBvbmx5IHN0YXRlbWVudCBvbiB0aGUgc291cmNlIGNvZGUgbGluZS4gKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZSAtIDY7IGkrKykgeworICAgICAgICBpZiAoc1tpXSA9PSAnIycpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYgKHNbaV0gIT0gJyAnICYmIHNbaV0gIT0gJ1x0JyAmJiBzW2ldICE9ICdcMDE0JykKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBmb3IgKDsgaSA8IHNpemUgLSA2OyBpKyspIHsgLyogWFhYIGluZWZmaWNpZW50IHNlYXJjaCAqLworICAgICAgICBjb25zdCBjaGFyKiB0ID0gcyArIGk7CisgICAgICAgIGlmIChzdHJuY21wKHQsICJjb2RpbmciLCA2KSA9PSAwKSB7CisgICAgICAgICAgICBjb25zdCBjaGFyKiBiZWdpbiA9IE5VTEw7CisgICAgICAgICAgICB0ICs9IDY7CisgICAgICAgICAgICBpZiAodFswXSAhPSAnOicgJiYgdFswXSAhPSAnPScpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgdCsrOworICAgICAgICAgICAgfSB3aGlsZSAodFswXSA9PSAnXHgyMCcgfHwgdFswXSA9PSAnXHQnKTsKIAotCQkJYmVnaW4gPSB0OwotCQkJd2hpbGUgKGlzYWxudW0oUHlfQ0hBUk1BU0sodFswXSkpIHx8Ci0JCQkgICAgICAgdFswXSA9PSAnLScgfHwgdFswXSA9PSAnXycgfHwgdFswXSA9PSAnLicpCi0JCQkJdCsrOworICAgICAgICAgICAgYmVnaW4gPSB0OworICAgICAgICAgICAgd2hpbGUgKGlzYWxudW0oUHlfQ0hBUk1BU0sodFswXSkpIHx8CisgICAgICAgICAgICAgICAgICAgdFswXSA9PSAnLScgfHwgdFswXSA9PSAnXycgfHwgdFswXSA9PSAnLicpCisgICAgICAgICAgICAgICAgdCsrOwogCi0JCQlpZiAoYmVnaW4gPCB0KSB7Ci0JCQkJY2hhciogciA9IG5ld19zdHJpbmcoYmVnaW4sIHQgLSBiZWdpbik7Ci0JCQkJY2hhciogcSA9IGdldF9ub3JtYWxfbmFtZShyKTsKLQkJCQlpZiAociAhPSBxKSB7Ci0JCQkJCVB5TWVtX0ZSRUUocik7Ci0JCQkJCXIgPSBuZXdfc3RyaW5nKHEsIHN0cmxlbihxKSk7Ci0JCQkJfQotCQkJCXJldHVybiByOwotCQkJfQotCQl9Ci0JfQotCXJldHVybiBOVUxMOworICAgICAgICAgICAgaWYgKGJlZ2luIDwgdCkgeworICAgICAgICAgICAgICAgIGNoYXIqIHIgPSBuZXdfc3RyaW5nKGJlZ2luLCB0IC0gYmVnaW4pOworICAgICAgICAgICAgICAgIGNoYXIqIHEgPSBnZXRfbm9ybWFsX25hbWUocik7CisgICAgICAgICAgICAgICAgaWYgKHIgIT0gcSkgeworICAgICAgICAgICAgICAgICAgICBQeU1lbV9GUkVFKHIpOworICAgICAgICAgICAgICAgICAgICByID0gbmV3X3N0cmluZyhxLCBzdHJsZW4ocSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTlVMTDsKIH0KIAogLyogQ2hlY2sgd2hldGhlciB0aGUgbGluZSBjb250YWlucyBhIGNvZGluZyBzcGVjLiBJZiBpdCBkb2VzLApAQCAtMjQ3LDUxICsyNDcsNTEgQEAKIAogc3RhdGljIGludAogY2hlY2tfY29kaW5nX3NwZWMoY29uc3QgY2hhciogbGluZSwgUHlfc3NpemVfdCBzaXplLCBzdHJ1Y3QgdG9rX3N0YXRlICp0b2ssCi0JCSAgaW50IHNldF9yZWFkbGluZShzdHJ1Y3QgdG9rX3N0YXRlICosIGNvbnN0IGNoYXIgKikpCisgICAgICAgICAgICAgICAgICBpbnQgc2V0X3JlYWRsaW5lKHN0cnVjdCB0b2tfc3RhdGUgKiwgY29uc3QgY2hhciAqKSkKIHsKLQljaGFyICogY3M7Ci0JaW50IHIgPSAxOworICAgIGNoYXIgKiBjczsKKyAgICBpbnQgciA9IDE7CiAKLSAgICAgICAgaWYgKHRvay0+Y29udF9saW5lKQotCQkvKiBJdCdzIGEgY29udGludWF0aW9uIGxpbmUsIHNvIGl0IGNhbid0IGJlIGEgY29kaW5nIHNwZWMuICovCi0JCXJldHVybiAxOwotCWNzID0gZ2V0X2NvZGluZ19zcGVjKGxpbmUsIHNpemUpOwotCWlmIChjcyAhPSBOVUxMKSB7Ci0JCXRvay0+cmVhZF9jb2Rpbmdfc3BlYyA9IDE7Ci0JCWlmICh0b2stPmVuY29kaW5nID09IE5VTEwpIHsKLQkJCWFzc2VydCh0b2stPmRlY29kaW5nX3N0YXRlID09IDEpOyAvKiByYXcgKi8KLQkJCWlmIChzdHJjbXAoY3MsICJ1dGYtOCIpID09IDAgfHwKLQkJCSAgICBzdHJjbXAoY3MsICJpc28tODg1OS0xIikgPT0gMCkgewotCQkJCXRvay0+ZW5jb2RpbmcgPSBjczsKLQkJCX0gZWxzZSB7CisgICAgaWYgKHRvay0+Y29udF9saW5lKQorICAgICAgICAvKiBJdCdzIGEgY29udGludWF0aW9uIGxpbmUsIHNvIGl0IGNhbid0IGJlIGEgY29kaW5nIHNwZWMuICovCisgICAgICAgIHJldHVybiAxOworICAgIGNzID0gZ2V0X2NvZGluZ19zcGVjKGxpbmUsIHNpemUpOworICAgIGlmIChjcyAhPSBOVUxMKSB7CisgICAgICAgIHRvay0+cmVhZF9jb2Rpbmdfc3BlYyA9IDE7CisgICAgICAgIGlmICh0b2stPmVuY29kaW5nID09IE5VTEwpIHsKKyAgICAgICAgICAgIGFzc2VydCh0b2stPmRlY29kaW5nX3N0YXRlID09IDEpOyAvKiByYXcgKi8KKyAgICAgICAgICAgIGlmIChzdHJjbXAoY3MsICJ1dGYtOCIpID09IDAgfHwKKyAgICAgICAgICAgICAgICBzdHJjbXAoY3MsICJpc28tODg1OS0xIikgPT0gMCkgeworICAgICAgICAgICAgICAgIHRvay0+ZW5jb2RpbmcgPSBjczsKKyAgICAgICAgICAgIH0gZWxzZSB7CiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCQkJCXIgPSBzZXRfcmVhZGxpbmUodG9rLCBjcyk7Ci0JCQkJaWYgKHIpIHsKLQkJCQkJdG9rLT5lbmNvZGluZyA9IGNzOwotCQkJCQl0b2stPmRlY29kaW5nX3N0YXRlID0gLTE7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQkJUHlNZW1fRlJFRShjcyk7CisgICAgICAgICAgICAgICAgciA9IHNldF9yZWFkbGluZSh0b2ssIGNzKTsKKyAgICAgICAgICAgICAgICBpZiAocikgeworICAgICAgICAgICAgICAgICAgICB0b2stPmVuY29kaW5nID0gY3M7CisgICAgICAgICAgICAgICAgICAgIHRvay0+ZGVjb2Rpbmdfc3RhdGUgPSAtMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBQeU1lbV9GUkVFKGNzKTsKICNlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdpdGhvdXQgVW5pY29kZSBzdXBwb3J0LCB3ZSBjYW5ub3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2VzcyB0aGUgY29kaW5nIHNwZWMuIFNpbmNlIHRoZXJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvbid0IGJlIGFueSBVbmljb2RlIGxpdGVyYWxzLCB0aGF0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvbid0IG1hdHRlci4gKi8KLQkJCQlQeU1lbV9GUkVFKGNzKTsKKyAgICAgICAgICAgICAgICAvKiBXaXRob3V0IFVuaWNvZGUgc3VwcG9ydCwgd2UgY2Fubm90CisgICAgICAgICAgICAgICAgICAgcHJvY2VzcyB0aGUgY29kaW5nIHNwZWMuIFNpbmNlIHRoZXJlCisgICAgICAgICAgICAgICAgICAgd29uJ3QgYmUgYW55IFVuaWNvZGUgbGl0ZXJhbHMsIHRoYXQKKyAgICAgICAgICAgICAgICAgICB3b24ndCBtYXR0ZXIuICovCisgICAgICAgICAgICAgICAgUHlNZW1fRlJFRShjcyk7CiAjZW5kaWYKLQkJCX0KLQkJfSBlbHNlIHsJLyogdGhlbiwgY29tcGFyZSBjcyB3aXRoIEJPTSAqLwotCQkJciA9IChzdHJjbXAodG9rLT5lbmNvZGluZywgY3MpID09IDApOwotCQkJUHlNZW1fRlJFRShjcyk7Ci0JCX0KLQl9Ci0JaWYgKCFyKSB7Ci0JCWNzID0gdG9rLT5lbmNvZGluZzsKLQkJaWYgKCFjcykKLQkJCWNzID0gIndpdGggQk9NIjsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1N5bnRheEVycm9yLCAiZW5jb2RpbmcgcHJvYmxlbTogJXMiLCBjcyk7Ci0JfQotCXJldHVybiByOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAvKiB0aGVuLCBjb21wYXJlIGNzIHdpdGggQk9NICovCisgICAgICAgICAgICByID0gKHN0cmNtcCh0b2stPmVuY29kaW5nLCBjcykgPT0gMCk7CisgICAgICAgICAgICBQeU1lbV9GUkVFKGNzKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIXIpIHsKKyAgICAgICAgY3MgPSB0b2stPmVuY29kaW5nOworICAgICAgICBpZiAoIWNzKQorICAgICAgICAgICAgY3MgPSAid2l0aCBCT00iOworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfU3ludGF4RXJyb3IsICJlbmNvZGluZyBwcm9ibGVtOiAlcyIsIGNzKTsKKyAgICB9CisgICAgcmV0dXJuIHI7CiB9CiAKIC8qIFNlZSB3aGV0aGVyIHRoZSBmaWxlIHN0YXJ0cyB3aXRoIGEgQk9NLiBJZiBpdCBkb2VzLApAQCAtMzAwLDYxICszMDAsNjEgQEAKIAogc3RhdGljIGludAogY2hlY2tfYm9tKGludCBnZXRfY2hhcihzdHJ1Y3QgdG9rX3N0YXRlICopLAotCSAgdm9pZCB1bmdldF9jaGFyKGludCwgc3RydWN0IHRva19zdGF0ZSAqKSwKLQkgIGludCBzZXRfcmVhZGxpbmUoc3RydWN0IHRva19zdGF0ZSAqLCBjb25zdCBjaGFyICopLAotCSAgc3RydWN0IHRva19zdGF0ZSAqdG9rKQorICAgICAgICAgIHZvaWQgdW5nZXRfY2hhcihpbnQsIHN0cnVjdCB0b2tfc3RhdGUgKiksCisgICAgICAgICAgaW50IHNldF9yZWFkbGluZShzdHJ1Y3QgdG9rX3N0YXRlICosIGNvbnN0IGNoYXIgKiksCisgICAgICAgICAgc3RydWN0IHRva19zdGF0ZSAqdG9rKQogewotCWludCBjaDEsIGNoMiwgY2gzOwotCWNoMSA9IGdldF9jaGFyKHRvayk7Ci0JdG9rLT5kZWNvZGluZ19zdGF0ZSA9IDE7Ci0JaWYgKGNoMSA9PSBFT0YpIHsKLQkJcmV0dXJuIDE7Ci0JfSBlbHNlIGlmIChjaDEgPT0gMHhFRikgewotCQljaDIgPSBnZXRfY2hhcih0b2spOwotCQlpZiAoY2gyICE9IDB4QkIpIHsKLQkJCXVuZ2V0X2NoYXIoY2gyLCB0b2spOwotCQkJdW5nZXRfY2hhcihjaDEsIHRvayk7Ci0JCQlyZXR1cm4gMTsKLQkJfQotCQljaDMgPSBnZXRfY2hhcih0b2spOwotCQlpZiAoY2gzICE9IDB4QkYpIHsKLQkJCXVuZ2V0X2NoYXIoY2gzLCB0b2spOwotCQkJdW5nZXRfY2hhcihjaDIsIHRvayk7Ci0JCQl1bmdldF9jaGFyKGNoMSwgdG9rKTsKLQkJCXJldHVybiAxOwotCQl9CisgICAgaW50IGNoMSwgY2gyLCBjaDM7CisgICAgY2gxID0gZ2V0X2NoYXIodG9rKTsKKyAgICB0b2stPmRlY29kaW5nX3N0YXRlID0gMTsKKyAgICBpZiAoY2gxID09IEVPRikgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9IGVsc2UgaWYgKGNoMSA9PSAweEVGKSB7CisgICAgICAgIGNoMiA9IGdldF9jaGFyKHRvayk7CisgICAgICAgIGlmIChjaDIgIT0gMHhCQikgeworICAgICAgICAgICAgdW5nZXRfY2hhcihjaDIsIHRvayk7CisgICAgICAgICAgICB1bmdldF9jaGFyKGNoMSwgdG9rKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgIGNoMyA9IGdldF9jaGFyKHRvayk7CisgICAgICAgIGlmIChjaDMgIT0gMHhCRikgeworICAgICAgICAgICAgdW5nZXRfY2hhcihjaDMsIHRvayk7CisgICAgICAgICAgICB1bmdldF9jaGFyKGNoMiwgdG9rKTsKKyAgICAgICAgICAgIHVuZ2V0X2NoYXIoY2gxLCB0b2spOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KICNpZiAwCi0JLyogRGlzYWJsZSBzdXBwb3J0IGZvciBVVEYtMTYgQk9NcyB1bnRpbCBhIGRlY2lzaW9uCi0JICAgaXMgbWFkZSB3aGV0aGVyIHRoaXMgbmVlZHMgdG8gYmUgc3VwcG9ydGVkLiAgKi8KLQl9IGVsc2UgaWYgKGNoMSA9PSAweEZFKSB7Ci0JCWNoMiA9IGdldF9jaGFyKHRvayk7Ci0JCWlmIChjaDIgIT0gMHhGRikgewotCQkJdW5nZXRfY2hhcihjaDIsIHRvayk7Ci0JCQl1bmdldF9jaGFyKGNoMSwgdG9rKTsKLQkJCXJldHVybiAxOwotCQl9Ci0JCWlmICghc2V0X3JlYWRsaW5lKHRvaywgInV0Zi0xNi1iZSIpKQotCQkJcmV0dXJuIDA7Ci0JCXRvay0+ZGVjb2Rpbmdfc3RhdGUgPSAtMTsKLQl9IGVsc2UgaWYgKGNoMSA9PSAweEZGKSB7Ci0JCWNoMiA9IGdldF9jaGFyKHRvayk7Ci0JCWlmIChjaDIgIT0gMHhGRSkgewotCQkJdW5nZXRfY2hhcihjaDIsIHRvayk7Ci0JCQl1bmdldF9jaGFyKGNoMSwgdG9rKTsKLQkJCXJldHVybiAxOwotCQl9Ci0JCWlmICghc2V0X3JlYWRsaW5lKHRvaywgInV0Zi0xNi1sZSIpKQotCQkJcmV0dXJuIDA7Ci0JCXRvay0+ZGVjb2Rpbmdfc3RhdGUgPSAtMTsKKyAgICAvKiBEaXNhYmxlIHN1cHBvcnQgZm9yIFVURi0xNiBCT01zIHVudGlsIGEgZGVjaXNpb24KKyAgICAgICBpcyBtYWRlIHdoZXRoZXIgdGhpcyBuZWVkcyB0byBiZSBzdXBwb3J0ZWQuICAqLworICAgIH0gZWxzZSBpZiAoY2gxID09IDB4RkUpIHsKKyAgICAgICAgY2gyID0gZ2V0X2NoYXIodG9rKTsKKyAgICAgICAgaWYgKGNoMiAhPSAweEZGKSB7CisgICAgICAgICAgICB1bmdldF9jaGFyKGNoMiwgdG9rKTsKKyAgICAgICAgICAgIHVuZ2V0X2NoYXIoY2gxLCB0b2spOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFzZXRfcmVhZGxpbmUodG9rLCAidXRmLTE2LWJlIikpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgdG9rLT5kZWNvZGluZ19zdGF0ZSA9IC0xOworICAgIH0gZWxzZSBpZiAoY2gxID09IDB4RkYpIHsKKyAgICAgICAgY2gyID0gZ2V0X2NoYXIodG9rKTsKKyAgICAgICAgaWYgKGNoMiAhPSAweEZFKSB7CisgICAgICAgICAgICB1bmdldF9jaGFyKGNoMiwgdG9rKTsKKyAgICAgICAgICAgIHVuZ2V0X2NoYXIoY2gxLCB0b2spOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFzZXRfcmVhZGxpbmUodG9rLCAidXRmLTE2LWxlIikpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgdG9rLT5kZWNvZGluZ19zdGF0ZSA9IC0xOwogI2VuZGlmCi0JfSBlbHNlIHsKLQkJdW5nZXRfY2hhcihjaDEsIHRvayk7Ci0JCXJldHVybiAxOwotCX0KLQlpZiAodG9rLT5lbmNvZGluZyAhPSBOVUxMKQotCQlQeU1lbV9GUkVFKHRvay0+ZW5jb2RpbmcpOwotCXRvay0+ZW5jb2RpbmcgPSBuZXdfc3RyaW5nKCJ1dGYtOCIsIDUpOwkvKiByZXN1bHRpbmcgaXMgaW4gdXRmLTggKi8KLQlyZXR1cm4gMTsKKyAgICB9IGVsc2UgeworICAgICAgICB1bmdldF9jaGFyKGNoMSwgdG9rKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmICh0b2stPmVuY29kaW5nICE9IE5VTEwpCisgICAgICAgIFB5TWVtX0ZSRUUodG9rLT5lbmNvZGluZyk7CisgICAgdG9rLT5lbmNvZGluZyA9IG5ld19zdHJpbmcoInV0Zi04IiwgNSk7ICAgICAvKiByZXN1bHRpbmcgaXMgaW4gdXRmLTggKi8KKyAgICByZXR1cm4gMTsKIH0KIAogLyogUmVhZCBhIGxpbmUgb2YgdGV4dCBmcm9tIFRPSyBpbnRvIFMsIHVzaW5nIHRoZSBzdHJlYW0gaW4gVE9LLgpAQCAtMzYzLDYyICszNjMsNjIgQEAKICAgIE9uIGVudHJ5LCB0b2stPmRlY29kaW5nX2J1ZmZlciB3aWxsIGJlIG9uZSBvZjoKICAgICAgMSkgTlVMTDogbmVlZCB0byBjYWxsIHRvay0+ZGVjb2RpbmdfcmVhZGxpbmUgdG8gZ2V0IGEgbmV3IGxpbmUKICAgICAgMikgUHlVbmljb2RlT2JqZWN0ICo6IGRlY29kaW5nX2Zlb2YgaGFzIGNhbGxlZCB0b2stPmRlY29kaW5nX3JlYWRsaW5lIGFuZAotICAgICAgICAgICBzdG9yZWQgdGhlIHJlc3VsdCBpbiB0b2stPmRlY29kaW5nX2J1ZmZlcgorICAgICAgIHN0b3JlZCB0aGUgcmVzdWx0IGluIHRvay0+ZGVjb2RpbmdfYnVmZmVyCiAgICAgIDMpIFB5U3RyaW5nT2JqZWN0ICo6IHByZXZpb3VzIGNhbGwgdG8gZnBfcmVhZGwgZGlkIG5vdCBoYXZlIGVub3VnaCByb29tCi0gICAgICAgICAgIChpbiB0aGUgcyBidWZmZXIpIHRvIGNvcHkgZW50aXJlIGNvbnRlbnRzIG9mIHRoZSBsaW5lIHJlYWQKLSAgICAgICAgICAgYnkgdG9rLT5kZWNvZGluZ19yZWFkbGluZS4gIHRvay0+ZGVjb2RpbmdfYnVmZmVyIGhhcyB0aGUgb3ZlcmZsb3cuCi0gICAgICAgICAgIEluIHRoaXMgY2FzZSwgZnBfcmVhZGwgaXMgY2FsbGVkIGluIGEgbG9vcCAod2l0aCBhbiBleHBhbmRlZCBidWZmZXIpCi0gICAgICAgICAgIHVudGlsIHRoZSBidWZmZXIgZW5kcyB3aXRoIGEgJ1xuJyAob3IgdW50aWwgdGhlIGVuZCBvZiB0aGUgZmlsZSBpcwotICAgICAgICAgICByZWFjaGVkKTogc2VlIHRva19uZXh0YyBhbmQgaXRzIGNhbGxzIHRvIGRlY29kaW5nX2ZnZXRzLgorICAgICAgIChpbiB0aGUgcyBidWZmZXIpIHRvIGNvcHkgZW50aXJlIGNvbnRlbnRzIG9mIHRoZSBsaW5lIHJlYWQKKyAgICAgICBieSB0b2stPmRlY29kaW5nX3JlYWRsaW5lLiAgdG9rLT5kZWNvZGluZ19idWZmZXIgaGFzIHRoZSBvdmVyZmxvdy4KKyAgICAgICBJbiB0aGlzIGNhc2UsIGZwX3JlYWRsIGlzIGNhbGxlZCBpbiBhIGxvb3AgKHdpdGggYW4gZXhwYW5kZWQgYnVmZmVyKQorICAgICAgIHVudGlsIHRoZSBidWZmZXIgZW5kcyB3aXRoIGEgJ1xuJyAob3IgdW50aWwgdGhlIGVuZCBvZiB0aGUgZmlsZSBpcworICAgICAgIHJlYWNoZWQpOiBzZWUgdG9rX25leHRjIGFuZCBpdHMgY2FsbHMgdG8gZGVjb2RpbmdfZmdldHMuCiAqLwogCiBzdGF0aWMgY2hhciAqCiBmcF9yZWFkbChjaGFyICpzLCBpbnQgc2l6ZSwgc3RydWN0IHRva19zdGF0ZSAqdG9rKQogewogI2lmbmRlZiBQeV9VU0lOR19VTklDT0RFCi0JLyogSW4gYSBub24tVW5pY29kZSBidWlsdCwgdGhpcyBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkLiAqLwotCVB5X0ZhdGFsRXJyb3IoImZwX3JlYWRsIHNob3VsZCBub3QgYmUgY2FsbGVkIGluIHRoaXMgYnVpbGQuIik7Ci0JcmV0dXJuIE5VTEw7IC8qIEtlZXAgY29tcGlsZXIgaGFwcHkgKG5vdCByZWFjaGFibGUpICovCisgICAgLyogSW4gYSBub24tVW5pY29kZSBidWlsdCwgdGhpcyBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkLiAqLworICAgIFB5X0ZhdGFsRXJyb3IoImZwX3JlYWRsIHNob3VsZCBub3QgYmUgY2FsbGVkIGluIHRoaXMgYnVpbGQuIik7CisgICAgcmV0dXJuIE5VTEw7IC8qIEtlZXAgY29tcGlsZXIgaGFwcHkgKG5vdCByZWFjaGFibGUpICovCiAjZWxzZQotCVB5T2JqZWN0KiB1dGY4ID0gTlVMTDsKLQlQeU9iamVjdCogYnVmID0gdG9rLT5kZWNvZGluZ19idWZmZXI7Ci0JY2hhciAqc3RyOwotCVB5X3NzaXplX3QgdXRmOGxlbjsKKyAgICBQeU9iamVjdCogdXRmOCA9IE5VTEw7CisgICAgUHlPYmplY3QqIGJ1ZiA9IHRvay0+ZGVjb2RpbmdfYnVmZmVyOworICAgIGNoYXIgKnN0cjsKKyAgICBQeV9zc2l6ZV90IHV0ZjhsZW47CiAKLQkvKiBBc2sgZm9yIG9uZSBsZXNzIGJ5dGUgc28gd2UgY2FuIHRlcm1pbmF0ZSBpdCAqLwotCWFzc2VydChzaXplID4gMCk7Ci0Jc2l6ZS0tOworICAgIC8qIEFzayBmb3Igb25lIGxlc3MgYnl0ZSBzbyB3ZSBjYW4gdGVybWluYXRlIGl0ICovCisgICAgYXNzZXJ0KHNpemUgPiAwKTsKKyAgICBzaXplLS07CiAKLQlpZiAoYnVmID09IE5VTEwpIHsKLQkJYnVmID0gUHlPYmplY3RfQ2FsbE9iamVjdCh0b2stPmRlY29kaW5nX3JlYWRsaW5lLCBOVUxMKTsKLQkJaWYgKGJ1ZiA9PSBOVUxMKQotCQkJcmV0dXJuIGVycm9yX3JldCh0b2spOwotCX0gZWxzZSB7Ci0JCXRvay0+ZGVjb2RpbmdfYnVmZmVyID0gTlVMTDsKLQkJaWYgKFB5U3RyaW5nX0NoZWNrRXhhY3QoYnVmKSkKLQkJCXV0ZjggPSBidWY7Ci0JfQotCWlmICh1dGY4ID09IE5VTEwpIHsKLQkJdXRmOCA9IFB5VW5pY29kZV9Bc1VURjhTdHJpbmcoYnVmKTsKLQkJUHlfREVDUkVGKGJ1Zik7Ci0JCWlmICh1dGY4ID09IE5VTEwpCi0JCQlyZXR1cm4gZXJyb3JfcmV0KHRvayk7Ci0JfQotCXN0ciA9IFB5U3RyaW5nX0FzU3RyaW5nKHV0ZjgpOwotCXV0ZjhsZW4gPSBQeVN0cmluZ19HRVRfU0laRSh1dGY4KTsKLQlpZiAodXRmOGxlbiA+IHNpemUpIHsKLQkJdG9rLT5kZWNvZGluZ19idWZmZXIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzdHIrc2l6ZSwgdXRmOGxlbi1zaXplKTsKLQkJaWYgKHRvay0+ZGVjb2RpbmdfYnVmZmVyID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRih1dGY4KTsKLQkJCXJldHVybiBlcnJvcl9yZXQodG9rKTsKLQkJfQotCQl1dGY4bGVuID0gc2l6ZTsKLQl9Ci0JbWVtY3B5KHMsIHN0ciwgdXRmOGxlbik7Ci0Jc1t1dGY4bGVuXSA9ICdcMCc7Ci0JUHlfREVDUkVGKHV0ZjgpOwotCWlmICh1dGY4bGVuID09IDApIHJldHVybiBOVUxMOyAvKiBFT0YgKi8KLQlyZXR1cm4gczsKKyAgICBpZiAoYnVmID09IE5VTEwpIHsKKyAgICAgICAgYnVmID0gUHlPYmplY3RfQ2FsbE9iamVjdCh0b2stPmRlY29kaW5nX3JlYWRsaW5lLCBOVUxMKTsKKyAgICAgICAgaWYgKGJ1ZiA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIGVycm9yX3JldCh0b2spOworICAgIH0gZWxzZSB7CisgICAgICAgIHRvay0+ZGVjb2RpbmdfYnVmZmVyID0gTlVMTDsKKyAgICAgICAgaWYgKFB5U3RyaW5nX0NoZWNrRXhhY3QoYnVmKSkKKyAgICAgICAgICAgIHV0ZjggPSBidWY7CisgICAgfQorICAgIGlmICh1dGY4ID09IE5VTEwpIHsKKyAgICAgICAgdXRmOCA9IFB5VW5pY29kZV9Bc1VURjhTdHJpbmcoYnVmKTsKKyAgICAgICAgUHlfREVDUkVGKGJ1Zik7CisgICAgICAgIGlmICh1dGY4ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gZXJyb3JfcmV0KHRvayk7CisgICAgfQorICAgIHN0ciA9IFB5U3RyaW5nX0FzU3RyaW5nKHV0ZjgpOworICAgIHV0ZjhsZW4gPSBQeVN0cmluZ19HRVRfU0laRSh1dGY4KTsKKyAgICBpZiAodXRmOGxlbiA+IHNpemUpIHsKKyAgICAgICAgdG9rLT5kZWNvZGluZ19idWZmZXIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzdHIrc2l6ZSwgdXRmOGxlbi1zaXplKTsKKyAgICAgICAgaWYgKHRvay0+ZGVjb2RpbmdfYnVmZmVyID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih1dGY4KTsKKyAgICAgICAgICAgIHJldHVybiBlcnJvcl9yZXQodG9rKTsKKyAgICAgICAgfQorICAgICAgICB1dGY4bGVuID0gc2l6ZTsKKyAgICB9CisgICAgbWVtY3B5KHMsIHN0ciwgdXRmOGxlbik7CisgICAgc1t1dGY4bGVuXSA9ICdcMCc7CisgICAgUHlfREVDUkVGKHV0ZjgpOworICAgIGlmICh1dGY4bGVuID09IDApIHJldHVybiBOVUxMOyAvKiBFT0YgKi8KKyAgICByZXR1cm4gczsKICNlbmRpZgogfQogCkBAIC00MzUsMzcgKzQzNSwzNyBAQAogc3RhdGljIGludAogZnBfc2V0cmVhZGwoc3RydWN0IHRva19zdGF0ZSAqdG9rLCBjb25zdCBjaGFyKiBlbmMpCiB7Ci0JUHlPYmplY3QgKnJlYWRlciwgKnN0cmVhbSwgKnJlYWRsaW5lOworICAgIFB5T2JqZWN0ICpyZWFkZXIsICpzdHJlYW0sICpyZWFkbGluZTsKIAotCS8qIFhYWDogY29uc3RpZnkgZmlsZW5hbWUgYXJndW1lbnQuICovCi0Jc3RyZWFtID0gUHlGaWxlX0Zyb21GaWxlKHRvay0+ZnAsIChjaGFyKil0b2stPmZpbGVuYW1lLCAicmIiLCBOVUxMKTsKLQlpZiAoc3RyZWFtID09IE5VTEwpCi0JCXJldHVybiAwOworICAgIC8qIFhYWDogY29uc3RpZnkgZmlsZW5hbWUgYXJndW1lbnQuICovCisgICAgc3RyZWFtID0gUHlGaWxlX0Zyb21GaWxlKHRvay0+ZnAsIChjaGFyKil0b2stPmZpbGVuYW1lLCAicmIiLCBOVUxMKTsKKyAgICBpZiAoc3RyZWFtID09IE5VTEwpCisgICAgICAgIHJldHVybiAwOwogCi0JcmVhZGVyID0gUHlDb2RlY19TdHJlYW1SZWFkZXIoZW5jLCBzdHJlYW0sIE5VTEwpOwotCVB5X0RFQ1JFRihzdHJlYW0pOwotCWlmIChyZWFkZXIgPT0gTlVMTCkKLQkJcmV0dXJuIDA7CisgICAgcmVhZGVyID0gUHlDb2RlY19TdHJlYW1SZWFkZXIoZW5jLCBzdHJlYW0sIE5VTEwpOworICAgIFB5X0RFQ1JFRihzdHJlYW0pOworICAgIGlmIChyZWFkZXIgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIDA7CiAKLQlyZWFkbGluZSA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcocmVhZGVyLCAicmVhZGxpbmUiKTsKLQlQeV9ERUNSRUYocmVhZGVyKTsKLQlpZiAocmVhZGxpbmUgPT0gTlVMTCkKLQkJcmV0dXJuIDA7CisgICAgcmVhZGxpbmUgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHJlYWRlciwgInJlYWRsaW5lIik7CisgICAgUHlfREVDUkVGKHJlYWRlcik7CisgICAgaWYgKHJlYWRsaW5lID09IE5VTEwpCisgICAgICAgIHJldHVybiAwOwogCi0JdG9rLT5kZWNvZGluZ19yZWFkbGluZSA9IHJlYWRsaW5lOwotCXJldHVybiAxOworICAgIHRvay0+ZGVjb2RpbmdfcmVhZGxpbmUgPSByZWFkbGluZTsKKyAgICByZXR1cm4gMTsKIH0KIAogLyogRmV0Y2ggdGhlIG5leHQgYnl0ZSBmcm9tIFRPSy4gKi8KIAogc3RhdGljIGludCBmcF9nZXRjKHN0cnVjdCB0b2tfc3RhdGUgKnRvaykgewotCXJldHVybiBnZXRjKHRvay0+ZnApOworICAgIHJldHVybiBnZXRjKHRvay0+ZnApOwogfQogCiAvKiBVbmZldGNoIHRoZSBsYXN0IGJ5dGUgYmFjayBpbnRvIFRPSy4gICovCiAKIHN0YXRpYyB2b2lkIGZwX3VuZ2V0YyhpbnQgYywgc3RydWN0IHRva19zdGF0ZSAqdG9rKSB7Ci0JdW5nZXRjKGMsIHRvay0+ZnApOworICAgIHVuZ2V0YyhjLCB0b2stPmZwKTsKIH0KIAogLyogUmVhZCBhIGxpbmUgb2YgaW5wdXQgZnJvbSBUT0suIERldGVybWluZSBlbmNvZGluZwpAQCAtNDc0LDk0ICs0NzQsOTQgQEAKIHN0YXRpYyBjaGFyICoKIGRlY29kaW5nX2ZnZXRzKGNoYXIgKnMsIGludCBzaXplLCBzdHJ1Y3QgdG9rX3N0YXRlICp0b2spCiB7Ci0JY2hhciAqbGluZSA9IE5VTEw7Ci0JaW50IGJhZGNoYXIgPSAwOwotCWZvciAoOzspIHsKLQkJaWYgKHRvay0+ZGVjb2Rpbmdfc3RhdGUgPCAwKSB7Ci0JCQkvKiBXZSBhbHJlYWR5IGhhdmUgYSBjb2RlYyBhc3NvY2lhdGVkIHdpdGgKLQkJCSAgIHRoaXMgaW5wdXQuICovCi0JCQlsaW5lID0gZnBfcmVhZGwocywgc2l6ZSwgdG9rKTsKLQkJCWJyZWFrOwotCQl9IGVsc2UgaWYgKHRvay0+ZGVjb2Rpbmdfc3RhdGUgPiAwKSB7Ci0JCQkvKiBXZSB3YW50IGEgJ3JhdycgcmVhZC4gKi8KLQkJCWxpbmUgPSBQeV9Vbml2ZXJzYWxOZXdsaW5lRmdldHMocywgc2l6ZSwKLQkJCQkJCQl0b2stPmZwLCBOVUxMKTsKLQkJCWJyZWFrOwotCQl9IGVsc2UgewotCQkJLyogV2UgaGF2ZSBub3QgeWV0IGRldGVybWluZWQgdGhlIGVuY29kaW5nLgotCQkJICAgSWYgYW4gZW5jb2RpbmcgaXMgZm91bmQsIHVzZSB0aGUgZmlsZS1wb2ludGVyCi0JCQkgICByZWFkZXIgZnVuY3Rpb25zIGZyb20gbm93IG9uLiAqLwotCQkJaWYgKCFjaGVja19ib20oZnBfZ2V0YywgZnBfdW5nZXRjLCBmcF9zZXRyZWFkbCwgdG9rKSkKLQkJCQlyZXR1cm4gZXJyb3JfcmV0KHRvayk7Ci0JCQlhc3NlcnQodG9rLT5kZWNvZGluZ19zdGF0ZSAhPSAwKTsKLQkJfQotCX0KLQlpZiAobGluZSAhPSBOVUxMICYmIHRvay0+bGluZW5vIDwgMiAmJiAhdG9rLT5yZWFkX2NvZGluZ19zcGVjKSB7Ci0JCWlmICghY2hlY2tfY29kaW5nX3NwZWMobGluZSwgc3RybGVuKGxpbmUpLCB0b2ssIGZwX3NldHJlYWRsKSkgewotCQkJcmV0dXJuIGVycm9yX3JldCh0b2spOwotCQl9Ci0JfQorICAgIGNoYXIgKmxpbmUgPSBOVUxMOworICAgIGludCBiYWRjaGFyID0gMDsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGlmICh0b2stPmRlY29kaW5nX3N0YXRlIDwgMCkgeworICAgICAgICAgICAgLyogV2UgYWxyZWFkeSBoYXZlIGEgY29kZWMgYXNzb2NpYXRlZCB3aXRoCisgICAgICAgICAgICAgICB0aGlzIGlucHV0LiAqLworICAgICAgICAgICAgbGluZSA9IGZwX3JlYWRsKHMsIHNpemUsIHRvayk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIGlmICh0b2stPmRlY29kaW5nX3N0YXRlID4gMCkgeworICAgICAgICAgICAgLyogV2Ugd2FudCBhICdyYXcnIHJlYWQuICovCisgICAgICAgICAgICBsaW5lID0gUHlfVW5pdmVyc2FsTmV3bGluZUZnZXRzKHMsIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvay0+ZnAsIE5VTEwpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBXZSBoYXZlIG5vdCB5ZXQgZGV0ZXJtaW5lZCB0aGUgZW5jb2RpbmcuCisgICAgICAgICAgICAgICBJZiBhbiBlbmNvZGluZyBpcyBmb3VuZCwgdXNlIHRoZSBmaWxlLXBvaW50ZXIKKyAgICAgICAgICAgICAgIHJlYWRlciBmdW5jdGlvbnMgZnJvbSBub3cgb24uICovCisgICAgICAgICAgICBpZiAoIWNoZWNrX2JvbShmcF9nZXRjLCBmcF91bmdldGMsIGZwX3NldHJlYWRsLCB0b2spKQorICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcl9yZXQodG9rKTsKKyAgICAgICAgICAgIGFzc2VydCh0b2stPmRlY29kaW5nX3N0YXRlICE9IDApOworICAgICAgICB9CisgICAgfQorICAgIGlmIChsaW5lICE9IE5VTEwgJiYgdG9rLT5saW5lbm8gPCAyICYmICF0b2stPnJlYWRfY29kaW5nX3NwZWMpIHsKKyAgICAgICAgaWYgKCFjaGVja19jb2Rpbmdfc3BlYyhsaW5lLCBzdHJsZW4obGluZSksIHRvaywgZnBfc2V0cmVhZGwpKSB7CisgICAgICAgICAgICByZXR1cm4gZXJyb3JfcmV0KHRvayk7CisgICAgICAgIH0KKyAgICB9CiAjaWZuZGVmIFBHRU4KLQkvKiBUaGUgZGVmYXVsdCBlbmNvZGluZyBpcyBBU0NJSSwgc28gbWFrZSBzdXJlIHdlIGRvbid0IGhhdmUgYW55Ci0gICAgICAgICAgIG5vbi1BU0NJSSBieXRlcyBpbiBpdC4gKi8KLQlpZiAobGluZSAmJiAhdG9rLT5lbmNvZGluZykgewotCQl1bnNpZ25lZCBjaGFyICpjOwotCQlmb3IgKGMgPSAodW5zaWduZWQgY2hhciAqKWxpbmU7ICpjOyBjKyspCi0JCQlpZiAoKmMgPiAxMjcpIHsKLQkJCQliYWRjaGFyID0gKmM7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JfQotCWlmIChiYWRjaGFyKSB7Ci0JCWNoYXIgYnVmWzUwMF07Ci0JCS8qIE5lZWQgdG8gYWRkIDEgdG8gdGhlIGxpbmUgbnVtYmVyLCBzaW5jZSB0aGlzIGxpbmUKLQkJICAgaGFzIG5vdCBiZWVuIGNvdW50ZWQsIHlldC4gICovCi0JCXNwcmludGYoYnVmLAotCQkJIk5vbi1BU0NJSSBjaGFyYWN0ZXIgJ1xceCUuMngnICIKLQkJCSJpbiBmaWxlICUuMjAwcyBvbiBsaW5lICVpLCAiCi0JCQkiYnV0IG5vIGVuY29kaW5nIGRlY2xhcmVkOyAiCi0JCQkic2VlIGh0dHA6Ly93d3cucHl0aG9uLm9yZy9wZXBzL3BlcC0wMjYzLmh0bWwgZm9yIGRldGFpbHMiLAotCQkJYmFkY2hhciwgdG9rLT5maWxlbmFtZSwgdG9rLT5saW5lbm8gKyAxKTsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5bnRheEVycm9yLCBidWYpOwotCQlyZXR1cm4gZXJyb3JfcmV0KHRvayk7Ci0JfQorICAgIC8qIFRoZSBkZWZhdWx0IGVuY29kaW5nIGlzIEFTQ0lJLCBzbyBtYWtlIHN1cmUgd2UgZG9uJ3QgaGF2ZSBhbnkKKyAgICAgICBub24tQVNDSUkgYnl0ZXMgaW4gaXQuICovCisgICAgaWYgKGxpbmUgJiYgIXRvay0+ZW5jb2RpbmcpIHsKKyAgICAgICAgdW5zaWduZWQgY2hhciAqYzsKKyAgICAgICAgZm9yIChjID0gKHVuc2lnbmVkIGNoYXIgKilsaW5lOyAqYzsgYysrKQorICAgICAgICAgICAgaWYgKCpjID4gMTI3KSB7CisgICAgICAgICAgICAgICAgYmFkY2hhciA9ICpjOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgIH0KKyAgICBpZiAoYmFkY2hhcikgeworICAgICAgICBjaGFyIGJ1Zls1MDBdOworICAgICAgICAvKiBOZWVkIHRvIGFkZCAxIHRvIHRoZSBsaW5lIG51bWJlciwgc2luY2UgdGhpcyBsaW5lCisgICAgICAgICAgIGhhcyBub3QgYmVlbiBjb3VudGVkLCB5ZXQuICAqLworICAgICAgICBzcHJpbnRmKGJ1ZiwKKyAgICAgICAgICAgICJOb24tQVNDSUkgY2hhcmFjdGVyICdcXHglLjJ4JyAiCisgICAgICAgICAgICAiaW4gZmlsZSAlLjIwMHMgb24gbGluZSAlaSwgIgorICAgICAgICAgICAgImJ1dCBubyBlbmNvZGluZyBkZWNsYXJlZDsgIgorICAgICAgICAgICAgInNlZSBodHRwOi8vd3d3LnB5dGhvbi5vcmcvcGVwcy9wZXAtMDI2My5odG1sIGZvciBkZXRhaWxzIiwKKyAgICAgICAgICAgIGJhZGNoYXIsIHRvay0+ZmlsZW5hbWUsIHRvay0+bGluZW5vICsgMSk7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeW50YXhFcnJvciwgYnVmKTsKKyAgICAgICAgcmV0dXJuIGVycm9yX3JldCh0b2spOworICAgIH0KICNlbmRpZgotCXJldHVybiBsaW5lOworICAgIHJldHVybiBsaW5lOwogfQogCiBzdGF0aWMgaW50CiBkZWNvZGluZ19mZW9mKHN0cnVjdCB0b2tfc3RhdGUgKnRvaykKIHsKLQlpZiAodG9rLT5kZWNvZGluZ19zdGF0ZSA+PSAwKSB7Ci0JCXJldHVybiBmZW9mKHRvay0+ZnApOwotCX0gZWxzZSB7Ci0JCVB5T2JqZWN0KiBidWYgPSB0b2stPmRlY29kaW5nX2J1ZmZlcjsKLQkJaWYgKGJ1ZiA9PSBOVUxMKSB7Ci0JCQlidWYgPSBQeU9iamVjdF9DYWxsT2JqZWN0KHRvay0+ZGVjb2RpbmdfcmVhZGxpbmUsIE5VTEwpOwotCQkJaWYgKGJ1ZiA9PSBOVUxMKSB7Ci0JCQkJZXJyb3JfcmV0KHRvayk7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9IGVsc2UgewotCQkJCXRvay0+ZGVjb2RpbmdfYnVmZmVyID0gYnVmOwotCQkJfQotCQl9Ci0JCXJldHVybiBQeU9iamVjdF9MZW5ndGgoYnVmKSA9PSAwOwotCX0KKyAgICBpZiAodG9rLT5kZWNvZGluZ19zdGF0ZSA+PSAwKSB7CisgICAgICAgIHJldHVybiBmZW9mKHRvay0+ZnApOworICAgIH0gZWxzZSB7CisgICAgICAgIFB5T2JqZWN0KiBidWYgPSB0b2stPmRlY29kaW5nX2J1ZmZlcjsKKyAgICAgICAgaWYgKGJ1ZiA9PSBOVUxMKSB7CisgICAgICAgICAgICBidWYgPSBQeU9iamVjdF9DYWxsT2JqZWN0KHRvay0+ZGVjb2RpbmdfcmVhZGxpbmUsIE5VTEwpOworICAgICAgICAgICAgaWYgKGJ1ZiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgZXJyb3JfcmV0KHRvayk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRvay0+ZGVjb2RpbmdfYnVmZmVyID0gYnVmOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBQeU9iamVjdF9MZW5ndGgoYnVmKSA9PSAwOworICAgIH0KIH0KIAogLyogRmV0Y2ggYSBieXRlIGZyb20gVE9LLCB1c2luZyB0aGUgc3RyaW5nIGJ1ZmZlci4gKi8KIAogc3RhdGljIGludAogYnVmX2dldGMoc3RydWN0IHRva19zdGF0ZSAqdG9rKSB7Ci0JcmV0dXJuIFB5X0NIQVJNQVNLKCp0b2stPnN0cisrKTsKKyAgICByZXR1cm4gUHlfQ0hBUk1BU0soKnRvay0+c3RyKyspOwogfQogCiAvKiBVbmZldGNoIGEgYnl0ZSBmcm9tIFRPSywgdXNpbmcgdGhlIHN0cmluZyBidWZmZXIuICovCiAKIHN0YXRpYyB2b2lkCiBidWZfdW5nZXRjKGludCBjLCBzdHJ1Y3QgdG9rX3N0YXRlICp0b2spIHsKLQl0b2stPnN0ci0tOwotCWFzc2VydChQeV9DSEFSTUFTSygqdG9rLT5zdHIpID09IGMpOwkvKiB0b2stPmN1ciBtYXkgcG9pbnQgdG8gcmVhZC1vbmx5IHNlZ21lbnQgKi8KKyAgICB0b2stPnN0ci0tOworICAgIGFzc2VydChQeV9DSEFSTUFTSygqdG9rLT5zdHIpID09IGMpOyAgICAgICAgLyogdG9rLT5jdXIgbWF5IHBvaW50IHRvIHJlYWQtb25seSBzZWdtZW50ICovCiB9CiAKIC8qIFNldCB0aGUgcmVhZGxpbmUgZnVuY3Rpb24gZm9yIFRPSyB0byBFTkMuIEZvciB0aGUgc3RyaW5nLWJhc2VkCkBAIC01NjksOCArNTY5LDggQEAKIAogc3RhdGljIGludAogYnVmX3NldHJlYWRsKHN0cnVjdCB0b2tfc3RhdGUgKnRvaywgY29uc3QgY2hhciogZW5jKSB7Ci0JdG9rLT5lbmMgPSBlbmM7Ci0JcmV0dXJuIDE7CisgICAgdG9rLT5lbmMgPSBlbmM7CisgICAgcmV0dXJuIDE7CiB9CiAKIC8qIFJldHVybiBhIFVURi04IGVuY29kaW5nIFB5dGhvbiBzdHJpbmcgb2JqZWN0IGZyb20gdGhlCkBAIC01NzksMTMgKzU3OSwxMyBAQAogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKIHN0YXRpYyBQeU9iamVjdCAqCiB0cmFuc2xhdGVfaW50b191dGY4KGNvbnN0IGNoYXIqIHN0ciwgY29uc3QgY2hhciogZW5jKSB7Ci0JUHlPYmplY3QgKnV0Zjg7Ci0JUHlPYmplY3QqIGJ1ZiA9IFB5VW5pY29kZV9EZWNvZGUoc3RyLCBzdHJsZW4oc3RyKSwgZW5jLCBOVUxMKTsKLQlpZiAoYnVmID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXV0ZjggPSBQeVVuaWNvZGVfQXNVVEY4U3RyaW5nKGJ1Zik7Ci0JUHlfREVDUkVGKGJ1Zik7Ci0JcmV0dXJuIHV0Zjg7CisgICAgUHlPYmplY3QgKnV0Zjg7CisgICAgUHlPYmplY3QqIGJ1ZiA9IFB5VW5pY29kZV9EZWNvZGUoc3RyLCBzdHJsZW4oc3RyKSwgZW5jLCBOVUxMKTsKKyAgICBpZiAoYnVmID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHV0ZjggPSBQeVVuaWNvZGVfQXNVVEY4U3RyaW5nKGJ1Zik7CisgICAgUHlfREVDUkVGKGJ1Zik7CisgICAgcmV0dXJuIHV0Zjg7CiB9CiAjZW5kaWYKIApAQCAtNTk2LDYwICs1OTYsNjAgQEAKIHN0YXRpYyBjb25zdCBjaGFyICoKIGRlY29kZV9zdHIoY29uc3QgY2hhciAqc3RyLCBzdHJ1Y3QgdG9rX3N0YXRlICp0b2spCiB7Ci0JUHlPYmplY3QqIHV0ZjggPSBOVUxMOwotCWNvbnN0IGNoYXIgKnM7Ci0JY29uc3QgY2hhciAqbmV3bFsyXSA9IHtOVUxMLCBOVUxMfTsKLQlpbnQgbGluZW5vID0gMDsKLQl0b2stPmVuYyA9IE5VTEw7Ci0JdG9rLT5zdHIgPSBzdHI7Ci0JaWYgKCFjaGVja19ib20oYnVmX2dldGMsIGJ1Zl91bmdldGMsIGJ1Zl9zZXRyZWFkbCwgdG9rKSkKLQkJcmV0dXJuIGVycm9yX3JldCh0b2spOwotCXN0ciA9IHRvay0+c3RyOwkJLyogc3RyaW5nIGFmdGVyIEJPTSBpZiBhbnkgKi8KLQlhc3NlcnQoc3RyKTsKKyAgICBQeU9iamVjdCogdXRmOCA9IE5VTEw7CisgICAgY29uc3QgY2hhciAqczsKKyAgICBjb25zdCBjaGFyICpuZXdsWzJdID0ge05VTEwsIE5VTEx9OworICAgIGludCBsaW5lbm8gPSAwOworICAgIHRvay0+ZW5jID0gTlVMTDsKKyAgICB0b2stPnN0ciA9IHN0cjsKKyAgICBpZiAoIWNoZWNrX2JvbShidWZfZ2V0YywgYnVmX3VuZ2V0YywgYnVmX3NldHJlYWRsLCB0b2spKQorICAgICAgICByZXR1cm4gZXJyb3JfcmV0KHRvayk7CisgICAgc3RyID0gdG9rLT5zdHI7ICAgICAgICAgICAgIC8qIHN0cmluZyBhZnRlciBCT00gaWYgYW55ICovCisgICAgYXNzZXJ0KHN0cik7CiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCWlmICh0b2stPmVuYyAhPSBOVUxMKSB7Ci0JCXV0ZjggPSB0cmFuc2xhdGVfaW50b191dGY4KHN0ciwgdG9rLT5lbmMpOwotCQlpZiAodXRmOCA9PSBOVUxMKQotCQkJcmV0dXJuIGVycm9yX3JldCh0b2spOwotCQlzdHIgPSBQeVN0cmluZ19Bc1N0cmluZyh1dGY4KTsKLQl9CisgICAgaWYgKHRvay0+ZW5jICE9IE5VTEwpIHsKKyAgICAgICAgdXRmOCA9IHRyYW5zbGF0ZV9pbnRvX3V0Zjgoc3RyLCB0b2stPmVuYyk7CisgICAgICAgIGlmICh1dGY4ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gZXJyb3JfcmV0KHRvayk7CisgICAgICAgIHN0ciA9IFB5U3RyaW5nX0FzU3RyaW5nKHV0ZjgpOworICAgIH0KICNlbmRpZgotCWZvciAocyA9IHN0cjs7IHMrKykgewotCQlpZiAoKnMgPT0gJ1wwJykgYnJlYWs7Ci0JCWVsc2UgaWYgKCpzID09ICdcbicpIHsKLQkJCWFzc2VydChsaW5lbm8gPCAyKTsKLQkJCW5ld2xbbGluZW5vXSA9IHM7Ci0JCQlsaW5lbm8rKzsKLQkJCWlmIChsaW5lbm8gPT0gMikgYnJlYWs7Ci0JCX0KLQl9Ci0JdG9rLT5lbmMgPSBOVUxMOwotCS8qIG5lZWQgdG8gY2hlY2sgbGluZSAxIGFuZCAyIHNlcGFyYXRlbHkgc2luY2UgY2hlY2tfY29kaW5nX3NwZWMKLQkgICBhc3N1bWVzIGEgc2luZ2xlIGxpbmUgYXMgaW5wdXQgKi8KLQlpZiAobmV3bFswXSkgewotCQlpZiAoIWNoZWNrX2NvZGluZ19zcGVjKHN0ciwgbmV3bFswXSAtIHN0ciwgdG9rLCBidWZfc2V0cmVhZGwpKQotCQkJcmV0dXJuIGVycm9yX3JldCh0b2spOwotCQlpZiAodG9rLT5lbmMgPT0gTlVMTCAmJiBuZXdsWzFdKSB7Ci0JCQlpZiAoIWNoZWNrX2NvZGluZ19zcGVjKG5ld2xbMF0rMSwgbmV3bFsxXSAtIG5ld2xbMF0sCi0JCQkJCSAgICAgICB0b2ssIGJ1Zl9zZXRyZWFkbCkpCi0JCQkJcmV0dXJuIGVycm9yX3JldCh0b2spOwotCQl9Ci0JfQorICAgIGZvciAocyA9IHN0cjs7IHMrKykgeworICAgICAgICBpZiAoKnMgPT0gJ1wwJykgYnJlYWs7CisgICAgICAgIGVsc2UgaWYgKCpzID09ICdcbicpIHsKKyAgICAgICAgICAgIGFzc2VydChsaW5lbm8gPCAyKTsKKyAgICAgICAgICAgIG5ld2xbbGluZW5vXSA9IHM7CisgICAgICAgICAgICBsaW5lbm8rKzsKKyAgICAgICAgICAgIGlmIChsaW5lbm8gPT0gMikgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgdG9rLT5lbmMgPSBOVUxMOworICAgIC8qIG5lZWQgdG8gY2hlY2sgbGluZSAxIGFuZCAyIHNlcGFyYXRlbHkgc2luY2UgY2hlY2tfY29kaW5nX3NwZWMKKyAgICAgICBhc3N1bWVzIGEgc2luZ2xlIGxpbmUgYXMgaW5wdXQgKi8KKyAgICBpZiAobmV3bFswXSkgeworICAgICAgICBpZiAoIWNoZWNrX2NvZGluZ19zcGVjKHN0ciwgbmV3bFswXSAtIHN0ciwgdG9rLCBidWZfc2V0cmVhZGwpKQorICAgICAgICAgICAgcmV0dXJuIGVycm9yX3JldCh0b2spOworICAgICAgICBpZiAodG9rLT5lbmMgPT0gTlVMTCAmJiBuZXdsWzFdKSB7CisgICAgICAgICAgICBpZiAoIWNoZWNrX2NvZGluZ19zcGVjKG5ld2xbMF0rMSwgbmV3bFsxXSAtIG5ld2xbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvaywgYnVmX3NldHJlYWRsKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3JfcmV0KHRvayk7CisgICAgICAgIH0KKyAgICB9CiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCWlmICh0b2stPmVuYyAhPSBOVUxMKSB7Ci0JCWFzc2VydCh1dGY4ID09IE5VTEwpOwotCQl1dGY4ID0gdHJhbnNsYXRlX2ludG9fdXRmOChzdHIsIHRvay0+ZW5jKTsKLQkJaWYgKHV0ZjggPT0gTlVMTCkgewotCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1N5bnRheEVycm9yLAotCQkJCSJ1bmtub3duIGVuY29kaW5nOiAlcyIsIHRvay0+ZW5jKTsKLQkJCXJldHVybiBlcnJvcl9yZXQodG9rKTsKLQkJfQotCQlzdHIgPSBQeVN0cmluZ19Bc1N0cmluZyh1dGY4KTsKLQl9CisgICAgaWYgKHRvay0+ZW5jICE9IE5VTEwpIHsKKyAgICAgICAgYXNzZXJ0KHV0ZjggPT0gTlVMTCk7CisgICAgICAgIHV0ZjggPSB0cmFuc2xhdGVfaW50b191dGY4KHN0ciwgdG9rLT5lbmMpOworICAgICAgICBpZiAodXRmOCA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfU3ludGF4RXJyb3IsCisgICAgICAgICAgICAgICAgInVua25vd24gZW5jb2Rpbmc6ICVzIiwgdG9rLT5lbmMpOworICAgICAgICAgICAgcmV0dXJuIGVycm9yX3JldCh0b2spOworICAgICAgICB9CisgICAgICAgIHN0ciA9IFB5U3RyaW5nX0FzU3RyaW5nKHV0ZjgpOworICAgIH0KICNlbmRpZgotCWFzc2VydCh0b2stPmRlY29kaW5nX2J1ZmZlciA9PSBOVUxMKTsKLQl0b2stPmRlY29kaW5nX2J1ZmZlciA9IHV0Zjg7IC8qIENBVVRJT04gKi8KLQlyZXR1cm4gc3RyOworICAgIGFzc2VydCh0b2stPmRlY29kaW5nX2J1ZmZlciA9PSBOVUxMKTsKKyAgICB0b2stPmRlY29kaW5nX2J1ZmZlciA9IHV0Zjg7IC8qIENBVVRJT04gKi8KKyAgICByZXR1cm4gc3RyOwogfQogCiAjZW5kaWYgLyogUEdFTiAqLwpAQCAtNjU5LDE4ICs2NTksMTggQEAKIHN0cnVjdCB0b2tfc3RhdGUgKgogUHlUb2tlbml6ZXJfRnJvbVN0cmluZyhjb25zdCBjaGFyICpzdHIpCiB7Ci0Jc3RydWN0IHRva19zdGF0ZSAqdG9rID0gdG9rX25ldygpOwotCWlmICh0b2sgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0Jc3RyID0gKGNoYXIgKilkZWNvZGVfc3RyKHN0ciwgdG9rKTsKLQlpZiAoc3RyID09IE5VTEwpIHsKLQkJUHlUb2tlbml6ZXJfRnJlZSh0b2spOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgc3RydWN0IHRva19zdGF0ZSAqdG9rID0gdG9rX25ldygpOworICAgIGlmICh0b2sgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgc3RyID0gKGNoYXIgKilkZWNvZGVfc3RyKHN0ciwgdG9rKTsKKyAgICBpZiAoc3RyID09IE5VTEwpIHsKKyAgICAgICAgUHlUb2tlbml6ZXJfRnJlZSh0b2spOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQkvKiBYWFg6IGNvbnN0aWZ5IG1lbWJlcnMuICovCi0JdG9rLT5idWYgPSB0b2stPmN1ciA9IHRvay0+ZW5kID0gdG9rLT5pbnAgPSAoY2hhciopc3RyOwotCXJldHVybiB0b2s7CisgICAgLyogWFhYOiBjb25zdGlmeSBtZW1iZXJzLiAqLworICAgIHRvay0+YnVmID0gdG9rLT5jdXIgPSB0b2stPmVuZCA9IHRvay0+aW5wID0gKGNoYXIqKXN0cjsKKyAgICByZXR1cm4gdG9rOwogfQogCiAKQEAgLTY3OSwxOSArNjc5LDE5IEBACiBzdHJ1Y3QgdG9rX3N0YXRlICoKIFB5VG9rZW5pemVyX0Zyb21GaWxlKEZJTEUgKmZwLCBjaGFyICpwczEsIGNoYXIgKnBzMikKIHsKLQlzdHJ1Y3QgdG9rX3N0YXRlICp0b2sgPSB0b2tfbmV3KCk7Ci0JaWYgKHRvayA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoKHRvay0+YnVmID0gKGNoYXIgKilQeU1lbV9NQUxMT0MoQlVGU0laKSkgPT0gTlVMTCkgewotCQlQeVRva2VuaXplcl9GcmVlKHRvayk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQl0b2stPmN1ciA9IHRvay0+aW5wID0gdG9rLT5idWY7Ci0JdG9rLT5lbmQgPSB0b2stPmJ1ZiArIEJVRlNJWjsKLQl0b2stPmZwID0gZnA7Ci0JdG9rLT5wcm9tcHQgPSBwczE7Ci0JdG9rLT5uZXh0cHJvbXB0ID0gcHMyOwotCXJldHVybiB0b2s7CisgICAgc3RydWN0IHRva19zdGF0ZSAqdG9rID0gdG9rX25ldygpOworICAgIGlmICh0b2sgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCh0b2stPmJ1ZiA9IChjaGFyICopUHlNZW1fTUFMTE9DKEJVRlNJWikpID09IE5VTEwpIHsKKyAgICAgICAgUHlUb2tlbml6ZXJfRnJlZSh0b2spOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgdG9rLT5jdXIgPSB0b2stPmlucCA9IHRvay0+YnVmOworICAgIHRvay0+ZW5kID0gdG9rLT5idWYgKyBCVUZTSVo7CisgICAgdG9rLT5mcCA9IGZwOworICAgIHRvay0+cHJvbXB0ID0gcHMxOworICAgIHRvay0+bmV4dHByb21wdCA9IHBzMjsKKyAgICByZXR1cm4gdG9rOwogfQogCiAKQEAgLTcwMCw3OCArNzAwLDc4IEBACiB2b2lkCiBQeVRva2VuaXplcl9GcmVlKHN0cnVjdCB0b2tfc3RhdGUgKnRvaykKIHsKLQlpZiAodG9rLT5lbmNvZGluZyAhPSBOVUxMKQotCQlQeU1lbV9GUkVFKHRvay0+ZW5jb2RpbmcpOworICAgIGlmICh0b2stPmVuY29kaW5nICE9IE5VTEwpCisgICAgICAgIFB5TWVtX0ZSRUUodG9rLT5lbmNvZGluZyk7CiAjaWZuZGVmIFBHRU4KLQlQeV9YREVDUkVGKHRvay0+ZGVjb2RpbmdfcmVhZGxpbmUpOwotCVB5X1hERUNSRUYodG9rLT5kZWNvZGluZ19idWZmZXIpOworICAgIFB5X1hERUNSRUYodG9rLT5kZWNvZGluZ19yZWFkbGluZSk7CisgICAgUHlfWERFQ1JFRih0b2stPmRlY29kaW5nX2J1ZmZlcik7CiAjZW5kaWYKLQlpZiAodG9rLT5mcCAhPSBOVUxMICYmIHRvay0+YnVmICE9IE5VTEwpCi0JCVB5TWVtX0ZSRUUodG9rLT5idWYpOwotCVB5TWVtX0ZSRUUodG9rKTsKKyAgICBpZiAodG9rLT5mcCAhPSBOVUxMICYmIHRvay0+YnVmICE9IE5VTEwpCisgICAgICAgIFB5TWVtX0ZSRUUodG9rLT5idWYpOworICAgIFB5TWVtX0ZSRUUodG9rKTsKIH0KIAogI2lmICFkZWZpbmVkKFBHRU4pICYmIGRlZmluZWQoUHlfVVNJTkdfVU5JQ09ERSkKIHN0YXRpYyBpbnQKIHRva19zdGRpbl9kZWNvZGUoc3RydWN0IHRva19zdGF0ZSAqdG9rLCBjaGFyICoqaW5wKQogewotCVB5T2JqZWN0ICplbmMsICpzeXNzdGRpbiwgKmRlY29kZWQsICp1dGY4OwotCWNvbnN0IGNoYXIgKmVuY29kaW5nOwotCWNoYXIgKmNvbnZlcnRlZDsKKyAgICBQeU9iamVjdCAqZW5jLCAqc3lzc3RkaW4sICpkZWNvZGVkLCAqdXRmODsKKyAgICBjb25zdCBjaGFyICplbmNvZGluZzsKKyAgICBjaGFyICpjb252ZXJ0ZWQ7CiAKLQlpZiAoUHlTeXNfR2V0RmlsZSgoY2hhciAqKSJzdGRpbiIsIE5VTEwpICE9IHN0ZGluKQotCQlyZXR1cm4gMDsKLQlzeXNzdGRpbiA9IFB5U3lzX0dldE9iamVjdCgic3RkaW4iKTsKLQlpZiAoc3lzc3RkaW4gPT0gTlVMTCB8fCAhUHlGaWxlX0NoZWNrKHN5c3N0ZGluKSkKLQkJcmV0dXJuIDA7CisgICAgaWYgKFB5U3lzX0dldEZpbGUoKGNoYXIgKikic3RkaW4iLCBOVUxMKSAhPSBzdGRpbikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgc3lzc3RkaW4gPSBQeVN5c19HZXRPYmplY3QoInN0ZGluIik7CisgICAgaWYgKHN5c3N0ZGluID09IE5VTEwgfHwgIVB5RmlsZV9DaGVjayhzeXNzdGRpbikpCisgICAgICAgIHJldHVybiAwOwogCi0JZW5jID0gKChQeUZpbGVPYmplY3QgKilzeXNzdGRpbiktPmZfZW5jb2Rpbmc7Ci0JaWYgKGVuYyA9PSBOVUxMIHx8ICFQeVN0cmluZ19DaGVjayhlbmMpKQotCQlyZXR1cm4gMDsKLQlQeV9JTkNSRUYoZW5jKTsKKyAgICBlbmMgPSAoKFB5RmlsZU9iamVjdCAqKXN5c3N0ZGluKS0+Zl9lbmNvZGluZzsKKyAgICBpZiAoZW5jID09IE5VTEwgfHwgIVB5U3RyaW5nX0NoZWNrKGVuYykpCisgICAgICAgIHJldHVybiAwOworICAgIFB5X0lOQ1JFRihlbmMpOwogCi0JZW5jb2RpbmcgPSBQeVN0cmluZ19Bc1N0cmluZyhlbmMpOwotCWRlY29kZWQgPSBQeVVuaWNvZGVfRGVjb2RlKCppbnAsIHN0cmxlbigqaW5wKSwgZW5jb2RpbmcsIE5VTEwpOwotCWlmIChkZWNvZGVkID09IE5VTEwpCi0JCWdvdG8gZXJyb3JfY2xlYXI7CisgICAgZW5jb2RpbmcgPSBQeVN0cmluZ19Bc1N0cmluZyhlbmMpOworICAgIGRlY29kZWQgPSBQeVVuaWNvZGVfRGVjb2RlKCppbnAsIHN0cmxlbigqaW5wKSwgZW5jb2RpbmcsIE5VTEwpOworICAgIGlmIChkZWNvZGVkID09IE5VTEwpCisgICAgICAgIGdvdG8gZXJyb3JfY2xlYXI7CiAKLQl1dGY4ID0gUHlVbmljb2RlX0FzRW5jb2RlZFN0cmluZyhkZWNvZGVkLCAidXRmLTgiLCBOVUxMKTsKLQlQeV9ERUNSRUYoZGVjb2RlZCk7Ci0JaWYgKHV0ZjggPT0gTlVMTCkKLQkJZ290byBlcnJvcl9jbGVhcjsKKyAgICB1dGY4ID0gUHlVbmljb2RlX0FzRW5jb2RlZFN0cmluZyhkZWNvZGVkLCAidXRmLTgiLCBOVUxMKTsKKyAgICBQeV9ERUNSRUYoZGVjb2RlZCk7CisgICAgaWYgKHV0ZjggPT0gTlVMTCkKKyAgICAgICAgZ290byBlcnJvcl9jbGVhcjsKIAotCWFzc2VydChQeVN0cmluZ19DaGVjayh1dGY4KSk7Ci0JY29udmVydGVkID0gbmV3X3N0cmluZyhQeVN0cmluZ19BU19TVFJJTkcodXRmOCksCi0JCQkgICAgICAgUHlTdHJpbmdfR0VUX1NJWkUodXRmOCkpOwotCVB5X0RFQ1JFRih1dGY4KTsKLQlpZiAoY29udmVydGVkID09IE5VTEwpCi0JCWdvdG8gZXJyb3Jfbm9tZW07CisgICAgYXNzZXJ0KFB5U3RyaW5nX0NoZWNrKHV0ZjgpKTsKKyAgICBjb252ZXJ0ZWQgPSBuZXdfc3RyaW5nKFB5U3RyaW5nX0FTX1NUUklORyh1dGY4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0dFVF9TSVpFKHV0ZjgpKTsKKyAgICBQeV9ERUNSRUYodXRmOCk7CisgICAgaWYgKGNvbnZlcnRlZCA9PSBOVUxMKQorICAgICAgICBnb3RvIGVycm9yX25vbWVtOwogCi0JUHlNZW1fRlJFRSgqaW5wKTsKLQkqaW5wID0gY29udmVydGVkOwotCWlmICh0b2stPmVuY29kaW5nICE9IE5VTEwpCi0JCVB5TWVtX0ZSRUUodG9rLT5lbmNvZGluZyk7Ci0JdG9rLT5lbmNvZGluZyA9IG5ld19zdHJpbmcoZW5jb2RpbmcsIHN0cmxlbihlbmNvZGluZykpOwotCWlmICh0b2stPmVuY29kaW5nID09IE5VTEwpCi0JCWdvdG8gZXJyb3Jfbm9tZW07CisgICAgUHlNZW1fRlJFRSgqaW5wKTsKKyAgICAqaW5wID0gY29udmVydGVkOworICAgIGlmICh0b2stPmVuY29kaW5nICE9IE5VTEwpCisgICAgICAgIFB5TWVtX0ZSRUUodG9rLT5lbmNvZGluZyk7CisgICAgdG9rLT5lbmNvZGluZyA9IG5ld19zdHJpbmcoZW5jb2RpbmcsIHN0cmxlbihlbmNvZGluZykpOworICAgIGlmICh0b2stPmVuY29kaW5nID09IE5VTEwpCisgICAgICAgIGdvdG8gZXJyb3Jfbm9tZW07CiAKLQlQeV9ERUNSRUYoZW5jKTsKLQlyZXR1cm4gMDsKKyAgICBQeV9ERUNSRUYoZW5jKTsKKyAgICByZXR1cm4gMDsKIAogZXJyb3Jfbm9tZW06Ci0JUHlfREVDUkVGKGVuYyk7Ci0JdG9rLT5kb25lID0gRV9OT01FTTsKLQlyZXR1cm4gLTE7CisgICAgUHlfREVDUkVGKGVuYyk7CisgICAgdG9rLT5kb25lID0gRV9OT01FTTsKKyAgICByZXR1cm4gLTE7CiAKIGVycm9yX2NsZWFyOgotCVB5X0RFQ1JFRihlbmMpOwotCWlmICghUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19Vbmljb2RlRGVjb2RlRXJyb3IpKSB7Ci0JCXRvay0+ZG9uZSA9IEVfRVJST1I7Ci0JCXJldHVybiAtMTsKLQl9Ci0JLyogRmFsbGJhY2sgdG8gaXNvLTg4NTktMTogZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgKi8KLQlQeUVycl9DbGVhcigpOwotCXJldHVybiAwOworICAgIFB5X0RFQ1JFRihlbmMpOworICAgIGlmICghUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19Vbmljb2RlRGVjb2RlRXJyb3IpKSB7CisgICAgICAgIHRvay0+ZG9uZSA9IEVfRVJST1I7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgLyogRmFsbGJhY2sgdG8gaXNvLTg4NTktMTogZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgKi8KKyAgICBQeUVycl9DbGVhcigpOworICAgIHJldHVybiAwOwogfQogI2VuZGlmCiAKQEAgLTc4MCwxNjkgKzc4MCwxNjkgQEAKIHN0YXRpYyBpbnQKIHRva19uZXh0YyhyZWdpc3RlciBzdHJ1Y3QgdG9rX3N0YXRlICp0b2spCiB7Ci0JZm9yICg7OykgewotCQlpZiAodG9rLT5jdXIgIT0gdG9rLT5pbnApIHsKLQkJCXJldHVybiBQeV9DSEFSTUFTSygqdG9rLT5jdXIrKyk7IC8qIEZhc3QgcGF0aCAqLwotCQl9Ci0JCWlmICh0b2stPmRvbmUgIT0gRV9PSykKLQkJCXJldHVybiBFT0Y7Ci0JCWlmICh0b2stPmZwID09IE5VTEwpIHsKLQkJCWNoYXIgKmVuZCA9IHN0cmNocih0b2stPmlucCwgJ1xuJyk7Ci0JCQlpZiAoZW5kICE9IE5VTEwpCi0JCQkJZW5kKys7Ci0JCQllbHNlIHsKLQkJCQllbmQgPSBzdHJjaHIodG9rLT5pbnAsICdcMCcpOwotCQkJCWlmIChlbmQgPT0gdG9rLT5pbnApIHsKLQkJCQkJdG9rLT5kb25lID0gRV9FT0Y7Ci0JCQkJCXJldHVybiBFT0Y7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHRvay0+c3RhcnQgPT0gTlVMTCkKLQkJCQl0b2stPmJ1ZiA9IHRvay0+Y3VyOwotCQkJdG9rLT5saW5lX3N0YXJ0ID0gdG9rLT5jdXI7Ci0JCQl0b2stPmxpbmVubysrOwotCQkJdG9rLT5pbnAgPSBlbmQ7Ci0JCQlyZXR1cm4gUHlfQ0hBUk1BU0soKnRvay0+Y3VyKyspOwotCQl9Ci0JCWlmICh0b2stPnByb21wdCAhPSBOVUxMKSB7Ci0JCQljaGFyICpuZXd0b2sgPSBQeU9TX1JlYWRsaW5lKHN0ZGluLCBzdGRvdXQsIHRvay0+cHJvbXB0KTsKLQkJCWlmICh0b2stPm5leHRwcm9tcHQgIT0gTlVMTCkKLQkJCQl0b2stPnByb21wdCA9IHRvay0+bmV4dHByb21wdDsKLQkJCWlmIChuZXd0b2sgPT0gTlVMTCkKLQkJCQl0b2stPmRvbmUgPSBFX0lOVFI7Ci0JCQllbHNlIGlmICgqbmV3dG9rID09ICdcMCcpIHsKLQkJCQlQeU1lbV9GUkVFKG5ld3Rvayk7Ci0JCQkJdG9rLT5kb25lID0gRV9FT0Y7Ci0JCQl9CisgICAgZm9yICg7OykgeworICAgICAgICBpZiAodG9rLT5jdXIgIT0gdG9rLT5pbnApIHsKKyAgICAgICAgICAgIHJldHVybiBQeV9DSEFSTUFTSygqdG9rLT5jdXIrKyk7IC8qIEZhc3QgcGF0aCAqLworICAgICAgICB9CisgICAgICAgIGlmICh0b2stPmRvbmUgIT0gRV9PSykKKyAgICAgICAgICAgIHJldHVybiBFT0Y7CisgICAgICAgIGlmICh0b2stPmZwID09IE5VTEwpIHsKKyAgICAgICAgICAgIGNoYXIgKmVuZCA9IHN0cmNocih0b2stPmlucCwgJ1xuJyk7CisgICAgICAgICAgICBpZiAoZW5kICE9IE5VTEwpCisgICAgICAgICAgICAgICAgZW5kKys7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBlbmQgPSBzdHJjaHIodG9rLT5pbnAsICdcMCcpOworICAgICAgICAgICAgICAgIGlmIChlbmQgPT0gdG9rLT5pbnApIHsKKyAgICAgICAgICAgICAgICAgICAgdG9rLT5kb25lID0gRV9FT0Y7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFT0Y7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHRvay0+c3RhcnQgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICB0b2stPmJ1ZiA9IHRvay0+Y3VyOworICAgICAgICAgICAgdG9rLT5saW5lX3N0YXJ0ID0gdG9rLT5jdXI7CisgICAgICAgICAgICB0b2stPmxpbmVubysrOworICAgICAgICAgICAgdG9rLT5pbnAgPSBlbmQ7CisgICAgICAgICAgICByZXR1cm4gUHlfQ0hBUk1BU0soKnRvay0+Y3VyKyspOworICAgICAgICB9CisgICAgICAgIGlmICh0b2stPnByb21wdCAhPSBOVUxMKSB7CisgICAgICAgICAgICBjaGFyICpuZXd0b2sgPSBQeU9TX1JlYWRsaW5lKHN0ZGluLCBzdGRvdXQsIHRvay0+cHJvbXB0KTsKKyAgICAgICAgICAgIGlmICh0b2stPm5leHRwcm9tcHQgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICB0b2stPnByb21wdCA9IHRvay0+bmV4dHByb21wdDsKKyAgICAgICAgICAgIGlmIChuZXd0b2sgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICB0b2stPmRvbmUgPSBFX0lOVFI7CisgICAgICAgICAgICBlbHNlIGlmICgqbmV3dG9rID09ICdcMCcpIHsKKyAgICAgICAgICAgICAgICBQeU1lbV9GUkVFKG5ld3Rvayk7CisgICAgICAgICAgICAgICAgdG9rLT5kb25lID0gRV9FT0Y7CisgICAgICAgICAgICB9CiAjaWYgIWRlZmluZWQoUEdFTikgJiYgZGVmaW5lZChQeV9VU0lOR19VTklDT0RFKQotCQkJZWxzZSBpZiAodG9rX3N0ZGluX2RlY29kZSh0b2ssICZuZXd0b2spICE9IDApCi0JCQkJUHlNZW1fRlJFRShuZXd0b2spOworICAgICAgICAgICAgZWxzZSBpZiAodG9rX3N0ZGluX2RlY29kZSh0b2ssICZuZXd0b2spICE9IDApCisgICAgICAgICAgICAgICAgUHlNZW1fRlJFRShuZXd0b2spOwogI2VuZGlmCi0JCQllbHNlIGlmICh0b2stPnN0YXJ0ICE9IE5VTEwpIHsKLQkJCQlzaXplX3Qgc3RhcnQgPSB0b2stPnN0YXJ0IC0gdG9rLT5idWY7Ci0JCQkJc2l6ZV90IG9sZGxlbiA9IHRvay0+Y3VyIC0gdG9rLT5idWY7Ci0JCQkJc2l6ZV90IG5ld2xlbiA9IG9sZGxlbiArIHN0cmxlbihuZXd0b2spOwotCQkJCWNoYXIgKmJ1ZiA9IHRvay0+YnVmOwotCQkJCWJ1ZiA9IChjaGFyICopUHlNZW1fUkVBTExPQyhidWYsIG5ld2xlbisxKTsKLQkJCQl0b2stPmxpbmVubysrOwotCQkJCWlmIChidWYgPT0gTlVMTCkgewotCQkJCQlQeU1lbV9GUkVFKHRvay0+YnVmKTsKLQkJCQkJdG9rLT5idWYgPSBOVUxMOwotCQkJCQlQeU1lbV9GUkVFKG5ld3Rvayk7Ci0JCQkJCXRvay0+ZG9uZSA9IEVfTk9NRU07Ci0JCQkJCXJldHVybiBFT0Y7Ci0JCQkJfQotCQkJCXRvay0+YnVmID0gYnVmOwotCQkJCXRvay0+Y3VyID0gdG9rLT5idWYgKyBvbGRsZW47Ci0JCQkJdG9rLT5saW5lX3N0YXJ0ID0gdG9rLT5jdXI7Ci0JCQkJc3RyY3B5KHRvay0+YnVmICsgb2xkbGVuLCBuZXd0b2spOwotCQkJCVB5TWVtX0ZSRUUobmV3dG9rKTsKLQkJCQl0b2stPmlucCA9IHRvay0+YnVmICsgbmV3bGVuOwotCQkJCXRvay0+ZW5kID0gdG9rLT5pbnAgKyAxOwotCQkJCXRvay0+c3RhcnQgPSB0b2stPmJ1ZiArIHN0YXJ0OwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdG9rLT5saW5lbm8rKzsKLQkJCQlpZiAodG9rLT5idWYgIT0gTlVMTCkKLQkJCQkJUHlNZW1fRlJFRSh0b2stPmJ1Zik7Ci0JCQkJdG9rLT5idWYgPSBuZXd0b2s7Ci0JCQkJdG9rLT5saW5lX3N0YXJ0ID0gdG9rLT5idWY7Ci0JCQkJdG9rLT5jdXIgPSB0b2stPmJ1ZjsKLQkJCQl0b2stPmxpbmVfc3RhcnQgPSB0b2stPmJ1ZjsKLQkJCQl0b2stPmlucCA9IHN0cmNocih0b2stPmJ1ZiwgJ1wwJyk7Ci0JCQkJdG9rLT5lbmQgPSB0b2stPmlucCArIDE7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpbnQgZG9uZSA9IDA7Ci0JCQlQeV9zc2l6ZV90IGN1ciA9IDA7Ci0JCQljaGFyICpwdDsKLQkJCWlmICh0b2stPnN0YXJ0ID09IE5VTEwpIHsKLQkJCQlpZiAodG9rLT5idWYgPT0gTlVMTCkgewotCQkJCQl0b2stPmJ1ZiA9IChjaGFyICopCi0JCQkJCQlQeU1lbV9NQUxMT0MoQlVGU0laKTsKLQkJCQkJaWYgKHRvay0+YnVmID09IE5VTEwpIHsKLQkJCQkJCXRvay0+ZG9uZSA9IEVfTk9NRU07Ci0JCQkJCQlyZXR1cm4gRU9GOwotCQkJCQl9Ci0JCQkJCXRvay0+ZW5kID0gdG9rLT5idWYgKyBCVUZTSVo7Ci0JCQkJfQotCQkJCWlmIChkZWNvZGluZ19mZ2V0cyh0b2stPmJ1ZiwgKGludCkodG9rLT5lbmQgLSB0b2stPmJ1ZiksCi0JCQkJCSAgdG9rKSA9PSBOVUxMKSB7Ci0JCQkJCXRvay0+ZG9uZSA9IEVfRU9GOwotCQkJCQlkb25lID0gMTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXRvay0+ZG9uZSA9IEVfT0s7Ci0JCQkJCXRvay0+aW5wID0gc3RyY2hyKHRvay0+YnVmLCAnXDAnKTsKLQkJCQkJZG9uZSA9IHRvay0+aW5wWy0xXSA9PSAnXG4nOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCWN1ciA9IHRvay0+Y3VyIC0gdG9rLT5idWY7Ci0JCQkJaWYgKGRlY29kaW5nX2Zlb2YodG9rKSkgewotCQkJCQl0b2stPmRvbmUgPSBFX0VPRjsKLQkJCQkJZG9uZSA9IDE7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQkJdG9rLT5kb25lID0gRV9PSzsKLQkJCX0KLQkJCXRvay0+bGluZW5vKys7Ci0JCQkvKiBSZWFkIHVudGlsICdcbicgb3IgRU9GICovCi0JCQl3aGlsZSAoIWRvbmUpIHsKLQkJCQlQeV9zc2l6ZV90IGN1cnN0YXJ0ID0gdG9rLT5zdGFydCA9PSBOVUxMID8gLTEgOgotCQkJCQkgICAgICAgICAgdG9rLT5zdGFydCAtIHRvay0+YnVmOwotCQkJCVB5X3NzaXplX3QgY3VydmFsaWQgPSB0b2stPmlucCAtIHRvay0+YnVmOwotCQkJCVB5X3NzaXplX3QgbmV3c2l6ZSA9IGN1cnZhbGlkICsgQlVGU0laOwotCQkJCWNoYXIgKm5ld2J1ZiA9IHRvay0+YnVmOwotCQkJCW5ld2J1ZiA9IChjaGFyICopUHlNZW1fUkVBTExPQyhuZXdidWYsCi0JCQkJCQkJICAgICAgIG5ld3NpemUpOwotCQkJCWlmIChuZXdidWYgPT0gTlVMTCkgewotCQkJCQl0b2stPmRvbmUgPSBFX05PTUVNOwotCQkJCQl0b2stPmN1ciA9IHRvay0+aW5wOwotCQkJCQlyZXR1cm4gRU9GOwotCQkJCX0KLQkJCQl0b2stPmJ1ZiA9IG5ld2J1ZjsKLQkJCQl0b2stPmlucCA9IHRvay0+YnVmICsgY3VydmFsaWQ7Ci0JCQkJdG9rLT5lbmQgPSB0b2stPmJ1ZiArIG5ld3NpemU7Ci0JCQkJdG9rLT5zdGFydCA9IGN1cnN0YXJ0IDwgMCA/IE5VTEwgOgotCQkJCQkgICAgIHRvay0+YnVmICsgY3Vyc3RhcnQ7Ci0JCQkJaWYgKGRlY29kaW5nX2ZnZXRzKHRvay0+aW5wLAotCQkJCQkgICAgICAgKGludCkodG9rLT5lbmQgLSB0b2stPmlucCksCi0JCQkJCSAgICAgICB0b2spID09IE5VTEwpIHsKLQkJCQkJLyogQnJlYWsgb3V0IGVhcmx5IG9uIGRlY29kaW5nCi0JCQkJCSAgIGVycm9ycywgYXMgdG9rLT5idWYgd2lsbCBiZSBOVUxMCi0JCQkJCSAqLwotCQkJCQlpZiAodG9rLT5kZWNvZGluZ19lcnJlZCkKLQkJCQkJCXJldHVybiBFT0Y7Ci0JCQkJCS8qIExhc3QgbGluZSBkb2VzIG5vdCBlbmQgaW4gXG4sCi0JCQkJCSAgIGZha2Ugb25lICovCi0JCQkJCXN0cmNweSh0b2stPmlucCwgIlxuIik7Ci0JCQkJfQotCQkJCXRvay0+aW5wID0gc3RyY2hyKHRvay0+aW5wLCAnXDAnKTsKLQkJCQlkb25lID0gdG9rLT5pbnBbLTFdID09ICdcbic7Ci0JCQl9Ci0JCQlpZiAodG9rLT5idWYgIT0gTlVMTCkgewotCQkJCXRvay0+Y3VyID0gdG9rLT5idWYgKyBjdXI7Ci0JCQkJdG9rLT5saW5lX3N0YXJ0ID0gdG9rLT5jdXI7Ci0JCQkJLyogcmVwbGFjZSAiXHJcbiIgd2l0aCAiXG4iICovCi0JCQkJLyogRm9yIE1hYyBsZWF2ZSB0aGUgXHIsIGdpdmluZyBhIHN5bnRheCBlcnJvciAqLwotCQkJCXB0ID0gdG9rLT5pbnAgLSAyOwotCQkJCWlmIChwdCA+PSB0b2stPmJ1ZiAmJiAqcHQgPT0gJ1xyJykgewotCQkJCQkqcHQrKyA9ICdcbic7Ci0JCQkJCSpwdCA9ICdcMCc7Ci0JCQkJCXRvay0+aW5wID0gcHQ7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmICh0b2stPmRvbmUgIT0gRV9PSykgewotCQkJaWYgKHRvay0+cHJvbXB0ICE9IE5VTEwpCi0JCQkJUHlTeXNfV3JpdGVTdGRlcnIoIlxuIik7Ci0JCQl0b2stPmN1ciA9IHRvay0+aW5wOwotCQkJcmV0dXJuIEVPRjsKLQkJfQotCX0KLQkvKk5PVFJFQUNIRUQqLworICAgICAgICAgICAgZWxzZSBpZiAodG9rLT5zdGFydCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgc2l6ZV90IHN0YXJ0ID0gdG9rLT5zdGFydCAtIHRvay0+YnVmOworICAgICAgICAgICAgICAgIHNpemVfdCBvbGRsZW4gPSB0b2stPmN1ciAtIHRvay0+YnVmOworICAgICAgICAgICAgICAgIHNpemVfdCBuZXdsZW4gPSBvbGRsZW4gKyBzdHJsZW4obmV3dG9rKTsKKyAgICAgICAgICAgICAgICBjaGFyICpidWYgPSB0b2stPmJ1ZjsKKyAgICAgICAgICAgICAgICBidWYgPSAoY2hhciAqKVB5TWVtX1JFQUxMT0MoYnVmLCBuZXdsZW4rMSk7CisgICAgICAgICAgICAgICAgdG9rLT5saW5lbm8rKzsKKyAgICAgICAgICAgICAgICBpZiAoYnVmID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgUHlNZW1fRlJFRSh0b2stPmJ1Zik7CisgICAgICAgICAgICAgICAgICAgIHRvay0+YnVmID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgUHlNZW1fRlJFRShuZXd0b2spOworICAgICAgICAgICAgICAgICAgICB0b2stPmRvbmUgPSBFX05PTUVNOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRU9GOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0b2stPmJ1ZiA9IGJ1ZjsKKyAgICAgICAgICAgICAgICB0b2stPmN1ciA9IHRvay0+YnVmICsgb2xkbGVuOworICAgICAgICAgICAgICAgIHRvay0+bGluZV9zdGFydCA9IHRvay0+Y3VyOworICAgICAgICAgICAgICAgIHN0cmNweSh0b2stPmJ1ZiArIG9sZGxlbiwgbmV3dG9rKTsKKyAgICAgICAgICAgICAgICBQeU1lbV9GUkVFKG5ld3Rvayk7CisgICAgICAgICAgICAgICAgdG9rLT5pbnAgPSB0b2stPmJ1ZiArIG5ld2xlbjsKKyAgICAgICAgICAgICAgICB0b2stPmVuZCA9IHRvay0+aW5wICsgMTsKKyAgICAgICAgICAgICAgICB0b2stPnN0YXJ0ID0gdG9rLT5idWYgKyBzdGFydDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHRvay0+bGluZW5vKys7CisgICAgICAgICAgICAgICAgaWYgKHRvay0+YnVmICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIFB5TWVtX0ZSRUUodG9rLT5idWYpOworICAgICAgICAgICAgICAgIHRvay0+YnVmID0gbmV3dG9rOworICAgICAgICAgICAgICAgIHRvay0+bGluZV9zdGFydCA9IHRvay0+YnVmOworICAgICAgICAgICAgICAgIHRvay0+Y3VyID0gdG9rLT5idWY7CisgICAgICAgICAgICAgICAgdG9rLT5saW5lX3N0YXJ0ID0gdG9rLT5idWY7CisgICAgICAgICAgICAgICAgdG9rLT5pbnAgPSBzdHJjaHIodG9rLT5idWYsICdcMCcpOworICAgICAgICAgICAgICAgIHRvay0+ZW5kID0gdG9rLT5pbnAgKyAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaW50IGRvbmUgPSAwOworICAgICAgICAgICAgUHlfc3NpemVfdCBjdXIgPSAwOworICAgICAgICAgICAgY2hhciAqcHQ7CisgICAgICAgICAgICBpZiAodG9rLT5zdGFydCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaWYgKHRvay0+YnVmID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgdG9rLT5idWYgPSAoY2hhciAqKQorICAgICAgICAgICAgICAgICAgICAgICAgUHlNZW1fTUFMTE9DKEJVRlNJWik7CisgICAgICAgICAgICAgICAgICAgIGlmICh0b2stPmJ1ZiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0b2stPmRvbmUgPSBFX05PTUVNOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVPRjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB0b2stPmVuZCA9IHRvay0+YnVmICsgQlVGU0laOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZGVjb2RpbmdfZmdldHModG9rLT5idWYsIChpbnQpKHRvay0+ZW5kIC0gdG9rLT5idWYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0b2spID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgdG9rLT5kb25lID0gRV9FT0Y7CisgICAgICAgICAgICAgICAgICAgIGRvbmUgPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdG9rLT5kb25lID0gRV9PSzsKKyAgICAgICAgICAgICAgICAgICAgdG9rLT5pbnAgPSBzdHJjaHIodG9rLT5idWYsICdcMCcpOworICAgICAgICAgICAgICAgICAgICBkb25lID0gdG9rLT5pbnBbLTFdID09ICdcbic7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgY3VyID0gdG9rLT5jdXIgLSB0b2stPmJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoZGVjb2RpbmdfZmVvZih0b2spKSB7CisgICAgICAgICAgICAgICAgICAgIHRvay0+ZG9uZSA9IEVfRU9GOworICAgICAgICAgICAgICAgICAgICBkb25lID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB0b2stPmRvbmUgPSBFX09LOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdG9rLT5saW5lbm8rKzsKKyAgICAgICAgICAgIC8qIFJlYWQgdW50aWwgJ1xuJyBvciBFT0YgKi8KKyAgICAgICAgICAgIHdoaWxlICghZG9uZSkgeworICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgY3Vyc3RhcnQgPSB0b2stPnN0YXJ0ID09IE5VTEwgPyAtMSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgIHRvay0+c3RhcnQgLSB0b2stPmJ1ZjsKKyAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IGN1cnZhbGlkID0gdG9rLT5pbnAgLSB0b2stPmJ1ZjsKKyAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IG5ld3NpemUgPSBjdXJ2YWxpZCArIEJVRlNJWjsKKyAgICAgICAgICAgICAgICBjaGFyICpuZXdidWYgPSB0b2stPmJ1ZjsKKyAgICAgICAgICAgICAgICBuZXdidWYgPSAoY2hhciAqKVB5TWVtX1JFQUxMT0MobmV3YnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdzaXplKTsKKyAgICAgICAgICAgICAgICBpZiAobmV3YnVmID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgdG9rLT5kb25lID0gRV9OT01FTTsKKyAgICAgICAgICAgICAgICAgICAgdG9rLT5jdXIgPSB0b2stPmlucDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVPRjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdG9rLT5idWYgPSBuZXdidWY7CisgICAgICAgICAgICAgICAgdG9rLT5pbnAgPSB0b2stPmJ1ZiArIGN1cnZhbGlkOworICAgICAgICAgICAgICAgIHRvay0+ZW5kID0gdG9rLT5idWYgKyBuZXdzaXplOworICAgICAgICAgICAgICAgIHRvay0+c3RhcnQgPSBjdXJzdGFydCA8IDAgPyBOVUxMIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICB0b2stPmJ1ZiArIGN1cnN0YXJ0OworICAgICAgICAgICAgICAgIGlmIChkZWNvZGluZ19mZ2V0cyh0b2stPmlucCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSh0b2stPmVuZCAtIHRvay0+aW5wKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2spID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogQnJlYWsgb3V0IGVhcmx5IG9uIGRlY29kaW5nCisgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycywgYXMgdG9rLT5idWYgd2lsbCBiZSBOVUxMCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBpZiAodG9rLT5kZWNvZGluZ19lcnJlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFT0Y7CisgICAgICAgICAgICAgICAgICAgIC8qIExhc3QgbGluZSBkb2VzIG5vdCBlbmQgaW4gXG4sCisgICAgICAgICAgICAgICAgICAgICAgIGZha2Ugb25lICovCisgICAgICAgICAgICAgICAgICAgIHN0cmNweSh0b2stPmlucCwgIlxuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRvay0+aW5wID0gc3RyY2hyKHRvay0+aW5wLCAnXDAnKTsKKyAgICAgICAgICAgICAgICBkb25lID0gdG9rLT5pbnBbLTFdID09ICdcbic7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodG9rLT5idWYgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHRvay0+Y3VyID0gdG9rLT5idWYgKyBjdXI7CisgICAgICAgICAgICAgICAgdG9rLT5saW5lX3N0YXJ0ID0gdG9rLT5jdXI7CisgICAgICAgICAgICAgICAgLyogcmVwbGFjZSAiXHJcbiIgd2l0aCAiXG4iICovCisgICAgICAgICAgICAgICAgLyogRm9yIE1hYyBsZWF2ZSB0aGUgXHIsIGdpdmluZyBhIHN5bnRheCBlcnJvciAqLworICAgICAgICAgICAgICAgIHB0ID0gdG9rLT5pbnAgLSAyOworICAgICAgICAgICAgICAgIGlmIChwdCA+PSB0b2stPmJ1ZiAmJiAqcHQgPT0gJ1xyJykgeworICAgICAgICAgICAgICAgICAgICAqcHQrKyA9ICdcbic7CisgICAgICAgICAgICAgICAgICAgICpwdCA9ICdcMCc7CisgICAgICAgICAgICAgICAgICAgIHRvay0+aW5wID0gcHQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICh0b2stPmRvbmUgIT0gRV9PSykgeworICAgICAgICAgICAgaWYgKHRvay0+cHJvbXB0ICE9IE5VTEwpCisgICAgICAgICAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoIlxuIik7CisgICAgICAgICAgICB0b2stPmN1ciA9IHRvay0+aW5wOworICAgICAgICAgICAgcmV0dXJuIEVPRjsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKk5PVFJFQUNIRUQqLwogfQogCiAKQEAgLTk1MSwxMiArOTUxLDEyIEBACiBzdGF0aWMgdm9pZAogdG9rX2JhY2t1cChyZWdpc3RlciBzdHJ1Y3QgdG9rX3N0YXRlICp0b2ssIHJlZ2lzdGVyIGludCBjKQogewotCWlmIChjICE9IEVPRikgewotCQlpZiAoLS10b2stPmN1ciA8IHRvay0+YnVmKQotCQkJUHlfRmF0YWxFcnJvcigidG9rX2JhY2t1cDogYmVnaW4gb2YgYnVmZmVyIik7Ci0JCWlmICgqdG9rLT5jdXIgIT0gYykKLQkJCSp0b2stPmN1ciA9IGM7Ci0JfQorICAgIGlmIChjICE9IEVPRikgeworICAgICAgICBpZiAoLS10b2stPmN1ciA8IHRvay0+YnVmKQorICAgICAgICAgICAgUHlfRmF0YWxFcnJvcigidG9rX2JhY2t1cDogYmVnaW4gb2YgYnVmZmVyIik7CisgICAgICAgIGlmICgqdG9rLT5jdXIgIT0gYykKKyAgICAgICAgICAgICp0b2stPmN1ciA9IGM7CisgICAgfQogfQogCiAKQEAgLTk2NSwxNzEgKzk2NSwxNzEgQEAKIGludAogUHlUb2tlbl9PbmVDaGFyKGludCBjKQogewotCXN3aXRjaCAoYykgewotCWNhc2UgJygnOglyZXR1cm4gTFBBUjsKLQljYXNlICcpJzoJcmV0dXJuIFJQQVI7Ci0JY2FzZSAnWyc6CXJldHVybiBMU1FCOwotCWNhc2UgJ10nOglyZXR1cm4gUlNRQjsKLQljYXNlICc6JzoJcmV0dXJuIENPTE9OOwotCWNhc2UgJywnOglyZXR1cm4gQ09NTUE7Ci0JY2FzZSAnOyc6CXJldHVybiBTRU1JOwotCWNhc2UgJysnOglyZXR1cm4gUExVUzsKLQljYXNlICctJzoJcmV0dXJuIE1JTlVTOwotCWNhc2UgJyonOglyZXR1cm4gU1RBUjsKLQljYXNlICcvJzoJcmV0dXJuIFNMQVNIOwotCWNhc2UgJ3wnOglyZXR1cm4gVkJBUjsKLQljYXNlICcmJzoJcmV0dXJuIEFNUEVSOwotCWNhc2UgJzwnOglyZXR1cm4gTEVTUzsKLQljYXNlICc+JzoJcmV0dXJuIEdSRUFURVI7Ci0JY2FzZSAnPSc6CXJldHVybiBFUVVBTDsKLQljYXNlICcuJzoJcmV0dXJuIERPVDsKLQljYXNlICclJzoJcmV0dXJuIFBFUkNFTlQ7Ci0JY2FzZSAnYCc6CXJldHVybiBCQUNLUVVPVEU7Ci0JY2FzZSAneyc6CXJldHVybiBMQlJBQ0U7Ci0JY2FzZSAnfSc6CXJldHVybiBSQlJBQ0U7Ci0JY2FzZSAnXic6CXJldHVybiBDSVJDVU1GTEVYOwotCWNhc2UgJ34nOglyZXR1cm4gVElMREU7Ci0JY2FzZSAnQCc6ICAgICAgIHJldHVybiBBVDsKLQlkZWZhdWx0OglyZXR1cm4gT1A7Ci0JfQorICAgIHN3aXRjaCAoYykgeworICAgIGNhc2UgJygnOiAgICAgICAgICAgcmV0dXJuIExQQVI7CisgICAgY2FzZSAnKSc6ICAgICAgICAgICByZXR1cm4gUlBBUjsKKyAgICBjYXNlICdbJzogICAgICAgICAgIHJldHVybiBMU1FCOworICAgIGNhc2UgJ10nOiAgICAgICAgICAgcmV0dXJuIFJTUUI7CisgICAgY2FzZSAnOic6ICAgICAgICAgICByZXR1cm4gQ09MT047CisgICAgY2FzZSAnLCc6ICAgICAgICAgICByZXR1cm4gQ09NTUE7CisgICAgY2FzZSAnOyc6ICAgICAgICAgICByZXR1cm4gU0VNSTsKKyAgICBjYXNlICcrJzogICAgICAgICAgIHJldHVybiBQTFVTOworICAgIGNhc2UgJy0nOiAgICAgICAgICAgcmV0dXJuIE1JTlVTOworICAgIGNhc2UgJyonOiAgICAgICAgICAgcmV0dXJuIFNUQVI7CisgICAgY2FzZSAnLyc6ICAgICAgICAgICByZXR1cm4gU0xBU0g7CisgICAgY2FzZSAnfCc6ICAgICAgICAgICByZXR1cm4gVkJBUjsKKyAgICBjYXNlICcmJzogICAgICAgICAgIHJldHVybiBBTVBFUjsKKyAgICBjYXNlICc8JzogICAgICAgICAgIHJldHVybiBMRVNTOworICAgIGNhc2UgJz4nOiAgICAgICAgICAgcmV0dXJuIEdSRUFURVI7CisgICAgY2FzZSAnPSc6ICAgICAgICAgICByZXR1cm4gRVFVQUw7CisgICAgY2FzZSAnLic6ICAgICAgICAgICByZXR1cm4gRE9UOworICAgIGNhc2UgJyUnOiAgICAgICAgICAgcmV0dXJuIFBFUkNFTlQ7CisgICAgY2FzZSAnYCc6ICAgICAgICAgICByZXR1cm4gQkFDS1FVT1RFOworICAgIGNhc2UgJ3snOiAgICAgICAgICAgcmV0dXJuIExCUkFDRTsKKyAgICBjYXNlICd9JzogICAgICAgICAgIHJldHVybiBSQlJBQ0U7CisgICAgY2FzZSAnXic6ICAgICAgICAgICByZXR1cm4gQ0lSQ1VNRkxFWDsKKyAgICBjYXNlICd+JzogICAgICAgICAgIHJldHVybiBUSUxERTsKKyAgICBjYXNlICdAJzogICAgICAgcmV0dXJuIEFUOworICAgIGRlZmF1bHQ6ICAgICAgICAgICAgcmV0dXJuIE9QOworICAgIH0KIH0KIAogCiBpbnQKIFB5VG9rZW5fVHdvQ2hhcnMoaW50IGMxLCBpbnQgYzIpCiB7Ci0Jc3dpdGNoIChjMSkgewotCWNhc2UgJz0nOgotCQlzd2l0Y2ggKGMyKSB7Ci0JCWNhc2UgJz0nOglyZXR1cm4gRVFFUVVBTDsKLQkJfQotCQlicmVhazsKLQljYXNlICchJzoKLQkJc3dpdGNoIChjMikgewotCQljYXNlICc9JzoJcmV0dXJuIE5PVEVRVUFMOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgJzwnOgotCQlzd2l0Y2ggKGMyKSB7Ci0JCWNhc2UgJz4nOglyZXR1cm4gTk9URVFVQUw7Ci0JCWNhc2UgJz0nOglyZXR1cm4gTEVTU0VRVUFMOwotCQljYXNlICc8JzoJcmV0dXJuIExFRlRTSElGVDsKLQkJfQotCQlicmVhazsKLQljYXNlICc+JzoKLQkJc3dpdGNoIChjMikgewotCQljYXNlICc9JzoJcmV0dXJuIEdSRUFURVJFUVVBTDsKLQkJY2FzZSAnPic6CXJldHVybiBSSUdIVFNISUZUOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgJysnOgotCQlzd2l0Y2ggKGMyKSB7Ci0JCWNhc2UgJz0nOglyZXR1cm4gUExVU0VRVUFMOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgJy0nOgotCQlzd2l0Y2ggKGMyKSB7Ci0JCWNhc2UgJz0nOglyZXR1cm4gTUlORVFVQUw7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSAnKic6Ci0JCXN3aXRjaCAoYzIpIHsKLQkJY2FzZSAnKic6CXJldHVybiBET1VCTEVTVEFSOwotCQljYXNlICc9JzoJcmV0dXJuIFNUQVJFUVVBTDsKLQkJfQotCQlicmVhazsKLQljYXNlICcvJzoKLQkJc3dpdGNoIChjMikgewotCQljYXNlICcvJzoJcmV0dXJuIERPVUJMRVNMQVNIOwotCQljYXNlICc9JzoJcmV0dXJuIFNMQVNIRVFVQUw7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSAnfCc6Ci0JCXN3aXRjaCAoYzIpIHsKLQkJY2FzZSAnPSc6CXJldHVybiBWQkFSRVFVQUw7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSAnJSc6Ci0JCXN3aXRjaCAoYzIpIHsKLQkJY2FzZSAnPSc6CXJldHVybiBQRVJDRU5URVFVQUw7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSAnJic6Ci0JCXN3aXRjaCAoYzIpIHsKLQkJY2FzZSAnPSc6CXJldHVybiBBTVBFUkVRVUFMOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgJ14nOgotCQlzd2l0Y2ggKGMyKSB7Ci0JCWNhc2UgJz0nOglyZXR1cm4gQ0lSQ1VNRkxFWEVRVUFMOwotCQl9Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gT1A7CisgICAgc3dpdGNoIChjMSkgeworICAgIGNhc2UgJz0nOgorICAgICAgICBzd2l0Y2ggKGMyKSB7CisgICAgICAgIGNhc2UgJz0nOiAgICAgICAgICAgICAgIHJldHVybiBFUUVRVUFMOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJyEnOgorICAgICAgICBzd2l0Y2ggKGMyKSB7CisgICAgICAgIGNhc2UgJz0nOiAgICAgICAgICAgICAgIHJldHVybiBOT1RFUVVBTDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlICc8JzoKKyAgICAgICAgc3dpdGNoIChjMikgeworICAgICAgICBjYXNlICc+JzogICAgICAgICAgICAgICByZXR1cm4gTk9URVFVQUw7CisgICAgICAgIGNhc2UgJz0nOiAgICAgICAgICAgICAgIHJldHVybiBMRVNTRVFVQUw7CisgICAgICAgIGNhc2UgJzwnOiAgICAgICAgICAgICAgIHJldHVybiBMRUZUU0hJRlQ7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnPic6CisgICAgICAgIHN3aXRjaCAoYzIpIHsKKyAgICAgICAgY2FzZSAnPSc6ICAgICAgICAgICAgICAgcmV0dXJuIEdSRUFURVJFUVVBTDsKKyAgICAgICAgY2FzZSAnPic6ICAgICAgICAgICAgICAgcmV0dXJuIFJJR0hUU0hJRlQ7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnKyc6CisgICAgICAgIHN3aXRjaCAoYzIpIHsKKyAgICAgICAgY2FzZSAnPSc6ICAgICAgICAgICAgICAgcmV0dXJuIFBMVVNFUVVBTDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlICctJzoKKyAgICAgICAgc3dpdGNoIChjMikgeworICAgICAgICBjYXNlICc9JzogICAgICAgICAgICAgICByZXR1cm4gTUlORVFVQUw7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnKic6CisgICAgICAgIHN3aXRjaCAoYzIpIHsKKyAgICAgICAgY2FzZSAnKic6ICAgICAgICAgICAgICAgcmV0dXJuIERPVUJMRVNUQVI7CisgICAgICAgIGNhc2UgJz0nOiAgICAgICAgICAgICAgIHJldHVybiBTVEFSRVFVQUw7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnLyc6CisgICAgICAgIHN3aXRjaCAoYzIpIHsKKyAgICAgICAgY2FzZSAnLyc6ICAgICAgICAgICAgICAgcmV0dXJuIERPVUJMRVNMQVNIOworICAgICAgICBjYXNlICc9JzogICAgICAgICAgICAgICByZXR1cm4gU0xBU0hFUVVBTDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlICd8JzoKKyAgICAgICAgc3dpdGNoIChjMikgeworICAgICAgICBjYXNlICc9JzogICAgICAgICAgICAgICByZXR1cm4gVkJBUkVRVUFMOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJyUnOgorICAgICAgICBzd2l0Y2ggKGMyKSB7CisgICAgICAgIGNhc2UgJz0nOiAgICAgICAgICAgICAgIHJldHVybiBQRVJDRU5URVFVQUw7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnJic6CisgICAgICAgIHN3aXRjaCAoYzIpIHsKKyAgICAgICAgY2FzZSAnPSc6ICAgICAgICAgICAgICAgcmV0dXJuIEFNUEVSRVFVQUw7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnXic6CisgICAgICAgIHN3aXRjaCAoYzIpIHsKKyAgICAgICAgY2FzZSAnPSc6ICAgICAgICAgICAgICAgcmV0dXJuIENJUkNVTUZMRVhFUVVBTDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIE9QOwogfQogCiBpbnQKIFB5VG9rZW5fVGhyZWVDaGFycyhpbnQgYzEsIGludCBjMiwgaW50IGMzKQogewotCXN3aXRjaCAoYzEpIHsKLQljYXNlICc8JzoKLQkJc3dpdGNoIChjMikgewotCQljYXNlICc8JzoKLQkJCXN3aXRjaCAoYzMpIHsKLQkJCWNhc2UgJz0nOgotCQkJCXJldHVybiBMRUZUU0hJRlRFUVVBTDsKLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgJz4nOgotCQlzd2l0Y2ggKGMyKSB7Ci0JCWNhc2UgJz4nOgotCQkJc3dpdGNoIChjMykgewotCQkJY2FzZSAnPSc6Ci0JCQkJcmV0dXJuIFJJR0hUU0hJRlRFUVVBTDsKLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgJyonOgotCQlzd2l0Y2ggKGMyKSB7Ci0JCWNhc2UgJyonOgotCQkJc3dpdGNoIChjMykgewotCQkJY2FzZSAnPSc6Ci0JCQkJcmV0dXJuIERPVUJMRVNUQVJFUVVBTDsKLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgJy8nOgotCQlzd2l0Y2ggKGMyKSB7Ci0JCWNhc2UgJy8nOgotCQkJc3dpdGNoIChjMykgewotCQkJY2FzZSAnPSc6Ci0JCQkJcmV0dXJuIERPVUJMRVNMQVNIRVFVQUw7Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCQlicmVhazsKLQl9Ci0JcmV0dXJuIE9QOworICAgIHN3aXRjaCAoYzEpIHsKKyAgICBjYXNlICc8JzoKKyAgICAgICAgc3dpdGNoIChjMikgeworICAgICAgICBjYXNlICc8JzoKKyAgICAgICAgICAgIHN3aXRjaCAoYzMpIHsKKyAgICAgICAgICAgIGNhc2UgJz0nOgorICAgICAgICAgICAgICAgIHJldHVybiBMRUZUU0hJRlRFUVVBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJz4nOgorICAgICAgICBzd2l0Y2ggKGMyKSB7CisgICAgICAgIGNhc2UgJz4nOgorICAgICAgICAgICAgc3dpdGNoIChjMykgeworICAgICAgICAgICAgY2FzZSAnPSc6CisgICAgICAgICAgICAgICAgcmV0dXJuIFJJR0hUU0hJRlRFUVVBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJyonOgorICAgICAgICBzd2l0Y2ggKGMyKSB7CisgICAgICAgIGNhc2UgJyonOgorICAgICAgICAgICAgc3dpdGNoIChjMykgeworICAgICAgICAgICAgY2FzZSAnPSc6CisgICAgICAgICAgICAgICAgcmV0dXJuIERPVUJMRVNUQVJFUVVBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJy8nOgorICAgICAgICBzd2l0Y2ggKGMyKSB7CisgICAgICAgIGNhc2UgJy8nOgorICAgICAgICAgICAgc3dpdGNoIChjMykgeworICAgICAgICAgICAgY2FzZSAnPSc6CisgICAgICAgICAgICAgICAgcmV0dXJuIERPVUJMRVNMQVNIRVFVQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIE9QOwogfQogCiBzdGF0aWMgaW50CiBpbmRlbnRlcnJvcihzdHJ1Y3QgdG9rX3N0YXRlICp0b2spCiB7Ci0JaWYgKHRvay0+YWx0ZXJyb3IpIHsKLQkJdG9rLT5kb25lID0gRV9UQUJTUEFDRTsKLQkJdG9rLT5jdXIgPSB0b2stPmlucDsKLQkJcmV0dXJuIDE7Ci0JfQotCWlmICh0b2stPmFsdHdhcm5pbmcpIHsKLQkJUHlTeXNfV3JpdGVTdGRlcnIoIiVzOiBpbmNvbnNpc3RlbnQgdXNlIG9mIHRhYnMgYW5kIHNwYWNlcyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluIGluZGVudGF0aW9uXG4iLCB0b2stPmZpbGVuYW1lKTsKLQkJdG9rLT5hbHR3YXJuaW5nID0gMDsKLQl9Ci0JcmV0dXJuIDA7CisgICAgaWYgKHRvay0+YWx0ZXJyb3IpIHsKKyAgICAgICAgdG9rLT5kb25lID0gRV9UQUJTUEFDRTsKKyAgICAgICAgdG9rLT5jdXIgPSB0b2stPmlucDsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmICh0b2stPmFsdHdhcm5pbmcpIHsKKyAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoIiVzOiBpbmNvbnNpc3RlbnQgdXNlIG9mIHRhYnMgYW5kIHNwYWNlcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJpbiBpbmRlbnRhdGlvblxuIiwgdG9rLT5maWxlbmFtZSk7CisgICAgICAgIHRvay0+YWx0d2FybmluZyA9IDA7CisgICAgfQorICAgIHJldHVybiAwOwogfQogCiAKQEAgLTExMzgsNDY2ICsxMTM4LDQ2NiBAQAogc3RhdGljIGludAogdG9rX2dldChyZWdpc3RlciBzdHJ1Y3QgdG9rX3N0YXRlICp0b2ssIGNoYXIgKipwX3N0YXJ0LCBjaGFyICoqcF9lbmQpCiB7Ci0JcmVnaXN0ZXIgaW50IGM7Ci0JaW50IGJsYW5rbGluZTsKKyAgICByZWdpc3RlciBpbnQgYzsKKyAgICBpbnQgYmxhbmtsaW5lOwogCi0JKnBfc3RhcnQgPSAqcF9lbmQgPSBOVUxMOworICAgICpwX3N0YXJ0ID0gKnBfZW5kID0gTlVMTDsKICAgbmV4dGxpbmU6Ci0JdG9rLT5zdGFydCA9IE5VTEw7Ci0JYmxhbmtsaW5lID0gMDsKKyAgICB0b2stPnN0YXJ0ID0gTlVMTDsKKyAgICBibGFua2xpbmUgPSAwOwogCi0JLyogR2V0IGluZGVudGF0aW9uIGxldmVsICovCi0JaWYgKHRvay0+YXRib2wpIHsKLQkJcmVnaXN0ZXIgaW50IGNvbCA9IDA7Ci0JCXJlZ2lzdGVyIGludCBhbHRjb2wgPSAwOwotCQl0b2stPmF0Ym9sID0gMDsKLQkJZm9yICg7OykgewotCQkJYyA9IHRva19uZXh0Yyh0b2spOwotCQkJaWYgKGMgPT0gJyAnKQotCQkJCWNvbCsrLCBhbHRjb2wrKzsKLQkJCWVsc2UgaWYgKGMgPT0gJ1x0JykgewotCQkJCWNvbCA9IChjb2wvdG9rLT50YWJzaXplICsgMSkgKiB0b2stPnRhYnNpemU7Ci0JCQkJYWx0Y29sID0gKGFsdGNvbC90b2stPmFsdHRhYnNpemUgKyAxKQotCQkJCQkqIHRvay0+YWx0dGFic2l6ZTsKLQkJCX0KLQkJCWVsc2UgaWYgKGMgPT0gJ1wwMTQnKSAvKiBDb250cm9sLUwgKGZvcm1mZWVkKSAqLwotCQkJCWNvbCA9IGFsdGNvbCA9IDA7IC8qIEZvciBFbWFjcyB1c2VycyAqLwotCQkJZWxzZQotCQkJCWJyZWFrOwotCQl9Ci0JCXRva19iYWNrdXAodG9rLCBjKTsKLQkJaWYgKGMgPT0gJyMnIHx8IGMgPT0gJ1xuJykgewotCQkJLyogTGluZXMgd2l0aCBvbmx5IHdoaXRlc3BhY2UgYW5kL29yIGNvbW1lbnRzCi0JCQkgICBzaG91bGRuJ3QgYWZmZWN0IHRoZSBpbmRlbnRhdGlvbiBhbmQgYXJlCi0JCQkgICBub3QgcGFzc2VkIHRvIHRoZSBwYXJzZXIgYXMgTkVXTElORSB0b2tlbnMsCi0JCQkgICBleGNlcHQgKnRvdGFsbHkqIGVtcHR5IGxpbmVzIGluIGludGVyYWN0aXZlCi0JCQkgICBtb2RlLCB3aGljaCBzaWduYWwgdGhlIGVuZCBvZiBhIGNvbW1hbmQgZ3JvdXAuICovCi0JCQlpZiAoY29sID09IDAgJiYgYyA9PSAnXG4nICYmIHRvay0+cHJvbXB0ICE9IE5VTEwpCi0JCQkJYmxhbmtsaW5lID0gMDsgLyogTGV0IGl0IHRocm91Z2ggKi8KLQkJCWVsc2UKLQkJCQlibGFua2xpbmUgPSAxOyAvKiBJZ25vcmUgY29tcGxldGVseSAqLwotCQkJLyogV2UgY2FuJ3QganVtcCBiYWNrIHJpZ2h0IGhlcmUgc2luY2Ugd2Ugc3RpbGwKLQkJCSAgIG1heSBuZWVkIHRvIHNraXAgdG8gdGhlIGVuZCBvZiBhIGNvbW1lbnQgKi8KLQkJfQotCQlpZiAoIWJsYW5rbGluZSAmJiB0b2stPmxldmVsID09IDApIHsKLQkJCWlmIChjb2wgPT0gdG9rLT5pbmRzdGFja1t0b2stPmluZGVudF0pIHsKLQkJCQkvKiBObyBjaGFuZ2UgKi8KLQkJCQlpZiAoYWx0Y29sICE9IHRvay0+YWx0aW5kc3RhY2tbdG9rLT5pbmRlbnRdKSB7Ci0JCQkJCWlmIChpbmRlbnRlcnJvcih0b2spKQotCQkJCQkJcmV0dXJuIEVSUk9SVE9LRU47Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoY29sID4gdG9rLT5pbmRzdGFja1t0b2stPmluZGVudF0pIHsKLQkJCQkvKiBJbmRlbnQgLS0gYWx3YXlzIG9uZSAqLwotCQkJCWlmICh0b2stPmluZGVudCsxID49IE1BWElOREVOVCkgewotCQkJCQl0b2stPmRvbmUgPSBFX1RPT0RFRVA7Ci0JCQkJCXRvay0+Y3VyID0gdG9rLT5pbnA7Ci0JCQkJCXJldHVybiBFUlJPUlRPS0VOOwotCQkJCX0KLQkJCQlpZiAoYWx0Y29sIDw9IHRvay0+YWx0aW5kc3RhY2tbdG9rLT5pbmRlbnRdKSB7Ci0JCQkJCWlmIChpbmRlbnRlcnJvcih0b2spKQotCQkJCQkJcmV0dXJuIEVSUk9SVE9LRU47Ci0JCQkJfQotCQkJCXRvay0+cGVuZGluKys7Ci0JCQkJdG9rLT5pbmRzdGFja1srK3Rvay0+aW5kZW50XSA9IGNvbDsKLQkJCQl0b2stPmFsdGluZHN0YWNrW3Rvay0+aW5kZW50XSA9IGFsdGNvbDsKLQkJCX0KLQkJCWVsc2UgLyogY29sIDwgdG9rLT5pbmRzdGFja1t0b2stPmluZGVudF0gKi8gewotCQkJCS8qIERlZGVudCAtLSBhbnkgbnVtYmVyLCBtdXN0IGJlIGNvbnNpc3RlbnQgKi8KLQkJCQl3aGlsZSAodG9rLT5pbmRlbnQgPiAwICYmCi0JCQkJCWNvbCA8IHRvay0+aW5kc3RhY2tbdG9rLT5pbmRlbnRdKSB7Ci0JCQkJCXRvay0+cGVuZGluLS07Ci0JCQkJCXRvay0+aW5kZW50LS07Ci0JCQkJfQotCQkJCWlmIChjb2wgIT0gdG9rLT5pbmRzdGFja1t0b2stPmluZGVudF0pIHsKLQkJCQkJdG9rLT5kb25lID0gRV9ERURFTlQ7Ci0JCQkJCXRvay0+Y3VyID0gdG9rLT5pbnA7Ci0JCQkJCXJldHVybiBFUlJPUlRPS0VOOwotCQkJCX0KLQkJCQlpZiAoYWx0Y29sICE9IHRvay0+YWx0aW5kc3RhY2tbdG9rLT5pbmRlbnRdKSB7Ci0JCQkJCWlmIChpbmRlbnRlcnJvcih0b2spKQotCQkJCQkJcmV0dXJuIEVSUk9SVE9LRU47Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQorICAgIC8qIEdldCBpbmRlbnRhdGlvbiBsZXZlbCAqLworICAgIGlmICh0b2stPmF0Ym9sKSB7CisgICAgICAgIHJlZ2lzdGVyIGludCBjb2wgPSAwOworICAgICAgICByZWdpc3RlciBpbnQgYWx0Y29sID0gMDsKKyAgICAgICAgdG9rLT5hdGJvbCA9IDA7CisgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgIGMgPSB0b2tfbmV4dGModG9rKTsKKyAgICAgICAgICAgIGlmIChjID09ICcgJykKKyAgICAgICAgICAgICAgICBjb2wrKywgYWx0Y29sKys7CisgICAgICAgICAgICBlbHNlIGlmIChjID09ICdcdCcpIHsKKyAgICAgICAgICAgICAgICBjb2wgPSAoY29sL3Rvay0+dGFic2l6ZSArIDEpICogdG9rLT50YWJzaXplOworICAgICAgICAgICAgICAgIGFsdGNvbCA9IChhbHRjb2wvdG9rLT5hbHR0YWJzaXplICsgMSkKKyAgICAgICAgICAgICAgICAgICAgKiB0b2stPmFsdHRhYnNpemU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChjID09ICdcMDE0JykgLyogQ29udHJvbC1MIChmb3JtZmVlZCkgKi8KKyAgICAgICAgICAgICAgICBjb2wgPSBhbHRjb2wgPSAwOyAvKiBGb3IgRW1hY3MgdXNlcnMgKi8KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB0b2tfYmFja3VwKHRvaywgYyk7CisgICAgICAgIGlmIChjID09ICcjJyB8fCBjID09ICdcbicpIHsKKyAgICAgICAgICAgIC8qIExpbmVzIHdpdGggb25seSB3aGl0ZXNwYWNlIGFuZC9vciBjb21tZW50cworICAgICAgICAgICAgICAgc2hvdWxkbid0IGFmZmVjdCB0aGUgaW5kZW50YXRpb24gYW5kIGFyZQorICAgICAgICAgICAgICAgbm90IHBhc3NlZCB0byB0aGUgcGFyc2VyIGFzIE5FV0xJTkUgdG9rZW5zLAorICAgICAgICAgICAgICAgZXhjZXB0ICp0b3RhbGx5KiBlbXB0eSBsaW5lcyBpbiBpbnRlcmFjdGl2ZQorICAgICAgICAgICAgICAgbW9kZSwgd2hpY2ggc2lnbmFsIHRoZSBlbmQgb2YgYSBjb21tYW5kIGdyb3VwLiAqLworICAgICAgICAgICAgaWYgKGNvbCA9PSAwICYmIGMgPT0gJ1xuJyAmJiB0b2stPnByb21wdCAhPSBOVUxMKQorICAgICAgICAgICAgICAgIGJsYW5rbGluZSA9IDA7IC8qIExldCBpdCB0aHJvdWdoICovCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYmxhbmtsaW5lID0gMTsgLyogSWdub3JlIGNvbXBsZXRlbHkgKi8KKyAgICAgICAgICAgIC8qIFdlIGNhbid0IGp1bXAgYmFjayByaWdodCBoZXJlIHNpbmNlIHdlIHN0aWxsCisgICAgICAgICAgICAgICBtYXkgbmVlZCB0byBza2lwIHRvIHRoZSBlbmQgb2YgYSBjb21tZW50ICovCisgICAgICAgIH0KKyAgICAgICAgaWYgKCFibGFua2xpbmUgJiYgdG9rLT5sZXZlbCA9PSAwKSB7CisgICAgICAgICAgICBpZiAoY29sID09IHRvay0+aW5kc3RhY2tbdG9rLT5pbmRlbnRdKSB7CisgICAgICAgICAgICAgICAgLyogTm8gY2hhbmdlICovCisgICAgICAgICAgICAgICAgaWYgKGFsdGNvbCAhPSB0b2stPmFsdGluZHN0YWNrW3Rvay0+aW5kZW50XSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZW50ZXJyb3IodG9rKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUlRPS0VOOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGNvbCA+IHRvay0+aW5kc3RhY2tbdG9rLT5pbmRlbnRdKSB7CisgICAgICAgICAgICAgICAgLyogSW5kZW50IC0tIGFsd2F5cyBvbmUgKi8KKyAgICAgICAgICAgICAgICBpZiAodG9rLT5pbmRlbnQrMSA+PSBNQVhJTkRFTlQpIHsKKyAgICAgICAgICAgICAgICAgICAgdG9rLT5kb25lID0gRV9UT09ERUVQOworICAgICAgICAgICAgICAgICAgICB0b2stPmN1ciA9IHRvay0+aW5wOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JUT0tFTjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGFsdGNvbCA8PSB0b2stPmFsdGluZHN0YWNrW3Rvay0+aW5kZW50XSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZW50ZXJyb3IodG9rKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUlRPS0VOOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0b2stPnBlbmRpbisrOworICAgICAgICAgICAgICAgIHRvay0+aW5kc3RhY2tbKyt0b2stPmluZGVudF0gPSBjb2w7CisgICAgICAgICAgICAgICAgdG9rLT5hbHRpbmRzdGFja1t0b2stPmluZGVudF0gPSBhbHRjb2w7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIC8qIGNvbCA8IHRvay0+aW5kc3RhY2tbdG9rLT5pbmRlbnRdICovIHsKKyAgICAgICAgICAgICAgICAvKiBEZWRlbnQgLS0gYW55IG51bWJlciwgbXVzdCBiZSBjb25zaXN0ZW50ICovCisgICAgICAgICAgICAgICAgd2hpbGUgKHRvay0+aW5kZW50ID4gMCAmJgorICAgICAgICAgICAgICAgICAgICBjb2wgPCB0b2stPmluZHN0YWNrW3Rvay0+aW5kZW50XSkgeworICAgICAgICAgICAgICAgICAgICB0b2stPnBlbmRpbi0tOworICAgICAgICAgICAgICAgICAgICB0b2stPmluZGVudC0tOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoY29sICE9IHRvay0+aW5kc3RhY2tbdG9rLT5pbmRlbnRdKSB7CisgICAgICAgICAgICAgICAgICAgIHRvay0+ZG9uZSA9IEVfREVERU5UOworICAgICAgICAgICAgICAgICAgICB0b2stPmN1ciA9IHRvay0+aW5wOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JUT0tFTjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGFsdGNvbCAhPSB0b2stPmFsdGluZHN0YWNrW3Rvay0+aW5kZW50XSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZW50ZXJyb3IodG9rKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUlRPS0VOOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIAotCXRvay0+c3RhcnQgPSB0b2stPmN1cjsKKyAgICB0b2stPnN0YXJ0ID0gdG9rLT5jdXI7CiAKLQkvKiBSZXR1cm4gcGVuZGluZyBpbmRlbnRzL2RlZGVudHMgKi8KLQlpZiAodG9rLT5wZW5kaW4gIT0gMCkgewotCQlpZiAodG9rLT5wZW5kaW4gPCAwKSB7Ci0JCQl0b2stPnBlbmRpbisrOwotCQkJcmV0dXJuIERFREVOVDsKLQkJfQotCQllbHNlIHsKLQkJCXRvay0+cGVuZGluLS07Ci0JCQlyZXR1cm4gSU5ERU5UOwotCQl9Ci0JfQorICAgIC8qIFJldHVybiBwZW5kaW5nIGluZGVudHMvZGVkZW50cyAqLworICAgIGlmICh0b2stPnBlbmRpbiAhPSAwKSB7CisgICAgICAgIGlmICh0b2stPnBlbmRpbiA8IDApIHsKKyAgICAgICAgICAgIHRvay0+cGVuZGluKys7CisgICAgICAgICAgICByZXR1cm4gREVERU5UOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgdG9rLT5wZW5kaW4tLTsKKyAgICAgICAgICAgIHJldHVybiBJTkRFTlQ7CisgICAgICAgIH0KKyAgICB9CiAKICBhZ2FpbjoKLQl0b2stPnN0YXJ0ID0gTlVMTDsKLQkvKiBTa2lwIHNwYWNlcyAqLwotCWRvIHsKLQkJYyA9IHRva19uZXh0Yyh0b2spOwotCX0gd2hpbGUgKGMgPT0gJyAnIHx8IGMgPT0gJ1x0JyB8fCBjID09ICdcMDE0Jyk7CisgICAgdG9rLT5zdGFydCA9IE5VTEw7CisgICAgLyogU2tpcCBzcGFjZXMgKi8KKyAgICBkbyB7CisgICAgICAgIGMgPSB0b2tfbmV4dGModG9rKTsKKyAgICB9IHdoaWxlIChjID09ICcgJyB8fCBjID09ICdcdCcgfHwgYyA9PSAnXDAxNCcpOwogCi0JLyogU2V0IHN0YXJ0IG9mIGN1cnJlbnQgdG9rZW4gKi8KLQl0b2stPnN0YXJ0ID0gdG9rLT5jdXIgLSAxOworICAgIC8qIFNldCBzdGFydCBvZiBjdXJyZW50IHRva2VuICovCisgICAgdG9rLT5zdGFydCA9IHRvay0+Y3VyIC0gMTsKIAotCS8qIFNraXAgY29tbWVudCwgd2hpbGUgbG9va2luZyBmb3IgdGFiLXNldHRpbmcgbWFnaWMgKi8KLQlpZiAoYyA9PSAnIycpIHsKLQkJc3RhdGljIGNoYXIgKnRhYmZvcm1zW10gPSB7Ci0JCQkidGFiLXdpZHRoOiIsCQkvKiBFbWFjcyAqLwotCQkJIjp0YWJzdG9wPSIsCQkvKiB2aW0sIGZ1bGwgZm9ybSAqLwotCQkJIjp0cz0iLAkJCS8qIHZpbSwgYWJicmV2aWF0ZWQgZm9ybSAqLwotCQkJInNldCB0YWJzaXplPSIsCQkvKiB3aWxsIHZpIG5ldmVyIGRpZT8gKi8KLQkJLyogbW9yZSB0ZW1wbGF0ZXMgY2FuIGJlIGFkZGVkIGhlcmUgdG8gc3VwcG9ydCBvdGhlciBlZGl0b3JzICovCi0JCX07Ci0JCWNoYXIgY2J1Zls4MF07Ci0JCWNoYXIgKnRwLCAqKmNwOwotCQl0cCA9IGNidWY7Ci0JCWRvIHsKLQkJCSp0cCsrID0gYyA9IHRva19uZXh0Yyh0b2spOwotCQl9IHdoaWxlIChjICE9IEVPRiAmJiBjICE9ICdcbicgJiYKLQkJCSAoc2l6ZV90KSh0cCAtIGNidWYgKyAxKSA8IHNpemVvZihjYnVmKSk7Ci0JCSp0cCA9ICdcMCc7Ci0JCWZvciAoY3AgPSB0YWJmb3JtczsKLQkJICAgICBjcCA8IHRhYmZvcm1zICsgc2l6ZW9mKHRhYmZvcm1zKS9zaXplb2YodGFiZm9ybXNbMF0pOwotCQkgICAgIGNwKyspIHsKLQkJCWlmICgodHAgPSBzdHJzdHIoY2J1ZiwgKmNwKSkpIHsKLQkJCQlpbnQgbmV3c2l6ZSA9IGF0b2kodHAgKyBzdHJsZW4oKmNwKSk7CisgICAgLyogU2tpcCBjb21tZW50LCB3aGlsZSBsb29raW5nIGZvciB0YWItc2V0dGluZyBtYWdpYyAqLworICAgIGlmIChjID09ICcjJykgeworICAgICAgICBzdGF0aWMgY2hhciAqdGFiZm9ybXNbXSA9IHsKKyAgICAgICAgICAgICJ0YWItd2lkdGg6IiwgICAgICAgICAgICAgICAgICAgICAgIC8qIEVtYWNzICovCisgICAgICAgICAgICAiOnRhYnN0b3A9IiwgICAgICAgICAgICAgICAgICAgICAgICAvKiB2aW0sIGZ1bGwgZm9ybSAqLworICAgICAgICAgICAgIjp0cz0iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdmltLCBhYmJyZXZpYXRlZCBmb3JtICovCisgICAgICAgICAgICAic2V0IHRhYnNpemU9IiwgICAgICAgICAgICAgICAgICAgICAvKiB3aWxsIHZpIG5ldmVyIGRpZT8gKi8KKyAgICAgICAgLyogbW9yZSB0ZW1wbGF0ZXMgY2FuIGJlIGFkZGVkIGhlcmUgdG8gc3VwcG9ydCBvdGhlciBlZGl0b3JzICovCisgICAgICAgIH07CisgICAgICAgIGNoYXIgY2J1Zls4MF07CisgICAgICAgIGNoYXIgKnRwLCAqKmNwOworICAgICAgICB0cCA9IGNidWY7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgICp0cCsrID0gYyA9IHRva19uZXh0Yyh0b2spOworICAgICAgICB9IHdoaWxlIChjICE9IEVPRiAmJiBjICE9ICdcbicgJiYKKyAgICAgICAgICAgICAgICAgKHNpemVfdCkodHAgLSBjYnVmICsgMSkgPCBzaXplb2YoY2J1ZikpOworICAgICAgICAqdHAgPSAnXDAnOworICAgICAgICBmb3IgKGNwID0gdGFiZm9ybXM7CisgICAgICAgICAgICAgY3AgPCB0YWJmb3JtcyArIHNpemVvZih0YWJmb3Jtcykvc2l6ZW9mKHRhYmZvcm1zWzBdKTsKKyAgICAgICAgICAgICBjcCsrKSB7CisgICAgICAgICAgICBpZiAoKHRwID0gc3Ryc3RyKGNidWYsICpjcCkpKSB7CisgICAgICAgICAgICAgICAgaW50IG5ld3NpemUgPSBhdG9pKHRwICsgc3RybGVuKCpjcCkpOwogCi0JCQkJaWYgKG5ld3NpemUgPj0gMSAmJiBuZXdzaXplIDw9IDQwKSB7Ci0JCQkJCXRvay0+dGFic2l6ZSA9IG5ld3NpemU7Ci0JCQkJCWlmIChQeV9WZXJib3NlRmxhZykKLQkJCQkJICAgIFB5U3lzX1dyaXRlU3RkZXJyKAotCQkJCQkJIlRhYiBzaXplIHNldCB0byAlZFxuIiwKLQkJCQkJCW5ld3NpemUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQl3aGlsZSAoYyAhPSBFT0YgJiYgYyAhPSAnXG4nKQotCQkJYyA9IHRva19uZXh0Yyh0b2spOwotCX0KKyAgICAgICAgICAgICAgICBpZiAobmV3c2l6ZSA+PSAxICYmIG5ld3NpemUgPD0gNDApIHsKKyAgICAgICAgICAgICAgICAgICAgdG9rLT50YWJzaXplID0gbmV3c2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFB5X1ZlcmJvc2VGbGFnKQorICAgICAgICAgICAgICAgICAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoCisgICAgICAgICAgICAgICAgICAgICAgICAiVGFiIHNpemUgc2V0IHRvICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3c2l6ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHdoaWxlIChjICE9IEVPRiAmJiBjICE9ICdcbicpCisgICAgICAgICAgICBjID0gdG9rX25leHRjKHRvayk7CisgICAgfQogCi0JLyogQ2hlY2sgZm9yIEVPRiBhbmQgZXJyb3JzIG5vdyAqLwotCWlmIChjID09IEVPRikgewotCQlyZXR1cm4gdG9rLT5kb25lID09IEVfRU9GID8gRU5ETUFSS0VSIDogRVJST1JUT0tFTjsKLQl9CisgICAgLyogQ2hlY2sgZm9yIEVPRiBhbmQgZXJyb3JzIG5vdyAqLworICAgIGlmIChjID09IEVPRikgeworICAgICAgICByZXR1cm4gdG9rLT5kb25lID09IEVfRU9GID8gRU5ETUFSS0VSIDogRVJST1JUT0tFTjsKKyAgICB9CiAKLQkvKiBJZGVudGlmaWVyIChtb3N0IGZyZXF1ZW50IHRva2VuISkgKi8KLQlpZiAoaXNhbHBoYShjKSB8fCBjID09ICdfJykgewotCQkvKiBQcm9jZXNzIHIiIiwgdSIiIGFuZCB1ciIiICovCi0JCXN3aXRjaCAoYykgewotCQljYXNlICdiJzoKLQkJY2FzZSAnQic6Ci0JCQljID0gdG9rX25leHRjKHRvayk7Ci0JCQlpZiAoYyA9PSAncicgfHwgYyA9PSAnUicpCi0JCQkJYyA9IHRva19uZXh0Yyh0b2spOwotCQkJaWYgKGMgPT0gJyInIHx8IGMgPT0gJ1wnJykKLQkJCQlnb3RvIGxldHRlcl9xdW90ZTsKLQkJCWJyZWFrOwotCQljYXNlICdyJzoKLQkJY2FzZSAnUic6Ci0JCQljID0gdG9rX25leHRjKHRvayk7Ci0JCQlpZiAoYyA9PSAnIicgfHwgYyA9PSAnXCcnKQotCQkJCWdvdG8gbGV0dGVyX3F1b3RlOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ3UnOgotCQljYXNlICdVJzoKLQkJCWMgPSB0b2tfbmV4dGModG9rKTsKLQkJCWlmIChjID09ICdyJyB8fCBjID09ICdSJykKLQkJCQljID0gdG9rX25leHRjKHRvayk7Ci0JCQlpZiAoYyA9PSAnIicgfHwgYyA9PSAnXCcnKQotCQkJCWdvdG8gbGV0dGVyX3F1b3RlOwotCQkJYnJlYWs7Ci0JCX0KLQkJd2hpbGUgKGlzYWxudW0oYykgfHwgYyA9PSAnXycpIHsKLQkJCWMgPSB0b2tfbmV4dGModG9rKTsKLQkJfQotCQl0b2tfYmFja3VwKHRvaywgYyk7Ci0JCSpwX3N0YXJ0ID0gdG9rLT5zdGFydDsKLQkJKnBfZW5kID0gdG9rLT5jdXI7Ci0JCXJldHVybiBOQU1FOwotCX0KKyAgICAvKiBJZGVudGlmaWVyIChtb3N0IGZyZXF1ZW50IHRva2VuISkgKi8KKyAgICBpZiAoaXNhbHBoYShjKSB8fCBjID09ICdfJykgeworICAgICAgICAvKiBQcm9jZXNzIHIiIiwgdSIiIGFuZCB1ciIiICovCisgICAgICAgIHN3aXRjaCAoYykgeworICAgICAgICBjYXNlICdiJzoKKyAgICAgICAgY2FzZSAnQic6CisgICAgICAgICAgICBjID0gdG9rX25leHRjKHRvayk7CisgICAgICAgICAgICBpZiAoYyA9PSAncicgfHwgYyA9PSAnUicpCisgICAgICAgICAgICAgICAgYyA9IHRva19uZXh0Yyh0b2spOworICAgICAgICAgICAgaWYgKGMgPT0gJyInIHx8IGMgPT0gJ1wnJykKKyAgICAgICAgICAgICAgICBnb3RvIGxldHRlcl9xdW90ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdyJzoKKyAgICAgICAgY2FzZSAnUic6CisgICAgICAgICAgICBjID0gdG9rX25leHRjKHRvayk7CisgICAgICAgICAgICBpZiAoYyA9PSAnIicgfHwgYyA9PSAnXCcnKQorICAgICAgICAgICAgICAgIGdvdG8gbGV0dGVyX3F1b3RlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ3UnOgorICAgICAgICBjYXNlICdVJzoKKyAgICAgICAgICAgIGMgPSB0b2tfbmV4dGModG9rKTsKKyAgICAgICAgICAgIGlmIChjID09ICdyJyB8fCBjID09ICdSJykKKyAgICAgICAgICAgICAgICBjID0gdG9rX25leHRjKHRvayk7CisgICAgICAgICAgICBpZiAoYyA9PSAnIicgfHwgYyA9PSAnXCcnKQorICAgICAgICAgICAgICAgIGdvdG8gbGV0dGVyX3F1b3RlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKGlzYWxudW0oYykgfHwgYyA9PSAnXycpIHsKKyAgICAgICAgICAgIGMgPSB0b2tfbmV4dGModG9rKTsKKyAgICAgICAgfQorICAgICAgICB0b2tfYmFja3VwKHRvaywgYyk7CisgICAgICAgICpwX3N0YXJ0ID0gdG9rLT5zdGFydDsKKyAgICAgICAgKnBfZW5kID0gdG9rLT5jdXI7CisgICAgICAgIHJldHVybiBOQU1FOworICAgIH0KIAotCS8qIE5ld2xpbmUgKi8KLQlpZiAoYyA9PSAnXG4nKSB7Ci0JCXRvay0+YXRib2wgPSAxOwotCQlpZiAoYmxhbmtsaW5lIHx8IHRvay0+bGV2ZWwgPiAwKQotCQkJZ290byBuZXh0bGluZTsKLQkJKnBfc3RhcnQgPSB0b2stPnN0YXJ0OwotCQkqcF9lbmQgPSB0b2stPmN1ciAtIDE7IC8qIExlYXZlICdcbicgb3V0IG9mIHRoZSBzdHJpbmcgKi8KLSAgICAgICAgICAgICAgICB0b2stPmNvbnRfbGluZSA9IDA7Ci0JCXJldHVybiBORVdMSU5FOwotCX0KKyAgICAvKiBOZXdsaW5lICovCisgICAgaWYgKGMgPT0gJ1xuJykgeworICAgICAgICB0b2stPmF0Ym9sID0gMTsKKyAgICAgICAgaWYgKGJsYW5rbGluZSB8fCB0b2stPmxldmVsID4gMCkKKyAgICAgICAgICAgIGdvdG8gbmV4dGxpbmU7CisgICAgICAgICpwX3N0YXJ0ID0gdG9rLT5zdGFydDsKKyAgICAgICAgKnBfZW5kID0gdG9rLT5jdXIgLSAxOyAvKiBMZWF2ZSAnXG4nIG91dCBvZiB0aGUgc3RyaW5nICovCisgICAgICAgIHRvay0+Y29udF9saW5lID0gMDsKKyAgICAgICAgcmV0dXJuIE5FV0xJTkU7CisgICAgfQogCi0JLyogUGVyaW9kIG9yIG51bWJlciBzdGFydGluZyB3aXRoIHBlcmlvZD8gKi8KLQlpZiAoYyA9PSAnLicpIHsKLQkJYyA9IHRva19uZXh0Yyh0b2spOwotCQlpZiAoaXNkaWdpdChjKSkgewotCQkJZ290byBmcmFjdGlvbjsKLQkJfQotCQllbHNlIHsKLQkJCXRva19iYWNrdXAodG9rLCBjKTsKLQkJCSpwX3N0YXJ0ID0gdG9rLT5zdGFydDsKLQkJCSpwX2VuZCA9IHRvay0+Y3VyOwotCQkJcmV0dXJuIERPVDsKLQkJfQotCX0KKyAgICAvKiBQZXJpb2Qgb3IgbnVtYmVyIHN0YXJ0aW5nIHdpdGggcGVyaW9kPyAqLworICAgIGlmIChjID09ICcuJykgeworICAgICAgICBjID0gdG9rX25leHRjKHRvayk7CisgICAgICAgIGlmIChpc2RpZ2l0KGMpKSB7CisgICAgICAgICAgICBnb3RvIGZyYWN0aW9uOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgdG9rX2JhY2t1cCh0b2ssIGMpOworICAgICAgICAgICAgKnBfc3RhcnQgPSB0b2stPnN0YXJ0OworICAgICAgICAgICAgKnBfZW5kID0gdG9rLT5jdXI7CisgICAgICAgICAgICByZXR1cm4gRE9UOworICAgICAgICB9CisgICAgfQogCi0JLyogTnVtYmVyICovCi0JaWYgKGlzZGlnaXQoYykpIHsKLQkJaWYgKGMgPT0gJzAnKSB7Ci0JCQkvKiBIZXgsIG9jdGFsIG9yIGJpbmFyeSAtLSBtYXliZS4gKi8KLQkJCWMgPSB0b2tfbmV4dGModG9rKTsKLQkJCWlmIChjID09ICcuJykKLQkJCQlnb3RvIGZyYWN0aW9uOworICAgIC8qIE51bWJlciAqLworICAgIGlmIChpc2RpZ2l0KGMpKSB7CisgICAgICAgIGlmIChjID09ICcwJykgeworICAgICAgICAgICAgLyogSGV4LCBvY3RhbCBvciBiaW5hcnkgLS0gbWF5YmUuICovCisgICAgICAgICAgICBjID0gdG9rX25leHRjKHRvayk7CisgICAgICAgICAgICBpZiAoYyA9PSAnLicpCisgICAgICAgICAgICAgICAgZ290byBmcmFjdGlvbjsKICNpZm5kZWYgV0lUSE9VVF9DT01QTEVYCi0JCQlpZiAoYyA9PSAnaicgfHwgYyA9PSAnSicpCi0JCQkJZ290byBpbWFnaW5hcnk7CisgICAgICAgICAgICBpZiAoYyA9PSAnaicgfHwgYyA9PSAnSicpCisgICAgICAgICAgICAgICAgZ290byBpbWFnaW5hcnk7CiAjZW5kaWYKLQkJCWlmIChjID09ICd4JyB8fCBjID09ICdYJykgeworICAgICAgICAgICAgaWYgKGMgPT0gJ3gnIHx8IGMgPT0gJ1gnKSB7CiAKLQkJCQkvKiBIZXggKi8KLQkJCQljID0gdG9rX25leHRjKHRvayk7Ci0JCQkJaWYgKCFpc3hkaWdpdChjKSkgewotCQkJCQl0b2stPmRvbmUgPSBFX1RPS0VOOwotCQkJCQl0b2tfYmFja3VwKHRvaywgYyk7Ci0JCQkJCXJldHVybiBFUlJPUlRPS0VOOwotCQkJCX0KLQkJCQlkbyB7Ci0JCQkJCWMgPSB0b2tfbmV4dGModG9rKTsKLQkJCQl9IHdoaWxlIChpc3hkaWdpdChjKSk7Ci0JCQl9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjID09ICdvJyB8fCBjID09ICdPJykgewotCQkJCS8qIE9jdGFsICovCi0JCQkJYyA9IHRva19uZXh0Yyh0b2spOwotCQkJCWlmIChjIDwgJzAnIHx8IGMgPj0gJzgnKSB7Ci0JCQkJCXRvay0+ZG9uZSA9IEVfVE9LRU47Ci0JCQkJCXRva19iYWNrdXAodG9rLCBjKTsKLQkJCQkJcmV0dXJuIEVSUk9SVE9LRU47Ci0JCQkJfQotCQkJCWRvIHsKLQkJCQkJYyA9IHRva19uZXh0Yyh0b2spOwotCQkJCX0gd2hpbGUgKCcwJyA8PSBjICYmIGMgPCAnOCcpOwotCQkJfQotCQkJZWxzZSBpZiAoYyA9PSAnYicgfHwgYyA9PSAnQicpIHsKLQkJCQkvKiBCaW5hcnkgKi8KLQkJCQljID0gdG9rX25leHRjKHRvayk7Ci0JCQkJaWYgKGMgIT0gJzAnICYmIGMgIT0gJzEnKSB7Ci0JCQkJCXRvay0+ZG9uZSA9IEVfVE9LRU47Ci0JCQkJCXRva19iYWNrdXAodG9rLCBjKTsKLQkJCQkJcmV0dXJuIEVSUk9SVE9LRU47Ci0JCQkJfQotCQkJCWRvIHsKLQkJCQkJYyA9IHRva19uZXh0Yyh0b2spOwotCQkJCX0gd2hpbGUgKGMgPT0gJzAnIHx8IGMgPT0gJzEnKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWludCBmb3VuZF9kZWNpbWFsID0gMDsKLQkJCQkvKiBPY3RhbDsgYyBpcyBmaXJzdCBjaGFyIG9mIGl0ICovCi0JCQkJLyogVGhlcmUncyBubyAnaXNvY3RkaWdpdCcgbWFjcm8sIHNpZ2ggKi8KLQkJCQl3aGlsZSAoJzAnIDw9IGMgJiYgYyA8ICc4JykgewotCQkJCQljID0gdG9rX25leHRjKHRvayk7Ci0JCQkJfQotCQkJCWlmIChpc2RpZ2l0KGMpKSB7Ci0JCQkJCWZvdW5kX2RlY2ltYWwgPSAxOwotCQkJCQlkbyB7Ci0JCQkJCQljID0gdG9rX25leHRjKHRvayk7Ci0JCQkJCX0gd2hpbGUgKGlzZGlnaXQoYykpOwotCQkJCX0KLQkJCQlpZiAoYyA9PSAnLicpCi0JCQkJCWdvdG8gZnJhY3Rpb247Ci0JCQkJZWxzZSBpZiAoYyA9PSAnZScgfHwgYyA9PSAnRScpCi0JCQkJCWdvdG8gZXhwb25lbnQ7CisgICAgICAgICAgICAgICAgLyogSGV4ICovCisgICAgICAgICAgICAgICAgYyA9IHRva19uZXh0Yyh0b2spOworICAgICAgICAgICAgICAgIGlmICghaXN4ZGlnaXQoYykpIHsKKyAgICAgICAgICAgICAgICAgICAgdG9rLT5kb25lID0gRV9UT0tFTjsKKyAgICAgICAgICAgICAgICAgICAgdG9rX2JhY2t1cCh0b2ssIGMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JUT0tFTjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICBjID0gdG9rX25leHRjKHRvayk7CisgICAgICAgICAgICAgICAgfSB3aGlsZSAoaXN4ZGlnaXQoYykpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoYyA9PSAnbycgfHwgYyA9PSAnTycpIHsKKyAgICAgICAgICAgICAgICAvKiBPY3RhbCAqLworICAgICAgICAgICAgICAgIGMgPSB0b2tfbmV4dGModG9rKTsKKyAgICAgICAgICAgICAgICBpZiAoYyA8ICcwJyB8fCBjID49ICc4JykgeworICAgICAgICAgICAgICAgICAgICB0b2stPmRvbmUgPSBFX1RPS0VOOworICAgICAgICAgICAgICAgICAgICB0b2tfYmFja3VwKHRvaywgYyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUlRPS0VOOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgIGMgPSB0b2tfbmV4dGModG9rKTsKKyAgICAgICAgICAgICAgICB9IHdoaWxlICgnMCcgPD0gYyAmJiBjIDwgJzgnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGMgPT0gJ2InIHx8IGMgPT0gJ0InKSB7CisgICAgICAgICAgICAgICAgLyogQmluYXJ5ICovCisgICAgICAgICAgICAgICAgYyA9IHRva19uZXh0Yyh0b2spOworICAgICAgICAgICAgICAgIGlmIChjICE9ICcwJyAmJiBjICE9ICcxJykgeworICAgICAgICAgICAgICAgICAgICB0b2stPmRvbmUgPSBFX1RPS0VOOworICAgICAgICAgICAgICAgICAgICB0b2tfYmFja3VwKHRvaywgYyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUlRPS0VOOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgIGMgPSB0b2tfbmV4dGModG9rKTsKKyAgICAgICAgICAgICAgICB9IHdoaWxlIChjID09ICcwJyB8fCBjID09ICcxJyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnQgZm91bmRfZGVjaW1hbCA9IDA7CisgICAgICAgICAgICAgICAgLyogT2N0YWw7IGMgaXMgZmlyc3QgY2hhciBvZiBpdCAqLworICAgICAgICAgICAgICAgIC8qIFRoZXJlJ3Mgbm8gJ2lzb2N0ZGlnaXQnIG1hY3JvLCBzaWdoICovCisgICAgICAgICAgICAgICAgd2hpbGUgKCcwJyA8PSBjICYmIGMgPCAnOCcpIHsKKyAgICAgICAgICAgICAgICAgICAgYyA9IHRva19uZXh0Yyh0b2spOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaXNkaWdpdChjKSkgeworICAgICAgICAgICAgICAgICAgICBmb3VuZF9kZWNpbWFsID0gMTsKKyAgICAgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICAgICAgYyA9IHRva19uZXh0Yyh0b2spOworICAgICAgICAgICAgICAgICAgICB9IHdoaWxlIChpc2RpZ2l0KGMpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGMgPT0gJy4nKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZyYWN0aW9uOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKGMgPT0gJ2UnIHx8IGMgPT0gJ0UnKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGV4cG9uZW50OwogI2lmbmRlZiBXSVRIT1VUX0NPTVBMRVgKLQkJCQllbHNlIGlmIChjID09ICdqJyB8fCBjID09ICdKJykKLQkJCQkJZ290byBpbWFnaW5hcnk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoYyA9PSAnaicgfHwgYyA9PSAnSicpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gaW1hZ2luYXJ5OwogI2VuZGlmCi0JCQkJZWxzZSBpZiAoZm91bmRfZGVjaW1hbCkgewotCQkJCQl0b2stPmRvbmUgPSBFX1RPS0VOOwotCQkJCQl0b2tfYmFja3VwKHRvaywgYyk7Ci0JCQkJCXJldHVybiBFUlJPUlRPS0VOOwotCQkJCX0KLQkJCX0KLQkJCWlmIChjID09ICdsJyB8fCBjID09ICdMJykKLQkJCQljID0gdG9rX25leHRjKHRvayk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvKiBEZWNpbWFsICovCi0JCQlkbyB7Ci0JCQkJYyA9IHRva19uZXh0Yyh0b2spOwotCQkJfSB3aGlsZSAoaXNkaWdpdChjKSk7Ci0JCQlpZiAoYyA9PSAnbCcgfHwgYyA9PSAnTCcpCi0JCQkJYyA9IHRva19uZXh0Yyh0b2spOwotCQkJZWxzZSB7Ci0JCQkJLyogQWNjZXB0IGZsb2F0aW5nIHBvaW50IG51bWJlcnMuICovCi0JCQkJaWYgKGMgPT0gJy4nKSB7Ci0JCWZyYWN0aW9uOgotCQkJCQkvKiBGcmFjdGlvbiAqLwotCQkJCQlkbyB7Ci0JCQkJCQljID0gdG9rX25leHRjKHRvayk7Ci0JCQkJCX0gd2hpbGUgKGlzZGlnaXQoYykpOwotCQkJCX0KLQkJCQlpZiAoYyA9PSAnZScgfHwgYyA9PSAnRScpIHsKLQkJZXhwb25lbnQ6Ci0JCQkJCS8qIEV4cG9uZW50IHBhcnQgKi8KLQkJCQkJYyA9IHRva19uZXh0Yyh0b2spOwotCQkJCQlpZiAoYyA9PSAnKycgfHwgYyA9PSAnLScpCi0JCQkJCQljID0gdG9rX25leHRjKHRvayk7Ci0JCQkJCWlmICghaXNkaWdpdChjKSkgewotCQkJCQkJdG9rLT5kb25lID0gRV9UT0tFTjsKLQkJCQkJCXRva19iYWNrdXAodG9rLCBjKTsKLQkJCQkJCXJldHVybiBFUlJPUlRPS0VOOwotCQkJCQl9Ci0JCQkJCWRvIHsKLQkJCQkJCWMgPSB0b2tfbmV4dGModG9rKTsKLQkJCQkJfSB3aGlsZSAoaXNkaWdpdChjKSk7Ci0JCQkJfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGZvdW5kX2RlY2ltYWwpIHsKKyAgICAgICAgICAgICAgICAgICAgdG9rLT5kb25lID0gRV9UT0tFTjsKKyAgICAgICAgICAgICAgICAgICAgdG9rX2JhY2t1cCh0b2ssIGMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JUT0tFTjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYyA9PSAnbCcgfHwgYyA9PSAnTCcpCisgICAgICAgICAgICAgICAgYyA9IHRva19uZXh0Yyh0b2spOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLyogRGVjaW1hbCAqLworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGMgPSB0b2tfbmV4dGModG9rKTsKKyAgICAgICAgICAgIH0gd2hpbGUgKGlzZGlnaXQoYykpOworICAgICAgICAgICAgaWYgKGMgPT0gJ2wnIHx8IGMgPT0gJ0wnKQorICAgICAgICAgICAgICAgIGMgPSB0b2tfbmV4dGModG9rKTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIC8qIEFjY2VwdCBmbG9hdGluZyBwb2ludCBudW1iZXJzLiAqLworICAgICAgICAgICAgICAgIGlmIChjID09ICcuJykgeworICAgICAgICBmcmFjdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgLyogRnJhY3Rpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICAgICAgYyA9IHRva19uZXh0Yyh0b2spOworICAgICAgICAgICAgICAgICAgICB9IHdoaWxlIChpc2RpZ2l0KGMpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGMgPT0gJ2UnIHx8IGMgPT0gJ0UnKSB7CisgICAgICAgIGV4cG9uZW50OgorICAgICAgICAgICAgICAgICAgICAvKiBFeHBvbmVudCBwYXJ0ICovCisgICAgICAgICAgICAgICAgICAgIGMgPSB0b2tfbmV4dGModG9rKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGMgPT0gJysnIHx8IGMgPT0gJy0nKQorICAgICAgICAgICAgICAgICAgICAgICAgYyA9IHRva19uZXh0Yyh0b2spOworICAgICAgICAgICAgICAgICAgICBpZiAoIWlzZGlnaXQoYykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRvay0+ZG9uZSA9IEVfVE9LRU47CisgICAgICAgICAgICAgICAgICAgICAgICB0b2tfYmFja3VwKHRvaywgYyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JUT0tFTjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgICAgICBjID0gdG9rX25leHRjKHRvayk7CisgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKGlzZGlnaXQoYykpOworICAgICAgICAgICAgICAgIH0KICNpZm5kZWYgV0lUSE9VVF9DT01QTEVYCi0JCQkJaWYgKGMgPT0gJ2onIHx8IGMgPT0gJ0onKQotCQkJCQkvKiBJbWFnaW5hcnkgcGFydCAqLwotCQlpbWFnaW5hcnk6Ci0JCQkJCWMgPSB0b2tfbmV4dGModG9rKTsKKyAgICAgICAgICAgICAgICBpZiAoYyA9PSAnaicgfHwgYyA9PSAnSicpCisgICAgICAgICAgICAgICAgICAgIC8qIEltYWdpbmFyeSBwYXJ0ICovCisgICAgICAgIGltYWdpbmFyeToKKyAgICAgICAgICAgICAgICAgICAgYyA9IHRva19uZXh0Yyh0b2spOwogI2VuZGlmCi0JCQl9Ci0JCX0KLQkJdG9rX2JhY2t1cCh0b2ssIGMpOwotCQkqcF9zdGFydCA9IHRvay0+c3RhcnQ7Ci0JCSpwX2VuZCA9IHRvay0+Y3VyOwotCQlyZXR1cm4gTlVNQkVSOwotCX0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB0b2tfYmFja3VwKHRvaywgYyk7CisgICAgICAgICpwX3N0YXJ0ID0gdG9rLT5zdGFydDsKKyAgICAgICAgKnBfZW5kID0gdG9rLT5jdXI7CisgICAgICAgIHJldHVybiBOVU1CRVI7CisgICAgfQogCiAgIGxldHRlcl9xdW90ZToKLQkvKiBTdHJpbmcgKi8KLQlpZiAoYyA9PSAnXCcnIHx8IGMgPT0gJyInKSB7Ci0JCVB5X3NzaXplX3QgcXVvdGUyID0gdG9rLT5jdXIgLSB0b2stPnN0YXJ0ICsgMTsKLQkJaW50IHF1b3RlID0gYzsKLQkJaW50IHRyaXBsZSA9IDA7Ci0JCWludCB0cmlwY291bnQgPSAwOwotCQlmb3IgKDs7KSB7Ci0JCQljID0gdG9rX25leHRjKHRvayk7Ci0JCQlpZiAoYyA9PSAnXG4nKSB7Ci0JCQkJaWYgKCF0cmlwbGUpIHsKLQkJCQkJdG9rLT5kb25lID0gRV9FT0xTOwotCQkJCQl0b2tfYmFja3VwKHRvaywgYyk7Ci0JCQkJCXJldHVybiBFUlJPUlRPS0VOOwotCQkJCX0KLQkJCQl0cmlwY291bnQgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2stPmNvbnRfbGluZSA9IDE7IC8qIG11bHRpbGluZSBzdHJpbmcuICovCi0JCQl9Ci0JCQllbHNlIGlmIChjID09IEVPRikgewotCQkJCWlmICh0cmlwbGUpCi0JCQkJCXRvay0+ZG9uZSA9IEVfRU9GUzsKLQkJCQllbHNlCi0JCQkJCXRvay0+ZG9uZSA9IEVfRU9MUzsKLQkJCQl0b2stPmN1ciA9IHRvay0+aW5wOwotCQkJCXJldHVybiBFUlJPUlRPS0VOOwotCQkJfQotCQkJZWxzZSBpZiAoYyA9PSBxdW90ZSkgewotCQkJCXRyaXBjb3VudCsrOwotCQkJCWlmICh0b2stPmN1ciAtIHRvay0+c3RhcnQgPT0gcXVvdGUyKSB7Ci0JCQkJCWMgPSB0b2tfbmV4dGModG9rKTsKLQkJCQkJaWYgKGMgPT0gcXVvdGUpIHsKLQkJCQkJCXRyaXBsZSA9IDE7Ci0JCQkJCQl0cmlwY291bnQgPSAwOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJdG9rX2JhY2t1cCh0b2ssIGMpOwotCQkJCX0KLQkJCQlpZiAoIXRyaXBsZSB8fCB0cmlwY291bnQgPT0gMykKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQllbHNlIGlmIChjID09ICdcXCcpIHsKLQkJCQl0cmlwY291bnQgPSAwOwotCQkJCWMgPSB0b2tfbmV4dGModG9rKTsKLQkJCQlpZiAoYyA9PSBFT0YpIHsKLQkJCQkJdG9rLT5kb25lID0gRV9FT0xTOwotCQkJCQl0b2stPmN1ciA9IHRvay0+aW5wOwotCQkJCQlyZXR1cm4gRVJST1JUT0tFTjsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlCi0JCQkJdHJpcGNvdW50ID0gMDsKLQkJfQotCQkqcF9zdGFydCA9IHRvay0+c3RhcnQ7Ci0JCSpwX2VuZCA9IHRvay0+Y3VyOwotCQlyZXR1cm4gU1RSSU5HOwotCX0KKyAgICAvKiBTdHJpbmcgKi8KKyAgICBpZiAoYyA9PSAnXCcnIHx8IGMgPT0gJyInKSB7CisgICAgICAgIFB5X3NzaXplX3QgcXVvdGUyID0gdG9rLT5jdXIgLSB0b2stPnN0YXJ0ICsgMTsKKyAgICAgICAgaW50IHF1b3RlID0gYzsKKyAgICAgICAgaW50IHRyaXBsZSA9IDA7CisgICAgICAgIGludCB0cmlwY291bnQgPSAwOworICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICBjID0gdG9rX25leHRjKHRvayk7CisgICAgICAgICAgICBpZiAoYyA9PSAnXG4nKSB7CisgICAgICAgICAgICAgICAgaWYgKCF0cmlwbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdG9rLT5kb25lID0gRV9FT0xTOworICAgICAgICAgICAgICAgICAgICB0b2tfYmFja3VwKHRvaywgYyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUlRPS0VOOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0cmlwY291bnQgPSAwOworICAgICAgICAgICAgICAgIHRvay0+Y29udF9saW5lID0gMTsgLyogbXVsdGlsaW5lIHN0cmluZy4gKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGMgPT0gRU9GKSB7CisgICAgICAgICAgICAgICAgaWYgKHRyaXBsZSkKKyAgICAgICAgICAgICAgICAgICAgdG9rLT5kb25lID0gRV9FT0ZTOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdG9rLT5kb25lID0gRV9FT0xTOworICAgICAgICAgICAgICAgIHRvay0+Y3VyID0gdG9rLT5pbnA7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SVE9LRU47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChjID09IHF1b3RlKSB7CisgICAgICAgICAgICAgICAgdHJpcGNvdW50Kys7CisgICAgICAgICAgICAgICAgaWYgKHRvay0+Y3VyIC0gdG9rLT5zdGFydCA9PSBxdW90ZTIpIHsKKyAgICAgICAgICAgICAgICAgICAgYyA9IHRva19uZXh0Yyh0b2spOworICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PSBxdW90ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJpcGxlID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyaXBjb3VudCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB0b2tfYmFja3VwKHRvaywgYyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghdHJpcGxlIHx8IHRyaXBjb3VudCA9PSAzKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGMgPT0gJ1xcJykgeworICAgICAgICAgICAgICAgIHRyaXBjb3VudCA9IDA7CisgICAgICAgICAgICAgICAgYyA9IHRva19uZXh0Yyh0b2spOworICAgICAgICAgICAgICAgIGlmIChjID09IEVPRikgeworICAgICAgICAgICAgICAgICAgICB0b2stPmRvbmUgPSBFX0VPTFM7CisgICAgICAgICAgICAgICAgICAgIHRvay0+Y3VyID0gdG9rLT5pbnA7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUlRPS0VOOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB0cmlwY291bnQgPSAwOworICAgICAgICB9CisgICAgICAgICpwX3N0YXJ0ID0gdG9rLT5zdGFydDsKKyAgICAgICAgKnBfZW5kID0gdG9rLT5jdXI7CisgICAgICAgIHJldHVybiBTVFJJTkc7CisgICAgfQogCi0JLyogTGluZSBjb250aW51YXRpb24gKi8KLQlpZiAoYyA9PSAnXFwnKSB7Ci0JCWMgPSB0b2tfbmV4dGModG9rKTsKLQkJaWYgKGMgIT0gJ1xuJykgewotCQkJdG9rLT5kb25lID0gRV9MSU5FQ09OVDsKLQkJCXRvay0+Y3VyID0gdG9rLT5pbnA7Ci0JCQlyZXR1cm4gRVJST1JUT0tFTjsKLQkJfQotICAgICAgICAgICAgICAgIHRvay0+Y29udF9saW5lID0gMTsKLQkJZ290byBhZ2FpbjsgLyogUmVhZCBuZXh0IGxpbmUgKi8KLQl9CisgICAgLyogTGluZSBjb250aW51YXRpb24gKi8KKyAgICBpZiAoYyA9PSAnXFwnKSB7CisgICAgICAgIGMgPSB0b2tfbmV4dGModG9rKTsKKyAgICAgICAgaWYgKGMgIT0gJ1xuJykgeworICAgICAgICAgICAgdG9rLT5kb25lID0gRV9MSU5FQ09OVDsKKyAgICAgICAgICAgIHRvay0+Y3VyID0gdG9rLT5pbnA7CisgICAgICAgICAgICByZXR1cm4gRVJST1JUT0tFTjsKKyAgICAgICAgfQorICAgICAgICB0b2stPmNvbnRfbGluZSA9IDE7CisgICAgICAgIGdvdG8gYWdhaW47IC8qIFJlYWQgbmV4dCBsaW5lICovCisgICAgfQogCi0JLyogQ2hlY2sgZm9yIHR3by1jaGFyYWN0ZXIgdG9rZW4gKi8KLQl7Ci0JCWludCBjMiA9IHRva19uZXh0Yyh0b2spOwotCQlpbnQgdG9rZW4gPSBQeVRva2VuX1R3b0NoYXJzKGMsIGMyKTsKKyAgICAvKiBDaGVjayBmb3IgdHdvLWNoYXJhY3RlciB0b2tlbiAqLworICAgIHsKKyAgICAgICAgaW50IGMyID0gdG9rX25leHRjKHRvayk7CisgICAgICAgIGludCB0b2tlbiA9IFB5VG9rZW5fVHdvQ2hhcnMoYywgYzIpOwogI2lmbmRlZiBQR0VOCi0JCWlmIChQeV9QeTNrV2FybmluZ0ZsYWcgJiYgdG9rZW4gPT0gTk9URVFVQUwgJiYgYyA9PSAnPCcpIHsKLQkJCWlmIChQeUVycl9XYXJuRXhwbGljaXQoUHlFeGNfRGVwcmVjYXRpb25XYXJuaW5nLAotCQkJCQkgICAgICAgIjw+IG5vdCBzdXBwb3J0ZWQgaW4gMy54OyB1c2UgIT0iLAotCQkJCQkgICAgICAgdG9rLT5maWxlbmFtZSwgdG9rLT5saW5lbm8sCi0JCQkJCSAgICAgICBOVUxMLCBOVUxMKSkgewotCQkJCXJldHVybiBFUlJPUlRPS0VOOwotCQkJfQotCQl9CisgICAgICAgIGlmIChQeV9QeTNrV2FybmluZ0ZsYWcgJiYgdG9rZW4gPT0gTk9URVFVQUwgJiYgYyA9PSAnPCcpIHsKKyAgICAgICAgICAgIGlmIChQeUVycl9XYXJuRXhwbGljaXQoUHlFeGNfRGVwcmVjYXRpb25XYXJuaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPD4gbm90IHN1cHBvcnRlZCBpbiAzLng7IHVzZSAhPSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvay0+ZmlsZW5hbWUsIHRvay0+bGluZW5vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUlRPS0VOOworICAgICAgICAgICAgfQorICAgICAgICB9CiAjZW5kaWYKLQkJaWYgKHRva2VuICE9IE9QKSB7Ci0JCQlpbnQgYzMgPSB0b2tfbmV4dGModG9rKTsKLQkJCWludCB0b2tlbjMgPSBQeVRva2VuX1RocmVlQ2hhcnMoYywgYzIsIGMzKTsKLQkJCWlmICh0b2tlbjMgIT0gT1ApIHsKLQkJCQl0b2tlbiA9IHRva2VuMzsKLQkJCX0gZWxzZSB7Ci0JCQkJdG9rX2JhY2t1cCh0b2ssIGMzKTsKLQkJCX0KLQkJCSpwX3N0YXJ0ID0gdG9rLT5zdGFydDsKLQkJCSpwX2VuZCA9IHRvay0+Y3VyOwotCQkJcmV0dXJuIHRva2VuOwotCQl9Ci0JCXRva19iYWNrdXAodG9rLCBjMik7Ci0JfQorICAgICAgICBpZiAodG9rZW4gIT0gT1ApIHsKKyAgICAgICAgICAgIGludCBjMyA9IHRva19uZXh0Yyh0b2spOworICAgICAgICAgICAgaW50IHRva2VuMyA9IFB5VG9rZW5fVGhyZWVDaGFycyhjLCBjMiwgYzMpOworICAgICAgICAgICAgaWYgKHRva2VuMyAhPSBPUCkgeworICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW4zOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0b2tfYmFja3VwKHRvaywgYzMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKnBfc3RhcnQgPSB0b2stPnN0YXJ0OworICAgICAgICAgICAgKnBfZW5kID0gdG9rLT5jdXI7CisgICAgICAgICAgICByZXR1cm4gdG9rZW47CisgICAgICAgIH0KKyAgICAgICAgdG9rX2JhY2t1cCh0b2ssIGMyKTsKKyAgICB9CiAKLQkvKiBLZWVwIHRyYWNrIG9mIHBhcmVudGhlc2VzIG5lc3RpbmcgbGV2ZWwgKi8KLQlzd2l0Y2ggKGMpIHsKLQljYXNlICcoJzoKLQljYXNlICdbJzoKLQljYXNlICd7JzoKLQkJdG9rLT5sZXZlbCsrOwotCQlicmVhazsKLQljYXNlICcpJzoKLQljYXNlICddJzoKLQljYXNlICd9JzoKLQkJdG9rLT5sZXZlbC0tOwotCQlicmVhazsKLQl9CisgICAgLyogS2VlcCB0cmFjayBvZiBwYXJlbnRoZXNlcyBuZXN0aW5nIGxldmVsICovCisgICAgc3dpdGNoIChjKSB7CisgICAgY2FzZSAnKCc6CisgICAgY2FzZSAnWyc6CisgICAgY2FzZSAneyc6CisgICAgICAgIHRvay0+bGV2ZWwrKzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnKSc6CisgICAgY2FzZSAnXSc6CisgICAgY2FzZSAnfSc6CisgICAgICAgIHRvay0+bGV2ZWwtLTsKKyAgICAgICAgYnJlYWs7CisgICAgfQogCi0JLyogUHVuY3R1YXRpb24gY2hhcmFjdGVyICovCi0JKnBfc3RhcnQgPSB0b2stPnN0YXJ0OwotCSpwX2VuZCA9IHRvay0+Y3VyOwotCXJldHVybiBQeVRva2VuX09uZUNoYXIoYyk7CisgICAgLyogUHVuY3R1YXRpb24gY2hhcmFjdGVyICovCisgICAgKnBfc3RhcnQgPSB0b2stPnN0YXJ0OworICAgICpwX2VuZCA9IHRvay0+Y3VyOworICAgIHJldHVybiBQeVRva2VuX09uZUNoYXIoYyk7CiB9CiAKIGludAogUHlUb2tlbml6ZXJfR2V0KHN0cnVjdCB0b2tfc3RhdGUgKnRvaywgY2hhciAqKnBfc3RhcnQsIGNoYXIgKipwX2VuZCkKIHsKLQlpbnQgcmVzdWx0ID0gdG9rX2dldCh0b2ssIHBfc3RhcnQsIHBfZW5kKTsKLQlpZiAodG9rLT5kZWNvZGluZ19lcnJlZCkgewotCQlyZXN1bHQgPSBFUlJPUlRPS0VOOwotCQl0b2stPmRvbmUgPSBFX0RFQ09ERTsKLQl9Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBpbnQgcmVzdWx0ID0gdG9rX2dldCh0b2ssIHBfc3RhcnQsIHBfZW5kKTsKKyAgICBpZiAodG9rLT5kZWNvZGluZ19lcnJlZCkgeworICAgICAgICByZXN1bHQgPSBFUlJPUlRPS0VOOworICAgICAgICB0b2stPmRvbmUgPSBFX0RFQ09ERTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogLyogVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCBmcm9tIHBhcnNldG9rLiBIb3dldmVyLCBpdCBjYW5ub3QgbGl2ZQpAQCAtMTYwOCw1NCArMTYwOCw1NCBAQAogY2hhcioKIFB5VG9rZW5pemVyX1Jlc3RvcmVFbmNvZGluZyhzdHJ1Y3QgdG9rX3N0YXRlKiB0b2ssIGludCBsZW4sIGludCogb2Zmc2V0KQogewotCXJldHVybiBOVUxMOworICAgIHJldHVybiBOVUxMOwogfQogI2Vsc2UKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCiBzdGF0aWMgUHlPYmplY3QgKgogZGVjX3V0ZjgoY29uc3QgY2hhciAqZW5jLCBjb25zdCBjaGFyICp0ZXh0LCBzaXplX3QgbGVuKSB7Ci0JUHlPYmplY3QgKnJldCA9IE5VTEw7CQotCVB5T2JqZWN0ICp1bmljb2RlX3RleHQgPSBQeVVuaWNvZGVfRGVjb2RlVVRGOCh0ZXh0LCBsZW4sICJyZXBsYWNlIik7Ci0JaWYgKHVuaWNvZGVfdGV4dCkgewotCQlyZXQgPSBQeVVuaWNvZGVfQXNFbmNvZGVkU3RyaW5nKHVuaWNvZGVfdGV4dCwgZW5jLCAicmVwbGFjZSIpOwotCQlQeV9ERUNSRUYodW5pY29kZV90ZXh0KTsKLQl9Ci0JaWYgKCFyZXQpIHsKLQkJUHlFcnJfQ2xlYXIoKTsKLQl9Ci0JcmV0dXJuIHJldDsKKyAgICBQeU9iamVjdCAqcmV0ID0gTlVMTDsKKyAgICBQeU9iamVjdCAqdW5pY29kZV90ZXh0ID0gUHlVbmljb2RlX0RlY29kZVVURjgodGV4dCwgbGVuLCAicmVwbGFjZSIpOworICAgIGlmICh1bmljb2RlX3RleHQpIHsKKyAgICAgICAgcmV0ID0gUHlVbmljb2RlX0FzRW5jb2RlZFN0cmluZyh1bmljb2RlX3RleHQsIGVuYywgInJlcGxhY2UiKTsKKyAgICAgICAgUHlfREVDUkVGKHVuaWNvZGVfdGV4dCk7CisgICAgfQorICAgIGlmICghcmV0KSB7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgfQorICAgIHJldHVybiByZXQ7CiB9CiBjaGFyICoKIFB5VG9rZW5pemVyX1Jlc3RvcmVFbmNvZGluZyhzdHJ1Y3QgdG9rX3N0YXRlKiB0b2ssIGludCBsZW4sIGludCAqb2Zmc2V0KQogewotCWNoYXIgKnRleHQgPSBOVUxMOwotCWlmICh0b2stPmVuY29kaW5nKSB7Ci0JCS8qIGNvbnZlcnQgc291cmNlIHRvIG9yaWdpbmFsIGVuY29uZGlnICovCi0JCVB5T2JqZWN0ICpsaW5lb2JqID0gZGVjX3V0ZjgodG9rLT5lbmNvZGluZywgdG9rLT5idWYsIGxlbik7Ci0JCWlmIChsaW5lb2JqICE9IE5VTEwpIHsKLQkJCWludCBsaW5lbGVuID0gUHlTdHJpbmdfU2l6ZShsaW5lb2JqKTsKLQkJCWNvbnN0IGNoYXIgKmxpbmUgPSBQeVN0cmluZ19Bc1N0cmluZyhsaW5lb2JqKTsKLQkJCXRleHQgPSBQeU9iamVjdF9NQUxMT0MobGluZWxlbiArIDEpOwotCQkJaWYgKHRleHQgIT0gTlVMTCAmJiBsaW5lICE9IE5VTEwpIHsKLQkJCQlpZiAobGluZWxlbikKLQkJCQkJc3RybmNweSh0ZXh0LCBsaW5lLCBsaW5lbGVuKTsKLQkJCQl0ZXh0W2xpbmVsZW5dID0gJ1wwJzsKLQkJCX0KLQkJCVB5X0RFQ1JFRihsaW5lb2JqKTsKLQkJCQkJCi0JCQkvKiBhZGp1c3QgZXJyb3Igb2Zmc2V0ICovCi0JCQlpZiAoKm9mZnNldCA+IDEpIHsKLQkJCQlQeU9iamVjdCAqb2Zmc2V0b2JqID0gZGVjX3V0ZjgodG9rLT5lbmNvZGluZywgCi0JCQkJCQkJICAgICAgIHRvay0+YnVmLCAqb2Zmc2V0LTEpOwotCQkJCWlmIChvZmZzZXRvYmopIHsKLQkJCQkJKm9mZnNldCA9IFB5U3RyaW5nX1NpemUob2Zmc2V0b2JqKSArIDE7Ci0JCQkJCVB5X0RFQ1JFRihvZmZzZXRvYmopOwotCQkJCX0KLQkJCX0KLQkJCQotCQl9Ci0JfQotCXJldHVybiB0ZXh0OworICAgIGNoYXIgKnRleHQgPSBOVUxMOworICAgIGlmICh0b2stPmVuY29kaW5nKSB7CisgICAgICAgIC8qIGNvbnZlcnQgc291cmNlIHRvIG9yaWdpbmFsIGVuY29uZGlnICovCisgICAgICAgIFB5T2JqZWN0ICpsaW5lb2JqID0gZGVjX3V0ZjgodG9rLT5lbmNvZGluZywgdG9rLT5idWYsIGxlbik7CisgICAgICAgIGlmIChsaW5lb2JqICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGludCBsaW5lbGVuID0gUHlTdHJpbmdfU2l6ZShsaW5lb2JqKTsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmxpbmUgPSBQeVN0cmluZ19Bc1N0cmluZyhsaW5lb2JqKTsKKyAgICAgICAgICAgIHRleHQgPSBQeU9iamVjdF9NQUxMT0MobGluZWxlbiArIDEpOworICAgICAgICAgICAgaWYgKHRleHQgIT0gTlVMTCAmJiBsaW5lICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpZiAobGluZWxlbikKKyAgICAgICAgICAgICAgICAgICAgc3RybmNweSh0ZXh0LCBsaW5lLCBsaW5lbGVuKTsKKyAgICAgICAgICAgICAgICB0ZXh0W2xpbmVsZW5dID0gJ1wwJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5X0RFQ1JFRihsaW5lb2JqKTsKKworICAgICAgICAgICAgLyogYWRqdXN0IGVycm9yIG9mZnNldCAqLworICAgICAgICAgICAgaWYgKCpvZmZzZXQgPiAxKSB7CisgICAgICAgICAgICAgICAgUHlPYmplY3QgKm9mZnNldG9iaiA9IGRlY191dGY4KHRvay0+ZW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvay0+YnVmLCAqb2Zmc2V0LTEpOworICAgICAgICAgICAgICAgIGlmIChvZmZzZXRvYmopIHsKKyAgICAgICAgICAgICAgICAgICAgKm9mZnNldCA9IFB5U3RyaW5nX1NpemUob2Zmc2V0b2JqKSArIDE7CisgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihvZmZzZXRvYmopOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0ZXh0OwogCiB9CiAjZW5kaWYgLyogZGVmaW5lZChQeV9VU0lOR19VTklDT0RFKSAqLwpAQCAtMTY2Nyw5ICsxNjY3LDkgQEAKIHZvaWQKIHRva19kdW1wKGludCB0eXBlLCBjaGFyICpzdGFydCwgY2hhciAqZW5kKQogewotCXByaW50ZigiJXMiLCBfUHlQYXJzZXJfVG9rZW5OYW1lc1t0eXBlXSk7Ci0JaWYgKHR5cGUgPT0gTkFNRSB8fCB0eXBlID09IE5VTUJFUiB8fCB0eXBlID09IFNUUklORyB8fCB0eXBlID09IE9QKQotCQlwcmludGYoIiglLipzKSIsIChpbnQpKGVuZCAtIHN0YXJ0KSwgc3RhcnQpOworICAgIHByaW50ZigiJXMiLCBfUHlQYXJzZXJfVG9rZW5OYW1lc1t0eXBlXSk7CisgICAgaWYgKHR5cGUgPT0gTkFNRSB8fCB0eXBlID09IE5VTUJFUiB8fCB0eXBlID09IFNUUklORyB8fCB0eXBlID09IE9QKQorICAgICAgICBwcmludGYoIiglLipzKSIsIChpbnQpKGVuZCAtIHN0YXJ0KSwgc3RhcnQpOwogfQogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL1BhcnNlci90b2tlbml6ZXIuaCBiL1BhcnNlci90b2tlbml6ZXIuaAppbmRleCBlMTA5NzJjLi4xOWFhNzAyIDEwMDY0NAotLS0gYS9QYXJzZXIvdG9rZW5pemVyLmgKKysrIGIvUGFyc2VyL3Rva2VuaXplci5oCkBAIC04LDUwICs4LDUwIEBACiAKIC8qIFRva2VuaXplciBpbnRlcmZhY2UgKi8KIAotI2luY2x1ZGUgInRva2VuLmgiCS8qIEZvciB0b2tlbiB0eXBlcyAqLworI2luY2x1ZGUgInRva2VuLmgiICAgICAgLyogRm9yIHRva2VuIHR5cGVzICovCiAKLSNkZWZpbmUgTUFYSU5ERU5UIDEwMAkvKiBNYXggaW5kZW50YXRpb24gbGV2ZWwgKi8KKyNkZWZpbmUgTUFYSU5ERU5UIDEwMCAgIC8qIE1heCBpbmRlbnRhdGlvbiBsZXZlbCAqLwogCiAvKiBUb2tlbml6ZXIgc3RhdGUgKi8KIHN0cnVjdCB0b2tfc3RhdGUgewotCS8qIElucHV0IHN0YXRlOyBidWYgPD0gY3VyIDw9IGlucCA8PSBlbmQgKi8KLQkvKiBOQiBhbiBlbnRpcmUgbGluZSBpcyBoZWxkIGluIHRoZSBidWZmZXIgKi8KLQljaGFyICpidWY7CS8qIElucHV0IGJ1ZmZlciwgb3IgTlVMTDsgbWFsbG9jJ2VkIGlmIGZwICE9IE5VTEwgKi8KLQljaGFyICpjdXI7CS8qIE5leHQgY2hhcmFjdGVyIGluIGJ1ZmZlciAqLwotCWNoYXIgKmlucDsJLyogRW5kIG9mIGRhdGEgaW4gYnVmZmVyICovCi0JY2hhciAqZW5kOwkvKiBFbmQgb2YgaW5wdXQgYnVmZmVyIGlmIGJ1ZiAhPSBOVUxMICovCi0JY2hhciAqc3RhcnQ7CS8qIFN0YXJ0IG9mIGN1cnJlbnQgdG9rZW4gaWYgbm90IE5VTEwgKi8KLQlpbnQgZG9uZTsJLyogRV9PSyBub3JtYWxseSwgRV9FT0YgYXQgRU9GLCBvdGhlcndpc2UgZXJyb3IgY29kZSAqLwotCS8qIE5CIElmIGRvbmUgIT0gRV9PSywgY3VyIG11c3QgYmUgPT0gaW5wISEhICovCi0JRklMRSAqZnA7CS8qIFJlc3Qgb2YgaW5wdXQ7IE5VTEwgaWYgdG9rZW5pemluZyBhIHN0cmluZyAqLwotCWludCB0YWJzaXplOwkvKiBUYWIgc3BhY2luZyAqLwotCWludCBpbmRlbnQ7CS8qIEN1cnJlbnQgaW5kZW50YXRpb24gaW5kZXggKi8KLQlpbnQgaW5kc3RhY2tbTUFYSU5ERU5UXTsJLyogU3RhY2sgb2YgaW5kZW50cyAqLwotCWludCBhdGJvbDsJLyogTm9uemVybyBpZiBhdCBiZWdpbiBvZiBuZXcgbGluZSAqLwotCWludCBwZW5kaW47CS8qIFBlbmRpbmcgaW5kZW50cyAoaWYgPiAwKSBvciBkZWRlbnRzIChpZiA8IDApICovCi0JY2hhciAqcHJvbXB0LCAqbmV4dHByb21wdDsJLyogRm9yIGludGVyYWN0aXZlIHByb21wdGluZyAqLwotCWludCBsaW5lbm87CS8qIEN1cnJlbnQgbGluZSBudW1iZXIgKi8KLQlpbnQgbGV2ZWw7CS8qICgpIFtdIHt9IFBhcmVudGhlc2VzIG5lc3RpbmcgbGV2ZWwgKi8KLQkJCS8qIFVzZWQgdG8gYWxsb3cgZnJlZSBjb250aW51YXRpb25zIGluc2lkZSB0aGVtICovCi0JLyogU3R1ZmYgZm9yIGNoZWNraW5nIG9uIGRpZmZlcmVudCB0YWIgc2l6ZXMgKi8KLQljb25zdCBjaGFyICpmaWxlbmFtZTsJLyogRm9yIGVycm9yIG1lc3NhZ2VzICovCi0JaW50IGFsdHdhcm5pbmc7CS8qIElzc3VlIHdhcm5pbmcgaWYgYWx0ZXJuYXRlIHRhYnMgZG9uJ3QgbWF0Y2ggKi8KLQlpbnQgYWx0ZXJyb3I7CS8qIElzc3VlIGVycm9yIGlmIGFsdGVybmF0ZSB0YWJzIGRvbid0IG1hdGNoICovCi0JaW50IGFsdHRhYnNpemU7CS8qIEFsdGVybmF0ZSB0YWIgc3BhY2luZyAqLwotCWludCBhbHRpbmRzdGFja1tNQVhJTkRFTlRdOwkvKiBTdGFjayBvZiBhbHRlcm5hdGUgaW5kZW50cyAqLwotCS8qIFN0dWZmIGZvciBQRVAgMDI2MyAqLwotCWludCBkZWNvZGluZ19zdGF0ZTsJLyogLTE6ZGVjb2RpbmcsIDA6aW5pdCwgMTpyYXcgKi8KLQlpbnQgZGVjb2RpbmdfZXJyZWQ7CS8qIHdoZXRoZXIgZXJyZWQgaW4gZGVjb2RpbmcgICovCi0JaW50IHJlYWRfY29kaW5nX3NwZWM7CS8qIHdoZXRoZXIgJ2NvZGluZzouLi4nIGhhcyBiZWVuIHJlYWQgICovCi0JY2hhciAqZW5jb2Rpbmc7Ci0JaW50IGNvbnRfbGluZTsgICAgICAgICAgLyogd2hldGhlciB3ZSBhcmUgaW4gYSBjb250aW51YXRpb24gbGluZS4gKi8KLQljb25zdCBjaGFyKiBsaW5lX3N0YXJ0OwkvKiBwb2ludGVyIHRvIHN0YXJ0IG9mIGN1cnJlbnQgbGluZSAqLworICAgIC8qIElucHV0IHN0YXRlOyBidWYgPD0gY3VyIDw9IGlucCA8PSBlbmQgKi8KKyAgICAvKiBOQiBhbiBlbnRpcmUgbGluZSBpcyBoZWxkIGluIHRoZSBidWZmZXIgKi8KKyAgICBjaGFyICpidWY7ICAgICAgICAgIC8qIElucHV0IGJ1ZmZlciwgb3IgTlVMTDsgbWFsbG9jJ2VkIGlmIGZwICE9IE5VTEwgKi8KKyAgICBjaGFyICpjdXI7ICAgICAgICAgIC8qIE5leHQgY2hhcmFjdGVyIGluIGJ1ZmZlciAqLworICAgIGNoYXIgKmlucDsgICAgICAgICAgLyogRW5kIG9mIGRhdGEgaW4gYnVmZmVyICovCisgICAgY2hhciAqZW5kOyAgICAgICAgICAvKiBFbmQgb2YgaW5wdXQgYnVmZmVyIGlmIGJ1ZiAhPSBOVUxMICovCisgICAgY2hhciAqc3RhcnQ7ICAgICAgICAvKiBTdGFydCBvZiBjdXJyZW50IHRva2VuIGlmIG5vdCBOVUxMICovCisgICAgaW50IGRvbmU7ICAgICAgICAgICAvKiBFX09LIG5vcm1hbGx5LCBFX0VPRiBhdCBFT0YsIG90aGVyd2lzZSBlcnJvciBjb2RlICovCisgICAgLyogTkIgSWYgZG9uZSAhPSBFX09LLCBjdXIgbXVzdCBiZSA9PSBpbnAhISEgKi8KKyAgICBGSUxFICpmcDsgICAgICAgICAgIC8qIFJlc3Qgb2YgaW5wdXQ7IE5VTEwgaWYgdG9rZW5pemluZyBhIHN0cmluZyAqLworICAgIGludCB0YWJzaXplOyAgICAgICAgLyogVGFiIHNwYWNpbmcgKi8KKyAgICBpbnQgaW5kZW50OyAgICAgICAgIC8qIEN1cnJlbnQgaW5kZW50YXRpb24gaW5kZXggKi8KKyAgICBpbnQgaW5kc3RhY2tbTUFYSU5ERU5UXTsgICAgICAgICAgICAvKiBTdGFjayBvZiBpbmRlbnRzICovCisgICAgaW50IGF0Ym9sOyAgICAgICAgICAvKiBOb256ZXJvIGlmIGF0IGJlZ2luIG9mIG5ldyBsaW5lICovCisgICAgaW50IHBlbmRpbjsgICAgICAgICAvKiBQZW5kaW5nIGluZGVudHMgKGlmID4gMCkgb3IgZGVkZW50cyAoaWYgPCAwKSAqLworICAgIGNoYXIgKnByb21wdCwgKm5leHRwcm9tcHQ7ICAgICAgICAgIC8qIEZvciBpbnRlcmFjdGl2ZSBwcm9tcHRpbmcgKi8KKyAgICBpbnQgbGluZW5vOyAgICAgICAgIC8qIEN1cnJlbnQgbGluZSBudW1iZXIgKi8KKyAgICBpbnQgbGV2ZWw7ICAgICAgICAgIC8qICgpIFtdIHt9IFBhcmVudGhlc2VzIG5lc3RpbmcgbGV2ZWwgKi8KKyAgICAgICAgICAgIC8qIFVzZWQgdG8gYWxsb3cgZnJlZSBjb250aW51YXRpb25zIGluc2lkZSB0aGVtICovCisgICAgLyogU3R1ZmYgZm9yIGNoZWNraW5nIG9uIGRpZmZlcmVudCB0YWIgc2l6ZXMgKi8KKyAgICBjb25zdCBjaGFyICpmaWxlbmFtZTsgICAgICAgLyogRm9yIGVycm9yIG1lc3NhZ2VzICovCisgICAgaW50IGFsdHdhcm5pbmc7ICAgICAvKiBJc3N1ZSB3YXJuaW5nIGlmIGFsdGVybmF0ZSB0YWJzIGRvbid0IG1hdGNoICovCisgICAgaW50IGFsdGVycm9yOyAgICAgICAvKiBJc3N1ZSBlcnJvciBpZiBhbHRlcm5hdGUgdGFicyBkb24ndCBtYXRjaCAqLworICAgIGludCBhbHR0YWJzaXplOyAgICAgLyogQWx0ZXJuYXRlIHRhYiBzcGFjaW5nICovCisgICAgaW50IGFsdGluZHN0YWNrW01BWElOREVOVF07ICAgICAgICAgLyogU3RhY2sgb2YgYWx0ZXJuYXRlIGluZGVudHMgKi8KKyAgICAvKiBTdHVmZiBmb3IgUEVQIDAyNjMgKi8KKyAgICBpbnQgZGVjb2Rpbmdfc3RhdGU7ICAgICAgICAgLyogLTE6ZGVjb2RpbmcsIDA6aW5pdCwgMTpyYXcgKi8KKyAgICBpbnQgZGVjb2RpbmdfZXJyZWQ7ICAgICAgICAgLyogd2hldGhlciBlcnJlZCBpbiBkZWNvZGluZyAgKi8KKyAgICBpbnQgcmVhZF9jb2Rpbmdfc3BlYzsgICAgICAgLyogd2hldGhlciAnY29kaW5nOi4uLicgaGFzIGJlZW4gcmVhZCAgKi8KKyAgICBjaGFyICplbmNvZGluZzsKKyAgICBpbnQgY29udF9saW5lOyAgICAgICAgICAvKiB3aGV0aGVyIHdlIGFyZSBpbiBhIGNvbnRpbnVhdGlvbiBsaW5lLiAqLworICAgIGNvbnN0IGNoYXIqIGxpbmVfc3RhcnQ7ICAgICAvKiBwb2ludGVyIHRvIHN0YXJ0IG9mIGN1cnJlbnQgbGluZSAqLwogI2lmbmRlZiBQR0VOCi0JUHlPYmplY3QgKmRlY29kaW5nX3JlYWRsaW5lOyAvKiBjb2RlY3Mub3BlbiguLi4pLnJlYWRsaW5lICovCi0JUHlPYmplY3QgKmRlY29kaW5nX2J1ZmZlcjsKKyAgICBQeU9iamVjdCAqZGVjb2RpbmdfcmVhZGxpbmU7IC8qIGNvZGVjcy5vcGVuKC4uLikucmVhZGxpbmUgKi8KKyAgICBQeU9iamVjdCAqZGVjb2RpbmdfYnVmZmVyOwogI2VuZGlmCi0JY29uc3QgY2hhciogZW5jOwotCWNvbnN0IGNoYXIqIHN0cjsKKyAgICBjb25zdCBjaGFyKiBlbmM7CisgICAgY29uc3QgY2hhciogc3RyOwogfTsKIAogZXh0ZXJuIHN0cnVjdCB0b2tfc3RhdGUgKlB5VG9rZW5pemVyX0Zyb21TdHJpbmcoY29uc3QgY2hhciAqKTsKQEAgLTU5LDggKzU5LDggQEAKIGV4dGVybiB2b2lkIFB5VG9rZW5pemVyX0ZyZWUoc3RydWN0IHRva19zdGF0ZSAqKTsKIGV4dGVybiBpbnQgUHlUb2tlbml6ZXJfR2V0KHN0cnVjdCB0b2tfc3RhdGUgKiwgY2hhciAqKiwgY2hhciAqKik7CiAjaWYgZGVmaW5lZChQR0VOKSB8fCBkZWZpbmVkKFB5X1VTSU5HX1VOSUNPREUpCi1leHRlcm4gY2hhciAqIFB5VG9rZW5pemVyX1Jlc3RvcmVFbmNvZGluZyhzdHJ1Y3QgdG9rX3N0YXRlKiB0b2ssIAotCQkJCQkgIGludCBsZW4sIGludCAqb2Zmc2V0KTsKK2V4dGVybiBjaGFyICogUHlUb2tlbml6ZXJfUmVzdG9yZUVuY29kaW5nKHN0cnVjdCB0b2tfc3RhdGUqIHRvaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4sIGludCAqb2Zmc2V0KTsKICNlbmRpZgogCiAjaWZkZWYgX19jcGx1c3BsdXMKZGlmZiAtLWdpdCBhL1B5dGhvbi9fd2FybmluZ3MuYyBiL1B5dGhvbi9fd2FybmluZ3MuYwppbmRleCAxZjBmNThlLi4zMzEzYzU5IDEwMDY0NAotLS0gYS9QeXRob24vX3dhcm5pbmdzLmMKKysrIGIvUHl0aG9uL193YXJuaW5ncy5jCkBAIC0yMiwxMCArMjIsMTAgQEAKICAgICBpbnQgcmM7CiAKICAgICBpZiAob2JqID09IFB5X05vbmUpCi0gICAgICAgIHJldHVybiAxOworICAgIHJldHVybiAxOwogICAgIHJlc3VsdCA9IFB5T2JqZWN0X0NhbGxNZXRob2Qob2JqLCAibWF0Y2giLCAiTyIsIGFyZyk7CiAgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQotICAgICAgICByZXR1cm4gLTE7CisgICAgcmV0dXJuIC0xOwogCiAgICAgcmMgPSBQeU9iamVjdF9Jc1RydWUocmVzdWx0KTsKICAgICBQeV9ERUNSRUYocmVzdWx0KTsKQEAgLTQ1LDE5ICs0NSwxOSBAQAogICAgIGludCByZXN1bHQ7CiAKICAgICBpZiAod2FybmluZ3Nfc3RyID09IE5VTEwpIHsKLSAgICAgICAgd2FybmluZ3Nfc3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygid2FybmluZ3MiKTsKLSAgICAgICAgaWYgKHdhcm5pbmdzX3N0ciA9PSBOVUxMKQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgd2FybmluZ3Nfc3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygid2FybmluZ3MiKTsKKyAgICBpZiAod2FybmluZ3Nfc3RyID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAogICAgIGFsbF9tb2R1bGVzID0gUHlJbXBvcnRfR2V0TW9kdWxlRGljdCgpOwogICAgIHJlc3VsdCA9IFB5RGljdF9Db250YWlucyhhbGxfbW9kdWxlcywgd2FybmluZ3Nfc3RyKTsKICAgICBpZiAocmVzdWx0ID09IC0xIHx8IHJlc3VsdCA9PSAwKQotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gTlVMTDsKIAogICAgIHdhcm5pbmdzX21vZHVsZSA9IFB5RGljdF9HZXRJdGVtKGFsbF9tb2R1bGVzLCB3YXJuaW5nc19zdHIpOwogICAgIGlmICghUHlPYmplY3RfSGFzQXR0clN0cmluZyh3YXJuaW5nc19tb2R1bGUsIGF0dHIpKQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIHJldHVybiBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHdhcm5pbmdzX21vZHVsZSwgYXR0cik7CiB9CiAKQEAgLTY5LDkgKzY5LDkgQEAKIAogICAgIHJlZ2lzdHJ5ID0gZ2V0X3dhcm5pbmdzX2F0dHIoIm9uY2VyZWdpc3RyeSIpOwogICAgIGlmIChyZWdpc3RyeSA9PSBOVUxMKSB7Ci0gICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIHJldHVybiBfb25jZV9yZWdpc3RyeTsKKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIF9vbmNlX3JlZ2lzdHJ5OwogICAgIH0KICAgICBQeV9ERUNSRUYoX29uY2VfcmVnaXN0cnkpOwogICAgIF9vbmNlX3JlZ2lzdHJ5ID0gcmVnaXN0cnk7CkBAIC05MCw2MiArOTAsNjIgQEAKIAogICAgIHdhcm5pbmdzX2ZpbHRlcnMgPSBnZXRfd2FybmluZ3NfYXR0cigiZmlsdGVycyIpOwogICAgIGlmICh3YXJuaW5nc19maWx0ZXJzID09IE5VTEwpIHsKLSAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogICAgIGVsc2UgewotICAgICAgICBQeV9ERUNSRUYoX2ZpbHRlcnMpOwotICAgICAgICBfZmlsdGVycyA9IHdhcm5pbmdzX2ZpbHRlcnM7CisgICAgUHlfREVDUkVGKF9maWx0ZXJzKTsKKyAgICBfZmlsdGVycyA9IHdhcm5pbmdzX2ZpbHRlcnM7CiAgICAgfQogCiAgICAgaWYgKCFQeUxpc3RfQ2hlY2soX2ZpbHRlcnMpKSB7Ci0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgTU9EVUxFX05BTUUgIi5maWx0ZXJzIG11c3QgYmUgYSBsaXN0Iik7Ci0gICAgICAgIHJldHVybiBOVUxMOworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICBNT0RVTEVfTkFNRSAiLmZpbHRlcnMgbXVzdCBiZSBhIGxpc3QiKTsKKyAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKICAgICAvKiBfZmlsdGVycyBjb3VsZCBjaGFuZ2Ugd2hpbGUgd2UgYXJlIGl0ZXJhdGluZyBvdmVyIGl0LiAqLwogICAgIGZvciAoaSA9IDA7IGkgPCBQeUxpc3RfR0VUX1NJWkUoX2ZpbHRlcnMpOyBpKyspIHsKLSAgICAgICAgUHlPYmplY3QgKnRtcF9pdGVtLCAqYWN0aW9uLCAqbXNnLCAqY2F0LCAqbW9kLCAqbG5fb2JqOwotICAgICAgICBQeV9zc2l6ZV90IGxuOwotICAgICAgICBpbnQgaXNfc3ViY2xhc3MsIGdvb2RfbXNnLCBnb29kX21vZDsKKyAgICBQeU9iamVjdCAqdG1wX2l0ZW0sICphY3Rpb24sICptc2csICpjYXQsICptb2QsICpsbl9vYmo7CisgICAgUHlfc3NpemVfdCBsbjsKKyAgICBpbnQgaXNfc3ViY2xhc3MsIGdvb2RfbXNnLCBnb29kX21vZDsKIAotICAgICAgICB0bXBfaXRlbSA9ICppdGVtID0gUHlMaXN0X0dFVF9JVEVNKF9maWx0ZXJzLCBpKTsKLSAgICAgICAgaWYgKFB5VHVwbGVfU2l6ZSh0bXBfaXRlbSkgIT0gNSkgewotICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgTU9EVUxFX05BTUUgIi5maWx0ZXJzIGl0ZW0gJXpkIGlzbid0IGEgNS10dXBsZSIsIGkpOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KKyAgICB0bXBfaXRlbSA9ICppdGVtID0gUHlMaXN0X0dFVF9JVEVNKF9maWx0ZXJzLCBpKTsKKyAgICBpZiAoUHlUdXBsZV9TaXplKHRtcF9pdGVtKSAhPSA1KSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgTU9EVUxFX05BTUUgIi5maWx0ZXJzIGl0ZW0gJXpkIGlzbid0IGEgNS10dXBsZSIsIGkpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLSAgICAgICAgLyogUHl0aG9uIGNvZGU6IGFjdGlvbiwgbXNnLCBjYXQsIG1vZCwgbG4gPSBpdGVtICovCi0gICAgICAgIGFjdGlvbiA9IFB5VHVwbGVfR0VUX0lURU0odG1wX2l0ZW0sIDApOwotICAgICAgICBtc2cgPSBQeVR1cGxlX0dFVF9JVEVNKHRtcF9pdGVtLCAxKTsKLSAgICAgICAgY2F0ID0gUHlUdXBsZV9HRVRfSVRFTSh0bXBfaXRlbSwgMik7Ci0gICAgICAgIG1vZCA9IFB5VHVwbGVfR0VUX0lURU0odG1wX2l0ZW0sIDMpOwotICAgICAgICBsbl9vYmogPSBQeVR1cGxlX0dFVF9JVEVNKHRtcF9pdGVtLCA0KTsKKyAgICAvKiBQeXRob24gY29kZTogYWN0aW9uLCBtc2csIGNhdCwgbW9kLCBsbiA9IGl0ZW0gKi8KKyAgICBhY3Rpb24gPSBQeVR1cGxlX0dFVF9JVEVNKHRtcF9pdGVtLCAwKTsKKyAgICBtc2cgPSBQeVR1cGxlX0dFVF9JVEVNKHRtcF9pdGVtLCAxKTsKKyAgICBjYXQgPSBQeVR1cGxlX0dFVF9JVEVNKHRtcF9pdGVtLCAyKTsKKyAgICBtb2QgPSBQeVR1cGxlX0dFVF9JVEVNKHRtcF9pdGVtLCAzKTsKKyAgICBsbl9vYmogPSBQeVR1cGxlX0dFVF9JVEVNKHRtcF9pdGVtLCA0KTsKIAotICAgICAgICBnb29kX21zZyA9IGNoZWNrX21hdGNoZWQobXNnLCB0ZXh0KTsKLSAgICAgICAgZ29vZF9tb2QgPSBjaGVja19tYXRjaGVkKG1vZCwgbW9kdWxlKTsKLSAgICAgICAgaXNfc3ViY2xhc3MgPSBQeU9iamVjdF9Jc1N1YmNsYXNzKGNhdGVnb3J5LCBjYXQpOwotICAgICAgICBsbiA9IFB5SW50X0FzU3NpemVfdChsbl9vYmopOwotICAgICAgICBpZiAoZ29vZF9tc2cgPT0gLTEgfHwgZ29vZF9tb2QgPT0gLTEgfHwgaXNfc3ViY2xhc3MgPT0gLTEgfHwKLSAgICAgICAgICAgIChsbiA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSkKLSAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIGdvb2RfbXNnID0gY2hlY2tfbWF0Y2hlZChtc2csIHRleHQpOworICAgIGdvb2RfbW9kID0gY2hlY2tfbWF0Y2hlZChtb2QsIG1vZHVsZSk7CisgICAgaXNfc3ViY2xhc3MgPSBQeU9iamVjdF9Jc1N1YmNsYXNzKGNhdGVnb3J5LCBjYXQpOworICAgIGxuID0gUHlJbnRfQXNTc2l6ZV90KGxuX29iaik7CisgICAgaWYgKGdvb2RfbXNnID09IC0xIHx8IGdvb2RfbW9kID09IC0xIHx8IGlzX3N1YmNsYXNzID09IC0xIHx8CisgICAgICAgIChsbiA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLSAgICAgICAgaWYgKGdvb2RfbXNnICYmIGlzX3N1YmNsYXNzICYmIGdvb2RfbW9kICYmIChsbiA9PSAwIHx8IGxpbmVubyA9PSBsbikpCi0gICAgICAgICAgICByZXR1cm4gUHlTdHJpbmdfQXNTdHJpbmcoYWN0aW9uKTsKKyAgICBpZiAoZ29vZF9tc2cgJiYgaXNfc3ViY2xhc3MgJiYgZ29vZF9tb2QgJiYgKGxuID09IDAgfHwgbGluZW5vID09IGxuKSkKKyAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0FzU3RyaW5nKGFjdGlvbik7CiAgICAgfQogCiAgICAgbSA9IFB5SW1wb3J0X0ltcG9ydE1vZHVsZShNT0RVTEVfTkFNRSk7CiAgICAgaWYgKG0gPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIE5VTEw7CiAgICAgZCA9IFB5TW9kdWxlX0dldERpY3QobSk7CiAgICAgUHlfREVDUkVGKG0pOwogICAgIGlmIChkID09IE5VTEwpCi0gICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBOVUxMOwogICAgIGFjdGlvbiA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKGQsIERFRkFVTFRfQUNUSU9OX05BTUUpOwogICAgIGlmIChhY3Rpb24gIT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0FzU3RyaW5nKGFjdGlvbik7CisgICAgcmV0dXJuIFB5U3RyaW5nX0FzU3RyaW5nKGFjdGlvbik7CiAKICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKICAgICAgICAgICAgICAgICAgICAgTU9EVUxFX05BTUUgIi4iIERFRkFVTFRfQUNUSU9OX05BTUUgIiBub3QgZm91bmQiKTsKQEAgLTE1OCwxOCArMTU4LDE4IEBACiAgICAgUHlPYmplY3QgKmFscmVhZHlfd2FybmVkOwogCiAgICAgaWYgKGtleSA9PSBOVUxMKQotICAgICAgICByZXR1cm4gLTE7CisgICAgcmV0dXJuIC0xOwogCiAgICAgYWxyZWFkeV93YXJuZWQgPSBQeURpY3RfR2V0SXRlbShyZWdpc3RyeSwga2V5KTsKICAgICBpZiAoYWxyZWFkeV93YXJuZWQgIT0gTlVMTCkgewotICAgICAgICBpbnQgcmMgPSBQeU9iamVjdF9Jc1RydWUoYWxyZWFkeV93YXJuZWQpOwotICAgICAgICBpZiAocmMgIT0gMCkKLSAgICAgICAgICAgIHJldHVybiByYzsKKyAgICBpbnQgcmMgPSBQeU9iamVjdF9Jc1RydWUoYWxyZWFkeV93YXJuZWQpOworICAgIGlmIChyYyAhPSAwKQorICAgICAgICByZXR1cm4gcmM7CiAgICAgfQogCiAgICAgLyogVGhpcyB3YXJuaW5nIHdhc24ndCBmb3VuZCBpbiB0aGUgcmVnaXN0cnksIHNldCBpdC4gKi8KICAgICBpZiAoc2hvdWxkX3NldCkKLSAgICAgICAgcmV0dXJuIFB5RGljdF9TZXRJdGVtKHJlZ2lzdHJ5LCBrZXksIFB5X1RydWUpOworICAgIHJldHVybiBQeURpY3RfU2V0SXRlbShyZWdpc3RyeSwga2V5LCBQeV9UcnVlKTsKICAgICByZXR1cm4gMDsKIH0KIApAQCAtMTgzLDIzICsxODMsMjMgQEAKIAogICAgIGludCByYyA9IFB5T2JqZWN0X0lzVHJ1ZShmaWxlbmFtZSk7CiAgICAgaWYgKHJjID09IC0xKQotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gTlVMTDsKICAgICBlbHNlIGlmIChyYyA9PSAwKQotICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZygiPHVua25vd24+Iik7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoIjx1bmtub3duPiIpOwogCiAgICAgbW9kX3N0ciA9IFB5U3RyaW5nX0FzU3RyaW5nKGZpbGVuYW1lKTsKICAgICBpZiAobW9kX3N0ciA9PSBOVUxMKQotCSAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgbGVuID0gUHlTdHJpbmdfU2l6ZShmaWxlbmFtZSk7CiAgICAgaWYgKGxlbiA8IDApCi0gICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBOVUxMOwogICAgIGlmIChsZW4gPj0gMyAmJgotCXN0cm5jbXAobW9kX3N0ciArIChsZW4gLSAzKSwgIi5weSIsIDMpID09IDApIHsKLSAgICAgICAgbW9kdWxlID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUobW9kX3N0ciwgbGVuLTMpOworICAgIHN0cm5jbXAobW9kX3N0ciArIChsZW4gLSAzKSwgIi5weSIsIDMpID09IDApIHsKKyAgICBtb2R1bGUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShtb2Rfc3RyLCBsZW4tMyk7CiAgICAgfQogICAgIGVsc2UgewotICAgICAgICBtb2R1bGUgPSBmaWxlbmFtZTsKLSAgICAgICAgUHlfSU5DUkVGKG1vZHVsZSk7CisgICAgbW9kdWxlID0gZmlsZW5hbWU7CisgICAgUHlfSU5DUkVGKG1vZHVsZSk7CiAgICAgfQogICAgIHJldHVybiBtb2R1bGU7CiB9CkBAIC0yMTIsMTMgKzIxMiwxMyBAQAogICAgIGludCByYzsKIAogICAgIGlmIChhZGRfemVybykgewotICAgICAgICB6ZXJvID0gUHlJbnRfRnJvbUxvbmcoMCk7Ci0gICAgICAgIGlmICh6ZXJvID09IE5VTEwpCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIGFsdGtleSA9IFB5VHVwbGVfUGFjaygzLCB0ZXh0LCBjYXRlZ29yeSwgemVybyk7CisgICAgemVybyA9IFB5SW50X0Zyb21Mb25nKDApOworICAgIGlmICh6ZXJvID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBhbHRrZXkgPSBQeVR1cGxlX1BhY2soMywgdGV4dCwgY2F0ZWdvcnksIHplcm8pOwogICAgIH0KICAgICBlbHNlCi0gICAgICAgIGFsdGtleSA9IFB5VHVwbGVfUGFjaygyLCB0ZXh0LCBjYXRlZ29yeSk7CisgICAgYWx0a2V5ID0gUHlUdXBsZV9QYWNrKDIsIHRleHQsIGNhdGVnb3J5KTsKIAogICAgIHJjID0gYWxyZWFkeV93YXJuZWQocmVnaXN0cnksIGFsdGtleSwgMSk7CiAgICAgUHlfWERFQ1JFRih6ZXJvKTsKQEAgLTIzOCwxMyArMjM4LDEzIEBACiAKICAgICBuYW1lID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhjYXRlZ29yeSwgIl9fbmFtZV9fIik7CiAgICAgaWYgKG5hbWUgPT0gTlVMTCkgIC8qIFhYWCBDYW4gYW4gb2JqZWN0IGxhY2sgYSAnX19uYW1lX18nIGF0dHJpYnV0ZT8gKi8KLQkgICAgcmV0dXJuOworICAgICAgICByZXR1cm47CiAKICAgICBmX3N0ZGVyciA9IFB5U3lzX0dldE9iamVjdCgic3RkZXJyIik7CiAgICAgaWYgKGZfc3RkZXJyID09IE5VTEwpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJsb3N0IHN5cy5zdGRlcnJcbiIpOwotICAgICAgICBQeV9ERUNSRUYobmFtZSk7Ci0gICAgICAgIHJldHVybjsKKyAgICBmcHJpbnRmKHN0ZGVyciwgImxvc3Qgc3lzLnN0ZGVyclxuIik7CisgICAgUHlfREVDUkVGKG5hbWUpOworICAgIHJldHVybjsKICAgICB9CiAKICAgICAvKiBQcmludCAiZmlsZW5hbWU6bGluZW5vOiBjYXRlZ29yeTogdGV4dFxuIiAqLwpAQCAtMjU4LDE3ICsyNTgsMTcgQEAKIAogICAgIC8qIFByaW50ICIgIHNvdXJjZV9saW5lXG4iICovCiAgICAgaWYgKHNvdXJjZWxpbmUpIHsKLSAgICAgICAgY2hhciAqc291cmNlX2xpbmVfc3RyID0gUHlTdHJpbmdfQVNfU1RSSU5HKHNvdXJjZWxpbmUpOwotICAgICAgICB3aGlsZSAoKnNvdXJjZV9saW5lX3N0ciA9PSAnICcgfHwgKnNvdXJjZV9saW5lX3N0ciA9PSAnXHQnIHx8Ci0gICAgICAgICAgICAgICAgKnNvdXJjZV9saW5lX3N0ciA9PSAnXDAxNCcpCi0gICAgICAgICAgICBzb3VyY2VfbGluZV9zdHIrKzsKKyAgICBjaGFyICpzb3VyY2VfbGluZV9zdHIgPSBQeVN0cmluZ19BU19TVFJJTkcoc291cmNlbGluZSk7CisgICAgd2hpbGUgKCpzb3VyY2VfbGluZV9zdHIgPT0gJyAnIHx8ICpzb3VyY2VfbGluZV9zdHIgPT0gJ1x0JyB8fAorICAgICAgICAqc291cmNlX2xpbmVfc3RyID09ICdcMDE0JykKKyAgICAgICAgc291cmNlX2xpbmVfc3RyKys7CiAKLSAgICAgICAgUHlGaWxlX1dyaXRlU3RyaW5nKHNvdXJjZV9saW5lX3N0ciwgZl9zdGRlcnIpOwotICAgICAgICBQeUZpbGVfV3JpdGVTdHJpbmcoIlxuIiwgZl9zdGRlcnIpOworICAgIFB5RmlsZV9Xcml0ZVN0cmluZyhzb3VyY2VfbGluZV9zdHIsIGZfc3RkZXJyKTsKKyAgICBQeUZpbGVfV3JpdGVTdHJpbmcoIlxuIiwgZl9zdGRlcnIpOwogICAgIH0KICAgICBlbHNlCi0gICAgICAgIF9QeV9EaXNwbGF5U291cmNlTGluZShmX3N0ZGVyciwgUHlTdHJpbmdfQVNfU1RSSU5HKGZpbGVuYW1lKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lbm8sIDIpOworICAgIF9QeV9EaXNwbGF5U291cmNlTGluZShmX3N0ZGVyciwgUHlTdHJpbmdfQVNfU1RSSU5HKGZpbGVuYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZW5vLCAyKTsKICAgICBQeUVycl9DbGVhcigpOwogfQogCkBAIC0yODEsMTY2ICsyODEsMTY2IEBACiAgICAgUHlPYmplY3QgKml0ZW0gPSBQeV9Ob25lOwogICAgIGNvbnN0IGNoYXIgKmFjdGlvbjsKICAgICBpbnQgcmM7Ci0gICAgCisKICAgICBpZiAocmVnaXN0cnkgJiYgIVB5RGljdF9DaGVjayhyZWdpc3RyeSkgJiYgKHJlZ2lzdHJ5ICE9IFB5X05vbmUpKSB7Ci0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICIncmVnaXN0cnknIG11c3QgYmUgYSBkaWN0Iik7Ci0gICAgICAgIHJldHVybiBOVUxMOworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICIncmVnaXN0cnknIG11c3QgYmUgYSBkaWN0Iik7CisgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCiAgICAgLyogTm9ybWFsaXplIG1vZHVsZS4gKi8KICAgICBpZiAobW9kdWxlID09IE5VTEwpIHsKLSAgICAgICAgbW9kdWxlID0gbm9ybWFsaXplX21vZHVsZShmaWxlbmFtZSk7Ci0gICAgICAgIGlmIChtb2R1bGUgPT0gTlVMTCkKLSAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIG1vZHVsZSA9IG5vcm1hbGl6ZV9tb2R1bGUoZmlsZW5hbWUpOworICAgIGlmIChtb2R1bGUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogICAgIGVsc2UKLSAgICAgICAgUHlfSU5DUkVGKG1vZHVsZSk7CisgICAgUHlfSU5DUkVGKG1vZHVsZSk7CiAKICAgICAvKiBOb3JtYWxpemUgbWVzc2FnZS4gKi8KICAgICBQeV9JTkNSRUYobWVzc2FnZSk7ICAvKiBERUNSRUYnZWQgaW4gY2xlYW51cC4gKi8KICAgICByYyA9IFB5T2JqZWN0X0lzSW5zdGFuY2UobWVzc2FnZSwgUHlFeGNfV2FybmluZyk7CiAgICAgaWYgKHJjID09IC0xKSB7Ci0gICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICBnb3RvIGNsZWFudXA7CiAgICAgfQogICAgIGlmIChyYyA9PSAxKSB7Ci0gICAgICAgIHRleHQgPSBQeU9iamVjdF9TdHIobWVzc2FnZSk7Ci0gICAgICAgIGlmICh0ZXh0ID09IE5VTEwpCi0gICAgICAgICAgICBnb3RvIGNsZWFudXA7Ci0gICAgICAgIGNhdGVnb3J5ID0gKFB5T2JqZWN0KiltZXNzYWdlLT5vYl90eXBlOworICAgIHRleHQgPSBQeU9iamVjdF9TdHIobWVzc2FnZSk7CisgICAgaWYgKHRleHQgPT0gTlVMTCkKKyAgICAgICAgZ290byBjbGVhbnVwOworICAgIGNhdGVnb3J5ID0gKFB5T2JqZWN0KiltZXNzYWdlLT5vYl90eXBlOwogICAgIH0KICAgICBlbHNlIHsKLSAgICAgICAgdGV4dCA9IG1lc3NhZ2U7Ci0gICAgICAgIG1lc3NhZ2UgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oY2F0ZWdvcnksICJPIiwgbWVzc2FnZSk7Ci0gICAgICAgIGlmIChtZXNzYWdlID09IE5VTEwpCi0gICAgICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgdGV4dCA9IG1lc3NhZ2U7CisgICAgbWVzc2FnZSA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihjYXRlZ29yeSwgIk8iLCBtZXNzYWdlKTsKKyAgICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgICAgICBnb3RvIGNsZWFudXA7CiAgICAgfQogCiAgICAgbGluZW5vX29iaiA9IFB5SW50X0Zyb21Mb25nKGxpbmVubyk7CiAgICAgaWYgKGxpbmVub19vYmogPT0gTlVMTCkKLSAgICAgICAgZ290byBjbGVhbnVwOworICAgIGdvdG8gY2xlYW51cDsKIAogICAgIC8qIENyZWF0ZSBrZXkuICovCiAgICAga2V5ID0gUHlUdXBsZV9QYWNrKDMsIHRleHQsIGNhdGVnb3J5LCBsaW5lbm9fb2JqKTsKICAgICBpZiAoa2V5ID09IE5VTEwpCi0gICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICBnb3RvIGNsZWFudXA7CiAKICAgICBpZiAoKHJlZ2lzdHJ5ICE9IE5VTEwpICYmIChyZWdpc3RyeSAhPSBQeV9Ob25lKSkgewotICAgICAgICByYyA9IGFscmVhZHlfd2FybmVkKHJlZ2lzdHJ5LCBrZXksIDApOwotICAgICAgICBpZiAocmMgPT0gLTEpCi0gICAgICAgICAgICBnb3RvIGNsZWFudXA7Ci0JZWxzZSBpZiAocmMgPT0gMSkKLSAgICAgICAgICAgIGdvdG8gcmV0dXJuX25vbmU7Ci0gICAgICAgIC8qIEVsc2UgdGhpcyB3YXJuaW5nIGhhc24ndCBiZWVuIGdlbmVyYXRlZCBiZWZvcmUuICovCisgICAgcmMgPSBhbHJlYWR5X3dhcm5lZChyZWdpc3RyeSwga2V5LCAwKTsKKyAgICBpZiAocmMgPT0gLTEpCisgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICBlbHNlIGlmIChyYyA9PSAxKQorICAgICAgICBnb3RvIHJldHVybl9ub25lOworICAgIC8qIEVsc2UgdGhpcyB3YXJuaW5nIGhhc24ndCBiZWVuIGdlbmVyYXRlZCBiZWZvcmUuICovCiAgICAgfQogCiAgICAgYWN0aW9uID0gZ2V0X2ZpbHRlcihjYXRlZ29yeSwgdGV4dCwgbGluZW5vLCBtb2R1bGUsICZpdGVtKTsKICAgICBpZiAoYWN0aW9uID09IE5VTEwpCi0gICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICBnb3RvIGNsZWFudXA7CiAKICAgICBpZiAoc3RyY21wKGFjdGlvbiwgImVycm9yIikgPT0gMCkgewotICAgICAgICBQeUVycl9TZXRPYmplY3QoY2F0ZWdvcnksIG1lc3NhZ2UpOwotICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgUHlFcnJfU2V0T2JqZWN0KGNhdGVnb3J5LCBtZXNzYWdlKTsKKyAgICBnb3RvIGNsZWFudXA7CiAgICAgfQogCiAgICAgLyogU3RvcmUgaW4gdGhlIHJlZ2lzdHJ5IHRoYXQgd2UndmUgYmVlbiBoZXJlLCAqZXhjZXB0KiB3aGVuIHRoZSBhY3Rpb24KICAgICAgICBpcyAiYWx3YXlzIi4gKi8KICAgICByYyA9IDA7CiAgICAgaWYgKHN0cmNtcChhY3Rpb24sICJhbHdheXMiKSAhPSAwKSB7Ci0gICAgICAgIGlmIChyZWdpc3RyeSAhPSBOVUxMICYmIHJlZ2lzdHJ5ICE9IFB5X05vbmUgJiYKLSAgICAgICAgICAgICAgICBQeURpY3RfU2V0SXRlbShyZWdpc3RyeSwga2V5LCBQeV9UcnVlKSA8IDApCisgICAgaWYgKHJlZ2lzdHJ5ICE9IE5VTEwgJiYgcmVnaXN0cnkgIT0gUHlfTm9uZSAmJgorICAgICAgICBQeURpY3RfU2V0SXRlbShyZWdpc3RyeSwga2V5LCBQeV9UcnVlKSA8IDApCisgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICBlbHNlIGlmIChzdHJjbXAoYWN0aW9uLCAiaWdub3JlIikgPT0gMCkKKyAgICAgICAgZ290byByZXR1cm5fbm9uZTsKKyAgICBlbHNlIGlmIChzdHJjbXAoYWN0aW9uLCAib25jZSIpID09IDApIHsKKyAgICAgICAgaWYgKHJlZ2lzdHJ5ID09IE5VTEwgfHwgcmVnaXN0cnkgPT0gUHlfTm9uZSkgeworICAgICAgICByZWdpc3RyeSA9IGdldF9vbmNlX3JlZ2lzdHJ5KCk7CisgICAgICAgIGlmIChyZWdpc3RyeSA9PSBOVUxMKQogICAgICAgICAgICAgZ290byBjbGVhbnVwOwotICAgICAgICBlbHNlIGlmIChzdHJjbXAoYWN0aW9uLCAiaWdub3JlIikgPT0gMCkKLSAgICAgICAgICAgIGdvdG8gcmV0dXJuX25vbmU7Ci0gICAgICAgIGVsc2UgaWYgKHN0cmNtcChhY3Rpb24sICJvbmNlIikgPT0gMCkgewotICAgICAgICAgICAgaWYgKHJlZ2lzdHJ5ID09IE5VTEwgfHwgcmVnaXN0cnkgPT0gUHlfTm9uZSkgewotICAgICAgICAgICAgICAgIHJlZ2lzdHJ5ID0gZ2V0X29uY2VfcmVnaXN0cnkoKTsKLSAgICAgICAgICAgICAgICBpZiAocmVnaXN0cnkgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgZ290byBjbGVhbnVwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogX29uY2VfcmVnaXN0cnlbKHRleHQsIGNhdGVnb3J5KV0gPSAxICovCi0gICAgICAgICAgICByYyA9IHVwZGF0ZV9yZWdpc3RyeShyZWdpc3RyeSwgdGV4dCwgY2F0ZWdvcnksIDApOwogICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHN0cmNtcChhY3Rpb24sICJtb2R1bGUiKSA9PSAwKSB7Ci0gICAgICAgICAgICAvKiByZWdpc3RyeVsodGV4dCwgY2F0ZWdvcnksIDApXSA9IDEgKi8KLSAgICAgICAgICAgIGlmIChyZWdpc3RyeSAhPSBOVUxMICYmIHJlZ2lzdHJ5ICE9IFB5X05vbmUpCi0gICAgICAgICAgICAgICAgcmMgPSB1cGRhdGVfcmVnaXN0cnkocmVnaXN0cnksIHRleHQsIGNhdGVnb3J5LCAwKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChzdHJjbXAoYWN0aW9uLCAiZGVmYXVsdCIpICE9IDApIHsKLSAgICAgICAgICAgIFB5T2JqZWN0ICp0b19zdHIgPSBQeU9iamVjdF9TdHIoaXRlbSk7Ci0gICAgICAgICAgICBjb25zdCBjaGFyICplcnJfc3RyID0gIj8/PyI7CisgICAgICAgIC8qIF9vbmNlX3JlZ2lzdHJ5Wyh0ZXh0LCBjYXRlZ29yeSldID0gMSAqLworICAgICAgICByYyA9IHVwZGF0ZV9yZWdpc3RyeShyZWdpc3RyeSwgdGV4dCwgY2F0ZWdvcnksIDApOworICAgIH0KKyAgICBlbHNlIGlmIChzdHJjbXAoYWN0aW9uLCAibW9kdWxlIikgPT0gMCkgeworICAgICAgICAvKiByZWdpc3RyeVsodGV4dCwgY2F0ZWdvcnksIDApXSA9IDEgKi8KKyAgICAgICAgaWYgKHJlZ2lzdHJ5ICE9IE5VTEwgJiYgcmVnaXN0cnkgIT0gUHlfTm9uZSkKKyAgICAgICAgcmMgPSB1cGRhdGVfcmVnaXN0cnkocmVnaXN0cnksIHRleHQsIGNhdGVnb3J5LCAwKTsKKyAgICB9CisgICAgZWxzZSBpZiAoc3RyY21wKGFjdGlvbiwgImRlZmF1bHQiKSAhPSAwKSB7CisgICAgICAgIFB5T2JqZWN0ICp0b19zdHIgPSBQeU9iamVjdF9TdHIoaXRlbSk7CisgICAgICAgIGNvbnN0IGNoYXIgKmVycl9zdHIgPSAiPz8/IjsKIAotICAgICAgICAgICAgaWYgKHRvX3N0ciAhPSBOVUxMKQotICAgICAgICAgICAgICAgIGVycl9zdHIgPSBQeVN0cmluZ19BU19TVFJJTkcodG9fc3RyKTsKLSAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19SdW50aW1lRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAiVW5yZWNvZ25pemVkIGFjdGlvbiAoJXMpIGluIHdhcm5pbmdzLmZpbHRlcnM6XG4gJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uLCBlcnJfc3RyKTsKLSAgICAgICAgICAgIFB5X1hERUNSRUYodG9fc3RyKTsKLSAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKLSAgICAgICAgfQorICAgICAgICBpZiAodG9fc3RyICE9IE5VTEwpCisgICAgICAgIGVycl9zdHIgPSBQeVN0cmluZ19BU19TVFJJTkcodG9fc3RyKTsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1J1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgIlVucmVjb2duaXplZCBhY3Rpb24gKCVzKSBpbiB3YXJuaW5ncy5maWx0ZXJzOlxuICVzIiwKKyAgICAgICAgICAgICAgICAgICAgYWN0aW9uLCBlcnJfc3RyKTsKKyAgICAgICAgUHlfWERFQ1JFRih0b19zdHIpOworICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgfQogICAgIH0KIAogICAgIGlmIChyYyA9PSAxKSAgLyogQWxyZWFkeSB3YXJuZWQgZm9yIHRoaXMgbW9kdWxlLiAqLwotICAgICAgICBnb3RvIHJldHVybl9ub25lOworICAgIGdvdG8gcmV0dXJuX25vbmU7CiAgICAgaWYgKHJjID09IDApIHsKLSAgICAgICAgUHlPYmplY3QgKnNob3dfZnhuID0gZ2V0X3dhcm5pbmdzX2F0dHIoInNob3d3YXJuaW5nIik7Ci0gICAgICAgIGlmIChzaG93X2Z4biA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKLSAgICAgICAgICAgICAgICBnb3RvIGNsZWFudXA7Ci0gICAgICAgICAgICBzaG93X3dhcm5pbmcoZmlsZW5hbWUsIGxpbmVubywgdGV4dCwgY2F0ZWdvcnksIHNvdXJjZWxpbmUpOworICAgIFB5T2JqZWN0ICpzaG93X2Z4biA9IGdldF93YXJuaW5nc19hdHRyKCJzaG93d2FybmluZyIpOworICAgIGlmIChzaG93X2Z4biA9PSBOVUxMKSB7CisgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgICAgIHNob3dfd2FybmluZyhmaWxlbmFtZSwgbGluZW5vLCB0ZXh0LCBjYXRlZ29yeSwgc291cmNlbGluZSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBjb25zdCBjaGFyICptc2cgPSAiZnVuY3Rpb25zIG92ZXJyaWRpbmcgd2FybmluZ3Muc2hvd3dhcm5pbmcoKSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm11c3Qgc3VwcG9ydCB0aGUgJ2xpbmUnIGFyZ3VtZW50IjsKKyAgICAgICAgY29uc3QgY2hhciAqdGV4dF9jaGFyID0gUHlTdHJpbmdfQVNfU1RSSU5HKHRleHQpOworCisgICAgICAgIGlmIChzdHJjbXAobXNnLCB0ZXh0X2NoYXIpID09IDApIHsKKyAgICAgICAgLyogUHJldmVudCBpbmZpbml0ZSByZWN1cnNpb24gYnkgdXNpbmcgYnVpbHQtaW4gaW1wbGVtZW50YXRpb24KKyAgICAgICAgICAgb2Ygc2hvd3dhcm5pbmcoKS4gKi8KKyAgICAgICAgc2hvd193YXJuaW5nKGZpbGVuYW1lLCBsaW5lbm8sIHRleHQsIGNhdGVnb3J5LCBzb3VyY2VsaW5lKTsKICAgICAgICAgfQogICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1zZyA9ICJmdW5jdGlvbnMgb3ZlcnJpZGluZyB3YXJuaW5ncy5zaG93d2FybmluZygpICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm11c3Qgc3VwcG9ydCB0aGUgJ2xpbmUnIGFyZ3VtZW50IjsKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKnRleHRfY2hhciA9IFB5U3RyaW5nX0FTX1NUUklORyh0ZXh0KTsKKyAgICAgICAgUHlPYmplY3QgKmNoZWNrX2Z4bjsKKyAgICAgICAgUHlPYmplY3QgKmRlZmF1bHRzOworICAgICAgICBQeU9iamVjdCAqcmVzOwogCi0gICAgICAgICAgICBpZiAoc3RyY21wKG1zZywgdGV4dF9jaGFyKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgLyogUHJldmVudCBpbmZpbml0ZSByZWN1cnNpb24gYnkgdXNpbmcgYnVpbHQtaW4gaW1wbGVtZW50YXRpb24KLSAgICAgICAgICAgICAgICAgICBvZiBzaG93d2FybmluZygpLiAqLwotICAgICAgICAgICAgICAgIHNob3dfd2FybmluZyhmaWxlbmFtZSwgbGluZW5vLCB0ZXh0LCBjYXRlZ29yeSwgc291cmNlbGluZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBQeU9iamVjdCAqY2hlY2tfZnhuOwotICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpkZWZhdWx0czsKLSAgICAgICAgICAgICAgICBQeU9iamVjdCAqcmVzOworICAgICAgICBpZiAoUHlNZXRob2RfQ2hlY2soc2hvd19meG4pKQorICAgICAgICAgICAgY2hlY2tfZnhuID0gUHlNZXRob2RfRnVuY3Rpb24oc2hvd19meG4pOworICAgICAgICBlbHNlIGlmIChQeUZ1bmN0aW9uX0NoZWNrKHNob3dfZnhuKSkKKyAgICAgICAgICAgIGNoZWNrX2Z4biA9IHNob3dfZnhuOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndhcm5pbmdzLnNob3d3YXJuaW5nKCkgbXVzdCBiZSBzZXQgdG8gYSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZ1bmN0aW9uIG9yIG1ldGhvZCIpOworICAgICAgICAgICAgUHlfREVDUkVGKHNob3dfZnhuKTsKKyAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgaWYgKFB5TWV0aG9kX0NoZWNrKHNob3dfZnhuKSkKLSAgICAgICAgICAgICAgICAgICAgY2hlY2tfZnhuID0gUHlNZXRob2RfRnVuY3Rpb24oc2hvd19meG4pOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKFB5RnVuY3Rpb25fQ2hlY2soc2hvd19meG4pKQotICAgICAgICAgICAgICAgICAgICBjaGVja19meG4gPSBzaG93X2Z4bjsKLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3YXJuaW5ncy5zaG93d2FybmluZygpIG11c3QgYmUgc2V0IHRvIGEgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZ1bmN0aW9uIG9yIG1ldGhvZCIpOwotICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoc2hvd19meG4pOwotICAgICAgICAgICAgICAgICAgICBnb3RvIGNsZWFudXA7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZGVmYXVsdHMgPSBQeUZ1bmN0aW9uX0dldERlZmF1bHRzKGNoZWNrX2Z4bik7Ci0gICAgICAgICAgICAgICAgLyogQSBwcm9wZXIgaW1wbGVtZW50YXRpb24gb2Ygd2FybmluZ3Muc2hvd3dhcm5pbmcoKSBzaG91bGQKLSAgICAgICAgICAgICAgICAgICAgaGF2ZSBhdCBsZWFzdCB0d28gZGVmYXVsdCBhcmd1bWVudHMuICovCi0gICAgICAgICAgICAgICAgaWYgKChkZWZhdWx0cyA9PSBOVUxMKSB8fCAoUHlUdXBsZV9TaXplKGRlZmF1bHRzKSA8IDIpKSB7Ci0JICAgICAgICAgICAgUHlDb2RlT2JqZWN0ICpjb2RlID0gKFB5Q29kZU9iamVjdCAqKQotCQkJCQkJUHlGdW5jdGlvbl9HZXRDb2RlKGNoZWNrX2Z4bik7Ci0JCSAgICBpZiAoIShjb2RlLT5jb19mbGFncyAmIENPX1ZBUkFSR1MpKSB7Ci0JCSAgICAgICAgaWYgKFB5RXJyX1dhcm5FeChQeUV4Y19EZXByZWNhdGlvbldhcm5pbmcsIG1zZywgMSkgPAotCQkJCTApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoc2hvd19meG4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCQl9Ci0gICAgICAgICAgICAgICAgcmVzID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhzaG93X2Z4biwgbWVzc2FnZSwgY2F0ZWdvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUsIGxpbmVub19vYmosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAgIGRlZmF1bHRzID0gUHlGdW5jdGlvbl9HZXREZWZhdWx0cyhjaGVja19meG4pOworICAgICAgICAvKiBBIHByb3BlciBpbXBsZW1lbnRhdGlvbiBvZiB3YXJuaW5ncy5zaG93d2FybmluZygpIHNob3VsZAorICAgICAgICAgICAgaGF2ZSBhdCBsZWFzdCB0d28gZGVmYXVsdCBhcmd1bWVudHMuICovCisgICAgICAgIGlmICgoZGVmYXVsdHMgPT0gTlVMTCkgfHwgKFB5VHVwbGVfU2l6ZShkZWZhdWx0cykgPCAyKSkgeworICAgICAgICAgICAgUHlDb2RlT2JqZWN0ICpjb2RlID0gKFB5Q29kZU9iamVjdCAqKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RnVuY3Rpb25fR2V0Q29kZShjaGVja19meG4pOworICAgICAgICAgICAgaWYgKCEoY29kZS0+Y29fZmxhZ3MgJiBDT19WQVJBUkdTKSkgeworICAgICAgICAgICAgaWYgKFB5RXJyX1dhcm5FeChQeUV4Y19EZXByZWNhdGlvbldhcm5pbmcsIG1zZywgMSkgPAorICAgICAgICAgICAgICAgIDApIHsKICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoc2hvd19meG4pOwotICAgICAgICAgICAgICAgIFB5X1hERUNSRUYocmVzKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzID09IE5VTEwpCi0gICAgICAgICAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICAgICAgICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKyAgICAgICAgcmVzID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhzaG93X2Z4biwgbWVzc2FnZSwgY2F0ZWdvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lLCBsaW5lbm9fb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgUHlfREVDUkVGKHNob3dfZnhuKTsKKyAgICAgICAgUHlfWERFQ1JFRihyZXMpOworICAgICAgICBpZiAocmVzID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgICAgIH0KKyAgICB9CiAgICAgfQogICAgIGVsc2UgLyogaWYgKHJjID09IC0xKSAqLwotICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgZ290byBjbGVhbnVwOwogCiAgcmV0dXJuX25vbmU6CiAgICAgcmVzdWx0ID0gUHlfTm9uZTsKQEAgLTQ2NiwxNSArNDY2LDE1IEBACiAgICAgLyogU2V0dXAgZ2xvYmFscyBhbmQgbGluZW5vLiAqLwogICAgIFB5RnJhbWVPYmplY3QgKmYgPSBQeVRocmVhZFN0YXRlX0dFVCgpLT5mcmFtZTsKICAgICB3aGlsZSAoLS1zdGFja19sZXZlbCA+IDAgJiYgZiAhPSBOVUxMKQotICAgICAgICBmID0gZi0+Zl9iYWNrOworICAgIGYgPSBmLT5mX2JhY2s7CiAKICAgICBpZiAoZiA9PSBOVUxMKSB7Ci0gICAgICAgIGdsb2JhbHMgPSBQeVRocmVhZFN0YXRlX0dldCgpLT5pbnRlcnAtPnN5c2RpY3Q7Ci0gICAgICAgICpsaW5lbm8gPSAxOworICAgIGdsb2JhbHMgPSBQeVRocmVhZFN0YXRlX0dldCgpLT5pbnRlcnAtPnN5c2RpY3Q7CisgICAgKmxpbmVubyA9IDE7CiAgICAgfQogICAgIGVsc2UgewotICAgICAgICBnbG9iYWxzID0gZi0+Zl9nbG9iYWxzOwotICAgICAgICAqbGluZW5vID0gUHlDb2RlX0FkZHIyTGluZShmLT5mX2NvZGUsIGYtPmZfbGFzdGkpOworICAgIGdsb2JhbHMgPSBmLT5mX2dsb2JhbHM7CisgICAgKmxpbmVubyA9IFB5Q29kZV9BZGRyMkxpbmUoZi0+Zl9jb2RlLCBmLT5mX2xhc3RpKTsKICAgICB9CiAKICAgICAqbW9kdWxlID0gTlVMTDsKQEAgLTQ4NCw4NCArNDg0LDg0IEBACiAgICAgYXNzZXJ0KFB5RGljdF9DaGVjayhnbG9iYWxzKSk7CiAgICAgKnJlZ2lzdHJ5ID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoZ2xvYmFscywgIl9fd2FybmluZ3JlZ2lzdHJ5X18iKTsKICAgICBpZiAoKnJlZ2lzdHJ5ID09IE5VTEwpIHsKLSAgICAgICAgaW50IHJjOworICAgIGludCByYzsKIAotICAgICAgICAqcmVnaXN0cnkgPSBQeURpY3RfTmV3KCk7Ci0gICAgICAgIGlmICgqcmVnaXN0cnkgPT0gTlVMTCkKLSAgICAgICAgICAgIHJldHVybiAwOworICAgICpyZWdpc3RyeSA9IFB5RGljdF9OZXcoKTsKKyAgICBpZiAoKnJlZ2lzdHJ5ID09IE5VTEwpCisgICAgICAgIHJldHVybiAwOwogCi0gICAgICAgICByYyA9IFB5RGljdF9TZXRJdGVtU3RyaW5nKGdsb2JhbHMsICJfX3dhcm5pbmdyZWdpc3RyeV9fIiwgKnJlZ2lzdHJ5KTsKLSAgICAgICAgIGlmIChyYyA8IDApCi0gICAgICAgICAgICBnb3RvIGhhbmRsZV9lcnJvcjsKKyAgICAgcmMgPSBQeURpY3RfU2V0SXRlbVN0cmluZyhnbG9iYWxzLCAiX193YXJuaW5ncmVnaXN0cnlfXyIsICpyZWdpc3RyeSk7CisgICAgIGlmIChyYyA8IDApCisgICAgICAgIGdvdG8gaGFuZGxlX2Vycm9yOwogICAgIH0KICAgICBlbHNlCi0gICAgICAgIFB5X0lOQ1JFRigqcmVnaXN0cnkpOworICAgIFB5X0lOQ1JFRigqcmVnaXN0cnkpOwogCiAgICAgLyogU2V0dXAgbW9kdWxlLiAqLwogICAgICptb2R1bGUgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhnbG9iYWxzLCAiX19uYW1lX18iKTsKICAgICBpZiAoKm1vZHVsZSA9PSBOVUxMKSB7Ci0gICAgICAgICptb2R1bGUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCI8c3RyaW5nPiIpOwotICAgICAgICBpZiAoKm1vZHVsZSA9PSBOVUxMKQotICAgICAgICAgICAgZ290byBoYW5kbGVfZXJyb3I7CisgICAgKm1vZHVsZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIjxzdHJpbmc+Iik7CisgICAgaWYgKCptb2R1bGUgPT0gTlVMTCkKKyAgICAgICAgZ290byBoYW5kbGVfZXJyb3I7CiAgICAgfQogICAgIGVsc2UKLSAgICAgICAgUHlfSU5DUkVGKCptb2R1bGUpOworICAgIFB5X0lOQ1JFRigqbW9kdWxlKTsKIAogICAgIC8qIFNldHVwIGZpbGVuYW1lLiAqLwogICAgICpmaWxlbmFtZSA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKGdsb2JhbHMsICJfX2ZpbGVfXyIpOwogICAgIGlmICgqZmlsZW5hbWUgIT0gTlVMTCkgewotCSAgICBQeV9zc2l6ZV90IGxlbiA9IFB5U3RyaW5nX1NpemUoKmZpbGVuYW1lKTsKLSAgICAgICAgY29uc3QgY2hhciAqZmlsZV9zdHIgPSBQeVN0cmluZ19Bc1N0cmluZygqZmlsZW5hbWUpOwotCSAgICBpZiAoZmlsZV9zdHIgPT0gTlVMTCB8fCAobGVuIDwgMCAmJiBQeUVycl9PY2N1cnJlZCgpKSkKLSAgICAgICAgICAgIGdvdG8gaGFuZGxlX2Vycm9yOworICAgICAgICBQeV9zc2l6ZV90IGxlbiA9IFB5U3RyaW5nX1NpemUoKmZpbGVuYW1lKTsKKyAgICBjb25zdCBjaGFyICpmaWxlX3N0ciA9IFB5U3RyaW5nX0FzU3RyaW5nKCpmaWxlbmFtZSk7CisgICAgICAgIGlmIChmaWxlX3N0ciA9PSBOVUxMIHx8IChsZW4gPCAwICYmIFB5RXJyX09jY3VycmVkKCkpKQorICAgICAgICBnb3RvIGhhbmRsZV9lcnJvcjsKIAotICAgICAgICAvKiBpZiBmaWxlbmFtZS5sb3dlcigpLmVuZHN3aXRoKCgiLnB5YyIsICIucHlvIikpOiAqLwotICAgICAgICBpZiAobGVuID49IDQgJiYKLSAgICAgICAgICAgIGZpbGVfc3RyW2xlbi00XSA9PSAnLicgJiYKLSAgICAgICAgICAgIHRvbG93ZXIoZmlsZV9zdHJbbGVuLTNdKSA9PSAncCcgJiYKLSAgICAgICAgICAgIHRvbG93ZXIoZmlsZV9zdHJbbGVuLTJdKSA9PSAneScgJiYKLSAgICAgICAgICAgICh0b2xvd2VyKGZpbGVfc3RyW2xlbi0xXSkgPT0gJ2MnIHx8Ci0gICAgICAgICAgICAgICAgdG9sb3dlcihmaWxlX3N0cltsZW4tMV0pID09ICdvJykpCi0gICAgICAgIHsKLSAgICAgICAgICAgICpmaWxlbmFtZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGZpbGVfc3RyLCBsZW4tMSk7Ci0JICAgICAgICBpZiAoKmZpbGVuYW1lID09IE5VTEwpCi0JCSAgICAgICAgZ290byBoYW5kbGVfZXJyb3I7Ci0JICAgIH0KLQkgICAgZWxzZQotICAgICAgICAgICAgUHlfSU5DUkVGKCpmaWxlbmFtZSk7CisgICAgLyogaWYgZmlsZW5hbWUubG93ZXIoKS5lbmRzd2l0aCgoIi5weWMiLCAiLnB5byIpKTogKi8KKyAgICBpZiAobGVuID49IDQgJiYKKyAgICAgICAgZmlsZV9zdHJbbGVuLTRdID09ICcuJyAmJgorICAgICAgICB0b2xvd2VyKGZpbGVfc3RyW2xlbi0zXSkgPT0gJ3AnICYmCisgICAgICAgIHRvbG93ZXIoZmlsZV9zdHJbbGVuLTJdKSA9PSAneScgJiYKKyAgICAgICAgKHRvbG93ZXIoZmlsZV9zdHJbbGVuLTFdKSA9PSAnYycgfHwKKyAgICAgICAgdG9sb3dlcihmaWxlX3N0cltsZW4tMV0pID09ICdvJykpCisgICAgeworICAgICAgICAqZmlsZW5hbWUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShmaWxlX3N0ciwgbGVuLTEpOworICAgICAgICBpZiAoKmZpbGVuYW1lID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGhhbmRsZV9lcnJvcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIFB5X0lOQ1JFRigqZmlsZW5hbWUpOwogICAgIH0KICAgICBlbHNlIHsKLSAgICAgICAgY29uc3QgY2hhciAqbW9kdWxlX3N0ciA9IFB5U3RyaW5nX0FzU3RyaW5nKCptb2R1bGUpOwotICAgICAgICBpZiAobW9kdWxlX3N0ciAmJiBzdHJjbXAobW9kdWxlX3N0ciwgIl9fbWFpbl9fIikgPT0gMCkgewotICAgICAgICAgICAgUHlPYmplY3QgKmFyZ3YgPSBQeVN5c19HZXRPYmplY3QoImFyZ3YiKTsKLSAgICAgICAgICAgIGlmIChhcmd2ICE9IE5VTEwgJiYgUHlMaXN0X1NpemUoYXJndikgPiAwKSB7Ci0gICAgICAgICAgICAgICAgaW50IGlzX3RydWU7Ci0gICAgICAgICAgICAgICAgKmZpbGVuYW1lID0gUHlMaXN0X0dldEl0ZW0oYXJndiwgMCk7Ci0gICAgICAgICAgICAgICAgUHlfSU5DUkVGKCpmaWxlbmFtZSk7Ci0gICAgICAgICAgICAgICAgLyogSWYgc3lzLmFyZ3ZbMF0gaXMgZmFsc2UsIHRoZW4gdXNlICdfX21haW5fXycuICovCi0gICAgICAgICAgICAgICAgaXNfdHJ1ZSA9IFB5T2JqZWN0X0lzVHJ1ZSgqZmlsZW5hbWUpOwotICAgICAgICAgICAgICAgIGlmIChpc190cnVlIDwgMCkgewotICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoKmZpbGVuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgZ290byBoYW5kbGVfZXJyb3I7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFpc190cnVlKSB7Ci0gICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRigqZmlsZW5hbWUpOwotICAgICAgICAgICAgICAgICAgICAqZmlsZW5hbWUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCJfX21haW5fXyIpOwotICAgICAgICAgICAgICAgICAgICBpZiAoKmZpbGVuYW1lID09IE5VTEwpCi0gICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGhhbmRsZV9lcnJvcjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAvKiBlbWJlZGRlZCBpbnRlcnByZXRlcnMgZG9uJ3QgaGF2ZSBzeXMuYXJndiwgc2VlIGJ1ZyAjODM5MTUxICovCi0gICAgICAgICAgICAgICAgKmZpbGVuYW1lID0gUHlTdHJpbmdfRnJvbVN0cmluZygiX19tYWluX18iKTsKLQkgICAgICAgICAgICBpZiAoKmZpbGVuYW1lID09IE5VTEwpCi0JICAgICAgICAgICAgICAgIGdvdG8gaGFuZGxlX2Vycm9yOwotICAgICAgICAgICAgfQorICAgIGNvbnN0IGNoYXIgKm1vZHVsZV9zdHIgPSBQeVN0cmluZ19Bc1N0cmluZygqbW9kdWxlKTsKKyAgICBpZiAobW9kdWxlX3N0ciAmJiBzdHJjbXAobW9kdWxlX3N0ciwgIl9fbWFpbl9fIikgPT0gMCkgeworICAgICAgICBQeU9iamVjdCAqYXJndiA9IFB5U3lzX0dldE9iamVjdCgiYXJndiIpOworICAgICAgICBpZiAoYXJndiAhPSBOVUxMICYmIFB5TGlzdF9TaXplKGFyZ3YpID4gMCkgeworICAgICAgICBpbnQgaXNfdHJ1ZTsKKyAgICAgICAgKmZpbGVuYW1lID0gUHlMaXN0X0dldEl0ZW0oYXJndiwgMCk7CisgICAgICAgIFB5X0lOQ1JFRigqZmlsZW5hbWUpOworICAgICAgICAvKiBJZiBzeXMuYXJndlswXSBpcyBmYWxzZSwgdGhlbiB1c2UgJ19fbWFpbl9fJy4gKi8KKyAgICAgICAgaXNfdHJ1ZSA9IFB5T2JqZWN0X0lzVHJ1ZSgqZmlsZW5hbWUpOworICAgICAgICBpZiAoaXNfdHJ1ZSA8IDApIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRigqZmlsZW5hbWUpOworICAgICAgICAgICAgZ290byBoYW5kbGVfZXJyb3I7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKCpmaWxlbmFtZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAqZmlsZW5hbWUgPSAqbW9kdWxlOwotICAgICAgICAgICAgUHlfSU5DUkVGKCpmaWxlbmFtZSk7CisgICAgICAgIGVsc2UgaWYgKCFpc190cnVlKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoKmZpbGVuYW1lKTsKKyAgICAgICAgICAgICpmaWxlbmFtZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIl9fbWFpbl9fIik7CisgICAgICAgICAgICBpZiAoKmZpbGVuYW1lID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGhhbmRsZV9lcnJvcjsKICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAvKiBlbWJlZGRlZCBpbnRlcnByZXRlcnMgZG9uJ3QgaGF2ZSBzeXMuYXJndiwgc2VlIGJ1ZyAjODM5MTUxICovCisgICAgICAgICpmaWxlbmFtZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIl9fbWFpbl9fIik7CisgICAgICAgICAgICBpZiAoKmZpbGVuYW1lID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGhhbmRsZV9lcnJvcjsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoKmZpbGVuYW1lID09IE5VTEwpIHsKKyAgICAgICAgKmZpbGVuYW1lID0gKm1vZHVsZTsKKyAgICAgICAgUHlfSU5DUkVGKCpmaWxlbmFtZSk7CisgICAgfQogICAgIH0KIAogICAgIHJldHVybiAxOwpAQCAtNTgyLDIxICs1ODIsMjEgQEAKICAgICAvKiBHZXQgY2F0ZWdvcnkuICovCiAgICAgcmMgPSBQeU9iamVjdF9Jc0luc3RhbmNlKG1lc3NhZ2UsIFB5RXhjX1dhcm5pbmcpOwogICAgIGlmIChyYyA9PSAtMSkKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIE5VTEw7CiAKICAgICBpZiAocmMgPT0gMSkKLSAgICAgICAgY2F0ZWdvcnkgPSAoUHlPYmplY3QqKW1lc3NhZ2UtPm9iX3R5cGU7CisgICAgY2F0ZWdvcnkgPSAoUHlPYmplY3QqKW1lc3NhZ2UtPm9iX3R5cGU7CiAgICAgZWxzZSBpZiAoY2F0ZWdvcnkgPT0gTlVMTCkKLSAgICAgICAgY2F0ZWdvcnkgPSBQeUV4Y19Vc2VyV2FybmluZzsKKyAgICBjYXRlZ29yeSA9IFB5RXhjX1VzZXJXYXJuaW5nOwogCiAgICAgLyogVmFsaWRhdGUgY2F0ZWdvcnkuICovCiAgICAgcmMgPSBQeU9iamVjdF9Jc1N1YmNsYXNzKGNhdGVnb3J5LCBQeUV4Y19XYXJuaW5nKTsKICAgICBpZiAocmMgPT0gLTEpCi0gICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBOVUxMOwogICAgIGlmIChyYyA9PSAwKSB7Ci0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgImNhdGVnb3J5IGlzIG5vdCBhIHN1YmNsYXNzIG9mIFdhcm5pbmciKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICJjYXRlZ29yeSBpcyBub3QgYSBzdWJjbGFzcyBvZiBXYXJuaW5nIik7CisgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCiAgICAgcmV0dXJuIGNhdGVnb3J5OwpAQCAtNjA5LDcgKzYwOSw3IEBACiAgICAgaW50IGxpbmVubzsKIAogICAgIGlmICghc2V0dXBfY29udGV4dChzdGFja19sZXZlbCwgJmZpbGVuYW1lLCAmbGluZW5vLCAmbW9kdWxlLCAmcmVnaXN0cnkpKQotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gTlVMTDsKIAogICAgIHJlcyA9IHdhcm5fZXhwbGljaXQoY2F0ZWdvcnksIG1lc3NhZ2UsIGZpbGVuYW1lLCBsaW5lbm8sIG1vZHVsZSwgcmVnaXN0cnksCiAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKQEAgLTYyOCwxMSArNjI4LDExIEBACiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAiT3xPbjp3YXJuIiwga3dfbGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVzc2FnZSwgJmNhdGVnb3J5LCAmc3RhY2tfbGV2ZWwpKQotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gTlVMTDsKIAogICAgIGNhdGVnb3J5ID0gZ2V0X2NhdGVnb3J5KG1lc3NhZ2UsIGNhdGVnb3J5KTsKICAgICBpZiAoY2F0ZWdvcnkgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIE5VTEw7CiAgICAgcmV0dXJuIGRvX3dhcm4obWVzc2FnZSwgY2F0ZWdvcnksIHN0YWNrX2xldmVsKTsKIH0KIApAQCAtNjUyLDY4ICs2NTIsNjggQEAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAiT09PaXxPT086d2Fybl9leHBsaWNpdCIsCiAgICAgICAgICAgICAgICAga3dkX2xpc3QsICZtZXNzYWdlLCAmY2F0ZWdvcnksICZmaWxlbmFtZSwgJmxpbmVubywgJm1vZHVsZSwKICAgICAgICAgICAgICAgICAmcmVnaXN0cnksICZtb2R1bGVfZ2xvYmFscykpCi0gICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBOVUxMOwogCiAgICAgaWYgKG1vZHVsZV9nbG9iYWxzKSB7Ci0gICAgICAgIHN0YXRpYyBQeU9iamVjdCAqZ2V0X3NvdXJjZV9uYW1lID0gTlVMTDsKLSAgICAgICAgc3RhdGljIFB5T2JqZWN0ICpzcGxpdGxpbmVzX25hbWUgPSBOVUxMOwotICAgICAgICBQeU9iamVjdCAqbG9hZGVyOwotICAgICAgICBQeU9iamVjdCAqbW9kdWxlX25hbWU7Ci0gICAgICAgIFB5T2JqZWN0ICpzb3VyY2U7Ci0gICAgICAgIFB5T2JqZWN0ICpzb3VyY2VfbGlzdDsKLSAgICAgICAgUHlPYmplY3QgKnNvdXJjZV9saW5lOwotICAgICAgICBQeU9iamVjdCAqcmV0dXJuZWQ7CisgICAgc3RhdGljIFB5T2JqZWN0ICpnZXRfc291cmNlX25hbWUgPSBOVUxMOworICAgIHN0YXRpYyBQeU9iamVjdCAqc3BsaXRsaW5lc19uYW1lID0gTlVMTDsKKyAgICBQeU9iamVjdCAqbG9hZGVyOworICAgIFB5T2JqZWN0ICptb2R1bGVfbmFtZTsKKyAgICBQeU9iamVjdCAqc291cmNlOworICAgIFB5T2JqZWN0ICpzb3VyY2VfbGlzdDsKKyAgICBQeU9iamVjdCAqc291cmNlX2xpbmU7CisgICAgUHlPYmplY3QgKnJldHVybmVkOwogCi0gICAgICAgIGlmIChnZXRfc291cmNlX25hbWUgPT0gTlVMTCkgewotICAgICAgICAgICAgZ2V0X3NvdXJjZV9uYW1lID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiZ2V0X3NvdXJjZSIpOwotICAgICAgICAgICAgaWYgKCFnZXRfc291cmNlX25hbWUpCi0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNwbGl0bGluZXNfbmFtZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBzcGxpdGxpbmVzX25hbWUgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJzcGxpdGxpbmVzIik7Ci0gICAgICAgICAgICBpZiAoIXNwbGl0bGluZXNfbmFtZSkKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQorICAgIGlmIChnZXRfc291cmNlX25hbWUgPT0gTlVMTCkgeworICAgICAgICBnZXRfc291cmNlX25hbWUgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJnZXRfc291cmNlIik7CisgICAgICAgIGlmICghZ2V0X3NvdXJjZV9uYW1lKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKHNwbGl0bGluZXNfbmFtZSA9PSBOVUxMKSB7CisgICAgICAgIHNwbGl0bGluZXNfbmFtZSA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoInNwbGl0bGluZXMiKTsKKyAgICAgICAgaWYgKCFzcGxpdGxpbmVzX25hbWUpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotICAgICAgICAvKiBDaGVjay9nZXQgdGhlIHJlcXVpc2l0ZSBwaWVjZXMgbmVlZGVkIGZvciB0aGUgbG9hZGVyLiAqLwotICAgICAgICBsb2FkZXIgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhtb2R1bGVfZ2xvYmFscywgIl9fbG9hZGVyX18iKTsKLSAgICAgICAgbW9kdWxlX25hbWUgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhtb2R1bGVfZ2xvYmFscywgIl9fbmFtZV9fIik7CisgICAgLyogQ2hlY2svZ2V0IHRoZSByZXF1aXNpdGUgcGllY2VzIG5lZWRlZCBmb3IgdGhlIGxvYWRlci4gKi8KKyAgICBsb2FkZXIgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhtb2R1bGVfZ2xvYmFscywgIl9fbG9hZGVyX18iKTsKKyAgICBtb2R1bGVfbmFtZSA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKG1vZHVsZV9nbG9iYWxzLCAiX19uYW1lX18iKTsKIAotICAgICAgICBpZiAobG9hZGVyID09IE5VTEwgfHwgbW9kdWxlX25hbWUgPT0gTlVMTCkKLSAgICAgICAgICAgIGdvdG8gc3RhbmRhcmRfY2FsbDsKKyAgICBpZiAobG9hZGVyID09IE5VTEwgfHwgbW9kdWxlX25hbWUgPT0gTlVMTCkKKyAgICAgICAgZ290byBzdGFuZGFyZF9jYWxsOwogCi0gICAgICAgIC8qIE1ha2Ugc3VyZSB0aGUgbG9hZGVyIGltcGxlbWVudHMgdGhlIG9wdGlvbmFsIGdldF9zb3VyY2UoKSBtZXRob2QuICovCi0gICAgICAgIGlmICghUHlPYmplY3RfSGFzQXR0clN0cmluZyhsb2FkZXIsICJnZXRfc291cmNlIikpCi0gICAgICAgICAgICAgICAgZ290byBzdGFuZGFyZF9jYWxsOwotICAgICAgICAvKiBDYWxsIGdldF9zb3VyY2UoKSB0byBnZXQgdGhlIHNvdXJjZSBjb2RlLiAqLwotICAgICAgICBzb3VyY2UgPSBQeU9iamVjdF9DYWxsTWV0aG9kT2JqQXJncyhsb2FkZXIsIGdldF9zb3VyY2VfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZV9uYW1lLCBOVUxMKTsKLSAgICAgICAgaWYgKCFzb3VyY2UpCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgZWxzZSBpZiAoc291cmNlID09IFB5X05vbmUpIHsKLSAgICAgICAgICAgIFB5X0RFQ1JFRihQeV9Ob25lKTsKLSAgICAgICAgICAgIGdvdG8gc3RhbmRhcmRfY2FsbDsKLSAgICAgICAgfQorICAgIC8qIE1ha2Ugc3VyZSB0aGUgbG9hZGVyIGltcGxlbWVudHMgdGhlIG9wdGlvbmFsIGdldF9zb3VyY2UoKSBtZXRob2QuICovCisgICAgaWYgKCFQeU9iamVjdF9IYXNBdHRyU3RyaW5nKGxvYWRlciwgImdldF9zb3VyY2UiKSkKKyAgICAgICAgZ290byBzdGFuZGFyZF9jYWxsOworICAgIC8qIENhbGwgZ2V0X3NvdXJjZSgpIHRvIGdldCB0aGUgc291cmNlIGNvZGUuICovCisgICAgc291cmNlID0gUHlPYmplY3RfQ2FsbE1ldGhvZE9iakFyZ3MobG9hZGVyLCBnZXRfc291cmNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZV9uYW1lLCBOVUxMKTsKKyAgICBpZiAoIXNvdXJjZSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZWxzZSBpZiAoc291cmNlID09IFB5X05vbmUpIHsKKyAgICAgICAgUHlfREVDUkVGKFB5X05vbmUpOworICAgICAgICBnb3RvIHN0YW5kYXJkX2NhbGw7CisgICAgfQogCi0gICAgICAgIC8qIFNwbGl0IHRoZSBzb3VyY2UgaW50byBsaW5lcy4gKi8KLSAgICAgICAgc291cmNlX2xpc3QgPSBQeU9iamVjdF9DYWxsTWV0aG9kT2JqQXJncyhzb3VyY2UsIHNwbGl0bGluZXNfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKLSAgICAgICAgUHlfREVDUkVGKHNvdXJjZSk7Ci0gICAgICAgIGlmICghc291cmNlX2xpc3QpCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAvKiBTcGxpdCB0aGUgc291cmNlIGludG8gbGluZXMuICovCisgICAgc291cmNlX2xpc3QgPSBQeU9iamVjdF9DYWxsTWV0aG9kT2JqQXJncyhzb3VyY2UsIHNwbGl0bGluZXNfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgIFB5X0RFQ1JFRihzb3VyY2UpOworICAgIGlmICghc291cmNlX2xpc3QpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0gICAgICAgIC8qIEdldCB0aGUgc291cmNlIGxpbmUuICovCi0gICAgICAgIHNvdXJjZV9saW5lID0gUHlMaXN0X0dldEl0ZW0oc291cmNlX2xpc3QsIGxpbmVuby0xKTsKLSAgICAgICAgaWYgKCFzb3VyY2VfbGluZSkgewotICAgICAgICAgICAgUHlfREVDUkVGKHNvdXJjZV9saXN0KTsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogSGFuZGxlIHRoZSB3YXJuaW5nLiAqLwotICAgICAgICByZXR1cm5lZCA9IHdhcm5fZXhwbGljaXQoY2F0ZWdvcnksIG1lc3NhZ2UsIGZpbGVuYW1lLCBsaW5lbm8sIG1vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RyeSwgc291cmNlX2xpbmUpOworICAgIC8qIEdldCB0aGUgc291cmNlIGxpbmUuICovCisgICAgc291cmNlX2xpbmUgPSBQeUxpc3RfR2V0SXRlbShzb3VyY2VfbGlzdCwgbGluZW5vLTEpOworICAgIGlmICghc291cmNlX2xpbmUpIHsKICAgICAgICAgUHlfREVDUkVGKHNvdXJjZV9saXN0KTsKLSAgICAgICAgcmV0dXJuIHJldHVybmVkOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAvKiBIYW5kbGUgdGhlIHdhcm5pbmcuICovCisgICAgcmV0dXJuZWQgPSB3YXJuX2V4cGxpY2l0KGNhdGVnb3J5LCBtZXNzYWdlLCBmaWxlbmFtZSwgbGluZW5vLCBtb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RyeSwgc291cmNlX2xpbmUpOworICAgIFB5X0RFQ1JFRihzb3VyY2VfbGlzdCk7CisgICAgcmV0dXJuIHJldHVybmVkOwogICAgIH0KIAogIHN0YW5kYXJkX2NhbGw6CkBAIC03MjksMTUgKzcyOSwxNSBAQAogICAgIFB5T2JqZWN0ICpyZXM7CiAgICAgUHlPYmplY3QgKm1lc3NhZ2UgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKHRleHQpOwogICAgIGlmIChtZXNzYWdlID09IE5VTEwpCi0gICAgICAgIHJldHVybiAtMTsKKyAgICByZXR1cm4gLTE7CiAKICAgICBpZiAoY2F0ZWdvcnkgPT0gTlVMTCkKLSAgICAgICAgY2F0ZWdvcnkgPSBQeUV4Y19SdW50aW1lV2FybmluZzsKKyAgICBjYXRlZ29yeSA9IFB5RXhjX1J1bnRpbWVXYXJuaW5nOwogCiAgICAgcmVzID0gZG9fd2FybihtZXNzYWdlLCBjYXRlZ29yeSwgc3RhY2tfbGV2ZWwpOwogICAgIFB5X0RFQ1JFRihtZXNzYWdlKTsKICAgICBpZiAocmVzID09IE5VTEwpCi0gICAgICAgIHJldHVybiAtMTsKKyAgICByZXR1cm4gLTE7CiAgICAgUHlfREVDUkVGKHJlcyk7CiAKICAgICByZXR1cm4gMDsKQEAgLTc2NywxOSArNzY3LDE5IEBACiAgICAgaW50IHJldCA9IC0xOwogCiAgICAgaWYgKG1lc3NhZ2UgPT0gTlVMTCB8fCBmaWxlbmFtZSA9PSBOVUxMKQotICAgICAgICBnb3RvIGV4aXQ7CisgICAgZ290byBleGl0OwogICAgIGlmIChtb2R1bGVfc3RyICE9IE5VTEwpIHsKLSAgICAgICAgbW9kdWxlID0gUHlTdHJpbmdfRnJvbVN0cmluZyhtb2R1bGVfc3RyKTsKLSAgICAgICAgICAgIGlmIChtb2R1bGUgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgbW9kdWxlID0gUHlTdHJpbmdfRnJvbVN0cmluZyhtb2R1bGVfc3RyKTsKKyAgICAgICAgaWYgKG1vZHVsZSA9PSBOVUxMKQorICAgICAgICBnb3RvIGV4aXQ7CiAgICAgfQogCiAgICAgaWYgKGNhdGVnb3J5ID09IE5VTEwpCi0gICAgICAgIGNhdGVnb3J5ID0gUHlFeGNfUnVudGltZVdhcm5pbmc7CisgICAgY2F0ZWdvcnkgPSBQeUV4Y19SdW50aW1lV2FybmluZzsKICAgICByZXMgPSB3YXJuX2V4cGxpY2l0KGNhdGVnb3J5LCBtZXNzYWdlLCBmaWxlbmFtZSwgbGluZW5vLCBtb2R1bGUsIHJlZ2lzdHJ5LAogICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CiAgICAgaWYgKHJlcyA9PSBOVUxMKQotICAgICAgICBnb3RvIGV4aXQ7CisgICAgZ290byBleGl0OwogICAgIFB5X0RFQ1JFRihyZXMpOwogICAgIHJldCA9IDA7CiAKQEAgLTc5OSwxMiArNzk5LDEyIEBACiAKIHN0YXRpYyBQeU1ldGhvZERlZiB3YXJuaW5nc19mdW5jdGlvbnNbXSA9IHsKICAgICB7Indhcm4iLCAoUHlDRnVuY3Rpb24pd2FybmluZ3Nfd2FybiwgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywKLSAgICAgICAgd2Fybl9kb2N9LAorICAgIHdhcm5fZG9jfSwKICAgICB7Indhcm5fZXhwbGljaXQiLCAoUHlDRnVuY3Rpb24pd2FybmluZ3Nfd2Fybl9leHBsaWNpdCwKLSAgICAgICAgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywgd2Fybl9leHBsaWNpdF9kb2N9LAorICAgIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsIHdhcm5fZXhwbGljaXRfZG9jfSwKICAgICAvKiBYWFgoYnJldHQuY2Fubm9uKTogYWRkIHNob3d3YXJuaW5nPyAqLwogICAgIC8qIFhYWChicmV0dC5jYW5ub24pOiBSZWFzb25hYmxlIHRvIGFkZCBmb3JtYXR3YXJuaW5nPyAqLwotICAgIHtOVUxMLCBOVUxMfQkgICAgICAgIC8qIHNlbnRpbmVsICovCisgICAge05VTEwsIE5VTEx9ICAgICAgICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiAKQEAgLTgxOCwzNyArODE4LDM3IEBACiAgICAgUHlPYmplY3QgKmxpbmVubywgKnJlc3VsdDsKIAogICAgIGlmICghc3RyY21wKGFjdGlvbiwgImlnbm9yZSIpKSB7Ci0gICAgICAgIGlmIChpZ25vcmVfc3RyID09IE5VTEwpIHsKLSAgICAgICAgICAgIGlnbm9yZV9zdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJpZ25vcmUiKTsKLSAgICAgICAgICAgIGlmIChpZ25vcmVfc3RyID09IE5VTEwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgYWN0aW9uX29iaiA9IGlnbm9yZV9zdHI7CisgICAgaWYgKGlnbm9yZV9zdHIgPT0gTlVMTCkgeworICAgICAgICBpZ25vcmVfc3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiaWdub3JlIik7CisgICAgICAgIGlmIChpZ25vcmVfc3RyID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBhY3Rpb25fb2JqID0gaWdub3JlX3N0cjsKICAgICB9CiAgICAgZWxzZSBpZiAoIXN0cmNtcChhY3Rpb24sICJlcnJvciIpKSB7Ci0gICAgICAgIGlmIChlcnJvcl9zdHIgPT0gTlVMTCkgewotICAgICAgICAgICAgZXJyb3Jfc3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiZXJyb3IiKTsKLSAgICAgICAgICAgIGlmIChlcnJvcl9zdHIgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBhY3Rpb25fb2JqID0gZXJyb3Jfc3RyOworICAgIGlmIChlcnJvcl9zdHIgPT0gTlVMTCkgeworICAgICAgICBlcnJvcl9zdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJlcnJvciIpOworICAgICAgICBpZiAoZXJyb3Jfc3RyID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBhY3Rpb25fb2JqID0gZXJyb3Jfc3RyOwogICAgIH0KICAgICBlbHNlIGlmICghc3RyY21wKGFjdGlvbiwgImRlZmF1bHQiKSkgewotICAgICAgICBpZiAoZGVmYXVsdF9zdHIgPT0gTlVMTCkgewotICAgICAgICAgICAgZGVmYXVsdF9zdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJkZWZhdWx0Iik7Ci0gICAgICAgICAgICBpZiAoZGVmYXVsdF9zdHIgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBhY3Rpb25fb2JqID0gZGVmYXVsdF9zdHI7CisgICAgaWYgKGRlZmF1bHRfc3RyID09IE5VTEwpIHsKKyAgICAgICAgZGVmYXVsdF9zdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJkZWZhdWx0Iik7CisgICAgICAgIGlmIChkZWZhdWx0X3N0ciA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgYWN0aW9uX29iaiA9IGRlZmF1bHRfc3RyOwogICAgIH0KICAgICBlbHNlIHsKLSAgICAgICAgUHlfRmF0YWxFcnJvcigidW5rbm93biBhY3Rpb24iKTsKKyAgICBQeV9GYXRhbEVycm9yKCJ1bmtub3duIGFjdGlvbiIpOwogICAgIH0KIAogICAgIC8qIFRoaXMgYXNzdW1lcyB0aGUgbGluZSBudW1iZXIgaXMgemVybyBmb3Igbm93LiAqLwogICAgIGxpbmVubyA9IFB5SW50X0Zyb21Mb25nKDApOwogICAgIGlmIChsaW5lbm8gPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIE5VTEw7CiAgICAgcmVzdWx0ID0gUHlUdXBsZV9QYWNrKDUsIGFjdGlvbl9vYmosIFB5X05vbmUsIGNhdGVnb3J5LCBQeV9Ob25lLCBsaW5lbm8pOwogICAgIFB5X0RFQ1JFRihsaW5lbm8pOwogICAgIHJldHVybiByZXN1bHQ7CkBAIC04NjAsMjUgKzg2MCwyNSBAQAogICAgIFB5T2JqZWN0ICpmaWx0ZXJzID0gUHlMaXN0X05ldygzKTsKICAgICBjb25zdCBjaGFyICpieXRlc19hY3Rpb247CiAgICAgaWYgKGZpbHRlcnMgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIE5VTEw7CiAKICAgICBQeUxpc3RfU0VUX0lURU0oZmlsdGVycywgMCwKICAgICAgICAgICAgICAgICAgICAgY3JlYXRlX2ZpbHRlcihQeUV4Y19QZW5kaW5nRGVwcmVjYXRpb25XYXJuaW5nLCAiaWdub3JlIikpOwogICAgIFB5TGlzdF9TRVRfSVRFTShmaWx0ZXJzLCAxLCBjcmVhdGVfZmlsdGVyKFB5RXhjX0ltcG9ydFdhcm5pbmcsICJpZ25vcmUiKSk7CiAgICAgaWYgKFB5X0J5dGVzV2FybmluZ0ZsYWcgPiAxKQotICAgICAgICBieXRlc19hY3Rpb24gPSAiZXJyb3IiOworICAgIGJ5dGVzX2FjdGlvbiA9ICJlcnJvciI7CiAgICAgZWxzZSBpZiAoUHlfQnl0ZXNXYXJuaW5nRmxhZykKLSAgICAgICAgYnl0ZXNfYWN0aW9uID0gImRlZmF1bHQiOworICAgIGJ5dGVzX2FjdGlvbiA9ICJkZWZhdWx0IjsKICAgICBlbHNlCi0gICAgICAgIGJ5dGVzX2FjdGlvbiA9ICJpZ25vcmUiOworICAgIGJ5dGVzX2FjdGlvbiA9ICJpZ25vcmUiOwogICAgIFB5TGlzdF9TRVRfSVRFTShmaWx0ZXJzLCAyLCBjcmVhdGVfZmlsdGVyKFB5RXhjX0J5dGVzV2FybmluZywKICAgICAgICAgICAgICAgICAgICAgYnl0ZXNfYWN0aW9uKSk7CiAKICAgICBpZiAoUHlMaXN0X0dFVF9JVEVNKGZpbHRlcnMsIDApID09IE5VTEwgfHwKLSAgICAgICAgUHlMaXN0X0dFVF9JVEVNKGZpbHRlcnMsIDEpID09IE5VTEwgfHwKLSAgICAgICAgUHlMaXN0X0dFVF9JVEVNKGZpbHRlcnMsIDIpID09IE5VTEwpIHsKLSAgICAgICAgUHlfREVDUkVGKGZpbHRlcnMpOwotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQeUxpc3RfR0VUX0lURU0oZmlsdGVycywgMSkgPT0gTlVMTCB8fAorICAgIFB5TGlzdF9HRVRfSVRFTShmaWx0ZXJzLCAyKSA9PSBOVUxMKSB7CisgICAgUHlfREVDUkVGKGZpbHRlcnMpOworICAgIHJldHVybiBOVUxMOwogICAgIH0KIAogICAgIHJldHVybiBmaWx0ZXJzOwpAQCAtODkyLDI1ICs4OTIsMjUgQEAKIAogICAgIG0gPSBQeV9Jbml0TW9kdWxlMyhNT0RVTEVfTkFNRSwgd2FybmluZ3NfZnVuY3Rpb25zLCB3YXJuaW5nc19fZG9jX18pOwogICAgIGlmIChtID09IE5VTEwpCi0gICAgICAgIHJldHVybjsKKyAgICByZXR1cm47CiAKICAgICBfZmlsdGVycyA9IGluaXRfZmlsdGVycygpOwogICAgIGlmIChfZmlsdGVycyA9PSBOVUxMKQotICAgICAgICByZXR1cm47CisgICAgcmV0dXJuOwogICAgIFB5X0lOQ1JFRihfZmlsdGVycyk7CiAgICAgaWYgKFB5TW9kdWxlX0FkZE9iamVjdChtLCAiZmlsdGVycyIsIF9maWx0ZXJzKSA8IDApCi0gICAgICAgIHJldHVybjsKKyAgICByZXR1cm47CiAKICAgICBfb25jZV9yZWdpc3RyeSA9IFB5RGljdF9OZXcoKTsKICAgICBpZiAoX29uY2VfcmVnaXN0cnkgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuOworICAgIHJldHVybjsKICAgICBQeV9JTkNSRUYoX29uY2VfcmVnaXN0cnkpOwogICAgIGlmIChQeU1vZHVsZV9BZGRPYmplY3QobSwgIm9uY2VfcmVnaXN0cnkiLCBfb25jZV9yZWdpc3RyeSkgPCAwKQotICAgICAgICByZXR1cm47CisgICAgcmV0dXJuOwogCiAgICAgZGVmYXVsdF9hY3Rpb24gPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJkZWZhdWx0Iik7CiAgICAgaWYgKGRlZmF1bHRfYWN0aW9uID09IE5VTEwpCi0gICAgICAgIHJldHVybjsKKyAgICByZXR1cm47CiAgICAgaWYgKFB5TW9kdWxlX0FkZE9iamVjdChtLCBERUZBVUxUX0FDVElPTl9OQU1FLCBkZWZhdWx0X2FjdGlvbikgPCAwKQotICAgICAgICByZXR1cm47CisgICAgcmV0dXJuOwogfQpkaWZmIC0tZ2l0IGEvUHl0aG9uL2FzZGwuYyBiL1B5dGhvbi9hc2RsLmMKaW5kZXggMTEwNWQzYS4uYzMwZDdkMjAgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9hc2RsLmMKKysrIGIvUHl0aG9uL2FzZGwuYwpAQCAtNCw2MSArNCw2MSBAQAogYXNkbF9zZXEgKgogYXNkbF9zZXFfbmV3KGludCBzaXplLCBQeUFyZW5hICphcmVuYSkKIHsKLQlhc2RsX3NlcSAqc2VxID0gTlVMTDsKLQlzaXplX3QgbiA9IChzaXplID8gKHNpemVvZih2b2lkICopICogKHNpemUgLSAxKSkgOiAwKTsKKyAgICBhc2RsX3NlcSAqc2VxID0gTlVMTDsKKyAgICBzaXplX3QgbiA9IChzaXplID8gKHNpemVvZih2b2lkICopICogKHNpemUgLSAxKSkgOiAwKTsKIAotCS8qIGNoZWNrIHNpemUgaXMgc2FuZSAqLwotCWlmIChzaXplIDwgMCB8fCBzaXplID09IElOVF9NSU4gfHwgCi0JCShzaXplICYmICgoc2l6ZSAtIDEpID4gKFBZX1NJWkVfTUFYIC8gc2l6ZW9mKHZvaWQgKikpKSkpIHsKLQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIC8qIGNoZWNrIHNpemUgaXMgc2FuZSAqLworICAgIGlmIChzaXplIDwgMCB8fCBzaXplID09IElOVF9NSU4gfHwKKyAgICAgICAgKHNpemUgJiYgKChzaXplIC0gMSkgPiAoUFlfU0laRV9NQVggLyBzaXplb2Yodm9pZCAqKSkpKSkgeworICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQkvKiBjaGVjayBpZiBzaXplIGNhbiBiZSBhZGRlZCBzYWZlbHkgKi8KLQlpZiAobiA+IFBZX1NJWkVfTUFYIC0gc2l6ZW9mKGFzZGxfc2VxKSkgewotCQlQeUVycl9Ob01lbW9yeSgpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgLyogY2hlY2sgaWYgc2l6ZSBjYW4gYmUgYWRkZWQgc2FmZWx5ICovCisgICAgaWYgKG4gPiBQWV9TSVpFX01BWCAtIHNpemVvZihhc2RsX3NlcSkpIHsKKyAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JbiArPSBzaXplb2YoYXNkbF9zZXEpOworICAgIG4gKz0gc2l6ZW9mKGFzZGxfc2VxKTsKIAotCXNlcSA9IChhc2RsX3NlcSAqKVB5QXJlbmFfTWFsbG9jKGFyZW5hLCBuKTsKLQlpZiAoIXNlcSkgewotCQlQeUVycl9Ob01lbW9yeSgpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JbWVtc2V0KHNlcSwgMCwgbik7Ci0Jc2VxLT5zaXplID0gc2l6ZTsKLQlyZXR1cm4gc2VxOworICAgIHNlcSA9IChhc2RsX3NlcSAqKVB5QXJlbmFfTWFsbG9jKGFyZW5hLCBuKTsKKyAgICBpZiAoIXNlcSkgeworICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgbWVtc2V0KHNlcSwgMCwgbik7CisgICAgc2VxLT5zaXplID0gc2l6ZTsKKyAgICByZXR1cm4gc2VxOwogfQogCiBhc2RsX2ludF9zZXEgKgogYXNkbF9pbnRfc2VxX25ldyhpbnQgc2l6ZSwgUHlBcmVuYSAqYXJlbmEpCiB7Ci0JYXNkbF9pbnRfc2VxICpzZXEgPSBOVUxMOwotCXNpemVfdCBuID0gKHNpemUgPyAoc2l6ZW9mKHZvaWQgKikgKiAoc2l6ZSAtIDEpKSA6IDApOworICAgIGFzZGxfaW50X3NlcSAqc2VxID0gTlVMTDsKKyAgICBzaXplX3QgbiA9IChzaXplID8gKHNpemVvZih2b2lkICopICogKHNpemUgLSAxKSkgOiAwKTsKIAotCS8qIGNoZWNrIHNpemUgaXMgc2FuZSAqLwotCWlmIChzaXplIDwgMCB8fCBzaXplID09IElOVF9NSU4gfHwgCi0JCShzaXplICYmICgoc2l6ZSAtIDEpID4gKFBZX1NJWkVfTUFYIC8gc2l6ZW9mKHZvaWQgKikpKSkpIHsKLQkJCVB5RXJyX05vTWVtb3J5KCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgLyogY2hlY2sgc2l6ZSBpcyBzYW5lICovCisgICAgaWYgKHNpemUgPCAwIHx8IHNpemUgPT0gSU5UX01JTiB8fAorICAgICAgICAoc2l6ZSAmJiAoKHNpemUgLSAxKSA+IChQWV9TSVpFX01BWCAvIHNpemVvZih2b2lkICopKSkpKSB7CisgICAgICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JLyogY2hlY2sgaWYgc2l6ZSBjYW4gYmUgYWRkZWQgc2FmZWx5ICovCi0JaWYgKG4gPiBQWV9TSVpFX01BWCAtIHNpemVvZihhc2RsX3NlcSkpIHsKLQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIC8qIGNoZWNrIGlmIHNpemUgY2FuIGJlIGFkZGVkIHNhZmVseSAqLworICAgIGlmIChuID4gUFlfU0laRV9NQVggLSBzaXplb2YoYXNkbF9zZXEpKSB7CisgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCW4gKz0gc2l6ZW9mKGFzZGxfc2VxKTsKKyAgICBuICs9IHNpemVvZihhc2RsX3NlcSk7CiAKLQlzZXEgPSAoYXNkbF9pbnRfc2VxICopUHlBcmVuYV9NYWxsb2MoYXJlbmEsIG4pOwotCWlmICghc2VxKSB7Ci0JCVB5RXJyX05vTWVtb3J5KCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQltZW1zZXQoc2VxLCAwLCBuKTsKLQlzZXEtPnNpemUgPSBzaXplOwotCXJldHVybiBzZXE7CisgICAgc2VxID0gKGFzZGxfaW50X3NlcSAqKVB5QXJlbmFfTWFsbG9jKGFyZW5hLCBuKTsKKyAgICBpZiAoIXNlcSkgeworICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgbWVtc2V0KHNlcSwgMCwgbik7CisgICAgc2VxLT5zaXplID0gc2l6ZTsKKyAgICByZXR1cm4gc2VxOwogfQpkaWZmIC0tZ2l0IGEvUHl0aG9uL2F0b2YuYyBiL1B5dGhvbi9hdG9mLmMKaW5kZXggOGZiZGUzOC4uNTYyZmNkNiAxMDA2NDQKLS0tIGEvUHl0aG9uL2F0b2YuYworKysgYi9QeXRob24vYXRvZi5jCkBAIC0xMCw0MSArMTAsNDEgQEAKIAogZG91YmxlIGF0b2YoY2hhciAqcykKIHsKLQlkb3VibGUgYSA9IDAuMDsKLQlpbnQgZSA9IDA7Ci0JaW50IGM7Ci0Jd2hpbGUgKChjID0gKnMrKykgIT0gJ1wwJyAmJiBpc2RpZ2l0KGMpKSB7Ci0JCWEgPSBhKjEwLjAgKyAoYyAtICcwJyk7Ci0JfQotCWlmIChjID09ICcuJykgewotCQl3aGlsZSAoKGMgPSAqcysrKSAhPSAnXDAnICYmIGlzZGlnaXQoYykpIHsKLQkJCWEgPSBhKjEwLjAgKyAoYyAtICcwJyk7Ci0JCQllID0gZS0xOwotCQl9Ci0JfQotCWlmIChjID09ICdlJyB8fCBjID09ICdFJykgewotCQlpbnQgc2lnbiA9IDE7Ci0JCWludCBpID0gMDsKLQkJYyA9ICpzKys7Ci0JCWlmIChjID09ICcrJykKLQkJCWMgPSAqcysrOwotCQllbHNlIGlmIChjID09ICctJykgewotCQkJYyA9ICpzKys7Ci0JCQlzaWduID0gLTE7Ci0JCX0KLQkJd2hpbGUgKGlzZGlnaXQoYykpIHsKLQkJCWkgPSBpKjEwICsgKGMgLSAnMCcpOwotCQkJYyA9ICpzKys7Ci0JCX0KLQkJZSArPSBpKnNpZ247Ci0JfQotCXdoaWxlIChlID4gMCkgewotCQlhICo9IDEwLjA7Ci0JCWUtLTsKLQl9Ci0Jd2hpbGUgKGUgPCAwKSB7Ci0JCWEgKj0gMC4xOwotCQllKys7Ci0JfQotCXJldHVybiBhOworICAgIGRvdWJsZSBhID0gMC4wOworICAgIGludCBlID0gMDsKKyAgICBpbnQgYzsKKyAgICB3aGlsZSAoKGMgPSAqcysrKSAhPSAnXDAnICYmIGlzZGlnaXQoYykpIHsKKyAgICAgICAgYSA9IGEqMTAuMCArIChjIC0gJzAnKTsKKyAgICB9CisgICAgaWYgKGMgPT0gJy4nKSB7CisgICAgICAgIHdoaWxlICgoYyA9ICpzKyspICE9ICdcMCcgJiYgaXNkaWdpdChjKSkgeworICAgICAgICAgICAgYSA9IGEqMTAuMCArIChjIC0gJzAnKTsKKyAgICAgICAgICAgIGUgPSBlLTE7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGMgPT0gJ2UnIHx8IGMgPT0gJ0UnKSB7CisgICAgICAgIGludCBzaWduID0gMTsKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICBjID0gKnMrKzsKKyAgICAgICAgaWYgKGMgPT0gJysnKQorICAgICAgICAgICAgYyA9ICpzKys7CisgICAgICAgIGVsc2UgaWYgKGMgPT0gJy0nKSB7CisgICAgICAgICAgICBjID0gKnMrKzsKKyAgICAgICAgICAgIHNpZ24gPSAtMTsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAoaXNkaWdpdChjKSkgeworICAgICAgICAgICAgaSA9IGkqMTAgKyAoYyAtICcwJyk7CisgICAgICAgICAgICBjID0gKnMrKzsKKyAgICAgICAgfQorICAgICAgICBlICs9IGkqc2lnbjsKKyAgICB9CisgICAgd2hpbGUgKGUgPiAwKSB7CisgICAgICAgIGEgKj0gMTAuMDsKKyAgICAgICAgZS0tOworICAgIH0KKyAgICB3aGlsZSAoZSA8IDApIHsKKyAgICAgICAgYSAqPSAwLjE7CisgICAgICAgIGUrKzsKKyAgICB9CisgICAgcmV0dXJuIGE7CiB9CmRpZmYgLS1naXQgYS9QeXRob24vYmx0aW5tb2R1bGUuYyBiL1B5dGhvbi9ibHRpbm1vZHVsZS5jCmluZGV4IDA4Y2M4YjMuLjU3ZDlkZjggMTAwNjQ0Ci0tLSBhL1B5dGhvbi9ibHRpbm1vZHVsZS5jCisrKyBiL1B5dGhvbi9ibHRpbm1vZHVsZS5jCkBAIC0zNCwxOSArMzQsMTkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBidWlsdGluX19faW1wb3J0X18oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7Im5hbWUiLCAiZ2xvYmFscyIsICJsb2NhbHMiLCAiZnJvbWxpc3QiLAotCQkJCSAibGV2ZWwiLCAwfTsKLQljaGFyICpuYW1lOwotCVB5T2JqZWN0ICpnbG9iYWxzID0gTlVMTDsKLQlQeU9iamVjdCAqbG9jYWxzID0gTlVMTDsKLQlQeU9iamVjdCAqZnJvbWxpc3QgPSBOVUxMOwotCWludCBsZXZlbCA9IC0xOworICAgIHN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsibmFtZSIsICJnbG9iYWxzIiwgImxvY2FscyIsICJmcm9tbGlzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsZXZlbCIsIDB9OworICAgIGNoYXIgKm5hbWU7CisgICAgUHlPYmplY3QgKmdsb2JhbHMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpsb2NhbHMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpmcm9tbGlzdCA9IE5VTEw7CisgICAgaW50IGxldmVsID0gLTE7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAic3xPT09pOl9faW1wb3J0X18iLAotCQkJa3dsaXN0LCAmbmFtZSwgJmdsb2JhbHMsICZsb2NhbHMsICZmcm9tbGlzdCwgJmxldmVsKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIFB5SW1wb3J0X0ltcG9ydE1vZHVsZUxldmVsKG5hbWUsIGdsb2JhbHMsIGxvY2FscywKLQkJCQkJICBmcm9tbGlzdCwgbGV2ZWwpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJzfE9PT2k6X19pbXBvcnRfXyIsCisgICAgICAgICAgICAgICAgICAgIGt3bGlzdCwgJm5hbWUsICZnbG9iYWxzLCAmbG9jYWxzLCAmZnJvbWxpc3QsICZsZXZlbCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeUltcG9ydF9JbXBvcnRNb2R1bGVMZXZlbChuYW1lLCBnbG9iYWxzLCBsb2NhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21saXN0LCBsZXZlbCk7CiB9CiAKIFB5RG9jX1NUUlZBUihpbXBvcnRfZG9jLApAQCAtNjcsNyArNjcsNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGJ1aWx0aW5fYWJzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdikKIHsKLQlyZXR1cm4gUHlOdW1iZXJfQWJzb2x1dGUodik7CisgICAgcmV0dXJuIFB5TnVtYmVyX0Fic29sdXRlKHYpOwogfQogCiBQeURvY19TVFJWQVIoYWJzX2RvYywKQEAgLTc4LDM4ICs3OCwzOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGJ1aWx0aW5fYWxsKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdikKIHsKLQlQeU9iamVjdCAqaXQsICppdGVtOwotCVB5T2JqZWN0ICooKml0ZXJuZXh0KShQeU9iamVjdCAqKTsKLQlpbnQgY21wOworICAgIFB5T2JqZWN0ICppdCwgKml0ZW07CisgICAgUHlPYmplY3QgKigqaXRlcm5leHQpKFB5T2JqZWN0ICopOworICAgIGludCBjbXA7CiAKLQlpdCA9IFB5T2JqZWN0X0dldEl0ZXIodik7Ci0JaWYgKGl0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWl0ZXJuZXh0ID0gKlB5X1RZUEUoaXQpLT50cF9pdGVybmV4dDsKKyAgICBpdCA9IFB5T2JqZWN0X0dldEl0ZXIodik7CisgICAgaWYgKGl0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGl0ZXJuZXh0ID0gKlB5X1RZUEUoaXQpLT50cF9pdGVybmV4dDsKIAotCWZvciAoOzspIHsKLQkJaXRlbSA9IGl0ZXJuZXh0KGl0KTsKLQkJaWYgKGl0ZW0gPT0gTlVMTCkKLQkJCWJyZWFrOwotCQljbXAgPSBQeU9iamVjdF9Jc1RydWUoaXRlbSk7Ci0JCVB5X0RFQ1JFRihpdGVtKTsKLQkJaWYgKGNtcCA8IDApIHsKLQkJCVB5X0RFQ1JFRihpdCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlpZiAoY21wID09IDApIHsKLQkJCVB5X0RFQ1JFRihpdCk7Ci0JCQlQeV9SRVRVUk5fRkFMU0U7Ci0JCX0KLQl9Ci0JUHlfREVDUkVGKGl0KTsKLQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkgewotCQlpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19TdG9wSXRlcmF0aW9uKSkKLQkJCVB5RXJyX0NsZWFyKCk7Ci0JCWVsc2UKLQkJCXJldHVybiBOVUxMOwotCX0KLQlQeV9SRVRVUk5fVFJVRTsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGl0ZW0gPSBpdGVybmV4dChpdCk7CisgICAgICAgIGlmIChpdGVtID09IE5VTEwpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY21wID0gUHlPYmplY3RfSXNUcnVlKGl0ZW0pOworICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CisgICAgICAgIGlmIChjbXAgPCAwKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoaXQpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNtcCA9PSAwKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoaXQpOworICAgICAgICAgICAgUHlfUkVUVVJOX0ZBTFNFOworICAgICAgICB9CisgICAgfQorICAgIFB5X0RFQ1JFRihpdCk7CisgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfU3RvcEl0ZXJhdGlvbikpCisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlfUkVUVVJOX1RSVUU7CiB9CiAKIFB5RG9jX1NUUlZBUihhbGxfZG9jLApAQCAtMTIwLDM4ICsxMjAsMzggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBidWlsdGluX2FueShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnYpCiB7Ci0JUHlPYmplY3QgKml0LCAqaXRlbTsKLQlQeU9iamVjdCAqKCppdGVybmV4dCkoUHlPYmplY3QgKik7Ci0JaW50IGNtcDsKKyAgICBQeU9iamVjdCAqaXQsICppdGVtOworICAgIFB5T2JqZWN0ICooKml0ZXJuZXh0KShQeU9iamVjdCAqKTsKKyAgICBpbnQgY21wOwogCi0JaXQgPSBQeU9iamVjdF9HZXRJdGVyKHYpOwotCWlmIChpdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlpdGVybmV4dCA9ICpQeV9UWVBFKGl0KS0+dHBfaXRlcm5leHQ7CisgICAgaXQgPSBQeU9iamVjdF9HZXRJdGVyKHYpOworICAgIGlmIChpdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpdGVybmV4dCA9ICpQeV9UWVBFKGl0KS0+dHBfaXRlcm5leHQ7CiAKLQlmb3IgKDs7KSB7Ci0JCWl0ZW0gPSBpdGVybmV4dChpdCk7Ci0JCWlmIChpdGVtID09IE5VTEwpCi0JCQlicmVhazsKLQkJY21wID0gUHlPYmplY3RfSXNUcnVlKGl0ZW0pOwotCQlQeV9ERUNSRUYoaXRlbSk7Ci0JCWlmIChjbXAgPCAwKSB7Ci0JCQlQeV9ERUNSRUYoaXQpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJaWYgKGNtcCA9PSAxKSB7Ci0JCQlQeV9ERUNSRUYoaXQpOwotCQkJUHlfUkVUVVJOX1RSVUU7Ci0JCX0KLQl9Ci0JUHlfREVDUkVGKGl0KTsKLQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkgewotCQlpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19TdG9wSXRlcmF0aW9uKSkKLQkJCVB5RXJyX0NsZWFyKCk7Ci0JCWVsc2UKLQkJCXJldHVybiBOVUxMOwotCX0KLQlQeV9SRVRVUk5fRkFMU0U7CisgICAgZm9yICg7OykgeworICAgICAgICBpdGVtID0gaXRlcm5leHQoaXQpOworICAgICAgICBpZiAoaXRlbSA9PSBOVUxMKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNtcCA9IFB5T2JqZWN0X0lzVHJ1ZShpdGVtKTsKKyAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgICAgICBpZiAoY21wIDwgMCkgeworICAgICAgICAgICAgUHlfREVDUkVGKGl0KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGlmIChjbXAgPT0gMSkgeworICAgICAgICAgICAgUHlfREVDUkVGKGl0KTsKKyAgICAgICAgICAgIFB5X1JFVFVSTl9UUlVFOworICAgICAgICB9CisgICAgfQorICAgIFB5X0RFQ1JFRihpdCk7CisgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfU3RvcEl0ZXJhdGlvbikpCisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlfUkVUVVJOX0ZBTFNFOwogfQogCiBQeURvY19TVFJWQVIoYW55X2RvYywKQEAgLTE2MiwzOSArMTYyLDM5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYnVpbHRpbl9hcHBseShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKmZ1bmMsICphbGlzdCA9IE5VTEwsICprd2RpY3QgPSBOVUxMOwotCVB5T2JqZWN0ICp0ID0gTlVMTCwgKnJldHZhbCA9IE5VTEw7CisgICAgUHlPYmplY3QgKmZ1bmMsICphbGlzdCA9IE5VTEwsICprd2RpY3QgPSBOVUxMOworICAgIFB5T2JqZWN0ICp0ID0gTlVMTCwgKnJldHZhbCA9IE5VTEw7CiAKLQlpZiAoUHlFcnJfV2FyblB5M2soImFwcGx5KCkgbm90IHN1cHBvcnRlZCBpbiAzLng7ICIKLQkJCSAgICJ1c2UgZnVuYygqYXJncywgKiprd2FyZ3MpIiwgMSkgPCAwKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoUHlFcnJfV2FyblB5M2soImFwcGx5KCkgbm90IHN1cHBvcnRlZCBpbiAzLng7ICIKKyAgICAgICAgICAgICAgICAgICAgICAgInVzZSBmdW5jKCphcmdzLCAqKmt3YXJncykiLCAxKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiYXBwbHkiLCAxLCAzLCAmZnVuYywgJmFsaXN0LCAma3dkaWN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKGFsaXN0ICE9IE5VTEwpIHsKLQkJaWYgKCFQeVR1cGxlX0NoZWNrKGFsaXN0KSkgewotCQkJaWYgKCFQeVNlcXVlbmNlX0NoZWNrKGFsaXN0KSkgewotCQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkJICAgICAiYXBwbHkoKSBhcmcgMiBleHBlY3RlZCBzZXF1ZW5jZSwgZm91bmQgJXMiLAotCQkJCQkgICAgIGFsaXN0LT5vYl90eXBlLT50cF9uYW1lKTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJCXQgPSBQeVNlcXVlbmNlX1R1cGxlKGFsaXN0KTsKLQkJCWlmICh0ID09IE5VTEwpCi0JCQkJcmV0dXJuIE5VTEw7Ci0JCQlhbGlzdCA9IHQ7Ci0JCX0KLQl9Ci0JaWYgKGt3ZGljdCAhPSBOVUxMICYmICFQeURpY3RfQ2hlY2soa3dkaWN0KSkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJICAgICAiYXBwbHkoKSBhcmcgMyBleHBlY3RlZCBkaWN0aW9uYXJ5LCBmb3VuZCAlcyIsCi0JCQkgICAgIGt3ZGljdC0+b2JfdHlwZS0+dHBfbmFtZSk7Ci0JCWdvdG8gZmluYWxseTsKLQl9Ci0JcmV0dmFsID0gUHlFdmFsX0NhbGxPYmplY3RXaXRoS2V5d29yZHMoZnVuYywgYWxpc3QsIGt3ZGljdCk7CisgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiYXBwbHkiLCAxLCAzLCAmZnVuYywgJmFsaXN0LCAma3dkaWN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKGFsaXN0ICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKCFQeVR1cGxlX0NoZWNrKGFsaXN0KSkgeworICAgICAgICAgICAgaWYgKCFQeVNlcXVlbmNlX0NoZWNrKGFsaXN0KSkgeworICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiYXBwbHkoKSBhcmcgMiBleHBlY3RlZCBzZXF1ZW5jZSwgZm91bmQgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGFsaXN0LT5vYl90eXBlLT50cF9uYW1lKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHQgPSBQeVNlcXVlbmNlX1R1cGxlKGFsaXN0KTsKKyAgICAgICAgICAgIGlmICh0ID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICBhbGlzdCA9IHQ7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGt3ZGljdCAhPSBOVUxMICYmICFQeURpY3RfQ2hlY2soa3dkaWN0KSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgImFwcGx5KCkgYXJnIDMgZXhwZWN0ZWQgZGljdGlvbmFyeSwgZm91bmQgJXMiLAorICAgICAgICAgICAgICAgICAgICAga3dkaWN0LT5vYl90eXBlLT50cF9uYW1lKTsKKyAgICAgICAgZ290byBmaW5hbGx5OworICAgIH0KKyAgICByZXR2YWwgPSBQeUV2YWxfQ2FsbE9iamVjdFdpdGhLZXl3b3JkcyhmdW5jLCBhbGlzdCwga3dkaWN0KTsKICAgZmluYWxseToKLQlQeV9YREVDUkVGKHQpOwotCXJldHVybiByZXR2YWw7CisgICAgUHlfWERFQ1JFRih0KTsKKyAgICByZXR1cm4gcmV0dmFsOwogfQogCiBQeURvY19TVFJWQVIoYXBwbHlfZG9jLApAQCAtMjExLDcgKzIxMSw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYnVpbHRpbl9iaW4oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp2KQogewotICAgICAgICByZXR1cm4gUHlOdW1iZXJfVG9CYXNlKHYsIDIpOworICAgIHJldHVybiBQeU51bWJlcl9Ub0Jhc2UodiwgMik7CiB9CiAKIFB5RG9jX1NUUlZBUihiaW5fZG9jLApAQCAtMjIzLDEwICsyMjMsMTAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBidWlsdGluX2NhbGxhYmxlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdikKIHsKLQlpZiAoUHlFcnJfV2FyblB5M2soImNhbGxhYmxlKCkgbm90IHN1cHBvcnRlZCBpbiAzLng7ICIKLQkJCSAgICJ1c2UgaXNpbnN0YW5jZSh4LCBjb2xsZWN0aW9ucy5DYWxsYWJsZSkiLCAxKSA8IDApCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBQeUJvb2xfRnJvbUxvbmcoKGxvbmcpUHlDYWxsYWJsZV9DaGVjayh2KSk7CisgICAgaWYgKFB5RXJyX1dhcm5QeTNrKCJjYWxsYWJsZSgpIG5vdCBzdXBwb3J0ZWQgaW4gMy54OyAiCisgICAgICAgICAgICAgICAgICAgICAgICJ1c2UgaXNpbnN0YW5jZSh4LCBjb2xsZWN0aW9ucy5DYWxsYWJsZSkiLCAxKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoKGxvbmcpUHlDYWxsYWJsZV9DaGVjayh2KSk7CiB9CiAKIFB5RG9jX1NUUlZBUihjYWxsYWJsZV9kb2MsCkBAIC0yMzksMTA5ICsyMzksMTA5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYnVpbHRpbl9maWx0ZXIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICpmdW5jLCAqc2VxLCAqcmVzdWx0LCAqaXQsICphcmc7Ci0JUHlfc3NpemVfdCBsZW47ICAgLyogZ3Vlc3MgZm9yIHJlc3VsdCBsaXN0IHNpemUgKi8KLQlyZWdpc3RlciBQeV9zc2l6ZV90IGo7CisgICAgUHlPYmplY3QgKmZ1bmMsICpzZXEsICpyZXN1bHQsICppdCwgKmFyZzsKKyAgICBQeV9zc2l6ZV90IGxlbjsgICAvKiBndWVzcyBmb3IgcmVzdWx0IGxpc3Qgc2l6ZSAqLworICAgIHJlZ2lzdGVyIFB5X3NzaXplX3QgajsKIAotCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImZpbHRlciIsIDIsIDIsICZmdW5jLCAmc2VxKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiZmlsdGVyIiwgMiwgMiwgJmZ1bmMsICZzZXEpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCS8qIFN0cmluZ3MgYW5kIHR1cGxlcyByZXR1cm4gYSByZXN1bHQgb2YgdGhlIHNhbWUgdHlwZS4gKi8KLQlpZiAoUHlTdHJpbmdfQ2hlY2soc2VxKSkKLQkJcmV0dXJuIGZpbHRlcnN0cmluZyhmdW5jLCBzZXEpOworICAgIC8qIFN0cmluZ3MgYW5kIHR1cGxlcyByZXR1cm4gYSByZXN1bHQgb2YgdGhlIHNhbWUgdHlwZS4gKi8KKyAgICBpZiAoUHlTdHJpbmdfQ2hlY2soc2VxKSkKKyAgICAgICAgcmV0dXJuIGZpbHRlcnN0cmluZyhmdW5jLCBzZXEpOwogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQlpZiAoUHlVbmljb2RlX0NoZWNrKHNlcSkpCi0JCXJldHVybiBmaWx0ZXJ1bmljb2RlKGZ1bmMsIHNlcSk7CisgICAgaWYgKFB5VW5pY29kZV9DaGVjayhzZXEpKQorICAgICAgICByZXR1cm4gZmlsdGVydW5pY29kZShmdW5jLCBzZXEpOwogI2VuZGlmCi0JaWYgKFB5VHVwbGVfQ2hlY2soc2VxKSkKLQkJcmV0dXJuIGZpbHRlcnR1cGxlKGZ1bmMsIHNlcSk7CisgICAgaWYgKFB5VHVwbGVfQ2hlY2soc2VxKSkKKyAgICAgICAgcmV0dXJuIGZpbHRlcnR1cGxlKGZ1bmMsIHNlcSk7CiAKLQkvKiBQcmUtYWxsb2NhdGUgYXJndW1lbnQgbGlzdCB0dXBsZS4gKi8KLQlhcmcgPSBQeVR1cGxlX05ldygxKTsKLQlpZiAoYXJnID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIC8qIFByZS1hbGxvY2F0ZSBhcmd1bWVudCBsaXN0IHR1cGxlLiAqLworICAgIGFyZyA9IFB5VHVwbGVfTmV3KDEpOworICAgIGlmIChhcmcgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkvKiBHZXQgaXRlcmF0b3IuICovCi0JaXQgPSBQeU9iamVjdF9HZXRJdGVyKHNlcSk7Ci0JaWYgKGl0ID09IE5VTEwpCi0JCWdvdG8gRmFpbF9hcmc7CisgICAgLyogR2V0IGl0ZXJhdG9yLiAqLworICAgIGl0ID0gUHlPYmplY3RfR2V0SXRlcihzZXEpOworICAgIGlmIChpdCA9PSBOVUxMKQorICAgICAgICBnb3RvIEZhaWxfYXJnOwogCi0JLyogR3Vlc3MgYSByZXN1bHQgbGlzdCBzaXplLiAqLwotCWxlbiA9IF9QeU9iamVjdF9MZW5ndGhIaW50KHNlcSwgOCk7Ci0JaWYgKGxlbiA9PSAtMSkKLQkJZ290byBGYWlsX2l0OworICAgIC8qIEd1ZXNzIGEgcmVzdWx0IGxpc3Qgc2l6ZS4gKi8KKyAgICBsZW4gPSBfUHlPYmplY3RfTGVuZ3RoSGludChzZXEsIDgpOworICAgIGlmIChsZW4gPT0gLTEpCisgICAgICAgIGdvdG8gRmFpbF9pdDsKIAotCS8qIEdldCBhIHJlc3VsdCBsaXN0LiAqLwotCWlmIChQeUxpc3RfQ2hlY2soc2VxKSAmJiBzZXEtPm9iX3JlZmNudCA9PSAxKSB7Ci0JCS8qIEV3dyAtIGNhbiBtb2RpZnkgdGhlIGxpc3QgaW4tcGxhY2UuICovCi0JCVB5X0lOQ1JFRihzZXEpOwotCQlyZXN1bHQgPSBzZXE7Ci0JfQotCWVsc2UgewotCQlyZXN1bHQgPSBQeUxpc3RfTmV3KGxlbik7Ci0JCWlmIChyZXN1bHQgPT0gTlVMTCkKLQkJCWdvdG8gRmFpbF9pdDsKLQl9CisgICAgLyogR2V0IGEgcmVzdWx0IGxpc3QuICovCisgICAgaWYgKFB5TGlzdF9DaGVjayhzZXEpICYmIHNlcS0+b2JfcmVmY250ID09IDEpIHsKKyAgICAgICAgLyogRXd3IC0gY2FuIG1vZGlmeSB0aGUgbGlzdCBpbi1wbGFjZS4gKi8KKyAgICAgICAgUHlfSU5DUkVGKHNlcSk7CisgICAgICAgIHJlc3VsdCA9IHNlcTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJlc3VsdCA9IFB5TGlzdF9OZXcobGVuKTsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBGYWlsX2l0OworICAgIH0KIAotCS8qIEJ1aWxkIHRoZSByZXN1bHQgbGlzdC4gKi8KLQlqID0gMDsKLQlmb3IgKDs7KSB7Ci0JCVB5T2JqZWN0ICppdGVtOwotCQlpbnQgb2s7CisgICAgLyogQnVpbGQgdGhlIHJlc3VsdCBsaXN0LiAqLworICAgIGogPSAwOworICAgIGZvciAoOzspIHsKKyAgICAgICAgUHlPYmplY3QgKml0ZW07CisgICAgICAgIGludCBvazsKIAotCQlpdGVtID0gUHlJdGVyX05leHQoaXQpOwotCQlpZiAoaXRlbSA9PSBOVUxMKSB7Ci0JCQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkKLQkJCQlnb3RvIEZhaWxfcmVzdWx0X2l0OwotCQkJYnJlYWs7Ci0JCX0KKyAgICAgICAgaXRlbSA9IFB5SXRlcl9OZXh0KGl0KTsKKyAgICAgICAgaWYgKGl0ZW0gPT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICAgICAgZ290byBGYWlsX3Jlc3VsdF9pdDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CiAKLQkJaWYgKGZ1bmMgPT0gKFB5T2JqZWN0ICopJlB5Qm9vbF9UeXBlIHx8IGZ1bmMgPT0gUHlfTm9uZSkgewotCQkJb2sgPSBQeU9iamVjdF9Jc1RydWUoaXRlbSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlQeU9iamVjdCAqZ29vZDsKLQkJCVB5VHVwbGVfU0VUX0lURU0oYXJnLCAwLCBpdGVtKTsKLQkJCWdvb2QgPSBQeU9iamVjdF9DYWxsKGZ1bmMsIGFyZywgTlVMTCk7Ci0JCQlQeVR1cGxlX1NFVF9JVEVNKGFyZywgMCwgTlVMTCk7Ci0JCQlpZiAoZ29vZCA9PSBOVUxMKSB7Ci0JCQkJUHlfREVDUkVGKGl0ZW0pOwotCQkJCWdvdG8gRmFpbF9yZXN1bHRfaXQ7Ci0JCQl9Ci0JCQlvayA9IFB5T2JqZWN0X0lzVHJ1ZShnb29kKTsKLQkJCVB5X0RFQ1JFRihnb29kKTsKLQkJfQotCQlpZiAob2spIHsKLQkJCWlmIChqIDwgbGVuKQotCQkJCVB5TGlzdF9TRVRfSVRFTShyZXN1bHQsIGosIGl0ZW0pOwotCQkJZWxzZSB7Ci0JCQkJaW50IHN0YXR1cyA9IFB5TGlzdF9BcHBlbmQocmVzdWx0LCBpdGVtKTsKLQkJCQlQeV9ERUNSRUYoaXRlbSk7Ci0JCQkJaWYgKHN0YXR1cyA8IDApCi0JCQkJCWdvdG8gRmFpbF9yZXN1bHRfaXQ7Ci0JCQl9Ci0JCQkrK2o7Ci0JCX0KLQkJZWxzZQotCQkJUHlfREVDUkVGKGl0ZW0pOwotCX0KKyAgICAgICAgaWYgKGZ1bmMgPT0gKFB5T2JqZWN0ICopJlB5Qm9vbF9UeXBlIHx8IGZ1bmMgPT0gUHlfTm9uZSkgeworICAgICAgICAgICAgb2sgPSBQeU9iamVjdF9Jc1RydWUoaXRlbSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBQeU9iamVjdCAqZ29vZDsKKyAgICAgICAgICAgIFB5VHVwbGVfU0VUX0lURU0oYXJnLCAwLCBpdGVtKTsKKyAgICAgICAgICAgIGdvb2QgPSBQeU9iamVjdF9DYWxsKGZ1bmMsIGFyZywgTlVMTCk7CisgICAgICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKGFyZywgMCwgTlVMTCk7CisgICAgICAgICAgICBpZiAoZ29vZCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgICAgICAgICAgICAgIGdvdG8gRmFpbF9yZXN1bHRfaXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvayA9IFB5T2JqZWN0X0lzVHJ1ZShnb29kKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihnb29kKTsKKyAgICAgICAgfQorICAgICAgICBpZiAob2spIHsKKyAgICAgICAgICAgIGlmIChqIDwgbGVuKQorICAgICAgICAgICAgICAgIFB5TGlzdF9TRVRfSVRFTShyZXN1bHQsIGosIGl0ZW0pOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgaW50IHN0YXR1cyA9IFB5TGlzdF9BcHBlbmQocmVzdWx0LCBpdGVtKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA8IDApCisgICAgICAgICAgICAgICAgICAgIGdvdG8gRmFpbF9yZXN1bHRfaXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICArK2o7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgIH0KIAogCi0JLyogQ3V0IGJhY2sgcmVzdWx0IGxpc3QgaWYgbGVuIGlzIHRvbyBiaWcuICovCi0JaWYgKGogPCBsZW4gJiYgUHlMaXN0X1NldFNsaWNlKHJlc3VsdCwgaiwgbGVuLCBOVUxMKSA8IDApCi0JCWdvdG8gRmFpbF9yZXN1bHRfaXQ7CisgICAgLyogQ3V0IGJhY2sgcmVzdWx0IGxpc3QgaWYgbGVuIGlzIHRvbyBiaWcuICovCisgICAgaWYgKGogPCBsZW4gJiYgUHlMaXN0X1NldFNsaWNlKHJlc3VsdCwgaiwgbGVuLCBOVUxMKSA8IDApCisgICAgICAgIGdvdG8gRmFpbF9yZXN1bHRfaXQ7CiAKLQlQeV9ERUNSRUYoaXQpOwotCVB5X0RFQ1JFRihhcmcpOwotCXJldHVybiByZXN1bHQ7CisgICAgUHlfREVDUkVGKGl0KTsKKyAgICBQeV9ERUNSRUYoYXJnKTsKKyAgICByZXR1cm4gcmVzdWx0OwogCiBGYWlsX3Jlc3VsdF9pdDoKLQlQeV9ERUNSRUYocmVzdWx0KTsKKyAgICBQeV9ERUNSRUYocmVzdWx0KTsKIEZhaWxfaXQ6Ci0JUHlfREVDUkVGKGl0KTsKKyAgICBQeV9ERUNSRUYoaXQpOwogRmFpbF9hcmc6Ci0JUHlfREVDUkVGKGFyZyk7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlfREVDUkVGKGFyZyk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIFB5RG9jX1NUUlZBUihmaWx0ZXJfZG9jLApAQCAtMzU0LDEzICszNTQsMTMgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBidWlsdGluX2Zvcm1hdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKnZhbHVlOwotCVB5T2JqZWN0ICpmb3JtYXRfc3BlYyA9IE5VTEw7CisgICAgUHlPYmplY3QgKnZhbHVlOworICAgIFB5T2JqZWN0ICpmb3JtYXRfc3BlYyA9IE5VTEw7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98Tzpmb3JtYXQiLCAmdmFsdWUsICZmb3JtYXRfc3BlYykpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3xPOmZvcm1hdCIsICZ2YWx1ZSwgJmZvcm1hdF9zcGVjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlyZXR1cm4gUHlPYmplY3RfRm9ybWF0KHZhbHVlLCBmb3JtYXRfc3BlYyk7CisgICAgcmV0dXJuIFB5T2JqZWN0X0Zvcm1hdCh2YWx1ZSwgZm9ybWF0X3NwZWMpOwogfQogCiBQeURvY19TVFJWQVIoZm9ybWF0X2RvYywKQEAgLTM3MiwxOCArMzcyLDE4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYnVpbHRpbl9jaHIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgeDsKLQljaGFyIHNbMV07CisgICAgbG9uZyB4OworICAgIGNoYXIgc1sxXTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibDpjaHIiLCAmeCkpCi0JCXJldHVybiBOVUxMOwotCWlmICh4IDwgMCB8fCB4ID49IDI1NikgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkiY2hyKCkgYXJnIG5vdCBpbiByYW5nZSgyNTYpIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlzWzBdID0gKGNoYXIpeDsKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocywgMSk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsOmNociIsICZ4KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKHggPCAwIHx8IHggPj0gMjU2KSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImNocigpIGFyZyBub3QgaW4gcmFuZ2UoMjU2KSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgc1swXSA9IChjaGFyKXg7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHMsIDEpOwogfQogCiBQeURvY19TVFJWQVIoY2hyX2RvYywKQEAgLTM5NiwxMiArMzk2LDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogYnVpbHRpbl91bmljaHIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCB4OworICAgIGludCB4OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOnVuaWNociIsICZ4KSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOnVuaWNociIsICZ4KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlyZXR1cm4gUHlVbmljb2RlX0Zyb21PcmRpbmFsKHgpOworICAgIHJldHVybiBQeVVuaWNvZGVfRnJvbU9yZGluYWwoeCk7CiB9CiAKIFB5RG9jX1NUUlZBUih1bmljaHJfZG9jLApAQCAtNDE0LDE0ICs0MTQsMTQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBidWlsdGluX2NtcChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKmEsICpiOwotCWludCBjOworICAgIFB5T2JqZWN0ICphLCAqYjsKKyAgICBpbnQgYzsKIAotCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImNtcCIsIDIsIDIsICZhLCAmYikpCi0JCXJldHVybiBOVUxMOwotCWlmIChQeU9iamVjdF9DbXAoYSwgYiwgJmMpIDwgMCkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKWMpOworICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImNtcCIsIDIsIDIsICZhLCAmYikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChQeU9iamVjdF9DbXAoYSwgYiwgJmMpIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKWMpOwogfQogCiBQeURvY19TVFJWQVIoY21wX2RvYywKQEAgLTQzMywyMCArNDMzLDIwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogYnVpbHRpbl9jb2VyY2UoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICp2LCAqdzsKLQlQeU9iamVjdCAqcmVzOworICAgIFB5T2JqZWN0ICp2LCAqdzsKKyAgICBQeU9iamVjdCAqcmVzOwogCi0JaWYgKFB5RXJyX1dhcm5QeTNrKCJjb2VyY2UoKSBub3Qgc3VwcG9ydGVkIGluIDMueCIsIDEpIDwgMCkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKFB5RXJyX1dhcm5QeTNrKCJjb2VyY2UoKSBub3Qgc3VwcG9ydGVkIGluIDMueCIsIDEpIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJjb2VyY2UiLCAyLCAyLCAmdiwgJncpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoUHlOdW1iZXJfQ29lcmNlKCZ2LCAmdykgPCAwKQotCQlyZXR1cm4gTlVMTDsKLQlyZXMgPSBQeVR1cGxlX1BhY2soMiwgdiwgdyk7Ci0JUHlfREVDUkVGKHYpOwotCVB5X0RFQ1JFRih3KTsKLQlyZXR1cm4gcmVzOworICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImNvZXJjZSIsIDIsIDIsICZ2LCAmdykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChQeU51bWJlcl9Db2VyY2UoJnYsICZ3KSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJlcyA9IFB5VHVwbGVfUGFjaygyLCB2LCB3KTsKKyAgICBQeV9ERUNSRUYodik7CisgICAgUHlfREVDUkVGKHcpOworICAgIHJldHVybiByZXM7CiB9CiAKIFB5RG9jX1NUUlZBUihjb2VyY2VfZG9jLApAQCAtNDU5LDk4ICs0NTksOTggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBidWlsdGluX2NvbXBpbGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQljaGFyICpzdHI7Ci0JY2hhciAqZmlsZW5hbWU7Ci0JY2hhciAqc3RhcnRzdHI7Ci0JaW50IG1vZGUgPSAtMTsKLQlpbnQgZG9udF9pbmhlcml0ID0gMDsKLQlpbnQgc3VwcGxpZWRfZmxhZ3MgPSAwOwotCWludCBpc19hc3Q7Ci0JUHlDb21waWxlckZsYWdzIGNmOwotCVB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMLCAqY21kLCAqdG1wID0gTlVMTDsKLQlQeV9zc2l6ZV90IGxlbmd0aDsKLQlzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7InNvdXJjZSIsICJmaWxlbmFtZSIsICJtb2RlIiwgImZsYWdzIiwKLQkJCQkgImRvbnRfaW5oZXJpdCIsIE5VTEx9OwotCWludCBzdGFydFtdID0ge1B5X2ZpbGVfaW5wdXQsIFB5X2V2YWxfaW5wdXQsIFB5X3NpbmdsZV9pbnB1dH07CisgICAgY2hhciAqc3RyOworICAgIGNoYXIgKmZpbGVuYW1lOworICAgIGNoYXIgKnN0YXJ0c3RyOworICAgIGludCBtb2RlID0gLTE7CisgICAgaW50IGRvbnRfaW5oZXJpdCA9IDA7CisgICAgaW50IHN1cHBsaWVkX2ZsYWdzID0gMDsKKyAgICBpbnQgaXNfYXN0OworICAgIFB5Q29tcGlsZXJGbGFncyBjZjsKKyAgICBQeU9iamVjdCAqcmVzdWx0ID0gTlVMTCwgKmNtZCwgKnRtcCA9IE5VTEw7CisgICAgUHlfc3NpemVfdCBsZW5ndGg7CisgICAgc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJzb3VyY2UiLCAiZmlsZW5hbWUiLCAibW9kZSIsICJmbGFncyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkb250X2luaGVyaXQiLCBOVUxMfTsKKyAgICBpbnQgc3RhcnRbXSA9IHtQeV9maWxlX2lucHV0LCBQeV9ldmFsX2lucHV0LCBQeV9zaW5nbGVfaW5wdXR9OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgIk9zc3xpaTpjb21waWxlIiwKLQkJCQkJIGt3bGlzdCwgJmNtZCwgJmZpbGVuYW1lLCAmc3RhcnRzdHIsCi0JCQkJCSAmc3VwcGxpZWRfZmxhZ3MsICZkb250X2luaGVyaXQpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAiT3NzfGlpOmNvbXBpbGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGt3bGlzdCwgJmNtZCwgJmZpbGVuYW1lLCAmc3RhcnRzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN1cHBsaWVkX2ZsYWdzLCAmZG9udF9pbmhlcml0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQljZi5jZl9mbGFncyA9IHN1cHBsaWVkX2ZsYWdzOworICAgIGNmLmNmX2ZsYWdzID0gc3VwcGxpZWRfZmxhZ3M7CiAKLQlpZiAoc3VwcGxpZWRfZmxhZ3MgJgotCSAgICB+KFB5Q0ZfTUFTSyB8IFB5Q0ZfTUFTS19PQlNPTEVURSB8IFB5Q0ZfRE9OVF9JTVBMWV9ERURFTlQgfCBQeUNGX09OTFlfQVNUKSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJjb21waWxlKCk6IHVucmVjb2duaXNlZCBmbGFncyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JLyogWFhYIFdhcm4gaWYgKHN1cHBsaWVkX2ZsYWdzICYgUHlDRl9NQVNLX09CU09MRVRFKSAhPSAwPyAqLworICAgIGlmIChzdXBwbGllZF9mbGFncyAmCisgICAgICAgIH4oUHlDRl9NQVNLIHwgUHlDRl9NQVNLX09CU09MRVRFIHwgUHlDRl9ET05UX0lNUExZX0RFREVOVCB8IFB5Q0ZfT05MWV9BU1QpKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiY29tcGlsZSgpOiB1bnJlY29nbmlzZWQgZmxhZ3MiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIC8qIFhYWCBXYXJuIGlmIChzdXBwbGllZF9mbGFncyAmIFB5Q0ZfTUFTS19PQlNPTEVURSkgIT0gMD8gKi8KIAotCWlmICghZG9udF9pbmhlcml0KSB7Ci0JCVB5RXZhbF9NZXJnZUNvbXBpbGVyRmxhZ3MoJmNmKTsKLQl9CisgICAgaWYgKCFkb250X2luaGVyaXQpIHsKKyAgICAgICAgUHlFdmFsX01lcmdlQ29tcGlsZXJGbGFncygmY2YpOworICAgIH0KIAotCWlmIChzdHJjbXAoc3RhcnRzdHIsICJleGVjIikgPT0gMCkKLQkJbW9kZSA9IDA7Ci0JZWxzZSBpZiAoc3RyY21wKHN0YXJ0c3RyLCAiZXZhbCIpID09IDApCi0JCW1vZGUgPSAxOwotCWVsc2UgaWYgKHN0cmNtcChzdGFydHN0ciwgInNpbmdsZSIpID09IDApCi0JCW1vZGUgPSAyOwotCWVsc2UgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkiY29tcGlsZSgpIGFyZyAzIG11c3QgYmUgJ2V4ZWMnLCAnZXZhbCcgb3IgJ3NpbmdsZSciKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChzdHJjbXAoc3RhcnRzdHIsICJleGVjIikgPT0gMCkKKyAgICAgICAgbW9kZSA9IDA7CisgICAgZWxzZSBpZiAoc3RyY21wKHN0YXJ0c3RyLCAiZXZhbCIpID09IDApCisgICAgICAgIG1vZGUgPSAxOworICAgIGVsc2UgaWYgKHN0cmNtcChzdGFydHN0ciwgInNpbmdsZSIpID09IDApCisgICAgICAgIG1vZGUgPSAyOworICAgIGVsc2UgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjb21waWxlKCkgYXJnIDMgbXVzdCBiZSAnZXhlYycsICdldmFsJyBvciAnc2luZ2xlJyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlpc19hc3QgPSBQeUFTVF9DaGVjayhjbWQpOwotCWlmIChpc19hc3QgPT0gLTEpCi0JCXJldHVybiBOVUxMOwotCWlmIChpc19hc3QpIHsKLQkJaWYgKHN1cHBsaWVkX2ZsYWdzICYgUHlDRl9PTkxZX0FTVCkgewotCQkJUHlfSU5DUkVGKGNtZCk7Ci0JCQlyZXN1bHQgPSBjbWQ7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlQeUFyZW5hICphcmVuYTsKLQkJCW1vZF90eSBtb2Q7CisgICAgaXNfYXN0ID0gUHlBU1RfQ2hlY2soY21kKTsKKyAgICBpZiAoaXNfYXN0ID09IC0xKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoaXNfYXN0KSB7CisgICAgICAgIGlmIChzdXBwbGllZF9mbGFncyAmIFB5Q0ZfT05MWV9BU1QpIHsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihjbWQpOworICAgICAgICAgICAgcmVzdWx0ID0gY21kOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgUHlBcmVuYSAqYXJlbmE7CisgICAgICAgICAgICBtb2RfdHkgbW9kOwogCi0JCQlhcmVuYSA9IFB5QXJlbmFfTmV3KCk7Ci0JCQltb2QgPSBQeUFTVF9vYmoybW9kKGNtZCwgYXJlbmEsIG1vZGUpOwotCQkJaWYgKG1vZCA9PSBOVUxMKSB7Ci0JCQkJUHlBcmVuYV9GcmVlKGFyZW5hKTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJCXJlc3VsdCA9IChQeU9iamVjdCopUHlBU1RfQ29tcGlsZShtb2QsIGZpbGVuYW1lLAotCQkJCQkJCSAgJmNmLCBhcmVuYSk7Ci0JCQlQeUFyZW5hX0ZyZWUoYXJlbmEpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQorICAgICAgICAgICAgYXJlbmEgPSBQeUFyZW5hX05ldygpOworICAgICAgICAgICAgbW9kID0gUHlBU1Rfb2JqMm1vZChjbWQsIGFyZW5hLCBtb2RlKTsKKyAgICAgICAgICAgIGlmIChtb2QgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5QXJlbmFfRnJlZShhcmVuYSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXN1bHQgPSAoUHlPYmplY3QqKVB5QVNUX0NvbXBpbGUobW9kLCBmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2YsIGFyZW5hKTsKKyAgICAgICAgICAgIFB5QXJlbmFfRnJlZShhcmVuYSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CiAKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JaWYgKFB5VW5pY29kZV9DaGVjayhjbWQpKSB7Ci0JCXRtcCA9IFB5VW5pY29kZV9Bc1VURjhTdHJpbmcoY21kKTsKLQkJaWYgKHRtcCA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWNtZCA9IHRtcDsKLQkJY2YuY2ZfZmxhZ3MgfD0gUHlDRl9TT1VSQ0VfSVNfVVRGODsKLQl9CisgICAgaWYgKFB5VW5pY29kZV9DaGVjayhjbWQpKSB7CisgICAgICAgIHRtcCA9IFB5VW5pY29kZV9Bc1VURjhTdHJpbmcoY21kKTsKKyAgICAgICAgaWYgKHRtcCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGNtZCA9IHRtcDsKKyAgICAgICAgY2YuY2ZfZmxhZ3MgfD0gUHlDRl9TT1VSQ0VfSVNfVVRGODsKKyAgICB9CiAjZW5kaWYKIAotCWlmIChQeU9iamVjdF9Bc1JlYWRCdWZmZXIoY21kLCAoY29uc3Qgdm9pZCAqKikmc3RyLCAmbGVuZ3RoKSkKLQkJZ290byBjbGVhbnVwOwotCWlmICgoc2l6ZV90KWxlbmd0aCAhPSBzdHJsZW4oc3RyKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJjb21waWxlKCkgZXhwZWN0ZWQgc3RyaW5nIHdpdGhvdXQgbnVsbCBieXRlcyIpOwotCQlnb3RvIGNsZWFudXA7Ci0JfQotCXJlc3VsdCA9IFB5X0NvbXBpbGVTdHJpbmdGbGFncyhzdHIsIGZpbGVuYW1lLCBzdGFydFttb2RlXSwgJmNmKTsKKyAgICBpZiAoUHlPYmplY3RfQXNSZWFkQnVmZmVyKGNtZCwgKGNvbnN0IHZvaWQgKiopJnN0ciwgJmxlbmd0aCkpCisgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICBpZiAoKHNpemVfdClsZW5ndGggIT0gc3RybGVuKHN0cikpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjb21waWxlKCkgZXhwZWN0ZWQgc3RyaW5nIHdpdGhvdXQgbnVsbCBieXRlcyIpOworICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgfQorICAgIHJlc3VsdCA9IFB5X0NvbXBpbGVTdHJpbmdGbGFncyhzdHIsIGZpbGVuYW1lLCBzdGFydFttb2RlXSwgJmNmKTsKIGNsZWFudXA6Ci0JUHlfWERFQ1JFRih0bXApOwotCXJldHVybiByZXN1bHQ7CisgICAgUHlfWERFQ1JFRih0bXApOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIFB5RG9jX1NUUlZBUihjb21waWxlX2RvYywKQEAgLTU3MSwxMSArNTcxLDExIEBACiBzdGF0aWMgUHlPYmplY3QgKgogYnVpbHRpbl9kaXIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICphcmcgPSBOVUxMOworICAgIFB5T2JqZWN0ICphcmcgPSBOVUxMOwogCi0JaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiZGlyIiwgMCwgMSwgJmFyZykpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBQeU9iamVjdF9EaXIoYXJnKTsKKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJkaXIiLCAwLCAxLCAmYXJnKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFB5T2JqZWN0X0RpcihhcmcpOwogfQogCiBQeURvY19TVFJWQVIoZGlyX2RvYywKQEAgLTU5NSwxMSArNTk1LDExIEBACiBzdGF0aWMgUHlPYmplY3QgKgogYnVpbHRpbl9kaXZtb2QoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICp2LCAqdzsKKyAgICBQeU9iamVjdCAqdiwgKnc7CiAKLQlpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJkaXZtb2QiLCAyLCAyLCAmdiwgJncpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gUHlOdW1iZXJfRGl2bW9kKHYsIHcpOworICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImRpdm1vZCIsIDIsIDIsICZ2LCAmdykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeU51bWJlcl9EaXZtb2Qodiwgdyk7CiB9CiAKIFB5RG9jX1NUUlZBUihkaXZtb2RfZG9jLApAQCAtNjExLDgxICs2MTEsODEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBidWlsdGluX2V2YWwoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICpjbWQsICpyZXN1bHQsICp0bXAgPSBOVUxMOwotCVB5T2JqZWN0ICpnbG9iYWxzID0gUHlfTm9uZSwgKmxvY2FscyA9IFB5X05vbmU7Ci0JY2hhciAqc3RyOwotCVB5Q29tcGlsZXJGbGFncyBjZjsKKyAgICBQeU9iamVjdCAqY21kLCAqcmVzdWx0LCAqdG1wID0gTlVMTDsKKyAgICBQeU9iamVjdCAqZ2xvYmFscyA9IFB5X05vbmUsICpsb2NhbHMgPSBQeV9Ob25lOworICAgIGNoYXIgKnN0cjsKKyAgICBQeUNvbXBpbGVyRmxhZ3MgY2Y7CiAKLQlpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJldmFsIiwgMSwgMywgJmNtZCwgJmdsb2JhbHMsICZsb2NhbHMpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAobG9jYWxzICE9IFB5X05vbmUgJiYgIVB5TWFwcGluZ19DaGVjayhsb2NhbHMpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJsb2NhbHMgbXVzdCBiZSBhIG1hcHBpbmciKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChnbG9iYWxzICE9IFB5X05vbmUgJiYgIVB5RGljdF9DaGVjayhnbG9iYWxzKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCBQeU1hcHBpbmdfQ2hlY2soZ2xvYmFscykgPwotCQkJImdsb2JhbHMgbXVzdCBiZSBhIHJlYWwgZGljdDsgdHJ5IGV2YWwoZXhwciwge30sIG1hcHBpbmcpIgotCQkJOiAiZ2xvYmFscyBtdXN0IGJlIGEgZGljdCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKGdsb2JhbHMgPT0gUHlfTm9uZSkgewotCQlnbG9iYWxzID0gUHlFdmFsX0dldEdsb2JhbHMoKTsKLQkJaWYgKGxvY2FscyA9PSBQeV9Ob25lKQotCQkJbG9jYWxzID0gUHlFdmFsX0dldExvY2FscygpOwotCX0KLQllbHNlIGlmIChsb2NhbHMgPT0gUHlfTm9uZSkKLQkJbG9jYWxzID0gZ2xvYmFsczsKKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJldmFsIiwgMSwgMywgJmNtZCwgJmdsb2JhbHMsICZsb2NhbHMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAobG9jYWxzICE9IFB5X05vbmUgJiYgIVB5TWFwcGluZ19DaGVjayhsb2NhbHMpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJsb2NhbHMgbXVzdCBiZSBhIG1hcHBpbmciKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChnbG9iYWxzICE9IFB5X05vbmUgJiYgIVB5RGljdF9DaGVjayhnbG9iYWxzKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCBQeU1hcHBpbmdfQ2hlY2soZ2xvYmFscykgPworICAgICAgICAgICAgImdsb2JhbHMgbXVzdCBiZSBhIHJlYWwgZGljdDsgdHJ5IGV2YWwoZXhwciwge30sIG1hcHBpbmcpIgorICAgICAgICAgICAgOiAiZ2xvYmFscyBtdXN0IGJlIGEgZGljdCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKGdsb2JhbHMgPT0gUHlfTm9uZSkgeworICAgICAgICBnbG9iYWxzID0gUHlFdmFsX0dldEdsb2JhbHMoKTsKKyAgICAgICAgaWYgKGxvY2FscyA9PSBQeV9Ob25lKQorICAgICAgICAgICAgbG9jYWxzID0gUHlFdmFsX0dldExvY2FscygpOworICAgIH0KKyAgICBlbHNlIGlmIChsb2NhbHMgPT0gUHlfTm9uZSkKKyAgICAgICAgbG9jYWxzID0gZ2xvYmFsczsKIAotCWlmIChnbG9iYWxzID09IE5VTEwgfHwgbG9jYWxzID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgCi0JCQkiZXZhbCBtdXN0IGJlIGdpdmVuIGdsb2JhbHMgYW5kIGxvY2FscyAiCi0JCQkid2hlbiBjYWxsZWQgd2l0aG91dCBhIGZyYW1lIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoZ2xvYmFscyA9PSBOVUxMIHx8IGxvY2FscyA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAiZXZhbCBtdXN0IGJlIGdpdmVuIGdsb2JhbHMgYW5kIGxvY2FscyAiCisgICAgICAgICAgICAid2hlbiBjYWxsZWQgd2l0aG91dCBhIGZyYW1lIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWlmIChQeURpY3RfR2V0SXRlbVN0cmluZyhnbG9iYWxzLCAiX19idWlsdGluc19fIikgPT0gTlVMTCkgewotCQlpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZ2xvYmFscywgIl9fYnVpbHRpbnNfXyIsCi0JCQkJCSBQeUV2YWxfR2V0QnVpbHRpbnMoKSkgIT0gMCkKLQkJCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoUHlEaWN0X0dldEl0ZW1TdHJpbmcoZ2xvYmFscywgIl9fYnVpbHRpbnNfXyIpID09IE5VTEwpIHsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGdsb2JhbHMsICJfX2J1aWx0aW5zX18iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlFdmFsX0dldEJ1aWx0aW5zKCkpICE9IDApCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlpZiAoUHlDb2RlX0NoZWNrKGNtZCkpIHsKLQkJaWYgKFB5Q29kZV9HZXROdW1GcmVlKChQeUNvZGVPYmplY3QgKiljbWQpID4gMCkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJImNvZGUgb2JqZWN0IHBhc3NlZCB0byBldmFsKCkgbWF5IG5vdCBjb250YWluIGZyZWUgdmFyaWFibGVzIik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlyZXR1cm4gUHlFdmFsX0V2YWxDb2RlKChQeUNvZGVPYmplY3QgKikgY21kLCBnbG9iYWxzLCBsb2NhbHMpOwotCX0KKyAgICBpZiAoUHlDb2RlX0NoZWNrKGNtZCkpIHsKKyAgICAgICAgaWYgKFB5Q29kZV9HZXROdW1GcmVlKChQeUNvZGVPYmplY3QgKiljbWQpID4gMCkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgImNvZGUgb2JqZWN0IHBhc3NlZCB0byBldmFsKCkgbWF5IG5vdCBjb250YWluIGZyZWUgdmFyaWFibGVzIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gUHlFdmFsX0V2YWxDb2RlKChQeUNvZGVPYmplY3QgKikgY21kLCBnbG9iYWxzLCBsb2NhbHMpOworICAgIH0KIAotCWlmICghUHlTdHJpbmdfQ2hlY2soY21kKSAmJgotCSAgICAhUHlVbmljb2RlX0NoZWNrKGNtZCkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICJldmFsKCkgYXJnIDEgbXVzdCBiZSBhIHN0cmluZyBvciBjb2RlIG9iamVjdCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JY2YuY2ZfZmxhZ3MgPSAwOworICAgIGlmICghUHlTdHJpbmdfQ2hlY2soY21kKSAmJgorICAgICAgICAhUHlVbmljb2RlX0NoZWNrKGNtZCkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAiZXZhbCgpIGFyZyAxIG11c3QgYmUgYSBzdHJpbmcgb3IgY29kZSBvYmplY3QiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGNmLmNmX2ZsYWdzID0gMDsKIAogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQlpZiAoUHlVbmljb2RlX0NoZWNrKGNtZCkpIHsKLQkJdG1wID0gUHlVbmljb2RlX0FzVVRGOFN0cmluZyhjbWQpOwotCQlpZiAodG1wID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQkJY21kID0gdG1wOwotCQljZi5jZl9mbGFncyB8PSBQeUNGX1NPVVJDRV9JU19VVEY4OwotCX0KKyAgICBpZiAoUHlVbmljb2RlX0NoZWNrKGNtZCkpIHsKKyAgICAgICAgdG1wID0gUHlVbmljb2RlX0FzVVRGOFN0cmluZyhjbWQpOworICAgICAgICBpZiAodG1wID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgY21kID0gdG1wOworICAgICAgICBjZi5jZl9mbGFncyB8PSBQeUNGX1NPVVJDRV9JU19VVEY4OworICAgIH0KICNlbmRpZgotCWlmIChQeVN0cmluZ19Bc1N0cmluZ0FuZFNpemUoY21kLCAmc3RyLCBOVUxMKSkgewotCQlQeV9YREVDUkVGKHRtcCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQl3aGlsZSAoKnN0ciA9PSAnICcgfHwgKnN0ciA9PSAnXHQnKQotCQlzdHIrKzsKKyAgICBpZiAoUHlTdHJpbmdfQXNTdHJpbmdBbmRTaXplKGNtZCwgJnN0ciwgTlVMTCkpIHsKKyAgICAgICAgUHlfWERFQ1JFRih0bXApOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgd2hpbGUgKCpzdHIgPT0gJyAnIHx8ICpzdHIgPT0gJ1x0JykKKyAgICAgICAgc3RyKys7CiAKLQkodm9pZClQeUV2YWxfTWVyZ2VDb21waWxlckZsYWdzKCZjZik7Ci0JcmVzdWx0ID0gUHlSdW5fU3RyaW5nRmxhZ3Moc3RyLCBQeV9ldmFsX2lucHV0LCBnbG9iYWxzLCBsb2NhbHMsICZjZik7Ci0JUHlfWERFQ1JFRih0bXApOwotCXJldHVybiByZXN1bHQ7CisgICAgKHZvaWQpUHlFdmFsX01lcmdlQ29tcGlsZXJGbGFncygmY2YpOworICAgIHJlc3VsdCA9IFB5UnVuX1N0cmluZ0ZsYWdzKHN0ciwgUHlfZXZhbF9pbnB1dCwgZ2xvYmFscywgbG9jYWxzLCAmY2YpOworICAgIFB5X1hERUNSRUYodG1wKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBQeURvY19TVFJWQVIoZXZhbF9kb2MsCkBAIC03MDIsOTggKzcwMiw5OCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGJ1aWx0aW5fZXhlY2ZpbGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKmZpbGVuYW1lOwotCVB5T2JqZWN0ICpnbG9iYWxzID0gUHlfTm9uZSwgKmxvY2FscyA9IFB5X05vbmU7Ci0JUHlPYmplY3QgKnJlczsKLQlGSUxFKiBmcCA9IE5VTEw7Ci0JUHlDb21waWxlckZsYWdzIGNmOwotCWludCBleGlzdHM7CisgICAgY2hhciAqZmlsZW5hbWU7CisgICAgUHlPYmplY3QgKmdsb2JhbHMgPSBQeV9Ob25lLCAqbG9jYWxzID0gUHlfTm9uZTsKKyAgICBQeU9iamVjdCAqcmVzOworICAgIEZJTEUqIGZwID0gTlVMTDsKKyAgICBQeUNvbXBpbGVyRmxhZ3MgY2Y7CisgICAgaW50IGV4aXN0czsKIAotCWlmIChQeUVycl9XYXJuUHkzaygiZXhlY2ZpbGUoKSBub3Qgc3VwcG9ydGVkIGluIDMueDsgdXNlIGV4ZWMoKSIsCi0JCQkgICAxKSA8IDApCi0JCXJldHVybiBOVUxMOworICAgIGlmIChQeUVycl9XYXJuUHkzaygiZXhlY2ZpbGUoKSBub3Qgc3VwcG9ydGVkIGluIDMueDsgdXNlIGV4ZWMoKSIsCisgICAgICAgICAgICAgICAgICAgICAgIDEpIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInN8TyFPOmV4ZWNmaWxlIiwKLQkJCSZmaWxlbmFtZSwKLQkJCSZQeURpY3RfVHlwZSwgJmdsb2JhbHMsCi0JCQkmbG9jYWxzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKGxvY2FscyAhPSBQeV9Ob25lICYmICFQeU1hcHBpbmdfQ2hlY2sobG9jYWxzKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAibG9jYWxzIG11c3QgYmUgYSBtYXBwaW5nIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoZ2xvYmFscyA9PSBQeV9Ob25lKSB7Ci0JCWdsb2JhbHMgPSBQeUV2YWxfR2V0R2xvYmFscygpOwotCQlpZiAobG9jYWxzID09IFB5X05vbmUpCi0JCQlsb2NhbHMgPSBQeUV2YWxfR2V0TG9jYWxzKCk7Ci0JfQotCWVsc2UgaWYgKGxvY2FscyA9PSBQeV9Ob25lKQotCQlsb2NhbHMgPSBnbG9iYWxzOwotCWlmIChQeURpY3RfR2V0SXRlbVN0cmluZyhnbG9iYWxzLCAiX19idWlsdGluc19fIikgPT0gTlVMTCkgewotCQlpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZ2xvYmFscywgIl9fYnVpbHRpbnNfXyIsCi0JCQkJCSBQeUV2YWxfR2V0QnVpbHRpbnMoKSkgIT0gMCkKLQkJCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInN8TyFPOmV4ZWNmaWxlIiwKKyAgICAgICAgICAgICAgICAgICAgJmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAmUHlEaWN0X1R5cGUsICZnbG9iYWxzLAorICAgICAgICAgICAgICAgICAgICAmbG9jYWxzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKGxvY2FscyAhPSBQeV9Ob25lICYmICFQeU1hcHBpbmdfQ2hlY2sobG9jYWxzKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAibG9jYWxzIG11c3QgYmUgYSBtYXBwaW5nIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoZ2xvYmFscyA9PSBQeV9Ob25lKSB7CisgICAgICAgIGdsb2JhbHMgPSBQeUV2YWxfR2V0R2xvYmFscygpOworICAgICAgICBpZiAobG9jYWxzID09IFB5X05vbmUpCisgICAgICAgICAgICBsb2NhbHMgPSBQeUV2YWxfR2V0TG9jYWxzKCk7CisgICAgfQorICAgIGVsc2UgaWYgKGxvY2FscyA9PSBQeV9Ob25lKQorICAgICAgICBsb2NhbHMgPSBnbG9iYWxzOworICAgIGlmIChQeURpY3RfR2V0SXRlbVN0cmluZyhnbG9iYWxzLCAiX19idWlsdGluc19fIikgPT0gTlVMTCkgeworICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZ2xvYmFscywgIl9fYnVpbHRpbnNfXyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUV2YWxfR2V0QnVpbHRpbnMoKSkgIT0gMCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWV4aXN0cyA9IDA7Ci0JLyogVGVzdCBmb3IgZXhpc3RlbmNlIG9yIGRpcmVjdG9yeS4gKi8KKyAgICBleGlzdHMgPSAwOworICAgIC8qIFRlc3QgZm9yIGV4aXN0ZW5jZSBvciBkaXJlY3RvcnkuICovCiAjaWYgZGVmaW5lZChQTEFOOSkKLQl7Ci0JCURpciAqZDsKKyAgICB7CisgICAgICAgIERpciAqZDsKIAotCQlpZiAoKGQgPSBkaXJzdGF0KGZpbGVuYW1lKSkhPW5pbCkgewotCQkJaWYoZC0+bW9kZSAmIERNRElSKQotCQkJCXdlcnJzdHIoImlzIGEgZGlyZWN0b3J5Iik7Ci0JCQllbHNlCi0JCQkJZXhpc3RzID0gMTsKLQkJCWZyZWUoZCk7Ci0JCX0KLQl9CisgICAgICAgIGlmICgoZCA9IGRpcnN0YXQoZmlsZW5hbWUpKSE9bmlsKSB7CisgICAgICAgICAgICBpZihkLT5tb2RlICYgRE1ESVIpCisgICAgICAgICAgICAgICAgd2VycnN0cigiaXMgYSBkaXJlY3RvcnkiKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBleGlzdHMgPSAxOworICAgICAgICAgICAgZnJlZShkKTsKKyAgICAgICAgfQorICAgIH0KICNlbGlmIGRlZmluZWQoUklTQ09TKQotCWlmIChvYmplY3RfZXhpc3RzKGZpbGVuYW1lKSkgewotCQlpZiAoaXNkaXIoZmlsZW5hbWUpKQotCQkJZXJybm8gPSBFSVNESVI7Ci0JCWVsc2UKLQkJCWV4aXN0cyA9IDE7Ci0JfQotI2Vsc2UJLyogc3RhbmRhcmQgUG9zaXggKi8KLQl7Ci0JCXN0cnVjdCBzdGF0IHM7Ci0JCWlmIChzdGF0KGZpbGVuYW1lLCAmcykgPT0gMCkgewotCQkJaWYgKFNfSVNESVIocy5zdF9tb2RlKSkKLSMJCQkJaWYgZGVmaW5lZChQWU9TX09TMikgJiYgZGVmaW5lZChQWUNDX1ZBQ1BQKQotCQkJCQllcnJubyA9IEVPUzJFUlI7Ci0jCQkJCWVsc2UKLQkJCQkJZXJybm8gPSBFSVNESVI7Ci0jCQkJCWVuZGlmCi0JCQllbHNlCi0JCQkJZXhpc3RzID0gMTsKLQkJfQotCX0KKyAgICBpZiAob2JqZWN0X2V4aXN0cyhmaWxlbmFtZSkpIHsKKyAgICAgICAgaWYgKGlzZGlyKGZpbGVuYW1lKSkKKyAgICAgICAgICAgIGVycm5vID0gRUlTRElSOworICAgICAgICBlbHNlCisgICAgICAgICAgICBleGlzdHMgPSAxOworICAgIH0KKyNlbHNlICAgLyogc3RhbmRhcmQgUG9zaXggKi8KKyAgICB7CisgICAgICAgIHN0cnVjdCBzdGF0IHM7CisgICAgICAgIGlmIChzdGF0KGZpbGVuYW1lLCAmcykgPT0gMCkgeworICAgICAgICAgICAgaWYgKFNfSVNESVIocy5zdF9tb2RlKSkKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgZGVmaW5lZChQWU9TX09TMikgJiYgZGVmaW5lZChQWUNDX1ZBQ1BQKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vID0gRU9TMkVSUjsKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vID0gRUlTRElSOworIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRpZgorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGV4aXN0cyA9IDE7CisgICAgICAgIH0KKyAgICB9CiAjZW5kaWYKIAotICAgICAgICBpZiAoZXhpc3RzKSB7Ci0JCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQkJZnAgPSBmb3BlbihmaWxlbmFtZSwgInIiIFBZX1NURElPVEVYVE1PREUpOwotCQlQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIGlmIChleGlzdHMpIHsKKyAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICBmcCA9IGZvcGVuKGZpbGVuYW1lLCAiciIgUFlfU1RESU9URVhUTU9ERSk7CisgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCiAKLQkJaWYgKGZwID09IE5VTEwpIHsKLQkJCWV4aXN0cyA9IDA7Ci0JCX0KKyAgICAgICAgaWYgKGZwID09IE5VTEwpIHsKKyAgICAgICAgICAgIGV4aXN0cyA9IDA7CiAgICAgICAgIH0KKyAgICB9CiAKLQlpZiAoIWV4aXN0cykgewotCQlQeUVycl9TZXRGcm9tRXJybm9XaXRoRmlsZW5hbWUoUHlFeGNfSU9FcnJvciwgZmlsZW5hbWUpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JY2YuY2ZfZmxhZ3MgPSAwOwotCWlmIChQeUV2YWxfTWVyZ2VDb21waWxlckZsYWdzKCZjZikpCi0JCXJlcyA9IFB5UnVuX0ZpbGVFeEZsYWdzKGZwLCBmaWxlbmFtZSwgUHlfZmlsZV9pbnB1dCwgZ2xvYmFscywKLQkJCQkgICBsb2NhbHMsIDEsICZjZik7Ci0JZWxzZQotCQlyZXMgPSBQeVJ1bl9GaWxlRXgoZnAsIGZpbGVuYW1lLCBQeV9maWxlX2lucHV0LCBnbG9iYWxzLAotCQkJCSAgIGxvY2FscywgMSk7Ci0JcmV0dXJuIHJlczsKKyAgICBpZiAoIWV4aXN0cykgeworICAgICAgICBQeUVycl9TZXRGcm9tRXJybm9XaXRoRmlsZW5hbWUoUHlFeGNfSU9FcnJvciwgZmlsZW5hbWUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgY2YuY2ZfZmxhZ3MgPSAwOworICAgIGlmIChQeUV2YWxfTWVyZ2VDb21waWxlckZsYWdzKCZjZikpCisgICAgICAgIHJlcyA9IFB5UnVuX0ZpbGVFeEZsYWdzKGZwLCBmaWxlbmFtZSwgUHlfZmlsZV9pbnB1dCwgZ2xvYmFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FscywgMSwgJmNmKTsKKyAgICBlbHNlCisgICAgICAgIHJlcyA9IFB5UnVuX0ZpbGVFeChmcCwgZmlsZW5hbWUsIFB5X2ZpbGVfaW5wdXQsIGdsb2JhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbHMsIDEpOworICAgIHJldHVybiByZXM7CiB9CiAKIFB5RG9jX1NUUlZBUihleGVjZmlsZV9kb2MsCkBAIC04MDcsMzMgKzgwNywzMyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGJ1aWx0aW5fZ2V0YXR0cihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKnYsICpyZXN1bHQsICpkZmx0ID0gTlVMTDsKLQlQeU9iamVjdCAqbmFtZTsKKyAgICBQeU9iamVjdCAqdiwgKnJlc3VsdCwgKmRmbHQgPSBOVUxMOworICAgIFB5T2JqZWN0ICpuYW1lOwogCi0JaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiZ2V0YXR0ciIsIDIsIDMsICZ2LCAmbmFtZSwgJmRmbHQpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJnZXRhdHRyIiwgMiwgMywgJnYsICZuYW1lLCAmZGZsdCkpCisgICAgICAgIHJldHVybiBOVUxMOwogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQlpZiAoUHlVbmljb2RlX0NoZWNrKG5hbWUpKSB7Ci0JCW5hbWUgPSBfUHlVbmljb2RlX0FzRGVmYXVsdEVuY29kZWRTdHJpbmcobmFtZSwgTlVMTCk7Ci0JCWlmIChuYW1lID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKFB5VW5pY29kZV9DaGVjayhuYW1lKSkgeworICAgICAgICBuYW1lID0gX1B5VW5pY29kZV9Bc0RlZmF1bHRFbmNvZGVkU3RyaW5nKG5hbWUsIE5VTEwpOworICAgICAgICBpZiAobmFtZSA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogI2VuZGlmCiAKLQlpZiAoIVB5U3RyaW5nX0NoZWNrKG5hbWUpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJImdldGF0dHIoKTogYXR0cmlidXRlIG5hbWUgbXVzdCBiZSBzdHJpbmciKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJlc3VsdCA9IFB5T2JqZWN0X0dldEF0dHIodiwgbmFtZSk7Ci0JaWYgKHJlc3VsdCA9PSBOVUxMICYmIGRmbHQgIT0gTlVMTCAmJgotCSAgICBQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkKLQl7Ci0JCVB5RXJyX0NsZWFyKCk7Ci0JCVB5X0lOQ1JFRihkZmx0KTsKLQkJcmVzdWx0ID0gZGZsdDsKLQl9Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBpZiAoIVB5U3RyaW5nX0NoZWNrKG5hbWUpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiZ2V0YXR0cigpOiBhdHRyaWJ1dGUgbmFtZSBtdXN0IGJlIHN0cmluZyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmVzdWx0ID0gUHlPYmplY3RfR2V0QXR0cih2LCBuYW1lKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwgJiYgZGZsdCAhPSBOVUxMICYmCisgICAgICAgIFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfQXR0cmlidXRlRXJyb3IpKQorICAgIHsKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgUHlfSU5DUkVGKGRmbHQpOworICAgICAgICByZXN1bHQgPSBkZmx0OworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBQeURvY19TVFJWQVIoZ2V0YXR0cl9kb2MsCkBAIC04NDcsMTEgKzg0NywxMSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGJ1aWx0aW5fZ2xvYmFscyhQeU9iamVjdCAqc2VsZikKIHsKLQlQeU9iamVjdCAqZDsKKyAgICBQeU9iamVjdCAqZDsKIAotCWQgPSBQeUV2YWxfR2V0R2xvYmFscygpOwotCVB5X1hJTkNSRUYoZCk7Ci0JcmV0dXJuIGQ7CisgICAgZCA9IFB5RXZhbF9HZXRHbG9iYWxzKCk7CisgICAgUHlfWElOQ1JFRihkKTsKKyAgICByZXR1cm4gZDsKIH0KIAogUHlEb2NfU1RSVkFSKGdsb2JhbHNfZG9jLApAQCAtODYzLDM3ICs4NjMsMzcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBidWlsdGluX2hhc2F0dHIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICp2OwotCVB5T2JqZWN0ICpuYW1lOworICAgIFB5T2JqZWN0ICp2OworICAgIFB5T2JqZWN0ICpuYW1lOwogCi0JaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiaGFzYXR0ciIsIDIsIDIsICZ2LCAmbmFtZSkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImhhc2F0dHIiLCAyLCAyLCAmdiwgJm5hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JaWYgKFB5VW5pY29kZV9DaGVjayhuYW1lKSkgewotCQluYW1lID0gX1B5VW5pY29kZV9Bc0RlZmF1bHRFbmNvZGVkU3RyaW5nKG5hbWUsIE5VTEwpOwotCQlpZiAobmFtZSA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChQeVVuaWNvZGVfQ2hlY2sobmFtZSkpIHsKKyAgICAgICAgbmFtZSA9IF9QeVVuaWNvZGVfQXNEZWZhdWx0RW5jb2RlZFN0cmluZyhuYW1lLCBOVUxMKTsKKyAgICAgICAgaWYgKG5hbWUgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KICNlbmRpZgogCi0JaWYgKCFQeVN0cmluZ19DaGVjayhuYW1lKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJoYXNhdHRyKCk6IGF0dHJpYnV0ZSBuYW1lIG11c3QgYmUgc3RyaW5nIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQl2ID0gUHlPYmplY3RfR2V0QXR0cih2LCBuYW1lKTsKLQlpZiAodiA9PSBOVUxMKSB7Ci0JCWlmICghUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19FeGNlcHRpb24pKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWVsc2UgewotCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCVB5X0lOQ1JFRihQeV9GYWxzZSk7Ci0JCQlyZXR1cm4gUHlfRmFsc2U7Ci0JCX0KLQl9Ci0JUHlfREVDUkVGKHYpOwotCVB5X0lOQ1JFRihQeV9UcnVlKTsKLQlyZXR1cm4gUHlfVHJ1ZTsKKyAgICBpZiAoIVB5U3RyaW5nX0NoZWNrKG5hbWUpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiaGFzYXR0cigpOiBhdHRyaWJ1dGUgbmFtZSBtdXN0IGJlIHN0cmluZyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgdiA9IFB5T2JqZWN0X0dldEF0dHIodiwgbmFtZSk7CisgICAgaWYgKHYgPT0gTlVMTCkgeworICAgICAgICBpZiAoIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfRXhjZXB0aW9uKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICBQeV9JTkNSRUYoUHlfRmFsc2UpOworICAgICAgICAgICAgcmV0dXJuIFB5X0ZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIFB5X0RFQ1JFRih2KTsKKyAgICBQeV9JTkNSRUYoUHlfVHJ1ZSk7CisgICAgcmV0dXJuIFB5X1RydWU7CiB9CiAKIFB5RG9jX1NUUlZBUihoYXNhdHRyX2RvYywKQEAgLTkwNiw3ICs5MDYsNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGJ1aWx0aW5faWQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp2KQogewotCXJldHVybiBQeUxvbmdfRnJvbVZvaWRQdHIodik7CisgICAgcmV0dXJuIFB5TG9uZ19Gcm9tVm9pZFB0cih2KTsKIH0KIAogUHlEb2NfU1RSVkFSKGlkX2RvYywKQEAgLTkxOSwxNTQgKzkxOSwxNTQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBidWlsdGluX21hcChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JdHlwZWRlZiBzdHJ1Y3QgewotCQlQeU9iamVjdCAqaXQ7CS8qIHRoZSBpdGVyYXRvciBvYmplY3QgKi8KLQkJaW50IHNhd19TdG9wSXRlcmF0aW9uOyAgLyogYm9vbDogIGRpZCB0aGUgaXRlcmF0b3IgZW5kPyAqLwotCX0gc2VxdWVuY2U7CisgICAgdHlwZWRlZiBzdHJ1Y3QgeworICAgICAgICBQeU9iamVjdCAqaXQ7ICAgICAgICAgICAvKiB0aGUgaXRlcmF0b3Igb2JqZWN0ICovCisgICAgICAgIGludCBzYXdfU3RvcEl0ZXJhdGlvbjsgIC8qIGJvb2w6ICBkaWQgdGhlIGl0ZXJhdG9yIGVuZD8gKi8KKyAgICB9IHNlcXVlbmNlOwogCi0JUHlPYmplY3QgKmZ1bmMsICpyZXN1bHQ7Ci0Jc2VxdWVuY2UgKnNlcXMgPSBOVUxMLCAqc3FwOwotCVB5X3NzaXplX3QgbiwgbGVuOwotCXJlZ2lzdGVyIGludCBpLCBqOworICAgIFB5T2JqZWN0ICpmdW5jLCAqcmVzdWx0OworICAgIHNlcXVlbmNlICpzZXFzID0gTlVMTCwgKnNxcDsKKyAgICBQeV9zc2l6ZV90IG4sIGxlbjsKKyAgICByZWdpc3RlciBpbnQgaSwgajsKIAotCW4gPSBQeVR1cGxlX1NpemUoYXJncyk7Ci0JaWYgKG4gPCAyKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJIm1hcCgpIHJlcXVpcmVzIGF0IGxlYXN0IHR3byBhcmdzIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBuID0gUHlUdXBsZV9TaXplKGFyZ3MpOworICAgIGlmIChuIDwgMikgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIm1hcCgpIHJlcXVpcmVzIGF0IGxlYXN0IHR3byBhcmdzIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWZ1bmMgPSBQeVR1cGxlX0dldEl0ZW0oYXJncywgMCk7Ci0Jbi0tOworICAgIGZ1bmMgPSBQeVR1cGxlX0dldEl0ZW0oYXJncywgMCk7CisgICAgbi0tOwogCi0JaWYgKGZ1bmMgPT0gUHlfTm9uZSkgewotCQlpZiAoUHlFcnJfV2FyblB5M2soIm1hcChOb25lLCAuLi4pIG5vdCBzdXBwb3J0ZWQgaW4gMy54OyAiCi0JCQkJICAgInVzZSBsaXN0KC4uLikiLCAxKSA8IDApCi0JCQlyZXR1cm4gTlVMTDsKLQkJaWYgKG4gPT0gMSkgewotCQkJLyogbWFwKE5vbmUsIFMpIGlzIHRoZSBzYW1lIGFzIGxpc3QoUykuICovCi0JCQlyZXR1cm4gUHlTZXF1ZW5jZV9MaXN0KFB5VHVwbGVfR2V0SXRlbShhcmdzLCAxKSk7Ci0JCX0KLQl9CisgICAgaWYgKGZ1bmMgPT0gUHlfTm9uZSkgeworICAgICAgICBpZiAoUHlFcnJfV2FyblB5M2soIm1hcChOb25lLCAuLi4pIG5vdCBzdXBwb3J0ZWQgaW4gMy54OyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNlIGxpc3QoLi4uKSIsIDEpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBpZiAobiA9PSAxKSB7CisgICAgICAgICAgICAvKiBtYXAoTm9uZSwgUykgaXMgdGhlIHNhbWUgYXMgbGlzdChTKS4gKi8KKyAgICAgICAgICAgIHJldHVybiBQeVNlcXVlbmNlX0xpc3QoUHlUdXBsZV9HZXRJdGVtKGFyZ3MsIDEpKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qIEdldCBzcGFjZSBmb3Igc2VxdWVuY2UgZGVzY3JpcHRvcnMuICBNdXN0IE5VTEwgb3V0IHRoZSBpdGVyYXRvcgotCSAqIHBvaW50ZXJzIHNvIHRoYXQganVtcGluZyB0byBGYWlsXzIgbGF0ZXIgZG9lc24ndCBzZWUgdHJhc2guCi0JICovCi0JaWYgKChzZXFzID0gUHlNZW1fTkVXKHNlcXVlbmNlLCBuKSkgPT0gTlVMTCkgewotCQlQeUVycl9Ob01lbW9yeSgpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZm9yIChpID0gMDsgaSA8IG47ICsraSkgewotCQlzZXFzW2ldLml0ID0gKFB5T2JqZWN0KilOVUxMOwotCQlzZXFzW2ldLnNhd19TdG9wSXRlcmF0aW9uID0gMDsKLQl9CisgICAgLyogR2V0IHNwYWNlIGZvciBzZXF1ZW5jZSBkZXNjcmlwdG9ycy4gIE11c3QgTlVMTCBvdXQgdGhlIGl0ZXJhdG9yCisgICAgICogcG9pbnRlcnMgc28gdGhhdCBqdW1waW5nIHRvIEZhaWxfMiBsYXRlciBkb2Vzbid0IHNlZSB0cmFzaC4KKyAgICAgKi8KKyAgICBpZiAoKHNlcXMgPSBQeU1lbV9ORVcoc2VxdWVuY2UsIG4pKSA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CisgICAgICAgIHNlcXNbaV0uaXQgPSAoUHlPYmplY3QqKU5VTEw7CisgICAgICAgIHNlcXNbaV0uc2F3X1N0b3BJdGVyYXRpb24gPSAwOworICAgIH0KIAotCS8qIERvIGEgZmlyc3QgcGFzcyB0byBvYnRhaW4gaXRlcmF0b3JzIGZvciB0aGUgYXJndW1lbnRzLCBhbmQgc2V0IGxlbgotCSAqIHRvIHRoZSBsYXJnZXN0IG9mIHRoZWlyIGxlbmd0aHMuCi0JICovCi0JbGVuID0gMDsKLQlmb3IgKGkgPSAwLCBzcXAgPSBzZXFzOyBpIDwgbjsgKytpLCArK3NxcCkgewotCQlQeU9iamVjdCAqY3Vyc2VxOwotCQlQeV9zc2l6ZV90IGN1cmxlbjsKKyAgICAvKiBEbyBhIGZpcnN0IHBhc3MgdG8gb2J0YWluIGl0ZXJhdG9ycyBmb3IgdGhlIGFyZ3VtZW50cywgYW5kIHNldCBsZW4KKyAgICAgKiB0byB0aGUgbGFyZ2VzdCBvZiB0aGVpciBsZW5ndGhzLgorICAgICAqLworICAgIGxlbiA9IDA7CisgICAgZm9yIChpID0gMCwgc3FwID0gc2VxczsgaSA8IG47ICsraSwgKytzcXApIHsKKyAgICAgICAgUHlPYmplY3QgKmN1cnNlcTsKKyAgICAgICAgUHlfc3NpemVfdCBjdXJsZW47CiAKLQkJLyogR2V0IGl0ZXJhdG9yLiAqLwotCQljdXJzZXEgPSBQeVR1cGxlX0dldEl0ZW0oYXJncywgaSsxKTsKLQkJc3FwLT5pdCA9IFB5T2JqZWN0X0dldEl0ZXIoY3Vyc2VxKTsKLQkJaWYgKHNxcC0+aXQgPT0gTlVMTCkgewotCQkJc3RhdGljIGNoYXIgZXJybXNnW10gPQotCQkJICAgICJhcmd1bWVudCAlZCB0byBtYXAoKSBtdXN0IHN1cHBvcnQgaXRlcmF0aW9uIjsKLQkJCWNoYXIgZXJyYnVmW3NpemVvZihlcnJtc2cpICsgMjVdOwotCQkJUHlPU19zbnByaW50ZihlcnJidWYsIHNpemVvZihlcnJidWYpLCBlcnJtc2csIGkrMik7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCBlcnJidWYpOwotCQkJZ290byBGYWlsXzI7Ci0JCX0KKyAgICAgICAgLyogR2V0IGl0ZXJhdG9yLiAqLworICAgICAgICBjdXJzZXEgPSBQeVR1cGxlX0dldEl0ZW0oYXJncywgaSsxKTsKKyAgICAgICAgc3FwLT5pdCA9IFB5T2JqZWN0X0dldEl0ZXIoY3Vyc2VxKTsKKyAgICAgICAgaWYgKHNxcC0+aXQgPT0gTlVMTCkgeworICAgICAgICAgICAgc3RhdGljIGNoYXIgZXJybXNnW10gPQorICAgICAgICAgICAgICAgICJhcmd1bWVudCAlZCB0byBtYXAoKSBtdXN0IHN1cHBvcnQgaXRlcmF0aW9uIjsKKyAgICAgICAgICAgIGNoYXIgZXJyYnVmW3NpemVvZihlcnJtc2cpICsgMjVdOworICAgICAgICAgICAgUHlPU19zbnByaW50ZihlcnJidWYsIHNpemVvZihlcnJidWYpLCBlcnJtc2csIGkrMik7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCBlcnJidWYpOworICAgICAgICAgICAgZ290byBGYWlsXzI7CisgICAgICAgIH0KIAotCQkvKiBVcGRhdGUgbGVuLiAqLwotCQljdXJsZW4gPSBfUHlPYmplY3RfTGVuZ3RoSGludChjdXJzZXEsIDgpOwotCQlpZiAoY3VybGVuID4gbGVuKQotCQkJbGVuID0gY3VybGVuOwotCX0KKyAgICAgICAgLyogVXBkYXRlIGxlbi4gKi8KKyAgICAgICAgY3VybGVuID0gX1B5T2JqZWN0X0xlbmd0aEhpbnQoY3Vyc2VxLCA4KTsKKyAgICAgICAgaWYgKGN1cmxlbiA+IGxlbikKKyAgICAgICAgICAgIGxlbiA9IGN1cmxlbjsKKyAgICB9CiAKLQkvKiBHZXQgc3BhY2UgZm9yIHRoZSByZXN1bHQgbGlzdC4gKi8KLQlpZiAoKHJlc3VsdCA9IChQeU9iamVjdCAqKSBQeUxpc3RfTmV3KGxlbikpID09IE5VTEwpCi0JCWdvdG8gRmFpbF8yOworICAgIC8qIEdldCBzcGFjZSBmb3IgdGhlIHJlc3VsdCBsaXN0LiAqLworICAgIGlmICgocmVzdWx0ID0gKFB5T2JqZWN0ICopIFB5TGlzdF9OZXcobGVuKSkgPT0gTlVMTCkKKyAgICAgICAgZ290byBGYWlsXzI7CiAKLQkvKiBJdGVyYXRlIG92ZXIgdGhlIHNlcXVlbmNlcyB1bnRpbCBhbGwgaGF2ZSBzdG9wcGVkLiAqLwotCWZvciAoaSA9IDA7IDsgKytpKSB7Ci0JCVB5T2JqZWN0ICphbGlzdCwgKml0ZW09TlVMTCwgKnZhbHVlOwotCQlpbnQgbnVtYWN0aXZlID0gMDsKKyAgICAvKiBJdGVyYXRlIG92ZXIgdGhlIHNlcXVlbmNlcyB1bnRpbCBhbGwgaGF2ZSBzdG9wcGVkLiAqLworICAgIGZvciAoaSA9IDA7IDsgKytpKSB7CisgICAgICAgIFB5T2JqZWN0ICphbGlzdCwgKml0ZW09TlVMTCwgKnZhbHVlOworICAgICAgICBpbnQgbnVtYWN0aXZlID0gMDsKIAotCQlpZiAoZnVuYyA9PSBQeV9Ob25lICYmIG4gPT0gMSkKLQkJCWFsaXN0ID0gTlVMTDsKLQkJZWxzZSBpZiAoKGFsaXN0ID0gUHlUdXBsZV9OZXcobikpID09IE5VTEwpCi0JCQlnb3RvIEZhaWxfMTsKKyAgICAgICAgaWYgKGZ1bmMgPT0gUHlfTm9uZSAmJiBuID09IDEpCisgICAgICAgICAgICBhbGlzdCA9IE5VTEw7CisgICAgICAgIGVsc2UgaWYgKChhbGlzdCA9IFB5VHVwbGVfTmV3KG4pKSA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBGYWlsXzE7CiAKLQkJZm9yIChqID0gMCwgc3FwID0gc2VxczsgaiA8IG47ICsraiwgKytzcXApIHsKLQkJCWlmIChzcXAtPnNhd19TdG9wSXRlcmF0aW9uKSB7Ci0JCQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQkJCWl0ZW0gPSBQeV9Ob25lOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaXRlbSA9IFB5SXRlcl9OZXh0KHNxcC0+aXQpOwotCQkJCWlmIChpdGVtKQotCQkJCQkrK251bWFjdGl2ZTsKLQkJCQllbHNlIHsKLQkJCQkJaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKLQkJCQkJCVB5X1hERUNSRUYoYWxpc3QpOwotCQkJCQkJZ290byBGYWlsXzE7Ci0JCQkJCX0KLQkJCQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQkJCQlpdGVtID0gUHlfTm9uZTsKLQkJCQkJc3FwLT5zYXdfU3RvcEl0ZXJhdGlvbiA9IDE7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGFsaXN0KQotCQkJCVB5VHVwbGVfU0VUX0lURU0oYWxpc3QsIGosIGl0ZW0pOwotCQkJZWxzZQotCQkJCWJyZWFrOwotCQl9CisgICAgICAgIGZvciAoaiA9IDAsIHNxcCA9IHNlcXM7IGogPCBuOyArK2osICsrc3FwKSB7CisgICAgICAgICAgICBpZiAoc3FwLT5zYXdfU3RvcEl0ZXJhdGlvbikgeworICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgICAgICAgICBpdGVtID0gUHlfTm9uZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGl0ZW0gPSBQeUl0ZXJfTmV4dChzcXAtPml0KTsKKyAgICAgICAgICAgICAgICBpZiAoaXRlbSkKKyAgICAgICAgICAgICAgICAgICAgKytudW1hY3RpdmU7CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBQeV9YREVDUkVGKGFsaXN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gRmFpbF8xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgICAgICAgICAgICAgaXRlbSA9IFB5X05vbmU7CisgICAgICAgICAgICAgICAgICAgIHNxcC0+c2F3X1N0b3BJdGVyYXRpb24gPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhbGlzdCkKKyAgICAgICAgICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKGFsaXN0LCBqLCBpdGVtKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogCi0JCWlmICghYWxpc3QpCi0JCQlhbGlzdCA9IGl0ZW07CisgICAgICAgIGlmICghYWxpc3QpCisgICAgICAgICAgICBhbGlzdCA9IGl0ZW07CiAKLQkJaWYgKG51bWFjdGl2ZSA9PSAwKSB7Ci0JCQlQeV9ERUNSRUYoYWxpc3QpOwotCQkJYnJlYWs7Ci0JCX0KKyAgICAgICAgaWYgKG51bWFjdGl2ZSA9PSAwKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoYWxpc3QpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KIAotCQlpZiAoZnVuYyA9PSBQeV9Ob25lKQotCQkJdmFsdWUgPSBhbGlzdDsKLQkJZWxzZSB7Ci0JCQl2YWx1ZSA9IFB5RXZhbF9DYWxsT2JqZWN0KGZ1bmMsIGFsaXN0KTsKLQkJCVB5X0RFQ1JFRihhbGlzdCk7Ci0JCQlpZiAodmFsdWUgPT0gTlVMTCkKLQkJCQlnb3RvIEZhaWxfMTsKLQkJfQotCQlpZiAoaSA+PSBsZW4pIHsKLQkJCWludCBzdGF0dXMgPSBQeUxpc3RfQXBwZW5kKHJlc3VsdCwgdmFsdWUpOwotCQkJUHlfREVDUkVGKHZhbHVlKTsKLQkJCWlmIChzdGF0dXMgPCAwKQotCQkJCWdvdG8gRmFpbF8xOwotCQl9Ci0JCWVsc2UgaWYgKFB5TGlzdF9TZXRJdGVtKHJlc3VsdCwgaSwgdmFsdWUpIDwgMCkKLQkJIAlnb3RvIEZhaWxfMTsKLQl9CisgICAgICAgIGlmIChmdW5jID09IFB5X05vbmUpCisgICAgICAgICAgICB2YWx1ZSA9IGFsaXN0OworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHZhbHVlID0gUHlFdmFsX0NhbGxPYmplY3QoZnVuYywgYWxpc3QpOworICAgICAgICAgICAgUHlfREVDUkVGKGFsaXN0KTsKKyAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGdvdG8gRmFpbF8xOworICAgICAgICB9CisgICAgICAgIGlmIChpID49IGxlbikgeworICAgICAgICAgICAgaW50IHN0YXR1cyA9IFB5TGlzdF9BcHBlbmQocmVzdWx0LCB2YWx1ZSk7CisgICAgICAgICAgICBQeV9ERUNSRUYodmFsdWUpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA8IDApCisgICAgICAgICAgICAgICAgZ290byBGYWlsXzE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoUHlMaXN0X1NldEl0ZW0ocmVzdWx0LCBpLCB2YWx1ZSkgPCAwKQorICAgICAgICAgICAgZ290byBGYWlsXzE7CisgICAgfQogCi0JaWYgKGkgPCBsZW4gJiYgUHlMaXN0X1NldFNsaWNlKHJlc3VsdCwgaSwgbGVuLCBOVUxMKSA8IDApCi0JCWdvdG8gRmFpbF8xOworICAgIGlmIChpIDwgbGVuICYmIFB5TGlzdF9TZXRTbGljZShyZXN1bHQsIGksIGxlbiwgTlVMTCkgPCAwKQorICAgICAgICBnb3RvIEZhaWxfMTsKIAotCWdvdG8gU3VjY2VlZDsKKyAgICBnb3RvIFN1Y2NlZWQ7CiAKIEZhaWxfMToKLQlQeV9ERUNSRUYocmVzdWx0KTsKKyAgICBQeV9ERUNSRUYocmVzdWx0KTsKIEZhaWxfMjoKLQlyZXN1bHQgPSBOVUxMOworICAgIHJlc3VsdCA9IE5VTEw7CiBTdWNjZWVkOgotCWFzc2VydChzZXFzKTsKLQlmb3IgKGkgPSAwOyBpIDwgbjsgKytpKQotCQlQeV9YREVDUkVGKHNlcXNbaV0uaXQpOwotCVB5TWVtX0RFTChzZXFzKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIGFzc2VydChzZXFzKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKQorICAgICAgICBQeV9YREVDUkVGKHNlcXNbaV0uaXQpOworICAgIFB5TWVtX0RFTChzZXFzKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBQeURvY19TVFJWQVIobWFwX2RvYywKQEAgLTEwODMsMzUgKzEwODMsMzUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBidWlsdGluX25leHQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICppdCwgKnJlczsKLQlQeU9iamVjdCAqZGVmID0gTlVMTDsKKyAgICBQeU9iamVjdCAqaXQsICpyZXM7CisgICAgUHlPYmplY3QgKmRlZiA9IE5VTEw7CiAKLQlpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJuZXh0IiwgMSwgMiwgJml0LCAmZGVmKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFQeUl0ZXJfQ2hlY2soaXQpKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkiJS4yMDBzIG9iamVjdCBpcyBub3QgYW4gaXRlcmF0b3IiLAotCQkJaXQtPm9iX3R5cGUtPnRwX25hbWUpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JCi0JcmVzID0gKCppdC0+b2JfdHlwZS0+dHBfaXRlcm5leHQpKGl0KTsKLQlpZiAocmVzICE9IE5VTEwpIHsKLQkJcmV0dXJuIHJlczsKLQl9IGVsc2UgaWYgKGRlZiAhPSBOVUxMKSB7Ci0JCWlmIChQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCQlpZiAoIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfU3RvcEl0ZXJhdGlvbikpCi0JCQkJcmV0dXJuIE5VTEw7Ci0JCQlQeUVycl9DbGVhcigpOwotCQl9Ci0JCVB5X0lOQ1JFRihkZWYpOwotCQlyZXR1cm4gZGVmOwotCX0gZWxzZSBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgewotCQlyZXR1cm4gTlVMTDsKLQl9IGVsc2UgewotCQlQeUVycl9TZXROb25lKFB5RXhjX1N0b3BJdGVyYXRpb24pOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAibmV4dCIsIDEsIDIsICZpdCwgJmRlZikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHlJdGVyX0NoZWNrKGl0KSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgIiUuMjAwcyBvYmplY3QgaXMgbm90IGFuIGl0ZXJhdG9yIiwKKyAgICAgICAgICAgIGl0LT5vYl90eXBlLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmVzID0gKCppdC0+b2JfdHlwZS0+dHBfaXRlcm5leHQpKGl0KTsKKyAgICBpZiAocmVzICE9IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9IGVsc2UgaWYgKGRlZiAhPSBOVUxMKSB7CisgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgICAgICBpZiAoIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfU3RvcEl0ZXJhdGlvbikpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICB9CisgICAgICAgIFB5X0lOQ1JFRihkZWYpOworICAgICAgICByZXR1cm4gZGVmOworICAgIH0gZWxzZSBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9IGVsc2UgeworICAgICAgICBQeUVycl9TZXROb25lKFB5RXhjX1N0b3BJdGVyYXRpb24pOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiB9CiAKIFB5RG9jX1NUUlZBUihuZXh0X2RvYywKQEAgLTExMjQsMTYgKzExMjQsMTYgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBidWlsdGluX3NldGF0dHIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICp2OwotCVB5T2JqZWN0ICpuYW1lOwotCVB5T2JqZWN0ICp2YWx1ZTsKKyAgICBQeU9iamVjdCAqdjsKKyAgICBQeU9iamVjdCAqbmFtZTsKKyAgICBQeU9iamVjdCAqdmFsdWU7CiAKLQlpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJzZXRhdHRyIiwgMywgMywgJnYsICZuYW1lLCAmdmFsdWUpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoUHlPYmplY3RfU2V0QXR0cih2LCBuYW1lLCB2YWx1ZSkgIT0gMCkKLQkJcmV0dXJuIE5VTEw7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInNldGF0dHIiLCAzLCAzLCAmdiwgJm5hbWUsICZ2YWx1ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChQeU9iamVjdF9TZXRBdHRyKHYsIG5hbWUsIHZhbHVlKSAhPSAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIFB5RG9jX1NUUlZBUihzZXRhdHRyX2RvYywKQEAgLTExNDYsMTUgKzExNDYsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBidWlsdGluX2RlbGF0dHIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICp2OwotCVB5T2JqZWN0ICpuYW1lOworICAgIFB5T2JqZWN0ICp2OworICAgIFB5T2JqZWN0ICpuYW1lOwogCi0JaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiZGVsYXR0ciIsIDIsIDIsICZ2LCAmbmFtZSkpCi0JCXJldHVybiBOVUxMOwotCWlmIChQeU9iamVjdF9TZXRBdHRyKHYsIG5hbWUsIChQeU9iamVjdCAqKU5VTEwpICE9IDApCi0JCXJldHVybiBOVUxMOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJkZWxhdHRyIiwgMiwgMiwgJnYsICZuYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKFB5T2JqZWN0X1NldEF0dHIodiwgbmFtZSwgKFB5T2JqZWN0ICopTlVMTCkgIT0gMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBQeURvY19TVFJWQVIoZGVsYXR0cl9kb2MsCkBAIC0xMTY3LDEyICsxMTY3LDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogYnVpbHRpbl9oYXNoKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdikKIHsKLQlsb25nIHg7CisgICAgbG9uZyB4OwogCi0JeCA9IFB5T2JqZWN0X0hhc2godik7Ci0JaWYgKHggPT0gLTEpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBQeUludF9Gcm9tTG9uZyh4KTsKKyAgICB4ID0gUHlPYmplY3RfSGFzaCh2KTsKKyAgICBpZiAoeCA9PSAtMSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHgpOwogfQogCiBQeURvY19TVFJWQVIoaGFzaF9kb2MsCkBAIC0xMTg1LDI0ICsxMTg1LDI0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYnVpbHRpbl9oZXgoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp2KQogewotCVB5TnVtYmVyTWV0aG9kcyAqbmI7Ci0JUHlPYmplY3QgKnJlczsKKyAgICBQeU51bWJlck1ldGhvZHMgKm5iOworICAgIFB5T2JqZWN0ICpyZXM7CiAKLQlpZiAoKG5iID0gdi0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyKSA9PSBOVUxMIHx8Ci0JICAgIG5iLT5uYl9oZXggPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJICAgImhleCgpIGFyZ3VtZW50IGNhbid0IGJlIGNvbnZlcnRlZCB0byBoZXgiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJlcyA9ICgqbmItPm5iX2hleCkodik7Ci0JaWYgKHJlcyAmJiAhUHlTdHJpbmdfQ2hlY2socmVzKSkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJICAgICAiX19oZXhfXyByZXR1cm5lZCBub24tc3RyaW5nICh0eXBlICUuMjAwcykiLAotCQkJICAgICByZXMtPm9iX3R5cGUtPnRwX25hbWUpOwotCQlQeV9ERUNSRUYocmVzKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiByZXM7CisgICAgaWYgKChuYiA9IHYtPm9iX3R5cGUtPnRwX2FzX251bWJlcikgPT0gTlVMTCB8fAorICAgICAgICBuYi0+bmJfaGV4ID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAiaGV4KCkgYXJndW1lbnQgY2FuJ3QgYmUgY29udmVydGVkIHRvIGhleCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmVzID0gKCpuYi0+bmJfaGV4KSh2KTsKKyAgICBpZiAocmVzICYmICFQeVN0cmluZ19DaGVjayhyZXMpKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiX19oZXhfXyByZXR1cm5lZCBub24tc3RyaW5nICh0eXBlICUuMjAwcykiLAorICAgICAgICAgICAgICAgICAgICAgcmVzLT5vYl90eXBlLT50cF9uYW1lKTsKKyAgICAgICAgUHlfREVDUkVGKHJlcyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gcmVzOwogfQogCiBQeURvY19TVFJWQVIoaGV4X2RvYywKQEAgLTEyMTYsMzEgKzEyMTYsMzEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBidWlsdGluX2lucHV0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqbGluZTsKLQljaGFyICpzdHI7Ci0JUHlPYmplY3QgKnJlczsKLQlQeU9iamVjdCAqZ2xvYmFscywgKmxvY2FsczsKLQlQeUNvbXBpbGVyRmxhZ3MgY2Y7CisgICAgUHlPYmplY3QgKmxpbmU7CisgICAgY2hhciAqc3RyOworICAgIFB5T2JqZWN0ICpyZXM7CisgICAgUHlPYmplY3QgKmdsb2JhbHMsICpsb2NhbHM7CisgICAgUHlDb21waWxlckZsYWdzIGNmOwogCi0JbGluZSA9IGJ1aWx0aW5fcmF3X2lucHV0KHNlbGYsIGFyZ3MpOwotCWlmIChsaW5lID09IE5VTEwpCi0JCXJldHVybiBsaW5lOwotCWlmICghUHlBcmdfUGFyc2UobGluZSwgInM7ZW1iZWRkZWQgJ1xcMCcgaW4gaW5wdXQgbGluZSIsICZzdHIpKQotCQlyZXR1cm4gTlVMTDsKLQl3aGlsZSAoKnN0ciA9PSAnICcgfHwgKnN0ciA9PSAnXHQnKQotCQkJc3RyKys7Ci0JZ2xvYmFscyA9IFB5RXZhbF9HZXRHbG9iYWxzKCk7Ci0JbG9jYWxzID0gUHlFdmFsX0dldExvY2FscygpOwotCWlmIChQeURpY3RfR2V0SXRlbVN0cmluZyhnbG9iYWxzLCAiX19idWlsdGluc19fIikgPT0gTlVMTCkgewotCQlpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZ2xvYmFscywgIl9fYnVpbHRpbnNfXyIsCi0JCQkJCSBQeUV2YWxfR2V0QnVpbHRpbnMoKSkgIT0gMCkKLQkJCXJldHVybiBOVUxMOwotCX0KLQljZi5jZl9mbGFncyA9IDA7Ci0JUHlFdmFsX01lcmdlQ29tcGlsZXJGbGFncygmY2YpOwotCXJlcyA9IFB5UnVuX1N0cmluZ0ZsYWdzKHN0ciwgUHlfZXZhbF9pbnB1dCwgZ2xvYmFscywgbG9jYWxzLCAmY2YpOwotCVB5X0RFQ1JFRihsaW5lKTsKLQlyZXR1cm4gcmVzOworICAgIGxpbmUgPSBidWlsdGluX3Jhd19pbnB1dChzZWxmLCBhcmdzKTsKKyAgICBpZiAobGluZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gbGluZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGxpbmUsICJzO2VtYmVkZGVkICdcXDAnIGluIGlucHV0IGxpbmUiLCAmc3RyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgd2hpbGUgKCpzdHIgPT0gJyAnIHx8ICpzdHIgPT0gJ1x0JykKKyAgICAgICAgICAgICAgICAgICAgc3RyKys7CisgICAgZ2xvYmFscyA9IFB5RXZhbF9HZXRHbG9iYWxzKCk7CisgICAgbG9jYWxzID0gUHlFdmFsX0dldExvY2FscygpOworICAgIGlmIChQeURpY3RfR2V0SXRlbVN0cmluZyhnbG9iYWxzLCAiX19idWlsdGluc19fIikgPT0gTlVMTCkgeworICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZ2xvYmFscywgIl9fYnVpbHRpbnNfXyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUV2YWxfR2V0QnVpbHRpbnMoKSkgIT0gMCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBjZi5jZl9mbGFncyA9IDA7CisgICAgUHlFdmFsX01lcmdlQ29tcGlsZXJGbGFncygmY2YpOworICAgIHJlcyA9IFB5UnVuX1N0cmluZ0ZsYWdzKHN0ciwgUHlfZXZhbF9pbnB1dCwgZ2xvYmFscywgbG9jYWxzLCAmY2YpOworICAgIFB5X0RFQ1JFRihsaW5lKTsKKyAgICByZXR1cm4gcmVzOwogfQogCiBQeURvY19TVFJWQVIoaW5wdXRfZG9jLApAQCAtMTI1MiwxNyArMTI1MiwxNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGJ1aWx0aW5faW50ZXJuKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqczsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIlM6aW50ZXJuIiwgJnMpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIVB5U3RyaW5nX0NoZWNrRXhhY3QocykpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiY2FuJ3QgaW50ZXJuIHN1YmNsYXNzIG9mIHN0cmluZyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JUHlfSU5DUkVGKHMpOwotCVB5U3RyaW5nX0ludGVybkluUGxhY2UoJnMpOwotCXJldHVybiBzOworICAgIFB5T2JqZWN0ICpzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiUzppbnRlcm4iLCAmcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHlTdHJpbmdfQ2hlY2tFeGFjdChzKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImNhbid0IGludGVybiBzdWJjbGFzcyBvZiBzdHJpbmciKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5X0lOQ1JFRihzKTsKKyAgICBQeVN0cmluZ19JbnRlcm5JblBsYWNlKCZzKTsKKyAgICByZXR1cm4gczsKIH0KIAogUHlEb2NfU1RSVkFSKGludGVybl9kb2MsCkBAIC0xMjc3LDE4ICsxMjc3LDE4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYnVpbHRpbl9pdGVyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqdiwgKncgPSBOVUxMOworICAgIFB5T2JqZWN0ICp2LCAqdyA9IE5VTEw7CiAKLQlpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJpdGVyIiwgMSwgMiwgJnYsICZ3KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKHcgPT0gTlVMTCkKLQkJcmV0dXJuIFB5T2JqZWN0X0dldEl0ZXIodik7Ci0JaWYgKCFQeUNhbGxhYmxlX0NoZWNrKHYpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJIml0ZXIodiwgdyk6IHYgbXVzdCBiZSBjYWxsYWJsZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIFB5Q2FsbEl0ZXJfTmV3KHYsIHcpOworICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgIml0ZXIiLCAxLCAyLCAmdiwgJncpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAodyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUHlPYmplY3RfR2V0SXRlcih2KTsKKyAgICBpZiAoIVB5Q2FsbGFibGVfQ2hlY2sodikpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJpdGVyKHYsIHcpOiB2IG11c3QgYmUgY2FsbGFibGUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBQeUNhbGxJdGVyX05ldyh2LCB3KTsKIH0KIAogUHlEb2NfU1RSVkFSKGl0ZXJfZG9jLApAQCAtMTMwMywxMiArMTMwMywxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGJ1aWx0aW5fbGVuKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdikKIHsKLQlQeV9zc2l6ZV90IHJlczsKKyAgICBQeV9zc2l6ZV90IHJlczsKIAotCXJlcyA9IFB5T2JqZWN0X1NpemUodik7Ci0JaWYgKHJlcyA8IDAgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KHJlcyk7CisgICAgcmVzID0gUHlPYmplY3RfU2l6ZSh2KTsKKyAgICBpZiAocmVzIDwgMCAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QocmVzKTsKIH0KIAogUHlEb2NfU1RSVkFSKGxlbl9kb2MsCkBAIC0xMzIwLDExICsxMzIwLDExIEBACiBzdGF0aWMgUHlPYmplY3QgKgogYnVpbHRpbl9sb2NhbHMoUHlPYmplY3QgKnNlbGYpCiB7Ci0JUHlPYmplY3QgKmQ7CisgICAgUHlPYmplY3QgKmQ7CiAKLQlkID0gUHlFdmFsX0dldExvY2FscygpOwotCVB5X1hJTkNSRUYoZCk7Ci0JcmV0dXJuIGQ7CisgICAgZCA9IFB5RXZhbF9HZXRMb2NhbHMoKTsKKyAgICBQeV9YSU5DUkVGKGQpOworICAgIHJldHVybiBkOwogfQogCiBQeURvY19TVFJWQVIobG9jYWxzX2RvYywKQEAgLTEzMzYsOTYgKzEzMzYsOTYgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBtaW5fbWF4KFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcywgaW50IG9wKQogewotCVB5T2JqZWN0ICp2LCAqaXQsICppdGVtLCAqdmFsLCAqbWF4aXRlbSwgKm1heHZhbCwgKmtleWZ1bmM9TlVMTDsKLQljb25zdCBjaGFyICpuYW1lID0gb3AgPT0gUHlfTFQgPyAibWluIiA6ICJtYXgiOworICAgIFB5T2JqZWN0ICp2LCAqaXQsICppdGVtLCAqdmFsLCAqbWF4aXRlbSwgKm1heHZhbCwgKmtleWZ1bmM9TlVMTDsKKyAgICBjb25zdCBjaGFyICpuYW1lID0gb3AgPT0gUHlfTFQgPyAibWluIiA6ICJtYXgiOwogCi0JaWYgKFB5VHVwbGVfU2l6ZShhcmdzKSA+IDEpCi0JCXYgPSBhcmdzOwotCWVsc2UgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAoY2hhciAqKW5hbWUsIDEsIDEsICZ2KSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKFB5VHVwbGVfU2l6ZShhcmdzKSA+IDEpCisgICAgICAgIHYgPSBhcmdzOworICAgIGVsc2UgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAoY2hhciAqKW5hbWUsIDEsIDEsICZ2KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoa3dkcyAhPSBOVUxMICYmIFB5RGljdF9DaGVjayhrd2RzKSAmJiBQeURpY3RfU2l6ZShrd2RzKSkgewotCQlrZXlmdW5jID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoa3dkcywgImtleSIpOwotCQlpZiAoUHlEaWN0X1NpemUoa3dkcykhPTEgIHx8ICBrZXlmdW5jID09IE5VTEwpIHsKLQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkJIiVzKCkgZ290IGFuIHVuZXhwZWN0ZWQga2V5d29yZCBhcmd1bWVudCIsIG5hbWUpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJUHlfSU5DUkVGKGtleWZ1bmMpOwotCX0KKyAgICBpZiAoa3dkcyAhPSBOVUxMICYmIFB5RGljdF9DaGVjayhrd2RzKSAmJiBQeURpY3RfU2l6ZShrd2RzKSkgeworICAgICAgICBrZXlmdW5jID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoa3dkcywgImtleSIpOworICAgICAgICBpZiAoUHlEaWN0X1NpemUoa3dkcykhPTEgIHx8ICBrZXlmdW5jID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgIiVzKCkgZ290IGFuIHVuZXhwZWN0ZWQga2V5d29yZCBhcmd1bWVudCIsIG5hbWUpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgUHlfSU5DUkVGKGtleWZ1bmMpOworICAgIH0KIAotCWl0ID0gUHlPYmplY3RfR2V0SXRlcih2KTsKLQlpZiAoaXQgPT0gTlVMTCkgewotCQlQeV9YREVDUkVGKGtleWZ1bmMpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaXQgPSBQeU9iamVjdF9HZXRJdGVyKHYpOworICAgIGlmIChpdCA9PSBOVUxMKSB7CisgICAgICAgIFB5X1hERUNSRUYoa2V5ZnVuYyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCW1heGl0ZW0gPSBOVUxMOyAvKiB0aGUgcmVzdWx0ICovCi0JbWF4dmFsID0gTlVMTDsgIC8qIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIHJlc3VsdCAqLwotCXdoaWxlICgoIGl0ZW0gPSBQeUl0ZXJfTmV4dChpdCkgKSkgewotCQkvKiBnZXQgdGhlIHZhbHVlIGZyb20gdGhlIGtleSBmdW5jdGlvbiAqLwotCQlpZiAoa2V5ZnVuYyAhPSBOVUxMKSB7Ci0JCQl2YWwgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGtleWZ1bmMsIGl0ZW0sIE5VTEwpOwotCQkJaWYgKHZhbCA9PSBOVUxMKQotCQkJCWdvdG8gRmFpbF9pdF9pdGVtOwotCQl9Ci0JCS8qIG5vIGtleSBmdW5jdGlvbjsgdGhlIHZhbHVlIGlzIHRoZSBpdGVtICovCi0JCWVsc2UgewotCQkJdmFsID0gaXRlbTsKLQkJCVB5X0lOQ1JFRih2YWwpOwotCQl9CisgICAgbWF4aXRlbSA9IE5VTEw7IC8qIHRoZSByZXN1bHQgKi8KKyAgICBtYXh2YWwgPSBOVUxMOyAgLyogdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVzdWx0ICovCisgICAgd2hpbGUgKCggaXRlbSA9IFB5SXRlcl9OZXh0KGl0KSApKSB7CisgICAgICAgIC8qIGdldCB0aGUgdmFsdWUgZnJvbSB0aGUga2V5IGZ1bmN0aW9uICovCisgICAgICAgIGlmIChrZXlmdW5jICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHZhbCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3Moa2V5ZnVuYywgaXRlbSwgTlVMTCk7CisgICAgICAgICAgICBpZiAodmFsID09IE5VTEwpCisgICAgICAgICAgICAgICAgZ290byBGYWlsX2l0X2l0ZW07CisgICAgICAgIH0KKyAgICAgICAgLyogbm8ga2V5IGZ1bmN0aW9uOyB0aGUgdmFsdWUgaXMgdGhlIGl0ZW0gKi8KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICB2YWwgPSBpdGVtOworICAgICAgICAgICAgUHlfSU5DUkVGKHZhbCk7CisgICAgICAgIH0KIAotCQkvKiBtYXhpbXVtIHZhbHVlIGFuZCBpdGVtIGFyZSB1bnNldDsgc2V0IHRoZW0gKi8KLQkJaWYgKG1heHZhbCA9PSBOVUxMKSB7Ci0JCQltYXhpdGVtID0gaXRlbTsKLQkJCW1heHZhbCA9IHZhbDsKLQkJfQotCQkvKiBtYXhpbXVtIHZhbHVlIGFuZCBpdGVtIGFyZSBzZXQ7IHVwZGF0ZSB0aGVtIGFzIG5lY2Vzc2FyeSAqLwotCQllbHNlIHsKLQkJCWludCBjbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2wodmFsLCBtYXh2YWwsIG9wKTsKLQkJCWlmIChjbXAgPCAwKQotCQkJCWdvdG8gRmFpbF9pdF9pdGVtX2FuZF92YWw7Ci0JCQllbHNlIGlmIChjbXAgPiAwKSB7Ci0JCQkJUHlfREVDUkVGKG1heHZhbCk7Ci0JCQkJUHlfREVDUkVGKG1heGl0ZW0pOwotCQkJCW1heHZhbCA9IHZhbDsKLQkJCQltYXhpdGVtID0gaXRlbTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCVB5X0RFQ1JFRihpdGVtKTsKLQkJCQlQeV9ERUNSRUYodmFsKTsKLQkJCX0KLQkJfQotCX0KLQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkKLQkJZ290byBGYWlsX2l0OwotCWlmIChtYXh2YWwgPT0gTlVMTCkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKLQkJCSAgICAgIiVzKCkgYXJnIGlzIGFuIGVtcHR5IHNlcXVlbmNlIiwgbmFtZSk7Ci0JCWFzc2VydChtYXhpdGVtID09IE5VTEwpOwotCX0KLQllbHNlCi0JCVB5X0RFQ1JFRihtYXh2YWwpOwotCVB5X0RFQ1JFRihpdCk7Ci0JUHlfWERFQ1JFRihrZXlmdW5jKTsKLQlyZXR1cm4gbWF4aXRlbTsKKyAgICAgICAgLyogbWF4aW11bSB2YWx1ZSBhbmQgaXRlbSBhcmUgdW5zZXQ7IHNldCB0aGVtICovCisgICAgICAgIGlmIChtYXh2YWwgPT0gTlVMTCkgeworICAgICAgICAgICAgbWF4aXRlbSA9IGl0ZW07CisgICAgICAgICAgICBtYXh2YWwgPSB2YWw7CisgICAgICAgIH0KKyAgICAgICAgLyogbWF4aW11bSB2YWx1ZSBhbmQgaXRlbSBhcmUgc2V0OyB1cGRhdGUgdGhlbSBhcyBuZWNlc3NhcnkgKi8KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpbnQgY21wID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKHZhbCwgbWF4dmFsLCBvcCk7CisgICAgICAgICAgICBpZiAoY21wIDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIEZhaWxfaXRfaXRlbV9hbmRfdmFsOworICAgICAgICAgICAgZWxzZSBpZiAoY21wID4gMCkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihtYXh2YWwpOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihtYXhpdGVtKTsKKyAgICAgICAgICAgICAgICBtYXh2YWwgPSB2YWw7CisgICAgICAgICAgICAgICAgbWF4aXRlbSA9IGl0ZW07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHZhbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIGdvdG8gRmFpbF9pdDsKKyAgICBpZiAobWF4dmFsID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiJXMoKSBhcmcgaXMgYW4gZW1wdHkgc2VxdWVuY2UiLCBuYW1lKTsKKyAgICAgICAgYXNzZXJ0KG1heGl0ZW0gPT0gTlVMTCk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgUHlfREVDUkVGKG1heHZhbCk7CisgICAgUHlfREVDUkVGKGl0KTsKKyAgICBQeV9YREVDUkVGKGtleWZ1bmMpOworICAgIHJldHVybiBtYXhpdGVtOwogCiBGYWlsX2l0X2l0ZW1fYW5kX3ZhbDoKLQlQeV9ERUNSRUYodmFsKTsKKyAgICBQeV9ERUNSRUYodmFsKTsKIEZhaWxfaXRfaXRlbToKLQlQeV9ERUNSRUYoaXRlbSk7CisgICAgUHlfREVDUkVGKGl0ZW0pOwogRmFpbF9pdDoKLQlQeV9YREVDUkVGKG1heHZhbCk7Ci0JUHlfWERFQ1JFRihtYXhpdGVtKTsKLQlQeV9ERUNSRUYoaXQpOwotCVB5X1hERUNSRUYoa2V5ZnVuYyk7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlfWERFQ1JFRihtYXh2YWwpOworICAgIFB5X1hERUNSRUYobWF4aXRlbSk7CisgICAgUHlfREVDUkVGKGl0KTsKKyAgICBQeV9YREVDUkVGKGtleWZ1bmMpOworICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYnVpbHRpbl9taW4oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlyZXR1cm4gbWluX21heChhcmdzLCBrd2RzLCBQeV9MVCk7CisgICAgcmV0dXJuIG1pbl9tYXgoYXJncywga3dkcywgUHlfTFQpOwogfQogCiBQeURvY19TVFJWQVIobWluX2RvYywKQEAgLTE0MzksNyArMTQzOSw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYnVpbHRpbl9tYXgoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlyZXR1cm4gbWluX21heChhcmdzLCBrd2RzLCBQeV9HVCk7CisgICAgcmV0dXJuIG1pbl9tYXgoYXJncywga3dkcywgUHlfR1QpOwogfQogCiBQeURvY19TVFJWQVIobWF4X2RvYywKQEAgLTE0NTMsMjQgKzE0NTMsMjQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBidWlsdGluX29jdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnYpCiB7Ci0JUHlOdW1iZXJNZXRob2RzICpuYjsKLQlQeU9iamVjdCAqcmVzOworICAgIFB5TnVtYmVyTWV0aG9kcyAqbmI7CisgICAgUHlPYmplY3QgKnJlczsKIAotCWlmICh2ID09IE5VTEwgfHwgKG5iID0gdi0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyKSA9PSBOVUxMIHx8Ci0JICAgIG5iLT5uYl9vY3QgPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJICAgIm9jdCgpIGFyZ3VtZW50IGNhbid0IGJlIGNvbnZlcnRlZCB0byBvY3QiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJlcyA9ICgqbmItPm5iX29jdCkodik7Ci0JaWYgKHJlcyAmJiAhUHlTdHJpbmdfQ2hlY2socmVzKSkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJICAgICAiX19vY3RfXyByZXR1cm5lZCBub24tc3RyaW5nICh0eXBlICUuMjAwcykiLAotCQkJICAgICByZXMtPm9iX3R5cGUtPnRwX25hbWUpOwotCQlQeV9ERUNSRUYocmVzKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiByZXM7CisgICAgaWYgKHYgPT0gTlVMTCB8fCAobmIgPSB2LT5vYl90eXBlLT50cF9hc19udW1iZXIpID09IE5VTEwgfHwKKyAgICAgICAgbmItPm5iX29jdCA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgIm9jdCgpIGFyZ3VtZW50IGNhbid0IGJlIGNvbnZlcnRlZCB0byBvY3QiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJlcyA9ICgqbmItPm5iX29jdCkodik7CisgICAgaWYgKHJlcyAmJiAhUHlTdHJpbmdfQ2hlY2socmVzKSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIl9fb2N0X18gcmV0dXJuZWQgbm9uLXN0cmluZyAodHlwZSAlLjIwMHMpIiwKKyAgICAgICAgICAgICAgICAgICAgIHJlcy0+b2JfdHlwZS0+dHBfbmFtZSk7CisgICAgICAgIFB5X0RFQ1JFRihyZXMpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKIH0KIAogUHlEb2NfU1RSVkFSKG9jdF9kb2MsCkBAIC0xNDgyLDcgKzE0ODIsNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGJ1aWx0aW5fb3BlbihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCXJldHVybiBQeU9iamVjdF9DYWxsKChQeU9iamVjdCopJlB5RmlsZV9UeXBlLCBhcmdzLCBrd2RzKTsKKyAgICByZXR1cm4gUHlPYmplY3RfQ2FsbCgoUHlPYmplY3QqKSZQeUZpbGVfVHlwZSwgYXJncywga3dkcyk7CiB9CiAKIFB5RG9jX1NUUlZBUihvcGVuX2RvYywKQEAgLTE0OTUsNDIgKzE0OTUsNDIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBidWlsdGluX29yZChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QqIG9iaikKIHsKLQlsb25nIG9yZDsKLQlQeV9zc2l6ZV90IHNpemU7CisgICAgbG9uZyBvcmQ7CisgICAgUHlfc3NpemVfdCBzaXplOwogCi0JaWYgKFB5U3RyaW5nX0NoZWNrKG9iaikpIHsKLQkJc2l6ZSA9IFB5U3RyaW5nX0dFVF9TSVpFKG9iaik7Ci0JCWlmIChzaXplID09IDEpIHsKLQkJCW9yZCA9IChsb25nKSgodW5zaWduZWQgY2hhcikqUHlTdHJpbmdfQVNfU1RSSU5HKG9iaikpOwotCQkJcmV0dXJuIFB5SW50X0Zyb21Mb25nKG9yZCk7Ci0JCX0KLQl9IGVsc2UgaWYgKFB5Qnl0ZUFycmF5X0NoZWNrKG9iaikpIHsKLQkJc2l6ZSA9IFB5Qnl0ZUFycmF5X0dFVF9TSVpFKG9iaik7Ci0JCWlmIChzaXplID09IDEpIHsKLQkJCW9yZCA9IChsb25nKSgodW5zaWduZWQgY2hhcikqUHlCeXRlQXJyYXlfQVNfU1RSSU5HKG9iaikpOwotCQkJcmV0dXJuIFB5SW50X0Zyb21Mb25nKG9yZCk7Ci0JCX0KKyAgICBpZiAoUHlTdHJpbmdfQ2hlY2sob2JqKSkgeworICAgICAgICBzaXplID0gUHlTdHJpbmdfR0VUX1NJWkUob2JqKTsKKyAgICAgICAgaWYgKHNpemUgPT0gMSkgeworICAgICAgICAgICAgb3JkID0gKGxvbmcpKCh1bnNpZ25lZCBjaGFyKSpQeVN0cmluZ19BU19TVFJJTkcob2JqKSk7CisgICAgICAgICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcob3JkKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoUHlCeXRlQXJyYXlfQ2hlY2sob2JqKSkgeworICAgICAgICBzaXplID0gUHlCeXRlQXJyYXlfR0VUX1NJWkUob2JqKTsKKyAgICAgICAgaWYgKHNpemUgPT0gMSkgeworICAgICAgICAgICAgb3JkID0gKGxvbmcpKCh1bnNpZ25lZCBjaGFyKSpQeUJ5dGVBcnJheV9BU19TVFJJTkcob2JqKSk7CisgICAgICAgICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcob3JkKTsKKyAgICAgICAgfQogCiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCX0gZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrKG9iaikpIHsKLQkJc2l6ZSA9IFB5VW5pY29kZV9HRVRfU0laRShvYmopOwotCQlpZiAoc2l6ZSA9PSAxKSB7Ci0JCQlvcmQgPSAobG9uZykqUHlVbmljb2RlX0FTX1VOSUNPREUob2JqKTsKLQkJCXJldHVybiBQeUludF9Gcm9tTG9uZyhvcmQpOwotCQl9CisgICAgfSBlbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2sob2JqKSkgeworICAgICAgICBzaXplID0gUHlVbmljb2RlX0dFVF9TSVpFKG9iaik7CisgICAgICAgIGlmIChzaXplID09IDEpIHsKKyAgICAgICAgICAgIG9yZCA9IChsb25nKSpQeVVuaWNvZGVfQVNfVU5JQ09ERShvYmopOworICAgICAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKG9yZCk7CisgICAgICAgIH0KICNlbmRpZgotCX0gZWxzZSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgICJvcmQoKSBleHBlY3RlZCBzdHJpbmcgb2YgbGVuZ3RoIDEsIGJ1dCAiIFwKLQkJCSAgICAgIiUuMjAwcyBmb3VuZCIsIG9iai0+b2JfdHlwZS0+dHBfbmFtZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICB9IGVsc2UgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIm9yZCgpIGV4cGVjdGVkIHN0cmluZyBvZiBsZW5ndGggMSwgYnV0ICIgXAorICAgICAgICAgICAgICAgICAgICAgIiUuMjAwcyBmb3VuZCIsIG9iai0+b2JfdHlwZS0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCSAgICAgIm9yZCgpIGV4cGVjdGVkIGEgY2hhcmFjdGVyLCAiCi0JCSAgICAgImJ1dCBzdHJpbmcgb2YgbGVuZ3RoICV6ZCBmb3VuZCIsCi0JCSAgICAgc2l6ZSk7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgIm9yZCgpIGV4cGVjdGVkIGEgY2hhcmFjdGVyLCAiCisgICAgICAgICAgICAgICAgICJidXQgc3RyaW5nIG9mIGxlbmd0aCAlemQgZm91bmQiLAorICAgICAgICAgICAgICAgICBzaXplKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogUHlEb2NfU1RSVkFSKG9yZF9kb2MsCkBAIC0xNTQyLDExICsxNTQyLDExIEBACiBzdGF0aWMgUHlPYmplY3QgKgogYnVpbHRpbl9wb3coUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICp2LCAqdywgKnogPSBQeV9Ob25lOworICAgIFB5T2JqZWN0ICp2LCAqdywgKnogPSBQeV9Ob25lOwogCi0JaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAicG93IiwgMiwgMywgJnYsICZ3LCAmeikpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBQeU51bWJlcl9Qb3dlcih2LCB3LCB6KTsKKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJwb3ciLCAyLCAzLCAmdiwgJncsICZ6KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFB5TnVtYmVyX1Bvd2VyKHYsIHcsIHopOwogfQogCiBQeURvY19TVFJWQVIocG93X2RvYywKQEAgLTE1NTksMTIwICsxNTU5LDEyMCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGJ1aWx0aW5fcHJpbnQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7InNlcCIsICJlbmQiLCAiZmlsZSIsIDB9OwotCXN0YXRpYyBQeU9iamVjdCAqZHVtbXlfYXJncyA9IE5VTEw7Ci0Jc3RhdGljIFB5T2JqZWN0ICp1bmljb2RlX25ld2xpbmUgPSBOVUxMLCAqdW5pY29kZV9zcGFjZSA9IE5VTEw7Ci0Jc3RhdGljIFB5T2JqZWN0ICpzdHJfbmV3bGluZSA9IE5VTEwsICpzdHJfc3BhY2UgPSBOVUxMOwotCVB5T2JqZWN0ICpuZXdsaW5lLCAqc3BhY2U7Ci0JUHlPYmplY3QgKnNlcCA9IE5VTEwsICplbmQgPSBOVUxMLCAqZmlsZSA9IE5VTEw7Ci0JaW50IGksIGVyciwgdXNlX3VuaWNvZGUgPSAwOworICAgIHN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsic2VwIiwgImVuZCIsICJmaWxlIiwgMH07CisgICAgc3RhdGljIFB5T2JqZWN0ICpkdW1teV9hcmdzID0gTlVMTDsKKyAgICBzdGF0aWMgUHlPYmplY3QgKnVuaWNvZGVfbmV3bGluZSA9IE5VTEwsICp1bmljb2RlX3NwYWNlID0gTlVMTDsKKyAgICBzdGF0aWMgUHlPYmplY3QgKnN0cl9uZXdsaW5lID0gTlVMTCwgKnN0cl9zcGFjZSA9IE5VTEw7CisgICAgUHlPYmplY3QgKm5ld2xpbmUsICpzcGFjZTsKKyAgICBQeU9iamVjdCAqc2VwID0gTlVMTCwgKmVuZCA9IE5VTEwsICpmaWxlID0gTlVMTDsKKyAgICBpbnQgaSwgZXJyLCB1c2VfdW5pY29kZSA9IDA7CiAKLQlpZiAoZHVtbXlfYXJncyA9PSBOVUxMKSB7Ci0JCWlmICghKGR1bW15X2FyZ3MgPSBQeVR1cGxlX05ldygwKSkpCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKHN0cl9uZXdsaW5lID09IE5VTEwpIHsKLQkJc3RyX25ld2xpbmUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCJcbiIpOwotCQlpZiAoc3RyX25ld2xpbmUgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQlzdHJfc3BhY2UgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCIgIik7Ci0JCWlmIChzdHJfc3BhY2UgPT0gTlVMTCkgewotCQkJUHlfQ0xFQVIoc3RyX25ld2xpbmUpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJdW5pY29kZV9uZXdsaW5lID0gUHlVbmljb2RlX0Zyb21TdHJpbmcoIlxuIik7Ci0JCWlmICh1bmljb2RlX25ld2xpbmUgPT0gTlVMTCkgewotCQkJUHlfQ0xFQVIoc3RyX25ld2xpbmUpOwotCQkJUHlfQ0xFQVIoc3RyX3NwYWNlKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCXVuaWNvZGVfc3BhY2UgPSBQeVVuaWNvZGVfRnJvbVN0cmluZygiICIpOwotCQlpZiAodW5pY29kZV9zcGFjZSA9PSBOVUxMKSB7Ci0JCQlQeV9DTEVBUihzdHJfbmV3bGluZSk7Ci0JCQlQeV9DTEVBUihzdHJfc3BhY2UpOwotCQkJUHlfQ0xFQVIodW5pY29kZV9zcGFjZSk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhkdW1teV9hcmdzLCBrd2RzLCAifE9PTzpwcmludCIsCi0JCQkJCSBrd2xpc3QsICZzZXAsICZlbmQsICZmaWxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKGZpbGUgPT0gTlVMTCB8fCBmaWxlID09IFB5X05vbmUpIHsKLQkJZmlsZSA9IFB5U3lzX0dldE9iamVjdCgic3Rkb3V0Iik7Ci0JCS8qIHN5cy5zdGRvdXQgbWF5IGJlIE5vbmUgd2hlbiBGSUxFKiBzdGRvdXQgaXNuJ3QgY29ubmVjdGVkICovCi0JCWlmIChmaWxlID09IFB5X05vbmUpCi0JCQlQeV9SRVRVUk5fTk9ORTsKLQl9Ci0JaWYgKHNlcCA9PSBQeV9Ob25lKSB7Ci0JCXNlcCA9IE5VTEw7Ci0JfQotCWVsc2UgaWYgKHNlcCkgewotCQlpZiAoUHlVbmljb2RlX0NoZWNrKHNlcCkpIHsKLQkJCXVzZV91bmljb2RlID0gMTsKLQkJfQotCQllbHNlIGlmICghUHlTdHJpbmdfQ2hlY2soc2VwKSkgewotCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCQkgICAgICJzZXAgbXVzdCBiZSBOb25lLCBzdHIgb3IgdW5pY29kZSwgbm90ICUuMjAwcyIsCi0JCQkJICAgICBzZXAtPm9iX3R5cGUtPnRwX25hbWUpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9Ci0JaWYgKGVuZCA9PSBQeV9Ob25lKQotCQllbmQgPSBOVUxMOwotCWVsc2UgaWYgKGVuZCkgewotCQlpZiAoUHlVbmljb2RlX0NoZWNrKGVuZCkpIHsKLQkJCXVzZV91bmljb2RlID0gMTsKLQkJfQotCQllbHNlIGlmICghUHlTdHJpbmdfQ2hlY2soZW5kKSkgewotCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCQkgICAgICJlbmQgbXVzdCBiZSBOb25lLCBzdHIgb3IgdW5pY29kZSwgbm90ICUuMjAwcyIsCi0JCQkJICAgICBlbmQtPm9iX3R5cGUtPnRwX25hbWUpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9CisgICAgaWYgKGR1bW15X2FyZ3MgPT0gTlVMTCkgeworICAgICAgICBpZiAoIShkdW1teV9hcmdzID0gUHlUdXBsZV9OZXcoMCkpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChzdHJfbmV3bGluZSA9PSBOVUxMKSB7CisgICAgICAgIHN0cl9uZXdsaW5lID0gUHlTdHJpbmdfRnJvbVN0cmluZygiXG4iKTsKKyAgICAgICAgaWYgKHN0cl9uZXdsaW5lID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgc3RyX3NwYWNlID0gUHlTdHJpbmdfRnJvbVN0cmluZygiICIpOworICAgICAgICBpZiAoc3RyX3NwYWNlID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0NMRUFSKHN0cl9uZXdsaW5lKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHVuaWNvZGVfbmV3bGluZSA9IFB5VW5pY29kZV9Gcm9tU3RyaW5nKCJcbiIpOworICAgICAgICBpZiAodW5pY29kZV9uZXdsaW5lID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0NMRUFSKHN0cl9uZXdsaW5lKTsKKyAgICAgICAgICAgIFB5X0NMRUFSKHN0cl9zcGFjZSk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICB1bmljb2RlX3NwYWNlID0gUHlVbmljb2RlX0Zyb21TdHJpbmcoIiAiKTsKKyAgICAgICAgaWYgKHVuaWNvZGVfc3BhY2UgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfQ0xFQVIoc3RyX25ld2xpbmUpOworICAgICAgICAgICAgUHlfQ0xFQVIoc3RyX3NwYWNlKTsKKyAgICAgICAgICAgIFB5X0NMRUFSKHVuaWNvZGVfc3BhY2UpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoZHVtbXlfYXJncywga3dkcywgInxPT086cHJpbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGt3bGlzdCwgJnNlcCwgJmVuZCwgJmZpbGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoZmlsZSA9PSBOVUxMIHx8IGZpbGUgPT0gUHlfTm9uZSkgeworICAgICAgICBmaWxlID0gUHlTeXNfR2V0T2JqZWN0KCJzdGRvdXQiKTsKKyAgICAgICAgLyogc3lzLnN0ZG91dCBtYXkgYmUgTm9uZSB3aGVuIEZJTEUqIHN0ZG91dCBpc24ndCBjb25uZWN0ZWQgKi8KKyAgICAgICAgaWYgKGZpbGUgPT0gUHlfTm9uZSkKKyAgICAgICAgICAgIFB5X1JFVFVSTl9OT05FOworICAgIH0KKyAgICBpZiAoc2VwID09IFB5X05vbmUpIHsKKyAgICAgICAgc2VwID0gTlVMTDsKKyAgICB9CisgICAgZWxzZSBpZiAoc2VwKSB7CisgICAgICAgIGlmIChQeVVuaWNvZGVfQ2hlY2soc2VwKSkgeworICAgICAgICAgICAgdXNlX3VuaWNvZGUgPSAxOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCFQeVN0cmluZ19DaGVjayhzZXApKSB7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICJzZXAgbXVzdCBiZSBOb25lLCBzdHIgb3IgdW5pY29kZSwgbm90ICUuMjAwcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2VwLT5vYl90eXBlLT50cF9uYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorICAgIGlmIChlbmQgPT0gUHlfTm9uZSkKKyAgICAgICAgZW5kID0gTlVMTDsKKyAgICBlbHNlIGlmIChlbmQpIHsKKyAgICAgICAgaWYgKFB5VW5pY29kZV9DaGVjayhlbmQpKSB7CisgICAgICAgICAgICB1c2VfdW5pY29kZSA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIVB5U3RyaW5nX0NoZWNrKGVuZCkpIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgImVuZCBtdXN0IGJlIE5vbmUsIHN0ciBvciB1bmljb2RlLCBub3QgJS4yMDBzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBlbmQtPm9iX3R5cGUtPnRwX25hbWUpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CiAKLQlpZiAoIXVzZV91bmljb2RlKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBQeVR1cGxlX1NpemUoYXJncyk7IGkrKykgewotCQkJaWYgKFB5VW5pY29kZV9DaGVjayhQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIGkpKSkgewotCQkJCXVzZV91bmljb2RlID0gMTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQlpZiAodXNlX3VuaWNvZGUpIHsKLQkJbmV3bGluZSA9IHVuaWNvZGVfbmV3bGluZTsKLQkJc3BhY2UgPSB1bmljb2RlX3NwYWNlOwotCX0KLQllbHNlIHsKLQkJbmV3bGluZSA9IHN0cl9uZXdsaW5lOwotCQlzcGFjZSA9IHN0cl9zcGFjZTsKLQl9CisgICAgaWYgKCF1c2VfdW5pY29kZSkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgUHlUdXBsZV9TaXplKGFyZ3MpOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChQeVVuaWNvZGVfQ2hlY2soUHlUdXBsZV9HRVRfSVRFTShhcmdzLCBpKSkpIHsKKyAgICAgICAgICAgICAgICB1c2VfdW5pY29kZSA9IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHVzZV91bmljb2RlKSB7CisgICAgICAgIG5ld2xpbmUgPSB1bmljb2RlX25ld2xpbmU7CisgICAgICAgIHNwYWNlID0gdW5pY29kZV9zcGFjZTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIG5ld2xpbmUgPSBzdHJfbmV3bGluZTsKKyAgICAgICAgc3BhY2UgPSBzdHJfc3BhY2U7CisgICAgfQogCi0JZm9yIChpID0gMDsgaSA8IFB5VHVwbGVfU2l6ZShhcmdzKTsgaSsrKSB7Ci0JCWlmIChpID4gMCkgewotCQkJaWYgKHNlcCA9PSBOVUxMKQotCQkJCWVyciA9IFB5RmlsZV9Xcml0ZU9iamVjdChzcGFjZSwgZmlsZSwKLQkJCQkJCQkgUHlfUFJJTlRfUkFXKTsKLQkJCWVsc2UKLQkJCQllcnIgPSBQeUZpbGVfV3JpdGVPYmplY3Qoc2VwLCBmaWxlLAotCQkJCQkJCSBQeV9QUklOVF9SQVcpOwotCQkJaWYgKGVycikKLQkJCQlyZXR1cm4gTlVMTDsKLQkJfQotCQllcnIgPSBQeUZpbGVfV3JpdGVPYmplY3QoUHlUdXBsZV9HZXRJdGVtKGFyZ3MsIGkpLCBmaWxlLAotCQkJCQkgUHlfUFJJTlRfUkFXKTsKLQkJaWYgKGVycikKLQkJCXJldHVybiBOVUxMOwotCX0KKyAgICBmb3IgKGkgPSAwOyBpIDwgUHlUdXBsZV9TaXplKGFyZ3MpOyBpKyspIHsKKyAgICAgICAgaWYgKGkgPiAwKSB7CisgICAgICAgICAgICBpZiAoc2VwID09IE5VTEwpCisgICAgICAgICAgICAgICAgZXJyID0gUHlGaWxlX1dyaXRlT2JqZWN0KHNwYWNlLCBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9QUklOVF9SQVcpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGVyciA9IFB5RmlsZV9Xcml0ZU9iamVjdChzZXAsIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X1BSSU5UX1JBVyk7CisgICAgICAgICAgICBpZiAoZXJyKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGVyciA9IFB5RmlsZV9Xcml0ZU9iamVjdChQeVR1cGxlX0dldEl0ZW0oYXJncywgaSksIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9QUklOVF9SQVcpOworICAgICAgICBpZiAoZXJyKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaWYgKGVuZCA9PSBOVUxMKQotCQllcnIgPSBQeUZpbGVfV3JpdGVPYmplY3QobmV3bGluZSwgZmlsZSwgUHlfUFJJTlRfUkFXKTsKLQllbHNlCi0JCWVyciA9IFB5RmlsZV9Xcml0ZU9iamVjdChlbmQsIGZpbGUsIFB5X1BSSU5UX1JBVyk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKGVuZCA9PSBOVUxMKQorICAgICAgICBlcnIgPSBQeUZpbGVfV3JpdGVPYmplY3QobmV3bGluZSwgZmlsZSwgUHlfUFJJTlRfUkFXKTsKKyAgICBlbHNlCisgICAgICAgIGVyciA9IFB5RmlsZV9Xcml0ZU9iamVjdChlbmQsIGZpbGUsIFB5X1BSSU5UX1JBVyk7CisgICAgaWYgKGVycikKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlQeV9SRVRVUk5fTk9ORTsKKyAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAogUHlEb2NfU1RSVkFSKHByaW50X2RvYywKQEAgLTE2OTQsNTUgKzE2OTQsNTUgQEAKIHN0YXRpYyBsb25nCiBnZXRfbGVuX29mX3JhbmdlX2xvbmdzKFB5T2JqZWN0ICpsbywgUHlPYmplY3QgKmhpLCBQeU9iamVjdCAqc3RlcCkKIHsKLQkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JQWxnb3JpdGhtIGlzIGVxdWFsIHRvIHRoYXQgb2YgZ2V0X2xlbl9vZl9yYW5nZSgpLCBidXQgaXQgb3BlcmF0ZXMKLQlvbiBQeU9iamVjdHMgKHdoaWNoIGFyZSBhc3N1bWVkIHRvIGJlIFB5TG9uZyBvciBQeUludCBvYmplY3RzKS4KLQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCWxvbmcgbjsKLQlQeU9iamVjdCAqZGlmZiA9IE5VTEw7Ci0JUHlPYmplY3QgKm9uZSA9IE5VTEw7Ci0JUHlPYmplY3QgKnRtcDEgPSBOVUxMLCAqdG1wMiA9IE5VTEwsICp0bXAzID0gTlVMTDsKLQkJLyogaG9sZHMgc3ViLWV4cHJlc3Npb24gZXZhbHVhdGlvbnMgKi8KKyAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQWxnb3JpdGhtIGlzIGVxdWFsIHRvIHRoYXQgb2YgZ2V0X2xlbl9vZl9yYW5nZSgpLCBidXQgaXQgb3BlcmF0ZXMKKyAgICBvbiBQeU9iamVjdHMgKHdoaWNoIGFyZSBhc3N1bWVkIHRvIGJlIFB5TG9uZyBvciBQeUludCBvYmplY3RzKS4KKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIGxvbmcgbjsKKyAgICBQeU9iamVjdCAqZGlmZiA9IE5VTEw7CisgICAgUHlPYmplY3QgKm9uZSA9IE5VTEw7CisgICAgUHlPYmplY3QgKnRtcDEgPSBOVUxMLCAqdG1wMiA9IE5VTEwsICp0bXAzID0gTlVMTDsKKyAgICAgICAgLyogaG9sZHMgc3ViLWV4cHJlc3Npb24gZXZhbHVhdGlvbnMgKi8KIAotCS8qIGlmIChsbyA+PSBoaSksIHJldHVybiBsZW5ndGggb2YgMC4gKi8KLQlpZiAoUHlPYmplY3RfQ29tcGFyZShsbywgaGkpID49IDApCi0JCXJldHVybiAwOworICAgIC8qIGlmIChsbyA+PSBoaSksIHJldHVybiBsZW5ndGggb2YgMC4gKi8KKyAgICBpZiAoUHlPYmplY3RfQ29tcGFyZShsbywgaGkpID49IDApCisgICAgICAgIHJldHVybiAwOwogCi0JaWYgKChvbmUgPSBQeUxvbmdfRnJvbUxvbmcoMUwpKSA9PSBOVUxMKQotCQlnb3RvIEZhaWw7CisgICAgaWYgKChvbmUgPSBQeUxvbmdfRnJvbUxvbmcoMUwpKSA9PSBOVUxMKQorICAgICAgICBnb3RvIEZhaWw7CiAKLQlpZiAoKHRtcDEgPSBQeU51bWJlcl9TdWJ0cmFjdChoaSwgbG8pKSA9PSBOVUxMKQotCQlnb3RvIEZhaWw7CisgICAgaWYgKCh0bXAxID0gUHlOdW1iZXJfU3VidHJhY3QoaGksIGxvKSkgPT0gTlVMTCkKKyAgICAgICAgZ290byBGYWlsOwogCi0JaWYgKChkaWZmID0gUHlOdW1iZXJfU3VidHJhY3QodG1wMSwgb25lKSkgPT0gTlVMTCkKLQkJZ290byBGYWlsOworICAgIGlmICgoZGlmZiA9IFB5TnVtYmVyX1N1YnRyYWN0KHRtcDEsIG9uZSkpID09IE5VTEwpCisgICAgICAgIGdvdG8gRmFpbDsKIAotCWlmICgodG1wMiA9IFB5TnVtYmVyX0Zsb29yRGl2aWRlKGRpZmYsIHN0ZXApKSA9PSBOVUxMKQotCQlnb3RvIEZhaWw7CisgICAgaWYgKCh0bXAyID0gUHlOdW1iZXJfRmxvb3JEaXZpZGUoZGlmZiwgc3RlcCkpID09IE5VTEwpCisgICAgICAgIGdvdG8gRmFpbDsKIAotCWlmICgodG1wMyA9IFB5TnVtYmVyX0FkZCh0bXAyLCBvbmUpKSA9PSBOVUxMKQotCQlnb3RvIEZhaWw7CisgICAgaWYgKCh0bXAzID0gUHlOdW1iZXJfQWRkKHRtcDIsIG9uZSkpID09IE5VTEwpCisgICAgICAgIGdvdG8gRmFpbDsKIAotCW4gPSBQeUxvbmdfQXNMb25nKHRtcDMpOwotCWlmIChQeUVycl9PY2N1cnJlZCgpKSB7ICAvKiBDaGVjayBmb3IgT3ZlcmZsb3cgKi8KLQkJUHlFcnJfQ2xlYXIoKTsKLQkJZ290byBGYWlsOwotCX0KKyAgICBuID0gUHlMb25nX0FzTG9uZyh0bXAzKTsKKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgeyAgLyogQ2hlY2sgZm9yIE92ZXJmbG93ICovCisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIGdvdG8gRmFpbDsKKyAgICB9CiAKLQlQeV9ERUNSRUYodG1wMyk7Ci0JUHlfREVDUkVGKHRtcDIpOwotCVB5X0RFQ1JFRihkaWZmKTsKLQlQeV9ERUNSRUYodG1wMSk7Ci0JUHlfREVDUkVGKG9uZSk7Ci0JcmV0dXJuIG47CisgICAgUHlfREVDUkVGKHRtcDMpOworICAgIFB5X0RFQ1JFRih0bXAyKTsKKyAgICBQeV9ERUNSRUYoZGlmZik7CisgICAgUHlfREVDUkVGKHRtcDEpOworICAgIFB5X0RFQ1JFRihvbmUpOworICAgIHJldHVybiBuOwogCiAgIEZhaWw6Ci0JUHlfWERFQ1JFRih0bXAzKTsKLQlQeV9YREVDUkVGKHRtcDIpOwotCVB5X1hERUNSRUYoZGlmZik7Ci0JUHlfWERFQ1JFRih0bXAxKTsKLQlQeV9YREVDUkVGKG9uZSk7Ci0JcmV0dXJuIC0xOworICAgIFB5X1hERUNSRUYodG1wMyk7CisgICAgUHlfWERFQ1JFRih0bXAyKTsKKyAgICBQeV9YREVDUkVGKGRpZmYpOworICAgIFB5X1hERUNSRUYodG1wMSk7CisgICAgUHlfWERFQ1JFRihvbmUpOworICAgIHJldHVybiAtMTsKIH0KIAogLyogSGVscGVyIGZ1bmN0aW9uIGZvciBoYW5kbGVfcmFuZ2VfbG9uZ3MuICBJZiBhcmcgaXMgaW50IG9yIGxvbmcKQEAgLTE3NTUsMjkgKzE3NTUsMjkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZXRfcmFuZ2VfbG9uZ19hcmd1bWVudChQeU9iamVjdCAqYXJnLCBjb25zdCBjaGFyICpuYW1lKQogewotCVB5T2JqZWN0ICp2OwotCVB5TnVtYmVyTWV0aG9kcyAqbmI7Ci0JaWYgKFB5SW50X0NoZWNrKGFyZykgfHwgUHlMb25nX0NoZWNrKGFyZykpIHsKLQkJUHlfSU5DUkVGKGFyZyk7Ci0JCXJldHVybiBhcmc7Ci0JfQotCWlmIChQeUZsb2F0X0NoZWNrKGFyZykgfHwKLQkgICAgKG5iID0gUHlfVFlQRShhcmcpLT50cF9hc19udW1iZXIpID09IE5VTEwgfHwKLQkgICAgbmItPm5iX2ludCA9PSBOVUxMKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgICJyYW5nZSgpIGludGVnZXIgJXMgYXJndW1lbnQgZXhwZWN0ZWQsIGdvdCAlcy4iLAotCQkJICAgICBuYW1lLCBhcmctPm9iX3R5cGUtPnRwX25hbWUpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JdiA9IG5iLT5uYl9pbnQoYXJnKTsKLQlpZiAodiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoUHlJbnRfQ2hlY2sodikgfHwgUHlMb25nX0NoZWNrKHYpKQotCQlyZXR1cm4gdjsKLQlQeV9ERUNSRUYodik7Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCSJfX2ludF9fIHNob3VsZCByZXR1cm4gaW50IG9iamVjdCIpOwotCXJldHVybiBOVUxMOworICAgIFB5T2JqZWN0ICp2OworICAgIFB5TnVtYmVyTWV0aG9kcyAqbmI7CisgICAgaWYgKFB5SW50X0NoZWNrKGFyZykgfHwgUHlMb25nX0NoZWNrKGFyZykpIHsKKyAgICAgICAgUHlfSU5DUkVGKGFyZyk7CisgICAgICAgIHJldHVybiBhcmc7CisgICAgfQorICAgIGlmIChQeUZsb2F0X0NoZWNrKGFyZykgfHwKKyAgICAgICAgKG5iID0gUHlfVFlQRShhcmcpLT50cF9hc19udW1iZXIpID09IE5VTEwgfHwKKyAgICAgICAgbmItPm5iX2ludCA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAicmFuZ2UoKSBpbnRlZ2VyICVzIGFyZ3VtZW50IGV4cGVjdGVkLCBnb3QgJXMuIiwKKyAgICAgICAgICAgICAgICAgICAgIG5hbWUsIGFyZy0+b2JfdHlwZS0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICB2ID0gbmItPm5iX2ludChhcmcpOworICAgIGlmICh2ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChQeUludF9DaGVjayh2KSB8fCBQeUxvbmdfQ2hlY2sodikpCisgICAgICAgIHJldHVybiB2OworICAgIFB5X0RFQ1JFRih2KTsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAiX19pbnRfXyBzaG91bGQgcmV0dXJuIGludCBvYmplY3QiKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogLyogQW4gZXh0ZW5zaW9uIG9mIGJ1aWx0aW5fcmFuZ2UoKSB0aGF0IGhhbmRsZXMgdGhlIGNhc2Ugd2hlbiBQeUxvbmcKQEAgLTE3ODUsMTI5ICsxNzg1LDEyOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGhhbmRsZV9yYW5nZV9sb25ncyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKmlsb3cgPSBOVUxMOwotCVB5T2JqZWN0ICppaGlnaCA9IE5VTEw7Ci0JUHlPYmplY3QgKmlzdGVwID0gTlVMTDsKKyAgICBQeU9iamVjdCAqaWxvdyA9IE5VTEw7CisgICAgUHlPYmplY3QgKmloaWdoID0gTlVMTDsKKyAgICBQeU9iamVjdCAqaXN0ZXAgPSBOVUxMOwogCi0JUHlPYmplY3QgKmxvdyA9IE5VTEw7Ci0JUHlPYmplY3QgKmhpZ2ggPSBOVUxMOwotCVB5T2JqZWN0ICpzdGVwID0gTlVMTDsKKyAgICBQeU9iamVjdCAqbG93ID0gTlVMTDsKKyAgICBQeU9iamVjdCAqaGlnaCA9IE5VTEw7CisgICAgUHlPYmplY3QgKnN0ZXAgPSBOVUxMOwogCi0JUHlPYmplY3QgKmN1cm51bSA9IE5VTEw7Ci0JUHlPYmplY3QgKnYgPSBOVUxMOwotCWxvbmcgYmlnbjsKLQlpbnQgaSwgbjsKLQlpbnQgY21wX3Jlc3VsdDsKKyAgICBQeU9iamVjdCAqY3VybnVtID0gTlVMTDsKKyAgICBQeU9iamVjdCAqdiA9IE5VTEw7CisgICAgbG9uZyBiaWduOworICAgIGludCBpLCBuOworICAgIGludCBjbXBfcmVzdWx0OwogCi0JUHlPYmplY3QgKnplcm8gPSBQeUxvbmdfRnJvbUxvbmcoMCk7CisgICAgUHlPYmplY3QgKnplcm8gPSBQeUxvbmdfRnJvbUxvbmcoMCk7CiAKLQlpZiAoemVybyA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoemVybyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInJhbmdlIiwgMSwgMywgJmlsb3csICZpaGlnaCwgJmlzdGVwKSkgewotCQlQeV9ERUNSRUYoemVybyk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJyYW5nZSIsIDEsIDMsICZpbG93LCAmaWhpZ2gsICZpc3RlcCkpIHsKKyAgICAgICAgUHlfREVDUkVGKHplcm8pOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQkvKiBGaWd1cmUgb3V0IHdoaWNoIHdheSB3ZSB3ZXJlIGNhbGxlZCwgc3VwcGx5IGRlZmF1bHRzLCBhbmQgYmUKLQkgKiBzdXJlIHRvIGluY3JlZiBldmVyeXRoaW5nIHNvIHRoYXQgdGhlIGRlY3JlZnMgYXQgdGhlIGVuZAotCSAqIGFyZSBjb3JyZWN0LiBOQjogaWxvdywgaWhpZ2ggYW5kIGlzdGVwIGFyZSBib3Jyb3dlZCByZWZlcmVuY2VzLgotCSAqLwotCWFzc2VydChpbG93ICE9IE5VTEwpOwotCWlmIChpaGlnaCA9PSBOVUxMKSB7Ci0JCS8qIG9ubHkgMSBhcmcgLS0gaXQncyB0aGUgdXBwZXIgbGltaXQgKi8KLQkJaWhpZ2ggPSBpbG93OwotCQlpbG93ID0gTlVMTDsKLQl9CisgICAgLyogRmlndXJlIG91dCB3aGljaCB3YXkgd2Ugd2VyZSBjYWxsZWQsIHN1cHBseSBkZWZhdWx0cywgYW5kIGJlCisgICAgICogc3VyZSB0byBpbmNyZWYgZXZlcnl0aGluZyBzbyB0aGF0IHRoZSBkZWNyZWZzIGF0IHRoZSBlbmQKKyAgICAgKiBhcmUgY29ycmVjdC4gTkI6IGlsb3csIGloaWdoIGFuZCBpc3RlcCBhcmUgYm9ycm93ZWQgcmVmZXJlbmNlcy4KKyAgICAgKi8KKyAgICBhc3NlcnQoaWxvdyAhPSBOVUxMKTsKKyAgICBpZiAoaWhpZ2ggPT0gTlVMTCkgeworICAgICAgICAvKiBvbmx5IDEgYXJnIC0tIGl0J3MgdGhlIHVwcGVyIGxpbWl0ICovCisgICAgICAgIGloaWdoID0gaWxvdzsKKyAgICAgICAgaWxvdyA9IE5VTEw7CisgICAgfQogCi0JLyogY29udmVydCBpaGlnaCBpZiBuZWNlc3NhcnkgKi8KLQlhc3NlcnQoaWhpZ2ggIT0gTlVMTCk7Ci0JaGlnaCA9IGdldF9yYW5nZV9sb25nX2FyZ3VtZW50KGloaWdoLCAiZW5kIik7Ci0JaWYgKGhpZ2ggPT0gTlVMTCkKLQkJZ290byBGYWlsOworICAgIC8qIGNvbnZlcnQgaWhpZ2ggaWYgbmVjZXNzYXJ5ICovCisgICAgYXNzZXJ0KGloaWdoICE9IE5VTEwpOworICAgIGhpZ2ggPSBnZXRfcmFuZ2VfbG9uZ19hcmd1bWVudChpaGlnaCwgImVuZCIpOworICAgIGlmIChoaWdoID09IE5VTEwpCisgICAgICAgIGdvdG8gRmFpbDsKIAotCS8qIGloaWdoIGNvcnJlY3Qgbm93OyBkbyBpbG93ICovCi0JaWYgKGlsb3cgPT0gTlVMTCkgewotCQlQeV9JTkNSRUYoemVybyk7Ci0JCWxvdyA9IHplcm87Ci0JfQotCWVsc2UgewotCQlsb3cgPSBnZXRfcmFuZ2VfbG9uZ19hcmd1bWVudChpbG93LCAic3RhcnQiKTsKLQkJaWYgKGxvdyA9PSBOVUxMKQotCQkJZ290byBGYWlsOwotCX0KKyAgICAvKiBpaGlnaCBjb3JyZWN0IG5vdzsgZG8gaWxvdyAqLworICAgIGlmIChpbG93ID09IE5VTEwpIHsKKyAgICAgICAgUHlfSU5DUkVGKHplcm8pOworICAgICAgICBsb3cgPSB6ZXJvOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgbG93ID0gZ2V0X3JhbmdlX2xvbmdfYXJndW1lbnQoaWxvdywgInN0YXJ0Iik7CisgICAgICAgIGlmIChsb3cgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gRmFpbDsKKyAgICB9CiAKLQkvKiBpbG93IGFuZCBpaGlnaCBjb3JyZWN0IG5vdzsgZG8gaXN0ZXAgKi8KLQlpZiAoaXN0ZXAgPT0gTlVMTCkKLQkJc3RlcCA9IFB5TG9uZ19Gcm9tTG9uZygxKTsKLQllbHNlCi0JCXN0ZXAgPSBnZXRfcmFuZ2VfbG9uZ19hcmd1bWVudChpc3RlcCwgInN0ZXAiKTsKLQlpZiAoc3RlcCA9PSBOVUxMKQotCQlnb3RvIEZhaWw7CisgICAgLyogaWxvdyBhbmQgaWhpZ2ggY29ycmVjdCBub3c7IGRvIGlzdGVwICovCisgICAgaWYgKGlzdGVwID09IE5VTEwpCisgICAgICAgIHN0ZXAgPSBQeUxvbmdfRnJvbUxvbmcoMSk7CisgICAgZWxzZQorICAgICAgICBzdGVwID0gZ2V0X3JhbmdlX2xvbmdfYXJndW1lbnQoaXN0ZXAsICJzdGVwIik7CisgICAgaWYgKHN0ZXAgPT0gTlVMTCkKKyAgICAgICAgZ290byBGYWlsOwogCi0JaWYgKFB5T2JqZWN0X0NtcChzdGVwLCB6ZXJvLCAmY21wX3Jlc3VsdCkgPT0gLTEpCi0JCWdvdG8gRmFpbDsKKyAgICBpZiAoUHlPYmplY3RfQ21wKHN0ZXAsIHplcm8sICZjbXBfcmVzdWx0KSA9PSAtMSkKKyAgICAgICAgZ290byBGYWlsOwogCi0JaWYgKGNtcF9yZXN1bHQgPT0gMCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkicmFuZ2UoKSBzdGVwIGFyZ3VtZW50IG11c3Qgbm90IGJlIHplcm8iKTsKLQkJZ290byBGYWlsOwotCX0KKyAgICBpZiAoY21wX3Jlc3VsdCA9PSAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInJhbmdlKCkgc3RlcCBhcmd1bWVudCBtdXN0IG5vdCBiZSB6ZXJvIik7CisgICAgICAgIGdvdG8gRmFpbDsKKyAgICB9CiAKLQlpZiAoY21wX3Jlc3VsdCA+IDApCi0JCWJpZ24gPSBnZXRfbGVuX29mX3JhbmdlX2xvbmdzKGxvdywgaGlnaCwgc3RlcCk7Ci0JZWxzZSB7Ci0JCVB5T2JqZWN0ICpuZWdfc3RlcCA9IFB5TnVtYmVyX05lZ2F0aXZlKHN0ZXApOwotCQlpZiAobmVnX3N0ZXAgPT0gTlVMTCkKLQkJCWdvdG8gRmFpbDsKLQkJYmlnbiA9IGdldF9sZW5fb2ZfcmFuZ2VfbG9uZ3MoaGlnaCwgbG93LCBuZWdfc3RlcCk7Ci0JCVB5X0RFQ1JFRihuZWdfc3RlcCk7Ci0JfQorICAgIGlmIChjbXBfcmVzdWx0ID4gMCkKKyAgICAgICAgYmlnbiA9IGdldF9sZW5fb2ZfcmFuZ2VfbG9uZ3MobG93LCBoaWdoLCBzdGVwKTsKKyAgICBlbHNlIHsKKyAgICAgICAgUHlPYmplY3QgKm5lZ19zdGVwID0gUHlOdW1iZXJfTmVnYXRpdmUoc3RlcCk7CisgICAgICAgIGlmIChuZWdfc3RlcCA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBGYWlsOworICAgICAgICBiaWduID0gZ2V0X2xlbl9vZl9yYW5nZV9sb25ncyhoaWdoLCBsb3csIG5lZ19zdGVwKTsKKyAgICAgICAgUHlfREVDUkVGKG5lZ19zdGVwKTsKKyAgICB9CiAKLQluID0gKGludCliaWduOwotCWlmIChiaWduIDwgMCB8fCAobG9uZyluICE9IGJpZ24pIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0JCQkJInJhbmdlKCkgcmVzdWx0IGhhcyB0b28gbWFueSBpdGVtcyIpOwotCQlnb3RvIEZhaWw7Ci0JfQorICAgIG4gPSAoaW50KWJpZ247CisgICAgaWYgKGJpZ24gPCAwIHx8IChsb25nKW4gIT0gYmlnbikgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJyYW5nZSgpIHJlc3VsdCBoYXMgdG9vIG1hbnkgaXRlbXMiKTsKKyAgICAgICAgZ290byBGYWlsOworICAgIH0KIAotCXYgPSBQeUxpc3RfTmV3KG4pOwotCWlmICh2ID09IE5VTEwpCi0JCWdvdG8gRmFpbDsKKyAgICB2ID0gUHlMaXN0X05ldyhuKTsKKyAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICBnb3RvIEZhaWw7CiAKLQljdXJudW0gPSBsb3c7Ci0JUHlfSU5DUkVGKGN1cm51bSk7CisgICAgY3VybnVtID0gbG93OworICAgIFB5X0lOQ1JFRihjdXJudW0pOwogCi0JZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQlQeU9iamVjdCAqdyA9IFB5TnVtYmVyX0xvbmcoY3VybnVtKTsKLQkJUHlPYmplY3QgKnRtcF9udW07Ci0JCWlmICh3ID09IE5VTEwpCi0JCQlnb3RvIEZhaWw7CisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICBQeU9iamVjdCAqdyA9IFB5TnVtYmVyX0xvbmcoY3VybnVtKTsKKyAgICAgICAgUHlPYmplY3QgKnRtcF9udW07CisgICAgICAgIGlmICh3ID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIEZhaWw7CiAKLQkJUHlMaXN0X1NFVF9JVEVNKHYsIGksIHcpOworICAgICAgICBQeUxpc3RfU0VUX0lURU0odiwgaSwgdyk7CiAKLQkJdG1wX251bSA9IFB5TnVtYmVyX0FkZChjdXJudW0sIHN0ZXApOwotCQlpZiAodG1wX251bSA9PSBOVUxMKQotCQkJZ290byBGYWlsOworICAgICAgICB0bXBfbnVtID0gUHlOdW1iZXJfQWRkKGN1cm51bSwgc3RlcCk7CisgICAgICAgIGlmICh0bXBfbnVtID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIEZhaWw7CiAKLQkJUHlfREVDUkVGKGN1cm51bSk7Ci0JCWN1cm51bSA9IHRtcF9udW07Ci0JfQotCVB5X0RFQ1JFRihsb3cpOwotCVB5X0RFQ1JFRihoaWdoKTsKLQlQeV9ERUNSRUYoc3RlcCk7Ci0JUHlfREVDUkVGKHplcm8pOwotCVB5X0RFQ1JFRihjdXJudW0pOwotCXJldHVybiB2OworICAgICAgICBQeV9ERUNSRUYoY3VybnVtKTsKKyAgICAgICAgY3VybnVtID0gdG1wX251bTsKKyAgICB9CisgICAgUHlfREVDUkVGKGxvdyk7CisgICAgUHlfREVDUkVGKGhpZ2gpOworICAgIFB5X0RFQ1JFRihzdGVwKTsKKyAgICBQeV9ERUNSRUYoemVybyk7CisgICAgUHlfREVDUkVGKGN1cm51bSk7CisgICAgcmV0dXJuIHY7CiAKICAgRmFpbDoKLQlQeV9YREVDUkVGKGxvdyk7Ci0JUHlfWERFQ1JFRihoaWdoKTsKLQlQeV9YREVDUkVGKHN0ZXApOwotCVB5X0RFQ1JFRih6ZXJvKTsKLQlQeV9YREVDUkVGKGN1cm51bSk7Ci0JUHlfWERFQ1JFRih2KTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeV9YREVDUkVGKGxvdyk7CisgICAgUHlfWERFQ1JFRihoaWdoKTsKKyAgICBQeV9YREVDUkVGKHN0ZXApOworICAgIFB5X0RFQ1JFRih6ZXJvKTsKKyAgICBQeV9YREVDUkVGKGN1cm51bSk7CisgICAgUHlfWERFQ1JFRih2KTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogLyogUmV0dXJuIG51bWJlciBvZiBpdGVtcyBpbiByYW5nZS94cmFuZ2UgKGxvLCBoaSwgc3RlcCkuICBzdGVwID4gMApAQCAtMTkxNyw4MSArMTkxNyw4MSBAQAogc3RhdGljIGxvbmcKIGdldF9sZW5fb2ZfcmFuZ2UobG9uZyBsbywgbG9uZyBoaSwgbG9uZyBzdGVwKQogewotCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlJZiBsbyA+PSBoaSwgdGhlIHJhbmdlIGlzIGVtcHR5LgotCUVsc2UgaWYgbiB2YWx1ZXMgYXJlIGluIHRoZSByYW5nZSwgdGhlIGxhc3Qgb25lIGlzCi0JbG8gKyAobi0xKSpzdGVwLCB3aGljaCBtdXN0IGJlIDw9IGhpLTEuICBSZWFycmFuZ2luZywKLQluIDw9IChoaSAtIGxvIC0gMSkvc3RlcCArIDEsIHNvIHRha2luZyB0aGUgZmxvb3Igb2YgdGhlIFJIUyBnaXZlcwotCXRoZSBwcm9wZXIgdmFsdWUuICBTaW5jZSBsbyA8IGhpIGluIHRoaXMgY2FzZSwgaGktbG8tMSA+PSAwLCBzbwotCXRoZSBSSFMgaXMgbm9uLW5lZ2F0aXZlIGFuZCBzbyB0cnVuY2F0aW9uIGlzIHRoZSBzYW1lIGFzIHRoZQotCWZsb29yLiAgTGV0dGluZyBNIGJlIHRoZSBsYXJnZXN0IHBvc2l0aXZlIGxvbmcsIHRoZSB3b3JzdCBjYXNlCi0JZm9yIHRoZSBSSFMgbnVtZXJhdG9yIGlzIGhpPU0sIGxvPS1NLTEsIGFuZCB0aGVuCi0JaGktbG8tMSA9IE0tKC1NLTEpLTEgPSAyKk0uICBUaGVyZWZvcmUgdW5zaWduZWQgbG9uZyBoYXMgZW5vdWdoCi0JcHJlY2lzaW9uIHRvIGNvbXB1dGUgdGhlIFJIUyBleGFjdGx5LgotCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0JbG9uZyBuID0gMDsKLQlpZiAobG8gPCBoaSkgewotCQl1bnNpZ25lZCBsb25nIHVoaSA9ICh1bnNpZ25lZCBsb25nKWhpOwotCQl1bnNpZ25lZCBsb25nIHVsbyA9ICh1bnNpZ25lZCBsb25nKWxvOwotCQl1bnNpZ25lZCBsb25nIGRpZmYgPSB1aGkgLSB1bG8gLSAxOwotCQluID0gKGxvbmcpKGRpZmYgLyAodW5zaWduZWQgbG9uZylzdGVwICsgMSk7Ci0JfQotCXJldHVybiBuOworICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBJZiBsbyA+PSBoaSwgdGhlIHJhbmdlIGlzIGVtcHR5LgorICAgIEVsc2UgaWYgbiB2YWx1ZXMgYXJlIGluIHRoZSByYW5nZSwgdGhlIGxhc3Qgb25lIGlzCisgICAgbG8gKyAobi0xKSpzdGVwLCB3aGljaCBtdXN0IGJlIDw9IGhpLTEuICBSZWFycmFuZ2luZywKKyAgICBuIDw9IChoaSAtIGxvIC0gMSkvc3RlcCArIDEsIHNvIHRha2luZyB0aGUgZmxvb3Igb2YgdGhlIFJIUyBnaXZlcworICAgIHRoZSBwcm9wZXIgdmFsdWUuICBTaW5jZSBsbyA8IGhpIGluIHRoaXMgY2FzZSwgaGktbG8tMSA+PSAwLCBzbworICAgIHRoZSBSSFMgaXMgbm9uLW5lZ2F0aXZlIGFuZCBzbyB0cnVuY2F0aW9uIGlzIHRoZSBzYW1lIGFzIHRoZQorICAgIGZsb29yLiAgTGV0dGluZyBNIGJlIHRoZSBsYXJnZXN0IHBvc2l0aXZlIGxvbmcsIHRoZSB3b3JzdCBjYXNlCisgICAgZm9yIHRoZSBSSFMgbnVtZXJhdG9yIGlzIGhpPU0sIGxvPS1NLTEsIGFuZCB0aGVuCisgICAgaGktbG8tMSA9IE0tKC1NLTEpLTEgPSAyKk0uICBUaGVyZWZvcmUgdW5zaWduZWQgbG9uZyBoYXMgZW5vdWdoCisgICAgcHJlY2lzaW9uIHRvIGNvbXB1dGUgdGhlIFJIUyBleGFjdGx5LgorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgbG9uZyBuID0gMDsKKyAgICBpZiAobG8gPCBoaSkgeworICAgICAgICB1bnNpZ25lZCBsb25nIHVoaSA9ICh1bnNpZ25lZCBsb25nKWhpOworICAgICAgICB1bnNpZ25lZCBsb25nIHVsbyA9ICh1bnNpZ25lZCBsb25nKWxvOworICAgICAgICB1bnNpZ25lZCBsb25nIGRpZmYgPSB1aGkgLSB1bG8gLSAxOworICAgICAgICBuID0gKGxvbmcpKGRpZmYgLyAodW5zaWduZWQgbG9uZylzdGVwICsgMSk7CisgICAgfQorICAgIHJldHVybiBuOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYnVpbHRpbl9yYW5nZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBpbG93ID0gMCwgaWhpZ2ggPSAwLCBpc3RlcCA9IDE7Ci0JbG9uZyBiaWduOwotCWludCBpLCBuOworICAgIGxvbmcgaWxvdyA9IDAsIGloaWdoID0gMCwgaXN0ZXAgPSAxOworICAgIGxvbmcgYmlnbjsKKyAgICBpbnQgaSwgbjsKIAotCVB5T2JqZWN0ICp2OworICAgIFB5T2JqZWN0ICp2OwogCi0JaWYgKFB5VHVwbGVfU2l6ZShhcmdzKSA8PSAxKSB7Ci0JCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLAotCQkJCSJsO3JhbmdlKCkgcmVxdWlyZXMgMS0zIGludCBhcmd1bWVudHMiLAotCQkJCSZpaGlnaCkpIHsKLQkJCVB5RXJyX0NsZWFyKCk7Ci0JCQlyZXR1cm4gaGFuZGxlX3JhbmdlX2xvbmdzKHNlbGYsIGFyZ3MpOwotCQl9Ci0JfQotCWVsc2UgewotCQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywKLQkJCQkibGx8bDtyYW5nZSgpIHJlcXVpcmVzIDEtMyBpbnQgYXJndW1lbnRzIiwKLQkJCQkmaWxvdywgJmloaWdoLCAmaXN0ZXApKSB7Ci0JCQlQeUVycl9DbGVhcigpOwotCQkJcmV0dXJuIGhhbmRsZV9yYW5nZV9sb25ncyhzZWxmLCBhcmdzKTsKLQkJfQotCX0KLQlpZiAoaXN0ZXAgPT0gMCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkicmFuZ2UoKSBzdGVwIGFyZ3VtZW50IG11c3Qgbm90IGJlIHplcm8iKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChpc3RlcCA+IDApCi0JCWJpZ24gPSBnZXRfbGVuX29mX3JhbmdlKGlsb3csIGloaWdoLCBpc3RlcCk7Ci0JZWxzZQotCQliaWduID0gZ2V0X2xlbl9vZl9yYW5nZShpaGlnaCwgaWxvdywgLWlzdGVwKTsKLQluID0gKGludCliaWduOwotCWlmIChiaWduIDwgMCB8fCAobG9uZyluICE9IGJpZ24pIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0JCQkJInJhbmdlKCkgcmVzdWx0IGhhcyB0b28gbWFueSBpdGVtcyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JdiA9IFB5TGlzdF9OZXcobik7Ci0JaWYgKHYgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQlQeU9iamVjdCAqdyA9IFB5SW50X0Zyb21Mb25nKGlsb3cpOwotCQlpZiAodyA9PSBOVUxMKSB7Ci0JCQlQeV9ERUNSRUYodik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlQeUxpc3RfU0VUX0lURU0odiwgaSwgdyk7Ci0JCWlsb3cgKz0gaXN0ZXA7Ci0JfQotCXJldHVybiB2OworICAgIGlmIChQeVR1cGxlX1NpemUoYXJncykgPD0gMSkgeworICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICJsO3JhbmdlKCkgcmVxdWlyZXMgMS0zIGludCBhcmd1bWVudHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgJmloaWdoKSkgeworICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgIHJldHVybiBoYW5kbGVfcmFuZ2VfbG9uZ3Moc2VsZiwgYXJncyk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgImxsfGw7cmFuZ2UoKSByZXF1aXJlcyAxLTMgaW50IGFyZ3VtZW50cyIsCisgICAgICAgICAgICAgICAgICAgICAgICAmaWxvdywgJmloaWdoLCAmaXN0ZXApKSB7CisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgcmV0dXJuIGhhbmRsZV9yYW5nZV9sb25ncyhzZWxmLCBhcmdzKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoaXN0ZXAgPT0gMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJyYW5nZSgpIHN0ZXAgYXJndW1lbnQgbXVzdCBub3QgYmUgemVybyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKGlzdGVwID4gMCkKKyAgICAgICAgYmlnbiA9IGdldF9sZW5fb2ZfcmFuZ2UoaWxvdywgaWhpZ2gsIGlzdGVwKTsKKyAgICBlbHNlCisgICAgICAgIGJpZ24gPSBnZXRfbGVuX29mX3JhbmdlKGloaWdoLCBpbG93LCAtaXN0ZXApOworICAgIG4gPSAoaW50KWJpZ247CisgICAgaWYgKGJpZ24gPCAwIHx8IChsb25nKW4gIT0gYmlnbikgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJyYW5nZSgpIHJlc3VsdCBoYXMgdG9vIG1hbnkgaXRlbXMiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHYgPSBQeUxpc3RfTmV3KG4pOworICAgIGlmICh2ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgUHlPYmplY3QgKncgPSBQeUludF9Gcm9tTG9uZyhpbG93KTsKKyAgICAgICAgaWYgKHcgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgUHlMaXN0X1NFVF9JVEVNKHYsIGksIHcpOworICAgICAgICBpbG93ICs9IGlzdGVwOworICAgIH0KKyAgICByZXR1cm4gdjsKIH0KIAogUHlEb2NfU1RSVkFSKHJhbmdlX2RvYywKQEAgLTIwMDcsNzUgKzIwMDcsNzUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBidWlsdGluX3Jhd19pbnB1dChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKnYgPSBOVUxMOwotCVB5T2JqZWN0ICpmaW4gPSBQeVN5c19HZXRPYmplY3QoInN0ZGluIik7Ci0JUHlPYmplY3QgKmZvdXQgPSBQeVN5c19HZXRPYmplY3QoInN0ZG91dCIpOworICAgIFB5T2JqZWN0ICp2ID0gTlVMTDsKKyAgICBQeU9iamVjdCAqZmluID0gUHlTeXNfR2V0T2JqZWN0KCJzdGRpbiIpOworICAgIFB5T2JqZWN0ICpmb3V0ID0gUHlTeXNfR2V0T2JqZWN0KCJzdGRvdXQiKTsKIAotCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgIltyYXdfXWlucHV0IiwgMCwgMSwgJnYpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJbcmF3X11pbnB1dCIsIDAsIDEsICZ2KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoZmluID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgIltyYXdfXWlucHV0OiBsb3N0IHN5cy5zdGRpbiIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKGZvdXQgPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAiW3Jhd19daW5wdXQ6IGxvc3Qgc3lzLnN0ZG91dCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKFB5RmlsZV9Tb2Z0U3BhY2UoZm91dCwgMCkpIHsKLQkJaWYgKFB5RmlsZV9Xcml0ZVN0cmluZygiICIsIGZvdXQpICE9IDApCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKFB5RmlsZV9Bc0ZpbGUoZmluKSAmJiBQeUZpbGVfQXNGaWxlKGZvdXQpCi0gICAgICAgICAgICAmJiBpc2F0dHkoZmlsZW5vKFB5RmlsZV9Bc0ZpbGUoZmluKSkpCi0gICAgICAgICAgICAmJiBpc2F0dHkoZmlsZW5vKFB5RmlsZV9Bc0ZpbGUoZm91dCkpKSkgewotCQlQeU9iamVjdCAqcG87Ci0JCWNoYXIgKnByb21wdDsKLQkJY2hhciAqczsKLQkJUHlPYmplY3QgKnJlc3VsdDsKLQkJaWYgKHYgIT0gTlVMTCkgewotCQkJcG8gPSBQeU9iamVjdF9TdHIodik7Ci0JCQlpZiAocG8gPT0gTlVMTCkKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCXByb21wdCA9IFB5U3RyaW5nX0FzU3RyaW5nKHBvKTsKLQkJCWlmIChwcm9tcHQgPT0gTlVMTCkKLQkJCQlyZXR1cm4gTlVMTDsKLQkJfQotCQllbHNlIHsKLQkJCXBvID0gTlVMTDsKLQkJCXByb21wdCA9ICIiOwotCQl9Ci0JCXMgPSBQeU9TX1JlYWRsaW5lKFB5RmlsZV9Bc0ZpbGUoZmluKSwgUHlGaWxlX0FzRmlsZShmb3V0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9tcHQpOwotCQlQeV9YREVDUkVGKHBvKTsKLQkJaWYgKHMgPT0gTlVMTCkgewotCQkJaWYgKCFQeUVycl9PY2N1cnJlZCgpKQotCQkJCVB5RXJyX1NldE5vbmUoUHlFeGNfS2V5Ym9hcmRJbnRlcnJ1cHQpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJaWYgKCpzID09ICdcMCcpIHsKLQkJCVB5RXJyX1NldE5vbmUoUHlFeGNfRU9GRXJyb3IpOwotCQkJcmVzdWx0ID0gTlVMTDsKLQkJfQotCQllbHNlIHsgLyogc3RyaXAgdHJhaWxpbmcgJ1xuJyAqLwotCQkJc2l6ZV90IGxlbiA9IHN0cmxlbihzKTsKLQkJCWlmIChsZW4gPiBQWV9TU0laRV9UX01BWCkgewotCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJCQkJIltyYXdfXWlucHV0OiBpbnB1dCB0b28gbG9uZyIpOwotCQkJCXJlc3VsdCA9IE5VTEw7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZXN1bHQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzLCBsZW4tMSk7Ci0JCQl9Ci0JCX0KLQkJUHlNZW1fRlJFRShzKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JaWYgKHYgIT0gTlVMTCkgewotCQlpZiAoUHlGaWxlX1dyaXRlT2JqZWN0KHYsIGZvdXQsIFB5X1BSSU5UX1JBVykgIT0gMCkKLQkJCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gUHlGaWxlX0dldExpbmUoZmluLCAtMSk7CisgICAgaWYgKGZpbiA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJbcmF3X11pbnB1dDogbG9zdCBzeXMuc3RkaW4iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChmb3V0ID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgIltyYXdfXWlucHV0OiBsb3N0IHN5cy5zdGRvdXQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChQeUZpbGVfU29mdFNwYWNlKGZvdXQsIDApKSB7CisgICAgICAgIGlmIChQeUZpbGVfV3JpdGVTdHJpbmcoIiAiLCBmb3V0KSAhPSAwKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChQeUZpbGVfQXNGaWxlKGZpbikgJiYgUHlGaWxlX0FzRmlsZShmb3V0KQorICAgICAgICAmJiBpc2F0dHkoZmlsZW5vKFB5RmlsZV9Bc0ZpbGUoZmluKSkpCisgICAgICAgICYmIGlzYXR0eShmaWxlbm8oUHlGaWxlX0FzRmlsZShmb3V0KSkpKSB7CisgICAgICAgIFB5T2JqZWN0ICpwbzsKKyAgICAgICAgY2hhciAqcHJvbXB0OworICAgICAgICBjaGFyICpzOworICAgICAgICBQeU9iamVjdCAqcmVzdWx0OworICAgICAgICBpZiAodiAhPSBOVUxMKSB7CisgICAgICAgICAgICBwbyA9IFB5T2JqZWN0X1N0cih2KTsKKyAgICAgICAgICAgIGlmIChwbyA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgcHJvbXB0ID0gUHlTdHJpbmdfQXNTdHJpbmcocG8pOworICAgICAgICAgICAgaWYgKHByb21wdCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcG8gPSBOVUxMOworICAgICAgICAgICAgcHJvbXB0ID0gIiI7CisgICAgICAgIH0KKyAgICAgICAgcyA9IFB5T1NfUmVhZGxpbmUoUHlGaWxlX0FzRmlsZShmaW4pLCBQeUZpbGVfQXNGaWxlKGZvdXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9tcHQpOworICAgICAgICBQeV9YREVDUkVGKHBvKTsKKyAgICAgICAgaWYgKHMgPT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKCFQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgICAgIFB5RXJyX1NldE5vbmUoUHlFeGNfS2V5Ym9hcmRJbnRlcnJ1cHQpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCpzID09ICdcMCcpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldE5vbmUoUHlFeGNfRU9GRXJyb3IpOworICAgICAgICAgICAgcmVzdWx0ID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsgLyogc3RyaXAgdHJhaWxpbmcgJ1xuJyAqLworICAgICAgICAgICAgc2l6ZV90IGxlbiA9IHN0cmxlbihzKTsKKyAgICAgICAgICAgIGlmIChsZW4gPiBQWV9TU0laRV9UX01BWCkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiW3Jhd19daW5wdXQ6IGlucHV0IHRvbyBsb25nIik7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHMsIGxlbi0xKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBQeU1lbV9GUkVFKHMpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICBpZiAodiAhPSBOVUxMKSB7CisgICAgICAgIGlmIChQeUZpbGVfV3JpdGVPYmplY3QodiwgZm91dCwgUHlfUFJJTlRfUkFXKSAhPSAwKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBQeUZpbGVfR2V0TGluZShmaW4sIC0xKTsKIH0KIAogUHlEb2NfU1RSVkFSKHJhd19pbnB1dF9kb2MsCkBAIC0yMDkwLDIyICsyMDkwLDIyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogYnVpbHRpbl9yZWR1Y2UoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXN0YXRpYyBQeU9iamVjdCAqZnVuY3Rvb2xzX3JlZHVjZSA9IE5VTEw7CisgICAgc3RhdGljIFB5T2JqZWN0ICpmdW5jdG9vbHNfcmVkdWNlID0gTlVMTDsKIAotCWlmIChQeUVycl9XYXJuUHkzaygicmVkdWNlKCkgbm90IHN1cHBvcnRlZCBpbiAzLng7ICIKLQkJCSAgICJ1c2UgZnVuY3Rvb2xzLnJlZHVjZSgpIiwgMSkgPCAwKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoUHlFcnJfV2FyblB5M2soInJlZHVjZSgpIG5vdCBzdXBwb3J0ZWQgaW4gMy54OyAiCisgICAgICAgICAgICAgICAgICAgICAgICJ1c2UgZnVuY3Rvb2xzLnJlZHVjZSgpIiwgMSkgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChmdW5jdG9vbHNfcmVkdWNlID09IE5VTEwpIHsKLQkJUHlPYmplY3QgKmZ1bmN0b29scyA9IFB5SW1wb3J0X0ltcG9ydE1vZHVsZSgiZnVuY3Rvb2xzIik7Ci0JCWlmIChmdW5jdG9vbHMgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQlmdW5jdG9vbHNfcmVkdWNlID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhmdW5jdG9vbHMsICJyZWR1Y2UiKTsKLQkJUHlfREVDUkVGKGZ1bmN0b29scyk7Ci0JCWlmIChmdW5jdG9vbHNfcmVkdWNlID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIFB5T2JqZWN0X0NhbGwoZnVuY3Rvb2xzX3JlZHVjZSwgYXJncywgTlVMTCk7CisgICAgaWYgKGZ1bmN0b29sc19yZWR1Y2UgPT0gTlVMTCkgeworICAgICAgICBQeU9iamVjdCAqZnVuY3Rvb2xzID0gUHlJbXBvcnRfSW1wb3J0TW9kdWxlKCJmdW5jdG9vbHMiKTsKKyAgICAgICAgaWYgKGZ1bmN0b29scyA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGZ1bmN0b29sc19yZWR1Y2UgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKGZ1bmN0b29scywgInJlZHVjZSIpOworICAgICAgICBQeV9ERUNSRUYoZnVuY3Rvb2xzKTsKKyAgICAgICAgaWYgKGZ1bmN0b29sc19yZWR1Y2UgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlPYmplY3RfQ2FsbChmdW5jdG9vbHNfcmVkdWNlLCBhcmdzLCBOVUxMKTsKIH0KIAogUHlEb2NfU1RSVkFSKHJlZHVjZV9kb2MsCkBAIC0yMTIyLDExICsyMTIyLDExIEBACiBzdGF0aWMgUHlPYmplY3QgKgogYnVpbHRpbl9yZWxvYWQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp2KQogewotCWlmIChQeUVycl9XYXJuUHkzaygiSW4gMy54LCByZWxvYWQoKSBpcyByZW5hbWVkIHRvIGltcC5yZWxvYWQoKSIsCi0JCQkgICAxKSA8IDApCi0JCXJldHVybiBOVUxMOworICAgIGlmIChQeUVycl9XYXJuUHkzaygiSW4gMy54LCByZWxvYWQoKSBpcyByZW5hbWVkIHRvIGltcC5yZWxvYWQoKSIsCisgICAgICAgICAgICAgICAgICAgICAgIDEpIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlyZXR1cm4gUHlJbXBvcnRfUmVsb2FkTW9kdWxlKHYpOworICAgIHJldHVybiBQeUltcG9ydF9SZWxvYWRNb2R1bGUodik7CiB9CiAKIFB5RG9jX1NUUlZBUihyZWxvYWRfZG9jLApAQCAtMjEzOCw3ICsyMTM4LDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBidWlsdGluX3JlcHIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp2KQogewotCXJldHVybiBQeU9iamVjdF9SZXByKHYpOworICAgIHJldHVybiBQeU9iamVjdF9SZXByKHYpOwogfQogCiBQeURvY19TVFJWQVIocmVwcl9kb2MsCkBAIC0yMTUxLDM2ICsyMTUxLDM2IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYnVpbHRpbl9yb3VuZChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCWRvdWJsZSBudW1iZXIsIGFic19udW1iZXIsIGFic19yZXN1bHQ7Ci0JZG91YmxlIGY7Ci0JaW50IG5kaWdpdHMgPSAwOwotCWludCBpOwotCXN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsibnVtYmVyIiwgIm5kaWdpdHMiLCAwfTsKKyAgICBkb3VibGUgbnVtYmVyLCBhYnNfbnVtYmVyLCBhYnNfcmVzdWx0OworICAgIGRvdWJsZSBmOworICAgIGludCBuZGlnaXRzID0gMDsKKyAgICBpbnQgaTsKKyAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7Im51bWJlciIsICJuZGlnaXRzIiwgMH07CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAiZHxpOnJvdW5kIiwKLQkJa3dsaXN0LCAmbnVtYmVyLCAmbmRpZ2l0cykpCi0JCXJldHVybiBOVUxMOwotCWYgPSAxLjA7Ci0JaSA9IGFicyhuZGlnaXRzKTsKLQl3aGlsZSAgKC0taSA+PSAwKQotCQlmID0gZioxMC4wOwotCWlmIChuZGlnaXRzIDwgMCkKLQkJbnVtYmVyIC89IGY7Ci0JZWxzZQotCQludW1iZXIgKj0gZjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAiZHxpOnJvdW5kIiwKKyAgICAgICAga3dsaXN0LCAmbnVtYmVyLCAmbmRpZ2l0cykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGYgPSAxLjA7CisgICAgaSA9IGFicyhuZGlnaXRzKTsKKyAgICB3aGlsZSAgKC0taSA+PSAwKQorICAgICAgICBmID0gZioxMC4wOworICAgIGlmIChuZGlnaXRzIDwgMCkKKyAgICAgICAgbnVtYmVyIC89IGY7CisgICAgZWxzZQorICAgICAgICBudW1iZXIgKj0gZjsKIAotCS8qIHJvdW5kIGBudW1iZXJgIHRvIG5lYXJlc3QgaW50ZWdlciwgcm91bmRpbmcgaGFsdmVzIGF3YXkgZnJvbSB6ZXJvICovCi0JYWJzX251bWJlciA9IGZhYnMobnVtYmVyKTsKLQlhYnNfcmVzdWx0ID0gZmxvb3IoYWJzX251bWJlcik7Ci0JaWYgKGFic19udW1iZXIgLSBhYnNfcmVzdWx0ID49IDAuNSkKLQkJYWJzX3Jlc3VsdCArPSAxLjA7Ci0JbnVtYmVyID0gY29weXNpZ24oYWJzX3Jlc3VsdCwgbnVtYmVyKTsKKyAgICAvKiByb3VuZCBgbnVtYmVyYCB0byBuZWFyZXN0IGludGVnZXIsIHJvdW5kaW5nIGhhbHZlcyBhd2F5IGZyb20gemVybyAqLworICAgIGFic19udW1iZXIgPSBmYWJzKG51bWJlcik7CisgICAgYWJzX3Jlc3VsdCA9IGZsb29yKGFic19udW1iZXIpOworICAgIGlmIChhYnNfbnVtYmVyIC0gYWJzX3Jlc3VsdCA+PSAwLjUpCisgICAgICAgIGFic19yZXN1bHQgKz0gMS4wOworICAgIG51bWJlciA9IGNvcHlzaWduKGFic19yZXN1bHQsIG51bWJlcik7CiAKLQlpZiAobmRpZ2l0cyA8IDApCi0JCW51bWJlciAqPSBmOwotCWVsc2UKLQkJbnVtYmVyIC89IGY7Ci0JcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShudW1iZXIpOworICAgIGlmIChuZGlnaXRzIDwgMCkKKyAgICAgICAgbnVtYmVyICo9IGY7CisgICAgZWxzZQorICAgICAgICBudW1iZXIgLz0gZjsKKyAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKG51bWJlcik7CiB9CiAKIFB5RG9jX1NUUlZBUihyb3VuZF9kb2MsCkBAIC0yMTkyLDQyICsyMTkyLDQyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogYnVpbHRpbl9zb3J0ZWQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlQeU9iamVjdCAqbmV3bGlzdCwgKnYsICpzZXEsICpjb21wYXJlPU5VTEwsICprZXlmdW5jPU5VTEwsICpuZXdhcmdzOwotCVB5T2JqZWN0ICpjYWxsYWJsZTsKLQlzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7Iml0ZXJhYmxlIiwgImNtcCIsICJrZXkiLCAicmV2ZXJzZSIsIDB9OwotCWludCByZXZlcnNlOworICAgIFB5T2JqZWN0ICpuZXdsaXN0LCAqdiwgKnNlcSwgKmNvbXBhcmU9TlVMTCwgKmtleWZ1bmM9TlVMTCwgKm5ld2FyZ3M7CisgICAgUHlPYmplY3QgKmNhbGxhYmxlOworICAgIHN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsiaXRlcmFibGUiLCAiY21wIiwgImtleSIsICJyZXZlcnNlIiwgMH07CisgICAgaW50IHJldmVyc2U7CiAKLQkvKiBhcmdzIDEtNCBzaG91bGQgbWF0Y2ggbGlzdHNvcnQgaW4gT2JqZWN0cy9saXN0b2JqZWN0LmMgKi8KLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAiT3xPT2k6c29ydGVkIiwKLQkJa3dsaXN0LCAmc2VxLCAmY29tcGFyZSwgJmtleWZ1bmMsICZyZXZlcnNlKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgLyogYXJncyAxLTQgc2hvdWxkIG1hdGNoIGxpc3Rzb3J0IGluIE9iamVjdHMvbGlzdG9iamVjdC5jICovCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgIk98T09pOnNvcnRlZCIsCisgICAgICAgIGt3bGlzdCwgJnNlcSwgJmNvbXBhcmUsICZrZXlmdW5jLCAmcmV2ZXJzZSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JbmV3bGlzdCA9IFB5U2VxdWVuY2VfTGlzdChzZXEpOwotCWlmIChuZXdsaXN0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIG5ld2xpc3QgPSBQeVNlcXVlbmNlX0xpc3Qoc2VxKTsKKyAgICBpZiAobmV3bGlzdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWNhbGxhYmxlID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhuZXdsaXN0LCAic29ydCIpOwotCWlmIChjYWxsYWJsZSA9PSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRihuZXdsaXN0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGNhbGxhYmxlID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhuZXdsaXN0LCAic29ydCIpOworICAgIGlmIChjYWxsYWJsZSA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihuZXdsaXN0KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JbmV3YXJncyA9IFB5VHVwbGVfR2V0U2xpY2UoYXJncywgMSwgNCk7Ci0JaWYgKG5ld2FyZ3MgPT0gTlVMTCkgewotCQlQeV9ERUNSRUYobmV3bGlzdCk7Ci0JCVB5X0RFQ1JFRihjYWxsYWJsZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBuZXdhcmdzID0gUHlUdXBsZV9HZXRTbGljZShhcmdzLCAxLCA0KTsKKyAgICBpZiAobmV3YXJncyA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihuZXdsaXN0KTsKKyAgICAgICAgUHlfREVDUkVGKGNhbGxhYmxlKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JdiA9IFB5T2JqZWN0X0NhbGwoY2FsbGFibGUsIG5ld2FyZ3MsIGt3ZHMpOwotCVB5X0RFQ1JFRihuZXdhcmdzKTsKLQlQeV9ERUNSRUYoY2FsbGFibGUpOwotCWlmICh2ID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKG5ld2xpc3QpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JUHlfREVDUkVGKHYpOwotCXJldHVybiBuZXdsaXN0OworICAgIHYgPSBQeU9iamVjdF9DYWxsKGNhbGxhYmxlLCBuZXdhcmdzLCBrd2RzKTsKKyAgICBQeV9ERUNSRUYobmV3YXJncyk7CisgICAgUHlfREVDUkVGKGNhbGxhYmxlKTsKKyAgICBpZiAodiA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihuZXdsaXN0KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5X0RFQ1JFRih2KTsKKyAgICByZXR1cm4gbmV3bGlzdDsKIH0KIAogUHlEb2NfU1RSVkFSKHNvcnRlZF9kb2MsCkBAIC0yMjM2LDMwICsyMjM2LDMwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogYnVpbHRpbl92YXJzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqdiA9IE5VTEw7Ci0JUHlPYmplY3QgKmQ7CisgICAgUHlPYmplY3QgKnYgPSBOVUxMOworICAgIFB5T2JqZWN0ICpkOwogCi0JaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAidmFycyIsIDAsIDEsICZ2KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKHYgPT0gTlVMTCkgewotCQlkID0gUHlFdmFsX0dldExvY2FscygpOwotCQlpZiAoZCA9PSBOVUxMKSB7Ci0JCQlpZiAoIVB5RXJyX09jY3VycmVkKCkpCi0JCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAotCQkJCQkJInZhcnMoKTogbm8gbG9jYWxzIT8iKTsKLQkJfQotCQllbHNlCi0JCQlQeV9JTkNSRUYoZCk7Ci0JfQotCWVsc2UgewotCQlkID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyh2LCAiX19kaWN0X18iKTsKLQkJaWYgKGQgPT0gTlVMTCkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAidmFycygpIGFyZ3VtZW50IG11c3QgaGF2ZSBfX2RpY3RfXyBhdHRyaWJ1dGUiKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQotCXJldHVybiBkOworICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInZhcnMiLCAwLCAxLCAmdikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICh2ID09IE5VTEwpIHsKKyAgICAgICAgZCA9IFB5RXZhbF9HZXRMb2NhbHMoKTsKKyAgICAgICAgaWYgKGQgPT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKCFQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhcnMoKTogbm8gbG9jYWxzIT8iKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBQeV9JTkNSRUYoZCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBkID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyh2LCAiX19kaWN0X18iKTsKKyAgICAgICAgaWYgKGQgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAidmFycygpIGFyZ3VtZW50IG11c3QgaGF2ZSBfX2RpY3RfXyBhdHRyaWJ1dGUiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBkOwogfQogCiBQeURvY19TVFJWQVIodmFyc19kb2MsCkBAIC0yMjcyLDEzMSArMjI3MiwxMzEgQEAKIHN0YXRpYyBQeU9iamVjdCoKIGJ1aWx0aW5fc3VtKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqc2VxOwotCVB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOwotCVB5T2JqZWN0ICp0ZW1wLCAqaXRlbSwgKml0ZXI7CisgICAgUHlPYmplY3QgKnNlcTsKKyAgICBQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKKyAgICBQeU9iamVjdCAqdGVtcCwgKml0ZW0sICppdGVyOwogCi0JaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAic3VtIiwgMSwgMiwgJnNlcSwgJnJlc3VsdCkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInN1bSIsIDEsIDIsICZzZXEsICZyZXN1bHQpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWl0ZXIgPSBQeU9iamVjdF9HZXRJdGVyKHNlcSk7Ci0JaWYgKGl0ZXIgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgaXRlciA9IFB5T2JqZWN0X0dldEl0ZXIoc2VxKTsKKyAgICBpZiAoaXRlciA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChyZXN1bHQgPT0gTlVMTCkgewotCQlyZXN1bHQgPSBQeUludF9Gcm9tTG9uZygwKTsKLQkJaWYgKHJlc3VsdCA9PSBOVUxMKSB7Ci0JCQlQeV9ERUNSRUYoaXRlcik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0gZWxzZSB7Ci0JCS8qIHJlamVjdCBzdHJpbmcgdmFsdWVzIGZvciAnc3RhcnQnIHBhcmFtZXRlciAqLwotCQlpZiAoUHlPYmplY3RfVHlwZUNoZWNrKHJlc3VsdCwgJlB5QmFzZVN0cmluZ19UeXBlKSkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkic3VtKCkgY2FuJ3Qgc3VtIHN0cmluZ3MgW3VzZSAnJy5qb2luKHNlcSkgaW5zdGVhZF0iKTsKLQkJCVB5X0RFQ1JFRihpdGVyKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCVB5X0lOQ1JFRihyZXN1bHQpOwotCX0KKyAgICBpZiAocmVzdWx0ID09IE5VTEwpIHsKKyAgICAgICAgcmVzdWx0ID0gUHlJbnRfRnJvbUxvbmcoMCk7CisgICAgICAgIGlmIChyZXN1bHQgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKGl0ZXIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvKiByZWplY3Qgc3RyaW5nIHZhbHVlcyBmb3IgJ3N0YXJ0JyBwYXJhbWV0ZXIgKi8KKyAgICAgICAgaWYgKFB5T2JqZWN0X1R5cGVDaGVjayhyZXN1bHQsICZQeUJhc2VTdHJpbmdfVHlwZSkpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgInN1bSgpIGNhbid0IHN1bSBzdHJpbmdzIFt1c2UgJycuam9pbihzZXEpIGluc3RlYWRdIik7CisgICAgICAgICAgICBQeV9ERUNSRUYoaXRlcik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBQeV9JTkNSRUYocmVzdWx0KTsKKyAgICB9CiAKICNpZm5kZWYgU0xPV19TVU0KLQkvKiBGYXN0IGFkZGl0aW9uIGJ5IGtlZXBpbmcgdGVtcG9yYXJ5IHN1bXMgaW4gQyBpbnN0ZWFkIG9mIG5ldyBQeXRob24gb2JqZWN0cy4KLSAgICAgICAgICAgQXNzdW1lcyBhbGwgaW5wdXRzIGFyZSB0aGUgc2FtZSB0eXBlLiAgSWYgdGhlIGFzc3VtcHRpb24gZmFpbHMsIGRlZmF1bHQKLSAgICAgICAgICAgdG8gdGhlIG1vcmUgZ2VuZXJhbCByb3V0aW5lLgotCSovCi0JaWYgKFB5SW50X0NoZWNrRXhhY3QocmVzdWx0KSkgewotCQlsb25nIGlfcmVzdWx0ID0gUHlJbnRfQVNfTE9ORyhyZXN1bHQpOwotCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJcmVzdWx0ID0gTlVMTDsKLQkJd2hpbGUocmVzdWx0ID09IE5VTEwpIHsKLQkJCWl0ZW0gPSBQeUl0ZXJfTmV4dChpdGVyKTsKLQkJCWlmIChpdGVtID09IE5VTEwpIHsKLQkJCQlQeV9ERUNSRUYoaXRlcik7Ci0JCQkJaWYgKFB5RXJyX09jY3VycmVkKCkpCi0JCQkJCXJldHVybiBOVUxMOwotICAgIAkJCQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoaV9yZXN1bHQpOwotCQkJfQotICAgICAgICAJCWlmIChQeUludF9DaGVja0V4YWN0KGl0ZW0pKSB7Ci0gICAgICAgICAgICAJCQlsb25nIGIgPSBQeUludF9BU19MT05HKGl0ZW0pOwotCQkJCWxvbmcgeCA9IGlfcmVzdWx0ICsgYjsKLQkJCQlpZiAoKHheaV9yZXN1bHQpID49IDAgfHwgKHheYikgPj0gMCkgewotCQkJCQlpX3Jlc3VsdCA9IHg7Ci0JCQkJCVB5X0RFQ1JFRihpdGVtKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJfQotCQkJLyogRWl0aGVyIG92ZXJmbG93ZWQgb3IgaXMgbm90IGFuIGludC4gUmVzdG9yZSByZWFsIG9iamVjdHMgYW5kIHByb2Nlc3Mgbm9ybWFsbHkgKi8KLQkJCXJlc3VsdCA9IFB5SW50X0Zyb21Mb25nKGlfcmVzdWx0KTsKLQkJCXRlbXAgPSBQeU51bWJlcl9BZGQocmVzdWx0LCBpdGVtKTsKLQkJCVB5X0RFQ1JFRihyZXN1bHQpOwotCQkJUHlfREVDUkVGKGl0ZW0pOwotCQkJcmVzdWx0ID0gdGVtcDsKLQkJCWlmIChyZXN1bHQgPT0gTlVMTCkgewotCQkJCVB5X0RFQ1JFRihpdGVyKTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJfQotCX0KKyAgICAvKiBGYXN0IGFkZGl0aW9uIGJ5IGtlZXBpbmcgdGVtcG9yYXJ5IHN1bXMgaW4gQyBpbnN0ZWFkIG9mIG5ldyBQeXRob24gb2JqZWN0cy4KKyAgICAgICBBc3N1bWVzIGFsbCBpbnB1dHMgYXJlIHRoZSBzYW1lIHR5cGUuICBJZiB0aGUgYXNzdW1wdGlvbiBmYWlscywgZGVmYXVsdAorICAgICAgIHRvIHRoZSBtb3JlIGdlbmVyYWwgcm91dGluZS4KKyAgICAqLworICAgIGlmIChQeUludF9DaGVja0V4YWN0KHJlc3VsdCkpIHsKKyAgICAgICAgbG9uZyBpX3Jlc3VsdCA9IFB5SW50X0FTX0xPTkcocmVzdWx0KTsKKyAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgIHJlc3VsdCA9IE5VTEw7CisgICAgICAgIHdoaWxlKHJlc3VsdCA9PSBOVUxMKSB7CisgICAgICAgICAgICBpdGVtID0gUHlJdGVyX05leHQoaXRlcik7CisgICAgICAgICAgICBpZiAoaXRlbSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGl0ZXIpOworICAgICAgICAgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoaV9yZXN1bHQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKFB5SW50X0NoZWNrRXhhY3QoaXRlbSkpIHsKKyAgICAgICAgICAgICAgICBsb25nIGIgPSBQeUludF9BU19MT05HKGl0ZW0pOworICAgICAgICAgICAgICAgIGxvbmcgeCA9IGlfcmVzdWx0ICsgYjsKKyAgICAgICAgICAgICAgICBpZiAoKHheaV9yZXN1bHQpID49IDAgfHwgKHheYikgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICBpX3Jlc3VsdCA9IHg7CisgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogRWl0aGVyIG92ZXJmbG93ZWQgb3IgaXMgbm90IGFuIGludC4gUmVzdG9yZSByZWFsIG9iamVjdHMgYW5kIHByb2Nlc3Mgbm9ybWFsbHkgKi8KKyAgICAgICAgICAgIHJlc3VsdCA9IFB5SW50X0Zyb21Mb25nKGlfcmVzdWx0KTsKKyAgICAgICAgICAgIHRlbXAgPSBQeU51bWJlcl9BZGQocmVzdWx0LCBpdGVtKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgICAgICAgICAgcmVzdWx0ID0gdGVtcDsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihpdGVyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIAotCWlmIChQeUZsb2F0X0NoZWNrRXhhY3QocmVzdWx0KSkgewotCQlkb3VibGUgZl9yZXN1bHQgPSBQeUZsb2F0X0FTX0RPVUJMRShyZXN1bHQpOwotCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJcmVzdWx0ID0gTlVMTDsKLQkJd2hpbGUocmVzdWx0ID09IE5VTEwpIHsKLQkJCWl0ZW0gPSBQeUl0ZXJfTmV4dChpdGVyKTsKLQkJCWlmIChpdGVtID09IE5VTEwpIHsKLQkJCQlQeV9ERUNSRUYoaXRlcik7Ci0JCQkJaWYgKFB5RXJyX09jY3VycmVkKCkpCi0JCQkJCXJldHVybiBOVUxMOwotICAgIAkJCQlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKGZfcmVzdWx0KTsKLQkJCX0KLSAgICAgICAgCQlpZiAoUHlGbG9hdF9DaGVja0V4YWN0KGl0ZW0pKSB7Ci0JCQkJUHlGUEVfU1RBUlRfUFJPVEVDVCgiYWRkIiwgUHlfREVDUkVGKGl0ZW0pOyBQeV9ERUNSRUYoaXRlcik7IHJldHVybiAwKQotCQkJCWZfcmVzdWx0ICs9IFB5RmxvYXRfQVNfRE9VQkxFKGl0ZW0pOwotCQkJCVB5RlBFX0VORF9QUk9URUNUKGZfcmVzdWx0KQotCQkJCVB5X0RFQ1JFRihpdGVtKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLSAgICAgICAgCQlpZiAoUHlJbnRfQ2hlY2tFeGFjdChpdGVtKSkgewotCQkJCVB5RlBFX1NUQVJUX1BST1RFQ1QoImFkZCIsIFB5X0RFQ1JFRihpdGVtKTsgUHlfREVDUkVGKGl0ZXIpOyByZXR1cm4gMCkKLQkJCQlmX3Jlc3VsdCArPSAoZG91YmxlKVB5SW50X0FTX0xPTkcoaXRlbSk7Ci0JCQkJUHlGUEVfRU5EX1BST1RFQ1QoZl9yZXN1bHQpCi0JCQkJUHlfREVDUkVGKGl0ZW0pOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJcmVzdWx0ID0gUHlGbG9hdF9Gcm9tRG91YmxlKGZfcmVzdWx0KTsKLQkJCXRlbXAgPSBQeU51bWJlcl9BZGQocmVzdWx0LCBpdGVtKTsKLQkJCVB5X0RFQ1JFRihyZXN1bHQpOwotCQkJUHlfREVDUkVGKGl0ZW0pOwotCQkJcmVzdWx0ID0gdGVtcDsKLQkJCWlmIChyZXN1bHQgPT0gTlVMTCkgewotCQkJCVB5X0RFQ1JFRihpdGVyKTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJfQotCX0KKyAgICBpZiAoUHlGbG9hdF9DaGVja0V4YWN0KHJlc3VsdCkpIHsKKyAgICAgICAgZG91YmxlIGZfcmVzdWx0ID0gUHlGbG9hdF9BU19ET1VCTEUocmVzdWx0KTsKKyAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgIHJlc3VsdCA9IE5VTEw7CisgICAgICAgIHdoaWxlKHJlc3VsdCA9PSBOVUxMKSB7CisgICAgICAgICAgICBpdGVtID0gUHlJdGVyX05leHQoaXRlcik7CisgICAgICAgICAgICBpZiAoaXRlbSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGl0ZXIpOworICAgICAgICAgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKGZfcmVzdWx0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChQeUZsb2F0X0NoZWNrRXhhY3QoaXRlbSkpIHsKKyAgICAgICAgICAgICAgICBQeUZQRV9TVEFSVF9QUk9URUNUKCJhZGQiLCBQeV9ERUNSRUYoaXRlbSk7IFB5X0RFQ1JFRihpdGVyKTsgcmV0dXJuIDApCisgICAgICAgICAgICAgICAgZl9yZXN1bHQgKz0gUHlGbG9hdF9BU19ET1VCTEUoaXRlbSk7CisgICAgICAgICAgICAgICAgUHlGUEVfRU5EX1BST1RFQ1QoZl9yZXN1bHQpCisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKFB5SW50X0NoZWNrRXhhY3QoaXRlbSkpIHsKKyAgICAgICAgICAgICAgICBQeUZQRV9TVEFSVF9QUk9URUNUKCJhZGQiLCBQeV9ERUNSRUYoaXRlbSk7IFB5X0RFQ1JFRihpdGVyKTsgcmV0dXJuIDApCisgICAgICAgICAgICAgICAgZl9yZXN1bHQgKz0gKGRvdWJsZSlQeUludF9BU19MT05HKGl0ZW0pOworICAgICAgICAgICAgICAgIFB5RlBFX0VORF9QUk9URUNUKGZfcmVzdWx0KQorICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc3VsdCA9IFB5RmxvYXRfRnJvbURvdWJsZShmX3Jlc3VsdCk7CisgICAgICAgICAgICB0ZW1wID0gUHlOdW1iZXJfQWRkKHJlc3VsdCwgaXRlbSk7CisgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IHRlbXA7CisgICAgICAgICAgICBpZiAocmVzdWx0ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoaXRlcik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAjZW5kaWYKIAotCWZvcig7OykgewotCQlpdGVtID0gUHlJdGVyX05leHQoaXRlcik7Ci0JCWlmIChpdGVtID09IE5VTEwpIHsKLQkJCS8qIGVycm9yLCBvciBlbmQtb2Ytc2VxdWVuY2UgKi8KLQkJCWlmIChQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCQkJcmVzdWx0ID0gTlVMTDsKLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0JCXRlbXAgPSBQeU51bWJlcl9BZGQocmVzdWx0LCBpdGVtKTsKLQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCVB5X0RFQ1JFRihpdGVtKTsKLQkJcmVzdWx0ID0gdGVtcDsKLQkJaWYgKHJlc3VsdCA9PSBOVUxMKQotCQkJYnJlYWs7Ci0JfQotCVB5X0RFQ1JFRihpdGVyKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIGZvcig7OykgeworICAgICAgICBpdGVtID0gUHlJdGVyX05leHQoaXRlcik7CisgICAgICAgIGlmIChpdGVtID09IE5VTEwpIHsKKyAgICAgICAgICAgIC8qIGVycm9yLCBvciBlbmQtb2Ytc2VxdWVuY2UgKi8KKyAgICAgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHRlbXAgPSBQeU51bWJlcl9BZGQocmVzdWx0LCBpdGVtKTsKKyAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICAgICAgcmVzdWx0ID0gdGVtcDsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIFB5X0RFQ1JFRihpdGVyKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBQeURvY19TVFJWQVIoc3VtX2RvYywKQEAgLTI0MTAsMTcgKzI0MTAsMTcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBidWlsdGluX2lzaW5zdGFuY2UoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICppbnN0OwotCVB5T2JqZWN0ICpjbHM7Ci0JaW50IHJldHZhbDsKKyAgICBQeU9iamVjdCAqaW5zdDsKKyAgICBQeU9iamVjdCAqY2xzOworICAgIGludCByZXR2YWw7CiAKLQlpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJpc2luc3RhbmNlIiwgMiwgMiwgJmluc3QsICZjbHMpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJpc2luc3RhbmNlIiwgMiwgMiwgJmluc3QsICZjbHMpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXJldHZhbCA9IFB5T2JqZWN0X0lzSW5zdGFuY2UoaW5zdCwgY2xzKTsKLQlpZiAocmV0dmFsIDwgMCkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZyhyZXR2YWwpOworICAgIHJldHZhbCA9IFB5T2JqZWN0X0lzSW5zdGFuY2UoaW5zdCwgY2xzKTsKKyAgICBpZiAocmV0dmFsIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZyhyZXR2YWwpOwogfQogCiBQeURvY19TVFJWQVIoaXNpbnN0YW5jZV9kb2MsCkBAIC0yNDM1LDE3ICsyNDM1LDE3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYnVpbHRpbl9pc3N1YmNsYXNzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqZGVyaXZlZDsKLQlQeU9iamVjdCAqY2xzOwotCWludCByZXR2YWw7CisgICAgUHlPYmplY3QgKmRlcml2ZWQ7CisgICAgUHlPYmplY3QgKmNsczsKKyAgICBpbnQgcmV0dmFsOwogCi0JaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiaXNzdWJjbGFzcyIsIDIsIDIsICZkZXJpdmVkLCAmY2xzKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiaXNzdWJjbGFzcyIsIDIsIDIsICZkZXJpdmVkLCAmY2xzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlyZXR2YWwgPSBQeU9iamVjdF9Jc1N1YmNsYXNzKGRlcml2ZWQsIGNscyk7Ci0JaWYgKHJldHZhbCA8IDApCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBQeUJvb2xfRnJvbUxvbmcocmV0dmFsKTsKKyAgICByZXR2YWwgPSBQeU9iamVjdF9Jc1N1YmNsYXNzKGRlcml2ZWQsIGNscyk7CisgICAgaWYgKHJldHZhbCA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcocmV0dmFsKTsKIH0KIAogUHlEb2NfU1RSVkFSKGlzc3ViY2xhc3NfZG9jLApAQCAtMjQ1OSwxMDIgKzI0NTksMTAyIEBACiBzdGF0aWMgUHlPYmplY3QqCiBidWlsdGluX3ppcChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKnJldDsKLQljb25zdCBQeV9zc2l6ZV90IGl0ZW1zaXplID0gUHlTZXF1ZW5jZV9MZW5ndGgoYXJncyk7Ci0JUHlfc3NpemVfdCBpOwotCVB5T2JqZWN0ICppdGxpc3Q7ICAvKiB0dXBsZSBvZiBpdGVyYXRvcnMgKi8KLQlQeV9zc2l6ZV90IGxlbjsJICAgLyogZ3Vlc3MgYXQgcmVzdWx0IGxlbmd0aCAqLworICAgIFB5T2JqZWN0ICpyZXQ7CisgICAgY29uc3QgUHlfc3NpemVfdCBpdGVtc2l6ZSA9IFB5U2VxdWVuY2VfTGVuZ3RoKGFyZ3MpOworICAgIFB5X3NzaXplX3QgaTsKKyAgICBQeU9iamVjdCAqaXRsaXN0OyAgLyogdHVwbGUgb2YgaXRlcmF0b3JzICovCisgICAgUHlfc3NpemVfdCBsZW47ICAgICAgICAvKiBndWVzcyBhdCByZXN1bHQgbGVuZ3RoICovCiAKLQlpZiAoaXRlbXNpemUgPT0gMCkKLQkJcmV0dXJuIFB5TGlzdF9OZXcoMCk7CisgICAgaWYgKGl0ZW1zaXplID09IDApCisgICAgICAgIHJldHVybiBQeUxpc3RfTmV3KDApOwogCi0JLyogYXJncyBtdXN0IGJlIGEgdHVwbGUgKi8KLQlhc3NlcnQoUHlUdXBsZV9DaGVjayhhcmdzKSk7CisgICAgLyogYXJncyBtdXN0IGJlIGEgdHVwbGUgKi8KKyAgICBhc3NlcnQoUHlUdXBsZV9DaGVjayhhcmdzKSk7CiAKLQkvKiBHdWVzcyBhdCByZXN1bHQgbGVuZ3RoOiAgdGhlIHNob3J0ZXN0IG9mIHRoZSBpbnB1dCBsZW5ndGhzLgotCSAgIElmIHNvbWUgYXJndW1lbnQgcmVmdXNlcyB0byBzYXksIHdlIHJlZnVzZSB0byBndWVzcyB0b28sIGxlc3QKLQkgICBhbiBhcmd1bWVudCBsaWtlIHhyYW5nZShzeXMubWF4aW50KSBsZWFkIHVzIGFzdHJheS4qLwotCWxlbiA9IC0xOwkvKiB1bmtub3duICovCi0JZm9yIChpID0gMDsgaSA8IGl0ZW1zaXplOyArK2kpIHsKLQkJUHlPYmplY3QgKml0ZW0gPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIGkpOwotCQlQeV9zc2l6ZV90IHRoaXNsZW4gPSBfUHlPYmplY3RfTGVuZ3RoSGludChpdGVtLCAtMSk7Ci0JCWlmICh0aGlzbGVuIDwgMCkgewotCQkJbGVuID0gLTE7Ci0JCQlicmVhazsKLQkJfQotCQllbHNlIGlmIChsZW4gPCAwIHx8IHRoaXNsZW4gPCBsZW4pCi0JCQlsZW4gPSB0aGlzbGVuOwotCX0KKyAgICAvKiBHdWVzcyBhdCByZXN1bHQgbGVuZ3RoOiAgdGhlIHNob3J0ZXN0IG9mIHRoZSBpbnB1dCBsZW5ndGhzLgorICAgICAgIElmIHNvbWUgYXJndW1lbnQgcmVmdXNlcyB0byBzYXksIHdlIHJlZnVzZSB0byBndWVzcyB0b28sIGxlc3QKKyAgICAgICBhbiBhcmd1bWVudCBsaWtlIHhyYW5nZShzeXMubWF4aW50KSBsZWFkIHVzIGFzdHJheS4qLworICAgIGxlbiA9IC0xOyAgICAgICAgICAgLyogdW5rbm93biAqLworICAgIGZvciAoaSA9IDA7IGkgPCBpdGVtc2l6ZTsgKytpKSB7CisgICAgICAgIFB5T2JqZWN0ICppdGVtID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCBpKTsKKyAgICAgICAgUHlfc3NpemVfdCB0aGlzbGVuID0gX1B5T2JqZWN0X0xlbmd0aEhpbnQoaXRlbSwgLTEpOworICAgICAgICBpZiAodGhpc2xlbiA8IDApIHsKKyAgICAgICAgICAgIGxlbiA9IC0xOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAobGVuIDwgMCB8fCB0aGlzbGVuIDwgbGVuKQorICAgICAgICAgICAgbGVuID0gdGhpc2xlbjsKKyAgICB9CiAKLQkvKiBhbGxvY2F0ZSByZXN1bHQgbGlzdCAqLwotCWlmIChsZW4gPCAwKQotCQlsZW4gPSAxMDsJLyogYXJiaXRyYXJ5ICovCi0JaWYgKChyZXQgPSBQeUxpc3RfTmV3KGxlbikpID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIC8qIGFsbG9jYXRlIHJlc3VsdCBsaXN0ICovCisgICAgaWYgKGxlbiA8IDApCisgICAgICAgIGxlbiA9IDEwOyAgICAgICAgICAgICAgIC8qIGFyYml0cmFyeSAqLworICAgIGlmICgocmV0ID0gUHlMaXN0X05ldyhsZW4pKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCS8qIG9idGFpbiBpdGVyYXRvcnMgKi8KLQlpdGxpc3QgPSBQeVR1cGxlX05ldyhpdGVtc2l6ZSk7Ci0JaWYgKGl0bGlzdCA9PSBOVUxMKQotCQlnb3RvIEZhaWxfcmV0OwotCWZvciAoaSA9IDA7IGkgPCBpdGVtc2l6ZTsgKytpKSB7Ci0JCVB5T2JqZWN0ICppdGVtID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCBpKTsKLQkJUHlPYmplY3QgKml0ID0gUHlPYmplY3RfR2V0SXRlcihpdGVtKTsKLQkJaWYgKGl0ID09IE5VTEwpIHsKLQkJCWlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1R5cGVFcnJvcikpCi0JCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCQkgICAgInppcCBhcmd1bWVudCAjJXpkIG11c3Qgc3VwcG9ydCBpdGVyYXRpb24iLAotCQkJCSAgICBpKzEpOwotCQkJZ290byBGYWlsX3JldF9pdGxpc3Q7Ci0JCX0KLQkJUHlUdXBsZV9TRVRfSVRFTShpdGxpc3QsIGksIGl0KTsKLQl9CisgICAgLyogb2J0YWluIGl0ZXJhdG9ycyAqLworICAgIGl0bGlzdCA9IFB5VHVwbGVfTmV3KGl0ZW1zaXplKTsKKyAgICBpZiAoaXRsaXN0ID09IE5VTEwpCisgICAgICAgIGdvdG8gRmFpbF9yZXQ7CisgICAgZm9yIChpID0gMDsgaSA8IGl0ZW1zaXplOyArK2kpIHsKKyAgICAgICAgUHlPYmplY3QgKml0ZW0gPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIGkpOworICAgICAgICBQeU9iamVjdCAqaXQgPSBQeU9iamVjdF9HZXRJdGVyKGl0ZW0pOworICAgICAgICBpZiAoaXQgPT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfVHlwZUVycm9yKSkKKyAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAiemlwIGFyZ3VtZW50ICMlemQgbXVzdCBzdXBwb3J0IGl0ZXJhdGlvbiIsCisgICAgICAgICAgICAgICAgICAgIGkrMSk7CisgICAgICAgICAgICBnb3RvIEZhaWxfcmV0X2l0bGlzdDsKKyAgICAgICAgfQorICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKGl0bGlzdCwgaSwgaXQpOworICAgIH0KIAotCS8qIGJ1aWxkIHJlc3VsdCBpbnRvIHJldCBsaXN0ICovCi0JZm9yIChpID0gMDsgOyArK2kpIHsKLQkJaW50IGo7Ci0JCVB5T2JqZWN0ICpuZXh0ID0gUHlUdXBsZV9OZXcoaXRlbXNpemUpOwotCQlpZiAoIW5leHQpCi0JCQlnb3RvIEZhaWxfcmV0X2l0bGlzdDsKKyAgICAvKiBidWlsZCByZXN1bHQgaW50byByZXQgbGlzdCAqLworICAgIGZvciAoaSA9IDA7IDsgKytpKSB7CisgICAgICAgIGludCBqOworICAgICAgICBQeU9iamVjdCAqbmV4dCA9IFB5VHVwbGVfTmV3KGl0ZW1zaXplKTsKKyAgICAgICAgaWYgKCFuZXh0KQorICAgICAgICAgICAgZ290byBGYWlsX3JldF9pdGxpc3Q7CiAKLQkJZm9yIChqID0gMDsgaiA8IGl0ZW1zaXplOyBqKyspIHsKLQkJCVB5T2JqZWN0ICppdCA9IFB5VHVwbGVfR0VUX0lURU0oaXRsaXN0LCBqKTsKLQkJCVB5T2JqZWN0ICppdGVtID0gUHlJdGVyX05leHQoaXQpOwotCQkJaWYgKCFpdGVtKSB7Ci0JCQkJaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKLQkJCQkJUHlfREVDUkVGKHJldCk7Ci0JCQkJCXJldCA9IE5VTEw7Ci0JCQkJfQotCQkJCVB5X0RFQ1JFRihuZXh0KTsKLQkJCQlQeV9ERUNSRUYoaXRsaXN0KTsKLQkJCQlnb3RvIERvbmU7Ci0JCQl9Ci0JCQlQeVR1cGxlX1NFVF9JVEVNKG5leHQsIGosIGl0ZW0pOwotCQl9CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBpdGVtc2l6ZTsgaisrKSB7CisgICAgICAgICAgICBQeU9iamVjdCAqaXQgPSBQeVR1cGxlX0dFVF9JVEVNKGl0bGlzdCwgaik7CisgICAgICAgICAgICBQeU9iamVjdCAqaXRlbSA9IFB5SXRlcl9OZXh0KGl0KTsKKyAgICAgICAgICAgIGlmICghaXRlbSkgeworICAgICAgICAgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihyZXQpOworICAgICAgICAgICAgICAgICAgICByZXQgPSBOVUxMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYobmV4dCk7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGl0bGlzdCk7CisgICAgICAgICAgICAgICAgZ290byBEb25lOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShuZXh0LCBqLCBpdGVtKTsKKyAgICAgICAgfQogCi0JCWlmIChpIDwgbGVuKQotCQkJUHlMaXN0X1NFVF9JVEVNKHJldCwgaSwgbmV4dCk7Ci0JCWVsc2UgewotCQkJaW50IHN0YXR1cyA9IFB5TGlzdF9BcHBlbmQocmV0LCBuZXh0KTsKLQkJCVB5X0RFQ1JFRihuZXh0KTsKLQkJCSsrbGVuOwotCQkJaWYgKHN0YXR1cyA8IDApCi0JCQkJZ290byBGYWlsX3JldF9pdGxpc3Q7Ci0JCX0KLQl9CisgICAgICAgIGlmIChpIDwgbGVuKQorICAgICAgICAgICAgUHlMaXN0X1NFVF9JVEVNKHJldCwgaSwgbmV4dCk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaW50IHN0YXR1cyA9IFB5TGlzdF9BcHBlbmQocmV0LCBuZXh0KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihuZXh0KTsKKyAgICAgICAgICAgICsrbGVuOworICAgICAgICAgICAgaWYgKHN0YXR1cyA8IDApCisgICAgICAgICAgICAgICAgZ290byBGYWlsX3JldF9pdGxpc3Q7CisgICAgICAgIH0KKyAgICB9CiAKIERvbmU6Ci0JaWYgKHJldCAhPSBOVUxMICYmIGkgPCBsZW4pIHsKLQkJLyogVGhlIGxpc3QgaXMgdG9vIGJpZy4gKi8KLQkJaWYgKFB5TGlzdF9TZXRTbGljZShyZXQsIGksIGxlbiwgTlVMTCkgPCAwKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiByZXQ7CisgICAgaWYgKHJldCAhPSBOVUxMICYmIGkgPCBsZW4pIHsKKyAgICAgICAgLyogVGhlIGxpc3QgaXMgdG9vIGJpZy4gKi8KKyAgICAgICAgaWYgKFB5TGlzdF9TZXRTbGljZShyZXQsIGksIGxlbiwgTlVMTCkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiByZXQ7CiAKIEZhaWxfcmV0X2l0bGlzdDoKLQlQeV9ERUNSRUYoaXRsaXN0KTsKKyAgICBQeV9ERUNSRUYoaXRsaXN0KTsKIEZhaWxfcmV0OgotCVB5X0RFQ1JFRihyZXQpOwotCXJldHVybiBOVUxMOworICAgIFB5X0RFQ1JFRihyZXQpOworICAgIHJldHVybiBOVUxMOwogfQogCiAKQEAgLTI1NjcsNjEgKzI1NjcsNjEgQEAKIAogCiBzdGF0aWMgUHlNZXRob2REZWYgYnVpbHRpbl9tZXRob2RzW10gPSB7Ci0gCXsiX19pbXBvcnRfXyIsCShQeUNGdW5jdGlvbilidWlsdGluX19faW1wb3J0X18sIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsIGltcG9ydF9kb2N9LAotIAl7ImFicyIsCQlidWlsdGluX2FicywgICAgICAgIE1FVEhfTywgYWJzX2RvY30sCi0gCXsiYWxsIiwJCWJ1aWx0aW5fYWxsLCAgICAgICAgTUVUSF9PLCBhbGxfZG9jfSwKLSAJeyJhbnkiLAkJYnVpbHRpbl9hbnksICAgICAgICBNRVRIX08sIGFueV9kb2N9LAotIAl7ImFwcGx5IiwJYnVpbHRpbl9hcHBseSwgICAgICBNRVRIX1ZBUkFSR1MsIGFwcGx5X2RvY30sCi0JeyJiaW4iLAkJYnVpbHRpbl9iaW4sCSAgICBNRVRIX08sIGJpbl9kb2N9LAotIAl7ImNhbGxhYmxlIiwJYnVpbHRpbl9jYWxsYWJsZSwgICBNRVRIX08sIGNhbGxhYmxlX2RvY30sCi0gCXsiY2hyIiwJCWJ1aWx0aW5fY2hyLCAgICAgICAgTUVUSF9WQVJBUkdTLCBjaHJfZG9jfSwKLSAJeyJjbXAiLAkJYnVpbHRpbl9jbXAsICAgICAgICBNRVRIX1ZBUkFSR1MsIGNtcF9kb2N9LAotIAl7ImNvZXJjZSIsCWJ1aWx0aW5fY29lcmNlLCAgICAgTUVUSF9WQVJBUkdTLCBjb2VyY2VfZG9jfSwKLSAJeyJjb21waWxlIiwJKFB5Q0Z1bmN0aW9uKWJ1aWx0aW5fY29tcGlsZSwgICAgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywgY29tcGlsZV9kb2N9LAotIAl7ImRlbGF0dHIiLAlidWlsdGluX2RlbGF0dHIsICAgIE1FVEhfVkFSQVJHUywgZGVsYXR0cl9kb2N9LAotIAl7ImRpciIsCQlidWlsdGluX2RpciwgICAgICAgIE1FVEhfVkFSQVJHUywgZGlyX2RvY30sCi0gCXsiZGl2bW9kIiwJYnVpbHRpbl9kaXZtb2QsICAgICBNRVRIX1ZBUkFSR1MsIGRpdm1vZF9kb2N9LAotIAl7ImV2YWwiLAlidWlsdGluX2V2YWwsICAgICAgIE1FVEhfVkFSQVJHUywgZXZhbF9kb2N9LAotIAl7ImV4ZWNmaWxlIiwJYnVpbHRpbl9leGVjZmlsZSwgICBNRVRIX1ZBUkFSR1MsIGV4ZWNmaWxlX2RvY30sCi0gCXsiZmlsdGVyIiwJYnVpbHRpbl9maWx0ZXIsICAgICBNRVRIX1ZBUkFSR1MsIGZpbHRlcl9kb2N9LAotIAl7ImZvcm1hdCIsCWJ1aWx0aW5fZm9ybWF0LCAgICAgTUVUSF9WQVJBUkdTLCBmb3JtYXRfZG9jfSwKLSAJeyJnZXRhdHRyIiwJYnVpbHRpbl9nZXRhdHRyLCAgICBNRVRIX1ZBUkFSR1MsIGdldGF0dHJfZG9jfSwKLSAJeyJnbG9iYWxzIiwJKFB5Q0Z1bmN0aW9uKWJ1aWx0aW5fZ2xvYmFscywgICAgTUVUSF9OT0FSR1MsIGdsb2JhbHNfZG9jfSwKLSAJeyJoYXNhdHRyIiwJYnVpbHRpbl9oYXNhdHRyLCAgICBNRVRIX1ZBUkFSR1MsIGhhc2F0dHJfZG9jfSwKLSAJeyJoYXNoIiwJYnVpbHRpbl9oYXNoLCAgICAgICBNRVRIX08sIGhhc2hfZG9jfSwKLSAJeyJoZXgiLAkJYnVpbHRpbl9oZXgsICAgICAgICBNRVRIX08sIGhleF9kb2N9LAotIAl7ImlkIiwJCWJ1aWx0aW5faWQsICAgICAgICAgTUVUSF9PLCBpZF9kb2N9LAotIAl7ImlucHV0IiwJYnVpbHRpbl9pbnB1dCwgICAgICBNRVRIX1ZBUkFSR1MsIGlucHV0X2RvY30sCi0gCXsiaW50ZXJuIiwJYnVpbHRpbl9pbnRlcm4sICAgICBNRVRIX1ZBUkFSR1MsIGludGVybl9kb2N9LAotIAl7ImlzaW5zdGFuY2UiLCAgYnVpbHRpbl9pc2luc3RhbmNlLCBNRVRIX1ZBUkFSR1MsIGlzaW5zdGFuY2VfZG9jfSwKLSAJeyJpc3N1YmNsYXNzIiwgIGJ1aWx0aW5faXNzdWJjbGFzcywgTUVUSF9WQVJBUkdTLCBpc3N1YmNsYXNzX2RvY30sCi0gCXsiaXRlciIsCWJ1aWx0aW5faXRlciwgICAgICAgTUVUSF9WQVJBUkdTLCBpdGVyX2RvY30sCi0gCXsibGVuIiwJCWJ1aWx0aW5fbGVuLCAgICAgICAgTUVUSF9PLCBsZW5fZG9jfSwKLSAJeyJsb2NhbHMiLAkoUHlDRnVuY3Rpb24pYnVpbHRpbl9sb2NhbHMsICAgICBNRVRIX05PQVJHUywgbG9jYWxzX2RvY30sCi0gCXsibWFwIiwJCWJ1aWx0aW5fbWFwLCAgICAgICAgTUVUSF9WQVJBUkdTLCBtYXBfZG9jfSwKLSAJeyJtYXgiLAkJKFB5Q0Z1bmN0aW9uKWJ1aWx0aW5fbWF4LCAgICAgICAgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywgbWF4X2RvY30sCi0gCXsibWluIiwJCShQeUNGdW5jdGlvbilidWlsdGluX21pbiwgICAgICAgIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsIG1pbl9kb2N9LAotCXsibmV4dCIsIAlidWlsdGluX25leHQsICAgICAgIE1FVEhfVkFSQVJHUywgbmV4dF9kb2N9LAotIAl7Im9jdCIsCQlidWlsdGluX29jdCwgICAgICAgIE1FVEhfTywgb2N0X2RvY30sCi0gCXsib3BlbiIsCShQeUNGdW5jdGlvbilidWlsdGluX29wZW4sICAgICAgIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsIG9wZW5fZG9jfSwKLSAJeyJvcmQiLAkJYnVpbHRpbl9vcmQsICAgICAgICBNRVRIX08sIG9yZF9kb2N9LAotIAl7InBvdyIsCQlidWlsdGluX3BvdywgICAgICAgIE1FVEhfVkFSQVJHUywgcG93X2RvY30sCi0gCXsicHJpbnQiLAkoUHlDRnVuY3Rpb24pYnVpbHRpbl9wcmludCwgICAgICBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLCBwcmludF9kb2N9LAotIAl7InJhbmdlIiwJYnVpbHRpbl9yYW5nZSwgICAgICBNRVRIX1ZBUkFSR1MsIHJhbmdlX2RvY30sCi0gCXsicmF3X2lucHV0IiwJYnVpbHRpbl9yYXdfaW5wdXQsICBNRVRIX1ZBUkFSR1MsIHJhd19pbnB1dF9kb2N9LAotIAl7InJlZHVjZSIsCWJ1aWx0aW5fcmVkdWNlLCAgICAgTUVUSF9WQVJBUkdTLCByZWR1Y2VfZG9jfSwKLSAJeyJyZWxvYWQiLAlidWlsdGluX3JlbG9hZCwgICAgIE1FVEhfTywgcmVsb2FkX2RvY30sCi0gCXsicmVwciIsCWJ1aWx0aW5fcmVwciwgICAgICAgTUVUSF9PLCByZXByX2RvY30sCi0gCXsicm91bmQiLAkoUHlDRnVuY3Rpb24pYnVpbHRpbl9yb3VuZCwgICAgICBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLCByb3VuZF9kb2N9LAotIAl7InNldGF0dHIiLAlidWlsdGluX3NldGF0dHIsICAgIE1FVEhfVkFSQVJHUywgc2V0YXR0cl9kb2N9LAotIAl7InNvcnRlZCIsCShQeUNGdW5jdGlvbilidWlsdGluX3NvcnRlZCwgICAgIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsIHNvcnRlZF9kb2N9LAotIAl7InN1bSIsCQlidWlsdGluX3N1bSwgICAgICAgIE1FVEhfVkFSQVJHUywgc3VtX2RvY30sCisgICAgeyJfX2ltcG9ydF9fIiwgICAgICAoUHlDRnVuY3Rpb24pYnVpbHRpbl9fX2ltcG9ydF9fLCBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLCBpbXBvcnRfZG9jfSwKKyAgICB7ImFicyIsICAgICAgICAgICAgIGJ1aWx0aW5fYWJzLCAgICAgICAgTUVUSF9PLCBhYnNfZG9jfSwKKyAgICB7ImFsbCIsICAgICAgICAgICAgIGJ1aWx0aW5fYWxsLCAgICAgICAgTUVUSF9PLCBhbGxfZG9jfSwKKyAgICB7ImFueSIsICAgICAgICAgICAgIGJ1aWx0aW5fYW55LCAgICAgICAgTUVUSF9PLCBhbnlfZG9jfSwKKyAgICB7ImFwcGx5IiwgICAgICAgICAgIGJ1aWx0aW5fYXBwbHksICAgICAgTUVUSF9WQVJBUkdTLCBhcHBseV9kb2N9LAorICAgIHsiYmluIiwgICAgICAgICAgICAgYnVpbHRpbl9iaW4sICAgICAgICBNRVRIX08sIGJpbl9kb2N9LAorICAgIHsiY2FsbGFibGUiLCAgICAgICAgYnVpbHRpbl9jYWxsYWJsZSwgICBNRVRIX08sIGNhbGxhYmxlX2RvY30sCisgICAgeyJjaHIiLCAgICAgICAgICAgICBidWlsdGluX2NociwgICAgICAgIE1FVEhfVkFSQVJHUywgY2hyX2RvY30sCisgICAgeyJjbXAiLCAgICAgICAgICAgICBidWlsdGluX2NtcCwgICAgICAgIE1FVEhfVkFSQVJHUywgY21wX2RvY30sCisgICAgeyJjb2VyY2UiLCAgICAgICAgICBidWlsdGluX2NvZXJjZSwgICAgIE1FVEhfVkFSQVJHUywgY29lcmNlX2RvY30sCisgICAgeyJjb21waWxlIiwgICAgICAgICAoUHlDRnVuY3Rpb24pYnVpbHRpbl9jb21waWxlLCAgICBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLCBjb21waWxlX2RvY30sCisgICAgeyJkZWxhdHRyIiwgICAgICAgICBidWlsdGluX2RlbGF0dHIsICAgIE1FVEhfVkFSQVJHUywgZGVsYXR0cl9kb2N9LAorICAgIHsiZGlyIiwgICAgICAgICAgICAgYnVpbHRpbl9kaXIsICAgICAgICBNRVRIX1ZBUkFSR1MsIGRpcl9kb2N9LAorICAgIHsiZGl2bW9kIiwgICAgICAgICAgYnVpbHRpbl9kaXZtb2QsICAgICBNRVRIX1ZBUkFSR1MsIGRpdm1vZF9kb2N9LAorICAgIHsiZXZhbCIsICAgICAgICAgICAgYnVpbHRpbl9ldmFsLCAgICAgICBNRVRIX1ZBUkFSR1MsIGV2YWxfZG9jfSwKKyAgICB7ImV4ZWNmaWxlIiwgICAgICAgIGJ1aWx0aW5fZXhlY2ZpbGUsICAgTUVUSF9WQVJBUkdTLCBleGVjZmlsZV9kb2N9LAorICAgIHsiZmlsdGVyIiwgICAgICAgICAgYnVpbHRpbl9maWx0ZXIsICAgICBNRVRIX1ZBUkFSR1MsIGZpbHRlcl9kb2N9LAorICAgIHsiZm9ybWF0IiwgICAgICAgICAgYnVpbHRpbl9mb3JtYXQsICAgICBNRVRIX1ZBUkFSR1MsIGZvcm1hdF9kb2N9LAorICAgIHsiZ2V0YXR0ciIsICAgICAgICAgYnVpbHRpbl9nZXRhdHRyLCAgICBNRVRIX1ZBUkFSR1MsIGdldGF0dHJfZG9jfSwKKyAgICB7Imdsb2JhbHMiLCAgICAgICAgIChQeUNGdW5jdGlvbilidWlsdGluX2dsb2JhbHMsICAgIE1FVEhfTk9BUkdTLCBnbG9iYWxzX2RvY30sCisgICAgeyJoYXNhdHRyIiwgICAgICAgICBidWlsdGluX2hhc2F0dHIsICAgIE1FVEhfVkFSQVJHUywgaGFzYXR0cl9kb2N9LAorICAgIHsiaGFzaCIsICAgICAgICAgICAgYnVpbHRpbl9oYXNoLCAgICAgICBNRVRIX08sIGhhc2hfZG9jfSwKKyAgICB7ImhleCIsICAgICAgICAgICAgIGJ1aWx0aW5faGV4LCAgICAgICAgTUVUSF9PLCBoZXhfZG9jfSwKKyAgICB7ImlkIiwgICAgICAgICAgICAgIGJ1aWx0aW5faWQsICAgICAgICAgTUVUSF9PLCBpZF9kb2N9LAorICAgIHsiaW5wdXQiLCAgICAgICAgICAgYnVpbHRpbl9pbnB1dCwgICAgICBNRVRIX1ZBUkFSR1MsIGlucHV0X2RvY30sCisgICAgeyJpbnRlcm4iLCAgICAgICAgICBidWlsdGluX2ludGVybiwgICAgIE1FVEhfVkFSQVJHUywgaW50ZXJuX2RvY30sCisgICAgeyJpc2luc3RhbmNlIiwgIGJ1aWx0aW5faXNpbnN0YW5jZSwgTUVUSF9WQVJBUkdTLCBpc2luc3RhbmNlX2RvY30sCisgICAgeyJpc3N1YmNsYXNzIiwgIGJ1aWx0aW5faXNzdWJjbGFzcywgTUVUSF9WQVJBUkdTLCBpc3N1YmNsYXNzX2RvY30sCisgICAgeyJpdGVyIiwgICAgICAgICAgICBidWlsdGluX2l0ZXIsICAgICAgIE1FVEhfVkFSQVJHUywgaXRlcl9kb2N9LAorICAgIHsibGVuIiwgICAgICAgICAgICAgYnVpbHRpbl9sZW4sICAgICAgICBNRVRIX08sIGxlbl9kb2N9LAorICAgIHsibG9jYWxzIiwgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWJ1aWx0aW5fbG9jYWxzLCAgICAgTUVUSF9OT0FSR1MsIGxvY2Fsc19kb2N9LAorICAgIHsibWFwIiwgICAgICAgICAgICAgYnVpbHRpbl9tYXAsICAgICAgICBNRVRIX1ZBUkFSR1MsIG1hcF9kb2N9LAorICAgIHsibWF4IiwgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWJ1aWx0aW5fbWF4LCAgICAgICAgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywgbWF4X2RvY30sCisgICAgeyJtaW4iLCAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pYnVpbHRpbl9taW4sICAgICAgICBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLCBtaW5fZG9jfSwKKyAgICB7Im5leHQiLCAgICAgICAgICAgIGJ1aWx0aW5fbmV4dCwgICAgICAgTUVUSF9WQVJBUkdTLCBuZXh0X2RvY30sCisgICAgeyJvY3QiLCAgICAgICAgICAgICBidWlsdGluX29jdCwgICAgICAgIE1FVEhfTywgb2N0X2RvY30sCisgICAgeyJvcGVuIiwgICAgICAgICAgICAoUHlDRnVuY3Rpb24pYnVpbHRpbl9vcGVuLCAgICAgICBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLCBvcGVuX2RvY30sCisgICAgeyJvcmQiLCAgICAgICAgICAgICBidWlsdGluX29yZCwgICAgICAgIE1FVEhfTywgb3JkX2RvY30sCisgICAgeyJwb3ciLCAgICAgICAgICAgICBidWlsdGluX3BvdywgICAgICAgIE1FVEhfVkFSQVJHUywgcG93X2RvY30sCisgICAgeyJwcmludCIsICAgICAgICAgICAoUHlDRnVuY3Rpb24pYnVpbHRpbl9wcmludCwgICAgICBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLCBwcmludF9kb2N9LAorICAgIHsicmFuZ2UiLCAgICAgICAgICAgYnVpbHRpbl9yYW5nZSwgICAgICBNRVRIX1ZBUkFSR1MsIHJhbmdlX2RvY30sCisgICAgeyJyYXdfaW5wdXQiLCAgICAgICBidWlsdGluX3Jhd19pbnB1dCwgIE1FVEhfVkFSQVJHUywgcmF3X2lucHV0X2RvY30sCisgICAgeyJyZWR1Y2UiLCAgICAgICAgICBidWlsdGluX3JlZHVjZSwgICAgIE1FVEhfVkFSQVJHUywgcmVkdWNlX2RvY30sCisgICAgeyJyZWxvYWQiLCAgICAgICAgICBidWlsdGluX3JlbG9hZCwgICAgIE1FVEhfTywgcmVsb2FkX2RvY30sCisgICAgeyJyZXByIiwgICAgICAgICAgICBidWlsdGluX3JlcHIsICAgICAgIE1FVEhfTywgcmVwcl9kb2N9LAorICAgIHsicm91bmQiLCAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWJ1aWx0aW5fcm91bmQsICAgICAgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywgcm91bmRfZG9jfSwKKyAgICB7InNldGF0dHIiLCAgICAgICAgIGJ1aWx0aW5fc2V0YXR0ciwgICAgTUVUSF9WQVJBUkdTLCBzZXRhdHRyX2RvY30sCisgICAgeyJzb3J0ZWQiLCAgICAgICAgICAoUHlDRnVuY3Rpb24pYnVpbHRpbl9zb3J0ZWQsICAgICBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLCBzb3J0ZWRfZG9jfSwKKyAgICB7InN1bSIsICAgICAgICAgICAgIGJ1aWx0aW5fc3VtLCAgICAgICAgTUVUSF9WQVJBUkdTLCBzdW1fZG9jfSwKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0gCXsidW5pY2hyIiwJYnVpbHRpbl91bmljaHIsICAgICBNRVRIX1ZBUkFSR1MsIHVuaWNocl9kb2N9LAorICAgIHsidW5pY2hyIiwgICAgICAgICAgYnVpbHRpbl91bmljaHIsICAgICBNRVRIX1ZBUkFSR1MsIHVuaWNocl9kb2N9LAogI2VuZGlmCi0gCXsidmFycyIsCWJ1aWx0aW5fdmFycywgICAgICAgTUVUSF9WQVJBUkdTLCB2YXJzX2RvY30sCi0gIAl7InppcCIsICAgICAgICAgYnVpbHRpbl96aXAsICAgICAgICBNRVRIX1ZBUkFSR1MsIHppcF9kb2N9LAotCXtOVUxMLAkJTlVMTH0sCisgICAgeyJ2YXJzIiwgICAgICAgICAgICBidWlsdGluX3ZhcnMsICAgICAgIE1FVEhfVkFSQVJHUywgdmFyc19kb2N9LAorICAgIHsiemlwIiwgICAgICAgICBidWlsdGluX3ppcCwgICAgICAgIE1FVEhfVkFSQVJHUywgemlwX2RvY30sCisgICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSwKIH07CiAKIFB5RG9jX1NUUlZBUihidWlsdGluX2RvYywKQEAgLTI2MzIsNzYgKzI2MzIsNzYgQEAKIFB5T2JqZWN0ICoKIF9QeUJ1aWx0aW5fSW5pdCh2b2lkKQogewotCVB5T2JqZWN0ICptb2QsICpkaWN0LCAqZGVidWc7Ci0JbW9kID0gUHlfSW5pdE1vZHVsZTQoIl9fYnVpbHRpbl9fIiwgYnVpbHRpbl9tZXRob2RzLAotCQkJICAgICBidWlsdGluX2RvYywgKFB5T2JqZWN0ICopTlVMTCwKLQkJCSAgICAgUFlUSE9OX0FQSV9WRVJTSU9OKTsKLQlpZiAobW9kID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWRpY3QgPSBQeU1vZHVsZV9HZXREaWN0KG1vZCk7CisgICAgUHlPYmplY3QgKm1vZCwgKmRpY3QsICpkZWJ1ZzsKKyAgICBtb2QgPSBQeV9Jbml0TW9kdWxlNCgiX19idWlsdGluX18iLCBidWlsdGluX21ldGhvZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbHRpbl9kb2MsIChQeU9iamVjdCAqKU5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgUFlUSE9OX0FQSV9WRVJTSU9OKTsKKyAgICBpZiAobW9kID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGRpY3QgPSBQeU1vZHVsZV9HZXREaWN0KG1vZCk7CiAKICNpZmRlZiBQeV9UUkFDRV9SRUZTCi0JLyogX19idWlsdGluX18gZXhwb3NlcyBhIG51bWJlciBvZiBzdGF0aWNhbGx5IGFsbG9jYXRlZCBvYmplY3RzCi0JICogdGhhdCwgYmVmb3JlIHRoaXMgY29kZSB3YXMgYWRkZWQgaW4gMi4zLCBuZXZlciBzaG93ZWQgdXAgaW4KLQkgKiB0aGUgbGlzdCBvZiAiYWxsIG9iamVjdHMiIG1haW50YWluZWQgYnkgUHlfVFJBQ0VfUkVGUy4gIEFzIGEKLQkgKiByZXN1bHQsIHByb2dyYW1zIGxlYWtpbmcgcmVmZXJlbmNlcyB0byBOb25lIGFuZCBGYWxzZSAoZXRjKQotCSAqIGNvdWxkbid0IGJlIGRpYWdub3NlZCBieSBleGFtaW5pbmcgc3lzLmdldG9iamVjdHMoMCkuCi0JICovCisgICAgLyogX19idWlsdGluX18gZXhwb3NlcyBhIG51bWJlciBvZiBzdGF0aWNhbGx5IGFsbG9jYXRlZCBvYmplY3RzCisgICAgICogdGhhdCwgYmVmb3JlIHRoaXMgY29kZSB3YXMgYWRkZWQgaW4gMi4zLCBuZXZlciBzaG93ZWQgdXAgaW4KKyAgICAgKiB0aGUgbGlzdCBvZiAiYWxsIG9iamVjdHMiIG1haW50YWluZWQgYnkgUHlfVFJBQ0VfUkVGUy4gIEFzIGEKKyAgICAgKiByZXN1bHQsIHByb2dyYW1zIGxlYWtpbmcgcmVmZXJlbmNlcyB0byBOb25lIGFuZCBGYWxzZSAoZXRjKQorICAgICAqIGNvdWxkbid0IGJlIGRpYWdub3NlZCBieSBleGFtaW5pbmcgc3lzLmdldG9iamVjdHMoMCkuCisgICAgICovCiAjZGVmaW5lIEFERF9UT19BTEwoT0JKRUNUKSBfUHlfQWRkVG9BbGxPYmplY3RzKChQeU9iamVjdCAqKShPQkpFQ1QpLCAwKQogI2Vsc2UKICNkZWZpbmUgQUREX1RPX0FMTChPQkpFQ1QpICh2b2lkKTAKICNlbmRpZgogCiAjZGVmaW5lIFNFVEJVSUxUSU4oTkFNRSwgT0JKRUNUKSBcCi0JaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsIE5BTUUsIChQeU9iamVjdCAqKU9CSkVDVCkgPCAwKQlcCi0JCXJldHVybiBOVUxMOwkJCQkJCVwKLQlBRERfVE9fQUxMKE9CSkVDVCkKKyAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgTkFNRSwgKFB5T2JqZWN0ICopT0JKRUNUKSA8IDApICAgICAgIFwKKyAgICAgICAgcmV0dXJuIE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBBRERfVE9fQUxMKE9CSkVDVCkKIAotCVNFVEJVSUxUSU4oIk5vbmUiLAkJUHlfTm9uZSk7Ci0JU0VUQlVJTFRJTigiRWxsaXBzaXMiLAkJUHlfRWxsaXBzaXMpOwotCVNFVEJVSUxUSU4oIk5vdEltcGxlbWVudGVkIiwJUHlfTm90SW1wbGVtZW50ZWQpOwotCVNFVEJVSUxUSU4oIkZhbHNlIiwJCVB5X0ZhbHNlKTsKLQlTRVRCVUlMVElOKCJUcnVlIiwJCVB5X1RydWUpOwotCVNFVEJVSUxUSU4oImJhc2VzdHJpbmciLAkmUHlCYXNlU3RyaW5nX1R5cGUpOwotCVNFVEJVSUxUSU4oImJvb2wiLAkJJlB5Qm9vbF9UeXBlKTsKLQkvKglTRVRCVUlMVElOKCJtZW1vcnl2aWV3IiwgICAgICAgICZQeU1lbW9yeVZpZXdfVHlwZSk7ICovCi0JU0VUQlVJTFRJTigiYnl0ZWFycmF5IiwJCSZQeUJ5dGVBcnJheV9UeXBlKTsKLQlTRVRCVUlMVElOKCJieXRlcyIsCQkmUHlTdHJpbmdfVHlwZSk7Ci0JU0VUQlVJTFRJTigiYnVmZmVyIiwJCSZQeUJ1ZmZlcl9UeXBlKTsKLQlTRVRCVUlMVElOKCJjbGFzc21ldGhvZCIsCSZQeUNsYXNzTWV0aG9kX1R5cGUpOworICAgIFNFVEJVSUxUSU4oIk5vbmUiLCAgICAgICAgICAgICAgICAgIFB5X05vbmUpOworICAgIFNFVEJVSUxUSU4oIkVsbGlwc2lzIiwgICAgICAgICAgICAgIFB5X0VsbGlwc2lzKTsKKyAgICBTRVRCVUlMVElOKCJOb3RJbXBsZW1lbnRlZCIsICAgICAgICBQeV9Ob3RJbXBsZW1lbnRlZCk7CisgICAgU0VUQlVJTFRJTigiRmFsc2UiLCAgICAgICAgICAgICAgICAgUHlfRmFsc2UpOworICAgIFNFVEJVSUxUSU4oIlRydWUiLCAgICAgICAgICAgICAgICAgIFB5X1RydWUpOworICAgIFNFVEJVSUxUSU4oImJhc2VzdHJpbmciLCAgICAgICAgICAgICZQeUJhc2VTdHJpbmdfVHlwZSk7CisgICAgU0VUQlVJTFRJTigiYm9vbCIsICAgICAgICAgICAgICAgICAgJlB5Qm9vbF9UeXBlKTsKKyAgICAvKiAgICAgICAgICBTRVRCVUlMVElOKCJtZW1vcnl2aWV3IiwgICAgICAgICZQeU1lbW9yeVZpZXdfVHlwZSk7ICovCisgICAgU0VUQlVJTFRJTigiYnl0ZWFycmF5IiwgICAgICAgICAgICAgJlB5Qnl0ZUFycmF5X1R5cGUpOworICAgIFNFVEJVSUxUSU4oImJ5dGVzIiwgICAgICAgICAgICAgICAgICZQeVN0cmluZ19UeXBlKTsKKyAgICBTRVRCVUlMVElOKCJidWZmZXIiLCAgICAgICAgICAgICAgICAmUHlCdWZmZXJfVHlwZSk7CisgICAgU0VUQlVJTFRJTigiY2xhc3NtZXRob2QiLCAgICAgICAgICAgJlB5Q2xhc3NNZXRob2RfVHlwZSk7CiAjaWZuZGVmIFdJVEhPVVRfQ09NUExFWAotCVNFVEJVSUxUSU4oImNvbXBsZXgiLAkJJlB5Q29tcGxleF9UeXBlKTsKKyAgICBTRVRCVUlMVElOKCJjb21wbGV4IiwgICAgICAgICAgICAgICAmUHlDb21wbGV4X1R5cGUpOwogI2VuZGlmCi0JU0VUQlVJTFRJTigiZGljdCIsCQkmUHlEaWN0X1R5cGUpOwotIAlTRVRCVUlMVElOKCJlbnVtZXJhdGUiLAkJJlB5RW51bV9UeXBlKTsKLQlTRVRCVUlMVElOKCJmaWxlIiwJCSZQeUZpbGVfVHlwZSk7Ci0JU0VUQlVJTFRJTigiZmxvYXQiLAkJJlB5RmxvYXRfVHlwZSk7Ci0JU0VUQlVJTFRJTigiZnJvemVuc2V0IiwJCSZQeUZyb3plblNldF9UeXBlKTsKLQlTRVRCVUlMVElOKCJwcm9wZXJ0eSIsCQkmUHlQcm9wZXJ0eV9UeXBlKTsKLQlTRVRCVUlMVElOKCJpbnQiLAkJJlB5SW50X1R5cGUpOwotCVNFVEJVSUxUSU4oImxpc3QiLAkJJlB5TGlzdF9UeXBlKTsKLQlTRVRCVUlMVElOKCJsb25nIiwJCSZQeUxvbmdfVHlwZSk7Ci0JU0VUQlVJTFRJTigib2JqZWN0IiwJCSZQeUJhc2VPYmplY3RfVHlwZSk7Ci0JU0VUQlVJTFRJTigicmV2ZXJzZWQiLAkJJlB5UmV2ZXJzZWRfVHlwZSk7Ci0JU0VUQlVJTFRJTigic2V0IiwJCSZQeVNldF9UeXBlKTsKLQlTRVRCVUlMVElOKCJzbGljZSIsCQkmUHlTbGljZV9UeXBlKTsKLQlTRVRCVUlMVElOKCJzdGF0aWNtZXRob2QiLAkmUHlTdGF0aWNNZXRob2RfVHlwZSk7Ci0JU0VUQlVJTFRJTigic3RyIiwJCSZQeVN0cmluZ19UeXBlKTsKLQlTRVRCVUlMVElOKCJzdXBlciIsCQkmUHlTdXBlcl9UeXBlKTsKLQlTRVRCVUlMVElOKCJ0dXBsZSIsCQkmUHlUdXBsZV9UeXBlKTsKLQlTRVRCVUlMVElOKCJ0eXBlIiwJCSZQeVR5cGVfVHlwZSk7Ci0JU0VUQlVJTFRJTigieHJhbmdlIiwJCSZQeVJhbmdlX1R5cGUpOworICAgIFNFVEJVSUxUSU4oImRpY3QiLCAgICAgICAgICAgICAgICAgICZQeURpY3RfVHlwZSk7CisgICAgU0VUQlVJTFRJTigiZW51bWVyYXRlIiwgICAgICAgICAgICAgJlB5RW51bV9UeXBlKTsKKyAgICBTRVRCVUlMVElOKCJmaWxlIiwgICAgICAgICAgICAgICAgICAmUHlGaWxlX1R5cGUpOworICAgIFNFVEJVSUxUSU4oImZsb2F0IiwgICAgICAgICAgICAgICAgICZQeUZsb2F0X1R5cGUpOworICAgIFNFVEJVSUxUSU4oImZyb3plbnNldCIsICAgICAgICAgICAgICZQeUZyb3plblNldF9UeXBlKTsKKyAgICBTRVRCVUlMVElOKCJwcm9wZXJ0eSIsICAgICAgICAgICAgICAmUHlQcm9wZXJ0eV9UeXBlKTsKKyAgICBTRVRCVUlMVElOKCJpbnQiLCAgICAgICAgICAgICAgICAgICAmUHlJbnRfVHlwZSk7CisgICAgU0VUQlVJTFRJTigibGlzdCIsICAgICAgICAgICAgICAgICAgJlB5TGlzdF9UeXBlKTsKKyAgICBTRVRCVUlMVElOKCJsb25nIiwgICAgICAgICAgICAgICAgICAmUHlMb25nX1R5cGUpOworICAgIFNFVEJVSUxUSU4oIm9iamVjdCIsICAgICAgICAgICAgICAgICZQeUJhc2VPYmplY3RfVHlwZSk7CisgICAgU0VUQlVJTFRJTigicmV2ZXJzZWQiLCAgICAgICAgICAgICAgJlB5UmV2ZXJzZWRfVHlwZSk7CisgICAgU0VUQlVJTFRJTigic2V0IiwgICAgICAgICAgICAgICAgICAgJlB5U2V0X1R5cGUpOworICAgIFNFVEJVSUxUSU4oInNsaWNlIiwgICAgICAgICAgICAgICAgICZQeVNsaWNlX1R5cGUpOworICAgIFNFVEJVSUxUSU4oInN0YXRpY21ldGhvZCIsICAgICAgICAgICZQeVN0YXRpY01ldGhvZF9UeXBlKTsKKyAgICBTRVRCVUlMVElOKCJzdHIiLCAgICAgICAgICAgICAgICAgICAmUHlTdHJpbmdfVHlwZSk7CisgICAgU0VUQlVJTFRJTigic3VwZXIiLCAgICAgICAgICAgICAgICAgJlB5U3VwZXJfVHlwZSk7CisgICAgU0VUQlVJTFRJTigidHVwbGUiLCAgICAgICAgICAgICAgICAgJlB5VHVwbGVfVHlwZSk7CisgICAgU0VUQlVJTFRJTigidHlwZSIsICAgICAgICAgICAgICAgICAgJlB5VHlwZV9UeXBlKTsKKyAgICBTRVRCVUlMVElOKCJ4cmFuZ2UiLCAgICAgICAgICAgICAgICAmUHlSYW5nZV9UeXBlKTsKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JU0VUQlVJTFRJTigidW5pY29kZSIsCQkmUHlVbmljb2RlX1R5cGUpOworICAgIFNFVEJVSUxUSU4oInVuaWNvZGUiLCAgICAgICAgICAgICAgICZQeVVuaWNvZGVfVHlwZSk7CiAjZW5kaWYKLQlkZWJ1ZyA9IFB5Qm9vbF9Gcm9tTG9uZyhQeV9PcHRpbWl6ZUZsYWcgPT0gMCk7Ci0JaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsICJfX2RlYnVnX18iLCBkZWJ1ZykgPCAwKSB7Ci0JCVB5X1hERUNSRUYoZGVidWcpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JUHlfWERFQ1JFRihkZWJ1Zyk7CisgICAgZGVidWcgPSBQeUJvb2xfRnJvbUxvbmcoUHlfT3B0aW1pemVGbGFnID09IDApOworICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCAiX19kZWJ1Z19fIiwgZGVidWcpIDwgMCkgeworICAgICAgICBQeV9YREVDUkVGKGRlYnVnKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5X1hERUNSRUYoZGVidWcpOwogCi0JcmV0dXJuIG1vZDsKKyAgICByZXR1cm4gbW9kOwogI3VuZGVmIEFERF9UT19BTEwKICN1bmRlZiBTRVRCVUlMVElOCiB9CkBAIC0yNzExLDY5ICsyNzExLDY5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZmlsdGVydHVwbGUoUHlPYmplY3QgKmZ1bmMsIFB5T2JqZWN0ICp0dXBsZSkKIHsKLQlQeU9iamVjdCAqcmVzdWx0OwotCVB5X3NzaXplX3QgaSwgajsKLQlQeV9zc2l6ZV90IGxlbiA9IFB5VHVwbGVfU2l6ZSh0dXBsZSk7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICBQeV9zc2l6ZV90IGksIGo7CisgICAgUHlfc3NpemVfdCBsZW4gPSBQeVR1cGxlX1NpemUodHVwbGUpOwogCi0JaWYgKGxlbiA9PSAwKSB7Ci0JCWlmIChQeVR1cGxlX0NoZWNrRXhhY3QodHVwbGUpKQotCQkJUHlfSU5DUkVGKHR1cGxlKTsKLQkJZWxzZQotCQkJdHVwbGUgPSBQeVR1cGxlX05ldygwKTsKLQkJcmV0dXJuIHR1cGxlOwotCX0KKyAgICBpZiAobGVuID09IDApIHsKKyAgICAgICAgaWYgKFB5VHVwbGVfQ2hlY2tFeGFjdCh0dXBsZSkpCisgICAgICAgICAgICBQeV9JTkNSRUYodHVwbGUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICB0dXBsZSA9IFB5VHVwbGVfTmV3KDApOworICAgICAgICByZXR1cm4gdHVwbGU7CisgICAgfQogCi0JaWYgKChyZXN1bHQgPSBQeVR1cGxlX05ldyhsZW4pKSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoKHJlc3VsdCA9IFB5VHVwbGVfTmV3KGxlbikpID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JZm9yIChpID0gaiA9IDA7IGkgPCBsZW47ICsraSkgewotCQlQeU9iamVjdCAqaXRlbSwgKmdvb2Q7Ci0JCWludCBvazsKKyAgICBmb3IgKGkgPSBqID0gMDsgaSA8IGxlbjsgKytpKSB7CisgICAgICAgIFB5T2JqZWN0ICppdGVtLCAqZ29vZDsKKyAgICAgICAgaW50IG9rOwogCi0JCWlmICh0dXBsZS0+b2JfdHlwZS0+dHBfYXNfc2VxdWVuY2UgJiYKLQkJICAgIHR1cGxlLT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZS0+c3FfaXRlbSkgewotCQkJaXRlbSA9IHR1cGxlLT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZS0+c3FfaXRlbSh0dXBsZSwgaSk7Ci0JCQlpZiAoaXRlbSA9PSBOVUxMKQotCQkJCWdvdG8gRmFpbF8xOwotCQl9IGVsc2UgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImZpbHRlcigpOiB1bnN1YnNjcmlwdGFibGUgdHVwbGUiKTsKLQkJCWdvdG8gRmFpbF8xOwotCQl9Ci0JCWlmIChmdW5jID09IFB5X05vbmUpIHsKLQkJCVB5X0lOQ1JFRihpdGVtKTsKLQkJCWdvb2QgPSBpdGVtOwotCQl9Ci0JCWVsc2UgewotCQkJUHlPYmplY3QgKmFyZyA9IFB5VHVwbGVfUGFjaygxLCBpdGVtKTsKLQkJCWlmIChhcmcgPT0gTlVMTCkgewotCQkJCVB5X0RFQ1JFRihpdGVtKTsKLQkJCQlnb3RvIEZhaWxfMTsKLQkJCX0KLQkJCWdvb2QgPSBQeUV2YWxfQ2FsbE9iamVjdChmdW5jLCBhcmcpOwotCQkJUHlfREVDUkVGKGFyZyk7Ci0JCQlpZiAoZ29vZCA9PSBOVUxMKSB7Ci0JCQkJUHlfREVDUkVGKGl0ZW0pOwotCQkJCWdvdG8gRmFpbF8xOwotCQkJfQotCQl9Ci0JCW9rID0gUHlPYmplY3RfSXNUcnVlKGdvb2QpOwotCQlQeV9ERUNSRUYoZ29vZCk7Ci0JCWlmIChvaykgewotCQkJaWYgKFB5VHVwbGVfU2V0SXRlbShyZXN1bHQsIGorKywgaXRlbSkgPCAwKQotCQkJCWdvdG8gRmFpbF8xOwotCQl9Ci0JCWVsc2UKLQkJCVB5X0RFQ1JFRihpdGVtKTsKLQl9CisgICAgICAgIGlmICh0dXBsZS0+b2JfdHlwZS0+dHBfYXNfc2VxdWVuY2UgJiYKKyAgICAgICAgICAgIHR1cGxlLT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZS0+c3FfaXRlbSkgeworICAgICAgICAgICAgaXRlbSA9IHR1cGxlLT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZS0+c3FfaXRlbSh0dXBsZSwgaSk7CisgICAgICAgICAgICBpZiAoaXRlbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGdvdG8gRmFpbF8xOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImZpbHRlcigpOiB1bnN1YnNjcmlwdGFibGUgdHVwbGUiKTsKKyAgICAgICAgICAgIGdvdG8gRmFpbF8xOworICAgICAgICB9CisgICAgICAgIGlmIChmdW5jID09IFB5X05vbmUpIHsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihpdGVtKTsKKyAgICAgICAgICAgIGdvb2QgPSBpdGVtOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgUHlPYmplY3QgKmFyZyA9IFB5VHVwbGVfUGFjaygxLCBpdGVtKTsKKyAgICAgICAgICAgIGlmIChhcmcgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICAgICAgICAgICAgICBnb3RvIEZhaWxfMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGdvb2QgPSBQeUV2YWxfQ2FsbE9iamVjdChmdW5jLCBhcmcpOworICAgICAgICAgICAgUHlfREVDUkVGKGFyZyk7CisgICAgICAgICAgICBpZiAoZ29vZCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgICAgICAgICAgICAgIGdvdG8gRmFpbF8xOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG9rID0gUHlPYmplY3RfSXNUcnVlKGdvb2QpOworICAgICAgICBQeV9ERUNSRUYoZ29vZCk7CisgICAgICAgIGlmIChvaykgeworICAgICAgICAgICAgaWYgKFB5VHVwbGVfU2V0SXRlbShyZXN1bHQsIGorKywgaXRlbSkgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gRmFpbF8xOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICB9CiAKLQlpZiAoX1B5VHVwbGVfUmVzaXplKCZyZXN1bHQsIGopIDwgMCkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKF9QeVR1cGxlX1Jlc2l6ZSgmcmVzdWx0LCBqKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JcmV0dXJuIHJlc3VsdDsKKyAgICByZXR1cm4gcmVzdWx0OwogCiBGYWlsXzE6Ci0JUHlfREVDUkVGKHJlc3VsdCk7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIApAQCAtMjc4MiwxMjUgKzI3ODIsMTI1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZmlsdGVyc3RyaW5nKFB5T2JqZWN0ICpmdW5jLCBQeU9iamVjdCAqc3Ryb2JqKQogewotCVB5T2JqZWN0ICpyZXN1bHQ7Ci0JUHlfc3NpemVfdCBpLCBqOwotCVB5X3NzaXplX3QgbGVuID0gUHlTdHJpbmdfU2l6ZShzdHJvYmopOwotCVB5X3NzaXplX3Qgb3V0bGVuID0gbGVuOworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisgICAgUHlfc3NpemVfdCBpLCBqOworICAgIFB5X3NzaXplX3QgbGVuID0gUHlTdHJpbmdfU2l6ZShzdHJvYmopOworICAgIFB5X3NzaXplX3Qgb3V0bGVuID0gbGVuOwogCi0JaWYgKGZ1bmMgPT0gUHlfTm9uZSkgewotCQkvKiBJZiBpdCdzIGEgcmVhbCBzdHJpbmcgd2UgY2FuIHJldHVybiB0aGUgb3JpZ2luYWwsCi0JCSAqIGFzIG5vIGNoYXJhY3RlciBpcyBldmVyIGZhbHNlIGFuZCBfX2dldGl0ZW1fXwotCQkgKiBkb2VzIHJldHVybiB0aGlzIGNoYXJhY3Rlci4gSWYgaXQncyBhIHN1YmNsYXNzCi0JCSAqIHdlIG11c3QgZ28gdGhyb3VnaCB0aGUgX19nZXRpdGVtX18gbG9vcCAqLwotCQlpZiAoUHlTdHJpbmdfQ2hlY2tFeGFjdChzdHJvYmopKSB7Ci0JCQlQeV9JTkNSRUYoc3Ryb2JqKTsKLQkJCXJldHVybiBzdHJvYmo7Ci0JCX0KLQl9Ci0JaWYgKChyZXN1bHQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBsZW4pKSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoZnVuYyA9PSBQeV9Ob25lKSB7CisgICAgICAgIC8qIElmIGl0J3MgYSByZWFsIHN0cmluZyB3ZSBjYW4gcmV0dXJuIHRoZSBvcmlnaW5hbCwKKyAgICAgICAgICogYXMgbm8gY2hhcmFjdGVyIGlzIGV2ZXIgZmFsc2UgYW5kIF9fZ2V0aXRlbV9fCisgICAgICAgICAqIGRvZXMgcmV0dXJuIHRoaXMgY2hhcmFjdGVyLiBJZiBpdCdzIGEgc3ViY2xhc3MKKyAgICAgICAgICogd2UgbXVzdCBnbyB0aHJvdWdoIHRoZSBfX2dldGl0ZW1fXyBsb29wICovCisgICAgICAgIGlmIChQeVN0cmluZ19DaGVja0V4YWN0KHN0cm9iaikpIHsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihzdHJvYmopOworICAgICAgICAgICAgcmV0dXJuIHN0cm9iajsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoKHJlc3VsdCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGxlbikpID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JZm9yIChpID0gaiA9IDA7IGkgPCBsZW47ICsraSkgewotCQlQeU9iamVjdCAqaXRlbTsKLQkJaW50IG9rOworICAgIGZvciAoaSA9IGogPSAwOyBpIDwgbGVuOyArK2kpIHsKKyAgICAgICAgUHlPYmplY3QgKml0ZW07CisgICAgICAgIGludCBvazsKIAotCQlpdGVtID0gKCpzdHJvYmotPm9iX3R5cGUtPnRwX2FzX3NlcXVlbmNlLT5zcV9pdGVtKShzdHJvYmosIGkpOwotCQlpZiAoaXRlbSA9PSBOVUxMKQotCQkJZ290byBGYWlsXzE7Ci0JCWlmIChmdW5jPT1QeV9Ob25lKSB7Ci0JCQlvayA9IDE7Ci0JCX0gZWxzZSB7Ci0JCQlQeU9iamVjdCAqYXJnLCAqZ29vZDsKLQkJCWFyZyA9IFB5VHVwbGVfUGFjaygxLCBpdGVtKTsKLQkJCWlmIChhcmcgPT0gTlVMTCkgewotCQkJCVB5X0RFQ1JFRihpdGVtKTsKLQkJCQlnb3RvIEZhaWxfMTsKLQkJCX0KLQkJCWdvb2QgPSBQeUV2YWxfQ2FsbE9iamVjdChmdW5jLCBhcmcpOwotCQkJUHlfREVDUkVGKGFyZyk7Ci0JCQlpZiAoZ29vZCA9PSBOVUxMKSB7Ci0JCQkJUHlfREVDUkVGKGl0ZW0pOwotCQkJCWdvdG8gRmFpbF8xOwotCQkJfQotCQkJb2sgPSBQeU9iamVjdF9Jc1RydWUoZ29vZCk7Ci0JCQlQeV9ERUNSRUYoZ29vZCk7Ci0JCX0KLQkJaWYgKG9rKSB7Ci0JCQlQeV9zc2l6ZV90IHJlc2xlbjsKLQkJCWlmICghUHlTdHJpbmdfQ2hlY2soaXRlbSkpIHsKLQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiY2FuJ3QgZmlsdGVyIHN0ciB0byBzdHI6IgotCQkJCQkiIF9fZ2V0aXRlbV9fIHJldHVybmVkIGRpZmZlcmVudCB0eXBlIik7Ci0JCQkJUHlfREVDUkVGKGl0ZW0pOwotCQkJCWdvdG8gRmFpbF8xOwotCQkJfQotCQkJcmVzbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUoaXRlbSk7Ci0JCQlpZiAocmVzbGVuID09IDEpIHsKLQkJCQlQeVN0cmluZ19BU19TVFJJTkcocmVzdWx0KVtqKytdID0KLQkJCQkJUHlTdHJpbmdfQVNfU1RSSU5HKGl0ZW0pWzBdOwotCQkJfSBlbHNlIHsKLQkJCQkvKiBkbyB3ZSBuZWVkIG1vcmUgc3BhY2U/ICovCi0JCQkJUHlfc3NpemVfdCBuZWVkID0gajsKKyAgICAgICAgaXRlbSA9ICgqc3Ryb2JqLT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZS0+c3FfaXRlbSkoc3Ryb2JqLCBpKTsKKyAgICAgICAgaWYgKGl0ZW0gPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gRmFpbF8xOworICAgICAgICBpZiAoZnVuYz09UHlfTm9uZSkgeworICAgICAgICAgICAgb2sgPSAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgUHlPYmplY3QgKmFyZywgKmdvb2Q7CisgICAgICAgICAgICBhcmcgPSBQeVR1cGxlX1BhY2soMSwgaXRlbSk7CisgICAgICAgICAgICBpZiAoYXJnID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CisgICAgICAgICAgICAgICAgZ290byBGYWlsXzE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBnb29kID0gUHlFdmFsX0NhbGxPYmplY3QoZnVuYywgYXJnKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihhcmcpOworICAgICAgICAgICAgaWYgKGdvb2QgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICAgICAgICAgICAgICBnb3RvIEZhaWxfMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9rID0gUHlPYmplY3RfSXNUcnVlKGdvb2QpOworICAgICAgICAgICAgUHlfREVDUkVGKGdvb2QpOworICAgICAgICB9CisgICAgICAgIGlmIChvaykgeworICAgICAgICAgICAgUHlfc3NpemVfdCByZXNsZW47CisgICAgICAgICAgICBpZiAoIVB5U3RyaW5nX0NoZWNrKGl0ZW0pKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImNhbid0IGZpbHRlciBzdHIgdG8gc3RyOiIKKyAgICAgICAgICAgICAgICAgICAgIiBfX2dldGl0ZW1fXyByZXR1cm5lZCBkaWZmZXJlbnQgdHlwZSIpOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICAgICAgICAgICAgICBnb3RvIEZhaWxfMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc2xlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKGl0ZW0pOworICAgICAgICAgICAgaWYgKHJlc2xlbiA9PSAxKSB7CisgICAgICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKHJlc3VsdClbaisrXSA9CisgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FTX1NUUklORyhpdGVtKVswXTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyogZG8gd2UgbmVlZCBtb3JlIHNwYWNlPyAqLworICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgbmVlZCA9IGo7CiAKLQkJCQkvKiBjYWxjdWxhdGUgc3BhY2UgcmVxdWlyZW1lbnRzIHdoaWxlIGNoZWNraW5nIGZvciBvdmVyZmxvdyAqLwotCQkJCWlmIChuZWVkID4gUFlfU1NJWkVfVF9NQVggLSByZXNsZW4pIHsKLQkJCQkJUHlfREVDUkVGKGl0ZW0pOwotCQkJCQlnb3RvIEZhaWxfMTsKLQkJCQl9CisgICAgICAgICAgICAgICAgLyogY2FsY3VsYXRlIHNwYWNlIHJlcXVpcmVtZW50cyB3aGlsZSBjaGVja2luZyBmb3Igb3ZlcmZsb3cgKi8KKyAgICAgICAgICAgICAgICBpZiAobmVlZCA+IFBZX1NTSVpFX1RfTUFYIC0gcmVzbGVuKSB7CisgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBGYWlsXzE7CisgICAgICAgICAgICAgICAgfQogCi0JCQkJbmVlZCArPSByZXNsZW47CisgICAgICAgICAgICAgICAgbmVlZCArPSByZXNsZW47CiAKLQkJCQlpZiAobmVlZCA+IFBZX1NTSVpFX1RfTUFYIC0gbGVuKSB7Ci0JCQkJCVB5X0RFQ1JFRihpdGVtKTsKLQkJCQkJZ290byBGYWlsXzE7Ci0JCQkJfQorICAgICAgICAgICAgICAgIGlmIChuZWVkID4gUFlfU1NJWkVfVF9NQVggLSBsZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgICAgICAgICAgICAgICAgICBnb3RvIEZhaWxfMTsKKyAgICAgICAgICAgICAgICB9CiAKLQkJCQluZWVkICs9IGxlbjsKKyAgICAgICAgICAgICAgICBuZWVkICs9IGxlbjsKIAotCQkJCWlmIChuZWVkIDw9IGkpIHsKLQkJCQkJUHlfREVDUkVGKGl0ZW0pOwotCQkJCQlnb3RvIEZhaWxfMTsKLQkJCQl9CisgICAgICAgICAgICAgICAgaWYgKG5lZWQgPD0gaSkgeworICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gRmFpbF8xOworICAgICAgICAgICAgICAgIH0KIAotCQkJCW5lZWQgPSBuZWVkIC0gaSAtIDE7CisgICAgICAgICAgICAgICAgbmVlZCA9IG5lZWQgLSBpIC0gMTsKIAotCQkJCWFzc2VydChuZWVkID49IDApOwotCQkJCWFzc2VydChvdXRsZW4gPj0gMCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0KG5lZWQgPj0gMCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0KG91dGxlbiA+PSAwKTsKIAotCQkJCWlmIChuZWVkID4gb3V0bGVuKSB7Ci0JCQkJCS8qIG92ZXJhbGxvY2F0ZSwgdG8gYXZvaWQgcmVhbGxvY2F0aW9ucyAqLwotCQkJCQlpZiAob3V0bGVuID4gUFlfU1NJWkVfVF9NQVggLyAyKSB7Ci0JCQkJCQlQeV9ERUNSRUYoaXRlbSk7Ci0JCQkJCQlyZXR1cm4gTlVMTDsKLQkJCQkJfQorICAgICAgICAgICAgICAgIGlmIChuZWVkID4gb3V0bGVuKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIG92ZXJhbGxvY2F0ZSwgdG8gYXZvaWQgcmVhbGxvY2F0aW9ucyAqLworICAgICAgICAgICAgICAgICAgICBpZiAob3V0bGVuID4gUFlfU1NJWkVfVF9NQVggLyAyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgfQogCi0JCQkJCWlmIChuZWVkPDIqb3V0bGVuKSB7Ci0JCQkJCQluZWVkID0gMipvdXRsZW47Ci0gICAgICAgICAgfQotCQkJCQlpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmcmVzdWx0LCBuZWVkKSkgewotCQkJCQkJUHlfREVDUkVGKGl0ZW0pOwotCQkJCQkJcmV0dXJuIE5VTEw7Ci0JCQkJCX0KLQkJCQkJb3V0bGVuID0gbmVlZDsKLQkJCQl9Ci0JCQkJbWVtY3B5KAotCQkJCQlQeVN0cmluZ19BU19TVFJJTkcocmVzdWx0KSArIGosCi0JCQkJCVB5U3RyaW5nX0FTX1NUUklORyhpdGVtKSwKLQkJCQkJcmVzbGVuCi0JCQkJKTsKLQkJCQlqICs9IHJlc2xlbjsKLQkJCX0KLQkJfQotCQlQeV9ERUNSRUYoaXRlbSk7Ci0JfQorICAgICAgICAgICAgICAgICAgICBpZiAobmVlZDwyKm91dGxlbikgeworICAgICAgICAgICAgICAgICAgICAgICAgbmVlZCA9IDIqb3V0bGVuOworICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9QeVN0cmluZ19SZXNpemUoJnJlc3VsdCwgbmVlZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGxlbiA9IG5lZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FTX1NUUklORyhyZXN1bHQpICsgaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FTX1NUUklORyhpdGVtKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2xlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaiArPSByZXNsZW47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CisgICAgfQogCi0JaWYgKGogPCBvdXRsZW4pCi0JCV9QeVN0cmluZ19SZXNpemUoJnJlc3VsdCwgaik7CisgICAgaWYgKGogPCBvdXRsZW4pCisgICAgICAgIF9QeVN0cmluZ19SZXNpemUoJnJlc3VsdCwgaik7CiAKLQlyZXR1cm4gcmVzdWx0OworICAgIHJldHVybiByZXN1bHQ7CiAKIEZhaWxfMToKLQlQeV9ERUNSRUYocmVzdWx0KTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKQEAgLTI5MDksMTEyICsyOTA5LDExMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGZpbHRlcnVuaWNvZGUoUHlPYmplY3QgKmZ1bmMsIFB5T2JqZWN0ICpzdHJvYmopCiB7Ci0JUHlPYmplY3QgKnJlc3VsdDsKLQlyZWdpc3RlciBQeV9zc2l6ZV90IGksIGo7Ci0JUHlfc3NpemVfdCBsZW4gPSBQeVVuaWNvZGVfR2V0U2l6ZShzdHJvYmopOwotCVB5X3NzaXplX3Qgb3V0bGVuID0gbGVuOworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisgICAgcmVnaXN0ZXIgUHlfc3NpemVfdCBpLCBqOworICAgIFB5X3NzaXplX3QgbGVuID0gUHlVbmljb2RlX0dldFNpemUoc3Ryb2JqKTsKKyAgICBQeV9zc2l6ZV90IG91dGxlbiA9IGxlbjsKIAotCWlmIChmdW5jID09IFB5X05vbmUpIHsKLQkJLyogSWYgaXQncyBhIHJlYWwgc3RyaW5nIHdlIGNhbiByZXR1cm4gdGhlIG9yaWdpbmFsLAotCQkgKiBhcyBubyBjaGFyYWN0ZXIgaXMgZXZlciBmYWxzZSBhbmQgX19nZXRpdGVtX18KLQkJICogZG9lcyByZXR1cm4gdGhpcyBjaGFyYWN0ZXIuIElmIGl0J3MgYSBzdWJjbGFzcwotCQkgKiB3ZSBtdXN0IGdvIHRocm91Z2ggdGhlIF9fZ2V0aXRlbV9fIGxvb3AgKi8KLQkJaWYgKFB5VW5pY29kZV9DaGVja0V4YWN0KHN0cm9iaikpIHsKLQkJCVB5X0lOQ1JFRihzdHJvYmopOwotCQkJcmV0dXJuIHN0cm9iajsKLQkJfQotCX0KLQlpZiAoKHJlc3VsdCA9IFB5VW5pY29kZV9Gcm9tVW5pY29kZShOVUxMLCBsZW4pKSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoZnVuYyA9PSBQeV9Ob25lKSB7CisgICAgICAgIC8qIElmIGl0J3MgYSByZWFsIHN0cmluZyB3ZSBjYW4gcmV0dXJuIHRoZSBvcmlnaW5hbCwKKyAgICAgICAgICogYXMgbm8gY2hhcmFjdGVyIGlzIGV2ZXIgZmFsc2UgYW5kIF9fZ2V0aXRlbV9fCisgICAgICAgICAqIGRvZXMgcmV0dXJuIHRoaXMgY2hhcmFjdGVyLiBJZiBpdCdzIGEgc3ViY2xhc3MKKyAgICAgICAgICogd2UgbXVzdCBnbyB0aHJvdWdoIHRoZSBfX2dldGl0ZW1fXyBsb29wICovCisgICAgICAgIGlmIChQeVVuaWNvZGVfQ2hlY2tFeGFjdChzdHJvYmopKSB7CisgICAgICAgICAgICBQeV9JTkNSRUYoc3Ryb2JqKTsKKyAgICAgICAgICAgIHJldHVybiBzdHJvYmo7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKChyZXN1bHQgPSBQeVVuaWNvZGVfRnJvbVVuaWNvZGUoTlVMTCwgbGVuKSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlmb3IgKGkgPSBqID0gMDsgaSA8IGxlbjsgKytpKSB7Ci0JCVB5T2JqZWN0ICppdGVtLCAqYXJnLCAqZ29vZDsKLQkJaW50IG9rOworICAgIGZvciAoaSA9IGogPSAwOyBpIDwgbGVuOyArK2kpIHsKKyAgICAgICAgUHlPYmplY3QgKml0ZW0sICphcmcsICpnb29kOworICAgICAgICBpbnQgb2s7CiAKLQkJaXRlbSA9ICgqc3Ryb2JqLT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZS0+c3FfaXRlbSkoc3Ryb2JqLCBpKTsKLQkJaWYgKGl0ZW0gPT0gTlVMTCkKLQkJCWdvdG8gRmFpbF8xOwotCQlpZiAoZnVuYyA9PSBQeV9Ob25lKSB7Ci0JCQlvayA9IDE7Ci0JCX0gZWxzZSB7Ci0JCQlhcmcgPSBQeVR1cGxlX1BhY2soMSwgaXRlbSk7Ci0JCQlpZiAoYXJnID09IE5VTEwpIHsKLQkJCQlQeV9ERUNSRUYoaXRlbSk7Ci0JCQkJZ290byBGYWlsXzE7Ci0JCQl9Ci0JCQlnb29kID0gUHlFdmFsX0NhbGxPYmplY3QoZnVuYywgYXJnKTsKLQkJCVB5X0RFQ1JFRihhcmcpOwotCQkJaWYgKGdvb2QgPT0gTlVMTCkgewotCQkJCVB5X0RFQ1JFRihpdGVtKTsKLQkJCQlnb3RvIEZhaWxfMTsKLQkJCX0KLQkJCW9rID0gUHlPYmplY3RfSXNUcnVlKGdvb2QpOwotCQkJUHlfREVDUkVGKGdvb2QpOwotCQl9Ci0JCWlmIChvaykgewotCQkJUHlfc3NpemVfdCByZXNsZW47Ci0JCQlpZiAoIVB5VW5pY29kZV9DaGVjayhpdGVtKSkgewotCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJImNhbid0IGZpbHRlciB1bmljb2RlIHRvIHVuaWNvZGU6IgotCQkJCSIgX19nZXRpdGVtX18gcmV0dXJuZWQgZGlmZmVyZW50IHR5cGUiKTsKLQkJCQlQeV9ERUNSRUYoaXRlbSk7Ci0JCQkJZ290byBGYWlsXzE7Ci0JCQl9Ci0JCQlyZXNsZW4gPSBQeVVuaWNvZGVfR0VUX1NJWkUoaXRlbSk7Ci0JCQlpZiAocmVzbGVuID09IDEpCi0JCQkJUHlVbmljb2RlX0FTX1VOSUNPREUocmVzdWx0KVtqKytdID0KLQkJCQkJUHlVbmljb2RlX0FTX1VOSUNPREUoaXRlbSlbMF07Ci0JCQllbHNlIHsKLQkJCQkvKiBkbyB3ZSBuZWVkIG1vcmUgc3BhY2U/ICovCi0JCQkJUHlfc3NpemVfdCBuZWVkID0gaiArIHJlc2xlbiArIGxlbiAtIGkgLSAxOwotICAgICAgICAKLQkJCQkvKiBjaGVjayB0aGF0IGRpZG50IG92ZXJmbG93ICovCi0JCQkJaWYgKChqID4gUFlfU1NJWkVfVF9NQVggLSByZXNsZW4pIHx8Ci0JCQkJCSgoaiArIHJlc2xlbikgPiBQWV9TU0laRV9UX01BWCAtIGxlbikgfHwKLQkJCQkJCSgoaiArIHJlc2xlbiArIGxlbikgPCBpKSB8fAotCQkJCQkJCSgoaiArIHJlc2xlbiArIGxlbiAtIGkpIDw9IDApKSB7Ci0JCQkJCVB5X0RFQ1JFRihpdGVtKTsKLQkJCQkJcmV0dXJuIE5VTEw7Ci0JCQkJfQorICAgICAgICBpdGVtID0gKCpzdHJvYmotPm9iX3R5cGUtPnRwX2FzX3NlcXVlbmNlLT5zcV9pdGVtKShzdHJvYmosIGkpOworICAgICAgICBpZiAoaXRlbSA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBGYWlsXzE7CisgICAgICAgIGlmIChmdW5jID09IFB5X05vbmUpIHsKKyAgICAgICAgICAgIG9rID0gMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFyZyA9IFB5VHVwbGVfUGFjaygxLCBpdGVtKTsKKyAgICAgICAgICAgIGlmIChhcmcgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICAgICAgICAgICAgICBnb3RvIEZhaWxfMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGdvb2QgPSBQeUV2YWxfQ2FsbE9iamVjdChmdW5jLCBhcmcpOworICAgICAgICAgICAgUHlfREVDUkVGKGFyZyk7CisgICAgICAgICAgICBpZiAoZ29vZCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgICAgICAgICAgICAgIGdvdG8gRmFpbF8xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb2sgPSBQeU9iamVjdF9Jc1RydWUoZ29vZCk7CisgICAgICAgICAgICBQeV9ERUNSRUYoZ29vZCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG9rKSB7CisgICAgICAgICAgICBQeV9zc2l6ZV90IHJlc2xlbjsKKyAgICAgICAgICAgIGlmICghUHlVbmljb2RlX0NoZWNrKGl0ZW0pKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAiY2FuJ3QgZmlsdGVyIHVuaWNvZGUgdG8gdW5pY29kZToiCisgICAgICAgICAgICAgICAgIiBfX2dldGl0ZW1fXyByZXR1cm5lZCBkaWZmZXJlbnQgdHlwZSIpOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICAgICAgICAgICAgICBnb3RvIEZhaWxfMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc2xlbiA9IFB5VW5pY29kZV9HRVRfU0laRShpdGVtKTsKKyAgICAgICAgICAgIGlmIChyZXNsZW4gPT0gMSkKKyAgICAgICAgICAgICAgICBQeVVuaWNvZGVfQVNfVU5JQ09ERShyZXN1bHQpW2orK10gPQorICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfQVNfVU5JQ09ERShpdGVtKVswXTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIC8qIGRvIHdlIG5lZWQgbW9yZSBzcGFjZT8gKi8KKyAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IG5lZWQgPSBqICsgcmVzbGVuICsgbGVuIC0gaSAtIDE7CiAKLQkJCQlhc3NlcnQobmVlZCA+PSAwKTsKLQkJCQlhc3NlcnQob3V0bGVuID49IDApOwotCQkJCQotCQkJCWlmIChuZWVkID4gb3V0bGVuKSB7Ci0JCQkJCS8qIG92ZXJhbGxvY2F0ZSwKLQkJCQkJICAgdG8gYXZvaWQgcmVhbGxvY2F0aW9ucyAqLwotCQkJCQlpZiAobmVlZCA8IDIgKiBvdXRsZW4pIHsKLSAgICAgICAgICAgIGlmIChvdXRsZW4gPiBQWV9TU0laRV9UX01BWCAvIDIpIHsKLSAgICAgICAgICAgICAgUHlfREVDUkVGKGl0ZW0pOwotICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJbmVlZCA9IDIgKiBvdXRsZW47Ci0JCQkJICAgIH0KLSAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLyogY2hlY2sgdGhhdCBkaWRudCBvdmVyZmxvdyAqLworICAgICAgICAgICAgICAgIGlmICgoaiA+IFBZX1NTSVpFX1RfTUFYIC0gcmVzbGVuKSB8fAorICAgICAgICAgICAgICAgICAgICAoKGogKyByZXNsZW4pID4gUFlfU1NJWkVfVF9NQVggLSBsZW4pIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAoKGogKyByZXNsZW4gKyBsZW4pIDwgaSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGogKyByZXNsZW4gKyBsZW4gLSBpKSA8PSAwKSkgeworICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgIH0KIAotCQkJCQlpZiAoUHlVbmljb2RlX1Jlc2l6ZSgKLQkJCQkJCSZyZXN1bHQsIG5lZWQpIDwgMCkgewotCQkJCQkJUHlfREVDUkVGKGl0ZW0pOwotCQkJCQkJZ290byBGYWlsXzE7Ci0JCQkJCX0KLQkJCQkJb3V0bGVuID0gbmVlZDsKLQkJCQl9Ci0JCQkJbWVtY3B5KFB5VW5pY29kZV9BU19VTklDT0RFKHJlc3VsdCkgKyBqLAotCQkJCSAgICAgICBQeVVuaWNvZGVfQVNfVU5JQ09ERShpdGVtKSwKLQkJCQkgICAgICAgcmVzbGVuKnNpemVvZihQeV9VTklDT0RFKSk7Ci0JCQkJaiArPSByZXNsZW47Ci0JCQl9Ci0JCX0KLQkJUHlfREVDUkVGKGl0ZW0pOwotCX0KKyAgICAgICAgICAgICAgICBhc3NlcnQobmVlZCA+PSAwKTsKKyAgICAgICAgICAgICAgICBhc3NlcnQob3V0bGVuID49IDApOwogCi0JaWYgKGogPCBvdXRsZW4pCi0JCVB5VW5pY29kZV9SZXNpemUoJnJlc3VsdCwgaik7CisgICAgICAgICAgICAgICAgaWYgKG5lZWQgPiBvdXRsZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgLyogb3ZlcmFsbG9jYXRlLAorICAgICAgICAgICAgICAgICAgICAgICB0byBhdm9pZCByZWFsbG9jYXRpb25zICovCisgICAgICAgICAgICAgICAgICAgIGlmIChuZWVkIDwgMiAqIG91dGxlbikgeworICAgICAgICBpZiAob3V0bGVuID4gUFlfU1NJWkVfVF9NQVggLyAyKSB7CisgICAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWQgPSAyICogb3V0bGVuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICB9CiAKLQlyZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFB5VW5pY29kZV9SZXNpemUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHQsIG5lZWQpIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gRmFpbF8xOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0bGVuID0gbmVlZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KFB5VW5pY29kZV9BU19VTklDT0RFKHJlc3VsdCkgKyBqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfQVNfVU5JQ09ERShpdGVtKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzbGVuKnNpemVvZihQeV9VTklDT0RFKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaiArPSByZXNsZW47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CisgICAgfQorCisgICAgaWYgKGogPCBvdXRsZW4pCisgICAgICAgIFB5VW5pY29kZV9SZXNpemUoJnJlc3VsdCwgaik7CisKKyAgICByZXR1cm4gcmVzdWx0OwogCiBGYWlsXzE6Ci0JUHlfREVDUkVGKHJlc3VsdCk7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL1B5dGhvbi9jZXZhbC5jIGIvUHl0aG9uL2NldmFsLmMKaW5kZXggNmRkMzcwZi4uNGRkMGU5MiAxMDA2NDQKLS0tIGEvUHl0aG9uL2NldmFsLmMKKysrIGIvUHl0aG9uL2NldmFsLmMKQEAgLTI4LDI3ICsyOCwyNyBAQAogdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgdWludDY0OwogCiAjaWYgZGVmaW5lZChfX3BwY19fKSAvKiA8LSBEb24ndCBrbm93IGlmIHRoaXMgaXMgdGhlIGNvcnJlY3Qgc3ltYm9sOyB0aGlzCi0JCQkgICBzZWN0aW9uIHNob3VsZCB3b3JrIGZvciBHQ0Mgb24gYW55IFBvd2VyUEMKLQkJCSAgIHBsYXRmb3JtLCBpcnJlc3BlY3RpdmUgb2YgT1MuCi0JCQkgICBQT1dFUj8gIFdobyBrbm93cyA6LSkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb24gc2hvdWxkIHdvcmsgZm9yIEdDQyBvbiBhbnkgUG93ZXJQQworICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhdGZvcm0sIGlycmVzcGVjdGl2ZSBvZiBPUy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFBPV0VSPyAgV2hvIGtub3dzIDotKSAqLwogCiAjZGVmaW5lIFJFQURfVElNRVNUQU1QKHZhcikgcHBjX2dldGNvdW50ZXIoJnZhcikKIAogc3RhdGljIHZvaWQKIHBwY19nZXRjb3VudGVyKHVpbnQ2NCAqdikKIHsKLQlyZWdpc3RlciB1bnNpZ25lZCBsb25nIHRidSwgdGIsIHRidTI7CisgICAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyB0YnUsIHRiLCB0YnUyOwogCiAgIGxvb3A6Ci0JYXNtIHZvbGF0aWxlICgibWZ0YnUgJTAiIDogIj1yIiAodGJ1KSApOwotCWFzbSB2b2xhdGlsZSAoIm1mdGIgICUwIiA6ICI9ciIgKHRiKSAgKTsKLQlhc20gdm9sYXRpbGUgKCJtZnRidSAlMCIgOiAiPXIiICh0YnUyKSk7Ci0JaWYgKF9fYnVpbHRpbl9leHBlY3QodGJ1ICE9IHRidTIsIDApKSBnb3RvIGxvb3A7CisgICAgYXNtIHZvbGF0aWxlICgibWZ0YnUgJTAiIDogIj1yIiAodGJ1KSApOworICAgIGFzbSB2b2xhdGlsZSAoIm1mdGIgICUwIiA6ICI9ciIgKHRiKSAgKTsKKyAgICBhc20gdm9sYXRpbGUgKCJtZnRidSAlMCIgOiAiPXIiICh0YnUyKSk7CisgICAgaWYgKF9fYnVpbHRpbl9leHBlY3QodGJ1ICE9IHRidTIsIDApKSBnb3RvIGxvb3A7CiAKLQkvKiBUaGUgc2xpZ2h0bHkgcGVjdWxpYXIgd2F5IG9mIHdyaXRpbmcgdGhlIG5leHQgbGluZXMgaXMKLQkgICBjb21waWxlZCBiZXR0ZXIgYnkgR0NDIHRoYW4gYW55IG90aGVyIHdheSBJIHRyaWVkLiAqLwotCSgobG9uZyopKHYpKVswXSA9IHRidTsKLQkoKGxvbmcqKSh2KSlbMV0gPSB0YjsKKyAgICAvKiBUaGUgc2xpZ2h0bHkgcGVjdWxpYXIgd2F5IG9mIHdyaXRpbmcgdGhlIG5leHQgbGluZXMgaXMKKyAgICAgICBjb21waWxlZCBiZXR0ZXIgYnkgR0NDIHRoYW4gYW55IG90aGVyIHdheSBJIHRyaWVkLiAqLworICAgICgobG9uZyopKHYpKVswXSA9IHRidTsKKyAgICAoKGxvbmcqKSh2KSlbMV0gPSB0YjsKIH0KIAogI2VsaWYgZGVmaW5lZChfX2kzODZfXykKQEAgLTc3LDE3ICs3NywxNyBAQAogI2VuZGlmCiAKIHZvaWQgZHVtcF90c2MoaW50IG9wY29kZSwgaW50IHRpY2tlZCwgdWludDY0IGluc3QwLCB1aW50NjQgaW5zdDEsCi0JICAgICAgdWludDY0IGxvb3AwLCB1aW50NjQgbG9vcDEsIHVpbnQ2NCBpbnRyMCwgdWludDY0IGludHIxKQorICAgICAgICAgICAgICB1aW50NjQgbG9vcDAsIHVpbnQ2NCBsb29wMSwgdWludDY0IGludHIwLCB1aW50NjQgaW50cjEpCiB7Ci0JdWludDY0IGludHIsIGluc3QsIGxvb3A7Ci0JUHlUaHJlYWRTdGF0ZSAqdHN0YXRlID0gUHlUaHJlYWRTdGF0ZV9HZXQoKTsKLQlpZiAoIXRzdGF0ZS0+aW50ZXJwLT50c2NkdW1wKQotCQlyZXR1cm47Ci0JaW50ciA9IGludHIxIC0gaW50cjA7Ci0JaW5zdCA9IGluc3QxIC0gaW5zdDAgLSBpbnRyOwotCWxvb3AgPSBsb29wMSAtIGxvb3AwIC0gaW50cjsKLQlmcHJpbnRmKHN0ZGVyciwgIm9wY29kZT0lMDNkIHQ9JWQgaW5zdD0lMDZsbGQgbG9vcD0lMDZsbGRcbiIsCi0JCW9wY29kZSwgdGlja2VkLCBpbnN0LCBsb29wKTsKKyAgICB1aW50NjQgaW50ciwgaW5zdCwgbG9vcDsKKyAgICBQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dldCgpOworICAgIGlmICghdHN0YXRlLT5pbnRlcnAtPnRzY2R1bXApCisgICAgICAgIHJldHVybjsKKyAgICBpbnRyID0gaW50cjEgLSBpbnRyMDsKKyAgICBpbnN0ID0gaW5zdDEgLSBpbnN0MCAtIGludHI7CisgICAgbG9vcCA9IGxvb3AxIC0gbG9vcDAgLSBpbnRyOworICAgIGZwcmludGYoc3RkZXJyLCAib3Bjb2RlPSUwM2QgdD0lZCBpbnN0PSUwNmxsZCBsb29wPSUwNmxsZFxuIiwKKyAgICAgICAgb3Bjb2RlLCB0aWNrZWQsIGluc3QsIGxvb3ApOwogfQogCiAjZW5kaWYKQEAgLTk3LDggKzk3LDggQEAKIAogI2lmZGVmIFB5X0RFQlVHCiAvKiBGb3IgZGVidWdnaW5nIHRoZSBpbnRlcnByZXRlcjogKi8KLSNkZWZpbmUgTExUUkFDRSAgMQkvKiBMb3ctbGV2ZWwgdHJhY2UgZmVhdHVyZSAqLwotI2RlZmluZSBDSEVDS0VYQyAxCS8qIERvdWJsZS1jaGVjayBleGNlcHRpb24gY2hlY2tpbmcgKi8KKyNkZWZpbmUgTExUUkFDRSAgMSAgICAgIC8qIExvdy1sZXZlbCB0cmFjZSBmZWF0dXJlICovCisjZGVmaW5lIENIRUNLRVhDIDEgICAgICAvKiBEb3VibGUtY2hlY2sgZXhjZXB0aW9uIGNoZWNraW5nICovCiAjZW5kaWYKIAogdHlwZWRlZiBQeU9iamVjdCAqKCpjYWxscHJvYykoUHlPYmplY3QgKiwgUHlPYmplY3QgKiwgUHlPYmplY3QgKik7CkBAIC0xMTMsNyArMTEzLDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqIGRvX2NhbGwoUHlPYmplY3QgKiwgUHlPYmplY3QgKioqLCBpbnQsIGludCk7CiBzdGF0aWMgUHlPYmplY3QgKiBleHRfZG9fY2FsbChQeU9iamVjdCAqLCBQeU9iamVjdCAqKiosIGludCwgaW50LCBpbnQpOwogc3RhdGljIFB5T2JqZWN0ICogdXBkYXRlX2tleXdvcmRfYXJncyhQeU9iamVjdCAqLCBpbnQsIFB5T2JqZWN0ICoqKiwKLQkJCQkgICAgICBQeU9iamVjdCAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKik7CiBzdGF0aWMgUHlPYmplY3QgKiB1cGRhdGVfc3Rhcl9hcmdzKGludCwgaW50LCBQeU9iamVjdCAqLCBQeU9iamVjdCAqKiopOwogc3RhdGljIFB5T2JqZWN0ICogbG9hZF9hcmdzKFB5T2JqZWN0ICoqKiwgaW50KTsKICNkZWZpbmUgQ0FMTF9GTEFHX1ZBUiAxCkBAIC0xMjQsMzggKzEyNCwzOCBAQAogc3RhdGljIGludCBwcnRyYWNlKFB5T2JqZWN0ICosIGNoYXIgKik7CiAjZW5kaWYKIHN0YXRpYyBpbnQgY2FsbF90cmFjZShQeV90cmFjZWZ1bmMsIFB5T2JqZWN0ICosIFB5RnJhbWVPYmplY3QgKiwKLQkJICAgICAgaW50LCBQeU9iamVjdCAqKTsKKyAgICAgICAgICAgICAgICAgICAgICBpbnQsIFB5T2JqZWN0ICopOwogc3RhdGljIGludCBjYWxsX3RyYWNlX3Byb3RlY3RlZChQeV90cmFjZWZ1bmMsIFB5T2JqZWN0ICosCi0JCQkJIFB5RnJhbWVPYmplY3QgKiwgaW50LCBQeU9iamVjdCAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RnJhbWVPYmplY3QgKiwgaW50LCBQeU9iamVjdCAqKTsKIHN0YXRpYyB2b2lkIGNhbGxfZXhjX3RyYWNlKFB5X3RyYWNlZnVuYywgUHlPYmplY3QgKiwgUHlGcmFtZU9iamVjdCAqKTsKIHN0YXRpYyBpbnQgbWF5YmVfY2FsbF9saW5lX3RyYWNlKFB5X3RyYWNlZnVuYywgUHlPYmplY3QgKiwKLQkJCQkgIFB5RnJhbWVPYmplY3QgKiwgaW50ICosIGludCAqLCBpbnQgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlGcmFtZU9iamVjdCAqLCBpbnQgKiwgaW50ICosIGludCAqKTsKIAogc3RhdGljIFB5T2JqZWN0ICogYXBwbHlfc2xpY2UoUHlPYmplY3QgKiwgUHlPYmplY3QgKiwgUHlPYmplY3QgKik7CiBzdGF0aWMgaW50IGFzc2lnbl9zbGljZShQeU9iamVjdCAqLCBQeU9iamVjdCAqLAotCQkJUHlPYmplY3QgKiwgUHlPYmplY3QgKik7CisgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKIHN0YXRpYyBQeU9iamVjdCAqIGNtcF9vdXRjb21lKGludCwgUHlPYmplY3QgKiwgUHlPYmplY3QgKik7CiBzdGF0aWMgUHlPYmplY3QgKiBpbXBvcnRfZnJvbShQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKIHN0YXRpYyBpbnQgaW1wb3J0X2FsbF9mcm9tKFB5T2JqZWN0ICosIFB5T2JqZWN0ICopOwogc3RhdGljIFB5T2JqZWN0ICogYnVpbGRfY2xhc3MoUHlPYmplY3QgKiwgUHlPYmplY3QgKiwgUHlPYmplY3QgKik7CiBzdGF0aWMgaW50IGV4ZWNfc3RhdGVtZW50KFB5RnJhbWVPYmplY3QgKiwKLQkJCSAgUHlPYmplY3QgKiwgUHlPYmplY3QgKiwgUHlPYmplY3QgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICosIFB5T2JqZWN0ICosIFB5T2JqZWN0ICopOwogc3RhdGljIHZvaWQgc2V0X2V4Y19pbmZvKFB5VGhyZWFkU3RhdGUgKiwgUHlPYmplY3QgKiwgUHlPYmplY3QgKiwgUHlPYmplY3QgKik7CiBzdGF0aWMgdm9pZCByZXNldF9leGNfaW5mbyhQeVRocmVhZFN0YXRlICopOwogc3RhdGljIHZvaWQgZm9ybWF0X2V4Y19jaGVja19hcmcoUHlPYmplY3QgKiwgY2hhciAqLCBQeU9iamVjdCAqKTsKIHN0YXRpYyBQeU9iamVjdCAqIHN0cmluZ19jb25jYXRlbmF0ZShQeU9iamVjdCAqLCBQeU9iamVjdCAqLAotCQkJCSAgICBQeUZyYW1lT2JqZWN0ICosIHVuc2lnbmVkIGNoYXIgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUZyYW1lT2JqZWN0ICosIHVuc2lnbmVkIGNoYXIgKik7CiBzdGF0aWMgUHlPYmplY3QgKiBrd2RfYXNfc3RyaW5nKFB5T2JqZWN0ICopOwogCiAjZGVmaW5lIE5BTUVfRVJST1JfTVNHIFwKLQkibmFtZSAnJS4yMDBzJyBpcyBub3QgZGVmaW5lZCIKKyAgICAibmFtZSAnJS4yMDBzJyBpcyBub3QgZGVmaW5lZCIKICNkZWZpbmUgR0xPQkFMX05BTUVfRVJST1JfTVNHIFwKLQkiZ2xvYmFsIG5hbWUgJyUuMjAwcycgaXMgbm90IGRlZmluZWQiCisgICAgImdsb2JhbCBuYW1lICclLjIwMHMnIGlzIG5vdCBkZWZpbmVkIgogI2RlZmluZSBVTkJPVU5ETE9DQUxfRVJST1JfTVNHIFwKLQkibG9jYWwgdmFyaWFibGUgJyUuMjAwcycgcmVmZXJlbmNlZCBiZWZvcmUgYXNzaWdubWVudCIKKyAgICAibG9jYWwgdmFyaWFibGUgJyUuMjAwcycgcmVmZXJlbmNlZCBiZWZvcmUgYXNzaWdubWVudCIKICNkZWZpbmUgVU5CT1VOREZSRUVfRVJST1JfTVNHIFwKLQkiZnJlZSB2YXJpYWJsZSAnJS4yMDBzJyByZWZlcmVuY2VkIGJlZm9yZSBhc3NpZ25tZW50IiBcCi0gICAgICAgICIgaW4gZW5jbG9zaW5nIHNjb3BlIgorICAgICJmcmVlIHZhcmlhYmxlICclLjIwMHMnIHJlZmVyZW5jZWQgYmVmb3JlIGFzc2lnbm1lbnQiIFwKKyAgICAiIGluIGVuY2xvc2luZyBzY29wZSIKIAogLyogRHluYW1pYyBleGVjdXRpb24gcHJvZmlsZSAqLwogI2lmZGVmIERZTkFNSUNfRVhFQ1VUSU9OX1BST0ZJTEUKQEAgLTIwNywxMCArMjA3LDEwIEBACiBQeU9iamVjdCAqCiBQeUV2YWxfR2V0Q2FsbFN0YXRzKFB5T2JqZWN0ICpzZWxmKQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJpaWlpaWlpaWlpaSIsCi0JCQkgICAgIHBjYWxsWzBdLCBwY2FsbFsxXSwgcGNhbGxbMl0sIHBjYWxsWzNdLAotCQkJICAgICBwY2FsbFs0XSwgcGNhbGxbNV0sIHBjYWxsWzZdLCBwY2FsbFs3XSwKLQkJCSAgICAgcGNhbGxbOF0sIHBjYWxsWzldLCBwY2FsbFsxMF0pOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJpaWlpaWlpaWlpaSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgcGNhbGxbMF0sIHBjYWxsWzFdLCBwY2FsbFsyXSwgcGNhbGxbM10sCisgICAgICAgICAgICAgICAgICAgICAgICAgcGNhbGxbNF0sIHBjYWxsWzVdLCBwY2FsbFs2XSwgcGNhbGxbN10sCisgICAgICAgICAgICAgICAgICAgICAgICAgcGNhbGxbOF0sIHBjYWxsWzldLCBwY2FsbFsxMF0pOwogfQogI2Vsc2UKICNkZWZpbmUgUENBTEwoTykKQEAgLTIxOCw4ICsyMTgsOCBAQAogUHlPYmplY3QgKgogUHlFdmFsX0dldENhbGxTdGF0cyhQeU9iamVjdCAqc2VsZikKIHsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogI2VuZGlmCiAKQEAgLTIzNyw1MiArMjM3LDUyIEBACiBpbnQKIFB5RXZhbF9UaHJlYWRzSW5pdGlhbGl6ZWQodm9pZCkKIHsKLQlyZXR1cm4gaW50ZXJwcmV0ZXJfbG9jayAhPSAwOworICAgIHJldHVybiBpbnRlcnByZXRlcl9sb2NrICE9IDA7CiB9CiAKIHZvaWQKIFB5RXZhbF9Jbml0VGhyZWFkcyh2b2lkKQogewotCWlmIChpbnRlcnByZXRlcl9sb2NrKQotCQlyZXR1cm47Ci0JaW50ZXJwcmV0ZXJfbG9jayA9IFB5VGhyZWFkX2FsbG9jYXRlX2xvY2soKTsKLQlQeVRocmVhZF9hY3F1aXJlX2xvY2soaW50ZXJwcmV0ZXJfbG9jaywgMSk7Ci0JbWFpbl90aHJlYWQgPSBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCk7CisgICAgaWYgKGludGVycHJldGVyX2xvY2spCisgICAgICAgIHJldHVybjsKKyAgICBpbnRlcnByZXRlcl9sb2NrID0gUHlUaHJlYWRfYWxsb2NhdGVfbG9jaygpOworICAgIFB5VGhyZWFkX2FjcXVpcmVfbG9jayhpbnRlcnByZXRlcl9sb2NrLCAxKTsKKyAgICBtYWluX3RocmVhZCA9IFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKTsKIH0KIAogdm9pZAogUHlFdmFsX0FjcXVpcmVMb2NrKHZvaWQpCiB7Ci0JUHlUaHJlYWRfYWNxdWlyZV9sb2NrKGludGVycHJldGVyX2xvY2ssIDEpOworICAgIFB5VGhyZWFkX2FjcXVpcmVfbG9jayhpbnRlcnByZXRlcl9sb2NrLCAxKTsKIH0KIAogdm9pZAogUHlFdmFsX1JlbGVhc2VMb2NrKHZvaWQpCiB7Ci0JUHlUaHJlYWRfcmVsZWFzZV9sb2NrKGludGVycHJldGVyX2xvY2spOworICAgIFB5VGhyZWFkX3JlbGVhc2VfbG9jayhpbnRlcnByZXRlcl9sb2NrKTsKIH0KIAogdm9pZAogUHlFdmFsX0FjcXVpcmVUaHJlYWQoUHlUaHJlYWRTdGF0ZSAqdHN0YXRlKQogewotCWlmICh0c3RhdGUgPT0gTlVMTCkKLQkJUHlfRmF0YWxFcnJvcigiUHlFdmFsX0FjcXVpcmVUaHJlYWQ6IE5VTEwgbmV3IHRocmVhZCBzdGF0ZSIpOwotCS8qIENoZWNrIHNvbWVvbmUgaGFzIGNhbGxlZCBQeUV2YWxfSW5pdFRocmVhZHMoKSB0byBjcmVhdGUgdGhlIGxvY2sgKi8KLQlhc3NlcnQoaW50ZXJwcmV0ZXJfbG9jayk7Ci0JUHlUaHJlYWRfYWNxdWlyZV9sb2NrKGludGVycHJldGVyX2xvY2ssIDEpOwotCWlmIChQeVRocmVhZFN0YXRlX1N3YXAodHN0YXRlKSAhPSBOVUxMKQotCQlQeV9GYXRhbEVycm9yKAotCQkJIlB5RXZhbF9BY3F1aXJlVGhyZWFkOiBub24tTlVMTCBvbGQgdGhyZWFkIHN0YXRlIik7CisgICAgaWYgKHRzdGF0ZSA9PSBOVUxMKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJQeUV2YWxfQWNxdWlyZVRocmVhZDogTlVMTCBuZXcgdGhyZWFkIHN0YXRlIik7CisgICAgLyogQ2hlY2sgc29tZW9uZSBoYXMgY2FsbGVkIFB5RXZhbF9Jbml0VGhyZWFkcygpIHRvIGNyZWF0ZSB0aGUgbG9jayAqLworICAgIGFzc2VydChpbnRlcnByZXRlcl9sb2NrKTsKKyAgICBQeVRocmVhZF9hY3F1aXJlX2xvY2soaW50ZXJwcmV0ZXJfbG9jaywgMSk7CisgICAgaWYgKFB5VGhyZWFkU3RhdGVfU3dhcCh0c3RhdGUpICE9IE5VTEwpCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoCisgICAgICAgICAgICAiUHlFdmFsX0FjcXVpcmVUaHJlYWQ6IG5vbi1OVUxMIG9sZCB0aHJlYWQgc3RhdGUiKTsKIH0KIAogdm9pZAogUHlFdmFsX1JlbGVhc2VUaHJlYWQoUHlUaHJlYWRTdGF0ZSAqdHN0YXRlKQogewotCWlmICh0c3RhdGUgPT0gTlVMTCkKLQkJUHlfRmF0YWxFcnJvcigiUHlFdmFsX1JlbGVhc2VUaHJlYWQ6IE5VTEwgdGhyZWFkIHN0YXRlIik7Ci0JaWYgKFB5VGhyZWFkU3RhdGVfU3dhcChOVUxMKSAhPSB0c3RhdGUpCi0JCVB5X0ZhdGFsRXJyb3IoIlB5RXZhbF9SZWxlYXNlVGhyZWFkOiB3cm9uZyB0aHJlYWQgc3RhdGUiKTsKLQlQeVRocmVhZF9yZWxlYXNlX2xvY2soaW50ZXJwcmV0ZXJfbG9jayk7CisgICAgaWYgKHRzdGF0ZSA9PSBOVUxMKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJQeUV2YWxfUmVsZWFzZVRocmVhZDogTlVMTCB0aHJlYWQgc3RhdGUiKTsKKyAgICBpZiAoUHlUaHJlYWRTdGF0ZV9Td2FwKE5VTEwpICE9IHRzdGF0ZSkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiUHlFdmFsX1JlbGVhc2VUaHJlYWQ6IHdyb25nIHRocmVhZCBzdGF0ZSIpOworICAgIFB5VGhyZWFkX3JlbGVhc2VfbG9jayhpbnRlcnByZXRlcl9sb2NrKTsKIH0KIAogLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSBQeU9TX0FmdGVyRm9yayB0byBlbnN1cmUgdGhhdCBuZXdseQpAQCAtMjkzLDM1ICsyOTMsMzUgQEAKIHZvaWQKIFB5RXZhbF9SZUluaXRUaHJlYWRzKHZvaWQpCiB7Ci0JUHlPYmplY3QgKnRocmVhZGluZywgKnJlc3VsdDsKLQlQeVRocmVhZFN0YXRlICp0c3RhdGU7CisgICAgUHlPYmplY3QgKnRocmVhZGluZywgKnJlc3VsdDsKKyAgICBQeVRocmVhZFN0YXRlICp0c3RhdGU7CiAKLQlpZiAoIWludGVycHJldGVyX2xvY2spCi0JCXJldHVybjsKLQkvKlhYWCBDYW4ndCB1c2UgUHlUaHJlYWRfZnJlZV9sb2NrIGhlcmUgYmVjYXVzZSBpdCBkb2VzIHRvbwotCSAgbXVjaCBlcnJvci1jaGVja2luZy4gIERvaW5nIHRoaXMgY2xlYW5seSB3b3VsZCByZXF1aXJlCi0JICBhZGRpbmcgYSBuZXcgZnVuY3Rpb24gdG8gZWFjaCB0aHJlYWRfKi5oLiAgSW5zdGVhZCwganVzdAotCSAgY3JlYXRlIGEgbmV3IGxvY2sgYW5kIHdhc3RlIGEgbGl0dGxlIGJpdCBvZiBtZW1vcnkgKi8KLQlpbnRlcnByZXRlcl9sb2NrID0gUHlUaHJlYWRfYWxsb2NhdGVfbG9jaygpOwotCVB5VGhyZWFkX2FjcXVpcmVfbG9jayhpbnRlcnByZXRlcl9sb2NrLCAxKTsKLQltYWluX3RocmVhZCA9IFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKTsKKyAgICBpZiAoIWludGVycHJldGVyX2xvY2spCisgICAgICAgIHJldHVybjsKKyAgICAvKlhYWCBDYW4ndCB1c2UgUHlUaHJlYWRfZnJlZV9sb2NrIGhlcmUgYmVjYXVzZSBpdCBkb2VzIHRvbworICAgICAgbXVjaCBlcnJvci1jaGVja2luZy4gIERvaW5nIHRoaXMgY2xlYW5seSB3b3VsZCByZXF1aXJlCisgICAgICBhZGRpbmcgYSBuZXcgZnVuY3Rpb24gdG8gZWFjaCB0aHJlYWRfKi5oLiAgSW5zdGVhZCwganVzdAorICAgICAgY3JlYXRlIGEgbmV3IGxvY2sgYW5kIHdhc3RlIGEgbGl0dGxlIGJpdCBvZiBtZW1vcnkgKi8KKyAgICBpbnRlcnByZXRlcl9sb2NrID0gUHlUaHJlYWRfYWxsb2NhdGVfbG9jaygpOworICAgIFB5VGhyZWFkX2FjcXVpcmVfbG9jayhpbnRlcnByZXRlcl9sb2NrLCAxKTsKKyAgICBtYWluX3RocmVhZCA9IFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKTsKIAotCS8qIFVwZGF0ZSB0aGUgdGhyZWFkaW5nIG1vZHVsZSB3aXRoIHRoZSBuZXcgc3RhdGUuCi0JICovCi0JdHN0YXRlID0gUHlUaHJlYWRTdGF0ZV9HRVQoKTsKLQl0aHJlYWRpbmcgPSBQeU1hcHBpbmdfR2V0SXRlbVN0cmluZyh0c3RhdGUtPmludGVycC0+bW9kdWxlcywKLQkJCQkJICAgICJ0aHJlYWRpbmciKTsKLQlpZiAodGhyZWFkaW5nID09IE5VTEwpIHsKLQkJLyogdGhyZWFkaW5nIG5vdCBpbXBvcnRlZCAqLwotCQlQeUVycl9DbGVhcigpOwotCQlyZXR1cm47Ci0JfQotCXJlc3VsdCA9IFB5T2JqZWN0X0NhbGxNZXRob2QodGhyZWFkaW5nLCAiX2FmdGVyX2ZvcmsiLCBOVUxMKTsKLQlpZiAocmVzdWx0ID09IE5VTEwpCi0JCVB5RXJyX1dyaXRlVW5yYWlzYWJsZSh0aHJlYWRpbmcpOwotCWVsc2UKLQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JUHlfREVDUkVGKHRocmVhZGluZyk7CisgICAgLyogVXBkYXRlIHRoZSB0aHJlYWRpbmcgbW9kdWxlIHdpdGggdGhlIG5ldyBzdGF0ZS4KKyAgICAgKi8KKyAgICB0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dFVCgpOworICAgIHRocmVhZGluZyA9IFB5TWFwcGluZ19HZXRJdGVtU3RyaW5nKHRzdGF0ZS0+aW50ZXJwLT5tb2R1bGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aHJlYWRpbmciKTsKKyAgICBpZiAodGhyZWFkaW5nID09IE5VTEwpIHsKKyAgICAgICAgLyogdGhyZWFkaW5nIG5vdCBpbXBvcnRlZCAqLworICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHJlc3VsdCA9IFB5T2JqZWN0X0NhbGxNZXRob2QodGhyZWFkaW5nLCAiX2FmdGVyX2ZvcmsiLCBOVUxMKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgIFB5RXJyX1dyaXRlVW5yYWlzYWJsZSh0aHJlYWRpbmcpOworICAgIGVsc2UKKyAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgUHlfREVDUkVGKHRocmVhZGluZyk7CiB9CiAjZW5kaWYKIApAQCAtMzMyLDI5ICszMzIsMjkgQEAKIFB5VGhyZWFkU3RhdGUgKgogUHlFdmFsX1NhdmVUaHJlYWQodm9pZCkKIHsKLQlQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVhZFN0YXRlX1N3YXAoTlVMTCk7Ci0JaWYgKHRzdGF0ZSA9PSBOVUxMKQotCQlQeV9GYXRhbEVycm9yKCJQeUV2YWxfU2F2ZVRocmVhZDogTlVMTCB0c3RhdGUiKTsKKyAgICBQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVhZFN0YXRlX1N3YXAoTlVMTCk7CisgICAgaWYgKHRzdGF0ZSA9PSBOVUxMKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJQeUV2YWxfU2F2ZVRocmVhZDogTlVMTCB0c3RhdGUiKTsKICNpZmRlZiBXSVRIX1RIUkVBRAotCWlmIChpbnRlcnByZXRlcl9sb2NrKQotCQlQeVRocmVhZF9yZWxlYXNlX2xvY2soaW50ZXJwcmV0ZXJfbG9jayk7CisgICAgaWYgKGludGVycHJldGVyX2xvY2spCisgICAgICAgIFB5VGhyZWFkX3JlbGVhc2VfbG9jayhpbnRlcnByZXRlcl9sb2NrKTsKICNlbmRpZgotCXJldHVybiB0c3RhdGU7CisgICAgcmV0dXJuIHRzdGF0ZTsKIH0KIAogdm9pZAogUHlFdmFsX1Jlc3RvcmVUaHJlYWQoUHlUaHJlYWRTdGF0ZSAqdHN0YXRlKQogewotCWlmICh0c3RhdGUgPT0gTlVMTCkKLQkJUHlfRmF0YWxFcnJvcigiUHlFdmFsX1Jlc3RvcmVUaHJlYWQ6IE5VTEwgdHN0YXRlIik7CisgICAgaWYgKHRzdGF0ZSA9PSBOVUxMKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJQeUV2YWxfUmVzdG9yZVRocmVhZDogTlVMTCB0c3RhdGUiKTsKICNpZmRlZiBXSVRIX1RIUkVBRAotCWlmIChpbnRlcnByZXRlcl9sb2NrKSB7Ci0JCWludCBlcnIgPSBlcnJubzsKLQkJUHlUaHJlYWRfYWNxdWlyZV9sb2NrKGludGVycHJldGVyX2xvY2ssIDEpOwotCQllcnJubyA9IGVycjsKLQl9CisgICAgaWYgKGludGVycHJldGVyX2xvY2spIHsKKyAgICAgICAgaW50IGVyciA9IGVycm5vOworICAgICAgICBQeVRocmVhZF9hY3F1aXJlX2xvY2soaW50ZXJwcmV0ZXJfbG9jaywgMSk7CisgICAgICAgIGVycm5vID0gZXJyOworICAgIH0KICNlbmRpZgotCVB5VGhyZWFkU3RhdGVfU3dhcCh0c3RhdGUpOworICAgIFB5VGhyZWFkU3RhdGVfU3dhcCh0c3RhdGUpOwogfQogCiAKQEAgLTM5Miw4ICszOTIsOCBAQAogCiAjZGVmaW5lIE5QRU5ESU5HQ0FMTFMgMzIKIHN0YXRpYyBzdHJ1Y3QgewotCWludCAoKmZ1bmMpKHZvaWQgKik7Ci0Jdm9pZCAqYXJnOworICAgIGludCAoKmZ1bmMpKHZvaWQgKik7CisgICAgdm9pZCAqYXJnOwogfSBwZW5kaW5nY2FsbHNbTlBFTkRJTkdDQUxMU107CiBzdGF0aWMgdm9sYXRpbGUgaW50IHBlbmRpbmdmaXJzdCA9IDA7CiBzdGF0aWMgdm9sYXRpbGUgaW50IHBlbmRpbmdsYXN0ID0gMDsKQEAgLTQwMiw2MSArNDAyLDYxIEBACiBpbnQKIFB5X0FkZFBlbmRpbmdDYWxsKGludCAoKmZ1bmMpKHZvaWQgKiksIHZvaWQgKmFyZykKIHsKLQlzdGF0aWMgdm9sYXRpbGUgaW50IGJ1c3kgPSAwOwotCWludCBpLCBqOwotCS8qIFhYWCBCZWdpbiBjcml0aWNhbCBzZWN0aW9uICovCi0JLyogWFhYIElmIHlvdSB3YW50IHRoaXMgdG8gYmUgc2FmZSBhZ2FpbnN0IG5lc3RlZAotCSAgIFhYWCBhc3luY2hyb25vdXMgY2FsbHMsIHlvdSdsbCBoYXZlIHRvIHdvcmsgaGFyZGVyISAqLwotCWlmIChidXN5KQotCQlyZXR1cm4gLTE7Ci0JYnVzeSA9IDE7Ci0JaSA9IHBlbmRpbmdsYXN0OwotCWogPSAoaSArIDEpICUgTlBFTkRJTkdDQUxMUzsKLQlpZiAoaiA9PSBwZW5kaW5nZmlyc3QpIHsKLQkJYnVzeSA9IDA7Ci0JCXJldHVybiAtMTsgLyogUXVldWUgZnVsbCAqLwotCX0KLQlwZW5kaW5nY2FsbHNbaV0uZnVuYyA9IGZ1bmM7Ci0JcGVuZGluZ2NhbGxzW2ldLmFyZyA9IGFyZzsKLQlwZW5kaW5nbGFzdCA9IGo7CisgICAgc3RhdGljIHZvbGF0aWxlIGludCBidXN5ID0gMDsKKyAgICBpbnQgaSwgajsKKyAgICAvKiBYWFggQmVnaW4gY3JpdGljYWwgc2VjdGlvbiAqLworICAgIC8qIFhYWCBJZiB5b3Ugd2FudCB0aGlzIHRvIGJlIHNhZmUgYWdhaW5zdCBuZXN0ZWQKKyAgICAgICBYWFggYXN5bmNocm9ub3VzIGNhbGxzLCB5b3UnbGwgaGF2ZSB0byB3b3JrIGhhcmRlciEgKi8KKyAgICBpZiAoYnVzeSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGJ1c3kgPSAxOworICAgIGkgPSBwZW5kaW5nbGFzdDsKKyAgICBqID0gKGkgKyAxKSAlIE5QRU5ESU5HQ0FMTFM7CisgICAgaWYgKGogPT0gcGVuZGluZ2ZpcnN0KSB7CisgICAgICAgIGJ1c3kgPSAwOworICAgICAgICByZXR1cm4gLTE7IC8qIFF1ZXVlIGZ1bGwgKi8KKyAgICB9CisgICAgcGVuZGluZ2NhbGxzW2ldLmZ1bmMgPSBmdW5jOworICAgIHBlbmRpbmdjYWxsc1tpXS5hcmcgPSBhcmc7CisgICAgcGVuZGluZ2xhc3QgPSBqOwogCi0JX1B5X1RpY2tlciA9IDA7Ci0JdGhpbmdzX3RvX2RvID0gMTsgLyogU2lnbmFsIG1haW4gbG9vcCAqLwotCWJ1c3kgPSAwOwotCS8qIFhYWCBFbmQgY3JpdGljYWwgc2VjdGlvbiAqLwotCXJldHVybiAwOworICAgIF9QeV9UaWNrZXIgPSAwOworICAgIHRoaW5nc190b19kbyA9IDE7IC8qIFNpZ25hbCBtYWluIGxvb3AgKi8KKyAgICBidXN5ID0gMDsKKyAgICAvKiBYWFggRW5kIGNyaXRpY2FsIHNlY3Rpb24gKi8KKyAgICByZXR1cm4gMDsKIH0KIAogaW50CiBQeV9NYWtlUGVuZGluZ0NhbGxzKHZvaWQpCiB7Ci0Jc3RhdGljIGludCBidXN5ID0gMDsKKyAgICBzdGF0aWMgaW50IGJ1c3kgPSAwOwogI2lmZGVmIFdJVEhfVEhSRUFECi0JaWYgKG1haW5fdGhyZWFkICYmIFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSAhPSBtYWluX3RocmVhZCkKLQkJcmV0dXJuIDA7CisgICAgaWYgKG1haW5fdGhyZWFkICYmIFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSAhPSBtYWluX3RocmVhZCkKKyAgICAgICAgcmV0dXJuIDA7CiAjZW5kaWYKLQlpZiAoYnVzeSkKLQkJcmV0dXJuIDA7Ci0JYnVzeSA9IDE7Ci0JdGhpbmdzX3RvX2RvID0gMDsKLQlmb3IgKDs7KSB7Ci0JCWludCBpOwotCQlpbnQgKCpmdW5jKSh2b2lkICopOwotCQl2b2lkICphcmc7Ci0JCWkgPSBwZW5kaW5nZmlyc3Q7Ci0JCWlmIChpID09IHBlbmRpbmdsYXN0KQotCQkJYnJlYWs7IC8qIFF1ZXVlIGVtcHR5ICovCi0JCWZ1bmMgPSBwZW5kaW5nY2FsbHNbaV0uZnVuYzsKLQkJYXJnID0gcGVuZGluZ2NhbGxzW2ldLmFyZzsKLQkJcGVuZGluZ2ZpcnN0ID0gKGkgKyAxKSAlIE5QRU5ESU5HQ0FMTFM7Ci0JCWlmIChmdW5jKGFyZykgPCAwKSB7Ci0JCQlidXN5ID0gMDsKLQkJCXRoaW5nc190b19kbyA9IDE7IC8qIFdlJ3JlIG5vdCBkb25lIHlldCAqLwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQotCWJ1c3kgPSAwOwotCXJldHVybiAwOworICAgIGlmIChidXN5KQorICAgICAgICByZXR1cm4gMDsKKyAgICBidXN5ID0gMTsKKyAgICB0aGluZ3NfdG9fZG8gPSAwOworICAgIGZvciAoOzspIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGludCAoKmZ1bmMpKHZvaWQgKik7CisgICAgICAgIHZvaWQgKmFyZzsKKyAgICAgICAgaSA9IHBlbmRpbmdmaXJzdDsKKyAgICAgICAgaWYgKGkgPT0gcGVuZGluZ2xhc3QpCisgICAgICAgICAgICBicmVhazsgLyogUXVldWUgZW1wdHkgKi8KKyAgICAgICAgZnVuYyA9IHBlbmRpbmdjYWxsc1tpXS5mdW5jOworICAgICAgICBhcmcgPSBwZW5kaW5nY2FsbHNbaV0uYXJnOworICAgICAgICBwZW5kaW5nZmlyc3QgPSAoaSArIDEpICUgTlBFTkRJTkdDQUxMUzsKKyAgICAgICAgaWYgKGZ1bmMoYXJnKSA8IDApIHsKKyAgICAgICAgICAgIGJ1c3kgPSAwOworICAgICAgICAgICAgdGhpbmdzX3RvX2RvID0gMTsgLyogV2UncmUgbm90IGRvbmUgeWV0ICovCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisgICAgYnVzeSA9IDA7CisgICAgcmV0dXJuIDA7CiB9CiAKIApAQCAtNDcxLDE0ICs0NzEsMTQgQEAKIGludAogUHlfR2V0UmVjdXJzaW9uTGltaXQodm9pZCkKIHsKLQlyZXR1cm4gcmVjdXJzaW9uX2xpbWl0OworICAgIHJldHVybiByZWN1cnNpb25fbGltaXQ7CiB9CiAKIHZvaWQKIFB5X1NldFJlY3Vyc2lvbkxpbWl0KGludCBuZXdfbGltaXQpCiB7Ci0JcmVjdXJzaW9uX2xpbWl0ID0gbmV3X2xpbWl0OwotCV9QeV9DaGVja1JlY3Vyc2lvbkxpbWl0ID0gcmVjdXJzaW9uX2xpbWl0OworICAgIHJlY3Vyc2lvbl9saW1pdCA9IG5ld19saW1pdDsKKyAgICBfUHlfQ2hlY2tSZWN1cnNpb25MaW1pdCA9IHJlY3Vyc2lvbl9saW1pdDsKIH0KIAogLyogdGhlIG1hY3JvIFB5X0VudGVyUmVjdXJzaXZlQ2FsbCgpIG9ubHkgY2FsbHMgX1B5X0NoZWNrUmVjdXJzaXZlQ2FsbCgpCkBAIC00ODksMzUgKzQ4OSwzNSBAQAogaW50CiBfUHlfQ2hlY2tSZWN1cnNpdmVDYWxsKGNoYXIgKndoZXJlKQogewotCVB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfR0VUKCk7CisgICAgUHlUaHJlYWRTdGF0ZSAqdHN0YXRlID0gUHlUaHJlYWRTdGF0ZV9HRVQoKTsKIAogI2lmZGVmIFVTRV9TVEFDS0NIRUNLCi0JaWYgKFB5T1NfQ2hlY2tTdGFjaygpKSB7Ci0JCS0tdHN0YXRlLT5yZWN1cnNpb25fZGVwdGg7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19NZW1vcnlFcnJvciwgIlN0YWNrIG92ZXJmbG93Iik7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgaWYgKFB5T1NfQ2hlY2tTdGFjaygpKSB7CisgICAgICAgIC0tdHN0YXRlLT5yZWN1cnNpb25fZGVwdGg7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19NZW1vcnlFcnJvciwgIlN0YWNrIG92ZXJmbG93Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAjZW5kaWYKLQlpZiAodHN0YXRlLT5yZWN1cnNpb25fZGVwdGggPiByZWN1cnNpb25fbGltaXQpIHsKLQkJLS10c3RhdGUtPnJlY3Vyc2lvbl9kZXB0aDsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1J1bnRpbWVFcnJvciwKLQkJCSAgICAgIm1heGltdW0gcmVjdXJzaW9uIGRlcHRoIGV4Y2VlZGVkJXMiLAotCQkJICAgICB3aGVyZSk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JX1B5X0NoZWNrUmVjdXJzaW9uTGltaXQgPSByZWN1cnNpb25fbGltaXQ7Ci0JcmV0dXJuIDA7CisgICAgaWYgKHRzdGF0ZS0+cmVjdXJzaW9uX2RlcHRoID4gcmVjdXJzaW9uX2xpbWl0KSB7CisgICAgICAgIC0tdHN0YXRlLT5yZWN1cnNpb25fZGVwdGg7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAibWF4aW11bSByZWN1cnNpb24gZGVwdGggZXhjZWVkZWQlcyIsCisgICAgICAgICAgICAgICAgICAgICB3aGVyZSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgX1B5X0NoZWNrUmVjdXJzaW9uTGltaXQgPSByZWN1cnNpb25fbGltaXQ7CisgICAgcmV0dXJuIDA7CiB9CiAKIC8qIFN0YXR1cyBjb2RlIGZvciBtYWluIGxvb3AgKHJlYXNvbiBmb3Igc3RhY2sgdW53aW5kKSAqLwogZW51bSB3aHlfY29kZSB7Ci0JCVdIWV9OT1QgPQkweDAwMDEsCS8qIE5vIGVycm9yICovCi0JCVdIWV9FWENFUFRJT04gPSAweDAwMDIsCS8qIEV4Y2VwdGlvbiBvY2N1cnJlZCAqLwotCQlXSFlfUkVSQUlTRSA9CTB4MDAwNCwJLyogRXhjZXB0aW9uIHJlLXJhaXNlZCBieSAnZmluYWxseScgKi8KLQkJV0hZX1JFVFVSTiA9CTB4MDAwOCwJLyogJ3JldHVybicgc3RhdGVtZW50ICovCi0JCVdIWV9CUkVBSyA9CTB4MDAxMCwJLyogJ2JyZWFrJyBzdGF0ZW1lbnQgKi8KLQkJV0hZX0NPTlRJTlVFID0JMHgwMDIwLAkvKiAnY29udGludWUnIHN0YXRlbWVudCAqLwotCQlXSFlfWUlFTEQgPQkweDAwNDAJLyogJ3lpZWxkJyBvcGVyYXRvciAqLworICAgICAgICAgICAgICAgIFdIWV9OT1QgPSAgICAgICAweDAwMDEsIC8qIE5vIGVycm9yICovCisgICAgICAgIFdIWV9FWENFUFRJT04gPSAweDAwMDIsICAgICAgICAgLyogRXhjZXB0aW9uIG9jY3VycmVkICovCisgICAgICAgIFdIWV9SRVJBSVNFID0gICAgICAgICAgIDB4MDAwNCwgLyogRXhjZXB0aW9uIHJlLXJhaXNlZCBieSAnZmluYWxseScgKi8KKyAgICAgICAgV0hZX1JFVFVSTiA9ICAgICAgICAgICAgMHgwMDA4LCAvKiAncmV0dXJuJyBzdGF0ZW1lbnQgKi8KKyAgICAgICAgV0hZX0JSRUFLID0gICAgICAgICAgICAgMHgwMDEwLCAvKiAnYnJlYWsnIHN0YXRlbWVudCAqLworICAgICAgICBXSFlfQ09OVElOVUUgPSAgICAgICAgICAweDAwMjAsIC8qICdjb250aW51ZScgc3RhdGVtZW50ICovCisgICAgICAgIFdIWV9ZSUVMRCA9ICAgICAgICAgICAgIDB4MDA0MCAgLyogJ3lpZWxkJyBvcGVyYXRvciAqLwogfTsKIAogc3RhdGljIGVudW0gd2h5X2NvZGUgZG9fcmFpc2UoUHlPYmplY3QgKiwgUHlPYmplY3QgKiwgUHlPYmplY3QgKik7CkBAIC01MzgsMTIgKzUzOCwxMiBAQAogUHlPYmplY3QgKgogUHlFdmFsX0V2YWxDb2RlKFB5Q29kZU9iamVjdCAqY28sIFB5T2JqZWN0ICpnbG9iYWxzLCBQeU9iamVjdCAqbG9jYWxzKQogewotCXJldHVybiBQeUV2YWxfRXZhbENvZGVFeChjbywKLQkJCSAgZ2xvYmFscywgbG9jYWxzLAotCQkJICAoUHlPYmplY3QgKiopTlVMTCwgMCwKLQkJCSAgKFB5T2JqZWN0ICoqKU5VTEwsIDAsCi0JCQkgIChQeU9iamVjdCAqKilOVUxMLCAwLAotCQkJICBOVUxMKTsKKyAgICByZXR1cm4gUHlFdmFsX0V2YWxDb2RlRXgoY28sCisgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFscywgbG9jYWxzLAorICAgICAgICAgICAgICAgICAgICAgIChQeU9iamVjdCAqKilOVUxMLCAwLAorICAgICAgICAgICAgICAgICAgICAgIChQeU9iamVjdCAqKilOVUxMLCAwLAorICAgICAgICAgICAgICAgICAgICAgIChQeU9iamVjdCAqKilOVUxMLCAwLAorICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwogfQogCiAKQEAgLTU1MSw1MCArNTUxLDUwIEBACiAKIFB5T2JqZWN0ICoKIFB5RXZhbF9FdmFsRnJhbWUoUHlGcmFtZU9iamVjdCAqZikgewotCS8qIFRoaXMgaXMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCBleHRlbnNpb24gbW9kdWxlcyB0aGF0Ci0gICAgICAgICAgIHVzZWQgdGhpcyBBUEk7IGNvcmUgaW50ZXJwcmV0ZXIgY29kZSBzaG91bGQgY2FsbAotICAgICAgICAgICBQeUV2YWxfRXZhbEZyYW1lRXgoKSAqLwotCXJldHVybiBQeUV2YWxfRXZhbEZyYW1lRXgoZiwgMCk7CisgICAgLyogVGhpcyBpcyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIGV4dGVuc2lvbiBtb2R1bGVzIHRoYXQKKyAgICAgICB1c2VkIHRoaXMgQVBJOyBjb3JlIGludGVycHJldGVyIGNvZGUgc2hvdWxkIGNhbGwKKyAgICAgICBQeUV2YWxfRXZhbEZyYW1lRXgoKSAqLworICAgIHJldHVybiBQeUV2YWxfRXZhbEZyYW1lRXgoZiwgMCk7CiB9CiAKIFB5T2JqZWN0ICoKIFB5RXZhbF9FdmFsRnJhbWVFeChQeUZyYW1lT2JqZWN0ICpmLCBpbnQgdGhyb3dmbGFnKQogewogI2lmZGVmIERYUEFJUlMKLQlpbnQgbGFzdG9wY29kZSA9IDA7CisgICAgaW50IGxhc3RvcGNvZGUgPSAwOwogI2VuZGlmCi0JcmVnaXN0ZXIgUHlPYmplY3QgKipzdGFja19wb2ludGVyOyAgLyogTmV4dCBmcmVlIHNsb3QgaW4gdmFsdWUgc3RhY2sgKi8KLQlyZWdpc3RlciB1bnNpZ25lZCBjaGFyICpuZXh0X2luc3RyOwotCXJlZ2lzdGVyIGludCBvcGNvZGU7CS8qIEN1cnJlbnQgb3Bjb2RlICovCi0JcmVnaXN0ZXIgaW50IG9wYXJnOwkvKiBDdXJyZW50IG9wY29kZSBhcmd1bWVudCwgaWYgYW55ICovCi0JcmVnaXN0ZXIgZW51bSB3aHlfY29kZSB3aHk7IC8qIFJlYXNvbiBmb3IgYmxvY2sgc3RhY2sgdW53aW5kICovCi0JcmVnaXN0ZXIgaW50IGVycjsJLyogRXJyb3Igc3RhdHVzIC0tIG5vbnplcm8gaWYgZXJyb3IgKi8KLQlyZWdpc3RlciBQeU9iamVjdCAqeDsJLyogUmVzdWx0IG9iamVjdCAtLSBOVUxMIGlmIGVycm9yICovCi0JcmVnaXN0ZXIgUHlPYmplY3QgKnY7CS8qIFRlbXBvcmFyeSBvYmplY3RzIHBvcHBlZCBvZmYgc3RhY2sgKi8KLQlyZWdpc3RlciBQeU9iamVjdCAqdzsKLQlyZWdpc3RlciBQeU9iamVjdCAqdTsKLQlyZWdpc3RlciBQeU9iamVjdCAqdDsKLQlyZWdpc3RlciBQeU9iamVjdCAqc3RyZWFtID0gTlVMTDsgICAgLyogZm9yIFBSSU5UIG9wY29kZXMgKi8KLQlyZWdpc3RlciBQeU9iamVjdCAqKmZhc3Rsb2NhbHMsICoqZnJlZXZhcnM7Ci0JUHlPYmplY3QgKnJldHZhbCA9IE5VTEw7CS8qIFJldHVybiB2YWx1ZSAqLwotCVB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfR0VUKCk7Ci0JUHlDb2RlT2JqZWN0ICpjbzsKKyAgICByZWdpc3RlciBQeU9iamVjdCAqKnN0YWNrX3BvaW50ZXI7ICAvKiBOZXh0IGZyZWUgc2xvdCBpbiB2YWx1ZSBzdGFjayAqLworICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgKm5leHRfaW5zdHI7CisgICAgcmVnaXN0ZXIgaW50IG9wY29kZTsgICAgICAgIC8qIEN1cnJlbnQgb3Bjb2RlICovCisgICAgcmVnaXN0ZXIgaW50IG9wYXJnOyAgICAgICAgIC8qIEN1cnJlbnQgb3Bjb2RlIGFyZ3VtZW50LCBpZiBhbnkgKi8KKyAgICByZWdpc3RlciBlbnVtIHdoeV9jb2RlIHdoeTsgLyogUmVhc29uIGZvciBibG9jayBzdGFjayB1bndpbmQgKi8KKyAgICByZWdpc3RlciBpbnQgZXJyOyAgICAgICAgICAgLyogRXJyb3Igc3RhdHVzIC0tIG5vbnplcm8gaWYgZXJyb3IgKi8KKyAgICByZWdpc3RlciBQeU9iamVjdCAqeDsgICAgICAgLyogUmVzdWx0IG9iamVjdCAtLSBOVUxMIGlmIGVycm9yICovCisgICAgcmVnaXN0ZXIgUHlPYmplY3QgKnY7ICAgICAgIC8qIFRlbXBvcmFyeSBvYmplY3RzIHBvcHBlZCBvZmYgc3RhY2sgKi8KKyAgICByZWdpc3RlciBQeU9iamVjdCAqdzsKKyAgICByZWdpc3RlciBQeU9iamVjdCAqdTsKKyAgICByZWdpc3RlciBQeU9iamVjdCAqdDsKKyAgICByZWdpc3RlciBQeU9iamVjdCAqc3RyZWFtID0gTlVMTDsgICAgLyogZm9yIFBSSU5UIG9wY29kZXMgKi8KKyAgICByZWdpc3RlciBQeU9iamVjdCAqKmZhc3Rsb2NhbHMsICoqZnJlZXZhcnM7CisgICAgUHlPYmplY3QgKnJldHZhbCA9IE5VTEw7ICAgICAgICAgICAgLyogUmV0dXJuIHZhbHVlICovCisgICAgUHlUaHJlYWRTdGF0ZSAqdHN0YXRlID0gUHlUaHJlYWRTdGF0ZV9HRVQoKTsKKyAgICBQeUNvZGVPYmplY3QgKmNvOwogCi0JLyogd2hlbiB0cmFjaW5nIHdlIHNldCB0aGluZ3MgdXAgc28gdGhhdAorICAgIC8qIHdoZW4gdHJhY2luZyB3ZSBzZXQgdGhpbmdzIHVwIHNvIHRoYXQKIAotICAgICAgICAgICAgICAgbm90IChpbnN0cl9sYiA8PSBjdXJyZW50X2J5dGVjb2RlX29mZnNldCA8IGluc3RyX3ViKQorICAgICAgICAgICBub3QgKGluc3RyX2xiIDw9IGN1cnJlbnRfYnl0ZWNvZGVfb2Zmc2V0IDwgaW5zdHJfdWIpCiAKLQkgICBpcyB0cnVlIHdoZW4gdGhlIGxpbmUgYmVpbmcgZXhlY3V0ZWQgaGFzIGNoYW5nZWQuICBUaGUKLSAgICAgICAgICAgaW5pdGlhbCB2YWx1ZXMgYXJlIHN1Y2ggYXMgdG8gbWFrZSB0aGlzIGZhbHNlIHRoZSBmaXJzdAotICAgICAgICAgICB0aW1lIGl0IGlzIHRlc3RlZC4gKi8KLQlpbnQgaW5zdHJfdWIgPSAtMSwgaW5zdHJfbGIgPSAwLCBpbnN0cl9wcmV2ID0gLTE7CisgICAgICAgaXMgdHJ1ZSB3aGVuIHRoZSBsaW5lIGJlaW5nIGV4ZWN1dGVkIGhhcyBjaGFuZ2VkLiAgVGhlCisgICAgICAgaW5pdGlhbCB2YWx1ZXMgYXJlIHN1Y2ggYXMgdG8gbWFrZSB0aGlzIGZhbHNlIHRoZSBmaXJzdAorICAgICAgIHRpbWUgaXQgaXMgdGVzdGVkLiAqLworICAgIGludCBpbnN0cl91YiA9IC0xLCBpbnN0cl9sYiA9IDAsIGluc3RyX3ByZXYgPSAtMTsKIAotCXVuc2lnbmVkIGNoYXIgKmZpcnN0X2luc3RyOwotCVB5T2JqZWN0ICpuYW1lczsKLQlQeU9iamVjdCAqY29uc3RzOworICAgIHVuc2lnbmVkIGNoYXIgKmZpcnN0X2luc3RyOworICAgIFB5T2JqZWN0ICpuYW1lczsKKyAgICBQeU9iamVjdCAqY29uc3RzOwogI2lmIGRlZmluZWQoUHlfREVCVUcpIHx8IGRlZmluZWQoTExUUkFDRSkKLQkvKiBNYWtlIGl0IGVhc2llciB0byBmaW5kIG91dCB3aGVyZSB3ZSBhcmUgd2l0aCBhIGRlYnVnZ2VyICovCi0JY2hhciAqZmlsZW5hbWU7CisgICAgLyogTWFrZSBpdCBlYXNpZXIgdG8gZmluZCBvdXQgd2hlcmUgd2UgYXJlIHdpdGggYSBkZWJ1Z2dlciAqLworICAgIGNoYXIgKmZpbGVuYW1lOwogI2VuZGlmCiAKIC8qIFR1cGxlIGFjY2VzcyBtYWNyb3MgKi8KQEAgLTYzNCw5OCArNjM0LDk4IEBACiAgICBDQUxMX0ZVTkNUSU9OIChhbmQgZnJpZW5kcykKIAogICovCi0JdWludDY0IGluc3QwLCBpbnN0MSwgbG9vcDAsIGxvb3AxLCBpbnRyMCA9IDAsIGludHIxID0gMDsKLQlpbnQgdGlja2VkID0gMDsKKyAgICB1aW50NjQgaW5zdDAsIGluc3QxLCBsb29wMCwgbG9vcDEsIGludHIwID0gMCwgaW50cjEgPSAwOworICAgIGludCB0aWNrZWQgPSAwOwogCi0JUkVBRF9USU1FU1RBTVAoaW5zdDApOwotCVJFQURfVElNRVNUQU1QKGluc3QxKTsKLQlSRUFEX1RJTUVTVEFNUChsb29wMCk7Ci0JUkVBRF9USU1FU1RBTVAobG9vcDEpOworICAgIFJFQURfVElNRVNUQU1QKGluc3QwKTsKKyAgICBSRUFEX1RJTUVTVEFNUChpbnN0MSk7CisgICAgUkVBRF9USU1FU1RBTVAobG9vcDApOworICAgIFJFQURfVElNRVNUQU1QKGxvb3AxKTsKIAotCS8qIHNodXQgdXAgdGhlIGNvbXBpbGVyICovCi0Jb3Bjb2RlID0gMDsKKyAgICAvKiBzaHV0IHVwIHRoZSBjb21waWxlciAqLworICAgIG9wY29kZSA9IDA7CiAjZW5kaWYKIAogLyogQ29kZSBhY2Nlc3MgbWFjcm9zICovCiAKLSNkZWZpbmUgSU5TVFJfT0ZGU0VUKCkJKChpbnQpKG5leHRfaW5zdHIgLSBmaXJzdF9pbnN0cikpCi0jZGVmaW5lIE5FWFRPUCgpCSgqbmV4dF9pbnN0cisrKQotI2RlZmluZSBORVhUQVJHKCkJKG5leHRfaW5zdHIgKz0gMiwgKG5leHRfaW5zdHJbLTFdPDw4KSArIG5leHRfaW5zdHJbLTJdKQotI2RlZmluZSBQRUVLQVJHKCkJKChuZXh0X2luc3RyWzJdPDw4KSArIG5leHRfaW5zdHJbMV0pCi0jZGVmaW5lIEpVTVBUTyh4KQkobmV4dF9pbnN0ciA9IGZpcnN0X2luc3RyICsgKHgpKQotI2RlZmluZSBKVU1QQlkoeCkJKG5leHRfaW5zdHIgKz0gKHgpKQorI2RlZmluZSBJTlNUUl9PRkZTRVQoKSAgKChpbnQpKG5leHRfaW5zdHIgLSBmaXJzdF9pbnN0cikpCisjZGVmaW5lIE5FWFRPUCgpICAgICAgICAoKm5leHRfaW5zdHIrKykKKyNkZWZpbmUgTkVYVEFSRygpICAgICAgIChuZXh0X2luc3RyICs9IDIsIChuZXh0X2luc3RyWy0xXTw8OCkgKyBuZXh0X2luc3RyWy0yXSkKKyNkZWZpbmUgUEVFS0FSRygpICAgICAgICgobmV4dF9pbnN0clsyXTw8OCkgKyBuZXh0X2luc3RyWzFdKQorI2RlZmluZSBKVU1QVE8oeCkgICAgICAgKG5leHRfaW5zdHIgPSBmaXJzdF9pbnN0ciArICh4KSkKKyNkZWZpbmUgSlVNUEJZKHgpICAgICAgIChuZXh0X2luc3RyICs9ICh4KSkKIAogLyogT3BDb2RlIHByZWRpY3Rpb24gbWFjcm9zCi0JU29tZSBvcGNvZGVzIHRlbmQgdG8gY29tZSBpbiBwYWlycyB0aHVzIG1ha2luZyBpdCBwb3NzaWJsZSB0bwotCXByZWRpY3QgdGhlIHNlY29uZCBjb2RlIHdoZW4gdGhlIGZpcnN0IGlzIHJ1bi4gIEZvciBleGFtcGxlLAotCUNPTVBBUkVfT1AgaXMgb2Z0ZW4gZm9sbG93ZWQgYnkgSlVNUF9JRl9GQUxTRSBvciBKVU1QX0lGX1RSVUUuICBBbmQsCi0JdGhvc2Ugb3Bjb2RlcyBhcmUgb2Z0ZW4gZm9sbG93ZWQgYnkgYSBQT1BfVE9QLgorICAgIFNvbWUgb3Bjb2RlcyB0ZW5kIHRvIGNvbWUgaW4gcGFpcnMgdGh1cyBtYWtpbmcgaXQgcG9zc2libGUgdG8KKyAgICBwcmVkaWN0IHRoZSBzZWNvbmQgY29kZSB3aGVuIHRoZSBmaXJzdCBpcyBydW4uICBGb3IgZXhhbXBsZSwKKyAgICBDT01QQVJFX09QIGlzIG9mdGVuIGZvbGxvd2VkIGJ5IEpVTVBfSUZfRkFMU0Ugb3IgSlVNUF9JRl9UUlVFLiAgQW5kLAorICAgIHRob3NlIG9wY29kZXMgYXJlIG9mdGVuIGZvbGxvd2VkIGJ5IGEgUE9QX1RPUC4KIAotCVZlcmlmeWluZyB0aGUgcHJlZGljdGlvbiBjb3N0cyBhIHNpbmdsZSBoaWdoLXNwZWVkIHRlc3Qgb2YgYSByZWdpc3RlcgotCXZhcmlhYmxlIGFnYWluc3QgYSBjb25zdGFudC4gIElmIHRoZSBwYWlyaW5nIHdhcyBnb29kLCB0aGVuIHRoZQotCXByb2Nlc3NvcidzIG93biBpbnRlcm5hbCBicmFuY2ggcHJlZGljYXRpb24gaGFzIGEgaGlnaCBsaWtlbGlob29kIG9mCi0Jc3VjY2VzcywgcmVzdWx0aW5nIGluIGEgbmVhcmx5IHplcm8tb3ZlcmhlYWQgdHJhbnNpdGlvbiB0byB0aGUKLQluZXh0IG9wY29kZS4gIEEgc3VjY2Vzc2Z1bCBwcmVkaWN0aW9uIHNhdmVzIGEgdHJpcCB0aHJvdWdoIHRoZSBldmFsLWxvb3AKLQlpbmNsdWRpbmcgaXRzIHR3byB1bnByZWRpY3RhYmxlIGJyYW5jaGVzLCB0aGUgSEFTX0FSRyB0ZXN0IGFuZCB0aGUKLQlzd2l0Y2gtY2FzZS4gIENvbWJpbmVkIHdpdGggdGhlIHByb2Nlc3NvcidzIGludGVybmFsIGJyYW5jaCBwcmVkaWN0aW9uLAotCWEgc3VjY2Vzc2Z1bCBQUkVESUNUIGhhcyB0aGUgZWZmZWN0IG9mIG1ha2luZyB0aGUgdHdvIG9wY29kZXMgcnVuIGFzIGlmCi0JdGhleSB3ZXJlIGEgc2luZ2xlIG5ldyBvcGNvZGUgd2l0aCB0aGUgYm9kaWVzIGNvbWJpbmVkLgorICAgIFZlcmlmeWluZyB0aGUgcHJlZGljdGlvbiBjb3N0cyBhIHNpbmdsZSBoaWdoLXNwZWVkIHRlc3Qgb2YgYSByZWdpc3RlcgorICAgIHZhcmlhYmxlIGFnYWluc3QgYSBjb25zdGFudC4gIElmIHRoZSBwYWlyaW5nIHdhcyBnb29kLCB0aGVuIHRoZQorICAgIHByb2Nlc3NvcidzIG93biBpbnRlcm5hbCBicmFuY2ggcHJlZGljYXRpb24gaGFzIGEgaGlnaCBsaWtlbGlob29kIG9mCisgICAgc3VjY2VzcywgcmVzdWx0aW5nIGluIGEgbmVhcmx5IHplcm8tb3ZlcmhlYWQgdHJhbnNpdGlvbiB0byB0aGUKKyAgICBuZXh0IG9wY29kZS4gIEEgc3VjY2Vzc2Z1bCBwcmVkaWN0aW9uIHNhdmVzIGEgdHJpcCB0aHJvdWdoIHRoZSBldmFsLWxvb3AKKyAgICBpbmNsdWRpbmcgaXRzIHR3byB1bnByZWRpY3RhYmxlIGJyYW5jaGVzLCB0aGUgSEFTX0FSRyB0ZXN0IGFuZCB0aGUKKyAgICBzd2l0Y2gtY2FzZS4gIENvbWJpbmVkIHdpdGggdGhlIHByb2Nlc3NvcidzIGludGVybmFsIGJyYW5jaCBwcmVkaWN0aW9uLAorICAgIGEgc3VjY2Vzc2Z1bCBQUkVESUNUIGhhcyB0aGUgZWZmZWN0IG9mIG1ha2luZyB0aGUgdHdvIG9wY29kZXMgcnVuIGFzIGlmCisgICAgdGhleSB3ZXJlIGEgc2luZ2xlIG5ldyBvcGNvZGUgd2l0aCB0aGUgYm9kaWVzIGNvbWJpbmVkLgogCiAgICAgSWYgY29sbGVjdGluZyBvcGNvZGUgc3RhdGlzdGljcywgeW91ciBjaG9pY2VzIGFyZSB0byBlaXRoZXIga2VlcCB0aGUKLQlwcmVkaWN0aW9ucyB0dXJuZWQtb24gYW5kIGludGVycHJldCB0aGUgcmVzdWx0cyBhcyBpZiBzb21lIG9wY29kZXMKLQloYWQgYmVlbiBjb21iaW5lZCBvciB0dXJuLW9mZiBwcmVkaWN0aW9ucyBzbyB0aGF0IHRoZSBvcGNvZGUgZnJlcXVlbmN5Ci0JY291bnRlciB1cGRhdGVzIGZvciBib3RoIG9wY29kZXMuCisgICAgcHJlZGljdGlvbnMgdHVybmVkLW9uIGFuZCBpbnRlcnByZXQgdGhlIHJlc3VsdHMgYXMgaWYgc29tZSBvcGNvZGVzCisgICAgaGFkIGJlZW4gY29tYmluZWQgb3IgdHVybi1vZmYgcHJlZGljdGlvbnMgc28gdGhhdCB0aGUgb3Bjb2RlIGZyZXF1ZW5jeQorICAgIGNvdW50ZXIgdXBkYXRlcyBmb3IgYm90aCBvcGNvZGVzLgogKi8KIAogI2lmZGVmIERZTkFNSUNfRVhFQ1VUSU9OX1BST0ZJTEUKLSNkZWZpbmUgUFJFRElDVChvcCkJCWlmICgwKSBnb3RvIFBSRURfIyNvcAorI2RlZmluZSBQUkVESUNUKG9wKSAgICAgICAgICAgICBpZiAoMCkgZ290byBQUkVEXyMjb3AKICNlbHNlCi0jZGVmaW5lIFBSRURJQ1Qob3ApCQlpZiAoKm5leHRfaW5zdHIgPT0gb3ApIGdvdG8gUFJFRF8jI29wCisjZGVmaW5lIFBSRURJQ1Qob3ApICAgICAgICAgICAgIGlmICgqbmV4dF9pbnN0ciA9PSBvcCkgZ290byBQUkVEXyMjb3AKICNlbmRpZgogCi0jZGVmaW5lIFBSRURJQ1RFRChvcCkJCVBSRURfIyNvcDogbmV4dF9pbnN0cisrCi0jZGVmaW5lIFBSRURJQ1RFRF9XSVRIX0FSRyhvcCkJUFJFRF8jI29wOiBvcGFyZyA9IFBFRUtBUkcoKTsgbmV4dF9pbnN0ciArPSAzCisjZGVmaW5lIFBSRURJQ1RFRChvcCkgICAgICAgICAgIFBSRURfIyNvcDogbmV4dF9pbnN0cisrCisjZGVmaW5lIFBSRURJQ1RFRF9XSVRIX0FSRyhvcCkgIFBSRURfIyNvcDogb3BhcmcgPSBQRUVLQVJHKCk7IG5leHRfaW5zdHIgKz0gMwogCiAvKiBTdGFjayBtYW5pcHVsYXRpb24gbWFjcm9zICovCiAKIC8qIFRoZSBzdGFjayBjYW4gZ3JvdyBhdCBtb3N0IE1BWElOVCBkZWVwLCBhcyBjb19ubG9jYWxzIGFuZAogICAgY29fc3RhY2tzaXplIGFyZSBpbnRzLiAqLwotI2RlZmluZSBTVEFDS19MRVZFTCgpCSgoaW50KShzdGFja19wb2ludGVyIC0gZi0+Zl92YWx1ZXN0YWNrKSkKLSNkZWZpbmUgRU1QVFkoKQkJKFNUQUNLX0xFVkVMKCkgPT0gMCkKLSNkZWZpbmUgVE9QKCkJCShzdGFja19wb2ludGVyWy0xXSkKLSNkZWZpbmUgU0VDT05EKCkJKHN0YWNrX3BvaW50ZXJbLTJdKQotI2RlZmluZSBUSElSRCgpIAkoc3RhY2tfcG9pbnRlclstM10pCi0jZGVmaW5lIEZPVVJUSCgpCShzdGFja19wb2ludGVyWy00XSkKLSNkZWZpbmUgU0VUX1RPUCh2KQkoc3RhY2tfcG9pbnRlclstMV0gPSAodikpCi0jZGVmaW5lIFNFVF9TRUNPTkQodikJKHN0YWNrX3BvaW50ZXJbLTJdID0gKHYpKQotI2RlZmluZSBTRVRfVEhJUkQodikJKHN0YWNrX3BvaW50ZXJbLTNdID0gKHYpKQotI2RlZmluZSBTRVRfRk9VUlRIKHYpCShzdGFja19wb2ludGVyWy00XSA9ICh2KSkKLSNkZWZpbmUgQkFTSUNfU1RBQ0tBREoobikJKHN0YWNrX3BvaW50ZXIgKz0gbikKLSNkZWZpbmUgQkFTSUNfUFVTSCh2KQkoKnN0YWNrX3BvaW50ZXIrKyA9ICh2KSkKLSNkZWZpbmUgQkFTSUNfUE9QKCkJKCotLXN0YWNrX3BvaW50ZXIpCisjZGVmaW5lIFNUQUNLX0xFVkVMKCkgICAoKGludCkoc3RhY2tfcG9pbnRlciAtIGYtPmZfdmFsdWVzdGFjaykpCisjZGVmaW5lIEVNUFRZKCkgICAgICAgICAoU1RBQ0tfTEVWRUwoKSA9PSAwKQorI2RlZmluZSBUT1AoKSAgICAgICAgICAgKHN0YWNrX3BvaW50ZXJbLTFdKQorI2RlZmluZSBTRUNPTkQoKSAgICAgICAgKHN0YWNrX3BvaW50ZXJbLTJdKQorI2RlZmluZSBUSElSRCgpICAgICAgICAgKHN0YWNrX3BvaW50ZXJbLTNdKQorI2RlZmluZSBGT1VSVEgoKSAgICAgICAgKHN0YWNrX3BvaW50ZXJbLTRdKQorI2RlZmluZSBTRVRfVE9QKHYpICAgICAgKHN0YWNrX3BvaW50ZXJbLTFdID0gKHYpKQorI2RlZmluZSBTRVRfU0VDT05EKHYpICAgKHN0YWNrX3BvaW50ZXJbLTJdID0gKHYpKQorI2RlZmluZSBTRVRfVEhJUkQodikgICAgKHN0YWNrX3BvaW50ZXJbLTNdID0gKHYpKQorI2RlZmluZSBTRVRfRk9VUlRIKHYpICAgKHN0YWNrX3BvaW50ZXJbLTRdID0gKHYpKQorI2RlZmluZSBCQVNJQ19TVEFDS0FESihuKSAgICAgICAoc3RhY2tfcG9pbnRlciArPSBuKQorI2RlZmluZSBCQVNJQ19QVVNIKHYpICAgKCpzdGFja19wb2ludGVyKysgPSAodikpCisjZGVmaW5lIEJBU0lDX1BPUCgpICAgICAoKi0tc3RhY2tfcG9pbnRlcikKIAogI2lmZGVmIExMVFJBQ0UKLSNkZWZpbmUgUFVTSCh2KQkJeyAodm9pZCkoQkFTSUNfUFVTSCh2KSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdHJhY2UgJiYgcHJ0cmFjZShUT1AoKSwgInB1c2giKSk7IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQoU1RBQ0tfTEVWRUwoKSA8PSBjby0+Y29fc3RhY2tzaXplKTsgfQotI2RlZmluZSBQT1AoKQkJKCh2b2lkKShsbHRyYWNlICYmIHBydHJhY2UoVE9QKCksICJwb3AiKSksIFwKLQkJCSBCQVNJQ19QT1AoKSkKLSNkZWZpbmUgU1RBQ0tBREoobikJeyAodm9pZCkoQkFTSUNfU1RBQ0tBREoobiksIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHRyYWNlICYmIHBydHJhY2UoVE9QKCksICJzdGFja2FkaiIpKTsgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydChTVEFDS19MRVZFTCgpIDw9IGNvLT5jb19zdGFja3NpemUpOyB9CisjZGVmaW5lIFBVU0godikgICAgICAgICB7ICh2b2lkKShCQVNJQ19QVVNIKHYpLCBcCisgICAgICAgICAgICAgICAgICAgbGx0cmFjZSAmJiBwcnRyYWNlKFRPUCgpLCAicHVzaCIpKTsgXAorICAgICAgICAgICAgICAgICAgIGFzc2VydChTVEFDS19MRVZFTCgpIDw9IGNvLT5jb19zdGFja3NpemUpOyB9CisjZGVmaW5lIFBPUCgpICAgICAgICAgICAoKHZvaWQpKGxsdHJhY2UgJiYgcHJ0cmFjZShUT1AoKSwgInBvcCIpKSwgXAorICAgICAgICAgICAgIEJBU0lDX1BPUCgpKQorI2RlZmluZSBTVEFDS0FESihuKSAgICAgeyAodm9pZCkoQkFTSUNfU1RBQ0tBREoobiksIFwKKyAgICAgICAgICAgICAgICAgICBsbHRyYWNlICYmIHBydHJhY2UoVE9QKCksICJzdGFja2FkaiIpKTsgXAorICAgICAgICAgICAgICAgICAgIGFzc2VydChTVEFDS19MRVZFTCgpIDw9IGNvLT5jb19zdGFja3NpemUpOyB9CiAjZGVmaW5lIEVYVF9QT1AoU1RBQ0tfUE9JTlRFUikgKCh2b2lkKShsbHRyYWNlICYmIFwKLQkJCQlwcnRyYWNlKChTVEFDS19QT0lOVEVSKVstMV0sICJleHRfcG9wIikpLCBcCi0JCQkJKi0tKFNUQUNLX1BPSU5URVIpKQorICAgICAgICAgICAgICAgIHBydHJhY2UoKFNUQUNLX1BPSU5URVIpWy0xXSwgImV4dF9wb3AiKSksIFwKKyAgICAgICAgICAgICAgICAqLS0oU1RBQ0tfUE9JTlRFUikpCiAjZWxzZQotI2RlZmluZSBQVVNIKHYpCQlCQVNJQ19QVVNIKHYpCi0jZGVmaW5lIFBPUCgpCQlCQVNJQ19QT1AoKQotI2RlZmluZSBTVEFDS0FESihuKQlCQVNJQ19TVEFDS0FESihuKQorI2RlZmluZSBQVVNIKHYpICAgICAgICAgQkFTSUNfUFVTSCh2KQorI2RlZmluZSBQT1AoKSAgICAgICAgICAgQkFTSUNfUE9QKCkKKyNkZWZpbmUgU1RBQ0tBREoobikgICAgIEJBU0lDX1NUQUNLQURKKG4pCiAjZGVmaW5lIEVYVF9QT1AoU1RBQ0tfUE9JTlRFUikgKCotLShTVEFDS19QT0lOVEVSKSkKICNlbmRpZgogCiAvKiBMb2NhbCB2YXJpYWJsZSBtYWNyb3MgKi8KIAotI2RlZmluZSBHRVRMT0NBTChpKQkoZmFzdGxvY2Fsc1tpXSkKKyNkZWZpbmUgR0VUTE9DQUwoaSkgICAgIChmYXN0bG9jYWxzW2ldKQogCiAvKiBUaGUgU0VUTE9DQUwoKSBtYWNybyBtdXN0IG5vdCBERUNSRUYgdGhlIGxvY2FsIHZhcmlhYmxlIGluLXBsYWNlIGFuZAogICAgdGhlbiBzdG9yZSB0aGUgbmV3IHZhbHVlOyBpdCBtdXN0IGNvcHkgdGhlIG9sZCB2YWx1ZSB0byBhIHRlbXBvcmFyeQpAQCAtNzMzLDIwMjMgKzczMywyMDIzIEBACiAgICBUaGlzIGlzIGJlY2F1c2UgaXQgaXMgcG9zc2libGUgdGhhdCBkdXJpbmcgdGhlIERFQ1JFRiB0aGUgZnJhbWUgaXMKICAgIGFjY2Vzc2VkIGJ5IG90aGVyIGNvZGUgKGUuZy4gYSBfX2RlbF9fIG1ldGhvZCBvciBnYy5jb2xsZWN0KCkpIGFuZCB0aGUKICAgIHZhcmlhYmxlIHdvdWxkIGJlIHBvaW50aW5nIHRvIGFscmVhZHktZnJlZWQgbWVtb3J5LiAqLwotI2RlZmluZSBTRVRMT0NBTChpLCB2YWx1ZSkJZG8geyBQeU9iamVjdCAqdG1wID0gR0VUTE9DQUwoaSk7IFwKLQkJCQkgICAgIEdFVExPQ0FMKGkpID0gdmFsdWU7IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9YREVDUkVGKHRtcCk7IH0gd2hpbGUgKDApCisjZGVmaW5lIFNFVExPQ0FMKGksIHZhbHVlKSAgICAgIGRvIHsgUHlPYmplY3QgKnRtcCA9IEdFVExPQ0FMKGkpOyBcCisgICAgICAgICAgICAgICAgICAgICBHRVRMT0NBTChpKSA9IHZhbHVlOyBcCisgICAgICAgICAgICAgICAgICAgICBQeV9YREVDUkVGKHRtcCk7IH0gd2hpbGUgKDApCiAKIC8qIFN0YXJ0IG9mIGNvZGUgKi8KIAotCWlmIChmID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIGlmIChmID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JLyogcHVzaCBmcmFtZSAqLwotCWlmIChQeV9FbnRlclJlY3Vyc2l2ZUNhbGwoIiIpKQotCQlyZXR1cm4gTlVMTDsKKyAgICAvKiBwdXNoIGZyYW1lICovCisgICAgaWYgKFB5X0VudGVyUmVjdXJzaXZlQ2FsbCgiIikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JdHN0YXRlLT5mcmFtZSA9IGY7CisgICAgdHN0YXRlLT5mcmFtZSA9IGY7CiAKLQlpZiAodHN0YXRlLT51c2VfdHJhY2luZykgewotCQlpZiAodHN0YXRlLT5jX3RyYWNlZnVuYyAhPSBOVUxMKSB7Ci0JCQkvKiB0c3RhdGUtPmNfdHJhY2VmdW5jLCBpZiBkZWZpbmVkLCBpcyBhCi0JCQkgICBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIG9uICpldmVyeSogZW50cnkKLQkJCSAgIHRvIGEgY29kZSBibG9jay4gIEl0cyByZXR1cm4gdmFsdWUsIGlmIG5vdAotCQkJICAgTm9uZSwgaXMgYSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIGF0Ci0JCQkgICB0aGUgc3RhcnQgb2YgZWFjaCBleGVjdXRlZCBsaW5lIG9mIGNvZGUuCi0JCQkgICAoQWN0dWFsbHksIHRoZSBmdW5jdGlvbiBtdXN0IHJldHVybiBpdHNlbGYKLQkJCSAgIGluIG9yZGVyIHRvIGNvbnRpbnVlIHRyYWNpbmcuKSAgVGhlIHRyYWNlCi0JCQkgICBmdW5jdGlvbnMgYXJlIGNhbGxlZCB3aXRoIHRocmVlIGFyZ3VtZW50czoKLQkJCSAgIGEgcG9pbnRlciB0byB0aGUgY3VycmVudCBmcmFtZSwgYSBzdHJpbmcKLQkJCSAgIGluZGljYXRpbmcgd2h5IHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQsIGFuZAotCQkJICAgYW4gYXJndW1lbnQgd2hpY2ggZGVwZW5kcyBvbiB0aGUgc2l0dWF0aW9uLgotCQkJICAgVGhlIGdsb2JhbCB0cmFjZSBmdW5jdGlvbiBpcyBhbHNvIGNhbGxlZAotCQkJICAgd2hlbmV2ZXIgYW4gZXhjZXB0aW9uIGlzIGRldGVjdGVkLiAqLwotCQkJaWYgKGNhbGxfdHJhY2VfcHJvdGVjdGVkKHRzdGF0ZS0+Y190cmFjZWZ1bmMsCi0JCQkJCQkgdHN0YXRlLT5jX3RyYWNlb2JqLAotCQkJCQkJIGYsIFB5VHJhY2VfQ0FMTCwgUHlfTm9uZSkpIHsKLQkJCQkvKiBUcmFjZSBmdW5jdGlvbiByYWlzZWQgYW4gZXJyb3IgKi8KLQkJCQlnb3RvIGV4aXRfZXZhbF9mcmFtZTsKLQkJCX0KLQkJfQotCQlpZiAodHN0YXRlLT5jX3Byb2ZpbGVmdW5jICE9IE5VTEwpIHsKLQkJCS8qIFNpbWlsYXIgZm9yIGNfcHJvZmlsZWZ1bmMsIGV4Y2VwdCBpdCBuZWVkbid0Ci0JCQkgICByZXR1cm4gaXRzZWxmIGFuZCBpc24ndCBjYWxsZWQgZm9yICJsaW5lIiBldmVudHMgKi8KLQkJCWlmIChjYWxsX3RyYWNlX3Byb3RlY3RlZCh0c3RhdGUtPmNfcHJvZmlsZWZ1bmMsCi0JCQkJCQkgdHN0YXRlLT5jX3Byb2ZpbGVvYmosCi0JCQkJCQkgZiwgUHlUcmFjZV9DQUxMLCBQeV9Ob25lKSkgewotCQkJCS8qIFByb2ZpbGUgZnVuY3Rpb24gcmFpc2VkIGFuIGVycm9yICovCi0JCQkJZ290byBleGl0X2V2YWxfZnJhbWU7Ci0JCQl9Ci0JCX0KLQl9CisgICAgaWYgKHRzdGF0ZS0+dXNlX3RyYWNpbmcpIHsKKyAgICAgICAgaWYgKHRzdGF0ZS0+Y190cmFjZWZ1bmMgIT0gTlVMTCkgeworICAgICAgICAgICAgLyogdHN0YXRlLT5jX3RyYWNlZnVuYywgaWYgZGVmaW5lZCwgaXMgYQorICAgICAgICAgICAgICAgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCBvbiAqZXZlcnkqIGVudHJ5CisgICAgICAgICAgICAgICB0byBhIGNvZGUgYmxvY2suICBJdHMgcmV0dXJuIHZhbHVlLCBpZiBub3QKKyAgICAgICAgICAgICAgIE5vbmUsIGlzIGEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCBhdAorICAgICAgICAgICAgICAgdGhlIHN0YXJ0IG9mIGVhY2ggZXhlY3V0ZWQgbGluZSBvZiBjb2RlLgorICAgICAgICAgICAgICAgKEFjdHVhbGx5LCB0aGUgZnVuY3Rpb24gbXVzdCByZXR1cm4gaXRzZWxmCisgICAgICAgICAgICAgICBpbiBvcmRlciB0byBjb250aW51ZSB0cmFjaW5nLikgIFRoZSB0cmFjZQorICAgICAgICAgICAgICAgZnVuY3Rpb25zIGFyZSBjYWxsZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6CisgICAgICAgICAgICAgICBhIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgZnJhbWUsIGEgc3RyaW5nCisgICAgICAgICAgICAgICBpbmRpY2F0aW5nIHdoeSB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkLCBhbmQKKyAgICAgICAgICAgICAgIGFuIGFyZ3VtZW50IHdoaWNoIGRlcGVuZHMgb24gdGhlIHNpdHVhdGlvbi4KKyAgICAgICAgICAgICAgIFRoZSBnbG9iYWwgdHJhY2UgZnVuY3Rpb24gaXMgYWxzbyBjYWxsZWQKKyAgICAgICAgICAgICAgIHdoZW5ldmVyIGFuIGV4Y2VwdGlvbiBpcyBkZXRlY3RlZC4gKi8KKyAgICAgICAgICAgIGlmIChjYWxsX3RyYWNlX3Byb3RlY3RlZCh0c3RhdGUtPmNfdHJhY2VmdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzdGF0ZS0+Y190cmFjZW9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLCBQeVRyYWNlX0NBTEwsIFB5X05vbmUpKSB7CisgICAgICAgICAgICAgICAgLyogVHJhY2UgZnVuY3Rpb24gcmFpc2VkIGFuIGVycm9yICovCisgICAgICAgICAgICAgICAgZ290byBleGl0X2V2YWxfZnJhbWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRzdGF0ZS0+Y19wcm9maWxlZnVuYyAhPSBOVUxMKSB7CisgICAgICAgICAgICAvKiBTaW1pbGFyIGZvciBjX3Byb2ZpbGVmdW5jLCBleGNlcHQgaXQgbmVlZG4ndAorICAgICAgICAgICAgICAgcmV0dXJuIGl0c2VsZiBhbmQgaXNuJ3QgY2FsbGVkIGZvciAibGluZSIgZXZlbnRzICovCisgICAgICAgICAgICBpZiAoY2FsbF90cmFjZV9wcm90ZWN0ZWQodHN0YXRlLT5jX3Byb2ZpbGVmdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzdGF0ZS0+Y19wcm9maWxlb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYsIFB5VHJhY2VfQ0FMTCwgUHlfTm9uZSkpIHsKKyAgICAgICAgICAgICAgICAvKiBQcm9maWxlIGZ1bmN0aW9uIHJhaXNlZCBhbiBlcnJvciAqLworICAgICAgICAgICAgICAgIGdvdG8gZXhpdF9ldmFsX2ZyYW1lOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogCi0JY28gPSBmLT5mX2NvZGU7Ci0JbmFtZXMgPSBjby0+Y29fbmFtZXM7Ci0JY29uc3RzID0gY28tPmNvX2NvbnN0czsKLQlmYXN0bG9jYWxzID0gZi0+Zl9sb2NhbHNwbHVzOwotCWZyZWV2YXJzID0gZi0+Zl9sb2NhbHNwbHVzICsgY28tPmNvX25sb2NhbHM7Ci0JZmlyc3RfaW5zdHIgPSAodW5zaWduZWQgY2hhciopIFB5U3RyaW5nX0FTX1NUUklORyhjby0+Y29fY29kZSk7Ci0JLyogQW4gZXhwbGFuYXRpb24gaXMgaW4gb3JkZXIgZm9yIHRoZSBuZXh0IGxpbmUuCisgICAgY28gPSBmLT5mX2NvZGU7CisgICAgbmFtZXMgPSBjby0+Y29fbmFtZXM7CisgICAgY29uc3RzID0gY28tPmNvX2NvbnN0czsKKyAgICBmYXN0bG9jYWxzID0gZi0+Zl9sb2NhbHNwbHVzOworICAgIGZyZWV2YXJzID0gZi0+Zl9sb2NhbHNwbHVzICsgY28tPmNvX25sb2NhbHM7CisgICAgZmlyc3RfaW5zdHIgPSAodW5zaWduZWQgY2hhciopIFB5U3RyaW5nX0FTX1NUUklORyhjby0+Y29fY29kZSk7CisgICAgLyogQW4gZXhwbGFuYXRpb24gaXMgaW4gb3JkZXIgZm9yIHRoZSBuZXh0IGxpbmUuCiAKLQkgICBmLT5mX2xhc3RpIG5vdyByZWZlcnMgdG8gdGhlIGluZGV4IG9mIHRoZSBsYXN0IGluc3RydWN0aW9uCi0JICAgZXhlY3V0ZWQuICBZb3UgbWlnaHQgdGhpbmsgdGhpcyB3YXMgb2J2aW91cyBmcm9tIHRoZSBuYW1lLCBidXQKLQkgICB0aGlzIHdhc24ndCBhbHdheXMgdHJ1ZSBiZWZvcmUgMi4zISAgUHlGcmFtZV9OZXcgbm93IHNldHMKLQkgICBmLT5mX2xhc3RpIHRvIC0xIChpLmUuIHRoZSBpbmRleCAqYmVmb3JlKiB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24pCi0JICAgYW5kIFlJRUxEX1ZBTFVFIGRvZXNuJ3QgZmlkZGxlIHdpdGggZl9sYXN0aSBhbnkgbW9yZS4gIFNvIHRoaXMKLQkgICBkb2VzIHdvcmsuICBQcm9taXNlLgorICAgICAgIGYtPmZfbGFzdGkgbm93IHJlZmVycyB0byB0aGUgaW5kZXggb2YgdGhlIGxhc3QgaW5zdHJ1Y3Rpb24KKyAgICAgICBleGVjdXRlZC4gIFlvdSBtaWdodCB0aGluayB0aGlzIHdhcyBvYnZpb3VzIGZyb20gdGhlIG5hbWUsIGJ1dAorICAgICAgIHRoaXMgd2Fzbid0IGFsd2F5cyB0cnVlIGJlZm9yZSAyLjMhICBQeUZyYW1lX05ldyBub3cgc2V0cworICAgICAgIGYtPmZfbGFzdGkgdG8gLTEgKGkuZS4gdGhlIGluZGV4ICpiZWZvcmUqIHRoZSBmaXJzdCBpbnN0cnVjdGlvbikKKyAgICAgICBhbmQgWUlFTERfVkFMVUUgZG9lc24ndCBmaWRkbGUgd2l0aCBmX2xhc3RpIGFueSBtb3JlLiAgU28gdGhpcworICAgICAgIGRvZXMgd29yay4gIFByb21pc2UuCiAKLQkgICBXaGVuIHRoZSBQUkVESUNUKCkgbWFjcm9zIGFyZSBlbmFibGVkLCBzb21lIG9wY29kZSBwYWlycyBmb2xsb3cgaW4KLSAgICAgICAgICAgZGlyZWN0IHN1Y2Nlc3Npb24gd2l0aG91dCB1cGRhdGluZyBmLT5mX2xhc3RpLiAgQSBzdWNjZXNzZnVsCi0gICAgICAgICAgIHByZWRpY3Rpb24gZWZmZWN0aXZlbHkgbGlua3MgdGhlIHR3byBjb2RlcyB0b2dldGhlciBhcyBpZiB0aGV5Ci0gICAgICAgICAgIHdlcmUgYSBzaW5nbGUgbmV3IG9wY29kZTsgYWNjb3JkaW5nbHksZi0+Zl9sYXN0aSB3aWxsIHBvaW50IHRvCi0gICAgICAgICAgIHRoZSBmaXJzdCBjb2RlIGluIHRoZSBwYWlyIChmb3IgaW5zdGFuY2UsIEdFVF9JVEVSIGZvbGxvd2VkIGJ5Ci0gICAgICAgICAgIEZPUl9JVEVSIGlzIGVmZmVjdGl2ZWx5IGEgc2luZ2xlIG9wY29kZSBhbmQgZi0+Zl9sYXN0aSB3aWxsIHBvaW50Ci0gICAgICAgICAgIGF0IHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGNvbWJpbmVkIHBhaXIuKQotCSovCi0JbmV4dF9pbnN0ciA9IGZpcnN0X2luc3RyICsgZi0+Zl9sYXN0aSArIDE7Ci0Jc3RhY2tfcG9pbnRlciA9IGYtPmZfc3RhY2t0b3A7Ci0JYXNzZXJ0KHN0YWNrX3BvaW50ZXIgIT0gTlVMTCk7Ci0JZi0+Zl9zdGFja3RvcCA9IE5VTEw7CS8qIHJlbWFpbnMgTlVMTCB1bmxlc3MgeWllbGQgc3VzcGVuZHMgZnJhbWUgKi8KKyAgICAgICBXaGVuIHRoZSBQUkVESUNUKCkgbWFjcm9zIGFyZSBlbmFibGVkLCBzb21lIG9wY29kZSBwYWlycyBmb2xsb3cgaW4KKyAgICAgICBkaXJlY3Qgc3VjY2Vzc2lvbiB3aXRob3V0IHVwZGF0aW5nIGYtPmZfbGFzdGkuICBBIHN1Y2Nlc3NmdWwKKyAgICAgICBwcmVkaWN0aW9uIGVmZmVjdGl2ZWx5IGxpbmtzIHRoZSB0d28gY29kZXMgdG9nZXRoZXIgYXMgaWYgdGhleQorICAgICAgIHdlcmUgYSBzaW5nbGUgbmV3IG9wY29kZTsgYWNjb3JkaW5nbHksZi0+Zl9sYXN0aSB3aWxsIHBvaW50IHRvCisgICAgICAgdGhlIGZpcnN0IGNvZGUgaW4gdGhlIHBhaXIgKGZvciBpbnN0YW5jZSwgR0VUX0lURVIgZm9sbG93ZWQgYnkKKyAgICAgICBGT1JfSVRFUiBpcyBlZmZlY3RpdmVseSBhIHNpbmdsZSBvcGNvZGUgYW5kIGYtPmZfbGFzdGkgd2lsbCBwb2ludAorICAgICAgIGF0IHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGNvbWJpbmVkIHBhaXIuKQorICAgICovCisgICAgbmV4dF9pbnN0ciA9IGZpcnN0X2luc3RyICsgZi0+Zl9sYXN0aSArIDE7CisgICAgc3RhY2tfcG9pbnRlciA9IGYtPmZfc3RhY2t0b3A7CisgICAgYXNzZXJ0KHN0YWNrX3BvaW50ZXIgIT0gTlVMTCk7CisgICAgZi0+Zl9zdGFja3RvcCA9IE5VTEw7ICAgICAgIC8qIHJlbWFpbnMgTlVMTCB1bmxlc3MgeWllbGQgc3VzcGVuZHMgZnJhbWUgKi8KIAogI2lmZGVmIExMVFJBQ0UKLQlsbHRyYWNlID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoZi0+Zl9nbG9iYWxzLCAiX19sbHRyYWNlX18iKSAhPSBOVUxMOworICAgIGxsdHJhY2UgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhmLT5mX2dsb2JhbHMsICJfX2xsdHJhY2VfXyIpICE9IE5VTEw7CiAjZW5kaWYKICNpZiBkZWZpbmVkKFB5X0RFQlVHKSB8fCBkZWZpbmVkKExMVFJBQ0UpCi0JZmlsZW5hbWUgPSBQeVN0cmluZ19Bc1N0cmluZyhjby0+Y29fZmlsZW5hbWUpOworICAgIGZpbGVuYW1lID0gUHlTdHJpbmdfQXNTdHJpbmcoY28tPmNvX2ZpbGVuYW1lKTsKICNlbmRpZgogCi0Jd2h5ID0gV0hZX05PVDsKLQllcnIgPSAwOwotCXggPSBQeV9Ob25lOwkvKiBOb3QgYSByZWZlcmVuY2UsIGp1c3QgYW55dGhpbmcgbm9uLU5VTEwgKi8KLQl3ID0gTlVMTDsKKyAgICB3aHkgPSBXSFlfTk9UOworICAgIGVyciA9IDA7CisgICAgeCA9IFB5X05vbmU7ICAgICAgICAvKiBOb3QgYSByZWZlcmVuY2UsIGp1c3QgYW55dGhpbmcgbm9uLU5VTEwgKi8KKyAgICB3ID0gTlVMTDsKIAotCWlmICh0aHJvd2ZsYWcpIHsgLyogc3VwcG9ydCBmb3IgZ2VuZXJhdG9yLnRocm93KCkgKi8KLQkJd2h5ID0gV0hZX0VYQ0VQVElPTjsKLQkJZ290byBvbl9lcnJvcjsKLQl9CisgICAgaWYgKHRocm93ZmxhZykgeyAvKiBzdXBwb3J0IGZvciBnZW5lcmF0b3IudGhyb3coKSAqLworICAgICAgICB3aHkgPSBXSFlfRVhDRVBUSU9OOworICAgICAgICBnb3RvIG9uX2Vycm9yOworICAgIH0KIAotCWZvciAoOzspIHsKKyAgICBmb3IgKDs7KSB7CiAjaWZkZWYgV0lUSF9UU0MKLQkJaWYgKGluc3QxID09IDApIHsKLQkJCS8qIEFsbW9zdCBzdXJlbHksIHRoZSBvcGNvZGUgZXhlY3V0ZWQgYSBicmVhawotCQkJICAgb3IgYSBjb250aW51ZSwgcHJldmVudGluZyBpbnN0MSBmcm9tIGJlaW5nIHNldAotCQkJICAgb24gdGhlIHdheSBvdXQgb2YgdGhlIGxvb3AuCi0JCQkqLwotCQkJUkVBRF9USU1FU1RBTVAoaW5zdDEpOwotCQkJbG9vcDEgPSBpbnN0MTsKLQkJfQotCQlkdW1wX3RzYyhvcGNvZGUsIHRpY2tlZCwgaW5zdDAsIGluc3QxLCBsb29wMCwgbG9vcDEsCi0JCQkgaW50cjAsIGludHIxKTsKLQkJdGlja2VkID0gMDsKLQkJaW5zdDEgPSAwOwotCQlpbnRyMCA9IDA7Ci0JCWludHIxID0gMDsKLQkJUkVBRF9USU1FU1RBTVAobG9vcDApOworICAgICAgICBpZiAoaW5zdDEgPT0gMCkgeworICAgICAgICAgICAgLyogQWxtb3N0IHN1cmVseSwgdGhlIG9wY29kZSBleGVjdXRlZCBhIGJyZWFrCisgICAgICAgICAgICAgICBvciBhIGNvbnRpbnVlLCBwcmV2ZW50aW5nIGluc3QxIGZyb20gYmVpbmcgc2V0CisgICAgICAgICAgICAgICBvbiB0aGUgd2F5IG91dCBvZiB0aGUgbG9vcC4KKyAgICAgICAgICAgICovCisgICAgICAgICAgICBSRUFEX1RJTUVTVEFNUChpbnN0MSk7CisgICAgICAgICAgICBsb29wMSA9IGluc3QxOworICAgICAgICB9CisgICAgICAgIGR1bXBfdHNjKG9wY29kZSwgdGlja2VkLCBpbnN0MCwgaW5zdDEsIGxvb3AwLCBsb29wMSwKKyAgICAgICAgICAgICAgICAgaW50cjAsIGludHIxKTsKKyAgICAgICAgdGlja2VkID0gMDsKKyAgICAgICAgaW5zdDEgPSAwOworICAgICAgICBpbnRyMCA9IDA7CisgICAgICAgIGludHIxID0gMDsKKyAgICAgICAgUkVBRF9USU1FU1RBTVAobG9vcDApOwogI2VuZGlmCi0JCWFzc2VydChzdGFja19wb2ludGVyID49IGYtPmZfdmFsdWVzdGFjayk7IC8qIGVsc2UgdW5kZXJmbG93ICovCi0JCWFzc2VydChTVEFDS19MRVZFTCgpIDw9IGNvLT5jb19zdGFja3NpemUpOyAgLyogZWxzZSBvdmVyZmxvdyAqLworICAgICAgICBhc3NlcnQoc3RhY2tfcG9pbnRlciA+PSBmLT5mX3ZhbHVlc3RhY2spOyAvKiBlbHNlIHVuZGVyZmxvdyAqLworICAgICAgICBhc3NlcnQoU1RBQ0tfTEVWRUwoKSA8PSBjby0+Y29fc3RhY2tzaXplKTsgIC8qIGVsc2Ugb3ZlcmZsb3cgKi8KIAotCQkvKiBEbyBwZXJpb2RpYyB0aGluZ3MuICBEb2luZyB0aGlzIGV2ZXJ5IHRpbWUgdGhyb3VnaAotCQkgICB0aGUgbG9vcCB3b3VsZCBhZGQgdG9vIG11Y2ggb3ZlcmhlYWQsIHNvIHdlIGRvIGl0Ci0JCSAgIG9ubHkgZXZlcnkgTnRoIGluc3RydWN0aW9uLiAgV2UgYWxzbyBkbyBpdCBpZgotCQkgICBgYHRoaW5nc190b19kbycnIGlzIHNldCwgaS5lLiB3aGVuIGFuIGFzeW5jaHJvbm91cwotCQkgICBldmVudCBuZWVkcyBhdHRlbnRpb24gKGUuZy4gYSBzaWduYWwgaGFuZGxlciBvcgotCQkgICBhc3luYyBJL08gaGFuZGxlcik7IHNlZSBQeV9BZGRQZW5kaW5nQ2FsbCgpIGFuZAotCQkgICBQeV9NYWtlUGVuZGluZ0NhbGxzKCkgYWJvdmUuICovCisgICAgICAgIC8qIERvIHBlcmlvZGljIHRoaW5ncy4gIERvaW5nIHRoaXMgZXZlcnkgdGltZSB0aHJvdWdoCisgICAgICAgICAgIHRoZSBsb29wIHdvdWxkIGFkZCB0b28gbXVjaCBvdmVyaGVhZCwgc28gd2UgZG8gaXQKKyAgICAgICAgICAgb25seSBldmVyeSBOdGggaW5zdHJ1Y3Rpb24uICBXZSBhbHNvIGRvIGl0IGlmCisgICAgICAgICAgIGBgdGhpbmdzX3RvX2RvJycgaXMgc2V0LCBpLmUuIHdoZW4gYW4gYXN5bmNocm9ub3VzCisgICAgICAgICAgIGV2ZW50IG5lZWRzIGF0dGVudGlvbiAoZS5nLiBhIHNpZ25hbCBoYW5kbGVyIG9yCisgICAgICAgICAgIGFzeW5jIEkvTyBoYW5kbGVyKTsgc2VlIFB5X0FkZFBlbmRpbmdDYWxsKCkgYW5kCisgICAgICAgICAgIFB5X01ha2VQZW5kaW5nQ2FsbHMoKSBhYm92ZS4gKi8KIAotCQlpZiAoLS1fUHlfVGlja2VyIDwgMCkgewotCQkJaWYgKCpuZXh0X2luc3RyID09IFNFVFVQX0ZJTkFMTFkpIHsKLQkJCQkvKiBNYWtlIHRoZSBsYXN0IG9wY29kZSBiZWZvcmUKLQkJCQkgICBhIHRyeTogZmluYWxseTogYmxvY2sgdW5pbnRlcnJ1cHRhYmxlLiAqLwotCQkJCWdvdG8gZmFzdF9uZXh0X29wY29kZTsKLQkJCX0KLQkJCV9QeV9UaWNrZXIgPSBfUHlfQ2hlY2tJbnRlcnZhbDsKLQkJCXRzdGF0ZS0+dGlja19jb3VudGVyKys7CisgICAgICAgIGlmICgtLV9QeV9UaWNrZXIgPCAwKSB7CisgICAgICAgICAgICBpZiAoKm5leHRfaW5zdHIgPT0gU0VUVVBfRklOQUxMWSkgeworICAgICAgICAgICAgICAgIC8qIE1ha2UgdGhlIGxhc3Qgb3Bjb2RlIGJlZm9yZQorICAgICAgICAgICAgICAgICAgIGEgdHJ5OiBmaW5hbGx5OiBibG9jayB1bmludGVycnVwdGFibGUuICovCisgICAgICAgICAgICAgICAgZ290byBmYXN0X25leHRfb3Bjb2RlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgX1B5X1RpY2tlciA9IF9QeV9DaGVja0ludGVydmFsOworICAgICAgICAgICAgdHN0YXRlLT50aWNrX2NvdW50ZXIrKzsKICNpZmRlZiBXSVRIX1RTQwotCQkJdGlja2VkID0gMTsKKyAgICAgICAgICAgIHRpY2tlZCA9IDE7CiAjZW5kaWYKLQkJCWlmICh0aGluZ3NfdG9fZG8pIHsKLQkJCQlpZiAoUHlfTWFrZVBlbmRpbmdDYWxscygpIDwgMCkgewotCQkJCQl3aHkgPSBXSFlfRVhDRVBUSU9OOwotCQkJCQlnb3RvIG9uX2Vycm9yOwotCQkJCX0KLQkJCQlpZiAodGhpbmdzX3RvX2RvKQotCQkJCQkvKiBNYWtlUGVuZGluZ0NhbGxzKCkgZGlkbid0IHN1Y2NlZWQuCi0JCQkJCSAgIEZvcmNlIGVhcmx5IHJlLWV4ZWN1dGlvbiBvZiB0aGlzCi0JCQkJCSAgICJwZXJpb2RpYyIgY29kZSwgcG9zc2libHkgYWZ0ZXIKLQkJCQkJICAgYSB0aHJlYWQgc3dpdGNoICovCi0JCQkJCV9QeV9UaWNrZXIgPSAwOwotCQkJfQorICAgICAgICAgICAgaWYgKHRoaW5nc190b19kbykgeworICAgICAgICAgICAgICAgIGlmIChQeV9NYWtlUGVuZGluZ0NhbGxzKCkgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIHdoeSA9IFdIWV9FWENFUFRJT047CisgICAgICAgICAgICAgICAgICAgIGdvdG8gb25fZXJyb3I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICh0aGluZ3NfdG9fZG8pCisgICAgICAgICAgICAgICAgICAgIC8qIE1ha2VQZW5kaW5nQ2FsbHMoKSBkaWRuJ3Qgc3VjY2VlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgRm9yY2UgZWFybHkgcmUtZXhlY3V0aW9uIG9mIHRoaXMKKyAgICAgICAgICAgICAgICAgICAgICAgInBlcmlvZGljIiBjb2RlLCBwb3NzaWJseSBhZnRlcgorICAgICAgICAgICAgICAgICAgICAgICBhIHRocmVhZCBzd2l0Y2ggKi8KKyAgICAgICAgICAgICAgICAgICAgX1B5X1RpY2tlciA9IDA7CisgICAgICAgICAgICB9CiAjaWZkZWYgV0lUSF9USFJFQUQKLQkJCWlmIChpbnRlcnByZXRlcl9sb2NrKSB7Ci0JCQkJLyogR2l2ZSBhbm90aGVyIHRocmVhZCBhIGNoYW5jZSAqLworICAgICAgICAgICAgaWYgKGludGVycHJldGVyX2xvY2spIHsKKyAgICAgICAgICAgICAgICAvKiBHaXZlIGFub3RoZXIgdGhyZWFkIGEgY2hhbmNlICovCiAKLQkJCQlpZiAoUHlUaHJlYWRTdGF0ZV9Td2FwKE5VTEwpICE9IHRzdGF0ZSkKLQkJCQkJUHlfRmF0YWxFcnJvcigiY2V2YWw6IHRzdGF0ZSBtaXgtdXAiKTsKLQkJCQlQeVRocmVhZF9yZWxlYXNlX2xvY2soaW50ZXJwcmV0ZXJfbG9jayk7CisgICAgICAgICAgICAgICAgaWYgKFB5VGhyZWFkU3RhdGVfU3dhcChOVUxMKSAhPSB0c3RhdGUpCisgICAgICAgICAgICAgICAgICAgIFB5X0ZhdGFsRXJyb3IoImNldmFsOiB0c3RhdGUgbWl4LXVwIik7CisgICAgICAgICAgICAgICAgUHlUaHJlYWRfcmVsZWFzZV9sb2NrKGludGVycHJldGVyX2xvY2spOwogCi0JCQkJLyogT3RoZXIgdGhyZWFkcyBtYXkgcnVuIG5vdyAqLworICAgICAgICAgICAgICAgIC8qIE90aGVyIHRocmVhZHMgbWF5IHJ1biBub3cgKi8KIAotCQkJCVB5VGhyZWFkX2FjcXVpcmVfbG9jayhpbnRlcnByZXRlcl9sb2NrLCAxKTsKLQkJCQlpZiAoUHlUaHJlYWRTdGF0ZV9Td2FwKHRzdGF0ZSkgIT0gTlVMTCkKLQkJCQkJUHlfRmF0YWxFcnJvcigiY2V2YWw6IG9ycGhhbiB0c3RhdGUiKTsKKyAgICAgICAgICAgICAgICBQeVRocmVhZF9hY3F1aXJlX2xvY2soaW50ZXJwcmV0ZXJfbG9jaywgMSk7CisgICAgICAgICAgICAgICAgaWYgKFB5VGhyZWFkU3RhdGVfU3dhcCh0c3RhdGUpICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIFB5X0ZhdGFsRXJyb3IoImNldmFsOiBvcnBoYW4gdHN0YXRlIik7CiAKLQkJCQkvKiBDaGVjayBmb3IgdGhyZWFkIGludGVycnVwdHMgKi8KKyAgICAgICAgICAgICAgICAvKiBDaGVjayBmb3IgdGhyZWFkIGludGVycnVwdHMgKi8KIAotCQkJCWlmICh0c3RhdGUtPmFzeW5jX2V4YyAhPSBOVUxMKSB7Ci0JCQkJCXggPSB0c3RhdGUtPmFzeW5jX2V4YzsKLQkJCQkJdHN0YXRlLT5hc3luY19leGMgPSBOVUxMOwotCQkJCQlQeUVycl9TZXROb25lKHgpOwotCQkJCQlQeV9ERUNSRUYoeCk7Ci0JCQkJCXdoeSA9IFdIWV9FWENFUFRJT047Ci0JCQkJCWdvdG8gb25fZXJyb3I7Ci0JCQkJfQotCQkJfQorICAgICAgICAgICAgICAgIGlmICh0c3RhdGUtPmFzeW5jX2V4YyAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIHggPSB0c3RhdGUtPmFzeW5jX2V4YzsKKyAgICAgICAgICAgICAgICAgICAgdHN0YXRlLT5hc3luY19leGMgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXROb25lKHgpOworICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoeCk7CisgICAgICAgICAgICAgICAgICAgIHdoeSA9IFdIWV9FWENFUFRJT047CisgICAgICAgICAgICAgICAgICAgIGdvdG8gb25fZXJyb3I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogI2VuZGlmCi0JCX0KKyAgICAgICAgfQogCi0JZmFzdF9uZXh0X29wY29kZToKLQkJZi0+Zl9sYXN0aSA9IElOU1RSX09GRlNFVCgpOworICAgIGZhc3RfbmV4dF9vcGNvZGU6CisgICAgICAgIGYtPmZfbGFzdGkgPSBJTlNUUl9PRkZTRVQoKTsKIAotCQkvKiBsaW5lLWJ5LWxpbmUgdHJhY2luZyBzdXBwb3J0ICovCisgICAgICAgIC8qIGxpbmUtYnktbGluZSB0cmFjaW5nIHN1cHBvcnQgKi8KIAotCQlpZiAoX1B5X1RyYWNpbmdQb3NzaWJsZSAmJgotCQkgICAgdHN0YXRlLT5jX3RyYWNlZnVuYyAhPSBOVUxMICYmICF0c3RhdGUtPnRyYWNpbmcpIHsKLQkJCS8qIHNlZSBtYXliZV9jYWxsX2xpbmVfdHJhY2UKLQkJCSAgIGZvciBleHBvc2l0b3J5IGNvbW1lbnRzICovCi0JCQlmLT5mX3N0YWNrdG9wID0gc3RhY2tfcG9pbnRlcjsKKyAgICAgICAgaWYgKF9QeV9UcmFjaW5nUG9zc2libGUgJiYKKyAgICAgICAgICAgIHRzdGF0ZS0+Y190cmFjZWZ1bmMgIT0gTlVMTCAmJiAhdHN0YXRlLT50cmFjaW5nKSB7CisgICAgICAgICAgICAvKiBzZWUgbWF5YmVfY2FsbF9saW5lX3RyYWNlCisgICAgICAgICAgICAgICBmb3IgZXhwb3NpdG9yeSBjb21tZW50cyAqLworICAgICAgICAgICAgZi0+Zl9zdGFja3RvcCA9IHN0YWNrX3BvaW50ZXI7CiAKLQkJCWVyciA9IG1heWJlX2NhbGxfbGluZV90cmFjZSh0c3RhdGUtPmNfdHJhY2VmdW5jLAotCQkJCQkJICAgIHRzdGF0ZS0+Y190cmFjZW9iaiwKLQkJCQkJCSAgICBmLCAmaW5zdHJfbGIsICZpbnN0cl91YiwKLQkJCQkJCSAgICAmaW5zdHJfcHJldik7Ci0JCQkvKiBSZWxvYWQgcG9zc2libHkgY2hhbmdlZCBmcmFtZSBmaWVsZHMgKi8KLQkJCUpVTVBUTyhmLT5mX2xhc3RpKTsKLQkJCWlmIChmLT5mX3N0YWNrdG9wICE9IE5VTEwpIHsKLQkJCQlzdGFja19wb2ludGVyID0gZi0+Zl9zdGFja3RvcDsKLQkJCQlmLT5mX3N0YWNrdG9wID0gTlVMTDsKLQkJCX0KLQkJCWlmIChlcnIpIHsKLQkJCQkvKiB0cmFjZSBmdW5jdGlvbiByYWlzZWQgYW4gZXhjZXB0aW9uICovCi0JCQkJZ290byBvbl9lcnJvcjsKLQkJCX0KLQkJfQorICAgICAgICAgICAgZXJyID0gbWF5YmVfY2FsbF9saW5lX3RyYWNlKHRzdGF0ZS0+Y190cmFjZWZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHN0YXRlLT5jX3RyYWNlb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYsICZpbnN0cl9sYiwgJmluc3RyX3ViLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnN0cl9wcmV2KTsKKyAgICAgICAgICAgIC8qIFJlbG9hZCBwb3NzaWJseSBjaGFuZ2VkIGZyYW1lIGZpZWxkcyAqLworICAgICAgICAgICAgSlVNUFRPKGYtPmZfbGFzdGkpOworICAgICAgICAgICAgaWYgKGYtPmZfc3RhY2t0b3AgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHN0YWNrX3BvaW50ZXIgPSBmLT5mX3N0YWNrdG9wOworICAgICAgICAgICAgICAgIGYtPmZfc3RhY2t0b3AgPSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGVycikgeworICAgICAgICAgICAgICAgIC8qIHRyYWNlIGZ1bmN0aW9uIHJhaXNlZCBhbiBleGNlcHRpb24gKi8KKyAgICAgICAgICAgICAgICBnb3RvIG9uX2Vycm9yOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJLyogRXh0cmFjdCBvcGNvZGUgYW5kIGFyZ3VtZW50ICovCisgICAgICAgIC8qIEV4dHJhY3Qgb3Bjb2RlIGFuZCBhcmd1bWVudCAqLwogCi0JCW9wY29kZSA9IE5FWFRPUCgpOwotCQlvcGFyZyA9IDA7ICAgLyogYWxsb3dzIG9wYXJnIHRvIGJlIHN0b3JlZCBpbiBhIHJlZ2lzdGVyIGJlY2F1c2UKLQkJCWl0IGRvZXNuJ3QgaGF2ZSB0byBiZSByZW1lbWJlcmVkIGFjcm9zcyBhIGZ1bGwgbG9vcCAqLwotCQlpZiAoSEFTX0FSRyhvcGNvZGUpKQotCQkJb3BhcmcgPSBORVhUQVJHKCk7Ci0JICBkaXNwYXRjaF9vcGNvZGU6CisgICAgICAgIG9wY29kZSA9IE5FWFRPUCgpOworICAgICAgICBvcGFyZyA9IDA7ICAgLyogYWxsb3dzIG9wYXJnIHRvIGJlIHN0b3JlZCBpbiBhIHJlZ2lzdGVyIGJlY2F1c2UKKyAgICAgICAgICAgIGl0IGRvZXNuJ3QgaGF2ZSB0byBiZSByZW1lbWJlcmVkIGFjcm9zcyBhIGZ1bGwgbG9vcCAqLworICAgICAgICBpZiAoSEFTX0FSRyhvcGNvZGUpKQorICAgICAgICAgICAgb3BhcmcgPSBORVhUQVJHKCk7CisgICAgICBkaXNwYXRjaF9vcGNvZGU6CiAjaWZkZWYgRFlOQU1JQ19FWEVDVVRJT05fUFJPRklMRQogI2lmZGVmIERYUEFJUlMKLQkJZHhwYWlyc1tsYXN0b3Bjb2RlXVtvcGNvZGVdKys7Ci0JCWxhc3RvcGNvZGUgPSBvcGNvZGU7CisgICAgICAgIGR4cGFpcnNbbGFzdG9wY29kZV1bb3Bjb2RlXSsrOworICAgICAgICBsYXN0b3Bjb2RlID0gb3Bjb2RlOwogI2VuZGlmCi0JCWR4cFtvcGNvZGVdKys7CisgICAgICAgIGR4cFtvcGNvZGVdKys7CiAjZW5kaWYKIAogI2lmZGVmIExMVFJBQ0UKLQkJLyogSW5zdHJ1Y3Rpb24gdHJhY2luZyAqLworICAgICAgICAvKiBJbnN0cnVjdGlvbiB0cmFjaW5nICovCiAKLQkJaWYgKGxsdHJhY2UpIHsKLQkJCWlmIChIQVNfQVJHKG9wY29kZSkpIHsKLQkJCQlwcmludGYoIiVkOiAlZCwgJWRcbiIsCi0JCQkJICAgICAgIGYtPmZfbGFzdGksIG9wY29kZSwgb3BhcmcpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcHJpbnRmKCIlZDogJWRcbiIsCi0JCQkJICAgICAgIGYtPmZfbGFzdGksIG9wY29kZSk7Ci0JCQl9Ci0JCX0KKyAgICAgICAgaWYgKGxsdHJhY2UpIHsKKyAgICAgICAgICAgIGlmIChIQVNfQVJHKG9wY29kZSkpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIiVkOiAlZCwgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGYtPmZfbGFzdGksIG9wY29kZSwgb3BhcmcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCIlZDogJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGYtPmZfbGFzdGksIG9wY29kZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICNlbmRpZgogCi0JCS8qIE1haW4gc3dpdGNoIG9uIG9wY29kZSAqLwotCQlSRUFEX1RJTUVTVEFNUChpbnN0MCk7CisgICAgICAgIC8qIE1haW4gc3dpdGNoIG9uIG9wY29kZSAqLworICAgICAgICBSRUFEX1RJTUVTVEFNUChpbnN0MCk7CiAKLQkJc3dpdGNoIChvcGNvZGUpIHsKKyAgICAgICAgc3dpdGNoIChvcGNvZGUpIHsKIAotCQkvKiBCRVdBUkUhCi0JCSAgIEl0IGlzIGVzc2VudGlhbCB0aGF0IGFueSBvcGVyYXRpb24gdGhhdCBmYWlscyBzZXRzIGVpdGhlcgotCQkgICB4IHRvIE5VTEwsIGVyciB0byBub256ZXJvLCBvciB3aHkgdG8gYW55dGhpbmcgYnV0IFdIWV9OT1QsCi0JCSAgIGFuZCB0aGF0IG5vIG9wZXJhdGlvbiB0aGF0IHN1Y2NlZWRzIGRvZXMgdGhpcyEgKi8KKyAgICAgICAgLyogQkVXQVJFIQorICAgICAgICAgICBJdCBpcyBlc3NlbnRpYWwgdGhhdCBhbnkgb3BlcmF0aW9uIHRoYXQgZmFpbHMgc2V0cyBlaXRoZXIKKyAgICAgICAgICAgeCB0byBOVUxMLCBlcnIgdG8gbm9uemVybywgb3Igd2h5IHRvIGFueXRoaW5nIGJ1dCBXSFlfTk9ULAorICAgICAgICAgICBhbmQgdGhhdCBubyBvcGVyYXRpb24gdGhhdCBzdWNjZWVkcyBkb2VzIHRoaXMhICovCiAKLQkJLyogY2FzZSBTVE9QX0NPREU6IHRoaXMgaXMgYW4gZXJyb3IhICovCisgICAgICAgIC8qIGNhc2UgU1RPUF9DT0RFOiB0aGlzIGlzIGFuIGVycm9yISAqLwogCi0JCWNhc2UgTk9QOgotCQkJZ290byBmYXN0X25leHRfb3Bjb2RlOworICAgICAgICBjYXNlIE5PUDoKKyAgICAgICAgICAgIGdvdG8gZmFzdF9uZXh0X29wY29kZTsKIAotCQljYXNlIExPQURfRkFTVDoKLQkJCXggPSBHRVRMT0NBTChvcGFyZyk7Ci0JCQlpZiAoeCAhPSBOVUxMKSB7Ci0JCQkJUHlfSU5DUkVGKHgpOwotCQkJCVBVU0goeCk7Ci0JCQkJZ290byBmYXN0X25leHRfb3Bjb2RlOwotCQkJfQotCQkJZm9ybWF0X2V4Y19jaGVja19hcmcoUHlFeGNfVW5ib3VuZExvY2FsRXJyb3IsCi0JCQkJVU5CT1VORExPQ0FMX0VSUk9SX01TRywKLQkJCQlQeVR1cGxlX0dldEl0ZW0oY28tPmNvX3Zhcm5hbWVzLCBvcGFyZykpOwotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgTE9BRF9GQVNUOgorICAgICAgICAgICAgeCA9IEdFVExPQ0FMKG9wYXJnKTsKKyAgICAgICAgICAgIGlmICh4ICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeV9JTkNSRUYoeCk7CisgICAgICAgICAgICAgICAgUFVTSCh4KTsKKyAgICAgICAgICAgICAgICBnb3RvIGZhc3RfbmV4dF9vcGNvZGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3JtYXRfZXhjX2NoZWNrX2FyZyhQeUV4Y19VbmJvdW5kTG9jYWxFcnJvciwKKyAgICAgICAgICAgICAgICBVTkJPVU5ETE9DQUxfRVJST1JfTVNHLAorICAgICAgICAgICAgICAgIFB5VHVwbGVfR2V0SXRlbShjby0+Y29fdmFybmFtZXMsIG9wYXJnKSk7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIExPQURfQ09OU1Q6Ci0JCQl4ID0gR0VUSVRFTShjb25zdHMsIG9wYXJnKTsKLQkJCVB5X0lOQ1JFRih4KTsKLQkJCVBVU0goeCk7Ci0JCQlnb3RvIGZhc3RfbmV4dF9vcGNvZGU7CisgICAgICAgIGNhc2UgTE9BRF9DT05TVDoKKyAgICAgICAgICAgIHggPSBHRVRJVEVNKGNvbnN0cywgb3BhcmcpOworICAgICAgICAgICAgUHlfSU5DUkVGKHgpOworICAgICAgICAgICAgUFVTSCh4KTsKKyAgICAgICAgICAgIGdvdG8gZmFzdF9uZXh0X29wY29kZTsKIAotCQlQUkVESUNURURfV0lUSF9BUkcoU1RPUkVfRkFTVCk7Ci0JCWNhc2UgU1RPUkVfRkFTVDoKLQkJCXYgPSBQT1AoKTsKLQkJCVNFVExPQ0FMKG9wYXJnLCB2KTsKLQkJCWdvdG8gZmFzdF9uZXh0X29wY29kZTsKKyAgICAgICAgUFJFRElDVEVEX1dJVEhfQVJHKFNUT1JFX0ZBU1QpOworICAgICAgICBjYXNlIFNUT1JFX0ZBU1Q6CisgICAgICAgICAgICB2ID0gUE9QKCk7CisgICAgICAgICAgICBTRVRMT0NBTChvcGFyZywgdik7CisgICAgICAgICAgICBnb3RvIGZhc3RfbmV4dF9vcGNvZGU7CiAKLQkJUFJFRElDVEVEKFBPUF9UT1ApOwotCQljYXNlIFBPUF9UT1A6Ci0JCQl2ID0gUE9QKCk7Ci0JCQlQeV9ERUNSRUYodik7Ci0JCQlnb3RvIGZhc3RfbmV4dF9vcGNvZGU7CisgICAgICAgIFBSRURJQ1RFRChQT1BfVE9QKTsKKyAgICAgICAgY2FzZSBQT1BfVE9QOgorICAgICAgICAgICAgdiA9IFBPUCgpOworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgZ290byBmYXN0X25leHRfb3Bjb2RlOwogCi0JCWNhc2UgUk9UX1RXTzoKLQkJCXYgPSBUT1AoKTsKLQkJCXcgPSBTRUNPTkQoKTsKLQkJCVNFVF9UT1Aodyk7Ci0JCQlTRVRfU0VDT05EKHYpOwotCQkJZ290byBmYXN0X25leHRfb3Bjb2RlOworICAgICAgICBjYXNlIFJPVF9UV086CisgICAgICAgICAgICB2ID0gVE9QKCk7CisgICAgICAgICAgICB3ID0gU0VDT05EKCk7CisgICAgICAgICAgICBTRVRfVE9QKHcpOworICAgICAgICAgICAgU0VUX1NFQ09ORCh2KTsKKyAgICAgICAgICAgIGdvdG8gZmFzdF9uZXh0X29wY29kZTsKIAotCQljYXNlIFJPVF9USFJFRToKLQkJCXYgPSBUT1AoKTsKLQkJCXcgPSBTRUNPTkQoKTsKLQkJCXggPSBUSElSRCgpOwotCQkJU0VUX1RPUCh3KTsKLQkJCVNFVF9TRUNPTkQoeCk7Ci0JCQlTRVRfVEhJUkQodik7Ci0JCQlnb3RvIGZhc3RfbmV4dF9vcGNvZGU7CisgICAgICAgIGNhc2UgUk9UX1RIUkVFOgorICAgICAgICAgICAgdiA9IFRPUCgpOworICAgICAgICAgICAgdyA9IFNFQ09ORCgpOworICAgICAgICAgICAgeCA9IFRISVJEKCk7CisgICAgICAgICAgICBTRVRfVE9QKHcpOworICAgICAgICAgICAgU0VUX1NFQ09ORCh4KTsKKyAgICAgICAgICAgIFNFVF9USElSRCh2KTsKKyAgICAgICAgICAgIGdvdG8gZmFzdF9uZXh0X29wY29kZTsKIAotCQljYXNlIFJPVF9GT1VSOgotCQkJdSA9IFRPUCgpOwotCQkJdiA9IFNFQ09ORCgpOwotCQkJdyA9IFRISVJEKCk7Ci0JCQl4ID0gRk9VUlRIKCk7Ci0JCQlTRVRfVE9QKHYpOwotCQkJU0VUX1NFQ09ORCh3KTsKLQkJCVNFVF9USElSRCh4KTsKLQkJCVNFVF9GT1VSVEgodSk7Ci0JCQlnb3RvIGZhc3RfbmV4dF9vcGNvZGU7CisgICAgICAgIGNhc2UgUk9UX0ZPVVI6CisgICAgICAgICAgICB1ID0gVE9QKCk7CisgICAgICAgICAgICB2ID0gU0VDT05EKCk7CisgICAgICAgICAgICB3ID0gVEhJUkQoKTsKKyAgICAgICAgICAgIHggPSBGT1VSVEgoKTsKKyAgICAgICAgICAgIFNFVF9UT1Aodik7CisgICAgICAgICAgICBTRVRfU0VDT05EKHcpOworICAgICAgICAgICAgU0VUX1RISVJEKHgpOworICAgICAgICAgICAgU0VUX0ZPVVJUSCh1KTsKKyAgICAgICAgICAgIGdvdG8gZmFzdF9uZXh0X29wY29kZTsKIAotCQljYXNlIERVUF9UT1A6Ci0JCQl2ID0gVE9QKCk7Ci0JCQlQeV9JTkNSRUYodik7Ci0JCQlQVVNIKHYpOwotCQkJZ290byBmYXN0X25leHRfb3Bjb2RlOworICAgICAgICBjYXNlIERVUF9UT1A6CisgICAgICAgICAgICB2ID0gVE9QKCk7CisgICAgICAgICAgICBQeV9JTkNSRUYodik7CisgICAgICAgICAgICBQVVNIKHYpOworICAgICAgICAgICAgZ290byBmYXN0X25leHRfb3Bjb2RlOwogCi0JCWNhc2UgRFVQX1RPUFg6Ci0JCQlpZiAob3BhcmcgPT0gMikgewotCQkJCXggPSBUT1AoKTsKLQkJCQlQeV9JTkNSRUYoeCk7Ci0JCQkJdyA9IFNFQ09ORCgpOwotCQkJCVB5X0lOQ1JFRih3KTsKLQkJCQlTVEFDS0FESigyKTsKLQkJCQlTRVRfVE9QKHgpOwotCQkJCVNFVF9TRUNPTkQodyk7Ci0JCQkJZ290byBmYXN0X25leHRfb3Bjb2RlOwotCQkJfSBlbHNlIGlmIChvcGFyZyA9PSAzKSB7Ci0JCQkJeCA9IFRPUCgpOwotCQkJCVB5X0lOQ1JFRih4KTsKLQkJCQl3ID0gU0VDT05EKCk7Ci0JCQkJUHlfSU5DUkVGKHcpOwotCQkJCXYgPSBUSElSRCgpOwotCQkJCVB5X0lOQ1JFRih2KTsKLQkJCQlTVEFDS0FESigzKTsKLQkJCQlTRVRfVE9QKHgpOwotCQkJCVNFVF9TRUNPTkQodyk7Ci0JCQkJU0VUX1RISVJEKHYpOwotCQkJCWdvdG8gZmFzdF9uZXh0X29wY29kZTsKLQkJCX0KLQkJCVB5X0ZhdGFsRXJyb3IoImludmFsaWQgYXJndW1lbnQgdG8gRFVQX1RPUFgiCi0JCQkJICAgICAgIiAoYnl0ZWNvZGUgY29ycnVwdGlvbj8pIik7Ci0JCQkvKiBOZXZlciByZXR1cm5zLCBzbyBkb24ndCBib3RoZXIgdG8gc2V0IHdoeS4gKi8KLQkJCWJyZWFrOworICAgICAgICBjYXNlIERVUF9UT1BYOgorICAgICAgICAgICAgaWYgKG9wYXJnID09IDIpIHsKKyAgICAgICAgICAgICAgICB4ID0gVE9QKCk7CisgICAgICAgICAgICAgICAgUHlfSU5DUkVGKHgpOworICAgICAgICAgICAgICAgIHcgPSBTRUNPTkQoKTsKKyAgICAgICAgICAgICAgICBQeV9JTkNSRUYodyk7CisgICAgICAgICAgICAgICAgU1RBQ0tBREooMik7CisgICAgICAgICAgICAgICAgU0VUX1RPUCh4KTsKKyAgICAgICAgICAgICAgICBTRVRfU0VDT05EKHcpOworICAgICAgICAgICAgICAgIGdvdG8gZmFzdF9uZXh0X29wY29kZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAob3BhcmcgPT0gMykgeworICAgICAgICAgICAgICAgIHggPSBUT1AoKTsKKyAgICAgICAgICAgICAgICBQeV9JTkNSRUYoeCk7CisgICAgICAgICAgICAgICAgdyA9IFNFQ09ORCgpOworICAgICAgICAgICAgICAgIFB5X0lOQ1JFRih3KTsKKyAgICAgICAgICAgICAgICB2ID0gVEhJUkQoKTsKKyAgICAgICAgICAgICAgICBQeV9JTkNSRUYodik7CisgICAgICAgICAgICAgICAgU1RBQ0tBREooMyk7CisgICAgICAgICAgICAgICAgU0VUX1RPUCh4KTsKKyAgICAgICAgICAgICAgICBTRVRfU0VDT05EKHcpOworICAgICAgICAgICAgICAgIFNFVF9USElSRCh2KTsKKyAgICAgICAgICAgICAgICBnb3RvIGZhc3RfbmV4dF9vcGNvZGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQeV9GYXRhbEVycm9yKCJpbnZhbGlkIGFyZ3VtZW50IHRvIERVUF9UT1BYIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiIChieXRlY29kZSBjb3JydXB0aW9uPykiKTsKKyAgICAgICAgICAgIC8qIE5ldmVyIHJldHVybnMsIHNvIGRvbid0IGJvdGhlciB0byBzZXQgd2h5LiAqLworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBVTkFSWV9QT1NJVElWRToKLQkJCXYgPSBUT1AoKTsKLQkJCXggPSBQeU51bWJlcl9Qb3NpdGl2ZSh2KTsKLQkJCVB5X0RFQ1JFRih2KTsKLQkJCVNFVF9UT1AoeCk7Ci0JCQlpZiAoeCAhPSBOVUxMKSBjb250aW51ZTsKLQkJCWJyZWFrOworICAgICAgICBjYXNlIFVOQVJZX1BPU0lUSVZFOgorICAgICAgICAgICAgdiA9IFRPUCgpOworICAgICAgICAgICAgeCA9IFB5TnVtYmVyX1Bvc2l0aXZlKHYpOworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgU0VUX1RPUCh4KTsKKyAgICAgICAgICAgIGlmICh4ICE9IE5VTEwpIGNvbnRpbnVlOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBVTkFSWV9ORUdBVElWRToKLQkJCXYgPSBUT1AoKTsKLQkJCXggPSBQeU51bWJlcl9OZWdhdGl2ZSh2KTsKLQkJCVB5X0RFQ1JFRih2KTsKLQkJCVNFVF9UT1AoeCk7Ci0JCQlpZiAoeCAhPSBOVUxMKSBjb250aW51ZTsKLQkJCWJyZWFrOworICAgICAgICBjYXNlIFVOQVJZX05FR0FUSVZFOgorICAgICAgICAgICAgdiA9IFRPUCgpOworICAgICAgICAgICAgeCA9IFB5TnVtYmVyX05lZ2F0aXZlKHYpOworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgU0VUX1RPUCh4KTsKKyAgICAgICAgICAgIGlmICh4ICE9IE5VTEwpIGNvbnRpbnVlOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBVTkFSWV9OT1Q6Ci0JCQl2ID0gVE9QKCk7Ci0JCQllcnIgPSBQeU9iamVjdF9Jc1RydWUodik7Ci0JCQlQeV9ERUNSRUYodik7Ci0JCQlpZiAoZXJyID09IDApIHsKLQkJCQlQeV9JTkNSRUYoUHlfVHJ1ZSk7Ci0JCQkJU0VUX1RPUChQeV9UcnVlKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWVsc2UgaWYgKGVyciA+IDApIHsKLQkJCQlQeV9JTkNSRUYoUHlfRmFsc2UpOwotCQkJCVNFVF9UT1AoUHlfRmFsc2UpOwotCQkJCWVyciA9IDA7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlTVEFDS0FESigtMSk7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBVTkFSWV9OT1Q6CisgICAgICAgICAgICB2ID0gVE9QKCk7CisgICAgICAgICAgICBlcnIgPSBQeU9iamVjdF9Jc1RydWUodik7CisgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICBpZiAoZXJyID09IDApIHsKKyAgICAgICAgICAgICAgICBQeV9JTkNSRUYoUHlfVHJ1ZSk7CisgICAgICAgICAgICAgICAgU0VUX1RPUChQeV9UcnVlKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGVyciA+IDApIHsKKyAgICAgICAgICAgICAgICBQeV9JTkNSRUYoUHlfRmFsc2UpOworICAgICAgICAgICAgICAgIFNFVF9UT1AoUHlfRmFsc2UpOworICAgICAgICAgICAgICAgIGVyciA9IDA7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTVEFDS0FESigtMSk7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIFVOQVJZX0NPTlZFUlQ6Ci0JCQl2ID0gVE9QKCk7Ci0JCQl4ID0gUHlPYmplY3RfUmVwcih2KTsKLQkJCVB5X0RFQ1JFRih2KTsKLQkJCVNFVF9UT1AoeCk7Ci0JCQlpZiAoeCAhPSBOVUxMKSBjb250aW51ZTsKLQkJCWJyZWFrOworICAgICAgICBjYXNlIFVOQVJZX0NPTlZFUlQ6CisgICAgICAgICAgICB2ID0gVE9QKCk7CisgICAgICAgICAgICB4ID0gUHlPYmplY3RfUmVwcih2KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgIFNFVF9UT1AoeCk7CisgICAgICAgICAgICBpZiAoeCAhPSBOVUxMKSBjb250aW51ZTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgVU5BUllfSU5WRVJUOgotCQkJdiA9IFRPUCgpOwotCQkJeCA9IFB5TnVtYmVyX0ludmVydCh2KTsKLQkJCVB5X0RFQ1JFRih2KTsKLQkJCVNFVF9UT1AoeCk7Ci0JCQlpZiAoeCAhPSBOVUxMKSBjb250aW51ZTsKLQkJCWJyZWFrOworICAgICAgICBjYXNlIFVOQVJZX0lOVkVSVDoKKyAgICAgICAgICAgIHYgPSBUT1AoKTsKKyAgICAgICAgICAgIHggPSBQeU51bWJlcl9JbnZlcnQodik7CisgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICBTRVRfVE9QKHgpOworICAgICAgICAgICAgaWYgKHggIT0gTlVMTCkgY29udGludWU7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIEJJTkFSWV9QT1dFUjoKLQkJCXcgPSBQT1AoKTsKLQkJCXYgPSBUT1AoKTsKLQkJCXggPSBQeU51bWJlcl9Qb3dlcih2LCB3LCBQeV9Ob25lKTsKLQkJCVB5X0RFQ1JFRih2KTsKLQkJCVB5X0RFQ1JFRih3KTsKLQkJCVNFVF9UT1AoeCk7Ci0JCQlpZiAoeCAhPSBOVUxMKSBjb250aW51ZTsKLQkJCWJyZWFrOworICAgICAgICBjYXNlIEJJTkFSWV9QT1dFUjoKKyAgICAgICAgICAgIHcgPSBQT1AoKTsKKyAgICAgICAgICAgIHYgPSBUT1AoKTsKKyAgICAgICAgICAgIHggPSBQeU51bWJlcl9Qb3dlcih2LCB3LCBQeV9Ob25lKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih3KTsKKyAgICAgICAgICAgIFNFVF9UT1AoeCk7CisgICAgICAgICAgICBpZiAoeCAhPSBOVUxMKSBjb250aW51ZTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgQklOQVJZX01VTFRJUExZOgotCQkJdyA9IFBPUCgpOwotCQkJdiA9IFRPUCgpOwotCQkJeCA9IFB5TnVtYmVyX011bHRpcGx5KHYsIHcpOwotCQkJUHlfREVDUkVGKHYpOwotCQkJUHlfREVDUkVGKHcpOwotCQkJU0VUX1RPUCh4KTsKLQkJCWlmICh4ICE9IE5VTEwpIGNvbnRpbnVlOwotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgQklOQVJZX01VTFRJUExZOgorICAgICAgICAgICAgdyA9IFBPUCgpOworICAgICAgICAgICAgdiA9IFRPUCgpOworICAgICAgICAgICAgeCA9IFB5TnVtYmVyX011bHRpcGx5KHYsIHcpOworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgUHlfREVDUkVGKHcpOworICAgICAgICAgICAgU0VUX1RPUCh4KTsKKyAgICAgICAgICAgIGlmICh4ICE9IE5VTEwpIGNvbnRpbnVlOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBCSU5BUllfRElWSURFOgotCQkJaWYgKCFfUHlfUW5ld0ZsYWcpIHsKLQkJCQl3ID0gUE9QKCk7Ci0JCQkJdiA9IFRPUCgpOwotCQkJCXggPSBQeU51bWJlcl9EaXZpZGUodiwgdyk7Ci0JCQkJUHlfREVDUkVGKHYpOwotCQkJCVB5X0RFQ1JFRih3KTsKLQkJCQlTRVRfVE9QKHgpOwotCQkJCWlmICh4ICE9IE5VTEwpIGNvbnRpbnVlOwotCQkJCWJyZWFrOwotCQkJfQotCQkJLyogLVFuZXcgaXMgaW4gZWZmZWN0OglmYWxsIHRocm91Z2ggdG8KLQkJCSAgIEJJTkFSWV9UUlVFX0RJVklERSAqLwotCQljYXNlIEJJTkFSWV9UUlVFX0RJVklERToKLQkJCXcgPSBQT1AoKTsKLQkJCXYgPSBUT1AoKTsKLQkJCXggPSBQeU51bWJlcl9UcnVlRGl2aWRlKHYsIHcpOwotCQkJUHlfREVDUkVGKHYpOwotCQkJUHlfREVDUkVGKHcpOwotCQkJU0VUX1RPUCh4KTsKLQkJCWlmICh4ICE9IE5VTEwpIGNvbnRpbnVlOwotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgQklOQVJZX0RJVklERToKKyAgICAgICAgICAgIGlmICghX1B5X1FuZXdGbGFnKSB7CisgICAgICAgICAgICAgICAgdyA9IFBPUCgpOworICAgICAgICAgICAgICAgIHYgPSBUT1AoKTsKKyAgICAgICAgICAgICAgICB4ID0gUHlOdW1iZXJfRGl2aWRlKHYsIHcpOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYodyk7CisgICAgICAgICAgICAgICAgU0VUX1RPUCh4KTsKKyAgICAgICAgICAgICAgICBpZiAoeCAhPSBOVUxMKSBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIC1RbmV3IGlzIGluIGVmZmVjdDogICAgICAgICAgICAgIGZhbGwgdGhyb3VnaCB0bworICAgICAgICAgICAgICAgQklOQVJZX1RSVUVfRElWSURFICovCisgICAgICAgIGNhc2UgQklOQVJZX1RSVUVfRElWSURFOgorICAgICAgICAgICAgdyA9IFBPUCgpOworICAgICAgICAgICAgdiA9IFRPUCgpOworICAgICAgICAgICAgeCA9IFB5TnVtYmVyX1RydWVEaXZpZGUodiwgdyk7CisgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICBQeV9ERUNSRUYodyk7CisgICAgICAgICAgICBTRVRfVE9QKHgpOworICAgICAgICAgICAgaWYgKHggIT0gTlVMTCkgY29udGludWU7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIEJJTkFSWV9GTE9PUl9ESVZJREU6Ci0JCQl3ID0gUE9QKCk7Ci0JCQl2ID0gVE9QKCk7Ci0JCQl4ID0gUHlOdW1iZXJfRmxvb3JEaXZpZGUodiwgdyk7Ci0JCQlQeV9ERUNSRUYodik7Ci0JCQlQeV9ERUNSRUYodyk7Ci0JCQlTRVRfVE9QKHgpOwotCQkJaWYgKHggIT0gTlVMTCkgY29udGludWU7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBCSU5BUllfRkxPT1JfRElWSURFOgorICAgICAgICAgICAgdyA9IFBPUCgpOworICAgICAgICAgICAgdiA9IFRPUCgpOworICAgICAgICAgICAgeCA9IFB5TnVtYmVyX0Zsb29yRGl2aWRlKHYsIHcpOworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgUHlfREVDUkVGKHcpOworICAgICAgICAgICAgU0VUX1RPUCh4KTsKKyAgICAgICAgICAgIGlmICh4ICE9IE5VTEwpIGNvbnRpbnVlOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBCSU5BUllfTU9EVUxPOgotCQkJdyA9IFBPUCgpOwotCQkJdiA9IFRPUCgpOwotCQkJeCA9IFB5TnVtYmVyX1JlbWFpbmRlcih2LCB3KTsKLQkJCVB5X0RFQ1JFRih2KTsKLQkJCVB5X0RFQ1JFRih3KTsKLQkJCVNFVF9UT1AoeCk7Ci0JCQlpZiAoeCAhPSBOVUxMKSBjb250aW51ZTsKLQkJCWJyZWFrOworICAgICAgICBjYXNlIEJJTkFSWV9NT0RVTE86CisgICAgICAgICAgICB3ID0gUE9QKCk7CisgICAgICAgICAgICB2ID0gVE9QKCk7CisgICAgICAgICAgICB4ID0gUHlOdW1iZXJfUmVtYWluZGVyKHYsIHcpOworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgUHlfREVDUkVGKHcpOworICAgICAgICAgICAgU0VUX1RPUCh4KTsKKyAgICAgICAgICAgIGlmICh4ICE9IE5VTEwpIGNvbnRpbnVlOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBCSU5BUllfQUREOgotCQkJdyA9IFBPUCgpOwotCQkJdiA9IFRPUCgpOwotCQkJaWYgKFB5SW50X0NoZWNrRXhhY3QodikgJiYgUHlJbnRfQ2hlY2tFeGFjdCh3KSkgewotCQkJCS8qIElOTElORTogaW50ICsgaW50ICovCi0JCQkJcmVnaXN0ZXIgbG9uZyBhLCBiLCBpOwotCQkJCWEgPSBQeUludF9BU19MT05HKHYpOwotCQkJCWIgPSBQeUludF9BU19MT05HKHcpOwotCQkJCS8qIGNhc3QgdG8gYXZvaWQgdW5kZWZpbmVkIGJlaGF2aW91cgotCQkJCSAgIG9uIG92ZXJmbG93ICovCi0JCQkJaSA9IChsb25nKSgodW5zaWduZWQgbG9uZylhICsgYik7Ci0JCQkJaWYgKChpXmEpIDwgMCAmJiAoaV5iKSA8IDApCi0JCQkJCWdvdG8gc2xvd19hZGQ7Ci0JCQkJeCA9IFB5SW50X0Zyb21Mb25nKGkpOwotCQkJfQotCQkJZWxzZSBpZiAoUHlTdHJpbmdfQ2hlY2tFeGFjdCh2KSAmJgotCQkJCSBQeVN0cmluZ19DaGVja0V4YWN0KHcpKSB7Ci0JCQkJeCA9IHN0cmluZ19jb25jYXRlbmF0ZSh2LCB3LCBmLCBuZXh0X2luc3RyKTsKLQkJCQkvKiBzdHJpbmdfY29uY2F0ZW5hdGUgY29uc3VtZWQgdGhlIHJlZiB0byB2ICovCi0JCQkJZ290byBza2lwX2RlY3JlZl92eDsKLQkJCX0KLQkJCWVsc2UgewotCQkJICBzbG93X2FkZDoKLQkJCQl4ID0gUHlOdW1iZXJfQWRkKHYsIHcpOwotCQkJfQotCQkJUHlfREVDUkVGKHYpOwotCQkgIHNraXBfZGVjcmVmX3Z4OgotCQkJUHlfREVDUkVGKHcpOwotCQkJU0VUX1RPUCh4KTsKLQkJCWlmICh4ICE9IE5VTEwpIGNvbnRpbnVlOwotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgQklOQVJZX0FERDoKKyAgICAgICAgICAgIHcgPSBQT1AoKTsKKyAgICAgICAgICAgIHYgPSBUT1AoKTsKKyAgICAgICAgICAgIGlmIChQeUludF9DaGVja0V4YWN0KHYpICYmIFB5SW50X0NoZWNrRXhhY3QodykpIHsKKyAgICAgICAgICAgICAgICAvKiBJTkxJTkU6IGludCArIGludCAqLworICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGxvbmcgYSwgYiwgaTsKKyAgICAgICAgICAgICAgICBhID0gUHlJbnRfQVNfTE9ORyh2KTsKKyAgICAgICAgICAgICAgICBiID0gUHlJbnRfQVNfTE9ORyh3KTsKKyAgICAgICAgICAgICAgICAvKiBjYXN0IHRvIGF2b2lkIHVuZGVmaW5lZCBiZWhhdmlvdXIKKyAgICAgICAgICAgICAgICAgICBvbiBvdmVyZmxvdyAqLworICAgICAgICAgICAgICAgIGkgPSAobG9uZykoKHVuc2lnbmVkIGxvbmcpYSArIGIpOworICAgICAgICAgICAgICAgIGlmICgoaV5hKSA8IDAgJiYgKGleYikgPCAwKQorICAgICAgICAgICAgICAgICAgICBnb3RvIHNsb3dfYWRkOworICAgICAgICAgICAgICAgIHggPSBQeUludF9Gcm9tTG9uZyhpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKFB5U3RyaW5nX0NoZWNrRXhhY3QodikgJiYKKyAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0NoZWNrRXhhY3QodykpIHsKKyAgICAgICAgICAgICAgICB4ID0gc3RyaW5nX2NvbmNhdGVuYXRlKHYsIHcsIGYsIG5leHRfaW5zdHIpOworICAgICAgICAgICAgICAgIC8qIHN0cmluZ19jb25jYXRlbmF0ZSBjb25zdW1lZCB0aGUgcmVmIHRvIHYgKi8KKyAgICAgICAgICAgICAgICBnb3RvIHNraXBfZGVjcmVmX3Z4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgIHNsb3dfYWRkOgorICAgICAgICAgICAgICAgIHggPSBQeU51bWJlcl9BZGQodiwgdyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgc2tpcF9kZWNyZWZfdng6CisgICAgICAgICAgICBQeV9ERUNSRUYodyk7CisgICAgICAgICAgICBTRVRfVE9QKHgpOworICAgICAgICAgICAgaWYgKHggIT0gTlVMTCkgY29udGludWU7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIEJJTkFSWV9TVUJUUkFDVDoKLQkJCXcgPSBQT1AoKTsKLQkJCXYgPSBUT1AoKTsKLQkJCWlmIChQeUludF9DaGVja0V4YWN0KHYpICYmIFB5SW50X0NoZWNrRXhhY3QodykpIHsKLQkJCQkvKiBJTkxJTkU6IGludCAtIGludCAqLwotCQkJCXJlZ2lzdGVyIGxvbmcgYSwgYiwgaTsKLQkJCQlhID0gUHlJbnRfQVNfTE9ORyh2KTsKLQkJCQliID0gUHlJbnRfQVNfTE9ORyh3KTsKLQkJCQkvKiBjYXN0IHRvIGF2b2lkIHVuZGVmaW5lZCBiZWhhdmlvdXIKLQkJCQkgICBvbiBvdmVyZmxvdyAqLwotCQkJCWkgPSAobG9uZykoKHVuc2lnbmVkIGxvbmcpYSAtIGIpOwotCQkJCWlmICgoaV5hKSA8IDAgJiYgKGlefmIpIDwgMCkKLQkJCQkJZ290byBzbG93X3N1YjsKLQkJCQl4ID0gUHlJbnRfRnJvbUxvbmcoaSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCSAgc2xvd19zdWI6Ci0JCQkJeCA9IFB5TnVtYmVyX1N1YnRyYWN0KHYsIHcpOwotCQkJfQotCQkJUHlfREVDUkVGKHYpOwotCQkJUHlfREVDUkVGKHcpOwotCQkJU0VUX1RPUCh4KTsKLQkJCWlmICh4ICE9IE5VTEwpIGNvbnRpbnVlOwotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgQklOQVJZX1NVQlRSQUNUOgorICAgICAgICAgICAgdyA9IFBPUCgpOworICAgICAgICAgICAgdiA9IFRPUCgpOworICAgICAgICAgICAgaWYgKFB5SW50X0NoZWNrRXhhY3QodikgJiYgUHlJbnRfQ2hlY2tFeGFjdCh3KSkgeworICAgICAgICAgICAgICAgIC8qIElOTElORTogaW50IC0gaW50ICovCisgICAgICAgICAgICAgICAgcmVnaXN0ZXIgbG9uZyBhLCBiLCBpOworICAgICAgICAgICAgICAgIGEgPSBQeUludF9BU19MT05HKHYpOworICAgICAgICAgICAgICAgIGIgPSBQeUludF9BU19MT05HKHcpOworICAgICAgICAgICAgICAgIC8qIGNhc3QgdG8gYXZvaWQgdW5kZWZpbmVkIGJlaGF2aW91cgorICAgICAgICAgICAgICAgICAgIG9uIG92ZXJmbG93ICovCisgICAgICAgICAgICAgICAgaSA9IChsb25nKSgodW5zaWduZWQgbG9uZylhIC0gYik7CisgICAgICAgICAgICAgICAgaWYgKChpXmEpIDwgMCAmJiAoaV5+YikgPCAwKQorICAgICAgICAgICAgICAgICAgICBnb3RvIHNsb3dfc3ViOworICAgICAgICAgICAgICAgIHggPSBQeUludF9Gcm9tTG9uZyhpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICBzbG93X3N1YjoKKyAgICAgICAgICAgICAgICB4ID0gUHlOdW1iZXJfU3VidHJhY3Qodiwgdyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICBQeV9ERUNSRUYodyk7CisgICAgICAgICAgICBTRVRfVE9QKHgpOworICAgICAgICAgICAgaWYgKHggIT0gTlVMTCkgY29udGludWU7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIEJJTkFSWV9TVUJTQ1I6Ci0JCQl3ID0gUE9QKCk7Ci0JCQl2ID0gVE9QKCk7Ci0JCQlpZiAoUHlMaXN0X0NoZWNrRXhhY3QodikgJiYgUHlJbnRfQ2hlY2tFeGFjdCh3KSkgewotCQkJCS8qIElOTElORTogbGlzdFtpbnRdICovCi0JCQkJUHlfc3NpemVfdCBpID0gUHlJbnRfQXNTc2l6ZV90KHcpOwotCQkJCWlmIChpIDwgMCkKLQkJCQkJaSArPSBQeUxpc3RfR0VUX1NJWkUodik7Ci0JCQkJaWYgKGkgPj0gMCAmJiBpIDwgUHlMaXN0X0dFVF9TSVpFKHYpKSB7Ci0JCQkJCXggPSBQeUxpc3RfR0VUX0lURU0odiwgaSk7Ci0JCQkJCVB5X0lOQ1JFRih4KTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCQlnb3RvIHNsb3dfZ2V0OwotCQkJfQotCQkJZWxzZQotCQkJICBzbG93X2dldDoKLQkJCQl4ID0gUHlPYmplY3RfR2V0SXRlbSh2LCB3KTsKLQkJCVB5X0RFQ1JFRih2KTsKLQkJCVB5X0RFQ1JFRih3KTsKLQkJCVNFVF9UT1AoeCk7Ci0JCQlpZiAoeCAhPSBOVUxMKSBjb250aW51ZTsKLQkJCWJyZWFrOworICAgICAgICBjYXNlIEJJTkFSWV9TVUJTQ1I6CisgICAgICAgICAgICB3ID0gUE9QKCk7CisgICAgICAgICAgICB2ID0gVE9QKCk7CisgICAgICAgICAgICBpZiAoUHlMaXN0X0NoZWNrRXhhY3QodikgJiYgUHlJbnRfQ2hlY2tFeGFjdCh3KSkgeworICAgICAgICAgICAgICAgIC8qIElOTElORTogbGlzdFtpbnRdICovCisgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBpID0gUHlJbnRfQXNTc2l6ZV90KHcpOworICAgICAgICAgICAgICAgIGlmIChpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgaSArPSBQeUxpc3RfR0VUX1NJWkUodik7CisgICAgICAgICAgICAgICAgaWYgKGkgPj0gMCAmJiBpIDwgUHlMaXN0X0dFVF9TSVpFKHYpKSB7CisgICAgICAgICAgICAgICAgICAgIHggPSBQeUxpc3RfR0VUX0lURU0odiwgaSk7CisgICAgICAgICAgICAgICAgICAgIFB5X0lOQ1JFRih4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBnb3RvIHNsb3dfZ2V0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBzbG93X2dldDoKKyAgICAgICAgICAgICAgICB4ID0gUHlPYmplY3RfR2V0SXRlbSh2LCB3KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih3KTsKKyAgICAgICAgICAgIFNFVF9UT1AoeCk7CisgICAgICAgICAgICBpZiAoeCAhPSBOVUxMKSBjb250aW51ZTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgQklOQVJZX0xTSElGVDoKLQkJCXcgPSBQT1AoKTsKLQkJCXYgPSBUT1AoKTsKLQkJCXggPSBQeU51bWJlcl9Mc2hpZnQodiwgdyk7Ci0JCQlQeV9ERUNSRUYodik7Ci0JCQlQeV9ERUNSRUYodyk7Ci0JCQlTRVRfVE9QKHgpOwotCQkJaWYgKHggIT0gTlVMTCkgY29udGludWU7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBCSU5BUllfTFNISUZUOgorICAgICAgICAgICAgdyA9IFBPUCgpOworICAgICAgICAgICAgdiA9IFRPUCgpOworICAgICAgICAgICAgeCA9IFB5TnVtYmVyX0xzaGlmdCh2LCB3KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih3KTsKKyAgICAgICAgICAgIFNFVF9UT1AoeCk7CisgICAgICAgICAgICBpZiAoeCAhPSBOVUxMKSBjb250aW51ZTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgQklOQVJZX1JTSElGVDoKLQkJCXcgPSBQT1AoKTsKLQkJCXYgPSBUT1AoKTsKLQkJCXggPSBQeU51bWJlcl9Sc2hpZnQodiwgdyk7Ci0JCQlQeV9ERUNSRUYodik7Ci0JCQlQeV9ERUNSRUYodyk7Ci0JCQlTRVRfVE9QKHgpOwotCQkJaWYgKHggIT0gTlVMTCkgY29udGludWU7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBCSU5BUllfUlNISUZUOgorICAgICAgICAgICAgdyA9IFBPUCgpOworICAgICAgICAgICAgdiA9IFRPUCgpOworICAgICAgICAgICAgeCA9IFB5TnVtYmVyX1JzaGlmdCh2LCB3KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih3KTsKKyAgICAgICAgICAgIFNFVF9UT1AoeCk7CisgICAgICAgICAgICBpZiAoeCAhPSBOVUxMKSBjb250aW51ZTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgQklOQVJZX0FORDoKLQkJCXcgPSBQT1AoKTsKLQkJCXYgPSBUT1AoKTsKLQkJCXggPSBQeU51bWJlcl9BbmQodiwgdyk7Ci0JCQlQeV9ERUNSRUYodik7Ci0JCQlQeV9ERUNSRUYodyk7Ci0JCQlTRVRfVE9QKHgpOwotCQkJaWYgKHggIT0gTlVMTCkgY29udGludWU7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBCSU5BUllfQU5EOgorICAgICAgICAgICAgdyA9IFBPUCgpOworICAgICAgICAgICAgdiA9IFRPUCgpOworICAgICAgICAgICAgeCA9IFB5TnVtYmVyX0FuZCh2LCB3KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih3KTsKKyAgICAgICAgICAgIFNFVF9UT1AoeCk7CisgICAgICAgICAgICBpZiAoeCAhPSBOVUxMKSBjb250aW51ZTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgQklOQVJZX1hPUjoKLQkJCXcgPSBQT1AoKTsKLQkJCXYgPSBUT1AoKTsKLQkJCXggPSBQeU51bWJlcl9Yb3Iodiwgdyk7Ci0JCQlQeV9ERUNSRUYodik7Ci0JCQlQeV9ERUNSRUYodyk7Ci0JCQlTRVRfVE9QKHgpOwotCQkJaWYgKHggIT0gTlVMTCkgY29udGludWU7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBCSU5BUllfWE9SOgorICAgICAgICAgICAgdyA9IFBPUCgpOworICAgICAgICAgICAgdiA9IFRPUCgpOworICAgICAgICAgICAgeCA9IFB5TnVtYmVyX1hvcih2LCB3KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih3KTsKKyAgICAgICAgICAgIFNFVF9UT1AoeCk7CisgICAgICAgICAgICBpZiAoeCAhPSBOVUxMKSBjb250aW51ZTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgQklOQVJZX09SOgotCQkJdyA9IFBPUCgpOwotCQkJdiA9IFRPUCgpOwotCQkJeCA9IFB5TnVtYmVyX09yKHYsIHcpOwotCQkJUHlfREVDUkVGKHYpOwotCQkJUHlfREVDUkVGKHcpOwotCQkJU0VUX1RPUCh4KTsKLQkJCWlmICh4ICE9IE5VTEwpIGNvbnRpbnVlOwotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgQklOQVJZX09SOgorICAgICAgICAgICAgdyA9IFBPUCgpOworICAgICAgICAgICAgdiA9IFRPUCgpOworICAgICAgICAgICAgeCA9IFB5TnVtYmVyX09yKHYsIHcpOworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgUHlfREVDUkVGKHcpOworICAgICAgICAgICAgU0VUX1RPUCh4KTsKKyAgICAgICAgICAgIGlmICh4ICE9IE5VTEwpIGNvbnRpbnVlOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBMSVNUX0FQUEVORDoKLQkJCXcgPSBQT1AoKTsKLQkJCXYgPSBQT1AoKTsKLQkJCWVyciA9IFB5TGlzdF9BcHBlbmQodiwgdyk7Ci0JCQlQeV9ERUNSRUYodik7Ci0JCQlQeV9ERUNSRUYodyk7Ci0JCQlpZiAoZXJyID09IDApIHsKLQkJCQlQUkVESUNUKEpVTVBfQUJTT0xVVEUpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgTElTVF9BUFBFTkQ6CisgICAgICAgICAgICB3ID0gUE9QKCk7CisgICAgICAgICAgICB2ID0gUE9QKCk7CisgICAgICAgICAgICBlcnIgPSBQeUxpc3RfQXBwZW5kKHYsIHcpOworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgUHlfREVDUkVGKHcpOworICAgICAgICAgICAgaWYgKGVyciA9PSAwKSB7CisgICAgICAgICAgICAgICAgUFJFRElDVChKVU1QX0FCU09MVVRFKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgSU5QTEFDRV9QT1dFUjoKLQkJCXcgPSBQT1AoKTsKLQkJCXYgPSBUT1AoKTsKLQkJCXggPSBQeU51bWJlcl9JblBsYWNlUG93ZXIodiwgdywgUHlfTm9uZSk7Ci0JCQlQeV9ERUNSRUYodik7Ci0JCQlQeV9ERUNSRUYodyk7Ci0JCQlTRVRfVE9QKHgpOwotCQkJaWYgKHggIT0gTlVMTCkgY29udGludWU7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBJTlBMQUNFX1BPV0VSOgorICAgICAgICAgICAgdyA9IFBPUCgpOworICAgICAgICAgICAgdiA9IFRPUCgpOworICAgICAgICAgICAgeCA9IFB5TnVtYmVyX0luUGxhY2VQb3dlcih2LCB3LCBQeV9Ob25lKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih3KTsKKyAgICAgICAgICAgIFNFVF9UT1AoeCk7CisgICAgICAgICAgICBpZiAoeCAhPSBOVUxMKSBjb250aW51ZTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgSU5QTEFDRV9NVUxUSVBMWToKLQkJCXcgPSBQT1AoKTsKLQkJCXYgPSBUT1AoKTsKLQkJCXggPSBQeU51bWJlcl9JblBsYWNlTXVsdGlwbHkodiwgdyk7Ci0JCQlQeV9ERUNSRUYodik7Ci0JCQlQeV9ERUNSRUYodyk7Ci0JCQlTRVRfVE9QKHgpOwotCQkJaWYgKHggIT0gTlVMTCkgY29udGludWU7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBJTlBMQUNFX01VTFRJUExZOgorICAgICAgICAgICAgdyA9IFBPUCgpOworICAgICAgICAgICAgdiA9IFRPUCgpOworICAgICAgICAgICAgeCA9IFB5TnVtYmVyX0luUGxhY2VNdWx0aXBseSh2LCB3KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih3KTsKKyAgICAgICAgICAgIFNFVF9UT1AoeCk7CisgICAgICAgICAgICBpZiAoeCAhPSBOVUxMKSBjb250aW51ZTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgSU5QTEFDRV9ESVZJREU6Ci0JCQlpZiAoIV9QeV9RbmV3RmxhZykgewotCQkJCXcgPSBQT1AoKTsKLQkJCQl2ID0gVE9QKCk7Ci0JCQkJeCA9IFB5TnVtYmVyX0luUGxhY2VEaXZpZGUodiwgdyk7Ci0JCQkJUHlfREVDUkVGKHYpOwotCQkJCVB5X0RFQ1JFRih3KTsKLQkJCQlTRVRfVE9QKHgpOwotCQkJCWlmICh4ICE9IE5VTEwpIGNvbnRpbnVlOwotCQkJCWJyZWFrOwotCQkJfQotCQkJLyogLVFuZXcgaXMgaW4gZWZmZWN0OglmYWxsIHRocm91Z2ggdG8KLQkJCSAgIElOUExBQ0VfVFJVRV9ESVZJREUgKi8KLQkJY2FzZSBJTlBMQUNFX1RSVUVfRElWSURFOgotCQkJdyA9IFBPUCgpOwotCQkJdiA9IFRPUCgpOwotCQkJeCA9IFB5TnVtYmVyX0luUGxhY2VUcnVlRGl2aWRlKHYsIHcpOwotCQkJUHlfREVDUkVGKHYpOwotCQkJUHlfREVDUkVGKHcpOwotCQkJU0VUX1RPUCh4KTsKLQkJCWlmICh4ICE9IE5VTEwpIGNvbnRpbnVlOwotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgSU5QTEFDRV9ESVZJREU6CisgICAgICAgICAgICBpZiAoIV9QeV9RbmV3RmxhZykgeworICAgICAgICAgICAgICAgIHcgPSBQT1AoKTsKKyAgICAgICAgICAgICAgICB2ID0gVE9QKCk7CisgICAgICAgICAgICAgICAgeCA9IFB5TnVtYmVyX0luUGxhY2VEaXZpZGUodiwgdyk7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih3KTsKKyAgICAgICAgICAgICAgICBTRVRfVE9QKHgpOworICAgICAgICAgICAgICAgIGlmICh4ICE9IE5VTEwpIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogLVFuZXcgaXMgaW4gZWZmZWN0OiAgICAgICAgICAgICAgZmFsbCB0aHJvdWdoIHRvCisgICAgICAgICAgICAgICBJTlBMQUNFX1RSVUVfRElWSURFICovCisgICAgICAgIGNhc2UgSU5QTEFDRV9UUlVFX0RJVklERToKKyAgICAgICAgICAgIHcgPSBQT1AoKTsKKyAgICAgICAgICAgIHYgPSBUT1AoKTsKKyAgICAgICAgICAgIHggPSBQeU51bWJlcl9JblBsYWNlVHJ1ZURpdmlkZSh2LCB3KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih3KTsKKyAgICAgICAgICAgIFNFVF9UT1AoeCk7CisgICAgICAgICAgICBpZiAoeCAhPSBOVUxMKSBjb250aW51ZTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgSU5QTEFDRV9GTE9PUl9ESVZJREU6Ci0JCQl3ID0gUE9QKCk7Ci0JCQl2ID0gVE9QKCk7Ci0JCQl4ID0gUHlOdW1iZXJfSW5QbGFjZUZsb29yRGl2aWRlKHYsIHcpOwotCQkJUHlfREVDUkVGKHYpOwotCQkJUHlfREVDUkVGKHcpOwotCQkJU0VUX1RPUCh4KTsKLQkJCWlmICh4ICE9IE5VTEwpIGNvbnRpbnVlOwotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgSU5QTEFDRV9GTE9PUl9ESVZJREU6CisgICAgICAgICAgICB3ID0gUE9QKCk7CisgICAgICAgICAgICB2ID0gVE9QKCk7CisgICAgICAgICAgICB4ID0gUHlOdW1iZXJfSW5QbGFjZUZsb29yRGl2aWRlKHYsIHcpOworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgUHlfREVDUkVGKHcpOworICAgICAgICAgICAgU0VUX1RPUCh4KTsKKyAgICAgICAgICAgIGlmICh4ICE9IE5VTEwpIGNvbnRpbnVlOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBJTlBMQUNFX01PRFVMTzoKLQkJCXcgPSBQT1AoKTsKLQkJCXYgPSBUT1AoKTsKLQkJCXggPSBQeU51bWJlcl9JblBsYWNlUmVtYWluZGVyKHYsIHcpOwotCQkJUHlfREVDUkVGKHYpOwotCQkJUHlfREVDUkVGKHcpOwotCQkJU0VUX1RPUCh4KTsKLQkJCWlmICh4ICE9IE5VTEwpIGNvbnRpbnVlOwotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgSU5QTEFDRV9NT0RVTE86CisgICAgICAgICAgICB3ID0gUE9QKCk7CisgICAgICAgICAgICB2ID0gVE9QKCk7CisgICAgICAgICAgICB4ID0gUHlOdW1iZXJfSW5QbGFjZVJlbWFpbmRlcih2LCB3KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih3KTsKKyAgICAgICAgICAgIFNFVF9UT1AoeCk7CisgICAgICAgICAgICBpZiAoeCAhPSBOVUxMKSBjb250aW51ZTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgSU5QTEFDRV9BREQ6Ci0JCQl3ID0gUE9QKCk7Ci0JCQl2ID0gVE9QKCk7Ci0JCQlpZiAoUHlJbnRfQ2hlY2tFeGFjdCh2KSAmJiBQeUludF9DaGVja0V4YWN0KHcpKSB7Ci0JCQkJLyogSU5MSU5FOiBpbnQgKyBpbnQgKi8KLQkJCQlyZWdpc3RlciBsb25nIGEsIGIsIGk7Ci0JCQkJYSA9IFB5SW50X0FTX0xPTkcodik7Ci0JCQkJYiA9IFB5SW50X0FTX0xPTkcodyk7Ci0JCQkJaSA9IGEgKyBiOwotCQkJCWlmICgoaV5hKSA8IDAgJiYgKGleYikgPCAwKQotCQkJCQlnb3RvIHNsb3dfaWFkZDsKLQkJCQl4ID0gUHlJbnRfRnJvbUxvbmcoaSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChQeVN0cmluZ19DaGVja0V4YWN0KHYpICYmCi0JCQkJIFB5U3RyaW5nX0NoZWNrRXhhY3QodykpIHsKLQkJCQl4ID0gc3RyaW5nX2NvbmNhdGVuYXRlKHYsIHcsIGYsIG5leHRfaW5zdHIpOwotCQkJCS8qIHN0cmluZ19jb25jYXRlbmF0ZSBjb25zdW1lZCB0aGUgcmVmIHRvIHYgKi8KLQkJCQlnb3RvIHNraXBfZGVjcmVmX3Y7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCSAgc2xvd19pYWRkOgotCQkJCXggPSBQeU51bWJlcl9JblBsYWNlQWRkKHYsIHcpOwotCQkJfQotCQkJUHlfREVDUkVGKHYpOwotCQkgIHNraXBfZGVjcmVmX3Y6Ci0JCQlQeV9ERUNSRUYodyk7Ci0JCQlTRVRfVE9QKHgpOwotCQkJaWYgKHggIT0gTlVMTCkgY29udGludWU7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBJTlBMQUNFX0FERDoKKyAgICAgICAgICAgIHcgPSBQT1AoKTsKKyAgICAgICAgICAgIHYgPSBUT1AoKTsKKyAgICAgICAgICAgIGlmIChQeUludF9DaGVja0V4YWN0KHYpICYmIFB5SW50X0NoZWNrRXhhY3QodykpIHsKKyAgICAgICAgICAgICAgICAvKiBJTkxJTkU6IGludCArIGludCAqLworICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGxvbmcgYSwgYiwgaTsKKyAgICAgICAgICAgICAgICBhID0gUHlJbnRfQVNfTE9ORyh2KTsKKyAgICAgICAgICAgICAgICBiID0gUHlJbnRfQVNfTE9ORyh3KTsKKyAgICAgICAgICAgICAgICBpID0gYSArIGI7CisgICAgICAgICAgICAgICAgaWYgKChpXmEpIDwgMCAmJiAoaV5iKSA8IDApCisgICAgICAgICAgICAgICAgICAgIGdvdG8gc2xvd19pYWRkOworICAgICAgICAgICAgICAgIHggPSBQeUludF9Gcm9tTG9uZyhpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKFB5U3RyaW5nX0NoZWNrRXhhY3QodikgJiYKKyAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0NoZWNrRXhhY3QodykpIHsKKyAgICAgICAgICAgICAgICB4ID0gc3RyaW5nX2NvbmNhdGVuYXRlKHYsIHcsIGYsIG5leHRfaW5zdHIpOworICAgICAgICAgICAgICAgIC8qIHN0cmluZ19jb25jYXRlbmF0ZSBjb25zdW1lZCB0aGUgcmVmIHRvIHYgKi8KKyAgICAgICAgICAgICAgICBnb3RvIHNraXBfZGVjcmVmX3Y7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgc2xvd19pYWRkOgorICAgICAgICAgICAgICAgIHggPSBQeU51bWJlcl9JblBsYWNlQWRkKHYsIHcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgIHNraXBfZGVjcmVmX3Y6CisgICAgICAgICAgICBQeV9ERUNSRUYodyk7CisgICAgICAgICAgICBTRVRfVE9QKHgpOworICAgICAgICAgICAgaWYgKHggIT0gTlVMTCkgY29udGludWU7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIElOUExBQ0VfU1VCVFJBQ1Q6Ci0JCQl3ID0gUE9QKCk7Ci0JCQl2ID0gVE9QKCk7Ci0JCQlpZiAoUHlJbnRfQ2hlY2tFeGFjdCh2KSAmJiBQeUludF9DaGVja0V4YWN0KHcpKSB7Ci0JCQkJLyogSU5MSU5FOiBpbnQgLSBpbnQgKi8KLQkJCQlyZWdpc3RlciBsb25nIGEsIGIsIGk7Ci0JCQkJYSA9IFB5SW50X0FTX0xPTkcodik7Ci0JCQkJYiA9IFB5SW50X0FTX0xPTkcodyk7Ci0JCQkJaSA9IGEgLSBiOwotCQkJCWlmICgoaV5hKSA8IDAgJiYgKGlefmIpIDwgMCkKLQkJCQkJZ290byBzbG93X2lzdWI7Ci0JCQkJeCA9IFB5SW50X0Zyb21Mb25nKGkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkgIHNsb3dfaXN1YjoKLQkJCQl4ID0gUHlOdW1iZXJfSW5QbGFjZVN1YnRyYWN0KHYsIHcpOwotCQkJfQotCQkJUHlfREVDUkVGKHYpOwotCQkJUHlfREVDUkVGKHcpOwotCQkJU0VUX1RPUCh4KTsKLQkJCWlmICh4ICE9IE5VTEwpIGNvbnRpbnVlOwotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgSU5QTEFDRV9TVUJUUkFDVDoKKyAgICAgICAgICAgIHcgPSBQT1AoKTsKKyAgICAgICAgICAgIHYgPSBUT1AoKTsKKyAgICAgICAgICAgIGlmIChQeUludF9DaGVja0V4YWN0KHYpICYmIFB5SW50X0NoZWNrRXhhY3QodykpIHsKKyAgICAgICAgICAgICAgICAvKiBJTkxJTkU6IGludCAtIGludCAqLworICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGxvbmcgYSwgYiwgaTsKKyAgICAgICAgICAgICAgICBhID0gUHlJbnRfQVNfTE9ORyh2KTsKKyAgICAgICAgICAgICAgICBiID0gUHlJbnRfQVNfTE9ORyh3KTsKKyAgICAgICAgICAgICAgICBpID0gYSAtIGI7CisgICAgICAgICAgICAgICAgaWYgKChpXmEpIDwgMCAmJiAoaV5+YikgPCAwKQorICAgICAgICAgICAgICAgICAgICBnb3RvIHNsb3dfaXN1YjsKKyAgICAgICAgICAgICAgICB4ID0gUHlJbnRfRnJvbUxvbmcoaSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgc2xvd19pc3ViOgorICAgICAgICAgICAgICAgIHggPSBQeU51bWJlcl9JblBsYWNlU3VidHJhY3Qodiwgdyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICBQeV9ERUNSRUYodyk7CisgICAgICAgICAgICBTRVRfVE9QKHgpOworICAgICAgICAgICAgaWYgKHggIT0gTlVMTCkgY29udGludWU7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIElOUExBQ0VfTFNISUZUOgotCQkJdyA9IFBPUCgpOwotCQkJdiA9IFRPUCgpOwotCQkJeCA9IFB5TnVtYmVyX0luUGxhY2VMc2hpZnQodiwgdyk7Ci0JCQlQeV9ERUNSRUYodik7Ci0JCQlQeV9ERUNSRUYodyk7Ci0JCQlTRVRfVE9QKHgpOwotCQkJaWYgKHggIT0gTlVMTCkgY29udGludWU7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBJTlBMQUNFX0xTSElGVDoKKyAgICAgICAgICAgIHcgPSBQT1AoKTsKKyAgICAgICAgICAgIHYgPSBUT1AoKTsKKyAgICAgICAgICAgIHggPSBQeU51bWJlcl9JblBsYWNlTHNoaWZ0KHYsIHcpOworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgUHlfREVDUkVGKHcpOworICAgICAgICAgICAgU0VUX1RPUCh4KTsKKyAgICAgICAgICAgIGlmICh4ICE9IE5VTEwpIGNvbnRpbnVlOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBJTlBMQUNFX1JTSElGVDoKLQkJCXcgPSBQT1AoKTsKLQkJCXYgPSBUT1AoKTsKLQkJCXggPSBQeU51bWJlcl9JblBsYWNlUnNoaWZ0KHYsIHcpOwotCQkJUHlfREVDUkVGKHYpOwotCQkJUHlfREVDUkVGKHcpOwotCQkJU0VUX1RPUCh4KTsKLQkJCWlmICh4ICE9IE5VTEwpIGNvbnRpbnVlOwotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgSU5QTEFDRV9SU0hJRlQ6CisgICAgICAgICAgICB3ID0gUE9QKCk7CisgICAgICAgICAgICB2ID0gVE9QKCk7CisgICAgICAgICAgICB4ID0gUHlOdW1iZXJfSW5QbGFjZVJzaGlmdCh2LCB3KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih3KTsKKyAgICAgICAgICAgIFNFVF9UT1AoeCk7CisgICAgICAgICAgICBpZiAoeCAhPSBOVUxMKSBjb250aW51ZTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgSU5QTEFDRV9BTkQ6Ci0JCQl3ID0gUE9QKCk7Ci0JCQl2ID0gVE9QKCk7Ci0JCQl4ID0gUHlOdW1iZXJfSW5QbGFjZUFuZCh2LCB3KTsKLQkJCVB5X0RFQ1JFRih2KTsKLQkJCVB5X0RFQ1JFRih3KTsKLQkJCVNFVF9UT1AoeCk7Ci0JCQlpZiAoeCAhPSBOVUxMKSBjb250aW51ZTsKLQkJCWJyZWFrOworICAgICAgICBjYXNlIElOUExBQ0VfQU5EOgorICAgICAgICAgICAgdyA9IFBPUCgpOworICAgICAgICAgICAgdiA9IFRPUCgpOworICAgICAgICAgICAgeCA9IFB5TnVtYmVyX0luUGxhY2VBbmQodiwgdyk7CisgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICBQeV9ERUNSRUYodyk7CisgICAgICAgICAgICBTRVRfVE9QKHgpOworICAgICAgICAgICAgaWYgKHggIT0gTlVMTCkgY29udGludWU7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIElOUExBQ0VfWE9SOgotCQkJdyA9IFBPUCgpOwotCQkJdiA9IFRPUCgpOwotCQkJeCA9IFB5TnVtYmVyX0luUGxhY2VYb3Iodiwgdyk7Ci0JCQlQeV9ERUNSRUYodik7Ci0JCQlQeV9ERUNSRUYodyk7Ci0JCQlTRVRfVE9QKHgpOwotCQkJaWYgKHggIT0gTlVMTCkgY29udGludWU7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBJTlBMQUNFX1hPUjoKKyAgICAgICAgICAgIHcgPSBQT1AoKTsKKyAgICAgICAgICAgIHYgPSBUT1AoKTsKKyAgICAgICAgICAgIHggPSBQeU51bWJlcl9JblBsYWNlWG9yKHYsIHcpOworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgUHlfREVDUkVGKHcpOworICAgICAgICAgICAgU0VUX1RPUCh4KTsKKyAgICAgICAgICAgIGlmICh4ICE9IE5VTEwpIGNvbnRpbnVlOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBJTlBMQUNFX09SOgotCQkJdyA9IFBPUCgpOwotCQkJdiA9IFRPUCgpOwotCQkJeCA9IFB5TnVtYmVyX0luUGxhY2VPcih2LCB3KTsKLQkJCVB5X0RFQ1JFRih2KTsKLQkJCVB5X0RFQ1JFRih3KTsKLQkJCVNFVF9UT1AoeCk7Ci0JCQlpZiAoeCAhPSBOVUxMKSBjb250aW51ZTsKLQkJCWJyZWFrOworICAgICAgICBjYXNlIElOUExBQ0VfT1I6CisgICAgICAgICAgICB3ID0gUE9QKCk7CisgICAgICAgICAgICB2ID0gVE9QKCk7CisgICAgICAgICAgICB4ID0gUHlOdW1iZXJfSW5QbGFjZU9yKHYsIHcpOworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgUHlfREVDUkVGKHcpOworICAgICAgICAgICAgU0VUX1RPUCh4KTsKKyAgICAgICAgICAgIGlmICh4ICE9IE5VTEwpIGNvbnRpbnVlOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBTTElDRSswOgotCQljYXNlIFNMSUNFKzE6Ci0JCWNhc2UgU0xJQ0UrMjoKLQkJY2FzZSBTTElDRSszOgotCQkJaWYgKChvcGNvZGUtU0xJQ0UpICYgMikKLQkJCQl3ID0gUE9QKCk7Ci0JCQllbHNlCi0JCQkJdyA9IE5VTEw7Ci0JCQlpZiAoKG9wY29kZS1TTElDRSkgJiAxKQotCQkJCXYgPSBQT1AoKTsKLQkJCWVsc2UKLQkJCQl2ID0gTlVMTDsKLQkJCXUgPSBUT1AoKTsKLQkJCXggPSBhcHBseV9zbGljZSh1LCB2LCB3KTsKLQkJCVB5X0RFQ1JFRih1KTsKLQkJCVB5X1hERUNSRUYodik7Ci0JCQlQeV9YREVDUkVGKHcpOwotCQkJU0VUX1RPUCh4KTsKLQkJCWlmICh4ICE9IE5VTEwpIGNvbnRpbnVlOwotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgU0xJQ0UrMDoKKyAgICAgICAgY2FzZSBTTElDRSsxOgorICAgICAgICBjYXNlIFNMSUNFKzI6CisgICAgICAgIGNhc2UgU0xJQ0UrMzoKKyAgICAgICAgICAgIGlmICgob3Bjb2RlLVNMSUNFKSAmIDIpCisgICAgICAgICAgICAgICAgdyA9IFBPUCgpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHcgPSBOVUxMOworICAgICAgICAgICAgaWYgKChvcGNvZGUtU0xJQ0UpICYgMSkKKyAgICAgICAgICAgICAgICB2ID0gUE9QKCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdiA9IE5VTEw7CisgICAgICAgICAgICB1ID0gVE9QKCk7CisgICAgICAgICAgICB4ID0gYXBwbHlfc2xpY2UodSwgdiwgdyk7CisgICAgICAgICAgICBQeV9ERUNSRUYodSk7CisgICAgICAgICAgICBQeV9YREVDUkVGKHYpOworICAgICAgICAgICAgUHlfWERFQ1JFRih3KTsKKyAgICAgICAgICAgIFNFVF9UT1AoeCk7CisgICAgICAgICAgICBpZiAoeCAhPSBOVUxMKSBjb250aW51ZTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgU1RPUkVfU0xJQ0UrMDoKLQkJY2FzZSBTVE9SRV9TTElDRSsxOgotCQljYXNlIFNUT1JFX1NMSUNFKzI6Ci0JCWNhc2UgU1RPUkVfU0xJQ0UrMzoKLQkJCWlmICgob3Bjb2RlLVNUT1JFX1NMSUNFKSAmIDIpCi0JCQkJdyA9IFBPUCgpOwotCQkJZWxzZQotCQkJCXcgPSBOVUxMOwotCQkJaWYgKChvcGNvZGUtU1RPUkVfU0xJQ0UpICYgMSkKLQkJCQl2ID0gUE9QKCk7Ci0JCQllbHNlCi0JCQkJdiA9IE5VTEw7Ci0JCQl1ID0gUE9QKCk7Ci0JCQl0ID0gUE9QKCk7Ci0JCQllcnIgPSBhc3NpZ25fc2xpY2UodSwgdiwgdywgdCk7IC8qIHVbdjp3XSA9IHQgKi8KLQkJCVB5X0RFQ1JFRih0KTsKLQkJCVB5X0RFQ1JFRih1KTsKLQkJCVB5X1hERUNSRUYodik7Ci0JCQlQeV9YREVDUkVGKHcpOwotCQkJaWYgKGVyciA9PSAwKSBjb250aW51ZTsKLQkJCWJyZWFrOworICAgICAgICBjYXNlIFNUT1JFX1NMSUNFKzA6CisgICAgICAgIGNhc2UgU1RPUkVfU0xJQ0UrMToKKyAgICAgICAgY2FzZSBTVE9SRV9TTElDRSsyOgorICAgICAgICBjYXNlIFNUT1JFX1NMSUNFKzM6CisgICAgICAgICAgICBpZiAoKG9wY29kZS1TVE9SRV9TTElDRSkgJiAyKQorICAgICAgICAgICAgICAgIHcgPSBQT1AoKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB3ID0gTlVMTDsKKyAgICAgICAgICAgIGlmICgob3Bjb2RlLVNUT1JFX1NMSUNFKSAmIDEpCisgICAgICAgICAgICAgICAgdiA9IFBPUCgpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHYgPSBOVUxMOworICAgICAgICAgICAgdSA9IFBPUCgpOworICAgICAgICAgICAgdCA9IFBPUCgpOworICAgICAgICAgICAgZXJyID0gYXNzaWduX3NsaWNlKHUsIHYsIHcsIHQpOyAvKiB1W3Y6d10gPSB0ICovCisgICAgICAgICAgICBQeV9ERUNSRUYodCk7CisgICAgICAgICAgICBQeV9ERUNSRUYodSk7CisgICAgICAgICAgICBQeV9YREVDUkVGKHYpOworICAgICAgICAgICAgUHlfWERFQ1JFRih3KTsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gMCkgY29udGludWU7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIERFTEVURV9TTElDRSswOgotCQljYXNlIERFTEVURV9TTElDRSsxOgotCQljYXNlIERFTEVURV9TTElDRSsyOgotCQljYXNlIERFTEVURV9TTElDRSszOgotCQkJaWYgKChvcGNvZGUtREVMRVRFX1NMSUNFKSAmIDIpCi0JCQkJdyA9IFBPUCgpOwotCQkJZWxzZQotCQkJCXcgPSBOVUxMOwotCQkJaWYgKChvcGNvZGUtREVMRVRFX1NMSUNFKSAmIDEpCi0JCQkJdiA9IFBPUCgpOwotCQkJZWxzZQotCQkJCXYgPSBOVUxMOwotCQkJdSA9IFBPUCgpOwotCQkJZXJyID0gYXNzaWduX3NsaWNlKHUsIHYsIHcsIChQeU9iamVjdCAqKU5VTEwpOwotCQkJCQkJCS8qIGRlbCB1W3Y6d10gKi8KLQkJCVB5X0RFQ1JFRih1KTsKLQkJCVB5X1hERUNSRUYodik7Ci0JCQlQeV9YREVDUkVGKHcpOwotCQkJaWYgKGVyciA9PSAwKSBjb250aW51ZTsKLQkJCWJyZWFrOworICAgICAgICBjYXNlIERFTEVURV9TTElDRSswOgorICAgICAgICBjYXNlIERFTEVURV9TTElDRSsxOgorICAgICAgICBjYXNlIERFTEVURV9TTElDRSsyOgorICAgICAgICBjYXNlIERFTEVURV9TTElDRSszOgorICAgICAgICAgICAgaWYgKChvcGNvZGUtREVMRVRFX1NMSUNFKSAmIDIpCisgICAgICAgICAgICAgICAgdyA9IFBPUCgpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHcgPSBOVUxMOworICAgICAgICAgICAgaWYgKChvcGNvZGUtREVMRVRFX1NMSUNFKSAmIDEpCisgICAgICAgICAgICAgICAgdiA9IFBPUCgpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHYgPSBOVUxMOworICAgICAgICAgICAgdSA9IFBPUCgpOworICAgICAgICAgICAgZXJyID0gYXNzaWduX3NsaWNlKHUsIHYsIHcsIChQeU9iamVjdCAqKU5VTEwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkZWwgdVt2OnddICovCisgICAgICAgICAgICBQeV9ERUNSRUYodSk7CisgICAgICAgICAgICBQeV9YREVDUkVGKHYpOworICAgICAgICAgICAgUHlfWERFQ1JFRih3KTsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gMCkgY29udGludWU7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIFNUT1JFX1NVQlNDUjoKLQkJCXcgPSBUT1AoKTsKLQkJCXYgPSBTRUNPTkQoKTsKLQkJCXUgPSBUSElSRCgpOwotCQkJU1RBQ0tBREooLTMpOwotCQkJLyogdlt3XSA9IHUgKi8KLQkJCWVyciA9IFB5T2JqZWN0X1NldEl0ZW0odiwgdywgdSk7Ci0JCQlQeV9ERUNSRUYodSk7Ci0JCQlQeV9ERUNSRUYodik7Ci0JCQlQeV9ERUNSRUYodyk7Ci0JCQlpZiAoZXJyID09IDApIGNvbnRpbnVlOwotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgU1RPUkVfU1VCU0NSOgorICAgICAgICAgICAgdyA9IFRPUCgpOworICAgICAgICAgICAgdiA9IFNFQ09ORCgpOworICAgICAgICAgICAgdSA9IFRISVJEKCk7CisgICAgICAgICAgICBTVEFDS0FESigtMyk7CisgICAgICAgICAgICAvKiB2W3ddID0gdSAqLworICAgICAgICAgICAgZXJyID0gUHlPYmplY3RfU2V0SXRlbSh2LCB3LCB1KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih1KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih3KTsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gMCkgY29udGludWU7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIERFTEVURV9TVUJTQ1I6Ci0JCQl3ID0gVE9QKCk7Ci0JCQl2ID0gU0VDT05EKCk7Ci0JCQlTVEFDS0FESigtMik7Ci0JCQkvKiBkZWwgdlt3XSAqLwotCQkJZXJyID0gUHlPYmplY3RfRGVsSXRlbSh2LCB3KTsKLQkJCVB5X0RFQ1JFRih2KTsKLQkJCVB5X0RFQ1JFRih3KTsKLQkJCWlmIChlcnIgPT0gMCkgY29udGludWU7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBERUxFVEVfU1VCU0NSOgorICAgICAgICAgICAgdyA9IFRPUCgpOworICAgICAgICAgICAgdiA9IFNFQ09ORCgpOworICAgICAgICAgICAgU1RBQ0tBREooLTIpOworICAgICAgICAgICAgLyogZGVsIHZbd10gKi8KKyAgICAgICAgICAgIGVyciA9IFB5T2JqZWN0X0RlbEl0ZW0odiwgdyk7CisgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICBQeV9ERUNSRUYodyk7CisgICAgICAgICAgICBpZiAoZXJyID09IDApIGNvbnRpbnVlOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBQUklOVF9FWFBSOgotCQkJdiA9IFBPUCgpOwotCQkJdyA9IFB5U3lzX0dldE9iamVjdCgiZGlzcGxheWhvb2siKTsKLQkJCWlmICh3ID09IE5VTEwpIHsKLQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAotCQkJCQkJImxvc3Qgc3lzLmRpc3BsYXlob29rIik7Ci0JCQkJZXJyID0gLTE7Ci0JCQkJeCA9IE5VTEw7Ci0JCQl9Ci0JCQlpZiAoZXJyID09IDApIHsKLQkJCQl4ID0gUHlUdXBsZV9QYWNrKDEsIHYpOwotCQkJCWlmICh4ID09IE5VTEwpCi0JCQkJCWVyciA9IC0xOwotCQkJfQotCQkJaWYgKGVyciA9PSAwKSB7Ci0JCQkJdyA9IFB5RXZhbF9DYWxsT2JqZWN0KHcsIHgpOwotCQkJCVB5X1hERUNSRUYodyk7Ci0JCQkJaWYgKHcgPT0gTlVMTCkKLQkJCQkJZXJyID0gLTE7Ci0JCQl9Ci0JCQlQeV9ERUNSRUYodik7Ci0JCQlQeV9YREVDUkVGKHgpOwotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgUFJJTlRfRVhQUjoKKyAgICAgICAgICAgIHYgPSBQT1AoKTsKKyAgICAgICAgICAgIHcgPSBQeVN5c19HZXRPYmplY3QoImRpc3BsYXlob29rIik7CisgICAgICAgICAgICBpZiAodyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxvc3Qgc3lzLmRpc3BsYXlob29rIik7CisgICAgICAgICAgICAgICAgZXJyID0gLTE7CisgICAgICAgICAgICAgICAgeCA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZXJyID09IDApIHsKKyAgICAgICAgICAgICAgICB4ID0gUHlUdXBsZV9QYWNrKDEsIHYpOworICAgICAgICAgICAgICAgIGlmICh4ID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIGVyciA9IC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGVyciA9PSAwKSB7CisgICAgICAgICAgICAgICAgdyA9IFB5RXZhbF9DYWxsT2JqZWN0KHcsIHgpOworICAgICAgICAgICAgICAgIFB5X1hERUNSRUYodyk7CisgICAgICAgICAgICAgICAgaWYgKHcgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICBQeV9YREVDUkVGKHgpOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBQUklOVF9JVEVNX1RPOgotCQkJdyA9IHN0cmVhbSA9IFBPUCgpOwotCQkJLyogZmFsbCB0aHJvdWdoIHRvIFBSSU5UX0lURU0gKi8KKyAgICAgICAgY2FzZSBQUklOVF9JVEVNX1RPOgorICAgICAgICAgICAgdyA9IHN0cmVhbSA9IFBPUCgpOworICAgICAgICAgICAgLyogZmFsbCB0aHJvdWdoIHRvIFBSSU5UX0lURU0gKi8KIAotCQljYXNlIFBSSU5UX0lURU06Ci0JCQl2ID0gUE9QKCk7Ci0JCQlpZiAoc3RyZWFtID09IE5VTEwgfHwgc3RyZWFtID09IFB5X05vbmUpIHsKLQkJCQl3ID0gUHlTeXNfR2V0T2JqZWN0KCJzdGRvdXQiKTsKLQkJCQlpZiAodyA9PSBOVUxMKSB7Ci0JCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCi0JCQkJCQkJImxvc3Qgc3lzLnN0ZG91dCIpOwotCQkJCQllcnIgPSAtMTsKLQkJCQl9Ci0JCQl9Ci0JCQkvKiBQeUZpbGVfU29mdFNwYWNlKCkgY2FuIGV4ZWNlY3V0ZSBhcmJpdHJhcnkgY29kZQotCQkJICAgaWYgc3lzLnN0ZG91dCBpcyBhbiBpbnN0YW5jZSB3aXRoIGEgX19nZXRhdHRyX18uCi0JCQkgICBJZiBfX2dldGF0dHJfXyByYWlzZXMgYW4gZXhjZXB0aW9uLCB3IHdpbGwKLQkJCSAgIGJlIGZyZWVkLCBzbyB3ZSBuZWVkIHRvIHByZXZlbnQgdGhhdCB0ZW1wb3JhcmlseS4gKi8KLQkJCVB5X1hJTkNSRUYodyk7Ci0JCQlpZiAodyAhPSBOVUxMICYmIFB5RmlsZV9Tb2Z0U3BhY2UodywgMCkpCi0JCQkJZXJyID0gUHlGaWxlX1dyaXRlU3RyaW5nKCIgIiwgdyk7Ci0JCQlpZiAoZXJyID09IDApCi0JCQkJZXJyID0gUHlGaWxlX1dyaXRlT2JqZWN0KHYsIHcsIFB5X1BSSU5UX1JBVyk7Ci0JCQlpZiAoZXJyID09IDApIHsKLQkJCSAgICAvKiBYWFggbW92ZSBpbnRvIHdyaXRlb2JqZWN0KCkgPyAqLwotCQkJICAgIGlmIChQeVN0cmluZ19DaGVjayh2KSkgewotCQkJCWNoYXIgKnMgPSBQeVN0cmluZ19BU19TVFJJTkcodik7Ci0JCQkJUHlfc3NpemVfdCBsZW4gPSBQeVN0cmluZ19HRVRfU0laRSh2KTsKLQkJCQlpZiAobGVuID09IDAgfHwKLQkJCQkgICAgIWlzc3BhY2UoUHlfQ0hBUk1BU0soc1tsZW4tMV0pKSB8fAotCQkJCSAgICBzW2xlbi0xXSA9PSAnICcpCi0JCQkJCVB5RmlsZV9Tb2Z0U3BhY2UodywgMSk7Ci0JCQkgICAgfQorICAgICAgICBjYXNlIFBSSU5UX0lURU06CisgICAgICAgICAgICB2ID0gUE9QKCk7CisgICAgICAgICAgICBpZiAoc3RyZWFtID09IE5VTEwgfHwgc3RyZWFtID09IFB5X05vbmUpIHsKKyAgICAgICAgICAgICAgICB3ID0gUHlTeXNfR2V0T2JqZWN0KCJzdGRvdXQiKTsKKyAgICAgICAgICAgICAgICBpZiAodyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibG9zdCBzeXMuc3Rkb3V0Iik7CisgICAgICAgICAgICAgICAgICAgIGVyciA9IC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIFB5RmlsZV9Tb2Z0U3BhY2UoKSBjYW4gZXhlY2VjdXRlIGFyYml0cmFyeSBjb2RlCisgICAgICAgICAgICAgICBpZiBzeXMuc3Rkb3V0IGlzIGFuIGluc3RhbmNlIHdpdGggYSBfX2dldGF0dHJfXy4KKyAgICAgICAgICAgICAgIElmIF9fZ2V0YXR0cl9fIHJhaXNlcyBhbiBleGNlcHRpb24sIHcgd2lsbAorICAgICAgICAgICAgICAgYmUgZnJlZWQsIHNvIHdlIG5lZWQgdG8gcHJldmVudCB0aGF0IHRlbXBvcmFyaWx5LiAqLworICAgICAgICAgICAgUHlfWElOQ1JFRih3KTsKKyAgICAgICAgICAgIGlmICh3ICE9IE5VTEwgJiYgUHlGaWxlX1NvZnRTcGFjZSh3LCAwKSkKKyAgICAgICAgICAgICAgICBlcnIgPSBQeUZpbGVfV3JpdGVTdHJpbmcoIiAiLCB3KTsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gMCkKKyAgICAgICAgICAgICAgICBlcnIgPSBQeUZpbGVfV3JpdGVPYmplY3QodiwgdywgUHlfUFJJTlRfUkFXKTsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gMCkgeworICAgICAgICAgICAgICAgIC8qIFhYWCBtb3ZlIGludG8gd3JpdGVvYmplY3QoKSA/ICovCisgICAgICAgICAgICAgICAgaWYgKFB5U3RyaW5nX0NoZWNrKHYpKSB7CisgICAgICAgICAgICAgICAgY2hhciAqcyA9IFB5U3RyaW5nX0FTX1NUUklORyh2KTsKKyAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IGxlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHYpOworICAgICAgICAgICAgICAgIGlmIChsZW4gPT0gMCB8fAorICAgICAgICAgICAgICAgICAgICAhaXNzcGFjZShQeV9DSEFSTUFTSyhzW2xlbi0xXSkpIHx8CisgICAgICAgICAgICAgICAgICAgIHNbbGVuLTFdID09ICcgJykKKyAgICAgICAgICAgICAgICAgICAgUHlGaWxlX1NvZnRTcGFjZSh3LCAxKTsKKyAgICAgICAgICAgICAgICB9CiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCQkJICAgIGVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayh2KSkgewotCQkJCVB5X1VOSUNPREUgKnMgPSBQeVVuaWNvZGVfQVNfVU5JQ09ERSh2KTsKLQkJCQlQeV9zc2l6ZV90IGxlbiA9IFB5VW5pY29kZV9HRVRfU0laRSh2KTsKLQkJCQlpZiAobGVuID09IDAgfHwKLQkJCQkgICAgIVB5X1VOSUNPREVfSVNTUEFDRShzW2xlbi0xXSkgfHwKLQkJCQkgICAgc1tsZW4tMV0gPT0gJyAnKQotCQkJCSAgICBQeUZpbGVfU29mdFNwYWNlKHcsIDEpOwotCQkJICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2sodikpIHsKKyAgICAgICAgICAgICAgICBQeV9VTklDT0RFICpzID0gUHlVbmljb2RlX0FTX1VOSUNPREUodik7CisgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBsZW4gPSBQeVVuaWNvZGVfR0VUX1NJWkUodik7CisgICAgICAgICAgICAgICAgaWYgKGxlbiA9PSAwIHx8CisgICAgICAgICAgICAgICAgICAgICFQeV9VTklDT0RFX0lTU1BBQ0Uoc1tsZW4tMV0pIHx8CisgICAgICAgICAgICAgICAgICAgIHNbbGVuLTFdID09ICcgJykKKyAgICAgICAgICAgICAgICAgICAgUHlGaWxlX1NvZnRTcGFjZSh3LCAxKTsKKyAgICAgICAgICAgICAgICB9CiAjZW5kaWYKLQkJCSAgICBlbHNlCi0JCQkgICAgCVB5RmlsZV9Tb2Z0U3BhY2UodywgMSk7Ci0JCQl9Ci0JCQlQeV9YREVDUkVGKHcpOwotCQkJUHlfREVDUkVGKHYpOwotCQkJUHlfWERFQ1JFRihzdHJlYW0pOwotCQkJc3RyZWFtID0gTlVMTDsKLQkJCWlmIChlcnIgPT0gMCkKLQkJCQljb250aW51ZTsKLQkJCWJyZWFrOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBQeUZpbGVfU29mdFNwYWNlKHcsIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlfWERFQ1JFRih3KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgIFB5X1hERUNSRUYoc3RyZWFtKTsKKyAgICAgICAgICAgIHN0cmVhbSA9IE5VTEw7CisgICAgICAgICAgICBpZiAoZXJyID09IDApCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIFBSSU5UX05FV0xJTkVfVE86Ci0JCQl3ID0gc3RyZWFtID0gUE9QKCk7Ci0JCQkvKiBmYWxsIHRocm91Z2ggdG8gUFJJTlRfTkVXTElORSAqLworICAgICAgICBjYXNlIFBSSU5UX05FV0xJTkVfVE86CisgICAgICAgICAgICB3ID0gc3RyZWFtID0gUE9QKCk7CisgICAgICAgICAgICAvKiBmYWxsIHRocm91Z2ggdG8gUFJJTlRfTkVXTElORSAqLwogCi0JCWNhc2UgUFJJTlRfTkVXTElORToKLQkJCWlmIChzdHJlYW0gPT0gTlVMTCB8fCBzdHJlYW0gPT0gUHlfTm9uZSkgewotCQkJCXcgPSBQeVN5c19HZXRPYmplY3QoInN0ZG91dCIpOwotCQkJCWlmICh3ID09IE5VTEwpIHsKLQkJCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKLQkJCQkJCQkibG9zdCBzeXMuc3Rkb3V0Iik7Ci0JCQkJCXdoeSA9IFdIWV9FWENFUFRJT047Ci0JCQkJfQotCQkJfQotCQkJaWYgKHcgIT0gTlVMTCkgewotCQkJCS8qIHcud3JpdGUoKSBtYXkgcmVwbGFjZSBzeXMuc3Rkb3V0LCBzbyB3ZQotCQkJCSAqIGhhdmUgdG8ga2VlcCBvdXIgcmVmZXJlbmNlIHRvIGl0ICovCi0JCQkJUHlfSU5DUkVGKHcpOwotCQkJCWVyciA9IFB5RmlsZV9Xcml0ZVN0cmluZygiXG4iLCB3KTsKLQkJCQlpZiAoZXJyID09IDApCi0JCQkJCVB5RmlsZV9Tb2Z0U3BhY2UodywgMCk7Ci0JCQkJUHlfREVDUkVGKHcpOwotCQkJfQotCQkJUHlfWERFQ1JFRihzdHJlYW0pOwotCQkJc3RyZWFtID0gTlVMTDsKLQkJCWJyZWFrOworICAgICAgICBjYXNlIFBSSU5UX05FV0xJTkU6CisgICAgICAgICAgICBpZiAoc3RyZWFtID09IE5VTEwgfHwgc3RyZWFtID09IFB5X05vbmUpIHsKKyAgICAgICAgICAgICAgICB3ID0gUHlTeXNfR2V0T2JqZWN0KCJzdGRvdXQiKTsKKyAgICAgICAgICAgICAgICBpZiAodyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibG9zdCBzeXMuc3Rkb3V0Iik7CisgICAgICAgICAgICAgICAgICAgIHdoeSA9IFdIWV9FWENFUFRJT047CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHcgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIC8qIHcud3JpdGUoKSBtYXkgcmVwbGFjZSBzeXMuc3Rkb3V0LCBzbyB3ZQorICAgICAgICAgICAgICAgICAqIGhhdmUgdG8ga2VlcCBvdXIgcmVmZXJlbmNlIHRvIGl0ICovCisgICAgICAgICAgICAgICAgUHlfSU5DUkVGKHcpOworICAgICAgICAgICAgICAgIGVyciA9IFB5RmlsZV9Xcml0ZVN0cmluZygiXG4iLCB3KTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyID09IDApCisgICAgICAgICAgICAgICAgICAgIFB5RmlsZV9Tb2Z0U3BhY2UodywgMCk7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlfWERFQ1JFRihzdHJlYW0pOworICAgICAgICAgICAgc3RyZWFtID0gTlVMTDsKKyAgICAgICAgICAgIGJyZWFrOwogCiAKICNpZmRlZiBDQVNFX1RPT19CSUcKLQkJZGVmYXVsdDogc3dpdGNoIChvcGNvZGUpIHsKKyAgICAgICAgZGVmYXVsdDogc3dpdGNoIChvcGNvZGUpIHsKICNlbmRpZgotCQljYXNlIFJBSVNFX1ZBUkFSR1M6Ci0JCQl1ID0gdiA9IHcgPSBOVUxMOwotCQkJc3dpdGNoIChvcGFyZykgewotCQkJY2FzZSAzOgotCQkJCXUgPSBQT1AoKTsgLyogdHJhY2ViYWNrICovCi0JCQkJLyogRmFsbHRocm91Z2ggKi8KLQkJCWNhc2UgMjoKLQkJCQl2ID0gUE9QKCk7IC8qIHZhbHVlICovCi0JCQkJLyogRmFsbHRocm91Z2ggKi8KLQkJCWNhc2UgMToKLQkJCQl3ID0gUE9QKCk7IC8qIGV4YyAqLwotCQkJY2FzZSAwOiAvKiBGYWxsdGhyb3VnaCAqLwotCQkJCXdoeSA9IGRvX3JhaXNlKHcsIHYsIHUpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCi0JCQkJCSAgICJiYWQgUkFJU0VfVkFSQVJHUyBvcGFyZyIpOwotCQkJCXdoeSA9IFdIWV9FWENFUFRJT047Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBSQUlTRV9WQVJBUkdTOgorICAgICAgICAgICAgdSA9IHYgPSB3ID0gTlVMTDsKKyAgICAgICAgICAgIHN3aXRjaCAob3BhcmcpIHsKKyAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICB1ID0gUE9QKCk7IC8qIHRyYWNlYmFjayAqLworICAgICAgICAgICAgICAgIC8qIEZhbGx0aHJvdWdoICovCisgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgdiA9IFBPUCgpOyAvKiB2YWx1ZSAqLworICAgICAgICAgICAgICAgIC8qIEZhbGx0aHJvdWdoICovCisgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgdyA9IFBPUCgpOyAvKiBleGMgKi8KKyAgICAgICAgICAgIGNhc2UgMDogLyogRmFsbHRocm91Z2ggKi8KKyAgICAgICAgICAgICAgICB3aHkgPSBkb19yYWlzZSh3LCB2LCB1KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhZCBSQUlTRV9WQVJBUkdTIG9wYXJnIik7CisgICAgICAgICAgICAgICAgd2h5ID0gV0hZX0VYQ0VQVElPTjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgTE9BRF9MT0NBTFM6Ci0JCQlpZiAoKHggPSBmLT5mX2xvY2FscykgIT0gTlVMTCkgewotCQkJCVB5X0lOQ1JFRih4KTsKLQkJCQlQVVNIKHgpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLCAibm8gbG9jYWxzIik7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBMT0FEX0xPQ0FMUzoKKyAgICAgICAgICAgIGlmICgoeCA9IGYtPmZfbG9jYWxzKSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlfSU5DUkVGKHgpOworICAgICAgICAgICAgICAgIFBVU0goeCk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsICJubyBsb2NhbHMiKTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgUkVUVVJOX1ZBTFVFOgotCQkJcmV0dmFsID0gUE9QKCk7Ci0JCQl3aHkgPSBXSFlfUkVUVVJOOwotCQkJZ290byBmYXN0X2Jsb2NrX2VuZDsKKyAgICAgICAgY2FzZSBSRVRVUk5fVkFMVUU6CisgICAgICAgICAgICByZXR2YWwgPSBQT1AoKTsKKyAgICAgICAgICAgIHdoeSA9IFdIWV9SRVRVUk47CisgICAgICAgICAgICBnb3RvIGZhc3RfYmxvY2tfZW5kOwogCi0JCWNhc2UgWUlFTERfVkFMVUU6Ci0JCQlyZXR2YWwgPSBQT1AoKTsKLQkJCWYtPmZfc3RhY2t0b3AgPSBzdGFja19wb2ludGVyOwotCQkJd2h5ID0gV0hZX1lJRUxEOwotCQkJZ290byBmYXN0X3lpZWxkOworICAgICAgICBjYXNlIFlJRUxEX1ZBTFVFOgorICAgICAgICAgICAgcmV0dmFsID0gUE9QKCk7CisgICAgICAgICAgICBmLT5mX3N0YWNrdG9wID0gc3RhY2tfcG9pbnRlcjsKKyAgICAgICAgICAgIHdoeSA9IFdIWV9ZSUVMRDsKKyAgICAgICAgICAgIGdvdG8gZmFzdF95aWVsZDsKIAotCQljYXNlIEVYRUNfU1RNVDoKLQkJCXcgPSBUT1AoKTsKLQkJCXYgPSBTRUNPTkQoKTsKLQkJCXUgPSBUSElSRCgpOwotCQkJU1RBQ0tBREooLTMpOwotCQkJUkVBRF9USU1FU1RBTVAoaW50cjApOwotCQkJZXJyID0gZXhlY19zdGF0ZW1lbnQoZiwgdSwgdiwgdyk7Ci0JCQlSRUFEX1RJTUVTVEFNUChpbnRyMSk7Ci0JCQlQeV9ERUNSRUYodSk7Ci0JCQlQeV9ERUNSRUYodik7Ci0JCQlQeV9ERUNSRUYodyk7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBFWEVDX1NUTVQ6CisgICAgICAgICAgICB3ID0gVE9QKCk7CisgICAgICAgICAgICB2ID0gU0VDT05EKCk7CisgICAgICAgICAgICB1ID0gVEhJUkQoKTsKKyAgICAgICAgICAgIFNUQUNLQURKKC0zKTsKKyAgICAgICAgICAgIFJFQURfVElNRVNUQU1QKGludHIwKTsKKyAgICAgICAgICAgIGVyciA9IGV4ZWNfc3RhdGVtZW50KGYsIHUsIHYsIHcpOworICAgICAgICAgICAgUkVBRF9USU1FU1RBTVAoaW50cjEpOworICAgICAgICAgICAgUHlfREVDUkVGKHUpOworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgUHlfREVDUkVGKHcpOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBQT1BfQkxPQ0s6Ci0JCQl7Ci0JCQkJUHlUcnlCbG9jayAqYiA9IFB5RnJhbWVfQmxvY2tQb3AoZik7Ci0JCQkJd2hpbGUgKFNUQUNLX0xFVkVMKCkgPiBiLT5iX2xldmVsKSB7Ci0JCQkJCXYgPSBQT1AoKTsKLQkJCQkJUHlfREVDUkVGKHYpOwotCQkJCX0KLQkJCX0KLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIFBPUF9CTE9DSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQeVRyeUJsb2NrICpiID0gUHlGcmFtZV9CbG9ja1BvcChmKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoU1RBQ0tfTEVWRUwoKSA+IGItPmJfbGV2ZWwpIHsKKyAgICAgICAgICAgICAgICAgICAgdiA9IFBPUCgpOworICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY29udGludWU7CiAKLQkJUFJFRElDVEVEKEVORF9GSU5BTExZKTsKLQkJY2FzZSBFTkRfRklOQUxMWToKLQkJCXYgPSBQT1AoKTsKLQkJCWlmIChQeUludF9DaGVjayh2KSkgewotCQkJCXdoeSA9IChlbnVtIHdoeV9jb2RlKSBQeUludF9BU19MT05HKHYpOwotCQkJCWFzc2VydCh3aHkgIT0gV0hZX1lJRUxEKTsKLQkJCQlpZiAod2h5ID09IFdIWV9SRVRVUk4gfHwKLQkJCQkgICAgd2h5ID09IFdIWV9DT05USU5VRSkKLQkJCQkJcmV0dmFsID0gUE9QKCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChQeUV4Y2VwdGlvbkNsYXNzX0NoZWNrKHYpIHx8Ci0JCQkgICAgICAgICBQeVN0cmluZ19DaGVjayh2KSkgewotCQkJCXcgPSBQT1AoKTsKLQkJCQl1ID0gUE9QKCk7Ci0JCQkJUHlFcnJfUmVzdG9yZSh2LCB3LCB1KTsKLQkJCQl3aHkgPSBXSFlfUkVSQUlTRTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWVsc2UgaWYgKHYgIT0gUHlfTm9uZSkgewotCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKLQkJCQkJIidmaW5hbGx5JyBwb3BzIGJhZCBleGNlcHRpb24iKTsKLQkJCQl3aHkgPSBXSFlfRVhDRVBUSU9OOwotCQkJfQotCQkJUHlfREVDUkVGKHYpOwotCQkJYnJlYWs7CisgICAgICAgIFBSRURJQ1RFRChFTkRfRklOQUxMWSk7CisgICAgICAgIGNhc2UgRU5EX0ZJTkFMTFk6CisgICAgICAgICAgICB2ID0gUE9QKCk7CisgICAgICAgICAgICBpZiAoUHlJbnRfQ2hlY2sodikpIHsKKyAgICAgICAgICAgICAgICB3aHkgPSAoZW51bSB3aHlfY29kZSkgUHlJbnRfQVNfTE9ORyh2KTsKKyAgICAgICAgICAgICAgICBhc3NlcnQod2h5ICE9IFdIWV9ZSUVMRCk7CisgICAgICAgICAgICAgICAgaWYgKHdoeSA9PSBXSFlfUkVUVVJOIHx8CisgICAgICAgICAgICAgICAgICAgIHdoeSA9PSBXSFlfQ09OVElOVUUpCisgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IFBPUCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoUHlFeGNlcHRpb25DbGFzc19DaGVjayh2KSB8fAorICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQ2hlY2sodikpIHsKKyAgICAgICAgICAgICAgICB3ID0gUE9QKCk7CisgICAgICAgICAgICAgICAgdSA9IFBPUCgpOworICAgICAgICAgICAgICAgIFB5RXJyX1Jlc3RvcmUodiwgdywgdSk7CisgICAgICAgICAgICAgICAgd2h5ID0gV0hZX1JFUkFJU0U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICh2ICE9IFB5X05vbmUpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICInZmluYWxseScgcG9wcyBiYWQgZXhjZXB0aW9uIik7CisgICAgICAgICAgICAgICAgd2h5ID0gV0hZX0VYQ0VQVElPTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgQlVJTERfQ0xBU1M6Ci0JCQl1ID0gVE9QKCk7Ci0JCQl2ID0gU0VDT05EKCk7Ci0JCQl3ID0gVEhJUkQoKTsKLQkJCVNUQUNLQURKKC0yKTsKLQkJCXggPSBidWlsZF9jbGFzcyh1LCB2LCB3KTsKLQkJCVNFVF9UT1AoeCk7Ci0JCQlQeV9ERUNSRUYodSk7Ci0JCQlQeV9ERUNSRUYodik7Ci0JCQlQeV9ERUNSRUYodyk7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBCVUlMRF9DTEFTUzoKKyAgICAgICAgICAgIHUgPSBUT1AoKTsKKyAgICAgICAgICAgIHYgPSBTRUNPTkQoKTsKKyAgICAgICAgICAgIHcgPSBUSElSRCgpOworICAgICAgICAgICAgU1RBQ0tBREooLTIpOworICAgICAgICAgICAgeCA9IGJ1aWxkX2NsYXNzKHUsIHYsIHcpOworICAgICAgICAgICAgU0VUX1RPUCh4KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih1KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih3KTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgU1RPUkVfTkFNRToKLQkJCXcgPSBHRVRJVEVNKG5hbWVzLCBvcGFyZyk7Ci0JCQl2ID0gUE9QKCk7Ci0JCQlpZiAoKHggPSBmLT5mX2xvY2FscykgIT0gTlVMTCkgewotCQkJCWlmIChQeURpY3RfQ2hlY2tFeGFjdCh4KSkKLQkJCQkJZXJyID0gUHlEaWN0X1NldEl0ZW0oeCwgdywgdik7Ci0JCQkJZWxzZQotCQkJCQllcnIgPSBQeU9iamVjdF9TZXRJdGVtKHgsIHcsIHYpOwotCQkJCVB5X0RFQ1JFRih2KTsKLQkJCQlpZiAoZXJyID09IDApIGNvbnRpbnVlOwotCQkJCWJyZWFrOwotCQkJfQotCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1N5c3RlbUVycm9yLAotCQkJCSAgICAgIm5vIGxvY2FscyBmb3VuZCB3aGVuIHN0b3JpbmcgJXMiLAotCQkJCSAgICAgUHlPYmplY3RfUkVQUih3KSk7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBTVE9SRV9OQU1FOgorICAgICAgICAgICAgdyA9IEdFVElURU0obmFtZXMsIG9wYXJnKTsKKyAgICAgICAgICAgIHYgPSBQT1AoKTsKKyAgICAgICAgICAgIGlmICgoeCA9IGYtPmZfbG9jYWxzKSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaWYgKFB5RGljdF9DaGVja0V4YWN0KHgpKQorICAgICAgICAgICAgICAgICAgICBlcnIgPSBQeURpY3RfU2V0SXRlbSh4LCB3LCB2KTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGVyciA9IFB5T2JqZWN0X1NldEl0ZW0oeCwgdywgdik7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gMCkgY29udGludWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIm5vIGxvY2FscyBmb3VuZCB3aGVuIHN0b3JpbmcgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0X1JFUFIodykpOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBERUxFVEVfTkFNRToKLQkJCXcgPSBHRVRJVEVNKG5hbWVzLCBvcGFyZyk7Ci0JCQlpZiAoKHggPSBmLT5mX2xvY2FscykgIT0gTlVMTCkgewotCQkJCWlmICgoZXJyID0gUHlPYmplY3RfRGVsSXRlbSh4LCB3KSkgIT0gMCkKLQkJCQkJZm9ybWF0X2V4Y19jaGVja19hcmcoUHlFeGNfTmFtZUVycm9yLAotCQkJCQkJCSAgICAgTkFNRV9FUlJPUl9NU0csCi0JCQkJCQkJICAgICB3KTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19TeXN0ZW1FcnJvciwKLQkJCQkgICAgICJubyBsb2NhbHMgd2hlbiBkZWxldGluZyAlcyIsCi0JCQkJICAgICBQeU9iamVjdF9SRVBSKHcpKTsKLQkJCWJyZWFrOworICAgICAgICBjYXNlIERFTEVURV9OQU1FOgorICAgICAgICAgICAgdyA9IEdFVElURU0obmFtZXMsIG9wYXJnKTsKKyAgICAgICAgICAgIGlmICgoeCA9IGYtPmZfbG9jYWxzKSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaWYgKChlcnIgPSBQeU9iamVjdF9EZWxJdGVtKHgsIHcpKSAhPSAwKQorICAgICAgICAgICAgICAgICAgICBmb3JtYXRfZXhjX2NoZWNrX2FyZyhQeUV4Y19OYW1lRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5BTUVfRVJST1JfTVNHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19TeXN0ZW1FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAibm8gbG9jYWxzIHdoZW4gZGVsZXRpbmcgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0X1JFUFIodykpOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJUFJFRElDVEVEX1dJVEhfQVJHKFVOUEFDS19TRVFVRU5DRSk7Ci0JCWNhc2UgVU5QQUNLX1NFUVVFTkNFOgotCQkJdiA9IFBPUCgpOwotCQkJaWYgKFB5VHVwbGVfQ2hlY2tFeGFjdCh2KSAmJgotCQkJICAgIFB5VHVwbGVfR0VUX1NJWkUodikgPT0gb3BhcmcpIHsKLQkJCQlQeU9iamVjdCAqKml0ZW1zID0gXAotCQkJCQkoKFB5VHVwbGVPYmplY3QgKil2KS0+b2JfaXRlbTsKLQkJCQl3aGlsZSAob3BhcmctLSkgewotCQkJCQl3ID0gaXRlbXNbb3BhcmddOwotCQkJCQlQeV9JTkNSRUYodyk7Ci0JCQkJCVBVU0godyk7Ci0JCQkJfQotCQkJCVB5X0RFQ1JFRih2KTsKLQkJCQljb250aW51ZTsKLQkJCX0gZWxzZSBpZiAoUHlMaXN0X0NoZWNrRXhhY3QodikgJiYKLQkJCQkgICBQeUxpc3RfR0VUX1NJWkUodikgPT0gb3BhcmcpIHsKLQkJCQlQeU9iamVjdCAqKml0ZW1zID0gXAotCQkJCQkoKFB5TGlzdE9iamVjdCAqKXYpLT5vYl9pdGVtOwotCQkJCXdoaWxlIChvcGFyZy0tKSB7Ci0JCQkJCXcgPSBpdGVtc1tvcGFyZ107Ci0JCQkJCVB5X0lOQ1JFRih3KTsKLQkJCQkJUFVTSCh3KTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKHVucGFja19pdGVyYWJsZSh2LCBvcGFyZywKLQkJCQkJCSAgIHN0YWNrX3BvaW50ZXIgKyBvcGFyZykpIHsKLQkJCQlzdGFja19wb2ludGVyICs9IG9wYXJnOwotCQkJfSBlbHNlIHsKLQkJCQkvKiB1bnBhY2tfaXRlcmFibGUoKSByYWlzZWQgYW4gZXhjZXB0aW9uICovCi0JCQkJd2h5ID0gV0hZX0VYQ0VQVElPTjsKLQkJCX0KLQkJCVB5X0RFQ1JFRih2KTsKLQkJCWJyZWFrOworICAgICAgICBQUkVESUNURURfV0lUSF9BUkcoVU5QQUNLX1NFUVVFTkNFKTsKKyAgICAgICAgY2FzZSBVTlBBQ0tfU0VRVUVOQ0U6CisgICAgICAgICAgICB2ID0gUE9QKCk7CisgICAgICAgICAgICBpZiAoUHlUdXBsZV9DaGVja0V4YWN0KHYpICYmCisgICAgICAgICAgICAgICAgUHlUdXBsZV9HRVRfU0laRSh2KSA9PSBvcGFyZykgeworICAgICAgICAgICAgICAgIFB5T2JqZWN0ICoqaXRlbXMgPSBcCisgICAgICAgICAgICAgICAgICAgICgoUHlUdXBsZU9iamVjdCAqKXYpLT5vYl9pdGVtOworICAgICAgICAgICAgICAgIHdoaWxlIChvcGFyZy0tKSB7CisgICAgICAgICAgICAgICAgICAgIHcgPSBpdGVtc1tvcGFyZ107CisgICAgICAgICAgICAgICAgICAgIFB5X0lOQ1JFRih3KTsKKyAgICAgICAgICAgICAgICAgICAgUFVTSCh3KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfSBlbHNlIGlmIChQeUxpc3RfQ2hlY2tFeGFjdCh2KSAmJgorICAgICAgICAgICAgICAgICAgICAgICBQeUxpc3RfR0VUX1NJWkUodikgPT0gb3BhcmcpIHsKKyAgICAgICAgICAgICAgICBQeU9iamVjdCAqKml0ZW1zID0gXAorICAgICAgICAgICAgICAgICAgICAoKFB5TGlzdE9iamVjdCAqKXYpLT5vYl9pdGVtOworICAgICAgICAgICAgICAgIHdoaWxlIChvcGFyZy0tKSB7CisgICAgICAgICAgICAgICAgICAgIHcgPSBpdGVtc1tvcGFyZ107CisgICAgICAgICAgICAgICAgICAgIFB5X0lOQ1JFRih3KTsKKyAgICAgICAgICAgICAgICAgICAgUFVTSCh3KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKHVucGFja19pdGVyYWJsZSh2LCBvcGFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrX3BvaW50ZXIgKyBvcGFyZykpIHsKKyAgICAgICAgICAgICAgICBzdGFja19wb2ludGVyICs9IG9wYXJnOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiB1bnBhY2tfaXRlcmFibGUoKSByYWlzZWQgYW4gZXhjZXB0aW9uICovCisgICAgICAgICAgICAgICAgd2h5ID0gV0hZX0VYQ0VQVElPTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgU1RPUkVfQVRUUjoKLQkJCXcgPSBHRVRJVEVNKG5hbWVzLCBvcGFyZyk7Ci0JCQl2ID0gVE9QKCk7Ci0JCQl1ID0gU0VDT05EKCk7Ci0JCQlTVEFDS0FESigtMik7Ci0JCQllcnIgPSBQeU9iamVjdF9TZXRBdHRyKHYsIHcsIHUpOyAvKiB2LncgPSB1ICovCi0JCQlQeV9ERUNSRUYodik7Ci0JCQlQeV9ERUNSRUYodSk7Ci0JCQlpZiAoZXJyID09IDApIGNvbnRpbnVlOwotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgU1RPUkVfQVRUUjoKKyAgICAgICAgICAgIHcgPSBHRVRJVEVNKG5hbWVzLCBvcGFyZyk7CisgICAgICAgICAgICB2ID0gVE9QKCk7CisgICAgICAgICAgICB1ID0gU0VDT05EKCk7CisgICAgICAgICAgICBTVEFDS0FESigtMik7CisgICAgICAgICAgICBlcnIgPSBQeU9iamVjdF9TZXRBdHRyKHYsIHcsIHUpOyAvKiB2LncgPSB1ICovCisgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICBQeV9ERUNSRUYodSk7CisgICAgICAgICAgICBpZiAoZXJyID09IDApIGNvbnRpbnVlOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBERUxFVEVfQVRUUjoKLQkJCXcgPSBHRVRJVEVNKG5hbWVzLCBvcGFyZyk7Ci0JCQl2ID0gUE9QKCk7Ci0JCQllcnIgPSBQeU9iamVjdF9TZXRBdHRyKHYsIHcsIChQeU9iamVjdCAqKU5VTEwpOwotCQkJCQkJCS8qIGRlbCB2LncgKi8KLQkJCVB5X0RFQ1JFRih2KTsKLQkJCWJyZWFrOworICAgICAgICBjYXNlIERFTEVURV9BVFRSOgorICAgICAgICAgICAgdyA9IEdFVElURU0obmFtZXMsIG9wYXJnKTsKKyAgICAgICAgICAgIHYgPSBQT1AoKTsKKyAgICAgICAgICAgIGVyciA9IFB5T2JqZWN0X1NldEF0dHIodiwgdywgKFB5T2JqZWN0ICopTlVMTCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRlbCB2LncgKi8KKyAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgU1RPUkVfR0xPQkFMOgotCQkJdyA9IEdFVElURU0obmFtZXMsIG9wYXJnKTsKLQkJCXYgPSBQT1AoKTsKLQkJCWVyciA9IFB5RGljdF9TZXRJdGVtKGYtPmZfZ2xvYmFscywgdywgdik7Ci0JCQlQeV9ERUNSRUYodik7Ci0JCQlpZiAoZXJyID09IDApIGNvbnRpbnVlOwotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgU1RPUkVfR0xPQkFMOgorICAgICAgICAgICAgdyA9IEdFVElURU0obmFtZXMsIG9wYXJnKTsKKyAgICAgICAgICAgIHYgPSBQT1AoKTsKKyAgICAgICAgICAgIGVyciA9IFB5RGljdF9TZXRJdGVtKGYtPmZfZ2xvYmFscywgdywgdik7CisgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICBpZiAoZXJyID09IDApIGNvbnRpbnVlOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBERUxFVEVfR0xPQkFMOgotCQkJdyA9IEdFVElURU0obmFtZXMsIG9wYXJnKTsKLQkJCWlmICgoZXJyID0gUHlEaWN0X0RlbEl0ZW0oZi0+Zl9nbG9iYWxzLCB3KSkgIT0gMCkKLQkJCQlmb3JtYXRfZXhjX2NoZWNrX2FyZygKLQkJCQkgICAgUHlFeGNfTmFtZUVycm9yLCBHTE9CQUxfTkFNRV9FUlJPUl9NU0csIHcpOwotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgREVMRVRFX0dMT0JBTDoKKyAgICAgICAgICAgIHcgPSBHRVRJVEVNKG5hbWVzLCBvcGFyZyk7CisgICAgICAgICAgICBpZiAoKGVyciA9IFB5RGljdF9EZWxJdGVtKGYtPmZfZ2xvYmFscywgdykpICE9IDApCisgICAgICAgICAgICAgICAgZm9ybWF0X2V4Y19jaGVja19hcmcoCisgICAgICAgICAgICAgICAgICAgIFB5RXhjX05hbWVFcnJvciwgR0xPQkFMX05BTUVfRVJST1JfTVNHLCB3KTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgTE9BRF9OQU1FOgotCQkJdyA9IEdFVElURU0obmFtZXMsIG9wYXJnKTsKLQkJCWlmICgodiA9IGYtPmZfbG9jYWxzKSA9PSBOVUxMKSB7Ci0JCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1N5c3RlbUVycm9yLAotCQkJCQkgICAgICJubyBsb2NhbHMgd2hlbiBsb2FkaW5nICVzIiwKLQkJCQkJICAgICBQeU9iamVjdF9SRVBSKHcpKTsKLQkJCQl3aHkgPSBXSFlfRVhDRVBUSU9OOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKFB5RGljdF9DaGVja0V4YWN0KHYpKSB7Ci0JCQkJeCA9IFB5RGljdF9HZXRJdGVtKHYsIHcpOwotCQkJCVB5X1hJTkNSRUYoeCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl4ID0gUHlPYmplY3RfR2V0SXRlbSh2LCB3KTsKLQkJCQlpZiAoeCA9PSBOVUxMICYmIFB5RXJyX09jY3VycmVkKCkpIHsKLQkJCQkJaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKAotCQkJCQkJCVB5RXhjX0tleUVycm9yKSkKLQkJCQkJCWJyZWFrOwotCQkJCQlQeUVycl9DbGVhcigpOwotCQkJCX0KLQkJCX0KLQkJCWlmICh4ID09IE5VTEwpIHsKLQkJCQl4ID0gUHlEaWN0X0dldEl0ZW0oZi0+Zl9nbG9iYWxzLCB3KTsKLQkJCQlpZiAoeCA9PSBOVUxMKSB7Ci0JCQkJCXggPSBQeURpY3RfR2V0SXRlbShmLT5mX2J1aWx0aW5zLCB3KTsKLQkJCQkJaWYgKHggPT0gTlVMTCkgewotCQkJCQkJZm9ybWF0X2V4Y19jaGVja19hcmcoCi0JCQkJCQkJICAgIFB5RXhjX05hbWVFcnJvciwKLQkJCQkJCQkgICAgTkFNRV9FUlJPUl9NU0csIHcpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJUHlfSU5DUkVGKHgpOwotCQkJfQotCQkJUFVTSCh4KTsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIExPQURfTkFNRToKKyAgICAgICAgICAgIHcgPSBHRVRJVEVNKG5hbWVzLCBvcGFyZyk7CisgICAgICAgICAgICBpZiAoKHYgPSBmLT5mX2xvY2FscykgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19TeXN0ZW1FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vIGxvY2FscyB3aGVuIGxvYWRpbmcgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdF9SRVBSKHcpKTsKKyAgICAgICAgICAgICAgICB3aHkgPSBXSFlfRVhDRVBUSU9OOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKFB5RGljdF9DaGVja0V4YWN0KHYpKSB7CisgICAgICAgICAgICAgICAgeCA9IFB5RGljdF9HZXRJdGVtKHYsIHcpOworICAgICAgICAgICAgICAgIFB5X1hJTkNSRUYoeCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICB4ID0gUHlPYmplY3RfR2V0SXRlbSh2LCB3KTsKKyAgICAgICAgICAgICAgICBpZiAoeCA9PSBOVUxMICYmIFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlFeGNfS2V5RXJyb3IpKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHggPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHggPSBQeURpY3RfR2V0SXRlbShmLT5mX2dsb2JhbHMsIHcpOworICAgICAgICAgICAgICAgIGlmICh4ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgeCA9IFB5RGljdF9HZXRJdGVtKGYtPmZfYnVpbHRpbnMsIHcpOworICAgICAgICAgICAgICAgICAgICBpZiAoeCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRfZXhjX2NoZWNrX2FyZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXhjX05hbWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5BTUVfRVJST1JfTVNHLCB3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFB5X0lOQ1JFRih4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFBVU0goeCk7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIExPQURfR0xPQkFMOgotCQkJdyA9IEdFVElURU0obmFtZXMsIG9wYXJnKTsKLQkJCWlmIChQeVN0cmluZ19DaGVja0V4YWN0KHcpKSB7Ci0JCQkJLyogSW5saW5lIHRoZSBQeURpY3RfR2V0SXRlbSgpIGNhbGxzLgotCQkJCSAgIFdBUk5JTkc6IHRoaXMgaXMgYW4gZXh0cmVtZSBzcGVlZCBoYWNrLgotCQkJCSAgIERvIG5vdCB0cnkgdGhpcyBhdCBob21lLiAqLwotCQkJCWxvbmcgaGFzaCA9ICgoUHlTdHJpbmdPYmplY3QgKil3KS0+b2Jfc2hhc2g7Ci0JCQkJaWYgKGhhc2ggIT0gLTEpIHsKLQkJCQkJUHlEaWN0T2JqZWN0ICpkOwotCQkJCQlQeURpY3RFbnRyeSAqZTsKLQkJCQkJZCA9IChQeURpY3RPYmplY3QgKikoZi0+Zl9nbG9iYWxzKTsKLQkJCQkJZSA9IGQtPm1hX2xvb2t1cChkLCB3LCBoYXNoKTsKLQkJCQkJaWYgKGUgPT0gTlVMTCkgewotCQkJCQkJeCA9IE5VTEw7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQl4ID0gZS0+bWVfdmFsdWU7Ci0JCQkJCWlmICh4ICE9IE5VTEwpIHsKLQkJCQkJCVB5X0lOQ1JFRih4KTsKLQkJCQkJCVBVU0goeCk7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQlkID0gKFB5RGljdE9iamVjdCAqKShmLT5mX2J1aWx0aW5zKTsKLQkJCQkJZSA9IGQtPm1hX2xvb2t1cChkLCB3LCBoYXNoKTsKLQkJCQkJaWYgKGUgPT0gTlVMTCkgewotCQkJCQkJeCA9IE5VTEw7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQl4ID0gZS0+bWVfdmFsdWU7Ci0JCQkJCWlmICh4ICE9IE5VTEwpIHsKLQkJCQkJCVB5X0lOQ1JFRih4KTsKLQkJCQkJCVBVU0goeCk7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQlnb3RvIGxvYWRfZ2xvYmFsX2Vycm9yOwotCQkJCX0KLQkJCX0KLQkJCS8qIFRoaXMgaXMgdGhlIHVuLWlubGluZWQgdmVyc2lvbiBvZiB0aGUgY29kZSBhYm92ZSAqLwotCQkJeCA9IFB5RGljdF9HZXRJdGVtKGYtPmZfZ2xvYmFscywgdyk7Ci0JCQlpZiAoeCA9PSBOVUxMKSB7Ci0JCQkJeCA9IFB5RGljdF9HZXRJdGVtKGYtPmZfYnVpbHRpbnMsIHcpOwotCQkJCWlmICh4ID09IE5VTEwpIHsKLQkJCQkgIGxvYWRfZ2xvYmFsX2Vycm9yOgotCQkJCQlmb3JtYXRfZXhjX2NoZWNrX2FyZygKLQkJCQkJCSAgICBQeUV4Y19OYW1lRXJyb3IsCi0JCQkJCQkgICAgR0xPQkFMX05BTUVfRVJST1JfTVNHLCB3KTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJUHlfSU5DUkVGKHgpOwotCQkJUFVTSCh4KTsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIExPQURfR0xPQkFMOgorICAgICAgICAgICAgdyA9IEdFVElURU0obmFtZXMsIG9wYXJnKTsKKyAgICAgICAgICAgIGlmIChQeVN0cmluZ19DaGVja0V4YWN0KHcpKSB7CisgICAgICAgICAgICAgICAgLyogSW5saW5lIHRoZSBQeURpY3RfR2V0SXRlbSgpIGNhbGxzLgorICAgICAgICAgICAgICAgICAgIFdBUk5JTkc6IHRoaXMgaXMgYW4gZXh0cmVtZSBzcGVlZCBoYWNrLgorICAgICAgICAgICAgICAgICAgIERvIG5vdCB0cnkgdGhpcyBhdCBob21lLiAqLworICAgICAgICAgICAgICAgIGxvbmcgaGFzaCA9ICgoUHlTdHJpbmdPYmplY3QgKil3KS0+b2Jfc2hhc2g7CisgICAgICAgICAgICAgICAgaWYgKGhhc2ggIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgUHlEaWN0T2JqZWN0ICpkOworICAgICAgICAgICAgICAgICAgICBQeURpY3RFbnRyeSAqZTsKKyAgICAgICAgICAgICAgICAgICAgZCA9IChQeURpY3RPYmplY3QgKikoZi0+Zl9nbG9iYWxzKTsKKyAgICAgICAgICAgICAgICAgICAgZSA9IGQtPm1hX2xvb2t1cChkLCB3LCBoYXNoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGUgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgeCA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB4ID0gZS0+bWVfdmFsdWU7CisgICAgICAgICAgICAgICAgICAgIGlmICh4ICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5X0lOQ1JFRih4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFBVU0goeCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBkID0gKFB5RGljdE9iamVjdCAqKShmLT5mX2J1aWx0aW5zKTsKKyAgICAgICAgICAgICAgICAgICAgZSA9IGQtPm1hX2xvb2t1cChkLCB3LCBoYXNoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGUgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgeCA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB4ID0gZS0+bWVfdmFsdWU7CisgICAgICAgICAgICAgICAgICAgIGlmICh4ICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5X0lOQ1JFRih4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFBVU0goeCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBnb3RvIGxvYWRfZ2xvYmFsX2Vycm9yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIFRoaXMgaXMgdGhlIHVuLWlubGluZWQgdmVyc2lvbiBvZiB0aGUgY29kZSBhYm92ZSAqLworICAgICAgICAgICAgeCA9IFB5RGljdF9HZXRJdGVtKGYtPmZfZ2xvYmFscywgdyk7CisgICAgICAgICAgICBpZiAoeCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgeCA9IFB5RGljdF9HZXRJdGVtKGYtPmZfYnVpbHRpbnMsIHcpOworICAgICAgICAgICAgICAgIGlmICh4ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgIGxvYWRfZ2xvYmFsX2Vycm9yOgorICAgICAgICAgICAgICAgICAgICBmb3JtYXRfZXhjX2NoZWNrX2FyZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlFeGNfTmFtZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTE9CQUxfTkFNRV9FUlJPUl9NU0csIHcpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQeV9JTkNSRUYoeCk7CisgICAgICAgICAgICBQVVNIKHgpOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBERUxFVEVfRkFTVDoKLQkJCXggPSBHRVRMT0NBTChvcGFyZyk7Ci0JCQlpZiAoeCAhPSBOVUxMKSB7Ci0JCQkJU0VUTE9DQUwob3BhcmcsIE5VTEwpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJZm9ybWF0X2V4Y19jaGVja19hcmcoCi0JCQkJUHlFeGNfVW5ib3VuZExvY2FsRXJyb3IsCi0JCQkJVU5CT1VORExPQ0FMX0VSUk9SX01TRywKLQkJCQlQeVR1cGxlX0dldEl0ZW0oY28tPmNvX3Zhcm5hbWVzLCBvcGFyZykKLQkJCQkpOwotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgREVMRVRFX0ZBU1Q6CisgICAgICAgICAgICB4ID0gR0VUTE9DQUwob3BhcmcpOworICAgICAgICAgICAgaWYgKHggIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFNFVExPQ0FMKG9wYXJnLCBOVUxMKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvcm1hdF9leGNfY2hlY2tfYXJnKAorICAgICAgICAgICAgICAgIFB5RXhjX1VuYm91bmRMb2NhbEVycm9yLAorICAgICAgICAgICAgICAgIFVOQk9VTkRMT0NBTF9FUlJPUl9NU0csCisgICAgICAgICAgICAgICAgUHlUdXBsZV9HZXRJdGVtKGNvLT5jb192YXJuYW1lcywgb3BhcmcpCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgTE9BRF9DTE9TVVJFOgotCQkJeCA9IGZyZWV2YXJzW29wYXJnXTsKLQkJCVB5X0lOQ1JFRih4KTsKLQkJCVBVU0goeCk7Ci0JCQlpZiAoeCAhPSBOVUxMKSBjb250aW51ZTsKLQkJCWJyZWFrOworICAgICAgICBjYXNlIExPQURfQ0xPU1VSRToKKyAgICAgICAgICAgIHggPSBmcmVldmFyc1tvcGFyZ107CisgICAgICAgICAgICBQeV9JTkNSRUYoeCk7CisgICAgICAgICAgICBQVVNIKHgpOworICAgICAgICAgICAgaWYgKHggIT0gTlVMTCkgY29udGludWU7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIExPQURfREVSRUY6Ci0JCQl4ID0gZnJlZXZhcnNbb3BhcmddOwotCQkJdyA9IFB5Q2VsbF9HZXQoeCk7Ci0JCQlpZiAodyAhPSBOVUxMKSB7Ci0JCQkJUFVTSCh3KTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWVyciA9IC0xOwotCQkJLyogRG9uJ3Qgc3RvbXAgZXhpc3RpbmcgZXhjZXB0aW9uICovCi0JCQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkKLQkJCQlicmVhazsKLQkJCWlmIChvcGFyZyA8IFB5VHVwbGVfR0VUX1NJWkUoY28tPmNvX2NlbGx2YXJzKSkgewotCQkJCXYgPSBQeVR1cGxlX0dFVF9JVEVNKGNvLT5jb19jZWxsdmFycywKLQkJCQkJCSAgICAgICBvcGFyZyk7Ci0JCQkgICAgICAgZm9ybWF0X2V4Y19jaGVja19hcmcoCi0JCQkJICAgICAgIFB5RXhjX1VuYm91bmRMb2NhbEVycm9yLAotCQkJCSAgICAgICBVTkJPVU5ETE9DQUxfRVJST1JfTVNHLAotCQkJCSAgICAgICB2KTsKLQkJCX0gZWxzZSB7Ci0JCQkJdiA9IFB5VHVwbGVfR0VUX0lURU0oY28tPmNvX2ZyZWV2YXJzLCBvcGFyZyAtCi0JCQkJCVB5VHVwbGVfR0VUX1NJWkUoY28tPmNvX2NlbGx2YXJzKSk7Ci0JCQkJZm9ybWF0X2V4Y19jaGVja19hcmcoUHlFeGNfTmFtZUVycm9yLAotCQkJCQkJICAgICBVTkJPVU5ERlJFRV9FUlJPUl9NU0csIHYpOwotCQkJfQotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgTE9BRF9ERVJFRjoKKyAgICAgICAgICAgIHggPSBmcmVldmFyc1tvcGFyZ107CisgICAgICAgICAgICB3ID0gUHlDZWxsX0dldCh4KTsKKyAgICAgICAgICAgIGlmICh3ICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQVVNIKHcpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZXJyID0gLTE7CisgICAgICAgICAgICAvKiBEb24ndCBzdG9tcCBleGlzdGluZyBleGNlcHRpb24gKi8KKyAgICAgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgaWYgKG9wYXJnIDwgUHlUdXBsZV9HRVRfU0laRShjby0+Y29fY2VsbHZhcnMpKSB7CisgICAgICAgICAgICAgICAgdiA9IFB5VHVwbGVfR0VUX0lURU0oY28tPmNvX2NlbGx2YXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BhcmcpOworICAgICAgICAgICAgICAgICAgIGZvcm1hdF9leGNfY2hlY2tfYXJnKAorICAgICAgICAgICAgICAgICAgICAgICBQeUV4Y19VbmJvdW5kTG9jYWxFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgVU5CT1VORExPQ0FMX0VSUk9SX01TRywKKyAgICAgICAgICAgICAgICAgICAgICAgdik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHYgPSBQeVR1cGxlX0dFVF9JVEVNKGNvLT5jb19mcmVldmFycywgb3BhcmcgLQorICAgICAgICAgICAgICAgICAgICBQeVR1cGxlX0dFVF9TSVpFKGNvLT5jb19jZWxsdmFycykpOworICAgICAgICAgICAgICAgIGZvcm1hdF9leGNfY2hlY2tfYXJnKFB5RXhjX05hbWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTkJPVU5ERlJFRV9FUlJPUl9NU0csIHYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBTVE9SRV9ERVJFRjoKLQkJCXcgPSBQT1AoKTsKLQkJCXggPSBmcmVldmFyc1tvcGFyZ107Ci0JCQlQeUNlbGxfU2V0KHgsIHcpOwotCQkJUHlfREVDUkVGKHcpOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgU1RPUkVfREVSRUY6CisgICAgICAgICAgICB3ID0gUE9QKCk7CisgICAgICAgICAgICB4ID0gZnJlZXZhcnNbb3BhcmddOworICAgICAgICAgICAgUHlDZWxsX1NldCh4LCB3KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih3KTsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgQlVJTERfVFVQTEU6Ci0JCQl4ID0gUHlUdXBsZV9OZXcob3BhcmcpOwotCQkJaWYgKHggIT0gTlVMTCkgewotCQkJCWZvciAoOyAtLW9wYXJnID49IDA7KSB7Ci0JCQkJCXcgPSBQT1AoKTsKLQkJCQkJUHlUdXBsZV9TRVRfSVRFTSh4LCBvcGFyZywgdyk7Ci0JCQkJfQotCQkJCVBVU0goeCk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBCVUlMRF9UVVBMRToKKyAgICAgICAgICAgIHggPSBQeVR1cGxlX05ldyhvcGFyZyk7CisgICAgICAgICAgICBpZiAoeCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgZm9yICg7IC0tb3BhcmcgPj0gMDspIHsKKyAgICAgICAgICAgICAgICAgICAgdyA9IFBPUCgpOworICAgICAgICAgICAgICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKHgsIG9wYXJnLCB3KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgUFVTSCh4KTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgQlVJTERfTElTVDoKLQkJCXggPSAgUHlMaXN0X05ldyhvcGFyZyk7Ci0JCQlpZiAoeCAhPSBOVUxMKSB7Ci0JCQkJZm9yICg7IC0tb3BhcmcgPj0gMDspIHsKLQkJCQkJdyA9IFBPUCgpOwotCQkJCQlQeUxpc3RfU0VUX0lURU0oeCwgb3BhcmcsIHcpOwotCQkJCX0KLQkJCQlQVVNIKHgpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgQlVJTERfTElTVDoKKyAgICAgICAgICAgIHggPSAgUHlMaXN0X05ldyhvcGFyZyk7CisgICAgICAgICAgICBpZiAoeCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgZm9yICg7IC0tb3BhcmcgPj0gMDspIHsKKyAgICAgICAgICAgICAgICAgICAgdyA9IFBPUCgpOworICAgICAgICAgICAgICAgICAgICBQeUxpc3RfU0VUX0lURU0oeCwgb3BhcmcsIHcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBQVVNIKHgpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBCVUlMRF9NQVA6Ci0JCQl4ID0gX1B5RGljdF9OZXdQcmVzaXplZCgoUHlfc3NpemVfdClvcGFyZyk7Ci0JCQlQVVNIKHgpOwotCQkJaWYgKHggIT0gTlVMTCkgY29udGludWU7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBCVUlMRF9NQVA6CisgICAgICAgICAgICB4ID0gX1B5RGljdF9OZXdQcmVzaXplZCgoUHlfc3NpemVfdClvcGFyZyk7CisgICAgICAgICAgICBQVVNIKHgpOworICAgICAgICAgICAgaWYgKHggIT0gTlVMTCkgY29udGludWU7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIFNUT1JFX01BUDoKLQkJCXcgPSBUT1AoKTsgICAgIC8qIGtleSAqLwotCQkJdSA9IFNFQ09ORCgpOyAgLyogdmFsdWUgKi8KLQkJCXYgPSBUSElSRCgpOyAgIC8qIGRpY3QgKi8KLQkJCVNUQUNLQURKKC0yKTsKLQkJCWFzc2VydCAoUHlEaWN0X0NoZWNrRXhhY3QodikpOwotCQkJZXJyID0gUHlEaWN0X1NldEl0ZW0odiwgdywgdSk7ICAvKiB2W3ddID0gdSAqLwotCQkJUHlfREVDUkVGKHUpOwotCQkJUHlfREVDUkVGKHcpOwotCQkJaWYgKGVyciA9PSAwKSBjb250aW51ZTsKLQkJCWJyZWFrOworICAgICAgICBjYXNlIFNUT1JFX01BUDoKKyAgICAgICAgICAgIHcgPSBUT1AoKTsgICAgIC8qIGtleSAqLworICAgICAgICAgICAgdSA9IFNFQ09ORCgpOyAgLyogdmFsdWUgKi8KKyAgICAgICAgICAgIHYgPSBUSElSRCgpOyAgIC8qIGRpY3QgKi8KKyAgICAgICAgICAgIFNUQUNLQURKKC0yKTsKKyAgICAgICAgICAgIGFzc2VydCAoUHlEaWN0X0NoZWNrRXhhY3QodikpOworICAgICAgICAgICAgZXJyID0gUHlEaWN0X1NldEl0ZW0odiwgdywgdSk7ICAvKiB2W3ddID0gdSAqLworICAgICAgICAgICAgUHlfREVDUkVGKHUpOworICAgICAgICAgICAgUHlfREVDUkVGKHcpOworICAgICAgICAgICAgaWYgKGVyciA9PSAwKSBjb250aW51ZTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgTE9BRF9BVFRSOgotCQkJdyA9IEdFVElURU0obmFtZXMsIG9wYXJnKTsKLQkJCXYgPSBUT1AoKTsKLQkJCXggPSBQeU9iamVjdF9HZXRBdHRyKHYsIHcpOwotCQkJUHlfREVDUkVGKHYpOwotCQkJU0VUX1RPUCh4KTsKLQkJCWlmICh4ICE9IE5VTEwpIGNvbnRpbnVlOwotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgTE9BRF9BVFRSOgorICAgICAgICAgICAgdyA9IEdFVElURU0obmFtZXMsIG9wYXJnKTsKKyAgICAgICAgICAgIHYgPSBUT1AoKTsKKyAgICAgICAgICAgIHggPSBQeU9iamVjdF9HZXRBdHRyKHYsIHcpOworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgU0VUX1RPUCh4KTsKKyAgICAgICAgICAgIGlmICh4ICE9IE5VTEwpIGNvbnRpbnVlOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBDT01QQVJFX09QOgotCQkJdyA9IFBPUCgpOwotCQkJdiA9IFRPUCgpOwotCQkJaWYgKFB5SW50X0NoZWNrRXhhY3QodykgJiYgUHlJbnRfQ2hlY2tFeGFjdCh2KSkgewotCQkJCS8qIElOTElORTogY21wKGludCwgaW50KSAqLwotCQkJCXJlZ2lzdGVyIGxvbmcgYSwgYjsKLQkJCQlyZWdpc3RlciBpbnQgcmVzOwotCQkJCWEgPSBQeUludF9BU19MT05HKHYpOwotCQkJCWIgPSBQeUludF9BU19MT05HKHcpOwotCQkJCXN3aXRjaCAob3BhcmcpIHsKLQkJCQljYXNlIFB5Q21wX0xUOiByZXMgPSBhIDwgIGI7IGJyZWFrOwotCQkJCWNhc2UgUHlDbXBfTEU6IHJlcyA9IGEgPD0gYjsgYnJlYWs7Ci0JCQkJY2FzZSBQeUNtcF9FUTogcmVzID0gYSA9PSBiOyBicmVhazsKLQkJCQljYXNlIFB5Q21wX05FOiByZXMgPSBhICE9IGI7IGJyZWFrOwotCQkJCWNhc2UgUHlDbXBfR1Q6IHJlcyA9IGEgPiAgYjsgYnJlYWs7Ci0JCQkJY2FzZSBQeUNtcF9HRTogcmVzID0gYSA+PSBiOyBicmVhazsKLQkJCQljYXNlIFB5Q21wX0lTOiByZXMgPSB2ID09IHc7IGJyZWFrOwotCQkJCWNhc2UgUHlDbXBfSVNfTk9UOiByZXMgPSB2ICE9IHc7IGJyZWFrOwotCQkJCWRlZmF1bHQ6IGdvdG8gc2xvd19jb21wYXJlOwotCQkJCX0KLQkJCQl4ID0gcmVzID8gUHlfVHJ1ZSA6IFB5X0ZhbHNlOwotCQkJCVB5X0lOQ1JFRih4KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJICBzbG93X2NvbXBhcmU6Ci0JCQkJeCA9IGNtcF9vdXRjb21lKG9wYXJnLCB2LCB3KTsKLQkJCX0KLQkJCVB5X0RFQ1JFRih2KTsKLQkJCVB5X0RFQ1JFRih3KTsKLQkJCVNFVF9UT1AoeCk7Ci0JCQlpZiAoeCA9PSBOVUxMKSBicmVhazsKLQkJCVBSRURJQ1QoSlVNUF9JRl9GQUxTRSk7Ci0JCQlQUkVESUNUKEpVTVBfSUZfVFJVRSk7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBDT01QQVJFX09QOgorICAgICAgICAgICAgdyA9IFBPUCgpOworICAgICAgICAgICAgdiA9IFRPUCgpOworICAgICAgICAgICAgaWYgKFB5SW50X0NoZWNrRXhhY3QodykgJiYgUHlJbnRfQ2hlY2tFeGFjdCh2KSkgeworICAgICAgICAgICAgICAgIC8qIElOTElORTogY21wKGludCwgaW50KSAqLworICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGxvbmcgYSwgYjsKKyAgICAgICAgICAgICAgICByZWdpc3RlciBpbnQgcmVzOworICAgICAgICAgICAgICAgIGEgPSBQeUludF9BU19MT05HKHYpOworICAgICAgICAgICAgICAgIGIgPSBQeUludF9BU19MT05HKHcpOworICAgICAgICAgICAgICAgIHN3aXRjaCAob3BhcmcpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFB5Q21wX0xUOiByZXMgPSBhIDwgIGI7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUHlDbXBfTEU6IHJlcyA9IGEgPD0gYjsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBQeUNtcF9FUTogcmVzID0gYSA9PSBiOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFB5Q21wX05FOiByZXMgPSBhICE9IGI7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUHlDbXBfR1Q6IHJlcyA9IGEgPiAgYjsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBQeUNtcF9HRTogcmVzID0gYSA+PSBiOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFB5Q21wX0lTOiByZXMgPSB2ID09IHc7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUHlDbXBfSVNfTk9UOiByZXMgPSB2ICE9IHc7IGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGdvdG8gc2xvd19jb21wYXJlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB4ID0gcmVzID8gUHlfVHJ1ZSA6IFB5X0ZhbHNlOworICAgICAgICAgICAgICAgIFB5X0lOQ1JFRih4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICBzbG93X2NvbXBhcmU6CisgICAgICAgICAgICAgICAgeCA9IGNtcF9vdXRjb21lKG9wYXJnLCB2LCB3KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih3KTsKKyAgICAgICAgICAgIFNFVF9UT1AoeCk7CisgICAgICAgICAgICBpZiAoeCA9PSBOVUxMKSBicmVhazsKKyAgICAgICAgICAgIFBSRURJQ1QoSlVNUF9JRl9GQUxTRSk7CisgICAgICAgICAgICBQUkVESUNUKEpVTVBfSUZfVFJVRSk7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIElNUE9SVF9OQU1FOgotCQkJdyA9IEdFVElURU0obmFtZXMsIG9wYXJnKTsKLQkJCXggPSBQeURpY3RfR2V0SXRlbVN0cmluZyhmLT5mX2J1aWx0aW5zLCAiX19pbXBvcnRfXyIpOwotCQkJaWYgKHggPT0gTlVMTCkgewotCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwKLQkJCQkJCSJfX2ltcG9ydF9fIG5vdCBmb3VuZCIpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJUHlfSU5DUkVGKHgpOwotCQkJdiA9IFBPUCgpOwotCQkJdSA9IFRPUCgpOwotCQkJaWYgKFB5SW50X0FzTG9uZyh1KSAhPSAtMSB8fCBQeUVycl9PY2N1cnJlZCgpKQotCQkJCXcgPSBQeVR1cGxlX1BhY2soNSwKLQkJCQkJICAgIHcsCi0JCQkJCSAgICBmLT5mX2dsb2JhbHMsCi0JCQkJCSAgICBmLT5mX2xvY2FscyA9PSBOVUxMID8KLQkJCQkJCSAgUHlfTm9uZSA6IGYtPmZfbG9jYWxzLAotCQkJCQkgICAgdiwKLQkJCQkJICAgIHUpOwotCQkJZWxzZQotCQkJCXcgPSBQeVR1cGxlX1BhY2soNCwKLQkJCQkJICAgIHcsCi0JCQkJCSAgICBmLT5mX2dsb2JhbHMsCi0JCQkJCSAgICBmLT5mX2xvY2FscyA9PSBOVUxMID8KLQkJCQkJCSAgUHlfTm9uZSA6IGYtPmZfbG9jYWxzLAotCQkJCQkgICAgdik7Ci0JCQlQeV9ERUNSRUYodik7Ci0JCQlQeV9ERUNSRUYodSk7Ci0JCQlpZiAodyA9PSBOVUxMKSB7Ci0JCQkJdSA9IFBPUCgpOwotCQkJCVB5X0RFQ1JFRih4KTsKLQkJCQl4ID0gTlVMTDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCVJFQURfVElNRVNUQU1QKGludHIwKTsKLQkJCXYgPSB4OwotCQkJeCA9IFB5RXZhbF9DYWxsT2JqZWN0KHYsIHcpOwotCQkJUHlfREVDUkVGKHYpOwotCQkJUkVBRF9USU1FU1RBTVAoaW50cjEpOwotCQkJUHlfREVDUkVGKHcpOwotCQkJU0VUX1RPUCh4KTsKLQkJCWlmICh4ICE9IE5VTEwpIGNvbnRpbnVlOwotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgSU1QT1JUX05BTUU6CisgICAgICAgICAgICB3ID0gR0VUSVRFTShuYW1lcywgb3BhcmcpOworICAgICAgICAgICAgeCA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKGYtPmZfYnVpbHRpbnMsICJfX2ltcG9ydF9fIik7CisgICAgICAgICAgICBpZiAoeCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0ltcG9ydEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX19pbXBvcnRfXyBub3QgZm91bmQiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5X0lOQ1JFRih4KTsKKyAgICAgICAgICAgIHYgPSBQT1AoKTsKKyAgICAgICAgICAgIHUgPSBUT1AoKTsKKyAgICAgICAgICAgIGlmIChQeUludF9Bc0xvbmcodSkgIT0gLTEgfHwgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgICAgICB3ID0gUHlUdXBsZV9QYWNrKDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLT5mX2dsb2JhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi0+Zl9sb2NhbHMgPT0gTlVMTCA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfTm9uZSA6IGYtPmZfbG9jYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdyA9IFB5VHVwbGVfUGFjayg0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi0+Zl9nbG9iYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYtPmZfbG9jYWxzID09IE5VTEwgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X05vbmUgOiBmLT5mX2xvY2FscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih1KTsKKyAgICAgICAgICAgIGlmICh3ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICB1ID0gUE9QKCk7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHgpOworICAgICAgICAgICAgICAgIHggPSBOVUxMOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUkVBRF9USU1FU1RBTVAoaW50cjApOworICAgICAgICAgICAgdiA9IHg7CisgICAgICAgICAgICB4ID0gUHlFdmFsX0NhbGxPYmplY3Qodiwgdyk7CisgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICBSRUFEX1RJTUVTVEFNUChpbnRyMSk7CisgICAgICAgICAgICBQeV9ERUNSRUYodyk7CisgICAgICAgICAgICBTRVRfVE9QKHgpOworICAgICAgICAgICAgaWYgKHggIT0gTlVMTCkgY29udGludWU7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIElNUE9SVF9TVEFSOgotCQkJdiA9IFBPUCgpOwotCQkJUHlGcmFtZV9GYXN0VG9Mb2NhbHMoZik7Ci0JCQlpZiAoKHggPSBmLT5mX2xvY2FscykgPT0gTlVMTCkgewotCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKLQkJCQkJIm5vIGxvY2FscyBmb3VuZCBkdXJpbmcgJ2ltcG9ydCAqJyIpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJUkVBRF9USU1FU1RBTVAoaW50cjApOwotCQkJZXJyID0gaW1wb3J0X2FsbF9mcm9tKHgsIHYpOwotCQkJUkVBRF9USU1FU1RBTVAoaW50cjEpOwotCQkJUHlGcmFtZV9Mb2NhbHNUb0Zhc3QoZiwgMCk7Ci0JCQlQeV9ERUNSRUYodik7Ci0JCQlpZiAoZXJyID09IDApIGNvbnRpbnVlOwotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgSU1QT1JUX1NUQVI6CisgICAgICAgICAgICB2ID0gUE9QKCk7CisgICAgICAgICAgICBQeUZyYW1lX0Zhc3RUb0xvY2FscyhmKTsKKyAgICAgICAgICAgIGlmICgoeCA9IGYtPmZfbG9jYWxzKSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgICAgICAgICAibm8gbG9jYWxzIGZvdW5kIGR1cmluZyAnaW1wb3J0IConIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBSRUFEX1RJTUVTVEFNUChpbnRyMCk7CisgICAgICAgICAgICBlcnIgPSBpbXBvcnRfYWxsX2Zyb20oeCwgdik7CisgICAgICAgICAgICBSRUFEX1RJTUVTVEFNUChpbnRyMSk7CisgICAgICAgICAgICBQeUZyYW1lX0xvY2Fsc1RvRmFzdChmLCAwKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gMCkgY29udGludWU7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIElNUE9SVF9GUk9NOgotCQkJdyA9IEdFVElURU0obmFtZXMsIG9wYXJnKTsKLQkJCXYgPSBUT1AoKTsKLQkJCVJFQURfVElNRVNUQU1QKGludHIwKTsKLQkJCXggPSBpbXBvcnRfZnJvbSh2LCB3KTsKLQkJCVJFQURfVElNRVNUQU1QKGludHIxKTsKLQkJCVBVU0goeCk7Ci0JCQlpZiAoeCAhPSBOVUxMKSBjb250aW51ZTsKLQkJCWJyZWFrOworICAgICAgICBjYXNlIElNUE9SVF9GUk9NOgorICAgICAgICAgICAgdyA9IEdFVElURU0obmFtZXMsIG9wYXJnKTsKKyAgICAgICAgICAgIHYgPSBUT1AoKTsKKyAgICAgICAgICAgIFJFQURfVElNRVNUQU1QKGludHIwKTsKKyAgICAgICAgICAgIHggPSBpbXBvcnRfZnJvbSh2LCB3KTsKKyAgICAgICAgICAgIFJFQURfVElNRVNUQU1QKGludHIxKTsKKyAgICAgICAgICAgIFBVU0goeCk7CisgICAgICAgICAgICBpZiAoeCAhPSBOVUxMKSBjb250aW51ZTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgSlVNUF9GT1JXQVJEOgotCQkJSlVNUEJZKG9wYXJnKTsKLQkJCWdvdG8gZmFzdF9uZXh0X29wY29kZTsKKyAgICAgICAgY2FzZSBKVU1QX0ZPUldBUkQ6CisgICAgICAgICAgICBKVU1QQlkob3BhcmcpOworICAgICAgICAgICAgZ290byBmYXN0X25leHRfb3Bjb2RlOwogCi0JCVBSRURJQ1RFRF9XSVRIX0FSRyhKVU1QX0lGX0ZBTFNFKTsKLQkJY2FzZSBKVU1QX0lGX0ZBTFNFOgotCQkJdyA9IFRPUCgpOwotCQkJaWYgKHcgPT0gUHlfVHJ1ZSkgewotCQkJCVBSRURJQ1QoUE9QX1RPUCk7Ci0JCQkJZ290byBmYXN0X25leHRfb3Bjb2RlOwotCQkJfQotCQkJaWYgKHcgPT0gUHlfRmFsc2UpIHsKLQkJCQlKVU1QQlkob3BhcmcpOwotCQkJCWdvdG8gZmFzdF9uZXh0X29wY29kZTsKLQkJCX0KLQkJCWVyciA9IFB5T2JqZWN0X0lzVHJ1ZSh3KTsKLQkJCWlmIChlcnIgPiAwKQotCQkJCWVyciA9IDA7Ci0JCQllbHNlIGlmIChlcnIgPT0gMCkKLQkJCQlKVU1QQlkob3BhcmcpOwotCQkJZWxzZQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIFBSRURJQ1RFRF9XSVRIX0FSRyhKVU1QX0lGX0ZBTFNFKTsKKyAgICAgICAgY2FzZSBKVU1QX0lGX0ZBTFNFOgorICAgICAgICAgICAgdyA9IFRPUCgpOworICAgICAgICAgICAgaWYgKHcgPT0gUHlfVHJ1ZSkgeworICAgICAgICAgICAgICAgIFBSRURJQ1QoUE9QX1RPUCk7CisgICAgICAgICAgICAgICAgZ290byBmYXN0X25leHRfb3Bjb2RlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHcgPT0gUHlfRmFsc2UpIHsKKyAgICAgICAgICAgICAgICBKVU1QQlkob3BhcmcpOworICAgICAgICAgICAgICAgIGdvdG8gZmFzdF9uZXh0X29wY29kZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVyciA9IFB5T2JqZWN0X0lzVHJ1ZSh3KTsKKyAgICAgICAgICAgIGlmIChlcnIgPiAwKQorICAgICAgICAgICAgICAgIGVyciA9IDA7CisgICAgICAgICAgICBlbHNlIGlmIChlcnIgPT0gMCkKKyAgICAgICAgICAgICAgICBKVU1QQlkob3BhcmcpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJUFJFRElDVEVEX1dJVEhfQVJHKEpVTVBfSUZfVFJVRSk7Ci0JCWNhc2UgSlVNUF9JRl9UUlVFOgotCQkJdyA9IFRPUCgpOwotCQkJaWYgKHcgPT0gUHlfRmFsc2UpIHsKLQkJCQlQUkVESUNUKFBPUF9UT1ApOwotCQkJCWdvdG8gZmFzdF9uZXh0X29wY29kZTsKLQkJCX0KLQkJCWlmICh3ID09IFB5X1RydWUpIHsKLQkJCQlKVU1QQlkob3BhcmcpOwotCQkJCWdvdG8gZmFzdF9uZXh0X29wY29kZTsKLQkJCX0KLQkJCWVyciA9IFB5T2JqZWN0X0lzVHJ1ZSh3KTsKLQkJCWlmIChlcnIgPiAwKSB7Ci0JCQkJZXJyID0gMDsKLQkJCQlKVU1QQlkob3BhcmcpOwotCQkJfQotCQkJZWxzZSBpZiAoZXJyID09IDApCi0JCQkJOwotCQkJZWxzZQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIFBSRURJQ1RFRF9XSVRIX0FSRyhKVU1QX0lGX1RSVUUpOworICAgICAgICBjYXNlIEpVTVBfSUZfVFJVRToKKyAgICAgICAgICAgIHcgPSBUT1AoKTsKKyAgICAgICAgICAgIGlmICh3ID09IFB5X0ZhbHNlKSB7CisgICAgICAgICAgICAgICAgUFJFRElDVChQT1BfVE9QKTsKKyAgICAgICAgICAgICAgICBnb3RvIGZhc3RfbmV4dF9vcGNvZGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodyA9PSBQeV9UcnVlKSB7CisgICAgICAgICAgICAgICAgSlVNUEJZKG9wYXJnKTsKKyAgICAgICAgICAgICAgICBnb3RvIGZhc3RfbmV4dF9vcGNvZGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlcnIgPSBQeU9iamVjdF9Jc1RydWUodyk7CisgICAgICAgICAgICBpZiAoZXJyID4gMCkgeworICAgICAgICAgICAgICAgIGVyciA9IDA7CisgICAgICAgICAgICAgICAgSlVNUEJZKG9wYXJnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGVyciA9PSAwKQorICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCVBSRURJQ1RFRF9XSVRIX0FSRyhKVU1QX0FCU09MVVRFKTsKLQkJY2FzZSBKVU1QX0FCU09MVVRFOgotCQkJSlVNUFRPKG9wYXJnKTsKKyAgICAgICAgUFJFRElDVEVEX1dJVEhfQVJHKEpVTVBfQUJTT0xVVEUpOworICAgICAgICBjYXNlIEpVTVBfQUJTT0xVVEU6CisgICAgICAgICAgICBKVU1QVE8ob3BhcmcpOwogI2lmIEZBU1RfTE9PUFMKLQkJCS8qIEVuYWJsaW5nIHRoaXMgcGF0aCBzcGVlZHMtdXAgYWxsIHdoaWxlIGFuZCBmb3ItbG9vcHMgYnkgYnlwYXNzaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcGVyLWxvb3AgY2hlY2tzIGZvciBzaWduYWxzLiAgQnkgZGVmYXVsdCwgdGhpcyBzaG91bGQgYmUgdHVybmVkLW9mZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVjYXVzZSBpdCBwcmV2ZW50cyBkZXRlY3Rpb24gb2YgYSBjb250cm9sLWJyZWFrIGluIHRpZ2h0IGxvb3BzIGxpa2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aGlsZSAxOiBwYXNzIi4gIENvbXBpbGUgd2l0aCB0aGlzIG9wdGlvbiB0dXJuZWQtb24gd2hlbiB5b3UgbmVlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHNwZWVkLXVwIGFuZCBkbyBub3QgbmVlZCBicmVhayBjaGVja2luZyBpbnNpZGUgdGlnaHQgbG9vcHMgKG9uZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgY29udGFpbiBvbmx5IGluc3RydWN0aW9ucyBlbmRpbmcgd2l0aCBnb3RvIGZhc3RfbmV4dF9vcGNvZGUpLgotICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQkJCWdvdG8gZmFzdF9uZXh0X29wY29kZTsKKyAgICAgICAgICAgIC8qIEVuYWJsaW5nIHRoaXMgcGF0aCBzcGVlZHMtdXAgYWxsIHdoaWxlIGFuZCBmb3ItbG9vcHMgYnkgYnlwYXNzaW5nCisgICAgICAgICAgICAgICB0aGUgcGVyLWxvb3AgY2hlY2tzIGZvciBzaWduYWxzLiAgQnkgZGVmYXVsdCwgdGhpcyBzaG91bGQgYmUgdHVybmVkLW9mZgorICAgICAgICAgICAgICAgYmVjYXVzZSBpdCBwcmV2ZW50cyBkZXRlY3Rpb24gb2YgYSBjb250cm9sLWJyZWFrIGluIHRpZ2h0IGxvb3BzIGxpa2UKKyAgICAgICAgICAgICAgICJ3aGlsZSAxOiBwYXNzIi4gIENvbXBpbGUgd2l0aCB0aGlzIG9wdGlvbiB0dXJuZWQtb24gd2hlbiB5b3UgbmVlZAorICAgICAgICAgICAgICAgdGhlIHNwZWVkLXVwIGFuZCBkbyBub3QgbmVlZCBicmVhayBjaGVja2luZyBpbnNpZGUgdGlnaHQgbG9vcHMgKG9uZXMKKyAgICAgICAgICAgICAgIHRoYXQgY29udGFpbiBvbmx5IGluc3RydWN0aW9ucyBlbmRpbmcgd2l0aCBnb3RvIGZhc3RfbmV4dF9vcGNvZGUpLgorICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGdvdG8gZmFzdF9uZXh0X29wY29kZTsKICNlbHNlCi0JCQljb250aW51ZTsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogI2VuZGlmCiAKLQkJY2FzZSBHRVRfSVRFUjoKLQkJCS8qIGJlZm9yZTogW29ial07IGFmdGVyIFtnZXRpdGVyKG9iaildICovCi0JCQl2ID0gVE9QKCk7Ci0JCQl4ID0gUHlPYmplY3RfR2V0SXRlcih2KTsKLQkJCVB5X0RFQ1JFRih2KTsKLQkJCWlmICh4ICE9IE5VTEwpIHsKLQkJCQlTRVRfVE9QKHgpOwotCQkJCVBSRURJQ1QoRk9SX0lURVIpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJU1RBQ0tBREooLTEpOwotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgR0VUX0lURVI6CisgICAgICAgICAgICAvKiBiZWZvcmU6IFtvYmpdOyBhZnRlciBbZ2V0aXRlcihvYmopXSAqLworICAgICAgICAgICAgdiA9IFRPUCgpOworICAgICAgICAgICAgeCA9IFB5T2JqZWN0X0dldEl0ZXIodik7CisgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICBpZiAoeCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgU0VUX1RPUCh4KTsKKyAgICAgICAgICAgICAgICBQUkVESUNUKEZPUl9JVEVSKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFNUQUNLQURKKC0xKTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCVBSRURJQ1RFRF9XSVRIX0FSRyhGT1JfSVRFUik7Ci0JCWNhc2UgRk9SX0lURVI6Ci0JCQkvKiBiZWZvcmU6IFtpdGVyXTsgYWZ0ZXI6IFtpdGVyLCBpdGVyKCldICpvciogW10gKi8KLQkJCXYgPSBUT1AoKTsKLQkJCXggPSAoKnYtPm9iX3R5cGUtPnRwX2l0ZXJuZXh0KSh2KTsKLQkJCWlmICh4ICE9IE5VTEwpIHsKLQkJCQlQVVNIKHgpOwotCQkJCVBSRURJQ1QoU1RPUkVfRkFTVCk7Ci0JCQkJUFJFRElDVChVTlBBQ0tfU0VRVUVOQ0UpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKLQkJCQlpZiAoIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoCi0JCQkJCQlQeUV4Y19TdG9wSXRlcmF0aW9uKSkKLQkJCQkJYnJlYWs7Ci0JCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCX0KLQkJCS8qIGl0ZXJhdG9yIGVuZGVkIG5vcm1hbGx5ICovCi0gCQkJeCA9IHYgPSBQT1AoKTsKLQkJCVB5X0RFQ1JFRih2KTsKLQkJCUpVTVBCWShvcGFyZyk7Ci0JCQljb250aW51ZTsKKyAgICAgICAgUFJFRElDVEVEX1dJVEhfQVJHKEZPUl9JVEVSKTsKKyAgICAgICAgY2FzZSBGT1JfSVRFUjoKKyAgICAgICAgICAgIC8qIGJlZm9yZTogW2l0ZXJdOyBhZnRlcjogW2l0ZXIsIGl0ZXIoKV0gKm9yKiBbXSAqLworICAgICAgICAgICAgdiA9IFRPUCgpOworICAgICAgICAgICAgeCA9ICgqdi0+b2JfdHlwZS0+dHBfaXRlcm5leHQpKHYpOworICAgICAgICAgICAgaWYgKHggIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFBVU0goeCk7CisgICAgICAgICAgICAgICAgUFJFRElDVChTVE9SRV9GQVNUKTsKKyAgICAgICAgICAgICAgICBQUkVESUNUKFVOUEFDS19TRVFVRU5DRSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICAgICAgICAgIGlmICghUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlFeGNfU3RvcEl0ZXJhdGlvbikpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBpdGVyYXRvciBlbmRlZCBub3JtYWxseSAqLworICAgICAgICAgICAgeCA9IHYgPSBQT1AoKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgIEpVTVBCWShvcGFyZyk7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIEJSRUFLX0xPT1A6Ci0JCQl3aHkgPSBXSFlfQlJFQUs7Ci0JCQlnb3RvIGZhc3RfYmxvY2tfZW5kOworICAgICAgICBjYXNlIEJSRUFLX0xPT1A6CisgICAgICAgICAgICB3aHkgPSBXSFlfQlJFQUs7CisgICAgICAgICAgICBnb3RvIGZhc3RfYmxvY2tfZW5kOwogCi0JCWNhc2UgQ09OVElOVUVfTE9PUDoKLQkJCXJldHZhbCA9IFB5SW50X0Zyb21Mb25nKG9wYXJnKTsKLQkJCWlmICghcmV0dmFsKSB7Ci0JCQkJeCA9IE5VTEw7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQl3aHkgPSBXSFlfQ09OVElOVUU7Ci0JCQlnb3RvIGZhc3RfYmxvY2tfZW5kOworICAgICAgICBjYXNlIENPTlRJTlVFX0xPT1A6CisgICAgICAgICAgICByZXR2YWwgPSBQeUludF9Gcm9tTG9uZyhvcGFyZyk7CisgICAgICAgICAgICBpZiAoIXJldHZhbCkgeworICAgICAgICAgICAgICAgIHggPSBOVUxMOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd2h5ID0gV0hZX0NPTlRJTlVFOworICAgICAgICAgICAgZ290byBmYXN0X2Jsb2NrX2VuZDsKIAotCQljYXNlIFNFVFVQX0xPT1A6Ci0JCWNhc2UgU0VUVVBfRVhDRVBUOgotCQljYXNlIFNFVFVQX0ZJTkFMTFk6Ci0JCQkvKiBOT1RFOiBJZiB5b3UgYWRkIGFueSBuZXcgYmxvY2stc2V0dXAgb3Bjb2RlcyB0aGF0Ci0JCSAgICAgICAgICAgYXJlIG5vdCB0cnkvZXhjZXB0L2ZpbmFsbHkgaGFuZGxlcnMsIHlvdSBtYXkgbmVlZAotCQkgICAgICAgICAgIHRvIHVwZGF0ZSB0aGUgUHlHZW5fTmVlZHNGaW5hbGl6aW5nKCkgZnVuY3Rpb24uCi0JCSAgICAgICAgICAgKi8KKyAgICAgICAgY2FzZSBTRVRVUF9MT09QOgorICAgICAgICBjYXNlIFNFVFVQX0VYQ0VQVDoKKyAgICAgICAgY2FzZSBTRVRVUF9GSU5BTExZOgorICAgICAgICAgICAgLyogTk9URTogSWYgeW91IGFkZCBhbnkgbmV3IGJsb2NrLXNldHVwIG9wY29kZXMgdGhhdAorICAgICAgICAgICAgICAgYXJlIG5vdCB0cnkvZXhjZXB0L2ZpbmFsbHkgaGFuZGxlcnMsIHlvdSBtYXkgbmVlZAorICAgICAgICAgICAgICAgdG8gdXBkYXRlIHRoZSBQeUdlbl9OZWVkc0ZpbmFsaXppbmcoKSBmdW5jdGlvbi4KKyAgICAgICAgICAgICAgICovCiAKLQkJCVB5RnJhbWVfQmxvY2tTZXR1cChmLCBvcGNvZGUsIElOU1RSX09GRlNFVCgpICsgb3BhcmcsCi0JCQkJCSAgIFNUQUNLX0xFVkVMKCkpOwotCQkJY29udGludWU7CisgICAgICAgICAgICBQeUZyYW1lX0Jsb2NrU2V0dXAoZiwgb3Bjb2RlLCBJTlNUUl9PRkZTRVQoKSArIG9wYXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUQUNLX0xFVkVMKCkpOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBXSVRIX0NMRUFOVVA6Ci0JCXsKLQkJCS8qIEF0IHRoZSB0b3Agb2YgdGhlIHN0YWNrIGFyZSAxLTMgdmFsdWVzIGluZGljYXRpbmcKLQkJCSAgIGhvdy93aHkgd2UgZW50ZXJlZCB0aGUgZmluYWxseSBjbGF1c2U6Ci0JCQkgICAtIFRPUCA9IE5vbmUKLQkJCSAgIC0gKFRPUCwgU0VDT05EKSA9IChXSFlfe1JFVFVSTixDT05USU5VRX0pLCByZXR2YWwKLQkJCSAgIC0gVE9QID0gV0hZXyo7IG5vIHJldHZhbCBiZWxvdyBpdAotCQkJICAgLSAoVE9QLCBTRUNPTkQsIFRISVJEKSA9IGV4Y19pbmZvKCkKLQkJCSAgIEJlbG93IHRoZW0gaXMgRVhJVCwgdGhlIGNvbnRleHQuX19leGl0X18gYm91bmQgbWV0aG9kLgotCQkJICAgSW4gdGhlIGxhc3QgY2FzZSwgd2UgbXVzdCBjYWxsCi0JCQkgICAgIEVYSVQoVE9QLCBTRUNPTkQsIFRISVJEKQotCQkJICAgb3RoZXJ3aXNlIHdlIG11c3QgY2FsbAotCQkJICAgICBFWElUKE5vbmUsIE5vbmUsIE5vbmUpCisgICAgICAgIGNhc2UgV0lUSF9DTEVBTlVQOgorICAgICAgICB7CisgICAgICAgICAgICAvKiBBdCB0aGUgdG9wIG9mIHRoZSBzdGFjayBhcmUgMS0zIHZhbHVlcyBpbmRpY2F0aW5nCisgICAgICAgICAgICAgICBob3cvd2h5IHdlIGVudGVyZWQgdGhlIGZpbmFsbHkgY2xhdXNlOgorICAgICAgICAgICAgICAgLSBUT1AgPSBOb25lCisgICAgICAgICAgICAgICAtIChUT1AsIFNFQ09ORCkgPSAoV0hZX3tSRVRVUk4sQ09OVElOVUV9KSwgcmV0dmFsCisgICAgICAgICAgICAgICAtIFRPUCA9IFdIWV8qOyBubyByZXR2YWwgYmVsb3cgaXQKKyAgICAgICAgICAgICAgIC0gKFRPUCwgU0VDT05ELCBUSElSRCkgPSBleGNfaW5mbygpCisgICAgICAgICAgICAgICBCZWxvdyB0aGVtIGlzIEVYSVQsIHRoZSBjb250ZXh0Ll9fZXhpdF9fIGJvdW5kIG1ldGhvZC4KKyAgICAgICAgICAgICAgIEluIHRoZSBsYXN0IGNhc2UsIHdlIG11c3QgY2FsbAorICAgICAgICAgICAgICAgICBFWElUKFRPUCwgU0VDT05ELCBUSElSRCkKKyAgICAgICAgICAgICAgIG90aGVyd2lzZSB3ZSBtdXN0IGNhbGwKKyAgICAgICAgICAgICAgICAgRVhJVChOb25lLCBOb25lLCBOb25lKQogCi0JCQkgICBJbiBhbGwgY2FzZXMsIHdlIHJlbW92ZSBFWElUIGZyb20gdGhlIHN0YWNrLCBsZWF2aW5nCi0JCQkgICB0aGUgcmVzdCBpbiB0aGUgc2FtZSBvcmRlci4KKyAgICAgICAgICAgICAgIEluIGFsbCBjYXNlcywgd2UgcmVtb3ZlIEVYSVQgZnJvbSB0aGUgc3RhY2ssIGxlYXZpbmcKKyAgICAgICAgICAgICAgIHRoZSByZXN0IGluIHRoZSBzYW1lIG9yZGVyLgogCi0JCQkgICBJbiBhZGRpdGlvbiwgaWYgdGhlIHN0YWNrIHJlcHJlc2VudHMgYW4gZXhjZXB0aW9uLAotCQkJICAgKmFuZCogdGhlIGZ1bmN0aW9uIGNhbGwgcmV0dXJucyBhICd0cnVlJyB2YWx1ZSwgd2UKLQkJCSAgICJ6YXAiIHRoaXMgaW5mb3JtYXRpb24sIHRvIHByZXZlbnQgRU5EX0ZJTkFMTFkgZnJvbQotCQkJICAgcmUtcmFpc2luZyB0aGUgZXhjZXB0aW9uLiAgKEJ1dCBub24tbG9jYWwgZ290b3MKLQkJCSAgIHNob3VsZCBzdGlsbCBiZSByZXN1bWVkLikKLQkJCSovCisgICAgICAgICAgICAgICBJbiBhZGRpdGlvbiwgaWYgdGhlIHN0YWNrIHJlcHJlc2VudHMgYW4gZXhjZXB0aW9uLAorICAgICAgICAgICAgICAgKmFuZCogdGhlIGZ1bmN0aW9uIGNhbGwgcmV0dXJucyBhICd0cnVlJyB2YWx1ZSwgd2UKKyAgICAgICAgICAgICAgICJ6YXAiIHRoaXMgaW5mb3JtYXRpb24sIHRvIHByZXZlbnQgRU5EX0ZJTkFMTFkgZnJvbQorICAgICAgICAgICAgICAgcmUtcmFpc2luZyB0aGUgZXhjZXB0aW9uLiAgKEJ1dCBub24tbG9jYWwgZ290b3MKKyAgICAgICAgICAgICAgIHNob3VsZCBzdGlsbCBiZSByZXN1bWVkLikKKyAgICAgICAgICAgICovCiAKLQkJCVB5T2JqZWN0ICpleGl0X2Z1bmM7CisgICAgICAgICAgICBQeU9iamVjdCAqZXhpdF9mdW5jOwogCi0JCQl1ID0gUE9QKCk7Ci0JCQlpZiAodSA9PSBQeV9Ob25lKSB7Ci0JCQkgICAgICAgCWV4aXRfZnVuYyA9IFRPUCgpOwotCQkJCVNFVF9UT1AodSk7Ci0JCQkJdiA9IHcgPSBQeV9Ob25lOwotCQkJfQotCQkJZWxzZSBpZiAoUHlJbnRfQ2hlY2sodSkpIHsKLQkJCQlzd2l0Y2goUHlJbnRfQVNfTE9ORyh1KSkgewotCQkJCWNhc2UgV0hZX1JFVFVSTjoKLQkJCQljYXNlIFdIWV9DT05USU5VRToKLQkJCQkJLyogUmV0dmFsIGluIFRPUC4gKi8KLQkJCQkJZXhpdF9mdW5jID0gU0VDT05EKCk7Ci0JCQkJCVNFVF9TRUNPTkQoVE9QKCkpOwotCQkJCQlTRVRfVE9QKHUpOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQlleGl0X2Z1bmMgPSBUT1AoKTsKLQkJCQkJU0VUX1RPUCh1KTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCXUgPSB2ID0gdyA9IFB5X05vbmU7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl2ID0gVE9QKCk7Ci0JCQkJdyA9IFNFQ09ORCgpOwotCQkJCWV4aXRfZnVuYyA9IFRISVJEKCk7Ci0JCQkJU0VUX1RPUCh1KTsKLQkJCQlTRVRfU0VDT05EKHYpOwotCQkJCVNFVF9USElSRCh3KTsKLQkJCX0KLQkJCS8qIFhYWCBOb3QgdGhlIGZhc3Rlc3Qgd2F5IHRvIGNhbGwgaXQuLi4gKi8KLQkJCXggPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGV4aXRfZnVuYywgdSwgdiwgdywKLQkJCQkJCQkgTlVMTCk7Ci0JCQlQeV9ERUNSRUYoZXhpdF9mdW5jKTsKLQkJCWlmICh4ID09IE5VTEwpCi0JCQkJYnJlYWs7IC8qIEdvIHRvIGVycm9yIGV4aXQgKi8KKyAgICAgICAgICAgIHUgPSBQT1AoKTsKKyAgICAgICAgICAgIGlmICh1ID09IFB5X05vbmUpIHsKKyAgICAgICAgICAgICAgICBleGl0X2Z1bmMgPSBUT1AoKTsKKyAgICAgICAgICAgICAgICBTRVRfVE9QKHUpOworICAgICAgICAgICAgICAgIHYgPSB3ID0gUHlfTm9uZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKFB5SW50X0NoZWNrKHUpKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoKFB5SW50X0FTX0xPTkcodSkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFdIWV9SRVRVUk46CisgICAgICAgICAgICAgICAgY2FzZSBXSFlfQ09OVElOVUU6CisgICAgICAgICAgICAgICAgICAgIC8qIFJldHZhbCBpbiBUT1AuICovCisgICAgICAgICAgICAgICAgICAgIGV4aXRfZnVuYyA9IFNFQ09ORCgpOworICAgICAgICAgICAgICAgICAgICBTRVRfU0VDT05EKFRPUCgpKTsKKyAgICAgICAgICAgICAgICAgICAgU0VUX1RPUCh1KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgZXhpdF9mdW5jID0gVE9QKCk7CisgICAgICAgICAgICAgICAgICAgIFNFVF9UT1AodSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB1ID0gdiA9IHcgPSBQeV9Ob25lOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgdiA9IFRPUCgpOworICAgICAgICAgICAgICAgIHcgPSBTRUNPTkQoKTsKKyAgICAgICAgICAgICAgICBleGl0X2Z1bmMgPSBUSElSRCgpOworICAgICAgICAgICAgICAgIFNFVF9UT1AodSk7CisgICAgICAgICAgICAgICAgU0VUX1NFQ09ORCh2KTsKKyAgICAgICAgICAgICAgICBTRVRfVEhJUkQodyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBYWFggTm90IHRoZSBmYXN0ZXN0IHdheSB0byBjYWxsIGl0Li4uICovCisgICAgICAgICAgICB4ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhleGl0X2Z1bmMsIHUsIHYsIHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihleGl0X2Z1bmMpOworICAgICAgICAgICAgaWYgKHggPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBicmVhazsgLyogR28gdG8gZXJyb3IgZXhpdCAqLwogCi0JCQlpZiAodSAhPSBQeV9Ob25lKQotCQkJCWVyciA9IFB5T2JqZWN0X0lzVHJ1ZSh4KTsKLQkJCWVsc2UKLQkJCQllcnIgPSAwOwotCQkJUHlfREVDUkVGKHgpOworICAgICAgICAgICAgaWYgKHUgIT0gUHlfTm9uZSkKKyAgICAgICAgICAgICAgICBlcnIgPSBQeU9iamVjdF9Jc1RydWUoeCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZXJyID0gMDsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih4KTsKIAotCQkJaWYgKGVyciA8IDApCi0JCQkJYnJlYWs7IC8qIEdvIHRvIGVycm9yIGV4aXQgKi8KLQkJCWVsc2UgaWYgKGVyciA+IDApIHsKLQkJCQllcnIgPSAwOwotCQkJCS8qIFRoZXJlIHdhcyBhbiBleGNlcHRpb24gYW5kIGEgdHJ1ZSByZXR1cm4gKi8KLQkJCQlTVEFDS0FESigtMik7Ci0JCQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQkJCVNFVF9UT1AoUHlfTm9uZSk7Ci0JCQkJUHlfREVDUkVGKHUpOwotCQkJCVB5X0RFQ1JFRih2KTsKLQkJCQlQeV9ERUNSRUYodyk7Ci0JCQl9IGVsc2UgewotCQkJCS8qIFRoZSBzdGFjayB3YXMgcmVhcnJhbmdlZCB0byByZW1vdmUgRVhJVAotCQkJCSAgIGFib3ZlLiBMZXQgRU5EX0ZJTkFMTFkgZG8gaXRzIHRoaW5nICovCi0JCQl9Ci0JCQlQUkVESUNUKEVORF9GSU5BTExZKTsKLQkJCWJyZWFrOwotCQl9CisgICAgICAgICAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsgLyogR28gdG8gZXJyb3IgZXhpdCAqLworICAgICAgICAgICAgZWxzZSBpZiAoZXJyID4gMCkgeworICAgICAgICAgICAgICAgIGVyciA9IDA7CisgICAgICAgICAgICAgICAgLyogVGhlcmUgd2FzIGFuIGV4Y2VwdGlvbiBhbmQgYSB0cnVlIHJldHVybiAqLworICAgICAgICAgICAgICAgIFNUQUNLQURKKC0yKTsKKyAgICAgICAgICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgICAgICAgICAgU0VUX1RPUChQeV9Ob25lKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYodSk7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih3KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyogVGhlIHN0YWNrIHdhcyByZWFycmFuZ2VkIHRvIHJlbW92ZSBFWElUCisgICAgICAgICAgICAgICAgICAgYWJvdmUuIExldCBFTkRfRklOQUxMWSBkbyBpdHMgdGhpbmcgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFBSRURJQ1QoRU5EX0ZJTkFMTFkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KIAotCQljYXNlIENBTExfRlVOQ1RJT046Ci0JCXsKLQkJCVB5T2JqZWN0ICoqc3A7Ci0JCQlQQ0FMTChQQ0FMTF9BTEwpOwotCQkJc3AgPSBzdGFja19wb2ludGVyOworICAgICAgICBjYXNlIENBTExfRlVOQ1RJT046CisgICAgICAgIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICoqc3A7CisgICAgICAgICAgICBQQ0FMTChQQ0FMTF9BTEwpOworICAgICAgICAgICAgc3AgPSBzdGFja19wb2ludGVyOwogI2lmZGVmIFdJVEhfVFNDCi0JCQl4ID0gY2FsbF9mdW5jdGlvbigmc3AsIG9wYXJnLCAmaW50cjAsICZpbnRyMSk7CisgICAgICAgICAgICB4ID0gY2FsbF9mdW5jdGlvbigmc3AsIG9wYXJnLCAmaW50cjAsICZpbnRyMSk7CiAjZWxzZQotCQkJeCA9IGNhbGxfZnVuY3Rpb24oJnNwLCBvcGFyZyk7CisgICAgICAgICAgICB4ID0gY2FsbF9mdW5jdGlvbigmc3AsIG9wYXJnKTsKICNlbmRpZgotCQkJc3RhY2tfcG9pbnRlciA9IHNwOwotCQkJUFVTSCh4KTsKLQkJCWlmICh4ICE9IE5VTEwpCi0JCQkJY29udGludWU7Ci0JCQlicmVhazsKLQkJfQorICAgICAgICAgICAgc3RhY2tfcG9pbnRlciA9IHNwOworICAgICAgICAgICAgUFVTSCh4KTsKKyAgICAgICAgICAgIGlmICh4ICE9IE5VTEwpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogCi0JCWNhc2UgQ0FMTF9GVU5DVElPTl9WQVI6Ci0JCWNhc2UgQ0FMTF9GVU5DVElPTl9LVzoKLQkJY2FzZSBDQUxMX0ZVTkNUSU9OX1ZBUl9LVzoKLQkJewotCQkgICAgaW50IG5hID0gb3BhcmcgJiAweGZmOwotCQkgICAgaW50IG5rID0gKG9wYXJnPj44KSAmIDB4ZmY7Ci0JCSAgICBpbnQgZmxhZ3MgPSAob3Bjb2RlIC0gQ0FMTF9GVU5DVElPTikgJiAzOwotCQkgICAgaW50IG4gPSBuYSArIDIgKiBuazsKLQkJICAgIFB5T2JqZWN0ICoqcGZ1bmMsICpmdW5jLCAqKnNwOwotCQkgICAgUENBTEwoUENBTExfQUxMKTsKLQkJICAgIGlmIChmbGFncyAmIENBTExfRkxBR19WQVIpCi0JCQkgICAgbisrOwotCQkgICAgaWYgKGZsYWdzICYgQ0FMTF9GTEFHX0tXKQotCQkJICAgIG4rKzsKLQkJICAgIHBmdW5jID0gc3RhY2tfcG9pbnRlciAtIG4gLSAxOwotCQkgICAgZnVuYyA9ICpwZnVuYzsKKyAgICAgICAgY2FzZSBDQUxMX0ZVTkNUSU9OX1ZBUjoKKyAgICAgICAgY2FzZSBDQUxMX0ZVTkNUSU9OX0tXOgorICAgICAgICBjYXNlIENBTExfRlVOQ1RJT05fVkFSX0tXOgorICAgICAgICB7CisgICAgICAgICAgICBpbnQgbmEgPSBvcGFyZyAmIDB4ZmY7CisgICAgICAgICAgICBpbnQgbmsgPSAob3Bhcmc+PjgpICYgMHhmZjsKKyAgICAgICAgICAgIGludCBmbGFncyA9IChvcGNvZGUgLSBDQUxMX0ZVTkNUSU9OKSAmIDM7CisgICAgICAgICAgICBpbnQgbiA9IG5hICsgMiAqIG5rOworICAgICAgICAgICAgUHlPYmplY3QgKipwZnVuYywgKmZ1bmMsICoqc3A7CisgICAgICAgICAgICBQQ0FMTChQQ0FMTF9BTEwpOworICAgICAgICAgICAgaWYgKGZsYWdzICYgQ0FMTF9GTEFHX1ZBUikKKyAgICAgICAgICAgICAgICBuKys7CisgICAgICAgICAgICBpZiAoZmxhZ3MgJiBDQUxMX0ZMQUdfS1cpCisgICAgICAgICAgICAgICAgbisrOworICAgICAgICAgICAgcGZ1bmMgPSBzdGFja19wb2ludGVyIC0gbiAtIDE7CisgICAgICAgICAgICBmdW5jID0gKnBmdW5jOwogCi0JCSAgICBpZiAoUHlNZXRob2RfQ2hlY2soZnVuYykKLQkJCSYmIFB5TWV0aG9kX0dFVF9TRUxGKGZ1bmMpICE9IE5VTEwpIHsKLQkJCSAgICBQeU9iamVjdCAqc2VsZiA9IFB5TWV0aG9kX0dFVF9TRUxGKGZ1bmMpOwotCQkJICAgIFB5X0lOQ1JFRihzZWxmKTsKLQkJCSAgICBmdW5jID0gUHlNZXRob2RfR0VUX0ZVTkNUSU9OKGZ1bmMpOwotCQkJICAgIFB5X0lOQ1JFRihmdW5jKTsKLQkJCSAgICBQeV9ERUNSRUYoKnBmdW5jKTsKLQkJCSAgICAqcGZ1bmMgPSBzZWxmOwotCQkJICAgIG5hKys7Ci0JCQkgICAgbisrOwotCQkgICAgfSBlbHNlCi0JCQkgICAgUHlfSU5DUkVGKGZ1bmMpOwotCQkgICAgc3AgPSBzdGFja19wb2ludGVyOwotCQkgICAgUkVBRF9USU1FU1RBTVAoaW50cjApOwotCQkgICAgeCA9IGV4dF9kb19jYWxsKGZ1bmMsICZzcCwgZmxhZ3MsIG5hLCBuayk7Ci0JCSAgICBSRUFEX1RJTUVTVEFNUChpbnRyMSk7Ci0JCSAgICBzdGFja19wb2ludGVyID0gc3A7Ci0JCSAgICBQeV9ERUNSRUYoZnVuYyk7CisgICAgICAgICAgICBpZiAoUHlNZXRob2RfQ2hlY2soZnVuYykKKyAgICAgICAgICAgICYmIFB5TWV0aG9kX0dFVF9TRUxGKGZ1bmMpICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeU9iamVjdCAqc2VsZiA9IFB5TWV0aG9kX0dFVF9TRUxGKGZ1bmMpOworICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihzZWxmKTsKKyAgICAgICAgICAgICAgICBmdW5jID0gUHlNZXRob2RfR0VUX0ZVTkNUSU9OKGZ1bmMpOworICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihmdW5jKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoKnBmdW5jKTsKKyAgICAgICAgICAgICAgICAqcGZ1bmMgPSBzZWxmOworICAgICAgICAgICAgICAgIG5hKys7CisgICAgICAgICAgICAgICAgbisrOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgUHlfSU5DUkVGKGZ1bmMpOworICAgICAgICAgICAgc3AgPSBzdGFja19wb2ludGVyOworICAgICAgICAgICAgUkVBRF9USU1FU1RBTVAoaW50cjApOworICAgICAgICAgICAgeCA9IGV4dF9kb19jYWxsKGZ1bmMsICZzcCwgZmxhZ3MsIG5hLCBuayk7CisgICAgICAgICAgICBSRUFEX1RJTUVTVEFNUChpbnRyMSk7CisgICAgICAgICAgICBzdGFja19wb2ludGVyID0gc3A7CisgICAgICAgICAgICBQeV9ERUNSRUYoZnVuYyk7CiAKLQkJICAgIHdoaWxlIChzdGFja19wb2ludGVyID4gcGZ1bmMpIHsKLQkJCSAgICB3ID0gUE9QKCk7Ci0JCQkgICAgUHlfREVDUkVGKHcpOwotCQkgICAgfQotCQkgICAgUFVTSCh4KTsKLQkJICAgIGlmICh4ICE9IE5VTEwpCi0JCQkgICAgY29udGludWU7Ci0JCSAgICBicmVhazsKLQkJfQorICAgICAgICAgICAgd2hpbGUgKHN0YWNrX3BvaW50ZXIgPiBwZnVuYykgeworICAgICAgICAgICAgICAgIHcgPSBQT1AoKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYodyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQVVNIKHgpOworICAgICAgICAgICAgaWYgKHggIT0gTlVMTCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CiAKLQkJY2FzZSBNQUtFX0ZVTkNUSU9OOgotCQkJdiA9IFBPUCgpOyAvKiBjb2RlIG9iamVjdCAqLwotCQkJeCA9IFB5RnVuY3Rpb25fTmV3KHYsIGYtPmZfZ2xvYmFscyk7Ci0JCQlQeV9ERUNSRUYodik7Ci0JCQkvKiBYWFggTWF5YmUgdGhpcyBzaG91bGQgYmUgYSBzZXBhcmF0ZSBvcGNvZGU/ICovCi0JCQlpZiAoeCAhPSBOVUxMICYmIG9wYXJnID4gMCkgewotCQkJCXYgPSBQeVR1cGxlX05ldyhvcGFyZyk7Ci0JCQkJaWYgKHYgPT0gTlVMTCkgewotCQkJCQlQeV9ERUNSRUYoeCk7Ci0JCQkJCXggPSBOVUxMOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJd2hpbGUgKC0tb3BhcmcgPj0gMCkgewotCQkJCQl3ID0gUE9QKCk7Ci0JCQkJCVB5VHVwbGVfU0VUX0lURU0odiwgb3BhcmcsIHcpOwotCQkJCX0KLQkJCQllcnIgPSBQeUZ1bmN0aW9uX1NldERlZmF1bHRzKHgsIHYpOwotCQkJCVB5X0RFQ1JFRih2KTsKLQkJCX0KLQkJCVBVU0goeCk7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBNQUtFX0ZVTkNUSU9OOgorICAgICAgICAgICAgdiA9IFBPUCgpOyAvKiBjb2RlIG9iamVjdCAqLworICAgICAgICAgICAgeCA9IFB5RnVuY3Rpb25fTmV3KHYsIGYtPmZfZ2xvYmFscyk7CisgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICAvKiBYWFggTWF5YmUgdGhpcyBzaG91bGQgYmUgYSBzZXBhcmF0ZSBvcGNvZGU/ICovCisgICAgICAgICAgICBpZiAoeCAhPSBOVUxMICYmIG9wYXJnID4gMCkgeworICAgICAgICAgICAgICAgIHYgPSBQeVR1cGxlX05ldyhvcGFyZyk7CisgICAgICAgICAgICAgICAgaWYgKHYgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoeCk7CisgICAgICAgICAgICAgICAgICAgIHggPSBOVUxMOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd2hpbGUgKC0tb3BhcmcgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICB3ID0gUE9QKCk7CisgICAgICAgICAgICAgICAgICAgIFB5VHVwbGVfU0VUX0lURU0odiwgb3BhcmcsIHcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlcnIgPSBQeUZ1bmN0aW9uX1NldERlZmF1bHRzKHgsIHYpOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFBVU0goeCk7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIE1BS0VfQ0xPU1VSRToKLQkJewotCQkJdiA9IFBPUCgpOyAvKiBjb2RlIG9iamVjdCAqLwotCQkJeCA9IFB5RnVuY3Rpb25fTmV3KHYsIGYtPmZfZ2xvYmFscyk7Ci0JCQlQeV9ERUNSRUYodik7Ci0JCQlpZiAoeCAhPSBOVUxMKSB7Ci0JCQkJdiA9IFBPUCgpOwotCQkJCWlmIChQeUZ1bmN0aW9uX1NldENsb3N1cmUoeCwgdikgIT0gMCkgewotCQkJCQkvKiBDYW4ndCBoYXBwZW4gdW5sZXNzIGJ5dGVjb2RlIGlzIGNvcnJ1cHQuICovCi0JCQkJCXdoeSA9IFdIWV9FWENFUFRJT047Ci0JCQkJfQotCQkJCVB5X0RFQ1JFRih2KTsKLQkJCX0KLQkJCWlmICh4ICE9IE5VTEwgJiYgb3BhcmcgPiAwKSB7Ci0JCQkJdiA9IFB5VHVwbGVfTmV3KG9wYXJnKTsKLQkJCQlpZiAodiA9PSBOVUxMKSB7Ci0JCQkJCVB5X0RFQ1JFRih4KTsKLQkJCQkJeCA9IE5VTEw7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQl3aGlsZSAoLS1vcGFyZyA+PSAwKSB7Ci0JCQkJCXcgPSBQT1AoKTsKLQkJCQkJUHlUdXBsZV9TRVRfSVRFTSh2LCBvcGFyZywgdyk7Ci0JCQkJfQotCQkJCWlmIChQeUZ1bmN0aW9uX1NldERlZmF1bHRzKHgsIHYpICE9IDApIHsKLQkJCQkJLyogQ2FuJ3QgaGFwcGVuIHVubGVzcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RnVuY3Rpb25fU2V0RGVmYXVsdHMgY2hhbmdlcy4gKi8KLQkJCQkJd2h5ID0gV0hZX0VYQ0VQVElPTjsKLQkJCQl9Ci0JCQkJUHlfREVDUkVGKHYpOwotCQkJfQotCQkJUFVTSCh4KTsKLQkJCWJyZWFrOwotCQl9CisgICAgICAgIGNhc2UgTUFLRV9DTE9TVVJFOgorICAgICAgICB7CisgICAgICAgICAgICB2ID0gUE9QKCk7IC8qIGNvZGUgb2JqZWN0ICovCisgICAgICAgICAgICB4ID0gUHlGdW5jdGlvbl9OZXcodiwgZi0+Zl9nbG9iYWxzKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgIGlmICh4ICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICB2ID0gUE9QKCk7CisgICAgICAgICAgICAgICAgaWYgKFB5RnVuY3Rpb25fU2V0Q2xvc3VyZSh4LCB2KSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIENhbid0IGhhcHBlbiB1bmxlc3MgYnl0ZWNvZGUgaXMgY29ycnVwdC4gKi8KKyAgICAgICAgICAgICAgICAgICAgd2h5ID0gV0hZX0VYQ0VQVElPTjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHggIT0gTlVMTCAmJiBvcGFyZyA+IDApIHsKKyAgICAgICAgICAgICAgICB2ID0gUHlUdXBsZV9OZXcob3BhcmcpOworICAgICAgICAgICAgICAgIGlmICh2ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHgpOworICAgICAgICAgICAgICAgICAgICB4ID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdoaWxlICgtLW9wYXJnID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgdyA9IFBPUCgpOworICAgICAgICAgICAgICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKHYsIG9wYXJnLCB3KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKFB5RnVuY3Rpb25fU2V0RGVmYXVsdHMoeCwgdikgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAvKiBDYW4ndCBoYXBwZW4gdW5sZXNzCisgICAgICAgICAgICAgICAgICAgICAgIFB5RnVuY3Rpb25fU2V0RGVmYXVsdHMgY2hhbmdlcy4gKi8KKyAgICAgICAgICAgICAgICAgICAgd2h5ID0gV0hZX0VYQ0VQVElPTjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUFVTSCh4KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CiAKLQkJY2FzZSBCVUlMRF9TTElDRToKLQkJCWlmIChvcGFyZyA9PSAzKQotCQkJCXcgPSBQT1AoKTsKLQkJCWVsc2UKLQkJCQl3ID0gTlVMTDsKLQkJCXYgPSBQT1AoKTsKLQkJCXUgPSBUT1AoKTsKLQkJCXggPSBQeVNsaWNlX05ldyh1LCB2LCB3KTsKLQkJCVB5X0RFQ1JFRih1KTsKLQkJCVB5X0RFQ1JFRih2KTsKLQkJCVB5X1hERUNSRUYodyk7Ci0JCQlTRVRfVE9QKHgpOwotCQkJaWYgKHggIT0gTlVMTCkgY29udGludWU7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBCVUlMRF9TTElDRToKKyAgICAgICAgICAgIGlmIChvcGFyZyA9PSAzKQorICAgICAgICAgICAgICAgIHcgPSBQT1AoKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB3ID0gTlVMTDsKKyAgICAgICAgICAgIHYgPSBQT1AoKTsKKyAgICAgICAgICAgIHUgPSBUT1AoKTsKKyAgICAgICAgICAgIHggPSBQeVNsaWNlX05ldyh1LCB2LCB3KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih1KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgIFB5X1hERUNSRUYodyk7CisgICAgICAgICAgICBTRVRfVE9QKHgpOworICAgICAgICAgICAgaWYgKHggIT0gTlVMTCkgY29udGludWU7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIEVYVEVOREVEX0FSRzoKLQkJCW9wY29kZSA9IE5FWFRPUCgpOwotCQkJb3BhcmcgPSBvcGFyZzw8MTYgfCBORVhUQVJHKCk7Ci0JCQlnb3RvIGRpc3BhdGNoX29wY29kZTsKKyAgICAgICAgY2FzZSBFWFRFTkRFRF9BUkc6CisgICAgICAgICAgICBvcGNvZGUgPSBORVhUT1AoKTsKKyAgICAgICAgICAgIG9wYXJnID0gb3Bhcmc8PDE2IHwgTkVYVEFSRygpOworICAgICAgICAgICAgZ290byBkaXNwYXRjaF9vcGNvZGU7CiAKLQkJZGVmYXVsdDoKLQkJCWZwcmludGYoc3RkZXJyLAotCQkJCSJYWFggbGluZW5vOiAlZCwgb3Bjb2RlOiAlZFxuIiwKLQkJCQlQeUNvZGVfQWRkcjJMaW5lKGYtPmZfY29kZSwgZi0+Zl9sYXN0aSksCi0JCQkJb3Bjb2RlKTsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwgInVua25vd24gb3Bjb2RlIik7Ci0JCQl3aHkgPSBXSFlfRVhDRVBUSU9OOwotCQkJYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICAgICAiWFhYIGxpbmVubzogJWQsIG9wY29kZTogJWRcbiIsCisgICAgICAgICAgICAgICAgUHlDb2RlX0FkZHIyTGluZShmLT5mX2NvZGUsIGYtPmZfbGFzdGkpLAorICAgICAgICAgICAgICAgIG9wY29kZSk7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsICJ1bmtub3duIG9wY29kZSIpOworICAgICAgICAgICAgd2h5ID0gV0hZX0VYQ0VQVElPTjsKKyAgICAgICAgICAgIGJyZWFrOwogCiAjaWZkZWYgQ0FTRV9UT09fQklHCi0JCX0KKyAgICAgICAgfQogI2VuZGlmCiAKLQkJfSAvKiBzd2l0Y2ggKi8KKyAgICAgICAgfSAvKiBzd2l0Y2ggKi8KIAotCSAgICBvbl9lcnJvcjoKKyAgICAgICAgb25fZXJyb3I6CiAKLQkJUkVBRF9USU1FU1RBTVAoaW5zdDEpOworICAgICAgICBSRUFEX1RJTUVTVEFNUChpbnN0MSk7CiAKLQkJLyogUXVpY2tseSBjb250aW51ZSBpZiBubyBlcnJvciBvY2N1cnJlZCAqLworICAgICAgICAvKiBRdWlja2x5IGNvbnRpbnVlIGlmIG5vIGVycm9yIG9jY3VycmVkICovCiAKLQkJaWYgKHdoeSA9PSBXSFlfTk9UKSB7Ci0JCQlpZiAoZXJyID09IDAgJiYgeCAhPSBOVUxMKSB7CisgICAgICAgIGlmICh3aHkgPT0gV0hZX05PVCkgeworICAgICAgICAgICAgaWYgKGVyciA9PSAwICYmIHggIT0gTlVMTCkgewogI2lmZGVmIENIRUNLRVhDCi0JCQkJLyogVGhpcyBjaGVjayBpcyBleHBlbnNpdmUhICovCi0JCQkJaWYgKFB5RXJyX09jY3VycmVkKCkpCi0JCQkJCWZwcmludGYoc3RkZXJyLAotCQkJCQkJIlhYWCB1bmRldGVjdGVkIGVycm9yXG4iKTsKLQkJCQllbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBUaGlzIGNoZWNrIGlzIGV4cGVuc2l2ZSEgKi8KKyAgICAgICAgICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAiWFhYIHVuZGV0ZWN0ZWQgZXJyb3JcbiIpOworICAgICAgICAgICAgICAgIGVsc2UgewogI2VuZGlmCi0JCQkJCVJFQURfVElNRVNUQU1QKGxvb3AxKTsKLQkJCQkJY29udGludWU7IC8qIE5vcm1hbCwgZmFzdCBwYXRoICovCisgICAgICAgICAgICAgICAgICAgIFJFQURfVElNRVNUQU1QKGxvb3AxKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8qIE5vcm1hbCwgZmFzdCBwYXRoICovCiAjaWZkZWYgQ0hFQ0tFWEMKLQkJCQl9CisgICAgICAgICAgICAgICAgfQogI2VuZGlmCi0JCQl9Ci0JCQl3aHkgPSBXSFlfRVhDRVBUSU9OOwotCQkJeCA9IFB5X05vbmU7Ci0JCQllcnIgPSAwOwotCQl9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aHkgPSBXSFlfRVhDRVBUSU9OOworICAgICAgICAgICAgeCA9IFB5X05vbmU7CisgICAgICAgICAgICBlcnIgPSAwOworICAgICAgICB9CiAKLQkJLyogRG91YmxlLWNoZWNrIGV4Y2VwdGlvbiBzdGF0dXMgKi8KKyAgICAgICAgLyogRG91YmxlLWNoZWNrIGV4Y2VwdGlvbiBzdGF0dXMgKi8KIAotCQlpZiAod2h5ID09IFdIWV9FWENFUFRJT04gfHwgd2h5ID09IFdIWV9SRVJBSVNFKSB7Ci0JCQlpZiAoIVB5RXJyX09jY3VycmVkKCkpIHsKLQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCi0JCQkJCSJlcnJvciByZXR1cm4gd2l0aG91dCBleGNlcHRpb24gc2V0Iik7Ci0JCQkJd2h5ID0gV0hZX0VYQ0VQVElPTjsKLQkJCX0KLQkJfQorICAgICAgICBpZiAod2h5ID09IFdIWV9FWENFUFRJT04gfHwgd2h5ID09IFdIWV9SRVJBSVNFKSB7CisgICAgICAgICAgICBpZiAoIVB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICJlcnJvciByZXR1cm4gd2l0aG91dCBleGNlcHRpb24gc2V0Iik7CisgICAgICAgICAgICAgICAgd2h5ID0gV0hZX0VYQ0VQVElPTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogI2lmZGVmIENIRUNLRVhDCi0JCWVsc2UgewotCQkJLyogVGhpcyBjaGVjayBpcyBleHBlbnNpdmUhICovCi0JCQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkgewotCQkJCWNoYXIgYnVmWzEyOF07Ci0JCQkJc3ByaW50ZihidWYsICJTdGFjayB1bndpbmQgd2l0aCBleGNlcHRpb24gIgotCQkJCQkic2V0IGFuZCB3aHk9JWQiLCB3aHkpOwotCQkJCVB5X0ZhdGFsRXJyb3IoYnVmKTsKLQkJCX0KLQkJfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8qIFRoaXMgY2hlY2sgaXMgZXhwZW5zaXZlISAqLworICAgICAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgICAgICAgICBjaGFyIGJ1ZlsxMjhdOworICAgICAgICAgICAgICAgIHNwcmludGYoYnVmLCAiU3RhY2sgdW53aW5kIHdpdGggZXhjZXB0aW9uICIKKyAgICAgICAgICAgICAgICAgICAgInNldCBhbmQgd2h5PSVkIiwgd2h5KTsKKyAgICAgICAgICAgICAgICBQeV9GYXRhbEVycm9yKGJ1Zik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICNlbmRpZgogCi0JCS8qIExvZyB0cmFjZWJhY2sgaW5mbyBpZiB0aGlzIGlzIGEgcmVhbCBleGNlcHRpb24gKi8KKyAgICAgICAgLyogTG9nIHRyYWNlYmFjayBpbmZvIGlmIHRoaXMgaXMgYSByZWFsIGV4Y2VwdGlvbiAqLwogCi0JCWlmICh3aHkgPT0gV0hZX0VYQ0VQVElPTikgewotCQkJUHlUcmFjZUJhY2tfSGVyZShmKTsKKyAgICAgICAgaWYgKHdoeSA9PSBXSFlfRVhDRVBUSU9OKSB7CisgICAgICAgICAgICBQeVRyYWNlQmFja19IZXJlKGYpOwogCi0JCQlpZiAodHN0YXRlLT5jX3RyYWNlZnVuYyAhPSBOVUxMKQotCQkJCWNhbGxfZXhjX3RyYWNlKHRzdGF0ZS0+Y190cmFjZWZ1bmMsCi0JCQkJCSAgICAgICB0c3RhdGUtPmNfdHJhY2VvYmosIGYpOwotCQl9CisgICAgICAgICAgICBpZiAodHN0YXRlLT5jX3RyYWNlZnVuYyAhPSBOVUxMKQorICAgICAgICAgICAgICAgIGNhbGxfZXhjX3RyYWNlKHRzdGF0ZS0+Y190cmFjZWZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHN0YXRlLT5jX3RyYWNlb2JqLCBmKTsKKyAgICAgICAgfQogCi0JCS8qIEZvciB0aGUgcmVzdCwgdHJlYXQgV0hZX1JFUkFJU0UgYXMgV0hZX0VYQ0VQVElPTiAqLworICAgICAgICAvKiBGb3IgdGhlIHJlc3QsIHRyZWF0IFdIWV9SRVJBSVNFIGFzIFdIWV9FWENFUFRJT04gKi8KIAotCQlpZiAod2h5ID09IFdIWV9SRVJBSVNFKQotCQkJd2h5ID0gV0hZX0VYQ0VQVElPTjsKKyAgICAgICAgaWYgKHdoeSA9PSBXSFlfUkVSQUlTRSkKKyAgICAgICAgICAgIHdoeSA9IFdIWV9FWENFUFRJT047CiAKLQkJLyogVW53aW5kIHN0YWNrcyBpZiBhIChwc2V1ZG8pIGV4Y2VwdGlvbiBvY2N1cnJlZCAqLworICAgICAgICAvKiBVbndpbmQgc3RhY2tzIGlmIGEgKHBzZXVkbykgZXhjZXB0aW9uIG9jY3VycmVkICovCiAKIGZhc3RfYmxvY2tfZW5kOgotCQl3aGlsZSAod2h5ICE9IFdIWV9OT1QgJiYgZi0+Zl9pYmxvY2sgPiAwKSB7Ci0JCQlQeVRyeUJsb2NrICpiID0gUHlGcmFtZV9CbG9ja1BvcChmKTsKKyAgICAgICAgd2hpbGUgKHdoeSAhPSBXSFlfTk9UICYmIGYtPmZfaWJsb2NrID4gMCkgeworICAgICAgICAgICAgUHlUcnlCbG9jayAqYiA9IFB5RnJhbWVfQmxvY2tQb3AoZik7CiAKLQkJCWFzc2VydCh3aHkgIT0gV0hZX1lJRUxEKTsKLQkJCWlmIChiLT5iX3R5cGUgPT0gU0VUVVBfTE9PUCAmJiB3aHkgPT0gV0hZX0NPTlRJTlVFKSB7Ci0JCQkJLyogRm9yIGEgY29udGludWUgaW5zaWRlIGEgdHJ5IGJsb2NrLAotCQkJCSAgIGRvbid0IHBvcCB0aGUgYmxvY2sgZm9yIHRoZSBsb29wLiAqLwotCQkJCVB5RnJhbWVfQmxvY2tTZXR1cChmLCBiLT5iX3R5cGUsIGItPmJfaGFuZGxlciwKLQkJCQkJCSAgIGItPmJfbGV2ZWwpOwotCQkJCXdoeSA9IFdIWV9OT1Q7Ci0JCQkJSlVNUFRPKFB5SW50X0FTX0xPTkcocmV0dmFsKSk7Ci0JCQkJUHlfREVDUkVGKHJldHZhbCk7Ci0JCQkJYnJlYWs7Ci0JCQl9CisgICAgICAgICAgICBhc3NlcnQod2h5ICE9IFdIWV9ZSUVMRCk7CisgICAgICAgICAgICBpZiAoYi0+Yl90eXBlID09IFNFVFVQX0xPT1AgJiYgd2h5ID09IFdIWV9DT05USU5VRSkgeworICAgICAgICAgICAgICAgIC8qIEZvciBhIGNvbnRpbnVlIGluc2lkZSBhIHRyeSBibG9jaywKKyAgICAgICAgICAgICAgICAgICBkb24ndCBwb3AgdGhlIGJsb2NrIGZvciB0aGUgbG9vcC4gKi8KKyAgICAgICAgICAgICAgICBQeUZyYW1lX0Jsb2NrU2V0dXAoZiwgYi0+Yl90eXBlLCBiLT5iX2hhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGItPmJfbGV2ZWwpOworICAgICAgICAgICAgICAgIHdoeSA9IFdIWV9OT1Q7CisgICAgICAgICAgICAgICAgSlVNUFRPKFB5SW50X0FTX0xPTkcocmV0dmFsKSk7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHJldHZhbCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CiAKLQkJCXdoaWxlIChTVEFDS19MRVZFTCgpID4gYi0+Yl9sZXZlbCkgewotCQkJCXYgPSBQT1AoKTsKLQkJCQlQeV9YREVDUkVGKHYpOwotCQkJfQotCQkJaWYgKGItPmJfdHlwZSA9PSBTRVRVUF9MT09QICYmIHdoeSA9PSBXSFlfQlJFQUspIHsKLQkJCQl3aHkgPSBXSFlfTk9UOwotCQkJCUpVTVBUTyhiLT5iX2hhbmRsZXIpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKGItPmJfdHlwZSA9PSBTRVRVUF9GSU5BTExZIHx8Ci0JCQkgICAgKGItPmJfdHlwZSA9PSBTRVRVUF9FWENFUFQgJiYKLQkJCSAgICAgd2h5ID09IFdIWV9FWENFUFRJT04pKSB7Ci0JCQkJaWYgKHdoeSA9PSBXSFlfRVhDRVBUSU9OKSB7Ci0JCQkJCVB5T2JqZWN0ICpleGMsICp2YWwsICp0YjsKLQkJCQkJUHlFcnJfRmV0Y2goJmV4YywgJnZhbCwgJnRiKTsKLQkJCQkJaWYgKHZhbCA9PSBOVUxMKSB7Ci0JCQkJCQl2YWwgPSBQeV9Ob25lOwotCQkJCQkJUHlfSU5DUkVGKHZhbCk7Ci0JCQkJCX0KLQkJCQkJLyogTWFrZSB0aGUgcmF3IGV4Y2VwdGlvbiBkYXRhCi0JCQkJCSAgIGF2YWlsYWJsZSB0byB0aGUgaGFuZGxlciwKLQkJCQkJICAgc28gYSBwcm9ncmFtIGNhbiBlbXVsYXRlIHRoZQotCQkJCQkgICBQeXRob24gbWFpbiBsb29wLiAgRG9uJ3QgZG8KLQkJCQkJICAgdGhpcyBmb3IgJ2ZpbmFsbHknLiAqLwotCQkJCQlpZiAoYi0+Yl90eXBlID09IFNFVFVQX0VYQ0VQVCkgewotCQkJCQkJUHlFcnJfTm9ybWFsaXplRXhjZXB0aW9uKAotCQkJCQkJCSZleGMsICZ2YWwsICZ0Yik7Ci0JCQkJCQlzZXRfZXhjX2luZm8odHN0YXRlLAotCQkJCQkJCSAgICAgZXhjLCB2YWwsIHRiKTsKLQkJCQkJfQotCQkJCQlpZiAodGIgPT0gTlVMTCkgewotCQkJCQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQkJCQkJUFVTSChQeV9Ob25lKTsKLQkJCQkJfSBlbHNlCi0JCQkJCQlQVVNIKHRiKTsKLQkJCQkJUFVTSCh2YWwpOwotCQkJCQlQVVNIKGV4Yyk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlpZiAod2h5ICYgKFdIWV9SRVRVUk4gfCBXSFlfQ09OVElOVUUpKQotCQkJCQkJUFVTSChyZXR2YWwpOwotCQkJCQl2ID0gUHlJbnRfRnJvbUxvbmcoKGxvbmcpd2h5KTsKLQkJCQkJUFVTSCh2KTsKLQkJCQl9Ci0JCQkJd2h5ID0gV0hZX05PVDsKLQkJCQlKVU1QVE8oYi0+Yl9oYW5kbGVyKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfSAvKiB1bndpbmQgc3RhY2sgKi8KKyAgICAgICAgICAgIHdoaWxlIChTVEFDS19MRVZFTCgpID4gYi0+Yl9sZXZlbCkgeworICAgICAgICAgICAgICAgIHYgPSBQT1AoKTsKKyAgICAgICAgICAgICAgICBQeV9YREVDUkVGKHYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGItPmJfdHlwZSA9PSBTRVRVUF9MT09QICYmIHdoeSA9PSBXSFlfQlJFQUspIHsKKyAgICAgICAgICAgICAgICB3aHkgPSBXSFlfTk9UOworICAgICAgICAgICAgICAgIEpVTVBUTyhiLT5iX2hhbmRsZXIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGItPmJfdHlwZSA9PSBTRVRVUF9GSU5BTExZIHx8CisgICAgICAgICAgICAgICAgKGItPmJfdHlwZSA9PSBTRVRVUF9FWENFUFQgJiYKKyAgICAgICAgICAgICAgICAgd2h5ID09IFdIWV9FWENFUFRJT04pKSB7CisgICAgICAgICAgICAgICAgaWYgKHdoeSA9PSBXSFlfRVhDRVBUSU9OKSB7CisgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpleGMsICp2YWwsICp0YjsKKyAgICAgICAgICAgICAgICAgICAgUHlFcnJfRmV0Y2goJmV4YywgJnZhbCwgJnRiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZhbCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBQeV9Ob25lOworICAgICAgICAgICAgICAgICAgICAgICAgUHlfSU5DUkVGKHZhbCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLyogTWFrZSB0aGUgcmF3IGV4Y2VwdGlvbiBkYXRhCisgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZSB0byB0aGUgaGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgc28gYSBwcm9ncmFtIGNhbiBlbXVsYXRlIHRoZQorICAgICAgICAgICAgICAgICAgICAgICBQeXRob24gbWFpbiBsb29wLiAgRG9uJ3QgZG8KKyAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBmb3IgJ2ZpbmFsbHknLiAqLworICAgICAgICAgICAgICAgICAgICBpZiAoYi0+Yl90eXBlID09IFNFVFVQX0VYQ0VQVCkgeworICAgICAgICAgICAgICAgICAgICAgICAgUHlFcnJfTm9ybWFsaXplRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZleGMsICZ2YWwsICZ0Yik7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRfZXhjX2luZm8odHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4YywgdmFsLCB0Yik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHRiID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFBVU0goUHlfTm9uZSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgUFVTSCh0Yik7CisgICAgICAgICAgICAgICAgICAgIFBVU0godmFsKTsKKyAgICAgICAgICAgICAgICAgICAgUFVTSChleGMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHdoeSAmIChXSFlfUkVUVVJOIHwgV0hZX0NPTlRJTlVFKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIFBVU0gocmV0dmFsKTsKKyAgICAgICAgICAgICAgICAgICAgdiA9IFB5SW50X0Zyb21Mb25nKChsb25nKXdoeSk7CisgICAgICAgICAgICAgICAgICAgIFBVU0godik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdoeSA9IFdIWV9OT1Q7CisgICAgICAgICAgICAgICAgSlVNUFRPKGItPmJfaGFuZGxlcik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0gLyogdW53aW5kIHN0YWNrICovCiAKLQkJLyogRW5kIHRoZSBsb29wIGlmIHdlIHN0aWxsIGhhdmUgYW4gZXJyb3IgKG9yIHJldHVybikgKi8KKyAgICAgICAgLyogRW5kIHRoZSBsb29wIGlmIHdlIHN0aWxsIGhhdmUgYW4gZXJyb3IgKG9yIHJldHVybikgKi8KIAotCQlpZiAod2h5ICE9IFdIWV9OT1QpCi0JCQlicmVhazsKLQkJUkVBRF9USU1FU1RBTVAobG9vcDEpOworICAgICAgICBpZiAod2h5ICE9IFdIWV9OT1QpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgUkVBRF9USU1FU1RBTVAobG9vcDEpOwogCi0JfSAvKiBtYWluIGxvb3AgKi8KKyAgICB9IC8qIG1haW4gbG9vcCAqLwogCi0JYXNzZXJ0KHdoeSAhPSBXSFlfWUlFTEQpOwotCS8qIFBvcCByZW1haW5pbmcgc3RhY2sgZW50cmllcy4gKi8KLQl3aGlsZSAoIUVNUFRZKCkpIHsKLQkJdiA9IFBPUCgpOwotCQlQeV9YREVDUkVGKHYpOwotCX0KKyAgICBhc3NlcnQod2h5ICE9IFdIWV9ZSUVMRCk7CisgICAgLyogUG9wIHJlbWFpbmluZyBzdGFjayBlbnRyaWVzLiAqLworICAgIHdoaWxlICghRU1QVFkoKSkgeworICAgICAgICB2ID0gUE9QKCk7CisgICAgICAgIFB5X1hERUNSRUYodik7CisgICAgfQogCi0JaWYgKHdoeSAhPSBXSFlfUkVUVVJOKQotCQlyZXR2YWwgPSBOVUxMOworICAgIGlmICh3aHkgIT0gV0hZX1JFVFVSTikKKyAgICAgICAgcmV0dmFsID0gTlVMTDsKIAogZmFzdF95aWVsZDoKLQlpZiAodHN0YXRlLT51c2VfdHJhY2luZykgewotCQlpZiAodHN0YXRlLT5jX3RyYWNlZnVuYykgewotCQkJaWYgKHdoeSA9PSBXSFlfUkVUVVJOIHx8IHdoeSA9PSBXSFlfWUlFTEQpIHsKLQkJCQlpZiAoY2FsbF90cmFjZSh0c3RhdGUtPmNfdHJhY2VmdW5jLAotCQkJCQkgICAgICAgdHN0YXRlLT5jX3RyYWNlb2JqLCBmLAotCQkJCQkgICAgICAgUHlUcmFjZV9SRVRVUk4sIHJldHZhbCkpIHsKLQkJCQkJUHlfWERFQ1JFRihyZXR2YWwpOwotCQkJCQlyZXR2YWwgPSBOVUxMOwotCQkJCQl3aHkgPSBXSFlfRVhDRVBUSU9OOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKHdoeSA9PSBXSFlfRVhDRVBUSU9OKSB7Ci0JCQkJY2FsbF90cmFjZV9wcm90ZWN0ZWQodHN0YXRlLT5jX3RyYWNlZnVuYywKLQkJCQkJCSAgICAgdHN0YXRlLT5jX3RyYWNlb2JqLCBmLAotCQkJCQkJICAgICBQeVRyYWNlX1JFVFVSTiwgTlVMTCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHRzdGF0ZS0+Y19wcm9maWxlZnVuYykgewotCQkJaWYgKHdoeSA9PSBXSFlfRVhDRVBUSU9OKQotCQkJCWNhbGxfdHJhY2VfcHJvdGVjdGVkKHRzdGF0ZS0+Y19wcm9maWxlZnVuYywKLQkJCQkJCSAgICAgdHN0YXRlLT5jX3Byb2ZpbGVvYmosIGYsCi0JCQkJCQkgICAgIFB5VHJhY2VfUkVUVVJOLCBOVUxMKTsKLQkJCWVsc2UgaWYgKGNhbGxfdHJhY2UodHN0YXRlLT5jX3Byb2ZpbGVmdW5jLAotCQkJCQkgICAgdHN0YXRlLT5jX3Byb2ZpbGVvYmosIGYsCi0JCQkJCSAgICBQeVRyYWNlX1JFVFVSTiwgcmV0dmFsKSkgewotCQkJCVB5X1hERUNSRUYocmV0dmFsKTsKLQkJCQlyZXR2YWwgPSBOVUxMOwotCQkJCXdoeSA9IFdIWV9FWENFUFRJT047Ci0JCQl9Ci0JCX0KLQl9CisgICAgaWYgKHRzdGF0ZS0+dXNlX3RyYWNpbmcpIHsKKyAgICAgICAgaWYgKHRzdGF0ZS0+Y190cmFjZWZ1bmMpIHsKKyAgICAgICAgICAgIGlmICh3aHkgPT0gV0hZX1JFVFVSTiB8fCB3aHkgPT0gV0hZX1lJRUxEKSB7CisgICAgICAgICAgICAgICAgaWYgKGNhbGxfdHJhY2UodHN0YXRlLT5jX3RyYWNlZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0c3RhdGUtPmNfdHJhY2VvYmosIGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlUcmFjZV9SRVRVUk4sIHJldHZhbCkpIHsKKyAgICAgICAgICAgICAgICAgICAgUHlfWERFQ1JFRihyZXR2YWwpOworICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICB3aHkgPSBXSFlfRVhDRVBUSU9OOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHdoeSA9PSBXSFlfRVhDRVBUSU9OKSB7CisgICAgICAgICAgICAgICAgY2FsbF90cmFjZV9wcm90ZWN0ZWQodHN0YXRlLT5jX3RyYWNlZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0c3RhdGUtPmNfdHJhY2VvYmosIGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlUcmFjZV9SRVRVUk4sIE5VTEwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICh0c3RhdGUtPmNfcHJvZmlsZWZ1bmMpIHsKKyAgICAgICAgICAgIGlmICh3aHkgPT0gV0hZX0VYQ0VQVElPTikKKyAgICAgICAgICAgICAgICBjYWxsX3RyYWNlX3Byb3RlY3RlZCh0c3RhdGUtPmNfcHJvZmlsZWZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHN0YXRlLT5jX3Byb2ZpbGVvYmosIGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlUcmFjZV9SRVRVUk4sIE5VTEwpOworICAgICAgICAgICAgZWxzZSBpZiAoY2FsbF90cmFjZSh0c3RhdGUtPmNfcHJvZmlsZWZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzdGF0ZS0+Y19wcm9maWxlb2JqLCBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVRyYWNlX1JFVFVSTiwgcmV0dmFsKSkgeworICAgICAgICAgICAgICAgIFB5X1hERUNSRUYocmV0dmFsKTsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSBOVUxMOworICAgICAgICAgICAgICAgIHdoeSA9IFdIWV9FWENFUFRJT047CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAKLQlpZiAodHN0YXRlLT5mcmFtZS0+Zl9leGNfdHlwZSAhPSBOVUxMKQotCQlyZXNldF9leGNfaW5mbyh0c3RhdGUpOwotCWVsc2UgewotCQlhc3NlcnQodHN0YXRlLT5mcmFtZS0+Zl9leGNfdmFsdWUgPT0gTlVMTCk7Ci0JCWFzc2VydCh0c3RhdGUtPmZyYW1lLT5mX2V4Y190cmFjZWJhY2sgPT0gTlVMTCk7Ci0JfQorICAgIGlmICh0c3RhdGUtPmZyYW1lLT5mX2V4Y190eXBlICE9IE5VTEwpCisgICAgICAgIHJlc2V0X2V4Y19pbmZvKHRzdGF0ZSk7CisgICAgZWxzZSB7CisgICAgICAgIGFzc2VydCh0c3RhdGUtPmZyYW1lLT5mX2V4Y192YWx1ZSA9PSBOVUxMKTsKKyAgICAgICAgYXNzZXJ0KHRzdGF0ZS0+ZnJhbWUtPmZfZXhjX3RyYWNlYmFjayA9PSBOVUxMKTsKKyAgICB9CiAKLQkvKiBwb3AgZnJhbWUgKi8KKyAgICAvKiBwb3AgZnJhbWUgKi8KIGV4aXRfZXZhbF9mcmFtZToKLQlQeV9MZWF2ZVJlY3Vyc2l2ZUNhbGwoKTsKLQl0c3RhdGUtPmZyYW1lID0gZi0+Zl9iYWNrOworICAgIFB5X0xlYXZlUmVjdXJzaXZlQ2FsbCgpOworICAgIHRzdGF0ZS0+ZnJhbWUgPSBmLT5mX2JhY2s7CiAKLQlyZXR1cm4gcmV0dmFsOworICAgIHJldHVybiByZXR2YWw7CiB9CiAKIC8qIFRoaXMgaXMgZ29ubmEgc2VlbSAqcmVhbCB3ZWlyZCosIGJ1dCBpZiB5b3UgcHV0IHNvbWUgb3RoZXIgY29kZSBiZXR3ZWVuCkBAIC0yNzU4LDI3MCArMjc1OCwyNzAgQEAKIAogUHlPYmplY3QgKgogUHlFdmFsX0V2YWxDb2RlRXgoUHlDb2RlT2JqZWN0ICpjbywgUHlPYmplY3QgKmdsb2JhbHMsIFB5T2JqZWN0ICpsb2NhbHMsCi0JICAgUHlPYmplY3QgKiphcmdzLCBpbnQgYXJnY291bnQsIFB5T2JqZWN0ICoqa3dzLCBpbnQga3djb3VudCwKLQkgICBQeU9iamVjdCAqKmRlZnMsIGludCBkZWZjb3VudCwgUHlPYmplY3QgKmNsb3N1cmUpCisgICAgICAgICAgIFB5T2JqZWN0ICoqYXJncywgaW50IGFyZ2NvdW50LCBQeU9iamVjdCAqKmt3cywgaW50IGt3Y291bnQsCisgICAgICAgICAgIFB5T2JqZWN0ICoqZGVmcywgaW50IGRlZmNvdW50LCBQeU9iamVjdCAqY2xvc3VyZSkKIHsKLQlyZWdpc3RlciBQeUZyYW1lT2JqZWN0ICpmOwotCXJlZ2lzdGVyIFB5T2JqZWN0ICpyZXR2YWwgPSBOVUxMOwotCXJlZ2lzdGVyIFB5T2JqZWN0ICoqZmFzdGxvY2FscywgKipmcmVldmFyczsKLQlQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dFVCgpOwotCVB5T2JqZWN0ICp4LCAqdTsKKyAgICByZWdpc3RlciBQeUZyYW1lT2JqZWN0ICpmOworICAgIHJlZ2lzdGVyIFB5T2JqZWN0ICpyZXR2YWwgPSBOVUxMOworICAgIHJlZ2lzdGVyIFB5T2JqZWN0ICoqZmFzdGxvY2FscywgKipmcmVldmFyczsKKyAgICBQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dFVCgpOworICAgIFB5T2JqZWN0ICp4LCAqdTsKIAotCWlmIChnbG9iYWxzID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAotCQkJCSJQeUV2YWxfRXZhbENvZGVFeDogTlVMTCBnbG9iYWxzIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoZ2xvYmFscyA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJQeUV2YWxfRXZhbENvZGVFeDogTlVMTCBnbG9iYWxzIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWFzc2VydCh0c3RhdGUgIT0gTlVMTCk7Ci0JYXNzZXJ0KGdsb2JhbHMgIT0gTlVMTCk7Ci0JZiA9IFB5RnJhbWVfTmV3KHRzdGF0ZSwgY28sIGdsb2JhbHMsIGxvY2Fscyk7Ci0JaWYgKGYgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgYXNzZXJ0KHRzdGF0ZSAhPSBOVUxMKTsKKyAgICBhc3NlcnQoZ2xvYmFscyAhPSBOVUxMKTsKKyAgICBmID0gUHlGcmFtZV9OZXcodHN0YXRlLCBjbywgZ2xvYmFscywgbG9jYWxzKTsKKyAgICBpZiAoZiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWZhc3Rsb2NhbHMgPSBmLT5mX2xvY2Fsc3BsdXM7Ci0JZnJlZXZhcnMgPSBmLT5mX2xvY2Fsc3BsdXMgKyBjby0+Y29fbmxvY2FsczsKKyAgICBmYXN0bG9jYWxzID0gZi0+Zl9sb2NhbHNwbHVzOworICAgIGZyZWV2YXJzID0gZi0+Zl9sb2NhbHNwbHVzICsgY28tPmNvX25sb2NhbHM7CiAKLQlpZiAoY28tPmNvX2FyZ2NvdW50ID4gMCB8fAotCSAgICBjby0+Y29fZmxhZ3MgJiAoQ09fVkFSQVJHUyB8IENPX1ZBUktFWVdPUkRTKSkgewotCQlpbnQgaTsKLQkJaW50IG4gPSBhcmdjb3VudDsKLQkJUHlPYmplY3QgKmt3ZGljdCA9IE5VTEw7Ci0JCWlmIChjby0+Y29fZmxhZ3MgJiBDT19WQVJLRVlXT1JEUykgewotCQkJa3dkaWN0ID0gUHlEaWN0X05ldygpOwotCQkJaWYgKGt3ZGljdCA9PSBOVUxMKQotCQkJCWdvdG8gZmFpbDsKLQkJCWkgPSBjby0+Y29fYXJnY291bnQ7Ci0JCQlpZiAoY28tPmNvX2ZsYWdzICYgQ09fVkFSQVJHUykKLQkJCQlpKys7Ci0JCQlTRVRMT0NBTChpLCBrd2RpY3QpOwotCQl9Ci0JCWlmIChhcmdjb3VudCA+IGNvLT5jb19hcmdjb3VudCkgewotCQkJaWYgKCEoY28tPmNvX2ZsYWdzICYgQ09fVkFSQVJHUykpIHsKLQkJCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJCSAgICAiJS4yMDBzKCkgdGFrZXMgJXMgJWQgIgotCQkJCSAgICAiJXNhcmd1bWVudCVzICglZCBnaXZlbikiLAotCQkJCSAgICBQeVN0cmluZ19Bc1N0cmluZyhjby0+Y29fbmFtZSksCi0JCQkJICAgIGRlZmNvdW50ID8gImF0IG1vc3QiIDogImV4YWN0bHkiLAotCQkJCSAgICBjby0+Y29fYXJnY291bnQsCi0JCQkJICAgIGt3Y291bnQgPyAibm9uLWtleXdvcmQgIiA6ICIiLAotCQkJCSAgICBjby0+Y29fYXJnY291bnQgPT0gMSA/ICIiIDogInMiLAotCQkJCSAgICBhcmdjb3VudCk7Ci0JCQkJZ290byBmYWlsOwotCQkJfQotCQkJbiA9IGNvLT5jb19hcmdjb3VudDsKLQkJfQotCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCQl4ID0gYXJnc1tpXTsKLQkJCVB5X0lOQ1JFRih4KTsKLQkJCVNFVExPQ0FMKGksIHgpOwotCQl9Ci0JCWlmIChjby0+Y29fZmxhZ3MgJiBDT19WQVJBUkdTKSB7Ci0JCQl1ID0gUHlUdXBsZV9OZXcoYXJnY291bnQgLSBuKTsKLQkJCWlmICh1ID09IE5VTEwpCi0JCQkJZ290byBmYWlsOwotCQkJU0VUTE9DQUwoY28tPmNvX2FyZ2NvdW50LCB1KTsKLQkJCWZvciAoaSA9IG47IGkgPCBhcmdjb3VudDsgaSsrKSB7Ci0JCQkJeCA9IGFyZ3NbaV07Ci0JCQkJUHlfSU5DUkVGKHgpOwotCQkJCVB5VHVwbGVfU0VUX0lURU0odSwgaS1uLCB4KTsKLQkJCX0KLQkJfQotCQlmb3IgKGkgPSAwOyBpIDwga3djb3VudDsgaSsrKSB7Ci0JCQlQeU9iamVjdCAqKmNvX3Zhcm5hbWVzOwotCQkJUHlPYmplY3QgKmtleXdvcmQgPSBrd3NbMippXTsKLQkJCVB5T2JqZWN0ICp2YWx1ZSA9IGt3c1syKmkgKyAxXTsKLQkJCWludCBqOwotCQkJaWYgKGtleXdvcmQgPT0gTlVMTCB8fCAhKFB5U3RyaW5nX0NoZWNrKGtleXdvcmQpIHx8Ci0JCQkJCQkgUHlVbmljb2RlX0NoZWNrKGtleXdvcmQpKSkgewotCQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkJICAgICIlLjIwMHMoKSBrZXl3b3JkcyBtdXN0IGJlIHN0cmluZ3MiLAotCQkJCSAgICBQeVN0cmluZ19Bc1N0cmluZyhjby0+Y29fbmFtZSkpOwotCQkJCWdvdG8gZmFpbDsKLQkJCX0KLQkJCS8qIFNwZWVkIGhhY2s6IGRvIHJhdyBwb2ludGVyIGNvbXBhcmVzLiBBcyBuYW1lcyBhcmUKLQkJCSAgIG5vcm1hbGx5IGludGVybmVkIHRoaXMgc2hvdWxkIGFsbW9zdCBhbHdheXMgaGl0LiAqLwotCQkJY29fdmFybmFtZXMgPSBQeVNlcXVlbmNlX0Zhc3RfSVRFTVMoY28tPmNvX3Zhcm5hbWVzKTsKLQkJCWZvciAoaiA9IDA7IGogPCBjby0+Y29fYXJnY291bnQ7IGorKykgewotCQkJCVB5T2JqZWN0ICpubSA9IGNvX3Zhcm5hbWVzW2pdOwotCQkJCWlmIChubSA9PSBrZXl3b3JkKQotCQkJCQlnb3RvIGt3X2ZvdW5kOwotCQkJfQotCQkJLyogU2xvdyBmYWxsYmFjaywganVzdCBpbiBjYXNlICovCi0JCQlmb3IgKGogPSAwOyBqIDwgY28tPmNvX2FyZ2NvdW50OyBqKyspIHsKLQkJCQlQeU9iamVjdCAqbm0gPSBjb192YXJuYW1lc1tqXTsKLQkJCQlpbnQgY21wID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKAotCQkJCQlrZXl3b3JkLCBubSwgUHlfRVEpOwotCQkJCWlmIChjbXAgPiAwKQotCQkJCQlnb3RvIGt3X2ZvdW5kOwotCQkJCWVsc2UgaWYgKGNtcCA8IDApCi0JCQkJCWdvdG8gZmFpbDsKLQkJCX0KLQkJCS8qIENoZWNrIGVycm9ycyBmcm9tIENvbXBhcmUgKi8KLQkJCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQkJCWdvdG8gZmFpbDsKLQkJCWlmIChqID49IGNvLT5jb19hcmdjb3VudCkgewotCQkJCWlmIChrd2RpY3QgPT0gTlVMTCkgewotCQkJCQlQeU9iamVjdCAqa3dkX3N0ciA9IGt3ZF9hc19zdHJpbmcoa2V5d29yZCk7Ci0JCQkJCWlmIChrd2Rfc3RyKSB7Ci0JCQkJCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJCQkJCSAgICAgIiUuMjAwcygpIGdvdCBhbiB1bmV4cGVjdGVkICIKLQkJCQkJCQkgICAgICJrZXl3b3JkIGFyZ3VtZW50ICclLjQwMHMnIiwKLQkJCQkJCQkgICAgIFB5U3RyaW5nX0FzU3RyaW5nKGNvLT5jb19uYW1lKSwKLQkJCQkJCQkgICAgIFB5U3RyaW5nX0FzU3RyaW5nKGt3ZF9zdHIpKTsKLQkJCQkJCVB5X0RFQ1JFRihrd2Rfc3RyKTsKLQkJCQkJfQotCQkJCQlnb3RvIGZhaWw7Ci0JCQkJfQotCQkJCVB5RGljdF9TZXRJdGVtKGt3ZGljdCwga2V5d29yZCwgdmFsdWUpOwotCQkJCWNvbnRpbnVlOwotCQkJfQorICAgIGlmIChjby0+Y29fYXJnY291bnQgPiAwIHx8CisgICAgICAgIGNvLT5jb19mbGFncyAmIChDT19WQVJBUkdTIHwgQ09fVkFSS0VZV09SRFMpKSB7CisgICAgICAgIGludCBpOworICAgICAgICBpbnQgbiA9IGFyZ2NvdW50OworICAgICAgICBQeU9iamVjdCAqa3dkaWN0ID0gTlVMTDsKKyAgICAgICAgaWYgKGNvLT5jb19mbGFncyAmIENPX1ZBUktFWVdPUkRTKSB7CisgICAgICAgICAgICBrd2RpY3QgPSBQeURpY3RfTmV3KCk7CisgICAgICAgICAgICBpZiAoa3dkaWN0ID09IE5VTEwpCisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgaSA9IGNvLT5jb19hcmdjb3VudDsKKyAgICAgICAgICAgIGlmIChjby0+Y29fZmxhZ3MgJiBDT19WQVJBUkdTKQorICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgIFNFVExPQ0FMKGksIGt3ZGljdCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGFyZ2NvdW50ID4gY28tPmNvX2FyZ2NvdW50KSB7CisgICAgICAgICAgICBpZiAoIShjby0+Y29fZmxhZ3MgJiBDT19WQVJBUkdTKSkgeworICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICIlLjIwMHMoKSB0YWtlcyAlcyAlZCAiCisgICAgICAgICAgICAgICAgICAgICIlc2FyZ3VtZW50JXMgKCVkIGdpdmVuKSIsCisgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FzU3RyaW5nKGNvLT5jb19uYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgZGVmY291bnQgPyAiYXQgbW9zdCIgOiAiZXhhY3RseSIsCisgICAgICAgICAgICAgICAgICAgIGNvLT5jb19hcmdjb3VudCwKKyAgICAgICAgICAgICAgICAgICAga3djb3VudCA/ICJub24ta2V5d29yZCAiIDogIiIsCisgICAgICAgICAgICAgICAgICAgIGNvLT5jb19hcmdjb3VudCA9PSAxID8gIiIgOiAicyIsCisgICAgICAgICAgICAgICAgICAgIGFyZ2NvdW50KTsKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuID0gY28tPmNvX2FyZ2NvdW50OworICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICAgIHggPSBhcmdzW2ldOworICAgICAgICAgICAgUHlfSU5DUkVGKHgpOworICAgICAgICAgICAgU0VUTE9DQUwoaSwgeCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvLT5jb19mbGFncyAmIENPX1ZBUkFSR1MpIHsKKyAgICAgICAgICAgIHUgPSBQeVR1cGxlX05ldyhhcmdjb3VudCAtIG4pOworICAgICAgICAgICAgaWYgKHUgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICBTRVRMT0NBTChjby0+Y29fYXJnY291bnQsIHUpOworICAgICAgICAgICAgZm9yIChpID0gbjsgaSA8IGFyZ2NvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICB4ID0gYXJnc1tpXTsKKyAgICAgICAgICAgICAgICBQeV9JTkNSRUYoeCk7CisgICAgICAgICAgICAgICAgUHlUdXBsZV9TRVRfSVRFTSh1LCBpLW4sIHgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBrd2NvdW50OyBpKyspIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICoqY29fdmFybmFtZXM7CisgICAgICAgICAgICBQeU9iamVjdCAqa2V5d29yZCA9IGt3c1syKmldOworICAgICAgICAgICAgUHlPYmplY3QgKnZhbHVlID0ga3dzWzIqaSArIDFdOworICAgICAgICAgICAgaW50IGo7CisgICAgICAgICAgICBpZiAoa2V5d29yZCA9PSBOVUxMIHx8ICEoUHlTdHJpbmdfQ2hlY2soa2V5d29yZCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfQ2hlY2soa2V5d29yZCkpKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgIiUuMjAwcygpIGtleXdvcmRzIG11c3QgYmUgc3RyaW5ncyIsCisgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FzU3RyaW5nKGNvLT5jb19uYW1lKSk7CisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogU3BlZWQgaGFjazogZG8gcmF3IHBvaW50ZXIgY29tcGFyZXMuIEFzIG5hbWVzIGFyZQorICAgICAgICAgICAgICAgbm9ybWFsbHkgaW50ZXJuZWQgdGhpcyBzaG91bGQgYWxtb3N0IGFsd2F5cyBoaXQuICovCisgICAgICAgICAgICBjb192YXJuYW1lcyA9IFB5U2VxdWVuY2VfRmFzdF9JVEVNUyhjby0+Y29fdmFybmFtZXMpOworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGNvLT5jb19hcmdjb3VudDsgaisrKSB7CisgICAgICAgICAgICAgICAgUHlPYmplY3QgKm5tID0gY29fdmFybmFtZXNbal07CisgICAgICAgICAgICAgICAgaWYgKG5tID09IGtleXdvcmQpCisgICAgICAgICAgICAgICAgICAgIGdvdG8ga3dfZm91bmQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBTbG93IGZhbGxiYWNrLCBqdXN0IGluIGNhc2UgKi8KKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBjby0+Y29fYXJnY291bnQ7IGorKykgeworICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpubSA9IGNvX3Zhcm5hbWVzW2pdOworICAgICAgICAgICAgICAgIGludCBjbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woCisgICAgICAgICAgICAgICAgICAgIGtleXdvcmQsIG5tLCBQeV9FUSk7CisgICAgICAgICAgICAgICAgaWYgKGNtcCA+IDApCisgICAgICAgICAgICAgICAgICAgIGdvdG8ga3dfZm91bmQ7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoY21wIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogQ2hlY2sgZXJyb3JzIGZyb20gQ29tcGFyZSAqLworICAgICAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgaWYgKGogPj0gY28tPmNvX2FyZ2NvdW50KSB7CisgICAgICAgICAgICAgICAgaWYgKGt3ZGljdCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICprd2Rfc3RyID0ga3dkX2FzX3N0cmluZyhrZXl3b3JkKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGt3ZF9zdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUuMjAwcygpIGdvdCBhbiB1bmV4cGVjdGVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAia2V5d29yZCBhcmd1bWVudCAnJS40MDBzJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQXNTdHJpbmcoY28tPmNvX25hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FzU3RyaW5nKGt3ZF9zdHIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihrd2Rfc3RyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFB5RGljdF9TZXRJdGVtKGt3ZGljdCwga2V5d29yZCwgdmFsdWUpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQoga3dfZm91bmQ6Ci0JCQlpZiAoR0VUTE9DQUwoaikgIT0gTlVMTCkgewotCQkJCVB5T2JqZWN0ICprd2Rfc3RyID0ga3dkX2FzX3N0cmluZyhrZXl3b3JkKTsKLQkJCQlpZiAoa3dkX3N0cikgewotCQkJCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJCQkJICAgICAiJS4yMDBzKCkgZ290IG11bHRpcGxlICIKLQkJCQkJCSAgICAgInZhbHVlcyBmb3Iga2V5d29yZCAiCi0JCQkJCQkgICAgICJhcmd1bWVudCAnJS40MDBzJyIsCi0JCQkJCQkgICAgIFB5U3RyaW5nX0FzU3RyaW5nKGNvLT5jb19uYW1lKSwKLQkJCQkJCSAgICAgUHlTdHJpbmdfQXNTdHJpbmcoa3dkX3N0cikpOwotCQkJCQlQeV9ERUNSRUYoa3dkX3N0cik7Ci0JCQkJfQotCQkJCWdvdG8gZmFpbDsKLQkJCX0KLQkJCVB5X0lOQ1JFRih2YWx1ZSk7Ci0JCQlTRVRMT0NBTChqLCB2YWx1ZSk7Ci0JCX0KLQkJaWYgKGFyZ2NvdW50IDwgY28tPmNvX2FyZ2NvdW50KSB7Ci0JCQlpbnQgbSA9IGNvLT5jb19hcmdjb3VudCAtIGRlZmNvdW50OwotCQkJZm9yIChpID0gYXJnY291bnQ7IGkgPCBtOyBpKyspIHsKLQkJCQlpZiAoR0VUTE9DQUwoaSkgPT0gTlVMTCkgewotCQkJCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJCQkgICAgIiUuMjAwcygpIHRha2VzICVzICVkICIKLQkJCQkJICAgICIlc2FyZ3VtZW50JXMgKCVkIGdpdmVuKSIsCi0JCQkJCSAgICBQeVN0cmluZ19Bc1N0cmluZyhjby0+Y29fbmFtZSksCi0JCQkJCSAgICAoKGNvLT5jb19mbGFncyAmIENPX1ZBUkFSR1MpIHx8Ci0JCQkJCSAgICAgZGVmY291bnQpID8gImF0IGxlYXN0IgotCQkJCQkJICAgICAgIDogImV4YWN0bHkiLAotCQkJCQkgICAgbSwga3djb3VudCA/ICJub24ta2V5d29yZCAiIDogIiIsCi0JCQkJCSAgICBtID09IDEgPyAiIiA6ICJzIiwgaSk7Ci0JCQkJCWdvdG8gZmFpbDsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAobiA+IG0pCi0JCQkJaSA9IG4gLSBtOwotCQkJZWxzZQotCQkJCWkgPSAwOwotCQkJZm9yICg7IGkgPCBkZWZjb3VudDsgaSsrKSB7Ci0JCQkJaWYgKEdFVExPQ0FMKG0raSkgPT0gTlVMTCkgewotCQkJCQlQeU9iamVjdCAqZGVmID0gZGVmc1tpXTsKLQkJCQkJUHlfSU5DUkVGKGRlZik7Ci0JCQkJCVNFVExPQ0FMKG0raSwgZGVmKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JZWxzZSB7Ci0JCWlmIChhcmdjb3VudCA+IDAgfHwga3djb3VudCA+IDApIHsKLQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkJICAgICAiJS4yMDBzKCkgdGFrZXMgbm8gYXJndW1lbnRzICglZCBnaXZlbikiLAotCQkJCSAgICAgUHlTdHJpbmdfQXNTdHJpbmcoY28tPmNvX25hbWUpLAotCQkJCSAgICAgYXJnY291bnQgKyBrd2NvdW50KTsKLQkJCWdvdG8gZmFpbDsKLQkJfQotCX0KLQkvKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBzdG9yYWdlIGZvciBjZWxsIHZhcnMsIGFuZCBjb3B5IGZyZWUKLQkgICB2YXJzIGludG8gZnJhbWUuICBUaGlzIGlzbid0IHRvbyBlZmZpY2llbnQgcmlnaHQgbm93LiAqLwotCWlmIChQeVR1cGxlX0dFVF9TSVpFKGNvLT5jb19jZWxsdmFycykpIHsKLQkJaW50IGksIGosIG5hcmdzLCBmb3VuZDsKLQkJY2hhciAqY2VsbG5hbWUsICphcmduYW1lOwotCQlQeU9iamVjdCAqYzsKKyAgICAgICAgICAgIGlmIChHRVRMT0NBTChqKSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlPYmplY3QgKmt3ZF9zdHIgPSBrd2RfYXNfc3RyaW5nKGtleXdvcmQpOworICAgICAgICAgICAgICAgIGlmIChrd2Rfc3RyKSB7CisgICAgICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJS4yMDBzKCkgZ290IG11bHRpcGxlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZXMgZm9yIGtleXdvcmQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFyZ3VtZW50ICclLjQwMHMnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FzU3RyaW5nKGNvLT5jb19uYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FzU3RyaW5nKGt3ZF9zdHIpKTsKKyAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGt3ZF9zdHIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQeV9JTkNSRUYodmFsdWUpOworICAgICAgICAgICAgU0VUTE9DQUwoaiwgdmFsdWUpOworICAgICAgICB9CisgICAgICAgIGlmIChhcmdjb3VudCA8IGNvLT5jb19hcmdjb3VudCkgeworICAgICAgICAgICAgaW50IG0gPSBjby0+Y29fYXJnY291bnQgLSBkZWZjb3VudDsKKyAgICAgICAgICAgIGZvciAoaSA9IGFyZ2NvdW50OyBpIDwgbTsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKEdFVExPQ0FMKGkpID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICIlLjIwMHMoKSB0YWtlcyAlcyAlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAiJXNhcmd1bWVudCVzICglZCBnaXZlbikiLAorICAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQXNTdHJpbmcoY28tPmNvX25hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgKChjby0+Y29fZmxhZ3MgJiBDT19WQVJBUkdTKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmNvdW50KSA/ICJhdCBsZWFzdCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiZXhhY3RseSIsCisgICAgICAgICAgICAgICAgICAgICAgICBtLCBrd2NvdW50ID8gIm5vbi1rZXl3b3JkICIgOiAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG0gPT0gMSA/ICIiIDogInMiLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChuID4gbSkKKyAgICAgICAgICAgICAgICBpID0gbiAtIG07CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgaSA9IDA7CisgICAgICAgICAgICBmb3IgKDsgaSA8IGRlZmNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoR0VUTE9DQUwobStpKSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpkZWYgPSBkZWZzW2ldOworICAgICAgICAgICAgICAgICAgICBQeV9JTkNSRUYoZGVmKTsKKyAgICAgICAgICAgICAgICAgICAgU0VUTE9DQUwobStpLCBkZWYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKGFyZ2NvdW50ID4gMCB8fCBrd2NvdW50ID4gMCkgeworICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiJS4yMDBzKCkgdGFrZXMgbm8gYXJndW1lbnRzICglZCBnaXZlbikiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FzU3RyaW5nKGNvLT5jb19uYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhcmdjb3VudCArIGt3Y291bnQpOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgfQorICAgIC8qIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHN0b3JhZ2UgZm9yIGNlbGwgdmFycywgYW5kIGNvcHkgZnJlZQorICAgICAgIHZhcnMgaW50byBmcmFtZS4gIFRoaXMgaXNuJ3QgdG9vIGVmZmljaWVudCByaWdodCBub3cuICovCisgICAgaWYgKFB5VHVwbGVfR0VUX1NJWkUoY28tPmNvX2NlbGx2YXJzKSkgeworICAgICAgICBpbnQgaSwgaiwgbmFyZ3MsIGZvdW5kOworICAgICAgICBjaGFyICpjZWxsbmFtZSwgKmFyZ25hbWU7CisgICAgICAgIFB5T2JqZWN0ICpjOwogCi0JCW5hcmdzID0gY28tPmNvX2FyZ2NvdW50OwotCQlpZiAoY28tPmNvX2ZsYWdzICYgQ09fVkFSQVJHUykKLQkJCW5hcmdzKys7Ci0JCWlmIChjby0+Y29fZmxhZ3MgJiBDT19WQVJLRVlXT1JEUykKLQkJCW5hcmdzKys7CisgICAgICAgIG5hcmdzID0gY28tPmNvX2FyZ2NvdW50OworICAgICAgICBpZiAoY28tPmNvX2ZsYWdzICYgQ09fVkFSQVJHUykKKyAgICAgICAgICAgIG5hcmdzKys7CisgICAgICAgIGlmIChjby0+Y29fZmxhZ3MgJiBDT19WQVJLRVlXT1JEUykKKyAgICAgICAgICAgIG5hcmdzKys7CiAKLQkJLyogSW5pdGlhbGl6ZSBlYWNoIGNlbGwgdmFyLCB0YWtpbmcgaW50byBhY2NvdW50Ci0JCSAgIGNlbGwgdmFycyB0aGF0IGFyZSBpbml0aWFsaXplZCBmcm9tIGFyZ3VtZW50cy4KKyAgICAgICAgLyogSW5pdGlhbGl6ZSBlYWNoIGNlbGwgdmFyLCB0YWtpbmcgaW50byBhY2NvdW50CisgICAgICAgICAgIGNlbGwgdmFycyB0aGF0IGFyZSBpbml0aWFsaXplZCBmcm9tIGFyZ3VtZW50cy4KIAotCQkgICBTaG91bGQgYXJyYW5nZSBmb3IgdGhlIGNvbXBpbGVyIHRvIHB1dCBjZWxsdmFycwotCQkgICB0aGF0IGFyZSBhcmd1bWVudHMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgY2VsbHZhcnMKLQkJICAgbGlzdCBzbyB0aGF0IHdlIGNhbiBtYXJjaCBvdmVyIGl0IG1vcmUgZWZmaWNpZW50bHk/Ci0JCSovCi0JCWZvciAoaSA9IDA7IGkgPCBQeVR1cGxlX0dFVF9TSVpFKGNvLT5jb19jZWxsdmFycyk7ICsraSkgewotCQkJY2VsbG5hbWUgPSBQeVN0cmluZ19BU19TVFJJTkcoCi0JCQkJUHlUdXBsZV9HRVRfSVRFTShjby0+Y29fY2VsbHZhcnMsIGkpKTsKLQkJCWZvdW5kID0gMDsKLQkJCWZvciAoaiA9IDA7IGogPCBuYXJnczsgaisrKSB7Ci0JCQkJYXJnbmFtZSA9IFB5U3RyaW5nX0FTX1NUUklORygKLQkJCQkJUHlUdXBsZV9HRVRfSVRFTShjby0+Y29fdmFybmFtZXMsIGopKTsKLQkJCQlpZiAoc3RyY21wKGNlbGxuYW1lLCBhcmduYW1lKSA9PSAwKSB7Ci0JCQkJCWMgPSBQeUNlbGxfTmV3KEdFVExPQ0FMKGopKTsKLQkJCQkJaWYgKGMgPT0gTlVMTCkKLQkJCQkJCWdvdG8gZmFpbDsKLQkJCQkJR0VUTE9DQUwoY28tPmNvX25sb2NhbHMgKyBpKSA9IGM7Ci0JCQkJCWZvdW5kID0gMTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGZvdW5kID09IDApIHsKLQkJCQljID0gUHlDZWxsX05ldyhOVUxMKTsKLQkJCQlpZiAoYyA9PSBOVUxMKQotCQkJCQlnb3RvIGZhaWw7Ci0JCQkJU0VUTE9DQUwoY28tPmNvX25sb2NhbHMgKyBpLCBjKTsKLQkJCX0KLQkJfQotCX0KLQlpZiAoUHlUdXBsZV9HRVRfU0laRShjby0+Y29fZnJlZXZhcnMpKSB7Ci0JCWludCBpOwotCQlmb3IgKGkgPSAwOyBpIDwgUHlUdXBsZV9HRVRfU0laRShjby0+Y29fZnJlZXZhcnMpOyArK2kpIHsKLQkJCVB5T2JqZWN0ICpvID0gUHlUdXBsZV9HRVRfSVRFTShjbG9zdXJlLCBpKTsKLQkJCVB5X0lOQ1JFRihvKTsKLQkJCWZyZWV2YXJzW1B5VHVwbGVfR0VUX1NJWkUoY28tPmNvX2NlbGx2YXJzKSArIGldID0gbzsKLQkJfQotCX0KKyAgICAgICAgICAgU2hvdWxkIGFycmFuZ2UgZm9yIHRoZSBjb21waWxlciB0byBwdXQgY2VsbHZhcnMKKyAgICAgICAgICAgdGhhdCBhcmUgYXJndW1lbnRzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGNlbGx2YXJzCisgICAgICAgICAgIGxpc3Qgc28gdGhhdCB3ZSBjYW4gbWFyY2ggb3ZlciBpdCBtb3JlIGVmZmljaWVudGx5PworICAgICAgICAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgUHlUdXBsZV9HRVRfU0laRShjby0+Y29fY2VsbHZhcnMpOyArK2kpIHsKKyAgICAgICAgICAgIGNlbGxuYW1lID0gUHlTdHJpbmdfQVNfU1RSSU5HKAorICAgICAgICAgICAgICAgIFB5VHVwbGVfR0VUX0lURU0oY28tPmNvX2NlbGx2YXJzLCBpKSk7CisgICAgICAgICAgICBmb3VuZCA9IDA7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbmFyZ3M7IGorKykgeworICAgICAgICAgICAgICAgIGFyZ25hbWUgPSBQeVN0cmluZ19BU19TVFJJTkcoCisgICAgICAgICAgICAgICAgICAgIFB5VHVwbGVfR0VUX0lURU0oY28tPmNvX3Zhcm5hbWVzLCBqKSk7CisgICAgICAgICAgICAgICAgaWYgKHN0cmNtcChjZWxsbmFtZSwgYXJnbmFtZSkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBjID0gUHlDZWxsX05ldyhHRVRMT0NBTChqKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgICAgIEdFVExPQ0FMKGNvLT5jb19ubG9jYWxzICsgaSkgPSBjOworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IDE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChmb3VuZCA9PSAwKSB7CisgICAgICAgICAgICAgICAgYyA9IFB5Q2VsbF9OZXcoTlVMTCk7CisgICAgICAgICAgICAgICAgaWYgKGMgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgICAgIFNFVExPQ0FMKGNvLT5jb19ubG9jYWxzICsgaSwgYyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKFB5VHVwbGVfR0VUX1NJWkUoY28tPmNvX2ZyZWV2YXJzKSkgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IFB5VHVwbGVfR0VUX1NJWkUoY28tPmNvX2ZyZWV2YXJzKTsgKytpKSB7CisgICAgICAgICAgICBQeU9iamVjdCAqbyA9IFB5VHVwbGVfR0VUX0lURU0oY2xvc3VyZSwgaSk7CisgICAgICAgICAgICBQeV9JTkNSRUYobyk7CisgICAgICAgICAgICBmcmVldmFyc1tQeVR1cGxlX0dFVF9TSVpFKGNvLT5jb19jZWxsdmFycykgKyBpXSA9IG87CisgICAgICAgIH0KKyAgICB9CiAKLQlpZiAoY28tPmNvX2ZsYWdzICYgQ09fR0VORVJBVE9SKSB7Ci0JCS8qIERvbid0IG5lZWQgdG8ga2VlcCB0aGUgcmVmZXJlbmNlIHRvIGZfYmFjaywgaXQgd2lsbCBiZSBzZXQKLQkJICogd2hlbiB0aGUgZ2VuZXJhdG9yIGlzIHJlc3VtZWQuICovCi0JCVB5X1hERUNSRUYoZi0+Zl9iYWNrKTsKLQkJZi0+Zl9iYWNrID0gTlVMTDsKKyAgICBpZiAoY28tPmNvX2ZsYWdzICYgQ09fR0VORVJBVE9SKSB7CisgICAgICAgIC8qIERvbid0IG5lZWQgdG8ga2VlcCB0aGUgcmVmZXJlbmNlIHRvIGZfYmFjaywgaXQgd2lsbCBiZSBzZXQKKyAgICAgICAgICogd2hlbiB0aGUgZ2VuZXJhdG9yIGlzIHJlc3VtZWQuICovCisgICAgICAgIFB5X1hERUNSRUYoZi0+Zl9iYWNrKTsKKyAgICAgICAgZi0+Zl9iYWNrID0gTlVMTDsKIAotCQlQQ0FMTChQQ0FMTF9HRU5FUkFUT1IpOworICAgICAgICBQQ0FMTChQQ0FMTF9HRU5FUkFUT1IpOwogCi0JCS8qIENyZWF0ZSBhIG5ldyBnZW5lcmF0b3IgdGhhdCBvd25zIHRoZSByZWFkeSB0byBydW4gZnJhbWUKLQkJICogYW5kIHJldHVybiB0aGF0IGFzIHRoZSB2YWx1ZS4gKi8KLQkJcmV0dXJuIFB5R2VuX05ldyhmKTsKLQl9CisgICAgICAgIC8qIENyZWF0ZSBhIG5ldyBnZW5lcmF0b3IgdGhhdCBvd25zIHRoZSByZWFkeSB0byBydW4gZnJhbWUKKyAgICAgICAgICogYW5kIHJldHVybiB0aGF0IGFzIHRoZSB2YWx1ZS4gKi8KKyAgICAgICAgcmV0dXJuIFB5R2VuX05ldyhmKTsKKyAgICB9CiAKLQlyZXR2YWwgPSBQeUV2YWxfRXZhbEZyYW1lRXgoZiwwKTsKKyAgICByZXR2YWwgPSBQeUV2YWxfRXZhbEZyYW1lRXgoZiwwKTsKIAogZmFpbDogLyogSnVtcCBoZXJlIGZyb20gcHJlbHVkZSBvbiBmYWlsdXJlICovCiAKLQkvKiBkZWNyZWYnaW5nIHRoZSBmcmFtZSBjYW4gY2F1c2UgX19kZWxfXyBtZXRob2RzIHRvIGdldCBpbnZva2VkLAotCSAgIHdoaWNoIGNhbiBjYWxsIGJhY2sgaW50byBQeXRob24uICBXaGlsZSB3ZSdyZSBkb25lIHdpdGggdGhlCi0JICAgY3VycmVudCBQeXRob24gZnJhbWUgKGYpLCB0aGUgYXNzb2NpYXRlZCBDIHN0YWNrIGlzIHN0aWxsIGluIHVzZSwKLQkgICBzbyByZWN1cnNpb25fZGVwdGggbXVzdCBiZSBib29zdGVkIGZvciB0aGUgZHVyYXRpb24uCi0JKi8KLQlhc3NlcnQodHN0YXRlICE9IE5VTEwpOwotCSsrdHN0YXRlLT5yZWN1cnNpb25fZGVwdGg7Ci0JUHlfREVDUkVGKGYpOwotCS0tdHN0YXRlLT5yZWN1cnNpb25fZGVwdGg7Ci0JcmV0dXJuIHJldHZhbDsKKyAgICAvKiBkZWNyZWYnaW5nIHRoZSBmcmFtZSBjYW4gY2F1c2UgX19kZWxfXyBtZXRob2RzIHRvIGdldCBpbnZva2VkLAorICAgICAgIHdoaWNoIGNhbiBjYWxsIGJhY2sgaW50byBQeXRob24uICBXaGlsZSB3ZSdyZSBkb25lIHdpdGggdGhlCisgICAgICAgY3VycmVudCBQeXRob24gZnJhbWUgKGYpLCB0aGUgYXNzb2NpYXRlZCBDIHN0YWNrIGlzIHN0aWxsIGluIHVzZSwKKyAgICAgICBzbyByZWN1cnNpb25fZGVwdGggbXVzdCBiZSBib29zdGVkIGZvciB0aGUgZHVyYXRpb24uCisgICAgKi8KKyAgICBhc3NlcnQodHN0YXRlICE9IE5VTEwpOworICAgICsrdHN0YXRlLT5yZWN1cnNpb25fZGVwdGg7CisgICAgUHlfREVDUkVGKGYpOworICAgIC0tdHN0YXRlLT5yZWN1cnNpb25fZGVwdGg7CisgICAgcmV0dXJuIHJldHZhbDsKIH0KIAogCiBzdGF0aWMgUHlPYmplY3QgKgoga3dkX2FzX3N0cmluZyhQeU9iamVjdCAqa3dkKSB7Ci0JaWYgKFB5U3RyaW5nX0NoZWNrKGt3ZCkpIHsKLQkJUHlfSU5DUkVGKGt3ZCk7Ci0JCXJldHVybiBrd2Q7Ci0JfQotCWVsc2UKLQkJcmV0dXJuIF9QeVVuaWNvZGVfQXNEZWZhdWx0RW5jb2RlZFN0cmluZyhrd2QsICJyZXBsYWNlIik7CisgICAgaWYgKFB5U3RyaW5nX0NoZWNrKGt3ZCkpIHsKKyAgICAgICAgUHlfSU5DUkVGKGt3ZCk7CisgICAgICAgIHJldHVybiBrd2Q7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIF9QeVVuaWNvZGVfQXNEZWZhdWx0RW5jb2RlZFN0cmluZyhrd2QsICJyZXBsYWNlIik7CiB9CiAKIApAQCAtMzA0OCwxMCArMzA0OCwxMCBAQAogICB0aGlzOgogCiAgICAgIHRyeToKLQkic29tZXRoaW5nIHRoYXQgbWF5IGZhaWwiCisgICAgInNvbWV0aGluZyB0aGF0IG1heSBmYWlsIgogICAgICBleGNlcHQgInNvbWUgZXhjZXB0aW9uIjoKLQkiZG8gc29tZXRoaW5nIGVsc2UgZmlyc3QiCi0JInByaW50IHRoZSBleGNlcHRpb24gZnJvbSBzeXMuZXhjX1paWi4iCisgICAgImRvIHNvbWV0aGluZyBlbHNlIGZpcnN0IgorICAgICJwcmludCB0aGUgZXhjZXB0aW9uIGZyb20gc3lzLmV4Y19aWlouIgogCiAgIGlmICJkbyBzb21ldGhpbmcgZWxzZSBmaXJzdCIgaW52b2tlZCBzb21ldGhpbmcgdGhhdCByYWlzZWQgYW5kIGNhdWdodAogICBhbiBleGNlcHRpb24sIHN5cy5leGNfWlpaIHdlcmUgb3ZlcndyaXR0ZW4uICBUaGF0IHdhcyBhIGZyZXF1ZW50CkBAIC0zMDg5LDkyICszMDg5LDkyIEBACiAKIHN0YXRpYyB2b2lkCiBzZXRfZXhjX2luZm8oUHlUaHJlYWRTdGF0ZSAqdHN0YXRlLAotCSAgICAgUHlPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICp2YWx1ZSwgUHlPYmplY3QgKnRiKQorICAgICAgICAgICAgIFB5T2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqdmFsdWUsIFB5T2JqZWN0ICp0YikKIHsKLQlQeUZyYW1lT2JqZWN0ICpmcmFtZSA9IHRzdGF0ZS0+ZnJhbWU7Ci0JUHlPYmplY3QgKnRtcF90eXBlLCAqdG1wX3ZhbHVlLCAqdG1wX3RiOworICAgIFB5RnJhbWVPYmplY3QgKmZyYW1lID0gdHN0YXRlLT5mcmFtZTsKKyAgICBQeU9iamVjdCAqdG1wX3R5cGUsICp0bXBfdmFsdWUsICp0bXBfdGI7CiAKLQlhc3NlcnQodHlwZSAhPSBOVUxMKTsKLQlhc3NlcnQoZnJhbWUgIT0gTlVMTCk7Ci0JaWYgKGZyYW1lLT5mX2V4Y190eXBlID09IE5VTEwpIHsKLQkJYXNzZXJ0KGZyYW1lLT5mX2V4Y192YWx1ZSA9PSBOVUxMKTsKLQkJYXNzZXJ0KGZyYW1lLT5mX2V4Y190cmFjZWJhY2sgPT0gTlVMTCk7Ci0JCS8qIFRoaXMgZnJhbWUgZGlkbid0IGNhdGNoIGFuIGV4Y2VwdGlvbiBiZWZvcmUuICovCi0JCS8qIFNhdmUgcHJldmlvdXMgZXhjZXB0aW9uIG9mIHRoaXMgdGhyZWFkIGluIHRoaXMgZnJhbWUuICovCi0JCWlmICh0c3RhdGUtPmV4Y190eXBlID09IE5VTEwpIHsKLQkJCS8qIFhYWCBXaHkgaXMgdGhpcyBzZXQgdG8gUHlfTm9uZT8gKi8KLQkJCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJCXRzdGF0ZS0+ZXhjX3R5cGUgPSBQeV9Ob25lOwotCQl9Ci0JCVB5X0lOQ1JFRih0c3RhdGUtPmV4Y190eXBlKTsKLQkJUHlfWElOQ1JFRih0c3RhdGUtPmV4Y192YWx1ZSk7Ci0JCVB5X1hJTkNSRUYodHN0YXRlLT5leGNfdHJhY2ViYWNrKTsKLQkJZnJhbWUtPmZfZXhjX3R5cGUgPSB0c3RhdGUtPmV4Y190eXBlOwotCQlmcmFtZS0+Zl9leGNfdmFsdWUgPSB0c3RhdGUtPmV4Y192YWx1ZTsKLQkJZnJhbWUtPmZfZXhjX3RyYWNlYmFjayA9IHRzdGF0ZS0+ZXhjX3RyYWNlYmFjazsKLQl9Ci0JLyogU2V0IG5ldyBleGNlcHRpb24gZm9yIHRoaXMgdGhyZWFkLiAqLwotCXRtcF90eXBlID0gdHN0YXRlLT5leGNfdHlwZTsKLQl0bXBfdmFsdWUgPSB0c3RhdGUtPmV4Y192YWx1ZTsKLQl0bXBfdGIgPSB0c3RhdGUtPmV4Y190cmFjZWJhY2s7Ci0JUHlfSU5DUkVGKHR5cGUpOwotCVB5X1hJTkNSRUYodmFsdWUpOwotCVB5X1hJTkNSRUYodGIpOwotCXRzdGF0ZS0+ZXhjX3R5cGUgPSB0eXBlOwotCXRzdGF0ZS0+ZXhjX3ZhbHVlID0gdmFsdWU7Ci0JdHN0YXRlLT5leGNfdHJhY2ViYWNrID0gdGI7Ci0JUHlfWERFQ1JFRih0bXBfdHlwZSk7Ci0JUHlfWERFQ1JFRih0bXBfdmFsdWUpOwotCVB5X1hERUNSRUYodG1wX3RiKTsKLQkvKiBGb3IgYi93IGNvbXBhdGliaWxpdHkgKi8KLQlQeVN5c19TZXRPYmplY3QoImV4Y190eXBlIiwgdHlwZSk7Ci0JUHlTeXNfU2V0T2JqZWN0KCJleGNfdmFsdWUiLCB2YWx1ZSk7Ci0JUHlTeXNfU2V0T2JqZWN0KCJleGNfdHJhY2ViYWNrIiwgdGIpOworICAgIGFzc2VydCh0eXBlICE9IE5VTEwpOworICAgIGFzc2VydChmcmFtZSAhPSBOVUxMKTsKKyAgICBpZiAoZnJhbWUtPmZfZXhjX3R5cGUgPT0gTlVMTCkgeworICAgICAgICBhc3NlcnQoZnJhbWUtPmZfZXhjX3ZhbHVlID09IE5VTEwpOworICAgICAgICBhc3NlcnQoZnJhbWUtPmZfZXhjX3RyYWNlYmFjayA9PSBOVUxMKTsKKyAgICAgICAgLyogVGhpcyBmcmFtZSBkaWRuJ3QgY2F0Y2ggYW4gZXhjZXB0aW9uIGJlZm9yZS4gKi8KKyAgICAgICAgLyogU2F2ZSBwcmV2aW91cyBleGNlcHRpb24gb2YgdGhpcyB0aHJlYWQgaW4gdGhpcyBmcmFtZS4gKi8KKyAgICAgICAgaWYgKHRzdGF0ZS0+ZXhjX3R5cGUgPT0gTlVMTCkgeworICAgICAgICAgICAgLyogWFhYIFdoeSBpcyB0aGlzIHNldCB0byBQeV9Ob25lPyAqLworICAgICAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICAgICAgdHN0YXRlLT5leGNfdHlwZSA9IFB5X05vbmU7CisgICAgICAgIH0KKyAgICAgICAgUHlfSU5DUkVGKHRzdGF0ZS0+ZXhjX3R5cGUpOworICAgICAgICBQeV9YSU5DUkVGKHRzdGF0ZS0+ZXhjX3ZhbHVlKTsKKyAgICAgICAgUHlfWElOQ1JFRih0c3RhdGUtPmV4Y190cmFjZWJhY2spOworICAgICAgICBmcmFtZS0+Zl9leGNfdHlwZSA9IHRzdGF0ZS0+ZXhjX3R5cGU7CisgICAgICAgIGZyYW1lLT5mX2V4Y192YWx1ZSA9IHRzdGF0ZS0+ZXhjX3ZhbHVlOworICAgICAgICBmcmFtZS0+Zl9leGNfdHJhY2ViYWNrID0gdHN0YXRlLT5leGNfdHJhY2ViYWNrOworICAgIH0KKyAgICAvKiBTZXQgbmV3IGV4Y2VwdGlvbiBmb3IgdGhpcyB0aHJlYWQuICovCisgICAgdG1wX3R5cGUgPSB0c3RhdGUtPmV4Y190eXBlOworICAgIHRtcF92YWx1ZSA9IHRzdGF0ZS0+ZXhjX3ZhbHVlOworICAgIHRtcF90YiA9IHRzdGF0ZS0+ZXhjX3RyYWNlYmFjazsKKyAgICBQeV9JTkNSRUYodHlwZSk7CisgICAgUHlfWElOQ1JFRih2YWx1ZSk7CisgICAgUHlfWElOQ1JFRih0Yik7CisgICAgdHN0YXRlLT5leGNfdHlwZSA9IHR5cGU7CisgICAgdHN0YXRlLT5leGNfdmFsdWUgPSB2YWx1ZTsKKyAgICB0c3RhdGUtPmV4Y190cmFjZWJhY2sgPSB0YjsKKyAgICBQeV9YREVDUkVGKHRtcF90eXBlKTsKKyAgICBQeV9YREVDUkVGKHRtcF92YWx1ZSk7CisgICAgUHlfWERFQ1JFRih0bXBfdGIpOworICAgIC8qIEZvciBiL3cgY29tcGF0aWJpbGl0eSAqLworICAgIFB5U3lzX1NldE9iamVjdCgiZXhjX3R5cGUiLCB0eXBlKTsKKyAgICBQeVN5c19TZXRPYmplY3QoImV4Y192YWx1ZSIsIHZhbHVlKTsKKyAgICBQeVN5c19TZXRPYmplY3QoImV4Y190cmFjZWJhY2siLCB0Yik7CiB9CiAKIHN0YXRpYyB2b2lkCiByZXNldF9leGNfaW5mbyhQeVRocmVhZFN0YXRlICp0c3RhdGUpCiB7Ci0JUHlGcmFtZU9iamVjdCAqZnJhbWU7Ci0JUHlPYmplY3QgKnRtcF90eXBlLCAqdG1wX3ZhbHVlLCAqdG1wX3RiOworICAgIFB5RnJhbWVPYmplY3QgKmZyYW1lOworICAgIFB5T2JqZWN0ICp0bXBfdHlwZSwgKnRtcF92YWx1ZSwgKnRtcF90YjsKIAotCS8qIEl0J3MgYSBwcmVjb25kaXRpb24gdGhhdCB0aGUgdGhyZWFkIHN0YXRlJ3MgZnJhbWUgY2F1Z2h0IGFuCi0JICogZXhjZXB0aW9uIC0tIHZlcmlmeSBpbiBhIGRlYnVnIGJ1aWxkLgotCSAqLwotCWFzc2VydCh0c3RhdGUgIT0gTlVMTCk7Ci0JZnJhbWUgPSB0c3RhdGUtPmZyYW1lOwotCWFzc2VydChmcmFtZSAhPSBOVUxMKTsKLQlhc3NlcnQoZnJhbWUtPmZfZXhjX3R5cGUgIT0gTlVMTCk7CisgICAgLyogSXQncyBhIHByZWNvbmRpdGlvbiB0aGF0IHRoZSB0aHJlYWQgc3RhdGUncyBmcmFtZSBjYXVnaHQgYW4KKyAgICAgKiBleGNlcHRpb24gLS0gdmVyaWZ5IGluIGEgZGVidWcgYnVpbGQuCisgICAgICovCisgICAgYXNzZXJ0KHRzdGF0ZSAhPSBOVUxMKTsKKyAgICBmcmFtZSA9IHRzdGF0ZS0+ZnJhbWU7CisgICAgYXNzZXJ0KGZyYW1lICE9IE5VTEwpOworICAgIGFzc2VydChmcmFtZS0+Zl9leGNfdHlwZSAhPSBOVUxMKTsKIAotCS8qIENvcHkgdGhlIGZyYW1lJ3MgZXhjZXB0aW9uIGluZm8gYmFjayB0byB0aGUgdGhyZWFkIHN0YXRlLiAqLwotCXRtcF90eXBlID0gdHN0YXRlLT5leGNfdHlwZTsKLQl0bXBfdmFsdWUgPSB0c3RhdGUtPmV4Y192YWx1ZTsKLQl0bXBfdGIgPSB0c3RhdGUtPmV4Y190cmFjZWJhY2s7Ci0JUHlfSU5DUkVGKGZyYW1lLT5mX2V4Y190eXBlKTsKLQlQeV9YSU5DUkVGKGZyYW1lLT5mX2V4Y192YWx1ZSk7Ci0JUHlfWElOQ1JFRihmcmFtZS0+Zl9leGNfdHJhY2ViYWNrKTsKLQl0c3RhdGUtPmV4Y190eXBlID0gZnJhbWUtPmZfZXhjX3R5cGU7Ci0JdHN0YXRlLT5leGNfdmFsdWUgPSBmcmFtZS0+Zl9leGNfdmFsdWU7Ci0JdHN0YXRlLT5leGNfdHJhY2ViYWNrID0gZnJhbWUtPmZfZXhjX3RyYWNlYmFjazsKLQlQeV9YREVDUkVGKHRtcF90eXBlKTsKLQlQeV9YREVDUkVGKHRtcF92YWx1ZSk7Ci0JUHlfWERFQ1JFRih0bXBfdGIpOworICAgIC8qIENvcHkgdGhlIGZyYW1lJ3MgZXhjZXB0aW9uIGluZm8gYmFjayB0byB0aGUgdGhyZWFkIHN0YXRlLiAqLworICAgIHRtcF90eXBlID0gdHN0YXRlLT5leGNfdHlwZTsKKyAgICB0bXBfdmFsdWUgPSB0c3RhdGUtPmV4Y192YWx1ZTsKKyAgICB0bXBfdGIgPSB0c3RhdGUtPmV4Y190cmFjZWJhY2s7CisgICAgUHlfSU5DUkVGKGZyYW1lLT5mX2V4Y190eXBlKTsKKyAgICBQeV9YSU5DUkVGKGZyYW1lLT5mX2V4Y192YWx1ZSk7CisgICAgUHlfWElOQ1JFRihmcmFtZS0+Zl9leGNfdHJhY2ViYWNrKTsKKyAgICB0c3RhdGUtPmV4Y190eXBlID0gZnJhbWUtPmZfZXhjX3R5cGU7CisgICAgdHN0YXRlLT5leGNfdmFsdWUgPSBmcmFtZS0+Zl9leGNfdmFsdWU7CisgICAgdHN0YXRlLT5leGNfdHJhY2ViYWNrID0gZnJhbWUtPmZfZXhjX3RyYWNlYmFjazsKKyAgICBQeV9YREVDUkVGKHRtcF90eXBlKTsKKyAgICBQeV9YREVDUkVGKHRtcF92YWx1ZSk7CisgICAgUHlfWERFQ1JFRih0bXBfdGIpOwogCi0JLyogRm9yIGIvdyBjb21wYXRpYmlsaXR5ICovCi0JUHlTeXNfU2V0T2JqZWN0KCJleGNfdHlwZSIsIGZyYW1lLT5mX2V4Y190eXBlKTsKLQlQeVN5c19TZXRPYmplY3QoImV4Y192YWx1ZSIsIGZyYW1lLT5mX2V4Y192YWx1ZSk7Ci0JUHlTeXNfU2V0T2JqZWN0KCJleGNfdHJhY2ViYWNrIiwgZnJhbWUtPmZfZXhjX3RyYWNlYmFjayk7CisgICAgLyogRm9yIGIvdyBjb21wYXRpYmlsaXR5ICovCisgICAgUHlTeXNfU2V0T2JqZWN0KCJleGNfdHlwZSIsIGZyYW1lLT5mX2V4Y190eXBlKTsKKyAgICBQeVN5c19TZXRPYmplY3QoImV4Y192YWx1ZSIsIGZyYW1lLT5mX2V4Y192YWx1ZSk7CisgICAgUHlTeXNfU2V0T2JqZWN0KCJleGNfdHJhY2ViYWNrIiwgZnJhbWUtPmZfZXhjX3RyYWNlYmFjayk7CiAKLQkvKiBDbGVhciB0aGUgZnJhbWUncyBleGNlcHRpb24gaW5mby4gKi8KLQl0bXBfdHlwZSA9IGZyYW1lLT5mX2V4Y190eXBlOwotCXRtcF92YWx1ZSA9IGZyYW1lLT5mX2V4Y192YWx1ZTsKLQl0bXBfdGIgPSBmcmFtZS0+Zl9leGNfdHJhY2ViYWNrOwotCWZyYW1lLT5mX2V4Y190eXBlID0gTlVMTDsKLQlmcmFtZS0+Zl9leGNfdmFsdWUgPSBOVUxMOwotCWZyYW1lLT5mX2V4Y190cmFjZWJhY2sgPSBOVUxMOwotCVB5X0RFQ1JFRih0bXBfdHlwZSk7Ci0JUHlfWERFQ1JFRih0bXBfdmFsdWUpOwotCVB5X1hERUNSRUYodG1wX3RiKTsKKyAgICAvKiBDbGVhciB0aGUgZnJhbWUncyBleGNlcHRpb24gaW5mby4gKi8KKyAgICB0bXBfdHlwZSA9IGZyYW1lLT5mX2V4Y190eXBlOworICAgIHRtcF92YWx1ZSA9IGZyYW1lLT5mX2V4Y192YWx1ZTsKKyAgICB0bXBfdGIgPSBmcmFtZS0+Zl9leGNfdHJhY2ViYWNrOworICAgIGZyYW1lLT5mX2V4Y190eXBlID0gTlVMTDsKKyAgICBmcmFtZS0+Zl9leGNfdmFsdWUgPSBOVUxMOworICAgIGZyYW1lLT5mX2V4Y190cmFjZWJhY2sgPSBOVUxMOworICAgIFB5X0RFQ1JFRih0bXBfdHlwZSk7CisgICAgUHlfWERFQ1JFRih0bXBfdmFsdWUpOworICAgIFB5X1hERUNSRUYodG1wX3RiKTsKIH0KIAogLyogTG9naWMgZm9yIHRoZSByYWlzZSBzdGF0ZW1lbnQgKHRvbyBjb21wbGljYXRlZCBmb3IgaW5saW5pbmcpLgpAQCAtMzE4MiwxMDggKzMxODIsMTA4IEBACiBzdGF0aWMgZW51bSB3aHlfY29kZQogZG9fcmFpc2UoUHlPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICp2YWx1ZSwgUHlPYmplY3QgKnRiKQogewotCWlmICh0eXBlID09IE5VTEwpIHsKLQkJLyogUmVyYWlzZSAqLwotCQlQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dFVCgpOwotCQl0eXBlID0gdHN0YXRlLT5leGNfdHlwZSA9PSBOVUxMID8gUHlfTm9uZSA6IHRzdGF0ZS0+ZXhjX3R5cGU7Ci0JCXZhbHVlID0gdHN0YXRlLT5leGNfdmFsdWU7Ci0JCXRiID0gdHN0YXRlLT5leGNfdHJhY2ViYWNrOwotCQlQeV9YSU5DUkVGKHR5cGUpOwotCQlQeV9YSU5DUkVGKHZhbHVlKTsKLQkJUHlfWElOQ1JFRih0Yik7Ci0JfQorICAgIGlmICh0eXBlID09IE5VTEwpIHsKKyAgICAgICAgLyogUmVyYWlzZSAqLworICAgICAgICBQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dFVCgpOworICAgICAgICB0eXBlID0gdHN0YXRlLT5leGNfdHlwZSA9PSBOVUxMID8gUHlfTm9uZSA6IHRzdGF0ZS0+ZXhjX3R5cGU7CisgICAgICAgIHZhbHVlID0gdHN0YXRlLT5leGNfdmFsdWU7CisgICAgICAgIHRiID0gdHN0YXRlLT5leGNfdHJhY2ViYWNrOworICAgICAgICBQeV9YSU5DUkVGKHR5cGUpOworICAgICAgICBQeV9YSU5DUkVGKHZhbHVlKTsKKyAgICAgICAgUHlfWElOQ1JFRih0Yik7CisgICAgfQogCi0JLyogV2Ugc3VwcG9ydCB0aGUgZm9sbG93aW5nIGZvcm1zIG9mIHJhaXNlOgotCSAgIHJhaXNlIDxjbGFzcz4sIDxjbGFzc2luc3RhbmNlPgotCSAgIHJhaXNlIDxjbGFzcz4sIDxhcmd1bWVudCB0dXBsZT4KLQkgICByYWlzZSA8Y2xhc3M+LCBOb25lCi0JICAgcmFpc2UgPGNsYXNzPiwgPGFyZ3VtZW50PgotCSAgIHJhaXNlIDxjbGFzc2luc3RhbmNlPiwgTm9uZQotCSAgIHJhaXNlIDxzdHJpbmc+LCA8b2JqZWN0PgotCSAgIHJhaXNlIDxzdHJpbmc+LCBOb25lCisgICAgLyogV2Ugc3VwcG9ydCB0aGUgZm9sbG93aW5nIGZvcm1zIG9mIHJhaXNlOgorICAgICAgIHJhaXNlIDxjbGFzcz4sIDxjbGFzc2luc3RhbmNlPgorICAgICAgIHJhaXNlIDxjbGFzcz4sIDxhcmd1bWVudCB0dXBsZT4KKyAgICAgICByYWlzZSA8Y2xhc3M+LCBOb25lCisgICAgICAgcmFpc2UgPGNsYXNzPiwgPGFyZ3VtZW50PgorICAgICAgIHJhaXNlIDxjbGFzc2luc3RhbmNlPiwgTm9uZQorICAgICAgIHJhaXNlIDxzdHJpbmc+LCA8b2JqZWN0PgorICAgICAgIHJhaXNlIDxzdHJpbmc+LCBOb25lCiAKLQkgICBBbiBvbWl0dGVkIHNlY29uZCBhcmd1bWVudCBpcyB0aGUgc2FtZSBhcyBOb25lLgorICAgICAgIEFuIG9taXR0ZWQgc2Vjb25kIGFyZ3VtZW50IGlzIHRoZSBzYW1lIGFzIE5vbmUuCiAKLQkgICBJbiBhZGRpdGlvbiwgcmFpc2UgPHR1cGxlPiwgPGFueXRoaW5nPiBpcyB0aGUgc2FtZSBhcwotCSAgIHJhaXNpbmcgdGhlIHR1cGxlJ3MgZmlyc3QgaXRlbSAoYW5kIGl0IGJldHRlciBoYXZlIG9uZSEpOwotCSAgIHRoaXMgcnVsZSBpcyBhcHBsaWVkIHJlY3Vyc2l2ZWx5LgorICAgICAgIEluIGFkZGl0aW9uLCByYWlzZSA8dHVwbGU+LCA8YW55dGhpbmc+IGlzIHRoZSBzYW1lIGFzCisgICAgICAgcmFpc2luZyB0aGUgdHVwbGUncyBmaXJzdCBpdGVtIChhbmQgaXQgYmV0dGVyIGhhdmUgb25lISk7CisgICAgICAgdGhpcyBydWxlIGlzIGFwcGxpZWQgcmVjdXJzaXZlbHkuCiAKLQkgICBGaW5hbGx5LCBhbiBvcHRpb25hbCB0aGlyZCBhcmd1bWVudCBjYW4gYmUgc3VwcGxpZWQsIHdoaWNoCi0JICAgZ2l2ZXMgdGhlIHRyYWNlYmFjayB0byBiZSBzdWJzdGl0dXRlZCAodXNlZnVsIHdoZW4KLQkgICByZS1yYWlzaW5nIGFuIGV4Y2VwdGlvbiBhZnRlciBleGFtaW5pbmcgaXQpLiAgKi8KKyAgICAgICBGaW5hbGx5LCBhbiBvcHRpb25hbCB0aGlyZCBhcmd1bWVudCBjYW4gYmUgc3VwcGxpZWQsIHdoaWNoCisgICAgICAgZ2l2ZXMgdGhlIHRyYWNlYmFjayB0byBiZSBzdWJzdGl0dXRlZCAodXNlZnVsIHdoZW4KKyAgICAgICByZS1yYWlzaW5nIGFuIGV4Y2VwdGlvbiBhZnRlciBleGFtaW5pbmcgaXQpLiAgKi8KIAotCS8qIEZpcnN0LCBjaGVjayB0aGUgdHJhY2ViYWNrIGFyZ3VtZW50LCByZXBsYWNpbmcgTm9uZSB3aXRoCi0JICAgTlVMTC4gKi8KLQlpZiAodGIgPT0gUHlfTm9uZSkgewotCQlQeV9ERUNSRUYodGIpOwotCQl0YiA9IE5VTEw7Ci0JfQotCWVsc2UgaWYgKHRiICE9IE5VTEwgJiYgIVB5VHJhY2VCYWNrX0NoZWNrKHRiKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJICAgInJhaXNlOiBhcmcgMyBtdXN0IGJlIGEgdHJhY2ViYWNrIG9yIE5vbmUiKTsKLQkJZ290byByYWlzZV9lcnJvcjsKLQl9CisgICAgLyogRmlyc3QsIGNoZWNrIHRoZSB0cmFjZWJhY2sgYXJndW1lbnQsIHJlcGxhY2luZyBOb25lIHdpdGgKKyAgICAgICBOVUxMLiAqLworICAgIGlmICh0YiA9PSBQeV9Ob25lKSB7CisgICAgICAgIFB5X0RFQ1JFRih0Yik7CisgICAgICAgIHRiID0gTlVMTDsKKyAgICB9CisgICAgZWxzZSBpZiAodGIgIT0gTlVMTCAmJiAhUHlUcmFjZUJhY2tfQ2hlY2sodGIpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgInJhaXNlOiBhcmcgMyBtdXN0IGJlIGEgdHJhY2ViYWNrIG9yIE5vbmUiKTsKKyAgICAgICAgZ290byByYWlzZV9lcnJvcjsKKyAgICB9CiAKLQkvKiBOZXh0LCByZXBsYWNlIGEgbWlzc2luZyB2YWx1ZSB3aXRoIE5vbmUgKi8KLQlpZiAodmFsdWUgPT0gTlVMTCkgewotCQl2YWx1ZSA9IFB5X05vbmU7Ci0JCVB5X0lOQ1JFRih2YWx1ZSk7Ci0JfQorICAgIC8qIE5leHQsIHJlcGxhY2UgYSBtaXNzaW5nIHZhbHVlIHdpdGggTm9uZSAqLworICAgIGlmICh2YWx1ZSA9PSBOVUxMKSB7CisgICAgICAgIHZhbHVlID0gUHlfTm9uZTsKKyAgICAgICAgUHlfSU5DUkVGKHZhbHVlKTsKKyAgICB9CiAKLQkvKiBOZXh0LCByZXBlYXRlZGx5LCByZXBsYWNlIGEgdHVwbGUgZXhjZXB0aW9uIHdpdGggaXRzIGZpcnN0IGl0ZW0gKi8KLQl3aGlsZSAoUHlUdXBsZV9DaGVjayh0eXBlKSAmJiBQeVR1cGxlX1NpemUodHlwZSkgPiAwKSB7Ci0JCVB5T2JqZWN0ICp0bXAgPSB0eXBlOwotCQl0eXBlID0gUHlUdXBsZV9HRVRfSVRFTSh0eXBlLCAwKTsKLQkJUHlfSU5DUkVGKHR5cGUpOwotCQlQeV9ERUNSRUYodG1wKTsKLQl9CisgICAgLyogTmV4dCwgcmVwZWF0ZWRseSwgcmVwbGFjZSBhIHR1cGxlIGV4Y2VwdGlvbiB3aXRoIGl0cyBmaXJzdCBpdGVtICovCisgICAgd2hpbGUgKFB5VHVwbGVfQ2hlY2sodHlwZSkgJiYgUHlUdXBsZV9TaXplKHR5cGUpID4gMCkgeworICAgICAgICBQeU9iamVjdCAqdG1wID0gdHlwZTsKKyAgICAgICAgdHlwZSA9IFB5VHVwbGVfR0VUX0lURU0odHlwZSwgMCk7CisgICAgICAgIFB5X0lOQ1JFRih0eXBlKTsKKyAgICAgICAgUHlfREVDUkVGKHRtcCk7CisgICAgfQogCi0JaWYgKFB5RXhjZXB0aW9uQ2xhc3NfQ2hlY2sodHlwZSkpCi0JCVB5RXJyX05vcm1hbGl6ZUV4Y2VwdGlvbigmdHlwZSwgJnZhbHVlLCAmdGIpOworICAgIGlmIChQeUV4Y2VwdGlvbkNsYXNzX0NoZWNrKHR5cGUpKQorICAgICAgICBQeUVycl9Ob3JtYWxpemVFeGNlcHRpb24oJnR5cGUsICZ2YWx1ZSwgJnRiKTsKIAotCWVsc2UgaWYgKFB5RXhjZXB0aW9uSW5zdGFuY2VfQ2hlY2sodHlwZSkpIHsKLQkJLyogUmFpc2luZyBhbiBpbnN0YW5jZS4gIFRoZSB2YWx1ZSBzaG91bGQgYmUgYSBkdW1teS4gKi8KLQkJaWYgKHZhbHVlICE9IFB5X05vbmUpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICJpbnN0YW5jZSBleGNlcHRpb24gbWF5IG5vdCBoYXZlIGEgc2VwYXJhdGUgdmFsdWUiKTsKLQkJCWdvdG8gcmFpc2VfZXJyb3I7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvKiBOb3JtYWxpemUgdG8gcmFpc2UgPGNsYXNzPiwgPGluc3RhbmNlPiAqLwotCQkJUHlfREVDUkVGKHZhbHVlKTsKLQkJCXZhbHVlID0gdHlwZTsKLQkJCXR5cGUgPSBQeUV4Y2VwdGlvbkluc3RhbmNlX0NsYXNzKHR5cGUpOwotCQkJUHlfSU5DUkVGKHR5cGUpOwotCQl9Ci0JfQotCWVsc2UgewotCQkvKiBOb3Qgc29tZXRoaW5nIHlvdSBjYW4gcmFpc2UuICBZb3UgZ2V0IGFuIGV4Y2VwdGlvbgotCQkgICBhbnl3YXksIGp1c3Qgbm90IHdoYXQgeW91IHNwZWNpZmllZCA6LSkgKi8KLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAgImV4Y2VwdGlvbnMgbXVzdCBiZSBvbGQtc3R5bGUgY2xhc3NlcyBvciAiCi0JCQkgICAgICJkZXJpdmVkIGZyb20gQmFzZUV4Y2VwdGlvbiwgbm90ICVzIiwKLQkJCSAgICAgdHlwZS0+b2JfdHlwZS0+dHBfbmFtZSk7Ci0JCWdvdG8gcmFpc2VfZXJyb3I7Ci0JfQorICAgIGVsc2UgaWYgKFB5RXhjZXB0aW9uSW5zdGFuY2VfQ2hlY2sodHlwZSkpIHsKKyAgICAgICAgLyogUmFpc2luZyBhbiBpbnN0YW5jZS4gIFRoZSB2YWx1ZSBzaG91bGQgYmUgYSBkdW1teS4gKi8KKyAgICAgICAgaWYgKHZhbHVlICE9IFB5X05vbmUpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICJpbnN0YW5jZSBleGNlcHRpb24gbWF5IG5vdCBoYXZlIGEgc2VwYXJhdGUgdmFsdWUiKTsKKyAgICAgICAgICAgIGdvdG8gcmFpc2VfZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvKiBOb3JtYWxpemUgdG8gcmFpc2UgPGNsYXNzPiwgPGluc3RhbmNlPiAqLworICAgICAgICAgICAgUHlfREVDUkVGKHZhbHVlKTsKKyAgICAgICAgICAgIHZhbHVlID0gdHlwZTsKKyAgICAgICAgICAgIHR5cGUgPSBQeUV4Y2VwdGlvbkluc3RhbmNlX0NsYXNzKHR5cGUpOworICAgICAgICAgICAgUHlfSU5DUkVGKHR5cGUpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvKiBOb3Qgc29tZXRoaW5nIHlvdSBjYW4gcmFpc2UuICBZb3UgZ2V0IGFuIGV4Y2VwdGlvbgorICAgICAgICAgICBhbnl3YXksIGp1c3Qgbm90IHdoYXQgeW91IHNwZWNpZmllZCA6LSkgKi8KKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJleGNlcHRpb25zIG11c3QgYmUgb2xkLXN0eWxlIGNsYXNzZXMgb3IgIgorICAgICAgICAgICAgICAgICAgICAgImRlcml2ZWQgZnJvbSBCYXNlRXhjZXB0aW9uLCBub3QgJXMiLAorICAgICAgICAgICAgICAgICAgICAgdHlwZS0+b2JfdHlwZS0+dHBfbmFtZSk7CisgICAgICAgIGdvdG8gcmFpc2VfZXJyb3I7CisgICAgfQogCi0JYXNzZXJ0KFB5RXhjZXB0aW9uQ2xhc3NfQ2hlY2sodHlwZSkpOwotCWlmIChQeV9QeTNrV2FybmluZ0ZsYWcgJiYgUHlDbGFzc19DaGVjayh0eXBlKSkgewotCQlpZiAoUHlFcnJfV2FybkV4KFB5RXhjX0RlcHJlY2F0aW9uV2FybmluZywKLQkJCQkiZXhjZXB0aW9ucyBtdXN0IGRlcml2ZSBmcm9tIEJhc2VFeGNlcHRpb24gIgotCQkJCSJpbiAzLngiLCAxKSA8IDApCi0JCQlnb3RvIHJhaXNlX2Vycm9yOwotCX0KKyAgICBhc3NlcnQoUHlFeGNlcHRpb25DbGFzc19DaGVjayh0eXBlKSk7CisgICAgaWYgKFB5X1B5M2tXYXJuaW5nRmxhZyAmJiBQeUNsYXNzX0NoZWNrKHR5cGUpKSB7CisgICAgICAgIGlmIChQeUVycl9XYXJuRXgoUHlFeGNfRGVwcmVjYXRpb25XYXJuaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgImV4Y2VwdGlvbnMgbXVzdCBkZXJpdmUgZnJvbSBCYXNlRXhjZXB0aW9uICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJpbiAzLngiLCAxKSA8IDApCisgICAgICAgICAgICBnb3RvIHJhaXNlX2Vycm9yOworICAgIH0KIAotCVB5RXJyX1Jlc3RvcmUodHlwZSwgdmFsdWUsIHRiKTsKLQlpZiAodGIgPT0gTlVMTCkKLQkJcmV0dXJuIFdIWV9FWENFUFRJT047Ci0JZWxzZQotCQlyZXR1cm4gV0hZX1JFUkFJU0U7CisgICAgUHlFcnJfUmVzdG9yZSh0eXBlLCB2YWx1ZSwgdGIpOworICAgIGlmICh0YiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gV0hZX0VYQ0VQVElPTjsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBXSFlfUkVSQUlTRTsKICByYWlzZV9lcnJvcjoKLQlQeV9YREVDUkVGKHZhbHVlKTsKLQlQeV9YREVDUkVGKHR5cGUpOwotCVB5X1hERUNSRUYodGIpOwotCXJldHVybiBXSFlfRVhDRVBUSU9OOworICAgIFB5X1hERUNSRUYodmFsdWUpOworICAgIFB5X1hERUNSRUYodHlwZSk7CisgICAgUHlfWERFQ1JFRih0Yik7CisgICAgcmV0dXJuIFdIWV9FWENFUFRJT047CiB9CiAKIC8qIEl0ZXJhdGUgdiBhcmdjbnQgdGltZXMgYW5kIHN0b3JlIHRoZSByZXN1bHRzIG9uIHRoZSBzdGFjayAodmlhIGRlY3JlYXNpbmcKQEAgLTMyOTIsNDYgKzMyOTIsNDYgQEAKIHN0YXRpYyBpbnQKIHVucGFja19pdGVyYWJsZShQeU9iamVjdCAqdiwgaW50IGFyZ2NudCwgUHlPYmplY3QgKipzcCkKIHsKLQlpbnQgaSA9IDA7Ci0JUHlPYmplY3QgKml0OyAgLyogaXRlcih2KSAqLwotCVB5T2JqZWN0ICp3OworICAgIGludCBpID0gMDsKKyAgICBQeU9iamVjdCAqaXQ7ICAvKiBpdGVyKHYpICovCisgICAgUHlPYmplY3QgKnc7CiAKLQlhc3NlcnQodiAhPSBOVUxMKTsKKyAgICBhc3NlcnQodiAhPSBOVUxMKTsKIAotCWl0ID0gUHlPYmplY3RfR2V0SXRlcih2KTsKLQlpZiAoaXQgPT0gTlVMTCkKLQkJZ290byBFcnJvcjsKKyAgICBpdCA9IFB5T2JqZWN0X0dldEl0ZXIodik7CisgICAgaWYgKGl0ID09IE5VTEwpCisgICAgICAgIGdvdG8gRXJyb3I7CiAKLQlmb3IgKDsgaSA8IGFyZ2NudDsgaSsrKSB7Ci0JCXcgPSBQeUl0ZXJfTmV4dChpdCk7Ci0JCWlmICh3ID09IE5VTEwpIHsKLQkJCS8qIEl0ZXJhdG9yIGRvbmUsIHZpYSBlcnJvciBvciBleGhhdXN0aW9uLiAqLwotCQkJaWYgKCFQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJCSJuZWVkIG1vcmUgdGhhbiAlZCB2YWx1ZSVzIHRvIHVucGFjayIsCi0JCQkJCWksIGkgPT0gMSA/ICIiIDogInMiKTsKLQkJCX0KLQkJCWdvdG8gRXJyb3I7Ci0JCX0KLQkJKi0tc3AgPSB3OwotCX0KKyAgICBmb3IgKDsgaSA8IGFyZ2NudDsgaSsrKSB7CisgICAgICAgIHcgPSBQeUl0ZXJfTmV4dChpdCk7CisgICAgICAgIGlmICh3ID09IE5VTEwpIHsKKyAgICAgICAgICAgIC8qIEl0ZXJhdG9yIGRvbmUsIHZpYSBlcnJvciBvciBleGhhdXN0aW9uLiAqLworICAgICAgICAgICAgaWYgKCFQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICJuZWVkIG1vcmUgdGhhbiAlZCB2YWx1ZSVzIHRvIHVucGFjayIsCisgICAgICAgICAgICAgICAgICAgIGksIGkgPT0gMSA/ICIiIDogInMiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGdvdG8gRXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgKi0tc3AgPSB3OworICAgIH0KIAotCS8qIFdlIGJldHRlciBoYXZlIGV4aGF1c3RlZCB0aGUgaXRlcmF0b3Igbm93LiAqLwotCXcgPSBQeUl0ZXJfTmV4dChpdCk7Ci0JaWYgKHcgPT0gTlVMTCkgewotCQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkKLQkJCWdvdG8gRXJyb3I7Ci0JCVB5X0RFQ1JFRihpdCk7Ci0JCXJldHVybiAxOwotCX0KLQlQeV9ERUNSRUYodyk7Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJ0b28gbWFueSB2YWx1ZXMgdG8gdW5wYWNrIik7Ci0JLyogZmFsbCB0aHJvdWdoICovCisgICAgLyogV2UgYmV0dGVyIGhhdmUgZXhoYXVzdGVkIHRoZSBpdGVyYXRvciBub3cuICovCisgICAgdyA9IFB5SXRlcl9OZXh0KGl0KTsKKyAgICBpZiAodyA9PSBOVUxMKSB7CisgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgZ290byBFcnJvcjsKKyAgICAgICAgUHlfREVDUkVGKGl0KTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIFB5X0RFQ1JFRih3KTsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgInRvbyBtYW55IHZhbHVlcyB0byB1bnBhY2siKTsKKyAgICAvKiBmYWxsIHRocm91Z2ggKi8KIEVycm9yOgotCWZvciAoOyBpID4gMDsgaS0tLCBzcCsrKQotCQlQeV9ERUNSRUYoKnNwKTsKLQlQeV9YREVDUkVGKGl0KTsKLQlyZXR1cm4gMDsKKyAgICBmb3IgKDsgaSA+IDA7IGktLSwgc3ArKykKKyAgICAgICAgUHlfREVDUkVGKCpzcCk7CisgICAgUHlfWERFQ1JFRihpdCk7CisgICAgcmV0dXJuIDA7CiB9CiAKIApAQCAtMzMzOSwyNDEgKzMzMzksMjQxIEBACiBzdGF0aWMgaW50CiBwcnRyYWNlKFB5T2JqZWN0ICp2LCBjaGFyICpzdHIpCiB7Ci0JcHJpbnRmKCIlcyAiLCBzdHIpOwotCWlmIChQeU9iamVjdF9QcmludCh2LCBzdGRvdXQsIDApICE9IDApCi0JCVB5RXJyX0NsZWFyKCk7IC8qIERvbid0IGtub3cgd2hhdCBlbHNlIHRvIGRvICovCi0JcHJpbnRmKCJcbiIpOwotCXJldHVybiAxOworICAgIHByaW50ZigiJXMgIiwgc3RyKTsKKyAgICBpZiAoUHlPYmplY3RfUHJpbnQodiwgc3Rkb3V0LCAwKSAhPSAwKQorICAgICAgICBQeUVycl9DbGVhcigpOyAvKiBEb24ndCBrbm93IHdoYXQgZWxzZSB0byBkbyAqLworICAgIHByaW50ZigiXG4iKTsKKyAgICByZXR1cm4gMTsKIH0KICNlbmRpZgogCiBzdGF0aWMgdm9pZAogY2FsbF9leGNfdHJhY2UoUHlfdHJhY2VmdW5jIGZ1bmMsIFB5T2JqZWN0ICpzZWxmLCBQeUZyYW1lT2JqZWN0ICpmKQogewotCVB5T2JqZWN0ICp0eXBlLCAqdmFsdWUsICp0cmFjZWJhY2ssICphcmc7Ci0JaW50IGVycjsKLQlQeUVycl9GZXRjaCgmdHlwZSwgJnZhbHVlLCAmdHJhY2ViYWNrKTsKLQlpZiAodmFsdWUgPT0gTlVMTCkgewotCQl2YWx1ZSA9IFB5X05vbmU7Ci0JCVB5X0lOQ1JFRih2YWx1ZSk7Ci0JfQotCWFyZyA9IFB5VHVwbGVfUGFjaygzLCB0eXBlLCB2YWx1ZSwgdHJhY2ViYWNrKTsKLQlpZiAoYXJnID09IE5VTEwpIHsKLQkJUHlFcnJfUmVzdG9yZSh0eXBlLCB2YWx1ZSwgdHJhY2ViYWNrKTsKLQkJcmV0dXJuOwotCX0KLQllcnIgPSBjYWxsX3RyYWNlKGZ1bmMsIHNlbGYsIGYsIFB5VHJhY2VfRVhDRVBUSU9OLCBhcmcpOwotCVB5X0RFQ1JFRihhcmcpOwotCWlmIChlcnIgPT0gMCkKLQkJUHlFcnJfUmVzdG9yZSh0eXBlLCB2YWx1ZSwgdHJhY2ViYWNrKTsKLQllbHNlIHsKLQkJUHlfWERFQ1JFRih0eXBlKTsKLQkJUHlfWERFQ1JFRih2YWx1ZSk7Ci0JCVB5X1hERUNSRUYodHJhY2ViYWNrKTsKLQl9CisgICAgUHlPYmplY3QgKnR5cGUsICp2YWx1ZSwgKnRyYWNlYmFjaywgKmFyZzsKKyAgICBpbnQgZXJyOworICAgIFB5RXJyX0ZldGNoKCZ0eXBlLCAmdmFsdWUsICZ0cmFjZWJhY2spOworICAgIGlmICh2YWx1ZSA9PSBOVUxMKSB7CisgICAgICAgIHZhbHVlID0gUHlfTm9uZTsKKyAgICAgICAgUHlfSU5DUkVGKHZhbHVlKTsKKyAgICB9CisgICAgYXJnID0gUHlUdXBsZV9QYWNrKDMsIHR5cGUsIHZhbHVlLCB0cmFjZWJhY2spOworICAgIGlmIChhcmcgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9SZXN0b3JlKHR5cGUsIHZhbHVlLCB0cmFjZWJhY2spOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGVyciA9IGNhbGxfdHJhY2UoZnVuYywgc2VsZiwgZiwgUHlUcmFjZV9FWENFUFRJT04sIGFyZyk7CisgICAgUHlfREVDUkVGKGFyZyk7CisgICAgaWYgKGVyciA9PSAwKQorICAgICAgICBQeUVycl9SZXN0b3JlKHR5cGUsIHZhbHVlLCB0cmFjZWJhY2spOworICAgIGVsc2UgeworICAgICAgICBQeV9YREVDUkVGKHR5cGUpOworICAgICAgICBQeV9YREVDUkVGKHZhbHVlKTsKKyAgICAgICAgUHlfWERFQ1JFRih0cmFjZWJhY2spOworICAgIH0KIH0KIAogc3RhdGljIGludAogY2FsbF90cmFjZV9wcm90ZWN0ZWQoUHlfdHJhY2VmdW5jIGZ1bmMsIFB5T2JqZWN0ICpvYmosIFB5RnJhbWVPYmplY3QgKmZyYW1lLAotCQkgICAgIGludCB3aGF0LCBQeU9iamVjdCAqYXJnKQorICAgICAgICAgICAgICAgICAgICAgaW50IHdoYXQsIFB5T2JqZWN0ICphcmcpCiB7Ci0JUHlPYmplY3QgKnR5cGUsICp2YWx1ZSwgKnRyYWNlYmFjazsKLQlpbnQgZXJyOwotCVB5RXJyX0ZldGNoKCZ0eXBlLCAmdmFsdWUsICZ0cmFjZWJhY2spOwotCWVyciA9IGNhbGxfdHJhY2UoZnVuYywgb2JqLCBmcmFtZSwgd2hhdCwgYXJnKTsKLQlpZiAoZXJyID09IDApCi0JewotCQlQeUVycl9SZXN0b3JlKHR5cGUsIHZhbHVlLCB0cmFjZWJhY2spOwotCQlyZXR1cm4gMDsKLQl9Ci0JZWxzZSB7Ci0JCVB5X1hERUNSRUYodHlwZSk7Ci0JCVB5X1hERUNSRUYodmFsdWUpOwotCQlQeV9YREVDUkVGKHRyYWNlYmFjayk7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgUHlPYmplY3QgKnR5cGUsICp2YWx1ZSwgKnRyYWNlYmFjazsKKyAgICBpbnQgZXJyOworICAgIFB5RXJyX0ZldGNoKCZ0eXBlLCAmdmFsdWUsICZ0cmFjZWJhY2spOworICAgIGVyciA9IGNhbGxfdHJhY2UoZnVuYywgb2JqLCBmcmFtZSwgd2hhdCwgYXJnKTsKKyAgICBpZiAoZXJyID09IDApCisgICAgeworICAgICAgICBQeUVycl9SZXN0b3JlKHR5cGUsIHZhbHVlLCB0cmFjZWJhY2spOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5X1hERUNSRUYodHlwZSk7CisgICAgICAgIFB5X1hERUNSRUYodmFsdWUpOworICAgICAgICBQeV9YREVDUkVGKHRyYWNlYmFjayk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiB9CiAKIHN0YXRpYyBpbnQKIGNhbGxfdHJhY2UoUHlfdHJhY2VmdW5jIGZ1bmMsIFB5T2JqZWN0ICpvYmosIFB5RnJhbWVPYmplY3QgKmZyYW1lLAotCSAgIGludCB3aGF0LCBQeU9iamVjdCAqYXJnKQorICAgICAgICAgICBpbnQgd2hhdCwgUHlPYmplY3QgKmFyZykKIHsKLQlyZWdpc3RlciBQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBmcmFtZS0+Zl90c3RhdGU7Ci0JaW50IHJlc3VsdDsKLQlpZiAodHN0YXRlLT50cmFjaW5nKQotCQlyZXR1cm4gMDsKLQl0c3RhdGUtPnRyYWNpbmcrKzsKLQl0c3RhdGUtPnVzZV90cmFjaW5nID0gMDsKLQlyZXN1bHQgPSBmdW5jKG9iaiwgZnJhbWUsIHdoYXQsIGFyZyk7Ci0JdHN0YXRlLT51c2VfdHJhY2luZyA9ICgodHN0YXRlLT5jX3RyYWNlZnVuYyAhPSBOVUxMKQotCQkJICAgICAgIHx8ICh0c3RhdGUtPmNfcHJvZmlsZWZ1bmMgIT0gTlVMTCkpOwotCXRzdGF0ZS0+dHJhY2luZy0tOwotCXJldHVybiByZXN1bHQ7CisgICAgcmVnaXN0ZXIgUHlUaHJlYWRTdGF0ZSAqdHN0YXRlID0gZnJhbWUtPmZfdHN0YXRlOworICAgIGludCByZXN1bHQ7CisgICAgaWYgKHRzdGF0ZS0+dHJhY2luZykKKyAgICAgICAgcmV0dXJuIDA7CisgICAgdHN0YXRlLT50cmFjaW5nKys7CisgICAgdHN0YXRlLT51c2VfdHJhY2luZyA9IDA7CisgICAgcmVzdWx0ID0gZnVuYyhvYmosIGZyYW1lLCB3aGF0LCBhcmcpOworICAgIHRzdGF0ZS0+dXNlX3RyYWNpbmcgPSAoKHRzdGF0ZS0+Y190cmFjZWZ1bmMgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICh0c3RhdGUtPmNfcHJvZmlsZWZ1bmMgIT0gTlVMTCkpOworICAgIHRzdGF0ZS0+dHJhY2luZy0tOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIFB5T2JqZWN0ICoKIF9QeUV2YWxfQ2FsbFRyYWNpbmcoUHlPYmplY3QgKmZ1bmMsIFB5T2JqZWN0ICphcmdzKQogewotCVB5RnJhbWVPYmplY3QgKmZyYW1lID0gUHlFdmFsX0dldEZyYW1lKCk7Ci0JUHlUaHJlYWRTdGF0ZSAqdHN0YXRlID0gZnJhbWUtPmZfdHN0YXRlOwotCWludCBzYXZlX3RyYWNpbmcgPSB0c3RhdGUtPnRyYWNpbmc7Ci0JaW50IHNhdmVfdXNlX3RyYWNpbmcgPSB0c3RhdGUtPnVzZV90cmFjaW5nOwotCVB5T2JqZWN0ICpyZXN1bHQ7CisgICAgUHlGcmFtZU9iamVjdCAqZnJhbWUgPSBQeUV2YWxfR2V0RnJhbWUoKTsKKyAgICBQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBmcmFtZS0+Zl90c3RhdGU7CisgICAgaW50IHNhdmVfdHJhY2luZyA9IHRzdGF0ZS0+dHJhY2luZzsKKyAgICBpbnQgc2F2ZV91c2VfdHJhY2luZyA9IHRzdGF0ZS0+dXNlX3RyYWNpbmc7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKIAotCXRzdGF0ZS0+dHJhY2luZyA9IDA7Ci0JdHN0YXRlLT51c2VfdHJhY2luZyA9ICgodHN0YXRlLT5jX3RyYWNlZnVuYyAhPSBOVUxMKQotCQkJICAgICAgIHx8ICh0c3RhdGUtPmNfcHJvZmlsZWZ1bmMgIT0gTlVMTCkpOwotCXJlc3VsdCA9IFB5T2JqZWN0X0NhbGwoZnVuYywgYXJncywgTlVMTCk7Ci0JdHN0YXRlLT50cmFjaW5nID0gc2F2ZV90cmFjaW5nOwotCXRzdGF0ZS0+dXNlX3RyYWNpbmcgPSBzYXZlX3VzZV90cmFjaW5nOwotCXJldHVybiByZXN1bHQ7CisgICAgdHN0YXRlLT50cmFjaW5nID0gMDsKKyAgICB0c3RhdGUtPnVzZV90cmFjaW5nID0gKCh0c3RhdGUtPmNfdHJhY2VmdW5jICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAodHN0YXRlLT5jX3Byb2ZpbGVmdW5jICE9IE5VTEwpKTsKKyAgICByZXN1bHQgPSBQeU9iamVjdF9DYWxsKGZ1bmMsIGFyZ3MsIE5VTEwpOworICAgIHRzdGF0ZS0+dHJhY2luZyA9IHNhdmVfdHJhY2luZzsKKyAgICB0c3RhdGUtPnVzZV90cmFjaW5nID0gc2F2ZV91c2VfdHJhY2luZzsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgaW50CiBtYXliZV9jYWxsX2xpbmVfdHJhY2UoUHlfdHJhY2VmdW5jIGZ1bmMsIFB5T2JqZWN0ICpvYmosCi0JCSAgICAgIFB5RnJhbWVPYmplY3QgKmZyYW1lLCBpbnQgKmluc3RyX2xiLCBpbnQgKmluc3RyX3ViLAotCQkgICAgICBpbnQgKmluc3RyX3ByZXYpCisgICAgICAgICAgICAgICAgICAgICAgUHlGcmFtZU9iamVjdCAqZnJhbWUsIGludCAqaW5zdHJfbGIsIGludCAqaW5zdHJfdWIsCisgICAgICAgICAgICAgICAgICAgICAgaW50ICppbnN0cl9wcmV2KQogewotCWludCByZXN1bHQgPSAwOworICAgIGludCByZXN1bHQgPSAwOwogCi0gICAgICAgIC8qIElmIHRoZSBsYXN0IGluc3RydWN0aW9uIGV4ZWN1dGVkIGlzbid0IGluIHRoZSBjdXJyZW50Ci0gICAgICAgICAgIGluc3RydWN0aW9uIHdpbmRvdywgcmVzZXQgdGhlIHdpbmRvdy4gIElmIHRoZSBsYXN0Ci0gICAgICAgICAgIGluc3RydWN0aW9uIGhhcHBlbnMgdG8gZmFsbCBhdCB0aGUgc3RhcnQgb2YgYSBsaW5lIG9yIGlmIGl0Ci0gICAgICAgICAgIHJlcHJlc2VudHMgYSBqdW1wIGJhY2t3YXJkcywgY2FsbCB0aGUgdHJhY2UgZnVuY3Rpb24uCi0gICAgICAgICovCi0JaWYgKChmcmFtZS0+Zl9sYXN0aSA8ICppbnN0cl9sYiB8fCBmcmFtZS0+Zl9sYXN0aSA+PSAqaW5zdHJfdWIpKSB7Ci0JCWludCBsaW5lOwotCQlQeUFkZHJQYWlyIGJvdW5kczsKKyAgICAvKiBJZiB0aGUgbGFzdCBpbnN0cnVjdGlvbiBleGVjdXRlZCBpc24ndCBpbiB0aGUgY3VycmVudAorICAgICAgIGluc3RydWN0aW9uIHdpbmRvdywgcmVzZXQgdGhlIHdpbmRvdy4gIElmIHRoZSBsYXN0CisgICAgICAgaW5zdHJ1Y3Rpb24gaGFwcGVucyB0byBmYWxsIGF0IHRoZSBzdGFydCBvZiBhIGxpbmUgb3IgaWYgaXQKKyAgICAgICByZXByZXNlbnRzIGEganVtcCBiYWNrd2FyZHMsIGNhbGwgdGhlIHRyYWNlIGZ1bmN0aW9uLgorICAgICovCisgICAgaWYgKChmcmFtZS0+Zl9sYXN0aSA8ICppbnN0cl9sYiB8fCBmcmFtZS0+Zl9sYXN0aSA+PSAqaW5zdHJfdWIpKSB7CisgICAgICAgIGludCBsaW5lOworICAgICAgICBQeUFkZHJQYWlyIGJvdW5kczsKIAotCQlsaW5lID0gUHlDb2RlX0NoZWNrTGluZU51bWJlcihmcmFtZS0+Zl9jb2RlLCBmcmFtZS0+Zl9sYXN0aSwKLQkJCQkJICAgICAgJmJvdW5kcyk7Ci0JCWlmIChsaW5lID49IDApIHsKLQkJCWZyYW1lLT5mX2xpbmVubyA9IGxpbmU7Ci0JCQlyZXN1bHQgPSBjYWxsX3RyYWNlKGZ1bmMsIG9iaiwgZnJhbWUsCi0JCQkJCSAgICBQeVRyYWNlX0xJTkUsIFB5X05vbmUpOwotCQl9Ci0JCSppbnN0cl9sYiA9IGJvdW5kcy5hcF9sb3dlcjsKLQkJKmluc3RyX3ViID0gYm91bmRzLmFwX3VwcGVyOwotCX0KLQllbHNlIGlmIChmcmFtZS0+Zl9sYXN0aSA8PSAqaW5zdHJfcHJldikgewotCQlyZXN1bHQgPSBjYWxsX3RyYWNlKGZ1bmMsIG9iaiwgZnJhbWUsIFB5VHJhY2VfTElORSwgUHlfTm9uZSk7Ci0JfQotCSppbnN0cl9wcmV2ID0gZnJhbWUtPmZfbGFzdGk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgbGluZSA9IFB5Q29kZV9DaGVja0xpbmVOdW1iZXIoZnJhbWUtPmZfY29kZSwgZnJhbWUtPmZfbGFzdGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHMpOworICAgICAgICBpZiAobGluZSA+PSAwKSB7CisgICAgICAgICAgICBmcmFtZS0+Zl9saW5lbm8gPSBsaW5lOworICAgICAgICAgICAgcmVzdWx0ID0gY2FsbF90cmFjZShmdW5jLCBvYmosIGZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVRyYWNlX0xJTkUsIFB5X05vbmUpOworICAgICAgICB9CisgICAgICAgICppbnN0cl9sYiA9IGJvdW5kcy5hcF9sb3dlcjsKKyAgICAgICAgKmluc3RyX3ViID0gYm91bmRzLmFwX3VwcGVyOworICAgIH0KKyAgICBlbHNlIGlmIChmcmFtZS0+Zl9sYXN0aSA8PSAqaW5zdHJfcHJldikgeworICAgICAgICByZXN1bHQgPSBjYWxsX3RyYWNlKGZ1bmMsIG9iaiwgZnJhbWUsIFB5VHJhY2VfTElORSwgUHlfTm9uZSk7CisgICAgfQorICAgICppbnN0cl9wcmV2ID0gZnJhbWUtPmZfbGFzdGk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogdm9pZAogUHlFdmFsX1NldFByb2ZpbGUoUHlfdHJhY2VmdW5jIGZ1bmMsIFB5T2JqZWN0ICphcmcpCiB7Ci0JUHlUaHJlYWRTdGF0ZSAqdHN0YXRlID0gUHlUaHJlYWRTdGF0ZV9HRVQoKTsKLQlQeU9iamVjdCAqdGVtcCA9IHRzdGF0ZS0+Y19wcm9maWxlb2JqOwotCVB5X1hJTkNSRUYoYXJnKTsKLQl0c3RhdGUtPmNfcHJvZmlsZWZ1bmMgPSBOVUxMOwotCXRzdGF0ZS0+Y19wcm9maWxlb2JqID0gTlVMTDsKLQkvKiBNdXN0IG1ha2Ugc3VyZSB0aGF0IHRyYWNpbmcgaXMgbm90IGlnbm9yZWQgaWYgJ3RlbXAnIGlzIGZyZWVkICovCi0JdHN0YXRlLT51c2VfdHJhY2luZyA9IHRzdGF0ZS0+Y190cmFjZWZ1bmMgIT0gTlVMTDsKLQlQeV9YREVDUkVGKHRlbXApOwotCXRzdGF0ZS0+Y19wcm9maWxlZnVuYyA9IGZ1bmM7Ci0JdHN0YXRlLT5jX3Byb2ZpbGVvYmogPSBhcmc7Ci0JLyogRmxhZyB0aGF0IHRyYWNpbmcgb3IgcHJvZmlsaW5nIGlzIHR1cm5lZCBvbiAqLwotCXRzdGF0ZS0+dXNlX3RyYWNpbmcgPSAoZnVuYyAhPSBOVUxMKSB8fCAodHN0YXRlLT5jX3RyYWNlZnVuYyAhPSBOVUxMKTsKKyAgICBQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dFVCgpOworICAgIFB5T2JqZWN0ICp0ZW1wID0gdHN0YXRlLT5jX3Byb2ZpbGVvYmo7CisgICAgUHlfWElOQ1JFRihhcmcpOworICAgIHRzdGF0ZS0+Y19wcm9maWxlZnVuYyA9IE5VTEw7CisgICAgdHN0YXRlLT5jX3Byb2ZpbGVvYmogPSBOVUxMOworICAgIC8qIE11c3QgbWFrZSBzdXJlIHRoYXQgdHJhY2luZyBpcyBub3QgaWdub3JlZCBpZiAndGVtcCcgaXMgZnJlZWQgKi8KKyAgICB0c3RhdGUtPnVzZV90cmFjaW5nID0gdHN0YXRlLT5jX3RyYWNlZnVuYyAhPSBOVUxMOworICAgIFB5X1hERUNSRUYodGVtcCk7CisgICAgdHN0YXRlLT5jX3Byb2ZpbGVmdW5jID0gZnVuYzsKKyAgICB0c3RhdGUtPmNfcHJvZmlsZW9iaiA9IGFyZzsKKyAgICAvKiBGbGFnIHRoYXQgdHJhY2luZyBvciBwcm9maWxpbmcgaXMgdHVybmVkIG9uICovCisgICAgdHN0YXRlLT51c2VfdHJhY2luZyA9IChmdW5jICE9IE5VTEwpIHx8ICh0c3RhdGUtPmNfdHJhY2VmdW5jICE9IE5VTEwpOwogfQogCiB2b2lkCiBQeUV2YWxfU2V0VHJhY2UoUHlfdHJhY2VmdW5jIGZ1bmMsIFB5T2JqZWN0ICphcmcpCiB7Ci0JUHlUaHJlYWRTdGF0ZSAqdHN0YXRlID0gUHlUaHJlYWRTdGF0ZV9HRVQoKTsKLQlQeU9iamVjdCAqdGVtcCA9IHRzdGF0ZS0+Y190cmFjZW9iajsKLQlfUHlfVHJhY2luZ1Bvc3NpYmxlICs9IChmdW5jICE9IE5VTEwpIC0gKHRzdGF0ZS0+Y190cmFjZWZ1bmMgIT0gTlVMTCk7Ci0JUHlfWElOQ1JFRihhcmcpOwotCXRzdGF0ZS0+Y190cmFjZWZ1bmMgPSBOVUxMOwotCXRzdGF0ZS0+Y190cmFjZW9iaiA9IE5VTEw7Ci0JLyogTXVzdCBtYWtlIHN1cmUgdGhhdCBwcm9maWxpbmcgaXMgbm90IGlnbm9yZWQgaWYgJ3RlbXAnIGlzIGZyZWVkICovCi0JdHN0YXRlLT51c2VfdHJhY2luZyA9IHRzdGF0ZS0+Y19wcm9maWxlZnVuYyAhPSBOVUxMOwotCVB5X1hERUNSRUYodGVtcCk7Ci0JdHN0YXRlLT5jX3RyYWNlZnVuYyA9IGZ1bmM7Ci0JdHN0YXRlLT5jX3RyYWNlb2JqID0gYXJnOwotCS8qIEZsYWcgdGhhdCB0cmFjaW5nIG9yIHByb2ZpbGluZyBpcyB0dXJuZWQgb24gKi8KLQl0c3RhdGUtPnVzZV90cmFjaW5nID0gKChmdW5jICE9IE5VTEwpCi0JCQkgICAgICAgfHwgKHRzdGF0ZS0+Y19wcm9maWxlZnVuYyAhPSBOVUxMKSk7CisgICAgUHlUaHJlYWRTdGF0ZSAqdHN0YXRlID0gUHlUaHJlYWRTdGF0ZV9HRVQoKTsKKyAgICBQeU9iamVjdCAqdGVtcCA9IHRzdGF0ZS0+Y190cmFjZW9iajsKKyAgICBfUHlfVHJhY2luZ1Bvc3NpYmxlICs9IChmdW5jICE9IE5VTEwpIC0gKHRzdGF0ZS0+Y190cmFjZWZ1bmMgIT0gTlVMTCk7CisgICAgUHlfWElOQ1JFRihhcmcpOworICAgIHRzdGF0ZS0+Y190cmFjZWZ1bmMgPSBOVUxMOworICAgIHRzdGF0ZS0+Y190cmFjZW9iaiA9IE5VTEw7CisgICAgLyogTXVzdCBtYWtlIHN1cmUgdGhhdCBwcm9maWxpbmcgaXMgbm90IGlnbm9yZWQgaWYgJ3RlbXAnIGlzIGZyZWVkICovCisgICAgdHN0YXRlLT51c2VfdHJhY2luZyA9IHRzdGF0ZS0+Y19wcm9maWxlZnVuYyAhPSBOVUxMOworICAgIFB5X1hERUNSRUYodGVtcCk7CisgICAgdHN0YXRlLT5jX3RyYWNlZnVuYyA9IGZ1bmM7CisgICAgdHN0YXRlLT5jX3RyYWNlb2JqID0gYXJnOworICAgIC8qIEZsYWcgdGhhdCB0cmFjaW5nIG9yIHByb2ZpbGluZyBpcyB0dXJuZWQgb24gKi8KKyAgICB0c3RhdGUtPnVzZV90cmFjaW5nID0gKChmdW5jICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAodHN0YXRlLT5jX3Byb2ZpbGVmdW5jICE9IE5VTEwpKTsKIH0KIAogUHlPYmplY3QgKgogUHlFdmFsX0dldEJ1aWx0aW5zKHZvaWQpCiB7Ci0JUHlGcmFtZU9iamVjdCAqY3VycmVudF9mcmFtZSA9IFB5RXZhbF9HZXRGcmFtZSgpOwotCWlmIChjdXJyZW50X2ZyYW1lID09IE5VTEwpCi0JCXJldHVybiBQeVRocmVhZFN0YXRlX0dFVCgpLT5pbnRlcnAtPmJ1aWx0aW5zOwotCWVsc2UKLQkJcmV0dXJuIGN1cnJlbnRfZnJhbWUtPmZfYnVpbHRpbnM7CisgICAgUHlGcmFtZU9iamVjdCAqY3VycmVudF9mcmFtZSA9IFB5RXZhbF9HZXRGcmFtZSgpOworICAgIGlmIChjdXJyZW50X2ZyYW1lID09IE5VTEwpCisgICAgICAgIHJldHVybiBQeVRocmVhZFN0YXRlX0dFVCgpLT5pbnRlcnAtPmJ1aWx0aW5zOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGN1cnJlbnRfZnJhbWUtPmZfYnVpbHRpbnM7CiB9CiAKIFB5T2JqZWN0ICoKIFB5RXZhbF9HZXRMb2NhbHModm9pZCkKIHsKLQlQeUZyYW1lT2JqZWN0ICpjdXJyZW50X2ZyYW1lID0gUHlFdmFsX0dldEZyYW1lKCk7Ci0JaWYgKGN1cnJlbnRfZnJhbWUgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JUHlGcmFtZV9GYXN0VG9Mb2NhbHMoY3VycmVudF9mcmFtZSk7Ci0JcmV0dXJuIGN1cnJlbnRfZnJhbWUtPmZfbG9jYWxzOworICAgIFB5RnJhbWVPYmplY3QgKmN1cnJlbnRfZnJhbWUgPSBQeUV2YWxfR2V0RnJhbWUoKTsKKyAgICBpZiAoY3VycmVudF9mcmFtZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQeUZyYW1lX0Zhc3RUb0xvY2FscyhjdXJyZW50X2ZyYW1lKTsKKyAgICByZXR1cm4gY3VycmVudF9mcmFtZS0+Zl9sb2NhbHM7CiB9CiAKIFB5T2JqZWN0ICoKIFB5RXZhbF9HZXRHbG9iYWxzKHZvaWQpCiB7Ci0JUHlGcmFtZU9iamVjdCAqY3VycmVudF9mcmFtZSA9IFB5RXZhbF9HZXRGcmFtZSgpOwotCWlmIChjdXJyZW50X2ZyYW1lID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWVsc2UKLQkJcmV0dXJuIGN1cnJlbnRfZnJhbWUtPmZfZ2xvYmFsczsKKyAgICBQeUZyYW1lT2JqZWN0ICpjdXJyZW50X2ZyYW1lID0gUHlFdmFsX0dldEZyYW1lKCk7CisgICAgaWYgKGN1cnJlbnRfZnJhbWUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gY3VycmVudF9mcmFtZS0+Zl9nbG9iYWxzOwogfQogCiBQeUZyYW1lT2JqZWN0ICoKIFB5RXZhbF9HZXRGcmFtZSh2b2lkKQogewotCVB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfR0VUKCk7Ci0JcmV0dXJuIF9QeVRocmVhZFN0YXRlX0dldEZyYW1lKHRzdGF0ZSk7CisgICAgUHlUaHJlYWRTdGF0ZSAqdHN0YXRlID0gUHlUaHJlYWRTdGF0ZV9HRVQoKTsKKyAgICByZXR1cm4gX1B5VGhyZWFkU3RhdGVfR2V0RnJhbWUodHN0YXRlKTsKIH0KIAogaW50CiBQeUV2YWxfR2V0UmVzdHJpY3RlZCh2b2lkKQogewotCVB5RnJhbWVPYmplY3QgKmN1cnJlbnRfZnJhbWUgPSBQeUV2YWxfR2V0RnJhbWUoKTsKLQlyZXR1cm4gY3VycmVudF9mcmFtZSA9PSBOVUxMID8gMCA6IFB5RnJhbWVfSXNSZXN0cmljdGVkKGN1cnJlbnRfZnJhbWUpOworICAgIFB5RnJhbWVPYmplY3QgKmN1cnJlbnRfZnJhbWUgPSBQeUV2YWxfR2V0RnJhbWUoKTsKKyAgICByZXR1cm4gY3VycmVudF9mcmFtZSA9PSBOVUxMID8gMCA6IFB5RnJhbWVfSXNSZXN0cmljdGVkKGN1cnJlbnRfZnJhbWUpOwogfQogCiBpbnQKIFB5RXZhbF9NZXJnZUNvbXBpbGVyRmxhZ3MoUHlDb21waWxlckZsYWdzICpjZikKIHsKLQlQeUZyYW1lT2JqZWN0ICpjdXJyZW50X2ZyYW1lID0gUHlFdmFsX0dldEZyYW1lKCk7Ci0JaW50IHJlc3VsdCA9IGNmLT5jZl9mbGFncyAhPSAwOworICAgIFB5RnJhbWVPYmplY3QgKmN1cnJlbnRfZnJhbWUgPSBQeUV2YWxfR2V0RnJhbWUoKTsKKyAgICBpbnQgcmVzdWx0ID0gY2YtPmNmX2ZsYWdzICE9IDA7CiAKLQlpZiAoY3VycmVudF9mcmFtZSAhPSBOVUxMKSB7Ci0JCWNvbnN0IGludCBjb2RlZmxhZ3MgPSBjdXJyZW50X2ZyYW1lLT5mX2NvZGUtPmNvX2ZsYWdzOwotCQljb25zdCBpbnQgY29tcGlsZXJmbGFncyA9IGNvZGVmbGFncyAmIFB5Q0ZfTUFTSzsKLQkJaWYgKGNvbXBpbGVyZmxhZ3MpIHsKLQkJCXJlc3VsdCA9IDE7Ci0JCQljZi0+Y2ZfZmxhZ3MgfD0gY29tcGlsZXJmbGFnczsKLQkJfQorICAgIGlmIChjdXJyZW50X2ZyYW1lICE9IE5VTEwpIHsKKyAgICAgICAgY29uc3QgaW50IGNvZGVmbGFncyA9IGN1cnJlbnRfZnJhbWUtPmZfY29kZS0+Y29fZmxhZ3M7CisgICAgICAgIGNvbnN0IGludCBjb21waWxlcmZsYWdzID0gY29kZWZsYWdzICYgUHlDRl9NQVNLOworICAgICAgICBpZiAoY29tcGlsZXJmbGFncykgeworICAgICAgICAgICAgcmVzdWx0ID0gMTsKKyAgICAgICAgICAgIGNmLT5jZl9mbGFncyB8PSBjb21waWxlcmZsYWdzOworICAgICAgICB9CiAjaWYgMCAvKiBmdXR1cmUga2V5d29yZCAqLwotCQlpZiAoY29kZWZsYWdzICYgQ09fR0VORVJBVE9SX0FMTE9XRUQpIHsKLQkJCXJlc3VsdCA9IDE7Ci0JCQljZi0+Y2ZfZmxhZ3MgfD0gQ09fR0VORVJBVE9SX0FMTE9XRUQ7Ci0JCX0KKyAgICAgICAgaWYgKGNvZGVmbGFncyAmIENPX0dFTkVSQVRPUl9BTExPV0VEKSB7CisgICAgICAgICAgICByZXN1bHQgPSAxOworICAgICAgICAgICAgY2YtPmNmX2ZsYWdzIHw9IENPX0dFTkVSQVRPUl9BTExPV0VEOworICAgICAgICB9CiAjZW5kaWYKLQl9Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogaW50CiBQeV9GbHVzaExpbmUodm9pZCkKIHsKLQlQeU9iamVjdCAqZiA9IFB5U3lzX0dldE9iamVjdCgic3Rkb3V0Iik7Ci0JaWYgKGYgPT0gTlVMTCkKLQkJcmV0dXJuIDA7Ci0JaWYgKCFQeUZpbGVfU29mdFNwYWNlKGYsIDApKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gUHlGaWxlX1dyaXRlU3RyaW5nKCJcbiIsIGYpOworICAgIFB5T2JqZWN0ICpmID0gUHlTeXNfR2V0T2JqZWN0KCJzdGRvdXQiKTsKKyAgICBpZiAoZiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoIVB5RmlsZV9Tb2Z0U3BhY2UoZiwgMCkpCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiBQeUZpbGVfV3JpdGVTdHJpbmcoIlxuIiwgZik7CiB9CiAKIApAQCAtMzU4NiwyMDUgKzM1ODYsMjA1IEBACiBQeU9iamVjdCAqCiBQeUV2YWxfQ2FsbE9iamVjdChQeU9iamVjdCAqZnVuYywgUHlPYmplY3QgKmFyZykKIHsKLQlyZXR1cm4gUHlFdmFsX0NhbGxPYmplY3RXaXRoS2V5d29yZHMoZnVuYywgYXJnLCAoUHlPYmplY3QgKilOVUxMKTsKKyAgICByZXR1cm4gUHlFdmFsX0NhbGxPYmplY3RXaXRoS2V5d29yZHMoZnVuYywgYXJnLCAoUHlPYmplY3QgKilOVUxMKTsKIH0KICNkZWZpbmUgUHlFdmFsX0NhbGxPYmplY3QoZnVuYyxhcmcpIFwKLSAgICAgICAgUHlFdmFsX0NhbGxPYmplY3RXaXRoS2V5d29yZHMoZnVuYywgYXJnLCAoUHlPYmplY3QgKilOVUxMKQorICAgIFB5RXZhbF9DYWxsT2JqZWN0V2l0aEtleXdvcmRzKGZ1bmMsIGFyZywgKFB5T2JqZWN0ICopTlVMTCkKIAogUHlPYmplY3QgKgogUHlFdmFsX0NhbGxPYmplY3RXaXRoS2V5d29yZHMoUHlPYmplY3QgKmZ1bmMsIFB5T2JqZWN0ICphcmcsIFB5T2JqZWN0ICprdykKIHsKLQlQeU9iamVjdCAqcmVzdWx0OworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CiAKLQlpZiAoYXJnID09IE5VTEwpIHsKLQkJYXJnID0gUHlUdXBsZV9OZXcoMCk7Ci0JCWlmIChhcmcgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCX0KLQllbHNlIGlmICghUHlUdXBsZV9DaGVjayhhcmcpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJImFyZ3VtZW50IGxpc3QgbXVzdCBiZSBhIHR1cGxlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQllbHNlCi0JCVB5X0lOQ1JFRihhcmcpOworICAgIGlmIChhcmcgPT0gTlVMTCkgeworICAgICAgICBhcmcgPSBQeVR1cGxlX05ldygwKTsKKyAgICAgICAgaWYgKGFyZyA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGVsc2UgaWYgKCFQeVR1cGxlX0NoZWNrKGFyZykpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJhcmd1bWVudCBsaXN0IG11c3QgYmUgYSB0dXBsZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBQeV9JTkNSRUYoYXJnKTsKIAotCWlmIChrdyAhPSBOVUxMICYmICFQeURpY3RfQ2hlY2soa3cpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJImtleXdvcmQgbGlzdCBtdXN0IGJlIGEgZGljdGlvbmFyeSIpOwotCQlQeV9ERUNSRUYoYXJnKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChrdyAhPSBOVUxMICYmICFQeURpY3RfQ2hlY2soa3cpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAia2V5d29yZCBsaXN0IG11c3QgYmUgYSBkaWN0aW9uYXJ5Iik7CisgICAgICAgIFB5X0RFQ1JFRihhcmcpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlyZXN1bHQgPSBQeU9iamVjdF9DYWxsKGZ1bmMsIGFyZywga3cpOwotCVB5X0RFQ1JFRihhcmcpOwotCXJldHVybiByZXN1bHQ7CisgICAgcmVzdWx0ID0gUHlPYmplY3RfQ2FsbChmdW5jLCBhcmcsIGt3KTsKKyAgICBQeV9ERUNSRUYoYXJnKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBjb25zdCBjaGFyICoKIFB5RXZhbF9HZXRGdW5jTmFtZShQeU9iamVjdCAqZnVuYykKIHsKLQlpZiAoUHlNZXRob2RfQ2hlY2soZnVuYykpCi0JCXJldHVybiBQeUV2YWxfR2V0RnVuY05hbWUoUHlNZXRob2RfR0VUX0ZVTkNUSU9OKGZ1bmMpKTsKLQllbHNlIGlmIChQeUZ1bmN0aW9uX0NoZWNrKGZ1bmMpKQotCQlyZXR1cm4gUHlTdHJpbmdfQXNTdHJpbmcoKChQeUZ1bmN0aW9uT2JqZWN0KilmdW5jKS0+ZnVuY19uYW1lKTsKLQllbHNlIGlmIChQeUNGdW5jdGlvbl9DaGVjayhmdW5jKSkKLQkJcmV0dXJuICgoUHlDRnVuY3Rpb25PYmplY3QqKWZ1bmMpLT5tX21sLT5tbF9uYW1lOwotCWVsc2UgaWYgKFB5Q2xhc3NfQ2hlY2soZnVuYykpCi0JCXJldHVybiBQeVN0cmluZ19Bc1N0cmluZygoKFB5Q2xhc3NPYmplY3QqKWZ1bmMpLT5jbF9uYW1lKTsKLQllbHNlIGlmIChQeUluc3RhbmNlX0NoZWNrKGZ1bmMpKSB7Ci0JCXJldHVybiBQeVN0cmluZ19Bc1N0cmluZygKLQkJCSgoUHlJbnN0YW5jZU9iamVjdCopZnVuYyktPmluX2NsYXNzLT5jbF9uYW1lKTsKLQl9IGVsc2UgewotCQlyZXR1cm4gZnVuYy0+b2JfdHlwZS0+dHBfbmFtZTsKLQl9CisgICAgaWYgKFB5TWV0aG9kX0NoZWNrKGZ1bmMpKQorICAgICAgICByZXR1cm4gUHlFdmFsX0dldEZ1bmNOYW1lKFB5TWV0aG9kX0dFVF9GVU5DVElPTihmdW5jKSk7CisgICAgZWxzZSBpZiAoUHlGdW5jdGlvbl9DaGVjayhmdW5jKSkKKyAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0FzU3RyaW5nKCgoUHlGdW5jdGlvbk9iamVjdCopZnVuYyktPmZ1bmNfbmFtZSk7CisgICAgZWxzZSBpZiAoUHlDRnVuY3Rpb25fQ2hlY2soZnVuYykpCisgICAgICAgIHJldHVybiAoKFB5Q0Z1bmN0aW9uT2JqZWN0KilmdW5jKS0+bV9tbC0+bWxfbmFtZTsKKyAgICBlbHNlIGlmIChQeUNsYXNzX0NoZWNrKGZ1bmMpKQorICAgICAgICByZXR1cm4gUHlTdHJpbmdfQXNTdHJpbmcoKChQeUNsYXNzT2JqZWN0KilmdW5jKS0+Y2xfbmFtZSk7CisgICAgZWxzZSBpZiAoUHlJbnN0YW5jZV9DaGVjayhmdW5jKSkgeworICAgICAgICByZXR1cm4gUHlTdHJpbmdfQXNTdHJpbmcoCisgICAgICAgICAgICAoKFB5SW5zdGFuY2VPYmplY3QqKWZ1bmMpLT5pbl9jbGFzcy0+Y2xfbmFtZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGZ1bmMtPm9iX3R5cGUtPnRwX25hbWU7CisgICAgfQogfQogCiBjb25zdCBjaGFyICoKIFB5RXZhbF9HZXRGdW5jRGVzYyhQeU9iamVjdCAqZnVuYykKIHsKLQlpZiAoUHlNZXRob2RfQ2hlY2soZnVuYykpCi0JCXJldHVybiAiKCkiOwotCWVsc2UgaWYgKFB5RnVuY3Rpb25fQ2hlY2soZnVuYykpCi0JCXJldHVybiAiKCkiOwotCWVsc2UgaWYgKFB5Q0Z1bmN0aW9uX0NoZWNrKGZ1bmMpKQotCQlyZXR1cm4gIigpIjsKLQllbHNlIGlmIChQeUNsYXNzX0NoZWNrKGZ1bmMpKQotCQlyZXR1cm4gIiBjb25zdHJ1Y3RvciI7Ci0JZWxzZSBpZiAoUHlJbnN0YW5jZV9DaGVjayhmdW5jKSkgewotCQlyZXR1cm4gIiBpbnN0YW5jZSI7Ci0JfSBlbHNlIHsKLQkJcmV0dXJuICIgb2JqZWN0IjsKLQl9CisgICAgaWYgKFB5TWV0aG9kX0NoZWNrKGZ1bmMpKQorICAgICAgICByZXR1cm4gIigpIjsKKyAgICBlbHNlIGlmIChQeUZ1bmN0aW9uX0NoZWNrKGZ1bmMpKQorICAgICAgICByZXR1cm4gIigpIjsKKyAgICBlbHNlIGlmIChQeUNGdW5jdGlvbl9DaGVjayhmdW5jKSkKKyAgICAgICAgcmV0dXJuICIoKSI7CisgICAgZWxzZSBpZiAoUHlDbGFzc19DaGVjayhmdW5jKSkKKyAgICAgICAgcmV0dXJuICIgY29uc3RydWN0b3IiOworICAgIGVsc2UgaWYgKFB5SW5zdGFuY2VfQ2hlY2soZnVuYykpIHsKKyAgICAgICAgcmV0dXJuICIgaW5zdGFuY2UiOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAiIG9iamVjdCI7CisgICAgfQogfQogCiBzdGF0aWMgdm9pZAogZXJyX2FyZ3MoUHlPYmplY3QgKmZ1bmMsIGludCBmbGFncywgaW50IG5hcmdzKQogewotCWlmIChmbGFncyAmIE1FVEhfTk9BUkdTKQotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJICAgICAiJS4yMDBzKCkgdGFrZXMgbm8gYXJndW1lbnRzICglZCBnaXZlbikiLAotCQkJICAgICAoKFB5Q0Z1bmN0aW9uT2JqZWN0ICopZnVuYyktPm1fbWwtPm1sX25hbWUsCi0JCQkgICAgIG5hcmdzKTsKLQllbHNlCi0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgICIlLjIwMHMoKSB0YWtlcyBleGFjdGx5IG9uZSBhcmd1bWVudCAoJWQgZ2l2ZW4pIiwKLQkJCSAgICAgKChQeUNGdW5jdGlvbk9iamVjdCAqKWZ1bmMpLT5tX21sLT5tbF9uYW1lLAotCQkJICAgICBuYXJncyk7CisgICAgaWYgKGZsYWdzICYgTUVUSF9OT0FSR1MpCisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiJS4yMDBzKCkgdGFrZXMgbm8gYXJndW1lbnRzICglZCBnaXZlbikiLAorICAgICAgICAgICAgICAgICAgICAgKChQeUNGdW5jdGlvbk9iamVjdCAqKWZ1bmMpLT5tX21sLT5tbF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgbmFyZ3MpOworICAgIGVsc2UKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICIlLjIwMHMoKSB0YWtlcyBleGFjdGx5IG9uZSBhcmd1bWVudCAoJWQgZ2l2ZW4pIiwKKyAgICAgICAgICAgICAgICAgICAgICgoUHlDRnVuY3Rpb25PYmplY3QgKilmdW5jKS0+bV9tbC0+bWxfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIG5hcmdzKTsKIH0KIAogI2RlZmluZSBDX1RSQUNFKHgsIGNhbGwpIFwKIGlmICh0c3RhdGUtPnVzZV90cmFjaW5nICYmIHRzdGF0ZS0+Y19wcm9maWxlZnVuYykgeyBcCi0JaWYgKGNhbGxfdHJhY2UodHN0YXRlLT5jX3Byb2ZpbGVmdW5jLCBcCi0JCXRzdGF0ZS0+Y19wcm9maWxlb2JqLCBcCi0JCXRzdGF0ZS0+ZnJhbWUsIFB5VHJhY2VfQ19DQUxMLCBcCi0JCWZ1bmMpKSB7IFwKLQkJeCA9IE5VTEw7IFwKLQl9IFwKLQllbHNlIHsgXAotCQl4ID0gY2FsbDsgXAotCQlpZiAodHN0YXRlLT5jX3Byb2ZpbGVmdW5jICE9IE5VTEwpIHsgXAotCQkJaWYgKHggPT0gTlVMTCkgeyBcCi0JCQkJY2FsbF90cmFjZV9wcm90ZWN0ZWQodHN0YXRlLT5jX3Byb2ZpbGVmdW5jLCBcCi0JCQkJCXRzdGF0ZS0+Y19wcm9maWxlb2JqLCBcCi0JCQkJCXRzdGF0ZS0+ZnJhbWUsIFB5VHJhY2VfQ19FWENFUFRJT04sIFwKLQkJCQkJZnVuYyk7IFwKLQkJCQkvKiBYWFggc2hvdWxkIHBhc3MgKHR5cGUsIHZhbHVlLCB0YikgKi8gXAotCQkJfSBlbHNlIHsgXAotCQkJCWlmIChjYWxsX3RyYWNlKHRzdGF0ZS0+Y19wcm9maWxlZnVuYywgXAotCQkJCQl0c3RhdGUtPmNfcHJvZmlsZW9iaiwgXAotCQkJCQl0c3RhdGUtPmZyYW1lLCBQeVRyYWNlX0NfUkVUVVJOLCBcCi0JCQkJCWZ1bmMpKSB7IFwKLQkJCQkJUHlfREVDUkVGKHgpOyBcCi0JCQkJCXggPSBOVUxMOyBcCi0JCQkJfSBcCi0JCQl9IFwKLQkJfSBcCi0JfSBcCisgICAgaWYgKGNhbGxfdHJhY2UodHN0YXRlLT5jX3Byb2ZpbGVmdW5jLCBcCisgICAgICAgIHRzdGF0ZS0+Y19wcm9maWxlb2JqLCBcCisgICAgICAgIHRzdGF0ZS0+ZnJhbWUsIFB5VHJhY2VfQ19DQUxMLCBcCisgICAgICAgIGZ1bmMpKSB7IFwKKyAgICAgICAgeCA9IE5VTEw7IFwKKyAgICB9IFwKKyAgICBlbHNlIHsgXAorICAgICAgICB4ID0gY2FsbDsgXAorICAgICAgICBpZiAodHN0YXRlLT5jX3Byb2ZpbGVmdW5jICE9IE5VTEwpIHsgXAorICAgICAgICAgICAgaWYgKHggPT0gTlVMTCkgeyBcCisgICAgICAgICAgICAgICAgY2FsbF90cmFjZV9wcm90ZWN0ZWQodHN0YXRlLT5jX3Byb2ZpbGVmdW5jLCBcCisgICAgICAgICAgICAgICAgICAgIHRzdGF0ZS0+Y19wcm9maWxlb2JqLCBcCisgICAgICAgICAgICAgICAgICAgIHRzdGF0ZS0+ZnJhbWUsIFB5VHJhY2VfQ19FWENFUFRJT04sIFwKKyAgICAgICAgICAgICAgICAgICAgZnVuYyk7IFwKKyAgICAgICAgICAgICAgICAvKiBYWFggc2hvdWxkIHBhc3MgKHR5cGUsIHZhbHVlLCB0YikgKi8gXAorICAgICAgICAgICAgfSBlbHNlIHsgXAorICAgICAgICAgICAgICAgIGlmIChjYWxsX3RyYWNlKHRzdGF0ZS0+Y19wcm9maWxlZnVuYywgXAorICAgICAgICAgICAgICAgICAgICB0c3RhdGUtPmNfcHJvZmlsZW9iaiwgXAorICAgICAgICAgICAgICAgICAgICB0c3RhdGUtPmZyYW1lLCBQeVRyYWNlX0NfUkVUVVJOLCBcCisgICAgICAgICAgICAgICAgICAgIGZ1bmMpKSB7IFwKKyAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHgpOyBcCisgICAgICAgICAgICAgICAgICAgIHggPSBOVUxMOyBcCisgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICB9IFwKKyAgICAgICAgfSBcCisgICAgfSBcCiB9IGVsc2UgeyBcCi0JeCA9IGNhbGw7IFwKLQl9CisgICAgeCA9IGNhbGw7IFwKKyAgICB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjYWxsX2Z1bmN0aW9uKFB5T2JqZWN0ICoqKnBwX3N0YWNrLCBpbnQgb3BhcmcKICNpZmRlZiBXSVRIX1RTQwotCQksIHVpbnQ2NCogcGludHIwLCB1aW50NjQqIHBpbnRyMQorICAgICAgICAgICAgICAgICwgdWludDY0KiBwaW50cjAsIHVpbnQ2NCogcGludHIxCiAjZW5kaWYKLQkJKQorICAgICAgICAgICAgICAgICkKIHsKLQlpbnQgbmEgPSBvcGFyZyAmIDB4ZmY7Ci0JaW50IG5rID0gKG9wYXJnPj44KSAmIDB4ZmY7Ci0JaW50IG4gPSBuYSArIDIgKiBuazsKLQlQeU9iamVjdCAqKnBmdW5jID0gKCpwcF9zdGFjaykgLSBuIC0gMTsKLQlQeU9iamVjdCAqZnVuYyA9ICpwZnVuYzsKLQlQeU9iamVjdCAqeCwgKnc7CisgICAgaW50IG5hID0gb3BhcmcgJiAweGZmOworICAgIGludCBuayA9IChvcGFyZz4+OCkgJiAweGZmOworICAgIGludCBuID0gbmEgKyAyICogbms7CisgICAgUHlPYmplY3QgKipwZnVuYyA9ICgqcHBfc3RhY2spIC0gbiAtIDE7CisgICAgUHlPYmplY3QgKmZ1bmMgPSAqcGZ1bmM7CisgICAgUHlPYmplY3QgKngsICp3OwogCi0JLyogQWx3YXlzIGRpc3BhdGNoIFB5Q0Z1bmN0aW9uIGZpcnN0LCBiZWNhdXNlIHRoZXNlIGFyZQotCSAgIHByZXN1bWVkIHRvIGJlIHRoZSBtb3N0IGZyZXF1ZW50IGNhbGxhYmxlIG9iamVjdC4KLQkqLwotCWlmIChQeUNGdW5jdGlvbl9DaGVjayhmdW5jKSAmJiBuayA9PSAwKSB7Ci0JCWludCBmbGFncyA9IFB5Q0Z1bmN0aW9uX0dFVF9GTEFHUyhmdW5jKTsKLQkJUHlUaHJlYWRTdGF0ZSAqdHN0YXRlID0gUHlUaHJlYWRTdGF0ZV9HRVQoKTsKKyAgICAvKiBBbHdheXMgZGlzcGF0Y2ggUHlDRnVuY3Rpb24gZmlyc3QsIGJlY2F1c2UgdGhlc2UgYXJlCisgICAgICAgcHJlc3VtZWQgdG8gYmUgdGhlIG1vc3QgZnJlcXVlbnQgY2FsbGFibGUgb2JqZWN0LgorICAgICovCisgICAgaWYgKFB5Q0Z1bmN0aW9uX0NoZWNrKGZ1bmMpICYmIG5rID09IDApIHsKKyAgICAgICAgaW50IGZsYWdzID0gUHlDRnVuY3Rpb25fR0VUX0ZMQUdTKGZ1bmMpOworICAgICAgICBQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dFVCgpOwogCi0JCVBDQUxMKFBDQUxMX0NGVU5DVElPTik7Ci0JCWlmIChmbGFncyAmIChNRVRIX05PQVJHUyB8IE1FVEhfTykpIHsKLQkJCVB5Q0Z1bmN0aW9uIG1ldGggPSBQeUNGdW5jdGlvbl9HRVRfRlVOQ1RJT04oZnVuYyk7Ci0JCQlQeU9iamVjdCAqc2VsZiA9IFB5Q0Z1bmN0aW9uX0dFVF9TRUxGKGZ1bmMpOwotCQkJaWYgKGZsYWdzICYgTUVUSF9OT0FSR1MgJiYgbmEgPT0gMCkgewotCQkJCUNfVFJBQ0UoeCwgKCptZXRoKShzZWxmLE5VTEwpKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGZsYWdzICYgTUVUSF9PICYmIG5hID09IDEpIHsKLQkJCQlQeU9iamVjdCAqYXJnID0gRVhUX1BPUCgqcHBfc3RhY2spOwotCQkJCUNfVFJBQ0UoeCwgKCptZXRoKShzZWxmLGFyZykpOwotCQkJCVB5X0RFQ1JFRihhcmcpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZXJyX2FyZ3MoZnVuYywgZmxhZ3MsIG5hKTsKLQkJCQl4ID0gTlVMTDsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCVB5T2JqZWN0ICpjYWxsYXJnczsKLQkJCWNhbGxhcmdzID0gbG9hZF9hcmdzKHBwX3N0YWNrLCBuYSk7Ci0JCQlSRUFEX1RJTUVTVEFNUCgqcGludHIwKTsKLQkJCUNfVFJBQ0UoeCwgUHlDRnVuY3Rpb25fQ2FsbChmdW5jLGNhbGxhcmdzLE5VTEwpKTsKLQkJCVJFQURfVElNRVNUQU1QKCpwaW50cjEpOwotCQkJUHlfWERFQ1JFRihjYWxsYXJncyk7Ci0JCX0KLQl9IGVsc2UgewotCQlpZiAoUHlNZXRob2RfQ2hlY2soZnVuYykgJiYgUHlNZXRob2RfR0VUX1NFTEYoZnVuYykgIT0gTlVMTCkgewotCQkJLyogb3B0aW1pemUgYWNjZXNzIHRvIGJvdW5kIG1ldGhvZHMgKi8KLQkJCVB5T2JqZWN0ICpzZWxmID0gUHlNZXRob2RfR0VUX1NFTEYoZnVuYyk7Ci0JCQlQQ0FMTChQQ0FMTF9NRVRIT0QpOwotCQkJUENBTEwoUENBTExfQk9VTkRfTUVUSE9EKTsKLQkJCVB5X0lOQ1JFRihzZWxmKTsKLQkJCWZ1bmMgPSBQeU1ldGhvZF9HRVRfRlVOQ1RJT04oZnVuYyk7Ci0JCQlQeV9JTkNSRUYoZnVuYyk7Ci0JCQlQeV9ERUNSRUYoKnBmdW5jKTsKLQkJCSpwZnVuYyA9IHNlbGY7Ci0JCQluYSsrOwotCQkJbisrOwotCQl9IGVsc2UKLQkJCVB5X0lOQ1JFRihmdW5jKTsKLQkJUkVBRF9USU1FU1RBTVAoKnBpbnRyMCk7Ci0JCWlmIChQeUZ1bmN0aW9uX0NoZWNrKGZ1bmMpKQotCQkJeCA9IGZhc3RfZnVuY3Rpb24oZnVuYywgcHBfc3RhY2ssIG4sIG5hLCBuayk7Ci0JCWVsc2UKLQkJCXggPSBkb19jYWxsKGZ1bmMsIHBwX3N0YWNrLCBuYSwgbmspOwotCQlSRUFEX1RJTUVTVEFNUCgqcGludHIxKTsKLQkJUHlfREVDUkVGKGZ1bmMpOwotCX0KKyAgICAgICAgUENBTEwoUENBTExfQ0ZVTkNUSU9OKTsKKyAgICAgICAgaWYgKGZsYWdzICYgKE1FVEhfTk9BUkdTIHwgTUVUSF9PKSkgeworICAgICAgICAgICAgUHlDRnVuY3Rpb24gbWV0aCA9IFB5Q0Z1bmN0aW9uX0dFVF9GVU5DVElPTihmdW5jKTsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpzZWxmID0gUHlDRnVuY3Rpb25fR0VUX1NFTEYoZnVuYyk7CisgICAgICAgICAgICBpZiAoZmxhZ3MgJiBNRVRIX05PQVJHUyAmJiBuYSA9PSAwKSB7CisgICAgICAgICAgICAgICAgQ19UUkFDRSh4LCAoKm1ldGgpKHNlbGYsTlVMTCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoZmxhZ3MgJiBNRVRIX08gJiYgbmEgPT0gMSkgeworICAgICAgICAgICAgICAgIFB5T2JqZWN0ICphcmcgPSBFWFRfUE9QKCpwcF9zdGFjayk7CisgICAgICAgICAgICAgICAgQ19UUkFDRSh4LCAoKm1ldGgpKHNlbGYsYXJnKSk7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGFyZyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBlcnJfYXJncyhmdW5jLCBmbGFncywgbmEpOworICAgICAgICAgICAgICAgIHggPSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgUHlPYmplY3QgKmNhbGxhcmdzOworICAgICAgICAgICAgY2FsbGFyZ3MgPSBsb2FkX2FyZ3MocHBfc3RhY2ssIG5hKTsKKyAgICAgICAgICAgIFJFQURfVElNRVNUQU1QKCpwaW50cjApOworICAgICAgICAgICAgQ19UUkFDRSh4LCBQeUNGdW5jdGlvbl9DYWxsKGZ1bmMsY2FsbGFyZ3MsTlVMTCkpOworICAgICAgICAgICAgUkVBRF9USU1FU1RBTVAoKnBpbnRyMSk7CisgICAgICAgICAgICBQeV9YREVDUkVGKGNhbGxhcmdzKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChQeU1ldGhvZF9DaGVjayhmdW5jKSAmJiBQeU1ldGhvZF9HRVRfU0VMRihmdW5jKSAhPSBOVUxMKSB7CisgICAgICAgICAgICAvKiBvcHRpbWl6ZSBhY2Nlc3MgdG8gYm91bmQgbWV0aG9kcyAqLworICAgICAgICAgICAgUHlPYmplY3QgKnNlbGYgPSBQeU1ldGhvZF9HRVRfU0VMRihmdW5jKTsKKyAgICAgICAgICAgIFBDQUxMKFBDQUxMX01FVEhPRCk7CisgICAgICAgICAgICBQQ0FMTChQQ0FMTF9CT1VORF9NRVRIT0QpOworICAgICAgICAgICAgUHlfSU5DUkVGKHNlbGYpOworICAgICAgICAgICAgZnVuYyA9IFB5TWV0aG9kX0dFVF9GVU5DVElPTihmdW5jKTsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihmdW5jKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRigqcGZ1bmMpOworICAgICAgICAgICAgKnBmdW5jID0gc2VsZjsKKyAgICAgICAgICAgIG5hKys7CisgICAgICAgICAgICBuKys7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgUHlfSU5DUkVGKGZ1bmMpOworICAgICAgICBSRUFEX1RJTUVTVEFNUCgqcGludHIwKTsKKyAgICAgICAgaWYgKFB5RnVuY3Rpb25fQ2hlY2soZnVuYykpCisgICAgICAgICAgICB4ID0gZmFzdF9mdW5jdGlvbihmdW5jLCBwcF9zdGFjaywgbiwgbmEsIG5rKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgeCA9IGRvX2NhbGwoZnVuYywgcHBfc3RhY2ssIG5hLCBuayk7CisgICAgICAgIFJFQURfVElNRVNUQU1QKCpwaW50cjEpOworICAgICAgICBQeV9ERUNSRUYoZnVuYyk7CisgICAgfQogCi0JLyogQ2xlYXIgdGhlIHN0YWNrIG9mIHRoZSBmdW5jdGlvbiBvYmplY3QuICBBbHNvIHJlbW92ZXMKLSAgICAgICAgICAgdGhlIGFyZ3VtZW50cyBpbiBjYXNlIHRoZXkgd2VyZW4ndCBjb25zdW1lZCBhbHJlYWR5Ci0gICAgICAgICAgIChmYXN0X2Z1bmN0aW9uKCkgYW5kIGVycl9hcmdzKCkgbGVhdmUgdGhlbSBvbiB0aGUgc3RhY2spLgotCSAqLwotCXdoaWxlICgoKnBwX3N0YWNrKSA+IHBmdW5jKSB7Ci0JCXcgPSBFWFRfUE9QKCpwcF9zdGFjayk7Ci0JCVB5X0RFQ1JFRih3KTsKLQkJUENBTEwoUENBTExfUE9QKTsKLQl9Ci0JcmV0dXJuIHg7CisgICAgLyogQ2xlYXIgdGhlIHN0YWNrIG9mIHRoZSBmdW5jdGlvbiBvYmplY3QuICBBbHNvIHJlbW92ZXMKKyAgICAgICB0aGUgYXJndW1lbnRzIGluIGNhc2UgdGhleSB3ZXJlbid0IGNvbnN1bWVkIGFscmVhZHkKKyAgICAgICAoZmFzdF9mdW5jdGlvbigpIGFuZCBlcnJfYXJncygpIGxlYXZlIHRoZW0gb24gdGhlIHN0YWNrKS4KKyAgICAgKi8KKyAgICB3aGlsZSAoKCpwcF9zdGFjaykgPiBwZnVuYykgeworICAgICAgICB3ID0gRVhUX1BPUCgqcHBfc3RhY2spOworICAgICAgICBQeV9ERUNSRUYodyk7CisgICAgICAgIFBDQUxMKFBDQUxMX1BPUCk7CisgICAgfQorICAgIHJldHVybiB4OwogfQogCiAvKiBUaGUgZmFzdF9mdW5jdGlvbigpIGZ1bmN0aW9uIG9wdGltaXplIGNhbGxzIGZvciB3aGljaCBubyBhcmd1bWVudApAQCAtMzc5OSwyNzMgKzM3OTksMjczIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZmFzdF9mdW5jdGlvbihQeU9iamVjdCAqZnVuYywgUHlPYmplY3QgKioqcHBfc3RhY2ssIGludCBuLCBpbnQgbmEsIGludCBuaykKIHsKLQlQeUNvZGVPYmplY3QgKmNvID0gKFB5Q29kZU9iamVjdCAqKVB5RnVuY3Rpb25fR0VUX0NPREUoZnVuYyk7Ci0JUHlPYmplY3QgKmdsb2JhbHMgPSBQeUZ1bmN0aW9uX0dFVF9HTE9CQUxTKGZ1bmMpOwotCVB5T2JqZWN0ICphcmdkZWZzID0gUHlGdW5jdGlvbl9HRVRfREVGQVVMVFMoZnVuYyk7Ci0JUHlPYmplY3QgKipkID0gTlVMTDsKLQlpbnQgbmQgPSAwOworICAgIFB5Q29kZU9iamVjdCAqY28gPSAoUHlDb2RlT2JqZWN0ICopUHlGdW5jdGlvbl9HRVRfQ09ERShmdW5jKTsKKyAgICBQeU9iamVjdCAqZ2xvYmFscyA9IFB5RnVuY3Rpb25fR0VUX0dMT0JBTFMoZnVuYyk7CisgICAgUHlPYmplY3QgKmFyZ2RlZnMgPSBQeUZ1bmN0aW9uX0dFVF9ERUZBVUxUUyhmdW5jKTsKKyAgICBQeU9iamVjdCAqKmQgPSBOVUxMOworICAgIGludCBuZCA9IDA7CiAKLQlQQ0FMTChQQ0FMTF9GVU5DVElPTik7Ci0JUENBTEwoUENBTExfRkFTVF9GVU5DVElPTik7Ci0JaWYgKGFyZ2RlZnMgPT0gTlVMTCAmJiBjby0+Y29fYXJnY291bnQgPT0gbiAmJiBuaz09MCAmJgotCSAgICBjby0+Y29fZmxhZ3MgPT0gKENPX09QVElNSVpFRCB8IENPX05FV0xPQ0FMUyB8IENPX05PRlJFRSkpIHsKLQkJUHlGcmFtZU9iamVjdCAqZjsKLQkJUHlPYmplY3QgKnJldHZhbCA9IE5VTEw7Ci0JCVB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfR0VUKCk7Ci0JCVB5T2JqZWN0ICoqZmFzdGxvY2FscywgKipzdGFjazsKLQkJaW50IGk7CisgICAgUENBTEwoUENBTExfRlVOQ1RJT04pOworICAgIFBDQUxMKFBDQUxMX0ZBU1RfRlVOQ1RJT04pOworICAgIGlmIChhcmdkZWZzID09IE5VTEwgJiYgY28tPmNvX2FyZ2NvdW50ID09IG4gJiYgbms9PTAgJiYKKyAgICAgICAgY28tPmNvX2ZsYWdzID09IChDT19PUFRJTUlaRUQgfCBDT19ORVdMT0NBTFMgfCBDT19OT0ZSRUUpKSB7CisgICAgICAgIFB5RnJhbWVPYmplY3QgKmY7CisgICAgICAgIFB5T2JqZWN0ICpyZXR2YWwgPSBOVUxMOworICAgICAgICBQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dFVCgpOworICAgICAgICBQeU9iamVjdCAqKmZhc3Rsb2NhbHMsICoqc3RhY2s7CisgICAgICAgIGludCBpOwogCi0JCVBDQUxMKFBDQUxMX0ZBU1RFUl9GVU5DVElPTik7Ci0JCWFzc2VydChnbG9iYWxzICE9IE5VTEwpOwotCQkvKiBYWFggUGVyaGFwcyB3ZSBzaG91bGQgY3JlYXRlIGEgc3BlY2lhbGl6ZWQKLQkJICAgUHlGcmFtZV9OZXcoKSB0aGF0IGRvZXNuJ3QgdGFrZSBsb2NhbHMsIGJ1dCBkb2VzCi0JCSAgIHRha2UgYnVpbHRpbnMgd2l0aG91dCBzYW5pdHkgY2hlY2tpbmcgdGhlbS4KLQkJKi8KLQkJYXNzZXJ0KHRzdGF0ZSAhPSBOVUxMKTsKLQkJZiA9IFB5RnJhbWVfTmV3KHRzdGF0ZSwgY28sIGdsb2JhbHMsIE5VTEwpOwotCQlpZiAoZiA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7CisgICAgICAgIFBDQUxMKFBDQUxMX0ZBU1RFUl9GVU5DVElPTik7CisgICAgICAgIGFzc2VydChnbG9iYWxzICE9IE5VTEwpOworICAgICAgICAvKiBYWFggUGVyaGFwcyB3ZSBzaG91bGQgY3JlYXRlIGEgc3BlY2lhbGl6ZWQKKyAgICAgICAgICAgUHlGcmFtZV9OZXcoKSB0aGF0IGRvZXNuJ3QgdGFrZSBsb2NhbHMsIGJ1dCBkb2VzCisgICAgICAgICAgIHRha2UgYnVpbHRpbnMgd2l0aG91dCBzYW5pdHkgY2hlY2tpbmcgdGhlbS4KKyAgICAgICAgKi8KKyAgICAgICAgYXNzZXJ0KHRzdGF0ZSAhPSBOVUxMKTsKKyAgICAgICAgZiA9IFB5RnJhbWVfTmV3KHRzdGF0ZSwgY28sIGdsb2JhbHMsIE5VTEwpOworICAgICAgICBpZiAoZiA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkJZmFzdGxvY2FscyA9IGYtPmZfbG9jYWxzcGx1czsKLQkJc3RhY2sgPSAoKnBwX3N0YWNrKSAtIG47CisgICAgICAgIGZhc3Rsb2NhbHMgPSBmLT5mX2xvY2Fsc3BsdXM7CisgICAgICAgIHN0YWNrID0gKCpwcF9zdGFjaykgLSBuOwogCi0JCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJCVB5X0lOQ1JFRigqc3RhY2spOwotCQkJZmFzdGxvY2Fsc1tpXSA9ICpzdGFjaysrOwotCQl9Ci0JCXJldHZhbCA9IFB5RXZhbF9FdmFsRnJhbWVFeChmLDApOwotCQkrK3RzdGF0ZS0+cmVjdXJzaW9uX2RlcHRoOwotCQlQeV9ERUNSRUYoZik7Ci0JCS0tdHN0YXRlLT5yZWN1cnNpb25fZGVwdGg7Ci0JCXJldHVybiByZXR2YWw7Ci0JfQotCWlmIChhcmdkZWZzICE9IE5VTEwpIHsKLQkJZCA9ICZQeVR1cGxlX0dFVF9JVEVNKGFyZ2RlZnMsIDApOwotCQluZCA9IFB5X1NJWkUoYXJnZGVmcyk7Ci0JfQotCXJldHVybiBQeUV2YWxfRXZhbENvZGVFeChjbywgZ2xvYmFscywKLQkJCQkgKFB5T2JqZWN0ICopTlVMTCwgKCpwcF9zdGFjayktbiwgbmEsCi0JCQkJICgqcHBfc3RhY2spLTIqbmssIG5rLCBkLCBuZCwKLQkJCQkgUHlGdW5jdGlvbl9HRVRfQ0xPU1VSRShmdW5jKSk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICAgIFB5X0lOQ1JFRigqc3RhY2spOworICAgICAgICAgICAgZmFzdGxvY2Fsc1tpXSA9ICpzdGFjaysrOworICAgICAgICB9CisgICAgICAgIHJldHZhbCA9IFB5RXZhbF9FdmFsRnJhbWVFeChmLDApOworICAgICAgICArK3RzdGF0ZS0+cmVjdXJzaW9uX2RlcHRoOworICAgICAgICBQeV9ERUNSRUYoZik7CisgICAgICAgIC0tdHN0YXRlLT5yZWN1cnNpb25fZGVwdGg7CisgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgfQorICAgIGlmIChhcmdkZWZzICE9IE5VTEwpIHsKKyAgICAgICAgZCA9ICZQeVR1cGxlX0dFVF9JVEVNKGFyZ2RlZnMsIDApOworICAgICAgICBuZCA9IFB5X1NJWkUoYXJnZGVmcyk7CisgICAgfQorICAgIHJldHVybiBQeUV2YWxfRXZhbENvZGVFeChjbywgZ2xvYmFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFB5T2JqZWN0ICopTlVMTCwgKCpwcF9zdGFjayktbiwgbmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqcHBfc3RhY2spLTIqbmssIG5rLCBkLCBuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlGdW5jdGlvbl9HRVRfQ0xPU1VSRShmdW5jKSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB1cGRhdGVfa2V5d29yZF9hcmdzKFB5T2JqZWN0ICpvcmlnX2t3ZGljdCwgaW50IG5rLCBQeU9iamVjdCAqKipwcF9zdGFjaywKICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmZ1bmMpCiB7Ci0JUHlPYmplY3QgKmt3ZGljdCA9IE5VTEw7Ci0JaWYgKG9yaWdfa3dkaWN0ID09IE5VTEwpCi0JCWt3ZGljdCA9IFB5RGljdF9OZXcoKTsKLQllbHNlIHsKLQkJa3dkaWN0ID0gUHlEaWN0X0NvcHkob3JpZ19rd2RpY3QpOwotCQlQeV9ERUNSRUYob3JpZ19rd2RpY3QpOwotCX0KLQlpZiAoa3dkaWN0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXdoaWxlICgtLW5rID49IDApIHsKLQkJaW50IGVycjsKLQkJUHlPYmplY3QgKnZhbHVlID0gRVhUX1BPUCgqcHBfc3RhY2spOwotCQlQeU9iamVjdCAqa2V5ID0gRVhUX1BPUCgqcHBfc3RhY2spOwotCQlpZiAoUHlEaWN0X0dldEl0ZW0oa3dkaWN0LCBrZXkpICE9IE5VTEwpIHsKLQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkJICAgICAiJS4yMDBzJXMgZ290IG11bHRpcGxlIHZhbHVlcyAiCi0JCQkJICAgICAiZm9yIGtleXdvcmQgYXJndW1lbnQgJyUuMjAwcyciLAotCQkJCSAgICAgUHlFdmFsX0dldEZ1bmNOYW1lKGZ1bmMpLAotCQkJCSAgICAgUHlFdmFsX0dldEZ1bmNEZXNjKGZ1bmMpLAotCQkJCSAgICAgUHlTdHJpbmdfQXNTdHJpbmcoa2V5KSk7Ci0JCQlQeV9ERUNSRUYoa2V5KTsKLQkJCVB5X0RFQ1JFRih2YWx1ZSk7Ci0JCQlQeV9ERUNSRUYoa3dkaWN0KTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWVyciA9IFB5RGljdF9TZXRJdGVtKGt3ZGljdCwga2V5LCB2YWx1ZSk7Ci0JCVB5X0RFQ1JFRihrZXkpOwotCQlQeV9ERUNSRUYodmFsdWUpOwotCQlpZiAoZXJyKSB7Ci0JCQlQeV9ERUNSRUYoa3dkaWN0KTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQotCXJldHVybiBrd2RpY3Q7CisgICAgUHlPYmplY3QgKmt3ZGljdCA9IE5VTEw7CisgICAgaWYgKG9yaWdfa3dkaWN0ID09IE5VTEwpCisgICAgICAgIGt3ZGljdCA9IFB5RGljdF9OZXcoKTsKKyAgICBlbHNlIHsKKyAgICAgICAga3dkaWN0ID0gUHlEaWN0X0NvcHkob3JpZ19rd2RpY3QpOworICAgICAgICBQeV9ERUNSRUYob3JpZ19rd2RpY3QpOworICAgIH0KKyAgICBpZiAoa3dkaWN0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHdoaWxlICgtLW5rID49IDApIHsKKyAgICAgICAgaW50IGVycjsKKyAgICAgICAgUHlPYmplY3QgKnZhbHVlID0gRVhUX1BPUCgqcHBfc3RhY2spOworICAgICAgICBQeU9iamVjdCAqa2V5ID0gRVhUX1BPUCgqcHBfc3RhY2spOworICAgICAgICBpZiAoUHlEaWN0X0dldEl0ZW0oa3dkaWN0LCBrZXkpICE9IE5VTEwpIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIiUuMjAwcyVzIGdvdCBtdWx0aXBsZSB2YWx1ZXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJmb3Iga2V5d29yZCBhcmd1bWVudCAnJS4yMDBzJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlFdmFsX0dldEZ1bmNOYW1lKGZ1bmMpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXZhbF9HZXRGdW5jRGVzYyhmdW5jKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19Bc1N0cmluZyhrZXkpKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihrZXkpOworICAgICAgICAgICAgUHlfREVDUkVGKHZhbHVlKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihrd2RpY3QpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgZXJyID0gUHlEaWN0X1NldEl0ZW0oa3dkaWN0LCBrZXksIHZhbHVlKTsKKyAgICAgICAgUHlfREVDUkVGKGtleSk7CisgICAgICAgIFB5X0RFQ1JFRih2YWx1ZSk7CisgICAgICAgIGlmIChlcnIpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihrd2RpY3QpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGt3ZGljdDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHVwZGF0ZV9zdGFyX2FyZ3MoaW50IG5zdGFjaywgaW50IG5zdGFyLCBQeU9iamVjdCAqc3RhcmFyZywKLQkJIFB5T2JqZWN0ICoqKnBwX3N0YWNrKQorICAgICAgICAgICAgICAgICBQeU9iamVjdCAqKipwcF9zdGFjaykKIHsKLQlQeU9iamVjdCAqY2FsbGFyZ3MsICp3OworICAgIFB5T2JqZWN0ICpjYWxsYXJncywgKnc7CiAKLQljYWxsYXJncyA9IFB5VHVwbGVfTmV3KG5zdGFjayArIG5zdGFyKTsKLQlpZiAoY2FsbGFyZ3MgPT0gTlVMTCkgewotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKG5zdGFyKSB7Ci0JCWludCBpOwotCQlmb3IgKGkgPSAwOyBpIDwgbnN0YXI7IGkrKykgewotCQkJUHlPYmplY3QgKmEgPSBQeVR1cGxlX0dFVF9JVEVNKHN0YXJhcmcsIGkpOwotCQkJUHlfSU5DUkVGKGEpOwotCQkJUHlUdXBsZV9TRVRfSVRFTShjYWxsYXJncywgbnN0YWNrICsgaSwgYSk7Ci0JCX0KLQl9Ci0Jd2hpbGUgKC0tbnN0YWNrID49IDApIHsKLQkJdyA9IEVYVF9QT1AoKnBwX3N0YWNrKTsKLQkJUHlUdXBsZV9TRVRfSVRFTShjYWxsYXJncywgbnN0YWNrLCB3KTsKLQl9Ci0JcmV0dXJuIGNhbGxhcmdzOworICAgIGNhbGxhcmdzID0gUHlUdXBsZV9OZXcobnN0YWNrICsgbnN0YXIpOworICAgIGlmIChjYWxsYXJncyA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAobnN0YXIpIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuc3RhcjsgaSsrKSB7CisgICAgICAgICAgICBQeU9iamVjdCAqYSA9IFB5VHVwbGVfR0VUX0lURU0oc3RhcmFyZywgaSk7CisgICAgICAgICAgICBQeV9JTkNSRUYoYSk7CisgICAgICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKGNhbGxhcmdzLCBuc3RhY2sgKyBpLCBhKTsKKyAgICAgICAgfQorICAgIH0KKyAgICB3aGlsZSAoLS1uc3RhY2sgPj0gMCkgeworICAgICAgICB3ID0gRVhUX1BPUCgqcHBfc3RhY2spOworICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKGNhbGxhcmdzLCBuc3RhY2ssIHcpOworICAgIH0KKyAgICByZXR1cm4gY2FsbGFyZ3M7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBsb2FkX2FyZ3MoUHlPYmplY3QgKioqcHBfc3RhY2ssIGludCBuYSkKIHsKLQlQeU9iamVjdCAqYXJncyA9IFB5VHVwbGVfTmV3KG5hKTsKLQlQeU9iamVjdCAqdzsKKyAgICBQeU9iamVjdCAqYXJncyA9IFB5VHVwbGVfTmV3KG5hKTsKKyAgICBQeU9iamVjdCAqdzsKIAotCWlmIChhcmdzID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXdoaWxlICgtLW5hID49IDApIHsKLQkJdyA9IEVYVF9QT1AoKnBwX3N0YWNrKTsKLQkJUHlUdXBsZV9TRVRfSVRFTShhcmdzLCBuYSwgdyk7Ci0JfQotCXJldHVybiBhcmdzOworICAgIGlmIChhcmdzID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHdoaWxlICgtLW5hID49IDApIHsKKyAgICAgICAgdyA9IEVYVF9QT1AoKnBwX3N0YWNrKTsKKyAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShhcmdzLCBuYSwgdyk7CisgICAgfQorICAgIHJldHVybiBhcmdzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZG9fY2FsbChQeU9iamVjdCAqZnVuYywgUHlPYmplY3QgKioqcHBfc3RhY2ssIGludCBuYSwgaW50IG5rKQogewotCVB5T2JqZWN0ICpjYWxsYXJncyA9IE5VTEw7Ci0JUHlPYmplY3QgKmt3ZGljdCA9IE5VTEw7Ci0JUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7CisgICAgUHlPYmplY3QgKmNhbGxhcmdzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqa3dkaWN0ID0gTlVMTDsKKyAgICBQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKIAotCWlmIChuayA+IDApIHsKLQkJa3dkaWN0ID0gdXBkYXRlX2tleXdvcmRfYXJncyhOVUxMLCBuaywgcHBfc3RhY2ssIGZ1bmMpOwotCQlpZiAoa3dkaWN0ID09IE5VTEwpCi0JCQlnb3RvIGNhbGxfZmFpbDsKLQl9Ci0JY2FsbGFyZ3MgPSBsb2FkX2FyZ3MocHBfc3RhY2ssIG5hKTsKLQlpZiAoY2FsbGFyZ3MgPT0gTlVMTCkKLQkJZ290byBjYWxsX2ZhaWw7CisgICAgaWYgKG5rID4gMCkgeworICAgICAgICBrd2RpY3QgPSB1cGRhdGVfa2V5d29yZF9hcmdzKE5VTEwsIG5rLCBwcF9zdGFjaywgZnVuYyk7CisgICAgICAgIGlmIChrd2RpY3QgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gY2FsbF9mYWlsOworICAgIH0KKyAgICBjYWxsYXJncyA9IGxvYWRfYXJncyhwcF9zdGFjaywgbmEpOworICAgIGlmIChjYWxsYXJncyA9PSBOVUxMKQorICAgICAgICBnb3RvIGNhbGxfZmFpbDsKICNpZmRlZiBDQUxMX1BST0ZJTEUKLQkvKiBBdCB0aGlzIHBvaW50LCB3ZSBoYXZlIHRvIGxvb2sgYXQgdGhlIHR5cGUgb2YgZnVuYyB0bwotCSAgIHVwZGF0ZSB0aGUgY2FsbCBzdGF0cyBwcm9wZXJseS4gIERvIGl0IGhlcmUgc28gYXMgdG8gYXZvaWQKLQkgICBleHBvc2luZyB0aGUgY2FsbCBzdGF0cyBtYWNoaW5lcnkgb3V0c2lkZSBjZXZhbC5jCi0JKi8KLQlpZiAoUHlGdW5jdGlvbl9DaGVjayhmdW5jKSkKLQkJUENBTEwoUENBTExfRlVOQ1RJT04pOwotCWVsc2UgaWYgKFB5TWV0aG9kX0NoZWNrKGZ1bmMpKQotCQlQQ0FMTChQQ0FMTF9NRVRIT0QpOwotCWVsc2UgaWYgKFB5VHlwZV9DaGVjayhmdW5jKSkKLQkJUENBTEwoUENBTExfVFlQRSk7Ci0JZWxzZSBpZiAoUHlDRnVuY3Rpb25fQ2hlY2soZnVuYykpCi0JCVBDQUxMKFBDQUxMX0NGVU5DVElPTik7Ci0JZWxzZQotCQlQQ0FMTChQQ0FMTF9PVEhFUik7CisgICAgLyogQXQgdGhpcyBwb2ludCwgd2UgaGF2ZSB0byBsb29rIGF0IHRoZSB0eXBlIG9mIGZ1bmMgdG8KKyAgICAgICB1cGRhdGUgdGhlIGNhbGwgc3RhdHMgcHJvcGVybHkuICBEbyBpdCBoZXJlIHNvIGFzIHRvIGF2b2lkCisgICAgICAgZXhwb3NpbmcgdGhlIGNhbGwgc3RhdHMgbWFjaGluZXJ5IG91dHNpZGUgY2V2YWwuYworICAgICovCisgICAgaWYgKFB5RnVuY3Rpb25fQ2hlY2soZnVuYykpCisgICAgICAgIFBDQUxMKFBDQUxMX0ZVTkNUSU9OKTsKKyAgICBlbHNlIGlmIChQeU1ldGhvZF9DaGVjayhmdW5jKSkKKyAgICAgICAgUENBTEwoUENBTExfTUVUSE9EKTsKKyAgICBlbHNlIGlmIChQeVR5cGVfQ2hlY2soZnVuYykpCisgICAgICAgIFBDQUxMKFBDQUxMX1RZUEUpOworICAgIGVsc2UgaWYgKFB5Q0Z1bmN0aW9uX0NoZWNrKGZ1bmMpKQorICAgICAgICBQQ0FMTChQQ0FMTF9DRlVOQ1RJT04pOworICAgIGVsc2UKKyAgICAgICAgUENBTEwoUENBTExfT1RIRVIpOwogI2VuZGlmCi0JaWYgKFB5Q0Z1bmN0aW9uX0NoZWNrKGZ1bmMpKSB7Ci0JCVB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfR0VUKCk7Ci0JCUNfVFJBQ0UocmVzdWx0LCBQeUNGdW5jdGlvbl9DYWxsKGZ1bmMsIGNhbGxhcmdzLCBrd2RpY3QpKTsKLQl9Ci0JZWxzZQotCQlyZXN1bHQgPSBQeU9iamVjdF9DYWxsKGZ1bmMsIGNhbGxhcmdzLCBrd2RpY3QpOworICAgIGlmIChQeUNGdW5jdGlvbl9DaGVjayhmdW5jKSkgeworICAgICAgICBQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dFVCgpOworICAgICAgICBDX1RSQUNFKHJlc3VsdCwgUHlDRnVuY3Rpb25fQ2FsbChmdW5jLCBjYWxsYXJncywga3dkaWN0KSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmVzdWx0ID0gUHlPYmplY3RfQ2FsbChmdW5jLCBjYWxsYXJncywga3dkaWN0KTsKICBjYWxsX2ZhaWw6Ci0JUHlfWERFQ1JFRihjYWxsYXJncyk7Ci0JUHlfWERFQ1JFRihrd2RpY3QpOwotCXJldHVybiByZXN1bHQ7CisgICAgUHlfWERFQ1JFRihjYWxsYXJncyk7CisgICAgUHlfWERFQ1JFRihrd2RpY3QpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBleHRfZG9fY2FsbChQeU9iamVjdCAqZnVuYywgUHlPYmplY3QgKioqcHBfc3RhY2ssIGludCBmbGFncywgaW50IG5hLCBpbnQgbmspCiB7Ci0JaW50IG5zdGFyID0gMDsKLQlQeU9iamVjdCAqY2FsbGFyZ3MgPSBOVUxMOwotCVB5T2JqZWN0ICpzdGFyYXJnID0gTlVMTDsKLQlQeU9iamVjdCAqa3dkaWN0ID0gTlVMTDsKLQlQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKKyAgICBpbnQgbnN0YXIgPSAwOworICAgIFB5T2JqZWN0ICpjYWxsYXJncyA9IE5VTEw7CisgICAgUHlPYmplY3QgKnN0YXJhcmcgPSBOVUxMOworICAgIFB5T2JqZWN0ICprd2RpY3QgPSBOVUxMOworICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOwogCi0JaWYgKGZsYWdzICYgQ0FMTF9GTEFHX0tXKSB7Ci0JCWt3ZGljdCA9IEVYVF9QT1AoKnBwX3N0YWNrKTsKLQkJaWYgKCFQeURpY3RfQ2hlY2soa3dkaWN0KSkgewotCQkJUHlPYmplY3QgKmQ7Ci0JCQlkID0gUHlEaWN0X05ldygpOwotCQkJaWYgKGQgPT0gTlVMTCkKLQkJCQlnb3RvIGV4dF9jYWxsX2ZhaWw7Ci0JCQlpZiAoUHlEaWN0X1VwZGF0ZShkLCBrd2RpY3QpICE9IDApIHsKLQkJCQlQeV9ERUNSRUYoZCk7Ci0JCQkJLyogUHlEaWN0X1VwZGF0ZSByYWlzZXMgYXR0cmlidXRlCi0JCQkJICogZXJyb3IgKHBlcmNvbGF0ZWQgZnJvbSBhbiBhdHRlbXB0Ci0JCQkJICogdG8gZ2V0ICdrZXlzJyBhdHRyaWJ1dGUpIGluc3RlYWQgb2YKLQkJCQkgKiBhIHR5cGUgZXJyb3IgaWYgaXRzIHNlY29uZCBhcmd1bWVudAotCQkJCSAqIGlzIG5vdCBhIG1hcHBpbmcuCi0JCQkJICovCi0JCQkJaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfQXR0cmlidXRlRXJyb3IpKSB7Ci0JCQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkJCQkgICAgICIlLjIwMHMlLjIwMHMgYXJndW1lbnQgYWZ0ZXIgKiogIgotCQkJCQkJICAgICAibXVzdCBiZSBhIG1hcHBpbmcsIG5vdCAlLjIwMHMiLAotCQkJCQkJICAgICBQeUV2YWxfR2V0RnVuY05hbWUoZnVuYyksCi0JCQkJCQkgICAgIFB5RXZhbF9HZXRGdW5jRGVzYyhmdW5jKSwKLQkJCQkJCSAgICAga3dkaWN0LT5vYl90eXBlLT50cF9uYW1lKTsKLQkJCQl9Ci0JCQkJZ290byBleHRfY2FsbF9mYWlsOwotCQkJfQotCQkJUHlfREVDUkVGKGt3ZGljdCk7Ci0JCQlrd2RpY3QgPSBkOwotCQl9Ci0JfQotCWlmIChmbGFncyAmIENBTExfRkxBR19WQVIpIHsKLQkJc3RhcmFyZyA9IEVYVF9QT1AoKnBwX3N0YWNrKTsKLQkJaWYgKCFQeVR1cGxlX0NoZWNrKHN0YXJhcmcpKSB7Ci0JCQlQeU9iamVjdCAqdCA9IE5VTEw7Ci0JCQl0ID0gUHlTZXF1ZW5jZV9UdXBsZShzdGFyYXJnKTsKLQkJCWlmICh0ID09IE5VTEwpIHsKLQkJCQlpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19UeXBlRXJyb3IpKSB7Ci0JCQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkJCQkgICAgICIlLjIwMHMlLjIwMHMgYXJndW1lbnQgYWZ0ZXIgKiAiCi0JCQkJCQkgICAgICJtdXN0IGJlIGEgc2VxdWVuY2UsIG5vdCAlMjAwcyIsCi0JCQkJCQkgICAgIFB5RXZhbF9HZXRGdW5jTmFtZShmdW5jKSwKLQkJCQkJCSAgICAgUHlFdmFsX0dldEZ1bmNEZXNjKGZ1bmMpLAotCQkJCQkJICAgICBzdGFyYXJnLT5vYl90eXBlLT50cF9uYW1lKTsKLQkJCQl9Ci0JCQkJZ290byBleHRfY2FsbF9mYWlsOwotCQkJfQotCQkJUHlfREVDUkVGKHN0YXJhcmcpOwotCQkJc3RhcmFyZyA9IHQ7Ci0JCX0KLQkJbnN0YXIgPSBQeVR1cGxlX0dFVF9TSVpFKHN0YXJhcmcpOwotCX0KLQlpZiAobmsgPiAwKSB7Ci0JCWt3ZGljdCA9IHVwZGF0ZV9rZXl3b3JkX2FyZ3Moa3dkaWN0LCBuaywgcHBfc3RhY2ssIGZ1bmMpOwotCQlpZiAoa3dkaWN0ID09IE5VTEwpCi0JCQlnb3RvIGV4dF9jYWxsX2ZhaWw7Ci0JfQotCWNhbGxhcmdzID0gdXBkYXRlX3N0YXJfYXJncyhuYSwgbnN0YXIsIHN0YXJhcmcsIHBwX3N0YWNrKTsKLQlpZiAoY2FsbGFyZ3MgPT0gTlVMTCkKLQkJZ290byBleHRfY2FsbF9mYWlsOworICAgIGlmIChmbGFncyAmIENBTExfRkxBR19LVykgeworICAgICAgICBrd2RpY3QgPSBFWFRfUE9QKCpwcF9zdGFjayk7CisgICAgICAgIGlmICghUHlEaWN0X0NoZWNrKGt3ZGljdCkpIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpkOworICAgICAgICAgICAgZCA9IFB5RGljdF9OZXcoKTsKKyAgICAgICAgICAgIGlmIChkID09IE5VTEwpCisgICAgICAgICAgICAgICAgZ290byBleHRfY2FsbF9mYWlsOworICAgICAgICAgICAgaWYgKFB5RGljdF9VcGRhdGUoZCwga3dkaWN0KSAhPSAwKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGQpOworICAgICAgICAgICAgICAgIC8qIFB5RGljdF9VcGRhdGUgcmFpc2VzIGF0dHJpYnV0ZQorICAgICAgICAgICAgICAgICAqIGVycm9yIChwZXJjb2xhdGVkIGZyb20gYW4gYXR0ZW1wdAorICAgICAgICAgICAgICAgICAqIHRvIGdldCAna2V5cycgYXR0cmlidXRlKSBpbnN0ZWFkIG9mCisgICAgICAgICAgICAgICAgICogYSB0eXBlIGVycm9yIGlmIGl0cyBzZWNvbmQgYXJndW1lbnQKKyAgICAgICAgICAgICAgICAgKiBpcyBub3QgYSBtYXBwaW5nLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkgeworICAgICAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUuMjAwcyUuMjAwcyBhcmd1bWVudCBhZnRlciAqKiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXVzdCBiZSBhIG1hcHBpbmcsIG5vdCAlLjIwMHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlFdmFsX0dldEZ1bmNOYW1lKGZ1bmMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlFdmFsX0dldEZ1bmNEZXNjKGZ1bmMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3dkaWN0LT5vYl90eXBlLT50cF9uYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZ290byBleHRfY2FsbF9mYWlsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlfREVDUkVGKGt3ZGljdCk7CisgICAgICAgICAgICBrd2RpY3QgPSBkOworICAgICAgICB9CisgICAgfQorICAgIGlmIChmbGFncyAmIENBTExfRkxBR19WQVIpIHsKKyAgICAgICAgc3RhcmFyZyA9IEVYVF9QT1AoKnBwX3N0YWNrKTsKKyAgICAgICAgaWYgKCFQeVR1cGxlX0NoZWNrKHN0YXJhcmcpKSB7CisgICAgICAgICAgICBQeU9iamVjdCAqdCA9IE5VTEw7CisgICAgICAgICAgICB0ID0gUHlTZXF1ZW5jZV9UdXBsZShzdGFyYXJnKTsKKyAgICAgICAgICAgIGlmICh0ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19UeXBlRXJyb3IpKSB7CisgICAgICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJS4yMDBzJS4yMDBzIGFyZ3VtZW50IGFmdGVyICogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm11c3QgYmUgYSBzZXF1ZW5jZSwgbm90ICUyMDBzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXZhbF9HZXRGdW5jTmFtZShmdW5jKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXZhbF9HZXRGdW5jRGVzYyhmdW5jKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJhcmctPm9iX3R5cGUtPnRwX25hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBnb3RvIGV4dF9jYWxsX2ZhaWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQeV9ERUNSRUYoc3RhcmFyZyk7CisgICAgICAgICAgICBzdGFyYXJnID0gdDsKKyAgICAgICAgfQorICAgICAgICBuc3RhciA9IFB5VHVwbGVfR0VUX1NJWkUoc3RhcmFyZyk7CisgICAgfQorICAgIGlmIChuayA+IDApIHsKKyAgICAgICAga3dkaWN0ID0gdXBkYXRlX2tleXdvcmRfYXJncyhrd2RpY3QsIG5rLCBwcF9zdGFjaywgZnVuYyk7CisgICAgICAgIGlmIChrd2RpY3QgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gZXh0X2NhbGxfZmFpbDsKKyAgICB9CisgICAgY2FsbGFyZ3MgPSB1cGRhdGVfc3Rhcl9hcmdzKG5hLCBuc3Rhciwgc3RhcmFyZywgcHBfc3RhY2spOworICAgIGlmIChjYWxsYXJncyA9PSBOVUxMKQorICAgICAgICBnb3RvIGV4dF9jYWxsX2ZhaWw7CiAjaWZkZWYgQ0FMTF9QUk9GSUxFCi0JLyogQXQgdGhpcyBwb2ludCwgd2UgaGF2ZSB0byBsb29rIGF0IHRoZSB0eXBlIG9mIGZ1bmMgdG8KLQkgICB1cGRhdGUgdGhlIGNhbGwgc3RhdHMgcHJvcGVybHkuICBEbyBpdCBoZXJlIHNvIGFzIHRvIGF2b2lkCi0JICAgZXhwb3NpbmcgdGhlIGNhbGwgc3RhdHMgbWFjaGluZXJ5IG91dHNpZGUgY2V2YWwuYwotCSovCi0JaWYgKFB5RnVuY3Rpb25fQ2hlY2soZnVuYykpCi0JCVBDQUxMKFBDQUxMX0ZVTkNUSU9OKTsKLQllbHNlIGlmIChQeU1ldGhvZF9DaGVjayhmdW5jKSkKLQkJUENBTEwoUENBTExfTUVUSE9EKTsKLQllbHNlIGlmIChQeVR5cGVfQ2hlY2soZnVuYykpCi0JCVBDQUxMKFBDQUxMX1RZUEUpOwotCWVsc2UgaWYgKFB5Q0Z1bmN0aW9uX0NoZWNrKGZ1bmMpKQotCQlQQ0FMTChQQ0FMTF9DRlVOQ1RJT04pOwotCWVsc2UKLQkJUENBTEwoUENBTExfT1RIRVIpOworICAgIC8qIEF0IHRoaXMgcG9pbnQsIHdlIGhhdmUgdG8gbG9vayBhdCB0aGUgdHlwZSBvZiBmdW5jIHRvCisgICAgICAgdXBkYXRlIHRoZSBjYWxsIHN0YXRzIHByb3Blcmx5LiAgRG8gaXQgaGVyZSBzbyBhcyB0byBhdm9pZAorICAgICAgIGV4cG9zaW5nIHRoZSBjYWxsIHN0YXRzIG1hY2hpbmVyeSBvdXRzaWRlIGNldmFsLmMKKyAgICAqLworICAgIGlmIChQeUZ1bmN0aW9uX0NoZWNrKGZ1bmMpKQorICAgICAgICBQQ0FMTChQQ0FMTF9GVU5DVElPTik7CisgICAgZWxzZSBpZiAoUHlNZXRob2RfQ2hlY2soZnVuYykpCisgICAgICAgIFBDQUxMKFBDQUxMX01FVEhPRCk7CisgICAgZWxzZSBpZiAoUHlUeXBlX0NoZWNrKGZ1bmMpKQorICAgICAgICBQQ0FMTChQQ0FMTF9UWVBFKTsKKyAgICBlbHNlIGlmIChQeUNGdW5jdGlvbl9DaGVjayhmdW5jKSkKKyAgICAgICAgUENBTEwoUENBTExfQ0ZVTkNUSU9OKTsKKyAgICBlbHNlCisgICAgICAgIFBDQUxMKFBDQUxMX09USEVSKTsKICNlbmRpZgotCWlmIChQeUNGdW5jdGlvbl9DaGVjayhmdW5jKSkgewotCQlQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dFVCgpOwotCQlDX1RSQUNFKHJlc3VsdCwgUHlDRnVuY3Rpb25fQ2FsbChmdW5jLCBjYWxsYXJncywga3dkaWN0KSk7Ci0JfQotCWVsc2UKLQkJcmVzdWx0ID0gUHlPYmplY3RfQ2FsbChmdW5jLCBjYWxsYXJncywga3dkaWN0KTsKKyAgICBpZiAoUHlDRnVuY3Rpb25fQ2hlY2soZnVuYykpIHsKKyAgICAgICAgUHlUaHJlYWRTdGF0ZSAqdHN0YXRlID0gUHlUaHJlYWRTdGF0ZV9HRVQoKTsKKyAgICAgICAgQ19UUkFDRShyZXN1bHQsIFB5Q0Z1bmN0aW9uX0NhbGwoZnVuYywgY2FsbGFyZ3MsIGt3ZGljdCkpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJlc3VsdCA9IFB5T2JqZWN0X0NhbGwoZnVuYywgY2FsbGFyZ3MsIGt3ZGljdCk7CiBleHRfY2FsbF9mYWlsOgotCVB5X1hERUNSRUYoY2FsbGFyZ3MpOwotCVB5X1hERUNSRUYoa3dkaWN0KTsKLQlQeV9YREVDUkVGKHN0YXJhcmcpOwotCXJldHVybiByZXN1bHQ7CisgICAgUHlfWERFQ1JFRihjYWxsYXJncyk7CisgICAgUHlfWERFQ1JFRihrd2RpY3QpOworICAgIFB5X1hERUNSRUYoc3RhcmFyZyk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogLyogRXh0cmFjdCBhIHNsaWNlIGluZGV4IGZyb20gYSBQeUludCBvciBQeUxvbmcgb3IgYW4gb2JqZWN0IHdpdGggdGhlCkBAIC00MDgxLDkzICs0MDgxLDkzIEBACiBpbnQKIF9QeUV2YWxfU2xpY2VJbmRleChQeU9iamVjdCAqdiwgUHlfc3NpemVfdCAqcGkpCiB7Ci0JaWYgKHYgIT0gTlVMTCkgewotCQlQeV9zc2l6ZV90IHg7Ci0JCWlmIChQeUludF9DaGVjayh2KSkgewotCQkJLyogWFhYKG5ub3J3aXR6KTogSSB0aGluayBQeUludF9BU19MT05HIGlzIGNvcnJlY3QsCi0JCQkgICBob3dldmVyLCBpdCBsb29rcyBsaWtlIGl0IHNob3VsZCBiZSBBc1NzaXplX3QuCi0JCQkgICBUaGVyZSBzaG91bGQgYmUgYSBjb21tZW50IGhlcmUgZXhwbGFpbmluZyB3aHkuCi0JCQkqLwotCQkJeCA9IFB5SW50X0FTX0xPTkcodik7Ci0JCX0KLQkJZWxzZSBpZiAoUHlJbmRleF9DaGVjayh2KSkgewotCQkJeCA9IFB5TnVtYmVyX0FzU3NpemVfdCh2LCBOVUxMKTsKLQkJCWlmICh4ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCQkJcmV0dXJuIDA7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCQkic2xpY2UgaW5kaWNlcyBtdXN0IGJlIGludGVnZXJzIG9yICIKLQkJCQkJIk5vbmUgb3IgaGF2ZSBhbiBfX2luZGV4X18gbWV0aG9kIik7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQkqcGkgPSB4OwotCX0KLQlyZXR1cm4gMTsKKyAgICBpZiAodiAhPSBOVUxMKSB7CisgICAgICAgIFB5X3NzaXplX3QgeDsKKyAgICAgICAgaWYgKFB5SW50X0NoZWNrKHYpKSB7CisgICAgICAgICAgICAvKiBYWFgobm5vcndpdHopOiBJIHRoaW5rIFB5SW50X0FTX0xPTkcgaXMgY29ycmVjdCwKKyAgICAgICAgICAgICAgIGhvd2V2ZXIsIGl0IGxvb2tzIGxpa2UgaXQgc2hvdWxkIGJlIEFzU3NpemVfdC4KKyAgICAgICAgICAgICAgIFRoZXJlIHNob3VsZCBiZSBhIGNvbW1lbnQgaGVyZSBleHBsYWluaW5nIHdoeS4KKyAgICAgICAgICAgICovCisgICAgICAgICAgICB4ID0gUHlJbnRfQVNfTE9ORyh2KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChQeUluZGV4X0NoZWNrKHYpKSB7CisgICAgICAgICAgICB4ID0gUHlOdW1iZXJfQXNTc2l6ZV90KHYsIE5VTEwpOworICAgICAgICAgICAgaWYgKHggPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNsaWNlIGluZGljZXMgbXVzdCBiZSBpbnRlZ2VycyBvciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vbmUgb3IgaGF2ZSBhbiBfX2luZGV4X18gbWV0aG9kIik7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICAqcGkgPSB4OworICAgIH0KKyAgICByZXR1cm4gMTsKIH0KIAogI3VuZGVmIElTSU5ERVgKICNkZWZpbmUgSVNJTkRFWCh4KSAoKHgpID09IE5VTEwgfHwgXAotCQkgICAgUHlJbnRfQ2hlY2soeCkgfHwgUHlMb25nX0NoZWNrKHgpIHx8IFB5SW5kZXhfQ2hlY2soeCkpCisgICAgICAgICAgICAgICAgICAgIFB5SW50X0NoZWNrKHgpIHx8IFB5TG9uZ19DaGVjayh4KSB8fCBQeUluZGV4X0NoZWNrKHgpKQogCiBzdGF0aWMgUHlPYmplY3QgKgogYXBwbHlfc2xpY2UoUHlPYmplY3QgKnUsIFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdykgLyogcmV0dXJuIHVbdjp3XSAqLwogewotCVB5VHlwZU9iamVjdCAqdHAgPSB1LT5vYl90eXBlOwotCVB5U2VxdWVuY2VNZXRob2RzICpzcSA9IHRwLT50cF9hc19zZXF1ZW5jZTsKKyAgICBQeVR5cGVPYmplY3QgKnRwID0gdS0+b2JfdHlwZTsKKyAgICBQeVNlcXVlbmNlTWV0aG9kcyAqc3EgPSB0cC0+dHBfYXNfc2VxdWVuY2U7CiAKLQlpZiAoc3EgJiYgc3EtPnNxX3NsaWNlICYmIElTSU5ERVgodikgJiYgSVNJTkRFWCh3KSkgewotCQlQeV9zc2l6ZV90IGlsb3cgPSAwLCBpaGlnaCA9IFBZX1NTSVpFX1RfTUFYOwotCQlpZiAoIV9QeUV2YWxfU2xpY2VJbmRleCh2LCAmaWxvdykpCi0JCQlyZXR1cm4gTlVMTDsKLQkJaWYgKCFfUHlFdmFsX1NsaWNlSW5kZXgodywgJmloaWdoKSkKLQkJCXJldHVybiBOVUxMOwotCQlyZXR1cm4gUHlTZXF1ZW5jZV9HZXRTbGljZSh1LCBpbG93LCBpaGlnaCk7Ci0JfQotCWVsc2UgewotCQlQeU9iamVjdCAqc2xpY2UgPSBQeVNsaWNlX05ldyh2LCB3LCBOVUxMKTsKLQkJaWYgKHNsaWNlICE9IE5VTEwpIHsKLQkJCVB5T2JqZWN0ICpyZXMgPSBQeU9iamVjdF9HZXRJdGVtKHUsIHNsaWNlKTsKLQkJCVB5X0RFQ1JFRihzbGljZSk7Ci0JCQlyZXR1cm4gcmVzOwotCQl9Ci0JCWVsc2UKLQkJCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoc3EgJiYgc3EtPnNxX3NsaWNlICYmIElTSU5ERVgodikgJiYgSVNJTkRFWCh3KSkgeworICAgICAgICBQeV9zc2l6ZV90IGlsb3cgPSAwLCBpaGlnaCA9IFBZX1NTSVpFX1RfTUFYOworICAgICAgICBpZiAoIV9QeUV2YWxfU2xpY2VJbmRleCh2LCAmaWxvdykpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKCFfUHlFdmFsX1NsaWNlSW5kZXgodywgJmloaWdoKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gUHlTZXF1ZW5jZV9HZXRTbGljZSh1LCBpbG93LCBpaGlnaCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeU9iamVjdCAqc2xpY2UgPSBQeVNsaWNlX05ldyh2LCB3LCBOVUxMKTsKKyAgICAgICAgaWYgKHNsaWNlICE9IE5VTEwpIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpyZXMgPSBQeU9iamVjdF9HZXRJdGVtKHUsIHNsaWNlKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihzbGljZSk7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIH0KIAogc3RhdGljIGludAogYXNzaWduX3NsaWNlKFB5T2JqZWN0ICp1LCBQeU9iamVjdCAqdiwgUHlPYmplY3QgKncsIFB5T2JqZWN0ICp4KQotCS8qIHVbdjp3XSA9IHggKi8KKyAgICAvKiB1W3Y6d10gPSB4ICovCiB7Ci0JUHlUeXBlT2JqZWN0ICp0cCA9IHUtPm9iX3R5cGU7Ci0JUHlTZXF1ZW5jZU1ldGhvZHMgKnNxID0gdHAtPnRwX2FzX3NlcXVlbmNlOworICAgIFB5VHlwZU9iamVjdCAqdHAgPSB1LT5vYl90eXBlOworICAgIFB5U2VxdWVuY2VNZXRob2RzICpzcSA9IHRwLT50cF9hc19zZXF1ZW5jZTsKIAotCWlmIChzcSAmJiBzcS0+c3FfYXNzX3NsaWNlICYmIElTSU5ERVgodikgJiYgSVNJTkRFWCh3KSkgewotCQlQeV9zc2l6ZV90IGlsb3cgPSAwLCBpaGlnaCA9IFBZX1NTSVpFX1RfTUFYOwotCQlpZiAoIV9QeUV2YWxfU2xpY2VJbmRleCh2LCAmaWxvdykpCi0JCQlyZXR1cm4gLTE7Ci0JCWlmICghX1B5RXZhbF9TbGljZUluZGV4KHcsICZpaGlnaCkpCi0JCQlyZXR1cm4gLTE7Ci0JCWlmICh4ID09IE5VTEwpCi0JCQlyZXR1cm4gUHlTZXF1ZW5jZV9EZWxTbGljZSh1LCBpbG93LCBpaGlnaCk7Ci0JCWVsc2UKLQkJCXJldHVybiBQeVNlcXVlbmNlX1NldFNsaWNlKHUsIGlsb3csIGloaWdoLCB4KTsKLQl9Ci0JZWxzZSB7Ci0JCVB5T2JqZWN0ICpzbGljZSA9IFB5U2xpY2VfTmV3KHYsIHcsIE5VTEwpOwotCQlpZiAoc2xpY2UgIT0gTlVMTCkgewotCQkJaW50IHJlczsKLQkJCWlmICh4ICE9IE5VTEwpCi0JCQkJcmVzID0gUHlPYmplY3RfU2V0SXRlbSh1LCBzbGljZSwgeCk7Ci0JCQllbHNlCi0JCQkJcmVzID0gUHlPYmplY3RfRGVsSXRlbSh1LCBzbGljZSk7Ci0JCQlQeV9ERUNSRUYoc2xpY2UpOwotCQkJcmV0dXJuIHJlczsKLQkJfQotCQllbHNlCi0JCQlyZXR1cm4gLTE7Ci0JfQorICAgIGlmIChzcSAmJiBzcS0+c3FfYXNzX3NsaWNlICYmIElTSU5ERVgodikgJiYgSVNJTkRFWCh3KSkgeworICAgICAgICBQeV9zc2l6ZV90IGlsb3cgPSAwLCBpaGlnaCA9IFBZX1NTSVpFX1RfTUFYOworICAgICAgICBpZiAoIV9QeUV2YWxfU2xpY2VJbmRleCh2LCAmaWxvdykpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmICghX1B5RXZhbF9TbGljZUluZGV4KHcsICZpaGlnaCkpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmICh4ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gUHlTZXF1ZW5jZV9EZWxTbGljZSh1LCBpbG93LCBpaGlnaCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBQeVNlcXVlbmNlX1NldFNsaWNlKHUsIGlsb3csIGloaWdoLCB4KTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5T2JqZWN0ICpzbGljZSA9IFB5U2xpY2VfTmV3KHYsIHcsIE5VTEwpOworICAgICAgICBpZiAoc2xpY2UgIT0gTlVMTCkgeworICAgICAgICAgICAgaW50IHJlczsKKyAgICAgICAgICAgIGlmICh4ICE9IE5VTEwpCisgICAgICAgICAgICAgICAgcmVzID0gUHlPYmplY3RfU2V0SXRlbSh1LCBzbGljZSwgeCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmVzID0gUHlPYmplY3RfRGVsSXRlbSh1LCBzbGljZSk7CisgICAgICAgICAgICBQeV9ERUNSRUYoc2xpY2UpOworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQogfQogCiAjZGVmaW5lIFB5M2tFeGNlcHRpb25DbGFzc19DaGVjayh4KSAgICAgXApAQCAtNDE3NSw0MTQgKzQxNzUsNDE0IEBACiAgICAgIFB5VHlwZV9GYXN0U3ViY2xhc3MoKFB5VHlwZU9iamVjdCopKHgpLCBQeV9UUEZMQUdTX0JBU0VfRVhDX1NVQkNMQVNTKSkKIAogI2RlZmluZSBDQU5OT1RfQ0FUQ0hfTVNHICJjYXRjaGluZyBjbGFzc2VzIHRoYXQgZG9uJ3QgaW5oZXJpdCBmcm9tICIgXAotCQkJICJCYXNlRXhjZXB0aW9uIGlzIG5vdCBhbGxvd2VkIGluIDMueCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiQmFzZUV4Y2VwdGlvbiBpcyBub3QgYWxsb3dlZCBpbiAzLngiCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjbXBfb3V0Y29tZShpbnQgb3AsIHJlZ2lzdGVyIFB5T2JqZWN0ICp2LCByZWdpc3RlciBQeU9iamVjdCAqdykKIHsKLQlpbnQgcmVzID0gMDsKLQlzd2l0Y2ggKG9wKSB7Ci0JY2FzZSBQeUNtcF9JUzoKLQkJcmVzID0gKHYgPT0gdyk7Ci0JCWJyZWFrOwotCWNhc2UgUHlDbXBfSVNfTk9UOgotCQlyZXMgPSAodiAhPSB3KTsKLQkJYnJlYWs7Ci0JY2FzZSBQeUNtcF9JTjoKLQkJcmVzID0gUHlTZXF1ZW5jZV9Db250YWlucyh3LCB2KTsKLQkJaWYgKHJlcyA8IDApCi0JCQlyZXR1cm4gTlVMTDsKLQkJYnJlYWs7Ci0JY2FzZSBQeUNtcF9OT1RfSU46Ci0JCXJlcyA9IFB5U2VxdWVuY2VfQ29udGFpbnModywgdik7Ci0JCWlmIChyZXMgPCAwKQotCQkJcmV0dXJuIE5VTEw7Ci0JCXJlcyA9ICFyZXM7Ci0JCWJyZWFrOwotCWNhc2UgUHlDbXBfRVhDX01BVENIOgotCQlpZiAoUHlUdXBsZV9DaGVjayh3KSkgewotCQkJUHlfc3NpemVfdCBpLCBsZW5ndGg7Ci0JCQlsZW5ndGggPSBQeVR1cGxlX1NpemUodyk7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHsKLQkJCQlQeU9iamVjdCAqZXhjID0gUHlUdXBsZV9HRVRfSVRFTSh3LCBpKTsKLQkJCQlpZiAoUHlTdHJpbmdfQ2hlY2soZXhjKSkgewotCQkJCQlpbnQgcmV0X3ZhbDsKLQkJCQkJcmV0X3ZhbCA9IFB5RXJyX1dhcm5FeCgKLQkJCQkJCVB5RXhjX0RlcHJlY2F0aW9uV2FybmluZywKLQkJCQkJCSJjYXRjaGluZyBvZiBzdHJpbmcgIgotCQkJCQkJImV4Y2VwdGlvbnMgaXMgZGVwcmVjYXRlZCIsIDEpOwotCQkJCQlpZiAocmV0X3ZhbCA8IDApCi0JCQkJCQlyZXR1cm4gTlVMTDsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoUHlfUHkza1dhcm5pbmdGbGFnICAmJgotCQkJCQkgIVB5VHVwbGVfQ2hlY2soZXhjKSAmJgotCQkJCQkgIVB5M2tFeGNlcHRpb25DbGFzc19DaGVjayhleGMpKQotCQkJCXsKLQkJCQkJaW50IHJldF92YWw7Ci0JCQkJCXJldF92YWwgPSBQeUVycl9XYXJuRXgoCi0JCQkJCQlQeUV4Y19EZXByZWNhdGlvbldhcm5pbmcsCi0JCQkJCQlDQU5OT1RfQ0FUQ0hfTVNHLCAxKTsKLQkJCQkJaWYgKHJldF92YWwgPCAwKQotCQkJCQkJcmV0dXJuIE5VTEw7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJaWYgKFB5U3RyaW5nX0NoZWNrKHcpKSB7Ci0JCQkJaW50IHJldF92YWw7Ci0JCQkJcmV0X3ZhbCA9IFB5RXJyX1dhcm5FeCgKLQkJCQkJCVB5RXhjX0RlcHJlY2F0aW9uV2FybmluZywKLQkJCQkJCSJjYXRjaGluZyBvZiBzdHJpbmcgIgotCQkJCQkJImV4Y2VwdGlvbnMgaXMgZGVwcmVjYXRlZCIsIDEpOwotCQkJCWlmIChyZXRfdmFsIDwgMCkKLQkJCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCQllbHNlIGlmIChQeV9QeTNrV2FybmluZ0ZsYWcgICYmCi0JCQkJICFQeVR1cGxlX0NoZWNrKHcpICYmCi0JCQkJICFQeTNrRXhjZXB0aW9uQ2xhc3NfQ2hlY2sodykpCi0JCQl7Ci0JCQkJaW50IHJldF92YWw7Ci0JCQkJcmV0X3ZhbCA9IFB5RXJyX1dhcm5FeCgKLQkJCQkJUHlFeGNfRGVwcmVjYXRpb25XYXJuaW5nLAotCQkJCQlDQU5OT1RfQ0FUQ0hfTVNHLCAxKTsKLQkJCQlpZiAocmV0X3ZhbCA8IDApCi0JCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQl9Ci0JCXJlcyA9IFB5RXJyX0dpdmVuRXhjZXB0aW9uTWF0Y2hlcyh2LCB3KTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIFB5T2JqZWN0X1JpY2hDb21wYXJlKHYsIHcsIG9wKTsKLQl9Ci0JdiA9IHJlcyA/IFB5X1RydWUgOiBQeV9GYWxzZTsKLQlQeV9JTkNSRUYodik7Ci0JcmV0dXJuIHY7CisgICAgaW50IHJlcyA9IDA7CisgICAgc3dpdGNoIChvcCkgeworICAgIGNhc2UgUHlDbXBfSVM6CisgICAgICAgIHJlcyA9ICh2ID09IHcpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFB5Q21wX0lTX05PVDoKKyAgICAgICAgcmVzID0gKHYgIT0gdyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUHlDbXBfSU46CisgICAgICAgIHJlcyA9IFB5U2VxdWVuY2VfQ29udGFpbnModywgdik7CisgICAgICAgIGlmIChyZXMgPCAwKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUHlDbXBfTk9UX0lOOgorICAgICAgICByZXMgPSBQeVNlcXVlbmNlX0NvbnRhaW5zKHcsIHYpOworICAgICAgICBpZiAocmVzIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICByZXMgPSAhcmVzOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFB5Q21wX0VYQ19NQVRDSDoKKyAgICAgICAgaWYgKFB5VHVwbGVfQ2hlY2sodykpIHsKKyAgICAgICAgICAgIFB5X3NzaXplX3QgaSwgbGVuZ3RoOworICAgICAgICAgICAgbGVuZ3RoID0gUHlUdXBsZV9TaXplKHcpOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7CisgICAgICAgICAgICAgICAgUHlPYmplY3QgKmV4YyA9IFB5VHVwbGVfR0VUX0lURU0odywgaSk7CisgICAgICAgICAgICAgICAgaWYgKFB5U3RyaW5nX0NoZWNrKGV4YykpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHJldF92YWw7CisgICAgICAgICAgICAgICAgICAgIHJldF92YWwgPSBQeUVycl9XYXJuRXgoCisgICAgICAgICAgICAgICAgICAgICAgICBQeUV4Y19EZXByZWNhdGlvbldhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAiY2F0Y2hpbmcgb2Ygc3RyaW5nICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJleGNlcHRpb25zIGlzIGRlcHJlY2F0ZWQiLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJldF92YWwgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKFB5X1B5M2tXYXJuaW5nRmxhZyAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAhUHlUdXBsZV9DaGVjayhleGMpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgIVB5M2tFeGNlcHRpb25DbGFzc19DaGVjayhleGMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHJldF92YWw7CisgICAgICAgICAgICAgICAgICAgIHJldF92YWwgPSBQeUVycl9XYXJuRXgoCisgICAgICAgICAgICAgICAgICAgICAgICBQeUV4Y19EZXByZWNhdGlvbldhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICBDQU5OT1RfQ0FUQ0hfTVNHLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJldF92YWwgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKFB5U3RyaW5nX0NoZWNrKHcpKSB7CisgICAgICAgICAgICAgICAgaW50IHJldF92YWw7CisgICAgICAgICAgICAgICAgcmV0X3ZhbCA9IFB5RXJyX1dhcm5FeCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlFeGNfRGVwcmVjYXRpb25XYXJuaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2F0Y2hpbmcgb2Ygc3RyaW5nICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4Y2VwdGlvbnMgaXMgZGVwcmVjYXRlZCIsIDEpOworICAgICAgICAgICAgICAgIGlmIChyZXRfdmFsIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChQeV9QeTNrV2FybmluZ0ZsYWcgICYmCisgICAgICAgICAgICAgICAgICAgICAhUHlUdXBsZV9DaGVjayh3KSAmJgorICAgICAgICAgICAgICAgICAgICAgIVB5M2tFeGNlcHRpb25DbGFzc19DaGVjayh3KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgcmV0X3ZhbDsKKyAgICAgICAgICAgICAgICByZXRfdmFsID0gUHlFcnJfV2FybkV4KAorICAgICAgICAgICAgICAgICAgICBQeUV4Y19EZXByZWNhdGlvbldhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgIENBTk5PVF9DQVRDSF9NU0csIDEpOworICAgICAgICAgICAgICAgIGlmIChyZXRfdmFsIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmVzID0gUHlFcnJfR2l2ZW5FeGNlcHRpb25NYXRjaGVzKHYsIHcpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gUHlPYmplY3RfUmljaENvbXBhcmUodiwgdywgb3ApOworICAgIH0KKyAgICB2ID0gcmVzID8gUHlfVHJ1ZSA6IFB5X0ZhbHNlOworICAgIFB5X0lOQ1JFRih2KTsKKyAgICByZXR1cm4gdjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGltcG9ydF9mcm9tKFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqbmFtZSkKIHsKLQlQeU9iamVjdCAqeDsKKyAgICBQeU9iamVjdCAqeDsKIAotCXggPSBQeU9iamVjdF9HZXRBdHRyKHYsIG5hbWUpOwotCWlmICh4ID09IE5VTEwgJiYgUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19BdHRyaWJ1dGVFcnJvcikpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX0ltcG9ydEVycm9yLAotCQkJICAgICAiY2Fubm90IGltcG9ydCBuYW1lICUuMjMwcyIsCi0JCQkgICAgIFB5U3RyaW5nX0FzU3RyaW5nKG5hbWUpKTsKLQl9Ci0JcmV0dXJuIHg7CisgICAgeCA9IFB5T2JqZWN0X0dldEF0dHIodiwgbmFtZSk7CisgICAgaWYgKHggPT0gTlVMTCAmJiBQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfSW1wb3J0RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiY2Fubm90IGltcG9ydCBuYW1lICUuMjMwcyIsCisgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19Bc1N0cmluZyhuYW1lKSk7CisgICAgfQorICAgIHJldHVybiB4OwogfQogCiBzdGF0aWMgaW50CiBpbXBvcnRfYWxsX2Zyb20oUHlPYmplY3QgKmxvY2FscywgUHlPYmplY3QgKnYpCiB7Ci0JUHlPYmplY3QgKmFsbCA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcodiwgIl9fYWxsX18iKTsKLQlQeU9iamVjdCAqZGljdCwgKm5hbWUsICp2YWx1ZTsKLQlpbnQgc2tpcF9sZWFkaW5nX3VuZGVyc2NvcmVzID0gMDsKLQlpbnQgcG9zLCBlcnI7CisgICAgUHlPYmplY3QgKmFsbCA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcodiwgIl9fYWxsX18iKTsKKyAgICBQeU9iamVjdCAqZGljdCwgKm5hbWUsICp2YWx1ZTsKKyAgICBpbnQgc2tpcF9sZWFkaW5nX3VuZGVyc2NvcmVzID0gMDsKKyAgICBpbnQgcG9zLCBlcnI7CiAKLQlpZiAoYWxsID09IE5VTEwpIHsKLQkJaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkKLQkJCXJldHVybiAtMTsgLyogVW5leHBlY3RlZCBlcnJvciAqLwotCQlQeUVycl9DbGVhcigpOwotCQlkaWN0ID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyh2LCAiX19kaWN0X18iKTsKLQkJaWYgKGRpY3QgPT0gTlVMTCkgewotCQkJaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkKLQkJCQlyZXR1cm4gLTE7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW1wb3J0RXJyb3IsCi0JCQkiZnJvbS1pbXBvcnQtKiBvYmplY3QgaGFzIG5vIF9fZGljdF9fIGFuZCBubyBfX2FsbF9fIik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJYWxsID0gUHlNYXBwaW5nX0tleXMoZGljdCk7Ci0JCVB5X0RFQ1JFRihkaWN0KTsKLQkJaWYgKGFsbCA9PSBOVUxMKQotCQkJcmV0dXJuIC0xOwotCQlza2lwX2xlYWRpbmdfdW5kZXJzY29yZXMgPSAxOwotCX0KKyAgICBpZiAoYWxsID09IE5VTEwpIHsKKyAgICAgICAgaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkKKyAgICAgICAgICAgIHJldHVybiAtMTsgLyogVW5leHBlY3RlZCBlcnJvciAqLworICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBkaWN0ID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyh2LCAiX19kaWN0X18iKTsKKyAgICAgICAgaWYgKGRpY3QgPT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW1wb3J0RXJyb3IsCisgICAgICAgICAgICAiZnJvbS1pbXBvcnQtKiBvYmplY3QgaGFzIG5vIF9fZGljdF9fIGFuZCBubyBfX2FsbF9fIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgYWxsID0gUHlNYXBwaW5nX0tleXMoZGljdCk7CisgICAgICAgIFB5X0RFQ1JFRihkaWN0KTsKKyAgICAgICAgaWYgKGFsbCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBza2lwX2xlYWRpbmdfdW5kZXJzY29yZXMgPSAxOworICAgIH0KIAotCWZvciAocG9zID0gMCwgZXJyID0gMDsgOyBwb3MrKykgewotCQluYW1lID0gUHlTZXF1ZW5jZV9HZXRJdGVtKGFsbCwgcG9zKTsKLQkJaWYgKG5hbWUgPT0gTlVMTCkgewotCQkJaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0luZGV4RXJyb3IpKQotCQkJCWVyciA9IC0xOwotCQkJZWxzZQotCQkJCVB5RXJyX0NsZWFyKCk7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoc2tpcF9sZWFkaW5nX3VuZGVyc2NvcmVzICYmCi0JCSAgICBQeVN0cmluZ19DaGVjayhuYW1lKSAmJgotCQkgICAgUHlTdHJpbmdfQVNfU1RSSU5HKG5hbWUpWzBdID09ICdfJykKLQkJewotCQkJUHlfREVDUkVGKG5hbWUpOwotCQkJY29udGludWU7Ci0JCX0KLQkJdmFsdWUgPSBQeU9iamVjdF9HZXRBdHRyKHYsIG5hbWUpOwotCQlpZiAodmFsdWUgPT0gTlVMTCkKLQkJCWVyciA9IC0xOwotCQllbHNlIGlmIChQeURpY3RfQ2hlY2tFeGFjdChsb2NhbHMpKQotCQkJZXJyID0gUHlEaWN0X1NldEl0ZW0obG9jYWxzLCBuYW1lLCB2YWx1ZSk7Ci0JCWVsc2UKLQkJCWVyciA9IFB5T2JqZWN0X1NldEl0ZW0obG9jYWxzLCBuYW1lLCB2YWx1ZSk7Ci0JCVB5X0RFQ1JFRihuYW1lKTsKLQkJUHlfWERFQ1JFRih2YWx1ZSk7Ci0JCWlmIChlcnIgIT0gMCkKLQkJCWJyZWFrOwotCX0KLQlQeV9ERUNSRUYoYWxsKTsKLQlyZXR1cm4gZXJyOworICAgIGZvciAocG9zID0gMCwgZXJyID0gMDsgOyBwb3MrKykgeworICAgICAgICBuYW1lID0gUHlTZXF1ZW5jZV9HZXRJdGVtKGFsbCwgcG9zKTsKKyAgICAgICAgaWYgKG5hbWUgPT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0luZGV4RXJyb3IpKQorICAgICAgICAgICAgICAgIGVyciA9IC0xOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2tpcF9sZWFkaW5nX3VuZGVyc2NvcmVzICYmCisgICAgICAgICAgICBQeVN0cmluZ19DaGVjayhuYW1lKSAmJgorICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKG5hbWUpWzBdID09ICdfJykKKyAgICAgICAgeworICAgICAgICAgICAgUHlfREVDUkVGKG5hbWUpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgdmFsdWUgPSBQeU9iamVjdF9HZXRBdHRyKHYsIG5hbWUpOworICAgICAgICBpZiAodmFsdWUgPT0gTlVMTCkKKyAgICAgICAgICAgIGVyciA9IC0xOworICAgICAgICBlbHNlIGlmIChQeURpY3RfQ2hlY2tFeGFjdChsb2NhbHMpKQorICAgICAgICAgICAgZXJyID0gUHlEaWN0X1NldEl0ZW0obG9jYWxzLCBuYW1lLCB2YWx1ZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVyciA9IFB5T2JqZWN0X1NldEl0ZW0obG9jYWxzLCBuYW1lLCB2YWx1ZSk7CisgICAgICAgIFB5X0RFQ1JFRihuYW1lKTsKKyAgICAgICAgUHlfWERFQ1JFRih2YWx1ZSk7CisgICAgICAgIGlmIChlcnIgIT0gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBQeV9ERUNSRUYoYWxsKTsKKyAgICByZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYnVpbGRfY2xhc3MoUHlPYmplY3QgKm1ldGhvZHMsIFB5T2JqZWN0ICpiYXNlcywgUHlPYmplY3QgKm5hbWUpCiB7Ci0JUHlPYmplY3QgKm1ldGFjbGFzcyA9IE5VTEwsICpyZXN1bHQsICpiYXNlOworICAgIFB5T2JqZWN0ICptZXRhY2xhc3MgPSBOVUxMLCAqcmVzdWx0LCAqYmFzZTsKIAotCWlmIChQeURpY3RfQ2hlY2sobWV0aG9kcykpCi0JCW1ldGFjbGFzcyA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKG1ldGhvZHMsICJfX21ldGFjbGFzc19fIik7Ci0JaWYgKG1ldGFjbGFzcyAhPSBOVUxMKQotCQlQeV9JTkNSRUYobWV0YWNsYXNzKTsKLQllbHNlIGlmIChQeVR1cGxlX0NoZWNrKGJhc2VzKSAmJiBQeVR1cGxlX0dFVF9TSVpFKGJhc2VzKSA+IDApIHsKLQkJYmFzZSA9IFB5VHVwbGVfR0VUX0lURU0oYmFzZXMsIDApOwotCQltZXRhY2xhc3MgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKGJhc2UsICJfX2NsYXNzX18iKTsKLQkJaWYgKG1ldGFjbGFzcyA9PSBOVUxMKSB7Ci0JCQlQeUVycl9DbGVhcigpOwotCQkJbWV0YWNsYXNzID0gKFB5T2JqZWN0ICopYmFzZS0+b2JfdHlwZTsKLQkJCVB5X0lOQ1JFRihtZXRhY2xhc3MpOwotCQl9Ci0JfQotCWVsc2UgewotCQlQeU9iamVjdCAqZyA9IFB5RXZhbF9HZXRHbG9iYWxzKCk7Ci0JCWlmIChnICE9IE5VTEwgJiYgUHlEaWN0X0NoZWNrKGcpKQotCQkJbWV0YWNsYXNzID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoZywgIl9fbWV0YWNsYXNzX18iKTsKLQkJaWYgKG1ldGFjbGFzcyA9PSBOVUxMKQotCQkJbWV0YWNsYXNzID0gKFB5T2JqZWN0ICopICZQeUNsYXNzX1R5cGU7Ci0JCVB5X0lOQ1JFRihtZXRhY2xhc3MpOwotCX0KLQlyZXN1bHQgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKG1ldGFjbGFzcywgbmFtZSwgYmFzZXMsIG1ldGhvZHMsCi0JCQkJCSAgICAgIE5VTEwpOwotCVB5X0RFQ1JFRihtZXRhY2xhc3MpOwotCWlmIChyZXN1bHQgPT0gTlVMTCAmJiBQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1R5cGVFcnJvcikpIHsKLQkJLyogQSB0eXBlIGVycm9yIGhlcmUgbGlrZWx5IG1lYW5zIHRoYXQgdGhlIHVzZXIgcGFzc2VkCi0JCSAgIGluIGEgYmFzZSB0aGF0IHdhcyBub3QgYSBjbGFzcyAoc3VjaCB0aGUgcmFuZG9tIG1vZHVsZQotCQkgICBpbnN0ZWFkIG9mIHRoZSByYW5kb20ucmFuZG9tIHR5cGUpLiAgSGVscCB0aGVtIG91dCB3aXRoCi0JCSAgIGJ5IGF1Z21lbnRpbmcgdGhlIGVycm9yIG1lc3NhZ2Ugd2l0aCBtb3JlIGluZm9ybWF0aW9uLiovCisgICAgaWYgKFB5RGljdF9DaGVjayhtZXRob2RzKSkKKyAgICAgICAgbWV0YWNsYXNzID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcobWV0aG9kcywgIl9fbWV0YWNsYXNzX18iKTsKKyAgICBpZiAobWV0YWNsYXNzICE9IE5VTEwpCisgICAgICAgIFB5X0lOQ1JFRihtZXRhY2xhc3MpOworICAgIGVsc2UgaWYgKFB5VHVwbGVfQ2hlY2soYmFzZXMpICYmIFB5VHVwbGVfR0VUX1NJWkUoYmFzZXMpID4gMCkgeworICAgICAgICBiYXNlID0gUHlUdXBsZV9HRVRfSVRFTShiYXNlcywgMCk7CisgICAgICAgIG1ldGFjbGFzcyA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoYmFzZSwgIl9fY2xhc3NfXyIpOworICAgICAgICBpZiAobWV0YWNsYXNzID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICBtZXRhY2xhc3MgPSAoUHlPYmplY3QgKiliYXNlLT5vYl90eXBlOworICAgICAgICAgICAgUHlfSU5DUkVGKG1ldGFjbGFzcyk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5T2JqZWN0ICpnID0gUHlFdmFsX0dldEdsb2JhbHMoKTsKKyAgICAgICAgaWYgKGcgIT0gTlVMTCAmJiBQeURpY3RfQ2hlY2soZykpCisgICAgICAgICAgICBtZXRhY2xhc3MgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhnLCAiX19tZXRhY2xhc3NfXyIpOworICAgICAgICBpZiAobWV0YWNsYXNzID09IE5VTEwpCisgICAgICAgICAgICBtZXRhY2xhc3MgPSAoUHlPYmplY3QgKikgJlB5Q2xhc3NfVHlwZTsKKyAgICAgICAgUHlfSU5DUkVGKG1ldGFjbGFzcyk7CisgICAgfQorICAgIHJlc3VsdCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MobWV0YWNsYXNzLCBuYW1lLCBiYXNlcywgbWV0aG9kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgIFB5X0RFQ1JFRihtZXRhY2xhc3MpOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCAmJiBQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1R5cGVFcnJvcikpIHsKKyAgICAgICAgLyogQSB0eXBlIGVycm9yIGhlcmUgbGlrZWx5IG1lYW5zIHRoYXQgdGhlIHVzZXIgcGFzc2VkCisgICAgICAgICAgIGluIGEgYmFzZSB0aGF0IHdhcyBub3QgYSBjbGFzcyAoc3VjaCB0aGUgcmFuZG9tIG1vZHVsZQorICAgICAgICAgICBpbnN0ZWFkIG9mIHRoZSByYW5kb20ucmFuZG9tIHR5cGUpLiAgSGVscCB0aGVtIG91dCB3aXRoCisgICAgICAgICAgIGJ5IGF1Z21lbnRpbmcgdGhlIGVycm9yIG1lc3NhZ2Ugd2l0aCBtb3JlIGluZm9ybWF0aW9uLiovCiAKLQkJUHlPYmplY3QgKnB0eXBlLCAqcHZhbHVlLCAqcHRyYWNlYmFjazsKKyAgICAgICAgUHlPYmplY3QgKnB0eXBlLCAqcHZhbHVlLCAqcHRyYWNlYmFjazsKIAotCQlQeUVycl9GZXRjaCgmcHR5cGUsICZwdmFsdWUsICZwdHJhY2ViYWNrKTsKLQkJaWYgKFB5U3RyaW5nX0NoZWNrKHB2YWx1ZSkpIHsKLQkJCVB5T2JqZWN0ICpuZXdtc2c7Ci0JCQluZXdtc2cgPSBQeVN0cmluZ19Gcm9tRm9ybWF0KAotCQkJCSJFcnJvciB3aGVuIGNhbGxpbmcgdGhlIG1ldGFjbGFzcyBiYXNlc1xuIgotCQkJCSIgICAgJXMiLAotCQkJCVB5U3RyaW5nX0FTX1NUUklORyhwdmFsdWUpKTsKLQkJCWlmIChuZXdtc2cgIT0gTlVMTCkgewotCQkJCVB5X0RFQ1JFRihwdmFsdWUpOwotCQkJCXB2YWx1ZSA9IG5ld21zZzsKLQkJCX0KLQkJfQotCQlQeUVycl9SZXN0b3JlKHB0eXBlLCBwdmFsdWUsIHB0cmFjZWJhY2spOwotCX0KLQlyZXR1cm4gcmVzdWx0OworICAgICAgICBQeUVycl9GZXRjaCgmcHR5cGUsICZwdmFsdWUsICZwdHJhY2ViYWNrKTsKKyAgICAgICAgaWYgKFB5U3RyaW5nX0NoZWNrKHB2YWx1ZSkpIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpuZXdtc2c7CisgICAgICAgICAgICBuZXdtc2cgPSBQeVN0cmluZ19Gcm9tRm9ybWF0KAorICAgICAgICAgICAgICAgICJFcnJvciB3aGVuIGNhbGxpbmcgdGhlIG1ldGFjbGFzcyBiYXNlc1xuIgorICAgICAgICAgICAgICAgICIgICAgJXMiLAorICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FTX1NUUklORyhwdmFsdWUpKTsKKyAgICAgICAgICAgIGlmIChuZXdtc2cgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihwdmFsdWUpOworICAgICAgICAgICAgICAgIHB2YWx1ZSA9IG5ld21zZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBQeUVycl9SZXN0b3JlKHB0eXBlLCBwdmFsdWUsIHB0cmFjZWJhY2spOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgaW50CiBleGVjX3N0YXRlbWVudChQeUZyYW1lT2JqZWN0ICpmLCBQeU9iamVjdCAqcHJvZywgUHlPYmplY3QgKmdsb2JhbHMsCi0JICAgICAgIFB5T2JqZWN0ICpsb2NhbHMpCisgICAgICAgICAgICAgICBQeU9iamVjdCAqbG9jYWxzKQogewotCWludCBuOwotCVB5T2JqZWN0ICp2OwotCWludCBwbGFpbiA9IDA7CisgICAgaW50IG47CisgICAgUHlPYmplY3QgKnY7CisgICAgaW50IHBsYWluID0gMDsKIAotCWlmIChQeVR1cGxlX0NoZWNrKHByb2cpICYmIGdsb2JhbHMgPT0gUHlfTm9uZSAmJiBsb2NhbHMgPT0gUHlfTm9uZSAmJgotCSAgICAoKG4gPSBQeVR1cGxlX1NpemUocHJvZykpID09IDIgfHwgbiA9PSAzKSkgewotCQkvKiBCYWNrd2FyZCBjb21wYXRpYmlsaXR5IGhhY2sgKi8KLQkJZ2xvYmFscyA9IFB5VHVwbGVfR2V0SXRlbShwcm9nLCAxKTsKLQkJaWYgKG4gPT0gMykKLQkJCWxvY2FscyA9IFB5VHVwbGVfR2V0SXRlbShwcm9nLCAyKTsKLQkJcHJvZyA9IFB5VHVwbGVfR2V0SXRlbShwcm9nLCAwKTsKLQl9Ci0JaWYgKGdsb2JhbHMgPT0gUHlfTm9uZSkgewotCQlnbG9iYWxzID0gUHlFdmFsX0dldEdsb2JhbHMoKTsKLQkJaWYgKGxvY2FscyA9PSBQeV9Ob25lKSB7Ci0JCQlsb2NhbHMgPSBQeUV2YWxfR2V0TG9jYWxzKCk7Ci0JCQlwbGFpbiA9IDE7Ci0JCX0KLQkJaWYgKCFnbG9iYWxzIHx8ICFsb2NhbHMpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKLQkJCQkJImdsb2JhbHMgYW5kIGxvY2FscyBjYW5ub3QgYmUgTlVMTCIpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQotCWVsc2UgaWYgKGxvY2FscyA9PSBQeV9Ob25lKQotCQlsb2NhbHMgPSBnbG9iYWxzOwotCWlmICghUHlTdHJpbmdfQ2hlY2socHJvZykgJiYKLQkgICAgIVB5VW5pY29kZV9DaGVjayhwcm9nKSAmJgotCSAgICAhUHlDb2RlX0NoZWNrKHByb2cpICYmCi0JICAgICFQeUZpbGVfQ2hlY2socHJvZykpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCSJleGVjOiBhcmcgMSBtdXN0IGJlIGEgc3RyaW5nLCBmaWxlLCBvciBjb2RlIG9iamVjdCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmICghUHlEaWN0X0NoZWNrKGdsb2JhbHMpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCSAgICAiZXhlYzogYXJnIDIgbXVzdCBiZSBhIGRpY3Rpb25hcnkgb3IgTm9uZSIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmICghUHlNYXBwaW5nX0NoZWNrKGxvY2FscykpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJICAgICJleGVjOiBhcmcgMyBtdXN0IGJlIGEgbWFwcGluZyBvciBOb25lIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKFB5RGljdF9HZXRJdGVtU3RyaW5nKGdsb2JhbHMsICJfX2J1aWx0aW5zX18iKSA9PSBOVUxMKQotCQlQeURpY3RfU2V0SXRlbVN0cmluZyhnbG9iYWxzLCAiX19idWlsdGluc19fIiwgZi0+Zl9idWlsdGlucyk7Ci0JaWYgKFB5Q29kZV9DaGVjayhwcm9nKSkgewotCQlpZiAoUHlDb2RlX0dldE51bUZyZWUoKFB5Q29kZU9iamVjdCAqKXByb2cpID4gMCkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJImNvZGUgb2JqZWN0IHBhc3NlZCB0byBleGVjIG1heSBub3QgY29udGFpbiBmcmVlIHZhcmlhYmxlcyIpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCXYgPSBQeUV2YWxfRXZhbENvZGUoKFB5Q29kZU9iamVjdCAqKSBwcm9nLCBnbG9iYWxzLCBsb2NhbHMpOwotCX0KLQllbHNlIGlmIChQeUZpbGVfQ2hlY2socHJvZykpIHsKLQkJRklMRSAqZnAgPSBQeUZpbGVfQXNGaWxlKHByb2cpOwotCQljaGFyICpuYW1lID0gUHlTdHJpbmdfQXNTdHJpbmcoUHlGaWxlX05hbWUocHJvZykpOwotCQlQeUNvbXBpbGVyRmxhZ3MgY2Y7Ci0JCWlmIChuYW1lID09IE5VTEwpCi0JCQlyZXR1cm4gLTE7Ci0JCWNmLmNmX2ZsYWdzID0gMDsKLQkJaWYgKFB5RXZhbF9NZXJnZUNvbXBpbGVyRmxhZ3MoJmNmKSkKLQkJCXYgPSBQeVJ1bl9GaWxlRmxhZ3MoZnAsIG5hbWUsIFB5X2ZpbGVfaW5wdXQsIGdsb2JhbHMsCi0JCQkJCSAgICBsb2NhbHMsICZjZik7Ci0JCWVsc2UKLQkJCXYgPSBQeVJ1bl9GaWxlKGZwLCBuYW1lLCBQeV9maWxlX2lucHV0LCBnbG9iYWxzLAotCQkJCSAgICAgICBsb2NhbHMpOwotCX0KLQllbHNlIHsKLQkJUHlPYmplY3QgKnRtcCA9IE5VTEw7Ci0JCWNoYXIgKnN0cjsKLQkJUHlDb21waWxlckZsYWdzIGNmOwotCQljZi5jZl9mbGFncyA9IDA7CisgICAgaWYgKFB5VHVwbGVfQ2hlY2socHJvZykgJiYgZ2xvYmFscyA9PSBQeV9Ob25lICYmIGxvY2FscyA9PSBQeV9Ob25lICYmCisgICAgICAgICgobiA9IFB5VHVwbGVfU2l6ZShwcm9nKSkgPT0gMiB8fCBuID09IDMpKSB7CisgICAgICAgIC8qIEJhY2t3YXJkIGNvbXBhdGliaWxpdHkgaGFjayAqLworICAgICAgICBnbG9iYWxzID0gUHlUdXBsZV9HZXRJdGVtKHByb2csIDEpOworICAgICAgICBpZiAobiA9PSAzKQorICAgICAgICAgICAgbG9jYWxzID0gUHlUdXBsZV9HZXRJdGVtKHByb2csIDIpOworICAgICAgICBwcm9nID0gUHlUdXBsZV9HZXRJdGVtKHByb2csIDApOworICAgIH0KKyAgICBpZiAoZ2xvYmFscyA9PSBQeV9Ob25lKSB7CisgICAgICAgIGdsb2JhbHMgPSBQeUV2YWxfR2V0R2xvYmFscygpOworICAgICAgICBpZiAobG9jYWxzID09IFB5X05vbmUpIHsKKyAgICAgICAgICAgIGxvY2FscyA9IFB5RXZhbF9HZXRMb2NhbHMoKTsKKyAgICAgICAgICAgIHBsYWluID0gMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWdsb2JhbHMgfHwgIWxvY2FscykgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnbG9iYWxzIGFuZCBsb2NhbHMgY2Fubm90IGJlIE5VTEwiKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChsb2NhbHMgPT0gUHlfTm9uZSkKKyAgICAgICAgbG9jYWxzID0gZ2xvYmFsczsKKyAgICBpZiAoIVB5U3RyaW5nX0NoZWNrKHByb2cpICYmCisgICAgICAgICFQeVVuaWNvZGVfQ2hlY2socHJvZykgJiYKKyAgICAgICAgIVB5Q29kZV9DaGVjayhwcm9nKSAmJgorICAgICAgICAhUHlGaWxlX0NoZWNrKHByb2cpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAiZXhlYzogYXJnIDEgbXVzdCBiZSBhIHN0cmluZywgZmlsZSwgb3IgY29kZSBvYmplY3QiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoIVB5RGljdF9DaGVjayhnbG9iYWxzKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgImV4ZWM6IGFyZyAyIG11c3QgYmUgYSBkaWN0aW9uYXJ5IG9yIE5vbmUiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoIVB5TWFwcGluZ19DaGVjayhsb2NhbHMpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAiZXhlYzogYXJnIDMgbXVzdCBiZSBhIG1hcHBpbmcgb3IgTm9uZSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChQeURpY3RfR2V0SXRlbVN0cmluZyhnbG9iYWxzLCAiX19idWlsdGluc19fIikgPT0gTlVMTCkKKyAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZ2xvYmFscywgIl9fYnVpbHRpbnNfXyIsIGYtPmZfYnVpbHRpbnMpOworICAgIGlmIChQeUNvZGVfQ2hlY2socHJvZykpIHsKKyAgICAgICAgaWYgKFB5Q29kZV9HZXROdW1GcmVlKChQeUNvZGVPYmplY3QgKilwcm9nKSA+IDApIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICJjb2RlIG9iamVjdCBwYXNzZWQgdG8gZXhlYyBtYXkgbm90IGNvbnRhaW4gZnJlZSB2YXJpYWJsZXMiKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICB2ID0gUHlFdmFsX0V2YWxDb2RlKChQeUNvZGVPYmplY3QgKikgcHJvZywgZ2xvYmFscywgbG9jYWxzKTsKKyAgICB9CisgICAgZWxzZSBpZiAoUHlGaWxlX0NoZWNrKHByb2cpKSB7CisgICAgICAgIEZJTEUgKmZwID0gUHlGaWxlX0FzRmlsZShwcm9nKTsKKyAgICAgICAgY2hhciAqbmFtZSA9IFB5U3RyaW5nX0FzU3RyaW5nKFB5RmlsZV9OYW1lKHByb2cpKTsKKyAgICAgICAgUHlDb21waWxlckZsYWdzIGNmOworICAgICAgICBpZiAobmFtZSA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBjZi5jZl9mbGFncyA9IDA7CisgICAgICAgIGlmIChQeUV2YWxfTWVyZ2VDb21waWxlckZsYWdzKCZjZikpCisgICAgICAgICAgICB2ID0gUHlSdW5fRmlsZUZsYWdzKGZwLCBuYW1lLCBQeV9maWxlX2lucHV0LCBnbG9iYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbHMsICZjZik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHYgPSBQeVJ1bl9GaWxlKGZwLCBuYW1lLCBQeV9maWxlX2lucHV0LCBnbG9iYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxzKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5T2JqZWN0ICp0bXAgPSBOVUxMOworICAgICAgICBjaGFyICpzdHI7CisgICAgICAgIFB5Q29tcGlsZXJGbGFncyBjZjsKKyAgICAgICAgY2YuY2ZfZmxhZ3MgPSAwOwogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQkJaWYgKFB5VW5pY29kZV9DaGVjayhwcm9nKSkgewotCQkJdG1wID0gUHlVbmljb2RlX0FzVVRGOFN0cmluZyhwcm9nKTsKLQkJCWlmICh0bXAgPT0gTlVMTCkKLQkJCQlyZXR1cm4gLTE7Ci0JCQlwcm9nID0gdG1wOwotCQkJY2YuY2ZfZmxhZ3MgfD0gUHlDRl9TT1VSQ0VfSVNfVVRGODsKLQkJfQorICAgICAgICBpZiAoUHlVbmljb2RlX0NoZWNrKHByb2cpKSB7CisgICAgICAgICAgICB0bXAgPSBQeVVuaWNvZGVfQXNVVEY4U3RyaW5nKHByb2cpOworICAgICAgICAgICAgaWYgKHRtcCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIHByb2cgPSB0bXA7CisgICAgICAgICAgICBjZi5jZl9mbGFncyB8PSBQeUNGX1NPVVJDRV9JU19VVEY4OworICAgICAgICB9CiAjZW5kaWYKLQkJaWYgKFB5U3RyaW5nX0FzU3RyaW5nQW5kU2l6ZShwcm9nLCAmc3RyLCBOVUxMKSkKLQkJCXJldHVybiAtMTsKLQkJaWYgKFB5RXZhbF9NZXJnZUNvbXBpbGVyRmxhZ3MoJmNmKSkKLQkJCXYgPSBQeVJ1bl9TdHJpbmdGbGFncyhzdHIsIFB5X2ZpbGVfaW5wdXQsIGdsb2JhbHMsCi0JCQkJCSAgICAgIGxvY2FscywgJmNmKTsKLQkJZWxzZQotCQkJdiA9IFB5UnVuX1N0cmluZyhzdHIsIFB5X2ZpbGVfaW5wdXQsIGdsb2JhbHMsIGxvY2Fscyk7Ci0JCVB5X1hERUNSRUYodG1wKTsKLQl9Ci0JaWYgKHBsYWluKQotCQlQeUZyYW1lX0xvY2Fsc1RvRmFzdChmLCAwKTsKLQlpZiAodiA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0JUHlfREVDUkVGKHYpOwotCXJldHVybiAwOworICAgICAgICBpZiAoUHlTdHJpbmdfQXNTdHJpbmdBbmRTaXplKHByb2csICZzdHIsIE5VTEwpKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBpZiAoUHlFdmFsX01lcmdlQ29tcGlsZXJGbGFncygmY2YpKQorICAgICAgICAgICAgdiA9IFB5UnVuX1N0cmluZ0ZsYWdzKHN0ciwgUHlfZmlsZV9pbnB1dCwgZ2xvYmFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbHMsICZjZik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHYgPSBQeVJ1bl9TdHJpbmcoc3RyLCBQeV9maWxlX2lucHV0LCBnbG9iYWxzLCBsb2NhbHMpOworICAgICAgICBQeV9YREVDUkVGKHRtcCk7CisgICAgfQorICAgIGlmIChwbGFpbikKKyAgICAgICAgUHlGcmFtZV9Mb2NhbHNUb0Zhc3QoZiwgMCk7CisgICAgaWYgKHYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIFB5X0RFQ1JFRih2KTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQKIGZvcm1hdF9leGNfY2hlY2tfYXJnKFB5T2JqZWN0ICpleGMsIGNoYXIgKmZvcm1hdF9zdHIsIFB5T2JqZWN0ICpvYmopCiB7Ci0JY2hhciAqb2JqX3N0cjsKKyAgICBjaGFyICpvYmpfc3RyOwogCi0JaWYgKCFvYmopCi0JCXJldHVybjsKKyAgICBpZiAoIW9iaikKKyAgICAgICAgcmV0dXJuOwogCi0Jb2JqX3N0ciA9IFB5U3RyaW5nX0FzU3RyaW5nKG9iaik7Ci0JaWYgKCFvYmpfc3RyKQotCQlyZXR1cm47CisgICAgb2JqX3N0ciA9IFB5U3RyaW5nX0FzU3RyaW5nKG9iaik7CisgICAgaWYgKCFvYmpfc3RyKQorICAgICAgICByZXR1cm47CiAKLQlQeUVycl9Gb3JtYXQoZXhjLCBmb3JtYXRfc3RyLCBvYmpfc3RyKTsKKyAgICBQeUVycl9Gb3JtYXQoZXhjLCBmb3JtYXRfc3RyLCBvYmpfc3RyKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHN0cmluZ19jb25jYXRlbmF0ZShQeU9iamVjdCAqdiwgUHlPYmplY3QgKncsCi0JCSAgIFB5RnJhbWVPYmplY3QgKmYsIHVuc2lnbmVkIGNoYXIgKm5leHRfaW5zdHIpCisgICAgICAgICAgICAgICAgICAgUHlGcmFtZU9iamVjdCAqZiwgdW5zaWduZWQgY2hhciAqbmV4dF9pbnN0cikKIHsKLQkvKiBUaGlzIGZ1bmN0aW9uIGltcGxlbWVudHMgJ3ZhcmlhYmxlICs9IGV4cHInIHdoZW4gYm90aCBhcmd1bWVudHMKLQkgICBhcmUgc3RyaW5ncy4gKi8KLQlQeV9zc2l6ZV90IHZfbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUodik7Ci0JUHlfc3NpemVfdCB3X2xlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHcpOwotCVB5X3NzaXplX3QgbmV3X2xlbiA9IHZfbGVuICsgd19sZW47Ci0JaWYgKG5ld19sZW4gPCAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJCSJzdHJpbmdzIGFyZSB0b28gbGFyZ2UgdG8gY29uY2F0Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICAvKiBUaGlzIGZ1bmN0aW9uIGltcGxlbWVudHMgJ3ZhcmlhYmxlICs9IGV4cHInIHdoZW4gYm90aCBhcmd1bWVudHMKKyAgICAgICBhcmUgc3RyaW5ncy4gKi8KKyAgICBQeV9zc2l6ZV90IHZfbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUodik7CisgICAgUHlfc3NpemVfdCB3X2xlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHcpOworICAgIFB5X3NzaXplX3QgbmV3X2xlbiA9IHZfbGVuICsgd19sZW47CisgICAgaWYgKG5ld19sZW4gPCAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInN0cmluZ3MgYXJlIHRvbyBsYXJnZSB0byBjb25jYXQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaWYgKHYtPm9iX3JlZmNudCA9PSAyKSB7Ci0JCS8qIEluIHRoZSBjb21tb24gY2FzZSwgdGhlcmUgYXJlIDIgcmVmZXJlbmNlcyB0byB0aGUgdmFsdWUKLQkJICogc3RvcmVkIGluICd2YXJpYWJsZScgd2hlbiB0aGUgKz0gaXMgcGVyZm9ybWVkOiBvbmUgb24gdGhlCi0JCSAqIHZhbHVlIHN0YWNrIChpbiAndicpIGFuZCBvbmUgc3RpbGwgc3RvcmVkIGluIHRoZQotCQkgKiAndmFyaWFibGUnLiAgV2UgdHJ5IHRvIGRlbGV0ZSB0aGUgdmFyaWFibGUgbm93IHRvIHJlZHVjZQotCQkgKiB0aGUgcmVmY250IHRvIDEuCi0JCSAqLwotCQlzd2l0Y2ggKCpuZXh0X2luc3RyKSB7Ci0JCWNhc2UgU1RPUkVfRkFTVDoKLQkJewotCQkJaW50IG9wYXJnID0gUEVFS0FSRygpOwotCQkJUHlPYmplY3QgKipmYXN0bG9jYWxzID0gZi0+Zl9sb2NhbHNwbHVzOwotCQkJaWYgKEdFVExPQ0FMKG9wYXJnKSA9PSB2KQotCQkJCVNFVExPQ0FMKG9wYXJnLCBOVUxMKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWNhc2UgU1RPUkVfREVSRUY6Ci0JCXsKLQkJCVB5T2JqZWN0ICoqZnJlZXZhcnMgPSAoZi0+Zl9sb2NhbHNwbHVzICsKLQkJCQkJICAgICAgIGYtPmZfY29kZS0+Y29fbmxvY2Fscyk7Ci0JCQlQeU9iamVjdCAqYyA9IGZyZWV2YXJzW1BFRUtBUkcoKV07Ci0JCQlpZiAoUHlDZWxsX0dFVChjKSA9PSB2KQotCQkJCVB5Q2VsbF9TZXQoYywgTlVMTCk7Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIFNUT1JFX05BTUU6Ci0JCXsKLQkJCVB5T2JqZWN0ICpuYW1lcyA9IGYtPmZfY29kZS0+Y29fbmFtZXM7Ci0JCQlQeU9iamVjdCAqbmFtZSA9IEdFVElURU0obmFtZXMsIFBFRUtBUkcoKSk7Ci0JCQlQeU9iamVjdCAqbG9jYWxzID0gZi0+Zl9sb2NhbHM7Ci0JCQlpZiAoUHlEaWN0X0NoZWNrRXhhY3QobG9jYWxzKSAmJgotCQkJICAgIFB5RGljdF9HZXRJdGVtKGxvY2FscywgbmFtZSkgPT0gdikgewotCQkJCWlmIChQeURpY3RfRGVsSXRlbShsb2NhbHMsIG5hbWUpICE9IDApIHsKLQkJCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCQl9Ci0JfQorICAgIGlmICh2LT5vYl9yZWZjbnQgPT0gMikgeworICAgICAgICAvKiBJbiB0aGUgY29tbW9uIGNhc2UsIHRoZXJlIGFyZSAyIHJlZmVyZW5jZXMgdG8gdGhlIHZhbHVlCisgICAgICAgICAqIHN0b3JlZCBpbiAndmFyaWFibGUnIHdoZW4gdGhlICs9IGlzIHBlcmZvcm1lZDogb25lIG9uIHRoZQorICAgICAgICAgKiB2YWx1ZSBzdGFjayAoaW4gJ3YnKSBhbmQgb25lIHN0aWxsIHN0b3JlZCBpbiB0aGUKKyAgICAgICAgICogJ3ZhcmlhYmxlJy4gIFdlIHRyeSB0byBkZWxldGUgdGhlIHZhcmlhYmxlIG5vdyB0byByZWR1Y2UKKyAgICAgICAgICogdGhlIHJlZmNudCB0byAxLgorICAgICAgICAgKi8KKyAgICAgICAgc3dpdGNoICgqbmV4dF9pbnN0cikgeworICAgICAgICBjYXNlIFNUT1JFX0ZBU1Q6CisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBvcGFyZyA9IFBFRUtBUkcoKTsKKyAgICAgICAgICAgIFB5T2JqZWN0ICoqZmFzdGxvY2FscyA9IGYtPmZfbG9jYWxzcGx1czsKKyAgICAgICAgICAgIGlmIChHRVRMT0NBTChvcGFyZykgPT0gdikKKyAgICAgICAgICAgICAgICBTRVRMT0NBTChvcGFyZywgTlVMTCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFNUT1JFX0RFUkVGOgorICAgICAgICB7CisgICAgICAgICAgICBQeU9iamVjdCAqKmZyZWV2YXJzID0gKGYtPmZfbG9jYWxzcGx1cyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYtPmZfY29kZS0+Y29fbmxvY2Fscyk7CisgICAgICAgICAgICBQeU9iamVjdCAqYyA9IGZyZWV2YXJzW1BFRUtBUkcoKV07CisgICAgICAgICAgICBpZiAoUHlDZWxsX0dFVChjKSA9PSB2KQorICAgICAgICAgICAgICAgIFB5Q2VsbF9TZXQoYywgTlVMTCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFNUT1JFX05BTUU6CisgICAgICAgIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpuYW1lcyA9IGYtPmZfY29kZS0+Y29fbmFtZXM7CisgICAgICAgICAgICBQeU9iamVjdCAqbmFtZSA9IEdFVElURU0obmFtZXMsIFBFRUtBUkcoKSk7CisgICAgICAgICAgICBQeU9iamVjdCAqbG9jYWxzID0gZi0+Zl9sb2NhbHM7CisgICAgICAgICAgICBpZiAoUHlEaWN0X0NoZWNrRXhhY3QobG9jYWxzKSAmJgorICAgICAgICAgICAgICAgIFB5RGljdF9HZXRJdGVtKGxvY2FscywgbmFtZSkgPT0gdikgeworICAgICAgICAgICAgICAgIGlmIChQeURpY3RfRGVsSXRlbShsb2NhbHMsIG5hbWUpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB9CisgICAgfQogCi0JaWYgKHYtPm9iX3JlZmNudCA9PSAxICYmICFQeVN0cmluZ19DSEVDS19JTlRFUk5FRCh2KSkgewotCQkvKiBOb3cgd2Ugb3duIHRoZSBsYXN0IHJlZmVyZW5jZSB0byAndicsIHNvIHdlIGNhbiByZXNpemUgaXQKLQkJICogaW4tcGxhY2UuCi0JCSAqLwotCQlpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmdiwgbmV3X2xlbikgIT0gMCkgewotCQkJLyogWFhYIGlmIF9QeVN0cmluZ19SZXNpemUoKSBmYWlscywgJ3YnIGhhcyBiZWVuCi0JCQkgKiBkZWFsbG9jYXRlZCBzbyBpdCBjYW5ub3QgYmUgcHV0IGJhY2sgaW50bwotCQkJICogJ3ZhcmlhYmxlJy4gIFRoZSBNZW1vcnlFcnJvciBpcyByYWlzZWQgd2hlbiB0aGVyZQotCQkJICogaXMgbm8gdmFsdWUgaW4gJ3ZhcmlhYmxlJywgd2hpY2ggbWlnaHQgKHZlcnkKLQkJCSAqIHJlbW90ZWx5KSBiZSBhIGNhdXNlIG9mIGluY29tcGF0aWJpbGl0aWVzLgotCQkJICovCi0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQkvKiBjb3B5ICd3JyBpbnRvIHRoZSBuZXdseSBhbGxvY2F0ZWQgYXJlYSBvZiAndicgKi8KLQkJbWVtY3B5KFB5U3RyaW5nX0FTX1NUUklORyh2KSArIHZfbGVuLAotCQkgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKHcpLCB3X2xlbik7Ci0JCXJldHVybiB2OwotCX0KLQllbHNlIHsKLQkJLyogV2hlbiBpbi1wbGFjZSByZXNpemluZyBpcyBub3QgYW4gb3B0aW9uLiAqLwotCQlQeVN0cmluZ19Db25jYXQoJnYsIHcpOwotCQlyZXR1cm4gdjsKLQl9CisgICAgaWYgKHYtPm9iX3JlZmNudCA9PSAxICYmICFQeVN0cmluZ19DSEVDS19JTlRFUk5FRCh2KSkgeworICAgICAgICAvKiBOb3cgd2Ugb3duIHRoZSBsYXN0IHJlZmVyZW5jZSB0byAndicsIHNvIHdlIGNhbiByZXNpemUgaXQKKyAgICAgICAgICogaW4tcGxhY2UuCisgICAgICAgICAqLworICAgICAgICBpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmdiwgbmV3X2xlbikgIT0gMCkgeworICAgICAgICAgICAgLyogWFhYIGlmIF9QeVN0cmluZ19SZXNpemUoKSBmYWlscywgJ3YnIGhhcyBiZWVuCisgICAgICAgICAgICAgKiBkZWFsbG9jYXRlZCBzbyBpdCBjYW5ub3QgYmUgcHV0IGJhY2sgaW50bworICAgICAgICAgICAgICogJ3ZhcmlhYmxlJy4gIFRoZSBNZW1vcnlFcnJvciBpcyByYWlzZWQgd2hlbiB0aGVyZQorICAgICAgICAgICAgICogaXMgbm8gdmFsdWUgaW4gJ3ZhcmlhYmxlJywgd2hpY2ggbWlnaHQgKHZlcnkKKyAgICAgICAgICAgICAqIHJlbW90ZWx5KSBiZSBhIGNhdXNlIG9mIGluY29tcGF0aWJpbGl0aWVzLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICAvKiBjb3B5ICd3JyBpbnRvIHRoZSBuZXdseSBhbGxvY2F0ZWQgYXJlYSBvZiAndicgKi8KKyAgICAgICAgbWVtY3B5KFB5U3RyaW5nX0FTX1NUUklORyh2KSArIHZfbGVuLAorICAgICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKHcpLCB3X2xlbik7CisgICAgICAgIHJldHVybiB2OworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLyogV2hlbiBpbi1wbGFjZSByZXNpemluZyBpcyBub3QgYW4gb3B0aW9uLiAqLworICAgICAgICBQeVN0cmluZ19Db25jYXQoJnYsIHcpOworICAgICAgICByZXR1cm4gdjsKKyAgICB9CiB9CiAKICNpZmRlZiBEWU5BTUlDX0VYRUNVVElPTl9QUk9GSUxFCkBAIC00NTkwLDQwICs0NTkwLDQwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2V0YXJyYXkobG9uZyBhWzI1Nl0pCiB7Ci0JaW50IGk7Ci0JUHlPYmplY3QgKmwgPSBQeUxpc3RfTmV3KDI1Nik7Ci0JaWYgKGwgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7Ci0JCVB5T2JqZWN0ICp4ID0gUHlJbnRfRnJvbUxvbmcoYVtpXSk7Ci0JCWlmICh4ID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRihsKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCVB5TGlzdF9TZXRJdGVtKGwsIGksIHgpOwotCX0KLQlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCi0JCWFbaV0gPSAwOwotCXJldHVybiBsOworICAgIGludCBpOworICAgIFB5T2JqZWN0ICpsID0gUHlMaXN0X05ldygyNTYpOworICAgIGlmIChsID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworICAgICAgICBQeU9iamVjdCAqeCA9IFB5SW50X0Zyb21Mb25nKGFbaV0pOworICAgICAgICBpZiAoeCA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYobCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBQeUxpc3RfU2V0SXRlbShsLCBpLCB4KTsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQorICAgICAgICBhW2ldID0gMDsKKyAgICByZXR1cm4gbDsKIH0KIAogUHlPYmplY3QgKgogX1B5X0dldERYUHJvZmlsZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7CiAjaWZuZGVmIERYUEFJUlMKLQlyZXR1cm4gZ2V0YXJyYXkoZHhwKTsKKyAgICByZXR1cm4gZ2V0YXJyYXkoZHhwKTsKICNlbHNlCi0JaW50IGk7Ci0JUHlPYmplY3QgKmwgPSBQeUxpc3RfTmV3KDI1Nyk7Ci0JaWYgKGwgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JZm9yIChpID0gMDsgaSA8IDI1NzsgaSsrKSB7Ci0JCVB5T2JqZWN0ICp4ID0gZ2V0YXJyYXkoZHhwYWlyc1tpXSk7Ci0JCWlmICh4ID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRihsKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCVB5TGlzdF9TZXRJdGVtKGwsIGksIHgpOwotCX0KLQlyZXR1cm4gbDsKKyAgICBpbnQgaTsKKyAgICBQeU9iamVjdCAqbCA9IFB5TGlzdF9OZXcoMjU3KTsKKyAgICBpZiAobCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMjU3OyBpKyspIHsKKyAgICAgICAgUHlPYmplY3QgKnggPSBnZXRhcnJheShkeHBhaXJzW2ldKTsKKyAgICAgICAgaWYgKHggPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKGwpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgUHlMaXN0X1NldEl0ZW0obCwgaSwgeCk7CisgICAgfQorICAgIHJldHVybiBsOwogI2VuZGlmCiB9CiAKZGlmZiAtLWdpdCBhL1B5dGhvbi9jb2RlY3MuYyBiL1B5dGhvbi9jb2RlY3MuYwppbmRleCAzODQ5Y2Y5Li41N2JkMGY0IDEwMDY0NAotLS0gYS9QeXRob24vY29kZWNzLmMKKysrIGIvUHl0aG9uL2NvZGVjcy5jCkBAIC0xNCw3ICsxNCw3IEBACiAvKiAtLS0gQ29kZWMgUmVnaXN0cnkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAogLyogSW1wb3J0IHRoZSBzdGFuZGFyZCBlbmNvZGluZ3MgcGFja2FnZSB3aGljaCB3aWxsIHJlZ2lzdGVyIHRoZSBmaXJzdAotICAgY29kZWMgc2VhcmNoIGZ1bmN0aW9uLiAKKyAgIGNvZGVjIHNlYXJjaCBmdW5jdGlvbi4KIAogICAgVGhpcyBpcyBkb25lIGluIGEgbGF6eSB3YXkgc28gdGhhdCB0aGUgVW5pY29kZSBpbXBsZW1lbnRhdGlvbiBkb2VzCiAgICBub3QgZG93bmdyYWRlIHN0YXJ0dXAgdGltZSBvZiBzY3JpcHRzIG5vdCBuZWVkaW5nIGl0LgpAQCAtMzAsMTQgKzMwLDE0IEBACiB7CiAgICAgUHlJbnRlcnByZXRlclN0YXRlICppbnRlcnAgPSBQeVRocmVhZFN0YXRlX0dFVCgpLT5pbnRlcnA7CiAgICAgaWYgKGludGVycC0+Y29kZWNfc2VhcmNoX3BhdGggPT0gTlVMTCAmJiBfUHlDb2RlY1JlZ2lzdHJ5X0luaXQoKSkKLQlnb3RvIG9uRXJyb3I7CisgICAgICAgIGdvdG8gb25FcnJvcjsKICAgICBpZiAoc2VhcmNoX2Z1bmN0aW9uID09IE5VTEwpIHsKLQlQeUVycl9CYWRBcmd1bWVudCgpOwotCWdvdG8gb25FcnJvcjsKKyAgICAgICAgUHlFcnJfQmFkQXJndW1lbnQoKTsKKyAgICAgICAgZ290byBvbkVycm9yOwogICAgIH0KICAgICBpZiAoIVB5Q2FsbGFibGVfQ2hlY2soc2VhcmNoX2Z1bmN0aW9uKSkgewotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJhcmd1bWVudCBtdXN0IGJlIGNhbGxhYmxlIik7Ci0JZ290byBvbkVycm9yOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYXJndW1lbnQgbXVzdCBiZSBjYWxsYWJsZSIpOworICAgICAgICBnb3RvIG9uRXJyb3I7CiAgICAgfQogICAgIHJldHVybiBQeUxpc3RfQXBwZW5kKGludGVycC0+Y29kZWNfc2VhcmNoX3BhdGgsIHNlYXJjaF9mdW5jdGlvbik7CiAKQEAgLTU1LDE1ICs1NSwxNSBAQAogICAgIHNpemVfdCBsZW4gPSBzdHJsZW4oc3RyaW5nKTsKICAgICBjaGFyICpwOwogICAgIFB5T2JqZWN0ICp2OwotICAgIAorCiAgICAgaWYgKGxlbiA+IFBZX1NTSVpFX1RfTUFYKSB7Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsICJzdHJpbmcgaXMgdG9vIGxhcmdlIik7Ci0JcmV0dXJuIE5VTEw7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLCAic3RyaW5nIGlzIHRvbyBsYXJnZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0JCisKICAgICB2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbGVuKTsKICAgICBpZiAodiA9PSBOVUxMKQotCXJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICBwID0gUHlTdHJpbmdfQVNfU1RSSU5HKHYpOwogICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewogICAgICAgICByZWdpc3RlciBjaGFyIGNoID0gc3RyaW5nW2ldOwpAQCAtNzEsNyArNzEsNyBAQAogICAgICAgICAgICAgY2ggPSAnLSc7CiAgICAgICAgIGVsc2UKICAgICAgICAgICAgIGNoID0gdG9sb3dlcihQeV9DSEFSTUFTSyhjaCkpOwotCXBbaV0gPSBjaDsKKyAgICAgICAgcFtpXSA9IGNoOwogICAgIH0KICAgICByZXR1cm4gdjsKIH0KQEAgLTgzLDcgKzgzLDcgQEAKICAgIGNoYXJhY3RlcnMuIFRoaXMgbWFrZXMgZW5jb2RpbmdzIGxvb2tlZCB1cCB0aHJvdWdoIHRoaXMgbWVjaGFuaXNtCiAgICBlZmZlY3RpdmVseSBjYXNlLWluc2Vuc2l0aXZlLgogCi0gICBJZiBubyBjb2RlYyBpcyBmb3VuZCwgYSBMb29rdXBFcnJvciBpcyBzZXQgYW5kIE5VTEwgcmV0dXJuZWQuIAorICAgSWYgbm8gY29kZWMgaXMgZm91bmQsIGEgTG9va3VwRXJyb3IgaXMgc2V0IGFuZCBOVUxMIHJldHVybmVkLgogCiAgICBBcyBzaWRlIGVmZmVjdCwgdGhpcyB0cmllcyB0byBsb2FkIHRoZSBlbmNvZGluZ3MgcGFja2FnZSwgaWYgbm90CiAgICB5ZXQgZG9uZS4gVGhpcyBpcyBwYXJ0IG9mIHRoZSBsYXp5IGxvYWQgc3RyYXRlZ3kgZm9yIHRoZSBlbmNvZGluZ3MKQEAgLTk4LDcyICs5OCw3MiBAQAogICAgIFB5X3NzaXplX3QgaSwgbGVuOwogCiAgICAgaWYgKGVuY29kaW5nID09IE5VTEwpIHsKLQlQeUVycl9CYWRBcmd1bWVudCgpOwotCWdvdG8gb25FcnJvcjsKKyAgICAgICAgUHlFcnJfQmFkQXJndW1lbnQoKTsKKyAgICAgICAgZ290byBvbkVycm9yOwogICAgIH0KIAogICAgIGludGVycCA9IFB5VGhyZWFkU3RhdGVfR0VUKCktPmludGVycDsKICAgICBpZiAoaW50ZXJwLT5jb2RlY19zZWFyY2hfcGF0aCA9PSBOVUxMICYmIF9QeUNvZGVjUmVnaXN0cnlfSW5pdCgpKQotCWdvdG8gb25FcnJvcjsKKyAgICAgICAgZ290byBvbkVycm9yOwogCiAgICAgLyogQ29udmVydCB0aGUgZW5jb2RpbmcgdG8gYSBub3JtYWxpemVkIFB5dGhvbiBzdHJpbmc6IGFsbAogICAgICAgIGNoYXJhY3RlcnMgYXJlIGNvbnZlcnRlZCB0byBsb3dlciBjYXNlLCBzcGFjZXMgYW5kIGh5cGhlbnMgYXJlCiAgICAgICAgcmVwbGFjZWQgd2l0aCB1bmRlcnNjb3Jlcy4gKi8KICAgICB2ID0gbm9ybWFsaXplc3RyaW5nKGVuY29kaW5nKTsKICAgICBpZiAodiA9PSBOVUxMKQotCWdvdG8gb25FcnJvcjsKKyAgICAgICAgZ290byBvbkVycm9yOwogICAgIFB5U3RyaW5nX0ludGVybkluUGxhY2UoJnYpOwogCiAgICAgLyogRmlyc3QsIHRyeSB0byBsb29rdXAgdGhlIG5hbWUgaW4gdGhlIHJlZ2lzdHJ5IGRpY3Rpb25hcnkgKi8KICAgICByZXN1bHQgPSBQeURpY3RfR2V0SXRlbShpbnRlcnAtPmNvZGVjX3NlYXJjaF9jYWNoZSwgdik7CiAgICAgaWYgKHJlc3VsdCAhPSBOVUxMKSB7Ci0JUHlfSU5DUkVGKHJlc3VsdCk7Ci0JUHlfREVDUkVGKHYpOwotCXJldHVybiByZXN1bHQ7CisgICAgICAgIFB5X0lOQ1JFRihyZXN1bHQpOworICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQotICAgIAorCiAgICAgLyogTmV4dCwgc2NhbiB0aGUgc2VhcmNoIGZ1bmN0aW9ucyBpbiBvcmRlciBvZiByZWdpc3RyYXRpb24gKi8KICAgICBhcmdzID0gUHlUdXBsZV9OZXcoMSk7CiAgICAgaWYgKGFyZ3MgPT0gTlVMTCkKLQlnb3RvIG9uRXJyb3I7CisgICAgICAgIGdvdG8gb25FcnJvcjsKICAgICBQeVR1cGxlX1NFVF9JVEVNKGFyZ3MsMCx2KTsKIAogICAgIGxlbiA9IFB5TGlzdF9TaXplKGludGVycC0+Y29kZWNfc2VhcmNoX3BhdGgpOwogICAgIGlmIChsZW4gPCAwKQotCWdvdG8gb25FcnJvcjsKKyAgICAgICAgZ290byBvbkVycm9yOwogICAgIGlmIChsZW4gPT0gMCkgewotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19Mb29rdXBFcnJvciwKLQkJCSJubyBjb2RlYyBzZWFyY2ggZnVuY3Rpb25zIHJlZ2lzdGVyZWQ6ICIKLQkJCSJjYW4ndCBmaW5kIGVuY29kaW5nIik7Ci0JZ290byBvbkVycm9yOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTG9va3VwRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAibm8gY29kZWMgc2VhcmNoIGZ1bmN0aW9ucyByZWdpc3RlcmVkOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAiY2FuJ3QgZmluZCBlbmNvZGluZyIpOworICAgICAgICBnb3RvIG9uRXJyb3I7CiAgICAgfQogCiAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JUHlPYmplY3QgKmZ1bmM7Ci0JCi0JZnVuYyA9IFB5TGlzdF9HZXRJdGVtKGludGVycC0+Y29kZWNfc2VhcmNoX3BhdGgsIGkpOwotCWlmIChmdW5jID09IE5VTEwpCi0JICAgIGdvdG8gb25FcnJvcjsKLQlyZXN1bHQgPSBQeUV2YWxfQ2FsbE9iamVjdChmdW5jLCBhcmdzKTsKLQlpZiAocmVzdWx0ID09IE5VTEwpCi0JICAgIGdvdG8gb25FcnJvcjsKLQlpZiAocmVzdWx0ID09IFB5X05vbmUpIHsKLQkgICAgUHlfREVDUkVGKHJlc3VsdCk7Ci0JICAgIGNvbnRpbnVlOwotCX0KLQlpZiAoIVB5VHVwbGVfQ2hlY2socmVzdWx0KSB8fCBQeVR1cGxlX0dFVF9TSVpFKHJlc3VsdCkgIT0gNCkgewotCSAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJICAgICJjb2RlYyBzZWFyY2ggZnVuY3Rpb25zIG11c3QgcmV0dXJuIDQtdHVwbGVzIik7Ci0JICAgIFB5X0RFQ1JFRihyZXN1bHQpOwotCSAgICBnb3RvIG9uRXJyb3I7Ci0JfQotCWJyZWFrOworICAgICAgICBQeU9iamVjdCAqZnVuYzsKKworICAgICAgICBmdW5jID0gUHlMaXN0X0dldEl0ZW0oaW50ZXJwLT5jb2RlY19zZWFyY2hfcGF0aCwgaSk7CisgICAgICAgIGlmIChmdW5jID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIG9uRXJyb3I7CisgICAgICAgIHJlc3VsdCA9IFB5RXZhbF9DYWxsT2JqZWN0KGZ1bmMsIGFyZ3MpOworICAgICAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIG9uRXJyb3I7CisgICAgICAgIGlmIChyZXN1bHQgPT0gUHlfTm9uZSkgeworICAgICAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIVB5VHVwbGVfQ2hlY2socmVzdWx0KSB8fCBQeVR1cGxlX0dFVF9TSVpFKHJlc3VsdCkgIT0gNCkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29kZWMgc2VhcmNoIGZ1bmN0aW9ucyBtdXN0IHJldHVybiA0LXR1cGxlcyIpOworICAgICAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgICAgICBnb3RvIG9uRXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CiAgICAgfQogICAgIGlmIChpID09IGxlbikgewotCS8qIFhYWCBQZXJoYXBzIHdlIHNob3VsZCBjYWNoZSBtaXNzZXMgdG9vID8gKi8KLQlQeUVycl9Gb3JtYXQoUHlFeGNfTG9va3VwRXJyb3IsCisgICAgICAgIC8qIFhYWCBQZXJoYXBzIHdlIHNob3VsZCBjYWNoZSBtaXNzZXMgdG9vID8gKi8KKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX0xvb2t1cEVycm9yLAogICAgICAgICAgICAgICAgICAgICAgInVua25vd24gZW5jb2Rpbmc6ICVzIiwgZW5jb2RpbmcpOwotCWdvdG8gb25FcnJvcjsKKyAgICAgICAgZ290byBvbkVycm9yOwogICAgIH0KIAogICAgIC8qIENhY2hlIGFuZCByZXR1cm4gdGhlIHJlc3VsdCAqLwpAQCAtMTc4LDI0ICsxNzgsMjQgQEAKIAogc3RhdGljCiBQeU9iamVjdCAqYXJnc190dXBsZShQeU9iamVjdCAqb2JqZWN0LAotCQkgICAgIGNvbnN0IGNoYXIgKmVycm9ycykKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVycm9ycykKIHsKICAgICBQeU9iamVjdCAqYXJnczsKLSAgICAKKwogICAgIGFyZ3MgPSBQeVR1cGxlX05ldygxICsgKGVycm9ycyAhPSBOVUxMKSk7CiAgICAgaWYgKGFyZ3MgPT0gTlVMTCkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgUHlfSU5DUkVGKG9iamVjdCk7CiAgICAgUHlUdXBsZV9TRVRfSVRFTShhcmdzLDAsb2JqZWN0KTsKICAgICBpZiAoZXJyb3JzKSB7Ci0JUHlPYmplY3QgKnY7Ci0JCi0JdiA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoZXJyb3JzKTsKLQlpZiAodiA9PSBOVUxMKSB7Ci0JICAgIFB5X0RFQ1JFRihhcmdzKTsKLQkgICAgcmV0dXJuIE5VTEw7Ci0JfQotCVB5VHVwbGVfU0VUX0lURU0oYXJncywgMSwgdik7CisgICAgICAgIFB5T2JqZWN0ICp2OworCisgICAgICAgIHYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGVycm9ycyk7CisgICAgICAgIGlmICh2ID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihhcmdzKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIFB5VHVwbGVfU0VUX0lURU0oYXJncywgMSwgdik7CiAgICAgfQogICAgIHJldHVybiBhcmdzOwogfQpAQCAtMjEwLDcgKzIxMCw3IEBACiAKICAgICBjb2RlY3MgPSBfUHlDb2RlY19Mb29rdXAoZW5jb2RpbmcpOwogICAgIGlmIChjb2RlY3MgPT0gTlVMTCkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgdiA9IFB5VHVwbGVfR0VUX0lURU0oY29kZWNzLCBpbmRleCk7CiAgICAgUHlfREVDUkVGKGNvZGVjcyk7CiAgICAgUHlfSU5DUkVGKHYpOwpAQCAtMjIxLDIyICsyMjEsMjIgQEAKIAogc3RhdGljCiBQeU9iamVjdCAqY29kZWNfZ2V0aW5jcmVtZW50YWxjb2RlYyhjb25zdCBjaGFyICplbmNvZGluZywKLQkJCQkgICAgY29uc3QgY2hhciAqZXJyb3JzLAotCQkJCSAgICBjb25zdCBjaGFyICphdHRybmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVycm9ycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmF0dHJuYW1lKQogewogICAgIFB5T2JqZWN0ICpjb2RlY3MsICpyZXQsICppbmNjb2RlYzsKIAogICAgIGNvZGVjcyA9IF9QeUNvZGVjX0xvb2t1cChlbmNvZGluZyk7CiAgICAgaWYgKGNvZGVjcyA9PSBOVUxMKQotCXJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICBpbmNjb2RlYyA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoY29kZWNzLCBhdHRybmFtZSk7CiAgICAgUHlfREVDUkVGKGNvZGVjcyk7CiAgICAgaWYgKGluY2NvZGVjID09IE5VTEwpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIGlmIChlcnJvcnMpCi0JcmV0ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKGluY2NvZGVjLCAicyIsIGVycm9ycyk7CisgICAgICAgIHJldCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihpbmNjb2RlYywgInMiLCBlcnJvcnMpOwogICAgIGVsc2UKLQlyZXQgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oaW5jY29kZWMsIE5VTEwpOworICAgICAgICByZXQgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oaW5jY29kZWMsIE5VTEwpOwogICAgIFB5X0RFQ1JFRihpbmNjb2RlYyk7CiAgICAgcmV0dXJuIHJldDsKIH0KQEAgLTI0NSwyOSArMjQ1LDI5IEBACiAKIHN0YXRpYwogUHlPYmplY3QgKmNvZGVjX2dldHN0cmVhbWNvZGVjKGNvbnN0IGNoYXIgKmVuY29kaW5nLAotCQkJICAgICAgIFB5T2JqZWN0ICpzdHJlYW0sCi0JCQkgICAgICAgY29uc3QgY2hhciAqZXJyb3JzLAotCQkJICAgICAgIGNvbnN0IGludCBpbmRleCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVycm9ycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgaW5kZXgpCiB7CiAgICAgUHlPYmplY3QgKmNvZGVjcywgKnN0cmVhbWNvZGVjLCAqY29kZWNjbHM7CiAKICAgICBjb2RlY3MgPSBfUHlDb2RlY19Mb29rdXAoZW5jb2RpbmcpOwogICAgIGlmIChjb2RlY3MgPT0gTlVMTCkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICBjb2RlY2NscyA9IFB5VHVwbGVfR0VUX0lURU0oY29kZWNzLCBpbmRleCk7CiAgICAgaWYgKGVycm9ycyAhPSBOVUxMKQotCXN0cmVhbWNvZGVjID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKGNvZGVjY2xzLCAiT3MiLCBzdHJlYW0sIGVycm9ycyk7CisgICAgICAgIHN0cmVhbWNvZGVjID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKGNvZGVjY2xzLCAiT3MiLCBzdHJlYW0sIGVycm9ycyk7CiAgICAgZWxzZQotCXN0cmVhbWNvZGVjID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKGNvZGVjY2xzLCAiTyIsIHN0cmVhbSk7CisgICAgICAgIHN0cmVhbWNvZGVjID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKGNvZGVjY2xzLCAiTyIsIHN0cmVhbSk7CiAgICAgUHlfREVDUkVGKGNvZGVjcyk7CiAgICAgcmV0dXJuIHN0cmVhbWNvZGVjOwogfQogCi0vKiBDb252ZW5pZW5jZSBBUElzIHRvIHF1ZXJ5IHRoZSBDb2RlYyByZWdpc3RyeS4gCi0gICAKKy8qIENvbnZlbmllbmNlIEFQSXMgdG8gcXVlcnkgdGhlIENvZGVjIHJlZ2lzdHJ5LgorCiAgICBBbGwgQVBJcyByZXR1cm4gYSBjb2RlYyBvYmplY3Qgd2l0aCBpbmNyZW1lbnRlZCByZWZjb3VudC4KLSAgIAorCiAgKi8KIAogUHlPYmplY3QgKlB5Q29kZWNfRW5jb2Rlcihjb25zdCBjaGFyICplbmNvZGluZykKQEAgLTI4MSwyNyArMjgxLDI3IEBACiB9CiAKIFB5T2JqZWN0ICpQeUNvZGVjX0luY3JlbWVudGFsRW5jb2Rlcihjb25zdCBjaGFyICplbmNvZGluZywKLQkJCQkgICAgIGNvbnN0IGNoYXIgKmVycm9ycykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplcnJvcnMpCiB7CiAgICAgcmV0dXJuIGNvZGVjX2dldGluY3JlbWVudGFsY29kZWMoZW5jb2RpbmcsIGVycm9ycywgImluY3JlbWVudGFsZW5jb2RlciIpOwogfQogCiBQeU9iamVjdCAqUHlDb2RlY19JbmNyZW1lbnRhbERlY29kZXIoY29uc3QgY2hhciAqZW5jb2RpbmcsCi0JCQkJICAgICBjb25zdCBjaGFyICplcnJvcnMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZXJyb3JzKQogewogICAgIHJldHVybiBjb2RlY19nZXRpbmNyZW1lbnRhbGNvZGVjKGVuY29kaW5nLCBlcnJvcnMsICJpbmNyZW1lbnRhbGRlY29kZXIiKTsKIH0KIAogUHlPYmplY3QgKlB5Q29kZWNfU3RyZWFtUmVhZGVyKGNvbnN0IGNoYXIgKmVuY29kaW5nLAotCQkJICAgICAgIFB5T2JqZWN0ICpzdHJlYW0sCi0JCQkgICAgICAgY29uc3QgY2hhciAqZXJyb3JzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZXJyb3JzKQogewogICAgIHJldHVybiBjb2RlY19nZXRzdHJlYW1jb2RlYyhlbmNvZGluZywgc3RyZWFtLCBlcnJvcnMsIDIpOwogfQogCiBQeU9iamVjdCAqUHlDb2RlY19TdHJlYW1Xcml0ZXIoY29uc3QgY2hhciAqZW5jb2RpbmcsCi0JCQkgICAgICAgUHlPYmplY3QgKnN0cmVhbSwKLQkJCSAgICAgICBjb25zdCBjaGFyICplcnJvcnMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKnN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplcnJvcnMpCiB7CiAgICAgcmV0dXJuIGNvZGVjX2dldHN0cmVhbWNvZGVjKGVuY29kaW5nLCBzdHJlYW0sIGVycm9ycywgMyk7CiB9CkBAIC0zMTIsOCArMzEyLDggQEAKICAgIGVycm9ycyBpcyBwYXNzZWQgdG8gdGhlIGVuY29kZXIgZmFjdG9yeSBhcyBhcmd1bWVudCBpZiBub24tTlVMTC4gKi8KIAogUHlPYmplY3QgKlB5Q29kZWNfRW5jb2RlKFB5T2JqZWN0ICpvYmplY3QsCi0JCQkgY29uc3QgY2hhciAqZW5jb2RpbmcsCi0JCQkgY29uc3QgY2hhciAqZXJyb3JzKQorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVycm9ycykKIHsKICAgICBQeU9iamVjdCAqZW5jb2RlciA9IE5VTEw7CiAgICAgUHlPYmplY3QgKmFyZ3MgPSBOVUxMLCAqcmVzdWx0ID0gTlVMTDsKQEAgLTMyMSwyMSArMzIxLDIxIEBACiAKICAgICBlbmNvZGVyID0gUHlDb2RlY19FbmNvZGVyKGVuY29kaW5nKTsKICAgICBpZiAoZW5jb2RlciA9PSBOVUxMKQotCWdvdG8gb25FcnJvcjsKKyAgICAgICAgZ290byBvbkVycm9yOwogCiAgICAgYXJncyA9IGFyZ3NfdHVwbGUob2JqZWN0LCBlcnJvcnMpOwogICAgIGlmIChhcmdzID09IE5VTEwpCi0JZ290byBvbkVycm9yOwotICAgIAorICAgICAgICBnb3RvIG9uRXJyb3I7CisKICAgICByZXN1bHQgPSBQeUV2YWxfQ2FsbE9iamVjdChlbmNvZGVyLGFyZ3MpOwogICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKLQlnb3RvIG9uRXJyb3I7CisgICAgICAgIGdvdG8gb25FcnJvcjsKIAotICAgIGlmICghUHlUdXBsZV9DaGVjayhyZXN1bHQpIHx8IAotCVB5VHVwbGVfR0VUX1NJWkUocmVzdWx0KSAhPSAyKSB7Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCSJlbmNvZGVyIG11c3QgcmV0dXJuIGEgdHVwbGUgKG9iamVjdCxpbnRlZ2VyKSIpOwotCWdvdG8gb25FcnJvcjsKKyAgICBpZiAoIVB5VHVwbGVfQ2hlY2socmVzdWx0KSB8fAorICAgICAgICBQeVR1cGxlX0dFVF9TSVpFKHJlc3VsdCkgIT0gMikgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImVuY29kZXIgbXVzdCByZXR1cm4gYSB0dXBsZSAob2JqZWN0LGludGVnZXIpIik7CisgICAgICAgIGdvdG8gb25FcnJvcjsKICAgICB9CiAgICAgdiA9IFB5VHVwbGVfR0VUX0lURU0ocmVzdWx0LDApOwogICAgIFB5X0lOQ1JFRih2KTsKQEAgLTM0NSw3ICszNDUsNyBAQAogICAgIFB5X0RFQ1JFRihlbmNvZGVyKTsKICAgICBQeV9ERUNSRUYocmVzdWx0KTsKICAgICByZXR1cm4gdjsKLQkKKwogIG9uRXJyb3I6CiAgICAgUHlfWERFQ1JFRihyZXN1bHQpOwogICAgIFB5X1hERUNSRUYoYXJncyk7CkBAIC0zNTksOCArMzU5LDggQEAKICAgIGVycm9ycyBpcyBwYXNzZWQgdG8gdGhlIGRlY29kZXIgZmFjdG9yeSBhcyBhcmd1bWVudCBpZiBub24tTlVMTC4gKi8KIAogUHlPYmplY3QgKlB5Q29kZWNfRGVjb2RlKFB5T2JqZWN0ICpvYmplY3QsCi0JCQkgY29uc3QgY2hhciAqZW5jb2RpbmcsCi0JCQkgY29uc3QgY2hhciAqZXJyb3JzKQorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVycm9ycykKIHsKICAgICBQeU9iamVjdCAqZGVjb2RlciA9IE5VTEw7CiAgICAgUHlPYmplY3QgKmFyZ3MgPSBOVUxMLCAqcmVzdWx0ID0gTlVMTDsKQEAgLTM2OCwyMCArMzY4LDIwIEBACiAKICAgICBkZWNvZGVyID0gUHlDb2RlY19EZWNvZGVyKGVuY29kaW5nKTsKICAgICBpZiAoZGVjb2RlciA9PSBOVUxMKQotCWdvdG8gb25FcnJvcjsKKyAgICAgICAgZ290byBvbkVycm9yOwogCiAgICAgYXJncyA9IGFyZ3NfdHVwbGUob2JqZWN0LCBlcnJvcnMpOwogICAgIGlmIChhcmdzID09IE5VTEwpCi0JZ290byBvbkVycm9yOwotICAgIAorICAgICAgICBnb3RvIG9uRXJyb3I7CisKICAgICByZXN1bHQgPSBQeUV2YWxfQ2FsbE9iamVjdChkZWNvZGVyLGFyZ3MpOwogICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKLQlnb3RvIG9uRXJyb3I7Ci0gICAgaWYgKCFQeVR1cGxlX0NoZWNrKHJlc3VsdCkgfHwgCi0JUHlUdXBsZV9HRVRfU0laRShyZXN1bHQpICE9IDIpIHsKLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJImRlY29kZXIgbXVzdCByZXR1cm4gYSB0dXBsZSAob2JqZWN0LGludGVnZXIpIik7Ci0JZ290byBvbkVycm9yOworICAgICAgICBnb3RvIG9uRXJyb3I7CisgICAgaWYgKCFQeVR1cGxlX0NoZWNrKHJlc3VsdCkgfHwKKyAgICAgICAgUHlUdXBsZV9HRVRfU0laRShyZXN1bHQpICE9IDIpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJkZWNvZGVyIG11c3QgcmV0dXJuIGEgdHVwbGUgKG9iamVjdCxpbnRlZ2VyKSIpOworICAgICAgICBnb3RvIG9uRXJyb3I7CiAgICAgfQogICAgIHYgPSBQeVR1cGxlX0dFVF9JVEVNKHJlc3VsdCwwKTsKICAgICBQeV9JTkNSRUYodik7CkBAIC0zOTEsNyArMzkxLDcgQEAKICAgICBQeV9ERUNSRUYoZGVjb2Rlcik7CiAgICAgUHlfREVDUkVGKHJlc3VsdCk7CiAgICAgcmV0dXJuIHY7Ci0JCisKICBvbkVycm9yOgogICAgIFB5X1hERUNSRUYoYXJncyk7CiAgICAgUHlfWERFQ1JFRihkZWNvZGVyKTsKQEAgLTQwOSwxMyArNDA5LDEzIEBACiB7CiAgICAgUHlJbnRlcnByZXRlclN0YXRlICppbnRlcnAgPSBQeVRocmVhZFN0YXRlX0dFVCgpLT5pbnRlcnA7CiAgICAgaWYgKGludGVycC0+Y29kZWNfc2VhcmNoX3BhdGggPT0gTlVMTCAmJiBfUHlDb2RlY1JlZ2lzdHJ5X0luaXQoKSkKLQlyZXR1cm4gLTE7CisgICAgICAgIHJldHVybiAtMTsKICAgICBpZiAoIVB5Q2FsbGFibGVfQ2hlY2soZXJyb3IpKSB7Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImhhbmRsZXIgbXVzdCBiZSBjYWxsYWJsZSIpOwotCXJldHVybiAtMTsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImhhbmRsZXIgbXVzdCBiZSBjYWxsYWJsZSIpOworICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogICAgIHJldHVybiBQeURpY3RfU2V0SXRlbVN0cmluZyhpbnRlcnAtPmNvZGVjX2Vycm9yX3JlZ2lzdHJ5LAotCSAgICAJCQkoY2hhciAqKW5hbWUsIGVycm9yKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKiluYW1lLCBlcnJvcik7CiB9CiAKIC8qIExvb2t1cCB0aGUgZXJyb3IgaGFuZGxpbmcgY2FsbGJhY2sgZnVuY3Rpb24gcmVnaXN0ZXJlZCB1bmRlciB0aGUKQEAgLTQyNywxNSArNDI3LDE1IEBACiAKICAgICBQeUludGVycHJldGVyU3RhdGUgKmludGVycCA9IFB5VGhyZWFkU3RhdGVfR0VUKCktPmludGVycDsKICAgICBpZiAoaW50ZXJwLT5jb2RlY19zZWFyY2hfcGF0aCA9PSBOVUxMICYmIF9QeUNvZGVjUmVnaXN0cnlfSW5pdCgpKQotCXJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIGlmIChuYW1lPT1OVUxMKQotCW5hbWUgPSAic3RyaWN0IjsKKyAgICAgICAgbmFtZSA9ICJzdHJpY3QiOwogICAgIGhhbmRsZXIgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhpbnRlcnAtPmNvZGVjX2Vycm9yX3JlZ2lzdHJ5LCAoY2hhciAqKW5hbWUpOwogICAgIGlmICghaGFuZGxlcikKLQlQeUVycl9Gb3JtYXQoUHlFeGNfTG9va3VwRXJyb3IsICJ1bmtub3duIGVycm9yIGhhbmRsZXIgbmFtZSAnJS40MDBzJyIsIG5hbWUpOworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfTG9va3VwRXJyb3IsICJ1bmtub3duIGVycm9yIGhhbmRsZXIgbmFtZSAnJS40MDBzJyIsIG5hbWUpOwogICAgIGVsc2UKLQlQeV9JTkNSRUYoaGFuZGxlcik7CisgICAgICAgIFB5X0lOQ1JFRihoYW5kbGVyKTsKICAgICByZXR1cm4gaGFuZGxlcjsKIH0KIApAQCAtNDQzLDE4ICs0NDMsMTggQEAKIHsKICAgICBQeU9iamVjdCAqdHlwZSA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoZXhjLCAiX19jbGFzc19fIik7CiAgICAgaWYgKHR5cGUgIT0gTlVMTCkgewotCVB5T2JqZWN0ICpuYW1lID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyh0eXBlLCAiX19uYW1lX18iKTsKLQlQeV9ERUNSRUYodHlwZSk7Ci0JaWYgKG5hbWUgIT0gTlVMTCkgewotCSAgICBQeU9iamVjdCAqc3RyaW5nID0gUHlPYmplY3RfU3RyKG5hbWUpOwotCSAgICBQeV9ERUNSRUYobmFtZSk7Ci0JICAgIGlmIChzdHJpbmcgIT0gTlVMTCkgewotCSAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJICAgICJkb24ndCBrbm93IGhvdyB0byBoYW5kbGUgJS40MDBzIGluIGVycm9yIGNhbGxiYWNrIiwKLQkJICAgIFB5U3RyaW5nX0FTX1NUUklORyhzdHJpbmcpKTsKLQkgICAgICAgIFB5X0RFQ1JFRihzdHJpbmcpOwotCSAgICB9Ci0JfQorICAgICAgICBQeU9iamVjdCAqbmFtZSA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcodHlwZSwgIl9fbmFtZV9fIik7CisgICAgICAgIFB5X0RFQ1JFRih0eXBlKTsKKyAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkgeworICAgICAgICAgICAgUHlPYmplY3QgKnN0cmluZyA9IFB5T2JqZWN0X1N0cihuYW1lKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihuYW1lKTsKKyAgICAgICAgICAgIGlmIChzdHJpbmcgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICJkb24ndCBrbm93IGhvdyB0byBoYW5kbGUgJS40MDBzIGluIGVycm9yIGNhbGxiYWNrIiwKKyAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKHN0cmluZykpOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihzdHJpbmcpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQogfQogCkBAIC00NjMsNyArNDYzLDcgQEAKICAgICBpZiAoUHlFeGNlcHRpb25JbnN0YW5jZV9DaGVjayhleGMpKQogICAgICAgICBQeUVycl9TZXRPYmplY3QoUHlFeGNlcHRpb25JbnN0YW5jZV9DbGFzcyhleGMpLCBleGMpOwogICAgIGVsc2UKLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiY29kZWMgbXVzdCBwYXNzIGV4Y2VwdGlvbiBpbnN0YW5jZSIpOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiY29kZWMgbXVzdCBwYXNzIGV4Y2VwdGlvbiBpbnN0YW5jZSIpOwogICAgIHJldHVybiBOVUxMOwogfQogCkBAIC00NzMsMjAgKzQ3MywyMCBAQAogewogICAgIFB5X3NzaXplX3QgZW5kOwogICAgIGlmIChQeU9iamVjdF9Jc0luc3RhbmNlKGV4YywgUHlFeGNfVW5pY29kZUVuY29kZUVycm9yKSkgewotCWlmIChQeVVuaWNvZGVFbmNvZGVFcnJvcl9HZXRFbmQoZXhjLCAmZW5kKSkKLQkgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGlmIChQeVVuaWNvZGVFbmNvZGVFcnJvcl9HZXRFbmQoZXhjLCAmZW5kKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICBlbHNlIGlmIChQeU9iamVjdF9Jc0luc3RhbmNlKGV4YywgUHlFeGNfVW5pY29kZURlY29kZUVycm9yKSkgewotCWlmIChQeVVuaWNvZGVEZWNvZGVFcnJvcl9HZXRFbmQoZXhjLCAmZW5kKSkKLQkgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGlmIChQeVVuaWNvZGVEZWNvZGVFcnJvcl9HZXRFbmQoZXhjLCAmZW5kKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICBlbHNlIGlmIChQeU9iamVjdF9Jc0luc3RhbmNlKGV4YywgUHlFeGNfVW5pY29kZVRyYW5zbGF0ZUVycm9yKSkgewotCWlmIChQeVVuaWNvZGVUcmFuc2xhdGVFcnJvcl9HZXRFbmQoZXhjLCAmZW5kKSkKLQkgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGlmIChQeVVuaWNvZGVUcmFuc2xhdGVFcnJvcl9HZXRFbmQoZXhjLCAmZW5kKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICBlbHNlIHsKLQl3cm9uZ19leGNlcHRpb25fdHlwZShleGMpOwotCXJldHVybiBOVUxMOworICAgICAgICB3cm9uZ19leGNlcHRpb25fdHlwZShleGMpOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAgICAgLyogb3VjaDogcGFzc2luZyBOVUxMLCAwLCBwb3MgZ2l2ZXMgTm9uZSBpbnN0ZWFkIG9mIHUnJyAqLwogICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIodSNuKSIsICZlbmQsIDAsIGVuZCk7CkBAIC01MDEsMTU1ICs1MDEsMTU1IEBACiAgICAgUHlfc3NpemVfdCBpOwogCiAgICAgaWYgKFB5T2JqZWN0X0lzSW5zdGFuY2UoZXhjLCBQeUV4Y19Vbmljb2RlRW5jb2RlRXJyb3IpKSB7Ci0JUHlPYmplY3QgKnJlczsKLQlQeV9VTklDT0RFICpwOwotCWlmIChQeVVuaWNvZGVFbmNvZGVFcnJvcl9HZXRTdGFydChleGMsICZzdGFydCkpCi0JICAgIHJldHVybiBOVUxMOwotCWlmIChQeVVuaWNvZGVFbmNvZGVFcnJvcl9HZXRFbmQoZXhjLCAmZW5kKSkKLQkgICAgcmV0dXJuIE5VTEw7Ci0JcmVzID0gUHlVbmljb2RlX0Zyb21Vbmljb2RlKE5VTEwsIGVuZC1zdGFydCk7Ci0JaWYgKHJlcyA9PSBOVUxMKQotCSAgICByZXR1cm4gTlVMTDsKLQlmb3IgKHAgPSBQeVVuaWNvZGVfQVNfVU5JQ09ERShyZXMpLCBpID0gc3RhcnQ7Ci0JICAgIGk8ZW5kOyArK3AsICsraSkKLQkgICAgKnAgPSAnPyc7Ci0JcmVzdHVwbGUgPSBQeV9CdWlsZFZhbHVlKCIoT24pIiwgcmVzLCBlbmQpOwotCVB5X0RFQ1JFRihyZXMpOwotCXJldHVybiByZXN0dXBsZTsKKyAgICAgICAgUHlPYmplY3QgKnJlczsKKyAgICAgICAgUHlfVU5JQ09ERSAqcDsKKyAgICAgICAgaWYgKFB5VW5pY29kZUVuY29kZUVycm9yX0dldFN0YXJ0KGV4YywgJnN0YXJ0KSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBpZiAoUHlVbmljb2RlRW5jb2RlRXJyb3JfR2V0RW5kKGV4YywgJmVuZCkpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgcmVzID0gUHlVbmljb2RlX0Zyb21Vbmljb2RlKE5VTEwsIGVuZC1zdGFydCk7CisgICAgICAgIGlmIChyZXMgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBmb3IgKHAgPSBQeVVuaWNvZGVfQVNfVU5JQ09ERShyZXMpLCBpID0gc3RhcnQ7CisgICAgICAgICAgICBpPGVuZDsgKytwLCArK2kpCisgICAgICAgICAgICAqcCA9ICc/JzsKKyAgICAgICAgcmVzdHVwbGUgPSBQeV9CdWlsZFZhbHVlKCIoT24pIiwgcmVzLCBlbmQpOworICAgICAgICBQeV9ERUNSRUYocmVzKTsKKyAgICAgICAgcmV0dXJuIHJlc3R1cGxlOwogICAgIH0KICAgICBlbHNlIGlmIChQeU9iamVjdF9Jc0luc3RhbmNlKGV4YywgUHlFeGNfVW5pY29kZURlY29kZUVycm9yKSkgewotCVB5X1VOSUNPREUgcmVzID0gUHlfVU5JQ09ERV9SRVBMQUNFTUVOVF9DSEFSQUNURVI7Ci0JaWYgKFB5VW5pY29kZURlY29kZUVycm9yX0dldEVuZChleGMsICZlbmQpKQotCSAgICByZXR1cm4gTlVMTDsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKHUjbikiLCAmcmVzLCAxLCBlbmQpOworICAgICAgICBQeV9VTklDT0RFIHJlcyA9IFB5X1VOSUNPREVfUkVQTEFDRU1FTlRfQ0hBUkFDVEVSOworICAgICAgICBpZiAoUHlVbmljb2RlRGVjb2RlRXJyb3JfR2V0RW5kKGV4YywgJmVuZCkpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIih1I24pIiwgJnJlcywgMSwgZW5kKTsKICAgICB9CiAgICAgZWxzZSBpZiAoUHlPYmplY3RfSXNJbnN0YW5jZShleGMsIFB5RXhjX1VuaWNvZGVUcmFuc2xhdGVFcnJvcikpIHsKLQlQeU9iamVjdCAqcmVzOwotCVB5X1VOSUNPREUgKnA7Ci0JaWYgKFB5VW5pY29kZVRyYW5zbGF0ZUVycm9yX0dldFN0YXJ0KGV4YywgJnN0YXJ0KSkKLQkgICAgcmV0dXJuIE5VTEw7Ci0JaWYgKFB5VW5pY29kZVRyYW5zbGF0ZUVycm9yX0dldEVuZChleGMsICZlbmQpKQotCSAgICByZXR1cm4gTlVMTDsKLQlyZXMgPSBQeVVuaWNvZGVfRnJvbVVuaWNvZGUoTlVMTCwgZW5kLXN0YXJ0KTsKLQlpZiAocmVzID09IE5VTEwpCi0JICAgIHJldHVybiBOVUxMOwotCWZvciAocCA9IFB5VW5pY29kZV9BU19VTklDT0RFKHJlcyksIGkgPSBzdGFydDsKLQkgICAgaTxlbmQ7ICsrcCwgKytpKQotCSAgICAqcCA9IFB5X1VOSUNPREVfUkVQTEFDRU1FTlRfQ0hBUkFDVEVSOwotCXJlc3R1cGxlID0gUHlfQnVpbGRWYWx1ZSgiKE9uKSIsIHJlcywgZW5kKTsKLQlQeV9ERUNSRUYocmVzKTsKLQlyZXR1cm4gcmVzdHVwbGU7CisgICAgICAgIFB5T2JqZWN0ICpyZXM7CisgICAgICAgIFB5X1VOSUNPREUgKnA7CisgICAgICAgIGlmIChQeVVuaWNvZGVUcmFuc2xhdGVFcnJvcl9HZXRTdGFydChleGMsICZzdGFydCkpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKFB5VW5pY29kZVRyYW5zbGF0ZUVycm9yX0dldEVuZChleGMsICZlbmQpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHJlcyA9IFB5VW5pY29kZV9Gcm9tVW5pY29kZShOVUxMLCBlbmQtc3RhcnQpOworICAgICAgICBpZiAocmVzID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgZm9yIChwID0gUHlVbmljb2RlX0FTX1VOSUNPREUocmVzKSwgaSA9IHN0YXJ0OworICAgICAgICAgICAgaTxlbmQ7ICsrcCwgKytpKQorICAgICAgICAgICAgKnAgPSBQeV9VTklDT0RFX1JFUExBQ0VNRU5UX0NIQVJBQ1RFUjsKKyAgICAgICAgcmVzdHVwbGUgPSBQeV9CdWlsZFZhbHVlKCIoT24pIiwgcmVzLCBlbmQpOworICAgICAgICBQeV9ERUNSRUYocmVzKTsKKyAgICAgICAgcmV0dXJuIHJlc3R1cGxlOwogICAgIH0KICAgICBlbHNlIHsKLQl3cm9uZ19leGNlcHRpb25fdHlwZShleGMpOwotCXJldHVybiBOVUxMOworICAgICAgICB3cm9uZ19leGNlcHRpb25fdHlwZShleGMpOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiB9CiAKIFB5T2JqZWN0ICpQeUNvZGVjX1hNTENoYXJSZWZSZXBsYWNlRXJyb3JzKFB5T2JqZWN0ICpleGMpCiB7CiAgICAgaWYgKFB5T2JqZWN0X0lzSW5zdGFuY2UoZXhjLCBQeUV4Y19Vbmljb2RlRW5jb2RlRXJyb3IpKSB7Ci0JUHlPYmplY3QgKnJlc3R1cGxlOwotCVB5T2JqZWN0ICpvYmplY3Q7Ci0JUHlfc3NpemVfdCBzdGFydDsKLQlQeV9zc2l6ZV90IGVuZDsKLQlQeU9iamVjdCAqcmVzOwotCVB5X1VOSUNPREUgKnA7Ci0JUHlfVU5JQ09ERSAqc3RhcnRwOwotCVB5X1VOSUNPREUgKm91dHA7Ci0JaW50IHJlc3NpemU7Ci0JaWYgKFB5VW5pY29kZUVuY29kZUVycm9yX0dldFN0YXJ0KGV4YywgJnN0YXJ0KSkKLQkgICAgcmV0dXJuIE5VTEw7Ci0JaWYgKFB5VW5pY29kZUVuY29kZUVycm9yX0dldEVuZChleGMsICZlbmQpKQotCSAgICByZXR1cm4gTlVMTDsKLQlpZiAoIShvYmplY3QgPSBQeVVuaWNvZGVFbmNvZGVFcnJvcl9HZXRPYmplY3QoZXhjKSkpCi0JICAgIHJldHVybiBOVUxMOwotCXN0YXJ0cCA9IFB5VW5pY29kZV9BU19VTklDT0RFKG9iamVjdCk7Ci0JZm9yIChwID0gc3RhcnRwK3N0YXJ0LCByZXNzaXplID0gMDsgcCA8IHN0YXJ0cCtlbmQ7ICsrcCkgewotCSAgICBpZiAoKnA8MTApCi0JCXJlc3NpemUgKz0gMisxKzE7Ci0JICAgIGVsc2UgaWYgKCpwPDEwMCkKLQkJcmVzc2l6ZSArPSAyKzIrMTsKLQkgICAgZWxzZSBpZiAoKnA8MTAwMCkKLQkJcmVzc2l6ZSArPSAyKzMrMTsKLQkgICAgZWxzZSBpZiAoKnA8MTAwMDApCi0JCXJlc3NpemUgKz0gMis0KzE7CisgICAgICAgIFB5T2JqZWN0ICpyZXN0dXBsZTsKKyAgICAgICAgUHlPYmplY3QgKm9iamVjdDsKKyAgICAgICAgUHlfc3NpemVfdCBzdGFydDsKKyAgICAgICAgUHlfc3NpemVfdCBlbmQ7CisgICAgICAgIFB5T2JqZWN0ICpyZXM7CisgICAgICAgIFB5X1VOSUNPREUgKnA7CisgICAgICAgIFB5X1VOSUNPREUgKnN0YXJ0cDsKKyAgICAgICAgUHlfVU5JQ09ERSAqb3V0cDsKKyAgICAgICAgaW50IHJlc3NpemU7CisgICAgICAgIGlmIChQeVVuaWNvZGVFbmNvZGVFcnJvcl9HZXRTdGFydChleGMsICZzdGFydCkpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKFB5VW5pY29kZUVuY29kZUVycm9yX0dldEVuZChleGMsICZlbmQpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGlmICghKG9iamVjdCA9IFB5VW5pY29kZUVuY29kZUVycm9yX0dldE9iamVjdChleGMpKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBzdGFydHAgPSBQeVVuaWNvZGVfQVNfVU5JQ09ERShvYmplY3QpOworICAgICAgICBmb3IgKHAgPSBzdGFydHArc3RhcnQsIHJlc3NpemUgPSAwOyBwIDwgc3RhcnRwK2VuZDsgKytwKSB7CisgICAgICAgICAgICBpZiAoKnA8MTApCisgICAgICAgICAgICAgICAgcmVzc2l6ZSArPSAyKzErMTsKKyAgICAgICAgICAgIGVsc2UgaWYgKCpwPDEwMCkKKyAgICAgICAgICAgICAgICByZXNzaXplICs9IDIrMisxOworICAgICAgICAgICAgZWxzZSBpZiAoKnA8MTAwMCkKKyAgICAgICAgICAgICAgICByZXNzaXplICs9IDIrMysxOworICAgICAgICAgICAgZWxzZSBpZiAoKnA8MTAwMDApCisgICAgICAgICAgICAgICAgcmVzc2l6ZSArPSAyKzQrMTsKICNpZm5kZWYgUHlfVU5JQ09ERV9XSURFCi0JICAgIGVsc2UKLQkJcmVzc2l6ZSArPSAyKzUrMTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXNzaXplICs9IDIrNSsxOwogI2Vsc2UKLQkgICAgZWxzZSBpZiAoKnA8MTAwMDAwKQotCQlyZXNzaXplICs9IDIrNSsxOwotCSAgICBlbHNlIGlmICgqcDwxMDAwMDAwKQotCQlyZXNzaXplICs9IDIrNisxOwotCSAgICBlbHNlCi0JCXJlc3NpemUgKz0gMis3KzE7CisgICAgICAgICAgICBlbHNlIGlmICgqcDwxMDAwMDApCisgICAgICAgICAgICAgICAgcmVzc2l6ZSArPSAyKzUrMTsKKyAgICAgICAgICAgIGVsc2UgaWYgKCpwPDEwMDAwMDApCisgICAgICAgICAgICAgICAgcmVzc2l6ZSArPSAyKzYrMTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXNzaXplICs9IDIrNysxOwogI2VuZGlmCi0JfQotCS8qIGFsbG9jYXRlIHJlcGxhY2VtZW50ICovCi0JcmVzID0gUHlVbmljb2RlX0Zyb21Vbmljb2RlKE5VTEwsIHJlc3NpemUpOwotCWlmIChyZXMgPT0gTlVMTCkgewotCSAgICBQeV9ERUNSRUYob2JqZWN0KTsKLQkgICAgcmV0dXJuIE5VTEw7Ci0JfQotCS8qIGdlbmVyYXRlIHJlcGxhY2VtZW50ICovCi0JZm9yIChwID0gc3RhcnRwK3N0YXJ0LCBvdXRwID0gUHlVbmljb2RlX0FTX1VOSUNPREUocmVzKTsKLQkgICAgcCA8IHN0YXJ0cCtlbmQ7ICsrcCkgewotCSAgICBQeV9VTklDT0RFIGMgPSAqcDsKLQkgICAgaW50IGRpZ2l0czsKLQkgICAgaW50IGJhc2U7Ci0JICAgICpvdXRwKysgPSAnJic7Ci0JICAgICpvdXRwKysgPSAnIyc7Ci0JICAgIGlmICgqcDwxMCkgewotCQlkaWdpdHMgPSAxOwotCQliYXNlID0gMTsKLQkgICAgfQotCSAgICBlbHNlIGlmICgqcDwxMDApIHsKLQkJZGlnaXRzID0gMjsKLQkJYmFzZSA9IDEwOwotCSAgICB9Ci0JICAgIGVsc2UgaWYgKCpwPDEwMDApIHsKLQkJZGlnaXRzID0gMzsKLQkJYmFzZSA9IDEwMDsKLQkgICAgfQotCSAgICBlbHNlIGlmICgqcDwxMDAwMCkgewotCQlkaWdpdHMgPSA0OwotCQliYXNlID0gMTAwMDsKLQkgICAgfQorICAgICAgICB9CisgICAgICAgIC8qIGFsbG9jYXRlIHJlcGxhY2VtZW50ICovCisgICAgICAgIHJlcyA9IFB5VW5pY29kZV9Gcm9tVW5pY29kZShOVUxMLCByZXNzaXplKTsKKyAgICAgICAgaWYgKHJlcyA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYob2JqZWN0KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIC8qIGdlbmVyYXRlIHJlcGxhY2VtZW50ICovCisgICAgICAgIGZvciAocCA9IHN0YXJ0cCtzdGFydCwgb3V0cCA9IFB5VW5pY29kZV9BU19VTklDT0RFKHJlcyk7CisgICAgICAgICAgICBwIDwgc3RhcnRwK2VuZDsgKytwKSB7CisgICAgICAgICAgICBQeV9VTklDT0RFIGMgPSAqcDsKKyAgICAgICAgICAgIGludCBkaWdpdHM7CisgICAgICAgICAgICBpbnQgYmFzZTsKKyAgICAgICAgICAgICpvdXRwKysgPSAnJic7CisgICAgICAgICAgICAqb3V0cCsrID0gJyMnOworICAgICAgICAgICAgaWYgKCpwPDEwKSB7CisgICAgICAgICAgICAgICAgZGlnaXRzID0gMTsKKyAgICAgICAgICAgICAgICBiYXNlID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCpwPDEwMCkgeworICAgICAgICAgICAgICAgIGRpZ2l0cyA9IDI7CisgICAgICAgICAgICAgICAgYmFzZSA9IDEwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoKnA8MTAwMCkgeworICAgICAgICAgICAgICAgIGRpZ2l0cyA9IDM7CisgICAgICAgICAgICAgICAgYmFzZSA9IDEwMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCpwPDEwMDAwKSB7CisgICAgICAgICAgICAgICAgZGlnaXRzID0gNDsKKyAgICAgICAgICAgICAgICBiYXNlID0gMTAwMDsKKyAgICAgICAgICAgIH0KICNpZm5kZWYgUHlfVU5JQ09ERV9XSURFCi0JICAgIGVsc2UgewotCQlkaWdpdHMgPSA1OwotCQliYXNlID0gMTAwMDA7Ci0JICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGRpZ2l0cyA9IDU7CisgICAgICAgICAgICAgICAgYmFzZSA9IDEwMDAwOworICAgICAgICAgICAgfQogI2Vsc2UKLQkgICAgZWxzZSBpZiAoKnA8MTAwMDAwKSB7Ci0JCWRpZ2l0cyA9IDU7Ci0JCWJhc2UgPSAxMDAwMDsKLQkgICAgfQotCSAgICBlbHNlIGlmICgqcDwxMDAwMDAwKSB7Ci0JCWRpZ2l0cyA9IDY7Ci0JCWJhc2UgPSAxMDAwMDA7Ci0JICAgIH0KLQkgICAgZWxzZSB7Ci0JCWRpZ2l0cyA9IDc7Ci0JCWJhc2UgPSAxMDAwMDAwOwotCSAgICB9CisgICAgICAgICAgICBlbHNlIGlmICgqcDwxMDAwMDApIHsKKyAgICAgICAgICAgICAgICBkaWdpdHMgPSA1OworICAgICAgICAgICAgICAgIGJhc2UgPSAxMDAwMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCpwPDEwMDAwMDApIHsKKyAgICAgICAgICAgICAgICBkaWdpdHMgPSA2OworICAgICAgICAgICAgICAgIGJhc2UgPSAxMDAwMDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBkaWdpdHMgPSA3OworICAgICAgICAgICAgICAgIGJhc2UgPSAxMDAwMDAwOworICAgICAgICAgICAgfQogI2VuZGlmCi0JICAgIHdoaWxlIChkaWdpdHMtLT4wKSB7Ci0JCSpvdXRwKysgPSAnMCcgKyBjL2Jhc2U7Ci0JCWMgJT0gYmFzZTsKLQkJYmFzZSAvPSAxMDsKLQkgICAgfQotCSAgICAqb3V0cCsrID0gJzsnOwotCX0KLQlyZXN0dXBsZSA9IFB5X0J1aWxkVmFsdWUoIihPbikiLCByZXMsIGVuZCk7Ci0JUHlfREVDUkVGKHJlcyk7Ci0JUHlfREVDUkVGKG9iamVjdCk7Ci0JcmV0dXJuIHJlc3R1cGxlOworICAgICAgICAgICAgd2hpbGUgKGRpZ2l0cy0tPjApIHsKKyAgICAgICAgICAgICAgICAqb3V0cCsrID0gJzAnICsgYy9iYXNlOworICAgICAgICAgICAgICAgIGMgJT0gYmFzZTsKKyAgICAgICAgICAgICAgICBiYXNlIC89IDEwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKm91dHArKyA9ICc7JzsKKyAgICAgICAgfQorICAgICAgICByZXN0dXBsZSA9IFB5X0J1aWxkVmFsdWUoIihPbikiLCByZXMsIGVuZCk7CisgICAgICAgIFB5X0RFQ1JFRihyZXMpOworICAgICAgICBQeV9ERUNSRUYob2JqZWN0KTsKKyAgICAgICAgcmV0dXJuIHJlc3R1cGxlOwogICAgIH0KICAgICBlbHNlIHsKLQl3cm9uZ19leGNlcHRpb25fdHlwZShleGMpOwotCXJldHVybiBOVUxMOworICAgICAgICB3cm9uZ19leGNlcHRpb25fdHlwZShleGMpOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiB9CiAKQEAgLTY2MSw3MiArNjYxLDcyIEBACiBQeU9iamVjdCAqUHlDb2RlY19CYWNrc2xhc2hSZXBsYWNlRXJyb3JzKFB5T2JqZWN0ICpleGMpCiB7CiAgICAgaWYgKFB5T2JqZWN0X0lzSW5zdGFuY2UoZXhjLCBQeUV4Y19Vbmljb2RlRW5jb2RlRXJyb3IpKSB7Ci0JUHlPYmplY3QgKnJlc3R1cGxlOwotCVB5T2JqZWN0ICpvYmplY3Q7Ci0JUHlfc3NpemVfdCBzdGFydDsKLQlQeV9zc2l6ZV90IGVuZDsKLQlQeU9iamVjdCAqcmVzOwotCVB5X1VOSUNPREUgKnA7Ci0JUHlfVU5JQ09ERSAqc3RhcnRwOwotCVB5X1VOSUNPREUgKm91dHA7Ci0JaW50IHJlc3NpemU7Ci0JaWYgKFB5VW5pY29kZUVuY29kZUVycm9yX0dldFN0YXJ0KGV4YywgJnN0YXJ0KSkKLQkgICAgcmV0dXJuIE5VTEw7Ci0JaWYgKFB5VW5pY29kZUVuY29kZUVycm9yX0dldEVuZChleGMsICZlbmQpKQotCSAgICByZXR1cm4gTlVMTDsKLQlpZiAoIShvYmplY3QgPSBQeVVuaWNvZGVFbmNvZGVFcnJvcl9HZXRPYmplY3QoZXhjKSkpCi0JICAgIHJldHVybiBOVUxMOwotCXN0YXJ0cCA9IFB5VW5pY29kZV9BU19VTklDT0RFKG9iamVjdCk7Ci0JZm9yIChwID0gc3RhcnRwK3N0YXJ0LCByZXNzaXplID0gMDsgcCA8IHN0YXJ0cCtlbmQ7ICsrcCkgeworICAgICAgICBQeU9iamVjdCAqcmVzdHVwbGU7CisgICAgICAgIFB5T2JqZWN0ICpvYmplY3Q7CisgICAgICAgIFB5X3NzaXplX3Qgc3RhcnQ7CisgICAgICAgIFB5X3NzaXplX3QgZW5kOworICAgICAgICBQeU9iamVjdCAqcmVzOworICAgICAgICBQeV9VTklDT0RFICpwOworICAgICAgICBQeV9VTklDT0RFICpzdGFydHA7CisgICAgICAgIFB5X1VOSUNPREUgKm91dHA7CisgICAgICAgIGludCByZXNzaXplOworICAgICAgICBpZiAoUHlVbmljb2RlRW5jb2RlRXJyb3JfR2V0U3RhcnQoZXhjLCAmc3RhcnQpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGlmIChQeVVuaWNvZGVFbmNvZGVFcnJvcl9HZXRFbmQoZXhjLCAmZW5kKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBpZiAoIShvYmplY3QgPSBQeVVuaWNvZGVFbmNvZGVFcnJvcl9HZXRPYmplY3QoZXhjKSkpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgc3RhcnRwID0gUHlVbmljb2RlX0FTX1VOSUNPREUob2JqZWN0KTsKKyAgICAgICAgZm9yIChwID0gc3RhcnRwK3N0YXJ0LCByZXNzaXplID0gMDsgcCA8IHN0YXJ0cCtlbmQ7ICsrcCkgewogI2lmZGVmIFB5X1VOSUNPREVfV0lERQotCSAgICBpZiAoKnAgPj0gMHgwMDAxMDAwMCkKLQkJcmVzc2l6ZSArPSAxKzErODsKLQkgICAgZWxzZQorICAgICAgICAgICAgaWYgKCpwID49IDB4MDAwMTAwMDApCisgICAgICAgICAgICAgICAgcmVzc2l6ZSArPSAxKzErODsKKyAgICAgICAgICAgIGVsc2UKICNlbmRpZgotCSAgICBpZiAoKnAgPj0gMHgxMDApIHsKLQkJcmVzc2l6ZSArPSAxKzErNDsKLQkgICAgfQotCSAgICBlbHNlCi0JCXJlc3NpemUgKz0gMSsxKzI7Ci0JfQotCXJlcyA9IFB5VW5pY29kZV9Gcm9tVW5pY29kZShOVUxMLCByZXNzaXplKTsKLQlpZiAocmVzPT1OVUxMKQotCSAgICByZXR1cm4gTlVMTDsKLQlmb3IgKHAgPSBzdGFydHArc3RhcnQsIG91dHAgPSBQeVVuaWNvZGVfQVNfVU5JQ09ERShyZXMpOwotCSAgICBwIDwgc3RhcnRwK2VuZDsgKytwKSB7Ci0JICAgIFB5X1VOSUNPREUgYyA9ICpwOwotCSAgICAqb3V0cCsrID0gJ1xcJzsKKyAgICAgICAgICAgIGlmICgqcCA+PSAweDEwMCkgeworICAgICAgICAgICAgICAgIHJlc3NpemUgKz0gMSsxKzQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmVzc2l6ZSArPSAxKzErMjsKKyAgICAgICAgfQorICAgICAgICByZXMgPSBQeVVuaWNvZGVfRnJvbVVuaWNvZGUoTlVMTCwgcmVzc2l6ZSk7CisgICAgICAgIGlmIChyZXM9PU5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgZm9yIChwID0gc3RhcnRwK3N0YXJ0LCBvdXRwID0gUHlVbmljb2RlX0FTX1VOSUNPREUocmVzKTsKKyAgICAgICAgICAgIHAgPCBzdGFydHArZW5kOyArK3ApIHsKKyAgICAgICAgICAgIFB5X1VOSUNPREUgYyA9ICpwOworICAgICAgICAgICAgKm91dHArKyA9ICdcXCc7CiAjaWZkZWYgUHlfVU5JQ09ERV9XSURFCi0JICAgIGlmIChjID49IDB4MDAwMTAwMDApIHsKLQkJKm91dHArKyA9ICdVJzsKLQkJKm91dHArKyA9IGhleGRpZ2l0c1soYz4+MjgpJjB4Zl07Ci0JCSpvdXRwKysgPSBoZXhkaWdpdHNbKGM+PjI0KSYweGZdOwotCQkqb3V0cCsrID0gaGV4ZGlnaXRzWyhjPj4yMCkmMHhmXTsKLQkJKm91dHArKyA9IGhleGRpZ2l0c1soYz4+MTYpJjB4Zl07Ci0JCSpvdXRwKysgPSBoZXhkaWdpdHNbKGM+PjEyKSYweGZdOwotCQkqb3V0cCsrID0gaGV4ZGlnaXRzWyhjPj44KSYweGZdOwotCSAgICB9Ci0JICAgIGVsc2UKKyAgICAgICAgICAgIGlmIChjID49IDB4MDAwMTAwMDApIHsKKyAgICAgICAgICAgICAgICAqb3V0cCsrID0gJ1UnOworICAgICAgICAgICAgICAgICpvdXRwKysgPSBoZXhkaWdpdHNbKGM+PjI4KSYweGZdOworICAgICAgICAgICAgICAgICpvdXRwKysgPSBoZXhkaWdpdHNbKGM+PjI0KSYweGZdOworICAgICAgICAgICAgICAgICpvdXRwKysgPSBoZXhkaWdpdHNbKGM+PjIwKSYweGZdOworICAgICAgICAgICAgICAgICpvdXRwKysgPSBoZXhkaWdpdHNbKGM+PjE2KSYweGZdOworICAgICAgICAgICAgICAgICpvdXRwKysgPSBoZXhkaWdpdHNbKGM+PjEyKSYweGZdOworICAgICAgICAgICAgICAgICpvdXRwKysgPSBoZXhkaWdpdHNbKGM+PjgpJjB4Zl07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCiAjZW5kaWYKLQkgICAgaWYgKGMgPj0gMHgxMDApIHsKLQkJKm91dHArKyA9ICd1JzsKLQkJKm91dHArKyA9IGhleGRpZ2l0c1soYz4+MTIpJjB4Zl07Ci0JCSpvdXRwKysgPSBoZXhkaWdpdHNbKGM+PjgpJjB4Zl07Ci0JICAgIH0KLQkgICAgZWxzZQotCQkqb3V0cCsrID0gJ3gnOwotCSAgICAqb3V0cCsrID0gaGV4ZGlnaXRzWyhjPj40KSYweGZdOwotCSAgICAqb3V0cCsrID0gaGV4ZGlnaXRzW2MmMHhmXTsKLQl9CisgICAgICAgICAgICBpZiAoYyA+PSAweDEwMCkgeworICAgICAgICAgICAgICAgICpvdXRwKysgPSAndSc7CisgICAgICAgICAgICAgICAgKm91dHArKyA9IGhleGRpZ2l0c1soYz4+MTIpJjB4Zl07CisgICAgICAgICAgICAgICAgKm91dHArKyA9IGhleGRpZ2l0c1soYz4+OCkmMHhmXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAqb3V0cCsrID0gJ3gnOworICAgICAgICAgICAgKm91dHArKyA9IGhleGRpZ2l0c1soYz4+NCkmMHhmXTsKKyAgICAgICAgICAgICpvdXRwKysgPSBoZXhkaWdpdHNbYyYweGZdOworICAgICAgICB9CiAKLQlyZXN0dXBsZSA9IFB5X0J1aWxkVmFsdWUoIihPbikiLCByZXMsIGVuZCk7Ci0JUHlfREVDUkVGKHJlcyk7Ci0JUHlfREVDUkVGKG9iamVjdCk7Ci0JcmV0dXJuIHJlc3R1cGxlOworICAgICAgICByZXN0dXBsZSA9IFB5X0J1aWxkVmFsdWUoIihPbikiLCByZXMsIGVuZCk7CisgICAgICAgIFB5X0RFQ1JFRihyZXMpOworICAgICAgICBQeV9ERUNSRUYob2JqZWN0KTsKKyAgICAgICAgcmV0dXJuIHJlc3R1cGxlOwogICAgIH0KICAgICBlbHNlIHsKLQl3cm9uZ19leGNlcHRpb25fdHlwZShleGMpOwotCXJldHVybiBOVUxMOworICAgICAgICB3cm9uZ19leGNlcHRpb25fdHlwZShleGMpOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiB9CiAjZW5kaWYKQEAgLTc2NSw2MyArNzY1LDYzIEBACiBzdGF0aWMgaW50IF9QeUNvZGVjUmVnaXN0cnlfSW5pdCh2b2lkKQogewogICAgIHN0YXRpYyBzdHJ1Y3QgewotCWNoYXIgKm5hbWU7Ci0JUHlNZXRob2REZWYgZGVmOworICAgICAgICBjaGFyICpuYW1lOworICAgICAgICBQeU1ldGhvZERlZiBkZWY7CiAgICAgfSBtZXRob2RzW10gPQogICAgIHsKLQl7Ci0JICAgICJzdHJpY3QiLAotCSAgICB7Ci0JCSJzdHJpY3RfZXJyb3JzIiwKLQkJc3RyaWN0X2Vycm9ycywKLQkJTUVUSF9PLAotCQlQeURvY19TVFIoIkltcGxlbWVudHMgdGhlICdzdHJpY3QnIGVycm9yIGhhbmRsaW5nLCB3aGljaCAiCi0JCQkgICJyYWlzZXMgYSBVbmljb2RlRXJyb3Igb24gY29kaW5nIGVycm9ycy4iKQotCSAgICB9Ci0JfSwKKyAgICAgICAgeworICAgICAgICAgICAgInN0cmljdCIsCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgInN0cmljdF9lcnJvcnMiLAorICAgICAgICAgICAgICAgIHN0cmljdF9lcnJvcnMsCisgICAgICAgICAgICAgICAgTUVUSF9PLAorICAgICAgICAgICAgICAgIFB5RG9jX1NUUigiSW1wbGVtZW50cyB0aGUgJ3N0cmljdCcgZXJyb3IgaGFuZGxpbmcsIHdoaWNoICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInJhaXNlcyBhIFVuaWNvZGVFcnJvciBvbiBjb2RpbmcgZXJyb3JzLiIpCisgICAgICAgICAgICB9CisgICAgICAgIH0sCiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCXsKLQkgICAgImlnbm9yZSIsCi0JICAgIHsKLQkJImlnbm9yZV9lcnJvcnMiLAotCQlpZ25vcmVfZXJyb3JzLAotCQlNRVRIX08sCi0JCVB5RG9jX1NUUigiSW1wbGVtZW50cyB0aGUgJ2lnbm9yZScgZXJyb3IgaGFuZGxpbmcsIHdoaWNoICIKLQkJCSAgImlnbm9yZXMgbWFsZm9ybWVkIGRhdGEgYW5kIGNvbnRpbnVlcy4iKQotCSAgICB9Ci0JfSwKLQl7Ci0JICAgICJyZXBsYWNlIiwKLQkgICAgewotCQkicmVwbGFjZV9lcnJvcnMiLAotCQlyZXBsYWNlX2Vycm9ycywKLQkJTUVUSF9PLAotCQlQeURvY19TVFIoIkltcGxlbWVudHMgdGhlICdyZXBsYWNlJyBlcnJvciBoYW5kbGluZywgd2hpY2ggIgotCQkJICAicmVwbGFjZXMgbWFsZm9ybWVkIGRhdGEgd2l0aCBhIHJlcGxhY2VtZW50IG1hcmtlci4iKQotCSAgICB9Ci0JfSwKLQl7Ci0JICAgICJ4bWxjaGFycmVmcmVwbGFjZSIsCi0JICAgIHsKLQkJInhtbGNoYXJyZWZyZXBsYWNlX2Vycm9ycyIsCi0JCXhtbGNoYXJyZWZyZXBsYWNlX2Vycm9ycywKLQkJTUVUSF9PLAotCQlQeURvY19TVFIoIkltcGxlbWVudHMgdGhlICd4bWxjaGFycmVmcmVwbGFjZScgZXJyb3IgaGFuZGxpbmcsICIKLQkJCSAgIndoaWNoIHJlcGxhY2VzIGFuIHVuZW5jb2RhYmxlIGNoYXJhY3RlciB3aXRoIHRoZSAiCi0JCQkgICJhcHByb3ByaWF0ZSBYTUwgY2hhcmFjdGVyIHJlZmVyZW5jZS4iKQotCSAgICB9Ci0JfSwKLQl7Ci0JICAgICJiYWNrc2xhc2hyZXBsYWNlIiwKLQkgICAgewotCQkiYmFja3NsYXNocmVwbGFjZV9lcnJvcnMiLAotCQliYWNrc2xhc2hyZXBsYWNlX2Vycm9ycywKLQkJTUVUSF9PLAotCQlQeURvY19TVFIoIkltcGxlbWVudHMgdGhlICdiYWNrc2xhc2hyZXBsYWNlJyBlcnJvciBoYW5kbGluZywgIgotCQkJICAid2hpY2ggcmVwbGFjZXMgYW4gdW5lbmNvZGFibGUgY2hhcmFjdGVyIHdpdGggYSAiCi0JCQkgICJiYWNrc2xhc2hlZCBlc2NhcGUgc2VxdWVuY2UuIikKLQkgICAgfQotCX0KKyAgICAgICAgeworICAgICAgICAgICAgImlnbm9yZSIsCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImlnbm9yZV9lcnJvcnMiLAorICAgICAgICAgICAgICAgIGlnbm9yZV9lcnJvcnMsCisgICAgICAgICAgICAgICAgTUVUSF9PLAorICAgICAgICAgICAgICAgIFB5RG9jX1NUUigiSW1wbGVtZW50cyB0aGUgJ2lnbm9yZScgZXJyb3IgaGFuZGxpbmcsIHdoaWNoICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImlnbm9yZXMgbWFsZm9ybWVkIGRhdGEgYW5kIGNvbnRpbnVlcy4iKQorICAgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAicmVwbGFjZSIsCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgInJlcGxhY2VfZXJyb3JzIiwKKyAgICAgICAgICAgICAgICByZXBsYWNlX2Vycm9ycywKKyAgICAgICAgICAgICAgICBNRVRIX08sCisgICAgICAgICAgICAgICAgUHlEb2NfU1RSKCJJbXBsZW1lbnRzIHRoZSAncmVwbGFjZScgZXJyb3IgaGFuZGxpbmcsIHdoaWNoICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInJlcGxhY2VzIG1hbGZvcm1lZCBkYXRhIHdpdGggYSByZXBsYWNlbWVudCBtYXJrZXIuIikKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgInhtbGNoYXJyZWZyZXBsYWNlIiwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAieG1sY2hhcnJlZnJlcGxhY2VfZXJyb3JzIiwKKyAgICAgICAgICAgICAgICB4bWxjaGFycmVmcmVwbGFjZV9lcnJvcnMsCisgICAgICAgICAgICAgICAgTUVUSF9PLAorICAgICAgICAgICAgICAgIFB5RG9jX1NUUigiSW1wbGVtZW50cyB0aGUgJ3htbGNoYXJyZWZyZXBsYWNlJyBlcnJvciBoYW5kbGluZywgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAid2hpY2ggcmVwbGFjZXMgYW4gdW5lbmNvZGFibGUgY2hhcmFjdGVyIHdpdGggdGhlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImFwcHJvcHJpYXRlIFhNTCBjaGFyYWN0ZXIgcmVmZXJlbmNlLiIpCisgICAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJiYWNrc2xhc2hyZXBsYWNlIiwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiYmFja3NsYXNocmVwbGFjZV9lcnJvcnMiLAorICAgICAgICAgICAgICAgIGJhY2tzbGFzaHJlcGxhY2VfZXJyb3JzLAorICAgICAgICAgICAgICAgIE1FVEhfTywKKyAgICAgICAgICAgICAgICBQeURvY19TVFIoIkltcGxlbWVudHMgdGhlICdiYWNrc2xhc2hyZXBsYWNlJyBlcnJvciBoYW5kbGluZywgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAid2hpY2ggcmVwbGFjZXMgYW4gdW5lbmNvZGFibGUgY2hhcmFjdGVyIHdpdGggYSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJiYWNrc2xhc2hlZCBlc2NhcGUgc2VxdWVuY2UuIikKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogI2VuZGlmCiAgICAgfTsKIApAQCAtODMwLDQyICs4MzAsNDIgQEAKICAgICB1bnNpZ25lZCBpOwogCiAgICAgaWYgKGludGVycC0+Y29kZWNfc2VhcmNoX3BhdGggIT0gTlVMTCkKLQlyZXR1cm4gMDsKKyAgICAgICAgcmV0dXJuIDA7CiAKICAgICBpbnRlcnAtPmNvZGVjX3NlYXJjaF9wYXRoID0gUHlMaXN0X05ldygwKTsKICAgICBpbnRlcnAtPmNvZGVjX3NlYXJjaF9jYWNoZSA9IFB5RGljdF9OZXcoKTsKICAgICBpbnRlcnAtPmNvZGVjX2Vycm9yX3JlZ2lzdHJ5ID0gUHlEaWN0X05ldygpOwogCiAgICAgaWYgKGludGVycC0+Y29kZWNfZXJyb3JfcmVnaXN0cnkpIHsKLQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKG1ldGhvZHMpL3NpemVvZihtZXRob2RzWzBdKTsgKytpKSB7Ci0JICAgIFB5T2JqZWN0ICpmdW5jID0gUHlDRnVuY3Rpb25fTmV3KCZtZXRob2RzW2ldLmRlZiwgTlVMTCk7Ci0JICAgIGludCByZXM7Ci0JICAgIGlmICghZnVuYykKLQkJUHlfRmF0YWxFcnJvcigiY2FuJ3QgaW5pdGlhbGl6ZSBjb2RlYyBlcnJvciByZWdpc3RyeSIpOwotCSAgICByZXMgPSBQeUNvZGVjX1JlZ2lzdGVyRXJyb3IobWV0aG9kc1tpXS5uYW1lLCBmdW5jKTsKLQkgICAgUHlfREVDUkVGKGZ1bmMpOwotCSAgICBpZiAocmVzKQotCQlQeV9GYXRhbEVycm9yKCJjYW4ndCBpbml0aWFsaXplIGNvZGVjIGVycm9yIHJlZ2lzdHJ5Iik7Ci0JfQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKG1ldGhvZHMpL3NpemVvZihtZXRob2RzWzBdKTsgKytpKSB7CisgICAgICAgICAgICBQeU9iamVjdCAqZnVuYyA9IFB5Q0Z1bmN0aW9uX05ldygmbWV0aG9kc1tpXS5kZWYsIE5VTEwpOworICAgICAgICAgICAgaW50IHJlczsKKyAgICAgICAgICAgIGlmICghZnVuYykKKyAgICAgICAgICAgICAgICBQeV9GYXRhbEVycm9yKCJjYW4ndCBpbml0aWFsaXplIGNvZGVjIGVycm9yIHJlZ2lzdHJ5Iik7CisgICAgICAgICAgICByZXMgPSBQeUNvZGVjX1JlZ2lzdGVyRXJyb3IobWV0aG9kc1tpXS5uYW1lLCBmdW5jKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihmdW5jKTsKKyAgICAgICAgICAgIGlmIChyZXMpCisgICAgICAgICAgICAgICAgUHlfRmF0YWxFcnJvcigiY2FuJ3QgaW5pdGlhbGl6ZSBjb2RlYyBlcnJvciByZWdpc3RyeSIpOworICAgICAgICB9CiAgICAgfQogCiAgICAgaWYgKGludGVycC0+Y29kZWNfc2VhcmNoX3BhdGggPT0gTlVMTCB8fAotCWludGVycC0+Y29kZWNfc2VhcmNoX2NhY2hlID09IE5VTEwgfHwKLQlpbnRlcnAtPmNvZGVjX2Vycm9yX3JlZ2lzdHJ5ID09IE5VTEwpCi0JUHlfRmF0YWxFcnJvcigiY2FuJ3QgaW5pdGlhbGl6ZSBjb2RlYyByZWdpc3RyeSIpOworICAgICAgICBpbnRlcnAtPmNvZGVjX3NlYXJjaF9jYWNoZSA9PSBOVUxMIHx8CisgICAgICAgIGludGVycC0+Y29kZWNfZXJyb3JfcmVnaXN0cnkgPT0gTlVMTCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiY2FuJ3QgaW5pdGlhbGl6ZSBjb2RlYyByZWdpc3RyeSIpOwogCiAgICAgbW9kID0gUHlJbXBvcnRfSW1wb3J0TW9kdWxlTGV2ZWwoImVuY29kaW5ncyIsIE5VTEwsIE5VTEwsIE5VTEwsIDApOwogICAgIGlmIChtb2QgPT0gTlVMTCkgewotCWlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0ltcG9ydEVycm9yKSkgewotCSAgICAvKiBJZ25vcmUgSW1wb3J0RXJyb3JzLi4uIHRoaXMgaXMgZG9uZSBzbyB0aGF0Ci0JICAgICAgIGRpc3RyaWJ1dGlvbnMgY2FuIGRpc2FibGUgdGhlIGVuY29kaW5ncyBwYWNrYWdlLiBOb3RlCi0JICAgICAgIHRoYXQgb3RoZXIgZXJyb3JzIGFyZSBub3QgbWFza2VkLCBlLmcuIFN5c3RlbUVycm9ycwotCSAgICAgICByYWlzZWQgdG8gaW5mb3JtIHRoZSB1c2VyIG9mIGFuIGVycm9yIGluIHRoZSBQeXRob24KLQkgICAgICAgY29uZmlndXJhdGlvbiBhcmUgc3RpbGwgcmVwb3J0ZWQgYmFjayB0byB0aGUgdXNlci4gKi8KLQkgICAgUHlFcnJfQ2xlYXIoKTsKLQkgICAgcmV0dXJuIDA7Ci0JfQotCXJldHVybiAtMTsKKyAgICAgICAgaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfSW1wb3J0RXJyb3IpKSB7CisgICAgICAgICAgICAvKiBJZ25vcmUgSW1wb3J0RXJyb3JzLi4uIHRoaXMgaXMgZG9uZSBzbyB0aGF0CisgICAgICAgICAgICAgICBkaXN0cmlidXRpb25zIGNhbiBkaXNhYmxlIHRoZSBlbmNvZGluZ3MgcGFja2FnZS4gTm90ZQorICAgICAgICAgICAgICAgdGhhdCBvdGhlciBlcnJvcnMgYXJlIG5vdCBtYXNrZWQsIGUuZy4gU3lzdGVtRXJyb3JzCisgICAgICAgICAgICAgICByYWlzZWQgdG8gaW5mb3JtIHRoZSB1c2VyIG9mIGFuIGVycm9yIGluIHRoZSBQeXRob24KKyAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gYXJlIHN0aWxsIHJlcG9ydGVkIGJhY2sgdG8gdGhlIHVzZXIuICovCisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KICAgICBQeV9ERUNSRUYobW9kKTsKICAgICByZXR1cm4gMDsKZGlmZiAtLWdpdCBhL1B5dGhvbi9jb21waWxlLmMgYi9QeXRob24vY29tcGlsZS5jCmluZGV4IGY0MTMxMmEuLjZkM2Q4ODkgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9jb21waWxlLmMKKysrIGIvUHl0aG9uL2NvbXBpbGUuYwpAQCAtNSwxMCArNSwxMCBAQAogICogUHlDb2RlT2JqZWN0LiAgVGhlIGNvbXBpbGVyIG1ha2VzIHNldmVyYWwgcGFzc2VzIHRvIGJ1aWxkIHRoZSBjb2RlCiAgKiBvYmplY3Q6CiAgKiAgIDEuIENoZWNrcyBmb3IgZnV0dXJlIHN0YXRlbWVudHMuICBTZWUgZnV0dXJlLmMKLSAqICAgMi4gQnVpbGRzIGEgc3ltYm9sIHRhYmxlLglTZWUgc3ltdGFibGUuYy4KKyAqICAgMi4gQnVpbGRzIGEgc3ltYm9sIHRhYmxlLiAgU2VlIHN5bXRhYmxlLmMuCiAgKiAgIDMuIEdlbmVyYXRlIGNvZGUgZm9yIGJhc2ljIGJsb2Nrcy4gIFNlZSBjb21waWxlcl9tb2QoKSBpbiB0aGlzIGZpbGUuCiAgKiAgIDQuIEFzc2VtYmxlIHRoZSBiYXNpYyBibG9ja3MgaW50byBmaW5hbCBjb2RlLiAgU2VlIGFzc2VtYmxlKCkgaW4KLSAqCXRoaXMgZmlsZS4JIAorICogICAgICB0aGlzIGZpbGUuCiAgKiAgIDUuIE9wdGltaXplIHRoZSBieXRlIGNvZGUgKHBlZXBob2xlIG9wdGltaXphdGlvbnMpLiAgU2VlIHBlZXBob2xlLmMKICAqCiAgKiBOb3RlIHRoYXQgY29tcGlsZXJfbW9kKCkgc3VnZ2VzdHMgbW9kdWxlLCBidXQgdGhlIG1vZHVsZSBhc3QgdHlwZQpAQCAtNDAsMzcgKzQwLDM3IEBACiAjZGVmaW5lIERFRkFVTFRfTE5PVEFCX1NJWkUgMTYKIAogc3RydWN0IGluc3RyIHsKLQl1bnNpZ25lZCBpX2phYnMgOiAxOwotCXVuc2lnbmVkIGlfanJlbCA6IDE7Ci0JdW5zaWduZWQgaV9oYXNhcmcgOiAxOwotCXVuc2lnbmVkIGNoYXIgaV9vcGNvZGU7Ci0JaW50IGlfb3Bhcmc7Ci0Jc3RydWN0IGJhc2ljYmxvY2tfICppX3RhcmdldDsgLyogdGFyZ2V0IGJsb2NrIChpZiBqdW1wIGluc3RydWN0aW9uKSAqLwotCWludCBpX2xpbmVubzsKKyAgICB1bnNpZ25lZCBpX2phYnMgOiAxOworICAgIHVuc2lnbmVkIGlfanJlbCA6IDE7CisgICAgdW5zaWduZWQgaV9oYXNhcmcgOiAxOworICAgIHVuc2lnbmVkIGNoYXIgaV9vcGNvZGU7CisgICAgaW50IGlfb3Bhcmc7CisgICAgc3RydWN0IGJhc2ljYmxvY2tfICppX3RhcmdldDsgLyogdGFyZ2V0IGJsb2NrIChpZiBqdW1wIGluc3RydWN0aW9uKSAqLworICAgIGludCBpX2xpbmVubzsKIH07CiAKIHR5cGVkZWYgc3RydWN0IGJhc2ljYmxvY2tfIHsKICAgICAvKiBFYWNoIGJhc2ljYmxvY2sgaW4gYSBjb21waWxhdGlvbiB1bml0IGlzIGxpbmtlZCB2aWEgYl9saXN0IGluIHRoZQogICAgICAgIHJldmVyc2Ugb3JkZXIgdGhhdCB0aGUgYmxvY2sgYXJlIGFsbG9jYXRlZC4gIGJfbGlzdCBwb2ludHMgdG8gdGhlIG5leHQKICAgICAgICBibG9jaywgbm90IHRvIGJlIGNvbmZ1c2VkIHdpdGggYl9uZXh0LCB3aGljaCBpcyBuZXh0IGJ5IGNvbnRyb2wgZmxvdy4gKi8KLQlzdHJ1Y3QgYmFzaWNibG9ja18gKmJfbGlzdDsKLQkvKiBudW1iZXIgb2YgaW5zdHJ1Y3Rpb25zIHVzZWQgKi8KLQlpbnQgYl9pdXNlZDsKLQkvKiBsZW5ndGggb2YgaW5zdHJ1Y3Rpb24gYXJyYXkgKGJfaW5zdHIpICovCi0JaW50IGJfaWFsbG9jOwotCS8qIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgaW5zdHJ1Y3Rpb25zLCBpbml0aWFsbHkgTlVMTCAqLwotCXN0cnVjdCBpbnN0ciAqYl9pbnN0cjsKLQkvKiBJZiBiX25leHQgaXMgbm9uLU5VTEwsIGl0IGlzIGEgcG9pbnRlciB0byB0aGUgbmV4dAotCSAgIGJsb2NrIHJlYWNoZWQgYnkgbm9ybWFsIGNvbnRyb2wgZmxvdy4gKi8KLQlzdHJ1Y3QgYmFzaWNibG9ja18gKmJfbmV4dDsKLQkvKiBiX3NlZW4gaXMgdXNlZCB0byBwZXJmb3JtIGEgREZTIG9mIGJhc2ljYmxvY2tzLiAqLwotCXVuc2lnbmVkIGJfc2VlbiA6IDE7Ci0JLyogYl9yZXR1cm4gaXMgdHJ1ZSBpZiBhIFJFVFVSTl9WQUxVRSBvcGNvZGUgaXMgaW5zZXJ0ZWQuICovCi0JdW5zaWduZWQgYl9yZXR1cm4gOiAxOwotCS8qIGRlcHRoIG9mIHN0YWNrIHVwb24gZW50cnkgb2YgYmxvY2ssIGNvbXB1dGVkIGJ5IHN0YWNrZGVwdGgoKSAqLwotCWludCBiX3N0YXJ0ZGVwdGg7Ci0JLyogaW5zdHJ1Y3Rpb24gb2Zmc2V0IGZvciBibG9jaywgY29tcHV0ZWQgYnkgYXNzZW1ibGVfanVtcF9vZmZzZXRzKCkgKi8KLQlpbnQgYl9vZmZzZXQ7CisgICAgc3RydWN0IGJhc2ljYmxvY2tfICpiX2xpc3Q7CisgICAgLyogbnVtYmVyIG9mIGluc3RydWN0aW9ucyB1c2VkICovCisgICAgaW50IGJfaXVzZWQ7CisgICAgLyogbGVuZ3RoIG9mIGluc3RydWN0aW9uIGFycmF5IChiX2luc3RyKSAqLworICAgIGludCBiX2lhbGxvYzsKKyAgICAvKiBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGluc3RydWN0aW9ucywgaW5pdGlhbGx5IE5VTEwgKi8KKyAgICBzdHJ1Y3QgaW5zdHIgKmJfaW5zdHI7CisgICAgLyogSWYgYl9uZXh0IGlzIG5vbi1OVUxMLCBpdCBpcyBhIHBvaW50ZXIgdG8gdGhlIG5leHQKKyAgICAgICBibG9jayByZWFjaGVkIGJ5IG5vcm1hbCBjb250cm9sIGZsb3cuICovCisgICAgc3RydWN0IGJhc2ljYmxvY2tfICpiX25leHQ7CisgICAgLyogYl9zZWVuIGlzIHVzZWQgdG8gcGVyZm9ybSBhIERGUyBvZiBiYXNpY2Jsb2Nrcy4gKi8KKyAgICB1bnNpZ25lZCBiX3NlZW4gOiAxOworICAgIC8qIGJfcmV0dXJuIGlzIHRydWUgaWYgYSBSRVRVUk5fVkFMVUUgb3Bjb2RlIGlzIGluc2VydGVkLiAqLworICAgIHVuc2lnbmVkIGJfcmV0dXJuIDogMTsKKyAgICAvKiBkZXB0aCBvZiBzdGFjayB1cG9uIGVudHJ5IG9mIGJsb2NrLCBjb21wdXRlZCBieSBzdGFja2RlcHRoKCkgKi8KKyAgICBpbnQgYl9zdGFydGRlcHRoOworICAgIC8qIGluc3RydWN0aW9uIG9mZnNldCBmb3IgYmxvY2ssIGNvbXB1dGVkIGJ5IGFzc2VtYmxlX2p1bXBfb2Zmc2V0cygpICovCisgICAgaW50IGJfb2Zmc2V0OwogfSBiYXNpY2Jsb2NrOwogCiAvKiBmYmxvY2tpbmZvIHRyYWNrcyB0aGUgY3VycmVudCBmcmFtZSBibG9jay4KQEAgLTgzLDY1ICs4Myw2NSBAQAogZW51bSBmYmxvY2t0eXBlIHsgTE9PUCwgRVhDRVBULCBGSU5BTExZX1RSWSwgRklOQUxMWV9FTkQgfTsKIAogc3RydWN0IGZibG9ja2luZm8gewotCWVudW0gZmJsb2NrdHlwZSBmYl90eXBlOwotCWJhc2ljYmxvY2sgKmZiX2Jsb2NrOworICAgIGVudW0gZmJsb2NrdHlwZSBmYl90eXBlOworICAgIGJhc2ljYmxvY2sgKmZiX2Jsb2NrOwogfTsKIAogLyogVGhlIGZvbGxvd2luZyBpdGVtcyBjaGFuZ2Ugb24gZW50cnkgYW5kIGV4aXQgb2YgY29kZSBibG9ja3MuCiAgICBUaGV5IG11c3QgYmUgc2F2ZWQgYW5kIHJlc3RvcmVkIHdoZW4gcmV0dXJuaW5nIHRvIGEgYmxvY2suCiAqLwogc3RydWN0IGNvbXBpbGVyX3VuaXQgewotCVB5U1RFbnRyeU9iamVjdCAqdV9zdGU7CisgICAgUHlTVEVudHJ5T2JqZWN0ICp1X3N0ZTsKIAotCVB5T2JqZWN0ICp1X25hbWU7Ci0JLyogVGhlIGZvbGxvd2luZyBmaWVsZHMgYXJlIGRpY3RzIHRoYXQgbWFwIG9iamVjdHMgdG8KLQkgICB0aGUgaW5kZXggb2YgdGhlbSBpbiBjb19YWFguCSBUaGUgaW5kZXggaXMgdXNlZCBhcwotCSAgIHRoZSBhcmd1bWVudCBmb3Igb3Bjb2RlcyB0aGF0IHJlZmVyIHRvIHRob3NlIGNvbGxlY3Rpb25zLgotCSovCi0JUHlPYmplY3QgKnVfY29uc3RzOyAgICAvKiBhbGwgY29uc3RhbnRzICovCi0JUHlPYmplY3QgKnVfbmFtZXM7ICAgICAvKiBhbGwgbmFtZXMgKi8KLQlQeU9iamVjdCAqdV92YXJuYW1lczsgIC8qIGxvY2FsIHZhcmlhYmxlcyAqLwotCVB5T2JqZWN0ICp1X2NlbGx2YXJzOyAgLyogY2VsbCB2YXJpYWJsZXMgKi8KLQlQeU9iamVjdCAqdV9mcmVldmFyczsgIC8qIGZyZWUgdmFyaWFibGVzICovCisgICAgUHlPYmplY3QgKnVfbmFtZTsKKyAgICAvKiBUaGUgZm9sbG93aW5nIGZpZWxkcyBhcmUgZGljdHMgdGhhdCBtYXAgb2JqZWN0cyB0bworICAgICAgIHRoZSBpbmRleCBvZiB0aGVtIGluIGNvX1hYWC4gICAgICBUaGUgaW5kZXggaXMgdXNlZCBhcworICAgICAgIHRoZSBhcmd1bWVudCBmb3Igb3Bjb2RlcyB0aGF0IHJlZmVyIHRvIHRob3NlIGNvbGxlY3Rpb25zLgorICAgICovCisgICAgUHlPYmplY3QgKnVfY29uc3RzOyAgICAvKiBhbGwgY29uc3RhbnRzICovCisgICAgUHlPYmplY3QgKnVfbmFtZXM7ICAgICAvKiBhbGwgbmFtZXMgKi8KKyAgICBQeU9iamVjdCAqdV92YXJuYW1lczsgIC8qIGxvY2FsIHZhcmlhYmxlcyAqLworICAgIFB5T2JqZWN0ICp1X2NlbGx2YXJzOyAgLyogY2VsbCB2YXJpYWJsZXMgKi8KKyAgICBQeU9iamVjdCAqdV9mcmVldmFyczsgIC8qIGZyZWUgdmFyaWFibGVzICovCiAKLQlQeU9iamVjdCAqdV9wcml2YXRlOwkvKiBmb3IgcHJpdmF0ZSBuYW1lIG1hbmdsaW5nICovCisgICAgUHlPYmplY3QgKnVfcHJpdmF0ZTsgICAgICAgIC8qIGZvciBwcml2YXRlIG5hbWUgbWFuZ2xpbmcgKi8KIAotCWludCB1X2FyZ2NvdW50OwkgICAvKiBudW1iZXIgb2YgYXJndW1lbnRzIGZvciBibG9jayAqLyAKLQkvKiBQb2ludGVyIHRvIHRoZSBtb3N0IHJlY2VudGx5IGFsbG9jYXRlZCBibG9jay4gIEJ5IGZvbGxvd2luZyBiX2xpc3QKLQkgICBtZW1iZXJzLCB5b3UgY2FuIHJlYWNoIGFsbCBlYXJseSBhbGxvY2F0ZWQgYmxvY2tzLiAqLwotCWJhc2ljYmxvY2sgKnVfYmxvY2tzOwotCWJhc2ljYmxvY2sgKnVfY3VyYmxvY2s7IC8qIHBvaW50ZXIgdG8gY3VycmVudCBibG9jayAqLwotCWludCB1X3RtcG5hbWU7CQkvKiB0ZW1wb3JhcnkgdmFyaWFibGVzIGZvciBsaXN0IGNvbXBzICovCisgICAgaW50IHVfYXJnY291bnQ7ICAgICAgICAvKiBudW1iZXIgb2YgYXJndW1lbnRzIGZvciBibG9jayAqLworICAgIC8qIFBvaW50ZXIgdG8gdGhlIG1vc3QgcmVjZW50bHkgYWxsb2NhdGVkIGJsb2NrLiAgQnkgZm9sbG93aW5nIGJfbGlzdAorICAgICAgIG1lbWJlcnMsIHlvdSBjYW4gcmVhY2ggYWxsIGVhcmx5IGFsbG9jYXRlZCBibG9ja3MuICovCisgICAgYmFzaWNibG9jayAqdV9ibG9ja3M7CisgICAgYmFzaWNibG9jayAqdV9jdXJibG9jazsgLyogcG9pbnRlciB0byBjdXJyZW50IGJsb2NrICovCisgICAgaW50IHVfdG1wbmFtZTsgICAgICAgICAgICAgIC8qIHRlbXBvcmFyeSB2YXJpYWJsZXMgZm9yIGxpc3QgY29tcHMgKi8KIAotCWludCB1X25mYmxvY2tzOwotCXN0cnVjdCBmYmxvY2tpbmZvIHVfZmJsb2NrW0NPX01BWEJMT0NLU107CisgICAgaW50IHVfbmZibG9ja3M7CisgICAgc3RydWN0IGZibG9ja2luZm8gdV9mYmxvY2tbQ09fTUFYQkxPQ0tTXTsKIAotCWludCB1X2ZpcnN0bGluZW5vOyAvKiB0aGUgZmlyc3QgbGluZW5vIG9mIHRoZSBibG9jayAqLwotCWludCB1X2xpbmVubzsJICAgLyogdGhlIGxpbmVubyBmb3IgdGhlIGN1cnJlbnQgc3RtdCAqLwotCWJvb2wgdV9saW5lbm9fc2V0OyAvKiBib29sZWFuIHRvIGluZGljYXRlIHdoZXRoZXIgaW5zdHIKLQkJCSAgICAgIGhhcyBiZWVuIGdlbmVyYXRlZCB3aXRoIGN1cnJlbnQgbGluZW5vICovCisgICAgaW50IHVfZmlyc3RsaW5lbm87IC8qIHRoZSBmaXJzdCBsaW5lbm8gb2YgdGhlIGJsb2NrICovCisgICAgaW50IHVfbGluZW5vOyAgICAgICAgICAvKiB0aGUgbGluZW5vIGZvciB0aGUgY3VycmVudCBzdG10ICovCisgICAgYm9vbCB1X2xpbmVub19zZXQ7IC8qIGJvb2xlYW4gdG8gaW5kaWNhdGUgd2hldGhlciBpbnN0cgorICAgICAgICAgICAgICAgICAgICAgICAgICBoYXMgYmVlbiBnZW5lcmF0ZWQgd2l0aCBjdXJyZW50IGxpbmVubyAqLwogfTsKIAotLyogVGhpcyBzdHJ1Y3QgY2FwdHVyZXMgdGhlIGdsb2JhbCBzdGF0ZSBvZiBhIGNvbXBpbGF0aW9uLiAgCisvKiBUaGlzIHN0cnVjdCBjYXB0dXJlcyB0aGUgZ2xvYmFsIHN0YXRlIG9mIGEgY29tcGlsYXRpb24uCiAKIFRoZSB1IHBvaW50ZXIgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGNvbXBpbGF0aW9uIHVuaXQsIHdoaWxlIHVuaXRzCi1mb3IgZW5jbG9zaW5nIGJsb2NrcyBhcmUgc3RvcmVkIGluIGNfc3RhY2suCVRoZSB1IGFuZCBjX3N0YWNrIGFyZQorZm9yIGVuY2xvc2luZyBibG9ja3MgYXJlIHN0b3JlZCBpbiBjX3N0YWNrLiAgICAgVGhlIHUgYW5kIGNfc3RhY2sgYXJlCiBtYW5hZ2VkIGJ5IGNvbXBpbGVyX2VudGVyX3Njb3BlKCkgYW5kIGNvbXBpbGVyX2V4aXRfc2NvcGUoKS4KICovCiAKIHN0cnVjdCBjb21waWxlciB7Ci0JY29uc3QgY2hhciAqY19maWxlbmFtZTsKLQlzdHJ1Y3Qgc3ltdGFibGUgKmNfc3Q7Ci0JUHlGdXR1cmVGZWF0dXJlcyAqY19mdXR1cmU7IC8qIHBvaW50ZXIgdG8gbW9kdWxlJ3MgX19mdXR1cmVfXyAqLwotCVB5Q29tcGlsZXJGbGFncyAqY19mbGFnczsKKyAgICBjb25zdCBjaGFyICpjX2ZpbGVuYW1lOworICAgIHN0cnVjdCBzeW10YWJsZSAqY19zdDsKKyAgICBQeUZ1dHVyZUZlYXR1cmVzICpjX2Z1dHVyZTsgLyogcG9pbnRlciB0byBtb2R1bGUncyBfX2Z1dHVyZV9fICovCisgICAgUHlDb21waWxlckZsYWdzICpjX2ZsYWdzOwogCi0JaW50IGNfaW50ZXJhY3RpdmU7CSAvKiB0cnVlIGlmIGluIGludGVyYWN0aXZlIG1vZGUgKi8KLQlpbnQgY19uZXN0bGV2ZWw7CisgICAgaW50IGNfaW50ZXJhY3RpdmU7ICAgICAgICAgICAvKiB0cnVlIGlmIGluIGludGVyYWN0aXZlIG1vZGUgKi8KKyAgICBpbnQgY19uZXN0bGV2ZWw7CiAKLQlzdHJ1Y3QgY29tcGlsZXJfdW5pdCAqdTsgLyogY29tcGlsZXIgc3RhdGUgZm9yIGN1cnJlbnQgYmxvY2sgKi8KLQlQeU9iamVjdCAqY19zdGFjazsJIC8qIFB5dGhvbiBsaXN0IGhvbGRpbmcgY29tcGlsZXJfdW5pdCBwdHJzICovCi0JY2hhciAqY19lbmNvZGluZzsJIC8qIHNvdXJjZSBlbmNvZGluZyAoYSBib3Jyb3dlZCByZWZlcmVuY2UpICovCi0JUHlBcmVuYSAqY19hcmVuYTsJIC8qIHBvaW50ZXIgdG8gbWVtb3J5IGFsbG9jYXRpb24gYXJlbmEgKi8KKyAgICBzdHJ1Y3QgY29tcGlsZXJfdW5pdCAqdTsgLyogY29tcGlsZXIgc3RhdGUgZm9yIGN1cnJlbnQgYmxvY2sgKi8KKyAgICBQeU9iamVjdCAqY19zdGFjazsgICAgICAgICAgIC8qIFB5dGhvbiBsaXN0IGhvbGRpbmcgY29tcGlsZXJfdW5pdCBwdHJzICovCisgICAgY2hhciAqY19lbmNvZGluZzsgICAgICAgICAgICAvKiBzb3VyY2UgZW5jb2RpbmcgKGEgYm9ycm93ZWQgcmVmZXJlbmNlKSAqLworICAgIFB5QXJlbmEgKmNfYXJlbmE7ICAgICAgICAgICAgLyogcG9pbnRlciB0byBtZW1vcnkgYWxsb2NhdGlvbiBhcmVuYSAqLwogfTsKIAogc3RhdGljIGludCBjb21waWxlcl9lbnRlcl9zY29wZShzdHJ1Y3QgY29tcGlsZXIgKiwgaWRlbnRpZmllciwgdm9pZCAqLCBpbnQpOwpAQCAtMTYyLDEyICsxNjIsMTIgQEAKIHN0YXRpYyBpbnQgY29tcGlsZXJfdmlzaXRfZXhwcihzdHJ1Y3QgY29tcGlsZXIgKiwgZXhwcl90eSk7CiBzdGF0aWMgaW50IGNvbXBpbGVyX2F1Z2Fzc2lnbihzdHJ1Y3QgY29tcGlsZXIgKiwgc3RtdF90eSk7CiBzdGF0aWMgaW50IGNvbXBpbGVyX3Zpc2l0X3NsaWNlKHN0cnVjdCBjb21waWxlciAqLCBzbGljZV90eSwKLQkJCQlleHByX2NvbnRleHRfdHkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByX2NvbnRleHRfdHkpOwogCiBzdGF0aWMgaW50IGNvbXBpbGVyX3B1c2hfZmJsb2NrKHN0cnVjdCBjb21waWxlciAqLCBlbnVtIGZibG9ja3R5cGUsCi0JCQkJYmFzaWNibG9jayAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzaWNibG9jayAqKTsKIHN0YXRpYyB2b2lkIGNvbXBpbGVyX3BvcF9mYmxvY2soc3RydWN0IGNvbXBpbGVyICosIGVudW0gZmJsb2NrdHlwZSwKLQkJCQliYXNpY2Jsb2NrICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNpY2Jsb2NrICopOwogLyogUmV0dXJucyB0cnVlIGlmIHRoZXJlIGlzIGEgbG9vcCBvbiB0aGUgZmJsb2NrIHN0YWNrLiAqLwogc3RhdGljIGludCBjb21waWxlcl9pbl9sb29wKHN0cnVjdCBjb21waWxlciAqKTsKIApAQCAtMTgyLDE3NSArMTgyLDE3NSBAQAogUHlPYmplY3QgKgogX1B5X01hbmdsZShQeU9iamVjdCAqcHJpdmF0ZW9iaiwgUHlPYmplY3QgKmlkZW50KQogewotCS8qIE5hbWUgbWFuZ2xpbmc6IF9fcHJpdmF0ZSBiZWNvbWVzIF9jbGFzc25hbWVfX3ByaXZhdGUuCi0JICAgVGhpcyBpcyBpbmRlcGVuZGVudCBmcm9tIGhvdyB0aGUgbmFtZSBpcyB1c2VkLiAqLwotCWNvbnN0IGNoYXIgKnAsICpuYW1lID0gUHlTdHJpbmdfQXNTdHJpbmcoaWRlbnQpOwotCWNoYXIgKmJ1ZmZlcjsKLQlzaXplX3QgbmxlbiwgcGxlbjsKLQlpZiAocHJpdmF0ZW9iaiA9PSBOVUxMIHx8ICFQeVN0cmluZ19DaGVjayhwcml2YXRlb2JqKSB8fAotCSAgICBuYW1lID09IE5VTEwgfHwgbmFtZVswXSAhPSAnXycgfHwgbmFtZVsxXSAhPSAnXycpIHsKLQkJUHlfSU5DUkVGKGlkZW50KTsKLQkJcmV0dXJuIGlkZW50OwotCX0KLQlwID0gUHlTdHJpbmdfQXNTdHJpbmcocHJpdmF0ZW9iaik7Ci0JbmxlbiA9IHN0cmxlbihuYW1lKTsKLQkvKiBEb24ndCBtYW5nbGUgX19pZF9fIG9yIG5hbWVzIHdpdGggZG90cy4KKyAgICAvKiBOYW1lIG1hbmdsaW5nOiBfX3ByaXZhdGUgYmVjb21lcyBfY2xhc3NuYW1lX19wcml2YXRlLgorICAgICAgIFRoaXMgaXMgaW5kZXBlbmRlbnQgZnJvbSBob3cgdGhlIG5hbWUgaXMgdXNlZC4gKi8KKyAgICBjb25zdCBjaGFyICpwLCAqbmFtZSA9IFB5U3RyaW5nX0FzU3RyaW5nKGlkZW50KTsKKyAgICBjaGFyICpidWZmZXI7CisgICAgc2l6ZV90IG5sZW4sIHBsZW47CisgICAgaWYgKHByaXZhdGVvYmogPT0gTlVMTCB8fCAhUHlTdHJpbmdfQ2hlY2socHJpdmF0ZW9iaikgfHwKKyAgICAgICAgbmFtZSA9PSBOVUxMIHx8IG5hbWVbMF0gIT0gJ18nIHx8IG5hbWVbMV0gIT0gJ18nKSB7CisgICAgICAgIFB5X0lOQ1JFRihpZGVudCk7CisgICAgICAgIHJldHVybiBpZGVudDsKKyAgICB9CisgICAgcCA9IFB5U3RyaW5nX0FzU3RyaW5nKHByaXZhdGVvYmopOworICAgIG5sZW4gPSBzdHJsZW4obmFtZSk7CisgICAgLyogRG9uJ3QgbWFuZ2xlIF9faWRfXyBvciBuYW1lcyB3aXRoIGRvdHMuCiAKLQkgICBUaGUgb25seSB0aW1lIGEgbmFtZSB3aXRoIGEgZG90IGNhbiBvY2N1ciBpcyB3aGVuCi0JICAgd2UgYXJlIGNvbXBpbGluZyBhbiBpbXBvcnQgc3RhdGVtZW50IHRoYXQgaGFzIGEgCi0JICAgcGFja2FnZSBuYW1lLgorICAgICAgIFRoZSBvbmx5IHRpbWUgYSBuYW1lIHdpdGggYSBkb3QgY2FuIG9jY3VyIGlzIHdoZW4KKyAgICAgICB3ZSBhcmUgY29tcGlsaW5nIGFuIGltcG9ydCBzdGF0ZW1lbnQgdGhhdCBoYXMgYQorICAgICAgIHBhY2thZ2UgbmFtZS4KIAotCSAgIFRPRE8oamh5bHRvbik6IERlY2lkZSB3aGV0aGVyIHdlIHdhbnQgdG8gc3VwcG9ydAotCSAgIG1hbmdsaW5nIG9mIHRoZSBtb2R1bGUgbmFtZSwgZS5nLiBfX00uWC4KLQkqLwotCWlmICgobmFtZVtubGVuLTFdID09ICdfJyAmJiBuYW1lW25sZW4tMl0gPT0gJ18nKSAKLQkgICAgfHwgc3RyY2hyKG5hbWUsICcuJykpIHsKLQkJUHlfSU5DUkVGKGlkZW50KTsKLQkJcmV0dXJuIGlkZW50OyAvKiBEb24ndCBtYW5nbGUgX193aGF0ZXZlcl9fICovCi0JfQotCS8qIFN0cmlwIGxlYWRpbmcgdW5kZXJzY29yZXMgZnJvbSBjbGFzcyBuYW1lICovCi0Jd2hpbGUgKCpwID09ICdfJykKLQkJcCsrOwotCWlmICgqcCA9PSAnXDAnKSB7Ci0JCVB5X0lOQ1JFRihpZGVudCk7Ci0JCXJldHVybiBpZGVudDsgLyogRG9uJ3QgbWFuZ2xlIGlmIGNsYXNzIGlzIGp1c3QgdW5kZXJzY29yZXMgKi8KLQl9Ci0JcGxlbiA9IHN0cmxlbihwKTsKKyAgICAgICBUT0RPKGpoeWx0b24pOiBEZWNpZGUgd2hldGhlciB3ZSB3YW50IHRvIHN1cHBvcnQKKyAgICAgICBtYW5nbGluZyBvZiB0aGUgbW9kdWxlIG5hbWUsIGUuZy4gX19NLlguCisgICAgKi8KKyAgICBpZiAoKG5hbWVbbmxlbi0xXSA9PSAnXycgJiYgbmFtZVtubGVuLTJdID09ICdfJykKKyAgICAgICAgfHwgc3RyY2hyKG5hbWUsICcuJykpIHsKKyAgICAgICAgUHlfSU5DUkVGKGlkZW50KTsKKyAgICAgICAgcmV0dXJuIGlkZW50OyAvKiBEb24ndCBtYW5nbGUgX193aGF0ZXZlcl9fICovCisgICAgfQorICAgIC8qIFN0cmlwIGxlYWRpbmcgdW5kZXJzY29yZXMgZnJvbSBjbGFzcyBuYW1lICovCisgICAgd2hpbGUgKCpwID09ICdfJykKKyAgICAgICAgcCsrOworICAgIGlmICgqcCA9PSAnXDAnKSB7CisgICAgICAgIFB5X0lOQ1JFRihpZGVudCk7CisgICAgICAgIHJldHVybiBpZGVudDsgLyogRG9uJ3QgbWFuZ2xlIGlmIGNsYXNzIGlzIGp1c3QgdW5kZXJzY29yZXMgKi8KKyAgICB9CisgICAgcGxlbiA9IHN0cmxlbihwKTsKIAotCWFzc2VydCgxIDw9IFBZX1NTSVpFX1RfTUFYIC0gbmxlbik7Ci0JYXNzZXJ0KDEgKyBubGVuIDw9IFBZX1NTSVpFX1RfTUFYIC0gcGxlbik7CisgICAgYXNzZXJ0KDEgPD0gUFlfU1NJWkVfVF9NQVggLSBubGVuKTsKKyAgICBhc3NlcnQoMSArIG5sZW4gPD0gUFlfU1NJWkVfVF9NQVggLSBwbGVuKTsKIAotCWlkZW50ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgMSArIG5sZW4gKyBwbGVuKTsKLQlpZiAoIWlkZW50KQotCQlyZXR1cm4gMDsKLQkvKiBpZGVudCA9ICJfIiArIHBbOnBsZW5dICsgbmFtZSAjIGkuZS4gMStwbGVuK25sZW4gYnl0ZXMgKi8KLQlidWZmZXIgPSBQeVN0cmluZ19BU19TVFJJTkcoaWRlbnQpOwotCWJ1ZmZlclswXSA9ICdfJzsKLQlzdHJuY3B5KGJ1ZmZlcisxLCBwLCBwbGVuKTsKLQlzdHJjcHkoYnVmZmVyKzErcGxlbiwgbmFtZSk7Ci0JcmV0dXJuIGlkZW50OworICAgIGlkZW50ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgMSArIG5sZW4gKyBwbGVuKTsKKyAgICBpZiAoIWlkZW50KQorICAgICAgICByZXR1cm4gMDsKKyAgICAvKiBpZGVudCA9ICJfIiArIHBbOnBsZW5dICsgbmFtZSAjIGkuZS4gMStwbGVuK25sZW4gYnl0ZXMgKi8KKyAgICBidWZmZXIgPSBQeVN0cmluZ19BU19TVFJJTkcoaWRlbnQpOworICAgIGJ1ZmZlclswXSA9ICdfJzsKKyAgICBzdHJuY3B5KGJ1ZmZlcisxLCBwLCBwbGVuKTsKKyAgICBzdHJjcHkoYnVmZmVyKzErcGxlbiwgbmFtZSk7CisgICAgcmV0dXJuIGlkZW50OwogfQogCiBzdGF0aWMgaW50CiBjb21waWxlcl9pbml0KHN0cnVjdCBjb21waWxlciAqYykKIHsKLQltZW1zZXQoYywgMCwgc2l6ZW9mKHN0cnVjdCBjb21waWxlcikpOworICAgIG1lbXNldChjLCAwLCBzaXplb2Yoc3RydWN0IGNvbXBpbGVyKSk7CiAKLQljLT5jX3N0YWNrID0gUHlMaXN0X05ldygwKTsKLQlpZiAoIWMtPmNfc3RhY2spCi0JCXJldHVybiAwOworICAgIGMtPmNfc3RhY2sgPSBQeUxpc3RfTmV3KDApOworICAgIGlmICghYy0+Y19zdGFjaykKKyAgICAgICAgcmV0dXJuIDA7CiAKLQlyZXR1cm4gMTsKKyAgICByZXR1cm4gMTsKIH0KIAogUHlDb2RlT2JqZWN0ICoKIFB5QVNUX0NvbXBpbGUobW9kX3R5IG1vZCwgY29uc3QgY2hhciAqZmlsZW5hbWUsIFB5Q29tcGlsZXJGbGFncyAqZmxhZ3MsCi0JICAgICAgUHlBcmVuYSAqYXJlbmEpCisgICAgICAgICAgICAgIFB5QXJlbmEgKmFyZW5hKQogewotCXN0cnVjdCBjb21waWxlciBjOwotCVB5Q29kZU9iamVjdCAqY28gPSBOVUxMOwotCVB5Q29tcGlsZXJGbGFncyBsb2NhbF9mbGFnczsKLQlpbnQgbWVyZ2VkOworICAgIHN0cnVjdCBjb21waWxlciBjOworICAgIFB5Q29kZU9iamVjdCAqY28gPSBOVUxMOworICAgIFB5Q29tcGlsZXJGbGFncyBsb2NhbF9mbGFnczsKKyAgICBpbnQgbWVyZ2VkOwogCi0JaWYgKCFfX2RvY19fKSB7Ci0JCV9fZG9jX18gPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2RvY19fIik7Ci0JCWlmICghX19kb2NfXykKLQkJCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoIV9fZG9jX18pIHsKKyAgICAgICAgX19kb2NfXyA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fZG9jX18iKTsKKyAgICAgICAgaWYgKCFfX2RvY19fKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaWYgKCFjb21waWxlcl9pbml0KCZjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JYy5jX2ZpbGVuYW1lID0gZmlsZW5hbWU7Ci0JYy5jX2FyZW5hID0gYXJlbmE7Ci0JYy5jX2Z1dHVyZSA9IFB5RnV0dXJlX0Zyb21BU1QobW9kLCBmaWxlbmFtZSk7Ci0JaWYgKGMuY19mdXR1cmUgPT0gTlVMTCkKLQkJZ290byBmaW5hbGx5OwotCWlmICghZmxhZ3MpIHsKLQkJbG9jYWxfZmxhZ3MuY2ZfZmxhZ3MgPSAwOwotCQlmbGFncyA9ICZsb2NhbF9mbGFnczsKLQl9Ci0JbWVyZ2VkID0gYy5jX2Z1dHVyZS0+ZmZfZmVhdHVyZXMgfCBmbGFncy0+Y2ZfZmxhZ3M7Ci0JYy5jX2Z1dHVyZS0+ZmZfZmVhdHVyZXMgPSBtZXJnZWQ7Ci0JZmxhZ3MtPmNmX2ZsYWdzID0gbWVyZ2VkOwotCWMuY19mbGFncyA9IGZsYWdzOwotCWMuY19uZXN0bGV2ZWwgPSAwOworICAgIGlmICghY29tcGlsZXJfaW5pdCgmYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGMuY19maWxlbmFtZSA9IGZpbGVuYW1lOworICAgIGMuY19hcmVuYSA9IGFyZW5hOworICAgIGMuY19mdXR1cmUgPSBQeUZ1dHVyZV9Gcm9tQVNUKG1vZCwgZmlsZW5hbWUpOworICAgIGlmIChjLmNfZnV0dXJlID09IE5VTEwpCisgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICBpZiAoIWZsYWdzKSB7CisgICAgICAgIGxvY2FsX2ZsYWdzLmNmX2ZsYWdzID0gMDsKKyAgICAgICAgZmxhZ3MgPSAmbG9jYWxfZmxhZ3M7CisgICAgfQorICAgIG1lcmdlZCA9IGMuY19mdXR1cmUtPmZmX2ZlYXR1cmVzIHwgZmxhZ3MtPmNmX2ZsYWdzOworICAgIGMuY19mdXR1cmUtPmZmX2ZlYXR1cmVzID0gbWVyZ2VkOworICAgIGZsYWdzLT5jZl9mbGFncyA9IG1lcmdlZDsKKyAgICBjLmNfZmxhZ3MgPSBmbGFnczsKKyAgICBjLmNfbmVzdGxldmVsID0gMDsKIAotCWMuY19zdCA9IFB5U3ltdGFibGVfQnVpbGQobW9kLCBmaWxlbmFtZSwgYy5jX2Z1dHVyZSk7Ci0JaWYgKGMuY19zdCA9PSBOVUxMKSB7Ci0JCWlmICghUHlFcnJfT2NjdXJyZWQoKSkKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwgIm5vIHN5bXRhYmxlIik7Ci0JCWdvdG8gZmluYWxseTsKLQl9CisgICAgYy5jX3N0ID0gUHlTeW10YWJsZV9CdWlsZChtb2QsIGZpbGVuYW1lLCBjLmNfZnV0dXJlKTsKKyAgICBpZiAoYy5jX3N0ID09IE5VTEwpIHsKKyAgICAgICAgaWYgKCFQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLCAibm8gc3ltdGFibGUiKTsKKyAgICAgICAgZ290byBmaW5hbGx5OworICAgIH0KIAotCS8qIFhYWCBpbml0aWFsaXplIHRvIE5VTEwgZm9yIG5vdywgbmVlZCB0byBoYW5kbGUgKi8KLQljLmNfZW5jb2RpbmcgPSBOVUxMOworICAgIC8qIFhYWCBpbml0aWFsaXplIHRvIE5VTEwgZm9yIG5vdywgbmVlZCB0byBoYW5kbGUgKi8KKyAgICBjLmNfZW5jb2RpbmcgPSBOVUxMOwogCi0JY28gPSBjb21waWxlcl9tb2QoJmMsIG1vZCk7CisgICAgY28gPSBjb21waWxlcl9tb2QoJmMsIG1vZCk7CiAKICBmaW5hbGx5OgotCWNvbXBpbGVyX2ZyZWUoJmMpOwotCWFzc2VydChjbyB8fCBQeUVycl9PY2N1cnJlZCgpKTsKLQlyZXR1cm4gY287CisgICAgY29tcGlsZXJfZnJlZSgmYyk7CisgICAgYXNzZXJ0KGNvIHx8IFB5RXJyX09jY3VycmVkKCkpOworICAgIHJldHVybiBjbzsKIH0KIAogUHlDb2RlT2JqZWN0ICoKIFB5Tm9kZV9Db21waWxlKHN0cnVjdCBfbm9kZSAqbiwgY29uc3QgY2hhciAqZmlsZW5hbWUpCiB7Ci0JUHlDb2RlT2JqZWN0ICpjbyA9IE5VTEw7Ci0JbW9kX3R5IG1vZDsKLQlQeUFyZW5hICphcmVuYSA9IFB5QXJlbmFfTmV3KCk7Ci0JaWYgKCFhcmVuYSkKLQkJcmV0dXJuIE5VTEw7Ci0JbW9kID0gUHlBU1RfRnJvbU5vZGUobiwgTlVMTCwgZmlsZW5hbWUsIGFyZW5hKTsKLQlpZiAobW9kKQotCQljbyA9IFB5QVNUX0NvbXBpbGUobW9kLCBmaWxlbmFtZSwgTlVMTCwgYXJlbmEpOwotCVB5QXJlbmFfRnJlZShhcmVuYSk7Ci0JcmV0dXJuIGNvOworICAgIFB5Q29kZU9iamVjdCAqY28gPSBOVUxMOworICAgIG1vZF90eSBtb2Q7CisgICAgUHlBcmVuYSAqYXJlbmEgPSBQeUFyZW5hX05ldygpOworICAgIGlmICghYXJlbmEpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG1vZCA9IFB5QVNUX0Zyb21Ob2RlKG4sIE5VTEwsIGZpbGVuYW1lLCBhcmVuYSk7CisgICAgaWYgKG1vZCkKKyAgICAgICAgY28gPSBQeUFTVF9Db21waWxlKG1vZCwgZmlsZW5hbWUsIE5VTEwsIGFyZW5hKTsKKyAgICBQeUFyZW5hX0ZyZWUoYXJlbmEpOworICAgIHJldHVybiBjbzsKIH0KIAogc3RhdGljIHZvaWQKIGNvbXBpbGVyX2ZyZWUoc3RydWN0IGNvbXBpbGVyICpjKQogewotCWlmIChjLT5jX3N0KQotCQlQeVN5bXRhYmxlX0ZyZWUoYy0+Y19zdCk7Ci0JaWYgKGMtPmNfZnV0dXJlKQotCQlQeU9iamVjdF9GcmVlKGMtPmNfZnV0dXJlKTsKLQlQeV9ERUNSRUYoYy0+Y19zdGFjayk7CisgICAgaWYgKGMtPmNfc3QpCisgICAgICAgIFB5U3ltdGFibGVfRnJlZShjLT5jX3N0KTsKKyAgICBpZiAoYy0+Y19mdXR1cmUpCisgICAgICAgIFB5T2JqZWN0X0ZyZWUoYy0+Y19mdXR1cmUpOworICAgIFB5X0RFQ1JFRihjLT5jX3N0YWNrKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGxpc3QyZGljdChQeU9iamVjdCAqbGlzdCkKIHsKLQlQeV9zc2l6ZV90IGksIG47Ci0JUHlPYmplY3QgKnYsICprOwotCVB5T2JqZWN0ICpkaWN0ID0gUHlEaWN0X05ldygpOwotCWlmICghZGljdCkgcmV0dXJuIE5VTEw7CisgICAgUHlfc3NpemVfdCBpLCBuOworICAgIFB5T2JqZWN0ICp2LCAqazsKKyAgICBQeU9iamVjdCAqZGljdCA9IFB5RGljdF9OZXcoKTsKKyAgICBpZiAoIWRpY3QpIHJldHVybiBOVUxMOwogCi0JbiA9IFB5TGlzdF9TaXplKGxpc3QpOwotCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJdiA9IFB5SW50X0Zyb21Mb25nKGkpOwotCQlpZiAoIXYpIHsKLQkJCVB5X0RFQ1JFRihkaWN0KTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWsgPSBQeUxpc3RfR0VUX0lURU0obGlzdCwgaSk7Ci0JCWsgPSBQeVR1cGxlX1BhY2soMiwgaywgay0+b2JfdHlwZSk7Ci0JCWlmIChrID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW0oZGljdCwgaywgdikgPCAwKSB7Ci0JCQlQeV9YREVDUkVGKGspOwotCQkJUHlfREVDUkVGKHYpOwotCQkJUHlfREVDUkVGKGRpY3QpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJUHlfREVDUkVGKGspOwotCQlQeV9ERUNSRUYodik7Ci0JfQotCXJldHVybiBkaWN0OworICAgIG4gPSBQeUxpc3RfU2l6ZShsaXN0KTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIHYgPSBQeUludF9Gcm9tTG9uZyhpKTsKKyAgICAgICAgaWYgKCF2KSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoZGljdCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBrID0gUHlMaXN0X0dFVF9JVEVNKGxpc3QsIGkpOworICAgICAgICBrID0gUHlUdXBsZV9QYWNrKDIsIGssIGstPm9iX3R5cGUpOworICAgICAgICBpZiAoayA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtKGRpY3QsIGssIHYpIDwgMCkgeworICAgICAgICAgICAgUHlfWERFQ1JFRihrKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihkaWN0KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIFB5X0RFQ1JFRihrKTsKKyAgICAgICAgUHlfREVDUkVGKHYpOworICAgIH0KKyAgICByZXR1cm4gZGljdDsKIH0KIAogLyogUmV0dXJuIG5ldyBkaWN0IGNvbnRhaW5pbmcgbmFtZXMgZnJvbSBzcmMgdGhhdCBtYXRjaCBzY29wZShzKS4KIAogc3JjIGlzIGEgc3ltYm9sIHRhYmxlIGRpY3Rpb25hcnkuICBJZiB0aGUgc2NvcGUgb2YgYSBuYW1lIG1hdGNoZXMKLWVpdGhlciBzY29wZV90eXBlIG9yIGZsYWcgaXMgc2V0LCBpbnNlcnQgaXQgaW50byB0aGUgbmV3IGRpY3QuCVRoZQorZWl0aGVyIHNjb3BlX3R5cGUgb3IgZmxhZyBpcyBzZXQsIGluc2VydCBpdCBpbnRvIHRoZSBuZXcgZGljdC4gIFRoZQogdmFsdWVzIGFyZSBpbnRlZ2Vycywgc3RhcnRpbmcgYXQgb2Zmc2V0IGFuZCBpbmNyZWFzaW5nIGJ5IG9uZSBmb3IKIGVhY2gga2V5LgogKi8KQEAgLTM1OCwxODAgKzM1OCwxODAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBkaWN0Ynl0eXBlKFB5T2JqZWN0ICpzcmMsIGludCBzY29wZV90eXBlLCBpbnQgZmxhZywgaW50IG9mZnNldCkKIHsKLQlQeV9zc2l6ZV90IHBvcyA9IDAsIGkgPSBvZmZzZXQsIHNjb3BlOwotCVB5T2JqZWN0ICprLCAqdiwgKmRlc3QgPSBQeURpY3RfTmV3KCk7CisgICAgUHlfc3NpemVfdCBwb3MgPSAwLCBpID0gb2Zmc2V0LCBzY29wZTsKKyAgICBQeU9iamVjdCAqaywgKnYsICpkZXN0ID0gUHlEaWN0X05ldygpOwogCi0JYXNzZXJ0KG9mZnNldCA+PSAwKTsKLQlpZiAoZGVzdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBhc3NlcnQob2Zmc2V0ID49IDApOworICAgIGlmIChkZXN0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0Jd2hpbGUgKFB5RGljdF9OZXh0KHNyYywgJnBvcywgJmssICZ2KSkgewotCQkvKiBYWFggdGhpcyBzaG91bGQgcHJvYmFibHkgYmUgYSBtYWNybyBpbiBzeW10YWJsZS5oICovCi0JCWFzc2VydChQeUludF9DaGVjayh2KSk7Ci0JCXNjb3BlID0gKFB5SW50X0FTX0xPTkcodikgPj4gU0NPUEVfT0ZGKSAmIFNDT1BFX01BU0s7CisgICAgd2hpbGUgKFB5RGljdF9OZXh0KHNyYywgJnBvcywgJmssICZ2KSkgeworICAgICAgICAvKiBYWFggdGhpcyBzaG91bGQgcHJvYmFibHkgYmUgYSBtYWNybyBpbiBzeW10YWJsZS5oICovCisgICAgICAgIGFzc2VydChQeUludF9DaGVjayh2KSk7CisgICAgICAgIHNjb3BlID0gKFB5SW50X0FTX0xPTkcodikgPj4gU0NPUEVfT0ZGKSAmIFNDT1BFX01BU0s7CiAKLQkJaWYgKHNjb3BlID09IHNjb3BlX3R5cGUgfHwgUHlJbnRfQVNfTE9ORyh2KSAmIGZsYWcpIHsKLQkJCVB5T2JqZWN0ICp0dXBsZSwgKml0ZW0gPSBQeUludF9Gcm9tTG9uZyhpKTsKLQkJCWlmIChpdGVtID09IE5VTEwpIHsKLQkJCQlQeV9ERUNSRUYoZGVzdCk7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCQlpKys7Ci0JCQl0dXBsZSA9IFB5VHVwbGVfUGFjaygyLCBrLCBrLT5vYl90eXBlKTsKLQkJCWlmICghdHVwbGUgfHwgUHlEaWN0X1NldEl0ZW0oZGVzdCwgdHVwbGUsIGl0ZW0pIDwgMCkgewotCQkJCVB5X0RFQ1JFRihpdGVtKTsKLQkJCQlQeV9ERUNSRUYoZGVzdCk7Ci0JCQkJUHlfWERFQ1JFRih0dXBsZSk7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCQlQeV9ERUNSRUYoaXRlbSk7Ci0JCQlQeV9ERUNSRUYodHVwbGUpOwotCQl9Ci0JfQotCXJldHVybiBkZXN0OworICAgICAgICBpZiAoc2NvcGUgPT0gc2NvcGVfdHlwZSB8fCBQeUludF9BU19MT05HKHYpICYgZmxhZykgeworICAgICAgICAgICAgUHlPYmplY3QgKnR1cGxlLCAqaXRlbSA9IFB5SW50X0Zyb21Mb25nKGkpOworICAgICAgICAgICAgaWYgKGl0ZW0gPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihkZXN0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgIHR1cGxlID0gUHlUdXBsZV9QYWNrKDIsIGssIGstPm9iX3R5cGUpOworICAgICAgICAgICAgaWYgKCF0dXBsZSB8fCBQeURpY3RfU2V0SXRlbShkZXN0LCB0dXBsZSwgaXRlbSkgPCAwKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihkZXN0KTsKKyAgICAgICAgICAgICAgICBQeV9YREVDUkVGKHR1cGxlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih0dXBsZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGRlc3Q7CiB9CiAKIHN0YXRpYyB2b2lkCiBjb21waWxlcl91bml0X2NoZWNrKHN0cnVjdCBjb21waWxlcl91bml0ICp1KQogewotCWJhc2ljYmxvY2sgKmJsb2NrOwotCWZvciAoYmxvY2sgPSB1LT51X2Jsb2NrczsgYmxvY2sgIT0gTlVMTDsgYmxvY2sgPSBibG9jay0+Yl9saXN0KSB7Ci0JCWFzc2VydCgodm9pZCAqKWJsb2NrICE9ICh2b2lkICopMHhjYmNiY2JjYik7Ci0JCWFzc2VydCgodm9pZCAqKWJsb2NrICE9ICh2b2lkICopMHhmYmZiZmJmYik7Ci0JCWFzc2VydCgodm9pZCAqKWJsb2NrICE9ICh2b2lkICopMHhkYmRiZGJkYik7Ci0JCWlmIChibG9jay0+Yl9pbnN0ciAhPSBOVUxMKSB7Ci0JCQlhc3NlcnQoYmxvY2stPmJfaWFsbG9jID4gMCk7Ci0JCQlhc3NlcnQoYmxvY2stPmJfaXVzZWQgPiAwKTsKLQkJCWFzc2VydChibG9jay0+Yl9pYWxsb2MgPj0gYmxvY2stPmJfaXVzZWQpOwotCQl9Ci0JCWVsc2UgewotCQkJYXNzZXJ0IChibG9jay0+Yl9pdXNlZCA9PSAwKTsKLQkJCWFzc2VydCAoYmxvY2stPmJfaWFsbG9jID09IDApOwotCQl9Ci0JfQorICAgIGJhc2ljYmxvY2sgKmJsb2NrOworICAgIGZvciAoYmxvY2sgPSB1LT51X2Jsb2NrczsgYmxvY2sgIT0gTlVMTDsgYmxvY2sgPSBibG9jay0+Yl9saXN0KSB7CisgICAgICAgIGFzc2VydCgodm9pZCAqKWJsb2NrICE9ICh2b2lkICopMHhjYmNiY2JjYik7CisgICAgICAgIGFzc2VydCgodm9pZCAqKWJsb2NrICE9ICh2b2lkICopMHhmYmZiZmJmYik7CisgICAgICAgIGFzc2VydCgodm9pZCAqKWJsb2NrICE9ICh2b2lkICopMHhkYmRiZGJkYik7CisgICAgICAgIGlmIChibG9jay0+Yl9pbnN0ciAhPSBOVUxMKSB7CisgICAgICAgICAgICBhc3NlcnQoYmxvY2stPmJfaWFsbG9jID4gMCk7CisgICAgICAgICAgICBhc3NlcnQoYmxvY2stPmJfaXVzZWQgPiAwKTsKKyAgICAgICAgICAgIGFzc2VydChibG9jay0+Yl9pYWxsb2MgPj0gYmxvY2stPmJfaXVzZWQpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgYXNzZXJ0IChibG9jay0+Yl9pdXNlZCA9PSAwKTsKKyAgICAgICAgICAgIGFzc2VydCAoYmxvY2stPmJfaWFsbG9jID09IDApOworICAgICAgICB9CisgICAgfQogfQogCiBzdGF0aWMgdm9pZAogY29tcGlsZXJfdW5pdF9mcmVlKHN0cnVjdCBjb21waWxlcl91bml0ICp1KQogewotCWJhc2ljYmxvY2sgKmIsICpuZXh0OworICAgIGJhc2ljYmxvY2sgKmIsICpuZXh0OwogCi0JY29tcGlsZXJfdW5pdF9jaGVjayh1KTsKLQliID0gdS0+dV9ibG9ja3M7Ci0Jd2hpbGUgKGIgIT0gTlVMTCkgewotCQlpZiAoYi0+Yl9pbnN0cikKLQkJCVB5T2JqZWN0X0ZyZWUoKHZvaWQgKiliLT5iX2luc3RyKTsKLQkJbmV4dCA9IGItPmJfbGlzdDsKLQkJUHlPYmplY3RfRnJlZSgodm9pZCAqKWIpOwotCQliID0gbmV4dDsKLQl9Ci0JUHlfQ0xFQVIodS0+dV9zdGUpOwotCVB5X0NMRUFSKHUtPnVfbmFtZSk7Ci0JUHlfQ0xFQVIodS0+dV9jb25zdHMpOwotCVB5X0NMRUFSKHUtPnVfbmFtZXMpOwotCVB5X0NMRUFSKHUtPnVfdmFybmFtZXMpOwotCVB5X0NMRUFSKHUtPnVfZnJlZXZhcnMpOwotCVB5X0NMRUFSKHUtPnVfY2VsbHZhcnMpOwotCVB5X0NMRUFSKHUtPnVfcHJpdmF0ZSk7Ci0JUHlPYmplY3RfRnJlZSh1KTsKKyAgICBjb21waWxlcl91bml0X2NoZWNrKHUpOworICAgIGIgPSB1LT51X2Jsb2NrczsKKyAgICB3aGlsZSAoYiAhPSBOVUxMKSB7CisgICAgICAgIGlmIChiLT5iX2luc3RyKQorICAgICAgICAgICAgUHlPYmplY3RfRnJlZSgodm9pZCAqKWItPmJfaW5zdHIpOworICAgICAgICBuZXh0ID0gYi0+Yl9saXN0OworICAgICAgICBQeU9iamVjdF9GcmVlKCh2b2lkICopYik7CisgICAgICAgIGIgPSBuZXh0OworICAgIH0KKyAgICBQeV9DTEVBUih1LT51X3N0ZSk7CisgICAgUHlfQ0xFQVIodS0+dV9uYW1lKTsKKyAgICBQeV9DTEVBUih1LT51X2NvbnN0cyk7CisgICAgUHlfQ0xFQVIodS0+dV9uYW1lcyk7CisgICAgUHlfQ0xFQVIodS0+dV92YXJuYW1lcyk7CisgICAgUHlfQ0xFQVIodS0+dV9mcmVldmFycyk7CisgICAgUHlfQ0xFQVIodS0+dV9jZWxsdmFycyk7CisgICAgUHlfQ0xFQVIodS0+dV9wcml2YXRlKTsKKyAgICBQeU9iamVjdF9GcmVlKHUpOwogfQogCiBzdGF0aWMgaW50CiBjb21waWxlcl9lbnRlcl9zY29wZShzdHJ1Y3QgY29tcGlsZXIgKmMsIGlkZW50aWZpZXIgbmFtZSwgdm9pZCAqa2V5LAotCQkgICAgIGludCBsaW5lbm8pCisgICAgICAgICAgICAgICAgICAgICBpbnQgbGluZW5vKQogewotCXN0cnVjdCBjb21waWxlcl91bml0ICp1OworICAgIHN0cnVjdCBjb21waWxlcl91bml0ICp1OwogCi0JdSA9IChzdHJ1Y3QgY29tcGlsZXJfdW5pdCAqKVB5T2JqZWN0X01hbGxvYyhzaXplb2YoCi0JCQkJCQlzdHJ1Y3QgY29tcGlsZXJfdW5pdCkpOwotCWlmICghdSkgewotCQlQeUVycl9Ob01lbW9yeSgpOwotCQlyZXR1cm4gMDsKLQl9Ci0JbWVtc2V0KHUsIDAsIHNpemVvZihzdHJ1Y3QgY29tcGlsZXJfdW5pdCkpOwotCXUtPnVfYXJnY291bnQgPSAwOwotCXUtPnVfc3RlID0gUHlTeW10YWJsZV9Mb29rdXAoYy0+Y19zdCwga2V5KTsKLQlpZiAoIXUtPnVfc3RlKSB7Ci0JCWNvbXBpbGVyX3VuaXRfZnJlZSh1KTsKLQkJcmV0dXJuIDA7Ci0JfQotCVB5X0lOQ1JFRihuYW1lKTsKLQl1LT51X25hbWUgPSBuYW1lOwotCXUtPnVfdmFybmFtZXMgPSBsaXN0MmRpY3QodS0+dV9zdGUtPnN0ZV92YXJuYW1lcyk7Ci0JdS0+dV9jZWxsdmFycyA9IGRpY3RieXR5cGUodS0+dV9zdGUtPnN0ZV9zeW1ib2xzLCBDRUxMLCAwLCAwKTsKLQlpZiAoIXUtPnVfdmFybmFtZXMgfHwgIXUtPnVfY2VsbHZhcnMpIHsKLQkJY29tcGlsZXJfdW5pdF9mcmVlKHUpOwotCQlyZXR1cm4gMDsKLQl9CisgICAgdSA9IChzdHJ1Y3QgY29tcGlsZXJfdW5pdCAqKVB5T2JqZWN0X01hbGxvYyhzaXplb2YoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBjb21waWxlcl91bml0KSk7CisgICAgaWYgKCF1KSB7CisgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBtZW1zZXQodSwgMCwgc2l6ZW9mKHN0cnVjdCBjb21waWxlcl91bml0KSk7CisgICAgdS0+dV9hcmdjb3VudCA9IDA7CisgICAgdS0+dV9zdGUgPSBQeVN5bXRhYmxlX0xvb2t1cChjLT5jX3N0LCBrZXkpOworICAgIGlmICghdS0+dV9zdGUpIHsKKyAgICAgICAgY29tcGlsZXJfdW5pdF9mcmVlKHUpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgUHlfSU5DUkVGKG5hbWUpOworICAgIHUtPnVfbmFtZSA9IG5hbWU7CisgICAgdS0+dV92YXJuYW1lcyA9IGxpc3QyZGljdCh1LT51X3N0ZS0+c3RlX3Zhcm5hbWVzKTsKKyAgICB1LT51X2NlbGx2YXJzID0gZGljdGJ5dHlwZSh1LT51X3N0ZS0+c3RlX3N5bWJvbHMsIENFTEwsIDAsIDApOworICAgIGlmICghdS0+dV92YXJuYW1lcyB8fCAhdS0+dV9jZWxsdmFycykgeworICAgICAgICBjb21waWxlcl91bml0X2ZyZWUodSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KIAotCXUtPnVfZnJlZXZhcnMgPSBkaWN0Ynl0eXBlKHUtPnVfc3RlLT5zdGVfc3ltYm9scywgRlJFRSwgREVGX0ZSRUVfQ0xBU1MsCi0JCQkJICAgUHlEaWN0X1NpemUodS0+dV9jZWxsdmFycykpOwotCWlmICghdS0+dV9mcmVldmFycykgewotCQljb21waWxlcl91bml0X2ZyZWUodSk7Ci0JCXJldHVybiAwOwotCX0KKyAgICB1LT51X2ZyZWV2YXJzID0gZGljdGJ5dHlwZSh1LT51X3N0ZS0+c3RlX3N5bWJvbHMsIEZSRUUsIERFRl9GUkVFX0NMQVNTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RGljdF9TaXplKHUtPnVfY2VsbHZhcnMpKTsKKyAgICBpZiAoIXUtPnVfZnJlZXZhcnMpIHsKKyAgICAgICAgY29tcGlsZXJfdW5pdF9mcmVlKHUpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLQl1LT51X2Jsb2NrcyA9IE5VTEw7Ci0JdS0+dV90bXBuYW1lID0gMDsKLQl1LT51X25mYmxvY2tzID0gMDsKLQl1LT51X2ZpcnN0bGluZW5vID0gbGluZW5vOwotCXUtPnVfbGluZW5vID0gMDsKLQl1LT51X2xpbmVub19zZXQgPSBmYWxzZTsKLQl1LT51X2NvbnN0cyA9IFB5RGljdF9OZXcoKTsKLQlpZiAoIXUtPnVfY29uc3RzKSB7Ci0JCWNvbXBpbGVyX3VuaXRfZnJlZSh1KTsKLQkJcmV0dXJuIDA7Ci0JfQotCXUtPnVfbmFtZXMgPSBQeURpY3RfTmV3KCk7Ci0JaWYgKCF1LT51X25hbWVzKSB7Ci0JCWNvbXBpbGVyX3VuaXRfZnJlZSh1KTsKLQkJcmV0dXJuIDA7Ci0JfQorICAgIHUtPnVfYmxvY2tzID0gTlVMTDsKKyAgICB1LT51X3RtcG5hbWUgPSAwOworICAgIHUtPnVfbmZibG9ja3MgPSAwOworICAgIHUtPnVfZmlyc3RsaW5lbm8gPSBsaW5lbm87CisgICAgdS0+dV9saW5lbm8gPSAwOworICAgIHUtPnVfbGluZW5vX3NldCA9IGZhbHNlOworICAgIHUtPnVfY29uc3RzID0gUHlEaWN0X05ldygpOworICAgIGlmICghdS0+dV9jb25zdHMpIHsKKyAgICAgICAgY29tcGlsZXJfdW5pdF9mcmVlKHUpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgdS0+dV9uYW1lcyA9IFB5RGljdF9OZXcoKTsKKyAgICBpZiAoIXUtPnVfbmFtZXMpIHsKKyAgICAgICAgY29tcGlsZXJfdW5pdF9mcmVlKHUpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLQl1LT51X3ByaXZhdGUgPSBOVUxMOworICAgIHUtPnVfcHJpdmF0ZSA9IE5VTEw7CiAKLQkvKiBQdXNoIHRoZSBvbGQgY29tcGlsZXJfdW5pdCBvbiB0aGUgc3RhY2suICovCi0JaWYgKGMtPnUpIHsKLQkJUHlPYmplY3QgKndyYXBwZXIgPSBQeUNPYmplY3RfRnJvbVZvaWRQdHIoYy0+dSwgTlVMTCk7Ci0JCWlmICghd3JhcHBlciB8fCBQeUxpc3RfQXBwZW5kKGMtPmNfc3RhY2ssIHdyYXBwZXIpIDwgMCkgewotCQkJUHlfWERFQ1JFRih3cmFwcGVyKTsKLQkJCWNvbXBpbGVyX3VuaXRfZnJlZSh1KTsKLQkJCXJldHVybiAwOwotCQl9Ci0JCVB5X0RFQ1JFRih3cmFwcGVyKTsKLQkJdS0+dV9wcml2YXRlID0gYy0+dS0+dV9wcml2YXRlOwotCQlQeV9YSU5DUkVGKHUtPnVfcHJpdmF0ZSk7Ci0JfQotCWMtPnUgPSB1OworICAgIC8qIFB1c2ggdGhlIG9sZCBjb21waWxlcl91bml0IG9uIHRoZSBzdGFjay4gKi8KKyAgICBpZiAoYy0+dSkgeworICAgICAgICBQeU9iamVjdCAqd3JhcHBlciA9IFB5Q09iamVjdF9Gcm9tVm9pZFB0cihjLT51LCBOVUxMKTsKKyAgICAgICAgaWYgKCF3cmFwcGVyIHx8IFB5TGlzdF9BcHBlbmQoYy0+Y19zdGFjaywgd3JhcHBlcikgPCAwKSB7CisgICAgICAgICAgICBQeV9YREVDUkVGKHdyYXBwZXIpOworICAgICAgICAgICAgY29tcGlsZXJfdW5pdF9mcmVlKHUpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgUHlfREVDUkVGKHdyYXBwZXIpOworICAgICAgICB1LT51X3ByaXZhdGUgPSBjLT51LT51X3ByaXZhdGU7CisgICAgICAgIFB5X1hJTkNSRUYodS0+dV9wcml2YXRlKTsKKyAgICB9CisgICAgYy0+dSA9IHU7CiAKLQljLT5jX25lc3RsZXZlbCsrOwotCWlmIChjb21waWxlcl91c2VfbmV3X2Jsb2NrKGMpID09IE5VTEwpCi0JCXJldHVybiAwOworICAgIGMtPmNfbmVzdGxldmVsKys7CisgICAgaWYgKGNvbXBpbGVyX3VzZV9uZXdfYmxvY2soYykgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIDA7CiAKLQlyZXR1cm4gMTsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIHZvaWQKIGNvbXBpbGVyX2V4aXRfc2NvcGUoc3RydWN0IGNvbXBpbGVyICpjKQogewotCWludCBuOwotCVB5T2JqZWN0ICp3cmFwcGVyOworICAgIGludCBuOworICAgIFB5T2JqZWN0ICp3cmFwcGVyOwogCi0JYy0+Y19uZXN0bGV2ZWwtLTsKLQljb21waWxlcl91bml0X2ZyZWUoYy0+dSk7Ci0JLyogUmVzdG9yZSBjLT51IHRvIHRoZSBwYXJlbnQgdW5pdC4gKi8KLQluID0gUHlMaXN0X0dFVF9TSVpFKGMtPmNfc3RhY2spIC0gMTsKLQlpZiAobiA+PSAwKSB7Ci0JCXdyYXBwZXIgPSBQeUxpc3RfR0VUX0lURU0oYy0+Y19zdGFjaywgbik7Ci0JCWMtPnUgPSAoc3RydWN0IGNvbXBpbGVyX3VuaXQgKilQeUNPYmplY3RfQXNWb2lkUHRyKHdyYXBwZXIpOwotCQlhc3NlcnQoYy0+dSk7Ci0JCS8qIHdlIGFyZSBkZWxldGluZyBmcm9tIGEgbGlzdCBzbyB0aGlzIHJlYWxseSBzaG91bGRuJ3QgZmFpbCAqLwotCQlpZiAoUHlTZXF1ZW5jZV9EZWxJdGVtKGMtPmNfc3RhY2ssIG4pIDwgMCkKLQkJCVB5X0ZhdGFsRXJyb3IoImNvbXBpbGVyX2V4aXRfc2NvcGUoKSIpOwotCQljb21waWxlcl91bml0X2NoZWNrKGMtPnUpOwotCX0KLQllbHNlCi0JCWMtPnUgPSBOVUxMOworICAgIGMtPmNfbmVzdGxldmVsLS07CisgICAgY29tcGlsZXJfdW5pdF9mcmVlKGMtPnUpOworICAgIC8qIFJlc3RvcmUgYy0+dSB0byB0aGUgcGFyZW50IHVuaXQuICovCisgICAgbiA9IFB5TGlzdF9HRVRfU0laRShjLT5jX3N0YWNrKSAtIDE7CisgICAgaWYgKG4gPj0gMCkgeworICAgICAgICB3cmFwcGVyID0gUHlMaXN0X0dFVF9JVEVNKGMtPmNfc3RhY2ssIG4pOworICAgICAgICBjLT51ID0gKHN0cnVjdCBjb21waWxlcl91bml0ICopUHlDT2JqZWN0X0FzVm9pZFB0cih3cmFwcGVyKTsKKyAgICAgICAgYXNzZXJ0KGMtPnUpOworICAgICAgICAvKiB3ZSBhcmUgZGVsZXRpbmcgZnJvbSBhIGxpc3Qgc28gdGhpcyByZWFsbHkgc2hvdWxkbid0IGZhaWwgKi8KKyAgICAgICAgaWYgKFB5U2VxdWVuY2VfRGVsSXRlbShjLT5jX3N0YWNrLCBuKSA8IDApCisgICAgICAgICAgICBQeV9GYXRhbEVycm9yKCJjb21waWxlcl9leGl0X3Njb3BlKCkiKTsKKyAgICAgICAgY29tcGlsZXJfdW5pdF9jaGVjayhjLT51KTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBjLT51ID0gTlVMTDsKIAogfQogCkBAIC01NDIsOSArNTQyLDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBjb21waWxlcl9uZXdfdG1wbmFtZShzdHJ1Y3QgY29tcGlsZXIgKmMpCiB7Ci0JY2hhciB0bXBuYW1lWzI1Nl07Ci0JUHlPU19zbnByaW50Zih0bXBuYW1lLCBzaXplb2YodG1wbmFtZSksICJfWyVkXSIsICsrYy0+dS0+dV90bXBuYW1lKTsKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyh0bXBuYW1lKTsKKyAgICBjaGFyIHRtcG5hbWVbMjU2XTsKKyAgICBQeU9TX3NucHJpbnRmKHRtcG5hbWUsIHNpemVvZih0bXBuYW1lKSwgIl9bJWRdIiwgKytjLT51LT51X3RtcG5hbWUpOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKHRtcG5hbWUpOwogfQogCiAvKiBBbGxvY2F0ZSBhIG5ldyBibG9jayBhbmQgcmV0dXJuIGEgcG9pbnRlciB0byBpdC4KQEAgLTU1NCw1MCArNTU0LDUwIEBACiBzdGF0aWMgYmFzaWNibG9jayAqCiBjb21waWxlcl9uZXdfYmxvY2soc3RydWN0IGNvbXBpbGVyICpjKQogewotCWJhc2ljYmxvY2sgKmI7Ci0Jc3RydWN0IGNvbXBpbGVyX3VuaXQgKnU7CisgICAgYmFzaWNibG9jayAqYjsKKyAgICBzdHJ1Y3QgY29tcGlsZXJfdW5pdCAqdTsKIAotCXUgPSBjLT51OwotCWIgPSAoYmFzaWNibG9jayAqKVB5T2JqZWN0X01hbGxvYyhzaXplb2YoYmFzaWNibG9jaykpOwotCWlmIChiID09IE5VTEwpIHsKLQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCW1lbXNldCgodm9pZCAqKWIsIDAsIHNpemVvZihiYXNpY2Jsb2NrKSk7Ci0JLyogRXh0ZW5kIHRoZSBzaW5nbHkgbGlua2VkIGxpc3Qgb2YgYmxvY2tzIHdpdGggbmV3IGJsb2NrLiAqLwotCWItPmJfbGlzdCA9IHUtPnVfYmxvY2tzOwotCXUtPnVfYmxvY2tzID0gYjsKLQlyZXR1cm4gYjsKKyAgICB1ID0gYy0+dTsKKyAgICBiID0gKGJhc2ljYmxvY2sgKilQeU9iamVjdF9NYWxsb2Moc2l6ZW9mKGJhc2ljYmxvY2spKTsKKyAgICBpZiAoYiA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBtZW1zZXQoKHZvaWQgKiliLCAwLCBzaXplb2YoYmFzaWNibG9jaykpOworICAgIC8qIEV4dGVuZCB0aGUgc2luZ2x5IGxpbmtlZCBsaXN0IG9mIGJsb2NrcyB3aXRoIG5ldyBibG9jay4gKi8KKyAgICBiLT5iX2xpc3QgPSB1LT51X2Jsb2NrczsKKyAgICB1LT51X2Jsb2NrcyA9IGI7CisgICAgcmV0dXJuIGI7CiB9CiAKIHN0YXRpYyBiYXNpY2Jsb2NrICoKIGNvbXBpbGVyX3VzZV9uZXdfYmxvY2soc3RydWN0IGNvbXBpbGVyICpjKQogewotCWJhc2ljYmxvY2sgKmJsb2NrID0gY29tcGlsZXJfbmV3X2Jsb2NrKGMpOwotCWlmIChibG9jayA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQljLT51LT51X2N1cmJsb2NrID0gYmxvY2s7Ci0JcmV0dXJuIGJsb2NrOworICAgIGJhc2ljYmxvY2sgKmJsb2NrID0gY29tcGlsZXJfbmV3X2Jsb2NrKGMpOworICAgIGlmIChibG9jayA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBjLT51LT51X2N1cmJsb2NrID0gYmxvY2s7CisgICAgcmV0dXJuIGJsb2NrOwogfQogCiBzdGF0aWMgYmFzaWNibG9jayAqCiBjb21waWxlcl9uZXh0X2Jsb2NrKHN0cnVjdCBjb21waWxlciAqYykKIHsKLQliYXNpY2Jsb2NrICpibG9jayA9IGNvbXBpbGVyX25ld19ibG9jayhjKTsKLQlpZiAoYmxvY2sgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JYy0+dS0+dV9jdXJibG9jay0+Yl9uZXh0ID0gYmxvY2s7Ci0JYy0+dS0+dV9jdXJibG9jayA9IGJsb2NrOwotCXJldHVybiBibG9jazsKKyAgICBiYXNpY2Jsb2NrICpibG9jayA9IGNvbXBpbGVyX25ld19ibG9jayhjKTsKKyAgICBpZiAoYmxvY2sgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYy0+dS0+dV9jdXJibG9jay0+Yl9uZXh0ID0gYmxvY2s7CisgICAgYy0+dS0+dV9jdXJibG9jayA9IGJsb2NrOworICAgIHJldHVybiBibG9jazsKIH0KIAogc3RhdGljIGJhc2ljYmxvY2sgKgogY29tcGlsZXJfdXNlX25leHRfYmxvY2soc3RydWN0IGNvbXBpbGVyICpjLCBiYXNpY2Jsb2NrICpibG9jaykKIHsKLQlhc3NlcnQoYmxvY2sgIT0gTlVMTCk7Ci0JYy0+dS0+dV9jdXJibG9jay0+Yl9uZXh0ID0gYmxvY2s7Ci0JYy0+dS0+dV9jdXJibG9jayA9IGJsb2NrOwotCXJldHVybiBibG9jazsKKyAgICBhc3NlcnQoYmxvY2sgIT0gTlVMTCk7CisgICAgYy0+dS0+dV9jdXJibG9jay0+Yl9uZXh0ID0gYmxvY2s7CisgICAgYy0+dS0+dV9jdXJibG9jayA9IGJsb2NrOworICAgIHJldHVybiBibG9jazsKIH0KIAogLyogUmV0dXJucyB0aGUgb2Zmc2V0IG9mIHRoZSBuZXh0IGluc3RydWN0aW9uIGluIHRoZSBjdXJyZW50IGJsb2NrJ3MKQEAgLTYwOCw0NCArNjA4LDQ0IEBACiBzdGF0aWMgaW50CiBjb21waWxlcl9uZXh0X2luc3RyKHN0cnVjdCBjb21waWxlciAqYywgYmFzaWNibG9jayAqYikKIHsKLQlhc3NlcnQoYiAhPSBOVUxMKTsKLQlpZiAoYi0+Yl9pbnN0ciA9PSBOVUxMKSB7Ci0JCWItPmJfaW5zdHIgPSAoc3RydWN0IGluc3RyICopUHlPYmplY3RfTWFsbG9jKAotCQkJCSBzaXplb2Yoc3RydWN0IGluc3RyKSAqIERFRkFVTFRfQkxPQ0tfU0laRSk7Ci0JCWlmIChiLT5iX2luc3RyID09IE5VTEwpIHsKLQkJCVB5RXJyX05vTWVtb3J5KCk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJYi0+Yl9pYWxsb2MgPSBERUZBVUxUX0JMT0NLX1NJWkU7Ci0JCW1lbXNldCgoY2hhciAqKWItPmJfaW5zdHIsIDAsCi0JCSAgICAgICBzaXplb2Yoc3RydWN0IGluc3RyKSAqIERFRkFVTFRfQkxPQ0tfU0laRSk7Ci0JfQotCWVsc2UgaWYgKGItPmJfaXVzZWQgPT0gYi0+Yl9pYWxsb2MpIHsKLQkJc3RydWN0IGluc3RyICp0bXA7Ci0JCXNpemVfdCBvbGRzaXplLCBuZXdzaXplOwotCQlvbGRzaXplID0gYi0+Yl9pYWxsb2MgKiBzaXplb2Yoc3RydWN0IGluc3RyKTsKLQkJbmV3c2l6ZSA9IG9sZHNpemUgPDwgMTsKKyAgICBhc3NlcnQoYiAhPSBOVUxMKTsKKyAgICBpZiAoYi0+Yl9pbnN0ciA9PSBOVUxMKSB7CisgICAgICAgIGItPmJfaW5zdHIgPSAoc3RydWN0IGluc3RyICopUHlPYmplY3RfTWFsbG9jKAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QgaW5zdHIpICogREVGQVVMVF9CTE9DS19TSVpFKTsKKyAgICAgICAgaWYgKGItPmJfaW5zdHIgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBiLT5iX2lhbGxvYyA9IERFRkFVTFRfQkxPQ0tfU0laRTsKKyAgICAgICAgbWVtc2V0KChjaGFyICopYi0+Yl9pbnN0ciwgMCwKKyAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QgaW5zdHIpICogREVGQVVMVF9CTE9DS19TSVpFKTsKKyAgICB9CisgICAgZWxzZSBpZiAoYi0+Yl9pdXNlZCA9PSBiLT5iX2lhbGxvYykgeworICAgICAgICBzdHJ1Y3QgaW5zdHIgKnRtcDsKKyAgICAgICAgc2l6ZV90IG9sZHNpemUsIG5ld3NpemU7CisgICAgICAgIG9sZHNpemUgPSBiLT5iX2lhbGxvYyAqIHNpemVvZihzdHJ1Y3QgaW5zdHIpOworICAgICAgICBuZXdzaXplID0gb2xkc2l6ZSA8PCAxOwogCi0JCWlmIChvbGRzaXplID4gKFBZX1NJWkVfTUFYID4+IDEpKSB7Ci0JCQlQeUVycl9Ob01lbW9yeSgpOwotCQkJcmV0dXJuIC0xOwotCQl9CisgICAgICAgIGlmIChvbGRzaXplID4gKFBZX1NJWkVfTUFYID4+IDEpKSB7CisgICAgICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CiAKLQkJaWYgKG5ld3NpemUgPT0gMCkgewotCQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQliLT5iX2lhbGxvYyA8PD0gMTsKLQkJdG1wID0gKHN0cnVjdCBpbnN0ciAqKVB5T2JqZWN0X1JlYWxsb2MoCi0JCQkJCQkodm9pZCAqKWItPmJfaW5zdHIsIG5ld3NpemUpOwotCQlpZiAodG1wID09IE5VTEwpIHsKLQkJCVB5RXJyX05vTWVtb3J5KCk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJYi0+Yl9pbnN0ciA9IHRtcDsKLQkJbWVtc2V0KChjaGFyICopYi0+Yl9pbnN0ciArIG9sZHNpemUsIDAsIG5ld3NpemUgLSBvbGRzaXplKTsKLQl9Ci0JcmV0dXJuIGItPmJfaXVzZWQrKzsKKyAgICAgICAgaWYgKG5ld3NpemUgPT0gMCkgeworICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBiLT5iX2lhbGxvYyA8PD0gMTsKKyAgICAgICAgdG1wID0gKHN0cnVjdCBpbnN0ciAqKVB5T2JqZWN0X1JlYWxsb2MoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiliLT5iX2luc3RyLCBuZXdzaXplKTsKKyAgICAgICAgaWYgKHRtcCA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGItPmJfaW5zdHIgPSB0bXA7CisgICAgICAgIG1lbXNldCgoY2hhciAqKWItPmJfaW5zdHIgKyBvbGRzaXplLCAwLCBuZXdzaXplIC0gb2xkc2l6ZSk7CisgICAgfQorICAgIHJldHVybiBiLT5iX2l1c2VkKys7CiB9CiAKIC8qIFNldCB0aGUgaV9saW5lbm8gbWVtYmVyIG9mIHRoZSBpbnN0cnVjdGlvbiBhdCBvZmZzZXQgb2ZmIGlmIHRoZQpAQCAtNjYzLDIzNSArNjYzLDIzNSBAQAogc3RhdGljIHZvaWQKIGNvbXBpbGVyX3NldF9saW5lbm8oc3RydWN0IGNvbXBpbGVyICpjLCBpbnQgb2ZmKQogewotCWJhc2ljYmxvY2sgKmI7Ci0JaWYgKGMtPnUtPnVfbGluZW5vX3NldCkKLQkJcmV0dXJuOwotCWMtPnUtPnVfbGluZW5vX3NldCA9IHRydWU7Ci0JYiA9IGMtPnUtPnVfY3VyYmxvY2s7Ci0JYi0+Yl9pbnN0cltvZmZdLmlfbGluZW5vID0gYy0+dS0+dV9saW5lbm87CisgICAgYmFzaWNibG9jayAqYjsKKyAgICBpZiAoYy0+dS0+dV9saW5lbm9fc2V0KQorICAgICAgICByZXR1cm47CisgICAgYy0+dS0+dV9saW5lbm9fc2V0ID0gdHJ1ZTsKKyAgICBiID0gYy0+dS0+dV9jdXJibG9jazsKKyAgICBiLT5iX2luc3RyW29mZl0uaV9saW5lbm8gPSBjLT51LT51X2xpbmVubzsKIH0KIAogc3RhdGljIGludAogb3Bjb2RlX3N0YWNrX2VmZmVjdChpbnQgb3Bjb2RlLCBpbnQgb3BhcmcpCiB7Ci0Jc3dpdGNoIChvcGNvZGUpIHsKLQkJY2FzZSBQT1BfVE9QOgotCQkJcmV0dXJuIC0xOwotCQljYXNlIFJPVF9UV086Ci0JCWNhc2UgUk9UX1RIUkVFOgotCQkJcmV0dXJuIDA7Ci0JCWNhc2UgRFVQX1RPUDoKLQkJCXJldHVybiAxOwotCQljYXNlIFJPVF9GT1VSOgotCQkJcmV0dXJuIDA7CisgICAgc3dpdGNoIChvcGNvZGUpIHsKKyAgICAgICAgY2FzZSBQT1BfVE9QOgorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBjYXNlIFJPVF9UV086CisgICAgICAgIGNhc2UgUk9UX1RIUkVFOgorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGNhc2UgRFVQX1RPUDoKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICBjYXNlIFJPVF9GT1VSOgorICAgICAgICAgICAgcmV0dXJuIDA7CiAKLQkJY2FzZSBVTkFSWV9QT1NJVElWRToKLQkJY2FzZSBVTkFSWV9ORUdBVElWRToKLQkJY2FzZSBVTkFSWV9OT1Q6Ci0JCWNhc2UgVU5BUllfQ09OVkVSVDoKLQkJY2FzZSBVTkFSWV9JTlZFUlQ6Ci0JCQlyZXR1cm4gMDsKKyAgICAgICAgY2FzZSBVTkFSWV9QT1NJVElWRToKKyAgICAgICAgY2FzZSBVTkFSWV9ORUdBVElWRToKKyAgICAgICAgY2FzZSBVTkFSWV9OT1Q6CisgICAgICAgIGNhc2UgVU5BUllfQ09OVkVSVDoKKyAgICAgICAgY2FzZSBVTkFSWV9JTlZFUlQ6CisgICAgICAgICAgICByZXR1cm4gMDsKIAotCQljYXNlIExJU1RfQVBQRU5EOgotCQkJcmV0dXJuIC0yOworICAgICAgICBjYXNlIExJU1RfQVBQRU5EOgorICAgICAgICAgICAgcmV0dXJuIC0yOwogCi0JCWNhc2UgQklOQVJZX1BPV0VSOgotCQljYXNlIEJJTkFSWV9NVUxUSVBMWToKLQkJY2FzZSBCSU5BUllfRElWSURFOgotCQljYXNlIEJJTkFSWV9NT0RVTE86Ci0JCWNhc2UgQklOQVJZX0FERDoKLQkJY2FzZSBCSU5BUllfU1VCVFJBQ1Q6Ci0JCWNhc2UgQklOQVJZX1NVQlNDUjoKLQkJY2FzZSBCSU5BUllfRkxPT1JfRElWSURFOgotCQljYXNlIEJJTkFSWV9UUlVFX0RJVklERToKLQkJCXJldHVybiAtMTsKLQkJY2FzZSBJTlBMQUNFX0ZMT09SX0RJVklERToKLQkJY2FzZSBJTlBMQUNFX1RSVUVfRElWSURFOgotCQkJcmV0dXJuIC0xOworICAgICAgICBjYXNlIEJJTkFSWV9QT1dFUjoKKyAgICAgICAgY2FzZSBCSU5BUllfTVVMVElQTFk6CisgICAgICAgIGNhc2UgQklOQVJZX0RJVklERToKKyAgICAgICAgY2FzZSBCSU5BUllfTU9EVUxPOgorICAgICAgICBjYXNlIEJJTkFSWV9BREQ6CisgICAgICAgIGNhc2UgQklOQVJZX1NVQlRSQUNUOgorICAgICAgICBjYXNlIEJJTkFSWV9TVUJTQ1I6CisgICAgICAgIGNhc2UgQklOQVJZX0ZMT09SX0RJVklERToKKyAgICAgICAgY2FzZSBCSU5BUllfVFJVRV9ESVZJREU6CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGNhc2UgSU5QTEFDRV9GTE9PUl9ESVZJREU6CisgICAgICAgIGNhc2UgSU5QTEFDRV9UUlVFX0RJVklERToKKyAgICAgICAgICAgIHJldHVybiAtMTsKIAotCQljYXNlIFNMSUNFKzA6Ci0JCQlyZXR1cm4gMTsKLQkJY2FzZSBTTElDRSsxOgotCQkJcmV0dXJuIDA7Ci0JCWNhc2UgU0xJQ0UrMjoKLQkJCXJldHVybiAwOwotCQljYXNlIFNMSUNFKzM6Ci0JCQlyZXR1cm4gLTE7CisgICAgICAgIGNhc2UgU0xJQ0UrMDoKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICBjYXNlIFNMSUNFKzE6CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgY2FzZSBTTElDRSsyOgorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGNhc2UgU0xJQ0UrMzoKKyAgICAgICAgICAgIHJldHVybiAtMTsKIAotCQljYXNlIFNUT1JFX1NMSUNFKzA6Ci0JCQlyZXR1cm4gLTI7Ci0JCWNhc2UgU1RPUkVfU0xJQ0UrMToKLQkJCXJldHVybiAtMzsKLQkJY2FzZSBTVE9SRV9TTElDRSsyOgotCQkJcmV0dXJuIC0zOwotCQljYXNlIFNUT1JFX1NMSUNFKzM6Ci0JCQlyZXR1cm4gLTQ7CisgICAgICAgIGNhc2UgU1RPUkVfU0xJQ0UrMDoKKyAgICAgICAgICAgIHJldHVybiAtMjsKKyAgICAgICAgY2FzZSBTVE9SRV9TTElDRSsxOgorICAgICAgICAgICAgcmV0dXJuIC0zOworICAgICAgICBjYXNlIFNUT1JFX1NMSUNFKzI6CisgICAgICAgICAgICByZXR1cm4gLTM7CisgICAgICAgIGNhc2UgU1RPUkVfU0xJQ0UrMzoKKyAgICAgICAgICAgIHJldHVybiAtNDsKIAotCQljYXNlIERFTEVURV9TTElDRSswOgotCQkJcmV0dXJuIC0xOwotCQljYXNlIERFTEVURV9TTElDRSsxOgotCQkJcmV0dXJuIC0yOwotCQljYXNlIERFTEVURV9TTElDRSsyOgotCQkJcmV0dXJuIC0yOwotCQljYXNlIERFTEVURV9TTElDRSszOgotCQkJcmV0dXJuIC0zOworICAgICAgICBjYXNlIERFTEVURV9TTElDRSswOgorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBjYXNlIERFTEVURV9TTElDRSsxOgorICAgICAgICAgICAgcmV0dXJuIC0yOworICAgICAgICBjYXNlIERFTEVURV9TTElDRSsyOgorICAgICAgICAgICAgcmV0dXJuIC0yOworICAgICAgICBjYXNlIERFTEVURV9TTElDRSszOgorICAgICAgICAgICAgcmV0dXJuIC0zOwogCi0JCWNhc2UgSU5QTEFDRV9BREQ6Ci0JCWNhc2UgSU5QTEFDRV9TVUJUUkFDVDoKLQkJY2FzZSBJTlBMQUNFX01VTFRJUExZOgotCQljYXNlIElOUExBQ0VfRElWSURFOgotCQljYXNlIElOUExBQ0VfTU9EVUxPOgotCQkJcmV0dXJuIC0xOwotCQljYXNlIFNUT1JFX1NVQlNDUjoKLQkJCXJldHVybiAtMzsKLQkJY2FzZSBTVE9SRV9NQVA6Ci0JCQlyZXR1cm4gLTI7Ci0JCWNhc2UgREVMRVRFX1NVQlNDUjoKLQkJCXJldHVybiAtMjsKKyAgICAgICAgY2FzZSBJTlBMQUNFX0FERDoKKyAgICAgICAgY2FzZSBJTlBMQUNFX1NVQlRSQUNUOgorICAgICAgICBjYXNlIElOUExBQ0VfTVVMVElQTFk6CisgICAgICAgIGNhc2UgSU5QTEFDRV9ESVZJREU6CisgICAgICAgIGNhc2UgSU5QTEFDRV9NT0RVTE86CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGNhc2UgU1RPUkVfU1VCU0NSOgorICAgICAgICAgICAgcmV0dXJuIC0zOworICAgICAgICBjYXNlIFNUT1JFX01BUDoKKyAgICAgICAgICAgIHJldHVybiAtMjsKKyAgICAgICAgY2FzZSBERUxFVEVfU1VCU0NSOgorICAgICAgICAgICAgcmV0dXJuIC0yOwogCi0JCWNhc2UgQklOQVJZX0xTSElGVDoKLQkJY2FzZSBCSU5BUllfUlNISUZUOgotCQljYXNlIEJJTkFSWV9BTkQ6Ci0JCWNhc2UgQklOQVJZX1hPUjoKLQkJY2FzZSBCSU5BUllfT1I6Ci0JCQlyZXR1cm4gLTE7Ci0JCWNhc2UgSU5QTEFDRV9QT1dFUjoKLQkJCXJldHVybiAtMTsKLQkJY2FzZSBHRVRfSVRFUjoKLQkJCXJldHVybiAwOworICAgICAgICBjYXNlIEJJTkFSWV9MU0hJRlQ6CisgICAgICAgIGNhc2UgQklOQVJZX1JTSElGVDoKKyAgICAgICAgY2FzZSBCSU5BUllfQU5EOgorICAgICAgICBjYXNlIEJJTkFSWV9YT1I6CisgICAgICAgIGNhc2UgQklOQVJZX09SOgorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBjYXNlIElOUExBQ0VfUE9XRVI6CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGNhc2UgR0VUX0lURVI6CisgICAgICAgICAgICByZXR1cm4gMDsKIAotCQljYXNlIFBSSU5UX0VYUFI6Ci0JCQlyZXR1cm4gLTE7Ci0JCWNhc2UgUFJJTlRfSVRFTToKLQkJCXJldHVybiAtMTsKLQkJY2FzZSBQUklOVF9ORVdMSU5FOgotCQkJcmV0dXJuIDA7Ci0JCWNhc2UgUFJJTlRfSVRFTV9UTzoKLQkJCXJldHVybiAtMjsKLQkJY2FzZSBQUklOVF9ORVdMSU5FX1RPOgotCQkJcmV0dXJuIC0xOwotCQljYXNlIElOUExBQ0VfTFNISUZUOgotCQljYXNlIElOUExBQ0VfUlNISUZUOgotCQljYXNlIElOUExBQ0VfQU5EOgotCQljYXNlIElOUExBQ0VfWE9SOgotCQljYXNlIElOUExBQ0VfT1I6Ci0JCQlyZXR1cm4gLTE7Ci0JCWNhc2UgQlJFQUtfTE9PUDoKLQkJCXJldHVybiAwOwotCQljYXNlIFdJVEhfQ0xFQU5VUDoKLQkJCXJldHVybiAtMTsgLyogWFhYIFNvbWV0aW1lcyBtb3JlICovCi0JCWNhc2UgTE9BRF9MT0NBTFM6Ci0JCQlyZXR1cm4gMTsKLQkJY2FzZSBSRVRVUk5fVkFMVUU6Ci0JCQlyZXR1cm4gLTE7Ci0JCWNhc2UgSU1QT1JUX1NUQVI6Ci0JCQlyZXR1cm4gLTE7Ci0JCWNhc2UgRVhFQ19TVE1UOgotCQkJcmV0dXJuIC0zOwotCQljYXNlIFlJRUxEX1ZBTFVFOgotCQkJcmV0dXJuIDA7CisgICAgICAgIGNhc2UgUFJJTlRfRVhQUjoKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgY2FzZSBQUklOVF9JVEVNOgorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBjYXNlIFBSSU5UX05FV0xJTkU6CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgY2FzZSBQUklOVF9JVEVNX1RPOgorICAgICAgICAgICAgcmV0dXJuIC0yOworICAgICAgICBjYXNlIFBSSU5UX05FV0xJTkVfVE86CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGNhc2UgSU5QTEFDRV9MU0hJRlQ6CisgICAgICAgIGNhc2UgSU5QTEFDRV9SU0hJRlQ6CisgICAgICAgIGNhc2UgSU5QTEFDRV9BTkQ6CisgICAgICAgIGNhc2UgSU5QTEFDRV9YT1I6CisgICAgICAgIGNhc2UgSU5QTEFDRV9PUjoKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgY2FzZSBCUkVBS19MT09QOgorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGNhc2UgV0lUSF9DTEVBTlVQOgorICAgICAgICAgICAgcmV0dXJuIC0xOyAvKiBYWFggU29tZXRpbWVzIG1vcmUgKi8KKyAgICAgICAgY2FzZSBMT0FEX0xPQ0FMUzoKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICBjYXNlIFJFVFVSTl9WQUxVRToKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgY2FzZSBJTVBPUlRfU1RBUjoKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgY2FzZSBFWEVDX1NUTVQ6CisgICAgICAgICAgICByZXR1cm4gLTM7CisgICAgICAgIGNhc2UgWUlFTERfVkFMVUU6CisgICAgICAgICAgICByZXR1cm4gMDsKIAotCQljYXNlIFBPUF9CTE9DSzoKLQkJCXJldHVybiAwOwotCQljYXNlIEVORF9GSU5BTExZOgotCQkJcmV0dXJuIC0xOyAvKiBvciAtMiBvciAtMyBpZiBleGNlcHRpb24gb2NjdXJyZWQgKi8KLQkJY2FzZSBCVUlMRF9DTEFTUzoKLQkJCXJldHVybiAtMjsKKyAgICAgICAgY2FzZSBQT1BfQkxPQ0s6CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgY2FzZSBFTkRfRklOQUxMWToKKyAgICAgICAgICAgIHJldHVybiAtMTsgLyogb3IgLTIgb3IgLTMgaWYgZXhjZXB0aW9uIG9jY3VycmVkICovCisgICAgICAgIGNhc2UgQlVJTERfQ0xBU1M6CisgICAgICAgICAgICByZXR1cm4gLTI7CiAKLQkJY2FzZSBTVE9SRV9OQU1FOgotCQkJcmV0dXJuIC0xOwotCQljYXNlIERFTEVURV9OQU1FOgotCQkJcmV0dXJuIDA7Ci0JCWNhc2UgVU5QQUNLX1NFUVVFTkNFOgotCQkJcmV0dXJuIG9wYXJnLTE7Ci0JCWNhc2UgRk9SX0lURVI6Ci0JCQlyZXR1cm4gMTsKKyAgICAgICAgY2FzZSBTVE9SRV9OQU1FOgorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBjYXNlIERFTEVURV9OQU1FOgorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGNhc2UgVU5QQUNLX1NFUVVFTkNFOgorICAgICAgICAgICAgcmV0dXJuIG9wYXJnLTE7CisgICAgICAgIGNhc2UgRk9SX0lURVI6CisgICAgICAgICAgICByZXR1cm4gMTsKIAotCQljYXNlIFNUT1JFX0FUVFI6Ci0JCQlyZXR1cm4gLTI7Ci0JCWNhc2UgREVMRVRFX0FUVFI6Ci0JCQlyZXR1cm4gLTE7Ci0JCWNhc2UgU1RPUkVfR0xPQkFMOgotCQkJcmV0dXJuIC0xOwotCQljYXNlIERFTEVURV9HTE9CQUw6Ci0JCQlyZXR1cm4gMDsKLQkJY2FzZSBEVVBfVE9QWDoKLQkJCXJldHVybiBvcGFyZzsKLQkJY2FzZSBMT0FEX0NPTlNUOgotCQkJcmV0dXJuIDE7Ci0JCWNhc2UgTE9BRF9OQU1FOgotCQkJcmV0dXJuIDE7Ci0JCWNhc2UgQlVJTERfVFVQTEU6Ci0JCWNhc2UgQlVJTERfTElTVDoKLQkJCXJldHVybiAxLW9wYXJnOwotCQljYXNlIEJVSUxEX01BUDoKLQkJCXJldHVybiAxOwotCQljYXNlIExPQURfQVRUUjoKLQkJCXJldHVybiAwOwotCQljYXNlIENPTVBBUkVfT1A6Ci0JCQlyZXR1cm4gLTE7Ci0JCWNhc2UgSU1QT1JUX05BTUU6Ci0JCQlyZXR1cm4gMDsKLQkJY2FzZSBJTVBPUlRfRlJPTToKLQkJCXJldHVybiAxOworICAgICAgICBjYXNlIFNUT1JFX0FUVFI6CisgICAgICAgICAgICByZXR1cm4gLTI7CisgICAgICAgIGNhc2UgREVMRVRFX0FUVFI6CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGNhc2UgU1RPUkVfR0xPQkFMOgorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBjYXNlIERFTEVURV9HTE9CQUw6CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgY2FzZSBEVVBfVE9QWDoKKyAgICAgICAgICAgIHJldHVybiBvcGFyZzsKKyAgICAgICAgY2FzZSBMT0FEX0NPTlNUOgorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIGNhc2UgTE9BRF9OQU1FOgorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIGNhc2UgQlVJTERfVFVQTEU6CisgICAgICAgIGNhc2UgQlVJTERfTElTVDoKKyAgICAgICAgICAgIHJldHVybiAxLW9wYXJnOworICAgICAgICBjYXNlIEJVSUxEX01BUDoKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICBjYXNlIExPQURfQVRUUjoKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBjYXNlIENPTVBBUkVfT1A6CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGNhc2UgSU1QT1JUX05BTUU6CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgY2FzZSBJTVBPUlRfRlJPTToKKyAgICAgICAgICAgIHJldHVybiAxOwogCi0JCWNhc2UgSlVNUF9GT1JXQVJEOgotCQljYXNlIEpVTVBfSUZfRkFMU0U6Ci0JCWNhc2UgSlVNUF9JRl9UUlVFOgotCQljYXNlIEpVTVBfQUJTT0xVVEU6Ci0JCQlyZXR1cm4gMDsKKyAgICAgICAgY2FzZSBKVU1QX0ZPUldBUkQ6CisgICAgICAgIGNhc2UgSlVNUF9JRl9GQUxTRToKKyAgICAgICAgY2FzZSBKVU1QX0lGX1RSVUU6CisgICAgICAgIGNhc2UgSlVNUF9BQlNPTFVURToKKyAgICAgICAgICAgIHJldHVybiAwOwogCi0JCWNhc2UgTE9BRF9HTE9CQUw6Ci0JCQlyZXR1cm4gMTsKKyAgICAgICAgY2FzZSBMT0FEX0dMT0JBTDoKKyAgICAgICAgICAgIHJldHVybiAxOwogCi0JCWNhc2UgQ09OVElOVUVfTE9PUDoKLQkJCXJldHVybiAwOwotCQljYXNlIFNFVFVQX0xPT1A6Ci0JCQlyZXR1cm4gMDsKLQkJY2FzZSBTRVRVUF9FWENFUFQ6Ci0JCWNhc2UgU0VUVVBfRklOQUxMWToKLQkJCXJldHVybiAzOyAvKiBhY3R1YWxseSBwdXNoZWQgYnkgYW4gZXhjZXB0aW9uICovCisgICAgICAgIGNhc2UgQ09OVElOVUVfTE9PUDoKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBjYXNlIFNFVFVQX0xPT1A6CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgY2FzZSBTRVRVUF9FWENFUFQ6CisgICAgICAgIGNhc2UgU0VUVVBfRklOQUxMWToKKyAgICAgICAgICAgIHJldHVybiAzOyAvKiBhY3R1YWxseSBwdXNoZWQgYnkgYW4gZXhjZXB0aW9uICovCiAKLQkJY2FzZSBMT0FEX0ZBU1Q6Ci0JCQlyZXR1cm4gMTsKLQkJY2FzZSBTVE9SRV9GQVNUOgotCQkJcmV0dXJuIC0xOwotCQljYXNlIERFTEVURV9GQVNUOgotCQkJcmV0dXJuIDA7CisgICAgICAgIGNhc2UgTE9BRF9GQVNUOgorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIGNhc2UgU1RPUkVfRkFTVDoKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgY2FzZSBERUxFVEVfRkFTVDoKKyAgICAgICAgICAgIHJldHVybiAwOwogCi0JCWNhc2UgUkFJU0VfVkFSQVJHUzoKLQkJCXJldHVybiAtb3Bhcmc7CisgICAgICAgIGNhc2UgUkFJU0VfVkFSQVJHUzoKKyAgICAgICAgICAgIHJldHVybiAtb3Bhcmc7CiAjZGVmaW5lIE5BUkdTKG8pICgoKG8pICUgMjU2KSArIDIqKChvKSAvIDI1NikpCi0JCWNhc2UgQ0FMTF9GVU5DVElPTjoKLQkJCXJldHVybiAtTkFSR1Mob3BhcmcpOwotCQljYXNlIENBTExfRlVOQ1RJT05fVkFSOgotCQljYXNlIENBTExfRlVOQ1RJT05fS1c6Ci0JCQlyZXR1cm4gLU5BUkdTKG9wYXJnKS0xOwotCQljYXNlIENBTExfRlVOQ1RJT05fVkFSX0tXOgotCQkJcmV0dXJuIC1OQVJHUyhvcGFyZyktMjsKKyAgICAgICAgY2FzZSBDQUxMX0ZVTkNUSU9OOgorICAgICAgICAgICAgcmV0dXJuIC1OQVJHUyhvcGFyZyk7CisgICAgICAgIGNhc2UgQ0FMTF9GVU5DVElPTl9WQVI6CisgICAgICAgIGNhc2UgQ0FMTF9GVU5DVElPTl9LVzoKKyAgICAgICAgICAgIHJldHVybiAtTkFSR1Mob3BhcmcpLTE7CisgICAgICAgIGNhc2UgQ0FMTF9GVU5DVElPTl9WQVJfS1c6CisgICAgICAgICAgICByZXR1cm4gLU5BUkdTKG9wYXJnKS0yOwogI3VuZGVmIE5BUkdTCi0JCWNhc2UgTUFLRV9GVU5DVElPTjoKLQkJCXJldHVybiAtb3Bhcmc7Ci0JCWNhc2UgQlVJTERfU0xJQ0U6Ci0JCQlpZiAob3BhcmcgPT0gMykKLQkJCQlyZXR1cm4gLTI7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIC0xOworICAgICAgICBjYXNlIE1BS0VfRlVOQ1RJT046CisgICAgICAgICAgICByZXR1cm4gLW9wYXJnOworICAgICAgICBjYXNlIEJVSUxEX1NMSUNFOgorICAgICAgICAgICAgaWYgKG9wYXJnID09IDMpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0yOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKIAotCQljYXNlIE1BS0VfQ0xPU1VSRToKLQkJCXJldHVybiAtb3Bhcmc7Ci0JCWNhc2UgTE9BRF9DTE9TVVJFOgotCQkJcmV0dXJuIDE7Ci0JCWNhc2UgTE9BRF9ERVJFRjoKLQkJCXJldHVybiAxOwotCQljYXNlIFNUT1JFX0RFUkVGOgotCQkJcmV0dXJuIC0xOwotCQlkZWZhdWx0OgotCQkJZnByaW50ZihzdGRlcnIsICJvcGNvZGUgPSAlZFxuIiwgb3Bjb2RlKTsKLQkJCVB5X0ZhdGFsRXJyb3IoIm9wY29kZV9zdGFja19lZmZlY3QoKSIpOworICAgICAgICBjYXNlIE1BS0VfQ0xPU1VSRToKKyAgICAgICAgICAgIHJldHVybiAtb3Bhcmc7CisgICAgICAgIGNhc2UgTE9BRF9DTE9TVVJFOgorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIGNhc2UgTE9BRF9ERVJFRjoKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICBjYXNlIFNUT1JFX0RFUkVGOgorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJvcGNvZGUgPSAlZFxuIiwgb3Bjb2RlKTsKKyAgICAgICAgICAgIFB5X0ZhdGFsRXJyb3IoIm9wY29kZV9zdGFja19lZmZlY3QoKSIpOwogCi0JfQotCXJldHVybiAwOyAvKiBub3QgcmVhY2hhYmxlICovCisgICAgfQorICAgIHJldHVybiAwOyAvKiBub3QgcmVhY2hhYmxlICovCiB9CiAKIC8qIEFkZCBhbiBvcGNvZGUgd2l0aCBubyBhcmd1bWVudC4KQEAgLTkwMSwxMTYgKzkwMSwxMTYgQEAKIHN0YXRpYyBpbnQKIGNvbXBpbGVyX2FkZG9wKHN0cnVjdCBjb21waWxlciAqYywgaW50IG9wY29kZSkKIHsKLQliYXNpY2Jsb2NrICpiOwotCXN0cnVjdCBpbnN0ciAqaTsKLQlpbnQgb2ZmOwotCW9mZiA9IGNvbXBpbGVyX25leHRfaW5zdHIoYywgYy0+dS0+dV9jdXJibG9jayk7Ci0JaWYgKG9mZiA8IDApCi0JCXJldHVybiAwOwotCWIgPSBjLT51LT51X2N1cmJsb2NrOwotCWkgPSAmYi0+Yl9pbnN0cltvZmZdOwotCWktPmlfb3Bjb2RlID0gb3Bjb2RlOwotCWktPmlfaGFzYXJnID0gMDsKLQlpZiAob3Bjb2RlID09IFJFVFVSTl9WQUxVRSkKLQkJYi0+Yl9yZXR1cm4gPSAxOwotCWNvbXBpbGVyX3NldF9saW5lbm8oYywgb2ZmKTsKLQlyZXR1cm4gMTsKKyAgICBiYXNpY2Jsb2NrICpiOworICAgIHN0cnVjdCBpbnN0ciAqaTsKKyAgICBpbnQgb2ZmOworICAgIG9mZiA9IGNvbXBpbGVyX25leHRfaW5zdHIoYywgYy0+dS0+dV9jdXJibG9jayk7CisgICAgaWYgKG9mZiA8IDApCisgICAgICAgIHJldHVybiAwOworICAgIGIgPSBjLT51LT51X2N1cmJsb2NrOworICAgIGkgPSAmYi0+Yl9pbnN0cltvZmZdOworICAgIGktPmlfb3Bjb2RlID0gb3Bjb2RlOworICAgIGktPmlfaGFzYXJnID0gMDsKKyAgICBpZiAob3Bjb2RlID09IFJFVFVSTl9WQUxVRSkKKyAgICAgICAgYi0+Yl9yZXR1cm4gPSAxOworICAgIGNvbXBpbGVyX3NldF9saW5lbm8oYywgb2ZmKTsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIGludAogY29tcGlsZXJfYWRkX28oc3RydWN0IGNvbXBpbGVyICpjLCBQeU9iamVjdCAqZGljdCwgUHlPYmplY3QgKm8pCiB7Ci0JUHlPYmplY3QgKnQsICp2OwotCVB5X3NzaXplX3QgYXJnOwotCWRvdWJsZSBkOworICAgIFB5T2JqZWN0ICp0LCAqdjsKKyAgICBQeV9zc2l6ZV90IGFyZzsKKyAgICBkb3VibGUgZDsKIAotCS8qIG5lY2Vzc2FyeSB0byBtYWtlIHN1cmUgdHlwZXMgYXJlbid0IGNvZXJjZWQgKGUuZy4sIGludCBhbmQgbG9uZykgKi8KLSAgICAgICAgLyogX2FuZF8gdG8gZGlzdGluZ3Vpc2ggMC4wIGZyb20gLTAuMCBlLmcuIG9uIElFRUUgcGxhdGZvcm1zICovCi0gICAgICAgIGlmIChQeUZsb2F0X0NoZWNrKG8pKSB7Ci0JCWQgPSBQeUZsb2F0X0FTX0RPVUJMRShvKTsKLQkJLyogYWxsIHdlIG5lZWQgaXMgdG8gbWFrZSB0aGUgdHVwbGUgZGlmZmVyZW50IGluIGVpdGhlciB0aGUgMC4wCi0JCSAqIG9yIC0wLjAgY2FzZSBmcm9tIGFsbCBvdGhlcnMsIGp1c3QgdG8gYXZvaWQgdGhlICJjb2VyY2lvbiIuCi0JCSAqLwotCQlpZiAoZCA9PSAwLjAgJiYgY29weXNpZ24oMS4wLCBkKSA8IDAuMCkKLQkJCXQgPSBQeVR1cGxlX1BhY2soMywgbywgby0+b2JfdHlwZSwgUHlfTm9uZSk7Ci0JCWVsc2UKLQkJCXQgPSBQeVR1cGxlX1BhY2soMiwgbywgby0+b2JfdHlwZSk7Ci0JfQorICAgIC8qIG5lY2Vzc2FyeSB0byBtYWtlIHN1cmUgdHlwZXMgYXJlbid0IGNvZXJjZWQgKGUuZy4sIGludCBhbmQgbG9uZykgKi8KKyAgICAvKiBfYW5kXyB0byBkaXN0aW5ndWlzaCAwLjAgZnJvbSAtMC4wIGUuZy4gb24gSUVFRSBwbGF0Zm9ybXMgKi8KKyAgICBpZiAoUHlGbG9hdF9DaGVjayhvKSkgeworICAgICAgICBkID0gUHlGbG9hdF9BU19ET1VCTEUobyk7CisgICAgICAgIC8qIGFsbCB3ZSBuZWVkIGlzIHRvIG1ha2UgdGhlIHR1cGxlIGRpZmZlcmVudCBpbiBlaXRoZXIgdGhlIDAuMAorICAgICAgICAgKiBvciAtMC4wIGNhc2UgZnJvbSBhbGwgb3RoZXJzLCBqdXN0IHRvIGF2b2lkIHRoZSAiY29lcmNpb24iLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKGQgPT0gMC4wICYmIGNvcHlzaWduKDEuMCwgZCkgPCAwLjApCisgICAgICAgICAgICB0ID0gUHlUdXBsZV9QYWNrKDMsIG8sIG8tPm9iX3R5cGUsIFB5X05vbmUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICB0ID0gUHlUdXBsZV9QYWNrKDIsIG8sIG8tPm9iX3R5cGUpOworICAgIH0KICNpZm5kZWYgV0lUSE9VVF9DT01QTEVYCi0JZWxzZSBpZiAoUHlDb21wbGV4X0NoZWNrKG8pKSB7Ci0JCVB5X2NvbXBsZXggejsKLQkJaW50IHJlYWxfbmVnemVybywgaW1hZ19uZWd6ZXJvOwotCQkvKiBGb3IgdGhlIGNvbXBsZXggY2FzZSB3ZSBtdXN0IG1ha2UgY29tcGxleCh4LCAwLikKLQkJICAgZGlmZmVyZW50IGZyb20gY29tcGxleCh4LCAtMC4pIGFuZCBjb21wbGV4KDAuLCB5KQotCQkgICBkaWZmZXJlbnQgZnJvbSBjb21wbGV4KC0wLiwgeSksIGZvciBhbnkgeCBhbmQgeS4KLQkJICAgQWxsIGZvdXIgY29tcGxleCB6ZXJvcyBtdXN0IGJlIGRpc3Rpbmd1aXNoZWQuKi8KLQkJeiA9IFB5Q29tcGxleF9Bc0NDb21wbGV4KG8pOwotCQlyZWFsX25lZ3plcm8gPSB6LnJlYWwgPT0gMC4wICYmIGNvcHlzaWduKDEuMCwgei5yZWFsKSA8IDAuMDsKLQkJaW1hZ19uZWd6ZXJvID0gei5pbWFnID09IDAuMCAmJiBjb3B5c2lnbigxLjAsIHouaW1hZykgPCAwLjA7Ci0JCWlmIChyZWFsX25lZ3plcm8gJiYgaW1hZ19uZWd6ZXJvKSB7Ci0JCQl0ID0gUHlUdXBsZV9QYWNrKDUsIG8sIG8tPm9iX3R5cGUsCi0JCQkJCSBQeV9Ob25lLCBQeV9Ob25lLCBQeV9Ob25lKTsKLQkJfQotCQllbHNlIGlmIChpbWFnX25lZ3plcm8pIHsKLQkJCXQgPSBQeVR1cGxlX1BhY2soNCwgbywgby0+b2JfdHlwZSwgUHlfTm9uZSwgUHlfTm9uZSk7Ci0JCX0KLQkJZWxzZSBpZiAocmVhbF9uZWd6ZXJvKSB7Ci0JCQl0ID0gUHlUdXBsZV9QYWNrKDMsIG8sIG8tPm9iX3R5cGUsIFB5X05vbmUpOwotCQl9Ci0JCWVsc2UgewotCQkJdCA9IFB5VHVwbGVfUGFjaygyLCBvLCBvLT5vYl90eXBlKTsKLQkJfQorICAgIGVsc2UgaWYgKFB5Q29tcGxleF9DaGVjayhvKSkgeworICAgICAgICBQeV9jb21wbGV4IHo7CisgICAgICAgIGludCByZWFsX25lZ3plcm8sIGltYWdfbmVnemVybzsKKyAgICAgICAgLyogRm9yIHRoZSBjb21wbGV4IGNhc2Ugd2UgbXVzdCBtYWtlIGNvbXBsZXgoeCwgMC4pCisgICAgICAgICAgIGRpZmZlcmVudCBmcm9tIGNvbXBsZXgoeCwgLTAuKSBhbmQgY29tcGxleCgwLiwgeSkKKyAgICAgICAgICAgZGlmZmVyZW50IGZyb20gY29tcGxleCgtMC4sIHkpLCBmb3IgYW55IHggYW5kIHkuCisgICAgICAgICAgIEFsbCBmb3VyIGNvbXBsZXggemVyb3MgbXVzdCBiZSBkaXN0aW5ndWlzaGVkLiovCisgICAgICAgIHogPSBQeUNvbXBsZXhfQXNDQ29tcGxleChvKTsKKyAgICAgICAgcmVhbF9uZWd6ZXJvID0gei5yZWFsID09IDAuMCAmJiBjb3B5c2lnbigxLjAsIHoucmVhbCkgPCAwLjA7CisgICAgICAgIGltYWdfbmVnemVybyA9IHouaW1hZyA9PSAwLjAgJiYgY29weXNpZ24oMS4wLCB6LmltYWcpIDwgMC4wOworICAgICAgICBpZiAocmVhbF9uZWd6ZXJvICYmIGltYWdfbmVnemVybykgeworICAgICAgICAgICAgdCA9IFB5VHVwbGVfUGFjayg1LCBvLCBvLT5vYl90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9Ob25lLCBQeV9Ob25lLCBQeV9Ob25lKTsKICAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChpbWFnX25lZ3plcm8pIHsKKyAgICAgICAgICAgIHQgPSBQeVR1cGxlX1BhY2soNCwgbywgby0+b2JfdHlwZSwgUHlfTm9uZSwgUHlfTm9uZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAocmVhbF9uZWd6ZXJvKSB7CisgICAgICAgICAgICB0ID0gUHlUdXBsZV9QYWNrKDMsIG8sIG8tPm9iX3R5cGUsIFB5X05vbmUpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgdCA9IFB5VHVwbGVfUGFjaygyLCBvLCBvLT5vYl90eXBlKTsKKyAgICAgICAgfQorICAgIH0KICNlbmRpZiAvKiBXSVRIT1VUX0NPTVBMRVggKi8KLQllbHNlIHsKLQkJdCA9IFB5VHVwbGVfUGFjaygyLCBvLCBvLT5vYl90eXBlKTsKLSAgICAgICAgfQotCWlmICh0ID09IE5VTEwpCi0JCXJldHVybiAtMTsKKyAgICBlbHNlIHsKKyAgICAgICAgdCA9IFB5VHVwbGVfUGFjaygyLCBvLCBvLT5vYl90eXBlKTsKKyAgICB9CisgICAgaWYgKHQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0JdiA9IFB5RGljdF9HZXRJdGVtKGRpY3QsIHQpOwotCWlmICghdikgewotCQlhcmcgPSBQeURpY3RfU2l6ZShkaWN0KTsKLQkJdiA9IFB5SW50X0Zyb21Mb25nKGFyZyk7Ci0JCWlmICghdikgewotCQkJUHlfREVDUkVGKHQpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWlmIChQeURpY3RfU2V0SXRlbShkaWN0LCB0LCB2KSA8IDApIHsKLQkJCVB5X0RFQ1JFRih0KTsKLQkJCVB5X0RFQ1JFRih2KTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlQeV9ERUNSRUYodik7Ci0JfQotCWVsc2UKLQkJYXJnID0gUHlJbnRfQXNMb25nKHYpOwotCVB5X0RFQ1JFRih0KTsKLQlyZXR1cm4gYXJnOworICAgIHYgPSBQeURpY3RfR2V0SXRlbShkaWN0LCB0KTsKKyAgICBpZiAoIXYpIHsKKyAgICAgICAgYXJnID0gUHlEaWN0X1NpemUoZGljdCk7CisgICAgICAgIHYgPSBQeUludF9Gcm9tTG9uZyhhcmcpOworICAgICAgICBpZiAoIXYpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih0KTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW0oZGljdCwgdCwgdikgPCAwKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYodCk7CisgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgUHlfREVDUkVGKHYpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIGFyZyA9IFB5SW50X0FzTG9uZyh2KTsKKyAgICBQeV9ERUNSRUYodCk7CisgICAgcmV0dXJuIGFyZzsKIH0KIAogc3RhdGljIGludAogY29tcGlsZXJfYWRkb3BfbyhzdHJ1Y3QgY29tcGlsZXIgKmMsIGludCBvcGNvZGUsIFB5T2JqZWN0ICpkaWN0LAotCQkgICAgIFB5T2JqZWN0ICpvKQorICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKm8pCiB7CiAgICAgaW50IGFyZyA9IGNvbXBpbGVyX2FkZF9vKGMsIGRpY3QsIG8pOwogICAgIGlmIChhcmcgPCAwKQotCXJldHVybiAwOworICAgIHJldHVybiAwOwogICAgIHJldHVybiBjb21waWxlcl9hZGRvcF9pKGMsIG9wY29kZSwgYXJnKTsKIH0KIAogc3RhdGljIGludAogY29tcGlsZXJfYWRkb3BfbmFtZShzdHJ1Y3QgY29tcGlsZXIgKmMsIGludCBvcGNvZGUsIFB5T2JqZWN0ICpkaWN0LAotCQkgICAgUHlPYmplY3QgKm8pCisgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpvKQogewogICAgIGludCBhcmc7CiAgICAgUHlPYmplY3QgKm1hbmdsZWQgPSBfUHlfTWFuZ2xlKGMtPnUtPnVfcHJpdmF0ZSwgbyk7CiAgICAgaWYgKCFtYW5nbGVkKQotCXJldHVybiAwOworICAgIHJldHVybiAwOwogICAgIGFyZyA9IGNvbXBpbGVyX2FkZF9vKGMsIGRpY3QsIG1hbmdsZWQpOwogICAgIFB5X0RFQ1JFRihtYW5nbGVkKTsKICAgICBpZiAoYXJnIDwgMCkKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKICAgICByZXR1cm4gY29tcGlsZXJfYWRkb3BfaShjLCBvcGNvZGUsIGFyZyk7CiB9CiAKQEAgLTEwMjEsNDMgKzEwMjEsNDMgQEAKIHN0YXRpYyBpbnQKIGNvbXBpbGVyX2FkZG9wX2koc3RydWN0IGNvbXBpbGVyICpjLCBpbnQgb3Bjb2RlLCBpbnQgb3BhcmcpCiB7Ci0Jc3RydWN0IGluc3RyICppOwotCWludCBvZmY7Ci0Jb2ZmID0gY29tcGlsZXJfbmV4dF9pbnN0cihjLCBjLT51LT51X2N1cmJsb2NrKTsKLQlpZiAob2ZmIDwgMCkKLQkJcmV0dXJuIDA7Ci0JaSA9ICZjLT51LT51X2N1cmJsb2NrLT5iX2luc3RyW29mZl07Ci0JaS0+aV9vcGNvZGUgPSBvcGNvZGU7Ci0JaS0+aV9vcGFyZyA9IG9wYXJnOwotCWktPmlfaGFzYXJnID0gMTsKLQljb21waWxlcl9zZXRfbGluZW5vKGMsIG9mZik7Ci0JcmV0dXJuIDE7CisgICAgc3RydWN0IGluc3RyICppOworICAgIGludCBvZmY7CisgICAgb2ZmID0gY29tcGlsZXJfbmV4dF9pbnN0cihjLCBjLT51LT51X2N1cmJsb2NrKTsKKyAgICBpZiAob2ZmIDwgMCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaSA9ICZjLT51LT51X2N1cmJsb2NrLT5iX2luc3RyW29mZl07CisgICAgaS0+aV9vcGNvZGUgPSBvcGNvZGU7CisgICAgaS0+aV9vcGFyZyA9IG9wYXJnOworICAgIGktPmlfaGFzYXJnID0gMTsKKyAgICBjb21waWxlcl9zZXRfbGluZW5vKGMsIG9mZik7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyBpbnQKIGNvbXBpbGVyX2FkZG9wX2ooc3RydWN0IGNvbXBpbGVyICpjLCBpbnQgb3Bjb2RlLCBiYXNpY2Jsb2NrICpiLCBpbnQgYWJzb2x1dGUpCiB7Ci0Jc3RydWN0IGluc3RyICppOwotCWludCBvZmY7CisgICAgc3RydWN0IGluc3RyICppOworICAgIGludCBvZmY7CiAKLQlhc3NlcnQoYiAhPSBOVUxMKTsKLQlvZmYgPSBjb21waWxlcl9uZXh0X2luc3RyKGMsIGMtPnUtPnVfY3VyYmxvY2spOwotCWlmIChvZmYgPCAwKQotCQlyZXR1cm4gMDsKLQlpID0gJmMtPnUtPnVfY3VyYmxvY2stPmJfaW5zdHJbb2ZmXTsKLQlpLT5pX29wY29kZSA9IG9wY29kZTsKLQlpLT5pX3RhcmdldCA9IGI7Ci0JaS0+aV9oYXNhcmcgPSAxOwotCWlmIChhYnNvbHV0ZSkKLQkJaS0+aV9qYWJzID0gMTsKLQllbHNlCi0JCWktPmlfanJlbCA9IDE7Ci0JY29tcGlsZXJfc2V0X2xpbmVubyhjLCBvZmYpOwotCXJldHVybiAxOworICAgIGFzc2VydChiICE9IE5VTEwpOworICAgIG9mZiA9IGNvbXBpbGVyX25leHRfaW5zdHIoYywgYy0+dS0+dV9jdXJibG9jayk7CisgICAgaWYgKG9mZiA8IDApCisgICAgICAgIHJldHVybiAwOworICAgIGkgPSAmYy0+dS0+dV9jdXJibG9jay0+Yl9pbnN0cltvZmZdOworICAgIGktPmlfb3Bjb2RlID0gb3Bjb2RlOworICAgIGktPmlfdGFyZ2V0ID0gYjsKKyAgICBpLT5pX2hhc2FyZyA9IDE7CisgICAgaWYgKGFic29sdXRlKQorICAgICAgICBpLT5pX2phYnMgPSAxOworICAgIGVsc2UKKyAgICAgICAgaS0+aV9qcmVsID0gMTsKKyAgICBjb21waWxlcl9zZXRfbGluZW5vKGMsIG9mZik7CisgICAgcmV0dXJuIDE7CiB9CiAKLS8qIFRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIE5FV19CTE9DSyBhbmQgTkVYVF9CTE9DSyBpcyBzdWJ0bGUuCShJJ2QKLSAgIGxpa2UgdG8gZmluZCBiZXR0ZXIgbmFtZXMuKQlORVdfQkxPQ0soKSBjcmVhdGVzIGEgbmV3IGJsb2NrIGFuZCBzZXRzCisvKiBUaGUgZGlzdGluY3Rpb24gYmV0d2VlbiBORVdfQkxPQ0sgYW5kIE5FWFRfQkxPQ0sgaXMgc3VidGxlLiAgKEknZAorICAgbGlrZSB0byBmaW5kIGJldHRlciBuYW1lcy4pICBORVdfQkxPQ0soKSBjcmVhdGVzIGEgbmV3IGJsb2NrIGFuZCBzZXRzCiAgICBpdCBhcyB0aGUgY3VycmVudCBibG9jay4gIE5FWFRfQkxPQ0soKSBhbHNvIGNyZWF0ZXMgYW4gaW1wbGljaXQganVtcAogICAgZnJvbSB0aGUgY3VycmVudCBibG9jayB0byB0aGUgbmV3IGJsb2NrLgogKi8KQEAgLTEwNjgsNTAgKzEwNjgsNTAgQEAKIAogCiAjZGVmaW5lIE5FV19CTE9DSyhDKSB7IFwKLQlpZiAoY29tcGlsZXJfdXNlX25ld19ibG9jaygoQykpID09IE5VTEwpIFwKLQkJcmV0dXJuIDA7IFwKKyAgICBpZiAoY29tcGlsZXJfdXNlX25ld19ibG9jaygoQykpID09IE5VTEwpIFwKKyAgICAgICAgcmV0dXJuIDA7IFwKIH0KIAogI2RlZmluZSBORVhUX0JMT0NLKEMpIHsgXAotCWlmIChjb21waWxlcl9uZXh0X2Jsb2NrKChDKSkgPT0gTlVMTCkgXAotCQlyZXR1cm4gMDsgXAorICAgIGlmIChjb21waWxlcl9uZXh0X2Jsb2NrKChDKSkgPT0gTlVMTCkgXAorICAgICAgICByZXR1cm4gMDsgXAogfQogCiAjZGVmaW5lIEFERE9QKEMsIE9QKSB7IFwKLQlpZiAoIWNvbXBpbGVyX2FkZG9wKChDKSwgKE9QKSkpIFwKLQkJcmV0dXJuIDA7IFwKKyAgICBpZiAoIWNvbXBpbGVyX2FkZG9wKChDKSwgKE9QKSkpIFwKKyAgICAgICAgcmV0dXJuIDA7IFwKIH0KIAogI2RlZmluZSBBRERPUF9JTl9TQ09QRShDLCBPUCkgeyBcCi0JaWYgKCFjb21waWxlcl9hZGRvcCgoQyksIChPUCkpKSB7IFwKLQkJY29tcGlsZXJfZXhpdF9zY29wZShjKTsgXAotCQlyZXR1cm4gMDsgXAotCX0gXAorICAgIGlmICghY29tcGlsZXJfYWRkb3AoKEMpLCAoT1ApKSkgeyBcCisgICAgICAgIGNvbXBpbGVyX2V4aXRfc2NvcGUoYyk7IFwKKyAgICAgICAgcmV0dXJuIDA7IFwKKyAgICB9IFwKIH0KIAogI2RlZmluZSBBRERPUF9PKEMsIE9QLCBPLCBUWVBFKSB7IFwKLQlpZiAoIWNvbXBpbGVyX2FkZG9wX28oKEMpLCAoT1ApLCAoQyktPnUtPnVfICMjIFRZUEUsIChPKSkpIFwKLQkJcmV0dXJuIDA7IFwKKyAgICBpZiAoIWNvbXBpbGVyX2FkZG9wX28oKEMpLCAoT1ApLCAoQyktPnUtPnVfICMjIFRZUEUsIChPKSkpIFwKKyAgICAgICAgcmV0dXJuIDA7IFwKIH0KIAogI2RlZmluZSBBRERPUF9OQU1FKEMsIE9QLCBPLCBUWVBFKSB7IFwKLQlpZiAoIWNvbXBpbGVyX2FkZG9wX25hbWUoKEMpLCAoT1ApLCAoQyktPnUtPnVfICMjIFRZUEUsIChPKSkpIFwKLQkJcmV0dXJuIDA7IFwKKyAgICBpZiAoIWNvbXBpbGVyX2FkZG9wX25hbWUoKEMpLCAoT1ApLCAoQyktPnUtPnVfICMjIFRZUEUsIChPKSkpIFwKKyAgICAgICAgcmV0dXJuIDA7IFwKIH0KIAogI2RlZmluZSBBRERPUF9JKEMsIE9QLCBPKSB7IFwKLQlpZiAoIWNvbXBpbGVyX2FkZG9wX2koKEMpLCAoT1ApLCAoTykpKSBcCi0JCXJldHVybiAwOyBcCisgICAgaWYgKCFjb21waWxlcl9hZGRvcF9pKChDKSwgKE9QKSwgKE8pKSkgXAorICAgICAgICByZXR1cm4gMDsgXAogfQogCiAjZGVmaW5lIEFERE9QX0pBQlMoQywgT1AsIE8pIHsgXAotCWlmICghY29tcGlsZXJfYWRkb3BfaigoQyksIChPUCksIChPKSwgMSkpIFwKLQkJcmV0dXJuIDA7IFwKKyAgICBpZiAoIWNvbXBpbGVyX2FkZG9wX2ooKEMpLCAoT1ApLCAoTyksIDEpKSBcCisgICAgICAgIHJldHVybiAwOyBcCiB9CiAKICNkZWZpbmUgQURET1BfSlJFTChDLCBPUCwgTykgeyBcCi0JaWYgKCFjb21waWxlcl9hZGRvcF9qKChDKSwgKE9QKSwgKE8pLCAwKSkgXAotCQlyZXR1cm4gMDsgXAorICAgIGlmICghY29tcGlsZXJfYWRkb3BfaigoQyksIChPUCksIChPKSwgMCkpIFwKKyAgICAgICAgcmV0dXJuIDA7IFwKIH0KIAogLyogVklTSVQgYW5kIFZJU0lUX1NFUSB0YWtlcyBhbiBBU0RMIHR5cGUgYXMgdGhlaXIgc2Vjb25kIGFyZ3VtZW50LiAgVGhleSB1c2UKQEAgLTExMTksNDkgKzExMTksNDkgQEAKICovCiAKICNkZWZpbmUgVklTSVQoQywgVFlQRSwgVikge1wKLQlpZiAoIWNvbXBpbGVyX3Zpc2l0XyAjIyBUWVBFKChDKSwgKFYpKSkgXAotCQlyZXR1cm4gMDsgXAorICAgIGlmICghY29tcGlsZXJfdmlzaXRfICMjIFRZUEUoKEMpLCAoVikpKSBcCisgICAgICAgIHJldHVybiAwOyBcCiB9CiAKICNkZWZpbmUgVklTSVRfSU5fU0NPUEUoQywgVFlQRSwgVikge1wKLQlpZiAoIWNvbXBpbGVyX3Zpc2l0XyAjIyBUWVBFKChDKSwgKFYpKSkgeyBcCi0JCWNvbXBpbGVyX2V4aXRfc2NvcGUoYyk7IFwKLQkJcmV0dXJuIDA7IFwKLQl9IFwKKyAgICBpZiAoIWNvbXBpbGVyX3Zpc2l0XyAjIyBUWVBFKChDKSwgKFYpKSkgeyBcCisgICAgICAgIGNvbXBpbGVyX2V4aXRfc2NvcGUoYyk7IFwKKyAgICAgICAgcmV0dXJuIDA7IFwKKyAgICB9IFwKIH0KIAogI2RlZmluZSBWSVNJVF9TTElDRShDLCBWLCBDVFgpIHtcCi0JaWYgKCFjb21waWxlcl92aXNpdF9zbGljZSgoQyksIChWKSwgKENUWCkpKSBcCi0JCXJldHVybiAwOyBcCisgICAgaWYgKCFjb21waWxlcl92aXNpdF9zbGljZSgoQyksIChWKSwgKENUWCkpKSBcCisgICAgICAgIHJldHVybiAwOyBcCiB9CiAKICNkZWZpbmUgVklTSVRfU0VRKEMsIFRZUEUsIFNFUSkgeyBcCi0JaW50IF9pOyBcCi0JYXNkbF9zZXEgKnNlcSA9IChTRVEpOyAvKiBhdm9pZCB2YXJpYWJsZSBjYXB0dXJlICovIFwKLQlmb3IgKF9pID0gMDsgX2kgPCBhc2RsX3NlcV9MRU4oc2VxKTsgX2krKykgeyBcCi0JCVRZUEUgIyMgX3R5IGVsdCA9IChUWVBFICMjIF90eSlhc2RsX3NlcV9HRVQoc2VxLCBfaSk7IFwKLQkJaWYgKCFjb21waWxlcl92aXNpdF8gIyMgVFlQRSgoQyksIGVsdCkpIFwKLQkJCXJldHVybiAwOyBcCi0JfSBcCisgICAgaW50IF9pOyBcCisgICAgYXNkbF9zZXEgKnNlcSA9IChTRVEpOyAvKiBhdm9pZCB2YXJpYWJsZSBjYXB0dXJlICovIFwKKyAgICBmb3IgKF9pID0gMDsgX2kgPCBhc2RsX3NlcV9MRU4oc2VxKTsgX2krKykgeyBcCisgICAgICAgIFRZUEUgIyMgX3R5IGVsdCA9IChUWVBFICMjIF90eSlhc2RsX3NlcV9HRVQoc2VxLCBfaSk7IFwKKyAgICAgICAgaWYgKCFjb21waWxlcl92aXNpdF8gIyMgVFlQRSgoQyksIGVsdCkpIFwKKyAgICAgICAgICAgIHJldHVybiAwOyBcCisgICAgfSBcCiB9CiAKICNkZWZpbmUgVklTSVRfU0VRX0lOX1NDT1BFKEMsIFRZUEUsIFNFUSkgeyBcCi0JaW50IF9pOyBcCi0JYXNkbF9zZXEgKnNlcSA9IChTRVEpOyAvKiBhdm9pZCB2YXJpYWJsZSBjYXB0dXJlICovIFwKLQlmb3IgKF9pID0gMDsgX2kgPCBhc2RsX3NlcV9MRU4oc2VxKTsgX2krKykgeyBcCi0JCVRZUEUgIyMgX3R5IGVsdCA9IChUWVBFICMjIF90eSlhc2RsX3NlcV9HRVQoc2VxLCBfaSk7IFwKLQkJaWYgKCFjb21waWxlcl92aXNpdF8gIyMgVFlQRSgoQyksIGVsdCkpIHsgXAotCQkJY29tcGlsZXJfZXhpdF9zY29wZShjKTsgXAotCQkJcmV0dXJuIDA7IFwKLQkJfSBcCi0JfSBcCisgICAgaW50IF9pOyBcCisgICAgYXNkbF9zZXEgKnNlcSA9IChTRVEpOyAvKiBhdm9pZCB2YXJpYWJsZSBjYXB0dXJlICovIFwKKyAgICBmb3IgKF9pID0gMDsgX2kgPCBhc2RsX3NlcV9MRU4oc2VxKTsgX2krKykgeyBcCisgICAgICAgIFRZUEUgIyMgX3R5IGVsdCA9IChUWVBFICMjIF90eSlhc2RsX3NlcV9HRVQoc2VxLCBfaSk7IFwKKyAgICAgICAgaWYgKCFjb21waWxlcl92aXNpdF8gIyMgVFlQRSgoQyksIGVsdCkpIHsgXAorICAgICAgICAgICAgY29tcGlsZXJfZXhpdF9zY29wZShjKTsgXAorICAgICAgICAgICAgcmV0dXJuIDA7IFwKKyAgICAgICAgfSBcCisgICAgfSBcCiB9CiAKIHN0YXRpYyBpbnQKIGNvbXBpbGVyX2lzZG9jc3RyaW5nKHN0bXRfdHkgcykKIHsKICAgICBpZiAocy0+a2luZCAhPSBFeHByX2tpbmQpCi0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiAgICAgcmV0dXJuIHMtPnYuRXhwci52YWx1ZS0+a2luZCA9PSBTdHJfa2luZDsKIH0KIApAQCAtMTE3MCw2NyArMTE3MCw2NyBAQAogc3RhdGljIGludAogY29tcGlsZXJfYm9keShzdHJ1Y3QgY29tcGlsZXIgKmMsIGFzZGxfc2VxICpzdG10cykKIHsKLQlpbnQgaSA9IDA7Ci0Jc3RtdF90eSBzdDsKKyAgICBpbnQgaSA9IDA7CisgICAgc3RtdF90eSBzdDsKIAotCWlmICghYXNkbF9zZXFfTEVOKHN0bXRzKSkKLQkJcmV0dXJuIDE7Ci0Jc3QgPSAoc3RtdF90eSlhc2RsX3NlcV9HRVQoc3RtdHMsIDApOwotCWlmIChjb21waWxlcl9pc2RvY3N0cmluZyhzdCkgJiYgUHlfT3B0aW1pemVGbGFnIDwgMikgewotCQkvKiBkb24ndCBnZW5lcmF0ZSBkb2NzdHJpbmdzIGlmIC1PTyAqLwotCQlpID0gMTsKLQkJVklTSVQoYywgZXhwciwgc3QtPnYuRXhwci52YWx1ZSk7Ci0JCWlmICghY29tcGlsZXJfbmFtZW9wKGMsIF9fZG9jX18sIFN0b3JlKSkKLQkJCXJldHVybiAwOwotCX0KLQlmb3IgKDsgaSA8IGFzZGxfc2VxX0xFTihzdG10cyk7IGkrKykKLQkgICAgVklTSVQoYywgc3RtdCwgKHN0bXRfdHkpYXNkbF9zZXFfR0VUKHN0bXRzLCBpKSk7Ci0JcmV0dXJuIDE7CisgICAgaWYgKCFhc2RsX3NlcV9MRU4oc3RtdHMpKQorICAgICAgICByZXR1cm4gMTsKKyAgICBzdCA9IChzdG10X3R5KWFzZGxfc2VxX0dFVChzdG10cywgMCk7CisgICAgaWYgKGNvbXBpbGVyX2lzZG9jc3RyaW5nKHN0KSAmJiBQeV9PcHRpbWl6ZUZsYWcgPCAyKSB7CisgICAgICAgIC8qIGRvbid0IGdlbmVyYXRlIGRvY3N0cmluZ3MgaWYgLU9PICovCisgICAgICAgIGkgPSAxOworICAgICAgICBWSVNJVChjLCBleHByLCBzdC0+di5FeHByLnZhbHVlKTsKKyAgICAgICAgaWYgKCFjb21waWxlcl9uYW1lb3AoYywgX19kb2NfXywgU3RvcmUpKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGZvciAoOyBpIDwgYXNkbF9zZXFfTEVOKHN0bXRzKTsgaSsrKQorICAgICAgICBWSVNJVChjLCBzdG10LCAoc3RtdF90eSlhc2RsX3NlcV9HRVQoc3RtdHMsIGkpKTsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIFB5Q29kZU9iamVjdCAqCiBjb21waWxlcl9tb2Qoc3RydWN0IGNvbXBpbGVyICpjLCBtb2RfdHkgbW9kKQogewotCVB5Q29kZU9iamVjdCAqY287Ci0JaW50IGFkZE5vbmUgPSAxOwotCXN0YXRpYyBQeU9iamVjdCAqbW9kdWxlOwotCWlmICghbW9kdWxlKSB7Ci0JCW1vZHVsZSA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIjxtb2R1bGU+Iik7Ci0JCWlmICghbW9kdWxlKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCS8qIFVzZSAwIGZvciBmaXJzdGxpbmVubyBpbml0aWFsbHksIHdpbGwgZml4dXAgaW4gYXNzZW1ibGUoKS4gKi8KLQlpZiAoIWNvbXBpbGVyX2VudGVyX3Njb3BlKGMsIG1vZHVsZSwgbW9kLCAwKSkKLQkJcmV0dXJuIE5VTEw7Ci0Jc3dpdGNoIChtb2QtPmtpbmQpIHsKLQljYXNlIE1vZHVsZV9raW5kOiAKLQkJaWYgKCFjb21waWxlcl9ib2R5KGMsIG1vZC0+di5Nb2R1bGUuYm9keSkpIHsKLQkJCWNvbXBpbGVyX2V4aXRfc2NvcGUoYyk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlicmVhazsKLQljYXNlIEludGVyYWN0aXZlX2tpbmQ6Ci0JCWMtPmNfaW50ZXJhY3RpdmUgPSAxOwotCQlWSVNJVF9TRVFfSU5fU0NPUEUoYywgc3RtdCwgCi0JCQkJCW1vZC0+di5JbnRlcmFjdGl2ZS5ib2R5KTsKLQkJYnJlYWs7Ci0JY2FzZSBFeHByZXNzaW9uX2tpbmQ6Ci0JCVZJU0lUX0lOX1NDT1BFKGMsIGV4cHIsIG1vZC0+di5FeHByZXNzaW9uLmJvZHkpOwotCQlhZGROb25lID0gMDsKLQkJYnJlYWs7Ci0JY2FzZSBTdWl0ZV9raW5kOgotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCi0JCQkJInN1aXRlIHNob3VsZCBub3QgYmUgcG9zc2libGUiKTsKLQkJcmV0dXJuIDA7Ci0JZGVmYXVsdDoKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1N5c3RlbUVycm9yLAotCQkJICAgICAibW9kdWxlIGtpbmQgJWQgc2hvdWxkIG5vdCBiZSBwb3NzaWJsZSIsCi0JCQkgICAgIG1vZC0+a2luZCk7Ci0JCXJldHVybiAwOwotCX0KLQljbyA9IGFzc2VtYmxlKGMsIGFkZE5vbmUpOwotCWNvbXBpbGVyX2V4aXRfc2NvcGUoYyk7Ci0JcmV0dXJuIGNvOworICAgIFB5Q29kZU9iamVjdCAqY287CisgICAgaW50IGFkZE5vbmUgPSAxOworICAgIHN0YXRpYyBQeU9iamVjdCAqbW9kdWxlOworICAgIGlmICghbW9kdWxlKSB7CisgICAgICAgIG1vZHVsZSA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIjxtb2R1bGU+Iik7CisgICAgICAgIGlmICghbW9kdWxlKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIC8qIFVzZSAwIGZvciBmaXJzdGxpbmVubyBpbml0aWFsbHksIHdpbGwgZml4dXAgaW4gYXNzZW1ibGUoKS4gKi8KKyAgICBpZiAoIWNvbXBpbGVyX2VudGVyX3Njb3BlKGMsIG1vZHVsZSwgbW9kLCAwKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgc3dpdGNoIChtb2QtPmtpbmQpIHsKKyAgICBjYXNlIE1vZHVsZV9raW5kOgorICAgICAgICBpZiAoIWNvbXBpbGVyX2JvZHkoYywgbW9kLT52Lk1vZHVsZS5ib2R5KSkgeworICAgICAgICAgICAgY29tcGlsZXJfZXhpdF9zY29wZShjKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgSW50ZXJhY3RpdmVfa2luZDoKKyAgICAgICAgYy0+Y19pbnRlcmFjdGl2ZSA9IDE7CisgICAgICAgIFZJU0lUX1NFUV9JTl9TQ09QRShjLCBzdG10LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2QtPnYuSW50ZXJhY3RpdmUuYm9keSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRXhwcmVzc2lvbl9raW5kOgorICAgICAgICBWSVNJVF9JTl9TQ09QRShjLCBleHByLCBtb2QtPnYuRXhwcmVzc2lvbi5ib2R5KTsKKyAgICAgICAgYWRkTm9uZSA9IDA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU3VpdGVfa2luZDoKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInN1aXRlIHNob3VsZCBub3QgYmUgcG9zc2libGUiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgZGVmYXVsdDoKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIm1vZHVsZSBraW5kICVkIHNob3VsZCBub3QgYmUgcG9zc2libGUiLAorICAgICAgICAgICAgICAgICAgICAgbW9kLT5raW5kKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGNvID0gYXNzZW1ibGUoYywgYWRkTm9uZSk7CisgICAgY29tcGlsZXJfZXhpdF9zY29wZShjKTsKKyAgICByZXR1cm4gY287CiB9CiAKIC8qIFRoZSB0ZXN0IGZvciBMT0NBTCBtdXN0IGNvbWUgYmVmb3JlIHRoZSB0ZXN0IGZvciBGUkVFIGluIG9yZGVyIHRvCkBAIC0xMjQxLDI0ICsxMjQxLDI0IEBACiBzdGF0aWMgaW50CiBnZXRfcmVmX3R5cGUoc3RydWN0IGNvbXBpbGVyICpjLCBQeU9iamVjdCAqbmFtZSkKIHsKLQlpbnQgc2NvcGUgPSBQeVNUX0dldFNjb3BlKGMtPnUtPnVfc3RlLCBuYW1lKTsKLQlpZiAoc2NvcGUgPT0gMCkgewotCSAgICBjaGFyIGJ1ZlszNTBdOwotCSAgICBQeU9TX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksCi0JCQkgICJ1bmtub3duIHNjb3BlIGZvciAlLjEwMHMgaW4gJS4xMDBzKCVzKSBpbiAlc1xuIgotCQkJICAic3ltYm9sczogJXNcbmxvY2FsczogJXNcbmdsb2JhbHM6ICVzXG4iLAotCQkJICBQeVN0cmluZ19BU19TVFJJTkcobmFtZSksIAotCQkJICBQeVN0cmluZ19BU19TVFJJTkcoYy0+dS0+dV9uYW1lKSwgCi0JCQkgIFB5T2JqZWN0X1JFUFIoYy0+dS0+dV9zdGUtPnN0ZV9pZCksCi0JCQkgIGMtPmNfZmlsZW5hbWUsCi0JCQkgIFB5T2JqZWN0X1JFUFIoYy0+dS0+dV9zdGUtPnN0ZV9zeW1ib2xzKSwKLQkJCSAgUHlPYmplY3RfUkVQUihjLT51LT51X3Zhcm5hbWVzKSwKLQkJCSAgUHlPYmplY3RfUkVQUihjLT51LT51X25hbWVzKQotCQkpOwotCSAgICBQeV9GYXRhbEVycm9yKGJ1Zik7Ci0JfQorICAgIGludCBzY29wZSA9IFB5U1RfR2V0U2NvcGUoYy0+dS0+dV9zdGUsIG5hbWUpOworICAgIGlmIChzY29wZSA9PSAwKSB7CisgICAgICAgIGNoYXIgYnVmWzM1MF07CisgICAgICAgIFB5T1Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwKKyAgICAgICAgICAgICAgICAgICAgICAidW5rbm93biBzY29wZSBmb3IgJS4xMDBzIGluICUuMTAwcyglcykgaW4gJXNcbiIKKyAgICAgICAgICAgICAgICAgICAgICAic3ltYm9sczogJXNcbmxvY2FsczogJXNcbmdsb2JhbHM6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FTX1NUUklORyhuYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcoYy0+dS0+dV9uYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdF9SRVBSKGMtPnUtPnVfc3RlLT5zdGVfaWQpLAorICAgICAgICAgICAgICAgICAgICAgIGMtPmNfZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3RfUkVQUihjLT51LT51X3N0ZS0+c3RlX3N5bWJvbHMpLAorICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0X1JFUFIoYy0+dS0+dV92YXJuYW1lcyksCisgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3RfUkVQUihjLT51LT51X25hbWVzKQorICAgICAgICApOworICAgICAgICBQeV9GYXRhbEVycm9yKGJ1Zik7CisgICAgfQogCi0JcmV0dXJuIHNjb3BlOworICAgIHJldHVybiBzY29wZTsKIH0KIAogc3RhdGljIGludApAQCAtMTI2Nyw1MDIgKzEyNjcsNTAyIEBACiAgICAgUHlPYmplY3QgKmssICp2OwogICAgIGsgPSBQeVR1cGxlX1BhY2soMiwgbmFtZSwgbmFtZS0+b2JfdHlwZSk7CiAgICAgaWYgKGsgPT0gTlVMTCkKLQlyZXR1cm4gLTE7CisgICAgcmV0dXJuIC0xOwogICAgIHYgPSBQeURpY3RfR2V0SXRlbShkaWN0LCBrKTsKICAgICBQeV9ERUNSRUYoayk7CiAgICAgaWYgKHYgPT0gTlVMTCkKLQlyZXR1cm4gLTE7CisgICAgcmV0dXJuIC0xOwogICAgIHJldHVybiBQeUludF9BU19MT05HKHYpOwogfQogCiBzdGF0aWMgaW50CiBjb21waWxlcl9tYWtlX2Nsb3N1cmUoc3RydWN0IGNvbXBpbGVyICpjLCBQeUNvZGVPYmplY3QgKmNvLCBpbnQgYXJncykKIHsKLQlpbnQgaSwgZnJlZSA9IFB5Q29kZV9HZXROdW1GcmVlKGNvKTsKLQlpZiAoZnJlZSA9PSAwKSB7Ci0JICAgIEFERE9QX08oYywgTE9BRF9DT05TVCwgKFB5T2JqZWN0KiljbywgY29uc3RzKTsKLQkgICAgQURET1BfSShjLCBNQUtFX0ZVTkNUSU9OLCBhcmdzKTsKLQkgICAgcmV0dXJuIDE7Ci0JfQotCWZvciAoaSA9IDA7IGkgPCBmcmVlOyArK2kpIHsKLQkJLyogQnlwYXNzIGNvbV9hZGRvcF92YXJuYW1lIGJlY2F1c2UgaXQgd2lsbCBnZW5lcmF0ZQotCQkgICBMT0FEX0RFUkVGIGJ1dCBMT0FEX0NMT1NVUkUgaXMgbmVlZGVkLiAKLQkJKi8KLQkJUHlPYmplY3QgKm5hbWUgPSBQeVR1cGxlX0dFVF9JVEVNKGNvLT5jb19mcmVldmFycywgaSk7Ci0JCWludCBhcmcsIHJlZnR5cGU7CisgICAgaW50IGksIGZyZWUgPSBQeUNvZGVfR2V0TnVtRnJlZShjbyk7CisgICAgaWYgKGZyZWUgPT0gMCkgeworICAgICAgICBBRERPUF9PKGMsIExPQURfQ09OU1QsIChQeU9iamVjdCopY28sIGNvbnN0cyk7CisgICAgICAgIEFERE9QX0koYywgTUFLRV9GVU5DVElPTiwgYXJncyk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgZnJlZTsgKytpKSB7CisgICAgICAgIC8qIEJ5cGFzcyBjb21fYWRkb3BfdmFybmFtZSBiZWNhdXNlIGl0IHdpbGwgZ2VuZXJhdGUKKyAgICAgICAgICAgTE9BRF9ERVJFRiBidXQgTE9BRF9DTE9TVVJFIGlzIG5lZWRlZC4KKyAgICAgICAgKi8KKyAgICAgICAgUHlPYmplY3QgKm5hbWUgPSBQeVR1cGxlX0dFVF9JVEVNKGNvLT5jb19mcmVldmFycywgaSk7CisgICAgICAgIGludCBhcmcsIHJlZnR5cGU7CiAKLQkJLyogU3BlY2lhbCBjYXNlOiBJZiBhIGNsYXNzIGNvbnRhaW5zIGEgbWV0aG9kIHdpdGggYQotCQkgICBmcmVlIHZhcmlhYmxlIHRoYXQgaGFzIHRoZSBzYW1lIG5hbWUgYXMgYSBtZXRob2QsCi0JCSAgIHRoZSBuYW1lIHdpbGwgYmUgY29uc2lkZXJlZCBmcmVlICphbmQqIGxvY2FsIGluIHRoZQotCQkgICBjbGFzcy4gIEl0IHNob3VsZCBiZSBoYW5kbGVkIGJ5IHRoZSBjbG9zdXJlLCBhcwotCQkgICB3ZWxsIGFzIGJ5IHRoZSBub3JtYWwgbmFtZSBsb29va3VwIGxvZ2ljLgotCQkqLwotCQlyZWZ0eXBlID0gZ2V0X3JlZl90eXBlKGMsIG5hbWUpOwotCQlpZiAocmVmdHlwZSA9PSBDRUxMKQotCQkJYXJnID0gY29tcGlsZXJfbG9va3VwX2FyZyhjLT51LT51X2NlbGx2YXJzLCBuYW1lKTsKLQkJZWxzZSAvKiAocmVmdHlwZSA9PSBGUkVFKSAqLwotCQkJYXJnID0gY29tcGlsZXJfbG9va3VwX2FyZyhjLT51LT51X2ZyZWV2YXJzLCBuYW1lKTsKLQkJaWYgKGFyZyA9PSAtMSkgewotCQkJcHJpbnRmKCJsb29rdXAgJXMgaW4gJXMgJWQgJWRcbiIKLQkJCQkiZnJlZXZhcnMgb2YgJXM6ICVzXG4iLAotCQkJCVB5T2JqZWN0X1JFUFIobmFtZSksIAotCQkJCVB5U3RyaW5nX0FTX1NUUklORyhjLT51LT51X25hbWUpLCAKLQkJCQlyZWZ0eXBlLCBhcmcsCi0JCQkJUHlTdHJpbmdfQVNfU1RSSU5HKGNvLT5jb19uYW1lKSwKLQkJCQlQeU9iamVjdF9SRVBSKGNvLT5jb19mcmVldmFycykpOwotCQkJUHlfRmF0YWxFcnJvcigiY29tcGlsZXJfbWFrZV9jbG9zdXJlKCkiKTsKLQkJfQotCQlBRERPUF9JKGMsIExPQURfQ0xPU1VSRSwgYXJnKTsKLQl9Ci0JQURET1BfSShjLCBCVUlMRF9UVVBMRSwgZnJlZSk7Ci0JQURET1BfTyhjLCBMT0FEX0NPTlNULCAoUHlPYmplY3QqKWNvLCBjb25zdHMpOwotCUFERE9QX0koYywgTUFLRV9DTE9TVVJFLCBhcmdzKTsKLQlyZXR1cm4gMTsKKyAgICAgICAgLyogU3BlY2lhbCBjYXNlOiBJZiBhIGNsYXNzIGNvbnRhaW5zIGEgbWV0aG9kIHdpdGggYQorICAgICAgICAgICBmcmVlIHZhcmlhYmxlIHRoYXQgaGFzIHRoZSBzYW1lIG5hbWUgYXMgYSBtZXRob2QsCisgICAgICAgICAgIHRoZSBuYW1lIHdpbGwgYmUgY29uc2lkZXJlZCBmcmVlICphbmQqIGxvY2FsIGluIHRoZQorICAgICAgICAgICBjbGFzcy4gIEl0IHNob3VsZCBiZSBoYW5kbGVkIGJ5IHRoZSBjbG9zdXJlLCBhcworICAgICAgICAgICB3ZWxsIGFzIGJ5IHRoZSBub3JtYWwgbmFtZSBsb29va3VwIGxvZ2ljLgorICAgICAgICAqLworICAgICAgICByZWZ0eXBlID0gZ2V0X3JlZl90eXBlKGMsIG5hbWUpOworICAgICAgICBpZiAocmVmdHlwZSA9PSBDRUxMKQorICAgICAgICAgICAgYXJnID0gY29tcGlsZXJfbG9va3VwX2FyZyhjLT51LT51X2NlbGx2YXJzLCBuYW1lKTsKKyAgICAgICAgZWxzZSAvKiAocmVmdHlwZSA9PSBGUkVFKSAqLworICAgICAgICAgICAgYXJnID0gY29tcGlsZXJfbG9va3VwX2FyZyhjLT51LT51X2ZyZWV2YXJzLCBuYW1lKTsKKyAgICAgICAgaWYgKGFyZyA9PSAtMSkgeworICAgICAgICAgICAgcHJpbnRmKCJsb29rdXAgJXMgaW4gJXMgJWQgJWRcbiIKKyAgICAgICAgICAgICAgICAiZnJlZXZhcnMgb2YgJXM6ICVzXG4iLAorICAgICAgICAgICAgICAgIFB5T2JqZWN0X1JFUFIobmFtZSksCisgICAgICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKGMtPnUtPnVfbmFtZSksCisgICAgICAgICAgICAgICAgcmVmdHlwZSwgYXJnLAorICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FTX1NUUklORyhjby0+Y29fbmFtZSksCisgICAgICAgICAgICAgICAgUHlPYmplY3RfUkVQUihjby0+Y29fZnJlZXZhcnMpKTsKKyAgICAgICAgICAgIFB5X0ZhdGFsRXJyb3IoImNvbXBpbGVyX21ha2VfY2xvc3VyZSgpIik7CisgICAgICAgIH0KKyAgICAgICAgQURET1BfSShjLCBMT0FEX0NMT1NVUkUsIGFyZyk7CisgICAgfQorICAgIEFERE9QX0koYywgQlVJTERfVFVQTEUsIGZyZWUpOworICAgIEFERE9QX08oYywgTE9BRF9DT05TVCwgKFB5T2JqZWN0KiljbywgY29uc3RzKTsKKyAgICBBRERPUF9JKGMsIE1BS0VfQ0xPU1VSRSwgYXJncyk7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyBpbnQKIGNvbXBpbGVyX2RlY29yYXRvcnMoc3RydWN0IGNvbXBpbGVyICpjLCBhc2RsX3NlcSogZGVjb3MpCiB7Ci0JaW50IGk7CisgICAgaW50IGk7CiAKLQlpZiAoIWRlY29zKQotCQlyZXR1cm4gMTsKKyAgICBpZiAoIWRlY29zKQorICAgICAgICByZXR1cm4gMTsKIAotCWZvciAoaSA9IDA7IGkgPCBhc2RsX3NlcV9MRU4oZGVjb3MpOyBpKyspIHsKLQkJVklTSVQoYywgZXhwciwgKGV4cHJfdHkpYXNkbF9zZXFfR0VUKGRlY29zLCBpKSk7Ci0JfQotCXJldHVybiAxOworICAgIGZvciAoaSA9IDA7IGkgPCBhc2RsX3NlcV9MRU4oZGVjb3MpOyBpKyspIHsKKyAgICAgICAgVklTSVQoYywgZXhwciwgKGV4cHJfdHkpYXNkbF9zZXFfR0VUKGRlY29zLCBpKSk7CisgICAgfQorICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgaW50CiBjb21waWxlcl9hcmd1bWVudHMoc3RydWN0IGNvbXBpbGVyICpjLCBhcmd1bWVudHNfdHkgYXJncykKIHsKLQlpbnQgaTsKLQlpbnQgbiA9IGFzZGxfc2VxX0xFTihhcmdzLT5hcmdzKTsKLQkvKiBDb3JyZWN0bHkgaGFuZGxlIG5lc3RlZCBhcmd1bWVudCBsaXN0cyAqLwotCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJZXhwcl90eSBhcmcgPSAoZXhwcl90eSlhc2RsX3NlcV9HRVQoYXJncy0+YXJncywgaSk7Ci0JCWlmIChhcmctPmtpbmQgPT0gVHVwbGVfa2luZCkgewotCQkJUHlPYmplY3QgKmlkID0gUHlTdHJpbmdfRnJvbUZvcm1hdCgiLiVkIiwgaSk7Ci0JCQlpZiAoaWQgPT0gTlVMTCkgewotCQkJCXJldHVybiAwOwotCQkJfQotCQkJaWYgKCFjb21waWxlcl9uYW1lb3AoYywgaWQsIExvYWQpKSB7Ci0JCQkJUHlfREVDUkVGKGlkKTsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJCVB5X0RFQ1JFRihpZCk7Ci0JCQlWSVNJVChjLCBleHByLCBhcmcpOwotCQl9Ci0JfQotCXJldHVybiAxOworICAgIGludCBpOworICAgIGludCBuID0gYXNkbF9zZXFfTEVOKGFyZ3MtPmFyZ3MpOworICAgIC8qIENvcnJlY3RseSBoYW5kbGUgbmVzdGVkIGFyZ3VtZW50IGxpc3RzICovCisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICBleHByX3R5IGFyZyA9IChleHByX3R5KWFzZGxfc2VxX0dFVChhcmdzLT5hcmdzLCBpKTsKKyAgICAgICAgaWYgKGFyZy0+a2luZCA9PSBUdXBsZV9raW5kKSB7CisgICAgICAgICAgICBQeU9iamVjdCAqaWQgPSBQeVN0cmluZ19Gcm9tRm9ybWF0KCIuJWQiLCBpKTsKKyAgICAgICAgICAgIGlmIChpZCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWNvbXBpbGVyX25hbWVvcChjLCBpZCwgTG9hZCkpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoaWQpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlfREVDUkVGKGlkKTsKKyAgICAgICAgICAgIFZJU0lUKGMsIGV4cHIsIGFyZyk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyBpbnQKIGNvbXBpbGVyX2Z1bmN0aW9uKHN0cnVjdCBjb21waWxlciAqYywgc3RtdF90eSBzKQogewotCVB5Q29kZU9iamVjdCAqY287Ci0JUHlPYmplY3QgKmZpcnN0X2NvbnN0ID0gUHlfTm9uZTsKLQlhcmd1bWVudHNfdHkgYXJncyA9IHMtPnYuRnVuY3Rpb25EZWYuYXJnczsKLQlhc2RsX3NlcSogZGVjb3MgPSBzLT52LkZ1bmN0aW9uRGVmLmRlY29yYXRvcl9saXN0OwotCXN0bXRfdHkgc3Q7Ci0JaW50IGksIG4sIGRvY3N0cmluZzsKKyAgICBQeUNvZGVPYmplY3QgKmNvOworICAgIFB5T2JqZWN0ICpmaXJzdF9jb25zdCA9IFB5X05vbmU7CisgICAgYXJndW1lbnRzX3R5IGFyZ3MgPSBzLT52LkZ1bmN0aW9uRGVmLmFyZ3M7CisgICAgYXNkbF9zZXEqIGRlY29zID0gcy0+di5GdW5jdGlvbkRlZi5kZWNvcmF0b3JfbGlzdDsKKyAgICBzdG10X3R5IHN0OworICAgIGludCBpLCBuLCBkb2NzdHJpbmc7CiAKLQlhc3NlcnQocy0+a2luZCA9PSBGdW5jdGlvbkRlZl9raW5kKTsKKyAgICBhc3NlcnQocy0+a2luZCA9PSBGdW5jdGlvbkRlZl9raW5kKTsKIAotCWlmICghY29tcGlsZXJfZGVjb3JhdG9ycyhjLCBkZWNvcykpCi0JCXJldHVybiAwOwotCWlmIChhcmdzLT5kZWZhdWx0cykKLQkJVklTSVRfU0VRKGMsIGV4cHIsIGFyZ3MtPmRlZmF1bHRzKTsKLQlpZiAoIWNvbXBpbGVyX2VudGVyX3Njb3BlKGMsIHMtPnYuRnVuY3Rpb25EZWYubmFtZSwgKHZvaWQgKilzLAotCQkJCSAgcy0+bGluZW5vKSkKLQkJcmV0dXJuIDA7CisgICAgaWYgKCFjb21waWxlcl9kZWNvcmF0b3JzKGMsIGRlY29zKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKGFyZ3MtPmRlZmF1bHRzKQorICAgICAgICBWSVNJVF9TRVEoYywgZXhwciwgYXJncy0+ZGVmYXVsdHMpOworICAgIGlmICghY29tcGlsZXJfZW50ZXJfc2NvcGUoYywgcy0+di5GdW5jdGlvbkRlZi5uYW1lLCAodm9pZCAqKXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5saW5lbm8pKQorICAgICAgICByZXR1cm4gMDsKIAotCXN0ID0gKHN0bXRfdHkpYXNkbF9zZXFfR0VUKHMtPnYuRnVuY3Rpb25EZWYuYm9keSwgMCk7Ci0JZG9jc3RyaW5nID0gY29tcGlsZXJfaXNkb2NzdHJpbmcoc3QpOwotCWlmIChkb2NzdHJpbmcgJiYgUHlfT3B0aW1pemVGbGFnIDwgMikKLQkgICAgZmlyc3RfY29uc3QgPSBzdC0+di5FeHByLnZhbHVlLT52LlN0ci5zOwotCWlmIChjb21waWxlcl9hZGRfbyhjLCBjLT51LT51X2NvbnN0cywgZmlyc3RfY29uc3QpIDwgMCkJIHsKLQkgICAgY29tcGlsZXJfZXhpdF9zY29wZShjKTsKLQkgICAgcmV0dXJuIDA7Ci0JfQorICAgIHN0ID0gKHN0bXRfdHkpYXNkbF9zZXFfR0VUKHMtPnYuRnVuY3Rpb25EZWYuYm9keSwgMCk7CisgICAgZG9jc3RyaW5nID0gY29tcGlsZXJfaXNkb2NzdHJpbmcoc3QpOworICAgIGlmIChkb2NzdHJpbmcgJiYgUHlfT3B0aW1pemVGbGFnIDwgMikKKyAgICAgICAgZmlyc3RfY29uc3QgPSBzdC0+di5FeHByLnZhbHVlLT52LlN0ci5zOworICAgIGlmIChjb21waWxlcl9hZGRfbyhjLCBjLT51LT51X2NvbnN0cywgZmlyc3RfY29uc3QpIDwgMCkgICAgICB7CisgICAgICAgIGNvbXBpbGVyX2V4aXRfc2NvcGUoYyk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KIAotCS8qIHVucGFjayBuZXN0ZWQgYXJndW1lbnRzICovCi0JY29tcGlsZXJfYXJndW1lbnRzKGMsIGFyZ3MpOworICAgIC8qIHVucGFjayBuZXN0ZWQgYXJndW1lbnRzICovCisgICAgY29tcGlsZXJfYXJndW1lbnRzKGMsIGFyZ3MpOwogCi0JYy0+dS0+dV9hcmdjb3VudCA9IGFzZGxfc2VxX0xFTihhcmdzLT5hcmdzKTsKLQluID0gYXNkbF9zZXFfTEVOKHMtPnYuRnVuY3Rpb25EZWYuYm9keSk7Ci0JLyogaWYgdGhlcmUgd2FzIGEgZG9jc3RyaW5nLCB3ZSBuZWVkIHRvIHNraXAgdGhlIGZpcnN0IHN0YXRlbWVudCAqLwotCWZvciAoaSA9IGRvY3N0cmluZzsgaSA8IG47IGkrKykgewotCQlzdCA9IChzdG10X3R5KWFzZGxfc2VxX0dFVChzLT52LkZ1bmN0aW9uRGVmLmJvZHksIGkpOwotCQlWSVNJVF9JTl9TQ09QRShjLCBzdG10LCBzdCk7Ci0JfQotCWNvID0gYXNzZW1ibGUoYywgMSk7Ci0JY29tcGlsZXJfZXhpdF9zY29wZShjKTsKLQlpZiAoY28gPT0gTlVMTCkKLQkJcmV0dXJuIDA7CisgICAgYy0+dS0+dV9hcmdjb3VudCA9IGFzZGxfc2VxX0xFTihhcmdzLT5hcmdzKTsKKyAgICBuID0gYXNkbF9zZXFfTEVOKHMtPnYuRnVuY3Rpb25EZWYuYm9keSk7CisgICAgLyogaWYgdGhlcmUgd2FzIGEgZG9jc3RyaW5nLCB3ZSBuZWVkIHRvIHNraXAgdGhlIGZpcnN0IHN0YXRlbWVudCAqLworICAgIGZvciAoaSA9IGRvY3N0cmluZzsgaSA8IG47IGkrKykgeworICAgICAgICBzdCA9IChzdG10X3R5KWFzZGxfc2VxX0dFVChzLT52LkZ1bmN0aW9uRGVmLmJvZHksIGkpOworICAgICAgICBWSVNJVF9JTl9TQ09QRShjLCBzdG10LCBzdCk7CisgICAgfQorICAgIGNvID0gYXNzZW1ibGUoYywgMSk7CisgICAgY29tcGlsZXJfZXhpdF9zY29wZShjKTsKKyAgICBpZiAoY28gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIDA7CiAKLQljb21waWxlcl9tYWtlX2Nsb3N1cmUoYywgY28sIGFzZGxfc2VxX0xFTihhcmdzLT5kZWZhdWx0cykpOwotCVB5X0RFQ1JFRihjbyk7CisgICAgY29tcGlsZXJfbWFrZV9jbG9zdXJlKGMsIGNvLCBhc2RsX3NlcV9MRU4oYXJncy0+ZGVmYXVsdHMpKTsKKyAgICBQeV9ERUNSRUYoY28pOwogCi0JZm9yIChpID0gMDsgaSA8IGFzZGxfc2VxX0xFTihkZWNvcyk7IGkrKykgewotCQlBRERPUF9JKGMsIENBTExfRlVOQ1RJT04sIDEpOwotCX0KKyAgICBmb3IgKGkgPSAwOyBpIDwgYXNkbF9zZXFfTEVOKGRlY29zKTsgaSsrKSB7CisgICAgICAgIEFERE9QX0koYywgQ0FMTF9GVU5DVElPTiwgMSk7CisgICAgfQogCi0JcmV0dXJuIGNvbXBpbGVyX25hbWVvcChjLCBzLT52LkZ1bmN0aW9uRGVmLm5hbWUsIFN0b3JlKTsKKyAgICByZXR1cm4gY29tcGlsZXJfbmFtZW9wKGMsIHMtPnYuRnVuY3Rpb25EZWYubmFtZSwgU3RvcmUpOwogfQogCiBzdGF0aWMgaW50CiBjb21waWxlcl9jbGFzcyhzdHJ1Y3QgY29tcGlsZXIgKmMsIHN0bXRfdHkgcykKIHsKLQlpbnQgbiwgaTsKLQlQeUNvZGVPYmplY3QgKmNvOwotCVB5T2JqZWN0ICpzdHI7Ci0JYXNkbF9zZXEqIGRlY29zID0gcy0+di5DbGFzc0RlZi5kZWNvcmF0b3JfbGlzdDsKLQkKLQlpZiAoIWNvbXBpbGVyX2RlY29yYXRvcnMoYywgZGVjb3MpKQotCQlyZXR1cm4gMDsKKyAgICBpbnQgbiwgaTsKKyAgICBQeUNvZGVPYmplY3QgKmNvOworICAgIFB5T2JqZWN0ICpzdHI7CisgICAgYXNkbF9zZXEqIGRlY29zID0gcy0+di5DbGFzc0RlZi5kZWNvcmF0b3JfbGlzdDsKIAotCS8qIHB1c2ggY2xhc3MgbmFtZSBvbiBzdGFjaywgbmVlZGVkIGJ5IEJVSUxEX0NMQVNTICovCi0JQURET1BfTyhjLCBMT0FEX0NPTlNULCBzLT52LkNsYXNzRGVmLm5hbWUsIGNvbnN0cyk7Ci0JLyogcHVzaCB0aGUgdHVwbGUgb2YgYmFzZSBjbGFzc2VzIG9uIHRoZSBzdGFjayAqLwotCW4gPSBhc2RsX3NlcV9MRU4ocy0+di5DbGFzc0RlZi5iYXNlcyk7Ci0JaWYgKG4gPiAwKQotCQlWSVNJVF9TRVEoYywgZXhwciwgcy0+di5DbGFzc0RlZi5iYXNlcyk7Ci0JQURET1BfSShjLCBCVUlMRF9UVVBMRSwgbik7Ci0JaWYgKCFjb21waWxlcl9lbnRlcl9zY29wZShjLCBzLT52LkNsYXNzRGVmLm5hbWUsICh2b2lkICopcywKLQkJCQkgIHMtPmxpbmVubykpCi0JCXJldHVybiAwOwotCVB5X1hERUNSRUYoYy0+dS0+dV9wcml2YXRlKTsKLQljLT51LT51X3ByaXZhdGUgPSBzLT52LkNsYXNzRGVmLm5hbWU7Ci0JUHlfSU5DUkVGKGMtPnUtPnVfcHJpdmF0ZSk7Ci0Jc3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19uYW1lX18iKTsKLQlpZiAoIXN0ciB8fCAhY29tcGlsZXJfbmFtZW9wKGMsIHN0ciwgTG9hZCkpIHsKLQkJUHlfWERFQ1JFRihzdHIpOwotCQljb21waWxlcl9leGl0X3Njb3BlKGMpOwotCQlyZXR1cm4gMDsKLQl9Ci0JCi0JUHlfREVDUkVGKHN0cik7Ci0Jc3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19tb2R1bGVfXyIpOwotCWlmICghc3RyIHx8ICFjb21waWxlcl9uYW1lb3AoYywgc3RyLCBTdG9yZSkpIHsKLQkJUHlfWERFQ1JFRihzdHIpOwotCQljb21waWxlcl9leGl0X3Njb3BlKGMpOwotCQlyZXR1cm4gMDsKLQl9Ci0JUHlfREVDUkVGKHN0cik7CisgICAgaWYgKCFjb21waWxlcl9kZWNvcmF0b3JzKGMsIGRlY29zKSkKKyAgICAgICAgcmV0dXJuIDA7CiAKLQlpZiAoIWNvbXBpbGVyX2JvZHkoYywgcy0+di5DbGFzc0RlZi5ib2R5KSkgewotCQljb21waWxlcl9leGl0X3Njb3BlKGMpOwotCQlyZXR1cm4gMDsKLQl9CisgICAgLyogcHVzaCBjbGFzcyBuYW1lIG9uIHN0YWNrLCBuZWVkZWQgYnkgQlVJTERfQ0xBU1MgKi8KKyAgICBBRERPUF9PKGMsIExPQURfQ09OU1QsIHMtPnYuQ2xhc3NEZWYubmFtZSwgY29uc3RzKTsKKyAgICAvKiBwdXNoIHRoZSB0dXBsZSBvZiBiYXNlIGNsYXNzZXMgb24gdGhlIHN0YWNrICovCisgICAgbiA9IGFzZGxfc2VxX0xFTihzLT52LkNsYXNzRGVmLmJhc2VzKTsKKyAgICBpZiAobiA+IDApCisgICAgICAgIFZJU0lUX1NFUShjLCBleHByLCBzLT52LkNsYXNzRGVmLmJhc2VzKTsKKyAgICBBRERPUF9JKGMsIEJVSUxEX1RVUExFLCBuKTsKKyAgICBpZiAoIWNvbXBpbGVyX2VudGVyX3Njb3BlKGMsIHMtPnYuQ2xhc3NEZWYubmFtZSwgKHZvaWQgKilzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bGluZW5vKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgUHlfWERFQ1JFRihjLT51LT51X3ByaXZhdGUpOworICAgIGMtPnUtPnVfcHJpdmF0ZSA9IHMtPnYuQ2xhc3NEZWYubmFtZTsKKyAgICBQeV9JTkNSRUYoYy0+dS0+dV9wcml2YXRlKTsKKyAgICBzdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX25hbWVfXyIpOworICAgIGlmICghc3RyIHx8ICFjb21waWxlcl9uYW1lb3AoYywgc3RyLCBMb2FkKSkgeworICAgICAgICBQeV9YREVDUkVGKHN0cik7CisgICAgICAgIGNvbXBpbGVyX2V4aXRfc2NvcGUoYyk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KIAotCUFERE9QX0lOX1NDT1BFKGMsIExPQURfTE9DQUxTKTsKLQlBRERPUF9JTl9TQ09QRShjLCBSRVRVUk5fVkFMVUUpOwotCWNvID0gYXNzZW1ibGUoYywgMSk7Ci0JY29tcGlsZXJfZXhpdF9zY29wZShjKTsKLQlpZiAoY28gPT0gTlVMTCkKLQkJcmV0dXJuIDA7CisgICAgUHlfREVDUkVGKHN0cik7CisgICAgc3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19tb2R1bGVfXyIpOworICAgIGlmICghc3RyIHx8ICFjb21waWxlcl9uYW1lb3AoYywgc3RyLCBTdG9yZSkpIHsKKyAgICAgICAgUHlfWERFQ1JFRihzdHIpOworICAgICAgICBjb21waWxlcl9leGl0X3Njb3BlKGMpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgUHlfREVDUkVGKHN0cik7CiAKLQljb21waWxlcl9tYWtlX2Nsb3N1cmUoYywgY28sIDApOwotCVB5X0RFQ1JFRihjbyk7CisgICAgaWYgKCFjb21waWxlcl9ib2R5KGMsIHMtPnYuQ2xhc3NEZWYuYm9keSkpIHsKKyAgICAgICAgY29tcGlsZXJfZXhpdF9zY29wZShjKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCi0JQURET1BfSShjLCBDQUxMX0ZVTkNUSU9OLCAwKTsKLQlBRERPUChjLCBCVUlMRF9DTEFTUyk7Ci0JLyogYXBwbHkgZGVjb3JhdG9ycyAqLwotCWZvciAoaSA9IDA7IGkgPCBhc2RsX3NlcV9MRU4oZGVjb3MpOyBpKyspIHsKLQkJQURET1BfSShjLCBDQUxMX0ZVTkNUSU9OLCAxKTsKLQl9Ci0JaWYgKCFjb21waWxlcl9uYW1lb3AoYywgcy0+di5DbGFzc0RlZi5uYW1lLCBTdG9yZSkpCi0JCXJldHVybiAwOwotCXJldHVybiAxOworICAgIEFERE9QX0lOX1NDT1BFKGMsIExPQURfTE9DQUxTKTsKKyAgICBBRERPUF9JTl9TQ09QRShjLCBSRVRVUk5fVkFMVUUpOworICAgIGNvID0gYXNzZW1ibGUoYywgMSk7CisgICAgY29tcGlsZXJfZXhpdF9zY29wZShjKTsKKyAgICBpZiAoY28gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBjb21waWxlcl9tYWtlX2Nsb3N1cmUoYywgY28sIDApOworICAgIFB5X0RFQ1JFRihjbyk7CisKKyAgICBBRERPUF9JKGMsIENBTExfRlVOQ1RJT04sIDApOworICAgIEFERE9QKGMsIEJVSUxEX0NMQVNTKTsKKyAgICAvKiBhcHBseSBkZWNvcmF0b3JzICovCisgICAgZm9yIChpID0gMDsgaSA8IGFzZGxfc2VxX0xFTihkZWNvcyk7IGkrKykgeworICAgICAgICBBRERPUF9JKGMsIENBTExfRlVOQ1RJT04sIDEpOworICAgIH0KKyAgICBpZiAoIWNvbXBpbGVyX25hbWVvcChjLCBzLT52LkNsYXNzRGVmLm5hbWUsIFN0b3JlKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyBpbnQKIGNvbXBpbGVyX2lmZXhwKHN0cnVjdCBjb21waWxlciAqYywgZXhwcl90eSBlKQogewotCWJhc2ljYmxvY2sgKmVuZCwgKm5leHQ7Ci0JCi0JYXNzZXJ0KGUtPmtpbmQgPT0gSWZFeHBfa2luZCk7Ci0JZW5kID0gY29tcGlsZXJfbmV3X2Jsb2NrKGMpOwotCWlmIChlbmQgPT0gTlVMTCkKLQkJcmV0dXJuIDA7Ci0JbmV4dCA9IGNvbXBpbGVyX25ld19ibG9jayhjKTsKLQlpZiAobmV4dCA9PSBOVUxMKQotCQlyZXR1cm4gMDsKLQlWSVNJVChjLCBleHByLCBlLT52LklmRXhwLnRlc3QpOwotCUFERE9QX0pSRUwoYywgSlVNUF9JRl9GQUxTRSwgbmV4dCk7Ci0JQURET1AoYywgUE9QX1RPUCk7Ci0JVklTSVQoYywgZXhwciwgZS0+di5JZkV4cC5ib2R5KTsKLQlBRERPUF9KUkVMKGMsIEpVTVBfRk9SV0FSRCwgZW5kKTsKLQljb21waWxlcl91c2VfbmV4dF9ibG9jayhjLCBuZXh0KTsKLQlBRERPUChjLCBQT1BfVE9QKTsKLQlWSVNJVChjLCBleHByLCBlLT52LklmRXhwLm9yZWxzZSk7Ci0JY29tcGlsZXJfdXNlX25leHRfYmxvY2soYywgZW5kKTsKLQlyZXR1cm4gMTsKKyAgICBiYXNpY2Jsb2NrICplbmQsICpuZXh0OworCisgICAgYXNzZXJ0KGUtPmtpbmQgPT0gSWZFeHBfa2luZCk7CisgICAgZW5kID0gY29tcGlsZXJfbmV3X2Jsb2NrKGMpOworICAgIGlmIChlbmQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgbmV4dCA9IGNvbXBpbGVyX25ld19ibG9jayhjKTsKKyAgICBpZiAobmV4dCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gMDsKKyAgICBWSVNJVChjLCBleHByLCBlLT52LklmRXhwLnRlc3QpOworICAgIEFERE9QX0pSRUwoYywgSlVNUF9JRl9GQUxTRSwgbmV4dCk7CisgICAgQURET1AoYywgUE9QX1RPUCk7CisgICAgVklTSVQoYywgZXhwciwgZS0+di5JZkV4cC5ib2R5KTsKKyAgICBBRERPUF9KUkVMKGMsIEpVTVBfRk9SV0FSRCwgZW5kKTsKKyAgICBjb21waWxlcl91c2VfbmV4dF9ibG9jayhjLCBuZXh0KTsKKyAgICBBRERPUChjLCBQT1BfVE9QKTsKKyAgICBWSVNJVChjLCBleHByLCBlLT52LklmRXhwLm9yZWxzZSk7CisgICAgY29tcGlsZXJfdXNlX25leHRfYmxvY2soYywgZW5kKTsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIGludAogY29tcGlsZXJfbGFtYmRhKHN0cnVjdCBjb21waWxlciAqYywgZXhwcl90eSBlKQogewotCVB5Q29kZU9iamVjdCAqY287Ci0Jc3RhdGljIGlkZW50aWZpZXIgbmFtZTsKLQlhcmd1bWVudHNfdHkgYXJncyA9IGUtPnYuTGFtYmRhLmFyZ3M7Ci0JYXNzZXJ0KGUtPmtpbmQgPT0gTGFtYmRhX2tpbmQpOworICAgIFB5Q29kZU9iamVjdCAqY287CisgICAgc3RhdGljIGlkZW50aWZpZXIgbmFtZTsKKyAgICBhcmd1bWVudHNfdHkgYXJncyA9IGUtPnYuTGFtYmRhLmFyZ3M7CisgICAgYXNzZXJ0KGUtPmtpbmQgPT0gTGFtYmRhX2tpbmQpOwogCi0JaWYgKCFuYW1lKSB7Ci0JCW5hbWUgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCI8bGFtYmRhPiIpOwotCQlpZiAoIW5hbWUpCi0JCQlyZXR1cm4gMDsKLQl9CisgICAgaWYgKCFuYW1lKSB7CisgICAgICAgIG5hbWUgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCI8bGFtYmRhPiIpOworICAgICAgICBpZiAoIW5hbWUpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLQlpZiAoYXJncy0+ZGVmYXVsdHMpCi0JCVZJU0lUX1NFUShjLCBleHByLCBhcmdzLT5kZWZhdWx0cyk7Ci0JaWYgKCFjb21waWxlcl9lbnRlcl9zY29wZShjLCBuYW1lLCAodm9pZCAqKWUsIGUtPmxpbmVubykpCi0JCXJldHVybiAwOworICAgIGlmIChhcmdzLT5kZWZhdWx0cykKKyAgICAgICAgVklTSVRfU0VRKGMsIGV4cHIsIGFyZ3MtPmRlZmF1bHRzKTsKKyAgICBpZiAoIWNvbXBpbGVyX2VudGVyX3Njb3BlKGMsIG5hbWUsICh2b2lkICopZSwgZS0+bGluZW5vKSkKKyAgICAgICAgcmV0dXJuIDA7CiAKLQkvKiB1bnBhY2sgbmVzdGVkIGFyZ3VtZW50cyAqLwotCWNvbXBpbGVyX2FyZ3VtZW50cyhjLCBhcmdzKTsKLQkKLQljLT51LT51X2FyZ2NvdW50ID0gYXNkbF9zZXFfTEVOKGFyZ3MtPmFyZ3MpOwotCVZJU0lUX0lOX1NDT1BFKGMsIGV4cHIsIGUtPnYuTGFtYmRhLmJvZHkpOwotCUFERE9QX0lOX1NDT1BFKGMsIFJFVFVSTl9WQUxVRSk7Ci0JY28gPSBhc3NlbWJsZShjLCAxKTsKLQljb21waWxlcl9leGl0X3Njb3BlKGMpOwotCWlmIChjbyA9PSBOVUxMKQotCQlyZXR1cm4gMDsKKyAgICAvKiB1bnBhY2sgbmVzdGVkIGFyZ3VtZW50cyAqLworICAgIGNvbXBpbGVyX2FyZ3VtZW50cyhjLCBhcmdzKTsKIAotCWNvbXBpbGVyX21ha2VfY2xvc3VyZShjLCBjbywgYXNkbF9zZXFfTEVOKGFyZ3MtPmRlZmF1bHRzKSk7Ci0JUHlfREVDUkVGKGNvKTsKKyAgICBjLT51LT51X2FyZ2NvdW50ID0gYXNkbF9zZXFfTEVOKGFyZ3MtPmFyZ3MpOworICAgIFZJU0lUX0lOX1NDT1BFKGMsIGV4cHIsIGUtPnYuTGFtYmRhLmJvZHkpOworICAgIEFERE9QX0lOX1NDT1BFKGMsIFJFVFVSTl9WQUxVRSk7CisgICAgY28gPSBhc3NlbWJsZShjLCAxKTsKKyAgICBjb21waWxlcl9leGl0X3Njb3BlKGMpOworICAgIGlmIChjbyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gMDsKIAotCXJldHVybiAxOworICAgIGNvbXBpbGVyX21ha2VfY2xvc3VyZShjLCBjbywgYXNkbF9zZXFfTEVOKGFyZ3MtPmRlZmF1bHRzKSk7CisgICAgUHlfREVDUkVGKGNvKTsKKworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgaW50CiBjb21waWxlcl9wcmludChzdHJ1Y3QgY29tcGlsZXIgKmMsIHN0bXRfdHkgcykKIHsKLQlpbnQgaSwgbjsKLQlib29sIGRlc3Q7CisgICAgaW50IGksIG47CisgICAgYm9vbCBkZXN0OwogCi0JYXNzZXJ0KHMtPmtpbmQgPT0gUHJpbnRfa2luZCk7Ci0JbiA9IGFzZGxfc2VxX0xFTihzLT52LlByaW50LnZhbHVlcyk7Ci0JZGVzdCA9IGZhbHNlOwotCWlmIChzLT52LlByaW50LmRlc3QpIHsKLQkJVklTSVQoYywgZXhwciwgcy0+di5QcmludC5kZXN0KTsKLQkJZGVzdCA9IHRydWU7Ci0JfQotCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJZXhwcl90eSBlID0gKGV4cHJfdHkpYXNkbF9zZXFfR0VUKHMtPnYuUHJpbnQudmFsdWVzLCBpKTsKLQkJaWYgKGRlc3QpIHsKLQkJCUFERE9QKGMsIERVUF9UT1ApOwotCQkJVklTSVQoYywgZXhwciwgZSk7Ci0JCQlBRERPUChjLCBST1RfVFdPKTsKLQkJCUFERE9QKGMsIFBSSU5UX0lURU1fVE8pOwotCQl9Ci0JCWVsc2UgewotCQkJVklTSVQoYywgZXhwciwgZSk7Ci0JCQlBRERPUChjLCBQUklOVF9JVEVNKTsKLQkJfQotCX0KLQlpZiAocy0+di5QcmludC5ubCkgewotCQlpZiAoZGVzdCkKLQkJCUFERE9QKGMsIFBSSU5UX05FV0xJTkVfVE8pCi0JCWVsc2UKLQkJCUFERE9QKGMsIFBSSU5UX05FV0xJTkUpCi0JfQotCWVsc2UgaWYgKGRlc3QpCi0JCUFERE9QKGMsIFBPUF9UT1ApOwotCXJldHVybiAxOworICAgIGFzc2VydChzLT5raW5kID09IFByaW50X2tpbmQpOworICAgIG4gPSBhc2RsX3NlcV9MRU4ocy0+di5QcmludC52YWx1ZXMpOworICAgIGRlc3QgPSBmYWxzZTsKKyAgICBpZiAocy0+di5QcmludC5kZXN0KSB7CisgICAgICAgIFZJU0lUKGMsIGV4cHIsIHMtPnYuUHJpbnQuZGVzdCk7CisgICAgICAgIGRlc3QgPSB0cnVlOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIGV4cHJfdHkgZSA9IChleHByX3R5KWFzZGxfc2VxX0dFVChzLT52LlByaW50LnZhbHVlcywgaSk7CisgICAgICAgIGlmIChkZXN0KSB7CisgICAgICAgICAgICBBRERPUChjLCBEVVBfVE9QKTsKKyAgICAgICAgICAgIFZJU0lUKGMsIGV4cHIsIGUpOworICAgICAgICAgICAgQURET1AoYywgUk9UX1RXTyk7CisgICAgICAgICAgICBBRERPUChjLCBQUklOVF9JVEVNX1RPKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIFZJU0lUKGMsIGV4cHIsIGUpOworICAgICAgICAgICAgQURET1AoYywgUFJJTlRfSVRFTSk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHMtPnYuUHJpbnQubmwpIHsKKyAgICAgICAgaWYgKGRlc3QpCisgICAgICAgICAgICBBRERPUChjLCBQUklOVF9ORVdMSU5FX1RPKQorICAgICAgICBlbHNlCisgICAgICAgICAgICBBRERPUChjLCBQUklOVF9ORVdMSU5FKQorICAgIH0KKyAgICBlbHNlIGlmIChkZXN0KQorICAgICAgICBBRERPUChjLCBQT1BfVE9QKTsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIGludAogY29tcGlsZXJfaWYoc3RydWN0IGNvbXBpbGVyICpjLCBzdG10X3R5IHMpCiB7Ci0JYmFzaWNibG9jayAqZW5kLCAqbmV4dDsKLQlpbnQgY29uc3RhbnQ7Ci0JYXNzZXJ0KHMtPmtpbmQgPT0gSWZfa2luZCk7Ci0JZW5kID0gY29tcGlsZXJfbmV3X2Jsb2NrKGMpOwotCWlmIChlbmQgPT0gTlVMTCkKLQkJcmV0dXJuIDA7Ci0JbmV4dCA9IGNvbXBpbGVyX25ld19ibG9jayhjKTsKLQlpZiAobmV4dCA9PSBOVUxMKQotCSAgICByZXR1cm4gMDsKLQkKLQljb25zdGFudCA9IGV4cHJfY29uc3RhbnQocy0+di5JZi50ZXN0KTsKLQkvKiBjb25zdGFudCA9IDA6ICJpZiAwIgotCSAqIGNvbnN0YW50ID0gMTogImlmIDEiLCAiaWYgMiIsIC4uLgotCSAqIGNvbnN0YW50ID0gLTE6IHJlc3QgKi8KLQlpZiAoY29uc3RhbnQgPT0gMCkgewotCQlpZiAocy0+di5JZi5vcmVsc2UpCi0JCQlWSVNJVF9TRVEoYywgc3RtdCwgcy0+di5JZi5vcmVsc2UpOwotCX0gZWxzZSBpZiAoY29uc3RhbnQgPT0gMSkgewotCQlWSVNJVF9TRVEoYywgc3RtdCwgcy0+di5JZi5ib2R5KTsKLQl9IGVsc2UgewotCQlWSVNJVChjLCBleHByLCBzLT52LklmLnRlc3QpOwotCQlBRERPUF9KUkVMKGMsIEpVTVBfSUZfRkFMU0UsIG5leHQpOwotCQlBRERPUChjLCBQT1BfVE9QKTsKLQkJVklTSVRfU0VRKGMsIHN0bXQsIHMtPnYuSWYuYm9keSk7Ci0JCUFERE9QX0pSRUwoYywgSlVNUF9GT1JXQVJELCBlbmQpOwotCQljb21waWxlcl91c2VfbmV4dF9ibG9jayhjLCBuZXh0KTsKLQkJQURET1AoYywgUE9QX1RPUCk7Ci0JCWlmIChzLT52LklmLm9yZWxzZSkKLQkJCVZJU0lUX1NFUShjLCBzdG10LCBzLT52LklmLm9yZWxzZSk7Ci0JfQotCWNvbXBpbGVyX3VzZV9uZXh0X2Jsb2NrKGMsIGVuZCk7Ci0JcmV0dXJuIDE7CisgICAgYmFzaWNibG9jayAqZW5kLCAqbmV4dDsKKyAgICBpbnQgY29uc3RhbnQ7CisgICAgYXNzZXJ0KHMtPmtpbmQgPT0gSWZfa2luZCk7CisgICAgZW5kID0gY29tcGlsZXJfbmV3X2Jsb2NrKGMpOworICAgIGlmIChlbmQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgbmV4dCA9IGNvbXBpbGVyX25ld19ibG9jayhjKTsKKyAgICBpZiAobmV4dCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGNvbnN0YW50ID0gZXhwcl9jb25zdGFudChzLT52LklmLnRlc3QpOworICAgIC8qIGNvbnN0YW50ID0gMDogImlmIDAiCisgICAgICogY29uc3RhbnQgPSAxOiAiaWYgMSIsICJpZiAyIiwgLi4uCisgICAgICogY29uc3RhbnQgPSAtMTogcmVzdCAqLworICAgIGlmIChjb25zdGFudCA9PSAwKSB7CisgICAgICAgIGlmIChzLT52LklmLm9yZWxzZSkKKyAgICAgICAgICAgIFZJU0lUX1NFUShjLCBzdG10LCBzLT52LklmLm9yZWxzZSk7CisgICAgfSBlbHNlIGlmIChjb25zdGFudCA9PSAxKSB7CisgICAgICAgIFZJU0lUX1NFUShjLCBzdG10LCBzLT52LklmLmJvZHkpOworICAgIH0gZWxzZSB7CisgICAgICAgIFZJU0lUKGMsIGV4cHIsIHMtPnYuSWYudGVzdCk7CisgICAgICAgIEFERE9QX0pSRUwoYywgSlVNUF9JRl9GQUxTRSwgbmV4dCk7CisgICAgICAgIEFERE9QKGMsIFBPUF9UT1ApOworICAgICAgICBWSVNJVF9TRVEoYywgc3RtdCwgcy0+di5JZi5ib2R5KTsKKyAgICAgICAgQURET1BfSlJFTChjLCBKVU1QX0ZPUldBUkQsIGVuZCk7CisgICAgICAgIGNvbXBpbGVyX3VzZV9uZXh0X2Jsb2NrKGMsIG5leHQpOworICAgICAgICBBRERPUChjLCBQT1BfVE9QKTsKKyAgICAgICAgaWYgKHMtPnYuSWYub3JlbHNlKQorICAgICAgICAgICAgVklTSVRfU0VRKGMsIHN0bXQsIHMtPnYuSWYub3JlbHNlKTsKKyAgICB9CisgICAgY29tcGlsZXJfdXNlX25leHRfYmxvY2soYywgZW5kKTsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIGludAogY29tcGlsZXJfZm9yKHN0cnVjdCBjb21waWxlciAqYywgc3RtdF90eSBzKQogewotCWJhc2ljYmxvY2sgKnN0YXJ0LCAqY2xlYW51cCwgKmVuZDsKKyAgICBiYXNpY2Jsb2NrICpzdGFydCwgKmNsZWFudXAsICplbmQ7CiAKLQlzdGFydCA9IGNvbXBpbGVyX25ld19ibG9jayhjKTsKLQljbGVhbnVwID0gY29tcGlsZXJfbmV3X2Jsb2NrKGMpOwotCWVuZCA9IGNvbXBpbGVyX25ld19ibG9jayhjKTsKLQlpZiAoc3RhcnQgPT0gTlVMTCB8fCBlbmQgPT0gTlVMTCB8fCBjbGVhbnVwID09IE5VTEwpCi0JCXJldHVybiAwOwotCUFERE9QX0pSRUwoYywgU0VUVVBfTE9PUCwgZW5kKTsKLQlpZiAoIWNvbXBpbGVyX3B1c2hfZmJsb2NrKGMsIExPT1AsIHN0YXJ0KSkKLQkJcmV0dXJuIDA7Ci0JVklTSVQoYywgZXhwciwgcy0+di5Gb3IuaXRlcik7Ci0JQURET1AoYywgR0VUX0lURVIpOwotCWNvbXBpbGVyX3VzZV9uZXh0X2Jsb2NrKGMsIHN0YXJ0KTsKLQkvKiBmb3IgZXhwcmVzc2lvbnMgbXVzdCBiZSB0cmFjZWQgb24gZWFjaCBpdGVyYXRpb24sCi0JICAgc28gd2UgbmVlZCB0byBzZXQgYW4gZXh0cmEgbGluZSBudW1iZXIuICovCi0JYy0+dS0+dV9saW5lbm9fc2V0ID0gZmFsc2U7Ci0JQURET1BfSlJFTChjLCBGT1JfSVRFUiwgY2xlYW51cCk7Ci0JVklTSVQoYywgZXhwciwgcy0+di5Gb3IudGFyZ2V0KTsKLQlWSVNJVF9TRVEoYywgc3RtdCwgcy0+di5Gb3IuYm9keSk7Ci0JQURET1BfSkFCUyhjLCBKVU1QX0FCU09MVVRFLCBzdGFydCk7Ci0JY29tcGlsZXJfdXNlX25leHRfYmxvY2soYywgY2xlYW51cCk7Ci0JQURET1AoYywgUE9QX0JMT0NLKTsKLQljb21waWxlcl9wb3BfZmJsb2NrKGMsIExPT1AsIHN0YXJ0KTsKLQlWSVNJVF9TRVEoYywgc3RtdCwgcy0+di5Gb3Iub3JlbHNlKTsKLQljb21waWxlcl91c2VfbmV4dF9ibG9jayhjLCBlbmQpOwotCXJldHVybiAxOworICAgIHN0YXJ0ID0gY29tcGlsZXJfbmV3X2Jsb2NrKGMpOworICAgIGNsZWFudXAgPSBjb21waWxlcl9uZXdfYmxvY2soYyk7CisgICAgZW5kID0gY29tcGlsZXJfbmV3X2Jsb2NrKGMpOworICAgIGlmIChzdGFydCA9PSBOVUxMIHx8IGVuZCA9PSBOVUxMIHx8IGNsZWFudXAgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgQURET1BfSlJFTChjLCBTRVRVUF9MT09QLCBlbmQpOworICAgIGlmICghY29tcGlsZXJfcHVzaF9mYmxvY2soYywgTE9PUCwgc3RhcnQpKQorICAgICAgICByZXR1cm4gMDsKKyAgICBWSVNJVChjLCBleHByLCBzLT52LkZvci5pdGVyKTsKKyAgICBBRERPUChjLCBHRVRfSVRFUik7CisgICAgY29tcGlsZXJfdXNlX25leHRfYmxvY2soYywgc3RhcnQpOworICAgIC8qIGZvciBleHByZXNzaW9ucyBtdXN0IGJlIHRyYWNlZCBvbiBlYWNoIGl0ZXJhdGlvbiwKKyAgICAgICBzbyB3ZSBuZWVkIHRvIHNldCBhbiBleHRyYSBsaW5lIG51bWJlci4gKi8KKyAgICBjLT51LT51X2xpbmVub19zZXQgPSBmYWxzZTsKKyAgICBBRERPUF9KUkVMKGMsIEZPUl9JVEVSLCBjbGVhbnVwKTsKKyAgICBWSVNJVChjLCBleHByLCBzLT52LkZvci50YXJnZXQpOworICAgIFZJU0lUX1NFUShjLCBzdG10LCBzLT52LkZvci5ib2R5KTsKKyAgICBBRERPUF9KQUJTKGMsIEpVTVBfQUJTT0xVVEUsIHN0YXJ0KTsKKyAgICBjb21waWxlcl91c2VfbmV4dF9ibG9jayhjLCBjbGVhbnVwKTsKKyAgICBBRERPUChjLCBQT1BfQkxPQ0spOworICAgIGNvbXBpbGVyX3BvcF9mYmxvY2soYywgTE9PUCwgc3RhcnQpOworICAgIFZJU0lUX1NFUShjLCBzdG10LCBzLT52LkZvci5vcmVsc2UpOworICAgIGNvbXBpbGVyX3VzZV9uZXh0X2Jsb2NrKGMsIGVuZCk7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyBpbnQKIGNvbXBpbGVyX3doaWxlKHN0cnVjdCBjb21waWxlciAqYywgc3RtdF90eSBzKQogewotCWJhc2ljYmxvY2sgKmxvb3AsICpvcmVsc2UsICplbmQsICphbmNob3IgPSBOVUxMOwotCWludCBjb25zdGFudCA9IGV4cHJfY29uc3RhbnQocy0+di5XaGlsZS50ZXN0KTsKKyAgICBiYXNpY2Jsb2NrICpsb29wLCAqb3JlbHNlLCAqZW5kLCAqYW5jaG9yID0gTlVMTDsKKyAgICBpbnQgY29uc3RhbnQgPSBleHByX2NvbnN0YW50KHMtPnYuV2hpbGUudGVzdCk7CiAKLQlpZiAoY29uc3RhbnQgPT0gMCkgewotCQlpZiAocy0+di5XaGlsZS5vcmVsc2UpCi0JCQlWSVNJVF9TRVEoYywgc3RtdCwgcy0+di5XaGlsZS5vcmVsc2UpOwotCQlyZXR1cm4gMTsKLQl9Ci0JbG9vcCA9IGNvbXBpbGVyX25ld19ibG9jayhjKTsKLQllbmQgPSBjb21waWxlcl9uZXdfYmxvY2soYyk7Ci0JaWYgKGNvbnN0YW50ID09IC0xKSB7Ci0JCWFuY2hvciA9IGNvbXBpbGVyX25ld19ibG9jayhjKTsKLQkJaWYgKGFuY2hvciA9PSBOVUxMKQotCQkJcmV0dXJuIDA7Ci0JfQotCWlmIChsb29wID09IE5VTEwgfHwgZW5kID09IE5VTEwpCi0JCXJldHVybiAwOwotCWlmIChzLT52LldoaWxlLm9yZWxzZSkgewotCQlvcmVsc2UgPSBjb21waWxlcl9uZXdfYmxvY2soYyk7Ci0JCWlmIChvcmVsc2UgPT0gTlVMTCkKLQkJCXJldHVybiAwOwotCX0KLQllbHNlCi0JCW9yZWxzZSA9IE5VTEw7CisgICAgaWYgKGNvbnN0YW50ID09IDApIHsKKyAgICAgICAgaWYgKHMtPnYuV2hpbGUub3JlbHNlKQorICAgICAgICAgICAgVklTSVRfU0VRKGMsIHN0bXQsIHMtPnYuV2hpbGUub3JlbHNlKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGxvb3AgPSBjb21waWxlcl9uZXdfYmxvY2soYyk7CisgICAgZW5kID0gY29tcGlsZXJfbmV3X2Jsb2NrKGMpOworICAgIGlmIChjb25zdGFudCA9PSAtMSkgeworICAgICAgICBhbmNob3IgPSBjb21waWxlcl9uZXdfYmxvY2soYyk7CisgICAgICAgIGlmIChhbmNob3IgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAobG9vcCA9PSBOVUxMIHx8IGVuZCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAocy0+di5XaGlsZS5vcmVsc2UpIHsKKyAgICAgICAgb3JlbHNlID0gY29tcGlsZXJfbmV3X2Jsb2NrKGMpOworICAgICAgICBpZiAob3JlbHNlID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBvcmVsc2UgPSBOVUxMOwogCi0JQURET1BfSlJFTChjLCBTRVRVUF9MT09QLCBlbmQpOwotCWNvbXBpbGVyX3VzZV9uZXh0X2Jsb2NrKGMsIGxvb3ApOwotCWlmICghY29tcGlsZXJfcHVzaF9mYmxvY2soYywgTE9PUCwgbG9vcCkpCi0JCXJldHVybiAwOwotCWlmIChjb25zdGFudCA9PSAtMSkgewotCQkvKiB3aGlsZSBleHByZXNzaW9ucyBtdXN0IGJlIHRyYWNlZCBvbiBlYWNoIGl0ZXJhdGlvbiwKLQkJICAgc28gd2UgbmVlZCB0byBzZXQgYW4gZXh0cmEgbGluZSBudW1iZXIuICovCi0JCWMtPnUtPnVfbGluZW5vX3NldCA9IGZhbHNlOwotCQlWSVNJVChjLCBleHByLCBzLT52LldoaWxlLnRlc3QpOwotCQlBRERPUF9KUkVMKGMsIEpVTVBfSUZfRkFMU0UsIGFuY2hvcik7Ci0JCUFERE9QKGMsIFBPUF9UT1ApOwotCX0KLQlWSVNJVF9TRVEoYywgc3RtdCwgcy0+di5XaGlsZS5ib2R5KTsKLQlBRERPUF9KQUJTKGMsIEpVTVBfQUJTT0xVVEUsIGxvb3ApOworICAgIEFERE9QX0pSRUwoYywgU0VUVVBfTE9PUCwgZW5kKTsKKyAgICBjb21waWxlcl91c2VfbmV4dF9ibG9jayhjLCBsb29wKTsKKyAgICBpZiAoIWNvbXBpbGVyX3B1c2hfZmJsb2NrKGMsIExPT1AsIGxvb3ApKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoY29uc3RhbnQgPT0gLTEpIHsKKyAgICAgICAgLyogd2hpbGUgZXhwcmVzc2lvbnMgbXVzdCBiZSB0cmFjZWQgb24gZWFjaCBpdGVyYXRpb24sCisgICAgICAgICAgIHNvIHdlIG5lZWQgdG8gc2V0IGFuIGV4dHJhIGxpbmUgbnVtYmVyLiAqLworICAgICAgICBjLT51LT51X2xpbmVub19zZXQgPSBmYWxzZTsKKyAgICAgICAgVklTSVQoYywgZXhwciwgcy0+di5XaGlsZS50ZXN0KTsKKyAgICAgICAgQURET1BfSlJFTChjLCBKVU1QX0lGX0ZBTFNFLCBhbmNob3IpOworICAgICAgICBBRERPUChjLCBQT1BfVE9QKTsKKyAgICB9CisgICAgVklTSVRfU0VRKGMsIHN0bXQsIHMtPnYuV2hpbGUuYm9keSk7CisgICAgQURET1BfSkFCUyhjLCBKVU1QX0FCU09MVVRFLCBsb29wKTsKIAotCS8qIFhYWCBzaG91bGQgdGhlIHR3byBQT1AgaW5zdHJ1Y3Rpb25zIGJlIGluIGEgc2VwYXJhdGUgYmxvY2sKLQkgICBpZiB0aGVyZSBpcyBubyBlbHNlIGNsYXVzZSA/Ci0JKi8KKyAgICAvKiBYWFggc2hvdWxkIHRoZSB0d28gUE9QIGluc3RydWN0aW9ucyBiZSBpbiBhIHNlcGFyYXRlIGJsb2NrCisgICAgICAgaWYgdGhlcmUgaXMgbm8gZWxzZSBjbGF1c2UgPworICAgICovCiAKLQlpZiAoY29uc3RhbnQgPT0gLTEpIHsKLQkJY29tcGlsZXJfdXNlX25leHRfYmxvY2soYywgYW5jaG9yKTsKLQkJQURET1AoYywgUE9QX1RPUCk7Ci0JCUFERE9QKGMsIFBPUF9CTE9DSyk7Ci0JfQotCWNvbXBpbGVyX3BvcF9mYmxvY2soYywgTE9PUCwgbG9vcCk7Ci0JaWYgKG9yZWxzZSAhPSBOVUxMKSAvKiB3aGF0IGlmIG9yZWxzZSBpcyBqdXN0IHBhc3M/ICovCi0JCVZJU0lUX1NFUShjLCBzdG10LCBzLT52LldoaWxlLm9yZWxzZSk7Ci0JY29tcGlsZXJfdXNlX25leHRfYmxvY2soYywgZW5kKTsKKyAgICBpZiAoY29uc3RhbnQgPT0gLTEpIHsKKyAgICAgICAgY29tcGlsZXJfdXNlX25leHRfYmxvY2soYywgYW5jaG9yKTsKKyAgICAgICAgQURET1AoYywgUE9QX1RPUCk7CisgICAgICAgIEFERE9QKGMsIFBPUF9CTE9DSyk7CisgICAgfQorICAgIGNvbXBpbGVyX3BvcF9mYmxvY2soYywgTE9PUCwgbG9vcCk7CisgICAgaWYgKG9yZWxzZSAhPSBOVUxMKSAvKiB3aGF0IGlmIG9yZWxzZSBpcyBqdXN0IHBhc3M/ICovCisgICAgICAgIFZJU0lUX1NFUShjLCBzdG10LCBzLT52LldoaWxlLm9yZWxzZSk7CisgICAgY29tcGlsZXJfdXNlX25leHRfYmxvY2soYywgZW5kKTsKIAotCXJldHVybiAxOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgaW50CiBjb21waWxlcl9jb250aW51ZShzdHJ1Y3QgY29tcGlsZXIgKmMpCiB7Ci0Jc3RhdGljIGNvbnN0IGNoYXIgTE9PUF9FUlJPUl9NU0dbXSA9ICInY29udGludWUnIG5vdCBwcm9wZXJseSBpbiBsb29wIjsKLQlzdGF0aWMgY29uc3QgY2hhciBJTl9GSU5BTExZX0VSUk9SX01TR1tdID0gCi0JCQkiJ2NvbnRpbnVlJyBub3Qgc3VwcG9ydGVkIGluc2lkZSAnZmluYWxseScgY2xhdXNlIjsKLQlpbnQgaTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBMT09QX0VSUk9SX01TR1tdID0gIidjb250aW51ZScgbm90IHByb3Blcmx5IGluIGxvb3AiOworICAgIHN0YXRpYyBjb25zdCBjaGFyIElOX0ZJTkFMTFlfRVJST1JfTVNHW10gPQorICAgICAgICAgICAgICAgICAgICAiJ2NvbnRpbnVlJyBub3Qgc3VwcG9ydGVkIGluc2lkZSAnZmluYWxseScgY2xhdXNlIjsKKyAgICBpbnQgaTsKIAotCWlmICghYy0+dS0+dV9uZmJsb2NrcykKLQkJcmV0dXJuIGNvbXBpbGVyX2Vycm9yKGMsIExPT1BfRVJST1JfTVNHKTsKLQlpID0gYy0+dS0+dV9uZmJsb2NrcyAtIDE7Ci0Jc3dpdGNoIChjLT51LT51X2ZibG9ja1tpXS5mYl90eXBlKSB7Ci0JY2FzZSBMT09QOgotCQlBRERPUF9KQUJTKGMsIEpVTVBfQUJTT0xVVEUsIGMtPnUtPnVfZmJsb2NrW2ldLmZiX2Jsb2NrKTsKLQkJYnJlYWs7Ci0JY2FzZSBFWENFUFQ6Ci0JY2FzZSBGSU5BTExZX1RSWToKLQkJd2hpbGUgKC0taSA+PSAwICYmIGMtPnUtPnVfZmJsb2NrW2ldLmZiX3R5cGUgIT0gTE9PUCkgewotCQkJLyogUHJldmVudCBjb250aW51ZSBhbnl3aGVyZSB1bmRlciBhIGZpbmFsbHkKLQkJCSAgICAgIGV2ZW4gaWYgaGlkZGVuIGluIGEgc3ViLXRyeSBvciBleGNlcHQuICovCi0JCQlpZiAoYy0+dS0+dV9mYmxvY2tbaV0uZmJfdHlwZSA9PSBGSU5BTExZX0VORCkKLQkJCQlyZXR1cm4gY29tcGlsZXJfZXJyb3IoYywgSU5fRklOQUxMWV9FUlJPUl9NU0cpOwotCQl9Ci0JCWlmIChpID09IC0xKQotCQkJcmV0dXJuIGNvbXBpbGVyX2Vycm9yKGMsIExPT1BfRVJST1JfTVNHKTsKLQkJQURET1BfSkFCUyhjLCBDT05USU5VRV9MT09QLCBjLT51LT51X2ZibG9ja1tpXS5mYl9ibG9jayk7Ci0JCWJyZWFrOwotCWNhc2UgRklOQUxMWV9FTkQ6Ci0JCXJldHVybiBjb21waWxlcl9lcnJvcihjLCBJTl9GSU5BTExZX0VSUk9SX01TRyk7Ci0JfQorICAgIGlmICghYy0+dS0+dV9uZmJsb2NrcykKKyAgICAgICAgcmV0dXJuIGNvbXBpbGVyX2Vycm9yKGMsIExPT1BfRVJST1JfTVNHKTsKKyAgICBpID0gYy0+dS0+dV9uZmJsb2NrcyAtIDE7CisgICAgc3dpdGNoIChjLT51LT51X2ZibG9ja1tpXS5mYl90eXBlKSB7CisgICAgY2FzZSBMT09QOgorICAgICAgICBBRERPUF9KQUJTKGMsIEpVTVBfQUJTT0xVVEUsIGMtPnUtPnVfZmJsb2NrW2ldLmZiX2Jsb2NrKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFWENFUFQ6CisgICAgY2FzZSBGSU5BTExZX1RSWToKKyAgICAgICAgd2hpbGUgKC0taSA+PSAwICYmIGMtPnUtPnVfZmJsb2NrW2ldLmZiX3R5cGUgIT0gTE9PUCkgeworICAgICAgICAgICAgLyogUHJldmVudCBjb250aW51ZSBhbnl3aGVyZSB1bmRlciBhIGZpbmFsbHkKKyAgICAgICAgICAgICAgICAgIGV2ZW4gaWYgaGlkZGVuIGluIGEgc3ViLXRyeSBvciBleGNlcHQuICovCisgICAgICAgICAgICBpZiAoYy0+dS0+dV9mYmxvY2tbaV0uZmJfdHlwZSA9PSBGSU5BTExZX0VORCkKKyAgICAgICAgICAgICAgICByZXR1cm4gY29tcGlsZXJfZXJyb3IoYywgSU5fRklOQUxMWV9FUlJPUl9NU0cpOworICAgICAgICB9CisgICAgICAgIGlmIChpID09IC0xKQorICAgICAgICAgICAgcmV0dXJuIGNvbXBpbGVyX2Vycm9yKGMsIExPT1BfRVJST1JfTVNHKTsKKyAgICAgICAgQURET1BfSkFCUyhjLCBDT05USU5VRV9MT09QLCBjLT51LT51X2ZibG9ja1tpXS5mYl9ibG9jayk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRklOQUxMWV9FTkQ6CisgICAgICAgIHJldHVybiBjb21waWxlcl9lcnJvcihjLCBJTl9GSU5BTExZX0VSUk9SX01TRyk7CisgICAgfQogCi0JcmV0dXJuIDE7CisgICAgcmV0dXJuIDE7CiB9CiAKIC8qIENvZGUgZ2VuZXJhdGVkIGZvciAidHJ5OiA8Ym9keT4gZmluYWxseTogPGZpbmFsYm9keT4iIGlzIGFzIGZvbGxvd3M6Ci0gICAKLQkJU0VUVVBfRklOQUxMWQlMCi0JCTxjb2RlIGZvciBib2R5PgotCQlQT1BfQkxPQ0sKLQkJTE9BRF9DT05TVAk8Tm9uZT4KLQlMOgk8Y29kZSBmb3IgZmluYWxib2R5PgotCQlFTkRfRklOQUxMWQotICAgCisKKyAgICAgICAgU0VUVVBfRklOQUxMWSAgICAgICAgICAgTAorICAgICAgICA8Y29kZSBmb3IgYm9keT4KKyAgICAgICAgUE9QX0JMT0NLCisgICAgICAgIExPQURfQ09OU1QgICAgICAgICAgICAgIDxOb25lPgorICAgIEw6ICAgICAgICAgIDxjb2RlIGZvciBmaW5hbGJvZHk+CisgICAgICAgIEVORF9GSU5BTExZCisKICAgIFRoZSBzcGVjaWFsIGluc3RydWN0aW9ucyB1c2UgdGhlIGJsb2NrIHN0YWNrLiAgRWFjaCBibG9jawogICAgc3RhY2sgZW50cnkgY29udGFpbnMgdGhlIGluc3RydWN0aW9uIHRoYXQgY3JlYXRlZCBpdCAoaGVyZQogICAgU0VUVVBfRklOQUxMWSksIHRoZSBsZXZlbCBvZiB0aGUgdmFsdWUgc3RhY2sgYXQgdGhlIHRpbWUgdGhlCiAgICBibG9jayBzdGFjayBlbnRyeSB3YXMgY3JlYXRlZCwgYW5kIGEgbGFiZWwgKGhlcmUgTCkuCi0gICAKKwogICAgU0VUVVBfRklOQUxMWToKLQlQdXNoZXMgdGhlIGN1cnJlbnQgdmFsdWUgc3RhY2sgbGV2ZWwgYW5kIHRoZSBsYWJlbAotCW9udG8gdGhlIGJsb2NrIHN0YWNrLgorICAgIFB1c2hlcyB0aGUgY3VycmVudCB2YWx1ZSBzdGFjayBsZXZlbCBhbmQgdGhlIGxhYmVsCisgICAgb250byB0aGUgYmxvY2sgc3RhY2suCiAgICBQT1BfQkxPQ0s6Ci0JUG9wcyBlbiBlbnRyeSBmcm9tIHRoZSBibG9jayBzdGFjaywgYW5kIHBvcHMgdGhlIHZhbHVlCi0Jc3RhY2sgdW50aWwgaXRzIGxldmVsIGlzIHRoZSBzYW1lIGFzIGluZGljYXRlZCBvbiB0aGUKLQlibG9jayBzdGFjay4gIChUaGUgbGFiZWwgaXMgaWdub3JlZC4pCisgICAgUG9wcyBlbiBlbnRyeSBmcm9tIHRoZSBibG9jayBzdGFjaywgYW5kIHBvcHMgdGhlIHZhbHVlCisgICAgc3RhY2sgdW50aWwgaXRzIGxldmVsIGlzIHRoZSBzYW1lIGFzIGluZGljYXRlZCBvbiB0aGUKKyAgICBibG9jayBzdGFjay4gIChUaGUgbGFiZWwgaXMgaWdub3JlZC4pCiAgICBFTkRfRklOQUxMWToKLQlQb3BzIGEgdmFyaWFibGUgbnVtYmVyIG9mIGVudHJpZXMgZnJvbSB0aGUgKnZhbHVlKiBzdGFjawotCWFuZCByZS1yYWlzZXMgdGhlIGV4Y2VwdGlvbiB0aGV5IHNwZWNpZnkuICBUaGUgbnVtYmVyIG9mCi0JZW50cmllcyBwb3BwZWQgZGVwZW5kcyBvbiB0aGUgKHBzZXVkbykgZXhjZXB0aW9uIHR5cGUuCi0gICAKKyAgICBQb3BzIGEgdmFyaWFibGUgbnVtYmVyIG9mIGVudHJpZXMgZnJvbSB0aGUgKnZhbHVlKiBzdGFjaworICAgIGFuZCByZS1yYWlzZXMgdGhlIGV4Y2VwdGlvbiB0aGV5IHNwZWNpZnkuICBUaGUgbnVtYmVyIG9mCisgICAgZW50cmllcyBwb3BwZWQgZGVwZW5kcyBvbiB0aGUgKHBzZXVkbykgZXhjZXB0aW9uIHR5cGUuCisKICAgIFRoZSBibG9jayBzdGFjayBpcyB1bndvdW5kIHdoZW4gYW4gZXhjZXB0aW9uIGlzIHJhaXNlZDoKICAgIHdoZW4gYSBTRVRVUF9GSU5BTExZIGVudHJ5IGlzIGZvdW5kLCB0aGUgZXhjZXB0aW9uIGlzIHB1c2hlZAogICAgb250byB0aGUgdmFsdWUgc3RhY2sgKGFuZCB0aGUgZXhjZXB0aW9uIGNvbmRpdGlvbiBpcyBjbGVhcmVkKSwKQEAgLTE3NzMsMjkgKzE3NzMsMjkgQEAKIHN0YXRpYyBpbnQKIGNvbXBpbGVyX3RyeV9maW5hbGx5KHN0cnVjdCBjb21waWxlciAqYywgc3RtdF90eSBzKQogewotCWJhc2ljYmxvY2sgKmJvZHksICplbmQ7Ci0JYm9keSA9IGNvbXBpbGVyX25ld19ibG9jayhjKTsKLQllbmQgPSBjb21waWxlcl9uZXdfYmxvY2soYyk7Ci0JaWYgKGJvZHkgPT0gTlVMTCB8fCBlbmQgPT0gTlVMTCkKLQkJcmV0dXJuIDA7CisgICAgYmFzaWNibG9jayAqYm9keSwgKmVuZDsKKyAgICBib2R5ID0gY29tcGlsZXJfbmV3X2Jsb2NrKGMpOworICAgIGVuZCA9IGNvbXBpbGVyX25ld19ibG9jayhjKTsKKyAgICBpZiAoYm9keSA9PSBOVUxMIHx8IGVuZCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gMDsKIAotCUFERE9QX0pSRUwoYywgU0VUVVBfRklOQUxMWSwgZW5kKTsKLQljb21waWxlcl91c2VfbmV4dF9ibG9jayhjLCBib2R5KTsKLQlpZiAoIWNvbXBpbGVyX3B1c2hfZmJsb2NrKGMsIEZJTkFMTFlfVFJZLCBib2R5KSkKLQkJcmV0dXJuIDA7Ci0JVklTSVRfU0VRKGMsIHN0bXQsIHMtPnYuVHJ5RmluYWxseS5ib2R5KTsKLQlBRERPUChjLCBQT1BfQkxPQ0spOwotCWNvbXBpbGVyX3BvcF9mYmxvY2soYywgRklOQUxMWV9UUlksIGJvZHkpOworICAgIEFERE9QX0pSRUwoYywgU0VUVVBfRklOQUxMWSwgZW5kKTsKKyAgICBjb21waWxlcl91c2VfbmV4dF9ibG9jayhjLCBib2R5KTsKKyAgICBpZiAoIWNvbXBpbGVyX3B1c2hfZmJsb2NrKGMsIEZJTkFMTFlfVFJZLCBib2R5KSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgVklTSVRfU0VRKGMsIHN0bXQsIHMtPnYuVHJ5RmluYWxseS5ib2R5KTsKKyAgICBBRERPUChjLCBQT1BfQkxPQ0spOworICAgIGNvbXBpbGVyX3BvcF9mYmxvY2soYywgRklOQUxMWV9UUlksIGJvZHkpOwogCi0JQURET1BfTyhjLCBMT0FEX0NPTlNULCBQeV9Ob25lLCBjb25zdHMpOwotCWNvbXBpbGVyX3VzZV9uZXh0X2Jsb2NrKGMsIGVuZCk7Ci0JaWYgKCFjb21waWxlcl9wdXNoX2ZibG9jayhjLCBGSU5BTExZX0VORCwgZW5kKSkKLQkJcmV0dXJuIDA7Ci0JVklTSVRfU0VRKGMsIHN0bXQsIHMtPnYuVHJ5RmluYWxseS5maW5hbGJvZHkpOwotCUFERE9QKGMsIEVORF9GSU5BTExZKTsKLQljb21waWxlcl9wb3BfZmJsb2NrKGMsIEZJTkFMTFlfRU5ELCBlbmQpOworICAgIEFERE9QX08oYywgTE9BRF9DT05TVCwgUHlfTm9uZSwgY29uc3RzKTsKKyAgICBjb21waWxlcl91c2VfbmV4dF9ibG9jayhjLCBlbmQpOworICAgIGlmICghY29tcGlsZXJfcHVzaF9mYmxvY2soYywgRklOQUxMWV9FTkQsIGVuZCkpCisgICAgICAgIHJldHVybiAwOworICAgIFZJU0lUX1NFUShjLCBzdG10LCBzLT52LlRyeUZpbmFsbHkuZmluYWxib2R5KTsKKyAgICBBRERPUChjLCBFTkRfRklOQUxMWSk7CisgICAgY29tcGlsZXJfcG9wX2ZibG9jayhjLCBGSU5BTExZX0VORCwgZW5kKTsKIAotCXJldHVybiAxOworICAgIHJldHVybiAxOwogfQogCiAvKgpAQCAtMTgwMywxMDExICsxODAzLDEwMTEgQEAKICAgIChUaGUgY29udGVudHMgb2YgdGhlIHZhbHVlIHN0YWNrIGlzIHNob3duIGluIFtdLCB3aXRoIHRoZSB0b3AKICAgIGF0IHRoZSByaWdodDsgJ3RiJyBpcyB0cmFjZS1iYWNrIGluZm8sICd2YWwnIHRoZSBleGNlcHRpb24ncwogICAgYXNzb2NpYXRlZCB2YWx1ZSwgYW5kICdleGMnIHRoZSBleGNlcHRpb24uKQotICAgCi0gICBWYWx1ZSBzdGFjawkJTGFiZWwJSW5zdHJ1Y3Rpb24JQXJndW1lbnQKLSAgIFtdCQkJCVNFVFVQX0VYQ0VQVAlMMQotICAgW10JCQkJPGNvZGUgZm9yIFM+Ci0gICBbXQkJCQlQT1BfQkxPQ0sKLSAgIFtdCQkJCUpVTVBfRk9SV0FSRAlMMAotICAgCi0gICBbdGIsIHZhbCwgZXhjXQlMMToJRFVQCQkJCSkKLSAgIFt0YiwgdmFsLCBleGMsIGV4Y10JCTxldmFsdWF0ZSBFMT4JCQkpCi0gICBbdGIsIHZhbCwgZXhjLCBleGMsIEUxXQlDT01QQVJFX09QCUVYQ19NQVRDSAkpIG9ubHkgaWYgRTEKLSAgIFt0YiwgdmFsLCBleGMsIDEtb3ItMF0JSlVNUF9JRl9GQUxTRQlMMgkJKQotICAgW3RiLCB2YWwsIGV4YywgMV0JCVBPUAkJCQkpCi0gICBbdGIsIHZhbCwgZXhjXQkJUE9QCi0gICBbdGIsIHZhbF0JCQk8YXNzaWduIHRvIFYxPgkob3IgUE9QIGlmIG5vIFYxKQotICAgW3RiXQkJCQlQT1AKLSAgIFtdCQkJCTxjb2RlIGZvciBTMT4KLQkJCQlKVU1QX0ZPUldBUkQJTDAKLSAgIAotICAgW3RiLCB2YWwsIGV4YywgMF0JTDI6CVBPUAotICAgW3RiLCB2YWwsIGV4Y10JCURVUAorCisgICBWYWx1ZSBzdGFjayAgICAgICAgICBMYWJlbCAgIEluc3RydWN0aW9uICAgICBBcmd1bWVudAorICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICBTRVRVUF9FWENFUFQgICAgTDEKKyAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvZGUgZm9yIFM+CisgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgIFBPUF9CTE9DSworICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICBKVU1QX0ZPUldBUkQgICAgTDAKKworICAgW3RiLCB2YWwsIGV4Y10gICAgICAgTDE6ICAgICBEVVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgIFt0YiwgdmFsLCBleGMsIGV4Y10gICAgICAgICAgPGV2YWx1YXRlIEUxPiAgICAgICAgICAgICAgICAgICApCisgICBbdGIsIHZhbCwgZXhjLCBleGMsIEUxXSAgICAgIENPTVBBUkVfT1AgICAgICBFWENfTUFUQ0ggICAgICAgKSBvbmx5IGlmIEUxCisgICBbdGIsIHZhbCwgZXhjLCAxLW9yLTBdICAgICAgIEpVTVBfSUZfRkFMU0UgICBMMiAgICAgICAgICAgICAgKQorICAgW3RiLCB2YWwsIGV4YywgMV0gICAgICAgICAgICBQT1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgIFt0YiwgdmFsLCBleGNdICAgICAgICAgICAgICAgUE9QCisgICBbdGIsIHZhbF0gICAgICAgICAgICAgICAgICAgIDxhc3NpZ24gdG8gVjE+ICAob3IgUE9QIGlmIG5vIFYxKQorICAgW3RiXSAgICAgICAgICAgICAgICAgICAgICAgICBQT1AKKyAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvZGUgZm9yIFMxPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKVU1QX0ZPUldBUkQgICAgTDAKKworICAgW3RiLCB2YWwsIGV4YywgMF0gICAgTDI6ICAgICBQT1AKKyAgIFt0YiwgdmFsLCBleGNdICAgICAgICAgICAgICAgRFVQCiAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLmV0Yy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCiAKLSAgIFt0YiwgdmFsLCBleGMsIDBdCUxuKzE6CVBPUAotICAgW3RiLCB2YWwsIGV4Y10JCUVORF9GSU5BTExZCSMgcmUtcmFpc2UgZXhjZXB0aW9uCi0gICAKLSAgIFtdCQkJTDA6CTxuZXh0IHN0YXRlbWVudD4KLSAgIAorICAgW3RiLCB2YWwsIGV4YywgMF0gICAgTG4rMTogICBQT1AKKyAgIFt0YiwgdmFsLCBleGNdICAgICAgICAgICAgICAgRU5EX0ZJTkFMTFkgICAgICMgcmUtcmFpc2UgZXhjZXB0aW9uCisKKyAgIFtdICAgICAgICAgICAgICAgICAgIEwwOiAgICAgPG5leHQgc3RhdGVtZW50PgorCiAgICBPZiBjb3Vyc2UsIHBhcnRzIGFyZSBub3QgZ2VuZXJhdGVkIGlmIFZpIG9yIEVpIGlzIG5vdCBwcmVzZW50LgogKi8KIHN0YXRpYyBpbnQKIGNvbXBpbGVyX3RyeV9leGNlcHQoc3RydWN0IGNvbXBpbGVyICpjLCBzdG10X3R5IHMpCiB7Ci0JYmFzaWNibG9jayAqYm9keSwgKm9yZWxzZSwgKmV4Y2VwdCwgKmVuZDsKLQlpbnQgaSwgbjsKKyAgICBiYXNpY2Jsb2NrICpib2R5LCAqb3JlbHNlLCAqZXhjZXB0LCAqZW5kOworICAgIGludCBpLCBuOwogCi0JYm9keSA9IGNvbXBpbGVyX25ld19ibG9jayhjKTsKLQlleGNlcHQgPSBjb21waWxlcl9uZXdfYmxvY2soYyk7Ci0Jb3JlbHNlID0gY29tcGlsZXJfbmV3X2Jsb2NrKGMpOwotCWVuZCA9IGNvbXBpbGVyX25ld19ibG9jayhjKTsKLQlpZiAoYm9keSA9PSBOVUxMIHx8IGV4Y2VwdCA9PSBOVUxMIHx8IG9yZWxzZSA9PSBOVUxMIHx8IGVuZCA9PSBOVUxMKQotCQlyZXR1cm4gMDsKLQlBRERPUF9KUkVMKGMsIFNFVFVQX0VYQ0VQVCwgZXhjZXB0KTsKLQljb21waWxlcl91c2VfbmV4dF9ibG9jayhjLCBib2R5KTsKLQlpZiAoIWNvbXBpbGVyX3B1c2hfZmJsb2NrKGMsIEVYQ0VQVCwgYm9keSkpCi0JCXJldHVybiAwOwotCVZJU0lUX1NFUShjLCBzdG10LCBzLT52LlRyeUV4Y2VwdC5ib2R5KTsKLQlBRERPUChjLCBQT1BfQkxPQ0spOwotCWNvbXBpbGVyX3BvcF9mYmxvY2soYywgRVhDRVBULCBib2R5KTsKLQlBRERPUF9KUkVMKGMsIEpVTVBfRk9SV0FSRCwgb3JlbHNlKTsKLQluID0gYXNkbF9zZXFfTEVOKHMtPnYuVHJ5RXhjZXB0LmhhbmRsZXJzKTsKLQljb21waWxlcl91c2VfbmV4dF9ibG9jayhjLCBleGNlcHQpOwotCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJZXhjZXB0aGFuZGxlcl90eSBoYW5kbGVyID0gKGV4Y2VwdGhhbmRsZXJfdHkpYXNkbF9zZXFfR0VUKAotCQkJCQkJcy0+di5UcnlFeGNlcHQuaGFuZGxlcnMsIGkpOwotCQlpZiAoIWhhbmRsZXItPnYuRXhjZXB0SGFuZGxlci50eXBlICYmIGkgPCBuLTEpCi0JCSAgICByZXR1cm4gY29tcGlsZXJfZXJyb3IoYywgImRlZmF1bHQgJ2V4Y2VwdDonIG11c3QgYmUgbGFzdCIpOwotCQljLT51LT51X2xpbmVub19zZXQgPSBmYWxzZTsKLQkJYy0+dS0+dV9saW5lbm8gPSBoYW5kbGVyLT5saW5lbm87Ci0JCWV4Y2VwdCA9IGNvbXBpbGVyX25ld19ibG9jayhjKTsKLQkJaWYgKGV4Y2VwdCA9PSBOVUxMKQotCQkJcmV0dXJuIDA7Ci0JCWlmIChoYW5kbGVyLT52LkV4Y2VwdEhhbmRsZXIudHlwZSkgewotCQkJQURET1AoYywgRFVQX1RPUCk7Ci0JCQlWSVNJVChjLCBleHByLCBoYW5kbGVyLT52LkV4Y2VwdEhhbmRsZXIudHlwZSk7Ci0JCQlBRERPUF9JKGMsIENPTVBBUkVfT1AsIFB5Q21wX0VYQ19NQVRDSCk7Ci0JCQlBRERPUF9KUkVMKGMsIEpVTVBfSUZfRkFMU0UsIGV4Y2VwdCk7Ci0JCQlBRERPUChjLCBQT1BfVE9QKTsKLQkJfQotCQlBRERPUChjLCBQT1BfVE9QKTsKLQkJaWYgKGhhbmRsZXItPnYuRXhjZXB0SGFuZGxlci5uYW1lKSB7Ci0JCQlWSVNJVChjLCBleHByLCBoYW5kbGVyLT52LkV4Y2VwdEhhbmRsZXIubmFtZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlBRERPUChjLCBQT1BfVE9QKTsKLQkJfQotCQlBRERPUChjLCBQT1BfVE9QKTsKLQkJVklTSVRfU0VRKGMsIHN0bXQsIGhhbmRsZXItPnYuRXhjZXB0SGFuZGxlci5ib2R5KTsKLQkJQURET1BfSlJFTChjLCBKVU1QX0ZPUldBUkQsIGVuZCk7Ci0JCWNvbXBpbGVyX3VzZV9uZXh0X2Jsb2NrKGMsIGV4Y2VwdCk7Ci0JCWlmIChoYW5kbGVyLT52LkV4Y2VwdEhhbmRsZXIudHlwZSkKLQkJCUFERE9QKGMsIFBPUF9UT1ApOwotCX0KLQlBRERPUChjLCBFTkRfRklOQUxMWSk7Ci0JY29tcGlsZXJfdXNlX25leHRfYmxvY2soYywgb3JlbHNlKTsKLQlWSVNJVF9TRVEoYywgc3RtdCwgcy0+di5UcnlFeGNlcHQub3JlbHNlKTsKLQljb21waWxlcl91c2VfbmV4dF9ibG9jayhjLCBlbmQpOwotCXJldHVybiAxOworICAgIGJvZHkgPSBjb21waWxlcl9uZXdfYmxvY2soYyk7CisgICAgZXhjZXB0ID0gY29tcGlsZXJfbmV3X2Jsb2NrKGMpOworICAgIG9yZWxzZSA9IGNvbXBpbGVyX25ld19ibG9jayhjKTsKKyAgICBlbmQgPSBjb21waWxlcl9uZXdfYmxvY2soYyk7CisgICAgaWYgKGJvZHkgPT0gTlVMTCB8fCBleGNlcHQgPT0gTlVMTCB8fCBvcmVsc2UgPT0gTlVMTCB8fCBlbmQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgQURET1BfSlJFTChjLCBTRVRVUF9FWENFUFQsIGV4Y2VwdCk7CisgICAgY29tcGlsZXJfdXNlX25leHRfYmxvY2soYywgYm9keSk7CisgICAgaWYgKCFjb21waWxlcl9wdXNoX2ZibG9jayhjLCBFWENFUFQsIGJvZHkpKQorICAgICAgICByZXR1cm4gMDsKKyAgICBWSVNJVF9TRVEoYywgc3RtdCwgcy0+di5UcnlFeGNlcHQuYm9keSk7CisgICAgQURET1AoYywgUE9QX0JMT0NLKTsKKyAgICBjb21waWxlcl9wb3BfZmJsb2NrKGMsIEVYQ0VQVCwgYm9keSk7CisgICAgQURET1BfSlJFTChjLCBKVU1QX0ZPUldBUkQsIG9yZWxzZSk7CisgICAgbiA9IGFzZGxfc2VxX0xFTihzLT52LlRyeUV4Y2VwdC5oYW5kbGVycyk7CisgICAgY29tcGlsZXJfdXNlX25leHRfYmxvY2soYywgZXhjZXB0KTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIGV4Y2VwdGhhbmRsZXJfdHkgaGFuZGxlciA9IChleGNlcHRoYW5kbGVyX3R5KWFzZGxfc2VxX0dFVCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT52LlRyeUV4Y2VwdC5oYW5kbGVycywgaSk7CisgICAgICAgIGlmICghaGFuZGxlci0+di5FeGNlcHRIYW5kbGVyLnR5cGUgJiYgaSA8IG4tMSkKKyAgICAgICAgICAgIHJldHVybiBjb21waWxlcl9lcnJvcihjLCAiZGVmYXVsdCAnZXhjZXB0OicgbXVzdCBiZSBsYXN0Iik7CisgICAgICAgIGMtPnUtPnVfbGluZW5vX3NldCA9IGZhbHNlOworICAgICAgICBjLT51LT51X2xpbmVubyA9IGhhbmRsZXItPmxpbmVubzsKKyAgICAgICAgZXhjZXB0ID0gY29tcGlsZXJfbmV3X2Jsb2NrKGMpOworICAgICAgICBpZiAoZXhjZXB0ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgaWYgKGhhbmRsZXItPnYuRXhjZXB0SGFuZGxlci50eXBlKSB7CisgICAgICAgICAgICBBRERPUChjLCBEVVBfVE9QKTsKKyAgICAgICAgICAgIFZJU0lUKGMsIGV4cHIsIGhhbmRsZXItPnYuRXhjZXB0SGFuZGxlci50eXBlKTsKKyAgICAgICAgICAgIEFERE9QX0koYywgQ09NUEFSRV9PUCwgUHlDbXBfRVhDX01BVENIKTsKKyAgICAgICAgICAgIEFERE9QX0pSRUwoYywgSlVNUF9JRl9GQUxTRSwgZXhjZXB0KTsKKyAgICAgICAgICAgIEFERE9QKGMsIFBPUF9UT1ApOworICAgICAgICB9CisgICAgICAgIEFERE9QKGMsIFBPUF9UT1ApOworICAgICAgICBpZiAoaGFuZGxlci0+di5FeGNlcHRIYW5kbGVyLm5hbWUpIHsKKyAgICAgICAgICAgIFZJU0lUKGMsIGV4cHIsIGhhbmRsZXItPnYuRXhjZXB0SGFuZGxlci5uYW1lKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIEFERE9QKGMsIFBPUF9UT1ApOworICAgICAgICB9CisgICAgICAgIEFERE9QKGMsIFBPUF9UT1ApOworICAgICAgICBWSVNJVF9TRVEoYywgc3RtdCwgaGFuZGxlci0+di5FeGNlcHRIYW5kbGVyLmJvZHkpOworICAgICAgICBBRERPUF9KUkVMKGMsIEpVTVBfRk9SV0FSRCwgZW5kKTsKKyAgICAgICAgY29tcGlsZXJfdXNlX25leHRfYmxvY2soYywgZXhjZXB0KTsKKyAgICAgICAgaWYgKGhhbmRsZXItPnYuRXhjZXB0SGFuZGxlci50eXBlKQorICAgICAgICAgICAgQURET1AoYywgUE9QX1RPUCk7CisgICAgfQorICAgIEFERE9QKGMsIEVORF9GSU5BTExZKTsKKyAgICBjb21waWxlcl91c2VfbmV4dF9ibG9jayhjLCBvcmVsc2UpOworICAgIFZJU0lUX1NFUShjLCBzdG10LCBzLT52LlRyeUV4Y2VwdC5vcmVsc2UpOworICAgIGNvbXBpbGVyX3VzZV9uZXh0X2Jsb2NrKGMsIGVuZCk7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyBpbnQKIGNvbXBpbGVyX2ltcG9ydF9hcyhzdHJ1Y3QgY29tcGlsZXIgKmMsIGlkZW50aWZpZXIgbmFtZSwgaWRlbnRpZmllciBhc25hbWUpCiB7Ci0JLyogVGhlIElNUE9SVF9OQU1FIG9wY29kZSB3YXMgYWxyZWFkeSBnZW5lcmF0ZWQuICBUaGlzIGZ1bmN0aW9uCi0JICAgbWVyZWx5IG5lZWRzIHRvIGJpbmQgdGhlIHJlc3VsdCB0byBhIG5hbWUuCisgICAgLyogVGhlIElNUE9SVF9OQU1FIG9wY29kZSB3YXMgYWxyZWFkeSBnZW5lcmF0ZWQuICBUaGlzIGZ1bmN0aW9uCisgICAgICAgbWVyZWx5IG5lZWRzIHRvIGJpbmQgdGhlIHJlc3VsdCB0byBhIG5hbWUuCiAKLQkgICBJZiB0aGVyZSBpcyBhIGRvdCBpbiBuYW1lLCB3ZSBuZWVkIHRvIHNwbGl0IGl0IGFuZCBlbWl0IGEgCi0JICAgTE9BRF9BVFRSIGZvciBlYWNoIG5hbWUuCi0JKi8KLQljb25zdCBjaGFyICpzcmMgPSBQeVN0cmluZ19BU19TVFJJTkcobmFtZSk7Ci0JY29uc3QgY2hhciAqZG90ID0gc3RyY2hyKHNyYywgJy4nKTsKLQlpZiAoZG90KSB7Ci0JCS8qIENvbnN1bWUgdGhlIGJhc2UgbW9kdWxlIG5hbWUgdG8gZ2V0IHRoZSBmaXJzdCBhdHRyaWJ1dGUgKi8KLQkJc3JjID0gZG90ICsgMTsKLQkJd2hpbGUgKGRvdCkgewotCQkJLyogTkIgc3JjIGlzIG9ubHkgZGVmaW5lZCB3aGVuIGRvdCAhPSBOVUxMICovCi0JCQlQeU9iamVjdCAqYXR0cjsKLQkJCWRvdCA9IHN0cmNocihzcmMsICcuJyk7Ci0JCQlhdHRyID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoc3JjLCAKLQkJCQkJICAgIGRvdCA/IGRvdCAtIHNyYyA6IHN0cmxlbihzcmMpKTsKLQkJCWlmICghYXR0cikKLQkJCQlyZXR1cm4gLTE7Ci0JCQlBRERPUF9PKGMsIExPQURfQVRUUiwgYXR0ciwgbmFtZXMpOwotCQkJUHlfREVDUkVGKGF0dHIpOwotCQkJc3JjID0gZG90ICsgMTsKLQkJfQotCX0KLQlyZXR1cm4gY29tcGlsZXJfbmFtZW9wKGMsIGFzbmFtZSwgU3RvcmUpOworICAgICAgIElmIHRoZXJlIGlzIGEgZG90IGluIG5hbWUsIHdlIG5lZWQgdG8gc3BsaXQgaXQgYW5kIGVtaXQgYQorICAgICAgIExPQURfQVRUUiBmb3IgZWFjaCBuYW1lLgorICAgICovCisgICAgY29uc3QgY2hhciAqc3JjID0gUHlTdHJpbmdfQVNfU1RSSU5HKG5hbWUpOworICAgIGNvbnN0IGNoYXIgKmRvdCA9IHN0cmNocihzcmMsICcuJyk7CisgICAgaWYgKGRvdCkgeworICAgICAgICAvKiBDb25zdW1lIHRoZSBiYXNlIG1vZHVsZSBuYW1lIHRvIGdldCB0aGUgZmlyc3QgYXR0cmlidXRlICovCisgICAgICAgIHNyYyA9IGRvdCArIDE7CisgICAgICAgIHdoaWxlIChkb3QpIHsKKyAgICAgICAgICAgIC8qIE5CIHNyYyBpcyBvbmx5IGRlZmluZWQgd2hlbiBkb3QgIT0gTlVMTCAqLworICAgICAgICAgICAgUHlPYmplY3QgKmF0dHI7CisgICAgICAgICAgICBkb3QgPSBzdHJjaHIoc3JjLCAnLicpOworICAgICAgICAgICAgYXR0ciA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG90ID8gZG90IC0gc3JjIDogc3RybGVuKHNyYykpOworICAgICAgICAgICAgaWYgKCFhdHRyKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIEFERE9QX08oYywgTE9BRF9BVFRSLCBhdHRyLCBuYW1lcyk7CisgICAgICAgICAgICBQeV9ERUNSRUYoYXR0cik7CisgICAgICAgICAgICBzcmMgPSBkb3QgKyAxOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBjb21waWxlcl9uYW1lb3AoYywgYXNuYW1lLCBTdG9yZSk7CiB9CiAKIHN0YXRpYyBpbnQKIGNvbXBpbGVyX2ltcG9ydChzdHJ1Y3QgY29tcGlsZXIgKmMsIHN0bXRfdHkgcykKIHsKLQkvKiBUaGUgSW1wb3J0IG5vZGUgc3RvcmVzIGEgbW9kdWxlIG5hbWUgbGlrZSBhLmIuYyBhcyBhIHNpbmdsZQotCSAgIHN0cmluZy4gIFRoaXMgaXMgY29udmVuaWVudCBmb3IgYWxsIGNhc2VzIGV4Y2VwdAotCSAgICAgaW1wb3J0IGEuYi5jIGFzIGQKLQkgICB3aGVyZSB3ZSBuZWVkIHRvIHBhcnNlIHRoYXQgc3RyaW5nIHRvIGV4dHJhY3QgdGhlIGluZGl2aWR1YWwKLQkgICBtb2R1bGUgbmFtZXMuICAKLQkgICBYWFggUGVyaGFwcyBjaGFuZ2UgdGhlIHJlcHJlc2VudGF0aW9uIHRvIG1ha2UgdGhpcyBjYXNlIHNpbXBsZXI/Ci0JICovCi0JaW50IGksIG4gPSBhc2RsX3NlcV9MRU4ocy0+di5JbXBvcnQubmFtZXMpOworICAgIC8qIFRoZSBJbXBvcnQgbm9kZSBzdG9yZXMgYSBtb2R1bGUgbmFtZSBsaWtlIGEuYi5jIGFzIGEgc2luZ2xlCisgICAgICAgc3RyaW5nLiAgVGhpcyBpcyBjb252ZW5pZW50IGZvciBhbGwgY2FzZXMgZXhjZXB0CisgICAgICAgICBpbXBvcnQgYS5iLmMgYXMgZAorICAgICAgIHdoZXJlIHdlIG5lZWQgdG8gcGFyc2UgdGhhdCBzdHJpbmcgdG8gZXh0cmFjdCB0aGUgaW5kaXZpZHVhbAorICAgICAgIG1vZHVsZSBuYW1lcy4KKyAgICAgICBYWFggUGVyaGFwcyBjaGFuZ2UgdGhlIHJlcHJlc2VudGF0aW9uIHRvIG1ha2UgdGhpcyBjYXNlIHNpbXBsZXI/CisgICAgICovCisgICAgaW50IGksIG4gPSBhc2RsX3NlcV9MRU4ocy0+di5JbXBvcnQubmFtZXMpOwogCi0JZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQlhbGlhc190eSBhbGlhcyA9IChhbGlhc190eSlhc2RsX3NlcV9HRVQocy0+di5JbXBvcnQubmFtZXMsIGkpOwotCQlpbnQgcjsKLQkJUHlPYmplY3QgKmxldmVsOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgYWxpYXNfdHkgYWxpYXMgPSAoYWxpYXNfdHkpYXNkbF9zZXFfR0VUKHMtPnYuSW1wb3J0Lm5hbWVzLCBpKTsKKyAgICAgICAgaW50IHI7CisgICAgICAgIFB5T2JqZWN0ICpsZXZlbDsKIAotCQlpZiAoYy0+Y19mbGFncyAmJiAoYy0+Y19mbGFncy0+Y2ZfZmxhZ3MgJiBDT19GVVRVUkVfQUJTT0xVVEVfSU1QT1JUKSkKLQkJCWxldmVsID0gUHlJbnRfRnJvbUxvbmcoMCk7Ci0JCWVsc2UKLQkJCWxldmVsID0gUHlJbnRfRnJvbUxvbmcoLTEpOworICAgICAgICBpZiAoYy0+Y19mbGFncyAmJiAoYy0+Y19mbGFncy0+Y2ZfZmxhZ3MgJiBDT19GVVRVUkVfQUJTT0xVVEVfSU1QT1JUKSkKKyAgICAgICAgICAgIGxldmVsID0gUHlJbnRfRnJvbUxvbmcoMCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGxldmVsID0gUHlJbnRfRnJvbUxvbmcoLTEpOwogCi0JCWlmIChsZXZlbCA9PSBOVUxMKQotCQkJcmV0dXJuIDA7CisgICAgICAgIGlmIChsZXZlbCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIDA7CiAKLQkJQURET1BfTyhjLCBMT0FEX0NPTlNULCBsZXZlbCwgY29uc3RzKTsKLQkJUHlfREVDUkVGKGxldmVsKTsKLQkJQURET1BfTyhjLCBMT0FEX0NPTlNULCBQeV9Ob25lLCBjb25zdHMpOwotCQlBRERPUF9OQU1FKGMsIElNUE9SVF9OQU1FLCBhbGlhcy0+bmFtZSwgbmFtZXMpOworICAgICAgICBBRERPUF9PKGMsIExPQURfQ09OU1QsIGxldmVsLCBjb25zdHMpOworICAgICAgICBQeV9ERUNSRUYobGV2ZWwpOworICAgICAgICBBRERPUF9PKGMsIExPQURfQ09OU1QsIFB5X05vbmUsIGNvbnN0cyk7CisgICAgICAgIEFERE9QX05BTUUoYywgSU1QT1JUX05BTUUsIGFsaWFzLT5uYW1lLCBuYW1lcyk7CiAKLQkJaWYgKGFsaWFzLT5hc25hbWUpIHsKLQkJCXIgPSBjb21waWxlcl9pbXBvcnRfYXMoYywgYWxpYXMtPm5hbWUsIGFsaWFzLT5hc25hbWUpOwotCQkJaWYgKCFyKQotCQkJICAgIHJldHVybiByOwotCQl9Ci0JCWVsc2UgewotCQkJaWRlbnRpZmllciB0bXAgPSBhbGlhcy0+bmFtZTsKLQkJCWNvbnN0IGNoYXIgKmJhc2UgPSBQeVN0cmluZ19BU19TVFJJTkcoYWxpYXMtPm5hbWUpOwotCQkJY2hhciAqZG90ID0gc3RyY2hyKGJhc2UsICcuJyk7Ci0JCQlpZiAoZG90KQotCQkJCXRtcCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGJhc2UsIAotCQkJCQkJCQkgZG90IC0gYmFzZSk7Ci0JCQlyID0gY29tcGlsZXJfbmFtZW9wKGMsIHRtcCwgU3RvcmUpOwotCQkJaWYgKGRvdCkgewotCQkJCVB5X0RFQ1JFRih0bXApOwotCQkJfQotCQkJaWYgKCFyKQotCQkJCXJldHVybiByOwotCQl9Ci0JfQotCXJldHVybiAxOworICAgICAgICBpZiAoYWxpYXMtPmFzbmFtZSkgeworICAgICAgICAgICAgciA9IGNvbXBpbGVyX2ltcG9ydF9hcyhjLCBhbGlhcy0+bmFtZSwgYWxpYXMtPmFzbmFtZSk7CisgICAgICAgICAgICBpZiAoIXIpCisgICAgICAgICAgICAgICAgcmV0dXJuIHI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZGVudGlmaWVyIHRtcCA9IGFsaWFzLT5uYW1lOworICAgICAgICAgICAgY29uc3QgY2hhciAqYmFzZSA9IFB5U3RyaW5nX0FTX1NUUklORyhhbGlhcy0+bmFtZSk7CisgICAgICAgICAgICBjaGFyICpkb3QgPSBzdHJjaHIoYmFzZSwgJy4nKTsKKyAgICAgICAgICAgIGlmIChkb3QpCisgICAgICAgICAgICAgICAgdG1wID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3QgLSBiYXNlKTsKKyAgICAgICAgICAgIHIgPSBjb21waWxlcl9uYW1lb3AoYywgdG1wLCBTdG9yZSk7CisgICAgICAgICAgICBpZiAoZG90KSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHRtcCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIXIpCisgICAgICAgICAgICAgICAgcmV0dXJuIHI7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyBpbnQKIGNvbXBpbGVyX2Zyb21faW1wb3J0KHN0cnVjdCBjb21waWxlciAqYywgc3RtdF90eSBzKQogewotCWludCBpLCBuID0gYXNkbF9zZXFfTEVOKHMtPnYuSW1wb3J0RnJvbS5uYW1lcyk7CisgICAgaW50IGksIG4gPSBhc2RsX3NlcV9MRU4ocy0+di5JbXBvcnRGcm9tLm5hbWVzKTsKIAotCVB5T2JqZWN0ICpuYW1lcyA9IFB5VHVwbGVfTmV3KG4pOwotCVB5T2JqZWN0ICpsZXZlbDsKLQkKLQlpZiAoIW5hbWVzKQotCQlyZXR1cm4gMDsKKyAgICBQeU9iamVjdCAqbmFtZXMgPSBQeVR1cGxlX05ldyhuKTsKKyAgICBQeU9iamVjdCAqbGV2ZWw7CiAKLQlpZiAocy0+di5JbXBvcnRGcm9tLmxldmVsID09IDAgJiYgYy0+Y19mbGFncyAmJgotCSAgICAhKGMtPmNfZmxhZ3MtPmNmX2ZsYWdzICYgQ09fRlVUVVJFX0FCU09MVVRFX0lNUE9SVCkpCi0JCWxldmVsID0gUHlJbnRfRnJvbUxvbmcoLTEpOwotCWVsc2UKLQkJbGV2ZWwgPSBQeUludF9Gcm9tTG9uZyhzLT52LkltcG9ydEZyb20ubGV2ZWwpOworICAgIGlmICghbmFtZXMpCisgICAgICAgIHJldHVybiAwOwogCi0JaWYgKCFsZXZlbCkgewotCQlQeV9ERUNSRUYobmFtZXMpOwotCQlyZXR1cm4gMDsKLQl9CisgICAgaWYgKHMtPnYuSW1wb3J0RnJvbS5sZXZlbCA9PSAwICYmIGMtPmNfZmxhZ3MgJiYKKyAgICAgICAgIShjLT5jX2ZsYWdzLT5jZl9mbGFncyAmIENPX0ZVVFVSRV9BQlNPTFVURV9JTVBPUlQpKQorICAgICAgICBsZXZlbCA9IFB5SW50X0Zyb21Mb25nKC0xKTsKKyAgICBlbHNlCisgICAgICAgIGxldmVsID0gUHlJbnRfRnJvbUxvbmcocy0+di5JbXBvcnRGcm9tLmxldmVsKTsKIAotCS8qIGJ1aWxkIHVwIHRoZSBuYW1lcyAqLwotCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJYWxpYXNfdHkgYWxpYXMgPSAoYWxpYXNfdHkpYXNkbF9zZXFfR0VUKHMtPnYuSW1wb3J0RnJvbS5uYW1lcywgaSk7Ci0JCVB5X0lOQ1JFRihhbGlhcy0+bmFtZSk7Ci0JCVB5VHVwbGVfU0VUX0lURU0obmFtZXMsIGksIGFsaWFzLT5uYW1lKTsKLQl9CisgICAgaWYgKCFsZXZlbCkgeworICAgICAgICBQeV9ERUNSRUYobmFtZXMpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLQlpZiAocy0+bGluZW5vID4gYy0+Y19mdXR1cmUtPmZmX2xpbmVubykgewotCQlpZiAoIXN0cmNtcChQeVN0cmluZ19BU19TVFJJTkcocy0+di5JbXBvcnRGcm9tLm1vZHVsZSksCi0JCQkgICAgIl9fZnV0dXJlX18iKSkgewotCQkJUHlfREVDUkVGKGxldmVsKTsKLQkJCVB5X0RFQ1JFRihuYW1lcyk7Ci0JCQlyZXR1cm4gY29tcGlsZXJfZXJyb3IoYywgCi0JCQkJICAgICAgImZyb20gX19mdXR1cmVfXyBpbXBvcnRzIG11c3Qgb2NjdXIgIgotCQkJCSAgICAgICJhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlIik7CisgICAgLyogYnVpbGQgdXAgdGhlIG5hbWVzICovCisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICBhbGlhc190eSBhbGlhcyA9IChhbGlhc190eSlhc2RsX3NlcV9HRVQocy0+di5JbXBvcnRGcm9tLm5hbWVzLCBpKTsKKyAgICAgICAgUHlfSU5DUkVGKGFsaWFzLT5uYW1lKTsKKyAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShuYW1lcywgaSwgYWxpYXMtPm5hbWUpOworICAgIH0KIAotCQl9Ci0JfQorICAgIGlmIChzLT5saW5lbm8gPiBjLT5jX2Z1dHVyZS0+ZmZfbGluZW5vKSB7CisgICAgICAgIGlmICghc3RyY21wKFB5U3RyaW5nX0FTX1NUUklORyhzLT52LkltcG9ydEZyb20ubW9kdWxlKSwKKyAgICAgICAgICAgICAgICAgICAgIl9fZnV0dXJlX18iKSkgeworICAgICAgICAgICAgUHlfREVDUkVGKGxldmVsKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihuYW1lcyk7CisgICAgICAgICAgICByZXR1cm4gY29tcGlsZXJfZXJyb3IoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImZyb20gX19mdXR1cmVfXyBpbXBvcnRzIG11c3Qgb2NjdXIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZSIpOwogCi0JQURET1BfTyhjLCBMT0FEX0NPTlNULCBsZXZlbCwgY29uc3RzKTsKLQlQeV9ERUNSRUYobGV2ZWwpOwotCUFERE9QX08oYywgTE9BRF9DT05TVCwgbmFtZXMsIGNvbnN0cyk7Ci0JUHlfREVDUkVGKG5hbWVzKTsKLQlBRERPUF9OQU1FKGMsIElNUE9SVF9OQU1FLCBzLT52LkltcG9ydEZyb20ubW9kdWxlLCBuYW1lcyk7Ci0JZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQlhbGlhc190eSBhbGlhcyA9IChhbGlhc190eSlhc2RsX3NlcV9HRVQocy0+di5JbXBvcnRGcm9tLm5hbWVzLCBpKTsKLQkJaWRlbnRpZmllciBzdG9yZV9uYW1lOworICAgICAgICB9CisgICAgfQogCi0JCWlmIChpID09IDAgJiYgKlB5U3RyaW5nX0FTX1NUUklORyhhbGlhcy0+bmFtZSkgPT0gJyonKSB7Ci0JCQlhc3NlcnQobiA9PSAxKTsKLQkJCUFERE9QKGMsIElNUE9SVF9TVEFSKTsKLQkJCXJldHVybiAxOwotCQl9Ci0JCSAgICAKLQkJQURET1BfTkFNRShjLCBJTVBPUlRfRlJPTSwgYWxpYXMtPm5hbWUsIG5hbWVzKTsKLQkJc3RvcmVfbmFtZSA9IGFsaWFzLT5uYW1lOwotCQlpZiAoYWxpYXMtPmFzbmFtZSkKLQkJCXN0b3JlX25hbWUgPSBhbGlhcy0+YXNuYW1lOworICAgIEFERE9QX08oYywgTE9BRF9DT05TVCwgbGV2ZWwsIGNvbnN0cyk7CisgICAgUHlfREVDUkVGKGxldmVsKTsKKyAgICBBRERPUF9PKGMsIExPQURfQ09OU1QsIG5hbWVzLCBjb25zdHMpOworICAgIFB5X0RFQ1JFRihuYW1lcyk7CisgICAgQURET1BfTkFNRShjLCBJTVBPUlRfTkFNRSwgcy0+di5JbXBvcnRGcm9tLm1vZHVsZSwgbmFtZXMpOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgYWxpYXNfdHkgYWxpYXMgPSAoYWxpYXNfdHkpYXNkbF9zZXFfR0VUKHMtPnYuSW1wb3J0RnJvbS5uYW1lcywgaSk7CisgICAgICAgIGlkZW50aWZpZXIgc3RvcmVfbmFtZTsKIAotCQlpZiAoIWNvbXBpbGVyX25hbWVvcChjLCBzdG9yZV9uYW1lLCBTdG9yZSkpIHsKLQkJCVB5X0RFQ1JFRihuYW1lcyk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQkvKiByZW1vdmUgaW1wb3J0ZWQgbW9kdWxlICovCi0JQURET1AoYywgUE9QX1RPUCk7Ci0JcmV0dXJuIDE7CisgICAgICAgIGlmIChpID09IDAgJiYgKlB5U3RyaW5nX0FTX1NUUklORyhhbGlhcy0+bmFtZSkgPT0gJyonKSB7CisgICAgICAgICAgICBhc3NlcnQobiA9PSAxKTsKKyAgICAgICAgICAgIEFERE9QKGMsIElNUE9SVF9TVEFSKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisKKyAgICAgICAgQURET1BfTkFNRShjLCBJTVBPUlRfRlJPTSwgYWxpYXMtPm5hbWUsIG5hbWVzKTsKKyAgICAgICAgc3RvcmVfbmFtZSA9IGFsaWFzLT5uYW1lOworICAgICAgICBpZiAoYWxpYXMtPmFzbmFtZSkKKyAgICAgICAgICAgIHN0b3JlX25hbWUgPSBhbGlhcy0+YXNuYW1lOworCisgICAgICAgIGlmICghY29tcGlsZXJfbmFtZW9wKGMsIHN0b3JlX25hbWUsIFN0b3JlKSkgeworICAgICAgICAgICAgUHlfREVDUkVGKG5hbWVzKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorICAgIC8qIHJlbW92ZSBpbXBvcnRlZCBtb2R1bGUgKi8KKyAgICBBRERPUChjLCBQT1BfVE9QKTsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIGludAogY29tcGlsZXJfYXNzZXJ0KHN0cnVjdCBjb21waWxlciAqYywgc3RtdF90eSBzKQogewotCXN0YXRpYyBQeU9iamVjdCAqYXNzZXJ0aW9uX2Vycm9yID0gTlVMTDsKLQliYXNpY2Jsb2NrICplbmQ7CisgICAgc3RhdGljIFB5T2JqZWN0ICphc3NlcnRpb25fZXJyb3IgPSBOVUxMOworICAgIGJhc2ljYmxvY2sgKmVuZDsKIAotCWlmIChQeV9PcHRpbWl6ZUZsYWcpCi0JCXJldHVybiAxOwotCWlmIChhc3NlcnRpb25fZXJyb3IgPT0gTlVMTCkgewotCQlhc3NlcnRpb25fZXJyb3IgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJBc3NlcnRpb25FcnJvciIpOwotCQlpZiAoYXNzZXJ0aW9uX2Vycm9yID09IE5VTEwpCi0JCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKHMtPnYuQXNzZXJ0LnRlc3QtPmtpbmQgPT0gVHVwbGVfa2luZCAmJgotCSAgICBhc2RsX3NlcV9MRU4ocy0+di5Bc3NlcnQudGVzdC0+di5UdXBsZS5lbHRzKSA+IDApIHsKLQkJY29uc3QgY2hhciogbXNnID0KLQkJCSJhc3NlcnRpb24gaXMgYWx3YXlzIHRydWUsIHBlcmhhcHMgcmVtb3ZlIHBhcmVudGhlc2VzPyI7Ci0JCWlmIChQeUVycl9XYXJuRXhwbGljaXQoUHlFeGNfU3ludGF4V2FybmluZywgbXNnLCBjLT5jX2ZpbGVuYW1lLAotCQkJCSAgICAgICBjLT51LT51X2xpbmVubywgTlVMTCwgTlVMTCkgPT0gLTEpCi0JCQlyZXR1cm4gMDsKLQl9Ci0JVklTSVQoYywgZXhwciwgcy0+di5Bc3NlcnQudGVzdCk7Ci0JZW5kID0gY29tcGlsZXJfbmV3X2Jsb2NrKGMpOwotCWlmIChlbmQgPT0gTlVMTCkKLQkJcmV0dXJuIDA7Ci0JQURET1BfSlJFTChjLCBKVU1QX0lGX1RSVUUsIGVuZCk7Ci0JQURET1AoYywgUE9QX1RPUCk7Ci0JQURET1BfTyhjLCBMT0FEX0dMT0JBTCwgYXNzZXJ0aW9uX2Vycm9yLCBuYW1lcyk7Ci0JaWYgKHMtPnYuQXNzZXJ0Lm1zZykgewotCQlWSVNJVChjLCBleHByLCBzLT52LkFzc2VydC5tc2cpOwotCQlBRERPUF9JKGMsIFJBSVNFX1ZBUkFSR1MsIDIpOwotCX0KLQllbHNlIHsKLQkJQURET1BfSShjLCBSQUlTRV9WQVJBUkdTLCAxKTsKLQl9Ci0JY29tcGlsZXJfdXNlX25leHRfYmxvY2soYywgZW5kKTsKLQlBRERPUChjLCBQT1BfVE9QKTsKLQlyZXR1cm4gMTsKKyAgICBpZiAoUHlfT3B0aW1pemVGbGFnKQorICAgICAgICByZXR1cm4gMTsKKyAgICBpZiAoYXNzZXJ0aW9uX2Vycm9yID09IE5VTEwpIHsKKyAgICAgICAgYXNzZXJ0aW9uX2Vycm9yID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiQXNzZXJ0aW9uRXJyb3IiKTsKKyAgICAgICAgaWYgKGFzc2VydGlvbl9lcnJvciA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChzLT52LkFzc2VydC50ZXN0LT5raW5kID09IFR1cGxlX2tpbmQgJiYKKyAgICAgICAgYXNkbF9zZXFfTEVOKHMtPnYuQXNzZXJ0LnRlc3QtPnYuVHVwbGUuZWx0cykgPiAwKSB7CisgICAgICAgIGNvbnN0IGNoYXIqIG1zZyA9CisgICAgICAgICAgICAiYXNzZXJ0aW9uIGlzIGFsd2F5cyB0cnVlLCBwZXJoYXBzIHJlbW92ZSBwYXJlbnRoZXNlcz8iOworICAgICAgICBpZiAoUHlFcnJfV2FybkV4cGxpY2l0KFB5RXhjX1N5bnRheFdhcm5pbmcsIG1zZywgYy0+Y19maWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT51LT51X2xpbmVubywgTlVMTCwgTlVMTCkgPT0gLTEpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgVklTSVQoYywgZXhwciwgcy0+di5Bc3NlcnQudGVzdCk7CisgICAgZW5kID0gY29tcGlsZXJfbmV3X2Jsb2NrKGMpOworICAgIGlmIChlbmQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgQURET1BfSlJFTChjLCBKVU1QX0lGX1RSVUUsIGVuZCk7CisgICAgQURET1AoYywgUE9QX1RPUCk7CisgICAgQURET1BfTyhjLCBMT0FEX0dMT0JBTCwgYXNzZXJ0aW9uX2Vycm9yLCBuYW1lcyk7CisgICAgaWYgKHMtPnYuQXNzZXJ0Lm1zZykgeworICAgICAgICBWSVNJVChjLCBleHByLCBzLT52LkFzc2VydC5tc2cpOworICAgICAgICBBRERPUF9JKGMsIFJBSVNFX1ZBUkFSR1MsIDIpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgQURET1BfSShjLCBSQUlTRV9WQVJBUkdTLCAxKTsKKyAgICB9CisgICAgY29tcGlsZXJfdXNlX25leHRfYmxvY2soYywgZW5kKTsKKyAgICBBRERPUChjLCBQT1BfVE9QKTsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIGludAogY29tcGlsZXJfdmlzaXRfc3RtdChzdHJ1Y3QgY29tcGlsZXIgKmMsIHN0bXRfdHkgcykKIHsKLQlpbnQgaSwgbjsKKyAgICBpbnQgaSwgbjsKIAotCS8qIEFsd2F5cyBhc3NpZ24gYSBsaW5lbm8gdG8gdGhlIG5leHQgaW5zdHJ1Y3Rpb24gZm9yIGEgc3RtdC4gKi8KLQljLT51LT51X2xpbmVubyA9IHMtPmxpbmVubzsKLQljLT51LT51X2xpbmVub19zZXQgPSBmYWxzZTsKKyAgICAvKiBBbHdheXMgYXNzaWduIGEgbGluZW5vIHRvIHRoZSBuZXh0IGluc3RydWN0aW9uIGZvciBhIHN0bXQuICovCisgICAgYy0+dS0+dV9saW5lbm8gPSBzLT5saW5lbm87CisgICAgYy0+dS0+dV9saW5lbm9fc2V0ID0gZmFsc2U7CiAKLQlzd2l0Y2ggKHMtPmtpbmQpIHsKLQljYXNlIEZ1bmN0aW9uRGVmX2tpbmQ6Ci0JCXJldHVybiBjb21waWxlcl9mdW5jdGlvbihjLCBzKTsKLQljYXNlIENsYXNzRGVmX2tpbmQ6Ci0JCXJldHVybiBjb21waWxlcl9jbGFzcyhjLCBzKTsKLQljYXNlIFJldHVybl9raW5kOgotCQlpZiAoYy0+dS0+dV9zdGUtPnN0ZV90eXBlICE9IEZ1bmN0aW9uQmxvY2spCi0JCQlyZXR1cm4gY29tcGlsZXJfZXJyb3IoYywgIidyZXR1cm4nIG91dHNpZGUgZnVuY3Rpb24iKTsKLQkJaWYgKHMtPnYuUmV0dXJuLnZhbHVlKSB7Ci0JCQlWSVNJVChjLCBleHByLCBzLT52LlJldHVybi52YWx1ZSk7Ci0JCX0KLQkJZWxzZQotCQkJQURET1BfTyhjLCBMT0FEX0NPTlNULCBQeV9Ob25lLCBjb25zdHMpOwotCQlBRERPUChjLCBSRVRVUk5fVkFMVUUpOwotCQlicmVhazsKLQljYXNlIERlbGV0ZV9raW5kOgotCQlWSVNJVF9TRVEoYywgZXhwciwgcy0+di5EZWxldGUudGFyZ2V0cykKLQkJYnJlYWs7Ci0JY2FzZSBBc3NpZ25fa2luZDoKLQkJbiA9IGFzZGxfc2VxX0xFTihzLT52LkFzc2lnbi50YXJnZXRzKTsKLQkJVklTSVQoYywgZXhwciwgcy0+di5Bc3NpZ24udmFsdWUpOwotCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCQlpZiAoaSA8IG4gLSAxKQotCQkJCUFERE9QKGMsIERVUF9UT1ApOwotCQkJVklTSVQoYywgZXhwciwKLQkJCSAgICAgIChleHByX3R5KWFzZGxfc2VxX0dFVChzLT52LkFzc2lnbi50YXJnZXRzLCBpKSk7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBBdWdBc3NpZ25fa2luZDoKLQkJcmV0dXJuIGNvbXBpbGVyX2F1Z2Fzc2lnbihjLCBzKTsKLQljYXNlIFByaW50X2tpbmQ6Ci0JCXJldHVybiBjb21waWxlcl9wcmludChjLCBzKTsKLQljYXNlIEZvcl9raW5kOgotCQlyZXR1cm4gY29tcGlsZXJfZm9yKGMsIHMpOwotCWNhc2UgV2hpbGVfa2luZDoKLQkJcmV0dXJuIGNvbXBpbGVyX3doaWxlKGMsIHMpOwotCWNhc2UgSWZfa2luZDoKLQkJcmV0dXJuIGNvbXBpbGVyX2lmKGMsIHMpOwotCWNhc2UgUmFpc2Vfa2luZDoKLQkJbiA9IDA7Ci0JCWlmIChzLT52LlJhaXNlLnR5cGUpIHsKLQkJCVZJU0lUKGMsIGV4cHIsIHMtPnYuUmFpc2UudHlwZSk7Ci0JCQluKys7Ci0JCQlpZiAocy0+di5SYWlzZS5pbnN0KSB7Ci0JCQkJVklTSVQoYywgZXhwciwgcy0+di5SYWlzZS5pbnN0KTsKLQkJCQluKys7Ci0JCQkJaWYgKHMtPnYuUmFpc2UudGJhY2spIHsKLQkJCQkJVklTSVQoYywgZXhwciwgcy0+di5SYWlzZS50YmFjayk7Ci0JCQkJCW4rKzsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJQURET1BfSShjLCBSQUlTRV9WQVJBUkdTLCBuKTsKLQkJYnJlYWs7Ci0JY2FzZSBUcnlFeGNlcHRfa2luZDoKLQkJcmV0dXJuIGNvbXBpbGVyX3RyeV9leGNlcHQoYywgcyk7Ci0JY2FzZSBUcnlGaW5hbGx5X2tpbmQ6Ci0JCXJldHVybiBjb21waWxlcl90cnlfZmluYWxseShjLCBzKTsKLQljYXNlIEFzc2VydF9raW5kOgotCQlyZXR1cm4gY29tcGlsZXJfYXNzZXJ0KGMsIHMpOwotCWNhc2UgSW1wb3J0X2tpbmQ6Ci0JCXJldHVybiBjb21waWxlcl9pbXBvcnQoYywgcyk7Ci0JY2FzZSBJbXBvcnRGcm9tX2tpbmQ6Ci0JCXJldHVybiBjb21waWxlcl9mcm9tX2ltcG9ydChjLCBzKTsKLQljYXNlIEV4ZWNfa2luZDoKLQkJVklTSVQoYywgZXhwciwgcy0+di5FeGVjLmJvZHkpOwotCQlpZiAocy0+di5FeGVjLmdsb2JhbHMpIHsKLQkJCVZJU0lUKGMsIGV4cHIsIHMtPnYuRXhlYy5nbG9iYWxzKTsKLQkJCWlmIChzLT52LkV4ZWMubG9jYWxzKSB7Ci0JCQkJVklTSVQoYywgZXhwciwgcy0+di5FeGVjLmxvY2Fscyk7Ci0JCQl9IGVsc2UgewotCQkJCUFERE9QKGMsIERVUF9UT1ApOwotCQkJfQotCQl9IGVsc2UgewotCQkJQURET1BfTyhjLCBMT0FEX0NPTlNULCBQeV9Ob25lLCBjb25zdHMpOwotCQkJQURET1AoYywgRFVQX1RPUCk7Ci0JCX0KLQkJQURET1AoYywgRVhFQ19TVE1UKTsKLQkJYnJlYWs7Ci0JY2FzZSBHbG9iYWxfa2luZDoKLQkJYnJlYWs7Ci0JY2FzZSBFeHByX2tpbmQ6Ci0JCWlmIChjLT5jX2ludGVyYWN0aXZlICYmIGMtPmNfbmVzdGxldmVsIDw9IDEpIHsKLQkJCVZJU0lUKGMsIGV4cHIsIHMtPnYuRXhwci52YWx1ZSk7Ci0JCQlBRERPUChjLCBQUklOVF9FWFBSKTsKLQkJfQotCQllbHNlIGlmIChzLT52LkV4cHIudmFsdWUtPmtpbmQgIT0gU3RyX2tpbmQgJiYKLQkJCSBzLT52LkV4cHIudmFsdWUtPmtpbmQgIT0gTnVtX2tpbmQpIHsKLQkJCVZJU0lUKGMsIGV4cHIsIHMtPnYuRXhwci52YWx1ZSk7Ci0JCQlBRERPUChjLCBQT1BfVE9QKTsKLQkJfQotCQlicmVhazsKLQljYXNlIFBhc3Nfa2luZDoKLQkJYnJlYWs7Ci0JY2FzZSBCcmVha19raW5kOgotCQlpZiAoIWNvbXBpbGVyX2luX2xvb3AoYykpCi0JCQlyZXR1cm4gY29tcGlsZXJfZXJyb3IoYywgIidicmVhaycgb3V0c2lkZSBsb29wIik7Ci0JCUFERE9QKGMsIEJSRUFLX0xPT1ApOwotCQlicmVhazsKLQljYXNlIENvbnRpbnVlX2tpbmQ6Ci0JCXJldHVybiBjb21waWxlcl9jb250aW51ZShjKTsKLQljYXNlIFdpdGhfa2luZDoKLQkJcmV0dXJuIGNvbXBpbGVyX3dpdGgoYywgcyk7Ci0JfQotCXJldHVybiAxOworICAgIHN3aXRjaCAocy0+a2luZCkgeworICAgIGNhc2UgRnVuY3Rpb25EZWZfa2luZDoKKyAgICAgICAgcmV0dXJuIGNvbXBpbGVyX2Z1bmN0aW9uKGMsIHMpOworICAgIGNhc2UgQ2xhc3NEZWZfa2luZDoKKyAgICAgICAgcmV0dXJuIGNvbXBpbGVyX2NsYXNzKGMsIHMpOworICAgIGNhc2UgUmV0dXJuX2tpbmQ6CisgICAgICAgIGlmIChjLT51LT51X3N0ZS0+c3RlX3R5cGUgIT0gRnVuY3Rpb25CbG9jaykKKyAgICAgICAgICAgIHJldHVybiBjb21waWxlcl9lcnJvcihjLCAiJ3JldHVybicgb3V0c2lkZSBmdW5jdGlvbiIpOworICAgICAgICBpZiAocy0+di5SZXR1cm4udmFsdWUpIHsKKyAgICAgICAgICAgIFZJU0lUKGMsIGV4cHIsIHMtPnYuUmV0dXJuLnZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBBRERPUF9PKGMsIExPQURfQ09OU1QsIFB5X05vbmUsIGNvbnN0cyk7CisgICAgICAgIEFERE9QKGMsIFJFVFVSTl9WQUxVRSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRGVsZXRlX2tpbmQ6CisgICAgICAgIFZJU0lUX1NFUShjLCBleHByLCBzLT52LkRlbGV0ZS50YXJnZXRzKQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEFzc2lnbl9raW5kOgorICAgICAgICBuID0gYXNkbF9zZXFfTEVOKHMtPnYuQXNzaWduLnRhcmdldHMpOworICAgICAgICBWSVNJVChjLCBleHByLCBzLT52LkFzc2lnbi52YWx1ZSk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChpIDwgbiAtIDEpCisgICAgICAgICAgICAgICAgQURET1AoYywgRFVQX1RPUCk7CisgICAgICAgICAgICBWSVNJVChjLCBleHByLAorICAgICAgICAgICAgICAgICAgKGV4cHJfdHkpYXNkbF9zZXFfR0VUKHMtPnYuQXNzaWduLnRhcmdldHMsIGkpKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEF1Z0Fzc2lnbl9raW5kOgorICAgICAgICByZXR1cm4gY29tcGlsZXJfYXVnYXNzaWduKGMsIHMpOworICAgIGNhc2UgUHJpbnRfa2luZDoKKyAgICAgICAgcmV0dXJuIGNvbXBpbGVyX3ByaW50KGMsIHMpOworICAgIGNhc2UgRm9yX2tpbmQ6CisgICAgICAgIHJldHVybiBjb21waWxlcl9mb3IoYywgcyk7CisgICAgY2FzZSBXaGlsZV9raW5kOgorICAgICAgICByZXR1cm4gY29tcGlsZXJfd2hpbGUoYywgcyk7CisgICAgY2FzZSBJZl9raW5kOgorICAgICAgICByZXR1cm4gY29tcGlsZXJfaWYoYywgcyk7CisgICAgY2FzZSBSYWlzZV9raW5kOgorICAgICAgICBuID0gMDsKKyAgICAgICAgaWYgKHMtPnYuUmFpc2UudHlwZSkgeworICAgICAgICAgICAgVklTSVQoYywgZXhwciwgcy0+di5SYWlzZS50eXBlKTsKKyAgICAgICAgICAgIG4rKzsKKyAgICAgICAgICAgIGlmIChzLT52LlJhaXNlLmluc3QpIHsKKyAgICAgICAgICAgICAgICBWSVNJVChjLCBleHByLCBzLT52LlJhaXNlLmluc3QpOworICAgICAgICAgICAgICAgIG4rKzsKKyAgICAgICAgICAgICAgICBpZiAocy0+di5SYWlzZS50YmFjaykgeworICAgICAgICAgICAgICAgICAgICBWSVNJVChjLCBleHByLCBzLT52LlJhaXNlLnRiYWNrKTsKKyAgICAgICAgICAgICAgICAgICAgbisrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBBRERPUF9JKGMsIFJBSVNFX1ZBUkFSR1MsIG4pOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFRyeUV4Y2VwdF9raW5kOgorICAgICAgICByZXR1cm4gY29tcGlsZXJfdHJ5X2V4Y2VwdChjLCBzKTsKKyAgICBjYXNlIFRyeUZpbmFsbHlfa2luZDoKKyAgICAgICAgcmV0dXJuIGNvbXBpbGVyX3RyeV9maW5hbGx5KGMsIHMpOworICAgIGNhc2UgQXNzZXJ0X2tpbmQ6CisgICAgICAgIHJldHVybiBjb21waWxlcl9hc3NlcnQoYywgcyk7CisgICAgY2FzZSBJbXBvcnRfa2luZDoKKyAgICAgICAgcmV0dXJuIGNvbXBpbGVyX2ltcG9ydChjLCBzKTsKKyAgICBjYXNlIEltcG9ydEZyb21fa2luZDoKKyAgICAgICAgcmV0dXJuIGNvbXBpbGVyX2Zyb21faW1wb3J0KGMsIHMpOworICAgIGNhc2UgRXhlY19raW5kOgorICAgICAgICBWSVNJVChjLCBleHByLCBzLT52LkV4ZWMuYm9keSk7CisgICAgICAgIGlmIChzLT52LkV4ZWMuZ2xvYmFscykgeworICAgICAgICAgICAgVklTSVQoYywgZXhwciwgcy0+di5FeGVjLmdsb2JhbHMpOworICAgICAgICAgICAgaWYgKHMtPnYuRXhlYy5sb2NhbHMpIHsKKyAgICAgICAgICAgICAgICBWSVNJVChjLCBleHByLCBzLT52LkV4ZWMubG9jYWxzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQURET1AoYywgRFVQX1RPUCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBRERPUF9PKGMsIExPQURfQ09OU1QsIFB5X05vbmUsIGNvbnN0cyk7CisgICAgICAgICAgICBBRERPUChjLCBEVVBfVE9QKTsKKyAgICAgICAgfQorICAgICAgICBBRERPUChjLCBFWEVDX1NUTVQpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEdsb2JhbF9raW5kOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIEV4cHJfa2luZDoKKyAgICAgICAgaWYgKGMtPmNfaW50ZXJhY3RpdmUgJiYgYy0+Y19uZXN0bGV2ZWwgPD0gMSkgeworICAgICAgICAgICAgVklTSVQoYywgZXhwciwgcy0+di5FeHByLnZhbHVlKTsKKyAgICAgICAgICAgIEFERE9QKGMsIFBSSU5UX0VYUFIpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHMtPnYuRXhwci52YWx1ZS0+a2luZCAhPSBTdHJfa2luZCAmJgorICAgICAgICAgICAgICAgICBzLT52LkV4cHIudmFsdWUtPmtpbmQgIT0gTnVtX2tpbmQpIHsKKyAgICAgICAgICAgIFZJU0lUKGMsIGV4cHIsIHMtPnYuRXhwci52YWx1ZSk7CisgICAgICAgICAgICBBRERPUChjLCBQT1BfVE9QKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFBhc3Nfa2luZDoKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBCcmVha19raW5kOgorICAgICAgICBpZiAoIWNvbXBpbGVyX2luX2xvb3AoYykpCisgICAgICAgICAgICByZXR1cm4gY29tcGlsZXJfZXJyb3IoYywgIidicmVhaycgb3V0c2lkZSBsb29wIik7CisgICAgICAgIEFERE9QKGMsIEJSRUFLX0xPT1ApOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENvbnRpbnVlX2tpbmQ6CisgICAgICAgIHJldHVybiBjb21waWxlcl9jb250aW51ZShjKTsKKyAgICBjYXNlIFdpdGhfa2luZDoKKyAgICAgICAgcmV0dXJuIGNvbXBpbGVyX3dpdGgoYywgcyk7CisgICAgfQorICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgaW50CiB1bmFyeW9wKHVuYXJ5b3BfdHkgb3ApCiB7Ci0Jc3dpdGNoIChvcCkgewotCWNhc2UgSW52ZXJ0OgotCQlyZXR1cm4gVU5BUllfSU5WRVJUOwotCWNhc2UgTm90OgotCQlyZXR1cm4gVU5BUllfTk9UOwotCWNhc2UgVUFkZDoKLQkJcmV0dXJuIFVOQVJZX1BPU0lUSVZFOwotCWNhc2UgVVN1YjoKLQkJcmV0dXJuIFVOQVJZX05FR0FUSVZFOwotCWRlZmF1bHQ6Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19TeXN0ZW1FcnJvciwKLQkJCSJ1bmFyeSBvcCAlZCBzaG91bGQgbm90IGJlIHBvc3NpYmxlIiwgb3ApOwotCQlyZXR1cm4gMDsKLQl9CisgICAgc3dpdGNoIChvcCkgeworICAgIGNhc2UgSW52ZXJ0OgorICAgICAgICByZXR1cm4gVU5BUllfSU5WRVJUOworICAgIGNhc2UgTm90OgorICAgICAgICByZXR1cm4gVU5BUllfTk9UOworICAgIGNhc2UgVUFkZDoKKyAgICAgICAgcmV0dXJuIFVOQVJZX1BPU0lUSVZFOworICAgIGNhc2UgVVN1YjoKKyAgICAgICAgcmV0dXJuIFVOQVJZX05FR0FUSVZFOworICAgIGRlZmF1bHQ6CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19TeXN0ZW1FcnJvciwKKyAgICAgICAgICAgICJ1bmFyeSBvcCAlZCBzaG91bGQgbm90IGJlIHBvc3NpYmxlIiwgb3ApOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiB9CiAKIHN0YXRpYyBpbnQKIGJpbm9wKHN0cnVjdCBjb21waWxlciAqYywgb3BlcmF0b3JfdHkgb3ApCiB7Ci0Jc3dpdGNoIChvcCkgewotCWNhc2UgQWRkOgotCQlyZXR1cm4gQklOQVJZX0FERDsKLQljYXNlIFN1YjoKLQkJcmV0dXJuIEJJTkFSWV9TVUJUUkFDVDsKLQljYXNlIE11bHQ6Ci0JCXJldHVybiBCSU5BUllfTVVMVElQTFk7Ci0JY2FzZSBEaXY6Ci0JCWlmIChjLT5jX2ZsYWdzICYmIGMtPmNfZmxhZ3MtPmNmX2ZsYWdzICYgQ09fRlVUVVJFX0RJVklTSU9OKQotCQkJcmV0dXJuIEJJTkFSWV9UUlVFX0RJVklERTsKLQkJZWxzZQotCQkJcmV0dXJuIEJJTkFSWV9ESVZJREU7Ci0JY2FzZSBNb2Q6Ci0JCXJldHVybiBCSU5BUllfTU9EVUxPOwotCWNhc2UgUG93OgotCQlyZXR1cm4gQklOQVJZX1BPV0VSOwotCWNhc2UgTFNoaWZ0OgotCQlyZXR1cm4gQklOQVJZX0xTSElGVDsKLQljYXNlIFJTaGlmdDoKLQkJcmV0dXJuIEJJTkFSWV9SU0hJRlQ7Ci0JY2FzZSBCaXRPcjoKLQkJcmV0dXJuIEJJTkFSWV9PUjsKLQljYXNlIEJpdFhvcjoKLQkJcmV0dXJuIEJJTkFSWV9YT1I7Ci0JY2FzZSBCaXRBbmQ6Ci0JCXJldHVybiBCSU5BUllfQU5EOwotCWNhc2UgRmxvb3JEaXY6Ci0JCXJldHVybiBCSU5BUllfRkxPT1JfRElWSURFOwotCWRlZmF1bHQ6Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19TeXN0ZW1FcnJvciwKLQkJCSJiaW5hcnkgb3AgJWQgc2hvdWxkIG5vdCBiZSBwb3NzaWJsZSIsIG9wKTsKLQkJcmV0dXJuIDA7Ci0JfQorICAgIHN3aXRjaCAob3ApIHsKKyAgICBjYXNlIEFkZDoKKyAgICAgICAgcmV0dXJuIEJJTkFSWV9BREQ7CisgICAgY2FzZSBTdWI6CisgICAgICAgIHJldHVybiBCSU5BUllfU1VCVFJBQ1Q7CisgICAgY2FzZSBNdWx0OgorICAgICAgICByZXR1cm4gQklOQVJZX01VTFRJUExZOworICAgIGNhc2UgRGl2OgorICAgICAgICBpZiAoYy0+Y19mbGFncyAmJiBjLT5jX2ZsYWdzLT5jZl9mbGFncyAmIENPX0ZVVFVSRV9ESVZJU0lPTikKKyAgICAgICAgICAgIHJldHVybiBCSU5BUllfVFJVRV9ESVZJREU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBCSU5BUllfRElWSURFOworICAgIGNhc2UgTW9kOgorICAgICAgICByZXR1cm4gQklOQVJZX01PRFVMTzsKKyAgICBjYXNlIFBvdzoKKyAgICAgICAgcmV0dXJuIEJJTkFSWV9QT1dFUjsKKyAgICBjYXNlIExTaGlmdDoKKyAgICAgICAgcmV0dXJuIEJJTkFSWV9MU0hJRlQ7CisgICAgY2FzZSBSU2hpZnQ6CisgICAgICAgIHJldHVybiBCSU5BUllfUlNISUZUOworICAgIGNhc2UgQml0T3I6CisgICAgICAgIHJldHVybiBCSU5BUllfT1I7CisgICAgY2FzZSBCaXRYb3I6CisgICAgICAgIHJldHVybiBCSU5BUllfWE9SOworICAgIGNhc2UgQml0QW5kOgorICAgICAgICByZXR1cm4gQklOQVJZX0FORDsKKyAgICBjYXNlIEZsb29yRGl2OgorICAgICAgICByZXR1cm4gQklOQVJZX0ZMT09SX0RJVklERTsKKyAgICBkZWZhdWx0OgorICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgICAiYmluYXJ5IG9wICVkIHNob3VsZCBub3QgYmUgcG9zc2libGUiLCBvcCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KIH0KIAogc3RhdGljIGludAogY21wb3AoY21wb3BfdHkgb3ApCiB7Ci0Jc3dpdGNoIChvcCkgewotCWNhc2UgRXE6Ci0JCXJldHVybiBQeUNtcF9FUTsKLQljYXNlIE5vdEVxOgotCQlyZXR1cm4gUHlDbXBfTkU7Ci0JY2FzZSBMdDoKLQkJcmV0dXJuIFB5Q21wX0xUOwotCWNhc2UgTHRFOgotCQlyZXR1cm4gUHlDbXBfTEU7Ci0JY2FzZSBHdDoKLQkJcmV0dXJuIFB5Q21wX0dUOwotCWNhc2UgR3RFOgotCQlyZXR1cm4gUHlDbXBfR0U7Ci0JY2FzZSBJczoKLQkJcmV0dXJuIFB5Q21wX0lTOwotCWNhc2UgSXNOb3Q6Ci0JCXJldHVybiBQeUNtcF9JU19OT1Q7Ci0JY2FzZSBJbjoKLQkJcmV0dXJuIFB5Q21wX0lOOwotCWNhc2UgTm90SW46Ci0JCXJldHVybiBQeUNtcF9OT1RfSU47Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIFB5Q21wX0JBRDsKLQl9CisgICAgc3dpdGNoIChvcCkgeworICAgIGNhc2UgRXE6CisgICAgICAgIHJldHVybiBQeUNtcF9FUTsKKyAgICBjYXNlIE5vdEVxOgorICAgICAgICByZXR1cm4gUHlDbXBfTkU7CisgICAgY2FzZSBMdDoKKyAgICAgICAgcmV0dXJuIFB5Q21wX0xUOworICAgIGNhc2UgTHRFOgorICAgICAgICByZXR1cm4gUHlDbXBfTEU7CisgICAgY2FzZSBHdDoKKyAgICAgICAgcmV0dXJuIFB5Q21wX0dUOworICAgIGNhc2UgR3RFOgorICAgICAgICByZXR1cm4gUHlDbXBfR0U7CisgICAgY2FzZSBJczoKKyAgICAgICAgcmV0dXJuIFB5Q21wX0lTOworICAgIGNhc2UgSXNOb3Q6CisgICAgICAgIHJldHVybiBQeUNtcF9JU19OT1Q7CisgICAgY2FzZSBJbjoKKyAgICAgICAgcmV0dXJuIFB5Q21wX0lOOworICAgIGNhc2UgTm90SW46CisgICAgICAgIHJldHVybiBQeUNtcF9OT1RfSU47CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIFB5Q21wX0JBRDsKKyAgICB9CiB9CiAKIHN0YXRpYyBpbnQKIGlucGxhY2VfYmlub3Aoc3RydWN0IGNvbXBpbGVyICpjLCBvcGVyYXRvcl90eSBvcCkKIHsKLQlzd2l0Y2ggKG9wKSB7Ci0JY2FzZSBBZGQ6Ci0JCXJldHVybiBJTlBMQUNFX0FERDsKLQljYXNlIFN1YjoKLQkJcmV0dXJuIElOUExBQ0VfU1VCVFJBQ1Q7Ci0JY2FzZSBNdWx0OgotCQlyZXR1cm4gSU5QTEFDRV9NVUxUSVBMWTsKLQljYXNlIERpdjoKLQkJaWYgKGMtPmNfZmxhZ3MgJiYgYy0+Y19mbGFncy0+Y2ZfZmxhZ3MgJiBDT19GVVRVUkVfRElWSVNJT04pCi0JCQlyZXR1cm4gSU5QTEFDRV9UUlVFX0RJVklERTsKLQkJZWxzZQotCQkJcmV0dXJuIElOUExBQ0VfRElWSURFOwotCWNhc2UgTW9kOgotCQlyZXR1cm4gSU5QTEFDRV9NT0RVTE87Ci0JY2FzZSBQb3c6Ci0JCXJldHVybiBJTlBMQUNFX1BPV0VSOwotCWNhc2UgTFNoaWZ0OgotCQlyZXR1cm4gSU5QTEFDRV9MU0hJRlQ7Ci0JY2FzZSBSU2hpZnQ6Ci0JCXJldHVybiBJTlBMQUNFX1JTSElGVDsKLQljYXNlIEJpdE9yOgotCQlyZXR1cm4gSU5QTEFDRV9PUjsKLQljYXNlIEJpdFhvcjoKLQkJcmV0dXJuIElOUExBQ0VfWE9SOwotCWNhc2UgQml0QW5kOgotCQlyZXR1cm4gSU5QTEFDRV9BTkQ7Ci0JY2FzZSBGbG9vckRpdjoKLQkJcmV0dXJuIElOUExBQ0VfRkxPT1JfRElWSURFOwotCWRlZmF1bHQ6Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19TeXN0ZW1FcnJvciwKLQkJCSJpbnBsYWNlIGJpbmFyeSBvcCAlZCBzaG91bGQgbm90IGJlIHBvc3NpYmxlIiwgb3ApOwotCQlyZXR1cm4gMDsKLQl9CisgICAgc3dpdGNoIChvcCkgeworICAgIGNhc2UgQWRkOgorICAgICAgICByZXR1cm4gSU5QTEFDRV9BREQ7CisgICAgY2FzZSBTdWI6CisgICAgICAgIHJldHVybiBJTlBMQUNFX1NVQlRSQUNUOworICAgIGNhc2UgTXVsdDoKKyAgICAgICAgcmV0dXJuIElOUExBQ0VfTVVMVElQTFk7CisgICAgY2FzZSBEaXY6CisgICAgICAgIGlmIChjLT5jX2ZsYWdzICYmIGMtPmNfZmxhZ3MtPmNmX2ZsYWdzICYgQ09fRlVUVVJFX0RJVklTSU9OKQorICAgICAgICAgICAgcmV0dXJuIElOUExBQ0VfVFJVRV9ESVZJREU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBJTlBMQUNFX0RJVklERTsKKyAgICBjYXNlIE1vZDoKKyAgICAgICAgcmV0dXJuIElOUExBQ0VfTU9EVUxPOworICAgIGNhc2UgUG93OgorICAgICAgICByZXR1cm4gSU5QTEFDRV9QT1dFUjsKKyAgICBjYXNlIExTaGlmdDoKKyAgICAgICAgcmV0dXJuIElOUExBQ0VfTFNISUZUOworICAgIGNhc2UgUlNoaWZ0OgorICAgICAgICByZXR1cm4gSU5QTEFDRV9SU0hJRlQ7CisgICAgY2FzZSBCaXRPcjoKKyAgICAgICAgcmV0dXJuIElOUExBQ0VfT1I7CisgICAgY2FzZSBCaXRYb3I6CisgICAgICAgIHJldHVybiBJTlBMQUNFX1hPUjsKKyAgICBjYXNlIEJpdEFuZDoKKyAgICAgICAgcmV0dXJuIElOUExBQ0VfQU5EOworICAgIGNhc2UgRmxvb3JEaXY6CisgICAgICAgIHJldHVybiBJTlBMQUNFX0ZMT09SX0RJVklERTsKKyAgICBkZWZhdWx0OgorICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgICAiaW5wbGFjZSBiaW5hcnkgb3AgJWQgc2hvdWxkIG5vdCBiZSBwb3NzaWJsZSIsIG9wKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogfQogCiBzdGF0aWMgaW50CiBjb21waWxlcl9uYW1lb3Aoc3RydWN0IGNvbXBpbGVyICpjLCBpZGVudGlmaWVyIG5hbWUsIGV4cHJfY29udGV4dF90eSBjdHgpCiB7Ci0JaW50IG9wLCBzY29wZSwgYXJnOwotCWVudW0geyBPUF9GQVNULCBPUF9HTE9CQUwsIE9QX0RFUkVGLCBPUF9OQU1FIH0gb3B0eXBlOworICAgIGludCBvcCwgc2NvcGUsIGFyZzsKKyAgICBlbnVtIHsgT1BfRkFTVCwgT1BfR0xPQkFMLCBPUF9ERVJFRiwgT1BfTkFNRSB9IG9wdHlwZTsKIAotCVB5T2JqZWN0ICpkaWN0ID0gYy0+dS0+dV9uYW1lczsKLQlQeU9iamVjdCAqbWFuZ2xlZDsKLQkvKiBYWFggQXVnU3RvcmUgaXNuJ3QgdXNlZCBhbnl3aGVyZSEgKi8KKyAgICBQeU9iamVjdCAqZGljdCA9IGMtPnUtPnVfbmFtZXM7CisgICAgUHlPYmplY3QgKm1hbmdsZWQ7CisgICAgLyogWFhYIEF1Z1N0b3JlIGlzbid0IHVzZWQgYW55d2hlcmUhICovCiAKLQkvKiBGaXJzdCBjaGVjayBmb3IgYXNzaWdubWVudCB0byBfX2RlYnVnX18uIFBhcmFtPyAqLwotCWlmICgoY3R4ID09IFN0b3JlIHx8IGN0eCA9PSBBdWdTdG9yZSB8fCBjdHggPT0gRGVsKQotCSAgICAmJiAhc3RyY21wKFB5U3RyaW5nX0FTX1NUUklORyhuYW1lKSwgIl9fZGVidWdfXyIpKSB7Ci0JCXJldHVybiBjb21waWxlcl9lcnJvcihjLCAiY2FuIG5vdCBhc3NpZ24gdG8gX19kZWJ1Z19fIik7Ci0JfQorICAgIC8qIEZpcnN0IGNoZWNrIGZvciBhc3NpZ25tZW50IHRvIF9fZGVidWdfXy4gUGFyYW0/ICovCisgICAgaWYgKChjdHggPT0gU3RvcmUgfHwgY3R4ID09IEF1Z1N0b3JlIHx8IGN0eCA9PSBEZWwpCisgICAgICAgICYmICFzdHJjbXAoUHlTdHJpbmdfQVNfU1RSSU5HKG5hbWUpLCAiX19kZWJ1Z19fIikpIHsKKyAgICAgICAgcmV0dXJuIGNvbXBpbGVyX2Vycm9yKGMsICJjYW4gbm90IGFzc2lnbiB0byBfX2RlYnVnX18iKTsKKyAgICB9CiAKLQltYW5nbGVkID0gX1B5X01hbmdsZShjLT51LT51X3ByaXZhdGUsIG5hbWUpOwotCWlmICghbWFuZ2xlZCkKLQkJcmV0dXJuIDA7CisgICAgbWFuZ2xlZCA9IF9QeV9NYW5nbGUoYy0+dS0+dV9wcml2YXRlLCBuYW1lKTsKKyAgICBpZiAoIW1hbmdsZWQpCisgICAgICAgIHJldHVybiAwOwogCi0Jb3AgPSAwOwotCW9wdHlwZSA9IE9QX05BTUU7Ci0Jc2NvcGUgPSBQeVNUX0dldFNjb3BlKGMtPnUtPnVfc3RlLCBtYW5nbGVkKTsKLQlzd2l0Y2ggKHNjb3BlKSB7Ci0JY2FzZSBGUkVFOgotCQlkaWN0ID0gYy0+dS0+dV9mcmVldmFyczsKLQkJb3B0eXBlID0gT1BfREVSRUY7Ci0JCWJyZWFrOwotCWNhc2UgQ0VMTDoKLQkJZGljdCA9IGMtPnUtPnVfY2VsbHZhcnM7Ci0JCW9wdHlwZSA9IE9QX0RFUkVGOwotCQlicmVhazsKLQljYXNlIExPQ0FMOgotCQlpZiAoYy0+dS0+dV9zdGUtPnN0ZV90eXBlID09IEZ1bmN0aW9uQmxvY2spCi0JCQlvcHR5cGUgPSBPUF9GQVNUOwotCQlicmVhazsKLQljYXNlIEdMT0JBTF9JTVBMSUNJVDoKLQkJaWYgKGMtPnUtPnVfc3RlLT5zdGVfdHlwZSA9PSBGdW5jdGlvbkJsb2NrICYmCi0JCQkhYy0+dS0+dV9zdGUtPnN0ZV91bm9wdGltaXplZCkKLQkJCW9wdHlwZSA9IE9QX0dMT0JBTDsKLQkJYnJlYWs7Ci0JY2FzZSBHTE9CQUxfRVhQTElDSVQ6Ci0JCW9wdHlwZSA9IE9QX0dMT0JBTDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJLyogc2NvcGUgY2FuIGJlIDAgKi8KLQkJYnJlYWs7Ci0JfQorICAgIG9wID0gMDsKKyAgICBvcHR5cGUgPSBPUF9OQU1FOworICAgIHNjb3BlID0gUHlTVF9HZXRTY29wZShjLT51LT51X3N0ZSwgbWFuZ2xlZCk7CisgICAgc3dpdGNoIChzY29wZSkgeworICAgIGNhc2UgRlJFRToKKyAgICAgICAgZGljdCA9IGMtPnUtPnVfZnJlZXZhcnM7CisgICAgICAgIG9wdHlwZSA9IE9QX0RFUkVGOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENFTEw6CisgICAgICAgIGRpY3QgPSBjLT51LT51X2NlbGx2YXJzOworICAgICAgICBvcHR5cGUgPSBPUF9ERVJFRjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBMT0NBTDoKKyAgICAgICAgaWYgKGMtPnUtPnVfc3RlLT5zdGVfdHlwZSA9PSBGdW5jdGlvbkJsb2NrKQorICAgICAgICAgICAgb3B0eXBlID0gT1BfRkFTVDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBHTE9CQUxfSU1QTElDSVQ6CisgICAgICAgIGlmIChjLT51LT51X3N0ZS0+c3RlX3R5cGUgPT0gRnVuY3Rpb25CbG9jayAmJgorICAgICAgICAgICAgIWMtPnUtPnVfc3RlLT5zdGVfdW5vcHRpbWl6ZWQpCisgICAgICAgICAgICBvcHR5cGUgPSBPUF9HTE9CQUw7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgR0xPQkFMX0VYUExJQ0lUOgorICAgICAgICBvcHR5cGUgPSBPUF9HTE9CQUw7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIC8qIHNjb3BlIGNhbiBiZSAwICovCisgICAgICAgIGJyZWFrOworICAgIH0KIAotCS8qIFhYWCBMZWF2ZSBhc3NlcnQgaGVyZSwgYnV0IGhhbmRsZSBfX2RvY19fIGFuZCB0aGUgbGlrZSBiZXR0ZXIgKi8KLQlhc3NlcnQoc2NvcGUgfHwgUHlTdHJpbmdfQVNfU1RSSU5HKG5hbWUpWzBdID09ICdfJyk7CisgICAgLyogWFhYIExlYXZlIGFzc2VydCBoZXJlLCBidXQgaGFuZGxlIF9fZG9jX18gYW5kIHRoZSBsaWtlIGJldHRlciAqLworICAgIGFzc2VydChzY29wZSB8fCBQeVN0cmluZ19BU19TVFJJTkcobmFtZSlbMF0gPT0gJ18nKTsKIAotCXN3aXRjaCAob3B0eXBlKSB7Ci0JY2FzZSBPUF9ERVJFRjoKLQkJc3dpdGNoIChjdHgpIHsKLQkJY2FzZSBMb2FkOiBvcCA9IExPQURfREVSRUY7IGJyZWFrOwotCQljYXNlIFN0b3JlOiBvcCA9IFNUT1JFX0RFUkVGOyBicmVhazsKLQkJY2FzZSBBdWdMb2FkOgotCQljYXNlIEF1Z1N0b3JlOgotCQkJYnJlYWs7Ci0JCWNhc2UgRGVsOgotCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1N5bnRheEVycm9yLAotCQkJCSAgICAgImNhbiBub3QgZGVsZXRlIHZhcmlhYmxlICclcycgcmVmZXJlbmNlZCAiCi0JCQkJICAgICAiaW4gbmVzdGVkIHNjb3BlIiwKLQkJCQkgICAgIFB5U3RyaW5nX0FTX1NUUklORyhuYW1lKSk7Ci0JCQlQeV9ERUNSRUYobWFuZ2xlZCk7Ci0JCQlyZXR1cm4gMDsKLQkJY2FzZSBQYXJhbToKLQkJZGVmYXVsdDoKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKLQkJCQkJInBhcmFtIGludmFsaWQgZm9yIGRlcmVmIHZhcmlhYmxlIik7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlicmVhazsKLQljYXNlIE9QX0ZBU1Q6Ci0JCXN3aXRjaCAoY3R4KSB7Ci0JCWNhc2UgTG9hZDogb3AgPSBMT0FEX0ZBU1Q7IGJyZWFrOwotCQljYXNlIFN0b3JlOiBvcCA9IFNUT1JFX0ZBU1Q7IGJyZWFrOwotCQljYXNlIERlbDogb3AgPSBERUxFVEVfRkFTVDsgYnJlYWs7Ci0JCWNhc2UgQXVnTG9hZDoKLQkJY2FzZSBBdWdTdG9yZToKLQkJCWJyZWFrOwotCQljYXNlIFBhcmFtOgotCQlkZWZhdWx0OgotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAotCQkJCQkicGFyYW0gaW52YWxpZCBmb3IgbG9jYWwgdmFyaWFibGUiKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JCUFERE9QX08oYywgb3AsIG1hbmdsZWQsIHZhcm5hbWVzKTsKLQkJUHlfREVDUkVGKG1hbmdsZWQpOwotCQlyZXR1cm4gMTsKLQljYXNlIE9QX0dMT0JBTDoKLQkJc3dpdGNoIChjdHgpIHsKLQkJY2FzZSBMb2FkOiBvcCA9IExPQURfR0xPQkFMOyBicmVhazsKLQkJY2FzZSBTdG9yZTogb3AgPSBTVE9SRV9HTE9CQUw7IGJyZWFrOwotCQljYXNlIERlbDogb3AgPSBERUxFVEVfR0xPQkFMOyBicmVhazsKLQkJY2FzZSBBdWdMb2FkOgotCQljYXNlIEF1Z1N0b3JlOgotCQkJYnJlYWs7Ci0JCWNhc2UgUGFyYW06Ci0JCWRlZmF1bHQ6Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCi0JCQkJCSJwYXJhbSBpbnZhbGlkIGZvciBnbG9iYWwgdmFyaWFibGUiKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgT1BfTkFNRToKLQkJc3dpdGNoIChjdHgpIHsKLQkJY2FzZSBMb2FkOiBvcCA9IExPQURfTkFNRTsgYnJlYWs7Ci0JCWNhc2UgU3RvcmU6IG9wID0gU1RPUkVfTkFNRTsgYnJlYWs7Ci0JCWNhc2UgRGVsOiBvcCA9IERFTEVURV9OQU1FOyBicmVhazsKLQkJY2FzZSBBdWdMb2FkOgotCQljYXNlIEF1Z1N0b3JlOgotCQkJYnJlYWs7Ci0JCWNhc2UgUGFyYW06Ci0JCWRlZmF1bHQ6Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCi0JCQkJCSJwYXJhbSBpbnZhbGlkIGZvciBuYW1lIHZhcmlhYmxlIik7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlicmVhazsKLQl9CisgICAgc3dpdGNoIChvcHR5cGUpIHsKKyAgICBjYXNlIE9QX0RFUkVGOgorICAgICAgICBzd2l0Y2ggKGN0eCkgeworICAgICAgICBjYXNlIExvYWQ6IG9wID0gTE9BRF9ERVJFRjsgYnJlYWs7CisgICAgICAgIGNhc2UgU3RvcmU6IG9wID0gU1RPUkVfREVSRUY7IGJyZWFrOworICAgICAgICBjYXNlIEF1Z0xvYWQ6CisgICAgICAgIGNhc2UgQXVnU3RvcmU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBEZWw6CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfU3ludGF4RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgImNhbiBub3QgZGVsZXRlIHZhcmlhYmxlICclcycgcmVmZXJlbmNlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgImluIG5lc3RlZCBzY29wZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKG5hbWUpKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihtYW5nbGVkKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBjYXNlIFBhcmFtOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXJhbSBpbnZhbGlkIGZvciBkZXJlZiB2YXJpYWJsZSIpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPUF9GQVNUOgorICAgICAgICBzd2l0Y2ggKGN0eCkgeworICAgICAgICBjYXNlIExvYWQ6IG9wID0gTE9BRF9GQVNUOyBicmVhazsKKyAgICAgICAgY2FzZSBTdG9yZTogb3AgPSBTVE9SRV9GQVNUOyBicmVhazsKKyAgICAgICAgY2FzZSBEZWw6IG9wID0gREVMRVRFX0ZBU1Q7IGJyZWFrOworICAgICAgICBjYXNlIEF1Z0xvYWQ6CisgICAgICAgIGNhc2UgQXVnU3RvcmU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQYXJhbToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFyYW0gaW52YWxpZCBmb3IgbG9jYWwgdmFyaWFibGUiKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIEFERE9QX08oYywgb3AsIG1hbmdsZWQsIHZhcm5hbWVzKTsKKyAgICAgICAgUHlfREVDUkVGKG1hbmdsZWQpOworICAgICAgICByZXR1cm4gMTsKKyAgICBjYXNlIE9QX0dMT0JBTDoKKyAgICAgICAgc3dpdGNoIChjdHgpIHsKKyAgICAgICAgY2FzZSBMb2FkOiBvcCA9IExPQURfR0xPQkFMOyBicmVhazsKKyAgICAgICAgY2FzZSBTdG9yZTogb3AgPSBTVE9SRV9HTE9CQUw7IGJyZWFrOworICAgICAgICBjYXNlIERlbDogb3AgPSBERUxFVEVfR0xPQkFMOyBicmVhazsKKyAgICAgICAgY2FzZSBBdWdMb2FkOgorICAgICAgICBjYXNlIEF1Z1N0b3JlOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUGFyYW06CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcmFtIGludmFsaWQgZm9yIGdsb2JhbCB2YXJpYWJsZSIpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPUF9OQU1FOgorICAgICAgICBzd2l0Y2ggKGN0eCkgeworICAgICAgICBjYXNlIExvYWQ6IG9wID0gTE9BRF9OQU1FOyBicmVhazsKKyAgICAgICAgY2FzZSBTdG9yZTogb3AgPSBTVE9SRV9OQU1FOyBicmVhazsKKyAgICAgICAgY2FzZSBEZWw6IG9wID0gREVMRVRFX05BTUU7IGJyZWFrOworICAgICAgICBjYXNlIEF1Z0xvYWQ6CisgICAgICAgIGNhc2UgQXVnU3RvcmU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQYXJhbToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFyYW0gaW52YWxpZCBmb3IgbmFtZSB2YXJpYWJsZSIpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQogCi0JYXNzZXJ0KG9wKTsKLQlhcmcgPSBjb21waWxlcl9hZGRfbyhjLCBkaWN0LCBtYW5nbGVkKTsKLQlQeV9ERUNSRUYobWFuZ2xlZCk7Ci0JaWYgKGFyZyA8IDApCi0JCXJldHVybiAwOwotCXJldHVybiBjb21waWxlcl9hZGRvcF9pKGMsIG9wLCBhcmcpOworICAgIGFzc2VydChvcCk7CisgICAgYXJnID0gY29tcGlsZXJfYWRkX28oYywgZGljdCwgbWFuZ2xlZCk7CisgICAgUHlfREVDUkVGKG1hbmdsZWQpOworICAgIGlmIChhcmcgPCAwKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gY29tcGlsZXJfYWRkb3BfaShjLCBvcCwgYXJnKTsKIH0KIAogc3RhdGljIGludAogY29tcGlsZXJfYm9vbG9wKHN0cnVjdCBjb21waWxlciAqYywgZXhwcl90eSBlKQogewotCWJhc2ljYmxvY2sgKmVuZDsKLQlpbnQganVtcGksIGksIG47Ci0JYXNkbF9zZXEgKnM7CisgICAgYmFzaWNibG9jayAqZW5kOworICAgIGludCBqdW1waSwgaSwgbjsKKyAgICBhc2RsX3NlcSAqczsKIAotCWFzc2VydChlLT5raW5kID09IEJvb2xPcF9raW5kKTsKLQlpZiAoZS0+di5Cb29sT3Aub3AgPT0gQW5kKQotCQlqdW1waSA9IEpVTVBfSUZfRkFMU0U7Ci0JZWxzZQotCQlqdW1waSA9IEpVTVBfSUZfVFJVRTsKLQllbmQgPSBjb21waWxlcl9uZXdfYmxvY2soYyk7Ci0JaWYgKGVuZCA9PSBOVUxMKQotCQlyZXR1cm4gMDsKLQlzID0gZS0+di5Cb29sT3AudmFsdWVzOwotCW4gPSBhc2RsX3NlcV9MRU4ocykgLSAxOwotCWFzc2VydChuID49IDApOwotCWZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKLQkJVklTSVQoYywgZXhwciwgKGV4cHJfdHkpYXNkbF9zZXFfR0VUKHMsIGkpKTsKLQkJQURET1BfSlJFTChjLCBqdW1waSwgZW5kKTsKLQkJQURET1AoYywgUE9QX1RPUCkKLQl9Ci0JVklTSVQoYywgZXhwciwgKGV4cHJfdHkpYXNkbF9zZXFfR0VUKHMsIG4pKTsKLQljb21waWxlcl91c2VfbmV4dF9ibG9jayhjLCBlbmQpOwotCXJldHVybiAxOworICAgIGFzc2VydChlLT5raW5kID09IEJvb2xPcF9raW5kKTsKKyAgICBpZiAoZS0+di5Cb29sT3Aub3AgPT0gQW5kKQorICAgICAgICBqdW1waSA9IEpVTVBfSUZfRkFMU0U7CisgICAgZWxzZQorICAgICAgICBqdW1waSA9IEpVTVBfSUZfVFJVRTsKKyAgICBlbmQgPSBjb21waWxlcl9uZXdfYmxvY2soYyk7CisgICAgaWYgKGVuZCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gMDsKKyAgICBzID0gZS0+di5Cb29sT3AudmFsdWVzOworICAgIG4gPSBhc2RsX3NlcV9MRU4ocykgLSAxOworICAgIGFzc2VydChuID49IDApOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKKyAgICAgICAgVklTSVQoYywgZXhwciwgKGV4cHJfdHkpYXNkbF9zZXFfR0VUKHMsIGkpKTsKKyAgICAgICAgQURET1BfSlJFTChjLCBqdW1waSwgZW5kKTsKKyAgICAgICAgQURET1AoYywgUE9QX1RPUCkKKyAgICB9CisgICAgVklTSVQoYywgZXhwciwgKGV4cHJfdHkpYXNkbF9zZXFfR0VUKHMsIG4pKTsKKyAgICBjb21waWxlcl91c2VfbmV4dF9ibG9jayhjLCBlbmQpOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgaW50CiBjb21waWxlcl9saXN0KHN0cnVjdCBjb21waWxlciAqYywgZXhwcl90eSBlKQogewotCWludCBuID0gYXNkbF9zZXFfTEVOKGUtPnYuTGlzdC5lbHRzKTsKLQlpZiAoZS0+di5MaXN0LmN0eCA9PSBTdG9yZSkgewotCQlBRERPUF9JKGMsIFVOUEFDS19TRVFVRU5DRSwgbik7Ci0JfQotCVZJU0lUX1NFUShjLCBleHByLCBlLT52Lkxpc3QuZWx0cyk7Ci0JaWYgKGUtPnYuTGlzdC5jdHggPT0gTG9hZCkgewotCQlBRERPUF9JKGMsIEJVSUxEX0xJU1QsIG4pOwotCX0KLQlyZXR1cm4gMTsKKyAgICBpbnQgbiA9IGFzZGxfc2VxX0xFTihlLT52Lkxpc3QuZWx0cyk7CisgICAgaWYgKGUtPnYuTGlzdC5jdHggPT0gU3RvcmUpIHsKKyAgICAgICAgQURET1BfSShjLCBVTlBBQ0tfU0VRVUVOQ0UsIG4pOworICAgIH0KKyAgICBWSVNJVF9TRVEoYywgZXhwciwgZS0+di5MaXN0LmVsdHMpOworICAgIGlmIChlLT52Lkxpc3QuY3R4ID09IExvYWQpIHsKKyAgICAgICAgQURET1BfSShjLCBCVUlMRF9MSVNULCBuKTsKKyAgICB9CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyBpbnQKIGNvbXBpbGVyX3R1cGxlKHN0cnVjdCBjb21waWxlciAqYywgZXhwcl90eSBlKQogewotCWludCBuID0gYXNkbF9zZXFfTEVOKGUtPnYuVHVwbGUuZWx0cyk7Ci0JaWYgKGUtPnYuVHVwbGUuY3R4ID09IFN0b3JlKSB7Ci0JCUFERE9QX0koYywgVU5QQUNLX1NFUVVFTkNFLCBuKTsKLQl9Ci0JVklTSVRfU0VRKGMsIGV4cHIsIGUtPnYuVHVwbGUuZWx0cyk7Ci0JaWYgKGUtPnYuVHVwbGUuY3R4ID09IExvYWQpIHsKLQkJQURET1BfSShjLCBCVUlMRF9UVVBMRSwgbik7Ci0JfQotCXJldHVybiAxOworICAgIGludCBuID0gYXNkbF9zZXFfTEVOKGUtPnYuVHVwbGUuZWx0cyk7CisgICAgaWYgKGUtPnYuVHVwbGUuY3R4ID09IFN0b3JlKSB7CisgICAgICAgIEFERE9QX0koYywgVU5QQUNLX1NFUVVFTkNFLCBuKTsKKyAgICB9CisgICAgVklTSVRfU0VRKGMsIGV4cHIsIGUtPnYuVHVwbGUuZWx0cyk7CisgICAgaWYgKGUtPnYuVHVwbGUuY3R4ID09IExvYWQpIHsKKyAgICAgICAgQURET1BfSShjLCBCVUlMRF9UVVBMRSwgbik7CisgICAgfQorICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgaW50CiBjb21waWxlcl9jb21wYXJlKHN0cnVjdCBjb21waWxlciAqYywgZXhwcl90eSBlKQogewotCWludCBpLCBuOwotCWJhc2ljYmxvY2sgKmNsZWFudXAgPSBOVUxMOworICAgIGludCBpLCBuOworICAgIGJhc2ljYmxvY2sgKmNsZWFudXAgPSBOVUxMOwogCi0JLyogWFhYIHRoZSBsb2dpYyBjYW4gYmUgY2xlYW5lZCB1cCBmb3IgMSBvciBtdWx0aXBsZSBjb21wYXJpc29ucyAqLwotCVZJU0lUKGMsIGV4cHIsIGUtPnYuQ29tcGFyZS5sZWZ0KTsKLQluID0gYXNkbF9zZXFfTEVOKGUtPnYuQ29tcGFyZS5vcHMpOwotCWFzc2VydChuID4gMCk7Ci0JaWYgKG4gPiAxKSB7Ci0JCWNsZWFudXAgPSBjb21waWxlcl9uZXdfYmxvY2soYyk7Ci0JCWlmIChjbGVhbnVwID09IE5VTEwpCi0JCSAgICByZXR1cm4gMDsKLQkJVklTSVQoYywgZXhwciwgCi0JCQkoZXhwcl90eSlhc2RsX3NlcV9HRVQoZS0+di5Db21wYXJlLmNvbXBhcmF0b3JzLCAwKSk7Ci0JfQotCWZvciAoaSA9IDE7IGkgPCBuOyBpKyspIHsKLQkJQURET1AoYywgRFVQX1RPUCk7Ci0JCUFERE9QKGMsIFJPVF9USFJFRSk7Ci0JCUFERE9QX0koYywgQ09NUEFSRV9PUCwKLQkJCWNtcG9wKChjbXBvcF90eSkoYXNkbF9zZXFfR0VUKAotCQkJCQkJICBlLT52LkNvbXBhcmUub3BzLCBpIC0gMSkpKSk7Ci0JCUFERE9QX0pSRUwoYywgSlVNUF9JRl9GQUxTRSwgY2xlYW51cCk7Ci0JCU5FWFRfQkxPQ0soYyk7Ci0JCUFERE9QKGMsIFBPUF9UT1ApOwotCQlpZiAoaSA8IChuIC0gMSkpCi0JCSAgICBWSVNJVChjLCBleHByLCAKLQkJCSAgICAoZXhwcl90eSlhc2RsX3NlcV9HRVQoZS0+di5Db21wYXJlLmNvbXBhcmF0b3JzLCBpKSk7Ci0JfQotCVZJU0lUKGMsIGV4cHIsIChleHByX3R5KWFzZGxfc2VxX0dFVChlLT52LkNvbXBhcmUuY29tcGFyYXRvcnMsIG4gLSAxKSk7Ci0JQURET1BfSShjLCBDT01QQVJFX09QLAotCSAgICAgICBjbXBvcCgoY21wb3BfdHkpKGFzZGxfc2VxX0dFVChlLT52LkNvbXBhcmUub3BzLCBuIC0gMSkpKSk7Ci0JaWYgKG4gPiAxKSB7Ci0JCWJhc2ljYmxvY2sgKmVuZCA9IGNvbXBpbGVyX25ld19ibG9jayhjKTsKLQkJaWYgKGVuZCA9PSBOVUxMKQotCQkgICAgcmV0dXJuIDA7Ci0JCUFERE9QX0pSRUwoYywgSlVNUF9GT1JXQVJELCBlbmQpOwotCQljb21waWxlcl91c2VfbmV4dF9ibG9jayhjLCBjbGVhbnVwKTsKLQkJQURET1AoYywgUk9UX1RXTyk7Ci0JCUFERE9QKGMsIFBPUF9UT1ApOwotCQljb21waWxlcl91c2VfbmV4dF9ibG9jayhjLCBlbmQpOwotCX0KLQlyZXR1cm4gMTsKKyAgICAvKiBYWFggdGhlIGxvZ2ljIGNhbiBiZSBjbGVhbmVkIHVwIGZvciAxIG9yIG11bHRpcGxlIGNvbXBhcmlzb25zICovCisgICAgVklTSVQoYywgZXhwciwgZS0+di5Db21wYXJlLmxlZnQpOworICAgIG4gPSBhc2RsX3NlcV9MRU4oZS0+di5Db21wYXJlLm9wcyk7CisgICAgYXNzZXJ0KG4gPiAwKTsKKyAgICBpZiAobiA+IDEpIHsKKyAgICAgICAgY2xlYW51cCA9IGNvbXBpbGVyX25ld19ibG9jayhjKTsKKyAgICAgICAgaWYgKGNsZWFudXAgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBWSVNJVChjLCBleHByLAorICAgICAgICAgICAgKGV4cHJfdHkpYXNkbF9zZXFfR0VUKGUtPnYuQ29tcGFyZS5jb21wYXJhdG9ycywgMCkpOworICAgIH0KKyAgICBmb3IgKGkgPSAxOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIEFERE9QKGMsIERVUF9UT1ApOworICAgICAgICBBRERPUChjLCBST1RfVEhSRUUpOworICAgICAgICBBRERPUF9JKGMsIENPTVBBUkVfT1AsCisgICAgICAgICAgICBjbXBvcCgoY21wb3BfdHkpKGFzZGxfc2VxX0dFVCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS0+di5Db21wYXJlLm9wcywgaSAtIDEpKSkpOworICAgICAgICBBRERPUF9KUkVMKGMsIEpVTVBfSUZfRkFMU0UsIGNsZWFudXApOworICAgICAgICBORVhUX0JMT0NLKGMpOworICAgICAgICBBRERPUChjLCBQT1BfVE9QKTsKKyAgICAgICAgaWYgKGkgPCAobiAtIDEpKQorICAgICAgICAgICAgVklTSVQoYywgZXhwciwKKyAgICAgICAgICAgICAgICAoZXhwcl90eSlhc2RsX3NlcV9HRVQoZS0+di5Db21wYXJlLmNvbXBhcmF0b3JzLCBpKSk7CisgICAgfQorICAgIFZJU0lUKGMsIGV4cHIsIChleHByX3R5KWFzZGxfc2VxX0dFVChlLT52LkNvbXBhcmUuY29tcGFyYXRvcnMsIG4gLSAxKSk7CisgICAgQURET1BfSShjLCBDT01QQVJFX09QLAorICAgICAgICAgICBjbXBvcCgoY21wb3BfdHkpKGFzZGxfc2VxX0dFVChlLT52LkNvbXBhcmUub3BzLCBuIC0gMSkpKSk7CisgICAgaWYgKG4gPiAxKSB7CisgICAgICAgIGJhc2ljYmxvY2sgKmVuZCA9IGNvbXBpbGVyX25ld19ibG9jayhjKTsKKyAgICAgICAgaWYgKGVuZCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIEFERE9QX0pSRUwoYywgSlVNUF9GT1JXQVJELCBlbmQpOworICAgICAgICBjb21waWxlcl91c2VfbmV4dF9ibG9jayhjLCBjbGVhbnVwKTsKKyAgICAgICAgQURET1AoYywgUk9UX1RXTyk7CisgICAgICAgIEFERE9QKGMsIFBPUF9UT1ApOworICAgICAgICBjb21waWxlcl91c2VfbmV4dF9ibG9jayhjLCBlbmQpOworICAgIH0KKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIGludAogY29tcGlsZXJfY2FsbChzdHJ1Y3QgY29tcGlsZXIgKmMsIGV4cHJfdHkgZSkKIHsKLQlpbnQgbiwgY29kZSA9IDA7CisgICAgaW50IG4sIGNvZGUgPSAwOwogCi0JVklTSVQoYywgZXhwciwgZS0+di5DYWxsLmZ1bmMpOwotCW4gPSBhc2RsX3NlcV9MRU4oZS0+di5DYWxsLmFyZ3MpOwotCVZJU0lUX1NFUShjLCBleHByLCBlLT52LkNhbGwuYXJncyk7Ci0JaWYgKGUtPnYuQ2FsbC5rZXl3b3JkcykgewotCQlWSVNJVF9TRVEoYywga2V5d29yZCwgZS0+di5DYWxsLmtleXdvcmRzKTsKLQkJbiB8PSBhc2RsX3NlcV9MRU4oZS0+di5DYWxsLmtleXdvcmRzKSA8PCA4OwotCX0KLQlpZiAoZS0+di5DYWxsLnN0YXJhcmdzKSB7Ci0JCVZJU0lUKGMsIGV4cHIsIGUtPnYuQ2FsbC5zdGFyYXJncyk7Ci0JCWNvZGUgfD0gMTsKLQl9Ci0JaWYgKGUtPnYuQ2FsbC5rd2FyZ3MpIHsKLQkJVklTSVQoYywgZXhwciwgZS0+di5DYWxsLmt3YXJncyk7Ci0JCWNvZGUgfD0gMjsKLQl9Ci0Jc3dpdGNoIChjb2RlKSB7Ci0JY2FzZSAwOgotCQlBRERPUF9JKGMsIENBTExfRlVOQ1RJT04sIG4pOwotCQlicmVhazsKLQljYXNlIDE6Ci0JCUFERE9QX0koYywgQ0FMTF9GVU5DVElPTl9WQVIsIG4pOwotCQlicmVhazsKLQljYXNlIDI6Ci0JCUFERE9QX0koYywgQ0FMTF9GVU5DVElPTl9LVywgbik7Ci0JCWJyZWFrOwotCWNhc2UgMzoKLQkJQURET1BfSShjLCBDQUxMX0ZVTkNUSU9OX1ZBUl9LVywgbik7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gMTsKKyAgICBWSVNJVChjLCBleHByLCBlLT52LkNhbGwuZnVuYyk7CisgICAgbiA9IGFzZGxfc2VxX0xFTihlLT52LkNhbGwuYXJncyk7CisgICAgVklTSVRfU0VRKGMsIGV4cHIsIGUtPnYuQ2FsbC5hcmdzKTsKKyAgICBpZiAoZS0+di5DYWxsLmtleXdvcmRzKSB7CisgICAgICAgIFZJU0lUX1NFUShjLCBrZXl3b3JkLCBlLT52LkNhbGwua2V5d29yZHMpOworICAgICAgICBuIHw9IGFzZGxfc2VxX0xFTihlLT52LkNhbGwua2V5d29yZHMpIDw8IDg7CisgICAgfQorICAgIGlmIChlLT52LkNhbGwuc3RhcmFyZ3MpIHsKKyAgICAgICAgVklTSVQoYywgZXhwciwgZS0+di5DYWxsLnN0YXJhcmdzKTsKKyAgICAgICAgY29kZSB8PSAxOworICAgIH0KKyAgICBpZiAoZS0+di5DYWxsLmt3YXJncykgeworICAgICAgICBWSVNJVChjLCBleHByLCBlLT52LkNhbGwua3dhcmdzKTsKKyAgICAgICAgY29kZSB8PSAyOworICAgIH0KKyAgICBzd2l0Y2ggKGNvZGUpIHsKKyAgICBjYXNlIDA6CisgICAgICAgIEFERE9QX0koYywgQ0FMTF9GVU5DVElPTiwgbik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgICAgQURET1BfSShjLCBDQUxMX0ZVTkNUSU9OX1ZBUiwgbik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgICAgQURET1BfSShjLCBDQUxMX0ZVTkNUSU9OX0tXLCBuKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgICBBRERPUF9JKGMsIENBTExfRlVOQ1RJT05fVkFSX0tXLCBuKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgaW50CiBjb21waWxlcl9saXN0Y29tcF9nZW5lcmF0b3Ioc3RydWN0IGNvbXBpbGVyICpjLCBQeU9iamVjdCAqdG1wbmFtZSwKLQkJCSAgICBhc2RsX3NlcSAqZ2VuZXJhdG9ycywgaW50IGdlbl9pbmRleCwgCi0JCQkgICAgZXhwcl90eSBlbHQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNkbF9zZXEgKmdlbmVyYXRvcnMsIGludCBnZW5faW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcl90eSBlbHQpCiB7Ci0JLyogZ2VuZXJhdGUgY29kZSBmb3IgdGhlIGl0ZXJhdG9yLCB0aGVuIGVhY2ggb2YgdGhlIGlmcywKLQkgICBhbmQgdGhlbiB3cml0ZSB0byB0aGUgZWxlbWVudCAqLworICAgIC8qIGdlbmVyYXRlIGNvZGUgZm9yIHRoZSBpdGVyYXRvciwgdGhlbiBlYWNoIG9mIHRoZSBpZnMsCisgICAgICAgYW5kIHRoZW4gd3JpdGUgdG8gdGhlIGVsZW1lbnQgKi8KIAotCWNvbXByZWhlbnNpb25fdHkgbDsKLQliYXNpY2Jsb2NrICpzdGFydCwgKmFuY2hvciwgKnNraXAsICppZl9jbGVhbnVwOwotCWludCBpLCBuOworICAgIGNvbXByZWhlbnNpb25fdHkgbDsKKyAgICBiYXNpY2Jsb2NrICpzdGFydCwgKmFuY2hvciwgKnNraXAsICppZl9jbGVhbnVwOworICAgIGludCBpLCBuOwogCi0Jc3RhcnQgPSBjb21waWxlcl9uZXdfYmxvY2soYyk7Ci0Jc2tpcCA9IGNvbXBpbGVyX25ld19ibG9jayhjKTsKLQlpZl9jbGVhbnVwID0gY29tcGlsZXJfbmV3X2Jsb2NrKGMpOwotCWFuY2hvciA9IGNvbXBpbGVyX25ld19ibG9jayhjKTsKKyAgICBzdGFydCA9IGNvbXBpbGVyX25ld19ibG9jayhjKTsKKyAgICBza2lwID0gY29tcGlsZXJfbmV3X2Jsb2NrKGMpOworICAgIGlmX2NsZWFudXAgPSBjb21waWxlcl9uZXdfYmxvY2soYyk7CisgICAgYW5jaG9yID0gY29tcGlsZXJfbmV3X2Jsb2NrKGMpOwogCi0JaWYgKHN0YXJ0ID09IE5VTEwgfHwgc2tpcCA9PSBOVUxMIHx8IGlmX2NsZWFudXAgPT0gTlVMTCB8fAotCQlhbmNob3IgPT0gTlVMTCkKLQkgICAgcmV0dXJuIDA7CisgICAgaWYgKHN0YXJ0ID09IE5VTEwgfHwgc2tpcCA9PSBOVUxMIHx8IGlmX2NsZWFudXAgPT0gTlVMTCB8fAorICAgICAgICBhbmNob3IgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIDA7CiAKLQlsID0gKGNvbXByZWhlbnNpb25fdHkpYXNkbF9zZXFfR0VUKGdlbmVyYXRvcnMsIGdlbl9pbmRleCk7Ci0JVklTSVQoYywgZXhwciwgbC0+aXRlcik7Ci0JQURET1AoYywgR0VUX0lURVIpOwotCWNvbXBpbGVyX3VzZV9uZXh0X2Jsb2NrKGMsIHN0YXJ0KTsKLQlBRERPUF9KUkVMKGMsIEZPUl9JVEVSLCBhbmNob3IpOwotCU5FWFRfQkxPQ0soYyk7Ci0JVklTSVQoYywgZXhwciwgbC0+dGFyZ2V0KTsKKyAgICBsID0gKGNvbXByZWhlbnNpb25fdHkpYXNkbF9zZXFfR0VUKGdlbmVyYXRvcnMsIGdlbl9pbmRleCk7CisgICAgVklTSVQoYywgZXhwciwgbC0+aXRlcik7CisgICAgQURET1AoYywgR0VUX0lURVIpOworICAgIGNvbXBpbGVyX3VzZV9uZXh0X2Jsb2NrKGMsIHN0YXJ0KTsKKyAgICBBRERPUF9KUkVMKGMsIEZPUl9JVEVSLCBhbmNob3IpOworICAgIE5FWFRfQkxPQ0soYyk7CisgICAgVklTSVQoYywgZXhwciwgbC0+dGFyZ2V0KTsKIAotCS8qIFhYWCB0aGlzIG5lZWRzIHRvIGJlIGNsZWFuZWQgdXAuLi5hIGxvdCEgKi8KLQluID0gYXNkbF9zZXFfTEVOKGwtPmlmcyk7Ci0JZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQlleHByX3R5IGUgPSAoZXhwcl90eSlhc2RsX3NlcV9HRVQobC0+aWZzLCBpKTsKLQkJVklTSVQoYywgZXhwciwgZSk7Ci0JCUFERE9QX0pSRUwoYywgSlVNUF9JRl9GQUxTRSwgaWZfY2xlYW51cCk7Ci0JCU5FWFRfQkxPQ0soYyk7Ci0JCUFERE9QKGMsIFBPUF9UT1ApOwotCX0gCisgICAgLyogWFhYIHRoaXMgbmVlZHMgdG8gYmUgY2xlYW5lZCB1cC4uLmEgbG90ISAqLworICAgIG4gPSBhc2RsX3NlcV9MRU4obC0+aWZzKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIGV4cHJfdHkgZSA9IChleHByX3R5KWFzZGxfc2VxX0dFVChsLT5pZnMsIGkpOworICAgICAgICBWSVNJVChjLCBleHByLCBlKTsKKyAgICAgICAgQURET1BfSlJFTChjLCBKVU1QX0lGX0ZBTFNFLCBpZl9jbGVhbnVwKTsKKyAgICAgICAgTkVYVF9CTE9DSyhjKTsKKyAgICAgICAgQURET1AoYywgUE9QX1RPUCk7CisgICAgfQogCi0JaWYgKCsrZ2VuX2luZGV4IDwgYXNkbF9zZXFfTEVOKGdlbmVyYXRvcnMpKQotCSAgICBpZiAoIWNvbXBpbGVyX2xpc3Rjb21wX2dlbmVyYXRvcihjLCB0bXBuYW1lLCAKLQkJCQkJICAgICBnZW5lcmF0b3JzLCBnZW5faW5kZXgsIGVsdCkpCi0JCXJldHVybiAwOworICAgIGlmICgrK2dlbl9pbmRleCA8IGFzZGxfc2VxX0xFTihnZW5lcmF0b3JzKSkKKyAgICAgICAgaWYgKCFjb21waWxlcl9saXN0Y29tcF9nZW5lcmF0b3IoYywgdG1wbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdG9ycywgZ2VuX2luZGV4LCBlbHQpKQorICAgICAgICByZXR1cm4gMDsKIAotCS8qIG9ubHkgYXBwZW5kIGFmdGVyIHRoZSBsYXN0IGZvciBnZW5lcmF0b3IgKi8KLQlpZiAoZ2VuX2luZGV4ID49IGFzZGxfc2VxX0xFTihnZW5lcmF0b3JzKSkgewotCSAgICBpZiAoIWNvbXBpbGVyX25hbWVvcChjLCB0bXBuYW1lLCBMb2FkKSkKLQkJcmV0dXJuIDA7Ci0JICAgIFZJU0lUKGMsIGV4cHIsIGVsdCk7Ci0JICAgIEFERE9QKGMsIExJU1RfQVBQRU5EKTsKKyAgICAvKiBvbmx5IGFwcGVuZCBhZnRlciB0aGUgbGFzdCBmb3IgZ2VuZXJhdG9yICovCisgICAgaWYgKGdlbl9pbmRleCA+PSBhc2RsX3NlcV9MRU4oZ2VuZXJhdG9ycykpIHsKKyAgICAgICAgaWYgKCFjb21waWxlcl9uYW1lb3AoYywgdG1wbmFtZSwgTG9hZCkpCisgICAgICAgIHJldHVybiAwOworICAgICAgICBWSVNJVChjLCBleHByLCBlbHQpOworICAgICAgICBBRERPUChjLCBMSVNUX0FQUEVORCk7CiAKLQkgICAgY29tcGlsZXJfdXNlX25leHRfYmxvY2soYywgc2tpcCk7Ci0JfQotCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJQURET1BfSShjLCBKVU1QX0ZPUldBUkQsIDEpOwotCQlpZiAoaSA9PSAwKQotCQkgICAgY29tcGlsZXJfdXNlX25leHRfYmxvY2soYywgaWZfY2xlYW51cCk7Ci0JCUFERE9QKGMsIFBPUF9UT1ApOwotCX0gCi0JQURET1BfSkFCUyhjLCBKVU1QX0FCU09MVVRFLCBzdGFydCk7Ci0JY29tcGlsZXJfdXNlX25leHRfYmxvY2soYywgYW5jaG9yKTsKLQkvKiBkZWxldGUgdGhlIHRlbXBvcmFyeSBsaXN0IG5hbWUgYWRkZWQgdG8gbG9jYWxzICovCi0JaWYgKGdlbl9pbmRleCA9PSAxKQotCSAgICBpZiAoIWNvbXBpbGVyX25hbWVvcChjLCB0bXBuYW1lLCBEZWwpKQotCQlyZXR1cm4gMDsKLQkKLQlyZXR1cm4gMTsKKyAgICAgICAgY29tcGlsZXJfdXNlX25leHRfYmxvY2soYywgc2tpcCk7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgQURET1BfSShjLCBKVU1QX0ZPUldBUkQsIDEpOworICAgICAgICBpZiAoaSA9PSAwKQorICAgICAgICAgICAgY29tcGlsZXJfdXNlX25leHRfYmxvY2soYywgaWZfY2xlYW51cCk7CisgICAgICAgIEFERE9QKGMsIFBPUF9UT1ApOworICAgIH0KKyAgICBBRERPUF9KQUJTKGMsIEpVTVBfQUJTT0xVVEUsIHN0YXJ0KTsKKyAgICBjb21waWxlcl91c2VfbmV4dF9ibG9jayhjLCBhbmNob3IpOworICAgIC8qIGRlbGV0ZSB0aGUgdGVtcG9yYXJ5IGxpc3QgbmFtZSBhZGRlZCB0byBsb2NhbHMgKi8KKyAgICBpZiAoZ2VuX2luZGV4ID09IDEpCisgICAgICAgIGlmICghY29tcGlsZXJfbmFtZW9wKGMsIHRtcG5hbWUsIERlbCkpCisgICAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyBpbnQKIGNvbXBpbGVyX2xpc3Rjb21wKHN0cnVjdCBjb21waWxlciAqYywgZXhwcl90eSBlKQogewotCWlkZW50aWZpZXIgdG1wOwotCWludCByYyA9IDA7Ci0JYXNkbF9zZXEgKmdlbmVyYXRvcnMgPSBlLT52Lkxpc3RDb21wLmdlbmVyYXRvcnM7CisgICAgaWRlbnRpZmllciB0bXA7CisgICAgaW50IHJjID0gMDsKKyAgICBhc2RsX3NlcSAqZ2VuZXJhdG9ycyA9IGUtPnYuTGlzdENvbXAuZ2VuZXJhdG9yczsKIAotCWFzc2VydChlLT5raW5kID09IExpc3RDb21wX2tpbmQpOwotCXRtcCA9IGNvbXBpbGVyX25ld190bXBuYW1lKGMpOwotCWlmICghdG1wKQotCQlyZXR1cm4gMDsKLQlBRERPUF9JKGMsIEJVSUxEX0xJU1QsIDApOwotCUFERE9QKGMsIERVUF9UT1ApOwotCWlmIChjb21waWxlcl9uYW1lb3AoYywgdG1wLCBTdG9yZSkpCi0JICAgIHJjID0gY29tcGlsZXJfbGlzdGNvbXBfZ2VuZXJhdG9yKGMsIHRtcCwgZ2VuZXJhdG9ycywgMCwgCi0JCQkJCSAgICAgZS0+di5MaXN0Q29tcC5lbHQpOwotCVB5X0RFQ1JFRih0bXApOwotCXJldHVybiByYzsKKyAgICBhc3NlcnQoZS0+a2luZCA9PSBMaXN0Q29tcF9raW5kKTsKKyAgICB0bXAgPSBjb21waWxlcl9uZXdfdG1wbmFtZShjKTsKKyAgICBpZiAoIXRtcCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgQURET1BfSShjLCBCVUlMRF9MSVNULCAwKTsKKyAgICBBRERPUChjLCBEVVBfVE9QKTsKKyAgICBpZiAoY29tcGlsZXJfbmFtZW9wKGMsIHRtcCwgU3RvcmUpKQorICAgICAgICByYyA9IGNvbXBpbGVyX2xpc3Rjb21wX2dlbmVyYXRvcihjLCB0bXAsIGdlbmVyYXRvcnMsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUtPnYuTGlzdENvbXAuZWx0KTsKKyAgICBQeV9ERUNSRUYodG1wKTsKKyAgICByZXR1cm4gcmM7CiB9CiAKIHN0YXRpYyBpbnQKIGNvbXBpbGVyX2dlbmV4cF9nZW5lcmF0b3Ioc3RydWN0IGNvbXBpbGVyICpjLAotCQkJICBhc2RsX3NlcSAqZ2VuZXJhdG9ycywgaW50IGdlbl9pbmRleCwgCi0JCQkgIGV4cHJfdHkgZWx0KQorICAgICAgICAgICAgICAgICAgICAgICAgICBhc2RsX3NlcSAqZ2VuZXJhdG9ycywgaW50IGdlbl9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcl90eSBlbHQpCiB7Ci0JLyogZ2VuZXJhdGUgY29kZSBmb3IgdGhlIGl0ZXJhdG9yLCB0aGVuIGVhY2ggb2YgdGhlIGlmcywKLQkgICBhbmQgdGhlbiB3cml0ZSB0byB0aGUgZWxlbWVudCAqLworICAgIC8qIGdlbmVyYXRlIGNvZGUgZm9yIHRoZSBpdGVyYXRvciwgdGhlbiBlYWNoIG9mIHRoZSBpZnMsCisgICAgICAgYW5kIHRoZW4gd3JpdGUgdG8gdGhlIGVsZW1lbnQgKi8KIAotCWNvbXByZWhlbnNpb25fdHkgZ2U7Ci0JYmFzaWNibG9jayAqc3RhcnQsICphbmNob3IsICpza2lwLCAqaWZfY2xlYW51cCwgKmVuZDsKLQlpbnQgaSwgbjsKKyAgICBjb21wcmVoZW5zaW9uX3R5IGdlOworICAgIGJhc2ljYmxvY2sgKnN0YXJ0LCAqYW5jaG9yLCAqc2tpcCwgKmlmX2NsZWFudXAsICplbmQ7CisgICAgaW50IGksIG47CiAKLQlzdGFydCA9IGNvbXBpbGVyX25ld19ibG9jayhjKTsKLQlza2lwID0gY29tcGlsZXJfbmV3X2Jsb2NrKGMpOwotCWlmX2NsZWFudXAgPSBjb21waWxlcl9uZXdfYmxvY2soYyk7Ci0JYW5jaG9yID0gY29tcGlsZXJfbmV3X2Jsb2NrKGMpOwotCWVuZCA9IGNvbXBpbGVyX25ld19ibG9jayhjKTsKKyAgICBzdGFydCA9IGNvbXBpbGVyX25ld19ibG9jayhjKTsKKyAgICBza2lwID0gY29tcGlsZXJfbmV3X2Jsb2NrKGMpOworICAgIGlmX2NsZWFudXAgPSBjb21waWxlcl9uZXdfYmxvY2soYyk7CisgICAgYW5jaG9yID0gY29tcGlsZXJfbmV3X2Jsb2NrKGMpOworICAgIGVuZCA9IGNvbXBpbGVyX25ld19ibG9jayhjKTsKIAotCWlmIChzdGFydCA9PSBOVUxMIHx8IHNraXAgPT0gTlVMTCB8fCBpZl9jbGVhbnVwID09IE5VTEwgfHwKLQkgICAgYW5jaG9yID09IE5VTEwgfHwgZW5kID09IE5VTEwpCi0JCXJldHVybiAwOworICAgIGlmIChzdGFydCA9PSBOVUxMIHx8IHNraXAgPT0gTlVMTCB8fCBpZl9jbGVhbnVwID09IE5VTEwgfHwKKyAgICAgICAgYW5jaG9yID09IE5VTEwgfHwgZW5kID09IE5VTEwpCisgICAgICAgIHJldHVybiAwOwogCi0JZ2UgPSAoY29tcHJlaGVuc2lvbl90eSlhc2RsX3NlcV9HRVQoZ2VuZXJhdG9ycywgZ2VuX2luZGV4KTsKLQlBRERPUF9KUkVMKGMsIFNFVFVQX0xPT1AsIGVuZCk7Ci0JaWYgKCFjb21waWxlcl9wdXNoX2ZibG9jayhjLCBMT09QLCBzdGFydCkpCi0JCXJldHVybiAwOworICAgIGdlID0gKGNvbXByZWhlbnNpb25fdHkpYXNkbF9zZXFfR0VUKGdlbmVyYXRvcnMsIGdlbl9pbmRleCk7CisgICAgQURET1BfSlJFTChjLCBTRVRVUF9MT09QLCBlbmQpOworICAgIGlmICghY29tcGlsZXJfcHVzaF9mYmxvY2soYywgTE9PUCwgc3RhcnQpKQorICAgICAgICByZXR1cm4gMDsKIAotCWlmIChnZW5faW5kZXggPT0gMCkgewotCQkvKiBSZWNlaXZlIG91dGVybW9zdCBpdGVyIGFzIGFuIGltcGxpY2l0IGFyZ3VtZW50ICovCi0JCWMtPnUtPnVfYXJnY291bnQgPSAxOwotCQlBRERPUF9JKGMsIExPQURfRkFTVCwgMCk7Ci0JfQotCWVsc2UgewotCQkvKiBTdWItaXRlciAtIGNhbGN1bGF0ZSBvbiB0aGUgZmx5ICovCi0JCVZJU0lUKGMsIGV4cHIsIGdlLT5pdGVyKTsKLQkJQURET1AoYywgR0VUX0lURVIpOwotCX0KLQljb21waWxlcl91c2VfbmV4dF9ibG9jayhjLCBzdGFydCk7Ci0JQURET1BfSlJFTChjLCBGT1JfSVRFUiwgYW5jaG9yKTsKLQlORVhUX0JMT0NLKGMpOwotCVZJU0lUKGMsIGV4cHIsIGdlLT50YXJnZXQpOworICAgIGlmIChnZW5faW5kZXggPT0gMCkgeworICAgICAgICAvKiBSZWNlaXZlIG91dGVybW9zdCBpdGVyIGFzIGFuIGltcGxpY2l0IGFyZ3VtZW50ICovCisgICAgICAgIGMtPnUtPnVfYXJnY291bnQgPSAxOworICAgICAgICBBRERPUF9JKGMsIExPQURfRkFTVCwgMCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvKiBTdWItaXRlciAtIGNhbGN1bGF0ZSBvbiB0aGUgZmx5ICovCisgICAgICAgIFZJU0lUKGMsIGV4cHIsIGdlLT5pdGVyKTsKKyAgICAgICAgQURET1AoYywgR0VUX0lURVIpOworICAgIH0KKyAgICBjb21waWxlcl91c2VfbmV4dF9ibG9jayhjLCBzdGFydCk7CisgICAgQURET1BfSlJFTChjLCBGT1JfSVRFUiwgYW5jaG9yKTsKKyAgICBORVhUX0JMT0NLKGMpOworICAgIFZJU0lUKGMsIGV4cHIsIGdlLT50YXJnZXQpOwogCi0JLyogWFhYIHRoaXMgbmVlZHMgdG8gYmUgY2xlYW5lZCB1cC4uLmEgbG90ISAqLwotCW4gPSBhc2RsX3NlcV9MRU4oZ2UtPmlmcyk7Ci0JZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQlleHByX3R5IGUgPSAoZXhwcl90eSlhc2RsX3NlcV9HRVQoZ2UtPmlmcywgaSk7Ci0JCVZJU0lUKGMsIGV4cHIsIGUpOwotCQlBRERPUF9KUkVMKGMsIEpVTVBfSUZfRkFMU0UsIGlmX2NsZWFudXApOwotCQlORVhUX0JMT0NLKGMpOwotCQlBRERPUChjLCBQT1BfVE9QKTsKLQl9IAorICAgIC8qIFhYWCB0aGlzIG5lZWRzIHRvIGJlIGNsZWFuZWQgdXAuLi5hIGxvdCEgKi8KKyAgICBuID0gYXNkbF9zZXFfTEVOKGdlLT5pZnMpOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgZXhwcl90eSBlID0gKGV4cHJfdHkpYXNkbF9zZXFfR0VUKGdlLT5pZnMsIGkpOworICAgICAgICBWSVNJVChjLCBleHByLCBlKTsKKyAgICAgICAgQURET1BfSlJFTChjLCBKVU1QX0lGX0ZBTFNFLCBpZl9jbGVhbnVwKTsKKyAgICAgICAgTkVYVF9CTE9DSyhjKTsKKyAgICAgICAgQURET1AoYywgUE9QX1RPUCk7CisgICAgfQogCi0JaWYgKCsrZ2VuX2luZGV4IDwgYXNkbF9zZXFfTEVOKGdlbmVyYXRvcnMpKQotCQlpZiAoIWNvbXBpbGVyX2dlbmV4cF9nZW5lcmF0b3IoYywgZ2VuZXJhdG9ycywgZ2VuX2luZGV4LCBlbHQpKQotCQkJcmV0dXJuIDA7CisgICAgaWYgKCsrZ2VuX2luZGV4IDwgYXNkbF9zZXFfTEVOKGdlbmVyYXRvcnMpKQorICAgICAgICBpZiAoIWNvbXBpbGVyX2dlbmV4cF9nZW5lcmF0b3IoYywgZ2VuZXJhdG9ycywgZ2VuX2luZGV4LCBlbHQpKQorICAgICAgICAgICAgcmV0dXJuIDA7CiAKLQkvKiBvbmx5IGFwcGVuZCBhZnRlciB0aGUgbGFzdCAnZm9yJyBnZW5lcmF0b3IgKi8KLQlpZiAoZ2VuX2luZGV4ID49IGFzZGxfc2VxX0xFTihnZW5lcmF0b3JzKSkgewotCQlWSVNJVChjLCBleHByLCBlbHQpOwotCQlBRERPUChjLCBZSUVMRF9WQUxVRSk7Ci0JCUFERE9QKGMsIFBPUF9UT1ApOworICAgIC8qIG9ubHkgYXBwZW5kIGFmdGVyIHRoZSBsYXN0ICdmb3InIGdlbmVyYXRvciAqLworICAgIGlmIChnZW5faW5kZXggPj0gYXNkbF9zZXFfTEVOKGdlbmVyYXRvcnMpKSB7CisgICAgICAgIFZJU0lUKGMsIGV4cHIsIGVsdCk7CisgICAgICAgIEFERE9QKGMsIFlJRUxEX1ZBTFVFKTsKKyAgICAgICAgQURET1AoYywgUE9QX1RPUCk7CiAKLQkJY29tcGlsZXJfdXNlX25leHRfYmxvY2soYywgc2tpcCk7Ci0JfQotCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJQURET1BfSShjLCBKVU1QX0ZPUldBUkQsIDEpOwotCQlpZiAoaSA9PSAwKQotCQkJY29tcGlsZXJfdXNlX25leHRfYmxvY2soYywgaWZfY2xlYW51cCk7CisgICAgICAgIGNvbXBpbGVyX3VzZV9uZXh0X2Jsb2NrKGMsIHNraXApOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIEFERE9QX0koYywgSlVNUF9GT1JXQVJELCAxKTsKKyAgICAgICAgaWYgKGkgPT0gMCkKKyAgICAgICAgICAgIGNvbXBpbGVyX3VzZV9uZXh0X2Jsb2NrKGMsIGlmX2NsZWFudXApOwogCi0JCUFERE9QKGMsIFBPUF9UT1ApOwotCX0gCi0JQURET1BfSkFCUyhjLCBKVU1QX0FCU09MVVRFLCBzdGFydCk7Ci0JY29tcGlsZXJfdXNlX25leHRfYmxvY2soYywgYW5jaG9yKTsKLQlBRERPUChjLCBQT1BfQkxPQ0spOwotCWNvbXBpbGVyX3BvcF9mYmxvY2soYywgTE9PUCwgc3RhcnQpOwotCWNvbXBpbGVyX3VzZV9uZXh0X2Jsb2NrKGMsIGVuZCk7CisgICAgICAgIEFERE9QKGMsIFBPUF9UT1ApOworICAgIH0KKyAgICBBRERPUF9KQUJTKGMsIEpVTVBfQUJTT0xVVEUsIHN0YXJ0KTsKKyAgICBjb21waWxlcl91c2VfbmV4dF9ibG9jayhjLCBhbmNob3IpOworICAgIEFERE9QKGMsIFBPUF9CTE9DSyk7CisgICAgY29tcGlsZXJfcG9wX2ZibG9jayhjLCBMT09QLCBzdGFydCk7CisgICAgY29tcGlsZXJfdXNlX25leHRfYmxvY2soYywgZW5kKTsKIAotCXJldHVybiAxOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgaW50CiBjb21waWxlcl9nZW5leHAoc3RydWN0IGNvbXBpbGVyICpjLCBleHByX3R5IGUpCiB7Ci0Jc3RhdGljIGlkZW50aWZpZXIgbmFtZTsKLQlQeUNvZGVPYmplY3QgKmNvOwotCWV4cHJfdHkgb3V0ZXJtb3N0X2l0ZXIgPSAoKGNvbXByZWhlbnNpb25fdHkpCi0JCQkJIChhc2RsX3NlcV9HRVQoZS0+di5HZW5lcmF0b3JFeHAuZ2VuZXJhdG9ycywKLQkJCQkJICAgICAgIDApKSktPml0ZXI7CisgICAgc3RhdGljIGlkZW50aWZpZXIgbmFtZTsKKyAgICBQeUNvZGVPYmplY3QgKmNvOworICAgIGV4cHJfdHkgb3V0ZXJtb3N0X2l0ZXIgPSAoKGNvbXByZWhlbnNpb25fdHkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhc2RsX3NlcV9HRVQoZS0+di5HZW5lcmF0b3JFeHAuZ2VuZXJhdG9ycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKSkpLT5pdGVyOwogCi0JaWYgKCFuYW1lKSB7Ci0JCW5hbWUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCI8Z2VuZXhwcj4iKTsKLQkJaWYgKCFuYW1lKQotCQkJcmV0dXJuIDA7Ci0JfQorICAgIGlmICghbmFtZSkgeworICAgICAgICBuYW1lID0gUHlTdHJpbmdfRnJvbVN0cmluZygiPGdlbmV4cHI+Iik7CisgICAgICAgIGlmICghbmFtZSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KIAotCWlmICghY29tcGlsZXJfZW50ZXJfc2NvcGUoYywgbmFtZSwgKHZvaWQgKillLCBlLT5saW5lbm8pKQotCQlyZXR1cm4gMDsKLQljb21waWxlcl9nZW5leHBfZ2VuZXJhdG9yKGMsIGUtPnYuR2VuZXJhdG9yRXhwLmdlbmVyYXRvcnMsIDAsCi0JCQkJICBlLT52LkdlbmVyYXRvckV4cC5lbHQpOwotCWNvID0gYXNzZW1ibGUoYywgMSk7Ci0JY29tcGlsZXJfZXhpdF9zY29wZShjKTsKLQlpZiAoY28gPT0gTlVMTCkKLQkJcmV0dXJuIDA7CisgICAgaWYgKCFjb21waWxlcl9lbnRlcl9zY29wZShjLCBuYW1lLCAodm9pZCAqKWUsIGUtPmxpbmVubykpCisgICAgICAgIHJldHVybiAwOworICAgIGNvbXBpbGVyX2dlbmV4cF9nZW5lcmF0b3IoYywgZS0+di5HZW5lcmF0b3JFeHAuZ2VuZXJhdG9ycywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUtPnYuR2VuZXJhdG9yRXhwLmVsdCk7CisgICAgY28gPSBhc3NlbWJsZShjLCAxKTsKKyAgICBjb21waWxlcl9leGl0X3Njb3BlKGMpOworICAgIGlmIChjbyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gMDsKIAotCWNvbXBpbGVyX21ha2VfY2xvc3VyZShjLCBjbywgMCk7Ci0JUHlfREVDUkVGKGNvKTsKKyAgICBjb21waWxlcl9tYWtlX2Nsb3N1cmUoYywgY28sIDApOworICAgIFB5X0RFQ1JFRihjbyk7CiAKLQlWSVNJVChjLCBleHByLCBvdXRlcm1vc3RfaXRlcik7Ci0JQURET1AoYywgR0VUX0lURVIpOwotCUFERE9QX0koYywgQ0FMTF9GVU5DVElPTiwgMSk7CisgICAgVklTSVQoYywgZXhwciwgb3V0ZXJtb3N0X2l0ZXIpOworICAgIEFERE9QKGMsIEdFVF9JVEVSKTsKKyAgICBBRERPUF9JKGMsIENBTExfRlVOQ1RJT04sIDEpOwogCi0JcmV0dXJuIDE7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyBpbnQKIGNvbXBpbGVyX3Zpc2l0X2tleXdvcmQoc3RydWN0IGNvbXBpbGVyICpjLCBrZXl3b3JkX3R5IGspCiB7Ci0JQURET1BfTyhjLCBMT0FEX0NPTlNULCBrLT5hcmcsIGNvbnN0cyk7Ci0JVklTSVQoYywgZXhwciwgay0+dmFsdWUpOwotCXJldHVybiAxOworICAgIEFERE9QX08oYywgTE9BRF9DT05TVCwgay0+YXJnLCBjb25zdHMpOworICAgIFZJU0lUKGMsIGV4cHIsIGstPnZhbHVlKTsKKyAgICByZXR1cm4gMTsKIH0KIAotLyogVGVzdCB3aGV0aGVyIGV4cHJlc3Npb24gaXMgY29uc3RhbnQuCSBGb3IgY29uc3RhbnRzLCByZXBvcnQKKy8qIFRlc3Qgd2hldGhlciBleHByZXNzaW9uIGlzIGNvbnN0YW50LiAgRm9yIGNvbnN0YW50cywgcmVwb3J0CiAgICB3aGV0aGVyIHRoZXkgYXJlIHRydWUgb3IgZmFsc2UuCiAKICAgIFJldHVybiB2YWx1ZXM6IDEgZm9yIHRydWUsIDAgZm9yIGZhbHNlLCAtMSBmb3Igbm9uLWNvbnN0YW50LgpAQCAtMjgxNiwzMyArMjgxNiwzMyBAQAogc3RhdGljIGludAogZXhwcl9jb25zdGFudChleHByX3R5IGUpCiB7Ci0Jc3dpdGNoIChlLT5raW5kKSB7Ci0JY2FzZSBOdW1fa2luZDoKLQkJcmV0dXJuIFB5T2JqZWN0X0lzVHJ1ZShlLT52Lk51bS5uKTsKLQljYXNlIFN0cl9raW5kOgotCQlyZXR1cm4gUHlPYmplY3RfSXNUcnVlKGUtPnYuU3RyLnMpOwotCWNhc2UgTmFtZV9raW5kOgotCQkvKiBfX2RlYnVnX18gaXMgbm90IGFzc2lnbmFibGUsIHNvIHdlIGNhbiBvcHRpbWl6ZQotCQkgKiBpdCBhd2F5IGluIGlmIGFuZCB3aGlsZSBzdGF0ZW1lbnRzICovCi0JCWlmIChzdHJjbXAoUHlTdHJpbmdfQVNfU1RSSU5HKGUtPnYuTmFtZS5pZCksCi0JCQkgICAiX19kZWJ1Z19fIikgPT0gMCkKLQkJCSAgIHJldHVybiAhIFB5X09wdGltaXplRmxhZzsKLQkJLyogZmFsbCB0aHJvdWdoICovCi0JZGVmYXVsdDoKLQkJcmV0dXJuIC0xOwotCX0KKyAgICBzd2l0Y2ggKGUtPmtpbmQpIHsKKyAgICBjYXNlIE51bV9raW5kOgorICAgICAgICByZXR1cm4gUHlPYmplY3RfSXNUcnVlKGUtPnYuTnVtLm4pOworICAgIGNhc2UgU3RyX2tpbmQ6CisgICAgICAgIHJldHVybiBQeU9iamVjdF9Jc1RydWUoZS0+di5TdHIucyk7CisgICAgY2FzZSBOYW1lX2tpbmQ6CisgICAgICAgIC8qIF9fZGVidWdfXyBpcyBub3QgYXNzaWduYWJsZSwgc28gd2UgY2FuIG9wdGltaXplCisgICAgICAgICAqIGl0IGF3YXkgaW4gaWYgYW5kIHdoaWxlIHN0YXRlbWVudHMgKi8KKyAgICAgICAgaWYgKHN0cmNtcChQeVN0cmluZ19BU19TVFJJTkcoZS0+di5OYW1lLmlkKSwKKyAgICAgICAgICAgICAgICAgICAiX19kZWJ1Z19fIikgPT0gMCkKKyAgICAgICAgICAgICAgICAgICByZXR1cm4gISBQeV9PcHRpbWl6ZUZsYWc7CisgICAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiB9CiAKIC8qCiAgICBJbXBsZW1lbnRzIHRoZSB3aXRoIHN0YXRlbWVudCBmcm9tIFBFUCAzNDMuCiAKLSAgIFRoZSBzZW1hbnRpY3Mgb3V0bGluZWQgaW4gdGhhdCBQRVAgYXJlIGFzIGZvbGxvd3M6ICAKKyAgIFRoZSBzZW1hbnRpY3Mgb3V0bGluZWQgaW4gdGhhdCBQRVAgYXJlIGFzIGZvbGxvd3M6CiAKICAgIHdpdGggRVhQUiBhcyBWQVI6CiAgICAgICAgQkxPQ0sKLSAgCisKICAgIEl0IGlzIGltcGxlbWVudGVkIHJvdWdobHkgYXM6Ci0gIAorCiAgICBjb250ZXh0ID0gRVhQUgogICAgZXhpdCA9IGNvbnRleHQuX19leGl0X18gICMgbm90IGNhbGxpbmcgaXQKICAgIHZhbHVlID0gY29udGV4dC5fX2VudGVyX18oKQpAQCAtMjg1MSw5ICsyODUxLDkgQEAKICAgICAgICBCTE9DSwogICAgZmluYWxseToKICAgICAgICBpZiBhbiBleGNlcHRpb24gd2FzIHJhaXNlZDoKLQkgICBleGMgPSBjb3B5IG9mIChleGNlcHRpb24sIGluc3RhbmNlLCB0cmFjZWJhY2spCisgICAgICAgZXhjID0gY29weSBvZiAoZXhjZXB0aW9uLCBpbnN0YW5jZSwgdHJhY2ViYWNrKQogICAgICAgIGVsc2U6Ci0JICAgZXhjID0gKE5vbmUsIE5vbmUsIE5vbmUpCisgICAgICAgZXhjID0gKE5vbmUsIE5vbmUsIE5vbmUpCiAgICAgICAgZXhpdCgqZXhjKQogICovCiBzdGF0aWMgaW50CkBAIC0yODY2LDM1ICsyODY2LDM1IEBACiAgICAgYXNzZXJ0KHMtPmtpbmQgPT0gV2l0aF9raW5kKTsKIAogICAgIGlmICghZW50ZXJfYXR0cikgewotCWVudGVyX2F0dHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2VudGVyX18iKTsKLQlpZiAoIWVudGVyX2F0dHIpCi0JICAgIHJldHVybiAwOworICAgIGVudGVyX2F0dHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2VudGVyX18iKTsKKyAgICBpZiAoIWVudGVyX2F0dHIpCisgICAgICAgIHJldHVybiAwOwogICAgIH0KICAgICBpZiAoIWV4aXRfYXR0cikgewotCWV4aXRfYXR0ciA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fZXhpdF9fIik7Ci0JaWYgKCFleGl0X2F0dHIpCi0JICAgIHJldHVybiAwOworICAgIGV4aXRfYXR0ciA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fZXhpdF9fIik7CisgICAgaWYgKCFleGl0X2F0dHIpCisgICAgICAgIHJldHVybiAwOwogICAgIH0KIAogICAgIGJsb2NrID0gY29tcGlsZXJfbmV3X2Jsb2NrKGMpOwogICAgIGZpbmFsbHkgPSBjb21waWxlcl9uZXdfYmxvY2soYyk7CiAgICAgaWYgKCFibG9jayB8fCAhZmluYWxseSkKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKIAogICAgIGlmIChzLT52LldpdGgub3B0aW9uYWxfdmFycykgewotCS8qIENyZWF0ZSBhIHRlbXBvcmFyeSB2YXJpYWJsZSB0byBob2xkIGNvbnRleHQuX19lbnRlcl9fKCkuCi0JICAgV2UgbmVlZCB0byBkbyB0aGlzIHJhdGhlciB0aGFuIHByZXNlcnZpbmcgaXQgb24gdGhlIHN0YWNrCi0JICAgYmVjYXVzZSBTRVRVUF9GSU5BTExZIHJlbWVtYmVycyB0aGUgc3RhY2sgbGV2ZWwuCi0JICAgV2UgbmVlZCB0byBkbyB0aGUgYXNzaWdubWVudCAqaW5zaWRlKiB0aGUgdHJ5L2ZpbmFsbHkKLQkgICBzbyB0aGF0IGNvbnRleHQuX19leGl0X18oKSBpcyBjYWxsZWQgd2hlbiB0aGUgYXNzaWdubWVudAotCSAgIGZhaWxzLiAgQnV0IHdlIG5lZWQgdG8gY2FsbCBjb250ZXh0Ll9fZW50ZXJfXygpICpiZWZvcmUqCi0JICAgdGhlIHRyeS9maW5hbGx5IHNvIHRoYXQgaWYgaXQgZmFpbHMgd2Ugd29uJ3QgY2FsbAotCSAgIGNvbnRleHQuX19leGl0X18oKS4KLQkqLwotCXRtcHZhbHVlID0gY29tcGlsZXJfbmV3X3RtcG5hbWUoYyk7Ci0JaWYgKHRtcHZhbHVlID09IE5VTEwpCi0JICAgIHJldHVybiAwOwotCVB5QXJlbmFfQWRkUHlPYmplY3QoYy0+Y19hcmVuYSwgdG1wdmFsdWUpOworICAgIC8qIENyZWF0ZSBhIHRlbXBvcmFyeSB2YXJpYWJsZSB0byBob2xkIGNvbnRleHQuX19lbnRlcl9fKCkuCisgICAgICAgV2UgbmVlZCB0byBkbyB0aGlzIHJhdGhlciB0aGFuIHByZXNlcnZpbmcgaXQgb24gdGhlIHN0YWNrCisgICAgICAgYmVjYXVzZSBTRVRVUF9GSU5BTExZIHJlbWVtYmVycyB0aGUgc3RhY2sgbGV2ZWwuCisgICAgICAgV2UgbmVlZCB0byBkbyB0aGUgYXNzaWdubWVudCAqaW5zaWRlKiB0aGUgdHJ5L2ZpbmFsbHkKKyAgICAgICBzbyB0aGF0IGNvbnRleHQuX19leGl0X18oKSBpcyBjYWxsZWQgd2hlbiB0aGUgYXNzaWdubWVudAorICAgICAgIGZhaWxzLiAgQnV0IHdlIG5lZWQgdG8gY2FsbCBjb250ZXh0Ll9fZW50ZXJfXygpICpiZWZvcmUqCisgICAgICAgdGhlIHRyeS9maW5hbGx5IHNvIHRoYXQgaWYgaXQgZmFpbHMgd2Ugd29uJ3QgY2FsbAorICAgICAgIGNvbnRleHQuX19leGl0X18oKS4KKyAgICAqLworICAgIHRtcHZhbHVlID0gY29tcGlsZXJfbmV3X3RtcG5hbWUoYyk7CisgICAgaWYgKHRtcHZhbHVlID09IE5VTEwpCisgICAgICAgIHJldHVybiAwOworICAgIFB5QXJlbmFfQWRkUHlPYmplY3QoYy0+Y19hcmVuYSwgdG1wdmFsdWUpOwogICAgIH0KIAogICAgIC8qIEV2YWx1YXRlIEVYUFIgKi8KQEAgLTI5MTAsMTMgKzI5MTAsMTMgQEAKICAgICBBRERPUF9JKGMsIENBTExfRlVOQ1RJT04sIDApOwogCiAgICAgaWYgKHMtPnYuV2l0aC5vcHRpb25hbF92YXJzKSB7Ci0JLyogU3RvcmUgaXQgaW4gdG1wdmFsdWUgKi8KLQlpZiAoIWNvbXBpbGVyX25hbWVvcChjLCB0bXB2YWx1ZSwgU3RvcmUpKQotCSAgICByZXR1cm4gMDsKKyAgICAvKiBTdG9yZSBpdCBpbiB0bXB2YWx1ZSAqLworICAgIGlmICghY29tcGlsZXJfbmFtZW9wKGMsIHRtcHZhbHVlLCBTdG9yZSkpCisgICAgICAgIHJldHVybiAwOwogICAgIH0KICAgICBlbHNlIHsKLQkvKiBEaXNjYXJkIHJlc3VsdCBmcm9tIGNvbnRleHQuX19lbnRlcl9fKCkgKi8KLQlBRERPUChjLCBQT1BfVE9QKTsKKyAgICAvKiBEaXNjYXJkIHJlc3VsdCBmcm9tIGNvbnRleHQuX19lbnRlcl9fKCkgKi8KKyAgICBBRERPUChjLCBQT1BfVE9QKTsKICAgICB9CiAKICAgICAvKiBTdGFydCB0aGUgdHJ5IGJsb2NrICovCkBAIC0yOTI0LDE1ICsyOTI0LDE1IEBACiAKICAgICBjb21waWxlcl91c2VfbmV4dF9ibG9jayhjLCBibG9jayk7CiAgICAgaWYgKCFjb21waWxlcl9wdXNoX2ZibG9jayhjLCBGSU5BTExZX1RSWSwgYmxvY2spKSB7Ci0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiAgICAgfQogCiAgICAgaWYgKHMtPnYuV2l0aC5vcHRpb25hbF92YXJzKSB7Ci0JLyogQmluZCBzYXZlZCByZXN1bHQgb2YgY29udGV4dC5fX2VudGVyX18oKSB0byBWQVIgKi8KLQlpZiAoIWNvbXBpbGVyX25hbWVvcChjLCB0bXB2YWx1ZSwgTG9hZCkgfHwKLQkgICAgIWNvbXBpbGVyX25hbWVvcChjLCB0bXB2YWx1ZSwgRGVsKSkKLQkgIHJldHVybiAwOwotCVZJU0lUKGMsIGV4cHIsIHMtPnYuV2l0aC5vcHRpb25hbF92YXJzKTsKKyAgICAvKiBCaW5kIHNhdmVkIHJlc3VsdCBvZiBjb250ZXh0Ll9fZW50ZXJfXygpIHRvIFZBUiAqLworICAgIGlmICghY29tcGlsZXJfbmFtZW9wKGMsIHRtcHZhbHVlLCBMb2FkKSB8fAorICAgICAgICAhY29tcGlsZXJfbmFtZW9wKGMsIHRtcHZhbHVlLCBEZWwpKQorICAgICAgcmV0dXJuIDA7CisgICAgVklTSVQoYywgZXhwciwgcy0+di5XaXRoLm9wdGlvbmFsX3ZhcnMpOwogICAgIH0KIAogICAgIC8qIEJMT0NLIGNvZGUgKi8KQEAgLTI5NDUsNyArMjk0NSw3IEBACiAgICAgQURET1BfTyhjLCBMT0FEX0NPTlNULCBQeV9Ob25lLCBjb25zdHMpOwogICAgIGNvbXBpbGVyX3VzZV9uZXh0X2Jsb2NrKGMsIGZpbmFsbHkpOwogICAgIGlmICghY29tcGlsZXJfcHVzaF9mYmxvY2soYywgRklOQUxMWV9FTkQsIGZpbmFsbHkpKQotCXJldHVybiAwOworICAgIHJldHVybiAwOwogCiAgICAgLyogRmluYWxseSBibG9jayBzdGFydHM7IGNvbnRleHQuX19leGl0X18gaXMgb24gdGhlIHN0YWNrIHVuZGVyCiAgICAgICAgdGhlIGV4Y2VwdGlvbiBvciByZXR1cm4gaW5mb3JtYXRpb24uIEp1c3QgaXNzdWUgb3VyIG1hZ2ljCkBAIC0yOTYxLDIxNyArMjk2MSwyMTcgQEAKIHN0YXRpYyBpbnQKIGNvbXBpbGVyX3Zpc2l0X2V4cHIoc3RydWN0IGNvbXBpbGVyICpjLCBleHByX3R5IGUpCiB7Ci0JaW50IGksIG47CisgICAgaW50IGksIG47CiAKLQkvKiBJZiBleHByIGUgaGFzIGEgZGlmZmVyZW50IGxpbmUgbnVtYmVyIHRoYW4gdGhlIGxhc3QgZXhwci9zdG10LAotCSAgIHNldCBhIG5ldyBsaW5lIG51bWJlciBmb3IgdGhlIG5leHQgaW5zdHJ1Y3Rpb24uCi0JKi8KLQlpZiAoZS0+bGluZW5vID4gYy0+dS0+dV9saW5lbm8pIHsKLQkJYy0+dS0+dV9saW5lbm8gPSBlLT5saW5lbm87Ci0JCWMtPnUtPnVfbGluZW5vX3NldCA9IGZhbHNlOwotCX0KLQlzd2l0Y2ggKGUtPmtpbmQpIHsKLQljYXNlIEJvb2xPcF9raW5kOgotCQlyZXR1cm4gY29tcGlsZXJfYm9vbG9wKGMsIGUpOwotCWNhc2UgQmluT3Bfa2luZDoKLQkJVklTSVQoYywgZXhwciwgZS0+di5CaW5PcC5sZWZ0KTsKLQkJVklTSVQoYywgZXhwciwgZS0+di5CaW5PcC5yaWdodCk7Ci0JCUFERE9QKGMsIGJpbm9wKGMsIGUtPnYuQmluT3Aub3ApKTsKLQkJYnJlYWs7Ci0JY2FzZSBVbmFyeU9wX2tpbmQ6Ci0JCVZJU0lUKGMsIGV4cHIsIGUtPnYuVW5hcnlPcC5vcGVyYW5kKTsKLQkJQURET1AoYywgdW5hcnlvcChlLT52LlVuYXJ5T3Aub3ApKTsKLQkJYnJlYWs7Ci0JY2FzZSBMYW1iZGFfa2luZDoKLQkJcmV0dXJuIGNvbXBpbGVyX2xhbWJkYShjLCBlKTsKLQljYXNlIElmRXhwX2tpbmQ6Ci0JCXJldHVybiBjb21waWxlcl9pZmV4cChjLCBlKTsKLQljYXNlIERpY3Rfa2luZDoKLQkJbiA9IGFzZGxfc2VxX0xFTihlLT52LkRpY3QudmFsdWVzKTsKLQkJQURET1BfSShjLCBCVUlMRF9NQVAsIChuPjB4RkZGRiA/IDB4RkZGRiA6IG4pKTsKLQkJZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQkJVklTSVQoYywgZXhwciwgCi0JCQkJKGV4cHJfdHkpYXNkbF9zZXFfR0VUKGUtPnYuRGljdC52YWx1ZXMsIGkpKTsKLQkJCVZJU0lUKGMsIGV4cHIsIAotCQkJCShleHByX3R5KWFzZGxfc2VxX0dFVChlLT52LkRpY3Qua2V5cywgaSkpOwotCQkJQURET1AoYywgU1RPUkVfTUFQKTsKLQkJfQotCQlicmVhazsKLQljYXNlIExpc3RDb21wX2tpbmQ6Ci0JCXJldHVybiBjb21waWxlcl9saXN0Y29tcChjLCBlKTsKLQljYXNlIEdlbmVyYXRvckV4cF9raW5kOgotCQlyZXR1cm4gY29tcGlsZXJfZ2VuZXhwKGMsIGUpOwotCWNhc2UgWWllbGRfa2luZDoKLQkJaWYgKGMtPnUtPnVfc3RlLT5zdGVfdHlwZSAhPSBGdW5jdGlvbkJsb2NrKQotCQkJcmV0dXJuIGNvbXBpbGVyX2Vycm9yKGMsICIneWllbGQnIG91dHNpZGUgZnVuY3Rpb24iKTsKLQkJaWYgKGUtPnYuWWllbGQudmFsdWUpIHsKLQkJCVZJU0lUKGMsIGV4cHIsIGUtPnYuWWllbGQudmFsdWUpOwotCQl9Ci0JCWVsc2UgewotCQkJQURET1BfTyhjLCBMT0FEX0NPTlNULCBQeV9Ob25lLCBjb25zdHMpOwotCQl9Ci0JCUFERE9QKGMsIFlJRUxEX1ZBTFVFKTsKLQkJYnJlYWs7Ci0JY2FzZSBDb21wYXJlX2tpbmQ6Ci0JCXJldHVybiBjb21waWxlcl9jb21wYXJlKGMsIGUpOwotCWNhc2UgQ2FsbF9raW5kOgotCQlyZXR1cm4gY29tcGlsZXJfY2FsbChjLCBlKTsKLQljYXNlIFJlcHJfa2luZDoKLQkJVklTSVQoYywgZXhwciwgZS0+di5SZXByLnZhbHVlKTsKLQkJQURET1AoYywgVU5BUllfQ09OVkVSVCk7Ci0JCWJyZWFrOwotCWNhc2UgTnVtX2tpbmQ6Ci0JCUFERE9QX08oYywgTE9BRF9DT05TVCwgZS0+di5OdW0ubiwgY29uc3RzKTsKLQkJYnJlYWs7Ci0JY2FzZSBTdHJfa2luZDoKLQkJQURET1BfTyhjLCBMT0FEX0NPTlNULCBlLT52LlN0ci5zLCBjb25zdHMpOwotCQlicmVhazsKLQkvKiBUaGUgZm9sbG93aW5nIGV4cHJzIGNhbiBiZSBhc3NpZ25tZW50IHRhcmdldHMuICovCi0JY2FzZSBBdHRyaWJ1dGVfa2luZDoKLQkJaWYgKGUtPnYuQXR0cmlidXRlLmN0eCAhPSBBdWdTdG9yZSkKLQkJCVZJU0lUKGMsIGV4cHIsIGUtPnYuQXR0cmlidXRlLnZhbHVlKTsKLQkJc3dpdGNoIChlLT52LkF0dHJpYnV0ZS5jdHgpIHsKLQkJY2FzZSBBdWdMb2FkOgotCQkJQURET1AoYywgRFVQX1RPUCk7Ci0JCQkvKiBGYWxsIHRocm91Z2ggdG8gbG9hZCAqLwotCQljYXNlIExvYWQ6Ci0JCQlBRERPUF9OQU1FKGMsIExPQURfQVRUUiwgZS0+di5BdHRyaWJ1dGUuYXR0ciwgbmFtZXMpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQXVnU3RvcmU6Ci0JCQlBRERPUChjLCBST1RfVFdPKTsKLQkJCS8qIEZhbGwgdGhyb3VnaCB0byBzYXZlICovCi0JCWNhc2UgU3RvcmU6Ci0JCQlBRERPUF9OQU1FKGMsIFNUT1JFX0FUVFIsIGUtPnYuQXR0cmlidXRlLmF0dHIsIG5hbWVzKTsKLQkJCWJyZWFrOwotCQljYXNlIERlbDoKLQkJCUFERE9QX05BTUUoYywgREVMRVRFX0FUVFIsIGUtPnYuQXR0cmlidXRlLmF0dHIsIG5hbWVzKTsKLQkJCWJyZWFrOwotCQljYXNlIFBhcmFtOgotCQlkZWZhdWx0OgotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAotCQkJCQkicGFyYW0gaW52YWxpZCBpbiBhdHRyaWJ1dGUgZXhwcmVzc2lvbiIpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBTdWJzY3JpcHRfa2luZDoKLQkJc3dpdGNoIChlLT52LlN1YnNjcmlwdC5jdHgpIHsKLQkJY2FzZSBBdWdMb2FkOgotCQkJVklTSVQoYywgZXhwciwgZS0+di5TdWJzY3JpcHQudmFsdWUpOwotCQkJVklTSVRfU0xJQ0UoYywgZS0+di5TdWJzY3JpcHQuc2xpY2UsIEF1Z0xvYWQpOwotCQkJYnJlYWs7Ci0JCWNhc2UgTG9hZDoKLQkJCVZJU0lUKGMsIGV4cHIsIGUtPnYuU3Vic2NyaXB0LnZhbHVlKTsKLQkJCVZJU0lUX1NMSUNFKGMsIGUtPnYuU3Vic2NyaXB0LnNsaWNlLCBMb2FkKTsKLQkJCWJyZWFrOwotCQljYXNlIEF1Z1N0b3JlOgotCQkJVklTSVRfU0xJQ0UoYywgZS0+di5TdWJzY3JpcHQuc2xpY2UsIEF1Z1N0b3JlKTsKLQkJCWJyZWFrOwotCQljYXNlIFN0b3JlOgotCQkJVklTSVQoYywgZXhwciwgZS0+di5TdWJzY3JpcHQudmFsdWUpOwotCQkJVklTSVRfU0xJQ0UoYywgZS0+di5TdWJzY3JpcHQuc2xpY2UsIFN0b3JlKTsKLQkJCWJyZWFrOwotCQljYXNlIERlbDoKLQkJCVZJU0lUKGMsIGV4cHIsIGUtPnYuU3Vic2NyaXB0LnZhbHVlKTsKLQkJCVZJU0lUX1NMSUNFKGMsIGUtPnYuU3Vic2NyaXB0LnNsaWNlLCBEZWwpOwotCQkJYnJlYWs7Ci0JCWNhc2UgUGFyYW06Ci0JCWRlZmF1bHQ6Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCi0JCQkJInBhcmFtIGludmFsaWQgaW4gc3Vic2NyaXB0IGV4cHJlc3Npb24iKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgTmFtZV9raW5kOgotCQlyZXR1cm4gY29tcGlsZXJfbmFtZW9wKGMsIGUtPnYuTmFtZS5pZCwgZS0+di5OYW1lLmN0eCk7Ci0JLyogY2hpbGQgbm9kZXMgb2YgTGlzdCBhbmQgVHVwbGUgd2lsbCBoYXZlIGV4cHJfY29udGV4dCBzZXQgKi8KLQljYXNlIExpc3Rfa2luZDoKLQkJcmV0dXJuIGNvbXBpbGVyX2xpc3QoYywgZSk7Ci0JY2FzZSBUdXBsZV9raW5kOgotCQlyZXR1cm4gY29tcGlsZXJfdHVwbGUoYywgZSk7Ci0JfQotCXJldHVybiAxOworICAgIC8qIElmIGV4cHIgZSBoYXMgYSBkaWZmZXJlbnQgbGluZSBudW1iZXIgdGhhbiB0aGUgbGFzdCBleHByL3N0bXQsCisgICAgICAgc2V0IGEgbmV3IGxpbmUgbnVtYmVyIGZvciB0aGUgbmV4dCBpbnN0cnVjdGlvbi4KKyAgICAqLworICAgIGlmIChlLT5saW5lbm8gPiBjLT51LT51X2xpbmVubykgeworICAgICAgICBjLT51LT51X2xpbmVubyA9IGUtPmxpbmVubzsKKyAgICAgICAgYy0+dS0+dV9saW5lbm9fc2V0ID0gZmFsc2U7CisgICAgfQorICAgIHN3aXRjaCAoZS0+a2luZCkgeworICAgIGNhc2UgQm9vbE9wX2tpbmQ6CisgICAgICAgIHJldHVybiBjb21waWxlcl9ib29sb3AoYywgZSk7CisgICAgY2FzZSBCaW5PcF9raW5kOgorICAgICAgICBWSVNJVChjLCBleHByLCBlLT52LkJpbk9wLmxlZnQpOworICAgICAgICBWSVNJVChjLCBleHByLCBlLT52LkJpbk9wLnJpZ2h0KTsKKyAgICAgICAgQURET1AoYywgYmlub3AoYywgZS0+di5CaW5PcC5vcCkpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFVuYXJ5T3Bfa2luZDoKKyAgICAgICAgVklTSVQoYywgZXhwciwgZS0+di5VbmFyeU9wLm9wZXJhbmQpOworICAgICAgICBBRERPUChjLCB1bmFyeW9wKGUtPnYuVW5hcnlPcC5vcCkpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIExhbWJkYV9raW5kOgorICAgICAgICByZXR1cm4gY29tcGlsZXJfbGFtYmRhKGMsIGUpOworICAgIGNhc2UgSWZFeHBfa2luZDoKKyAgICAgICAgcmV0dXJuIGNvbXBpbGVyX2lmZXhwKGMsIGUpOworICAgIGNhc2UgRGljdF9raW5kOgorICAgICAgICBuID0gYXNkbF9zZXFfTEVOKGUtPnYuRGljdC52YWx1ZXMpOworICAgICAgICBBRERPUF9JKGMsIEJVSUxEX01BUCwgKG4+MHhGRkZGID8gMHhGRkZGIDogbikpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgICAgICBWSVNJVChjLCBleHByLAorICAgICAgICAgICAgICAgIChleHByX3R5KWFzZGxfc2VxX0dFVChlLT52LkRpY3QudmFsdWVzLCBpKSk7CisgICAgICAgICAgICBWSVNJVChjLCBleHByLAorICAgICAgICAgICAgICAgIChleHByX3R5KWFzZGxfc2VxX0dFVChlLT52LkRpY3Qua2V5cywgaSkpOworICAgICAgICAgICAgQURET1AoYywgU1RPUkVfTUFQKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIExpc3RDb21wX2tpbmQ6CisgICAgICAgIHJldHVybiBjb21waWxlcl9saXN0Y29tcChjLCBlKTsKKyAgICBjYXNlIEdlbmVyYXRvckV4cF9raW5kOgorICAgICAgICByZXR1cm4gY29tcGlsZXJfZ2VuZXhwKGMsIGUpOworICAgIGNhc2UgWWllbGRfa2luZDoKKyAgICAgICAgaWYgKGMtPnUtPnVfc3RlLT5zdGVfdHlwZSAhPSBGdW5jdGlvbkJsb2NrKQorICAgICAgICAgICAgcmV0dXJuIGNvbXBpbGVyX2Vycm9yKGMsICIneWllbGQnIG91dHNpZGUgZnVuY3Rpb24iKTsKKyAgICAgICAgaWYgKGUtPnYuWWllbGQudmFsdWUpIHsKKyAgICAgICAgICAgIFZJU0lUKGMsIGV4cHIsIGUtPnYuWWllbGQudmFsdWUpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgQURET1BfTyhjLCBMT0FEX0NPTlNULCBQeV9Ob25lLCBjb25zdHMpOworICAgICAgICB9CisgICAgICAgIEFERE9QKGMsIFlJRUxEX1ZBTFVFKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDb21wYXJlX2tpbmQ6CisgICAgICAgIHJldHVybiBjb21waWxlcl9jb21wYXJlKGMsIGUpOworICAgIGNhc2UgQ2FsbF9raW5kOgorICAgICAgICByZXR1cm4gY29tcGlsZXJfY2FsbChjLCBlKTsKKyAgICBjYXNlIFJlcHJfa2luZDoKKyAgICAgICAgVklTSVQoYywgZXhwciwgZS0+di5SZXByLnZhbHVlKTsKKyAgICAgICAgQURET1AoYywgVU5BUllfQ09OVkVSVCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTnVtX2tpbmQ6CisgICAgICAgIEFERE9QX08oYywgTE9BRF9DT05TVCwgZS0+di5OdW0ubiwgY29uc3RzKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTdHJfa2luZDoKKyAgICAgICAgQURET1BfTyhjLCBMT0FEX0NPTlNULCBlLT52LlN0ci5zLCBjb25zdHMpOworICAgICAgICBicmVhazsKKyAgICAvKiBUaGUgZm9sbG93aW5nIGV4cHJzIGNhbiBiZSBhc3NpZ25tZW50IHRhcmdldHMuICovCisgICAgY2FzZSBBdHRyaWJ1dGVfa2luZDoKKyAgICAgICAgaWYgKGUtPnYuQXR0cmlidXRlLmN0eCAhPSBBdWdTdG9yZSkKKyAgICAgICAgICAgIFZJU0lUKGMsIGV4cHIsIGUtPnYuQXR0cmlidXRlLnZhbHVlKTsKKyAgICAgICAgc3dpdGNoIChlLT52LkF0dHJpYnV0ZS5jdHgpIHsKKyAgICAgICAgY2FzZSBBdWdMb2FkOgorICAgICAgICAgICAgQURET1AoYywgRFVQX1RPUCk7CisgICAgICAgICAgICAvKiBGYWxsIHRocm91Z2ggdG8gbG9hZCAqLworICAgICAgICBjYXNlIExvYWQ6CisgICAgICAgICAgICBBRERPUF9OQU1FKGMsIExPQURfQVRUUiwgZS0+di5BdHRyaWJ1dGUuYXR0ciwgbmFtZXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQXVnU3RvcmU6CisgICAgICAgICAgICBBRERPUChjLCBST1RfVFdPKTsKKyAgICAgICAgICAgIC8qIEZhbGwgdGhyb3VnaCB0byBzYXZlICovCisgICAgICAgIGNhc2UgU3RvcmU6CisgICAgICAgICAgICBBRERPUF9OQU1FKGMsIFNUT1JFX0FUVFIsIGUtPnYuQXR0cmlidXRlLmF0dHIsIG5hbWVzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIERlbDoKKyAgICAgICAgICAgIEFERE9QX05BTUUoYywgREVMRVRFX0FUVFIsIGUtPnYuQXR0cmlidXRlLmF0dHIsIG5hbWVzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFBhcmFtOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXJhbSBpbnZhbGlkIGluIGF0dHJpYnV0ZSBleHByZXNzaW9uIik7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFN1YnNjcmlwdF9raW5kOgorICAgICAgICBzd2l0Y2ggKGUtPnYuU3Vic2NyaXB0LmN0eCkgeworICAgICAgICBjYXNlIEF1Z0xvYWQ6CisgICAgICAgICAgICBWSVNJVChjLCBleHByLCBlLT52LlN1YnNjcmlwdC52YWx1ZSk7CisgICAgICAgICAgICBWSVNJVF9TTElDRShjLCBlLT52LlN1YnNjcmlwdC5zbGljZSwgQXVnTG9hZCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBMb2FkOgorICAgICAgICAgICAgVklTSVQoYywgZXhwciwgZS0+di5TdWJzY3JpcHQudmFsdWUpOworICAgICAgICAgICAgVklTSVRfU0xJQ0UoYywgZS0+di5TdWJzY3JpcHQuc2xpY2UsIExvYWQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQXVnU3RvcmU6CisgICAgICAgICAgICBWSVNJVF9TTElDRShjLCBlLT52LlN1YnNjcmlwdC5zbGljZSwgQXVnU3RvcmUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU3RvcmU6CisgICAgICAgICAgICBWSVNJVChjLCBleHByLCBlLT52LlN1YnNjcmlwdC52YWx1ZSk7CisgICAgICAgICAgICBWSVNJVF9TTElDRShjLCBlLT52LlN1YnNjcmlwdC5zbGljZSwgU3RvcmUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRGVsOgorICAgICAgICAgICAgVklTSVQoYywgZXhwciwgZS0+di5TdWJzY3JpcHQudmFsdWUpOworICAgICAgICAgICAgVklTSVRfU0xJQ0UoYywgZS0+di5TdWJzY3JpcHQuc2xpY2UsIERlbCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQYXJhbToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKKyAgICAgICAgICAgICAgICAicGFyYW0gaW52YWxpZCBpbiBzdWJzY3JpcHQgZXhwcmVzc2lvbiIpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBOYW1lX2tpbmQ6CisgICAgICAgIHJldHVybiBjb21waWxlcl9uYW1lb3AoYywgZS0+di5OYW1lLmlkLCBlLT52Lk5hbWUuY3R4KTsKKyAgICAvKiBjaGlsZCBub2RlcyBvZiBMaXN0IGFuZCBUdXBsZSB3aWxsIGhhdmUgZXhwcl9jb250ZXh0IHNldCAqLworICAgIGNhc2UgTGlzdF9raW5kOgorICAgICAgICByZXR1cm4gY29tcGlsZXJfbGlzdChjLCBlKTsKKyAgICBjYXNlIFR1cGxlX2tpbmQ6CisgICAgICAgIHJldHVybiBjb21waWxlcl90dXBsZShjLCBlKTsKKyAgICB9CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyBpbnQKIGNvbXBpbGVyX2F1Z2Fzc2lnbihzdHJ1Y3QgY29tcGlsZXIgKmMsIHN0bXRfdHkgcykKIHsKLQlleHByX3R5IGUgPSBzLT52LkF1Z0Fzc2lnbi50YXJnZXQ7Ci0JZXhwcl90eSBhdWdlOworICAgIGV4cHJfdHkgZSA9IHMtPnYuQXVnQXNzaWduLnRhcmdldDsKKyAgICBleHByX3R5IGF1Z2U7CiAKLQlhc3NlcnQocy0+a2luZCA9PSBBdWdBc3NpZ25fa2luZCk7CisgICAgYXNzZXJ0KHMtPmtpbmQgPT0gQXVnQXNzaWduX2tpbmQpOwogCi0Jc3dpdGNoIChlLT5raW5kKSB7Ci0JY2FzZSBBdHRyaWJ1dGVfa2luZDoKLQkJYXVnZSA9IEF0dHJpYnV0ZShlLT52LkF0dHJpYnV0ZS52YWx1ZSwgZS0+di5BdHRyaWJ1dGUuYXR0ciwKLQkJCQkgQXVnTG9hZCwgZS0+bGluZW5vLCBlLT5jb2xfb2Zmc2V0LCBjLT5jX2FyZW5hKTsKLQkJaWYgKGF1Z2UgPT0gTlVMTCkKLQkJICAgIHJldHVybiAwOwotCQlWSVNJVChjLCBleHByLCBhdWdlKTsKLQkJVklTSVQoYywgZXhwciwgcy0+di5BdWdBc3NpZ24udmFsdWUpOwotCQlBRERPUChjLCBpbnBsYWNlX2Jpbm9wKGMsIHMtPnYuQXVnQXNzaWduLm9wKSk7Ci0JCWF1Z2UtPnYuQXR0cmlidXRlLmN0eCA9IEF1Z1N0b3JlOwotCQlWSVNJVChjLCBleHByLCBhdWdlKTsKLQkJYnJlYWs7Ci0JY2FzZSBTdWJzY3JpcHRfa2luZDoKLQkJYXVnZSA9IFN1YnNjcmlwdChlLT52LlN1YnNjcmlwdC52YWx1ZSwgZS0+di5TdWJzY3JpcHQuc2xpY2UsCi0JCQkJIEF1Z0xvYWQsIGUtPmxpbmVubywgZS0+Y29sX29mZnNldCwgYy0+Y19hcmVuYSk7Ci0JCWlmIChhdWdlID09IE5VTEwpCi0JCSAgICByZXR1cm4gMDsKLQkJVklTSVQoYywgZXhwciwgYXVnZSk7Ci0JCVZJU0lUKGMsIGV4cHIsIHMtPnYuQXVnQXNzaWduLnZhbHVlKTsKLQkJQURET1AoYywgaW5wbGFjZV9iaW5vcChjLCBzLT52LkF1Z0Fzc2lnbi5vcCkpOwotCQlhdWdlLT52LlN1YnNjcmlwdC5jdHggPSBBdWdTdG9yZTsKLQkJVklTSVQoYywgZXhwciwgYXVnZSk7Ci0JCWJyZWFrOwotCWNhc2UgTmFtZV9raW5kOgotCQlpZiAoIWNvbXBpbGVyX25hbWVvcChjLCBlLT52Lk5hbWUuaWQsIExvYWQpKQotCQkgICAgcmV0dXJuIDA7Ci0JCVZJU0lUKGMsIGV4cHIsIHMtPnYuQXVnQXNzaWduLnZhbHVlKTsKLQkJQURET1AoYywgaW5wbGFjZV9iaW5vcChjLCBzLT52LkF1Z0Fzc2lnbi5vcCkpOwotCQlyZXR1cm4gY29tcGlsZXJfbmFtZW9wKGMsIGUtPnYuTmFtZS5pZCwgU3RvcmUpOwotCWRlZmF1bHQ6Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19TeXN0ZW1FcnJvciwgCi0JCQkiaW52YWxpZCBub2RlIHR5cGUgKCVkKSBmb3IgYXVnbWVudGVkIGFzc2lnbm1lbnQiLAotCQkJZS0+a2luZCk7Ci0JCXJldHVybiAwOwotCX0KLQlyZXR1cm4gMTsKKyAgICBzd2l0Y2ggKGUtPmtpbmQpIHsKKyAgICBjYXNlIEF0dHJpYnV0ZV9raW5kOgorICAgICAgICBhdWdlID0gQXR0cmlidXRlKGUtPnYuQXR0cmlidXRlLnZhbHVlLCBlLT52LkF0dHJpYnV0ZS5hdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgIEF1Z0xvYWQsIGUtPmxpbmVubywgZS0+Y29sX29mZnNldCwgYy0+Y19hcmVuYSk7CisgICAgICAgIGlmIChhdWdlID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgVklTSVQoYywgZXhwciwgYXVnZSk7CisgICAgICAgIFZJU0lUKGMsIGV4cHIsIHMtPnYuQXVnQXNzaWduLnZhbHVlKTsKKyAgICAgICAgQURET1AoYywgaW5wbGFjZV9iaW5vcChjLCBzLT52LkF1Z0Fzc2lnbi5vcCkpOworICAgICAgICBhdWdlLT52LkF0dHJpYnV0ZS5jdHggPSBBdWdTdG9yZTsKKyAgICAgICAgVklTSVQoYywgZXhwciwgYXVnZSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU3Vic2NyaXB0X2tpbmQ6CisgICAgICAgIGF1Z2UgPSBTdWJzY3JpcHQoZS0+di5TdWJzY3JpcHQudmFsdWUsIGUtPnYuU3Vic2NyaXB0LnNsaWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIEF1Z0xvYWQsIGUtPmxpbmVubywgZS0+Y29sX29mZnNldCwgYy0+Y19hcmVuYSk7CisgICAgICAgIGlmIChhdWdlID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgVklTSVQoYywgZXhwciwgYXVnZSk7CisgICAgICAgIFZJU0lUKGMsIGV4cHIsIHMtPnYuQXVnQXNzaWduLnZhbHVlKTsKKyAgICAgICAgQURET1AoYywgaW5wbGFjZV9iaW5vcChjLCBzLT52LkF1Z0Fzc2lnbi5vcCkpOworICAgICAgICBhdWdlLT52LlN1YnNjcmlwdC5jdHggPSBBdWdTdG9yZTsKKyAgICAgICAgVklTSVQoYywgZXhwciwgYXVnZSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTmFtZV9raW5kOgorICAgICAgICBpZiAoIWNvbXBpbGVyX25hbWVvcChjLCBlLT52Lk5hbWUuaWQsIExvYWQpKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIFZJU0lUKGMsIGV4cHIsIHMtPnYuQXVnQXNzaWduLnZhbHVlKTsKKyAgICAgICAgQURET1AoYywgaW5wbGFjZV9iaW5vcChjLCBzLT52LkF1Z0Fzc2lnbi5vcCkpOworICAgICAgICByZXR1cm4gY29tcGlsZXJfbmFtZW9wKGMsIGUtPnYuTmFtZS5pZCwgU3RvcmUpOworICAgIGRlZmF1bHQ6CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19TeXN0ZW1FcnJvciwKKyAgICAgICAgICAgICJpbnZhbGlkIG5vZGUgdHlwZSAoJWQpIGZvciBhdWdtZW50ZWQgYXNzaWdubWVudCIsCisgICAgICAgICAgICBlLT5raW5kKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgaW50CiBjb21waWxlcl9wdXNoX2ZibG9jayhzdHJ1Y3QgY29tcGlsZXIgKmMsIGVudW0gZmJsb2NrdHlwZSB0LCBiYXNpY2Jsb2NrICpiKQogewotCXN0cnVjdCBmYmxvY2tpbmZvICpmOwotCWlmIChjLT51LT51X25mYmxvY2tzID49IENPX01BWEJMT0NLUykgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCi0JCQkJInRvbyBtYW55IHN0YXRpY2FsbHkgbmVzdGVkIGJsb2NrcyIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JZiA9ICZjLT51LT51X2ZibG9ja1tjLT51LT51X25mYmxvY2tzKytdOwotCWYtPmZiX3R5cGUgPSB0OwotCWYtPmZiX2Jsb2NrID0gYjsKLQlyZXR1cm4gMTsKKyAgICBzdHJ1Y3QgZmJsb2NraW5mbyAqZjsKKyAgICBpZiAoYy0+dS0+dV9uZmJsb2NrcyA+PSBDT19NQVhCTE9DS1MpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInRvbyBtYW55IHN0YXRpY2FsbHkgbmVzdGVkIGJsb2NrcyIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZiA9ICZjLT51LT51X2ZibG9ja1tjLT51LT51X25mYmxvY2tzKytdOworICAgIGYtPmZiX3R5cGUgPSB0OworICAgIGYtPmZiX2Jsb2NrID0gYjsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIHZvaWQKIGNvbXBpbGVyX3BvcF9mYmxvY2soc3RydWN0IGNvbXBpbGVyICpjLCBlbnVtIGZibG9ja3R5cGUgdCwgYmFzaWNibG9jayAqYikKIHsKLQlzdHJ1Y3QgY29tcGlsZXJfdW5pdCAqdSA9IGMtPnU7Ci0JYXNzZXJ0KHUtPnVfbmZibG9ja3MgPiAwKTsKLQl1LT51X25mYmxvY2tzLS07Ci0JYXNzZXJ0KHUtPnVfZmJsb2NrW3UtPnVfbmZibG9ja3NdLmZiX3R5cGUgPT0gdCk7Ci0JYXNzZXJ0KHUtPnVfZmJsb2NrW3UtPnVfbmZibG9ja3NdLmZiX2Jsb2NrID09IGIpOworICAgIHN0cnVjdCBjb21waWxlcl91bml0ICp1ID0gYy0+dTsKKyAgICBhc3NlcnQodS0+dV9uZmJsb2NrcyA+IDApOworICAgIHUtPnVfbmZibG9ja3MtLTsKKyAgICBhc3NlcnQodS0+dV9mYmxvY2tbdS0+dV9uZmJsb2Nrc10uZmJfdHlwZSA9PSB0KTsKKyAgICBhc3NlcnQodS0+dV9mYmxvY2tbdS0+dV9uZmJsb2Nrc10uZmJfYmxvY2sgPT0gYik7CiB9CiAKIHN0YXRpYyBpbnQKIGNvbXBpbGVyX2luX2xvb3Aoc3RydWN0IGNvbXBpbGVyICpjKSB7Ci0JaW50IGk7Ci0Jc3RydWN0IGNvbXBpbGVyX3VuaXQgKnUgPSBjLT51OwotCWZvciAoaSA9IDA7IGkgPCB1LT51X25mYmxvY2tzOyArK2kpIHsKLQkJaWYgKHUtPnVfZmJsb2NrW2ldLmZiX3R5cGUgPT0gTE9PUCkKLQkJCXJldHVybiAxOwotCX0KLQlyZXR1cm4gMDsKKyAgICBpbnQgaTsKKyAgICBzdHJ1Y3QgY29tcGlsZXJfdW5pdCAqdSA9IGMtPnU7CisgICAgZm9yIChpID0gMDsgaSA8IHUtPnVfbmZibG9ja3M7ICsraSkgeworICAgICAgICBpZiAodS0+dV9mYmxvY2tbaV0uZmJfdHlwZSA9PSBMT09QKQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHJldHVybiAwOwogfQogLyogUmFpc2VzIGEgU3ludGF4RXJyb3IgYW5kIHJldHVybnMgMC4KICAgIElmIHNvbWV0aGluZyBnb2VzIHdyb25nLCBhIGRpZmZlcmVudCBleGNlcHRpb24gbWF5IGJlIHJhaXNlZC4KQEAgLTMxODAsMjA1ICszMTgwLDIwNSBAQAogc3RhdGljIGludAogY29tcGlsZXJfZXJyb3Ioc3RydWN0IGNvbXBpbGVyICpjLCBjb25zdCBjaGFyICplcnJzdHIpCiB7Ci0JUHlPYmplY3QgKmxvYzsKLQlQeU9iamVjdCAqdSA9IE5VTEwsICp2ID0gTlVMTDsKKyAgICBQeU9iamVjdCAqbG9jOworICAgIFB5T2JqZWN0ICp1ID0gTlVMTCwgKnYgPSBOVUxMOwogCi0JbG9jID0gUHlFcnJfUHJvZ3JhbVRleHQoYy0+Y19maWxlbmFtZSwgYy0+dS0+dV9saW5lbm8pOwotCWlmICghbG9jKSB7Ci0JCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJbG9jID0gUHlfTm9uZTsKLQl9Ci0JdSA9IFB5X0J1aWxkVmFsdWUoIih6aU9PKSIsIGMtPmNfZmlsZW5hbWUsIGMtPnUtPnVfbGluZW5vLAotCQkJICBQeV9Ob25lLCBsb2MpOwotCWlmICghdSkKLQkJZ290byBleGl0OwotCXYgPSBQeV9CdWlsZFZhbHVlKCIoek8pIiwgZXJyc3RyLCB1KTsKLQlpZiAoIXYpCi0JCWdvdG8gZXhpdDsKLQlQeUVycl9TZXRPYmplY3QoUHlFeGNfU3ludGF4RXJyb3IsIHYpOworICAgIGxvYyA9IFB5RXJyX1Byb2dyYW1UZXh0KGMtPmNfZmlsZW5hbWUsIGMtPnUtPnVfbGluZW5vKTsKKyAgICBpZiAoIWxvYykgeworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIGxvYyA9IFB5X05vbmU7CisgICAgfQorICAgIHUgPSBQeV9CdWlsZFZhbHVlKCIoemlPTykiLCBjLT5jX2ZpbGVuYW1lLCBjLT51LT51X2xpbmVubywKKyAgICAgICAgICAgICAgICAgICAgICBQeV9Ob25lLCBsb2MpOworICAgIGlmICghdSkKKyAgICAgICAgZ290byBleGl0OworICAgIHYgPSBQeV9CdWlsZFZhbHVlKCIoek8pIiwgZXJyc3RyLCB1KTsKKyAgICBpZiAoIXYpCisgICAgICAgIGdvdG8gZXhpdDsKKyAgICBQeUVycl9TZXRPYmplY3QoUHlFeGNfU3ludGF4RXJyb3IsIHYpOwogIGV4aXQ6Ci0JUHlfREVDUkVGKGxvYyk7Ci0JUHlfWERFQ1JFRih1KTsKLQlQeV9YREVDUkVGKHYpOwotCXJldHVybiAwOworICAgIFB5X0RFQ1JFRihsb2MpOworICAgIFB5X1hERUNSRUYodSk7CisgICAgUHlfWERFQ1JFRih2KTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAotY29tcGlsZXJfaGFuZGxlX3N1YnNjcihzdHJ1Y3QgY29tcGlsZXIgKmMsIGNvbnN0IGNoYXIgKmtpbmQsIAotCQkgICAgICAgZXhwcl9jb250ZXh0X3R5IGN0eCkgCitjb21waWxlcl9oYW5kbGVfc3Vic2NyKHN0cnVjdCBjb21waWxlciAqYywgY29uc3QgY2hhciAqa2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgZXhwcl9jb250ZXh0X3R5IGN0eCkKIHsKLQlpbnQgb3AgPSAwOworICAgIGludCBvcCA9IDA7CiAKLQkvKiBYWFggdGhpcyBjb2RlIGlzIGR1cGxpY2F0ZWQgKi8KLQlzd2l0Y2ggKGN0eCkgewotCQljYXNlIEF1Z0xvYWQ6IC8qIGZhbGwgdGhyb3VnaCB0byBMb2FkICovCi0JCWNhc2UgTG9hZDogICAgb3AgPSBCSU5BUllfU1VCU0NSOyBicmVhazsKLQkJY2FzZSBBdWdTdG9yZTovKiBmYWxsIHRocm91Z2ggdG8gU3RvcmUgKi8KLQkJY2FzZSBTdG9yZTogICBvcCA9IFNUT1JFX1NVQlNDUjsgYnJlYWs7Ci0JCWNhc2UgRGVsOiAgICAgb3AgPSBERUxFVEVfU1VCU0NSOyBicmVhazsKLQkJY2FzZSBQYXJhbToKLQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19TeXN0ZW1FcnJvciwgCi0JCQkJICAgICAiaW52YWxpZCAlcyBraW5kICVkIGluIHN1YnNjcmlwdFxuIiwgCi0JCQkJICAgICBraW5kLCBjdHgpOwotCQkJcmV0dXJuIDA7Ci0JfQotCWlmIChjdHggPT0gQXVnTG9hZCkgewotCQlBRERPUF9JKGMsIERVUF9UT1BYLCAyKTsKLQl9Ci0JZWxzZSBpZiAoY3R4ID09IEF1Z1N0b3JlKSB7Ci0JCUFERE9QKGMsIFJPVF9USFJFRSk7Ci0JfQotCUFERE9QKGMsIG9wKTsKLQlyZXR1cm4gMTsKKyAgICAvKiBYWFggdGhpcyBjb2RlIGlzIGR1cGxpY2F0ZWQgKi8KKyAgICBzd2l0Y2ggKGN0eCkgeworICAgICAgICBjYXNlIEF1Z0xvYWQ6IC8qIGZhbGwgdGhyb3VnaCB0byBMb2FkICovCisgICAgICAgIGNhc2UgTG9hZDogICAgb3AgPSBCSU5BUllfU1VCU0NSOyBicmVhazsKKyAgICAgICAgY2FzZSBBdWdTdG9yZTovKiBmYWxsIHRocm91Z2ggdG8gU3RvcmUgKi8KKyAgICAgICAgY2FzZSBTdG9yZTogICBvcCA9IFNUT1JFX1NVQlNDUjsgYnJlYWs7CisgICAgICAgIGNhc2UgRGVsOiAgICAgb3AgPSBERUxFVEVfU1VCU0NSOyBicmVhazsKKyAgICAgICAgY2FzZSBQYXJhbToKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19TeXN0ZW1FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCAlcyBraW5kICVkIGluIHN1YnNjcmlwdFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBraW5kLCBjdHgpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChjdHggPT0gQXVnTG9hZCkgeworICAgICAgICBBRERPUF9JKGMsIERVUF9UT1BYLCAyKTsKKyAgICB9CisgICAgZWxzZSBpZiAoY3R4ID09IEF1Z1N0b3JlKSB7CisgICAgICAgIEFERE9QKGMsIFJPVF9USFJFRSk7CisgICAgfQorICAgIEFERE9QKGMsIG9wKTsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIGludAogY29tcGlsZXJfc2xpY2Uoc3RydWN0IGNvbXBpbGVyICpjLCBzbGljZV90eSBzLCBleHByX2NvbnRleHRfdHkgY3R4KQogewotCWludCBuID0gMjsKLQlhc3NlcnQocy0+a2luZCA9PSBTbGljZV9raW5kKTsKKyAgICBpbnQgbiA9IDI7CisgICAgYXNzZXJ0KHMtPmtpbmQgPT0gU2xpY2Vfa2luZCk7CiAKLQkvKiBvbmx5IGhhbmRsZXMgdGhlIGNhc2VzIHdoZXJlIEJVSUxEX1NMSUNFIGlzIGVtaXR0ZWQgKi8KLQlpZiAocy0+di5TbGljZS5sb3dlcikgewotCQlWSVNJVChjLCBleHByLCBzLT52LlNsaWNlLmxvd2VyKTsKLQl9Ci0JZWxzZSB7Ci0JCUFERE9QX08oYywgTE9BRF9DT05TVCwgUHlfTm9uZSwgY29uc3RzKTsKLQl9Ci0JCQotCWlmIChzLT52LlNsaWNlLnVwcGVyKSB7Ci0JCVZJU0lUKGMsIGV4cHIsIHMtPnYuU2xpY2UudXBwZXIpOwotCX0KLQllbHNlIHsKLQkJQURET1BfTyhjLCBMT0FEX0NPTlNULCBQeV9Ob25lLCBjb25zdHMpOwotCX0KKyAgICAvKiBvbmx5IGhhbmRsZXMgdGhlIGNhc2VzIHdoZXJlIEJVSUxEX1NMSUNFIGlzIGVtaXR0ZWQgKi8KKyAgICBpZiAocy0+di5TbGljZS5sb3dlcikgeworICAgICAgICBWSVNJVChjLCBleHByLCBzLT52LlNsaWNlLmxvd2VyKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIEFERE9QX08oYywgTE9BRF9DT05TVCwgUHlfTm9uZSwgY29uc3RzKTsKKyAgICB9CiAKLQlpZiAocy0+di5TbGljZS5zdGVwKSB7Ci0JCW4rKzsKLQkJVklTSVQoYywgZXhwciwgcy0+di5TbGljZS5zdGVwKTsKLQl9Ci0JQURET1BfSShjLCBCVUlMRF9TTElDRSwgbik7Ci0JcmV0dXJuIDE7CisgICAgaWYgKHMtPnYuU2xpY2UudXBwZXIpIHsKKyAgICAgICAgVklTSVQoYywgZXhwciwgcy0+di5TbGljZS51cHBlcik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBBRERPUF9PKGMsIExPQURfQ09OU1QsIFB5X05vbmUsIGNvbnN0cyk7CisgICAgfQorCisgICAgaWYgKHMtPnYuU2xpY2Uuc3RlcCkgeworICAgICAgICBuKys7CisgICAgICAgIFZJU0lUKGMsIGV4cHIsIHMtPnYuU2xpY2Uuc3RlcCk7CisgICAgfQorICAgIEFERE9QX0koYywgQlVJTERfU0xJQ0UsIG4pOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgaW50CiBjb21waWxlcl9zaW1wbGVfc2xpY2Uoc3RydWN0IGNvbXBpbGVyICpjLCBzbGljZV90eSBzLCBleHByX2NvbnRleHRfdHkgY3R4KQogewotCWludCBvcCA9IDAsIHNsaWNlX29mZnNldCA9IDAsIHN0YWNrX2NvdW50ID0gMDsKKyAgICBpbnQgb3AgPSAwLCBzbGljZV9vZmZzZXQgPSAwLCBzdGFja19jb3VudCA9IDA7CiAKLQlhc3NlcnQocy0+di5TbGljZS5zdGVwID09IE5VTEwpOwotCWlmIChzLT52LlNsaWNlLmxvd2VyKSB7Ci0JCXNsaWNlX29mZnNldCsrOwotCQlzdGFja19jb3VudCsrOwotCQlpZiAoY3R4ICE9IEF1Z1N0b3JlKSAKLQkJCVZJU0lUKGMsIGV4cHIsIHMtPnYuU2xpY2UubG93ZXIpOwotCX0KLQlpZiAocy0+di5TbGljZS51cHBlcikgewotCQlzbGljZV9vZmZzZXQgKz0gMjsKLQkJc3RhY2tfY291bnQrKzsKLQkJaWYgKGN0eCAhPSBBdWdTdG9yZSkgCi0JCQlWSVNJVChjLCBleHByLCBzLT52LlNsaWNlLnVwcGVyKTsKLQl9CisgICAgYXNzZXJ0KHMtPnYuU2xpY2Uuc3RlcCA9PSBOVUxMKTsKKyAgICBpZiAocy0+di5TbGljZS5sb3dlcikgeworICAgICAgICBzbGljZV9vZmZzZXQrKzsKKyAgICAgICAgc3RhY2tfY291bnQrKzsKKyAgICAgICAgaWYgKGN0eCAhPSBBdWdTdG9yZSkKKyAgICAgICAgICAgIFZJU0lUKGMsIGV4cHIsIHMtPnYuU2xpY2UubG93ZXIpOworICAgIH0KKyAgICBpZiAocy0+di5TbGljZS51cHBlcikgeworICAgICAgICBzbGljZV9vZmZzZXQgKz0gMjsKKyAgICAgICAgc3RhY2tfY291bnQrKzsKKyAgICAgICAgaWYgKGN0eCAhPSBBdWdTdG9yZSkKKyAgICAgICAgICAgIFZJU0lUKGMsIGV4cHIsIHMtPnYuU2xpY2UudXBwZXIpOworICAgIH0KIAotCWlmIChjdHggPT0gQXVnTG9hZCkgewotCQlzd2l0Y2ggKHN0YWNrX2NvdW50KSB7Ci0JCWNhc2UgMDogQURET1AoYywgRFVQX1RPUCk7IGJyZWFrOwotCQljYXNlIDE6IEFERE9QX0koYywgRFVQX1RPUFgsIDIpOyBicmVhazsKLQkJY2FzZSAyOiBBRERPUF9JKGMsIERVUF9UT1BYLCAzKTsgYnJlYWs7Ci0JCX0KLQl9Ci0JZWxzZSBpZiAoY3R4ID09IEF1Z1N0b3JlKSB7Ci0JCXN3aXRjaCAoc3RhY2tfY291bnQpIHsKLQkJY2FzZSAwOiBBRERPUChjLCBST1RfVFdPKTsgYnJlYWs7Ci0JCWNhc2UgMTogQURET1AoYywgUk9UX1RIUkVFKTsgYnJlYWs7Ci0JCWNhc2UgMjogQURET1AoYywgUk9UX0ZPVVIpOyBicmVhazsKLQkJfQotCX0KKyAgICBpZiAoY3R4ID09IEF1Z0xvYWQpIHsKKyAgICAgICAgc3dpdGNoIChzdGFja19jb3VudCkgeworICAgICAgICBjYXNlIDA6IEFERE9QKGMsIERVUF9UT1ApOyBicmVhazsKKyAgICAgICAgY2FzZSAxOiBBRERPUF9JKGMsIERVUF9UT1BYLCAyKTsgYnJlYWs7CisgICAgICAgIGNhc2UgMjogQURET1BfSShjLCBEVVBfVE9QWCwgMyk7IGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKGN0eCA9PSBBdWdTdG9yZSkgeworICAgICAgICBzd2l0Y2ggKHN0YWNrX2NvdW50KSB7CisgICAgICAgIGNhc2UgMDogQURET1AoYywgUk9UX1RXTyk7IGJyZWFrOworICAgICAgICBjYXNlIDE6IEFERE9QKGMsIFJPVF9USFJFRSk7IGJyZWFrOworICAgICAgICBjYXNlIDI6IEFERE9QKGMsIFJPVF9GT1VSKTsgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CiAKLQlzd2l0Y2ggKGN0eCkgewotCWNhc2UgQXVnTG9hZDogLyogZmFsbCB0aHJvdWdoIHRvIExvYWQgKi8KLQljYXNlIExvYWQ6IG9wID0gU0xJQ0U7IGJyZWFrOwotCWNhc2UgQXVnU3RvcmU6LyogZmFsbCB0aHJvdWdoIHRvIFN0b3JlICovCi0JY2FzZSBTdG9yZTogb3AgPSBTVE9SRV9TTElDRTsgYnJlYWs7Ci0JY2FzZSBEZWw6IG9wID0gREVMRVRFX1NMSUNFOyBicmVhazsKLQljYXNlIFBhcmFtOgotCWRlZmF1bHQ6Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKLQkJCQkicGFyYW0gaW52YWxpZCBpbiBzaW1wbGUgc2xpY2UiKTsKLQkJcmV0dXJuIDA7Ci0JfQorICAgIHN3aXRjaCAoY3R4KSB7CisgICAgY2FzZSBBdWdMb2FkOiAvKiBmYWxsIHRocm91Z2ggdG8gTG9hZCAqLworICAgIGNhc2UgTG9hZDogb3AgPSBTTElDRTsgYnJlYWs7CisgICAgY2FzZSBBdWdTdG9yZTovKiBmYWxsIHRocm91Z2ggdG8gU3RvcmUgKi8KKyAgICBjYXNlIFN0b3JlOiBvcCA9IFNUT1JFX1NMSUNFOyBicmVhazsKKyAgICBjYXNlIERlbDogb3AgPSBERUxFVEVfU0xJQ0U7IGJyZWFrOworICAgIGNhc2UgUGFyYW06CisgICAgZGVmYXVsdDoKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInBhcmFtIGludmFsaWQgaW4gc2ltcGxlIHNsaWNlIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KIAotCUFERE9QKGMsIG9wICsgc2xpY2Vfb2Zmc2V0KTsKLQlyZXR1cm4gMTsKKyAgICBBRERPUChjLCBvcCArIHNsaWNlX29mZnNldCk7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyBpbnQKLWNvbXBpbGVyX3Zpc2l0X25lc3RlZF9zbGljZShzdHJ1Y3QgY29tcGlsZXIgKmMsIHNsaWNlX3R5IHMsIAotCQkJICAgIGV4cHJfY29udGV4dF90eSBjdHgpCitjb21waWxlcl92aXNpdF9uZXN0ZWRfc2xpY2Uoc3RydWN0IGNvbXBpbGVyICpjLCBzbGljZV90eSBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJfY29udGV4dF90eSBjdHgpCiB7Ci0Jc3dpdGNoIChzLT5raW5kKSB7Ci0JY2FzZSBFbGxpcHNpc19raW5kOgotCQlBRERPUF9PKGMsIExPQURfQ09OU1QsIFB5X0VsbGlwc2lzLCBjb25zdHMpOwotCQlicmVhazsKLQljYXNlIFNsaWNlX2tpbmQ6Ci0JCXJldHVybiBjb21waWxlcl9zbGljZShjLCBzLCBjdHgpOwotCWNhc2UgSW5kZXhfa2luZDoKLQkJVklTSVQoYywgZXhwciwgcy0+di5JbmRleC52YWx1ZSk7Ci0JCWJyZWFrOwotCWNhc2UgRXh0U2xpY2Vfa2luZDoKLQlkZWZhdWx0OgotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCi0JCQkJImV4dGVuZGVkIHNsaWNlIGludmFsaWQgaW4gbmVzdGVkIHNsaWNlIik7Ci0JCXJldHVybiAwOwotCX0KLQlyZXR1cm4gMTsKKyAgICBzd2l0Y2ggKHMtPmtpbmQpIHsKKyAgICBjYXNlIEVsbGlwc2lzX2tpbmQ6CisgICAgICAgIEFERE9QX08oYywgTE9BRF9DT05TVCwgUHlfRWxsaXBzaXMsIGNvbnN0cyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU2xpY2Vfa2luZDoKKyAgICAgICAgcmV0dXJuIGNvbXBpbGVyX3NsaWNlKGMsIHMsIGN0eCk7CisgICAgY2FzZSBJbmRleF9raW5kOgorICAgICAgICBWSVNJVChjLCBleHByLCBzLT52LkluZGV4LnZhbHVlKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFeHRTbGljZV9raW5kOgorICAgIGRlZmF1bHQ6CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJleHRlbmRlZCBzbGljZSBpbnZhbGlkIGluIG5lc3RlZCBzbGljZSIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyBpbnQKIGNvbXBpbGVyX3Zpc2l0X3NsaWNlKHN0cnVjdCBjb21waWxlciAqYywgc2xpY2VfdHkgcywgZXhwcl9jb250ZXh0X3R5IGN0eCkKIHsKLQljaGFyICoga2luZG5hbWUgPSBOVUxMOwotCXN3aXRjaCAocy0+a2luZCkgewotCWNhc2UgSW5kZXhfa2luZDoKLQkJa2luZG5hbWUgPSAiaW5kZXgiOwotCQlpZiAoY3R4ICE9IEF1Z1N0b3JlKSB7Ci0JCQlWSVNJVChjLCBleHByLCBzLT52LkluZGV4LnZhbHVlKTsKLQkJfQotCQlicmVhazsKLQljYXNlIEVsbGlwc2lzX2tpbmQ6Ci0JCWtpbmRuYW1lID0gImVsbGlwc2lzIjsKLQkJaWYgKGN0eCAhPSBBdWdTdG9yZSkgewotCQkJQURET1BfTyhjLCBMT0FEX0NPTlNULCBQeV9FbGxpcHNpcywgY29uc3RzKTsKLQkJfQotCQlicmVhazsKLQljYXNlIFNsaWNlX2tpbmQ6Ci0JCWtpbmRuYW1lID0gInNsaWNlIjsKLQkJaWYgKCFzLT52LlNsaWNlLnN0ZXApIAotCQkJcmV0dXJuIGNvbXBpbGVyX3NpbXBsZV9zbGljZShjLCBzLCBjdHgpOwotCQlpZiAoY3R4ICE9IEF1Z1N0b3JlKSB7Ci0JCQlpZiAoIWNvbXBpbGVyX3NsaWNlKGMsIHMsIGN0eCkpCi0JCQkJcmV0dXJuIDA7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBFeHRTbGljZV9raW5kOgotCQlraW5kbmFtZSA9ICJleHRlbmRlZCBzbGljZSI7Ci0JCWlmIChjdHggIT0gQXVnU3RvcmUpIHsKLQkJCWludCBpLCBuID0gYXNkbF9zZXFfTEVOKHMtPnYuRXh0U2xpY2UuZGltcyk7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCQkJc2xpY2VfdHkgc3ViID0gKHNsaWNlX3R5KWFzZGxfc2VxX0dFVCgKLQkJCQkJcy0+di5FeHRTbGljZS5kaW1zLCBpKTsKLQkJCQlpZiAoIWNvbXBpbGVyX3Zpc2l0X25lc3RlZF9zbGljZShjLCBzdWIsIGN0eCkpCi0JCQkJCXJldHVybiAwOwotCQkJfQotCQkJQURET1BfSShjLCBCVUlMRF9UVVBMRSwgbik7Ci0JCX0KLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1N5c3RlbUVycm9yLAotCQkJICAgICAiaW52YWxpZCBzdWJzY3JpcHQga2luZCAlZCIsIHMtPmtpbmQpOwotCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIGNvbXBpbGVyX2hhbmRsZV9zdWJzY3IoYywga2luZG5hbWUsIGN0eCk7CisgICAgY2hhciAqIGtpbmRuYW1lID0gTlVMTDsKKyAgICBzd2l0Y2ggKHMtPmtpbmQpIHsKKyAgICBjYXNlIEluZGV4X2tpbmQ6CisgICAgICAgIGtpbmRuYW1lID0gImluZGV4IjsKKyAgICAgICAgaWYgKGN0eCAhPSBBdWdTdG9yZSkgeworICAgICAgICAgICAgVklTSVQoYywgZXhwciwgcy0+di5JbmRleC52YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFbGxpcHNpc19raW5kOgorICAgICAgICBraW5kbmFtZSA9ICJlbGxpcHNpcyI7CisgICAgICAgIGlmIChjdHggIT0gQXVnU3RvcmUpIHsKKyAgICAgICAgICAgIEFERE9QX08oYywgTE9BRF9DT05TVCwgUHlfRWxsaXBzaXMsIGNvbnN0cyk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTbGljZV9raW5kOgorICAgICAgICBraW5kbmFtZSA9ICJzbGljZSI7CisgICAgICAgIGlmICghcy0+di5TbGljZS5zdGVwKQorICAgICAgICAgICAgcmV0dXJuIGNvbXBpbGVyX3NpbXBsZV9zbGljZShjLCBzLCBjdHgpOworICAgICAgICBpZiAoY3R4ICE9IEF1Z1N0b3JlKSB7CisgICAgICAgICAgICBpZiAoIWNvbXBpbGVyX3NsaWNlKGMsIHMsIGN0eCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFeHRTbGljZV9raW5kOgorICAgICAgICBraW5kbmFtZSA9ICJleHRlbmRlZCBzbGljZSI7CisgICAgICAgIGlmIChjdHggIT0gQXVnU3RvcmUpIHsKKyAgICAgICAgICAgIGludCBpLCBuID0gYXNkbF9zZXFfTEVOKHMtPnYuRXh0U2xpY2UuZGltcyk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgc2xpY2VfdHkgc3ViID0gKHNsaWNlX3R5KWFzZGxfc2VxX0dFVCgKKyAgICAgICAgICAgICAgICAgICAgcy0+di5FeHRTbGljZS5kaW1zLCBpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWNvbXBpbGVyX3Zpc2l0X25lc3RlZF9zbGljZShjLCBzdWIsIGN0eCkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQURET1BfSShjLCBCVUlMRF9UVVBMRSwgbik7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgImludmFsaWQgc3Vic2NyaXB0IGtpbmQgJWQiLCBzLT5raW5kKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiBjb21waWxlcl9oYW5kbGVfc3Vic2NyKGMsIGtpbmRuYW1lLCBjdHgpOwogfQogCiAKQEAgLTMzOTEsNjQgKzMzOTEsNjQgQEAKICovCiAKIHN0cnVjdCBhc3NlbWJsZXIgewotCVB5T2JqZWN0ICphX2J5dGVjb2RlOyAgLyogc3RyaW5nIGNvbnRhaW5pbmcgYnl0ZWNvZGUgKi8KLQlpbnQgYV9vZmZzZXQ7CSAgICAgICAvKiBvZmZzZXQgaW50byBieXRlY29kZSAqLwotCWludCBhX25ibG9ja3M7CSAgICAgICAvKiBudW1iZXIgb2YgcmVhY2hhYmxlIGJsb2NrcyAqLwotCWJhc2ljYmxvY2sgKiphX3Bvc3RvcmRlcjsgLyogbGlzdCBvZiBibG9ja3MgaW4gZGZzIHBvc3RvcmRlciAqLwotCVB5T2JqZWN0ICphX2xub3RhYjsgICAgLyogc3RyaW5nIGNvbnRhaW5pbmcgbG5vdGFiICovCi0JaW50IGFfbG5vdGFiX29mZjsgICAgICAvKiBvZmZzZXQgaW50byBsbm90YWIgKi8KLQlpbnQgYV9saW5lbm87CSAgICAgICAvKiBsYXN0IGxpbmVubyBvZiBlbWl0dGVkIGluc3RydWN0aW9uICovCi0JaW50IGFfbGluZW5vX29mZjsgICAgICAvKiBieXRlY29kZSBvZmZzZXQgb2YgbGFzdCBsaW5lbm8gKi8KKyAgICBQeU9iamVjdCAqYV9ieXRlY29kZTsgIC8qIHN0cmluZyBjb250YWluaW5nIGJ5dGVjb2RlICovCisgICAgaW50IGFfb2Zmc2V0OyAgICAgICAgICAgICAgLyogb2Zmc2V0IGludG8gYnl0ZWNvZGUgKi8KKyAgICBpbnQgYV9uYmxvY2tzOyAgICAgICAgICAgICAvKiBudW1iZXIgb2YgcmVhY2hhYmxlIGJsb2NrcyAqLworICAgIGJhc2ljYmxvY2sgKiphX3Bvc3RvcmRlcjsgLyogbGlzdCBvZiBibG9ja3MgaW4gZGZzIHBvc3RvcmRlciAqLworICAgIFB5T2JqZWN0ICphX2xub3RhYjsgICAgLyogc3RyaW5nIGNvbnRhaW5pbmcgbG5vdGFiICovCisgICAgaW50IGFfbG5vdGFiX29mZjsgICAgICAvKiBvZmZzZXQgaW50byBsbm90YWIgKi8KKyAgICBpbnQgYV9saW5lbm87ICAgICAgICAgICAgICAvKiBsYXN0IGxpbmVubyBvZiBlbWl0dGVkIGluc3RydWN0aW9uICovCisgICAgaW50IGFfbGluZW5vX29mZjsgICAgICAvKiBieXRlY29kZSBvZmZzZXQgb2YgbGFzdCBsaW5lbm8gKi8KIH07CiAKIHN0YXRpYyB2b2lkCiBkZnMoc3RydWN0IGNvbXBpbGVyICpjLCBiYXNpY2Jsb2NrICpiLCBzdHJ1Y3QgYXNzZW1ibGVyICphKQogewotCWludCBpOwotCXN0cnVjdCBpbnN0ciAqaW5zdHIgPSBOVUxMOworICAgIGludCBpOworICAgIHN0cnVjdCBpbnN0ciAqaW5zdHIgPSBOVUxMOwogCi0JaWYgKGItPmJfc2VlbikKLQkJcmV0dXJuOwotCWItPmJfc2VlbiA9IDE7Ci0JaWYgKGItPmJfbmV4dCAhPSBOVUxMKQotCQlkZnMoYywgYi0+Yl9uZXh0LCBhKTsKLQlmb3IgKGkgPSAwOyBpIDwgYi0+Yl9pdXNlZDsgaSsrKSB7Ci0JCWluc3RyID0gJmItPmJfaW5zdHJbaV07Ci0JCWlmIChpbnN0ci0+aV9qcmVsIHx8IGluc3RyLT5pX2phYnMpCi0JCQlkZnMoYywgaW5zdHItPmlfdGFyZ2V0LCBhKTsKLQl9Ci0JYS0+YV9wb3N0b3JkZXJbYS0+YV9uYmxvY2tzKytdID0gYjsKKyAgICBpZiAoYi0+Yl9zZWVuKQorICAgICAgICByZXR1cm47CisgICAgYi0+Yl9zZWVuID0gMTsKKyAgICBpZiAoYi0+Yl9uZXh0ICE9IE5VTEwpCisgICAgICAgIGRmcyhjLCBiLT5iX25leHQsIGEpOworICAgIGZvciAoaSA9IDA7IGkgPCBiLT5iX2l1c2VkOyBpKyspIHsKKyAgICAgICAgaW5zdHIgPSAmYi0+Yl9pbnN0cltpXTsKKyAgICAgICAgaWYgKGluc3RyLT5pX2pyZWwgfHwgaW5zdHItPmlfamFicykKKyAgICAgICAgICAgIGRmcyhjLCBpbnN0ci0+aV90YXJnZXQsIGEpOworICAgIH0KKyAgICBhLT5hX3Bvc3RvcmRlclthLT5hX25ibG9ja3MrK10gPSBiOwogfQogCiBzdGF0aWMgaW50CiBzdGFja2RlcHRoX3dhbGsoc3RydWN0IGNvbXBpbGVyICpjLCBiYXNpY2Jsb2NrICpiLCBpbnQgZGVwdGgsIGludCBtYXhkZXB0aCkKIHsKLQlpbnQgaTsKLQlzdHJ1Y3QgaW5zdHIgKmluc3RyOwotCWlmIChiLT5iX3NlZW4gfHwgYi0+Yl9zdGFydGRlcHRoID49IGRlcHRoKQotCQlyZXR1cm4gbWF4ZGVwdGg7Ci0JYi0+Yl9zZWVuID0gMTsKLQliLT5iX3N0YXJ0ZGVwdGggPSBkZXB0aDsKLQlmb3IgKGkgPSAwOyBpIDwgYi0+Yl9pdXNlZDsgaSsrKSB7Ci0JCWluc3RyID0gJmItPmJfaW5zdHJbaV07Ci0JCWRlcHRoICs9IG9wY29kZV9zdGFja19lZmZlY3QoaW5zdHItPmlfb3Bjb2RlLCBpbnN0ci0+aV9vcGFyZyk7Ci0JCWlmIChkZXB0aCA+IG1heGRlcHRoKQotCQkJbWF4ZGVwdGggPSBkZXB0aDsKLQkJYXNzZXJ0KGRlcHRoID49IDApOyAvKiBpbnZhbGlkIGNvZGUgb3IgYnVnIGluIHN0YWNrZGVwdGgoKSAqLwotCQlpZiAoaW5zdHItPmlfanJlbCB8fCBpbnN0ci0+aV9qYWJzKSB7Ci0JCQltYXhkZXB0aCA9IHN0YWNrZGVwdGhfd2FsayhjLCBpbnN0ci0+aV90YXJnZXQsCi0JCQkJCQkgICBkZXB0aCwgbWF4ZGVwdGgpOwotCQkJaWYgKGluc3RyLT5pX29wY29kZSA9PSBKVU1QX0FCU09MVVRFIHx8Ci0JCQkgICAgaW5zdHItPmlfb3Bjb2RlID09IEpVTVBfRk9SV0FSRCkgewotCQkJCWdvdG8gb3V0OyAvKiByZW1haW5pbmcgY29kZSBpcyBkZWFkICovCi0JCQl9Ci0JCX0KLQl9Ci0JaWYgKGItPmJfbmV4dCkKLQkJbWF4ZGVwdGggPSBzdGFja2RlcHRoX3dhbGsoYywgYi0+Yl9uZXh0LCBkZXB0aCwgbWF4ZGVwdGgpOworICAgIGludCBpOworICAgIHN0cnVjdCBpbnN0ciAqaW5zdHI7CisgICAgaWYgKGItPmJfc2VlbiB8fCBiLT5iX3N0YXJ0ZGVwdGggPj0gZGVwdGgpCisgICAgICAgIHJldHVybiBtYXhkZXB0aDsKKyAgICBiLT5iX3NlZW4gPSAxOworICAgIGItPmJfc3RhcnRkZXB0aCA9IGRlcHRoOworICAgIGZvciAoaSA9IDA7IGkgPCBiLT5iX2l1c2VkOyBpKyspIHsKKyAgICAgICAgaW5zdHIgPSAmYi0+Yl9pbnN0cltpXTsKKyAgICAgICAgZGVwdGggKz0gb3Bjb2RlX3N0YWNrX2VmZmVjdChpbnN0ci0+aV9vcGNvZGUsIGluc3RyLT5pX29wYXJnKTsKKyAgICAgICAgaWYgKGRlcHRoID4gbWF4ZGVwdGgpCisgICAgICAgICAgICBtYXhkZXB0aCA9IGRlcHRoOworICAgICAgICBhc3NlcnQoZGVwdGggPj0gMCk7IC8qIGludmFsaWQgY29kZSBvciBidWcgaW4gc3RhY2tkZXB0aCgpICovCisgICAgICAgIGlmIChpbnN0ci0+aV9qcmVsIHx8IGluc3RyLT5pX2phYnMpIHsKKyAgICAgICAgICAgIG1heGRlcHRoID0gc3RhY2tkZXB0aF93YWxrKGMsIGluc3RyLT5pX3RhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoLCBtYXhkZXB0aCk7CisgICAgICAgICAgICBpZiAoaW5zdHItPmlfb3Bjb2RlID09IEpVTVBfQUJTT0xVVEUgfHwKKyAgICAgICAgICAgICAgICBpbnN0ci0+aV9vcGNvZGUgPT0gSlVNUF9GT1JXQVJEKSB7CisgICAgICAgICAgICAgICAgZ290byBvdXQ7IC8qIHJlbWFpbmluZyBjb2RlIGlzIGRlYWQgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoYi0+Yl9uZXh0KQorICAgICAgICBtYXhkZXB0aCA9IHN0YWNrZGVwdGhfd2FsayhjLCBiLT5iX25leHQsIGRlcHRoLCBtYXhkZXB0aCk7CiBvdXQ6Ci0JYi0+Yl9zZWVuID0gMDsKLQlyZXR1cm4gbWF4ZGVwdGg7CisgICAgYi0+Yl9zZWVuID0gMDsKKyAgICByZXR1cm4gbWF4ZGVwdGg7CiB9CiAKIC8qIEZpbmQgdGhlIGZsb3cgcGF0aCB0aGF0IG5lZWRzIHRoZSBsYXJnZXN0IHN0YWNrLiAgV2UgYXNzdW1lIHRoYXQKQEAgLTM0NTcsNDkgKzM0NTcsNDkgQEAKIHN0YXRpYyBpbnQKIHN0YWNrZGVwdGgoc3RydWN0IGNvbXBpbGVyICpjKQogewotCWJhc2ljYmxvY2sgKmIsICplbnRyeWJsb2NrOwotCWVudHJ5YmxvY2sgPSBOVUxMOwotCWZvciAoYiA9IGMtPnUtPnVfYmxvY2tzOyBiICE9IE5VTEw7IGIgPSBiLT5iX2xpc3QpIHsKLQkJYi0+Yl9zZWVuID0gMDsKLQkJYi0+Yl9zdGFydGRlcHRoID0gSU5UX01JTjsKLQkJZW50cnlibG9jayA9IGI7Ci0JfQotCWlmICghZW50cnlibG9jaykKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIHN0YWNrZGVwdGhfd2FsayhjLCBlbnRyeWJsb2NrLCAwLCAwKTsKKyAgICBiYXNpY2Jsb2NrICpiLCAqZW50cnlibG9jazsKKyAgICBlbnRyeWJsb2NrID0gTlVMTDsKKyAgICBmb3IgKGIgPSBjLT51LT51X2Jsb2NrczsgYiAhPSBOVUxMOyBiID0gYi0+Yl9saXN0KSB7CisgICAgICAgIGItPmJfc2VlbiA9IDA7CisgICAgICAgIGItPmJfc3RhcnRkZXB0aCA9IElOVF9NSU47CisgICAgICAgIGVudHJ5YmxvY2sgPSBiOworICAgIH0KKyAgICBpZiAoIWVudHJ5YmxvY2spCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiBzdGFja2RlcHRoX3dhbGsoYywgZW50cnlibG9jaywgMCwgMCk7CiB9CiAKIHN0YXRpYyBpbnQKIGFzc2VtYmxlX2luaXQoc3RydWN0IGFzc2VtYmxlciAqYSwgaW50IG5ibG9ja3MsIGludCBmaXJzdGxpbmVubykKIHsKLQltZW1zZXQoYSwgMCwgc2l6ZW9mKHN0cnVjdCBhc3NlbWJsZXIpKTsKLQlhLT5hX2xpbmVubyA9IGZpcnN0bGluZW5vOwotCWEtPmFfYnl0ZWNvZGUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBERUZBVUxUX0NPREVfU0laRSk7Ci0JaWYgKCFhLT5hX2J5dGVjb2RlKQotCQlyZXR1cm4gMDsKLQlhLT5hX2xub3RhYiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIERFRkFVTFRfTE5PVEFCX1NJWkUpOwotCWlmICghYS0+YV9sbm90YWIpCi0JCXJldHVybiAwOwotCWlmIChuYmxvY2tzID4gUFlfU0laRV9NQVggLyBzaXplb2YoYmFzaWNibG9jayAqKSkgewotCQlQeUVycl9Ob01lbW9yeSgpOwotCQlyZXR1cm4gMDsKLQl9Ci0JYS0+YV9wb3N0b3JkZXIgPSAoYmFzaWNibG9jayAqKilQeU9iamVjdF9NYWxsb2MoCi0JCQkJCSAgICBzaXplb2YoYmFzaWNibG9jayAqKSAqIG5ibG9ja3MpOwotCWlmICghYS0+YV9wb3N0b3JkZXIpIHsKLQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiAxOworICAgIG1lbXNldChhLCAwLCBzaXplb2Yoc3RydWN0IGFzc2VtYmxlcikpOworICAgIGEtPmFfbGluZW5vID0gZmlyc3RsaW5lbm87CisgICAgYS0+YV9ieXRlY29kZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIERFRkFVTFRfQ09ERV9TSVpFKTsKKyAgICBpZiAoIWEtPmFfYnl0ZWNvZGUpCisgICAgICAgIHJldHVybiAwOworICAgIGEtPmFfbG5vdGFiID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgREVGQVVMVF9MTk9UQUJfU0laRSk7CisgICAgaWYgKCFhLT5hX2xub3RhYikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKG5ibG9ja3MgPiBQWV9TSVpFX01BWCAvIHNpemVvZihiYXNpY2Jsb2NrICopKSB7CisgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBhLT5hX3Bvc3RvcmRlciA9IChiYXNpY2Jsb2NrICoqKVB5T2JqZWN0X01hbGxvYygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoYmFzaWNibG9jayAqKSAqIG5ibG9ja3MpOworICAgIGlmICghYS0+YV9wb3N0b3JkZXIpIHsKKyAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgdm9pZAogYXNzZW1ibGVfZnJlZShzdHJ1Y3QgYXNzZW1ibGVyICphKQogewotCVB5X1hERUNSRUYoYS0+YV9ieXRlY29kZSk7Ci0JUHlfWERFQ1JFRihhLT5hX2xub3RhYik7Ci0JaWYgKGEtPmFfcG9zdG9yZGVyKQotCQlQeU9iamVjdF9GcmVlKGEtPmFfcG9zdG9yZGVyKTsKKyAgICBQeV9YREVDUkVGKGEtPmFfYnl0ZWNvZGUpOworICAgIFB5X1hERUNSRUYoYS0+YV9sbm90YWIpOworICAgIGlmIChhLT5hX3Bvc3RvcmRlcikKKyAgICAgICAgUHlPYmplY3RfRnJlZShhLT5hX3Bvc3RvcmRlcik7CiB9CiAKIC8qIFJldHVybiB0aGUgc2l6ZSBvZiBhIGJhc2ljIGJsb2NrIGluIGJ5dGVzLiAqLwpAQCAtMzUwNywyMiArMzUwNywyMiBAQAogc3RhdGljIGludAogaW5zdHJzaXplKHN0cnVjdCBpbnN0ciAqaW5zdHIpCiB7Ci0JaWYgKCFpbnN0ci0+aV9oYXNhcmcpCi0JCXJldHVybiAxOwkvKiAxIGJ5dGUgZm9yIHRoZSBvcGNvZGUqLwotCWlmIChpbnN0ci0+aV9vcGFyZyA+IDB4ZmZmZikKLQkJcmV0dXJuIDY7CS8qIDEgKG9wY29kZSkgKyAxIChFWFRFTkRFRF9BUkcgb3Bjb2RlKSArIDIgKG9wYXJnKSArIDIob3BhcmcgZXh0ZW5kZWQpICovCi0JcmV0dXJuIDM7IAkJLyogMSAob3Bjb2RlKSArIDIgKG9wYXJnKSAqLworICAgIGlmICghaW5zdHItPmlfaGFzYXJnKQorICAgICAgICByZXR1cm4gMTsgICAgICAgICAgICAgICAvKiAxIGJ5dGUgZm9yIHRoZSBvcGNvZGUqLworICAgIGlmIChpbnN0ci0+aV9vcGFyZyA+IDB4ZmZmZikKKyAgICAgICAgcmV0dXJuIDY7ICAgICAgICAgICAgICAgLyogMSAob3Bjb2RlKSArIDEgKEVYVEVOREVEX0FSRyBvcGNvZGUpICsgMiAob3BhcmcpICsgMihvcGFyZyBleHRlbmRlZCkgKi8KKyAgICByZXR1cm4gMzsgICAgICAgICAgICAgICAgICAgLyogMSAob3Bjb2RlKSArIDIgKG9wYXJnKSAqLwogfQogCiBzdGF0aWMgaW50CiBibG9ja3NpemUoYmFzaWNibG9jayAqYikKIHsKLQlpbnQgaTsKLQlpbnQgc2l6ZSA9IDA7CisgICAgaW50IGk7CisgICAgaW50IHNpemUgPSAwOwogCi0JZm9yIChpID0gMDsgaSA8IGItPmJfaXVzZWQ7IGkrKykKLQkJc2l6ZSArPSBpbnN0cnNpemUoJmItPmJfaW5zdHJbaV0pOwotCXJldHVybiBzaXplOworICAgIGZvciAoaSA9IDA7IGkgPCBiLT5iX2l1c2VkOyBpKyspCisgICAgICAgIHNpemUgKz0gaW5zdHJzaXplKCZiLT5iX2luc3RyW2ldKTsKKyAgICByZXR1cm4gc2l6ZTsKIH0KIAogLyogQWxsIGFib3V0IGFfbG5vdGFiLgpAQCAtMzUzMywxNCArMzUzMywxNCBAQAogCiBUaGUgYXJyYXkgaXMgY29uY2VwdHVhbGx5IGEgbGlzdCBvZgogICAgIChieXRlY29kZSBvZmZzZXQgaW5jcmVtZW50LCBsaW5lIG51bWJlciBpbmNyZW1lbnQpCi1wYWlycy4JVGhlIGRldGFpbHMgYXJlIGltcG9ydGFudCBhbmQgZGVsaWNhdGUsIGJlc3QgaWxsdXN0cmF0ZWQgYnkgZXhhbXBsZToKK3BhaXJzLiAgVGhlIGRldGFpbHMgYXJlIGltcG9ydGFudCBhbmQgZGVsaWNhdGUsIGJlc3QgaWxsdXN0cmF0ZWQgYnkgZXhhbXBsZToKIAotICAgIGJ5dGUgY29kZSBvZmZzZXQJc291cmNlIGNvZGUgbGluZSBudW1iZXIKLQkwCQkgICAgMQotCTYJCSAgICAyCi0gICAgICAgNTAJCSAgICA3Ci0gICAgICAzNTAJCSAgMzA3Ci0gICAgICAzNjEJCSAgMzA4CisgICAgYnl0ZSBjb2RlIG9mZnNldCAgICBzb3VyY2UgY29kZSBsaW5lIG51bWJlcgorICAgIDAgICAgICAgICAgICAgICAgICAgICAgIDEKKyAgICA2ICAgICAgICAgICAgICAgICAgICAgICAyCisgICAgICAgNTAgICAgICAgICAgICAgICAgICAgNworICAgICAgMzUwICAgICAgICAgICAgICAgICAzMDcKKyAgICAgIDM2MSAgICAgICAgICAgICAgICAgMzA4CiAKIFRoZSBmaXJzdCB0cmljayBpcyB0aGF0IHRoZXNlIG51bWJlcnMgYXJlbid0IHN0b3JlZCwgb25seSB0aGUgaW5jcmVtZW50cwogZnJvbSBvbmUgcm93IHRvIHRoZSBuZXh0ICh0aGlzIGRvZXNuJ3QgcmVhbGx5IHdvcmssIGJ1dCBpdCdzIGEgc3RhcnQpOgpAQCAtMzU1MiwxMTYgKzM1NTIsMTE2IEBACiBvZmZzZXRzIGFuZCB0aGVpciBjb3JyZXNwb25kaW5nIGxpbmUgI3MgYm90aCBpbmNyZWFzZSBtb25vdG9uaWNhbGx5LCBhbmQgKGIpCiBpZiBhdCBsZWFzdCBvbmUgY29sdW1uIGp1bXBzIGJ5IG1vcmUgdGhhbiAyNTUgZnJvbSBvbmUgcm93IHRvIHRoZSBuZXh0LCBtb3JlCiB0aGFuIG9uZSBwYWlyIGlzIHdyaXR0ZW4gdG8gdGhlIHRhYmxlLiBJbiBjYXNlICNiLCB0aGVyZSdzIG5vIHdheSB0byBrbm93Ci1mcm9tIGxvb2tpbmcgYXQgdGhlIHRhYmxlIGxhdGVyIGhvdyBtYW55IHdlcmUgd3JpdHRlbi4JVGhhdCdzIHRoZSBkZWxpY2F0ZQorZnJvbSBsb29raW5nIGF0IHRoZSB0YWJsZSBsYXRlciBob3cgbWFueSB3ZXJlIHdyaXR0ZW4uICBUaGF0J3MgdGhlIGRlbGljYXRlCiBwYXJ0LiAgQSB1c2VyIG9mIGNfbG5vdGFiIGRlc2lyaW5nIHRvIGZpbmQgdGhlIHNvdXJjZSBsaW5lIG51bWJlcgogY29ycmVzcG9uZGluZyB0byBhIGJ5dGVjb2RlIGFkZHJlc3MgQSBzaG91bGQgZG8gc29tZXRoaW5nIGxpa2UgdGhpcwogCiAgICAgbGluZW5vID0gYWRkciA9IDAKICAgICBmb3IgYWRkcl9pbmNyLCBsaW5lX2luY3IgaW4gY19sbm90YWI6Ci0JYWRkciArPSBhZGRyX2luY3IKLQlpZiBhZGRyID4gQToKLQkgICAgcmV0dXJuIGxpbmVubwotCWxpbmVubyArPSBsaW5lX2luY3IKKyAgICBhZGRyICs9IGFkZHJfaW5jcgorICAgIGlmIGFkZHIgPiBBOgorICAgICAgICByZXR1cm4gbGluZW5vCisgICAgbGluZW5vICs9IGxpbmVfaW5jcgogCiBJbiBvcmRlciBmb3IgdGhpcyB0byB3b3JrLCB3aGVuIHRoZSBhZGRyIGZpZWxkIGluY3JlbWVudHMgYnkgbW9yZSB0aGFuIDI1NSwKIHRoZSBsaW5lICMgaW5jcmVtZW50IGluIGVhY2ggcGFpciBnZW5lcmF0ZWQgbXVzdCBiZSAwIHVudGlsIHRoZSByZW1haW5pbmcgYWRkcgogaW5jcmVtZW50IGlzIDwgMjU2LiAgU28sIGluIHRoZSBleGFtcGxlIGFib3ZlLCBhc3NlbWJsZV9sbm90YWIgKGl0IHVzZWQKIHRvIGJlIGNhbGxlZCBjb21fc2V0X2xpbmVubykgc2hvdWxkIG5vdCAoYXMgd2FzIGFjdHVhbGx5IGRvbmUgdW50aWwgMi4yKQotZXhwYW5kIDMwMCwgMzAwIHRvIDI1NSwgMjU1LCA0NSwgNDUsIAotCSAgICBidXQgdG8gMjU1LAkgIDAsIDQ1LCAyNTUsIDAsIDQ1LgorZXhwYW5kIDMwMCwgMzAwIHRvIDI1NSwgMjU1LCA0NSwgNDUsCisgICAgICAgICAgICBidXQgdG8gMjU1LCAgIDAsIDQ1LCAyNTUsIDAsIDQ1LgogKi8KIAogc3RhdGljIGludAogYXNzZW1ibGVfbG5vdGFiKHN0cnVjdCBhc3NlbWJsZXIgKmEsIHN0cnVjdCBpbnN0ciAqaSkKIHsKLQlpbnQgZF9ieXRlY29kZSwgZF9saW5lbm87Ci0JaW50IGxlbjsKLQl1bnNpZ25lZCBjaGFyICpsbm90YWI7CisgICAgaW50IGRfYnl0ZWNvZGUsIGRfbGluZW5vOworICAgIGludCBsZW47CisgICAgdW5zaWduZWQgY2hhciAqbG5vdGFiOwogCi0JZF9ieXRlY29kZSA9IGEtPmFfb2Zmc2V0IC0gYS0+YV9saW5lbm9fb2ZmOwotCWRfbGluZW5vID0gaS0+aV9saW5lbm8gLSBhLT5hX2xpbmVubzsKKyAgICBkX2J5dGVjb2RlID0gYS0+YV9vZmZzZXQgLSBhLT5hX2xpbmVub19vZmY7CisgICAgZF9saW5lbm8gPSBpLT5pX2xpbmVubyAtIGEtPmFfbGluZW5vOwogCi0JYXNzZXJ0KGRfYnl0ZWNvZGUgPj0gMCk7Ci0JYXNzZXJ0KGRfbGluZW5vID49IDApOworICAgIGFzc2VydChkX2J5dGVjb2RlID49IDApOworICAgIGFzc2VydChkX2xpbmVubyA+PSAwKTsKIAotCWlmKGRfYnl0ZWNvZGUgPT0gMCAmJiBkX2xpbmVubyA9PSAwKQotCQlyZXR1cm4gMTsKKyAgICBpZihkX2J5dGVjb2RlID09IDAgJiYgZF9saW5lbm8gPT0gMCkKKyAgICAgICAgcmV0dXJuIDE7CiAKLQlpZiAoZF9ieXRlY29kZSA+IDI1NSkgewotCQlpbnQgaiwgbmJ5dGVzLCBuY29kZXMgPSBkX2J5dGVjb2RlIC8gMjU1OwotCQluYnl0ZXMgPSBhLT5hX2xub3RhYl9vZmYgKyAyICogbmNvZGVzOwotCQlsZW4gPSBQeVN0cmluZ19HRVRfU0laRShhLT5hX2xub3RhYik7Ci0JCWlmIChuYnl0ZXMgPj0gbGVuKSB7Ci0JCQlpZiAoKGxlbiA8PSBJTlRfTUFYIC8gMikgJiYgKGxlbiAqIDIgPCBuYnl0ZXMpKQotCQkJCWxlbiA9IG5ieXRlczsKLQkJCWVsc2UgaWYgKGxlbiA8PSBJTlRfTUFYIC8gMikKLQkJCQlsZW4gKj0gMjsKLQkJCWVsc2UgewotCQkJCVB5RXJyX05vTWVtb3J5KCk7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQlpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmYS0+YV9sbm90YWIsIGxlbikgPCAwKQotCQkJCXJldHVybiAwOwotCQl9Ci0JCWxub3RhYiA9ICh1bnNpZ25lZCBjaGFyICopCi0JCQkgICBQeVN0cmluZ19BU19TVFJJTkcoYS0+YV9sbm90YWIpICsgYS0+YV9sbm90YWJfb2ZmOwotCQlmb3IgKGogPSAwOyBqIDwgbmNvZGVzOyBqKyspIHsKLQkJCSpsbm90YWIrKyA9IDI1NTsKLQkJCSpsbm90YWIrKyA9IDA7Ci0JCX0KLQkJZF9ieXRlY29kZSAtPSBuY29kZXMgKiAyNTU7Ci0JCWEtPmFfbG5vdGFiX29mZiArPSBuY29kZXMgKiAyOwotCX0KLQlhc3NlcnQoZF9ieXRlY29kZSA8PSAyNTUpOwotCWlmIChkX2xpbmVubyA+IDI1NSkgewotCQlpbnQgaiwgbmJ5dGVzLCBuY29kZXMgPSBkX2xpbmVubyAvIDI1NTsKLQkJbmJ5dGVzID0gYS0+YV9sbm90YWJfb2ZmICsgMiAqIG5jb2RlczsKLQkJbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUoYS0+YV9sbm90YWIpOwotCQlpZiAobmJ5dGVzID49IGxlbikgewotCQkJaWYgKChsZW4gPD0gSU5UX01BWCAvIDIpICYmIGxlbiAqIDIgPCBuYnl0ZXMpCi0JCQkJbGVuID0gbmJ5dGVzOwotCQkJZWxzZSBpZiAobGVuIDw9IElOVF9NQVggLyAyKQotCQkJCWxlbiAqPSAyOwotCQkJZWxzZSB7Ci0JCQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJCWlmIChfUHlTdHJpbmdfUmVzaXplKCZhLT5hX2xub3RhYiwgbGVuKSA8IDApCi0JCQkJcmV0dXJuIDA7Ci0JCX0KLQkJbG5vdGFiID0gKHVuc2lnbmVkIGNoYXIgKikKLQkJCSAgIFB5U3RyaW5nX0FTX1NUUklORyhhLT5hX2xub3RhYikgKyBhLT5hX2xub3RhYl9vZmY7Ci0JCSpsbm90YWIrKyA9IGRfYnl0ZWNvZGU7Ci0JCSpsbm90YWIrKyA9IDI1NTsKLQkJZF9ieXRlY29kZSA9IDA7Ci0JCWZvciAoaiA9IDE7IGogPCBuY29kZXM7IGorKykgewotCQkJKmxub3RhYisrID0gMDsKLQkJCSpsbm90YWIrKyA9IDI1NTsKLQkJfQotCQlkX2xpbmVubyAtPSBuY29kZXMgKiAyNTU7Ci0JCWEtPmFfbG5vdGFiX29mZiArPSBuY29kZXMgKiAyOwotCX0KKyAgICBpZiAoZF9ieXRlY29kZSA+IDI1NSkgeworICAgICAgICBpbnQgaiwgbmJ5dGVzLCBuY29kZXMgPSBkX2J5dGVjb2RlIC8gMjU1OworICAgICAgICBuYnl0ZXMgPSBhLT5hX2xub3RhYl9vZmYgKyAyICogbmNvZGVzOworICAgICAgICBsZW4gPSBQeVN0cmluZ19HRVRfU0laRShhLT5hX2xub3RhYik7CisgICAgICAgIGlmIChuYnl0ZXMgPj0gbGVuKSB7CisgICAgICAgICAgICBpZiAoKGxlbiA8PSBJTlRfTUFYIC8gMikgJiYgKGxlbiAqIDIgPCBuYnl0ZXMpKQorICAgICAgICAgICAgICAgIGxlbiA9IG5ieXRlczsKKyAgICAgICAgICAgIGVsc2UgaWYgKGxlbiA8PSBJTlRfTUFYIC8gMikKKyAgICAgICAgICAgICAgICBsZW4gKj0gMjsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmYS0+YV9sbm90YWIsIGxlbikgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGxub3RhYiA9ICh1bnNpZ25lZCBjaGFyICopCisgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKGEtPmFfbG5vdGFiKSArIGEtPmFfbG5vdGFiX29mZjsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IG5jb2RlczsgaisrKSB7CisgICAgICAgICAgICAqbG5vdGFiKysgPSAyNTU7CisgICAgICAgICAgICAqbG5vdGFiKysgPSAwOworICAgICAgICB9CisgICAgICAgIGRfYnl0ZWNvZGUgLT0gbmNvZGVzICogMjU1OworICAgICAgICBhLT5hX2xub3RhYl9vZmYgKz0gbmNvZGVzICogMjsKKyAgICB9CisgICAgYXNzZXJ0KGRfYnl0ZWNvZGUgPD0gMjU1KTsKKyAgICBpZiAoZF9saW5lbm8gPiAyNTUpIHsKKyAgICAgICAgaW50IGosIG5ieXRlcywgbmNvZGVzID0gZF9saW5lbm8gLyAyNTU7CisgICAgICAgIG5ieXRlcyA9IGEtPmFfbG5vdGFiX29mZiArIDIgKiBuY29kZXM7CisgICAgICAgIGxlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKGEtPmFfbG5vdGFiKTsKKyAgICAgICAgaWYgKG5ieXRlcyA+PSBsZW4pIHsKKyAgICAgICAgICAgIGlmICgobGVuIDw9IElOVF9NQVggLyAyKSAmJiBsZW4gKiAyIDwgbmJ5dGVzKQorICAgICAgICAgICAgICAgIGxlbiA9IG5ieXRlczsKKyAgICAgICAgICAgIGVsc2UgaWYgKGxlbiA8PSBJTlRfTUFYIC8gMikKKyAgICAgICAgICAgICAgICBsZW4gKj0gMjsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmYS0+YV9sbm90YWIsIGxlbikgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGxub3RhYiA9ICh1bnNpZ25lZCBjaGFyICopCisgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKGEtPmFfbG5vdGFiKSArIGEtPmFfbG5vdGFiX29mZjsKKyAgICAgICAgKmxub3RhYisrID0gZF9ieXRlY29kZTsKKyAgICAgICAgKmxub3RhYisrID0gMjU1OworICAgICAgICBkX2J5dGVjb2RlID0gMDsKKyAgICAgICAgZm9yIChqID0gMTsgaiA8IG5jb2RlczsgaisrKSB7CisgICAgICAgICAgICAqbG5vdGFiKysgPSAwOworICAgICAgICAgICAgKmxub3RhYisrID0gMjU1OworICAgICAgICB9CisgICAgICAgIGRfbGluZW5vIC09IG5jb2RlcyAqIDI1NTsKKyAgICAgICAgYS0+YV9sbm90YWJfb2ZmICs9IG5jb2RlcyAqIDI7CisgICAgfQogCi0JbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUoYS0+YV9sbm90YWIpOwotCWlmIChhLT5hX2xub3RhYl9vZmYgKyAyID49IGxlbikgewotCQlpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmYS0+YV9sbm90YWIsIGxlbiAqIDIpIDwgMCkKLQkJCXJldHVybiAwOwotCX0KLQlsbm90YWIgPSAodW5zaWduZWQgY2hhciAqKQotCQkJUHlTdHJpbmdfQVNfU1RSSU5HKGEtPmFfbG5vdGFiKSArIGEtPmFfbG5vdGFiX29mZjsKKyAgICBsZW4gPSBQeVN0cmluZ19HRVRfU0laRShhLT5hX2xub3RhYik7CisgICAgaWYgKGEtPmFfbG5vdGFiX29mZiArIDIgPj0gbGVuKSB7CisgICAgICAgIGlmIChfUHlTdHJpbmdfUmVzaXplKCZhLT5hX2xub3RhYiwgbGVuICogMikgPCAwKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGxub3RhYiA9ICh1bnNpZ25lZCBjaGFyICopCisgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FTX1NUUklORyhhLT5hX2xub3RhYikgKyBhLT5hX2xub3RhYl9vZmY7CiAKLQlhLT5hX2xub3RhYl9vZmYgKz0gMjsKLQlpZiAoZF9ieXRlY29kZSkgewotCQkqbG5vdGFiKysgPSBkX2J5dGVjb2RlOwotCQkqbG5vdGFiKysgPSBkX2xpbmVubzsKLQl9Ci0JZWxzZSB7CS8qIEZpcnN0IGxpbmUgb2YgYSBibG9jazsgZGVmIHN0bXQsIGV0Yy4gKi8KLQkJKmxub3RhYisrID0gMDsKLQkJKmxub3RhYisrID0gZF9saW5lbm87Ci0JfQotCWEtPmFfbGluZW5vID0gaS0+aV9saW5lbm87Ci0JYS0+YV9saW5lbm9fb2ZmID0gYS0+YV9vZmZzZXQ7Ci0JcmV0dXJuIDE7CisgICAgYS0+YV9sbm90YWJfb2ZmICs9IDI7CisgICAgaWYgKGRfYnl0ZWNvZGUpIHsKKyAgICAgICAgKmxub3RhYisrID0gZF9ieXRlY29kZTsKKyAgICAgICAgKmxub3RhYisrID0gZF9saW5lbm87CisgICAgfQorICAgIGVsc2UgeyAgICAgIC8qIEZpcnN0IGxpbmUgb2YgYSBibG9jazsgZGVmIHN0bXQsIGV0Yy4gKi8KKyAgICAgICAgKmxub3RhYisrID0gMDsKKyAgICAgICAgKmxub3RhYisrID0gZF9saW5lbm87CisgICAgfQorICAgIGEtPmFfbGluZW5vID0gaS0+aV9saW5lbm87CisgICAgYS0+YV9saW5lbm9fb2ZmID0gYS0+YV9vZmZzZXQ7CisgICAgcmV0dXJuIDE7CiB9CiAKIC8qIGFzc2VtYmxlX2VtaXQoKQpAQCAtMzY3MiwyMzEgKzM2NzIsMjMxIEBACiBzdGF0aWMgaW50CiBhc3NlbWJsZV9lbWl0KHN0cnVjdCBhc3NlbWJsZXIgKmEsIHN0cnVjdCBpbnN0ciAqaSkKIHsKLQlpbnQgc2l6ZSwgYXJnID0gMCwgZXh0ID0gMDsKLQlQeV9zc2l6ZV90IGxlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKGEtPmFfYnl0ZWNvZGUpOwotCWNoYXIgKmNvZGU7CisgICAgaW50IHNpemUsIGFyZyA9IDAsIGV4dCA9IDA7CisgICAgUHlfc3NpemVfdCBsZW4gPSBQeVN0cmluZ19HRVRfU0laRShhLT5hX2J5dGVjb2RlKTsKKyAgICBjaGFyICpjb2RlOwogCi0Jc2l6ZSA9IGluc3Ryc2l6ZShpKTsKLQlpZiAoaS0+aV9oYXNhcmcpIHsKLQkJYXJnID0gaS0+aV9vcGFyZzsKLQkJZXh0ID0gYXJnID4+IDE2OwotCX0KLQlpZiAoaS0+aV9saW5lbm8gJiYgIWFzc2VtYmxlX2xub3RhYihhLCBpKSkKLQkJcmV0dXJuIDA7Ci0JaWYgKGEtPmFfb2Zmc2V0ICsgc2l6ZSA+PSBsZW4pIHsKLQkJaWYgKGxlbiA+IFBZX1NTSVpFX1RfTUFYIC8gMikKLQkJCXJldHVybiAwOwotCQlpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmYS0+YV9ieXRlY29kZSwgbGVuICogMikgPCAwKQotCQkgICAgcmV0dXJuIDA7Ci0JfQotCWNvZGUgPSBQeVN0cmluZ19BU19TVFJJTkcoYS0+YV9ieXRlY29kZSkgKyBhLT5hX29mZnNldDsKLQlhLT5hX29mZnNldCArPSBzaXplOwotCWlmIChzaXplID09IDYpIHsKLQkJYXNzZXJ0KGktPmlfaGFzYXJnKTsKLQkJKmNvZGUrKyA9IChjaGFyKUVYVEVOREVEX0FSRzsKLQkJKmNvZGUrKyA9IGV4dCAmIDB4ZmY7Ci0JCSpjb2RlKysgPSBleHQgPj4gODsKLQkJYXJnICY9IDB4ZmZmZjsKLQl9Ci0JKmNvZGUrKyA9IGktPmlfb3Bjb2RlOwotCWlmIChpLT5pX2hhc2FyZykgewotCQlhc3NlcnQoc2l6ZSA9PSAzIHx8IHNpemUgPT0gNik7Ci0JCSpjb2RlKysgPSBhcmcgJiAweGZmOwotCQkqY29kZSsrID0gYXJnID4+IDg7Ci0JfQotCXJldHVybiAxOworICAgIHNpemUgPSBpbnN0cnNpemUoaSk7CisgICAgaWYgKGktPmlfaGFzYXJnKSB7CisgICAgICAgIGFyZyA9IGktPmlfb3Bhcmc7CisgICAgICAgIGV4dCA9IGFyZyA+PiAxNjsKKyAgICB9CisgICAgaWYgKGktPmlfbGluZW5vICYmICFhc3NlbWJsZV9sbm90YWIoYSwgaSkpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChhLT5hX29mZnNldCArIHNpemUgPj0gbGVuKSB7CisgICAgICAgIGlmIChsZW4gPiBQWV9TU0laRV9UX01BWCAvIDIpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgaWYgKF9QeVN0cmluZ19SZXNpemUoJmEtPmFfYnl0ZWNvZGUsIGxlbiAqIDIpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBjb2RlID0gUHlTdHJpbmdfQVNfU1RSSU5HKGEtPmFfYnl0ZWNvZGUpICsgYS0+YV9vZmZzZXQ7CisgICAgYS0+YV9vZmZzZXQgKz0gc2l6ZTsKKyAgICBpZiAoc2l6ZSA9PSA2KSB7CisgICAgICAgIGFzc2VydChpLT5pX2hhc2FyZyk7CisgICAgICAgICpjb2RlKysgPSAoY2hhcilFWFRFTkRFRF9BUkc7CisgICAgICAgICpjb2RlKysgPSBleHQgJiAweGZmOworICAgICAgICAqY29kZSsrID0gZXh0ID4+IDg7CisgICAgICAgIGFyZyAmPSAweGZmZmY7CisgICAgfQorICAgICpjb2RlKysgPSBpLT5pX29wY29kZTsKKyAgICBpZiAoaS0+aV9oYXNhcmcpIHsKKyAgICAgICAgYXNzZXJ0KHNpemUgPT0gMyB8fCBzaXplID09IDYpOworICAgICAgICAqY29kZSsrID0gYXJnICYgMHhmZjsKKyAgICAgICAgKmNvZGUrKyA9IGFyZyA+PiA4OworICAgIH0KKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIHZvaWQKIGFzc2VtYmxlX2p1bXBfb2Zmc2V0cyhzdHJ1Y3QgYXNzZW1ibGVyICphLCBzdHJ1Y3QgY29tcGlsZXIgKmMpCiB7Ci0JYmFzaWNibG9jayAqYjsKLQlpbnQgYnNpemUsIHRvdHNpemUsIGV4dGVuZGVkX2FyZ19jb3VudCwgbGFzdF9leHRlbmRlZF9hcmdfY291bnQgPSAwOwotCWludCBpOworICAgIGJhc2ljYmxvY2sgKmI7CisgICAgaW50IGJzaXplLCB0b3RzaXplLCBleHRlbmRlZF9hcmdfY291bnQsIGxhc3RfZXh0ZW5kZWRfYXJnX2NvdW50ID0gMDsKKyAgICBpbnQgaTsKIAotCS8qIENvbXB1dGUgdGhlIHNpemUgb2YgZWFjaCBibG9jayBhbmQgZml4dXAganVtcCBhcmdzLgotCSAgIFJlcGxhY2UgYmxvY2sgcG9pbnRlciB3aXRoIHBvc2l0aW9uIGluIGJ5dGVjb2RlLiAqLworICAgIC8qIENvbXB1dGUgdGhlIHNpemUgb2YgZWFjaCBibG9jayBhbmQgZml4dXAganVtcCBhcmdzLgorICAgICAgIFJlcGxhY2UgYmxvY2sgcG9pbnRlciB3aXRoIHBvc2l0aW9uIGluIGJ5dGVjb2RlLiAqLwogc3RhcnQ6Ci0JdG90c2l6ZSA9IDA7Ci0JZm9yIChpID0gYS0+YV9uYmxvY2tzIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJYiA9IGEtPmFfcG9zdG9yZGVyW2ldOwotCQlic2l6ZSA9IGJsb2Nrc2l6ZShiKTsKLQkJYi0+Yl9vZmZzZXQgPSB0b3RzaXplOwotCQl0b3RzaXplICs9IGJzaXplOwotCX0KLQlleHRlbmRlZF9hcmdfY291bnQgPSAwOwotCWZvciAoYiA9IGMtPnUtPnVfYmxvY2tzOyBiICE9IE5VTEw7IGIgPSBiLT5iX2xpc3QpIHsKLQkJYnNpemUgPSBiLT5iX29mZnNldDsKLQkJZm9yIChpID0gMDsgaSA8IGItPmJfaXVzZWQ7IGkrKykgewotCQkJc3RydWN0IGluc3RyICppbnN0ciA9ICZiLT5iX2luc3RyW2ldOwotCQkJLyogUmVsYXRpdmUganVtcHMgYXJlIGNvbXB1dGVkIHJlbGF0aXZlIHRvCi0JCQkgICB0aGUgaW5zdHJ1Y3Rpb24gcG9pbnRlciBhZnRlciBmZXRjaGluZwotCQkJICAgdGhlIGp1bXAgaW5zdHJ1Y3Rpb24uCi0JCQkqLwotCQkJYnNpemUgKz0gaW5zdHJzaXplKGluc3RyKTsKLQkJCWlmIChpbnN0ci0+aV9qYWJzKQotCQkJCWluc3RyLT5pX29wYXJnID0gaW5zdHItPmlfdGFyZ2V0LT5iX29mZnNldDsKLQkJCWVsc2UgaWYgKGluc3RyLT5pX2pyZWwpIHsKLQkJCQlpbnQgZGVsdGEgPSBpbnN0ci0+aV90YXJnZXQtPmJfb2Zmc2V0IC0gYnNpemU7Ci0JCQkJaW5zdHItPmlfb3BhcmcgPSBkZWx0YTsKLQkJCX0KLQkJCWVsc2UKLQkJCQljb250aW51ZTsKLQkJCWlmIChpbnN0ci0+aV9vcGFyZyA+IDB4ZmZmZikKLQkJCQlleHRlbmRlZF9hcmdfY291bnQrKzsKLQkJfQotCX0KKyAgICB0b3RzaXplID0gMDsKKyAgICBmb3IgKGkgPSBhLT5hX25ibG9ja3MgLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICBiID0gYS0+YV9wb3N0b3JkZXJbaV07CisgICAgICAgIGJzaXplID0gYmxvY2tzaXplKGIpOworICAgICAgICBiLT5iX29mZnNldCA9IHRvdHNpemU7CisgICAgICAgIHRvdHNpemUgKz0gYnNpemU7CisgICAgfQorICAgIGV4dGVuZGVkX2FyZ19jb3VudCA9IDA7CisgICAgZm9yIChiID0gYy0+dS0+dV9ibG9ja3M7IGIgIT0gTlVMTDsgYiA9IGItPmJfbGlzdCkgeworICAgICAgICBic2l6ZSA9IGItPmJfb2Zmc2V0OworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYi0+Yl9pdXNlZDsgaSsrKSB7CisgICAgICAgICAgICBzdHJ1Y3QgaW5zdHIgKmluc3RyID0gJmItPmJfaW5zdHJbaV07CisgICAgICAgICAgICAvKiBSZWxhdGl2ZSBqdW1wcyBhcmUgY29tcHV0ZWQgcmVsYXRpdmUgdG8KKyAgICAgICAgICAgICAgIHRoZSBpbnN0cnVjdGlvbiBwb2ludGVyIGFmdGVyIGZldGNoaW5nCisgICAgICAgICAgICAgICB0aGUganVtcCBpbnN0cnVjdGlvbi4KKyAgICAgICAgICAgICovCisgICAgICAgICAgICBic2l6ZSArPSBpbnN0cnNpemUoaW5zdHIpOworICAgICAgICAgICAgaWYgKGluc3RyLT5pX2phYnMpCisgICAgICAgICAgICAgICAgaW5zdHItPmlfb3BhcmcgPSBpbnN0ci0+aV90YXJnZXQtPmJfb2Zmc2V0OworICAgICAgICAgICAgZWxzZSBpZiAoaW5zdHItPmlfanJlbCkgeworICAgICAgICAgICAgICAgIGludCBkZWx0YSA9IGluc3RyLT5pX3RhcmdldC0+Yl9vZmZzZXQgLSBic2l6ZTsKKyAgICAgICAgICAgICAgICBpbnN0ci0+aV9vcGFyZyA9IGRlbHRhOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgaWYgKGluc3RyLT5pX29wYXJnID4gMHhmZmZmKQorICAgICAgICAgICAgICAgIGV4dGVuZGVkX2FyZ19jb3VudCsrOworICAgICAgICB9CisgICAgfQogCi0JLyogWFhYOiBUaGlzIGlzIGFuIGF3ZnVsIGhhY2sgdGhhdCBjb3VsZCBodXJ0IHBlcmZvcm1hbmNlLCBidXQKLQkJb24gdGhlIGJyaWdodCBzaWRlIGl0IHNob3VsZCB3b3JrIHVudGlsIHdlIGNvbWUgdXAKLQkJd2l0aCBhIGJldHRlciBzb2x1dGlvbi4KKyAgICAvKiBYWFg6IFRoaXMgaXMgYW4gYXdmdWwgaGFjayB0aGF0IGNvdWxkIGh1cnQgcGVyZm9ybWFuY2UsIGJ1dAorICAgICAgICBvbiB0aGUgYnJpZ2h0IHNpZGUgaXQgc2hvdWxkIHdvcmsgdW50aWwgd2UgY29tZSB1cAorICAgICAgICB3aXRoIGEgYmV0dGVyIHNvbHV0aW9uLgogCi0JCUluIHRoZSBtZWFudGltZSwgc2hvdWxkIHRoZSBnb3RvIGJlIGRyb3BwZWQgaW4gZmF2b3IKLQkJb2YgYSBsb29wPworICAgICAgICBJbiB0aGUgbWVhbnRpbWUsIHNob3VsZCB0aGUgZ290byBiZSBkcm9wcGVkIGluIGZhdm9yCisgICAgICAgIG9mIGEgbG9vcD8KIAotCQlUaGUgaXNzdWUgaXMgdGhhdCBpbiB0aGUgZmlyc3QgbG9vcCBibG9ja3NpemUoKSBpcyBjYWxsZWQKLQkJd2hpY2ggY2FsbHMgaW5zdHJzaXplKCkgd2hpY2ggcmVxdWlyZXMgaV9vcGFyZyBiZSBzZXQKLQkJYXBwcm9wcmlhdGVseS4JVGhlcmUgaXMgYSBib290c3RyYXAgcHJvYmxlbSBiZWNhdXNlCi0JCWlfb3BhcmcgaXMgY2FsY3VsYXRlZCBpbiB0aGUgc2Vjb25kIGxvb3AgYWJvdmUuCisgICAgICAgIFRoZSBpc3N1ZSBpcyB0aGF0IGluIHRoZSBmaXJzdCBsb29wIGJsb2Nrc2l6ZSgpIGlzIGNhbGxlZAorICAgICAgICB3aGljaCBjYWxscyBpbnN0cnNpemUoKSB3aGljaCByZXF1aXJlcyBpX29wYXJnIGJlIHNldAorICAgICAgICBhcHByb3ByaWF0ZWx5LiAgICAgICAgICBUaGVyZSBpcyBhIGJvb3RzdHJhcCBwcm9ibGVtIGJlY2F1c2UKKyAgICAgICAgaV9vcGFyZyBpcyBjYWxjdWxhdGVkIGluIHRoZSBzZWNvbmQgbG9vcCBhYm92ZS4KIAotCQlTbyB3ZSBsb29wIHVudGlsIHdlIHN0b3Agc2VlaW5nIG5ldyBFWFRFTkRFRF9BUkdzLgotCQlUaGUgb25seSBFWFRFTkRFRF9BUkdzIHRoYXQgY291bGQgYmUgcG9wcGluZyB1cCBhcmUKLQkJb25lcyBpbiBqdW1wIGluc3RydWN0aW9ucy4gIFNvIHRoaXMgc2hvdWxkIGNvbnZlcmdlCi0JCWZhaXJseSBxdWlja2x5LgotCSovCi0JaWYgKGxhc3RfZXh0ZW5kZWRfYXJnX2NvdW50ICE9IGV4dGVuZGVkX2FyZ19jb3VudCkgewotCQlsYXN0X2V4dGVuZGVkX2FyZ19jb3VudCA9IGV4dGVuZGVkX2FyZ19jb3VudDsKLQkJZ290byBzdGFydDsKLQl9CisgICAgICAgIFNvIHdlIGxvb3AgdW50aWwgd2Ugc3RvcCBzZWVpbmcgbmV3IEVYVEVOREVEX0FSR3MuCisgICAgICAgIFRoZSBvbmx5IEVYVEVOREVEX0FSR3MgdGhhdCBjb3VsZCBiZSBwb3BwaW5nIHVwIGFyZQorICAgICAgICBvbmVzIGluIGp1bXAgaW5zdHJ1Y3Rpb25zLiAgU28gdGhpcyBzaG91bGQgY29udmVyZ2UKKyAgICAgICAgZmFpcmx5IHF1aWNrbHkuCisgICAgKi8KKyAgICBpZiAobGFzdF9leHRlbmRlZF9hcmdfY291bnQgIT0gZXh0ZW5kZWRfYXJnX2NvdW50KSB7CisgICAgICAgIGxhc3RfZXh0ZW5kZWRfYXJnX2NvdW50ID0gZXh0ZW5kZWRfYXJnX2NvdW50OworICAgICAgICBnb3RvIHN0YXJ0OworICAgIH0KIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRpY3Rfa2V5c19pbm9yZGVyKFB5T2JqZWN0ICpkaWN0LCBpbnQgb2Zmc2V0KQogewotCVB5T2JqZWN0ICp0dXBsZSwgKmssICp2OwotCVB5X3NzaXplX3QgaSwgcG9zID0gMCwgc2l6ZSA9IFB5RGljdF9TaXplKGRpY3QpOworICAgIFB5T2JqZWN0ICp0dXBsZSwgKmssICp2OworICAgIFB5X3NzaXplX3QgaSwgcG9zID0gMCwgc2l6ZSA9IFB5RGljdF9TaXplKGRpY3QpOwogCi0JdHVwbGUgPSBQeVR1cGxlX05ldyhzaXplKTsKLQlpZiAodHVwbGUgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0Jd2hpbGUgKFB5RGljdF9OZXh0KGRpY3QsICZwb3MsICZrLCAmdikpIHsKLQkJaSA9IFB5SW50X0FTX0xPTkcodik7Ci0JCWsgPSBQeVR1cGxlX0dFVF9JVEVNKGssIDApOwotCQlQeV9JTkNSRUYoayk7Ci0JCWFzc2VydCgoaSAtIG9mZnNldCkgPCBzaXplKTsKLQkJYXNzZXJ0KChpIC0gb2Zmc2V0KSA+PSAwKTsKLQkJUHlUdXBsZV9TRVRfSVRFTSh0dXBsZSwgaSAtIG9mZnNldCwgayk7Ci0JfQotCXJldHVybiB0dXBsZTsKKyAgICB0dXBsZSA9IFB5VHVwbGVfTmV3KHNpemUpOworICAgIGlmICh0dXBsZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB3aGlsZSAoUHlEaWN0X05leHQoZGljdCwgJnBvcywgJmssICZ2KSkgeworICAgICAgICBpID0gUHlJbnRfQVNfTE9ORyh2KTsKKyAgICAgICAgayA9IFB5VHVwbGVfR0VUX0lURU0oaywgMCk7CisgICAgICAgIFB5X0lOQ1JFRihrKTsKKyAgICAgICAgYXNzZXJ0KChpIC0gb2Zmc2V0KSA8IHNpemUpOworICAgICAgICBhc3NlcnQoKGkgLSBvZmZzZXQpID49IDApOworICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKHR1cGxlLCBpIC0gb2Zmc2V0LCBrKTsKKyAgICB9CisgICAgcmV0dXJuIHR1cGxlOwogfQogCiBzdGF0aWMgaW50CiBjb21wdXRlX2NvZGVfZmxhZ3Moc3RydWN0IGNvbXBpbGVyICpjKQogewotCVB5U1RFbnRyeU9iamVjdCAqc3RlID0gYy0+dS0+dV9zdGU7Ci0JaW50IGZsYWdzID0gMCwgbjsKLQlpZiAoc3RlLT5zdGVfdHlwZSAhPSBNb2R1bGVCbG9jaykKLQkJZmxhZ3MgfD0gQ09fTkVXTE9DQUxTOwotCWlmIChzdGUtPnN0ZV90eXBlID09IEZ1bmN0aW9uQmxvY2spIHsKLQkJaWYgKCFzdGUtPnN0ZV91bm9wdGltaXplZCkKLQkJCWZsYWdzIHw9IENPX09QVElNSVpFRDsKLQkJaWYgKHN0ZS0+c3RlX25lc3RlZCkKLQkJCWZsYWdzIHw9IENPX05FU1RFRDsKLQkJaWYgKHN0ZS0+c3RlX2dlbmVyYXRvcikKLQkJCWZsYWdzIHw9IENPX0dFTkVSQVRPUjsKLQl9Ci0JaWYgKHN0ZS0+c3RlX3ZhcmFyZ3MpCi0JCWZsYWdzIHw9IENPX1ZBUkFSR1M7Ci0JaWYgKHN0ZS0+c3RlX3ZhcmtleXdvcmRzKQotCQlmbGFncyB8PSBDT19WQVJLRVlXT1JEUzsKLQlpZiAoc3RlLT5zdGVfZ2VuZXJhdG9yKQotCQlmbGFncyB8PSBDT19HRU5FUkFUT1I7CisgICAgUHlTVEVudHJ5T2JqZWN0ICpzdGUgPSBjLT51LT51X3N0ZTsKKyAgICBpbnQgZmxhZ3MgPSAwLCBuOworICAgIGlmIChzdGUtPnN0ZV90eXBlICE9IE1vZHVsZUJsb2NrKQorICAgICAgICBmbGFncyB8PSBDT19ORVdMT0NBTFM7CisgICAgaWYgKHN0ZS0+c3RlX3R5cGUgPT0gRnVuY3Rpb25CbG9jaykgeworICAgICAgICBpZiAoIXN0ZS0+c3RlX3Vub3B0aW1pemVkKQorICAgICAgICAgICAgZmxhZ3MgfD0gQ09fT1BUSU1JWkVEOworICAgICAgICBpZiAoc3RlLT5zdGVfbmVzdGVkKQorICAgICAgICAgICAgZmxhZ3MgfD0gQ09fTkVTVEVEOworICAgICAgICBpZiAoc3RlLT5zdGVfZ2VuZXJhdG9yKQorICAgICAgICAgICAgZmxhZ3MgfD0gQ09fR0VORVJBVE9SOworICAgIH0KKyAgICBpZiAoc3RlLT5zdGVfdmFyYXJncykKKyAgICAgICAgZmxhZ3MgfD0gQ09fVkFSQVJHUzsKKyAgICBpZiAoc3RlLT5zdGVfdmFya2V5d29yZHMpCisgICAgICAgIGZsYWdzIHw9IENPX1ZBUktFWVdPUkRTOworICAgIGlmIChzdGUtPnN0ZV9nZW5lcmF0b3IpCisgICAgICAgIGZsYWdzIHw9IENPX0dFTkVSQVRPUjsKIAotCS8qIChPbmx5KSBpbmhlcml0IGNvbXBpbGVyZmxhZ3MgaW4gUHlDRl9NQVNLICovCi0JZmxhZ3MgfD0gKGMtPmNfZmxhZ3MtPmNmX2ZsYWdzICYgUHlDRl9NQVNLKTsKKyAgICAvKiAoT25seSkgaW5oZXJpdCBjb21waWxlcmZsYWdzIGluIFB5Q0ZfTUFTSyAqLworICAgIGZsYWdzIHw9IChjLT5jX2ZsYWdzLT5jZl9mbGFncyAmIFB5Q0ZfTUFTSyk7CiAKLQluID0gUHlEaWN0X1NpemUoYy0+dS0+dV9mcmVldmFycyk7Ci0JaWYgKG4gPCAwKQotCSAgICByZXR1cm4gLTE7Ci0JaWYgKG4gPT0gMCkgewotCSAgICBuID0gUHlEaWN0X1NpemUoYy0+dS0+dV9jZWxsdmFycyk7Ci0JICAgIGlmIChuIDwgMCkKLQkJcmV0dXJuIC0xOwotCSAgICBpZiAobiA9PSAwKSB7Ci0JCWZsYWdzIHw9IENPX05PRlJFRTsKLQkgICAgfQotCX0KKyAgICBuID0gUHlEaWN0X1NpemUoYy0+dS0+dV9mcmVldmFycyk7CisgICAgaWYgKG4gPCAwKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKG4gPT0gMCkgeworICAgICAgICBuID0gUHlEaWN0X1NpemUoYy0+dS0+dV9jZWxsdmFycyk7CisgICAgICAgIGlmIChuIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBpZiAobiA9PSAwKSB7CisgICAgICAgIGZsYWdzIHw9IENPX05PRlJFRTsKKyAgICAgICAgfQorICAgIH0KIAotCXJldHVybiBmbGFnczsKKyAgICByZXR1cm4gZmxhZ3M7CiB9CiAKIHN0YXRpYyBQeUNvZGVPYmplY3QgKgogbWFrZWNvZGUoc3RydWN0IGNvbXBpbGVyICpjLCBzdHJ1Y3QgYXNzZW1ibGVyICphKQogewotCVB5T2JqZWN0ICp0bXA7Ci0JUHlDb2RlT2JqZWN0ICpjbyA9IE5VTEw7Ci0JUHlPYmplY3QgKmNvbnN0cyA9IE5VTEw7Ci0JUHlPYmplY3QgKm5hbWVzID0gTlVMTDsKLQlQeU9iamVjdCAqdmFybmFtZXMgPSBOVUxMOwotCVB5T2JqZWN0ICpmaWxlbmFtZSA9IE5VTEw7Ci0JUHlPYmplY3QgKm5hbWUgPSBOVUxMOwotCVB5T2JqZWN0ICpmcmVldmFycyA9IE5VTEw7Ci0JUHlPYmplY3QgKmNlbGx2YXJzID0gTlVMTDsKLQlQeU9iamVjdCAqYnl0ZWNvZGUgPSBOVUxMOwotCWludCBubG9jYWxzLCBmbGFnczsKKyAgICBQeU9iamVjdCAqdG1wOworICAgIFB5Q29kZU9iamVjdCAqY28gPSBOVUxMOworICAgIFB5T2JqZWN0ICpjb25zdHMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpuYW1lcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKnZhcm5hbWVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqZmlsZW5hbWUgPSBOVUxMOworICAgIFB5T2JqZWN0ICpuYW1lID0gTlVMTDsKKyAgICBQeU9iamVjdCAqZnJlZXZhcnMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpjZWxsdmFycyA9IE5VTEw7CisgICAgUHlPYmplY3QgKmJ5dGVjb2RlID0gTlVMTDsKKyAgICBpbnQgbmxvY2FscywgZmxhZ3M7CiAKLQl0bXAgPSBkaWN0X2tleXNfaW5vcmRlcihjLT51LT51X2NvbnN0cywgMCk7Ci0JaWYgKCF0bXApCi0JCWdvdG8gZXJyb3I7Ci0JY29uc3RzID0gUHlTZXF1ZW5jZV9MaXN0KHRtcCk7IC8qIG9wdGltaXplX2NvZGUgcmVxdWlyZXMgYSBsaXN0ICovCi0JUHlfREVDUkVGKHRtcCk7CisgICAgdG1wID0gZGljdF9rZXlzX2lub3JkZXIoYy0+dS0+dV9jb25zdHMsIDApOworICAgIGlmICghdG1wKQorICAgICAgICBnb3RvIGVycm9yOworICAgIGNvbnN0cyA9IFB5U2VxdWVuY2VfTGlzdCh0bXApOyAvKiBvcHRpbWl6ZV9jb2RlIHJlcXVpcmVzIGEgbGlzdCAqLworICAgIFB5X0RFQ1JFRih0bXApOwogCi0JbmFtZXMgPSBkaWN0X2tleXNfaW5vcmRlcihjLT51LT51X25hbWVzLCAwKTsKLQl2YXJuYW1lcyA9IGRpY3Rfa2V5c19pbm9yZGVyKGMtPnUtPnVfdmFybmFtZXMsIDApOwotCWlmICghY29uc3RzIHx8ICFuYW1lcyB8fCAhdmFybmFtZXMpCi0JCWdvdG8gZXJyb3I7Ci0gICAgICAKLQljZWxsdmFycyA9IGRpY3Rfa2V5c19pbm9yZGVyKGMtPnUtPnVfY2VsbHZhcnMsIDApOwotCWlmICghY2VsbHZhcnMpCi0JICAgIGdvdG8gZXJyb3I7Ci0JZnJlZXZhcnMgPSBkaWN0X2tleXNfaW5vcmRlcihjLT51LT51X2ZyZWV2YXJzLCBQeVR1cGxlX1NpemUoY2VsbHZhcnMpKTsKLQlpZiAoIWZyZWV2YXJzKQotCSAgICBnb3RvIGVycm9yOwotCWZpbGVuYW1lID0gUHlTdHJpbmdfRnJvbVN0cmluZyhjLT5jX2ZpbGVuYW1lKTsKLQlpZiAoIWZpbGVuYW1lKQotCQlnb3RvIGVycm9yOworICAgIG5hbWVzID0gZGljdF9rZXlzX2lub3JkZXIoYy0+dS0+dV9uYW1lcywgMCk7CisgICAgdmFybmFtZXMgPSBkaWN0X2tleXNfaW5vcmRlcihjLT51LT51X3Zhcm5hbWVzLCAwKTsKKyAgICBpZiAoIWNvbnN0cyB8fCAhbmFtZXMgfHwgIXZhcm5hbWVzKQorICAgICAgICBnb3RvIGVycm9yOwogCi0JbmxvY2FscyA9IFB5RGljdF9TaXplKGMtPnUtPnVfdmFybmFtZXMpOwotCWZsYWdzID0gY29tcHV0ZV9jb2RlX2ZsYWdzKGMpOwotCWlmIChmbGFncyA8IDApCi0JCWdvdG8gZXJyb3I7CisgICAgY2VsbHZhcnMgPSBkaWN0X2tleXNfaW5vcmRlcihjLT51LT51X2NlbGx2YXJzLCAwKTsKKyAgICBpZiAoIWNlbGx2YXJzKQorICAgICAgICBnb3RvIGVycm9yOworICAgIGZyZWV2YXJzID0gZGljdF9rZXlzX2lub3JkZXIoYy0+dS0+dV9mcmVldmFycywgUHlUdXBsZV9TaXplKGNlbGx2YXJzKSk7CisgICAgaWYgKCFmcmVldmFycykKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBmaWxlbmFtZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoYy0+Y19maWxlbmFtZSk7CisgICAgaWYgKCFmaWxlbmFtZSkKKyAgICAgICAgZ290byBlcnJvcjsKIAotCWJ5dGVjb2RlID0gUHlDb2RlX09wdGltaXplKGEtPmFfYnl0ZWNvZGUsIGNvbnN0cywgbmFtZXMsIGEtPmFfbG5vdGFiKTsKLQlpZiAoIWJ5dGVjb2RlKQotCQlnb3RvIGVycm9yOworICAgIG5sb2NhbHMgPSBQeURpY3RfU2l6ZShjLT51LT51X3Zhcm5hbWVzKTsKKyAgICBmbGFncyA9IGNvbXB1dGVfY29kZV9mbGFncyhjKTsKKyAgICBpZiAoZmxhZ3MgPCAwKQorICAgICAgICBnb3RvIGVycm9yOwogCi0JdG1wID0gUHlMaXN0X0FzVHVwbGUoY29uc3RzKTsgLyogUHlDb2RlX05ldyByZXF1aXJlcyBhIHR1cGxlICovCi0JaWYgKCF0bXApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKGNvbnN0cyk7Ci0JY29uc3RzID0gdG1wOworICAgIGJ5dGVjb2RlID0gUHlDb2RlX09wdGltaXplKGEtPmFfYnl0ZWNvZGUsIGNvbnN0cywgbmFtZXMsIGEtPmFfbG5vdGFiKTsKKyAgICBpZiAoIWJ5dGVjb2RlKQorICAgICAgICBnb3RvIGVycm9yOwogCi0JY28gPSBQeUNvZGVfTmV3KGMtPnUtPnVfYXJnY291bnQsIG5sb2NhbHMsIHN0YWNrZGVwdGgoYyksIGZsYWdzLAotCQkJYnl0ZWNvZGUsIGNvbnN0cywgbmFtZXMsIHZhcm5hbWVzLAotCQkJZnJlZXZhcnMsIGNlbGx2YXJzLAotCQkJZmlsZW5hbWUsIGMtPnUtPnVfbmFtZSwKLQkJCWMtPnUtPnVfZmlyc3RsaW5lbm8sCi0JCQlhLT5hX2xub3RhYik7CisgICAgdG1wID0gUHlMaXN0X0FzVHVwbGUoY29uc3RzKTsgLyogUHlDb2RlX05ldyByZXF1aXJlcyBhIHR1cGxlICovCisgICAgaWYgKCF0bXApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKGNvbnN0cyk7CisgICAgY29uc3RzID0gdG1wOworCisgICAgY28gPSBQeUNvZGVfTmV3KGMtPnUtPnVfYXJnY291bnQsIG5sb2NhbHMsIHN0YWNrZGVwdGgoYyksIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICBieXRlY29kZSwgY29uc3RzLCBuYW1lcywgdmFybmFtZXMsCisgICAgICAgICAgICAgICAgICAgIGZyZWV2YXJzLCBjZWxsdmFycywKKyAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUsIGMtPnUtPnVfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgYy0+dS0+dV9maXJzdGxpbmVubywKKyAgICAgICAgICAgICAgICAgICAgYS0+YV9sbm90YWIpOwogIGVycm9yOgotCVB5X1hERUNSRUYoY29uc3RzKTsKLQlQeV9YREVDUkVGKG5hbWVzKTsKLQlQeV9YREVDUkVGKHZhcm5hbWVzKTsKLQlQeV9YREVDUkVGKGZpbGVuYW1lKTsKLQlQeV9YREVDUkVGKG5hbWUpOwotCVB5X1hERUNSRUYoZnJlZXZhcnMpOwotCVB5X1hERUNSRUYoY2VsbHZhcnMpOwotCVB5X1hERUNSRUYoYnl0ZWNvZGUpOwotCXJldHVybiBjbzsKKyAgICBQeV9YREVDUkVGKGNvbnN0cyk7CisgICAgUHlfWERFQ1JFRihuYW1lcyk7CisgICAgUHlfWERFQ1JFRih2YXJuYW1lcyk7CisgICAgUHlfWERFQ1JFRihmaWxlbmFtZSk7CisgICAgUHlfWERFQ1JFRihuYW1lKTsKKyAgICBQeV9YREVDUkVGKGZyZWV2YXJzKTsKKyAgICBQeV9YREVDUkVGKGNlbGx2YXJzKTsKKyAgICBQeV9YREVDUkVGKGJ5dGVjb2RlKTsKKyAgICByZXR1cm4gY287CiB9CiAKIApAQCAtMzkwNSw5MCArMzkwNSw5MCBAQAogc3RhdGljIHZvaWQKIGR1bXBfaW5zdHIoY29uc3Qgc3RydWN0IGluc3RyICppKQogewotCWNvbnN0IGNoYXIgKmpyZWwgPSBpLT5pX2pyZWwgPyAianJlbCAiIDogIiI7Ci0JY29uc3QgY2hhciAqamFicyA9IGktPmlfamFicyA/ICJqYWJzICIgOiAiIjsKLQljaGFyIGFyZ1sxMjhdOworICAgIGNvbnN0IGNoYXIgKmpyZWwgPSBpLT5pX2pyZWwgPyAianJlbCAiIDogIiI7CisgICAgY29uc3QgY2hhciAqamFicyA9IGktPmlfamFicyA/ICJqYWJzICIgOiAiIjsKKyAgICBjaGFyIGFyZ1sxMjhdOwogCi0JKmFyZyA9ICdcMCc7Ci0JaWYgKGktPmlfaGFzYXJnKQotCQlzcHJpbnRmKGFyZywgImFyZzogJWQgIiwgaS0+aV9vcGFyZyk7CisgICAgKmFyZyA9ICdcMCc7CisgICAgaWYgKGktPmlfaGFzYXJnKQorICAgICAgICBzcHJpbnRmKGFyZywgImFyZzogJWQgIiwgaS0+aV9vcGFyZyk7CiAKLQlmcHJpbnRmKHN0ZGVyciwgImxpbmU6ICVkLCBvcGNvZGU6ICVkICVzJXMlc1xuIiwgCi0JCQlpLT5pX2xpbmVubywgaS0+aV9vcGNvZGUsIGFyZywgamFicywganJlbCk7CisgICAgZnByaW50ZihzdGRlcnIsICJsaW5lOiAlZCwgb3Bjb2RlOiAlZCAlcyVzJXNcbiIsCisgICAgICAgICAgICAgICAgICAgIGktPmlfbGluZW5vLCBpLT5pX29wY29kZSwgYXJnLCBqYWJzLCBqcmVsKTsKIH0KIAogc3RhdGljIHZvaWQKIGR1bXBfYmFzaWNibG9jayhjb25zdCBiYXNpY2Jsb2NrICpiKQogewotCWNvbnN0IGNoYXIgKnNlZW4gPSBiLT5iX3NlZW4gPyAic2VlbiAiIDogIiI7Ci0JY29uc3QgY2hhciAqYl9yZXR1cm4gPSBiLT5iX3JldHVybiA/ICJyZXR1cm4gIiA6ICIiOwotCWZwcmludGYoc3RkZXJyLCAidXNlZDogJWQsIGRlcHRoOiAlZCwgb2Zmc2V0OiAlZCAlcyVzXG4iLAotCQliLT5iX2l1c2VkLCBiLT5iX3N0YXJ0ZGVwdGgsIGItPmJfb2Zmc2V0LCBzZWVuLCBiX3JldHVybik7Ci0JaWYgKGItPmJfaW5zdHIpIHsKLQkJaW50IGk7Ci0JCWZvciAoaSA9IDA7IGkgPCBiLT5iX2l1c2VkOyBpKyspIHsKLQkJCWZwcmludGYoc3RkZXJyLCAiICBbJTAyZF0gIiwgaSk7Ci0JCQlkdW1wX2luc3RyKGItPmJfaW5zdHIgKyBpKTsKLQkJfQotCX0KKyAgICBjb25zdCBjaGFyICpzZWVuID0gYi0+Yl9zZWVuID8gInNlZW4gIiA6ICIiOworICAgIGNvbnN0IGNoYXIgKmJfcmV0dXJuID0gYi0+Yl9yZXR1cm4gPyAicmV0dXJuICIgOiAiIjsKKyAgICBmcHJpbnRmKHN0ZGVyciwgInVzZWQ6ICVkLCBkZXB0aDogJWQsIG9mZnNldDogJWQgJXMlc1xuIiwKKyAgICAgICAgYi0+Yl9pdXNlZCwgYi0+Yl9zdGFydGRlcHRoLCBiLT5iX29mZnNldCwgc2VlbiwgYl9yZXR1cm4pOworICAgIGlmIChiLT5iX2luc3RyKSB7CisgICAgICAgIGludCBpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYi0+Yl9pdXNlZDsgaSsrKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgWyUwMmRdICIsIGkpOworICAgICAgICAgICAgZHVtcF9pbnN0cihiLT5iX2luc3RyICsgaSk7CisgICAgICAgIH0KKyAgICB9CiB9CiAjZW5kaWYKIAogc3RhdGljIFB5Q29kZU9iamVjdCAqCiBhc3NlbWJsZShzdHJ1Y3QgY29tcGlsZXIgKmMsIGludCBhZGROb25lKQogewotCWJhc2ljYmxvY2sgKmIsICplbnRyeWJsb2NrOwotCXN0cnVjdCBhc3NlbWJsZXIgYTsKLQlpbnQgaSwgaiwgbmJsb2NrczsKLQlQeUNvZGVPYmplY3QgKmNvID0gTlVMTDsKKyAgICBiYXNpY2Jsb2NrICpiLCAqZW50cnlibG9jazsKKyAgICBzdHJ1Y3QgYXNzZW1ibGVyIGE7CisgICAgaW50IGksIGosIG5ibG9ja3M7CisgICAgUHlDb2RlT2JqZWN0ICpjbyA9IE5VTEw7CiAKLQkvKiBNYWtlIHN1cmUgZXZlcnkgYmxvY2sgdGhhdCBmYWxscyBvZmYgdGhlIGVuZCByZXR1cm5zIE5vbmUuCi0JICAgWFhYIE5FWFRfQkxPQ0soKSBpc24ndCBxdWl0ZSByaWdodCwgYmVjYXVzZSBpZiB0aGUgbGFzdAotCSAgIGJsb2NrIGVuZHMgd2l0aCBhIGp1bXAgb3IgcmV0dXJuIGJfbmV4dCBzaG91bGRuJ3Qgc2V0LgotCSAqLwotCWlmICghYy0+dS0+dV9jdXJibG9jay0+Yl9yZXR1cm4pIHsKLQkJTkVYVF9CTE9DSyhjKTsKLQkJaWYgKGFkZE5vbmUpCi0JCQlBRERPUF9PKGMsIExPQURfQ09OU1QsIFB5X05vbmUsIGNvbnN0cyk7Ci0JCUFERE9QKGMsIFJFVFVSTl9WQUxVRSk7Ci0JfQorICAgIC8qIE1ha2Ugc3VyZSBldmVyeSBibG9jayB0aGF0IGZhbGxzIG9mZiB0aGUgZW5kIHJldHVybnMgTm9uZS4KKyAgICAgICBYWFggTkVYVF9CTE9DSygpIGlzbid0IHF1aXRlIHJpZ2h0LCBiZWNhdXNlIGlmIHRoZSBsYXN0CisgICAgICAgYmxvY2sgZW5kcyB3aXRoIGEganVtcCBvciByZXR1cm4gYl9uZXh0IHNob3VsZG4ndCBzZXQuCisgICAgICovCisgICAgaWYgKCFjLT51LT51X2N1cmJsb2NrLT5iX3JldHVybikgeworICAgICAgICBORVhUX0JMT0NLKGMpOworICAgICAgICBpZiAoYWRkTm9uZSkKKyAgICAgICAgICAgIEFERE9QX08oYywgTE9BRF9DT05TVCwgUHlfTm9uZSwgY29uc3RzKTsKKyAgICAgICAgQURET1AoYywgUkVUVVJOX1ZBTFVFKTsKKyAgICB9CiAKLQluYmxvY2tzID0gMDsKLQllbnRyeWJsb2NrID0gTlVMTDsKLQlmb3IgKGIgPSBjLT51LT51X2Jsb2NrczsgYiAhPSBOVUxMOyBiID0gYi0+Yl9saXN0KSB7Ci0JCW5ibG9ja3MrKzsKLQkJZW50cnlibG9jayA9IGI7IAotCX0KKyAgICBuYmxvY2tzID0gMDsKKyAgICBlbnRyeWJsb2NrID0gTlVMTDsKKyAgICBmb3IgKGIgPSBjLT51LT51X2Jsb2NrczsgYiAhPSBOVUxMOyBiID0gYi0+Yl9saXN0KSB7CisgICAgICAgIG5ibG9ja3MrKzsKKyAgICAgICAgZW50cnlibG9jayA9IGI7CisgICAgfQogCi0JLyogU2V0IGZpcnN0bGluZW5vIGlmIGl0IHdhc24ndCBleHBsaWNpdGx5IHNldC4gKi8KLQlpZiAoIWMtPnUtPnVfZmlyc3RsaW5lbm8pIHsKLQkJaWYgKGVudHJ5YmxvY2sgJiYgZW50cnlibG9jay0+Yl9pbnN0cikKLQkJCWMtPnUtPnVfZmlyc3RsaW5lbm8gPSBlbnRyeWJsb2NrLT5iX2luc3RyLT5pX2xpbmVubzsKLQkJZWxzZQotCQkJYy0+dS0+dV9maXJzdGxpbmVubyA9IDE7Ci0JfQotCWlmICghYXNzZW1ibGVfaW5pdCgmYSwgbmJsb2NrcywgYy0+dS0+dV9maXJzdGxpbmVubykpCi0JCWdvdG8gZXJyb3I7Ci0JZGZzKGMsIGVudHJ5YmxvY2ssICZhKTsKKyAgICAvKiBTZXQgZmlyc3RsaW5lbm8gaWYgaXQgd2Fzbid0IGV4cGxpY2l0bHkgc2V0LiAqLworICAgIGlmICghYy0+dS0+dV9maXJzdGxpbmVubykgeworICAgICAgICBpZiAoZW50cnlibG9jayAmJiBlbnRyeWJsb2NrLT5iX2luc3RyKQorICAgICAgICAgICAgYy0+dS0+dV9maXJzdGxpbmVubyA9IGVudHJ5YmxvY2stPmJfaW5zdHItPmlfbGluZW5vOworICAgICAgICBlbHNlCisgICAgICAgICAgICBjLT51LT51X2ZpcnN0bGluZW5vID0gMTsKKyAgICB9CisgICAgaWYgKCFhc3NlbWJsZV9pbml0KCZhLCBuYmxvY2tzLCBjLT51LT51X2ZpcnN0bGluZW5vKSkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBkZnMoYywgZW50cnlibG9jaywgJmEpOwogCi0JLyogQ2FuJ3QgbW9kaWZ5IHRoZSBieXRlY29kZSBhZnRlciBjb21wdXRpbmcganVtcCBvZmZzZXRzLiAqLwotCWFzc2VtYmxlX2p1bXBfb2Zmc2V0cygmYSwgYyk7CisgICAgLyogQ2FuJ3QgbW9kaWZ5IHRoZSBieXRlY29kZSBhZnRlciBjb21wdXRpbmcganVtcCBvZmZzZXRzLiAqLworICAgIGFzc2VtYmxlX2p1bXBfb2Zmc2V0cygmYSwgYyk7CiAKLQkvKiBFbWl0IGNvZGUgaW4gcmV2ZXJzZSBwb3N0b3JkZXIgZnJvbSBkZnMuICovCi0JZm9yIChpID0gYS5hX25ibG9ja3MgLSAxOyBpID49IDA7IGktLSkgewotCQliID0gYS5hX3Bvc3RvcmRlcltpXTsKLQkJZm9yIChqID0gMDsgaiA8IGItPmJfaXVzZWQ7IGorKykKLQkJCWlmICghYXNzZW1ibGVfZW1pdCgmYSwgJmItPmJfaW5zdHJbal0pKQotCQkJCWdvdG8gZXJyb3I7Ci0JfQorICAgIC8qIEVtaXQgY29kZSBpbiByZXZlcnNlIHBvc3RvcmRlciBmcm9tIGRmcy4gKi8KKyAgICBmb3IgKGkgPSBhLmFfbmJsb2NrcyAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgIGIgPSBhLmFfcG9zdG9yZGVyW2ldOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgYi0+Yl9pdXNlZDsgaisrKQorICAgICAgICAgICAgaWYgKCFhc3NlbWJsZV9lbWl0KCZhLCAmYi0+Yl9pbnN0cltqXSkpCisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CiAKLQlpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmYS5hX2xub3RhYiwgYS5hX2xub3RhYl9vZmYpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmYS5hX2J5dGVjb2RlLCBhLmFfb2Zmc2V0KSA8IDApCi0JCWdvdG8gZXJyb3I7CisgICAgaWYgKF9QeVN0cmluZ19SZXNpemUoJmEuYV9sbm90YWIsIGEuYV9sbm90YWJfb2ZmKSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgaWYgKF9QeVN0cmluZ19SZXNpemUoJmEuYV9ieXRlY29kZSwgYS5hX29mZnNldCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOwogCi0JY28gPSBtYWtlY29kZShjLCAmYSk7CisgICAgY28gPSBtYWtlY29kZShjLCAmYSk7CiAgZXJyb3I6Ci0JYXNzZW1ibGVfZnJlZSgmYSk7Ci0JcmV0dXJuIGNvOworICAgIGFzc2VtYmxlX2ZyZWUoJmEpOworICAgIHJldHVybiBjbzsKIH0KZGlmZiAtLWdpdCBhL1B5dGhvbi9keW5sb2FkX2FpeC5jIGIvUHl0aG9uL2R5bmxvYWRfYWl4LmMKaW5kZXggN2E2MDRmMi4uOGQ1NmQ3ZCAxMDA2NDQKLS0tIGEvUHl0aG9uL2R5bmxvYWRfYWl4LmMKKysrIGIvUHl0aG9uL2R5bmxvYWRfYWl4LmMKQEAgLTQsMTAgKzQsMTAgQEAKICNpbmNsdWRlICJQeXRob24uaCIKICNpbmNsdWRlICJpbXBvcnRkbC5oIgogCi0jaW5jbHVkZSA8Y3R5cGUuaD4JLyogIGZvciBpc2RpZ2l0KCkJICAqLwotI2luY2x1ZGUgPGVycm5vLmg+CS8qICBmb3IgZ2xvYmFsIGVycm5vICAgICAgKi8KLSNpbmNsdWRlIDxzdHJpbmcuaD4JLyogIGZvciBzdHJlcnJvcigpICAgICAgICAqLwotI2luY2x1ZGUgPHN0ZGxpYi5oPgkvKiAgZm9yIG1hbGxvYygpLCBmcmVlKCkgICovCisjaW5jbHVkZSA8Y3R5cGUuaD4gICAgICAvKiAgZm9yIGlzZGlnaXQoKSAgICAgICAgICovCisjaW5jbHVkZSA8ZXJybm8uaD4gICAgICAvKiAgZm9yIGdsb2JhbCBlcnJubyAgICAgICovCisjaW5jbHVkZSA8c3RyaW5nLmg+ICAgICAvKiAgZm9yIHN0cmVycm9yKCkgICAgICAgICovCisjaW5jbHVkZSA8c3RkbGliLmg+ICAgICAvKiAgZm9yIG1hbGxvYygpLCBmcmVlKCkgICovCiAjaW5jbHVkZSA8c3lzL2xkci5oPgogCiAKQEAgLTIyLDg1ICsyMiw4NSBAQAogZXh0ZXJuIGNoYXIgKlB5X0dldFByb2dyYW1OYW1lKHZvaWQpOwogCiB0eXBlZGVmIHN0cnVjdCBNb2R1bGUgewotCXN0cnVjdCBNb2R1bGUgKm5leHQ7Ci0Jdm9pZCAgICAgICAgICAqZW50cnk7CisgICAgc3RydWN0IE1vZHVsZSAqbmV4dDsKKyAgICB2b2lkICAgICAgICAgICplbnRyeTsKIH0gTW9kdWxlLCAqTW9kdWxlUHRyOwogCiBjb25zdCBzdHJ1Y3QgZmlsZWRlc2NyIF9QeUltcG9ydF9EeW5Mb2FkRmlsZXRhYltdID0gewotCXsiLnNvIiwgInJiIiwgQ19FWFRFTlNJT059LAotCXsibW9kdWxlLnNvIiwgInJiIiwgQ19FWFRFTlNJT059LAotCXswLCAwfQorICAgIHsiLnNvIiwgInJiIiwgQ19FWFRFTlNJT059LAorICAgIHsibW9kdWxlLnNvIiwgInJiIiwgQ19FWFRFTlNJT059LAorICAgIHswLCAwfQogfTsKIAogc3RhdGljIGludAogYWl4X2dldG9sZG1vZHVsZXModm9pZCAqKm1vZGxpc3RwdHIpCiB7Ci0JcmVnaXN0ZXIgTW9kdWxlUHRyICAgICAgIG1vZHB0ciwgcHJldm1vZHB0cjsKLQlyZWdpc3RlciBzdHJ1Y3QgbGRfaW5mbyAgKmxkaXB0cjsKLQlyZWdpc3RlciBjaGFyICAgICAgICAgICAgKmxkaWJ1ZjsKLQlyZWdpc3RlciBpbnQgICAgICAgICAgICAgZXJyZmxhZywgYnVmc2l6ZSA9IDEwMjQ7Ci0JcmVnaXN0ZXIgdW5zaWduZWQgaW50ICAgIG9mZnNldDsKLQljaGFyICpwcm9nbmFtZSA9IFB5X0dldFByb2dyYW1OYW1lKCk7Ci0JCi0JLyoKLQktLSBHZXQgdGhlIGxpc3Qgb2YgbG9hZGVkIG1vZHVsZXMgaW50byBsZF9pbmZvIHN0cnVjdHVyZXMuCi0JKi8KLQlpZiAoKGxkaWJ1ZiA9IG1hbGxvYyhidWZzaXplKSkgPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW1wb3J0RXJyb3IsIHN0cmVycm9yKGVycm5vKSk7Ci0JCXJldHVybiAtMTsKLQl9Ci0Jd2hpbGUgKChlcnJmbGFnID0gbG9hZHF1ZXJ5KExfR0VUSU5GTywgbGRpYnVmLCBidWZzaXplKSkgPT0gLTEKLQkgICAgICAgJiYgZXJybm8gPT0gRU5PTUVNKSB7Ci0JCWZyZWUobGRpYnVmKTsKLQkJYnVmc2l6ZSArPSAxMDI0OwotCQlpZiAoKGxkaWJ1ZiA9IG1hbGxvYyhidWZzaXplKSkgPT0gTlVMTCkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0ltcG9ydEVycm9yLCBzdHJlcnJvcihlcnJubykpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQotCWlmIChlcnJmbGFnID09IC0xKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwgc3RyZXJyb3IoZXJybm8pKTsKLQkJcmV0dXJuIC0xOwotCX0KLQkvKgotCS0tIE1ha2UgdGhlIG1vZHVsZXMgbGlzdCBmcm9tIHRoZSBsZF9pbmZvIHN0cnVjdHVyZXMuCi0JKi8KLQlsZGlwdHIgPSAoc3RydWN0IGxkX2luZm8gKilsZGlidWY7Ci0JcHJldm1vZHB0ciA9IE5VTEw7Ci0JZG8gewotCQlpZiAoc3Ryc3RyKHByb2duYW1lLCBsZGlwdHItPmxkaW5mb19maWxlbmFtZSkgPT0gTlVMTCAmJgotCQkgICAgc3Ryc3RyKGxkaXB0ci0+bGRpbmZvX2ZpbGVuYW1lLCAicHl0aG9uIikgPT0gTlVMTCkgewotCQkJLyoKLQkJCS0tIEV4dHJhY3Qgb25seSB0aGUgbW9kdWxlcyBiZWxvbmdpbmcgdG8gdGhlIG1haW4KLQkJCS0tIGV4ZWN1dGFibGUgKyB0aG9zZSBjb250YWluaW5nICJweXRob24iIGFzIGEKLQkJCS0tIHN1YnN0cmluZyAobGlrZSB0aGUgInB5dGhvblt2ZXJzaW9uXSIgYmluYXJ5IG9yCi0JCQktLSAibGlicHl0aG9uW3ZlcnNpb25dLmEiIGluIGNhc2UgaXQncyBhIHNoYXJlZCBsaWIpLgotCQkJKi8KLQkJCW9mZnNldCA9ICh1bnNpZ25lZCBpbnQpbGRpcHRyLT5sZGluZm9fbmV4dDsKLQkJCWxkaXB0ciA9IChzdHJ1Y3QgbGRfaW5mbyAqKSgoY2hhciopbGRpcHRyICsgb2Zmc2V0KTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICgobW9kcHRyID0gKE1vZHVsZVB0ciltYWxsb2Moc2l6ZW9mKE1vZHVsZSkpKSA9PSBOVUxMKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW1wb3J0RXJyb3IsIHN0cmVycm9yKGVycm5vKSk7Ci0JCQl3aGlsZSAoKm1vZGxpc3RwdHIpIHsKLQkJCQltb2RwdHIgPSAoTW9kdWxlUHRyKSptb2RsaXN0cHRyOwotCQkJCSptb2RsaXN0cHRyID0gKHZvaWQgKiltb2RwdHItPm5leHQ7Ci0JCQkJZnJlZShtb2RwdHIpOwotCQkJfQotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCW1vZHB0ci0+ZW50cnkgPSBsZGlwdHItPmxkaW5mb19kYXRhb3JnOwotCQltb2RwdHItPm5leHQgID0gTlVMTDsKLQkJaWYgKHByZXZtb2RwdHIgPT0gTlVMTCkKLQkJCSptb2RsaXN0cHRyID0gKHZvaWQgKiltb2RwdHI7Ci0JCWVsc2UKLQkJCXByZXZtb2RwdHItPm5leHQgPSBtb2RwdHI7Ci0JCXByZXZtb2RwdHIgPSBtb2RwdHI7Ci0JCW9mZnNldCA9ICh1bnNpZ25lZCBpbnQpbGRpcHRyLT5sZGluZm9fbmV4dDsKLQkJbGRpcHRyID0gKHN0cnVjdCBsZF9pbmZvICopKChjaGFyKilsZGlwdHIgKyBvZmZzZXQpOwotCX0gd2hpbGUgKG9mZnNldCk7Ci0JZnJlZShsZGlidWYpOwotCXJldHVybiAwOworICAgIHJlZ2lzdGVyIE1vZHVsZVB0ciAgICAgICBtb2RwdHIsIHByZXZtb2RwdHI7CisgICAgcmVnaXN0ZXIgc3RydWN0IGxkX2luZm8gICpsZGlwdHI7CisgICAgcmVnaXN0ZXIgY2hhciAgICAgICAgICAgICpsZGlidWY7CisgICAgcmVnaXN0ZXIgaW50ICAgICAgICAgICAgIGVycmZsYWcsIGJ1ZnNpemUgPSAxMDI0OworICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGludCAgICBvZmZzZXQ7CisgICAgY2hhciAqcHJvZ25hbWUgPSBQeV9HZXRQcm9ncmFtTmFtZSgpOworCisgICAgLyoKKyAgICAtLSBHZXQgdGhlIGxpc3Qgb2YgbG9hZGVkIG1vZHVsZXMgaW50byBsZF9pbmZvIHN0cnVjdHVyZXMuCisgICAgKi8KKyAgICBpZiAoKGxkaWJ1ZiA9IG1hbGxvYyhidWZzaXplKSkgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW1wb3J0RXJyb3IsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgd2hpbGUgKChlcnJmbGFnID0gbG9hZHF1ZXJ5KExfR0VUSU5GTywgbGRpYnVmLCBidWZzaXplKSkgPT0gLTEKKyAgICAgICAgICAgJiYgZXJybm8gPT0gRU5PTUVNKSB7CisgICAgICAgIGZyZWUobGRpYnVmKTsKKyAgICAgICAgYnVmc2l6ZSArPSAxMDI0OworICAgICAgICBpZiAoKGxkaWJ1ZiA9IG1hbGxvYyhidWZzaXplKSkgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0ltcG9ydEVycm9yLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorICAgIGlmIChlcnJmbGFnID09IC0xKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICAvKgorICAgIC0tIE1ha2UgdGhlIG1vZHVsZXMgbGlzdCBmcm9tIHRoZSBsZF9pbmZvIHN0cnVjdHVyZXMuCisgICAgKi8KKyAgICBsZGlwdHIgPSAoc3RydWN0IGxkX2luZm8gKilsZGlidWY7CisgICAgcHJldm1vZHB0ciA9IE5VTEw7CisgICAgZG8geworICAgICAgICBpZiAoc3Ryc3RyKHByb2duYW1lLCBsZGlwdHItPmxkaW5mb19maWxlbmFtZSkgPT0gTlVMTCAmJgorICAgICAgICAgICAgc3Ryc3RyKGxkaXB0ci0+bGRpbmZvX2ZpbGVuYW1lLCAicHl0aG9uIikgPT0gTlVMTCkgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgIC0tIEV4dHJhY3Qgb25seSB0aGUgbW9kdWxlcyBiZWxvbmdpbmcgdG8gdGhlIG1haW4KKyAgICAgICAgICAgIC0tIGV4ZWN1dGFibGUgKyB0aG9zZSBjb250YWluaW5nICJweXRob24iIGFzIGEKKyAgICAgICAgICAgIC0tIHN1YnN0cmluZyAobGlrZSB0aGUgInB5dGhvblt2ZXJzaW9uXSIgYmluYXJ5IG9yCisgICAgICAgICAgICAtLSAibGlicHl0aG9uW3ZlcnNpb25dLmEiIGluIGNhc2UgaXQncyBhIHNoYXJlZCBsaWIpLgorICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIG9mZnNldCA9ICh1bnNpZ25lZCBpbnQpbGRpcHRyLT5sZGluZm9fbmV4dDsKKyAgICAgICAgICAgIGxkaXB0ciA9IChzdHJ1Y3QgbGRfaW5mbyAqKSgoY2hhciopbGRpcHRyICsgb2Zmc2V0KTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmICgobW9kcHRyID0gKE1vZHVsZVB0ciltYWxsb2Moc2l6ZW9mKE1vZHVsZSkpKSA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW1wb3J0RXJyb3IsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgICAgICB3aGlsZSAoKm1vZGxpc3RwdHIpIHsKKyAgICAgICAgICAgICAgICBtb2RwdHIgPSAoTW9kdWxlUHRyKSptb2RsaXN0cHRyOworICAgICAgICAgICAgICAgICptb2RsaXN0cHRyID0gKHZvaWQgKiltb2RwdHItPm5leHQ7CisgICAgICAgICAgICAgICAgZnJlZShtb2RwdHIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIG1vZHB0ci0+ZW50cnkgPSBsZGlwdHItPmxkaW5mb19kYXRhb3JnOworICAgICAgICBtb2RwdHItPm5leHQgID0gTlVMTDsKKyAgICAgICAgaWYgKHByZXZtb2RwdHIgPT0gTlVMTCkKKyAgICAgICAgICAgICptb2RsaXN0cHRyID0gKHZvaWQgKiltb2RwdHI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHByZXZtb2RwdHItPm5leHQgPSBtb2RwdHI7CisgICAgICAgIHByZXZtb2RwdHIgPSBtb2RwdHI7CisgICAgICAgIG9mZnNldCA9ICh1bnNpZ25lZCBpbnQpbGRpcHRyLT5sZGluZm9fbmV4dDsKKyAgICAgICAgbGRpcHRyID0gKHN0cnVjdCBsZF9pbmZvICopKChjaGFyKilsZGlwdHIgKyBvZmZzZXQpOworICAgIH0gd2hpbGUgKG9mZnNldCk7CisgICAgZnJlZShsZGlidWYpOworICAgIHJldHVybiAwOwogfQogCiAKQEAgLTEwOCw3NiArMTA4LDc2IEBACiBhaXhfbG9hZGVycm9yKGNvbnN0IGNoYXIgKnBhdGhuYW1lKQogewogCi0JY2hhciAqbWVzc2FnZVsxMDI0XSwgZXJyYnVmWzEwMjRdOwotCXJlZ2lzdGVyIGludCBpLGo7CisgICAgY2hhciAqbWVzc2FnZVsxMDI0XSwgZXJyYnVmWzEwMjRdOworICAgIHJlZ2lzdGVyIGludCBpLGo7CiAKLQlzdHJ1Y3QgZXJydGFiIHsgCi0JCWludCBlcnJObzsKLQkJY2hhciAqZXJyc3RyOwotCX0gbG9hZF9lcnJ0YWJbXSA9IHsKLQkJe0xfRVJST1JfVE9PTUFOWSwJInRvbyBtYW55IGVycm9ycywgcmVzdCBza2lwcGVkLiJ9LAotCQl7TF9FUlJPUl9OT0xJQiwJCSJjYW4ndCBsb2FkIGxpYnJhcnk6In0sCi0JCXtMX0VSUk9SX1VOREVGLAkJImNhbid0IGZpbmQgc3ltYm9sIGluIGxpYnJhcnk6In0sCi0JCXtMX0VSUk9SX1JMREJBRCwKLQkJICJSTEQgaW5kZXggb3V0IG9mIHJhbmdlIG9yIGJhZCByZWxvY2F0aW9uIHR5cGU6In0sCi0JCXtMX0VSUk9SX0ZPUk1BVCwJIm5vdCBhIHZhbGlkLCBleGVjdXRhYmxlIHhjb2ZmIGZpbGU6In0sCi0JCXtMX0VSUk9SX01FTUJFUiwKLQkJICJmaWxlIG5vdCBhbiBhcmNoaXZlIG9yIGRvZXMgbm90IGNvbnRhaW4gcmVxdWVzdGVkIG1lbWJlcjoifSwKLQkJe0xfRVJST1JfVFlQRSwJCSJzeW1ib2wgdGFibGUgbWlzbWF0Y2g6In0sCi0JCXtMX0VSUk9SX0FMSUdOLAkJInRleHQgYWxpZ25tZW50IGluIGZpbGUgaXMgd3JvbmcuIn0sCi0JCXtMX0VSUk9SX1NZU1RFTSwJIlN5c3RlbSBlcnJvcjoifSwKLQkJe0xfRVJST1JfRVJSTk8sCQlOVUxMfQotCX07CisgICAgc3RydWN0IGVycnRhYiB7CisgICAgICAgIGludCBlcnJObzsKKyAgICAgICAgY2hhciAqZXJyc3RyOworICAgIH0gbG9hZF9lcnJ0YWJbXSA9IHsKKyAgICAgICAge0xfRVJST1JfVE9PTUFOWSwgICAgICAgICAgICAgICAidG9vIG1hbnkgZXJyb3JzLCByZXN0IHNraXBwZWQuIn0sCisgICAgICAgIHtMX0VSUk9SX05PTElCLCAgICAgICAgICAgICAgICAgImNhbid0IGxvYWQgbGlicmFyeToifSwKKyAgICAgICAge0xfRVJST1JfVU5ERUYsICAgICAgICAgICAgICAgICAiY2FuJ3QgZmluZCBzeW1ib2wgaW4gbGlicmFyeToifSwKKyAgICAgICAge0xfRVJST1JfUkxEQkFELAorICAgICAgICAgIlJMRCBpbmRleCBvdXQgb2YgcmFuZ2Ugb3IgYmFkIHJlbG9jYXRpb24gdHlwZToifSwKKyAgICAgICAge0xfRVJST1JfRk9STUFULCAgICAgICAgICAgICAgICAibm90IGEgdmFsaWQsIGV4ZWN1dGFibGUgeGNvZmYgZmlsZToifSwKKyAgICAgICAge0xfRVJST1JfTUVNQkVSLAorICAgICAgICAgImZpbGUgbm90IGFuIGFyY2hpdmUgb3IgZG9lcyBub3QgY29udGFpbiByZXF1ZXN0ZWQgbWVtYmVyOiJ9LAorICAgICAgICB7TF9FUlJPUl9UWVBFLCAgICAgICAgICAgICAgICAgICJzeW1ib2wgdGFibGUgbWlzbWF0Y2g6In0sCisgICAgICAgIHtMX0VSUk9SX0FMSUdOLCAgICAgICAgICAgICAgICAgInRleHQgYWxpZ25tZW50IGluIGZpbGUgaXMgd3JvbmcuIn0sCisgICAgICAgIHtMX0VSUk9SX1NZU1RFTSwgICAgICAgICAgICAgICAgIlN5c3RlbSBlcnJvcjoifSwKKyAgICAgICAge0xfRVJST1JfRVJSTk8sICAgICAgICAgICAgICAgICBOVUxMfQorICAgIH07CiAKLSNkZWZpbmUgTE9BRF9FUlJUQUJfTEVOCShzaXplb2YobG9hZF9lcnJ0YWIpL3NpemVvZihsb2FkX2VycnRhYlswXSkpCisjZGVmaW5lIExPQURfRVJSVEFCX0xFTiAoc2l6ZW9mKGxvYWRfZXJydGFiKS9zaXplb2YobG9hZF9lcnJ0YWJbMF0pKQogI2RlZmluZSBFUlJCVUZfQVBQRU5EKHMpIHN0cm5jYXQoZXJyYnVmLCBzLCBzaXplb2YoZXJyYnVmKS1zdHJsZW4oZXJyYnVmKS0xKQogCi0JUHlPU19zbnByaW50ZihlcnJidWYsIHNpemVvZihlcnJidWYpLCAiZnJvbSBtb2R1bGUgJS4yMDBzICIsIHBhdGhuYW1lKTsKKyAgICBQeU9TX3NucHJpbnRmKGVycmJ1Ziwgc2l6ZW9mKGVycmJ1ZiksICJmcm9tIG1vZHVsZSAlLjIwMHMgIiwgcGF0aG5hbWUpOwogCi0JaWYgKCFsb2FkcXVlcnkoTF9HRVRNRVNTQUdFUywgJm1lc3NhZ2VbMF0sIHNpemVvZihtZXNzYWdlKSkpIHsKLQkJRVJSQlVGX0FQUEVORChzdHJlcnJvcihlcnJubykpOwotCQlFUlJCVUZfQVBQRU5EKCJcbiIpOwotCX0KLQlmb3IoaSA9IDA7IG1lc3NhZ2VbaV0gJiYgKm1lc3NhZ2VbaV07IGkrKykgewotCQlpbnQgbmVyciA9IGF0b2kobWVzc2FnZVtpXSk7Ci0JCWZvciAoaj0wOyBqPExPQURfRVJSVEFCX0xFTiA7IGorKykgewotCQkgICAgaWYgKG5lcnIgPT0gbG9hZF9lcnJ0YWJbal0uZXJyTm8gJiYgbG9hZF9lcnJ0YWJbal0uZXJyc3RyKQotCQkJRVJSQlVGX0FQUEVORChsb2FkX2VycnRhYltqXS5lcnJzdHIpOwotCQl9Ci0JCXdoaWxlIChpc2RpZ2l0KFB5X0NIQVJNQVNLKCptZXNzYWdlW2ldKSkpIG1lc3NhZ2VbaV0rKyA7IAotCQlFUlJCVUZfQVBQRU5EKG1lc3NhZ2VbaV0pOwotCQlFUlJCVUZfQVBQRU5EKCJcbiIpOwotCX0KLQllcnJidWZbc3RybGVuKGVycmJ1ZiktMV0gPSAnXDAnOwkvKiB0cmltIG9mZiBsYXN0IG5ld2xpbmUgKi8KLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW1wb3J0RXJyb3IsIGVycmJ1Zik7IAotCXJldHVybjsgCisgICAgaWYgKCFsb2FkcXVlcnkoTF9HRVRNRVNTQUdFUywgJm1lc3NhZ2VbMF0sIHNpemVvZihtZXNzYWdlKSkpIHsKKyAgICAgICAgRVJSQlVGX0FQUEVORChzdHJlcnJvcihlcnJubykpOworICAgICAgICBFUlJCVUZfQVBQRU5EKCJcbiIpOworICAgIH0KKyAgICBmb3IoaSA9IDA7IG1lc3NhZ2VbaV0gJiYgKm1lc3NhZ2VbaV07IGkrKykgeworICAgICAgICBpbnQgbmVyciA9IGF0b2kobWVzc2FnZVtpXSk7CisgICAgICAgIGZvciAoaj0wOyBqPExPQURfRVJSVEFCX0xFTiA7IGorKykgeworICAgICAgICAgICAgaWYgKG5lcnIgPT0gbG9hZF9lcnJ0YWJbal0uZXJyTm8gJiYgbG9hZF9lcnJ0YWJbal0uZXJyc3RyKQorICAgICAgICAgICAgRVJSQlVGX0FQUEVORChsb2FkX2VycnRhYltqXS5lcnJzdHIpOworICAgICAgICB9CisgICAgICAgIHdoaWxlIChpc2RpZ2l0KFB5X0NIQVJNQVNLKCptZXNzYWdlW2ldKSkpIG1lc3NhZ2VbaV0rKyA7CisgICAgICAgIEVSUkJVRl9BUFBFTkQobWVzc2FnZVtpXSk7CisgICAgICAgIEVSUkJVRl9BUFBFTkQoIlxuIik7CisgICAgfQorICAgIGVycmJ1ZltzdHJsZW4oZXJyYnVmKS0xXSA9ICdcMCc7ICAgICAgICAgICAgLyogdHJpbSBvZmYgbGFzdCBuZXdsaW5lICovCisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0ltcG9ydEVycm9yLCBlcnJidWYpOworICAgIHJldHVybjsKIH0KIAogCiBkbF9mdW5jcHRyIF9QeUltcG9ydF9HZXREeW5Mb2FkRnVuYyhjb25zdCBjaGFyICpmcW5hbWUsIGNvbnN0IGNoYXIgKnNob3J0bmFtZSwKLQkJCQkgICAgY29uc3QgY2hhciAqcGF0aG5hbWUsIEZJTEUgKmZwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcGF0aG5hbWUsIEZJTEUgKmZwKQogewotCWRsX2Z1bmNwdHIgcDsKKyAgICBkbF9mdW5jcHRyIHA7CiAKLQkvKgotCS0tIEludm9rZSBsb2FkKCkgd2l0aCBMX05PQVVUT0RFRkVSIGxlYXZpbmcgdGhlIGltcG9ydGVkIHN5bWJvbHMKLQktLSBvZiB0aGUgc2hhcmVkIG1vZHVsZSB1bnJlc29sdmVkLiBUaHVzIHdlIGhhdmUgdG8gcmVzb2x2ZSB0aGVtCi0JLS0gZXhwbGljaXRseSB3aXRoIGxvYWRiaW5kLiBUaGUgbmV3IG1vZHVsZSBpcyBsb2FkZWQsIHRoZW4gd2UKLQktLSByZXNvbHZlIGl0cyBzeW1ib2xzIHVzaW5nIHRoZSBsaXN0IG9mIGFscmVhZHkgbG9hZGVkIG1vZHVsZXMKLQktLSAob25seSB0aG9zZSB0aGF0IGJlbG9uZyB0byB0aGUgcHl0aG9uIGV4ZWN1dGFibGUpLiBHZXQgdGhlc2UKLQktLSB3aXRoIGxvYWRxdWVyeShMX0dFVElORk8pLgotCSovCisgICAgLyoKKyAgICAtLSBJbnZva2UgbG9hZCgpIHdpdGggTF9OT0FVVE9ERUZFUiBsZWF2aW5nIHRoZSBpbXBvcnRlZCBzeW1ib2xzCisgICAgLS0gb2YgdGhlIHNoYXJlZCBtb2R1bGUgdW5yZXNvbHZlZC4gVGh1cyB3ZSBoYXZlIHRvIHJlc29sdmUgdGhlbQorICAgIC0tIGV4cGxpY2l0bHkgd2l0aCBsb2FkYmluZC4gVGhlIG5ldyBtb2R1bGUgaXMgbG9hZGVkLCB0aGVuIHdlCisgICAgLS0gcmVzb2x2ZSBpdHMgc3ltYm9scyB1c2luZyB0aGUgbGlzdCBvZiBhbHJlYWR5IGxvYWRlZCBtb2R1bGVzCisgICAgLS0gKG9ubHkgdGhvc2UgdGhhdCBiZWxvbmcgdG8gdGhlIHB5dGhvbiBleGVjdXRhYmxlKS4gR2V0IHRoZXNlCisgICAgLS0gd2l0aCBsb2FkcXVlcnkoTF9HRVRJTkZPKS4KKyAgICAqLwogCi0Jc3RhdGljIHZvaWQgKnN0YXRpY21vZGxpc3RwdHIgPSBOVUxMOworICAgIHN0YXRpYyB2b2lkICpzdGF0aWNtb2RsaXN0cHRyID0gTlVMTDsKIAotCWlmICghc3RhdGljbW9kbGlzdHB0cikKLQkJaWYgKGFpeF9nZXRvbGRtb2R1bGVzKCZzdGF0aWNtb2RsaXN0cHRyKSA9PSAtMSkKLQkJCXJldHVybiBOVUxMOwotCXAgPSAoZGxfZnVuY3B0cikgYWl4X2xvYWQoKGNoYXIgKilwYXRobmFtZSwgTF9OT0FVVE9ERUZFUiwgMCk7Ci0JaWYgKHAgPT0gTlVMTCkgewotCQlhaXhfbG9hZGVycm9yKHBhdGhuYW1lKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICghc3RhdGljbW9kbGlzdHB0cikKKyAgICAgICAgaWYgKGFpeF9nZXRvbGRtb2R1bGVzKCZzdGF0aWNtb2RsaXN0cHRyKSA9PSAtMSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIHAgPSAoZGxfZnVuY3B0cikgYWl4X2xvYWQoKGNoYXIgKilwYXRobmFtZSwgTF9OT0FVVE9ERUZFUiwgMCk7CisgICAgaWYgKHAgPT0gTlVMTCkgeworICAgICAgICBhaXhfbG9hZGVycm9yKHBhdGhuYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JcmV0dXJuIHA7CisgICAgcmV0dXJuIHA7CiB9CmRpZmYgLS1naXQgYS9QeXRob24vZHlubG9hZF9hdGhlb3MuYyBiL1B5dGhvbi9keW5sb2FkX2F0aGVvcy5jCmluZGV4IDZmNGRmNzMuLjY1ZTQxMzYgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9keW5sb2FkX2F0aGVvcy5jCisrKyBiL1B5dGhvbi9keW5sb2FkX2F0aGVvcy5jCkBAIC05LDM5ICs5LDM5IEBACiAKIAogY29uc3Qgc3RydWN0IGZpbGVkZXNjciBfUHlJbXBvcnRfRHluTG9hZEZpbGV0YWJbXSA9IHsKLQl7Ii5zbyIsICJyYiIsIENfRVhURU5TSU9OfSwKLQl7Im1vZHVsZS5zbyIsICJyYiIsIENfRVhURU5TSU9OfSwKLQl7MCwgMH0KKyAgICB7Ii5zbyIsICJyYiIsIENfRVhURU5TSU9OfSwKKyAgICB7Im1vZHVsZS5zbyIsICJyYiIsIENfRVhURU5TSU9OfSwKKyAgICB7MCwgMH0KIH07CiAKIGRsX2Z1bmNwdHIgX1B5SW1wb3J0X0dldER5bkxvYWRGdW5jKGNvbnN0IGNoYXIgKmZxbmFtZSwgY29uc3QgY2hhciAqc2hvcnRuYW1lLAotCQkJCSAgICBjb25zdCBjaGFyICpwYXRobmFtZSwgRklMRSAqZnApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwYXRobmFtZSwgRklMRSAqZnApCiB7Ci0Jdm9pZCAqcDsKLQlpbnQgbGliOwotCWNoYXIgZnVuY25hbWVbMjU4XTsKKyAgICB2b2lkICpwOworICAgIGludCBsaWI7CisgICAgY2hhciBmdW5jbmFtZVsyNThdOwogCi0JaWYgKFB5X1ZlcmJvc2VGbGFnKQotCQlwcmludGYoImxvYWRfbGlicmFyeSAlc1xuIiwgcGF0aG5hbWUpOworICAgIGlmIChQeV9WZXJib3NlRmxhZykKKyAgICAgICAgcHJpbnRmKCJsb2FkX2xpYnJhcnkgJXNcbiIsIHBhdGhuYW1lKTsKIAotCWxpYiA9IGxvYWRfbGlicmFyeShwYXRobmFtZSwgMCk7Ci0JaWYgKGxpYiA8IDApIHsKLQkJY2hhciBidWZbNTEyXTsKLQkJaWYgKFB5X1ZlcmJvc2VGbGFnKQotCQkJcGVycm9yKHBhdGhuYW1lKTsKLQkJUHlPU19zbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiRmFpbGVkIHRvIGxvYWQgJS4yMDBzOiAlLjIwMHMiLAotCQkJICAgICAgcGF0aG5hbWUsIHN0cmVycm9yKGVycm5vKSk7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwgYnVmKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5T1Nfc25wcmludGYoZnVuY25hbWUsIHNpemVvZihmdW5jbmFtZSksICJpbml0JS4yMDBzIiwgc2hvcnRuYW1lKTsKLQlpZiAoUHlfVmVyYm9zZUZsYWcpCi0JCXByaW50ZigiZ2V0X3N5bWJvbF9hZGRyZXNzICVzXG4iLCBmdW5jbmFtZSk7Ci0JaWYgKGdldF9zeW1ib2xfYWRkcmVzcyhsaWIsIGZ1bmNuYW1lLCAtMSwgJnApIDwgMCkgewotCQlwID0gTlVMTDsKLQkJaWYgKFB5X1ZlcmJvc2VGbGFnKQotCQkJcGVycm9yKGZ1bmNuYW1lKTsKLQl9CisgICAgbGliID0gbG9hZF9saWJyYXJ5KHBhdGhuYW1lLCAwKTsKKyAgICBpZiAobGliIDwgMCkgeworICAgICAgICBjaGFyIGJ1Zls1MTJdOworICAgICAgICBpZiAoUHlfVmVyYm9zZUZsYWcpCisgICAgICAgICAgICBwZXJyb3IocGF0aG5hbWUpOworICAgICAgICBQeU9TX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJGYWlsZWQgdG8gbG9hZCAlLjIwMHM6ICUuMjAwcyIsCisgICAgICAgICAgICAgICAgICAgICAgcGF0aG5hbWUsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwgYnVmKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5T1Nfc25wcmludGYoZnVuY25hbWUsIHNpemVvZihmdW5jbmFtZSksICJpbml0JS4yMDBzIiwgc2hvcnRuYW1lKTsKKyAgICBpZiAoUHlfVmVyYm9zZUZsYWcpCisgICAgICAgIHByaW50ZigiZ2V0X3N5bWJvbF9hZGRyZXNzICVzXG4iLCBmdW5jbmFtZSk7CisgICAgaWYgKGdldF9zeW1ib2xfYWRkcmVzcyhsaWIsIGZ1bmNuYW1lLCAtMSwgJnApIDwgMCkgeworICAgICAgICBwID0gTlVMTDsKKyAgICAgICAgaWYgKFB5X1ZlcmJvc2VGbGFnKQorICAgICAgICAgICAgcGVycm9yKGZ1bmNuYW1lKTsKKyAgICB9CiAKLQlyZXR1cm4gKGRsX2Z1bmNwdHIpIHA7CisgICAgcmV0dXJuIChkbF9mdW5jcHRyKSBwOwogfQpkaWZmIC0tZ2l0IGEvUHl0aG9uL2R5bmxvYWRfYmVvcy5jIGIvUHl0aG9uL2R5bmxvYWRfYmVvcy5jCmluZGV4IDViMDVkNmIuLmY1Y2ExZWMgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9keW5sb2FkX2Jlb3MuYworKysgYi9QeXRob24vZHlubG9hZF9iZW9zLmMKQEAgLTksOSArOSw5IEBACiAjaW5jbHVkZSAiaW1wb3J0ZGwuaCIKIAogY29uc3Qgc3RydWN0IGZpbGVkZXNjciBfUHlJbXBvcnRfRHluTG9hZEZpbGV0YWJbXSA9IHsKLQl7Ii5zbyIsICJyYiIsIENfRVhURU5TSU9OfSwKLQl7Im1vZHVsZS5zbyIsICJyYiIsIENfRVhURU5TSU9OfSwKLQl7MCwgMH0KKyAgICB7Ii5zbyIsICJyYiIsIENfRVhURU5TSU9OfSwKKyAgICB7Im1vZHVsZS5zbyIsICJyYiIsIENfRVhURU5TSU9OfSwKKyAgICB7MCwgMH0KIH07CiAKICNpZiBkZWZpbmVkKE1BWFBBVEhMRU4pICYmICFkZWZpbmVkKF9TWVNfUEFSQU1fSCkKQEAgLTUyLDEzICs1MiwxMyBAQAogICovCiBzdGF0aWMgdm9pZCBiZW9zX251a2VfZHluKCBQeU9iamVjdCAqaXRlbSApCiB7Ci0Jc3RhdHVzX3QgcmV0dmFsOworICAgIHN0YXR1c190IHJldHZhbDsKIAotCWlmKCBpdGVtICkgewotCQlpbWFnZV9pZCBpZCA9IChpbWFnZV9pZClQeUludF9Bc0xvbmcoIGl0ZW0gKTsKLQkJCi0JCXJldHZhbCA9IHVubG9hZF9hZGRfb24oIGlkICk7Ci0JfQorICAgIGlmKCBpdGVtICkgeworICAgICAgICBpbWFnZV9pZCBpZCA9IChpbWFnZV9pZClQeUludF9Bc0xvbmcoIGl0ZW0gKTsKKworICAgICAgICByZXR2YWwgPSB1bmxvYWRfYWRkX29uKCBpZCApOworICAgIH0KIH0KIAogLyogYXRleGl0KCkgaGFuZGxlciB0aGF0J2xsIGNhbGwgdW5sb2FkX2FkZF9vbigpIGZvciBldmVyeSBpdGVtIGluIHRoZQpAQCAtNjYsMzEgKzY2LDMxIEBACiAgKi8KIHN0YXRpYyB2b2lkIGJlb3NfY2xlYW51cF9keW4oIHZvaWQgKQogewotCWlmKCBiZW9zX2R5bl9pbWFnZXMgKSB7Ci0JCWludCBpZHg7Ci0JCWludCBsaXN0X3NpemU7Ci0JCVB5T2JqZWN0ICppZF9saXN0OworICAgIGlmKCBiZW9zX2R5bl9pbWFnZXMgKSB7CisgICAgICAgIGludCBpZHg7CisgICAgICAgIGludCBsaXN0X3NpemU7CisgICAgICAgIFB5T2JqZWN0ICppZF9saXN0OwogCiAjaWZkZWYgV0lUSF9USFJFQUQKLQkJUHlUaHJlYWRfYWNxdWlyZV9sb2NrKCBiZW9zX2R5bl9sb2NrLCAxICk7CisgICAgICAgIFB5VGhyZWFkX2FjcXVpcmVfbG9jayggYmVvc19keW5fbG9jaywgMSApOwogI2VuZGlmCiAKLQkJaWRfbGlzdCA9IFB5RGljdF9WYWx1ZXMoIGJlb3NfZHluX2ltYWdlcyApOworICAgICAgICBpZF9saXN0ID0gUHlEaWN0X1ZhbHVlcyggYmVvc19keW5faW1hZ2VzICk7CiAKLQkJbGlzdF9zaXplID0gUHlMaXN0X1NpemUoIGlkX2xpc3QgKTsKLQkJZm9yKCBpZHggPSAwOyBpZHggPCBsaXN0X3NpemU7IGlkeCsrICkgewotCQkJUHlPYmplY3QgKnRoZV9pdGVtOwotCQkJCi0JCQl0aGVfaXRlbSA9IFB5TGlzdF9HZXRJdGVtKCBpZF9saXN0LCBpZHggKTsKLQkJCWJlb3NfbnVrZV9keW4oIHRoZV9pdGVtICk7Ci0JCX0KKyAgICAgICAgbGlzdF9zaXplID0gUHlMaXN0X1NpemUoIGlkX2xpc3QgKTsKKyAgICAgICAgZm9yKCBpZHggPSAwOyBpZHggPCBsaXN0X3NpemU7IGlkeCsrICkgeworICAgICAgICAgICAgUHlPYmplY3QgKnRoZV9pdGVtOwogCi0JCVB5RGljdF9DbGVhciggYmVvc19keW5faW1hZ2VzICk7CisgICAgICAgICAgICB0aGVfaXRlbSA9IFB5TGlzdF9HZXRJdGVtKCBpZF9saXN0LCBpZHggKTsKKyAgICAgICAgICAgIGJlb3NfbnVrZV9keW4oIHRoZV9pdGVtICk7CisgICAgICAgIH0KKworICAgICAgICBQeURpY3RfQ2xlYXIoIGJlb3NfZHluX2ltYWdlcyApOwogCiAjaWZkZWYgV0lUSF9USFJFQUQKLQkJUHlUaHJlYWRfZnJlZV9sb2NrKCBiZW9zX2R5bl9sb2NrICk7CisgICAgICAgIFB5VGhyZWFkX2ZyZWVfbG9jayggYmVvc19keW5fbG9jayApOwogI2VuZGlmCi0JfQorICAgIH0KIH0KIAogLyoKQEAgLTk4LDIwICs5OCwyMCBAQAogICovCiBzdGF0aWMgdm9pZCBiZW9zX2luaXRfZHluKCB2b2lkICkKIHsKLQkvKiBXZSdyZSBwcm90ZWN0ZWQgZnJvbSBhIHJhY2UgY29uZGl0aW9uIGhlcmUgYnkgdGhlIGF0b21pYyBpbml0X2NvdW50Ci0JICogdmFyaWFibGUuCi0JICovCi0Jc3RhdGljIGludDMyIGluaXRfY291bnQgPSAwOwotCWludDMyIHZhbDsKKyAgICAvKiBXZSdyZSBwcm90ZWN0ZWQgZnJvbSBhIHJhY2UgY29uZGl0aW9uIGhlcmUgYnkgdGhlIGF0b21pYyBpbml0X2NvdW50CisgICAgICogdmFyaWFibGUuCisgICAgICovCisgICAgc3RhdGljIGludDMyIGluaXRfY291bnQgPSAwOworICAgIGludDMyIHZhbDsKIAotCXZhbCA9IGF0b21pY19hZGQoICZpbml0X2NvdW50LCAxICk7Ci0JaWYoIGJlb3NfZHluX2ltYWdlcyA9PSBOVUxMICYmIHZhbCA9PSAwICkgewotCQliZW9zX2R5bl9pbWFnZXMgPSBQeURpY3RfTmV3KCk7CisgICAgdmFsID0gYXRvbWljX2FkZCggJmluaXRfY291bnQsIDEgKTsKKyAgICBpZiggYmVvc19keW5faW1hZ2VzID09IE5VTEwgJiYgdmFsID09IDAgKSB7CisgICAgICAgIGJlb3NfZHluX2ltYWdlcyA9IFB5RGljdF9OZXcoKTsKICNpZmRlZiBXSVRIX1RIUkVBRAotCQliZW9zX2R5bl9sb2NrID0gUHlUaHJlYWRfYWxsb2NhdGVfbG9jaygpOworICAgICAgICBiZW9zX2R5bl9sb2NrID0gUHlUaHJlYWRfYWxsb2NhdGVfbG9jaygpOwogI2VuZGlmCi0JCWF0ZXhpdCggYmVvc19jbGVhbnVwX2R5biApOwotCX0KKyAgICAgICAgYXRleGl0KCBiZW9zX2NsZWFudXBfZHluICk7CisgICAgfQogfQogCiAvKgpAQCAtMTIyLDEzMyArMTIyLDEzMyBAQAogICovCiBzdGF0aWMgdm9pZCBiZW9zX2FkZF9keW4oIGNoYXIgKm5hbWUsIGltYWdlX2lkIGlkICkKIHsKLQlpbnQgcmV0dmFsOwotCVB5T2JqZWN0ICpweV9pZDsKKyAgICBpbnQgcmV0dmFsOworICAgIFB5T2JqZWN0ICpweV9pZDsKIAotCWlmKCBiZW9zX2R5bl9pbWFnZXMgPT0gTlVMTCApIHsKLQkJYmVvc19pbml0X2R5bigpOwotCX0KKyAgICBpZiggYmVvc19keW5faW1hZ2VzID09IE5VTEwgKSB7CisgICAgICAgIGJlb3NfaW5pdF9keW4oKTsKKyAgICB9CiAKICNpZmRlZiBXSVRIX1RIUkVBRAotCXJldHZhbCA9IFB5VGhyZWFkX2FjcXVpcmVfbG9jayggYmVvc19keW5fbG9jaywgMSApOworICAgIHJldHZhbCA9IFB5VGhyZWFkX2FjcXVpcmVfbG9jayggYmVvc19keW5fbG9jaywgMSApOwogI2VuZGlmCiAKLQkvKiBJZiB0aGVyZSdzIGFscmVhZHkgYW4gb2JqZWN0IHdpdGggdGhpcyBrZXkgaW4gdGhlIGRpY3Rpb25hcnksCi0JICogd2UncmUgZG9pbmcgYSByZWxvYWQoKSwgc28gbGV0J3MgbnVrZSBpdC4KLQkgKi8KLQlweV9pZCA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKCBiZW9zX2R5bl9pbWFnZXMsIG5hbWUgKTsKLQlpZiggcHlfaWQgKSB7Ci0JCWJlb3NfbnVrZV9keW4oIHB5X2lkICk7Ci0JCXJldHZhbCA9IFB5RGljdF9EZWxJdGVtU3RyaW5nKCBiZW9zX2R5bl9pbWFnZXMsIG5hbWUgKTsKLQl9CisgICAgLyogSWYgdGhlcmUncyBhbHJlYWR5IGFuIG9iamVjdCB3aXRoIHRoaXMga2V5IGluIHRoZSBkaWN0aW9uYXJ5LAorICAgICAqIHdlJ3JlIGRvaW5nIGEgcmVsb2FkKCksIHNvIGxldCdzIG51a2UgaXQuCisgICAgICovCisgICAgcHlfaWQgPSBQeURpY3RfR2V0SXRlbVN0cmluZyggYmVvc19keW5faW1hZ2VzLCBuYW1lICk7CisgICAgaWYoIHB5X2lkICkgeworICAgICAgICBiZW9zX251a2VfZHluKCBweV9pZCApOworICAgICAgICByZXR2YWwgPSBQeURpY3RfRGVsSXRlbVN0cmluZyggYmVvc19keW5faW1hZ2VzLCBuYW1lICk7CisgICAgfQogCi0JcHlfaWQgPSBQeUludF9Gcm9tTG9uZyggKGxvbmcpaWQgKTsKLQlpZiggcHlfaWQgKSB7Ci0JCXJldHZhbCA9IFB5RGljdF9TZXRJdGVtU3RyaW5nKCBiZW9zX2R5bl9pbWFnZXMsIG5hbWUsIHB5X2lkICk7Ci0JfQorICAgIHB5X2lkID0gUHlJbnRfRnJvbUxvbmcoIChsb25nKWlkICk7CisgICAgaWYoIHB5X2lkICkgeworICAgICAgICByZXR2YWwgPSBQeURpY3RfU2V0SXRlbVN0cmluZyggYmVvc19keW5faW1hZ2VzLCBuYW1lLCBweV9pZCApOworICAgIH0KIAogI2lmZGVmIFdJVEhfVEhSRUFECi0JUHlUaHJlYWRfcmVsZWFzZV9sb2NrKCBiZW9zX2R5bl9sb2NrICk7CisgICAgUHlUaHJlYWRfcmVsZWFzZV9sb2NrKCBiZW9zX2R5bl9sb2NrICk7CiAjZW5kaWYKIH0KIAogCiAKIGRsX2Z1bmNwdHIgX1B5SW1wb3J0X0dldER5bkxvYWRGdW5jKGNvbnN0IGNoYXIgKmZxbmFtZSwgY29uc3QgY2hhciAqc2hvcnRuYW1lLAotCQkJCSAgICBjb25zdCBjaGFyICpwYXRobmFtZSwgRklMRSAqZnApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwYXRobmFtZSwgRklMRSAqZnApCiB7Ci0JZGxfZnVuY3B0ciBwOwotCWltYWdlX2lkIHRoZV9pZDsKLQlzdGF0dXNfdCByZXR2YWw7Ci0JY2hhciBmdWxscGF0aFtQQVRIX01BWF07Ci0JY2hhciBmdW5jbmFtZVsyNThdOworICAgIGRsX2Z1bmNwdHIgcDsKKyAgICBpbWFnZV9pZCB0aGVfaWQ7CisgICAgc3RhdHVzX3QgcmV0dmFsOworICAgIGNoYXIgZnVsbHBhdGhbUEFUSF9NQVhdOworICAgIGNoYXIgZnVuY25hbWVbMjU4XTsKIAotCWlmKCBQeV9WZXJib3NlRmxhZyApIHsKLQkJcHJpbnRmKCAibG9hZF9hZGRfb24oICVzIClcbiIsIHBhdGhuYW1lICk7Ci0JfQorICAgIGlmKCBQeV9WZXJib3NlRmxhZyApIHsKKyAgICAgICAgcHJpbnRmKCAibG9hZF9hZGRfb24oICVzIClcbiIsIHBhdGhuYW1lICk7CisgICAgfQogCi0JLyogSG1tLCB0aGlzIG9sZCBidWcgYXBwZWFycyB0byBoYXZlIHJlZ2VuZXJhdGVkIGl0c2VsZjsgaWYgdGhlCi0JICogcGF0aCBpc24ndCBhYnNvbHV0ZSwgbG9hZF9hZGRfb24oKSB3aWxsIGZhaWwuICBSZXBvcnRlZCB0byBCZQotCSAqIEFwcmlsIDIxLCAxOTk4LgotCSAqLwotCWlmKCBwYXRobmFtZVswXSAhPSAnLycgKSB7Ci0JCSh2b2lkKWdldGN3ZCggZnVsbHBhdGgsIFBBVEhfTUFYICk7Ci0JCSh2b2lkKXN0cm5jYXQoIGZ1bGxwYXRoLCAiLyIsIFBBVEhfTUFYICk7Ci0JCSh2b2lkKXN0cm5jYXQoIGZ1bGxwYXRoLCBwYXRobmFtZSwgUEFUSF9NQVggKTsKLQkJCQotCQlpZiggUHlfVmVyYm9zZUZsYWcgKSB7Ci0JCQlwcmludGYoICJsb2FkX2FkZF9vbiggJXMgKVxuIiwgZnVsbHBhdGggKTsKLQkJfQotCX0gZWxzZSB7Ci0JCSh2b2lkKXN0cmNweSggZnVsbHBhdGgsIHBhdGhuYW1lICk7Ci0JfQorICAgIC8qIEhtbSwgdGhpcyBvbGQgYnVnIGFwcGVhcnMgdG8gaGF2ZSByZWdlbmVyYXRlZCBpdHNlbGY7IGlmIHRoZQorICAgICAqIHBhdGggaXNuJ3QgYWJzb2x1dGUsIGxvYWRfYWRkX29uKCkgd2lsbCBmYWlsLiAgUmVwb3J0ZWQgdG8gQmUKKyAgICAgKiBBcHJpbCAyMSwgMTk5OC4KKyAgICAgKi8KKyAgICBpZiggcGF0aG5hbWVbMF0gIT0gJy8nICkgeworICAgICAgICAodm9pZClnZXRjd2QoIGZ1bGxwYXRoLCBQQVRIX01BWCApOworICAgICAgICAodm9pZClzdHJuY2F0KCBmdWxscGF0aCwgIi8iLCBQQVRIX01BWCApOworICAgICAgICAodm9pZClzdHJuY2F0KCBmdWxscGF0aCwgcGF0aG5hbWUsIFBBVEhfTUFYICk7CiAKLQl0aGVfaWQgPSBsb2FkX2FkZF9vbiggZnVsbHBhdGggKTsKLQlpZiggdGhlX2lkIDwgQl9OT19FUlJPUiApIHsKLQkJLyogSXQncyB0b28gYmFkIGxvYWRfYWRkX29uKCkgZG9lc24ndCBzZXQgZXJybm8gb3Igc29tZXRoaW5nLi4uCi0JCSAqLwotCQljaGFyIGJ1ZmZbMjU2XTsgIC8qIGhhdGUgaGFyZC1jb2RlZCBzdHJpbmcgc2l6ZXMuLi4gKi8KKyAgICAgICAgaWYoIFB5X1ZlcmJvc2VGbGFnICkgeworICAgICAgICAgICAgcHJpbnRmKCAibG9hZF9hZGRfb24oICVzIClcbiIsIGZ1bGxwYXRoICk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAodm9pZClzdHJjcHkoIGZ1bGxwYXRoLCBwYXRobmFtZSApOworICAgIH0KIAotCQlpZiggUHlfVmVyYm9zZUZsYWcgKSB7Ci0JCQlwcmludGYoICJsb2FkX2FkZF9vbiggJXMgKSBmYWlsZWQiLCBmdWxscGF0aCApOwotCQl9CisgICAgdGhlX2lkID0gbG9hZF9hZGRfb24oIGZ1bGxwYXRoICk7CisgICAgaWYoIHRoZV9pZCA8IEJfTk9fRVJST1IgKSB7CisgICAgICAgIC8qIEl0J3MgdG9vIGJhZCBsb2FkX2FkZF9vbigpIGRvZXNuJ3Qgc2V0IGVycm5vIG9yIHNvbWV0aGluZy4uLgorICAgICAgICAgKi8KKyAgICAgICAgY2hhciBidWZmWzI1Nl07ICAvKiBoYXRlIGhhcmQtY29kZWQgc3RyaW5nIHNpemVzLi4uICovCiAKLQkJaWYoIHRoZV9pZCA9PSBCX0VSUk9SICkKLQkJCVB5T1Nfc25wcmludGYoIGJ1ZmYsIHNpemVvZihidWZmKSwKLQkJCQkgICAgICAgIkJlT1M6IEZhaWxlZCB0byBsb2FkICUuMjAwcyIsCi0JCQkJICAgICAgIGZ1bGxwYXRoICk7Ci0JCWVsc2UKLQkJCVB5T1Nfc25wcmludGYoIGJ1ZmYsIHNpemVvZihidWZmKSwgCi0JCQkJICAgICAgICJVbmtub3duIGVycm9yIGxvYWRpbmcgJS4yMDBzIiwgCi0JCQkJICAgICAgIGZ1bGxwYXRoICk7CisgICAgICAgIGlmKCBQeV9WZXJib3NlRmxhZyApIHsKKyAgICAgICAgICAgIHByaW50ZiggImxvYWRfYWRkX29uKCAlcyApIGZhaWxlZCIsIGZ1bGxwYXRoICk7CisgICAgICAgIH0KIAotCQlQeUVycl9TZXRTdHJpbmcoIFB5RXhjX0ltcG9ydEVycm9yLCBidWZmICk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICAgICAgaWYoIHRoZV9pZCA9PSBCX0VSUk9SICkKKyAgICAgICAgICAgIFB5T1Nfc25wcmludGYoIGJ1ZmYsIHNpemVvZihidWZmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJCZU9TOiBGYWlsZWQgdG8gbG9hZCAlLjIwMHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVsbHBhdGggKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgUHlPU19zbnByaW50ZiggYnVmZiwgc2l6ZW9mKGJ1ZmYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVua25vd24gZXJyb3IgbG9hZGluZyAlLjIwMHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVsbHBhdGggKTsKIAotCVB5T1Nfc25wcmludGYoZnVuY25hbWUsIHNpemVvZihmdW5jbmFtZSksICJpbml0JS4yMDBzIiwgc2hvcnRuYW1lKTsKLQlpZiggUHlfVmVyYm9zZUZsYWcgKSB7Ci0JCXByaW50ZiggImdldF9pbWFnZV9zeW1ib2woICVzIClcbiIsIGZ1bmNuYW1lICk7Ci0JfQorICAgICAgICBQeUVycl9TZXRTdHJpbmcoIFB5RXhjX0ltcG9ydEVycm9yLCBidWZmICk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXJldHZhbCA9IGdldF9pbWFnZV9zeW1ib2woIHRoZV9pZCwgZnVuY25hbWUsIEJfU1lNQk9MX1RZUEVfVEVYVCwgJnAgKTsKLQlpZiggcmV0dmFsICE9IEJfTk9fRVJST1IgfHwgcCA9PSBOVUxMICkgewotCQkvKiBUaGF0J3MgYmFkLCB3ZSBjYW4ndCBmaW5kIHRoYXQgc3ltYm9sIGluIHRoZSBtb2R1bGUuLi4KLQkJICovCi0JCWNoYXIgYnVmZlsyNTZdOyAgLyogaGF0ZSBoYXJkLWNvZGVkIHN0cmluZyBzaXplcy4uLiAqLworICAgIFB5T1Nfc25wcmludGYoZnVuY25hbWUsIHNpemVvZihmdW5jbmFtZSksICJpbml0JS4yMDBzIiwgc2hvcnRuYW1lKTsKKyAgICBpZiggUHlfVmVyYm9zZUZsYWcgKSB7CisgICAgICAgIHByaW50ZiggImdldF9pbWFnZV9zeW1ib2woICVzIClcbiIsIGZ1bmNuYW1lICk7CisgICAgfQogCi0JCWlmKCBQeV9WZXJib3NlRmxhZyApIHsKLQkJCXByaW50ZiggImdldF9pbWFnZV9zeW1ib2woICVzICkgZmFpbGVkIiwgZnVuY25hbWUgKTsKLQkJfQorICAgIHJldHZhbCA9IGdldF9pbWFnZV9zeW1ib2woIHRoZV9pZCwgZnVuY25hbWUsIEJfU1lNQk9MX1RZUEVfVEVYVCwgJnAgKTsKKyAgICBpZiggcmV0dmFsICE9IEJfTk9fRVJST1IgfHwgcCA9PSBOVUxMICkgeworICAgICAgICAvKiBUaGF0J3MgYmFkLCB3ZSBjYW4ndCBmaW5kIHRoYXQgc3ltYm9sIGluIHRoZSBtb2R1bGUuLi4KKyAgICAgICAgICovCisgICAgICAgIGNoYXIgYnVmZlsyNTZdOyAgLyogaGF0ZSBoYXJkLWNvZGVkIHN0cmluZyBzaXplcy4uLiAqLwogCi0JCXN3aXRjaCggcmV0dmFsICkgewotCQljYXNlIEJfQkFEX0lNQUdFX0lEOgotCQkJUHlPU19zbnByaW50ZiggYnVmZiwgc2l6ZW9mKGJ1ZmYpLAotCQkJICAgICAgICJjYW4ndCBsb2FkIGluaXQgZnVuY3Rpb24gZm9yIGR5bmFtaWMgbW9kdWxlOiAiCi0JCSAgICAgICAgICAgICAgICJJbnZhbGlkIGltYWdlIElEIGZvciAlLjE4MHMiLCBmdWxscGF0aCApOwotCQkJYnJlYWs7Ci0JCWNhc2UgQl9CQURfSU5ERVg6Ci0JCQlQeU9TX3NucHJpbnRmKCBidWZmLCBzaXplb2YoYnVmZiksCi0JCQkgICAgICAgImNhbid0IGxvYWQgaW5pdCBmdW5jdGlvbiBmb3IgZHluYW1pYyBtb2R1bGU6ICIKLQkJICAgICAgICAgICAgICAgIkJhZCBpbmRleCBmb3IgJS4xODBzIiwgZnVuY25hbWUgKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJUHlPU19zbnByaW50ZiggYnVmZiwgc2l6ZW9mKGJ1ZmYpLAotCQkJICAgICAgICJjYW4ndCBsb2FkIGluaXQgZnVuY3Rpb24gZm9yIGR5bmFtaWMgbW9kdWxlOiAiCi0JCSAgICAgICAgICAgICAgICJVbmtub3duIGVycm9yIGxvb2tpbmcgdXAgJS4xODBzIiwgZnVuY25hbWUgKTsKLQkJCWJyZWFrOwotCQl9CisgICAgICAgIGlmKCBQeV9WZXJib3NlRmxhZyApIHsKKyAgICAgICAgICAgIHByaW50ZiggImdldF9pbWFnZV9zeW1ib2woICVzICkgZmFpbGVkIiwgZnVuY25hbWUgKTsKKyAgICAgICAgfQogCi0JCXJldHZhbCA9IHVubG9hZF9hZGRfb24oIHRoZV9pZCApOworICAgICAgICBzd2l0Y2goIHJldHZhbCApIHsKKyAgICAgICAgY2FzZSBCX0JBRF9JTUFHRV9JRDoKKyAgICAgICAgICAgIFB5T1Nfc25wcmludGYoIGJ1ZmYsIHNpemVvZihidWZmKSwKKyAgICAgICAgICAgICAgICAgICAiY2FuJ3QgbG9hZCBpbml0IGZ1bmN0aW9uIGZvciBkeW5hbWljIG1vZHVsZTogIgorICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGltYWdlIElEIGZvciAlLjE4MHMiLCBmdWxscGF0aCApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQl9CQURfSU5ERVg6CisgICAgICAgICAgICBQeU9TX3NucHJpbnRmKCBidWZmLCBzaXplb2YoYnVmZiksCisgICAgICAgICAgICAgICAgICAgImNhbid0IGxvYWQgaW5pdCBmdW5jdGlvbiBmb3IgZHluYW1pYyBtb2R1bGU6ICIKKyAgICAgICAgICAgICAgICAgICAiQmFkIGluZGV4IGZvciAlLjE4MHMiLCBmdW5jbmFtZSApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBQeU9TX3NucHJpbnRmKCBidWZmLCBzaXplb2YoYnVmZiksCisgICAgICAgICAgICAgICAgICAgImNhbid0IGxvYWQgaW5pdCBmdW5jdGlvbiBmb3IgZHluYW1pYyBtb2R1bGU6ICIKKyAgICAgICAgICAgICAgICAgICAiVW5rbm93biBlcnJvciBsb29raW5nIHVwICUuMTgwcyIsIGZ1bmNuYW1lICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogCi0JCVB5RXJyX1NldFN0cmluZyggUHlFeGNfSW1wb3J0RXJyb3IsIGJ1ZmYgKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgICAgICByZXR2YWwgPSB1bmxvYWRfYWRkX29uKCB0aGVfaWQgKTsKIAotCS8qIFNhdmUgdGhlIG1vZHVsZSBuYW1lIGFuZCBpbWFnZSBJRCBmb3IgbGF0ZXIgc28gd2UgY2FuIGNsZWFuIHVwCi0JICogZ3JhY2VmdWxseS4KLQkgKi8KLQliZW9zX2FkZF9keW4oIGZxbmFtZSwgdGhlX2lkICk7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyggUHlFeGNfSW1wb3J0RXJyb3IsIGJ1ZmYgKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JcmV0dXJuIHA7CisgICAgLyogU2F2ZSB0aGUgbW9kdWxlIG5hbWUgYW5kIGltYWdlIElEIGZvciBsYXRlciBzbyB3ZSBjYW4gY2xlYW4gdXAKKyAgICAgKiBncmFjZWZ1bGx5LgorICAgICAqLworICAgIGJlb3NfYWRkX2R5biggZnFuYW1lLCB0aGVfaWQgKTsKKworICAgIHJldHVybiBwOwogfQpkaWZmIC0tZ2l0IGEvUHl0aG9uL2R5bmxvYWRfaHB1eC5jIGIvUHl0aG9uL2R5bmxvYWRfaHB1eC5jCmluZGV4IGZlYzA4MjYuLmM2Y2UxNmUgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9keW5sb2FkX2hwdXguYworKysgYi9QeXRob24vZHlubG9hZF9ocHV4LmMKQEAgLTE0LDQ1ICsxNCw0NSBAQAogI2VuZGlmCiAKIGNvbnN0IHN0cnVjdCBmaWxlZGVzY3IgX1B5SW1wb3J0X0R5bkxvYWRGaWxldGFiW10gPSB7Ci0Je1NITElCX0VYVCwgInJiIiwgQ19FWFRFTlNJT059LAotCXsibW9kdWxlIlNITElCX0VYVCwgInJiIiwgQ19FWFRFTlNJT059LAotCXswLCAwfQorICAgIHtTSExJQl9FWFQsICJyYiIsIENfRVhURU5TSU9OfSwKKyAgICB7Im1vZHVsZSJTSExJQl9FWFQsICJyYiIsIENfRVhURU5TSU9OfSwKKyAgICB7MCwgMH0KIH07CiAKIGRsX2Z1bmNwdHIgX1B5SW1wb3J0X0dldER5bkxvYWRGdW5jKGNvbnN0IGNoYXIgKmZxbmFtZSwgY29uc3QgY2hhciAqc2hvcnRuYW1lLAotCQkJCSAgICBjb25zdCBjaGFyICpwYXRobmFtZSwgRklMRSAqZnApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwYXRobmFtZSwgRklMRSAqZnApCiB7Ci0JZGxfZnVuY3B0ciBwOwotCXNobF90IGxpYjsKLQlpbnQgZmxhZ3M7Ci0JY2hhciBmdW5jbmFtZVsyNThdOworICAgIGRsX2Z1bmNwdHIgcDsKKyAgICBzaGxfdCBsaWI7CisgICAgaW50IGZsYWdzOworICAgIGNoYXIgZnVuY25hbWVbMjU4XTsKIAotCWZsYWdzID0gQklORF9GSVJTVCB8IEJJTkRfREVGRVJSRUQ7Ci0JaWYgKFB5X1ZlcmJvc2VGbGFnKSB7Ci0JCWZsYWdzID0gQklORF9GSVJTVCB8IEJJTkRfSU1NRURJQVRFIHwKLQkJCUJJTkRfTk9ORkFUQUwgfCBCSU5EX1ZFUkJPU0U7Ci0JCXByaW50Zigic2hsX2xvYWQgJXNcbiIscGF0aG5hbWUpOwotCX0KLQlsaWIgPSBzaGxfbG9hZChwYXRobmFtZSwgZmxhZ3MsIDApOwotCS8qIFhYWCBDaHVjayBCbGFrZSBvbmNlIHdyb3RlIHRoYXQgMCBzaG91bGQgYmUgQklORF9OT1NUQVJUPyAqLwotCWlmIChsaWIgPT0gTlVMTCkgewotCQljaGFyIGJ1ZlsyNTZdOwotCQlpZiAoUHlfVmVyYm9zZUZsYWcpCi0JCQlwZXJyb3IocGF0aG5hbWUpOwotCQlQeU9TX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJGYWlsZWQgdG8gbG9hZCAlLjIwMHMiLAotCQkJICAgICAgcGF0aG5hbWUpOwotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW1wb3J0RXJyb3IsIGJ1Zik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlQeU9TX3NucHJpbnRmKGZ1bmNuYW1lLCBzaXplb2YoZnVuY25hbWUpLCBGVU5DTkFNRV9QQVRURVJOLCBzaG9ydG5hbWUpOwotCWlmIChQeV9WZXJib3NlRmxhZykKLQkJcHJpbnRmKCJzaGxfZmluZHN5bSAlc1xuIiwgZnVuY25hbWUpOwotCWlmIChzaGxfZmluZHN5bSgmbGliLCBmdW5jbmFtZSwgVFlQRV9VTkRFRklORUQsICh2b2lkICopICZwKSA9PSAtMSkgewotCQlzaGxfdW5sb2FkKGxpYik7Ci0JCXAgPSBOVUxMOwotCX0KLQlpZiAocCA9PSBOVUxMICYmIFB5X1ZlcmJvc2VGbGFnKQotCQlwZXJyb3IoZnVuY25hbWUpOworICAgIGZsYWdzID0gQklORF9GSVJTVCB8IEJJTkRfREVGRVJSRUQ7CisgICAgaWYgKFB5X1ZlcmJvc2VGbGFnKSB7CisgICAgICAgIGZsYWdzID0gQklORF9GSVJTVCB8IEJJTkRfSU1NRURJQVRFIHwKKyAgICAgICAgICAgIEJJTkRfTk9ORkFUQUwgfCBCSU5EX1ZFUkJPU0U7CisgICAgICAgIHByaW50Zigic2hsX2xvYWQgJXNcbiIscGF0aG5hbWUpOworICAgIH0KKyAgICBsaWIgPSBzaGxfbG9hZChwYXRobmFtZSwgZmxhZ3MsIDApOworICAgIC8qIFhYWCBDaHVjayBCbGFrZSBvbmNlIHdyb3RlIHRoYXQgMCBzaG91bGQgYmUgQklORF9OT1NUQVJUPyAqLworICAgIGlmIChsaWIgPT0gTlVMTCkgeworICAgICAgICBjaGFyIGJ1ZlsyNTZdOworICAgICAgICBpZiAoUHlfVmVyYm9zZUZsYWcpCisgICAgICAgICAgICBwZXJyb3IocGF0aG5hbWUpOworICAgICAgICBQeU9TX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJGYWlsZWQgdG8gbG9hZCAlLjIwMHMiLAorICAgICAgICAgICAgICAgICAgICAgIHBhdGhuYW1lKTsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0ltcG9ydEVycm9yLCBidWYpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlPU19zbnByaW50ZihmdW5jbmFtZSwgc2l6ZW9mKGZ1bmNuYW1lKSwgRlVOQ05BTUVfUEFUVEVSTiwgc2hvcnRuYW1lKTsKKyAgICBpZiAoUHlfVmVyYm9zZUZsYWcpCisgICAgICAgIHByaW50Zigic2hsX2ZpbmRzeW0gJXNcbiIsIGZ1bmNuYW1lKTsKKyAgICBpZiAoc2hsX2ZpbmRzeW0oJmxpYiwgZnVuY25hbWUsIFRZUEVfVU5ERUZJTkVELCAodm9pZCAqKSAmcCkgPT0gLTEpIHsKKyAgICAgICAgc2hsX3VubG9hZChsaWIpOworICAgICAgICBwID0gTlVMTDsKKyAgICB9CisgICAgaWYgKHAgPT0gTlVMTCAmJiBQeV9WZXJib3NlRmxhZykKKyAgICAgICAgcGVycm9yKGZ1bmNuYW1lKTsKIAotCXJldHVybiBwOworICAgIHJldHVybiBwOwogfQpkaWZmIC0tZ2l0IGEvUHl0aG9uL2R5bmxvYWRfbmV4dC5jIGIvUHl0aG9uL2R5bmxvYWRfbmV4dC5jCmluZGV4IDI3ZGYzNTYuLjdlNjFiNWQgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9keW5sb2FkX25leHQuYworKysgYi9QeXRob24vZHlubG9hZF9uZXh0LmMKQEAgLTksOSArOSw5IEBACiAjaW5jbHVkZSA8bWFjaC1vL2R5bGQuaD4KIAogY29uc3Qgc3RydWN0IGZpbGVkZXNjciBfUHlJbXBvcnRfRHluTG9hZEZpbGV0YWJbXSA9IHsKLQl7Ii5zbyIsICJyYiIsIENfRVhURU5TSU9OfSwKLQl7Im1vZHVsZS5zbyIsICJyYiIsIENfRVhURU5TSU9OfSwKLQl7MCwgMH0KKyAgICB7Ii5zbyIsICJyYiIsIENfRVhURU5TSU9OfSwKKyAgICB7Im1vZHVsZS5zbyIsICJyYiIsIENfRVhURU5TSU9OfSwKKyAgICB7MCwgMH0KIH07CiAKIC8qCkBAIC0yOSw4NiArMjksODYgQEAKICNkZWZpbmUgTElOS09QVElPTlMgTlNMSU5LTU9EVUxFX09QVElPTl9CSU5ETk9XfE5TTElOS01PRFVMRV9PUFRJT05fUkVUVVJOX09OX0VSUk9SCiAjZWxzZQogI2RlZmluZSBMSU5LT1BUSU9OUyBOU0xJTktNT0RVTEVfT1BUSU9OX0JJTkROT1d8IFwKLQlOU0xJTktNT0RVTEVfT1BUSU9OX1JFVFVSTl9PTl9FUlJPUnxOU0xJTktNT0RVTEVfT1BUSU9OX1BSSVZBVEUKKyAgICBOU0xJTktNT0RVTEVfT1BUSU9OX1JFVFVSTl9PTl9FUlJPUnxOU0xJTktNT0RVTEVfT1BUSU9OX1BSSVZBVEUKICNlbmRpZgogZGxfZnVuY3B0ciBfUHlJbXBvcnRfR2V0RHluTG9hZEZ1bmMoY29uc3QgY2hhciAqZnFuYW1lLCBjb25zdCBjaGFyICpzaG9ydG5hbWUsCi0JCQkJCWNvbnN0IGNoYXIgKnBhdGhuYW1lLCBGSUxFICpmcCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwYXRobmFtZSwgRklMRSAqZnApCiB7Ci0JZGxfZnVuY3B0ciBwID0gTlVMTDsKLQljaGFyIGZ1bmNuYW1lWzI1OF07Ci0JTlNPYmplY3RGaWxlSW1hZ2VSZXR1cm5Db2RlIHJjOwotCU5TT2JqZWN0RmlsZUltYWdlIGltYWdlOwotCU5TTW9kdWxlIG5ld01vZHVsZTsKLQlOU1N5bWJvbCB0aGVTeW07Ci0JY29uc3QgY2hhciAqZXJyU3RyaW5nOwotCWNoYXIgZXJyQnVmWzUxMl07CisgICAgZGxfZnVuY3B0ciBwID0gTlVMTDsKKyAgICBjaGFyIGZ1bmNuYW1lWzI1OF07CisgICAgTlNPYmplY3RGaWxlSW1hZ2VSZXR1cm5Db2RlIHJjOworICAgIE5TT2JqZWN0RmlsZUltYWdlIGltYWdlOworICAgIE5TTW9kdWxlIG5ld01vZHVsZTsKKyAgICBOU1N5bWJvbCB0aGVTeW07CisgICAgY29uc3QgY2hhciAqZXJyU3RyaW5nOworICAgIGNoYXIgZXJyQnVmWzUxMl07CiAKLQlQeU9TX3NucHJpbnRmKGZ1bmNuYW1lLCBzaXplb2YoZnVuY25hbWUpLCAiX2luaXQlLjIwMHMiLCBzaG9ydG5hbWUpOworICAgIFB5T1Nfc25wcmludGYoZnVuY25hbWUsIHNpemVvZihmdW5jbmFtZSksICJfaW5pdCUuMjAwcyIsIHNob3J0bmFtZSk7CiAKICNpZmRlZiBVU0VfRFlMRF9HTE9CQUxfTkFNRVNQQUNFCi0JaWYgKE5TSXNTeW1ib2xOYW1lRGVmaW5lZChmdW5jbmFtZSkpIHsKLQkJdGhlU3ltID0gTlNMb29rdXBBbmRCaW5kU3ltYm9sKGZ1bmNuYW1lKTsKLQkJcCA9IChkbF9mdW5jcHRyKU5TQWRkcmVzc09mU3ltYm9sKHRoZVN5bSk7Ci0JCXJldHVybiBwOwotCX0KKyAgICBpZiAoTlNJc1N5bWJvbE5hbWVEZWZpbmVkKGZ1bmNuYW1lKSkgeworICAgICAgICB0aGVTeW0gPSBOU0xvb2t1cEFuZEJpbmRTeW1ib2woZnVuY25hbWUpOworICAgICAgICBwID0gKGRsX2Z1bmNwdHIpTlNBZGRyZXNzT2ZTeW1ib2wodGhlU3ltKTsKKyAgICAgICAgcmV0dXJuIHA7CisgICAgfQogI2VuZGlmCi0JcmMgPSBOU0NyZWF0ZU9iamVjdEZpbGVJbWFnZUZyb21GaWxlKHBhdGhuYW1lLCAmaW1hZ2UpOwotCXN3aXRjaChyYykgewotCQlkZWZhdWx0OgotCQljYXNlIE5TT2JqZWN0RmlsZUltYWdlRmFpbHVyZToKLQkJY2FzZSBOU09iamVjdEZpbGVJbWFnZUZvcm1hdDoKLQkJCS8qIGZvciB0aGVzZSBhIG1lc3NhZ2UgaXMgcHJpbnRlZCBvbiBzdGRlcnIgYnkgZHlsZCAqLwotCQkJZXJyU3RyaW5nID0gIkNhbid0IGNyZWF0ZSBvYmplY3QgZmlsZSBpbWFnZSI7Ci0JCWJyZWFrOwotCQljYXNlIE5TT2JqZWN0RmlsZUltYWdlU3VjY2VzczoKLQkJCWVyclN0cmluZyA9IE5VTEw7Ci0JCQlicmVhazsKLQkJY2FzZSBOU09iamVjdEZpbGVJbWFnZUluYXBwcm9wcmlhdGVGaWxlOgotCQkJZXJyU3RyaW5nID0gIkluYXBwcm9wcmlhdGUgZmlsZSB0eXBlIGZvciBkeW5hbWljIGxvYWRpbmciOwotCQkJYnJlYWs7Ci0JCWNhc2UgTlNPYmplY3RGaWxlSW1hZ2VBcmNoOgotCQkJZXJyU3RyaW5nID0gIldyb25nIENQVSB0eXBlIGluIG9iamVjdCBmaWxlIjsKLQkJCWJyZWFrOwotCQljYXNlIE5TT2JqZWN0RmlsZUltYWdlQWNjZXNzOgotCQkJZXJyU3RyaW5nID0gIkNhbid0IHJlYWQgb2JqZWN0IGZpbGUgKG5vIGFjY2VzcykiOwotCQkJYnJlYWs7Ci0JfQotCWlmIChlcnJTdHJpbmcgPT0gTlVMTCkgewotCQluZXdNb2R1bGUgPSBOU0xpbmtNb2R1bGUoaW1hZ2UsIHBhdGhuYW1lLCBMSU5LT1BUSU9OUyk7Ci0JCWlmIChuZXdNb2R1bGUgPT0gTlVMTCkgewotCQkJaW50IGVyck5vOwotCQkJY29uc3QgY2hhciAqZmlsZU5hbWUsICptb3JlRXJyb3JTdHI7Ci0JCQlOU0xpbmtFZGl0RXJyb3JzIGM7Ci0JCQlOU0xpbmtFZGl0RXJyb3IoICZjLCAmZXJyTm8sICZmaWxlTmFtZSwgJm1vcmVFcnJvclN0ciApOwotCQkJUHlPU19zbnByaW50ZihlcnJCdWYsIDUxMiwgIkZhaWx1cmUgbGlua2luZyBuZXcgbW9kdWxlOiAlczogJXMiLCAKLQkJCQkJZmlsZU5hbWUsIG1vcmVFcnJvclN0cik7Ci0JCQllcnJTdHJpbmcgPSBlcnJCdWY7Ci0JCX0KLQl9Ci0JaWYgKGVyclN0cmluZyAhPSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwgZXJyU3RyaW5nKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIHJjID0gTlNDcmVhdGVPYmplY3RGaWxlSW1hZ2VGcm9tRmlsZShwYXRobmFtZSwgJmltYWdlKTsKKyAgICBzd2l0Y2gocmMpIHsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgY2FzZSBOU09iamVjdEZpbGVJbWFnZUZhaWx1cmU6CisgICAgICAgIGNhc2UgTlNPYmplY3RGaWxlSW1hZ2VGb3JtYXQ6CisgICAgICAgICAgICAvKiBmb3IgdGhlc2UgYSBtZXNzYWdlIGlzIHByaW50ZWQgb24gc3RkZXJyIGJ5IGR5bGQgKi8KKyAgICAgICAgICAgIGVyclN0cmluZyA9ICJDYW4ndCBjcmVhdGUgb2JqZWN0IGZpbGUgaW1hZ2UiOworICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBOU09iamVjdEZpbGVJbWFnZVN1Y2Nlc3M6CisgICAgICAgICAgICBlcnJTdHJpbmcgPSBOVUxMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTlNPYmplY3RGaWxlSW1hZ2VJbmFwcHJvcHJpYXRlRmlsZToKKyAgICAgICAgICAgIGVyclN0cmluZyA9ICJJbmFwcHJvcHJpYXRlIGZpbGUgdHlwZSBmb3IgZHluYW1pYyBsb2FkaW5nIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE5TT2JqZWN0RmlsZUltYWdlQXJjaDoKKyAgICAgICAgICAgIGVyclN0cmluZyA9ICJXcm9uZyBDUFUgdHlwZSBpbiBvYmplY3QgZmlsZSI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBOU09iamVjdEZpbGVJbWFnZUFjY2VzczoKKyAgICAgICAgICAgIGVyclN0cmluZyA9ICJDYW4ndCByZWFkIG9iamVjdCBmaWxlIChubyBhY2Nlc3MpIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoZXJyU3RyaW5nID09IE5VTEwpIHsKKyAgICAgICAgbmV3TW9kdWxlID0gTlNMaW5rTW9kdWxlKGltYWdlLCBwYXRobmFtZSwgTElOS09QVElPTlMpOworICAgICAgICBpZiAobmV3TW9kdWxlID09IE5VTEwpIHsKKyAgICAgICAgICAgIGludCBlcnJObzsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZpbGVOYW1lLCAqbW9yZUVycm9yU3RyOworICAgICAgICAgICAgTlNMaW5rRWRpdEVycm9ycyBjOworICAgICAgICAgICAgTlNMaW5rRWRpdEVycm9yKCAmYywgJmVyck5vLCAmZmlsZU5hbWUsICZtb3JlRXJyb3JTdHIgKTsKKyAgICAgICAgICAgIFB5T1Nfc25wcmludGYoZXJyQnVmLCA1MTIsICJGYWlsdXJlIGxpbmtpbmcgbmV3IG1vZHVsZTogJXM6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZSwgbW9yZUVycm9yU3RyKTsKKyAgICAgICAgICAgIGVyclN0cmluZyA9IGVyckJ1ZjsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoZXJyU3RyaW5nICE9IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0ltcG9ydEVycm9yLCBlcnJTdHJpbmcpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAjaWZkZWYgVVNFX0RZTERfR0xPQkFMX05BTUVTUEFDRQotCWlmICghTlNJc1N5bWJvbE5hbWVEZWZpbmVkKGZ1bmNuYW1lKSkgewotCQkvKiBVbmxpbmtNb2R1bGUoKSBpc24ndCBpbXBsZW1lbnRlZCBpbiBjdXJyZW50IHZlcnNpb25zLCBidXQgY2FsbGluZyBpdCBkb2VzIG5vIGhhcm0gKi8KLQkJLyogTlNVbkxpbmtNb2R1bGUobmV3TW9kdWxlLCBGQUxTRSk7IHJlbW92ZWQ6IGNhdXNlcyBwcm9ibGVtcyBmb3IgT2JqQyBjb2RlICovCi0JCVB5RXJyX0Zvcm1hdChQeUV4Y19JbXBvcnRFcnJvciwKLQkJCQkgIkxvYWRlZCBtb2R1bGUgZG9lcyBub3QgY29udGFpbiBzeW1ib2wgJS4yMDBzIiwKLQkJCQkgZnVuY25hbWUpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JdGhlU3ltID0gTlNMb29rdXBBbmRCaW5kU3ltYm9sKGZ1bmNuYW1lKTsKKyAgICBpZiAoIU5TSXNTeW1ib2xOYW1lRGVmaW5lZChmdW5jbmFtZSkpIHsKKyAgICAgICAgLyogVW5saW5rTW9kdWxlKCkgaXNuJ3QgaW1wbGVtZW50ZWQgaW4gY3VycmVudCB2ZXJzaW9ucywgYnV0IGNhbGxpbmcgaXQgZG9lcyBubyBoYXJtICovCisgICAgICAgIC8qIE5TVW5MaW5rTW9kdWxlKG5ld01vZHVsZSwgRkFMU0UpOyByZW1vdmVkOiBjYXVzZXMgcHJvYmxlbXMgZm9yIE9iakMgY29kZSAqLworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfSW1wb3J0RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIkxvYWRlZCBtb2R1bGUgZG9lcyBub3QgY29udGFpbiBzeW1ib2wgJS4yMDBzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jbmFtZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICB0aGVTeW0gPSBOU0xvb2t1cEFuZEJpbmRTeW1ib2woZnVuY25hbWUpOwogI2Vsc2UKLQl0aGVTeW0gPSBOU0xvb2t1cFN5bWJvbEluTW9kdWxlKG5ld01vZHVsZSwgZnVuY25hbWUpOwotCWlmICggdGhlU3ltID09IE5VTEwgKSB7Ci0JCS8qIE5TVW5MaW5rTW9kdWxlKG5ld01vZHVsZSwgRkFMU0UpOyByZW1vdmVkOiBjYXVzZXMgcHJvYmxlbXMgZm9yIE9iakMgY29kZSAqLwotCQlQeUVycl9Gb3JtYXQoUHlFeGNfSW1wb3J0RXJyb3IsCi0JCQkJICJMb2FkZWQgbW9kdWxlIGRvZXMgbm90IGNvbnRhaW4gc3ltYm9sICUuMjAwcyIsCi0JCQkJIGZ1bmNuYW1lKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIHRoZVN5bSA9IE5TTG9va3VwU3ltYm9sSW5Nb2R1bGUobmV3TW9kdWxlLCBmdW5jbmFtZSk7CisgICAgaWYgKCB0aGVTeW0gPT0gTlVMTCApIHsKKyAgICAgICAgLyogTlNVbkxpbmtNb2R1bGUobmV3TW9kdWxlLCBGQUxTRSk7IHJlbW92ZWQ6IGNhdXNlcyBwcm9ibGVtcyBmb3IgT2JqQyBjb2RlICovCisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19JbXBvcnRFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiTG9hZGVkIG1vZHVsZSBkb2VzIG5vdCBjb250YWluIHN5bWJvbCAlLjIwMHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNuYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogI2VuZGlmCi0JcCA9IChkbF9mdW5jcHRyKU5TQWRkcmVzc09mU3ltYm9sKHRoZVN5bSk7Ci0JcmV0dXJuIHA7CisgICAgcCA9IChkbF9mdW5jcHRyKU5TQWRkcmVzc09mU3ltYm9sKHRoZVN5bSk7CisgICAgcmV0dXJuIHA7CiB9CmRpZmYgLS1naXQgYS9QeXRob24vZHlubG9hZF9vczIuYyBiL1B5dGhvbi9keW5sb2FkX29zMi5jCmluZGV4IGQ2NjBlMjcuLmUzZmRiNzAgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9keW5sb2FkX29zMi5jCisrKyBiL1B5dGhvbi9keW5sb2FkX29zMi5jCkBAIC0xMCwzNyArMTAsMzcgQEAKIAogCiBjb25zdCBzdHJ1Y3QgZmlsZWRlc2NyIF9QeUltcG9ydF9EeW5Mb2FkRmlsZXRhYltdID0gewotCXsiLnB5ZCIsICJyYiIsIENfRVhURU5TSU9OfSwKLQl7Ii5kbGwiLCAicmIiLCBDX0VYVEVOU0lPTn0sCi0JezAsIDB9CisgICAgeyIucHlkIiwgInJiIiwgQ19FWFRFTlNJT059LAorICAgIHsiLmRsbCIsICJyYiIsIENfRVhURU5TSU9OfSwKKyAgICB7MCwgMH0KIH07CiAKIGRsX2Z1bmNwdHIgX1B5SW1wb3J0X0dldER5bkxvYWRGdW5jKGNvbnN0IGNoYXIgKmZxbmFtZSwgY29uc3QgY2hhciAqc2hvcnRuYW1lLAotCQkJCSAgICBjb25zdCBjaGFyICpwYXRobmFtZSwgRklMRSAqZnApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwYXRobmFtZSwgRklMRSAqZnApCiB7Ci0JZGxfZnVuY3B0ciBwOwotCUFQSVJFVCAgcmM7Ci0JSE1PRFVMRSBoRExMOwotCWNoYXIgZmFpbHJlYXNvblsyNTZdOwotCWNoYXIgZnVuY25hbWVbMjU4XTsKKyAgICBkbF9mdW5jcHRyIHA7CisgICAgQVBJUkVUICByYzsKKyAgICBITU9EVUxFIGhETEw7CisgICAgY2hhciBmYWlscmVhc29uWzI1Nl07CisgICAgY2hhciBmdW5jbmFtZVsyNThdOwogCi0JcmMgPSBEb3NMb2FkTW9kdWxlKGZhaWxyZWFzb24sCi0JCQkgICBzaXplb2YoZmFpbHJlYXNvbiksCi0JCQkgICBwYXRobmFtZSwKLQkJCSAgICZoRExMKTsKKyAgICByYyA9IERvc0xvYWRNb2R1bGUoZmFpbHJlYXNvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGZhaWxyZWFzb24pLAorICAgICAgICAgICAgICAgICAgICAgICBwYXRobmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgJmhETEwpOwogCi0JaWYgKHJjICE9IE5PX0VSUk9SKSB7Ci0JCWNoYXIgZXJyQnVmWzI1Nl07Ci0JCVB5T1Nfc25wcmludGYoZXJyQnVmLCBzaXplb2YoZXJyQnVmKSwKLQkJCSAgICAgICJETEwgbG9hZCBmYWlsZWQsIHJjID0gJWQ6ICUuMjAwcyIsCi0JCQkgICAgICByYywgZmFpbHJlYXNvbik7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwgZXJyQnVmKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICBjaGFyIGVyckJ1ZlsyNTZdOworICAgICAgICBQeU9TX3NucHJpbnRmKGVyckJ1Ziwgc2l6ZW9mKGVyckJ1ZiksCisgICAgICAgICAgICAgICAgICAgICAgIkRMTCBsb2FkIGZhaWxlZCwgcmMgPSAlZDogJS4yMDBzIiwKKyAgICAgICAgICAgICAgICAgICAgICByYywgZmFpbHJlYXNvbik7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwgZXJyQnVmKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JUHlPU19zbnByaW50ZihmdW5jbmFtZSwgc2l6ZW9mKGZ1bmNuYW1lKSwgImluaXQlLjIwMHMiLCBzaG9ydG5hbWUpOwotCXJjID0gRG9zUXVlcnlQcm9jQWRkcihoRExMLCAwTCwgZnVuY25hbWUsICZwKTsKLQlpZiAocmMgIT0gTk9fRVJST1IpCi0JCXAgPSBOVUxMOyAvKiBTaWduaWZ5IEZhaWx1cmUgdG8gQWNxdWlyZSBFbnRyeXBvaW50ICovCi0JcmV0dXJuIHA7CisgICAgUHlPU19zbnByaW50ZihmdW5jbmFtZSwgc2l6ZW9mKGZ1bmNuYW1lKSwgImluaXQlLjIwMHMiLCBzaG9ydG5hbWUpOworICAgIHJjID0gRG9zUXVlcnlQcm9jQWRkcihoRExMLCAwTCwgZnVuY25hbWUsICZwKTsKKyAgICBpZiAocmMgIT0gTk9fRVJST1IpCisgICAgICAgIHAgPSBOVUxMOyAvKiBTaWduaWZ5IEZhaWx1cmUgdG8gQWNxdWlyZSBFbnRyeXBvaW50ICovCisgICAgcmV0dXJuIHA7CiB9CmRpZmYgLS1naXQgYS9QeXRob24vZHlubG9hZF9zaGxpYi5jIGIvUHl0aG9uL2R5bmxvYWRfc2hsaWIuYwppbmRleCBmMTJhOTNjLi4xN2ViYWIxIDEwMDY0NAotLS0gYS9QeXRob24vZHlubG9hZF9zaGxpYi5jCisrKyBiL1B5dGhvbi9keW5sb2FkX3NobGliLmMKQEAgLTMzLDExMSArMzMsMTExIEBACiAKIGNvbnN0IHN0cnVjdCBmaWxlZGVzY3IgX1B5SW1wb3J0X0R5bkxvYWRGaWxldGFiW10gPSB7CiAjaWZkZWYgX19DWUdXSU5fXwotCXsiLmRsbCIsICJyYiIsIENfRVhURU5TSU9OfSwKLQl7Im1vZHVsZS5kbGwiLCAicmIiLCBDX0VYVEVOU0lPTn0sCisgICAgeyIuZGxsIiwgInJiIiwgQ19FWFRFTlNJT059LAorICAgIHsibW9kdWxlLmRsbCIsICJyYiIsIENfRVhURU5TSU9OfSwKICNlbHNlCiAjaWYgZGVmaW5lZChQWU9TX09TMikgJiYgZGVmaW5lZChQWUNDX0dDQykKLQl7Ii5weWQiLCAicmIiLCBDX0VYVEVOU0lPTn0sCi0JeyIuZGxsIiwgInJiIiwgQ19FWFRFTlNJT059LAorICAgIHsiLnB5ZCIsICJyYiIsIENfRVhURU5TSU9OfSwKKyAgICB7Ii5kbGwiLCAicmIiLCBDX0VYVEVOU0lPTn0sCiAjZWxzZQogI2lmZGVmIF9fVk1TCi0gICAgICAgIHsiLmV4ZSIsICJyYiIsIENfRVhURU5TSU9OfSwKLSAgICAgICAgeyIuRVhFIiwgInJiIiwgQ19FWFRFTlNJT059LAotICAgICAgICB7Im1vZHVsZS5leGUiLCAicmIiLCBDX0VYVEVOU0lPTn0sCi0gICAgICAgIHsiTU9EVUxFLkVYRSIsICJyYiIsIENfRVhURU5TSU9OfSwKKyAgICB7Ii5leGUiLCAicmIiLCBDX0VYVEVOU0lPTn0sCisgICAgeyIuRVhFIiwgInJiIiwgQ19FWFRFTlNJT059LAorICAgIHsibW9kdWxlLmV4ZSIsICJyYiIsIENfRVhURU5TSU9OfSwKKyAgICB7Ik1PRFVMRS5FWEUiLCAicmIiLCBDX0VYVEVOU0lPTn0sCiAjZWxzZQotCXsiLnNvIiwgInJiIiwgQ19FWFRFTlNJT059LAotCXsibW9kdWxlLnNvIiwgInJiIiwgQ19FWFRFTlNJT059LAorICAgIHsiLnNvIiwgInJiIiwgQ19FWFRFTlNJT059LAorICAgIHsibW9kdWxlLnNvIiwgInJiIiwgQ19FWFRFTlNJT059LAogI2VuZGlmCiAjZW5kaWYKICNlbmRpZgotCXswLCAwfQorICAgIHswLCAwfQogfTsKIAogc3RhdGljIHN0cnVjdCB7Ci0JZGV2X3QgZGV2OworICAgIGRldl90IGRldjsKICNpZmRlZiBfX1ZNUwotCWlub190IGlub1szXTsKKyAgICBpbm9fdCBpbm9bM107CiAjZWxzZQotCWlub190IGlubzsKKyAgICBpbm9fdCBpbm87CiAjZW5kaWYKLQl2b2lkICpoYW5kbGU7CisgICAgdm9pZCAqaGFuZGxlOwogfSBoYW5kbGVzWzEyOF07CiBzdGF0aWMgaW50IG5oYW5kbGVzID0gMDsKIAogCiBkbF9mdW5jcHRyIF9QeUltcG9ydF9HZXREeW5Mb2FkRnVuYyhjb25zdCBjaGFyICpmcW5hbWUsIGNvbnN0IGNoYXIgKnNob3J0bmFtZSwKLQkJCQkgICAgY29uc3QgY2hhciAqcGF0aG5hbWUsIEZJTEUgKmZwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcGF0aG5hbWUsIEZJTEUgKmZwKQogewotCWRsX2Z1bmNwdHIgcDsKLQl2b2lkICpoYW5kbGU7Ci0JY2hhciBmdW5jbmFtZVsyNThdOwotCWNoYXIgcGF0aGJ1ZlsyNjBdOwotICAgICAgICBpbnQgZGxvcGVuZmxhZ3M9MDsKKyAgICBkbF9mdW5jcHRyIHA7CisgICAgdm9pZCAqaGFuZGxlOworICAgIGNoYXIgZnVuY25hbWVbMjU4XTsKKyAgICBjaGFyIHBhdGhidWZbMjYwXTsKKyAgICBpbnQgZGxvcGVuZmxhZ3M9MDsKIAotCWlmIChzdHJjaHIocGF0aG5hbWUsICcvJykgPT0gTlVMTCkgewotCQkvKiBQcmVmaXggYmFyZSBmaWxlbmFtZSB3aXRoICIuLyIgKi8KLQkJUHlPU19zbnByaW50ZihwYXRoYnVmLCBzaXplb2YocGF0aGJ1ZiksICIuLyUtLjI1NXMiLCBwYXRobmFtZSk7Ci0JCXBhdGhuYW1lID0gcGF0aGJ1ZjsKLQl9CisgICAgaWYgKHN0cmNocihwYXRobmFtZSwgJy8nKSA9PSBOVUxMKSB7CisgICAgICAgIC8qIFByZWZpeCBiYXJlIGZpbGVuYW1lIHdpdGggIi4vIiAqLworICAgICAgICBQeU9TX3NucHJpbnRmKHBhdGhidWYsIHNpemVvZihwYXRoYnVmKSwgIi4vJS0uMjU1cyIsIHBhdGhuYW1lKTsKKyAgICAgICAgcGF0aG5hbWUgPSBwYXRoYnVmOworICAgIH0KIAotCVB5T1Nfc25wcmludGYoZnVuY25hbWUsIHNpemVvZihmdW5jbmFtZSksIAotCQkgICAgICBMRUFEX1VOREVSU0NPUkUgImluaXQlLjIwMHMiLCBzaG9ydG5hbWUpOworICAgIFB5T1Nfc25wcmludGYoZnVuY25hbWUsIHNpemVvZihmdW5jbmFtZSksCisgICAgICAgICAgICAgICAgICBMRUFEX1VOREVSU0NPUkUgImluaXQlLjIwMHMiLCBzaG9ydG5hbWUpOwogCi0JaWYgKGZwICE9IE5VTEwpIHsKLQkJaW50IGk7Ci0JCXN0cnVjdCBzdGF0IHN0YXRiOwotCQlmc3RhdChmaWxlbm8oZnApLCAmc3RhdGIpOwotCQlmb3IgKGkgPSAwOyBpIDwgbmhhbmRsZXM7IGkrKykgewotCQkJaWYgKHN0YXRiLnN0X2RldiA9PSBoYW5kbGVzW2ldLmRldiAmJgotCQkJICAgIHN0YXRiLnN0X2lubyA9PSBoYW5kbGVzW2ldLmlubykgewotCQkJCXAgPSAoZGxfZnVuY3B0cikgZGxzeW0oaGFuZGxlc1tpXS5oYW5kbGUsCi0JCQkJCQkgICAgICAgZnVuY25hbWUpOwotCQkJCXJldHVybiBwOwotCQkJfQotCQl9Ci0JCWlmIChuaGFuZGxlcyA8IDEyOCkgewotCQkJaGFuZGxlc1tuaGFuZGxlc10uZGV2ID0gc3RhdGIuc3RfZGV2OworICAgIGlmIChmcCAhPSBOVUxMKSB7CisgICAgICAgIGludCBpOworICAgICAgICBzdHJ1Y3Qgc3RhdCBzdGF0YjsKKyAgICAgICAgZnN0YXQoZmlsZW5vKGZwKSwgJnN0YXRiKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG5oYW5kbGVzOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChzdGF0Yi5zdF9kZXYgPT0gaGFuZGxlc1tpXS5kZXYgJiYKKyAgICAgICAgICAgICAgICBzdGF0Yi5zdF9pbm8gPT0gaGFuZGxlc1tpXS5pbm8pIHsKKyAgICAgICAgICAgICAgICBwID0gKGRsX2Z1bmNwdHIpIGRsc3ltKGhhbmRsZXNbaV0uaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY25hbWUpOworICAgICAgICAgICAgICAgIHJldHVybiBwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChuaGFuZGxlcyA8IDEyOCkgeworICAgICAgICAgICAgaGFuZGxlc1tuaGFuZGxlc10uZGV2ID0gc3RhdGIuc3RfZGV2OwogI2lmZGVmIF9fVk1TCi0JCQloYW5kbGVzW25oYW5kbGVzXS5pbm9bMF0gPSBzdGF0Yi5zdF9pbm9bMF07Ci0JCQloYW5kbGVzW25oYW5kbGVzXS5pbm9bMV0gPSBzdGF0Yi5zdF9pbm9bMV07Ci0JCQloYW5kbGVzW25oYW5kbGVzXS5pbm9bMl0gPSBzdGF0Yi5zdF9pbm9bMl07CisgICAgICAgICAgICBoYW5kbGVzW25oYW5kbGVzXS5pbm9bMF0gPSBzdGF0Yi5zdF9pbm9bMF07CisgICAgICAgICAgICBoYW5kbGVzW25oYW5kbGVzXS5pbm9bMV0gPSBzdGF0Yi5zdF9pbm9bMV07CisgICAgICAgICAgICBoYW5kbGVzW25oYW5kbGVzXS5pbm9bMl0gPSBzdGF0Yi5zdF9pbm9bMl07CiAjZWxzZQotCQkJaGFuZGxlc1tuaGFuZGxlc10uaW5vID0gc3RhdGIuc3RfaW5vOworICAgICAgICAgICAgaGFuZGxlc1tuaGFuZGxlc10uaW5vID0gc3RhdGIuc3RfaW5vOwogI2VuZGlmCi0JCX0KLQl9CisgICAgICAgIH0KKyAgICB9CiAKICNpZiAhKGRlZmluZWQoUFlPU19PUzIpICYmIGRlZmluZWQoUFlDQ19HQ0MpKQotICAgICAgICBkbG9wZW5mbGFncyA9IFB5VGhyZWFkU3RhdGVfR0VUKCktPmludGVycC0+ZGxvcGVuZmxhZ3M7CisgICAgZGxvcGVuZmxhZ3MgPSBQeVRocmVhZFN0YXRlX0dFVCgpLT5pbnRlcnAtPmRsb3BlbmZsYWdzOwogI2VuZGlmCiAKLQlpZiAoUHlfVmVyYm9zZUZsYWcpCi0JCVB5U3lzX1dyaXRlU3RkZXJyKCJkbG9wZW4oXCIlc1wiLCAleCk7XG4iLCBwYXRobmFtZSwgCi0JCQkJICBkbG9wZW5mbGFncyk7CisgICAgaWYgKFB5X1ZlcmJvc2VGbGFnKQorICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigiZGxvcGVuKFwiJXNcIiwgJXgpO1xuIiwgcGF0aG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRsb3BlbmZsYWdzKTsKIAogI2lmZGVmIF9fVk1TCi0JLyogVk1TIGN1cnJlbnRseSBkb24ndCBhbGxvdyBhIHBhdGhuYW1lLCB1c2UgYSBsb2dpY2FsIG5hbWUgaW5zdGVhZCAqLwotCS8qIENvbmNhdGVuYXRlICdweXRob25fbW9kdWxlXycgYW5kIHNob3J0bmFtZSAqLwotCS8qIHNvICJpbXBvcnQgdm1zLmJhciIgd2lsbCB1c2UgdGhlIGxvZ2ljYWwgcHl0aG9uX21vZHVsZV9iYXIgKi8KLQkvKiBBcyBDIG1vZHVsZSB1c2Ugb25seSBvbmUgbmFtZSBzcGFjZSB0aGlzIGlzIHByb2JhYmx5IG5vdCBhICovCi0JLyogaW1wb3J0YW50IGxpbWl0YXRpb24gKi8KLQlQeU9TX3NucHJpbnRmKHBhdGhidWYsIHNpemVvZihwYXRoYnVmKSwgInB5dGhvbl9tb2R1bGVfJS0uMjAwcyIsIAotCQkgICAgICBzaG9ydG5hbWUpOwotCXBhdGhuYW1lID0gcGF0aGJ1ZjsKKyAgICAvKiBWTVMgY3VycmVudGx5IGRvbid0IGFsbG93IGEgcGF0aG5hbWUsIHVzZSBhIGxvZ2ljYWwgbmFtZSBpbnN0ZWFkICovCisgICAgLyogQ29uY2F0ZW5hdGUgJ3B5dGhvbl9tb2R1bGVfJyBhbmQgc2hvcnRuYW1lICovCisgICAgLyogc28gImltcG9ydCB2bXMuYmFyIiB3aWxsIHVzZSB0aGUgbG9naWNhbCBweXRob25fbW9kdWxlX2JhciAqLworICAgIC8qIEFzIEMgbW9kdWxlIHVzZSBvbmx5IG9uZSBuYW1lIHNwYWNlIHRoaXMgaXMgcHJvYmFibHkgbm90IGEgKi8KKyAgICAvKiBpbXBvcnRhbnQgbGltaXRhdGlvbiAqLworICAgIFB5T1Nfc25wcmludGYocGF0aGJ1Ziwgc2l6ZW9mKHBhdGhidWYpLCAicHl0aG9uX21vZHVsZV8lLS4yMDBzIiwKKyAgICAgICAgICAgICAgICAgIHNob3J0bmFtZSk7CisgICAgcGF0aG5hbWUgPSBwYXRoYnVmOwogI2VuZGlmCiAKLQloYW5kbGUgPSBkbG9wZW4ocGF0aG5hbWUsIGRsb3BlbmZsYWdzKTsKKyAgICBoYW5kbGUgPSBkbG9wZW4ocGF0aG5hbWUsIGRsb3BlbmZsYWdzKTsKIAotCWlmIChoYW5kbGUgPT0gTlVMTCkgewotCQljb25zdCBjaGFyICplcnJvciA9IGRsZXJyb3IoKTsKLQkJaWYgKGVycm9yID09IE5VTEwpCi0JCQllcnJvciA9ICJ1bmtub3duIGRsb3BlbigpIGVycm9yIjsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0ltcG9ydEVycm9yLCBlcnJvcik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoZnAgIT0gTlVMTCAmJiBuaGFuZGxlcyA8IDEyOCkKLQkJaGFuZGxlc1tuaGFuZGxlcysrXS5oYW5kbGUgPSBoYW5kbGU7Ci0JcCA9IChkbF9mdW5jcHRyKSBkbHN5bShoYW5kbGUsIGZ1bmNuYW1lKTsKLQlyZXR1cm4gcDsKKyAgICBpZiAoaGFuZGxlID09IE5VTEwpIHsKKyAgICAgICAgY29uc3QgY2hhciAqZXJyb3IgPSBkbGVycm9yKCk7CisgICAgICAgIGlmIChlcnJvciA9PSBOVUxMKQorICAgICAgICAgICAgZXJyb3IgPSAidW5rbm93biBkbG9wZW4oKSBlcnJvciI7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwgZXJyb3IpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKGZwICE9IE5VTEwgJiYgbmhhbmRsZXMgPCAxMjgpCisgICAgICAgIGhhbmRsZXNbbmhhbmRsZXMrK10uaGFuZGxlID0gaGFuZGxlOworICAgIHAgPSAoZGxfZnVuY3B0cikgZGxzeW0oaGFuZGxlLCBmdW5jbmFtZSk7CisgICAgcmV0dXJuIHA7CiB9CmRpZmYgLS1naXQgYS9QeXRob24vZHlubG9hZF93aW4uYyBiL1B5dGhvbi9keW5sb2FkX3dpbi5jCmluZGV4IDkwN2E1YTMuLjRlNTU1NWUgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9keW5sb2FkX3dpbi5jCisrKyBiL1B5dGhvbi9keW5sb2FkX3dpbi5jCkBAIC0xNywxMSArMTcsMTEgQEAKIAogY29uc3Qgc3RydWN0IGZpbGVkZXNjciBfUHlJbXBvcnRfRHluTG9hZEZpbGV0YWJbXSA9IHsKICNpZmRlZiBfREVCVUcKLQl7Il9kLnB5ZCIsICJyYiIsIENfRVhURU5TSU9OfSwKKyAgICB7Il9kLnB5ZCIsICJyYiIsIENfRVhURU5TSU9OfSwKICNlbHNlCi0JeyIucHlkIiwgInJiIiwgQ19FWFRFTlNJT059LAorICAgIHsiLnB5ZCIsICJyYiIsIENfRVhURU5TSU9OfSwKICNlbmRpZgotCXswLCAwfQorICAgIHswLCAwfQogfTsKIAogCkBAIC0yOSwxOCArMjksMTggQEAKICAgIEMgUlRMIGltcGxlbWVudGF0aW9ucyAqLwogCiBzdGF0aWMgaW50IHN0cmNhc2VjbXAgKGNoYXIgKnN0cmluZzEsIGNoYXIgKnN0cmluZzIpCi17IAotCWludCBmaXJzdCwgc2Vjb25kOworeworICAgIGludCBmaXJzdCwgc2Vjb25kOwogCi0JZG8gewotCQlmaXJzdCAgPSB0b2xvd2VyKCpzdHJpbmcxKTsKLQkJc2Vjb25kID0gdG9sb3dlcigqc3RyaW5nMik7Ci0JCXN0cmluZzErKzsKLQkJc3RyaW5nMisrOwotCX0gd2hpbGUgKGZpcnN0ICYmIGZpcnN0ID09IHNlY29uZCk7CisgICAgZG8geworICAgICAgICBmaXJzdCAgPSB0b2xvd2VyKCpzdHJpbmcxKTsKKyAgICAgICAgc2Vjb25kID0gdG9sb3dlcigqc3RyaW5nMik7CisgICAgICAgIHN0cmluZzErKzsKKyAgICAgICAgc3RyaW5nMisrOworICAgIH0gd2hpbGUgKGZpcnN0ICYmIGZpcnN0ID09IHNlY29uZCk7CiAKLQlyZXR1cm4gKGZpcnN0IC0gc2Vjb25kKTsKLX0gCisgICAgcmV0dXJuIChmaXJzdCAtIHNlY29uZCk7Cit9CiAKIAogLyogRnVuY3Rpb24gdG8gcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSAicHl0aG9uIiBETEwgdGhhdCB0aGUgc3VwcGxpZWQgbW9kdWxlCkBAIC02NiwyMDkgKzY2LDIwOSBAQAogCiBzdGF0aWMgY2hhciAqR2V0UHl0aG9uSW1wb3J0IChISU5TVEFOQ0UgaE1vZHVsZSkKIHsKLQl1bnNpZ25lZCBjaGFyICpkbGxiYXNlLCAqaW1wb3J0X2RhdGEsICppbXBvcnRfbmFtZTsKLQlEV09SRCBwZV9vZmZzZXQsIG9wdF9vZmZzZXQ7Ci0JV09SRCBvcHRfbWFnaWM7Ci0JaW50IG51bV9kaWN0X29mZiwgaW1wb3J0X29mZjsKKyAgICB1bnNpZ25lZCBjaGFyICpkbGxiYXNlLCAqaW1wb3J0X2RhdGEsICppbXBvcnRfbmFtZTsKKyAgICBEV09SRCBwZV9vZmZzZXQsIG9wdF9vZmZzZXQ7CisgICAgV09SRCBvcHRfbWFnaWM7CisgICAgaW50IG51bV9kaWN0X29mZiwgaW1wb3J0X29mZjsKIAotCS8qIFNhZmV0eSBjaGVjayBpbnB1dCAqLwotCWlmIChoTW9kdWxlID09IE5VTEwpIHsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIC8qIFNhZmV0eSBjaGVjayBpbnB1dCAqLworICAgIGlmIChoTW9kdWxlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JLyogTW9kdWxlIGluc3RhbmNlIGlzIGFsc28gdGhlIGJhc2UgbG9hZCBhZGRyZXNzLiAgRmlyc3QgcG9ydGlvbiBvZgotCSAgIG1lbW9yeSBpcyB0aGUgTVMtRE9TIGxvYWRlciwgd2hpY2ggaG9sZHMgdGhlIG9mZnNldCB0byB0aGUgUEUKLQkgICBoZWFkZXIgKGZyb20gdGhlIGxvYWQgYmFzZSkgYXQgMHgzQyAqLwotCWRsbGJhc2UgPSAodW5zaWduZWQgY2hhciAqKWhNb2R1bGU7Ci0JcGVfb2Zmc2V0ID0gRFdPUkRfQVQoZGxsYmFzZSArIDB4M0MpOworICAgIC8qIE1vZHVsZSBpbnN0YW5jZSBpcyBhbHNvIHRoZSBiYXNlIGxvYWQgYWRkcmVzcy4gIEZpcnN0IHBvcnRpb24gb2YKKyAgICAgICBtZW1vcnkgaXMgdGhlIE1TLURPUyBsb2FkZXIsIHdoaWNoIGhvbGRzIHRoZSBvZmZzZXQgdG8gdGhlIFBFCisgICAgICAgaGVhZGVyIChmcm9tIHRoZSBsb2FkIGJhc2UpIGF0IDB4M0MgKi8KKyAgICBkbGxiYXNlID0gKHVuc2lnbmVkIGNoYXIgKiloTW9kdWxlOworICAgIHBlX29mZnNldCA9IERXT1JEX0FUKGRsbGJhc2UgKyAweDNDKTsKIAotCS8qIFRoZSBQRSBzaWduYXR1cmUgbXVzdCBiZSAiUEVcMFwwIiAqLwotCWlmIChtZW1jbXAoZGxsYmFzZStwZV9vZmZzZXQsIlBFXDBcMCIsNCkpIHsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIC8qIFRoZSBQRSBzaWduYXR1cmUgbXVzdCBiZSAiUEVcMFwwIiAqLworICAgIGlmIChtZW1jbXAoZGxsYmFzZStwZV9vZmZzZXQsIlBFXDBcMCIsNCkpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JLyogRm9sbG93aW5nIHRoZSBQRSBzaWduYXR1cmUgaXMgdGhlIHN0YW5kYXJkIENPRkYgaGVhZGVyICgyMAotCSAgIGJ5dGVzKSBhbmQgdGhlbiB0aGUgb3B0aW9uYWwgaGVhZGVyLiAgVGhlIG9wdGlvbmFsIGhlYWRlciBzdGFydHMKLQkgICB3aXRoIGEgbWFnaWMgdmFsdWUgb2YgMHgxMEIgZm9yIFBFMzIgb3IgMHgyMEIgZm9yIFBFMzIrIChQRTMyKwotCSAgIHVzZXMgNjQtYml0cyBmb3Igc29tZSBmaWVsZHMpLiAgSXQgbWlnaHQgYWxzbyBiZSAweDEwNyBmb3IgYSBST00KLQkgICBpbWFnZSwgYnV0IHdlIGRvbid0IHByb2Nlc3MgdGhhdCBoZXJlLgorICAgIC8qIEZvbGxvd2luZyB0aGUgUEUgc2lnbmF0dXJlIGlzIHRoZSBzdGFuZGFyZCBDT0ZGIGhlYWRlciAoMjAKKyAgICAgICBieXRlcykgYW5kIHRoZW4gdGhlIG9wdGlvbmFsIGhlYWRlci4gIFRoZSBvcHRpb25hbCBoZWFkZXIgc3RhcnRzCisgICAgICAgd2l0aCBhIG1hZ2ljIHZhbHVlIG9mIDB4MTBCIGZvciBQRTMyIG9yIDB4MjBCIGZvciBQRTMyKyAoUEUzMisKKyAgICAgICB1c2VzIDY0LWJpdHMgZm9yIHNvbWUgZmllbGRzKS4gIEl0IG1pZ2h0IGFsc28gYmUgMHgxMDcgZm9yIGEgUk9NCisgICAgICAgaW1hZ2UsIGJ1dCB3ZSBkb24ndCBwcm9jZXNzIHRoYXQgaGVyZS4KIAotCSAgIFRoZSBvcHRpb25hbCBoZWFkZXIgZW5kcyB3aXRoIGEgZGF0YSBkaWN0aW9uYXJ5IHRoYXQgZGlyZWN0bHkKLQkgICBwb2ludHMgdG8gY2VydGFpbiB0eXBlcyBvZiBkYXRhLCBhbW9uZyB0aGVtIHRoZSBpbXBvcnQgZW50cmllcwotCSAgIChpbiB0aGUgc2Vjb25kIHRhYmxlIGVudHJ5KS4gQmFzZWQgb24gdGhlIGhlYWRlciB0eXBlLCB3ZQotCSAgIGRldGVybWluZSBvZmZzZXRzIGZvciB0aGUgZGF0YSBkaWN0aW9uYXJ5IGNvdW50IGFuZCB0aGUgZW50cnkKLQkgICB3aXRoaW4gdGhlIGRpY3Rpb25hcnkgcG9pbnRpbmcgdG8gdGhlIGltcG9ydHMuICovCisgICAgICAgVGhlIG9wdGlvbmFsIGhlYWRlciBlbmRzIHdpdGggYSBkYXRhIGRpY3Rpb25hcnkgdGhhdCBkaXJlY3RseQorICAgICAgIHBvaW50cyB0byBjZXJ0YWluIHR5cGVzIG9mIGRhdGEsIGFtb25nIHRoZW0gdGhlIGltcG9ydCBlbnRyaWVzCisgICAgICAgKGluIHRoZSBzZWNvbmQgdGFibGUgZW50cnkpLiBCYXNlZCBvbiB0aGUgaGVhZGVyIHR5cGUsIHdlCisgICAgICAgZGV0ZXJtaW5lIG9mZnNldHMgZm9yIHRoZSBkYXRhIGRpY3Rpb25hcnkgY291bnQgYW5kIHRoZSBlbnRyeQorICAgICAgIHdpdGhpbiB0aGUgZGljdGlvbmFyeSBwb2ludGluZyB0byB0aGUgaW1wb3J0cy4gKi8KIAotCW9wdF9vZmZzZXQgPSBwZV9vZmZzZXQgKyA0ICsgMjA7Ci0Jb3B0X21hZ2ljID0gV09SRF9BVChkbGxiYXNlK29wdF9vZmZzZXQpOwotCWlmIChvcHRfbWFnaWMgPT0gMHgxMEIpIHsKLQkJLyogUEUzMiAqLwotCQludW1fZGljdF9vZmYgPSA5MjsKLQkJaW1wb3J0X29mZiAgID0gMTA0OwotCX0gZWxzZSBpZiAob3B0X21hZ2ljID09IDB4MjBCKSB7Ci0JCS8qIFBFMzIrICovCi0JCW51bV9kaWN0X29mZiA9IDEwODsKLQkJaW1wb3J0X29mZiAgID0gMTIwOwotCX0gZWxzZSB7Ci0JCS8qIFVuc3VwcG9ydGVkICovCi0JCXJldHVybiBOVUxMOwotCX0KKyAgICBvcHRfb2Zmc2V0ID0gcGVfb2Zmc2V0ICsgNCArIDIwOworICAgIG9wdF9tYWdpYyA9IFdPUkRfQVQoZGxsYmFzZStvcHRfb2Zmc2V0KTsKKyAgICBpZiAob3B0X21hZ2ljID09IDB4MTBCKSB7CisgICAgICAgIC8qIFBFMzIgKi8KKyAgICAgICAgbnVtX2RpY3Rfb2ZmID0gOTI7CisgICAgICAgIGltcG9ydF9vZmYgICA9IDEwNDsKKyAgICB9IGVsc2UgaWYgKG9wdF9tYWdpYyA9PSAweDIwQikgeworICAgICAgICAvKiBQRTMyKyAqLworICAgICAgICBudW1fZGljdF9vZmYgPSAxMDg7CisgICAgICAgIGltcG9ydF9vZmYgICA9IDEyMDsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBVbnN1cHBvcnRlZCAqLworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQkvKiBOb3cgaWYgYW4gaW1wb3J0IHRhYmxlIGV4aXN0cywgb2Zmc2V0IHRvIGl0IGFuZCB3YWxrIHRoZSBsaXN0IG9mCi0JICAgaW1wb3J0cy4gIFRoZSBpbXBvcnQgdGFibGUgaXMgYW4gYXJyYXkgKGVuZGluZyB3aGVuIGFuIGVudHJ5IGhhcwotCSAgIGVtcHR5IHZhbHVlcykgb2Ygc3RydWN0dXJlcyAoMjAgYnl0ZXMgZWFjaCksIHdoaWNoIGNvbnRhaW5zIChhdAotCSAgIG9mZnNldCAxMikgYSByZWxhdGl2ZSBhZGRyZXNzICh0byB0aGUgbW9kdWxlIGJhc2UpIGF0IHdoaWNoIGEKLQkgICBzdHJpbmcgY29uc3RhbnQgaG9sZGluZyB0aGUgaW1wb3J0IG5hbWUgaXMgbG9jYXRlZC4gKi8KKyAgICAvKiBOb3cgaWYgYW4gaW1wb3J0IHRhYmxlIGV4aXN0cywgb2Zmc2V0IHRvIGl0IGFuZCB3YWxrIHRoZSBsaXN0IG9mCisgICAgICAgaW1wb3J0cy4gIFRoZSBpbXBvcnQgdGFibGUgaXMgYW4gYXJyYXkgKGVuZGluZyB3aGVuIGFuIGVudHJ5IGhhcworICAgICAgIGVtcHR5IHZhbHVlcykgb2Ygc3RydWN0dXJlcyAoMjAgYnl0ZXMgZWFjaCksIHdoaWNoIGNvbnRhaW5zIChhdAorICAgICAgIG9mZnNldCAxMikgYSByZWxhdGl2ZSBhZGRyZXNzICh0byB0aGUgbW9kdWxlIGJhc2UpIGF0IHdoaWNoIGEKKyAgICAgICBzdHJpbmcgY29uc3RhbnQgaG9sZGluZyB0aGUgaW1wb3J0IG5hbWUgaXMgbG9jYXRlZC4gKi8KIAotCWlmIChEV09SRF9BVChkbGxiYXNlICsgb3B0X29mZnNldCArIG51bV9kaWN0X29mZikgPj0gMikgewotCQkvKiBXZSBoYXZlIGF0IGxlYXN0IDIgdGFibGVzIC0gdGhlIGltcG9ydCB0YWJsZSBpcyB0aGUgc2Vjb25kCi0JCSAgIG9uZS4gIEJ1dCBzdGlsbCBpdCBtYXkgYmUgdGhhdCB0aGUgdGFibGUgc2l6ZSBpcyB6ZXJvICovCi0JCWlmICgwID09IERXT1JEX0FUKGRsbGJhc2UgKyBvcHRfb2Zmc2V0ICsgaW1wb3J0X29mZiArIHNpemVvZihEV09SRCkpKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWltcG9ydF9kYXRhID0gZGxsYmFzZSArIERXT1JEX0FUKGRsbGJhc2UgKwotCQkJCQkJIG9wdF9vZmZzZXQgKwotCQkJCQkJIGltcG9ydF9vZmYpOwotCQl3aGlsZSAoRFdPUkRfQVQoaW1wb3J0X2RhdGEpKSB7Ci0JCQlpbXBvcnRfbmFtZSA9IGRsbGJhc2UgKyBEV09SRF9BVChpbXBvcnRfZGF0YSsxMik7Ci0JCQlpZiAoc3RybGVuKGltcG9ydF9uYW1lKSA+PSA2ICYmCi0JCQkgICAgIXN0cm5jbXAoaW1wb3J0X25hbWUsInB5dGhvbiIsNikpIHsKLQkJCQljaGFyICpwY2g7CisgICAgaWYgKERXT1JEX0FUKGRsbGJhc2UgKyBvcHRfb2Zmc2V0ICsgbnVtX2RpY3Rfb2ZmKSA+PSAyKSB7CisgICAgICAgIC8qIFdlIGhhdmUgYXQgbGVhc3QgMiB0YWJsZXMgLSB0aGUgaW1wb3J0IHRhYmxlIGlzIHRoZSBzZWNvbmQKKyAgICAgICAgICAgb25lLiAgQnV0IHN0aWxsIGl0IG1heSBiZSB0aGF0IHRoZSB0YWJsZSBzaXplIGlzIHplcm8gKi8KKyAgICAgICAgaWYgKDAgPT0gRFdPUkRfQVQoZGxsYmFzZSArIG9wdF9vZmZzZXQgKyBpbXBvcnRfb2ZmICsgc2l6ZW9mKERXT1JEKSkpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgaW1wb3J0X2RhdGEgPSBkbGxiYXNlICsgRFdPUkRfQVQoZGxsYmFzZSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdF9vZmZzZXQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnRfb2ZmKTsKKyAgICAgICAgd2hpbGUgKERXT1JEX0FUKGltcG9ydF9kYXRhKSkgeworICAgICAgICAgICAgaW1wb3J0X25hbWUgPSBkbGxiYXNlICsgRFdPUkRfQVQoaW1wb3J0X2RhdGErMTIpOworICAgICAgICAgICAgaWYgKHN0cmxlbihpbXBvcnRfbmFtZSkgPj0gNiAmJgorICAgICAgICAgICAgICAgICFzdHJuY21wKGltcG9ydF9uYW1lLCJweXRob24iLDYpKSB7CisgICAgICAgICAgICAgICAgY2hhciAqcGNoOwogCi0JCQkJLyogRW5zdXJlIHB5dGhvbiBwcmVmaXggaXMgZm9sbG93ZWQgb25seQotCQkJCSAgIGJ5IG51bWJlcnMgdG8gdGhlIGVuZCBvZiB0aGUgYmFzZW5hbWUgKi8KLQkJCQlwY2ggPSBpbXBvcnRfbmFtZSArIDY7CisgICAgICAgICAgICAgICAgLyogRW5zdXJlIHB5dGhvbiBwcmVmaXggaXMgZm9sbG93ZWQgb25seQorICAgICAgICAgICAgICAgICAgIGJ5IG51bWJlcnMgdG8gdGhlIGVuZCBvZiB0aGUgYmFzZW5hbWUgKi8KKyAgICAgICAgICAgICAgICBwY2ggPSBpbXBvcnRfbmFtZSArIDY7CiAjaWZkZWYgX0RFQlVHCi0JCQkJd2hpbGUgKCpwY2ggJiYgcGNoWzBdICE9ICdfJyAmJiBwY2hbMV0gIT0gJ2QnICYmIHBjaFsyXSAhPSAnLicpIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAoKnBjaCAmJiBwY2hbMF0gIT0gJ18nICYmIHBjaFsxXSAhPSAnZCcgJiYgcGNoWzJdICE9ICcuJykgewogI2Vsc2UKLQkJCQl3aGlsZSAoKnBjaCAmJiAqcGNoICE9ICcuJykgeworICAgICAgICAgICAgICAgIHdoaWxlICgqcGNoICYmICpwY2ggIT0gJy4nKSB7CiAjZW5kaWYKLQkJCQkJaWYgKCpwY2ggPj0gJzAnICYmICpwY2ggPD0gJzknKSB7Ci0JCQkJCQlwY2grKzsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXBjaCA9IE5VTEw7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkgICAgCi0JCQkJaWYgKHBjaCkgewotCQkJCQkvKiBGb3VuZCBpdCAtIHJldHVybiB0aGUgbmFtZSAqLwotCQkJCQlyZXR1cm4gaW1wb3J0X25hbWU7Ci0JCQkJfQotCQkJfQotCQkJaW1wb3J0X2RhdGEgKz0gMjA7Ci0JCX0KLQl9CisgICAgICAgICAgICAgICAgICAgIGlmICgqcGNoID49ICcwJyAmJiAqcGNoIDw9ICc5JykgeworICAgICAgICAgICAgICAgICAgICAgICAgcGNoKys7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwY2ggPSBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CiAKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICBpZiAocGNoKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIEZvdW5kIGl0IC0gcmV0dXJuIHRoZSBuYW1lICovCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbXBvcnRfbmFtZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbXBvcnRfZGF0YSArPSAyMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBOVUxMOwogfQogCiAKIGRsX2Z1bmNwdHIgX1B5SW1wb3J0X0dldER5bkxvYWRGdW5jKGNvbnN0IGNoYXIgKmZxbmFtZSwgY29uc3QgY2hhciAqc2hvcnRuYW1lLAotCQkJCSAgICBjb25zdCBjaGFyICpwYXRobmFtZSwgRklMRSAqZnApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwYXRobmFtZSwgRklMRSAqZnApCiB7Ci0JZGxfZnVuY3B0ciBwOwotCWNoYXIgZnVuY25hbWVbMjU4XSwgKmltcG9ydF9weXRob247CisgICAgZGxfZnVuY3B0ciBwOworICAgIGNoYXIgZnVuY25hbWVbMjU4XSwgKmltcG9ydF9weXRob247CiAKLQlQeU9TX3NucHJpbnRmKGZ1bmNuYW1lLCBzaXplb2YoZnVuY25hbWUpLCAiaW5pdCUuMjAwcyIsIHNob3J0bmFtZSk7CisgICAgUHlPU19zbnByaW50ZihmdW5jbmFtZSwgc2l6ZW9mKGZ1bmNuYW1lKSwgImluaXQlLjIwMHMiLCBzaG9ydG5hbWUpOwogCi0JewotCQlISU5TVEFOQ0UgaERMTCA9IE5VTEw7Ci0JCWNoYXIgcGF0aGJ1ZlsyNjBdOwotCQlMUFRTVFIgZHVtbXk7Ci0JCXVuc2lnbmVkIGludCBvbGRfbW9kZTsKLQkJVUxPTkdfUFRSIGNvb2tpZSA9IDA7Ci0JCS8qIFdlIHVzZSBMb2FkTGlicmFyeUV4IHNvIFdpbmRvd3MgbG9va3MgZm9yIGRlcGVuZGVudCBETExzIAotCQkgICAgaW4gZGlyZWN0b3J5IG9mIHBhdGhuYW1lIGZpcnN0LiAgSG93ZXZlciwgV2luZG93czk1Ci0JCSAgICBjYW4gc29tZXRpbWVzIG5vdCB3b3JrIGNvcnJlY3RseSB1bmxlc3MgdGhlIGFic29sdXRlCi0JCSAgICBwYXRoIGlzIHVzZWQuICBJZiBHZXRGdWxsUGF0aE5hbWUoKSBmYWlscywgdGhlIExvYWRMaWJyYXJ5Ci0JCSAgICB3aWxsIGNlcnRhaW5seSBmYWlsIHRvbywgc28gdXNlIGl0cyBlcnJvciBjb2RlICovCisgICAgeworICAgICAgICBISU5TVEFOQ0UgaERMTCA9IE5VTEw7CisgICAgICAgIGNoYXIgcGF0aGJ1ZlsyNjBdOworICAgICAgICBMUFRTVFIgZHVtbXk7CisgICAgICAgIHVuc2lnbmVkIGludCBvbGRfbW9kZTsKKyAgICAgICAgVUxPTkdfUFRSIGNvb2tpZSA9IDA7CisgICAgICAgIC8qIFdlIHVzZSBMb2FkTGlicmFyeUV4IHNvIFdpbmRvd3MgbG9va3MgZm9yIGRlcGVuZGVudCBETExzCisgICAgICAgICAgICBpbiBkaXJlY3Rvcnkgb2YgcGF0aG5hbWUgZmlyc3QuICBIb3dldmVyLCBXaW5kb3dzOTUKKyAgICAgICAgICAgIGNhbiBzb21ldGltZXMgbm90IHdvcmsgY29ycmVjdGx5IHVubGVzcyB0aGUgYWJzb2x1dGUKKyAgICAgICAgICAgIHBhdGggaXMgdXNlZC4gIElmIEdldEZ1bGxQYXRoTmFtZSgpIGZhaWxzLCB0aGUgTG9hZExpYnJhcnkKKyAgICAgICAgICAgIHdpbGwgY2VydGFpbmx5IGZhaWwgdG9vLCBzbyB1c2UgaXRzIGVycm9yIGNvZGUgKi8KIAotCQkvKiBEb24ndCBkaXNwbGF5IGEgbWVzc2FnZSBib3ggd2hlbiBQeXRob24gY2FuJ3QgbG9hZCBhIERMTCAqLwotCQlvbGRfbW9kZSA9IFNldEVycm9yTW9kZShTRU1fRkFJTENSSVRJQ0FMRVJST1JTKTsKKyAgICAgICAgLyogRG9uJ3QgZGlzcGxheSBhIG1lc3NhZ2UgYm94IHdoZW4gUHl0aG9uIGNhbid0IGxvYWQgYSBETEwgKi8KKyAgICAgICAgb2xkX21vZGUgPSBTZXRFcnJvck1vZGUoU0VNX0ZBSUxDUklUSUNBTEVSUk9SUyk7CiAKLQkJaWYgKEdldEZ1bGxQYXRoTmFtZShwYXRobmFtZSwKLQkJCQkgICAgc2l6ZW9mKHBhdGhidWYpLAotCQkJCSAgICBwYXRoYnVmLAotCQkJCSAgICAmZHVtbXkpKSB7Ci0JCQlVTE9OR19QVFIgY29va2llID0gX1B5X0FjdGl2YXRlQWN0Q3R4KCk7Ci0JCQkvKiBYWFggVGhpcyBjYWxsIGRvZXNuJ3QgZXhpc3QgaW4gV2luZG93cyBDRSAqLwotCQkJaERMTCA9IExvYWRMaWJyYXJ5RXgocGF0aG5hbWUsIE5VTEwsCi0JCQkJCSAgICAgTE9BRF9XSVRIX0FMVEVSRURfU0VBUkNIX1BBVEgpOwotCQkJX1B5X0RlYWN0aXZhdGVBY3RDdHgoY29va2llKTsKLQkJfQorICAgICAgICBpZiAoR2V0RnVsbFBhdGhOYW1lKHBhdGhuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihwYXRoYnVmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkdW1teSkpIHsKKyAgICAgICAgICAgIFVMT05HX1BUUiBjb29raWUgPSBfUHlfQWN0aXZhdGVBY3RDdHgoKTsKKyAgICAgICAgICAgIC8qIFhYWCBUaGlzIGNhbGwgZG9lc24ndCBleGlzdCBpbiBXaW5kb3dzIENFICovCisgICAgICAgICAgICBoRExMID0gTG9hZExpYnJhcnlFeChwYXRobmFtZSwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPQURfV0lUSF9BTFRFUkVEX1NFQVJDSF9QQVRIKTsKKyAgICAgICAgICAgIF9QeV9EZWFjdGl2YXRlQWN0Q3R4KGNvb2tpZSk7CisgICAgICAgIH0KIAotCQkvKiByZXN0b3JlIG9sZCBlcnJvciBtb2RlIHNldHRpbmdzICovCi0JCVNldEVycm9yTW9kZShvbGRfbW9kZSk7CisgICAgICAgIC8qIHJlc3RvcmUgb2xkIGVycm9yIG1vZGUgc2V0dGluZ3MgKi8KKyAgICAgICAgU2V0RXJyb3JNb2RlKG9sZF9tb2RlKTsKIAotCQlpZiAoaERMTD09TlVMTCl7Ci0JCQljaGFyIGVyckJ1ZlsyNTZdOwotCQkJdW5zaWduZWQgaW50IGVycm9yQ29kZTsKKyAgICAgICAgaWYgKGhETEw9PU5VTEwpeworICAgICAgICAgICAgY2hhciBlcnJCdWZbMjU2XTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBlcnJvckNvZGU7CiAKLQkJCS8qIEdldCBhbiBlcnJvciBzdHJpbmcgZnJvbSBXaW4zMiBlcnJvciBjb2RlICovCi0JCQljaGFyIHRoZUluZm9bMjU2XTsgLyogUG9pbnRlciB0byBlcnJvciB0ZXh0Ci0JCQkJCSAgICAgIGZyb20gc3lzdGVtICovCi0JCQlpbnQgdGhlTGVuZ3RoOyAvKiBMZW5ndGggb2YgZXJyb3IgdGV4dCAqLworICAgICAgICAgICAgLyogR2V0IGFuIGVycm9yIHN0cmluZyBmcm9tIFdpbjMyIGVycm9yIGNvZGUgKi8KKyAgICAgICAgICAgIGNoYXIgdGhlSW5mb1syNTZdOyAvKiBQb2ludGVyIHRvIGVycm9yIHRleHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHN5c3RlbSAqLworICAgICAgICAgICAgaW50IHRoZUxlbmd0aDsgLyogTGVuZ3RoIG9mIGVycm9yIHRleHQgKi8KIAotCQkJZXJyb3JDb2RlID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgICAgICBlcnJvckNvZGUgPSBHZXRMYXN0RXJyb3IoKTsKIAotCQkJdGhlTGVuZ3RoID0gRm9ybWF0TWVzc2FnZSgKLQkJCQlGT1JNQVRfTUVTU0FHRV9GUk9NX1NZU1RFTSB8Ci0JCQkJRk9STUFUX01FU1NBR0VfSUdOT1JFX0lOU0VSVFMsIC8qIGZsYWdzICovCi0JCQkJTlVMTCwgLyogbWVzc2FnZSBzb3VyY2UgKi8KLQkJCQllcnJvckNvZGUsIC8qIHRoZSBtZXNzYWdlIChlcnJvcikgSUQgKi8KLQkJCQkwLCAvKiBkZWZhdWx0IGxhbmd1YWdlIGVudmlyb25tZW50ICovCi0JCQkJKExQVFNUUikgdGhlSW5mbywgLyogdGhlIGJ1ZmZlciAqLwotCQkJCXNpemVvZih0aGVJbmZvKSwgLyogdGhlIGJ1ZmZlciBzaXplICovCi0JCQkJTlVMTCk7IC8qIG5vIGFkZGl0aW9uYWwgZm9ybWF0IGFyZ3MuICovCisgICAgICAgICAgICB0aGVMZW5ndGggPSBGb3JtYXRNZXNzYWdlKAorICAgICAgICAgICAgICAgIEZPUk1BVF9NRVNTQUdFX0ZST01fU1lTVEVNIHwKKyAgICAgICAgICAgICAgICBGT1JNQVRfTUVTU0FHRV9JR05PUkVfSU5TRVJUUywgLyogZmxhZ3MgKi8KKyAgICAgICAgICAgICAgICBOVUxMLCAvKiBtZXNzYWdlIHNvdXJjZSAqLworICAgICAgICAgICAgICAgIGVycm9yQ29kZSwgLyogdGhlIG1lc3NhZ2UgKGVycm9yKSBJRCAqLworICAgICAgICAgICAgICAgIDAsIC8qIGRlZmF1bHQgbGFuZ3VhZ2UgZW52aXJvbm1lbnQgKi8KKyAgICAgICAgICAgICAgICAoTFBUU1RSKSB0aGVJbmZvLCAvKiB0aGUgYnVmZmVyICovCisgICAgICAgICAgICAgICAgc2l6ZW9mKHRoZUluZm8pLCAvKiB0aGUgYnVmZmVyIHNpemUgKi8KKyAgICAgICAgICAgICAgICBOVUxMKTsgLyogbm8gYWRkaXRpb25hbCBmb3JtYXQgYXJncy4gKi8KIAotCQkJLyogUHJvYmxlbTogY291bGQgbm90IGdldCB0aGUgZXJyb3IgbWVzc2FnZS4KLQkJCSAgIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gaWYgY2FsbGVkIGNvcnJlY3RseS4gKi8KLQkJCWlmICh0aGVMZW5ndGggPT0gMCkgewotCQkJCVB5T1Nfc25wcmludGYoZXJyQnVmLCBzaXplb2YoZXJyQnVmKSwKLQkJCQkgICAgICAiRExMIGxvYWQgZmFpbGVkIHdpdGggZXJyb3IgY29kZSAlZCIsCi0JCQkJCSAgICAgIGVycm9yQ29kZSk7Ci0JCQl9IGVsc2UgewotCQkJCXNpemVfdCBsZW47Ci0JCQkJLyogRm9yIHNvbWUgcmVhc29uIGEgXHJcbgotCQkJCSAgIGlzIGFwcGVuZGVkIHRvIHRoZSB0ZXh0ICovCi0JCQkJaWYgKHRoZUxlbmd0aCA+PSAyICYmCi0JCQkJICAgIHRoZUluZm9bdGhlTGVuZ3RoLTJdID09ICdccicgJiYKLQkJCQkgICAgdGhlSW5mb1t0aGVMZW5ndGgtMV0gPT0gJ1xuJykgewotCQkJCQl0aGVMZW5ndGggLT0gMjsKLQkJCQkJdGhlSW5mb1t0aGVMZW5ndGhdID0gJ1wwJzsKLQkJCQl9Ci0JCQkJc3RyY3B5KGVyckJ1ZiwgIkRMTCBsb2FkIGZhaWxlZDogIik7Ci0JCQkJbGVuID0gc3RybGVuKGVyckJ1Zik7Ci0JCQkJc3RybmNweShlcnJCdWYrbGVuLCB0aGVJbmZvLAotCQkJCQlzaXplb2YoZXJyQnVmKS1sZW4pOwotCQkJCWVyckJ1ZltzaXplb2YoZXJyQnVmKS0xXSA9ICdcMCc7Ci0JCQl9Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW1wb3J0RXJyb3IsIGVyckJ1Zik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfSBlbHNlIHsKLQkJCWNoYXIgYnVmZmVyWzI1Nl07CisgICAgICAgICAgICAvKiBQcm9ibGVtOiBjb3VsZCBub3QgZ2V0IHRoZSBlcnJvciBtZXNzYWdlLgorICAgICAgICAgICAgICAgVGhpcyBzaG91bGQgbm90IGhhcHBlbiBpZiBjYWxsZWQgY29ycmVjdGx5LiAqLworICAgICAgICAgICAgaWYgKHRoZUxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICAgICAgUHlPU19zbnByaW50ZihlcnJCdWYsIHNpemVvZihlcnJCdWYpLAorICAgICAgICAgICAgICAgICAgICAgICJETEwgbG9hZCBmYWlsZWQgd2l0aCBlcnJvciBjb2RlICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JDb2RlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2l6ZV90IGxlbjsKKyAgICAgICAgICAgICAgICAvKiBGb3Igc29tZSByZWFzb24gYSBcclxuCisgICAgICAgICAgICAgICAgICAgaXMgYXBwZW5kZWQgdG8gdGhlIHRleHQgKi8KKyAgICAgICAgICAgICAgICBpZiAodGhlTGVuZ3RoID49IDIgJiYKKyAgICAgICAgICAgICAgICAgICAgdGhlSW5mb1t0aGVMZW5ndGgtMl0gPT0gJ1xyJyAmJgorICAgICAgICAgICAgICAgICAgICB0aGVJbmZvW3RoZUxlbmd0aC0xXSA9PSAnXG4nKSB7CisgICAgICAgICAgICAgICAgICAgIHRoZUxlbmd0aCAtPSAyOworICAgICAgICAgICAgICAgICAgICB0aGVJbmZvW3RoZUxlbmd0aF0gPSAnXDAnOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdHJjcHkoZXJyQnVmLCAiRExMIGxvYWQgZmFpbGVkOiAiKTsKKyAgICAgICAgICAgICAgICBsZW4gPSBzdHJsZW4oZXJyQnVmKTsKKyAgICAgICAgICAgICAgICBzdHJuY3B5KGVyckJ1ZitsZW4sIHRoZUluZm8sCisgICAgICAgICAgICAgICAgICAgIHNpemVvZihlcnJCdWYpLWxlbik7CisgICAgICAgICAgICAgICAgZXJyQnVmW3NpemVvZihlcnJCdWYpLTFdID0gJ1wwJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwgZXJyQnVmKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2hhciBidWZmZXJbMjU2XTsKIAogI2lmZGVmIF9ERUJVRwotCQkJUHlPU19zbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCAicHl0aG9uJWQlZF9kLmRsbCIsCisgICAgICAgICAgICBQeU9TX3NucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICJweXRob24lZCVkX2QuZGxsIiwKICNlbHNlCi0JCQlQeU9TX3NucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICJweXRob24lZCVkLmRsbCIsCisgICAgICAgICAgICBQeU9TX3NucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICJweXRob24lZCVkLmRsbCIsCiAjZW5kaWYKLQkJCQkgICAgICBQWV9NQUpPUl9WRVJTSU9OLFBZX01JTk9SX1ZFUlNJT04pOwotCQkJaW1wb3J0X3B5dGhvbiA9IEdldFB5dGhvbkltcG9ydChoRExMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUFlfTUFKT1JfVkVSU0lPTixQWV9NSU5PUl9WRVJTSU9OKTsKKyAgICAgICAgICAgIGltcG9ydF9weXRob24gPSBHZXRQeXRob25JbXBvcnQoaERMTCk7CiAKLQkJCWlmIChpbXBvcnRfcHl0aG9uICYmCi0JCQkgICAgc3RyY2FzZWNtcChidWZmZXIsaW1wb3J0X3B5dGhvbikpIHsKLQkJCQlQeU9TX3NucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksCi0JCQkJCSAgICAgICJNb2R1bGUgdXNlIG9mICUuMTUwcyBjb25mbGljdHMgIgotCQkJCQkgICAgICAid2l0aCB0aGlzIHZlcnNpb24gb2YgUHl0aG9uLiIsCi0JCQkJCSAgICAgIGltcG9ydF9weXRob24pOwotCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvcixidWZmZXIpOwotCQkJCUZyZWVMaWJyYXJ5KGhETEwpOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQl9Ci0JCXAgPSBHZXRQcm9jQWRkcmVzcyhoRExMLCBmdW5jbmFtZSk7Ci0JfQorICAgICAgICAgICAgaWYgKGltcG9ydF9weXRob24gJiYKKyAgICAgICAgICAgICAgICBzdHJjYXNlY21wKGJ1ZmZlcixpbXBvcnRfcHl0aG9uKSkgeworICAgICAgICAgICAgICAgIFB5T1Nfc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNb2R1bGUgdXNlIG9mICUuMTUwcyBjb25mbGljdHMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndpdGggdGhpcyB2ZXJzaW9uIG9mIFB5dGhvbi4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0X3B5dGhvbik7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0ltcG9ydEVycm9yLGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgRnJlZUxpYnJhcnkoaERMTCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcCA9IEdldFByb2NBZGRyZXNzKGhETEwsIGZ1bmNuYW1lKTsKKyAgICB9CiAKLQlyZXR1cm4gcDsKKyAgICByZXR1cm4gcDsKIH0KZGlmZiAtLWdpdCBhL1B5dGhvbi9lcnJvcnMuYyBiL1B5dGhvbi9lcnJvcnMuYwppbmRleCA2MTVkYTE5Li5kYTRiNDYzIDEwMDY0NAotLS0gYS9QeXRob24vZXJyb3JzLmMKKysrIGIvUHl0aG9uL2Vycm9ycy5jCkBAIC0yNCwxMDkgKzI0LDEwOSBAQAogdm9pZAogUHlFcnJfUmVzdG9yZShQeU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKnZhbHVlLCBQeU9iamVjdCAqdHJhY2ViYWNrKQogewotCVB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfR0VUKCk7Ci0JUHlPYmplY3QgKm9sZHR5cGUsICpvbGR2YWx1ZSwgKm9sZHRyYWNlYmFjazsKKyAgICBQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dFVCgpOworICAgIFB5T2JqZWN0ICpvbGR0eXBlLCAqb2xkdmFsdWUsICpvbGR0cmFjZWJhY2s7CiAKLQlpZiAodHJhY2ViYWNrICE9IE5VTEwgJiYgIVB5VHJhY2VCYWNrX0NoZWNrKHRyYWNlYmFjaykpIHsKLQkJLyogWFhYIFNob3VsZCBuZXZlciBoYXBwZW4gLS0gZmF0YWwgZXJyb3IgaW5zdGVhZD8gKi8KLQkJLyogV2VsbCwgaXQgY291bGQgYmUgTm9uZS4gKi8KLQkJUHlfREVDUkVGKHRyYWNlYmFjayk7Ci0JCXRyYWNlYmFjayA9IE5VTEw7Ci0JfQorICAgIGlmICh0cmFjZWJhY2sgIT0gTlVMTCAmJiAhUHlUcmFjZUJhY2tfQ2hlY2sodHJhY2ViYWNrKSkgeworICAgICAgICAvKiBYWFggU2hvdWxkIG5ldmVyIGhhcHBlbiAtLSBmYXRhbCBlcnJvciBpbnN0ZWFkPyAqLworICAgICAgICAvKiBXZWxsLCBpdCBjb3VsZCBiZSBOb25lLiAqLworICAgICAgICBQeV9ERUNSRUYodHJhY2ViYWNrKTsKKyAgICAgICAgdHJhY2ViYWNrID0gTlVMTDsKKyAgICB9CiAKLQkvKiBTYXZlIHRoZXNlIGluIGxvY2FscyB0byBzYWZlZ3VhcmQgYWdhaW5zdCByZWN1cnNpdmUKLQkgICBpbnZvY2F0aW9uIHRocm91Z2ggUHlfWERFQ1JFRiAqLwotCW9sZHR5cGUgPSB0c3RhdGUtPmN1cmV4Y190eXBlOwotCW9sZHZhbHVlID0gdHN0YXRlLT5jdXJleGNfdmFsdWU7Ci0Jb2xkdHJhY2ViYWNrID0gdHN0YXRlLT5jdXJleGNfdHJhY2ViYWNrOworICAgIC8qIFNhdmUgdGhlc2UgaW4gbG9jYWxzIHRvIHNhZmVndWFyZCBhZ2FpbnN0IHJlY3Vyc2l2ZQorICAgICAgIGludm9jYXRpb24gdGhyb3VnaCBQeV9YREVDUkVGICovCisgICAgb2xkdHlwZSA9IHRzdGF0ZS0+Y3VyZXhjX3R5cGU7CisgICAgb2xkdmFsdWUgPSB0c3RhdGUtPmN1cmV4Y192YWx1ZTsKKyAgICBvbGR0cmFjZWJhY2sgPSB0c3RhdGUtPmN1cmV4Y190cmFjZWJhY2s7CiAKLQl0c3RhdGUtPmN1cmV4Y190eXBlID0gdHlwZTsKLQl0c3RhdGUtPmN1cmV4Y192YWx1ZSA9IHZhbHVlOwotCXRzdGF0ZS0+Y3VyZXhjX3RyYWNlYmFjayA9IHRyYWNlYmFjazsKKyAgICB0c3RhdGUtPmN1cmV4Y190eXBlID0gdHlwZTsKKyAgICB0c3RhdGUtPmN1cmV4Y192YWx1ZSA9IHZhbHVlOworICAgIHRzdGF0ZS0+Y3VyZXhjX3RyYWNlYmFjayA9IHRyYWNlYmFjazsKIAotCVB5X1hERUNSRUYob2xkdHlwZSk7Ci0JUHlfWERFQ1JFRihvbGR2YWx1ZSk7Ci0JUHlfWERFQ1JFRihvbGR0cmFjZWJhY2spOworICAgIFB5X1hERUNSRUYob2xkdHlwZSk7CisgICAgUHlfWERFQ1JFRihvbGR2YWx1ZSk7CisgICAgUHlfWERFQ1JFRihvbGR0cmFjZWJhY2spOwogfQogCiB2b2lkCiBQeUVycl9TZXRPYmplY3QoUHlPYmplY3QgKmV4Y2VwdGlvbiwgUHlPYmplY3QgKnZhbHVlKQogewotCVB5X1hJTkNSRUYoZXhjZXB0aW9uKTsKLQlQeV9YSU5DUkVGKHZhbHVlKTsKLQlQeUVycl9SZXN0b3JlKGV4Y2VwdGlvbiwgdmFsdWUsIChQeU9iamVjdCAqKU5VTEwpOworICAgIFB5X1hJTkNSRUYoZXhjZXB0aW9uKTsKKyAgICBQeV9YSU5DUkVGKHZhbHVlKTsKKyAgICBQeUVycl9SZXN0b3JlKGV4Y2VwdGlvbiwgdmFsdWUsIChQeU9iamVjdCAqKU5VTEwpOwogfQogCiB2b2lkCiBQeUVycl9TZXROb25lKFB5T2JqZWN0ICpleGNlcHRpb24pCiB7Ci0JUHlFcnJfU2V0T2JqZWN0KGV4Y2VwdGlvbiwgKFB5T2JqZWN0ICopTlVMTCk7CisgICAgUHlFcnJfU2V0T2JqZWN0KGV4Y2VwdGlvbiwgKFB5T2JqZWN0ICopTlVMTCk7CiB9CiAKIHZvaWQKIFB5RXJyX1NldFN0cmluZyhQeU9iamVjdCAqZXhjZXB0aW9uLCBjb25zdCBjaGFyICpzdHJpbmcpCiB7Ci0JUHlPYmplY3QgKnZhbHVlID0gUHlTdHJpbmdfRnJvbVN0cmluZyhzdHJpbmcpOwotCVB5RXJyX1NldE9iamVjdChleGNlcHRpb24sIHZhbHVlKTsKLQlQeV9YREVDUkVGKHZhbHVlKTsKKyAgICBQeU9iamVjdCAqdmFsdWUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKHN0cmluZyk7CisgICAgUHlFcnJfU2V0T2JqZWN0KGV4Y2VwdGlvbiwgdmFsdWUpOworICAgIFB5X1hERUNSRUYodmFsdWUpOwogfQogCiAKIFB5T2JqZWN0ICoKIFB5RXJyX09jY3VycmVkKHZvaWQpCiB7Ci0JUHlUaHJlYWRTdGF0ZSAqdHN0YXRlID0gUHlUaHJlYWRTdGF0ZV9HRVQoKTsKKyAgICBQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dFVCgpOwogCi0JcmV0dXJuIHRzdGF0ZS0+Y3VyZXhjX3R5cGU7CisgICAgcmV0dXJuIHRzdGF0ZS0+Y3VyZXhjX3R5cGU7CiB9CiAKIAogaW50CiBQeUVycl9HaXZlbkV4Y2VwdGlvbk1hdGNoZXMoUHlPYmplY3QgKmVyciwgUHlPYmplY3QgKmV4YykKIHsKLQlpZiAoZXJyID09IE5VTEwgfHwgZXhjID09IE5VTEwpIHsKLQkJLyogbWF5YmUgY2F1c2VkIGJ5ICJpbXBvcnQgZXhjZXB0aW9ucyIgdGhhdCBmYWlsZWQgZWFybHkgb24gKi8KLQkJcmV0dXJuIDA7Ci0JfQotCWlmIChQeVR1cGxlX0NoZWNrKGV4YykpIHsKLQkJUHlfc3NpemVfdCBpLCBuOwotCQluID0gUHlUdXBsZV9TaXplKGV4Yyk7Ci0JCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJCS8qIFRlc3QgcmVjdXJzaXZlbHkgKi8KLQkJICAgICBpZiAoUHlFcnJfR2l2ZW5FeGNlcHRpb25NYXRjaGVzKAotCQkJICAgICBlcnIsIFB5VHVwbGVfR0VUX0lURU0oZXhjLCBpKSkpCi0JCSAgICAgewotCQkJICAgICByZXR1cm4gMTsKLQkJICAgICB9Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JfQotCS8qIGVyciBtaWdodCBiZSBhbiBpbnN0YW5jZSwgc28gY2hlY2sgaXRzIGNsYXNzLiAqLwotCWlmIChQeUV4Y2VwdGlvbkluc3RhbmNlX0NoZWNrKGVycikpCi0JCWVyciA9IFB5RXhjZXB0aW9uSW5zdGFuY2VfQ2xhc3MoZXJyKTsKKyAgICBpZiAoZXJyID09IE5VTEwgfHwgZXhjID09IE5VTEwpIHsKKyAgICAgICAgLyogbWF5YmUgY2F1c2VkIGJ5ICJpbXBvcnQgZXhjZXB0aW9ucyIgdGhhdCBmYWlsZWQgZWFybHkgb24gKi8KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChQeVR1cGxlX0NoZWNrKGV4YykpIHsKKyAgICAgICAgUHlfc3NpemVfdCBpLCBuOworICAgICAgICBuID0gUHlUdXBsZV9TaXplKGV4Yyk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICAgIC8qIFRlc3QgcmVjdXJzaXZlbHkgKi8KKyAgICAgICAgICAgICBpZiAoUHlFcnJfR2l2ZW5FeGNlcHRpb25NYXRjaGVzKAorICAgICAgICAgICAgICAgICBlcnIsIFB5VHVwbGVfR0VUX0lURU0oZXhjLCBpKSkpCisgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIC8qIGVyciBtaWdodCBiZSBhbiBpbnN0YW5jZSwgc28gY2hlY2sgaXRzIGNsYXNzLiAqLworICAgIGlmIChQeUV4Y2VwdGlvbkluc3RhbmNlX0NoZWNrKGVycikpCisgICAgICAgIGVyciA9IFB5RXhjZXB0aW9uSW5zdGFuY2VfQ2xhc3MoZXJyKTsKIAotCWlmIChQeUV4Y2VwdGlvbkNsYXNzX0NoZWNrKGVycikgJiYgUHlFeGNlcHRpb25DbGFzc19DaGVjayhleGMpKSB7Ci0JCWludCByZXMgPSAwOwotCQlQeU9iamVjdCAqZXhjZXB0aW9uLCAqdmFsdWUsICp0YjsKLQkJUHlFcnJfRmV0Y2goJmV4Y2VwdGlvbiwgJnZhbHVlLCAmdGIpOwotCQlyZXMgPSBQeU9iamVjdF9Jc1N1YmNsYXNzKGVyciwgZXhjKTsKLQkJLyogVGhpcyBmdW5jdGlvbiBtdXN0IG5vdCBmYWlsLCBzbyBwcmludCB0aGUgZXJyb3IgaGVyZSAqLwotCQlpZiAocmVzID09IC0xKSB7Ci0JCQlQeUVycl9Xcml0ZVVucmFpc2FibGUoZXJyKTsKLQkJCXJlcyA9IDA7Ci0JCX0KLQkJUHlFcnJfUmVzdG9yZShleGNlcHRpb24sIHZhbHVlLCB0Yik7Ci0JCXJldHVybiByZXM7Ci0JfQorICAgIGlmIChQeUV4Y2VwdGlvbkNsYXNzX0NoZWNrKGVycikgJiYgUHlFeGNlcHRpb25DbGFzc19DaGVjayhleGMpKSB7CisgICAgICAgIGludCByZXMgPSAwOworICAgICAgICBQeU9iamVjdCAqZXhjZXB0aW9uLCAqdmFsdWUsICp0YjsKKyAgICAgICAgUHlFcnJfRmV0Y2goJmV4Y2VwdGlvbiwgJnZhbHVlLCAmdGIpOworICAgICAgICByZXMgPSBQeU9iamVjdF9Jc1N1YmNsYXNzKGVyciwgZXhjKTsKKyAgICAgICAgLyogVGhpcyBmdW5jdGlvbiBtdXN0IG5vdCBmYWlsLCBzbyBwcmludCB0aGUgZXJyb3IgaGVyZSAqLworICAgICAgICBpZiAocmVzID09IC0xKSB7CisgICAgICAgICAgICBQeUVycl9Xcml0ZVVucmFpc2FibGUoZXJyKTsKKyAgICAgICAgICAgIHJlcyA9IDA7CisgICAgICAgIH0KKyAgICAgICAgUHlFcnJfUmVzdG9yZShleGNlcHRpb24sIHZhbHVlLCB0Yik7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQogCi0JcmV0dXJuIGVyciA9PSBleGM7CisgICAgcmV0dXJuIGVyciA9PSBleGM7CiB9CiAKIAogaW50CiBQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5T2JqZWN0ICpleGMpCiB7Ci0JcmV0dXJuIFB5RXJyX0dpdmVuRXhjZXB0aW9uTWF0Y2hlcyhQeUVycl9PY2N1cnJlZCgpLCBleGMpOworICAgIHJldHVybiBQeUVycl9HaXZlbkV4Y2VwdGlvbk1hdGNoZXMoUHlFcnJfT2NjdXJyZWQoKSwgZXhjKTsKIH0KIAogCkBAIC0xMzYsMTIzICsxMzYsMTIzIEBACiB2b2lkCiBQeUVycl9Ob3JtYWxpemVFeGNlcHRpb24oUHlPYmplY3QgKipleGMsIFB5T2JqZWN0ICoqdmFsLCBQeU9iamVjdCAqKnRiKQogewotCVB5T2JqZWN0ICp0eXBlID0gKmV4YzsKLQlQeU9iamVjdCAqdmFsdWUgPSAqdmFsOwotCVB5T2JqZWN0ICppbmNsYXNzID0gTlVMTDsKLQlQeU9iamVjdCAqaW5pdGlhbF90YiA9IE5VTEw7Ci0JUHlUaHJlYWRTdGF0ZSAqdHN0YXRlID0gTlVMTDsKKyAgICBQeU9iamVjdCAqdHlwZSA9ICpleGM7CisgICAgUHlPYmplY3QgKnZhbHVlID0gKnZhbDsKKyAgICBQeU9iamVjdCAqaW5jbGFzcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKmluaXRpYWxfdGIgPSBOVUxMOworICAgIFB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IE5VTEw7CiAKLQlpZiAodHlwZSA9PSBOVUxMKSB7Ci0JCS8qIFRoZXJlIHdhcyBubyBleGNlcHRpb24sIHNvIG5vdGhpbmcgdG8gZG8uICovCi0JCXJldHVybjsKLQl9CisgICAgaWYgKHR5cGUgPT0gTlVMTCkgeworICAgICAgICAvKiBUaGVyZSB3YXMgbm8gZXhjZXB0aW9uLCBzbyBub3RoaW5nIHRvIGRvLiAqLworICAgICAgICByZXR1cm47CisgICAgfQogCi0JLyogSWYgUHlFcnJfU2V0Tm9uZSgpIHdhcyB1c2VkLCB0aGUgdmFsdWUgd2lsbCBoYXZlIGJlZW4gYWN0dWFsbHkKLQkgICBzZXQgdG8gTlVMTC4KLQkqLwotCWlmICghdmFsdWUpIHsKLQkJdmFsdWUgPSBQeV9Ob25lOwotCQlQeV9JTkNSRUYodmFsdWUpOwotCX0KKyAgICAvKiBJZiBQeUVycl9TZXROb25lKCkgd2FzIHVzZWQsIHRoZSB2YWx1ZSB3aWxsIGhhdmUgYmVlbiBhY3R1YWxseQorICAgICAgIHNldCB0byBOVUxMLgorICAgICovCisgICAgaWYgKCF2YWx1ZSkgeworICAgICAgICB2YWx1ZSA9IFB5X05vbmU7CisgICAgICAgIFB5X0lOQ1JFRih2YWx1ZSk7CisgICAgfQogCi0JaWYgKFB5RXhjZXB0aW9uSW5zdGFuY2VfQ2hlY2sodmFsdWUpKQotCQlpbmNsYXNzID0gUHlFeGNlcHRpb25JbnN0YW5jZV9DbGFzcyh2YWx1ZSk7CisgICAgaWYgKFB5RXhjZXB0aW9uSW5zdGFuY2VfQ2hlY2sodmFsdWUpKQorICAgICAgICBpbmNsYXNzID0gUHlFeGNlcHRpb25JbnN0YW5jZV9DbGFzcyh2YWx1ZSk7CiAKLQkvKiBOb3JtYWxpemUgdGhlIGV4Y2VwdGlvbiBzbyB0aGF0IGlmIHRoZSB0eXBlIGlzIGEgY2xhc3MsIHRoZQotCSAgIHZhbHVlIHdpbGwgYmUgYW4gaW5zdGFuY2UuCi0JKi8KLQlpZiAoUHlFeGNlcHRpb25DbGFzc19DaGVjayh0eXBlKSkgewotCQkvKiBpZiB0aGUgdmFsdWUgd2FzIG5vdCBhbiBpbnN0YW5jZSwgb3IgaXMgbm90IGFuIGluc3RhbmNlCi0JCSAgIHdob3NlIGNsYXNzIGlzIChvciBpcyBkZXJpdmVkIGZyb20pIHR5cGUsIHRoZW4gdXNlIHRoZQotCQkgICB2YWx1ZSBhcyBhbiBhcmd1bWVudCB0byBpbnN0YW50aWF0aW9uIG9mIHRoZSB0eXBlCi0JCSAgIGNsYXNzLgotCQkqLwotCQlpZiAoIWluY2xhc3MgfHwgIVB5T2JqZWN0X0lzU3ViY2xhc3MoaW5jbGFzcywgdHlwZSkpIHsKLQkJCVB5T2JqZWN0ICphcmdzLCAqcmVzOworICAgIC8qIE5vcm1hbGl6ZSB0aGUgZXhjZXB0aW9uIHNvIHRoYXQgaWYgdGhlIHR5cGUgaXMgYSBjbGFzcywgdGhlCisgICAgICAgdmFsdWUgd2lsbCBiZSBhbiBpbnN0YW5jZS4KKyAgICAqLworICAgIGlmIChQeUV4Y2VwdGlvbkNsYXNzX0NoZWNrKHR5cGUpKSB7CisgICAgICAgIC8qIGlmIHRoZSB2YWx1ZSB3YXMgbm90IGFuIGluc3RhbmNlLCBvciBpcyBub3QgYW4gaW5zdGFuY2UKKyAgICAgICAgICAgd2hvc2UgY2xhc3MgaXMgKG9yIGlzIGRlcml2ZWQgZnJvbSkgdHlwZSwgdGhlbiB1c2UgdGhlCisgICAgICAgICAgIHZhbHVlIGFzIGFuIGFyZ3VtZW50IHRvIGluc3RhbnRpYXRpb24gb2YgdGhlIHR5cGUKKyAgICAgICAgICAgY2xhc3MuCisgICAgICAgICovCisgICAgICAgIGlmICghaW5jbGFzcyB8fCAhUHlPYmplY3RfSXNTdWJjbGFzcyhpbmNsYXNzLCB0eXBlKSkgeworICAgICAgICAgICAgUHlPYmplY3QgKmFyZ3MsICpyZXM7CiAKLQkJCWlmICh2YWx1ZSA9PSBQeV9Ob25lKQotCQkJCWFyZ3MgPSBQeVR1cGxlX05ldygwKTsKLQkJCWVsc2UgaWYgKFB5VHVwbGVfQ2hlY2sodmFsdWUpKSB7Ci0JCQkJUHlfSU5DUkVGKHZhbHVlKTsKLQkJCQlhcmdzID0gdmFsdWU7Ci0JCQl9Ci0JCQllbHNlCi0JCQkJYXJncyA9IFB5VHVwbGVfUGFjaygxLCB2YWx1ZSk7CisgICAgICAgICAgICBpZiAodmFsdWUgPT0gUHlfTm9uZSkKKyAgICAgICAgICAgICAgICBhcmdzID0gUHlUdXBsZV9OZXcoMCk7CisgICAgICAgICAgICBlbHNlIGlmIChQeVR1cGxlX0NoZWNrKHZhbHVlKSkgeworICAgICAgICAgICAgICAgIFB5X0lOQ1JFRih2YWx1ZSk7CisgICAgICAgICAgICAgICAgYXJncyA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGFyZ3MgPSBQeVR1cGxlX1BhY2soMSwgdmFsdWUpOwogCi0JCQlpZiAoYXJncyA9PSBOVUxMKQotCQkJCWdvdG8gZmluYWxseTsKLQkJCXJlcyA9IFB5RXZhbF9DYWxsT2JqZWN0KHR5cGUsIGFyZ3MpOwotCQkJUHlfREVDUkVGKGFyZ3MpOwotCQkJaWYgKHJlcyA9PSBOVUxMKQotCQkJCWdvdG8gZmluYWxseTsKLQkJCVB5X0RFQ1JFRih2YWx1ZSk7Ci0JCQl2YWx1ZSA9IHJlczsKLQkJfQotCQkvKiBpZiB0aGUgY2xhc3Mgb2YgdGhlIGluc3RhbmNlIGRvZXNuJ3QgZXhhY3RseSBtYXRjaCB0aGUKLQkJICAgY2xhc3Mgb2YgdGhlIHR5cGUsIGJlbGlldmUgdGhlIGluc3RhbmNlCi0JCSovCi0JCWVsc2UgaWYgKGluY2xhc3MgIT0gdHlwZSkgewotIAkJCVB5X0RFQ1JFRih0eXBlKTsKLQkJCXR5cGUgPSBpbmNsYXNzOwotCQkJUHlfSU5DUkVGKHR5cGUpOwotCQl9Ci0JfQotCSpleGMgPSB0eXBlOwotCSp2YWwgPSB2YWx1ZTsKLQlyZXR1cm47CisgICAgICAgICAgICBpZiAoYXJncyA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICAgICAgICAgIHJlcyA9IFB5RXZhbF9DYWxsT2JqZWN0KHR5cGUsIGFyZ3MpOworICAgICAgICAgICAgUHlfREVDUkVGKGFyZ3MpOworICAgICAgICAgICAgaWYgKHJlcyA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih2YWx1ZSk7CisgICAgICAgICAgICB2YWx1ZSA9IHJlczsKKyAgICAgICAgfQorICAgICAgICAvKiBpZiB0aGUgY2xhc3Mgb2YgdGhlIGluc3RhbmNlIGRvZXNuJ3QgZXhhY3RseSBtYXRjaCB0aGUKKyAgICAgICAgICAgY2xhc3Mgb2YgdGhlIHR5cGUsIGJlbGlldmUgdGhlIGluc3RhbmNlCisgICAgICAgICovCisgICAgICAgIGVsc2UgaWYgKGluY2xhc3MgIT0gdHlwZSkgeworICAgICAgICAgICAgUHlfREVDUkVGKHR5cGUpOworICAgICAgICAgICAgdHlwZSA9IGluY2xhc3M7CisgICAgICAgICAgICBQeV9JTkNSRUYodHlwZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgKmV4YyA9IHR5cGU7CisgICAgKnZhbCA9IHZhbHVlOworICAgIHJldHVybjsKIGZpbmFsbHk6Ci0JUHlfREVDUkVGKHR5cGUpOwotCVB5X0RFQ1JFRih2YWx1ZSk7Ci0JLyogSWYgdGhlIG5ldyBleGNlcHRpb24gZG9lc24ndCBzZXQgYSB0cmFjZWJhY2sgYW5kIHRoZSBvbGQKLQkgICBleGNlcHRpb24gaGFkIGEgdHJhY2ViYWNrLCB1c2UgdGhlIG9sZCB0cmFjZWJhY2sgZm9yIHRoZQotCSAgIG5ldyBleGNlcHRpb24uICBJdCdzIGJldHRlciB0aGFuIG5vdGhpbmcuCi0JKi8KLQlpbml0aWFsX3RiID0gKnRiOwotCVB5RXJyX0ZldGNoKGV4YywgdmFsLCB0Yik7Ci0JaWYgKGluaXRpYWxfdGIgIT0gTlVMTCkgewotCQlpZiAoKnRiID09IE5VTEwpCi0JCQkqdGIgPSBpbml0aWFsX3RiOwotCQllbHNlCi0JCQlQeV9ERUNSRUYoaW5pdGlhbF90Yik7Ci0JfQotCS8qIG5vcm1hbGl6ZSByZWN1cnNpdmVseSAqLwotCXRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfR0VUKCk7Ci0JaWYgKCsrdHN0YXRlLT5yZWN1cnNpb25fZGVwdGggPiBQeV9HZXRSZWN1cnNpb25MaW1pdCgpKSB7Ci0JICAgIC0tdHN0YXRlLT5yZWN1cnNpb25fZGVwdGg7Ci0JICAgIC8qIHRocm93IGF3YXkgdGhlIG9sZCBleGNlcHRpb24uLi4gKi8KLQkgICAgUHlfREVDUkVGKCpleGMpOwotCSAgICBQeV9ERUNSRUYoKnZhbCk7Ci0JICAgIC8qIC4uLiBhbmQgdXNlIHRoZSByZWN1cnNpb24gZXJyb3IgaW5zdGVhZCAqLwotCSAgICAqZXhjID0gUHlFeGNfUnVudGltZUVycm9yOwotCSAgICAqdmFsID0gUHlFeGNfUmVjdXJzaW9uRXJyb3JJbnN0OwotCSAgICBQeV9JTkNSRUYoKmV4Yyk7Ci0JICAgIFB5X0lOQ1JFRigqdmFsKTsKLQkgICAgLyoganVzdCBrZWVwaW5nIHRoZSBvbGQgdHJhY2ViYWNrICovCi0JICAgIHJldHVybjsKLQl9Ci0JUHlFcnJfTm9ybWFsaXplRXhjZXB0aW9uKGV4YywgdmFsLCB0Yik7Ci0JLS10c3RhdGUtPnJlY3Vyc2lvbl9kZXB0aDsKKyAgICBQeV9ERUNSRUYodHlwZSk7CisgICAgUHlfREVDUkVGKHZhbHVlKTsKKyAgICAvKiBJZiB0aGUgbmV3IGV4Y2VwdGlvbiBkb2Vzbid0IHNldCBhIHRyYWNlYmFjayBhbmQgdGhlIG9sZAorICAgICAgIGV4Y2VwdGlvbiBoYWQgYSB0cmFjZWJhY2ssIHVzZSB0aGUgb2xkIHRyYWNlYmFjayBmb3IgdGhlCisgICAgICAgbmV3IGV4Y2VwdGlvbi4gIEl0J3MgYmV0dGVyIHRoYW4gbm90aGluZy4KKyAgICAqLworICAgIGluaXRpYWxfdGIgPSAqdGI7CisgICAgUHlFcnJfRmV0Y2goZXhjLCB2YWwsIHRiKTsKKyAgICBpZiAoaW5pdGlhbF90YiAhPSBOVUxMKSB7CisgICAgICAgIGlmICgqdGIgPT0gTlVMTCkKKyAgICAgICAgICAgICp0YiA9IGluaXRpYWxfdGI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIFB5X0RFQ1JFRihpbml0aWFsX3RiKTsKKyAgICB9CisgICAgLyogbm9ybWFsaXplIHJlY3Vyc2l2ZWx5ICovCisgICAgdHN0YXRlID0gUHlUaHJlYWRTdGF0ZV9HRVQoKTsKKyAgICBpZiAoKyt0c3RhdGUtPnJlY3Vyc2lvbl9kZXB0aCA+IFB5X0dldFJlY3Vyc2lvbkxpbWl0KCkpIHsKKyAgICAgICAgLS10c3RhdGUtPnJlY3Vyc2lvbl9kZXB0aDsKKyAgICAgICAgLyogdGhyb3cgYXdheSB0aGUgb2xkIGV4Y2VwdGlvbi4uLiAqLworICAgICAgICBQeV9ERUNSRUYoKmV4Yyk7CisgICAgICAgIFB5X0RFQ1JFRigqdmFsKTsKKyAgICAgICAgLyogLi4uIGFuZCB1c2UgdGhlIHJlY3Vyc2lvbiBlcnJvciBpbnN0ZWFkICovCisgICAgICAgICpleGMgPSBQeUV4Y19SdW50aW1lRXJyb3I7CisgICAgICAgICp2YWwgPSBQeUV4Y19SZWN1cnNpb25FcnJvckluc3Q7CisgICAgICAgIFB5X0lOQ1JFRigqZXhjKTsKKyAgICAgICAgUHlfSU5DUkVGKCp2YWwpOworICAgICAgICAvKiBqdXN0IGtlZXBpbmcgdGhlIG9sZCB0cmFjZWJhY2sgKi8KKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBQeUVycl9Ob3JtYWxpemVFeGNlcHRpb24oZXhjLCB2YWwsIHRiKTsKKyAgICAtLXRzdGF0ZS0+cmVjdXJzaW9uX2RlcHRoOwogfQogCiAKIHZvaWQKIFB5RXJyX0ZldGNoKFB5T2JqZWN0ICoqcF90eXBlLCBQeU9iamVjdCAqKnBfdmFsdWUsIFB5T2JqZWN0ICoqcF90cmFjZWJhY2spCiB7Ci0JUHlUaHJlYWRTdGF0ZSAqdHN0YXRlID0gUHlUaHJlYWRTdGF0ZV9HRVQoKTsKKyAgICBQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dFVCgpOwogCi0JKnBfdHlwZSA9IHRzdGF0ZS0+Y3VyZXhjX3R5cGU7Ci0JKnBfdmFsdWUgPSB0c3RhdGUtPmN1cmV4Y192YWx1ZTsKLQkqcF90cmFjZWJhY2sgPSB0c3RhdGUtPmN1cmV4Y190cmFjZWJhY2s7CisgICAgKnBfdHlwZSA9IHRzdGF0ZS0+Y3VyZXhjX3R5cGU7CisgICAgKnBfdmFsdWUgPSB0c3RhdGUtPmN1cmV4Y192YWx1ZTsKKyAgICAqcF90cmFjZWJhY2sgPSB0c3RhdGUtPmN1cmV4Y190cmFjZWJhY2s7CiAKLQl0c3RhdGUtPmN1cmV4Y190eXBlID0gTlVMTDsKLQl0c3RhdGUtPmN1cmV4Y192YWx1ZSA9IE5VTEw7Ci0JdHN0YXRlLT5jdXJleGNfdHJhY2ViYWNrID0gTlVMTDsKKyAgICB0c3RhdGUtPmN1cmV4Y190eXBlID0gTlVMTDsKKyAgICB0c3RhdGUtPmN1cmV4Y192YWx1ZSA9IE5VTEw7CisgICAgdHN0YXRlLT5jdXJleGNfdHJhY2ViYWNrID0gTlVMTDsKIH0KIAogdm9pZAogUHlFcnJfQ2xlYXIodm9pZCkKIHsKLQlQeUVycl9SZXN0b3JlKE5VTEwsIE5VTEwsIE5VTEwpOworICAgIFB5RXJyX1Jlc3RvcmUoTlVMTCwgTlVMTCwgTlVMTCk7CiB9CiAKIC8qIENvbnZlbmllbmNlIGZ1bmN0aW9ucyB0byBzZXQgYSB0eXBlIGVycm9yIGV4Y2VwdGlvbiBhbmQgcmV0dXJuIDAgKi8KQEAgLTI2MCwyNTIgKzI2MCwyNTIgQEAKIGludAogUHlFcnJfQmFkQXJndW1lbnQodm9pZCkKIHsKLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJImJhZCBhcmd1bWVudCB0eXBlIGZvciBidWlsdC1pbiBvcGVyYXRpb24iKTsKLQlyZXR1cm4gMDsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAiYmFkIGFyZ3VtZW50IHR5cGUgZm9yIGJ1aWx0LWluIG9wZXJhdGlvbiIpOworICAgIHJldHVybiAwOwogfQogCiBQeU9iamVjdCAqCiBQeUVycl9Ob01lbW9yeSh2b2lkKQogewotCWlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX01lbW9yeUVycm9yKSkKLQkJLyogYWxyZWFkeSBjdXJyZW50ICovCi0JCXJldHVybiBOVUxMOworICAgIGlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX01lbW9yeUVycm9yKSkKKyAgICAgICAgLyogYWxyZWFkeSBjdXJyZW50ICovCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JLyogcmFpc2UgdGhlIHByZS1hbGxvY2F0ZWQgaW5zdGFuY2UgaWYgaXQgc3RpbGwgZXhpc3RzICovCi0JaWYgKFB5RXhjX01lbW9yeUVycm9ySW5zdCkKLQkJUHlFcnJfU2V0T2JqZWN0KFB5RXhjX01lbW9yeUVycm9yLCBQeUV4Y19NZW1vcnlFcnJvckluc3QpOwotCWVsc2UKLQkJLyogdGhpcyB3aWxsIHByb2JhYmx5IGZhaWwgc2luY2UgdGhlcmUncyBubyBtZW1vcnkgYW5kIGhlZSwKLQkJICAgaGVlLCB3ZSBoYXZlIHRvIGluc3RhbnRpYXRlIHRoaXMgY2xhc3MKLQkJKi8KLQkJUHlFcnJfU2V0Tm9uZShQeUV4Y19NZW1vcnlFcnJvcik7CisgICAgLyogcmFpc2UgdGhlIHByZS1hbGxvY2F0ZWQgaW5zdGFuY2UgaWYgaXQgc3RpbGwgZXhpc3RzICovCisgICAgaWYgKFB5RXhjX01lbW9yeUVycm9ySW5zdCkKKyAgICAgICAgUHlFcnJfU2V0T2JqZWN0KFB5RXhjX01lbW9yeUVycm9yLCBQeUV4Y19NZW1vcnlFcnJvckluc3QpOworICAgIGVsc2UKKyAgICAgICAgLyogdGhpcyB3aWxsIHByb2JhYmx5IGZhaWwgc2luY2UgdGhlcmUncyBubyBtZW1vcnkgYW5kIGhlZSwKKyAgICAgICAgICAgaGVlLCB3ZSBoYXZlIHRvIGluc3RhbnRpYXRlIHRoaXMgY2xhc3MKKyAgICAgICAgKi8KKyAgICAgICAgUHlFcnJfU2V0Tm9uZShQeUV4Y19NZW1vcnlFcnJvcik7CiAKLQlyZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogUHlPYmplY3QgKgogUHlFcnJfU2V0RnJvbUVycm5vV2l0aEZpbGVuYW1lT2JqZWN0KFB5T2JqZWN0ICpleGMsIFB5T2JqZWN0ICpmaWxlbmFtZU9iamVjdCkKIHsKLQlQeU9iamVjdCAqdjsKLQljaGFyICpzOwotCWludCBpID0gZXJybm87CisgICAgUHlPYmplY3QgKnY7CisgICAgY2hhciAqczsKKyAgICBpbnQgaSA9IGVycm5vOwogI2lmZGVmIFBMQU45Ci0JY2hhciBlcnJidWZbRVJSTUFYXTsKKyAgICBjaGFyIGVycmJ1ZltFUlJNQVhdOwogI2VuZGlmCiAjaWZkZWYgTVNfV0lORE9XUwotCWNoYXIgKnNfYnVmID0gTlVMTDsKLQljaGFyIHNfc21hbGxfYnVmWzI4XTsgLyogUm9vbSBmb3IgIldpbmRvd3MgRXJyb3IgMHhGRkZGRkZGRiIgKi8KKyAgICBjaGFyICpzX2J1ZiA9IE5VTEw7CisgICAgY2hhciBzX3NtYWxsX2J1ZlsyOF07IC8qIFJvb20gZm9yICJXaW5kb3dzIEVycm9yIDB4RkZGRkZGRkYiICovCiAjZW5kaWYKICNpZmRlZiBFSU5UUgotCWlmIChpID09IEVJTlRSICYmIFB5RXJyX0NoZWNrU2lnbmFscygpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoaSA9PSBFSU5UUiAmJiBQeUVycl9DaGVja1NpZ25hbHMoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAjZW5kaWYKICNpZmRlZiBQTEFOOQotCXJlcnJzdHIoZXJyYnVmLCBzaXplb2YgZXJyYnVmKTsKLQlzID0gZXJyYnVmOworICAgIHJlcnJzdHIoZXJyYnVmLCBzaXplb2YgZXJyYnVmKTsKKyAgICBzID0gZXJyYnVmOwogI2Vsc2UKLQlpZiAoaSA9PSAwKQotCQlzID0gIkVycm9yIjsgLyogU29tZXRpbWVzIGVycm5vIGRpZG4ndCBnZXQgc2V0ICovCi0JZWxzZQorICAgIGlmIChpID09IDApCisgICAgICAgIHMgPSAiRXJyb3IiOyAvKiBTb21ldGltZXMgZXJybm8gZGlkbid0IGdldCBzZXQgKi8KKyAgICBlbHNlCiAjaWZuZGVmIE1TX1dJTkRPV1MKLQkJcyA9IHN0cmVycm9yKGkpOworICAgICAgICBzID0gc3RyZXJyb3IoaSk7CiAjZWxzZQotCXsKLQkJLyogTm90ZSB0aGF0IHRoZSBXaW4zMiBlcnJvcnMgZG8gbm90IGxpbmV1cCB3aXRoIHRoZQotCQkgICBlcnJubyBlcnJvci4gIFNvIGlmIHRoZSBlcnJvciBpcyBpbiB0aGUgTVNWQyBlcnJvcgotCQkgICB0YWJsZSwgd2UgdXNlIGl0LCBvdGhlcndpc2Ugd2UgYXNzdW1lIGl0IHJlYWxseSBfaXNfCi0JCSAgIGEgV2luMzIgZXJyb3IgY29kZQotCQkqLwotCQlpZiAoaSA+IDAgJiYgaSA8IF9zeXNfbmVycikgewotCQkJcyA9IF9zeXNfZXJybGlzdFtpXTsKLQkJfQotCQllbHNlIHsKLQkJCWludCBsZW4gPSBGb3JtYXRNZXNzYWdlKAotCQkJCUZPUk1BVF9NRVNTQUdFX0FMTE9DQVRFX0JVRkZFUiB8Ci0JCQkJRk9STUFUX01FU1NBR0VfRlJPTV9TWVNURU0gfAotCQkJCUZPUk1BVF9NRVNTQUdFX0lHTk9SRV9JTlNFUlRTLAotCQkJCU5VTEwsCS8qIG5vIG1lc3NhZ2Ugc291cmNlICovCi0JCQkJaSwKLQkJCQlNQUtFTEFOR0lEKExBTkdfTkVVVFJBTCwKLQkJCQkJICAgU1VCTEFOR19ERUZBVUxUKSwKLQkJCQkgICAgICAgICAgIC8qIERlZmF1bHQgbGFuZ3VhZ2UgKi8KLQkJCQkoTFBUU1RSKSAmc19idWYsCi0JCQkJMCwJLyogc2l6ZSBub3QgdXNlZCAqLwotCQkJCU5VTEwpOwkvKiBubyBhcmdzICovCi0JCQlpZiAobGVuPT0wKSB7Ci0JCQkJLyogT25seSBldmVyIHNlZW4gdGhpcyBpbiBvdXQtb2YtbWVtCi0JCQkJICAgc2l0dWF0aW9ucyAqLwotCQkJCXNwcmludGYoc19zbWFsbF9idWYsICJXaW5kb3dzIEVycm9yIDB4JVgiLCBpKTsKLQkJCQlzID0gc19zbWFsbF9idWY7Ci0JCQkJc19idWYgPSBOVUxMOwotCQkJfSBlbHNlIHsKLQkJCQlzID0gc19idWY7Ci0JCQkJLyogcmVtb3ZlIHRyYWlsaW5nIGNyL2xmIGFuZCBkb3RzICovCi0JCQkJd2hpbGUgKGxlbiA+IDAgJiYgKHNbbGVuLTFdIDw9ICcgJyB8fCBzW2xlbi0xXSA9PSAnLicpKQotCQkJCQlzWy0tbGVuXSA9ICdcMCc7Ci0JCQl9Ci0JCX0KLQl9CisgICAgeworICAgICAgICAvKiBOb3RlIHRoYXQgdGhlIFdpbjMyIGVycm9ycyBkbyBub3QgbGluZXVwIHdpdGggdGhlCisgICAgICAgICAgIGVycm5vIGVycm9yLiAgU28gaWYgdGhlIGVycm9yIGlzIGluIHRoZSBNU1ZDIGVycm9yCisgICAgICAgICAgIHRhYmxlLCB3ZSB1c2UgaXQsIG90aGVyd2lzZSB3ZSBhc3N1bWUgaXQgcmVhbGx5IF9pc18KKyAgICAgICAgICAgYSBXaW4zMiBlcnJvciBjb2RlCisgICAgICAgICovCisgICAgICAgIGlmIChpID4gMCAmJiBpIDwgX3N5c19uZXJyKSB7CisgICAgICAgICAgICBzID0gX3N5c19lcnJsaXN0W2ldOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaW50IGxlbiA9IEZvcm1hdE1lc3NhZ2UoCisgICAgICAgICAgICAgICAgRk9STUFUX01FU1NBR0VfQUxMT0NBVEVfQlVGRkVSIHwKKyAgICAgICAgICAgICAgICBGT1JNQVRfTUVTU0FHRV9GUk9NX1NZU1RFTSB8CisgICAgICAgICAgICAgICAgRk9STUFUX01FU1NBR0VfSUdOT1JFX0lOU0VSVFMsCisgICAgICAgICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgLyogbm8gbWVzc2FnZSBzb3VyY2UgKi8KKyAgICAgICAgICAgICAgICBpLAorICAgICAgICAgICAgICAgIE1BS0VMQU5HSUQoTEFOR19ORVVUUkFMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU1VCTEFOR19ERUZBVUxUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlZmF1bHQgbGFuZ3VhZ2UgKi8KKyAgICAgICAgICAgICAgICAoTFBUU1RSKSAmc19idWYsCisgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSBub3QgdXNlZCAqLworICAgICAgICAgICAgICAgIE5VTEwpOyAgICAgICAgICAgICAgICAgIC8qIG5vIGFyZ3MgKi8KKyAgICAgICAgICAgIGlmIChsZW49PTApIHsKKyAgICAgICAgICAgICAgICAvKiBPbmx5IGV2ZXIgc2VlbiB0aGlzIGluIG91dC1vZi1tZW0KKyAgICAgICAgICAgICAgICAgICBzaXR1YXRpb25zICovCisgICAgICAgICAgICAgICAgc3ByaW50ZihzX3NtYWxsX2J1ZiwgIldpbmRvd3MgRXJyb3IgMHglWCIsIGkpOworICAgICAgICAgICAgICAgIHMgPSBzX3NtYWxsX2J1ZjsKKyAgICAgICAgICAgICAgICBzX2J1ZiA9IE5VTEw7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHMgPSBzX2J1ZjsKKyAgICAgICAgICAgICAgICAvKiByZW1vdmUgdHJhaWxpbmcgY3IvbGYgYW5kIGRvdHMgKi8KKyAgICAgICAgICAgICAgICB3aGlsZSAobGVuID4gMCAmJiAoc1tsZW4tMV0gPD0gJyAnIHx8IHNbbGVuLTFdID09ICcuJykpCisgICAgICAgICAgICAgICAgICAgIHNbLS1sZW5dID0gJ1wwJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KICNlbmRpZiAvKiBVbml4L1dpbmRvd3MgKi8KICNlbmRpZiAvKiBQTEFOIDkqLwotCWlmIChmaWxlbmFtZU9iamVjdCAhPSBOVUxMKQotCQl2ID0gUHlfQnVpbGRWYWx1ZSgiKGlzTykiLCBpLCBzLCBmaWxlbmFtZU9iamVjdCk7Ci0JZWxzZQotCQl2ID0gUHlfQnVpbGRWYWx1ZSgiKGlzKSIsIGksIHMpOwotCWlmICh2ICE9IE5VTEwpIHsKLQkJUHlFcnJfU2V0T2JqZWN0KGV4Yywgdik7Ci0JCVB5X0RFQ1JFRih2KTsKLQl9CisgICAgaWYgKGZpbGVuYW1lT2JqZWN0ICE9IE5VTEwpCisgICAgICAgIHYgPSBQeV9CdWlsZFZhbHVlKCIoaXNPKSIsIGksIHMsIGZpbGVuYW1lT2JqZWN0KTsKKyAgICBlbHNlCisgICAgICAgIHYgPSBQeV9CdWlsZFZhbHVlKCIoaXMpIiwgaSwgcyk7CisgICAgaWYgKHYgIT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRPYmplY3QoZXhjLCB2KTsKKyAgICAgICAgUHlfREVDUkVGKHYpOworICAgIH0KICNpZmRlZiBNU19XSU5ET1dTCi0JTG9jYWxGcmVlKHNfYnVmKTsKKyAgICBMb2NhbEZyZWUoc19idWYpOwogI2VuZGlmCi0JcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIAogUHlPYmplY3QgKgogUHlFcnJfU2V0RnJvbUVycm5vV2l0aEZpbGVuYW1lKFB5T2JqZWN0ICpleGMsIGNoYXIgKmZpbGVuYW1lKQogewotCVB5T2JqZWN0ICpuYW1lID0gZmlsZW5hbWUgPyBQeVN0cmluZ19Gcm9tU3RyaW5nKGZpbGVuYW1lKSA6IE5VTEw7Ci0JUHlPYmplY3QgKnJlc3VsdCA9IFB5RXJyX1NldEZyb21FcnJub1dpdGhGaWxlbmFtZU9iamVjdChleGMsIG5hbWUpOwotCVB5X1hERUNSRUYobmFtZSk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBQeU9iamVjdCAqbmFtZSA9IGZpbGVuYW1lID8gUHlTdHJpbmdfRnJvbVN0cmluZyhmaWxlbmFtZSkgOiBOVUxMOworICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBQeUVycl9TZXRGcm9tRXJybm9XaXRoRmlsZW5hbWVPYmplY3QoZXhjLCBuYW1lKTsKKyAgICBQeV9YREVDUkVGKG5hbWUpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKICNpZmRlZiBQeV9XSU5fV0lERV9GSUxFTkFNRVMKIFB5T2JqZWN0ICoKIFB5RXJyX1NldEZyb21FcnJub1dpdGhVbmljb2RlRmlsZW5hbWUoUHlPYmplY3QgKmV4YywgUHlfVU5JQ09ERSAqZmlsZW5hbWUpCiB7Ci0JUHlPYmplY3QgKm5hbWUgPSBmaWxlbmFtZSA/Ci0JICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfRnJvbVVuaWNvZGUoZmlsZW5hbWUsIHdjc2xlbihmaWxlbmFtZSkpIDoKLQkgICAgICAgICAgICAgICAgIE5VTEw7Ci0JUHlPYmplY3QgKnJlc3VsdCA9IFB5RXJyX1NldEZyb21FcnJub1dpdGhGaWxlbmFtZU9iamVjdChleGMsIG5hbWUpOwotCVB5X1hERUNSRUYobmFtZSk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBQeU9iamVjdCAqbmFtZSA9IGZpbGVuYW1lID8KKyAgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9Gcm9tVW5pY29kZShmaWxlbmFtZSwgd2NzbGVuKGZpbGVuYW1lKSkgOgorICAgICAgICAgICAgIE5VTEw7CisgICAgUHlPYmplY3QgKnJlc3VsdCA9IFB5RXJyX1NldEZyb21FcnJub1dpdGhGaWxlbmFtZU9iamVjdChleGMsIG5hbWUpOworICAgIFB5X1hERUNSRUYobmFtZSk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KICNlbmRpZiAvKiBQeV9XSU5fV0lERV9GSUxFTkFNRVMgKi8KIAogUHlPYmplY3QgKgogUHlFcnJfU2V0RnJvbUVycm5vKFB5T2JqZWN0ICpleGMpCiB7Ci0JcmV0dXJuIFB5RXJyX1NldEZyb21FcnJub1dpdGhGaWxlbmFtZU9iamVjdChleGMsIE5VTEwpOworICAgIHJldHVybiBQeUVycl9TZXRGcm9tRXJybm9XaXRoRmlsZW5hbWVPYmplY3QoZXhjLCBOVUxMKTsKIH0KIAogI2lmZGVmIE1TX1dJTkRPV1MKIC8qIFdpbmRvd3Mgc3BlY2lmaWMgZXJyb3IgY29kZSBoYW5kbGluZyAqLwogUHlPYmplY3QgKlB5RXJyX1NldEV4Y0Zyb21XaW5kb3dzRXJyV2l0aEZpbGVuYW1lT2JqZWN0KAotCVB5T2JqZWN0ICpleGMsCi0JaW50IGllcnIsCi0JUHlPYmplY3QgKmZpbGVuYW1lT2JqZWN0KQorICAgIFB5T2JqZWN0ICpleGMsCisgICAgaW50IGllcnIsCisgICAgUHlPYmplY3QgKmZpbGVuYW1lT2JqZWN0KQogewotCWludCBsZW47Ci0JY2hhciAqczsKLQljaGFyICpzX2J1ZiA9IE5VTEw7IC8qIEZyZWUgdmlhIExvY2FsRnJlZSAqLwotCWNoYXIgc19zbWFsbF9idWZbMjhdOyAvKiBSb29tIGZvciAiV2luZG93cyBFcnJvciAweEZGRkZGRkZGIiAqLwotCVB5T2JqZWN0ICp2OwotCURXT1JEIGVyciA9IChEV09SRClpZXJyOwotCWlmIChlcnI9PTApIGVyciA9IEdldExhc3RFcnJvcigpOwotCWxlbiA9IEZvcm1hdE1lc3NhZ2UoCi0JCS8qIEVycm9yIEFQSSBlcnJvciAqLwotCQlGT1JNQVRfTUVTU0FHRV9BTExPQ0FURV9CVUZGRVIgfAotCQlGT1JNQVRfTUVTU0FHRV9GUk9NX1NZU1RFTSB8Ci0JCUZPUk1BVF9NRVNTQUdFX0lHTk9SRV9JTlNFUlRTLAotCQlOVUxMLAkvKiBubyBtZXNzYWdlIHNvdXJjZSAqLwotCQllcnIsCi0JCU1BS0VMQU5HSUQoTEFOR19ORVVUUkFMLAotCQlTVUJMQU5HX0RFRkFVTFQpLCAvKiBEZWZhdWx0IGxhbmd1YWdlICovCi0JCShMUFRTVFIpICZzX2J1ZiwKLQkJMCwJLyogc2l6ZSBub3QgdXNlZCAqLwotCQlOVUxMKTsJLyogbm8gYXJncyAqLwotCWlmIChsZW49PTApIHsKLQkJLyogT25seSBzZWVuIHRoaXMgaW4gb3V0IG9mIG1lbSBzaXR1YXRpb25zICovCi0JCXNwcmludGYoc19zbWFsbF9idWYsICJXaW5kb3dzIEVycm9yIDB4JVgiLCBlcnIpOwotCQlzID0gc19zbWFsbF9idWY7Ci0JCXNfYnVmID0gTlVMTDsKLQl9IGVsc2UgewotCQlzID0gc19idWY7Ci0JCS8qIHJlbW92ZSB0cmFpbGluZyBjci9sZiBhbmQgZG90cyAqLwotCQl3aGlsZSAobGVuID4gMCAmJiAoc1tsZW4tMV0gPD0gJyAnIHx8IHNbbGVuLTFdID09ICcuJykpCi0JCQlzWy0tbGVuXSA9ICdcMCc7Ci0JfQotCWlmIChmaWxlbmFtZU9iamVjdCAhPSBOVUxMKQotCQl2ID0gUHlfQnVpbGRWYWx1ZSgiKGlzTykiLCBlcnIsIHMsIGZpbGVuYW1lT2JqZWN0KTsKLQllbHNlCi0JCXYgPSBQeV9CdWlsZFZhbHVlKCIoaXMpIiwgZXJyLCBzKTsKLQlpZiAodiAhPSBOVUxMKSB7Ci0JCVB5RXJyX1NldE9iamVjdChleGMsIHYpOwotCQlQeV9ERUNSRUYodik7Ci0JfQotCUxvY2FsRnJlZShzX2J1Zik7Ci0JcmV0dXJuIE5VTEw7CisgICAgaW50IGxlbjsKKyAgICBjaGFyICpzOworICAgIGNoYXIgKnNfYnVmID0gTlVMTDsgLyogRnJlZSB2aWEgTG9jYWxGcmVlICovCisgICAgY2hhciBzX3NtYWxsX2J1ZlsyOF07IC8qIFJvb20gZm9yICJXaW5kb3dzIEVycm9yIDB4RkZGRkZGRkYiICovCisgICAgUHlPYmplY3QgKnY7CisgICAgRFdPUkQgZXJyID0gKERXT1JEKWllcnI7CisgICAgaWYgKGVycj09MCkgZXJyID0gR2V0TGFzdEVycm9yKCk7CisgICAgbGVuID0gRm9ybWF0TWVzc2FnZSgKKyAgICAgICAgLyogRXJyb3IgQVBJIGVycm9yICovCisgICAgICAgIEZPUk1BVF9NRVNTQUdFX0FMTE9DQVRFX0JVRkZFUiB8CisgICAgICAgIEZPUk1BVF9NRVNTQUdFX0ZST01fU1lTVEVNIHwKKyAgICAgICAgRk9STUFUX01FU1NBR0VfSUdOT1JFX0lOU0VSVFMsCisgICAgICAgIE5VTEwsICAgICAgICAgICAvKiBubyBtZXNzYWdlIHNvdXJjZSAqLworICAgICAgICBlcnIsCisgICAgICAgIE1BS0VMQU5HSUQoTEFOR19ORVVUUkFMLAorICAgICAgICBTVUJMQU5HX0RFRkFVTFQpLCAvKiBEZWZhdWx0IGxhbmd1YWdlICovCisgICAgICAgIChMUFRTVFIpICZzX2J1ZiwKKyAgICAgICAgMCwgICAgICAgICAgICAgIC8qIHNpemUgbm90IHVzZWQgKi8KKyAgICAgICAgTlVMTCk7ICAgICAgICAgIC8qIG5vIGFyZ3MgKi8KKyAgICBpZiAobGVuPT0wKSB7CisgICAgICAgIC8qIE9ubHkgc2VlbiB0aGlzIGluIG91dCBvZiBtZW0gc2l0dWF0aW9ucyAqLworICAgICAgICBzcHJpbnRmKHNfc21hbGxfYnVmLCAiV2luZG93cyBFcnJvciAweCVYIiwgZXJyKTsKKyAgICAgICAgcyA9IHNfc21hbGxfYnVmOworICAgICAgICBzX2J1ZiA9IE5VTEw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcyA9IHNfYnVmOworICAgICAgICAvKiByZW1vdmUgdHJhaWxpbmcgY3IvbGYgYW5kIGRvdHMgKi8KKyAgICAgICAgd2hpbGUgKGxlbiA+IDAgJiYgKHNbbGVuLTFdIDw9ICcgJyB8fCBzW2xlbi0xXSA9PSAnLicpKQorICAgICAgICAgICAgc1stLWxlbl0gPSAnXDAnOworICAgIH0KKyAgICBpZiAoZmlsZW5hbWVPYmplY3QgIT0gTlVMTCkKKyAgICAgICAgdiA9IFB5X0J1aWxkVmFsdWUoIihpc08pIiwgZXJyLCBzLCBmaWxlbmFtZU9iamVjdCk7CisgICAgZWxzZQorICAgICAgICB2ID0gUHlfQnVpbGRWYWx1ZSgiKGlzKSIsIGVyciwgcyk7CisgICAgaWYgKHYgIT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRPYmplY3QoZXhjLCB2KTsKKyAgICAgICAgUHlfREVDUkVGKHYpOworICAgIH0KKyAgICBMb2NhbEZyZWUoc19idWYpOworICAgIHJldHVybiBOVUxMOwogfQogCiBQeU9iamVjdCAqUHlFcnJfU2V0RXhjRnJvbVdpbmRvd3NFcnJXaXRoRmlsZW5hbWUoCi0JUHlPYmplY3QgKmV4YywKLQlpbnQgaWVyciwKLQljb25zdCBjaGFyICpmaWxlbmFtZSkKKyAgICBQeU9iamVjdCAqZXhjLAorICAgIGludCBpZXJyLAorICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQogewotCVB5T2JqZWN0ICpuYW1lID0gZmlsZW5hbWUgPyBQeVN0cmluZ19Gcm9tU3RyaW5nKGZpbGVuYW1lKSA6IE5VTEw7Ci0JUHlPYmplY3QgKnJldCA9IFB5RXJyX1NldEV4Y0Zyb21XaW5kb3dzRXJyV2l0aEZpbGVuYW1lT2JqZWN0KGV4YywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWVyciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7Ci0JUHlfWERFQ1JFRihuYW1lKTsKLQlyZXR1cm4gcmV0OworICAgIFB5T2JqZWN0ICpuYW1lID0gZmlsZW5hbWUgPyBQeVN0cmluZ19Gcm9tU3RyaW5nKGZpbGVuYW1lKSA6IE5VTEw7CisgICAgUHlPYmplY3QgKnJldCA9IFB5RXJyX1NldEV4Y0Zyb21XaW5kb3dzRXJyV2l0aEZpbGVuYW1lT2JqZWN0KGV4YywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7CisgICAgUHlfWERFQ1JFRihuYW1lKTsKKyAgICByZXR1cm4gcmV0OwogfQogCiAjaWZkZWYgUHlfV0lOX1dJREVfRklMRU5BTUVTCiBQeU9iamVjdCAqUHlFcnJfU2V0RXhjRnJvbVdpbmRvd3NFcnJXaXRoVW5pY29kZUZpbGVuYW1lKAotCVB5T2JqZWN0ICpleGMsCi0JaW50IGllcnIsCi0JY29uc3QgUHlfVU5JQ09ERSAqZmlsZW5hbWUpCisgICAgUHlPYmplY3QgKmV4YywKKyAgICBpbnQgaWVyciwKKyAgICBjb25zdCBQeV9VTklDT0RFICpmaWxlbmFtZSkKIHsKLQlQeU9iamVjdCAqbmFtZSA9IGZpbGVuYW1lID8KLQkgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9Gcm9tVW5pY29kZShmaWxlbmFtZSwgd2NzbGVuKGZpbGVuYW1lKSkgOgotCSAgICAgICAgICAgICAgICAgTlVMTDsKLQlQeU9iamVjdCAqcmV0ID0gUHlFcnJfU2V0RXhjRnJvbVdpbmRvd3NFcnJXaXRoRmlsZW5hbWVPYmplY3QoZXhjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZXJyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKLQlQeV9YREVDUkVGKG5hbWUpOwotCXJldHVybiByZXQ7CisgICAgUHlPYmplY3QgKm5hbWUgPSBmaWxlbmFtZSA/CisgICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfRnJvbVVuaWNvZGUoZmlsZW5hbWUsIHdjc2xlbihmaWxlbmFtZSkpIDoKKyAgICAgICAgICAgICBOVUxMOworICAgIFB5T2JqZWN0ICpyZXQgPSBQeUVycl9TZXRFeGNGcm9tV2luZG93c0VycldpdGhGaWxlbmFtZU9iamVjdChleGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGllcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUpOworICAgIFB5X1hERUNSRUYobmFtZSk7CisgICAgcmV0dXJuIHJldDsKIH0KICNlbmRpZiAvKiBQeV9XSU5fV0lERV9GSUxFTkFNRVMgKi8KIAogUHlPYmplY3QgKlB5RXJyX1NldEV4Y0Zyb21XaW5kb3dzRXJyKFB5T2JqZWN0ICpleGMsIGludCBpZXJyKQogewotCXJldHVybiBQeUVycl9TZXRFeGNGcm9tV2luZG93c0VycldpdGhGaWxlbmFtZShleGMsIGllcnIsIE5VTEwpOworICAgIHJldHVybiBQeUVycl9TZXRFeGNGcm9tV2luZG93c0VycldpdGhGaWxlbmFtZShleGMsIGllcnIsIE5VTEwpOwogfQogCiBQeU9iamVjdCAqUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnIoaW50IGllcnIpCiB7Ci0JcmV0dXJuIFB5RXJyX1NldEV4Y0Zyb21XaW5kb3dzRXJyV2l0aEZpbGVuYW1lKFB5RXhjX1dpbmRvd3NFcnJvciwKLQkJCQkJCSAgICAgIGllcnIsIE5VTEwpOworICAgIHJldHVybiBQeUVycl9TZXRFeGNGcm9tV2luZG93c0VycldpdGhGaWxlbmFtZShQeUV4Y19XaW5kb3dzRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGllcnIsIE5VTEwpOwogfQogUHlPYmplY3QgKlB5RXJyX1NldEZyb21XaW5kb3dzRXJyV2l0aEZpbGVuYW1lKAotCWludCBpZXJyLAotCWNvbnN0IGNoYXIgKmZpbGVuYW1lKQorICAgIGludCBpZXJyLAorICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQogewotCVB5T2JqZWN0ICpuYW1lID0gZmlsZW5hbWUgPyBQeVN0cmluZ19Gcm9tU3RyaW5nKGZpbGVuYW1lKSA6IE5VTEw7Ci0JUHlPYmplY3QgKnJlc3VsdCA9IFB5RXJyX1NldEV4Y0Zyb21XaW5kb3dzRXJyV2l0aEZpbGVuYW1lT2JqZWN0KAotCQkJCQkJICAgICAgUHlFeGNfV2luZG93c0Vycm9yLAotCQkJCQkJICAgICAgaWVyciwgbmFtZSk7Ci0JUHlfWERFQ1JFRihuYW1lKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIFB5T2JqZWN0ICpuYW1lID0gZmlsZW5hbWUgPyBQeVN0cmluZ19Gcm9tU3RyaW5nKGZpbGVuYW1lKSA6IE5VTEw7CisgICAgUHlPYmplY3QgKnJlc3VsdCA9IFB5RXJyX1NldEV4Y0Zyb21XaW5kb3dzRXJyV2l0aEZpbGVuYW1lT2JqZWN0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUV4Y19XaW5kb3dzRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGllcnIsIG5hbWUpOworICAgIFB5X1hERUNSRUYobmFtZSk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogI2lmZGVmIFB5X1dJTl9XSURFX0ZJTEVOQU1FUwogUHlPYmplY3QgKlB5RXJyX1NldEZyb21XaW5kb3dzRXJyV2l0aFVuaWNvZGVGaWxlbmFtZSgKLQlpbnQgaWVyciwKLQljb25zdCBQeV9VTklDT0RFICpmaWxlbmFtZSkKKyAgICBpbnQgaWVyciwKKyAgICBjb25zdCBQeV9VTklDT0RFICpmaWxlbmFtZSkKIHsKLQlQeU9iamVjdCAqbmFtZSA9IGZpbGVuYW1lID8KLQkgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9Gcm9tVW5pY29kZShmaWxlbmFtZSwgd2NzbGVuKGZpbGVuYW1lKSkgOgotCSAgICAgICAgICAgICAgICAgTlVMTDsKLQlQeU9iamVjdCAqcmVzdWx0ID0gUHlFcnJfU2V0RXhjRnJvbVdpbmRvd3NFcnJXaXRoRmlsZW5hbWVPYmplY3QoCi0JCQkJCQkgICAgICBQeUV4Y19XaW5kb3dzRXJyb3IsCi0JCQkJCQkgICAgICBpZXJyLCBuYW1lKTsKLQlQeV9YREVDUkVGKG5hbWUpOwotCXJldHVybiByZXN1bHQ7CisgICAgUHlPYmplY3QgKm5hbWUgPSBmaWxlbmFtZSA/CisgICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfRnJvbVVuaWNvZGUoZmlsZW5hbWUsIHdjc2xlbihmaWxlbmFtZSkpIDoKKyAgICAgICAgICAgICBOVUxMOworICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBQeUVycl9TZXRFeGNGcm9tV2luZG93c0VycldpdGhGaWxlbmFtZU9iamVjdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlFeGNfV2luZG93c0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZXJyLCBuYW1lKTsKKyAgICBQeV9YREVDUkVGKG5hbWUpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAjZW5kaWYgLyogUHlfV0lOX1dJREVfRklMRU5BTUVTICovCiAjZW5kaWYgLyogTVNfV0lORE9XUyAqLwpAQCAtNTEzLDkgKzUxMyw5IEBACiB2b2lkCiBfUHlFcnJfQmFkSW50ZXJuYWxDYWxsKGNoYXIgKmZpbGVuYW1lLCBpbnQgbGluZW5vKQogewotCVB5RXJyX0Zvcm1hdChQeUV4Y19TeXN0ZW1FcnJvciwKLQkJICAgICAiJXM6JWQ6IGJhZCBhcmd1bWVudCB0byBpbnRlcm5hbCBmdW5jdGlvbiIsCi0JCSAgICAgZmlsZW5hbWUsIGxpbmVubyk7CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgICAgICAiJXM6JWQ6IGJhZCBhcmd1bWVudCB0byBpbnRlcm5hbCBmdW5jdGlvbiIsCisgICAgICAgICAgICAgICAgIGZpbGVuYW1lLCBsaW5lbm8pOwogfQogCiAvKiBSZW1vdmUgdGhlIHByZXByb2Nlc3NvciBtYWNybyBmb3IgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCkgc28gdGhhdCB3ZSBjYW4KQEAgLTUyNCw4ICs1MjQsOCBAQAogdm9pZAogUHlFcnJfQmFkSW50ZXJuYWxDYWxsKHZvaWQpCiB7Ci0JUHlFcnJfRm9ybWF0KFB5RXhjX1N5c3RlbUVycm9yLAotCQkgICAgICJiYWQgYXJndW1lbnQgdG8gaW50ZXJuYWwgZnVuY3Rpb24iKTsKKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgICAgICAgICJiYWQgYXJndW1lbnQgdG8gaW50ZXJuYWwgZnVuY3Rpb24iKTsKIH0KICNkZWZpbmUgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCkgX1B5RXJyX0JhZEludGVybmFsQ2FsbChfX0ZJTEVfXywgX19MSU5FX18pCiAKQEAgLTUzNCwyMCArNTM0LDIwIEBACiBQeU9iamVjdCAqCiBQeUVycl9Gb3JtYXQoUHlPYmplY3QgKmV4Y2VwdGlvbiwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCiB7Ci0JdmFfbGlzdCB2YXJnczsKLQlQeU9iamVjdCogc3RyaW5nOworICAgIHZhX2xpc3QgdmFyZ3M7CisgICAgUHlPYmplY3QqIHN0cmluZzsKIAogI2lmZGVmIEhBVkVfU1REQVJHX1BST1RPVFlQRVMKLQl2YV9zdGFydCh2YXJncywgZm9ybWF0KTsKKyAgICB2YV9zdGFydCh2YXJncywgZm9ybWF0KTsKICNlbHNlCi0JdmFfc3RhcnQodmFyZ3MpOworICAgIHZhX3N0YXJ0KHZhcmdzKTsKICNlbmRpZgogCi0Jc3RyaW5nID0gUHlTdHJpbmdfRnJvbUZvcm1hdFYoZm9ybWF0LCB2YXJncyk7Ci0JUHlFcnJfU2V0T2JqZWN0KGV4Y2VwdGlvbiwgc3RyaW5nKTsKLQlQeV9YREVDUkVGKHN0cmluZyk7Ci0JdmFfZW5kKHZhcmdzKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBzdHJpbmcgPSBQeVN0cmluZ19Gcm9tRm9ybWF0Vihmb3JtYXQsIHZhcmdzKTsKKyAgICBQeUVycl9TZXRPYmplY3QoZXhjZXB0aW9uLCBzdHJpbmcpOworICAgIFB5X1hERUNSRUYoc3RyaW5nKTsKKyAgICB2YV9lbmQodmFyZ3MpOworICAgIHJldHVybiBOVUxMOwogfQogCiAKQEAgLTU1NSw1MSArNTU1LDUxIEBACiBQeU9iamVjdCAqCiBQeUVycl9OZXdFeGNlcHRpb24oY2hhciAqbmFtZSwgUHlPYmplY3QgKmJhc2UsIFB5T2JqZWN0ICpkaWN0KQogewotCWNoYXIgKmRvdDsKLQlQeU9iamVjdCAqbW9kdWxlbmFtZSA9IE5VTEw7Ci0JUHlPYmplY3QgKmNsYXNzbmFtZSA9IE5VTEw7Ci0JUHlPYmplY3QgKm15ZGljdCA9IE5VTEw7Ci0JUHlPYmplY3QgKmJhc2VzID0gTlVMTDsKLQlQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKLQlkb3QgPSBzdHJyY2hyKG5hbWUsICcuJyk7Ci0JaWYgKGRvdCA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKLQkJCSJQeUVycl9OZXdFeGNlcHRpb246IG5hbWUgbXVzdCBiZSBtb2R1bGUuY2xhc3MiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChiYXNlID09IE5VTEwpCi0JCWJhc2UgPSBQeUV4Y19FeGNlcHRpb247Ci0JaWYgKGRpY3QgPT0gTlVMTCkgewotCQlkaWN0ID0gbXlkaWN0ID0gUHlEaWN0X05ldygpOwotCQlpZiAoZGljdCA9PSBOVUxMKQotCQkJZ290byBmYWlsdXJlOwotCX0KLQlpZiAoUHlEaWN0X0dldEl0ZW1TdHJpbmcoZGljdCwgIl9fbW9kdWxlX18iKSA9PSBOVUxMKSB7Ci0JCW1vZHVsZW5hbWUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShuYW1lLAotCQkJCQkJICAgICAoUHlfc3NpemVfdCkoZG90LW5hbWUpKTsKLQkJaWYgKG1vZHVsZW5hbWUgPT0gTlVMTCkKLQkJCWdvdG8gZmFpbHVyZTsKLQkJaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsICJfX21vZHVsZV9fIiwgbW9kdWxlbmFtZSkgIT0gMCkKLQkJCWdvdG8gZmFpbHVyZTsKLQl9Ci0JaWYgKFB5VHVwbGVfQ2hlY2soYmFzZSkpIHsKLQkJYmFzZXMgPSBiYXNlOwotCQkvKiBJTkNSRUYgYXMgd2UgY3JlYXRlIGEgbmV3IHJlZiBpbiB0aGUgZWxzZSBicmFuY2ggKi8KLQkJUHlfSU5DUkVGKGJhc2VzKTsKLQl9IGVsc2UgewotCQliYXNlcyA9IFB5VHVwbGVfUGFjaygxLCBiYXNlKTsKLQkJaWYgKGJhc2VzID09IE5VTEwpCi0JCQlnb3RvIGZhaWx1cmU7Ci0JfQotCS8qIENyZWF0ZSBhIHJlYWwgbmV3LXN0eWxlIGNsYXNzLiAqLwotCXJlc3VsdCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbigoUHlPYmplY3QgKikmUHlUeXBlX1R5cGUsICJzT08iLAotCQkJCSAgICAgICBkb3QrMSwgYmFzZXMsIGRpY3QpOworICAgIGNoYXIgKmRvdDsKKyAgICBQeU9iamVjdCAqbW9kdWxlbmFtZSA9IE5VTEw7CisgICAgUHlPYmplY3QgKmNsYXNzbmFtZSA9IE5VTEw7CisgICAgUHlPYmplY3QgKm15ZGljdCA9IE5VTEw7CisgICAgUHlPYmplY3QgKmJhc2VzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKKyAgICBkb3QgPSBzdHJyY2hyKG5hbWUsICcuJyk7CisgICAgaWYgKGRvdCA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKKyAgICAgICAgICAgICJQeUVycl9OZXdFeGNlcHRpb246IG5hbWUgbXVzdCBiZSBtb2R1bGUuY2xhc3MiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChiYXNlID09IE5VTEwpCisgICAgICAgIGJhc2UgPSBQeUV4Y19FeGNlcHRpb247CisgICAgaWYgKGRpY3QgPT0gTlVMTCkgeworICAgICAgICBkaWN0ID0gbXlkaWN0ID0gUHlEaWN0X05ldygpOworICAgICAgICBpZiAoZGljdCA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBmYWlsdXJlOworICAgIH0KKyAgICBpZiAoUHlEaWN0X0dldEl0ZW1TdHJpbmcoZGljdCwgIl9fbW9kdWxlX18iKSA9PSBOVUxMKSB7CisgICAgICAgIG1vZHVsZW5hbWUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFB5X3NzaXplX3QpKGRvdC1uYW1lKSk7CisgICAgICAgIGlmIChtb2R1bGVuYW1lID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGZhaWx1cmU7CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCAiX19tb2R1bGVfXyIsIG1vZHVsZW5hbWUpICE9IDApCisgICAgICAgICAgICBnb3RvIGZhaWx1cmU7CisgICAgfQorICAgIGlmIChQeVR1cGxlX0NoZWNrKGJhc2UpKSB7CisgICAgICAgIGJhc2VzID0gYmFzZTsKKyAgICAgICAgLyogSU5DUkVGIGFzIHdlIGNyZWF0ZSBhIG5ldyByZWYgaW4gdGhlIGVsc2UgYnJhbmNoICovCisgICAgICAgIFB5X0lOQ1JFRihiYXNlcyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYmFzZXMgPSBQeVR1cGxlX1BhY2soMSwgYmFzZSk7CisgICAgICAgIGlmIChiYXNlcyA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBmYWlsdXJlOworICAgIH0KKyAgICAvKiBDcmVhdGUgYSByZWFsIG5ldy1zdHlsZSBjbGFzcy4gKi8KKyAgICByZXN1bHQgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oKFB5T2JqZWN0ICopJlB5VHlwZV9UeXBlLCAic09PIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG90KzEsIGJhc2VzLCBkaWN0KTsKICAgZmFpbHVyZToKLQlQeV9YREVDUkVGKGJhc2VzKTsKLQlQeV9YREVDUkVGKG15ZGljdCk7Ci0JUHlfWERFQ1JFRihjbGFzc25hbWUpOwotCVB5X1hERUNSRUYobW9kdWxlbmFtZSk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBQeV9YREVDUkVGKGJhc2VzKTsKKyAgICBQeV9YREVDUkVGKG15ZGljdCk7CisgICAgUHlfWERFQ1JFRihjbGFzc25hbWUpOworICAgIFB5X1hERUNSRUYobW9kdWxlbmFtZSk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogLyogQ2FsbCB3aGVuIGFuIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQgYnV0IHRoZXJlIGlzIG5vIHdheSBmb3IgUHl0aG9uCkBAIC02MDcsNTIgKzYwNyw1MiBAQAogdm9pZAogUHlFcnJfV3JpdGVVbnJhaXNhYmxlKFB5T2JqZWN0ICpvYmopCiB7Ci0JUHlPYmplY3QgKmYsICp0LCAqdiwgKnRiOwotCVB5RXJyX0ZldGNoKCZ0LCAmdiwgJnRiKTsKLQlmID0gUHlTeXNfR2V0T2JqZWN0KCJzdGRlcnIiKTsKLQlpZiAoZiAhPSBOVUxMKSB7Ci0JCVB5RmlsZV9Xcml0ZVN0cmluZygiRXhjZXB0aW9uICIsIGYpOwotCQlpZiAodCkgewotCQkJUHlPYmplY3QqIG1vZHVsZU5hbWU7Ci0JCQljaGFyKiBjbGFzc05hbWU7Ci0JCQlhc3NlcnQoUHlFeGNlcHRpb25DbGFzc19DaGVjayh0KSk7Ci0JCQljbGFzc05hbWUgPSBQeUV4Y2VwdGlvbkNsYXNzX05hbWUodCk7Ci0JCQlpZiAoY2xhc3NOYW1lICE9IE5VTEwpIHsKLQkJCQljaGFyICpkb3QgPSBzdHJyY2hyKGNsYXNzTmFtZSwgJy4nKTsKLQkJCQlpZiAoZG90ICE9IE5VTEwpCi0JCQkJCWNsYXNzTmFtZSA9IGRvdCsxOwotCQkJfQorICAgIFB5T2JqZWN0ICpmLCAqdCwgKnYsICp0YjsKKyAgICBQeUVycl9GZXRjaCgmdCwgJnYsICZ0Yik7CisgICAgZiA9IFB5U3lzX0dldE9iamVjdCgic3RkZXJyIik7CisgICAgaWYgKGYgIT0gTlVMTCkgeworICAgICAgICBQeUZpbGVfV3JpdGVTdHJpbmcoIkV4Y2VwdGlvbiAiLCBmKTsKKyAgICAgICAgaWYgKHQpIHsKKyAgICAgICAgICAgIFB5T2JqZWN0KiBtb2R1bGVOYW1lOworICAgICAgICAgICAgY2hhciogY2xhc3NOYW1lOworICAgICAgICAgICAgYXNzZXJ0KFB5RXhjZXB0aW9uQ2xhc3NfQ2hlY2sodCkpOworICAgICAgICAgICAgY2xhc3NOYW1lID0gUHlFeGNlcHRpb25DbGFzc19OYW1lKHQpOworICAgICAgICAgICAgaWYgKGNsYXNzTmFtZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgY2hhciAqZG90ID0gc3RycmNocihjbGFzc05hbWUsICcuJyk7CisgICAgICAgICAgICAgICAgaWYgKGRvdCAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSBkb3QrMTsKKyAgICAgICAgICAgIH0KIAotCQkJbW9kdWxlTmFtZSA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcodCwgIl9fbW9kdWxlX18iKTsKLQkJCWlmIChtb2R1bGVOYW1lID09IE5VTEwpCi0JCQkJUHlGaWxlX1dyaXRlU3RyaW5nKCI8dW5rbm93bj4iLCBmKTsKLQkJCWVsc2UgewotCQkJCWNoYXIqIG1vZHN0ciA9IFB5U3RyaW5nX0FzU3RyaW5nKG1vZHVsZU5hbWUpOwotCQkJCWlmIChtb2RzdHIgJiYKLQkJCQkgICAgc3RyY21wKG1vZHN0ciwgImV4Y2VwdGlvbnMiKSAhPSAwKQotCQkJCXsKLQkJCQkJUHlGaWxlX1dyaXRlU3RyaW5nKG1vZHN0ciwgZik7Ci0JCQkJCVB5RmlsZV9Xcml0ZVN0cmluZygiLiIsIGYpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChjbGFzc05hbWUgPT0gTlVMTCkKLQkJCQlQeUZpbGVfV3JpdGVTdHJpbmcoIjx1bmtub3duPiIsIGYpOwotCQkJZWxzZQotCQkJCVB5RmlsZV9Xcml0ZVN0cmluZyhjbGFzc05hbWUsIGYpOwotCQkJaWYgKHYgJiYgdiAhPSBQeV9Ob25lKSB7Ci0JCQkJUHlGaWxlX1dyaXRlU3RyaW5nKCI6ICIsIGYpOwotCQkJCVB5RmlsZV9Xcml0ZU9iamVjdCh2LCBmLCAwKTsKLQkJCX0KLQkJCVB5X1hERUNSRUYobW9kdWxlTmFtZSk7Ci0JCX0KLQkJUHlGaWxlX1dyaXRlU3RyaW5nKCIgaW4gIiwgZik7Ci0JCVB5RmlsZV9Xcml0ZU9iamVjdChvYmosIGYsIDApOwotCQlQeUZpbGVfV3JpdGVTdHJpbmcoIiBpZ25vcmVkXG4iLCBmKTsKLQkJUHlFcnJfQ2xlYXIoKTsgLyogSnVzdCBpbiBjYXNlICovCi0JfQotCVB5X1hERUNSRUYodCk7Ci0JUHlfWERFQ1JFRih2KTsKLQlQeV9YREVDUkVGKHRiKTsKKyAgICAgICAgICAgIG1vZHVsZU5hbWUgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHQsICJfX21vZHVsZV9fIik7CisgICAgICAgICAgICBpZiAobW9kdWxlTmFtZSA9PSBOVUxMKQorICAgICAgICAgICAgICAgIFB5RmlsZV9Xcml0ZVN0cmluZygiPHVua25vd24+IiwgZik7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBjaGFyKiBtb2RzdHIgPSBQeVN0cmluZ19Bc1N0cmluZyhtb2R1bGVOYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAobW9kc3RyICYmCisgICAgICAgICAgICAgICAgICAgIHN0cmNtcChtb2RzdHIsICJleGNlcHRpb25zIikgIT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFB5RmlsZV9Xcml0ZVN0cmluZyhtb2RzdHIsIGYpOworICAgICAgICAgICAgICAgICAgICBQeUZpbGVfV3JpdGVTdHJpbmcoIi4iLCBmKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY2xhc3NOYW1lID09IE5VTEwpCisgICAgICAgICAgICAgICAgUHlGaWxlX1dyaXRlU3RyaW5nKCI8dW5rbm93bj4iLCBmKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBQeUZpbGVfV3JpdGVTdHJpbmcoY2xhc3NOYW1lLCBmKTsKKyAgICAgICAgICAgIGlmICh2ICYmIHYgIT0gUHlfTm9uZSkgeworICAgICAgICAgICAgICAgIFB5RmlsZV9Xcml0ZVN0cmluZygiOiAiLCBmKTsKKyAgICAgICAgICAgICAgICBQeUZpbGVfV3JpdGVPYmplY3QodiwgZiwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQeV9YREVDUkVGKG1vZHVsZU5hbWUpOworICAgICAgICB9CisgICAgICAgIFB5RmlsZV9Xcml0ZVN0cmluZygiIGluICIsIGYpOworICAgICAgICBQeUZpbGVfV3JpdGVPYmplY3Qob2JqLCBmLCAwKTsKKyAgICAgICAgUHlGaWxlX1dyaXRlU3RyaW5nKCIgaWdub3JlZFxuIiwgZik7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7IC8qIEp1c3QgaW4gY2FzZSAqLworICAgIH0KKyAgICBQeV9YREVDUkVGKHQpOworICAgIFB5X1hERUNSRUYodik7CisgICAgUHlfWERFQ1JFRih0Yik7CiB9CiAKIGV4dGVybiBQeU9iamVjdCAqUHlNb2R1bGVfR2V0V2FybmluZ3NNb2R1bGUodm9pZCk7CkBAIC02NjUsNTkgKzY2NSw1OSBAQAogdm9pZAogUHlFcnJfU3ludGF4TG9jYXRpb24oY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBsaW5lbm8pCiB7Ci0JUHlPYmplY3QgKmV4YywgKnYsICp0YiwgKnRtcDsKKyAgICBQeU9iamVjdCAqZXhjLCAqdiwgKnRiLCAqdG1wOwogCi0JLyogYWRkIGF0dHJpYnV0ZXMgZm9yIHRoZSBsaW5lIG51bWJlciBhbmQgZmlsZW5hbWUgZm9yIHRoZSBlcnJvciAqLwotCVB5RXJyX0ZldGNoKCZleGMsICZ2LCAmdGIpOwotCVB5RXJyX05vcm1hbGl6ZUV4Y2VwdGlvbigmZXhjLCAmdiwgJnRiKTsKLQkvKiBYWFggY2hlY2sgdGhhdCBpdCBpcywgaW5kZWVkLCBhIHN5bnRheCBlcnJvci4gSXQgbWlnaHQgbm90Ci0JICogYmUsIHRob3VnaC4gKi8KLQl0bXAgPSBQeUludF9Gcm9tTG9uZyhsaW5lbm8pOwotCWlmICh0bXAgPT0gTlVMTCkKLQkJUHlFcnJfQ2xlYXIoKTsKLQllbHNlIHsKLQkJaWYgKFB5T2JqZWN0X1NldEF0dHJTdHJpbmcodiwgImxpbmVubyIsIHRtcCkpCi0JCQlQeUVycl9DbGVhcigpOwotCQlQeV9ERUNSRUYodG1wKTsKLQl9Ci0JaWYgKGZpbGVuYW1lICE9IE5VTEwpIHsKLQkJdG1wID0gUHlTdHJpbmdfRnJvbVN0cmluZyhmaWxlbmFtZSk7Ci0JCWlmICh0bXAgPT0gTlVMTCkKLQkJCVB5RXJyX0NsZWFyKCk7Ci0JCWVsc2UgewotCQkJaWYgKFB5T2JqZWN0X1NldEF0dHJTdHJpbmcodiwgImZpbGVuYW1lIiwgdG1wKSkKLQkJCQlQeUVycl9DbGVhcigpOwotCQkJUHlfREVDUkVGKHRtcCk7Ci0JCX0KKyAgICAvKiBhZGQgYXR0cmlidXRlcyBmb3IgdGhlIGxpbmUgbnVtYmVyIGFuZCBmaWxlbmFtZSBmb3IgdGhlIGVycm9yICovCisgICAgUHlFcnJfRmV0Y2goJmV4YywgJnYsICZ0Yik7CisgICAgUHlFcnJfTm9ybWFsaXplRXhjZXB0aW9uKCZleGMsICZ2LCAmdGIpOworICAgIC8qIFhYWCBjaGVjayB0aGF0IGl0IGlzLCBpbmRlZWQsIGEgc3ludGF4IGVycm9yLiBJdCBtaWdodCBub3QKKyAgICAgKiBiZSwgdGhvdWdoLiAqLworICAgIHRtcCA9IFB5SW50X0Zyb21Mb25nKGxpbmVubyk7CisgICAgaWYgKHRtcCA9PSBOVUxMKQorICAgICAgICBQeUVycl9DbGVhcigpOworICAgIGVsc2UgeworICAgICAgICBpZiAoUHlPYmplY3RfU2V0QXR0clN0cmluZyh2LCAibGluZW5vIiwgdG1wKSkKKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIFB5X0RFQ1JFRih0bXApOworICAgIH0KKyAgICBpZiAoZmlsZW5hbWUgIT0gTlVMTCkgeworICAgICAgICB0bXAgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGZpbGVuYW1lKTsKKyAgICAgICAgaWYgKHRtcCA9PSBOVUxMKQorICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAoUHlPYmplY3RfU2V0QXR0clN0cmluZyh2LCAiZmlsZW5hbWUiLCB0bXApKQorICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICBQeV9ERUNSRUYodG1wKTsKKyAgICAgICAgfQogCi0JCXRtcCA9IFB5RXJyX1Byb2dyYW1UZXh0KGZpbGVuYW1lLCBsaW5lbm8pOwotCQlpZiAodG1wKSB7Ci0JCQlpZiAoUHlPYmplY3RfU2V0QXR0clN0cmluZyh2LCAidGV4dCIsIHRtcCkpCi0JCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCVB5X0RFQ1JFRih0bXApOwotCQl9Ci0JfQotCWlmIChQeU9iamVjdF9TZXRBdHRyU3RyaW5nKHYsICJvZmZzZXQiLCBQeV9Ob25lKSkgewotCQlQeUVycl9DbGVhcigpOwotCX0KLQlpZiAoZXhjICE9IFB5RXhjX1N5bnRheEVycm9yKSB7Ci0JCWlmICghUHlPYmplY3RfSGFzQXR0clN0cmluZyh2LCAibXNnIikpIHsKLQkJCXRtcCA9IFB5T2JqZWN0X1N0cih2KTsKLQkJCWlmICh0bXApIHsKLQkJCQlpZiAoUHlPYmplY3RfU2V0QXR0clN0cmluZyh2LCAibXNnIiwgdG1wKSkKLQkJCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCQlQeV9ERUNSRUYodG1wKTsKLQkJCX0gZWxzZSB7Ci0JCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCX0KLQkJfQotCQlpZiAoIVB5T2JqZWN0X0hhc0F0dHJTdHJpbmcodiwgInByaW50X2ZpbGVfYW5kX2xpbmUiKSkgewotCQkJaWYgKFB5T2JqZWN0X1NldEF0dHJTdHJpbmcodiwgInByaW50X2ZpbGVfYW5kX2xpbmUiLAotCQkJCQkJICAgUHlfTm9uZSkpCi0JCQkJUHlFcnJfQ2xlYXIoKTsKLQkJfQotCX0KLQlQeUVycl9SZXN0b3JlKGV4YywgdiwgdGIpOworICAgICAgICB0bXAgPSBQeUVycl9Qcm9ncmFtVGV4dChmaWxlbmFtZSwgbGluZW5vKTsKKyAgICAgICAgaWYgKHRtcCkgeworICAgICAgICAgICAgaWYgKFB5T2JqZWN0X1NldEF0dHJTdHJpbmcodiwgInRleHQiLCB0bXApKQorICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICBQeV9ERUNSRUYodG1wKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoUHlPYmplY3RfU2V0QXR0clN0cmluZyh2LCAib2Zmc2V0IiwgUHlfTm9uZSkpIHsKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICB9CisgICAgaWYgKGV4YyAhPSBQeUV4Y19TeW50YXhFcnJvcikgeworICAgICAgICBpZiAoIVB5T2JqZWN0X0hhc0F0dHJTdHJpbmcodiwgIm1zZyIpKSB7CisgICAgICAgICAgICB0bXAgPSBQeU9iamVjdF9TdHIodik7CisgICAgICAgICAgICBpZiAodG1wKSB7CisgICAgICAgICAgICAgICAgaWYgKFB5T2JqZWN0X1NldEF0dHJTdHJpbmcodiwgIm1zZyIsIHRtcCkpCisgICAgICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHRtcCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFQeU9iamVjdF9IYXNBdHRyU3RyaW5nKHYsICJwcmludF9maWxlX2FuZF9saW5lIikpIHsKKyAgICAgICAgICAgIGlmIChQeU9iamVjdF9TZXRBdHRyU3RyaW5nKHYsICJwcmludF9maWxlX2FuZF9saW5lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X05vbmUpKQorICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgUHlFcnJfUmVzdG9yZShleGMsIHYsIHRiKTsKIH0KIAogLyogY29tX2ZldGNoX3Byb2dyYW1fdGV4dCB3aWxsIGF0dGVtcHQgdG8gbG9hZCB0aGUgbGluZSBvZiB0ZXh0IHRoYXQKQEAgLTczMSwzNiArNzMxLDM2IEBACiBQeU9iamVjdCAqCiBQeUVycl9Qcm9ncmFtVGV4dChjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGxpbmVubykKIHsKLQlGSUxFICpmcDsKLQlpbnQgaTsKLQljaGFyIGxpbmVidWZbMTAwMF07CisgICAgRklMRSAqZnA7CisgICAgaW50IGk7CisgICAgY2hhciBsaW5lYnVmWzEwMDBdOwogCi0JaWYgKGZpbGVuYW1lID09IE5VTEwgfHwgKmZpbGVuYW1lID09ICdcMCcgfHwgbGluZW5vIDw9IDApCi0JCXJldHVybiBOVUxMOwotCWZwID0gZm9wZW4oZmlsZW5hbWUsICJyIiBQWV9TVERJT1RFWFRNT0RFKTsKLQlpZiAoZnAgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JZm9yIChpID0gMDsgaSA8IGxpbmVubzsgaSsrKSB7Ci0JCWNoYXIgKnBMYXN0Q2hhciA9ICZsaW5lYnVmW3NpemVvZihsaW5lYnVmKSAtIDJdOwotCQlkbyB7Ci0JCQkqcExhc3RDaGFyID0gJ1wwJzsKLQkJCWlmIChQeV9Vbml2ZXJzYWxOZXdsaW5lRmdldHMobGluZWJ1Ziwgc2l6ZW9mIGxpbmVidWYsIGZwLCBOVUxMKSA9PSBOVUxMKQotCQkJCWJyZWFrOwotCQkJLyogZmdldHMgcmVhZCAqc29tZXRoaW5nKjsgaWYgaXQgZGlkbid0IGdldCBhcwotCQkJICAgZmFyIGFzIHBMYXN0Q2hhciwgaXQgbXVzdCBoYXZlIGZvdW5kIGEgbmV3bGluZQotCQkJICAgb3IgaGl0IHRoZSBlbmQgb2YgdGhlIGZpbGU7IGlmIHBMYXN0Q2hhciBpcyBcbiwKLQkJCSAgIGl0IG9idmlvdXNseSBmb3VuZCBhIG5ld2xpbmU7IGVsc2Ugd2UgaGF2ZW4ndAotCQkJICAgeWV0IHNlZW4gYSBuZXdsaW5lLCBzbyBtdXN0IGNvbnRpbnVlICovCi0JCX0gd2hpbGUgKCpwTGFzdENoYXIgIT0gJ1wwJyAmJiAqcExhc3RDaGFyICE9ICdcbicpOwotCX0KLQlmY2xvc2UoZnApOwotCWlmIChpID09IGxpbmVubykgewotCQljaGFyICpwID0gbGluZWJ1ZjsKLQkJd2hpbGUgKCpwID09ICcgJyB8fCAqcCA9PSAnXHQnIHx8ICpwID09ICdcMDE0JykKLQkJCXArKzsKLQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcocCk7Ci0JfQotCXJldHVybiBOVUxMOworICAgIGlmIChmaWxlbmFtZSA9PSBOVUxMIHx8ICpmaWxlbmFtZSA9PSAnXDAnIHx8IGxpbmVubyA8PSAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBmcCA9IGZvcGVuKGZpbGVuYW1lLCAiciIgUFlfU1RESU9URVhUTU9ERSk7CisgICAgaWYgKGZwID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGZvciAoaSA9IDA7IGkgPCBsaW5lbm87IGkrKykgeworICAgICAgICBjaGFyICpwTGFzdENoYXIgPSAmbGluZWJ1ZltzaXplb2YobGluZWJ1ZikgLSAyXTsKKyAgICAgICAgZG8geworICAgICAgICAgICAgKnBMYXN0Q2hhciA9ICdcMCc7CisgICAgICAgICAgICBpZiAoUHlfVW5pdmVyc2FsTmV3bGluZUZnZXRzKGxpbmVidWYsIHNpemVvZiBsaW5lYnVmLCBmcCwgTlVMTCkgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIC8qIGZnZXRzIHJlYWQgKnNvbWV0aGluZyo7IGlmIGl0IGRpZG4ndCBnZXQgYXMKKyAgICAgICAgICAgICAgIGZhciBhcyBwTGFzdENoYXIsIGl0IG11c3QgaGF2ZSBmb3VuZCBhIG5ld2xpbmUKKyAgICAgICAgICAgICAgIG9yIGhpdCB0aGUgZW5kIG9mIHRoZSBmaWxlOyBpZiBwTGFzdENoYXIgaXMgXG4sCisgICAgICAgICAgICAgICBpdCBvYnZpb3VzbHkgZm91bmQgYSBuZXdsaW5lOyBlbHNlIHdlIGhhdmVuJ3QKKyAgICAgICAgICAgICAgIHlldCBzZWVuIGEgbmV3bGluZSwgc28gbXVzdCBjb250aW51ZSAqLworICAgICAgICB9IHdoaWxlICgqcExhc3RDaGFyICE9ICdcMCcgJiYgKnBMYXN0Q2hhciAhPSAnXG4nKTsKKyAgICB9CisgICAgZmNsb3NlKGZwKTsKKyAgICBpZiAoaSA9PSBsaW5lbm8pIHsKKyAgICAgICAgY2hhciAqcCA9IGxpbmVidWY7CisgICAgICAgIHdoaWxlICgqcCA9PSAnICcgfHwgKnAgPT0gJ1x0JyB8fCAqcCA9PSAnXDAxNCcpCisgICAgICAgICAgICBwKys7CisgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKHApOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKIH0KIAogI2lmZGVmIF9fY3BsdXNwbHVzCmRpZmYgLS1naXQgYS9QeXRob24vZnJvemVuLmMgYi9QeXRob24vZnJvemVuLmMKaW5kZXggOTQ2ZDYyNi4uYWU3ZTlhNCAxMDA2NDQKLS0tIGEvUHl0aG9uL2Zyb3plbi5jCisrKyBiL1B5dGhvbi9mcm96ZW4uYwpAQCAtMTIsMjQgKzEyLDI0IEBACiAgICB0aGUgYXBwcm9wcmlhdGUgYnl0ZXMgZnJvbSBNX19fbWFpbl9fLmMuICovCiAKIHN0YXRpYyB1bnNpZ25lZCBjaGFyIE1fX19oZWxsb19fW10gPSB7Ci0JOTksMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsCi0JMCwxMTUsOSwwLDAsMCwxMDAsMCwwLDcxLDcyLDEwMCwxLDAsODMsNDAsCi0JMiwwLDAsMCwxMTUsMTQsMCwwLDAsNzIsMTAxLDEwOCwxMDgsMTExLDMyLDExOSwKLQkxMTEsMTE0LDEwOCwxMDAsNDYsNDYsNDYsNzgsNDAsMCwwLDAsMCw0MCwwLDAsCi0JMCwwLDQwLDAsMCwwLDAsNDAsMCwwLDAsMCwxMTUsOCwwLDAsCi0JMCwxMDQsMTAxLDEwOCwxMDgsMTExLDQ2LDExMiwxMjEsMTE1LDEsMCwwLDAsNjMsMSwKLQkwLDAsMCwxMTUsMCwwLDAsMCwKKyAgICA5OSwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwKKyAgICAwLDExNSw5LDAsMCwwLDEwMCwwLDAsNzEsNzIsMTAwLDEsMCw4Myw0MCwKKyAgICAyLDAsMCwwLDExNSwxNCwwLDAsMCw3MiwxMDEsMTA4LDEwOCwxMTEsMzIsMTE5LAorICAgIDExMSwxMTQsMTA4LDEwMCw0Niw0Niw0Niw3OCw0MCwwLDAsMCwwLDQwLDAsMCwKKyAgICAwLDAsNDAsMCwwLDAsMCw0MCwwLDAsMCwwLDExNSw4LDAsMCwKKyAgICAwLDEwNCwxMDEsMTA4LDEwOCwxMTEsNDYsMTEyLDEyMSwxMTUsMSwwLDAsMCw2MywxLAorICAgIDAsMCwwLDExNSwwLDAsMCwwLAogfTsKIAogI2RlZmluZSBTSVpFIChpbnQpc2l6ZW9mKE1fX19oZWxsb19fKQogCiBzdGF0aWMgc3RydWN0IF9mcm96ZW4gX1B5SW1wb3J0X0Zyb3plbk1vZHVsZXNbXSA9IHsKLQkvKiBUZXN0IG1vZHVsZSAqLwotCXsiX19oZWxsb19fIiwgTV9fX2hlbGxvX18sIFNJWkV9LAotCS8qIFRlc3QgcGFja2FnZSAobmVnYXRpdmUgc2l6ZSBpbmRpY2F0ZXMgcGFja2FnZS1uZXNzKSAqLwotCXsiX19waGVsbG9fXyIsIE1fX19oZWxsb19fLCAtU0laRX0sCi0JeyJfX3BoZWxsb19fLnNwYW0iLCBNX19faGVsbG9fXywgU0laRX0sCi0JezAsIDAsIDB9IC8qIHNlbnRpbmVsICovCisgICAgLyogVGVzdCBtb2R1bGUgKi8KKyAgICB7Il9faGVsbG9fXyIsIE1fX19oZWxsb19fLCBTSVpFfSwKKyAgICAvKiBUZXN0IHBhY2thZ2UgKG5lZ2F0aXZlIHNpemUgaW5kaWNhdGVzIHBhY2thZ2UtbmVzcykgKi8KKyAgICB7Il9fcGhlbGxvX18iLCBNX19faGVsbG9fXywgLVNJWkV9LAorICAgIHsiX19waGVsbG9fXy5zcGFtIiwgTV9fX2hlbGxvX18sIFNJWkV9LAorICAgIHswLCAwLCAwfSAvKiBzZW50aW5lbCAqLwogfTsKIAogLyogRW1iZWRkaW5nIGFwcHMgbWF5IGNoYW5nZSB0aGlzIHBvaW50ZXIgdG8gcG9pbnQgdG8gdGhlaXIgZmF2b3JpdGUKZGlmZiAtLWdpdCBhL1B5dGhvbi9mcm96ZW5tYWluLmMgYi9QeXRob24vZnJvemVubWFpbi5jCmluZGV4IDM5N2YwNDYuLmQzMWRhMDcgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9mcm96ZW5tYWluLmMKKysrIGIvUHl0aG9uL2Zyb3plbm1haW4uYwpAQCAtMTQsNTUgKzE0LDU1IEBACiBpbnQKIFB5X0Zyb3plbk1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogewotCWNoYXIgKnA7Ci0JaW50IG4sIHN0czsKLQlpbnQgaW5zcGVjdCA9IDA7Ci0JaW50IHVuYnVmZmVyZWQgPSAwOworICAgIGNoYXIgKnA7CisgICAgaW50IG4sIHN0czsKKyAgICBpbnQgaW5zcGVjdCA9IDA7CisgICAgaW50IHVuYnVmZmVyZWQgPSAwOwogCi0JUHlfRnJvemVuRmxhZyA9IDE7IC8qIFN1cHByZXNzIGVycm9ycyBmcm9tIGdldHBhdGguYyAqLworICAgIFB5X0Zyb3plbkZsYWcgPSAxOyAvKiBTdXBwcmVzcyBlcnJvcnMgZnJvbSBnZXRwYXRoLmMgKi8KIAotCWlmICgocCA9IFB5X0dFVEVOVigiUFlUSE9OSU5TUEVDVCIpKSAmJiAqcCAhPSAnXDAnKQotCQlpbnNwZWN0ID0gMTsKLQlpZiAoKHAgPSBQeV9HRVRFTlYoIlBZVEhPTlVOQlVGRkVSRUQiKSkgJiYgKnAgIT0gJ1wwJykKLQkJdW5idWZmZXJlZCA9IDE7CisgICAgaWYgKChwID0gUHlfR0VURU5WKCJQWVRIT05JTlNQRUNUIikpICYmICpwICE9ICdcMCcpCisgICAgICAgIGluc3BlY3QgPSAxOworICAgIGlmICgocCA9IFB5X0dFVEVOVigiUFlUSE9OVU5CVUZGRVJFRCIpKSAmJiAqcCAhPSAnXDAnKQorICAgICAgICB1bmJ1ZmZlcmVkID0gMTsKIAotCWlmICh1bmJ1ZmZlcmVkKSB7Ci0JCXNldGJ1ZihzdGRpbiwgKGNoYXIgKilOVUxMKTsKLQkJc2V0YnVmKHN0ZG91dCwgKGNoYXIgKilOVUxMKTsKLQkJc2V0YnVmKHN0ZGVyciwgKGNoYXIgKilOVUxMKTsKLQl9CisgICAgaWYgKHVuYnVmZmVyZWQpIHsKKyAgICAgICAgc2V0YnVmKHN0ZGluLCAoY2hhciAqKU5VTEwpOworICAgICAgICBzZXRidWYoc3Rkb3V0LCAoY2hhciAqKU5VTEwpOworICAgICAgICBzZXRidWYoc3RkZXJyLCAoY2hhciAqKU5VTEwpOworICAgIH0KIAogI2lmZGVmIE1TX1dJTkRPV1MKLQlQeUluaXRGcm96ZW5FeHRlbnNpb25zKCk7CisgICAgUHlJbml0RnJvemVuRXh0ZW5zaW9ucygpOwogI2VuZGlmIC8qIE1TX1dJTkRPV1MgKi8KLQlQeV9TZXRQcm9ncmFtTmFtZShhcmd2WzBdKTsKLQlQeV9Jbml0aWFsaXplKCk7CisgICAgUHlfU2V0UHJvZ3JhbU5hbWUoYXJndlswXSk7CisgICAgUHlfSW5pdGlhbGl6ZSgpOwogI2lmZGVmIE1TX1dJTkRPV1MKLQlQeVdpbkZyZWV6ZV9FeGVJbml0KCk7CisgICAgUHlXaW5GcmVlemVfRXhlSW5pdCgpOwogI2VuZGlmCiAKLQlpZiAoUHlfVmVyYm9zZUZsYWcpCi0JCWZwcmludGYoc3RkZXJyLCAiUHl0aG9uICVzXG4lc1xuIiwKLQkJCVB5X0dldFZlcnNpb24oKSwgUHlfR2V0Q29weXJpZ2h0KCkpOworICAgIGlmIChQeV9WZXJib3NlRmxhZykKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJQeXRob24gJXNcbiVzXG4iLAorICAgICAgICAgICAgUHlfR2V0VmVyc2lvbigpLCBQeV9HZXRDb3B5cmlnaHQoKSk7CiAKLQlQeVN5c19TZXRBcmd2KGFyZ2MsIGFyZ3YpOworICAgIFB5U3lzX1NldEFyZ3YoYXJnYywgYXJndik7CiAKLQluID0gUHlJbXBvcnRfSW1wb3J0RnJvemVuTW9kdWxlKCJfX21haW5fXyIpOwotCWlmIChuID09IDApCi0JCVB5X0ZhdGFsRXJyb3IoIl9fbWFpbl9fIG5vdCBmcm96ZW4iKTsKLQlpZiAobiA8IDApIHsKLQkJUHlFcnJfUHJpbnQoKTsKLQkJc3RzID0gMTsKLQl9Ci0JZWxzZQotCQlzdHMgPSAwOworICAgIG4gPSBQeUltcG9ydF9JbXBvcnRGcm96ZW5Nb2R1bGUoIl9fbWFpbl9fIik7CisgICAgaWYgKG4gPT0gMCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiX19tYWluX18gbm90IGZyb3plbiIpOworICAgIGlmIChuIDwgMCkgeworICAgICAgICBQeUVycl9QcmludCgpOworICAgICAgICBzdHMgPSAxOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHN0cyA9IDA7CiAKLQlpZiAoaW5zcGVjdCAmJiBpc2F0dHkoKGludClmaWxlbm8oc3RkaW4pKSkKLQkJc3RzID0gUHlSdW5fQW55RmlsZShzdGRpbiwgIjxzdGRpbj4iKSAhPSAwOworICAgIGlmIChpbnNwZWN0ICYmIGlzYXR0eSgoaW50KWZpbGVubyhzdGRpbikpKQorICAgICAgICBzdHMgPSBQeVJ1bl9BbnlGaWxlKHN0ZGluLCAiPHN0ZGluPiIpICE9IDA7CiAKICNpZmRlZiBNU19XSU5ET1dTCi0JUHlXaW5GcmVlemVfRXhlVGVybSgpOworICAgIFB5V2luRnJlZXplX0V4ZVRlcm0oKTsKICNlbmRpZgotCVB5X0ZpbmFsaXplKCk7Ci0JcmV0dXJuIHN0czsKKyAgICBQeV9GaW5hbGl6ZSgpOworICAgIHJldHVybiBzdHM7CiB9CmRpZmYgLS1naXQgYS9QeXRob24vZnV0dXJlLmMgYi9QeXRob24vZnV0dXJlLmMKaW5kZXggMmM2YWFhMi4uOTE1OGRmNCAxMDA2NDQKLS0tIGEvUHl0aG9uL2Z1dHVyZS5jCisrKyBiL1B5dGhvbi9mdXR1cmUuYwpAQCAtMTIsMTI5ICsxMiwxMjkgQEAKIHN0YXRpYyBpbnQKIGZ1dHVyZV9jaGVja19mZWF0dXJlcyhQeUZ1dHVyZUZlYXR1cmVzICpmZiwgc3RtdF90eSBzLCBjb25zdCBjaGFyICpmaWxlbmFtZSkKIHsKLQlpbnQgaTsKLQlhc2RsX3NlcSAqbmFtZXM7CisgICAgaW50IGk7CisgICAgYXNkbF9zZXEgKm5hbWVzOwogCi0JYXNzZXJ0KHMtPmtpbmQgPT0gSW1wb3J0RnJvbV9raW5kKTsKKyAgICBhc3NlcnQocy0+a2luZCA9PSBJbXBvcnRGcm9tX2tpbmQpOwogCi0JbmFtZXMgPSBzLT52LkltcG9ydEZyb20ubmFtZXM7Ci0JZm9yIChpID0gMDsgaSA8IGFzZGxfc2VxX0xFTihuYW1lcyk7IGkrKykgewotICAgICAgICAgICAgICAgIGFsaWFzX3R5IG5hbWUgPSAoYWxpYXNfdHkpYXNkbF9zZXFfR0VUKG5hbWVzLCBpKTsKLQkJY29uc3QgY2hhciAqZmVhdHVyZSA9IFB5U3RyaW5nX0FzU3RyaW5nKG5hbWUtPm5hbWUpOwotCQlpZiAoIWZlYXR1cmUpCi0JCQlyZXR1cm4gMDsKLQkJaWYgKHN0cmNtcChmZWF0dXJlLCBGVVRVUkVfTkVTVEVEX1NDT1BFUykgPT0gMCkgewotCQkJY29udGludWU7Ci0JCX0gZWxzZSBpZiAoc3RyY21wKGZlYXR1cmUsIEZVVFVSRV9HRU5FUkFUT1JTKSA9PSAwKSB7Ci0JCQljb250aW51ZTsKLQkJfSBlbHNlIGlmIChzdHJjbXAoZmVhdHVyZSwgRlVUVVJFX0RJVklTSU9OKSA9PSAwKSB7Ci0JCQlmZi0+ZmZfZmVhdHVyZXMgfD0gQ09fRlVUVVJFX0RJVklTSU9OOwotCQl9IGVsc2UgaWYgKHN0cmNtcChmZWF0dXJlLCBGVVRVUkVfQUJTT0xVVEVfSU1QT1JUKSA9PSAwKSB7Ci0JCQlmZi0+ZmZfZmVhdHVyZXMgfD0gQ09fRlVUVVJFX0FCU09MVVRFX0lNUE9SVDsKLQkJfSBlbHNlIGlmIChzdHJjbXAoZmVhdHVyZSwgRlVUVVJFX1dJVEhfU1RBVEVNRU5UKSA9PSAwKSB7Ci0JCQlmZi0+ZmZfZmVhdHVyZXMgfD0gQ09fRlVUVVJFX1dJVEhfU1RBVEVNRU5UOwotCQl9IGVsc2UgaWYgKHN0cmNtcChmZWF0dXJlLCBGVVRVUkVfUFJJTlRfRlVOQ1RJT04pID09IDApIHsKLQkJCWZmLT5mZl9mZWF0dXJlcyB8PSBDT19GVVRVUkVfUFJJTlRfRlVOQ1RJT047Ci0JCX0gZWxzZSBpZiAoc3RyY21wKGZlYXR1cmUsIEZVVFVSRV9VTklDT0RFX0xJVEVSQUxTKSA9PSAwKSB7Ci0JCQlmZi0+ZmZfZmVhdHVyZXMgfD0gQ09fRlVUVVJFX1VOSUNPREVfTElURVJBTFM7Ci0JCX0gZWxzZSBpZiAoc3RyY21wKGZlYXR1cmUsICJicmFjZXMiKSA9PSAwKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3ludGF4RXJyb3IsCi0JCQkJCSJub3QgYSBjaGFuY2UiKTsKLQkJCVB5RXJyX1N5bnRheExvY2F0aW9uKGZpbGVuYW1lLCBzLT5saW5lbm8pOwotCQkJcmV0dXJuIDA7Ci0JCX0gZWxzZSB7Ci0JCQlQeUVycl9Gb3JtYXQoUHlFeGNfU3ludGF4RXJyb3IsCi0JCQkJICAgICBVTkRFRklORURfRlVUVVJFX0ZFQVRVUkUsIGZlYXR1cmUpOwotCQkJUHlFcnJfU3ludGF4TG9jYXRpb24oZmlsZW5hbWUsIHMtPmxpbmVubyk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQlyZXR1cm4gMTsKKyAgICBuYW1lcyA9IHMtPnYuSW1wb3J0RnJvbS5uYW1lczsKKyAgICBmb3IgKGkgPSAwOyBpIDwgYXNkbF9zZXFfTEVOKG5hbWVzKTsgaSsrKSB7CisgICAgICAgIGFsaWFzX3R5IG5hbWUgPSAoYWxpYXNfdHkpYXNkbF9zZXFfR0VUKG5hbWVzLCBpKTsKKyAgICAgICAgY29uc3QgY2hhciAqZmVhdHVyZSA9IFB5U3RyaW5nX0FzU3RyaW5nKG5hbWUtPm5hbWUpOworICAgICAgICBpZiAoIWZlYXR1cmUpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgaWYgKHN0cmNtcChmZWF0dXJlLCBGVVRVUkVfTkVTVEVEX1NDT1BFUykgPT0gMCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGZlYXR1cmUsIEZVVFVSRV9HRU5FUkFUT1JTKSA9PSAwKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAoZmVhdHVyZSwgRlVUVVJFX0RJVklTSU9OKSA9PSAwKSB7CisgICAgICAgICAgICBmZi0+ZmZfZmVhdHVyZXMgfD0gQ09fRlVUVVJFX0RJVklTSU9OOworICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChmZWF0dXJlLCBGVVRVUkVfQUJTT0xVVEVfSU1QT1JUKSA9PSAwKSB7CisgICAgICAgICAgICBmZi0+ZmZfZmVhdHVyZXMgfD0gQ09fRlVUVVJFX0FCU09MVVRFX0lNUE9SVDsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAoZmVhdHVyZSwgRlVUVVJFX1dJVEhfU1RBVEVNRU5UKSA9PSAwKSB7CisgICAgICAgICAgICBmZi0+ZmZfZmVhdHVyZXMgfD0gQ09fRlVUVVJFX1dJVEhfU1RBVEVNRU5UOworICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChmZWF0dXJlLCBGVVRVUkVfUFJJTlRfRlVOQ1RJT04pID09IDApIHsKKyAgICAgICAgICAgIGZmLT5mZl9mZWF0dXJlcyB8PSBDT19GVVRVUkVfUFJJTlRfRlVOQ1RJT047CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGZlYXR1cmUsIEZVVFVSRV9VTklDT0RFX0xJVEVSQUxTKSA9PSAwKSB7CisgICAgICAgICAgICBmZi0+ZmZfZmVhdHVyZXMgfD0gQ09fRlVUVVJFX1VOSUNPREVfTElURVJBTFM7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGZlYXR1cmUsICJicmFjZXMiKSA9PSAwKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3ludGF4RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vdCBhIGNoYW5jZSIpOworICAgICAgICAgICAgUHlFcnJfU3ludGF4TG9jYXRpb24oZmlsZW5hbWUsIHMtPmxpbmVubyk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19TeW50YXhFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBVTkRFRklORURfRlVUVVJFX0ZFQVRVUkUsIGZlYXR1cmUpOworICAgICAgICAgICAgUHlFcnJfU3ludGF4TG9jYXRpb24oZmlsZW5hbWUsIHMtPmxpbmVubyk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIGludAogZnV0dXJlX3BhcnNlKFB5RnV0dXJlRmVhdHVyZXMgKmZmLCBtb2RfdHkgbW9kLCBjb25zdCBjaGFyICpmaWxlbmFtZSkKIHsKLQlpbnQgaSwgZm91bmRfZG9jc3RyaW5nID0gMCwgZG9uZSA9IDAsIHByZXZfbGluZSA9IDA7CisgICAgaW50IGksIGZvdW5kX2RvY3N0cmluZyA9IDAsIGRvbmUgPSAwLCBwcmV2X2xpbmUgPSAwOwogCi0Jc3RhdGljIFB5T2JqZWN0ICpmdXR1cmU7Ci0JaWYgKCFmdXR1cmUpIHsKLQkJZnV0dXJlID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19mdXR1cmVfXyIpOwotCQlpZiAoIWZ1dHVyZSkKLQkJCXJldHVybiAwOwotCX0KKyAgICBzdGF0aWMgUHlPYmplY3QgKmZ1dHVyZTsKKyAgICBpZiAoIWZ1dHVyZSkgeworICAgICAgICBmdXR1cmUgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2Z1dHVyZV9fIik7CisgICAgICAgIGlmICghZnV0dXJlKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCi0JaWYgKCEobW9kLT5raW5kID09IE1vZHVsZV9raW5kIHx8IG1vZC0+a2luZCA9PSBJbnRlcmFjdGl2ZV9raW5kKSkKLQkJcmV0dXJuIDE7CisgICAgaWYgKCEobW9kLT5raW5kID09IE1vZHVsZV9raW5kIHx8IG1vZC0+a2luZCA9PSBJbnRlcmFjdGl2ZV9raW5kKSkKKyAgICAgICAgcmV0dXJuIDE7CiAKLQkvKiBBIHN1YnNlcXVlbnQgcGFzcyB3aWxsIGRldGVjdCBmdXR1cmUgaW1wb3J0cyB0aGF0IGRvbid0Ci0JICAgYXBwZWFyIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUuICBUaGVyZSdzIG9uZSBjYXNlLAotCSAgIGhvd2V2ZXIsIHRoYXQgaXMgZWFzaWVyIHRvIGhhbmRsZSBoZXJlOiBBIHNlcmllcyBvZiBpbXBvcnRzCi0JICAgam9pbmVkIGJ5IHNlbWktY29sb25zLCB3aGVyZSB0aGUgZmlyc3QgaW1wb3J0IGlzIGEgZnV0dXJlCi0JICAgc3RhdGVtZW50IGJ1dCBzb21lIHN1YnNlcXVlbnQgaW1wb3J0IGhhcyB0aGUgZnV0dXJlIGZvcm0KLQkgICBidXQgaXMgcHJlY2VkZWQgYnkgYSByZWd1bGFyIGltcG9ydC4KLQkqLwotCSAgIAorICAgIC8qIEEgc3Vic2VxdWVudCBwYXNzIHdpbGwgZGV0ZWN0IGZ1dHVyZSBpbXBvcnRzIHRoYXQgZG9uJ3QKKyAgICAgICBhcHBlYXIgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZS4gIFRoZXJlJ3Mgb25lIGNhc2UsCisgICAgICAgaG93ZXZlciwgdGhhdCBpcyBlYXNpZXIgdG8gaGFuZGxlIGhlcmU6IEEgc2VyaWVzIG9mIGltcG9ydHMKKyAgICAgICBqb2luZWQgYnkgc2VtaS1jb2xvbnMsIHdoZXJlIHRoZSBmaXJzdCBpbXBvcnQgaXMgYSBmdXR1cmUKKyAgICAgICBzdGF0ZW1lbnQgYnV0IHNvbWUgc3Vic2VxdWVudCBpbXBvcnQgaGFzIHRoZSBmdXR1cmUgZm9ybQorICAgICAgIGJ1dCBpcyBwcmVjZWRlZCBieSBhIHJlZ3VsYXIgaW1wb3J0LgorICAgICovCiAKLQlmb3IgKGkgPSAwOyBpIDwgYXNkbF9zZXFfTEVOKG1vZC0+di5Nb2R1bGUuYm9keSk7IGkrKykgewotCQlzdG10X3R5IHMgPSAoc3RtdF90eSlhc2RsX3NlcV9HRVQobW9kLT52Lk1vZHVsZS5ib2R5LCBpKTsKIAotCQlpZiAoZG9uZSAmJiBzLT5saW5lbm8gPiBwcmV2X2xpbmUpCi0JCQlyZXR1cm4gMTsKLQkJcHJldl9saW5lID0gcy0+bGluZW5vOworICAgIGZvciAoaSA9IDA7IGkgPCBhc2RsX3NlcV9MRU4obW9kLT52Lk1vZHVsZS5ib2R5KTsgaSsrKSB7CisgICAgICAgIHN0bXRfdHkgcyA9IChzdG10X3R5KWFzZGxfc2VxX0dFVChtb2QtPnYuTW9kdWxlLmJvZHksIGkpOwogCi0JCS8qIFRoZSB0ZXN0cyBiZWxvdyB3aWxsIHJldHVybiBmcm9tIHRoaXMgZnVuY3Rpb24gdW5sZXNzIGl0IGlzCi0JCSAgIHN0aWxsIHBvc3NpYmxlIHRvIGZpbmQgYSBmdXR1cmUgc3RhdGVtZW50LiAgVGhlIG9ubHkgdGhpbmdzCi0JCSAgIHRoYXQgY2FuIHByZWNlZGUgYSBmdXR1cmUgc3RhdGVtZW50IGFyZSBhbm90aGVyIGZ1dHVyZQotCQkgICBzdGF0ZW1lbnQgYW5kIGEgZG9jIHN0cmluZy4KLQkJKi8KKyAgICAgICAgaWYgKGRvbmUgJiYgcy0+bGluZW5vID4gcHJldl9saW5lKQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIHByZXZfbGluZSA9IHMtPmxpbmVubzsKIAotCQlpZiAocy0+a2luZCA9PSBJbXBvcnRGcm9tX2tpbmQpIHsKLQkJCWlmIChzLT52LkltcG9ydEZyb20ubW9kdWxlID09IGZ1dHVyZSkgewotCQkJCWlmIChkb25lKSB7Ci0JCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19TeW50YXhFcnJvciwKLQkJCQkJCQlFUlJfTEFURV9GVVRVUkUpOwotCQkJCQlQeUVycl9TeW50YXhMb2NhdGlvbihmaWxlbmFtZSwgCi0JCQkJCQkJICAgICBzLT5saW5lbm8pOwotCQkJCQlyZXR1cm4gMDsKLQkJCQl9Ci0JCQkJaWYgKCFmdXR1cmVfY2hlY2tfZmVhdHVyZXMoZmYsIHMsIGZpbGVuYW1lKSkKLQkJCQkJcmV0dXJuIDA7Ci0JCQkJZmYtPmZmX2xpbmVubyA9IHMtPmxpbmVubzsKLQkJCX0KLQkJCWVsc2UKLQkJCQlkb25lID0gMTsKLQkJfQotCQllbHNlIGlmIChzLT5raW5kID09IEV4cHJfa2luZCAmJiAhZm91bmRfZG9jc3RyaW5nKSB7Ci0JCQlleHByX3R5IGUgPSBzLT52LkV4cHIudmFsdWU7Ci0JCQlpZiAoZS0+a2luZCAhPSBTdHJfa2luZCkKLQkJCQlkb25lID0gMTsKLQkJCWVsc2UKLQkJCQlmb3VuZF9kb2NzdHJpbmcgPSAxOwotCQl9Ci0JCWVsc2UKLQkJCWRvbmUgPSAxOwotCX0KLQlyZXR1cm4gMTsKKyAgICAgICAgLyogVGhlIHRlc3RzIGJlbG93IHdpbGwgcmV0dXJuIGZyb20gdGhpcyBmdW5jdGlvbiB1bmxlc3MgaXQgaXMKKyAgICAgICAgICAgc3RpbGwgcG9zc2libGUgdG8gZmluZCBhIGZ1dHVyZSBzdGF0ZW1lbnQuICBUaGUgb25seSB0aGluZ3MKKyAgICAgICAgICAgdGhhdCBjYW4gcHJlY2VkZSBhIGZ1dHVyZSBzdGF0ZW1lbnQgYXJlIGFub3RoZXIgZnV0dXJlCisgICAgICAgICAgIHN0YXRlbWVudCBhbmQgYSBkb2Mgc3RyaW5nLgorICAgICAgICAqLworCisgICAgICAgIGlmIChzLT5raW5kID09IEltcG9ydEZyb21fa2luZCkgeworICAgICAgICAgICAgaWYgKHMtPnYuSW1wb3J0RnJvbS5tb2R1bGUgPT0gZnV0dXJlKSB7CisgICAgICAgICAgICAgICAgaWYgKGRvbmUpIHsKKyAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5bnRheEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJSX0xBVEVfRlVUVVJFKTsKKyAgICAgICAgICAgICAgICAgICAgUHlFcnJfU3ludGF4TG9jYXRpb24oZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmxpbmVubyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIWZ1dHVyZV9jaGVja19mZWF0dXJlcyhmZiwgcywgZmlsZW5hbWUpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICBmZi0+ZmZfbGluZW5vID0gcy0+bGluZW5vOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGRvbmUgPSAxOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHMtPmtpbmQgPT0gRXhwcl9raW5kICYmICFmb3VuZF9kb2NzdHJpbmcpIHsKKyAgICAgICAgICAgIGV4cHJfdHkgZSA9IHMtPnYuRXhwci52YWx1ZTsKKyAgICAgICAgICAgIGlmIChlLT5raW5kICE9IFN0cl9raW5kKQorICAgICAgICAgICAgICAgIGRvbmUgPSAxOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGZvdW5kX2RvY3N0cmluZyA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZG9uZSA9IDE7CisgICAgfQorICAgIHJldHVybiAxOwogfQogCiAKIFB5RnV0dXJlRmVhdHVyZXMgKgogUHlGdXR1cmVfRnJvbUFTVChtb2RfdHkgbW9kLCBjb25zdCBjaGFyICpmaWxlbmFtZSkKIHsKLQlQeUZ1dHVyZUZlYXR1cmVzICpmZjsKKyAgICBQeUZ1dHVyZUZlYXR1cmVzICpmZjsKIAotCWZmID0gKFB5RnV0dXJlRmVhdHVyZXMgKilQeU9iamVjdF9NYWxsb2Moc2l6ZW9mKFB5RnV0dXJlRmVhdHVyZXMpKTsKLQlpZiAoZmYgPT0gTlVMTCkgewotCQlQeUVycl9Ob01lbW9yeSgpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZmYtPmZmX2ZlYXR1cmVzID0gMDsKLQlmZi0+ZmZfbGluZW5vID0gLTE7CisgICAgZmYgPSAoUHlGdXR1cmVGZWF0dXJlcyAqKVB5T2JqZWN0X01hbGxvYyhzaXplb2YoUHlGdXR1cmVGZWF0dXJlcykpOworICAgIGlmIChmZiA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBmZi0+ZmZfZmVhdHVyZXMgPSAwOworICAgIGZmLT5mZl9saW5lbm8gPSAtMTsKIAotCWlmICghZnV0dXJlX3BhcnNlKGZmLCBtb2QsIGZpbGVuYW1lKSkgewotCQlQeU9iamVjdF9GcmVlKGZmKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBmZjsKKyAgICBpZiAoIWZ1dHVyZV9wYXJzZShmZiwgbW9kLCBmaWxlbmFtZSkpIHsKKyAgICAgICAgUHlPYmplY3RfRnJlZShmZik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gZmY7CiB9CmRpZmYgLS1naXQgYS9QeXRob24vZ2V0YXJncy5jIGIvUHl0aG9uL2dldGFyZ3MuYwppbmRleCBkMjQ4NTdkLi5iMzllMDdlIDEwMDY0NAotLS0gYS9QeXRob24vZ2V0YXJncy5jCisrKyBiL1B5dGhvbi9nZXRhcmdzLmMKQEAgLTcsMTYgKzcsMTYgQEAKIAogCiAjaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgeyAKK2V4dGVybiAiQyIgewogI2VuZGlmCiBpbnQgUHlBcmdfUGFyc2UoUHlPYmplY3QgKiwgY29uc3QgY2hhciAqLCAuLi4pOwogaW50IFB5QXJnX1BhcnNlVHVwbGUoUHlPYmplY3QgKiwgY29uc3QgY2hhciAqLCAuLi4pOwogaW50IFB5QXJnX1ZhUGFyc2UoUHlPYmplY3QgKiwgY29uc3QgY2hhciAqLCB2YV9saXN0KTsKIAogaW50IFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhQeU9iamVjdCAqLCBQeU9iamVjdCAqLAotCQkJCWNvbnN0IGNoYXIgKiwgY2hhciAqKiwgLi4uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqLCBjaGFyICoqLCAuLi4pOwogaW50IFB5QXJnX1ZhUGFyc2VUdXBsZUFuZEtleXdvcmRzKFB5T2JqZWN0ICosIFB5T2JqZWN0ICosCi0JCQkJY29uc3QgY2hhciAqLCBjaGFyICoqLCB2YV9saXN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqLCBjaGFyICoqLCB2YV9saXN0KTsKIAogI2lmZGVmIEhBVkVfREVDTFNQRUNfRExMCiAvKiBFeHBvcnQgZnVuY3Rpb25zICovCkBAIC0zNywxMDMgKzM3LDEwMyBAQAogLyogRm9yd2FyZCAqLwogc3RhdGljIGludCB2Z2V0YXJnczEoUHlPYmplY3QgKiwgY29uc3QgY2hhciAqLCB2YV9saXN0ICosIGludCk7CiBzdGF0aWMgdm9pZCBzZXRlcnJvcihpbnQsIGNvbnN0IGNoYXIgKiwgaW50ICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKLXN0YXRpYyBjaGFyICpjb252ZXJ0aXRlbShQeU9iamVjdCAqLCBjb25zdCBjaGFyICoqLCB2YV9saXN0ICosIGludCwgaW50ICosIAorc3RhdGljIGNoYXIgKmNvbnZlcnRpdGVtKFB5T2JqZWN0ICosIGNvbnN0IGNoYXIgKiosIHZhX2xpc3QgKiwgaW50LCBpbnQgKiwKICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICosIHNpemVfdCwgUHlPYmplY3QgKiopOwogc3RhdGljIGNoYXIgKmNvbnZlcnR0dXBsZShQeU9iamVjdCAqLCBjb25zdCBjaGFyICoqLCB2YV9saXN0ICosIGludCwKLQkJCSAgaW50ICosIGNoYXIgKiwgc2l6ZV90LCBpbnQsIFB5T2JqZWN0ICoqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICosIGNoYXIgKiwgc2l6ZV90LCBpbnQsIFB5T2JqZWN0ICoqKTsKIHN0YXRpYyBjaGFyICpjb252ZXJ0c2ltcGxlKFB5T2JqZWN0ICosIGNvbnN0IGNoYXIgKiosIHZhX2xpc3QgKiwgaW50LCBjaGFyICosCi0JCQkgICBzaXplX3QsIFB5T2JqZWN0ICoqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCwgUHlPYmplY3QgKiopOwogc3RhdGljIFB5X3NzaXplX3QgY29udmVydGJ1ZmZlcihQeU9iamVjdCAqLCB2b2lkICoqcCwgY2hhciAqKik7CiBzdGF0aWMgaW50IGdldGJ1ZmZlcihQeU9iamVjdCAqLCBQeV9idWZmZXIgKiwgY2hhcioqKTsKIAogc3RhdGljIGludCB2Z2V0YXJnc2tleXdvcmRzKFB5T2JqZWN0ICosIFB5T2JqZWN0ICosCi0JCQkgICAgY29uc3QgY2hhciAqLCBjaGFyICoqLCB2YV9saXN0ICosIGludCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqLCBjaGFyICoqLCB2YV9saXN0ICosIGludCk7CiBzdGF0aWMgY2hhciAqc2tpcGl0ZW0oY29uc3QgY2hhciAqKiwgdmFfbGlzdCAqLCBpbnQpOwogCiBpbnQKIFB5QXJnX1BhcnNlKFB5T2JqZWN0ICphcmdzLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKIHsKLQlpbnQgcmV0dmFsOwotCXZhX2xpc3QgdmE7Ci0JCi0JdmFfc3RhcnQodmEsIGZvcm1hdCk7Ci0JcmV0dmFsID0gdmdldGFyZ3MxKGFyZ3MsIGZvcm1hdCwgJnZhLCBGTEFHX0NPTVBBVCk7Ci0JdmFfZW5kKHZhKTsKLQlyZXR1cm4gcmV0dmFsOworICAgIGludCByZXR2YWw7CisgICAgdmFfbGlzdCB2YTsKKworICAgIHZhX3N0YXJ0KHZhLCBmb3JtYXQpOworICAgIHJldHZhbCA9IHZnZXRhcmdzMShhcmdzLCBmb3JtYXQsICZ2YSwgRkxBR19DT01QQVQpOworICAgIHZhX2VuZCh2YSk7CisgICAgcmV0dXJuIHJldHZhbDsKIH0KIAogaW50CiBfUHlBcmdfUGFyc2VfU2l6ZVQoUHlPYmplY3QgKmFyZ3MsIGNoYXIgKmZvcm1hdCwgLi4uKQogewotCWludCByZXR2YWw7Ci0JdmFfbGlzdCB2YTsKLQkKLQl2YV9zdGFydCh2YSwgZm9ybWF0KTsKLQlyZXR2YWwgPSB2Z2V0YXJnczEoYXJncywgZm9ybWF0LCAmdmEsIEZMQUdfQ09NUEFUfEZMQUdfU0laRV9UKTsKLQl2YV9lbmQodmEpOwotCXJldHVybiByZXR2YWw7CisgICAgaW50IHJldHZhbDsKKyAgICB2YV9saXN0IHZhOworCisgICAgdmFfc3RhcnQodmEsIGZvcm1hdCk7CisgICAgcmV0dmFsID0gdmdldGFyZ3MxKGFyZ3MsIGZvcm1hdCwgJnZhLCBGTEFHX0NPTVBBVHxGTEFHX1NJWkVfVCk7CisgICAgdmFfZW5kKHZhKTsKKyAgICByZXR1cm4gcmV0dmFsOwogfQogCiAKIGludAogUHlBcmdfUGFyc2VUdXBsZShQeU9iamVjdCAqYXJncywgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCiB7Ci0JaW50IHJldHZhbDsKLQl2YV9saXN0IHZhOwotCQotCXZhX3N0YXJ0KHZhLCBmb3JtYXQpOwotCXJldHZhbCA9IHZnZXRhcmdzMShhcmdzLCBmb3JtYXQsICZ2YSwgMCk7Ci0JdmFfZW5kKHZhKTsKLQlyZXR1cm4gcmV0dmFsOworICAgIGludCByZXR2YWw7CisgICAgdmFfbGlzdCB2YTsKKworICAgIHZhX3N0YXJ0KHZhLCBmb3JtYXQpOworICAgIHJldHZhbCA9IHZnZXRhcmdzMShhcmdzLCBmb3JtYXQsICZ2YSwgMCk7CisgICAgdmFfZW5kKHZhKTsKKyAgICByZXR1cm4gcmV0dmFsOwogfQogCiBpbnQKIF9QeUFyZ19QYXJzZVR1cGxlX1NpemVUKFB5T2JqZWN0ICphcmdzLCBjaGFyICpmb3JtYXQsIC4uLikKIHsKLQlpbnQgcmV0dmFsOwotCXZhX2xpc3QgdmE7Ci0JCi0JdmFfc3RhcnQodmEsIGZvcm1hdCk7Ci0JcmV0dmFsID0gdmdldGFyZ3MxKGFyZ3MsIGZvcm1hdCwgJnZhLCBGTEFHX1NJWkVfVCk7Ci0JdmFfZW5kKHZhKTsKLQlyZXR1cm4gcmV0dmFsOworICAgIGludCByZXR2YWw7CisgICAgdmFfbGlzdCB2YTsKKworICAgIHZhX3N0YXJ0KHZhLCBmb3JtYXQpOworICAgIHJldHZhbCA9IHZnZXRhcmdzMShhcmdzLCBmb3JtYXQsICZ2YSwgRkxBR19TSVpFX1QpOworICAgIHZhX2VuZCh2YSk7CisgICAgcmV0dXJuIHJldHZhbDsKIH0KIAogCiBpbnQKIFB5QXJnX1ZhUGFyc2UoUHlPYmplY3QgKmFyZ3MsIGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCB2YSkKIHsKLQl2YV9saXN0IGx2YTsKKyAgICB2YV9saXN0IGx2YTsKIAogI2lmZGVmIFZBX0xJU1RfSVNfQVJSQVkKLQltZW1jcHkobHZhLCB2YSwgc2l6ZW9mKHZhX2xpc3QpKTsKKyAgICBtZW1jcHkobHZhLCB2YSwgc2l6ZW9mKHZhX2xpc3QpKTsKICNlbHNlCiAjaWZkZWYgX192YV9jb3B5Ci0JX192YV9jb3B5KGx2YSwgdmEpOworICAgIF9fdmFfY29weShsdmEsIHZhKTsKICNlbHNlCi0JbHZhID0gdmE7CisgICAgbHZhID0gdmE7CiAjZW5kaWYKICNlbmRpZgogCi0JcmV0dXJuIHZnZXRhcmdzMShhcmdzLCBmb3JtYXQsICZsdmEsIDApOworICAgIHJldHVybiB2Z2V0YXJnczEoYXJncywgZm9ybWF0LCAmbHZhLCAwKTsKIH0KIAogaW50CiBfUHlBcmdfVmFQYXJzZV9TaXplVChQeU9iamVjdCAqYXJncywgY2hhciAqZm9ybWF0LCB2YV9saXN0IHZhKQogewotCXZhX2xpc3QgbHZhOworICAgIHZhX2xpc3QgbHZhOwogCiAjaWZkZWYgVkFfTElTVF9JU19BUlJBWQotCW1lbWNweShsdmEsIHZhLCBzaXplb2YodmFfbGlzdCkpOworICAgIG1lbWNweShsdmEsIHZhLCBzaXplb2YodmFfbGlzdCkpOwogI2Vsc2UKICNpZmRlZiBfX3ZhX2NvcHkKLQlfX3ZhX2NvcHkobHZhLCB2YSk7CisgICAgX192YV9jb3B5KGx2YSwgdmEpOwogI2Vsc2UKLQlsdmEgPSB2YTsKKyAgICBsdmEgPSB2YTsKICNlbmRpZgogI2VuZGlmCiAKLQlyZXR1cm4gdmdldGFyZ3MxKGFyZ3MsIGZvcm1hdCwgJmx2YSwgRkxBR19TSVpFX1QpOworICAgIHJldHVybiB2Z2V0YXJnczEoYXJncywgZm9ybWF0LCAmbHZhLCBGTEFHX1NJWkVfVCk7CiB9CiAKIApAQCAtMTQyLDIwNiArMTQyLDIwNiBAQAogc3RhdGljIHZvaWQKIGNsZWFudXBfcHRyKHZvaWQgKnB0cikKIHsKLQlQeU1lbV9GUkVFKHB0cik7CisgICAgUHlNZW1fRlJFRShwdHIpOwogfQogCiBzdGF0aWMgdm9pZAogY2xlYW51cF9idWZmZXIodm9pZCAqcHRyKQogewotCVB5QnVmZmVyX1JlbGVhc2UoKFB5X2J1ZmZlciAqKSBwdHIpOworICAgIFB5QnVmZmVyX1JlbGVhc2UoKFB5X2J1ZmZlciAqKSBwdHIpOwogfQogCiBzdGF0aWMgaW50CiBhZGRjbGVhbnVwKHZvaWQgKnB0ciwgUHlPYmplY3QgKipmcmVlbGlzdCwgdm9pZCAoKmRlc3RyKSh2b2lkICopKQogewotCVB5T2JqZWN0ICpjb2JqOwotCWlmICghKmZyZWVsaXN0KSB7Ci0JCSpmcmVlbGlzdCA9IFB5TGlzdF9OZXcoMCk7Ci0JCWlmICghKmZyZWVsaXN0KSB7Ci0JCQlkZXN0cihwdHIpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQotCWNvYmogPSBQeUNPYmplY3RfRnJvbVZvaWRQdHIocHRyLCBkZXN0cik7Ci0JaWYgKCFjb2JqKSB7Ci0JCWRlc3RyKHB0cik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKFB5TGlzdF9BcHBlbmQoKmZyZWVsaXN0LCBjb2JqKSkgewotCQlQeV9ERUNSRUYoY29iaik7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgUHlPYmplY3QgKmNvYmo7CisgICAgaWYgKCEqZnJlZWxpc3QpIHsKKyAgICAgICAgKmZyZWVsaXN0ID0gUHlMaXN0X05ldygwKTsKKyAgICAgICAgaWYgKCEqZnJlZWxpc3QpIHsKKyAgICAgICAgICAgIGRlc3RyKHB0cik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisgICAgY29iaiA9IFB5Q09iamVjdF9Gcm9tVm9pZFB0cihwdHIsIGRlc3RyKTsKKyAgICBpZiAoIWNvYmopIHsKKyAgICAgICAgZGVzdHIocHRyKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoUHlMaXN0X0FwcGVuZCgqZnJlZWxpc3QsIGNvYmopKSB7CiAgICAgICAgIFB5X0RFQ1JFRihjb2JqKTsKLQlyZXR1cm4gMDsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBQeV9ERUNSRUYoY29iaik7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIGNsZWFucmV0dXJuKGludCByZXR2YWwsIFB5T2JqZWN0ICpmcmVlbGlzdCkKIHsKLQlpZiAoZnJlZWxpc3QgJiYgcmV0dmFsICE9IDApIHsKLQkJLyogV2Ugd2VyZSBzdWNjZXNzZnVsLCByZXNldCB0aGUgZGVzdHJ1Y3RvcnMgc28gdGhhdCB0aGV5Ci0JCSAgIGRvbid0IGdldCBjYWxsZWQuICovCi0JCVB5X3NzaXplX3QgbGVuID0gUHlMaXN0X0dFVF9TSVpFKGZyZWVsaXN0KSwgaTsKLQkJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQotCQkJKChQeUNPYmplY3QgKikgUHlMaXN0X0dFVF9JVEVNKGZyZWVsaXN0LCBpKSkKLQkJCQktPmRlc3RydWN0b3IgPSBOVUxMOwotCX0KLQlQeV9YREVDUkVGKGZyZWVsaXN0KTsKLQlyZXR1cm4gcmV0dmFsOworICAgIGlmIChmcmVlbGlzdCAmJiByZXR2YWwgIT0gMCkgeworICAgICAgICAvKiBXZSB3ZXJlIHN1Y2Nlc3NmdWwsIHJlc2V0IHRoZSBkZXN0cnVjdG9ycyBzbyB0aGF0IHRoZXkKKyAgICAgICAgICAgZG9uJ3QgZ2V0IGNhbGxlZC4gKi8KKyAgICAgICAgUHlfc3NpemVfdCBsZW4gPSBQeUxpc3RfR0VUX1NJWkUoZnJlZWxpc3QpLCBpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisgICAgICAgICAgICAoKFB5Q09iamVjdCAqKSBQeUxpc3RfR0VUX0lURU0oZnJlZWxpc3QsIGkpKQorICAgICAgICAgICAgICAgIC0+ZGVzdHJ1Y3RvciA9IE5VTEw7CisgICAgfQorICAgIFB5X1hERUNSRUYoZnJlZWxpc3QpOworICAgIHJldHVybiByZXR2YWw7CiB9CiAKIAogc3RhdGljIGludAogdmdldGFyZ3MxKFB5T2JqZWN0ICphcmdzLCBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgKnBfdmEsIGludCBmbGFncykKIHsKLQljaGFyIG1zZ2J1ZlsyNTZdOwotCWludCBsZXZlbHNbMzJdOwotCWNvbnN0IGNoYXIgKmZuYW1lID0gTlVMTDsKLQljb25zdCBjaGFyICptZXNzYWdlID0gTlVMTDsKLQlpbnQgbWluID0gLTE7Ci0JaW50IG1heCA9IDA7Ci0JaW50IGxldmVsID0gMDsKLQlpbnQgZW5kZm10ID0gMDsKLQljb25zdCBjaGFyICpmb3JtYXRzYXZlID0gZm9ybWF0OwotCVB5X3NzaXplX3QgaSwgbGVuOwotCWNoYXIgKm1zZzsKLQlQeU9iamVjdCAqZnJlZWxpc3QgPSBOVUxMOwotCWludCBjb21wYXQgPSBmbGFncyAmIEZMQUdfQ09NUEFUOworICAgIGNoYXIgbXNnYnVmWzI1Nl07CisgICAgaW50IGxldmVsc1szMl07CisgICAgY29uc3QgY2hhciAqZm5hbWUgPSBOVUxMOworICAgIGNvbnN0IGNoYXIgKm1lc3NhZ2UgPSBOVUxMOworICAgIGludCBtaW4gPSAtMTsKKyAgICBpbnQgbWF4ID0gMDsKKyAgICBpbnQgbGV2ZWwgPSAwOworICAgIGludCBlbmRmbXQgPSAwOworICAgIGNvbnN0IGNoYXIgKmZvcm1hdHNhdmUgPSBmb3JtYXQ7CisgICAgUHlfc3NpemVfdCBpLCBsZW47CisgICAgY2hhciAqbXNnOworICAgIFB5T2JqZWN0ICpmcmVlbGlzdCA9IE5VTEw7CisgICAgaW50IGNvbXBhdCA9IGZsYWdzICYgRkxBR19DT01QQVQ7CiAKLQlhc3NlcnQoY29tcGF0IHx8IChhcmdzICE9IChQeU9iamVjdCopTlVMTCkpOwotCWZsYWdzID0gZmxhZ3MgJiB+RkxBR19DT01QQVQ7CisgICAgYXNzZXJ0KGNvbXBhdCB8fCAoYXJncyAhPSAoUHlPYmplY3QqKU5VTEwpKTsKKyAgICBmbGFncyA9IGZsYWdzICYgfkZMQUdfQ09NUEFUOwogCi0Jd2hpbGUgKGVuZGZtdCA9PSAwKSB7Ci0JCWludCBjID0gKmZvcm1hdCsrOwotCQlzd2l0Y2ggKGMpIHsKLQkJY2FzZSAnKCc6Ci0JCQlpZiAobGV2ZWwgPT0gMCkKLQkJCQltYXgrKzsKLQkJCWxldmVsKys7Ci0JCQlpZiAobGV2ZWwgPj0gMzApCi0JCQkJUHlfRmF0YWxFcnJvcigidG9vIG1hbnkgdHVwbGUgbmVzdGluZyBsZXZlbHMgIgotCQkJCQkgICAgICAiaW4gYXJndW1lbnQgZm9ybWF0IHN0cmluZyIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgJyknOgotCQkJaWYgKGxldmVsID09IDApCi0JCQkJUHlfRmF0YWxFcnJvcigiZXhjZXNzICcpJyBpbiBnZXRhcmdzIGZvcm1hdCIpOwotCQkJZWxzZQotCQkJCWxldmVsLS07Ci0JCQlicmVhazsKLQkJY2FzZSAnXDAnOgotCQkJZW5kZm10ID0gMTsKLQkJCWJyZWFrOwotCQljYXNlICc6JzoKLQkJCWZuYW1lID0gZm9ybWF0OwotCQkJZW5kZm10ID0gMTsKLQkJCWJyZWFrOwotCQljYXNlICc7JzoKLQkJCW1lc3NhZ2UgPSBmb3JtYXQ7Ci0JCQllbmRmbXQgPSAxOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlpZiAobGV2ZWwgPT0gMCkgewotCQkJCWlmIChjID09ICdPJykKLQkJCQkJbWF4Kys7Ci0JCQkJZWxzZSBpZiAoaXNhbHBoYShQeV9DSEFSTUFTSyhjKSkpIHsKLQkJCQkJaWYgKGMgIT0gJ2UnKSAvKiBza2lwIGVuY29kZWQgKi8KLQkJCQkJCW1heCsrOwotCQkJCX0gZWxzZSBpZiAoYyA9PSAnfCcpCi0JCQkJCW1pbiA9IG1heDsKLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0JfQotCQotCWlmIChsZXZlbCAhPSAwKQotCQlQeV9GYXRhbEVycm9yKC8qICcoJyAqLyAibWlzc2luZyAnKScgaW4gZ2V0YXJncyBmb3JtYXQiKTsKLQkKLQlpZiAobWluIDwgMCkKLQkJbWluID0gbWF4OwotCQotCWZvcm1hdCA9IGZvcm1hdHNhdmU7Ci0JCi0JaWYgKGNvbXBhdCkgewotCQlpZiAobWF4ID09IDApIHsKLQkJCWlmIChhcmdzID09IE5VTEwpCi0JCQkJcmV0dXJuIDE7Ci0JCQlQeU9TX3NucHJpbnRmKG1zZ2J1Ziwgc2l6ZW9mKG1zZ2J1ZiksCi0JCQkJICAgICAgIiUuMjAwcyVzIHRha2VzIG5vIGFyZ3VtZW50cyIsCi0JCQkJICAgICAgZm5hbWU9PU5VTEwgPyAiZnVuY3Rpb24iIDogZm5hbWUsCi0JCQkJICAgICAgZm5hbWU9PU5VTEwgPyAiIiA6ICIoKSIpOwotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgbXNnYnVmKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JCWVsc2UgaWYgKG1pbiA9PSAxICYmIG1heCA9PSAxKSB7Ci0JCQlpZiAoYXJncyA9PSBOVUxMKSB7Ci0JCQkJUHlPU19zbnByaW50Zihtc2didWYsIHNpemVvZihtc2didWYpLAotCQkJCSAgICAgICIlLjIwMHMlcyB0YWtlcyBhdCBsZWFzdCBvbmUgYXJndW1lbnQiLAotCQkJCQkgICAgICBmbmFtZT09TlVMTCA/ICJmdW5jdGlvbiIgOiBmbmFtZSwKLQkJCQkJICAgICAgZm5hbWU9PU5VTEwgPyAiIiA6ICIoKSIpOwotCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsIG1zZ2J1Zik7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQltc2cgPSBjb252ZXJ0aXRlbShhcmdzLCAmZm9ybWF0LCBwX3ZhLCBmbGFncywgbGV2ZWxzLCAKLQkJCQkJICBtc2didWYsIHNpemVvZihtc2didWYpLCAmZnJlZWxpc3QpOwotCQkJaWYgKG1zZyA9PSBOVUxMKQotCQkJCXJldHVybiBjbGVhbnJldHVybigxLCBmcmVlbGlzdCk7Ci0JCQlzZXRlcnJvcihsZXZlbHNbMF0sIG1zZywgbGV2ZWxzKzEsIGZuYW1lLCBtZXNzYWdlKTsKLQkJCXJldHVybiBjbGVhbnJldHVybigwLCBmcmVlbGlzdCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCi0JCQkgICAgIm9sZCBzdHlsZSBnZXRhcmdzIGZvcm1hdCB1c2VzIG5ldyBmZWF0dXJlcyIpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0JCi0JaWYgKCFQeVR1cGxlX0NoZWNrKGFyZ3MpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKLQkJICAgICJuZXcgc3R5bGUgZ2V0YXJncyBmb3JtYXQgYnV0IGFyZ3VtZW50IGlzIG5vdCBhIHR1cGxlIik7Ci0JCXJldHVybiAwOwotCX0KLQkKLQlsZW4gPSBQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpOwotCQotCWlmIChsZW4gPCBtaW4gfHwgbWF4IDwgbGVuKSB7Ci0JCWlmIChtZXNzYWdlID09IE5VTEwpIHsKLQkJCVB5T1Nfc25wcmludGYobXNnYnVmLCBzaXplb2YobXNnYnVmKSwKLQkJCQkgICAgICAiJS4xNTBzJXMgdGFrZXMgJXMgJWQgYXJndW1lbnQlcyAiCi0JCQkJICAgICAgIiglbGQgZ2l2ZW4pIiwKLQkJCQkgICAgICBmbmFtZT09TlVMTCA/ICJmdW5jdGlvbiIgOiBmbmFtZSwKLQkJCQkgICAgICBmbmFtZT09TlVMTCA/ICIiIDogIigpIiwKLQkJCQkgICAgICBtaW49PW1heCA/ICJleGFjdGx5IgotCQkJCSAgICAgIDogbGVuIDwgbWluID8gImF0IGxlYXN0IiA6ICJhdCBtb3N0IiwKLQkJCQkgICAgICBsZW4gPCBtaW4gPyBtaW4gOiBtYXgsCi0JCQkJICAgICAgKGxlbiA8IG1pbiA/IG1pbiA6IG1heCkgPT0gMSA/ICIiIDogInMiLAotCQkJCSAgICAgIFB5X1NBRkVfRE9XTkNBU1QobGVuLCBQeV9zc2l6ZV90LCBsb25nKSk7Ci0JCQltZXNzYWdlID0gbXNnYnVmOwotCQl9Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsIG1lc3NhZ2UpOwotCQlyZXR1cm4gMDsKLQl9Ci0JCi0JZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCWlmICgqZm9ybWF0ID09ICd8JykKLQkJCWZvcm1hdCsrOwotCQltc2cgPSBjb252ZXJ0aXRlbShQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIGkpLCAmZm9ybWF0LCBwX3ZhLAotCQkJCSAgZmxhZ3MsIGxldmVscywgbXNnYnVmLCAKLQkJCQkgIHNpemVvZihtc2didWYpLCAmZnJlZWxpc3QpOwotCQlpZiAobXNnKSB7Ci0JCQlzZXRlcnJvcihpKzEsIG1zZywgbGV2ZWxzLCBmbmFtZSwgbWVzc2FnZSk7Ci0JCQlyZXR1cm4gY2xlYW5yZXR1cm4oMCwgZnJlZWxpc3QpOwotCQl9Ci0JfQorICAgIHdoaWxlIChlbmRmbXQgPT0gMCkgeworICAgICAgICBpbnQgYyA9ICpmb3JtYXQrKzsKKyAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgIGNhc2UgJygnOgorICAgICAgICAgICAgaWYgKGxldmVsID09IDApCisgICAgICAgICAgICAgICAgbWF4Kys7CisgICAgICAgICAgICBsZXZlbCsrOworICAgICAgICAgICAgaWYgKGxldmVsID49IDMwKQorICAgICAgICAgICAgICAgIFB5X0ZhdGFsRXJyb3IoInRvbyBtYW55IHR1cGxlIG5lc3RpbmcgbGV2ZWxzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbiBhcmd1bWVudCBmb3JtYXQgc3RyaW5nIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnKSc6CisgICAgICAgICAgICBpZiAobGV2ZWwgPT0gMCkKKyAgICAgICAgICAgICAgICBQeV9GYXRhbEVycm9yKCJleGNlc3MgJyknIGluIGdldGFyZ3MgZm9ybWF0Iik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbGV2ZWwtLTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdcMCc6CisgICAgICAgICAgICBlbmRmbXQgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJzonOgorICAgICAgICAgICAgZm5hbWUgPSBmb3JtYXQ7CisgICAgICAgICAgICBlbmRmbXQgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJzsnOgorICAgICAgICAgICAgbWVzc2FnZSA9IGZvcm1hdDsKKyAgICAgICAgICAgIGVuZGZtdCA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGlmIChsZXZlbCA9PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKGMgPT0gJ08nKQorICAgICAgICAgICAgICAgICAgICBtYXgrKzsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChpc2FscGhhKFB5X0NIQVJNQVNLKGMpKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoYyAhPSAnZScpIC8qIHNraXAgZW5jb2RlZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgbWF4Kys7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjID09ICd8JykKKyAgICAgICAgICAgICAgICAgICAgbWluID0gbWF4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CiAKLQlpZiAoKmZvcm1hdCAhPSAnXDAnICYmICFpc2FscGhhKFB5X0NIQVJNQVNLKCpmb3JtYXQpKSAmJgotCSAgICAqZm9ybWF0ICE9ICcoJyAmJgotCSAgICAqZm9ybWF0ICE9ICd8JyAmJiAqZm9ybWF0ICE9ICc6JyAmJiAqZm9ybWF0ICE9ICc7JykgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfU3lzdGVtRXJyb3IsCi0JCQkgICAgICJiYWQgZm9ybWF0IHN0cmluZzogJS4yMDBzIiwgZm9ybWF0c2F2ZSk7Ci0JCXJldHVybiBjbGVhbnJldHVybigwLCBmcmVlbGlzdCk7Ci0JfQotCQotCXJldHVybiBjbGVhbnJldHVybigxLCBmcmVlbGlzdCk7CisgICAgaWYgKGxldmVsICE9IDApCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoLyogJygnICovICJtaXNzaW5nICcpJyBpbiBnZXRhcmdzIGZvcm1hdCIpOworCisgICAgaWYgKG1pbiA8IDApCisgICAgICAgIG1pbiA9IG1heDsKKworICAgIGZvcm1hdCA9IGZvcm1hdHNhdmU7CisKKyAgICBpZiAoY29tcGF0KSB7CisgICAgICAgIGlmIChtYXggPT0gMCkgeworICAgICAgICAgICAgaWYgKGFyZ3MgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIFB5T1Nfc25wcmludGYobXNnYnVmLCBzaXplb2YobXNnYnVmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiUuMjAwcyVzIHRha2VzIG5vIGFyZ3VtZW50cyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZuYW1lPT1OVUxMID8gImZ1bmN0aW9uIiA6IGZuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmbmFtZT09TlVMTCA/ICIiIDogIigpIik7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCBtc2didWYpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAobWluID09IDEgJiYgbWF4ID09IDEpIHsKKyAgICAgICAgICAgIGlmIChhcmdzID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeU9TX3NucHJpbnRmKG1zZ2J1Ziwgc2l6ZW9mKG1zZ2J1ZiksCisgICAgICAgICAgICAgICAgICAgICAgIiUuMjAwcyVzIHRha2VzIGF0IGxlYXN0IG9uZSBhcmd1bWVudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZuYW1lPT1OVUxMID8gImZ1bmN0aW9uIiA6IGZuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmbmFtZT09TlVMTCA/ICIiIDogIigpIik7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgbXNnYnVmKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1zZyA9IGNvbnZlcnRpdGVtKGFyZ3MsICZmb3JtYXQsIHBfdmEsIGZsYWdzLCBsZXZlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2didWYsIHNpemVvZihtc2didWYpLCAmZnJlZWxpc3QpOworICAgICAgICAgICAgaWYgKG1zZyA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiBjbGVhbnJldHVybigxLCBmcmVlbGlzdCk7CisgICAgICAgICAgICBzZXRlcnJvcihsZXZlbHNbMF0sIG1zZywgbGV2ZWxzKzEsIGZuYW1lLCBtZXNzYWdlKTsKKyAgICAgICAgICAgIHJldHVybiBjbGVhbnJldHVybigwLCBmcmVlbGlzdCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgICAgICAgIm9sZCBzdHlsZSBnZXRhcmdzIGZvcm1hdCB1c2VzIG5ldyBmZWF0dXJlcyIpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIVB5VHVwbGVfQ2hlY2soYXJncykpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgIm5ldyBzdHlsZSBnZXRhcmdzIGZvcm1hdCBidXQgYXJndW1lbnQgaXMgbm90IGEgdHVwbGUiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgbGVuID0gUHlUdXBsZV9HRVRfU0laRShhcmdzKTsKKworICAgIGlmIChsZW4gPCBtaW4gfHwgbWF4IDwgbGVuKSB7CisgICAgICAgIGlmIChtZXNzYWdlID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5T1Nfc25wcmludGYobXNnYnVmLCBzaXplb2YobXNnYnVmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiUuMTUwcyVzIHRha2VzICVzICVkIGFyZ3VtZW50JXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiKCVsZCBnaXZlbikiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmbmFtZT09TlVMTCA/ICJmdW5jdGlvbiIgOiBmbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZm5hbWU9PU5VTEwgPyAiIiA6ICIoKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbj09bWF4ID8gImV4YWN0bHkiCisgICAgICAgICAgICAgICAgICAgICAgICAgIDogbGVuIDwgbWluID8gImF0IGxlYXN0IiA6ICJhdCBtb3N0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuIDwgbWluID8gbWluIDogbWF4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAobGVuIDwgbWluID8gbWluIDogbWF4KSA9PSAxID8gIiIgOiAicyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X1NBRkVfRE9XTkNBU1QobGVuLCBQeV9zc2l6ZV90LCBsb25nKSk7CisgICAgICAgICAgICBtZXNzYWdlID0gbXNnYnVmOworICAgICAgICB9CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsIG1lc3NhZ2UpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgaWYgKCpmb3JtYXQgPT0gJ3wnKQorICAgICAgICAgICAgZm9ybWF0Kys7CisgICAgICAgIG1zZyA9IGNvbnZlcnRpdGVtKFB5VHVwbGVfR0VUX0lURU0oYXJncywgaSksICZmb3JtYXQsIHBfdmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLCBsZXZlbHMsIG1zZ2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG1zZ2J1ZiksICZmcmVlbGlzdCk7CisgICAgICAgIGlmIChtc2cpIHsKKyAgICAgICAgICAgIHNldGVycm9yKGkrMSwgbXNnLCBsZXZlbHMsIGZuYW1lLCBtZXNzYWdlKTsKKyAgICAgICAgICAgIHJldHVybiBjbGVhbnJldHVybigwLCBmcmVlbGlzdCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKmZvcm1hdCAhPSAnXDAnICYmICFpc2FscGhhKFB5X0NIQVJNQVNLKCpmb3JtYXQpKSAmJgorICAgICAgICAqZm9ybWF0ICE9ICcoJyAmJgorICAgICAgICAqZm9ybWF0ICE9ICd8JyAmJiAqZm9ybWF0ICE9ICc6JyAmJiAqZm9ybWF0ICE9ICc7JykgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiYmFkIGZvcm1hdCBzdHJpbmc6ICUuMjAwcyIsIGZvcm1hdHNhdmUpOworICAgICAgICByZXR1cm4gY2xlYW5yZXR1cm4oMCwgZnJlZWxpc3QpOworICAgIH0KKworICAgIHJldHVybiBjbGVhbnJldHVybigxLCBmcmVlbGlzdCk7CiB9CiAKIApAQCAtMzUwLDM3ICszNTAsMzcgQEAKIHNldGVycm9yKGludCBpYXJnLCBjb25zdCBjaGFyICptc2csIGludCAqbGV2ZWxzLCBjb25zdCBjaGFyICpmbmFtZSwKICAgICAgICAgIGNvbnN0IGNoYXIgKm1lc3NhZ2UpCiB7Ci0JY2hhciBidWZbNTEyXTsKLQlpbnQgaTsKLQljaGFyICpwID0gYnVmOworICAgIGNoYXIgYnVmWzUxMl07CisgICAgaW50IGk7CisgICAgY2hhciAqcCA9IGJ1ZjsKIAotCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm47Ci0JZWxzZSBpZiAobWVzc2FnZSA9PSBOVUxMKSB7Ci0JCWlmIChmbmFtZSAhPSBOVUxMKSB7Ci0JCQlQeU9TX3NucHJpbnRmKHAsIHNpemVvZihidWYpLCAiJS4yMDBzKCkgIiwgZm5hbWUpOwotCQkJcCArPSBzdHJsZW4ocCk7Ci0JCX0KLQkJaWYgKGlhcmcgIT0gMCkgewotCQkJUHlPU19zbnByaW50ZihwLCBzaXplb2YoYnVmKSAtIChwIC0gYnVmKSwKLQkJCQkgICAgICAiYXJndW1lbnQgJWQiLCBpYXJnKTsKLQkJCWkgPSAwOwotCQkJcCArPSBzdHJsZW4ocCk7Ci0JCQl3aGlsZSAobGV2ZWxzW2ldID4gMCAmJiBpIDwgMzIgJiYgKGludCkocC1idWYpIDwgMjIwKSB7Ci0JCQkJUHlPU19zbnByaW50ZihwLCBzaXplb2YoYnVmKSAtIChwIC0gYnVmKSwKLQkJCQkJICAgICAgIiwgaXRlbSAlZCIsIGxldmVsc1tpXS0xKTsKLQkJCQlwICs9IHN0cmxlbihwKTsKLQkJCQlpKys7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlQeU9TX3NucHJpbnRmKHAsIHNpemVvZihidWYpIC0gKHAgLSBidWYpLCAiYXJndW1lbnQiKTsKLQkJCXAgKz0gc3RybGVuKHApOwotCQl9Ci0JCVB5T1Nfc25wcmludGYocCwgc2l6ZW9mKGJ1ZikgLSAocCAtIGJ1ZiksICIgJS4yNTZzIiwgbXNnKTsKLQkJbWVzc2FnZSA9IGJ1ZjsKLQl9Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgbWVzc2FnZSk7CisgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybjsKKyAgICBlbHNlIGlmIChtZXNzYWdlID09IE5VTEwpIHsKKyAgICAgICAgaWYgKGZuYW1lICE9IE5VTEwpIHsKKyAgICAgICAgICAgIFB5T1Nfc25wcmludGYocCwgc2l6ZW9mKGJ1ZiksICIlLjIwMHMoKSAiLCBmbmFtZSk7CisgICAgICAgICAgICBwICs9IHN0cmxlbihwKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaWFyZyAhPSAwKSB7CisgICAgICAgICAgICBQeU9TX3NucHJpbnRmKHAsIHNpemVvZihidWYpIC0gKHAgLSBidWYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiYXJndW1lbnQgJWQiLCBpYXJnKTsKKyAgICAgICAgICAgIGkgPSAwOworICAgICAgICAgICAgcCArPSBzdHJsZW4ocCk7CisgICAgICAgICAgICB3aGlsZSAobGV2ZWxzW2ldID4gMCAmJiBpIDwgMzIgJiYgKGludCkocC1idWYpIDwgMjIwKSB7CisgICAgICAgICAgICAgICAgUHlPU19zbnByaW50ZihwLCBzaXplb2YoYnVmKSAtIChwIC0gYnVmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsIGl0ZW0gJWQiLCBsZXZlbHNbaV0tMSk7CisgICAgICAgICAgICAgICAgcCArPSBzdHJsZW4ocCk7CisgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgUHlPU19zbnByaW50ZihwLCBzaXplb2YoYnVmKSAtIChwIC0gYnVmKSwgImFyZ3VtZW50Iik7CisgICAgICAgICAgICBwICs9IHN0cmxlbihwKTsKKyAgICAgICAgfQorICAgICAgICBQeU9TX3NucHJpbnRmKHAsIHNpemVvZihidWYpIC0gKHAgLSBidWYpLCAiICUuMjU2cyIsIG1zZyk7CisgICAgICAgIG1lc3NhZ2UgPSBidWY7CisgICAgfQorICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsIG1lc3NhZ2UpOwogfQogCiAKQEAgLTM5Niw4MyArMzk2LDgzIEBACiAgICAgICAqcF92YSBpcyB1bmRlZmluZWQsCiAgICAgICAqbGV2ZWxzIGlzIGEgMC10ZXJtaW5hdGVkIGxpc3Qgb2YgaXRlbSBudW1iZXJzLAogICAgICAgKm1zZ2J1ZiBjb250YWlucyBhbiBlcnJvciBtZXNzYWdlLCB3aG9zZSBmb3JtYXQgaXM6Ci0gICAgICAgICAibXVzdCBiZSA8dHlwZW5hbWUxPiwgbm90IDx0eXBlbmFtZTI+Iiwgd2hlcmU6Ci0gICAgICAgICAgICA8dHlwZW5hbWUxPiBpcyB0aGUgbmFtZSBvZiB0aGUgZXhwZWN0ZWQgdHlwZSwgYW5kCi0gICAgICAgICAgICA8dHlwZW5hbWUyPiBpcyB0aGUgbmFtZSBvZiB0aGUgYWN0dWFsIHR5cGUsCisgICAgICJtdXN0IGJlIDx0eXBlbmFtZTE+LCBub3QgPHR5cGVuYW1lMj4iLCB3aGVyZToKKyAgICAgICAgPHR5cGVuYW1lMT4gaXMgdGhlIG5hbWUgb2YgdGhlIGV4cGVjdGVkIHR5cGUsIGFuZAorICAgICAgICA8dHlwZW5hbWUyPiBpcyB0aGUgbmFtZSBvZiB0aGUgYWN0dWFsIHR5cGUsCiAgICAgICBhbmQgbXNnYnVmIGlzIHJldHVybmVkLgogKi8KIAogc3RhdGljIGNoYXIgKgogY29udmVydHR1cGxlKFB5T2JqZWN0ICphcmcsIGNvbnN0IGNoYXIgKipwX2Zvcm1hdCwgdmFfbGlzdCAqcF92YSwgaW50IGZsYWdzLAotICAgICAgICAgICAgIGludCAqbGV2ZWxzLCBjaGFyICptc2didWYsIHNpemVfdCBidWZzaXplLCBpbnQgdG9wbGV2ZWwsIAorICAgICAgICAgICAgIGludCAqbGV2ZWxzLCBjaGFyICptc2didWYsIHNpemVfdCBidWZzaXplLCBpbnQgdG9wbGV2ZWwsCiAgICAgICAgICAgICAgUHlPYmplY3QgKipmcmVlbGlzdCkKIHsKLQlpbnQgbGV2ZWwgPSAwOwotCWludCBuID0gMDsKLQljb25zdCBjaGFyICpmb3JtYXQgPSAqcF9mb3JtYXQ7Ci0JaW50IGk7Ci0JCi0JZm9yICg7OykgewotCQlpbnQgYyA9ICpmb3JtYXQrKzsKLQkJaWYgKGMgPT0gJygnKSB7Ci0JCQlpZiAobGV2ZWwgPT0gMCkKLQkJCQluKys7Ci0JCQlsZXZlbCsrOwotCQl9Ci0JCWVsc2UgaWYgKGMgPT0gJyknKSB7Ci0JCQlpZiAobGV2ZWwgPT0gMCkKLQkJCQlicmVhazsKLQkJCWxldmVsLS07Ci0JCX0KLQkJZWxzZSBpZiAoYyA9PSAnOicgfHwgYyA9PSAnOycgfHwgYyA9PSAnXDAnKQotCQkJYnJlYWs7Ci0JCWVsc2UgaWYgKGxldmVsID09IDAgJiYgaXNhbHBoYShQeV9DSEFSTUFTSyhjKSkpCi0JCQluKys7Ci0JfQotCQotCWlmICghUHlTZXF1ZW5jZV9DaGVjayhhcmcpIHx8IFB5U3RyaW5nX0NoZWNrKGFyZykpIHsKLQkJbGV2ZWxzWzBdID0gMDsKLQkJUHlPU19zbnByaW50Zihtc2didWYsIGJ1ZnNpemUsCi0JCQkgICAgICB0b3BsZXZlbCA/ICJleHBlY3RlZCAlZCBhcmd1bWVudHMsIG5vdCAlLjUwcyIgOgotCQkJICAgICAgICAgICAgICAibXVzdCBiZSAlZC1pdGVtIHNlcXVlbmNlLCBub3QgJS41MHMiLAotCQkJICAgICAgbiwgCi0JCQkgICAgICBhcmcgPT0gUHlfTm9uZSA/ICJOb25lIiA6IGFyZy0+b2JfdHlwZS0+dHBfbmFtZSk7Ci0JCXJldHVybiBtc2didWY7Ci0JfQotCQotCWlmICgoaSA9IFB5U2VxdWVuY2VfU2l6ZShhcmcpKSAhPSBuKSB7Ci0JCWxldmVsc1swXSA9IDA7Ci0JCVB5T1Nfc25wcmludGYobXNnYnVmLCBidWZzaXplLAotCQkJICAgICAgdG9wbGV2ZWwgPyAiZXhwZWN0ZWQgJWQgYXJndW1lbnRzLCBub3QgJWQiIDoKLQkJCSAgICAgICAgICAgICAibXVzdCBiZSBzZXF1ZW5jZSBvZiBsZW5ndGggJWQsIG5vdCAlZCIsCi0JCQkgICAgICBuLCBpKTsKLQkJcmV0dXJuIG1zZ2J1ZjsKLQl9CisgICAgaW50IGxldmVsID0gMDsKKyAgICBpbnQgbiA9IDA7CisgICAgY29uc3QgY2hhciAqZm9ybWF0ID0gKnBfZm9ybWF0OworICAgIGludCBpOwogCi0JZm9ybWF0ID0gKnBfZm9ybWF0OwotCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJY2hhciAqbXNnOwotCQlQeU9iamVjdCAqaXRlbTsKLQkJaXRlbSA9IFB5U2VxdWVuY2VfR2V0SXRlbShhcmcsIGkpOwotCQlpZiAoaXRlbSA9PSBOVUxMKSB7Ci0JCQlQeUVycl9DbGVhcigpOwotCQkJbGV2ZWxzWzBdID0gaSsxOwotCQkJbGV2ZWxzWzFdID0gMDsKLQkJCXN0cm5jcHkobXNnYnVmLCAiaXMgbm90IHJldHJpZXZhYmxlIiwgYnVmc2l6ZSk7Ci0JCQlyZXR1cm4gbXNnYnVmOwotCQl9Ci0JCW1zZyA9IGNvbnZlcnRpdGVtKGl0ZW0sICZmb3JtYXQsIHBfdmEsIGZsYWdzLCBsZXZlbHMrMSwgCi0JCQkJICBtc2didWYsIGJ1ZnNpemUsIGZyZWVsaXN0KTsKLQkJLyogUHlTZXF1ZW5jZV9HZXRJdGVtIGNhbGxzIHRwLT5zcV9pdGVtLCB3aGljaCBJTkNSRUZzICovCi0JCVB5X1hERUNSRUYoaXRlbSk7Ci0JCWlmIChtc2cgIT0gTlVMTCkgewotCQkJbGV2ZWxzWzBdID0gaSsxOwotCQkJcmV0dXJuIG1zZzsKLQkJfQotCX0KKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGludCBjID0gKmZvcm1hdCsrOworICAgICAgICBpZiAoYyA9PSAnKCcpIHsKKyAgICAgICAgICAgIGlmIChsZXZlbCA9PSAwKQorICAgICAgICAgICAgICAgIG4rKzsKKyAgICAgICAgICAgIGxldmVsKys7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoYyA9PSAnKScpIHsKKyAgICAgICAgICAgIGlmIChsZXZlbCA9PSAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgbGV2ZWwtLTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChjID09ICc6JyB8fCBjID09ICc7JyB8fCBjID09ICdcMCcpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZWxzZSBpZiAobGV2ZWwgPT0gMCAmJiBpc2FscGhhKFB5X0NIQVJNQVNLKGMpKSkKKyAgICAgICAgICAgIG4rKzsKKyAgICB9CiAKLQkqcF9mb3JtYXQgPSBmb3JtYXQ7Ci0JcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeVNlcXVlbmNlX0NoZWNrKGFyZykgfHwgUHlTdHJpbmdfQ2hlY2soYXJnKSkgeworICAgICAgICBsZXZlbHNbMF0gPSAwOworICAgICAgICBQeU9TX3NucHJpbnRmKG1zZ2J1ZiwgYnVmc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICB0b3BsZXZlbCA/ICJleHBlY3RlZCAlZCBhcmd1bWVudHMsIG5vdCAlLjUwcyIgOgorICAgICAgICAgICAgICAgICAgICAgICJtdXN0IGJlICVkLWl0ZW0gc2VxdWVuY2UsIG5vdCAlLjUwcyIsCisgICAgICAgICAgICAgICAgICBuLAorICAgICAgICAgICAgICAgICAgYXJnID09IFB5X05vbmUgPyAiTm9uZSIgOiBhcmctPm9iX3R5cGUtPnRwX25hbWUpOworICAgICAgICByZXR1cm4gbXNnYnVmOworICAgIH0KKworICAgIGlmICgoaSA9IFB5U2VxdWVuY2VfU2l6ZShhcmcpKSAhPSBuKSB7CisgICAgICAgIGxldmVsc1swXSA9IDA7CisgICAgICAgIFB5T1Nfc25wcmludGYobXNnYnVmLCBidWZzaXplLAorICAgICAgICAgICAgICAgICAgICAgIHRvcGxldmVsID8gImV4cGVjdGVkICVkIGFyZ3VtZW50cywgbm90ICVkIiA6CisgICAgICAgICAgICAgICAgICAgICAibXVzdCBiZSBzZXF1ZW5jZSBvZiBsZW5ndGggJWQsIG5vdCAlZCIsCisgICAgICAgICAgICAgICAgICBuLCBpKTsKKyAgICAgICAgcmV0dXJuIG1zZ2J1ZjsKKyAgICB9CisKKyAgICBmb3JtYXQgPSAqcF9mb3JtYXQ7CisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICBjaGFyICptc2c7CisgICAgICAgIFB5T2JqZWN0ICppdGVtOworICAgICAgICBpdGVtID0gUHlTZXF1ZW5jZV9HZXRJdGVtKGFyZywgaSk7CisgICAgICAgIGlmIChpdGVtID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICBsZXZlbHNbMF0gPSBpKzE7CisgICAgICAgICAgICBsZXZlbHNbMV0gPSAwOworICAgICAgICAgICAgc3RybmNweShtc2didWYsICJpcyBub3QgcmV0cmlldmFibGUiLCBidWZzaXplKTsKKyAgICAgICAgICAgIHJldHVybiBtc2didWY7CisgICAgICAgIH0KKyAgICAgICAgbXNnID0gY29udmVydGl0ZW0oaXRlbSwgJmZvcm1hdCwgcF92YSwgZmxhZ3MsIGxldmVscysxLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtc2didWYsIGJ1ZnNpemUsIGZyZWVsaXN0KTsKKyAgICAgICAgLyogUHlTZXF1ZW5jZV9HZXRJdGVtIGNhbGxzIHRwLT5zcV9pdGVtLCB3aGljaCBJTkNSRUZzICovCisgICAgICAgIFB5X1hERUNSRUYoaXRlbSk7CisgICAgICAgIGlmIChtc2cgIT0gTlVMTCkgeworICAgICAgICAgICAgbGV2ZWxzWzBdID0gaSsxOworICAgICAgICAgICAgcmV0dXJuIG1zZzsKKyAgICAgICAgfQorICAgIH0KKworICAgICpwX2Zvcm1hdCA9IGZvcm1hdDsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogCkBAIC00ODIsNDMgKzQ4Miw0MyBAQAogY29udmVydGl0ZW0oUHlPYmplY3QgKmFyZywgY29uc3QgY2hhciAqKnBfZm9ybWF0LCB2YV9saXN0ICpwX3ZhLCBpbnQgZmxhZ3MsCiAgICAgICAgICAgICBpbnQgKmxldmVscywgY2hhciAqbXNnYnVmLCBzaXplX3QgYnVmc2l6ZSwgUHlPYmplY3QgKipmcmVlbGlzdCkKIHsKLQljaGFyICptc2c7Ci0JY29uc3QgY2hhciAqZm9ybWF0ID0gKnBfZm9ybWF0OwotCQotCWlmICgqZm9ybWF0ID09ICcoJyAvKiAnKScgKi8pIHsKLQkJZm9ybWF0Kys7Ci0JCW1zZyA9IGNvbnZlcnR0dXBsZShhcmcsICZmb3JtYXQsIHBfdmEsIGZsYWdzLCBsZXZlbHMsIG1zZ2J1ZiwgCi0JCQkJICAgYnVmc2l6ZSwgMCwgZnJlZWxpc3QpOwotCQlpZiAobXNnID09IE5VTEwpCi0JCQlmb3JtYXQrKzsKLQl9Ci0JZWxzZSB7Ci0JCW1zZyA9IGNvbnZlcnRzaW1wbGUoYXJnLCAmZm9ybWF0LCBwX3ZhLCBmbGFncywgCi0JCQkJICAgIG1zZ2J1ZiwgYnVmc2l6ZSwgZnJlZWxpc3QpOwotCQlpZiAobXNnICE9IE5VTEwpCi0JCQlsZXZlbHNbMF0gPSAwOwotCX0KLQlpZiAobXNnID09IE5VTEwpCi0JCSpwX2Zvcm1hdCA9IGZvcm1hdDsKLQlyZXR1cm4gbXNnOworICAgIGNoYXIgKm1zZzsKKyAgICBjb25zdCBjaGFyICpmb3JtYXQgPSAqcF9mb3JtYXQ7CisKKyAgICBpZiAoKmZvcm1hdCA9PSAnKCcgLyogJyknICovKSB7CisgICAgICAgIGZvcm1hdCsrOworICAgICAgICBtc2cgPSBjb252ZXJ0dHVwbGUoYXJnLCAmZm9ybWF0LCBwX3ZhLCBmbGFncywgbGV2ZWxzLCBtc2didWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZzaXplLCAwLCBmcmVlbGlzdCk7CisgICAgICAgIGlmIChtc2cgPT0gTlVMTCkKKyAgICAgICAgICAgIGZvcm1hdCsrOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgbXNnID0gY29udmVydHNpbXBsZShhcmcsICZmb3JtYXQsIHBfdmEsIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZ2J1ZiwgYnVmc2l6ZSwgZnJlZWxpc3QpOworICAgICAgICBpZiAobXNnICE9IE5VTEwpCisgICAgICAgICAgICBsZXZlbHNbMF0gPSAwOworICAgIH0KKyAgICBpZiAobXNnID09IE5VTEwpCisgICAgICAgICpwX2Zvcm1hdCA9IGZvcm1hdDsKKyAgICByZXR1cm4gbXNnOwogfQogCiAKIAogI2RlZmluZSBVTklDT0RFX0RFRkFVTFRfRU5DT0RJTkcoYXJnKSBcCi0gICAgICAgIF9QeVVuaWNvZGVfQXNEZWZhdWx0RW5jb2RlZFN0cmluZyhhcmcsIE5VTEwpCisgICAgX1B5VW5pY29kZV9Bc0RlZmF1bHRFbmNvZGVkU3RyaW5nKGFyZywgTlVMTCkKIAogLyogRm9ybWF0IGFuIGVycm9yIG1lc3NhZ2UgZ2VuZXJhdGVkIGJ5IGNvbnZlcnRzaW1wbGUoKS4gKi8KIAogc3RhdGljIGNoYXIgKgogY29udmVydGVycihjb25zdCBjaGFyICpleHBlY3RlZCwgUHlPYmplY3QgKmFyZywgY2hhciAqbXNnYnVmLCBzaXplX3QgYnVmc2l6ZSkKIHsKLQlhc3NlcnQoZXhwZWN0ZWQgIT0gTlVMTCk7Ci0JYXNzZXJ0KGFyZyAhPSBOVUxMKTsgCi0JUHlPU19zbnByaW50Zihtc2didWYsIGJ1ZnNpemUsCi0JCSAgICAgICJtdXN0IGJlICUuNTBzLCBub3QgJS41MHMiLCBleHBlY3RlZCwKLQkJICAgICAgYXJnID09IFB5X05vbmUgPyAiTm9uZSIgOiBhcmctPm9iX3R5cGUtPnRwX25hbWUpOwotCXJldHVybiBtc2didWY7CisgICAgYXNzZXJ0KGV4cGVjdGVkICE9IE5VTEwpOworICAgIGFzc2VydChhcmcgIT0gTlVMTCk7CisgICAgUHlPU19zbnByaW50Zihtc2didWYsIGJ1ZnNpemUsCisgICAgICAgICAgICAgICAgICAibXVzdCBiZSAlLjUwcywgbm90ICUuNTBzIiwgZXhwZWN0ZWQsCisgICAgICAgICAgICAgICAgICBhcmcgPT0gUHlfTm9uZSA/ICJOb25lIiA6IGFyZy0+b2JfdHlwZS0+dHBfbmFtZSk7CisgICAgcmV0dXJuIG1zZ2J1ZjsKIH0KIAogI2RlZmluZSBDT05WX1VOSUNPREUgIih1bmljb2RlIGNvbnZlcnNpb24gZXJyb3IpIgpAQCAtNTI4LDEyICs1MjgsMTIgQEAKIHN0YXRpYyBpbnQKIGZsb2F0X2FyZ3VtZW50X2Vycm9yKFB5T2JqZWN0ICphcmcpCiB7Ci0JaWYgKFB5RmxvYXRfQ2hlY2soYXJnKSAmJgotCSAgICBQeUVycl9XYXJuKFB5RXhjX0RlcHJlY2F0aW9uV2FybmluZywKLQkJICAgICAgICJpbnRlZ2VyIGFyZ3VtZW50IGV4cGVjdGVkLCBnb3QgZmxvYXQiICkpCi0JCXJldHVybiAxOwotCWVsc2UKLQkJcmV0dXJuIDA7CisgICAgaWYgKFB5RmxvYXRfQ2hlY2soYXJnKSAmJgorICAgICAgICBQeUVycl9XYXJuKFB5RXhjX0RlcHJlY2F0aW9uV2FybmluZywKKyAgICAgICAgICAgICAgICAgICAiaW50ZWdlciBhcmd1bWVudCBleHBlY3RlZCwgZ290IGZsb2F0IiApKQorICAgICAgICByZXR1cm4gMTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiAwOwogfQogCiAvKiBDb252ZXJ0IGEgbm9uLXR1cGxlIGFyZ3VtZW50LiAgUmV0dXJuIE5VTEwgaWYgY29udmVyc2lvbiB3ZW50IE9LLApAQCAtNTQ5LDgyMyArNTQ5LDgyMyBAQAogY29udmVydHNpbXBsZShQeU9iamVjdCAqYXJnLCBjb25zdCBjaGFyICoqcF9mb3JtYXQsIHZhX2xpc3QgKnBfdmEsIGludCBmbGFncywKICAgICAgICAgICAgICAgY2hhciAqbXNnYnVmLCBzaXplX3QgYnVmc2l6ZSwgUHlPYmplY3QgKipmcmVlbGlzdCkKIHsKLQkvKiBGb3IgIyBjb2RlcyAqLwotI2RlZmluZSBGRVRDSF9TSVpFCWludCAqcT1OVUxMO1B5X3NzaXplX3QgKnEyPU5VTEw7XAotCWlmIChmbGFncyAmIEZMQUdfU0laRV9UKSBxMj12YV9hcmcoKnBfdmEsIFB5X3NzaXplX3QqKTsgXAotCWVsc2UgcT12YV9hcmcoKnBfdmEsIGludCopOworICAgIC8qIEZvciAjIGNvZGVzICovCisjZGVmaW5lIEZFVENIX1NJWkUgICAgICBpbnQgKnE9TlVMTDtQeV9zc2l6ZV90ICpxMj1OVUxMO1wKKyAgICBpZiAoZmxhZ3MgJiBGTEFHX1NJWkVfVCkgcTI9dmFfYXJnKCpwX3ZhLCBQeV9zc2l6ZV90Kik7IFwKKyAgICBlbHNlIHE9dmFfYXJnKCpwX3ZhLCBpbnQqKTsKICNkZWZpbmUgU1RPUkVfU0laRShzKSAgIGlmIChmbGFncyAmIEZMQUdfU0laRV9UKSAqcTI9czsgZWxzZSAqcT1zOwogI2RlZmluZSBCVUZGRVJfTEVOICAgICAgKChmbGFncyAmIEZMQUdfU0laRV9UKSA/ICpxMjoqcSkKIAotCWNvbnN0IGNoYXIgKmZvcm1hdCA9ICpwX2Zvcm1hdDsKLQljaGFyIGMgPSAqZm9ybWF0Kys7CisgICAgY29uc3QgY2hhciAqZm9ybWF0ID0gKnBfZm9ybWF0OworICAgIGNoYXIgYyA9ICpmb3JtYXQrKzsKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JUHlPYmplY3QgKnVhcmc7CisgICAgUHlPYmplY3QgKnVhcmc7CiAjZW5kaWYKLQkKLQlzd2l0Y2ggKGMpIHsKLQkKLQljYXNlICdiJzogeyAvKiB1bnNpZ25lZCBieXRlIC0tIHZlcnkgc2hvcnQgaW50ICovCi0JCWNoYXIgKnAgPSB2YV9hcmcoKnBfdmEsIGNoYXIgKik7Ci0JCWxvbmcgaXZhbDsKLQkJaWYgKGZsb2F0X2FyZ3VtZW50X2Vycm9yKGFyZykpCi0JCQlyZXR1cm4gY29udmVydGVycigiaW50ZWdlcjxiPiIsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKLQkJaXZhbCA9IFB5SW50X0FzTG9uZyhhcmcpOwotCQlpZiAoaXZhbCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIGNvbnZlcnRlcnIoImludGVnZXI8Yj4iLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0JCWVsc2UgaWYgKGl2YWwgPCAwKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJCSJ1bnNpZ25lZCBieXRlIGludGVnZXIgaXMgbGVzcyB0aGFuIG1pbmltdW0iKTsKLQkJCXJldHVybiBjb252ZXJ0ZXJyKCJpbnRlZ2VyPGI+IiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOwotCQl9Ci0JCWVsc2UgaWYgKGl2YWwgPiBVQ0hBUl9NQVgpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJInVuc2lnbmVkIGJ5dGUgaW50ZWdlciBpcyBncmVhdGVyIHRoYW4gbWF4aW11bSIpOwotCQkJcmV0dXJuIGNvbnZlcnRlcnIoImludGVnZXI8Yj4iLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0JCX0KLQkJZWxzZQotCQkJKnAgPSAodW5zaWduZWQgY2hhcikgaXZhbDsKLQkJYnJlYWs7Ci0JfQotCQotCWNhc2UgJ0InOiB7LyogYnl0ZSBzaXplZCBiaXRmaWVsZCAtIGJvdGggc2lnbmVkIGFuZCB1bnNpZ25lZAotCQkgICAgICB2YWx1ZXMgYWxsb3dlZCAqLyAgCi0JCWNoYXIgKnAgPSB2YV9hcmcoKnBfdmEsIGNoYXIgKik7Ci0JCWxvbmcgaXZhbDsKLQkJaWYgKGZsb2F0X2FyZ3VtZW50X2Vycm9yKGFyZykpCi0JCQlyZXR1cm4gY29udmVydGVycigiaW50ZWdlcjxCPiIsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKLQkJaXZhbCA9IFB5SW50X0FzVW5zaWduZWRMb25nTWFzayhhcmcpOwotCQlpZiAoaXZhbCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIGNvbnZlcnRlcnIoImludGVnZXI8Qj4iLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0JCWVsc2UKLQkJCSpwID0gKHVuc2lnbmVkIGNoYXIpIGl2YWw7Ci0JCWJyZWFrOwotCX0KLQkKLQljYXNlICdoJzogey8qIHNpZ25lZCBzaG9ydCBpbnQgKi8KLQkJc2hvcnQgKnAgPSB2YV9hcmcoKnBfdmEsIHNob3J0ICopOwotCQlsb25nIGl2YWw7Ci0JCWlmIChmbG9hdF9hcmd1bWVudF9lcnJvcihhcmcpKQotCQkJcmV0dXJuIGNvbnZlcnRlcnIoImludGVnZXI8aD4iLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0JCWl2YWwgPSBQeUludF9Bc0xvbmcoYXJnKTsKLQkJaWYgKGl2YWwgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJCXJldHVybiBjb252ZXJ0ZXJyKCJpbnRlZ2VyPGg+IiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOwotCQllbHNlIGlmIChpdmFsIDwgU0hSVF9NSU4pIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJInNpZ25lZCBzaG9ydCBpbnRlZ2VyIGlzIGxlc3MgdGhhbiBtaW5pbXVtIik7Ci0JCQlyZXR1cm4gY29udmVydGVycigiaW50ZWdlcjxoPiIsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKLQkJfQotCQllbHNlIGlmIChpdmFsID4gU0hSVF9NQVgpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJInNpZ25lZCBzaG9ydCBpbnRlZ2VyIGlzIGdyZWF0ZXIgdGhhbiBtYXhpbXVtIik7Ci0JCQlyZXR1cm4gY29udmVydGVycigiaW50ZWdlcjxoPiIsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKLQkJfQotCQllbHNlCi0JCQkqcCA9IChzaG9ydCkgaXZhbDsKLQkJYnJlYWs7Ci0JfQotCQotCWNhc2UgJ0gnOiB7IC8qIHNob3J0IGludCBzaXplZCBiaXRmaWVsZCwgYm90aCBzaWduZWQgYW5kCi0JCSAgICAgICB1bnNpZ25lZCBhbGxvd2VkICovIAotCQl1bnNpZ25lZCBzaG9ydCAqcCA9IHZhX2FyZygqcF92YSwgdW5zaWduZWQgc2hvcnQgKik7Ci0JCWxvbmcgaXZhbDsKLQkJaWYgKGZsb2F0X2FyZ3VtZW50X2Vycm9yKGFyZykpCi0JCQlyZXR1cm4gY29udmVydGVycigiaW50ZWdlcjxIPiIsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKLQkJaXZhbCA9IFB5SW50X0FzVW5zaWduZWRMb25nTWFzayhhcmcpOwotCQlpZiAoaXZhbCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIGNvbnZlcnRlcnIoImludGVnZXI8SD4iLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0JCWVsc2UKLQkJCSpwID0gKHVuc2lnbmVkIHNob3J0KSBpdmFsOwotCQlicmVhazsKLQl9CiAKLQljYXNlICdpJzogey8qIHNpZ25lZCBpbnQgKi8KLQkJaW50ICpwID0gdmFfYXJnKCpwX3ZhLCBpbnQgKik7Ci0JCWxvbmcgaXZhbDsKLQkJaWYgKGZsb2F0X2FyZ3VtZW50X2Vycm9yKGFyZykpCi0JCQlyZXR1cm4gY29udmVydGVycigiaW50ZWdlcjxpPiIsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKLQkJaXZhbCA9IFB5SW50X0FzTG9uZyhhcmcpOwotCQlpZiAoaXZhbCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIGNvbnZlcnRlcnIoImludGVnZXI8aT4iLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0JCWVsc2UgaWYgKGl2YWwgPiBJTlRfTUFYKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJCQkic2lnbmVkIGludGVnZXIgaXMgZ3JlYXRlciB0aGFuIG1heGltdW0iKTsKLQkJCXJldHVybiBjb252ZXJ0ZXJyKCJpbnRlZ2VyPGk+IiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOwotCQl9Ci0JCWVsc2UgaWYgKGl2YWwgPCBJTlRfTUlOKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJCQkic2lnbmVkIGludGVnZXIgaXMgbGVzcyB0aGFuIG1pbmltdW0iKTsKLQkJCXJldHVybiBjb252ZXJ0ZXJyKCJpbnRlZ2VyPGk+IiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOwotCQl9Ci0JCWVsc2UKLQkJCSpwID0gaXZhbDsKLQkJYnJlYWs7Ci0JfQorICAgIHN3aXRjaCAoYykgewogCi0JY2FzZSAnSSc6IHsgLyogaW50IHNpemVkIGJpdGZpZWxkLCBib3RoIHNpZ25lZCBhbmQKLQkJICAgICAgIHVuc2lnbmVkIGFsbG93ZWQgKi8gCi0JCXVuc2lnbmVkIGludCAqcCA9IHZhX2FyZygqcF92YSwgdW5zaWduZWQgaW50ICopOwotCQl1bnNpZ25lZCBpbnQgaXZhbDsKLQkJaWYgKGZsb2F0X2FyZ3VtZW50X2Vycm9yKGFyZykpCi0JCQlyZXR1cm4gY29udmVydGVycigiaW50ZWdlcjxJPiIsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKLQkJaXZhbCA9ICh1bnNpZ25lZCBpbnQpUHlJbnRfQXNVbnNpZ25lZExvbmdNYXNrKGFyZyk7Ci0JCWlmIChpdmFsID09ICh1bnNpZ25lZCBpbnQpLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJCXJldHVybiBjb252ZXJ0ZXJyKCJpbnRlZ2VyPEk+IiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOwotCQllbHNlCi0JCQkqcCA9IGl2YWw7Ci0JCWJyZWFrOwotCX0KLQkKLQljYXNlICduJzogLyogUHlfc3NpemVfdCAqLworICAgIGNhc2UgJ2InOiB7IC8qIHVuc2lnbmVkIGJ5dGUgLS0gdmVyeSBzaG9ydCBpbnQgKi8KKyAgICAgICAgY2hhciAqcCA9IHZhX2FyZygqcF92YSwgY2hhciAqKTsKKyAgICAgICAgbG9uZyBpdmFsOworICAgICAgICBpZiAoZmxvYXRfYXJndW1lbnRfZXJyb3IoYXJnKSkKKyAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKCJpbnRlZ2VyPGI+IiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOworICAgICAgICBpdmFsID0gUHlJbnRfQXNMb25nKGFyZyk7CisgICAgICAgIGlmIChpdmFsID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gY29udmVydGVycigiaW50ZWdlcjxiPiIsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKKyAgICAgICAgZWxzZSBpZiAoaXZhbCA8IDApIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgInVuc2lnbmVkIGJ5dGUgaW50ZWdlciBpcyBsZXNzIHRoYW4gbWluaW11bSIpOworICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlcnIoImludGVnZXI8Yj4iLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoaXZhbCA+IFVDSEFSX01BWCkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAidW5zaWduZWQgYnl0ZSBpbnRlZ2VyIGlzIGdyZWF0ZXIgdGhhbiBtYXhpbXVtIik7CisgICAgICAgICAgICByZXR1cm4gY29udmVydGVycigiaW50ZWdlcjxiPiIsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICAqcCA9ICh1bnNpZ25lZCBjaGFyKSBpdmFsOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlICdCJzogey8qIGJ5dGUgc2l6ZWQgYml0ZmllbGQgLSBib3RoIHNpZ25lZCBhbmQgdW5zaWduZWQKKyAgICAgICAgICAgICAgICAgIHZhbHVlcyBhbGxvd2VkICovCisgICAgICAgIGNoYXIgKnAgPSB2YV9hcmcoKnBfdmEsIGNoYXIgKik7CisgICAgICAgIGxvbmcgaXZhbDsKKyAgICAgICAgaWYgKGZsb2F0X2FyZ3VtZW50X2Vycm9yKGFyZykpCisgICAgICAgICAgICByZXR1cm4gY29udmVydGVycigiaW50ZWdlcjxCPiIsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKKyAgICAgICAgaXZhbCA9IFB5SW50X0FzVW5zaWduZWRMb25nTWFzayhhcmcpOworICAgICAgICBpZiAoaXZhbCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlcnIoImludGVnZXI8Qj4iLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICpwID0gKHVuc2lnbmVkIGNoYXIpIGl2YWw7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgJ2gnOiB7Lyogc2lnbmVkIHNob3J0IGludCAqLworICAgICAgICBzaG9ydCAqcCA9IHZhX2FyZygqcF92YSwgc2hvcnQgKik7CisgICAgICAgIGxvbmcgaXZhbDsKKyAgICAgICAgaWYgKGZsb2F0X2FyZ3VtZW50X2Vycm9yKGFyZykpCisgICAgICAgICAgICByZXR1cm4gY29udmVydGVycigiaW50ZWdlcjxoPiIsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKKyAgICAgICAgaXZhbCA9IFB5SW50X0FzTG9uZyhhcmcpOworICAgICAgICBpZiAoaXZhbCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlcnIoImludGVnZXI8aD4iLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CisgICAgICAgIGVsc2UgaWYgKGl2YWwgPCBTSFJUX01JTikgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAic2lnbmVkIHNob3J0IGludGVnZXIgaXMgbGVzcyB0aGFuIG1pbmltdW0iKTsKKyAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKCJpbnRlZ2VyPGg+IiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGl2YWwgPiBTSFJUX01BWCkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAic2lnbmVkIHNob3J0IGludGVnZXIgaXMgZ3JlYXRlciB0aGFuIG1heGltdW0iKTsKKyAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKCJpbnRlZ2VyPGg+IiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICpwID0gKHNob3J0KSBpdmFsOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlICdIJzogeyAvKiBzaG9ydCBpbnQgc2l6ZWQgYml0ZmllbGQsIGJvdGggc2lnbmVkIGFuZAorICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGFsbG93ZWQgKi8KKyAgICAgICAgdW5zaWduZWQgc2hvcnQgKnAgPSB2YV9hcmcoKnBfdmEsIHVuc2lnbmVkIHNob3J0ICopOworICAgICAgICBsb25nIGl2YWw7CisgICAgICAgIGlmIChmbG9hdF9hcmd1bWVudF9lcnJvcihhcmcpKQorICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlcnIoImludGVnZXI8SD4iLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CisgICAgICAgIGl2YWwgPSBQeUludF9Bc1Vuc2lnbmVkTG9uZ01hc2soYXJnKTsKKyAgICAgICAgaWYgKGl2YWwgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKCJpbnRlZ2VyPEg+IiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICAqcCA9ICh1bnNpZ25lZCBzaG9ydCkgaXZhbDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSAnaSc6IHsvKiBzaWduZWQgaW50ICovCisgICAgICAgIGludCAqcCA9IHZhX2FyZygqcF92YSwgaW50ICopOworICAgICAgICBsb25nIGl2YWw7CisgICAgICAgIGlmIChmbG9hdF9hcmd1bWVudF9lcnJvcihhcmcpKQorICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlcnIoImludGVnZXI8aT4iLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CisgICAgICAgIGl2YWwgPSBQeUludF9Bc0xvbmcoYXJnKTsKKyAgICAgICAgaWYgKGl2YWwgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKCJpbnRlZ2VyPGk+IiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOworICAgICAgICBlbHNlIGlmIChpdmFsID4gSU5UX01BWCkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgInNpZ25lZCBpbnRlZ2VyIGlzIGdyZWF0ZXIgdGhhbiBtYXhpbXVtIik7CisgICAgICAgICAgICByZXR1cm4gY29udmVydGVycigiaW50ZWdlcjxpPiIsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChpdmFsIDwgSU5UX01JTikgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgInNpZ25lZCBpbnRlZ2VyIGlzIGxlc3MgdGhhbiBtaW5pbXVtIik7CisgICAgICAgICAgICByZXR1cm4gY29udmVydGVycigiaW50ZWdlcjxpPiIsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICAqcCA9IGl2YWw7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgJ0knOiB7IC8qIGludCBzaXplZCBiaXRmaWVsZCwgYm90aCBzaWduZWQgYW5kCisgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgYWxsb3dlZCAqLworICAgICAgICB1bnNpZ25lZCBpbnQgKnAgPSB2YV9hcmcoKnBfdmEsIHVuc2lnbmVkIGludCAqKTsKKyAgICAgICAgdW5zaWduZWQgaW50IGl2YWw7CisgICAgICAgIGlmIChmbG9hdF9hcmd1bWVudF9lcnJvcihhcmcpKQorICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlcnIoImludGVnZXI8ST4iLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CisgICAgICAgIGl2YWwgPSAodW5zaWduZWQgaW50KVB5SW50X0FzVW5zaWduZWRMb25nTWFzayhhcmcpOworICAgICAgICBpZiAoaXZhbCA9PSAodW5zaWduZWQgaW50KS0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gY29udmVydGVycigiaW50ZWdlcjxJPiIsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgKnAgPSBpdmFsOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlICduJzogLyogUHlfc3NpemVfdCAqLwogI2lmIFNJWkVPRl9TSVpFX1QgIT0gU0laRU9GX0xPTkcKLQl7Ci0JCVB5X3NzaXplX3QgKnAgPSB2YV9hcmcoKnBfdmEsIFB5X3NzaXplX3QgKik7Ci0JCVB5X3NzaXplX3QgaXZhbDsKLQkJaWYgKGZsb2F0X2FyZ3VtZW50X2Vycm9yKGFyZykpCi0JCQlyZXR1cm4gY29udmVydGVycigiaW50ZWdlcjxuPiIsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKLQkJaXZhbCA9IFB5SW50X0FzU3NpemVfdChhcmcpOwotCQlpZiAoaXZhbCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIGNvbnZlcnRlcnIoImludGVnZXI8bj4iLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0JCSpwID0gaXZhbDsKLQkJYnJlYWs7Ci0JfQorICAgIHsKKyAgICAgICAgUHlfc3NpemVfdCAqcCA9IHZhX2FyZygqcF92YSwgUHlfc3NpemVfdCAqKTsKKyAgICAgICAgUHlfc3NpemVfdCBpdmFsOworICAgICAgICBpZiAoZmxvYXRfYXJndW1lbnRfZXJyb3IoYXJnKSkKKyAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKCJpbnRlZ2VyPG4+IiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOworICAgICAgICBpdmFsID0gUHlJbnRfQXNTc2l6ZV90KGFyZyk7CisgICAgICAgIGlmIChpdmFsID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gY29udmVydGVycigiaW50ZWdlcjxuPiIsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKKyAgICAgICAgKnAgPSBpdmFsOworICAgICAgICBicmVhazsKKyAgICB9CiAjZW5kaWYKLQkvKiBGYWxsIHRocm91Z2ggZnJvbSAnbicgdG8gJ2wnIGlmIFB5X3NzaXplX3QgaXMgaW50ICovCi0JY2FzZSAnbCc6IHsvKiBsb25nIGludCAqLwotCQlsb25nICpwID0gdmFfYXJnKCpwX3ZhLCBsb25nICopOwotCQlsb25nIGl2YWw7Ci0JCWlmIChmbG9hdF9hcmd1bWVudF9lcnJvcihhcmcpKQotCQkJcmV0dXJuIGNvbnZlcnRlcnIoImludGVnZXI8bD4iLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0JCWl2YWwgPSBQeUludF9Bc0xvbmcoYXJnKTsKLQkJaWYgKGl2YWwgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJCXJldHVybiBjb252ZXJ0ZXJyKCJpbnRlZ2VyPGw+IiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOwotCQllbHNlCi0JCQkqcCA9IGl2YWw7Ci0JCWJyZWFrOwotCX0KKyAgICAvKiBGYWxsIHRocm91Z2ggZnJvbSAnbicgdG8gJ2wnIGlmIFB5X3NzaXplX3QgaXMgaW50ICovCisgICAgY2FzZSAnbCc6IHsvKiBsb25nIGludCAqLworICAgICAgICBsb25nICpwID0gdmFfYXJnKCpwX3ZhLCBsb25nICopOworICAgICAgICBsb25nIGl2YWw7CisgICAgICAgIGlmIChmbG9hdF9hcmd1bWVudF9lcnJvcihhcmcpKQorICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlcnIoImludGVnZXI8bD4iLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CisgICAgICAgIGl2YWwgPSBQeUludF9Bc0xvbmcoYXJnKTsKKyAgICAgICAgaWYgKGl2YWwgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKCJpbnRlZ2VyPGw+IiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICAqcCA9IGl2YWw7CisgICAgICAgIGJyZWFrOworICAgIH0KIAotCWNhc2UgJ2snOiB7IC8qIGxvbmcgc2l6ZWQgYml0ZmllbGQgKi8KLQkJdW5zaWduZWQgbG9uZyAqcCA9IHZhX2FyZygqcF92YSwgdW5zaWduZWQgbG9uZyAqKTsKLQkJdW5zaWduZWQgbG9uZyBpdmFsOwotCQlpZiAoUHlJbnRfQ2hlY2soYXJnKSkKLQkJCWl2YWwgPSBQeUludF9Bc1Vuc2lnbmVkTG9uZ01hc2soYXJnKTsKLQkJZWxzZSBpZiAoUHlMb25nX0NoZWNrKGFyZykpCi0JCQlpdmFsID0gUHlMb25nX0FzVW5zaWduZWRMb25nTWFzayhhcmcpOwotCQllbHNlCi0JCQlyZXR1cm4gY29udmVydGVycigiaW50ZWdlcjxrPiIsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKLQkJKnAgPSBpdmFsOwotCQlicmVhazsKLQl9Ci0JCisgICAgY2FzZSAnayc6IHsgLyogbG9uZyBzaXplZCBiaXRmaWVsZCAqLworICAgICAgICB1bnNpZ25lZCBsb25nICpwID0gdmFfYXJnKCpwX3ZhLCB1bnNpZ25lZCBsb25nICopOworICAgICAgICB1bnNpZ25lZCBsb25nIGl2YWw7CisgICAgICAgIGlmIChQeUludF9DaGVjayhhcmcpKQorICAgICAgICAgICAgaXZhbCA9IFB5SW50X0FzVW5zaWduZWRMb25nTWFzayhhcmcpOworICAgICAgICBlbHNlIGlmIChQeUxvbmdfQ2hlY2soYXJnKSkKKyAgICAgICAgICAgIGl2YWwgPSBQeUxvbmdfQXNVbnNpZ25lZExvbmdNYXNrKGFyZyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKCJpbnRlZ2VyPGs+IiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOworICAgICAgICAqcCA9IGl2YWw7CisgICAgICAgIGJyZWFrOworICAgIH0KKwogI2lmZGVmIEhBVkVfTE9OR19MT05HCi0JY2FzZSAnTCc6IHsvKiBQWV9MT05HX0xPTkcgKi8KLQkJUFlfTE9OR19MT05HICpwID0gdmFfYXJnKCAqcF92YSwgUFlfTE9OR19MT05HICogKTsKLQkJUFlfTE9OR19MT05HIGl2YWwgPSBQeUxvbmdfQXNMb25nTG9uZyggYXJnICk7Ci0JCWlmIChpdmFsID09IChQWV9MT05HX0xPTkcpLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSApIHsKLQkJCXJldHVybiBjb252ZXJ0ZXJyKCJsb25nPEw+IiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOwotCQl9IGVsc2UgewotCQkJKnAgPSBpdmFsOwotCQl9Ci0JCWJyZWFrOwotCX0KKyAgICBjYXNlICdMJzogey8qIFBZX0xPTkdfTE9ORyAqLworICAgICAgICBQWV9MT05HX0xPTkcgKnAgPSB2YV9hcmcoICpwX3ZhLCBQWV9MT05HX0xPTkcgKiApOworICAgICAgICBQWV9MT05HX0xPTkcgaXZhbCA9IFB5TG9uZ19Bc0xvbmdMb25nKCBhcmcgKTsKKyAgICAgICAgaWYgKGl2YWwgPT0gKFBZX0xPTkdfTE9ORyktMSAmJiBQeUVycl9PY2N1cnJlZCgpICkgeworICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlcnIoImxvbmc8TD4iLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqcCA9IGl2YWw7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQogCi0JY2FzZSAnSyc6IHsgLyogbG9uZyBsb25nIHNpemVkIGJpdGZpZWxkICovCi0JCXVuc2lnbmVkIFBZX0xPTkdfTE9ORyAqcCA9IHZhX2FyZygqcF92YSwgdW5zaWduZWQgUFlfTE9OR19MT05HICopOwotCQl1bnNpZ25lZCBQWV9MT05HX0xPTkcgaXZhbDsKLQkJaWYgKFB5SW50X0NoZWNrKGFyZykpCi0JCQlpdmFsID0gUHlJbnRfQXNVbnNpZ25lZExvbmdNYXNrKGFyZyk7Ci0JCWVsc2UgaWYgKFB5TG9uZ19DaGVjayhhcmcpKQotCQkJaXZhbCA9IFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ0xvbmdNYXNrKGFyZyk7Ci0JCWVsc2UKLQkJCXJldHVybiBjb252ZXJ0ZXJyKCJpbnRlZ2VyPEs+IiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOwotCQkqcCA9IGl2YWw7Ci0JCWJyZWFrOwotCX0KKyAgICBjYXNlICdLJzogeyAvKiBsb25nIGxvbmcgc2l6ZWQgYml0ZmllbGQgKi8KKyAgICAgICAgdW5zaWduZWQgUFlfTE9OR19MT05HICpwID0gdmFfYXJnKCpwX3ZhLCB1bnNpZ25lZCBQWV9MT05HX0xPTkcgKik7CisgICAgICAgIHVuc2lnbmVkIFBZX0xPTkdfTE9ORyBpdmFsOworICAgICAgICBpZiAoUHlJbnRfQ2hlY2soYXJnKSkKKyAgICAgICAgICAgIGl2YWwgPSBQeUludF9Bc1Vuc2lnbmVkTG9uZ01hc2soYXJnKTsKKyAgICAgICAgZWxzZSBpZiAoUHlMb25nX0NoZWNrKGFyZykpCisgICAgICAgICAgICBpdmFsID0gUHlMb25nX0FzVW5zaWduZWRMb25nTG9uZ01hc2soYXJnKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlcnIoImludGVnZXI8Sz4iLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CisgICAgICAgICpwID0gaXZhbDsKKyAgICAgICAgYnJlYWs7CisgICAgfQogI2VuZGlmCi0JCi0JY2FzZSAnZic6IHsvKiBmbG9hdCAqLwotCQlmbG9hdCAqcCA9IHZhX2FyZygqcF92YSwgZmxvYXQgKik7Ci0JCWRvdWJsZSBkdmFsID0gUHlGbG9hdF9Bc0RvdWJsZShhcmcpOwotCQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkKLQkJCXJldHVybiBjb252ZXJ0ZXJyKCJmbG9hdDxmPiIsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKLQkJZWxzZQotCQkJKnAgPSAoZmxvYXQpIGR2YWw7Ci0JCWJyZWFrOwotCX0KLQkKLQljYXNlICdkJzogey8qIGRvdWJsZSAqLwotCQlkb3VibGUgKnAgPSB2YV9hcmcoKnBfdmEsIGRvdWJsZSAqKTsKLQkJZG91YmxlIGR2YWwgPSBQeUZsb2F0X0FzRG91YmxlKGFyZyk7Ci0JCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIGNvbnZlcnRlcnIoImZsb2F0PGQ+IiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOwotCQllbHNlCi0JCQkqcCA9IGR2YWw7Ci0JCWJyZWFrOwotCX0KLQkKKworICAgIGNhc2UgJ2YnOiB7LyogZmxvYXQgKi8KKyAgICAgICAgZmxvYXQgKnAgPSB2YV9hcmcoKnBfdmEsIGZsb2F0ICopOworICAgICAgICBkb3VibGUgZHZhbCA9IFB5RmxvYXRfQXNEb3VibGUoYXJnKTsKKyAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gY29udmVydGVycigiZmxvYXQ8Zj4iLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICpwID0gKGZsb2F0KSBkdmFsOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlICdkJzogey8qIGRvdWJsZSAqLworICAgICAgICBkb3VibGUgKnAgPSB2YV9hcmcoKnBfdmEsIGRvdWJsZSAqKTsKKyAgICAgICAgZG91YmxlIGR2YWwgPSBQeUZsb2F0X0FzRG91YmxlKGFyZyk7CisgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlcnIoImZsb2F0PGQ+IiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICAqcCA9IGR2YWw7CisgICAgICAgIGJyZWFrOworICAgIH0KKwogI2lmbmRlZiBXSVRIT1VUX0NPTVBMRVgKLQljYXNlICdEJzogey8qIGNvbXBsZXggZG91YmxlICovCi0JCVB5X2NvbXBsZXggKnAgPSB2YV9hcmcoKnBfdmEsIFB5X2NvbXBsZXggKik7Ci0JCVB5X2NvbXBsZXggY3ZhbDsKLQkJY3ZhbCA9IFB5Q29tcGxleF9Bc0NDb21wbGV4KGFyZyk7Ci0JCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIGNvbnZlcnRlcnIoImNvbXBsZXg8RD4iLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0JCWVsc2UKLQkJCSpwID0gY3ZhbDsKLQkJYnJlYWs7Ci0JfQorICAgIGNhc2UgJ0QnOiB7LyogY29tcGxleCBkb3VibGUgKi8KKyAgICAgICAgUHlfY29tcGxleCAqcCA9IHZhX2FyZygqcF92YSwgUHlfY29tcGxleCAqKTsKKyAgICAgICAgUHlfY29tcGxleCBjdmFsOworICAgICAgICBjdmFsID0gUHlDb21wbGV4X0FzQ0NvbXBsZXgoYXJnKTsKKyAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gY29udmVydGVycigiY29tcGxleDxEPiIsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgKnAgPSBjdmFsOworICAgICAgICBicmVhazsKKyAgICB9CiAjZW5kaWYgLyogV0lUSE9VVF9DT01QTEVYICovCi0JCi0JY2FzZSAnYyc6IHsvKiBjaGFyICovCi0JCWNoYXIgKnAgPSB2YV9hcmcoKnBfdmEsIGNoYXIgKik7Ci0JCWlmIChQeVN0cmluZ19DaGVjayhhcmcpICYmIFB5U3RyaW5nX1NpemUoYXJnKSA9PSAxKQotCQkJKnAgPSBQeVN0cmluZ19BU19TVFJJTkcoYXJnKVswXTsKLQkJZWxzZQotCQkJcmV0dXJuIGNvbnZlcnRlcnIoImNoYXIiLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0JCWJyZWFrOwotCX0KLQkKLQljYXNlICdzJzogey8qIHN0cmluZyAqLwotCQlpZiAoKmZvcm1hdCA9PSAnKicpIHsKLQkJCVB5X2J1ZmZlciAqcCA9IChQeV9idWZmZXIgKil2YV9hcmcoKnBfdmEsIFB5X2J1ZmZlciAqKTsKIAotCQkJaWYgKFB5U3RyaW5nX0NoZWNrKGFyZykpIHsKLQkJCQlQeUJ1ZmZlcl9GaWxsSW5mbyhwLCBhcmcsCi0JCQkJCQkgIFB5U3RyaW5nX0FTX1NUUklORyhhcmcpLCBQeVN0cmluZ19HRVRfU0laRShhcmcpLAotCQkJCQkJICAxLCAwKTsKLQkJCX0KLSNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JCQllbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2soYXJnKSkgewotCQkJCXVhcmcgPSBVTklDT0RFX0RFRkFVTFRfRU5DT0RJTkcoYXJnKTsKLQkJCQlpZiAodWFyZyA9PSBOVUxMKQotCQkJCQlyZXR1cm4gY29udmVydGVycihDT05WX1VOSUNPREUsCi0JCQkJCQkJICBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0JCQkJUHlCdWZmZXJfRmlsbEluZm8ocCwgYXJnLAotCQkJCQkJICBQeVN0cmluZ19BU19TVFJJTkcodWFyZyksIFB5U3RyaW5nX0dFVF9TSVpFKHVhcmcpLAotCQkJCQkJICAxLCAwKTsKLQkJCX0KLSNlbmRpZgotCQkJZWxzZSB7IC8qIGFueSBidWZmZXItbGlrZSBvYmplY3QgKi8KLQkJCQljaGFyICpidWY7Ci0JCQkJaWYgKGdldGJ1ZmZlcihhcmcsIHAsICZidWYpIDwgMCkKLQkJCQkJcmV0dXJuIGNvbnZlcnRlcnIoYnVmLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0JCQl9Ci0JCQlpZiAoYWRkY2xlYW51cChwLCBmcmVlbGlzdCwgY2xlYW51cF9idWZmZXIpKSB7Ci0JCQkJcmV0dXJuIGNvbnZlcnRlcnIoCi0JCQkJCSIoY2xlYW51cCBwcm9ibGVtKSIsCi0JCQkJCWFyZywgbXNnYnVmLCBidWZzaXplKTsKLQkJCX0KLQkJCWZvcm1hdCsrOwotCQl9IGVsc2UgaWYgKCpmb3JtYXQgPT0gJyMnKSB7Ci0JCQl2b2lkICoqcCA9ICh2b2lkICoqKXZhX2FyZygqcF92YSwgY2hhciAqKik7Ci0JCQlGRVRDSF9TSVpFOwotCQkJCi0JCQlpZiAoUHlTdHJpbmdfQ2hlY2soYXJnKSkgewotCQkJCSpwID0gUHlTdHJpbmdfQVNfU1RSSU5HKGFyZyk7Ci0JCQkJU1RPUkVfU0laRShQeVN0cmluZ19HRVRfU0laRShhcmcpKTsKLQkJCX0KLSNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JCQllbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2soYXJnKSkgewotCQkJCXVhcmcgPSBVTklDT0RFX0RFRkFVTFRfRU5DT0RJTkcoYXJnKTsKLQkJCQlpZiAodWFyZyA9PSBOVUxMKQotCQkJCQlyZXR1cm4gY29udmVydGVycihDT05WX1VOSUNPREUsCi0JCQkJCQkJICBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0JCQkJKnAgPSBQeVN0cmluZ19BU19TVFJJTkcodWFyZyk7Ci0JCQkJU1RPUkVfU0laRShQeVN0cmluZ19HRVRfU0laRSh1YXJnKSk7Ci0JCQl9Ci0jZW5kaWYKLQkJCWVsc2UgeyAvKiBhbnkgYnVmZmVyLWxpa2Ugb2JqZWN0ICovCi0JCQkJY2hhciAqYnVmOwotCQkJCVB5X3NzaXplX3QgY291bnQgPSBjb252ZXJ0YnVmZmVyKGFyZywgcCwgJmJ1Zik7Ci0JCQkJaWYgKGNvdW50IDwgMCkKLQkJCQkJcmV0dXJuIGNvbnZlcnRlcnIoYnVmLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0JCQkJU1RPUkVfU0laRShjb3VudCk7Ci0JCQl9Ci0JCQlmb3JtYXQrKzsKLQkJfSBlbHNlIHsKLQkJCWNoYXIgKipwID0gdmFfYXJnKCpwX3ZhLCBjaGFyICoqKTsKLQkJCQotCQkJaWYgKFB5U3RyaW5nX0NoZWNrKGFyZykpCi0JCQkJKnAgPSBQeVN0cmluZ19BU19TVFJJTkcoYXJnKTsKLSNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JCQllbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2soYXJnKSkgewotCQkJCXVhcmcgPSBVTklDT0RFX0RFRkFVTFRfRU5DT0RJTkcoYXJnKTsKLQkJCQlpZiAodWFyZyA9PSBOVUxMKQotCQkJCQlyZXR1cm4gY29udmVydGVycihDT05WX1VOSUNPREUsCi0JCQkJCQkJICBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0JCQkJKnAgPSBQeVN0cmluZ19BU19TVFJJTkcodWFyZyk7Ci0JCQl9Ci0jZW5kaWYKLQkJCWVsc2UKLQkJCQlyZXR1cm4gY29udmVydGVycigic3RyaW5nIiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOwotCQkJaWYgKChQeV9zc2l6ZV90KXN0cmxlbigqcCkgIT0gUHlTdHJpbmdfU2l6ZShhcmcpKQotCQkJCXJldHVybiBjb252ZXJ0ZXJyKCJzdHJpbmcgd2l0aG91dCBudWxsIGJ5dGVzIiwKLQkJCQkJCSAgYXJnLCBtc2didWYsIGJ1ZnNpemUpOwotCQl9Ci0JCWJyZWFrOwotCX0KKyAgICBjYXNlICdjJzogey8qIGNoYXIgKi8KKyAgICAgICAgY2hhciAqcCA9IHZhX2FyZygqcF92YSwgY2hhciAqKTsKKyAgICAgICAgaWYgKFB5U3RyaW5nX0NoZWNrKGFyZykgJiYgUHlTdHJpbmdfU2l6ZShhcmcpID09IDEpCisgICAgICAgICAgICAqcCA9IFB5U3RyaW5nX0FTX1NUUklORyhhcmcpWzBdOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gY29udmVydGVycigiY2hhciIsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQogCi0JY2FzZSAneic6IHsvKiBzdHJpbmcsIG1heSBiZSBOVUxMIChOb25lKSAqLwotCQlpZiAoKmZvcm1hdCA9PSAnKicpIHsKLQkJCVB5X2J1ZmZlciAqcCA9IChQeV9idWZmZXIgKil2YV9hcmcoKnBfdmEsIFB5X2J1ZmZlciAqKTsKKyAgICBjYXNlICdzJzogey8qIHN0cmluZyAqLworICAgICAgICBpZiAoKmZvcm1hdCA9PSAnKicpIHsKKyAgICAgICAgICAgIFB5X2J1ZmZlciAqcCA9IChQeV9idWZmZXIgKil2YV9hcmcoKnBfdmEsIFB5X2J1ZmZlciAqKTsKIAotCQkJaWYgKGFyZyA9PSBQeV9Ob25lKQotCQkJCVB5QnVmZmVyX0ZpbGxJbmZvKHAsIE5VTEwsIE5VTEwsIDAsIDEsIDApOwotCQkJZWxzZSBpZiAoUHlTdHJpbmdfQ2hlY2soYXJnKSkgewotCQkJCVB5QnVmZmVyX0ZpbGxJbmZvKHAsIGFyZywKLQkJCQkJCSAgUHlTdHJpbmdfQVNfU1RSSU5HKGFyZyksIFB5U3RyaW5nX0dFVF9TSVpFKGFyZyksCi0JCQkJCQkgIDEsIDApOwotCQkJfQorICAgICAgICAgICAgaWYgKFB5U3RyaW5nX0NoZWNrKGFyZykpIHsKKyAgICAgICAgICAgICAgICBQeUJ1ZmZlcl9GaWxsSW5mbyhwLCBhcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKGFyZyksIFB5U3RyaW5nX0dFVF9TSVpFKGFyZyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgMCk7CisgICAgICAgICAgICB9CiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCQkJZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrKGFyZykpIHsKLQkJCQl1YXJnID0gVU5JQ09ERV9ERUZBVUxUX0VOQ09ESU5HKGFyZyk7Ci0JCQkJaWYgKHVhcmcgPT0gTlVMTCkKLQkJCQkJcmV0dXJuIGNvbnZlcnRlcnIoQ09OVl9VTklDT0RFLAotCQkJCQkJCSAgYXJnLCBtc2didWYsIGJ1ZnNpemUpOwotCQkJCVB5QnVmZmVyX0ZpbGxJbmZvKHAsIGFyZywKLQkJCQkJCSAgUHlTdHJpbmdfQVNfU1RSSU5HKHVhcmcpLCBQeVN0cmluZ19HRVRfU0laRSh1YXJnKSwKLQkJCQkJCSAgMSwgMCk7Ci0JCQl9CisgICAgICAgICAgICBlbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2soYXJnKSkgeworICAgICAgICAgICAgICAgIHVhcmcgPSBVTklDT0RFX0RFRkFVTFRfRU5DT0RJTkcoYXJnKTsKKyAgICAgICAgICAgICAgICBpZiAodWFyZyA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udmVydGVycihDT05WX1VOSUNPREUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZywgbXNnYnVmLCBidWZzaXplKTsKKyAgICAgICAgICAgICAgICBQeUJ1ZmZlcl9GaWxsSW5mbyhwLCBhcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKHVhcmcpLCBQeVN0cmluZ19HRVRfU0laRSh1YXJnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCAwKTsKKyAgICAgICAgICAgIH0KICNlbmRpZgotCQkJZWxzZSB7IC8qIGFueSBidWZmZXItbGlrZSBvYmplY3QgKi8KLQkJCQljaGFyICpidWY7Ci0JCQkJaWYgKGdldGJ1ZmZlcihhcmcsIHAsICZidWYpIDwgMCkKLQkJCQkJcmV0dXJuIGNvbnZlcnRlcnIoYnVmLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0JCQl9Ci0JCQlpZiAoYWRkY2xlYW51cChwLCBmcmVlbGlzdCwgY2xlYW51cF9idWZmZXIpKSB7Ci0JCQkJcmV0dXJuIGNvbnZlcnRlcnIoCi0JCQkJCSIoY2xlYW51cCBwcm9ibGVtKSIsCi0JCQkJCWFyZywgbXNnYnVmLCBidWZzaXplKTsKLQkJCX0KLQkJCWZvcm1hdCsrOwotCQl9IGVsc2UgaWYgKCpmb3JtYXQgPT0gJyMnKSB7IC8qIGFueSBidWZmZXItbGlrZSBvYmplY3QgKi8KLQkJCXZvaWQgKipwID0gKHZvaWQgKiopdmFfYXJnKCpwX3ZhLCBjaGFyICoqKTsKLQkJCUZFVENIX1NJWkU7Ci0JCQkKLQkJCWlmIChhcmcgPT0gUHlfTm9uZSkgewotCQkJCSpwID0gMDsKLQkJCQlTVE9SRV9TSVpFKDApOwotCQkJfQotCQkJZWxzZSBpZiAoUHlTdHJpbmdfQ2hlY2soYXJnKSkgewotCQkJCSpwID0gUHlTdHJpbmdfQVNfU1RSSU5HKGFyZyk7Ci0JCQkJU1RPUkVfU0laRShQeVN0cmluZ19HRVRfU0laRShhcmcpKTsKLQkJCX0KLSNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JCQllbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2soYXJnKSkgewotCQkJCXVhcmcgPSBVTklDT0RFX0RFRkFVTFRfRU5DT0RJTkcoYXJnKTsKLQkJCQlpZiAodWFyZyA9PSBOVUxMKQotCQkJCQlyZXR1cm4gY29udmVydGVycihDT05WX1VOSUNPREUsCi0JCQkJCQkJICBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0JCQkJKnAgPSBQeVN0cmluZ19BU19TVFJJTkcodWFyZyk7Ci0JCQkJU1RPUkVfU0laRShQeVN0cmluZ19HRVRfU0laRSh1YXJnKSk7Ci0JCQl9Ci0jZW5kaWYKLQkJCWVsc2UgeyAvKiBhbnkgYnVmZmVyLWxpa2Ugb2JqZWN0ICovCi0JCQkJY2hhciAqYnVmOwotCQkJCVB5X3NzaXplX3QgY291bnQgPSBjb252ZXJ0YnVmZmVyKGFyZywgcCwgJmJ1Zik7Ci0JCQkJaWYgKGNvdW50IDwgMCkKLQkJCQkJcmV0dXJuIGNvbnZlcnRlcnIoYnVmLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0JCQkJU1RPUkVfU0laRShjb3VudCk7Ci0JCQl9Ci0JCQlmb3JtYXQrKzsKLQkJfSBlbHNlIHsKLQkJCWNoYXIgKipwID0gdmFfYXJnKCpwX3ZhLCBjaGFyICoqKTsKLQkJCQotCQkJaWYgKGFyZyA9PSBQeV9Ob25lKQotCQkJCSpwID0gMDsKLQkJCWVsc2UgaWYgKFB5U3RyaW5nX0NoZWNrKGFyZykpCi0JCQkJKnAgPSBQeVN0cmluZ19BU19TVFJJTkcoYXJnKTsKLSNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JCQllbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2soYXJnKSkgewotCQkJCXVhcmcgPSBVTklDT0RFX0RFRkFVTFRfRU5DT0RJTkcoYXJnKTsKLQkJCQlpZiAodWFyZyA9PSBOVUxMKQotCQkJCQlyZXR1cm4gY29udmVydGVycihDT05WX1VOSUNPREUsCi0JCQkJCQkJICBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0JCQkJKnAgPSBQeVN0cmluZ19BU19TVFJJTkcodWFyZyk7Ci0JCQl9Ci0jZW5kaWYKLQkJCWVsc2UKLQkJCQlyZXR1cm4gY29udmVydGVycigic3RyaW5nIG9yIE5vbmUiLCAKLQkJCQkJCSAgYXJnLCBtc2didWYsIGJ1ZnNpemUpOwotCQkJaWYgKCpmb3JtYXQgPT0gJyMnKSB7Ci0JCQkJRkVUQ0hfU0laRTsKLQkJCQlhc3NlcnQoMCk7IC8qIFhYWCByZWR1bmRhbnQgd2l0aCBpZi1jYXNlICovCi0JCQkJaWYgKGFyZyA9PSBQeV9Ob25lKQotCQkJCQkqcSA9IDA7Ci0JCQkJZWxzZQotCQkJCQkqcSA9IFB5U3RyaW5nX1NpemUoYXJnKTsKLQkJCQlmb3JtYXQrKzsKLQkJCX0KLQkJCWVsc2UgaWYgKCpwICE9IE5VTEwgJiYKLQkJCQkgKFB5X3NzaXplX3Qpc3RybGVuKCpwKSAhPSBQeVN0cmluZ19TaXplKGFyZykpCi0JCQkJcmV0dXJuIGNvbnZlcnRlcnIoCi0JCQkJCSJzdHJpbmcgd2l0aG91dCBudWxsIGJ5dGVzIG9yIE5vbmUiLCAKLQkJCQkJYXJnLCBtc2didWYsIGJ1ZnNpemUpOwotCQl9Ci0JCWJyZWFrOwotCX0KLQkKLQljYXNlICdlJzogey8qIGVuY29kZWQgc3RyaW5nICovCi0JCWNoYXIgKipidWZmZXI7Ci0JCWNvbnN0IGNoYXIgKmVuY29kaW5nOwotCQlQeU9iamVjdCAqczsKLQkJUHlfc3NpemVfdCBzaXplOwotCQlpbnQgcmVjb2RlX3N0cmluZ3M7CisgICAgICAgICAgICBlbHNlIHsgLyogYW55IGJ1ZmZlci1saWtlIG9iamVjdCAqLworICAgICAgICAgICAgICAgIGNoYXIgKmJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoZ2V0YnVmZmVyKGFyZywgcCwgJmJ1ZikgPCAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udmVydGVycihidWYsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhZGRjbGVhbnVwKHAsIGZyZWVsaXN0LCBjbGVhbnVwX2J1ZmZlcikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY29udmVydGVycigKKyAgICAgICAgICAgICAgICAgICAgIihjbGVhbnVwIHByb2JsZW0pIiwKKyAgICAgICAgICAgICAgICAgICAgYXJnLCBtc2didWYsIGJ1ZnNpemUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9ybWF0Kys7CisgICAgICAgIH0gZWxzZSBpZiAoKmZvcm1hdCA9PSAnIycpIHsKKyAgICAgICAgICAgIHZvaWQgKipwID0gKHZvaWQgKiopdmFfYXJnKCpwX3ZhLCBjaGFyICoqKTsKKyAgICAgICAgICAgIEZFVENIX1NJWkU7CiAKLQkJLyogR2V0ICdlJyBwYXJhbWV0ZXI6IHRoZSBlbmNvZGluZyBuYW1lICovCi0JCWVuY29kaW5nID0gKGNvbnN0IGNoYXIgKil2YV9hcmcoKnBfdmEsIGNvbnN0IGNoYXIgKik7CisgICAgICAgICAgICBpZiAoUHlTdHJpbmdfQ2hlY2soYXJnKSkgeworICAgICAgICAgICAgICAgICpwID0gUHlTdHJpbmdfQVNfU1RSSU5HKGFyZyk7CisgICAgICAgICAgICAgICAgU1RPUkVfU0laRShQeVN0cmluZ19HRVRfU0laRShhcmcpKTsKKyAgICAgICAgICAgIH0KICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JCWlmIChlbmNvZGluZyA9PSBOVUxMKQotCQkJZW5jb2RpbmcgPSBQeVVuaWNvZGVfR2V0RGVmYXVsdEVuY29kaW5nKCk7CisgICAgICAgICAgICBlbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2soYXJnKSkgeworICAgICAgICAgICAgICAgIHVhcmcgPSBVTklDT0RFX0RFRkFVTFRfRU5DT0RJTkcoYXJnKTsKKyAgICAgICAgICAgICAgICBpZiAodWFyZyA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udmVydGVycihDT05WX1VOSUNPREUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZywgbXNnYnVmLCBidWZzaXplKTsKKyAgICAgICAgICAgICAgICAqcCA9IFB5U3RyaW5nX0FTX1NUUklORyh1YXJnKTsKKyAgICAgICAgICAgICAgICBTVE9SRV9TSVpFKFB5U3RyaW5nX0dFVF9TSVpFKHVhcmcpKTsKKyAgICAgICAgICAgIH0KICNlbmRpZgotCQkJCi0JCS8qIEdldCBvdXRwdXQgYnVmZmVyIHBhcmFtZXRlcjoKLQkJICAgJ3MnIChyZWNvZGUgYWxsIG9iamVjdHMgdmlhIFVuaWNvZGUpIG9yCi0JCSAgICd0JyAob25seSByZWNvZGUgbm9uLXN0cmluZyBvYmplY3RzKSAKLQkJKi8KLQkJaWYgKCpmb3JtYXQgPT0gJ3MnKQotCQkJcmVjb2RlX3N0cmluZ3MgPSAxOwotCQllbHNlIGlmICgqZm9ybWF0ID09ICd0JykKLQkJCXJlY29kZV9zdHJpbmdzID0gMDsKLQkJZWxzZQotCQkJcmV0dXJuIGNvbnZlcnRlcnIoCi0JCQkJIih1bmtub3duIHBhcnNlciBtYXJrZXIgY29tYmluYXRpb24pIiwKLQkJCQlhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0JCWJ1ZmZlciA9IChjaGFyICoqKXZhX2FyZygqcF92YSwgY2hhciAqKik7Ci0JCWZvcm1hdCsrOwotCQlpZiAoYnVmZmVyID09IE5VTEwpCi0JCQlyZXR1cm4gY29udmVydGVycigiKGJ1ZmZlciBpcyBOVUxMKSIsIAotCQkJCQkgIGFyZywgbXNnYnVmLCBidWZzaXplKTsKLQkJCQotCQkvKiBFbmNvZGUgb2JqZWN0ICovCi0JCWlmICghcmVjb2RlX3N0cmluZ3MgJiYgUHlTdHJpbmdfQ2hlY2soYXJnKSkgewotCQkJcyA9IGFyZzsKLQkJCVB5X0lOQ1JFRihzKTsKLQkJfQotCQllbHNlIHsKLSNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JCSAgICAJUHlPYmplY3QgKnU7CisgICAgICAgICAgICBlbHNlIHsgLyogYW55IGJ1ZmZlci1saWtlIG9iamVjdCAqLworICAgICAgICAgICAgICAgIGNoYXIgKmJ1ZjsKKyAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IGNvdW50ID0gY29udmVydGJ1ZmZlcihhcmcsIHAsICZidWYpOworICAgICAgICAgICAgICAgIGlmIChjb3VudCA8IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKGJ1ZiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOworICAgICAgICAgICAgICAgIFNUT1JFX1NJWkUoY291bnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9ybWF0Kys7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjaGFyICoqcCA9IHZhX2FyZygqcF92YSwgY2hhciAqKik7CiAKLQkJCS8qIENvbnZlcnQgb2JqZWN0IHRvIFVuaWNvZGUgKi8KLQkJCXUgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChhcmcpOwotCQkJaWYgKHUgPT0gTlVMTCkKLQkJCQlyZXR1cm4gY29udmVydGVycigKLQkJCQkJInN0cmluZyBvciB1bmljb2RlIG9yIHRleHQgYnVmZmVyIiwgCi0JCQkJCWFyZywgbXNnYnVmLCBidWZzaXplKTsKLQkJCQotCQkJLyogRW5jb2RlIG9iamVjdDsgdXNlIGRlZmF1bHQgZXJyb3IgaGFuZGxpbmcgKi8KLQkJCXMgPSBQeVVuaWNvZGVfQXNFbmNvZGVkU3RyaW5nKHUsCi0JCQkJCQkgICAgICBlbmNvZGluZywKLQkJCQkJCSAgICAgIE5VTEwpOwotCQkJUHlfREVDUkVGKHUpOwotCQkJaWYgKHMgPT0gTlVMTCkKLQkJCQlyZXR1cm4gY29udmVydGVycigiKGVuY29kaW5nIGZhaWxlZCkiLAotCQkJCQkJICBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0JCQlpZiAoIVB5U3RyaW5nX0NoZWNrKHMpKSB7Ci0JCQkJUHlfREVDUkVGKHMpOwotCQkJCXJldHVybiBjb252ZXJ0ZXJyKAotCQkJCQkiKGVuY29kZXIgZmFpbGVkIHRvIHJldHVybiBhIHN0cmluZykiLAotCQkJCQlhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0JCQl9CisgICAgICAgICAgICBpZiAoUHlTdHJpbmdfQ2hlY2soYXJnKSkKKyAgICAgICAgICAgICAgICAqcCA9IFB5U3RyaW5nX0FTX1NUUklORyhhcmcpOworI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKKyAgICAgICAgICAgIGVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayhhcmcpKSB7CisgICAgICAgICAgICAgICAgdWFyZyA9IFVOSUNPREVfREVGQVVMVF9FTkNPRElORyhhcmcpOworICAgICAgICAgICAgICAgIGlmICh1YXJnID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKENPTlZfVU5JQ09ERSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnLCBtc2didWYsIGJ1ZnNpemUpOworICAgICAgICAgICAgICAgICpwID0gUHlTdHJpbmdfQVNfU1RSSU5HKHVhcmcpOworICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlcnIoInN0cmluZyIsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKKyAgICAgICAgICAgIGlmICgoUHlfc3NpemVfdClzdHJsZW4oKnApICE9IFB5U3RyaW5nX1NpemUoYXJnKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gY29udmVydGVycigic3RyaW5nIHdpdGhvdXQgbnVsbCBieXRlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnLCBtc2didWYsIGJ1ZnNpemUpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgJ3onOiB7Lyogc3RyaW5nLCBtYXkgYmUgTlVMTCAoTm9uZSkgKi8KKyAgICAgICAgaWYgKCpmb3JtYXQgPT0gJyonKSB7CisgICAgICAgICAgICBQeV9idWZmZXIgKnAgPSAoUHlfYnVmZmVyICopdmFfYXJnKCpwX3ZhLCBQeV9idWZmZXIgKik7CisKKyAgICAgICAgICAgIGlmIChhcmcgPT0gUHlfTm9uZSkKKyAgICAgICAgICAgICAgICBQeUJ1ZmZlcl9GaWxsSW5mbyhwLCBOVUxMLCBOVUxMLCAwLCAxLCAwKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKFB5U3RyaW5nX0NoZWNrKGFyZykpIHsKKyAgICAgICAgICAgICAgICBQeUJ1ZmZlcl9GaWxsSW5mbyhwLCBhcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKGFyZyksIFB5U3RyaW5nX0dFVF9TSVpFKGFyZyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgMCk7CisgICAgICAgICAgICB9CisjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQorICAgICAgICAgICAgZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrKGFyZykpIHsKKyAgICAgICAgICAgICAgICB1YXJnID0gVU5JQ09ERV9ERUZBVUxUX0VOQ09ESU5HKGFyZyk7CisgICAgICAgICAgICAgICAgaWYgKHVhcmcgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlcnIoQ09OVl9VTklDT0RFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CisgICAgICAgICAgICAgICAgUHlCdWZmZXJfRmlsbEluZm8ocCwgYXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FTX1NUUklORyh1YXJnKSwgUHlTdHJpbmdfR0VUX1NJWkUodWFyZyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgMCk7CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgIGVsc2UgeyAvKiBhbnkgYnVmZmVyLWxpa2Ugb2JqZWN0ICovCisgICAgICAgICAgICAgICAgY2hhciAqYnVmOworICAgICAgICAgICAgICAgIGlmIChnZXRidWZmZXIoYXJnLCBwLCAmYnVmKSA8IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKGJ1ZiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGFkZGNsZWFudXAocCwgZnJlZWxpc3QsIGNsZWFudXBfYnVmZmVyKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKAorICAgICAgICAgICAgICAgICAgICAiKGNsZWFudXAgcHJvYmxlbSkiLAorICAgICAgICAgICAgICAgICAgICBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3JtYXQrKzsKKyAgICAgICAgfSBlbHNlIGlmICgqZm9ybWF0ID09ICcjJykgeyAvKiBhbnkgYnVmZmVyLWxpa2Ugb2JqZWN0ICovCisgICAgICAgICAgICB2b2lkICoqcCA9ICh2b2lkICoqKXZhX2FyZygqcF92YSwgY2hhciAqKik7CisgICAgICAgICAgICBGRVRDSF9TSVpFOworCisgICAgICAgICAgICBpZiAoYXJnID09IFB5X05vbmUpIHsKKyAgICAgICAgICAgICAgICAqcCA9IDA7CisgICAgICAgICAgICAgICAgU1RPUkVfU0laRSgwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKFB5U3RyaW5nX0NoZWNrKGFyZykpIHsKKyAgICAgICAgICAgICAgICAqcCA9IFB5U3RyaW5nX0FTX1NUUklORyhhcmcpOworICAgICAgICAgICAgICAgIFNUT1JFX1NJWkUoUHlTdHJpbmdfR0VUX1NJWkUoYXJnKSk7CisgICAgICAgICAgICB9CisjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQorICAgICAgICAgICAgZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrKGFyZykpIHsKKyAgICAgICAgICAgICAgICB1YXJnID0gVU5JQ09ERV9ERUZBVUxUX0VOQ09ESU5HKGFyZyk7CisgICAgICAgICAgICAgICAgaWYgKHVhcmcgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlcnIoQ09OVl9VTklDT0RFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CisgICAgICAgICAgICAgICAgKnAgPSBQeVN0cmluZ19BU19TVFJJTkcodWFyZyk7CisgICAgICAgICAgICAgICAgU1RPUkVfU0laRShQeVN0cmluZ19HRVRfU0laRSh1YXJnKSk7CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgIGVsc2UgeyAvKiBhbnkgYnVmZmVyLWxpa2Ugb2JqZWN0ICovCisgICAgICAgICAgICAgICAgY2hhciAqYnVmOworICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgY291bnQgPSBjb252ZXJ0YnVmZmVyKGFyZywgcCwgJmJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKGNvdW50IDwgMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlcnIoYnVmLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CisgICAgICAgICAgICAgICAgU1RPUkVfU0laRShjb3VudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3JtYXQrKzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNoYXIgKipwID0gdmFfYXJnKCpwX3ZhLCBjaGFyICoqKTsKKworICAgICAgICAgICAgaWYgKGFyZyA9PSBQeV9Ob25lKQorICAgICAgICAgICAgICAgICpwID0gMDsKKyAgICAgICAgICAgIGVsc2UgaWYgKFB5U3RyaW5nX0NoZWNrKGFyZykpCisgICAgICAgICAgICAgICAgKnAgPSBQeVN0cmluZ19BU19TVFJJTkcoYXJnKTsKKyNpZmRlZiBQeV9VU0lOR19VTklDT0RFCisgICAgICAgICAgICBlbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2soYXJnKSkgeworICAgICAgICAgICAgICAgIHVhcmcgPSBVTklDT0RFX0RFRkFVTFRfRU5DT0RJTkcoYXJnKTsKKyAgICAgICAgICAgICAgICBpZiAodWFyZyA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udmVydGVycihDT05WX1VOSUNPREUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZywgbXNnYnVmLCBidWZzaXplKTsKKyAgICAgICAgICAgICAgICAqcCA9IFB5U3RyaW5nX0FTX1NUUklORyh1YXJnKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKCJzdHJpbmcgb3IgTm9uZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnLCBtc2didWYsIGJ1ZnNpemUpOworICAgICAgICAgICAgaWYgKCpmb3JtYXQgPT0gJyMnKSB7CisgICAgICAgICAgICAgICAgRkVUQ0hfU0laRTsKKyAgICAgICAgICAgICAgICBhc3NlcnQoMCk7IC8qIFhYWCByZWR1bmRhbnQgd2l0aCBpZi1jYXNlICovCisgICAgICAgICAgICAgICAgaWYgKGFyZyA9PSBQeV9Ob25lKQorICAgICAgICAgICAgICAgICAgICAqcSA9IDA7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAqcSA9IFB5U3RyaW5nX1NpemUoYXJnKTsKKyAgICAgICAgICAgICAgICBmb3JtYXQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCpwICE9IE5VTEwgJiYKKyAgICAgICAgICAgICAgICAgICAgIChQeV9zc2l6ZV90KXN0cmxlbigqcCkgIT0gUHlTdHJpbmdfU2l6ZShhcmcpKQorICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKAorICAgICAgICAgICAgICAgICAgICAic3RyaW5nIHdpdGhvdXQgbnVsbCBieXRlcyBvciBOb25lIiwKKyAgICAgICAgICAgICAgICAgICAgYXJnLCBtc2didWYsIGJ1ZnNpemUpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgJ2UnOiB7LyogZW5jb2RlZCBzdHJpbmcgKi8KKyAgICAgICAgY2hhciAqKmJ1ZmZlcjsKKyAgICAgICAgY29uc3QgY2hhciAqZW5jb2Rpbmc7CisgICAgICAgIFB5T2JqZWN0ICpzOworICAgICAgICBQeV9zc2l6ZV90IHNpemU7CisgICAgICAgIGludCByZWNvZGVfc3RyaW5nczsKKworICAgICAgICAvKiBHZXQgJ2UnIHBhcmFtZXRlcjogdGhlIGVuY29kaW5nIG5hbWUgKi8KKyAgICAgICAgZW5jb2RpbmcgPSAoY29uc3QgY2hhciAqKXZhX2FyZygqcF92YSwgY29uc3QgY2hhciAqKTsKKyNpZmRlZiBQeV9VU0lOR19VTklDT0RFCisgICAgICAgIGlmIChlbmNvZGluZyA9PSBOVUxMKQorICAgICAgICAgICAgZW5jb2RpbmcgPSBQeVVuaWNvZGVfR2V0RGVmYXVsdEVuY29kaW5nKCk7CisjZW5kaWYKKworICAgICAgICAvKiBHZXQgb3V0cHV0IGJ1ZmZlciBwYXJhbWV0ZXI6CisgICAgICAgICAgICdzJyAocmVjb2RlIGFsbCBvYmplY3RzIHZpYSBVbmljb2RlKSBvcgorICAgICAgICAgICAndCcgKG9ubHkgcmVjb2RlIG5vbi1zdHJpbmcgb2JqZWN0cykKKyAgICAgICAgKi8KKyAgICAgICAgaWYgKCpmb3JtYXQgPT0gJ3MnKQorICAgICAgICAgICAgcmVjb2RlX3N0cmluZ3MgPSAxOworICAgICAgICBlbHNlIGlmICgqZm9ybWF0ID09ICd0JykKKyAgICAgICAgICAgIHJlY29kZV9zdHJpbmdzID0gMDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlcnIoCisgICAgICAgICAgICAgICAgIih1bmtub3duIHBhcnNlciBtYXJrZXIgY29tYmluYXRpb24pIiwKKyAgICAgICAgICAgICAgICBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CisgICAgICAgIGJ1ZmZlciA9IChjaGFyICoqKXZhX2FyZygqcF92YSwgY2hhciAqKik7CisgICAgICAgIGZvcm1hdCsrOworICAgICAgICBpZiAoYnVmZmVyID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gY29udmVydGVycigiKGJ1ZmZlciBpcyBOVUxMKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CisKKyAgICAgICAgLyogRW5jb2RlIG9iamVjdCAqLworICAgICAgICBpZiAoIXJlY29kZV9zdHJpbmdzICYmIFB5U3RyaW5nX0NoZWNrKGFyZykpIHsKKyAgICAgICAgICAgIHMgPSBhcmc7CisgICAgICAgICAgICBQeV9JTkNSRUYocyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQorICAgICAgICAgICAgUHlPYmplY3QgKnU7CisKKyAgICAgICAgICAgIC8qIENvbnZlcnQgb2JqZWN0IHRvIFVuaWNvZGUgKi8KKyAgICAgICAgICAgIHUgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChhcmcpOworICAgICAgICAgICAgaWYgKHUgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gY29udmVydGVycigKKyAgICAgICAgICAgICAgICAgICAgInN0cmluZyBvciB1bmljb2RlIG9yIHRleHQgYnVmZmVyIiwKKyAgICAgICAgICAgICAgICAgICAgYXJnLCBtc2didWYsIGJ1ZnNpemUpOworCisgICAgICAgICAgICAvKiBFbmNvZGUgb2JqZWN0OyB1c2UgZGVmYXVsdCBlcnJvciBoYW5kbGluZyAqLworICAgICAgICAgICAgcyA9IFB5VW5pY29kZV9Bc0VuY29kZWRTdHJpbmcodSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAgICAgICBQeV9ERUNSRUYodSk7CisgICAgICAgICAgICBpZiAocyA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKCIoZW5jb2RpbmcgZmFpbGVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnLCBtc2didWYsIGJ1ZnNpemUpOworICAgICAgICAgICAgaWYgKCFQeVN0cmluZ19DaGVjayhzKSkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gY29udmVydGVycigKKyAgICAgICAgICAgICAgICAgICAgIihlbmNvZGVyIGZhaWxlZCB0byByZXR1cm4gYSBzdHJpbmcpIiwKKyAgICAgICAgICAgICAgICAgICAgYXJnLCBtc2didWYsIGJ1ZnNpemUpOworICAgICAgICAgICAgfQogI2Vsc2UKLQkJCXJldHVybiBjb252ZXJ0ZXJyKCJzdHJpbmc8ZT4iLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CisgICAgICAgICAgICByZXR1cm4gY29udmVydGVycigic3RyaW5nPGU+IiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOwogI2VuZGlmCi0JCX0KLQkJc2l6ZSA9IFB5U3RyaW5nX0dFVF9TSVpFKHMpOworICAgICAgICB9CisgICAgICAgIHNpemUgPSBQeVN0cmluZ19HRVRfU0laRShzKTsKIAotCQkvKiBXcml0ZSBvdXRwdXQ7IG91dHB1dCBpcyBndWFyYW50ZWVkIHRvIGJlIDAtdGVybWluYXRlZCAqLwotCQlpZiAoKmZvcm1hdCA9PSAnIycpIHsgCi0JCQkvKiBVc2luZyBidWZmZXIgbGVuZ3RoIHBhcmFtZXRlciAnIyc6Ci0JCQkJICAgCi0JCQkgICAtIGlmICpidWZmZXIgaXMgTlVMTCwgYSBuZXcgYnVmZmVyIG9mIHRoZQotCQkJICAgbmVlZGVkIHNpemUgaXMgYWxsb2NhdGVkIGFuZCB0aGUgZGF0YQotCQkJICAgY29waWVkIGludG8gaXQ7ICpidWZmZXIgaXMgdXBkYXRlZCB0byBwb2ludAotCQkJICAgdG8gdGhlIG5ldyBidWZmZXI7IHRoZSBjYWxsZXIgaXMKLQkJCSAgIHJlc3BvbnNpYmxlIGZvciBQeU1lbV9GcmVlKClpbmcgaXQgYWZ0ZXIKLQkJCSAgIHVzYWdlIAorICAgICAgICAvKiBXcml0ZSBvdXRwdXQ7IG91dHB1dCBpcyBndWFyYW50ZWVkIHRvIGJlIDAtdGVybWluYXRlZCAqLworICAgICAgICBpZiAoKmZvcm1hdCA9PSAnIycpIHsKKyAgICAgICAgICAgIC8qIFVzaW5nIGJ1ZmZlciBsZW5ndGggcGFyYW1ldGVyICcjJzoKIAotCQkJICAgLSBpZiAqYnVmZmVyIGlzIG5vdCBOVUxMLCB0aGUgZGF0YSBpcwotCQkJICAgY29waWVkIHRvICpidWZmZXI7ICpidWZmZXJfbGVuIGhhcyB0byBiZQotCQkJICAgc2V0IHRvIHRoZSBzaXplIG9mIHRoZSBidWZmZXIgb24gaW5wdXQ7Ci0JCQkgICBidWZmZXIgb3ZlcmZsb3cgaXMgc2lnbmFsbGVkIHdpdGggYW4gZXJyb3I7Ci0JCQkgICBidWZmZXIgaGFzIHRvIHByb3ZpZGUgZW5vdWdoIHJvb20gZm9yIHRoZQotCQkJICAgZW5jb2RlZCBzdHJpbmcgcGx1cyB0aGUgdHJhaWxpbmcgMC1ieXRlCi0JCQkgICAKLQkJCSAgIC0gaW4gYm90aCBjYXNlcywgKmJ1ZmZlcl9sZW4gaXMgdXBkYXRlZCB0bwotCQkJICAgdGhlIHNpemUgb2YgdGhlIGJ1ZmZlciAvZXhjbHVkaW5nLyB0aGUKLQkJCSAgIHRyYWlsaW5nIDAtYnl0ZSAKLQkJCSAgIAotCQkJKi8KLQkJCUZFVENIX1NJWkU7CisgICAgICAgICAgICAgICAtIGlmICpidWZmZXIgaXMgTlVMTCwgYSBuZXcgYnVmZmVyIG9mIHRoZQorICAgICAgICAgICAgICAgbmVlZGVkIHNpemUgaXMgYWxsb2NhdGVkIGFuZCB0aGUgZGF0YQorICAgICAgICAgICAgICAgY29waWVkIGludG8gaXQ7ICpidWZmZXIgaXMgdXBkYXRlZCB0byBwb2ludAorICAgICAgICAgICAgICAgdG8gdGhlIG5ldyBidWZmZXI7IHRoZSBjYWxsZXIgaXMKKyAgICAgICAgICAgICAgIHJlc3BvbnNpYmxlIGZvciBQeU1lbV9GcmVlKClpbmcgaXQgYWZ0ZXIKKyAgICAgICAgICAgICAgIHVzYWdlCiAKLQkJCWZvcm1hdCsrOwotCQkJaWYgKHEgPT0gTlVMTCAmJiBxMiA9PSBOVUxMKSB7Ci0JCQkJUHlfREVDUkVGKHMpOwotCQkJCXJldHVybiBjb252ZXJ0ZXJyKAotCQkJCQkiKGJ1ZmZlcl9sZW4gaXMgTlVMTCkiLAotCQkJCQlhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0JCQl9Ci0JCQlpZiAoKmJ1ZmZlciA9PSBOVUxMKSB7Ci0JCQkJKmJ1ZmZlciA9IFB5TWVtX05FVyhjaGFyLCBzaXplICsgMSk7Ci0JCQkJaWYgKCpidWZmZXIgPT0gTlVMTCkgewotCQkJCQlQeV9ERUNSRUYocyk7Ci0JCQkJCXJldHVybiBjb252ZXJ0ZXJyKAotCQkJCQkJIihtZW1vcnkgZXJyb3IpIiwKLQkJCQkJCWFyZywgbXNnYnVmLCBidWZzaXplKTsKLQkJCQl9Ci0JCQkJaWYgKGFkZGNsZWFudXAoKmJ1ZmZlciwgZnJlZWxpc3QsIGNsZWFudXBfcHRyKSkgewotCQkJCQlQeV9ERUNSRUYocyk7Ci0JCQkJCXJldHVybiBjb252ZXJ0ZXJyKAotCQkJCQkJIihjbGVhbnVwIHByb2JsZW0pIiwKLQkJCQkJCWFyZywgbXNnYnVmLCBidWZzaXplKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWlmIChzaXplICsgMSA+IEJVRkZFUl9MRU4pIHsKLQkJCQkJUHlfREVDUkVGKHMpOwotCQkJCQlyZXR1cm4gY29udmVydGVycigKLQkJCQkJCSIoYnVmZmVyIG92ZXJmbG93KSIsIAotCQkJCQkJYXJnLCBtc2didWYsIGJ1ZnNpemUpOwotCQkJCX0KLQkJCX0KLQkJCW1lbWNweSgqYnVmZmVyLAotCQkJICAgICAgIFB5U3RyaW5nX0FTX1NUUklORyhzKSwKLQkJCSAgICAgICBzaXplICsgMSk7Ci0JCQlTVE9SRV9TSVpFKHNpemUpOwotCQl9IGVsc2UgewotCQkJLyogVXNpbmcgYSAwLXRlcm1pbmF0ZWQgYnVmZmVyOgotCQkJCSAgIAotCQkJICAgLSB0aGUgZW5jb2RlZCBzdHJpbmcgaGFzIHRvIGJlIDAtdGVybWluYXRlZAotCQkJICAgZm9yIHRoaXMgdmFyaWFudCB0byB3b3JrOyBpZiBpdCBpcyBub3QsIGFuCi0JCQkgICBlcnJvciByYWlzZWQgCisgICAgICAgICAgICAgICAtIGlmICpidWZmZXIgaXMgbm90IE5VTEwsIHRoZSBkYXRhIGlzCisgICAgICAgICAgICAgICBjb3BpZWQgdG8gKmJ1ZmZlcjsgKmJ1ZmZlcl9sZW4gaGFzIHRvIGJlCisgICAgICAgICAgICAgICBzZXQgdG8gdGhlIHNpemUgb2YgdGhlIGJ1ZmZlciBvbiBpbnB1dDsKKyAgICAgICAgICAgICAgIGJ1ZmZlciBvdmVyZmxvdyBpcyBzaWduYWxsZWQgd2l0aCBhbiBlcnJvcjsKKyAgICAgICAgICAgICAgIGJ1ZmZlciBoYXMgdG8gcHJvdmlkZSBlbm91Z2ggcm9vbSBmb3IgdGhlCisgICAgICAgICAgICAgICBlbmNvZGVkIHN0cmluZyBwbHVzIHRoZSB0cmFpbGluZyAwLWJ5dGUKIAotCQkJICAgLSBhIG5ldyBidWZmZXIgb2YgdGhlIG5lZWRlZCBzaXplIGlzCi0JCQkgICBhbGxvY2F0ZWQgYW5kIHRoZSBkYXRhIGNvcGllZCBpbnRvIGl0OwotCQkJICAgKmJ1ZmZlciBpcyB1cGRhdGVkIHRvIHBvaW50IHRvIHRoZSBuZXcKLQkJCSAgIGJ1ZmZlcjsgdGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IKLQkJCSAgIFB5TWVtX0ZyZWUoKWluZyBpdCBhZnRlciB1c2FnZQorICAgICAgICAgICAgICAgLSBpbiBib3RoIGNhc2VzLCAqYnVmZmVyX2xlbiBpcyB1cGRhdGVkIHRvCisgICAgICAgICAgICAgICB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyIC9leGNsdWRpbmcvIHRoZQorICAgICAgICAgICAgICAgdHJhaWxpbmcgMC1ieXRlCiAKLQkJCSovCi0JCQlpZiAoKFB5X3NzaXplX3Qpc3RybGVuKFB5U3RyaW5nX0FTX1NUUklORyhzKSkKLQkJCQkJCQkJIT0gc2l6ZSkgewotCQkJCVB5X0RFQ1JFRihzKTsKLQkJCQlyZXR1cm4gY29udmVydGVycigKLQkJCQkJImVuY29kZWQgc3RyaW5nIHdpdGhvdXQgTlVMTCBieXRlcyIsCi0JCQkJCWFyZywgbXNnYnVmLCBidWZzaXplKTsKLQkJCX0KLQkJCSpidWZmZXIgPSBQeU1lbV9ORVcoY2hhciwgc2l6ZSArIDEpOwotCQkJaWYgKCpidWZmZXIgPT0gTlVMTCkgewotCQkJCVB5X0RFQ1JFRihzKTsKLQkJCQlyZXR1cm4gY29udmVydGVycigiKG1lbW9yeSBlcnJvcikiLAotCQkJCQkJICBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0JCQl9Ci0JCQlpZiAoYWRkY2xlYW51cCgqYnVmZmVyLCBmcmVlbGlzdCwgY2xlYW51cF9wdHIpKSB7Ci0JCQkJUHlfREVDUkVGKHMpOwotCQkJCXJldHVybiBjb252ZXJ0ZXJyKCIoY2xlYW51cCBwcm9ibGVtKSIsCi0JCQkJCQlhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0JCQl9Ci0JCQltZW1jcHkoKmJ1ZmZlciwKLQkJCSAgICAgICBQeVN0cmluZ19BU19TVFJJTkcocyksCi0JCQkgICAgICAgc2l6ZSArIDEpOwotCQl9Ci0JCVB5X0RFQ1JFRihzKTsKLQkJYnJlYWs7Ci0JfQorICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIEZFVENIX1NJWkU7CisKKyAgICAgICAgICAgIGZvcm1hdCsrOworICAgICAgICAgICAgaWYgKHEgPT0gTlVMTCAmJiBxMiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHMpOworICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKAorICAgICAgICAgICAgICAgICAgICAiKGJ1ZmZlcl9sZW4gaXMgTlVMTCkiLAorICAgICAgICAgICAgICAgICAgICBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKmJ1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgKmJ1ZmZlciA9IFB5TWVtX05FVyhjaGFyLCBzaXplICsgMSk7CisgICAgICAgICAgICAgICAgaWYgKCpidWZmZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYocyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKAorICAgICAgICAgICAgICAgICAgICAgICAgIihtZW1vcnkgZXJyb3IpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyZywgbXNnYnVmLCBidWZzaXplKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGFkZGNsZWFudXAoKmJ1ZmZlciwgZnJlZWxpc3QsIGNsZWFudXBfcHRyKSkgeworICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYocyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKAorICAgICAgICAgICAgICAgICAgICAgICAgIihjbGVhbnVwIHByb2JsZW0pIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyZywgbXNnYnVmLCBidWZzaXplKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChzaXplICsgMSA+IEJVRkZFUl9MRU4pIHsKKyAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udmVydGVycigKKyAgICAgICAgICAgICAgICAgICAgICAgICIoYnVmZmVyIG92ZXJmbG93KSIsCisgICAgICAgICAgICAgICAgICAgICAgICBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWVtY3B5KCpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKHMpLAorICAgICAgICAgICAgICAgICAgIHNpemUgKyAxKTsKKyAgICAgICAgICAgIFNUT1JFX1NJWkUoc2l6ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBVc2luZyBhIDAtdGVybWluYXRlZCBidWZmZXI6CisKKyAgICAgICAgICAgICAgIC0gdGhlIGVuY29kZWQgc3RyaW5nIGhhcyB0byBiZSAwLXRlcm1pbmF0ZWQKKyAgICAgICAgICAgICAgIGZvciB0aGlzIHZhcmlhbnQgdG8gd29yazsgaWYgaXQgaXMgbm90LCBhbgorICAgICAgICAgICAgICAgZXJyb3IgcmFpc2VkCisKKyAgICAgICAgICAgICAgIC0gYSBuZXcgYnVmZmVyIG9mIHRoZSBuZWVkZWQgc2l6ZSBpcworICAgICAgICAgICAgICAgYWxsb2NhdGVkIGFuZCB0aGUgZGF0YSBjb3BpZWQgaW50byBpdDsKKyAgICAgICAgICAgICAgICpidWZmZXIgaXMgdXBkYXRlZCB0byBwb2ludCB0byB0aGUgbmV3CisgICAgICAgICAgICAgICBidWZmZXI7IHRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yCisgICAgICAgICAgICAgICBQeU1lbV9GcmVlKClpbmcgaXQgYWZ0ZXIgdXNhZ2UKKworICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmICgoUHlfc3NpemVfdClzdHJsZW4oUHlTdHJpbmdfQVNfU1RSSU5HKHMpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IHNpemUpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYocyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlcnIoCisgICAgICAgICAgICAgICAgICAgICJlbmNvZGVkIHN0cmluZyB3aXRob3V0IE5VTEwgYnl0ZXMiLAorICAgICAgICAgICAgICAgICAgICBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqYnVmZmVyID0gUHlNZW1fTkVXKGNoYXIsIHNpemUgKyAxKTsKKyAgICAgICAgICAgIGlmICgqYnVmZmVyID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYocyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlcnIoIihtZW1vcnkgZXJyb3IpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYWRkY2xlYW51cCgqYnVmZmVyLCBmcmVlbGlzdCwgY2xlYW51cF9wdHIpKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHMpOworICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKCIoY2xlYW51cCBwcm9ibGVtKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZywgbXNnYnVmLCBidWZzaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1lbWNweSgqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FTX1NUUklORyhzKSwKKyAgICAgICAgICAgICAgICAgICBzaXplICsgMSk7CisgICAgICAgIH0KKyAgICAgICAgUHlfREVDUkVGKHMpOworICAgICAgICBicmVhazsKKyAgICB9CiAKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JY2FzZSAndSc6IHsvKiByYXcgdW5pY29kZSBidWZmZXIgKFB5X1VOSUNPREUgKikgKi8KLQkJaWYgKCpmb3JtYXQgPT0gJyMnKSB7IC8qIGFueSBidWZmZXItbGlrZSBvYmplY3QgKi8KLQkJCXZvaWQgKipwID0gKHZvaWQgKiopdmFfYXJnKCpwX3ZhLCBjaGFyICoqKTsKLQkJCUZFVENIX1NJWkU7Ci0JCQlpZiAoUHlVbmljb2RlX0NoZWNrKGFyZykpIHsKLQkJCSAgICAJKnAgPSBQeVVuaWNvZGVfQVNfVU5JQ09ERShhcmcpOwotCQkJCVNUT1JFX1NJWkUoUHlVbmljb2RlX0dFVF9TSVpFKGFyZykpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmV0dXJuIGNvbnZlcnRlcnIoImNhbm5vdCBjb252ZXJ0IHJhdyBidWZmZXJzIiwKLQkJCQkJCSAgYXJnLCBtc2didWYsIGJ1ZnNpemUpOwotCQkJfQotCQkJZm9ybWF0Kys7Ci0JCX0gZWxzZSB7Ci0JCQlQeV9VTklDT0RFICoqcCA9IHZhX2FyZygqcF92YSwgUHlfVU5JQ09ERSAqKik7Ci0JCQlpZiAoUHlVbmljb2RlX0NoZWNrKGFyZykpCi0JCQkJKnAgPSBQeVVuaWNvZGVfQVNfVU5JQ09ERShhcmcpOwotCQkJZWxzZQotCQkJCXJldHVybiBjb252ZXJ0ZXJyKCJ1bmljb2RlIiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOwotCQl9Ci0JCWJyZWFrOwotCX0KKyAgICBjYXNlICd1Jzogey8qIHJhdyB1bmljb2RlIGJ1ZmZlciAoUHlfVU5JQ09ERSAqKSAqLworICAgICAgICBpZiAoKmZvcm1hdCA9PSAnIycpIHsgLyogYW55IGJ1ZmZlci1saWtlIG9iamVjdCAqLworICAgICAgICAgICAgdm9pZCAqKnAgPSAodm9pZCAqKil2YV9hcmcoKnBfdmEsIGNoYXIgKiopOworICAgICAgICAgICAgRkVUQ0hfU0laRTsKKyAgICAgICAgICAgIGlmIChQeVVuaWNvZGVfQ2hlY2soYXJnKSkgeworICAgICAgICAgICAgICAgICpwID0gUHlVbmljb2RlX0FTX1VOSUNPREUoYXJnKTsKKyAgICAgICAgICAgICAgICBTVE9SRV9TSVpFKFB5VW5pY29kZV9HRVRfU0laRShhcmcpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKCJjYW5ub3QgY29udmVydCByYXcgYnVmZmVycyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnLCBtc2didWYsIGJ1ZnNpemUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9ybWF0Kys7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBQeV9VTklDT0RFICoqcCA9IHZhX2FyZygqcF92YSwgUHlfVU5JQ09ERSAqKik7CisgICAgICAgICAgICBpZiAoUHlVbmljb2RlX0NoZWNrKGFyZykpCisgICAgICAgICAgICAgICAgKnAgPSBQeVVuaWNvZGVfQVNfVU5JQ09ERShhcmcpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKCJ1bmljb2RlIiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KICNlbmRpZgogCi0JY2FzZSAnUyc6IHsgLyogc3RyaW5nIG9iamVjdCAqLwotCQlQeU9iamVjdCAqKnAgPSB2YV9hcmcoKnBfdmEsIFB5T2JqZWN0ICoqKTsKLQkJaWYgKFB5U3RyaW5nX0NoZWNrKGFyZykpCi0JCQkqcCA9IGFyZzsKLQkJZWxzZQotCQkJcmV0dXJuIGNvbnZlcnRlcnIoInN0cmluZyIsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKLQkJYnJlYWs7Ci0JfQotCQorICAgIGNhc2UgJ1MnOiB7IC8qIHN0cmluZyBvYmplY3QgKi8KKyAgICAgICAgUHlPYmplY3QgKipwID0gdmFfYXJnKCpwX3ZhLCBQeU9iamVjdCAqKik7CisgICAgICAgIGlmIChQeVN0cmluZ19DaGVjayhhcmcpKQorICAgICAgICAgICAgKnAgPSBhcmc7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKCJzdHJpbmciLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKwogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQljYXNlICdVJzogeyAvKiBVbmljb2RlIG9iamVjdCAqLwotCQlQeU9iamVjdCAqKnAgPSB2YV9hcmcoKnBfdmEsIFB5T2JqZWN0ICoqKTsKLQkJaWYgKFB5VW5pY29kZV9DaGVjayhhcmcpKQotCQkJKnAgPSBhcmc7Ci0JCWVsc2UKLQkJCXJldHVybiBjb252ZXJ0ZXJyKCJ1bmljb2RlIiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOwotCQlicmVhazsKLQl9CisgICAgY2FzZSAnVSc6IHsgLyogVW5pY29kZSBvYmplY3QgKi8KKyAgICAgICAgUHlPYmplY3QgKipwID0gdmFfYXJnKCpwX3ZhLCBQeU9iamVjdCAqKik7CisgICAgICAgIGlmIChQeVVuaWNvZGVfQ2hlY2soYXJnKSkKKyAgICAgICAgICAgICpwID0gYXJnOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gY29udmVydGVycigidW5pY29kZSIsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQogI2VuZGlmCi0JCi0JY2FzZSAnTyc6IHsgLyogb2JqZWN0ICovCi0JCVB5VHlwZU9iamVjdCAqdHlwZTsKLQkJUHlPYmplY3QgKipwOwotCQlpZiAoKmZvcm1hdCA9PSAnIScpIHsKLQkJCXR5cGUgPSB2YV9hcmcoKnBfdmEsIFB5VHlwZU9iamVjdCopOwotCQkJcCA9IHZhX2FyZygqcF92YSwgUHlPYmplY3QgKiopOwotCQkJZm9ybWF0Kys7Ci0JCQlpZiAoUHlUeXBlX0lzU3VidHlwZShhcmctPm9iX3R5cGUsIHR5cGUpKQotCQkJCSpwID0gYXJnOwotCQkJZWxzZQotCQkJCXJldHVybiBjb252ZXJ0ZXJyKHR5cGUtPnRwX25hbWUsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKIAotCQl9Ci0JCWVsc2UgaWYgKCpmb3JtYXQgPT0gJz8nKSB7Ci0JCQlpbnF1aXJ5IHByZWQgPSB2YV9hcmcoKnBfdmEsIGlucXVpcnkpOwotCQkJcCA9IHZhX2FyZygqcF92YSwgUHlPYmplY3QgKiopOwotCQkJZm9ybWF0Kys7Ci0JCQlpZiAoKCpwcmVkKShhcmcpKSAKLQkJCQkqcCA9IGFyZzsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gY29udmVydGVycigiKHVuc3BlY2lmaWVkKSIsIAotCQkJCQkJICBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0JCQkJCi0JCX0KLQkJZWxzZSBpZiAoKmZvcm1hdCA9PSAnJicpIHsKLQkJCXR5cGVkZWYgaW50ICgqY29udmVydGVyKShQeU9iamVjdCAqLCB2b2lkICopOwotCQkJY29udmVydGVyIGNvbnZlcnQgPSB2YV9hcmcoKnBfdmEsIGNvbnZlcnRlcik7Ci0JCQl2b2lkICphZGRyID0gdmFfYXJnKCpwX3ZhLCB2b2lkICopOwotCQkJZm9ybWF0Kys7Ci0JCQlpZiAoISAoKmNvbnZlcnQpKGFyZywgYWRkcikpCi0JCQkJcmV0dXJuIGNvbnZlcnRlcnIoIih1bnNwZWNpZmllZCkiLCAKLQkJCQkJCSAgYXJnLCBtc2didWYsIGJ1ZnNpemUpOwotCQl9Ci0JCWVsc2UgewotCQkJcCA9IHZhX2FyZygqcF92YSwgUHlPYmplY3QgKiopOwotCQkJKnAgPSBhcmc7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCQkKLQkJCi0JY2FzZSAndyc6IHsgLyogbWVtb3J5IGJ1ZmZlciwgcmVhZC13cml0ZSBhY2Nlc3MgKi8KLQkJdm9pZCAqKnAgPSB2YV9hcmcoKnBfdmEsIHZvaWQgKiopOwotCQl2b2lkICpyZXM7Ci0JCVB5QnVmZmVyUHJvY3MgKnBiID0gYXJnLT5vYl90eXBlLT50cF9hc19idWZmZXI7Ci0JCVB5X3NzaXplX3QgY291bnQ7CisgICAgY2FzZSAnTyc6IHsgLyogb2JqZWN0ICovCisgICAgICAgIFB5VHlwZU9iamVjdCAqdHlwZTsKKyAgICAgICAgUHlPYmplY3QgKipwOworICAgICAgICBpZiAoKmZvcm1hdCA9PSAnIScpIHsKKyAgICAgICAgICAgIHR5cGUgPSB2YV9hcmcoKnBfdmEsIFB5VHlwZU9iamVjdCopOworICAgICAgICAgICAgcCA9IHZhX2FyZygqcF92YSwgUHlPYmplY3QgKiopOworICAgICAgICAgICAgZm9ybWF0Kys7CisgICAgICAgICAgICBpZiAoUHlUeXBlX0lzU3VidHlwZShhcmctPm9iX3R5cGUsIHR5cGUpKQorICAgICAgICAgICAgICAgICpwID0gYXJnOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKHR5cGUtPnRwX25hbWUsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKIAotCQlpZiAocGIgJiYgcGItPmJmX3JlbGVhc2VidWZmZXIgJiYgKmZvcm1hdCAhPSAnKicpCi0JCQkvKiBCdWZmZXIgbXVzdCBiZSByZWxlYXNlZCwgeWV0IGNhbGxlciBkb2VzIG5vdCB1c2UKLQkJCSAgIHRoZSBQeV9idWZmZXIgcHJvdG9jb2wuICovCi0JCQlyZXR1cm4gY29udmVydGVycigicGlubmVkIGJ1ZmZlciIsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgqZm9ybWF0ID09ICc/JykgeworICAgICAgICAgICAgaW5xdWlyeSBwcmVkID0gdmFfYXJnKCpwX3ZhLCBpbnF1aXJ5KTsKKyAgICAgICAgICAgIHAgPSB2YV9hcmcoKnBfdmEsIFB5T2JqZWN0ICoqKTsKKyAgICAgICAgICAgIGZvcm1hdCsrOworICAgICAgICAgICAgaWYgKCgqcHJlZCkoYXJnKSkKKyAgICAgICAgICAgICAgICAqcCA9IGFyZzsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gY29udmVydGVycigiKHVuc3BlY2lmaWVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnLCBtc2didWYsIGJ1ZnNpemUpOwogCi0JCWlmIChwYiAmJiBwYi0+YmZfZ2V0YnVmZmVyICYmICpmb3JtYXQgPT0gJyonKSB7Ci0JCQkvKiBDYWxsZXIgaXMgaW50ZXJlc3RlZCBpbiBQeV9idWZmZXIsIGFuZCB0aGUgb2JqZWN0Ci0JCQkgICBzdXBwb3J0cyBpdCBkaXJlY3RseS4gKi8KLQkJCWZvcm1hdCsrOwotCQkJaWYgKHBiLT5iZl9nZXRidWZmZXIoYXJnLCAoUHlfYnVmZmVyKilwLCBQeUJVRl9XUklUQUJMRSkgPCAwKSB7Ci0JCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCQlyZXR1cm4gY29udmVydGVycigicmVhZC13cml0ZSBidWZmZXIiLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0JCQl9Ci0JCQlpZiAoYWRkY2xlYW51cChwLCBmcmVlbGlzdCwgY2xlYW51cF9idWZmZXIpKSB7Ci0JCQkJcmV0dXJuIGNvbnZlcnRlcnIoCi0JCQkJCSIoY2xlYW51cCBwcm9ibGVtKSIsCi0JCQkJCWFyZywgbXNnYnVmLCBidWZzaXplKTsKLQkJCX0KLQkJCWlmICghUHlCdWZmZXJfSXNDb250aWd1b3VzKChQeV9idWZmZXIqKXAsICdDJykpCi0JCQkJcmV0dXJuIGNvbnZlcnRlcnIoImNvbnRpZ3VvdXMgYnVmZmVyIiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOwotCQkJYnJlYWs7Ci0JCX0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgqZm9ybWF0ID09ICcmJykgeworICAgICAgICAgICAgdHlwZWRlZiBpbnQgKCpjb252ZXJ0ZXIpKFB5T2JqZWN0ICosIHZvaWQgKik7CisgICAgICAgICAgICBjb252ZXJ0ZXIgY29udmVydCA9IHZhX2FyZygqcF92YSwgY29udmVydGVyKTsKKyAgICAgICAgICAgIHZvaWQgKmFkZHIgPSB2YV9hcmcoKnBfdmEsIHZvaWQgKik7CisgICAgICAgICAgICBmb3JtYXQrKzsKKyAgICAgICAgICAgIGlmICghICgqY29udmVydCkoYXJnLCBhZGRyKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gY29udmVydGVycigiKHVuc3BlY2lmaWVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnLCBtc2didWYsIGJ1ZnNpemUpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcCA9IHZhX2FyZygqcF92YSwgUHlPYmplY3QgKiopOworICAgICAgICAgICAgKnAgPSBhcmc7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQogCi0JCWlmIChwYiA9PSBOVUxMIHx8Ci0JCSAgICBwYi0+YmZfZ2V0d3JpdGVidWZmZXIgPT0gTlVMTCB8fAotCQkgICAgcGItPmJmX2dldHNlZ2NvdW50ID09IE5VTEwpCi0JCQlyZXR1cm4gY29udmVydGVycigicmVhZC13cml0ZSBidWZmZXIiLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0JCWlmICgoKnBiLT5iZl9nZXRzZWdjb3VudCkoYXJnLCBOVUxMKSAhPSAxKQotCQkJcmV0dXJuIGNvbnZlcnRlcnIoInNpbmdsZS1zZWdtZW50IHJlYWQtd3JpdGUgYnVmZmVyIiwgCi0JCQkJCSAgYXJnLCBtc2didWYsIGJ1ZnNpemUpOwotCQlpZiAoKGNvdW50ID0gcGItPmJmX2dldHdyaXRlYnVmZmVyKGFyZywgMCwgJnJlcykpIDwgMCkKLQkJCXJldHVybiBjb252ZXJ0ZXJyKCIodW5zcGVjaWZpZWQpIiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOwotCQlpZiAoKmZvcm1hdCA9PSAnKicpIHsKLQkJCVB5QnVmZmVyX0ZpbGxJbmZvKChQeV9idWZmZXIqKXAsIGFyZywgcmVzLCBjb3VudCwgMSwgMCk7Ci0JCQlmb3JtYXQrKzsKLQkJfQotCQllbHNlIHsKLQkJCSpwID0gcmVzOwotCQkJaWYgKCpmb3JtYXQgPT0gJyMnKSB7Ci0JCQkJRkVUQ0hfU0laRTsKLQkJCQlTVE9SRV9TSVpFKGNvdW50KTsKLQkJCQlmb3JtYXQrKzsKLQkJCX0KLQkJfQotCQlicmVhazsKLQl9Ci0JCQotCWNhc2UgJ3QnOiB7IC8qIDgtYml0IGNoYXJhY3RlciBidWZmZXIsIHJlYWQtb25seSBhY2Nlc3MgKi8KLQkJY2hhciAqKnAgPSB2YV9hcmcoKnBfdmEsIGNoYXIgKiopOwotCQlQeUJ1ZmZlclByb2NzICpwYiA9IGFyZy0+b2JfdHlwZS0+dHBfYXNfYnVmZmVyOwotCQlQeV9zc2l6ZV90IGNvdW50OwotCQkKLQkJaWYgKCpmb3JtYXQrKyAhPSAnIycpCi0JCQlyZXR1cm4gY29udmVydGVycigKLQkJCQkiaW52YWxpZCB1c2Ugb2YgJ3QnIGZvcm1hdCBjaGFyYWN0ZXIiLCAKLQkJCQlhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0JCWlmICghUHlUeXBlX0hhc0ZlYXR1cmUoYXJnLT5vYl90eXBlLAotCQkJCSAgICAgICBQeV9UUEZMQUdTX0hBVkVfR0VUQ0hBUkJVRkZFUikgfHwKLQkJICAgIHBiID09IE5VTEwgfHwgcGItPmJmX2dldGNoYXJidWZmZXIgPT0gTlVMTCB8fAotCQkgICAgcGItPmJmX2dldHNlZ2NvdW50ID09IE5VTEwpCi0JCQlyZXR1cm4gY29udmVydGVycigKLQkJCQkic3RyaW5nIG9yIHJlYWQtb25seSBjaGFyYWN0ZXIgYnVmZmVyIiwKLQkJCQlhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CiAKLQkJaWYgKHBiLT5iZl9nZXRzZWdjb3VudChhcmcsIE5VTEwpICE9IDEpCi0JCQlyZXR1cm4gY29udmVydGVycigKLQkJCQkic3RyaW5nIG9yIHNpbmdsZS1zZWdtZW50IHJlYWQtb25seSBidWZmZXIiLAotCQkJCWFyZywgbXNnYnVmLCBidWZzaXplKTsKKyAgICBjYXNlICd3JzogeyAvKiBtZW1vcnkgYnVmZmVyLCByZWFkLXdyaXRlIGFjY2VzcyAqLworICAgICAgICB2b2lkICoqcCA9IHZhX2FyZygqcF92YSwgdm9pZCAqKik7CisgICAgICAgIHZvaWQgKnJlczsKKyAgICAgICAgUHlCdWZmZXJQcm9jcyAqcGIgPSBhcmctPm9iX3R5cGUtPnRwX2FzX2J1ZmZlcjsKKyAgICAgICAgUHlfc3NpemVfdCBjb3VudDsKIAotCQlpZiAocGItPmJmX3JlbGVhc2VidWZmZXIpCi0JCQlyZXR1cm4gY29udmVydGVycigKLQkJCQkic3RyaW5nIG9yIHBpbm5lZCBidWZmZXIiLAotCQkJCWFyZywgbXNnYnVmLCBidWZzaXplKTsKKyAgICAgICAgaWYgKHBiICYmIHBiLT5iZl9yZWxlYXNlYnVmZmVyICYmICpmb3JtYXQgIT0gJyonKQorICAgICAgICAgICAgLyogQnVmZmVyIG11c3QgYmUgcmVsZWFzZWQsIHlldCBjYWxsZXIgZG9lcyBub3QgdXNlCisgICAgICAgICAgICAgICB0aGUgUHlfYnVmZmVyIHByb3RvY29sLiAqLworICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlcnIoInBpbm5lZCBidWZmZXIiLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CiAKLQkJY291bnQgPSBwYi0+YmZfZ2V0Y2hhcmJ1ZmZlcihhcmcsIDAsIHApOwotCQlpZiAoY291bnQgPCAwKQotCQkJcmV0dXJuIGNvbnZlcnRlcnIoIih1bnNwZWNpZmllZCkiLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0JCXsKLQkJCUZFVENIX1NJWkU7Ci0JCQlTVE9SRV9TSVpFKGNvdW50KTsKLQkJfQotCQlicmVhazsKLQl9CisgICAgICAgIGlmIChwYiAmJiBwYi0+YmZfZ2V0YnVmZmVyICYmICpmb3JtYXQgPT0gJyonKSB7CisgICAgICAgICAgICAvKiBDYWxsZXIgaXMgaW50ZXJlc3RlZCBpbiBQeV9idWZmZXIsIGFuZCB0aGUgb2JqZWN0CisgICAgICAgICAgICAgICBzdXBwb3J0cyBpdCBkaXJlY3RseS4gKi8KKyAgICAgICAgICAgIGZvcm1hdCsrOworICAgICAgICAgICAgaWYgKHBiLT5iZl9nZXRidWZmZXIoYXJnLCAoUHlfYnVmZmVyKilwLCBQeUJVRl9XUklUQUJMRSkgPCAwKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gY29udmVydGVycigicmVhZC13cml0ZSBidWZmZXIiLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYWRkY2xlYW51cChwLCBmcmVlbGlzdCwgY2xlYW51cF9idWZmZXIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlcnIoCisgICAgICAgICAgICAgICAgICAgICIoY2xlYW51cCBwcm9ibGVtKSIsCisgICAgICAgICAgICAgICAgICAgIGFyZywgbXNnYnVmLCBidWZzaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghUHlCdWZmZXJfSXNDb250aWd1b3VzKChQeV9idWZmZXIqKXAsICdDJykpCisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlcnIoImNvbnRpZ3VvdXMgYnVmZmVyIiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KIAotCWRlZmF1bHQ6Ci0JCXJldHVybiBjb252ZXJ0ZXJyKCJpbXBvc3NpYmxlPGJhZCBmb3JtYXQgY2hhcj4iLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0JCi0JfQotCQotCSpwX2Zvcm1hdCA9IGZvcm1hdDsKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKHBiID09IE5VTEwgfHwKKyAgICAgICAgICAgIHBiLT5iZl9nZXR3cml0ZWJ1ZmZlciA9PSBOVUxMIHx8CisgICAgICAgICAgICBwYi0+YmZfZ2V0c2VnY291bnQgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKCJyZWFkLXdyaXRlIGJ1ZmZlciIsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKKyAgICAgICAgaWYgKCgqcGItPmJmX2dldHNlZ2NvdW50KShhcmcsIE5VTEwpICE9IDEpCisgICAgICAgICAgICByZXR1cm4gY29udmVydGVycigic2luZ2xlLXNlZ21lbnQgcmVhZC13cml0ZSBidWZmZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnLCBtc2didWYsIGJ1ZnNpemUpOworICAgICAgICBpZiAoKGNvdW50ID0gcGItPmJmX2dldHdyaXRlYnVmZmVyKGFyZywgMCwgJnJlcykpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKCIodW5zcGVjaWZpZWQpIiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOworICAgICAgICBpZiAoKmZvcm1hdCA9PSAnKicpIHsKKyAgICAgICAgICAgIFB5QnVmZmVyX0ZpbGxJbmZvKChQeV9idWZmZXIqKXAsIGFyZywgcmVzLCBjb3VudCwgMSwgMCk7CisgICAgICAgICAgICBmb3JtYXQrKzsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICpwID0gcmVzOworICAgICAgICAgICAgaWYgKCpmb3JtYXQgPT0gJyMnKSB7CisgICAgICAgICAgICAgICAgRkVUQ0hfU0laRTsKKyAgICAgICAgICAgICAgICBTVE9SRV9TSVpFKGNvdW50KTsKKyAgICAgICAgICAgICAgICBmb3JtYXQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlICd0JzogeyAvKiA4LWJpdCBjaGFyYWN0ZXIgYnVmZmVyLCByZWFkLW9ubHkgYWNjZXNzICovCisgICAgICAgIGNoYXIgKipwID0gdmFfYXJnKCpwX3ZhLCBjaGFyICoqKTsKKyAgICAgICAgUHlCdWZmZXJQcm9jcyAqcGIgPSBhcmctPm9iX3R5cGUtPnRwX2FzX2J1ZmZlcjsKKyAgICAgICAgUHlfc3NpemVfdCBjb3VudDsKKworICAgICAgICBpZiAoKmZvcm1hdCsrICE9ICcjJykKKyAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKAorICAgICAgICAgICAgICAgICJpbnZhbGlkIHVzZSBvZiAndCcgZm9ybWF0IGNoYXJhY3RlciIsCisgICAgICAgICAgICAgICAgYXJnLCBtc2didWYsIGJ1ZnNpemUpOworICAgICAgICBpZiAoIVB5VHlwZV9IYXNGZWF0dXJlKGFyZy0+b2JfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9UUEZMQUdTX0hBVkVfR0VUQ0hBUkJVRkZFUikgfHwKKyAgICAgICAgICAgIHBiID09IE5VTEwgfHwgcGItPmJmX2dldGNoYXJidWZmZXIgPT0gTlVMTCB8fAorICAgICAgICAgICAgcGItPmJmX2dldHNlZ2NvdW50ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gY29udmVydGVycigKKyAgICAgICAgICAgICAgICAic3RyaW5nIG9yIHJlYWQtb25seSBjaGFyYWN0ZXIgYnVmZmVyIiwKKyAgICAgICAgICAgICAgICBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CisKKyAgICAgICAgaWYgKHBiLT5iZl9nZXRzZWdjb3VudChhcmcsIE5VTEwpICE9IDEpCisgICAgICAgICAgICByZXR1cm4gY29udmVydGVycigKKyAgICAgICAgICAgICAgICAic3RyaW5nIG9yIHNpbmdsZS1zZWdtZW50IHJlYWQtb25seSBidWZmZXIiLAorICAgICAgICAgICAgICAgIGFyZywgbXNnYnVmLCBidWZzaXplKTsKKworICAgICAgICBpZiAocGItPmJmX3JlbGVhc2VidWZmZXIpCisgICAgICAgICAgICByZXR1cm4gY29udmVydGVycigKKyAgICAgICAgICAgICAgICAic3RyaW5nIG9yIHBpbm5lZCBidWZmZXIiLAorICAgICAgICAgICAgICAgIGFyZywgbXNnYnVmLCBidWZzaXplKTsKKworICAgICAgICBjb3VudCA9IHBiLT5iZl9nZXRjaGFyYnVmZmVyKGFyZywgMCwgcCk7CisgICAgICAgIGlmIChjb3VudCA8IDApCisgICAgICAgICAgICByZXR1cm4gY29udmVydGVycigiKHVuc3BlY2lmaWVkKSIsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKKyAgICAgICAgeworICAgICAgICAgICAgRkVUQ0hfU0laRTsKKyAgICAgICAgICAgIFNUT1JFX1NJWkUoY291bnQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKCJpbXBvc3NpYmxlPGJhZCBmb3JtYXQgY2hhcj4iLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CisKKyAgICB9CisKKyAgICAqcF9mb3JtYXQgPSBmb3JtYXQ7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBQeV9zc2l6ZV90CiBjb252ZXJ0YnVmZmVyKFB5T2JqZWN0ICphcmcsIHZvaWQgKipwLCBjaGFyICoqZXJybXNnKQogewotCVB5QnVmZmVyUHJvY3MgKnBiID0gYXJnLT5vYl90eXBlLT50cF9hc19idWZmZXI7Ci0JUHlfc3NpemVfdCBjb3VudDsKLQlpZiAocGIgPT0gTlVMTCB8fAotCSAgICBwYi0+YmZfZ2V0cmVhZGJ1ZmZlciA9PSBOVUxMIHx8Ci0JICAgIHBiLT5iZl9nZXRzZWdjb3VudCA9PSBOVUxMIHx8Ci0JICAgIHBiLT5iZl9yZWxlYXNlYnVmZmVyICE9IE5VTEwpIHsKLQkJKmVycm1zZyA9ICJzdHJpbmcgb3IgcmVhZC1vbmx5IGJ1ZmZlciI7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKCgqcGItPmJmX2dldHNlZ2NvdW50KShhcmcsIE5VTEwpICE9IDEpIHsKLQkJKmVycm1zZyA9ICJzdHJpbmcgb3Igc2luZ2xlLXNlZ21lbnQgcmVhZC1vbmx5IGJ1ZmZlciI7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKChjb3VudCA9ICgqcGItPmJmX2dldHJlYWRidWZmZXIpKGFyZywgMCwgcCkpIDwgMCkgewotCQkqZXJybXNnID0gIih1bnNwZWNpZmllZCkiOwotCX0KLQlyZXR1cm4gY291bnQ7CisgICAgUHlCdWZmZXJQcm9jcyAqcGIgPSBhcmctPm9iX3R5cGUtPnRwX2FzX2J1ZmZlcjsKKyAgICBQeV9zc2l6ZV90IGNvdW50OworICAgIGlmIChwYiA9PSBOVUxMIHx8CisgICAgICAgIHBiLT5iZl9nZXRyZWFkYnVmZmVyID09IE5VTEwgfHwKKyAgICAgICAgcGItPmJmX2dldHNlZ2NvdW50ID09IE5VTEwgfHwKKyAgICAgICAgcGItPmJmX3JlbGVhc2VidWZmZXIgIT0gTlVMTCkgeworICAgICAgICAqZXJybXNnID0gInN0cmluZyBvciByZWFkLW9ubHkgYnVmZmVyIjsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoKCpwYi0+YmZfZ2V0c2VnY291bnQpKGFyZywgTlVMTCkgIT0gMSkgeworICAgICAgICAqZXJybXNnID0gInN0cmluZyBvciBzaW5nbGUtc2VnbWVudCByZWFkLW9ubHkgYnVmZmVyIjsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoKGNvdW50ID0gKCpwYi0+YmZfZ2V0cmVhZGJ1ZmZlcikoYXJnLCAwLCBwKSkgPCAwKSB7CisgICAgICAgICplcnJtc2cgPSAiKHVuc3BlY2lmaWVkKSI7CisgICAgfQorICAgIHJldHVybiBjb3VudDsKIH0KIAogc3RhdGljIGludAogZ2V0YnVmZmVyKFB5T2JqZWN0ICphcmcsIFB5X2J1ZmZlciAqdmlldywgY2hhciAqKmVycm1zZykKIHsKLQl2b2lkICpidWY7Ci0JUHlfc3NpemVfdCBjb3VudDsKLQlQeUJ1ZmZlclByb2NzICpwYiA9IGFyZy0+b2JfdHlwZS0+dHBfYXNfYnVmZmVyOwotCWlmIChwYiA9PSBOVUxMKSB7Ci0JCSplcnJtc2cgPSAic3RyaW5nIG9yIGJ1ZmZlciI7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKHBiLT5iZl9nZXRidWZmZXIpIHsKLQkJaWYgKHBiLT5iZl9nZXRidWZmZXIoYXJnLCB2aWV3LCAwKSA8IDApIHsKLQkJCSplcnJtc2cgPSAiY29udmVydGlibGUgdG8gYSBidWZmZXIiOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWlmICghUHlCdWZmZXJfSXNDb250aWd1b3VzKHZpZXcsICdDJykpIHsKLQkJCSplcnJtc2cgPSAiY29udGlndW91cyBidWZmZXIiOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCXJldHVybiAwOwotCX0KKyAgICB2b2lkICpidWY7CisgICAgUHlfc3NpemVfdCBjb3VudDsKKyAgICBQeUJ1ZmZlclByb2NzICpwYiA9IGFyZy0+b2JfdHlwZS0+dHBfYXNfYnVmZmVyOworICAgIGlmIChwYiA9PSBOVUxMKSB7CisgICAgICAgICplcnJtc2cgPSAic3RyaW5nIG9yIGJ1ZmZlciI7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKHBiLT5iZl9nZXRidWZmZXIpIHsKKyAgICAgICAgaWYgKHBiLT5iZl9nZXRidWZmZXIoYXJnLCB2aWV3LCAwKSA8IDApIHsKKyAgICAgICAgICAgICplcnJtc2cgPSAiY29udmVydGlibGUgdG8gYSBidWZmZXIiOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGlmICghUHlCdWZmZXJfSXNDb250aWd1b3VzKHZpZXcsICdDJykpIHsKKyAgICAgICAgICAgICplcnJtc2cgPSAiY29udGlndW91cyBidWZmZXIiOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KIAotCWNvdW50ID0gY29udmVydGJ1ZmZlcihhcmcsICZidWYsIGVycm1zZyk7Ci0JaWYgKGNvdW50IDwgMCkgewotCQkqZXJybXNnID0gImNvbnZlcnRpYmxlIHRvIGEgYnVmZmVyIjsKLQkJcmV0dXJuIGNvdW50OwotCX0KLQlQeUJ1ZmZlcl9GaWxsSW5mbyh2aWV3LCBOVUxMLCBidWYsIGNvdW50LCAxLCAwKTsKLQlyZXR1cm4gMDsKKyAgICBjb3VudCA9IGNvbnZlcnRidWZmZXIoYXJnLCAmYnVmLCBlcnJtc2cpOworICAgIGlmIChjb3VudCA8IDApIHsKKyAgICAgICAgKmVycm1zZyA9ICJjb252ZXJ0aWJsZSB0byBhIGJ1ZmZlciI7CisgICAgICAgIHJldHVybiBjb3VudDsKKyAgICB9CisgICAgUHlCdWZmZXJfRmlsbEluZm8odmlldywgTlVMTCwgYnVmLCBjb3VudCwgMSwgMCk7CisgICAgcmV0dXJuIDA7CiB9CiAKIC8qIFN1cHBvcnQgZm9yIGtleXdvcmQgYXJndW1lbnRzIGRvbmF0ZWQgYnkKQEAgLTEzNzQsNDk3ICsxMzc0LDQ5NyBAQAogLyogUmV0dXJuIGZhbHNlICgwKSBmb3IgZXJyb3IsIGVsc2UgdHJ1ZS4gKi8KIGludAogUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKFB5T2JqZWN0ICphcmdzLAotCQkJICAgIFB5T2JqZWN0ICprZXl3b3JkcywKLQkJCSAgICBjb25zdCBjaGFyICpmb3JtYXQsIAotCQkJICAgIGNoYXIgKiprd2xpc3QsIC4uLikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqa2V5d29yZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKiprd2xpc3QsIC4uLikKIHsKLQlpbnQgcmV0dmFsOwotCXZhX2xpc3QgdmE7CisgICAgaW50IHJldHZhbDsKKyAgICB2YV9saXN0IHZhOwogCi0JaWYgKChhcmdzID09IE5VTEwgfHwgIVB5VHVwbGVfQ2hlY2soYXJncykpIHx8Ci0JICAgIChrZXl3b3JkcyAhPSBOVUxMICYmICFQeURpY3RfQ2hlY2soa2V5d29yZHMpKSB8fAotCSAgICBmb3JtYXQgPT0gTlVMTCB8fAotCSAgICBrd2xpc3QgPT0gTlVMTCkKLQl7Ci0JCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotCQlyZXR1cm4gMDsKLQl9CisgICAgaWYgKChhcmdzID09IE5VTEwgfHwgIVB5VHVwbGVfQ2hlY2soYXJncykpIHx8CisgICAgICAgIChrZXl3b3JkcyAhPSBOVUxMICYmICFQeURpY3RfQ2hlY2soa2V5d29yZHMpKSB8fAorICAgICAgICBmb3JtYXQgPT0gTlVMTCB8fAorICAgICAgICBrd2xpc3QgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLQl2YV9zdGFydCh2YSwga3dsaXN0KTsKLQlyZXR2YWwgPSB2Z2V0YXJnc2tleXdvcmRzKGFyZ3MsIGtleXdvcmRzLCBmb3JtYXQsIGt3bGlzdCwgJnZhLCAwKTsJCi0JdmFfZW5kKHZhKTsKLQlyZXR1cm4gcmV0dmFsOworICAgIHZhX3N0YXJ0KHZhLCBrd2xpc3QpOworICAgIHJldHZhbCA9IHZnZXRhcmdza2V5d29yZHMoYXJncywga2V5d29yZHMsIGZvcm1hdCwga3dsaXN0LCAmdmEsIDApOworICAgIHZhX2VuZCh2YSk7CisgICAgcmV0dXJuIHJldHZhbDsKIH0KIAogaW50CiBfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzX1NpemVUKFB5T2JqZWN0ICphcmdzLAotCQkJCSAgUHlPYmplY3QgKmtleXdvcmRzLAotCQkJCSAgY29uc3QgY2hhciAqZm9ybWF0LCAKLQkJCQkgIGNoYXIgKiprd2xpc3QsIC4uLikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqa2V5d29yZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKiprd2xpc3QsIC4uLikKIHsKLQlpbnQgcmV0dmFsOwotCXZhX2xpc3QgdmE7CisgICAgaW50IHJldHZhbDsKKyAgICB2YV9saXN0IHZhOwogCi0JaWYgKChhcmdzID09IE5VTEwgfHwgIVB5VHVwbGVfQ2hlY2soYXJncykpIHx8Ci0JICAgIChrZXl3b3JkcyAhPSBOVUxMICYmICFQeURpY3RfQ2hlY2soa2V5d29yZHMpKSB8fAotCSAgICBmb3JtYXQgPT0gTlVMTCB8fAotCSAgICBrd2xpc3QgPT0gTlVMTCkKLQl7Ci0JCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotCQlyZXR1cm4gMDsKLQl9CisgICAgaWYgKChhcmdzID09IE5VTEwgfHwgIVB5VHVwbGVfQ2hlY2soYXJncykpIHx8CisgICAgICAgIChrZXl3b3JkcyAhPSBOVUxMICYmICFQeURpY3RfQ2hlY2soa2V5d29yZHMpKSB8fAorICAgICAgICBmb3JtYXQgPT0gTlVMTCB8fAorICAgICAgICBrd2xpc3QgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLQl2YV9zdGFydCh2YSwga3dsaXN0KTsKLQlyZXR2YWwgPSB2Z2V0YXJnc2tleXdvcmRzKGFyZ3MsIGtleXdvcmRzLCBmb3JtYXQsIAotCQkJCSAga3dsaXN0LCAmdmEsIEZMQUdfU0laRV9UKTsKLQl2YV9lbmQodmEpOwotCXJldHVybiByZXR2YWw7CisgICAgdmFfc3RhcnQodmEsIGt3bGlzdCk7CisgICAgcmV0dmFsID0gdmdldGFyZ3NrZXl3b3JkcyhhcmdzLCBrZXl3b3JkcywgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3dsaXN0LCAmdmEsIEZMQUdfU0laRV9UKTsKKyAgICB2YV9lbmQodmEpOworICAgIHJldHVybiByZXR2YWw7CiB9CiAKIAogaW50CiBQeUFyZ19WYVBhcnNlVHVwbGVBbmRLZXl3b3JkcyhQeU9iamVjdCAqYXJncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICprZXl3b3JkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZvcm1hdCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICoqa3dsaXN0LCB2YV9saXN0IHZhKQogewotCWludCByZXR2YWw7Ci0JdmFfbGlzdCBsdmE7CisgICAgaW50IHJldHZhbDsKKyAgICB2YV9saXN0IGx2YTsKIAotCWlmICgoYXJncyA9PSBOVUxMIHx8ICFQeVR1cGxlX0NoZWNrKGFyZ3MpKSB8fAotCSAgICAoa2V5d29yZHMgIT0gTlVMTCAmJiAhUHlEaWN0X0NoZWNrKGtleXdvcmRzKSkgfHwKLQkgICAgZm9ybWF0ID09IE5VTEwgfHwKLQkgICAga3dsaXN0ID09IE5VTEwpCi0JewotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIDA7Ci0JfQorICAgIGlmICgoYXJncyA9PSBOVUxMIHx8ICFQeVR1cGxlX0NoZWNrKGFyZ3MpKSB8fAorICAgICAgICAoa2V5d29yZHMgIT0gTlVMTCAmJiAhUHlEaWN0X0NoZWNrKGtleXdvcmRzKSkgfHwKKyAgICAgICAgZm9ybWF0ID09IE5VTEwgfHwKKyAgICAgICAga3dsaXN0ID09IE5VTEwpCisgICAgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCiAjaWZkZWYgVkFfTElTVF9JU19BUlJBWQotCW1lbWNweShsdmEsIHZhLCBzaXplb2YodmFfbGlzdCkpOworICAgIG1lbWNweShsdmEsIHZhLCBzaXplb2YodmFfbGlzdCkpOwogI2Vsc2UKICNpZmRlZiBfX3ZhX2NvcHkKLQlfX3ZhX2NvcHkobHZhLCB2YSk7CisgICAgX192YV9jb3B5KGx2YSwgdmEpOwogI2Vsc2UKLQlsdmEgPSB2YTsKKyAgICBsdmEgPSB2YTsKICNlbmRpZgogI2VuZGlmCiAKLQlyZXR2YWwgPSB2Z2V0YXJnc2tleXdvcmRzKGFyZ3MsIGtleXdvcmRzLCBmb3JtYXQsIGt3bGlzdCwgJmx2YSwgMCk7CQotCXJldHVybiByZXR2YWw7CisgICAgcmV0dmFsID0gdmdldGFyZ3NrZXl3b3JkcyhhcmdzLCBrZXl3b3JkcywgZm9ybWF0LCBrd2xpc3QsICZsdmEsIDApOworICAgIHJldHVybiByZXR2YWw7CiB9CiAKIGludAogX1B5QXJnX1ZhUGFyc2VUdXBsZUFuZEtleXdvcmRzX1NpemVUKFB5T2JqZWN0ICphcmdzLAotCQkJCSAgICBQeU9iamVjdCAqa2V5d29yZHMsCi0JCQkJICAgIGNvbnN0IGNoYXIgKmZvcm1hdCwgCi0JCQkJICAgIGNoYXIgKiprd2xpc3QsIHZhX2xpc3QgdmEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqa2V5d29yZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICoqa3dsaXN0LCB2YV9saXN0IHZhKQogewotCWludCByZXR2YWw7Ci0JdmFfbGlzdCBsdmE7CisgICAgaW50IHJldHZhbDsKKyAgICB2YV9saXN0IGx2YTsKIAotCWlmICgoYXJncyA9PSBOVUxMIHx8ICFQeVR1cGxlX0NoZWNrKGFyZ3MpKSB8fAotCSAgICAoa2V5d29yZHMgIT0gTlVMTCAmJiAhUHlEaWN0X0NoZWNrKGtleXdvcmRzKSkgfHwKLQkgICAgZm9ybWF0ID09IE5VTEwgfHwKLQkgICAga3dsaXN0ID09IE5VTEwpCi0JewotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIDA7Ci0JfQorICAgIGlmICgoYXJncyA9PSBOVUxMIHx8ICFQeVR1cGxlX0NoZWNrKGFyZ3MpKSB8fAorICAgICAgICAoa2V5d29yZHMgIT0gTlVMTCAmJiAhUHlEaWN0X0NoZWNrKGtleXdvcmRzKSkgfHwKKyAgICAgICAgZm9ybWF0ID09IE5VTEwgfHwKKyAgICAgICAga3dsaXN0ID09IE5VTEwpCisgICAgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCiAjaWZkZWYgVkFfTElTVF9JU19BUlJBWQotCW1lbWNweShsdmEsIHZhLCBzaXplb2YodmFfbGlzdCkpOworICAgIG1lbWNweShsdmEsIHZhLCBzaXplb2YodmFfbGlzdCkpOwogI2Vsc2UKICNpZmRlZiBfX3ZhX2NvcHkKLQlfX3ZhX2NvcHkobHZhLCB2YSk7CisgICAgX192YV9jb3B5KGx2YSwgdmEpOwogI2Vsc2UKLQlsdmEgPSB2YTsKKyAgICBsdmEgPSB2YTsKICNlbmRpZgogI2VuZGlmCiAKLQlyZXR2YWwgPSB2Z2V0YXJnc2tleXdvcmRzKGFyZ3MsIGtleXdvcmRzLCBmb3JtYXQsIAotCQkJCSAga3dsaXN0LCAmbHZhLCBGTEFHX1NJWkVfVCk7Ci0JcmV0dXJuIHJldHZhbDsKKyAgICByZXR2YWwgPSB2Z2V0YXJnc2tleXdvcmRzKGFyZ3MsIGtleXdvcmRzLCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrd2xpc3QsICZsdmEsIEZMQUdfU0laRV9UKTsKKyAgICByZXR1cm4gcmV0dmFsOwogfQogCiAjZGVmaW5lIElTX0VORF9PRl9GT1JNQVQoYykgKGMgPT0gJ1wwJyB8fCBjID09ICc7JyB8fCBjID09ICc6JykKIAogc3RhdGljIGludAogdmdldGFyZ3NrZXl3b3JkcyhQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmtleXdvcmRzLCBjb25zdCBjaGFyICpmb3JtYXQsCi0JICAgICAgICAgY2hhciAqKmt3bGlzdCwgdmFfbGlzdCAqcF92YSwgaW50IGZsYWdzKQorICAgICAgICAgICAgICAgICBjaGFyICoqa3dsaXN0LCB2YV9saXN0ICpwX3ZhLCBpbnQgZmxhZ3MpCiB7Ci0JY2hhciBtc2didWZbNTEyXTsKLQlpbnQgbGV2ZWxzWzMyXTsKLQljb25zdCBjaGFyICpmbmFtZSwgKm1zZywgKmN1c3RvbV9tc2csICprZXl3b3JkOwotCWludCBtaW4gPSBJTlRfTUFYOwotCWludCBpLCBsZW4sIG5hcmdzLCBua2V5d29yZHM7Ci0JUHlPYmplY3QgKmZyZWVsaXN0ID0gTlVMTCwgKmN1cnJlbnRfYXJnOworICAgIGNoYXIgbXNnYnVmWzUxMl07CisgICAgaW50IGxldmVsc1szMl07CisgICAgY29uc3QgY2hhciAqZm5hbWUsICptc2csICpjdXN0b21fbXNnLCAqa2V5d29yZDsKKyAgICBpbnQgbWluID0gSU5UX01BWDsKKyAgICBpbnQgaSwgbGVuLCBuYXJncywgbmtleXdvcmRzOworICAgIFB5T2JqZWN0ICpmcmVlbGlzdCA9IE5VTEwsICpjdXJyZW50X2FyZzsKIAotCWFzc2VydChhcmdzICE9IE5VTEwgJiYgUHlUdXBsZV9DaGVjayhhcmdzKSk7Ci0JYXNzZXJ0KGtleXdvcmRzID09IE5VTEwgfHwgUHlEaWN0X0NoZWNrKGtleXdvcmRzKSk7Ci0JYXNzZXJ0KGZvcm1hdCAhPSBOVUxMKTsKLQlhc3NlcnQoa3dsaXN0ICE9IE5VTEwpOwotCWFzc2VydChwX3ZhICE9IE5VTEwpOworICAgIGFzc2VydChhcmdzICE9IE5VTEwgJiYgUHlUdXBsZV9DaGVjayhhcmdzKSk7CisgICAgYXNzZXJ0KGtleXdvcmRzID09IE5VTEwgfHwgUHlEaWN0X0NoZWNrKGtleXdvcmRzKSk7CisgICAgYXNzZXJ0KGZvcm1hdCAhPSBOVUxMKTsKKyAgICBhc3NlcnQoa3dsaXN0ICE9IE5VTEwpOworICAgIGFzc2VydChwX3ZhICE9IE5VTEwpOwogCi0JLyogZ3JhYiB0aGUgZnVuY3Rpb24gbmFtZSBvciBjdXN0b20gZXJyb3IgbXNnIGZpcnN0IChtdXR1YWxseSBleGNsdXNpdmUpICovCi0JZm5hbWUgPSBzdHJjaHIoZm9ybWF0LCAnOicpOwotCWlmIChmbmFtZSkgewotCQlmbmFtZSsrOwotCQljdXN0b21fbXNnID0gTlVMTDsKLQl9Ci0JZWxzZSB7Ci0JCWN1c3RvbV9tc2cgPSBzdHJjaHIoZm9ybWF0LCc7Jyk7Ci0JCWlmIChjdXN0b21fbXNnKQotCQkJY3VzdG9tX21zZysrOwotCX0KKyAgICAvKiBncmFiIHRoZSBmdW5jdGlvbiBuYW1lIG9yIGN1c3RvbSBlcnJvciBtc2cgZmlyc3QgKG11dHVhbGx5IGV4Y2x1c2l2ZSkgKi8KKyAgICBmbmFtZSA9IHN0cmNocihmb3JtYXQsICc6Jyk7CisgICAgaWYgKGZuYW1lKSB7CisgICAgICAgIGZuYW1lKys7CisgICAgICAgIGN1c3RvbV9tc2cgPSBOVUxMOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgY3VzdG9tX21zZyA9IHN0cmNocihmb3JtYXQsJzsnKTsKKyAgICAgICAgaWYgKGN1c3RvbV9tc2cpCisgICAgICAgICAgICBjdXN0b21fbXNnKys7CisgICAgfQogCi0JLyogc2NhbiBrd2xpc3QgYW5kIGdldCBncmVhdGVzdCBwb3NzaWJsZSBuYnIgb2YgYXJncyAqLwotCWZvciAobGVuPTA7IGt3bGlzdFtsZW5dOyBsZW4rKykKLQkJY29udGludWU7CisgICAgLyogc2NhbiBrd2xpc3QgYW5kIGdldCBncmVhdGVzdCBwb3NzaWJsZSBuYnIgb2YgYXJncyAqLworICAgIGZvciAobGVuPTA7IGt3bGlzdFtsZW5dOyBsZW4rKykKKyAgICAgICAgY29udGludWU7CiAKLQluYXJncyA9IFB5VHVwbGVfR0VUX1NJWkUoYXJncyk7Ci0JbmtleXdvcmRzID0gKGtleXdvcmRzID09IE5VTEwpID8gMCA6IFB5RGljdF9TaXplKGtleXdvcmRzKTsKLQlpZiAobmFyZ3MgKyBua2V5d29yZHMgPiBsZW4pIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgIiVzJXMgdGFrZXMgYXQgbW9zdCAlZCAiCi0JCQkgICAgICJhcmd1bWVudCVzICglZCBnaXZlbikiLAotCQkJICAgICAoZm5hbWUgPT0gTlVMTCkgPyAiZnVuY3Rpb24iIDogZm5hbWUsCi0JCQkgICAgIChmbmFtZSA9PSBOVUxMKSA/ICIiIDogIigpIiwKLQkJCSAgICAgbGVuLAotCQkJICAgICAobGVuID09IDEpID8gIiIgOiAicyIsCi0JCQkgICAgIG5hcmdzICsgbmtleXdvcmRzKTsKLQkJcmV0dXJuIDA7Ci0JfQorICAgIG5hcmdzID0gUHlUdXBsZV9HRVRfU0laRShhcmdzKTsKKyAgICBua2V5d29yZHMgPSAoa2V5d29yZHMgPT0gTlVMTCkgPyAwIDogUHlEaWN0X1NpemUoa2V5d29yZHMpOworICAgIGlmIChuYXJncyArIG5rZXl3b3JkcyA+IGxlbikgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAiJXMlcyB0YWtlcyBhdCBtb3N0ICVkICIKKyAgICAgICAgICAgICAgICAgICAgICJhcmd1bWVudCVzICglZCBnaXZlbikiLAorICAgICAgICAgICAgICAgICAgICAgKGZuYW1lID09IE5VTEwpID8gImZ1bmN0aW9uIiA6IGZuYW1lLAorICAgICAgICAgICAgICAgICAgICAgKGZuYW1lID09IE5VTEwpID8gIiIgOiAiKCkiLAorICAgICAgICAgICAgICAgICAgICAgbGVuLAorICAgICAgICAgICAgICAgICAgICAgKGxlbiA9PSAxKSA/ICIiIDogInMiLAorICAgICAgICAgICAgICAgICAgICAgbmFyZ3MgKyBua2V5d29yZHMpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLQkvKiBjb252ZXJ0IHR1cGxlIGFyZ3MgYW5kIGtleXdvcmQgYXJncyBpbiBzYW1lIGxvb3AsIHVzaW5nIGt3bGlzdCB0byBkcml2ZSBwcm9jZXNzICovCi0JZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCWtleXdvcmQgPSBrd2xpc3RbaV07Ci0JCWlmICgqZm9ybWF0ID09ICd8JykgewotCQkJbWluID0gaTsKLQkJCWZvcm1hdCsrOwotCQl9Ci0JCWlmIChJU19FTkRfT0ZfRk9STUFUKCpmb3JtYXQpKSB7Ci0JCQlQeUVycl9Gb3JtYXQoUHlFeGNfUnVudGltZUVycm9yLAotCQkJCSAgICAgIk1vcmUga2V5d29yZCBsaXN0IGVudHJpZXMgKCVkKSB0aGFuICIKLQkJCQkgICAgICJmb3JtYXQgc3BlY2lmaWVycyAoJWQpIiwgbGVuLCBpKTsKLQkJCXJldHVybiBjbGVhbnJldHVybigwLCBmcmVlbGlzdCk7Ci0JCX0KLQkJY3VycmVudF9hcmcgPSBOVUxMOwotCQlpZiAobmtleXdvcmRzKSB7Ci0JCQljdXJyZW50X2FyZyA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKGtleXdvcmRzLCBrZXl3b3JkKTsKLQkJfQotCQlpZiAoY3VycmVudF9hcmcpIHsKLQkJCS0tbmtleXdvcmRzOwotCQkJaWYgKGkgPCBuYXJncykgewotCQkJCS8qIGFyZyBwcmVzZW50IGluIHR1cGxlIGFuZCBpbiBkaWN0ICovCi0JCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCQkJICAgICAiQXJndW1lbnQgZ2l2ZW4gYnkgbmFtZSAoJyVzJykgIgotCQkJCQkgICAgICJhbmQgcG9zaXRpb24gKCVkKSIsCi0JCQkJCSAgICAga2V5d29yZCwgaSsxKTsKLQkJCQlyZXR1cm4gY2xlYW5yZXR1cm4oMCwgZnJlZWxpc3QpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKG5rZXl3b3JkcyAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIGNsZWFucmV0dXJuKDAsIGZyZWVsaXN0KTsKLQkJZWxzZSBpZiAoaSA8IG5hcmdzKQotCQkJY3VycmVudF9hcmcgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIGkpOwotCQkJCi0JCWlmIChjdXJyZW50X2FyZykgewotCQkJbXNnID0gY29udmVydGl0ZW0oY3VycmVudF9hcmcsICZmb3JtYXQsIHBfdmEsIGZsYWdzLAotCQkJCWxldmVscywgbXNnYnVmLCBzaXplb2YobXNnYnVmKSwgJmZyZWVsaXN0KTsKLQkJCWlmIChtc2cpIHsKLQkJCQlzZXRlcnJvcihpKzEsIG1zZywgbGV2ZWxzLCBmbmFtZSwgY3VzdG9tX21zZyk7Ci0JCQkJcmV0dXJuIGNsZWFucmV0dXJuKDAsIGZyZWVsaXN0KTsKLQkJCX0KLQkJCWNvbnRpbnVlOwotCQl9CisgICAgLyogY29udmVydCB0dXBsZSBhcmdzIGFuZCBrZXl3b3JkIGFyZ3MgaW4gc2FtZSBsb29wLCB1c2luZyBrd2xpc3QgdG8gZHJpdmUgcHJvY2VzcyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICBrZXl3b3JkID0ga3dsaXN0W2ldOworICAgICAgICBpZiAoKmZvcm1hdCA9PSAnfCcpIHsKKyAgICAgICAgICAgIG1pbiA9IGk7CisgICAgICAgICAgICBmb3JtYXQrKzsKKyAgICAgICAgfQorICAgICAgICBpZiAoSVNfRU5EX09GX0ZPUk1BVCgqZm9ybWF0KSkgeworICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1J1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiTW9yZSBrZXl3b3JkIGxpc3QgZW50cmllcyAoJWQpIHRoYW4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICJmb3JtYXQgc3BlY2lmaWVycyAoJWQpIiwgbGVuLCBpKTsKKyAgICAgICAgICAgIHJldHVybiBjbGVhbnJldHVybigwLCBmcmVlbGlzdCk7CisgICAgICAgIH0KKyAgICAgICAgY3VycmVudF9hcmcgPSBOVUxMOworICAgICAgICBpZiAobmtleXdvcmRzKSB7CisgICAgICAgICAgICBjdXJyZW50X2FyZyA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKGtleXdvcmRzLCBrZXl3b3JkKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY3VycmVudF9hcmcpIHsKKyAgICAgICAgICAgIC0tbmtleXdvcmRzOworICAgICAgICAgICAgaWYgKGkgPCBuYXJncykgeworICAgICAgICAgICAgICAgIC8qIGFyZyBwcmVzZW50IGluIHR1cGxlIGFuZCBpbiBkaWN0ICovCisgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFyZ3VtZW50IGdpdmVuIGJ5IG5hbWUgKCclcycpICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFuZCBwb3NpdGlvbiAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5d29yZCwgaSsxKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gY2xlYW5yZXR1cm4oMCwgZnJlZWxpc3QpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKG5rZXl3b3JkcyAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgcmV0dXJuIGNsZWFucmV0dXJuKDAsIGZyZWVsaXN0KTsKKyAgICAgICAgZWxzZSBpZiAoaSA8IG5hcmdzKQorICAgICAgICAgICAgY3VycmVudF9hcmcgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIGkpOwogCi0JCWlmIChpIDwgbWluKSB7Ci0JCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAiUmVxdWlyZWQgYXJndW1lbnQgIgotCQkJCSAgICAgIiclcycgKHBvcyAlZCkgbm90IGZvdW5kIiwKLQkJCQkgICAgIGtleXdvcmQsIGkrMSk7Ci0JCQlyZXR1cm4gY2xlYW5yZXR1cm4oMCwgZnJlZWxpc3QpOwotCQl9Ci0JCS8qIGN1cnJlbnQgY29kZSByZXBvcnRzIHN1Y2Nlc3Mgd2hlbiBhbGwgcmVxdWlyZWQgYXJncwotCQkgKiBmdWxmaWxsZWQgYW5kIG5vIGtleXdvcmQgYXJncyBsZWZ0LCB3aXRoIG5vIGZ1cnRoZXIKLQkJICogdmFsaWRhdGlvbi4gWFhYIE1heWJlIHNraXAgdGhpcyBpbiBkZWJ1ZyBidWlsZCA/Ci0JCSAqLwotCQlpZiAoIW5rZXl3b3JkcykKLQkJCXJldHVybiBjbGVhbnJldHVybigxLCBmcmVlbGlzdCk7CisgICAgICAgIGlmIChjdXJyZW50X2FyZykgeworICAgICAgICAgICAgbXNnID0gY29udmVydGl0ZW0oY3VycmVudF9hcmcsICZmb3JtYXQsIHBfdmEsIGZsYWdzLAorICAgICAgICAgICAgICAgIGxldmVscywgbXNnYnVmLCBzaXplb2YobXNnYnVmKSwgJmZyZWVsaXN0KTsKKyAgICAgICAgICAgIGlmIChtc2cpIHsKKyAgICAgICAgICAgICAgICBzZXRlcnJvcihpKzEsIG1zZywgbGV2ZWxzLCBmbmFtZSwgY3VzdG9tX21zZyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNsZWFucmV0dXJuKDAsIGZyZWVsaXN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CiAKLQkJLyogV2UgYXJlIGludG8gb3B0aW9uYWwgYXJncywgc2tpcCB0aHJ1IHRvIGFueSByZW1haW5pbmcKLQkJICoga2V5d29yZCBhcmdzICovCi0JCW1zZyA9IHNraXBpdGVtKCZmb3JtYXQsIHBfdmEsIGZsYWdzKTsKLQkJaWYgKG1zZykgewotCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1J1bnRpbWVFcnJvciwgIiVzOiAnJXMnIiwgbXNnLAotCQkJCSAgICAgZm9ybWF0KTsKLQkJCXJldHVybiBjbGVhbnJldHVybigwLCBmcmVlbGlzdCk7Ci0JCX0KLQl9CisgICAgICAgIGlmIChpIDwgbWluKSB7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAiUmVxdWlyZWQgYXJndW1lbnQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICInJXMnIChwb3MgJWQpIG5vdCBmb3VuZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAga2V5d29yZCwgaSsxKTsKKyAgICAgICAgICAgIHJldHVybiBjbGVhbnJldHVybigwLCBmcmVlbGlzdCk7CisgICAgICAgIH0KKyAgICAgICAgLyogY3VycmVudCBjb2RlIHJlcG9ydHMgc3VjY2VzcyB3aGVuIGFsbCByZXF1aXJlZCBhcmdzCisgICAgICAgICAqIGZ1bGZpbGxlZCBhbmQgbm8ga2V5d29yZCBhcmdzIGxlZnQsIHdpdGggbm8gZnVydGhlcgorICAgICAgICAgKiB2YWxpZGF0aW9uLiBYWFggTWF5YmUgc2tpcCB0aGlzIGluIGRlYnVnIGJ1aWxkID8KKyAgICAgICAgICovCisgICAgICAgIGlmICghbmtleXdvcmRzKQorICAgICAgICAgICAgcmV0dXJuIGNsZWFucmV0dXJuKDEsIGZyZWVsaXN0KTsKIAotCWlmICghSVNfRU5EX09GX0ZPUk1BVCgqZm9ybWF0KSAmJiAqZm9ybWF0ICE9ICd8JykgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfUnVudGltZUVycm9yLAotCQkJIm1vcmUgYXJndW1lbnQgc3BlY2lmaWVycyB0aGFuIGtleXdvcmQgbGlzdCBlbnRyaWVzICIKLQkJCSIocmVtYWluaW5nIGZvcm1hdDonJXMnKSIsIGZvcm1hdCk7Ci0JCXJldHVybiBjbGVhbnJldHVybigwLCBmcmVlbGlzdCk7Ci0JfQorICAgICAgICAvKiBXZSBhcmUgaW50byBvcHRpb25hbCBhcmdzLCBza2lwIHRocnUgdG8gYW55IHJlbWFpbmluZworICAgICAgICAgKiBrZXl3b3JkIGFyZ3MgKi8KKyAgICAgICAgbXNnID0gc2tpcGl0ZW0oJmZvcm1hdCwgcF92YSwgZmxhZ3MpOworICAgICAgICBpZiAobXNnKSB7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfUnVudGltZUVycm9yLCAiJXM6ICclcyciLCBtc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0KTsKKyAgICAgICAgICAgIHJldHVybiBjbGVhbnJldHVybigwLCBmcmVlbGlzdCk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKiBtYWtlIHN1cmUgdGhlcmUgYXJlIG5vIGV4dHJhbmVvdXMga2V5d29yZCBhcmd1bWVudHMgKi8KLQlpZiAobmtleXdvcmRzID4gMCkgewotCQlQeU9iamVjdCAqa2V5LCAqdmFsdWU7Ci0JCVB5X3NzaXplX3QgcG9zID0gMDsKLQkJd2hpbGUgKFB5RGljdF9OZXh0KGtleXdvcmRzLCAmcG9zLCAma2V5LCAmdmFsdWUpKSB7Ci0JCQlpbnQgbWF0Y2ggPSAwOwotCQkJY2hhciAqa3M7Ci0JCQlpZiAoIVB5U3RyaW5nX0NoZWNrKGtleSkpIHsKLQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAKLQkJCQkJICAgICAgICAia2V5d29yZHMgbXVzdCBiZSBzdHJpbmdzIik7Ci0JCQkJcmV0dXJuIGNsZWFucmV0dXJuKDAsIGZyZWVsaXN0KTsKLQkJCX0KLQkJCWtzID0gUHlTdHJpbmdfQXNTdHJpbmcoa2V5KTsKLQkJCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJCWlmICghc3RyY21wKGtzLCBrd2xpc3RbaV0pKSB7Ci0JCQkJCW1hdGNoID0gMTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFtYXRjaCkgewotCQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkJCSAgICAgIiclcycgaXMgYW4gaW52YWxpZCBrZXl3b3JkICIKLQkJCQkJICAgICAiYXJndW1lbnQgZm9yIHRoaXMgZnVuY3Rpb24iLAotCQkJCQkgICAgIGtzKTsKLQkJCQlyZXR1cm4gY2xlYW5yZXR1cm4oMCwgZnJlZWxpc3QpOwotCQkJfQotCQl9Ci0JfQorICAgIGlmICghSVNfRU5EX09GX0ZPUk1BVCgqZm9ybWF0KSAmJiAqZm9ybWF0ICE9ICd8JykgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfUnVudGltZUVycm9yLAorICAgICAgICAgICAgIm1vcmUgYXJndW1lbnQgc3BlY2lmaWVycyB0aGFuIGtleXdvcmQgbGlzdCBlbnRyaWVzICIKKyAgICAgICAgICAgICIocmVtYWluaW5nIGZvcm1hdDonJXMnKSIsIGZvcm1hdCk7CisgICAgICAgIHJldHVybiBjbGVhbnJldHVybigwLCBmcmVlbGlzdCk7CisgICAgfQogCi0JcmV0dXJuIGNsZWFucmV0dXJuKDEsIGZyZWVsaXN0KTsKKyAgICAvKiBtYWtlIHN1cmUgdGhlcmUgYXJlIG5vIGV4dHJhbmVvdXMga2V5d29yZCBhcmd1bWVudHMgKi8KKyAgICBpZiAobmtleXdvcmRzID4gMCkgeworICAgICAgICBQeU9iamVjdCAqa2V5LCAqdmFsdWU7CisgICAgICAgIFB5X3NzaXplX3QgcG9zID0gMDsKKyAgICAgICAgd2hpbGUgKFB5RGljdF9OZXh0KGtleXdvcmRzLCAmcG9zLCAma2V5LCAmdmFsdWUpKSB7CisgICAgICAgICAgICBpbnQgbWF0Y2ggPSAwOworICAgICAgICAgICAgY2hhciAqa3M7CisgICAgICAgICAgICBpZiAoIVB5U3RyaW5nX0NoZWNrKGtleSkpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAia2V5d29yZHMgbXVzdCBiZSBzdHJpbmdzIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNsZWFucmV0dXJuKDAsIGZyZWVsaXN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGtzID0gUHlTdHJpbmdfQXNTdHJpbmcoa2V5KTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICAgICAgICAgIGlmICghc3RyY21wKGtzLCBrd2xpc3RbaV0pKSB7CisgICAgICAgICAgICAgICAgICAgIG1hdGNoID0gMTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFtYXRjaCkgeworICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICInJXMnIGlzIGFuIGludmFsaWQga2V5d29yZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhcmd1bWVudCBmb3IgdGhpcyBmdW5jdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gY2xlYW5yZXR1cm4oMCwgZnJlZWxpc3QpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGNsZWFucmV0dXJuKDEsIGZyZWVsaXN0KTsKIH0KIAogCiBzdGF0aWMgY2hhciAqCiBza2lwaXRlbShjb25zdCBjaGFyICoqcF9mb3JtYXQsIHZhX2xpc3QgKnBfdmEsIGludCBmbGFncykKIHsKLQljb25zdCBjaGFyICpmb3JtYXQgPSAqcF9mb3JtYXQ7Ci0JY2hhciBjID0gKmZvcm1hdCsrOwotCQotCXN3aXRjaCAoYykgeworICAgIGNvbnN0IGNoYXIgKmZvcm1hdCA9ICpwX2Zvcm1hdDsKKyAgICBjaGFyIGMgPSAqZm9ybWF0Kys7CiAKLQkvKiBzaW1wbGUgY29kZXMKLQkgKiBUaGUgaW5kaXZpZHVhbCB0eXBlcyAoc2Vjb25kIGFyZyBvZiB2YV9hcmcpIGFyZSBpcnJlbGV2YW50ICovCisgICAgc3dpdGNoIChjKSB7CiAKLQljYXNlICdiJzogLyogYnl0ZSAtLSB2ZXJ5IHNob3J0IGludCAqLwotCWNhc2UgJ0InOiAvKiBieXRlIGFzIGJpdGZpZWxkICovCi0JY2FzZSAnaCc6IC8qIHNob3J0IGludCAqLwotCWNhc2UgJ0gnOiAvKiBzaG9ydCBpbnQgYXMgYml0ZmllbGQgKi8KLQljYXNlICdpJzogLyogaW50ICovCi0JY2FzZSAnSSc6IC8qIGludCBzaXplZCBiaXRmaWVsZCAqLwotCWNhc2UgJ2wnOiAvKiBsb25nIGludCAqLwotCWNhc2UgJ2snOiAvKiBsb25nIGludCBzaXplZCBiaXRmaWVsZCAqLworICAgIC8qIHNpbXBsZSBjb2RlcworICAgICAqIFRoZSBpbmRpdmlkdWFsIHR5cGVzIChzZWNvbmQgYXJnIG9mIHZhX2FyZykgYXJlIGlycmVsZXZhbnQgKi8KKworICAgIGNhc2UgJ2InOiAvKiBieXRlIC0tIHZlcnkgc2hvcnQgaW50ICovCisgICAgY2FzZSAnQic6IC8qIGJ5dGUgYXMgYml0ZmllbGQgKi8KKyAgICBjYXNlICdoJzogLyogc2hvcnQgaW50ICovCisgICAgY2FzZSAnSCc6IC8qIHNob3J0IGludCBhcyBiaXRmaWVsZCAqLworICAgIGNhc2UgJ2knOiAvKiBpbnQgKi8KKyAgICBjYXNlICdJJzogLyogaW50IHNpemVkIGJpdGZpZWxkICovCisgICAgY2FzZSAnbCc6IC8qIGxvbmcgaW50ICovCisgICAgY2FzZSAnayc6IC8qIGxvbmcgaW50IHNpemVkIGJpdGZpZWxkICovCiAjaWZkZWYgSEFWRV9MT05HX0xPTkcKLQljYXNlICdMJzogLyogUFlfTE9OR19MT05HICovCi0JY2FzZSAnSyc6IC8qIFBZX0xPTkdfTE9ORyBzaXplZCBiaXRmaWVsZCAqLworICAgIGNhc2UgJ0wnOiAvKiBQWV9MT05HX0xPTkcgKi8KKyAgICBjYXNlICdLJzogLyogUFlfTE9OR19MT05HIHNpemVkIGJpdGZpZWxkICovCiAjZW5kaWYKLQljYXNlICdmJzogLyogZmxvYXQgKi8KLQljYXNlICdkJzogLyogZG91YmxlICovCisgICAgY2FzZSAnZic6IC8qIGZsb2F0ICovCisgICAgY2FzZSAnZCc6IC8qIGRvdWJsZSAqLwogI2lmbmRlZiBXSVRIT1VUX0NPTVBMRVgKLQljYXNlICdEJzogLyogY29tcGxleCBkb3VibGUgKi8KKyAgICBjYXNlICdEJzogLyogY29tcGxleCBkb3VibGUgKi8KICNlbmRpZgotCWNhc2UgJ2MnOiAvKiBjaGFyICovCi0JCXsKLQkJCSh2b2lkKSB2YV9hcmcoKnBfdmEsIHZvaWQgKik7Ci0JCQlicmVhazsKLQkJfQorICAgIGNhc2UgJ2MnOiAvKiBjaGFyICovCisgICAgICAgIHsKKyAgICAgICAgICAgICh2b2lkKSB2YV9hcmcoKnBfdmEsIHZvaWQgKik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogCi0JY2FzZSAnbic6IC8qIFB5X3NzaXplX3QgKi8KLQkJewotCQkJKHZvaWQpIHZhX2FyZygqcF92YSwgUHlfc3NpemVfdCAqKTsKLQkJCWJyZWFrOwotCQl9Ci0JCi0JLyogc3RyaW5nIGNvZGVzICovCi0JCQotCWNhc2UgJ2UnOiAvKiBzdHJpbmcgd2l0aCBlbmNvZGluZyAqLwotCQl7Ci0JCQkodm9pZCkgdmFfYXJnKCpwX3ZhLCBjb25zdCBjaGFyICopOwotCQkJaWYgKCEoKmZvcm1hdCA9PSAncycgfHwgKmZvcm1hdCA9PSAndCcpKQotCQkJCS8qIGFmdGVyICdlJywgb25seSAncycgYW5kICd0JyBpcyBhbGxvd2VkICovCi0JCQkJZ290byBlcnI7Ci0JCQlmb3JtYXQrKzsKLQkJCS8qIGV4cGxpY2l0IGZhbGx0aHJvdWdoIHRvIHN0cmluZyBjYXNlcyAqLwotCQl9Ci0JCi0JY2FzZSAncyc6IC8qIHN0cmluZyAqLwotCWNhc2UgJ3onOiAvKiBzdHJpbmcgb3IgTm9uZSAqLworICAgIGNhc2UgJ24nOiAvKiBQeV9zc2l6ZV90ICovCisgICAgICAgIHsKKyAgICAgICAgICAgICh2b2lkKSB2YV9hcmcoKnBfdmEsIFB5X3NzaXplX3QgKik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgLyogc3RyaW5nIGNvZGVzICovCisKKyAgICBjYXNlICdlJzogLyogc3RyaW5nIHdpdGggZW5jb2RpbmcgKi8KKyAgICAgICAgeworICAgICAgICAgICAgKHZvaWQpIHZhX2FyZygqcF92YSwgY29uc3QgY2hhciAqKTsKKyAgICAgICAgICAgIGlmICghKCpmb3JtYXQgPT0gJ3MnIHx8ICpmb3JtYXQgPT0gJ3QnKSkKKyAgICAgICAgICAgICAgICAvKiBhZnRlciAnZScsIG9ubHkgJ3MnIGFuZCAndCcgaXMgYWxsb3dlZCAqLworICAgICAgICAgICAgICAgIGdvdG8gZXJyOworICAgICAgICAgICAgZm9ybWF0Kys7CisgICAgICAgICAgICAvKiBleHBsaWNpdCBmYWxsdGhyb3VnaCB0byBzdHJpbmcgY2FzZXMgKi8KKyAgICAgICAgfQorCisgICAgY2FzZSAncyc6IC8qIHN0cmluZyAqLworICAgIGNhc2UgJ3onOiAvKiBzdHJpbmcgb3IgTm9uZSAqLwogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQljYXNlICd1JzogLyogdW5pY29kZSBzdHJpbmcgKi8KKyAgICBjYXNlICd1JzogLyogdW5pY29kZSBzdHJpbmcgKi8KICNlbmRpZgotCWNhc2UgJ3QnOiAvKiBidWZmZXIsIHJlYWQtb25seSAqLwotCWNhc2UgJ3cnOiAvKiBidWZmZXIsIHJlYWQtd3JpdGUgKi8KLQkJewotCQkJKHZvaWQpIHZhX2FyZygqcF92YSwgY2hhciAqKik7Ci0JCQlpZiAoKmZvcm1hdCA9PSAnIycpIHsKLQkJCQlpZiAoZmxhZ3MgJiBGTEFHX1NJWkVfVCkKLQkJCQkJKHZvaWQpIHZhX2FyZygqcF92YSwgUHlfc3NpemVfdCAqKTsKLQkJCQllbHNlCi0JCQkJCSh2b2lkKSB2YV9hcmcoKnBfdmEsIGludCAqKTsKLQkJCQlmb3JtYXQrKzsKLQkJCX0gZWxzZSBpZiAoKGMgPT0gJ3MnIHx8IGMgPT0gJ3onKSAmJiAqZm9ybWF0ID09ICcqJykgewotCQkJCWZvcm1hdCsrOwotCQkJfQotCQkJYnJlYWs7Ci0JCX0KKyAgICBjYXNlICd0JzogLyogYnVmZmVyLCByZWFkLW9ubHkgKi8KKyAgICBjYXNlICd3JzogLyogYnVmZmVyLCByZWFkLXdyaXRlICovCisgICAgICAgIHsKKyAgICAgICAgICAgICh2b2lkKSB2YV9hcmcoKnBfdmEsIGNoYXIgKiopOworICAgICAgICAgICAgaWYgKCpmb3JtYXQgPT0gJyMnKSB7CisgICAgICAgICAgICAgICAgaWYgKGZsYWdzICYgRkxBR19TSVpFX1QpCisgICAgICAgICAgICAgICAgICAgICh2b2lkKSB2YV9hcmcoKnBfdmEsIFB5X3NzaXplX3QgKik7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAodm9pZCkgdmFfYXJnKCpwX3ZhLCBpbnQgKik7CisgICAgICAgICAgICAgICAgZm9ybWF0Kys7CisgICAgICAgICAgICB9IGVsc2UgaWYgKChjID09ICdzJyB8fCBjID09ICd6JykgJiYgKmZvcm1hdCA9PSAnKicpIHsKKyAgICAgICAgICAgICAgICBmb3JtYXQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CiAKLQkvKiBvYmplY3QgY29kZXMgKi8KKyAgICAvKiBvYmplY3QgY29kZXMgKi8KIAotCWNhc2UgJ1MnOiAvKiBzdHJpbmcgb2JqZWN0ICovCisgICAgY2FzZSAnUyc6IC8qIHN0cmluZyBvYmplY3QgKi8KICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JY2FzZSAnVSc6IC8qIHVuaWNvZGUgc3RyaW5nIG9iamVjdCAqLworICAgIGNhc2UgJ1UnOiAvKiB1bmljb2RlIHN0cmluZyBvYmplY3QgKi8KICNlbmRpZgotCQl7Ci0JCQkodm9pZCkgdmFfYXJnKCpwX3ZhLCBQeU9iamVjdCAqKik7Ci0JCQlicmVhazsKLQkJfQotCQotCWNhc2UgJ08nOiAvKiBvYmplY3QgKi8KLQkJewotCQkJaWYgKCpmb3JtYXQgPT0gJyEnKSB7Ci0JCQkJZm9ybWF0Kys7Ci0JCQkJKHZvaWQpIHZhX2FyZygqcF92YSwgUHlUeXBlT2JqZWN0Kik7Ci0JCQkJKHZvaWQpIHZhX2FyZygqcF92YSwgUHlPYmplY3QgKiopOwotCQkJfQorICAgICAgICB7CisgICAgICAgICAgICAodm9pZCkgdmFfYXJnKCpwX3ZhLCBQeU9iamVjdCAqKik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgY2FzZSAnTyc6IC8qIG9iamVjdCAqLworICAgICAgICB7CisgICAgICAgICAgICBpZiAoKmZvcm1hdCA9PSAnIScpIHsKKyAgICAgICAgICAgICAgICBmb3JtYXQrKzsKKyAgICAgICAgICAgICAgICAodm9pZCkgdmFfYXJnKCpwX3ZhLCBQeVR5cGVPYmplY3QqKTsKKyAgICAgICAgICAgICAgICAodm9pZCkgdmFfYXJnKCpwX3ZhLCBQeU9iamVjdCAqKik7CisgICAgICAgICAgICB9CiAjaWYgMAogLyogSSBkb24ndCBrbm93IHdoYXQgdGhpcyBpcyBmb3IgKi8KLQkJCWVsc2UgaWYgKCpmb3JtYXQgPT0gJz8nKSB7Ci0JCQkJaW5xdWlyeSBwcmVkID0gdmFfYXJnKCpwX3ZhLCBpbnF1aXJ5KTsKLQkJCQlmb3JtYXQrKzsKLQkJCQlpZiAoKCpwcmVkKShhcmcpKSB7Ci0JCQkJCSh2b2lkKSB2YV9hcmcoKnBfdmEsIFB5T2JqZWN0ICoqKTsKLQkJCQl9Ci0JCQl9CisgICAgICAgICAgICBlbHNlIGlmICgqZm9ybWF0ID09ICc/JykgeworICAgICAgICAgICAgICAgIGlucXVpcnkgcHJlZCA9IHZhX2FyZygqcF92YSwgaW5xdWlyeSk7CisgICAgICAgICAgICAgICAgZm9ybWF0Kys7CisgICAgICAgICAgICAgICAgaWYgKCgqcHJlZCkoYXJnKSkgeworICAgICAgICAgICAgICAgICAgICAodm9pZCkgdmFfYXJnKCpwX3ZhLCBQeU9iamVjdCAqKik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogI2VuZGlmCi0JCQllbHNlIGlmICgqZm9ybWF0ID09ICcmJykgewotCQkJCXR5cGVkZWYgaW50ICgqY29udmVydGVyKShQeU9iamVjdCAqLCB2b2lkICopOwotCQkJCSh2b2lkKSB2YV9hcmcoKnBfdmEsIGNvbnZlcnRlcik7Ci0JCQkJKHZvaWQpIHZhX2FyZygqcF92YSwgdm9pZCAqKTsKLQkJCQlmb3JtYXQrKzsKLQkJCX0KLQkJCWVsc2UgewotCQkJCSh2b2lkKSB2YV9hcmcoKnBfdmEsIFB5T2JqZWN0ICoqKTsKLQkJCX0KLQkJCWJyZWFrOwotCQl9CisgICAgICAgICAgICBlbHNlIGlmICgqZm9ybWF0ID09ICcmJykgeworICAgICAgICAgICAgICAgIHR5cGVkZWYgaW50ICgqY29udmVydGVyKShQeU9iamVjdCAqLCB2b2lkICopOworICAgICAgICAgICAgICAgICh2b2lkKSB2YV9hcmcoKnBfdmEsIGNvbnZlcnRlcik7CisgICAgICAgICAgICAgICAgKHZvaWQpIHZhX2FyZygqcF92YSwgdm9pZCAqKTsKKyAgICAgICAgICAgICAgICBmb3JtYXQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICh2b2lkKSB2YV9hcmcoKnBfdmEsIFB5T2JqZWN0ICoqKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CiAKLQljYXNlICcoJzoJLyogYnlwYXNzIHR1cGxlLCBub3QgaGFuZGxlZCBhdCBhbGwgcHJldmlvdXNseSAqLwotCQl7Ci0JCQljaGFyICptc2c7Ci0JCQlmb3IgKDs7KSB7Ci0JCQkJaWYgKCpmb3JtYXQ9PScpJykKLQkJCQkJYnJlYWs7Ci0JCQkJaWYgKElTX0VORF9PRl9GT1JNQVQoKmZvcm1hdCkpCi0JCQkJCXJldHVybiAiVW5tYXRjaGVkIGxlZnQgcGFyZW4gaW4gZm9ybWF0ICIKLQkJCQkJICAgICAgICJzdHJpbmciOwotCQkJCW1zZyA9IHNraXBpdGVtKCZmb3JtYXQsIHBfdmEsIGZsYWdzKTsKLQkJCQlpZiAobXNnKQotCQkJCQlyZXR1cm4gbXNnOwotCQkJfQotCQkJZm9ybWF0Kys7Ci0JCQlicmVhazsKLQkJfQorICAgIGNhc2UgJygnOiAgICAgICAgICAgLyogYnlwYXNzIHR1cGxlLCBub3QgaGFuZGxlZCBhdCBhbGwgcHJldmlvdXNseSAqLworICAgICAgICB7CisgICAgICAgICAgICBjaGFyICptc2c7CisgICAgICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICAgICAgaWYgKCpmb3JtYXQ9PScpJykKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgaWYgKElTX0VORF9PRl9GT1JNQVQoKmZvcm1hdCkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAiVW5tYXRjaGVkIGxlZnQgcGFyZW4gaW4gZm9ybWF0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdHJpbmciOworICAgICAgICAgICAgICAgIG1zZyA9IHNraXBpdGVtKCZmb3JtYXQsIHBfdmEsIGZsYWdzKTsKKyAgICAgICAgICAgICAgICBpZiAobXNnKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbXNnOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9ybWF0Kys7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogCi0JY2FzZSAnKSc6Ci0JCXJldHVybiAiVW5tYXRjaGVkIHJpZ2h0IHBhcmVuIGluIGZvcm1hdCBzdHJpbmciOworICAgIGNhc2UgJyknOgorICAgICAgICByZXR1cm4gIlVubWF0Y2hlZCByaWdodCBwYXJlbiBpbiBmb3JtYXQgc3RyaW5nIjsKIAotCWRlZmF1bHQ6CisgICAgZGVmYXVsdDoKIGVycjoKLQkJcmV0dXJuICJpbXBvc3NpYmxlPGJhZCBmb3JtYXQgY2hhcj4iOwotCQotCX0KKyAgICAgICAgcmV0dXJuICJpbXBvc3NpYmxlPGJhZCBmb3JtYXQgY2hhcj4iOwogCi0JKnBfZm9ybWF0ID0gZm9ybWF0OwotCXJldHVybiBOVUxMOworICAgIH0KKworICAgICpwX2Zvcm1hdCA9IGZvcm1hdDsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogCiBpbnQKIFB5QXJnX1VucGFja1R1cGxlKFB5T2JqZWN0ICphcmdzLCBjb25zdCBjaGFyICpuYW1lLCBQeV9zc2l6ZV90IG1pbiwgUHlfc3NpemVfdCBtYXgsIC4uLikKIHsKLQlQeV9zc2l6ZV90IGksIGw7Ci0JUHlPYmplY3QgKipvOwotCXZhX2xpc3QgdmFyZ3M7CisgICAgUHlfc3NpemVfdCBpLCBsOworICAgIFB5T2JqZWN0ICoqbzsKKyAgICB2YV9saXN0IHZhcmdzOwogCiAjaWZkZWYgSEFWRV9TVERBUkdfUFJPVE9UWVBFUwotCXZhX3N0YXJ0KHZhcmdzLCBtYXgpOworICAgIHZhX3N0YXJ0KHZhcmdzLCBtYXgpOwogI2Vsc2UKLQl2YV9zdGFydCh2YXJncyk7CisgICAgdmFfc3RhcnQodmFyZ3MpOwogI2VuZGlmCiAKLQlhc3NlcnQobWluID49IDApOwotCWFzc2VydChtaW4gPD0gbWF4KTsKLQlpZiAoIVB5VHVwbGVfQ2hlY2soYXJncykpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAotCQkgICAgIlB5QXJnX1VucGFja1R1cGxlKCkgYXJndW1lbnQgbGlzdCBpcyBub3QgYSB0dXBsZSIpOwotCQlyZXR1cm4gMDsKLQl9CQotCWwgPSBQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpOwotCWlmIChsIDwgbWluKSB7Ci0JCWlmIChuYW1lICE9IE5VTEwpCi0JCQlQeUVycl9Gb3JtYXQoCi0JCQkgICAgUHlFeGNfVHlwZUVycm9yLAotCQkJICAgICIlcyBleHBlY3RlZCAlcyV6ZCBhcmd1bWVudHMsIGdvdCAlemQiLCAKLQkJCSAgICBuYW1lLCAobWluID09IG1heCA/ICIiIDogImF0IGxlYXN0ICIpLCBtaW4sIGwpOwotCQllbHNlCi0JCQlQeUVycl9Gb3JtYXQoCi0JCQkgICAgUHlFeGNfVHlwZUVycm9yLAotCQkJICAgICJ1bnBhY2tlZCB0dXBsZSBzaG91bGQgaGF2ZSAlcyV6ZCBlbGVtZW50cywiCi0JCQkgICAgIiBidXQgaGFzICV6ZCIsIAotCQkJICAgIChtaW4gPT0gbWF4ID8gIiIgOiAiYXQgbGVhc3QgIiksIG1pbiwgbCk7Ci0JCXZhX2VuZCh2YXJncyk7Ci0JCXJldHVybiAwOwotCX0KLQlpZiAobCA+IG1heCkgewotCQlpZiAobmFtZSAhPSBOVUxMKQotCQkJUHlFcnJfRm9ybWF0KAotCQkJICAgIFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAiJXMgZXhwZWN0ZWQgJXMlemQgYXJndW1lbnRzLCBnb3QgJXpkIiwgCi0JCQkgICAgbmFtZSwgKG1pbiA9PSBtYXggPyAiIiA6ICJhdCBtb3N0ICIpLCBtYXgsIGwpOwotCQllbHNlCi0JCQlQeUVycl9Gb3JtYXQoCi0JCQkgICAgUHlFeGNfVHlwZUVycm9yLAotCQkJICAgICJ1bnBhY2tlZCB0dXBsZSBzaG91bGQgaGF2ZSAlcyV6ZCBlbGVtZW50cywiCi0JCQkgICAgIiBidXQgaGFzICV6ZCIsIAotCQkJICAgIChtaW4gPT0gbWF4ID8gIiIgOiAiYXQgbW9zdCAiKSwgbWF4LCBsKTsKLQkJdmFfZW5kKHZhcmdzKTsKLQkJcmV0dXJuIDA7Ci0JfQotCWZvciAoaSA9IDA7IGkgPCBsOyBpKyspIHsKLQkJbyA9IHZhX2FyZyh2YXJncywgUHlPYmplY3QgKiopOwotCQkqbyA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgaSk7Ci0JfQotCXZhX2VuZCh2YXJncyk7Ci0JcmV0dXJuIDE7CisgICAgYXNzZXJ0KG1pbiA+PSAwKTsKKyAgICBhc3NlcnQobWluIDw9IG1heCk7CisgICAgaWYgKCFQeVR1cGxlX0NoZWNrKGFyZ3MpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKKyAgICAgICAgICAgICJQeUFyZ19VbnBhY2tUdXBsZSgpIGFyZ3VtZW50IGxpc3QgaXMgbm90IGEgdHVwbGUiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGwgPSBQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpOworICAgIGlmIChsIDwgbWluKSB7CisgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoCisgICAgICAgICAgICAgICAgUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICIlcyBleHBlY3RlZCAlcyV6ZCBhcmd1bWVudHMsIGdvdCAlemQiLAorICAgICAgICAgICAgICAgIG5hbWUsIChtaW4gPT0gbWF4ID8gIiIgOiAiYXQgbGVhc3QgIiksIG1pbiwgbCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdCgKKyAgICAgICAgICAgICAgICBQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgInVucGFja2VkIHR1cGxlIHNob3VsZCBoYXZlICVzJXpkIGVsZW1lbnRzLCIKKyAgICAgICAgICAgICAgICAiIGJ1dCBoYXMgJXpkIiwKKyAgICAgICAgICAgICAgICAobWluID09IG1heCA/ICIiIDogImF0IGxlYXN0ICIpLCBtaW4sIGwpOworICAgICAgICB2YV9lbmQodmFyZ3MpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKGwgPiBtYXgpIHsKKyAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdCgKKyAgICAgICAgICAgICAgICBQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgIiVzIGV4cGVjdGVkICVzJXpkIGFyZ3VtZW50cywgZ290ICV6ZCIsCisgICAgICAgICAgICAgICAgbmFtZSwgKG1pbiA9PSBtYXggPyAiIiA6ICJhdCBtb3N0ICIpLCBtYXgsIGwpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoCisgICAgICAgICAgICAgICAgUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICJ1bnBhY2tlZCB0dXBsZSBzaG91bGQgaGF2ZSAlcyV6ZCBlbGVtZW50cywiCisgICAgICAgICAgICAgICAgIiBidXQgaGFzICV6ZCIsCisgICAgICAgICAgICAgICAgKG1pbiA9PSBtYXggPyAiIiA6ICJhdCBtb3N0ICIpLCBtYXgsIGwpOworICAgICAgICB2YV9lbmQodmFyZ3MpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IGw7IGkrKykgeworICAgICAgICBvID0gdmFfYXJnKHZhcmdzLCBQeU9iamVjdCAqKik7CisgICAgICAgICpvID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCBpKTsKKyAgICB9CisgICAgdmFfZW5kKHZhcmdzKTsKKyAgICByZXR1cm4gMTsKIH0KIAogCiAvKiBGb3IgdHlwZSBjb25zdHJ1Y3RvcnMgdGhhdCBkb24ndCB0YWtlIGtleXdvcmQgYXJncwogICoKLSAqIFNldHMgYSBUeXBlRXJyb3IgYW5kIHJldHVybnMgMCBpZiB0aGUga3dkcyBkaWN0IGlzIAorICogU2V0cyBhIFR5cGVFcnJvciBhbmQgcmV0dXJucyAwIGlmIHRoZSBrd2RzIGRpY3QgaXMKICAqIG5vdCBlbXB0eSwgcmV0dXJucyAxIG90aGVyd2lzZQogICovCiBpbnQKIF9QeUFyZ19Ob0tleXdvcmRzKGNvbnN0IGNoYXIgKmZ1bmNuYW1lLCBQeU9iamVjdCAqa3cpCiB7Ci0JaWYgKGt3ID09IE5VTEwpCi0JCXJldHVybiAxOwotCWlmICghUHlEaWN0X0NoZWNrRXhhY3Qoa3cpKSB7Ci0JCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKFB5RGljdF9TaXplKGt3KSA9PSAwKQotCQlyZXR1cm4gMTsKLQkKLQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAiJXMgZG9lcyBub3QgdGFrZSBrZXl3b3JkIGFyZ3VtZW50cyIsIAotCQkJZnVuY25hbWUpOwotCXJldHVybiAwOworICAgIGlmIChrdyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gMTsKKyAgICBpZiAoIVB5RGljdF9DaGVja0V4YWN0KGt3KSkgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChQeURpY3RfU2l6ZShrdykgPT0gMCkKKyAgICAgICAgcmV0dXJuIDE7CisKKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAiJXMgZG9lcyBub3QgdGFrZSBrZXl3b3JkIGFyZ3VtZW50cyIsCisgICAgICAgICAgICAgICAgICAgIGZ1bmNuYW1lKTsKKyAgICByZXR1cm4gMDsKIH0KICNpZmRlZiBfX2NwbHVzcGx1cwogfTsKZGlmZiAtLWdpdCBhL1B5dGhvbi9nZXRjd2QuYyBiL1B5dGhvbi9nZXRjd2QuYwppbmRleCA5NjdkNDg0Li40YmVkYmQxIDEwMDY0NAotLS0gYS9QeXRob24vZ2V0Y3dkLmMKKysrIGIvUHl0aG9uL2dldGN3ZC5jCkBAIC0yNiwyNCArMjYsMjQgQEAKIGNoYXIgKgogZ2V0Y3dkKGNoYXIgKmJ1ZiwgaW50IHNpemUpCiB7Ci0JY2hhciBsb2NhbGJ1ZltNQVhQQVRITEVOKzFdOwotCWNoYXIgKnJldDsKLQkKLQlpZiAoc2l6ZSA8PSAwKSB7Ci0JCWVycm5vID0gRUlOVkFMOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0ID0gZ2V0d2QobG9jYWxidWYpOwotCWlmIChyZXQgIT0gTlVMTCAmJiBzdHJsZW4obG9jYWxidWYpID49IChzaXplX3Qpc2l6ZSkgewotCQllcnJubyA9IEVSQU5HRTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChyZXQgPT0gTlVMTCkgewotCQllcnJubyA9IEVBQ0NFUzsgLyogTW9zdCBsaWtlbHkgZXJyb3IgKi8KLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXN0cm5jcHkoYnVmLCBsb2NhbGJ1Ziwgc2l6ZSk7Ci0JcmV0dXJuIGJ1ZjsKKyAgICBjaGFyIGxvY2FsYnVmW01BWFBBVEhMRU4rMV07CisgICAgY2hhciAqcmV0OworCisgICAgaWYgKHNpemUgPD0gMCkgeworICAgICAgICBlcnJubyA9IEVJTlZBTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldCA9IGdldHdkKGxvY2FsYnVmKTsKKyAgICBpZiAocmV0ICE9IE5VTEwgJiYgc3RybGVuKGxvY2FsYnVmKSA+PSAoc2l6ZV90KXNpemUpIHsKKyAgICAgICAgZXJybm8gPSBFUkFOR0U7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAocmV0ID09IE5VTEwpIHsKKyAgICAgICAgZXJybm8gPSBFQUNDRVM7IC8qIE1vc3QgbGlrZWx5IGVycm9yICovCisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBzdHJuY3B5KGJ1ZiwgbG9jYWxidWYsIHNpemUpOworICAgIHJldHVybiBidWY7CiB9CiAKICNlbHNlIC8qICFIQVZFX0dFVFdEICovCkBAIC01NywyNyArNTcsMjcgQEAKIGNoYXIgKgogZ2V0Y3dkKGNoYXIgKmJ1ZiwgaW50IHNpemUpCiB7Ci0JRklMRSAqZnA7Ci0JY2hhciAqcDsKLQlpbnQgc3RzOwotCWlmIChzaXplIDw9IDApIHsKLQkJZXJybm8gPSBFSU5WQUw7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoKGZwID0gcG9wZW4oUFdEX0NNRCwgInIiKSkgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKGZnZXRzKGJ1Ziwgc2l6ZSwgZnApID09IE5VTEwgfHwgKHN0cyA9IHBjbG9zZShmcCkpICE9IDApIHsKLQkJZXJybm8gPSBFQUNDRVM7IC8qIE1vc3QgbGlrZWx5IGVycm9yICovCi0JCXJldHVybiBOVUxMOwotCX0KLQlmb3IgKHAgPSBidWY7ICpwICE9ICdcbic7IHArKykgewotCQlpZiAoKnAgPT0gJ1wwJykgewotCQkJZXJybm8gPSBFUkFOR0U7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KLQkqcCA9ICdcMCc7Ci0JcmV0dXJuIGJ1ZjsKKyAgICBGSUxFICpmcDsKKyAgICBjaGFyICpwOworICAgIGludCBzdHM7CisgICAgaWYgKHNpemUgPD0gMCkgeworICAgICAgICBlcnJubyA9IEVJTlZBTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmICgoZnAgPSBwb3BlbihQV0RfQ01ELCAiciIpKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoZmdldHMoYnVmLCBzaXplLCBmcCkgPT0gTlVMTCB8fCAoc3RzID0gcGNsb3NlKGZwKSkgIT0gMCkgeworICAgICAgICBlcnJubyA9IEVBQ0NFUzsgLyogTW9zdCBsaWtlbHkgZXJyb3IgKi8KKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGZvciAocCA9IGJ1ZjsgKnAgIT0gJ1xuJzsgcCsrKSB7CisgICAgICAgIGlmICgqcCA9PSAnXDAnKSB7CisgICAgICAgICAgICBlcnJubyA9IEVSQU5HRTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorICAgICpwID0gJ1wwJzsKKyAgICByZXR1cm4gYnVmOwogfQogCiAjZW5kaWYgLyogIUhBVkVfR0VUV0QgKi8KZGlmZiAtLWdpdCBhL1B5dGhvbi9nZXRvcHQuYyBiL1B5dGhvbi9nZXRvcHQuYwppbmRleCAyNDc2MDBiLi4wOTNjM2RhIDEwMDY0NAotLS0gYS9QeXRob24vZ2V0b3B0LmMKKysrIGIvUHl0aG9uL2dldG9wdC5jCkBAIC03LDggKzcsOCBAQAogICoKICAqICAgICAgICAgICAgICAgICAgICBBbGwgUmlnaHRzIFJlc2VydmVkCiAgKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzIAotICogZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCAKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIGl0cworICogZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLAogICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhbmQKICAqIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBub3RpY2UgYXBwZWFyIHVubW9kaWZpZWQgaW4gYWxsIGNvcGllcy4KICAqCkBAIC00MCw4NCArNDAsODQgQEAKIAogaW50IF9QeU9TX0dldE9wdChpbnQgYXJnYywgY2hhciAqKmFyZ3YsIGNoYXIgKm9wdHN0cmluZykKIHsKLQlzdGF0aWMgY2hhciAqb3B0X3B0ciA9ICIiOwotCWNoYXIgKnB0cjsKLQlpbnQgb3B0aW9uOworICAgIHN0YXRpYyBjaGFyICpvcHRfcHRyID0gIiI7CisgICAgY2hhciAqcHRyOworICAgIGludCBvcHRpb247CiAKLQlpZiAoKm9wdF9wdHIgPT0gJ1wwJykgeworICAgIGlmICgqb3B0X3B0ciA9PSAnXDAnKSB7CiAKLQkJaWYgKF9QeU9TX29wdGluZCA+PSBhcmdjKQotCQkJcmV0dXJuIC0xOworICAgICAgICBpZiAoX1B5T1Nfb3B0aW5kID49IGFyZ2MpCisgICAgICAgICAgICByZXR1cm4gLTE7CiAjaWZkZWYgTVNfV0lORE9XUwotCQllbHNlIGlmIChzdHJjbXAoYXJndltfUHlPU19vcHRpbmRdLCAiLz8iKSA9PSAwKSB7Ci0JCQkrK19QeU9TX29wdGluZDsKLQkJCXJldHVybiAnaCc7Ci0JCX0KKyAgICAgICAgZWxzZSBpZiAoc3RyY21wKGFyZ3ZbX1B5T1Nfb3B0aW5kXSwgIi8/IikgPT0gMCkgeworICAgICAgICAgICAgKytfUHlPU19vcHRpbmQ7CisgICAgICAgICAgICByZXR1cm4gJ2gnOworICAgICAgICB9CiAjZW5kaWYKIAotCQllbHNlIGlmIChhcmd2W19QeU9TX29wdGluZF1bMF0gIT0gJy0nIHx8Ci0JCSAgICAgICAgIGFyZ3ZbX1B5T1Nfb3B0aW5kXVsxXSA9PSAnXDAnIC8qIGxvbmUgZGFzaCAqLyApCi0JCQlyZXR1cm4gLTE7CisgICAgICAgIGVsc2UgaWYgKGFyZ3ZbX1B5T1Nfb3B0aW5kXVswXSAhPSAnLScgfHwKKyAgICAgICAgICAgICAgICAgYXJndltfUHlPU19vcHRpbmRdWzFdID09ICdcMCcgLyogbG9uZSBkYXNoICovICkKKyAgICAgICAgICAgIHJldHVybiAtMTsKIAotCQllbHNlIGlmIChzdHJjbXAoYXJndltfUHlPU19vcHRpbmRdLCAiLS0iKSA9PSAwKSB7Ci0JCQkrK19QeU9TX29wdGluZDsKLQkJCXJldHVybiAtMTsKLQkJfQorICAgICAgICBlbHNlIGlmIChzdHJjbXAoYXJndltfUHlPU19vcHRpbmRdLCAiLS0iKSA9PSAwKSB7CisgICAgICAgICAgICArK19QeU9TX29wdGluZDsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQogCi0JCWVsc2UgaWYgKHN0cmNtcChhcmd2W19QeU9TX29wdGluZF0sICItLWhlbHAiKSA9PSAwKSB7Ci0JCQkrK19QeU9TX29wdGluZDsKLQkJCXJldHVybiAnaCc7Ci0JCX0KKyAgICAgICAgZWxzZSBpZiAoc3RyY21wKGFyZ3ZbX1B5T1Nfb3B0aW5kXSwgIi0taGVscCIpID09IDApIHsKKyAgICAgICAgICAgICsrX1B5T1Nfb3B0aW5kOworICAgICAgICAgICAgcmV0dXJuICdoJzsKKyAgICAgICAgfQogCi0JCWVsc2UgaWYgKHN0cmNtcChhcmd2W19QeU9TX29wdGluZF0sICItLXZlcnNpb24iKSA9PSAwKSB7Ci0JCQkrK19QeU9TX29wdGluZDsKLQkJCXJldHVybiAnVic7Ci0JCX0KKyAgICAgICAgZWxzZSBpZiAoc3RyY21wKGFyZ3ZbX1B5T1Nfb3B0aW5kXSwgIi0tdmVyc2lvbiIpID09IDApIHsKKyAgICAgICAgICAgICsrX1B5T1Nfb3B0aW5kOworICAgICAgICAgICAgcmV0dXJuICdWJzsKKyAgICAgICAgfQogCiAKLQkJb3B0X3B0ciA9ICZhcmd2W19QeU9TX29wdGluZCsrXVsxXTsgCi0JfQorICAgICAgICBvcHRfcHRyID0gJmFyZ3ZbX1B5T1Nfb3B0aW5kKytdWzFdOworICAgIH0KIAotCWlmICggKG9wdGlvbiA9ICpvcHRfcHRyKyspID09ICdcMCcpCi0JCXJldHVybiAtMTsKKyAgICBpZiAoIChvcHRpb24gPSAqb3B0X3B0cisrKSA9PSAnXDAnKQorICAgICAgICByZXR1cm4gLTE7CiAKLQlpZiAob3B0aW9uID09ICdKJykgewotCQlmcHJpbnRmKHN0ZGVyciwgIi1KIGlzIHJlc2VydmVkIGZvciBKeXRob25cbiIpOwotCQlyZXR1cm4gJ18nOwotCX0KKyAgICBpZiAob3B0aW9uID09ICdKJykgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIi1KIGlzIHJlc2VydmVkIGZvciBKeXRob25cbiIpOworICAgICAgICByZXR1cm4gJ18nOworICAgIH0KIAotCWlmIChvcHRpb24gPT0gJ1gnKSB7Ci0JCWZwcmludGYoc3RkZXJyLAotCQkgICItWCBpcyByZXNlcnZlZCBmb3IgaW1wbGVtZW50YXRpb24tc3BlY2lmaWMgYXJndW1lbnRzXG4iKTsKLQkJcmV0dXJuICdfJzsKLQl9CisgICAgaWYgKG9wdGlvbiA9PSAnWCcpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgIi1YIGlzIHJlc2VydmVkIGZvciBpbXBsZW1lbnRhdGlvbi1zcGVjaWZpYyBhcmd1bWVudHNcbiIpOworICAgICAgICByZXR1cm4gJ18nOworICAgIH0KIAotCWlmICgocHRyID0gc3RyY2hyKG9wdHN0cmluZywgb3B0aW9uKSkgPT0gTlVMTCkgewotCQlpZiAoX1B5T1Nfb3B0ZXJyKQotCQkJZnByaW50ZihzdGRlcnIsICJVbmtub3duIG9wdGlvbjogLSVjXG4iLCBvcHRpb24pOworICAgIGlmICgocHRyID0gc3RyY2hyKG9wdHN0cmluZywgb3B0aW9uKSkgPT0gTlVMTCkgeworICAgICAgICBpZiAoX1B5T1Nfb3B0ZXJyKQorICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJVbmtub3duIG9wdGlvbjogLSVjXG4iLCBvcHRpb24pOwogCi0JCXJldHVybiAnXyc7Ci0JfQorICAgICAgICByZXR1cm4gJ18nOworICAgIH0KIAotCWlmICgqKHB0ciArIDEpID09ICc6JykgewotCQlpZiAoKm9wdF9wdHIgIT0gJ1wwJykgewotCQkJX1B5T1Nfb3B0YXJnICA9IG9wdF9wdHI7Ci0JCQlvcHRfcHRyID0gIiI7Ci0JCX0KKyAgICBpZiAoKihwdHIgKyAxKSA9PSAnOicpIHsKKyAgICAgICAgaWYgKCpvcHRfcHRyICE9ICdcMCcpIHsKKyAgICAgICAgICAgIF9QeU9TX29wdGFyZyAgPSBvcHRfcHRyOworICAgICAgICAgICAgb3B0X3B0ciA9ICIiOworICAgICAgICB9CiAKLQkJZWxzZSB7Ci0JCQlpZiAoX1B5T1Nfb3B0aW5kID49IGFyZ2MpIHsKLQkJCQlpZiAoX1B5T1Nfb3B0ZXJyKQotCQkJCQlmcHJpbnRmKHN0ZGVyciwKLQkJCSAgICAiQXJndW1lbnQgZXhwZWN0ZWQgZm9yIHRoZSAtJWMgb3B0aW9uXG4iLCBvcHRpb24pOwotCQkJCXJldHVybiAnXyc7Ci0JCQl9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKF9QeU9TX29wdGluZCA+PSBhcmdjKSB7CisgICAgICAgICAgICAgICAgaWYgKF9QeU9TX29wdGVycikKKyAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAgICAgIkFyZ3VtZW50IGV4cGVjdGVkIGZvciB0aGUgLSVjIG9wdGlvblxuIiwgb3B0aW9uKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gJ18nOworICAgICAgICAgICAgfQogCi0JCQlfUHlPU19vcHRhcmcgPSBhcmd2W19QeU9TX29wdGluZCsrXTsKLQkJfQotCX0KKyAgICAgICAgICAgIF9QeU9TX29wdGFyZyA9IGFyZ3ZbX1B5T1Nfb3B0aW5kKytdOworICAgICAgICB9CisgICAgfQogCi0JcmV0dXJuIG9wdGlvbjsKKyAgICByZXR1cm4gb3B0aW9uOwogfQogCiAjaWZkZWYgX19jcGx1c3BsdXMKZGlmZiAtLWdpdCBhL1B5dGhvbi9pbXBvcnQuYyBiL1B5dGhvbi9pbXBvcnQuYwppbmRleCBlYjczMWQwLi5kYTY2MGNmIDEwMDY0NAotLS0gYS9QeXRob24vaW1wb3J0LmMKKysrIGIvUHl0aG9uL2ltcG9ydC5jCkBAIC0xOSw3ICsxOSw3IEBACiAjaW5jbHVkZSA8ZmNudGwuaD4KICNlbmRpZgogI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsgCitleHRlcm4gIkMiIHsKICNlbmRpZgogCiAjaWZkZWYgTVNfV0lORE9XUwpAQCAtMjgsNyArMjgsNyBAQAogI2VuZGlmCiAKIGV4dGVybiB0aW1lX3QgUHlPU19HZXRMYXN0TW9kaWZpY2F0aW9uVGltZShjaGFyICosIEZJTEUgKik7Ci0JCQkJCQkvKiBJbiBnZXRtdGltZS5jICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbiBnZXRtdGltZS5jICovCiAKIC8qIE1hZ2ljIHdvcmQgdG8gcmVqZWN0IC5weWMgZmlsZXMgZ2VuZXJhdGVkIGJ5IG90aGVyIFB5dGhvbiB2ZXJzaW9ucy4KICAgIEl0IHNob3VsZCBjaGFuZ2UgZm9yIGVhY2ggaW5jb21wYXRpYmxlIGNoYW5nZSB0byB0aGUgYnl0ZWNvZGUuCkBAIC02OSw3ICs2OSw3IEBACiAgICAgICAgUHl0aG9uIDIuNWIzOiA2MjEwMSAoZml4IHdyb25nIGNvZGU6IGZvciB4LCBpbiAuLi4pCiAgICAgICAgUHl0aG9uIDIuNWIzOiA2MjExMSAoZml4IHdyb25nIGNvZGU6IHggKz0geWllbGQpCiAgICAgICAgUHl0aG9uIDIuNWMxOiA2MjEyMSAoZml4IHdyb25nIGxub3RhYiB3aXRoIGZvciBsb29wcyBhbmQKLSAgICAgICAJCQkgICAgc3RvcmluZyBjb25zdGFudHMgdGhhdCBzaG91bGQgaGF2ZSBiZWVuIHJlbW92ZWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmluZyBjb25zdGFudHMgdGhhdCBzaG91bGQgaGF2ZSBiZWVuIHJlbW92ZWQpCiAgICAgICAgUHl0aG9uIDIuNWMyOiA2MjEzMSAoZml4IHdyb25nIGNvZGU6IGZvciB4LCBpbiAuLi4gaW4gbGlzdGNvbXAvZ2VuZXhwKQogICAgICAgIFB5dGhvbiAyLjZhMDogNjIxNTEgKHBlZXBob2xlIG9wdGltaXphdGlvbnMgYW5kIFNUT1JFX01BUCBvcGNvZGUpCiAgICAgICAgUHl0aG9uIDIuNmExOiA2MjE2MSAoV0lUSF9DTEVBTlVQIG9wdGltaXphdGlvbikKQEAgLTk1LDE4ICs5NSwxOCBAQAogCiAjaWZkZWYgUklTQ09TCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVkZXNjciBfUHlJbXBvcnRfU3RhbmRhcmRGaWxldGFiW10gPSB7Ci0JeyIvcHkiLCAiVSIsIFBZX1NPVVJDRX0sCi0JeyIvcHljIiwgInJiIiwgUFlfQ09NUElMRUR9LAotCXswLCAwfQorICAgIHsiL3B5IiwgIlUiLCBQWV9TT1VSQ0V9LAorICAgIHsiL3B5YyIsICJyYiIsIFBZX0NPTVBJTEVEfSwKKyAgICB7MCwgMH0KIH07CiAjZWxzZQogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlZGVzY3IgX1B5SW1wb3J0X1N0YW5kYXJkRmlsZXRhYltdID0gewotCXsiLnB5IiwgIlUiLCBQWV9TT1VSQ0V9LAorICAgIHsiLnB5IiwgIlUiLCBQWV9TT1VSQ0V9LAogI2lmZGVmIE1TX1dJTkRPV1MKLQl7Ii5weXciLCAiVSIsIFBZX1NPVVJDRX0sCisgICAgeyIucHl3IiwgIlUiLCBQWV9TT1VSQ0V9LAogI2VuZGlmCi0JeyIucHljIiwgInJiIiwgUFlfQ09NUElMRUR9LAotCXswLCAwfQorICAgIHsiLnB5YyIsICJyYiIsIFBZX0NPTVBJTEVEfSwKKyAgICB7MCwgMH0KIH07CiAjZW5kaWYKIApAQCAtMTE2LDEzMSArMTE2LDEzMSBAQAogdm9pZAogX1B5SW1wb3J0X0luaXQodm9pZCkKIHsKLQljb25zdCBzdHJ1Y3QgZmlsZWRlc2NyICpzY2FuOwotCXN0cnVjdCBmaWxlZGVzY3IgKmZpbGV0YWI7Ci0JaW50IGNvdW50RCA9IDA7Ci0JaW50IGNvdW50UyA9IDA7CisgICAgY29uc3Qgc3RydWN0IGZpbGVkZXNjciAqc2NhbjsKKyAgICBzdHJ1Y3QgZmlsZWRlc2NyICpmaWxldGFiOworICAgIGludCBjb3VudEQgPSAwOworICAgIGludCBjb3VudFMgPSAwOwogCi0JLyogcHJlcGFyZSBfUHlJbXBvcnRfRmlsZXRhYjogY29weSBlbnRyaWVzIGZyb20KLQkgICBfUHlJbXBvcnRfRHluTG9hZEZpbGV0YWIgYW5kIF9QeUltcG9ydF9TdGFuZGFyZEZpbGV0YWIuCi0JICovCisgICAgLyogcHJlcGFyZSBfUHlJbXBvcnRfRmlsZXRhYjogY29weSBlbnRyaWVzIGZyb20KKyAgICAgICBfUHlJbXBvcnRfRHluTG9hZEZpbGV0YWIgYW5kIF9QeUltcG9ydF9TdGFuZGFyZEZpbGV0YWIuCisgICAgICovCiAjaWZkZWYgSEFWRV9EWU5BTUlDX0xPQURJTkcKLQlmb3IgKHNjYW4gPSBfUHlJbXBvcnRfRHluTG9hZEZpbGV0YWI7IHNjYW4tPnN1ZmZpeCAhPSBOVUxMOyArK3NjYW4pCi0JCSsrY291bnREOworICAgIGZvciAoc2NhbiA9IF9QeUltcG9ydF9EeW5Mb2FkRmlsZXRhYjsgc2Nhbi0+c3VmZml4ICE9IE5VTEw7ICsrc2NhbikKKyAgICAgICAgKytjb3VudEQ7CiAjZW5kaWYKLQlmb3IgKHNjYW4gPSBfUHlJbXBvcnRfU3RhbmRhcmRGaWxldGFiOyBzY2FuLT5zdWZmaXggIT0gTlVMTDsgKytzY2FuKQotCQkrK2NvdW50UzsKLQlmaWxldGFiID0gUHlNZW1fTkVXKHN0cnVjdCBmaWxlZGVzY3IsIGNvdW50RCArIGNvdW50UyArIDEpOwotCWlmIChmaWxldGFiID09IE5VTEwpCi0JCVB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgaW1wb3J0IGZpbGUgdGFibGUuIik7CisgICAgZm9yIChzY2FuID0gX1B5SW1wb3J0X1N0YW5kYXJkRmlsZXRhYjsgc2Nhbi0+c3VmZml4ICE9IE5VTEw7ICsrc2NhbikKKyAgICAgICAgKytjb3VudFM7CisgICAgZmlsZXRhYiA9IFB5TWVtX05FVyhzdHJ1Y3QgZmlsZWRlc2NyLCBjb3VudEQgKyBjb3VudFMgKyAxKTsKKyAgICBpZiAoZmlsZXRhYiA9PSBOVUxMKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIGltcG9ydCBmaWxlIHRhYmxlLiIpOwogI2lmZGVmIEhBVkVfRFlOQU1JQ19MT0FESU5HCi0JbWVtY3B5KGZpbGV0YWIsIF9QeUltcG9ydF9EeW5Mb2FkRmlsZXRhYiwKLQkgICAgICAgY291bnREICogc2l6ZW9mKHN0cnVjdCBmaWxlZGVzY3IpKTsKKyAgICBtZW1jcHkoZmlsZXRhYiwgX1B5SW1wb3J0X0R5bkxvYWRGaWxldGFiLAorICAgICAgICAgICBjb3VudEQgKiBzaXplb2Yoc3RydWN0IGZpbGVkZXNjcikpOwogI2VuZGlmCi0JbWVtY3B5KGZpbGV0YWIgKyBjb3VudEQsIF9QeUltcG9ydF9TdGFuZGFyZEZpbGV0YWIsCi0JICAgICAgIGNvdW50UyAqIHNpemVvZihzdHJ1Y3QgZmlsZWRlc2NyKSk7Ci0JZmlsZXRhYltjb3VudEQgKyBjb3VudFNdLnN1ZmZpeCA9IE5VTEw7CisgICAgbWVtY3B5KGZpbGV0YWIgKyBjb3VudEQsIF9QeUltcG9ydF9TdGFuZGFyZEZpbGV0YWIsCisgICAgICAgICAgIGNvdW50UyAqIHNpemVvZihzdHJ1Y3QgZmlsZWRlc2NyKSk7CisgICAgZmlsZXRhYltjb3VudEQgKyBjb3VudFNdLnN1ZmZpeCA9IE5VTEw7CiAKLQlfUHlJbXBvcnRfRmlsZXRhYiA9IGZpbGV0YWI7CisgICAgX1B5SW1wb3J0X0ZpbGV0YWIgPSBmaWxldGFiOwogCi0JaWYgKFB5X09wdGltaXplRmxhZykgewotCQkvKiBSZXBsYWNlICIucHljIiB3aXRoICIucHlvIiBpbiBfUHlJbXBvcnRfRmlsZXRhYiAqLwotCQlmb3IgKDsgZmlsZXRhYi0+c3VmZml4ICE9IE5VTEw7IGZpbGV0YWIrKykgeworICAgIGlmIChQeV9PcHRpbWl6ZUZsYWcpIHsKKyAgICAgICAgLyogUmVwbGFjZSAiLnB5YyIgd2l0aCAiLnB5byIgaW4gX1B5SW1wb3J0X0ZpbGV0YWIgKi8KKyAgICAgICAgZm9yICg7IGZpbGV0YWItPnN1ZmZpeCAhPSBOVUxMOyBmaWxldGFiKyspIHsKICNpZm5kZWYgUklTQ09TCi0JCQlpZiAoc3RyY21wKGZpbGV0YWItPnN1ZmZpeCwgIi5weWMiKSA9PSAwKQotCQkJCWZpbGV0YWItPnN1ZmZpeCA9ICIucHlvIjsKKyAgICAgICAgICAgIGlmIChzdHJjbXAoZmlsZXRhYi0+c3VmZml4LCAiLnB5YyIpID09IDApCisgICAgICAgICAgICAgICAgZmlsZXRhYi0+c3VmZml4ID0gIi5weW8iOwogI2Vsc2UKLQkJCWlmIChzdHJjbXAoZmlsZXRhYi0+c3VmZml4LCAiL3B5YyIpID09IDApCi0JCQkJZmlsZXRhYi0+c3VmZml4ID0gIi9weW8iOworICAgICAgICAgICAgaWYgKHN0cmNtcChmaWxldGFiLT5zdWZmaXgsICIvcHljIikgPT0gMCkKKyAgICAgICAgICAgICAgICBmaWxldGFiLT5zdWZmaXggPSAiL3B5byI7CiAjZW5kaWYKLQkJfQotCX0KKyAgICAgICAgfQorICAgIH0KIAotCWlmIChQeV9Vbmljb2RlRmxhZykgewotCQkvKiBGaXggdGhlIHB5Y19tYWdpYyBzbyB0aGF0IGJ5dGUgY29tcGlsZWQgY29kZSBjcmVhdGVkCi0JCSAgIHVzaW5nIHRoZSBhbGwtVW5pY29kZSBtZXRob2QgZG9lc24ndCBpbnRlcmZlcmUgd2l0aAotCQkgICBjb2RlIGNyZWF0ZWQgaW4gbm9ybWFsIG9wZXJhdGlvbiBtb2RlLiAqLwotCQlweWNfbWFnaWMgPSBNQUdJQyArIDE7Ci0JfQorICAgIGlmIChQeV9Vbmljb2RlRmxhZykgeworICAgICAgICAvKiBGaXggdGhlIHB5Y19tYWdpYyBzbyB0aGF0IGJ5dGUgY29tcGlsZWQgY29kZSBjcmVhdGVkCisgICAgICAgICAgIHVzaW5nIHRoZSBhbGwtVW5pY29kZSBtZXRob2QgZG9lc24ndCBpbnRlcmZlcmUgd2l0aAorICAgICAgICAgICBjb2RlIGNyZWF0ZWQgaW4gbm9ybWFsIG9wZXJhdGlvbiBtb2RlLiAqLworICAgICAgICBweWNfbWFnaWMgPSBNQUdJQyArIDE7CisgICAgfQogfQogCiB2b2lkCiBfUHlJbXBvcnRIb29rc19Jbml0KHZvaWQpCiB7Ci0JUHlPYmplY3QgKnYsICpwYXRoX2hvb2tzID0gTlVMTCwgKnppbXBpbXBvcnQ7Ci0JaW50IGVyciA9IDA7CisgICAgUHlPYmplY3QgKnYsICpwYXRoX2hvb2tzID0gTlVMTCwgKnppbXBpbXBvcnQ7CisgICAgaW50IGVyciA9IDA7CiAKLQkvKiBhZGRpbmcgc3lzLnBhdGhfaG9va3MgYW5kIHN5cy5wYXRoX2ltcG9ydGVyX2NhY2hlLCBzZXR0aW5nIHVwCi0JICAgemlwaW1wb3J0ICovCi0JaWYgKFB5VHlwZV9SZWFkeSgmUHlOdWxsSW1wb3J0ZXJfVHlwZSkgPCAwKQotCQlnb3RvIGVycm9yOworICAgIC8qIGFkZGluZyBzeXMucGF0aF9ob29rcyBhbmQgc3lzLnBhdGhfaW1wb3J0ZXJfY2FjaGUsIHNldHRpbmcgdXAKKyAgICAgICB6aXBpbXBvcnQgKi8KKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZQeU51bGxJbXBvcnRlcl9UeXBlKSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CiAKLQlpZiAoUHlfVmVyYm9zZUZsYWcpCi0JCVB5U3lzX1dyaXRlU3RkZXJyKCIjIGluc3RhbGxpbmcgemlwaW1wb3J0IGhvb2tcbiIpOworICAgIGlmIChQeV9WZXJib3NlRmxhZykKKyAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoIiMgaW5zdGFsbGluZyB6aXBpbXBvcnQgaG9va1xuIik7CiAKLQl2ID0gUHlMaXN0X05ldygwKTsKLQlpZiAodiA9PSBOVUxMKQotCQlnb3RvIGVycm9yOwotCWVyciA9IFB5U3lzX1NldE9iamVjdCgibWV0YV9wYXRoIiwgdik7Ci0JUHlfREVDUkVGKHYpOwotCWlmIChlcnIpCi0JCWdvdG8gZXJyb3I7Ci0JdiA9IFB5RGljdF9OZXcoKTsKLQlpZiAodiA9PSBOVUxMKQotCQlnb3RvIGVycm9yOwotCWVyciA9IFB5U3lzX1NldE9iamVjdCgicGF0aF9pbXBvcnRlcl9jYWNoZSIsIHYpOwotCVB5X0RFQ1JFRih2KTsKLQlpZiAoZXJyKQotCQlnb3RvIGVycm9yOwotCXBhdGhfaG9va3MgPSBQeUxpc3RfTmV3KDApOwotCWlmIChwYXRoX2hvb2tzID09IE5VTEwpCi0JCWdvdG8gZXJyb3I7Ci0JZXJyID0gUHlTeXNfU2V0T2JqZWN0KCJwYXRoX2hvb2tzIiwgcGF0aF9ob29rcyk7Ci0JaWYgKGVycikgeworICAgIHYgPSBQeUxpc3RfTmV3KDApOworICAgIGlmICh2ID09IE5VTEwpCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgZXJyID0gUHlTeXNfU2V0T2JqZWN0KCJtZXRhX3BhdGgiLCB2KTsKKyAgICBQeV9ERUNSRUYodik7CisgICAgaWYgKGVycikKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB2ID0gUHlEaWN0X05ldygpOworICAgIGlmICh2ID09IE5VTEwpCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgZXJyID0gUHlTeXNfU2V0T2JqZWN0KCJwYXRoX2ltcG9ydGVyX2NhY2hlIiwgdik7CisgICAgUHlfREVDUkVGKHYpOworICAgIGlmIChlcnIpCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgcGF0aF9ob29rcyA9IFB5TGlzdF9OZXcoMCk7CisgICAgaWYgKHBhdGhfaG9va3MgPT0gTlVMTCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBlcnIgPSBQeVN5c19TZXRPYmplY3QoInBhdGhfaG9va3MiLCBwYXRoX2hvb2tzKTsKKyAgICBpZiAoZXJyKSB7CiAgIGVycm9yOgotCQlQeUVycl9QcmludCgpOwotCQlQeV9GYXRhbEVycm9yKCJpbml0aWFsaXppbmcgc3lzLm1ldGFfcGF0aCwgc3lzLnBhdGhfaG9va3MsICIKLQkJCSAgICAgICJwYXRoX2ltcG9ydGVyX2NhY2hlLCBvciBOdWxsSW1wb3J0ZXIgZmFpbGVkIgotCQkJICAgICAgKTsKLQl9CisgICAgICAgIFB5RXJyX1ByaW50KCk7CisgICAgICAgIFB5X0ZhdGFsRXJyb3IoImluaXRpYWxpemluZyBzeXMubWV0YV9wYXRoLCBzeXMucGF0aF9ob29rcywgIgorICAgICAgICAgICAgICAgICAgICAgICJwYXRoX2ltcG9ydGVyX2NhY2hlLCBvciBOdWxsSW1wb3J0ZXIgZmFpbGVkIgorICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgfQogCi0JemltcGltcG9ydCA9IFB5SW1wb3J0X0ltcG9ydE1vZHVsZSgiemlwaW1wb3J0Iik7Ci0JaWYgKHppbXBpbXBvcnQgPT0gTlVMTCkgewotCQlQeUVycl9DbGVhcigpOyAvKiBObyB6aXAgaW1wb3J0IG1vZHVsZSAtLSBva2F5ICovCi0JCWlmIChQeV9WZXJib3NlRmxhZykKLQkJCVB5U3lzX1dyaXRlU3RkZXJyKCIjIGNhbid0IGltcG9ydCB6aXBpbXBvcnRcbiIpOwotCX0KLQllbHNlIHsKLQkJUHlPYmplY3QgKnppcGltcG9ydGVyID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyh6aW1waW1wb3J0LAotCQkJCQkJCSAgICAgICAiemlwaW1wb3J0ZXIiKTsKLQkJUHlfREVDUkVGKHppbXBpbXBvcnQpOwotCQlpZiAoemlwaW1wb3J0ZXIgPT0gTlVMTCkgewotCQkJUHlFcnJfQ2xlYXIoKTsgLyogTm8gemlwaW1wb3J0ZXIgb2JqZWN0IC0tIG9rYXkgKi8KLQkJCWlmIChQeV9WZXJib3NlRmxhZykKLQkJCQlQeVN5c19Xcml0ZVN0ZGVycigKLQkJCQkgICAgIiMgY2FuJ3QgaW1wb3J0IHppcGltcG9ydC56aXBpbXBvcnRlclxuIik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvKiBzeXMucGF0aF9ob29rcy5hcHBlbmQoemlwaW1wb3J0ZXIpICovCi0JCQllcnIgPSBQeUxpc3RfQXBwZW5kKHBhdGhfaG9va3MsIHppcGltcG9ydGVyKTsKLQkJCVB5X0RFQ1JFRih6aXBpbXBvcnRlcik7Ci0JCQlpZiAoZXJyKQotCQkJCWdvdG8gZXJyb3I7Ci0JCQlpZiAoUHlfVmVyYm9zZUZsYWcpCi0JCQkJUHlTeXNfV3JpdGVTdGRlcnIoCi0JCQkJCSIjIGluc3RhbGxlZCB6aXBpbXBvcnQgaG9va1xuIik7Ci0JCX0KLQl9Ci0JUHlfREVDUkVGKHBhdGhfaG9va3MpOworICAgIHppbXBpbXBvcnQgPSBQeUltcG9ydF9JbXBvcnRNb2R1bGUoInppcGltcG9ydCIpOworICAgIGlmICh6aW1waW1wb3J0ID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsgLyogTm8gemlwIGltcG9ydCBtb2R1bGUgLS0gb2theSAqLworICAgICAgICBpZiAoUHlfVmVyYm9zZUZsYWcpCisgICAgICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigiIyBjYW4ndCBpbXBvcnQgemlwaW1wb3J0XG4iKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5T2JqZWN0ICp6aXBpbXBvcnRlciA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoemltcGltcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiemlwaW1wb3J0ZXIiKTsKKyAgICAgICAgUHlfREVDUkVGKHppbXBpbXBvcnQpOworICAgICAgICBpZiAoemlwaW1wb3J0ZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsgLyogTm8gemlwaW1wb3J0ZXIgb2JqZWN0IC0tIG9rYXkgKi8KKyAgICAgICAgICAgIGlmIChQeV9WZXJib3NlRmxhZykKKyAgICAgICAgICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigKKyAgICAgICAgICAgICAgICAgICAgIiMgY2FuJ3QgaW1wb3J0IHppcGltcG9ydC56aXBpbXBvcnRlclxuIik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvKiBzeXMucGF0aF9ob29rcy5hcHBlbmQoemlwaW1wb3J0ZXIpICovCisgICAgICAgICAgICBlcnIgPSBQeUxpc3RfQXBwZW5kKHBhdGhfaG9va3MsIHppcGltcG9ydGVyKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih6aXBpbXBvcnRlcik7CisgICAgICAgICAgICBpZiAoZXJyKQorICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICBpZiAoUHlfVmVyYm9zZUZsYWcpCisgICAgICAgICAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoCisgICAgICAgICAgICAgICAgICAgICIjIGluc3RhbGxlZCB6aXBpbXBvcnQgaG9va1xuIik7CisgICAgICAgIH0KKyAgICB9CisgICAgUHlfREVDUkVGKHBhdGhfaG9va3MpOwogfQogCiB2b2lkCiBfUHlJbXBvcnRfRmluaSh2b2lkKQogewotCVB5X1hERUNSRUYoZXh0ZW5zaW9ucyk7Ci0JZXh0ZW5zaW9ucyA9IE5VTEw7Ci0JUHlNZW1fREVMKF9QeUltcG9ydF9GaWxldGFiKTsKLQlfUHlJbXBvcnRfRmlsZXRhYiA9IE5VTEw7CisgICAgUHlfWERFQ1JFRihleHRlbnNpb25zKTsKKyAgICBleHRlbnNpb25zID0gTlVMTDsKKyAgICBQeU1lbV9ERUwoX1B5SW1wb3J0X0ZpbGV0YWIpOworICAgIF9QeUltcG9ydF9GaWxldGFiID0gTlVMTDsKIH0KIAogCkBAIC0yNTksNDIgKzI1OSw0MiBAQAogdm9pZAogX1B5SW1wb3J0X0FjcXVpcmVMb2NrKHZvaWQpCiB7Ci0JbG9uZyBtZSA9IFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKTsKLQlpZiAobWUgPT0gLTEpCi0JCXJldHVybjsgLyogVG9vIGJhZCAqLwotCWlmIChpbXBvcnRfbG9jayA9PSBOVUxMKSB7Ci0JCWltcG9ydF9sb2NrID0gUHlUaHJlYWRfYWxsb2NhdGVfbG9jaygpOwotCQlpZiAoaW1wb3J0X2xvY2sgPT0gTlVMTCkKLQkJCXJldHVybjsgIC8qIE5vdGhpbmcgbXVjaCB3ZSBjYW4gZG8uICovCi0JfQotCWlmIChpbXBvcnRfbG9ja190aHJlYWQgPT0gbWUpIHsKLQkJaW1wb3J0X2xvY2tfbGV2ZWwrKzsKLQkJcmV0dXJuOwotCX0KLQlpZiAoaW1wb3J0X2xvY2tfdGhyZWFkICE9IC0xIHx8ICFQeVRocmVhZF9hY3F1aXJlX2xvY2soaW1wb3J0X2xvY2ssIDApKQotCXsKLQkJUHlUaHJlYWRTdGF0ZSAqdHN0YXRlID0gUHlFdmFsX1NhdmVUaHJlYWQoKTsKLQkJUHlUaHJlYWRfYWNxdWlyZV9sb2NrKGltcG9ydF9sb2NrLCAxKTsKLQkJUHlFdmFsX1Jlc3RvcmVUaHJlYWQodHN0YXRlKTsKLQl9Ci0JaW1wb3J0X2xvY2tfdGhyZWFkID0gbWU7Ci0JaW1wb3J0X2xvY2tfbGV2ZWwgPSAxOworICAgIGxvbmcgbWUgPSBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCk7CisgICAgaWYgKG1lID09IC0xKQorICAgICAgICByZXR1cm47IC8qIFRvbyBiYWQgKi8KKyAgICBpZiAoaW1wb3J0X2xvY2sgPT0gTlVMTCkgeworICAgICAgICBpbXBvcnRfbG9jayA9IFB5VGhyZWFkX2FsbG9jYXRlX2xvY2soKTsKKyAgICAgICAgaWYgKGltcG9ydF9sb2NrID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm47ICAvKiBOb3RoaW5nIG11Y2ggd2UgY2FuIGRvLiAqLworICAgIH0KKyAgICBpZiAoaW1wb3J0X2xvY2tfdGhyZWFkID09IG1lKSB7CisgICAgICAgIGltcG9ydF9sb2NrX2xldmVsKys7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKGltcG9ydF9sb2NrX3RocmVhZCAhPSAtMSB8fCAhUHlUaHJlYWRfYWNxdWlyZV9sb2NrKGltcG9ydF9sb2NrLCAwKSkKKyAgICB7CisgICAgICAgIFB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IFB5RXZhbF9TYXZlVGhyZWFkKCk7CisgICAgICAgIFB5VGhyZWFkX2FjcXVpcmVfbG9jayhpbXBvcnRfbG9jaywgMSk7CisgICAgICAgIFB5RXZhbF9SZXN0b3JlVGhyZWFkKHRzdGF0ZSk7CisgICAgfQorICAgIGltcG9ydF9sb2NrX3RocmVhZCA9IG1lOworICAgIGltcG9ydF9sb2NrX2xldmVsID0gMTsKIH0KIAogaW50CiBfUHlJbXBvcnRfUmVsZWFzZUxvY2sodm9pZCkKIHsKLQlsb25nIG1lID0gUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpOwotCWlmIChtZSA9PSAtMSB8fCBpbXBvcnRfbG9jayA9PSBOVUxMKQotCQlyZXR1cm4gMDsgLyogVG9vIGJhZCAqLwotCWlmIChpbXBvcnRfbG9ja190aHJlYWQgIT0gbWUpCi0JCXJldHVybiAtMTsKLQlpbXBvcnRfbG9ja19sZXZlbC0tOwotCWlmIChpbXBvcnRfbG9ja19sZXZlbCA9PSAwKSB7Ci0JCWltcG9ydF9sb2NrX3RocmVhZCA9IC0xOwotCQlQeVRocmVhZF9yZWxlYXNlX2xvY2soaW1wb3J0X2xvY2spOwotCX0KLQlyZXR1cm4gMTsKKyAgICBsb25nIG1lID0gUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpOworICAgIGlmIChtZSA9PSAtMSB8fCBpbXBvcnRfbG9jayA9PSBOVUxMKQorICAgICAgICByZXR1cm4gMDsgLyogVG9vIGJhZCAqLworICAgIGlmIChpbXBvcnRfbG9ja190aHJlYWQgIT0gbWUpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpbXBvcnRfbG9ja19sZXZlbC0tOworICAgIGlmIChpbXBvcnRfbG9ja19sZXZlbCA9PSAwKSB7CisgICAgICAgIGltcG9ydF9sb2NrX3RocmVhZCA9IC0xOworICAgICAgICBQeVRocmVhZF9yZWxlYXNlX2xvY2soaW1wb3J0X2xvY2spOworICAgIH0KKyAgICByZXR1cm4gMTsKIH0KIAogLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSBQeU9TX0FmdGVyRm9yayB0byBlbnN1cmUgdGhhdCBuZXdseQpAQCAtMzA1LDEwICszMDUsMTAgQEAKIHZvaWQKIF9QeUltcG9ydF9SZUluaXRMb2NrKHZvaWQpCiB7Ci0gCWlmIChpbXBvcnRfbG9jayAhPSBOVUxMKQotIAkJaW1wb3J0X2xvY2sgPSBQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKCk7Ci0gCWltcG9ydF9sb2NrX3RocmVhZCA9IC0xOwotIAlpbXBvcnRfbG9ja19sZXZlbCA9IDA7CisgICAgaWYgKGltcG9ydF9sb2NrICE9IE5VTEwpCisgICAgICAgIGltcG9ydF9sb2NrID0gUHlUaHJlYWRfYWxsb2NhdGVfbG9jaygpOworICAgIGltcG9ydF9sb2NrX3RocmVhZCA9IC0xOworICAgIGltcG9ydF9sb2NrX2xldmVsID0gMDsKIH0KIAogI2VuZGlmCkBAIC0zMTcsOSArMzE3LDkgQEAKIGltcF9sb2NrX2hlbGQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpub2FyZ3MpCiB7CiAjaWZkZWYgV0lUSF9USFJFQUQKLQlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKGltcG9ydF9sb2NrX3RocmVhZCAhPSAtMSk7CisgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZyhpbXBvcnRfbG9ja190aHJlYWQgIT0gLTEpOwogI2Vsc2UKLQlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKDApOworICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoMCk7CiAjZW5kaWYKIH0KIApAQCAtMzI3LDMyICszMjcsMzIgQEAKIGltcF9hY3F1aXJlX2xvY2soUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpub2FyZ3MpCiB7CiAjaWZkZWYgV0lUSF9USFJFQUQKLQlfUHlJbXBvcnRfQWNxdWlyZUxvY2soKTsKKyAgICBfUHlJbXBvcnRfQWNxdWlyZUxvY2soKTsKICNlbmRpZgotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbXBfcmVsZWFzZV9sb2NrKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqbm9hcmdzKQogewogI2lmZGVmIFdJVEhfVEhSRUFECi0JaWYgKF9QeUltcG9ydF9SZWxlYXNlTG9jaygpIDwgMCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAotCQkJCSJub3QgaG9sZGluZyB0aGUgaW1wb3J0IGxvY2siKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChfUHlJbXBvcnRfUmVsZWFzZUxvY2soKSA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJub3QgaG9sZGluZyB0aGUgaW1wb3J0IGxvY2siKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogI2VuZGlmCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIHZvaWQKIGltcF9tb2R1bGVzX3JlbG9hZGluZ19jbGVhcih2b2lkKQogewotCVB5SW50ZXJwcmV0ZXJTdGF0ZSAqaW50ZXJwID0gUHlUaHJlYWRTdGF0ZV9HZXQoKS0+aW50ZXJwOwotCWlmIChpbnRlcnAtPm1vZHVsZXNfcmVsb2FkaW5nICE9IE5VTEwpCi0JCVB5RGljdF9DbGVhcihpbnRlcnAtPm1vZHVsZXNfcmVsb2FkaW5nKTsKKyAgICBQeUludGVycHJldGVyU3RhdGUgKmludGVycCA9IFB5VGhyZWFkU3RhdGVfR2V0KCktPmludGVycDsKKyAgICBpZiAoaW50ZXJwLT5tb2R1bGVzX3JlbG9hZGluZyAhPSBOVUxMKQorICAgICAgICBQeURpY3RfQ2xlYXIoaW50ZXJwLT5tb2R1bGVzX3JlbG9hZGluZyk7CiB9CiAKIC8qIEhlbHBlciBmb3Igc3lzICovCkBAIC0zNjAsMjkgKzM2MCwyOSBAQAogUHlPYmplY3QgKgogUHlJbXBvcnRfR2V0TW9kdWxlRGljdCh2b2lkKQogewotCVB5SW50ZXJwcmV0ZXJTdGF0ZSAqaW50ZXJwID0gUHlUaHJlYWRTdGF0ZV9HRVQoKS0+aW50ZXJwOwotCWlmIChpbnRlcnAtPm1vZHVsZXMgPT0gTlVMTCkKLQkJUHlfRmF0YWxFcnJvcigiUHlJbXBvcnRfR2V0TW9kdWxlRGljdDogbm8gbW9kdWxlIGRpY3Rpb25hcnkhIik7Ci0JcmV0dXJuIGludGVycC0+bW9kdWxlczsKKyAgICBQeUludGVycHJldGVyU3RhdGUgKmludGVycCA9IFB5VGhyZWFkU3RhdGVfR0VUKCktPmludGVycDsKKyAgICBpZiAoaW50ZXJwLT5tb2R1bGVzID09IE5VTEwpCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIlB5SW1wb3J0X0dldE1vZHVsZURpY3Q6IG5vIG1vZHVsZSBkaWN0aW9uYXJ5ISIpOworICAgIHJldHVybiBpbnRlcnAtPm1vZHVsZXM7CiB9CiAKIAogLyogTGlzdCBvZiBuYW1lcyB0byBjbGVhciBpbiBzeXMgKi8KIHN0YXRpYyBjaGFyKiBzeXNfZGVsZXRlc1tdID0gewotCSJwYXRoIiwgImFyZ3YiLCAicHMxIiwgInBzMiIsICJleGl0ZnVuYyIsCi0JImV4Y190eXBlIiwgImV4Y192YWx1ZSIsICJleGNfdHJhY2ViYWNrIiwKLQkibGFzdF90eXBlIiwgImxhc3RfdmFsdWUiLCAibGFzdF90cmFjZWJhY2siLAotCSJwYXRoX2hvb2tzIiwgInBhdGhfaW1wb3J0ZXJfY2FjaGUiLCAibWV0YV9wYXRoIiwKLQkvKiBtaXNjIHN0dWZmICovCi0JImZsYWdzIiwgImZsb2F0X2luZm8iLAotCU5VTEwKKyAgICAicGF0aCIsICJhcmd2IiwgInBzMSIsICJwczIiLCAiZXhpdGZ1bmMiLAorICAgICJleGNfdHlwZSIsICJleGNfdmFsdWUiLCAiZXhjX3RyYWNlYmFjayIsCisgICAgImxhc3RfdHlwZSIsICJsYXN0X3ZhbHVlIiwgImxhc3RfdHJhY2ViYWNrIiwKKyAgICAicGF0aF9ob29rcyIsICJwYXRoX2ltcG9ydGVyX2NhY2hlIiwgIm1ldGFfcGF0aCIsCisgICAgLyogbWlzYyBzdHVmZiAqLworICAgICJmbGFncyIsICJmbG9hdF9pbmZvIiwKKyAgICBOVUxMCiB9OwogCiBzdGF0aWMgY2hhciogc3lzX2ZpbGVzW10gPSB7Ci0JInN0ZGluIiwgIl9fc3RkaW5fXyIsCi0JInN0ZG91dCIsICJfX3N0ZG91dF9fIiwKLQkic3RkZXJyIiwgIl9fc3RkZXJyX18iLAotCU5VTEwKKyAgICAic3RkaW4iLCAiX19zdGRpbl9fIiwKKyAgICAic3Rkb3V0IiwgIl9fc3Rkb3V0X18iLAorICAgICJzdGRlcnIiLCAiX19zdGRlcnJfXyIsCisgICAgTlVMTAogfTsKIAogCkBAIC0zOTEsMTMyICszOTEsMTMyIEBACiB2b2lkCiBQeUltcG9ydF9DbGVhbnVwKHZvaWQpCiB7Ci0JUHlfc3NpemVfdCBwb3MsIG5kb25lOwotCWNoYXIgKm5hbWU7Ci0JUHlPYmplY3QgKmtleSwgKnZhbHVlLCAqZGljdDsKLQlQeUludGVycHJldGVyU3RhdGUgKmludGVycCA9IFB5VGhyZWFkU3RhdGVfR0VUKCktPmludGVycDsKLQlQeU9iamVjdCAqbW9kdWxlcyA9IGludGVycC0+bW9kdWxlczsKKyAgICBQeV9zc2l6ZV90IHBvcywgbmRvbmU7CisgICAgY2hhciAqbmFtZTsKKyAgICBQeU9iamVjdCAqa2V5LCAqdmFsdWUsICpkaWN0OworICAgIFB5SW50ZXJwcmV0ZXJTdGF0ZSAqaW50ZXJwID0gUHlUaHJlYWRTdGF0ZV9HRVQoKS0+aW50ZXJwOworICAgIFB5T2JqZWN0ICptb2R1bGVzID0gaW50ZXJwLT5tb2R1bGVzOwogCi0JaWYgKG1vZHVsZXMgPT0gTlVMTCkKLQkJcmV0dXJuOyAvKiBBbHJlYWR5IGRvbmUgKi8KKyAgICBpZiAobW9kdWxlcyA9PSBOVUxMKQorICAgICAgICByZXR1cm47IC8qIEFscmVhZHkgZG9uZSAqLwogCi0JLyogRGVsZXRlIHNvbWUgc3BlY2lhbCB2YXJpYWJsZXMgZmlyc3QuICBUaGVzZSBhcmUgY29tbW9uCi0JICAgcGxhY2VzIHdoZXJlIHVzZXIgdmFsdWVzIGhpZGUgYW5kIHBlb3BsZSBjb21wbGFpbiB3aGVuIHRoZWlyCi0JICAgZGVzdHJ1Y3RvcnMgZmFpbC4gIFNpbmNlIHRoZSBtb2R1bGVzIGNvbnRhaW5pbmcgdGhlbSBhcmUKLQkgICBkZWxldGVkICpsYXN0KiBvZiBhbGwsIHRoZXkgd291bGQgY29tZSB0b28gbGF0ZSBpbiB0aGUgbm9ybWFsCi0JICAgZGVzdHJ1Y3Rpb24gb3JkZXIuICBTaWdoLiAqLworICAgIC8qIERlbGV0ZSBzb21lIHNwZWNpYWwgdmFyaWFibGVzIGZpcnN0LiAgVGhlc2UgYXJlIGNvbW1vbgorICAgICAgIHBsYWNlcyB3aGVyZSB1c2VyIHZhbHVlcyBoaWRlIGFuZCBwZW9wbGUgY29tcGxhaW4gd2hlbiB0aGVpcgorICAgICAgIGRlc3RydWN0b3JzIGZhaWwuICBTaW5jZSB0aGUgbW9kdWxlcyBjb250YWluaW5nIHRoZW0gYXJlCisgICAgICAgZGVsZXRlZCAqbGFzdCogb2YgYWxsLCB0aGV5IHdvdWxkIGNvbWUgdG9vIGxhdGUgaW4gdGhlIG5vcm1hbAorICAgICAgIGRlc3RydWN0aW9uIG9yZGVyLiAgU2lnaC4gKi8KIAotCXZhbHVlID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcobW9kdWxlcywgIl9fYnVpbHRpbl9fIik7Ci0JaWYgKHZhbHVlICE9IE5VTEwgJiYgUHlNb2R1bGVfQ2hlY2sodmFsdWUpKSB7Ci0JCWRpY3QgPSBQeU1vZHVsZV9HZXREaWN0KHZhbHVlKTsKLQkJaWYgKFB5X1ZlcmJvc2VGbGFnKQotCQkJUHlTeXNfV3JpdGVTdGRlcnIoIiMgY2xlYXIgX19idWlsdGluX18uX1xuIik7Ci0JCVB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsICJfIiwgUHlfTm9uZSk7Ci0JfQotCXZhbHVlID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcobW9kdWxlcywgInN5cyIpOwotCWlmICh2YWx1ZSAhPSBOVUxMICYmIFB5TW9kdWxlX0NoZWNrKHZhbHVlKSkgewotCQljaGFyICoqcDsKLQkJUHlPYmplY3QgKnY7Ci0JCWRpY3QgPSBQeU1vZHVsZV9HZXREaWN0KHZhbHVlKTsKLQkJZm9yIChwID0gc3lzX2RlbGV0ZXM7ICpwICE9IE5VTEw7IHArKykgewotCQkJaWYgKFB5X1ZlcmJvc2VGbGFnKQotCQkJCVB5U3lzX1dyaXRlU3RkZXJyKCIjIGNsZWFyIHN5cy4lc1xuIiwgKnApOwotCQkJUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgKnAsIFB5X05vbmUpOwotCQl9Ci0JCWZvciAocCA9IHN5c19maWxlczsgKnAgIT0gTlVMTDsgcCs9MikgewotCQkJaWYgKFB5X1ZlcmJvc2VGbGFnKQotCQkJCVB5U3lzX1dyaXRlU3RkZXJyKCIjIHJlc3RvcmUgc3lzLiVzXG4iLCAqcCk7Ci0JCQl2ID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoZGljdCwgKihwKzEpKTsKLQkJCWlmICh2ID09IE5VTEwpCi0JCQkJdiA9IFB5X05vbmU7Ci0JCQlQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCAqcCwgdik7Ci0JCX0KLQl9CisgICAgdmFsdWUgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhtb2R1bGVzLCAiX19idWlsdGluX18iKTsKKyAgICBpZiAodmFsdWUgIT0gTlVMTCAmJiBQeU1vZHVsZV9DaGVjayh2YWx1ZSkpIHsKKyAgICAgICAgZGljdCA9IFB5TW9kdWxlX0dldERpY3QodmFsdWUpOworICAgICAgICBpZiAoUHlfVmVyYm9zZUZsYWcpCisgICAgICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigiIyBjbGVhciBfX2J1aWx0aW5fXy5fXG4iKTsKKyAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgIl8iLCBQeV9Ob25lKTsKKyAgICB9CisgICAgdmFsdWUgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhtb2R1bGVzLCAic3lzIik7CisgICAgaWYgKHZhbHVlICE9IE5VTEwgJiYgUHlNb2R1bGVfQ2hlY2sodmFsdWUpKSB7CisgICAgICAgIGNoYXIgKipwOworICAgICAgICBQeU9iamVjdCAqdjsKKyAgICAgICAgZGljdCA9IFB5TW9kdWxlX0dldERpY3QodmFsdWUpOworICAgICAgICBmb3IgKHAgPSBzeXNfZGVsZXRlczsgKnAgIT0gTlVMTDsgcCsrKSB7CisgICAgICAgICAgICBpZiAoUHlfVmVyYm9zZUZsYWcpCisgICAgICAgICAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoIiMgY2xlYXIgc3lzLiVzXG4iLCAqcCk7CisgICAgICAgICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCAqcCwgUHlfTm9uZSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChwID0gc3lzX2ZpbGVzOyAqcCAhPSBOVUxMOyBwKz0yKSB7CisgICAgICAgICAgICBpZiAoUHlfVmVyYm9zZUZsYWcpCisgICAgICAgICAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoIiMgcmVzdG9yZSBzeXMuJXNcbiIsICpwKTsKKyAgICAgICAgICAgIHYgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhkaWN0LCAqKHArMSkpOworICAgICAgICAgICAgaWYgKHYgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICB2ID0gUHlfTm9uZTsKKyAgICAgICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsICpwLCB2KTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qIEZpcnN0LCBkZWxldGUgX19tYWluX18gKi8KLQl2YWx1ZSA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKG1vZHVsZXMsICJfX21haW5fXyIpOwotCWlmICh2YWx1ZSAhPSBOVUxMICYmIFB5TW9kdWxlX0NoZWNrKHZhbHVlKSkgewotCQlpZiAoUHlfVmVyYm9zZUZsYWcpCi0JCQlQeVN5c19Xcml0ZVN0ZGVycigiIyBjbGVhbnVwIF9fbWFpbl9fXG4iKTsKLQkJX1B5TW9kdWxlX0NsZWFyKHZhbHVlKTsKLQkJUHlEaWN0X1NldEl0ZW1TdHJpbmcobW9kdWxlcywgIl9fbWFpbl9fIiwgUHlfTm9uZSk7Ci0JfQorICAgIC8qIEZpcnN0LCBkZWxldGUgX19tYWluX18gKi8KKyAgICB2YWx1ZSA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKG1vZHVsZXMsICJfX21haW5fXyIpOworICAgIGlmICh2YWx1ZSAhPSBOVUxMICYmIFB5TW9kdWxlX0NoZWNrKHZhbHVlKSkgeworICAgICAgICBpZiAoUHlfVmVyYm9zZUZsYWcpCisgICAgICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigiIyBjbGVhbnVwIF9fbWFpbl9fXG4iKTsKKyAgICAgICAgX1B5TW9kdWxlX0NsZWFyKHZhbHVlKTsKKyAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcobW9kdWxlcywgIl9fbWFpbl9fIiwgUHlfTm9uZSk7CisgICAgfQogCi0JLyogVGhlIHNwZWNpYWwgdHJlYXRtZW50IG9mIF9fYnVpbHRpbl9fIGhlcmUgaXMgYmVjYXVzZSBldmVuCi0JICAgd2hlbiBpdCdzIG5vdCByZWZlcmVuY2VkIGFzIGEgbW9kdWxlLCBpdHMgZGljdGlvbmFyeSBpcwotCSAgIHJlZmVyZW5jZWQgYnkgYWxtb3N0IGV2ZXJ5IG1vZHVsZSdzIF9fYnVpbHRpbnNfXy4gIFNpbmNlCi0JICAgZGVsZXRpbmcgYSBtb2R1bGUgY2xlYXJzIGl0cyBkaWN0aW9uYXJ5IChldmVuIGlmIHRoZXJlIGFyZQotCSAgIHJlZmVyZW5jZXMgbGVmdCB0byBpdCksIHdlIG5lZWQgdG8gZGVsZXRlIHRoZSBfX2J1aWx0aW5fXwotCSAgIG1vZHVsZSBsYXN0LiAgTGlrZXdpc2UsIHdlIGRvbid0IGRlbGV0ZSBzeXMgdW50aWwgdGhlIHZlcnkKLQkgICBlbmQgYmVjYXVzZSBpdCBpcyBpbXBsaWNpdGx5IHJlZmVyZW5jZWQgKGUuZy4gYnkgcHJpbnQpLgorICAgIC8qIFRoZSBzcGVjaWFsIHRyZWF0bWVudCBvZiBfX2J1aWx0aW5fXyBoZXJlIGlzIGJlY2F1c2UgZXZlbgorICAgICAgIHdoZW4gaXQncyBub3QgcmVmZXJlbmNlZCBhcyBhIG1vZHVsZSwgaXRzIGRpY3Rpb25hcnkgaXMKKyAgICAgICByZWZlcmVuY2VkIGJ5IGFsbW9zdCBldmVyeSBtb2R1bGUncyBfX2J1aWx0aW5zX18uICBTaW5jZQorICAgICAgIGRlbGV0aW5nIGEgbW9kdWxlIGNsZWFycyBpdHMgZGljdGlvbmFyeSAoZXZlbiBpZiB0aGVyZSBhcmUKKyAgICAgICByZWZlcmVuY2VzIGxlZnQgdG8gaXQpLCB3ZSBuZWVkIHRvIGRlbGV0ZSB0aGUgX19idWlsdGluX18KKyAgICAgICBtb2R1bGUgbGFzdC4gIExpa2V3aXNlLCB3ZSBkb24ndCBkZWxldGUgc3lzIHVudGlsIHRoZSB2ZXJ5CisgICAgICAgZW5kIGJlY2F1c2UgaXQgaXMgaW1wbGljaXRseSByZWZlcmVuY2VkIChlLmcuIGJ5IHByaW50KS4KIAotCSAgIEFsc28gbm90ZSB0aGF0IHdlICdkZWxldGUnIG1vZHVsZXMgYnkgcmVwbGFjaW5nIHRoZWlyIGVudHJ5Ci0JICAgaW4gdGhlIG1vZHVsZXMgZGljdCB3aXRoIE5vbmUsIHJhdGhlciB0aGFuIHJlYWxseSBkZWxldGluZwotCSAgIHRoZW07IHRoaXMgYXZvaWRzIGEgcmVoYXNoIG9mIHRoZSBtb2R1bGVzIGRpY3Rpb25hcnkgYW5kCi0JICAgYWxzbyBtYXJrcyB0aGVtIGFzICJub24gZXhpc3RlbnQiIHNvIHRoZXkgd29uJ3QgYmUKLQkgICByZS1pbXBvcnRlZC4gKi8KKyAgICAgICBBbHNvIG5vdGUgdGhhdCB3ZSAnZGVsZXRlJyBtb2R1bGVzIGJ5IHJlcGxhY2luZyB0aGVpciBlbnRyeQorICAgICAgIGluIHRoZSBtb2R1bGVzIGRpY3Qgd2l0aCBOb25lLCByYXRoZXIgdGhhbiByZWFsbHkgZGVsZXRpbmcKKyAgICAgICB0aGVtOyB0aGlzIGF2b2lkcyBhIHJlaGFzaCBvZiB0aGUgbW9kdWxlcyBkaWN0aW9uYXJ5IGFuZAorICAgICAgIGFsc28gbWFya3MgdGhlbSBhcyAibm9uIGV4aXN0ZW50IiBzbyB0aGV5IHdvbid0IGJlCisgICAgICAgcmUtaW1wb3J0ZWQuICovCiAKLQkvKiBOZXh0LCByZXBlYXRlZGx5IGRlbGV0ZSBtb2R1bGVzIHdpdGggYSByZWZlcmVuY2UgY291bnQgb2YKLQkgICBvbmUgKHNraXBwaW5nIF9fYnVpbHRpbl9fIGFuZCBzeXMpIGFuZCBkZWxldGUgdGhlbSAqLwotCWRvIHsKLQkJbmRvbmUgPSAwOwotCQlwb3MgPSAwOwotCQl3aGlsZSAoUHlEaWN0X05leHQobW9kdWxlcywgJnBvcywgJmtleSwgJnZhbHVlKSkgewotCQkJaWYgKHZhbHVlLT5vYl9yZWZjbnQgIT0gMSkKLQkJCQljb250aW51ZTsKLQkJCWlmIChQeVN0cmluZ19DaGVjayhrZXkpICYmIFB5TW9kdWxlX0NoZWNrKHZhbHVlKSkgewotCQkJCW5hbWUgPSBQeVN0cmluZ19BU19TVFJJTkcoa2V5KTsKLQkJCQlpZiAoc3RyY21wKG5hbWUsICJfX2J1aWx0aW5fXyIpID09IDApCi0JCQkJCWNvbnRpbnVlOwotCQkJCWlmIChzdHJjbXAobmFtZSwgInN5cyIpID09IDApCi0JCQkJCWNvbnRpbnVlOwotCQkJCWlmIChQeV9WZXJib3NlRmxhZykKLQkJCQkJUHlTeXNfV3JpdGVTdGRlcnIoCi0JCQkJCQkiIyBjbGVhbnVwWzFdICVzXG4iLCBuYW1lKTsKLQkJCQlfUHlNb2R1bGVfQ2xlYXIodmFsdWUpOwotCQkJCVB5RGljdF9TZXRJdGVtKG1vZHVsZXMsIGtleSwgUHlfTm9uZSk7Ci0JCQkJbmRvbmUrKzsKLQkJCX0KLQkJfQotCX0gd2hpbGUgKG5kb25lID4gMCk7CisgICAgLyogTmV4dCwgcmVwZWF0ZWRseSBkZWxldGUgbW9kdWxlcyB3aXRoIGEgcmVmZXJlbmNlIGNvdW50IG9mCisgICAgICAgb25lIChza2lwcGluZyBfX2J1aWx0aW5fXyBhbmQgc3lzKSBhbmQgZGVsZXRlIHRoZW0gKi8KKyAgICBkbyB7CisgICAgICAgIG5kb25lID0gMDsKKyAgICAgICAgcG9zID0gMDsKKyAgICAgICAgd2hpbGUgKFB5RGljdF9OZXh0KG1vZHVsZXMsICZwb3MsICZrZXksICZ2YWx1ZSkpIHsKKyAgICAgICAgICAgIGlmICh2YWx1ZS0+b2JfcmVmY250ICE9IDEpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBpZiAoUHlTdHJpbmdfQ2hlY2soa2V5KSAmJiBQeU1vZHVsZV9DaGVjayh2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICBuYW1lID0gUHlTdHJpbmdfQVNfU1RSSU5HKGtleSk7CisgICAgICAgICAgICAgICAgaWYgKHN0cmNtcChuYW1lLCAiX19idWlsdGluX18iKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBpZiAoc3RyY21wKG5hbWUsICJzeXMiKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBpZiAoUHlfVmVyYm9zZUZsYWcpCisgICAgICAgICAgICAgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKAorICAgICAgICAgICAgICAgICAgICAgICAgIiMgY2xlYW51cFsxXSAlc1xuIiwgbmFtZSk7CisgICAgICAgICAgICAgICAgX1B5TW9kdWxlX0NsZWFyKHZhbHVlKTsKKyAgICAgICAgICAgICAgICBQeURpY3RfU2V0SXRlbShtb2R1bGVzLCBrZXksIFB5X05vbmUpOworICAgICAgICAgICAgICAgIG5kb25lKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IHdoaWxlIChuZG9uZSA+IDApOwogCi0JLyogTmV4dCwgZGVsZXRlIGFsbCBtb2R1bGVzIChzdGlsbCBza2lwcGluZyBfX2J1aWx0aW5fXyBhbmQgc3lzKSAqLwotCXBvcyA9IDA7Ci0Jd2hpbGUgKFB5RGljdF9OZXh0KG1vZHVsZXMsICZwb3MsICZrZXksICZ2YWx1ZSkpIHsKLQkJaWYgKFB5U3RyaW5nX0NoZWNrKGtleSkgJiYgUHlNb2R1bGVfQ2hlY2sodmFsdWUpKSB7Ci0JCQluYW1lID0gUHlTdHJpbmdfQVNfU1RSSU5HKGtleSk7Ci0JCQlpZiAoc3RyY21wKG5hbWUsICJfX2J1aWx0aW5fXyIpID09IDApCi0JCQkJY29udGludWU7Ci0JCQlpZiAoc3RyY21wKG5hbWUsICJzeXMiKSA9PSAwKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKFB5X1ZlcmJvc2VGbGFnKQotCQkJCVB5U3lzX1dyaXRlU3RkZXJyKCIjIGNsZWFudXBbMl0gJXNcbiIsIG5hbWUpOwotCQkJX1B5TW9kdWxlX0NsZWFyKHZhbHVlKTsKLQkJCVB5RGljdF9TZXRJdGVtKG1vZHVsZXMsIGtleSwgUHlfTm9uZSk7Ci0JCX0KLQl9CisgICAgLyogTmV4dCwgZGVsZXRlIGFsbCBtb2R1bGVzIChzdGlsbCBza2lwcGluZyBfX2J1aWx0aW5fXyBhbmQgc3lzKSAqLworICAgIHBvcyA9IDA7CisgICAgd2hpbGUgKFB5RGljdF9OZXh0KG1vZHVsZXMsICZwb3MsICZrZXksICZ2YWx1ZSkpIHsKKyAgICAgICAgaWYgKFB5U3RyaW5nX0NoZWNrKGtleSkgJiYgUHlNb2R1bGVfQ2hlY2sodmFsdWUpKSB7CisgICAgICAgICAgICBuYW1lID0gUHlTdHJpbmdfQVNfU1RSSU5HKGtleSk7CisgICAgICAgICAgICBpZiAoc3RyY21wKG5hbWUsICJfX2J1aWx0aW5fXyIpID09IDApCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBpZiAoc3RyY21wKG5hbWUsICJzeXMiKSA9PSAwKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgaWYgKFB5X1ZlcmJvc2VGbGFnKQorICAgICAgICAgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCIjIGNsZWFudXBbMl0gJXNcbiIsIG5hbWUpOworICAgICAgICAgICAgX1B5TW9kdWxlX0NsZWFyKHZhbHVlKTsKKyAgICAgICAgICAgIFB5RGljdF9TZXRJdGVtKG1vZHVsZXMsIGtleSwgUHlfTm9uZSk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKiBOZXh0LCBkZWxldGUgc3lzIGFuZCBfX2J1aWx0aW5fXyAoaW4gdGhhdCBvcmRlcikgKi8KLQl2YWx1ZSA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKG1vZHVsZXMsICJzeXMiKTsKLQlpZiAodmFsdWUgIT0gTlVMTCAmJiBQeU1vZHVsZV9DaGVjayh2YWx1ZSkpIHsKLQkJaWYgKFB5X1ZlcmJvc2VGbGFnKQotCQkJUHlTeXNfV3JpdGVTdGRlcnIoIiMgY2xlYW51cCBzeXNcbiIpOwotCQlfUHlNb2R1bGVfQ2xlYXIodmFsdWUpOwotCQlQeURpY3RfU2V0SXRlbVN0cmluZyhtb2R1bGVzLCAic3lzIiwgUHlfTm9uZSk7Ci0JfQotCXZhbHVlID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcobW9kdWxlcywgIl9fYnVpbHRpbl9fIik7Ci0JaWYgKHZhbHVlICE9IE5VTEwgJiYgUHlNb2R1bGVfQ2hlY2sodmFsdWUpKSB7Ci0JCWlmIChQeV9WZXJib3NlRmxhZykKLQkJCVB5U3lzX1dyaXRlU3RkZXJyKCIjIGNsZWFudXAgX19idWlsdGluX19cbiIpOwotCQlfUHlNb2R1bGVfQ2xlYXIodmFsdWUpOwotCQlQeURpY3RfU2V0SXRlbVN0cmluZyhtb2R1bGVzLCAiX19idWlsdGluX18iLCBQeV9Ob25lKTsKLQl9CisgICAgLyogTmV4dCwgZGVsZXRlIHN5cyBhbmQgX19idWlsdGluX18gKGluIHRoYXQgb3JkZXIpICovCisgICAgdmFsdWUgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhtb2R1bGVzLCAic3lzIik7CisgICAgaWYgKHZhbHVlICE9IE5VTEwgJiYgUHlNb2R1bGVfQ2hlY2sodmFsdWUpKSB7CisgICAgICAgIGlmIChQeV9WZXJib3NlRmxhZykKKyAgICAgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCIjIGNsZWFudXAgc3lzXG4iKTsKKyAgICAgICAgX1B5TW9kdWxlX0NsZWFyKHZhbHVlKTsKKyAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcobW9kdWxlcywgInN5cyIsIFB5X05vbmUpOworICAgIH0KKyAgICB2YWx1ZSA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKG1vZHVsZXMsICJfX2J1aWx0aW5fXyIpOworICAgIGlmICh2YWx1ZSAhPSBOVUxMICYmIFB5TW9kdWxlX0NoZWNrKHZhbHVlKSkgeworICAgICAgICBpZiAoUHlfVmVyYm9zZUZsYWcpCisgICAgICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigiIyBjbGVhbnVwIF9fYnVpbHRpbl9fXG4iKTsKKyAgICAgICAgX1B5TW9kdWxlX0NsZWFyKHZhbHVlKTsKKyAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcobW9kdWxlcywgIl9fYnVpbHRpbl9fIiwgUHlfTm9uZSk7CisgICAgfQogCi0JLyogRmluYWxseSwgY2xlYXIgYW5kIGRlbGV0ZSB0aGUgbW9kdWxlcyBkaXJlY3RvcnkgKi8KLQlQeURpY3RfQ2xlYXIobW9kdWxlcyk7Ci0JaW50ZXJwLT5tb2R1bGVzID0gTlVMTDsKLQlQeV9ERUNSRUYobW9kdWxlcyk7Ci0JUHlfQ0xFQVIoaW50ZXJwLT5tb2R1bGVzX3JlbG9hZGluZyk7CisgICAgLyogRmluYWxseSwgY2xlYXIgYW5kIGRlbGV0ZSB0aGUgbW9kdWxlcyBkaXJlY3RvcnkgKi8KKyAgICBQeURpY3RfQ2xlYXIobW9kdWxlcyk7CisgICAgaW50ZXJwLT5tb2R1bGVzID0gTlVMTDsKKyAgICBQeV9ERUNSRUYobW9kdWxlcyk7CisgICAgUHlfQ0xFQVIoaW50ZXJwLT5tb2R1bGVzX3JlbG9hZGluZyk7CiB9CiAKIApAQCAtNTI1LDcgKzUyNSw3IEBACiBsb25nCiBQeUltcG9ydF9HZXRNYWdpY051bWJlcih2b2lkKQogewotCXJldHVybiBweWNfbWFnaWM7CisgICAgcmV0dXJuIHB5Y19tYWdpYzsKIH0KIAogCkBAIC01NDIsNTEgKzU0Miw1MSBAQAogUHlPYmplY3QgKgogX1B5SW1wb3J0X0ZpeHVwRXh0ZW5zaW9uKGNoYXIgKm5hbWUsIGNoYXIgKmZpbGVuYW1lKQogewotCVB5T2JqZWN0ICptb2R1bGVzLCAqbW9kLCAqZGljdCwgKmNvcHk7Ci0JaWYgKGV4dGVuc2lvbnMgPT0gTlVMTCkgewotCQlleHRlbnNpb25zID0gUHlEaWN0X05ldygpOwotCQlpZiAoZXh0ZW5zaW9ucyA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCW1vZHVsZXMgPSBQeUltcG9ydF9HZXRNb2R1bGVEaWN0KCk7Ci0JbW9kID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcobW9kdWxlcywgbmFtZSk7Ci0JaWYgKG1vZCA9PSBOVUxMIHx8ICFQeU1vZHVsZV9DaGVjayhtb2QpKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19TeXN0ZW1FcnJvciwKLQkJICAiX1B5SW1wb3J0X0ZpeHVwRXh0ZW5zaW9uOiBtb2R1bGUgJS4yMDBzIG5vdCBsb2FkZWQiLCBuYW1lKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWRpY3QgPSBQeU1vZHVsZV9HZXREaWN0KG1vZCk7Ci0JaWYgKGRpY3QgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JY29weSA9IFB5RGljdF9Db3B5KGRpY3QpOwotCWlmIChjb3B5ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKGV4dGVuc2lvbnMsIGZpbGVuYW1lLCBjb3B5KTsKLQlQeV9ERUNSRUYoY29weSk7Ci0JcmV0dXJuIGNvcHk7CisgICAgUHlPYmplY3QgKm1vZHVsZXMsICptb2QsICpkaWN0LCAqY29weTsKKyAgICBpZiAoZXh0ZW5zaW9ucyA9PSBOVUxMKSB7CisgICAgICAgIGV4dGVuc2lvbnMgPSBQeURpY3RfTmV3KCk7CisgICAgICAgIGlmIChleHRlbnNpb25zID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgbW9kdWxlcyA9IFB5SW1wb3J0X0dldE1vZHVsZURpY3QoKTsKKyAgICBtb2QgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhtb2R1bGVzLCBuYW1lKTsKKyAgICBpZiAobW9kID09IE5VTEwgfHwgIVB5TW9kdWxlX0NoZWNrKG1vZCkpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICJfUHlJbXBvcnRfRml4dXBFeHRlbnNpb246IG1vZHVsZSAlLjIwMHMgbm90IGxvYWRlZCIsIG5hbWUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZGljdCA9IFB5TW9kdWxlX0dldERpY3QobW9kKTsKKyAgICBpZiAoZGljdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBjb3B5ID0gUHlEaWN0X0NvcHkoZGljdCk7CisgICAgaWYgKGNvcHkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZXh0ZW5zaW9ucywgZmlsZW5hbWUsIGNvcHkpOworICAgIFB5X0RFQ1JFRihjb3B5KTsKKyAgICByZXR1cm4gY29weTsKIH0KIAogUHlPYmplY3QgKgogX1B5SW1wb3J0X0ZpbmRFeHRlbnNpb24oY2hhciAqbmFtZSwgY2hhciAqZmlsZW5hbWUpCiB7Ci0JUHlPYmplY3QgKmRpY3QsICptb2QsICptZGljdDsKLQlpZiAoZXh0ZW5zaW9ucyA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlkaWN0ID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoZXh0ZW5zaW9ucywgZmlsZW5hbWUpOwotCWlmIChkaWN0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCW1vZCA9IFB5SW1wb3J0X0FkZE1vZHVsZShuYW1lKTsKLQlpZiAobW9kID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCW1kaWN0ID0gUHlNb2R1bGVfR2V0RGljdChtb2QpOwotCWlmIChtZGljdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoUHlEaWN0X1VwZGF0ZShtZGljdCwgZGljdCkpCi0JCXJldHVybiBOVUxMOwotCWlmIChQeV9WZXJib3NlRmxhZykKLQkJUHlTeXNfV3JpdGVTdGRlcnIoImltcG9ydCAlcyAjIHByZXZpb3VzbHkgbG9hZGVkICglcylcbiIsCi0JCQluYW1lLCBmaWxlbmFtZSk7Ci0JcmV0dXJuIG1vZDsKKyAgICBQeU9iamVjdCAqZGljdCwgKm1vZCwgKm1kaWN0OworICAgIGlmIChleHRlbnNpb25zID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGRpY3QgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhleHRlbnNpb25zLCBmaWxlbmFtZSk7CisgICAgaWYgKGRpY3QgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbW9kID0gUHlJbXBvcnRfQWRkTW9kdWxlKG5hbWUpOworICAgIGlmIChtb2QgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbWRpY3QgPSBQeU1vZHVsZV9HZXREaWN0KG1vZCk7CisgICAgaWYgKG1kaWN0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChQeURpY3RfVXBkYXRlKG1kaWN0LCBkaWN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKFB5X1ZlcmJvc2VGbGFnKQorICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigiaW1wb3J0ICVzICMgcHJldmlvdXNseSBsb2FkZWQgKCVzKVxuIiwKKyAgICAgICAgICAgIG5hbWUsIGZpbGVuYW1lKTsKKyAgICByZXR1cm4gbW9kOwogfQogCiAKQEAgLTU5OSwzNCArNTk5LDM0IEBACiBQeU9iamVjdCAqCiBQeUltcG9ydF9BZGRNb2R1bGUoY29uc3QgY2hhciAqbmFtZSkKIHsKLQlQeU9iamVjdCAqbW9kdWxlcyA9IFB5SW1wb3J0X0dldE1vZHVsZURpY3QoKTsKLQlQeU9iamVjdCAqbTsKKyAgICBQeU9iamVjdCAqbW9kdWxlcyA9IFB5SW1wb3J0X0dldE1vZHVsZURpY3QoKTsKKyAgICBQeU9iamVjdCAqbTsKIAotCWlmICgobSA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKG1vZHVsZXMsIG5hbWUpKSAhPSBOVUxMICYmCi0JICAgIFB5TW9kdWxlX0NoZWNrKG0pKQotCQlyZXR1cm4gbTsKLQltID0gUHlNb2R1bGVfTmV3KG5hbWUpOwotCWlmIChtID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhtb2R1bGVzLCBuYW1lLCBtKSAhPSAwKSB7Ci0JCVB5X0RFQ1JFRihtKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5X0RFQ1JFRihtKTsgLyogWWVzLCBpdCBzdGlsbCBleGlzdHMsIGluIG1vZHVsZXMhICovCisgICAgaWYgKChtID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcobW9kdWxlcywgbmFtZSkpICE9IE5VTEwgJiYKKyAgICAgICAgUHlNb2R1bGVfQ2hlY2sobSkpCisgICAgICAgIHJldHVybiBtOworICAgIG0gPSBQeU1vZHVsZV9OZXcobmFtZSk7CisgICAgaWYgKG0gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKG1vZHVsZXMsIG5hbWUsIG0pICE9IDApIHsKKyAgICAgICAgUHlfREVDUkVGKG0pOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlfREVDUkVGKG0pOyAvKiBZZXMsIGl0IHN0aWxsIGV4aXN0cywgaW4gbW9kdWxlcyEgKi8KIAotCXJldHVybiBtOworICAgIHJldHVybiBtOwogfQogCiAvKiBSZW1vdmUgbmFtZSBmcm9tIHN5cy5tb2R1bGVzLCBpZiBpdCdzIHRoZXJlLiAqLwogc3RhdGljIHZvaWQKIF9SZW1vdmVNb2R1bGUoY29uc3QgY2hhciAqbmFtZSkKIHsKLQlQeU9iamVjdCAqbW9kdWxlcyA9IFB5SW1wb3J0X0dldE1vZHVsZURpY3QoKTsKLQlpZiAoUHlEaWN0X0dldEl0ZW1TdHJpbmcobW9kdWxlcywgbmFtZSkgPT0gTlVMTCkKLQkJcmV0dXJuOwotCWlmIChQeURpY3RfRGVsSXRlbVN0cmluZyhtb2R1bGVzLCBuYW1lKSA8IDApCi0JCVB5X0ZhdGFsRXJyb3IoImltcG9ydDogIGRlbGV0aW5nIGV4aXN0aW5nIGtleSBpbiIKLQkJCSAgICAgICJzeXMubW9kdWxlcyBmYWlsZWQiKTsKKyAgICBQeU9iamVjdCAqbW9kdWxlcyA9IFB5SW1wb3J0X0dldE1vZHVsZURpY3QoKTsKKyAgICBpZiAoUHlEaWN0X0dldEl0ZW1TdHJpbmcobW9kdWxlcywgbmFtZSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOworICAgIGlmIChQeURpY3RfRGVsSXRlbVN0cmluZyhtb2R1bGVzLCBuYW1lKSA8IDApCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoImltcG9ydDogIGRlbGV0aW5nIGV4aXN0aW5nIGtleSBpbiIKKyAgICAgICAgICAgICAgICAgICAgICAic3lzLm1vZHVsZXMgZmFpbGVkIik7CiB9CiAKIC8qIEV4ZWN1dGUgYSBjb2RlIG9iamVjdCBpbiBhIG1vZHVsZSBhbmQgcmV0dXJuIHRoZSBtb2R1bGUgb2JqZWN0CkBAIC02MzksNjAgKzYzOSw2MCBAQAogUHlPYmplY3QgKgogUHlJbXBvcnRfRXhlY0NvZGVNb2R1bGUoY2hhciAqbmFtZSwgUHlPYmplY3QgKmNvKQogewotCXJldHVybiBQeUltcG9ydF9FeGVjQ29kZU1vZHVsZUV4KG5hbWUsIGNvLCAoY2hhciAqKU5VTEwpOworICAgIHJldHVybiBQeUltcG9ydF9FeGVjQ29kZU1vZHVsZUV4KG5hbWUsIGNvLCAoY2hhciAqKU5VTEwpOwogfQogCiBQeU9iamVjdCAqCiBQeUltcG9ydF9FeGVjQ29kZU1vZHVsZUV4KGNoYXIgKm5hbWUsIFB5T2JqZWN0ICpjbywgY2hhciAqcGF0aG5hbWUpCiB7Ci0JUHlPYmplY3QgKm1vZHVsZXMgPSBQeUltcG9ydF9HZXRNb2R1bGVEaWN0KCk7Ci0JUHlPYmplY3QgKm0sICpkLCAqdjsKKyAgICBQeU9iamVjdCAqbW9kdWxlcyA9IFB5SW1wb3J0X0dldE1vZHVsZURpY3QoKTsKKyAgICBQeU9iamVjdCAqbSwgKmQsICp2OwogCi0JbSA9IFB5SW1wb3J0X0FkZE1vZHVsZShuYW1lKTsKLQlpZiAobSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQkvKiBJZiB0aGUgbW9kdWxlIGlzIGJlaW5nIHJlbG9hZGVkLCB3ZSBnZXQgdGhlIG9sZCBtb2R1bGUgYmFjawotCSAgIGFuZCByZS11c2UgaXRzIGRpY3QgdG8gZXhlYyB0aGUgbmV3IGNvZGUuICovCi0JZCA9IFB5TW9kdWxlX0dldERpY3QobSk7Ci0JaWYgKFB5RGljdF9HZXRJdGVtU3RyaW5nKGQsICJfX2J1aWx0aW5zX18iKSA9PSBOVUxMKSB7Ci0JCWlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiX19idWlsdGluc19fIiwKLQkJCQkJIFB5RXZhbF9HZXRCdWlsdGlucygpKSAhPSAwKQotCQkJZ290byBlcnJvcjsKLQl9Ci0JLyogUmVtZW1iZXIgdGhlIGZpbGVuYW1lIGFzIHRoZSBfX2ZpbGVfXyBhdHRyaWJ1dGUgKi8KLQl2ID0gTlVMTDsKLQlpZiAocGF0aG5hbWUgIT0gTlVMTCkgewotCQl2ID0gUHlTdHJpbmdfRnJvbVN0cmluZyhwYXRobmFtZSk7Ci0JCWlmICh2ID09IE5VTEwpCi0JCQlQeUVycl9DbGVhcigpOwotCX0KLQlpZiAodiA9PSBOVUxMKSB7Ci0JCXYgPSAoKFB5Q29kZU9iamVjdCAqKWNvKS0+Y29fZmlsZW5hbWU7Ci0JCVB5X0lOQ1JFRih2KTsKLQl9Ci0JaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJfX2ZpbGVfXyIsIHYpICE9IDApCi0JCVB5RXJyX0NsZWFyKCk7IC8qIE5vdCBpbXBvcnRhbnQgZW5vdWdoIHRvIHJlcG9ydCAqLwotCVB5X0RFQ1JFRih2KTsKKyAgICBtID0gUHlJbXBvcnRfQWRkTW9kdWxlKG5hbWUpOworICAgIGlmIChtID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIC8qIElmIHRoZSBtb2R1bGUgaXMgYmVpbmcgcmVsb2FkZWQsIHdlIGdldCB0aGUgb2xkIG1vZHVsZSBiYWNrCisgICAgICAgYW5kIHJlLXVzZSBpdHMgZGljdCB0byBleGVjIHRoZSBuZXcgY29kZS4gKi8KKyAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICBpZiAoUHlEaWN0X0dldEl0ZW1TdHJpbmcoZCwgIl9fYnVpbHRpbnNfXyIpID09IE5VTEwpIHsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJfX2J1aWx0aW5zX18iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlFdmFsX0dldEJ1aWx0aW5zKCkpICE9IDApCisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgICAvKiBSZW1lbWJlciB0aGUgZmlsZW5hbWUgYXMgdGhlIF9fZmlsZV9fIGF0dHJpYnV0ZSAqLworICAgIHYgPSBOVUxMOworICAgIGlmIChwYXRobmFtZSAhPSBOVUxMKSB7CisgICAgICAgIHYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKHBhdGhuYW1lKTsKKyAgICAgICAgaWYgKHYgPT0gTlVMTCkKKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgfQorICAgIGlmICh2ID09IE5VTEwpIHsKKyAgICAgICAgdiA9ICgoUHlDb2RlT2JqZWN0ICopY28pLT5jb19maWxlbmFtZTsKKyAgICAgICAgUHlfSU5DUkVGKHYpOworICAgIH0KKyAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIl9fZmlsZV9fIiwgdikgIT0gMCkKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsgLyogTm90IGltcG9ydGFudCBlbm91Z2ggdG8gcmVwb3J0ICovCisgICAgUHlfREVDUkVGKHYpOwogCi0JdiA9IFB5RXZhbF9FdmFsQ29kZSgoUHlDb2RlT2JqZWN0ICopY28sIGQsIGQpOwotCWlmICh2ID09IE5VTEwpCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHYpOworICAgIHYgPSBQeUV2YWxfRXZhbENvZGUoKFB5Q29kZU9iamVjdCAqKWNvLCBkLCBkKTsKKyAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih2KTsKIAotCWlmICgobSA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKG1vZHVsZXMsIG5hbWUpKSA9PSBOVUxMKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19JbXBvcnRFcnJvciwKLQkJCSAgICAgIkxvYWRlZCBtb2R1bGUgJS4yMDBzIG5vdCBmb3VuZCBpbiBzeXMubW9kdWxlcyIsCi0JCQkgICAgIG5hbWUpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKChtID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcobW9kdWxlcywgbmFtZSkpID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX0ltcG9ydEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIkxvYWRlZCBtb2R1bGUgJS4yMDBzIG5vdCBmb3VuZCBpbiBzeXMubW9kdWxlcyIsCisgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JUHlfSU5DUkVGKG0pOworICAgIFB5X0lOQ1JFRihtKTsKIAotCXJldHVybiBtOworICAgIHJldHVybiBtOwogCiAgIGVycm9yOgotCV9SZW1vdmVNb2R1bGUobmFtZSk7Ci0JcmV0dXJuIE5VTEw7CisgICAgX1JlbW92ZU1vZHVsZShuYW1lKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogCkBAIC03MDQsMjEgKzcwNCwyMSBAQAogc3RhdGljIGNoYXIgKgogbWFrZV9jb21waWxlZF9wYXRobmFtZShjaGFyICpwYXRobmFtZSwgY2hhciAqYnVmLCBzaXplX3QgYnVmbGVuKQogewotCXNpemVfdCBsZW4gPSBzdHJsZW4ocGF0aG5hbWUpOwotCWlmIChsZW4rMiA+IGJ1ZmxlbikKLQkJcmV0dXJuIE5VTEw7CisgICAgc2l6ZV90IGxlbiA9IHN0cmxlbihwYXRobmFtZSk7CisgICAgaWYgKGxlbisyID4gYnVmbGVuKQorICAgICAgICByZXR1cm4gTlVMTDsKIAogI2lmZGVmIE1TX1dJTkRPV1MKLQkvKiBUcmVhdCAucHl3IGFzIGlmIGl0IHdlcmUgLnB5LiAgVGhlIGNhc2Ugb2YgIi5weXciIG11c3QgbWF0Y2gKLQkgICB0aGF0IHVzZWQgaW4gX1B5SW1wb3J0X1N0YW5kYXJkRmlsZXRhYi4gKi8KLQlpZiAobGVuID49IDQgJiYgc3RyY21wKCZwYXRobmFtZVtsZW4tNF0sICIucHl3IikgPT0gMCkKLQkJLS1sZW47CS8qIHByZXRlbmQgJ3cnIGlzbid0IHRoZXJlICovCisgICAgLyogVHJlYXQgLnB5dyBhcyBpZiBpdCB3ZXJlIC5weS4gIFRoZSBjYXNlIG9mICIucHl3IiBtdXN0IG1hdGNoCisgICAgICAgdGhhdCB1c2VkIGluIF9QeUltcG9ydF9TdGFuZGFyZEZpbGV0YWIuICovCisgICAgaWYgKGxlbiA+PSA0ICYmIHN0cmNtcCgmcGF0aG5hbWVbbGVuLTRdLCAiLnB5dyIpID09IDApCisgICAgICAgIC0tbGVuOyAgICAgICAgICAvKiBwcmV0ZW5kICd3JyBpc24ndCB0aGVyZSAqLwogI2VuZGlmCi0JbWVtY3B5KGJ1ZiwgcGF0aG5hbWUsIGxlbik7Ci0JYnVmW2xlbl0gPSBQeV9PcHRpbWl6ZUZsYWcgPyAnbycgOiAnYyc7Ci0JYnVmW2xlbisxXSA9ICdcMCc7CisgICAgbWVtY3B5KGJ1ZiwgcGF0aG5hbWUsIGxlbik7CisgICAgYnVmW2xlbl0gPSBQeV9PcHRpbWl6ZUZsYWcgPyAnbycgOiAnYyc7CisgICAgYnVmW2xlbisxXSA9ICdcMCc7CiAKLQlyZXR1cm4gYnVmOworICAgIHJldHVybiBidWY7CiB9CiAKIApAQCAtNzMyLDMwICs3MzIsMzAgQEAKIHN0YXRpYyBGSUxFICoKIGNoZWNrX2NvbXBpbGVkX21vZHVsZShjaGFyICpwYXRobmFtZSwgdGltZV90IG10aW1lLCBjaGFyICpjcGF0aG5hbWUpCiB7Ci0JRklMRSAqZnA7Ci0JbG9uZyBtYWdpYzsKLQlsb25nIHB5Y19tdGltZTsKKyAgICBGSUxFICpmcDsKKyAgICBsb25nIG1hZ2ljOworICAgIGxvbmcgcHljX210aW1lOwogCi0JZnAgPSBmb3BlbihjcGF0aG5hbWUsICJyYiIpOwotCWlmIChmcCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQltYWdpYyA9IFB5TWFyc2hhbF9SZWFkTG9uZ0Zyb21GaWxlKGZwKTsKLQlpZiAobWFnaWMgIT0gcHljX21hZ2ljKSB7Ci0JCWlmIChQeV9WZXJib3NlRmxhZykKLQkJCVB5U3lzX1dyaXRlU3RkZXJyKCIjICVzIGhhcyBiYWQgbWFnaWNcbiIsIGNwYXRobmFtZSk7Ci0JCWZjbG9zZShmcCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlweWNfbXRpbWUgPSBQeU1hcnNoYWxfUmVhZExvbmdGcm9tRmlsZShmcCk7Ci0JaWYgKHB5Y19tdGltZSAhPSBtdGltZSkgewotCQlpZiAoUHlfVmVyYm9zZUZsYWcpCi0JCQlQeVN5c19Xcml0ZVN0ZGVycigiIyAlcyBoYXMgYmFkIG10aW1lXG4iLCBjcGF0aG5hbWUpOwotCQlmY2xvc2UoZnApOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKFB5X1ZlcmJvc2VGbGFnKQotCQlQeVN5c19Xcml0ZVN0ZGVycigiIyAlcyBtYXRjaGVzICVzXG4iLCBjcGF0aG5hbWUsIHBhdGhuYW1lKTsKLQlyZXR1cm4gZnA7CisgICAgZnAgPSBmb3BlbihjcGF0aG5hbWUsICJyYiIpOworICAgIGlmIChmcCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBtYWdpYyA9IFB5TWFyc2hhbF9SZWFkTG9uZ0Zyb21GaWxlKGZwKTsKKyAgICBpZiAobWFnaWMgIT0gcHljX21hZ2ljKSB7CisgICAgICAgIGlmIChQeV9WZXJib3NlRmxhZykKKyAgICAgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCIjICVzIGhhcyBiYWQgbWFnaWNcbiIsIGNwYXRobmFtZSk7CisgICAgICAgIGZjbG9zZShmcCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBweWNfbXRpbWUgPSBQeU1hcnNoYWxfUmVhZExvbmdGcm9tRmlsZShmcCk7CisgICAgaWYgKHB5Y19tdGltZSAhPSBtdGltZSkgeworICAgICAgICBpZiAoUHlfVmVyYm9zZUZsYWcpCisgICAgICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigiIyAlcyBoYXMgYmFkIG10aW1lXG4iLCBjcGF0aG5hbWUpOworICAgICAgICBmY2xvc2UoZnApOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKFB5X1ZlcmJvc2VGbGFnKQorICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigiIyAlcyBtYXRjaGVzICVzXG4iLCBjcGF0aG5hbWUsIHBhdGhuYW1lKTsKKyAgICByZXR1cm4gZnA7CiB9CiAKIApAQCAtNzY0LDE4ICs3NjQsMTggQEAKIHN0YXRpYyBQeUNvZGVPYmplY3QgKgogcmVhZF9jb21waWxlZF9tb2R1bGUoY2hhciAqY3BhdGhuYW1lLCBGSUxFICpmcCkKIHsKLQlQeU9iamVjdCAqY287CisgICAgUHlPYmplY3QgKmNvOwogCi0JY28gPSBQeU1hcnNoYWxfUmVhZExhc3RPYmplY3RGcm9tRmlsZShmcCk7Ci0JaWYgKGNvID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWlmICghUHlDb2RlX0NoZWNrKGNvKSkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfSW1wb3J0RXJyb3IsCi0JCQkgICAgICJOb24tY29kZSBvYmplY3QgaW4gJS4yMDBzIiwgY3BhdGhuYW1lKTsKLQkJUHlfREVDUkVGKGNvKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiAoUHlDb2RlT2JqZWN0ICopY287CisgICAgY28gPSBQeU1hcnNoYWxfUmVhZExhc3RPYmplY3RGcm9tRmlsZShmcCk7CisgICAgaWYgKGNvID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHlDb2RlX0NoZWNrKGNvKSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfSW1wb3J0RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiTm9uLWNvZGUgb2JqZWN0IGluICUuMjAwcyIsIGNwYXRobmFtZSk7CisgICAgICAgIFB5X0RFQ1JFRihjbyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gKFB5Q29kZU9iamVjdCAqKWNvOwogfQogCiAKQEAgLTc4NSwyNyArNzg1LDI3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogbG9hZF9jb21waWxlZF9tb2R1bGUoY2hhciAqbmFtZSwgY2hhciAqY3BhdGhuYW1lLCBGSUxFICpmcCkKIHsKLQlsb25nIG1hZ2ljOwotCVB5Q29kZU9iamVjdCAqY287Ci0JUHlPYmplY3QgKm07CisgICAgbG9uZyBtYWdpYzsKKyAgICBQeUNvZGVPYmplY3QgKmNvOworICAgIFB5T2JqZWN0ICptOwogCi0JbWFnaWMgPSBQeU1hcnNoYWxfUmVhZExvbmdGcm9tRmlsZShmcCk7Ci0JaWYgKG1hZ2ljICE9IHB5Y19tYWdpYykgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfSW1wb3J0RXJyb3IsCi0JCQkgICAgICJCYWQgbWFnaWMgbnVtYmVyIGluICUuMjAwcyIsIGNwYXRobmFtZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQkodm9pZCkgUHlNYXJzaGFsX1JlYWRMb25nRnJvbUZpbGUoZnApOwotCWNvID0gcmVhZF9jb21waWxlZF9tb2R1bGUoY3BhdGhuYW1lLCBmcCk7Ci0JaWYgKGNvID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWlmIChQeV9WZXJib3NlRmxhZykKLQkJUHlTeXNfV3JpdGVTdGRlcnIoImltcG9ydCAlcyAjIHByZWNvbXBpbGVkIGZyb20gJXNcbiIsCi0JCQluYW1lLCBjcGF0aG5hbWUpOwotCW0gPSBQeUltcG9ydF9FeGVjQ29kZU1vZHVsZUV4KG5hbWUsIChQeU9iamVjdCAqKWNvLCBjcGF0aG5hbWUpOwotCVB5X0RFQ1JFRihjbyk7CisgICAgbWFnaWMgPSBQeU1hcnNoYWxfUmVhZExvbmdGcm9tRmlsZShmcCk7CisgICAgaWYgKG1hZ2ljICE9IHB5Y19tYWdpYykgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfSW1wb3J0RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiQmFkIG1hZ2ljIG51bWJlciBpbiAlLjIwMHMiLCBjcGF0aG5hbWUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgKHZvaWQpIFB5TWFyc2hhbF9SZWFkTG9uZ0Zyb21GaWxlKGZwKTsKKyAgICBjbyA9IHJlYWRfY29tcGlsZWRfbW9kdWxlKGNwYXRobmFtZSwgZnApOworICAgIGlmIChjbyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoUHlfVmVyYm9zZUZsYWcpCisgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCJpbXBvcnQgJXMgIyBwcmVjb21waWxlZCBmcm9tICVzXG4iLAorICAgICAgICAgICAgbmFtZSwgY3BhdGhuYW1lKTsKKyAgICBtID0gUHlJbXBvcnRfRXhlY0NvZGVNb2R1bGVFeChuYW1lLCAoUHlPYmplY3QgKiljbywgY3BhdGhuYW1lKTsKKyAgICBQeV9ERUNSRUYoY28pOwogCi0JcmV0dXJuIG07CisgICAgcmV0dXJuIG07CiB9CiAKIC8qIFBhcnNlIGEgc291cmNlIGZpbGUgYW5kIHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBjb2RlIG9iamVjdCAqLwpAQCAtODEzLDIyICs4MTMsMjIgQEAKIHN0YXRpYyBQeUNvZGVPYmplY3QgKgogcGFyc2Vfc291cmNlX21vZHVsZShjb25zdCBjaGFyICpwYXRobmFtZSwgRklMRSAqZnApCiB7Ci0JUHlDb2RlT2JqZWN0ICpjbyA9IE5VTEw7Ci0JbW9kX3R5IG1vZDsKLQlQeUNvbXBpbGVyRmxhZ3MgZmxhZ3M7Ci0JUHlBcmVuYSAqYXJlbmEgPSBQeUFyZW5hX05ldygpOwotCWlmIChhcmVuYSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBQeUNvZGVPYmplY3QgKmNvID0gTlVMTDsKKyAgICBtb2RfdHkgbW9kOworICAgIFB5Q29tcGlsZXJGbGFncyBmbGFnczsKKyAgICBQeUFyZW5hICphcmVuYSA9IFB5QXJlbmFfTmV3KCk7CisgICAgaWYgKGFyZW5hID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JZmxhZ3MuY2ZfZmxhZ3MgPSAwOworICAgIGZsYWdzLmNmX2ZsYWdzID0gMDsKIAotCW1vZCA9IFB5UGFyc2VyX0FTVEZyb21GaWxlKGZwLCBwYXRobmFtZSwgUHlfZmlsZV9pbnB1dCwgMCwgMCwgJmZsYWdzLCAKLQkJCQkgICBOVUxMLCBhcmVuYSk7Ci0JaWYgKG1vZCkgewotCQljbyA9IFB5QVNUX0NvbXBpbGUobW9kLCBwYXRobmFtZSwgTlVMTCwgYXJlbmEpOwotCX0KLQlQeUFyZW5hX0ZyZWUoYXJlbmEpOwotCXJldHVybiBjbzsKKyAgICBtb2QgPSBQeVBhcnNlcl9BU1RGcm9tRmlsZShmcCwgcGF0aG5hbWUsIFB5X2ZpbGVfaW5wdXQsIDAsIDAsICZmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBhcmVuYSk7CisgICAgaWYgKG1vZCkgeworICAgICAgICBjbyA9IFB5QVNUX0NvbXBpbGUobW9kLCBwYXRobmFtZSwgTlVMTCwgYXJlbmEpOworICAgIH0KKyAgICBQeUFyZW5hX0ZyZWUoYXJlbmEpOworICAgIHJldHVybiBjbzsKIH0KIAogCkBAIC04MzgsMzAgKzgzOCwzMCBAQAogb3Blbl9leGNsdXNpdmUoY2hhciAqZmlsZW5hbWUsIG1vZGVfdCBtb2RlKQogewogI2lmIGRlZmluZWQoT19FWENMKSYmZGVmaW5lZChPX0NSRUFUKSYmZGVmaW5lZChPX1dST05MWSkmJmRlZmluZWQoT19UUlVOQykKLQkvKiBVc2UgT19FWENMIHRvIGF2b2lkIGEgcmFjZSBjb25kaXRpb24gd2hlbiBhbm90aGVyIHByb2Nlc3MgdHJpZXMgdG8KLQkgICB3cml0ZSB0aGUgc2FtZSBmaWxlLiAgV2hlbiB0aGF0IGhhcHBlbnMsIG91ciBvcGVuKCkgY2FsbCBmYWlscywKLQkgICB3aGljaCBpcyBqdXN0IGZpbmUgKHNpbmNlIGl0J3Mgb25seSBhIGNhY2hlKS4KLQkgICBYWFggSWYgdGhlIGZpbGUgZXhpc3RzIGFuZCBpcyB3cml0YWJsZSBidXQgdGhlIGRpcmVjdG9yeSBpcyBub3QKLQkgICB3cml0YWJsZSwgdGhlIGZpbGUgd2lsbCBuZXZlciBiZSB3cml0dGVuLiAgT2ggd2VsbC4KLQkqLwotCWludCBmZDsKLQkodm9pZCkgdW5saW5rKGZpbGVuYW1lKTsKLQlmZCA9IG9wZW4oZmlsZW5hbWUsIE9fRVhDTHxPX0NSRUFUfE9fV1JPTkxZfE9fVFJVTkMKKyAgICAvKiBVc2UgT19FWENMIHRvIGF2b2lkIGEgcmFjZSBjb25kaXRpb24gd2hlbiBhbm90aGVyIHByb2Nlc3MgdHJpZXMgdG8KKyAgICAgICB3cml0ZSB0aGUgc2FtZSBmaWxlLiAgV2hlbiB0aGF0IGhhcHBlbnMsIG91ciBvcGVuKCkgY2FsbCBmYWlscywKKyAgICAgICB3aGljaCBpcyBqdXN0IGZpbmUgKHNpbmNlIGl0J3Mgb25seSBhIGNhY2hlKS4KKyAgICAgICBYWFggSWYgdGhlIGZpbGUgZXhpc3RzIGFuZCBpcyB3cml0YWJsZSBidXQgdGhlIGRpcmVjdG9yeSBpcyBub3QKKyAgICAgICB3cml0YWJsZSwgdGhlIGZpbGUgd2lsbCBuZXZlciBiZSB3cml0dGVuLiAgT2ggd2VsbC4KKyAgICAqLworICAgIGludCBmZDsKKyAgICAodm9pZCkgdW5saW5rKGZpbGVuYW1lKTsKKyAgICBmZCA9IG9wZW4oZmlsZW5hbWUsIE9fRVhDTHxPX0NSRUFUfE9fV1JPTkxZfE9fVFJVTkMKICNpZmRlZiBPX0JJTkFSWQotCQkJCXxPX0JJTkFSWSAgIC8qIG5lY2Vzc2FyeSBmb3IgV2luZG93cyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxPX0JJTkFSWSAgIC8qIG5lY2Vzc2FyeSBmb3IgV2luZG93cyAqLwogI2VuZGlmCiAjaWZkZWYgX19WTVMKLSAgICAgICAgICAgICAgICAgICAgICAgICwgbW9kZSwgImN0eHQ9YmluIiwgInNocj1uaWwiCisgICAgICAgICAgICAsIG1vZGUsICJjdHh0PWJpbiIsICJzaHI9bmlsIgogI2Vsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICwgbW9kZQorICAgICAgICAgICAgLCBtb2RlCiAjZW5kaWYKLQkJICApOwotCWlmIChmZCA8IDApCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBmZG9wZW4oZmQsICJ3YiIpOworICAgICAgICAgICk7CisgICAgaWYgKGZkIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIGZkb3BlbihmZCwgIndiIik7CiAjZWxzZQotCS8qIEJlc3Qgd2UgY2FuIGRvIC0tIG9uIFdpbmRvd3MgdGhpcyBjYW4ndCBoYXBwZW4gYW55d2F5ICovCi0JcmV0dXJuIGZvcGVuKGZpbGVuYW1lLCAid2IiKTsKKyAgICAvKiBCZXN0IHdlIGNhbiBkbyAtLSBvbiBXaW5kb3dzIHRoaXMgY2FuJ3QgaGFwcGVuIGFueXdheSAqLworICAgIHJldHVybiBmb3BlbihmaWxlbmFtZSwgIndiIik7CiAjZW5kaWYKIH0KIApAQCAtODc0LDg1ICs4NzQsODUgQEAKIHN0YXRpYyB2b2lkCiB3cml0ZV9jb21waWxlZF9tb2R1bGUoUHlDb2RlT2JqZWN0ICpjbywgY2hhciAqY3BhdGhuYW1lLCBzdHJ1Y3Qgc3RhdCAqc3Jjc3RhdCkKIHsKLQlGSUxFICpmcDsKLQl0aW1lX3QgbXRpbWUgPSBzcmNzdGF0LT5zdF9tdGltZTsKKyAgICBGSUxFICpmcDsKKyAgICB0aW1lX3QgbXRpbWUgPSBzcmNzdGF0LT5zdF9tdGltZTsKICNpZmRlZiBNU19XSU5ET1dTICAgLyogc2luY2UgV2luZG93cyB1c2VzIGRpZmZlcmVudCBwZXJtaXNzaW9ucyAgKi8KLQltb2RlX3QgbW9kZSA9IHNyY3N0YXQtPnN0X21vZGUgJiB+U19JRVhFQzsKKyAgICBtb2RlX3QgbW9kZSA9IHNyY3N0YXQtPnN0X21vZGUgJiB+U19JRVhFQzsKICNlbHNlCi0JbW9kZV90IG1vZGUgPSBzcmNzdGF0LT5zdF9tb2RlICYgflNfSVhVU1IgJiB+U19JWEdSUCAmIH5TX0lYT1RIOwotI2VuZGlmIAorICAgIG1vZGVfdCBtb2RlID0gc3Jjc3RhdC0+c3RfbW9kZSAmIH5TX0lYVVNSICYgflNfSVhHUlAgJiB+U19JWE9USDsKKyNlbmRpZgogCi0JZnAgPSBvcGVuX2V4Y2x1c2l2ZShjcGF0aG5hbWUsIG1vZGUpOwotCWlmIChmcCA9PSBOVUxMKSB7Ci0JCWlmIChQeV9WZXJib3NlRmxhZykKLQkJCVB5U3lzX1dyaXRlU3RkZXJyKAotCQkJCSIjIGNhbid0IGNyZWF0ZSAlc1xuIiwgY3BhdGhuYW1lKTsKLQkJcmV0dXJuOwotCX0KLQlQeU1hcnNoYWxfV3JpdGVMb25nVG9GaWxlKHB5Y19tYWdpYywgZnAsIFB5X01BUlNIQUxfVkVSU0lPTik7Ci0JLyogRmlyc3Qgd3JpdGUgYSAwIGZvciBtdGltZSAqLwotCVB5TWFyc2hhbF9Xcml0ZUxvbmdUb0ZpbGUoMEwsIGZwLCBQeV9NQVJTSEFMX1ZFUlNJT04pOwotCVB5TWFyc2hhbF9Xcml0ZU9iamVjdFRvRmlsZSgoUHlPYmplY3QgKiljbywgZnAsIFB5X01BUlNIQUxfVkVSU0lPTik7Ci0JaWYgKGZmbHVzaChmcCkgIT0gMCB8fCBmZXJyb3IoZnApKSB7Ci0JCWlmIChQeV9WZXJib3NlRmxhZykKLQkJCVB5U3lzX1dyaXRlU3RkZXJyKCIjIGNhbid0IHdyaXRlICVzXG4iLCBjcGF0aG5hbWUpOwotCQkvKiBEb24ndCBrZWVwIHBhcnRpYWwgZmlsZSAqLwotCQlmY2xvc2UoZnApOwotCQkodm9pZCkgdW5saW5rKGNwYXRobmFtZSk7Ci0JCXJldHVybjsKLQl9Ci0JLyogTm93IHdyaXRlIHRoZSB0cnVlIG10aW1lICovCi0JZnNlZWsoZnAsIDRMLCAwKTsKLQlhc3NlcnQobXRpbWUgPCBMT05HX01BWCk7Ci0JUHlNYXJzaGFsX1dyaXRlTG9uZ1RvRmlsZSgobG9uZyltdGltZSwgZnAsIFB5X01BUlNIQUxfVkVSU0lPTik7Ci0JZmZsdXNoKGZwKTsKLQlmY2xvc2UoZnApOwotCWlmIChQeV9WZXJib3NlRmxhZykKLQkJUHlTeXNfV3JpdGVTdGRlcnIoIiMgd3JvdGUgJXNcbiIsIGNwYXRobmFtZSk7CisgICAgZnAgPSBvcGVuX2V4Y2x1c2l2ZShjcGF0aG5hbWUsIG1vZGUpOworICAgIGlmIChmcCA9PSBOVUxMKSB7CisgICAgICAgIGlmIChQeV9WZXJib3NlRmxhZykKKyAgICAgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKAorICAgICAgICAgICAgICAgICIjIGNhbid0IGNyZWF0ZSAlc1xuIiwgY3BhdGhuYW1lKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBQeU1hcnNoYWxfV3JpdGVMb25nVG9GaWxlKHB5Y19tYWdpYywgZnAsIFB5X01BUlNIQUxfVkVSU0lPTik7CisgICAgLyogRmlyc3Qgd3JpdGUgYSAwIGZvciBtdGltZSAqLworICAgIFB5TWFyc2hhbF9Xcml0ZUxvbmdUb0ZpbGUoMEwsIGZwLCBQeV9NQVJTSEFMX1ZFUlNJT04pOworICAgIFB5TWFyc2hhbF9Xcml0ZU9iamVjdFRvRmlsZSgoUHlPYmplY3QgKiljbywgZnAsIFB5X01BUlNIQUxfVkVSU0lPTik7CisgICAgaWYgKGZmbHVzaChmcCkgIT0gMCB8fCBmZXJyb3IoZnApKSB7CisgICAgICAgIGlmIChQeV9WZXJib3NlRmxhZykKKyAgICAgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCIjIGNhbid0IHdyaXRlICVzXG4iLCBjcGF0aG5hbWUpOworICAgICAgICAvKiBEb24ndCBrZWVwIHBhcnRpYWwgZmlsZSAqLworICAgICAgICBmY2xvc2UoZnApOworICAgICAgICAodm9pZCkgdW5saW5rKGNwYXRobmFtZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLyogTm93IHdyaXRlIHRoZSB0cnVlIG10aW1lICovCisgICAgZnNlZWsoZnAsIDRMLCAwKTsKKyAgICBhc3NlcnQobXRpbWUgPCBMT05HX01BWCk7CisgICAgUHlNYXJzaGFsX1dyaXRlTG9uZ1RvRmlsZSgobG9uZyltdGltZSwgZnAsIFB5X01BUlNIQUxfVkVSU0lPTik7CisgICAgZmZsdXNoKGZwKTsKKyAgICBmY2xvc2UoZnApOworICAgIGlmIChQeV9WZXJib3NlRmxhZykKKyAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoIiMgd3JvdGUgJXNcbiIsIGNwYXRobmFtZSk7CiB9CiAKIHN0YXRpYyB2b2lkCiB1cGRhdGVfY29kZV9maWxlbmFtZXMoUHlDb2RlT2JqZWN0ICpjbywgUHlPYmplY3QgKm9sZG5hbWUsIFB5T2JqZWN0ICpuZXduYW1lKQogewotCVB5T2JqZWN0ICpjb25zdGFudHMsICp0bXA7Ci0JUHlfc3NpemVfdCBpLCBuOworICAgIFB5T2JqZWN0ICpjb25zdGFudHMsICp0bXA7CisgICAgUHlfc3NpemVfdCBpLCBuOwogCi0JaWYgKCFfUHlTdHJpbmdfRXEoY28tPmNvX2ZpbGVuYW1lLCBvbGRuYW1lKSkKLQkJcmV0dXJuOworICAgIGlmICghX1B5U3RyaW5nX0VxKGNvLT5jb19maWxlbmFtZSwgb2xkbmFtZSkpCisgICAgICAgIHJldHVybjsKIAotCXRtcCA9IGNvLT5jb19maWxlbmFtZTsKLQljby0+Y29fZmlsZW5hbWUgPSBuZXduYW1lOwotCVB5X0lOQ1JFRihjby0+Y29fZmlsZW5hbWUpOwotCVB5X0RFQ1JFRih0bXApOworICAgIHRtcCA9IGNvLT5jb19maWxlbmFtZTsKKyAgICBjby0+Y29fZmlsZW5hbWUgPSBuZXduYW1lOworICAgIFB5X0lOQ1JFRihjby0+Y29fZmlsZW5hbWUpOworICAgIFB5X0RFQ1JFRih0bXApOwogCi0JY29uc3RhbnRzID0gY28tPmNvX2NvbnN0czsKLQluID0gUHlUdXBsZV9HRVRfU0laRShjb25zdGFudHMpOwotCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJdG1wID0gUHlUdXBsZV9HRVRfSVRFTShjb25zdGFudHMsIGkpOwotCQlpZiAoUHlDb2RlX0NoZWNrKHRtcCkpCi0JCQl1cGRhdGVfY29kZV9maWxlbmFtZXMoKFB5Q29kZU9iamVjdCAqKXRtcCwKLQkJCQkJICAgICAgb2xkbmFtZSwgbmV3bmFtZSk7Ci0JfQorICAgIGNvbnN0YW50cyA9IGNvLT5jb19jb25zdHM7CisgICAgbiA9IFB5VHVwbGVfR0VUX1NJWkUoY29uc3RhbnRzKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIHRtcCA9IFB5VHVwbGVfR0VUX0lURU0oY29uc3RhbnRzLCBpKTsKKyAgICAgICAgaWYgKFB5Q29kZV9DaGVjayh0bXApKQorICAgICAgICAgICAgdXBkYXRlX2NvZGVfZmlsZW5hbWVzKChQeUNvZGVPYmplY3QgKil0bXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkbmFtZSwgbmV3bmFtZSk7CisgICAgfQogfQogCiBzdGF0aWMgaW50CiB1cGRhdGVfY29tcGlsZWRfbW9kdWxlKFB5Q29kZU9iamVjdCAqY28sIGNoYXIgKnBhdGhuYW1lKQogewotCVB5T2JqZWN0ICpvbGRuYW1lLCAqbmV3bmFtZTsKKyAgICBQeU9iamVjdCAqb2xkbmFtZSwgKm5ld25hbWU7CiAKLQlpZiAoc3RyY21wKFB5U3RyaW5nX0FzU3RyaW5nKGNvLT5jb19maWxlbmFtZSksIHBhdGhuYW1lKSA9PSAwKQotCQlyZXR1cm4gMDsKKyAgICBpZiAoc3RyY21wKFB5U3RyaW5nX0FzU3RyaW5nKGNvLT5jb19maWxlbmFtZSksIHBhdGhuYW1lKSA9PSAwKQorICAgICAgICByZXR1cm4gMDsKIAotCW5ld25hbWUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKHBhdGhuYW1lKTsKLQlpZiAobmV3bmFtZSA9PSBOVUxMKQotCQlyZXR1cm4gLTE7CisgICAgbmV3bmFtZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmcocGF0aG5hbWUpOworICAgIGlmIChuZXduYW1lID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKIAotCW9sZG5hbWUgPSBjby0+Y29fZmlsZW5hbWU7Ci0JUHlfSU5DUkVGKG9sZG5hbWUpOwotCXVwZGF0ZV9jb2RlX2ZpbGVuYW1lcyhjbywgb2xkbmFtZSwgbmV3bmFtZSk7Ci0JUHlfREVDUkVGKG9sZG5hbWUpOwotCVB5X0RFQ1JFRihuZXduYW1lKTsKLQlyZXR1cm4gMTsKKyAgICBvbGRuYW1lID0gY28tPmNvX2ZpbGVuYW1lOworICAgIFB5X0lOQ1JFRihvbGRuYW1lKTsKKyAgICB1cGRhdGVfY29kZV9maWxlbmFtZXMoY28sIG9sZG5hbWUsIG5ld25hbWUpOworICAgIFB5X0RFQ1JFRihvbGRuYW1lKTsKKyAgICBQeV9ERUNSRUYobmV3bmFtZSk7CisgICAgcmV0dXJuIDE7CiB9CiAKIC8qIExvYWQgYSBzb3VyY2UgbW9kdWxlIGZyb20gYSBnaXZlbiBmaWxlIGFuZCByZXR1cm4gaXRzIG1vZHVsZQpAQCAtOTYyLDY5ICs5NjIsNjkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBsb2FkX3NvdXJjZV9tb2R1bGUoY2hhciAqbmFtZSwgY2hhciAqcGF0aG5hbWUsIEZJTEUgKmZwKQogewotCXN0cnVjdCBzdGF0IHN0OwotCUZJTEUgKmZwYzsKLQljaGFyIGJ1ZltNQVhQQVRITEVOKzFdOwotCWNoYXIgKmNwYXRobmFtZTsKLQlQeUNvZGVPYmplY3QgKmNvOwotCVB5T2JqZWN0ICptOwotCQotCWlmIChmc3RhdChmaWxlbm8oZnApLCAmc3QpICE9IDApIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1J1bnRpbWVFcnJvciwKLQkJCSAgICAgInVuYWJsZSB0byBnZXQgZmlsZSBzdGF0dXMgZnJvbSAnJXMnIiwKLQkJCSAgICAgcGF0aG5hbWUpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0jaWYgU0laRU9GX1RJTUVfVCA+IDQKLQkvKiBQeXRob24ncyAucHljIHRpbWVzdGFtcCBoYW5kbGluZyBwcmVzdW1lcyB0aGF0IHRoZSB0aW1lc3RhbXAgZml0cwotCSAgIGluIDQgYnl0ZXMuIFRoaXMgd2lsbCBiZSBmaW5lIHVudGlsIHNvbWV0aW1lIGluIHRoZSB5ZWFyIDIwMzgsCi0JICAgd2hlbiBhIDQtYnl0ZSBzaWduZWQgdGltZV90IHdpbGwgb3ZlcmZsb3cuCi0JICovCi0JaWYgKHN0LnN0X210aW1lID4+IDMyKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJIm1vZGlmaWNhdGlvbiB0aW1lIG92ZXJmbG93cyBhIDQgYnl0ZSBmaWVsZCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0jZW5kaWYKLQljcGF0aG5hbWUgPSBtYWtlX2NvbXBpbGVkX3BhdGhuYW1lKHBhdGhuYW1lLCBidWYsCi0JCQkJCSAgIChzaXplX3QpTUFYUEFUSExFTiArIDEpOwotCWlmIChjcGF0aG5hbWUgIT0gTlVMTCAmJgotCSAgICAoZnBjID0gY2hlY2tfY29tcGlsZWRfbW9kdWxlKHBhdGhuYW1lLCBzdC5zdF9tdGltZSwgY3BhdGhuYW1lKSkpIHsKLQkJY28gPSByZWFkX2NvbXBpbGVkX21vZHVsZShjcGF0aG5hbWUsIGZwYyk7Ci0JCWZjbG9zZShmcGMpOwotCQlpZiAoY28gPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQlpZiAodXBkYXRlX2NvbXBpbGVkX21vZHVsZShjbywgcGF0aG5hbWUpIDwgMCkKLQkJCXJldHVybiBOVUxMOwotCQlpZiAoUHlfVmVyYm9zZUZsYWcpCi0JCQlQeVN5c19Xcml0ZVN0ZGVycigiaW1wb3J0ICVzICMgcHJlY29tcGlsZWQgZnJvbSAlc1xuIiwKLQkJCQluYW1lLCBjcGF0aG5hbWUpOwotCQlwYXRobmFtZSA9IGNwYXRobmFtZTsKLQl9Ci0JZWxzZSB7Ci0JCWNvID0gcGFyc2Vfc291cmNlX21vZHVsZShwYXRobmFtZSwgZnApOwotCQlpZiAoY28gPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQlpZiAoUHlfVmVyYm9zZUZsYWcpCi0JCQlQeVN5c19Xcml0ZVN0ZGVycigiaW1wb3J0ICVzICMgZnJvbSAlc1xuIiwKLQkJCQluYW1lLCBwYXRobmFtZSk7Ci0JCWlmIChjcGF0aG5hbWUpIHsKLQkJCVB5T2JqZWN0ICpybyA9IFB5U3lzX0dldE9iamVjdCgiZG9udF93cml0ZV9ieXRlY29kZSIpOwotCQkJaWYgKHJvID09IE5VTEwgfHwgIVB5T2JqZWN0X0lzVHJ1ZShybykpCi0JCQkJd3JpdGVfY29tcGlsZWRfbW9kdWxlKGNvLCBjcGF0aG5hbWUsICZzdCk7Ci0JCX0KLQl9Ci0JbSA9IFB5SW1wb3J0X0V4ZWNDb2RlTW9kdWxlRXgobmFtZSwgKFB5T2JqZWN0ICopY28sIHBhdGhuYW1lKTsKLQlQeV9ERUNSRUYoY28pOworICAgIHN0cnVjdCBzdGF0IHN0OworICAgIEZJTEUgKmZwYzsKKyAgICBjaGFyIGJ1ZltNQVhQQVRITEVOKzFdOworICAgIGNoYXIgKmNwYXRobmFtZTsKKyAgICBQeUNvZGVPYmplY3QgKmNvOworICAgIFB5T2JqZWN0ICptOwogCi0JcmV0dXJuIG07CisgICAgaWYgKGZzdGF0KGZpbGVubyhmcCksICZzdCkgIT0gMCkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfUnVudGltZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgInVuYWJsZSB0byBnZXQgZmlsZSBzdGF0dXMgZnJvbSAnJXMnIiwKKyAgICAgICAgICAgICAgICAgICAgIHBhdGhuYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorI2lmIFNJWkVPRl9USU1FX1QgPiA0CisgICAgLyogUHl0aG9uJ3MgLnB5YyB0aW1lc3RhbXAgaGFuZGxpbmcgcHJlc3VtZXMgdGhhdCB0aGUgdGltZXN0YW1wIGZpdHMKKyAgICAgICBpbiA0IGJ5dGVzLiBUaGlzIHdpbGwgYmUgZmluZSB1bnRpbCBzb21ldGltZSBpbiB0aGUgeWVhciAyMDM4LAorICAgICAgIHdoZW4gYSA0LWJ5dGUgc2lnbmVkIHRpbWVfdCB3aWxsIG92ZXJmbG93LgorICAgICAqLworICAgIGlmIChzdC5zdF9tdGltZSA+PiAzMikgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICJtb2RpZmljYXRpb24gdGltZSBvdmVyZmxvd3MgYSA0IGJ5dGUgZmllbGQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorI2VuZGlmCisgICAgY3BhdGhuYW1lID0gbWFrZV9jb21waWxlZF9wYXRobmFtZShwYXRobmFtZSwgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNpemVfdClNQVhQQVRITEVOICsgMSk7CisgICAgaWYgKGNwYXRobmFtZSAhPSBOVUxMICYmCisgICAgICAgIChmcGMgPSBjaGVja19jb21waWxlZF9tb2R1bGUocGF0aG5hbWUsIHN0LnN0X210aW1lLCBjcGF0aG5hbWUpKSkgeworICAgICAgICBjbyA9IHJlYWRfY29tcGlsZWRfbW9kdWxlKGNwYXRobmFtZSwgZnBjKTsKKyAgICAgICAgZmNsb3NlKGZwYyk7CisgICAgICAgIGlmIChjbyA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGlmICh1cGRhdGVfY29tcGlsZWRfbW9kdWxlKGNvLCBwYXRobmFtZSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGlmIChQeV9WZXJib3NlRmxhZykKKyAgICAgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCJpbXBvcnQgJXMgIyBwcmVjb21waWxlZCBmcm9tICVzXG4iLAorICAgICAgICAgICAgICAgIG5hbWUsIGNwYXRobmFtZSk7CisgICAgICAgIHBhdGhuYW1lID0gY3BhdGhuYW1lOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgY28gPSBwYXJzZV9zb3VyY2VfbW9kdWxlKHBhdGhuYW1lLCBmcCk7CisgICAgICAgIGlmIChjbyA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGlmIChQeV9WZXJib3NlRmxhZykKKyAgICAgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCJpbXBvcnQgJXMgIyBmcm9tICVzXG4iLAorICAgICAgICAgICAgICAgIG5hbWUsIHBhdGhuYW1lKTsKKyAgICAgICAgaWYgKGNwYXRobmFtZSkgeworICAgICAgICAgICAgUHlPYmplY3QgKnJvID0gUHlTeXNfR2V0T2JqZWN0KCJkb250X3dyaXRlX2J5dGVjb2RlIik7CisgICAgICAgICAgICBpZiAocm8gPT0gTlVMTCB8fCAhUHlPYmplY3RfSXNUcnVlKHJvKSkKKyAgICAgICAgICAgICAgICB3cml0ZV9jb21waWxlZF9tb2R1bGUoY28sIGNwYXRobmFtZSwgJnN0KTsKKyAgICAgICAgfQorICAgIH0KKyAgICBtID0gUHlJbXBvcnRfRXhlY0NvZGVNb2R1bGVFeChuYW1lLCAoUHlPYmplY3QgKiljbywgcGF0aG5hbWUpOworICAgIFB5X0RFQ1JFRihjbyk7CisKKyAgICByZXR1cm4gbTsKIH0KIAogCiAvKiBGb3J3YXJkICovCiBzdGF0aWMgUHlPYmplY3QgKmxvYWRfbW9kdWxlKGNoYXIgKiwgRklMRSAqLCBjaGFyICosIGludCwgUHlPYmplY3QgKik7CiBzdGF0aWMgc3RydWN0IGZpbGVkZXNjciAqZmluZF9tb2R1bGUoY2hhciAqLCBjaGFyICosIFB5T2JqZWN0ICosCi0JCQkJICAgICBjaGFyICosIHNpemVfdCwgRklMRSAqKiwgUHlPYmplY3QgKiopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKiwgc2l6ZV90LCBGSUxFICoqLCBQeU9iamVjdCAqKik7CiBzdGF0aWMgc3RydWN0IF9mcm96ZW4gKmZpbmRfZnJvemVuKGNoYXIgKm5hbWUpOwogCiAvKiBMb2FkIGEgcGFja2FnZSBhbmQgcmV0dXJuIGl0cyBtb2R1bGUgb2JqZWN0IFdJVEggSU5DUkVNRU5URUQKQEAgLTEwMzMsNTQgKzEwMzMsNTQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBsb2FkX3BhY2thZ2UoY2hhciAqbmFtZSwgY2hhciAqcGF0aG5hbWUpCiB7Ci0JUHlPYmplY3QgKm0sICpkOwotCVB5T2JqZWN0ICpmaWxlID0gTlVMTDsKLQlQeU9iamVjdCAqcGF0aCA9IE5VTEw7Ci0JaW50IGVycjsKLQljaGFyIGJ1ZltNQVhQQVRITEVOKzFdOwotCUZJTEUgKmZwID0gTlVMTDsKLQlzdHJ1Y3QgZmlsZWRlc2NyICpmZHA7CisgICAgUHlPYmplY3QgKm0sICpkOworICAgIFB5T2JqZWN0ICpmaWxlID0gTlVMTDsKKyAgICBQeU9iamVjdCAqcGF0aCA9IE5VTEw7CisgICAgaW50IGVycjsKKyAgICBjaGFyIGJ1ZltNQVhQQVRITEVOKzFdOworICAgIEZJTEUgKmZwID0gTlVMTDsKKyAgICBzdHJ1Y3QgZmlsZWRlc2NyICpmZHA7CiAKLQltID0gUHlJbXBvcnRfQWRkTW9kdWxlKG5hbWUpOwotCWlmIChtID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWlmIChQeV9WZXJib3NlRmxhZykKLQkJUHlTeXNfV3JpdGVTdGRlcnIoImltcG9ydCAlcyAjIGRpcmVjdG9yeSAlc1xuIiwKLQkJCW5hbWUsIHBhdGhuYW1lKTsKLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQlmaWxlID0gUHlTdHJpbmdfRnJvbVN0cmluZyhwYXRobmFtZSk7Ci0JaWYgKGZpbGUgPT0gTlVMTCkKLQkJZ290byBlcnJvcjsKLQlwYXRoID0gUHlfQnVpbGRWYWx1ZSgiW09dIiwgZmlsZSk7Ci0JaWYgKHBhdGggPT0gTlVMTCkKLQkJZ290byBlcnJvcjsKLQllcnIgPSBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiX19maWxlX18iLCBmaWxlKTsKLQlpZiAoZXJyID09IDApCi0JCWVyciA9IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJfX3BhdGhfXyIsIHBhdGgpOwotCWlmIChlcnIgIT0gMCkKLQkJZ290byBlcnJvcjsKLQlidWZbMF0gPSAnXDAnOwotCWZkcCA9IGZpbmRfbW9kdWxlKG5hbWUsICJfX2luaXRfXyIsIHBhdGgsIGJ1Ziwgc2l6ZW9mKGJ1ZiksICZmcCwgTlVMTCk7Ci0JaWYgKGZkcCA9PSBOVUxMKSB7Ci0JCWlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0ltcG9ydEVycm9yKSkgewotCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCVB5X0lOQ1JFRihtKTsKLQkJfQotCQllbHNlCi0JCQltID0gTlVMTDsKLQkJZ290byBjbGVhbnVwOwotCX0KLQltID0gbG9hZF9tb2R1bGUobmFtZSwgZnAsIGJ1ZiwgZmRwLT50eXBlLCBOVUxMKTsKLQlpZiAoZnAgIT0gTlVMTCkKLQkJZmNsb3NlKGZwKTsKLQlnb3RvIGNsZWFudXA7CisgICAgbSA9IFB5SW1wb3J0X0FkZE1vZHVsZShuYW1lKTsKKyAgICBpZiAobSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoUHlfVmVyYm9zZUZsYWcpCisgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCJpbXBvcnQgJXMgIyBkaXJlY3RvcnkgJXNcbiIsCisgICAgICAgICAgICBuYW1lLCBwYXRobmFtZSk7CisgICAgZCA9IFB5TW9kdWxlX0dldERpY3QobSk7CisgICAgZmlsZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmcocGF0aG5hbWUpOworICAgIGlmIChmaWxlID09IE5VTEwpCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgcGF0aCA9IFB5X0J1aWxkVmFsdWUoIltPXSIsIGZpbGUpOworICAgIGlmIChwYXRoID09IE5VTEwpCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgZXJyID0gUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIl9fZmlsZV9fIiwgZmlsZSk7CisgICAgaWYgKGVyciA9PSAwKQorICAgICAgICBlcnIgPSBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiX19wYXRoX18iLCBwYXRoKTsKKyAgICBpZiAoZXJyICE9IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgYnVmWzBdID0gJ1wwJzsKKyAgICBmZHAgPSBmaW5kX21vZHVsZShuYW1lLCAiX19pbml0X18iLCBwYXRoLCBidWYsIHNpemVvZihidWYpLCAmZnAsIE5VTEwpOworICAgIGlmIChmZHAgPT0gTlVMTCkgeworICAgICAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19JbXBvcnRFcnJvcikpIHsKKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICBQeV9JTkNSRUYobSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbSA9IE5VTEw7CisgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICB9CisgICAgbSA9IGxvYWRfbW9kdWxlKG5hbWUsIGZwLCBidWYsIGZkcC0+dHlwZSwgTlVMTCk7CisgICAgaWYgKGZwICE9IE5VTEwpCisgICAgICAgIGZjbG9zZShmcCk7CisgICAgZ290byBjbGVhbnVwOwogCiAgIGVycm9yOgotICAJbSA9IE5VTEw7CisgICAgbSA9IE5VTEw7CiAgIGNsZWFudXA6Ci0JUHlfWERFQ1JFRihwYXRoKTsKLQlQeV9YREVDUkVGKGZpbGUpOwotCXJldHVybiBtOworICAgIFB5X1hERUNSRUYocGF0aCk7CisgICAgUHlfWERFQ1JFRihmaWxlKTsKKyAgICByZXR1cm4gbTsKIH0KIAogCkBAIC0xMDg5LDE2ICsxMDg5LDE2IEBACiBzdGF0aWMgaW50CiBpc19idWlsdGluKGNoYXIgKm5hbWUpCiB7Ci0JaW50IGk7Ci0JZm9yIChpID0gMDsgUHlJbXBvcnRfSW5pdHRhYltpXS5uYW1lICE9IE5VTEw7IGkrKykgewotCQlpZiAoc3RyY21wKG5hbWUsIFB5SW1wb3J0X0luaXR0YWJbaV0ubmFtZSkgPT0gMCkgewotCQkJaWYgKFB5SW1wb3J0X0luaXR0YWJbaV0uaW5pdGZ1bmMgPT0gTlVMTCkKLQkJCQlyZXR1cm4gLTE7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIDE7Ci0JCX0KLQl9Ci0JcmV0dXJuIDA7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgUHlJbXBvcnRfSW5pdHRhYltpXS5uYW1lICE9IE5VTEw7IGkrKykgeworICAgICAgICBpZiAoc3RyY21wKG5hbWUsIFB5SW1wb3J0X0luaXR0YWJbaV0ubmFtZSkgPT0gMCkgeworICAgICAgICAgICAgaWYgKFB5SW1wb3J0X0luaXR0YWJbaV0uaW5pdGZ1bmMgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIApAQCAtMTExMiw3MiArMTExMiw3MiBAQAogCiBzdGF0aWMgUHlPYmplY3QgKgogZ2V0X3BhdGhfaW1wb3J0ZXIoUHlPYmplY3QgKnBhdGhfaW1wb3J0ZXJfY2FjaGUsIFB5T2JqZWN0ICpwYXRoX2hvb2tzLAotCQkgIFB5T2JqZWN0ICpwKQorICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKnApCiB7Ci0JUHlPYmplY3QgKmltcG9ydGVyOwotCVB5X3NzaXplX3Qgaiwgbmhvb2tzOworICAgIFB5T2JqZWN0ICppbXBvcnRlcjsKKyAgICBQeV9zc2l6ZV90IGosIG5ob29rczsKIAotCS8qIFRoZXNlIGNvbmRpdGlvbnMgYXJlIHRoZSBjYWxsZXIncyByZXNwb25zaWJpbGl0eTogKi8KLQlhc3NlcnQoUHlMaXN0X0NoZWNrKHBhdGhfaG9va3MpKTsKLQlhc3NlcnQoUHlEaWN0X0NoZWNrKHBhdGhfaW1wb3J0ZXJfY2FjaGUpKTsKKyAgICAvKiBUaGVzZSBjb25kaXRpb25zIGFyZSB0aGUgY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHk6ICovCisgICAgYXNzZXJ0KFB5TGlzdF9DaGVjayhwYXRoX2hvb2tzKSk7CisgICAgYXNzZXJ0KFB5RGljdF9DaGVjayhwYXRoX2ltcG9ydGVyX2NhY2hlKSk7CiAKLQluaG9va3MgPSBQeUxpc3RfU2l6ZShwYXRoX2hvb2tzKTsKLQlpZiAobmhvb2tzIDwgMCkKLQkJcmV0dXJuIE5VTEw7IC8qIFNob3VsZG4ndCBoYXBwZW4gKi8KKyAgICBuaG9va3MgPSBQeUxpc3RfU2l6ZShwYXRoX2hvb2tzKTsKKyAgICBpZiAobmhvb2tzIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7IC8qIFNob3VsZG4ndCBoYXBwZW4gKi8KIAotCWltcG9ydGVyID0gUHlEaWN0X0dldEl0ZW0ocGF0aF9pbXBvcnRlcl9jYWNoZSwgcCk7Ci0JaWYgKGltcG9ydGVyICE9IE5VTEwpCi0JCXJldHVybiBpbXBvcnRlcjsKKyAgICBpbXBvcnRlciA9IFB5RGljdF9HZXRJdGVtKHBhdGhfaW1wb3J0ZXJfY2FjaGUsIHApOworICAgIGlmIChpbXBvcnRlciAhPSBOVUxMKQorICAgICAgICByZXR1cm4gaW1wb3J0ZXI7CiAKLQkvKiBzZXQgcGF0aF9pbXBvcnRlcl9jYWNoZVtwXSB0byBOb25lIHRvIGF2b2lkIHJlY3Vyc2lvbiAqLwotCWlmIChQeURpY3RfU2V0SXRlbShwYXRoX2ltcG9ydGVyX2NhY2hlLCBwLCBQeV9Ob25lKSAhPSAwKQotCQlyZXR1cm4gTlVMTDsKKyAgICAvKiBzZXQgcGF0aF9pbXBvcnRlcl9jYWNoZVtwXSB0byBOb25lIHRvIGF2b2lkIHJlY3Vyc2lvbiAqLworICAgIGlmIChQeURpY3RfU2V0SXRlbShwYXRoX2ltcG9ydGVyX2NhY2hlLCBwLCBQeV9Ob25lKSAhPSAwKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWZvciAoaiA9IDA7IGogPCBuaG9va3M7IGorKykgewotCQlQeU9iamVjdCAqaG9vayA9IFB5TGlzdF9HZXRJdGVtKHBhdGhfaG9va3MsIGopOwotCQlpZiAoaG9vayA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWltcG9ydGVyID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhob29rLCBwLCBOVUxMKTsKLQkJaWYgKGltcG9ydGVyICE9IE5VTEwpCi0JCQlicmVhazsKKyAgICBmb3IgKGogPSAwOyBqIDwgbmhvb2tzOyBqKyspIHsKKyAgICAgICAgUHlPYmplY3QgKmhvb2sgPSBQeUxpc3RfR2V0SXRlbShwYXRoX2hvb2tzLCBqKTsKKyAgICAgICAgaWYgKGhvb2sgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBpbXBvcnRlciA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoaG9vaywgcCwgTlVMTCk7CisgICAgICAgIGlmIChpbXBvcnRlciAhPSBOVUxMKQorICAgICAgICAgICAgYnJlYWs7CiAKLQkJaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0ltcG9ydEVycm9yKSkgewotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJUHlFcnJfQ2xlYXIoKTsKLQl9Ci0JaWYgKGltcG9ydGVyID09IE5VTEwpIHsKLQkJaW1wb3J0ZXIgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKAotCQkJKFB5T2JqZWN0ICopJlB5TnVsbEltcG9ydGVyX1R5cGUsIHAsIE5VTEwKLQkJKTsKLQkJaWYgKGltcG9ydGVyID09IE5VTEwpIHsKLQkJCWlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0ltcG9ydEVycm9yKSkgewotCQkJCVB5RXJyX0NsZWFyKCk7Ci0JCQkJcmV0dXJuIFB5X05vbmU7Ci0JCQl9Ci0JCX0KLQl9Ci0JaWYgKGltcG9ydGVyICE9IE5VTEwpIHsKLQkJaW50IGVyciA9IFB5RGljdF9TZXRJdGVtKHBhdGhfaW1wb3J0ZXJfY2FjaGUsIHAsIGltcG9ydGVyKTsKLQkJUHlfREVDUkVGKGltcG9ydGVyKTsKLQkJaWYgKGVyciAhPSAwKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBpbXBvcnRlcjsKKyAgICAgICAgaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0ltcG9ydEVycm9yKSkgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICB9CisgICAgaWYgKGltcG9ydGVyID09IE5VTEwpIHsKKyAgICAgICAgaW1wb3J0ZXIgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKAorICAgICAgICAgICAgKFB5T2JqZWN0ICopJlB5TnVsbEltcG9ydGVyX1R5cGUsIHAsIE5VTEwKKyAgICAgICAgKTsKKyAgICAgICAgaWYgKGltcG9ydGVyID09IE5VTEwpIHsKKyAgICAgICAgICAgIGlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0ltcG9ydEVycm9yKSkgeworICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGltcG9ydGVyICE9IE5VTEwpIHsKKyAgICAgICAgaW50IGVyciA9IFB5RGljdF9TZXRJdGVtKHBhdGhfaW1wb3J0ZXJfY2FjaGUsIHAsIGltcG9ydGVyKTsKKyAgICAgICAgUHlfREVDUkVGKGltcG9ydGVyKTsKKyAgICAgICAgaWYgKGVyciAhPSAwKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBpbXBvcnRlcjsKIH0KIAogUHlBUElfRlVOQyhQeU9iamVjdCAqKQogUHlJbXBvcnRfR2V0SW1wb3J0ZXIoUHlPYmplY3QgKnBhdGgpIHsKLSAgICAgICAgUHlPYmplY3QgKmltcG9ydGVyPU5VTEwsICpwYXRoX2ltcG9ydGVyX2NhY2hlPU5VTEwsICpwYXRoX2hvb2tzPU5VTEw7CisgICAgUHlPYmplY3QgKmltcG9ydGVyPU5VTEwsICpwYXRoX2ltcG9ydGVyX2NhY2hlPU5VTEwsICpwYXRoX2hvb2tzPU5VTEw7CiAKLQlpZiAoKHBhdGhfaW1wb3J0ZXJfY2FjaGUgPSBQeVN5c19HZXRPYmplY3QoInBhdGhfaW1wb3J0ZXJfY2FjaGUiKSkpIHsKLQkJaWYgKChwYXRoX2hvb2tzID0gUHlTeXNfR2V0T2JqZWN0KCJwYXRoX2hvb2tzIikpKSB7Ci0JCQlpbXBvcnRlciA9IGdldF9wYXRoX2ltcG9ydGVyKHBhdGhfaW1wb3J0ZXJfY2FjaGUsCi0JCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhfaG9va3MsIHBhdGgpOwotCQl9Ci0JfQotCVB5X1hJTkNSRUYoaW1wb3J0ZXIpOyAvKiBnZXRfcGF0aF9pbXBvcnRlciByZXR1cm5zIGEgYm9ycm93ZWQgcmVmZXJlbmNlICovCi0JcmV0dXJuIGltcG9ydGVyOworICAgIGlmICgocGF0aF9pbXBvcnRlcl9jYWNoZSA9IFB5U3lzX0dldE9iamVjdCgicGF0aF9pbXBvcnRlcl9jYWNoZSIpKSkgeworICAgICAgICBpZiAoKHBhdGhfaG9va3MgPSBQeVN5c19HZXRPYmplY3QoInBhdGhfaG9va3MiKSkpIHsKKyAgICAgICAgICAgIGltcG9ydGVyID0gZ2V0X3BhdGhfaW1wb3J0ZXIocGF0aF9pbXBvcnRlcl9jYWNoZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aF9ob29rcywgcGF0aCk7CisgICAgICAgIH0KKyAgICB9CisgICAgUHlfWElOQ1JFRihpbXBvcnRlcik7IC8qIGdldF9wYXRoX2ltcG9ydGVyIHJldHVybnMgYSBib3Jyb3dlZCByZWZlcmVuY2UgKi8KKyAgICByZXR1cm4gaW1wb3J0ZXI7CiB9CiAKIC8qIFNlYXJjaCB0aGUgcGF0aCAoZGVmYXVsdCBzeXMucGF0aCkgZm9yIGEgbW9kdWxlLiAgUmV0dXJuIHRoZQpAQCAtMTE4Niw3ICsxMTg2LDcgQEAKIAogI2lmZGVmIE1TX0NPUkVETEwKIGV4dGVybiBGSUxFICpQeVdpbl9GaW5kUmVnaXN0ZXJlZE1vZHVsZShjb25zdCBjaGFyICosIHN0cnVjdCBmaWxlZGVzY3IgKiosCi0JCQkJCWNoYXIgKiwgUHlfc3NpemVfdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqLCBQeV9zc2l6ZV90KTsKICNlbmRpZgogCiBzdGF0aWMgaW50IGNhc2Vfb2soY2hhciAqLCBQeV9zc2l6ZV90LCBQeV9zc2l6ZV90LCBjaGFyICopOwpAQCAtMTE5NSwzMTkgKzExOTUsMzE5IEBACiAKIHN0YXRpYyBzdHJ1Y3QgZmlsZWRlc2NyICoKIGZpbmRfbW9kdWxlKGNoYXIgKmZ1bGxuYW1lLCBjaGFyICpzdWJuYW1lLCBQeU9iamVjdCAqcGF0aCwgY2hhciAqYnVmLAotCSAgICBzaXplX3QgYnVmbGVuLCBGSUxFICoqcF9mcCwgUHlPYmplY3QgKipwX2xvYWRlcikKKyAgICAgICAgICAgIHNpemVfdCBidWZsZW4sIEZJTEUgKipwX2ZwLCBQeU9iamVjdCAqKnBfbG9hZGVyKQogewotCVB5X3NzaXplX3QgaSwgbnBhdGg7Ci0Jc2l6ZV90IGxlbiwgbmFtZWxlbjsKLQlzdHJ1Y3QgZmlsZWRlc2NyICpmZHAgPSBOVUxMOwotCWNoYXIgKmZpbGVtb2RlOwotCUZJTEUgKmZwID0gTlVMTDsKLQlQeU9iamVjdCAqcGF0aF9ob29rcywgKnBhdGhfaW1wb3J0ZXJfY2FjaGU7CisgICAgUHlfc3NpemVfdCBpLCBucGF0aDsKKyAgICBzaXplX3QgbGVuLCBuYW1lbGVuOworICAgIHN0cnVjdCBmaWxlZGVzY3IgKmZkcCA9IE5VTEw7CisgICAgY2hhciAqZmlsZW1vZGU7CisgICAgRklMRSAqZnAgPSBOVUxMOworICAgIFB5T2JqZWN0ICpwYXRoX2hvb2tzLCAqcGF0aF9pbXBvcnRlcl9jYWNoZTsKICNpZm5kZWYgUklTQ09TCi0Jc3RydWN0IHN0YXQgc3RhdGJ1ZjsKKyAgICBzdHJ1Y3Qgc3RhdCBzdGF0YnVmOwogI2VuZGlmCi0Jc3RhdGljIHN0cnVjdCBmaWxlZGVzY3IgZmRfZnJvemVuID0geyIiLCAiIiwgUFlfRlJPWkVOfTsKLQlzdGF0aWMgc3RydWN0IGZpbGVkZXNjciBmZF9idWlsdGluID0geyIiLCAiIiwgQ19CVUlMVElOfTsKLQlzdGF0aWMgc3RydWN0IGZpbGVkZXNjciBmZF9wYWNrYWdlID0geyIiLCAiIiwgUEtHX0RJUkVDVE9SWX07Ci0JY2hhciBuYW1lW01BWFBBVEhMRU4rMV07CisgICAgc3RhdGljIHN0cnVjdCBmaWxlZGVzY3IgZmRfZnJvemVuID0geyIiLCAiIiwgUFlfRlJPWkVOfTsKKyAgICBzdGF0aWMgc3RydWN0IGZpbGVkZXNjciBmZF9idWlsdGluID0geyIiLCAiIiwgQ19CVUlMVElOfTsKKyAgICBzdGF0aWMgc3RydWN0IGZpbGVkZXNjciBmZF9wYWNrYWdlID0geyIiLCAiIiwgUEtHX0RJUkVDVE9SWX07CisgICAgY2hhciBuYW1lW01BWFBBVEhMRU4rMV07CiAjaWYgZGVmaW5lZChQWU9TX09TMikKLQlzaXplX3Qgc2F2ZWRfbGVuOwotCXNpemVfdCBzYXZlZF9uYW1lbGVuOwotCWNoYXIgKnNhdmVkX2J1ZiA9IE5VTEw7CisgICAgc2l6ZV90IHNhdmVkX2xlbjsKKyAgICBzaXplX3Qgc2F2ZWRfbmFtZWxlbjsKKyAgICBjaGFyICpzYXZlZF9idWYgPSBOVUxMOwogI2VuZGlmCi0JaWYgKHBfbG9hZGVyICE9IE5VTEwpCi0JCSpwX2xvYWRlciA9IE5VTEw7CisgICAgaWYgKHBfbG9hZGVyICE9IE5VTEwpCisgICAgICAgICpwX2xvYWRlciA9IE5VTEw7CiAKLQlpZiAoc3RybGVuKHN1Ym5hbWUpID4gTUFYUEFUSExFTikgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJCQkibW9kdWxlIG5hbWUgaXMgdG9vIGxvbmciKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXN0cmNweShuYW1lLCBzdWJuYW1lKTsKKyAgICBpZiAoc3RybGVuKHN1Ym5hbWUpID4gTUFYUEFUSExFTikgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJtb2R1bGUgbmFtZSBpcyB0b28gbG9uZyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgc3RyY3B5KG5hbWUsIHN1Ym5hbWUpOwogCi0JLyogc3lzLm1ldGFfcGF0aCBpbXBvcnQgaG9vayAqLwotCWlmIChwX2xvYWRlciAhPSBOVUxMKSB7Ci0JCVB5T2JqZWN0ICptZXRhX3BhdGg7CisgICAgLyogc3lzLm1ldGFfcGF0aCBpbXBvcnQgaG9vayAqLworICAgIGlmIChwX2xvYWRlciAhPSBOVUxMKSB7CisgICAgICAgIFB5T2JqZWN0ICptZXRhX3BhdGg7CiAKLQkJbWV0YV9wYXRoID0gUHlTeXNfR2V0T2JqZWN0KCJtZXRhX3BhdGgiKTsKLQkJaWYgKG1ldGFfcGF0aCA9PSBOVUxMIHx8ICFQeUxpc3RfQ2hlY2sobWV0YV9wYXRoKSkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0ltcG9ydEVycm9yLAotCQkJCQkic3lzLm1ldGFfcGF0aCBtdXN0IGJlIGEgbGlzdCBvZiAiCi0JCQkJCSJpbXBvcnQgaG9va3MiKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCVB5X0lOQ1JFRihtZXRhX3BhdGgpOyAgLyogemFwIGd1YXJkICovCi0JCW5wYXRoID0gUHlMaXN0X1NpemUobWV0YV9wYXRoKTsKLQkJZm9yIChpID0gMDsgaSA8IG5wYXRoOyBpKyspIHsKLQkJCVB5T2JqZWN0ICpsb2FkZXI7Ci0JCQlQeU9iamVjdCAqaG9vayA9IFB5TGlzdF9HZXRJdGVtKG1ldGFfcGF0aCwgaSk7Ci0JCQlsb2FkZXIgPSBQeU9iamVjdF9DYWxsTWV0aG9kKGhvb2ssICJmaW5kX21vZHVsZSIsCi0JCQkJCQkgICAgICJzTyIsIGZ1bGxuYW1lLAotCQkJCQkJICAgICBwYXRoICE9IE5VTEwgPwotCQkJCQkJICAgICBwYXRoIDogUHlfTm9uZSk7Ci0JCQlpZiAobG9hZGVyID09IE5VTEwpIHsKLQkJCQlQeV9ERUNSRUYobWV0YV9wYXRoKTsKLQkJCQlyZXR1cm4gTlVMTDsgIC8qIHRydWUgZXJyb3IgKi8KLQkJCX0KLQkJCWlmIChsb2FkZXIgIT0gUHlfTm9uZSkgewotCQkJCS8qIGEgbG9hZGVyIHdhcyBmb3VuZCAqLwotCQkJCSpwX2xvYWRlciA9IGxvYWRlcjsKLQkJCQlQeV9ERUNSRUYobWV0YV9wYXRoKTsKLQkJCQlyZXR1cm4gJmltcG9ydGhvb2tkZXNjcjsKLQkJCX0KLQkJCVB5X0RFQ1JFRihsb2FkZXIpOwotCQl9Ci0JCVB5X0RFQ1JFRihtZXRhX3BhdGgpOwotCX0KKyAgICAgICAgbWV0YV9wYXRoID0gUHlTeXNfR2V0T2JqZWN0KCJtZXRhX3BhdGgiKTsKKyAgICAgICAgaWYgKG1ldGFfcGF0aCA9PSBOVUxMIHx8ICFQeUxpc3RfQ2hlY2sobWV0YV9wYXRoKSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0ltcG9ydEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzeXMubWV0YV9wYXRoIG11c3QgYmUgYSBsaXN0IG9mICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW1wb3J0IGhvb2tzIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBQeV9JTkNSRUYobWV0YV9wYXRoKTsgIC8qIHphcCBndWFyZCAqLworICAgICAgICBucGF0aCA9IFB5TGlzdF9TaXplKG1ldGFfcGF0aCk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBucGF0aDsgaSsrKSB7CisgICAgICAgICAgICBQeU9iamVjdCAqbG9hZGVyOworICAgICAgICAgICAgUHlPYmplY3QgKmhvb2sgPSBQeUxpc3RfR2V0SXRlbShtZXRhX3BhdGgsIGkpOworICAgICAgICAgICAgbG9hZGVyID0gUHlPYmplY3RfQ2FsbE1ldGhvZChob29rLCAiZmluZF9tb2R1bGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic08iLCBmdWxsbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCAhPSBOVUxMID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCA6IFB5X05vbmUpOworICAgICAgICAgICAgaWYgKGxvYWRlciA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKG1ldGFfcGF0aCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7ICAvKiB0cnVlIGVycm9yICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobG9hZGVyICE9IFB5X05vbmUpIHsKKyAgICAgICAgICAgICAgICAvKiBhIGxvYWRlciB3YXMgZm91bmQgKi8KKyAgICAgICAgICAgICAgICAqcF9sb2FkZXIgPSBsb2FkZXI7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKG1ldGFfcGF0aCk7CisgICAgICAgICAgICAgICAgcmV0dXJuICZpbXBvcnRob29rZGVzY3I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQeV9ERUNSRUYobG9hZGVyKTsKKyAgICAgICAgfQorICAgICAgICBQeV9ERUNSRUYobWV0YV9wYXRoKTsKKyAgICB9CiAKLQlpZiAocGF0aCAhPSBOVUxMICYmIFB5U3RyaW5nX0NoZWNrKHBhdGgpKSB7Ci0JCS8qIFRoZSBvbmx5IHR5cGUgb2Ygc3VibW9kdWxlIGFsbG93ZWQgaW5zaWRlIGEgImZyb3plbiIKLQkJICAgcGFja2FnZSBhcmUgb3RoZXIgZnJvemVuIG1vZHVsZXMgb3IgcGFja2FnZXMuICovCi0JCWlmIChQeVN0cmluZ19TaXplKHBhdGgpICsgMSArIHN0cmxlbihuYW1lKSA+PSAoc2l6ZV90KWJ1ZmxlbikgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0ltcG9ydEVycm9yLAotCQkJCQkiZnVsbCBmcm96ZW4gbW9kdWxlIG5hbWUgdG9vIGxvbmciKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCXN0cmNweShidWYsIFB5U3RyaW5nX0FzU3RyaW5nKHBhdGgpKTsKLQkJc3RyY2F0KGJ1ZiwgIi4iKTsKLQkJc3RyY2F0KGJ1ZiwgbmFtZSk7Ci0JCXN0cmNweShuYW1lLCBidWYpOwotCQlpZiAoZmluZF9mcm96ZW4obmFtZSkgIT0gTlVMTCkgewotCQkJc3RyY3B5KGJ1ZiwgbmFtZSk7Ci0JCQlyZXR1cm4gJmZkX2Zyb3plbjsKLQkJfQotCQlQeUVycl9Gb3JtYXQoUHlFeGNfSW1wb3J0RXJyb3IsCi0JCQkgICAgICJObyBmcm96ZW4gc3VibW9kdWxlIG5hbWVkICUuMjAwcyIsIG5hbWUpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKHBhdGggPT0gTlVMTCkgewotCQlpZiAoaXNfYnVpbHRpbihuYW1lKSkgewotCQkJc3RyY3B5KGJ1ZiwgbmFtZSk7Ci0JCQlyZXR1cm4gJmZkX2J1aWx0aW47Ci0JCX0KLQkJaWYgKChmaW5kX2Zyb3plbihuYW1lKSkgIT0gTlVMTCkgewotCQkJc3RyY3B5KGJ1ZiwgbmFtZSk7Ci0JCQlyZXR1cm4gJmZkX2Zyb3plbjsKLQkJfQorICAgIGlmIChwYXRoICE9IE5VTEwgJiYgUHlTdHJpbmdfQ2hlY2socGF0aCkpIHsKKyAgICAgICAgLyogVGhlIG9ubHkgdHlwZSBvZiBzdWJtb2R1bGUgYWxsb3dlZCBpbnNpZGUgYSAiZnJvemVuIgorICAgICAgICAgICBwYWNrYWdlIGFyZSBvdGhlciBmcm96ZW4gbW9kdWxlcyBvciBwYWNrYWdlcy4gKi8KKyAgICAgICAgaWYgKFB5U3RyaW5nX1NpemUocGF0aCkgKyAxICsgc3RybGVuKG5hbWUpID49IChzaXplX3QpYnVmbGVuKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW1wb3J0RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZ1bGwgZnJvemVuIG1vZHVsZSBuYW1lIHRvbyBsb25nIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBzdHJjcHkoYnVmLCBQeVN0cmluZ19Bc1N0cmluZyhwYXRoKSk7CisgICAgICAgIHN0cmNhdChidWYsICIuIik7CisgICAgICAgIHN0cmNhdChidWYsIG5hbWUpOworICAgICAgICBzdHJjcHkobmFtZSwgYnVmKTsKKyAgICAgICAgaWYgKGZpbmRfZnJvemVuKG5hbWUpICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHN0cmNweShidWYsIG5hbWUpOworICAgICAgICAgICAgcmV0dXJuICZmZF9mcm96ZW47CisgICAgICAgIH0KKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX0ltcG9ydEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIk5vIGZyb3plbiBzdWJtb2R1bGUgbmFtZWQgJS4yMDBzIiwgbmFtZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAocGF0aCA9PSBOVUxMKSB7CisgICAgICAgIGlmIChpc19idWlsdGluKG5hbWUpKSB7CisgICAgICAgICAgICBzdHJjcHkoYnVmLCBuYW1lKTsKKyAgICAgICAgICAgIHJldHVybiAmZmRfYnVpbHRpbjsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGZpbmRfZnJvemVuKG5hbWUpKSAhPSBOVUxMKSB7CisgICAgICAgICAgICBzdHJjcHkoYnVmLCBuYW1lKTsKKyAgICAgICAgICAgIHJldHVybiAmZmRfZnJvemVuOworICAgICAgICB9CiAKICNpZmRlZiBNU19DT1JFRExMCi0JCWZwID0gUHlXaW5fRmluZFJlZ2lzdGVyZWRNb2R1bGUobmFtZSwgJmZkcCwgYnVmLCBidWZsZW4pOwotCQlpZiAoZnAgIT0gTlVMTCkgewotCQkJKnBfZnAgPSBmcDsKLQkJCXJldHVybiBmZHA7Ci0JCX0KKyAgICAgICAgZnAgPSBQeVdpbl9GaW5kUmVnaXN0ZXJlZE1vZHVsZShuYW1lLCAmZmRwLCBidWYsIGJ1Zmxlbik7CisgICAgICAgIGlmIChmcCAhPSBOVUxMKSB7CisgICAgICAgICAgICAqcF9mcCA9IGZwOworICAgICAgICAgICAgcmV0dXJuIGZkcDsKKyAgICAgICAgfQogI2VuZGlmCi0JCXBhdGggPSBQeVN5c19HZXRPYmplY3QoInBhdGgiKTsKLQl9Ci0JaWYgKHBhdGggPT0gTlVMTCB8fCAhUHlMaXN0X0NoZWNrKHBhdGgpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwKLQkJCQkic3lzLnBhdGggbXVzdCBiZSBhIGxpc3Qgb2YgZGlyZWN0b3J5IG5hbWVzIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICAgICAgcGF0aCA9IFB5U3lzX0dldE9iamVjdCgicGF0aCIpOworICAgIH0KKyAgICBpZiAocGF0aCA9PSBOVUxMIHx8ICFQeUxpc3RfQ2hlY2socGF0aCkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0ltcG9ydEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInN5cy5wYXRoIG11c3QgYmUgYSBsaXN0IG9mIGRpcmVjdG9yeSBuYW1lcyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlwYXRoX2hvb2tzID0gUHlTeXNfR2V0T2JqZWN0KCJwYXRoX2hvb2tzIik7Ci0JaWYgKHBhdGhfaG9va3MgPT0gTlVMTCB8fCAhUHlMaXN0X0NoZWNrKHBhdGhfaG9va3MpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwKLQkJCQkic3lzLnBhdGhfaG9va3MgbXVzdCBiZSBhIGxpc3Qgb2YgIgotCQkJCSJpbXBvcnQgaG9va3MiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXBhdGhfaW1wb3J0ZXJfY2FjaGUgPSBQeVN5c19HZXRPYmplY3QoInBhdGhfaW1wb3J0ZXJfY2FjaGUiKTsKLQlpZiAocGF0aF9pbXBvcnRlcl9jYWNoZSA9PSBOVUxMIHx8Ci0JICAgICFQeURpY3RfQ2hlY2socGF0aF9pbXBvcnRlcl9jYWNoZSkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0ltcG9ydEVycm9yLAotCQkJCSJzeXMucGF0aF9pbXBvcnRlcl9jYWNoZSBtdXN0IGJlIGEgZGljdCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgcGF0aF9ob29rcyA9IFB5U3lzX0dldE9iamVjdCgicGF0aF9ob29rcyIpOworICAgIGlmIChwYXRoX2hvb2tzID09IE5VTEwgfHwgIVB5TGlzdF9DaGVjayhwYXRoX2hvb2tzKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW1wb3J0RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAic3lzLnBhdGhfaG9va3MgbXVzdCBiZSBhIGxpc3Qgb2YgIgorICAgICAgICAgICAgICAgICAgICAgICAgImltcG9ydCBob29rcyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcGF0aF9pbXBvcnRlcl9jYWNoZSA9IFB5U3lzX0dldE9iamVjdCgicGF0aF9pbXBvcnRlcl9jYWNoZSIpOworICAgIGlmIChwYXRoX2ltcG9ydGVyX2NhY2hlID09IE5VTEwgfHwKKyAgICAgICAgIVB5RGljdF9DaGVjayhwYXRoX2ltcG9ydGVyX2NhY2hlKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW1wb3J0RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAic3lzLnBhdGhfaW1wb3J0ZXJfY2FjaGUgbXVzdCBiZSBhIGRpY3QiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JbnBhdGggPSBQeUxpc3RfU2l6ZShwYXRoKTsKLQluYW1lbGVuID0gc3RybGVuKG5hbWUpOwotCWZvciAoaSA9IDA7IGkgPCBucGF0aDsgaSsrKSB7Ci0JCVB5T2JqZWN0ICpjb3B5ID0gTlVMTDsKLQkJUHlPYmplY3QgKnYgPSBQeUxpc3RfR2V0SXRlbShwYXRoLCBpKTsKLQkJaWYgKCF2KQotCQkJcmV0dXJuIE5VTEw7CisgICAgbnBhdGggPSBQeUxpc3RfU2l6ZShwYXRoKTsKKyAgICBuYW1lbGVuID0gc3RybGVuKG5hbWUpOworICAgIGZvciAoaSA9IDA7IGkgPCBucGF0aDsgaSsrKSB7CisgICAgICAgIFB5T2JqZWN0ICpjb3B5ID0gTlVMTDsKKyAgICAgICAgUHlPYmplY3QgKnYgPSBQeUxpc3RfR2V0SXRlbShwYXRoLCBpKTsKKyAgICAgICAgaWYgKCF2KQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCQlpZiAoUHlVbmljb2RlX0NoZWNrKHYpKSB7Ci0JCQljb3B5ID0gUHlVbmljb2RlX0VuY29kZShQeVVuaWNvZGVfQVNfVU5JQ09ERSh2KSwKLQkJCQlQeVVuaWNvZGVfR0VUX1NJWkUodiksIFB5X0ZpbGVTeXN0ZW1EZWZhdWx0RW5jb2RpbmcsIE5VTEwpOwotCQkJaWYgKGNvcHkgPT0gTlVMTCkKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCXYgPSBjb3B5OwotCQl9Ci0JCWVsc2UKKyAgICAgICAgaWYgKFB5VW5pY29kZV9DaGVjayh2KSkgeworICAgICAgICAgICAgY29weSA9IFB5VW5pY29kZV9FbmNvZGUoUHlVbmljb2RlX0FTX1VOSUNPREUodiksCisgICAgICAgICAgICAgICAgUHlVbmljb2RlX0dFVF9TSVpFKHYpLCBQeV9GaWxlU3lzdGVtRGVmYXVsdEVuY29kaW5nLCBOVUxMKTsKKyAgICAgICAgICAgIGlmIChjb3B5ID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB2ID0gY29weTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCiAjZW5kaWYKLQkJaWYgKCFQeVN0cmluZ19DaGVjayh2KSkKLQkJCWNvbnRpbnVlOwotCQlsZW4gPSBQeVN0cmluZ19HRVRfU0laRSh2KTsKLQkJaWYgKGxlbiArIDIgKyBuYW1lbGVuICsgTUFYU1VGRklYU0laRSA+PSBidWZsZW4pIHsKLQkJCVB5X1hERUNSRUYoY29weSk7Ci0JCQljb250aW51ZTsgLyogVG9vIGxvbmcgKi8KLQkJfQotCQlzdHJjcHkoYnVmLCBQeVN0cmluZ19BU19TVFJJTkcodikpOwotCQlpZiAoc3RybGVuKGJ1ZikgIT0gbGVuKSB7Ci0JCQlQeV9YREVDUkVGKGNvcHkpOwotCQkJY29udGludWU7IC8qIHYgY29udGFpbnMgJ1wwJyAqLwotCQl9CisgICAgICAgIGlmICghUHlTdHJpbmdfQ2hlY2sodikpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUodik7CisgICAgICAgIGlmIChsZW4gKyAyICsgbmFtZWxlbiArIE1BWFNVRkZJWFNJWkUgPj0gYnVmbGVuKSB7CisgICAgICAgICAgICBQeV9YREVDUkVGKGNvcHkpOworICAgICAgICAgICAgY29udGludWU7IC8qIFRvbyBsb25nICovCisgICAgICAgIH0KKyAgICAgICAgc3RyY3B5KGJ1ZiwgUHlTdHJpbmdfQVNfU1RSSU5HKHYpKTsKKyAgICAgICAgaWYgKHN0cmxlbihidWYpICE9IGxlbikgeworICAgICAgICAgICAgUHlfWERFQ1JFRihjb3B5KTsKKyAgICAgICAgICAgIGNvbnRpbnVlOyAvKiB2IGNvbnRhaW5zICdcMCcgKi8KKyAgICAgICAgfQogCi0JCS8qIHN5cy5wYXRoX2hvb2tzIGltcG9ydCBob29rICovCi0JCWlmIChwX2xvYWRlciAhPSBOVUxMKSB7Ci0JCQlQeU9iamVjdCAqaW1wb3J0ZXI7CisgICAgICAgIC8qIHN5cy5wYXRoX2hvb2tzIGltcG9ydCBob29rICovCisgICAgICAgIGlmIChwX2xvYWRlciAhPSBOVUxMKSB7CisgICAgICAgICAgICBQeU9iamVjdCAqaW1wb3J0ZXI7CiAKLQkJCWltcG9ydGVyID0gZ2V0X3BhdGhfaW1wb3J0ZXIocGF0aF9pbXBvcnRlcl9jYWNoZSwKLQkJCQkJCSAgICAgcGF0aF9ob29rcywgdik7Ci0JCQlpZiAoaW1wb3J0ZXIgPT0gTlVMTCkgewotCQkJCVB5X1hERUNSRUYoY29weSk7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCQkvKiBOb3RlOiBpbXBvcnRlciBpcyBhIGJvcnJvd2VkIHJlZmVyZW5jZSAqLwotCQkJaWYgKGltcG9ydGVyICE9IFB5X05vbmUpIHsKLQkJCQlQeU9iamVjdCAqbG9hZGVyOwotCQkJCWxvYWRlciA9IFB5T2JqZWN0X0NhbGxNZXRob2QoaW1wb3J0ZXIsCi0JCQkJCQkJICAgICAiZmluZF9tb2R1bGUiLAotCQkJCQkJCSAgICAgInMiLCBmdWxsbmFtZSk7Ci0JCQkJUHlfWERFQ1JFRihjb3B5KTsKLQkJCQlpZiAobG9hZGVyID09IE5VTEwpCi0JCQkJCXJldHVybiBOVUxMOyAgLyogZXJyb3IgKi8KLQkJCQlpZiAobG9hZGVyICE9IFB5X05vbmUpIHsKLQkJCQkJLyogYSBsb2FkZXIgd2FzIGZvdW5kICovCi0JCQkJCSpwX2xvYWRlciA9IGxvYWRlcjsKLQkJCQkJcmV0dXJuICZpbXBvcnRob29rZGVzY3I7Ci0JCQkJfQotCQkJCVB5X0RFQ1JFRihsb2FkZXIpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQl9Ci0JCS8qIG5vIGhvb2sgd2FzIGZvdW5kLCB1c2UgYnVpbHRpbiBpbXBvcnQgKi8KKyAgICAgICAgICAgIGltcG9ydGVyID0gZ2V0X3BhdGhfaW1wb3J0ZXIocGF0aF9pbXBvcnRlcl9jYWNoZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aF9ob29rcywgdik7CisgICAgICAgICAgICBpZiAoaW1wb3J0ZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5X1hERUNSRUYoY29weSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBOb3RlOiBpbXBvcnRlciBpcyBhIGJvcnJvd2VkIHJlZmVyZW5jZSAqLworICAgICAgICAgICAgaWYgKGltcG9ydGVyICE9IFB5X05vbmUpIHsKKyAgICAgICAgICAgICAgICBQeU9iamVjdCAqbG9hZGVyOworICAgICAgICAgICAgICAgIGxvYWRlciA9IFB5T2JqZWN0X0NhbGxNZXRob2QoaW1wb3J0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmluZF9tb2R1bGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInMiLCBmdWxsbmFtZSk7CisgICAgICAgICAgICAgICAgUHlfWERFQ1JFRihjb3B5KTsKKyAgICAgICAgICAgICAgICBpZiAobG9hZGVyID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOyAgLyogZXJyb3IgKi8KKyAgICAgICAgICAgICAgICBpZiAobG9hZGVyICE9IFB5X05vbmUpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogYSBsb2FkZXIgd2FzIGZvdW5kICovCisgICAgICAgICAgICAgICAgICAgICpwX2xvYWRlciA9IGxvYWRlcjsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICZpbXBvcnRob29rZGVzY3I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihsb2FkZXIpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8qIG5vIGhvb2sgd2FzIGZvdW5kLCB1c2UgYnVpbHRpbiBpbXBvcnQgKi8KIAotCQlpZiAobGVuID4gMCAmJiBidWZbbGVuLTFdICE9IFNFUAorICAgICAgICBpZiAobGVuID4gMCAmJiBidWZbbGVuLTFdICE9IFNFUAogI2lmZGVmIEFMVFNFUAotCQkgICAgJiYgYnVmW2xlbi0xXSAhPSBBTFRTRVAKKyAgICAgICAgICAgICYmIGJ1ZltsZW4tMV0gIT0gQUxUU0VQCiAjZW5kaWYKLQkJICAgICkKLQkJCWJ1ZltsZW4rK10gPSBTRVA7Ci0JCXN0cmNweShidWYrbGVuLCBuYW1lKTsKLQkJbGVuICs9IG5hbWVsZW47CisgICAgICAgICAgICApCisgICAgICAgICAgICBidWZbbGVuKytdID0gU0VQOworICAgICAgICBzdHJjcHkoYnVmK2xlbiwgbmFtZSk7CisgICAgICAgIGxlbiArPSBuYW1lbGVuOwogCi0JCS8qIENoZWNrIGZvciBwYWNrYWdlIGltcG9ydCAoYnVmIGhvbGRzIGEgZGlyZWN0b3J5IG5hbWUsCi0JCSAgIGFuZCB0aGVyZSdzIGFuIF9faW5pdF9fIG1vZHVsZSBpbiB0aGF0IGRpcmVjdG9yeSAqLworICAgICAgICAvKiBDaGVjayBmb3IgcGFja2FnZSBpbXBvcnQgKGJ1ZiBob2xkcyBhIGRpcmVjdG9yeSBuYW1lLAorICAgICAgICAgICBhbmQgdGhlcmUncyBhbiBfX2luaXRfXyBtb2R1bGUgaW4gdGhhdCBkaXJlY3RvcnkgKi8KICNpZmRlZiBIQVZFX1NUQVQKLQkJaWYgKHN0YXQoYnVmLCAmc3RhdGJ1ZikgPT0gMCAmJiAgICAgICAgIC8qIGl0IGV4aXN0cyAqLwotCQkgICAgU19JU0RJUihzdGF0YnVmLnN0X21vZGUpICYmICAgICAgICAgLyogaXQncyBhIGRpcmVjdG9yeSAqLwotCQkgICAgY2FzZV9vayhidWYsIGxlbiwgbmFtZWxlbiwgbmFtZSkpIHsgLyogY2FzZSBtYXRjaGVzICovCi0JCQlpZiAoZmluZF9pbml0X21vZHVsZShidWYpKSB7IC8qIGFuZCBoYXMgX19pbml0X18ucHkgKi8KLQkJCQlQeV9YREVDUkVGKGNvcHkpOwotCQkJCXJldHVybiAmZmRfcGFja2FnZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWNoYXIgd2FybnN0cltNQVhQQVRITEVOKzgwXTsKLQkJCQlzcHJpbnRmKHdhcm5zdHIsICJOb3QgaW1wb3J0aW5nIGRpcmVjdG9yeSAiCi0JCQkJCSInJS4qcyc6IG1pc3NpbmcgX19pbml0X18ucHkiLCAKLQkJCQkJTUFYUEFUSExFTiwgYnVmKTsKLQkJCQlpZiAoUHlFcnJfV2FybihQeUV4Y19JbXBvcnRXYXJuaW5nLAotCQkJCQkgICAgICAgd2FybnN0cikpIHsKLQkJCQkJUHlfWERFQ1JFRihjb3B5KTsKLQkJCQkJcmV0dXJuIE5VTEw7Ci0JCQkJfQotCQkJfQotCQl9CisgICAgICAgIGlmIChzdGF0KGJ1ZiwgJnN0YXRidWYpID09IDAgJiYgICAgICAgICAvKiBpdCBleGlzdHMgKi8KKyAgICAgICAgICAgIFNfSVNESVIoc3RhdGJ1Zi5zdF9tb2RlKSAmJiAgICAgICAgIC8qIGl0J3MgYSBkaXJlY3RvcnkgKi8KKyAgICAgICAgICAgIGNhc2Vfb2soYnVmLCBsZW4sIG5hbWVsZW4sIG5hbWUpKSB7IC8qIGNhc2UgbWF0Y2hlcyAqLworICAgICAgICAgICAgaWYgKGZpbmRfaW5pdF9tb2R1bGUoYnVmKSkgeyAvKiBhbmQgaGFzIF9faW5pdF9fLnB5ICovCisgICAgICAgICAgICAgICAgUHlfWERFQ1JFRihjb3B5KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gJmZkX3BhY2thZ2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBjaGFyIHdhcm5zdHJbTUFYUEFUSExFTis4MF07CisgICAgICAgICAgICAgICAgc3ByaW50Zih3YXJuc3RyLCAiTm90IGltcG9ydGluZyBkaXJlY3RvcnkgIgorICAgICAgICAgICAgICAgICAgICAiJyUuKnMnOiBtaXNzaW5nIF9faW5pdF9fLnB5IiwKKyAgICAgICAgICAgICAgICAgICAgTUFYUEFUSExFTiwgYnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoUHlFcnJfV2FybihQeUV4Y19JbXBvcnRXYXJuaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5zdHIpKSB7CisgICAgICAgICAgICAgICAgICAgIFB5X1hERUNSRUYoY29weSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogI2Vsc2UKLQkJLyogWFhYIEhvdyBhcmUgeW91IGdvaW5nIHRvIHRlc3QgZm9yIGRpcmVjdG9yaWVzPyAqLworICAgICAgICAvKiBYWFggSG93IGFyZSB5b3UgZ29pbmcgdG8gdGVzdCBmb3IgZGlyZWN0b3JpZXM/ICovCiAjaWZkZWYgUklTQ09TCi0JCWlmIChpc2RpcihidWYpICYmCi0JCSAgICBjYXNlX29rKGJ1ZiwgbGVuLCBuYW1lbGVuLCBuYW1lKSkgewotCQkJaWYgKGZpbmRfaW5pdF9tb2R1bGUoYnVmKSkgewotCQkJCVB5X1hERUNSRUYoY29weSk7Ci0JCQkJcmV0dXJuICZmZF9wYWNrYWdlOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJY2hhciB3YXJuc3RyW01BWFBBVEhMRU4rODBdOwotCQkJCXNwcmludGYod2FybnN0ciwgIk5vdCBpbXBvcnRpbmcgZGlyZWN0b3J5ICIKLQkJCQkJIiclLipzJzogbWlzc2luZyBfX2luaXRfXy5weSIsIAotCQkJCQlNQVhQQVRITEVOLCBidWYpOwotCQkJCWlmIChQeUVycl9XYXJuKFB5RXhjX0ltcG9ydFdhcm5pbmcsCi0JCQkJCSAgICAgICB3YXJuc3RyKSkgewotCQkJCQlQeV9YREVDUkVGKGNvcHkpOwotCQkJCQlyZXR1cm4gTlVMTDsKLQkJCQl9Ci0JCX0KKyAgICAgICAgaWYgKGlzZGlyKGJ1ZikgJiYKKyAgICAgICAgICAgIGNhc2Vfb2soYnVmLCBsZW4sIG5hbWVsZW4sIG5hbWUpKSB7CisgICAgICAgICAgICBpZiAoZmluZF9pbml0X21vZHVsZShidWYpKSB7CisgICAgICAgICAgICAgICAgUHlfWERFQ1JFRihjb3B5KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gJmZkX3BhY2thZ2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBjaGFyIHdhcm5zdHJbTUFYUEFUSExFTis4MF07CisgICAgICAgICAgICAgICAgc3ByaW50Zih3YXJuc3RyLCAiTm90IGltcG9ydGluZyBkaXJlY3RvcnkgIgorICAgICAgICAgICAgICAgICAgICAiJyUuKnMnOiBtaXNzaW5nIF9faW5pdF9fLnB5IiwKKyAgICAgICAgICAgICAgICAgICAgTUFYUEFUSExFTiwgYnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoUHlFcnJfV2FybihQeUV4Y19JbXBvcnRXYXJuaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5zdHIpKSB7CisgICAgICAgICAgICAgICAgICAgIFB5X1hERUNSRUYoY29weSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQogI2VuZGlmCiAjZW5kaWYKICNpZiBkZWZpbmVkKFBZT1NfT1MyKQotCQkvKiB0YWtlIGEgc25hcHNob3Qgb2YgdGhlIG1vZHVsZSBzcGVjIGZvciByZXN0b3JhdGlvbgotCQkgKiBhZnRlciB0aGUgOCBjaGFyYWN0ZXIgRExMIGhhY2tlcnkKLQkJICovCi0JCXNhdmVkX2J1ZiA9IHN0cmR1cChidWYpOwotCQlzYXZlZF9sZW4gPSBsZW47Ci0JCXNhdmVkX25hbWVsZW4gPSBuYW1lbGVuOworICAgICAgICAvKiB0YWtlIGEgc25hcHNob3Qgb2YgdGhlIG1vZHVsZSBzcGVjIGZvciByZXN0b3JhdGlvbgorICAgICAgICAgKiBhZnRlciB0aGUgOCBjaGFyYWN0ZXIgRExMIGhhY2tlcnkKKyAgICAgICAgICovCisgICAgICAgIHNhdmVkX2J1ZiA9IHN0cmR1cChidWYpOworICAgICAgICBzYXZlZF9sZW4gPSBsZW47CisgICAgICAgIHNhdmVkX25hbWVsZW4gPSBuYW1lbGVuOwogI2VuZGlmIC8qIFBZT1NfT1MyICovCi0JCWZvciAoZmRwID0gX1B5SW1wb3J0X0ZpbGV0YWI7IGZkcC0+c3VmZml4ICE9IE5VTEw7IGZkcCsrKSB7CisgICAgICAgIGZvciAoZmRwID0gX1B5SW1wb3J0X0ZpbGV0YWI7IGZkcC0+c3VmZml4ICE9IE5VTEw7IGZkcCsrKSB7CiAjaWYgZGVmaW5lZChQWU9TX09TMikgJiYgZGVmaW5lZChIQVZFX0RZTkFNSUNfTE9BRElORykKLQkJCS8qIE9TLzIgbGltaXRzIERMTHMgdG8gOCBjaGFyYWN0ZXIgbmFtZXMgKHcvbwotCQkJICAgZXh0ZW5zaW9uKQotCQkJICogc28gaWYgdGhlIG5hbWUgaXMgbG9uZ2VyIHRoYW4gdGhhdCBhbmQgaXRzIGEKLQkJCSAqIGR5bmFtaWNhbGx5IGxvYWRlZCBtb2R1bGUgd2UncmUgZ29pbmcgdG8gdHJ5LAotCQkJICogdHJ1bmNhdGUgdGhlIG5hbWUgYmVmb3JlIHRyeWluZwotCQkJICovCi0JCQlpZiAoc3RybGVuKHN1Ym5hbWUpID4gOCkgewotCQkJCS8qIGlzIHRoaXMgYW4gYXR0ZW1wdCB0byBsb2FkIGEgQyBleHRlbnNpb24/ICovCi0JCQkJY29uc3Qgc3RydWN0IGZpbGVkZXNjciAqc2NhbjsKLQkJCQlzY2FuID0gX1B5SW1wb3J0X0R5bkxvYWRGaWxldGFiOwotCQkJCXdoaWxlIChzY2FuLT5zdWZmaXggIT0gTlVMTCkgewotCQkJCQlpZiAoIXN0cmNtcChzY2FuLT5zdWZmaXgsIGZkcC0+c3VmZml4KSkKLQkJCQkJCWJyZWFrOwotCQkJCQllbHNlCi0JCQkJCQlzY2FuKys7Ci0JCQkJfQotCQkJCWlmIChzY2FuLT5zdWZmaXggIT0gTlVMTCkgewotCQkJCQkvKiB5ZXMsIHNvIHRydW5jYXRlIHRoZSBuYW1lICovCi0JCQkJCW5hbWVsZW4gPSA4OwotCQkJCQlsZW4gLT0gc3RybGVuKHN1Ym5hbWUpIC0gbmFtZWxlbjsKLQkJCQkJYnVmW2xlbl0gPSAnXDAnOwotCQkJCX0KLQkJCX0KKyAgICAgICAgICAgIC8qIE9TLzIgbGltaXRzIERMTHMgdG8gOCBjaGFyYWN0ZXIgbmFtZXMgKHcvbworICAgICAgICAgICAgICAgZXh0ZW5zaW9uKQorICAgICAgICAgICAgICogc28gaWYgdGhlIG5hbWUgaXMgbG9uZ2VyIHRoYW4gdGhhdCBhbmQgaXRzIGEKKyAgICAgICAgICAgICAqIGR5bmFtaWNhbGx5IGxvYWRlZCBtb2R1bGUgd2UncmUgZ29pbmcgdG8gdHJ5LAorICAgICAgICAgICAgICogdHJ1bmNhdGUgdGhlIG5hbWUgYmVmb3JlIHRyeWluZworICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoc3RybGVuKHN1Ym5hbWUpID4gOCkgeworICAgICAgICAgICAgICAgIC8qIGlzIHRoaXMgYW4gYXR0ZW1wdCB0byBsb2FkIGEgQyBleHRlbnNpb24/ICovCisgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGZpbGVkZXNjciAqc2NhbjsKKyAgICAgICAgICAgICAgICBzY2FuID0gX1B5SW1wb3J0X0R5bkxvYWRGaWxldGFiOworICAgICAgICAgICAgICAgIHdoaWxlIChzY2FuLT5zdWZmaXggIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIXN0cmNtcChzY2FuLT5zdWZmaXgsIGZkcC0+c3VmZml4KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBzY2FuKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChzY2FuLT5zdWZmaXggIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAvKiB5ZXMsIHNvIHRydW5jYXRlIHRoZSBuYW1lICovCisgICAgICAgICAgICAgICAgICAgIG5hbWVsZW4gPSA4OworICAgICAgICAgICAgICAgICAgICBsZW4gLT0gc3RybGVuKHN1Ym5hbWUpIC0gbmFtZWxlbjsKKyAgICAgICAgICAgICAgICAgICAgYnVmW2xlbl0gPSAnXDAnOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KICNlbmRpZiAvKiBQWU9TX09TMiAqLwotCQkJc3RyY3B5KGJ1ZitsZW4sIGZkcC0+c3VmZml4KTsKLQkJCWlmIChQeV9WZXJib3NlRmxhZyA+IDEpCi0JCQkJUHlTeXNfV3JpdGVTdGRlcnIoIiMgdHJ5aW5nICVzXG4iLCBidWYpOwotCQkJZmlsZW1vZGUgPSBmZHAtPm1vZGU7Ci0JCQlpZiAoZmlsZW1vZGVbMF0gPT0gJ1UnKQotCQkJCWZpbGVtb2RlID0gInIiIFBZX1NURElPVEVYVE1PREU7Ci0JCQlmcCA9IGZvcGVuKGJ1ZiwgZmlsZW1vZGUpOwotCQkJaWYgKGZwICE9IE5VTEwpIHsKLQkJCQlpZiAoY2FzZV9vayhidWYsIGxlbiwgbmFtZWxlbiwgbmFtZSkpCi0JCQkJCWJyZWFrOwotCQkJCWVsc2UgewkgLyogY29udGludWUgc2VhcmNoICovCi0JCQkJCWZjbG9zZShmcCk7Ci0JCQkJCWZwID0gTlVMTDsKLQkJCQl9Ci0JCQl9CisgICAgICAgICAgICBzdHJjcHkoYnVmK2xlbiwgZmRwLT5zdWZmaXgpOworICAgICAgICAgICAgaWYgKFB5X1ZlcmJvc2VGbGFnID4gMSkKKyAgICAgICAgICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigiIyB0cnlpbmcgJXNcbiIsIGJ1Zik7CisgICAgICAgICAgICBmaWxlbW9kZSA9IGZkcC0+bW9kZTsKKyAgICAgICAgICAgIGlmIChmaWxlbW9kZVswXSA9PSAnVScpCisgICAgICAgICAgICAgICAgZmlsZW1vZGUgPSAiciIgUFlfU1RESU9URVhUTU9ERTsKKyAgICAgICAgICAgIGZwID0gZm9wZW4oYnVmLCBmaWxlbW9kZSk7CisgICAgICAgICAgICBpZiAoZnAgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGlmIChjYXNlX29rKGJ1ZiwgbGVuLCBuYW1lbGVuLCBuYW1lKSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgIC8qIGNvbnRpbnVlIHNlYXJjaCAqLworICAgICAgICAgICAgICAgICAgICBmY2xvc2UoZnApOworICAgICAgICAgICAgICAgICAgICBmcCA9IE5VTEw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogI2lmIGRlZmluZWQoUFlPU19PUzIpCi0JCQkvKiByZXN0b3JlIHRoZSBzYXZlZCBzbmFwc2hvdCAqLwotCQkJc3RyY3B5KGJ1Ziwgc2F2ZWRfYnVmKTsKLQkJCWxlbiA9IHNhdmVkX2xlbjsKLQkJCW5hbWVsZW4gPSBzYXZlZF9uYW1lbGVuOworICAgICAgICAgICAgLyogcmVzdG9yZSB0aGUgc2F2ZWQgc25hcHNob3QgKi8KKyAgICAgICAgICAgIHN0cmNweShidWYsIHNhdmVkX2J1Zik7CisgICAgICAgICAgICBsZW4gPSBzYXZlZF9sZW47CisgICAgICAgICAgICBuYW1lbGVuID0gc2F2ZWRfbmFtZWxlbjsKICNlbmRpZgotCQl9CisgICAgICAgIH0KICNpZiBkZWZpbmVkKFBZT1NfT1MyKQotCQkvKiBkb24ndCBuZWVkL3dhbnQgdGhlIG1vZHVsZSBuYW1lIHNuYXBzaG90IGFueW1vcmUgKi8KLQkJaWYgKHNhdmVkX2J1ZikKLQkJewotCQkJZnJlZShzYXZlZF9idWYpOwotCQkJc2F2ZWRfYnVmID0gTlVMTDsKLQkJfQorICAgICAgICAvKiBkb24ndCBuZWVkL3dhbnQgdGhlIG1vZHVsZSBuYW1lIHNuYXBzaG90IGFueW1vcmUgKi8KKyAgICAgICAgaWYgKHNhdmVkX2J1ZikKKyAgICAgICAgeworICAgICAgICAgICAgZnJlZShzYXZlZF9idWYpOworICAgICAgICAgICAgc2F2ZWRfYnVmID0gTlVMTDsKKyAgICAgICAgfQogI2VuZGlmCi0JCVB5X1hERUNSRUYoY29weSk7Ci0JCWlmIChmcCAhPSBOVUxMKQotCQkJYnJlYWs7Ci0JfQotCWlmIChmcCA9PSBOVUxMKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19JbXBvcnRFcnJvciwKLQkJCSAgICAgIk5vIG1vZHVsZSBuYW1lZCAlLjIwMHMiLCBuYW1lKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCSpwX2ZwID0gZnA7Ci0JcmV0dXJuIGZkcDsKKyAgICAgICAgUHlfWERFQ1JFRihjb3B5KTsKKyAgICAgICAgaWYgKGZwICE9IE5VTEwpCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKGZwID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX0ltcG9ydEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIk5vIG1vZHVsZSBuYW1lZCAlLjIwMHMiLCBuYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgICpwX2ZwID0gZnA7CisgICAgcmV0dXJuIGZkcDsKIH0KIAogLyogSGVscGVycyBmb3IgbWFpbi5jCkBAIC0xNTE1LDE1ICsxNTE1LDE1IEBACiAgKi8KIHN0cnVjdCBmaWxlZGVzY3IgKgogX1B5SW1wb3J0X0ZpbmRNb2R1bGUoY29uc3QgY2hhciAqbmFtZSwgUHlPYmplY3QgKnBhdGgsIGNoYXIgKmJ1ZiwKLQkgICAgc2l6ZV90IGJ1ZmxlbiwgRklMRSAqKnBfZnAsIFB5T2JqZWN0ICoqcF9sb2FkZXIpCisgICAgICAgICAgICBzaXplX3QgYnVmbGVuLCBGSUxFICoqcF9mcCwgUHlPYmplY3QgKipwX2xvYWRlcikKIHsKLQlyZXR1cm4gZmluZF9tb2R1bGUoKGNoYXIgKikgbmFtZSwgKGNoYXIgKikgbmFtZSwgcGF0aCwKLQkJCSAgIGJ1ZiwgYnVmbGVuLCBwX2ZwLCBwX2xvYWRlcik7CisgICAgcmV0dXJuIGZpbmRfbW9kdWxlKChjaGFyICopIG5hbWUsIChjaGFyICopIG5hbWUsIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiwgYnVmbGVuLCBwX2ZwLCBwX2xvYWRlcik7CiB9CiAKIFB5QVBJX0ZVTkMoaW50KSBfUHlJbXBvcnRfSXNTY3JpcHQoc3RydWN0IGZpbGVkZXNjciAqIGZkKQogewotCXJldHVybiBmZC0+dHlwZSA9PSBQWV9TT1VSQ0UgfHwgZmQtPnR5cGUgPT0gUFlfQ09NUElMRUQ7CisgICAgcmV0dXJuIGZkLT50eXBlID09IFBZX1NPVVJDRSB8fCBmZC0+dHlwZSA9PSBQWV9DT01QSUxFRDsKIH0KIAogLyogY2FzZV9vayhjaGFyKiBidWYsIFB5X3NzaXplX3QgbGVuLCBQeV9zc2l6ZV90IG5hbWVsZW4sIGNoYXIqIG5hbWUpCkBAIC0xNTgyLDEyOCArMTU4MiwxMjggQEAKIAogLyogTVNfV0lORE9XUyAqLwogI2lmIGRlZmluZWQoTVNfV0lORE9XUykKLQlXSU4zMl9GSU5EX0RBVEEgZGF0YTsKLQlIQU5ETEUgaDsKKyAgICBXSU4zMl9GSU5EX0RBVEEgZGF0YTsKKyAgICBIQU5ETEUgaDsKIAotCWlmIChQeV9HRVRFTlYoIlBZVEhPTkNBU0VPSyIpICE9IE5VTEwpCi0JCXJldHVybiAxOworICAgIGlmIChQeV9HRVRFTlYoIlBZVEhPTkNBU0VPSyIpICE9IE5VTEwpCisgICAgICAgIHJldHVybiAxOwogCi0JaCA9IEZpbmRGaXJzdEZpbGUoYnVmLCAmZGF0YSk7Ci0JaWYgKGggPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX05hbWVFcnJvciwKLQkJICAiQ2FuJ3QgZmluZCBmaWxlIGZvciBtb2R1bGUgJS4xMDBzXG4oZmlsZW5hbWUgJS4zMDBzKSIsCi0JCSAgbmFtZSwgYnVmKTsKLQkJcmV0dXJuIDA7Ci0JfQotCUZpbmRDbG9zZShoKTsKLQlyZXR1cm4gc3RybmNtcChkYXRhLmNGaWxlTmFtZSwgbmFtZSwgbmFtZWxlbikgPT0gMDsKKyAgICBoID0gRmluZEZpcnN0RmlsZShidWYsICZkYXRhKTsKKyAgICBpZiAoaCA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfTmFtZUVycm9yLAorICAgICAgICAgICJDYW4ndCBmaW5kIGZpbGUgZm9yIG1vZHVsZSAlLjEwMHNcbihmaWxlbmFtZSAlLjMwMHMpIiwKKyAgICAgICAgICBuYW1lLCBidWYpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgRmluZENsb3NlKGgpOworICAgIHJldHVybiBzdHJuY21wKGRhdGEuY0ZpbGVOYW1lLCBuYW1lLCBuYW1lbGVuKSA9PSAwOwogCiAvKiBESkdQUCAqLwogI2VsaWYgZGVmaW5lZChESkdQUCkKLQlzdHJ1Y3QgZmZibGsgZmZibGs7Ci0JaW50IGRvbmU7CisgICAgc3RydWN0IGZmYmxrIGZmYmxrOworICAgIGludCBkb25lOwogCi0JaWYgKFB5X0dFVEVOVigiUFlUSE9OQ0FTRU9LIikgIT0gTlVMTCkKLQkJcmV0dXJuIDE7CisgICAgaWYgKFB5X0dFVEVOVigiUFlUSE9OQ0FTRU9LIikgIT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIDE7CiAKLQlkb25lID0gZmluZGZpcnN0KGJ1ZiwgJmZmYmxrLCBGQV9BUkNIfEZBX1JET05MWXxGQV9ISURERU58RkFfRElSRUMpOwotCWlmIChkb25lKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19OYW1lRXJyb3IsCi0JCSAgIkNhbid0IGZpbmQgZmlsZSBmb3IgbW9kdWxlICUuMTAwc1xuKGZpbGVuYW1lICUuMzAwcykiLAotCQkgIG5hbWUsIGJ1Zik7Ci0JCXJldHVybiAwOwotCX0KLQlyZXR1cm4gc3RybmNtcChmZmJsay5mZl9uYW1lLCBuYW1lLCBuYW1lbGVuKSA9PSAwOworICAgIGRvbmUgPSBmaW5kZmlyc3QoYnVmLCAmZmZibGssIEZBX0FSQ0h8RkFfUkRPTkxZfEZBX0hJRERFTnxGQV9ESVJFQyk7CisgICAgaWYgKGRvbmUpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX05hbWVFcnJvciwKKyAgICAgICAgICAiQ2FuJ3QgZmluZCBmaWxlIGZvciBtb2R1bGUgJS4xMDBzXG4oZmlsZW5hbWUgJS4zMDBzKSIsCisgICAgICAgICAgbmFtZSwgYnVmKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiBzdHJuY21wKGZmYmxrLmZmX25hbWUsIG5hbWUsIG5hbWVsZW4pID09IDA7CiAKIC8qIG5ldy1mYW5nbGVkIG1hY2ludG9zaCAobWFjb3N4KSBvciBDeWd3aW4gKi8KICNlbGlmIChkZWZpbmVkKF9fTUFDSF9fKSAmJiBkZWZpbmVkKF9fQVBQTEVfXykgfHwgZGVmaW5lZChfX0NZR1dJTl9fKSkgJiYgZGVmaW5lZChIQVZFX0RJUkVOVF9IKQotCURJUiAqZGlycDsKLQlzdHJ1Y3QgZGlyZW50ICpkcDsKLQljaGFyIGRpcm5hbWVbTUFYUEFUSExFTiArIDFdOwotCWNvbnN0IGludCBkaXJsZW4gPSBsZW4gLSBuYW1lbGVuIC0gMTsgLyogZG9uJ3Qgd2FudCB0cmFpbGluZyBTRVAgKi8KKyAgICBESVIgKmRpcnA7CisgICAgc3RydWN0IGRpcmVudCAqZHA7CisgICAgY2hhciBkaXJuYW1lW01BWFBBVEhMRU4gKyAxXTsKKyAgICBjb25zdCBpbnQgZGlybGVuID0gbGVuIC0gbmFtZWxlbiAtIDE7IC8qIGRvbid0IHdhbnQgdHJhaWxpbmcgU0VQICovCiAKLQlpZiAoUHlfR0VURU5WKCJQWVRIT05DQVNFT0siKSAhPSBOVUxMKQotCQlyZXR1cm4gMTsKKyAgICBpZiAoUHlfR0VURU5WKCJQWVRIT05DQVNFT0siKSAhPSBOVUxMKQorICAgICAgICByZXR1cm4gMTsKIAotCS8qIENvcHkgdGhlIGRpciBjb21wb25lbnQgaW50byBkaXJuYW1lOyBzdWJzdGl0dXRlICIuIiBpZiBlbXB0eSAqLwotCWlmIChkaXJsZW4gPD0gMCkgewotCQlkaXJuYW1lWzBdID0gJy4nOwotCQlkaXJuYW1lWzFdID0gJ1wwJzsKLQl9Ci0JZWxzZSB7Ci0JCWFzc2VydChkaXJsZW4gPD0gTUFYUEFUSExFTik7Ci0JCW1lbWNweShkaXJuYW1lLCBidWYsIGRpcmxlbik7Ci0JCWRpcm5hbWVbZGlybGVuXSA9ICdcMCc7Ci0JfQotCS8qIE9wZW4gdGhlIGRpcmVjdG9yeSBhbmQgc2VhcmNoIHRoZSBlbnRyaWVzIGZvciBhbiBleGFjdCBtYXRjaC4gKi8KLQlkaXJwID0gb3BlbmRpcihkaXJuYW1lKTsKLQlpZiAoZGlycCkgewotCQljaGFyICpuYW1lV2l0aEV4dCA9IGJ1ZiArIGxlbiAtIG5hbWVsZW47Ci0JCXdoaWxlICgoZHAgPSByZWFkZGlyKGRpcnApKSAhPSBOVUxMKSB7Ci0JCQljb25zdCBpbnQgdGhpc2xlbiA9CisgICAgLyogQ29weSB0aGUgZGlyIGNvbXBvbmVudCBpbnRvIGRpcm5hbWU7IHN1YnN0aXR1dGUgIi4iIGlmIGVtcHR5ICovCisgICAgaWYgKGRpcmxlbiA8PSAwKSB7CisgICAgICAgIGRpcm5hbWVbMF0gPSAnLic7CisgICAgICAgIGRpcm5hbWVbMV0gPSAnXDAnOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgYXNzZXJ0KGRpcmxlbiA8PSBNQVhQQVRITEVOKTsKKyAgICAgICAgbWVtY3B5KGRpcm5hbWUsIGJ1ZiwgZGlybGVuKTsKKyAgICAgICAgZGlybmFtZVtkaXJsZW5dID0gJ1wwJzsKKyAgICB9CisgICAgLyogT3BlbiB0aGUgZGlyZWN0b3J5IGFuZCBzZWFyY2ggdGhlIGVudHJpZXMgZm9yIGFuIGV4YWN0IG1hdGNoLiAqLworICAgIGRpcnAgPSBvcGVuZGlyKGRpcm5hbWUpOworICAgIGlmIChkaXJwKSB7CisgICAgICAgIGNoYXIgKm5hbWVXaXRoRXh0ID0gYnVmICsgbGVuIC0gbmFtZWxlbjsKKyAgICAgICAgd2hpbGUgKChkcCA9IHJlYWRkaXIoZGlycCkpICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGNvbnN0IGludCB0aGlzbGVuID0KICNpZmRlZiBfRElSRU5UX0hBVkVfRF9OQU1FTEVOCi0JCQkJCQlkcC0+ZF9uYW1sZW47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcC0+ZF9uYW1sZW47CiAjZWxzZQotCQkJCQkJc3RybGVuKGRwLT5kX25hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RybGVuKGRwLT5kX25hbWUpOwogI2VuZGlmCi0JCQlpZiAodGhpc2xlbiA+PSBuYW1lbGVuICYmCi0JCQkgICAgc3RyY21wKGRwLT5kX25hbWUsIG5hbWVXaXRoRXh0KSA9PSAwKSB7Ci0JCQkJKHZvaWQpY2xvc2VkaXIoZGlycCk7Ci0JCQkJcmV0dXJuIDE7IC8qIEZvdW5kICovCi0JCQl9Ci0JCX0KLQkJKHZvaWQpY2xvc2VkaXIoZGlycCk7Ci0JfQotCXJldHVybiAwIDsgLyogTm90IGZvdW5kICovCisgICAgICAgICAgICBpZiAodGhpc2xlbiA+PSBuYW1lbGVuICYmCisgICAgICAgICAgICAgICAgc3RyY21wKGRwLT5kX25hbWUsIG5hbWVXaXRoRXh0KSA9PSAwKSB7CisgICAgICAgICAgICAgICAgKHZvaWQpY2xvc2VkaXIoZGlycCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7IC8qIEZvdW5kICovCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgKHZvaWQpY2xvc2VkaXIoZGlycCk7CisgICAgfQorICAgIHJldHVybiAwIDsgLyogTm90IGZvdW5kICovCiAKIC8qIFJJU0MgT1MgKi8KICNlbGlmIGRlZmluZWQoUklTQ09TKQotCWNoYXIgY2Fub25bTUFYUEFUSExFTisxXTsgLyogYnVmZmVyIGZvciB0aGUgY2Fub25pY2FsIGZvcm0gb2YgdGhlIHBhdGggKi8KLQljaGFyIGJ1ZjJbTUFYUEFUSExFTisyXTsKLQljaGFyICpuYW1lV2l0aEV4dCA9IGJ1ZitsZW4tbmFtZWxlbjsKLQlpbnQgY2Fub25sZW47Ci0Jb3NfZXJyb3IgKmU7CisgICAgY2hhciBjYW5vbltNQVhQQVRITEVOKzFdOyAvKiBidWZmZXIgZm9yIHRoZSBjYW5vbmljYWwgZm9ybSBvZiB0aGUgcGF0aCAqLworICAgIGNoYXIgYnVmMltNQVhQQVRITEVOKzJdOworICAgIGNoYXIgKm5hbWVXaXRoRXh0ID0gYnVmK2xlbi1uYW1lbGVuOworICAgIGludCBjYW5vbmxlbjsKKyAgICBvc19lcnJvciAqZTsKIAotCWlmIChQeV9HRVRFTlYoIlBZVEhPTkNBU0VPSyIpICE9IE5VTEwpCi0JCXJldHVybiAxOworICAgIGlmIChQeV9HRVRFTlYoIlBZVEhPTkNBU0VPSyIpICE9IE5VTEwpCisgICAgICAgIHJldHVybiAxOwogCi0JLyogd29ya2Fyb3VuZDoKLQkgICBhcHBlbmQgd2lsZGNhcmQsIG90aGVyd2lzZSBjYXNlIG9mIGZpbGVuYW1lIHdvdWxkbid0IGJlIHRvdWNoZWQgKi8KLQlzdHJjcHkoYnVmMiwgYnVmKTsKLQlzdHJjYXQoYnVmMiwgIioiKTsKKyAgICAvKiB3b3JrYXJvdW5kOgorICAgICAgIGFwcGVuZCB3aWxkY2FyZCwgb3RoZXJ3aXNlIGNhc2Ugb2YgZmlsZW5hbWUgd291bGRuJ3QgYmUgdG91Y2hlZCAqLworICAgIHN0cmNweShidWYyLCBidWYpOworICAgIHN0cmNhdChidWYyLCAiKiIpOwogCi0JZSA9IHhvc2ZzY29udHJvbF9jYW5vbmljYWxpc2VfcGF0aChidWYyLGNhbm9uLDAsMCxNQVhQQVRITEVOKzEsJmNhbm9ubGVuKTsKLQljYW5vbmxlbiA9IE1BWFBBVEhMRU4rMS1jYW5vbmxlbjsKLQlpZiAoZSB8fCBjYW5vbmxlbjw9MCB8fCBjYW5vbmxlbj4oTUFYUEFUSExFTisxKSApCi0JCXJldHVybiAwOwotCWlmIChzdHJjbXAobmFtZVdpdGhFeHQsIGNhbm9uK2Nhbm9ubGVuLXN0cmxlbihuYW1lV2l0aEV4dCkpPT0wKQotCQlyZXR1cm4gMTsgLyogbWF0Y2ggKi8KKyAgICBlID0geG9zZnNjb250cm9sX2Nhbm9uaWNhbGlzZV9wYXRoKGJ1ZjIsY2Fub24sMCwwLE1BWFBBVEhMRU4rMSwmY2Fub25sZW4pOworICAgIGNhbm9ubGVuID0gTUFYUEFUSExFTisxLWNhbm9ubGVuOworICAgIGlmIChlIHx8IGNhbm9ubGVuPD0wIHx8IGNhbm9ubGVuPihNQVhQQVRITEVOKzEpICkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKHN0cmNtcChuYW1lV2l0aEV4dCwgY2Fub24rY2Fub25sZW4tc3RybGVuKG5hbWVXaXRoRXh0KSk9PTApCisgICAgICAgIHJldHVybiAxOyAvKiBtYXRjaCAqLwogCi0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiAKIC8qIE9TLzIgKi8KICNlbGlmIGRlZmluZWQoUFlPU19PUzIpCi0JSERJUiBoZGlyID0gMTsKLQlVTE9ORyBzcmNoY250ID0gMTsKLQlGSUxFRklOREJVRjMgZmZidWY7Ci0JQVBJUkVUIHJjOworICAgIEhESVIgaGRpciA9IDE7CisgICAgVUxPTkcgc3JjaGNudCA9IDE7CisgICAgRklMRUZJTkRCVUYzIGZmYnVmOworICAgIEFQSVJFVCByYzsKIAotCWlmIChQeV9HRVRFTlYoIlBZVEhPTkNBU0VPSyIpICE9IE5VTEwpCi0JCXJldHVybiAxOworICAgIGlmIChQeV9HRVRFTlYoIlBZVEhPTkNBU0VPSyIpICE9IE5VTEwpCisgICAgICAgIHJldHVybiAxOwogCi0JcmMgPSBEb3NGaW5kRmlyc3QoYnVmLAotCQkJICAmaGRpciwKLQkJCSAgRklMRV9SRUFET05MWSB8IEZJTEVfSElEREVOIHwgRklMRV9TWVNURU0gfCBGSUxFX0RJUkVDVE9SWSwKLQkJCSAgJmZmYnVmLCBzaXplb2YoZmZidWYpLAotCQkJICAmc3JjaGNudCwKLQkJCSAgRklMX1NUQU5EQVJEKTsKLQlpZiAocmMgIT0gTk9fRVJST1IpCi0JCXJldHVybiAwOwotCXJldHVybiBzdHJuY21wKGZmYnVmLmFjaE5hbWUsIG5hbWUsIG5hbWVsZW4pID09IDA7CisgICAgcmMgPSBEb3NGaW5kRmlyc3QoYnVmLAorICAgICAgICAgICAgICAgICAgICAgICZoZGlyLAorICAgICAgICAgICAgICAgICAgICAgIEZJTEVfUkVBRE9OTFkgfCBGSUxFX0hJRERFTiB8IEZJTEVfU1lTVEVNIHwgRklMRV9ESVJFQ1RPUlksCisgICAgICAgICAgICAgICAgICAgICAgJmZmYnVmLCBzaXplb2YoZmZidWYpLAorICAgICAgICAgICAgICAgICAgICAgICZzcmNoY250LAorICAgICAgICAgICAgICAgICAgICAgIEZJTF9TVEFOREFSRCk7CisgICAgaWYgKHJjICE9IE5PX0VSUk9SKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gc3RybmNtcChmZmJ1Zi5hY2hOYW1lLCBuYW1lLCBuYW1lbGVuKSA9PSAwOwogCiAvKiBhc3N1bWluZyBpdCdzIGEgY2FzZS1zZW5zaXRpdmUgZmlsZXN5c3RlbSwgc28gdGhlcmUncyBub3RoaW5nIHRvIGRvISAqLwogI2Vsc2UKLQlyZXR1cm4gMTsKKyAgICByZXR1cm4gMTsKIAogI2VuZGlmCiB9CkBAIC0xNzE0LDQ2ICsxNzE0LDQ2IEBACiBzdGF0aWMgaW50CiBmaW5kX2luaXRfbW9kdWxlKGNoYXIgKmJ1ZikKIHsKLQljb25zdCBzaXplX3Qgc2F2ZV9sZW4gPSBzdHJsZW4oYnVmKTsKLQlzaXplX3QgaSA9IHNhdmVfbGVuOwotCWNoYXIgKnBuYW1lOyAgLyogcG9pbnRlciB0byBzdGFydCBvZiBfX2luaXRfXyAqLwotCXN0cnVjdCBzdGF0IHN0YXRidWY7CisgICAgY29uc3Qgc2l6ZV90IHNhdmVfbGVuID0gc3RybGVuKGJ1Zik7CisgICAgc2l6ZV90IGkgPSBzYXZlX2xlbjsKKyAgICBjaGFyICpwbmFtZTsgIC8qIHBvaW50ZXIgdG8gc3RhcnQgb2YgX19pbml0X18gKi8KKyAgICBzdHJ1Y3Qgc3RhdCBzdGF0YnVmOwogCi0vKglGb3IgY2FsbGluZyBjYXNlX29rKGJ1ZiwgbGVuLCBuYW1lbGVuLCBuYW1lKToKLSAqCS9hL2IvYy9kL2UvZi9nL2gvaS9qL2svc29tZV9sb25nX21vZHVsZV9uYW1lLnB5XDAKLSAqCV4gICAgICAgICAgICAgICAgICAgICAgXiAgICAgICAgICAgICAgICAgICBeICAgIF4KLSAqCXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0gYnVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKLSAqCXwtLS0tLS0tLS0tLS0tLS0tLS0tIGxlbiAtLS0tLS0tLS0tLS0tLS0tLS18Ci0gKgkgICAgICAgICAgICAgICAgICAgICAgIHwtLS0tLS0gbmFtZSAtLS0tLS0tfAotICoJICAgICAgICAgICAgICAgICAgICAgICB8LS0tLS0gbmFtZWxlbiAtLS0tLXwKKy8qICAgICAgRm9yIGNhbGxpbmcgY2FzZV9vayhidWYsIGxlbiwgbmFtZWxlbiwgbmFtZSk6CisgKiAgICAgIC9hL2IvYy9kL2UvZi9nL2gvaS9qL2svc29tZV9sb25nX21vZHVsZV9uYW1lLnB5XDAKKyAqICAgICAgXiAgICAgICAgICAgICAgICAgICAgICBeICAgICAgICAgICAgICAgICAgIF4gICAgXgorICogICAgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tIGJ1ZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgKiAgICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tIGxlbiAtLS0tLS0tLS0tLS0tLS0tLS18CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfC0tLS0tLSBuYW1lIC0tLS0tLS18CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfC0tLS0tIG5hbWVsZW4gLS0tLS18CiAgKi8KLQlpZiAoc2F2ZV9sZW4gKyAxMyA+PSBNQVhQQVRITEVOKQotCQlyZXR1cm4gMDsKLQlidWZbaSsrXSA9IFNFUDsKLQlwbmFtZSA9IGJ1ZiArIGk7Ci0Jc3RyY3B5KHBuYW1lLCAiX19pbml0X18ucHkiKTsKLQlpZiAoc3RhdChidWYsICZzdGF0YnVmKSA9PSAwKSB7Ci0JCWlmIChjYXNlX29rKGJ1ZiwKLQkJCSAgICBzYXZlX2xlbiArIDksCS8qIGxlbigiL19faW5pdF9fIikgKi8KLQkJICAgICAgICAgICAgOCwgICAJCS8qIGxlbigiX19pbml0X18iKSAqLwotCQkgICAgICAgICAgICBwbmFtZSkpIHsKLQkJCWJ1ZltzYXZlX2xlbl0gPSAnXDAnOwotCQkJcmV0dXJuIDE7Ci0JCX0KLQl9Ci0JaSArPSBzdHJsZW4ocG5hbWUpOwotCXN0cmNweShidWYraSwgUHlfT3B0aW1pemVGbGFnID8gIm8iIDogImMiKTsKLQlpZiAoc3RhdChidWYsICZzdGF0YnVmKSA9PSAwKSB7Ci0JCWlmIChjYXNlX29rKGJ1ZiwKLQkJCSAgICBzYXZlX2xlbiArIDksCS8qIGxlbigiL19faW5pdF9fIikgKi8KLQkJICAgICAgICAgICAgOCwgICAJCS8qIGxlbigiX19pbml0X18iKSAqLwotCQkgICAgICAgICAgICBwbmFtZSkpIHsKLQkJCWJ1ZltzYXZlX2xlbl0gPSAnXDAnOwotCQkJcmV0dXJuIDE7Ci0JCX0KLQl9Ci0JYnVmW3NhdmVfbGVuXSA9ICdcMCc7Ci0JcmV0dXJuIDA7CisgICAgaWYgKHNhdmVfbGVuICsgMTMgPj0gTUFYUEFUSExFTikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgYnVmW2krK10gPSBTRVA7CisgICAgcG5hbWUgPSBidWYgKyBpOworICAgIHN0cmNweShwbmFtZSwgIl9faW5pdF9fLnB5Iik7CisgICAgaWYgKHN0YXQoYnVmLCAmc3RhdGJ1ZikgPT0gMCkgeworICAgICAgICBpZiAoY2FzZV9vayhidWYsCisgICAgICAgICAgICAgICAgICAgIHNhdmVfbGVuICsgOSwgICAgICAgICAgICAgICAvKiBsZW4oIi9fX2luaXRfXyIpICovCisgICAgICAgICAgICAgICAgOCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsZW4oIl9faW5pdF9fIikgKi8KKyAgICAgICAgICAgICAgICBwbmFtZSkpIHsKKyAgICAgICAgICAgIGJ1ZltzYXZlX2xlbl0gPSAnXDAnOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICB9CisgICAgaSArPSBzdHJsZW4ocG5hbWUpOworICAgIHN0cmNweShidWYraSwgUHlfT3B0aW1pemVGbGFnID8gIm8iIDogImMiKTsKKyAgICBpZiAoc3RhdChidWYsICZzdGF0YnVmKSA9PSAwKSB7CisgICAgICAgIGlmIChjYXNlX29rKGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgc2F2ZV9sZW4gKyA5LCAgICAgICAgICAgICAgIC8qIGxlbigiL19faW5pdF9fIikgKi8KKyAgICAgICAgICAgICAgICA4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxlbigiX19pbml0X18iKSAqLworICAgICAgICAgICAgICAgIHBuYW1lKSkgeworICAgICAgICAgICAgYnVmW3NhdmVfbGVuXSA9ICdcMCc7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBidWZbc2F2ZV9sZW5dID0gJ1wwJzsKKyAgICByZXR1cm4gMDsKIH0KIAogI2Vsc2UKQEAgLTE3NjEsMzAgKzE3NjEsMzAgQEAKICNpZmRlZiBSSVNDT1MKIHN0YXRpYyBpbnQKIGZpbmRfaW5pdF9tb2R1bGUoYnVmKQotCWNoYXIgKmJ1ZjsKKyAgICBjaGFyICpidWY7CiB7Ci0JaW50IHNhdmVfbGVuID0gc3RybGVuKGJ1Zik7Ci0JaW50IGkgPSBzYXZlX2xlbjsKKyAgICBpbnQgc2F2ZV9sZW4gPSBzdHJsZW4oYnVmKTsKKyAgICBpbnQgaSA9IHNhdmVfbGVuOwogCi0JaWYgKHNhdmVfbGVuICsgMTMgPj0gTUFYUEFUSExFTikKLQkJcmV0dXJuIDA7Ci0JYnVmW2krK10gPSBTRVA7Ci0Jc3RyY3B5KGJ1ZitpLCAiX19pbml0X18vcHkiKTsKLQlpZiAoaXNmaWxlKGJ1ZikpIHsKLQkJYnVmW3NhdmVfbGVuXSA9ICdcMCc7Ci0JCXJldHVybiAxOwotCX0KKyAgICBpZiAoc2F2ZV9sZW4gKyAxMyA+PSBNQVhQQVRITEVOKQorICAgICAgICByZXR1cm4gMDsKKyAgICBidWZbaSsrXSA9IFNFUDsKKyAgICBzdHJjcHkoYnVmK2ksICJfX2luaXRfXy9weSIpOworICAgIGlmIChpc2ZpbGUoYnVmKSkgeworICAgICAgICBidWZbc2F2ZV9sZW5dID0gJ1wwJzsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQogCi0JaWYgKFB5X09wdGltaXplRmxhZykKLQkJc3RyY3B5KGJ1ZitpLCAibyIpOwotCWVsc2UKLQkJc3RyY3B5KGJ1ZitpLCAiYyIpOwotCWlmIChpc2ZpbGUoYnVmKSkgewotCQlidWZbc2F2ZV9sZW5dID0gJ1wwJzsKLQkJcmV0dXJuIDE7Ci0JfQotCWJ1ZltzYXZlX2xlbl0gPSAnXDAnOwotCXJldHVybiAwOworICAgIGlmIChQeV9PcHRpbWl6ZUZsYWcpCisgICAgICAgIHN0cmNweShidWYraSwgIm8iKTsKKyAgICBlbHNlCisgICAgICAgIHN0cmNweShidWYraSwgImMiKTsKKyAgICBpZiAoaXNmaWxlKGJ1ZikpIHsKKyAgICAgICAgYnVmW3NhdmVfbGVuXSA9ICdcMCc7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBidWZbc2F2ZV9sZW5dID0gJ1wwJzsKKyAgICByZXR1cm4gMDsKIH0KICNlbmRpZiAvKlJJU0NPUyovCiAKQEAgLTE3OTksOTMgKzE3OTksOTMgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBsb2FkX21vZHVsZShjaGFyICpuYW1lLCBGSUxFICpmcCwgY2hhciAqYnVmLCBpbnQgdHlwZSwgUHlPYmplY3QgKmxvYWRlcikKIHsKLQlQeU9iamVjdCAqbW9kdWxlczsKLQlQeU9iamVjdCAqbTsKLQlpbnQgZXJyOworICAgIFB5T2JqZWN0ICptb2R1bGVzOworICAgIFB5T2JqZWN0ICptOworICAgIGludCBlcnI7CiAKLQkvKiBGaXJzdCBjaGVjayB0aGF0IHRoZXJlJ3MgYW4gb3BlbiBmaWxlIChpZiB3ZSBuZWVkIG9uZSkgICovCi0Jc3dpdGNoICh0eXBlKSB7Ci0JY2FzZSBQWV9TT1VSQ0U6Ci0JY2FzZSBQWV9DT01QSUxFRDoKLQkJaWYgKGZwID09IE5VTEwpIHsKLQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAotCQkJICAgImZpbGUgb2JqZWN0IHJlcXVpcmVkIGZvciBpbXBvcnQgKHR5cGUgY29kZSAlZCkiLAotCQkJCSAgICAgdHlwZSk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KKyAgICAvKiBGaXJzdCBjaGVjayB0aGF0IHRoZXJlJ3MgYW4gb3BlbiBmaWxlIChpZiB3ZSBuZWVkIG9uZSkgICovCisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBQWV9TT1VSQ0U6CisgICAgY2FzZSBQWV9DT01QSUxFRDoKKyAgICAgICAgaWYgKGZwID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgImZpbGUgb2JqZWN0IHJlcXVpcmVkIGZvciBpbXBvcnQgKHR5cGUgY29kZSAlZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CiAKLQlzd2l0Y2ggKHR5cGUpIHsKKyAgICBzd2l0Y2ggKHR5cGUpIHsKIAotCWNhc2UgUFlfU09VUkNFOgotCQltID0gbG9hZF9zb3VyY2VfbW9kdWxlKG5hbWUsIGJ1ZiwgZnApOwotCQlicmVhazsKKyAgICBjYXNlIFBZX1NPVVJDRToKKyAgICAgICAgbSA9IGxvYWRfc291cmNlX21vZHVsZShuYW1lLCBidWYsIGZwKTsKKyAgICAgICAgYnJlYWs7CiAKLQljYXNlIFBZX0NPTVBJTEVEOgotCQltID0gbG9hZF9jb21waWxlZF9tb2R1bGUobmFtZSwgYnVmLCBmcCk7Ci0JCWJyZWFrOworICAgIGNhc2UgUFlfQ09NUElMRUQ6CisgICAgICAgIG0gPSBsb2FkX2NvbXBpbGVkX21vZHVsZShuYW1lLCBidWYsIGZwKTsKKyAgICAgICAgYnJlYWs7CiAKICNpZmRlZiBIQVZFX0RZTkFNSUNfTE9BRElORwotCWNhc2UgQ19FWFRFTlNJT046Ci0JCW0gPSBfUHlJbXBvcnRfTG9hZER5bmFtaWNNb2R1bGUobmFtZSwgYnVmLCBmcCk7Ci0JCWJyZWFrOworICAgIGNhc2UgQ19FWFRFTlNJT046CisgICAgICAgIG0gPSBfUHlJbXBvcnRfTG9hZER5bmFtaWNNb2R1bGUobmFtZSwgYnVmLCBmcCk7CisgICAgICAgIGJyZWFrOwogI2VuZGlmCiAKLQljYXNlIFBLR19ESVJFQ1RPUlk6Ci0JCW0gPSBsb2FkX3BhY2thZ2UobmFtZSwgYnVmKTsKLQkJYnJlYWs7CisgICAgY2FzZSBQS0dfRElSRUNUT1JZOgorICAgICAgICBtID0gbG9hZF9wYWNrYWdlKG5hbWUsIGJ1Zik7CisgICAgICAgIGJyZWFrOwogCi0JY2FzZSBDX0JVSUxUSU46Ci0JY2FzZSBQWV9GUk9aRU46Ci0JCWlmIChidWYgIT0gTlVMTCAmJiBidWZbMF0gIT0gJ1wwJykKLQkJCW5hbWUgPSBidWY7Ci0JCWlmICh0eXBlID09IENfQlVJTFRJTikKLQkJCWVyciA9IGluaXRfYnVpbHRpbihuYW1lKTsKLQkJZWxzZQotCQkJZXJyID0gUHlJbXBvcnRfSW1wb3J0RnJvemVuTW9kdWxlKG5hbWUpOwotCQlpZiAoZXJyIDwgMCkKLQkJCXJldHVybiBOVUxMOwotCQlpZiAoZXJyID09IDApIHsKLQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19JbXBvcnRFcnJvciwKLQkJCQkgICAgICJQdXJwb3J0ZWQgJXMgbW9kdWxlICUuMjAwcyBub3QgZm91bmQiLAotCQkJCSAgICAgdHlwZSA9PSBDX0JVSUxUSU4gPwotCQkJCQkJImJ1aWx0aW4iIDogImZyb3plbiIsCi0JCQkJICAgICBuYW1lKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCW1vZHVsZXMgPSBQeUltcG9ydF9HZXRNb2R1bGVEaWN0KCk7Ci0JCW0gPSBQeURpY3RfR2V0SXRlbVN0cmluZyhtb2R1bGVzLCBuYW1lKTsKLQkJaWYgKG0gPT0gTlVMTCkgewotCQkJUHlFcnJfRm9ybWF0KAotCQkJCVB5RXhjX0ltcG9ydEVycm9yLAotCQkJCSIlcyBtb2R1bGUgJS4yMDBzIG5vdCBwcm9wZXJseSBpbml0aWFsaXplZCIsCi0JCQkJdHlwZSA9PSBDX0JVSUxUSU4gPwotCQkJCQkiYnVpbHRpbiIgOiAiZnJvemVuIiwKLQkJCQluYW1lKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCVB5X0lOQ1JFRihtKTsKLQkJYnJlYWs7CisgICAgY2FzZSBDX0JVSUxUSU46CisgICAgY2FzZSBQWV9GUk9aRU46CisgICAgICAgIGlmIChidWYgIT0gTlVMTCAmJiBidWZbMF0gIT0gJ1wwJykKKyAgICAgICAgICAgIG5hbWUgPSBidWY7CisgICAgICAgIGlmICh0eXBlID09IENfQlVJTFRJTikKKyAgICAgICAgICAgIGVyciA9IGluaXRfYnVpbHRpbihuYW1lKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZXJyID0gUHlJbXBvcnRfSW1wb3J0RnJvemVuTW9kdWxlKG5hbWUpOworICAgICAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBpZiAoZXJyID09IDApIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19JbXBvcnRFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiUHVycG9ydGVkICVzIG1vZHVsZSAlLjIwMHMgbm90IGZvdW5kIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID09IENfQlVJTFRJTiA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnVpbHRpbiIgOiAiZnJvemVuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIG1vZHVsZXMgPSBQeUltcG9ydF9HZXRNb2R1bGVEaWN0KCk7CisgICAgICAgIG0gPSBQeURpY3RfR2V0SXRlbVN0cmluZyhtb2R1bGVzLCBuYW1lKTsKKyAgICAgICAgaWYgKG0gPT0gTlVMTCkgeworICAgICAgICAgICAgUHlFcnJfRm9ybWF0KAorICAgICAgICAgICAgICAgIFB5RXhjX0ltcG9ydEVycm9yLAorICAgICAgICAgICAgICAgICIlcyBtb2R1bGUgJS4yMDBzIG5vdCBwcm9wZXJseSBpbml0aWFsaXplZCIsCisgICAgICAgICAgICAgICAgdHlwZSA9PSBDX0JVSUxUSU4gPworICAgICAgICAgICAgICAgICAgICAiYnVpbHRpbiIgOiAiZnJvemVuIiwKKyAgICAgICAgICAgICAgICBuYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIFB5X0lOQ1JFRihtKTsKKyAgICAgICAgYnJlYWs7CiAKLQljYXNlIElNUF9IT09LOiB7Ci0JCWlmIChsb2FkZXIgPT0gTlVMTCkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0ltcG9ydEVycm9yLAotCQkJCQkiaW1wb3J0IGhvb2sgd2l0aG91dCBsb2FkZXIiKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCW0gPSBQeU9iamVjdF9DYWxsTWV0aG9kKGxvYWRlciwgImxvYWRfbW9kdWxlIiwgInMiLCBuYW1lKTsKLQkJYnJlYWs7Ci0JfQorICAgIGNhc2UgSU1QX0hPT0s6IHsKKyAgICAgICAgaWYgKGxvYWRlciA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW1wb3J0RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImltcG9ydCBob29rIHdpdGhvdXQgbG9hZGVyIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBtID0gUHlPYmplY3RfQ2FsbE1ldGhvZChsb2FkZXIsICJsb2FkX21vZHVsZSIsICJzIiwgbmFtZSk7CisgICAgICAgIGJyZWFrOworICAgIH0KIAotCWRlZmF1bHQ6Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19JbXBvcnRFcnJvciwKLQkJCSAgICAgIkRvbid0IGtub3cgaG93IHRvIGltcG9ydCAlLjIwMHMgKHR5cGUgY29kZSAlZCkiLAotCQkJICAgICAgbmFtZSwgdHlwZSk7Ci0JCW0gPSBOVUxMOworICAgIGRlZmF1bHQ6CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19JbXBvcnRFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJEb24ndCBrbm93IGhvdyB0byBpbXBvcnQgJS4yMDBzICh0eXBlIGNvZGUgJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICBuYW1lLCB0eXBlKTsKKyAgICAgICAgbSA9IE5VTEw7CiAKLQl9CisgICAgfQogCi0JcmV0dXJuIG07CisgICAgcmV0dXJuIG07CiB9CiAKIApAQCAtMTg5NiwzMCArMTg5NiwzMCBAQAogc3RhdGljIGludAogaW5pdF9idWlsdGluKGNoYXIgKm5hbWUpCiB7Ci0Jc3RydWN0IF9pbml0dGFiICpwOworICAgIHN0cnVjdCBfaW5pdHRhYiAqcDsKIAotCWlmIChfUHlJbXBvcnRfRmluZEV4dGVuc2lvbihuYW1lLCBuYW1lKSAhPSBOVUxMKQotCQlyZXR1cm4gMTsKKyAgICBpZiAoX1B5SW1wb3J0X0ZpbmRFeHRlbnNpb24obmFtZSwgbmFtZSkgIT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIDE7CiAKLQlmb3IgKHAgPSBQeUltcG9ydF9Jbml0dGFiOyBwLT5uYW1lICE9IE5VTEw7IHArKykgewotCQlpZiAoc3RyY21wKG5hbWUsIHAtPm5hbWUpID09IDApIHsKLQkJCWlmIChwLT5pbml0ZnVuYyA9PSBOVUxMKSB7Ci0JCQkJUHlFcnJfRm9ybWF0KFB5RXhjX0ltcG9ydEVycm9yLAotCQkJCSAgICAiQ2Fubm90IHJlLWluaXQgaW50ZXJuYWwgbW9kdWxlICUuMjAwcyIsCi0JCQkJICAgIG5hbWUpOwotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJCWlmIChQeV9WZXJib3NlRmxhZykKLQkJCQlQeVN5c19Xcml0ZVN0ZGVycigiaW1wb3J0ICVzICMgYnVpbHRpblxuIiwgbmFtZSk7Ci0JCQkoKnAtPmluaXRmdW5jKSgpOwotCQkJaWYgKFB5RXJyX09jY3VycmVkKCkpCi0JCQkJcmV0dXJuIC0xOwotCQkJaWYgKF9QeUltcG9ydF9GaXh1cEV4dGVuc2lvbihuYW1lLCBuYW1lKSA9PSBOVUxMKQotCQkJCXJldHVybiAtMTsKLQkJCXJldHVybiAxOwotCQl9Ci0JfQotCXJldHVybiAwOworICAgIGZvciAocCA9IFB5SW1wb3J0X0luaXR0YWI7IHAtPm5hbWUgIT0gTlVMTDsgcCsrKSB7CisgICAgICAgIGlmIChzdHJjbXAobmFtZSwgcC0+bmFtZSkgPT0gMCkgeworICAgICAgICAgICAgaWYgKHAtPmluaXRmdW5jID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfSW1wb3J0RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgcmUtaW5pdCBpbnRlcm5hbCBtb2R1bGUgJS4yMDBzIiwKKyAgICAgICAgICAgICAgICAgICAgbmFtZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKFB5X1ZlcmJvc2VGbGFnKQorICAgICAgICAgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCJpbXBvcnQgJXMgIyBidWlsdGluXG4iLCBuYW1lKTsKKyAgICAgICAgICAgICgqcC0+aW5pdGZ1bmMpKCk7CisgICAgICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBpZiAoX1B5SW1wb3J0X0ZpeHVwRXh0ZW5zaW9uKG5hbWUsIG5hbWUpID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIApAQCAtMTkyOCwzOSArMTkyOCwzOSBAQAogc3RhdGljIHN0cnVjdCBfZnJvemVuICoKIGZpbmRfZnJvemVuKGNoYXIgKm5hbWUpCiB7Ci0Jc3RydWN0IF9mcm96ZW4gKnA7CisgICAgc3RydWN0IF9mcm96ZW4gKnA7CiAKLQlmb3IgKHAgPSBQeUltcG9ydF9Gcm96ZW5Nb2R1bGVzOyA7IHArKykgewotCQlpZiAocC0+bmFtZSA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWlmIChzdHJjbXAocC0+bmFtZSwgbmFtZSkgPT0gMCkKLQkJCWJyZWFrOwotCX0KLQlyZXR1cm4gcDsKKyAgICBmb3IgKHAgPSBQeUltcG9ydF9Gcm96ZW5Nb2R1bGVzOyA7IHArKykgeworICAgICAgICBpZiAocC0+bmFtZSA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGlmIChzdHJjbXAocC0+bmFtZSwgbmFtZSkgPT0gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gcDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGdldF9mcm96ZW5fb2JqZWN0KGNoYXIgKm5hbWUpCiB7Ci0Jc3RydWN0IF9mcm96ZW4gKnAgPSBmaW5kX2Zyb3plbihuYW1lKTsKLQlpbnQgc2l6ZTsKKyAgICBzdHJ1Y3QgX2Zyb3plbiAqcCA9IGZpbmRfZnJvemVuKG5hbWUpOworICAgIGludCBzaXplOwogCi0JaWYgKHAgPT0gTlVMTCkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfSW1wb3J0RXJyb3IsCi0JCQkgICAgICJObyBzdWNoIGZyb3plbiBvYmplY3QgbmFtZWQgJS4yMDBzIiwKLQkJCSAgICAgbmFtZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAocC0+Y29kZSA9PSBOVUxMKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19JbXBvcnRFcnJvciwKLQkJCSAgICAgIkV4Y2x1ZGVkIGZyb3plbiBvYmplY3QgbmFtZWQgJS4yMDBzIiwKLQkJCSAgICAgbmFtZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlzaXplID0gcC0+c2l6ZTsKLQlpZiAoc2l6ZSA8IDApCi0JCXNpemUgPSAtc2l6ZTsKLQlyZXR1cm4gUHlNYXJzaGFsX1JlYWRPYmplY3RGcm9tU3RyaW5nKChjaGFyICopcC0+Y29kZSwgc2l6ZSk7CisgICAgaWYgKHAgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfSW1wb3J0RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiTm8gc3VjaCBmcm96ZW4gb2JqZWN0IG5hbWVkICUuMjAwcyIsCisgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChwLT5jb2RlID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX0ltcG9ydEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIkV4Y2x1ZGVkIGZyb3plbiBvYmplY3QgbmFtZWQgJS4yMDBzIiwKKyAgICAgICAgICAgICAgICAgICAgIG5hbWUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgc2l6ZSA9IHAtPnNpemU7CisgICAgaWYgKHNpemUgPCAwKQorICAgICAgICBzaXplID0gLXNpemU7CisgICAgcmV0dXJuIFB5TWFyc2hhbF9SZWFkT2JqZWN0RnJvbVN0cmluZygoY2hhciAqKXAtPmNvZGUsIHNpemUpOwogfQogCiAvKiBJbml0aWFsaXplIGEgZnJvemVuIG1vZHVsZS4KQEAgLTE5NzEsNjEgKzE5NzEsNjEgQEAKIGludAogUHlJbXBvcnRfSW1wb3J0RnJvemVuTW9kdWxlKGNoYXIgKm5hbWUpCiB7Ci0Jc3RydWN0IF9mcm96ZW4gKnAgPSBmaW5kX2Zyb3plbihuYW1lKTsKLQlQeU9iamVjdCAqY287Ci0JUHlPYmplY3QgKm07Ci0JaW50IGlzcGFja2FnZTsKLQlpbnQgc2l6ZTsKKyAgICBzdHJ1Y3QgX2Zyb3plbiAqcCA9IGZpbmRfZnJvemVuKG5hbWUpOworICAgIFB5T2JqZWN0ICpjbzsKKyAgICBQeU9iamVjdCAqbTsKKyAgICBpbnQgaXNwYWNrYWdlOworICAgIGludCBzaXplOwogCi0JaWYgKHAgPT0gTlVMTCkKLQkJcmV0dXJuIDA7Ci0JaWYgKHAtPmNvZGUgPT0gTlVMTCkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfSW1wb3J0RXJyb3IsCi0JCQkgICAgICJFeGNsdWRlZCBmcm96ZW4gb2JqZWN0IG5hbWVkICUuMjAwcyIsCi0JCQkgICAgIG5hbWUpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXNpemUgPSBwLT5zaXplOwotCWlzcGFja2FnZSA9IChzaXplIDwgMCk7Ci0JaWYgKGlzcGFja2FnZSkKLQkJc2l6ZSA9IC1zaXplOwotCWlmIChQeV9WZXJib3NlRmxhZykKLQkJUHlTeXNfV3JpdGVTdGRlcnIoImltcG9ydCAlcyAjIGZyb3plbiVzXG4iLAotCQkJbmFtZSwgaXNwYWNrYWdlID8gIiBwYWNrYWdlIiA6ICIiKTsKLQljbyA9IFB5TWFyc2hhbF9SZWFkT2JqZWN0RnJvbVN0cmluZygoY2hhciAqKXAtPmNvZGUsIHNpemUpOwotCWlmIChjbyA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0JaWYgKCFQeUNvZGVfQ2hlY2soY28pKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgICJmcm96ZW4gb2JqZWN0ICUuMjAwcyBpcyBub3QgYSBjb2RlIG9iamVjdCIsCi0JCQkgICAgIG5hbWUpOwotCQlnb3RvIGVycl9yZXR1cm47Ci0JfQotCWlmIChpc3BhY2thZ2UpIHsKLQkJLyogU2V0IF9fcGF0aF9fIHRvIHRoZSBwYWNrYWdlIG5hbWUgKi8KLQkJUHlPYmplY3QgKmQsICpzOwotCQlpbnQgZXJyOwotCQltID0gUHlJbXBvcnRfQWRkTW9kdWxlKG5hbWUpOwotCQlpZiAobSA9PSBOVUxMKQotCQkJZ290byBlcnJfcmV0dXJuOwotCQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQkJcyA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcobmFtZSk7Ci0JCWlmIChzID09IE5VTEwpCi0JCQlnb3RvIGVycl9yZXR1cm47Ci0JCWVyciA9IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJfX3BhdGhfXyIsIHMpOwotCQlQeV9ERUNSRUYocyk7Ci0JCWlmIChlcnIgIT0gMCkKLQkJCWdvdG8gZXJyX3JldHVybjsKLQl9Ci0JbSA9IFB5SW1wb3J0X0V4ZWNDb2RlTW9kdWxlRXgobmFtZSwgY28sICI8ZnJvemVuPiIpOwotCWlmIChtID09IE5VTEwpCi0JCWdvdG8gZXJyX3JldHVybjsKLQlQeV9ERUNSRUYoY28pOwotCVB5X0RFQ1JFRihtKTsKLQlyZXR1cm4gMTsKKyAgICBpZiAocCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAocC0+Y29kZSA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19JbXBvcnRFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJFeGNsdWRlZCBmcm96ZW4gb2JqZWN0IG5hbWVkICUuMjAwcyIsCisgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBzaXplID0gcC0+c2l6ZTsKKyAgICBpc3BhY2thZ2UgPSAoc2l6ZSA8IDApOworICAgIGlmIChpc3BhY2thZ2UpCisgICAgICAgIHNpemUgPSAtc2l6ZTsKKyAgICBpZiAoUHlfVmVyYm9zZUZsYWcpCisgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCJpbXBvcnQgJXMgIyBmcm96ZW4lc1xuIiwKKyAgICAgICAgICAgIG5hbWUsIGlzcGFja2FnZSA/ICIgcGFja2FnZSIgOiAiIik7CisgICAgY28gPSBQeU1hcnNoYWxfUmVhZE9iamVjdEZyb21TdHJpbmcoKGNoYXIgKilwLT5jb2RlLCBzaXplKTsKKyAgICBpZiAoY28gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmICghUHlDb2RlX0NoZWNrKGNvKSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgImZyb3plbiBvYmplY3QgJS4yMDBzIGlzIG5vdCBhIGNvZGUgb2JqZWN0IiwKKyAgICAgICAgICAgICAgICAgICAgIG5hbWUpOworICAgICAgICBnb3RvIGVycl9yZXR1cm47CisgICAgfQorICAgIGlmIChpc3BhY2thZ2UpIHsKKyAgICAgICAgLyogU2V0IF9fcGF0aF9fIHRvIHRoZSBwYWNrYWdlIG5hbWUgKi8KKyAgICAgICAgUHlPYmplY3QgKmQsICpzOworICAgICAgICBpbnQgZXJyOworICAgICAgICBtID0gUHlJbXBvcnRfQWRkTW9kdWxlKG5hbWUpOworICAgICAgICBpZiAobSA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBlcnJfcmV0dXJuOworICAgICAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICAgICAgcyA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcobmFtZSk7CisgICAgICAgIGlmIChzID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGVycl9yZXR1cm47CisgICAgICAgIGVyciA9IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJfX3BhdGhfXyIsIHMpOworICAgICAgICBQeV9ERUNSRUYocyk7CisgICAgICAgIGlmIChlcnIgIT0gMCkKKyAgICAgICAgICAgIGdvdG8gZXJyX3JldHVybjsKKyAgICB9CisgICAgbSA9IFB5SW1wb3J0X0V4ZWNDb2RlTW9kdWxlRXgobmFtZSwgY28sICI8ZnJvemVuPiIpOworICAgIGlmIChtID09IE5VTEwpCisgICAgICAgIGdvdG8gZXJyX3JldHVybjsKKyAgICBQeV9ERUNSRUYoY28pOworICAgIFB5X0RFQ1JFRihtKTsKKyAgICByZXR1cm4gMTsKIGVycl9yZXR1cm46Ci0JUHlfREVDUkVGKGNvKTsKLQlyZXR1cm4gLTE7CisgICAgUHlfREVDUkVGKGNvKTsKKyAgICByZXR1cm4gLTE7CiB9CiAKIApAQCAtMjAzNSwxNSArMjAzNSwxNSBAQAogUHlPYmplY3QgKgogUHlJbXBvcnRfSW1wb3J0TW9kdWxlKGNvbnN0IGNoYXIgKm5hbWUpCiB7Ci0JUHlPYmplY3QgKnBuYW1lOwotCVB5T2JqZWN0ICpyZXN1bHQ7CisgICAgUHlPYmplY3QgKnBuYW1lOworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CiAKLQlwbmFtZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmcobmFtZSk7Ci0JaWYgKHBuYW1lID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXJlc3VsdCA9IFB5SW1wb3J0X0ltcG9ydChwbmFtZSk7Ci0JUHlfREVDUkVGKHBuYW1lKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIHBuYW1lID0gUHlTdHJpbmdfRnJvbVN0cmluZyhuYW1lKTsKKyAgICBpZiAocG5hbWUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmVzdWx0ID0gUHlJbXBvcnRfSW1wb3J0KHBuYW1lKTsKKyAgICBQeV9ERUNSRUYocG5hbWUpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIC8qIEltcG9ydCBhIG1vZHVsZSB3aXRob3V0IGJsb2NraW5nCkBAIC0yMDU4LDEzNyArMjA1OCwxMzcgQEAKIFB5T2JqZWN0ICoKIFB5SW1wb3J0X0ltcG9ydE1vZHVsZU5vQmxvY2soY29uc3QgY2hhciAqbmFtZSkKIHsKLQlQeU9iamVjdCAqcmVzdWx0OwotCVB5T2JqZWN0ICptb2R1bGVzOwotCWxvbmcgbWU7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICBQeU9iamVjdCAqbW9kdWxlczsKKyAgICBsb25nIG1lOwogCi0JLyogVHJ5IHRvIGdldCB0aGUgbW9kdWxlIGZyb20gc3lzLm1vZHVsZXNbbmFtZV0gKi8KLQltb2R1bGVzID0gUHlJbXBvcnRfR2V0TW9kdWxlRGljdCgpOwotCWlmIChtb2R1bGVzID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIC8qIFRyeSB0byBnZXQgdGhlIG1vZHVsZSBmcm9tIHN5cy5tb2R1bGVzW25hbWVdICovCisgICAgbW9kdWxlcyA9IFB5SW1wb3J0X0dldE1vZHVsZURpY3QoKTsKKyAgICBpZiAobW9kdWxlcyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXJlc3VsdCA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKG1vZHVsZXMsIG5hbWUpOwotCWlmIChyZXN1bHQgIT0gTlVMTCkgewotCQlQeV9JTkNSRUYocmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JZWxzZSB7Ci0JCVB5RXJyX0NsZWFyKCk7Ci0JfQorICAgIHJlc3VsdCA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKG1vZHVsZXMsIG5hbWUpOworICAgIGlmIChyZXN1bHQgIT0gTlVMTCkgeworICAgICAgICBQeV9JTkNSRUYocmVzdWx0KTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgfQogI2lmZGVmIFdJVEhfVEhSRUFECi0JLyogY2hlY2sgdGhlIGltcG9ydCBsb2NrCi0JICogbWUgbWlnaHQgYmUgLTEgYnV0IEkgaWdub3JlIHRoZSBlcnJvciBoZXJlLCB0aGUgbG9jayBmdW5jdGlvbgotCSAqIHRha2VzIGNhcmUgb2YgdGhlIHByb2JsZW0gKi8KLQltZSA9IFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKTsKLQlpZiAoaW1wb3J0X2xvY2tfdGhyZWFkID09IC0xIHx8IGltcG9ydF9sb2NrX3RocmVhZCA9PSBtZSkgewotCQkvKiBubyB0aHJlYWQgb3IgbWUgaXMgaG9sZGluZyB0aGUgbG9jayAqLwotCQlyZXR1cm4gUHlJbXBvcnRfSW1wb3J0TW9kdWxlKG5hbWUpOwotCX0KLQllbHNlIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX0ltcG9ydEVycm9yLAotCQkJICAgICAiRmFpbGVkIHRvIGltcG9ydCAlLjIwMHMgYmVjYXVzZSB0aGUgaW1wb3J0IGxvY2siCi0JCQkgICAgICJpcyBoZWxkIGJ5IGFub3RoZXIgdGhyZWFkLiIsCi0JCQkgICAgIG5hbWUpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgLyogY2hlY2sgdGhlIGltcG9ydCBsb2NrCisgICAgICogbWUgbWlnaHQgYmUgLTEgYnV0IEkgaWdub3JlIHRoZSBlcnJvciBoZXJlLCB0aGUgbG9jayBmdW5jdGlvbgorICAgICAqIHRha2VzIGNhcmUgb2YgdGhlIHByb2JsZW0gKi8KKyAgICBtZSA9IFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKTsKKyAgICBpZiAoaW1wb3J0X2xvY2tfdGhyZWFkID09IC0xIHx8IGltcG9ydF9sb2NrX3RocmVhZCA9PSBtZSkgeworICAgICAgICAvKiBubyB0aHJlYWQgb3IgbWUgaXMgaG9sZGluZyB0aGUgbG9jayAqLworICAgICAgICByZXR1cm4gUHlJbXBvcnRfSW1wb3J0TW9kdWxlKG5hbWUpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX0ltcG9ydEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBpbXBvcnQgJS4yMDBzIGJlY2F1c2UgdGhlIGltcG9ydCBsb2NrIgorICAgICAgICAgICAgICAgICAgICAgImlzIGhlbGQgYnkgYW5vdGhlciB0aHJlYWQuIiwKKyAgICAgICAgICAgICAgICAgICAgIG5hbWUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAjZWxzZQotCXJldHVybiBQeUltcG9ydF9JbXBvcnRNb2R1bGUobmFtZSk7CisgICAgcmV0dXJuIFB5SW1wb3J0X0ltcG9ydE1vZHVsZShuYW1lKTsKICNlbmRpZgogfQogCiAvKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyBmb3IgaGVscGVyIHJvdXRpbmVzICovCiBzdGF0aWMgUHlPYmplY3QgKmdldF9wYXJlbnQoUHlPYmplY3QgKmdsb2JhbHMsIGNoYXIgKmJ1ZiwKLQkJCSAgICBQeV9zc2l6ZV90ICpwX2J1ZmxlbiwgaW50IGxldmVsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90ICpwX2J1ZmxlbiwgaW50IGxldmVsKTsKIHN0YXRpYyBQeU9iamVjdCAqbG9hZF9uZXh0KFB5T2JqZWN0ICptb2QsIFB5T2JqZWN0ICphbHRtb2QsCi0JCQkgICBjaGFyICoqcF9uYW1lLCBjaGFyICpidWYsIFB5X3NzaXplX3QgKnBfYnVmbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKipwX25hbWUsIGNoYXIgKmJ1ZiwgUHlfc3NpemVfdCAqcF9idWZsZW4pOwogc3RhdGljIGludCBtYXJrX21pc3MoY2hhciAqbmFtZSk7CiBzdGF0aWMgaW50IGVuc3VyZV9mcm9tbGlzdChQeU9iamVjdCAqbW9kLCBQeU9iamVjdCAqZnJvbWxpc3QsCi0JCQkgICBjaGFyICpidWYsIFB5X3NzaXplX3QgYnVmbGVuLCBpbnQgcmVjdXJzaXZlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmJ1ZiwgUHlfc3NpemVfdCBidWZsZW4sIGludCByZWN1cnNpdmUpOwogc3RhdGljIFB5T2JqZWN0ICogaW1wb3J0X3N1Ym1vZHVsZShQeU9iamVjdCAqbW9kLCBjaGFyICpuYW1lLCBjaGFyICpmdWxsbmFtZSk7CiAKIC8qIFRoZSBNYWdudW0gT3B1cyBvZiBkb3R0ZWQtbmFtZSBpbXBvcnQgOi0pICovCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbXBvcnRfbW9kdWxlX2xldmVsKGNoYXIgKm5hbWUsIFB5T2JqZWN0ICpnbG9iYWxzLCBQeU9iamVjdCAqbG9jYWxzLAotCQkgICAgUHlPYmplY3QgKmZyb21saXN0LCBpbnQgbGV2ZWwpCisgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpmcm9tbGlzdCwgaW50IGxldmVsKQogewotCWNoYXIgYnVmW01BWFBBVEhMRU4rMV07Ci0JUHlfc3NpemVfdCBidWZsZW4gPSAwOwotCVB5T2JqZWN0ICpwYXJlbnQsICpoZWFkLCAqbmV4dCwgKnRhaWw7CisgICAgY2hhciBidWZbTUFYUEFUSExFTisxXTsKKyAgICBQeV9zc2l6ZV90IGJ1ZmxlbiA9IDA7CisgICAgUHlPYmplY3QgKnBhcmVudCwgKmhlYWQsICpuZXh0LCAqdGFpbDsKIAotCWlmIChzdHJjaHIobmFtZSwgJy8nKSAhPSBOVUxMCisgICAgaWYgKHN0cmNocihuYW1lLCAnLycpICE9IE5VTEwKICNpZmRlZiBNU19XSU5ET1dTCi0JICAgIHx8IHN0cmNocihuYW1lLCAnXFwnKSAhPSBOVUxMCisgICAgICAgIHx8IHN0cmNocihuYW1lLCAnXFwnKSAhPSBOVUxMCiAjZW5kaWYKLQkJKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwKLQkJCQkiSW1wb3J0IGJ5IGZpbGVuYW1lIGlzIG5vdCBzdXBwb3J0ZWQuIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICAgICAgKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJJbXBvcnQgYnkgZmlsZW5hbWUgaXMgbm90IHN1cHBvcnRlZC4iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JcGFyZW50ID0gZ2V0X3BhcmVudChnbG9iYWxzLCBidWYsICZidWZsZW4sIGxldmVsKTsKLQlpZiAocGFyZW50ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIHBhcmVudCA9IGdldF9wYXJlbnQoZ2xvYmFscywgYnVmLCAmYnVmbGVuLCBsZXZlbCk7CisgICAgaWYgKHBhcmVudCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWhlYWQgPSBsb2FkX25leHQocGFyZW50LCBQeV9Ob25lLCAmbmFtZSwgYnVmLCAmYnVmbGVuKTsKLQlpZiAoaGVhZCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBoZWFkID0gbG9hZF9uZXh0KHBhcmVudCwgUHlfTm9uZSwgJm5hbWUsIGJ1ZiwgJmJ1Zmxlbik7CisgICAgaWYgKGhlYWQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQl0YWlsID0gaGVhZDsKLQlQeV9JTkNSRUYodGFpbCk7Ci0Jd2hpbGUgKG5hbWUpIHsKLQkJbmV4dCA9IGxvYWRfbmV4dCh0YWlsLCB0YWlsLCAmbmFtZSwgYnVmLCAmYnVmbGVuKTsKLQkJUHlfREVDUkVGKHRhaWwpOwotCQlpZiAobmV4dCA9PSBOVUxMKSB7Ci0JCQlQeV9ERUNSRUYoaGVhZCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQl0YWlsID0gbmV4dDsKLQl9Ci0JaWYgKHRhaWwgPT0gUHlfTm9uZSkgewotCQkvKiBJZiB0YWlsIGlzIFB5X05vbmUsIGJvdGggZ2V0X3BhcmVudCBhbmQgbG9hZF9uZXh0IGZvdW5kCi0JCSAgIGFuIGVtcHR5IG1vZHVsZSBuYW1lOiBzb21lb25lIGNhbGxlZCBfX2ltcG9ydF9fKCIiKSBvcgotCQkgICBkb2N0b3JlZCBmYXVsdHkgYnl0ZWNvZGUgKi8KLQkJUHlfREVDUkVGKHRhaWwpOwotCQlQeV9ERUNSRUYoaGVhZCk7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJFbXB0eSBtb2R1bGUgbmFtZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgdGFpbCA9IGhlYWQ7CisgICAgUHlfSU5DUkVGKHRhaWwpOworICAgIHdoaWxlIChuYW1lKSB7CisgICAgICAgIG5leHQgPSBsb2FkX25leHQodGFpbCwgdGFpbCwgJm5hbWUsIGJ1ZiwgJmJ1Zmxlbik7CisgICAgICAgIFB5X0RFQ1JFRih0YWlsKTsKKyAgICAgICAgaWYgKG5leHQgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKGhlYWQpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgdGFpbCA9IG5leHQ7CisgICAgfQorICAgIGlmICh0YWlsID09IFB5X05vbmUpIHsKKyAgICAgICAgLyogSWYgdGFpbCBpcyBQeV9Ob25lLCBib3RoIGdldF9wYXJlbnQgYW5kIGxvYWRfbmV4dCBmb3VuZAorICAgICAgICAgICBhbiBlbXB0eSBtb2R1bGUgbmFtZTogc29tZW9uZSBjYWxsZWQgX19pbXBvcnRfXygiIikgb3IKKyAgICAgICAgICAgZG9jdG9yZWQgZmF1bHR5IGJ5dGVjb2RlICovCisgICAgICAgIFB5X0RFQ1JFRih0YWlsKTsKKyAgICAgICAgUHlfREVDUkVGKGhlYWQpOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJFbXB0eSBtb2R1bGUgbmFtZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlpZiAoZnJvbWxpc3QgIT0gTlVMTCkgewotCQlpZiAoZnJvbWxpc3QgPT0gUHlfTm9uZSB8fCAhUHlPYmplY3RfSXNUcnVlKGZyb21saXN0KSkKLQkJCWZyb21saXN0ID0gTlVMTDsKLQl9CisgICAgaWYgKGZyb21saXN0ICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKGZyb21saXN0ID09IFB5X05vbmUgfHwgIVB5T2JqZWN0X0lzVHJ1ZShmcm9tbGlzdCkpCisgICAgICAgICAgICBmcm9tbGlzdCA9IE5VTEw7CisgICAgfQogCi0JaWYgKGZyb21saXN0ID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKHRhaWwpOwotCQlyZXR1cm4gaGVhZDsKLQl9CisgICAgaWYgKGZyb21saXN0ID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKHRhaWwpOworICAgICAgICByZXR1cm4gaGVhZDsKKyAgICB9CiAKLQlQeV9ERUNSRUYoaGVhZCk7Ci0JaWYgKCFlbnN1cmVfZnJvbWxpc3QodGFpbCwgZnJvbWxpc3QsIGJ1ZiwgYnVmbGVuLCAwKSkgewotCQlQeV9ERUNSRUYodGFpbCk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBQeV9ERUNSRUYoaGVhZCk7CisgICAgaWYgKCFlbnN1cmVfZnJvbWxpc3QodGFpbCwgZnJvbWxpc3QsIGJ1ZiwgYnVmbGVuLCAwKSkgeworICAgICAgICBQeV9ERUNSRUYodGFpbCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXJldHVybiB0YWlsOworICAgIHJldHVybiB0YWlsOwogfQogCiBQeU9iamVjdCAqCiBQeUltcG9ydF9JbXBvcnRNb2R1bGVMZXZlbChjaGFyICpuYW1lLCBQeU9iamVjdCAqZ2xvYmFscywgUHlPYmplY3QgKmxvY2FscywKLQkJCSBQeU9iamVjdCAqZnJvbWxpc3QsIGludCBsZXZlbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqZnJvbWxpc3QsIGludCBsZXZlbCkKIHsKLQlQeU9iamVjdCAqcmVzdWx0OwotCV9QeUltcG9ydF9BY3F1aXJlTG9jaygpOwotCXJlc3VsdCA9IGltcG9ydF9tb2R1bGVfbGV2ZWwobmFtZSwgZ2xvYmFscywgbG9jYWxzLCBmcm9tbGlzdCwgbGV2ZWwpOwotCWlmIChfUHlJbXBvcnRfUmVsZWFzZUxvY2soKSA8IDApIHsKLQkJUHlfWERFQ1JFRihyZXN1bHQpOwotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAotCQkJCSJub3QgaG9sZGluZyB0aGUgaW1wb3J0IGxvY2siKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiByZXN1bHQ7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICBfUHlJbXBvcnRfQWNxdWlyZUxvY2soKTsKKyAgICByZXN1bHQgPSBpbXBvcnRfbW9kdWxlX2xldmVsKG5hbWUsIGdsb2JhbHMsIGxvY2FscywgZnJvbWxpc3QsIGxldmVsKTsKKyAgICBpZiAoX1B5SW1wb3J0X1JlbGVhc2VMb2NrKCkgPCAwKSB7CisgICAgICAgIFB5X1hERUNSRUYocmVzdWx0KTsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJub3QgaG9sZGluZyB0aGUgaW1wb3J0IGxvY2siKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIC8qIFJldHVybiB0aGUgcGFja2FnZSB0aGF0IGFuIGltcG9ydCBpcyBiZWluZyBwZXJmb3JtZWQgaW4uICBJZiBnbG9iYWxzIGNvbWVzCkBAIC0yMjA1LDQwMCArMjIwNSw0MDAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZXRfcGFyZW50KFB5T2JqZWN0ICpnbG9iYWxzLCBjaGFyICpidWYsIFB5X3NzaXplX3QgKnBfYnVmbGVuLCBpbnQgbGV2ZWwpCiB7Ci0Jc3RhdGljIFB5T2JqZWN0ICpuYW1lc3RyID0gTlVMTDsKLQlzdGF0aWMgUHlPYmplY3QgKnBhdGhzdHIgPSBOVUxMOwotCXN0YXRpYyBQeU9iamVjdCAqcGtnc3RyID0gTlVMTDsKLQlQeU9iamVjdCAqcGtnbmFtZSwgKm1vZG5hbWUsICptb2RwYXRoLCAqbW9kdWxlcywgKnBhcmVudDsKLQlpbnQgb3JpZ19sZXZlbCA9IGxldmVsOworICAgIHN0YXRpYyBQeU9iamVjdCAqbmFtZXN0ciA9IE5VTEw7CisgICAgc3RhdGljIFB5T2JqZWN0ICpwYXRoc3RyID0gTlVMTDsKKyAgICBzdGF0aWMgUHlPYmplY3QgKnBrZ3N0ciA9IE5VTEw7CisgICAgUHlPYmplY3QgKnBrZ25hbWUsICptb2RuYW1lLCAqbW9kcGF0aCwgKm1vZHVsZXMsICpwYXJlbnQ7CisgICAgaW50IG9yaWdfbGV2ZWwgPSBsZXZlbDsKIAotCWlmIChnbG9iYWxzID09IE5VTEwgfHwgIVB5RGljdF9DaGVjayhnbG9iYWxzKSB8fCAhbGV2ZWwpCi0JCXJldHVybiBQeV9Ob25lOworICAgIGlmIChnbG9iYWxzID09IE5VTEwgfHwgIVB5RGljdF9DaGVjayhnbG9iYWxzKSB8fCAhbGV2ZWwpCisgICAgICAgIHJldHVybiBQeV9Ob25lOwogCi0JaWYgKG5hbWVzdHIgPT0gTlVMTCkgewotCQluYW1lc3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19uYW1lX18iKTsKLQkJaWYgKG5hbWVzdHIgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCX0KLQlpZiAocGF0aHN0ciA9PSBOVUxMKSB7Ci0JCXBhdGhzdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX3BhdGhfXyIpOwotCQlpZiAocGF0aHN0ciA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChwa2dzdHIgPT0gTlVMTCkgewotCQlwa2dzdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX3BhY2thZ2VfXyIpOwotCQlpZiAocGtnc3RyID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKG5hbWVzdHIgPT0gTlVMTCkgeworICAgICAgICBuYW1lc3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19uYW1lX18iKTsKKyAgICAgICAgaWYgKG5hbWVzdHIgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAocGF0aHN0ciA9PSBOVUxMKSB7CisgICAgICAgIHBhdGhzdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX3BhdGhfXyIpOworICAgICAgICBpZiAocGF0aHN0ciA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChwa2dzdHIgPT0gTlVMTCkgeworICAgICAgICBwa2dzdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX3BhY2thZ2VfXyIpOworICAgICAgICBpZiAocGtnc3RyID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQkqYnVmID0gJ1wwJzsKLQkqcF9idWZsZW4gPSAwOwotCXBrZ25hbWUgPSBQeURpY3RfR2V0SXRlbShnbG9iYWxzLCBwa2dzdHIpOworICAgICpidWYgPSAnXDAnOworICAgICpwX2J1ZmxlbiA9IDA7CisgICAgcGtnbmFtZSA9IFB5RGljdF9HZXRJdGVtKGdsb2JhbHMsIHBrZ3N0cik7CiAKLQlpZiAoKHBrZ25hbWUgIT0gTlVMTCkgJiYgKHBrZ25hbWUgIT0gUHlfTm9uZSkpIHsKLQkJLyogX19wYWNrYWdlX18gaXMgc2V0LCBzbyB1c2UgaXQgKi8KLQkJUHlfc3NpemVfdCBsZW47Ci0JCWlmICghUHlTdHJpbmdfQ2hlY2socGtnbmFtZSkpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCQkiX19wYWNrYWdlX18gc2V0IHRvIG5vbi1zdHJpbmciKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWxlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHBrZ25hbWUpOwotCQlpZiAobGVuID09IDApIHsKLQkJCWlmIChsZXZlbCA+IDApIHsKLQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkJIkF0dGVtcHRlZCByZWxhdGl2ZSBpbXBvcnQgaW4gbm9uLXBhY2thZ2UiKTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJCXJldHVybiBQeV9Ob25lOwotCQl9Ci0JCWlmIChsZW4gPiBNQVhQQVRITEVOKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkJIlBhY2thZ2UgbmFtZSB0b28gbG9uZyIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJc3RyY3B5KGJ1ZiwgUHlTdHJpbmdfQVNfU1RSSU5HKHBrZ25hbWUpKTsKLQl9IGVsc2UgewotCQkvKiBfX3BhY2thZ2VfXyBub3Qgc2V0LCBzbyBmaWd1cmUgaXQgb3V0IGFuZCBzZXQgaXQgKi8KLQkJbW9kbmFtZSA9IFB5RGljdF9HZXRJdGVtKGdsb2JhbHMsIG5hbWVzdHIpOwotCQlpZiAobW9kbmFtZSA9PSBOVUxMIHx8ICFQeVN0cmluZ19DaGVjayhtb2RuYW1lKSkKLQkJCXJldHVybiBQeV9Ob25lOwotCQotCQltb2RwYXRoID0gUHlEaWN0X0dldEl0ZW0oZ2xvYmFscywgcGF0aHN0cik7Ci0JCWlmIChtb2RwYXRoICE9IE5VTEwpIHsKLQkJCS8qIF9fcGF0aF9fIGlzIHNldCwgc28gbW9kbmFtZSBpcyBhbHJlYWR5IHRoZSBwYWNrYWdlIG5hbWUgKi8KLQkJCVB5X3NzaXplX3QgbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUobW9kbmFtZSk7Ci0JCQlpbnQgZXJyb3I7Ci0JCQlpZiAobGVuID4gTUFYUEFUSExFTikgewotCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCQkJIk1vZHVsZSBuYW1lIHRvbyBsb25nIik7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCQlzdHJjcHkoYnVmLCBQeVN0cmluZ19BU19TVFJJTkcobW9kbmFtZSkpOwotCQkJZXJyb3IgPSBQeURpY3RfU2V0SXRlbShnbG9iYWxzLCBwa2dzdHIsIG1vZG5hbWUpOwotCQkJaWYgKGVycm9yKSB7Ci0JCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJCQkiQ291bGQgbm90IHNldCBfX3BhY2thZ2VfXyIpOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQl9IGVsc2UgewotCQkJLyogTm9ybWFsIG1vZHVsZSwgc28gd29yayBvdXQgdGhlIHBhY2thZ2UgbmFtZSBpZiBhbnkgKi8KLQkJCWNoYXIgKnN0YXJ0ID0gUHlTdHJpbmdfQVNfU1RSSU5HKG1vZG5hbWUpOwotCQkJY2hhciAqbGFzdGRvdCA9IHN0cnJjaHIoc3RhcnQsICcuJyk7Ci0JCQlzaXplX3QgbGVuOwotCQkJaW50IGVycm9yOwotCQkJaWYgKGxhc3Rkb3QgPT0gTlVMTCAmJiBsZXZlbCA+IDApIHsKLQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkJIkF0dGVtcHRlZCByZWxhdGl2ZSBpbXBvcnQgaW4gbm9uLXBhY2thZ2UiKTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJCWlmIChsYXN0ZG90ID09IE5VTEwpIHsKLQkJCQllcnJvciA9IFB5RGljdF9TZXRJdGVtKGdsb2JhbHMsIHBrZ3N0ciwgUHlfTm9uZSk7Ci0JCQkJaWYgKGVycm9yKSB7Ci0JCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCQkJIkNvdWxkIG5vdCBzZXQgX19wYWNrYWdlX18iKTsKLQkJCQkJcmV0dXJuIE5VTEw7Ci0JCQkJfQotCQkJCXJldHVybiBQeV9Ob25lOwotCQkJfQotCQkJbGVuID0gbGFzdGRvdCAtIHN0YXJ0OwotCQkJaWYgKGxlbiA+PSBNQVhQQVRITEVOKSB7Ci0JCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJCQkiTW9kdWxlIG5hbWUgdG9vIGxvbmciKTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJCXN0cm5jcHkoYnVmLCBzdGFydCwgbGVuKTsKLQkJCWJ1ZltsZW5dID0gJ1wwJzsKLQkJCXBrZ25hbWUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7Ci0JCQlpZiAocGtnbmFtZSA9PSBOVUxMKSB7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCQllcnJvciA9IFB5RGljdF9TZXRJdGVtKGdsb2JhbHMsIHBrZ3N0ciwgcGtnbmFtZSk7Ci0JCQlQeV9ERUNSRUYocGtnbmFtZSk7Ci0JCQlpZiAoZXJyb3IpIHsKLQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkJCSJDb3VsZCBub3Qgc2V0IF9fcGFja2FnZV9fIik7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCX0KLQl9Ci0Jd2hpbGUgKC0tbGV2ZWwgPiAwKSB7Ci0JCWNoYXIgKmRvdCA9IHN0cnJjaHIoYnVmLCAnLicpOwotCQlpZiAoZG90ID09IE5VTEwpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJBdHRlbXB0ZWQgcmVsYXRpdmUgaW1wb3J0IGJleW9uZCAiCi0JCQkJInRvcGxldmVsIHBhY2thZ2UiKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCSpkb3QgPSAnXDAnOwotCX0KLQkqcF9idWZsZW4gPSBzdHJsZW4oYnVmKTsKKyAgICBpZiAoKHBrZ25hbWUgIT0gTlVMTCkgJiYgKHBrZ25hbWUgIT0gUHlfTm9uZSkpIHsKKyAgICAgICAgLyogX19wYWNrYWdlX18gaXMgc2V0LCBzbyB1c2UgaXQgKi8KKyAgICAgICAgUHlfc3NpemVfdCBsZW47CisgICAgICAgIGlmICghUHlTdHJpbmdfQ2hlY2socGtnbmFtZSkpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfX3BhY2thZ2VfXyBzZXQgdG8gbm9uLXN0cmluZyIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUocGtnbmFtZSk7CisgICAgICAgIGlmIChsZW4gPT0gMCkgeworICAgICAgICAgICAgaWYgKGxldmVsID4gMCkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAiQXR0ZW1wdGVkIHJlbGF0aXZlIGltcG9ydCBpbiBub24tcGFja2FnZSIpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGxlbiA+IE1BWFBBVEhMRU4pIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQYWNrYWdlIG5hbWUgdG9vIGxvbmciKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHN0cmNweShidWYsIFB5U3RyaW5nX0FTX1NUUklORyhwa2duYW1lKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogX19wYWNrYWdlX18gbm90IHNldCwgc28gZmlndXJlIGl0IG91dCBhbmQgc2V0IGl0ICovCisgICAgICAgIG1vZG5hbWUgPSBQeURpY3RfR2V0SXRlbShnbG9iYWxzLCBuYW1lc3RyKTsKKyAgICAgICAgaWYgKG1vZG5hbWUgPT0gTlVMTCB8fCAhUHlTdHJpbmdfQ2hlY2sobW9kbmFtZSkpCisgICAgICAgICAgICByZXR1cm4gUHlfTm9uZTsKIAotCW1vZHVsZXMgPSBQeUltcG9ydF9HZXRNb2R1bGVEaWN0KCk7Ci0JcGFyZW50ID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcobW9kdWxlcywgYnVmKTsKLQlpZiAocGFyZW50ID09IE5VTEwpIHsKLQkJaWYgKG9yaWdfbGV2ZWwgPCAxKSB7Ci0JCQlQeU9iamVjdCAqZXJyX21zZyA9IFB5U3RyaW5nX0Zyb21Gb3JtYXQoCi0JCQkJIlBhcmVudCBtb2R1bGUgJyUuMjAwcycgbm90IGZvdW5kICIKLQkJCQkid2hpbGUgaGFuZGxpbmcgYWJzb2x1dGUgaW1wb3J0IiwgYnVmKTsKLQkJCWlmIChlcnJfbXNnID09IE5VTEwpIHsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJCWlmICghUHlFcnJfV2FybkV4KFB5RXhjX1J1bnRpbWVXYXJuaW5nLAotCQkJCQlQeVN0cmluZ19Bc1N0cmluZyhlcnJfbXNnKSwgMSkpIHsKLQkJCQkqYnVmID0gJ1wwJzsKLQkJCQkqcF9idWZsZW4gPSAwOwotCQkJCXBhcmVudCA9IFB5X05vbmU7Ci0JCQl9Ci0JCQlQeV9ERUNSRUYoZXJyX21zZyk7Ci0JCX0gZWxzZSB7Ci0JCQlQeUVycl9Gb3JtYXQoUHlFeGNfU3lzdGVtRXJyb3IsCi0JCQkJIlBhcmVudCBtb2R1bGUgJyUuMjAwcycgbm90IGxvYWRlZCwgIgotCQkJCSJjYW5ub3QgcGVyZm9ybSByZWxhdGl2ZSBpbXBvcnQiLCBidWYpOwotCQl9Ci0JfQotCXJldHVybiBwYXJlbnQ7Ci0JLyogV2UgZXhwZWN0LCBidXQgY2FuJ3QgZ3VhcmFudGVlLCBpZiBwYXJlbnQgIT0gTm9uZSwgdGhhdDoKLQkgICAtIHBhcmVudC5fX25hbWVfXyA9PSBidWYKLQkgICAtIHBhcmVudC5fX2RpY3RfXyBpcyBnbG9iYWxzCi0JICAgSWYgdGhpcyBpcyB2aW9sYXRlZC4uLiAgV2hvIGNhcmVzPyAqLworICAgICAgICBtb2RwYXRoID0gUHlEaWN0X0dldEl0ZW0oZ2xvYmFscywgcGF0aHN0cik7CisgICAgICAgIGlmIChtb2RwYXRoICE9IE5VTEwpIHsKKyAgICAgICAgICAgIC8qIF9fcGF0aF9fIGlzIHNldCwgc28gbW9kbmFtZSBpcyBhbHJlYWR5IHRoZSBwYWNrYWdlIG5hbWUgKi8KKyAgICAgICAgICAgIFB5X3NzaXplX3QgbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUobW9kbmFtZSk7CisgICAgICAgICAgICBpbnQgZXJyb3I7CisgICAgICAgICAgICBpZiAobGVuID4gTUFYUEFUSExFTikgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTW9kdWxlIG5hbWUgdG9vIGxvbmciKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0cmNweShidWYsIFB5U3RyaW5nX0FTX1NUUklORyhtb2RuYW1lKSk7CisgICAgICAgICAgICBlcnJvciA9IFB5RGljdF9TZXRJdGVtKGdsb2JhbHMsIHBrZ3N0ciwgbW9kbmFtZSk7CisgICAgICAgICAgICBpZiAoZXJyb3IpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBzZXQgX19wYWNrYWdlX18iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIE5vcm1hbCBtb2R1bGUsIHNvIHdvcmsgb3V0IHRoZSBwYWNrYWdlIG5hbWUgaWYgYW55ICovCisgICAgICAgICAgICBjaGFyICpzdGFydCA9IFB5U3RyaW5nX0FTX1NUUklORyhtb2RuYW1lKTsKKyAgICAgICAgICAgIGNoYXIgKmxhc3Rkb3QgPSBzdHJyY2hyKHN0YXJ0LCAnLicpOworICAgICAgICAgICAgc2l6ZV90IGxlbjsKKyAgICAgICAgICAgIGludCBlcnJvcjsKKyAgICAgICAgICAgIGlmIChsYXN0ZG90ID09IE5VTEwgJiYgbGV2ZWwgPiAwKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICJBdHRlbXB0ZWQgcmVsYXRpdmUgaW1wb3J0IGluIG5vbi1wYWNrYWdlIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobGFzdGRvdCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgZXJyb3IgPSBQeURpY3RfU2V0SXRlbShnbG9iYWxzLCBwa2dzdHIsIFB5X05vbmUpOworICAgICAgICAgICAgICAgIGlmIChlcnJvcikgeworICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3Qgc2V0IF9fcGFja2FnZV9fIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxlbiA9IGxhc3Rkb3QgLSBzdGFydDsKKyAgICAgICAgICAgIGlmIChsZW4gPj0gTUFYUEFUSExFTikgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTW9kdWxlIG5hbWUgdG9vIGxvbmciKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0cm5jcHkoYnVmLCBzdGFydCwgbGVuKTsKKyAgICAgICAgICAgIGJ1ZltsZW5dID0gJ1wwJzsKKyAgICAgICAgICAgIHBrZ25hbWUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CisgICAgICAgICAgICBpZiAocGtnbmFtZSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlcnJvciA9IFB5RGljdF9TZXRJdGVtKGdsb2JhbHMsIHBrZ3N0ciwgcGtnbmFtZSk7CisgICAgICAgICAgICBQeV9ERUNSRUYocGtnbmFtZSk7CisgICAgICAgICAgICBpZiAoZXJyb3IpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBzZXQgX19wYWNrYWdlX18iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICB3aGlsZSAoLS1sZXZlbCA+IDApIHsKKyAgICAgICAgY2hhciAqZG90ID0gc3RycmNocihidWYsICcuJyk7CisgICAgICAgIGlmIChkb3QgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgIkF0dGVtcHRlZCByZWxhdGl2ZSBpbXBvcnQgYmV5b25kICIKKyAgICAgICAgICAgICAgICAidG9wbGV2ZWwgcGFja2FnZSIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgKmRvdCA9ICdcMCc7CisgICAgfQorICAgICpwX2J1ZmxlbiA9IHN0cmxlbihidWYpOworCisgICAgbW9kdWxlcyA9IFB5SW1wb3J0X0dldE1vZHVsZURpY3QoKTsKKyAgICBwYXJlbnQgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhtb2R1bGVzLCBidWYpOworICAgIGlmIChwYXJlbnQgPT0gTlVMTCkgeworICAgICAgICBpZiAob3JpZ19sZXZlbCA8IDEpIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICplcnJfbXNnID0gUHlTdHJpbmdfRnJvbUZvcm1hdCgKKyAgICAgICAgICAgICAgICAiUGFyZW50IG1vZHVsZSAnJS4yMDBzJyBub3QgZm91bmQgIgorICAgICAgICAgICAgICAgICJ3aGlsZSBoYW5kbGluZyBhYnNvbHV0ZSBpbXBvcnQiLCBidWYpOworICAgICAgICAgICAgaWYgKGVycl9tc2cgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFQeUVycl9XYXJuRXgoUHlFeGNfUnVudGltZVdhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQXNTdHJpbmcoZXJyX21zZyksIDEpKSB7CisgICAgICAgICAgICAgICAgKmJ1ZiA9ICdcMCc7CisgICAgICAgICAgICAgICAgKnBfYnVmbGVuID0gMDsKKyAgICAgICAgICAgICAgICBwYXJlbnQgPSBQeV9Ob25lOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlfREVDUkVGKGVycl9tc2cpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgICAgICJQYXJlbnQgbW9kdWxlICclLjIwMHMnIG5vdCBsb2FkZWQsICIKKyAgICAgICAgICAgICAgICAiY2Fubm90IHBlcmZvcm0gcmVsYXRpdmUgaW1wb3J0IiwgYnVmKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcGFyZW50OworICAgIC8qIFdlIGV4cGVjdCwgYnV0IGNhbid0IGd1YXJhbnRlZSwgaWYgcGFyZW50ICE9IE5vbmUsIHRoYXQ6CisgICAgICAgLSBwYXJlbnQuX19uYW1lX18gPT0gYnVmCisgICAgICAgLSBwYXJlbnQuX19kaWN0X18gaXMgZ2xvYmFscworICAgICAgIElmIHRoaXMgaXMgdmlvbGF0ZWQuLi4gIFdobyBjYXJlcz8gKi8KIH0KIAogLyogYWx0bW9kIGlzIGVpdGhlciBOb25lIG9yIHNhbWUgYXMgbW9kICovCiBzdGF0aWMgUHlPYmplY3QgKgogbG9hZF9uZXh0KFB5T2JqZWN0ICptb2QsIFB5T2JqZWN0ICphbHRtb2QsIGNoYXIgKipwX25hbWUsIGNoYXIgKmJ1ZiwKLQkgIFB5X3NzaXplX3QgKnBfYnVmbGVuKQorICAgICAgICAgIFB5X3NzaXplX3QgKnBfYnVmbGVuKQogewotCWNoYXIgKm5hbWUgPSAqcF9uYW1lOwotCWNoYXIgKmRvdCA9IHN0cmNocihuYW1lLCAnLicpOwotCXNpemVfdCBsZW47Ci0JY2hhciAqcDsKLQlQeU9iamVjdCAqcmVzdWx0OworICAgIGNoYXIgKm5hbWUgPSAqcF9uYW1lOworICAgIGNoYXIgKmRvdCA9IHN0cmNocihuYW1lLCAnLicpOworICAgIHNpemVfdCBsZW47CisgICAgY2hhciAqcDsKKyAgICBQeU9iamVjdCAqcmVzdWx0OwogCi0JaWYgKHN0cmxlbihuYW1lKSA9PSAwKSB7Ci0JCS8qIGNvbXBsZXRlbHkgZW1wdHkgbW9kdWxlIG5hbWUgc2hvdWxkIG9ubHkgaGFwcGVuIGluCi0JCSAgICdmcm9tIC4gaW1wb3J0JyAob3IgJ19faW1wb3J0X18oIiIpJykqLwotCQlQeV9JTkNSRUYobW9kKTsKLQkJKnBfbmFtZSA9IE5VTEw7Ci0JCXJldHVybiBtb2Q7Ci0JfQorICAgIGlmIChzdHJsZW4obmFtZSkgPT0gMCkgeworICAgICAgICAvKiBjb21wbGV0ZWx5IGVtcHR5IG1vZHVsZSBuYW1lIHNob3VsZCBvbmx5IGhhcHBlbiBpbgorICAgICAgICAgICAnZnJvbSAuIGltcG9ydCcgKG9yICdfX2ltcG9ydF9fKCIiKScpKi8KKyAgICAgICAgUHlfSU5DUkVGKG1vZCk7CisgICAgICAgICpwX25hbWUgPSBOVUxMOworICAgICAgICByZXR1cm4gbW9kOworICAgIH0KIAotCWlmIChkb3QgPT0gTlVMTCkgewotCQkqcF9uYW1lID0gTlVMTDsKLQkJbGVuID0gc3RybGVuKG5hbWUpOwotCX0KLQllbHNlIHsKLQkJKnBfbmFtZSA9IGRvdCsxOwotCQlsZW4gPSBkb3QtbmFtZTsKLQl9Ci0JaWYgKGxlbiA9PSAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJFbXB0eSBtb2R1bGUgbmFtZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKGRvdCA9PSBOVUxMKSB7CisgICAgICAgICpwX25hbWUgPSBOVUxMOworICAgICAgICBsZW4gPSBzdHJsZW4obmFtZSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAqcF9uYW1lID0gZG90KzE7CisgICAgICAgIGxlbiA9IGRvdC1uYW1lOworICAgIH0KKyAgICBpZiAobGVuID09IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiRW1wdHkgbW9kdWxlIG5hbWUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JcCA9IGJ1ZiArICpwX2J1ZmxlbjsKLQlpZiAocCAhPSBidWYpCi0JCSpwKysgPSAnLic7Ci0JaWYgKHArbGVuLWJ1ZiA+PSBNQVhQQVRITEVOKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJNb2R1bGUgbmFtZSB0b28gbG9uZyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0Jc3RybmNweShwLCBuYW1lLCBsZW4pOwotCXBbbGVuXSA9ICdcMCc7Ci0JKnBfYnVmbGVuID0gcCtsZW4tYnVmOworICAgIHAgPSBidWYgKyAqcF9idWZsZW47CisgICAgaWYgKHAgIT0gYnVmKQorICAgICAgICAqcCsrID0gJy4nOworICAgIGlmIChwK2xlbi1idWYgPj0gTUFYUEFUSExFTikgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJNb2R1bGUgbmFtZSB0b28gbG9uZyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgc3RybmNweShwLCBuYW1lLCBsZW4pOworICAgIHBbbGVuXSA9ICdcMCc7CisgICAgKnBfYnVmbGVuID0gcCtsZW4tYnVmOwogCi0JcmVzdWx0ID0gaW1wb3J0X3N1Ym1vZHVsZShtb2QsIHAsIGJ1Zik7Ci0JaWYgKHJlc3VsdCA9PSBQeV9Ob25lICYmIGFsdG1vZCAhPSBtb2QpIHsKLQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCS8qIEhlcmUsIGFsdG1vZCBtdXN0IGJlIE5vbmUgYW5kIG1vZCBtdXN0IG5vdCBiZSBOb25lICovCi0JCXJlc3VsdCA9IGltcG9ydF9zdWJtb2R1bGUoYWx0bW9kLCBwLCBwKTsKLQkJaWYgKHJlc3VsdCAhPSBOVUxMICYmIHJlc3VsdCAhPSBQeV9Ob25lKSB7Ci0JCQlpZiAobWFya19taXNzKGJ1ZikgIT0gMCkgewotCQkJCVB5X0RFQ1JFRihyZXN1bHQpOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQkJc3RybmNweShidWYsIG5hbWUsIGxlbik7Ci0JCQlidWZbbGVuXSA9ICdcMCc7Ci0JCQkqcF9idWZsZW4gPSBsZW47Ci0JCX0KLQl9Ci0JaWYgKHJlc3VsdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICByZXN1bHQgPSBpbXBvcnRfc3VibW9kdWxlKG1vZCwgcCwgYnVmKTsKKyAgICBpZiAocmVzdWx0ID09IFB5X05vbmUgJiYgYWx0bW9kICE9IG1vZCkgeworICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgLyogSGVyZSwgYWx0bW9kIG11c3QgYmUgTm9uZSBhbmQgbW9kIG11c3Qgbm90IGJlIE5vbmUgKi8KKyAgICAgICAgcmVzdWx0ID0gaW1wb3J0X3N1Ym1vZHVsZShhbHRtb2QsIHAsIHApOworICAgICAgICBpZiAocmVzdWx0ICE9IE5VTEwgJiYgcmVzdWx0ICE9IFB5X05vbmUpIHsKKyAgICAgICAgICAgIGlmIChtYXJrX21pc3MoYnVmKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdHJuY3B5KGJ1ZiwgbmFtZSwgbGVuKTsKKyAgICAgICAgICAgIGJ1ZltsZW5dID0gJ1wwJzsKKyAgICAgICAgICAgICpwX2J1ZmxlbiA9IGxlbjsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKHJlc3VsdCA9PSBQeV9Ob25lKSB7Ci0JCVB5X0RFQ1JFRihyZXN1bHQpOwotCQlQeUVycl9Gb3JtYXQoUHlFeGNfSW1wb3J0RXJyb3IsCi0JCQkgICAgICJObyBtb2R1bGUgbmFtZWQgJS4yMDBzIiwgbmFtZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAocmVzdWx0ID09IFB5X05vbmUpIHsKKyAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19JbXBvcnRFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJObyBtb2R1bGUgbmFtZWQgJS4yMDBzIiwgbmFtZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXJldHVybiByZXN1bHQ7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIGludAogbWFya19taXNzKGNoYXIgKm5hbWUpCiB7Ci0JUHlPYmplY3QgKm1vZHVsZXMgPSBQeUltcG9ydF9HZXRNb2R1bGVEaWN0KCk7Ci0JcmV0dXJuIFB5RGljdF9TZXRJdGVtU3RyaW5nKG1vZHVsZXMsIG5hbWUsIFB5X05vbmUpOworICAgIFB5T2JqZWN0ICptb2R1bGVzID0gUHlJbXBvcnRfR2V0TW9kdWxlRGljdCgpOworICAgIHJldHVybiBQeURpY3RfU2V0SXRlbVN0cmluZyhtb2R1bGVzLCBuYW1lLCBQeV9Ob25lKTsKIH0KIAogc3RhdGljIGludAogZW5zdXJlX2Zyb21saXN0KFB5T2JqZWN0ICptb2QsIFB5T2JqZWN0ICpmcm9tbGlzdCwgY2hhciAqYnVmLCBQeV9zc2l6ZV90IGJ1ZmxlbiwKLQkJaW50IHJlY3Vyc2l2ZSkKKyAgICAgICAgICAgICAgICBpbnQgcmVjdXJzaXZlKQogewotCWludCBpOworICAgIGludCBpOwogCi0JaWYgKCFQeU9iamVjdF9IYXNBdHRyU3RyaW5nKG1vZCwgIl9fcGF0aF9fIikpCi0JCXJldHVybiAxOworICAgIGlmICghUHlPYmplY3RfSGFzQXR0clN0cmluZyhtb2QsICJfX3BhdGhfXyIpKQorICAgICAgICByZXR1cm4gMTsKIAotCWZvciAoaSA9IDA7IDsgaSsrKSB7Ci0JCVB5T2JqZWN0ICppdGVtID0gUHlTZXF1ZW5jZV9HZXRJdGVtKGZyb21saXN0LCBpKTsKLQkJaW50IGhhc2l0OwotCQlpZiAoaXRlbSA9PSBOVUxMKSB7Ci0JCQlpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19JbmRleEVycm9yKSkgewotCQkJCVB5RXJyX0NsZWFyKCk7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlpZiAoIVB5U3RyaW5nX0NoZWNrKGl0ZW0pKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCQkiSXRlbSBpbiBgYGZyb20gbGlzdCcnIG5vdCBhIHN0cmluZyIpOwotCQkJUHlfREVDUkVGKGl0ZW0pOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJaWYgKFB5U3RyaW5nX0FTX1NUUklORyhpdGVtKVswXSA9PSAnKicpIHsKLQkJCVB5T2JqZWN0ICphbGw7Ci0JCQlQeV9ERUNSRUYoaXRlbSk7Ci0JCQkvKiBTZWUgaWYgdGhlIHBhY2thZ2UgZGVmaW5lcyBfX2FsbF9fICovCi0JCQlpZiAocmVjdXJzaXZlKQotCQkJCWNvbnRpbnVlOyAvKiBBdm9pZCBlbmRsZXNzIHJlY3Vyc2lvbiAqLwotCQkJYWxsID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhtb2QsICJfX2FsbF9fIik7Ci0JCQlpZiAoYWxsID09IE5VTEwpCi0JCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCWVsc2UgewotCQkJCWludCByZXQgPSBlbnN1cmVfZnJvbWxpc3QobW9kLCBhbGwsIGJ1ZiwgYnVmbGVuLCAxKTsKLQkJCQlQeV9ERUNSRUYoYWxsKTsKLQkJCQlpZiAoIXJldCkKLQkJCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQljb250aW51ZTsKLQkJfQotCQloYXNpdCA9IFB5T2JqZWN0X0hhc0F0dHIobW9kLCBpdGVtKTsKLQkJaWYgKCFoYXNpdCkgewotCQkJY2hhciAqc3VibmFtZSA9IFB5U3RyaW5nX0FTX1NUUklORyhpdGVtKTsKLQkJCVB5T2JqZWN0ICpzdWJtb2Q7Ci0JCQljaGFyICpwOwotCQkJaWYgKGJ1ZmxlbiArIHN0cmxlbihzdWJuYW1lKSA+PSBNQVhQQVRITEVOKSB7Ci0JCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJCQkiTW9kdWxlIG5hbWUgdG9vIGxvbmciKTsKLQkJCQlQeV9ERUNSRUYoaXRlbSk7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQlwID0gYnVmICsgYnVmbGVuOwotCQkJKnArKyA9ICcuJzsKLQkJCXN0cmNweShwLCBzdWJuYW1lKTsKLQkJCXN1Ym1vZCA9IGltcG9ydF9zdWJtb2R1bGUobW9kLCBzdWJuYW1lLCBidWYpOwotCQkJUHlfWERFQ1JFRihzdWJtb2QpOwotCQkJaWYgKHN1Ym1vZCA9PSBOVUxMKSB7Ci0JCQkJUHlfREVDUkVGKGl0ZW0pOwotCQkJCXJldHVybiAwOwotCQkJfQotCQl9Ci0JCVB5X0RFQ1JFRihpdGVtKTsKLQl9CisgICAgZm9yIChpID0gMDsgOyBpKyspIHsKKyAgICAgICAgUHlPYmplY3QgKml0ZW0gPSBQeVNlcXVlbmNlX0dldEl0ZW0oZnJvbWxpc3QsIGkpOworICAgICAgICBpbnQgaGFzaXQ7CisgICAgICAgIGlmIChpdGVtID09IE5VTEwpIHsKKyAgICAgICAgICAgIGlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0luZGV4RXJyb3IpKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGlmICghUHlTdHJpbmdfQ2hlY2soaXRlbSkpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkl0ZW0gaW4gYGBmcm9tIGxpc3QnJyBub3QgYSBzdHJpbmciKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGlmIChQeVN0cmluZ19BU19TVFJJTkcoaXRlbSlbMF0gPT0gJyonKSB7CisgICAgICAgICAgICBQeU9iamVjdCAqYWxsOworICAgICAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgICAgICAgICAgLyogU2VlIGlmIHRoZSBwYWNrYWdlIGRlZmluZXMgX19hbGxfXyAqLworICAgICAgICAgICAgaWYgKHJlY3Vyc2l2ZSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsgLyogQXZvaWQgZW5kbGVzcyByZWN1cnNpb24gKi8KKyAgICAgICAgICAgIGFsbCA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcobW9kLCAiX19hbGxfXyIpOworICAgICAgICAgICAgaWYgKGFsbCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnQgcmV0ID0gZW5zdXJlX2Zyb21saXN0KG1vZCwgYWxsLCBidWYsIGJ1ZmxlbiwgMSk7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGFsbCk7CisgICAgICAgICAgICAgICAgaWYgKCFyZXQpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaGFzaXQgPSBQeU9iamVjdF9IYXNBdHRyKG1vZCwgaXRlbSk7CisgICAgICAgIGlmICghaGFzaXQpIHsKKyAgICAgICAgICAgIGNoYXIgKnN1Ym5hbWUgPSBQeVN0cmluZ19BU19TVFJJTkcoaXRlbSk7CisgICAgICAgICAgICBQeU9iamVjdCAqc3VibW9kOworICAgICAgICAgICAgY2hhciAqcDsKKyAgICAgICAgICAgIGlmIChidWZsZW4gKyBzdHJsZW4oc3VibmFtZSkgPj0gTUFYUEFUSExFTikgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTW9kdWxlIG5hbWUgdG9vIGxvbmciKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwID0gYnVmICsgYnVmbGVuOworICAgICAgICAgICAgKnArKyA9ICcuJzsKKyAgICAgICAgICAgIHN0cmNweShwLCBzdWJuYW1lKTsKKyAgICAgICAgICAgIHN1Ym1vZCA9IGltcG9ydF9zdWJtb2R1bGUobW9kLCBzdWJuYW1lLCBidWYpOworICAgICAgICAgICAgUHlfWERFQ1JFRihzdWJtb2QpOworICAgICAgICAgICAgaWYgKHN1Ym1vZCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICB9CiAKLQkvKiBOT1RSRUFDSEVEICovCisgICAgLyogTk9UUkVBQ0hFRCAqLwogfQogCiBzdGF0aWMgaW50CiBhZGRfc3VibW9kdWxlKFB5T2JqZWN0ICptb2QsIFB5T2JqZWN0ICpzdWJtb2QsIGNoYXIgKmZ1bGxuYW1lLCBjaGFyICpzdWJuYW1lLAotCSAgICAgIFB5T2JqZWN0ICptb2R1bGVzKQorICAgICAgICAgICAgICBQeU9iamVjdCAqbW9kdWxlcykKIHsKLQlpZiAobW9kID09IFB5X05vbmUpCi0JCXJldHVybiAxOwotCS8qIElycmVzcGVjdGl2ZSBvZiB0aGUgc3VjY2VzcyBvZiB0aGlzIGxvYWQsIG1ha2UgYQotCSAgIHJlZmVyZW5jZSB0byBpdCBpbiB0aGUgcGFyZW50IHBhY2thZ2UgbW9kdWxlLiAgQSBjb3B5IGdldHMKLQkgICBzYXZlZCBpbiB0aGUgbW9kdWxlcyBkaWN0aW9uYXJ5IHVuZGVyIHRoZSBmdWxsIG5hbWUsIHNvIGdldCBhCi0JICAgcmVmZXJlbmNlIGZyb20gdGhlcmUsIGlmIG5lZWQgYmUuICAoVGhlIGV4Y2VwdGlvbiBpcyB3aGVuIHRoZQotCSAgIGxvYWQgZmFpbGVkIHdpdGggYSBTeW50YXhFcnJvciAtLSB0aGVuIHRoZXJlJ3Mgbm8gdHJhY2UgaW4KLQkgICBzeXMubW9kdWxlcy4gIEluIHRoYXQgY2FzZSwgb2YgY291cnNlLCBkbyBub3RoaW5nIGV4dHJhLikgKi8KLQlpZiAoc3VibW9kID09IE5VTEwpIHsKLQkJc3VibW9kID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcobW9kdWxlcywgZnVsbG5hbWUpOwotCQlpZiAoc3VibW9kID09IE5VTEwpCi0JCQlyZXR1cm4gMTsKLQl9Ci0JaWYgKFB5TW9kdWxlX0NoZWNrKG1vZCkpIHsKLQkJLyogV2UgY2FuJ3QgdXNlIHNldGF0dHIgaGVyZSBzaW5jZSBpdCBjYW4gZ2l2ZSBhCi0JCSAqIHNwdXJpb3VzIHdhcm5pbmcgaWYgdGhlIHN1Ym1vZHVsZSBuYW1lIHNoYWRvd3MgYQotCQkgKiBidWlsdGluIG5hbWUgKi8KLQkJUHlPYmplY3QgKmRpY3QgPSBQeU1vZHVsZV9HZXREaWN0KG1vZCk7Ci0JCWlmICghZGljdCkKLQkJCXJldHVybiAwOwotCQlpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgc3VibmFtZSwgc3VibW9kKSA8IDApCi0JCQlyZXR1cm4gMDsKLQl9Ci0JZWxzZSB7Ci0JCWlmIChQeU9iamVjdF9TZXRBdHRyU3RyaW5nKG1vZCwgc3VibmFtZSwgc3VibW9kKSA8IDApCi0JCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIDE7CisgICAgaWYgKG1vZCA9PSBQeV9Ob25lKQorICAgICAgICByZXR1cm4gMTsKKyAgICAvKiBJcnJlc3BlY3RpdmUgb2YgdGhlIHN1Y2Nlc3Mgb2YgdGhpcyBsb2FkLCBtYWtlIGEKKyAgICAgICByZWZlcmVuY2UgdG8gaXQgaW4gdGhlIHBhcmVudCBwYWNrYWdlIG1vZHVsZS4gIEEgY29weSBnZXRzCisgICAgICAgc2F2ZWQgaW4gdGhlIG1vZHVsZXMgZGljdGlvbmFyeSB1bmRlciB0aGUgZnVsbCBuYW1lLCBzbyBnZXQgYQorICAgICAgIHJlZmVyZW5jZSBmcm9tIHRoZXJlLCBpZiBuZWVkIGJlLiAgKFRoZSBleGNlcHRpb24gaXMgd2hlbiB0aGUKKyAgICAgICBsb2FkIGZhaWxlZCB3aXRoIGEgU3ludGF4RXJyb3IgLS0gdGhlbiB0aGVyZSdzIG5vIHRyYWNlIGluCisgICAgICAgc3lzLm1vZHVsZXMuICBJbiB0aGF0IGNhc2UsIG9mIGNvdXJzZSwgZG8gbm90aGluZyBleHRyYS4pICovCisgICAgaWYgKHN1Ym1vZCA9PSBOVUxMKSB7CisgICAgICAgIHN1Ym1vZCA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKG1vZHVsZXMsIGZ1bGxuYW1lKTsKKyAgICAgICAgaWYgKHN1Ym1vZCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmIChQeU1vZHVsZV9DaGVjayhtb2QpKSB7CisgICAgICAgIC8qIFdlIGNhbid0IHVzZSBzZXRhdHRyIGhlcmUgc2luY2UgaXQgY2FuIGdpdmUgYQorICAgICAgICAgKiBzcHVyaW91cyB3YXJuaW5nIGlmIHRoZSBzdWJtb2R1bGUgbmFtZSBzaGFkb3dzIGEKKyAgICAgICAgICogYnVpbHRpbiBuYW1lICovCisgICAgICAgIFB5T2JqZWN0ICpkaWN0ID0gUHlNb2R1bGVfR2V0RGljdChtb2QpOworICAgICAgICBpZiAoIWRpY3QpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsIHN1Ym5hbWUsIHN1Ym1vZCkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZiAoUHlPYmplY3RfU2V0QXR0clN0cmluZyhtb2QsIHN1Ym5hbWUsIHN1Ym1vZCkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaW1wb3J0X3N1Ym1vZHVsZShQeU9iamVjdCAqbW9kLCBjaGFyICpzdWJuYW1lLCBjaGFyICpmdWxsbmFtZSkKIHsKLQlQeU9iamVjdCAqbW9kdWxlcyA9IFB5SW1wb3J0X0dldE1vZHVsZURpY3QoKTsKLQlQeU9iamVjdCAqbSA9IE5VTEw7CisgICAgUHlPYmplY3QgKm1vZHVsZXMgPSBQeUltcG9ydF9HZXRNb2R1bGVEaWN0KCk7CisgICAgUHlPYmplY3QgKm0gPSBOVUxMOwogCi0JLyogUmVxdWlyZToKLQkgICBpZiBtb2QgPT0gTm9uZTogc3VibmFtZSA9PSBmdWxsbmFtZQotCSAgIGVsc2U6IG1vZC5fX25hbWVfXyArICIuIiArIHN1Ym5hbWUgPT0gZnVsbG5hbWUKLQkqLworICAgIC8qIFJlcXVpcmU6CisgICAgICAgaWYgbW9kID09IE5vbmU6IHN1Ym5hbWUgPT0gZnVsbG5hbWUKKyAgICAgICBlbHNlOiBtb2QuX19uYW1lX18gKyAiLiIgKyBzdWJuYW1lID09IGZ1bGxuYW1lCisgICAgKi8KIAotCWlmICgobSA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKG1vZHVsZXMsIGZ1bGxuYW1lKSkgIT0gTlVMTCkgewotCQlQeV9JTkNSRUYobSk7Ci0JfQotCWVsc2UgewotCQlQeU9iamVjdCAqcGF0aCwgKmxvYWRlciA9IE5VTEw7Ci0JCWNoYXIgYnVmW01BWFBBVEhMRU4rMV07Ci0JCXN0cnVjdCBmaWxlZGVzY3IgKmZkcDsKLQkJRklMRSAqZnAgPSBOVUxMOworICAgIGlmICgobSA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKG1vZHVsZXMsIGZ1bGxuYW1lKSkgIT0gTlVMTCkgeworICAgICAgICBQeV9JTkNSRUYobSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeU9iamVjdCAqcGF0aCwgKmxvYWRlciA9IE5VTEw7CisgICAgICAgIGNoYXIgYnVmW01BWFBBVEhMRU4rMV07CisgICAgICAgIHN0cnVjdCBmaWxlZGVzY3IgKmZkcDsKKyAgICAgICAgRklMRSAqZnAgPSBOVUxMOwogCi0JCWlmIChtb2QgPT0gUHlfTm9uZSkKLQkJCXBhdGggPSBOVUxMOwotCQllbHNlIHsKLQkJCXBhdGggPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKG1vZCwgIl9fcGF0aF9fIik7Ci0JCQlpZiAocGF0aCA9PSBOVUxMKSB7Ci0JCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCQkJcmV0dXJuIFB5X05vbmU7Ci0JCQl9Ci0JCX0KKyAgICAgICAgaWYgKG1vZCA9PSBQeV9Ob25lKQorICAgICAgICAgICAgcGF0aCA9IE5VTEw7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcGF0aCA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcobW9kLCAiX19wYXRoX18iKTsKKyAgICAgICAgICAgIGlmIChwYXRoID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCWJ1ZlswXSA9ICdcMCc7Ci0JCWZkcCA9IGZpbmRfbW9kdWxlKGZ1bGxuYW1lLCBzdWJuYW1lLCBwYXRoLCBidWYsIE1BWFBBVEhMRU4rMSwKLQkJCQkgICZmcCwgJmxvYWRlcik7Ci0JCVB5X1hERUNSRUYocGF0aCk7Ci0JCWlmIChmZHAgPT0gTlVMTCkgewotCQkJaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0ltcG9ydEVycm9yKSkKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCVB5RXJyX0NsZWFyKCk7Ci0JCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCQlyZXR1cm4gUHlfTm9uZTsKLQkJfQotCQltID0gbG9hZF9tb2R1bGUoZnVsbG5hbWUsIGZwLCBidWYsIGZkcC0+dHlwZSwgbG9hZGVyKTsKLQkJUHlfWERFQ1JFRihsb2FkZXIpOwotCQlpZiAoZnApCi0JCQlmY2xvc2UoZnApOwotCQlpZiAoIWFkZF9zdWJtb2R1bGUobW9kLCBtLCBmdWxsbmFtZSwgc3VibmFtZSwgbW9kdWxlcykpIHsKLQkJCVB5X1hERUNSRUYobSk7Ci0JCQltID0gTlVMTDsKLQkJfQotCX0KKyAgICAgICAgYnVmWzBdID0gJ1wwJzsKKyAgICAgICAgZmRwID0gZmluZF9tb2R1bGUoZnVsbG5hbWUsIHN1Ym5hbWUsIHBhdGgsIGJ1ZiwgTUFYUEFUSExFTisxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZnAsICZsb2FkZXIpOworICAgICAgICBQeV9YREVDUkVGKHBhdGgpOworICAgICAgICBpZiAoZmRwID09IE5VTEwpIHsKKyAgICAgICAgICAgIGlmICghUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19JbXBvcnRFcnJvcikpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgICAgIH0KKyAgICAgICAgbSA9IGxvYWRfbW9kdWxlKGZ1bGxuYW1lLCBmcCwgYnVmLCBmZHAtPnR5cGUsIGxvYWRlcik7CisgICAgICAgIFB5X1hERUNSRUYobG9hZGVyKTsKKyAgICAgICAgaWYgKGZwKQorICAgICAgICAgICAgZmNsb3NlKGZwKTsKKyAgICAgICAgaWYgKCFhZGRfc3VibW9kdWxlKG1vZCwgbSwgZnVsbG5hbWUsIHN1Ym5hbWUsIG1vZHVsZXMpKSB7CisgICAgICAgICAgICBQeV9YREVDUkVGKG0pOworICAgICAgICAgICAgbSA9IE5VTEw7CisgICAgICAgIH0KKyAgICB9CiAKLQlyZXR1cm4gbTsKKyAgICByZXR1cm4gbTsKIH0KIAogCkBAIC0yNjA4LDk2ICsyNjA4LDk2IEBACiBQeU9iamVjdCAqCiBQeUltcG9ydF9SZWxvYWRNb2R1bGUoUHlPYmplY3QgKm0pCiB7Ci0JUHlJbnRlcnByZXRlclN0YXRlICppbnRlcnAgPSBQeVRocmVhZFN0YXRlX0dldCgpLT5pbnRlcnA7Ci0JUHlPYmplY3QgKm1vZHVsZXNfcmVsb2FkaW5nID0gaW50ZXJwLT5tb2R1bGVzX3JlbG9hZGluZzsKLQlQeU9iamVjdCAqbW9kdWxlcyA9IFB5SW1wb3J0X0dldE1vZHVsZURpY3QoKTsKLQlQeU9iamVjdCAqcGF0aCA9IE5VTEwsICpsb2FkZXIgPSBOVUxMLCAqZXhpc3RpbmdfbSA9IE5VTEw7Ci0JY2hhciAqbmFtZSwgKnN1Ym5hbWU7Ci0JY2hhciBidWZbTUFYUEFUSExFTisxXTsKLQlzdHJ1Y3QgZmlsZWRlc2NyICpmZHA7Ci0JRklMRSAqZnAgPSBOVUxMOwotCVB5T2JqZWN0ICpuZXdtOwotICAgIAotCWlmIChtb2R1bGVzX3JlbG9hZGluZyA9PSBOVUxMKSB7Ci0JCVB5X0ZhdGFsRXJyb3IoIlB5SW1wb3J0X1JlbG9hZE1vZHVsZTogIgotCQkJICAgICAgIm5vIG1vZHVsZXNfcmVsb2FkaW5nIGRpY3Rpb25hcnkhIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBQeUludGVycHJldGVyU3RhdGUgKmludGVycCA9IFB5VGhyZWFkU3RhdGVfR2V0KCktPmludGVycDsKKyAgICBQeU9iamVjdCAqbW9kdWxlc19yZWxvYWRpbmcgPSBpbnRlcnAtPm1vZHVsZXNfcmVsb2FkaW5nOworICAgIFB5T2JqZWN0ICptb2R1bGVzID0gUHlJbXBvcnRfR2V0TW9kdWxlRGljdCgpOworICAgIFB5T2JqZWN0ICpwYXRoID0gTlVMTCwgKmxvYWRlciA9IE5VTEwsICpleGlzdGluZ19tID0gTlVMTDsKKyAgICBjaGFyICpuYW1lLCAqc3VibmFtZTsKKyAgICBjaGFyIGJ1ZltNQVhQQVRITEVOKzFdOworICAgIHN0cnVjdCBmaWxlZGVzY3IgKmZkcDsKKyAgICBGSUxFICpmcCA9IE5VTEw7CisgICAgUHlPYmplY3QgKm5ld207CiAKLQlpZiAobSA9PSBOVUxMIHx8ICFQeU1vZHVsZV9DaGVjayhtKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJyZWxvYWQoKSBhcmd1bWVudCBtdXN0IGJlIG1vZHVsZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JbmFtZSA9IFB5TW9kdWxlX0dldE5hbWUobSk7Ci0JaWYgKG5hbWUgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKG0gIT0gUHlEaWN0X0dldEl0ZW1TdHJpbmcobW9kdWxlcywgbmFtZSkpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX0ltcG9ydEVycm9yLAotCQkJICAgICAicmVsb2FkKCk6IG1vZHVsZSAlLjIwMHMgbm90IGluIHN5cy5tb2R1bGVzIiwKLQkJCSAgICAgbmFtZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlleGlzdGluZ19tID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcobW9kdWxlc19yZWxvYWRpbmcsIG5hbWUpOwotCWlmIChleGlzdGluZ19tICE9IE5VTEwpIHsKLQkJLyogRHVlIHRvIGEgcmVjdXJzaXZlIHJlbG9hZCwgdGhpcyBtb2R1bGUgaXMgYWxyZWFkeQotCQkgICBiZWluZyByZWxvYWRlZC4gKi8KLQkJUHlfSU5DUkVGKGV4aXN0aW5nX20pOwotCQlyZXR1cm4gZXhpc3RpbmdfbTsKLSAJfQotIAlpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcobW9kdWxlc19yZWxvYWRpbmcsIG5hbWUsIG0pIDwgMCkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKG1vZHVsZXNfcmVsb2FkaW5nID09IE5VTEwpIHsKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiUHlJbXBvcnRfUmVsb2FkTW9kdWxlOiAiCisgICAgICAgICAgICAgICAgICAgICAgIm5vIG1vZHVsZXNfcmVsb2FkaW5nIGRpY3Rpb25hcnkhIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXN1Ym5hbWUgPSBzdHJyY2hyKG5hbWUsICcuJyk7Ci0JaWYgKHN1Ym5hbWUgPT0gTlVMTCkKLQkJc3VibmFtZSA9IG5hbWU7Ci0JZWxzZSB7Ci0JCVB5T2JqZWN0ICpwYXJlbnRuYW1lLCAqcGFyZW50OwotCQlwYXJlbnRuYW1lID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUobmFtZSwgKHN1Ym5hbWUtbmFtZSkpOwotCQlpZiAocGFyZW50bmFtZSA9PSBOVUxMKSB7Ci0JCQlpbXBfbW9kdWxlc19yZWxvYWRpbmdfY2xlYXIoKTsKLQkJCXJldHVybiBOVUxMOwotICAgICAgICAJfQotCQlwYXJlbnQgPSBQeURpY3RfR2V0SXRlbShtb2R1bGVzLCBwYXJlbnRuYW1lKTsKLQkJaWYgKHBhcmVudCA9PSBOVUxMKSB7Ci0JCQlQeUVycl9Gb3JtYXQoUHlFeGNfSW1wb3J0RXJyb3IsCi0JCQkgICAgInJlbG9hZCgpOiBwYXJlbnQgJS4yMDBzIG5vdCBpbiBzeXMubW9kdWxlcyIsCi0JCQkgICAgUHlTdHJpbmdfQVNfU1RSSU5HKHBhcmVudG5hbWUpKTsKLQkJCVB5X0RFQ1JFRihwYXJlbnRuYW1lKTsKLQkJCWltcF9tb2R1bGVzX3JlbG9hZGluZ19jbGVhcigpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJUHlfREVDUkVGKHBhcmVudG5hbWUpOwotCQlzdWJuYW1lKys7Ci0JCXBhdGggPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHBhcmVudCwgIl9fcGF0aF9fIik7Ci0JCWlmIChwYXRoID09IE5VTEwpCi0JCQlQeUVycl9DbGVhcigpOwotCX0KLQlidWZbMF0gPSAnXDAnOwotCWZkcCA9IGZpbmRfbW9kdWxlKG5hbWUsIHN1Ym5hbWUsIHBhdGgsIGJ1ZiwgTUFYUEFUSExFTisxLCAmZnAsICZsb2FkZXIpOwotCVB5X1hERUNSRUYocGF0aCk7CisgICAgaWYgKG0gPT0gTlVMTCB8fCAhUHlNb2R1bGVfQ2hlY2sobSkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJyZWxvYWQoKSBhcmd1bWVudCBtdXN0IGJlIG1vZHVsZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgbmFtZSA9IFB5TW9kdWxlX0dldE5hbWUobSk7CisgICAgaWYgKG5hbWUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKG0gIT0gUHlEaWN0X0dldEl0ZW1TdHJpbmcobW9kdWxlcywgbmFtZSkpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX0ltcG9ydEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgInJlbG9hZCgpOiBtb2R1bGUgJS4yMDBzIG5vdCBpbiBzeXMubW9kdWxlcyIsCisgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGV4aXN0aW5nX20gPSBQeURpY3RfR2V0SXRlbVN0cmluZyhtb2R1bGVzX3JlbG9hZGluZywgbmFtZSk7CisgICAgaWYgKGV4aXN0aW5nX20gIT0gTlVMTCkgeworICAgICAgICAvKiBEdWUgdG8gYSByZWN1cnNpdmUgcmVsb2FkLCB0aGlzIG1vZHVsZSBpcyBhbHJlYWR5CisgICAgICAgICAgIGJlaW5nIHJlbG9hZGVkLiAqLworICAgICAgICBQeV9JTkNSRUYoZXhpc3RpbmdfbSk7CisgICAgICAgIHJldHVybiBleGlzdGluZ19tOworICAgIH0KKyAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcobW9kdWxlc19yZWxvYWRpbmcsIG5hbWUsIG0pIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoZmRwID09IE5VTEwpIHsKLQkJUHlfWERFQ1JFRihsb2FkZXIpOwotCQlpbXBfbW9kdWxlc19yZWxvYWRpbmdfY2xlYXIoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIHN1Ym5hbWUgPSBzdHJyY2hyKG5hbWUsICcuJyk7CisgICAgaWYgKHN1Ym5hbWUgPT0gTlVMTCkKKyAgICAgICAgc3VibmFtZSA9IG5hbWU7CisgICAgZWxzZSB7CisgICAgICAgIFB5T2JqZWN0ICpwYXJlbnRuYW1lLCAqcGFyZW50OworICAgICAgICBwYXJlbnRuYW1lID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUobmFtZSwgKHN1Ym5hbWUtbmFtZSkpOworICAgICAgICBpZiAocGFyZW50bmFtZSA9PSBOVUxMKSB7CisgICAgICAgICAgICBpbXBfbW9kdWxlc19yZWxvYWRpbmdfY2xlYXIoKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHBhcmVudCA9IFB5RGljdF9HZXRJdGVtKG1vZHVsZXMsIHBhcmVudG5hbWUpOworICAgICAgICBpZiAocGFyZW50ID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19JbXBvcnRFcnJvciwKKyAgICAgICAgICAgICAgICAicmVsb2FkKCk6IHBhcmVudCAlLjIwMHMgbm90IGluIHN5cy5tb2R1bGVzIiwKKyAgICAgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcocGFyZW50bmFtZSkpOworICAgICAgICAgICAgUHlfREVDUkVGKHBhcmVudG5hbWUpOworICAgICAgICAgICAgaW1wX21vZHVsZXNfcmVsb2FkaW5nX2NsZWFyKCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBQeV9ERUNSRUYocGFyZW50bmFtZSk7CisgICAgICAgIHN1Ym5hbWUrKzsKKyAgICAgICAgcGF0aCA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcocGFyZW50LCAiX19wYXRoX18iKTsKKyAgICAgICAgaWYgKHBhdGggPT0gTlVMTCkKKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgfQorICAgIGJ1ZlswXSA9ICdcMCc7CisgICAgZmRwID0gZmluZF9tb2R1bGUobmFtZSwgc3VibmFtZSwgcGF0aCwgYnVmLCBNQVhQQVRITEVOKzEsICZmcCwgJmxvYWRlcik7CisgICAgUHlfWERFQ1JFRihwYXRoKTsKIAotCW5ld20gPSBsb2FkX21vZHVsZShuYW1lLCBmcCwgYnVmLCBmZHAtPnR5cGUsIGxvYWRlcik7Ci0JUHlfWERFQ1JFRihsb2FkZXIpOworICAgIGlmIChmZHAgPT0gTlVMTCkgeworICAgICAgICBQeV9YREVDUkVGKGxvYWRlcik7CisgICAgICAgIGltcF9tb2R1bGVzX3JlbG9hZGluZ19jbGVhcigpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlpZiAoZnApCi0JCWZjbG9zZShmcCk7Ci0JaWYgKG5ld20gPT0gTlVMTCkgewotCQkvKiBsb2FkX21vZHVsZSBwcm9iYWJseSByZW1vdmVkIG5hbWUgZnJvbSBtb2R1bGVzIGJlY2F1c2Ugb2YKLQkJICogdGhlIGVycm9yLiAgUHV0IGJhY2sgdGhlIG9yaWdpbmFsIG1vZHVsZSBvYmplY3QuICBXZSdyZQotCQkgKiBnb2luZyB0byByZXR1cm4gTlVMTCBpbiB0aGlzIGNhc2UgcmVnYXJkbGVzcyBvZiB3aGV0aGVyCi0JCSAqIHJlcGxhY2luZyBuYW1lIHN1Y2NlZWRzLCBzbyB0aGUgcmV0dXJuIHZhbHVlIGlzIGlnbm9yZWQuCi0JCSAqLwotCQlQeURpY3RfU2V0SXRlbVN0cmluZyhtb2R1bGVzLCBuYW1lLCBtKTsKLQl9Ci0JaW1wX21vZHVsZXNfcmVsb2FkaW5nX2NsZWFyKCk7Ci0JcmV0dXJuIG5ld207CisgICAgbmV3bSA9IGxvYWRfbW9kdWxlKG5hbWUsIGZwLCBidWYsIGZkcC0+dHlwZSwgbG9hZGVyKTsKKyAgICBQeV9YREVDUkVGKGxvYWRlcik7CisKKyAgICBpZiAoZnApCisgICAgICAgIGZjbG9zZShmcCk7CisgICAgaWYgKG5ld20gPT0gTlVMTCkgeworICAgICAgICAvKiBsb2FkX21vZHVsZSBwcm9iYWJseSByZW1vdmVkIG5hbWUgZnJvbSBtb2R1bGVzIGJlY2F1c2Ugb2YKKyAgICAgICAgICogdGhlIGVycm9yLiAgUHV0IGJhY2sgdGhlIG9yaWdpbmFsIG1vZHVsZSBvYmplY3QuICBXZSdyZQorICAgICAgICAgKiBnb2luZyB0byByZXR1cm4gTlVMTCBpbiB0aGlzIGNhc2UgcmVnYXJkbGVzcyBvZiB3aGV0aGVyCisgICAgICAgICAqIHJlcGxhY2luZyBuYW1lIHN1Y2NlZWRzLCBzbyB0aGUgcmV0dXJuIHZhbHVlIGlzIGlnbm9yZWQuCisgICAgICAgICAqLworICAgICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhtb2R1bGVzLCBuYW1lLCBtKTsKKyAgICB9CisgICAgaW1wX21vZHVsZXNfcmVsb2FkaW5nX2NsZWFyKCk7CisgICAgcmV0dXJuIG5ld207CiB9CiAKIApAQCAtMjcxMyw2OCArMjcxMyw2OCBAQAogUHlPYmplY3QgKgogUHlJbXBvcnRfSW1wb3J0KFB5T2JqZWN0ICptb2R1bGVfbmFtZSkKIHsKLQlzdGF0aWMgUHlPYmplY3QgKnNpbGx5X2xpc3QgPSBOVUxMOwotCXN0YXRpYyBQeU9iamVjdCAqYnVpbHRpbnNfc3RyID0gTlVMTDsKLQlzdGF0aWMgUHlPYmplY3QgKmltcG9ydF9zdHIgPSBOVUxMOwotCVB5T2JqZWN0ICpnbG9iYWxzID0gTlVMTDsKLQlQeU9iamVjdCAqaW1wb3J0ID0gTlVMTDsKLQlQeU9iamVjdCAqYnVpbHRpbnMgPSBOVUxMOwotCVB5T2JqZWN0ICpyID0gTlVMTDsKKyAgICBzdGF0aWMgUHlPYmplY3QgKnNpbGx5X2xpc3QgPSBOVUxMOworICAgIHN0YXRpYyBQeU9iamVjdCAqYnVpbHRpbnNfc3RyID0gTlVMTDsKKyAgICBzdGF0aWMgUHlPYmplY3QgKmltcG9ydF9zdHIgPSBOVUxMOworICAgIFB5T2JqZWN0ICpnbG9iYWxzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqaW1wb3J0ID0gTlVMTDsKKyAgICBQeU9iamVjdCAqYnVpbHRpbnMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpyID0gTlVMTDsKIAotCS8qIEluaXRpYWxpemUgY29uc3RhbnQgc3RyaW5nIG9iamVjdHMgKi8KLQlpZiAoc2lsbHlfbGlzdCA9PSBOVUxMKSB7Ci0JCWltcG9ydF9zdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2ltcG9ydF9fIik7Ci0JCWlmIChpbXBvcnRfc3RyID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQkJYnVpbHRpbnNfc3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19idWlsdGluc19fIik7Ci0JCWlmIChidWlsdGluc19zdHIgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQlzaWxseV9saXN0ID0gUHlfQnVpbGRWYWx1ZSgiW3NdIiwgIl9fZG9jX18iKTsKLQkJaWYgKHNpbGx5X2xpc3QgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCX0KKyAgICAvKiBJbml0aWFsaXplIGNvbnN0YW50IHN0cmluZyBvYmplY3RzICovCisgICAgaWYgKHNpbGx5X2xpc3QgPT0gTlVMTCkgeworICAgICAgICBpbXBvcnRfc3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19pbXBvcnRfXyIpOworICAgICAgICBpZiAoaW1wb3J0X3N0ciA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGJ1aWx0aW5zX3N0ciA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fYnVpbHRpbnNfXyIpOworICAgICAgICBpZiAoYnVpbHRpbnNfc3RyID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgc2lsbHlfbGlzdCA9IFB5X0J1aWxkVmFsdWUoIltzXSIsICJfX2RvY19fIik7CisgICAgICAgIGlmIChzaWxseV9saXN0ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQkvKiBHZXQgdGhlIGJ1aWx0aW5zIGZyb20gY3VycmVudCBnbG9iYWxzICovCi0JZ2xvYmFscyA9IFB5RXZhbF9HZXRHbG9iYWxzKCk7Ci0JaWYgKGdsb2JhbHMgIT0gTlVMTCkgewotCSAgICAgICAgUHlfSU5DUkVGKGdsb2JhbHMpOwotCQlidWlsdGlucyA9IFB5T2JqZWN0X0dldEl0ZW0oZ2xvYmFscywgYnVpbHRpbnNfc3RyKTsKLQkJaWYgKGJ1aWx0aW5zID09IE5VTEwpCi0JCQlnb3RvIGVycjsKLQl9Ci0JZWxzZSB7Ci0JCS8qIE5vIGdsb2JhbHMgLS0gdXNlIHN0YW5kYXJkIGJ1aWx0aW5zLCBhbmQgZmFrZSBnbG9iYWxzICovCi0JCWJ1aWx0aW5zID0gUHlJbXBvcnRfSW1wb3J0TW9kdWxlTGV2ZWwoIl9fYnVpbHRpbl9fIiwKLQkJCQkJCSAgICAgIE5VTEwsIE5VTEwsIE5VTEwsIDApOwotCQlpZiAoYnVpbHRpbnMgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQlnbG9iYWxzID0gUHlfQnVpbGRWYWx1ZSgie09PfSIsIGJ1aWx0aW5zX3N0ciwgYnVpbHRpbnMpOwotCQlpZiAoZ2xvYmFscyA9PSBOVUxMKQotCQkJZ290byBlcnI7Ci0JfQorICAgIC8qIEdldCB0aGUgYnVpbHRpbnMgZnJvbSBjdXJyZW50IGdsb2JhbHMgKi8KKyAgICBnbG9iYWxzID0gUHlFdmFsX0dldEdsb2JhbHMoKTsKKyAgICBpZiAoZ2xvYmFscyAhPSBOVUxMKSB7CisgICAgICAgIFB5X0lOQ1JFRihnbG9iYWxzKTsKKyAgICAgICAgYnVpbHRpbnMgPSBQeU9iamVjdF9HZXRJdGVtKGdsb2JhbHMsIGJ1aWx0aW5zX3N0cik7CisgICAgICAgIGlmIChidWlsdGlucyA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBlcnI7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvKiBObyBnbG9iYWxzIC0tIHVzZSBzdGFuZGFyZCBidWlsdGlucywgYW5kIGZha2UgZ2xvYmFscyAqLworICAgICAgICBidWlsdGlucyA9IFB5SW1wb3J0X0ltcG9ydE1vZHVsZUxldmVsKCJfX2J1aWx0aW5fXyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCwgMCk7CisgICAgICAgIGlmIChidWlsdGlucyA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGdsb2JhbHMgPSBQeV9CdWlsZFZhbHVlKCJ7T099IiwgYnVpbHRpbnNfc3RyLCBidWlsdGlucyk7CisgICAgICAgIGlmIChnbG9iYWxzID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGVycjsKKyAgICB9CiAKLQkvKiBHZXQgdGhlIF9faW1wb3J0X18gZnVuY3Rpb24gZnJvbSB0aGUgYnVpbHRpbnMgKi8KLQlpZiAoUHlEaWN0X0NoZWNrKGJ1aWx0aW5zKSkgewotCQlpbXBvcnQgPSBQeU9iamVjdF9HZXRJdGVtKGJ1aWx0aW5zLCBpbXBvcnRfc3RyKTsKLQkJaWYgKGltcG9ydCA9PSBOVUxMKQotCQkJUHlFcnJfU2V0T2JqZWN0KFB5RXhjX0tleUVycm9yLCBpbXBvcnRfc3RyKTsKLQl9Ci0JZWxzZQotCQlpbXBvcnQgPSBQeU9iamVjdF9HZXRBdHRyKGJ1aWx0aW5zLCBpbXBvcnRfc3RyKTsKLQlpZiAoaW1wb3J0ID09IE5VTEwpCi0JCWdvdG8gZXJyOworICAgIC8qIEdldCB0aGUgX19pbXBvcnRfXyBmdW5jdGlvbiBmcm9tIHRoZSBidWlsdGlucyAqLworICAgIGlmIChQeURpY3RfQ2hlY2soYnVpbHRpbnMpKSB7CisgICAgICAgIGltcG9ydCA9IFB5T2JqZWN0X0dldEl0ZW0oYnVpbHRpbnMsIGltcG9ydF9zdHIpOworICAgICAgICBpZiAoaW1wb3J0ID09IE5VTEwpCisgICAgICAgICAgICBQeUVycl9TZXRPYmplY3QoUHlFeGNfS2V5RXJyb3IsIGltcG9ydF9zdHIpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIGltcG9ydCA9IFB5T2JqZWN0X0dldEF0dHIoYnVpbHRpbnMsIGltcG9ydF9zdHIpOworICAgIGlmIChpbXBvcnQgPT0gTlVMTCkKKyAgICAgICAgZ290byBlcnI7CiAKLQkvKiBDYWxsIHRoZSBfX2ltcG9ydF9fIGZ1bmN0aW9uIHdpdGggdGhlIHByb3BlciBhcmd1bWVudCBsaXN0Ci0JICogQWx3YXlzIHVzZSBhYnNvbHV0ZSBpbXBvcnQgaGVyZS4gKi8KLQlyID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKGltcG9ydCwgIk9PT09pIiwgbW9kdWxlX25hbWUsIGdsb2JhbHMsCi0JCQkJICBnbG9iYWxzLCBzaWxseV9saXN0LCAwLCBOVUxMKTsKKyAgICAvKiBDYWxsIHRoZSBfX2ltcG9ydF9fIGZ1bmN0aW9uIHdpdGggdGhlIHByb3BlciBhcmd1bWVudCBsaXN0CisgICAgICogQWx3YXlzIHVzZSBhYnNvbHV0ZSBpbXBvcnQgaGVyZS4gKi8KKyAgICByID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKGltcG9ydCwgIk9PT09pIiwgbW9kdWxlX25hbWUsIGdsb2JhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxzLCBzaWxseV9saXN0LCAwLCBOVUxMKTsKIAogICBlcnI6Ci0JUHlfWERFQ1JFRihnbG9iYWxzKTsKLQlQeV9YREVDUkVGKGJ1aWx0aW5zKTsKLQlQeV9YREVDUkVGKGltcG9ydCk7CisgICAgUHlfWERFQ1JFRihnbG9iYWxzKTsKKyAgICBQeV9YREVDUkVGKGJ1aWx0aW5zKTsKKyAgICBQeV9YREVDUkVGKGltcG9ydCk7CiAKLQlyZXR1cm4gcjsKKyAgICByZXR1cm4gcjsKIH0KIAogCkBAIC0yNzg1LDE5MiArMjc4NSwxOTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbXBfZ2V0X21hZ2ljKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqbm9hcmdzKQogewotCWNoYXIgYnVmWzRdOworICAgIGNoYXIgYnVmWzRdOwogCi0JYnVmWzBdID0gKGNoYXIpICgocHljX21hZ2ljID4+ICAwKSAmIDB4ZmYpOwotCWJ1ZlsxXSA9IChjaGFyKSAoKHB5Y19tYWdpYyA+PiAgOCkgJiAweGZmKTsKLQlidWZbMl0gPSAoY2hhcikgKChweWNfbWFnaWMgPj4gMTYpICYgMHhmZik7Ci0JYnVmWzNdID0gKGNoYXIpICgocHljX21hZ2ljID4+IDI0KSAmIDB4ZmYpOworICAgIGJ1ZlswXSA9IChjaGFyKSAoKHB5Y19tYWdpYyA+PiAgMCkgJiAweGZmKTsKKyAgICBidWZbMV0gPSAoY2hhcikgKChweWNfbWFnaWMgPj4gIDgpICYgMHhmZik7CisgICAgYnVmWzJdID0gKGNoYXIpICgocHljX21hZ2ljID4+IDE2KSAmIDB4ZmYpOworICAgIGJ1ZlszXSA9IChjaGFyKSAoKHB5Y19tYWdpYyA+PiAyNCkgJiAweGZmKTsKIAotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShidWYsIDQpOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShidWYsIDQpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaW1wX2dldF9zdWZmaXhlcyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm5vYXJncykKIHsKLQlQeU9iamVjdCAqbGlzdDsKLQlzdHJ1Y3QgZmlsZWRlc2NyICpmZHA7CisgICAgUHlPYmplY3QgKmxpc3Q7CisgICAgc3RydWN0IGZpbGVkZXNjciAqZmRwOwogCi0JbGlzdCA9IFB5TGlzdF9OZXcoMCk7Ci0JaWYgKGxpc3QgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JZm9yIChmZHAgPSBfUHlJbXBvcnRfRmlsZXRhYjsgZmRwLT5zdWZmaXggIT0gTlVMTDsgZmRwKyspIHsKLQkJUHlPYmplY3QgKml0ZW0gPSBQeV9CdWlsZFZhbHVlKCJzc2kiLAotCQkJCSAgICAgICBmZHAtPnN1ZmZpeCwgZmRwLT5tb2RlLCBmZHAtPnR5cGUpOwotCQlpZiAoaXRlbSA9PSBOVUxMKSB7Ci0JCQlQeV9ERUNSRUYobGlzdCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlpZiAoUHlMaXN0X0FwcGVuZChsaXN0LCBpdGVtKSA8IDApIHsKLQkJCVB5X0RFQ1JFRihsaXN0KTsKLQkJCVB5X0RFQ1JFRihpdGVtKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCVB5X0RFQ1JFRihpdGVtKTsKLQl9Ci0JcmV0dXJuIGxpc3Q7CisgICAgbGlzdCA9IFB5TGlzdF9OZXcoMCk7CisgICAgaWYgKGxpc3QgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZm9yIChmZHAgPSBfUHlJbXBvcnRfRmlsZXRhYjsgZmRwLT5zdWZmaXggIT0gTlVMTDsgZmRwKyspIHsKKyAgICAgICAgUHlPYmplY3QgKml0ZW0gPSBQeV9CdWlsZFZhbHVlKCJzc2kiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZkcC0+c3VmZml4LCBmZHAtPm1vZGUsIGZkcC0+dHlwZSk7CisgICAgICAgIGlmIChpdGVtID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihsaXN0KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGlmIChQeUxpc3RfQXBwZW5kKGxpc3QsIGl0ZW0pIDwgMCkgeworICAgICAgICAgICAgUHlfREVDUkVGKGxpc3QpOworICAgICAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgIH0KKyAgICByZXR1cm4gbGlzdDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNhbGxfZmluZF9tb2R1bGUoY2hhciAqbmFtZSwgUHlPYmplY3QgKnBhdGgpCiB7Ci0JZXh0ZXJuIGludCBmY2xvc2UoRklMRSAqKTsKLQlQeU9iamVjdCAqZm9iLCAqcmV0OwotCXN0cnVjdCBmaWxlZGVzY3IgKmZkcDsKLQljaGFyIHBhdGhuYW1lW01BWFBBVEhMRU4rMV07Ci0JRklMRSAqZnAgPSBOVUxMOworICAgIGV4dGVybiBpbnQgZmNsb3NlKEZJTEUgKik7CisgICAgUHlPYmplY3QgKmZvYiwgKnJldDsKKyAgICBzdHJ1Y3QgZmlsZWRlc2NyICpmZHA7CisgICAgY2hhciBwYXRobmFtZVtNQVhQQVRITEVOKzFdOworICAgIEZJTEUgKmZwID0gTlVMTDsKIAotCXBhdGhuYW1lWzBdID0gJ1wwJzsKLQlpZiAocGF0aCA9PSBQeV9Ob25lKQotCQlwYXRoID0gTlVMTDsKLQlmZHAgPSBmaW5kX21vZHVsZShOVUxMLCBuYW1lLCBwYXRoLCBwYXRobmFtZSwgTUFYUEFUSExFTisxLCAmZnAsIE5VTEwpOwotCWlmIChmZHAgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKGZwICE9IE5VTEwpIHsKLQkJZm9iID0gUHlGaWxlX0Zyb21GaWxlKGZwLCBwYXRobmFtZSwgZmRwLT5tb2RlLCBmY2xvc2UpOwotCQlpZiAoZm9iID09IE5VTEwpIHsKLQkJCWZjbG9zZShmcCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KLQllbHNlIHsKLQkJZm9iID0gUHlfTm9uZTsKLQkJUHlfSU5DUkVGKGZvYik7Ci0JfQotCXJldCA9IFB5X0J1aWxkVmFsdWUoIk9zKHNzaSkiLAotCQkgICAgICBmb2IsIHBhdGhuYW1lLCBmZHAtPnN1ZmZpeCwgZmRwLT5tb2RlLCBmZHAtPnR5cGUpOwotCVB5X0RFQ1JFRihmb2IpOwotCXJldHVybiByZXQ7CisgICAgcGF0aG5hbWVbMF0gPSAnXDAnOworICAgIGlmIChwYXRoID09IFB5X05vbmUpCisgICAgICAgIHBhdGggPSBOVUxMOworICAgIGZkcCA9IGZpbmRfbW9kdWxlKE5VTEwsIG5hbWUsIHBhdGgsIHBhdGhuYW1lLCBNQVhQQVRITEVOKzEsICZmcCwgTlVMTCk7CisgICAgaWYgKGZkcCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoZnAgIT0gTlVMTCkgeworICAgICAgICBmb2IgPSBQeUZpbGVfRnJvbUZpbGUoZnAsIHBhdGhuYW1lLCBmZHAtPm1vZGUsIGZjbG9zZSk7CisgICAgICAgIGlmIChmb2IgPT0gTlVMTCkgeworICAgICAgICAgICAgZmNsb3NlKGZwKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBmb2IgPSBQeV9Ob25lOworICAgICAgICBQeV9JTkNSRUYoZm9iKTsKKyAgICB9CisgICAgcmV0ID0gUHlfQnVpbGRWYWx1ZSgiT3Moc3NpKSIsCisgICAgICAgICAgICAgICAgICBmb2IsIHBhdGhuYW1lLCBmZHAtPnN1ZmZpeCwgZmRwLT5tb2RlLCBmZHAtPnR5cGUpOworICAgIFB5X0RFQ1JFRihmb2IpOworICAgIHJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbXBfZmluZF9tb2R1bGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKm5hbWU7Ci0JUHlPYmplY3QgKnBhdGggPSBOVUxMOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic3xPOmZpbmRfbW9kdWxlIiwgJm5hbWUsICZwYXRoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIGNhbGxfZmluZF9tb2R1bGUobmFtZSwgcGF0aCk7CisgICAgY2hhciAqbmFtZTsKKyAgICBQeU9iamVjdCAqcGF0aCA9IE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzfE86ZmluZF9tb2R1bGUiLCAmbmFtZSwgJnBhdGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gY2FsbF9maW5kX21vZHVsZShuYW1lLCBwYXRoKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGltcF9pbml0X2J1aWx0aW4oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKm5hbWU7Ci0JaW50IHJldDsKLQlQeU9iamVjdCAqbTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6aW5pdF9idWlsdGluIiwgJm5hbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXQgPSBpbml0X2J1aWx0aW4obmFtZSk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiBOVUxMOwotCWlmIChyZXQgPT0gMCkgewotCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCXJldHVybiBQeV9Ob25lOwotCX0KLQltID0gUHlJbXBvcnRfQWRkTW9kdWxlKG5hbWUpOwotCVB5X1hJTkNSRUYobSk7Ci0JcmV0dXJuIG07CisgICAgY2hhciAqbmFtZTsKKyAgICBpbnQgcmV0OworICAgIFB5T2JqZWN0ICptOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczppbml0X2J1aWx0aW4iLCAmbmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldCA9IGluaXRfYnVpbHRpbihuYW1lKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKHJldCA9PSAwKSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgfQorICAgIG0gPSBQeUltcG9ydF9BZGRNb2R1bGUobmFtZSk7CisgICAgUHlfWElOQ1JFRihtKTsKKyAgICByZXR1cm4gbTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGltcF9pbml0X2Zyb3plbihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqbmFtZTsKLQlpbnQgcmV0OwotCVB5T2JqZWN0ICptOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczppbml0X2Zyb3plbiIsICZuYW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0ID0gUHlJbXBvcnRfSW1wb3J0RnJvemVuTW9kdWxlKG5hbWUpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAocmV0ID09IDApIHsKLQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQlyZXR1cm4gUHlfTm9uZTsKLQl9Ci0JbSA9IFB5SW1wb3J0X0FkZE1vZHVsZShuYW1lKTsKLQlQeV9YSU5DUkVGKG0pOwotCXJldHVybiBtOworICAgIGNoYXIgKm5hbWU7CisgICAgaW50IHJldDsKKyAgICBQeU9iamVjdCAqbTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6aW5pdF9mcm96ZW4iLCAmbmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldCA9IFB5SW1wb3J0X0ltcG9ydEZyb3plbk1vZHVsZShuYW1lKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKHJldCA9PSAwKSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgfQorICAgIG0gPSBQeUltcG9ydF9BZGRNb2R1bGUobmFtZSk7CisgICAgUHlfWElOQ1JFRihtKTsKKyAgICByZXR1cm4gbTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGltcF9nZXRfZnJvemVuX29iamVjdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqbmFtZTsKKyAgICBjaGFyICpuYW1lOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOmdldF9mcm96ZW5fb2JqZWN0IiwgJm5hbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gZ2V0X2Zyb3plbl9vYmplY3QobmFtZSk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOmdldF9mcm96ZW5fb2JqZWN0IiwgJm5hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gZ2V0X2Zyb3plbl9vYmplY3QobmFtZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbXBfaXNfYnVpbHRpbihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqbmFtZTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6aXNfYnVpbHRpbiIsICZuYW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKGlzX2J1aWx0aW4obmFtZSkpOworICAgIGNoYXIgKm5hbWU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOmlzX2J1aWx0aW4iLCAmbmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhpc19idWlsdGluKG5hbWUpKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGltcF9pc19mcm96ZW4oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKm5hbWU7Ci0Jc3RydWN0IF9mcm96ZW4gKnA7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOmlzX2Zyb3plbiIsICZuYW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcCA9IGZpbmRfZnJvemVuKG5hbWUpOwotCXJldHVybiBQeUJvb2xfRnJvbUxvbmcoKGxvbmcpIChwID09IE5VTEwgPyAwIDogcC0+c2l6ZSkpOworICAgIGNoYXIgKm5hbWU7CisgICAgc3RydWN0IF9mcm96ZW4gKnA7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOmlzX2Zyb3plbiIsICZuYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcCA9IGZpbmRfZnJvemVuKG5hbWUpOworICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoKGxvbmcpIChwID09IE5VTEwgPyAwIDogcC0+c2l6ZSkpOwogfQogCiBzdGF0aWMgRklMRSAqCiBnZXRfZmlsZShjaGFyICpwYXRobmFtZSwgUHlPYmplY3QgKmZvYiwgY2hhciAqbW9kZSkKIHsKLQlGSUxFICpmcDsKLQlpZiAoZm9iID09IE5VTEwpIHsKLQkJaWYgKG1vZGVbMF0gPT0gJ1UnKQotCQkJbW9kZSA9ICJyIiBQWV9TVERJT1RFWFRNT0RFOwotCQlmcCA9IGZvcGVuKHBhdGhuYW1lLCBtb2RlKTsKLQkJaWYgKGZwID09IE5VTEwpCi0JCQlQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7Ci0JfQotCWVsc2UgewotCQlmcCA9IFB5RmlsZV9Bc0ZpbGUoZm9iKTsKLQkJaWYgKGZwID09IE5VTEwpCi0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkJImJhZC9jbG9zZWQgZmlsZSBvYmplY3QiKTsKLQl9Ci0JcmV0dXJuIGZwOworICAgIEZJTEUgKmZwOworICAgIGlmIChmb2IgPT0gTlVMTCkgeworICAgICAgICBpZiAobW9kZVswXSA9PSAnVScpCisgICAgICAgICAgICBtb2RlID0gInIiIFBZX1NURElPVEVYVE1PREU7CisgICAgICAgIGZwID0gZm9wZW4ocGF0aG5hbWUsIG1vZGUpOworICAgICAgICBpZiAoZnAgPT0gTlVMTCkKKyAgICAgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGZwID0gUHlGaWxlX0FzRmlsZShmb2IpOworICAgICAgICBpZiAoZnAgPT0gTlVMTCkKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYWQvY2xvc2VkIGZpbGUgb2JqZWN0Iik7CisgICAgfQorICAgIHJldHVybiBmcDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGltcF9sb2FkX2NvbXBpbGVkKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpuYW1lOwotCWNoYXIgKnBhdGhuYW1lOwotCVB5T2JqZWN0ICpmb2IgPSBOVUxMOwotCVB5T2JqZWN0ICptOwotCUZJTEUgKmZwOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic3N8TyE6bG9hZF9jb21waWxlZCIsICZuYW1lLCAmcGF0aG5hbWUsCi0JCQkgICAgICAmUHlGaWxlX1R5cGUsICZmb2IpKQotCQlyZXR1cm4gTlVMTDsKLQlmcCA9IGdldF9maWxlKHBhdGhuYW1lLCBmb2IsICJyYiIpOwotCWlmIChmcCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQltID0gbG9hZF9jb21waWxlZF9tb2R1bGUobmFtZSwgcGF0aG5hbWUsIGZwKTsKLQlpZiAoZm9iID09IE5VTEwpCi0JCWZjbG9zZShmcCk7Ci0JcmV0dXJuIG07CisgICAgY2hhciAqbmFtZTsKKyAgICBjaGFyICpwYXRobmFtZTsKKyAgICBQeU9iamVjdCAqZm9iID0gTlVMTDsKKyAgICBQeU9iamVjdCAqbTsKKyAgICBGSUxFICpmcDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInNzfE8hOmxvYWRfY29tcGlsZWQiLCAmbmFtZSwgJnBhdGhuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmUHlGaWxlX1R5cGUsICZmb2IpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBmcCA9IGdldF9maWxlKHBhdGhuYW1lLCBmb2IsICJyYiIpOworICAgIGlmIChmcCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBtID0gbG9hZF9jb21waWxlZF9tb2R1bGUobmFtZSwgcGF0aG5hbWUsIGZwKTsKKyAgICBpZiAoZm9iID09IE5VTEwpCisgICAgICAgIGZjbG9zZShmcCk7CisgICAgcmV0dXJuIG07CiB9CiAKICNpZmRlZiBIQVZFX0RZTkFNSUNfTE9BRElORwpAQCAtMjk3OCwyMSArMjk3OCwyMSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGltcF9sb2FkX2R5bmFtaWMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKm5hbWU7Ci0JY2hhciAqcGF0aG5hbWU7Ci0JUHlPYmplY3QgKmZvYiA9IE5VTEw7Ci0JUHlPYmplY3QgKm07Ci0JRklMRSAqZnAgPSBOVUxMOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic3N8TyE6bG9hZF9keW5hbWljIiwgJm5hbWUsICZwYXRobmFtZSwKLQkJCSAgICAgICZQeUZpbGVfVHlwZSwgJmZvYikpCi0JCXJldHVybiBOVUxMOwotCWlmIChmb2IpIHsKLQkJZnAgPSBnZXRfZmlsZShwYXRobmFtZSwgZm9iLCAiciIpOwotCQlpZiAoZnAgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCX0KLQltID0gX1B5SW1wb3J0X0xvYWREeW5hbWljTW9kdWxlKG5hbWUsIHBhdGhuYW1lLCBmcCk7Ci0JcmV0dXJuIG07CisgICAgY2hhciAqbmFtZTsKKyAgICBjaGFyICpwYXRobmFtZTsKKyAgICBQeU9iamVjdCAqZm9iID0gTlVMTDsKKyAgICBQeU9iamVjdCAqbTsKKyAgICBGSUxFICpmcCA9IE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzc3xPITpsb2FkX2R5bmFtaWMiLCAmbmFtZSwgJnBhdGhuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmUHlGaWxlX1R5cGUsICZmb2IpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoZm9iKSB7CisgICAgICAgIGZwID0gZ2V0X2ZpbGUocGF0aG5hbWUsIGZvYiwgInIiKTsKKyAgICAgICAgaWYgKGZwID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgbSA9IF9QeUltcG9ydF9Mb2FkRHluYW1pY01vZHVsZShuYW1lLCBwYXRobmFtZSwgZnApOworICAgIHJldHVybiBtOwogfQogCiAjZW5kaWYgLyogSEFWRV9EWU5BTUlDX0xPQURJTkcgKi8KQEAgLTMwMDAsODcgKzMwMDAsODcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbXBfbG9hZF9zb3VyY2UoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKm5hbWU7Ci0JY2hhciAqcGF0aG5hbWU7Ci0JUHlPYmplY3QgKmZvYiA9IE5VTEw7Ci0JUHlPYmplY3QgKm07Ci0JRklMRSAqZnA7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzc3xPITpsb2FkX3NvdXJjZSIsICZuYW1lLCAmcGF0aG5hbWUsCi0JCQkgICAgICAmUHlGaWxlX1R5cGUsICZmb2IpKQotCQlyZXR1cm4gTlVMTDsKLQlmcCA9IGdldF9maWxlKHBhdGhuYW1lLCBmb2IsICJyIik7Ci0JaWYgKGZwID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCW0gPSBsb2FkX3NvdXJjZV9tb2R1bGUobmFtZSwgcGF0aG5hbWUsIGZwKTsKLQlpZiAoZm9iID09IE5VTEwpCi0JCWZjbG9zZShmcCk7Ci0JcmV0dXJuIG07CisgICAgY2hhciAqbmFtZTsKKyAgICBjaGFyICpwYXRobmFtZTsKKyAgICBQeU9iamVjdCAqZm9iID0gTlVMTDsKKyAgICBQeU9iamVjdCAqbTsKKyAgICBGSUxFICpmcDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInNzfE8hOmxvYWRfc291cmNlIiwgJm5hbWUsICZwYXRobmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJlB5RmlsZV9UeXBlLCAmZm9iKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZnAgPSBnZXRfZmlsZShwYXRobmFtZSwgZm9iLCAiciIpOworICAgIGlmIChmcCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBtID0gbG9hZF9zb3VyY2VfbW9kdWxlKG5hbWUsIHBhdGhuYW1lLCBmcCk7CisgICAgaWYgKGZvYiA9PSBOVUxMKQorICAgICAgICBmY2xvc2UoZnApOworICAgIHJldHVybiBtOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaW1wX2xvYWRfbW9kdWxlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpuYW1lOwotCVB5T2JqZWN0ICpmb2I7Ci0JY2hhciAqcGF0aG5hbWU7Ci0JY2hhciAqc3VmZml4OyAvKiBVbnVzZWQgKi8KLQljaGFyICptb2RlOwotCWludCB0eXBlOwotCUZJTEUgKmZwOworICAgIGNoYXIgKm5hbWU7CisgICAgUHlPYmplY3QgKmZvYjsKKyAgICBjaGFyICpwYXRobmFtZTsKKyAgICBjaGFyICpzdWZmaXg7IC8qIFVudXNlZCAqLworICAgIGNoYXIgKm1vZGU7CisgICAgaW50IHR5cGU7CisgICAgRklMRSAqZnA7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInNPcyhzc2kpOmxvYWRfbW9kdWxlIiwKLQkJCSAgICAgICZuYW1lLCAmZm9iLCAmcGF0aG5hbWUsCi0JCQkgICAgICAmc3VmZml4LCAmbW9kZSwgJnR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoKm1vZGUpIHsKLQkJLyogTW9kZSBtdXN0IHN0YXJ0IHdpdGggJ3InIG9yICdVJyBhbmQgbXVzdCBub3QgY29udGFpbiAnKycuCi0JCSAgIEltcGxpY2l0IGluIHRoaXMgdGVzdCBpcyB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoZSBtb2RlCi0JCSAgIG1heSBjb250YWluIG90aGVyIG1vZGlmaWVycyBsaWtlICdiJyBvciAndCcuICovCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzT3Moc3NpKTpsb2FkX21vZHVsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lLCAmZm9iLCAmcGF0aG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzdWZmaXgsICZtb2RlLCAmdHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICgqbW9kZSkgeworICAgICAgICAvKiBNb2RlIG11c3Qgc3RhcnQgd2l0aCAncicgb3IgJ1UnIGFuZCBtdXN0IG5vdCBjb250YWluICcrJy4KKyAgICAgICAgICAgSW1wbGljaXQgaW4gdGhpcyB0ZXN0IGlzIHRoZSBhc3N1bXB0aW9uIHRoYXQgdGhlIG1vZGUKKyAgICAgICAgICAgbWF5IGNvbnRhaW4gb3RoZXIgbW9kaWZpZXJzIGxpa2UgJ2InIG9yICd0Jy4gKi8KIAotCQlpZiAoISgqbW9kZSA9PSAncicgfHwgKm1vZGUgPT0gJ1UnKSB8fCBzdHJjaHIobW9kZSwgJysnKSkgewotCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJICAgICAiaW52YWxpZCBmaWxlIG9wZW4gbW9kZSAlLjIwMHMiLCBtb2RlKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQotCWlmIChmb2IgPT0gUHlfTm9uZSkKLQkJZnAgPSBOVUxMOwotCWVsc2UgewotCQlpZiAoIVB5RmlsZV9DaGVjayhmb2IpKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkibG9hZF9tb2R1bGUgYXJnIzIgc2hvdWxkIGJlIGEgZmlsZSBvciBOb25lIik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlmcCA9IGdldF9maWxlKHBhdGhuYW1lLCBmb2IsIG1vZGUpOwotCQlpZiAoZnAgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gbG9hZF9tb2R1bGUobmFtZSwgZnAsIHBhdGhuYW1lLCB0eXBlLCBOVUxMKTsKKyAgICAgICAgaWYgKCEoKm1vZGUgPT0gJ3InIHx8ICptb2RlID09ICdVJykgfHwgc3RyY2hyKG1vZGUsICcrJykpIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIGZpbGUgb3BlbiBtb2RlICUuMjAwcyIsIG1vZGUpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGZvYiA9PSBQeV9Ob25lKQorICAgICAgICBmcCA9IE5VTEw7CisgICAgZWxzZSB7CisgICAgICAgIGlmICghUHlGaWxlX0NoZWNrKGZvYikpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICJsb2FkX21vZHVsZSBhcmcjMiBzaG91bGQgYmUgYSBmaWxlIG9yIE5vbmUiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGZwID0gZ2V0X2ZpbGUocGF0aG5hbWUsIGZvYiwgbW9kZSk7CisgICAgICAgIGlmIChmcCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBsb2FkX21vZHVsZShuYW1lLCBmcCwgcGF0aG5hbWUsIHR5cGUsIE5VTEwpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaW1wX2xvYWRfcGFja2FnZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqbmFtZTsKLQljaGFyICpwYXRobmFtZTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInNzOmxvYWRfcGFja2FnZSIsICZuYW1lLCAmcGF0aG5hbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gbG9hZF9wYWNrYWdlKG5hbWUsIHBhdGhuYW1lKTsKKyAgICBjaGFyICpuYW1lOworICAgIGNoYXIgKnBhdGhuYW1lOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic3M6bG9hZF9wYWNrYWdlIiwgJm5hbWUsICZwYXRobmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBsb2FkX3BhY2thZ2UobmFtZSwgcGF0aG5hbWUpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaW1wX25ld19tb2R1bGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKm5hbWU7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOm5ld19tb2R1bGUiLCAmbmFtZSkpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBQeU1vZHVsZV9OZXcobmFtZSk7CisgICAgY2hhciAqbmFtZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6bmV3X21vZHVsZSIsICZuYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFB5TW9kdWxlX05ldyhuYW1lKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGltcF9yZWxvYWQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp2KQogewotCXJldHVybiBQeUltcG9ydF9SZWxvYWRNb2R1bGUodik7CisgICAgcmV0dXJuIFB5SW1wb3J0X1JlbG9hZE1vZHVsZSh2KTsKIH0KIAogCkBAIC0zMTM5LDQwICszMTM5LDQwIEBACiBPbiBwbGF0Zm9ybXMgd2l0aG91dCB0aHJlYWRzLCB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90aGluZy4iKTsKIAogc3RhdGljIFB5TWV0aG9kRGVmIGltcF9tZXRob2RzW10gPSB7Ci0JeyJyZWxvYWQiLAkgaW1wX3JlbG9hZCwJICAgTUVUSF9PLAkgZG9jX3JlbG9hZH0sCi0JeyJmaW5kX21vZHVsZSIsCSBpbXBfZmluZF9tb2R1bGUsICBNRVRIX1ZBUkFSR1MsIGRvY19maW5kX21vZHVsZX0sCi0JeyJnZXRfbWFnaWMiLAkgaW1wX2dldF9tYWdpYywJICAgTUVUSF9OT0FSR1MsICBkb2NfZ2V0X21hZ2ljfSwKLQl7ImdldF9zdWZmaXhlcyIsIGltcF9nZXRfc3VmZml4ZXMsIE1FVEhfTk9BUkdTLCAgZG9jX2dldF9zdWZmaXhlc30sCi0JeyJsb2FkX21vZHVsZSIsCSBpbXBfbG9hZF9tb2R1bGUsICBNRVRIX1ZBUkFSR1MsIGRvY19sb2FkX21vZHVsZX0sCi0JeyJuZXdfbW9kdWxlIiwJIGltcF9uZXdfbW9kdWxlLCAgIE1FVEhfVkFSQVJHUywgZG9jX25ld19tb2R1bGV9LAotCXsibG9ja19oZWxkIiwJIGltcF9sb2NrX2hlbGQsCSAgIE1FVEhfTk9BUkdTLCAgZG9jX2xvY2tfaGVsZH0sCi0JeyJhY3F1aXJlX2xvY2siLCBpbXBfYWNxdWlyZV9sb2NrLCBNRVRIX05PQVJHUywgIGRvY19hY3F1aXJlX2xvY2t9LAotCXsicmVsZWFzZV9sb2NrIiwgaW1wX3JlbGVhc2VfbG9jaywgTUVUSF9OT0FSR1MsICBkb2NfcmVsZWFzZV9sb2NrfSwKLQkvKiBUaGUgcmVzdCBhcmUgb2Jzb2xldGUgKi8KLQl7ImdldF9mcm96ZW5fb2JqZWN0IiwJaW1wX2dldF9mcm96ZW5fb2JqZWN0LAlNRVRIX1ZBUkFSR1N9LAotCXsiaW5pdF9idWlsdGluIiwJaW1wX2luaXRfYnVpbHRpbiwJTUVUSF9WQVJBUkdTfSwKLQl7ImluaXRfZnJvemVuIiwJCWltcF9pbml0X2Zyb3plbiwJTUVUSF9WQVJBUkdTfSwKLQl7ImlzX2J1aWx0aW4iLAkJaW1wX2lzX2J1aWx0aW4sCQlNRVRIX1ZBUkFSR1N9LAotCXsiaXNfZnJvemVuIiwJCWltcF9pc19mcm96ZW4sCQlNRVRIX1ZBUkFSR1N9LAotCXsibG9hZF9jb21waWxlZCIsCWltcF9sb2FkX2NvbXBpbGVkLAlNRVRIX1ZBUkFSR1N9LAorICAgIHsicmVsb2FkIiwgICAgICAgICAgIGltcF9yZWxvYWQsICAgICAgIE1FVEhfTywgICAgICAgZG9jX3JlbG9hZH0sCisgICAgeyJmaW5kX21vZHVsZSIsICAgICAgaW1wX2ZpbmRfbW9kdWxlLCAgTUVUSF9WQVJBUkdTLCBkb2NfZmluZF9tb2R1bGV9LAorICAgIHsiZ2V0X21hZ2ljIiwgICAgICAgIGltcF9nZXRfbWFnaWMsICAgIE1FVEhfTk9BUkdTLCAgZG9jX2dldF9tYWdpY30sCisgICAgeyJnZXRfc3VmZml4ZXMiLCBpbXBfZ2V0X3N1ZmZpeGVzLCBNRVRIX05PQVJHUywgIGRvY19nZXRfc3VmZml4ZXN9LAorICAgIHsibG9hZF9tb2R1bGUiLCAgICAgIGltcF9sb2FkX21vZHVsZSwgIE1FVEhfVkFSQVJHUywgZG9jX2xvYWRfbW9kdWxlfSwKKyAgICB7Im5ld19tb2R1bGUiLCAgICAgICBpbXBfbmV3X21vZHVsZSwgICBNRVRIX1ZBUkFSR1MsIGRvY19uZXdfbW9kdWxlfSwKKyAgICB7ImxvY2tfaGVsZCIsICAgICAgICBpbXBfbG9ja19oZWxkLCAgICBNRVRIX05PQVJHUywgIGRvY19sb2NrX2hlbGR9LAorICAgIHsiYWNxdWlyZV9sb2NrIiwgaW1wX2FjcXVpcmVfbG9jaywgTUVUSF9OT0FSR1MsICBkb2NfYWNxdWlyZV9sb2NrfSwKKyAgICB7InJlbGVhc2VfbG9jayIsIGltcF9yZWxlYXNlX2xvY2ssIE1FVEhfTk9BUkdTLCAgZG9jX3JlbGVhc2VfbG9ja30sCisgICAgLyogVGhlIHJlc3QgYXJlIG9ic29sZXRlICovCisgICAgeyJnZXRfZnJvemVuX29iamVjdCIsICAgICAgIGltcF9nZXRfZnJvemVuX29iamVjdCwgIE1FVEhfVkFSQVJHU30sCisgICAgeyJpbml0X2J1aWx0aW4iLCAgICAgICAgICAgIGltcF9pbml0X2J1aWx0aW4sICAgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJpbml0X2Zyb3plbiIsICAgICAgICAgICAgIGltcF9pbml0X2Zyb3plbiwgICAgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJpc19idWlsdGluIiwgICAgICAgICAgICAgIGltcF9pc19idWlsdGluLCAgICAgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJpc19mcm96ZW4iLCAgICAgICAgICAgICAgIGltcF9pc19mcm96ZW4sICAgICAgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJsb2FkX2NvbXBpbGVkIiwgICAgICAgICAgIGltcF9sb2FkX2NvbXBpbGVkLCAgICAgIE1FVEhfVkFSQVJHU30sCiAjaWZkZWYgSEFWRV9EWU5BTUlDX0xPQURJTkcKLQl7ImxvYWRfZHluYW1pYyIsCWltcF9sb2FkX2R5bmFtaWMsCU1FVEhfVkFSQVJHU30sCisgICAgeyJsb2FkX2R5bmFtaWMiLCAgICAgICAgICAgIGltcF9sb2FkX2R5bmFtaWMsICAgICAgIE1FVEhfVkFSQVJHU30sCiAjZW5kaWYKLQl7ImxvYWRfcGFja2FnZSIsCWltcF9sb2FkX3BhY2thZ2UsCU1FVEhfVkFSQVJHU30sCi0JeyJsb2FkX3NvdXJjZSIsCQlpbXBfbG9hZF9zb3VyY2UsCU1FVEhfVkFSQVJHU30sCi0Je05VTEwsCQkJTlVMTH0JCS8qIHNlbnRpbmVsICovCisgICAgeyJsb2FkX3BhY2thZ2UiLCAgICAgICAgICAgIGltcF9sb2FkX3BhY2thZ2UsICAgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJsb2FkX3NvdXJjZSIsICAgICAgICAgICAgIGltcF9sb2FkX3NvdXJjZSwgICAgICAgIE1FVEhfVkFSQVJHU30sCisgICAge05VTEwsICAgICAgICAgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogc3RhdGljIGludAogc2V0aW50KFB5T2JqZWN0ICpkLCBjaGFyICpuYW1lLCBpbnQgdmFsdWUpCiB7Ci0JUHlPYmplY3QgKnY7Ci0JaW50IGVycjsKKyAgICBQeU9iamVjdCAqdjsKKyAgICBpbnQgZXJyOwogCi0JdiA9IFB5SW50X0Zyb21Mb25nKChsb25nKXZhbHVlKTsKLQllcnIgPSBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCBuYW1lLCB2KTsKLQlQeV9YREVDUkVGKHYpOwotCXJldHVybiBlcnI7CisgICAgdiA9IFB5SW50X0Zyb21Mb25nKChsb25nKXZhbHVlKTsKKyAgICBlcnIgPSBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCBuYW1lLCB2KTsKKyAgICBQeV9YREVDUkVGKHYpOworICAgIHJldHVybiBlcnI7CiB9CiAKIHR5cGVkZWYgc3RydWN0IHsKQEAgLTMxODIsMTU1ICszMTgyLDE1NSBAQAogc3RhdGljIGludAogTnVsbEltcG9ydGVyX2luaXQoTnVsbEltcG9ydGVyICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JY2hhciAqcGF0aDsKLQlQeV9zc2l6ZV90IHBhdGhsZW47CisgICAgY2hhciAqcGF0aDsKKyAgICBQeV9zc2l6ZV90IHBhdGhsZW47CiAKLQlpZiAoIV9QeUFyZ19Ob0tleXdvcmRzKCJOdWxsSW1wb3J0ZXIoKSIsIGt3ZHMpKQotCQlyZXR1cm4gLTE7CisgICAgaWYgKCFfUHlBcmdfTm9LZXl3b3JkcygiTnVsbEltcG9ydGVyKCkiLCBrd2RzKSkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOk51bGxJbXBvcnRlciIsCi0JCQkgICAgICAmcGF0aCkpCi0JCXJldHVybiAtMTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6TnVsbEltcG9ydGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhdGgpKQorICAgICAgICByZXR1cm4gLTE7CiAKLQlwYXRobGVuID0gc3RybGVuKHBhdGgpOwotCWlmIChwYXRobGVuID09IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0ltcG9ydEVycm9yLCAiZW1wdHkgcGF0aG5hbWUiKTsKLQkJcmV0dXJuIC0xOwotCX0gZWxzZSB7CisgICAgcGF0aGxlbiA9IHN0cmxlbihwYXRoKTsKKyAgICBpZiAocGF0aGxlbiA9PSAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwgImVtcHR5IHBhdGhuYW1lIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9IGVsc2UgewogI2lmbmRlZiBSSVNDT1MKICNpZm5kZWYgTVNfV0lORE9XUwotCQlzdHJ1Y3Qgc3RhdCBzdGF0YnVmOwotCQlpbnQgcnY7CisgICAgICAgIHN0cnVjdCBzdGF0IHN0YXRidWY7CisgICAgICAgIGludCBydjsKIAotCQlydiA9IHN0YXQocGF0aCwgJnN0YXRidWYpOwotCQlpZiAocnYgPT0gMCkgewotCQkJLyogaXQgZXhpc3RzICovCi0JCQlpZiAoU19JU0RJUihzdGF0YnVmLnN0X21vZGUpKSB7Ci0JCQkJLyogaXQncyBhIGRpcmVjdG9yeSAqLwotCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwKLQkJCQkJCSJleGlzdGluZyBkaXJlY3RvcnkiKTsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KKyAgICAgICAgcnYgPSBzdGF0KHBhdGgsICZzdGF0YnVmKTsKKyAgICAgICAgaWYgKHJ2ID09IDApIHsKKyAgICAgICAgICAgIC8qIGl0IGV4aXN0cyAqLworICAgICAgICAgICAgaWYgKFNfSVNESVIoc3RhdGJ1Zi5zdF9tb2RlKSkgeworICAgICAgICAgICAgICAgIC8qIGl0J3MgYSBkaXJlY3RvcnkgKi8KKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW1wb3J0RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleGlzdGluZyBkaXJlY3RvcnkiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICNlbHNlIC8qIE1TX1dJTkRPV1MgKi8KLQkJRFdPUkQgcnY7Ci0JCS8qIHNlZSBpc3N1ZTEyOTMgYW5kIGlzc3VlMzY3NzoKLQkJICogc3RhdCgpIG9uIFdpbmRvd3MgZG9lc24ndCByZWNvZ25pc2UgcGF0aHMgbGlrZQotCQkgKiAiZTpcXHNoYXJlZFxcIiBhbmQgIlxcXFx3aGl0ZXJhYi1jMnpubGhcXHNoYXJlZCIgYXMgZGlycy4KLQkJICovCi0JCXJ2ID0gR2V0RmlsZUF0dHJpYnV0ZXNBKHBhdGgpOwotCQlpZiAocnYgIT0gSU5WQUxJRF9GSUxFX0FUVFJJQlVURVMpIHsKLQkJCS8qIGl0IGV4aXN0cyAqLwotCQkJaWYgKHJ2ICYgRklMRV9BVFRSSUJVVEVfRElSRUNUT1JZKSB7Ci0JCQkJLyogaXQncyBhIGRpcmVjdG9yeSAqLwotCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwKLQkJCQkJCSJleGlzdGluZyBkaXJlY3RvcnkiKTsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KKyAgICAgICAgRFdPUkQgcnY7CisgICAgICAgIC8qIHNlZSBpc3N1ZTEyOTMgYW5kIGlzc3VlMzY3NzoKKyAgICAgICAgICogc3RhdCgpIG9uIFdpbmRvd3MgZG9lc24ndCByZWNvZ25pc2UgcGF0aHMgbGlrZQorICAgICAgICAgKiAiZTpcXHNoYXJlZFxcIiBhbmQgIlxcXFx3aGl0ZXJhYi1jMnpubGhcXHNoYXJlZCIgYXMgZGlycy4KKyAgICAgICAgICovCisgICAgICAgIHJ2ID0gR2V0RmlsZUF0dHJpYnV0ZXNBKHBhdGgpOworICAgICAgICBpZiAocnYgIT0gSU5WQUxJRF9GSUxFX0FUVFJJQlVURVMpIHsKKyAgICAgICAgICAgIC8qIGl0IGV4aXN0cyAqLworICAgICAgICAgICAgaWYgKHJ2ICYgRklMRV9BVFRSSUJVVEVfRElSRUNUT1JZKSB7CisgICAgICAgICAgICAgICAgLyogaXQncyBhIGRpcmVjdG9yeSAqLworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4aXN0aW5nIGRpcmVjdG9yeSIpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogI2VuZGlmCiAjZWxzZSAvKiBSSVNDT1MgKi8KLQkJaWYgKG9iamVjdF9leGlzdHMocGF0aCkpIHsKLQkJCS8qIGl0IGV4aXN0cyAqLwotCQkJaWYgKGlzZGlyKHBhdGgpKSB7Ci0JCQkJLyogaXQncyBhIGRpcmVjdG9yeSAqLwotCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwKLQkJCQkJCSJleGlzdGluZyBkaXJlY3RvcnkiKTsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KKyAgICAgICAgaWYgKG9iamVjdF9leGlzdHMocGF0aCkpIHsKKyAgICAgICAgICAgIC8qIGl0IGV4aXN0cyAqLworICAgICAgICAgICAgaWYgKGlzZGlyKHBhdGgpKSB7CisgICAgICAgICAgICAgICAgLyogaXQncyBhIGRpcmVjdG9yeSAqLworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4aXN0aW5nIGRpcmVjdG9yeSIpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogI2VuZGlmCi0JfQotCXJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIE51bGxJbXBvcnRlcl9maW5kX21vZHVsZShOdWxsSW1wb3J0ZXIgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5X1JFVFVSTl9OT05FOworICAgIFB5X1JFVFVSTl9OT05FOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgTnVsbEltcG9ydGVyX21ldGhvZHNbXSA9IHsKLQl7ImZpbmRfbW9kdWxlIiwgKFB5Q0Z1bmN0aW9uKU51bGxJbXBvcnRlcl9maW5kX21vZHVsZSwgTUVUSF9WQVJBUkdTLAotCSAiQWx3YXlzIHJldHVybiBOb25lIgotCX0sCi0Je05VTEx9ICAvKiBTZW50aW5lbCAqLworICAgIHsiZmluZF9tb2R1bGUiLCAoUHlDRnVuY3Rpb24pTnVsbEltcG9ydGVyX2ZpbmRfbW9kdWxlLCBNRVRIX1ZBUkFSR1MsCisgICAgICJBbHdheXMgcmV0dXJuIE5vbmUiCisgICAgfSwKKyAgICB7TlVMTH0gIC8qIFNlbnRpbmVsICovCiB9OwogCiAKIFB5VHlwZU9iamVjdCBQeU51bGxJbXBvcnRlcl9UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotCSJpbXAuTnVsbEltcG9ydGVyIiwgICAgICAgIC8qdHBfbmFtZSovCi0Jc2l6ZW9mKE51bGxJbXBvcnRlciksICAgICAgLyp0cF9iYXNpY3NpemUqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlbXNpemUqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGVhbGxvYyovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9wcmludCovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRhdHRyKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHIqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY29tcGFyZSovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9yZXByKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX251bWJlciovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19zZXF1ZW5jZSovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19tYXBwaW5nKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2hhc2ggKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NhbGwqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc3RyKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHJvKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHJvKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX2J1ZmZlciovCi0JUHlfVFBGTEFHU19ERUZBVUxULCAgICAgICAgLyp0cF9mbGFncyovCi0JIk51bGwgaW1wb3J0ZXIgb2JqZWN0IiwgICAgLyogdHBfZG9jICovCi0JMCwJICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCi0JMCwJICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCi0JMCwJICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JMCwJICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KLQkwLAkgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KLQlOdWxsSW1wb3J0ZXJfbWV0aG9kcywgICAgICAvKiB0cF9tZXRob2RzICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLwotCShpbml0cHJvYylOdWxsSW1wb3J0ZXJfaW5pdCwgICAgICAvKiB0cF9pbml0ICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KLQlQeVR5cGVfR2VuZXJpY05ldyAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAiaW1wLk51bGxJbXBvcnRlciIsICAgICAgICAvKnRwX25hbWUqLworICAgIHNpemVvZihOdWxsSW1wb3J0ZXIpLCAgICAgIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZW1zaXplKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2RlYWxsb2MqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcHJpbnQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0YXR0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NvbXBhcmUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmVwciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19udW1iZXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfc2VxdWVuY2UqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbWFwcGluZyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jYWxsKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3N0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRhdHRybyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRybyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCwgICAgICAgIC8qdHBfZmxhZ3MqLworICAgICJOdWxsIGltcG9ydGVyIG9iamVjdCIsICAgIC8qIHRwX2RvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgTnVsbEltcG9ydGVyX21ldGhvZHMsICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAoaW5pdHByb2MpTnVsbEltcG9ydGVyX2luaXQsICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgUHlUeXBlX0dlbmVyaWNOZXcgICAgICAgICAgLyogdHBfbmV3ICovCiB9OwogCiAKIFB5TU9ESU5JVF9GVU5DCiBpbml0aW1wKHZvaWQpCiB7Ci0JUHlPYmplY3QgKm0sICpkOworICAgIFB5T2JqZWN0ICptLCAqZDsKIAotCWlmIChQeVR5cGVfUmVhZHkoJlB5TnVsbEltcG9ydGVyX1R5cGUpIDwgMCkKLQkJZ290byBmYWlsdXJlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJlB5TnVsbEltcG9ydGVyX1R5cGUpIDwgMCkKKyAgICAgICAgZ290byBmYWlsdXJlOwogCi0JbSA9IFB5X0luaXRNb2R1bGU0KCJpbXAiLCBpbXBfbWV0aG9kcywgZG9jX2ltcCwKLQkJCSAgIE5VTEwsIFBZVEhPTl9BUElfVkVSU0lPTik7Ci0JaWYgKG0gPT0gTlVMTCkKLQkJZ290byBmYWlsdXJlOwotCWQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOwotCWlmIChkID09IE5VTEwpCi0JCWdvdG8gZmFpbHVyZTsKKyAgICBtID0gUHlfSW5pdE1vZHVsZTQoImltcCIsIGltcF9tZXRob2RzLCBkb2NfaW1wLAorICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBQWVRIT05fQVBJX1ZFUlNJT04pOworICAgIGlmIChtID09IE5VTEwpCisgICAgICAgIGdvdG8gZmFpbHVyZTsKKyAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICBpZiAoZCA9PSBOVUxMKQorICAgICAgICBnb3RvIGZhaWx1cmU7CiAKLQlpZiAoc2V0aW50KGQsICJTRUFSQ0hfRVJST1IiLCBTRUFSQ0hfRVJST1IpIDwgMCkgZ290byBmYWlsdXJlOwotCWlmIChzZXRpbnQoZCwgIlBZX1NPVVJDRSIsIFBZX1NPVVJDRSkgPCAwKSBnb3RvIGZhaWx1cmU7Ci0JaWYgKHNldGludChkLCAiUFlfQ09NUElMRUQiLCBQWV9DT01QSUxFRCkgPCAwKSBnb3RvIGZhaWx1cmU7Ci0JaWYgKHNldGludChkLCAiQ19FWFRFTlNJT04iLCBDX0VYVEVOU0lPTikgPCAwKSBnb3RvIGZhaWx1cmU7Ci0JaWYgKHNldGludChkLCAiUFlfUkVTT1VSQ0UiLCBQWV9SRVNPVVJDRSkgPCAwKSBnb3RvIGZhaWx1cmU7Ci0JaWYgKHNldGludChkLCAiUEtHX0RJUkVDVE9SWSIsIFBLR19ESVJFQ1RPUlkpIDwgMCkgZ290byBmYWlsdXJlOwotCWlmIChzZXRpbnQoZCwgIkNfQlVJTFRJTiIsIENfQlVJTFRJTikgPCAwKSBnb3RvIGZhaWx1cmU7Ci0JaWYgKHNldGludChkLCAiUFlfRlJPWkVOIiwgUFlfRlJPWkVOKSA8IDApIGdvdG8gZmFpbHVyZTsKLQlpZiAoc2V0aW50KGQsICJQWV9DT0RFUkVTT1VSQ0UiLCBQWV9DT0RFUkVTT1VSQ0UpIDwgMCkgZ290byBmYWlsdXJlOwotCWlmIChzZXRpbnQoZCwgIklNUF9IT09LIiwgSU1QX0hPT0spIDwgMCkgZ290byBmYWlsdXJlOworICAgIGlmIChzZXRpbnQoZCwgIlNFQVJDSF9FUlJPUiIsIFNFQVJDSF9FUlJPUikgPCAwKSBnb3RvIGZhaWx1cmU7CisgICAgaWYgKHNldGludChkLCAiUFlfU09VUkNFIiwgUFlfU09VUkNFKSA8IDApIGdvdG8gZmFpbHVyZTsKKyAgICBpZiAoc2V0aW50KGQsICJQWV9DT01QSUxFRCIsIFBZX0NPTVBJTEVEKSA8IDApIGdvdG8gZmFpbHVyZTsKKyAgICBpZiAoc2V0aW50KGQsICJDX0VYVEVOU0lPTiIsIENfRVhURU5TSU9OKSA8IDApIGdvdG8gZmFpbHVyZTsKKyAgICBpZiAoc2V0aW50KGQsICJQWV9SRVNPVVJDRSIsIFBZX1JFU09VUkNFKSA8IDApIGdvdG8gZmFpbHVyZTsKKyAgICBpZiAoc2V0aW50KGQsICJQS0dfRElSRUNUT1JZIiwgUEtHX0RJUkVDVE9SWSkgPCAwKSBnb3RvIGZhaWx1cmU7CisgICAgaWYgKHNldGludChkLCAiQ19CVUlMVElOIiwgQ19CVUlMVElOKSA8IDApIGdvdG8gZmFpbHVyZTsKKyAgICBpZiAoc2V0aW50KGQsICJQWV9GUk9aRU4iLCBQWV9GUk9aRU4pIDwgMCkgZ290byBmYWlsdXJlOworICAgIGlmIChzZXRpbnQoZCwgIlBZX0NPREVSRVNPVVJDRSIsIFBZX0NPREVSRVNPVVJDRSkgPCAwKSBnb3RvIGZhaWx1cmU7CisgICAgaWYgKHNldGludChkLCAiSU1QX0hPT0siLCBJTVBfSE9PSykgPCAwKSBnb3RvIGZhaWx1cmU7CiAKLQlQeV9JTkNSRUYoJlB5TnVsbEltcG9ydGVyX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiTnVsbEltcG9ydGVyIiwgKFB5T2JqZWN0ICopJlB5TnVsbEltcG9ydGVyX1R5cGUpOworICAgIFB5X0lOQ1JFRigmUHlOdWxsSW1wb3J0ZXJfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJOdWxsSW1wb3J0ZXIiLCAoUHlPYmplY3QgKikmUHlOdWxsSW1wb3J0ZXJfVHlwZSk7CiAgIGZhaWx1cmU6Ci0JOworICAgIDsKIH0KIAogCkBAIC0zMzQ0LDMxICszMzQ0LDMxIEBACiBpbnQKIFB5SW1wb3J0X0V4dGVuZEluaXR0YWIoc3RydWN0IF9pbml0dGFiICpuZXd0YWIpCiB7Ci0Jc3RhdGljIHN0cnVjdCBfaW5pdHRhYiAqb3VyX2NvcHkgPSBOVUxMOwotCXN0cnVjdCBfaW5pdHRhYiAqcDsKLQlpbnQgaSwgbjsKKyAgICBzdGF0aWMgc3RydWN0IF9pbml0dGFiICpvdXJfY29weSA9IE5VTEw7CisgICAgc3RydWN0IF9pbml0dGFiICpwOworICAgIGludCBpLCBuOwogCi0JLyogQ291bnQgdGhlIG51bWJlciBvZiBlbnRyaWVzIGluIGJvdGggdGFibGVzICovCi0JZm9yIChuID0gMDsgbmV3dGFiW25dLm5hbWUgIT0gTlVMTDsgbisrKQotCQk7Ci0JaWYgKG4gPT0gMCkKLQkJcmV0dXJuIDA7IC8qIE5vdGhpbmcgdG8gZG8gKi8KLQlmb3IgKGkgPSAwOyBQeUltcG9ydF9Jbml0dGFiW2ldLm5hbWUgIT0gTlVMTDsgaSsrKQotCQk7CisgICAgLyogQ291bnQgdGhlIG51bWJlciBvZiBlbnRyaWVzIGluIGJvdGggdGFibGVzICovCisgICAgZm9yIChuID0gMDsgbmV3dGFiW25dLm5hbWUgIT0gTlVMTDsgbisrKQorICAgICAgICA7CisgICAgaWYgKG4gPT0gMCkKKyAgICAgICAgcmV0dXJuIDA7IC8qIE5vdGhpbmcgdG8gZG8gKi8KKyAgICBmb3IgKGkgPSAwOyBQeUltcG9ydF9Jbml0dGFiW2ldLm5hbWUgIT0gTlVMTDsgaSsrKQorICAgICAgICA7CiAKLQkvKiBBbGxvY2F0ZSBuZXcgbWVtb3J5IGZvciB0aGUgY29tYmluZWQgdGFibGUgKi8KLQlwID0gb3VyX2NvcHk7Ci0JUHlNZW1fUkVTSVpFKHAsIHN0cnVjdCBfaW5pdHRhYiwgaStuKzEpOwotCWlmIChwID09IE5VTEwpCi0JCXJldHVybiAtMTsKKyAgICAvKiBBbGxvY2F0ZSBuZXcgbWVtb3J5IGZvciB0aGUgY29tYmluZWQgdGFibGUgKi8KKyAgICBwID0gb3VyX2NvcHk7CisgICAgUHlNZW1fUkVTSVpFKHAsIHN0cnVjdCBfaW5pdHRhYiwgaStuKzEpOworICAgIGlmIChwID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKIAotCS8qIENvcHkgdGhlIHRhYmxlcyBpbnRvIHRoZSBuZXcgbWVtb3J5ICovCi0JaWYgKG91cl9jb3B5ICE9IFB5SW1wb3J0X0luaXR0YWIpCi0JCW1lbWNweShwLCBQeUltcG9ydF9Jbml0dGFiLCAoaSsxKSAqIHNpemVvZihzdHJ1Y3QgX2luaXR0YWIpKTsKLQlQeUltcG9ydF9Jbml0dGFiID0gb3VyX2NvcHkgPSBwOwotCW1lbWNweShwK2ksIG5ld3RhYiwgKG4rMSkgKiBzaXplb2Yoc3RydWN0IF9pbml0dGFiKSk7CisgICAgLyogQ29weSB0aGUgdGFibGVzIGludG8gdGhlIG5ldyBtZW1vcnkgKi8KKyAgICBpZiAob3VyX2NvcHkgIT0gUHlJbXBvcnRfSW5pdHRhYikKKyAgICAgICAgbWVtY3B5KHAsIFB5SW1wb3J0X0luaXR0YWIsIChpKzEpICogc2l6ZW9mKHN0cnVjdCBfaW5pdHRhYikpOworICAgIFB5SW1wb3J0X0luaXR0YWIgPSBvdXJfY29weSA9IHA7CisgICAgbWVtY3B5KHAraSwgbmV3dGFiLCAobisxKSAqIHNpemVvZihzdHJ1Y3QgX2luaXR0YWIpKTsKIAotCXJldHVybiAwOworICAgIHJldHVybiAwOwogfQogCiAvKiBTaG9ydGhhbmQgdG8gYWRkIGEgc2luZ2xlIGVudHJ5IGdpdmVuIGEgbmFtZSBhbmQgYSBmdW5jdGlvbiAqLwpAQCAtMzM3NiwxNCArMzM3NiwxNCBAQAogaW50CiBQeUltcG9ydF9BcHBlbmRJbml0dGFiKGNoYXIgKm5hbWUsIHZvaWQgKCppbml0ZnVuYykodm9pZCkpCiB7Ci0Jc3RydWN0IF9pbml0dGFiIG5ld3RhYlsyXTsKKyAgICBzdHJ1Y3QgX2luaXR0YWIgbmV3dGFiWzJdOwogCi0JbWVtc2V0KG5ld3RhYiwgJ1wwJywgc2l6ZW9mIG5ld3RhYik7CisgICAgbWVtc2V0KG5ld3RhYiwgJ1wwJywgc2l6ZW9mIG5ld3RhYik7CiAKLQluZXd0YWJbMF0ubmFtZSA9IG5hbWU7Ci0JbmV3dGFiWzBdLmluaXRmdW5jID0gaW5pdGZ1bmM7CisgICAgbmV3dGFiWzBdLm5hbWUgPSBuYW1lOworICAgIG5ld3RhYlswXS5pbml0ZnVuYyA9IGluaXRmdW5jOwogCi0JcmV0dXJuIFB5SW1wb3J0X0V4dGVuZEluaXR0YWIobmV3dGFiKTsKKyAgICByZXR1cm4gUHlJbXBvcnRfRXh0ZW5kSW5pdHRhYihuZXd0YWIpOwogfQogCiAjaWZkZWYgX19jcGx1c3BsdXMKZGlmZiAtLWdpdCBhL1B5dGhvbi9pbXBvcnRkbC5jIGIvUHl0aG9uL2ltcG9ydGRsLmMKaW5kZXggOWMzMjVlNC4uMTRjOWJlOCAxMDA2NDQKLS0tIGEvUHl0aG9uL2ltcG9ydGRsLmMKKysrIGIvUHl0aG9uL2ltcG9ydGRsLmMKQEAgLTEzLDY2ICsxMyw2NiBAQAogI2luY2x1ZGUgImltcG9ydGRsLmgiCiAKIGV4dGVybiBkbF9mdW5jcHRyIF9QeUltcG9ydF9HZXREeW5Mb2FkRnVuYyhjb25zdCBjaGFyICpuYW1lLAotCQkJCQkgICBjb25zdCBjaGFyICpzaG9ydG5hbWUsCi0JCQkJCSAgIGNvbnN0IGNoYXIgKnBhdGhuYW1lLCBGSUxFICpmcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqc2hvcnRuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBhdGhuYW1lLCBGSUxFICpmcCk7CiAKIAogCiBQeU9iamVjdCAqCiBfUHlJbXBvcnRfTG9hZER5bmFtaWNNb2R1bGUoY2hhciAqbmFtZSwgY2hhciAqcGF0aG5hbWUsIEZJTEUgKmZwKQogewotCVB5T2JqZWN0ICptOwotCWNoYXIgKmxhc3Rkb3QsICpzaG9ydG5hbWUsICpwYWNrYWdlY29udGV4dCwgKm9sZGNvbnRleHQ7Ci0JZGxfZnVuY3B0ciBwOworICAgIFB5T2JqZWN0ICptOworICAgIGNoYXIgKmxhc3Rkb3QsICpzaG9ydG5hbWUsICpwYWNrYWdlY29udGV4dCwgKm9sZGNvbnRleHQ7CisgICAgZGxfZnVuY3B0ciBwOwogCi0JaWYgKChtID0gX1B5SW1wb3J0X0ZpbmRFeHRlbnNpb24obmFtZSwgcGF0aG5hbWUpKSAhPSBOVUxMKSB7Ci0JCVB5X0lOQ1JFRihtKTsKLQkJcmV0dXJuIG07Ci0JfQotCWxhc3Rkb3QgPSBzdHJyY2hyKG5hbWUsICcuJyk7Ci0JaWYgKGxhc3Rkb3QgPT0gTlVMTCkgewotCQlwYWNrYWdlY29udGV4dCA9IE5VTEw7Ci0JCXNob3J0bmFtZSA9IG5hbWU7Ci0JfQotCWVsc2UgewotCQlwYWNrYWdlY29udGV4dCA9IG5hbWU7Ci0JCXNob3J0bmFtZSA9IGxhc3Rkb3QrMTsKLQl9CisgICAgaWYgKChtID0gX1B5SW1wb3J0X0ZpbmRFeHRlbnNpb24obmFtZSwgcGF0aG5hbWUpKSAhPSBOVUxMKSB7CisgICAgICAgIFB5X0lOQ1JFRihtKTsKKyAgICAgICAgcmV0dXJuIG07CisgICAgfQorICAgIGxhc3Rkb3QgPSBzdHJyY2hyKG5hbWUsICcuJyk7CisgICAgaWYgKGxhc3Rkb3QgPT0gTlVMTCkgeworICAgICAgICBwYWNrYWdlY29udGV4dCA9IE5VTEw7CisgICAgICAgIHNob3J0bmFtZSA9IG5hbWU7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBwYWNrYWdlY29udGV4dCA9IG5hbWU7CisgICAgICAgIHNob3J0bmFtZSA9IGxhc3Rkb3QrMTsKKyAgICB9CiAKLQlwID0gX1B5SW1wb3J0X0dldER5bkxvYWRGdW5jKG5hbWUsIHNob3J0bmFtZSwgcGF0aG5hbWUsIGZwKTsKLQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKHAgPT0gTlVMTCkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfSW1wb3J0RXJyb3IsCi0JCSAgICJkeW5hbWljIG1vZHVsZSBkb2VzIG5vdCBkZWZpbmUgaW5pdCBmdW5jdGlvbiAoaW5pdCUuMjAwcykiLAotCQkJICAgICBzaG9ydG5hbWUpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0gICAgICAgIG9sZGNvbnRleHQgPSBfUHlfUGFja2FnZUNvbnRleHQ7Ci0JX1B5X1BhY2thZ2VDb250ZXh0ID0gcGFja2FnZWNvbnRleHQ7Ci0JKCpwKSgpOwotCV9QeV9QYWNrYWdlQ29udGV4dCA9IG9sZGNvbnRleHQ7Ci0JaWYgKFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiBOVUxMOworICAgIHAgPSBfUHlJbXBvcnRfR2V0RHluTG9hZEZ1bmMobmFtZSwgc2hvcnRuYW1lLCBwYXRobmFtZSwgZnApOworICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAocCA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19JbXBvcnRFcnJvciwKKyAgICAgICAgICAgImR5bmFtaWMgbW9kdWxlIGRvZXMgbm90IGRlZmluZSBpbml0IGZ1bmN0aW9uIChpbml0JS4yMDBzKSIsCisgICAgICAgICAgICAgICAgICAgICBzaG9ydG5hbWUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgb2xkY29udGV4dCA9IF9QeV9QYWNrYWdlQ29udGV4dDsKKyAgICBfUHlfUGFja2FnZUNvbnRleHQgPSBwYWNrYWdlY29udGV4dDsKKyAgICAoKnApKCk7CisgICAgX1B5X1BhY2thZ2VDb250ZXh0ID0gb2xkY29udGV4dDsKKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQltID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoUHlJbXBvcnRfR2V0TW9kdWxlRGljdCgpLCBuYW1lKTsKLQlpZiAobSA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKLQkJCQkiZHluYW1pYyBtb2R1bGUgbm90IGluaXRpYWxpemVkIHByb3Blcmx5Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQkvKiBSZW1lbWJlciB0aGUgZmlsZW5hbWUgYXMgdGhlIF9fZmlsZV9fIGF0dHJpYnV0ZSAqLwotCWlmIChQeU1vZHVsZV9BZGRTdHJpbmdDb25zdGFudChtLCAiX19maWxlX18iLCBwYXRobmFtZSkgPCAwKQotCQlQeUVycl9DbGVhcigpOyAvKiBOb3QgaW1wb3J0YW50IGVub3VnaCB0byByZXBvcnQgKi8KKyAgICBtID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoUHlJbXBvcnRfR2V0TW9kdWxlRGljdCgpLCBuYW1lKTsKKyAgICBpZiAobSA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJkeW5hbWljIG1vZHVsZSBub3QgaW5pdGlhbGl6ZWQgcHJvcGVybHkiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIC8qIFJlbWVtYmVyIHRoZSBmaWxlbmFtZSBhcyB0aGUgX19maWxlX18gYXR0cmlidXRlICovCisgICAgaWYgKFB5TW9kdWxlX0FkZFN0cmluZ0NvbnN0YW50KG0sICJfX2ZpbGVfXyIsIHBhdGhuYW1lKSA8IDApCisgICAgICAgIFB5RXJyX0NsZWFyKCk7IC8qIE5vdCBpbXBvcnRhbnQgZW5vdWdoIHRvIHJlcG9ydCAqLwogCi0JaWYgKF9QeUltcG9ydF9GaXh1cEV4dGVuc2lvbihuYW1lLCBwYXRobmFtZSkgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKFB5X1ZlcmJvc2VGbGFnKQotCQlQeVN5c19Xcml0ZVN0ZGVycigKLQkJCSJpbXBvcnQgJXMgIyBkeW5hbWljYWxseSBsb2FkZWQgZnJvbSAlc1xuIiwKLQkJCW5hbWUsIHBhdGhuYW1lKTsKLQlQeV9JTkNSRUYobSk7Ci0JcmV0dXJuIG07CisgICAgaWYgKF9QeUltcG9ydF9GaXh1cEV4dGVuc2lvbihuYW1lLCBwYXRobmFtZSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKFB5X1ZlcmJvc2VGbGFnKQorICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigKKyAgICAgICAgICAgICJpbXBvcnQgJXMgIyBkeW5hbWljYWxseSBsb2FkZWQgZnJvbSAlc1xuIiwKKyAgICAgICAgICAgIG5hbWUsIHBhdGhuYW1lKTsKKyAgICBQeV9JTkNSRUYobSk7CisgICAgcmV0dXJuIG07CiB9CiAKICNlbmRpZiAvKiBIQVZFX0RZTkFNSUNfTE9BRElORyAqLwpkaWZmIC0tZ2l0IGEvUHl0aG9uL2ltcG9ydGRsLmggYi9QeXRob24vaW1wb3J0ZGwuaAppbmRleCA1YTJkNDVjLi5iNGQyMWJlIDEwMDY0NAotLS0gYS9QeXRob24vaW1wb3J0ZGwuaAorKysgYi9QeXRob24vaW1wb3J0ZGwuaApAQCAtOCwyOCArOCwyOCBAQAogCiAvKiBEZWZpbml0aW9ucyBmb3IgZHluYW1pYyBsb2FkaW5nIG9mIGV4dGVuc2lvbiBtb2R1bGVzICovCiBlbnVtIGZpbGV0eXBlIHsKLQlTRUFSQ0hfRVJST1IsCi0JUFlfU09VUkNFLAotCVBZX0NPTVBJTEVELAotCUNfRVhURU5TSU9OLAotCVBZX1JFU09VUkNFLCAvKiBNYWMgb25seSAqLwotCVBLR19ESVJFQ1RPUlksCi0JQ19CVUlMVElOLAotCVBZX0ZST1pFTiwKLQlQWV9DT0RFUkVTT1VSQ0UsIC8qIE1hYyBvbmx5ICovCi0JSU1QX0hPT0sKKyAgICBTRUFSQ0hfRVJST1IsCisgICAgUFlfU09VUkNFLAorICAgIFBZX0NPTVBJTEVELAorICAgIENfRVhURU5TSU9OLAorICAgIFBZX1JFU09VUkNFLCAvKiBNYWMgb25seSAqLworICAgIFBLR19ESVJFQ1RPUlksCisgICAgQ19CVUlMVElOLAorICAgIFBZX0ZST1pFTiwKKyAgICBQWV9DT0RFUkVTT1VSQ0UsIC8qIE1hYyBvbmx5ICovCisgICAgSU1QX0hPT0sKIH07CiAKIHN0cnVjdCBmaWxlZGVzY3IgewotCWNoYXIgKnN1ZmZpeDsKLQljaGFyICptb2RlOwotCWVudW0gZmlsZXR5cGUgdHlwZTsKKyAgICBjaGFyICpzdWZmaXg7CisgICAgY2hhciAqbW9kZTsKKyAgICBlbnVtIGZpbGV0eXBlIHR5cGU7CiB9OwogZXh0ZXJuIHN0cnVjdCBmaWxlZGVzY3IgKiBfUHlJbXBvcnRfRmlsZXRhYjsKIGV4dGVybiBjb25zdCBzdHJ1Y3QgZmlsZWRlc2NyIF9QeUltcG9ydF9EeW5Mb2FkRmlsZXRhYltdOwogCiBleHRlcm4gUHlPYmplY3QgKl9QeUltcG9ydF9Mb2FkRHluYW1pY01vZHVsZShjaGFyICpuYW1lLCBjaGFyICpwYXRobmFtZSwKLQkJCQkJICAgICBGSUxFICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklMRSAqKTsKIAogLyogTWF4IGxlbmd0aCBvZiBtb2R1bGUgc3VmZml4IHNlYXJjaGVkIGZvciAtLSBhY2NvbW1vZGF0ZXMgIm1vZHVsZS5zbGIiICovCiAjZGVmaW5lIE1BWFNVRkZJWFNJWkUgMTIKZGlmZiAtLWdpdCBhL1B5dGhvbi9tYWN0b29sYm94Z2x1ZS5jIGIvUHl0aG9uL21hY3Rvb2xib3hnbHVlLmMKaW5kZXggNDAzN2Q0Ny4uOTJiZjNlOCAxMDA2NDQKLS0tIGEvUHl0aG9uL21hY3Rvb2xib3hnbHVlLmMKKysrIGIvUHl0aG9uL21hY3Rvb2xib3hnbHVlLmMKQEAgLTQsMTAgKzQsMTAgQEAKIAogICAgICAgICAgICAgICAgICAgICAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAogCi1QZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMgCi1kb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIAorUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsCiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0Ci1ib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gCitib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWVzIG9mIFN0aWNodGluZyBNYXRoZW1hdGlzY2gKIENlbnRydW0gb3IgQ1dJIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvCiBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4KQEAgLTI1LDQ1ICsyNSw0NSBAQAogCiAjaW5jbHVkZSAiUHl0aG9uLmgiCiAjaW5jbHVkZSAicHltYWN0b29sYm94LmgiCi0jaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CS8qIGZvciBudG9obCwgaHRvbmwgKi8KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4gIC8qIGZvciBudG9obCwgaHRvbmwgKi8KIAogCiAvKiBMaWtlIHN0cmVycm9yKCkgYnV0IGZvciBNYWMgT1MgZXJyb3IgbnVtYmVycyAqLwogY2hhciAqCiBQeU1hY19TdHJFcnJvcihpbnQgZXJyKQogewotCXN0YXRpYyBjaGFyIGJ1ZlsyNTZdOwotCVB5T2JqZWN0ICptOwotCVB5T2JqZWN0ICpydjsKKyAgICBzdGF0aWMgY2hhciBidWZbMjU2XTsKKyAgICBQeU9iamVjdCAqbTsKKyAgICBQeU9iamVjdCAqcnY7CiAKLQltID0gUHlJbXBvcnRfSW1wb3J0TW9kdWxlTm9CbG9jaygiTWFjT1MiKTsKLQlpZiAoIW0pIHsKLQkJaWYgKFB5X1ZlcmJvc2VGbGFnKQotCQkJUHlFcnJfUHJpbnQoKTsKLQkJUHlFcnJfQ2xlYXIoKTsKLQkJcnYgPSBOVUxMOwotCX0KLQllbHNlIHsKLQkJcnYgPSBQeU9iamVjdF9DYWxsTWV0aG9kKG0sICJHZXRFcnJvclN0cmluZyIsICJpIiwgZXJyKTsKLQkJaWYgKCFydikKLQkJCVB5RXJyX0NsZWFyKCk7Ci0JfQotCWlmICghcnYpIHsKLQkJYnVmWzBdID0gJ1wwJzsKLQl9Ci0JZWxzZSB7Ci0JCWNoYXIgKmlucHV0ID0gUHlTdHJpbmdfQXNTdHJpbmcocnYpOwotCQlpZiAoIWlucHV0KSB7Ci0JCQlQeUVycl9DbGVhcigpOwotCQkJYnVmWzBdID0gJ1wwJzsKLQkJfSBlbHNlIHsKLQkJCXN0cm5jcHkoYnVmLCBpbnB1dCwgc2l6ZW9mKGJ1ZikgLSAxKTsKLQkJCWJ1ZltzaXplb2YoYnVmKSAtIDFdID0gJ1wwJzsKLQkJfQotCQlQeV9ERUNSRUYocnYpOwotCX0KLQlQeV9YREVDUkVGKG0pOwotCXJldHVybiBidWY7CisgICAgbSA9IFB5SW1wb3J0X0ltcG9ydE1vZHVsZU5vQmxvY2soIk1hY09TIik7CisgICAgaWYgKCFtKSB7CisgICAgICAgIGlmIChQeV9WZXJib3NlRmxhZykKKyAgICAgICAgICAgIFB5RXJyX1ByaW50KCk7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIHJ2ID0gTlVMTDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJ2ID0gUHlPYmplY3RfQ2FsbE1ldGhvZChtLCAiR2V0RXJyb3JTdHJpbmciLCAiaSIsIGVycik7CisgICAgICAgIGlmICghcnYpCisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgIH0KKyAgICBpZiAoIXJ2KSB7CisgICAgICAgIGJ1ZlswXSA9ICdcMCc7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBjaGFyICppbnB1dCA9IFB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKKyAgICAgICAgaWYgKCFpbnB1dCkgeworICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgIGJ1ZlswXSA9ICdcMCc7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdHJuY3B5KGJ1ZiwgaW5wdXQsIHNpemVvZihidWYpIC0gMSk7CisgICAgICAgICAgICBidWZbc2l6ZW9mKGJ1ZikgLSAxXSA9ICdcMCc7CisgICAgICAgIH0KKyAgICAgICAgUHlfREVDUkVGKHJ2KTsKKyAgICB9CisgICAgUHlfWERFQ1JFRihtKTsKKyAgICByZXR1cm4gYnVmOwogfQogCiAvKiBFeGNlcHRpb24gb2JqZWN0IHNoYXJlZCBieSBhbGwgTWFjIHNwZWNpZmljIG1vZHVsZXMgZm9yIE1hYyBPUyBlcnJvcnMgKi8KQEAgLTczLDM2ICs3MywzNiBAQAogUHlPYmplY3QgKgogUHlNYWNfR2V0T1NFcnJFeGNlcHRpb24odm9pZCkKIHsKLQlpZiAoUHlNYWNfT1NFcnJFeGNlcHRpb24gPT0gTlVMTCkKLQkJUHlNYWNfT1NFcnJFeGNlcHRpb24gPSBQeUVycl9OZXdFeGNlcHRpb24oIk1hY09TLkVycm9yIiwgTlVMTCwgTlVMTCk7Ci0JcmV0dXJuIFB5TWFjX09TRXJyRXhjZXB0aW9uOworICAgIGlmIChQeU1hY19PU0VyckV4Y2VwdGlvbiA9PSBOVUxMKQorICAgICAgICBQeU1hY19PU0VyckV4Y2VwdGlvbiA9IFB5RXJyX05ld0V4Y2VwdGlvbigiTWFjT1MuRXJyb3IiLCBOVUxMLCBOVUxMKTsKKyAgICByZXR1cm4gUHlNYWNfT1NFcnJFeGNlcHRpb247CiB9CiAKIC8qIFNldCBhIE1BQy1zcGVjaWZpYyBlcnJvciBmcm9tIGVycm5vLCBhbmQgcmV0dXJuIE5VTEw7IHJldHVybiBOb25lIGlmIG5vIGVycm9yICovCi1QeU9iamVjdCAqIAorUHlPYmplY3QgKgogUHlFcnJfTWFjKFB5T2JqZWN0ICplb2JqLCBpbnQgZXJyKQogewotCWNoYXIgKm1zZzsKLQlQeU9iamVjdCAqdjsKLQkKLQlpZiAoZXJyID09IDAgJiYgIVB5RXJyX09jY3VycmVkKCkpIHsKLQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQlyZXR1cm4gUHlfTm9uZTsKLQl9Ci0JaWYgKGVyciA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gTlVMTDsKLQltc2cgPSBQeU1hY19TdHJFcnJvcihlcnIpOwotCXYgPSBQeV9CdWlsZFZhbHVlKCIoaXMpIiwgZXJyLCBtc2cpOwotCVB5RXJyX1NldE9iamVjdChlb2JqLCB2KTsKLQlQeV9ERUNSRUYodik7Ci0JcmV0dXJuIE5VTEw7CisgICAgY2hhciAqbXNnOworICAgIFB5T2JqZWN0ICp2OworCisgICAgaWYgKGVyciA9PSAwICYmICFQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgfQorICAgIGlmIChlcnIgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbXNnID0gUHlNYWNfU3RyRXJyb3IoZXJyKTsKKyAgICB2ID0gUHlfQnVpbGRWYWx1ZSgiKGlzKSIsIGVyciwgbXNnKTsKKyAgICBQeUVycl9TZXRPYmplY3QoZW9iaiwgdik7CisgICAgUHlfREVDUkVGKHYpOworICAgIHJldHVybiBOVUxMOwogfQogCiAvKiBDYWxsIFB5RXJyX01hYyB3aXRoIFB5TWFjX09TRXJyRXhjZXB0aW9uICovCiBQeU9iamVjdCAqCiBQeU1hY19FcnJvcihPU0VyciBlcnIpCiB7Ci0JcmV0dXJuIFB5RXJyX01hYyhQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpLCBlcnIpOworICAgIHJldHVybiBQeUVycl9NYWMoUHlNYWNfR2V0T1NFcnJFeGNlcHRpb24oKSwgZXJyKTsKIH0KIAogCkBAIC0xMTAsNDkgKzExMCw0OSBAQAogT1NFcnIKIFB5TWFjX0dldEZ1bGxQYXRobmFtZShGU1NwZWMgKmZzcywgY2hhciAqcGF0aCwgaW50IGxlbikKIHsKLQlQeU9iamVjdCAqZnMsICpleGM7Ci0JUHlPYmplY3QgKnJ2ID0gTlVMTDsKLQljaGFyICppbnB1dDsKLQlPU0VyciBlcnIgPSBub0VycjsKKyAgICBQeU9iamVjdCAqZnMsICpleGM7CisgICAgUHlPYmplY3QgKnJ2ID0gTlVMTDsKKyAgICBjaGFyICppbnB1dDsKKyAgICBPU0VyciBlcnIgPSBub0VycjsKIAotCSpwYXRoID0gJ1wwJzsKKyAgICAqcGF0aCA9ICdcMCc7CiAKLQlmcyA9IFB5TWFjX0J1aWxkRlNTcGVjKGZzcyk7Ci0JaWYgKCFmcykKLQkJZ290byBlcnJvcjsKKyAgICBmcyA9IFB5TWFjX0J1aWxkRlNTcGVjKGZzcyk7CisgICAgaWYgKCFmcykKKyAgICAgICAgZ290byBlcnJvcjsKIAotCXJ2ID0gUHlPYmplY3RfQ2FsbE1ldGhvZChmcywgImFzX3BhdGhuYW1lIiwgIiIpOwotCWlmICghcnYpCi0JCWdvdG8gZXJyb3I7CisgICAgcnYgPSBQeU9iamVjdF9DYWxsTWV0aG9kKGZzLCAiYXNfcGF0aG5hbWUiLCAiIik7CisgICAgaWYgKCFydikKKyAgICAgICAgZ290byBlcnJvcjsKIAotCWlucHV0ID0gUHlTdHJpbmdfQXNTdHJpbmcocnYpOwotCWlmICghaW5wdXQpCi0JCWdvdG8gZXJyb3I7CisgICAgaW5wdXQgPSBQeVN0cmluZ19Bc1N0cmluZyhydik7CisgICAgaWYgKCFpbnB1dCkKKyAgICAgICAgZ290byBlcnJvcjsKIAotCXN0cm5jcHkocGF0aCwgaW5wdXQsIGxlbiAtIDEpOwotCXBhdGhbbGVuIC0gMV0gPSAnXDAnOworICAgIHN0cm5jcHkocGF0aCwgaW5wdXQsIGxlbiAtIDEpOworICAgIHBhdGhbbGVuIC0gMV0gPSAnXDAnOwogCi0JUHlfWERFQ1JFRihydik7Ci0JUHlfWERFQ1JFRihmcyk7Ci0JcmV0dXJuIGVycjsKKyAgICBQeV9YREVDUkVGKHJ2KTsKKyAgICBQeV9YREVDUkVGKGZzKTsKKyAgICByZXR1cm4gZXJyOwogCiAgIGVycm9yOgotCWV4YyA9IFB5RXJyX09jY3VycmVkKCk7Ci0JaWYgKGV4YyAgJiYgUHlFcnJfR2l2ZW5FeGNlcHRpb25NYXRjaGVzKGV4YywKLQkJCQkJCVB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCkpKSB7Ci0JCVB5T2JqZWN0ICphcmdzID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhleGMsICJhcmdzIik7Ci0JCWlmIChhcmdzKSB7Ci0JCQljaGFyICppZ25vcmU7Ci0JCQlQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpcyIsICZlcnIsICZpZ25vcmUpOwotCQkJUHlfWERFQ1JFRihhcmdzKTsKLQkJfQotCX0KLQlpZiAoZXJyID09IG5vRXJyKQotCQllcnIgPSAtMTsKLQlQeUVycl9DbGVhcigpOwotCVB5X1hERUNSRUYocnYpOwotCVB5X1hERUNSRUYoZnMpOwotCXJldHVybiBlcnI7CisgICAgZXhjID0gUHlFcnJfT2NjdXJyZWQoKTsKKyAgICBpZiAoZXhjICAmJiBQeUVycl9HaXZlbkV4Y2VwdGlvbk1hdGNoZXMoZXhjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpKSkgeworICAgICAgICBQeU9iamVjdCAqYXJncyA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoZXhjLCAiYXJncyIpOworICAgICAgICBpZiAoYXJncykgeworICAgICAgICAgICAgY2hhciAqaWdub3JlOworICAgICAgICAgICAgUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaXMiLCAmZXJyLCAmaWdub3JlKTsKKyAgICAgICAgICAgIFB5X1hERUNSRUYoYXJncyk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGVyciA9PSBub0VycikKKyAgICAgICAgZXJyID0gLTE7CisgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICBQeV9YREVDUkVGKHJ2KTsKKyAgICBQeV9YREVDUkVGKGZzKTsKKyAgICByZXR1cm4gZXJyOwogfQogI2VuZGlmIC8qICFfX0xQNjRfXyAqLwogCkBAIC0xNjAsMzAgKzE2MCwzMCBAQAogaW50CiBQeU1hY19HZXRPU1R5cGUoUHlPYmplY3QgKnYsIE9TVHlwZSAqcHIpCiB7Ci0JdWludDMyX3QgdG1wOwotCWlmICghUHlTdHJpbmdfQ2hlY2sodikgfHwgUHlTdHJpbmdfU2l6ZSh2KSAhPSA0KSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkiT1NUeXBlIGFyZyBtdXN0IGJlIHN0cmluZyBvZiA0IGNoYXJzIik7Ci0JCXJldHVybiAwOwotCX0KLQltZW1jcHkoKGNoYXIgKikmdG1wLCBQeVN0cmluZ19Bc1N0cmluZyh2KSwgNCk7Ci0JKnByID0gKE9TVHlwZSludG9obCh0bXApOwotCXJldHVybiAxOworICAgIHVpbnQzMl90IHRtcDsKKyAgICBpZiAoIVB5U3RyaW5nX0NoZWNrKHYpIHx8IFB5U3RyaW5nX1NpemUodikgIT0gNCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgIk9TVHlwZSBhcmcgbXVzdCBiZSBzdHJpbmcgb2YgNCBjaGFycyIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgbWVtY3B5KChjaGFyICopJnRtcCwgUHlTdHJpbmdfQXNTdHJpbmcodiksIDQpOworICAgICpwciA9IChPU1R5cGUpbnRvaGwodG1wKTsKKyAgICByZXR1cm4gMTsKIH0KIAogLyogQ29udmVydCBhbiBPU1R5cGUgdmFsdWUgdG8gYSA0LWNoYXIgc3RyaW5nIG9iamVjdCAqLwogUHlPYmplY3QgKgogUHlNYWNfQnVpbGRPU1R5cGUoT1NUeXBlIHQpCiB7Ci0JdWludDMyX3QgdG1wID0gaHRvbmwoKHVpbnQzMl90KXQpOwotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKSZ0bXAsIDQpOworICAgIHVpbnQzMl90IHRtcCA9IGh0b25sKCh1aW50MzJfdCl0KTsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKikmdG1wLCA0KTsKIH0KIAogLyogQ29udmVydCBhbiBOdW1WZXJzaW9uIHZhbHVlIHRvIGEgNC1lbGVtZW50IHR1cGxlICovCiBQeU9iamVjdCAqCiBQeU1hY19CdWlsZE51bVZlcnNpb24oTnVtVmVyc2lvbiB0KQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKCIoaGhoaCkiLCB0Lm1ham9yUmV2LCB0Lm1pbm9yQW5kQnVnUmV2LCB0LnN0YWdlLCB0Lm5vblJlbFJldik7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihoaGhoKSIsIHQubWFqb3JSZXYsIHQubWlub3JBbmRCdWdSZXYsIHQuc3RhZ2UsIHQubm9uUmVsUmV2KTsKIH0KIAogCkBAIC0xOTEsMzYgKzE5MSwzNiBAQAogaW50CiBQeU1hY19HZXRTdHIyNTUoUHlPYmplY3QgKnYsIFN0cjI1NSBwYnVmKQogewotCWludCBsZW47Ci0JaWYgKCFQeVN0cmluZ19DaGVjayh2KSB8fCAobGVuID0gUHlTdHJpbmdfU2l6ZSh2KSkgPiAyNTUpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCSJTdHIyNTUgYXJnIG11c3QgYmUgc3RyaW5nIG9mIGF0IG1vc3QgMjU1IGNoYXJzIik7Ci0JCXJldHVybiAwOwotCX0KLQlwYnVmWzBdID0gbGVuOwotCW1lbWNweSgoY2hhciAqKShwYnVmKzEpLCBQeVN0cmluZ19Bc1N0cmluZyh2KSwgbGVuKTsKLQlyZXR1cm4gMTsKKyAgICBpbnQgbGVuOworICAgIGlmICghUHlTdHJpbmdfQ2hlY2sodikgfHwgKGxlbiA9IFB5U3RyaW5nX1NpemUodikpID4gMjU1KSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAiU3RyMjU1IGFyZyBtdXN0IGJlIHN0cmluZyBvZiBhdCBtb3N0IDI1NSBjaGFycyIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcGJ1ZlswXSA9IGxlbjsKKyAgICBtZW1jcHkoKGNoYXIgKikocGJ1ZisxKSwgUHlTdHJpbmdfQXNTdHJpbmcodiksIGxlbik7CisgICAgcmV0dXJuIDE7CiB9CiAKIC8qIENvbnZlcnQgYSBTdHIyNTUgdG8gYSBQeXRob24gc3RyaW5nIG9iamVjdCAqLwogUHlPYmplY3QgKgogUHlNYWNfQnVpbGRTdHIyNTUoU3RyMjU1IHMpCiB7Ci0JaWYgKCBzID09IE5VTEwgKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwgIlN0cjI1NSBwb2ludGVyIGlzIE5VTEwiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKSZzWzFdLCAoaW50KXNbMF0pOworICAgIGlmICggcyA9PSBOVUxMICkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsICJTdHIyNTUgcG9pbnRlciBpcyBOVUxMIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKikmc1sxXSwgKGludClzWzBdKTsKIH0KIAogUHlPYmplY3QgKgogUHlNYWNfQnVpbGRPcHRTdHIyNTUoU3RyMjU1IHMpCiB7Ci0JaWYgKCBzID09IE5VTEwgKSB7Ci0JCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJcmV0dXJuIFB5X05vbmU7Ci0JfQotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKSZzWzFdLCAoaW50KXNbMF0pOworICAgIGlmICggcyA9PSBOVUxMICkgeworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIHJldHVybiBQeV9Ob25lOworICAgIH0KKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKikmc1sxXSwgKGludClzWzBdKTsKIH0KIAogCkBAIC0yMzIsMTQgKzIzMiwxNCBAQAogaW50CiBQeU1hY19HZXRSZWN0KFB5T2JqZWN0ICp2LCBSZWN0ICpyKQogewotCXJldHVybiBQeUFyZ19QYXJzZSh2LCAiKGhoaGgpIiwgJnItPmxlZnQsICZyLT50b3AsICZyLT5yaWdodCwgJnItPmJvdHRvbSk7CisgICAgcmV0dXJuIFB5QXJnX1BhcnNlKHYsICIoaGhoaCkiLCAmci0+bGVmdCwgJnItPnRvcCwgJnItPnJpZ2h0LCAmci0+Ym90dG9tKTsKIH0KIAogLyogQ29udmVydCBhIFJlY3QgdG8gYSBQeXRob24gb2JqZWN0ICovCiBQeU9iamVjdCAqCiBQeU1hY19CdWlsZFJlY3QoUmVjdCAqcikKIHsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKGhoaGgpIiwgci0+bGVmdCwgci0+dG9wLCByLT5yaWdodCwgci0+Ym90dG9tKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKGhoaGgpIiwgci0+bGVmdCwgci0+dG9wLCByLT5yaWdodCwgci0+Ym90dG9tKTsKIH0KIAogCkBAIC0yNTAsMTQgKzI1MCwxNCBAQAogaW50CiBQeU1hY19HZXRQb2ludChQeU9iamVjdCAqdiwgUG9pbnQgKnApCiB7Ci0JcmV0dXJuIFB5QXJnX1BhcnNlKHYsICIoaGgpIiwgJnAtPmgsICZwLT52KTsKKyAgICByZXR1cm4gUHlBcmdfUGFyc2UodiwgIihoaCkiLCAmcC0+aCwgJnAtPnYpOwogfQogCiAvKiBDb252ZXJ0IGEgUG9pbnQgdG8gYSBQeXRob24gb2JqZWN0ICovCiBQeU9iamVjdCAqCiBQeU1hY19CdWlsZFBvaW50KFBvaW50IHApCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihoaCkiLCBwLmgsIHAudik7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihoaCkiLCBwLmgsIHAudik7CiB9CiAKIApAQCAtMjY2LDczICsyNjYsNzMgQEAKIGludAogUHlNYWNfR2V0RXZlbnRSZWNvcmQoUHlPYmplY3QgKnYsIEV2ZW50UmVjb3JkICplKQogewotCXJldHVybiBQeUFyZ19QYXJzZSh2LCAiKEhrayhoaClIKSIsCi0JICAgICAgICAgICAgICAgICAgICZlLT53aGF0LAotCSAgICAgICAgICAgICAgICAgICAmZS0+bWVzc2FnZSwKLQkgICAgICAgICAgICAgICAgICAgJmUtPndoZW4sCi0JICAgICAgICAgICAgICAgICAgICZlLT53aGVyZS5oLAotCSAgICAgICAgICAgICAgICAgICAmZS0+d2hlcmUudiwgICAgICAgICAgICAgICAgICAgCi0JICAgICAgICAgICAgICAgICAgICZlLT5tb2RpZmllcnMpOworICAgIHJldHVybiBQeUFyZ19QYXJzZSh2LCAiKEhrayhoaClIKSIsCisgICAgICAgICAgICAgICAgICAgICAgICZlLT53aGF0LAorICAgICAgICAgICAgICAgICAgICAgICAmZS0+bWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgJmUtPndoZW4sCisgICAgICAgICAgICAgICAgICAgICAgICZlLT53aGVyZS5oLAorICAgICAgICAgICAgICAgICAgICAgICAmZS0+d2hlcmUudiwKKyAgICAgICAgICAgICAgICAgICAgICAgJmUtPm1vZGlmaWVycyk7CiB9CiAKIC8qIENvbnZlcnQgYSBSZWN0IHRvIGFuIEV2ZW50UmVjb3JkIG9iamVjdCAqLwogUHlPYmplY3QgKgogUHlNYWNfQnVpbGRFdmVudFJlY29yZChFdmVudFJlY29yZCAqZSkKIHsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKGhsbChoaCloKSIsCi0JICAgICAgICAgICAgICAgICAgICAgZS0+d2hhdCwKLQkgICAgICAgICAgICAgICAgICAgICBlLT5tZXNzYWdlLAotCSAgICAgICAgICAgICAgICAgICAgIGUtPndoZW4sCi0JICAgICAgICAgICAgICAgICAgICAgZS0+d2hlcmUuaCwKLQkgICAgICAgICAgICAgICAgICAgICBlLT53aGVyZS52LAotCSAgICAgICAgICAgICAgICAgICAgIGUtPm1vZGlmaWVycyk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihobGwoaGgpaCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGUtPndoYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgZS0+bWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBlLT53aGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgIGUtPndoZXJlLmgsCisgICAgICAgICAgICAgICAgICAgICAgICAgZS0+d2hlcmUudiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBlLT5tb2RpZmllcnMpOwogfQogCiAvKiBDb252ZXJ0IFB5dGhvbiBvYmplY3QgdG8gRml4ZWQgKi8KIGludAogUHlNYWNfR2V0Rml4ZWQoUHlPYmplY3QgKnYsIEZpeGVkICpmKQogewotCWRvdWJsZSBkOwotCQotCWlmKCAhUHlBcmdfUGFyc2UodiwgImQiLCAmZCkpCi0JCXJldHVybiAwOwotCSpmID0gKEZpeGVkKShkICogMHgxMDAwMCk7Ci0JcmV0dXJuIDE7CisgICAgZG91YmxlIGQ7CisKKyAgICBpZiggIVB5QXJnX1BhcnNlKHYsICJkIiwgJmQpKQorICAgICAgICByZXR1cm4gMDsKKyAgICAqZiA9IChGaXhlZCkoZCAqIDB4MTAwMDApOworICAgIHJldHVybiAxOwogfQogCiAvKiBDb252ZXJ0IGEgRml4ZWQgdG8gYSBQeXRob24gb2JqZWN0ICovCiBQeU9iamVjdCAqCiBQeU1hY19CdWlsZEZpeGVkKEZpeGVkIGYpCiB7Ci0JZG91YmxlIGQ7Ci0JCi0JZCA9IGY7Ci0JZCA9IGQgLyAweDEwMDAwOwotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJkIiwgZCk7CisgICAgZG91YmxlIGQ7CisKKyAgICBkID0gZjsKKyAgICBkID0gZCAvIDB4MTAwMDA7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImQiLCBkKTsKIH0KIAogLyogQ29udmVydCB3aWRlIHRvL2Zyb20gUHl0aG9uIGludCBvciAoaGksIGxvKSB0dXBsZS4gWFhYWCBTaG91bGQgdXNlIFB5dGhvbiBsb25ncyAqLwogaW50CiBQeU1hY19HZXR3aWRlKFB5T2JqZWN0ICp2LCB3aWRlICpydikKIHsKLQlpZiAoUHlJbnRfQ2hlY2sodikpIHsKLQkJcnYtPmhpID0gMDsKLQkJcnYtPmxvID0gUHlJbnRfQXNMb25nKHYpOwotCQlpZiggcnYtPmxvICYgMHg4MDAwMDAwMCApCi0JCQlydi0+aGkgPSAtMTsKLQkJcmV0dXJuIDE7Ci0JfQotCXJldHVybiBQeUFyZ19QYXJzZSh2LCAiKGtrKSIsICZydi0+aGksICZydi0+bG8pOworICAgIGlmIChQeUludF9DaGVjayh2KSkgeworICAgICAgICBydi0+aGkgPSAwOworICAgICAgICBydi0+bG8gPSBQeUludF9Bc0xvbmcodik7CisgICAgICAgIGlmKCBydi0+bG8gJiAweDgwMDAwMDAwICkKKyAgICAgICAgICAgIHJ2LT5oaSA9IC0xOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgcmV0dXJuIFB5QXJnX1BhcnNlKHYsICIoa2spIiwgJnJ2LT5oaSwgJnJ2LT5sbyk7CiB9CiAKIAogUHlPYmplY3QgKgogUHlNYWNfQnVpbGR3aWRlKHdpZGUgKncpCiB7Ci0JaWYgKCAody0+aGkgPT0gMCAmJiAody0+bG8gJiAweDgwMDAwMDAwKSA9PSAwKSB8fAotCSAgICAgKHctPmhpID09IC0xICYmICh3LT5sbyAmIDB4ODAwMDAwMDApICkgKQotCQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcody0+bG8pOwotCXJldHVybiBQeV9CdWlsZFZhbHVlKCIobGwpIiwgdy0+aGksIHctPmxvKTsKKyAgICBpZiAoICh3LT5oaSA9PSAwICYmICh3LT5sbyAmIDB4ODAwMDAwMDApID09IDApIHx8CisgICAgICAgICAody0+aGkgPT0gLTEgJiYgKHctPmxvICYgMHg4MDAwMDAwMCkgKSApCisgICAgICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyh3LT5sbyk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihsbCkiLCB3LT5oaSwgdy0+bG8pOwogfQogCiAjaWZkZWYgVVNFX1RPT0xCT1hfT0JKRUNUX0dMVUUKQEAgLTM1OCw4ICszNTgsOCBAQAogICAgIGlmICghUHlNYWNHbHVlUHRyXyMjcm91dGluZW5hbWUpIHsgXAogICAgICAgIGlmICghUHlJbXBvcnRfSW1wb3J0TW9kdWxlKG1vZHVsZSkpIHJldHVybiBOVUxMOyBcCiAgICAgICAgaWYgKCFQeU1hY0dsdWVQdHJfIyNyb3V0aW5lbmFtZSkgeyBcCi0gICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwgIk1vZHVsZSBkaWQgbm90IHByb3ZpZGUgcm91dGluZTogIiBtb2R1bGUgIjogIiAjcm91dGluZW5hbWUpOyBcCi0gICAgICAgICAgIHJldHVybiBOVUxMOyBcCisgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0ltcG9ydEVycm9yLCAiTW9kdWxlIGRpZCBub3QgcHJvdmlkZSByb3V0aW5lOiAiIG1vZHVsZSAiOiAiICNyb3V0aW5lbmFtZSk7IFwKKyAgICAgICByZXR1cm4gTlVMTDsgXAogICAgICAgIH0gXAogICAgIH0gXAogICAgIHJldHVybiAoKlB5TWFjR2x1ZVB0cl8jI3JvdXRpbmVuYW1lKShjb2JqKTsgXApAQCAtMzcyLDggKzM3Miw4IEBACiAgICAgaWYgKCFQeU1hY0dsdWVQdHJfIyNyb3V0aW5lbmFtZSkgeyBcCiAgICAgICAgaWYgKCFQeUltcG9ydF9JbXBvcnRNb2R1bGUobW9kdWxlKSkgcmV0dXJuIDA7IFwKICAgICAgICBpZiAoIVB5TWFjR2x1ZVB0cl8jI3JvdXRpbmVuYW1lKSB7IFwKLSAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0ltcG9ydEVycm9yLCAiTW9kdWxlIGRpZCBub3QgcHJvdmlkZSByb3V0aW5lOiAiIG1vZHVsZSAiOiAiICNyb3V0aW5lbmFtZSk7IFwKLSAgICAgICAgICAgcmV0dXJuIDA7IFwKKyAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW1wb3J0RXJyb3IsICJNb2R1bGUgZGlkIG5vdCBwcm92aWRlIHJvdXRpbmU6ICIgbW9kdWxlICI6ICIgI3JvdXRpbmVuYW1lKTsgXAorICAgICAgIHJldHVybiAwOyBcCiAgICAgICAgfSBcCiAgICAgfSBcCiAgICAgcmV0dXJuICgqUHlNYWNHbHVlUHRyXyMjcm91dGluZW5hbWUpKHB5b2JqLCBjb2JqKTsgXApkaWZmIC0tZ2l0IGEvUHl0aG9uL21hcnNoYWwuYyBiL1B5dGhvbi9tYXJzaGFsLmMKaW5kZXggYTRjODMxZi4uYmNjODYzNiAxMDA2NDQKLS0tIGEvUHl0aG9uL21hcnNoYWwuYworKysgYi9QeXRob24vbWFyc2hhbC5jCkBAIC0xNyw0MDggKzE3LDQwOCBAQAogICovCiAjZGVmaW5lIE1BWF9NQVJTSEFMX1NUQUNLX0RFUFRIIDIwMDAKIAotI2RlZmluZSBUWVBFX05VTEwJCScwJwotI2RlZmluZSBUWVBFX05PTkUJCSdOJwotI2RlZmluZSBUWVBFX0ZBTFNFCQknRicKLSNkZWZpbmUgVFlQRV9UUlVFCQknVCcKLSNkZWZpbmUgVFlQRV9TVE9QSVRFUgkJJ1MnCi0jZGVmaW5lIFRZUEVfRUxMSVBTSVMgICAJJy4nCi0jZGVmaW5lIFRZUEVfSU5UCQknaScKLSNkZWZpbmUgVFlQRV9JTlQ2NAkJJ0knCi0jZGVmaW5lIFRZUEVfRkxPQVQJCSdmJwotI2RlZmluZSBUWVBFX0JJTkFSWV9GTE9BVAknZycKLSNkZWZpbmUgVFlQRV9DT01QTEVYCQkneCcKLSNkZWZpbmUgVFlQRV9CSU5BUllfQ09NUExFWAkneScKLSNkZWZpbmUgVFlQRV9MT05HCQknbCcKLSNkZWZpbmUgVFlQRV9TVFJJTkcJCSdzJwotI2RlZmluZSBUWVBFX0lOVEVSTkVECQkndCcKLSNkZWZpbmUgVFlQRV9TVFJJTkdSRUYJCSdSJwotI2RlZmluZSBUWVBFX1RVUExFCQknKCcKLSNkZWZpbmUgVFlQRV9MSVNUCQknWycKLSNkZWZpbmUgVFlQRV9ESUNUCQkneycKLSNkZWZpbmUgVFlQRV9DT0RFCQknYycKLSNkZWZpbmUgVFlQRV9VTklDT0RFCQkndScKLSNkZWZpbmUgVFlQRV9VTktOT1dOCQknPycKLSNkZWZpbmUgVFlQRV9TRVQJCSc8JwotI2RlZmluZSBUWVBFX0ZST1pFTlNFVCAgCSc+JworI2RlZmluZSBUWVBFX05VTEwgICAgICAgICAgICAgICAnMCcKKyNkZWZpbmUgVFlQRV9OT05FICAgICAgICAgICAgICAgJ04nCisjZGVmaW5lIFRZUEVfRkFMU0UgICAgICAgICAgICAgICdGJworI2RlZmluZSBUWVBFX1RSVUUgICAgICAgICAgICAgICAnVCcKKyNkZWZpbmUgVFlQRV9TVE9QSVRFUiAgICAgICAgICAgJ1MnCisjZGVmaW5lIFRZUEVfRUxMSVBTSVMgICAgICAgICAgICcuJworI2RlZmluZSBUWVBFX0lOVCAgICAgICAgICAgICAgICAnaScKKyNkZWZpbmUgVFlQRV9JTlQ2NCAgICAgICAgICAgICAgJ0knCisjZGVmaW5lIFRZUEVfRkxPQVQgICAgICAgICAgICAgICdmJworI2RlZmluZSBUWVBFX0JJTkFSWV9GTE9BVCAgICAgICAnZycKKyNkZWZpbmUgVFlQRV9DT01QTEVYICAgICAgICAgICAgJ3gnCisjZGVmaW5lIFRZUEVfQklOQVJZX0NPTVBMRVggICAgICd5JworI2RlZmluZSBUWVBFX0xPTkcgICAgICAgICAgICAgICAnbCcKKyNkZWZpbmUgVFlQRV9TVFJJTkcgICAgICAgICAgICAgJ3MnCisjZGVmaW5lIFRZUEVfSU5URVJORUQgICAgICAgICAgICd0JworI2RlZmluZSBUWVBFX1NUUklOR1JFRiAgICAgICAgICAnUicKKyNkZWZpbmUgVFlQRV9UVVBMRSAgICAgICAgICAgICAgJygnCisjZGVmaW5lIFRZUEVfTElTVCAgICAgICAgICAgICAgICdbJworI2RlZmluZSBUWVBFX0RJQ1QgICAgICAgICAgICAgICAneycKKyNkZWZpbmUgVFlQRV9DT0RFICAgICAgICAgICAgICAgJ2MnCisjZGVmaW5lIFRZUEVfVU5JQ09ERSAgICAgICAgICAgICd1JworI2RlZmluZSBUWVBFX1VOS05PV04gICAgICAgICAgICAnPycKKyNkZWZpbmUgVFlQRV9TRVQgICAgICAgICAgICAgICAgJzwnCisjZGVmaW5lIFRZUEVfRlJPWkVOU0VUICAgICAgICAgICc+JwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JRklMRSAqZnA7Ci0JaW50IGVycm9yOwotCWludCBkZXB0aDsKLQkvKiBJZiBmcCA9PSBOVUxMLCB0aGUgZm9sbG93aW5nIGFyZSB2YWxpZDogKi8KLQlQeU9iamVjdCAqc3RyOwotCWNoYXIgKnB0cjsKLQljaGFyICplbmQ7Ci0JUHlPYmplY3QgKnN0cmluZ3M7IC8qIGRpY3Qgb24gbWFyc2hhbCwgbGlzdCBvbiB1bm1hcnNoYWwgKi8KLQlpbnQgdmVyc2lvbjsKKyAgICBGSUxFICpmcDsKKyAgICBpbnQgZXJyb3I7CisgICAgaW50IGRlcHRoOworICAgIC8qIElmIGZwID09IE5VTEwsIHRoZSBmb2xsb3dpbmcgYXJlIHZhbGlkOiAqLworICAgIFB5T2JqZWN0ICpzdHI7CisgICAgY2hhciAqcHRyOworICAgIGNoYXIgKmVuZDsKKyAgICBQeU9iamVjdCAqc3RyaW5nczsgLyogZGljdCBvbiBtYXJzaGFsLCBsaXN0IG9uIHVubWFyc2hhbCAqLworICAgIGludCB2ZXJzaW9uOwogfSBXRklMRTsKIAogI2RlZmluZSB3X2J5dGUoYywgcCkgaWYgKCgocCktPmZwKSkgcHV0YygoYyksIChwKS0+ZnApOyBcCi0JCSAgICAgIGVsc2UgaWYgKChwKS0+cHRyICE9IChwKS0+ZW5kKSAqKHApLT5wdHIrKyA9IChjKTsgXAotCQkJICAgZWxzZSB3X21vcmUoYywgcCkKKyAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgocCktPnB0ciAhPSAocCktPmVuZCkgKihwKS0+cHRyKysgPSAoYyk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Ugd19tb3JlKGMsIHApCiAKIHN0YXRpYyB2b2lkCiB3X21vcmUoaW50IGMsIFdGSUxFICpwKQogewotCVB5X3NzaXplX3Qgc2l6ZSwgbmV3c2l6ZTsKLQlpZiAocC0+c3RyID09IE5VTEwpCi0JCXJldHVybjsgLyogQW4gZXJyb3IgYWxyZWFkeSBvY2N1cnJlZCAqLwotCXNpemUgPSBQeVN0cmluZ19TaXplKHAtPnN0cik7Ci0JbmV3c2l6ZSA9IHNpemUgKyBzaXplICsgMTAyNDsKLQlpZiAobmV3c2l6ZSA+IDMyKjEwMjQqMTAyNCkgewotCQluZXdzaXplID0gc2l6ZSArIChzaXplID4+IDMpOwkvKiAxMi41JSBvdmVyYWxsb2NhdGlvbiAqLwotCX0KLQlpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmcC0+c3RyLCBuZXdzaXplKSAhPSAwKSB7Ci0JCXAtPnB0ciA9IHAtPmVuZCA9IE5VTEw7Ci0JfQotCWVsc2UgewotCQlwLT5wdHIgPSBQeVN0cmluZ19BU19TVFJJTkcoKFB5U3RyaW5nT2JqZWN0ICopcC0+c3RyKSArIHNpemU7Ci0JCXAtPmVuZCA9Ci0JCQlQeVN0cmluZ19BU19TVFJJTkcoKFB5U3RyaW5nT2JqZWN0ICopcC0+c3RyKSArIG5ld3NpemU7Ci0JCSpwLT5wdHIrKyA9IFB5X1NBRkVfRE9XTkNBU1QoYywgaW50LCBjaGFyKTsKLQl9CisgICAgUHlfc3NpemVfdCBzaXplLCBuZXdzaXplOworICAgIGlmIChwLT5zdHIgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOyAvKiBBbiBlcnJvciBhbHJlYWR5IG9jY3VycmVkICovCisgICAgc2l6ZSA9IFB5U3RyaW5nX1NpemUocC0+c3RyKTsKKyAgICBuZXdzaXplID0gc2l6ZSArIHNpemUgKyAxMDI0OworICAgIGlmIChuZXdzaXplID4gMzIqMTAyNCoxMDI0KSB7CisgICAgICAgIG5ld3NpemUgPSBzaXplICsgKHNpemUgPj4gMyk7ICAgICAgICAgICAvKiAxMi41JSBvdmVyYWxsb2NhdGlvbiAqLworICAgIH0KKyAgICBpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmcC0+c3RyLCBuZXdzaXplKSAhPSAwKSB7CisgICAgICAgIHAtPnB0ciA9IHAtPmVuZCA9IE5VTEw7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBwLT5wdHIgPSBQeVN0cmluZ19BU19TVFJJTkcoKFB5U3RyaW5nT2JqZWN0ICopcC0+c3RyKSArIHNpemU7CisgICAgICAgIHAtPmVuZCA9CisgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcoKFB5U3RyaW5nT2JqZWN0ICopcC0+c3RyKSArIG5ld3NpemU7CisgICAgICAgICpwLT5wdHIrKyA9IFB5X1NBRkVfRE9XTkNBU1QoYywgaW50LCBjaGFyKTsKKyAgICB9CiB9CiAKIHN0YXRpYyB2b2lkCiB3X3N0cmluZyhjaGFyICpzLCBpbnQgbiwgV0ZJTEUgKnApCiB7Ci0JaWYgKHAtPmZwICE9IE5VTEwpIHsKLQkJZndyaXRlKHMsIDEsIG4sIHAtPmZwKTsKLQl9Ci0JZWxzZSB7Ci0JCXdoaWxlICgtLW4gPj0gMCkgewotCQkJd19ieXRlKCpzLCBwKTsKLQkJCXMrKzsKLQkJfQotCX0KKyAgICBpZiAocC0+ZnAgIT0gTlVMTCkgeworICAgICAgICBmd3JpdGUocywgMSwgbiwgcC0+ZnApOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgd2hpbGUgKC0tbiA+PSAwKSB7CisgICAgICAgICAgICB3X2J5dGUoKnMsIHApOworICAgICAgICAgICAgcysrOworICAgICAgICB9CisgICAgfQogfQogCiBzdGF0aWMgdm9pZAogd19zaG9ydChpbnQgeCwgV0ZJTEUgKnApCiB7Ci0Jd19ieXRlKChjaGFyKSggeCAgICAgICYgMHhmZiksIHApOwotCXdfYnl0ZSgoY2hhcikoKHg+PiA4KSAmIDB4ZmYpLCBwKTsKKyAgICB3X2J5dGUoKGNoYXIpKCB4ICAgICAgJiAweGZmKSwgcCk7CisgICAgd19ieXRlKChjaGFyKSgoeD4+IDgpICYgMHhmZiksIHApOwogfQogCiBzdGF0aWMgdm9pZAogd19sb25nKGxvbmcgeCwgV0ZJTEUgKnApCiB7Ci0Jd19ieXRlKChjaGFyKSggeCAgICAgICYgMHhmZiksIHApOwotCXdfYnl0ZSgoY2hhcikoKHg+PiA4KSAmIDB4ZmYpLCBwKTsKLQl3X2J5dGUoKGNoYXIpKCh4Pj4xNikgJiAweGZmKSwgcCk7Ci0Jd19ieXRlKChjaGFyKSgoeD4+MjQpICYgMHhmZiksIHApOworICAgIHdfYnl0ZSgoY2hhcikoIHggICAgICAmIDB4ZmYpLCBwKTsKKyAgICB3X2J5dGUoKGNoYXIpKCh4Pj4gOCkgJiAweGZmKSwgcCk7CisgICAgd19ieXRlKChjaGFyKSgoeD4+MTYpICYgMHhmZiksIHApOworICAgIHdfYnl0ZSgoY2hhcikoKHg+PjI0KSAmIDB4ZmYpLCBwKTsKIH0KIAogI2lmIFNJWkVPRl9MT05HID4gNAogc3RhdGljIHZvaWQKIHdfbG9uZzY0KGxvbmcgeCwgV0ZJTEUgKnApCiB7Ci0Jd19sb25nKHgsIHApOwotCXdfbG9uZyh4Pj4zMiwgcCk7CisgICAgd19sb25nKHgsIHApOworICAgIHdfbG9uZyh4Pj4zMiwgcCk7CiB9CiAjZW5kaWYKIAogc3RhdGljIHZvaWQKIHdfb2JqZWN0KFB5T2JqZWN0ICp2LCBXRklMRSAqcCkKIHsKLQlQeV9zc2l6ZV90IGksIG47CisgICAgUHlfc3NpemVfdCBpLCBuOwogCi0JcC0+ZGVwdGgrKzsKKyAgICBwLT5kZXB0aCsrOwogCi0JaWYgKHAtPmRlcHRoID4gTUFYX01BUlNIQUxfU1RBQ0tfREVQVEgpIHsKLQkJcC0+ZXJyb3IgPSAyOwotCX0KLQllbHNlIGlmICh2ID09IE5VTEwpIHsKLQkJd19ieXRlKFRZUEVfTlVMTCwgcCk7Ci0JfQotCWVsc2UgaWYgKHYgPT0gUHlfTm9uZSkgewotCQl3X2J5dGUoVFlQRV9OT05FLCBwKTsKLQl9Ci0JZWxzZSBpZiAodiA9PSBQeUV4Y19TdG9wSXRlcmF0aW9uKSB7Ci0JCXdfYnl0ZShUWVBFX1NUT1BJVEVSLCBwKTsKLQl9Ci0JZWxzZSBpZiAodiA9PSBQeV9FbGxpcHNpcykgewotCSAgICAgICAgd19ieXRlKFRZUEVfRUxMSVBTSVMsIHApOwotCX0KLQllbHNlIGlmICh2ID09IFB5X0ZhbHNlKSB7Ci0JICAgICAgICB3X2J5dGUoVFlQRV9GQUxTRSwgcCk7Ci0JfQotCWVsc2UgaWYgKHYgPT0gUHlfVHJ1ZSkgewotCSAgICAgICAgd19ieXRlKFRZUEVfVFJVRSwgcCk7Ci0JfQotCWVsc2UgaWYgKFB5SW50X0NoZWNrRXhhY3QodikpIHsKLQkJbG9uZyB4ID0gUHlJbnRfQVNfTE9ORygoUHlJbnRPYmplY3QgKil2KTsKKyAgICBpZiAocC0+ZGVwdGggPiBNQVhfTUFSU0hBTF9TVEFDS19ERVBUSCkgeworICAgICAgICBwLT5lcnJvciA9IDI7CisgICAgfQorICAgIGVsc2UgaWYgKHYgPT0gTlVMTCkgeworICAgICAgICB3X2J5dGUoVFlQRV9OVUxMLCBwKTsKKyAgICB9CisgICAgZWxzZSBpZiAodiA9PSBQeV9Ob25lKSB7CisgICAgICAgIHdfYnl0ZShUWVBFX05PTkUsIHApOworICAgIH0KKyAgICBlbHNlIGlmICh2ID09IFB5RXhjX1N0b3BJdGVyYXRpb24pIHsKKyAgICAgICAgd19ieXRlKFRZUEVfU1RPUElURVIsIHApOworICAgIH0KKyAgICBlbHNlIGlmICh2ID09IFB5X0VsbGlwc2lzKSB7CisgICAgICAgIHdfYnl0ZShUWVBFX0VMTElQU0lTLCBwKTsKKyAgICB9CisgICAgZWxzZSBpZiAodiA9PSBQeV9GYWxzZSkgeworICAgICAgICB3X2J5dGUoVFlQRV9GQUxTRSwgcCk7CisgICAgfQorICAgIGVsc2UgaWYgKHYgPT0gUHlfVHJ1ZSkgeworICAgICAgICB3X2J5dGUoVFlQRV9UUlVFLCBwKTsKKyAgICB9CisgICAgZWxzZSBpZiAoUHlJbnRfQ2hlY2tFeGFjdCh2KSkgeworICAgICAgICBsb25nIHggPSBQeUludF9BU19MT05HKChQeUludE9iamVjdCAqKXYpOwogI2lmIFNJWkVPRl9MT05HID4gNAotCQlsb25nIHkgPSBQeV9BUklUSE1FVElDX1JJR0hUX1NISUZUKGxvbmcsIHgsIDMxKTsKLQkJaWYgKHkgJiYgeSAhPSAtMSkgewotCQkJd19ieXRlKFRZUEVfSU5UNjQsIHApOwotCQkJd19sb25nNjQoeCwgcCk7Ci0JCX0KLQkJZWxzZQorICAgICAgICBsb25nIHkgPSBQeV9BUklUSE1FVElDX1JJR0hUX1NISUZUKGxvbmcsIHgsIDMxKTsKKyAgICAgICAgaWYgKHkgJiYgeSAhPSAtMSkgeworICAgICAgICAgICAgd19ieXRlKFRZUEVfSU5UNjQsIHApOworICAgICAgICAgICAgd19sb25nNjQoeCwgcCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQogI2VuZGlmCi0JCQl7Ci0JCQl3X2J5dGUoVFlQRV9JTlQsIHApOwotCQkJd19sb25nKHgsIHApOwotCQl9Ci0JfQotCWVsc2UgaWYgKFB5TG9uZ19DaGVja0V4YWN0KHYpKSB7Ci0JCVB5TG9uZ09iamVjdCAqb2IgPSAoUHlMb25nT2JqZWN0ICopdjsKLQkJd19ieXRlKFRZUEVfTE9ORywgcCk7Ci0JCW4gPSBvYi0+b2Jfc2l6ZTsKLQkJd19sb25nKChsb25nKW4sIHApOwotCQlpZiAobiA8IDApCi0JCQluID0gLW47Ci0JCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspCi0JCQl3X3Nob3J0KG9iLT5vYl9kaWdpdFtpXSwgcCk7Ci0JfQotCWVsc2UgaWYgKFB5RmxvYXRfQ2hlY2tFeGFjdCh2KSkgewotCQlpZiAocC0+dmVyc2lvbiA+IDEpIHsKLQkJCXVuc2lnbmVkIGNoYXIgYnVmWzhdOwotCQkJaWYgKF9QeUZsb2F0X1BhY2s4KFB5RmxvYXRfQXNEb3VibGUodiksIAotCQkJCQkgICBidWYsIDEpIDwgMCkgewotCQkJCXAtPmVycm9yID0gMTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQl3X2J5dGUoVFlQRV9CSU5BUllfRkxPQVQsIHApOwotCQkJd19zdHJpbmcoKGNoYXIqKWJ1ZiwgOCwgcCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQljaGFyIGJ1ZlsyNTZdOyAvKiBQbGVudHkgdG8gZm9ybWF0IGFueSBkb3VibGUgKi8KLQkJCVB5RmxvYXRfQXNSZXByU3RyaW5nKGJ1ZiwgKFB5RmxvYXRPYmplY3QgKil2KTsKLQkJCW4gPSBzdHJsZW4oYnVmKTsKLQkJCXdfYnl0ZShUWVBFX0ZMT0FULCBwKTsKLQkJCXdfYnl0ZSgoaW50KW4sIHApOwotCQkJd19zdHJpbmcoYnVmLCAoaW50KW4sIHApOwotCQl9Ci0JfQorICAgICAgICAgICAgeworICAgICAgICAgICAgd19ieXRlKFRZUEVfSU5ULCBwKTsKKyAgICAgICAgICAgIHdfbG9uZyh4LCBwKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChQeUxvbmdfQ2hlY2tFeGFjdCh2KSkgeworICAgICAgICBQeUxvbmdPYmplY3QgKm9iID0gKFB5TG9uZ09iamVjdCAqKXY7CisgICAgICAgIHdfYnl0ZShUWVBFX0xPTkcsIHApOworICAgICAgICBuID0gb2ItPm9iX3NpemU7CisgICAgICAgIHdfbG9uZygobG9uZyluLCBwKTsKKyAgICAgICAgaWYgKG4gPCAwKQorICAgICAgICAgICAgbiA9IC1uOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorICAgICAgICAgICAgd19zaG9ydChvYi0+b2JfZGlnaXRbaV0sIHApOworICAgIH0KKyAgICBlbHNlIGlmIChQeUZsb2F0X0NoZWNrRXhhY3QodikpIHsKKyAgICAgICAgaWYgKHAtPnZlcnNpb24gPiAxKSB7CisgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGJ1Zls4XTsKKyAgICAgICAgICAgIGlmIChfUHlGbG9hdF9QYWNrOChQeUZsb2F0X0FzRG91YmxlKHYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiwgMSkgPCAwKSB7CisgICAgICAgICAgICAgICAgcC0+ZXJyb3IgPSAxOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdfYnl0ZShUWVBFX0JJTkFSWV9GTE9BVCwgcCk7CisgICAgICAgICAgICB3X3N0cmluZygoY2hhciopYnVmLCA4LCBwKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGNoYXIgYnVmWzI1Nl07IC8qIFBsZW50eSB0byBmb3JtYXQgYW55IGRvdWJsZSAqLworICAgICAgICAgICAgUHlGbG9hdF9Bc1JlcHJTdHJpbmcoYnVmLCAoUHlGbG9hdE9iamVjdCAqKXYpOworICAgICAgICAgICAgbiA9IHN0cmxlbihidWYpOworICAgICAgICAgICAgd19ieXRlKFRZUEVfRkxPQVQsIHApOworICAgICAgICAgICAgd19ieXRlKChpbnQpbiwgcCk7CisgICAgICAgICAgICB3X3N0cmluZyhidWYsIChpbnQpbiwgcCk7CisgICAgICAgIH0KKyAgICB9CiAjaWZuZGVmIFdJVEhPVVRfQ09NUExFWAotCWVsc2UgaWYgKFB5Q29tcGxleF9DaGVja0V4YWN0KHYpKSB7Ci0JCWlmIChwLT52ZXJzaW9uID4gMSkgewotCQkJdW5zaWduZWQgY2hhciBidWZbOF07Ci0JCQlpZiAoX1B5RmxvYXRfUGFjazgoUHlDb21wbGV4X1JlYWxBc0RvdWJsZSh2KSwKLQkJCQkJICAgYnVmLCAxKSA8IDApIHsKLQkJCQlwLT5lcnJvciA9IDE7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJd19ieXRlKFRZUEVfQklOQVJZX0NPTVBMRVgsIHApOwotCQkJd19zdHJpbmcoKGNoYXIqKWJ1ZiwgOCwgcCk7Ci0JCQlpZiAoX1B5RmxvYXRfUGFjazgoUHlDb21wbGV4X0ltYWdBc0RvdWJsZSh2KSwgCi0JCQkJCSAgIGJ1ZiwgMSkgPCAwKSB7Ci0JCQkJcC0+ZXJyb3IgPSAxOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCXdfc3RyaW5nKChjaGFyKilidWYsIDgsIHApOwotCQl9Ci0JCWVsc2UgewotCQkJY2hhciBidWZbMjU2XTsgLyogUGxlbnR5IHRvIGZvcm1hdCBhbnkgZG91YmxlICovCi0JCQlQeUZsb2F0T2JqZWN0ICp0ZW1wOwotCQkJd19ieXRlKFRZUEVfQ09NUExFWCwgcCk7Ci0JCQl0ZW1wID0gKFB5RmxvYXRPYmplY3QqKVB5RmxvYXRfRnJvbURvdWJsZSgKLQkJCQlQeUNvbXBsZXhfUmVhbEFzRG91YmxlKHYpKTsKLQkJCWlmICghdGVtcCkgewotCQkJCXAtPmVycm9yID0gMTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlQeUZsb2F0X0FzUmVwclN0cmluZyhidWYsIHRlbXApOwotCQkJUHlfREVDUkVGKHRlbXApOwotCQkJbiA9IHN0cmxlbihidWYpOwotCQkJd19ieXRlKChpbnQpbiwgcCk7Ci0JCQl3X3N0cmluZyhidWYsIChpbnQpbiwgcCk7Ci0JCQl0ZW1wID0gKFB5RmxvYXRPYmplY3QqKVB5RmxvYXRfRnJvbURvdWJsZSgKLQkJCQlQeUNvbXBsZXhfSW1hZ0FzRG91YmxlKHYpKTsKLQkJCWlmICghdGVtcCkgewotCQkJCXAtPmVycm9yID0gMTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlQeUZsb2F0X0FzUmVwclN0cmluZyhidWYsIHRlbXApOwotCQkJUHlfREVDUkVGKHRlbXApOwotCQkJbiA9IHN0cmxlbihidWYpOwotCQkJd19ieXRlKChpbnQpbiwgcCk7Ci0JCQl3X3N0cmluZyhidWYsIChpbnQpbiwgcCk7Ci0JCX0KLQl9CisgICAgZWxzZSBpZiAoUHlDb21wbGV4X0NoZWNrRXhhY3QodikpIHsKKyAgICAgICAgaWYgKHAtPnZlcnNpb24gPiAxKSB7CisgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGJ1Zls4XTsKKyAgICAgICAgICAgIGlmIChfUHlGbG9hdF9QYWNrOChQeUNvbXBsZXhfUmVhbEFzRG91YmxlKHYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiwgMSkgPCAwKSB7CisgICAgICAgICAgICAgICAgcC0+ZXJyb3IgPSAxOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdfYnl0ZShUWVBFX0JJTkFSWV9DT01QTEVYLCBwKTsKKyAgICAgICAgICAgIHdfc3RyaW5nKChjaGFyKilidWYsIDgsIHApOworICAgICAgICAgICAgaWYgKF9QeUZsb2F0X1BhY2s4KFB5Q29tcGxleF9JbWFnQXNEb3VibGUodiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmLCAxKSA8IDApIHsKKyAgICAgICAgICAgICAgICBwLT5lcnJvciA9IDE7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd19zdHJpbmcoKGNoYXIqKWJ1ZiwgOCwgcCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBjaGFyIGJ1ZlsyNTZdOyAvKiBQbGVudHkgdG8gZm9ybWF0IGFueSBkb3VibGUgKi8KKyAgICAgICAgICAgIFB5RmxvYXRPYmplY3QgKnRlbXA7CisgICAgICAgICAgICB3X2J5dGUoVFlQRV9DT01QTEVYLCBwKTsKKyAgICAgICAgICAgIHRlbXAgPSAoUHlGbG9hdE9iamVjdCopUHlGbG9hdF9Gcm9tRG91YmxlKAorICAgICAgICAgICAgICAgIFB5Q29tcGxleF9SZWFsQXNEb3VibGUodikpOworICAgICAgICAgICAgaWYgKCF0ZW1wKSB7CisgICAgICAgICAgICAgICAgcC0+ZXJyb3IgPSAxOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5RmxvYXRfQXNSZXByU3RyaW5nKGJ1ZiwgdGVtcCk7CisgICAgICAgICAgICBQeV9ERUNSRUYodGVtcCk7CisgICAgICAgICAgICBuID0gc3RybGVuKGJ1Zik7CisgICAgICAgICAgICB3X2J5dGUoKGludCluLCBwKTsKKyAgICAgICAgICAgIHdfc3RyaW5nKGJ1ZiwgKGludCluLCBwKTsKKyAgICAgICAgICAgIHRlbXAgPSAoUHlGbG9hdE9iamVjdCopUHlGbG9hdF9Gcm9tRG91YmxlKAorICAgICAgICAgICAgICAgIFB5Q29tcGxleF9JbWFnQXNEb3VibGUodikpOworICAgICAgICAgICAgaWYgKCF0ZW1wKSB7CisgICAgICAgICAgICAgICAgcC0+ZXJyb3IgPSAxOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5RmxvYXRfQXNSZXByU3RyaW5nKGJ1ZiwgdGVtcCk7CisgICAgICAgICAgICBQeV9ERUNSRUYodGVtcCk7CisgICAgICAgICAgICBuID0gc3RybGVuKGJ1Zik7CisgICAgICAgICAgICB3X2J5dGUoKGludCluLCBwKTsKKyAgICAgICAgICAgIHdfc3RyaW5nKGJ1ZiwgKGludCluLCBwKTsKKyAgICAgICAgfQorICAgIH0KICNlbmRpZgotCWVsc2UgaWYgKFB5U3RyaW5nX0NoZWNrRXhhY3QodikpIHsKLQkJaWYgKHAtPnN0cmluZ3MgJiYgUHlTdHJpbmdfQ0hFQ0tfSU5URVJORUQodikpIHsKLQkJCVB5T2JqZWN0ICpvID0gUHlEaWN0X0dldEl0ZW0ocC0+c3RyaW5ncywgdik7Ci0JCQlpZiAobykgewotCQkJCWxvbmcgdyA9IFB5SW50X0FzTG9uZyhvKTsKLQkJCQl3X2J5dGUoVFlQRV9TVFJJTkdSRUYsIHApOwotCQkJCXdfbG9uZyh3LCBwKTsKLQkJCQlnb3RvIGV4aXQ7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpbnQgb2s7Ci0JCQkJbyA9IFB5SW50X0Zyb21Tc2l6ZV90KFB5RGljdF9TaXplKHAtPnN0cmluZ3MpKTsKLQkJCQlvayA9IG8gJiYKLQkJCQkgICAgIFB5RGljdF9TZXRJdGVtKHAtPnN0cmluZ3MsIHYsIG8pID49IDA7Ci0JCQkJUHlfWERFQ1JFRihvKTsKLQkJCQlpZiAoIW9rKSB7Ci0JCQkJCXAtPmRlcHRoLS07Ci0JCQkJCXAtPmVycm9yID0gMTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQl3X2J5dGUoVFlQRV9JTlRFUk5FRCwgcCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQl3X2J5dGUoVFlQRV9TVFJJTkcsIHApOwotCQl9Ci0JCW4gPSBQeVN0cmluZ19HRVRfU0laRSh2KTsKLQkJaWYgKG4gPiBJTlRfTUFYKSB7Ci0JCQkvKiBodWdlIHN0cmluZ3MgYXJlIG5vdCBzdXBwb3J0ZWQgKi8KLQkJCXAtPmRlcHRoLS07Ci0JCQlwLT5lcnJvciA9IDE7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJd19sb25nKChsb25nKW4sIHApOwotCQl3X3N0cmluZyhQeVN0cmluZ19BU19TVFJJTkcodiksIChpbnQpbiwgcCk7Ci0JfQorICAgIGVsc2UgaWYgKFB5U3RyaW5nX0NoZWNrRXhhY3QodikpIHsKKyAgICAgICAgaWYgKHAtPnN0cmluZ3MgJiYgUHlTdHJpbmdfQ0hFQ0tfSU5URVJORUQodikpIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpvID0gUHlEaWN0X0dldEl0ZW0ocC0+c3RyaW5ncywgdik7CisgICAgICAgICAgICBpZiAobykgeworICAgICAgICAgICAgICAgIGxvbmcgdyA9IFB5SW50X0FzTG9uZyhvKTsKKyAgICAgICAgICAgICAgICB3X2J5dGUoVFlQRV9TVFJJTkdSRUYsIHApOworICAgICAgICAgICAgICAgIHdfbG9uZyh3LCBwKTsKKyAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnQgb2s7CisgICAgICAgICAgICAgICAgbyA9IFB5SW50X0Zyb21Tc2l6ZV90KFB5RGljdF9TaXplKHAtPnN0cmluZ3MpKTsKKyAgICAgICAgICAgICAgICBvayA9IG8gJiYKKyAgICAgICAgICAgICAgICAgICAgIFB5RGljdF9TZXRJdGVtKHAtPnN0cmluZ3MsIHYsIG8pID49IDA7CisgICAgICAgICAgICAgICAgUHlfWERFQ1JFRihvKTsKKyAgICAgICAgICAgICAgICBpZiAoIW9rKSB7CisgICAgICAgICAgICAgICAgICAgIHAtPmRlcHRoLS07CisgICAgICAgICAgICAgICAgICAgIHAtPmVycm9yID0gMTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3X2J5dGUoVFlQRV9JTlRFUk5FRCwgcCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICB3X2J5dGUoVFlQRV9TVFJJTkcsIHApOworICAgICAgICB9CisgICAgICAgIG4gPSBQeVN0cmluZ19HRVRfU0laRSh2KTsKKyAgICAgICAgaWYgKG4gPiBJTlRfTUFYKSB7CisgICAgICAgICAgICAvKiBodWdlIHN0cmluZ3MgYXJlIG5vdCBzdXBwb3J0ZWQgKi8KKyAgICAgICAgICAgIHAtPmRlcHRoLS07CisgICAgICAgICAgICBwLT5lcnJvciA9IDE7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgd19sb25nKChsb25nKW4sIHApOworICAgICAgICB3X3N0cmluZyhQeVN0cmluZ19BU19TVFJJTkcodiksIChpbnQpbiwgcCk7CisgICAgfQogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQllbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2tFeGFjdCh2KSkgewotCSAgICAgICAgUHlPYmplY3QgKnV0Zjg7Ci0JCXV0ZjggPSBQeVVuaWNvZGVfQXNVVEY4U3RyaW5nKHYpOwotCQlpZiAodXRmOCA9PSBOVUxMKSB7Ci0JCQlwLT5kZXB0aC0tOwotCQkJcC0+ZXJyb3IgPSAxOwotCQkJcmV0dXJuOwotCQl9Ci0JCXdfYnl0ZShUWVBFX1VOSUNPREUsIHApOwotCQluID0gUHlTdHJpbmdfR0VUX1NJWkUodXRmOCk7Ci0JCWlmIChuID4gSU5UX01BWCkgewotCQkJcC0+ZGVwdGgtLTsKLQkJCXAtPmVycm9yID0gMTsKLQkJCXJldHVybjsKLQkJfQotCQl3X2xvbmcoKGxvbmcpbiwgcCk7Ci0JCXdfc3RyaW5nKFB5U3RyaW5nX0FTX1NUUklORyh1dGY4KSwgKGludCluLCBwKTsKLQkJUHlfREVDUkVGKHV0ZjgpOwotCX0KKyAgICBlbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2tFeGFjdCh2KSkgeworICAgICAgICBQeU9iamVjdCAqdXRmODsKKyAgICAgICAgdXRmOCA9IFB5VW5pY29kZV9Bc1VURjhTdHJpbmcodik7CisgICAgICAgIGlmICh1dGY4ID09IE5VTEwpIHsKKyAgICAgICAgICAgIHAtPmRlcHRoLS07CisgICAgICAgICAgICBwLT5lcnJvciA9IDE7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgd19ieXRlKFRZUEVfVU5JQ09ERSwgcCk7CisgICAgICAgIG4gPSBQeVN0cmluZ19HRVRfU0laRSh1dGY4KTsKKyAgICAgICAgaWYgKG4gPiBJTlRfTUFYKSB7CisgICAgICAgICAgICBwLT5kZXB0aC0tOworICAgICAgICAgICAgcC0+ZXJyb3IgPSAxOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHdfbG9uZygobG9uZyluLCBwKTsKKyAgICAgICAgd19zdHJpbmcoUHlTdHJpbmdfQVNfU1RSSU5HKHV0ZjgpLCAoaW50KW4sIHApOworICAgICAgICBQeV9ERUNSRUYodXRmOCk7CisgICAgfQogI2VuZGlmCi0JZWxzZSBpZiAoUHlUdXBsZV9DaGVja0V4YWN0KHYpKSB7Ci0JCXdfYnl0ZShUWVBFX1RVUExFLCBwKTsKLQkJbiA9IFB5VHVwbGVfU2l6ZSh2KTsKLQkJd19sb25nKChsb25nKW4sIHApOwotCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCQl3X29iamVjdChQeVR1cGxlX0dFVF9JVEVNKHYsIGkpLCBwKTsKLQkJfQotCX0KLQllbHNlIGlmIChQeUxpc3RfQ2hlY2tFeGFjdCh2KSkgewotCQl3X2J5dGUoVFlQRV9MSVNULCBwKTsKLQkJbiA9IFB5TGlzdF9HRVRfU0laRSh2KTsKLQkJd19sb25nKChsb25nKW4sIHApOwotCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCQl3X29iamVjdChQeUxpc3RfR0VUX0lURU0odiwgaSksIHApOwotCQl9Ci0JfQotCWVsc2UgaWYgKFB5RGljdF9DaGVja0V4YWN0KHYpKSB7Ci0JCVB5X3NzaXplX3QgcG9zOwotCQlQeU9iamVjdCAqa2V5LCAqdmFsdWU7Ci0JCXdfYnl0ZShUWVBFX0RJQ1QsIHApOwotCQkvKiBUaGlzIG9uZSBpcyBOVUxMIG9iamVjdCB0ZXJtaW5hdGVkISAqLwotCQlwb3MgPSAwOwotCQl3aGlsZSAoUHlEaWN0X05leHQodiwgJnBvcywgJmtleSwgJnZhbHVlKSkgewotCQkJd19vYmplY3Qoa2V5LCBwKTsKLQkJCXdfb2JqZWN0KHZhbHVlLCBwKTsKLQkJfQotCQl3X29iamVjdCgoUHlPYmplY3QgKilOVUxMLCBwKTsKLQl9Ci0JZWxzZSBpZiAoUHlBbnlTZXRfQ2hlY2tFeGFjdCh2KSkgewotCQlQeU9iamVjdCAqdmFsdWUsICppdDsKKyAgICBlbHNlIGlmIChQeVR1cGxlX0NoZWNrRXhhY3QodikpIHsKKyAgICAgICAgd19ieXRlKFRZUEVfVFVQTEUsIHApOworICAgICAgICBuID0gUHlUdXBsZV9TaXplKHYpOworICAgICAgICB3X2xvbmcoKGxvbmcpbiwgcCk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICAgIHdfb2JqZWN0KFB5VHVwbGVfR0VUX0lURU0odiwgaSksIHApOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKFB5TGlzdF9DaGVja0V4YWN0KHYpKSB7CisgICAgICAgIHdfYnl0ZShUWVBFX0xJU1QsIHApOworICAgICAgICBuID0gUHlMaXN0X0dFVF9TSVpFKHYpOworICAgICAgICB3X2xvbmcoKGxvbmcpbiwgcCk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICAgIHdfb2JqZWN0KFB5TGlzdF9HRVRfSVRFTSh2LCBpKSwgcCk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoUHlEaWN0X0NoZWNrRXhhY3QodikpIHsKKyAgICAgICAgUHlfc3NpemVfdCBwb3M7CisgICAgICAgIFB5T2JqZWN0ICprZXksICp2YWx1ZTsKKyAgICAgICAgd19ieXRlKFRZUEVfRElDVCwgcCk7CisgICAgICAgIC8qIFRoaXMgb25lIGlzIE5VTEwgb2JqZWN0IHRlcm1pbmF0ZWQhICovCisgICAgICAgIHBvcyA9IDA7CisgICAgICAgIHdoaWxlIChQeURpY3RfTmV4dCh2LCAmcG9zLCAma2V5LCAmdmFsdWUpKSB7CisgICAgICAgICAgICB3X29iamVjdChrZXksIHApOworICAgICAgICAgICAgd19vYmplY3QodmFsdWUsIHApOworICAgICAgICB9CisgICAgICAgIHdfb2JqZWN0KChQeU9iamVjdCAqKU5VTEwsIHApOworICAgIH0KKyAgICBlbHNlIGlmIChQeUFueVNldF9DaGVja0V4YWN0KHYpKSB7CisgICAgICAgIFB5T2JqZWN0ICp2YWx1ZSwgKml0OwogCi0JCWlmIChQeU9iamVjdF9UeXBlQ2hlY2sodiwgJlB5U2V0X1R5cGUpKQotCQkJd19ieXRlKFRZUEVfU0VULCBwKTsKLQkJZWxzZQotCQkJd19ieXRlKFRZUEVfRlJPWkVOU0VULCBwKTsKLQkJbiA9IFB5T2JqZWN0X1NpemUodik7Ci0JCWlmIChuID09IC0xKSB7Ci0JCQlwLT5kZXB0aC0tOwotCQkJcC0+ZXJyb3IgPSAxOwotCQkJcmV0dXJuOwotCQl9Ci0JCXdfbG9uZygobG9uZyluLCBwKTsKLQkJaXQgPSBQeU9iamVjdF9HZXRJdGVyKHYpOwotCQlpZiAoaXQgPT0gTlVMTCkgewotCQkJcC0+ZGVwdGgtLTsKLQkJCXAtPmVycm9yID0gMTsKLQkJCXJldHVybjsKLQkJfQotCQl3aGlsZSAoKHZhbHVlID0gUHlJdGVyX05leHQoaXQpKSAhPSBOVUxMKSB7Ci0JCQl3X29iamVjdCh2YWx1ZSwgcCk7Ci0JCQlQeV9ERUNSRUYodmFsdWUpOwotCQl9Ci0JCVB5X0RFQ1JFRihpdCk7Ci0JCWlmIChQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCQlwLT5kZXB0aC0tOwotCQkJcC0+ZXJyb3IgPSAxOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotCWVsc2UgaWYgKFB5Q29kZV9DaGVjayh2KSkgewotCQlQeUNvZGVPYmplY3QgKmNvID0gKFB5Q29kZU9iamVjdCAqKXY7Ci0JCXdfYnl0ZShUWVBFX0NPREUsIHApOwotCQl3X2xvbmcoY28tPmNvX2FyZ2NvdW50LCBwKTsKLQkJd19sb25nKGNvLT5jb19ubG9jYWxzLCBwKTsKLQkJd19sb25nKGNvLT5jb19zdGFja3NpemUsIHApOwotCQl3X2xvbmcoY28tPmNvX2ZsYWdzLCBwKTsKLQkJd19vYmplY3QoY28tPmNvX2NvZGUsIHApOwotCQl3X29iamVjdChjby0+Y29fY29uc3RzLCBwKTsKLQkJd19vYmplY3QoY28tPmNvX25hbWVzLCBwKTsKLQkJd19vYmplY3QoY28tPmNvX3Zhcm5hbWVzLCBwKTsKLQkJd19vYmplY3QoY28tPmNvX2ZyZWV2YXJzLCBwKTsKLQkJd19vYmplY3QoY28tPmNvX2NlbGx2YXJzLCBwKTsKLQkJd19vYmplY3QoY28tPmNvX2ZpbGVuYW1lLCBwKTsKLQkJd19vYmplY3QoY28tPmNvX25hbWUsIHApOwotCQl3X2xvbmcoY28tPmNvX2ZpcnN0bGluZW5vLCBwKTsKLQkJd19vYmplY3QoY28tPmNvX2xub3RhYiwgcCk7Ci0JfQotCWVsc2UgaWYgKFB5T2JqZWN0X0NoZWNrUmVhZEJ1ZmZlcih2KSkgewotCQkvKiBXcml0ZSB1bmtub3duIGJ1ZmZlci1zdHlsZSBvYmplY3RzIGFzIGEgc3RyaW5nICovCi0JCWNoYXIgKnM7Ci0JCVB5QnVmZmVyUHJvY3MgKnBiID0gdi0+b2JfdHlwZS0+dHBfYXNfYnVmZmVyOwotCQl3X2J5dGUoVFlQRV9TVFJJTkcsIHApOwotCQluID0gKCpwYi0+YmZfZ2V0cmVhZGJ1ZmZlcikodiwgMCwgKHZvaWQgKiopJnMpOwotCQlpZiAobiA+IElOVF9NQVgpIHsKLQkJCXAtPmRlcHRoLS07Ci0JCQlwLT5lcnJvciA9IDE7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJd19sb25nKChsb25nKW4sIHApOwotCQl3X3N0cmluZyhzLCAoaW50KW4sIHApOwotCX0KLQllbHNlIHsKLQkJd19ieXRlKFRZUEVfVU5LTk9XTiwgcCk7Ci0JCXAtPmVycm9yID0gMTsKLQl9CisgICAgICAgIGlmIChQeU9iamVjdF9UeXBlQ2hlY2sodiwgJlB5U2V0X1R5cGUpKQorICAgICAgICAgICAgd19ieXRlKFRZUEVfU0VULCBwKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgd19ieXRlKFRZUEVfRlJPWkVOU0VULCBwKTsKKyAgICAgICAgbiA9IFB5T2JqZWN0X1NpemUodik7CisgICAgICAgIGlmIChuID09IC0xKSB7CisgICAgICAgICAgICBwLT5kZXB0aC0tOworICAgICAgICAgICAgcC0+ZXJyb3IgPSAxOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHdfbG9uZygobG9uZyluLCBwKTsKKyAgICAgICAgaXQgPSBQeU9iamVjdF9HZXRJdGVyKHYpOworICAgICAgICBpZiAoaXQgPT0gTlVMTCkgeworICAgICAgICAgICAgcC0+ZGVwdGgtLTsKKyAgICAgICAgICAgIHAtPmVycm9yID0gMTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAoKHZhbHVlID0gUHlJdGVyX05leHQoaXQpKSAhPSBOVUxMKSB7CisgICAgICAgICAgICB3X29iamVjdCh2YWx1ZSwgcCk7CisgICAgICAgICAgICBQeV9ERUNSRUYodmFsdWUpOworICAgICAgICB9CisgICAgICAgIFB5X0RFQ1JFRihpdCk7CisgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgICAgICBwLT5kZXB0aC0tOworICAgICAgICAgICAgcC0+ZXJyb3IgPSAxOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKFB5Q29kZV9DaGVjayh2KSkgeworICAgICAgICBQeUNvZGVPYmplY3QgKmNvID0gKFB5Q29kZU9iamVjdCAqKXY7CisgICAgICAgIHdfYnl0ZShUWVBFX0NPREUsIHApOworICAgICAgICB3X2xvbmcoY28tPmNvX2FyZ2NvdW50LCBwKTsKKyAgICAgICAgd19sb25nKGNvLT5jb19ubG9jYWxzLCBwKTsKKyAgICAgICAgd19sb25nKGNvLT5jb19zdGFja3NpemUsIHApOworICAgICAgICB3X2xvbmcoY28tPmNvX2ZsYWdzLCBwKTsKKyAgICAgICAgd19vYmplY3QoY28tPmNvX2NvZGUsIHApOworICAgICAgICB3X29iamVjdChjby0+Y29fY29uc3RzLCBwKTsKKyAgICAgICAgd19vYmplY3QoY28tPmNvX25hbWVzLCBwKTsKKyAgICAgICAgd19vYmplY3QoY28tPmNvX3Zhcm5hbWVzLCBwKTsKKyAgICAgICAgd19vYmplY3QoY28tPmNvX2ZyZWV2YXJzLCBwKTsKKyAgICAgICAgd19vYmplY3QoY28tPmNvX2NlbGx2YXJzLCBwKTsKKyAgICAgICAgd19vYmplY3QoY28tPmNvX2ZpbGVuYW1lLCBwKTsKKyAgICAgICAgd19vYmplY3QoY28tPmNvX25hbWUsIHApOworICAgICAgICB3X2xvbmcoY28tPmNvX2ZpcnN0bGluZW5vLCBwKTsKKyAgICAgICAgd19vYmplY3QoY28tPmNvX2xub3RhYiwgcCk7CisgICAgfQorICAgIGVsc2UgaWYgKFB5T2JqZWN0X0NoZWNrUmVhZEJ1ZmZlcih2KSkgeworICAgICAgICAvKiBXcml0ZSB1bmtub3duIGJ1ZmZlci1zdHlsZSBvYmplY3RzIGFzIGEgc3RyaW5nICovCisgICAgICAgIGNoYXIgKnM7CisgICAgICAgIFB5QnVmZmVyUHJvY3MgKnBiID0gdi0+b2JfdHlwZS0+dHBfYXNfYnVmZmVyOworICAgICAgICB3X2J5dGUoVFlQRV9TVFJJTkcsIHApOworICAgICAgICBuID0gKCpwYi0+YmZfZ2V0cmVhZGJ1ZmZlcikodiwgMCwgKHZvaWQgKiopJnMpOworICAgICAgICBpZiAobiA+IElOVF9NQVgpIHsKKyAgICAgICAgICAgIHAtPmRlcHRoLS07CisgICAgICAgICAgICBwLT5lcnJvciA9IDE7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgd19sb25nKChsb25nKW4sIHApOworICAgICAgICB3X3N0cmluZyhzLCAoaW50KW4sIHApOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgd19ieXRlKFRZUEVfVU5LTk9XTiwgcCk7CisgICAgICAgIHAtPmVycm9yID0gMTsKKyAgICB9CiAgICBleGl0OgotCXAtPmRlcHRoLS07CisgICAgcC0+ZGVwdGgtLTsKIH0KIAogLyogdmVyc2lvbiBjdXJyZW50bHkgaGFzIG5vIGVmZmVjdCBmb3Igd3JpdGluZyBsb25ncy4gKi8KIHZvaWQKIFB5TWFyc2hhbF9Xcml0ZUxvbmdUb0ZpbGUobG9uZyB4LCBGSUxFICpmcCwgaW50IHZlcnNpb24pCiB7Ci0JV0ZJTEUgd2Y7Ci0Jd2YuZnAgPSBmcDsKLQl3Zi5lcnJvciA9IDA7Ci0Jd2YuZGVwdGggPSAwOwotCXdmLnN0cmluZ3MgPSBOVUxMOwotCXdmLnZlcnNpb24gPSB2ZXJzaW9uOwotCXdfbG9uZyh4LCAmd2YpOworICAgIFdGSUxFIHdmOworICAgIHdmLmZwID0gZnA7CisgICAgd2YuZXJyb3IgPSAwOworICAgIHdmLmRlcHRoID0gMDsKKyAgICB3Zi5zdHJpbmdzID0gTlVMTDsKKyAgICB3Zi52ZXJzaW9uID0gdmVyc2lvbjsKKyAgICB3X2xvbmcoeCwgJndmKTsKIH0KIAogdm9pZAogUHlNYXJzaGFsX1dyaXRlT2JqZWN0VG9GaWxlKFB5T2JqZWN0ICp4LCBGSUxFICpmcCwgaW50IHZlcnNpb24pCiB7Ci0JV0ZJTEUgd2Y7Ci0Jd2YuZnAgPSBmcDsKLQl3Zi5lcnJvciA9IDA7Ci0Jd2YuZGVwdGggPSAwOwotCXdmLnN0cmluZ3MgPSAodmVyc2lvbiA+IDApID8gUHlEaWN0X05ldygpIDogTlVMTDsKLQl3Zi52ZXJzaW9uID0gdmVyc2lvbjsKLQl3X29iamVjdCh4LCAmd2YpOwotCVB5X1hERUNSRUYod2Yuc3RyaW5ncyk7CisgICAgV0ZJTEUgd2Y7CisgICAgd2YuZnAgPSBmcDsKKyAgICB3Zi5lcnJvciA9IDA7CisgICAgd2YuZGVwdGggPSAwOworICAgIHdmLnN0cmluZ3MgPSAodmVyc2lvbiA+IDApID8gUHlEaWN0X05ldygpIDogTlVMTDsKKyAgICB3Zi52ZXJzaW9uID0gdmVyc2lvbjsKKyAgICB3X29iamVjdCh4LCAmd2YpOworICAgIFB5X1hERUNSRUYod2Yuc3RyaW5ncyk7CiB9CiAKIHR5cGVkZWYgV0ZJTEUgUkZJTEU7IC8qIFNhbWUgc3RydWN0IHdpdGggZGlmZmVyZW50IGludmFyaWFudHMgKi8KQEAgLTQzMCw0OSArNDMwLDQ5IEBACiBzdGF0aWMgaW50CiByX3N0cmluZyhjaGFyICpzLCBpbnQgbiwgUkZJTEUgKnApCiB7Ci0JaWYgKHAtPmZwICE9IE5VTEwpCi0JCS8qIFRoZSByZXN1bHQgZml0cyBpbnRvIGludCBiZWNhdXNlIGl0IG11c3QgYmUgPD1uLiAqLwotCQlyZXR1cm4gKGludClmcmVhZChzLCAxLCBuLCBwLT5mcCk7Ci0JaWYgKHAtPmVuZCAtIHAtPnB0ciA8IG4pCi0JCW4gPSAoaW50KShwLT5lbmQgLSBwLT5wdHIpOwotCW1lbWNweShzLCBwLT5wdHIsIG4pOwotCXAtPnB0ciArPSBuOwotCXJldHVybiBuOworICAgIGlmIChwLT5mcCAhPSBOVUxMKQorICAgICAgICAvKiBUaGUgcmVzdWx0IGZpdHMgaW50byBpbnQgYmVjYXVzZSBpdCBtdXN0IGJlIDw9bi4gKi8KKyAgICAgICAgcmV0dXJuIChpbnQpZnJlYWQocywgMSwgbiwgcC0+ZnApOworICAgIGlmIChwLT5lbmQgLSBwLT5wdHIgPCBuKQorICAgICAgICBuID0gKGludCkocC0+ZW5kIC0gcC0+cHRyKTsKKyAgICBtZW1jcHkocywgcC0+cHRyLCBuKTsKKyAgICBwLT5wdHIgKz0gbjsKKyAgICByZXR1cm4gbjsKIH0KIAogc3RhdGljIGludAogcl9zaG9ydChSRklMRSAqcCkKIHsKLQlyZWdpc3RlciBzaG9ydCB4OwotCXggPSByX2J5dGUocCk7Ci0JeCB8PSByX2J5dGUocCkgPDwgODsKLQkvKiBTaWduLWV4dGVuc2lvbiwgaW4gY2FzZSBzaG9ydCBncmVhdGVyIHRoYW4gMTYgYml0cyAqLwotCXggfD0gLSh4ICYgMHg4MDAwKTsKLQlyZXR1cm4geDsKKyAgICByZWdpc3RlciBzaG9ydCB4OworICAgIHggPSByX2J5dGUocCk7CisgICAgeCB8PSByX2J5dGUocCkgPDwgODsKKyAgICAvKiBTaWduLWV4dGVuc2lvbiwgaW4gY2FzZSBzaG9ydCBncmVhdGVyIHRoYW4gMTYgYml0cyAqLworICAgIHggfD0gLSh4ICYgMHg4MDAwKTsKKyAgICByZXR1cm4geDsKIH0KIAogc3RhdGljIGxvbmcKIHJfbG9uZyhSRklMRSAqcCkKIHsKLQlyZWdpc3RlciBsb25nIHg7Ci0JcmVnaXN0ZXIgRklMRSAqZnAgPSBwLT5mcDsKLQlpZiAoZnApIHsKLQkJeCA9IGdldGMoZnApOwotCQl4IHw9IChsb25nKWdldGMoZnApIDw8IDg7Ci0JCXggfD0gKGxvbmcpZ2V0YyhmcCkgPDwgMTY7Ci0JCXggfD0gKGxvbmcpZ2V0YyhmcCkgPDwgMjQ7Ci0JfQotCWVsc2UgewotCQl4ID0gcnNfYnl0ZShwKTsKLQkJeCB8PSAobG9uZylyc19ieXRlKHApIDw8IDg7Ci0JCXggfD0gKGxvbmcpcnNfYnl0ZShwKSA8PCAxNjsKLQkJeCB8PSAobG9uZylyc19ieXRlKHApIDw8IDI0OwotCX0KKyAgICByZWdpc3RlciBsb25nIHg7CisgICAgcmVnaXN0ZXIgRklMRSAqZnAgPSBwLT5mcDsKKyAgICBpZiAoZnApIHsKKyAgICAgICAgeCA9IGdldGMoZnApOworICAgICAgICB4IHw9IChsb25nKWdldGMoZnApIDw8IDg7CisgICAgICAgIHggfD0gKGxvbmcpZ2V0YyhmcCkgPDwgMTY7CisgICAgICAgIHggfD0gKGxvbmcpZ2V0YyhmcCkgPDwgMjQ7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICB4ID0gcnNfYnl0ZShwKTsKKyAgICAgICAgeCB8PSAobG9uZylyc19ieXRlKHApIDw8IDg7CisgICAgICAgIHggfD0gKGxvbmcpcnNfYnl0ZShwKSA8PCAxNjsKKyAgICAgICAgeCB8PSAobG9uZylyc19ieXRlKHApIDw8IDI0OworICAgIH0KICNpZiBTSVpFT0ZfTE9ORyA+IDQKLQkvKiBTaWduIGV4dGVuc2lvbiBmb3IgNjQtYml0IG1hY2hpbmVzICovCi0JeCB8PSAtKHggJiAweDgwMDAwMDAwTCk7CisgICAgLyogU2lnbiBleHRlbnNpb24gZm9yIDY0LWJpdCBtYWNoaW5lcyAqLworICAgIHggfD0gLSh4ICYgMHg4MDAwMDAwMEwpOwogI2VuZGlmCi0JcmV0dXJuIHg7CisgICAgcmV0dXJuIHg7CiB9CiAKIC8qIHJfbG9uZzY0IGRlYWxzIHdpdGggdGhlIFRZUEVfSU5UNjQgY29kZS4gIE9uIGEgbWFjaGluZSB3aXRoCkBAIC00ODUsNTM3ICs0ODUsNTM3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogcl9sb25nNjQoUkZJTEUgKnApCiB7Ci0JbG9uZyBsbzQgPSByX2xvbmcocCk7Ci0JbG9uZyBoaTQgPSByX2xvbmcocCk7CisgICAgbG9uZyBsbzQgPSByX2xvbmcocCk7CisgICAgbG9uZyBoaTQgPSByX2xvbmcocCk7CiAjaWYgU0laRU9GX0xPTkcgPiA0Ci0JbG9uZyB4ID0gKGhpNCA8PCAzMikgfCAobG80ICYgMHhGRkZGRkZGRkwpOwotCXJldHVybiBQeUludF9Gcm9tTG9uZyh4KTsKKyAgICBsb25nIHggPSAoaGk0IDw8IDMyKSB8IChsbzQgJiAweEZGRkZGRkZGTCk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHgpOwogI2Vsc2UKLQl1bnNpZ25lZCBjaGFyIGJ1Zls4XTsKLQlpbnQgb25lID0gMTsKLQlpbnQgaXNfbGl0dGxlX2VuZGlhbiA9IChpbnQpKihjaGFyKikmb25lOwotCWlmIChpc19saXR0bGVfZW5kaWFuKSB7Ci0JCW1lbWNweShidWYsICZsbzQsIDQpOwotCQltZW1jcHkoYnVmKzQsICZoaTQsIDQpOwotCX0KLQllbHNlIHsKLQkJbWVtY3B5KGJ1ZiwgJmhpNCwgNCk7Ci0JCW1lbWNweShidWYrNCwgJmxvNCwgNCk7Ci0JfQotCXJldHVybiBfUHlMb25nX0Zyb21CeXRlQXJyYXkoYnVmLCA4LCBpc19saXR0bGVfZW5kaWFuLCAxKTsKKyAgICB1bnNpZ25lZCBjaGFyIGJ1Zls4XTsKKyAgICBpbnQgb25lID0gMTsKKyAgICBpbnQgaXNfbGl0dGxlX2VuZGlhbiA9IChpbnQpKihjaGFyKikmb25lOworICAgIGlmIChpc19saXR0bGVfZW5kaWFuKSB7CisgICAgICAgIG1lbWNweShidWYsICZsbzQsIDQpOworICAgICAgICBtZW1jcHkoYnVmKzQsICZoaTQsIDQpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgbWVtY3B5KGJ1ZiwgJmhpNCwgNCk7CisgICAgICAgIG1lbWNweShidWYrNCwgJmxvNCwgNCk7CisgICAgfQorICAgIHJldHVybiBfUHlMb25nX0Zyb21CeXRlQXJyYXkoYnVmLCA4LCBpc19saXR0bGVfZW5kaWFuLCAxKTsKICNlbmRpZgogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogcl9vYmplY3QoUkZJTEUgKnApCiB7Ci0JLyogTlVMTCBpcyBhIHZhbGlkIHJldHVybiB2YWx1ZSwgaXQgZG9lcyBub3QgbmVjZXNzYXJpbHkgbWVhbnMgdGhhdAotCSAgIGFuIGV4Y2VwdGlvbiBpcyBzZXQuICovCi0JUHlPYmplY3QgKnYsICp2MjsKLQlsb25nIGksIG47Ci0JaW50IHR5cGUgPSByX2J5dGUocCk7Ci0JUHlPYmplY3QgKnJldHZhbDsKKyAgICAvKiBOVUxMIGlzIGEgdmFsaWQgcmV0dXJuIHZhbHVlLCBpdCBkb2VzIG5vdCBuZWNlc3NhcmlseSBtZWFucyB0aGF0CisgICAgICAgYW4gZXhjZXB0aW9uIGlzIHNldC4gKi8KKyAgICBQeU9iamVjdCAqdiwgKnYyOworICAgIGxvbmcgaSwgbjsKKyAgICBpbnQgdHlwZSA9IHJfYnl0ZShwKTsKKyAgICBQeU9iamVjdCAqcmV0dmFsOwogCi0JcC0+ZGVwdGgrKzsKKyAgICBwLT5kZXB0aCsrOwogCi0JaWYgKHAtPmRlcHRoID4gTUFYX01BUlNIQUxfU1RBQ0tfREVQVEgpIHsKLQkJcC0+ZGVwdGgtLTsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJyZWN1cnNpb24gbGltaXQgZXhjZWVkZWQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChwLT5kZXB0aCA+IE1BWF9NQVJTSEFMX1NUQUNLX0RFUFRIKSB7CisgICAgICAgIHAtPmRlcHRoLS07CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAicmVjdXJzaW9uIGxpbWl0IGV4Y2VlZGVkIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXN3aXRjaCAodHlwZSkgeworICAgIHN3aXRjaCAodHlwZSkgewogCi0JY2FzZSBFT0Y6Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19FT0ZFcnJvciwKLQkJCQkiRU9GIHJlYWQgd2hlcmUgb2JqZWN0IGV4cGVjdGVkIik7Ci0JCXJldHZhbCA9IE5VTEw7Ci0JCWJyZWFrOworICAgIGNhc2UgRU9GOgorICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfRU9GRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiRU9GIHJlYWQgd2hlcmUgb2JqZWN0IGV4cGVjdGVkIik7CisgICAgICAgIHJldHZhbCA9IE5VTEw7CisgICAgICAgIGJyZWFrOwogCi0JY2FzZSBUWVBFX05VTEw6Ci0JCXJldHZhbCA9IE5VTEw7Ci0JCWJyZWFrOworICAgIGNhc2UgVFlQRV9OVUxMOgorICAgICAgICByZXR2YWwgPSBOVUxMOworICAgICAgICBicmVhazsKIAotCWNhc2UgVFlQRV9OT05FOgotCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCXJldHZhbCA9IFB5X05vbmU7Ci0JCWJyZWFrOworICAgIGNhc2UgVFlQRV9OT05FOgorICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIHJldHZhbCA9IFB5X05vbmU7CisgICAgICAgIGJyZWFrOwogCi0JY2FzZSBUWVBFX1NUT1BJVEVSOgotCQlQeV9JTkNSRUYoUHlFeGNfU3RvcEl0ZXJhdGlvbik7Ci0JCXJldHZhbCA9IFB5RXhjX1N0b3BJdGVyYXRpb247Ci0JCWJyZWFrOworICAgIGNhc2UgVFlQRV9TVE9QSVRFUjoKKyAgICAgICAgUHlfSU5DUkVGKFB5RXhjX1N0b3BJdGVyYXRpb24pOworICAgICAgICByZXR2YWwgPSBQeUV4Y19TdG9wSXRlcmF0aW9uOworICAgICAgICBicmVhazsKIAotCWNhc2UgVFlQRV9FTExJUFNJUzoKLQkJUHlfSU5DUkVGKFB5X0VsbGlwc2lzKTsKLQkJcmV0dmFsID0gUHlfRWxsaXBzaXM7Ci0JCWJyZWFrOworICAgIGNhc2UgVFlQRV9FTExJUFNJUzoKKyAgICAgICAgUHlfSU5DUkVGKFB5X0VsbGlwc2lzKTsKKyAgICAgICAgcmV0dmFsID0gUHlfRWxsaXBzaXM7CisgICAgICAgIGJyZWFrOwogCi0JY2FzZSBUWVBFX0ZBTFNFOgotCQlQeV9JTkNSRUYoUHlfRmFsc2UpOwotCQlyZXR2YWwgPSBQeV9GYWxzZTsKLQkJYnJlYWs7CisgICAgY2FzZSBUWVBFX0ZBTFNFOgorICAgICAgICBQeV9JTkNSRUYoUHlfRmFsc2UpOworICAgICAgICByZXR2YWwgPSBQeV9GYWxzZTsKKyAgICAgICAgYnJlYWs7CiAKLQljYXNlIFRZUEVfVFJVRToKLQkJUHlfSU5DUkVGKFB5X1RydWUpOwotCQlyZXR2YWwgPSBQeV9UcnVlOwotCQlicmVhazsKKyAgICBjYXNlIFRZUEVfVFJVRToKKyAgICAgICAgUHlfSU5DUkVGKFB5X1RydWUpOworICAgICAgICByZXR2YWwgPSBQeV9UcnVlOworICAgICAgICBicmVhazsKIAotCWNhc2UgVFlQRV9JTlQ6Ci0JCXJldHZhbCA9IFB5SW50X0Zyb21Mb25nKHJfbG9uZyhwKSk7Ci0JCWJyZWFrOworICAgIGNhc2UgVFlQRV9JTlQ6CisgICAgICAgIHJldHZhbCA9IFB5SW50X0Zyb21Mb25nKHJfbG9uZyhwKSk7CisgICAgICAgIGJyZWFrOwogCi0JY2FzZSBUWVBFX0lOVDY0OgotCQlyZXR2YWwgPSByX2xvbmc2NChwKTsKLQkJYnJlYWs7CisgICAgY2FzZSBUWVBFX0lOVDY0OgorICAgICAgICByZXR2YWwgPSByX2xvbmc2NChwKTsKKyAgICAgICAgYnJlYWs7CiAKLQljYXNlIFRZUEVfTE9ORzoKLQkJewotCQkJaW50IHNpemU7Ci0JCQlQeUxvbmdPYmplY3QgKm9iOwotCQkJbiA9IHJfbG9uZyhwKTsKLQkJCWlmIChuIDwgLUlOVF9NQVggfHwgbiA+IElOVF9NQVgpIHsKLQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkJCSJiYWQgbWFyc2hhbCBkYXRhIik7Ci0JCQkJcmV0dmFsID0gTlVMTDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCXNpemUgPSBuPDAgPyAtbiA6IG47Ci0JCQlvYiA9IF9QeUxvbmdfTmV3KHNpemUpOwotCQkJaWYgKG9iID09IE5VTEwpIHsKLQkJCQlyZXR2YWwgPSBOVUxMOwotCQkJCWJyZWFrOwotCQkJfQotCQkJb2ItPm9iX3NpemUgPSBuOwotCQkJZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCWludCBkaWdpdCA9IHJfc2hvcnQocCk7Ci0JCQkJaWYgKGRpZ2l0IDwgMCB8fAotCQkJCSAgICAoZGlnaXQgPT0gMCAmJiBpID09IHNpemUtMSkpIHsKLQkJCQkJUHlfREVDUkVGKG9iKTsKLQkJCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJCQkJImJhZCBtYXJzaGFsIGRhdGEiKTsKLQkJCQkJb2IgPSBOVUxMOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaWYgKG9iICE9IE5VTEwpCi0JCQkJCW9iLT5vYl9kaWdpdFtpXSA9IGRpZ2l0OwotCQkJfQotCQkJcmV0dmFsID0gKFB5T2JqZWN0ICopb2I7Ci0JCQlicmVhazsKLQkJfQorICAgIGNhc2UgVFlQRV9MT05HOgorICAgICAgICB7CisgICAgICAgICAgICBpbnQgc2l6ZTsKKyAgICAgICAgICAgIFB5TG9uZ09iamVjdCAqb2I7CisgICAgICAgICAgICBuID0gcl9sb25nKHApOworICAgICAgICAgICAgaWYgKG4gPCAtSU5UX01BWCB8fCBuID4gSU5UX01BWCkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFkIG1hcnNoYWwgZGF0YSIpOworICAgICAgICAgICAgICAgIHJldHZhbCA9IE5VTEw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzaXplID0gbjwwID8gLW4gOiBuOworICAgICAgICAgICAgb2IgPSBfUHlMb25nX05ldyhzaXplKTsKKyAgICAgICAgICAgIGlmIChvYiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gTlVMTDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9iLT5vYl9zaXplID0gbjsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpbnQgZGlnaXQgPSByX3Nob3J0KHApOworICAgICAgICAgICAgICAgIGlmIChkaWdpdCA8IDAgfHwKKyAgICAgICAgICAgICAgICAgICAgKGRpZ2l0ID09IDAgJiYgaSA9PSBzaXplLTEpKSB7CisgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihvYik7CisgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhZCBtYXJzaGFsIGRhdGEiKTsKKyAgICAgICAgICAgICAgICAgICAgb2IgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG9iICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIG9iLT5vYl9kaWdpdFtpXSA9IGRpZ2l0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dmFsID0gKFB5T2JqZWN0ICopb2I7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogCi0JY2FzZSBUWVBFX0ZMT0FUOgotCQl7Ci0JCQljaGFyIGJ1ZlsyNTZdOwotCQkJZG91YmxlIGR4OwotCQkJbiA9IHJfYnl0ZShwKTsKLQkJCWlmIChuID09IEVPRiB8fCByX3N0cmluZyhidWYsIChpbnQpbiwgcCkgIT0gbikgewotCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19FT0ZFcnJvciwKLQkJCQkJIkVPRiByZWFkIHdoZXJlIG9iamVjdCBleHBlY3RlZCIpOwotCQkJCXJldHZhbCA9IE5VTEw7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlidWZbbl0gPSAnXDAnOwotCQkJcmV0dmFsID0gTlVMTDsKLQkJCVB5RlBFX1NUQVJUX1BST1RFQ1QoImF0b2YiLCBicmVhaykKLQkJCWR4ID0gUHlPU19hc2NpaV9hdG9mKGJ1Zik7Ci0JCQlQeUZQRV9FTkRfUFJPVEVDVChkeCkKLQkJCXJldHZhbCA9IFB5RmxvYXRfRnJvbURvdWJsZShkeCk7Ci0JCQlicmVhazsKLQkJfQorICAgIGNhc2UgVFlQRV9GTE9BVDoKKyAgICAgICAgeworICAgICAgICAgICAgY2hhciBidWZbMjU2XTsKKyAgICAgICAgICAgIGRvdWJsZSBkeDsKKyAgICAgICAgICAgIG4gPSByX2J5dGUocCk7CisgICAgICAgICAgICBpZiAobiA9PSBFT0YgfHwgcl9zdHJpbmcoYnVmLCAoaW50KW4sIHApICE9IG4pIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfRU9GRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICJFT0YgcmVhZCB3aGVyZSBvYmplY3QgZXhwZWN0ZWQiKTsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSBOVUxMOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnVmW25dID0gJ1wwJzsKKyAgICAgICAgICAgIHJldHZhbCA9IE5VTEw7CisgICAgICAgICAgICBQeUZQRV9TVEFSVF9QUk9URUNUKCJhdG9mIiwgYnJlYWspCisgICAgICAgICAgICBkeCA9IFB5T1NfYXNjaWlfYXRvZihidWYpOworICAgICAgICAgICAgUHlGUEVfRU5EX1BST1RFQ1QoZHgpCisgICAgICAgICAgICByZXR2YWwgPSBQeUZsb2F0X0Zyb21Eb3VibGUoZHgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KIAotCWNhc2UgVFlQRV9CSU5BUllfRkxPQVQ6Ci0JCXsKLQkJCXVuc2lnbmVkIGNoYXIgYnVmWzhdOwotCQkJZG91YmxlIHg7Ci0JCQlpZiAocl9zdHJpbmcoKGNoYXIqKWJ1ZiwgOCwgcCkgIT0gOCkgewotCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19FT0ZFcnJvciwKLQkJCQkJIkVPRiByZWFkIHdoZXJlIG9iamVjdCBleHBlY3RlZCIpOwotCQkJCXJldHZhbCA9IE5VTEw7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQl4ID0gX1B5RmxvYXRfVW5wYWNrOChidWYsIDEpOwotCQkJaWYgKHggPT0gLTEuMCAmJiBQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCQkJcmV0dmFsID0gTlVMTDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCXJldHZhbCA9IFB5RmxvYXRfRnJvbURvdWJsZSh4KTsKLQkJCWJyZWFrOwotCQl9CisgICAgY2FzZSBUWVBFX0JJTkFSWV9GTE9BVDoKKyAgICAgICAgeworICAgICAgICAgICAgdW5zaWduZWQgY2hhciBidWZbOF07CisgICAgICAgICAgICBkb3VibGUgeDsKKyAgICAgICAgICAgIGlmIChyX3N0cmluZygoY2hhciopYnVmLCA4LCBwKSAhPSA4KSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0VPRkVycm9yLAorICAgICAgICAgICAgICAgICAgICAiRU9GIHJlYWQgd2hlcmUgb2JqZWN0IGV4cGVjdGVkIik7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gTlVMTDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHggPSBfUHlGbG9hdF9VbnBhY2s4KGJ1ZiwgMSk7CisgICAgICAgICAgICBpZiAoeCA9PSAtMS4wICYmIFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSBOVUxMOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dmFsID0gUHlGbG9hdF9Gcm9tRG91YmxlKHgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KIAogI2lmbmRlZiBXSVRIT1VUX0NPTVBMRVgKLQljYXNlIFRZUEVfQ09NUExFWDoKLQkJewotCQkJY2hhciBidWZbMjU2XTsKLQkJCVB5X2NvbXBsZXggYzsKLQkJCW4gPSByX2J5dGUocCk7Ci0JCQlpZiAobiA9PSBFT0YgfHwgcl9zdHJpbmcoYnVmLCAoaW50KW4sIHApICE9IG4pIHsKLQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfRU9GRXJyb3IsCi0JCQkJCSJFT0YgcmVhZCB3aGVyZSBvYmplY3QgZXhwZWN0ZWQiKTsKLQkJCQlyZXR2YWwgPSBOVUxMOwotCQkJCWJyZWFrOwotCQkJfQotCQkJYnVmW25dID0gJ1wwJzsKLQkJCXJldHZhbCA9IE5VTEw7Ci0JCQlQeUZQRV9TVEFSVF9QUk9URUNUKCJhdG9mIiwgYnJlYWs7KQotCQkJYy5yZWFsID0gUHlPU19hc2NpaV9hdG9mKGJ1Zik7Ci0JCQlQeUZQRV9FTkRfUFJPVEVDVChjKQotCQkJbiA9IHJfYnl0ZShwKTsKLQkJCWlmIChuID09IEVPRiB8fCByX3N0cmluZyhidWYsIChpbnQpbiwgcCkgIT0gbikgewotCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19FT0ZFcnJvciwKLQkJCQkJIkVPRiByZWFkIHdoZXJlIG9iamVjdCBleHBlY3RlZCIpOwotCQkJCXJldHZhbCA9IE5VTEw7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlidWZbbl0gPSAnXDAnOwotCQkJUHlGUEVfU1RBUlRfUFJPVEVDVCgiYXRvZiIsIGJyZWFrKQotCQkJYy5pbWFnID0gUHlPU19hc2NpaV9hdG9mKGJ1Zik7Ci0JCQlQeUZQRV9FTkRfUFJPVEVDVChjKQotCQkJcmV0dmFsID0gUHlDb21wbGV4X0Zyb21DQ29tcGxleChjKTsKLQkJCWJyZWFrOwotCQl9CisgICAgY2FzZSBUWVBFX0NPTVBMRVg6CisgICAgICAgIHsKKyAgICAgICAgICAgIGNoYXIgYnVmWzI1Nl07CisgICAgICAgICAgICBQeV9jb21wbGV4IGM7CisgICAgICAgICAgICBuID0gcl9ieXRlKHApOworICAgICAgICAgICAgaWYgKG4gPT0gRU9GIHx8IHJfc3RyaW5nKGJ1ZiwgKGludCluLCBwKSAhPSBuKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0VPRkVycm9yLAorICAgICAgICAgICAgICAgICAgICAiRU9GIHJlYWQgd2hlcmUgb2JqZWN0IGV4cGVjdGVkIik7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gTlVMTDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ1ZltuXSA9ICdcMCc7CisgICAgICAgICAgICByZXR2YWwgPSBOVUxMOworICAgICAgICAgICAgUHlGUEVfU1RBUlRfUFJPVEVDVCgiYXRvZiIsIGJyZWFrOykKKyAgICAgICAgICAgIGMucmVhbCA9IFB5T1NfYXNjaWlfYXRvZihidWYpOworICAgICAgICAgICAgUHlGUEVfRU5EX1BST1RFQ1QoYykKKyAgICAgICAgICAgIG4gPSByX2J5dGUocCk7CisgICAgICAgICAgICBpZiAobiA9PSBFT0YgfHwgcl9zdHJpbmcoYnVmLCAoaW50KW4sIHApICE9IG4pIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfRU9GRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICJFT0YgcmVhZCB3aGVyZSBvYmplY3QgZXhwZWN0ZWQiKTsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSBOVUxMOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnVmW25dID0gJ1wwJzsKKyAgICAgICAgICAgIFB5RlBFX1NUQVJUX1BST1RFQ1QoImF0b2YiLCBicmVhaykKKyAgICAgICAgICAgIGMuaW1hZyA9IFB5T1NfYXNjaWlfYXRvZihidWYpOworICAgICAgICAgICAgUHlGUEVfRU5EX1BST1RFQ1QoYykKKyAgICAgICAgICAgIHJldHZhbCA9IFB5Q29tcGxleF9Gcm9tQ0NvbXBsZXgoYyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogCi0JY2FzZSBUWVBFX0JJTkFSWV9DT01QTEVYOgotCQl7Ci0JCQl1bnNpZ25lZCBjaGFyIGJ1Zls4XTsKLQkJCVB5X2NvbXBsZXggYzsKLQkJCWlmIChyX3N0cmluZygoY2hhciopYnVmLCA4LCBwKSAhPSA4KSB7Ci0JCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0VPRkVycm9yLAotCQkJCQkiRU9GIHJlYWQgd2hlcmUgb2JqZWN0IGV4cGVjdGVkIik7Ci0JCQkJcmV0dmFsID0gTlVMTDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWMucmVhbCA9IF9QeUZsb2F0X1VucGFjazgoYnVmLCAxKTsKLQkJCWlmIChjLnJlYWwgPT0gLTEuMCAmJiBQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCQkJcmV0dmFsID0gTlVMTDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChyX3N0cmluZygoY2hhciopYnVmLCA4LCBwKSAhPSA4KSB7Ci0JCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0VPRkVycm9yLAotCQkJCQkiRU9GIHJlYWQgd2hlcmUgb2JqZWN0IGV4cGVjdGVkIik7Ci0JCQkJcmV0dmFsID0gTlVMTDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWMuaW1hZyA9IF9QeUZsb2F0X1VucGFjazgoYnVmLCAxKTsKLQkJCWlmIChjLmltYWcgPT0gLTEuMCAmJiBQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCQkJcmV0dmFsID0gTlVMTDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCXJldHZhbCA9IFB5Q29tcGxleF9Gcm9tQ0NvbXBsZXgoYyk7Ci0JCQlicmVhazsKLQkJfQorICAgIGNhc2UgVFlQRV9CSU5BUllfQ09NUExFWDoKKyAgICAgICAgeworICAgICAgICAgICAgdW5zaWduZWQgY2hhciBidWZbOF07CisgICAgICAgICAgICBQeV9jb21wbGV4IGM7CisgICAgICAgICAgICBpZiAocl9zdHJpbmcoKGNoYXIqKWJ1ZiwgOCwgcCkgIT0gOCkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19FT0ZFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgIkVPRiByZWFkIHdoZXJlIG9iamVjdCBleHBlY3RlZCIpOworICAgICAgICAgICAgICAgIHJldHZhbCA9IE5VTEw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjLnJlYWwgPSBfUHlGbG9hdF9VbnBhY2s4KGJ1ZiwgMSk7CisgICAgICAgICAgICBpZiAoYy5yZWFsID09IC0xLjAgJiYgUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IE5VTEw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocl9zdHJpbmcoKGNoYXIqKWJ1ZiwgOCwgcCkgIT0gOCkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19FT0ZFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgIkVPRiByZWFkIHdoZXJlIG9iamVjdCBleHBlY3RlZCIpOworICAgICAgICAgICAgICAgIHJldHZhbCA9IE5VTEw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjLmltYWcgPSBfUHlGbG9hdF9VbnBhY2s4KGJ1ZiwgMSk7CisgICAgICAgICAgICBpZiAoYy5pbWFnID09IC0xLjAgJiYgUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IE5VTEw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR2YWwgPSBQeUNvbXBsZXhfRnJvbUNDb21wbGV4KGMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KICNlbmRpZgogCi0JY2FzZSBUWVBFX0lOVEVSTkVEOgotCWNhc2UgVFlQRV9TVFJJTkc6Ci0JCW4gPSByX2xvbmcocCk7Ci0JCWlmIChuIDwgMCB8fCBuID4gSU5UX01BWCkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJiYWQgbWFyc2hhbCBkYXRhIik7Ci0JCQlyZXR2YWwgPSBOVUxMOwotCQkJYnJlYWs7Ci0JCX0KLQkJdiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopTlVMTCwgbik7Ci0JCWlmICh2ID09IE5VTEwpIHsKLQkJCXJldHZhbCA9IE5VTEw7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAocl9zdHJpbmcoUHlTdHJpbmdfQVNfU1RSSU5HKHYpLCAoaW50KW4sIHApICE9IG4pIHsKLQkJCVB5X0RFQ1JFRih2KTsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19FT0ZFcnJvciwKLQkJCQkJIkVPRiByZWFkIHdoZXJlIG9iamVjdCBleHBlY3RlZCIpOwotCQkJcmV0dmFsID0gTlVMTDsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmICh0eXBlID09IFRZUEVfSU5URVJORUQpIHsKLQkJCVB5U3RyaW5nX0ludGVybkluUGxhY2UoJnYpOwotCQkJaWYgKFB5TGlzdF9BcHBlbmQocC0+c3RyaW5ncywgdikgPCAwKSB7Ci0JCQkJcmV0dmFsID0gTlVMTDsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR2YWwgPSB2OwotCQlicmVhazsKKyAgICBjYXNlIFRZUEVfSU5URVJORUQ6CisgICAgY2FzZSBUWVBFX1NUUklORzoKKyAgICAgICAgbiA9IHJfbG9uZyhwKTsKKyAgICAgICAgaWYgKG4gPCAwIHx8IG4gPiBJTlRfTUFYKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImJhZCBtYXJzaGFsIGRhdGEiKTsKKyAgICAgICAgICAgIHJldHZhbCA9IE5VTEw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilOVUxMLCBuKTsKKyAgICAgICAgaWYgKHYgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dmFsID0gTlVMTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChyX3N0cmluZyhQeVN0cmluZ19BU19TVFJJTkcodiksIChpbnQpbiwgcCkgIT0gbikgeworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0VPRkVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFT0YgcmVhZCB3aGVyZSBvYmplY3QgZXhwZWN0ZWQiKTsKKyAgICAgICAgICAgIHJldHZhbCA9IE5VTEw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAodHlwZSA9PSBUWVBFX0lOVEVSTkVEKSB7CisgICAgICAgICAgICBQeVN0cmluZ19JbnRlcm5JblBsYWNlKCZ2KTsKKyAgICAgICAgICAgIGlmIChQeUxpc3RfQXBwZW5kKHAtPnN0cmluZ3MsIHYpIDwgMCkgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IE5VTEw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dmFsID0gdjsKKyAgICAgICAgYnJlYWs7CiAKLQljYXNlIFRZUEVfU1RSSU5HUkVGOgotCQluID0gcl9sb25nKHApOwotCQlpZiAobiA8IDAgfHwgbiA+PSBQeUxpc3RfR0VUX1NJWkUocC0+c3RyaW5ncykpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiYmFkIG1hcnNoYWwgZGF0YSIpOwotCQkJcmV0dmFsID0gTlVMTDsKLQkJCWJyZWFrOwotCQl9Ci0JCXYgPSBQeUxpc3RfR0VUX0lURU0ocC0+c3RyaW5ncywgbik7Ci0JCVB5X0lOQ1JFRih2KTsKLQkJcmV0dmFsID0gdjsKLQkJYnJlYWs7CisgICAgY2FzZSBUWVBFX1NUUklOR1JFRjoKKyAgICAgICAgbiA9IHJfbG9uZyhwKTsKKyAgICAgICAgaWYgKG4gPCAwIHx8IG4gPj0gUHlMaXN0X0dFVF9TSVpFKHAtPnN0cmluZ3MpKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImJhZCBtYXJzaGFsIGRhdGEiKTsKKyAgICAgICAgICAgIHJldHZhbCA9IE5VTEw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB2ID0gUHlMaXN0X0dFVF9JVEVNKHAtPnN0cmluZ3MsIG4pOworICAgICAgICBQeV9JTkNSRUYodik7CisgICAgICAgIHJldHZhbCA9IHY7CisgICAgICAgIGJyZWFrOwogCiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCWNhc2UgVFlQRV9VTklDT0RFOgotCSAgICB7Ci0JCWNoYXIgKmJ1ZmZlcjsKKyAgICBjYXNlIFRZUEVfVU5JQ09ERToKKyAgICAgICAgeworICAgICAgICBjaGFyICpidWZmZXI7CiAKLQkJbiA9IHJfbG9uZyhwKTsKLQkJaWYgKG4gPCAwIHx8IG4gPiBJTlRfTUFYKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImJhZCBtYXJzaGFsIGRhdGEiKTsKLQkJCXJldHZhbCA9IE5VTEw7Ci0JCQlicmVhazsKLQkJfQotCQlidWZmZXIgPSBQeU1lbV9ORVcoY2hhciwgbik7Ci0JCWlmIChidWZmZXIgPT0gTlVMTCkgewotCQkJcmV0dmFsID0gUHlFcnJfTm9NZW1vcnkoKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmIChyX3N0cmluZyhidWZmZXIsIChpbnQpbiwgcCkgIT0gbikgewotCQkJUHlNZW1fREVMKGJ1ZmZlcik7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfRU9GRXJyb3IsCi0JCQkJIkVPRiByZWFkIHdoZXJlIG9iamVjdCBleHBlY3RlZCIpOwotCQkJcmV0dmFsID0gTlVMTDsKLQkJCWJyZWFrOwotCQl9Ci0JCXYgPSBQeVVuaWNvZGVfRGVjb2RlVVRGOChidWZmZXIsIG4sIE5VTEwpOwotCQlQeU1lbV9ERUwoYnVmZmVyKTsKLQkJcmV0dmFsID0gdjsKLQkJYnJlYWs7Ci0JICAgIH0KKyAgICAgICAgbiA9IHJfbG9uZyhwKTsKKyAgICAgICAgaWYgKG4gPCAwIHx8IG4gPiBJTlRfTUFYKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImJhZCBtYXJzaGFsIGRhdGEiKTsKKyAgICAgICAgICAgIHJldHZhbCA9IE5VTEw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBidWZmZXIgPSBQeU1lbV9ORVcoY2hhciwgbik7CisgICAgICAgIGlmIChidWZmZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dmFsID0gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChyX3N0cmluZyhidWZmZXIsIChpbnQpbiwgcCkgIT0gbikgeworICAgICAgICAgICAgUHlNZW1fREVMKGJ1ZmZlcik7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfRU9GRXJyb3IsCisgICAgICAgICAgICAgICAgIkVPRiByZWFkIHdoZXJlIG9iamVjdCBleHBlY3RlZCIpOworICAgICAgICAgICAgcmV0dmFsID0gTlVMTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHYgPSBQeVVuaWNvZGVfRGVjb2RlVVRGOChidWZmZXIsIG4sIE5VTEwpOworICAgICAgICBQeU1lbV9ERUwoYnVmZmVyKTsKKyAgICAgICAgcmV0dmFsID0gdjsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIH0KICNlbmRpZgogCi0JY2FzZSBUWVBFX1RVUExFOgotCQluID0gcl9sb25nKHApOwotCQlpZiAobiA8IDAgfHwgbiA+IElOVF9NQVgpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiYmFkIG1hcnNoYWwgZGF0YSIpOwotCQkJcmV0dmFsID0gTlVMTDsKLQkJCWJyZWFrOwotCQl9Ci0JCXYgPSBQeVR1cGxlX05ldygoaW50KW4pOwotCQlpZiAodiA9PSBOVUxMKSB7Ci0JCQlyZXR2YWwgPSBOVUxMOwotCQkJYnJlYWs7Ci0JCX0KLQkJZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQkJdjIgPSByX29iamVjdChwKTsKLQkJCWlmICggdjIgPT0gTlVMTCApIHsKLQkJCQlpZiAoIVB5RXJyX09jY3VycmVkKCkpCi0JCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJCQkiTlVMTCBvYmplY3QgaW4gbWFyc2hhbCBkYXRhIik7Ci0JCQkJUHlfREVDUkVGKHYpOwotCQkJCXYgPSBOVUxMOwotCQkJCWJyZWFrOwotCQkJfQotCQkJUHlUdXBsZV9TRVRfSVRFTSh2LCAoaW50KWksIHYyKTsKLQkJfQotCQlyZXR2YWwgPSB2OwotCQlicmVhazsKKyAgICBjYXNlIFRZUEVfVFVQTEU6CisgICAgICAgIG4gPSByX2xvbmcocCk7CisgICAgICAgIGlmIChuIDwgMCB8fCBuID4gSU5UX01BWCkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJiYWQgbWFyc2hhbCBkYXRhIik7CisgICAgICAgICAgICByZXR2YWwgPSBOVUxMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgdiA9IFB5VHVwbGVfTmV3KChpbnQpbik7CisgICAgICAgIGlmICh2ID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHZhbCA9IE5VTEw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgICAgICB2MiA9IHJfb2JqZWN0KHApOworICAgICAgICAgICAgaWYgKCB2MiA9PSBOVUxMICkgeworICAgICAgICAgICAgICAgIGlmICghUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJOVUxMIG9iamVjdCBpbiBtYXJzaGFsIGRhdGEiKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICAgICAgdiA9IE5VTEw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKHYsIChpbnQpaSwgdjIpOworICAgICAgICB9CisgICAgICAgIHJldHZhbCA9IHY7CisgICAgICAgIGJyZWFrOwogCi0JY2FzZSBUWVBFX0xJU1Q6Ci0JCW4gPSByX2xvbmcocCk7Ci0JCWlmIChuIDwgMCB8fCBuID4gSU5UX01BWCkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJiYWQgbWFyc2hhbCBkYXRhIik7Ci0JCQlyZXR2YWwgPSBOVUxMOwotCQkJYnJlYWs7Ci0JCX0KLQkJdiA9IFB5TGlzdF9OZXcoKGludCluKTsKLQkJaWYgKHYgPT0gTlVMTCkgewotCQkJcmV0dmFsID0gTlVMTDsKLQkJCWJyZWFrOwotCQl9Ci0JCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJCXYyID0gcl9vYmplY3QocCk7Ci0JCQlpZiAoIHYyID09IE5VTEwgKSB7Ci0JCQkJaWYgKCFQeUVycl9PY2N1cnJlZCgpKQotCQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCQkJIk5VTEwgb2JqZWN0IGluIG1hcnNoYWwgZGF0YSIpOwotCQkJCVB5X0RFQ1JFRih2KTsKLQkJCQl2ID0gTlVMTDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCVB5TGlzdF9TRVRfSVRFTSh2LCAoaW50KWksIHYyKTsKLQkJfQotCQlyZXR2YWwgPSB2OwotCQlicmVhazsKKyAgICBjYXNlIFRZUEVfTElTVDoKKyAgICAgICAgbiA9IHJfbG9uZyhwKTsKKyAgICAgICAgaWYgKG4gPCAwIHx8IG4gPiBJTlRfTUFYKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImJhZCBtYXJzaGFsIGRhdGEiKTsKKyAgICAgICAgICAgIHJldHZhbCA9IE5VTEw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB2ID0gUHlMaXN0X05ldygoaW50KW4pOworICAgICAgICBpZiAodiA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR2YWwgPSBOVUxMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICAgICAgdjIgPSByX29iamVjdChwKTsKKyAgICAgICAgICAgIGlmICggdjIgPT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICBpZiAoIVB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiTlVMTCBvYmplY3QgaW4gbWFyc2hhbCBkYXRhIik7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgICAgIHYgPSBOVUxMOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlMaXN0X1NFVF9JVEVNKHYsIChpbnQpaSwgdjIpOworICAgICAgICB9CisgICAgICAgIHJldHZhbCA9IHY7CisgICAgICAgIGJyZWFrOwogCi0JY2FzZSBUWVBFX0RJQ1Q6Ci0JCXYgPSBQeURpY3RfTmV3KCk7Ci0JCWlmICh2ID09IE5VTEwpIHsKLQkJCXJldHZhbCA9IE5VTEw7Ci0JCQlicmVhazsKLQkJfQotCQlmb3IgKDs7KSB7Ci0JCQlQeU9iamVjdCAqa2V5LCAqdmFsOwotCQkJa2V5ID0gcl9vYmplY3QocCk7Ci0JCQlpZiAoa2V5ID09IE5VTEwpCi0JCQkJYnJlYWs7Ci0JCQl2YWwgPSByX29iamVjdChwKTsKLQkJCWlmICh2YWwgIT0gTlVMTCkKLQkJCQlQeURpY3RfU2V0SXRlbSh2LCBrZXksIHZhbCk7Ci0JCQlQeV9ERUNSRUYoa2V5KTsKLQkJCVB5X1hERUNSRUYodmFsKTsKLQkJfQotCQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkgewotCQkJUHlfREVDUkVGKHYpOwotCQkJdiA9IE5VTEw7Ci0JCX0KLQkJcmV0dmFsID0gdjsKLQkJYnJlYWs7CisgICAgY2FzZSBUWVBFX0RJQ1Q6CisgICAgICAgIHYgPSBQeURpY3RfTmV3KCk7CisgICAgICAgIGlmICh2ID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHZhbCA9IE5VTEw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICBQeU9iamVjdCAqa2V5LCAqdmFsOworICAgICAgICAgICAga2V5ID0gcl9vYmplY3QocCk7CisgICAgICAgICAgICBpZiAoa2V5ID09IE5VTEwpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB2YWwgPSByX29iamVjdChwKTsKKyAgICAgICAgICAgIGlmICh2YWwgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICBQeURpY3RfU2V0SXRlbSh2LCBrZXksIHZhbCk7CisgICAgICAgICAgICBQeV9ERUNSRUYoa2V5KTsKKyAgICAgICAgICAgIFB5X1hERUNSRUYodmFsKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgdiA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dmFsID0gdjsKKyAgICAgICAgYnJlYWs7CiAKLQljYXNlIFRZUEVfU0VUOgotCWNhc2UgVFlQRV9GUk9aRU5TRVQ6Ci0JCW4gPSByX2xvbmcocCk7Ci0JCWlmIChuIDwgMCB8fCBuID4gSU5UX01BWCkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJiYWQgbWFyc2hhbCBkYXRhIik7Ci0JCQlyZXR2YWwgPSBOVUxMOwotCQkJYnJlYWs7Ci0JCX0KLSAgICAgICAgICAgICAgICB2ID0gKHR5cGUgPT0gVFlQRV9TRVQpID8gUHlTZXRfTmV3KE5VTEwpIDogUHlGcm96ZW5TZXRfTmV3KE5VTEwpOwotCQlpZiAodiA9PSBOVUxMKSB7Ci0JCQlyZXR2YWwgPSBOVUxMOwotCQkJYnJlYWs7Ci0JCX0KLQkJZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQkJdjIgPSByX29iamVjdChwKTsKLQkJCWlmICggdjIgPT0gTlVMTCApIHsKLQkJCQlpZiAoIVB5RXJyX09jY3VycmVkKCkpCi0JCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJCQkiTlVMTCBvYmplY3QgaW4gbWFyc2hhbCBkYXRhIik7Ci0JCQkJUHlfREVDUkVGKHYpOwotCQkJCXYgPSBOVUxMOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKFB5U2V0X0FkZCh2LCB2MikgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYodjIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYodjIpOwotCQl9Ci0JCXJldHZhbCA9IHY7Ci0JCWJyZWFrOworICAgIGNhc2UgVFlQRV9TRVQ6CisgICAgY2FzZSBUWVBFX0ZST1pFTlNFVDoKKyAgICAgICAgbiA9IHJfbG9uZyhwKTsKKyAgICAgICAgaWYgKG4gPCAwIHx8IG4gPiBJTlRfTUFYKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImJhZCBtYXJzaGFsIGRhdGEiKTsKKyAgICAgICAgICAgIHJldHZhbCA9IE5VTEw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB2ID0gKHR5cGUgPT0gVFlQRV9TRVQpID8gUHlTZXRfTmV3KE5VTEwpIDogUHlGcm96ZW5TZXRfTmV3KE5VTEwpOworICAgICAgICBpZiAodiA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR2YWwgPSBOVUxMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICAgICAgdjIgPSByX29iamVjdChwKTsKKyAgICAgICAgICAgIGlmICggdjIgPT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICBpZiAoIVB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiTlVMTCBvYmplY3QgaW4gbWFyc2hhbCBkYXRhIik7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgICAgIHYgPSBOVUxMOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKFB5U2V0X0FkZCh2LCB2MikgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHYyKTsKKyAgICAgICAgICAgICAgICB2ID0gTlVMTDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5X0RFQ1JFRih2Mik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dmFsID0gdjsKKyAgICAgICAgYnJlYWs7CiAKLQljYXNlIFRZUEVfQ09ERToKLQkJaWYgKFB5RXZhbF9HZXRSZXN0cmljdGVkKCkpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCi0JCQkJImNhbm5vdCB1bm1hcnNoYWwgY29kZSBvYmplY3RzIGluICIKLQkJCQkicmVzdHJpY3RlZCBleGVjdXRpb24gbW9kZSIpOwotCQkJcmV0dmFsID0gTlVMTDsKLQkJCWJyZWFrOwotCQl9Ci0JCWVsc2UgewotCQkJaW50IGFyZ2NvdW50OwotCQkJaW50IG5sb2NhbHM7Ci0JCQlpbnQgc3RhY2tzaXplOwotCQkJaW50IGZsYWdzOwotCQkJUHlPYmplY3QgKmNvZGUgPSBOVUxMOwotCQkJUHlPYmplY3QgKmNvbnN0cyA9IE5VTEw7Ci0JCQlQeU9iamVjdCAqbmFtZXMgPSBOVUxMOwotCQkJUHlPYmplY3QgKnZhcm5hbWVzID0gTlVMTDsKLQkJCVB5T2JqZWN0ICpmcmVldmFycyA9IE5VTEw7Ci0JCQlQeU9iamVjdCAqY2VsbHZhcnMgPSBOVUxMOwotCQkJUHlPYmplY3QgKmZpbGVuYW1lID0gTlVMTDsKLQkJCVB5T2JqZWN0ICpuYW1lID0gTlVMTDsKLQkJCWludCBmaXJzdGxpbmVubzsKLQkJCVB5T2JqZWN0ICpsbm90YWIgPSBOVUxMOwotCQkJCi0JCQl2ID0gTlVMTDsKKyAgICBjYXNlIFRZUEVfQ09ERToKKyAgICAgICAgaWYgKFB5RXZhbF9HZXRSZXN0cmljdGVkKCkpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgImNhbm5vdCB1bm1hcnNoYWwgY29kZSBvYmplY3RzIGluICIKKyAgICAgICAgICAgICAgICAicmVzdHJpY3RlZCBleGVjdXRpb24gbW9kZSIpOworICAgICAgICAgICAgcmV0dmFsID0gTlVMTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaW50IGFyZ2NvdW50OworICAgICAgICAgICAgaW50IG5sb2NhbHM7CisgICAgICAgICAgICBpbnQgc3RhY2tzaXplOworICAgICAgICAgICAgaW50IGZsYWdzOworICAgICAgICAgICAgUHlPYmplY3QgKmNvZGUgPSBOVUxMOworICAgICAgICAgICAgUHlPYmplY3QgKmNvbnN0cyA9IE5VTEw7CisgICAgICAgICAgICBQeU9iamVjdCAqbmFtZXMgPSBOVUxMOworICAgICAgICAgICAgUHlPYmplY3QgKnZhcm5hbWVzID0gTlVMTDsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpmcmVldmFycyA9IE5VTEw7CisgICAgICAgICAgICBQeU9iamVjdCAqY2VsbHZhcnMgPSBOVUxMOworICAgICAgICAgICAgUHlPYmplY3QgKmZpbGVuYW1lID0gTlVMTDsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpuYW1lID0gTlVMTDsKKyAgICAgICAgICAgIGludCBmaXJzdGxpbmVubzsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpsbm90YWIgPSBOVUxMOwogCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBYWFggaWdub3JlIGxvbmctPmludCBvdmVyZmxvd3MgZm9yIG5vdyAqLwotCQkJYXJnY291bnQgPSAoaW50KXJfbG9uZyhwKTsKLQkJCW5sb2NhbHMgPSAoaW50KXJfbG9uZyhwKTsKLQkJCXN0YWNrc2l6ZSA9IChpbnQpcl9sb25nKHApOwotCQkJZmxhZ3MgPSAoaW50KXJfbG9uZyhwKTsKLQkJCWNvZGUgPSByX29iamVjdChwKTsKLQkJCWlmIChjb2RlID09IE5VTEwpCi0JCQkJZ290byBjb2RlX2Vycm9yOwotCQkJY29uc3RzID0gcl9vYmplY3QocCk7Ci0JCQlpZiAoY29uc3RzID09IE5VTEwpCi0JCQkJZ290byBjb2RlX2Vycm9yOwotCQkJbmFtZXMgPSByX29iamVjdChwKTsKLQkJCWlmIChuYW1lcyA9PSBOVUxMKQotCQkJCWdvdG8gY29kZV9lcnJvcjsKLQkJCXZhcm5hbWVzID0gcl9vYmplY3QocCk7Ci0JCQlpZiAodmFybmFtZXMgPT0gTlVMTCkKLQkJCQlnb3RvIGNvZGVfZXJyb3I7Ci0JCQlmcmVldmFycyA9IHJfb2JqZWN0KHApOwotCQkJaWYgKGZyZWV2YXJzID09IE5VTEwpCi0JCQkJZ290byBjb2RlX2Vycm9yOwotCQkJY2VsbHZhcnMgPSByX29iamVjdChwKTsKLQkJCWlmIChjZWxsdmFycyA9PSBOVUxMKQotCQkJCWdvdG8gY29kZV9lcnJvcjsKLQkJCWZpbGVuYW1lID0gcl9vYmplY3QocCk7Ci0JCQlpZiAoZmlsZW5hbWUgPT0gTlVMTCkKLQkJCQlnb3RvIGNvZGVfZXJyb3I7Ci0JCQluYW1lID0gcl9vYmplY3QocCk7Ci0JCQlpZiAobmFtZSA9PSBOVUxMKQotCQkJCWdvdG8gY29kZV9lcnJvcjsKLQkJCWZpcnN0bGluZW5vID0gKGludClyX2xvbmcocCk7Ci0JCQlsbm90YWIgPSByX29iamVjdChwKTsKLQkJCWlmIChsbm90YWIgPT0gTlVMTCkKLQkJCQlnb3RvIGNvZGVfZXJyb3I7CisgICAgICAgICAgICB2ID0gTlVMTDsKIAotCQkJdiA9IChQeU9iamVjdCAqKSBQeUNvZGVfTmV3KAotCQkJCQlhcmdjb3VudCwgbmxvY2Fscywgc3RhY2tzaXplLCBmbGFncywKLQkJCQkJY29kZSwgY29uc3RzLCBuYW1lcywgdmFybmFtZXMsCi0JCQkJCWZyZWV2YXJzLCBjZWxsdmFycywgZmlsZW5hbWUsIG5hbWUsCi0JCQkJCWZpcnN0bGluZW5vLCBsbm90YWIpOworICAgICAgICAgICAgLyogWFhYIGlnbm9yZSBsb25nLT5pbnQgb3ZlcmZsb3dzIGZvciBub3cgKi8KKyAgICAgICAgICAgIGFyZ2NvdW50ID0gKGludClyX2xvbmcocCk7CisgICAgICAgICAgICBubG9jYWxzID0gKGludClyX2xvbmcocCk7CisgICAgICAgICAgICBzdGFja3NpemUgPSAoaW50KXJfbG9uZyhwKTsKKyAgICAgICAgICAgIGZsYWdzID0gKGludClyX2xvbmcocCk7CisgICAgICAgICAgICBjb2RlID0gcl9vYmplY3QocCk7CisgICAgICAgICAgICBpZiAoY29kZSA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGdvdG8gY29kZV9lcnJvcjsKKyAgICAgICAgICAgIGNvbnN0cyA9IHJfb2JqZWN0KHApOworICAgICAgICAgICAgaWYgKGNvbnN0cyA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGdvdG8gY29kZV9lcnJvcjsKKyAgICAgICAgICAgIG5hbWVzID0gcl9vYmplY3QocCk7CisgICAgICAgICAgICBpZiAobmFtZXMgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBnb3RvIGNvZGVfZXJyb3I7CisgICAgICAgICAgICB2YXJuYW1lcyA9IHJfb2JqZWN0KHApOworICAgICAgICAgICAgaWYgKHZhcm5hbWVzID09IE5VTEwpCisgICAgICAgICAgICAgICAgZ290byBjb2RlX2Vycm9yOworICAgICAgICAgICAgZnJlZXZhcnMgPSByX29iamVjdChwKTsKKyAgICAgICAgICAgIGlmIChmcmVldmFycyA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGdvdG8gY29kZV9lcnJvcjsKKyAgICAgICAgICAgIGNlbGx2YXJzID0gcl9vYmplY3QocCk7CisgICAgICAgICAgICBpZiAoY2VsbHZhcnMgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBnb3RvIGNvZGVfZXJyb3I7CisgICAgICAgICAgICBmaWxlbmFtZSA9IHJfb2JqZWN0KHApOworICAgICAgICAgICAgaWYgKGZpbGVuYW1lID09IE5VTEwpCisgICAgICAgICAgICAgICAgZ290byBjb2RlX2Vycm9yOworICAgICAgICAgICAgbmFtZSA9IHJfb2JqZWN0KHApOworICAgICAgICAgICAgaWYgKG5hbWUgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBnb3RvIGNvZGVfZXJyb3I7CisgICAgICAgICAgICBmaXJzdGxpbmVubyA9IChpbnQpcl9sb25nKHApOworICAgICAgICAgICAgbG5vdGFiID0gcl9vYmplY3QocCk7CisgICAgICAgICAgICBpZiAobG5vdGFiID09IE5VTEwpCisgICAgICAgICAgICAgICAgZ290byBjb2RlX2Vycm9yOwogCi0JCSAgY29kZV9lcnJvcjoKLQkJCVB5X1hERUNSRUYoY29kZSk7Ci0JCQlQeV9YREVDUkVGKGNvbnN0cyk7Ci0JCQlQeV9YREVDUkVGKG5hbWVzKTsKLQkJCVB5X1hERUNSRUYodmFybmFtZXMpOwotCQkJUHlfWERFQ1JFRihmcmVldmFycyk7Ci0JCQlQeV9YREVDUkVGKGNlbGx2YXJzKTsKLQkJCVB5X1hERUNSRUYoZmlsZW5hbWUpOwotCQkJUHlfWERFQ1JFRihuYW1lKTsKLQkJCVB5X1hERUNSRUYobG5vdGFiKTsKKyAgICAgICAgICAgIHYgPSAoUHlPYmplY3QgKikgUHlDb2RlX05ldygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdjb3VudCwgbmxvY2Fscywgc3RhY2tzaXplLCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlLCBjb25zdHMsIG5hbWVzLCB2YXJuYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVldmFycywgY2VsbHZhcnMsIGZpbGVuYW1lLCBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0bGluZW5vLCBsbm90YWIpOwogCi0JCX0KLQkJcmV0dmFsID0gdjsKLQkJYnJlYWs7CisgICAgICAgICAgY29kZV9lcnJvcjoKKyAgICAgICAgICAgIFB5X1hERUNSRUYoY29kZSk7CisgICAgICAgICAgICBQeV9YREVDUkVGKGNvbnN0cyk7CisgICAgICAgICAgICBQeV9YREVDUkVGKG5hbWVzKTsKKyAgICAgICAgICAgIFB5X1hERUNSRUYodmFybmFtZXMpOworICAgICAgICAgICAgUHlfWERFQ1JFRihmcmVldmFycyk7CisgICAgICAgICAgICBQeV9YREVDUkVGKGNlbGx2YXJzKTsKKyAgICAgICAgICAgIFB5X1hERUNSRUYoZmlsZW5hbWUpOworICAgICAgICAgICAgUHlfWERFQ1JFRihuYW1lKTsKKyAgICAgICAgICAgIFB5X1hERUNSRUYobG5vdGFiKTsKIAotCWRlZmF1bHQ6Ci0JCS8qIEJvZ3VzIGRhdGEgZ290IHdyaXR0ZW4sIHdoaWNoIGlzbid0IGlkZWFsLgotCQkgICBUaGlzIHdpbGwgbGV0IHlvdSBrZWVwIHdvcmtpbmcgYW5kIHJlY292ZXIuICovCi0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiYmFkIG1hcnNoYWwgZGF0YSIpOwotCQlyZXR2YWwgPSBOVUxMOwotCQlicmVhazsKKyAgICAgICAgfQorICAgICAgICByZXR2YWwgPSB2OworICAgICAgICBicmVhazsKIAotCX0KLQlwLT5kZXB0aC0tOwotCXJldHVybiByZXR2YWw7CisgICAgZGVmYXVsdDoKKyAgICAgICAgLyogQm9ndXMgZGF0YSBnb3Qgd3JpdHRlbiwgd2hpY2ggaXNuJ3QgaWRlYWwuCisgICAgICAgICAgIFRoaXMgd2lsbCBsZXQgeW91IGtlZXAgd29ya2luZyBhbmQgcmVjb3Zlci4gKi8KKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJiYWQgbWFyc2hhbCBkYXRhIik7CisgICAgICAgIHJldHZhbCA9IE5VTEw7CisgICAgICAgIGJyZWFrOworCisgICAgfQorICAgIHAtPmRlcHRoLS07CisgICAgcmV0dXJuIHJldHZhbDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHJlYWRfb2JqZWN0KFJGSUxFICpwKQogewotCVB5T2JqZWN0ICp2OwotCWlmIChQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAiWFhYIHJlYWRvYmplY3QgY2FsbGVkIHdpdGggZXhjZXB0aW9uIHNldFxuIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQl2ID0gcl9vYmplY3QocCk7Ci0JaWYgKHYgPT0gTlVMTCAmJiAhUHlFcnJfT2NjdXJyZWQoKSkKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIk5VTEwgb2JqZWN0IGluIG1hcnNoYWwgZGF0YSIpOwotCXJldHVybiB2OworICAgIFB5T2JqZWN0ICp2OworICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiWFhYIHJlYWRvYmplY3QgY2FsbGVkIHdpdGggZXhjZXB0aW9uIHNldFxuIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICB2ID0gcl9vYmplY3QocCk7CisgICAgaWYgKHYgPT0gTlVMTCAmJiAhUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIk5VTEwgb2JqZWN0IGluIG1hcnNoYWwgZGF0YSIpOworICAgIHJldHVybiB2OwogfQogCiBpbnQKIFB5TWFyc2hhbF9SZWFkU2hvcnRGcm9tRmlsZShGSUxFICpmcCkKIHsKLQlSRklMRSByZjsKLQlhc3NlcnQoZnApOwotCXJmLmZwID0gZnA7Ci0JcmYuc3RyaW5ncyA9IE5VTEw7Ci0JcmYuZW5kID0gcmYucHRyID0gTlVMTDsKLQlyZXR1cm4gcl9zaG9ydCgmcmYpOworICAgIFJGSUxFIHJmOworICAgIGFzc2VydChmcCk7CisgICAgcmYuZnAgPSBmcDsKKyAgICByZi5zdHJpbmdzID0gTlVMTDsKKyAgICByZi5lbmQgPSByZi5wdHIgPSBOVUxMOworICAgIHJldHVybiByX3Nob3J0KCZyZik7CiB9CiAKIGxvbmcKIFB5TWFyc2hhbF9SZWFkTG9uZ0Zyb21GaWxlKEZJTEUgKmZwKQogewotCVJGSUxFIHJmOwotCXJmLmZwID0gZnA7Ci0JcmYuc3RyaW5ncyA9IE5VTEw7Ci0JcmYucHRyID0gcmYuZW5kID0gTlVMTDsKLQlyZXR1cm4gcl9sb25nKCZyZik7CisgICAgUkZJTEUgcmY7CisgICAgcmYuZnAgPSBmcDsKKyAgICByZi5zdHJpbmdzID0gTlVMTDsKKyAgICByZi5wdHIgPSByZi5lbmQgPSBOVUxMOworICAgIHJldHVybiByX2xvbmcoJnJmKTsKIH0KIAogI2lmZGVmIEhBVkVfRlNUQVQKQEAgLTEwMjMsMTEgKzEwMjMsMTEgQEAKIHN0YXRpYyBvZmZfdAogZ2V0ZmlsZXNpemUoRklMRSAqZnApCiB7Ci0Jc3RydWN0IHN0YXQgc3Q7Ci0JaWYgKGZzdGF0KGZpbGVubyhmcCksICZzdCkgIT0gMCkKLQkJcmV0dXJuIC0xOwotCWVsc2UKLQkJcmV0dXJuIHN0LnN0X3NpemU7CisgICAgc3RydWN0IHN0YXQgc3Q7CisgICAgaWYgKGZzdGF0KGZpbGVubyhmcCksICZzdCkgIT0gMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIHN0LnN0X3NpemU7CiB9CiAjZW5kaWYKIApAQCAtMTA0NiwzNSArMTA0NiwzNSBAQAogI2RlZmluZSBTTUFMTF9GSUxFX0xJTUlUICgxTCA8PCAxNCkKICNkZWZpbmUgUkVBU09OQUJMRV9GSUxFX0xJTUlUICgxTCA8PCAxOCkKICNpZmRlZiBIQVZFX0ZTVEFUCi0Jb2ZmX3QgZmlsZXNpemU7CisgICAgb2ZmX3QgZmlsZXNpemU7CiAjZW5kaWYKICNpZmRlZiBIQVZFX0ZTVEFUCi0JZmlsZXNpemUgPSBnZXRmaWxlc2l6ZShmcCk7Ci0JaWYgKGZpbGVzaXplID4gMCkgewotCQljaGFyIGJ1ZltTTUFMTF9GSUxFX0xJTUlUXTsKLQkJY2hhciogcEJ1ZiA9IE5VTEw7Ci0JCWlmIChmaWxlc2l6ZSA8PSBTTUFMTF9GSUxFX0xJTUlUKQotCQkJcEJ1ZiA9IGJ1ZjsKLQkJZWxzZSBpZiAoZmlsZXNpemUgPD0gUkVBU09OQUJMRV9GSUxFX0xJTUlUKQotCQkJcEJ1ZiA9IChjaGFyICopUHlNZW1fTUFMTE9DKGZpbGVzaXplKTsKLQkJaWYgKHBCdWYgIT0gTlVMTCkgewotCQkJUHlPYmplY3QqIHY7Ci0JCQlzaXplX3QgbjsKLQkJCS8qIGZpbGVzaXplIG11c3QgZml0IGludG8gYW4gaW50LCBiZWNhdXNlIGl0Ci0JCQkgICBpcyBzbWFsbGVyIHRoYW4gUkVBU09OQUJMRV9GSUxFX0xJTUlUICovCi0JCQluID0gZnJlYWQocEJ1ZiwgMSwgKGludClmaWxlc2l6ZSwgZnApOwotCQkJdiA9IFB5TWFyc2hhbF9SZWFkT2JqZWN0RnJvbVN0cmluZyhwQnVmLCBuKTsKLQkJCWlmIChwQnVmICE9IGJ1ZikKLQkJCQlQeU1lbV9GUkVFKHBCdWYpOwotCQkJcmV0dXJuIHY7Ci0JCX0KKyAgICBmaWxlc2l6ZSA9IGdldGZpbGVzaXplKGZwKTsKKyAgICBpZiAoZmlsZXNpemUgPiAwKSB7CisgICAgICAgIGNoYXIgYnVmW1NNQUxMX0ZJTEVfTElNSVRdOworICAgICAgICBjaGFyKiBwQnVmID0gTlVMTDsKKyAgICAgICAgaWYgKGZpbGVzaXplIDw9IFNNQUxMX0ZJTEVfTElNSVQpCisgICAgICAgICAgICBwQnVmID0gYnVmOworICAgICAgICBlbHNlIGlmIChmaWxlc2l6ZSA8PSBSRUFTT05BQkxFX0ZJTEVfTElNSVQpCisgICAgICAgICAgICBwQnVmID0gKGNoYXIgKilQeU1lbV9NQUxMT0MoZmlsZXNpemUpOworICAgICAgICBpZiAocEJ1ZiAhPSBOVUxMKSB7CisgICAgICAgICAgICBQeU9iamVjdCogdjsKKyAgICAgICAgICAgIHNpemVfdCBuOworICAgICAgICAgICAgLyogZmlsZXNpemUgbXVzdCBmaXQgaW50byBhbiBpbnQsIGJlY2F1c2UgaXQKKyAgICAgICAgICAgICAgIGlzIHNtYWxsZXIgdGhhbiBSRUFTT05BQkxFX0ZJTEVfTElNSVQgKi8KKyAgICAgICAgICAgIG4gPSBmcmVhZChwQnVmLCAxLCAoaW50KWZpbGVzaXplLCBmcCk7CisgICAgICAgICAgICB2ID0gUHlNYXJzaGFsX1JlYWRPYmplY3RGcm9tU3RyaW5nKHBCdWYsIG4pOworICAgICAgICAgICAgaWYgKHBCdWYgIT0gYnVmKQorICAgICAgICAgICAgICAgIFB5TWVtX0ZSRUUocEJ1Zik7CisgICAgICAgICAgICByZXR1cm4gdjsKKyAgICAgICAgfQogCi0JfQorICAgIH0KICNlbmRpZgotCS8qIFdlIGRvbid0IGhhdmUgZnN0YXQsIG9yIHdlIGRvIGJ1dCB0aGUgZmlsZSBpcyBsYXJnZXIgdGhhbgotCSAqIFJFQVNPTkFCTEVfRklMRV9MSU1JVCBvciBtYWxsb2MgZmFpbGVkIC0tIHJlYWQgYSBieXRlIGF0IGEgdGltZS4KLQkgKi8KLQlyZXR1cm4gUHlNYXJzaGFsX1JlYWRPYmplY3RGcm9tRmlsZShmcCk7CisgICAgLyogV2UgZG9uJ3QgaGF2ZSBmc3RhdCwgb3Igd2UgZG8gYnV0IHRoZSBmaWxlIGlzIGxhcmdlciB0aGFuCisgICAgICogUkVBU09OQUJMRV9GSUxFX0xJTUlUIG9yIG1hbGxvYyBmYWlsZWQgLS0gcmVhZCBhIGJ5dGUgYXQgYSB0aW1lLgorICAgICAqLworICAgIHJldHVybiBQeU1hcnNoYWxfUmVhZE9iamVjdEZyb21GaWxlKGZwKTsKIAogI3VuZGVmIFNNQUxMX0ZJTEVfTElNSVQKICN1bmRlZiBSRUFTT05BQkxFX0ZJTEVfTElNSVQKQEAgLTEwODMsNjYgKzEwODMsNjYgQEAKIFB5T2JqZWN0ICoKIFB5TWFyc2hhbF9SZWFkT2JqZWN0RnJvbUZpbGUoRklMRSAqZnApCiB7Ci0JUkZJTEUgcmY7Ci0JUHlPYmplY3QgKnJlc3VsdDsKLQlyZi5mcCA9IGZwOwotCXJmLnN0cmluZ3MgPSBQeUxpc3RfTmV3KDApOwotCXJmLmRlcHRoID0gMDsKLQlyZi5wdHIgPSByZi5lbmQgPSBOVUxMOwotCXJlc3VsdCA9IHJfb2JqZWN0KCZyZik7Ci0JUHlfREVDUkVGKHJmLnN0cmluZ3MpOwotCXJldHVybiByZXN1bHQ7CisgICAgUkZJTEUgcmY7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICByZi5mcCA9IGZwOworICAgIHJmLnN0cmluZ3MgPSBQeUxpc3RfTmV3KDApOworICAgIHJmLmRlcHRoID0gMDsKKyAgICByZi5wdHIgPSByZi5lbmQgPSBOVUxMOworICAgIHJlc3VsdCA9IHJfb2JqZWN0KCZyZik7CisgICAgUHlfREVDUkVGKHJmLnN0cmluZ3MpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIFB5T2JqZWN0ICoKIFB5TWFyc2hhbF9SZWFkT2JqZWN0RnJvbVN0cmluZyhjaGFyICpzdHIsIFB5X3NzaXplX3QgbGVuKQogewotCVJGSUxFIHJmOwotCVB5T2JqZWN0ICpyZXN1bHQ7Ci0JcmYuZnAgPSBOVUxMOwotCXJmLnB0ciA9IHN0cjsKLQlyZi5lbmQgPSBzdHIgKyBsZW47Ci0JcmYuc3RyaW5ncyA9IFB5TGlzdF9OZXcoMCk7Ci0JcmYuZGVwdGggPSAwOwotCXJlc3VsdCA9IHJfb2JqZWN0KCZyZik7Ci0JUHlfREVDUkVGKHJmLnN0cmluZ3MpOwotCXJldHVybiByZXN1bHQ7CisgICAgUkZJTEUgcmY7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICByZi5mcCA9IE5VTEw7CisgICAgcmYucHRyID0gc3RyOworICAgIHJmLmVuZCA9IHN0ciArIGxlbjsKKyAgICByZi5zdHJpbmdzID0gUHlMaXN0X05ldygwKTsKKyAgICByZi5kZXB0aCA9IDA7CisgICAgcmVzdWx0ID0gcl9vYmplY3QoJnJmKTsKKyAgICBQeV9ERUNSRUYocmYuc3RyaW5ncyk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogUHlPYmplY3QgKgogUHlNYXJzaGFsX1dyaXRlT2JqZWN0VG9TdHJpbmcoUHlPYmplY3QgKngsIGludCB2ZXJzaW9uKQogewotCVdGSUxFIHdmOwotCXdmLmZwID0gTlVMTDsKLQl3Zi5zdHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKU5VTEwsIDUwKTsKLQlpZiAod2Yuc3RyID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXdmLnB0ciA9IFB5U3RyaW5nX0FTX1NUUklORygoUHlTdHJpbmdPYmplY3QgKil3Zi5zdHIpOwotCXdmLmVuZCA9IHdmLnB0ciArIFB5U3RyaW5nX1NpemUod2Yuc3RyKTsKLQl3Zi5lcnJvciA9IDA7Ci0Jd2YuZGVwdGggPSAwOwotCXdmLnZlcnNpb24gPSB2ZXJzaW9uOwotCXdmLnN0cmluZ3MgPSAodmVyc2lvbiA+IDApID8gUHlEaWN0X05ldygpIDogTlVMTDsKLQl3X29iamVjdCh4LCAmd2YpOwotCVB5X1hERUNSRUYod2Yuc3RyaW5ncyk7Ci0JaWYgKHdmLnN0ciAhPSBOVUxMKSB7Ci0JCWNoYXIgKmJhc2UgPSBQeVN0cmluZ19BU19TVFJJTkcoKFB5U3RyaW5nT2JqZWN0ICopd2Yuc3RyKTsKLQkJaWYgKHdmLnB0ciAtIGJhc2UgPiBQWV9TU0laRV9UX01BWCkgewotCQkJUHlfREVDUkVGKHdmLnN0cik7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJCQkJInRvbyBtdWNoIG1hcnNoYWxsIGRhdGEgZm9yIGEgc3RyaW5nIik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlfUHlTdHJpbmdfUmVzaXplKCZ3Zi5zdHIsIChQeV9zc2l6ZV90KSh3Zi5wdHIgLSBiYXNlKSk7Ci0JfQotCWlmICh3Zi5lcnJvcikgewotCQlQeV9YREVDUkVGKHdmLnN0cik7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSh3Zi5lcnJvcj09MSk/InVubWFyc2hhbGxhYmxlIG9iamVjdCIKLQkJCQk6Im9iamVjdCB0b28gZGVlcGx5IG5lc3RlZCB0byBtYXJzaGFsIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gd2Yuc3RyOworICAgIFdGSUxFIHdmOworICAgIHdmLmZwID0gTlVMTDsKKyAgICB3Zi5zdHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKU5VTEwsIDUwKTsKKyAgICBpZiAod2Yuc3RyID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHdmLnB0ciA9IFB5U3RyaW5nX0FTX1NUUklORygoUHlTdHJpbmdPYmplY3QgKil3Zi5zdHIpOworICAgIHdmLmVuZCA9IHdmLnB0ciArIFB5U3RyaW5nX1NpemUod2Yuc3RyKTsKKyAgICB3Zi5lcnJvciA9IDA7CisgICAgd2YuZGVwdGggPSAwOworICAgIHdmLnZlcnNpb24gPSB2ZXJzaW9uOworICAgIHdmLnN0cmluZ3MgPSAodmVyc2lvbiA+IDApID8gUHlEaWN0X05ldygpIDogTlVMTDsKKyAgICB3X29iamVjdCh4LCAmd2YpOworICAgIFB5X1hERUNSRUYod2Yuc3RyaW5ncyk7CisgICAgaWYgKHdmLnN0ciAhPSBOVUxMKSB7CisgICAgICAgIGNoYXIgKmJhc2UgPSBQeVN0cmluZ19BU19TVFJJTkcoKFB5U3RyaW5nT2JqZWN0ICopd2Yuc3RyKTsKKyAgICAgICAgaWYgKHdmLnB0ciAtIGJhc2UgPiBQWV9TU0laRV9UX01BWCkgeworICAgICAgICAgICAgUHlfREVDUkVGKHdmLnN0cik7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidG9vIG11Y2ggbWFyc2hhbGwgZGF0YSBmb3IgYSBzdHJpbmciKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIF9QeVN0cmluZ19SZXNpemUoJndmLnN0ciwgKFB5X3NzaXplX3QpKHdmLnB0ciAtIGJhc2UpKTsKKyAgICB9CisgICAgaWYgKHdmLmVycm9yKSB7CisgICAgICAgIFB5X1hERUNSRUYod2Yuc3RyKTsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAod2YuZXJyb3I9PTEpPyJ1bm1hcnNoYWxsYWJsZSBvYmplY3QiCisgICAgICAgICAgICAgICAgICAgICAgICA6Im9iamVjdCB0b28gZGVlcGx5IG5lc3RlZCB0byBtYXJzaGFsIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gd2Yuc3RyOwogfQogCiAvKiBBbmQgYW4gaW50ZXJmYWNlIGZvciBQeXRob24gcHJvZ3JhbXMuLi4gKi8KQEAgLTExNTAsMzQgKzExNTAsMzQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBtYXJzaGFsX2R1bXAoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVdGSUxFIHdmOwotCVB5T2JqZWN0ICp4OwotCVB5T2JqZWN0ICpmOwotCWludCB2ZXJzaW9uID0gUHlfTUFSU0hBTF9WRVJTSU9OOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT098aTpkdW1wIiwgJngsICZmLCAmdmVyc2lvbikpCi0JCXJldHVybiBOVUxMOwotCWlmICghUHlGaWxlX0NoZWNrKGYpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJIm1hcnNoYWwuZHVtcCgpIDJuZCBhcmcgbXVzdCBiZSBmaWxlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQl3Zi5mcCA9IFB5RmlsZV9Bc0ZpbGUoZik7Ci0Jd2Yuc3RyID0gTlVMTDsKLQl3Zi5wdHIgPSB3Zi5lbmQgPSBOVUxMOwotCXdmLmVycm9yID0gMDsKLQl3Zi5kZXB0aCA9IDA7Ci0Jd2Yuc3RyaW5ncyA9ICh2ZXJzaW9uID4gMCkgPyBQeURpY3RfTmV3KCkgOiAwOwotCXdmLnZlcnNpb24gPSB2ZXJzaW9uOwotCXdfb2JqZWN0KHgsICZ3Zik7Ci0JUHlfWERFQ1JFRih3Zi5zdHJpbmdzKTsKLQlpZiAod2YuZXJyb3IpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJKHdmLmVycm9yPT0xKT8idW5tYXJzaGFsbGFibGUgb2JqZWN0IgotCQkJCToib2JqZWN0IHRvbyBkZWVwbHkgbmVzdGVkIHRvIG1hcnNoYWwiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBXRklMRSB3ZjsKKyAgICBQeU9iamVjdCAqeDsKKyAgICBQeU9iamVjdCAqZjsKKyAgICBpbnQgdmVyc2lvbiA9IFB5X01BUlNIQUxfVkVSU0lPTjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9PfGk6ZHVtcCIsICZ4LCAmZiwgJnZlcnNpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5RmlsZV9DaGVjayhmKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIm1hcnNoYWwuZHVtcCgpIDJuZCBhcmcgbXVzdCBiZSBmaWxlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICB3Zi5mcCA9IFB5RmlsZV9Bc0ZpbGUoZik7CisgICAgd2Yuc3RyID0gTlVMTDsKKyAgICB3Zi5wdHIgPSB3Zi5lbmQgPSBOVUxMOworICAgIHdmLmVycm9yID0gMDsKKyAgICB3Zi5kZXB0aCA9IDA7CisgICAgd2Yuc3RyaW5ncyA9ICh2ZXJzaW9uID4gMCkgPyBQeURpY3RfTmV3KCkgOiAwOworICAgIHdmLnZlcnNpb24gPSB2ZXJzaW9uOworICAgIHdfb2JqZWN0KHgsICZ3Zik7CisgICAgUHlfWERFQ1JFRih3Zi5zdHJpbmdzKTsKKyAgICBpZiAod2YuZXJyb3IpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAod2YuZXJyb3I9PTEpPyJ1bm1hcnNoYWxsYWJsZSBvYmplY3QiCisgICAgICAgICAgICAgICAgICAgICAgICA6Im9iamVjdCB0b28gZGVlcGx5IG5lc3RlZCB0byBtYXJzaGFsIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIFB5RG9jX1NUUlZBUihkdW1wX2RvYywKQEAgLTExOTcsMTkgKzExOTcsMTkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBtYXJzaGFsX2xvYWQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpmKQogewotCVJGSUxFIHJmOwotCVB5T2JqZWN0ICpyZXN1bHQ7Ci0JaWYgKCFQeUZpbGVfQ2hlY2soZikpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkibWFyc2hhbC5sb2FkKCkgYXJnIG11c3QgYmUgZmlsZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmYuZnAgPSBQeUZpbGVfQXNGaWxlKGYpOwotCXJmLnN0cmluZ3MgPSBQeUxpc3RfTmV3KDApOwotCXJmLmRlcHRoID0gMDsKLQlyZXN1bHQgPSByZWFkX29iamVjdCgmcmYpOwotCVB5X0RFQ1JFRihyZi5zdHJpbmdzKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIFJGSUxFIHJmOworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisgICAgaWYgKCFQeUZpbGVfQ2hlY2soZikpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJtYXJzaGFsLmxvYWQoKSBhcmcgbXVzdCBiZSBmaWxlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZi5mcCA9IFB5RmlsZV9Bc0ZpbGUoZik7CisgICAgcmYuc3RyaW5ncyA9IFB5TGlzdF9OZXcoMCk7CisgICAgcmYuZGVwdGggPSAwOworICAgIHJlc3VsdCA9IHJlYWRfb2JqZWN0KCZyZik7CisgICAgUHlfREVDUkVGKHJmLnN0cmluZ3MpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIFB5RG9jX1NUUlZBUihsb2FkX2RvYywKQEAgLTEyMjgsMTEgKzEyMjgsMTEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBtYXJzaGFsX2R1bXBzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqeDsKLQlpbnQgdmVyc2lvbiA9IFB5X01BUlNIQUxfVkVSU0lPTjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98aTpkdW1wcyIsICZ4LCAmdmVyc2lvbikpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBQeU1hcnNoYWxfV3JpdGVPYmplY3RUb1N0cmluZyh4LCB2ZXJzaW9uKTsKKyAgICBQeU9iamVjdCAqeDsKKyAgICBpbnQgdmVyc2lvbiA9IFB5X01BUlNIQUxfVkVSU0lPTjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98aTpkdW1wcyIsICZ4LCAmdmVyc2lvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeU1hcnNoYWxfV3JpdGVPYmplY3RUb1N0cmluZyh4LCB2ZXJzaW9uKTsKIH0KIAogUHlEb2NfU1RSVkFSKGR1bXBzX2RvYywKQEAgLTEyNDksMjAgKzEyNDksMjAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBtYXJzaGFsX2xvYWRzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlSRklMRSByZjsKLQljaGFyICpzOwotCVB5X3NzaXplX3QgbjsKLQlQeU9iamVjdCogcmVzdWx0OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyM6bG9hZHMiLCAmcywgJm4pKQotCQlyZXR1cm4gTlVMTDsKLQlyZi5mcCA9IE5VTEw7Ci0JcmYucHRyID0gczsKLQlyZi5lbmQgPSBzICsgbjsKLQlyZi5zdHJpbmdzID0gUHlMaXN0X05ldygwKTsKLQlyZi5kZXB0aCA9IDA7Ci0JcmVzdWx0ID0gcmVhZF9vYmplY3QoJnJmKTsKLQlQeV9ERUNSRUYocmYuc3RyaW5ncyk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBSRklMRSByZjsKKyAgICBjaGFyICpzOworICAgIFB5X3NzaXplX3QgbjsKKyAgICBQeU9iamVjdCogcmVzdWx0OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyM6bG9hZHMiLCAmcywgJm4pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZi5mcCA9IE5VTEw7CisgICAgcmYucHRyID0gczsKKyAgICByZi5lbmQgPSBzICsgbjsKKyAgICByZi5zdHJpbmdzID0gUHlMaXN0X05ldygwKTsKKyAgICByZi5kZXB0aCA9IDA7CisgICAgcmVzdWx0ID0gcmVhZF9vYmplY3QoJnJmKTsKKyAgICBQeV9ERUNSRUYocmYuc3RyaW5ncyk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogUHlEb2NfU1RSVkFSKGxvYWRzX2RvYywKQEAgLTEyNzMsMTEgKzEyNzMsMTEgQEAKIGlnbm9yZWQuIik7CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBtYXJzaGFsX21ldGhvZHNbXSA9IHsKLQl7ImR1bXAiLAltYXJzaGFsX2R1bXAsCU1FVEhfVkFSQVJHUywJZHVtcF9kb2N9LAotCXsibG9hZCIsCW1hcnNoYWxfbG9hZCwJTUVUSF9PLAkJbG9hZF9kb2N9LAotCXsiZHVtcHMiLAltYXJzaGFsX2R1bXBzLAlNRVRIX1ZBUkFSR1MsCWR1bXBzX2RvY30sCi0JeyJsb2FkcyIsCW1hcnNoYWxfbG9hZHMsCU1FVEhfVkFSQVJHUywJbG9hZHNfZG9jfSwKLQl7TlVMTCwJCU5VTEx9CQkvKiBzZW50aW5lbCAqLworICAgIHsiZHVtcCIsICAgICAgICAgICAgbWFyc2hhbF9kdW1wLCAgIE1FVEhfVkFSQVJHUywgICBkdW1wX2RvY30sCisgICAgeyJsb2FkIiwgICAgICAgICAgICBtYXJzaGFsX2xvYWQsICAgTUVUSF9PLCAgICAgICAgIGxvYWRfZG9jfSwKKyAgICB7ImR1bXBzIiwgICAgICAgICAgIG1hcnNoYWxfZHVtcHMsICBNRVRIX1ZBUkFSR1MsICAgZHVtcHNfZG9jfSwKKyAgICB7ImxvYWRzIiwgICAgICAgICAgIG1hcnNoYWxfbG9hZHMsICBNRVRIX1ZBUkFSR1MsICAgbG9hZHNfZG9jfSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogUHlEb2NfU1RSVkFSKG1hcnNoYWxfZG9jLApAQCAtMTMxMyw5ICsxMzEzLDkgQEAKIFB5TU9ESU5JVF9GVU5DCiBQeU1hcnNoYWxfSW5pdCh2b2lkKQogewotCVB5T2JqZWN0ICptb2QgPSBQeV9Jbml0TW9kdWxlMygibWFyc2hhbCIsIG1hcnNoYWxfbWV0aG9kcywKLQkJbWFyc2hhbF9kb2MpOwotCWlmIChtb2QgPT0gTlVMTCkKLQkJcmV0dXJuOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG1vZCwgInZlcnNpb24iLCBQeV9NQVJTSEFMX1ZFUlNJT04pOworICAgIFB5T2JqZWN0ICptb2QgPSBQeV9Jbml0TW9kdWxlMygibWFyc2hhbCIsIG1hcnNoYWxfbWV0aG9kcywKKyAgICAgICAgbWFyc2hhbF9kb2MpOworICAgIGlmIChtb2QgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG1vZCwgInZlcnNpb24iLCBQeV9NQVJTSEFMX1ZFUlNJT04pOwogfQpkaWZmIC0tZ2l0IGEvUHl0aG9uL21vZHN1cHBvcnQuYyBiL1B5dGhvbi9tb2RzdXBwb3J0LmMKaW5kZXggZDU0MTU4Zi4uNmVlNDhmMyAxMDA2NDQKLS0tIGEvUHl0aG9uL21vZHN1cHBvcnQuYworKysgYi9QeXRob24vbW9kc3VwcG9ydC5jCkBAIC0zMCw3NiArMzAsNzYgQEAKIAogUHlPYmplY3QgKgogUHlfSW5pdE1vZHVsZTQoY29uc3QgY2hhciAqbmFtZSwgUHlNZXRob2REZWYgKm1ldGhvZHMsIGNvbnN0IGNoYXIgKmRvYywKLQkgICAgICAgUHlPYmplY3QgKnBhc3N0aHJvdWdoLCBpbnQgbW9kdWxlX2FwaV92ZXJzaW9uKQorICAgICAgICAgICAgICAgUHlPYmplY3QgKnBhc3N0aHJvdWdoLCBpbnQgbW9kdWxlX2FwaV92ZXJzaW9uKQogewotCVB5T2JqZWN0ICptLCAqZCwgKnYsICpuOwotCVB5TWV0aG9kRGVmICptbDsKLQlpZiAoIVB5X0lzSW5pdGlhbGl6ZWQoKSkKLQkgICAgUHlfRmF0YWxFcnJvcigiSW50ZXJwcmV0ZXIgbm90IGluaXRpYWxpemVkICh2ZXJzaW9uIG1pc21hdGNoPykiKTsKLQlpZiAobW9kdWxlX2FwaV92ZXJzaW9uICE9IFBZVEhPTl9BUElfVkVSU0lPTikgewotCQljaGFyIG1lc3NhZ2VbNTEyXTsKLQkJUHlPU19zbnByaW50ZihtZXNzYWdlLCBzaXplb2YobWVzc2FnZSksIAotCQkJICAgICAgYXBpX3ZlcnNpb25fd2FybmluZywgbmFtZSwgCi0JCQkgICAgICBQWVRIT05fQVBJX1ZFUlNJT04sIG5hbWUsIAotCQkJICAgICAgbW9kdWxlX2FwaV92ZXJzaW9uKTsKLQkJaWYgKFB5RXJyX1dhcm4oUHlFeGNfUnVudGltZVdhcm5pbmcsIG1lc3NhZ2UpKSAKLQkJCXJldHVybiBOVUxMOwotCX0KLQkvKiBNYWtlIHN1cmUgbmFtZSBpcyBmdWxseSBxdWFsaWZpZWQuCisgICAgUHlPYmplY3QgKm0sICpkLCAqdiwgKm47CisgICAgUHlNZXRob2REZWYgKm1sOworICAgIGlmICghUHlfSXNJbml0aWFsaXplZCgpKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJJbnRlcnByZXRlciBub3QgaW5pdGlhbGl6ZWQgKHZlcnNpb24gbWlzbWF0Y2g/KSIpOworICAgIGlmIChtb2R1bGVfYXBpX3ZlcnNpb24gIT0gUFlUSE9OX0FQSV9WRVJTSU9OKSB7CisgICAgICAgIGNoYXIgbWVzc2FnZVs1MTJdOworICAgICAgICBQeU9TX3NucHJpbnRmKG1lc3NhZ2UsIHNpemVvZihtZXNzYWdlKSwKKyAgICAgICAgICAgICAgICAgICAgICBhcGlfdmVyc2lvbl93YXJuaW5nLCBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgIFBZVEhPTl9BUElfVkVSU0lPTiwgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVfYXBpX3ZlcnNpb24pOworICAgICAgICBpZiAoUHlFcnJfV2FybihQeUV4Y19SdW50aW1lV2FybmluZywgbWVzc2FnZSkpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgLyogTWFrZSBzdXJlIG5hbWUgaXMgZnVsbHkgcXVhbGlmaWVkLgogCi0JICAgVGhpcyBpcyBhIGJpdCBvZiBhIGhhY2s6IHdoZW4gdGhlIHNoYXJlZCBsaWJyYXJ5IGlzIGxvYWRlZCwKLQkgICB0aGUgbW9kdWxlIG5hbWUgaXMgInBhY2thZ2UubW9kdWxlIiwgYnV0IHRoZSBtb2R1bGUgY2FsbHMKLQkgICBQeV9Jbml0TW9kdWxlKigpIHdpdGgganVzdCAibW9kdWxlIiBmb3IgdGhlIG5hbWUuICBUaGUgc2hhcmVkCi0JICAgbGlicmFyeSBsb2FkZXIgc3F1aXJyZWxzIGF3YXkgdGhlIHRydWUgbmFtZSBvZiB0aGUgbW9kdWxlIGluCi0JICAgX1B5X1BhY2thZ2VDb250ZXh0LCBhbmQgUHlfSW5pdE1vZHVsZSooKSB3aWxsIHN1YnN0aXR1dGUgdGhpcwotCSAgIChpZiB0aGUgbmFtZSBhY3R1YWxseSBtYXRjaGVzKS4KLQkqLwotCWlmIChfUHlfUGFja2FnZUNvbnRleHQgIT0gTlVMTCkgewotCQljaGFyICpwID0gc3RycmNocihfUHlfUGFja2FnZUNvbnRleHQsICcuJyk7Ci0JCWlmIChwICE9IE5VTEwgJiYgc3RyY21wKG5hbWUsIHArMSkgPT0gMCkgewotCQkJbmFtZSA9IF9QeV9QYWNrYWdlQ29udGV4dDsKLQkJCV9QeV9QYWNrYWdlQ29udGV4dCA9IE5VTEw7Ci0JCX0KLQl9Ci0JaWYgKChtID0gUHlJbXBvcnRfQWRkTW9kdWxlKG5hbWUpKSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQlpZiAobWV0aG9kcyAhPSBOVUxMKSB7Ci0JCW4gPSBQeVN0cmluZ19Gcm9tU3RyaW5nKG5hbWUpOwotCQlpZiAobiA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWZvciAobWwgPSBtZXRob2RzOyBtbC0+bWxfbmFtZSAhPSBOVUxMOyBtbCsrKSB7Ci0JCQlpZiAoKG1sLT5tbF9mbGFncyAmIE1FVEhfQ0xBU1MpIHx8Ci0JCQkgICAgKG1sLT5tbF9mbGFncyAmIE1FVEhfU1RBVElDKSkgewotCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCQkJIm1vZHVsZSBmdW5jdGlvbnMgY2Fubm90IHNldCIKLQkJCQkJCSIgTUVUSF9DTEFTUyBvciBNRVRIX1NUQVRJQyIpOwotCQkJCVB5X0RFQ1JFRihuKTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJCXYgPSBQeUNGdW5jdGlvbl9OZXdFeChtbCwgcGFzc3Rocm91Z2gsIG4pOwotCQkJaWYgKHYgPT0gTlVMTCkgewotCQkJCVB5X0RFQ1JFRihuKTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJCWlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCBtbC0+bWxfbmFtZSwgdikgIT0gMCkgewotCQkJCVB5X0RFQ1JFRih2KTsKLQkJCQlQeV9ERUNSRUYobik7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCQlQeV9ERUNSRUYodik7Ci0JCX0KLQkJUHlfREVDUkVGKG4pOwotCX0KLQlpZiAoZG9jICE9IE5VTEwpIHsKLQkJdiA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoZG9jKTsKLQkJaWYgKHYgPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiX19kb2NfXyIsIHYpICE9IDApIHsKLQkJCVB5X1hERUNSRUYodik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlQeV9ERUNSRUYodik7Ci0JfQotCXJldHVybiBtOworICAgICAgIFRoaXMgaXMgYSBiaXQgb2YgYSBoYWNrOiB3aGVuIHRoZSBzaGFyZWQgbGlicmFyeSBpcyBsb2FkZWQsCisgICAgICAgdGhlIG1vZHVsZSBuYW1lIGlzICJwYWNrYWdlLm1vZHVsZSIsIGJ1dCB0aGUgbW9kdWxlIGNhbGxzCisgICAgICAgUHlfSW5pdE1vZHVsZSooKSB3aXRoIGp1c3QgIm1vZHVsZSIgZm9yIHRoZSBuYW1lLiAgVGhlIHNoYXJlZAorICAgICAgIGxpYnJhcnkgbG9hZGVyIHNxdWlycmVscyBhd2F5IHRoZSB0cnVlIG5hbWUgb2YgdGhlIG1vZHVsZSBpbgorICAgICAgIF9QeV9QYWNrYWdlQ29udGV4dCwgYW5kIFB5X0luaXRNb2R1bGUqKCkgd2lsbCBzdWJzdGl0dXRlIHRoaXMKKyAgICAgICAoaWYgdGhlIG5hbWUgYWN0dWFsbHkgbWF0Y2hlcykuCisgICAgKi8KKyAgICBpZiAoX1B5X1BhY2thZ2VDb250ZXh0ICE9IE5VTEwpIHsKKyAgICAgICAgY2hhciAqcCA9IHN0cnJjaHIoX1B5X1BhY2thZ2VDb250ZXh0LCAnLicpOworICAgICAgICBpZiAocCAhPSBOVUxMICYmIHN0cmNtcChuYW1lLCBwKzEpID09IDApIHsKKyAgICAgICAgICAgIG5hbWUgPSBfUHlfUGFja2FnZUNvbnRleHQ7CisgICAgICAgICAgICBfUHlfUGFja2FnZUNvbnRleHQgPSBOVUxMOworICAgICAgICB9CisgICAgfQorICAgIGlmICgobSA9IFB5SW1wb3J0X0FkZE1vZHVsZShuYW1lKSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZCA9IFB5TW9kdWxlX0dldERpY3QobSk7CisgICAgaWYgKG1ldGhvZHMgIT0gTlVMTCkgeworICAgICAgICBuID0gUHlTdHJpbmdfRnJvbVN0cmluZyhuYW1lKTsKKyAgICAgICAgaWYgKG4gPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBmb3IgKG1sID0gbWV0aG9kczsgbWwtPm1sX25hbWUgIT0gTlVMTDsgbWwrKykgeworICAgICAgICAgICAgaWYgKChtbC0+bWxfZmxhZ3MgJiBNRVRIX0NMQVNTKSB8fAorICAgICAgICAgICAgICAgIChtbC0+bWxfZmxhZ3MgJiBNRVRIX1NUQVRJQykpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1vZHVsZSBmdW5jdGlvbnMgY2Fubm90IHNldCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBNRVRIX0NMQVNTIG9yIE1FVEhfU1RBVElDIik7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKG4pOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdiA9IFB5Q0Z1bmN0aW9uX05ld0V4KG1sLCBwYXNzdGhyb3VnaCwgbik7CisgICAgICAgICAgICBpZiAodiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKG4pOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsIG1sLT5tbF9uYW1lLCB2KSAhPSAwKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihuKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgfQorICAgICAgICBQeV9ERUNSRUYobik7CisgICAgfQorICAgIGlmIChkb2MgIT0gTlVMTCkgeworICAgICAgICB2ID0gUHlTdHJpbmdfRnJvbVN0cmluZyhkb2MpOworICAgICAgICBpZiAodiA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJfX2RvY19fIiwgdikgIT0gMCkgeworICAgICAgICAgICAgUHlfWERFQ1JFRih2KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICB9CisgICAgcmV0dXJuIG07CiB9CiAKIApAQCAtMTA4LDQxICsxMDgsNDEgQEAKIHN0YXRpYyBpbnQKIGNvdW50Zm9ybWF0KGNvbnN0IGNoYXIgKmZvcm1hdCwgaW50IGVuZGNoYXIpCiB7Ci0JaW50IGNvdW50ID0gMDsKLQlpbnQgbGV2ZWwgPSAwOwotCXdoaWxlIChsZXZlbCA+IDAgfHwgKmZvcm1hdCAhPSBlbmRjaGFyKSB7Ci0JCXN3aXRjaCAoKmZvcm1hdCkgewotCQljYXNlICdcMCc6Ci0JCQkvKiBQcmVtYXR1cmUgZW5kICovCi0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCi0JCQkJCSJ1bm1hdGNoZWQgcGFyZW4gaW4gZm9ybWF0Iik7Ci0JCQlyZXR1cm4gLTE7Ci0JCWNhc2UgJygnOgotCQljYXNlICdbJzoKLQkJY2FzZSAneyc6Ci0JCQlpZiAobGV2ZWwgPT0gMCkKLQkJCQljb3VudCsrOwotCQkJbGV2ZWwrKzsKLQkJCWJyZWFrOwotCQljYXNlICcpJzoKLQkJY2FzZSAnXSc6Ci0JCWNhc2UgJ30nOgotCQkJbGV2ZWwtLTsKLQkJCWJyZWFrOwotCQljYXNlICcjJzoKLQkJY2FzZSAnJic6Ci0JCWNhc2UgJywnOgotCQljYXNlICc6JzoKLQkJY2FzZSAnICc6Ci0JCWNhc2UgJ1x0JzoKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJaWYgKGxldmVsID09IDApCi0JCQkJY291bnQrKzsKLQkJfQotCQlmb3JtYXQrKzsKLQl9Ci0JcmV0dXJuIGNvdW50OworICAgIGludCBjb3VudCA9IDA7CisgICAgaW50IGxldmVsID0gMDsKKyAgICB3aGlsZSAobGV2ZWwgPiAwIHx8ICpmb3JtYXQgIT0gZW5kY2hhcikgeworICAgICAgICBzd2l0Y2ggKCpmb3JtYXQpIHsKKyAgICAgICAgY2FzZSAnXDAnOgorICAgICAgICAgICAgLyogUHJlbWF0dXJlIGVuZCAqLworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bm1hdGNoZWQgcGFyZW4gaW4gZm9ybWF0Iik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGNhc2UgJygnOgorICAgICAgICBjYXNlICdbJzoKKyAgICAgICAgY2FzZSAneyc6CisgICAgICAgICAgICBpZiAobGV2ZWwgPT0gMCkKKyAgICAgICAgICAgICAgICBjb3VudCsrOworICAgICAgICAgICAgbGV2ZWwrKzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICcpJzoKKyAgICAgICAgY2FzZSAnXSc6CisgICAgICAgIGNhc2UgJ30nOgorICAgICAgICAgICAgbGV2ZWwtLTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICcjJzoKKyAgICAgICAgY2FzZSAnJic6CisgICAgICAgIGNhc2UgJywnOgorICAgICAgICBjYXNlICc6JzoKKyAgICAgICAgY2FzZSAnICc6CisgICAgICAgIGNhc2UgJ1x0JzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgaWYgKGxldmVsID09IDApCisgICAgICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgfQorICAgICAgICBmb3JtYXQrKzsKKyAgICB9CisgICAgcmV0dXJuIGNvdW50OwogfQogCiAKQEAgLTE1OCw0ODYgKzE1OCw0ODYgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBkb19ta2RpY3QoY29uc3QgY2hhciAqKnBfZm9ybWF0LCB2YV9saXN0ICpwX3ZhLCBpbnQgZW5kY2hhciwgaW50IG4sIGludCBmbGFncykKIHsKLQlQeU9iamVjdCAqZDsKLQlpbnQgaTsKLQlpbnQgaXRlbWZhaWxlZCA9IDA7Ci0JaWYgKG4gPCAwKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoKGQgPSBQeURpY3RfTmV3KCkpID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCS8qIE5vdGUgdGhhdCB3ZSBjYW4ndCBiYWlsIGltbWVkaWF0ZWx5IG9uIGVycm9yIGFzIHRoaXMgd2lsbCBsZWFrCi0JICAgcmVmY291bnRzIG9uIGFueSAnTicgYXJndW1lbnRzLiAqLwotCWZvciAoaSA9IDA7IGkgPCBuOyBpKz0gMikgewotCQlQeU9iamVjdCAqaywgKnY7Ci0JCWludCBlcnI7Ci0JCWsgPSBkb19ta3ZhbHVlKHBfZm9ybWF0LCBwX3ZhLCBmbGFncyk7Ci0JCWlmIChrID09IE5VTEwpIHsKLQkJCWl0ZW1mYWlsZWQgPSAxOwotCQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQkJayA9IFB5X05vbmU7Ci0JCX0KLQkJdiA9IGRvX21rdmFsdWUocF9mb3JtYXQsIHBfdmEsIGZsYWdzKTsKLQkJaWYgKHYgPT0gTlVMTCkgewotCQkJaXRlbWZhaWxlZCA9IDE7Ci0JCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCQl2ID0gUHlfTm9uZTsKLQkJfQotCQllcnIgPSBQeURpY3RfU2V0SXRlbShkLCBrLCB2KTsKLQkJUHlfREVDUkVGKGspOwotCQlQeV9ERUNSRUYodik7Ci0JCWlmIChlcnIgPCAwIHx8IGl0ZW1mYWlsZWQpIHsKLQkJCVB5X0RFQ1JFRihkKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQotCWlmIChkICE9IE5VTEwgJiYgKipwX2Zvcm1hdCAhPSBlbmRjaGFyKSB7Ci0JCVB5X0RFQ1JFRihkKTsKLQkJZCA9IE5VTEw7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKLQkJCQkiVW5tYXRjaGVkIHBhcmVuIGluIGZvcm1hdCIpOwotCX0KLQllbHNlIGlmIChlbmRjaGFyKQotCQkrKypwX2Zvcm1hdDsKLQlyZXR1cm4gZDsKKyAgICBQeU9iamVjdCAqZDsKKyAgICBpbnQgaTsKKyAgICBpbnQgaXRlbWZhaWxlZCA9IDA7CisgICAgaWYgKG4gPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoKGQgPSBQeURpY3RfTmV3KCkpID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIC8qIE5vdGUgdGhhdCB3ZSBjYW4ndCBiYWlsIGltbWVkaWF0ZWx5IG9uIGVycm9yIGFzIHRoaXMgd2lsbCBsZWFrCisgICAgICAgcmVmY291bnRzIG9uIGFueSAnTicgYXJndW1lbnRzLiAqLworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKz0gMikgeworICAgICAgICBQeU9iamVjdCAqaywgKnY7CisgICAgICAgIGludCBlcnI7CisgICAgICAgIGsgPSBkb19ta3ZhbHVlKHBfZm9ybWF0LCBwX3ZhLCBmbGFncyk7CisgICAgICAgIGlmIChrID09IE5VTEwpIHsKKyAgICAgICAgICAgIGl0ZW1mYWlsZWQgPSAxOworICAgICAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICAgICAgayA9IFB5X05vbmU7CisgICAgICAgIH0KKyAgICAgICAgdiA9IGRvX21rdmFsdWUocF9mb3JtYXQsIHBfdmEsIGZsYWdzKTsKKyAgICAgICAgaWYgKHYgPT0gTlVMTCkgeworICAgICAgICAgICAgaXRlbWZhaWxlZCA9IDE7CisgICAgICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgICAgICB2ID0gUHlfTm9uZTsKKyAgICAgICAgfQorICAgICAgICBlcnIgPSBQeURpY3RfU2V0SXRlbShkLCBrLCB2KTsKKyAgICAgICAgUHlfREVDUkVGKGspOworICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgIGlmIChlcnIgPCAwIHx8IGl0ZW1mYWlsZWQpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihkKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorICAgIGlmIChkICE9IE5VTEwgJiYgKipwX2Zvcm1hdCAhPSBlbmRjaGFyKSB7CisgICAgICAgIFB5X0RFQ1JFRihkKTsKKyAgICAgICAgZCA9IE5VTEw7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJVbm1hdGNoZWQgcGFyZW4gaW4gZm9ybWF0Iik7CisgICAgfQorICAgIGVsc2UgaWYgKGVuZGNoYXIpCisgICAgICAgICsrKnBfZm9ybWF0OworICAgIHJldHVybiBkOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZG9fbWtsaXN0KGNvbnN0IGNoYXIgKipwX2Zvcm1hdCwgdmFfbGlzdCAqcF92YSwgaW50IGVuZGNoYXIsIGludCBuLCBpbnQgZmxhZ3MpCiB7Ci0JUHlPYmplY3QgKnY7Ci0JaW50IGk7Ci0JaW50IGl0ZW1mYWlsZWQgPSAwOwotCWlmIChuIDwgMCkKLQkJcmV0dXJuIE5VTEw7Ci0JdiA9IFB5TGlzdF9OZXcobik7Ci0JaWYgKHYgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JLyogTm90ZSB0aGF0IHdlIGNhbid0IGJhaWwgaW1tZWRpYXRlbHkgb24gZXJyb3IgYXMgdGhpcyB3aWxsIGxlYWsKLQkgICByZWZjb3VudHMgb24gYW55ICdOJyBhcmd1bWVudHMuICovCi0JZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQlQeU9iamVjdCAqdyA9IGRvX21rdmFsdWUocF9mb3JtYXQsIHBfdmEsIGZsYWdzKTsKLQkJaWYgKHcgPT0gTlVMTCkgewotCQkJaXRlbWZhaWxlZCA9IDE7Ci0JCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCQl3ID0gUHlfTm9uZTsKLQkJfQotCQlQeUxpc3RfU0VUX0lURU0odiwgaSwgdyk7Ci0JfQorICAgIFB5T2JqZWN0ICp2OworICAgIGludCBpOworICAgIGludCBpdGVtZmFpbGVkID0gMDsKKyAgICBpZiAobiA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHYgPSBQeUxpc3RfTmV3KG4pOworICAgIGlmICh2ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIC8qIE5vdGUgdGhhdCB3ZSBjYW4ndCBiYWlsIGltbWVkaWF0ZWx5IG9uIGVycm9yIGFzIHRoaXMgd2lsbCBsZWFrCisgICAgICAgcmVmY291bnRzIG9uIGFueSAnTicgYXJndW1lbnRzLiAqLworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgUHlPYmplY3QgKncgPSBkb19ta3ZhbHVlKHBfZm9ybWF0LCBwX3ZhLCBmbGFncyk7CisgICAgICAgIGlmICh3ID09IE5VTEwpIHsKKyAgICAgICAgICAgIGl0ZW1mYWlsZWQgPSAxOworICAgICAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICAgICAgdyA9IFB5X05vbmU7CisgICAgICAgIH0KKyAgICAgICAgUHlMaXN0X1NFVF9JVEVNKHYsIGksIHcpOworICAgIH0KIAotCWlmIChpdGVtZmFpbGVkKSB7Ci0JCS8qIGRvX21rdmFsdWUoKSBzaG91bGQgaGF2ZSBhbHJlYWR5IHNldCBhbiBlcnJvciAqLwotCQlQeV9ERUNSRUYodik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoKipwX2Zvcm1hdCAhPSBlbmRjaGFyKSB7Ci0JCVB5X0RFQ1JFRih2KTsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAotCQkJCSJVbm1hdGNoZWQgcGFyZW4gaW4gZm9ybWF0Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoZW5kY2hhcikKLQkJKysqcF9mb3JtYXQ7Ci0JcmV0dXJuIHY7CisgICAgaWYgKGl0ZW1mYWlsZWQpIHsKKyAgICAgICAgLyogZG9fbWt2YWx1ZSgpIHNob3VsZCBoYXZlIGFscmVhZHkgc2V0IGFuIGVycm9yICovCisgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmICgqKnBfZm9ybWF0ICE9IGVuZGNoYXIpIHsKKyAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiVW5tYXRjaGVkIHBhcmVuIGluIGZvcm1hdCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKGVuZGNoYXIpCisgICAgICAgICsrKnBfZm9ybWF0OworICAgIHJldHVybiB2OwogfQogCiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQogc3RhdGljIGludAogX3VzdHJsZW4oUHlfVU5JQ09ERSAqdSkKIHsKLQlpbnQgaSA9IDA7Ci0JUHlfVU5JQ09ERSAqdiA9IHU7Ci0Jd2hpbGUgKCp2ICE9IDApIHsgaSsrOyB2Kys7IH0gCi0JcmV0dXJuIGk7CisgICAgaW50IGkgPSAwOworICAgIFB5X1VOSUNPREUgKnYgPSB1OworICAgIHdoaWxlICgqdiAhPSAwKSB7IGkrKzsgdisrOyB9CisgICAgcmV0dXJuIGk7CiB9CiAjZW5kaWYKIAogc3RhdGljIFB5T2JqZWN0ICoKIGRvX21rdHVwbGUoY29uc3QgY2hhciAqKnBfZm9ybWF0LCB2YV9saXN0ICpwX3ZhLCBpbnQgZW5kY2hhciwgaW50IG4sIGludCBmbGFncykKIHsKLQlQeU9iamVjdCAqdjsKLQlpbnQgaTsKLQlpbnQgaXRlbWZhaWxlZCA9IDA7Ci0JaWYgKG4gPCAwKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoKHYgPSBQeVR1cGxlX05ldyhuKSkgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JLyogTm90ZSB0aGF0IHdlIGNhbid0IGJhaWwgaW1tZWRpYXRlbHkgb24gZXJyb3IgYXMgdGhpcyB3aWxsIGxlYWsKLQkgICByZWZjb3VudHMgb24gYW55ICdOJyBhcmd1bWVudHMuICovCi0JZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQlQeU9iamVjdCAqdyA9IGRvX21rdmFsdWUocF9mb3JtYXQsIHBfdmEsIGZsYWdzKTsKLQkJaWYgKHcgPT0gTlVMTCkgewotCQkJaXRlbWZhaWxlZCA9IDE7Ci0JCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCQl3ID0gUHlfTm9uZTsKLQkJfQotCQlQeVR1cGxlX1NFVF9JVEVNKHYsIGksIHcpOwotCX0KLQlpZiAoaXRlbWZhaWxlZCkgewotCQkvKiBkb19ta3ZhbHVlKCkgc2hvdWxkIGhhdmUgYWxyZWFkeSBzZXQgYW4gZXJyb3IgKi8KLQkJUHlfREVDUkVGKHYpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKCoqcF9mb3JtYXQgIT0gZW5kY2hhcikgewotCQlQeV9ERUNSRUYodik7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKLQkJCQkiVW5tYXRjaGVkIHBhcmVuIGluIGZvcm1hdCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKGVuZGNoYXIpCi0JCSsrKnBfZm9ybWF0OwotCXJldHVybiB2OworICAgIFB5T2JqZWN0ICp2OworICAgIGludCBpOworICAgIGludCBpdGVtZmFpbGVkID0gMDsKKyAgICBpZiAobiA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICgodiA9IFB5VHVwbGVfTmV3KG4pKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAvKiBOb3RlIHRoYXQgd2UgY2FuJ3QgYmFpbCBpbW1lZGlhdGVseSBvbiBlcnJvciBhcyB0aGlzIHdpbGwgbGVhaworICAgICAgIHJlZmNvdW50cyBvbiBhbnkgJ04nIGFyZ3VtZW50cy4gKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIFB5T2JqZWN0ICp3ID0gZG9fbWt2YWx1ZShwX2Zvcm1hdCwgcF92YSwgZmxhZ3MpOworICAgICAgICBpZiAodyA9PSBOVUxMKSB7CisgICAgICAgICAgICBpdGVtZmFpbGVkID0gMTsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgICAgIHcgPSBQeV9Ob25lOworICAgICAgICB9CisgICAgICAgIFB5VHVwbGVfU0VUX0lURU0odiwgaSwgdyk7CisgICAgfQorICAgIGlmIChpdGVtZmFpbGVkKSB7CisgICAgICAgIC8qIGRvX21rdmFsdWUoKSBzaG91bGQgaGF2ZSBhbHJlYWR5IHNldCBhbiBlcnJvciAqLworICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoKipwX2Zvcm1hdCAhPSBlbmRjaGFyKSB7CisgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIlVubWF0Y2hlZCBwYXJlbiBpbiBmb3JtYXQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChlbmRjaGFyKQorICAgICAgICArKypwX2Zvcm1hdDsKKyAgICByZXR1cm4gdjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRvX21rdmFsdWUoY29uc3QgY2hhciAqKnBfZm9ybWF0LCB2YV9saXN0ICpwX3ZhLCBpbnQgZmxhZ3MpCiB7Ci0JZm9yICg7OykgewotCQlzd2l0Y2ggKCooKnBfZm9ybWF0KSsrKSB7Ci0JCWNhc2UgJygnOgotCQkJcmV0dXJuIGRvX21rdHVwbGUocF9mb3JtYXQsIHBfdmEsICcpJywKLQkJCQkJICBjb3VudGZvcm1hdCgqcF9mb3JtYXQsICcpJyksIGZsYWdzKTsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIHN3aXRjaCAoKigqcF9mb3JtYXQpKyspIHsKKyAgICAgICAgY2FzZSAnKCc6CisgICAgICAgICAgICByZXR1cm4gZG9fbWt0dXBsZShwX2Zvcm1hdCwgcF92YSwgJyknLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRmb3JtYXQoKnBfZm9ybWF0LCAnKScpLCBmbGFncyk7CiAKLQkJY2FzZSAnWyc6Ci0JCQlyZXR1cm4gZG9fbWtsaXN0KHBfZm9ybWF0LCBwX3ZhLCAnXScsCi0JCQkJCSBjb3VudGZvcm1hdCgqcF9mb3JtYXQsICddJyksIGZsYWdzKTsKKyAgICAgICAgY2FzZSAnWyc6CisgICAgICAgICAgICByZXR1cm4gZG9fbWtsaXN0KHBfZm9ybWF0LCBwX3ZhLCAnXScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50Zm9ybWF0KCpwX2Zvcm1hdCwgJ10nKSwgZmxhZ3MpOwogCi0JCWNhc2UgJ3snOgotCQkJcmV0dXJuIGRvX21rZGljdChwX2Zvcm1hdCwgcF92YSwgJ30nLAotCQkJCQkgY291bnRmb3JtYXQoKnBfZm9ybWF0LCAnfScpLCBmbGFncyk7CisgICAgICAgIGNhc2UgJ3snOgorICAgICAgICAgICAgcmV0dXJuIGRvX21rZGljdChwX2Zvcm1hdCwgcF92YSwgJ30nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudGZvcm1hdCgqcF9mb3JtYXQsICd9JyksIGZsYWdzKTsKIAotCQljYXNlICdiJzoKLQkJY2FzZSAnQic6Ci0JCWNhc2UgJ2gnOgotCQljYXNlICdpJzoKLQkJCXJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZyl2YV9hcmcoKnBfdmEsIGludCkpOwotCQkJCi0JCWNhc2UgJ0gnOgotCQkJcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKXZhX2FyZygqcF92YSwgdW5zaWduZWQgaW50KSk7CisgICAgICAgIGNhc2UgJ2InOgorICAgICAgICBjYXNlICdCJzoKKyAgICAgICAgY2FzZSAnaCc6CisgICAgICAgIGNhc2UgJ2knOgorICAgICAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKXZhX2FyZygqcF92YSwgaW50KSk7CiAKLQkJY2FzZSAnSSc6Ci0JCXsKLQkJCXVuc2lnbmVkIGludCBuOwotCQkJbiA9IHZhX2FyZygqcF92YSwgdW5zaWduZWQgaW50KTsKLQkJCWlmIChuID4gKHVuc2lnbmVkIGxvbmcpUHlJbnRfR2V0TWF4KCkpCi0JCQkJcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKCh1bnNpZ25lZCBsb25nKW4pOwotCQkJZWxzZQotCQkJCXJldHVybiBQeUludF9Gcm9tTG9uZyhuKTsKLQkJfQotCQkKLQkJY2FzZSAnbic6CisgICAgICAgIGNhc2UgJ0gnOgorICAgICAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKXZhX2FyZygqcF92YSwgdW5zaWduZWQgaW50KSk7CisKKyAgICAgICAgY2FzZSAnSSc6CisgICAgICAgIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBuOworICAgICAgICAgICAgbiA9IHZhX2FyZygqcF92YSwgdW5zaWduZWQgaW50KTsKKyAgICAgICAgICAgIGlmIChuID4gKHVuc2lnbmVkIGxvbmcpUHlJbnRfR2V0TWF4KCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKCh1bnNpZ25lZCBsb25nKW4pOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhuKTsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgJ24nOgogI2lmIFNJWkVPRl9TSVpFX1QhPVNJWkVPRl9MT05HCi0JCQlyZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QodmFfYXJnKCpwX3ZhLCBQeV9zc2l6ZV90KSk7CisgICAgICAgICAgICByZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QodmFfYXJnKCpwX3ZhLCBQeV9zc2l6ZV90KSk7CiAjZW5kaWYKLQkJCS8qIEZhbGwgdGhyb3VnaCBmcm9tICduJyB0byAnbCcgaWYgUHlfc3NpemVfdCBpcyBsb25nICovCi0JCWNhc2UgJ2wnOgotCQkJcmV0dXJuIFB5SW50X0Zyb21Mb25nKHZhX2FyZygqcF92YSwgbG9uZykpOworICAgICAgICAgICAgLyogRmFsbCB0aHJvdWdoIGZyb20gJ24nIHRvICdsJyBpZiBQeV9zc2l6ZV90IGlzIGxvbmcgKi8KKyAgICAgICAgY2FzZSAnbCc6CisgICAgICAgICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcodmFfYXJnKCpwX3ZhLCBsb25nKSk7CiAKLQkJY2FzZSAnayc6Ci0JCXsKLQkJCXVuc2lnbmVkIGxvbmcgbjsKLQkJCW4gPSB2YV9hcmcoKnBfdmEsIHVuc2lnbmVkIGxvbmcpOwotCQkJaWYgKG4gPiAodW5zaWduZWQgbG9uZylQeUludF9HZXRNYXgoKSkKLQkJCQlyZXR1cm4gUHlMb25nX0Zyb21VbnNpZ25lZExvbmcobik7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIFB5SW50X0Zyb21Mb25nKG4pOwotCQl9CisgICAgICAgIGNhc2UgJ2snOgorICAgICAgICB7CisgICAgICAgICAgICB1bnNpZ25lZCBsb25nIG47CisgICAgICAgICAgICBuID0gdmFfYXJnKCpwX3ZhLCB1bnNpZ25lZCBsb25nKTsKKyAgICAgICAgICAgIGlmIChuID4gKHVuc2lnbmVkIGxvbmcpUHlJbnRfR2V0TWF4KCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKG4pOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhuKTsKKyAgICAgICAgfQogCiAjaWZkZWYgSEFWRV9MT05HX0xPTkcKLQkJY2FzZSAnTCc6Ci0JCQlyZXR1cm4gUHlMb25nX0Zyb21Mb25nTG9uZygoUFlfTE9OR19MT05HKXZhX2FyZygqcF92YSwgUFlfTE9OR19MT05HKSk7CisgICAgICAgIGNhc2UgJ0wnOgorICAgICAgICAgICAgcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZ0xvbmcoKFBZX0xPTkdfTE9ORyl2YV9hcmcoKnBfdmEsIFBZX0xPTkdfTE9ORykpOwogCi0JCWNhc2UgJ0snOgotCQkJcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nTG9uZygoUFlfTE9OR19MT05HKXZhX2FyZygqcF92YSwgdW5zaWduZWQgUFlfTE9OR19MT05HKSk7CisgICAgICAgIGNhc2UgJ0snOgorICAgICAgICAgICAgcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nTG9uZygoUFlfTE9OR19MT05HKXZhX2FyZygqcF92YSwgdW5zaWduZWQgUFlfTE9OR19MT05HKSk7CiAjZW5kaWYKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JCWNhc2UgJ3UnOgotCQl7Ci0JCQlQeU9iamVjdCAqdjsKLQkJCVB5X1VOSUNPREUgKnUgPSB2YV9hcmcoKnBfdmEsIFB5X1VOSUNPREUgKik7Ci0JCQlQeV9zc2l6ZV90IG47CQotCQkJaWYgKCoqcF9mb3JtYXQgPT0gJyMnKSB7Ci0JCQkJKysqcF9mb3JtYXQ7Ci0JCQkJaWYgKGZsYWdzICYgRkxBR19TSVpFX1QpCi0JCQkJCW4gPSB2YV9hcmcoKnBfdmEsIFB5X3NzaXplX3QpOwotCQkJCWVsc2UKLQkJCQkJbiA9IHZhX2FyZygqcF92YSwgaW50KTsKLQkJCX0KLQkJCWVsc2UKLQkJCQluID0gLTE7Ci0JCQlpZiAodSA9PSBOVUxMKSB7Ci0JCQkJdiA9IFB5X05vbmU7Ci0JCQkJUHlfSU5DUkVGKHYpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKG4gPCAwKQotCQkJCQluID0gX3VzdHJsZW4odSk7Ci0JCQkJdiA9IFB5VW5pY29kZV9Gcm9tVW5pY29kZSh1LCBuKTsKLQkJCX0KLQkJCXJldHVybiB2OwotCQl9CisgICAgICAgIGNhc2UgJ3UnOgorICAgICAgICB7CisgICAgICAgICAgICBQeU9iamVjdCAqdjsKKyAgICAgICAgICAgIFB5X1VOSUNPREUgKnUgPSB2YV9hcmcoKnBfdmEsIFB5X1VOSUNPREUgKik7CisgICAgICAgICAgICBQeV9zc2l6ZV90IG47CisgICAgICAgICAgICBpZiAoKipwX2Zvcm1hdCA9PSAnIycpIHsKKyAgICAgICAgICAgICAgICArKypwX2Zvcm1hdDsKKyAgICAgICAgICAgICAgICBpZiAoZmxhZ3MgJiBGTEFHX1NJWkVfVCkKKyAgICAgICAgICAgICAgICAgICAgbiA9IHZhX2FyZygqcF92YSwgUHlfc3NpemVfdCk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBuID0gdmFfYXJnKCpwX3ZhLCBpbnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG4gPSAtMTsKKyAgICAgICAgICAgIGlmICh1ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICB2ID0gUHlfTm9uZTsKKyAgICAgICAgICAgICAgICBQeV9JTkNSRUYodik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAobiA8IDApCisgICAgICAgICAgICAgICAgICAgIG4gPSBfdXN0cmxlbih1KTsKKyAgICAgICAgICAgICAgICB2ID0gUHlVbmljb2RlX0Zyb21Vbmljb2RlKHUsIG4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHY7CisgICAgICAgIH0KICNlbmRpZgotCQljYXNlICdmJzoKLQkJY2FzZSAnZCc6Ci0JCQlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKAotCQkJCShkb3VibGUpdmFfYXJnKCpwX3ZhLCB2YV9kb3VibGUpKTsKKyAgICAgICAgY2FzZSAnZic6CisgICAgICAgIGNhc2UgJ2QnOgorICAgICAgICAgICAgcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZSgKKyAgICAgICAgICAgICAgICAoZG91YmxlKXZhX2FyZygqcF92YSwgdmFfZG91YmxlKSk7CiAKICNpZm5kZWYgV0lUSE9VVF9DT01QTEVYCi0JCWNhc2UgJ0QnOgotCQkJcmV0dXJuIFB5Q29tcGxleF9Gcm9tQ0NvbXBsZXgoCi0JCQkJKigoUHlfY29tcGxleCAqKXZhX2FyZygqcF92YSwgUHlfY29tcGxleCAqKSkpOworICAgICAgICBjYXNlICdEJzoKKyAgICAgICAgICAgIHJldHVybiBQeUNvbXBsZXhfRnJvbUNDb21wbGV4KAorICAgICAgICAgICAgICAgICooKFB5X2NvbXBsZXggKil2YV9hcmcoKnBfdmEsIFB5X2NvbXBsZXggKikpKTsKICNlbmRpZiAvKiBXSVRIT1VUX0NPTVBMRVggKi8KIAotCQljYXNlICdjJzoKLQkJewotCQkJY2hhciBwWzFdOwotCQkJcFswXSA9IChjaGFyKXZhX2FyZygqcF92YSwgaW50KTsKLQkJCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShwLCAxKTsKLQkJfQorICAgICAgICBjYXNlICdjJzoKKyAgICAgICAgeworICAgICAgICAgICAgY2hhciBwWzFdOworICAgICAgICAgICAgcFswXSA9IChjaGFyKXZhX2FyZygqcF92YSwgaW50KTsKKyAgICAgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShwLCAxKTsKKyAgICAgICAgfQogCi0JCWNhc2UgJ3MnOgotCQljYXNlICd6JzoKLQkJewotCQkJUHlPYmplY3QgKnY7Ci0JCQljaGFyICpzdHIgPSB2YV9hcmcoKnBfdmEsIGNoYXIgKik7Ci0JCQlQeV9zc2l6ZV90IG47Ci0JCQlpZiAoKipwX2Zvcm1hdCA9PSAnIycpIHsKLQkJCQkrKypwX2Zvcm1hdDsKLQkJCQlpZiAoZmxhZ3MgJiBGTEFHX1NJWkVfVCkKLQkJCQkJbiA9IHZhX2FyZygqcF92YSwgUHlfc3NpemVfdCk7Ci0JCQkJZWxzZQotCQkJCQluID0gdmFfYXJnKCpwX3ZhLCBpbnQpOwotCQkJfQotCQkJZWxzZQotCQkJCW4gPSAtMTsKLQkJCWlmIChzdHIgPT0gTlVMTCkgewotCQkJCXYgPSBQeV9Ob25lOwotCQkJCVB5X0lOQ1JFRih2KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmIChuIDwgMCkgewotCQkJCQlzaXplX3QgbSA9IHN0cmxlbihzdHIpOwotCQkJCQlpZiAobSA+IFBZX1NTSVpFX1RfTUFYKSB7Ci0JCQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJCQkJCQkic3RyaW5nIHRvbyBsb25nIGZvciBQeXRob24gc3RyaW5nIik7Ci0JCQkJCQlyZXR1cm4gTlVMTDsKLQkJCQkJfQotCQkJCQluID0gKFB5X3NzaXplX3QpbTsKLQkJCQl9Ci0JCQkJdiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHN0ciwgbik7Ci0JCQl9Ci0JCQlyZXR1cm4gdjsKLQkJfQorICAgICAgICBjYXNlICdzJzoKKyAgICAgICAgY2FzZSAneic6CisgICAgICAgIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICp2OworICAgICAgICAgICAgY2hhciAqc3RyID0gdmFfYXJnKCpwX3ZhLCBjaGFyICopOworICAgICAgICAgICAgUHlfc3NpemVfdCBuOworICAgICAgICAgICAgaWYgKCoqcF9mb3JtYXQgPT0gJyMnKSB7CisgICAgICAgICAgICAgICAgKysqcF9mb3JtYXQ7CisgICAgICAgICAgICAgICAgaWYgKGZsYWdzICYgRkxBR19TSVpFX1QpCisgICAgICAgICAgICAgICAgICAgIG4gPSB2YV9hcmcoKnBfdmEsIFB5X3NzaXplX3QpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgbiA9IHZhX2FyZygqcF92YSwgaW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBuID0gLTE7CisgICAgICAgICAgICBpZiAoc3RyID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICB2ID0gUHlfTm9uZTsKKyAgICAgICAgICAgICAgICBQeV9JTkNSRUYodik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAobiA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG0gPSBzdHJsZW4oc3RyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG0gPiBQWV9TU0laRV9UX01BWCkgeworICAgICAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN0cmluZyB0b28gbG9uZyBmb3IgUHl0aG9uIHN0cmluZyIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbiA9IChQeV9zc2l6ZV90KW07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzdHIsIG4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHY7CisgICAgICAgIH0KIAotCQljYXNlICdOJzoKLQkJY2FzZSAnUyc6Ci0JCWNhc2UgJ08nOgotCQlpZiAoKipwX2Zvcm1hdCA9PSAnJicpIHsKLQkJCXR5cGVkZWYgUHlPYmplY3QgKigqY29udmVydGVyKSh2b2lkICopOwotCQkJY29udmVydGVyIGZ1bmMgPSB2YV9hcmcoKnBfdmEsIGNvbnZlcnRlcik7Ci0JCQl2b2lkICphcmcgPSB2YV9hcmcoKnBfdmEsIHZvaWQgKik7Ci0JCQkrKypwX2Zvcm1hdDsKLQkJCXJldHVybiAoKmZ1bmMpKGFyZyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlQeU9iamVjdCAqdjsKLQkJCXYgPSB2YV9hcmcoKnBfdmEsIFB5T2JqZWN0ICopOwotCQkJaWYgKHYgIT0gTlVMTCkgewotCQkJCWlmICgqKCpwX2Zvcm1hdCAtIDEpICE9ICdOJykKLQkJCQkJUHlfSU5DUkVGKHYpOwotCQkJfQotCQkJZWxzZSBpZiAoIVB5RXJyX09jY3VycmVkKCkpCi0JCQkJLyogSWYgYSBOVUxMIHdhcyBwYXNzZWQKLQkJCQkgKiBiZWNhdXNlIGEgY2FsbCB0aGF0IHNob3VsZAotCQkJCSAqIGhhdmUgY29uc3RydWN0ZWQgYSB2YWx1ZQotCQkJCSAqIGZhaWxlZCwgdGhhdCdzIE9LLCBhbmQgd2UKLQkJCQkgKiBwYXNzIHRoZSBlcnJvciBvbjsgYnV0IGlmCi0JCQkJICogbm8gZXJyb3Igb2NjdXJyZWQgaXQncyBub3QKLQkJCQkgKiBjbGVhciB0aGF0IHRoZSBjYWxsZXIga25ldwotCQkJCSAqIHdoYXQgc2hlIHdhcyBkb2luZy4gKi8KLQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCi0JCQkJCSJOVUxMIG9iamVjdCBwYXNzZWQgdG8gUHlfQnVpbGRWYWx1ZSIpOwotCQkJcmV0dXJuIHY7Ci0JCX0KKyAgICAgICAgY2FzZSAnTic6CisgICAgICAgIGNhc2UgJ1MnOgorICAgICAgICBjYXNlICdPJzoKKyAgICAgICAgaWYgKCoqcF9mb3JtYXQgPT0gJyYnKSB7CisgICAgICAgICAgICB0eXBlZGVmIFB5T2JqZWN0ICooKmNvbnZlcnRlcikodm9pZCAqKTsKKyAgICAgICAgICAgIGNvbnZlcnRlciBmdW5jID0gdmFfYXJnKCpwX3ZhLCBjb252ZXJ0ZXIpOworICAgICAgICAgICAgdm9pZCAqYXJnID0gdmFfYXJnKCpwX3ZhLCB2b2lkICopOworICAgICAgICAgICAgKysqcF9mb3JtYXQ7CisgICAgICAgICAgICByZXR1cm4gKCpmdW5jKShhcmcpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgUHlPYmplY3QgKnY7CisgICAgICAgICAgICB2ID0gdmFfYXJnKCpwX3ZhLCBQeU9iamVjdCAqKTsKKyAgICAgICAgICAgIGlmICh2ICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpZiAoKigqcF9mb3JtYXQgLSAxKSAhPSAnTicpCisgICAgICAgICAgICAgICAgICAgIFB5X0lOQ1JFRih2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCFQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgICAgIC8qIElmIGEgTlVMTCB3YXMgcGFzc2VkCisgICAgICAgICAgICAgICAgICogYmVjYXVzZSBhIGNhbGwgdGhhdCBzaG91bGQKKyAgICAgICAgICAgICAgICAgKiBoYXZlIGNvbnN0cnVjdGVkIGEgdmFsdWUKKyAgICAgICAgICAgICAgICAgKiBmYWlsZWQsIHRoYXQncyBPSywgYW5kIHdlCisgICAgICAgICAgICAgICAgICogcGFzcyB0aGUgZXJyb3Igb247IGJ1dCBpZgorICAgICAgICAgICAgICAgICAqIG5vIGVycm9yIG9jY3VycmVkIGl0J3Mgbm90CisgICAgICAgICAgICAgICAgICogY2xlYXIgdGhhdCB0aGUgY2FsbGVyIGtuZXcKKyAgICAgICAgICAgICAgICAgKiB3aGF0IHNoZSB3YXMgZG9pbmcuICovCisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgICAgICAgICAiTlVMTCBvYmplY3QgcGFzc2VkIHRvIFB5X0J1aWxkVmFsdWUiKTsKKyAgICAgICAgICAgIHJldHVybiB2OworICAgICAgICB9CiAKLQkJY2FzZSAnOic6Ci0JCWNhc2UgJywnOgotCQljYXNlICcgJzoKLQkJY2FzZSAnXHQnOgotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgJzonOgorICAgICAgICBjYXNlICcsJzoKKyAgICAgICAgY2FzZSAnICc6CisgICAgICAgIGNhc2UgJ1x0JzoKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWRlZmF1bHQ6Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCi0JCQkJImJhZCBmb3JtYXQgY2hhciBwYXNzZWQgdG8gUHlfQnVpbGRWYWx1ZSIpOwotCQkJcmV0dXJuIE5VTEw7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgICAgICAgImJhZCBmb3JtYXQgY2hhciBwYXNzZWQgdG8gUHlfQnVpbGRWYWx1ZSIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkJfQotCX0KKyAgICAgICAgfQorICAgIH0KIH0KIAogCiBQeU9iamVjdCAqCiBQeV9CdWlsZFZhbHVlKGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQogewotCXZhX2xpc3QgdmE7Ci0JUHlPYmplY3QqIHJldHZhbDsKLQl2YV9zdGFydCh2YSwgZm9ybWF0KTsKLQlyZXR2YWwgPSB2YV9idWlsZF92YWx1ZShmb3JtYXQsIHZhLCAwKTsKLQl2YV9lbmQodmEpOwotCXJldHVybiByZXR2YWw7CisgICAgdmFfbGlzdCB2YTsKKyAgICBQeU9iamVjdCogcmV0dmFsOworICAgIHZhX3N0YXJ0KHZhLCBmb3JtYXQpOworICAgIHJldHZhbCA9IHZhX2J1aWxkX3ZhbHVlKGZvcm1hdCwgdmEsIDApOworICAgIHZhX2VuZCh2YSk7CisgICAgcmV0dXJuIHJldHZhbDsKIH0KIAogUHlPYmplY3QgKgogX1B5X0J1aWxkVmFsdWVfU2l6ZVQoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCiB7Ci0JdmFfbGlzdCB2YTsKLQlQeU9iamVjdCogcmV0dmFsOwotCXZhX3N0YXJ0KHZhLCBmb3JtYXQpOwotCXJldHZhbCA9IHZhX2J1aWxkX3ZhbHVlKGZvcm1hdCwgdmEsIEZMQUdfU0laRV9UKTsKLQl2YV9lbmQodmEpOwotCXJldHVybiByZXR2YWw7CisgICAgdmFfbGlzdCB2YTsKKyAgICBQeU9iamVjdCogcmV0dmFsOworICAgIHZhX3N0YXJ0KHZhLCBmb3JtYXQpOworICAgIHJldHZhbCA9IHZhX2J1aWxkX3ZhbHVlKGZvcm1hdCwgdmEsIEZMQUdfU0laRV9UKTsKKyAgICB2YV9lbmQodmEpOworICAgIHJldHVybiByZXR2YWw7CiB9CiAKIFB5T2JqZWN0ICoKIFB5X1ZhQnVpbGRWYWx1ZShjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgdmEpCiB7Ci0JcmV0dXJuIHZhX2J1aWxkX3ZhbHVlKGZvcm1hdCwgdmEsIDApOworICAgIHJldHVybiB2YV9idWlsZF92YWx1ZShmb3JtYXQsIHZhLCAwKTsKIH0KIAogUHlPYmplY3QgKgogX1B5X1ZhQnVpbGRWYWx1ZV9TaXplVChjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgdmEpCiB7Ci0JcmV0dXJuIHZhX2J1aWxkX3ZhbHVlKGZvcm1hdCwgdmEsIEZMQUdfU0laRV9UKTsKKyAgICByZXR1cm4gdmFfYnVpbGRfdmFsdWUoZm9ybWF0LCB2YSwgRkxBR19TSVpFX1QpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogdmFfYnVpbGRfdmFsdWUoY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IHZhLCBpbnQgZmxhZ3MpCiB7Ci0JY29uc3QgY2hhciAqZiA9IGZvcm1hdDsKLQlpbnQgbiA9IGNvdW50Zm9ybWF0KGYsICdcMCcpOwotCXZhX2xpc3QgbHZhOworICAgIGNvbnN0IGNoYXIgKmYgPSBmb3JtYXQ7CisgICAgaW50IG4gPSBjb3VudGZvcm1hdChmLCAnXDAnKTsKKyAgICB2YV9saXN0IGx2YTsKIAogI2lmZGVmIFZBX0xJU1RfSVNfQVJSQVkKLQltZW1jcHkobHZhLCB2YSwgc2l6ZW9mKHZhX2xpc3QpKTsKKyAgICBtZW1jcHkobHZhLCB2YSwgc2l6ZW9mKHZhX2xpc3QpKTsKICNlbHNlCiAjaWZkZWYgX192YV9jb3B5Ci0JX192YV9jb3B5KGx2YSwgdmEpOworICAgIF9fdmFfY29weShsdmEsIHZhKTsKICNlbHNlCi0JbHZhID0gdmE7CisgICAgbHZhID0gdmE7CiAjZW5kaWYKICNlbmRpZgogCi0JaWYgKG4gPCAwKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAobiA9PSAwKSB7Ci0JCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJcmV0dXJuIFB5X05vbmU7Ci0JfQotCWlmIChuID09IDEpCi0JCXJldHVybiBkb19ta3ZhbHVlKCZmLCAmbHZhLCBmbGFncyk7Ci0JcmV0dXJuIGRvX21rdHVwbGUoJmYsICZsdmEsICdcMCcsIG4sIGZsYWdzKTsKKyAgICBpZiAobiA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChuID09IDApIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICB9CisgICAgaWYgKG4gPT0gMSkKKyAgICAgICAgcmV0dXJuIGRvX21rdmFsdWUoJmYsICZsdmEsIGZsYWdzKTsKKyAgICByZXR1cm4gZG9fbWt0dXBsZSgmZiwgJmx2YSwgJ1wwJywgbiwgZmxhZ3MpOwogfQogCiAKIFB5T2JqZWN0ICoKIFB5RXZhbF9DYWxsRnVuY3Rpb24oUHlPYmplY3QgKm9iaiwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCiB7Ci0JdmFfbGlzdCB2YXJnczsKLQlQeU9iamVjdCAqYXJnczsKLQlQeU9iamVjdCAqcmVzOworICAgIHZhX2xpc3QgdmFyZ3M7CisgICAgUHlPYmplY3QgKmFyZ3M7CisgICAgUHlPYmplY3QgKnJlczsKIAotCXZhX3N0YXJ0KHZhcmdzLCBmb3JtYXQpOworICAgIHZhX3N0YXJ0KHZhcmdzLCBmb3JtYXQpOwogCi0JYXJncyA9IFB5X1ZhQnVpbGRWYWx1ZShmb3JtYXQsIHZhcmdzKTsKLQl2YV9lbmQodmFyZ3MpOworICAgIGFyZ3MgPSBQeV9WYUJ1aWxkVmFsdWUoZm9ybWF0LCB2YXJncyk7CisgICAgdmFfZW5kKHZhcmdzKTsKIAotCWlmIChhcmdzID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIGlmIChhcmdzID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JcmVzID0gUHlFdmFsX0NhbGxPYmplY3Qob2JqLCBhcmdzKTsKLQlQeV9ERUNSRUYoYXJncyk7CisgICAgcmVzID0gUHlFdmFsX0NhbGxPYmplY3Qob2JqLCBhcmdzKTsKKyAgICBQeV9ERUNSRUYoYXJncyk7CiAKLQlyZXR1cm4gcmVzOworICAgIHJldHVybiByZXM7CiB9CiAKIAogUHlPYmplY3QgKgogUHlFdmFsX0NhbGxNZXRob2QoUHlPYmplY3QgKm9iaiwgY29uc3QgY2hhciAqbWV0aG9kbmFtZSwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCiB7Ci0JdmFfbGlzdCB2YXJnczsKLQlQeU9iamVjdCAqbWV0aDsKLQlQeU9iamVjdCAqYXJnczsKLQlQeU9iamVjdCAqcmVzOworICAgIHZhX2xpc3QgdmFyZ3M7CisgICAgUHlPYmplY3QgKm1ldGg7CisgICAgUHlPYmplY3QgKmFyZ3M7CisgICAgUHlPYmplY3QgKnJlczsKIAotCW1ldGggPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKG9iaiwgbWV0aG9kbmFtZSk7Ci0JaWYgKG1ldGggPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgbWV0aCA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcob2JqLCBtZXRob2RuYW1lKTsKKyAgICBpZiAobWV0aCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXZhX3N0YXJ0KHZhcmdzLCBmb3JtYXQpOworICAgIHZhX3N0YXJ0KHZhcmdzLCBmb3JtYXQpOwogCi0JYXJncyA9IFB5X1ZhQnVpbGRWYWx1ZShmb3JtYXQsIHZhcmdzKTsKLQl2YV9lbmQodmFyZ3MpOworICAgIGFyZ3MgPSBQeV9WYUJ1aWxkVmFsdWUoZm9ybWF0LCB2YXJncyk7CisgICAgdmFfZW5kKHZhcmdzKTsKIAotCWlmIChhcmdzID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKG1ldGgpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKGFyZ3MgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYobWV0aCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXJlcyA9IFB5RXZhbF9DYWxsT2JqZWN0KG1ldGgsIGFyZ3MpOwotCVB5X0RFQ1JFRihtZXRoKTsKLQlQeV9ERUNSRUYoYXJncyk7CisgICAgcmVzID0gUHlFdmFsX0NhbGxPYmplY3QobWV0aCwgYXJncyk7CisgICAgUHlfREVDUkVGKG1ldGgpOworICAgIFB5X0RFQ1JFRihhcmdzKTsKIAotCXJldHVybiByZXM7CisgICAgcmV0dXJuIHJlczsKIH0KIAogaW50CiBQeU1vZHVsZV9BZGRPYmplY3QoUHlPYmplY3QgKm0sIGNvbnN0IGNoYXIgKm5hbWUsIFB5T2JqZWN0ICpvKQogewotCVB5T2JqZWN0ICpkaWN0OwotCWlmICghUHlNb2R1bGVfQ2hlY2sobSkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAiUHlNb2R1bGVfQWRkT2JqZWN0KCkgbmVlZHMgbW9kdWxlIGFzIGZpcnN0IGFyZyIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmICghbykgewotCQlpZiAoIVB5RXJyX09jY3VycmVkKCkpCi0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCQkiUHlNb2R1bGVfQWRkT2JqZWN0KCkgbmVlZHMgbm9uLU5VTEwgdmFsdWUiKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICBQeU9iamVjdCAqZGljdDsKKyAgICBpZiAoIVB5TW9kdWxlX0NoZWNrKG0pKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICJQeU1vZHVsZV9BZGRPYmplY3QoKSBuZWVkcyBtb2R1bGUgYXMgZmlyc3QgYXJnIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKCFvKSB7CisgICAgICAgIGlmICghUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlB5TW9kdWxlX0FkZE9iamVjdCgpIG5lZWRzIG5vbi1OVUxMIHZhbHVlIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQlkaWN0ID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQlpZiAoZGljdCA9PSBOVUxMKSB7Ci0JCS8qIEludGVybmFsIGVycm9yIC0tIG1vZHVsZXMgbXVzdCBoYXZlIGEgZGljdCEgKi8KLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1N5c3RlbUVycm9yLCAibW9kdWxlICclcycgaGFzIG5vIF9fZGljdF9fIiwKLQkJCSAgICAgUHlNb2R1bGVfR2V0TmFtZShtKSk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsIG5hbWUsIG8pKQotCQlyZXR1cm4gLTE7Ci0JUHlfREVDUkVGKG8pOwotCXJldHVybiAwOworICAgIGRpY3QgPSBQeU1vZHVsZV9HZXREaWN0KG0pOworICAgIGlmIChkaWN0ID09IE5VTEwpIHsKKyAgICAgICAgLyogSW50ZXJuYWwgZXJyb3IgLS0gbW9kdWxlcyBtdXN0IGhhdmUgYSBkaWN0ISAqLworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfU3lzdGVtRXJyb3IsICJtb2R1bGUgJyVzJyBoYXMgbm8gX19kaWN0X18iLAorICAgICAgICAgICAgICAgICAgICAgUHlNb2R1bGVfR2V0TmFtZShtKSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsIG5hbWUsIG8pKQorICAgICAgICByZXR1cm4gLTE7CisgICAgUHlfREVDUkVGKG8pOworICAgIHJldHVybiAwOwogfQogCi1pbnQgCitpbnQKIFB5TW9kdWxlX0FkZEludENvbnN0YW50KFB5T2JqZWN0ICptLCBjb25zdCBjaGFyICpuYW1lLCBsb25nIHZhbHVlKQogewotCVB5T2JqZWN0ICpvID0gUHlJbnRfRnJvbUxvbmcodmFsdWUpOwotCWlmICghbykKLQkJcmV0dXJuIC0xOwotCWlmIChQeU1vZHVsZV9BZGRPYmplY3QobSwgbmFtZSwgbykgPT0gMCkKLQkJcmV0dXJuIDA7Ci0JUHlfREVDUkVGKG8pOwotCXJldHVybiAtMTsKKyAgICBQeU9iamVjdCAqbyA9IFB5SW50X0Zyb21Mb25nKHZhbHVlKTsKKyAgICBpZiAoIW8pCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAoUHlNb2R1bGVfQWRkT2JqZWN0KG0sIG5hbWUsIG8pID09IDApCisgICAgICAgIHJldHVybiAwOworICAgIFB5X0RFQ1JFRihvKTsKKyAgICByZXR1cm4gLTE7CiB9CiAKLWludCAKK2ludAogUHlNb2R1bGVfQWRkU3RyaW5nQ29uc3RhbnQoUHlPYmplY3QgKm0sIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbHVlKQogewotCVB5T2JqZWN0ICpvID0gUHlTdHJpbmdfRnJvbVN0cmluZyh2YWx1ZSk7Ci0JaWYgKCFvKQotCQlyZXR1cm4gLTE7Ci0JaWYgKFB5TW9kdWxlX0FkZE9iamVjdChtLCBuYW1lLCBvKSA9PSAwKQotCQlyZXR1cm4gMDsKLQlQeV9ERUNSRUYobyk7Ci0JcmV0dXJuIC0xOworICAgIFB5T2JqZWN0ICpvID0gUHlTdHJpbmdfRnJvbVN0cmluZyh2YWx1ZSk7CisgICAgaWYgKCFvKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKFB5TW9kdWxlX0FkZE9iamVjdChtLCBuYW1lLCBvKSA9PSAwKQorICAgICAgICByZXR1cm4gMDsKKyAgICBQeV9ERUNSRUYobyk7CisgICAgcmV0dXJuIC0xOwogfQpkaWZmIC0tZ2l0IGEvUHl0aG9uL215c25wcmludGYuYyBiL1B5dGhvbi9teXNucHJpbnRmLmMKaW5kZXggMzE3Mzg2My4uMzllM2ZmMSAxMDA2NDQKLS0tIGEvUHl0aG9uL215c25wcmludGYuYworKysgYi9QeXRob24vbXlzbnByaW50Zi5jCkBAIC0yMCwyMCArMjAsMjAgQEAKIAogICAgUmV0dXJuIHZhbHVlIChydik6CiAKLQlXaGVuIDAgPD0gcnYgPCBzaXplLCB0aGUgb3V0cHV0IGNvbnZlcnNpb24gd2FzIHVuZXhjZXB0aW9uYWwsIGFuZAotCXJ2IGNoYXJhY3RlcnMgd2VyZSB3cml0dGVuIHRvIHN0ciAoZXhjbHVkaW5nIGEgdHJhaWxpbmcgXDAgYnl0ZSBhdAotCXN0cltydl0pLgorICAgIFdoZW4gMCA8PSBydiA8IHNpemUsIHRoZSBvdXRwdXQgY29udmVyc2lvbiB3YXMgdW5leGNlcHRpb25hbCwgYW5kCisgICAgcnYgY2hhcmFjdGVycyB3ZXJlIHdyaXR0ZW4gdG8gc3RyIChleGNsdWRpbmcgYSB0cmFpbGluZyBcMCBieXRlIGF0CisgICAgc3RyW3J2XSkuCiAKLQlXaGVuIHJ2ID49IHNpemUsIG91dHB1dCBjb252ZXJzaW9uIHdhcyB0cnVuY2F0ZWQsIGFuZCBhIGJ1ZmZlciBvZgotCXNpemUgcnYrMSB3b3VsZCBoYXZlIGJlZW4gbmVlZGVkIHRvIGF2b2lkIHRydW5jYXRpb24uICBzdHJbc2l6ZS0xXQotCWlzIFwwIGluIHRoaXMgY2FzZS4KKyAgICBXaGVuIHJ2ID49IHNpemUsIG91dHB1dCBjb252ZXJzaW9uIHdhcyB0cnVuY2F0ZWQsIGFuZCBhIGJ1ZmZlciBvZgorICAgIHNpemUgcnYrMSB3b3VsZCBoYXZlIGJlZW4gbmVlZGVkIHRvIGF2b2lkIHRydW5jYXRpb24uICBzdHJbc2l6ZS0xXQorICAgIGlzIFwwIGluIHRoaXMgY2FzZS4KIAotCVdoZW4gcnYgPCAwLCAic29tZXRoaW5nIGJhZCBoYXBwZW5lZCIuICBzdHJbc2l6ZS0xXSBpcyBcMCBpbiB0aGlzCi0JY2FzZSB0b28sIGJ1dCB0aGUgcmVzdCBvZiBzdHIgaXMgdW5yZWxpYWJsZS4gIEl0IGNvdWxkIGJlIHRoYXQKLQlhbiBlcnJvciBpbiBmb3JtYXQgY29kZXMgd2FzIGRldGVjdGVkIGJ5IGxpYmMsIG9yIG9uIHBsYXRmb3JtcwotCXdpdGggYSBub24tQzk5IHZzbnByaW50ZiBzaW1wbHkgdGhhdCB0aGUgYnVmZmVyIHdhc24ndCBiaWcgZW5vdWdoCi0JdG8gYXZvaWQgdHJ1bmNhdGlvbiwgb3Igb24gcGxhdGZvcm1zIHdpdGhvdXQgYW55IHZzbnByaW50ZiB0aGF0Ci0JUHlNZW1fTWFsbG9jIGNvdWxkbid0IG9idGFpbiBzcGFjZSBmb3IgYSB0ZW1wIGJ1ZmZlci4KKyAgICBXaGVuIHJ2IDwgMCwgInNvbWV0aGluZyBiYWQgaGFwcGVuZWQiLiAgc3RyW3NpemUtMV0gaXMgXDAgaW4gdGhpcworICAgIGNhc2UgdG9vLCBidXQgdGhlIHJlc3Qgb2Ygc3RyIGlzIHVucmVsaWFibGUuICBJdCBjb3VsZCBiZSB0aGF0CisgICAgYW4gZXJyb3IgaW4gZm9ybWF0IGNvZGVzIHdhcyBkZXRlY3RlZCBieSBsaWJjLCBvciBvbiBwbGF0Zm9ybXMKKyAgICB3aXRoIGEgbm9uLUM5OSB2c25wcmludGYgc2ltcGx5IHRoYXQgdGhlIGJ1ZmZlciB3YXNuJ3QgYmlnIGVub3VnaAorICAgIHRvIGF2b2lkIHRydW5jYXRpb24sIG9yIG9uIHBsYXRmb3JtcyB3aXRob3V0IGFueSB2c25wcmludGYgdGhhdAorICAgIFB5TWVtX01hbGxvYyBjb3VsZG4ndCBvYnRhaW4gc3BhY2UgZm9yIGEgdGVtcCBidWZmZXIuCiAKICAgIENBVVRJT046ICBVbmxpa2UgQzk5LCBzdHIgIT0gTlVMTCBhbmQgc2l6ZSA+IDAgYXJlIHJlcXVpcmVkLgogKi8KQEAgLTQxLDY1ICs0MSw2NSBAQAogaW50CiBQeU9TX3NucHJpbnRmKGNoYXIgKnN0ciwgc2l6ZV90IHNpemUsIGNvbnN0ICBjaGFyICAqZm9ybWF0LCAuLi4pCiB7Ci0JaW50IHJjOwotCXZhX2xpc3QgdmE7CisgICAgaW50IHJjOworICAgIHZhX2xpc3QgdmE7CiAKLQl2YV9zdGFydCh2YSwgZm9ybWF0KTsKLQlyYyA9IFB5T1NfdnNucHJpbnRmKHN0ciwgc2l6ZSwgZm9ybWF0LCB2YSk7Ci0JdmFfZW5kKHZhKTsKLQlyZXR1cm4gcmM7CisgICAgdmFfc3RhcnQodmEsIGZvcm1hdCk7CisgICAgcmMgPSBQeU9TX3ZzbnByaW50ZihzdHIsIHNpemUsIGZvcm1hdCwgdmEpOworICAgIHZhX2VuZCh2YSk7CisgICAgcmV0dXJuIHJjOwogfQogCiBpbnQKIFB5T1NfdnNucHJpbnRmKGNoYXIgKnN0ciwgc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIgICpmb3JtYXQsIHZhX2xpc3QgdmEpCiB7Ci0JaW50IGxlbjsgIC8qICMgYnl0ZXMgd3JpdHRlbiwgZXhjbHVkaW5nIFwwICovCisgICAgaW50IGxlbjsgIC8qICMgYnl0ZXMgd3JpdHRlbiwgZXhjbHVkaW5nIFwwICovCiAjaWZkZWYgSEFWRV9TTlBSSU5URgogI2RlZmluZSBfUHlPU192c25wcmludGZfRVhUUkFfU1BBQ0UgMQogI2Vsc2UKICNkZWZpbmUgX1B5T1NfdnNucHJpbnRmX0VYVFJBX1NQQUNFIDUxMgotCWNoYXIgKmJ1ZmZlcjsKKyAgICBjaGFyICpidWZmZXI7CiAjZW5kaWYKLQlhc3NlcnQoc3RyICE9IE5VTEwpOwotCWFzc2VydChzaXplID4gMCk7Ci0JYXNzZXJ0KGZvcm1hdCAhPSBOVUxMKTsKLQkvKiBXZSB0YWtlIGEgc2l6ZV90IGFzIGlucHV0IGJ1dCByZXR1cm4gYW4gaW50LiAgU2FuaXR5IGNoZWNrCi0JICogb3VyIGlucHV0IHNvIHRoYXQgaXQgd29uJ3QgY2F1c2UgYW4gb3ZlcmZsb3cgaW4gdGhlCi0gICAgICAgICAqIHZzbnByaW50ZiByZXR1cm4gdmFsdWUgb3IgdGhlIGJ1ZmZlciBtYWxsb2Mgc2l6ZS4gICovCi0JaWYgKHNpemUgPiBJTlRfTUFYIC0gX1B5T1NfdnNucHJpbnRmX0VYVFJBX1NQQUNFKSB7Ci0JCWxlbiA9IC02NjY7Ci0JCWdvdG8gRG9uZTsKLQl9CisgICAgYXNzZXJ0KHN0ciAhPSBOVUxMKTsKKyAgICBhc3NlcnQoc2l6ZSA+IDApOworICAgIGFzc2VydChmb3JtYXQgIT0gTlVMTCk7CisgICAgLyogV2UgdGFrZSBhIHNpemVfdCBhcyBpbnB1dCBidXQgcmV0dXJuIGFuIGludC4gIFNhbml0eSBjaGVjaworICAgICAqIG91ciBpbnB1dCBzbyB0aGF0IGl0IHdvbid0IGNhdXNlIGFuIG92ZXJmbG93IGluIHRoZQorICAgICAqIHZzbnByaW50ZiByZXR1cm4gdmFsdWUgb3IgdGhlIGJ1ZmZlciBtYWxsb2Mgc2l6ZS4gICovCisgICAgaWYgKHNpemUgPiBJTlRfTUFYIC0gX1B5T1NfdnNucHJpbnRmX0VYVFJBX1NQQUNFKSB7CisgICAgICAgIGxlbiA9IC02NjY7CisgICAgICAgIGdvdG8gRG9uZTsKKyAgICB9CiAKICNpZmRlZiBIQVZFX1NOUFJJTlRGCi0JbGVuID0gdnNucHJpbnRmKHN0ciwgc2l6ZSwgZm9ybWF0LCB2YSk7CisgICAgbGVuID0gdnNucHJpbnRmKHN0ciwgc2l6ZSwgZm9ybWF0LCB2YSk7CiAjZWxzZQotCS8qIEVtdWxhdGUgaXQuICovCi0JYnVmZmVyID0gUHlNZW1fTUFMTE9DKHNpemUgKyBfUHlPU192c25wcmludGZfRVhUUkFfU1BBQ0UpOwotCWlmIChidWZmZXIgPT0gTlVMTCkgewotCQlsZW4gPSAtNjY2OwotCQlnb3RvIERvbmU7Ci0JfQorICAgIC8qIEVtdWxhdGUgaXQuICovCisgICAgYnVmZmVyID0gUHlNZW1fTUFMTE9DKHNpemUgKyBfUHlPU192c25wcmludGZfRVhUUkFfU1BBQ0UpOworICAgIGlmIChidWZmZXIgPT0gTlVMTCkgeworICAgICAgICBsZW4gPSAtNjY2OworICAgICAgICBnb3RvIERvbmU7CisgICAgfQogCi0JbGVuID0gdnNwcmludGYoYnVmZmVyLCBmb3JtYXQsIHZhKTsKLQlpZiAobGVuIDwgMCkKLQkJLyogaWdub3JlIHRoZSBlcnJvciAqLzsKKyAgICBsZW4gPSB2c3ByaW50ZihidWZmZXIsIGZvcm1hdCwgdmEpOworICAgIGlmIChsZW4gPCAwKQorICAgICAgICAvKiBpZ25vcmUgdGhlIGVycm9yICovOwogCi0JZWxzZSBpZiAoKHNpemVfdClsZW4gPj0gc2l6ZSArIF9QeU9TX3ZzbnByaW50Zl9FWFRSQV9TUEFDRSkKLQkJUHlfRmF0YWxFcnJvcigiQnVmZmVyIG92ZXJmbG93IGluIFB5T1Nfc25wcmludGYvUHlPU192c25wcmludGYiKTsKKyAgICBlbHNlIGlmICgoc2l6ZV90KWxlbiA+PSBzaXplICsgX1B5T1NfdnNucHJpbnRmX0VYVFJBX1NQQUNFKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJCdWZmZXIgb3ZlcmZsb3cgaW4gUHlPU19zbnByaW50Zi9QeU9TX3ZzbnByaW50ZiIpOwogCi0JZWxzZSB7Ci0JCWNvbnN0IHNpemVfdCB0b19jb3B5ID0gKHNpemVfdClsZW4gPCBzaXplID8KLQkJCQkJKHNpemVfdClsZW4gOiBzaXplIC0gMTsKLQkJYXNzZXJ0KHRvX2NvcHkgPCBzaXplKTsKLQkJbWVtY3B5KHN0ciwgYnVmZmVyLCB0b19jb3B5KTsKLQkJc3RyW3RvX2NvcHldID0gJ1wwJzsKLQl9Ci0JUHlNZW1fRlJFRShidWZmZXIpOworICAgIGVsc2UgeworICAgICAgICBjb25zdCBzaXplX3QgdG9fY29weSA9IChzaXplX3QpbGVuIDwgc2l6ZSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplX3QpbGVuIDogc2l6ZSAtIDE7CisgICAgICAgIGFzc2VydCh0b19jb3B5IDwgc2l6ZSk7CisgICAgICAgIG1lbWNweShzdHIsIGJ1ZmZlciwgdG9fY29weSk7CisgICAgICAgIHN0clt0b19jb3B5XSA9ICdcMCc7CisgICAgfQorICAgIFB5TWVtX0ZSRUUoYnVmZmVyKTsKICNlbmRpZgogRG9uZToKLQlpZiAoc2l6ZSA+IDApCi0JCXN0cltzaXplLTFdID0gJ1wwJzsKLQlyZXR1cm4gbGVuOworICAgIGlmIChzaXplID4gMCkKKyAgICAgICAgc3RyW3NpemUtMV0gPSAnXDAnOworICAgIHJldHVybiBsZW47CiAjdW5kZWYgX1B5T1NfdnNucHJpbnRmX0VYVFJBX1NQQUNFCiB9CmRpZmYgLS1naXQgYS9QeXRob24vbXlzdHJ0b3VsLmMgYi9QeXRob24vbXlzdHJ0b3VsLmMKaW5kZXggZWJkNDY4Yy4uYzM1YmU4MSAxMDA2NDQKLS0tIGEvUHl0aG9uL215c3RydG91bC5jCisrKyBiL1B5dGhvbi9teXN0cnRvdWwuYwpAQCAtMTgsNDMgKzE4LDQzIEBACiAgKiBpICogYmFzZSBkb2Vzbid0IG92ZXJmbG93IHVuc2lnbmVkIGxvbmcuCiAgKi8KIHN0YXRpYyB1bnNpZ25lZCBsb25nIHNtYWxsbWF4W10gPSB7Ci0JMCwgLyogYmFzZXMgMCBhbmQgMSBhcmUgaW52YWxpZCAqLwotCTAsCi0JVUxPTkdfTUFYIC8gMiwKLQlVTE9OR19NQVggLyAzLAotCVVMT05HX01BWCAvIDQsCi0JVUxPTkdfTUFYIC8gNSwKLQlVTE9OR19NQVggLyA2LAotCVVMT05HX01BWCAvIDcsCi0JVUxPTkdfTUFYIC8gOCwKLQlVTE9OR19NQVggLyA5LAotCVVMT05HX01BWCAvIDEwLAotCVVMT05HX01BWCAvIDExLAotCVVMT05HX01BWCAvIDEyLAotCVVMT05HX01BWCAvIDEzLAotCVVMT05HX01BWCAvIDE0LAotCVVMT05HX01BWCAvIDE1LAotCVVMT05HX01BWCAvIDE2LAotCVVMT05HX01BWCAvIDE3LAotCVVMT05HX01BWCAvIDE4LAotCVVMT05HX01BWCAvIDE5LAotCVVMT05HX01BWCAvIDIwLAotCVVMT05HX01BWCAvIDIxLAotCVVMT05HX01BWCAvIDIyLAotCVVMT05HX01BWCAvIDIzLAotCVVMT05HX01BWCAvIDI0LAotCVVMT05HX01BWCAvIDI1LAotCVVMT05HX01BWCAvIDI2LAotCVVMT05HX01BWCAvIDI3LAotCVVMT05HX01BWCAvIDI4LAotCVVMT05HX01BWCAvIDI5LAotCVVMT05HX01BWCAvIDMwLAotCVVMT05HX01BWCAvIDMxLAotCVVMT05HX01BWCAvIDMyLAotCVVMT05HX01BWCAvIDMzLAotCVVMT05HX01BWCAvIDM0LAotCVVMT05HX01BWCAvIDM1LAotCVVMT05HX01BWCAvIDM2LAorICAgIDAsIC8qIGJhc2VzIDAgYW5kIDEgYXJlIGludmFsaWQgKi8KKyAgICAwLAorICAgIFVMT05HX01BWCAvIDIsCisgICAgVUxPTkdfTUFYIC8gMywKKyAgICBVTE9OR19NQVggLyA0LAorICAgIFVMT05HX01BWCAvIDUsCisgICAgVUxPTkdfTUFYIC8gNiwKKyAgICBVTE9OR19NQVggLyA3LAorICAgIFVMT05HX01BWCAvIDgsCisgICAgVUxPTkdfTUFYIC8gOSwKKyAgICBVTE9OR19NQVggLyAxMCwKKyAgICBVTE9OR19NQVggLyAxMSwKKyAgICBVTE9OR19NQVggLyAxMiwKKyAgICBVTE9OR19NQVggLyAxMywKKyAgICBVTE9OR19NQVggLyAxNCwKKyAgICBVTE9OR19NQVggLyAxNSwKKyAgICBVTE9OR19NQVggLyAxNiwKKyAgICBVTE9OR19NQVggLyAxNywKKyAgICBVTE9OR19NQVggLyAxOCwKKyAgICBVTE9OR19NQVggLyAxOSwKKyAgICBVTE9OR19NQVggLyAyMCwKKyAgICBVTE9OR19NQVggLyAyMSwKKyAgICBVTE9OR19NQVggLyAyMiwKKyAgICBVTE9OR19NQVggLyAyMywKKyAgICBVTE9OR19NQVggLyAyNCwKKyAgICBVTE9OR19NQVggLyAyNSwKKyAgICBVTE9OR19NQVggLyAyNiwKKyAgICBVTE9OR19NQVggLyAyNywKKyAgICBVTE9OR19NQVggLyAyOCwKKyAgICBVTE9OR19NQVggLyAyOSwKKyAgICBVTE9OR19NQVggLyAzMCwKKyAgICBVTE9OR19NQVggLyAzMSwKKyAgICBVTE9OR19NQVggLyAzMiwKKyAgICBVTE9OR19NQVggLyAzMywKKyAgICBVTE9OR19NQVggLyAzNCwKKyAgICBVTE9OR19NQVggLyAzNSwKKyAgICBVTE9OR19NQVggLyAzNiwKIH07CiAKIC8qIG1heGltdW0gZGlnaXRzIHRoYXQgY2FuJ3QgZXZlciBvdmVyZmxvdyBmb3IgYmFzZXMgMiB0aHJvdWdoIDM2LApAQCAtNjMsMjIzICs2MywyMjMgQEAKICAqLwogI2lmIFNJWkVPRl9MT05HID09IDQKIHN0YXRpYyBpbnQgZGlnaXRsaW1pdFtdID0gewotCTAsICAwLCAzMiwgMjAsIDE2LCAxMywgMTIsIDExLCAxMCwgMTAsICAvKiAgMCAtICA5ICovCi0JOSwgIDksICA4LCAgOCwgIDgsICA4LCAgOCwgIDcsICA3LCAgNywgIC8qIDEwIC0gMTkgKi8KLQk3LCAgNywgIDcsICA3LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgLyogMjAgLSAyOSAqLwotCTYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDZ9OyAgICAgICAgICAgICAvKiAzMCAtIDM2ICovCisgICAgMCwgIDAsIDMyLCAyMCwgMTYsIDEzLCAxMiwgMTEsIDEwLCAxMCwgIC8qICAwIC0gIDkgKi8KKyAgICA5LCAgOSwgIDgsICA4LCAgOCwgIDgsICA4LCAgNywgIDcsICA3LCAgLyogMTAgLSAxOSAqLworICAgIDcsICA3LCAgNywgIDcsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICAvKiAyMCAtIDI5ICovCisgICAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNn07ICAgICAgICAgICAgIC8qIDMwIC0gMzYgKi8KICNlbGlmIFNJWkVPRl9MT05HID09IDgKIC8qIFtpbnQobWF0aC5mbG9vcihtYXRoLmxvZygyKio2NCwgaSkpKSBmb3IgaSBpbiByYW5nZSgyLCAzNyldICovCiBzdGF0aWMgaW50IGRpZ2l0bGltaXRbXSA9IHsKLQkgMCwgICAwLCA2NCwgNDAsIDMyLCAyNywgMjQsIDIyLCAyMSwgMjAsICAvKiAgMCAtICA5ICovCi0JMTksICAxOCwgMTcsIDE3LCAxNiwgMTYsIDE2LCAxNSwgMTUsIDE1LCAgLyogMTAgLSAxOSAqLwotCTE0LCAgMTQsIDE0LCAxNCwgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgIC8qIDIwIC0gMjkgKi8KLQkxMywgIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTJ9OyAgICAgICAgICAgICAvKiAzMCAtIDM2ICovCisgICAgICAgICAwLCAgIDAsIDY0LCA0MCwgMzIsIDI3LCAyNCwgMjIsIDIxLCAyMCwgIC8qICAwIC0gIDkgKi8KKyAgICAxOSwgIDE4LCAxNywgMTcsIDE2LCAxNiwgMTYsIDE1LCAxNSwgMTUsICAvKiAxMCAtIDE5ICovCisgICAgMTQsICAxNCwgMTQsIDE0LCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAgLyogMjAgLSAyOSAqLworICAgIDEzLCAgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMn07ICAgICAgICAgICAgIC8qIDMwIC0gMzYgKi8KICNlbHNlCiAjZXJyb3IgIk5lZWQgdGFibGUgZm9yIFNJWkVPRl9MT05HIgogI2VuZGlmCiAKIC8qCi0qKglzdHJ0b3VsCi0qKgkJVGhpcyBpcyBhIGdlbmVyYWwgcHVycG9zZSByb3V0aW5lIGZvciBjb252ZXJ0aW5nCi0qKgkJYW4gYXNjaWkgc3RyaW5nIHRvIGFuIGludGVnZXIgaW4gYW4gYXJiaXRyYXJ5IGJhc2UuCi0qKgkJTGVhZGluZyB3aGl0ZSBzcGFjZSBpcyBpZ25vcmVkLiAgSWYgJ2Jhc2UnIGlzIHplcm8KLSoqCQlpdCBsb29rcyBmb3IgYSBsZWFkaW5nIDAsIDBiLCAwQiwgMG8sIDBPLCAweCBvciAwWAotKioJCXRvIHRlbGwgd2hpY2ggYmFzZS4gIElmIHRoZXNlIGFyZSBhYnNlbnQgaXQgZGVmYXVsdHMKLSoqCQl0byAxMC4gQmFzZSBtdXN0IGJlIDAgb3IgYmV0d2VlbiAyIGFuZCAzNiAoaW5jbHVzaXZlKS4KLSoqCQlJZiAncHRyJyBpcyBub24tTlVMTCBpdCB3aWxsIGNvbnRhaW4gYSBwb2ludGVyIHRvCi0qKgkJdGhlIGVuZCBvZiB0aGUgc2Nhbi4KLSoqCQlFcnJvcnMgZHVlIHRvIGJhZCBwb2ludGVycyB3aWxsIHByb2JhYmx5IHJlc3VsdCBpbgotKioJCWV4Y2VwdGlvbnMgLSB3ZSBkb24ndCBjaGVjayBmb3IgdGhlbS4KKyoqICAgICAgc3RydG91bAorKiogICAgICAgICAgICAgIFRoaXMgaXMgYSBnZW5lcmFsIHB1cnBvc2Ugcm91dGluZSBmb3IgY29udmVydGluZworKiogICAgICAgICAgICAgIGFuIGFzY2lpIHN0cmluZyB0byBhbiBpbnRlZ2VyIGluIGFuIGFyYml0cmFyeSBiYXNlLgorKiogICAgICAgICAgICAgIExlYWRpbmcgd2hpdGUgc3BhY2UgaXMgaWdub3JlZC4gIElmICdiYXNlJyBpcyB6ZXJvCisqKiAgICAgICAgICAgICAgaXQgbG9va3MgZm9yIGEgbGVhZGluZyAwLCAwYiwgMEIsIDBvLCAwTywgMHggb3IgMFgKKyoqICAgICAgICAgICAgICB0byB0ZWxsIHdoaWNoIGJhc2UuICBJZiB0aGVzZSBhcmUgYWJzZW50IGl0IGRlZmF1bHRzCisqKiAgICAgICAgICAgICAgdG8gMTAuIEJhc2UgbXVzdCBiZSAwIG9yIGJldHdlZW4gMiBhbmQgMzYgKGluY2x1c2l2ZSkuCisqKiAgICAgICAgICAgICAgSWYgJ3B0cicgaXMgbm9uLU5VTEwgaXQgd2lsbCBjb250YWluIGEgcG9pbnRlciB0bworKiogICAgICAgICAgICAgIHRoZSBlbmQgb2YgdGhlIHNjYW4uCisqKiAgICAgICAgICAgICAgRXJyb3JzIGR1ZSB0byBiYWQgcG9pbnRlcnMgd2lsbCBwcm9iYWJseSByZXN1bHQgaW4KKyoqICAgICAgICAgICAgICBleGNlcHRpb25zIC0gd2UgZG9uJ3QgY2hlY2sgZm9yIHRoZW0uCiAqLwogdW5zaWduZWQgbG9uZwogUHlPU19zdHJ0b3VsKHJlZ2lzdGVyIGNoYXIgKnN0ciwgY2hhciAqKnB0ciwgaW50IGJhc2UpCiB7Ci0JcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyByZXN1bHQgPSAwOyAvKiByZXR1cm4gdmFsdWUgb2YgdGhlIGZ1bmN0aW9uICovCi0JcmVnaXN0ZXIgaW50IGM7CSAJLyogY3VycmVudCBpbnB1dCBjaGFyYWN0ZXIgKi8KLQlyZWdpc3RlciBpbnQgb3ZsaW1pdDsgCS8qIHJlcXVpcmVkIGRpZ2l0cyB0byBvdmVyZmxvdyAqLworICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgcmVzdWx0ID0gMDsgLyogcmV0dXJuIHZhbHVlIG9mIHRoZSBmdW5jdGlvbiAqLworICAgIHJlZ2lzdGVyIGludCBjOyAgICAgICAgICAgICAvKiBjdXJyZW50IGlucHV0IGNoYXJhY3RlciAqLworICAgIHJlZ2lzdGVyIGludCBvdmxpbWl0OyAgICAgICAvKiByZXF1aXJlZCBkaWdpdHMgdG8gb3ZlcmZsb3cgKi8KIAotCS8qIHNraXAgbGVhZGluZyB3aGl0ZSBzcGFjZSAqLwotCXdoaWxlICgqc3RyICYmIGlzc3BhY2UoUHlfQ0hBUk1BU0soKnN0cikpKQotCQkrK3N0cjsKKyAgICAvKiBza2lwIGxlYWRpbmcgd2hpdGUgc3BhY2UgKi8KKyAgICB3aGlsZSAoKnN0ciAmJiBpc3NwYWNlKFB5X0NIQVJNQVNLKCpzdHIpKSkKKyAgICAgICAgKytzdHI7CiAKLQkvKiBjaGVjayBmb3IgbGVhZGluZyAwIG9yIDB4IGZvciBhdXRvLWJhc2Ugb3IgYmFzZSAxNiAqLwotCXN3aXRjaCAoYmFzZSkgewotCWNhc2UgMDoJCS8qIGxvb2sgZm9yIGxlYWRpbmcgMCwgMGIsIDBvIG9yIDB4ICovCi0JCWlmICgqc3RyID09ICcwJykgewotCQkJKytzdHI7Ci0JCQlpZiAoKnN0ciA9PSAneCcgfHwgKnN0ciA9PSAnWCcpIHsKLQkJCQkvKiB0aGVyZSBtdXN0IGJlIGF0IGxlYXN0IG9uZSBkaWdpdCBhZnRlciAweCAqLwotCQkJCWlmIChfUHlMb25nX0RpZ2l0VmFsdWVbUHlfQ0hBUk1BU0soc3RyWzFdKV0gPj0gMTYpIHsKLQkJCQkJaWYgKHB0cikKLQkJCQkJCSpwdHIgPSBzdHI7Ci0JCQkJCXJldHVybiAwOwotCQkJCX0KLQkJCQkrK3N0cjsKLQkJCQliYXNlID0gMTY7Ci0JCQl9IGVsc2UgaWYgKCpzdHIgPT0gJ28nIHx8ICpzdHIgPT0gJ08nKSB7Ci0JCQkJLyogdGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgZGlnaXQgYWZ0ZXIgMG8gKi8KLQkJCQlpZiAoX1B5TG9uZ19EaWdpdFZhbHVlW1B5X0NIQVJNQVNLKHN0clsxXSldID49IDgpIHsKLQkJCQkJaWYgKHB0cikKLQkJCQkJCSpwdHIgPSBzdHI7Ci0JCQkJCXJldHVybiAwOwotCQkJCX0KLQkJCQkrK3N0cjsKLQkJCQliYXNlID0gODsKLQkJCX0gZWxzZSBpZiAoKnN0ciA9PSAnYicgfHwgKnN0ciA9PSAnQicpIHsKLQkJCQkvKiB0aGVyZSBtdXN0IGJlIGF0IGxlYXN0IG9uZSBkaWdpdCBhZnRlciAwYiAqLwotCQkJCWlmIChfUHlMb25nX0RpZ2l0VmFsdWVbUHlfQ0hBUk1BU0soc3RyWzFdKV0gPj0gMikgewotCQkJCQlpZiAocHRyKQotCQkJCQkJKnB0ciA9IHN0cjsKLQkJCQkJcmV0dXJuIDA7Ci0JCQkJfQotCQkJCSsrc3RyOwotCQkJCWJhc2UgPSAyOwotCQkJfSBlbHNlIHsKLQkJCQliYXNlID0gODsKLQkJCX0KLQkJfQotCQllbHNlCi0JCQliYXNlID0gMTA7Ci0JCWJyZWFrOworICAgIC8qIGNoZWNrIGZvciBsZWFkaW5nIDAgb3IgMHggZm9yIGF1dG8tYmFzZSBvciBiYXNlIDE2ICovCisgICAgc3dpdGNoIChiYXNlKSB7CisgICAgY2FzZSAwOiAgICAgICAgICAgICAvKiBsb29rIGZvciBsZWFkaW5nIDAsIDBiLCAwbyBvciAweCAqLworICAgICAgICBpZiAoKnN0ciA9PSAnMCcpIHsKKyAgICAgICAgICAgICsrc3RyOworICAgICAgICAgICAgaWYgKCpzdHIgPT0gJ3gnIHx8ICpzdHIgPT0gJ1gnKSB7CisgICAgICAgICAgICAgICAgLyogdGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgZGlnaXQgYWZ0ZXIgMHggKi8KKyAgICAgICAgICAgICAgICBpZiAoX1B5TG9uZ19EaWdpdFZhbHVlW1B5X0NIQVJNQVNLKHN0clsxXSldID49IDE2KSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwdHIpCisgICAgICAgICAgICAgICAgICAgICAgICAqcHRyID0gc3RyOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKytzdHI7CisgICAgICAgICAgICAgICAgYmFzZSA9IDE2OworICAgICAgICAgICAgfSBlbHNlIGlmICgqc3RyID09ICdvJyB8fCAqc3RyID09ICdPJykgeworICAgICAgICAgICAgICAgIC8qIHRoZXJlIG11c3QgYmUgYXQgbGVhc3Qgb25lIGRpZ2l0IGFmdGVyIDBvICovCisgICAgICAgICAgICAgICAgaWYgKF9QeUxvbmdfRGlnaXRWYWx1ZVtQeV9DSEFSTUFTSyhzdHJbMV0pXSA+PSA4KSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwdHIpCisgICAgICAgICAgICAgICAgICAgICAgICAqcHRyID0gc3RyOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKytzdHI7CisgICAgICAgICAgICAgICAgYmFzZSA9IDg7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCpzdHIgPT0gJ2InIHx8ICpzdHIgPT0gJ0InKSB7CisgICAgICAgICAgICAgICAgLyogdGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgZGlnaXQgYWZ0ZXIgMGIgKi8KKyAgICAgICAgICAgICAgICBpZiAoX1B5TG9uZ19EaWdpdFZhbHVlW1B5X0NIQVJNQVNLKHN0clsxXSldID49IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHB0cikKKyAgICAgICAgICAgICAgICAgICAgICAgICpwdHIgPSBzdHI7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICArK3N0cjsKKyAgICAgICAgICAgICAgICBiYXNlID0gMjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYmFzZSA9IDg7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYmFzZSA9IDEwOworICAgICAgICBicmVhazsKIAotCWNhc2UgMjoJLyogc2tpcCBsZWFkaW5nIDBiIG9yIDBCICovCi0JCWlmICgqc3RyID09ICcwJykgewotCQkJKytzdHI7Ci0JCQlpZiAoKnN0ciA9PSAnYicgfHwgKnN0ciA9PSAnQicpIHsKLQkJCQkvKiB0aGVyZSBtdXN0IGJlIGF0IGxlYXN0IG9uZSBkaWdpdCBhZnRlciAwYiAqLwotCQkJCWlmIChfUHlMb25nX0RpZ2l0VmFsdWVbUHlfQ0hBUk1BU0soc3RyWzFdKV0gPj0gMikgewotCQkJCQlpZiAocHRyKQotCQkJCQkJKnB0ciA9IHN0cjsKLQkJCQkJcmV0dXJuIDA7Ci0JCQkJfQotCQkJCSsrc3RyOwotCQkJfQotCQl9Ci0JCWJyZWFrOworICAgIGNhc2UgMjogICAgIC8qIHNraXAgbGVhZGluZyAwYiBvciAwQiAqLworICAgICAgICBpZiAoKnN0ciA9PSAnMCcpIHsKKyAgICAgICAgICAgICsrc3RyOworICAgICAgICAgICAgaWYgKCpzdHIgPT0gJ2InIHx8ICpzdHIgPT0gJ0InKSB7CisgICAgICAgICAgICAgICAgLyogdGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgZGlnaXQgYWZ0ZXIgMGIgKi8KKyAgICAgICAgICAgICAgICBpZiAoX1B5TG9uZ19EaWdpdFZhbHVlW1B5X0NIQVJNQVNLKHN0clsxXSldID49IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHB0cikKKyAgICAgICAgICAgICAgICAgICAgICAgICpwdHIgPSBzdHI7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICArK3N0cjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKIAotCWNhc2UgODoJLyogc2tpcCBsZWFkaW5nIDBvIG9yIDBPICovCi0JCWlmICgqc3RyID09ICcwJykgewotCQkJKytzdHI7Ci0JCQlpZiAoKnN0ciA9PSAnbycgfHwgKnN0ciA9PSAnTycpIHsKLQkJCQkvKiB0aGVyZSBtdXN0IGJlIGF0IGxlYXN0IG9uZSBkaWdpdCBhZnRlciAwbyAqLwotCQkJCWlmIChfUHlMb25nX0RpZ2l0VmFsdWVbUHlfQ0hBUk1BU0soc3RyWzFdKV0gPj0gOCkgewotCQkJCQlpZiAocHRyKQotCQkJCQkJKnB0ciA9IHN0cjsKLQkJCQkJcmV0dXJuIDA7Ci0JCQkJfQotCQkJCSsrc3RyOwotCQkJfQotCQl9Ci0JCWJyZWFrOworICAgIGNhc2UgODogICAgIC8qIHNraXAgbGVhZGluZyAwbyBvciAwTyAqLworICAgICAgICBpZiAoKnN0ciA9PSAnMCcpIHsKKyAgICAgICAgICAgICsrc3RyOworICAgICAgICAgICAgaWYgKCpzdHIgPT0gJ28nIHx8ICpzdHIgPT0gJ08nKSB7CisgICAgICAgICAgICAgICAgLyogdGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgZGlnaXQgYWZ0ZXIgMG8gKi8KKyAgICAgICAgICAgICAgICBpZiAoX1B5TG9uZ19EaWdpdFZhbHVlW1B5X0NIQVJNQVNLKHN0clsxXSldID49IDgpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHB0cikKKyAgICAgICAgICAgICAgICAgICAgICAgICpwdHIgPSBzdHI7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICArK3N0cjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKIAotCWNhc2UgMTY6CS8qIHNraXAgbGVhZGluZyAweCBvciAwWCAqLwotCQlpZiAoKnN0ciA9PSAnMCcpIHsKLQkJCSsrc3RyOwotCQkJaWYgKCpzdHIgPT0gJ3gnIHx8ICpzdHIgPT0gJ1gnKSB7Ci0JCQkJLyogdGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgZGlnaXQgYWZ0ZXIgMHggKi8KLQkJCQlpZiAoX1B5TG9uZ19EaWdpdFZhbHVlW1B5X0NIQVJNQVNLKHN0clsxXSldID49IDE2KSB7Ci0JCQkJCWlmIChwdHIpCi0JCQkJCQkqcHRyID0gc3RyOwotCQkJCQlyZXR1cm4gMDsKLQkJCQl9Ci0JCQkJKytzdHI7Ci0JCQl9Ci0JCX0KLQkJYnJlYWs7Ci0JfQorICAgIGNhc2UgMTY6ICAgICAgICAgICAgLyogc2tpcCBsZWFkaW5nIDB4IG9yIDBYICovCisgICAgICAgIGlmICgqc3RyID09ICcwJykgeworICAgICAgICAgICAgKytzdHI7CisgICAgICAgICAgICBpZiAoKnN0ciA9PSAneCcgfHwgKnN0ciA9PSAnWCcpIHsKKyAgICAgICAgICAgICAgICAvKiB0aGVyZSBtdXN0IGJlIGF0IGxlYXN0IG9uZSBkaWdpdCBhZnRlciAweCAqLworICAgICAgICAgICAgICAgIGlmIChfUHlMb25nX0RpZ2l0VmFsdWVbUHlfQ0hBUk1BU0soc3RyWzFdKV0gPj0gMTYpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHB0cikKKyAgICAgICAgICAgICAgICAgICAgICAgICpwdHIgPSBzdHI7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICArK3N0cjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CiAKLQkvKiBjYXRjaCBzaWxseSBiYXNlcyAqLwotCWlmIChiYXNlIDwgMiB8fCBiYXNlID4gMzYpIHsKLQkJaWYgKHB0cikKLQkJCSpwdHIgPSBzdHI7Ci0JCXJldHVybiAwOwotCX0KKyAgICAvKiBjYXRjaCBzaWxseSBiYXNlcyAqLworICAgIGlmIChiYXNlIDwgMiB8fCBiYXNlID4gMzYpIHsKKyAgICAgICAgaWYgKHB0cikKKyAgICAgICAgICAgICpwdHIgPSBzdHI7CisgICAgICAgIHJldHVybiAwOworICAgIH0KIAotCS8qIHNraXAgbGVhZGluZyB6ZXJvZXMgKi8KLQl3aGlsZSAoKnN0ciA9PSAnMCcpCi0JCSsrc3RyOworICAgIC8qIHNraXAgbGVhZGluZyB6ZXJvZXMgKi8KKyAgICB3aGlsZSAoKnN0ciA9PSAnMCcpCisgICAgICAgICsrc3RyOwogCi0JLyogYmFzZSBpcyBndWFyYW50ZWVkIHRvIGJlIGluIFsyLCAzNl0gYXQgdGhpcyBwb2ludCAqLwotCW92bGltaXQgPSBkaWdpdGxpbWl0W2Jhc2VdOworICAgIC8qIGJhc2UgaXMgZ3VhcmFudGVlZCB0byBiZSBpbiBbMiwgMzZdIGF0IHRoaXMgcG9pbnQgKi8KKyAgICBvdmxpbWl0ID0gZGlnaXRsaW1pdFtiYXNlXTsKIAotCS8qIGRvIHRoZSBjb252ZXJzaW9uIHVudGlsIG5vbi1kaWdpdCBjaGFyYWN0ZXIgZW5jb3VudGVyZWQgKi8KLQl3aGlsZSAoKGMgPSBfUHlMb25nX0RpZ2l0VmFsdWVbUHlfQ0hBUk1BU0soKnN0cildKSA8IGJhc2UpIHsKLQkJaWYgKG92bGltaXQgPiAwKSAvKiBubyBvdmVyZmxvdyBjaGVjayByZXF1aXJlZCAqLwotCQkJcmVzdWx0ID0gcmVzdWx0ICogYmFzZSArIGM7Ci0JCWVsc2UgeyAvKiByZXF1aXJlcyBvdmVyZmxvdyBjaGVjayAqLwotCQkJcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyB0ZW1wX3Jlc3VsdDsKKyAgICAvKiBkbyB0aGUgY29udmVyc2lvbiB1bnRpbCBub24tZGlnaXQgY2hhcmFjdGVyIGVuY291bnRlcmVkICovCisgICAgd2hpbGUgKChjID0gX1B5TG9uZ19EaWdpdFZhbHVlW1B5X0NIQVJNQVNLKCpzdHIpXSkgPCBiYXNlKSB7CisgICAgICAgIGlmIChvdmxpbWl0ID4gMCkgLyogbm8gb3ZlcmZsb3cgY2hlY2sgcmVxdWlyZWQgKi8KKyAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCAqIGJhc2UgKyBjOworICAgICAgICBlbHNlIHsgLyogcmVxdWlyZXMgb3ZlcmZsb3cgY2hlY2sgKi8KKyAgICAgICAgICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgdGVtcF9yZXN1bHQ7CiAKLQkJCWlmIChvdmxpbWl0IDwgMCkgLyogZ3VhcmFudGVlZCBvdmVyZmxvdyAqLwotCQkJCWdvdG8gb3ZlcmZsb3dlZDsKKyAgICAgICAgICAgIGlmIChvdmxpbWl0IDwgMCkgLyogZ3VhcmFudGVlZCBvdmVyZmxvdyAqLworICAgICAgICAgICAgICAgIGdvdG8gb3ZlcmZsb3dlZDsKIAotCQkJLyogdGhlcmUgY291bGQgYmUgYW4gb3ZlcmZsb3cgKi8KLQkJCS8qIGNoZWNrIG92ZXJmbG93IGp1c3QgZnJvbSBzaGlmdGluZyAqLwotCQkJaWYgKHJlc3VsdCA+IHNtYWxsbWF4W2Jhc2VdKQotCQkJCWdvdG8gb3ZlcmZsb3dlZDsKKyAgICAgICAgICAgIC8qIHRoZXJlIGNvdWxkIGJlIGFuIG92ZXJmbG93ICovCisgICAgICAgICAgICAvKiBjaGVjayBvdmVyZmxvdyBqdXN0IGZyb20gc2hpZnRpbmcgKi8KKyAgICAgICAgICAgIGlmIChyZXN1bHQgPiBzbWFsbG1heFtiYXNlXSkKKyAgICAgICAgICAgICAgICBnb3RvIG92ZXJmbG93ZWQ7CiAKLQkJCXJlc3VsdCAqPSBiYXNlOworICAgICAgICAgICAgcmVzdWx0ICo9IGJhc2U7CiAKLQkJCS8qIGNoZWNrIG92ZXJmbG93IGZyb20gdGhlIGRpZ2l0J3MgdmFsdWUgKi8KLQkJCXRlbXBfcmVzdWx0ID0gcmVzdWx0ICsgYzsKLQkJCWlmICh0ZW1wX3Jlc3VsdCA8IHJlc3VsdCkKLQkJCQlnb3RvIG92ZXJmbG93ZWQ7CisgICAgICAgICAgICAvKiBjaGVjayBvdmVyZmxvdyBmcm9tIHRoZSBkaWdpdCdzIHZhbHVlICovCisgICAgICAgICAgICB0ZW1wX3Jlc3VsdCA9IHJlc3VsdCArIGM7CisgICAgICAgICAgICBpZiAodGVtcF9yZXN1bHQgPCByZXN1bHQpCisgICAgICAgICAgICAgICAgZ290byBvdmVyZmxvd2VkOwogCi0JCQlyZXN1bHQgPSB0ZW1wX3Jlc3VsdDsKLQkJfQorICAgICAgICAgICAgcmVzdWx0ID0gdGVtcF9yZXN1bHQ7CisgICAgICAgIH0KIAotCQkrK3N0cjsKLQkJLS1vdmxpbWl0OwotCX0KKyAgICAgICAgKytzdHI7CisgICAgICAgIC0tb3ZsaW1pdDsKKyAgICB9CiAKLQkvKiBzZXQgcG9pbnRlciB0byBwb2ludCB0byB0aGUgbGFzdCBjaGFyYWN0ZXIgc2Nhbm5lZCAqLwotCWlmIChwdHIpCi0JCSpwdHIgPSBzdHI7CisgICAgLyogc2V0IHBvaW50ZXIgdG8gcG9pbnQgdG8gdGhlIGxhc3QgY2hhcmFjdGVyIHNjYW5uZWQgKi8KKyAgICBpZiAocHRyKQorICAgICAgICAqcHRyID0gc3RyOwogCi0JcmV0dXJuIHJlc3VsdDsKKyAgICByZXR1cm4gcmVzdWx0OwogCiBvdmVyZmxvd2VkOgotCWlmIChwdHIpIHsKLQkJLyogc3Bvb2wgdGhyb3VnaCByZW1haW5pbmcgZGlnaXQgY2hhcmFjdGVycyAqLwotCQl3aGlsZSAoX1B5TG9uZ19EaWdpdFZhbHVlW1B5X0NIQVJNQVNLKCpzdHIpXSA8IGJhc2UpCi0JCQkrK3N0cjsKLQkJKnB0ciA9IHN0cjsKLQl9Ci0JZXJybm8gPSBFUkFOR0U7Ci0JcmV0dXJuICh1bnNpZ25lZCBsb25nKS0xOworICAgIGlmIChwdHIpIHsKKyAgICAgICAgLyogc3Bvb2wgdGhyb3VnaCByZW1haW5pbmcgZGlnaXQgY2hhcmFjdGVycyAqLworICAgICAgICB3aGlsZSAoX1B5TG9uZ19EaWdpdFZhbHVlW1B5X0NIQVJNQVNLKCpzdHIpXSA8IGJhc2UpCisgICAgICAgICAgICArK3N0cjsKKyAgICAgICAgKnB0ciA9IHN0cjsKKyAgICB9CisgICAgZXJybm8gPSBFUkFOR0U7CisgICAgcmV0dXJuICh1bnNpZ25lZCBsb25nKS0xOwogfQogCiAvKiBDaGVja2luZyBmb3Igb3ZlcmZsb3cgaW4gUHlPU19zdHJ0b2wgaXMgYSBQSVRBOyBzZWUgY29tbWVudHMKICAqIGFib3V0IFBZX0FCU19MT05HX01JTiBpbiBsb25nb2JqZWN0LmMuCiAgKi8KLSNkZWZpbmUgUFlfQUJTX0xPTkdfTUlOCQkoMC0odW5zaWduZWQgbG9uZylMT05HX01JTikKKyNkZWZpbmUgUFlfQUJTX0xPTkdfTUlOICAgICAgICAgKDAtKHVuc2lnbmVkIGxvbmcpTE9OR19NSU4pCiAKIGxvbmcKIFB5T1Nfc3RydG9sKGNoYXIgKnN0ciwgY2hhciAqKnB0ciwgaW50IGJhc2UpCiB7Ci0JbG9uZyByZXN1bHQ7Ci0JdW5zaWduZWQgbG9uZyB1cmVzdWx0OwotCWNoYXIgc2lnbjsKKyAgICBsb25nIHJlc3VsdDsKKyAgICB1bnNpZ25lZCBsb25nIHVyZXN1bHQ7CisgICAgY2hhciBzaWduOwogCi0Jd2hpbGUgKCpzdHIgJiYgaXNzcGFjZShQeV9DSEFSTUFTSygqc3RyKSkpCi0JCXN0cisrOworICAgIHdoaWxlICgqc3RyICYmIGlzc3BhY2UoUHlfQ0hBUk1BU0soKnN0cikpKQorICAgICAgICBzdHIrKzsKIAotCXNpZ24gPSAqc3RyOwotCWlmIChzaWduID09ICcrJyB8fCBzaWduID09ICctJykKLQkJc3RyKys7CisgICAgc2lnbiA9ICpzdHI7CisgICAgaWYgKHNpZ24gPT0gJysnIHx8IHNpZ24gPT0gJy0nKQorICAgICAgICBzdHIrKzsKIAotCXVyZXN1bHQgPSBQeU9TX3N0cnRvdWwoc3RyLCBwdHIsIGJhc2UpOworICAgIHVyZXN1bHQgPSBQeU9TX3N0cnRvdWwoc3RyLCBwdHIsIGJhc2UpOwogCi0JaWYgKHVyZXN1bHQgPD0gKHVuc2lnbmVkIGxvbmcpTE9OR19NQVgpIHsKLQkJcmVzdWx0ID0gKGxvbmcpdXJlc3VsdDsKLQkJaWYgKHNpZ24gPT0gJy0nKQotCQkJcmVzdWx0ID0gLXJlc3VsdDsKLQl9Ci0JZWxzZSBpZiAoc2lnbiA9PSAnLScgJiYgdXJlc3VsdCA9PSBQWV9BQlNfTE9OR19NSU4pIHsKLQkJcmVzdWx0ID0gTE9OR19NSU47Ci0JfQotCWVsc2UgewotCQllcnJubyA9IEVSQU5HRTsKLQkJcmVzdWx0ID0gTE9OR19NQVg7Ci0JfQotCXJldHVybiByZXN1bHQ7CisgICAgaWYgKHVyZXN1bHQgPD0gKHVuc2lnbmVkIGxvbmcpTE9OR19NQVgpIHsKKyAgICAgICAgcmVzdWx0ID0gKGxvbmcpdXJlc3VsdDsKKyAgICAgICAgaWYgKHNpZ24gPT0gJy0nKQorICAgICAgICAgICAgcmVzdWx0ID0gLXJlc3VsdDsKKyAgICB9CisgICAgZWxzZSBpZiAoc2lnbiA9PSAnLScgJiYgdXJlc3VsdCA9PSBQWV9BQlNfTE9OR19NSU4pIHsKKyAgICAgICAgcmVzdWx0ID0gTE9OR19NSU47CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBlcnJubyA9IEVSQU5HRTsKKyAgICAgICAgcmVzdWx0ID0gTE9OR19NQVg7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CiB9CmRpZmYgLS1naXQgYS9QeXRob24vcGVlcGhvbGUuYyBiL1B5dGhvbi9wZWVwaG9sZS5jCmluZGV4IDEzOWE2MmIuLjk1Y2U5ZDAgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9wZWVwaG9sZS5jCisrKyBiL1B5dGhvbi9wZWVwaG9sZS5jCkBAIC0xMiw2MjIgKzEyLDYyMiBAQAogI2luY2x1ZGUgIm9wY29kZS5oIgogCiAjZGVmaW5lIEdFVEFSRyhhcnIsIGkpICgoaW50KSgoYXJyW2krMl08PDgpICsgYXJyW2krMV0pKQotI2RlZmluZSBVTkNPTkRJVElPTkFMX0pVTVAob3ApCShvcD09SlVNUF9BQlNPTFVURSB8fCBvcD09SlVNUF9GT1JXQVJEKQorI2RlZmluZSBVTkNPTkRJVElPTkFMX0pVTVAob3ApICAob3A9PUpVTVBfQUJTT0xVVEUgfHwgb3A9PUpVTVBfRk9SV0FSRCkKICNkZWZpbmUgQUJTT0xVVEVfSlVNUChvcCkgKG9wPT1KVU1QX0FCU09MVVRFIHx8IG9wPT1DT05USU5VRV9MT09QKQogI2RlZmluZSBHRVRKVU1QVEdUKGFyciwgaSkgKEdFVEFSRyhhcnIsaSkgKyAoQUJTT0xVVEVfSlVNUChhcnJbaV0pID8gMCA6IGkrMykpCiAjZGVmaW5lIFNFVEFSRyhhcnIsIGksIHZhbCkgYXJyW2krMl0gPSB2YWw+Pjg7IGFycltpKzFdID0gdmFsICYgMjU1CiAjZGVmaW5lIENPREVTSVpFKG9wKSAgKEhBU19BUkcob3ApID8gMyA6IDEpCiAjZGVmaW5lIElTQkFTSUNCTE9DSyhibG9ja3MsIHN0YXJ0LCBieXRlcykgXAotCShibG9ja3Nbc3RhcnRdPT1ibG9ja3Nbc3RhcnQrYnl0ZXMtMV0pCisgICAgKGJsb2Nrc1tzdGFydF09PWJsb2Nrc1tzdGFydCtieXRlcy0xXSkKIAogLyogUmVwbGFjZSBMT0FEX0NPTlNUIGMxLiBMT0FEX0NPTlNUIGMyIC4uLiBMT0FEX0NPTlNUIGNuIEJVSUxEX1RVUExFIG4KLSAgIHdpdGgJICAgTE9BRF9DT05TVCAoYzEsIGMyLCAuLi4gY24pLgorICAgd2l0aCAgICBMT0FEX0NPTlNUIChjMSwgYzIsIC4uLiBjbikuCiAgICBUaGUgY29uc3RzIHRhYmxlIG11c3Qgc3RpbGwgYmUgaW4gbGlzdCBmb3JtIHNvIHRoYXQgdGhlCiAgICBuZXcgY29uc3RhbnQgKGMxLCBjMiwgLi4uIGNuKSBjYW4gYmUgYXBwZW5kZWQuCiAgICBDYWxsZWQgd2l0aCBjb2Rlc3RyIHBvaW50aW5nIHRvIHRoZSBmaXJzdCBMT0FEX0NPTlNULgotICAgQmFpbHMgb3V0IHdpdGggbm8gY2hhbmdlIGlmIG9uZSBvciBtb3JlIG9mIHRoZSBMT0FEX0NPTlNUcyBpcyBtaXNzaW5nLiAKKyAgIEJhaWxzIG91dCB3aXRoIG5vIGNoYW5nZSBpZiBvbmUgb3IgbW9yZSBvZiB0aGUgTE9BRF9DT05TVHMgaXMgbWlzc2luZy4KICAgIEFsc28gd29ya3MgZm9yIEJVSUxEX0xJU1Qgd2hlbiBmb2xsb3dlZCBieSBhbiAiaW4iIG9yICJub3QgaW4iIHRlc3QuCiAqLwogc3RhdGljIGludAogdHVwbGVfb2ZfY29uc3RhbnRzKHVuc2lnbmVkIGNoYXIgKmNvZGVzdHIsIFB5X3NzaXplX3QgbiwgUHlPYmplY3QgKmNvbnN0cykKIHsKLQlQeU9iamVjdCAqbmV3Y29uc3QsICpjb25zdGFudDsKLQlQeV9zc2l6ZV90IGksIGFyZywgbGVuX2NvbnN0czsKKyAgICBQeU9iamVjdCAqbmV3Y29uc3QsICpjb25zdGFudDsKKyAgICBQeV9zc2l6ZV90IGksIGFyZywgbGVuX2NvbnN0czsKIAotCS8qIFByZS1jb25kaXRpb25zICovCi0JYXNzZXJ0KFB5TGlzdF9DaGVja0V4YWN0KGNvbnN0cykpOwotCWFzc2VydChjb2Rlc3RyW24qM10gPT0gQlVJTERfVFVQTEUgfHwgY29kZXN0cltuKjNdID09IEJVSUxEX0xJU1QpOwotCWFzc2VydChHRVRBUkcoY29kZXN0ciwgKG4qMykpID09IG4pOwotCWZvciAoaT0wIDsgaTxuIDsgaSsrKQotCQlhc3NlcnQoY29kZXN0cltpKjNdID09IExPQURfQ09OU1QpOworICAgIC8qIFByZS1jb25kaXRpb25zICovCisgICAgYXNzZXJ0KFB5TGlzdF9DaGVja0V4YWN0KGNvbnN0cykpOworICAgIGFzc2VydChjb2Rlc3RyW24qM10gPT0gQlVJTERfVFVQTEUgfHwgY29kZXN0cltuKjNdID09IEJVSUxEX0xJU1QpOworICAgIGFzc2VydChHRVRBUkcoY29kZXN0ciwgKG4qMykpID09IG4pOworICAgIGZvciAoaT0wIDsgaTxuIDsgaSsrKQorICAgICAgICBhc3NlcnQoY29kZXN0cltpKjNdID09IExPQURfQ09OU1QpOwogCi0JLyogQnVpbGR1cCBuZXcgdHVwbGUgb2YgY29uc3RhbnRzICovCi0JbmV3Y29uc3QgPSBQeVR1cGxlX05ldyhuKTsKLQlpZiAobmV3Y29uc3QgPT0gTlVMTCkKLQkJcmV0dXJuIDA7Ci0JbGVuX2NvbnN0cyA9IFB5TGlzdF9HRVRfU0laRShjb25zdHMpOwotCWZvciAoaT0wIDsgaTxuIDsgaSsrKSB7Ci0JCWFyZyA9IEdFVEFSRyhjb2Rlc3RyLCAoaSozKSk7Ci0JCWFzc2VydChhcmcgPCBsZW5fY29uc3RzKTsKLQkJY29uc3RhbnQgPSBQeUxpc3RfR0VUX0lURU0oY29uc3RzLCBhcmcpOwotCQlQeV9JTkNSRUYoY29uc3RhbnQpOwotCQlQeVR1cGxlX1NFVF9JVEVNKG5ld2NvbnN0LCBpLCBjb25zdGFudCk7Ci0JfQorICAgIC8qIEJ1aWxkdXAgbmV3IHR1cGxlIG9mIGNvbnN0YW50cyAqLworICAgIG5ld2NvbnN0ID0gUHlUdXBsZV9OZXcobik7CisgICAgaWYgKG5ld2NvbnN0ID09IE5VTEwpCisgICAgICAgIHJldHVybiAwOworICAgIGxlbl9jb25zdHMgPSBQeUxpc3RfR0VUX1NJWkUoY29uc3RzKTsKKyAgICBmb3IgKGk9MCA7IGk8biA7IGkrKykgeworICAgICAgICBhcmcgPSBHRVRBUkcoY29kZXN0ciwgKGkqMykpOworICAgICAgICBhc3NlcnQoYXJnIDwgbGVuX2NvbnN0cyk7CisgICAgICAgIGNvbnN0YW50ID0gUHlMaXN0X0dFVF9JVEVNKGNvbnN0cywgYXJnKTsKKyAgICAgICAgUHlfSU5DUkVGKGNvbnN0YW50KTsKKyAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShuZXdjb25zdCwgaSwgY29uc3RhbnQpOworICAgIH0KIAotCS8qIEFwcGVuZCBmb2xkZWQgY29uc3RhbnQgb250byBjb25zdHMgKi8KLQlpZiAoUHlMaXN0X0FwcGVuZChjb25zdHMsIG5ld2NvbnN0KSkgewotCQlQeV9ERUNSRUYobmV3Y29uc3QpOwotCQlyZXR1cm4gMDsKLQl9Ci0JUHlfREVDUkVGKG5ld2NvbnN0KTsKKyAgICAvKiBBcHBlbmQgZm9sZGVkIGNvbnN0YW50IG9udG8gY29uc3RzICovCisgICAgaWYgKFB5TGlzdF9BcHBlbmQoY29uc3RzLCBuZXdjb25zdCkpIHsKKyAgICAgICAgUHlfREVDUkVGKG5ld2NvbnN0KTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIFB5X0RFQ1JFRihuZXdjb25zdCk7CiAKLQkvKiBXcml0ZSBOT1BzIG92ZXIgb2xkIExPQURfQ09OU1RTIGFuZAotCSAgIGFkZCBhIG5ldyBMT0FEX0NPTlNUIG5ld2NvbnN0IG9uIHRvcCBvZiB0aGUgQlVJTERfVFVQTEUgbiAqLwotCW1lbXNldChjb2Rlc3RyLCBOT1AsIG4qMyk7Ci0JY29kZXN0cltuKjNdID0gTE9BRF9DT05TVDsKLQlTRVRBUkcoY29kZXN0ciwgKG4qMyksIGxlbl9jb25zdHMpOwotCXJldHVybiAxOworICAgIC8qIFdyaXRlIE5PUHMgb3ZlciBvbGQgTE9BRF9DT05TVFMgYW5kCisgICAgICAgYWRkIGEgbmV3IExPQURfQ09OU1QgbmV3Y29uc3Qgb24gdG9wIG9mIHRoZSBCVUlMRF9UVVBMRSBuICovCisgICAgbWVtc2V0KGNvZGVzdHIsIE5PUCwgbiozKTsKKyAgICBjb2Rlc3RyW24qM10gPSBMT0FEX0NPTlNUOworICAgIFNFVEFSRyhjb2Rlc3RyLCAobiozKSwgbGVuX2NvbnN0cyk7CisgICAgcmV0dXJuIDE7CiB9CiAKIC8qIFJlcGxhY2UgTE9BRF9DT05TVCBjMS4gTE9BRF9DT05TVCBjMiBCSU5PUAotICAgd2l0aAkgICBMT0FEX0NPTlNUIGJpbm9wKGMxLGMyKQorICAgd2l0aCAgICBMT0FEX0NPTlNUIGJpbm9wKGMxLGMyKQogICAgVGhlIGNvbnN0cyB0YWJsZSBtdXN0IHN0aWxsIGJlIGluIGxpc3QgZm9ybSBzbyB0aGF0IHRoZQogICAgbmV3IGNvbnN0YW50IGNhbiBiZSBhcHBlbmRlZC4KLSAgIENhbGxlZCB3aXRoIGNvZGVzdHIgcG9pbnRpbmcgdG8gdGhlIGZpcnN0IExPQURfQ09OU1QuIAotICAgQWJhbmRvbnMgdGhlIHRyYW5zZm9ybWF0aW9uIGlmIHRoZSBmb2xkaW5nIGZhaWxzIChpLmUuICAxKydhJykuICAKKyAgIENhbGxlZCB3aXRoIGNvZGVzdHIgcG9pbnRpbmcgdG8gdGhlIGZpcnN0IExPQURfQ09OU1QuCisgICBBYmFuZG9ucyB0aGUgdHJhbnNmb3JtYXRpb24gaWYgdGhlIGZvbGRpbmcgZmFpbHMgKGkuZS4gIDErJ2EnKS4KICAgIElmIHRoZSBuZXcgY29uc3RhbnQgaXMgYSBzZXF1ZW5jZSwgb25seSBmb2xkcyB3aGVuIHRoZSBzaXplCi0gICBpcyBiZWxvdyBhIHRocmVzaG9sZCB2YWx1ZS4JVGhhdCBrZWVwcyBweWMgZmlsZXMgZnJvbQotICAgYmVjb21pbmcgbGFyZ2UgaW4gdGhlIHByZXNlbmNlIG9mIGNvZGUgbGlrZToJIChOb25lLCkqMTAwMC4KKyAgIGlzIGJlbG93IGEgdGhyZXNob2xkIHZhbHVlLiAgVGhhdCBrZWVwcyBweWMgZmlsZXMgZnJvbQorICAgYmVjb21pbmcgbGFyZ2UgaW4gdGhlIHByZXNlbmNlIG9mIGNvZGUgbGlrZTogIChOb25lLCkqMTAwMC4KICovCiBzdGF0aWMgaW50CiBmb2xkX2Jpbm9wc19vbl9jb25zdGFudHModW5zaWduZWQgY2hhciAqY29kZXN0ciwgUHlPYmplY3QgKmNvbnN0cykKIHsKLQlQeU9iamVjdCAqbmV3Y29uc3QsICp2LCAqdzsKLQlQeV9zc2l6ZV90IGxlbl9jb25zdHMsIHNpemU7Ci0JaW50IG9wY29kZTsKKyAgICBQeU9iamVjdCAqbmV3Y29uc3QsICp2LCAqdzsKKyAgICBQeV9zc2l6ZV90IGxlbl9jb25zdHMsIHNpemU7CisgICAgaW50IG9wY29kZTsKIAotCS8qIFByZS1jb25kaXRpb25zICovCi0JYXNzZXJ0KFB5TGlzdF9DaGVja0V4YWN0KGNvbnN0cykpOwotCWFzc2VydChjb2Rlc3RyWzBdID09IExPQURfQ09OU1QpOwotCWFzc2VydChjb2Rlc3RyWzNdID09IExPQURfQ09OU1QpOworICAgIC8qIFByZS1jb25kaXRpb25zICovCisgICAgYXNzZXJ0KFB5TGlzdF9DaGVja0V4YWN0KGNvbnN0cykpOworICAgIGFzc2VydChjb2Rlc3RyWzBdID09IExPQURfQ09OU1QpOworICAgIGFzc2VydChjb2Rlc3RyWzNdID09IExPQURfQ09OU1QpOwogCi0JLyogQ3JlYXRlIG5ldyBjb25zdGFudCAqLwotCXYgPSBQeUxpc3RfR0VUX0lURU0oY29uc3RzLCBHRVRBUkcoY29kZXN0ciwgMCkpOwotCXcgPSBQeUxpc3RfR0VUX0lURU0oY29uc3RzLCBHRVRBUkcoY29kZXN0ciwgMykpOwotCW9wY29kZSA9IGNvZGVzdHJbNl07Ci0Jc3dpdGNoIChvcGNvZGUpIHsKLQkJY2FzZSBCSU5BUllfUE9XRVI6Ci0JCQluZXdjb25zdCA9IFB5TnVtYmVyX1Bvd2VyKHYsIHcsIFB5X05vbmUpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQklOQVJZX01VTFRJUExZOgotCQkJbmV3Y29uc3QgPSBQeU51bWJlcl9NdWx0aXBseSh2LCB3KTsKLQkJCWJyZWFrOwotCQljYXNlIEJJTkFSWV9ESVZJREU6Ci0JCQkvKiBDYW5ub3QgZm9sZCB0aGlzIG9wZXJhdGlvbiBzdGF0aWNhbGx5IHNpbmNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcmVzdWx0IGNhbiBkZXBlbmQgb24gdGhlIHJ1bi10aW1lIHByZXNlbmNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgLVFuZXcgZmxhZyAqLwotCQkJcmV0dXJuIDA7Ci0JCWNhc2UgQklOQVJZX1RSVUVfRElWSURFOgotCQkJbmV3Y29uc3QgPSBQeU51bWJlcl9UcnVlRGl2aWRlKHYsIHcpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQklOQVJZX0ZMT09SX0RJVklERToKLQkJCW5ld2NvbnN0ID0gUHlOdW1iZXJfRmxvb3JEaXZpZGUodiwgdyk7Ci0JCQlicmVhazsKLQkJY2FzZSBCSU5BUllfTU9EVUxPOgotCQkJbmV3Y29uc3QgPSBQeU51bWJlcl9SZW1haW5kZXIodiwgdyk7Ci0JCQlicmVhazsKLQkJY2FzZSBCSU5BUllfQUREOgotCQkJbmV3Y29uc3QgPSBQeU51bWJlcl9BZGQodiwgdyk7Ci0JCQlicmVhazsKLQkJY2FzZSBCSU5BUllfU1VCVFJBQ1Q6Ci0JCQluZXdjb25zdCA9IFB5TnVtYmVyX1N1YnRyYWN0KHYsIHcpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQklOQVJZX1NVQlNDUjoKLQkJCW5ld2NvbnN0ID0gUHlPYmplY3RfR2V0SXRlbSh2LCB3KTsKLQkJCWJyZWFrOwotCQljYXNlIEJJTkFSWV9MU0hJRlQ6Ci0JCQluZXdjb25zdCA9IFB5TnVtYmVyX0xzaGlmdCh2LCB3KTsKLQkJCWJyZWFrOwotCQljYXNlIEJJTkFSWV9SU0hJRlQ6Ci0JCQluZXdjb25zdCA9IFB5TnVtYmVyX1JzaGlmdCh2LCB3KTsKLQkJCWJyZWFrOwotCQljYXNlIEJJTkFSWV9BTkQ6Ci0JCQluZXdjb25zdCA9IFB5TnVtYmVyX0FuZCh2LCB3KTsKLQkJCWJyZWFrOwotCQljYXNlIEJJTkFSWV9YT1I6Ci0JCQluZXdjb25zdCA9IFB5TnVtYmVyX1hvcih2LCB3KTsKLQkJCWJyZWFrOwotCQljYXNlIEJJTkFSWV9PUjoKLQkJCW5ld2NvbnN0ID0gUHlOdW1iZXJfT3Iodiwgdyk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCS8qIENhbGxlZCB3aXRoIGFuIHVua25vd24gb3Bjb2RlICovCi0JCQlQeUVycl9Gb3JtYXQoUHlFeGNfU3lzdGVtRXJyb3IsCi0JCQkgICAgICJ1bmV4cGVjdGVkIGJpbmFyeSBvcGVyYXRpb24gJWQgb24gYSBjb25zdGFudCIsCi0JCQkJICAgICBvcGNvZGUpOwotCQkJcmV0dXJuIDA7Ci0JfQotCWlmIChuZXdjb25zdCA9PSBOVUxMKSB7Ci0JCVB5RXJyX0NsZWFyKCk7Ci0JCXJldHVybiAwOwotCX0KLQlzaXplID0gUHlPYmplY3RfU2l6ZShuZXdjb25zdCk7Ci0JaWYgKHNpemUgPT0gLTEpCi0JCVB5RXJyX0NsZWFyKCk7Ci0JZWxzZSBpZiAoc2l6ZSA+IDIwKSB7Ci0JCVB5X0RFQ1JFRihuZXdjb25zdCk7Ci0JCXJldHVybiAwOwotCX0KKyAgICAvKiBDcmVhdGUgbmV3IGNvbnN0YW50ICovCisgICAgdiA9IFB5TGlzdF9HRVRfSVRFTShjb25zdHMsIEdFVEFSRyhjb2Rlc3RyLCAwKSk7CisgICAgdyA9IFB5TGlzdF9HRVRfSVRFTShjb25zdHMsIEdFVEFSRyhjb2Rlc3RyLCAzKSk7CisgICAgb3Bjb2RlID0gY29kZXN0cls2XTsKKyAgICBzd2l0Y2ggKG9wY29kZSkgeworICAgICAgICBjYXNlIEJJTkFSWV9QT1dFUjoKKyAgICAgICAgICAgIG5ld2NvbnN0ID0gUHlOdW1iZXJfUG93ZXIodiwgdywgUHlfTm9uZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCSU5BUllfTVVMVElQTFk6CisgICAgICAgICAgICBuZXdjb25zdCA9IFB5TnVtYmVyX011bHRpcGx5KHYsIHcpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQklOQVJZX0RJVklERToKKyAgICAgICAgICAgIC8qIENhbm5vdCBmb2xkIHRoaXMgb3BlcmF0aW9uIHN0YXRpY2FsbHkgc2luY2UKKyAgICAgICAgICAgICAgIHRoZSByZXN1bHQgY2FuIGRlcGVuZCBvbiB0aGUgcnVuLXRpbWUgcHJlc2VuY2UKKyAgICAgICAgICAgICAgIG9mIHRoZSAtUW5ldyBmbGFnICovCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgY2FzZSBCSU5BUllfVFJVRV9ESVZJREU6CisgICAgICAgICAgICBuZXdjb25zdCA9IFB5TnVtYmVyX1RydWVEaXZpZGUodiwgdyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCSU5BUllfRkxPT1JfRElWSURFOgorICAgICAgICAgICAgbmV3Y29uc3QgPSBQeU51bWJlcl9GbG9vckRpdmlkZSh2LCB3KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJJTkFSWV9NT0RVTE86CisgICAgICAgICAgICBuZXdjb25zdCA9IFB5TnVtYmVyX1JlbWFpbmRlcih2LCB3KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJJTkFSWV9BREQ6CisgICAgICAgICAgICBuZXdjb25zdCA9IFB5TnVtYmVyX0FkZCh2LCB3KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJJTkFSWV9TVUJUUkFDVDoKKyAgICAgICAgICAgIG5ld2NvbnN0ID0gUHlOdW1iZXJfU3VidHJhY3Qodiwgdyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCSU5BUllfU1VCU0NSOgorICAgICAgICAgICAgbmV3Y29uc3QgPSBQeU9iamVjdF9HZXRJdGVtKHYsIHcpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQklOQVJZX0xTSElGVDoKKyAgICAgICAgICAgIG5ld2NvbnN0ID0gUHlOdW1iZXJfTHNoaWZ0KHYsIHcpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQklOQVJZX1JTSElGVDoKKyAgICAgICAgICAgIG5ld2NvbnN0ID0gUHlOdW1iZXJfUnNoaWZ0KHYsIHcpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQklOQVJZX0FORDoKKyAgICAgICAgICAgIG5ld2NvbnN0ID0gUHlOdW1iZXJfQW5kKHYsIHcpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQklOQVJZX1hPUjoKKyAgICAgICAgICAgIG5ld2NvbnN0ID0gUHlOdW1iZXJfWG9yKHYsIHcpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQklOQVJZX09SOgorICAgICAgICAgICAgbmV3Y29uc3QgPSBQeU51bWJlcl9Pcih2LCB3KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgLyogQ2FsbGVkIHdpdGggYW4gdW5rbm93biBvcGNvZGUgKi8KKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19TeXN0ZW1FcnJvciwKKyAgICAgICAgICAgICAgICAgInVuZXhwZWN0ZWQgYmluYXJ5IG9wZXJhdGlvbiAlZCBvbiBhIGNvbnN0YW50IiwKKyAgICAgICAgICAgICAgICAgICAgIG9wY29kZSk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKG5ld2NvbnN0ID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHNpemUgPSBQeU9iamVjdF9TaXplKG5ld2NvbnN0KTsKKyAgICBpZiAoc2l6ZSA9PSAtMSkKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICBlbHNlIGlmIChzaXplID4gMjApIHsKKyAgICAgICAgUHlfREVDUkVGKG5ld2NvbnN0KTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCi0JLyogQXBwZW5kIGZvbGRlZCBjb25zdGFudCBpbnRvIGNvbnN0cyB0YWJsZSAqLwotCWxlbl9jb25zdHMgPSBQeUxpc3RfR0VUX1NJWkUoY29uc3RzKTsKLQlpZiAoUHlMaXN0X0FwcGVuZChjb25zdHMsIG5ld2NvbnN0KSkgewotCQlQeV9ERUNSRUYobmV3Y29uc3QpOwotCQlyZXR1cm4gMDsKLQl9Ci0JUHlfREVDUkVGKG5ld2NvbnN0KTsKKyAgICAvKiBBcHBlbmQgZm9sZGVkIGNvbnN0YW50IGludG8gY29uc3RzIHRhYmxlICovCisgICAgbGVuX2NvbnN0cyA9IFB5TGlzdF9HRVRfU0laRShjb25zdHMpOworICAgIGlmIChQeUxpc3RfQXBwZW5kKGNvbnN0cywgbmV3Y29uc3QpKSB7CisgICAgICAgIFB5X0RFQ1JFRihuZXdjb25zdCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBQeV9ERUNSRUYobmV3Y29uc3QpOwogCi0JLyogV3JpdGUgTk9QIE5PUCBOT1AgTk9QIExPQURfQ09OU1QgbmV3Y29uc3QgKi8KLQltZW1zZXQoY29kZXN0ciwgTk9QLCA0KTsKLQljb2Rlc3RyWzRdID0gTE9BRF9DT05TVDsKLQlTRVRBUkcoY29kZXN0ciwgNCwgbGVuX2NvbnN0cyk7Ci0JcmV0dXJuIDE7CisgICAgLyogV3JpdGUgTk9QIE5PUCBOT1AgTk9QIExPQURfQ09OU1QgbmV3Y29uc3QgKi8KKyAgICBtZW1zZXQoY29kZXN0ciwgTk9QLCA0KTsKKyAgICBjb2Rlc3RyWzRdID0gTE9BRF9DT05TVDsKKyAgICBTRVRBUkcoY29kZXN0ciwgNCwgbGVuX2NvbnN0cyk7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyBpbnQKIGZvbGRfdW5hcnlvcHNfb25fY29uc3RhbnRzKHVuc2lnbmVkIGNoYXIgKmNvZGVzdHIsIFB5T2JqZWN0ICpjb25zdHMpCiB7Ci0JUHlPYmplY3QgKm5ld2NvbnN0PU5VTEwsICp2OwotCVB5X3NzaXplX3QgbGVuX2NvbnN0czsKLQlpbnQgb3Bjb2RlOworICAgIFB5T2JqZWN0ICpuZXdjb25zdD1OVUxMLCAqdjsKKyAgICBQeV9zc2l6ZV90IGxlbl9jb25zdHM7CisgICAgaW50IG9wY29kZTsKIAotCS8qIFByZS1jb25kaXRpb25zICovCi0JYXNzZXJ0KFB5TGlzdF9DaGVja0V4YWN0KGNvbnN0cykpOwotCWFzc2VydChjb2Rlc3RyWzBdID09IExPQURfQ09OU1QpOworICAgIC8qIFByZS1jb25kaXRpb25zICovCisgICAgYXNzZXJ0KFB5TGlzdF9DaGVja0V4YWN0KGNvbnN0cykpOworICAgIGFzc2VydChjb2Rlc3RyWzBdID09IExPQURfQ09OU1QpOwogCi0JLyogQ3JlYXRlIG5ldyBjb25zdGFudCAqLwotCXYgPSBQeUxpc3RfR0VUX0lURU0oY29uc3RzLCBHRVRBUkcoY29kZXN0ciwgMCkpOwotCW9wY29kZSA9IGNvZGVzdHJbM107Ci0Jc3dpdGNoIChvcGNvZGUpIHsKLQkJY2FzZSBVTkFSWV9ORUdBVElWRToKLQkJCS8qIFByZXNlcnZlIHRoZSBzaWduIG9mIC0wLjAgKi8KLQkJCWlmIChQeU9iamVjdF9Jc1RydWUodikgPT0gMSkKLQkJCQluZXdjb25zdCA9IFB5TnVtYmVyX05lZ2F0aXZlKHYpOwotCQkJYnJlYWs7Ci0JCWNhc2UgVU5BUllfQ09OVkVSVDoKLQkJCW5ld2NvbnN0ID0gUHlPYmplY3RfUmVwcih2KTsKLQkJCWJyZWFrOwotCQljYXNlIFVOQVJZX0lOVkVSVDoKLQkJCW5ld2NvbnN0ID0gUHlOdW1iZXJfSW52ZXJ0KHYpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQkvKiBDYWxsZWQgd2l0aCBhbiB1bmtub3duIG9wY29kZSAqLwotCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1N5c3RlbUVycm9yLAotCQkJICAgICAidW5leHBlY3RlZCB1bmFyeSBvcGVyYXRpb24gJWQgb24gYSBjb25zdGFudCIsCi0JCQkJICAgICBvcGNvZGUpOwotCQkJcmV0dXJuIDA7Ci0JfQotCWlmIChuZXdjb25zdCA9PSBOVUxMKSB7Ci0JCVB5RXJyX0NsZWFyKCk7Ci0JCXJldHVybiAwOwotCX0KKyAgICAvKiBDcmVhdGUgbmV3IGNvbnN0YW50ICovCisgICAgdiA9IFB5TGlzdF9HRVRfSVRFTShjb25zdHMsIEdFVEFSRyhjb2Rlc3RyLCAwKSk7CisgICAgb3Bjb2RlID0gY29kZXN0clszXTsKKyAgICBzd2l0Y2ggKG9wY29kZSkgeworICAgICAgICBjYXNlIFVOQVJZX05FR0FUSVZFOgorICAgICAgICAgICAgLyogUHJlc2VydmUgdGhlIHNpZ24gb2YgLTAuMCAqLworICAgICAgICAgICAgaWYgKFB5T2JqZWN0X0lzVHJ1ZSh2KSA9PSAxKQorICAgICAgICAgICAgICAgIG5ld2NvbnN0ID0gUHlOdW1iZXJfTmVnYXRpdmUodik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBVTkFSWV9DT05WRVJUOgorICAgICAgICAgICAgbmV3Y29uc3QgPSBQeU9iamVjdF9SZXByKHYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVU5BUllfSU5WRVJUOgorICAgICAgICAgICAgbmV3Y29uc3QgPSBQeU51bWJlcl9JbnZlcnQodik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIC8qIENhbGxlZCB3aXRoIGFuIHVua25vd24gb3Bjb2RlICovCisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkIHVuYXJ5IG9wZXJhdGlvbiAlZCBvbiBhIGNvbnN0YW50IiwKKyAgICAgICAgICAgICAgICAgICAgIG9wY29kZSk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKG5ld2NvbnN0ID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCi0JLyogQXBwZW5kIGZvbGRlZCBjb25zdGFudCBpbnRvIGNvbnN0cyB0YWJsZSAqLwotCWxlbl9jb25zdHMgPSBQeUxpc3RfR0VUX1NJWkUoY29uc3RzKTsKLQlpZiAoUHlMaXN0X0FwcGVuZChjb25zdHMsIG5ld2NvbnN0KSkgewotCQlQeV9ERUNSRUYobmV3Y29uc3QpOwotCQlyZXR1cm4gMDsKLQl9Ci0JUHlfREVDUkVGKG5ld2NvbnN0KTsKKyAgICAvKiBBcHBlbmQgZm9sZGVkIGNvbnN0YW50IGludG8gY29uc3RzIHRhYmxlICovCisgICAgbGVuX2NvbnN0cyA9IFB5TGlzdF9HRVRfU0laRShjb25zdHMpOworICAgIGlmIChQeUxpc3RfQXBwZW5kKGNvbnN0cywgbmV3Y29uc3QpKSB7CisgICAgICAgIFB5X0RFQ1JFRihuZXdjb25zdCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBQeV9ERUNSRUYobmV3Y29uc3QpOwogCi0JLyogV3JpdGUgTk9QIExPQURfQ09OU1QgbmV3Y29uc3QgKi8KLQljb2Rlc3RyWzBdID0gTk9QOwotCWNvZGVzdHJbMV0gPSBMT0FEX0NPTlNUOwotCVNFVEFSRyhjb2Rlc3RyLCAxLCBsZW5fY29uc3RzKTsKLQlyZXR1cm4gMTsKKyAgICAvKiBXcml0ZSBOT1AgTE9BRF9DT05TVCBuZXdjb25zdCAqLworICAgIGNvZGVzdHJbMF0gPSBOT1A7CisgICAgY29kZXN0clsxXSA9IExPQURfQ09OU1Q7CisgICAgU0VUQVJHKGNvZGVzdHIsIDEsIGxlbl9jb25zdHMpOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgdW5zaWduZWQgaW50ICoKIG1hcmtibG9ja3ModW5zaWduZWQgY2hhciAqY29kZSwgUHlfc3NpemVfdCBsZW4pCiB7Ci0JdW5zaWduZWQgaW50ICpibG9ja3MgPSAodW5zaWduZWQgaW50ICopUHlNZW1fTWFsbG9jKGxlbipzaXplb2YoaW50KSk7Ci0JaW50IGksaiwgb3Bjb2RlLCBibG9ja2NudCA9IDA7CisgICAgdW5zaWduZWQgaW50ICpibG9ja3MgPSAodW5zaWduZWQgaW50ICopUHlNZW1fTWFsbG9jKGxlbipzaXplb2YoaW50KSk7CisgICAgaW50IGksaiwgb3Bjb2RlLCBibG9ja2NudCA9IDA7CiAKLQlpZiAoYmxvY2tzID09IE5VTEwpIHsKLQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCW1lbXNldChibG9ja3MsIDAsIGxlbipzaXplb2YoaW50KSk7CisgICAgaWYgKGJsb2NrcyA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBtZW1zZXQoYmxvY2tzLCAwLCBsZW4qc2l6ZW9mKGludCkpOwogCi0JLyogTWFyayBsYWJlbHMgaW4gdGhlIGZpcnN0IHBhc3MgKi8KLQlmb3IgKGk9MCA7IGk8bGVuIDsgaSs9Q09ERVNJWkUob3Bjb2RlKSkgewotCQlvcGNvZGUgPSBjb2RlW2ldOwotCQlzd2l0Y2ggKG9wY29kZSkgewotCQkJY2FzZSBGT1JfSVRFUjoKLQkJCWNhc2UgSlVNUF9GT1JXQVJEOgotCQkJY2FzZSBKVU1QX0lGX0ZBTFNFOgotCQkJY2FzZSBKVU1QX0lGX1RSVUU6Ci0JCQljYXNlIEpVTVBfQUJTT0xVVEU6Ci0JCQljYXNlIENPTlRJTlVFX0xPT1A6Ci0JCQljYXNlIFNFVFVQX0xPT1A6Ci0JCQljYXNlIFNFVFVQX0VYQ0VQVDoKLQkJCWNhc2UgU0VUVVBfRklOQUxMWToKLQkJCQlqID0gR0VUSlVNUFRHVChjb2RlLCBpKTsKLQkJCQlibG9ja3Nbal0gPSAxOwotCQkJCWJyZWFrOwotCQl9Ci0JfQotCS8qIEJ1aWxkIGJsb2NrIG51bWJlcnMgaW4gdGhlIHNlY29uZCBwYXNzICovCi0JZm9yIChpPTAgOyBpPGxlbiA7IGkrKykgewotCQlibG9ja2NudCArPSBibG9ja3NbaV07CS8qIGluY3JlbWVudCBibG9ja2NudCBvdmVyIGxhYmVscyAqLwotCQlibG9ja3NbaV0gPSBibG9ja2NudDsKLQl9Ci0JcmV0dXJuIGJsb2NrczsKKyAgICAvKiBNYXJrIGxhYmVscyBpbiB0aGUgZmlyc3QgcGFzcyAqLworICAgIGZvciAoaT0wIDsgaTxsZW4gOyBpKz1DT0RFU0laRShvcGNvZGUpKSB7CisgICAgICAgIG9wY29kZSA9IGNvZGVbaV07CisgICAgICAgIHN3aXRjaCAob3Bjb2RlKSB7CisgICAgICAgICAgICBjYXNlIEZPUl9JVEVSOgorICAgICAgICAgICAgY2FzZSBKVU1QX0ZPUldBUkQ6CisgICAgICAgICAgICBjYXNlIEpVTVBfSUZfRkFMU0U6CisgICAgICAgICAgICBjYXNlIEpVTVBfSUZfVFJVRToKKyAgICAgICAgICAgIGNhc2UgSlVNUF9BQlNPTFVURToKKyAgICAgICAgICAgIGNhc2UgQ09OVElOVUVfTE9PUDoKKyAgICAgICAgICAgIGNhc2UgU0VUVVBfTE9PUDoKKyAgICAgICAgICAgIGNhc2UgU0VUVVBfRVhDRVBUOgorICAgICAgICAgICAgY2FzZSBTRVRVUF9GSU5BTExZOgorICAgICAgICAgICAgICAgIGogPSBHRVRKVU1QVEdUKGNvZGUsIGkpOworICAgICAgICAgICAgICAgIGJsb2Nrc1tqXSA9IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgLyogQnVpbGQgYmxvY2sgbnVtYmVycyBpbiB0aGUgc2Vjb25kIHBhc3MgKi8KKyAgICBmb3IgKGk9MCA7IGk8bGVuIDsgaSsrKSB7CisgICAgICAgIGJsb2NrY250ICs9IGJsb2Nrc1tpXTsgICAgICAgICAgLyogaW5jcmVtZW50IGJsb2NrY250IG92ZXIgbGFiZWxzICovCisgICAgICAgIGJsb2Nrc1tpXSA9IGJsb2NrY250OworICAgIH0KKyAgICByZXR1cm4gYmxvY2tzOwogfQogCiAvKiBQZXJmb3JtIGJhc2ljIHBlZXBob2xlIG9wdGltaXphdGlvbnMgdG8gY29tcG9uZW50cyBvZiBhIGNvZGUgb2JqZWN0LgotICAgVGhlIGNvbnN0cyBvYmplY3Qgc2hvdWxkIHN0aWxsIGJlIGluIGxpc3QgZm9ybSB0byBhbGxvdyBuZXcgY29uc3RhbnRzIAorICAgVGhlIGNvbnN0cyBvYmplY3Qgc2hvdWxkIHN0aWxsIGJlIGluIGxpc3QgZm9ybSB0byBhbGxvdyBuZXcgY29uc3RhbnRzCiAgICB0byBiZSBhcHBlbmRlZC4KIAogICAgVG8ga2VlcCB0aGUgb3B0aW1pemVyIHNpbXBsZSwgaXQgYmFpbHMgb3V0IChkb2VzIG5vdGhpbmcpIGZvciBjb2RlCi0gICBjb250YWluaW5nIGV4dGVuZGVkIGFyZ3VtZW50cyBvciB0aGF0IGhhcyBhIGxlbmd0aCBvdmVyIDMyLDcwMC4gIFRoYXQgCi0gICBhbGxvd3MgdXMgdG8gYXZvaWQgb3ZlcmZsb3cgYW5kIHNpZ24gaXNzdWVzLgkgTGlrZXdpc2UsIGl0IGJhaWxzIHdoZW4KKyAgIGNvbnRhaW5pbmcgZXh0ZW5kZWQgYXJndW1lbnRzIG9yIHRoYXQgaGFzIGEgbGVuZ3RoIG92ZXIgMzIsNzAwLiAgVGhhdAorICAgYWxsb3dzIHVzIHRvIGF2b2lkIG92ZXJmbG93IGFuZCBzaWduIGlzc3Vlcy4gIExpa2V3aXNlLCBpdCBiYWlscyB3aGVuCiAgICB0aGUgbGluZW5vIHRhYmxlIGhhcyBjb21wbGV4IGVuY29kaW5nIGZvciBnYXBzID49IDI1NS4KIAogICAgT3B0aW1pemF0aW9ucyBhcmUgcmVzdHJpY3RlZCB0byBzaW1wbGUgdHJhbnNmb3JtYXRpb25zIG9jY3VyaW5nIHdpdGhpbiBhCi0gICBzaW5nbGUgYmFzaWMgYmxvY2suCUFsbCB0cmFuc2Zvcm1hdGlvbnMga2VlcCB0aGUgY29kZSBzaXplIHRoZSBzYW1lIG9yIAotICAgc21hbGxlci4gIEZvciB0aG9zZSB0aGF0IHJlZHVjZSBzaXplLCB0aGUgZ2FwcyBhcmUgaW5pdGlhbGx5IGZpbGxlZCB3aXRoIAotICAgTk9Qcy4gIExhdGVyIHRob3NlIE5PUHMgYXJlIHJlbW92ZWQgYW5kIHRoZSBqdW1wIGFkZHJlc3NlcyByZXRhcmdldGVkIGluIAorICAgc2luZ2xlIGJhc2ljIGJsb2NrLiAgQWxsIHRyYW5zZm9ybWF0aW9ucyBrZWVwIHRoZSBjb2RlIHNpemUgdGhlIHNhbWUgb3IKKyAgIHNtYWxsZXIuICBGb3IgdGhvc2UgdGhhdCByZWR1Y2Ugc2l6ZSwgdGhlIGdhcHMgYXJlIGluaXRpYWxseSBmaWxsZWQgd2l0aAorICAgTk9Qcy4gIExhdGVyIHRob3NlIE5PUHMgYXJlIHJlbW92ZWQgYW5kIHRoZSBqdW1wIGFkZHJlc3NlcyByZXRhcmdldGVkIGluCiAgICBhIHNpbmdsZSBwYXNzLiAgTGluZSBudW1iZXJpbmcgaXMgYWRqdXN0ZWQgYWNjb3JkaW5nbHkuICovCiAKIFB5T2JqZWN0ICoKIFB5Q29kZV9PcHRpbWl6ZShQeU9iamVjdCAqY29kZSwgUHlPYmplY3QqIGNvbnN0cywgUHlPYmplY3QgKm5hbWVzLAogICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpsaW5lbm9fb2JqKQogewotCVB5X3NzaXplX3QgaSwgaiwgY29kZWxlbjsKLQlpbnQgbm9wcywgaCwgYWRqOwotCWludCB0Z3QsIHRndHRndCwgb3Bjb2RlOwotCXVuc2lnbmVkIGNoYXIgKmNvZGVzdHIgPSBOVUxMOwotCXVuc2lnbmVkIGNoYXIgKmxpbmVubzsKLQlpbnQgKmFkZHJtYXAgPSBOVUxMOwotCWludCBuZXdfbGluZSwgY3VtX29yaWdfbGluZSwgbGFzdF9saW5lLCB0YWJzaXo7Ci0JaW50IGN1bWxjPTAsIGxhc3RsYz0wOwkvKiBDb3VudCBydW5zIG9mIGNvbnNlY3V0aXZlIExPQURfQ09OU1RzICovCi0JdW5zaWduZWQgaW50ICpibG9ja3MgPSBOVUxMOwotCWNoYXIgKm5hbWU7CisgICAgUHlfc3NpemVfdCBpLCBqLCBjb2RlbGVuOworICAgIGludCBub3BzLCBoLCBhZGo7CisgICAgaW50IHRndCwgdGd0dGd0LCBvcGNvZGU7CisgICAgdW5zaWduZWQgY2hhciAqY29kZXN0ciA9IE5VTEw7CisgICAgdW5zaWduZWQgY2hhciAqbGluZW5vOworICAgIGludCAqYWRkcm1hcCA9IE5VTEw7CisgICAgaW50IG5ld19saW5lLCBjdW1fb3JpZ19saW5lLCBsYXN0X2xpbmUsIHRhYnNpejsKKyAgICBpbnQgY3VtbGM9MCwgbGFzdGxjPTA7ICAgICAgLyogQ291bnQgcnVucyBvZiBjb25zZWN1dGl2ZSBMT0FEX0NPTlNUcyAqLworICAgIHVuc2lnbmVkIGludCAqYmxvY2tzID0gTlVMTDsKKyAgICBjaGFyICpuYW1lOwogCi0JLyogQmFpbCBvdXQgaWYgYW4gZXhjZXB0aW9uIGlzIHNldCAqLwotCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQlnb3RvIGV4aXRFcnJvcjsKKyAgICAvKiBCYWlsIG91dCBpZiBhbiBleGNlcHRpb24gaXMgc2V0ICovCisgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIGdvdG8gZXhpdEVycm9yOwogCi0JLyogQnlwYXNzIG9wdGltaXphdGlvbiB3aGVuIHRoZSBsaW5lbm8gdGFibGUgaXMgdG9vIGNvbXBsZXggKi8KLQlhc3NlcnQoUHlTdHJpbmdfQ2hlY2sobGluZW5vX29iaikpOwotCWxpbmVubyA9ICh1bnNpZ25lZCBjaGFyKilQeVN0cmluZ19BU19TVFJJTkcobGluZW5vX29iaik7Ci0JdGFic2l6ID0gUHlTdHJpbmdfR0VUX1NJWkUobGluZW5vX29iaik7Ci0JaWYgKG1lbWNocihsaW5lbm8sIDI1NSwgdGFic2l6KSAhPSBOVUxMKQotCQlnb3RvIGV4aXRVbmNoYW5nZWQ7CisgICAgLyogQnlwYXNzIG9wdGltaXphdGlvbiB3aGVuIHRoZSBsaW5lbm8gdGFibGUgaXMgdG9vIGNvbXBsZXggKi8KKyAgICBhc3NlcnQoUHlTdHJpbmdfQ2hlY2sobGluZW5vX29iaikpOworICAgIGxpbmVubyA9ICh1bnNpZ25lZCBjaGFyKilQeVN0cmluZ19BU19TVFJJTkcobGluZW5vX29iaik7CisgICAgdGFic2l6ID0gUHlTdHJpbmdfR0VUX1NJWkUobGluZW5vX29iaik7CisgICAgaWYgKG1lbWNocihsaW5lbm8sIDI1NSwgdGFic2l6KSAhPSBOVUxMKQorICAgICAgICBnb3RvIGV4aXRVbmNoYW5nZWQ7CiAKLQkvKiBBdm9pZCBzaXR1YXRpb25zIHdoZXJlIGp1bXAgcmV0YXJnZXRpbmcgY291bGQgb3ZlcmZsb3cgKi8KLQlhc3NlcnQoUHlTdHJpbmdfQ2hlY2soY29kZSkpOwotCWNvZGVsZW4gPSBQeVN0cmluZ19HRVRfU0laRShjb2RlKTsKLQlpZiAoY29kZWxlbiA+IDMyNzAwKQotCQlnb3RvIGV4aXRVbmNoYW5nZWQ7CisgICAgLyogQXZvaWQgc2l0dWF0aW9ucyB3aGVyZSBqdW1wIHJldGFyZ2V0aW5nIGNvdWxkIG92ZXJmbG93ICovCisgICAgYXNzZXJ0KFB5U3RyaW5nX0NoZWNrKGNvZGUpKTsKKyAgICBjb2RlbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUoY29kZSk7CisgICAgaWYgKGNvZGVsZW4gPiAzMjcwMCkKKyAgICAgICAgZ290byBleGl0VW5jaGFuZ2VkOwogCi0JLyogTWFrZSBhIG1vZGlmaWFibGUgY29weSBvZiB0aGUgY29kZSBzdHJpbmcgKi8KLQljb2Rlc3RyID0gKHVuc2lnbmVkIGNoYXIgKilQeU1lbV9NYWxsb2MoY29kZWxlbik7Ci0JaWYgKGNvZGVzdHIgPT0gTlVMTCkKLQkJZ290byBleGl0RXJyb3I7Ci0JY29kZXN0ciA9ICh1bnNpZ25lZCBjaGFyICopbWVtY3B5KGNvZGVzdHIsIAotCQkJCQkgIFB5U3RyaW5nX0FTX1NUUklORyhjb2RlKSwgY29kZWxlbik7CisgICAgLyogTWFrZSBhIG1vZGlmaWFibGUgY29weSBvZiB0aGUgY29kZSBzdHJpbmcgKi8KKyAgICBjb2Rlc3RyID0gKHVuc2lnbmVkIGNoYXIgKilQeU1lbV9NYWxsb2MoY29kZWxlbik7CisgICAgaWYgKGNvZGVzdHIgPT0gTlVMTCkKKyAgICAgICAgZ290byBleGl0RXJyb3I7CisgICAgY29kZXN0ciA9ICh1bnNpZ25lZCBjaGFyICopbWVtY3B5KGNvZGVzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FTX1NUUklORyhjb2RlKSwgY29kZWxlbik7CiAKLQkvKiBWZXJpZnkgdGhhdCBSRVRVUk5fVkFMVUUgdGVybWluYXRlcyB0aGUgY29kZXN0cmluZy4JVGhpcyBhbGxvd3MKLQkgICB0aGUgdmFyaW91cyB0cmFuc2Zvcm1hdGlvbiBwYXR0ZXJucyB0byBsb29rIGFoZWFkIHNldmVyYWwKLQkgICBpbnN0cnVjdGlvbnMgd2l0aG91dCBhZGRpdGlvbmFsIGNoZWNrcyB0byBtYWtlIHN1cmUgdGhleSBhcmUgbm90Ci0JICAgbG9va2luZyBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgY29kZSBzdHJpbmcuCi0JKi8KLQlpZiAoY29kZXN0cltjb2RlbGVuLTFdICE9IFJFVFVSTl9WQUxVRSkKLQkJZ290byBleGl0VW5jaGFuZ2VkOworICAgIC8qIFZlcmlmeSB0aGF0IFJFVFVSTl9WQUxVRSB0ZXJtaW5hdGVzIHRoZSBjb2Rlc3RyaW5nLiAgICAgIFRoaXMgYWxsb3dzCisgICAgICAgdGhlIHZhcmlvdXMgdHJhbnNmb3JtYXRpb24gcGF0dGVybnMgdG8gbG9vayBhaGVhZCBzZXZlcmFsCisgICAgICAgaW5zdHJ1Y3Rpb25zIHdpdGhvdXQgYWRkaXRpb25hbCBjaGVja3MgdG8gbWFrZSBzdXJlIHRoZXkgYXJlIG5vdAorICAgICAgIGxvb2tpbmcgYmV5b25kIHRoZSBlbmQgb2YgdGhlIGNvZGUgc3RyaW5nLgorICAgICovCisgICAgaWYgKGNvZGVzdHJbY29kZWxlbi0xXSAhPSBSRVRVUk5fVkFMVUUpCisgICAgICAgIGdvdG8gZXhpdFVuY2hhbmdlZDsKIAotCS8qIE1hcHBpbmcgdG8gbmV3IGp1bXAgdGFyZ2V0cyBhZnRlciBOT1BzIGFyZSByZW1vdmVkICovCi0JYWRkcm1hcCA9IChpbnQgKilQeU1lbV9NYWxsb2MoY29kZWxlbiAqIHNpemVvZihpbnQpKTsKLQlpZiAoYWRkcm1hcCA9PSBOVUxMKQotCQlnb3RvIGV4aXRFcnJvcjsKKyAgICAvKiBNYXBwaW5nIHRvIG5ldyBqdW1wIHRhcmdldHMgYWZ0ZXIgTk9QcyBhcmUgcmVtb3ZlZCAqLworICAgIGFkZHJtYXAgPSAoaW50ICopUHlNZW1fTWFsbG9jKGNvZGVsZW4gKiBzaXplb2YoaW50KSk7CisgICAgaWYgKGFkZHJtYXAgPT0gTlVMTCkKKyAgICAgICAgZ290byBleGl0RXJyb3I7CiAKLQlibG9ja3MgPSBtYXJrYmxvY2tzKGNvZGVzdHIsIGNvZGVsZW4pOwotCWlmIChibG9ja3MgPT0gTlVMTCkKLQkJZ290byBleGl0RXJyb3I7Ci0JYXNzZXJ0KFB5TGlzdF9DaGVjayhjb25zdHMpKTsKKyAgICBibG9ja3MgPSBtYXJrYmxvY2tzKGNvZGVzdHIsIGNvZGVsZW4pOworICAgIGlmIChibG9ja3MgPT0gTlVMTCkKKyAgICAgICAgZ290byBleGl0RXJyb3I7CisgICAgYXNzZXJ0KFB5TGlzdF9DaGVjayhjb25zdHMpKTsKIAotCWZvciAoaT0wIDsgaTxjb2RlbGVuIDsgaSArPSBDT0RFU0laRShjb2Rlc3RyW2ldKSkgewotCQlvcGNvZGUgPSBjb2Rlc3RyW2ldOworICAgIGZvciAoaT0wIDsgaTxjb2RlbGVuIDsgaSArPSBDT0RFU0laRShjb2Rlc3RyW2ldKSkgeworICAgICAgICBvcGNvZGUgPSBjb2Rlc3RyW2ldOwogCi0JCWxhc3RsYyA9IGN1bWxjOwotCQljdW1sYyA9IDA7CisgICAgICAgIGxhc3RsYyA9IGN1bWxjOworICAgICAgICBjdW1sYyA9IDA7CiAKLQkJc3dpdGNoIChvcGNvZGUpIHsKKyAgICAgICAgc3dpdGNoIChvcGNvZGUpIHsKIAotCQkJLyogUmVwbGFjZSBVTkFSWV9OT1QgSlVNUF9JRl9GQUxTRSBQT1BfVE9QIHdpdGggCi0JCQkgICB3aXRoCSAgIEpVTVBfSUZfVFJVRSBQT1BfVE9QICovCi0JCQljYXNlIFVOQVJZX05PVDoKLQkJCQlpZiAoY29kZXN0cltpKzFdICE9IEpVTVBfSUZfRkFMU0UgIHx8Ci0JCQkJICAgIGNvZGVzdHJbaSs0XSAhPSBQT1BfVE9QICB8fAotCQkJCSAgICAhSVNCQVNJQ0JMT0NLKGJsb2NrcyxpLDUpKQotCQkJCQljb250aW51ZTsKLQkJCQl0Z3QgPSBHRVRKVU1QVEdUKGNvZGVzdHIsIChpKzEpKTsKLQkJCQlpZiAoY29kZXN0clt0Z3RdICE9IFBPUF9UT1ApCi0JCQkJCWNvbnRpbnVlOwotCQkJCWogPSBHRVRBUkcoY29kZXN0ciwgaSsxKSArIDE7Ci0JCQkJY29kZXN0cltpXSA9IEpVTVBfSUZfVFJVRTsKLQkJCQlTRVRBUkcoY29kZXN0ciwgaSwgaik7Ci0JCQkJY29kZXN0cltpKzNdID0gUE9QX1RPUDsKLQkJCQljb2Rlc3RyW2krNF0gPSBOT1A7Ci0JCQkJYnJlYWs7CisgICAgICAgICAgICAvKiBSZXBsYWNlIFVOQVJZX05PVCBKVU1QX0lGX0ZBTFNFIFBPUF9UT1Agd2l0aAorICAgICAgICAgICAgICAgd2l0aCAgICAgICAgICAgICAgICBKVU1QX0lGX1RSVUUgUE9QX1RPUCAqLworICAgICAgICAgICAgY2FzZSBVTkFSWV9OT1Q6CisgICAgICAgICAgICAgICAgaWYgKGNvZGVzdHJbaSsxXSAhPSBKVU1QX0lGX0ZBTFNFICB8fAorICAgICAgICAgICAgICAgICAgICBjb2Rlc3RyW2krNF0gIT0gUE9QX1RPUCAgfHwKKyAgICAgICAgICAgICAgICAgICAgIUlTQkFTSUNCTE9DSyhibG9ja3MsaSw1KSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgdGd0ID0gR0VUSlVNUFRHVChjb2Rlc3RyLCAoaSsxKSk7CisgICAgICAgICAgICAgICAgaWYgKGNvZGVzdHJbdGd0XSAhPSBQT1BfVE9QKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBqID0gR0VUQVJHKGNvZGVzdHIsIGkrMSkgKyAxOworICAgICAgICAgICAgICAgIGNvZGVzdHJbaV0gPSBKVU1QX0lGX1RSVUU7CisgICAgICAgICAgICAgICAgU0VUQVJHKGNvZGVzdHIsIGksIGopOworICAgICAgICAgICAgICAgIGNvZGVzdHJbaSszXSA9IFBPUF9UT1A7CisgICAgICAgICAgICAgICAgY29kZXN0cltpKzRdID0gTk9QOworICAgICAgICAgICAgICAgIGJyZWFrOwogCi0JCQkJLyogbm90IGEgaXMgYiAtLT4gIGEgaXMgbm90IGIKLQkJCQkgICBub3QgYSBpbiBiIC0tPiAgYSBub3QgaW4gYgotCQkJCSAgIG5vdCBhIGlzIG5vdCBiIC0tPiAgYSBpcyBiCi0JCQkJICAgbm90IGEgbm90IGluIGIgLS0+ICBhIGluIGIKLQkJCQkqLwotCQkJY2FzZSBDT01QQVJFX09QOgotCQkJCWogPSBHRVRBUkcoY29kZXN0ciwgaSk7Ci0JCQkJaWYgKGogPCA2ICB8fCAgaiA+IDkgIHx8Ci0JCQkJICAgIGNvZGVzdHJbaSszXSAhPSBVTkFSWV9OT1QgIHx8IAotCQkJCSAgICAhSVNCQVNJQ0JMT0NLKGJsb2NrcyxpLDQpKQotCQkJCQljb250aW51ZTsKLQkJCQlTRVRBUkcoY29kZXN0ciwgaSwgKGpeMSkpOwotCQkJCWNvZGVzdHJbaSszXSA9IE5PUDsKLQkJCQlicmVhazsKKyAgICAgICAgICAgICAgICAvKiBub3QgYSBpcyBiIC0tPiAgYSBpcyBub3QgYgorICAgICAgICAgICAgICAgICAgIG5vdCBhIGluIGIgLS0+ICBhIG5vdCBpbiBiCisgICAgICAgICAgICAgICAgICAgbm90IGEgaXMgbm90IGIgLS0+ICBhIGlzIGIKKyAgICAgICAgICAgICAgICAgICBub3QgYSBub3QgaW4gYiAtLT4gIGEgaW4gYgorICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICBjYXNlIENPTVBBUkVfT1A6CisgICAgICAgICAgICAgICAgaiA9IEdFVEFSRyhjb2Rlc3RyLCBpKTsKKyAgICAgICAgICAgICAgICBpZiAoaiA8IDYgIHx8ICBqID4gOSAgfHwKKyAgICAgICAgICAgICAgICAgICAgY29kZXN0cltpKzNdICE9IFVOQVJZX05PVCAgfHwKKyAgICAgICAgICAgICAgICAgICAgIUlTQkFTSUNCTE9DSyhibG9ja3MsaSw0KSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgU0VUQVJHKGNvZGVzdHIsIGksIChqXjEpKTsKKyAgICAgICAgICAgICAgICBjb2Rlc3RyW2krM10gPSBOT1A7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAKLQkJCQkvKiBSZXBsYWNlIExPQURfR0xPQkFML0xPQURfTkFNRSBOb25lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggTE9BRF9DT05TVCBOb25lICovCi0JCQljYXNlIExPQURfTkFNRToKLQkJCWNhc2UgTE9BRF9HTE9CQUw6Ci0JCQkJaiA9IEdFVEFSRyhjb2Rlc3RyLCBpKTsKLQkJCQluYW1lID0gUHlTdHJpbmdfQXNTdHJpbmcoUHlUdXBsZV9HRVRfSVRFTShuYW1lcywgaikpOwotCQkJCWlmIChuYW1lID09IE5VTEwgIHx8ICBzdHJjbXAobmFtZSwgIk5vbmUiKSAhPSAwKQotCQkJCQljb250aW51ZTsKLQkJCQlmb3IgKGo9MCA7IGogPCBQeUxpc3RfR0VUX1NJWkUoY29uc3RzKSA7IGorKykgewotCQkJCQlpZiAoUHlMaXN0X0dFVF9JVEVNKGNvbnN0cywgaikgPT0gUHlfTm9uZSkKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpZiAoaiA9PSBQeUxpc3RfR0VUX1NJWkUoY29uc3RzKSkgewotCQkJCQlpZiAoUHlMaXN0X0FwcGVuZChjb25zdHMsIFB5X05vbmUpID09IC0xKQotCQkJCQkgICAgICAgIGdvdG8gZXhpdEVycm9yOwotCQkJCX0KLQkJCQlhc3NlcnQoUHlMaXN0X0dFVF9JVEVNKGNvbnN0cywgaikgPT0gUHlfTm9uZSk7Ci0JCQkJY29kZXN0cltpXSA9IExPQURfQ09OU1Q7Ci0JCQkJU0VUQVJHKGNvZGVzdHIsIGksIGopOwotCQkJCWN1bWxjID0gbGFzdGxjICsgMTsKLQkJCQlicmVhazsKKyAgICAgICAgICAgICAgICAvKiBSZXBsYWNlIExPQURfR0xPQkFML0xPQURfTkFNRSBOb25lCisgICAgICAgICAgICAgICAgICAgd2l0aCBMT0FEX0NPTlNUIE5vbmUgKi8KKyAgICAgICAgICAgIGNhc2UgTE9BRF9OQU1FOgorICAgICAgICAgICAgY2FzZSBMT0FEX0dMT0JBTDoKKyAgICAgICAgICAgICAgICBqID0gR0VUQVJHKGNvZGVzdHIsIGkpOworICAgICAgICAgICAgICAgIG5hbWUgPSBQeVN0cmluZ19Bc1N0cmluZyhQeVR1cGxlX0dFVF9JVEVNKG5hbWVzLCBqKSk7CisgICAgICAgICAgICAgICAgaWYgKG5hbWUgPT0gTlVMTCAgfHwgIHN0cmNtcChuYW1lLCAiTm9uZSIpICE9IDApCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGZvciAoaj0wIDsgaiA8IFB5TGlzdF9HRVRfU0laRShjb25zdHMpIDsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChQeUxpc3RfR0VUX0lURU0oY29uc3RzLCBqKSA9PSBQeV9Ob25lKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChqID09IFB5TGlzdF9HRVRfU0laRShjb25zdHMpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChQeUxpc3RfQXBwZW5kKGNvbnN0cywgUHlfTm9uZSkgPT0gLTEpCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXRFcnJvcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYXNzZXJ0KFB5TGlzdF9HRVRfSVRFTShjb25zdHMsIGopID09IFB5X05vbmUpOworICAgICAgICAgICAgICAgIGNvZGVzdHJbaV0gPSBMT0FEX0NPTlNUOworICAgICAgICAgICAgICAgIFNFVEFSRyhjb2Rlc3RyLCBpLCBqKTsKKyAgICAgICAgICAgICAgICBjdW1sYyA9IGxhc3RsYyArIDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAKLQkJCQkvKiBTa2lwIG92ZXIgTE9BRF9DT05TVCB0cnVlY29uc3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlVNUF9JRl9GQUxTRSB4eCAgUE9QX1RPUCAqLwotCQkJY2FzZSBMT0FEX0NPTlNUOgotCQkJCWN1bWxjID0gbGFzdGxjICsgMTsKLQkJCQlqID0gR0VUQVJHKGNvZGVzdHIsIGkpOwotCQkJCWlmIChjb2Rlc3RyW2krM10gIT0gSlVNUF9JRl9GQUxTRSAgfHwKLQkJCQkgICAgY29kZXN0cltpKzZdICE9IFBPUF9UT1AgIHx8Ci0JCQkJICAgICFJU0JBU0lDQkxPQ0soYmxvY2tzLGksNykgIHx8Ci0JCQkJICAgICFQeU9iamVjdF9Jc1RydWUoUHlMaXN0X0dFVF9JVEVNKGNvbnN0cywgaikpKQotCQkJCQljb250aW51ZTsKLQkJCQltZW1zZXQoY29kZXN0citpLCBOT1AsIDcpOwotCQkJCWN1bWxjID0gMDsKLQkJCQlicmVhazsKKyAgICAgICAgICAgICAgICAvKiBTa2lwIG92ZXIgTE9BRF9DT05TVCB0cnVlY29uc3QKKyAgICAgICAgICAgICAgICAgICBKVU1QX0lGX0ZBTFNFIHh4ICBQT1BfVE9QICovCisgICAgICAgICAgICBjYXNlIExPQURfQ09OU1Q6CisgICAgICAgICAgICAgICAgY3VtbGMgPSBsYXN0bGMgKyAxOworICAgICAgICAgICAgICAgIGogPSBHRVRBUkcoY29kZXN0ciwgaSk7CisgICAgICAgICAgICAgICAgaWYgKGNvZGVzdHJbaSszXSAhPSBKVU1QX0lGX0ZBTFNFICB8fAorICAgICAgICAgICAgICAgICAgICBjb2Rlc3RyW2krNl0gIT0gUE9QX1RPUCAgfHwKKyAgICAgICAgICAgICAgICAgICAgIUlTQkFTSUNCTE9DSyhibG9ja3MsaSw3KSAgfHwKKyAgICAgICAgICAgICAgICAgICAgIVB5T2JqZWN0X0lzVHJ1ZShQeUxpc3RfR0VUX0lURU0oY29uc3RzLCBqKSkpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIG1lbXNldChjb2Rlc3RyK2ksIE5PUCwgNyk7CisgICAgICAgICAgICAgICAgY3VtbGMgPSAwOworICAgICAgICAgICAgICAgIGJyZWFrOwogCi0JCQkJLyogVHJ5IHRvIGZvbGQgdHVwbGVzIG9mIGNvbnN0YW50cyAoaW5jbHVkZXMgYSBjYXNlIGZvciBsaXN0cwotCQkJCSAgIHdoaWNoIGFyZSBvbmx5IHVzZWQgZm9yICJpbiIgYW5kICJub3QgaW4iIHRlc3RzKS4KLQkJCQkgICBTa2lwIG92ZXIgQlVJTERfU0VRTiAxIFVOUEFDS19TRVFOIDEuCi0JCQkJICAgUmVwbGFjZSBCVUlMRF9TRVFOIDIgVU5QQUNLX1NFUU4gMiB3aXRoIFJPVDIuCi0JCQkJICAgUmVwbGFjZSBCVUlMRF9TRVFOIDMgVU5QQUNLX1NFUU4gMyB3aXRoIFJPVDMgUk9UMi4gKi8KLQkJCWNhc2UgQlVJTERfVFVQTEU6Ci0JCQljYXNlIEJVSUxEX0xJU1Q6Ci0JCQkJaiA9IEdFVEFSRyhjb2Rlc3RyLCBpKTsKLQkJCQloID0gaSAtIDMgKiBqOwotCQkJCWlmIChoID49IDAgICYmCi0JCQkJICAgIGogPD0gbGFzdGxjCSAmJgotCQkJCSAgICAoKG9wY29kZSA9PSBCVUlMRF9UVVBMRSAmJiAKLQkJCQkgICAgICBJU0JBU0lDQkxPQ0soYmxvY2tzLCBoLCAzKihqKzEpKSkgfHwKLQkJCQkgICAgIChvcGNvZGUgPT0gQlVJTERfTElTVCAmJiAKLQkJCQkgICAgICBjb2Rlc3RyW2krM109PUNPTVBBUkVfT1AgJiYgCi0JCQkJICAgICAgSVNCQVNJQ0JMT0NLKGJsb2NrcywgaCwgMyooaisyKSkgJiYKLQkJCQkgICAgICAoR0VUQVJHKGNvZGVzdHIsaSszKT09NiB8fAotCQkJCSAgICAgICBHRVRBUkcoY29kZXN0cixpKzMpPT03KSkpICYmCi0JCQkJICAgIHR1cGxlX29mX2NvbnN0YW50cygmY29kZXN0cltoXSwgaiwgY29uc3RzKSkgewotCQkJCQlhc3NlcnQoY29kZXN0cltpXSA9PSBMT0FEX0NPTlNUKTsKLQkJCQkJY3VtbGMgPSAxOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaWYgKGNvZGVzdHJbaSszXSAhPSBVTlBBQ0tfU0VRVUVOQ0UgIHx8Ci0JCQkJICAgICFJU0JBU0lDQkxPQ0soYmxvY2tzLGksNikgfHwKLQkJCQkgICAgaiAhPSBHRVRBUkcoY29kZXN0ciwgaSszKSkKLQkJCQkJY29udGludWU7Ci0JCQkJaWYgKGogPT0gMSkgewotCQkJCQltZW1zZXQoY29kZXN0citpLCBOT1AsIDYpOwotCQkJCX0gZWxzZSBpZiAoaiA9PSAyKSB7Ci0JCQkJCWNvZGVzdHJbaV0gPSBST1RfVFdPOwotCQkJCQltZW1zZXQoY29kZXN0citpKzEsIE5PUCwgNSk7Ci0JCQkJfSBlbHNlIGlmIChqID09IDMpIHsKLQkJCQkJY29kZXN0cltpXSA9IFJPVF9USFJFRTsKLQkJCQkJY29kZXN0cltpKzFdID0gUk9UX1RXTzsKLQkJCQkJbWVtc2V0KGNvZGVzdHIraSsyLCBOT1AsIDQpOwotCQkJCX0KLQkJCQlicmVhazsKKyAgICAgICAgICAgICAgICAvKiBUcnkgdG8gZm9sZCB0dXBsZXMgb2YgY29uc3RhbnRzIChpbmNsdWRlcyBhIGNhc2UgZm9yIGxpc3RzCisgICAgICAgICAgICAgICAgICAgd2hpY2ggYXJlIG9ubHkgdXNlZCBmb3IgImluIiBhbmQgIm5vdCBpbiIgdGVzdHMpLgorICAgICAgICAgICAgICAgICAgIFNraXAgb3ZlciBCVUlMRF9TRVFOIDEgVU5QQUNLX1NFUU4gMS4KKyAgICAgICAgICAgICAgICAgICBSZXBsYWNlIEJVSUxEX1NFUU4gMiBVTlBBQ0tfU0VRTiAyIHdpdGggUk9UMi4KKyAgICAgICAgICAgICAgICAgICBSZXBsYWNlIEJVSUxEX1NFUU4gMyBVTlBBQ0tfU0VRTiAzIHdpdGggUk9UMyBST1QyLiAqLworICAgICAgICAgICAgY2FzZSBCVUlMRF9UVVBMRToKKyAgICAgICAgICAgIGNhc2UgQlVJTERfTElTVDoKKyAgICAgICAgICAgICAgICBqID0gR0VUQVJHKGNvZGVzdHIsIGkpOworICAgICAgICAgICAgICAgIGggPSBpIC0gMyAqIGo7CisgICAgICAgICAgICAgICAgaWYgKGggPj0gMCAgJiYKKyAgICAgICAgICAgICAgICAgICAgaiA8PSBsYXN0bGMgICAgICAgICAgICAgICAgICAmJgorICAgICAgICAgICAgICAgICAgICAoKG9wY29kZSA9PSBCVUlMRF9UVVBMRSAmJgorICAgICAgICAgICAgICAgICAgICAgIElTQkFTSUNCTE9DSyhibG9ja3MsIGgsIDMqKGorMSkpKSB8fAorICAgICAgICAgICAgICAgICAgICAgKG9wY29kZSA9PSBCVUlMRF9MSVNUICYmCisgICAgICAgICAgICAgICAgICAgICAgY29kZXN0cltpKzNdPT1DT01QQVJFX09QICYmCisgICAgICAgICAgICAgICAgICAgICAgSVNCQVNJQ0JMT0NLKGJsb2NrcywgaCwgMyooaisyKSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAoR0VUQVJHKGNvZGVzdHIsaSszKT09NiB8fAorICAgICAgICAgICAgICAgICAgICAgICBHRVRBUkcoY29kZXN0cixpKzMpPT03KSkpICYmCisgICAgICAgICAgICAgICAgICAgIHR1cGxlX29mX2NvbnN0YW50cygmY29kZXN0cltoXSwgaiwgY29uc3RzKSkgeworICAgICAgICAgICAgICAgICAgICBhc3NlcnQoY29kZXN0cltpXSA9PSBMT0FEX0NPTlNUKTsKKyAgICAgICAgICAgICAgICAgICAgY3VtbGMgPSAxOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGNvZGVzdHJbaSszXSAhPSBVTlBBQ0tfU0VRVUVOQ0UgIHx8CisgICAgICAgICAgICAgICAgICAgICFJU0JBU0lDQkxPQ0soYmxvY2tzLGksNikgfHwKKyAgICAgICAgICAgICAgICAgICAgaiAhPSBHRVRBUkcoY29kZXN0ciwgaSszKSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgaWYgKGogPT0gMSkgeworICAgICAgICAgICAgICAgICAgICBtZW1zZXQoY29kZXN0citpLCBOT1AsIDYpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaiA9PSAyKSB7CisgICAgICAgICAgICAgICAgICAgIGNvZGVzdHJbaV0gPSBST1RfVFdPOworICAgICAgICAgICAgICAgICAgICBtZW1zZXQoY29kZXN0citpKzEsIE5PUCwgNSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChqID09IDMpIHsKKyAgICAgICAgICAgICAgICAgICAgY29kZXN0cltpXSA9IFJPVF9USFJFRTsKKyAgICAgICAgICAgICAgICAgICAgY29kZXN0cltpKzFdID0gUk9UX1RXTzsKKyAgICAgICAgICAgICAgICAgICAgbWVtc2V0KGNvZGVzdHIraSsyLCBOT1AsIDQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKIAotCQkJCS8qIEZvbGQgYmluYXJ5IG9wcyBvbiBjb25zdGFudHMuCi0JCQkJICAgTE9BRF9DT05TVCBjMSBMT0FEX0NPTlNUIGMyIEJJTk9QIC0tPiAgTE9BRF9DT05TVCBiaW5vcChjMSxjMikgKi8KLQkJCWNhc2UgQklOQVJZX1BPV0VSOgotCQkJY2FzZSBCSU5BUllfTVVMVElQTFk6Ci0JCQljYXNlIEJJTkFSWV9UUlVFX0RJVklERToKLQkJCWNhc2UgQklOQVJZX0ZMT09SX0RJVklERToKLQkJCWNhc2UgQklOQVJZX01PRFVMTzoKLQkJCWNhc2UgQklOQVJZX0FERDoKLQkJCWNhc2UgQklOQVJZX1NVQlRSQUNUOgotCQkJY2FzZSBCSU5BUllfU1VCU0NSOgotCQkJY2FzZSBCSU5BUllfTFNISUZUOgotCQkJY2FzZSBCSU5BUllfUlNISUZUOgotCQkJY2FzZSBCSU5BUllfQU5EOgotCQkJY2FzZSBCSU5BUllfWE9SOgotCQkJY2FzZSBCSU5BUllfT1I6Ci0JCQkJaWYgKGxhc3RsYyA+PSAyCSAmJgotCQkJCSAgICBJU0JBU0lDQkxPQ0soYmxvY2tzLCBpLTYsIDcpICAmJgotCQkJCSAgICBmb2xkX2Jpbm9wc19vbl9jb25zdGFudHMoJmNvZGVzdHJbaS02XSwgY29uc3RzKSkgewotCQkJCQlpIC09IDI7Ci0JCQkJCWFzc2VydChjb2Rlc3RyW2ldID09IExPQURfQ09OU1QpOwotCQkJCQljdW1sYyA9IDE7Ci0JCQkJfQotCQkJCWJyZWFrOworICAgICAgICAgICAgICAgIC8qIEZvbGQgYmluYXJ5IG9wcyBvbiBjb25zdGFudHMuCisgICAgICAgICAgICAgICAgICAgTE9BRF9DT05TVCBjMSBMT0FEX0NPTlNUIGMyIEJJTk9QIC0tPiAgTE9BRF9DT05TVCBiaW5vcChjMSxjMikgKi8KKyAgICAgICAgICAgIGNhc2UgQklOQVJZX1BPV0VSOgorICAgICAgICAgICAgY2FzZSBCSU5BUllfTVVMVElQTFk6CisgICAgICAgICAgICBjYXNlIEJJTkFSWV9UUlVFX0RJVklERToKKyAgICAgICAgICAgIGNhc2UgQklOQVJZX0ZMT09SX0RJVklERToKKyAgICAgICAgICAgIGNhc2UgQklOQVJZX01PRFVMTzoKKyAgICAgICAgICAgIGNhc2UgQklOQVJZX0FERDoKKyAgICAgICAgICAgIGNhc2UgQklOQVJZX1NVQlRSQUNUOgorICAgICAgICAgICAgY2FzZSBCSU5BUllfU1VCU0NSOgorICAgICAgICAgICAgY2FzZSBCSU5BUllfTFNISUZUOgorICAgICAgICAgICAgY2FzZSBCSU5BUllfUlNISUZUOgorICAgICAgICAgICAgY2FzZSBCSU5BUllfQU5EOgorICAgICAgICAgICAgY2FzZSBCSU5BUllfWE9SOgorICAgICAgICAgICAgY2FzZSBCSU5BUllfT1I6CisgICAgICAgICAgICAgICAgaWYgKGxhc3RsYyA+PSAyICAgICAgICAgICAgICAgICAgJiYKKyAgICAgICAgICAgICAgICAgICAgSVNCQVNJQ0JMT0NLKGJsb2NrcywgaS02LCA3KSAgJiYKKyAgICAgICAgICAgICAgICAgICAgZm9sZF9iaW5vcHNfb25fY29uc3RhbnRzKCZjb2Rlc3RyW2ktNl0sIGNvbnN0cykpIHsKKyAgICAgICAgICAgICAgICAgICAgaSAtPSAyOworICAgICAgICAgICAgICAgICAgICBhc3NlcnQoY29kZXN0cltpXSA9PSBMT0FEX0NPTlNUKTsKKyAgICAgICAgICAgICAgICAgICAgY3VtbGMgPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKIAotCQkJCS8qIEZvbGQgdW5hcnkgb3BzIG9uIGNvbnN0YW50cy4KLQkJCQkgICBMT0FEX0NPTlNUIGMxICBVTkFSWV9PUCAtLT4JTE9BRF9DT05TVCB1bmFyeV9vcChjKSAqLwotCQkJY2FzZSBVTkFSWV9ORUdBVElWRToKLQkJCWNhc2UgVU5BUllfQ09OVkVSVDoKLQkJCWNhc2UgVU5BUllfSU5WRVJUOgotCQkJCWlmIChsYXN0bGMgPj0gMQkgJiYKLQkJCQkgICAgSVNCQVNJQ0JMT0NLKGJsb2NrcywgaS0zLCA0KSAgJiYKLQkJCQkgICAgZm9sZF91bmFyeW9wc19vbl9jb25zdGFudHMoJmNvZGVzdHJbaS0zXSwgY29uc3RzKSkJewotCQkJCQlpIC09IDI7Ci0JCQkJCWFzc2VydChjb2Rlc3RyW2ldID09IExPQURfQ09OU1QpOwotCQkJCQljdW1sYyA9IDE7Ci0JCQkJfQotCQkJCWJyZWFrOworICAgICAgICAgICAgICAgIC8qIEZvbGQgdW5hcnkgb3BzIG9uIGNvbnN0YW50cy4KKyAgICAgICAgICAgICAgICAgICBMT0FEX0NPTlNUIGMxICBVTkFSWV9PUCAtLT4gICAgICAgICAgICAgICAgICBMT0FEX0NPTlNUIHVuYXJ5X29wKGMpICovCisgICAgICAgICAgICBjYXNlIFVOQVJZX05FR0FUSVZFOgorICAgICAgICAgICAgY2FzZSBVTkFSWV9DT05WRVJUOgorICAgICAgICAgICAgY2FzZSBVTkFSWV9JTlZFUlQ6CisgICAgICAgICAgICAgICAgaWYgKGxhc3RsYyA+PSAxICAgICAgICAgICAgICAgICAgJiYKKyAgICAgICAgICAgICAgICAgICAgSVNCQVNJQ0JMT0NLKGJsb2NrcywgaS0zLCA0KSAgJiYKKyAgICAgICAgICAgICAgICAgICAgZm9sZF91bmFyeW9wc19vbl9jb25zdGFudHMoJmNvZGVzdHJbaS0zXSwgY29uc3RzKSkgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGkgLT0gMjsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KGNvZGVzdHJbaV0gPT0gTE9BRF9DT05TVCk7CisgICAgICAgICAgICAgICAgICAgIGN1bWxjID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CiAKLQkJCQkvKiBTaW1wbGlmeSBjb25kaXRpb25hbCBqdW1wIHRvIGNvbmRpdGlvbmFsIGp1bXAgd2hlcmUgdGhlCi0JCQkJICAgcmVzdWx0IG9mIHRoZSBmaXJzdCB0ZXN0IGltcGxpZXMgdGhlIHN1Y2Nlc3Mgb2YgYSBzaW1pbGFyCi0JCQkJICAgdGVzdCBvciB0aGUgZmFpbHVyZSBvZiB0aGUgb3Bwb3NpdGUgdGVzdC4KLQkJCQkgICBBcmlzZXMgaW4gY29kZSBsaWtlOgotCQkJCSAgICJpZiBhIGFuZCBiOiIKLQkJCQkgICAiaWYgYSBvciBiOiIKLQkJCQkgICAiYSBhbmQgYiBvciBjIgotCQkJCSAgICIoYSBhbmQgYikgYW5kIGMiCi0JCQkJICAgeDpKVU1QX0lGX0ZBTFNFIHkgICB5OkpVTVBfSUZfRkFMU0UgeiAgLS0+ICB4OkpVTVBfSUZfRkFMU0UgegotCQkJCSAgIHg6SlVNUF9JRl9GQUxTRSB5ICAgeTpKVU1QX0lGX1RSVUUgegkgLS0+ICB4OkpVTVBfSUZfRkFMU0UgeSszCi0JCQkJICAgd2hlcmUgeSszIGlzIHRoZSBpbnN0cnVjdGlvbiBmb2xsb3dpbmcgdGhlIHNlY29uZCB0ZXN0LgotCQkJCSovCi0JCQljYXNlIEpVTVBfSUZfRkFMU0U6Ci0JCQljYXNlIEpVTVBfSUZfVFJVRToKLQkJCQl0Z3QgPSBHRVRKVU1QVEdUKGNvZGVzdHIsIGkpOwotCQkJCWogPSBjb2Rlc3RyW3RndF07Ci0JCQkJaWYgKGogPT0gSlVNUF9JRl9GQUxTRQl8fCAgaiA9PSBKVU1QX0lGX1RSVUUpIHsKLQkJCQkJaWYgKGogPT0gb3Bjb2RlKSB7Ci0JCQkJCQl0Z3R0Z3QgPSBHRVRKVU1QVEdUKGNvZGVzdHIsIHRndCkgLSBpIC0gMzsKLQkJCQkJCVNFVEFSRyhjb2Rlc3RyLCBpLCB0Z3R0Z3QpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJdGd0IC09IGk7Ci0JCQkJCQlTRVRBUkcoY29kZXN0ciwgaSwgdGd0KTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJLyogSW50ZW50aW9uYWwgZmFsbHRocm91Z2ggKi8gIAorICAgICAgICAgICAgICAgIC8qIFNpbXBsaWZ5IGNvbmRpdGlvbmFsIGp1bXAgdG8gY29uZGl0aW9uYWwganVtcCB3aGVyZSB0aGUKKyAgICAgICAgICAgICAgICAgICByZXN1bHQgb2YgdGhlIGZpcnN0IHRlc3QgaW1wbGllcyB0aGUgc3VjY2VzcyBvZiBhIHNpbWlsYXIKKyAgICAgICAgICAgICAgICAgICB0ZXN0IG9yIHRoZSBmYWlsdXJlIG9mIHRoZSBvcHBvc2l0ZSB0ZXN0LgorICAgICAgICAgICAgICAgICAgIEFyaXNlcyBpbiBjb2RlIGxpa2U6CisgICAgICAgICAgICAgICAgICAgImlmIGEgYW5kIGI6IgorICAgICAgICAgICAgICAgICAgICJpZiBhIG9yIGI6IgorICAgICAgICAgICAgICAgICAgICJhIGFuZCBiIG9yIGMiCisgICAgICAgICAgICAgICAgICAgIihhIGFuZCBiKSBhbmQgYyIKKyAgICAgICAgICAgICAgICAgICB4OkpVTVBfSUZfRkFMU0UgeSAgIHk6SlVNUF9JRl9GQUxTRSB6ICAtLT4gIHg6SlVNUF9JRl9GQUxTRSB6CisgICAgICAgICAgICAgICAgICAgeDpKVU1QX0lGX0ZBTFNFIHkgICB5OkpVTVBfSUZfVFJVRSB6ICAgICAgICAgICAgICAgICAgLS0+ICB4OkpVTVBfSUZfRkFMU0UgeSszCisgICAgICAgICAgICAgICAgICAgd2hlcmUgeSszIGlzIHRoZSBpbnN0cnVjdGlvbiBmb2xsb3dpbmcgdGhlIHNlY29uZCB0ZXN0LgorICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICBjYXNlIEpVTVBfSUZfRkFMU0U6CisgICAgICAgICAgICBjYXNlIEpVTVBfSUZfVFJVRToKKyAgICAgICAgICAgICAgICB0Z3QgPSBHRVRKVU1QVEdUKGNvZGVzdHIsIGkpOworICAgICAgICAgICAgICAgIGogPSBjb2Rlc3RyW3RndF07CisgICAgICAgICAgICAgICAgaWYgKGogPT0gSlVNUF9JRl9GQUxTRSAgICAgICAgICAgICAgICAgIHx8ICBqID09IEpVTVBfSUZfVFJVRSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoaiA9PSBvcGNvZGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRndHRndCA9IEdFVEpVTVBUR1QoY29kZXN0ciwgdGd0KSAtIGkgLSAzOworICAgICAgICAgICAgICAgICAgICAgICAgU0VUQVJHKGNvZGVzdHIsIGksIHRndHRndCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0Z3QgLT0gaTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNFVEFSRyhjb2Rlc3RyLCBpLCB0Z3QpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvKiBJbnRlbnRpb25hbCBmYWxsdGhyb3VnaCAqLwogCi0JCQkJLyogUmVwbGFjZSBqdW1wcyB0byB1bmNvbmRpdGlvbmFsIGp1bXBzICovCi0JCQljYXNlIEZPUl9JVEVSOgotCQkJY2FzZSBKVU1QX0ZPUldBUkQ6Ci0JCQljYXNlIEpVTVBfQUJTT0xVVEU6Ci0JCQljYXNlIENPTlRJTlVFX0xPT1A6Ci0JCQljYXNlIFNFVFVQX0xPT1A6Ci0JCQljYXNlIFNFVFVQX0VYQ0VQVDoKLQkJCWNhc2UgU0VUVVBfRklOQUxMWToKLQkJCQl0Z3QgPSBHRVRKVU1QVEdUKGNvZGVzdHIsIGkpOwotCQkJCS8qIFJlcGxhY2UgSlVNUF8qIHRvIGEgUkVUVVJOIGludG8ganVzdCBhIFJFVFVSTiAqLwotCQkJCWlmIChVTkNPTkRJVElPTkFMX0pVTVAob3Bjb2RlKSAmJgotCQkJCSAgICBjb2Rlc3RyW3RndF0gPT0gUkVUVVJOX1ZBTFVFKSB7Ci0JCQkJCWNvZGVzdHJbaV0gPSBSRVRVUk5fVkFMVUU7Ci0JCQkJCW1lbXNldChjb2Rlc3RyK2krMSwgTk9QLCAyKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWlmICghVU5DT05ESVRJT05BTF9KVU1QKGNvZGVzdHJbdGd0XSkpCi0JCQkJCWNvbnRpbnVlOwotCQkJCXRndHRndCA9IEdFVEpVTVBUR1QoY29kZXN0ciwgdGd0KTsKLQkJCQlpZiAob3Bjb2RlID09IEpVTVBfRk9SV0FSRCkgLyogSk1QX0FCUyBjYW4gZ28gYmFja3dhcmRzICovCi0JCQkJCW9wY29kZSA9IEpVTVBfQUJTT0xVVEU7Ci0JCQkJaWYgKCFBQlNPTFVURV9KVU1QKG9wY29kZSkpCi0JCQkJCXRndHRndCAtPSBpICsgMzsgICAgIC8qIENhbGMgcmVsYXRpdmUganVtcCBhZGRyICovCi0JCQkJaWYgKHRndHRndCA8IDApCQkgIC8qIE5vIGJhY2t3YXJkIHJlbGF0aXZlIGp1bXBzICovCi0JCQkJCWNvbnRpbnVlOwotCQkJCWNvZGVzdHJbaV0gPSBvcGNvZGU7Ci0JCQkJU0VUQVJHKGNvZGVzdHIsIGksIHRndHRndCk7Ci0JCQkJYnJlYWs7CisgICAgICAgICAgICAgICAgLyogUmVwbGFjZSBqdW1wcyB0byB1bmNvbmRpdGlvbmFsIGp1bXBzICovCisgICAgICAgICAgICBjYXNlIEZPUl9JVEVSOgorICAgICAgICAgICAgY2FzZSBKVU1QX0ZPUldBUkQ6CisgICAgICAgICAgICBjYXNlIEpVTVBfQUJTT0xVVEU6CisgICAgICAgICAgICBjYXNlIENPTlRJTlVFX0xPT1A6CisgICAgICAgICAgICBjYXNlIFNFVFVQX0xPT1A6CisgICAgICAgICAgICBjYXNlIFNFVFVQX0VYQ0VQVDoKKyAgICAgICAgICAgIGNhc2UgU0VUVVBfRklOQUxMWToKKyAgICAgICAgICAgICAgICB0Z3QgPSBHRVRKVU1QVEdUKGNvZGVzdHIsIGkpOworICAgICAgICAgICAgICAgIC8qIFJlcGxhY2UgSlVNUF8qIHRvIGEgUkVUVVJOIGludG8ganVzdCBhIFJFVFVSTiAqLworICAgICAgICAgICAgICAgIGlmIChVTkNPTkRJVElPTkFMX0pVTVAob3Bjb2RlKSAmJgorICAgICAgICAgICAgICAgICAgICBjb2Rlc3RyW3RndF0gPT0gUkVUVVJOX1ZBTFVFKSB7CisgICAgICAgICAgICAgICAgICAgIGNvZGVzdHJbaV0gPSBSRVRVUk5fVkFMVUU7CisgICAgICAgICAgICAgICAgICAgIG1lbXNldChjb2Rlc3RyK2krMSwgTk9QLCAyKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghVU5DT05ESVRJT05BTF9KVU1QKGNvZGVzdHJbdGd0XSkpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIHRndHRndCA9IEdFVEpVTVBUR1QoY29kZXN0ciwgdGd0KTsKKyAgICAgICAgICAgICAgICBpZiAob3Bjb2RlID09IEpVTVBfRk9SV0FSRCkgLyogSk1QX0FCUyBjYW4gZ28gYmFja3dhcmRzICovCisgICAgICAgICAgICAgICAgICAgIG9wY29kZSA9IEpVTVBfQUJTT0xVVEU7CisgICAgICAgICAgICAgICAgaWYgKCFBQlNPTFVURV9KVU1QKG9wY29kZSkpCisgICAgICAgICAgICAgICAgICAgIHRndHRndCAtPSBpICsgMzsgICAgIC8qIENhbGMgcmVsYXRpdmUganVtcCBhZGRyICovCisgICAgICAgICAgICAgICAgaWYgKHRndHRndCA8IDApICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTm8gYmFja3dhcmQgcmVsYXRpdmUganVtcHMgKi8KKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgY29kZXN0cltpXSA9IG9wY29kZTsKKyAgICAgICAgICAgICAgICBTRVRBUkcoY29kZXN0ciwgaSwgdGd0dGd0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKIAotCQkJY2FzZSBFWFRFTkRFRF9BUkc6Ci0JCQkJZ290byBleGl0VW5jaGFuZ2VkOworICAgICAgICAgICAgY2FzZSBFWFRFTkRFRF9BUkc6CisgICAgICAgICAgICAgICAgZ290byBleGl0VW5jaGFuZ2VkOwogCi0JCQkJLyogUmVwbGFjZSBSRVRVUk4gTE9BRF9DT05TVCBOb25lIFJFVFVSTiB3aXRoIGp1c3QgUkVUVVJOICovCi0JCQkJLyogUmVtb3ZlIHVucmVhY2hhYmxlIEpVTVBzIGFmdGVyIFJFVFVSTiAqLwotCQkJY2FzZSBSRVRVUk5fVkFMVUU6Ci0JCQkJaWYgKGkrNCA+PSBjb2RlbGVuKQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAoY29kZXN0cltpKzRdID09IFJFVFVSTl9WQUxVRSAmJgotCQkJCSAgICBJU0JBU0lDQkxPQ0soYmxvY2tzLGksNSkpCi0JCQkJCW1lbXNldChjb2Rlc3RyK2krMSwgTk9QLCA0KTsKLQkJCQllbHNlIGlmIChVTkNPTkRJVElPTkFMX0pVTVAoY29kZXN0cltpKzFdKSAmJgotCQkJCSAgICAgICAgIElTQkFTSUNCTE9DSyhibG9ja3MsaSw0KSkKLQkJCQkJbWVtc2V0KGNvZGVzdHIraSsxLCBOT1AsIDMpOwotCQkJCWJyZWFrOwotCQl9Ci0JfQorICAgICAgICAgICAgICAgIC8qIFJlcGxhY2UgUkVUVVJOIExPQURfQ09OU1QgTm9uZSBSRVRVUk4gd2l0aCBqdXN0IFJFVFVSTiAqLworICAgICAgICAgICAgICAgIC8qIFJlbW92ZSB1bnJlYWNoYWJsZSBKVU1QcyBhZnRlciBSRVRVUk4gKi8KKyAgICAgICAgICAgIGNhc2UgUkVUVVJOX1ZBTFVFOgorICAgICAgICAgICAgICAgIGlmIChpKzQgPj0gY29kZWxlbikKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgaWYgKGNvZGVzdHJbaSs0XSA9PSBSRVRVUk5fVkFMVUUgJiYKKyAgICAgICAgICAgICAgICAgICAgSVNCQVNJQ0JMT0NLKGJsb2NrcyxpLDUpKQorICAgICAgICAgICAgICAgICAgICBtZW1zZXQoY29kZXN0citpKzEsIE5PUCwgNCk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoVU5DT05ESVRJT05BTF9KVU1QKGNvZGVzdHJbaSsxXSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICBJU0JBU0lDQkxPQ0soYmxvY2tzLGksNCkpCisgICAgICAgICAgICAgICAgICAgIG1lbXNldChjb2Rlc3RyK2krMSwgTk9QLCAzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KIAotCS8qIEZpeHVwIGxpbmVub3RhYiAqLwotCWZvciAoaT0wLCBub3BzPTAgOyBpPGNvZGVsZW4gOyBpICs9IENPREVTSVpFKGNvZGVzdHJbaV0pKSB7Ci0JCWFkZHJtYXBbaV0gPSBpIC0gbm9wczsKLQkJaWYgKGNvZGVzdHJbaV0gPT0gTk9QKQotCQkJbm9wcysrOwotCX0KLQljdW1fb3JpZ19saW5lID0gMDsKLQlsYXN0X2xpbmUgPSAwOwotCWZvciAoaT0wIDsgaSA8IHRhYnNpeiA7IGkrPTIpIHsKLQkJY3VtX29yaWdfbGluZSArPSBsaW5lbm9baV07Ci0JCW5ld19saW5lID0gYWRkcm1hcFtjdW1fb3JpZ19saW5lXTsKLQkJYXNzZXJ0IChuZXdfbGluZSAtIGxhc3RfbGluZSA8IDI1NSk7Ci0JCWxpbmVub1tpXSA9KCh1bnNpZ25lZCBjaGFyKShuZXdfbGluZSAtIGxhc3RfbGluZSkpOwotCQlsYXN0X2xpbmUgPSBuZXdfbGluZTsKLQl9CisgICAgLyogRml4dXAgbGluZW5vdGFiICovCisgICAgZm9yIChpPTAsIG5vcHM9MCA7IGk8Y29kZWxlbiA7IGkgKz0gQ09ERVNJWkUoY29kZXN0cltpXSkpIHsKKyAgICAgICAgYWRkcm1hcFtpXSA9IGkgLSBub3BzOworICAgICAgICBpZiAoY29kZXN0cltpXSA9PSBOT1ApCisgICAgICAgICAgICBub3BzKys7CisgICAgfQorICAgIGN1bV9vcmlnX2xpbmUgPSAwOworICAgIGxhc3RfbGluZSA9IDA7CisgICAgZm9yIChpPTAgOyBpIDwgdGFic2l6IDsgaSs9MikgeworICAgICAgICBjdW1fb3JpZ19saW5lICs9IGxpbmVub1tpXTsKKyAgICAgICAgbmV3X2xpbmUgPSBhZGRybWFwW2N1bV9vcmlnX2xpbmVdOworICAgICAgICBhc3NlcnQgKG5ld19saW5lIC0gbGFzdF9saW5lIDwgMjU1KTsKKyAgICAgICAgbGluZW5vW2ldID0oKHVuc2lnbmVkIGNoYXIpKG5ld19saW5lIC0gbGFzdF9saW5lKSk7CisgICAgICAgIGxhc3RfbGluZSA9IG5ld19saW5lOworICAgIH0KIAotCS8qIFJlbW92ZSBOT1BzIGFuZCBmaXh1cCBqdW1wIHRhcmdldHMgKi8KLQlmb3IgKGk9MCwgaD0wIDsgaTxjb2RlbGVuIDsgKSB7Ci0JCW9wY29kZSA9IGNvZGVzdHJbaV07Ci0JCXN3aXRjaCAob3Bjb2RlKSB7Ci0JCQljYXNlIE5PUDoKLQkJCQlpKys7Ci0JCQkJY29udGludWU7CisgICAgLyogUmVtb3ZlIE5PUHMgYW5kIGZpeHVwIGp1bXAgdGFyZ2V0cyAqLworICAgIGZvciAoaT0wLCBoPTAgOyBpPGNvZGVsZW4gOyApIHsKKyAgICAgICAgb3Bjb2RlID0gY29kZXN0cltpXTsKKyAgICAgICAgc3dpdGNoIChvcGNvZGUpIHsKKyAgICAgICAgICAgIGNhc2UgTk9QOgorICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKIAotCQkJY2FzZSBKVU1QX0FCU09MVVRFOgotCQkJY2FzZSBDT05USU5VRV9MT09QOgotCQkJCWogPSBhZGRybWFwW0dFVEFSRyhjb2Rlc3RyLCBpKV07Ci0JCQkJU0VUQVJHKGNvZGVzdHIsIGksIGopOwotCQkJCWJyZWFrOworICAgICAgICAgICAgY2FzZSBKVU1QX0FCU09MVVRFOgorICAgICAgICAgICAgY2FzZSBDT05USU5VRV9MT09QOgorICAgICAgICAgICAgICAgIGogPSBhZGRybWFwW0dFVEFSRyhjb2Rlc3RyLCBpKV07CisgICAgICAgICAgICAgICAgU0VUQVJHKGNvZGVzdHIsIGksIGopOworICAgICAgICAgICAgICAgIGJyZWFrOwogCi0JCQljYXNlIEZPUl9JVEVSOgotCQkJY2FzZSBKVU1QX0ZPUldBUkQ6Ci0JCQljYXNlIEpVTVBfSUZfRkFMU0U6Ci0JCQljYXNlIEpVTVBfSUZfVFJVRToKLQkJCWNhc2UgU0VUVVBfTE9PUDoKLQkJCWNhc2UgU0VUVVBfRVhDRVBUOgotCQkJY2FzZSBTRVRVUF9GSU5BTExZOgotCQkJCWogPSBhZGRybWFwW0dFVEFSRyhjb2Rlc3RyLCBpKSArIGkgKyAzXSAtIGFkZHJtYXBbaV0gLSAzOwotCQkJCVNFVEFSRyhjb2Rlc3RyLCBpLCBqKTsKLQkJCQlicmVhazsKLQkJfQotCQlhZGogPSBDT0RFU0laRShvcGNvZGUpOwotCQl3aGlsZSAoYWRqLS0pCi0JCQljb2Rlc3RyW2grK10gPSBjb2Rlc3RyW2krK107Ci0JfQotCWFzc2VydChoICsgbm9wcyA9PSBjb2RlbGVuKTsKKyAgICAgICAgICAgIGNhc2UgRk9SX0lURVI6CisgICAgICAgICAgICBjYXNlIEpVTVBfRk9SV0FSRDoKKyAgICAgICAgICAgIGNhc2UgSlVNUF9JRl9GQUxTRToKKyAgICAgICAgICAgIGNhc2UgSlVNUF9JRl9UUlVFOgorICAgICAgICAgICAgY2FzZSBTRVRVUF9MT09QOgorICAgICAgICAgICAgY2FzZSBTRVRVUF9FWENFUFQ6CisgICAgICAgICAgICBjYXNlIFNFVFVQX0ZJTkFMTFk6CisgICAgICAgICAgICAgICAgaiA9IGFkZHJtYXBbR0VUQVJHKGNvZGVzdHIsIGkpICsgaSArIDNdIC0gYWRkcm1hcFtpXSAtIDM7CisgICAgICAgICAgICAgICAgU0VUQVJHKGNvZGVzdHIsIGksIGopOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGFkaiA9IENPREVTSVpFKG9wY29kZSk7CisgICAgICAgIHdoaWxlIChhZGotLSkKKyAgICAgICAgICAgIGNvZGVzdHJbaCsrXSA9IGNvZGVzdHJbaSsrXTsKKyAgICB9CisgICAgYXNzZXJ0KGggKyBub3BzID09IGNvZGVsZW4pOwogCi0JY29kZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopY29kZXN0ciwgaCk7Ci0JUHlNZW1fRnJlZShhZGRybWFwKTsKLQlQeU1lbV9GcmVlKGNvZGVzdHIpOwotCVB5TWVtX0ZyZWUoYmxvY2tzKTsKLQlyZXR1cm4gY29kZTsKKyAgICBjb2RlID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKiljb2Rlc3RyLCBoKTsKKyAgICBQeU1lbV9GcmVlKGFkZHJtYXApOworICAgIFB5TWVtX0ZyZWUoY29kZXN0cik7CisgICAgUHlNZW1fRnJlZShibG9ja3MpOworICAgIHJldHVybiBjb2RlOwogCiAgZXhpdEVycm9yOgotCWNvZGUgPSBOVUxMOworICAgIGNvZGUgPSBOVUxMOwogCiAgZXhpdFVuY2hhbmdlZDoKLQlpZiAoYmxvY2tzICE9IE5VTEwpCi0JCVB5TWVtX0ZyZWUoYmxvY2tzKTsKLQlpZiAoYWRkcm1hcCAhPSBOVUxMKQotCQlQeU1lbV9GcmVlKGFkZHJtYXApOwotCWlmIChjb2Rlc3RyICE9IE5VTEwpCi0JCVB5TWVtX0ZyZWUoY29kZXN0cik7Ci0JUHlfWElOQ1JFRihjb2RlKTsKLQlyZXR1cm4gY29kZTsKKyAgICBpZiAoYmxvY2tzICE9IE5VTEwpCisgICAgICAgIFB5TWVtX0ZyZWUoYmxvY2tzKTsKKyAgICBpZiAoYWRkcm1hcCAhPSBOVUxMKQorICAgICAgICBQeU1lbV9GcmVlKGFkZHJtYXApOworICAgIGlmIChjb2Rlc3RyICE9IE5VTEwpCisgICAgICAgIFB5TWVtX0ZyZWUoY29kZXN0cik7CisgICAgUHlfWElOQ1JFRihjb2RlKTsKKyAgICByZXR1cm4gY29kZTsKIH0KZGlmZiAtLWdpdCBhL1B5dGhvbi9weWFyZW5hLmMgYi9QeXRob24vcHlhcmVuYS5jCmluZGV4IGY0Y2M0NzQuLjJkNjM2MzggMTAwNjQ0Ci0tLSBhL1B5dGhvbi9weWFyZW5hLmMKKysrIGIvUHl0aG9uL3B5YXJlbmEuYwpAQCAtMTIsMzIgKzEyLDMyIEBACiAqLwogCiAjZGVmaW5lIERFRkFVTFRfQkxPQ0tfU0laRSA4MTkyCi0jZGVmaW5lIEFMSUdOTUVOVAkJOAotI2RlZmluZSBBTElHTk1FTlRfTUFTSwkJKEFMSUdOTUVOVCAtIDEpCi0jZGVmaW5lIFJPVU5EVVAoeCkJCSgoKHgpICsgQUxJR05NRU5UX01BU0spICYgfkFMSUdOTUVOVF9NQVNLKQorI2RlZmluZSBBTElHTk1FTlQgICAgICAgICAgICAgICA4CisjZGVmaW5lIEFMSUdOTUVOVF9NQVNLICAgICAgICAgIChBTElHTk1FTlQgLSAxKQorI2RlZmluZSBST1VORFVQKHgpICAgICAgICAgICAgICAoKCh4KSArIEFMSUdOTUVOVF9NQVNLKSAmIH5BTElHTk1FTlRfTUFTSykKIAogdHlwZWRlZiBzdHJ1Y3QgX2Jsb2NrIHsKLQkvKiBUb3RhbCBudW1iZXIgb2YgYnl0ZXMgb3duZWQgYnkgdGhpcyBibG9jayBhdmFpbGFibGUgdG8gcGFzcyBvdXQuCi0JICogUmVhZC1vbmx5IGFmdGVyIGluaXRpYWxpemF0aW9uLiAgVGhlIGZpcnN0IHN1Y2ggYnl0ZSBzdGFydHMgYXQKLQkgKiBhYl9tZW0uCi0JICovCi0Jc2l6ZV90IGFiX3NpemU7CisgICAgLyogVG90YWwgbnVtYmVyIG9mIGJ5dGVzIG93bmVkIGJ5IHRoaXMgYmxvY2sgYXZhaWxhYmxlIHRvIHBhc3Mgb3V0LgorICAgICAqIFJlYWQtb25seSBhZnRlciBpbml0aWFsaXphdGlvbi4gIFRoZSBmaXJzdCBzdWNoIGJ5dGUgc3RhcnRzIGF0CisgICAgICogYWJfbWVtLgorICAgICAqLworICAgIHNpemVfdCBhYl9zaXplOwogCi0JLyogVG90YWwgbnVtYmVyIG9mIGJ5dGVzIGFscmVhZHkgcGFzc2VkIG91dC4gIFRoZSBuZXh0IGJ5dGUgYXZhaWxhYmxlCi0JICogdG8gcGFzcyBvdXQgc3RhcnRzIGF0IGFiX21lbSArIGFiX29mZnNldC4KLQkgKi8KLQlzaXplX3QgYWJfb2Zmc2V0OworICAgIC8qIFRvdGFsIG51bWJlciBvZiBieXRlcyBhbHJlYWR5IHBhc3NlZCBvdXQuICBUaGUgbmV4dCBieXRlIGF2YWlsYWJsZQorICAgICAqIHRvIHBhc3Mgb3V0IHN0YXJ0cyBhdCBhYl9tZW0gKyBhYl9vZmZzZXQuCisgICAgICovCisgICAgc2l6ZV90IGFiX29mZnNldDsKIAotCS8qIEFuIGFyZW5hIG1haW50YWlucyBhIHNpbmdseS1saW5rZWQsIE5VTEwtdGVybWluYXRlZCBsaXN0IG9mCi0JICogYWxsIGJsb2NrcyBvd25lZCBieSB0aGUgYXJlbmEuICBUaGVzZSBhcmUgbGlua2VkIHZpYSB0aGUKLQkgKiBhYl9uZXh0IG1lbWJlci4KLQkgKi8KLQlzdHJ1Y3QgX2Jsb2NrICphYl9uZXh0OworICAgIC8qIEFuIGFyZW5hIG1haW50YWlucyBhIHNpbmdseS1saW5rZWQsIE5VTEwtdGVybWluYXRlZCBsaXN0IG9mCisgICAgICogYWxsIGJsb2NrcyBvd25lZCBieSB0aGUgYXJlbmEuICBUaGVzZSBhcmUgbGlua2VkIHZpYSB0aGUKKyAgICAgKiBhYl9uZXh0IG1lbWJlci4KKyAgICAgKi8KKyAgICBzdHJ1Y3QgX2Jsb2NrICphYl9uZXh0OwogCi0JLyogUG9pbnRlciB0byB0aGUgZmlyc3QgYWxsb2NhdGFibGUgYnl0ZSBvd25lZCBieSB0aGlzIGJsb2NrLiAgUmVhZC0KLQkgKiBvbmx5IGFmdGVyIGluaXRpYWxpemF0aW9uLgotCSAqLwotCXZvaWQgKmFiX21lbTsKKyAgICAvKiBQb2ludGVyIHRvIHRoZSBmaXJzdCBhbGxvY2F0YWJsZSBieXRlIG93bmVkIGJ5IHRoaXMgYmxvY2suICBSZWFkLQorICAgICAqIG9ubHkgYWZ0ZXIgaW5pdGlhbGl6YXRpb24uCisgICAgICovCisgICAgdm9pZCAqYWJfbWVtOwogfSBibG9jazsKIAogLyogVGhlIGFyZW5hIG1hbmFnZXMgdHdvIGtpbmRzIG9mIG1lbW9yeSwgYmxvY2tzIG9mIHJhdyBtZW1vcnkKQEAgLTQ2LDE3NSArNDYsMTc1IEBACiAqLwogCiBzdHJ1Y3QgX2FyZW5hIHsKLSAgICAgICAgLyogUG9pbnRlciB0byB0aGUgZmlyc3QgYmxvY2sgYWxsb2NhdGVkIGZvciB0aGUgYXJlbmEsIG5ldmVyIE5VTEwuCi0gICAgICAgICAgIEl0IGlzIHVzZWQgb25seSB0byBmaW5kIHRoZSBmaXJzdCBibG9jayB3aGVuIHRoZSBhcmVuYSBpcwotICAgICAgICAgICBiZWluZyBmcmVlZC4KLSAgICAgICAgICovCi0JYmxvY2sgKmFfaGVhZDsKKyAgICAvKiBQb2ludGVyIHRvIHRoZSBmaXJzdCBibG9jayBhbGxvY2F0ZWQgZm9yIHRoZSBhcmVuYSwgbmV2ZXIgTlVMTC4KKyAgICAgICBJdCBpcyB1c2VkIG9ubHkgdG8gZmluZCB0aGUgZmlyc3QgYmxvY2sgd2hlbiB0aGUgYXJlbmEgaXMKKyAgICAgICBiZWluZyBmcmVlZC4KKyAgICAgKi8KKyAgICBibG9jayAqYV9oZWFkOwogCi0gICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIGJsb2NrIGN1cnJlbnRseSB1c2VkIGZvciBhbGxvY2F0aW9uLiAgSXQncwotICAgICAgICAgICBhYl9uZXh0IGZpZWxkIHNob3VsZCBiZSBOVUxMLiAgSWYgaXQgaXMgbm90LW51bGwgYWZ0ZXIgYQotICAgICAgICAgICBjYWxsIHRvIGJsb2NrX2FsbG9jKCksIGl0IG1lYW5zIGEgbmV3IGJsb2NrIGhhcyBiZWVuIGFsbG9jYXRlZAotICAgICAgICAgICBhbmQgYV9jdXIgc2hvdWxkIGJlIHJlc2V0IHRvIHBvaW50IGl0LgotICAgICAgICAgKi8KLQlibG9jayAqYV9jdXI7CisgICAgLyogUG9pbnRlciB0byB0aGUgYmxvY2sgY3VycmVudGx5IHVzZWQgZm9yIGFsbG9jYXRpb24uICBJdCdzCisgICAgICAgYWJfbmV4dCBmaWVsZCBzaG91bGQgYmUgTlVMTC4gIElmIGl0IGlzIG5vdC1udWxsIGFmdGVyIGEKKyAgICAgICBjYWxsIHRvIGJsb2NrX2FsbG9jKCksIGl0IG1lYW5zIGEgbmV3IGJsb2NrIGhhcyBiZWVuIGFsbG9jYXRlZAorICAgICAgIGFuZCBhX2N1ciBzaG91bGQgYmUgcmVzZXQgdG8gcG9pbnQgaXQuCisgICAgICovCisgICAgYmxvY2sgKmFfY3VyOwogCi0gICAgICAgIC8qIEEgUHl0aG9uIGxpc3Qgb2JqZWN0IGNvbnRhaW5pbmcgcmVmZXJlbmNlcyB0byBhbGwgdGhlIFB5T2JqZWN0Ci0gICAgICAgICAgIHBvaW50ZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGFyZWEuICBUaGV5IHdpbGwgYmUgREVDUkVGZWQKLSAgICAgICAgICAgd2hlbiB0aGUgYXJlbmEgaXMgZnJlZWQuCi0gICAgICAgICovCi0gICAgICAgIFB5T2JqZWN0ICphX29iamVjdHM7CisgICAgLyogQSBQeXRob24gbGlzdCBvYmplY3QgY29udGFpbmluZyByZWZlcmVuY2VzIHRvIGFsbCB0aGUgUHlPYmplY3QKKyAgICAgICBwb2ludGVycyBhc3NvY2lhdGVkIHdpdGggdGhpcyBhcmVhLiAgVGhleSB3aWxsIGJlIERFQ1JFRmVkCisgICAgICAgd2hlbiB0aGUgYXJlbmEgaXMgZnJlZWQuCisgICAgKi8KKyAgICBQeU9iamVjdCAqYV9vYmplY3RzOwogCiAjaWYgZGVmaW5lZChQeV9ERUJVRykKLSAgICAgICAgLyogRGVidWcgb3V0cHV0ICovCi0gICAgICAgIHNpemVfdCB0b3RhbF9hbGxvY3M7Ci0gICAgICAgIHNpemVfdCB0b3RhbF9zaXplOwotICAgICAgICBzaXplX3QgdG90YWxfYmxvY2tzOwotICAgICAgICBzaXplX3QgdG90YWxfYmxvY2tfc2l6ZTsKLSAgICAgICAgc2l6ZV90IHRvdGFsX2JpZ19ibG9ja3M7CisgICAgLyogRGVidWcgb3V0cHV0ICovCisgICAgc2l6ZV90IHRvdGFsX2FsbG9jczsKKyAgICBzaXplX3QgdG90YWxfc2l6ZTsKKyAgICBzaXplX3QgdG90YWxfYmxvY2tzOworICAgIHNpemVfdCB0b3RhbF9ibG9ja19zaXplOworICAgIHNpemVfdCB0b3RhbF9iaWdfYmxvY2tzOwogI2VuZGlmCiB9OwogCiBzdGF0aWMgYmxvY2sgKgogYmxvY2tfbmV3KHNpemVfdCBzaXplKQogewotCS8qIEFsbG9jYXRlIGhlYWRlciBhbmQgYmxvY2sgYXMgb25lIHVuaXQuCi0JICAgYWJfbWVtIHBvaW50cyBqdXN0IHBhc3QgaGVhZGVyLiAqLwotCWJsb2NrICpiID0gKGJsb2NrICopbWFsbG9jKHNpemVvZihibG9jaykgKyBzaXplKTsKLQlpZiAoIWIpCi0JCXJldHVybiBOVUxMOwotCWItPmFiX3NpemUgPSBzaXplOwotCWItPmFiX21lbSA9ICh2b2lkICopKGIgKyAxKTsKLQliLT5hYl9uZXh0ID0gTlVMTDsKLQliLT5hYl9vZmZzZXQgPSBST1VORFVQKChQeV91aW50cHRyX3QpKGItPmFiX21lbSkpIC0gCi0JICAoUHlfdWludHB0cl90KShiLT5hYl9tZW0pOwotCXJldHVybiBiOworICAgIC8qIEFsbG9jYXRlIGhlYWRlciBhbmQgYmxvY2sgYXMgb25lIHVuaXQuCisgICAgICAgYWJfbWVtIHBvaW50cyBqdXN0IHBhc3QgaGVhZGVyLiAqLworICAgIGJsb2NrICpiID0gKGJsb2NrICopbWFsbG9jKHNpemVvZihibG9jaykgKyBzaXplKTsKKyAgICBpZiAoIWIpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGItPmFiX3NpemUgPSBzaXplOworICAgIGItPmFiX21lbSA9ICh2b2lkICopKGIgKyAxKTsKKyAgICBiLT5hYl9uZXh0ID0gTlVMTDsKKyAgICBiLT5hYl9vZmZzZXQgPSBST1VORFVQKChQeV91aW50cHRyX3QpKGItPmFiX21lbSkpIC0KKyAgICAgIChQeV91aW50cHRyX3QpKGItPmFiX21lbSk7CisgICAgcmV0dXJuIGI7CiB9CiAKIHN0YXRpYyB2b2lkCiBibG9ja19mcmVlKGJsb2NrICpiKSB7Ci0Jd2hpbGUgKGIpIHsKLQkJYmxvY2sgKm5leHQgPSBiLT5hYl9uZXh0OwotCQlmcmVlKGIpOwotCQliID0gbmV4dDsKLQl9CisgICAgd2hpbGUgKGIpIHsKKyAgICAgICAgYmxvY2sgKm5leHQgPSBiLT5hYl9uZXh0OworICAgICAgICBmcmVlKGIpOworICAgICAgICBiID0gbmV4dDsKKyAgICB9CiB9CiAKIHN0YXRpYyB2b2lkICoKIGJsb2NrX2FsbG9jKGJsb2NrICpiLCBzaXplX3Qgc2l6ZSkKIHsKLQl2b2lkICpwOwotCWFzc2VydChiKTsKLQlzaXplID0gUk9VTkRVUChzaXplKTsKLQlpZiAoYi0+YWJfb2Zmc2V0ICsgc2l6ZSA+IGItPmFiX3NpemUpIHsKLQkJLyogSWYgd2UgbmVlZCB0byBhbGxvY2F0ZSBtb3JlIG1lbW9yeSB0aGFuIHdpbGwgZml0IGluCi0JCSAgIHRoZSBkZWZhdWx0IGJsb2NrLCBhbGxvY2F0ZSBhIG9uZS1vZmYgYmxvY2sgdGhhdCBpcwotCQkgICBleGFjdGx5IHRoZSByaWdodCBzaXplLiAqLwotCQkvKiBUT0RPKGpoeWx0b24pOiBUaGluayBhYm91dCBzcGFjZSB3YXN0ZSBhdCBlbmQgb2YgYmxvY2sgKi8KLQkJYmxvY2sgKm5ld2JsID0gYmxvY2tfbmV3KAotCQkJCXNpemUgPCBERUZBVUxUX0JMT0NLX1NJWkUgPwotCQkJCURFRkFVTFRfQkxPQ0tfU0laRSA6IHNpemUpOwotCQlpZiAoIW5ld2JsKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWFzc2VydCghYi0+YWJfbmV4dCk7Ci0JCWItPmFiX25leHQgPSBuZXdibDsKLQkJYiA9IG5ld2JsOwotCX0KKyAgICB2b2lkICpwOworICAgIGFzc2VydChiKTsKKyAgICBzaXplID0gUk9VTkRVUChzaXplKTsKKyAgICBpZiAoYi0+YWJfb2Zmc2V0ICsgc2l6ZSA+IGItPmFiX3NpemUpIHsKKyAgICAgICAgLyogSWYgd2UgbmVlZCB0byBhbGxvY2F0ZSBtb3JlIG1lbW9yeSB0aGFuIHdpbGwgZml0IGluCisgICAgICAgICAgIHRoZSBkZWZhdWx0IGJsb2NrLCBhbGxvY2F0ZSBhIG9uZS1vZmYgYmxvY2sgdGhhdCBpcworICAgICAgICAgICBleGFjdGx5IHRoZSByaWdodCBzaXplLiAqLworICAgICAgICAvKiBUT0RPKGpoeWx0b24pOiBUaGluayBhYm91dCBzcGFjZSB3YXN0ZSBhdCBlbmQgb2YgYmxvY2sgKi8KKyAgICAgICAgYmxvY2sgKm5ld2JsID0gYmxvY2tfbmV3KAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA8IERFRkFVTFRfQkxPQ0tfU0laRSA/CisgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0JMT0NLX1NJWkUgOiBzaXplKTsKKyAgICAgICAgaWYgKCFuZXdibCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBhc3NlcnQoIWItPmFiX25leHQpOworICAgICAgICBiLT5hYl9uZXh0ID0gbmV3Ymw7CisgICAgICAgIGIgPSBuZXdibDsKKyAgICB9CiAKLQlhc3NlcnQoYi0+YWJfb2Zmc2V0ICsgc2l6ZSA8PSBiLT5hYl9zaXplKTsKLQlwID0gKHZvaWQgKikoKChjaGFyICopYi0+YWJfbWVtKSArIGItPmFiX29mZnNldCk7Ci0JYi0+YWJfb2Zmc2V0ICs9IHNpemU7Ci0JcmV0dXJuIHA7CisgICAgYXNzZXJ0KGItPmFiX29mZnNldCArIHNpemUgPD0gYi0+YWJfc2l6ZSk7CisgICAgcCA9ICh2b2lkICopKCgoY2hhciAqKWItPmFiX21lbSkgKyBiLT5hYl9vZmZzZXQpOworICAgIGItPmFiX29mZnNldCArPSBzaXplOworICAgIHJldHVybiBwOwogfQogCiBQeUFyZW5hICoKIFB5QXJlbmFfTmV3KCkKIHsKLQlQeUFyZW5hKiBhcmVuYSA9IChQeUFyZW5hICopbWFsbG9jKHNpemVvZihQeUFyZW5hKSk7Ci0JaWYgKCFhcmVuYSkKLQkJcmV0dXJuIChQeUFyZW5hKilQeUVycl9Ob01lbW9yeSgpOworICAgIFB5QXJlbmEqIGFyZW5hID0gKFB5QXJlbmEgKiltYWxsb2Moc2l6ZW9mKFB5QXJlbmEpKTsKKyAgICBpZiAoIWFyZW5hKQorICAgICAgICByZXR1cm4gKFB5QXJlbmEqKVB5RXJyX05vTWVtb3J5KCk7CiAKLQlhcmVuYS0+YV9oZWFkID0gYmxvY2tfbmV3KERFRkFVTFRfQkxPQ0tfU0laRSk7Ci0JYXJlbmEtPmFfY3VyID0gYXJlbmEtPmFfaGVhZDsKLSAgICAgICAgaWYgKCFhcmVuYS0+YV9oZWFkKSB7Ci0gICAgICAgICAgICAgICAgZnJlZSgodm9pZCAqKWFyZW5hKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gKFB5QXJlbmEqKVB5RXJyX05vTWVtb3J5KCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXJlbmEtPmFfb2JqZWN0cyA9IFB5TGlzdF9OZXcoMCk7Ci0gICAgICAgIGlmICghYXJlbmEtPmFfb2JqZWN0cykgewotICAgICAgICAgICAgICAgIGJsb2NrX2ZyZWUoYXJlbmEtPmFfaGVhZCk7Ci0gICAgICAgICAgICAgICAgZnJlZSgodm9pZCAqKWFyZW5hKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gKFB5QXJlbmEqKVB5RXJyX05vTWVtb3J5KCk7Ci0gICAgICAgIH0KKyAgICBhcmVuYS0+YV9oZWFkID0gYmxvY2tfbmV3KERFRkFVTFRfQkxPQ0tfU0laRSk7CisgICAgYXJlbmEtPmFfY3VyID0gYXJlbmEtPmFfaGVhZDsKKyAgICBpZiAoIWFyZW5hLT5hX2hlYWQpIHsKKyAgICAgICAgZnJlZSgodm9pZCAqKWFyZW5hKTsKKyAgICAgICAgcmV0dXJuIChQeUFyZW5hKilQeUVycl9Ob01lbW9yeSgpOworICAgIH0KKyAgICBhcmVuYS0+YV9vYmplY3RzID0gUHlMaXN0X05ldygwKTsKKyAgICBpZiAoIWFyZW5hLT5hX29iamVjdHMpIHsKKyAgICAgICAgYmxvY2tfZnJlZShhcmVuYS0+YV9oZWFkKTsKKyAgICAgICAgZnJlZSgodm9pZCAqKWFyZW5hKTsKKyAgICAgICAgcmV0dXJuIChQeUFyZW5hKilQeUVycl9Ob01lbW9yeSgpOworICAgIH0KICNpZiBkZWZpbmVkKFB5X0RFQlVHKQotICAgICAgICBhcmVuYS0+dG90YWxfYWxsb2NzID0gMDsKLSAgICAgICAgYXJlbmEtPnRvdGFsX3NpemUgPSAwOwotICAgICAgICBhcmVuYS0+dG90YWxfYmxvY2tzID0gMTsKLSAgICAgICAgYXJlbmEtPnRvdGFsX2Jsb2NrX3NpemUgPSBERUZBVUxUX0JMT0NLX1NJWkU7Ci0gICAgICAgIGFyZW5hLT50b3RhbF9iaWdfYmxvY2tzID0gMDsKKyAgICBhcmVuYS0+dG90YWxfYWxsb2NzID0gMDsKKyAgICBhcmVuYS0+dG90YWxfc2l6ZSA9IDA7CisgICAgYXJlbmEtPnRvdGFsX2Jsb2NrcyA9IDE7CisgICAgYXJlbmEtPnRvdGFsX2Jsb2NrX3NpemUgPSBERUZBVUxUX0JMT0NLX1NJWkU7CisgICAgYXJlbmEtPnRvdGFsX2JpZ19ibG9ja3MgPSAwOwogI2VuZGlmCi0JcmV0dXJuIGFyZW5hOworICAgIHJldHVybiBhcmVuYTsKIH0KIAogdm9pZAogUHlBcmVuYV9GcmVlKFB5QXJlbmEgKmFyZW5hKQogewotICAgICAgICBpbnQgcjsKLQlhc3NlcnQoYXJlbmEpOworICAgIGludCByOworICAgIGFzc2VydChhcmVuYSk7CiAjaWYgZGVmaW5lZChQeV9ERUJVRykKLSAgICAgICAgLyoKLSAgICAgICAgZnByaW50ZihzdGRlcnIsCi0gICAgICAgICAgICAgICAgImFsbG9jPSVkIHNpemU9JWQgYmxvY2tzPSVkIGJsb2NrX3NpemU9JWQgYmlnPSVkIG9iamVjdHM9JWRcbiIsCi0gICAgICAgICAgICAgICAgYXJlbmEtPnRvdGFsX2FsbG9jcywgYXJlbmEtPnRvdGFsX3NpemUsIGFyZW5hLT50b3RhbF9ibG9ja3MsCi0gICAgICAgICAgICAgICAgYXJlbmEtPnRvdGFsX2Jsb2NrX3NpemUsIGFyZW5hLT50b3RhbF9iaWdfYmxvY2tzLAotICAgICAgICAgICAgICAgIFB5TGlzdF9TaXplKGFyZW5hLT5hX29iamVjdHMpKTsKLSAgICAgICAgKi8KKyAgICAvKgorICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAiYWxsb2M9JWQgc2l6ZT0lZCBibG9ja3M9JWQgYmxvY2tfc2l6ZT0lZCBiaWc9JWQgb2JqZWN0cz0lZFxuIiwKKyAgICAgICAgYXJlbmEtPnRvdGFsX2FsbG9jcywgYXJlbmEtPnRvdGFsX3NpemUsIGFyZW5hLT50b3RhbF9ibG9ja3MsCisgICAgICAgIGFyZW5hLT50b3RhbF9ibG9ja19zaXplLCBhcmVuYS0+dG90YWxfYmlnX2Jsb2NrcywKKyAgICAgICAgUHlMaXN0X1NpemUoYXJlbmEtPmFfb2JqZWN0cykpOworICAgICovCiAjZW5kaWYKLQlibG9ja19mcmVlKGFyZW5hLT5hX2hlYWQpOwotCS8qIFRoaXMgcHJvcGVydHkgbm9ybWFsbHkgaG9sZHMsIGV4Y2VwdCB3aGVuIHRoZSBjb2RlIGJlaW5nIGNvbXBpbGVkCi0JICAgaXMgc3lzLmdldG9iamVjdHMoMCksIGluIHdoaWNoIGNhc2UgdGhlcmUgd2lsbCBiZSB0d28gcmVmZXJlbmNlcy4KLSAgICAgICAgYXNzZXJ0KGFyZW5hLT5hX29iamVjdHMtPm9iX3JlZmNudCA9PSAxKTsKLQkqLworICAgIGJsb2NrX2ZyZWUoYXJlbmEtPmFfaGVhZCk7CisgICAgLyogVGhpcyBwcm9wZXJ0eSBub3JtYWxseSBob2xkcywgZXhjZXB0IHdoZW4gdGhlIGNvZGUgYmVpbmcgY29tcGlsZWQKKyAgICAgICBpcyBzeXMuZ2V0b2JqZWN0cygwKSwgaW4gd2hpY2ggY2FzZSB0aGVyZSB3aWxsIGJlIHR3byByZWZlcmVuY2VzLgorICAgIGFzc2VydChhcmVuYS0+YV9vYmplY3RzLT5vYl9yZWZjbnQgPT0gMSk7CisgICAgKi8KIAotICAgICAgICAvKiBDbGVhciBhbGwgdGhlIGVsZW1lbnRzIGZyb20gdGhlIGxpc3QuICBUaGlzIGlzIG5lY2Vzc2FyeQotICAgICAgICAgICB0byBndWFyYW50ZWUgdGhhdCB0aGV5IHdpbGwgYmUgREVDUkVGZWQuICovCi0gICAgICAgIHIgPSBQeUxpc3RfU2V0U2xpY2UoYXJlbmEtPmFfb2JqZWN0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBQeUxpc3RfR0VUX1NJWkUoYXJlbmEtPmFfb2JqZWN0cyksIE5VTEwpOwotICAgICAgICBhc3NlcnQociA9PSAwKTsKLSAgICAgICAgYXNzZXJ0KFB5TGlzdF9HRVRfU0laRShhcmVuYS0+YV9vYmplY3RzKSA9PSAwKTsKLSAgICAgICAgUHlfREVDUkVGKGFyZW5hLT5hX29iamVjdHMpOwotCWZyZWUoYXJlbmEpOworICAgIC8qIENsZWFyIGFsbCB0aGUgZWxlbWVudHMgZnJvbSB0aGUgbGlzdC4gIFRoaXMgaXMgbmVjZXNzYXJ5CisgICAgICAgdG8gZ3VhcmFudGVlIHRoYXQgdGhleSB3aWxsIGJlIERFQ1JFRmVkLiAqLworICAgIHIgPSBQeUxpc3RfU2V0U2xpY2UoYXJlbmEtPmFfb2JqZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIFB5TGlzdF9HRVRfU0laRShhcmVuYS0+YV9vYmplY3RzKSwgTlVMTCk7CisgICAgYXNzZXJ0KHIgPT0gMCk7CisgICAgYXNzZXJ0KFB5TGlzdF9HRVRfU0laRShhcmVuYS0+YV9vYmplY3RzKSA9PSAwKTsKKyAgICBQeV9ERUNSRUYoYXJlbmEtPmFfb2JqZWN0cyk7CisgICAgZnJlZShhcmVuYSk7CiB9CiAKIHZvaWQgKgogUHlBcmVuYV9NYWxsb2MoUHlBcmVuYSAqYXJlbmEsIHNpemVfdCBzaXplKQogewotCXZvaWQgKnAgPSBibG9ja19hbGxvYyhhcmVuYS0+YV9jdXIsIHNpemUpOwotCWlmICghcCkKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgdm9pZCAqcCA9IGJsb2NrX2FsbG9jKGFyZW5hLT5hX2N1ciwgc2l6ZSk7CisgICAgaWYgKCFwKQorICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKICNpZiBkZWZpbmVkKFB5X0RFQlVHKQotICAgICAgICBhcmVuYS0+dG90YWxfYWxsb2NzKys7Ci0gICAgICAgIGFyZW5hLT50b3RhbF9zaXplICs9IHNpemU7CisgICAgYXJlbmEtPnRvdGFsX2FsbG9jcysrOworICAgIGFyZW5hLT50b3RhbF9zaXplICs9IHNpemU7CiAjZW5kaWYKLQkvKiBSZXNldCBjdXIgaWYgd2UgYWxsb2NhdGVkIGEgbmV3IGJsb2NrLiAqLwotCWlmIChhcmVuYS0+YV9jdXItPmFiX25leHQpIHsKLQkJYXJlbmEtPmFfY3VyID0gYXJlbmEtPmFfY3VyLT5hYl9uZXh0OworICAgIC8qIFJlc2V0IGN1ciBpZiB3ZSBhbGxvY2F0ZWQgYSBuZXcgYmxvY2suICovCisgICAgaWYgKGFyZW5hLT5hX2N1ci0+YWJfbmV4dCkgeworICAgICAgICBhcmVuYS0+YV9jdXIgPSBhcmVuYS0+YV9jdXItPmFiX25leHQ7CiAjaWYgZGVmaW5lZChQeV9ERUJVRykKLSAgICAgICAgICAgICAgICBhcmVuYS0+dG90YWxfYmxvY2tzKys7Ci0gICAgICAgICAgICAgICAgYXJlbmEtPnRvdGFsX2Jsb2NrX3NpemUgKz0gYXJlbmEtPmFfY3VyLT5hYl9zaXplOwotICAgICAgICAgICAgICAgIGlmIChhcmVuYS0+YV9jdXItPmFiX3NpemUgPiBERUZBVUxUX0JMT0NLX1NJWkUpCi0gICAgICAgICAgICAgICAgICAgICAgICArK2FyZW5hLT50b3RhbF9iaWdfYmxvY2tzOworICAgICAgICBhcmVuYS0+dG90YWxfYmxvY2tzKys7CisgICAgICAgIGFyZW5hLT50b3RhbF9ibG9ja19zaXplICs9IGFyZW5hLT5hX2N1ci0+YWJfc2l6ZTsKKyAgICAgICAgaWYgKGFyZW5hLT5hX2N1ci0+YWJfc2l6ZSA+IERFRkFVTFRfQkxPQ0tfU0laRSkKKyAgICAgICAgICAgICsrYXJlbmEtPnRvdGFsX2JpZ19ibG9ja3M7CiAjZW5kaWYKLQl9Ci0JcmV0dXJuIHA7CisgICAgfQorICAgIHJldHVybiBwOwogfQogCiBpbnQKIFB5QXJlbmFfQWRkUHlPYmplY3QoUHlBcmVuYSAqYXJlbmEsIFB5T2JqZWN0ICpvYmopCiB7Ci0gICAgICAgIGludCByID0gUHlMaXN0X0FwcGVuZChhcmVuYS0+YV9vYmplY3RzLCBvYmopOwotICAgICAgICBpZiAociA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKG9iaik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHI7CisgICAgaW50IHIgPSBQeUxpc3RfQXBwZW5kKGFyZW5hLT5hX29iamVjdHMsIG9iaik7CisgICAgaWYgKHIgPj0gMCkgeworICAgICAgICBQeV9ERUNSRUYob2JqKTsKKyAgICB9CisgICAgcmV0dXJuIHI7CiB9CmRpZmYgLS1naXQgYS9QeXRob24vcHltYXRoLmMgYi9QeXRob24vcHltYXRoLmMKaW5kZXggMjc0OTY4OC4uMWJhMmU2MyAxMDA2NDQKLS0tIGEvUHl0aG9uL3B5bWF0aC5jCisrKyBiL1B5dGhvbi9weW1hdGguYwpAQCAtNywzMCArNywzMCBAQAogICAgdGh1cyByb3VuZGluZyBmcm9tIGV4dGVuZGVkIHByZWNpc2lvbiB0byBkb3VibGUgcHJlY2lzaW9uLiAqLwogZG91YmxlIF9QeV9mb3JjZV9kb3VibGUoZG91YmxlIHgpCiB7Ci0Jdm9sYXRpbGUgZG91YmxlIHk7Ci0JeSA9IHg7Ci0JcmV0dXJuIHk7CisgICAgdm9sYXRpbGUgZG91YmxlIHk7CisgICAgeSA9IHg7CisgICAgcmV0dXJuIHk7CiB9CiAjZW5kaWYKIAogI2lmbmRlZiBIQVZFX0hZUE9UCiBkb3VibGUgaHlwb3QoZG91YmxlIHgsIGRvdWJsZSB5KQogewotCWRvdWJsZSB5eDsKKyAgICBkb3VibGUgeXg7CiAKLQl4ID0gZmFicyh4KTsKLQl5ID0gZmFicyh5KTsKLQlpZiAoeCA8IHkpIHsKLQkJZG91YmxlIHRlbXAgPSB4OwotCQl4ID0geTsKLQkJeSA9IHRlbXA7Ci0JfQotCWlmICh4ID09IDAuKQotCQlyZXR1cm4gMC47Ci0JZWxzZSB7Ci0JCXl4ID0geS94OwotCQlyZXR1cm4geCpzcXJ0KDEuK3l4Knl4KTsKLQl9CisgICAgeCA9IGZhYnMoeCk7CisgICAgeSA9IGZhYnMoeSk7CisgICAgaWYgKHggPCB5KSB7CisgICAgICAgIGRvdWJsZSB0ZW1wID0geDsKKyAgICAgICAgeCA9IHk7CisgICAgICAgIHkgPSB0ZW1wOworICAgIH0KKyAgICBpZiAoeCA9PSAwLikKKyAgICAgICAgcmV0dXJuIDAuOworICAgIGVsc2UgeworICAgICAgICB5eCA9IHkveDsKKyAgICAgICAgcmV0dXJuIHgqc3FydCgxLit5eCp5eCk7CisgICAgfQogfQogI2VuZGlmIC8qIEhBVkVfSFlQT1QgKi8KIApAQCAtMzgsMTIgKzM4LDEyIEBACiBkb3VibGUKIGNvcHlzaWduKGRvdWJsZSB4LCBkb3VibGUgeSkKIHsKLQkvKiB1c2UgYXRhbjIgdG8gZGlzdGluZ3Vpc2ggLTAuIGZyb20gMC4gKi8KLQlpZiAoeSA+IDAuIHx8ICh5ID09IDAuICYmIGF0YW4yKHksIC0xLikgPiAwLikpIHsKLQkJcmV0dXJuIGZhYnMoeCk7Ci0JfSBlbHNlIHsKLQkJcmV0dXJuIC1mYWJzKHgpOwotCX0KKyAgICAvKiB1c2UgYXRhbjIgdG8gZGlzdGluZ3Vpc2ggLTAuIGZyb20gMC4gKi8KKyAgICBpZiAoeSA+IDAuIHx8ICh5ID09IDAuICYmIGF0YW4yKHksIC0xLikgPiAwLikpIHsKKyAgICAgICAgcmV0dXJuIGZhYnMoeCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIC1mYWJzKHgpOworICAgIH0KIH0KICNlbmRpZiAvKiBIQVZFX0NPUFlTSUdOICovCiAKQEAgLTUzLDQxICs1Myw0MSBAQAogZG91YmxlCiBsb2cxcChkb3VibGUgeCkKIHsKLQkvKiBGb3IgeCBzbWFsbCwgd2UgdXNlIHRoZSBmb2xsb3dpbmcgYXBwcm9hY2guICBMZXQgeSBiZSB0aGUgbmVhcmVzdAotCSAgIGZsb2F0IHRvIDEreCwgdGhlbgorICAgIC8qIEZvciB4IHNtYWxsLCB3ZSB1c2UgdGhlIGZvbGxvd2luZyBhcHByb2FjaC4gIExldCB5IGJlIHRoZSBuZWFyZXN0CisgICAgICAgZmxvYXQgdG8gMSt4LCB0aGVuCiAKLQkgICAgIDEreCA9IHkgKiAoMSAtICh5LTEteCkveSkKKyAgICAgICAgIDEreCA9IHkgKiAoMSAtICh5LTEteCkveSkKIAotCSAgIHNvIGxvZygxK3gpID0gbG9nKHkpICsgbG9nKDEtKHktMS14KS95KS4gIFNpbmNlICh5LTEteCkveSBpcyB0aW55LAotCSAgIHRoZSBzZWNvbmQgdGVybSBpcyB3ZWxsIGFwcHJveGltYXRlZCBieSAoeS0xLXgpL3kuICBJZiBhYnMoeCkgPj0KLQkgICBEQkxfRVBTSUxPTi8yIG9yIHRoZSByb3VuZGluZy1tb2RlIGlzIHNvbWUgZm9ybSBvZiByb3VuZC10by1uZWFyZXN0Ci0JICAgdGhlbiB5LTEteCB3aWxsIGJlIGV4YWN0bHkgcmVwcmVzZW50YWJsZSwgYW5kIGlzIGNvbXB1dGVkIGV4YWN0bHkKLQkgICBieSAoeS0xKS14LgorICAgICAgIHNvIGxvZygxK3gpID0gbG9nKHkpICsgbG9nKDEtKHktMS14KS95KS4gIFNpbmNlICh5LTEteCkveSBpcyB0aW55LAorICAgICAgIHRoZSBzZWNvbmQgdGVybSBpcyB3ZWxsIGFwcHJveGltYXRlZCBieSAoeS0xLXgpL3kuICBJZiBhYnMoeCkgPj0KKyAgICAgICBEQkxfRVBTSUxPTi8yIG9yIHRoZSByb3VuZGluZy1tb2RlIGlzIHNvbWUgZm9ybSBvZiByb3VuZC10by1uZWFyZXN0CisgICAgICAgdGhlbiB5LTEteCB3aWxsIGJlIGV4YWN0bHkgcmVwcmVzZW50YWJsZSwgYW5kIGlzIGNvbXB1dGVkIGV4YWN0bHkKKyAgICAgICBieSAoeS0xKS14LgogCi0JICAgSWYgYWJzKHgpIDwgREJMX0VQU0lMT04vMiBhbmQgdGhlIHJvdW5kaW5nIG1vZGUgaXMgbm90IGtub3duIHRvIGJlCi0JICAgcm91bmQtdG8tbmVhcmVzdCB0aGVuIHRoaXMgbWV0aG9kIGlzIHNsaWdodGx5IGRhbmdlcm91czogMSt4IGNvdWxkCi0JICAgYmUgcm91bmRlZCB1cCB0byAxK0RCTF9FUFNJTE9OIGluc3RlYWQgb2YgZG93biB0byAxLCBhbmQgaW4gdGhhdAotCSAgIGNhc2UgeS0xLXggd2lsbCBub3QgYmUgZXhhY3RseSByZXByZXNlbnRhYmxlIGFueSBtb3JlIGFuZCB0aGUKLQkgICByZXN1bHQgY2FuIGJlIG9mZiBieSBtYW55IHVscHMuICBCdXQgdGhpcyBpcyBlYXNpbHkgZml4ZWQ6IGZvciBhCi0JICAgZmxvYXRpbmctcG9pbnQgbnVtYmVyIHx4fCA8IERCTF9FUFNJTE9OLzIuLCB0aGUgY2xvc2VzdAotCSAgIGZsb2F0aW5nLXBvaW50IG51bWJlciB0byBsb2coMSt4KSBpcyBleGFjdGx5IHguCi0JKi8KKyAgICAgICBJZiBhYnMoeCkgPCBEQkxfRVBTSUxPTi8yIGFuZCB0aGUgcm91bmRpbmcgbW9kZSBpcyBub3Qga25vd24gdG8gYmUKKyAgICAgICByb3VuZC10by1uZWFyZXN0IHRoZW4gdGhpcyBtZXRob2QgaXMgc2xpZ2h0bHkgZGFuZ2Vyb3VzOiAxK3ggY291bGQKKyAgICAgICBiZSByb3VuZGVkIHVwIHRvIDErREJMX0VQU0lMT04gaW5zdGVhZCBvZiBkb3duIHRvIDEsIGFuZCBpbiB0aGF0CisgICAgICAgY2FzZSB5LTEteCB3aWxsIG5vdCBiZSBleGFjdGx5IHJlcHJlc2VudGFibGUgYW55IG1vcmUgYW5kIHRoZQorICAgICAgIHJlc3VsdCBjYW4gYmUgb2ZmIGJ5IG1hbnkgdWxwcy4gIEJ1dCB0aGlzIGlzIGVhc2lseSBmaXhlZDogZm9yIGEKKyAgICAgICBmbG9hdGluZy1wb2ludCBudW1iZXIgfHh8IDwgREJMX0VQU0lMT04vMi4sIHRoZSBjbG9zZXN0CisgICAgICAgZmxvYXRpbmctcG9pbnQgbnVtYmVyIHRvIGxvZygxK3gpIGlzIGV4YWN0bHkgeC4KKyAgICAqLwogCi0JZG91YmxlIHk7Ci0JaWYgKGZhYnMoeCkgPCBEQkxfRVBTSUxPTi8yLikgewotCQlyZXR1cm4geDsKLQl9IGVsc2UgaWYgKC0wLjUgPD0geCAmJiB4IDw9IDEuKSB7Ci0JCS8qIFdBUk5JTkc6IGl0J3MgcG9zc2libGUgdGhhbiBhbiBvdmVyZWFnZXIgY29tcGlsZXIKLQkJICAgd2lsbCBpbmNvcnJlY3RseSBvcHRpbWl6ZSB0aGUgZm9sbG93aW5nIHR3byBsaW5lcwotCQkgICB0byB0aGUgZXF1aXZhbGVudCBvZiAicmV0dXJuIGxvZygxLit4KSIuIElmIHRoaXMKLQkJICAgaGFwcGVucywgdGhlbiByZXN1bHRzIGZyb20gbG9nMXAgd2lsbCBiZSBpbmFjY3VyYXRlCi0JCSAgIGZvciBzbWFsbCB4LiAqLwotCQl5ID0gMS4reDsKLQkJcmV0dXJuIGxvZyh5KS0oKHktMS4pLXgpL3k7Ci0JfSBlbHNlIHsKLQkJLyogTmFOcyBhbmQgaW5maW5pdGllcyBzaG91bGQgZW5kIHVwIGhlcmUgKi8KLQkJcmV0dXJuIGxvZygxLit4KTsKLQl9CisgICAgZG91YmxlIHk7CisgICAgaWYgKGZhYnMoeCkgPCBEQkxfRVBTSUxPTi8yLikgeworICAgICAgICByZXR1cm4geDsKKyAgICB9IGVsc2UgaWYgKC0wLjUgPD0geCAmJiB4IDw9IDEuKSB7CisgICAgICAgIC8qIFdBUk5JTkc6IGl0J3MgcG9zc2libGUgdGhhbiBhbiBvdmVyZWFnZXIgY29tcGlsZXIKKyAgICAgICAgICAgd2lsbCBpbmNvcnJlY3RseSBvcHRpbWl6ZSB0aGUgZm9sbG93aW5nIHR3byBsaW5lcworICAgICAgICAgICB0byB0aGUgZXF1aXZhbGVudCBvZiAicmV0dXJuIGxvZygxLit4KSIuIElmIHRoaXMKKyAgICAgICAgICAgaGFwcGVucywgdGhlbiByZXN1bHRzIGZyb20gbG9nMXAgd2lsbCBiZSBpbmFjY3VyYXRlCisgICAgICAgICAgIGZvciBzbWFsbCB4LiAqLworICAgICAgICB5ID0gMS4reDsKKyAgICAgICAgcmV0dXJuIGxvZyh5KS0oKHktMS4pLXgpL3k7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogTmFOcyBhbmQgaW5maW5pdGllcyBzaG91bGQgZW5kIHVwIGhlcmUgKi8KKyAgICAgICAgcmV0dXJuIGxvZygxLit4KTsKKyAgICB9CiB9CiAjZW5kaWYgLyogSEFWRV9MT0cxUCAqLwogCkBAIC05Nyw3ICs5Nyw3IEBACiAgKgogICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgogICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcwotICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UgCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQogICogaXMgcHJlc2VydmVkLgogICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCkBAIC0xMDksNTEgKzEwOSw1MSBAQAogCiAvKiBhc2luaCh4KQogICogTWV0aG9kIDoKLSAqCUJhc2VkIG9uIAotICoJCWFzaW5oKHgpID0gc2lnbih4KSAqIGxvZyBbIHx4fCArIHNxcnQoeCp4KzEpIF0KLSAqCXdlIGhhdmUKLSAqCWFzaW5oKHgpIDo9IHggIGlmICAxK3gqeD0xLAotICoJCSA6PSBzaWduKHgpKihsb2coeCkrbG4yKSkgZm9yIGxhcmdlIHx4fCwgZWxzZQotICoJCSA6PSBzaWduKHgpKmxvZygyfHh8KzEvKHx4fCtzcXJ0KHgqeCsxKSkpIGlmfHh8PjIsIGVsc2UKLSAqCQkgOj0gc2lnbih4KSpsb2cxcCh8eHwgKyB4XjIvKDEgKyBzcXJ0KDEreF4yKSkpICAKKyAqICAgICAgQmFzZWQgb24KKyAqICAgICAgICAgICAgICBhc2luaCh4KSA9IHNpZ24oeCkgKiBsb2cgWyB8eHwgKyBzcXJ0KHgqeCsxKSBdCisgKiAgICAgIHdlIGhhdmUKKyAqICAgICAgYXNpbmgoeCkgOj0geCAgaWYgIDEreCp4PTEsCisgKiAgICAgICAgICAgICAgIDo9IHNpZ24oeCkqKGxvZyh4KStsbjIpKSBmb3IgbGFyZ2UgfHh8LCBlbHNlCisgKiAgICAgICAgICAgICAgIDo9IHNpZ24oeCkqbG9nKDJ8eHwrMS8ofHh8K3NxcnQoeCp4KzEpKSkgaWZ8eHw+MiwgZWxzZQorICogICAgICAgICAgICAgICA6PSBzaWduKHgpKmxvZzFwKHx4fCArIHheMi8oMSArIHNxcnQoMSt4XjIpKSkKICAqLwogCiAjaWZuZGVmIEhBVkVfQVNJTkgKIGRvdWJsZQogYXNpbmgoZG91YmxlIHgpCi17CQotCWRvdWJsZSB3OwotCWRvdWJsZSBhYnN4ID0gZmFicyh4KTsKK3sKKyAgICBkb3VibGUgdzsKKyAgICBkb3VibGUgYWJzeCA9IGZhYnMoeCk7CiAKLQlpZiAoUHlfSVNfTkFOKHgpIHx8IFB5X0lTX0lORklOSVRZKHgpKSB7Ci0JCXJldHVybiB4K3g7Ci0JfQotCWlmIChhYnN4IDwgdHdvX3Bvd19tMjgpIHsJLyogfHh8IDwgMioqLTI4ICovCi0JCXJldHVybiB4OwkvKiByZXR1cm4geCBpbmV4YWN0IGV4Y2VwdCAwICovCi0JfSAKLQlpZiAoYWJzeCA+IHR3b19wb3dfcDI4KSB7CS8qIHx4fCA+IDIqKjI4ICovCi0JCXcgPSBsb2coYWJzeCkrbG4yOwotCX0KLQllbHNlIGlmIChhYnN4ID4gMi4wKSB7CQkvKiAyIDwgfHh8IDwgMioqMjggKi8KLQkJdyA9IGxvZygyLjAqYWJzeCArIDEuMCAvIChzcXJ0KHgqeCArIDEuMCkgKyBhYnN4KSk7Ci0JfQotCWVsc2UgewkJCQkvKiAyKiotMjggPD0gfHh8IDwgMj0gKi8KLQkJZG91YmxlIHQgPSB4Kng7Ci0JCXcgPSBsb2cxcChhYnN4ICsgdCAvICgxLjAgKyBzcXJ0KDEuMCArIHQpKSk7Ci0JfQotCXJldHVybiBjb3B5c2lnbih3LCB4KTsKLQkKKyAgICBpZiAoUHlfSVNfTkFOKHgpIHx8IFB5X0lTX0lORklOSVRZKHgpKSB7CisgICAgICAgIHJldHVybiB4K3g7CisgICAgfQorICAgIGlmIChhYnN4IDwgdHdvX3Bvd19tMjgpIHsgICAgICAgICAgIC8qIHx4fCA8IDIqKi0yOCAqLworICAgICAgICByZXR1cm4geDsgICAgICAgICAgICAgICAvKiByZXR1cm4geCBpbmV4YWN0IGV4Y2VwdCAwICovCisgICAgfQorICAgIGlmIChhYnN4ID4gdHdvX3Bvd19wMjgpIHsgICAgICAgICAgIC8qIHx4fCA+IDIqKjI4ICovCisgICAgICAgIHcgPSBsb2coYWJzeCkrbG4yOworICAgIH0KKyAgICBlbHNlIGlmIChhYnN4ID4gMi4wKSB7ICAgICAgICAgICAgICAvKiAyIDwgfHh8IDwgMioqMjggKi8KKyAgICAgICAgdyA9IGxvZygyLjAqYWJzeCArIDEuMCAvIChzcXJ0KHgqeCArIDEuMCkgKyBhYnN4KSk7CisgICAgfQorICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDIqKi0yOCA8PSB8eHwgPCAyPSAqLworICAgICAgICBkb3VibGUgdCA9IHgqeDsKKyAgICAgICAgdyA9IGxvZzFwKGFic3ggKyB0IC8gKDEuMCArIHNxcnQoMS4wICsgdCkpKTsKKyAgICB9CisgICAgcmV0dXJuIGNvcHlzaWduKHcsIHgpOworCiB9CiAjZW5kaWYgLyogSEFWRV9BU0lOSCAqLwogCiAvKiBhY29zaCh4KQogICogTWV0aG9kIDoKICAqICAgICAgQmFzZWQgb24KLSAqCSAgICAgIGFjb3NoKHgpID0gbG9nIFsgeCArIHNxcnQoeCp4LTEpIF0KKyAqICAgICAgICAgICAgYWNvc2goeCkgPSBsb2cgWyB4ICsgc3FydCh4KngtMSkgXQogICogICAgICB3ZSBoYXZlCi0gKgkgICAgICBhY29zaCh4KSA6PSBsb2coeCkrbG4yLCBpZiB4IGlzIGxhcmdlOyBlbHNlCi0gKgkgICAgICBhY29zaCh4KSA6PSBsb2coMngtMS8oc3FydCh4KngtMSkreCkpIGlmIHg+MjsgZWxzZQotICoJICAgICAgYWNvc2goeCkgOj0gbG9nMXAodCtzcXJ0KDIuMCp0K3QqdCkpOyB3aGVyZSB0PXgtMS4KKyAqICAgICAgICAgICAgYWNvc2goeCkgOj0gbG9nKHgpK2xuMiwgaWYgeCBpcyBsYXJnZTsgZWxzZQorICogICAgICAgICAgICBhY29zaCh4KSA6PSBsb2coMngtMS8oc3FydCh4KngtMSkreCkpIGlmIHg+MjsgZWxzZQorICogICAgICAgICAgICBhY29zaCh4KSA6PSBsb2cxcCh0K3NxcnQoMi4wKnQrdCp0KSk7IHdoZXJlIHQ9eC0xLgogICoKICAqIFNwZWNpYWwgY2FzZXM6CiAgKiAgICAgIGFjb3NoKHgpIGlzIE5hTiB3aXRoIHNpZ25hbCBpZiB4PDEuCkBAIC0xNjQsMzUgKzE2NCwzNSBAQAogZG91YmxlCiBhY29zaChkb3VibGUgeCkKIHsKLQlpZiAoUHlfSVNfTkFOKHgpKSB7Ci0JCXJldHVybiB4K3g7Ci0JfQotCWlmICh4IDwgMS4pIHsJCQkvKiB4IDwgMTsgIHJldHVybiBhIHNpZ25hbGluZyBOYU4gKi8KLQkJZXJybm8gPSBFRE9NOworICAgIGlmIChQeV9JU19OQU4oeCkpIHsKKyAgICAgICAgcmV0dXJuIHgreDsKKyAgICB9CisgICAgaWYgKHggPCAxLikgeyAgICAgICAgICAgICAgICAgICAgICAgLyogeCA8IDE7ICByZXR1cm4gYSBzaWduYWxpbmcgTmFOICovCisgICAgICAgIGVycm5vID0gRURPTTsKICNpZmRlZiBQeV9OQU4KLQkJcmV0dXJuIFB5X05BTjsKKyAgICAgICAgcmV0dXJuIFB5X05BTjsKICNlbHNlCi0JCXJldHVybiAoeC14KS8oeC14KTsKKyAgICAgICAgcmV0dXJuICh4LXgpLyh4LXgpOwogI2VuZGlmCi0JfQotCWVsc2UgaWYgKHggPj0gdHdvX3Bvd19wMjgpIHsJLyogeCA+IDIqKjI4ICovCi0JCWlmIChQeV9JU19JTkZJTklUWSh4KSkgewotCQkJcmV0dXJuIHgreDsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBsb2coeCkrbG4yOwkvKiBhY29zaChodWdlKT1sb2coMngpICovCi0JCX0KLQl9Ci0JZWxzZSBpZiAoeCA9PSAxLikgewotCQlyZXR1cm4gMC4wOwkJCS8qIGFjb3NoKDEpID0gMCAqLwotCX0KLQllbHNlIGlmICh4ID4gMi4pIHsJCQkvKiAyIDwgeCA8IDIqKjI4ICovCi0JCWRvdWJsZSB0ID0geCp4OwotCQlyZXR1cm4gbG9nKDIuMCp4IC0gMS4wIC8gKHggKyBzcXJ0KHQgLSAxLjApKSk7Ci0JfQotCWVsc2UgewkJCQkvKiAxIDwgeCA8PSAyICovCi0JCWRvdWJsZSB0ID0geCAtIDEuMDsKLQkJcmV0dXJuIGxvZzFwKHQgKyBzcXJ0KDIuMCp0ICsgdCp0KSk7Ci0JfQorICAgIH0KKyAgICBlbHNlIGlmICh4ID49IHR3b19wb3dfcDI4KSB7ICAgICAgICAvKiB4ID4gMioqMjggKi8KKyAgICAgICAgaWYgKFB5X0lTX0lORklOSVRZKHgpKSB7CisgICAgICAgICAgICByZXR1cm4geCt4OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGxvZyh4KStsbjI7ICAgICAgICAgICAgICAgICAgLyogYWNvc2goaHVnZSk9bG9nKDJ4KSAqLworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKHggPT0gMS4pIHsKKyAgICAgICAgcmV0dXJuIDAuMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFjb3NoKDEpID0gMCAqLworICAgIH0KKyAgICBlbHNlIGlmICh4ID4gMi4pIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDIgPCB4IDwgMioqMjggKi8KKyAgICAgICAgZG91YmxlIHQgPSB4Kng7CisgICAgICAgIHJldHVybiBsb2coMi4wKnggLSAxLjAgLyAoeCArIHNxcnQodCAtIDEuMCkpKTsKKyAgICB9CisgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMSA8IHggPD0gMiAqLworICAgICAgICBkb3VibGUgdCA9IHggLSAxLjA7CisgICAgICAgIHJldHVybiBsb2cxcCh0ICsgc3FydCgyLjAqdCArIHQqdCkpOworICAgIH0KIH0KICNlbmRpZiAvKiBIQVZFX0FDT1NIICovCiAKQEAgLTIwMCw5ICsyMDAsOSBAQAogICogTWV0aG9kIDoKICAqICAgIDEuUmVkdWNlZCB4IHRvIHBvc2l0aXZlIGJ5IGF0YW5oKC14KSA9IC1hdGFuaCh4KQogICogICAgMi5Gb3IgeD49MC41Ci0gKgkJICAxCSAgICAgIDJ4CQkJICB4CisgKiAgICAgICAgICAgICAgICAxICAgICAgICAgICAyeCAgICAgICAgICAgICAgICAgICAgICAgICAgeAogICogICAgICBhdGFuaCh4KSA9IC0tLSAqIGxvZygxICsgLS0tLS0tLSkgPSAwLjUgKiBsb2cxcCgyICogLS0tLS0tLS0pCi0gKgkJICAyCSAgICAgMSAtIHgJCSAgICAgIDEgLSB4CisgKiAgICAgICAgICAgICAgICAyICAgICAgICAgIDEgLSB4ICAgICAgICAgICAgICAgICAgICAxIC0geAogICoKICAqICAgICAgRm9yIHg8MC41CiAgKiAgICAgIGF0YW5oKHgpID0gMC41KmxvZzFwKDJ4KzJ4KngvKDEteCkpCkBAIC0yMTcsMzEgKzIxNywzMSBAQAogZG91YmxlCiBhdGFuaChkb3VibGUgeCkKIHsKLQlkb3VibGUgYWJzeDsKLQlkb3VibGUgdDsKKyAgICBkb3VibGUgYWJzeDsKKyAgICBkb3VibGUgdDsKIAotCWlmIChQeV9JU19OQU4oeCkpIHsKLQkJcmV0dXJuIHgreDsKLQl9Ci0JYWJzeCA9IGZhYnMoeCk7Ci0JaWYgKGFic3ggPj0gMS4pIHsJCS8qIHx4fCA+PSAxICovCi0JCWVycm5vID0gRURPTTsKKyAgICBpZiAoUHlfSVNfTkFOKHgpKSB7CisgICAgICAgIHJldHVybiB4K3g7CisgICAgfQorICAgIGFic3ggPSBmYWJzKHgpOworICAgIGlmIChhYnN4ID49IDEuKSB7ICAgICAgICAgICAgICAgICAgIC8qIHx4fCA+PSAxICovCisgICAgICAgIGVycm5vID0gRURPTTsKICNpZmRlZiBQeV9OQU4KLQkJcmV0dXJuIFB5X05BTjsKKyAgICAgICAgcmV0dXJuIFB5X05BTjsKICNlbHNlCi0JCXJldHVybiB4L3plcm87CisgICAgICAgIHJldHVybiB4L3plcm87CiAjZW5kaWYKLQl9Ci0JaWYgKGFic3ggPCB0d29fcG93X20yOCkgewkvKiB8eHwgPCAyKiotMjggKi8KLQkJcmV0dXJuIHg7Ci0JfQotCWlmIChhYnN4IDwgMC41KSB7CQkvKiB8eHwgPCAwLjUgKi8KLQkJdCA9IGFic3grYWJzeDsKLQkJdCA9IDAuNSAqIGxvZzFwKHQgKyB0KmFic3ggLyAoMS4wIC0gYWJzeCkpOwotCX0gCi0JZWxzZSB7CQkJCS8qIDAuNSA8PSB8eHwgPD0gMS4wICovCi0JCXQgPSAwLjUgKiBsb2cxcCgoYWJzeCArIGFic3gpIC8gKDEuMCAtIGFic3gpKTsKLQl9Ci0JcmV0dXJuIGNvcHlzaWduKHQsIHgpOworICAgIH0KKyAgICBpZiAoYWJzeCA8IHR3b19wb3dfbTI4KSB7ICAgICAgICAgICAvKiB8eHwgPCAyKiotMjggKi8KKyAgICAgICAgcmV0dXJuIHg7CisgICAgfQorICAgIGlmIChhYnN4IDwgMC41KSB7ICAgICAgICAgICAgICAgICAgIC8qIHx4fCA8IDAuNSAqLworICAgICAgICB0ID0gYWJzeCthYnN4OworICAgICAgICB0ID0gMC41ICogbG9nMXAodCArIHQqYWJzeCAvICgxLjAgLSBhYnN4KSk7CisgICAgfQorICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDAuNSA8PSB8eHwgPD0gMS4wICovCisgICAgICAgIHQgPSAwLjUgKiBsb2cxcCgoYWJzeCArIGFic3gpIC8gKDEuMCAtIGFic3gpKTsKKyAgICB9CisgICAgcmV0dXJuIGNvcHlzaWduKHQsIHgpOwogfQogI2VuZGlmIC8qIEhBVkVfQVRBTkggKi8KZGlmZiAtLWdpdCBhL1B5dGhvbi9weXN0YXRlLmMgYi9QeXRob24vcHlzdGF0ZS5jCmluZGV4IDM0M2E5N2IuLjVhZmMwMWEgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9weXN0YXRlLmMKKysrIGIvUHl0aG9uL3B5c3RhdGUuYwpAQCAtNTgsOTIgKzU4LDkyIEBACiBQeUludGVycHJldGVyU3RhdGUgKgogUHlJbnRlcnByZXRlclN0YXRlX05ldyh2b2lkKQogewotCVB5SW50ZXJwcmV0ZXJTdGF0ZSAqaW50ZXJwID0gKFB5SW50ZXJwcmV0ZXJTdGF0ZSAqKQotCQkJCSAgICAgbWFsbG9jKHNpemVvZihQeUludGVycHJldGVyU3RhdGUpKTsKKyAgICBQeUludGVycHJldGVyU3RhdGUgKmludGVycCA9IChQeUludGVycHJldGVyU3RhdGUgKikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbGxvYyhzaXplb2YoUHlJbnRlcnByZXRlclN0YXRlKSk7CiAKLQlpZiAoaW50ZXJwICE9IE5VTEwpIHsKLQkJSEVBRF9JTklUKCk7CisgICAgaWYgKGludGVycCAhPSBOVUxMKSB7CisgICAgICAgIEhFQURfSU5JVCgpOwogI2lmZGVmIFdJVEhfVEhSRUFECi0JCWlmIChoZWFkX211dGV4ID09IE5VTEwpCi0JCQlQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIHRocmVhZHMgZm9yIGludGVycHJldGVyIik7CisgICAgICAgIGlmIChoZWFkX211dGV4ID09IE5VTEwpCisgICAgICAgICAgICBQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIHRocmVhZHMgZm9yIGludGVycHJldGVyIik7CiAjZW5kaWYKLQkJaW50ZXJwLT5tb2R1bGVzID0gTlVMTDsKLQkJaW50ZXJwLT5tb2R1bGVzX3JlbG9hZGluZyA9IE5VTEw7Ci0JCWludGVycC0+c3lzZGljdCA9IE5VTEw7Ci0JCWludGVycC0+YnVpbHRpbnMgPSBOVUxMOwotCQlpbnRlcnAtPnRzdGF0ZV9oZWFkID0gTlVMTDsKLQkJaW50ZXJwLT5jb2RlY19zZWFyY2hfcGF0aCA9IE5VTEw7Ci0JCWludGVycC0+Y29kZWNfc2VhcmNoX2NhY2hlID0gTlVMTDsKLQkJaW50ZXJwLT5jb2RlY19lcnJvcl9yZWdpc3RyeSA9IE5VTEw7CisgICAgICAgIGludGVycC0+bW9kdWxlcyA9IE5VTEw7CisgICAgICAgIGludGVycC0+bW9kdWxlc19yZWxvYWRpbmcgPSBOVUxMOworICAgICAgICBpbnRlcnAtPnN5c2RpY3QgPSBOVUxMOworICAgICAgICBpbnRlcnAtPmJ1aWx0aW5zID0gTlVMTDsKKyAgICAgICAgaW50ZXJwLT50c3RhdGVfaGVhZCA9IE5VTEw7CisgICAgICAgIGludGVycC0+Y29kZWNfc2VhcmNoX3BhdGggPSBOVUxMOworICAgICAgICBpbnRlcnAtPmNvZGVjX3NlYXJjaF9jYWNoZSA9IE5VTEw7CisgICAgICAgIGludGVycC0+Y29kZWNfZXJyb3JfcmVnaXN0cnkgPSBOVUxMOwogI2lmZGVmIEhBVkVfRExPUEVOCiAjaWZkZWYgUlRMRF9OT1cKLSAgICAgICAgICAgICAgICBpbnRlcnAtPmRsb3BlbmZsYWdzID0gUlRMRF9OT1c7CisgICAgICAgIGludGVycC0+ZGxvcGVuZmxhZ3MgPSBSVExEX05PVzsKICNlbHNlCi0JCWludGVycC0+ZGxvcGVuZmxhZ3MgPSBSVExEX0xBWlk7CisgICAgICAgIGludGVycC0+ZGxvcGVuZmxhZ3MgPSBSVExEX0xBWlk7CiAjZW5kaWYKICNlbmRpZgogI2lmZGVmIFdJVEhfVFNDCi0JCWludGVycC0+dHNjZHVtcCA9IDA7CisgICAgICAgIGludGVycC0+dHNjZHVtcCA9IDA7CiAjZW5kaWYKIAotCQlIRUFEX0xPQ0soKTsKLQkJaW50ZXJwLT5uZXh0ID0gaW50ZXJwX2hlYWQ7Ci0JCWludGVycF9oZWFkID0gaW50ZXJwOwotCQlIRUFEX1VOTE9DSygpOwotCX0KKyAgICAgICAgSEVBRF9MT0NLKCk7CisgICAgICAgIGludGVycC0+bmV4dCA9IGludGVycF9oZWFkOworICAgICAgICBpbnRlcnBfaGVhZCA9IGludGVycDsKKyAgICAgICAgSEVBRF9VTkxPQ0soKTsKKyAgICB9CiAKLQlyZXR1cm4gaW50ZXJwOworICAgIHJldHVybiBpbnRlcnA7CiB9CiAKIAogdm9pZAogUHlJbnRlcnByZXRlclN0YXRlX0NsZWFyKFB5SW50ZXJwcmV0ZXJTdGF0ZSAqaW50ZXJwKQogewotCVB5VGhyZWFkU3RhdGUgKnA7Ci0JSEVBRF9MT0NLKCk7Ci0JZm9yIChwID0gaW50ZXJwLT50c3RhdGVfaGVhZDsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkKLQkJUHlUaHJlYWRTdGF0ZV9DbGVhcihwKTsKLQlIRUFEX1VOTE9DSygpOwotCVB5X0NMRUFSKGludGVycC0+Y29kZWNfc2VhcmNoX3BhdGgpOwotCVB5X0NMRUFSKGludGVycC0+Y29kZWNfc2VhcmNoX2NhY2hlKTsKLQlQeV9DTEVBUihpbnRlcnAtPmNvZGVjX2Vycm9yX3JlZ2lzdHJ5KTsKLQlQeV9DTEVBUihpbnRlcnAtPm1vZHVsZXMpOwotCVB5X0NMRUFSKGludGVycC0+bW9kdWxlc19yZWxvYWRpbmcpOwotCVB5X0NMRUFSKGludGVycC0+c3lzZGljdCk7Ci0JUHlfQ0xFQVIoaW50ZXJwLT5idWlsdGlucyk7CisgICAgUHlUaHJlYWRTdGF0ZSAqcDsKKyAgICBIRUFEX0xPQ0soKTsKKyAgICBmb3IgKHAgPSBpbnRlcnAtPnRzdGF0ZV9oZWFkOyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KQorICAgICAgICBQeVRocmVhZFN0YXRlX0NsZWFyKHApOworICAgIEhFQURfVU5MT0NLKCk7CisgICAgUHlfQ0xFQVIoaW50ZXJwLT5jb2RlY19zZWFyY2hfcGF0aCk7CisgICAgUHlfQ0xFQVIoaW50ZXJwLT5jb2RlY19zZWFyY2hfY2FjaGUpOworICAgIFB5X0NMRUFSKGludGVycC0+Y29kZWNfZXJyb3JfcmVnaXN0cnkpOworICAgIFB5X0NMRUFSKGludGVycC0+bW9kdWxlcyk7CisgICAgUHlfQ0xFQVIoaW50ZXJwLT5tb2R1bGVzX3JlbG9hZGluZyk7CisgICAgUHlfQ0xFQVIoaW50ZXJwLT5zeXNkaWN0KTsKKyAgICBQeV9DTEVBUihpbnRlcnAtPmJ1aWx0aW5zKTsKIH0KIAogCiBzdGF0aWMgdm9pZAogemFwdGhyZWFkcyhQeUludGVycHJldGVyU3RhdGUgKmludGVycCkKIHsKLQlQeVRocmVhZFN0YXRlICpwOwotCS8qIE5vIG5lZWQgdG8gbG9jayB0aGUgbXV0ZXggaGVyZSBiZWNhdXNlIHRoaXMgc2hvdWxkIG9ubHkgaGFwcGVuCi0JICAgd2hlbiB0aGUgdGhyZWFkcyBhcmUgYWxsIHJlYWxseSBkZWFkIChYWFggZmFtb3VzIGxhc3Qgd29yZHMpLiAqLwotCXdoaWxlICgocCA9IGludGVycC0+dHN0YXRlX2hlYWQpICE9IE5VTEwpIHsKLQkJUHlUaHJlYWRTdGF0ZV9EZWxldGUocCk7Ci0JfQorICAgIFB5VGhyZWFkU3RhdGUgKnA7CisgICAgLyogTm8gbmVlZCB0byBsb2NrIHRoZSBtdXRleCBoZXJlIGJlY2F1c2UgdGhpcyBzaG91bGQgb25seSBoYXBwZW4KKyAgICAgICB3aGVuIHRoZSB0aHJlYWRzIGFyZSBhbGwgcmVhbGx5IGRlYWQgKFhYWCBmYW1vdXMgbGFzdCB3b3JkcykuICovCisgICAgd2hpbGUgKChwID0gaW50ZXJwLT50c3RhdGVfaGVhZCkgIT0gTlVMTCkgeworICAgICAgICBQeVRocmVhZFN0YXRlX0RlbGV0ZShwKTsKKyAgICB9CiB9CiAKIAogdm9pZAogUHlJbnRlcnByZXRlclN0YXRlX0RlbGV0ZShQeUludGVycHJldGVyU3RhdGUgKmludGVycCkKIHsKLQlQeUludGVycHJldGVyU3RhdGUgKipwOwotCXphcHRocmVhZHMoaW50ZXJwKTsKLQlIRUFEX0xPQ0soKTsKLQlmb3IgKHAgPSAmaW50ZXJwX2hlYWQ7IDsgcCA9ICYoKnApLT5uZXh0KSB7Ci0JCWlmICgqcCA9PSBOVUxMKQotCQkJUHlfRmF0YWxFcnJvcigKLQkJCQkiUHlJbnRlcnByZXRlclN0YXRlX0RlbGV0ZTogaW52YWxpZCBpbnRlcnAiKTsKLQkJaWYgKCpwID09IGludGVycCkKLQkJCWJyZWFrOwotCX0KLQlpZiAoaW50ZXJwLT50c3RhdGVfaGVhZCAhPSBOVUxMKQotCQlQeV9GYXRhbEVycm9yKCJQeUludGVycHJldGVyU3RhdGVfRGVsZXRlOiByZW1haW5pbmcgdGhyZWFkcyIpOwotCSpwID0gaW50ZXJwLT5uZXh0OwotCUhFQURfVU5MT0NLKCk7Ci0JZnJlZShpbnRlcnApOworICAgIFB5SW50ZXJwcmV0ZXJTdGF0ZSAqKnA7CisgICAgemFwdGhyZWFkcyhpbnRlcnApOworICAgIEhFQURfTE9DSygpOworICAgIGZvciAocCA9ICZpbnRlcnBfaGVhZDsgOyBwID0gJigqcCktPm5leHQpIHsKKyAgICAgICAgaWYgKCpwID09IE5VTEwpCisgICAgICAgICAgICBQeV9GYXRhbEVycm9yKAorICAgICAgICAgICAgICAgICJQeUludGVycHJldGVyU3RhdGVfRGVsZXRlOiBpbnZhbGlkIGludGVycCIpOworICAgICAgICBpZiAoKnAgPT0gaW50ZXJwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChpbnRlcnAtPnRzdGF0ZV9oZWFkICE9IE5VTEwpCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIlB5SW50ZXJwcmV0ZXJTdGF0ZV9EZWxldGU6IHJlbWFpbmluZyB0aHJlYWRzIik7CisgICAgKnAgPSBpbnRlcnAtPm5leHQ7CisgICAgSEVBRF9VTkxPQ0soKTsKKyAgICBmcmVlKGludGVycCk7CiB9CiAKIApAQCAtMTUxLDEwNCArMTUxLDEwNCBAQAogc3RhdGljIHN0cnVjdCBfZnJhbWUgKgogdGhyZWFkc3RhdGVfZ2V0ZnJhbWUoUHlUaHJlYWRTdGF0ZSAqc2VsZikKIHsKLQlyZXR1cm4gc2VsZi0+ZnJhbWU7CisgICAgcmV0dXJuIHNlbGYtPmZyYW1lOwogfQogCiBzdGF0aWMgUHlUaHJlYWRTdGF0ZSAqCiBuZXdfdGhyZWFkc3RhdGUoUHlJbnRlcnByZXRlclN0YXRlICppbnRlcnAsIGludCBpbml0KQogewotCVB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IChQeVRocmVhZFN0YXRlICopbWFsbG9jKHNpemVvZihQeVRocmVhZFN0YXRlKSk7CisgICAgUHlUaHJlYWRTdGF0ZSAqdHN0YXRlID0gKFB5VGhyZWFkU3RhdGUgKiltYWxsb2Moc2l6ZW9mKFB5VGhyZWFkU3RhdGUpKTsKIAotCWlmIChfUHlUaHJlYWRTdGF0ZV9HZXRGcmFtZSA9PSBOVUxMKQotCQlfUHlUaHJlYWRTdGF0ZV9HZXRGcmFtZSA9IHRocmVhZHN0YXRlX2dldGZyYW1lOworICAgIGlmIChfUHlUaHJlYWRTdGF0ZV9HZXRGcmFtZSA9PSBOVUxMKQorICAgICAgICBfUHlUaHJlYWRTdGF0ZV9HZXRGcmFtZSA9IHRocmVhZHN0YXRlX2dldGZyYW1lOwogCi0JaWYgKHRzdGF0ZSAhPSBOVUxMKSB7Ci0JCXRzdGF0ZS0+aW50ZXJwID0gaW50ZXJwOworICAgIGlmICh0c3RhdGUgIT0gTlVMTCkgeworICAgICAgICB0c3RhdGUtPmludGVycCA9IGludGVycDsKIAotCQl0c3RhdGUtPmZyYW1lID0gTlVMTDsKLQkJdHN0YXRlLT5yZWN1cnNpb25fZGVwdGggPSAwOwotCQl0c3RhdGUtPnRyYWNpbmcgPSAwOwotCQl0c3RhdGUtPnVzZV90cmFjaW5nID0gMDsKLQkJdHN0YXRlLT50aWNrX2NvdW50ZXIgPSAwOwotCQl0c3RhdGUtPmdpbHN0YXRlX2NvdW50ZXIgPSAwOwotCQl0c3RhdGUtPmFzeW5jX2V4YyA9IE5VTEw7CisgICAgICAgIHRzdGF0ZS0+ZnJhbWUgPSBOVUxMOworICAgICAgICB0c3RhdGUtPnJlY3Vyc2lvbl9kZXB0aCA9IDA7CisgICAgICAgIHRzdGF0ZS0+dHJhY2luZyA9IDA7CisgICAgICAgIHRzdGF0ZS0+dXNlX3RyYWNpbmcgPSAwOworICAgICAgICB0c3RhdGUtPnRpY2tfY291bnRlciA9IDA7CisgICAgICAgIHRzdGF0ZS0+Z2lsc3RhdGVfY291bnRlciA9IDA7CisgICAgICAgIHRzdGF0ZS0+YXN5bmNfZXhjID0gTlVMTDsKICNpZmRlZiBXSVRIX1RIUkVBRAotCQl0c3RhdGUtPnRocmVhZF9pZCA9IFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKTsKKyAgICAgICAgdHN0YXRlLT50aHJlYWRfaWQgPSBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCk7CiAjZWxzZQotCQl0c3RhdGUtPnRocmVhZF9pZCA9IDA7CisgICAgICAgIHRzdGF0ZS0+dGhyZWFkX2lkID0gMDsKICNlbmRpZgogCi0JCXRzdGF0ZS0+ZGljdCA9IE5VTEw7CisgICAgICAgIHRzdGF0ZS0+ZGljdCA9IE5VTEw7CiAKLQkJdHN0YXRlLT5jdXJleGNfdHlwZSA9IE5VTEw7Ci0JCXRzdGF0ZS0+Y3VyZXhjX3ZhbHVlID0gTlVMTDsKLQkJdHN0YXRlLT5jdXJleGNfdHJhY2ViYWNrID0gTlVMTDsKKyAgICAgICAgdHN0YXRlLT5jdXJleGNfdHlwZSA9IE5VTEw7CisgICAgICAgIHRzdGF0ZS0+Y3VyZXhjX3ZhbHVlID0gTlVMTDsKKyAgICAgICAgdHN0YXRlLT5jdXJleGNfdHJhY2ViYWNrID0gTlVMTDsKIAotCQl0c3RhdGUtPmV4Y190eXBlID0gTlVMTDsKLQkJdHN0YXRlLT5leGNfdmFsdWUgPSBOVUxMOwotCQl0c3RhdGUtPmV4Y190cmFjZWJhY2sgPSBOVUxMOworICAgICAgICB0c3RhdGUtPmV4Y190eXBlID0gTlVMTDsKKyAgICAgICAgdHN0YXRlLT5leGNfdmFsdWUgPSBOVUxMOworICAgICAgICB0c3RhdGUtPmV4Y190cmFjZWJhY2sgPSBOVUxMOwogCi0JCXRzdGF0ZS0+Y19wcm9maWxlZnVuYyA9IE5VTEw7Ci0JCXRzdGF0ZS0+Y190cmFjZWZ1bmMgPSBOVUxMOwotCQl0c3RhdGUtPmNfcHJvZmlsZW9iaiA9IE5VTEw7Ci0JCXRzdGF0ZS0+Y190cmFjZW9iaiA9IE5VTEw7CisgICAgICAgIHRzdGF0ZS0+Y19wcm9maWxlZnVuYyA9IE5VTEw7CisgICAgICAgIHRzdGF0ZS0+Y190cmFjZWZ1bmMgPSBOVUxMOworICAgICAgICB0c3RhdGUtPmNfcHJvZmlsZW9iaiA9IE5VTEw7CisgICAgICAgIHRzdGF0ZS0+Y190cmFjZW9iaiA9IE5VTEw7CiAKLQkJaWYgKGluaXQpCi0JCQlfUHlUaHJlYWRTdGF0ZV9Jbml0KHRzdGF0ZSk7CisgICAgICAgIGlmIChpbml0KQorICAgICAgICAgICAgX1B5VGhyZWFkU3RhdGVfSW5pdCh0c3RhdGUpOwogCi0JCUhFQURfTE9DSygpOwotCQl0c3RhdGUtPm5leHQgPSBpbnRlcnAtPnRzdGF0ZV9oZWFkOwotCQlpbnRlcnAtPnRzdGF0ZV9oZWFkID0gdHN0YXRlOwotCQlIRUFEX1VOTE9DSygpOwotCX0KKyAgICAgICAgSEVBRF9MT0NLKCk7CisgICAgICAgIHRzdGF0ZS0+bmV4dCA9IGludGVycC0+dHN0YXRlX2hlYWQ7CisgICAgICAgIGludGVycC0+dHN0YXRlX2hlYWQgPSB0c3RhdGU7CisgICAgICAgIEhFQURfVU5MT0NLKCk7CisgICAgfQogCi0JcmV0dXJuIHRzdGF0ZTsKKyAgICByZXR1cm4gdHN0YXRlOwogfQogCiBQeVRocmVhZFN0YXRlICoKIFB5VGhyZWFkU3RhdGVfTmV3KFB5SW50ZXJwcmV0ZXJTdGF0ZSAqaW50ZXJwKQogewotCXJldHVybiBuZXdfdGhyZWFkc3RhdGUoaW50ZXJwLCAxKTsKKyAgICByZXR1cm4gbmV3X3RocmVhZHN0YXRlKGludGVycCwgMSk7CiB9CiAKIFB5VGhyZWFkU3RhdGUgKgogX1B5VGhyZWFkU3RhdGVfUHJlYWxsb2MoUHlJbnRlcnByZXRlclN0YXRlICppbnRlcnApCiB7Ci0JcmV0dXJuIG5ld190aHJlYWRzdGF0ZShpbnRlcnAsIDApOworICAgIHJldHVybiBuZXdfdGhyZWFkc3RhdGUoaW50ZXJwLCAwKTsKIH0KIAogdm9pZAogX1B5VGhyZWFkU3RhdGVfSW5pdChQeVRocmVhZFN0YXRlICp0c3RhdGUpCiB7CiAjaWZkZWYgV0lUSF9USFJFQUQKLQlfUHlHSUxTdGF0ZV9Ob3RlVGhyZWFkU3RhdGUodHN0YXRlKTsKKyAgICBfUHlHSUxTdGF0ZV9Ob3RlVGhyZWFkU3RhdGUodHN0YXRlKTsKICNlbmRpZgogfQogCiB2b2lkCiBQeVRocmVhZFN0YXRlX0NsZWFyKFB5VGhyZWFkU3RhdGUgKnRzdGF0ZSkKIHsKLQlpZiAoUHlfVmVyYm9zZUZsYWcgJiYgdHN0YXRlLT5mcmFtZSAhPSBOVUxMKQotCQlmcHJpbnRmKHN0ZGVyciwKLQkJICAiUHlUaHJlYWRTdGF0ZV9DbGVhcjogd2FybmluZzogdGhyZWFkIHN0aWxsIGhhcyBhIGZyYW1lXG4iKTsKKyAgICBpZiAoUHlfVmVyYm9zZUZsYWcgJiYgdHN0YXRlLT5mcmFtZSAhPSBOVUxMKQorICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAiUHlUaHJlYWRTdGF0ZV9DbGVhcjogd2FybmluZzogdGhyZWFkIHN0aWxsIGhhcyBhIGZyYW1lXG4iKTsKIAotCVB5X0NMRUFSKHRzdGF0ZS0+ZnJhbWUpOworICAgIFB5X0NMRUFSKHRzdGF0ZS0+ZnJhbWUpOwogCi0JUHlfQ0xFQVIodHN0YXRlLT5kaWN0KTsKLQlQeV9DTEVBUih0c3RhdGUtPmFzeW5jX2V4Yyk7CisgICAgUHlfQ0xFQVIodHN0YXRlLT5kaWN0KTsKKyAgICBQeV9DTEVBUih0c3RhdGUtPmFzeW5jX2V4Yyk7CiAKLQlQeV9DTEVBUih0c3RhdGUtPmN1cmV4Y190eXBlKTsKLQlQeV9DTEVBUih0c3RhdGUtPmN1cmV4Y192YWx1ZSk7Ci0JUHlfQ0xFQVIodHN0YXRlLT5jdXJleGNfdHJhY2ViYWNrKTsKKyAgICBQeV9DTEVBUih0c3RhdGUtPmN1cmV4Y190eXBlKTsKKyAgICBQeV9DTEVBUih0c3RhdGUtPmN1cmV4Y192YWx1ZSk7CisgICAgUHlfQ0xFQVIodHN0YXRlLT5jdXJleGNfdHJhY2ViYWNrKTsKIAotCVB5X0NMRUFSKHRzdGF0ZS0+ZXhjX3R5cGUpOwotCVB5X0NMRUFSKHRzdGF0ZS0+ZXhjX3ZhbHVlKTsKLQlQeV9DTEVBUih0c3RhdGUtPmV4Y190cmFjZWJhY2spOworICAgIFB5X0NMRUFSKHRzdGF0ZS0+ZXhjX3R5cGUpOworICAgIFB5X0NMRUFSKHRzdGF0ZS0+ZXhjX3ZhbHVlKTsKKyAgICBQeV9DTEVBUih0c3RhdGUtPmV4Y190cmFjZWJhY2spOwogCi0JdHN0YXRlLT5jX3Byb2ZpbGVmdW5jID0gTlVMTDsKLQl0c3RhdGUtPmNfdHJhY2VmdW5jID0gTlVMTDsKLQlQeV9DTEVBUih0c3RhdGUtPmNfcHJvZmlsZW9iaik7Ci0JUHlfQ0xFQVIodHN0YXRlLT5jX3RyYWNlb2JqKTsKKyAgICB0c3RhdGUtPmNfcHJvZmlsZWZ1bmMgPSBOVUxMOworICAgIHRzdGF0ZS0+Y190cmFjZWZ1bmMgPSBOVUxMOworICAgIFB5X0NMRUFSKHRzdGF0ZS0+Y19wcm9maWxlb2JqKTsKKyAgICBQeV9DTEVBUih0c3RhdGUtPmNfdHJhY2VvYmopOwogfQogCiAKQEAgLTI1Niw1MCArMjU2LDUwIEBACiBzdGF0aWMgdm9pZAogdHN0YXRlX2RlbGV0ZV9jb21tb24oUHlUaHJlYWRTdGF0ZSAqdHN0YXRlKQogewotCVB5SW50ZXJwcmV0ZXJTdGF0ZSAqaW50ZXJwOwotCVB5VGhyZWFkU3RhdGUgKipwOwotCVB5VGhyZWFkU3RhdGUgKnByZXZfcCA9IE5VTEw7Ci0JaWYgKHRzdGF0ZSA9PSBOVUxMKQotCQlQeV9GYXRhbEVycm9yKCJQeVRocmVhZFN0YXRlX0RlbGV0ZTogTlVMTCB0c3RhdGUiKTsKLQlpbnRlcnAgPSB0c3RhdGUtPmludGVycDsKLQlpZiAoaW50ZXJwID09IE5VTEwpCi0JCVB5X0ZhdGFsRXJyb3IoIlB5VGhyZWFkU3RhdGVfRGVsZXRlOiBOVUxMIGludGVycCIpOwotCUhFQURfTE9DSygpOwotCWZvciAocCA9ICZpbnRlcnAtPnRzdGF0ZV9oZWFkOyA7IHAgPSAmKCpwKS0+bmV4dCkgewotCQlpZiAoKnAgPT0gTlVMTCkKLQkJCVB5X0ZhdGFsRXJyb3IoCi0JCQkJIlB5VGhyZWFkU3RhdGVfRGVsZXRlOiBpbnZhbGlkIHRzdGF0ZSIpOwotCQlpZiAoKnAgPT0gdHN0YXRlKQotCQkJYnJlYWs7Ci0JCS8qIFNhbml0eSBjaGVjay4gIFRoZXNlIHN0YXRlcyBzaG91bGQgbmV2ZXIgaGFwcGVuIGJ1dCBpZgotCQkgKiB0aGV5IGRvIHdlIG11c3QgYWJvcnQuICBPdGhlcndpc2Ugd2UnbGwgZW5kIHVwIHNwaW5uaW5nIGluCi0JCSAqIGluIGEgdGlnaHQgbG9vcCB3aXRoIHRoZSBsb2NrIGhlbGQuICBBIHNpbWlsYXIgY2hlY2sgaXMgZG9uZQotCQkgKiBpbiB0aHJlYWQuYyBmaW5kX2tleSgpLiAgKi8KLQkJaWYgKCpwID09IHByZXZfcCkKLQkJCVB5X0ZhdGFsRXJyb3IoCi0JCQkJIlB5VGhyZWFkU3RhdGVfRGVsZXRlOiBzbWFsbCBjaXJjdWxhciBsaXN0KCEpIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGFuZCB0c3RhdGUgbm90IGZvdW5kLiIpOwotCQlwcmV2X3AgPSAqcDsKLQkJaWYgKCgqcCktPm5leHQgPT0gaW50ZXJwLT50c3RhdGVfaGVhZCkKLQkJCVB5X0ZhdGFsRXJyb3IoCi0JCQkJIlB5VGhyZWFkU3RhdGVfRGVsZXRlOiBjaXJjdWxhciBsaXN0KCEpIGFuZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiB0c3RhdGUgbm90IGZvdW5kLiIpOwotCX0KLQkqcCA9IHRzdGF0ZS0+bmV4dDsKLQlIRUFEX1VOTE9DSygpOwotCWZyZWUodHN0YXRlKTsKKyAgICBQeUludGVycHJldGVyU3RhdGUgKmludGVycDsKKyAgICBQeVRocmVhZFN0YXRlICoqcDsKKyAgICBQeVRocmVhZFN0YXRlICpwcmV2X3AgPSBOVUxMOworICAgIGlmICh0c3RhdGUgPT0gTlVMTCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiUHlUaHJlYWRTdGF0ZV9EZWxldGU6IE5VTEwgdHN0YXRlIik7CisgICAgaW50ZXJwID0gdHN0YXRlLT5pbnRlcnA7CisgICAgaWYgKGludGVycCA9PSBOVUxMKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJQeVRocmVhZFN0YXRlX0RlbGV0ZTogTlVMTCBpbnRlcnAiKTsKKyAgICBIRUFEX0xPQ0soKTsKKyAgICBmb3IgKHAgPSAmaW50ZXJwLT50c3RhdGVfaGVhZDsgOyBwID0gJigqcCktPm5leHQpIHsKKyAgICAgICAgaWYgKCpwID09IE5VTEwpCisgICAgICAgICAgICBQeV9GYXRhbEVycm9yKAorICAgICAgICAgICAgICAgICJQeVRocmVhZFN0YXRlX0RlbGV0ZTogaW52YWxpZCB0c3RhdGUiKTsKKyAgICAgICAgaWYgKCpwID09IHRzdGF0ZSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAvKiBTYW5pdHkgY2hlY2suICBUaGVzZSBzdGF0ZXMgc2hvdWxkIG5ldmVyIGhhcHBlbiBidXQgaWYKKyAgICAgICAgICogdGhleSBkbyB3ZSBtdXN0IGFib3J0LiAgT3RoZXJ3aXNlIHdlJ2xsIGVuZCB1cCBzcGlubmluZyBpbgorICAgICAgICAgKiBpbiBhIHRpZ2h0IGxvb3Agd2l0aCB0aGUgbG9jayBoZWxkLiAgQSBzaW1pbGFyIGNoZWNrIGlzIGRvbmUKKyAgICAgICAgICogaW4gdGhyZWFkLmMgZmluZF9rZXkoKS4gICovCisgICAgICAgIGlmICgqcCA9PSBwcmV2X3ApCisgICAgICAgICAgICBQeV9GYXRhbEVycm9yKAorICAgICAgICAgICAgICAgICJQeVRocmVhZFN0YXRlX0RlbGV0ZTogc21hbGwgY2lyY3VsYXIgbGlzdCghKSIKKyAgICAgICAgICAgICAgICAiIGFuZCB0c3RhdGUgbm90IGZvdW5kLiIpOworICAgICAgICBwcmV2X3AgPSAqcDsKKyAgICAgICAgaWYgKCgqcCktPm5leHQgPT0gaW50ZXJwLT50c3RhdGVfaGVhZCkKKyAgICAgICAgICAgIFB5X0ZhdGFsRXJyb3IoCisgICAgICAgICAgICAgICAgIlB5VGhyZWFkU3RhdGVfRGVsZXRlOiBjaXJjdWxhciBsaXN0KCEpIGFuZCIKKyAgICAgICAgICAgICAgICAiIHRzdGF0ZSBub3QgZm91bmQuIik7CisgICAgfQorICAgICpwID0gdHN0YXRlLT5uZXh0OworICAgIEhFQURfVU5MT0NLKCk7CisgICAgZnJlZSh0c3RhdGUpOwogfQogCiAKIHZvaWQKIFB5VGhyZWFkU3RhdGVfRGVsZXRlKFB5VGhyZWFkU3RhdGUgKnRzdGF0ZSkKIHsKLQlpZiAodHN0YXRlID09IF9QeVRocmVhZFN0YXRlX0N1cnJlbnQpCi0JCVB5X0ZhdGFsRXJyb3IoIlB5VGhyZWFkU3RhdGVfRGVsZXRlOiB0c3RhdGUgaXMgc3RpbGwgY3VycmVudCIpOwotCXRzdGF0ZV9kZWxldGVfY29tbW9uKHRzdGF0ZSk7CisgICAgaWYgKHRzdGF0ZSA9PSBfUHlUaHJlYWRTdGF0ZV9DdXJyZW50KQorICAgICAgICBQeV9GYXRhbEVycm9yKCJQeVRocmVhZFN0YXRlX0RlbGV0ZTogdHN0YXRlIGlzIHN0aWxsIGN1cnJlbnQiKTsKKyAgICB0c3RhdGVfZGVsZXRlX2NvbW1vbih0c3RhdGUpOwogI2lmZGVmIFdJVEhfVEhSRUFECi0JaWYgKGF1dG9UTFNrZXkgJiYgUHlUaHJlYWRfZ2V0X2tleV92YWx1ZShhdXRvVExTa2V5KSA9PSB0c3RhdGUpCi0JCVB5VGhyZWFkX2RlbGV0ZV9rZXlfdmFsdWUoYXV0b1RMU2tleSk7CisgICAgaWYgKGF1dG9UTFNrZXkgJiYgUHlUaHJlYWRfZ2V0X2tleV92YWx1ZShhdXRvVExTa2V5KSA9PSB0c3RhdGUpCisgICAgICAgIFB5VGhyZWFkX2RlbGV0ZV9rZXlfdmFsdWUoYXV0b1RMU2tleSk7CiAjZW5kaWYgLyogV0lUSF9USFJFQUQgKi8KIH0KIApAQCAtMzA4LDE1ICszMDgsMTUgQEAKIHZvaWQKIFB5VGhyZWFkU3RhdGVfRGVsZXRlQ3VycmVudCgpCiB7Ci0JUHlUaHJlYWRTdGF0ZSAqdHN0YXRlID0gX1B5VGhyZWFkU3RhdGVfQ3VycmVudDsKLQlpZiAodHN0YXRlID09IE5VTEwpCi0JCVB5X0ZhdGFsRXJyb3IoCi0JCQkiUHlUaHJlYWRTdGF0ZV9EZWxldGVDdXJyZW50OiBubyBjdXJyZW50IHRzdGF0ZSIpOwotCV9QeVRocmVhZFN0YXRlX0N1cnJlbnQgPSBOVUxMOwotCXRzdGF0ZV9kZWxldGVfY29tbW9uKHRzdGF0ZSk7Ci0JaWYgKGF1dG9UTFNrZXkgJiYgUHlUaHJlYWRfZ2V0X2tleV92YWx1ZShhdXRvVExTa2V5KSA9PSB0c3RhdGUpCi0JCVB5VGhyZWFkX2RlbGV0ZV9rZXlfdmFsdWUoYXV0b1RMU2tleSk7Ci0JUHlFdmFsX1JlbGVhc2VMb2NrKCk7CisgICAgUHlUaHJlYWRTdGF0ZSAqdHN0YXRlID0gX1B5VGhyZWFkU3RhdGVfQ3VycmVudDsKKyAgICBpZiAodHN0YXRlID09IE5VTEwpCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoCisgICAgICAgICAgICAiUHlUaHJlYWRTdGF0ZV9EZWxldGVDdXJyZW50OiBubyBjdXJyZW50IHRzdGF0ZSIpOworICAgIF9QeVRocmVhZFN0YXRlX0N1cnJlbnQgPSBOVUxMOworICAgIHRzdGF0ZV9kZWxldGVfY29tbW9uKHRzdGF0ZSk7CisgICAgaWYgKGF1dG9UTFNrZXkgJiYgUHlUaHJlYWRfZ2V0X2tleV92YWx1ZShhdXRvVExTa2V5KSA9PSB0c3RhdGUpCisgICAgICAgIFB5VGhyZWFkX2RlbGV0ZV9rZXlfdmFsdWUoYXV0b1RMU2tleSk7CisgICAgUHlFdmFsX1JlbGVhc2VMb2NrKCk7CiB9CiAjZW5kaWYgLyogV0lUSF9USFJFQUQgKi8KIApAQCAtMzI0LDM2ICszMjQsMzYgQEAKIFB5VGhyZWFkU3RhdGUgKgogUHlUaHJlYWRTdGF0ZV9HZXQodm9pZCkKIHsKLQlpZiAoX1B5VGhyZWFkU3RhdGVfQ3VycmVudCA9PSBOVUxMKQotCQlQeV9GYXRhbEVycm9yKCJQeVRocmVhZFN0YXRlX0dldDogbm8gY3VycmVudCB0aHJlYWQiKTsKKyAgICBpZiAoX1B5VGhyZWFkU3RhdGVfQ3VycmVudCA9PSBOVUxMKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJQeVRocmVhZFN0YXRlX0dldDogbm8gY3VycmVudCB0aHJlYWQiKTsKIAotCXJldHVybiBfUHlUaHJlYWRTdGF0ZV9DdXJyZW50OworICAgIHJldHVybiBfUHlUaHJlYWRTdGF0ZV9DdXJyZW50OwogfQogCiAKIFB5VGhyZWFkU3RhdGUgKgogUHlUaHJlYWRTdGF0ZV9Td2FwKFB5VGhyZWFkU3RhdGUgKm5ld3RzKQogewotCVB5VGhyZWFkU3RhdGUgKm9sZHRzID0gX1B5VGhyZWFkU3RhdGVfQ3VycmVudDsKKyAgICBQeVRocmVhZFN0YXRlICpvbGR0cyA9IF9QeVRocmVhZFN0YXRlX0N1cnJlbnQ7CiAKLQlfUHlUaHJlYWRTdGF0ZV9DdXJyZW50ID0gbmV3dHM7Ci0JLyogSXQgc2hvdWxkIG5vdCBiZSBwb3NzaWJsZSBmb3IgbW9yZSB0aGFuIG9uZSB0aHJlYWQgc3RhdGUKLQkgICB0byBiZSB1c2VkIGZvciBhIHRocmVhZC4gIENoZWNrIHRoaXMgdGhlIGJlc3Qgd2UgY2FuIGluIGRlYnVnCi0JICAgYnVpbGRzLgotCSovCisgICAgX1B5VGhyZWFkU3RhdGVfQ3VycmVudCA9IG5ld3RzOworICAgIC8qIEl0IHNob3VsZCBub3QgYmUgcG9zc2libGUgZm9yIG1vcmUgdGhhbiBvbmUgdGhyZWFkIHN0YXRlCisgICAgICAgdG8gYmUgdXNlZCBmb3IgYSB0aHJlYWQuICBDaGVjayB0aGlzIHRoZSBiZXN0IHdlIGNhbiBpbiBkZWJ1ZworICAgICAgIGJ1aWxkcy4KKyAgICAqLwogI2lmIGRlZmluZWQoUHlfREVCVUcpICYmIGRlZmluZWQoV0lUSF9USFJFQUQpCi0JaWYgKG5ld3RzKSB7Ci0JCS8qIFRoaXMgY2FuIGJlIGNhbGxlZCBmcm9tIFB5RXZhbF9SZXN0b3JlVGhyZWFkKCkuIFNpbWlsYXIKLQkJICAgdG8gaXQsIHdlIG5lZWQgdG8gZW5zdXJlIGVycm5vIGRvZXNuJ3QgY2hhbmdlLgotCQkqLwotCQlpbnQgZXJyID0gZXJybm87Ci0JCVB5VGhyZWFkU3RhdGUgKmNoZWNrID0gUHlHSUxTdGF0ZV9HZXRUaGlzVGhyZWFkU3RhdGUoKTsKLQkJaWYgKGNoZWNrICYmIGNoZWNrLT5pbnRlcnAgPT0gbmV3dHMtPmludGVycCAmJiBjaGVjayAhPSBuZXd0cykKLQkJCVB5X0ZhdGFsRXJyb3IoIkludmFsaWQgdGhyZWFkIHN0YXRlIGZvciB0aGlzIHRocmVhZCIpOwotCQllcnJubyA9IGVycjsKLQl9CisgICAgaWYgKG5ld3RzKSB7CisgICAgICAgIC8qIFRoaXMgY2FuIGJlIGNhbGxlZCBmcm9tIFB5RXZhbF9SZXN0b3JlVGhyZWFkKCkuIFNpbWlsYXIKKyAgICAgICAgICAgdG8gaXQsIHdlIG5lZWQgdG8gZW5zdXJlIGVycm5vIGRvZXNuJ3QgY2hhbmdlLgorICAgICAgICAqLworICAgICAgICBpbnQgZXJyID0gZXJybm87CisgICAgICAgIFB5VGhyZWFkU3RhdGUgKmNoZWNrID0gUHlHSUxTdGF0ZV9HZXRUaGlzVGhyZWFkU3RhdGUoKTsKKyAgICAgICAgaWYgKGNoZWNrICYmIGNoZWNrLT5pbnRlcnAgPT0gbmV3dHMtPmludGVycCAmJiBjaGVjayAhPSBuZXd0cykKKyAgICAgICAgICAgIFB5X0ZhdGFsRXJyb3IoIkludmFsaWQgdGhyZWFkIHN0YXRlIGZvciB0aGlzIHRocmVhZCIpOworICAgICAgICBlcnJubyA9IGVycjsKKyAgICB9CiAjZW5kaWYKLQlyZXR1cm4gb2xkdHM7CisgICAgcmV0dXJuIG9sZHRzOwogfQogCiAvKiBBbiBleHRlbnNpb24gbWVjaGFuaXNtIHRvIHN0b3JlIGFyYml0cmFyeSBhZGRpdGlvbmFsIHBlci10aHJlYWQgc3RhdGUuCkBAIC0zNjUsMTYgKzM2NSwxNiBAQAogUHlPYmplY3QgKgogUHlUaHJlYWRTdGF0ZV9HZXREaWN0KHZvaWQpCiB7Ci0JaWYgKF9QeVRocmVhZFN0YXRlX0N1cnJlbnQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKF9QeVRocmVhZFN0YXRlX0N1cnJlbnQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoX1B5VGhyZWFkU3RhdGVfQ3VycmVudC0+ZGljdCA9PSBOVUxMKSB7Ci0JCVB5T2JqZWN0ICpkOwotCQlfUHlUaHJlYWRTdGF0ZV9DdXJyZW50LT5kaWN0ID0gZCA9IFB5RGljdF9OZXcoKTsKLQkJaWYgKGQgPT0gTlVMTCkKLQkJCVB5RXJyX0NsZWFyKCk7Ci0JfQotCXJldHVybiBfUHlUaHJlYWRTdGF0ZV9DdXJyZW50LT5kaWN0OworICAgIGlmIChfUHlUaHJlYWRTdGF0ZV9DdXJyZW50LT5kaWN0ID09IE5VTEwpIHsKKyAgICAgICAgUHlPYmplY3QgKmQ7CisgICAgICAgIF9QeVRocmVhZFN0YXRlX0N1cnJlbnQtPmRpY3QgPSBkID0gUHlEaWN0X05ldygpOworICAgICAgICBpZiAoZCA9PSBOVUxMKQorICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICB9CisgICAgcmV0dXJuIF9QeVRocmVhZFN0YXRlX0N1cnJlbnQtPmRpY3Q7CiB9CiAKIApAQCAtMzg4LDM2ICszODgsMzYgQEAKIAogaW50CiBQeVRocmVhZFN0YXRlX1NldEFzeW5jRXhjKGxvbmcgaWQsIFB5T2JqZWN0ICpleGMpIHsKLQlQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dFVCgpOwotCVB5SW50ZXJwcmV0ZXJTdGF0ZSAqaW50ZXJwID0gdHN0YXRlLT5pbnRlcnA7Ci0JUHlUaHJlYWRTdGF0ZSAqcDsKKyAgICBQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dFVCgpOworICAgIFB5SW50ZXJwcmV0ZXJTdGF0ZSAqaW50ZXJwID0gdHN0YXRlLT5pbnRlcnA7CisgICAgUHlUaHJlYWRTdGF0ZSAqcDsKIAotCS8qIEFsdGhvdWdoIHRoZSBHSUwgaXMgaGVsZCwgYSBmZXcgQyBBUEkgZnVuY3Rpb25zIGNhbiBiZSBjYWxsZWQKLQkgKiB3aXRob3V0IHRoZSBHSUwgaGVsZCwgYW5kIGluIHBhcnRpY3VsYXIgc29tZSB0aGF0IGNyZWF0ZSBhbmQKLQkgKiBkZXN0cm95IHRocmVhZCBhbmQgaW50ZXJwcmV0ZXIgc3RhdGVzLiAgVGhvc2UgY2FuIG11dGF0ZSB0aGUKLQkgKiBsaXN0IG9mIHRocmVhZCBzdGF0ZXMgd2UncmUgdHJhdmVyc2luZywgc28gdG8gcHJldmVudCB0aGF0IHdlIGxvY2sKLQkgKiBoZWFkX211dGV4IGZvciB0aGUgZHVyYXRpb24uCi0JICovCi0JSEVBRF9MT0NLKCk7Ci0JZm9yIChwID0gaW50ZXJwLT50c3RhdGVfaGVhZDsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkgewotCQlpZiAocC0+dGhyZWFkX2lkID09IGlkKSB7Ci0JCQkvKiBUcmlja3k6ICB3ZSBuZWVkIHRvIGRlY3JlZiB0aGUgY3VycmVudCB2YWx1ZQotCQkJICogKGlmIGFueSkgaW4gcC0+YXN5bmNfZXhjLCBidXQgdGhhdCBjYW4gaW4gdHVybgotCQkJICogYWxsb3cgYXJiaXRyYXJ5IFB5dGhvbiBjb2RlIHRvIHJ1biwgaW5jbHVkaW5nCi0JCQkgKiBwZXJoYXBzIGNhbGxzIHRvIHRoaXMgZnVuY3Rpb24uICBUbyBwcmV2ZW50Ci0JCQkgKiBkZWFkbG9jaywgd2UgbmVlZCB0byByZWxlYXNlIGhlYWRfbXV0ZXggYmVmb3JlCi0JCQkgKiB0aGUgZGVjcmVmLgotCQkJICovCi0JCQlQeU9iamVjdCAqb2xkX2V4YyA9IHAtPmFzeW5jX2V4YzsKLQkJCVB5X1hJTkNSRUYoZXhjKTsKLQkJCXAtPmFzeW5jX2V4YyA9IGV4YzsKLQkJCUhFQURfVU5MT0NLKCk7Ci0JCQlQeV9YREVDUkVGKG9sZF9leGMpOwotCQkJcmV0dXJuIDE7Ci0JCX0KLQl9Ci0JSEVBRF9VTkxPQ0soKTsKLQlyZXR1cm4gMDsKKyAgICAvKiBBbHRob3VnaCB0aGUgR0lMIGlzIGhlbGQsIGEgZmV3IEMgQVBJIGZ1bmN0aW9ucyBjYW4gYmUgY2FsbGVkCisgICAgICogd2l0aG91dCB0aGUgR0lMIGhlbGQsIGFuZCBpbiBwYXJ0aWN1bGFyIHNvbWUgdGhhdCBjcmVhdGUgYW5kCisgICAgICogZGVzdHJveSB0aHJlYWQgYW5kIGludGVycHJldGVyIHN0YXRlcy4gIFRob3NlIGNhbiBtdXRhdGUgdGhlCisgICAgICogbGlzdCBvZiB0aHJlYWQgc3RhdGVzIHdlJ3JlIHRyYXZlcnNpbmcsIHNvIHRvIHByZXZlbnQgdGhhdCB3ZSBsb2NrCisgICAgICogaGVhZF9tdXRleCBmb3IgdGhlIGR1cmF0aW9uLgorICAgICAqLworICAgIEhFQURfTE9DSygpOworICAgIGZvciAocCA9IGludGVycC0+dHN0YXRlX2hlYWQ7IHAgIT0gTlVMTDsgcCA9IHAtPm5leHQpIHsKKyAgICAgICAgaWYgKHAtPnRocmVhZF9pZCA9PSBpZCkgeworICAgICAgICAgICAgLyogVHJpY2t5OiAgd2UgbmVlZCB0byBkZWNyZWYgdGhlIGN1cnJlbnQgdmFsdWUKKyAgICAgICAgICAgICAqIChpZiBhbnkpIGluIHAtPmFzeW5jX2V4YywgYnV0IHRoYXQgY2FuIGluIHR1cm4KKyAgICAgICAgICAgICAqIGFsbG93IGFyYml0cmFyeSBQeXRob24gY29kZSB0byBydW4sIGluY2x1ZGluZworICAgICAgICAgICAgICogcGVyaGFwcyBjYWxscyB0byB0aGlzIGZ1bmN0aW9uLiAgVG8gcHJldmVudAorICAgICAgICAgICAgICogZGVhZGxvY2ssIHdlIG5lZWQgdG8gcmVsZWFzZSBoZWFkX211dGV4IGJlZm9yZQorICAgICAgICAgICAgICogdGhlIGRlY3JlZi4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgUHlPYmplY3QgKm9sZF9leGMgPSBwLT5hc3luY19leGM7CisgICAgICAgICAgICBQeV9YSU5DUkVGKGV4Yyk7CisgICAgICAgICAgICBwLT5hc3luY19leGMgPSBleGM7CisgICAgICAgICAgICBIRUFEX1VOTE9DSygpOworICAgICAgICAgICAgUHlfWERFQ1JFRihvbGRfZXhjKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgfQorICAgIEhFQURfVU5MT0NLKCk7CisgICAgcmV0dXJuIDA7CiB9CiAKIApAQCAtNDI3LDIyICs0MjcsMjIgQEAKIFB5SW50ZXJwcmV0ZXJTdGF0ZSAqCiBQeUludGVycHJldGVyU3RhdGVfSGVhZCh2b2lkKQogewotCXJldHVybiBpbnRlcnBfaGVhZDsKKyAgICByZXR1cm4gaW50ZXJwX2hlYWQ7CiB9CiAKIFB5SW50ZXJwcmV0ZXJTdGF0ZSAqCiBQeUludGVycHJldGVyU3RhdGVfTmV4dChQeUludGVycHJldGVyU3RhdGUgKmludGVycCkgewotCXJldHVybiBpbnRlcnAtPm5leHQ7CisgICAgcmV0dXJuIGludGVycC0+bmV4dDsKIH0KIAogUHlUaHJlYWRTdGF0ZSAqCiBQeUludGVycHJldGVyU3RhdGVfVGhyZWFkSGVhZChQeUludGVycHJldGVyU3RhdGUgKmludGVycCkgewotCXJldHVybiBpbnRlcnAtPnRzdGF0ZV9oZWFkOworICAgIHJldHVybiBpbnRlcnAtPnRzdGF0ZV9oZWFkOwogfQogCiBQeVRocmVhZFN0YXRlICoKIFB5VGhyZWFkU3RhdGVfTmV4dChQeVRocmVhZFN0YXRlICp0c3RhdGUpIHsKLQlyZXR1cm4gdHN0YXRlLT5uZXh0OworICAgIHJldHVybiB0c3RhdGUtPm5leHQ7CiB9CiAKIC8qIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiBzeXMuX2N1cnJlbnRfZnJhbWVzKCkuICBUaGlzIGlzIGludGVuZGVkIHRvIGJlCkBAIC00NTMsNDQgKzQ1Myw0NCBAQAogUHlPYmplY3QgKgogX1B5VGhyZWFkX0N1cnJlbnRGcmFtZXModm9pZCkKIHsKLQlQeU9iamVjdCAqcmVzdWx0OwotCVB5SW50ZXJwcmV0ZXJTdGF0ZSAqaTsKKyAgICBQeU9iamVjdCAqcmVzdWx0OworICAgIFB5SW50ZXJwcmV0ZXJTdGF0ZSAqaTsKIAotCXJlc3VsdCA9IFB5RGljdF9OZXcoKTsKLQlpZiAocmVzdWx0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIHJlc3VsdCA9IFB5RGljdF9OZXcoKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JLyogZm9yIGkgaW4gYWxsIGludGVycHJldGVyczoKLQkgKiAgICAgZm9yIHQgaW4gYWxsIG9mIGkncyB0aHJlYWQgc3RhdGVzOgotCSAqICAgICAgICAgIGlmIHQncyBmcmFtZSBpc24ndCBOVUxMLCBtYXAgdCdzIGlkIHRvIGl0cyBmcmFtZQotCSAqIEJlY2F1c2UgdGhlc2UgbGlzdHMgY2FuIG11dHV0ZSBldmVuIHdoZW4gdGhlIEdJTCBpcyBoZWxkLCB3ZQotCSAqIG5lZWQgdG8gZ3JhYiBoZWFkX211dGV4IGZvciB0aGUgZHVyYXRpb24uCi0JICovCi0JSEVBRF9MT0NLKCk7Ci0JZm9yIChpID0gaW50ZXJwX2hlYWQ7IGkgIT0gTlVMTDsgaSA9IGktPm5leHQpIHsKLQkJUHlUaHJlYWRTdGF0ZSAqdDsKLQkJZm9yICh0ID0gaS0+dHN0YXRlX2hlYWQ7IHQgIT0gTlVMTDsgdCA9IHQtPm5leHQpIHsKLQkJCVB5T2JqZWN0ICppZDsKLQkJCWludCBzdGF0OwotCQkJc3RydWN0IF9mcmFtZSAqZnJhbWUgPSB0LT5mcmFtZTsKLQkJCWlmIChmcmFtZSA9PSBOVUxMKQotCQkJCWNvbnRpbnVlOwotCQkJaWQgPSBQeUludF9Gcm9tTG9uZyh0LT50aHJlYWRfaWQpOwotCQkJaWYgKGlkID09IE5VTEwpCi0JCQkJZ290byBGYWlsOwotCQkJc3RhdCA9IFB5RGljdF9TZXRJdGVtKHJlc3VsdCwgaWQsIChQeU9iamVjdCAqKWZyYW1lKTsKLQkJCVB5X0RFQ1JFRihpZCk7Ci0JCQlpZiAoc3RhdCA8IDApCi0JCQkJZ290byBGYWlsOwotCQl9Ci0JfQotCUhFQURfVU5MT0NLKCk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICAvKiBmb3IgaSBpbiBhbGwgaW50ZXJwcmV0ZXJzOgorICAgICAqICAgICBmb3IgdCBpbiBhbGwgb2YgaSdzIHRocmVhZCBzdGF0ZXM6CisgICAgICogICAgICAgICAgaWYgdCdzIGZyYW1lIGlzbid0IE5VTEwsIG1hcCB0J3MgaWQgdG8gaXRzIGZyYW1lCisgICAgICogQmVjYXVzZSB0aGVzZSBsaXN0cyBjYW4gbXV0dXRlIGV2ZW4gd2hlbiB0aGUgR0lMIGlzIGhlbGQsIHdlCisgICAgICogbmVlZCB0byBncmFiIGhlYWRfbXV0ZXggZm9yIHRoZSBkdXJhdGlvbi4KKyAgICAgKi8KKyAgICBIRUFEX0xPQ0soKTsKKyAgICBmb3IgKGkgPSBpbnRlcnBfaGVhZDsgaSAhPSBOVUxMOyBpID0gaS0+bmV4dCkgeworICAgICAgICBQeVRocmVhZFN0YXRlICp0OworICAgICAgICBmb3IgKHQgPSBpLT50c3RhdGVfaGVhZDsgdCAhPSBOVUxMOyB0ID0gdC0+bmV4dCkgeworICAgICAgICAgICAgUHlPYmplY3QgKmlkOworICAgICAgICAgICAgaW50IHN0YXQ7CisgICAgICAgICAgICBzdHJ1Y3QgX2ZyYW1lICpmcmFtZSA9IHQtPmZyYW1lOworICAgICAgICAgICAgaWYgKGZyYW1lID09IE5VTEwpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBpZCA9IFB5SW50X0Zyb21Mb25nKHQtPnRocmVhZF9pZCk7CisgICAgICAgICAgICBpZiAoaWQgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBnb3RvIEZhaWw7CisgICAgICAgICAgICBzdGF0ID0gUHlEaWN0X1NldEl0ZW0ocmVzdWx0LCBpZCwgKFB5T2JqZWN0ICopZnJhbWUpOworICAgICAgICAgICAgUHlfREVDUkVGKGlkKTsKKyAgICAgICAgICAgIGlmIChzdGF0IDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIEZhaWw7CisgICAgICAgIH0KKyAgICB9CisgICAgSEVBRF9VTkxPQ0soKTsKKyAgICByZXR1cm4gcmVzdWx0OwogCiAgRmFpbDoKLSAJSEVBRF9VTkxPQ0soKTsKLSAJUHlfREVDUkVGKHJlc3VsdCk7Ci0gCXJldHVybiBOVUxMOworICAgIEhFQURfVU5MT0NLKCk7CisgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIC8qIFB5dGhvbiAiYXV0byB0aHJlYWQgc3RhdGUiIEFQSS4gKi8KQEAgLTUwNywxMiArNTA3LDEyIEBACiBzdGF0aWMgaW50CiBQeVRocmVhZFN0YXRlX0lzQ3VycmVudChQeVRocmVhZFN0YXRlICp0c3RhdGUpCiB7Ci0JLyogTXVzdCBiZSB0aGUgdHN0YXRlIGZvciB0aGlzIHRocmVhZCAqLwotCWFzc2VydChQeUdJTFN0YXRlX0dldFRoaXNUaHJlYWRTdGF0ZSgpPT10c3RhdGUpOwotCS8qIE9uIFdpbmRvd3MgYXQgbGVhc3QsIHNpbXBsZSByZWFkcyBhbmQgd3JpdGVzIHRvIDMyIGJpdCB2YWx1ZXMKLQkgICBhcmUgYXRvbWljLgotCSovCi0JcmV0dXJuIHRzdGF0ZSA9PSBfUHlUaHJlYWRTdGF0ZV9DdXJyZW50OworICAgIC8qIE11c3QgYmUgdGhlIHRzdGF0ZSBmb3IgdGhpcyB0aHJlYWQgKi8KKyAgICBhc3NlcnQoUHlHSUxTdGF0ZV9HZXRUaGlzVGhyZWFkU3RhdGUoKT09dHN0YXRlKTsKKyAgICAvKiBPbiBXaW5kb3dzIGF0IGxlYXN0LCBzaW1wbGUgcmVhZHMgYW5kIHdyaXRlcyB0byAzMiBiaXQgdmFsdWVzCisgICAgICAgYXJlIGF0b21pYy4KKyAgICAqLworICAgIHJldHVybiB0c3RhdGUgPT0gX1B5VGhyZWFkU3RhdGVfQ3VycmVudDsKIH0KIAogLyogSW50ZXJuYWwgaW5pdGlhbGl6YXRpb24vZmluYWxpemF0aW9uIGZ1bmN0aW9ucyBjYWxsZWQgYnkKQEAgLTUyMSwyMSArNTIxLDIxIEBACiB2b2lkCiBfUHlHSUxTdGF0ZV9Jbml0KFB5SW50ZXJwcmV0ZXJTdGF0ZSAqaSwgUHlUaHJlYWRTdGF0ZSAqdCkKIHsKLQlhc3NlcnQoaSAmJiB0KTsgLyogbXVzdCBpbml0IHdpdGggdmFsaWQgc3RhdGVzICovCi0JYXV0b1RMU2tleSA9IFB5VGhyZWFkX2NyZWF0ZV9rZXkoKTsKLQlhdXRvSW50ZXJwcmV0ZXJTdGF0ZSA9IGk7Ci0JYXNzZXJ0KFB5VGhyZWFkX2dldF9rZXlfdmFsdWUoYXV0b1RMU2tleSkgPT0gTlVMTCk7Ci0JYXNzZXJ0KHQtPmdpbHN0YXRlX2NvdW50ZXIgPT0gMCk7CisgICAgYXNzZXJ0KGkgJiYgdCk7IC8qIG11c3QgaW5pdCB3aXRoIHZhbGlkIHN0YXRlcyAqLworICAgIGF1dG9UTFNrZXkgPSBQeVRocmVhZF9jcmVhdGVfa2V5KCk7CisgICAgYXV0b0ludGVycHJldGVyU3RhdGUgPSBpOworICAgIGFzc2VydChQeVRocmVhZF9nZXRfa2V5X3ZhbHVlKGF1dG9UTFNrZXkpID09IE5VTEwpOworICAgIGFzc2VydCh0LT5naWxzdGF0ZV9jb3VudGVyID09IDApOwogCi0JX1B5R0lMU3RhdGVfTm90ZVRocmVhZFN0YXRlKHQpOworICAgIF9QeUdJTFN0YXRlX05vdGVUaHJlYWRTdGF0ZSh0KTsKIH0KIAogdm9pZAogX1B5R0lMU3RhdGVfRmluaSh2b2lkKQogewotCVB5VGhyZWFkX2RlbGV0ZV9rZXkoYXV0b1RMU2tleSk7Ci0JYXV0b1RMU2tleSA9IDA7Ci0JYXV0b0ludGVycHJldGVyU3RhdGUgPSBOVUxMOworICAgIFB5VGhyZWFkX2RlbGV0ZV9rZXkoYXV0b1RMU2tleSk7CisgICAgYXV0b1RMU2tleSA9IDA7CisgICAgYXV0b0ludGVycHJldGVyU3RhdGUgPSBOVUxMOwogfQogCiAvKiBXaGVuIGEgdGhyZWFkIHN0YXRlIGlzIGNyZWF0ZWQgZm9yIGEgdGhyZWFkIGJ5IHNvbWUgbWVjaGFuaXNtIG90aGVyIHRoYW4KQEAgLTU0NiwxMTMgKzU0NiwxMTMgQEAKIHN0YXRpYyB2b2lkCiBfUHlHSUxTdGF0ZV9Ob3RlVGhyZWFkU3RhdGUoUHlUaHJlYWRTdGF0ZSogdHN0YXRlKQogewotCS8qIElmIGF1dG9UTFNrZXkgaXMgMCwgdGhpcyBtdXN0IGJlIHRoZSB2ZXJ5IGZpcnN0IHRocmVhZHN0YXRlIGNyZWF0ZWQKLQkgICBpbiBQeV9Jbml0aWFsaXplKCkuICBEb24ndCBkbyBhbnl0aGluZyBmb3Igbm93ICh3ZSdsbCBiZSBiYWNrIGhlcmUKLQkgICB3aGVuIF9QeUdJTFN0YXRlX0luaXQgaXMgY2FsbGVkKS4gKi8KLQlpZiAoIWF1dG9UTFNrZXkpCi0JCXJldHVybjsKKyAgICAvKiBJZiBhdXRvVExTa2V5IGlzIDAsIHRoaXMgbXVzdCBiZSB0aGUgdmVyeSBmaXJzdCB0aHJlYWRzdGF0ZSBjcmVhdGVkCisgICAgICAgaW4gUHlfSW5pdGlhbGl6ZSgpLiAgRG9uJ3QgZG8gYW55dGhpbmcgZm9yIG5vdyAod2UnbGwgYmUgYmFjayBoZXJlCisgICAgICAgd2hlbiBfUHlHSUxTdGF0ZV9Jbml0IGlzIGNhbGxlZCkuICovCisgICAgaWYgKCFhdXRvVExTa2V5KQorICAgICAgICByZXR1cm47CiAKLQkvKiBTdGljayB0aGUgdGhyZWFkIHN0YXRlIGZvciB0aGlzIHRocmVhZCBpbiB0aHJlYWQgbG9jYWwgc3RvcmFnZS4KKyAgICAvKiBTdGljayB0aGUgdGhyZWFkIHN0YXRlIGZvciB0aGlzIHRocmVhZCBpbiB0aHJlYWQgbG9jYWwgc3RvcmFnZS4KIAotCSAgIFRoZSBvbmx5IHNpdHVhdGlvbiB3aGVyZSB5b3UgY2FuIGxlZ2l0aW1hdGVseSBoYXZlIG1vcmUgdGhhbiBvbmUKLQkgICB0aHJlYWQgc3RhdGUgZm9yIGFuIE9TIGxldmVsIHRocmVhZCBpcyB3aGVuIHRoZXJlIGFyZSBtdWx0aXBsZQotCSAgIGludGVycHJldGVycywgd2hlbjoKKyAgICAgICBUaGUgb25seSBzaXR1YXRpb24gd2hlcmUgeW91IGNhbiBsZWdpdGltYXRlbHkgaGF2ZSBtb3JlIHRoYW4gb25lCisgICAgICAgdGhyZWFkIHN0YXRlIGZvciBhbiBPUyBsZXZlbCB0aHJlYWQgaXMgd2hlbiB0aGVyZSBhcmUgbXVsdGlwbGUKKyAgICAgICBpbnRlcnByZXRlcnMsIHdoZW46CiAKLQkgICAgICAgYSkgWW91IHNob3VsZG4ndCByZWFsbHkgYmUgdXNpbmcgdGhlIFB5R0lMU3RhdGVfIEFQSXMgYW55d2F5LAotCSAgICAgICAgICBhbmQ6CisgICAgICAgICAgIGEpIFlvdSBzaG91bGRuJ3QgcmVhbGx5IGJlIHVzaW5nIHRoZSBQeUdJTFN0YXRlXyBBUElzIGFueXdheSwKKyAgICAgICAgICBhbmQ6CiAKLQkgICAgICAgYikgVGhlIHNsaWdodGx5IG9kZCB3YXkgUHlUaHJlYWRfc2V0X2tleV92YWx1ZSB3b3JrcyAoc2VlCi0JICAgICAgICAgIGNvbW1lbnRzIGJ5IGl0cyBpbXBsZW1lbnRhdGlvbikgbWVhbnMgdGhhdCB0aGUgZmlyc3QgdGhyZWFkCi0JICAgICAgICAgIHN0YXRlIGNyZWF0ZWQgZm9yIHRoYXQgZ2l2ZW4gT1MgbGV2ZWwgdGhyZWFkIHdpbGwgIndpbiIsCi0JICAgICAgICAgIHdoaWNoIHNlZW1zIHJlYXNvbmFibGUgYmVoYXZpb3VyLgotCSovCi0JaWYgKFB5VGhyZWFkX3NldF9rZXlfdmFsdWUoYXV0b1RMU2tleSwgKHZvaWQgKil0c3RhdGUpIDwgMCkKLQkJUHlfRmF0YWxFcnJvcigiQ291bGRuJ3QgY3JlYXRlIGF1dG9UTFNrZXkgbWFwcGluZyIpOworICAgICAgICAgICBiKSBUaGUgc2xpZ2h0bHkgb2RkIHdheSBQeVRocmVhZF9zZXRfa2V5X3ZhbHVlIHdvcmtzIChzZWUKKyAgICAgICAgICBjb21tZW50cyBieSBpdHMgaW1wbGVtZW50YXRpb24pIG1lYW5zIHRoYXQgdGhlIGZpcnN0IHRocmVhZAorICAgICAgICAgIHN0YXRlIGNyZWF0ZWQgZm9yIHRoYXQgZ2l2ZW4gT1MgbGV2ZWwgdGhyZWFkIHdpbGwgIndpbiIsCisgICAgICAgICAgd2hpY2ggc2VlbXMgcmVhc29uYWJsZSBiZWhhdmlvdXIuCisgICAgKi8KKyAgICBpZiAoUHlUaHJlYWRfc2V0X2tleV92YWx1ZShhdXRvVExTa2V5LCAodm9pZCAqKXRzdGF0ZSkgPCAwKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJDb3VsZG4ndCBjcmVhdGUgYXV0b1RMU2tleSBtYXBwaW5nIik7CiAKLQkvKiBQeUdJTFN0YXRlX1JlbGVhc2UgbXVzdCBub3QgdHJ5IHRvIGRlbGV0ZSB0aGlzIHRocmVhZCBzdGF0ZS4gKi8KLQl0c3RhdGUtPmdpbHN0YXRlX2NvdW50ZXIgPSAxOworICAgIC8qIFB5R0lMU3RhdGVfUmVsZWFzZSBtdXN0IG5vdCB0cnkgdG8gZGVsZXRlIHRoaXMgdGhyZWFkIHN0YXRlLiAqLworICAgIHRzdGF0ZS0+Z2lsc3RhdGVfY291bnRlciA9IDE7CiB9CiAKIC8qIFRoZSBwdWJsaWMgZnVuY3Rpb25zICovCiBQeVRocmVhZFN0YXRlICoKIFB5R0lMU3RhdGVfR2V0VGhpc1RocmVhZFN0YXRlKHZvaWQpCiB7Ci0JaWYgKGF1dG9JbnRlcnByZXRlclN0YXRlID09IE5VTEwgfHwgYXV0b1RMU2tleSA9PSAwKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gKFB5VGhyZWFkU3RhdGUgKilQeVRocmVhZF9nZXRfa2V5X3ZhbHVlKGF1dG9UTFNrZXkpOworICAgIGlmIChhdXRvSW50ZXJwcmV0ZXJTdGF0ZSA9PSBOVUxMIHx8IGF1dG9UTFNrZXkgPT0gMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIChQeVRocmVhZFN0YXRlICopUHlUaHJlYWRfZ2V0X2tleV92YWx1ZShhdXRvVExTa2V5KTsKIH0KIAogUHlHSUxTdGF0ZV9TVEFURQogUHlHSUxTdGF0ZV9FbnN1cmUodm9pZCkKIHsKLQlpbnQgY3VycmVudDsKLQlQeVRocmVhZFN0YXRlICp0Y3VyOwotCS8qIE5vdGUgdGhhdCB3ZSBkbyBub3QgYXV0by1pbml0IFB5dGhvbiBoZXJlIC0gYXBhcnQgZnJvbQotCSAgIHBvdGVudGlhbCByYWNlcyB3aXRoIDIgdGhyZWFkcyBhdXRvLWluaXRpYWxpemluZywgcGVwLTMxMQotCSAgIHNwZWxscyBvdXQgb3RoZXIgaXNzdWVzLiAgRW1iZWRkZXJzIGFyZSBleHBlY3RlZCB0byBoYXZlCi0JICAgY2FsbGVkIFB5X0luaXRpYWxpemUoKSBhbmQgdXN1YWxseSBQeUV2YWxfSW5pdFRocmVhZHMoKS4KLQkqLwotCWFzc2VydChhdXRvSW50ZXJwcmV0ZXJTdGF0ZSk7IC8qIFB5X0luaXRpYWxpemUoKSBoYXNuJ3QgYmVlbiBjYWxsZWQhICovCi0JdGN1ciA9IChQeVRocmVhZFN0YXRlICopUHlUaHJlYWRfZ2V0X2tleV92YWx1ZShhdXRvVExTa2V5KTsKLQlpZiAodGN1ciA9PSBOVUxMKSB7Ci0JCS8qIENyZWF0ZSBhIG5ldyB0aHJlYWQgc3RhdGUgZm9yIHRoaXMgdGhyZWFkICovCi0JCXRjdXIgPSBQeVRocmVhZFN0YXRlX05ldyhhdXRvSW50ZXJwcmV0ZXJTdGF0ZSk7Ci0JCWlmICh0Y3VyID09IE5VTEwpCi0JCQlQeV9GYXRhbEVycm9yKCJDb3VsZG4ndCBjcmVhdGUgdGhyZWFkLXN0YXRlIGZvciBuZXcgdGhyZWFkIik7Ci0JCS8qIFRoaXMgaXMgb3VyIHRocmVhZCBzdGF0ZSEgIFdlJ2xsIG5lZWQgdG8gZGVsZXRlIGl0IGluIHRoZQotCQkgICBtYXRjaGluZyBjYWxsIHRvIFB5R0lMU3RhdGVfUmVsZWFzZSgpLiAqLwotCQl0Y3VyLT5naWxzdGF0ZV9jb3VudGVyID0gMDsKLQkJY3VycmVudCA9IDA7IC8qIG5ldyB0aHJlYWQgc3RhdGUgaXMgbmV2ZXIgY3VycmVudCAqLwotCX0KLQllbHNlCi0JCWN1cnJlbnQgPSBQeVRocmVhZFN0YXRlX0lzQ3VycmVudCh0Y3VyKTsKLQlpZiAoY3VycmVudCA9PSAwKQotCQlQeUV2YWxfUmVzdG9yZVRocmVhZCh0Y3VyKTsKLQkvKiBVcGRhdGUgb3VyIGNvdW50ZXIgaW4gdGhlIHRocmVhZC1zdGF0ZSAtIG5vIG5lZWQgZm9yIGxvY2tzOgotCSAgIC0gdGN1ciB3aWxsIHJlbWFpbiB2YWxpZCBhcyB3ZSBob2xkIHRoZSBHSUwuCi0JICAgLSB0aGUgY291bnRlciBpcyBzYWZlIGFzIHdlIGFyZSB0aGUgb25seSB0aHJlYWQgImFsbG93ZWQiCi0JICAgICB0byBtb2RpZnkgdGhpcyB2YWx1ZQotCSovCi0JKyt0Y3VyLT5naWxzdGF0ZV9jb3VudGVyOwotCXJldHVybiBjdXJyZW50ID8gUHlHSUxTdGF0ZV9MT0NLRUQgOiBQeUdJTFN0YXRlX1VOTE9DS0VEOworICAgIGludCBjdXJyZW50OworICAgIFB5VGhyZWFkU3RhdGUgKnRjdXI7CisgICAgLyogTm90ZSB0aGF0IHdlIGRvIG5vdCBhdXRvLWluaXQgUHl0aG9uIGhlcmUgLSBhcGFydCBmcm9tCisgICAgICAgcG90ZW50aWFsIHJhY2VzIHdpdGggMiB0aHJlYWRzIGF1dG8taW5pdGlhbGl6aW5nLCBwZXAtMzExCisgICAgICAgc3BlbGxzIG91dCBvdGhlciBpc3N1ZXMuICBFbWJlZGRlcnMgYXJlIGV4cGVjdGVkIHRvIGhhdmUKKyAgICAgICBjYWxsZWQgUHlfSW5pdGlhbGl6ZSgpIGFuZCB1c3VhbGx5IFB5RXZhbF9Jbml0VGhyZWFkcygpLgorICAgICovCisgICAgYXNzZXJ0KGF1dG9JbnRlcnByZXRlclN0YXRlKTsgLyogUHlfSW5pdGlhbGl6ZSgpIGhhc24ndCBiZWVuIGNhbGxlZCEgKi8KKyAgICB0Y3VyID0gKFB5VGhyZWFkU3RhdGUgKilQeVRocmVhZF9nZXRfa2V5X3ZhbHVlKGF1dG9UTFNrZXkpOworICAgIGlmICh0Y3VyID09IE5VTEwpIHsKKyAgICAgICAgLyogQ3JlYXRlIGEgbmV3IHRocmVhZCBzdGF0ZSBmb3IgdGhpcyB0aHJlYWQgKi8KKyAgICAgICAgdGN1ciA9IFB5VGhyZWFkU3RhdGVfTmV3KGF1dG9JbnRlcnByZXRlclN0YXRlKTsKKyAgICAgICAgaWYgKHRjdXIgPT0gTlVMTCkKKyAgICAgICAgICAgIFB5X0ZhdGFsRXJyb3IoIkNvdWxkbid0IGNyZWF0ZSB0aHJlYWQtc3RhdGUgZm9yIG5ldyB0aHJlYWQiKTsKKyAgICAgICAgLyogVGhpcyBpcyBvdXIgdGhyZWFkIHN0YXRlISAgV2UnbGwgbmVlZCB0byBkZWxldGUgaXQgaW4gdGhlCisgICAgICAgICAgIG1hdGNoaW5nIGNhbGwgdG8gUHlHSUxTdGF0ZV9SZWxlYXNlKCkuICovCisgICAgICAgIHRjdXItPmdpbHN0YXRlX2NvdW50ZXIgPSAwOworICAgICAgICBjdXJyZW50ID0gMDsgLyogbmV3IHRocmVhZCBzdGF0ZSBpcyBuZXZlciBjdXJyZW50ICovCisgICAgfQorICAgIGVsc2UKKyAgICAgICAgY3VycmVudCA9IFB5VGhyZWFkU3RhdGVfSXNDdXJyZW50KHRjdXIpOworICAgIGlmIChjdXJyZW50ID09IDApCisgICAgICAgIFB5RXZhbF9SZXN0b3JlVGhyZWFkKHRjdXIpOworICAgIC8qIFVwZGF0ZSBvdXIgY291bnRlciBpbiB0aGUgdGhyZWFkLXN0YXRlIC0gbm8gbmVlZCBmb3IgbG9ja3M6CisgICAgICAgLSB0Y3VyIHdpbGwgcmVtYWluIHZhbGlkIGFzIHdlIGhvbGQgdGhlIEdJTC4KKyAgICAgICAtIHRoZSBjb3VudGVyIGlzIHNhZmUgYXMgd2UgYXJlIHRoZSBvbmx5IHRocmVhZCAiYWxsb3dlZCIKKyAgICAgICAgIHRvIG1vZGlmeSB0aGlzIHZhbHVlCisgICAgKi8KKyAgICArK3RjdXItPmdpbHN0YXRlX2NvdW50ZXI7CisgICAgcmV0dXJuIGN1cnJlbnQgPyBQeUdJTFN0YXRlX0xPQ0tFRCA6IFB5R0lMU3RhdGVfVU5MT0NLRUQ7CiB9CiAKIHZvaWQKIFB5R0lMU3RhdGVfUmVsZWFzZShQeUdJTFN0YXRlX1NUQVRFIG9sZHN0YXRlKQogewotCVB5VGhyZWFkU3RhdGUgKnRjdXIgPSAoUHlUaHJlYWRTdGF0ZSAqKVB5VGhyZWFkX2dldF9rZXlfdmFsdWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b1RMU2tleSk7Ci0JaWYgKHRjdXIgPT0gTlVMTCkKLQkJUHlfRmF0YWxFcnJvcigiYXV0by1yZWxlYXNpbmcgdGhyZWFkLXN0YXRlLCAiCi0JCSAgICAgICAgICAgICAgImJ1dCBubyB0aHJlYWQtc3RhdGUgZm9yIHRoaXMgdGhyZWFkIik7Ci0JLyogV2UgbXVzdCBob2xkIHRoZSBHSUwgYW5kIGhhdmUgb3VyIHRocmVhZCBzdGF0ZSBjdXJyZW50ICovCi0JLyogWFhYIC0gcmVtb3ZlIHRoZSBjaGVjayAtIHRoZSBhc3NlcnQgc2hvdWxkIGJlIGZpbmUsCi0JICAgYnV0IHdoaWxlIHRoaXMgaXMgdmVyeSBuZXcgKEFwcmlsIDIwMDMpLCB0aGUgZXh0cmEgY2hlY2sKLQkgICBieSByZWxlYXNlLW9ubHkgdXNlcnMgY2FuJ3QgaHVydC4KLQkqLwotCWlmICghIFB5VGhyZWFkU3RhdGVfSXNDdXJyZW50KHRjdXIpKQotCQlQeV9GYXRhbEVycm9yKCJUaGlzIHRocmVhZCBzdGF0ZSBtdXN0IGJlIGN1cnJlbnQgd2hlbiByZWxlYXNpbmciKTsKLQlhc3NlcnQoUHlUaHJlYWRTdGF0ZV9Jc0N1cnJlbnQodGN1cikpOwotCS0tdGN1ci0+Z2lsc3RhdGVfY291bnRlcjsKLQlhc3NlcnQodGN1ci0+Z2lsc3RhdGVfY291bnRlciA+PSAwKTsgLyogaWxsZWdhbCBjb3VudGVyIHZhbHVlICovCisgICAgUHlUaHJlYWRTdGF0ZSAqdGN1ciA9IChQeVRocmVhZFN0YXRlICopUHlUaHJlYWRfZ2V0X2tleV92YWx1ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9UTFNrZXkpOworICAgIGlmICh0Y3VyID09IE5VTEwpCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoImF1dG8tcmVsZWFzaW5nIHRocmVhZC1zdGF0ZSwgIgorICAgICAgICAgICAgICAgICAgICAgICJidXQgbm8gdGhyZWFkLXN0YXRlIGZvciB0aGlzIHRocmVhZCIpOworICAgIC8qIFdlIG11c3QgaG9sZCB0aGUgR0lMIGFuZCBoYXZlIG91ciB0aHJlYWQgc3RhdGUgY3VycmVudCAqLworICAgIC8qIFhYWCAtIHJlbW92ZSB0aGUgY2hlY2sgLSB0aGUgYXNzZXJ0IHNob3VsZCBiZSBmaW5lLAorICAgICAgIGJ1dCB3aGlsZSB0aGlzIGlzIHZlcnkgbmV3IChBcHJpbCAyMDAzKSwgdGhlIGV4dHJhIGNoZWNrCisgICAgICAgYnkgcmVsZWFzZS1vbmx5IHVzZXJzIGNhbid0IGh1cnQuCisgICAgKi8KKyAgICBpZiAoISBQeVRocmVhZFN0YXRlX0lzQ3VycmVudCh0Y3VyKSkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiVGhpcyB0aHJlYWQgc3RhdGUgbXVzdCBiZSBjdXJyZW50IHdoZW4gcmVsZWFzaW5nIik7CisgICAgYXNzZXJ0KFB5VGhyZWFkU3RhdGVfSXNDdXJyZW50KHRjdXIpKTsKKyAgICAtLXRjdXItPmdpbHN0YXRlX2NvdW50ZXI7CisgICAgYXNzZXJ0KHRjdXItPmdpbHN0YXRlX2NvdW50ZXIgPj0gMCk7IC8qIGlsbGVnYWwgY291bnRlciB2YWx1ZSAqLwogCi0JLyogSWYgd2UncmUgZ29pbmcgdG8gZGVzdHJveSB0aGlzIHRocmVhZC1zdGF0ZSwgd2UgbXVzdAotCSAqIGNsZWFyIGl0IHdoaWxlIHRoZSBHSUwgaXMgaGVsZCwgYXMgZGVzdHJ1Y3RvcnMgbWF5IHJ1bi4KLQkgKi8KLQlpZiAodGN1ci0+Z2lsc3RhdGVfY291bnRlciA9PSAwKSB7Ci0JCS8qIGNhbid0IGhhdmUgYmVlbiBsb2NrZWQgd2hlbiB3ZSBjcmVhdGVkIGl0ICovCi0JCWFzc2VydChvbGRzdGF0ZSA9PSBQeUdJTFN0YXRlX1VOTE9DS0VEKTsKLQkJUHlUaHJlYWRTdGF0ZV9DbGVhcih0Y3VyKTsKLQkJLyogRGVsZXRlIHRoZSB0aHJlYWQtc3RhdGUuICBOb3RlIHRoaXMgcmVsZWFzZXMgdGhlIEdJTCB0b28hCi0JCSAqIEl0J3Mgdml0YWwgdGhhdCB0aGUgR0lMIGJlIGhlbGQgaGVyZSwgdG8gYXZvaWQgc2h1dGRvd24KLQkJICogcmFjZXM7IHNlZSBidWdzIDIyNTY3MyBhbmQgMTA2MTk2OCAodGhhdCBuYXN0eSBidWcgaGFzIGEKLQkJICogaGFiaXQgb2YgY29taW5nIGJhY2spLgotCQkgKi8KLQkJUHlUaHJlYWRTdGF0ZV9EZWxldGVDdXJyZW50KCk7Ci0JfQotCS8qIFJlbGVhc2UgdGhlIGxvY2sgaWYgbmVjZXNzYXJ5ICovCi0JZWxzZSBpZiAob2xkc3RhdGUgPT0gUHlHSUxTdGF0ZV9VTkxPQ0tFRCkKLQkJUHlFdmFsX1NhdmVUaHJlYWQoKTsKKyAgICAvKiBJZiB3ZSdyZSBnb2luZyB0byBkZXN0cm95IHRoaXMgdGhyZWFkLXN0YXRlLCB3ZSBtdXN0CisgICAgICogY2xlYXIgaXQgd2hpbGUgdGhlIEdJTCBpcyBoZWxkLCBhcyBkZXN0cnVjdG9ycyBtYXkgcnVuLgorICAgICAqLworICAgIGlmICh0Y3VyLT5naWxzdGF0ZV9jb3VudGVyID09IDApIHsKKyAgICAgICAgLyogY2FuJ3QgaGF2ZSBiZWVuIGxvY2tlZCB3aGVuIHdlIGNyZWF0ZWQgaXQgKi8KKyAgICAgICAgYXNzZXJ0KG9sZHN0YXRlID09IFB5R0lMU3RhdGVfVU5MT0NLRUQpOworICAgICAgICBQeVRocmVhZFN0YXRlX0NsZWFyKHRjdXIpOworICAgICAgICAvKiBEZWxldGUgdGhlIHRocmVhZC1zdGF0ZS4gIE5vdGUgdGhpcyByZWxlYXNlcyB0aGUgR0lMIHRvbyEKKyAgICAgICAgICogSXQncyB2aXRhbCB0aGF0IHRoZSBHSUwgYmUgaGVsZCBoZXJlLCB0byBhdm9pZCBzaHV0ZG93bgorICAgICAgICAgKiByYWNlczsgc2VlIGJ1Z3MgMjI1NjczIGFuZCAxMDYxOTY4ICh0aGF0IG5hc3R5IGJ1ZyBoYXMgYQorICAgICAgICAgKiBoYWJpdCBvZiBjb21pbmcgYmFjaykuCisgICAgICAgICAqLworICAgICAgICBQeVRocmVhZFN0YXRlX0RlbGV0ZUN1cnJlbnQoKTsKKyAgICB9CisgICAgLyogUmVsZWFzZSB0aGUgbG9jayBpZiBuZWNlc3NhcnkgKi8KKyAgICBlbHNlIGlmIChvbGRzdGF0ZSA9PSBQeUdJTFN0YXRlX1VOTE9DS0VEKQorICAgICAgICBQeUV2YWxfU2F2ZVRocmVhZCgpOwogfQogCiAjaWZkZWYgX19jcGx1c3BsdXMKZGlmZiAtLWdpdCBhL1B5dGhvbi9weXN0cmNtcC5jIGIvUHl0aG9uL3B5c3RyY21wLmMKaW5kZXggODQyOTVlNy4uZjljMjI3NyAxMDA2NDQKLS0tIGEvUHl0aG9uL3B5c3RyY21wLmMKKysrIGIvUHl0aG9uL3B5c3RyY21wLmMKQEAgLTYsMjEgKzYsMjEgQEAKIGludAogUHlPU19teXN0cm5pY21wKGNvbnN0IGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMiwgUHlfc3NpemVfdCBzaXplKQogewotCWlmIChzaXplID09IDApCi0JCXJldHVybiAwOwotCXdoaWxlICgoLS1zaXplID4gMCkgJiYKLQkgICAgICAgKHRvbG93ZXIoKHVuc2lnbmVkKSpzMSkgPT0gdG9sb3dlcigodW5zaWduZWQpKnMyKSkpIHsKLQkJaWYgKCEqczErKyB8fCAhKnMyKyspCi0JCQlicmVhazsKLQl9Ci0JcmV0dXJuIHRvbG93ZXIoKHVuc2lnbmVkKSpzMSkgLSB0b2xvd2VyKCh1bnNpZ25lZCkqczIpOworICAgIGlmIChzaXplID09IDApCisgICAgICAgIHJldHVybiAwOworICAgIHdoaWxlICgoLS1zaXplID4gMCkgJiYKKyAgICAgICAgICAgKHRvbG93ZXIoKHVuc2lnbmVkKSpzMSkgPT0gdG9sb3dlcigodW5zaWduZWQpKnMyKSkpIHsKKyAgICAgICAgaWYgKCEqczErKyB8fCAhKnMyKyspCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHRvbG93ZXIoKHVuc2lnbmVkKSpzMSkgLSB0b2xvd2VyKCh1bnNpZ25lZCkqczIpOwogfQogCiBpbnQKIFB5T1NfbXlzdHJpY21wKGNvbnN0IGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMikKIHsKLQl3aGlsZSAoKnMxICYmICh0b2xvd2VyKCh1bnNpZ25lZCkqczErKykgPT0gdG9sb3dlcigodW5zaWduZWQpKnMyKyspKSkgewotCQk7Ci0JfQotCXJldHVybiAodG9sb3dlcigodW5zaWduZWQpKnMxKSAtIHRvbG93ZXIoKHVuc2lnbmVkKSpzMikpOworICAgIHdoaWxlICgqczEgJiYgKHRvbG93ZXIoKHVuc2lnbmVkKSpzMSsrKSA9PSB0b2xvd2VyKCh1bnNpZ25lZCkqczIrKykpKSB7CisgICAgICAgIDsKKyAgICB9CisgICAgcmV0dXJuICh0b2xvd2VyKCh1bnNpZ25lZCkqczEpIC0gdG9sb3dlcigodW5zaWduZWQpKnMyKSk7CiB9CmRpZmYgLS1naXQgYS9QeXRob24vcHlzdHJ0b2QuYyBiL1B5dGhvbi9weXN0cnRvZC5jCmluZGV4IDZmOGY1MmQuLjkwMDRjZjQgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9weXN0cnRvZC5jCisrKyBiL1B5dGhvbi9weXN0cnRvZC5jCkBAIC01LDcgKzUsNyBAQAogCiAvKiBhc2NpaSBjaGFyYWN0ZXIgdGVzdHMgKGFzIG9wcG9zZWQgdG8gbG9jYWxlIHRlc3RzKSAqLwogI2RlZmluZSBJU1NQQUNFKGMpICAoKGMpID09ICcgJyB8fCAoYykgPT0gJ1xmJyB8fCAoYykgPT0gJ1xuJyB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAoYykgPT0gJ1xyJyB8fCAoYykgPT0gJ1x0JyB8fCAoYykgPT0gJ1x2JykKKyAgICAgICAgICAgICAoYykgPT0gJ1xyJyB8fCAoYykgPT0gJ1x0JyB8fCAoYykgPT0gJ1x2JykKICNkZWZpbmUgSVNESUdJVChjKSAgKChjKSA+PSAnMCcgJiYgKGMpIDw9ICc5JykKIAogCkBAIC0xNCw3ICsxNCw3IEBACiAgKiBAbnB0cjogICAgdGhlIHN0cmluZyB0byBjb252ZXJ0IHRvIGEgbnVtZXJpYyB2YWx1ZS4KICAqIEBlbmRwdHI6ICBpZiBub24tJU5VTEwsIGl0IHJldHVybnMgdGhlIGNoYXJhY3RlciBhZnRlcgogICogICAgICAgICAgIHRoZSBsYXN0IGNoYXJhY3RlciB1c2VkIGluIHRoZSBjb252ZXJzaW9uLgotICogCisgKgogICogQ29udmVydHMgYSBzdHJpbmcgdG8gYSAjZ2RvdWJsZSB2YWx1ZS4KICAqIFRoaXMgZnVuY3Rpb24gYmVoYXZlcyBsaWtlIHRoZSBzdGFuZGFyZCBzdHJ0b2QoKSBmdW5jdGlvbgogICogZG9lcyBpbiB0aGUgQyBsb2NhbGUuIEl0IGRvZXMgdGhpcyB3aXRob3V0IGFjdHVhbGx5CkBAIC0zMSw3ICszMSw3IEBACiAgKiBzdG9yZWQgaW4gJWVycm5vLiBJZiB0aGUgY29ycmVjdCB2YWx1ZSB3b3VsZCBjYXVzZSB1bmRlcmZsb3csCiAgKiB6ZXJvIGlzIHJldHVybmVkIGFuZCAlRVJBTkdFIGlzIHN0b3JlZCBpbiAlZXJybm8uCiAgKiBJZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscywgJUVOT01FTSBpcyBzdG9yZWQgaW4gJWVycm5vLgotICogCisgKgogICogVGhpcyBmdW5jdGlvbiByZXNldHMgJWVycm5vIGJlZm9yZSBjYWxsaW5nIHN0cnRvZCgpIHNvIHRoYXQKICAqIHlvdSBjYW4gcmVsaWFibHkgZGV0ZWN0IG92ZXJmbG93IGFuZCB1bmRlcmZsb3cuCiAgKgpAQCAtNDAsMTUxICs0MCwxNTEgQEAKIGRvdWJsZQogUHlPU19hc2NpaV9zdHJ0b2QoY29uc3QgY2hhciAqbnB0ciwgY2hhciAqKmVuZHB0cikKIHsKLQljaGFyICpmYWlsX3BvczsKLQlkb3VibGUgdmFsID0gLTEuMDsKLQlzdHJ1Y3QgbGNvbnYgKmxvY2FsZV9kYXRhOwotCWNvbnN0IGNoYXIgKmRlY2ltYWxfcG9pbnQ7Ci0Jc2l6ZV90IGRlY2ltYWxfcG9pbnRfbGVuOwotCWNvbnN0IGNoYXIgKnAsICpkZWNpbWFsX3BvaW50X3BvczsKLQljb25zdCBjaGFyICplbmQgPSBOVUxMOyAvKiBTaWxlbmNlIGdjYyAqLwotCWNvbnN0IGNoYXIgKmRpZ2l0c19wb3MgPSBOVUxMOwotCWludCBuZWdhdGUgPSAwOworICAgIGNoYXIgKmZhaWxfcG9zOworICAgIGRvdWJsZSB2YWwgPSAtMS4wOworICAgIHN0cnVjdCBsY29udiAqbG9jYWxlX2RhdGE7CisgICAgY29uc3QgY2hhciAqZGVjaW1hbF9wb2ludDsKKyAgICBzaXplX3QgZGVjaW1hbF9wb2ludF9sZW47CisgICAgY29uc3QgY2hhciAqcCwgKmRlY2ltYWxfcG9pbnRfcG9zOworICAgIGNvbnN0IGNoYXIgKmVuZCA9IE5VTEw7IC8qIFNpbGVuY2UgZ2NjICovCisgICAgY29uc3QgY2hhciAqZGlnaXRzX3BvcyA9IE5VTEw7CisgICAgaW50IG5lZ2F0ZSA9IDA7CiAKLQlhc3NlcnQobnB0ciAhPSBOVUxMKTsKKyAgICBhc3NlcnQobnB0ciAhPSBOVUxMKTsKIAotCWZhaWxfcG9zID0gTlVMTDsKKyAgICBmYWlsX3BvcyA9IE5VTEw7CiAKLQlsb2NhbGVfZGF0YSA9IGxvY2FsZWNvbnYoKTsKLQlkZWNpbWFsX3BvaW50ID0gbG9jYWxlX2RhdGEtPmRlY2ltYWxfcG9pbnQ7Ci0JZGVjaW1hbF9wb2ludF9sZW4gPSBzdHJsZW4oZGVjaW1hbF9wb2ludCk7CisgICAgbG9jYWxlX2RhdGEgPSBsb2NhbGVjb252KCk7CisgICAgZGVjaW1hbF9wb2ludCA9IGxvY2FsZV9kYXRhLT5kZWNpbWFsX3BvaW50OworICAgIGRlY2ltYWxfcG9pbnRfbGVuID0gc3RybGVuKGRlY2ltYWxfcG9pbnQpOwogCi0JYXNzZXJ0KGRlY2ltYWxfcG9pbnRfbGVuICE9IDApOworICAgIGFzc2VydChkZWNpbWFsX3BvaW50X2xlbiAhPSAwKTsKIAotCWRlY2ltYWxfcG9pbnRfcG9zID0gTlVMTDsKKyAgICBkZWNpbWFsX3BvaW50X3BvcyA9IE5VTEw7CiAKLQkvKiBXZSBwcm9jZXNzIGFueSBsZWFkaW5nIHdoaXRlc3BhY2UgYW5kIHRoZSBvcHRpb25hbCBzaWduIG1hbnVhbGx5LAotCSAgIHRoZW4gcGFzcyB0aGUgcmVtYWluZGVyIHRvIHRoZSBzeXN0ZW0gc3RydG9kLiAgVGhpcyBlbnN1cmVzIHRoYXQKLQkgICB0aGUgcmVzdWx0IG9mIGFuIHVuZGVyZmxvdyBoYXMgdGhlIGNvcnJlY3Qgc2lnbi4gKGJ1ZyAjMTcyNSkgICovCisgICAgLyogV2UgcHJvY2VzcyBhbnkgbGVhZGluZyB3aGl0ZXNwYWNlIGFuZCB0aGUgb3B0aW9uYWwgc2lnbiBtYW51YWxseSwKKyAgICAgICB0aGVuIHBhc3MgdGhlIHJlbWFpbmRlciB0byB0aGUgc3lzdGVtIHN0cnRvZC4gIFRoaXMgZW5zdXJlcyB0aGF0CisgICAgICAgdGhlIHJlc3VsdCBvZiBhbiB1bmRlcmZsb3cgaGFzIHRoZSBjb3JyZWN0IHNpZ24uIChidWcgIzE3MjUpICAqLwogCi0JcCA9IG5wdHI7Ci0JLyogU2tpcCBsZWFkaW5nIHNwYWNlICovCi0Jd2hpbGUgKElTU1BBQ0UoKnApKQotCQlwKys7CisgICAgcCA9IG5wdHI7CisgICAgLyogU2tpcCBsZWFkaW5nIHNwYWNlICovCisgICAgd2hpbGUgKElTU1BBQ0UoKnApKQorICAgICAgICBwKys7CiAKLQkvKiBQcm9jZXNzIGxlYWRpbmcgc2lnbiwgaWYgcHJlc2VudCAqLwotCWlmICgqcCA9PSAnLScpIHsKLQkJbmVnYXRlID0gMTsKLQkJcCsrOwotCX0gZWxzZSBpZiAoKnAgPT0gJysnKSB7Ci0JCXArKzsKLQl9CisgICAgLyogUHJvY2VzcyBsZWFkaW5nIHNpZ24sIGlmIHByZXNlbnQgKi8KKyAgICBpZiAoKnAgPT0gJy0nKSB7CisgICAgICAgIG5lZ2F0ZSA9IDE7CisgICAgICAgIHArKzsKKyAgICB9IGVsc2UgaWYgKCpwID09ICcrJykgeworICAgICAgICBwKys7CisgICAgfQogCi0JLyogV2hhdCdzIGxlZnQgc2hvdWxkIGJlZ2luIHdpdGggYSBkaWdpdCwgYSBkZWNpbWFsIHBvaW50LCBvciBvbmUgb2YKLQkgICB0aGUgbGV0dGVycyBpLCBJLCBuLCBOLiBJdCBzaG91bGQgbm90IGJlZ2luIHdpdGggMHggb3IgMFggKi8KLQlpZiAoKCFJU0RJR0lUKCpwKSAmJgotCSAgICAgKnAgIT0gJy4nICYmICpwICE9ICdpJyAmJiAqcCAhPSAnSScgJiYgKnAgIT0gJ24nICYmICpwICE9ICdOJykKLQkgICAgfHwKLQkgICAgKCpwID09ICcwJyAmJiAocFsxXSA9PSAneCcgfHwgcFsxXSA9PSAnWCcpKSkKLQl7Ci0JCWlmIChlbmRwdHIpCi0JCQkqZW5kcHRyID0gKGNoYXIqKW5wdHI7Ci0JCWVycm5vID0gRUlOVkFMOwotCQlyZXR1cm4gdmFsOwotCX0KLQlkaWdpdHNfcG9zID0gcDsKKyAgICAvKiBXaGF0J3MgbGVmdCBzaG91bGQgYmVnaW4gd2l0aCBhIGRpZ2l0LCBhIGRlY2ltYWwgcG9pbnQsIG9yIG9uZSBvZgorICAgICAgIHRoZSBsZXR0ZXJzIGksIEksIG4sIE4uIEl0IHNob3VsZCBub3QgYmVnaW4gd2l0aCAweCBvciAwWCAqLworICAgIGlmICgoIUlTRElHSVQoKnApICYmCisgICAgICAgICAqcCAhPSAnLicgJiYgKnAgIT0gJ2knICYmICpwICE9ICdJJyAmJiAqcCAhPSAnbicgJiYgKnAgIT0gJ04nKQorICAgICAgICB8fAorICAgICAgICAoKnAgPT0gJzAnICYmIChwWzFdID09ICd4JyB8fCBwWzFdID09ICdYJykpKQorICAgIHsKKyAgICAgICAgaWYgKGVuZHB0cikKKyAgICAgICAgICAgICplbmRwdHIgPSAoY2hhciopbnB0cjsKKyAgICAgICAgZXJybm8gPSBFSU5WQUw7CisgICAgICAgIHJldHVybiB2YWw7CisgICAgfQorICAgIGRpZ2l0c19wb3MgPSBwOwogCi0JaWYgKGRlY2ltYWxfcG9pbnRbMF0gIT0gJy4nIHx8IAotCSAgICBkZWNpbWFsX3BvaW50WzFdICE9IDApCi0JewotCQl3aGlsZSAoSVNESUdJVCgqcCkpCi0JCQlwKys7CisgICAgaWYgKGRlY2ltYWxfcG9pbnRbMF0gIT0gJy4nIHx8CisgICAgICAgIGRlY2ltYWxfcG9pbnRbMV0gIT0gMCkKKyAgICB7CisgICAgICAgIHdoaWxlIChJU0RJR0lUKCpwKSkKKyAgICAgICAgICAgIHArKzsKIAotCQlpZiAoKnAgPT0gJy4nKQotCQl7Ci0JCQlkZWNpbWFsX3BvaW50X3BvcyA9IHArKzsKKyAgICAgICAgaWYgKCpwID09ICcuJykKKyAgICAgICAgeworICAgICAgICAgICAgZGVjaW1hbF9wb2ludF9wb3MgPSBwKys7CiAKLQkJCXdoaWxlIChJU0RJR0lUKCpwKSkKLQkJCQlwKys7CisgICAgICAgICAgICB3aGlsZSAoSVNESUdJVCgqcCkpCisgICAgICAgICAgICAgICAgcCsrOwogCi0JCQlpZiAoKnAgPT0gJ2UnIHx8ICpwID09ICdFJykKLQkJCQlwKys7Ci0JCQlpZiAoKnAgPT0gJysnIHx8ICpwID09ICctJykKLQkJCQlwKys7Ci0JCQl3aGlsZSAoSVNESUdJVCgqcCkpCi0JCQkJcCsrOwotCQkJZW5kID0gcDsKLQkJfQotCQllbHNlIGlmIChzdHJuY21wKHAsIGRlY2ltYWxfcG9pbnQsIGRlY2ltYWxfcG9pbnRfbGVuKSA9PSAwKQotCQl7Ci0JCQkvKiBQeXRob24gYnVnICMxNDE3Njk5ICovCi0JCQlpZiAoZW5kcHRyKQotCQkJCSplbmRwdHIgPSAoY2hhciopbnB0cjsKLQkJCWVycm5vID0gRUlOVkFMOwotCQkJcmV0dXJuIHZhbDsKLQkJfQotCQkvKiBGb3IgdGhlIG90aGVyIGNhc2VzLCB3ZSBuZWVkIG5vdCBjb252ZXJ0IHRoZSBkZWNpbWFsCi0JCSAgIHBvaW50ICovCi0JfQorICAgICAgICAgICAgaWYgKCpwID09ICdlJyB8fCAqcCA9PSAnRScpCisgICAgICAgICAgICAgICAgcCsrOworICAgICAgICAgICAgaWYgKCpwID09ICcrJyB8fCAqcCA9PSAnLScpCisgICAgICAgICAgICAgICAgcCsrOworICAgICAgICAgICAgd2hpbGUgKElTRElHSVQoKnApKQorICAgICAgICAgICAgICAgIHArKzsKKyAgICAgICAgICAgIGVuZCA9IHA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoc3RybmNtcChwLCBkZWNpbWFsX3BvaW50LCBkZWNpbWFsX3BvaW50X2xlbikgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogUHl0aG9uIGJ1ZyAjMTQxNzY5OSAqLworICAgICAgICAgICAgaWYgKGVuZHB0cikKKyAgICAgICAgICAgICAgICAqZW5kcHRyID0gKGNoYXIqKW5wdHI7CisgICAgICAgICAgICBlcnJubyA9IEVJTlZBTDsKKyAgICAgICAgICAgIHJldHVybiB2YWw7CisgICAgICAgIH0KKyAgICAgICAgLyogRm9yIHRoZSBvdGhlciBjYXNlcywgd2UgbmVlZCBub3QgY29udmVydCB0aGUgZGVjaW1hbAorICAgICAgICAgICBwb2ludCAqLworICAgIH0KIAotCS8qIFNldCBlcnJubyB0byB6ZXJvLCBzbyB0aGF0IHdlIGNhbiBkaXN0aW5ndWlzaCB6ZXJvIHJlc3VsdHMKLQkgICBhbmQgdW5kZXJmbG93cyAqLwotCWVycm5vID0gMDsKKyAgICAvKiBTZXQgZXJybm8gdG8gemVybywgc28gdGhhdCB3ZSBjYW4gZGlzdGluZ3Vpc2ggemVybyByZXN1bHRzCisgICAgICAgYW5kIHVuZGVyZmxvd3MgKi8KKyAgICBlcnJubyA9IDA7CiAKLQlpZiAoZGVjaW1hbF9wb2ludF9wb3MpCi0JewotCQljaGFyICpjb3B5LCAqYzsKKyAgICBpZiAoZGVjaW1hbF9wb2ludF9wb3MpCisgICAgeworICAgICAgICBjaGFyICpjb3B5LCAqYzsKIAotCQkvKiBXZSBuZWVkIHRvIGNvbnZlcnQgdGhlICcuJyB0byB0aGUgbG9jYWxlIHNwZWNpZmljIGRlY2ltYWwKLQkJICAgcG9pbnQgKi8KLQkJY29weSA9IChjaGFyICopUHlNZW1fTUFMTE9DKGVuZCAtIGRpZ2l0c19wb3MgKwotCQkJCQkgICAgMSArIGRlY2ltYWxfcG9pbnRfbGVuKTsKLQkJaWYgKGNvcHkgPT0gTlVMTCkgewotCQkJaWYgKGVuZHB0cikKLQkJCQkqZW5kcHRyID0gKGNoYXIgKilucHRyOwotCQkJZXJybm8gPSBFTk9NRU07Ci0JCQlyZXR1cm4gdmFsOwotCQl9CisgICAgICAgIC8qIFdlIG5lZWQgdG8gY29udmVydCB0aGUgJy4nIHRvIHRoZSBsb2NhbGUgc3BlY2lmaWMgZGVjaW1hbAorICAgICAgICAgICBwb2ludCAqLworICAgICAgICBjb3B5ID0gKGNoYXIgKilQeU1lbV9NQUxMT0MoZW5kIC0gZGlnaXRzX3BvcyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICsgZGVjaW1hbF9wb2ludF9sZW4pOworICAgICAgICBpZiAoY29weSA9PSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoZW5kcHRyKQorICAgICAgICAgICAgICAgICplbmRwdHIgPSAoY2hhciAqKW5wdHI7CisgICAgICAgICAgICBlcnJubyA9IEVOT01FTTsKKyAgICAgICAgICAgIHJldHVybiB2YWw7CisgICAgICAgIH0KIAotCQljID0gY29weTsKLQkJbWVtY3B5KGMsIGRpZ2l0c19wb3MsIGRlY2ltYWxfcG9pbnRfcG9zIC0gZGlnaXRzX3Bvcyk7Ci0JCWMgKz0gZGVjaW1hbF9wb2ludF9wb3MgLSBkaWdpdHNfcG9zOwotCQltZW1jcHkoYywgZGVjaW1hbF9wb2ludCwgZGVjaW1hbF9wb2ludF9sZW4pOwotCQljICs9IGRlY2ltYWxfcG9pbnRfbGVuOwotCQltZW1jcHkoYywgZGVjaW1hbF9wb2ludF9wb3MgKyAxLAotCQkgICAgICAgZW5kIC0gKGRlY2ltYWxfcG9pbnRfcG9zICsgMSkpOwotCQljICs9IGVuZCAtIChkZWNpbWFsX3BvaW50X3BvcyArIDEpOwotCQkqYyA9IDA7CisgICAgICAgIGMgPSBjb3B5OworICAgICAgICBtZW1jcHkoYywgZGlnaXRzX3BvcywgZGVjaW1hbF9wb2ludF9wb3MgLSBkaWdpdHNfcG9zKTsKKyAgICAgICAgYyArPSBkZWNpbWFsX3BvaW50X3BvcyAtIGRpZ2l0c19wb3M7CisgICAgICAgIG1lbWNweShjLCBkZWNpbWFsX3BvaW50LCBkZWNpbWFsX3BvaW50X2xlbik7CisgICAgICAgIGMgKz0gZGVjaW1hbF9wb2ludF9sZW47CisgICAgICAgIG1lbWNweShjLCBkZWNpbWFsX3BvaW50X3BvcyArIDEsCisgICAgICAgICAgICAgICBlbmQgLSAoZGVjaW1hbF9wb2ludF9wb3MgKyAxKSk7CisgICAgICAgIGMgKz0gZW5kIC0gKGRlY2ltYWxfcG9pbnRfcG9zICsgMSk7CisgICAgICAgICpjID0gMDsKIAotCQl2YWwgPSBzdHJ0b2QoY29weSwgJmZhaWxfcG9zKTsKKyAgICAgICAgdmFsID0gc3RydG9kKGNvcHksICZmYWlsX3Bvcyk7CiAKLQkJaWYgKGZhaWxfcG9zKQotCQl7Ci0JCQlpZiAoZmFpbF9wb3MgPiBkZWNpbWFsX3BvaW50X3BvcykKLQkJCQlmYWlsX3BvcyA9IChjaGFyICopZGlnaXRzX3BvcyArCi0JCQkJCShmYWlsX3BvcyAtIGNvcHkpIC0KLQkJCQkJKGRlY2ltYWxfcG9pbnRfbGVuIC0gMSk7Ci0JCQllbHNlCi0JCQkJZmFpbF9wb3MgPSAoY2hhciAqKWRpZ2l0c19wb3MgKwotCQkJCQkoZmFpbF9wb3MgLSBjb3B5KTsKLQkJfQorICAgICAgICBpZiAoZmFpbF9wb3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChmYWlsX3BvcyA+IGRlY2ltYWxfcG9pbnRfcG9zKQorICAgICAgICAgICAgICAgIGZhaWxfcG9zID0gKGNoYXIgKilkaWdpdHNfcG9zICsKKyAgICAgICAgICAgICAgICAgICAgKGZhaWxfcG9zIC0gY29weSkgLQorICAgICAgICAgICAgICAgICAgICAoZGVjaW1hbF9wb2ludF9sZW4gLSAxKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBmYWlsX3BvcyA9IChjaGFyICopZGlnaXRzX3BvcyArCisgICAgICAgICAgICAgICAgICAgIChmYWlsX3BvcyAtIGNvcHkpOworICAgICAgICB9CiAKLQkJUHlNZW1fRlJFRShjb3B5KTsKKyAgICAgICAgUHlNZW1fRlJFRShjb3B5KTsKIAotCX0KLQllbHNlIHsKLQkJdmFsID0gc3RydG9kKGRpZ2l0c19wb3MsICZmYWlsX3Bvcyk7Ci0JfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgdmFsID0gc3RydG9kKGRpZ2l0c19wb3MsICZmYWlsX3Bvcyk7CisgICAgfQogCi0JaWYgKGZhaWxfcG9zID09IGRpZ2l0c19wb3MpCi0JCWZhaWxfcG9zID0gKGNoYXIgKilucHRyOworICAgIGlmIChmYWlsX3BvcyA9PSBkaWdpdHNfcG9zKQorICAgICAgICBmYWlsX3BvcyA9IChjaGFyICopbnB0cjsKIAotCWlmIChuZWdhdGUgJiYgZmFpbF9wb3MgIT0gbnB0cikKLQkJdmFsID0gLXZhbDsKKyAgICBpZiAobmVnYXRlICYmIGZhaWxfcG9zICE9IG5wdHIpCisgICAgICAgIHZhbCA9IC12YWw7CiAKLQlpZiAoZW5kcHRyKQotCQkqZW5kcHRyID0gZmFpbF9wb3M7CisgICAgaWYgKGVuZHB0cikKKyAgICAgICAgKmVuZHB0ciA9IGZhaWxfcG9zOwogCi0JcmV0dXJuIHZhbDsKKyAgICByZXR1cm4gdmFsOwogfQogCiAvKiBHaXZlbiBhIHN0cmluZyB0aGF0IG1heSBoYXZlIGEgZGVjaW1hbCBwb2ludCBpbiB0aGUgY3VycmVudApAQCAtMTkzLDMwICsxOTMsMzAgQEAKIFB5X0xPQ0FMX0lOTElORSh2b2lkKQogY2hhbmdlX2RlY2ltYWxfZnJvbV9sb2NhbGVfdG9fZG90KGNoYXIqIGJ1ZmZlcikKIHsKLQlzdHJ1Y3QgbGNvbnYgKmxvY2FsZV9kYXRhID0gbG9jYWxlY29udigpOwotCWNvbnN0IGNoYXIgKmRlY2ltYWxfcG9pbnQgPSBsb2NhbGVfZGF0YS0+ZGVjaW1hbF9wb2ludDsKKyAgICBzdHJ1Y3QgbGNvbnYgKmxvY2FsZV9kYXRhID0gbG9jYWxlY29udigpOworICAgIGNvbnN0IGNoYXIgKmRlY2ltYWxfcG9pbnQgPSBsb2NhbGVfZGF0YS0+ZGVjaW1hbF9wb2ludDsKIAotCWlmIChkZWNpbWFsX3BvaW50WzBdICE9ICcuJyB8fCBkZWNpbWFsX3BvaW50WzFdICE9IDApIHsKLQkJc2l6ZV90IGRlY2ltYWxfcG9pbnRfbGVuID0gc3RybGVuKGRlY2ltYWxfcG9pbnQpOworICAgIGlmIChkZWNpbWFsX3BvaW50WzBdICE9ICcuJyB8fCBkZWNpbWFsX3BvaW50WzFdICE9IDApIHsKKyAgICAgICAgc2l6ZV90IGRlY2ltYWxfcG9pbnRfbGVuID0gc3RybGVuKGRlY2ltYWxfcG9pbnQpOwogCi0JCWlmICgqYnVmZmVyID09ICcrJyB8fCAqYnVmZmVyID09ICctJykKLQkJCWJ1ZmZlcisrOwotCQl3aGlsZSAoaXNkaWdpdChQeV9DSEFSTUFTSygqYnVmZmVyKSkpCi0JCQlidWZmZXIrKzsKLQkJaWYgKHN0cm5jbXAoYnVmZmVyLCBkZWNpbWFsX3BvaW50LCBkZWNpbWFsX3BvaW50X2xlbikgPT0gMCkgewotCQkJKmJ1ZmZlciA9ICcuJzsKLQkJCWJ1ZmZlcisrOwotCQkJaWYgKGRlY2ltYWxfcG9pbnRfbGVuID4gMSkgewotCQkJCS8qIGJ1ZmZlciBuZWVkcyB0byBnZXQgc21hbGxlciAqLwotCQkJCXNpemVfdCByZXN0X2xlbiA9IHN0cmxlbihidWZmZXIgKwotCQkJCQkJICAgICAoZGVjaW1hbF9wb2ludF9sZW4gLSAxKSk7Ci0JCQkJbWVtbW92ZShidWZmZXIsCi0JCQkJCWJ1ZmZlciArIChkZWNpbWFsX3BvaW50X2xlbiAtIDEpLAotCQkJCQlyZXN0X2xlbik7Ci0JCQkJYnVmZmVyW3Jlc3RfbGVuXSA9IDA7Ci0JCQl9Ci0JCX0KLQl9CisgICAgICAgIGlmICgqYnVmZmVyID09ICcrJyB8fCAqYnVmZmVyID09ICctJykKKyAgICAgICAgICAgIGJ1ZmZlcisrOworICAgICAgICB3aGlsZSAoaXNkaWdpdChQeV9DSEFSTUFTSygqYnVmZmVyKSkpCisgICAgICAgICAgICBidWZmZXIrKzsKKyAgICAgICAgaWYgKHN0cm5jbXAoYnVmZmVyLCBkZWNpbWFsX3BvaW50LCBkZWNpbWFsX3BvaW50X2xlbikgPT0gMCkgeworICAgICAgICAgICAgKmJ1ZmZlciA9ICcuJzsKKyAgICAgICAgICAgIGJ1ZmZlcisrOworICAgICAgICAgICAgaWYgKGRlY2ltYWxfcG9pbnRfbGVuID4gMSkgeworICAgICAgICAgICAgICAgIC8qIGJ1ZmZlciBuZWVkcyB0byBnZXQgc21hbGxlciAqLworICAgICAgICAgICAgICAgIHNpemVfdCByZXN0X2xlbiA9IHN0cmxlbihidWZmZXIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZWNpbWFsX3BvaW50X2xlbiAtIDEpKTsKKyAgICAgICAgICAgICAgICBtZW1tb3ZlKGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyICsgKGRlY2ltYWxfcG9pbnRfbGVuIC0gMSksCisgICAgICAgICAgICAgICAgICAgIHJlc3RfbGVuKTsKKyAgICAgICAgICAgICAgICBidWZmZXJbcmVzdF9sZW5dID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIH0KIAogCkBAIC0yMzEsNjUgKzIzMSw2NSBAQAogUHlfTE9DQUxfSU5MSU5FKHZvaWQpCiBlbnN1cmVfbWluaW11bV9leHBvbmVudF9sZW5ndGgoY2hhciogYnVmZmVyLCBzaXplX3QgYnVmX3NpemUpCiB7Ci0JY2hhciAqcCA9IHN0cnBicmsoYnVmZmVyLCAiZUUiKTsKLQlpZiAocCAmJiAoKihwICsgMSkgPT0gJy0nIHx8ICoocCArIDEpID09ICcrJykpIHsKLQkJY2hhciAqc3RhcnQgPSBwICsgMjsKLQkJaW50IGV4cG9uZW50X2RpZ2l0X2NudCA9IDA7Ci0JCWludCBsZWFkaW5nX3plcm9fY250ID0gMDsKLQkJaW50IGluX2xlYWRpbmdfemVyb3MgPSAxOwotCQlpbnQgc2lnbmlmaWNhbnRfZGlnaXRfY250OworICAgIGNoYXIgKnAgPSBzdHJwYnJrKGJ1ZmZlciwgImVFIik7CisgICAgaWYgKHAgJiYgKCoocCArIDEpID09ICctJyB8fCAqKHAgKyAxKSA9PSAnKycpKSB7CisgICAgICAgIGNoYXIgKnN0YXJ0ID0gcCArIDI7CisgICAgICAgIGludCBleHBvbmVudF9kaWdpdF9jbnQgPSAwOworICAgICAgICBpbnQgbGVhZGluZ196ZXJvX2NudCA9IDA7CisgICAgICAgIGludCBpbl9sZWFkaW5nX3plcm9zID0gMTsKKyAgICAgICAgaW50IHNpZ25pZmljYW50X2RpZ2l0X2NudDsKIAotCQkvKiBTa2lwIG92ZXIgdGhlIGV4cG9uZW50IGFuZCB0aGUgc2lnbi4gKi8KLQkJcCArPSAyOworICAgICAgICAvKiBTa2lwIG92ZXIgdGhlIGV4cG9uZW50IGFuZCB0aGUgc2lnbi4gKi8KKyAgICAgICAgcCArPSAyOwogCi0JCS8qIEZpbmQgdGhlIGVuZCBvZiB0aGUgZXhwb25lbnQsIGtlZXBpbmcgdHJhY2sgb2YgbGVhZGluZwotCQkgICB6ZXJvcy4gKi8KLQkJd2hpbGUgKCpwICYmIGlzZGlnaXQoUHlfQ0hBUk1BU0soKnApKSkgewotCQkJaWYgKGluX2xlYWRpbmdfemVyb3MgJiYgKnAgPT0gJzAnKQotCQkJCSsrbGVhZGluZ196ZXJvX2NudDsKLQkJCWlmICgqcCAhPSAnMCcpCi0JCQkJaW5fbGVhZGluZ196ZXJvcyA9IDA7Ci0JCQkrK3A7Ci0JCQkrK2V4cG9uZW50X2RpZ2l0X2NudDsKLQkJfQorICAgICAgICAvKiBGaW5kIHRoZSBlbmQgb2YgdGhlIGV4cG9uZW50LCBrZWVwaW5nIHRyYWNrIG9mIGxlYWRpbmcKKyAgICAgICAgICAgemVyb3MuICovCisgICAgICAgIHdoaWxlICgqcCAmJiBpc2RpZ2l0KFB5X0NIQVJNQVNLKCpwKSkpIHsKKyAgICAgICAgICAgIGlmIChpbl9sZWFkaW5nX3plcm9zICYmICpwID09ICcwJykKKyAgICAgICAgICAgICAgICArK2xlYWRpbmdfemVyb19jbnQ7CisgICAgICAgICAgICBpZiAoKnAgIT0gJzAnKQorICAgICAgICAgICAgICAgIGluX2xlYWRpbmdfemVyb3MgPSAwOworICAgICAgICAgICAgKytwOworICAgICAgICAgICAgKytleHBvbmVudF9kaWdpdF9jbnQ7CisgICAgICAgIH0KIAotCQlzaWduaWZpY2FudF9kaWdpdF9jbnQgPSBleHBvbmVudF9kaWdpdF9jbnQgLSBsZWFkaW5nX3plcm9fY250OwotCQlpZiAoZXhwb25lbnRfZGlnaXRfY250ID09IE1JTl9FWFBPTkVOVF9ESUdJVFMpIHsKLQkJCS8qIElmIHRoZXJlIGFyZSAyIGV4YWN0bHkgZGlnaXRzLCB3ZSdyZSBkb25lLAotCQkJICAgcmVnYXJkbGVzcyBvZiB3aGF0IHRoZXkgY29udGFpbiAqLwotCQl9Ci0JCWVsc2UgaWYgKGV4cG9uZW50X2RpZ2l0X2NudCA+IE1JTl9FWFBPTkVOVF9ESUdJVFMpIHsKLQkJCWludCBleHRyYV96ZXJvc19jbnQ7CisgICAgICAgIHNpZ25pZmljYW50X2RpZ2l0X2NudCA9IGV4cG9uZW50X2RpZ2l0X2NudCAtIGxlYWRpbmdfemVyb19jbnQ7CisgICAgICAgIGlmIChleHBvbmVudF9kaWdpdF9jbnQgPT0gTUlOX0VYUE9ORU5UX0RJR0lUUykgeworICAgICAgICAgICAgLyogSWYgdGhlcmUgYXJlIDIgZXhhY3RseSBkaWdpdHMsIHdlJ3JlIGRvbmUsCisgICAgICAgICAgICAgICByZWdhcmRsZXNzIG9mIHdoYXQgdGhleSBjb250YWluICovCisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoZXhwb25lbnRfZGlnaXRfY250ID4gTUlOX0VYUE9ORU5UX0RJR0lUUykgeworICAgICAgICAgICAgaW50IGV4dHJhX3plcm9zX2NudDsKIAotCQkJLyogVGhlcmUgYXJlIG1vcmUgdGhhbiAyIGRpZ2l0cyBpbiB0aGUgZXhwb25lbnQuICBTZWUKLQkJCSAgIGlmIHdlIGNhbiBkZWxldGUgc29tZSBvZiB0aGUgbGVhZGluZyB6ZXJvcyAqLwotCQkJaWYgKHNpZ25pZmljYW50X2RpZ2l0X2NudCA8IE1JTl9FWFBPTkVOVF9ESUdJVFMpCi0JCQkJc2lnbmlmaWNhbnRfZGlnaXRfY250ID0gTUlOX0VYUE9ORU5UX0RJR0lUUzsKLQkJCWV4dHJhX3plcm9zX2NudCA9IGV4cG9uZW50X2RpZ2l0X2NudCAtCi0JCQkJc2lnbmlmaWNhbnRfZGlnaXRfY250OworICAgICAgICAgICAgLyogVGhlcmUgYXJlIG1vcmUgdGhhbiAyIGRpZ2l0cyBpbiB0aGUgZXhwb25lbnQuICBTZWUKKyAgICAgICAgICAgICAgIGlmIHdlIGNhbiBkZWxldGUgc29tZSBvZiB0aGUgbGVhZGluZyB6ZXJvcyAqLworICAgICAgICAgICAgaWYgKHNpZ25pZmljYW50X2RpZ2l0X2NudCA8IE1JTl9FWFBPTkVOVF9ESUdJVFMpCisgICAgICAgICAgICAgICAgc2lnbmlmaWNhbnRfZGlnaXRfY250ID0gTUlOX0VYUE9ORU5UX0RJR0lUUzsKKyAgICAgICAgICAgIGV4dHJhX3plcm9zX2NudCA9IGV4cG9uZW50X2RpZ2l0X2NudCAtCisgICAgICAgICAgICAgICAgc2lnbmlmaWNhbnRfZGlnaXRfY250OwogCi0JCQkvKiBEZWxldGUgZXh0cmFfemVyb3NfY250IHdvcnRoIG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUKLQkJCSAgIGZyb250IG9mIHRoZSBleHBvbmVudCAqLwotCQkJYXNzZXJ0KGV4dHJhX3plcm9zX2NudCA+PSAwKTsKKyAgICAgICAgICAgIC8qIERlbGV0ZSBleHRyYV96ZXJvc19jbnQgd29ydGggb2YgY2hhcmFjdGVycyBmcm9tIHRoZQorICAgICAgICAgICAgICAgZnJvbnQgb2YgdGhlIGV4cG9uZW50ICovCisgICAgICAgICAgICBhc3NlcnQoZXh0cmFfemVyb3NfY250ID49IDApOwogCi0JCQkvKiBBZGQgb25lIHRvIHNpZ25pZmljYW50X2RpZ2l0X2NudCB0byBjb3B5IHRoZQotCQkJICAgdHJhaWxpbmcgMCBieXRlLCB0aHVzIHNldHRpbmcgdGhlIGxlbmd0aCAqLwotCQkJbWVtbW92ZShzdGFydCwKLQkJCQlzdGFydCArIGV4dHJhX3plcm9zX2NudCwKLQkJCQlzaWduaWZpY2FudF9kaWdpdF9jbnQgKyAxKTsKLQkJfQotCQllbHNlIHsKLQkJCS8qIElmIHRoZXJlIGFyZSBmZXdlciB0aGFuIDIgZGlnaXRzLCBhZGQgemVyb3MKLQkJCSAgIHVudGlsIHRoZXJlIGFyZSAyLCBpZiB0aGVyZSdzIGVub3VnaCByb29tICovCi0JCQlpbnQgemVyb3MgPSBNSU5fRVhQT05FTlRfRElHSVRTIC0gZXhwb25lbnRfZGlnaXRfY250OwotCQkJaWYgKHN0YXJ0ICsgemVyb3MgKyBleHBvbmVudF9kaWdpdF9jbnQgKyAxCi0JCQkgICAgICA8IGJ1ZmZlciArIGJ1Zl9zaXplKSB7Ci0JCQkJbWVtbW92ZShzdGFydCArIHplcm9zLCBzdGFydCwKLQkJCQkJZXhwb25lbnRfZGlnaXRfY250ICsgMSk7Ci0JCQkJbWVtc2V0KHN0YXJ0LCAnMCcsIHplcm9zKTsKLQkJCX0KLQkJfQotCX0KKyAgICAgICAgICAgIC8qIEFkZCBvbmUgdG8gc2lnbmlmaWNhbnRfZGlnaXRfY250IHRvIGNvcHkgdGhlCisgICAgICAgICAgICAgICB0cmFpbGluZyAwIGJ5dGUsIHRodXMgc2V0dGluZyB0aGUgbGVuZ3RoICovCisgICAgICAgICAgICBtZW1tb3ZlKHN0YXJ0LAorICAgICAgICAgICAgICAgIHN0YXJ0ICsgZXh0cmFfemVyb3NfY250LAorICAgICAgICAgICAgICAgIHNpZ25pZmljYW50X2RpZ2l0X2NudCArIDEpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLyogSWYgdGhlcmUgYXJlIGZld2VyIHRoYW4gMiBkaWdpdHMsIGFkZCB6ZXJvcworICAgICAgICAgICAgICAgdW50aWwgdGhlcmUgYXJlIDIsIGlmIHRoZXJlJ3MgZW5vdWdoIHJvb20gKi8KKyAgICAgICAgICAgIGludCB6ZXJvcyA9IE1JTl9FWFBPTkVOVF9ESUdJVFMgLSBleHBvbmVudF9kaWdpdF9jbnQ7CisgICAgICAgICAgICBpZiAoc3RhcnQgKyB6ZXJvcyArIGV4cG9uZW50X2RpZ2l0X2NudCArIDEKKyAgICAgICAgICAgICAgICAgIDwgYnVmZmVyICsgYnVmX3NpemUpIHsKKyAgICAgICAgICAgICAgICBtZW1tb3ZlKHN0YXJ0ICsgemVyb3MsIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICBleHBvbmVudF9kaWdpdF9jbnQgKyAxKTsKKyAgICAgICAgICAgICAgICBtZW1zZXQoc3RhcnQsICcwJywgemVyb3MpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogfQogCiAvKiBFbnN1cmUgdGhhdCBidWZmZXIgaGFzIGEgZGVjaW1hbCBwb2ludCBpbiBpdC4gIFRoZSBkZWNpbWFsIHBvaW50CkBAIC0yOTcsNDggKzI5Nyw0OCBAQAogUHlfTE9DQUxfSU5MSU5FKHZvaWQpCiBlbnN1cmVfZGVjaW1hbF9wb2ludChjaGFyKiBidWZmZXIsIHNpemVfdCBidWZfc2l6ZSkKIHsKLQlpbnQgaW5zZXJ0X2NvdW50ID0gMDsKLQljaGFyKiBjaGFyc190b19pbnNlcnQ7CisgICAgaW50IGluc2VydF9jb3VudCA9IDA7CisgICAgY2hhciogY2hhcnNfdG9faW5zZXJ0OwogCi0JLyogc2VhcmNoIGZvciB0aGUgZmlyc3Qgbm9uLWRpZ2l0IGNoYXJhY3RlciAqLwotCWNoYXIgKnAgPSBidWZmZXI7Ci0JaWYgKCpwID09ICctJyB8fCAqcCA9PSAnKycpCi0JCS8qIFNraXAgbGVhZGluZyBzaWduLCBpZiBwcmVzZW50LiAgSSB0aGluayB0aGlzIGNvdWxkIG9ubHkKLQkJICAgZXZlciBiZSAnLScsIGJ1dCBpdCBjYW4ndCBodXJ0IHRvIGNoZWNrIGZvciBib3RoLiAqLwotCQkrK3A7Ci0Jd2hpbGUgKCpwICYmIGlzZGlnaXQoUHlfQ0hBUk1BU0soKnApKSkKLQkJKytwOworICAgIC8qIHNlYXJjaCBmb3IgdGhlIGZpcnN0IG5vbi1kaWdpdCBjaGFyYWN0ZXIgKi8KKyAgICBjaGFyICpwID0gYnVmZmVyOworICAgIGlmICgqcCA9PSAnLScgfHwgKnAgPT0gJysnKQorICAgICAgICAvKiBTa2lwIGxlYWRpbmcgc2lnbiwgaWYgcHJlc2VudC4gIEkgdGhpbmsgdGhpcyBjb3VsZCBvbmx5CisgICAgICAgICAgIGV2ZXIgYmUgJy0nLCBidXQgaXQgY2FuJ3QgaHVydCB0byBjaGVjayBmb3IgYm90aC4gKi8KKyAgICAgICAgKytwOworICAgIHdoaWxlICgqcCAmJiBpc2RpZ2l0KFB5X0NIQVJNQVNLKCpwKSkpCisgICAgICAgICsrcDsKIAotCWlmICgqcCA9PSAnLicpIHsKLQkJaWYgKGlzZGlnaXQoUHlfQ0hBUk1BU0soKihwKzEpKSkpIHsKLQkJCS8qIE5vdGhpbmcgdG8gZG8sIHdlIGFscmVhZHkgaGF2ZSBhIGRlY2ltYWwKLQkJCSAgIHBvaW50IGFuZCBhIGRpZ2l0IGFmdGVyIGl0ICovCi0JCX0KLQkJZWxzZSB7Ci0JCQkvKiBXZSBoYXZlIGEgZGVjaW1hbCBwb2ludCwgYnV0IG5vIGZvbGxvd2luZwotCQkJICAgZGlnaXQuICBJbnNlcnQgYSB6ZXJvIGFmdGVyIHRoZSBkZWNpbWFsLiAqLwotCQkJKytwOwotCQkJY2hhcnNfdG9faW5zZXJ0ID0gIjAiOwotCQkJaW5zZXJ0X2NvdW50ID0gMTsKLQkJfQotCX0KLQllbHNlIHsKLQkJY2hhcnNfdG9faW5zZXJ0ID0gIi4wIjsKLQkJaW5zZXJ0X2NvdW50ID0gMjsKLQl9Ci0JaWYgKGluc2VydF9jb3VudCkgewotCQlzaXplX3QgYnVmX2xlbiA9IHN0cmxlbihidWZmZXIpOwotCQlpZiAoYnVmX2xlbiArIGluc2VydF9jb3VudCArIDEgPj0gYnVmX3NpemUpIHsKLQkJCS8qIElmIHRoZXJlIGlzIG5vdCBlbm91Z2ggcm9vbSBpbiB0aGUgYnVmZmVyCi0JCQkgICBmb3IgdGhlIGFkZGl0aW9uYWwgdGV4dCwganVzdCBza2lwIGl0LiAgSXQncwotCQkJICAgbm90IHdvcnRoIGdlbmVyYXRpbmcgYW4gZXJyb3Igb3Zlci4gKi8KLQkJfQotCQllbHNlIHsKLQkJCW1lbW1vdmUocCArIGluc2VydF9jb3VudCwgcCwKLQkJCQlidWZmZXIgKyBzdHJsZW4oYnVmZmVyKSAtIHAgKyAxKTsKLQkJCW1lbWNweShwLCBjaGFyc190b19pbnNlcnQsIGluc2VydF9jb3VudCk7Ci0JCX0KLQl9CisgICAgaWYgKCpwID09ICcuJykgeworICAgICAgICBpZiAoaXNkaWdpdChQeV9DSEFSTUFTSygqKHArMSkpKSkgeworICAgICAgICAgICAgLyogTm90aGluZyB0byBkbywgd2UgYWxyZWFkeSBoYXZlIGEgZGVjaW1hbAorICAgICAgICAgICAgICAgcG9pbnQgYW5kIGEgZGlnaXQgYWZ0ZXIgaXQgKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8qIFdlIGhhdmUgYSBkZWNpbWFsIHBvaW50LCBidXQgbm8gZm9sbG93aW5nCisgICAgICAgICAgICAgICBkaWdpdC4gIEluc2VydCBhIHplcm8gYWZ0ZXIgdGhlIGRlY2ltYWwuICovCisgICAgICAgICAgICArK3A7CisgICAgICAgICAgICBjaGFyc190b19pbnNlcnQgPSAiMCI7CisgICAgICAgICAgICBpbnNlcnRfY291bnQgPSAxOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBjaGFyc190b19pbnNlcnQgPSAiLjAiOworICAgICAgICBpbnNlcnRfY291bnQgPSAyOworICAgIH0KKyAgICBpZiAoaW5zZXJ0X2NvdW50KSB7CisgICAgICAgIHNpemVfdCBidWZfbGVuID0gc3RybGVuKGJ1ZmZlcik7CisgICAgICAgIGlmIChidWZfbGVuICsgaW5zZXJ0X2NvdW50ICsgMSA+PSBidWZfc2l6ZSkgeworICAgICAgICAgICAgLyogSWYgdGhlcmUgaXMgbm90IGVub3VnaCByb29tIGluIHRoZSBidWZmZXIKKyAgICAgICAgICAgICAgIGZvciB0aGUgYWRkaXRpb25hbCB0ZXh0LCBqdXN0IHNraXAgaXQuICBJdCdzCisgICAgICAgICAgICAgICBub3Qgd29ydGggZ2VuZXJhdGluZyBhbiBlcnJvciBvdmVyLiAqLworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgbWVtbW92ZShwICsgaW5zZXJ0X2NvdW50LCBwLAorICAgICAgICAgICAgICAgIGJ1ZmZlciArIHN0cmxlbihidWZmZXIpIC0gcCArIDEpOworICAgICAgICAgICAgbWVtY3B5KHAsIGNoYXJzX3RvX2luc2VydCwgaW5zZXJ0X2NvdW50KTsKKyAgICAgICAgfQorICAgIH0KIH0KIAogLyogQWRkIHRoZSBsb2NhbGUgc3BlY2lmaWMgZ3JvdXBpbmcgY2hhcmFjdGVycyB0byBidWZmZXIuICBOb3RlCkBAIC0zNDcsMjkgKzM0NywyOSBAQAogUHlfTE9DQUxfSU5MSU5FKGludCkKIGFkZF90aG91c2FuZHNfZ3JvdXBpbmcoY2hhciogYnVmZmVyLCBzaXplX3QgYnVmX3NpemUpCiB7Ci0JUHlfc3NpemVfdCBsZW4gPSBzdHJsZW4oYnVmZmVyKTsKLQlzdHJ1Y3QgbGNvbnYgKmxvY2FsZV9kYXRhID0gbG9jYWxlY29udigpOwotCWNvbnN0IGNoYXIgKmRlY2ltYWxfcG9pbnQgPSBsb2NhbGVfZGF0YS0+ZGVjaW1hbF9wb2ludDsKKyAgICBQeV9zc2l6ZV90IGxlbiA9IHN0cmxlbihidWZmZXIpOworICAgIHN0cnVjdCBsY29udiAqbG9jYWxlX2RhdGEgPSBsb2NhbGVjb252KCk7CisgICAgY29uc3QgY2hhciAqZGVjaW1hbF9wb2ludCA9IGxvY2FsZV9kYXRhLT5kZWNpbWFsX3BvaW50OwogCi0JLyogRmluZCB0aGUgZGVjaW1hbCBwb2ludCwgaWYgYW55LiAgV2UncmUgb25seSBjb25jZXJuZWQKLQkgICBhYm91dCB0aGUgY2hhcmFjdGVycyB0byB0aGUgbGVmdCBvZiB0aGUgZGVjaW1hbCB3aGVuCi0JICAgYWRkaW5nIGdyb3VwaW5nLiAqLwotCWNoYXIgKnAgPSBzdHJzdHIoYnVmZmVyLCBkZWNpbWFsX3BvaW50KTsKLQlpZiAoIXApIHsKLQkJLyogTm8gZGVjaW1hbCwgdXNlIHRoZSBlbnRpcmUgc3RyaW5nLiAqLworICAgIC8qIEZpbmQgdGhlIGRlY2ltYWwgcG9pbnQsIGlmIGFueS4gIFdlJ3JlIG9ubHkgY29uY2VybmVkCisgICAgICAgYWJvdXQgdGhlIGNoYXJhY3RlcnMgdG8gdGhlIGxlZnQgb2YgdGhlIGRlY2ltYWwgd2hlbgorICAgICAgIGFkZGluZyBncm91cGluZy4gKi8KKyAgICBjaGFyICpwID0gc3Ryc3RyKGJ1ZmZlciwgZGVjaW1hbF9wb2ludCk7CisgICAgaWYgKCFwKSB7CisgICAgICAgIC8qIE5vIGRlY2ltYWwsIHVzZSB0aGUgZW50aXJlIHN0cmluZy4gKi8KIAotCQkvKiBJZiBhbnkgZXhwb25lbnQsIGFkanVzdCBwLiAqLwotCQlwID0gc3RycGJyayhidWZmZXIsICJlRSIpOwotCQlpZiAoIXApCi0JCQkvKiBObyBleHBvbmVudCBhbmQgbm8gZGVjaW1hbC4gIFVzZSB0aGUgZW50aXJlCi0JCQkgICBzdHJpbmcuICovCi0JCQlwID0gYnVmZmVyICsgbGVuOwotCX0KLQkvKiBBdCB0aGlzIHBvaW50LCBwIHBvaW50cyBqdXN0IHBhc3QgdGhlIHJpZ2h0LW1vc3QgY2hhcmFjdGVyIHdlCi0JICAgd2FudCB0byBmb3JtYXQuICBXZSBuZWVkIHRvIGFkZCB0aGUgZ3JvdXBpbmcgc3RyaW5nIGZvciB0aGUKLQkgICBjaGFyYWN0ZXJzIGJldHdlZW4gYnVmZmVyIGFuZCBwLiAqLwotCXJldHVybiBfUHlTdHJpbmdfSW5zZXJ0VGhvdXNhbmRzR3JvdXBpbmcoYnVmZmVyLCBsZW4sIHAtYnVmZmVyLAotCQkJCQkJIGJ1Zl9zaXplLCBOVUxMLCAxKTsKKyAgICAgICAgLyogSWYgYW55IGV4cG9uZW50LCBhZGp1c3QgcC4gKi8KKyAgICAgICAgcCA9IHN0cnBicmsoYnVmZmVyLCAiZUUiKTsKKyAgICAgICAgaWYgKCFwKQorICAgICAgICAgICAgLyogTm8gZXhwb25lbnQgYW5kIG5vIGRlY2ltYWwuICBVc2UgdGhlIGVudGlyZQorICAgICAgICAgICAgICAgc3RyaW5nLiAqLworICAgICAgICAgICAgcCA9IGJ1ZmZlciArIGxlbjsKKyAgICB9CisgICAgLyogQXQgdGhpcyBwb2ludCwgcCBwb2ludHMganVzdCBwYXN0IHRoZSByaWdodC1tb3N0IGNoYXJhY3RlciB3ZQorICAgICAgIHdhbnQgdG8gZm9ybWF0LiAgV2UgbmVlZCB0byBhZGQgdGhlIGdyb3VwaW5nIHN0cmluZyBmb3IgdGhlCisgICAgICAgY2hhcmFjdGVycyBiZXR3ZWVuIGJ1ZmZlciBhbmQgcC4gKi8KKyAgICByZXR1cm4gX1B5U3RyaW5nX0luc2VydFRob3VzYW5kc0dyb3VwaW5nKGJ1ZmZlciwgbGVuLCBwLWJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zl9zaXplLCBOVUxMLCAxKTsKIH0KIAogLyogc2VlIEZPUk1BVEJVRkxFTiBpbiB1bmljb2Rlb2JqZWN0LmMgKi8KQEAgLTM4MCwxNCArMzgwLDE0IEBACiAgKiBAYnVmZmVyOiBBIGJ1ZmZlciB0byBwbGFjZSB0aGUgcmVzdWx0aW5nIHN0cmluZyBpbgogICogQGJ1Zl9zaXplOiBUaGUgbGVuZ3RoIG9mIHRoZSBidWZmZXIuCiAgKiBAZm9ybWF0OiBUaGUgcHJpbnRmKCktc3R5bGUgZm9ybWF0IHRvIHVzZSBmb3IgdGhlCi0gKiAgICAgICAgICBjb2RlIHRvIHVzZSBmb3IgY29udmVydGluZy4gCisgKiAgICAgICAgICBjb2RlIHRvIHVzZSBmb3IgY29udmVydGluZy4KICAqIEBkOiBUaGUgI2dkb3VibGUgdG8gY29udmVydAogICoKICAqIENvbnZlcnRzIGEgI2dkb3VibGUgdG8gYSBzdHJpbmcsIHVzaW5nIHRoZSAnLicgYXMKICAqIGRlY2ltYWwgcG9pbnQuIFRvIGZvcm1hdCB0aGUgbnVtYmVyIHlvdSBwYXNzIGluCiAgKiBhIHByaW50ZigpLXN0eWxlIGZvcm1hdCBzdHJpbmcuIEFsbG93ZWQgY29udmVyc2lvbgogICogc3BlY2lmaWVycyBhcmUgJ2UnLCAnRScsICdmJywgJ0YnLCAnZycsICdHJywgYW5kICduJy4KLSAqIAorICoKICAqICduJyBpcyB0aGUgc2FtZSBhcyAnZycsIGV4Y2VwdCBpdCB1c2VzIHRoZSBjdXJyZW50IGxvY2FsZS4KICAqICdaJyBpcyB0aGUgc2FtZSBhcyAnZycsIGV4Y2VwdCBpdCBhbHdheXMgaGFzIGEgZGVjaW1hbCBhbmQKICAqICAgICBhdCBsZWFzdCBvbmUgZGlnaXQgYWZ0ZXIgdGhlIGRlY2ltYWwuCkBAIC0zOTUsOTYgKzM5NSw5NiBAQAogICogUmV0dXJuIHZhbHVlOiBUaGUgcG9pbnRlciB0byB0aGUgYnVmZmVyIHdpdGggdGhlIGNvbnZlcnRlZCBzdHJpbmcuCiAgKiovCiBjaGFyICoKLVB5T1NfYXNjaWlfZm9ybWF0ZChjaGFyICAgICAgICpidWZmZXIsIAotCQkgICBzaXplX3QgICAgICBidWZfc2l6ZSwgCi0JCSAgIGNvbnN0IGNoYXIgKmZvcm1hdCwgCi0JCSAgIGRvdWJsZSAgICAgIGQpCitQeU9TX2FzY2lpX2Zvcm1hdGQoY2hhciAgICAgICAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgIGJ1Zl9zaXplLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICBkb3VibGUgICAgICBkKQogewotCWNoYXIgZm9ybWF0X2NoYXI7Ci0Jc2l6ZV90IGZvcm1hdF9sZW4gPSBzdHJsZW4oZm9ybWF0KTsKKyAgICBjaGFyIGZvcm1hdF9jaGFyOworICAgIHNpemVfdCBmb3JtYXRfbGVuID0gc3RybGVuKGZvcm1hdCk7CiAKLQkvKiBGb3IgdHlwZSAnbicsIHdlIG5lZWQgdG8gbWFrZSBhIGNvcHkgb2YgdGhlIGZvcm1hdCBzdHJpbmcsIGJlY2F1c2UKLQkgICB3ZSdyZSBnb2luZyB0byBtb2RpZnkgJ24nIC0+ICdnJywgYW5kIGZvcm1hdCBpcyBjb25zdCBjaGFyKiwgc28gd2UKLQkgICBjYW4ndCBtb2RpZnkgaXQgZGlyZWN0bHkuICBGTE9BVF9GT1JNQVRCVUZMRU4gc2hvdWxkIGJlIGxvbmdlciB0aGFuCi0JICAgd2UgZXZlciBuZWVkIHRoaXMgdG8gYmUuICBUaGVyZSdzIGFuIHVwY29taW5nIGNoZWNrIHRvIGVuc3VyZSBpdCdzCi0JICAgYmlnIGVub3VnaC4gKi8KLQkvKiBJc3N1ZSAyMjY0OiBjb2RlICdaJyByZXF1aXJlcyBjb3B5aW5nIHRoZSBmb3JtYXQuICAnWicgaXMgJ2cnLCBidXQKLQkgICBhbHNvIHdpdGggYXQgbGVhc3Qgb25lIGNoYXJhY3RlciBwYXN0IHRoZSBkZWNpbWFsLiAqLwotCWNoYXIgdG1wX2Zvcm1hdFtGTE9BVF9GT1JNQVRCVUZMRU5dOworICAgIC8qIEZvciB0eXBlICduJywgd2UgbmVlZCB0byBtYWtlIGEgY29weSBvZiB0aGUgZm9ybWF0IHN0cmluZywgYmVjYXVzZQorICAgICAgIHdlJ3JlIGdvaW5nIHRvIG1vZGlmeSAnbicgLT4gJ2cnLCBhbmQgZm9ybWF0IGlzIGNvbnN0IGNoYXIqLCBzbyB3ZQorICAgICAgIGNhbid0IG1vZGlmeSBpdCBkaXJlY3RseS4gIEZMT0FUX0ZPUk1BVEJVRkxFTiBzaG91bGQgYmUgbG9uZ2VyIHRoYW4KKyAgICAgICB3ZSBldmVyIG5lZWQgdGhpcyB0byBiZS4gIFRoZXJlJ3MgYW4gdXBjb21pbmcgY2hlY2sgdG8gZW5zdXJlIGl0J3MKKyAgICAgICBiaWcgZW5vdWdoLiAqLworICAgIC8qIElzc3VlIDIyNjQ6IGNvZGUgJ1onIHJlcXVpcmVzIGNvcHlpbmcgdGhlIGZvcm1hdC4gICdaJyBpcyAnZycsIGJ1dAorICAgICAgIGFsc28gd2l0aCBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyIHBhc3QgdGhlIGRlY2ltYWwuICovCisgICAgY2hhciB0bXBfZm9ybWF0W0ZMT0FUX0ZPUk1BVEJVRkxFTl07CiAKLQkvKiBUaGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGZvcm1hdCBzdHJpbmcgbXVzdCBiZSB0aGUgZm9ybWF0IGNoYXIgKi8KLQlmb3JtYXRfY2hhciA9IGZvcm1hdFtmb3JtYXRfbGVuIC0gMV07CisgICAgLyogVGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBmb3JtYXQgc3RyaW5nIG11c3QgYmUgdGhlIGZvcm1hdCBjaGFyICovCisgICAgZm9ybWF0X2NoYXIgPSBmb3JtYXRbZm9ybWF0X2xlbiAtIDFdOwogCi0JaWYgKGZvcm1hdFswXSAhPSAnJScpCi0JCXJldHVybiBOVUxMOworICAgIGlmIChmb3JtYXRbMF0gIT0gJyUnKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCS8qIEknbSBub3Qgc3VyZSB3aHkgdGhpcyB0ZXN0IGlzIGhlcmUuICBJdCdzIGVuc3VyaW5nIHRoYXQgdGhlIGZvcm1hdAotCSAgIHN0cmluZyBhZnRlciB0aGUgZmlyc3QgY2hhcmFjdGVyIGRvZXNuJ3QgaGF2ZSBhIHNpbmdsZSBxdW90ZSwgYQotCSAgIGxvd2VyY2FzZSBsLCBvciBhIHBlcmNlbnQuIFRoaXMgaXMgdGhlIHJldmVyc2Ugb2YgdGhlIGNvbW1lbnRlZC1vdXQKLQkgICB0ZXN0IGFib3V0IDEwIGxpbmVzIGFnby4gKi8KLQlpZiAoc3RycGJyayhmb3JtYXQgKyAxLCAiJ2wlIikpCi0JCXJldHVybiBOVUxMOworICAgIC8qIEknbSBub3Qgc3VyZSB3aHkgdGhpcyB0ZXN0IGlzIGhlcmUuICBJdCdzIGVuc3VyaW5nIHRoYXQgdGhlIGZvcm1hdAorICAgICAgIHN0cmluZyBhZnRlciB0aGUgZmlyc3QgY2hhcmFjdGVyIGRvZXNuJ3QgaGF2ZSBhIHNpbmdsZSBxdW90ZSwgYQorICAgICAgIGxvd2VyY2FzZSBsLCBvciBhIHBlcmNlbnQuIFRoaXMgaXMgdGhlIHJldmVyc2Ugb2YgdGhlIGNvbW1lbnRlZC1vdXQKKyAgICAgICB0ZXN0IGFib3V0IDEwIGxpbmVzIGFnby4gKi8KKyAgICBpZiAoc3RycGJyayhmb3JtYXQgKyAxLCAiJ2wlIikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JLyogQWxzbyBjdXJpb3VzIGFib3V0IHRoaXMgZnVuY3Rpb24gaXMgdGhhdCBpdCBhY2NlcHRzIGZvcm1hdCBzdHJpbmdzCi0JICAgbGlrZSAiJXhnIiwgd2hpY2ggYXJlIGludmFsaWQgZm9yIGZsb2F0cy4gIEluIGdlbmVyYWwsIHRoZQotCSAgIGludGVyZmFjZSB0byB0aGlzIGZ1bmN0aW9uIGlzIG5vdCB2ZXJ5IGdvb2QsIGJ1dCBjaGFuZ2luZyBpdCBpcwotCSAgIGRpZmZpY3VsdCBiZWNhdXNlIGl0J3MgYSBwdWJsaWMgQVBJLiAqLworICAgIC8qIEFsc28gY3VyaW91cyBhYm91dCB0aGlzIGZ1bmN0aW9uIGlzIHRoYXQgaXQgYWNjZXB0cyBmb3JtYXQgc3RyaW5ncworICAgICAgIGxpa2UgIiV4ZyIsIHdoaWNoIGFyZSBpbnZhbGlkIGZvciBmbG9hdHMuICBJbiBnZW5lcmFsLCB0aGUKKyAgICAgICBpbnRlcmZhY2UgdG8gdGhpcyBmdW5jdGlvbiBpcyBub3QgdmVyeSBnb29kLCBidXQgY2hhbmdpbmcgaXQgaXMKKyAgICAgICBkaWZmaWN1bHQgYmVjYXVzZSBpdCdzIGEgcHVibGljIEFQSS4gKi8KIAotCWlmICghKGZvcm1hdF9jaGFyID09ICdlJyB8fCBmb3JtYXRfY2hhciA9PSAnRScgfHwgCi0JICAgICAgZm9ybWF0X2NoYXIgPT0gJ2YnIHx8IGZvcm1hdF9jaGFyID09ICdGJyB8fCAKLQkgICAgICBmb3JtYXRfY2hhciA9PSAnZycgfHwgZm9ybWF0X2NoYXIgPT0gJ0cnIHx8Ci0JICAgICAgZm9ybWF0X2NoYXIgPT0gJ24nIHx8IGZvcm1hdF9jaGFyID09ICdaJykpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghKGZvcm1hdF9jaGFyID09ICdlJyB8fCBmb3JtYXRfY2hhciA9PSAnRScgfHwKKyAgICAgICAgICBmb3JtYXRfY2hhciA9PSAnZicgfHwgZm9ybWF0X2NoYXIgPT0gJ0YnIHx8CisgICAgICAgICAgZm9ybWF0X2NoYXIgPT0gJ2cnIHx8IGZvcm1hdF9jaGFyID09ICdHJyB8fAorICAgICAgICAgIGZvcm1hdF9jaGFyID09ICduJyB8fCBmb3JtYXRfY2hhciA9PSAnWicpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCS8qIE1hcCAnbicgb3IgJ1onIGZvcm1hdF9jaGFyIHRvICdnJywgYnkgY29weWluZyB0aGUgZm9ybWF0IHN0cmluZyBhbmQKLQkgICByZXBsYWNpbmcgdGhlIGZpbmFsIGNoYXIgd2l0aCBhICdnJyAqLwotCWlmIChmb3JtYXRfY2hhciA9PSAnbicgfHwgZm9ybWF0X2NoYXIgPT0gJ1onKSB7Ci0JCWlmIChmb3JtYXRfbGVuICsgMSA+PSBzaXplb2YodG1wX2Zvcm1hdCkpIHsKLQkJCS8qIFRoZSBmb3JtYXQgd29uJ3QgZml0IGluIG91ciBjb3B5LiAgRXJyb3Igb3V0LiAgSW4KLQkJCSAgIHByYWN0aWNlLCB0aGlzIHdpbGwgbmV2ZXIgaGFwcGVuIGFuZCB3aWxsIGJlCi0JCQkgICBkZXRlY3RlZCBieSByZXR1cm5pbmcgTlVMTCAqLwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJc3RyY3B5KHRtcF9mb3JtYXQsIGZvcm1hdCk7Ci0JCXRtcF9mb3JtYXRbZm9ybWF0X2xlbiAtIDFdID0gJ2cnOwotCQlmb3JtYXQgPSB0bXBfZm9ybWF0OwotCX0KKyAgICAvKiBNYXAgJ24nIG9yICdaJyBmb3JtYXRfY2hhciB0byAnZycsIGJ5IGNvcHlpbmcgdGhlIGZvcm1hdCBzdHJpbmcgYW5kCisgICAgICAgcmVwbGFjaW5nIHRoZSBmaW5hbCBjaGFyIHdpdGggYSAnZycgKi8KKyAgICBpZiAoZm9ybWF0X2NoYXIgPT0gJ24nIHx8IGZvcm1hdF9jaGFyID09ICdaJykgeworICAgICAgICBpZiAoZm9ybWF0X2xlbiArIDEgPj0gc2l6ZW9mKHRtcF9mb3JtYXQpKSB7CisgICAgICAgICAgICAvKiBUaGUgZm9ybWF0IHdvbid0IGZpdCBpbiBvdXIgY29weS4gIEVycm9yIG91dC4gIEluCisgICAgICAgICAgICAgICBwcmFjdGljZSwgdGhpcyB3aWxsIG5ldmVyIGhhcHBlbiBhbmQgd2lsbCBiZQorICAgICAgICAgICAgICAgZGV0ZWN0ZWQgYnkgcmV0dXJuaW5nIE5VTEwgKi8KKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHN0cmNweSh0bXBfZm9ybWF0LCBmb3JtYXQpOworICAgICAgICB0bXBfZm9ybWF0W2Zvcm1hdF9sZW4gLSAxXSA9ICdnJzsKKyAgICAgICAgZm9ybWF0ID0gdG1wX2Zvcm1hdDsKKyAgICB9CiAKIAotCS8qIEhhdmUgUHlPU19zbnByaW50ZiBkbyB0aGUgaGFyZCB3b3JrICovCi0JUHlPU19zbnByaW50ZihidWZmZXIsIGJ1Zl9zaXplLCBmb3JtYXQsIGQpOworICAgIC8qIEhhdmUgUHlPU19zbnByaW50ZiBkbyB0aGUgaGFyZCB3b3JrICovCisgICAgUHlPU19zbnByaW50ZihidWZmZXIsIGJ1Zl9zaXplLCBmb3JtYXQsIGQpOwogCi0JLyogRG8gdmFyaW91cyBmaXh1cHMgb24gdGhlIHJldHVybiBzdHJpbmcgKi8KKyAgICAvKiBEbyB2YXJpb3VzIGZpeHVwcyBvbiB0aGUgcmV0dXJuIHN0cmluZyAqLwogCi0JLyogR2V0IHRoZSBjdXJyZW50IGxvY2FsZSwgYW5kIGZpbmQgdGhlIGRlY2ltYWwgcG9pbnQgc3RyaW5nLgotCSAgIENvbnZlcnQgdGhhdCBzdHJpbmcgYmFjayB0byBhIGRvdC4gIERvIG5vdCBkbyB0aGlzIGlmIHVzaW5nIHRoZQotCSAgICduJyAobnVtYmVyKSBmb3JtYXQgY29kZSwgc2luY2Ugd2Ugd2FudCB0byBrZWVwIHRoZSBsb2NhbGl6ZWQKLQkgICBkZWNpbWFsIHBvaW50IGluIHRoYXQgY2FzZS4gKi8KLQlpZiAoZm9ybWF0X2NoYXIgIT0gJ24nKQotCQljaGFuZ2VfZGVjaW1hbF9mcm9tX2xvY2FsZV90b19kb3QoYnVmZmVyKTsKKyAgICAvKiBHZXQgdGhlIGN1cnJlbnQgbG9jYWxlLCBhbmQgZmluZCB0aGUgZGVjaW1hbCBwb2ludCBzdHJpbmcuCisgICAgICAgQ29udmVydCB0aGF0IHN0cmluZyBiYWNrIHRvIGEgZG90LiAgRG8gbm90IGRvIHRoaXMgaWYgdXNpbmcgdGhlCisgICAgICAgJ24nIChudW1iZXIpIGZvcm1hdCBjb2RlLCBzaW5jZSB3ZSB3YW50IHRvIGtlZXAgdGhlIGxvY2FsaXplZAorICAgICAgIGRlY2ltYWwgcG9pbnQgaW4gdGhhdCBjYXNlLiAqLworICAgIGlmIChmb3JtYXRfY2hhciAhPSAnbicpCisgICAgICAgIGNoYW5nZV9kZWNpbWFsX2Zyb21fbG9jYWxlX3RvX2RvdChidWZmZXIpOwogCi0JLyogSWYgYW4gZXhwb25lbnQgZXhpc3RzLCBlbnN1cmUgdGhhdCB0aGUgZXhwb25lbnQgaXMgYXQgbGVhc3QKLQkgICBNSU5fRVhQT05FTlRfRElHSVRTIGRpZ2l0cywgcHJvdmlkaW5nIHRoZSBidWZmZXIgaXMgbGFyZ2UgZW5vdWdoCi0JICAgZm9yIHRoZSBleHRyYSB6ZXJvcy4gIEFsc28sIGlmIHRoZXJlIGFyZSBtb3JlIHRoYW4KLQkgICBNSU5fRVhQT05FTlRfRElHSVRTLCByZW1vdmUgYXMgbWFueSB6ZXJvcyBhcyBwb3NzaWJsZSB1bnRpbCB3ZSBnZXQKLQkgICBiYWNrIHRvIE1JTl9FWFBPTkVOVF9ESUdJVFMgKi8KLQllbnN1cmVfbWluaW11bV9leHBvbmVudF9sZW5ndGgoYnVmZmVyLCBidWZfc2l6ZSk7CisgICAgLyogSWYgYW4gZXhwb25lbnQgZXhpc3RzLCBlbnN1cmUgdGhhdCB0aGUgZXhwb25lbnQgaXMgYXQgbGVhc3QKKyAgICAgICBNSU5fRVhQT05FTlRfRElHSVRTIGRpZ2l0cywgcHJvdmlkaW5nIHRoZSBidWZmZXIgaXMgbGFyZ2UgZW5vdWdoCisgICAgICAgZm9yIHRoZSBleHRyYSB6ZXJvcy4gIEFsc28sIGlmIHRoZXJlIGFyZSBtb3JlIHRoYW4KKyAgICAgICBNSU5fRVhQT05FTlRfRElHSVRTLCByZW1vdmUgYXMgbWFueSB6ZXJvcyBhcyBwb3NzaWJsZSB1bnRpbCB3ZSBnZXQKKyAgICAgICBiYWNrIHRvIE1JTl9FWFBPTkVOVF9ESUdJVFMgKi8KKyAgICBlbnN1cmVfbWluaW11bV9leHBvbmVudF9sZW5ndGgoYnVmZmVyLCBidWZfc2l6ZSk7CiAKLQkvKiBJZiBmb3JtYXRfY2hhciBpcyAnWicsIG1ha2Ugc3VyZSB3ZSBoYXZlIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIKLQkgICBhZnRlciB0aGUgZGVjaW1hbCBwb2ludCAoYW5kIG1ha2Ugc3VyZSB3ZSBoYXZlIGEgZGVjaW1hbCBwb2ludCkuICovCi0JaWYgKGZvcm1hdF9jaGFyID09ICdaJykKLQkJZW5zdXJlX2RlY2ltYWxfcG9pbnQoYnVmZmVyLCBidWZfc2l6ZSk7CisgICAgLyogSWYgZm9ybWF0X2NoYXIgaXMgJ1onLCBtYWtlIHN1cmUgd2UgaGF2ZSBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyCisgICAgICAgYWZ0ZXIgdGhlIGRlY2ltYWwgcG9pbnQgKGFuZCBtYWtlIHN1cmUgd2UgaGF2ZSBhIGRlY2ltYWwgcG9pbnQpLiAqLworICAgIGlmIChmb3JtYXRfY2hhciA9PSAnWicpCisgICAgICAgIGVuc3VyZV9kZWNpbWFsX3BvaW50KGJ1ZmZlciwgYnVmX3NpemUpOwogCi0JLyogSWYgZm9ybWF0X2NoYXIgaXMgJ24nLCBhZGQgdGhlIHRob3VzYW5kcyBncm91cGluZy4gKi8KLQlpZiAoZm9ybWF0X2NoYXIgPT0gJ24nKQotCQlpZiAoIWFkZF90aG91c2FuZHNfZ3JvdXBpbmcoYnVmZmVyLCBidWZfc2l6ZSkpCi0JCQlyZXR1cm4gTlVMTDsKKyAgICAvKiBJZiBmb3JtYXRfY2hhciBpcyAnbicsIGFkZCB0aGUgdGhvdXNhbmRzIGdyb3VwaW5nLiAqLworICAgIGlmIChmb3JtYXRfY2hhciA9PSAnbicpCisgICAgICAgIGlmICghYWRkX3Rob3VzYW5kc19ncm91cGluZyhidWZmZXIsIGJ1Zl9zaXplKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogCi0JcmV0dXJuIGJ1ZmZlcjsKKyAgICByZXR1cm4gYnVmZmVyOwogfQogCiBkb3VibGUKIFB5T1NfYXNjaWlfYXRvZihjb25zdCBjaGFyICpucHRyKQogewotCXJldHVybiBQeU9TX2FzY2lpX3N0cnRvZChucHRyLCBOVUxMKTsKKyAgICByZXR1cm4gUHlPU19hc2NpaV9zdHJ0b2QobnB0ciwgTlVMTCk7CiB9CmRpZmYgLS1naXQgYS9QeXRob24vcHl0aG9ucnVuLmMgYi9QeXRob24vcHl0aG9ucnVuLmMKaW5kZXggNjc3NDA0My4uMGFiNzE2NSAxMDA2NDQKLS0tIGEvUHl0aG9uL3B5dGhvbnJ1bi5jCisrKyBiL1B5dGhvbi9weXRob25ydW4uYwpAQCAtNDAsOSArNDAsOSBAQAogI2lmbmRlZiBQeV9SRUZfREVCVUcKICNkZWZpbmUgUFJJTlRfVE9UQUxfUkVGUygpCiAjZWxzZSAvKiBQeV9SRUZfREVCVUcgKi8KLSNkZWZpbmUgUFJJTlRfVE9UQUxfUkVGUygpIGZwcmludGYoc3RkZXJyLAkJCQlcCi0JCQkJICAgIlslIiBQWV9GT1JNQVRfU0laRV9UICJkIHJlZnNdXG4iLAlcCi0JCQkJICAgX1B5X0dldFJlZlRvdGFsKCkpCisjZGVmaW5lIFBSSU5UX1RPVEFMX1JFRlMoKSBmcHJpbnRmKHN0ZGVyciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIlslIiBQWV9GT1JNQVRfU0laRV9UICJkIHJlZnNdXG4iLCAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgX1B5X0dldFJlZlRvdGFsKCkpCiAjZW5kaWYKIAogI2lmZGVmIF9fY3BsdXNwbHVzCkBAIC01Nyw5ICs1Nyw5IEBACiBzdGF0aWMgdm9pZCBpbml0bWFpbih2b2lkKTsKIHN0YXRpYyB2b2lkIGluaXRzaXRlKHZvaWQpOwogc3RhdGljIFB5T2JqZWN0ICpydW5fbW9kKG1vZF90eSwgY29uc3QgY2hhciAqLCBQeU9iamVjdCAqLCBQeU9iamVjdCAqLAotCQkJICBQeUNvbXBpbGVyRmxhZ3MgKiwgUHlBcmVuYSAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlDb21waWxlckZsYWdzICosIFB5QXJlbmEgKik7CiBzdGF0aWMgUHlPYmplY3QgKnJ1bl9weWNfZmlsZShGSUxFICosIGNvbnN0IGNoYXIgKiwgUHlPYmplY3QgKiwgUHlPYmplY3QgKiwKLQkJCSAgICAgIFB5Q29tcGlsZXJGbGFncyAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5Q29tcGlsZXJGbGFncyAqKTsKIHN0YXRpYyB2b2lkIGVycl9pbnB1dChwZXJyZGV0YWlsICopOwogc3RhdGljIHZvaWQgaW5pdHNpZ3Modm9pZCk7CiBzdGF0aWMgdm9pZCB3YWl0X2Zvcl90aHJlYWRfc2h1dGRvd24odm9pZCk7CkBAIC05NSw3ICs5NSw3IEBACiBQeU9iamVjdCAqCiBQeU1vZHVsZV9HZXRXYXJuaW5nc01vZHVsZSh2b2lkKQogewotCXJldHVybiBQeUltcG9ydF9JbXBvcnRNb2R1bGUoIndhcm5pbmdzIik7CisgICAgcmV0dXJuIFB5SW1wb3J0X0ltcG9ydE1vZHVsZSgid2FybmluZ3MiKTsKIH0KIAogc3RhdGljIGludCBpbml0aWFsaXplZCA9IDA7CkBAIC0xMDUsNyArMTA1LDcgQEAKIGludAogUHlfSXNJbml0aWFsaXplZCh2b2lkKQogewotCXJldHVybiBpbml0aWFsaXplZDsKKyAgICByZXR1cm4gaW5pdGlhbGl6ZWQ7CiB9CiAKIC8qIEdsb2JhbCBpbml0aWFsaXphdGlvbnMuICBDYW4gYmUgdW5kb25lIGJ5IFB5X0ZpbmFsaXplKCkuICBEb24ndApAQCAtMTIzLDI0OCArMTIzLDI0OCBAQAogc3RhdGljIGludAogYWRkX2ZsYWcoaW50IGZsYWcsIGNvbnN0IGNoYXIgKmVudnMpCiB7Ci0JaW50IGVudiA9IGF0b2koZW52cyk7Ci0JaWYgKGZsYWcgPCBlbnYpCi0JCWZsYWcgPSBlbnY7Ci0JaWYgKGZsYWcgPCAxKQotCQlmbGFnID0gMTsKLQlyZXR1cm4gZmxhZzsKKyAgICBpbnQgZW52ID0gYXRvaShlbnZzKTsKKyAgICBpZiAoZmxhZyA8IGVudikKKyAgICAgICAgZmxhZyA9IGVudjsKKyAgICBpZiAoZmxhZyA8IDEpCisgICAgICAgIGZsYWcgPSAxOworICAgIHJldHVybiBmbGFnOwogfQogCiB2b2lkCiBQeV9Jbml0aWFsaXplRXgoaW50IGluc3RhbGxfc2lncykKIHsKLQlQeUludGVycHJldGVyU3RhdGUgKmludGVycDsKLQlQeVRocmVhZFN0YXRlICp0c3RhdGU7Ci0JUHlPYmplY3QgKmJpbW9kLCAqc3lzbW9kOwotCWNoYXIgKnA7Ci0JY2hhciAqaWNvZGVzZXQgPSBOVUxMOyAvKiBPbiBXaW5kb3dzLCBpbnB1dCBjb2Rlc2V0IG1heSB0aGVvcmV0aWNhbGx5IAotCQkJICAgICAgICAgIGRpZmZlciBmcm9tIG91dHB1dCBjb2Rlc2V0LiAqLwotCWNoYXIgKmNvZGVzZXQgPSBOVUxMOwotCWNoYXIgKmVycm9ycyA9IE5VTEw7Ci0JaW50IGZyZWVfY29kZXNldCA9IDA7Ci0JaW50IG92ZXJyaWRkZW4gPSAwOwotCVB5T2JqZWN0ICpzeXNfc3RyZWFtLCAqc3lzX2lzYXR0eTsKKyAgICBQeUludGVycHJldGVyU3RhdGUgKmludGVycDsKKyAgICBQeVRocmVhZFN0YXRlICp0c3RhdGU7CisgICAgUHlPYmplY3QgKmJpbW9kLCAqc3lzbW9kOworICAgIGNoYXIgKnA7CisgICAgY2hhciAqaWNvZGVzZXQgPSBOVUxMOyAvKiBPbiBXaW5kb3dzLCBpbnB1dCBjb2Rlc2V0IG1heSB0aGVvcmV0aWNhbGx5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmZXIgZnJvbSBvdXRwdXQgY29kZXNldC4gKi8KKyAgICBjaGFyICpjb2Rlc2V0ID0gTlVMTDsKKyAgICBjaGFyICplcnJvcnMgPSBOVUxMOworICAgIGludCBmcmVlX2NvZGVzZXQgPSAwOworICAgIGludCBvdmVycmlkZGVuID0gMDsKKyAgICBQeU9iamVjdCAqc3lzX3N0cmVhbSwgKnN5c19pc2F0dHk7CiAjaWYgZGVmaW5lZChQeV9VU0lOR19VTklDT0RFKSAmJiBkZWZpbmVkKEhBVkVfTEFOR0lORk9fSCkgJiYgZGVmaW5lZChDT0RFU0VUKQotCWNoYXIgKnNhdmVkX2xvY2FsZSwgKmxvY19jb2Rlc2V0OworICAgIGNoYXIgKnNhdmVkX2xvY2FsZSwgKmxvY19jb2Rlc2V0OwogI2VuZGlmCiAjaWZkZWYgTVNfV0lORE9XUwotCWNoYXIgaWJ1ZlsxMjhdOwotCWNoYXIgYnVmWzEyOF07CisgICAgY2hhciBpYnVmWzEyOF07CisgICAgY2hhciBidWZbMTI4XTsKICNlbmRpZgotCWV4dGVybiB2b2lkIF9QeV9SZWFkeVR5cGVzKHZvaWQpOworICAgIGV4dGVybiB2b2lkIF9QeV9SZWFkeVR5cGVzKHZvaWQpOwogCi0JaWYgKGluaXRpYWxpemVkKQotCQlyZXR1cm47Ci0JaW5pdGlhbGl6ZWQgPSAxOworICAgIGlmIChpbml0aWFsaXplZCkKKyAgICAgICAgcmV0dXJuOworICAgIGluaXRpYWxpemVkID0gMTsKIAotCWlmICgocCA9IFB5X0dFVEVOVigiUFlUSE9OREVCVUciKSkgJiYgKnAgIT0gJ1wwJykKLQkJUHlfRGVidWdGbGFnID0gYWRkX2ZsYWcoUHlfRGVidWdGbGFnLCBwKTsKLQlpZiAoKHAgPSBQeV9HRVRFTlYoIlBZVEhPTlZFUkJPU0UiKSkgJiYgKnAgIT0gJ1wwJykKLQkJUHlfVmVyYm9zZUZsYWcgPSBhZGRfZmxhZyhQeV9WZXJib3NlRmxhZywgcCk7Ci0JaWYgKChwID0gUHlfR0VURU5WKCJQWVRIT05PUFRJTUlaRSIpKSAmJiAqcCAhPSAnXDAnKQotCQlQeV9PcHRpbWl6ZUZsYWcgPSBhZGRfZmxhZyhQeV9PcHRpbWl6ZUZsYWcsIHApOwotCWlmICgocCA9IFB5X0dFVEVOVigiUFlUSE9ORE9OVFdSSVRFQllURUNPREUiKSkgJiYgKnAgIT0gJ1wwJykKLQkJUHlfRG9udFdyaXRlQnl0ZWNvZGVGbGFnID0gYWRkX2ZsYWcoUHlfRG9udFdyaXRlQnl0ZWNvZGVGbGFnLCBwKTsKKyAgICBpZiAoKHAgPSBQeV9HRVRFTlYoIlBZVEhPTkRFQlVHIikpICYmICpwICE9ICdcMCcpCisgICAgICAgIFB5X0RlYnVnRmxhZyA9IGFkZF9mbGFnKFB5X0RlYnVnRmxhZywgcCk7CisgICAgaWYgKChwID0gUHlfR0VURU5WKCJQWVRIT05WRVJCT1NFIikpICYmICpwICE9ICdcMCcpCisgICAgICAgIFB5X1ZlcmJvc2VGbGFnID0gYWRkX2ZsYWcoUHlfVmVyYm9zZUZsYWcsIHApOworICAgIGlmICgocCA9IFB5X0dFVEVOVigiUFlUSE9OT1BUSU1JWkUiKSkgJiYgKnAgIT0gJ1wwJykKKyAgICAgICAgUHlfT3B0aW1pemVGbGFnID0gYWRkX2ZsYWcoUHlfT3B0aW1pemVGbGFnLCBwKTsKKyAgICBpZiAoKHAgPSBQeV9HRVRFTlYoIlBZVEhPTkRPTlRXUklURUJZVEVDT0RFIikpICYmICpwICE9ICdcMCcpCisgICAgICAgIFB5X0RvbnRXcml0ZUJ5dGVjb2RlRmxhZyA9IGFkZF9mbGFnKFB5X0RvbnRXcml0ZUJ5dGVjb2RlRmxhZywgcCk7CiAKLQlpbnRlcnAgPSBQeUludGVycHJldGVyU3RhdGVfTmV3KCk7Ci0JaWYgKGludGVycCA9PSBOVUxMKQotCQlQeV9GYXRhbEVycm9yKCJQeV9Jbml0aWFsaXplOiBjYW4ndCBtYWtlIGZpcnN0IGludGVycHJldGVyIik7CisgICAgaW50ZXJwID0gUHlJbnRlcnByZXRlclN0YXRlX05ldygpOworICAgIGlmIChpbnRlcnAgPT0gTlVMTCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiUHlfSW5pdGlhbGl6ZTogY2FuJ3QgbWFrZSBmaXJzdCBpbnRlcnByZXRlciIpOwogCi0JdHN0YXRlID0gUHlUaHJlYWRTdGF0ZV9OZXcoaW50ZXJwKTsKLQlpZiAodHN0YXRlID09IE5VTEwpCi0JCVB5X0ZhdGFsRXJyb3IoIlB5X0luaXRpYWxpemU6IGNhbid0IG1ha2UgZmlyc3QgdGhyZWFkIik7Ci0JKHZvaWQpIFB5VGhyZWFkU3RhdGVfU3dhcCh0c3RhdGUpOworICAgIHRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfTmV3KGludGVycCk7CisgICAgaWYgKHRzdGF0ZSA9PSBOVUxMKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJQeV9Jbml0aWFsaXplOiBjYW4ndCBtYWtlIGZpcnN0IHRocmVhZCIpOworICAgICh2b2lkKSBQeVRocmVhZFN0YXRlX1N3YXAodHN0YXRlKTsKIAotCV9QeV9SZWFkeVR5cGVzKCk7CisgICAgX1B5X1JlYWR5VHlwZXMoKTsKIAotCWlmICghX1B5RnJhbWVfSW5pdCgpKQotCQlQeV9GYXRhbEVycm9yKCJQeV9Jbml0aWFsaXplOiBjYW4ndCBpbml0IGZyYW1lcyIpOworICAgIGlmICghX1B5RnJhbWVfSW5pdCgpKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJQeV9Jbml0aWFsaXplOiBjYW4ndCBpbml0IGZyYW1lcyIpOwogCi0JaWYgKCFfUHlJbnRfSW5pdCgpKQotCQlQeV9GYXRhbEVycm9yKCJQeV9Jbml0aWFsaXplOiBjYW4ndCBpbml0IGludHMiKTsKKyAgICBpZiAoIV9QeUludF9Jbml0KCkpCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIlB5X0luaXRpYWxpemU6IGNhbid0IGluaXQgaW50cyIpOwogCi0JaWYgKCFQeUJ5dGVBcnJheV9Jbml0KCkpCi0JCVB5X0ZhdGFsRXJyb3IoIlB5X0luaXRpYWxpemU6IGNhbid0IGluaXQgYnl0ZWFycmF5Iik7CisgICAgaWYgKCFQeUJ5dGVBcnJheV9Jbml0KCkpCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIlB5X0luaXRpYWxpemU6IGNhbid0IGluaXQgYnl0ZWFycmF5Iik7CiAKLQlfUHlGbG9hdF9Jbml0KCk7CisgICAgX1B5RmxvYXRfSW5pdCgpOwogCi0JaW50ZXJwLT5tb2R1bGVzID0gUHlEaWN0X05ldygpOwotCWlmIChpbnRlcnAtPm1vZHVsZXMgPT0gTlVMTCkKLQkJUHlfRmF0YWxFcnJvcigiUHlfSW5pdGlhbGl6ZTogY2FuJ3QgbWFrZSBtb2R1bGVzIGRpY3Rpb25hcnkiKTsKLQlpbnRlcnAtPm1vZHVsZXNfcmVsb2FkaW5nID0gUHlEaWN0X05ldygpOwotCWlmIChpbnRlcnAtPm1vZHVsZXNfcmVsb2FkaW5nID09IE5VTEwpCi0JCVB5X0ZhdGFsRXJyb3IoIlB5X0luaXRpYWxpemU6IGNhbid0IG1ha2UgbW9kdWxlc19yZWxvYWRpbmcgZGljdGlvbmFyeSIpOworICAgIGludGVycC0+bW9kdWxlcyA9IFB5RGljdF9OZXcoKTsKKyAgICBpZiAoaW50ZXJwLT5tb2R1bGVzID09IE5VTEwpCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIlB5X0luaXRpYWxpemU6IGNhbid0IG1ha2UgbW9kdWxlcyBkaWN0aW9uYXJ5Iik7CisgICAgaW50ZXJwLT5tb2R1bGVzX3JlbG9hZGluZyA9IFB5RGljdF9OZXcoKTsKKyAgICBpZiAoaW50ZXJwLT5tb2R1bGVzX3JlbG9hZGluZyA9PSBOVUxMKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJQeV9Jbml0aWFsaXplOiBjYW4ndCBtYWtlIG1vZHVsZXNfcmVsb2FkaW5nIGRpY3Rpb25hcnkiKTsKIAogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQkvKiBJbml0IFVuaWNvZGUgaW1wbGVtZW50YXRpb247IHJlbGllcyBvbiB0aGUgY29kZWMgcmVnaXN0cnkgKi8KLQlfUHlVbmljb2RlX0luaXQoKTsKKyAgICAvKiBJbml0IFVuaWNvZGUgaW1wbGVtZW50YXRpb247IHJlbGllcyBvbiB0aGUgY29kZWMgcmVnaXN0cnkgKi8KKyAgICBfUHlVbmljb2RlX0luaXQoKTsKICNlbmRpZgogCi0JYmltb2QgPSBfUHlCdWlsdGluX0luaXQoKTsKLQlpZiAoYmltb2QgPT0gTlVMTCkKLQkJUHlfRmF0YWxFcnJvcigiUHlfSW5pdGlhbGl6ZTogY2FuJ3QgaW5pdGlhbGl6ZSBfX2J1aWx0aW5fXyIpOwotCWludGVycC0+YnVpbHRpbnMgPSBQeU1vZHVsZV9HZXREaWN0KGJpbW9kKTsKLQlpZiAoaW50ZXJwLT5idWlsdGlucyA9PSBOVUxMKQotCQlQeV9GYXRhbEVycm9yKCJQeV9Jbml0aWFsaXplOiBjYW4ndCBpbml0aWFsaXplIGJ1aWx0aW5zIGRpY3QiKTsKLQlQeV9JTkNSRUYoaW50ZXJwLT5idWlsdGlucyk7CisgICAgYmltb2QgPSBfUHlCdWlsdGluX0luaXQoKTsKKyAgICBpZiAoYmltb2QgPT0gTlVMTCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiUHlfSW5pdGlhbGl6ZTogY2FuJ3QgaW5pdGlhbGl6ZSBfX2J1aWx0aW5fXyIpOworICAgIGludGVycC0+YnVpbHRpbnMgPSBQeU1vZHVsZV9HZXREaWN0KGJpbW9kKTsKKyAgICBpZiAoaW50ZXJwLT5idWlsdGlucyA9PSBOVUxMKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJQeV9Jbml0aWFsaXplOiBjYW4ndCBpbml0aWFsaXplIGJ1aWx0aW5zIGRpY3QiKTsKKyAgICBQeV9JTkNSRUYoaW50ZXJwLT5idWlsdGlucyk7CiAKLQlzeXNtb2QgPSBfUHlTeXNfSW5pdCgpOwotCWlmIChzeXNtb2QgPT0gTlVMTCkKLQkJUHlfRmF0YWxFcnJvcigiUHlfSW5pdGlhbGl6ZTogY2FuJ3QgaW5pdGlhbGl6ZSBzeXMiKTsKLQlpbnRlcnAtPnN5c2RpY3QgPSBQeU1vZHVsZV9HZXREaWN0KHN5c21vZCk7Ci0JaWYgKGludGVycC0+c3lzZGljdCA9PSBOVUxMKQotCQlQeV9GYXRhbEVycm9yKCJQeV9Jbml0aWFsaXplOiBjYW4ndCBpbml0aWFsaXplIHN5cyBkaWN0Iik7Ci0JUHlfSU5DUkVGKGludGVycC0+c3lzZGljdCk7Ci0JX1B5SW1wb3J0X0ZpeHVwRXh0ZW5zaW9uKCJzeXMiLCAic3lzIik7Ci0JUHlTeXNfU2V0UGF0aChQeV9HZXRQYXRoKCkpOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKGludGVycC0+c3lzZGljdCwgIm1vZHVsZXMiLAotCQkJICAgICBpbnRlcnAtPm1vZHVsZXMpOworICAgIHN5c21vZCA9IF9QeVN5c19Jbml0KCk7CisgICAgaWYgKHN5c21vZCA9PSBOVUxMKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJQeV9Jbml0aWFsaXplOiBjYW4ndCBpbml0aWFsaXplIHN5cyIpOworICAgIGludGVycC0+c3lzZGljdCA9IFB5TW9kdWxlX0dldERpY3Qoc3lzbW9kKTsKKyAgICBpZiAoaW50ZXJwLT5zeXNkaWN0ID09IE5VTEwpCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIlB5X0luaXRpYWxpemU6IGNhbid0IGluaXRpYWxpemUgc3lzIGRpY3QiKTsKKyAgICBQeV9JTkNSRUYoaW50ZXJwLT5zeXNkaWN0KTsKKyAgICBfUHlJbXBvcnRfRml4dXBFeHRlbnNpb24oInN5cyIsICJzeXMiKTsKKyAgICBQeVN5c19TZXRQYXRoKFB5X0dldFBhdGgoKSk7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoaW50ZXJwLT5zeXNkaWN0LCAibW9kdWxlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJwLT5tb2R1bGVzKTsKIAotCV9QeUltcG9ydF9Jbml0KCk7CisgICAgX1B5SW1wb3J0X0luaXQoKTsKIAotCS8qIGluaXRpYWxpemUgYnVpbHRpbiBleGNlcHRpb25zICovCi0JX1B5RXhjX0luaXQoKTsKLQlfUHlJbXBvcnRfRml4dXBFeHRlbnNpb24oImV4Y2VwdGlvbnMiLCAiZXhjZXB0aW9ucyIpOworICAgIC8qIGluaXRpYWxpemUgYnVpbHRpbiBleGNlcHRpb25zICovCisgICAgX1B5RXhjX0luaXQoKTsKKyAgICBfUHlJbXBvcnRfRml4dXBFeHRlbnNpb24oImV4Y2VwdGlvbnMiLCAiZXhjZXB0aW9ucyIpOwogCi0JLyogcGhhc2UgMiBvZiBidWlsdGlucyAqLwotCV9QeUltcG9ydF9GaXh1cEV4dGVuc2lvbigiX19idWlsdGluX18iLCAiX19idWlsdGluX18iKTsKKyAgICAvKiBwaGFzZSAyIG9mIGJ1aWx0aW5zICovCisgICAgX1B5SW1wb3J0X0ZpeHVwRXh0ZW5zaW9uKCJfX2J1aWx0aW5fXyIsICJfX2J1aWx0aW5fXyIpOwogCi0JX1B5SW1wb3J0SG9va3NfSW5pdCgpOworICAgIF9QeUltcG9ydEhvb2tzX0luaXQoKTsKIAotCWlmIChpbnN0YWxsX3NpZ3MpCi0JCWluaXRzaWdzKCk7IC8qIFNpZ25hbCBoYW5kbGluZyBzdHVmZiwgaW5jbHVkaW5nIGluaXRpbnRyKCkgKi8KLQkJCi0JLyogSW5pdGlhbGl6ZSB3YXJuaW5ncy4gKi8KLQlfUHlXYXJuaW5nc19Jbml0KCk7Ci0JaWYgKFB5U3lzX0hhc1dhcm5PcHRpb25zKCkpIHsKLQkJUHlPYmplY3QgKndhcm5pbmdzX21vZHVsZSA9IFB5SW1wb3J0X0ltcG9ydE1vZHVsZSgid2FybmluZ3MiKTsKLQkJaWYgKCF3YXJuaW5nc19tb2R1bGUpCi0JCQlQeUVycl9DbGVhcigpOwotCQlQeV9YREVDUkVGKHdhcm5pbmdzX21vZHVsZSk7Ci0JfQorICAgIGlmIChpbnN0YWxsX3NpZ3MpCisgICAgICAgIGluaXRzaWdzKCk7IC8qIFNpZ25hbCBoYW5kbGluZyBzdHVmZiwgaW5jbHVkaW5nIGluaXRpbnRyKCkgKi8KIAotCWluaXRtYWluKCk7IC8qIE1vZHVsZSBfX21haW5fXyAqLworICAgIC8qIEluaXRpYWxpemUgd2FybmluZ3MuICovCisgICAgX1B5V2FybmluZ3NfSW5pdCgpOworICAgIGlmIChQeVN5c19IYXNXYXJuT3B0aW9ucygpKSB7CisgICAgICAgIFB5T2JqZWN0ICp3YXJuaW5nc19tb2R1bGUgPSBQeUltcG9ydF9JbXBvcnRNb2R1bGUoIndhcm5pbmdzIik7CisgICAgICAgIGlmICghd2FybmluZ3NfbW9kdWxlKQorICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgUHlfWERFQ1JFRih3YXJuaW5nc19tb2R1bGUpOworICAgIH0KIAotCS8qIGF1dG8tdGhyZWFkLXN0YXRlIEFQSSwgaWYgYXZhaWxhYmxlICovCisgICAgaW5pdG1haW4oKTsgLyogTW9kdWxlIF9fbWFpbl9fICovCisKKyAgICAvKiBhdXRvLXRocmVhZC1zdGF0ZSBBUEksIGlmIGF2YWlsYWJsZSAqLwogI2lmZGVmIFdJVEhfVEhSRUFECi0JX1B5R0lMU3RhdGVfSW5pdChpbnRlcnAsIHRzdGF0ZSk7CisgICAgX1B5R0lMU3RhdGVfSW5pdChpbnRlcnAsIHRzdGF0ZSk7CiAjZW5kaWYgLyogV0lUSF9USFJFQUQgKi8KIAotCWlmICghUHlfTm9TaXRlRmxhZykKLQkJaW5pdHNpdGUoKTsgLyogTW9kdWxlIHNpdGUgKi8KKyAgICBpZiAoIVB5X05vU2l0ZUZsYWcpCisgICAgICAgIGluaXRzaXRlKCk7IC8qIE1vZHVsZSBzaXRlICovCiAKLQlpZiAoKHAgPSBQeV9HRVRFTlYoIlBZVEhPTklPRU5DT0RJTkciKSkgJiYgKnAgIT0gJ1wwJykgewotCQlwID0gaWNvZGVzZXQgPSBjb2Rlc2V0ID0gc3RyZHVwKHApOwotCQlmcmVlX2NvZGVzZXQgPSAxOwotCQllcnJvcnMgPSBzdHJjaHIocCwgJzonKTsKLQkJaWYgKGVycm9ycykgewotCQkJKmVycm9ycyA9ICdcMCc7Ci0JCQllcnJvcnMrKzsKLQkJfQotCQlvdmVycmlkZGVuID0gMTsKLQl9CisgICAgaWYgKChwID0gUHlfR0VURU5WKCJQWVRIT05JT0VOQ09ESU5HIikpICYmICpwICE9ICdcMCcpIHsKKyAgICAgICAgcCA9IGljb2Rlc2V0ID0gY29kZXNldCA9IHN0cmR1cChwKTsKKyAgICAgICAgZnJlZV9jb2Rlc2V0ID0gMTsKKyAgICAgICAgZXJyb3JzID0gc3RyY2hyKHAsICc6Jyk7CisgICAgICAgIGlmIChlcnJvcnMpIHsKKyAgICAgICAgICAgICplcnJvcnMgPSAnXDAnOworICAgICAgICAgICAgZXJyb3JzKys7CisgICAgICAgIH0KKyAgICAgICAgb3ZlcnJpZGRlbiA9IDE7CisgICAgfQogCiAjaWYgZGVmaW5lZChQeV9VU0lOR19VTklDT0RFKSAmJiBkZWZpbmVkKEhBVkVfTEFOR0lORk9fSCkgJiYgZGVmaW5lZChDT0RFU0VUKQotCS8qIE9uIFVuaXgsIHNldCB0aGUgZmlsZSBzeXN0ZW0gZW5jb2RpbmcgYWNjb3JkaW5nIHRvIHRoZQotCSAgIHVzZXIncyBwcmVmZXJlbmNlLCBpZiB0aGUgQ09ERVNFVCBuYW1lcyBhIHdlbGwta25vd24KLQkgICBQeXRob24gY29kZWMsIGFuZCBQeV9GaWxlU3lzdGVtRGVmYXVsdEVuY29kaW5nIGlzbid0Ci0JICAgaW5pdGlhbGl6ZWQgYnkgb3RoZXIgbWVhbnMuIEFsc28gc2V0IHRoZSBlbmNvZGluZyBvZgotCSAgIHN0ZGluIGFuZCBzdGRvdXQgaWYgdGhlc2UgYXJlIHRlcm1pbmFscywgdW5sZXNzIG92ZXJyaWRkZW4uICAqLworICAgIC8qIE9uIFVuaXgsIHNldCB0aGUgZmlsZSBzeXN0ZW0gZW5jb2RpbmcgYWNjb3JkaW5nIHRvIHRoZQorICAgICAgIHVzZXIncyBwcmVmZXJlbmNlLCBpZiB0aGUgQ09ERVNFVCBuYW1lcyBhIHdlbGwta25vd24KKyAgICAgICBQeXRob24gY29kZWMsIGFuZCBQeV9GaWxlU3lzdGVtRGVmYXVsdEVuY29kaW5nIGlzbid0CisgICAgICAgaW5pdGlhbGl6ZWQgYnkgb3RoZXIgbWVhbnMuIEFsc28gc2V0IHRoZSBlbmNvZGluZyBvZgorICAgICAgIHN0ZGluIGFuZCBzdGRvdXQgaWYgdGhlc2UgYXJlIHRlcm1pbmFscywgdW5sZXNzIG92ZXJyaWRkZW4uICAqLwogCi0JaWYgKCFvdmVycmlkZGVuIHx8ICFQeV9GaWxlU3lzdGVtRGVmYXVsdEVuY29kaW5nKSB7Ci0JCXNhdmVkX2xvY2FsZSA9IHN0cmR1cChzZXRsb2NhbGUoTENfQ1RZUEUsIE5VTEwpKTsKLQkJc2V0bG9jYWxlKExDX0NUWVBFLCAiIik7Ci0JCWxvY19jb2Rlc2V0ID0gbmxfbGFuZ2luZm8oQ09ERVNFVCk7Ci0JCWlmIChsb2NfY29kZXNldCAmJiAqbG9jX2NvZGVzZXQpIHsKLQkJCVB5T2JqZWN0ICplbmMgPSBQeUNvZGVjX0VuY29kZXIobG9jX2NvZGVzZXQpOwotCQkJaWYgKGVuYykgewotCQkJCWxvY19jb2Rlc2V0ID0gc3RyZHVwKGxvY19jb2Rlc2V0KTsKLQkJCQlQeV9ERUNSRUYoZW5jKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfTG9va3VwRXJyb3IpKSB7Ci0JCQkJCVB5RXJyX0NsZWFyKCk7Ci0JCQkJCWxvY19jb2Rlc2V0ID0gTlVMTDsKLQkJCQl9IGVsc2UgewotCQkJCQlQeUVycl9QcmludCgpOwotCQkJCQlleGl0KDEpOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlCi0JCQlsb2NfY29kZXNldCA9IE5VTEw7Ci0JCXNldGxvY2FsZShMQ19DVFlQRSwgc2F2ZWRfbG9jYWxlKTsKLQkJZnJlZShzYXZlZF9sb2NhbGUpOworICAgIGlmICghb3ZlcnJpZGRlbiB8fCAhUHlfRmlsZVN5c3RlbURlZmF1bHRFbmNvZGluZykgeworICAgICAgICBzYXZlZF9sb2NhbGUgPSBzdHJkdXAoc2V0bG9jYWxlKExDX0NUWVBFLCBOVUxMKSk7CisgICAgICAgIHNldGxvY2FsZShMQ19DVFlQRSwgIiIpOworICAgICAgICBsb2NfY29kZXNldCA9IG5sX2xhbmdpbmZvKENPREVTRVQpOworICAgICAgICBpZiAobG9jX2NvZGVzZXQgJiYgKmxvY19jb2Rlc2V0KSB7CisgICAgICAgICAgICBQeU9iamVjdCAqZW5jID0gUHlDb2RlY19FbmNvZGVyKGxvY19jb2Rlc2V0KTsKKyAgICAgICAgICAgIGlmIChlbmMpIHsKKyAgICAgICAgICAgICAgICBsb2NfY29kZXNldCA9IHN0cmR1cChsb2NfY29kZXNldCk7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGVuYyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0xvb2t1cEVycm9yKSkgeworICAgICAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgICAgICAgICBsb2NfY29kZXNldCA9IE5VTEw7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgUHlFcnJfUHJpbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgbG9jX2NvZGVzZXQgPSBOVUxMOworICAgICAgICBzZXRsb2NhbGUoTENfQ1RZUEUsIHNhdmVkX2xvY2FsZSk7CisgICAgICAgIGZyZWUoc2F2ZWRfbG9jYWxlKTsKIAotCQlpZiAoIW92ZXJyaWRkZW4pIHsKLQkJCWNvZGVzZXQgPSBpY29kZXNldCA9IGxvY19jb2Rlc2V0OwotCQkJZnJlZV9jb2Rlc2V0ID0gMTsKLQkJfQorICAgICAgICBpZiAoIW92ZXJyaWRkZW4pIHsKKyAgICAgICAgICAgIGNvZGVzZXQgPSBpY29kZXNldCA9IGxvY19jb2Rlc2V0OworICAgICAgICAgICAgZnJlZV9jb2Rlc2V0ID0gMTsKKyAgICAgICAgfQogCi0JCS8qIEluaXRpYWxpemUgUHlfRmlsZVN5c3RlbURlZmF1bHRFbmNvZGluZyBmcm9tCi0JCSAgIGxvY2FsZSBldmVuIGlmIFBZVEhPTklPRU5DT0RJTkcgaXMgc2V0LiAqLwotCQlpZiAoIVB5X0ZpbGVTeXN0ZW1EZWZhdWx0RW5jb2RpbmcpIHsKLQkJCVB5X0ZpbGVTeXN0ZW1EZWZhdWx0RW5jb2RpbmcgPSBsb2NfY29kZXNldDsKLQkJCWlmICghb3ZlcnJpZGRlbikKLQkJCQlmcmVlX2NvZGVzZXQgPSAwOwotCQl9Ci0JfQorICAgICAgICAvKiBJbml0aWFsaXplIFB5X0ZpbGVTeXN0ZW1EZWZhdWx0RW5jb2RpbmcgZnJvbQorICAgICAgICAgICBsb2NhbGUgZXZlbiBpZiBQWVRIT05JT0VOQ09ESU5HIGlzIHNldC4gKi8KKyAgICAgICAgaWYgKCFQeV9GaWxlU3lzdGVtRGVmYXVsdEVuY29kaW5nKSB7CisgICAgICAgICAgICBQeV9GaWxlU3lzdGVtRGVmYXVsdEVuY29kaW5nID0gbG9jX2NvZGVzZXQ7CisgICAgICAgICAgICBpZiAoIW92ZXJyaWRkZW4pCisgICAgICAgICAgICAgICAgZnJlZV9jb2Rlc2V0ID0gMDsKKyAgICAgICAgfQorICAgIH0KICNlbmRpZgogCiAjaWZkZWYgTVNfV0lORE9XUwotCWlmICghb3ZlcnJpZGRlbikgewotCQlpY29kZXNldCA9IGlidWY7Ci0JCWNvZGVzZXQgPSBidWY7Ci0JCXNwcmludGYoaWJ1ZiwgImNwJWQiLCBHZXRDb25zb2xlQ1AoKSk7Ci0JCXNwcmludGYoYnVmLCAiY3AlZCIsIEdldENvbnNvbGVPdXRwdXRDUCgpKTsKLQl9CisgICAgaWYgKCFvdmVycmlkZGVuKSB7CisgICAgICAgIGljb2Rlc2V0ID0gaWJ1ZjsKKyAgICAgICAgY29kZXNldCA9IGJ1ZjsKKyAgICAgICAgc3ByaW50ZihpYnVmLCAiY3AlZCIsIEdldENvbnNvbGVDUCgpKTsKKyAgICAgICAgc3ByaW50ZihidWYsICJjcCVkIiwgR2V0Q29uc29sZU91dHB1dENQKCkpOworICAgIH0KICNlbmRpZgogCi0JaWYgKGNvZGVzZXQpIHsKLQkJc3lzX3N0cmVhbSA9IFB5U3lzX0dldE9iamVjdCgic3RkaW4iKTsKLQkJc3lzX2lzYXR0eSA9IFB5T2JqZWN0X0NhbGxNZXRob2Qoc3lzX3N0cmVhbSwgImlzYXR0eSIsICIiKTsKLQkJaWYgKCFzeXNfaXNhdHR5KQotCQkJUHlFcnJfQ2xlYXIoKTsKLQkJaWYgKChvdmVycmlkZGVuIHx8Ci0JCSAgICAgKHN5c19pc2F0dHkgJiYgUHlPYmplY3RfSXNUcnVlKHN5c19pc2F0dHkpKSkgJiYKLQkJICAgUHlGaWxlX0NoZWNrKHN5c19zdHJlYW0pKSB7Ci0JCQlpZiAoIVB5RmlsZV9TZXRFbmNvZGluZ0FuZEVycm9ycyhzeXNfc3RyZWFtLCBpY29kZXNldCwgZXJyb3JzKSkKLQkJCQlQeV9GYXRhbEVycm9yKCJDYW5ub3Qgc2V0IGNvZGVzZXQgb2Ygc3RkaW4iKTsKLQkJfQotCQlQeV9YREVDUkVGKHN5c19pc2F0dHkpOworICAgIGlmIChjb2Rlc2V0KSB7CisgICAgICAgIHN5c19zdHJlYW0gPSBQeVN5c19HZXRPYmplY3QoInN0ZGluIik7CisgICAgICAgIHN5c19pc2F0dHkgPSBQeU9iamVjdF9DYWxsTWV0aG9kKHN5c19zdHJlYW0sICJpc2F0dHkiLCAiIik7CisgICAgICAgIGlmICghc3lzX2lzYXR0eSkKKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIGlmICgob3ZlcnJpZGRlbiB8fAorICAgICAgICAgICAgIChzeXNfaXNhdHR5ICYmIFB5T2JqZWN0X0lzVHJ1ZShzeXNfaXNhdHR5KSkpICYmCisgICAgICAgICAgIFB5RmlsZV9DaGVjayhzeXNfc3RyZWFtKSkgeworICAgICAgICAgICAgaWYgKCFQeUZpbGVfU2V0RW5jb2RpbmdBbmRFcnJvcnMoc3lzX3N0cmVhbSwgaWNvZGVzZXQsIGVycm9ycykpCisgICAgICAgICAgICAgICAgUHlfRmF0YWxFcnJvcigiQ2Fubm90IHNldCBjb2Rlc2V0IG9mIHN0ZGluIik7CisgICAgICAgIH0KKyAgICAgICAgUHlfWERFQ1JFRihzeXNfaXNhdHR5KTsKIAotCQlzeXNfc3RyZWFtID0gUHlTeXNfR2V0T2JqZWN0KCJzdGRvdXQiKTsKLQkJc3lzX2lzYXR0eSA9IFB5T2JqZWN0X0NhbGxNZXRob2Qoc3lzX3N0cmVhbSwgImlzYXR0eSIsICIiKTsKLQkJaWYgKCFzeXNfaXNhdHR5KQotCQkJUHlFcnJfQ2xlYXIoKTsKLQkJaWYgKChvdmVycmlkZGVuIHx8IAotCQkgICAgIChzeXNfaXNhdHR5ICYmIFB5T2JqZWN0X0lzVHJ1ZShzeXNfaXNhdHR5KSkpICYmCi0JCSAgIFB5RmlsZV9DaGVjayhzeXNfc3RyZWFtKSkgewotCQkJaWYgKCFQeUZpbGVfU2V0RW5jb2RpbmdBbmRFcnJvcnMoc3lzX3N0cmVhbSwgY29kZXNldCwgZXJyb3JzKSkKLQkJCQlQeV9GYXRhbEVycm9yKCJDYW5ub3Qgc2V0IGNvZGVzZXQgb2Ygc3Rkb3V0Iik7Ci0JCX0KLQkJUHlfWERFQ1JFRihzeXNfaXNhdHR5KTsKKyAgICAgICAgc3lzX3N0cmVhbSA9IFB5U3lzX0dldE9iamVjdCgic3Rkb3V0Iik7CisgICAgICAgIHN5c19pc2F0dHkgPSBQeU9iamVjdF9DYWxsTWV0aG9kKHN5c19zdHJlYW0sICJpc2F0dHkiLCAiIik7CisgICAgICAgIGlmICghc3lzX2lzYXR0eSkKKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIGlmICgob3ZlcnJpZGRlbiB8fAorICAgICAgICAgICAgIChzeXNfaXNhdHR5ICYmIFB5T2JqZWN0X0lzVHJ1ZShzeXNfaXNhdHR5KSkpICYmCisgICAgICAgICAgIFB5RmlsZV9DaGVjayhzeXNfc3RyZWFtKSkgeworICAgICAgICAgICAgaWYgKCFQeUZpbGVfU2V0RW5jb2RpbmdBbmRFcnJvcnMoc3lzX3N0cmVhbSwgY29kZXNldCwgZXJyb3JzKSkKKyAgICAgICAgICAgICAgICBQeV9GYXRhbEVycm9yKCJDYW5ub3Qgc2V0IGNvZGVzZXQgb2Ygc3Rkb3V0Iik7CisgICAgICAgIH0KKyAgICAgICAgUHlfWERFQ1JFRihzeXNfaXNhdHR5KTsKIAotCQlzeXNfc3RyZWFtID0gUHlTeXNfR2V0T2JqZWN0KCJzdGRlcnIiKTsKLQkJc3lzX2lzYXR0eSA9IFB5T2JqZWN0X0NhbGxNZXRob2Qoc3lzX3N0cmVhbSwgImlzYXR0eSIsICIiKTsKLQkJaWYgKCFzeXNfaXNhdHR5KQotCQkJUHlFcnJfQ2xlYXIoKTsKLQkJaWYoKG92ZXJyaWRkZW4gfHwgCi0JCSAgICAoc3lzX2lzYXR0eSAmJiBQeU9iamVjdF9Jc1RydWUoc3lzX2lzYXR0eSkpKSAmJgotCQkgICBQeUZpbGVfQ2hlY2soc3lzX3N0cmVhbSkpIHsKLQkJCWlmICghUHlGaWxlX1NldEVuY29kaW5nQW5kRXJyb3JzKHN5c19zdHJlYW0sIGNvZGVzZXQsIGVycm9ycykpCi0JCQkJUHlfRmF0YWxFcnJvcigiQ2Fubm90IHNldCBjb2Rlc2V0IG9mIHN0ZGVyciIpOwotCQl9Ci0JCVB5X1hERUNSRUYoc3lzX2lzYXR0eSk7CisgICAgICAgIHN5c19zdHJlYW0gPSBQeVN5c19HZXRPYmplY3QoInN0ZGVyciIpOworICAgICAgICBzeXNfaXNhdHR5ID0gUHlPYmplY3RfQ2FsbE1ldGhvZChzeXNfc3RyZWFtLCAiaXNhdHR5IiwgIiIpOworICAgICAgICBpZiAoIXN5c19pc2F0dHkpCisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBpZigob3ZlcnJpZGRlbiB8fAorICAgICAgICAgICAgKHN5c19pc2F0dHkgJiYgUHlPYmplY3RfSXNUcnVlKHN5c19pc2F0dHkpKSkgJiYKKyAgICAgICAgICAgUHlGaWxlX0NoZWNrKHN5c19zdHJlYW0pKSB7CisgICAgICAgICAgICBpZiAoIVB5RmlsZV9TZXRFbmNvZGluZ0FuZEVycm9ycyhzeXNfc3RyZWFtLCBjb2Rlc2V0LCBlcnJvcnMpKQorICAgICAgICAgICAgICAgIFB5X0ZhdGFsRXJyb3IoIkNhbm5vdCBzZXQgY29kZXNldCBvZiBzdGRlcnIiKTsKKyAgICAgICAgfQorICAgICAgICBQeV9YREVDUkVGKHN5c19pc2F0dHkpOwogCi0JCWlmIChmcmVlX2NvZGVzZXQpCi0JCQlmcmVlKGNvZGVzZXQpOwotCX0KKyAgICAgICAgaWYgKGZyZWVfY29kZXNldCkKKyAgICAgICAgICAgIGZyZWUoY29kZXNldCk7CisgICAgfQogfQogCiB2b2lkCiBQeV9Jbml0aWFsaXplKHZvaWQpCiB7Ci0JUHlfSW5pdGlhbGl6ZUV4KDEpOworICAgIFB5X0luaXRpYWxpemVFeCgxKTsKIH0KIAogCkBAIC0zODksMTU5ICszODksMTU5IEBACiB2b2lkCiBQeV9GaW5hbGl6ZSh2b2lkKQogewotCVB5SW50ZXJwcmV0ZXJTdGF0ZSAqaW50ZXJwOwotCVB5VGhyZWFkU3RhdGUgKnRzdGF0ZTsKKyAgICBQeUludGVycHJldGVyU3RhdGUgKmludGVycDsKKyAgICBQeVRocmVhZFN0YXRlICp0c3RhdGU7CiAKLQlpZiAoIWluaXRpYWxpemVkKQotCQlyZXR1cm47CisgICAgaWYgKCFpbml0aWFsaXplZCkKKyAgICAgICAgcmV0dXJuOwogCi0Jd2FpdF9mb3JfdGhyZWFkX3NodXRkb3duKCk7CisgICAgd2FpdF9mb3JfdGhyZWFkX3NodXRkb3duKCk7CiAKLQkvKiBUaGUgaW50ZXJwcmV0ZXIgaXMgc3RpbGwgZW50aXJlbHkgaW50YWN0IGF0IHRoaXMgcG9pbnQsIGFuZCB0aGUKLQkgKiBleGl0IGZ1bmNzIG1heSBiZSByZWx5aW5nIG9uIHRoYXQuICBJbiBwYXJ0aWN1bGFyLCBpZiBzb21lIHRocmVhZAotCSAqIG9yIGV4aXQgZnVuYyBpcyBzdGlsbCB3YWl0aW5nIHRvIGRvIGFuIGltcG9ydCwgdGhlIGltcG9ydCBtYWNoaW5lcnkKLQkgKiBleHBlY3RzIFB5X0lzSW5pdGlhbGl6ZWQoKSB0byByZXR1cm4gdHJ1ZS4gIFNvIGRvbid0IHNheSB0aGUKLQkgKiBpbnRlcnByZXRlciBpcyB1bmluaXRpYWxpemVkIHVudGlsIGFmdGVyIHRoZSBleGl0IGZ1bmNzIGhhdmUgcnVuLgotCSAqIE5vdGUgdGhhdCBUaHJlYWRpbmcucHkgdXNlcyBhbiBleGl0IGZ1bmMgdG8gZG8gYSBqb2luIG9uIGFsbCB0aGUKLQkgKiB0aHJlYWRzIGNyZWF0ZWQgdGhydSBpdCwgc28gdGhpcyBhbHNvIHByb3RlY3RzIHBlbmRpbmcgaW1wb3J0cyBpbgotCSAqIHRoZSB0aHJlYWRzIGNyZWF0ZWQgdmlhIFRocmVhZGluZy4KLQkgKi8KLQljYWxsX3N5c19leGl0ZnVuYygpOwotCWluaXRpYWxpemVkID0gMDsKKyAgICAvKiBUaGUgaW50ZXJwcmV0ZXIgaXMgc3RpbGwgZW50aXJlbHkgaW50YWN0IGF0IHRoaXMgcG9pbnQsIGFuZCB0aGUKKyAgICAgKiBleGl0IGZ1bmNzIG1heSBiZSByZWx5aW5nIG9uIHRoYXQuICBJbiBwYXJ0aWN1bGFyLCBpZiBzb21lIHRocmVhZAorICAgICAqIG9yIGV4aXQgZnVuYyBpcyBzdGlsbCB3YWl0aW5nIHRvIGRvIGFuIGltcG9ydCwgdGhlIGltcG9ydCBtYWNoaW5lcnkKKyAgICAgKiBleHBlY3RzIFB5X0lzSW5pdGlhbGl6ZWQoKSB0byByZXR1cm4gdHJ1ZS4gIFNvIGRvbid0IHNheSB0aGUKKyAgICAgKiBpbnRlcnByZXRlciBpcyB1bmluaXRpYWxpemVkIHVudGlsIGFmdGVyIHRoZSBleGl0IGZ1bmNzIGhhdmUgcnVuLgorICAgICAqIE5vdGUgdGhhdCBUaHJlYWRpbmcucHkgdXNlcyBhbiBleGl0IGZ1bmMgdG8gZG8gYSBqb2luIG9uIGFsbCB0aGUKKyAgICAgKiB0aHJlYWRzIGNyZWF0ZWQgdGhydSBpdCwgc28gdGhpcyBhbHNvIHByb3RlY3RzIHBlbmRpbmcgaW1wb3J0cyBpbgorICAgICAqIHRoZSB0aHJlYWRzIGNyZWF0ZWQgdmlhIFRocmVhZGluZy4KKyAgICAgKi8KKyAgICBjYWxsX3N5c19leGl0ZnVuYygpOworICAgIGluaXRpYWxpemVkID0gMDsKIAotCS8qIEdldCBjdXJyZW50IHRocmVhZCBzdGF0ZSBhbmQgaW50ZXJwcmV0ZXIgcG9pbnRlciAqLwotCXRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfR0VUKCk7Ci0JaW50ZXJwID0gdHN0YXRlLT5pbnRlcnA7CisgICAgLyogR2V0IGN1cnJlbnQgdGhyZWFkIHN0YXRlIGFuZCBpbnRlcnByZXRlciBwb2ludGVyICovCisgICAgdHN0YXRlID0gUHlUaHJlYWRTdGF0ZV9HRVQoKTsKKyAgICBpbnRlcnAgPSB0c3RhdGUtPmludGVycDsKIAotCS8qIERpc2FibGUgc2lnbmFsIGhhbmRsaW5nICovCi0JUHlPU19GaW5pSW50ZXJydXB0cygpOworICAgIC8qIERpc2FibGUgc2lnbmFsIGhhbmRsaW5nICovCisgICAgUHlPU19GaW5pSW50ZXJydXB0cygpOwogCi0JLyogQ2xlYXIgdHlwZSBsb29rdXAgY2FjaGUgKi8KLQlQeVR5cGVfQ2xlYXJDYWNoZSgpOworICAgIC8qIENsZWFyIHR5cGUgbG9va3VwIGNhY2hlICovCisgICAgUHlUeXBlX0NsZWFyQ2FjaGUoKTsKIAotCS8qIENvbGxlY3QgZ2FyYmFnZS4gIFRoaXMgbWF5IGNhbGwgZmluYWxpemVyczsgaXQncyBuaWNlIHRvIGNhbGwgdGhlc2UKLQkgKiBiZWZvcmUgYWxsIG1vZHVsZXMgYXJlIGRlc3Ryb3llZC4KLQkgKiBYWFggSWYgYSBfX2RlbF9fIG9yIHdlYWtyZWYgY2FsbGJhY2sgaXMgdHJpZ2dlcmVkIGhlcmUsIGFuZCB0cmllcyB0bwotCSAqIFhYWCBpbXBvcnQgYSBtb2R1bGUsIGJhZCB0aGluZ3MgY2FuIGhhcHBlbiwgYmVjYXVzZSBQeXRob24gbm8KLQkgKiBYWFggbG9uZ2VyIGJlbGlldmVzIGl0J3MgaW5pdGlhbGl6ZWQuCi0JICogWFhYICAgICBGYXRhbCBQeXRob24gZXJyb3I6IEludGVycHJldGVyIG5vdCBpbml0aWFsaXplZCAodmVyc2lvbiBtaXNtYXRjaD8pCi0JICogWFhYIGlzIGVhc3kgdG8gcHJvdm9rZSB0aGF0IHdheS4gIEkndmUgYWxzbyBzZWVuLCBlLmcuLAotCSAqIFhYWCAgICAgRXhjZXB0aW9uIGV4Y2VwdGlvbnMuSW1wb3J0RXJyb3I6ICdObyBtb2R1bGUgbmFtZWQgc2hhJwotCSAqIFhYWCAgICAgICAgIGluIDxmdW5jdGlvbiBjYWxsYmFjayBhdCAweDAwOEY1NzE4PiBpZ25vcmVkCi0JICogWFhYIGJ1dCBJJ20gdW5jbGVhciBvbiBleGFjdGx5IGhvdyB0aGF0IG9uZSBoYXBwZW5zLiAgSW4gYW55IGNhc2UsCi0JICogWFhYIEkgaGF2ZW4ndCBzZWVuIGEgcmVhbC1saWZlIHJlcG9ydCBvZiBlaXRoZXIgb2YgdGhlc2UuCi0JICovCi0JUHlHQ19Db2xsZWN0KCk7CisgICAgLyogQ29sbGVjdCBnYXJiYWdlLiAgVGhpcyBtYXkgY2FsbCBmaW5hbGl6ZXJzOyBpdCdzIG5pY2UgdG8gY2FsbCB0aGVzZQorICAgICAqIGJlZm9yZSBhbGwgbW9kdWxlcyBhcmUgZGVzdHJveWVkLgorICAgICAqIFhYWCBJZiBhIF9fZGVsX18gb3Igd2Vha3JlZiBjYWxsYmFjayBpcyB0cmlnZ2VyZWQgaGVyZSwgYW5kIHRyaWVzIHRvCisgICAgICogWFhYIGltcG9ydCBhIG1vZHVsZSwgYmFkIHRoaW5ncyBjYW4gaGFwcGVuLCBiZWNhdXNlIFB5dGhvbiBubworICAgICAqIFhYWCBsb25nZXIgYmVsaWV2ZXMgaXQncyBpbml0aWFsaXplZC4KKyAgICAgKiBYWFggICAgIEZhdGFsIFB5dGhvbiBlcnJvcjogSW50ZXJwcmV0ZXIgbm90IGluaXRpYWxpemVkICh2ZXJzaW9uIG1pc21hdGNoPykKKyAgICAgKiBYWFggaXMgZWFzeSB0byBwcm92b2tlIHRoYXQgd2F5LiAgSSd2ZSBhbHNvIHNlZW4sIGUuZy4sCisgICAgICogWFhYICAgICBFeGNlcHRpb24gZXhjZXB0aW9ucy5JbXBvcnRFcnJvcjogJ05vIG1vZHVsZSBuYW1lZCBzaGEnCisgICAgICogWFhYICAgICAgICAgaW4gPGZ1bmN0aW9uIGNhbGxiYWNrIGF0IDB4MDA4RjU3MTg+IGlnbm9yZWQKKyAgICAgKiBYWFggYnV0IEknbSB1bmNsZWFyIG9uIGV4YWN0bHkgaG93IHRoYXQgb25lIGhhcHBlbnMuICBJbiBhbnkgY2FzZSwKKyAgICAgKiBYWFggSSBoYXZlbid0IHNlZW4gYSByZWFsLWxpZmUgcmVwb3J0IG9mIGVpdGhlciBvZiB0aGVzZS4KKyAgICAgKi8KKyAgICBQeUdDX0NvbGxlY3QoKTsKICNpZmRlZiBDT1VOVF9BTExPQ1MKLQkvKiBXaXRoIENPVU5UX0FMTE9DUywgaXQgaGVscHMgdG8gcnVuIEdDIG11bHRpcGxlIHRpbWVzOgotCSAgIGVhY2ggY29sbGVjdGlvbiBtaWdodCByZWxlYXNlIHNvbWUgdHlwZXMgZnJvbSB0aGUgdHlwZQotCSAgIGxpc3QsIHNvIHRoZXkgYmVjb21lIGdhcmJhZ2UuICovCi0Jd2hpbGUgKFB5R0NfQ29sbGVjdCgpID4gMCkKLQkJLyogbm90aGluZyAqLzsKKyAgICAvKiBXaXRoIENPVU5UX0FMTE9DUywgaXQgaGVscHMgdG8gcnVuIEdDIG11bHRpcGxlIHRpbWVzOgorICAgICAgIGVhY2ggY29sbGVjdGlvbiBtaWdodCByZWxlYXNlIHNvbWUgdHlwZXMgZnJvbSB0aGUgdHlwZQorICAgICAgIGxpc3QsIHNvIHRoZXkgYmVjb21lIGdhcmJhZ2UuICovCisgICAgd2hpbGUgKFB5R0NfQ29sbGVjdCgpID4gMCkKKyAgICAgICAgLyogbm90aGluZyAqLzsKICNlbmRpZgogCi0JLyogRGVzdHJveSBhbGwgbW9kdWxlcyAqLwotCVB5SW1wb3J0X0NsZWFudXAoKTsKKyAgICAvKiBEZXN0cm95IGFsbCBtb2R1bGVzICovCisgICAgUHlJbXBvcnRfQ2xlYW51cCgpOwogCi0JLyogQ29sbGVjdCBmaW5hbCBnYXJiYWdlLiAgVGhpcyBkaXNwb3NlcyBvZiBjeWNsZXMgY3JlYXRlZCBieQotCSAqIG5ldy1zdHlsZSBjbGFzcyBkZWZpbml0aW9ucywgZm9yIGV4YW1wbGUuCi0JICogWFhYIFRoaXMgaXMgZGlzYWJsZWQgYmVjYXVzZSBpdCBjYXVzZWQgdG9vIG1hbnkgcHJvYmxlbXMuICBJZgotCSAqIFhYWCBhIF9fZGVsX18gb3Igd2Vha3JlZiBjYWxsYmFjayB0cmlnZ2VycyBoZXJlLCBQeXRob24gY29kZSBoYXMKLQkgKiBYWFggYSBoYXJkIHRpbWUgcnVubmluZywgYmVjYXVzZSBldmVuIHRoZSBzeXMgbW9kdWxlIGhhcyBiZWVuCi0JICogWFhYIGNsZWFyZWQgb3V0IChzeXMuc3Rkb3V0IGlzIGdvbmUsIHN5cy5leGNlcHRob29rIGlzIGdvbmUsIGV0YykuCi0JICogWFhYIE9uZSBzeW1wdG9tIGlzIGEgc2VxdWVuY2Ugb2YgaW5mb3JtYXRpb24tZnJlZSBtZXNzYWdlcwotCSAqIFhYWCBjb21pbmcgZnJvbSB0aHJlYWRzIChpZiBhIF9fZGVsX18gb3IgY2FsbGJhY2sgaXMgaW52b2tlZCwKLQkgKiBYWFggb3RoZXIgdGhyZWFkcyBjYW4gZXhlY3V0ZSB0b28sIGFuZCBhbnkgZXhjZXB0aW9uIHRoZXkgZW5jb3VudGVyCi0JICogWFhYIHRyaWdnZXJzIGEgY29tZWR5IG9mIGVycm9ycyBhcyBzdWJzeXN0ZW0gYWZ0ZXIgc3Vic3lzdGVtCi0JICogWFhYIGZhaWxzIHRvIGZpbmQgd2hhdCBpdCAqZXhwZWN0cyogdG8gZmluZCBpbiBzeXMgdG8gaGVscCByZXBvcnQKLQkgKiBYWFggdGhlIGV4Y2VwdGlvbiBhbmQgY29uc2VxdWVudCB1bmV4cGVjdGVkIGZhaWx1cmVzKS4gIEkndmUgYWxzbwotCSAqIFhYWCBzZWVuIHNlZ2ZhdWx0cyB0aGVuLCBhZnRlciBhZGRpbmcgcHJpbnQgc3RhdGVtZW50cyB0byB0aGUKLQkgKiBYWFggUHl0aG9uIGNvZGUgZ2V0dGluZyBjYWxsZWQuCi0JICovCisgICAgLyogQ29sbGVjdCBmaW5hbCBnYXJiYWdlLiAgVGhpcyBkaXNwb3NlcyBvZiBjeWNsZXMgY3JlYXRlZCBieQorICAgICAqIG5ldy1zdHlsZSBjbGFzcyBkZWZpbml0aW9ucywgZm9yIGV4YW1wbGUuCisgICAgICogWFhYIFRoaXMgaXMgZGlzYWJsZWQgYmVjYXVzZSBpdCBjYXVzZWQgdG9vIG1hbnkgcHJvYmxlbXMuICBJZgorICAgICAqIFhYWCBhIF9fZGVsX18gb3Igd2Vha3JlZiBjYWxsYmFjayB0cmlnZ2VycyBoZXJlLCBQeXRob24gY29kZSBoYXMKKyAgICAgKiBYWFggYSBoYXJkIHRpbWUgcnVubmluZywgYmVjYXVzZSBldmVuIHRoZSBzeXMgbW9kdWxlIGhhcyBiZWVuCisgICAgICogWFhYIGNsZWFyZWQgb3V0IChzeXMuc3Rkb3V0IGlzIGdvbmUsIHN5cy5leGNlcHRob29rIGlzIGdvbmUsIGV0YykuCisgICAgICogWFhYIE9uZSBzeW1wdG9tIGlzIGEgc2VxdWVuY2Ugb2YgaW5mb3JtYXRpb24tZnJlZSBtZXNzYWdlcworICAgICAqIFhYWCBjb21pbmcgZnJvbSB0aHJlYWRzIChpZiBhIF9fZGVsX18gb3IgY2FsbGJhY2sgaXMgaW52b2tlZCwKKyAgICAgKiBYWFggb3RoZXIgdGhyZWFkcyBjYW4gZXhlY3V0ZSB0b28sIGFuZCBhbnkgZXhjZXB0aW9uIHRoZXkgZW5jb3VudGVyCisgICAgICogWFhYIHRyaWdnZXJzIGEgY29tZWR5IG9mIGVycm9ycyBhcyBzdWJzeXN0ZW0gYWZ0ZXIgc3Vic3lzdGVtCisgICAgICogWFhYIGZhaWxzIHRvIGZpbmQgd2hhdCBpdCAqZXhwZWN0cyogdG8gZmluZCBpbiBzeXMgdG8gaGVscCByZXBvcnQKKyAgICAgKiBYWFggdGhlIGV4Y2VwdGlvbiBhbmQgY29uc2VxdWVudCB1bmV4cGVjdGVkIGZhaWx1cmVzKS4gIEkndmUgYWxzbworICAgICAqIFhYWCBzZWVuIHNlZ2ZhdWx0cyB0aGVuLCBhZnRlciBhZGRpbmcgcHJpbnQgc3RhdGVtZW50cyB0byB0aGUKKyAgICAgKiBYWFggUHl0aG9uIGNvZGUgZ2V0dGluZyBjYWxsZWQuCisgICAgICovCiAjaWYgMAotCVB5R0NfQ29sbGVjdCgpOworICAgIFB5R0NfQ29sbGVjdCgpOwogI2VuZGlmCiAKLQkvKiBEZXN0cm95IHRoZSBkYXRhYmFzZSB1c2VkIGJ5IF9QeUltcG9ydF97Rml4dXAsRmluZH1FeHRlbnNpb24gKi8KLQlfUHlJbXBvcnRfRmluaSgpOworICAgIC8qIERlc3Ryb3kgdGhlIGRhdGFiYXNlIHVzZWQgYnkgX1B5SW1wb3J0X3tGaXh1cCxGaW5kfUV4dGVuc2lvbiAqLworICAgIF9QeUltcG9ydF9GaW5pKCk7CiAKLQkvKiBEZWJ1Z2dpbmcgc3R1ZmYgKi8KKyAgICAvKiBEZWJ1Z2dpbmcgc3R1ZmYgKi8KICNpZmRlZiBDT1VOVF9BTExPQ1MKLQlkdW1wX2NvdW50cyhzdGRvdXQpOworICAgIGR1bXBfY291bnRzKHN0ZG91dCk7CiAjZW5kaWYKIAotCVBSSU5UX1RPVEFMX1JFRlMoKTsKKyAgICBQUklOVF9UT1RBTF9SRUZTKCk7CiAKICNpZmRlZiBQeV9UUkFDRV9SRUZTCi0JLyogRGlzcGxheSBhbGwgb2JqZWN0cyBzdGlsbCBhbGl2ZSAtLSB0aGlzIGNhbiBpbnZva2UgYXJiaXRyYXJ5Ci0JICogX19yZXByX18gb3ZlcnJpZGVzLCBzbyByZXF1aXJlcyBhIG1vc3RseS1pbnRhY3QgaW50ZXJwcmV0ZXIuCi0JICogQWxhcywgYSBsb3Qgb2Ygc3R1ZmYgbWF5IHN0aWxsIGJlIGFsaXZlIG5vdyB0aGF0IHdpbGwgYmUgY2xlYW5lZAotCSAqIHVwIGxhdGVyLgotCSAqLwotCWlmIChQeV9HRVRFTlYoIlBZVEhPTkRVTVBSRUZTIikpCi0JCV9QeV9QcmludFJlZmVyZW5jZXMoc3RkZXJyKTsKKyAgICAvKiBEaXNwbGF5IGFsbCBvYmplY3RzIHN0aWxsIGFsaXZlIC0tIHRoaXMgY2FuIGludm9rZSBhcmJpdHJhcnkKKyAgICAgKiBfX3JlcHJfXyBvdmVycmlkZXMsIHNvIHJlcXVpcmVzIGEgbW9zdGx5LWludGFjdCBpbnRlcnByZXRlci4KKyAgICAgKiBBbGFzLCBhIGxvdCBvZiBzdHVmZiBtYXkgc3RpbGwgYmUgYWxpdmUgbm93IHRoYXQgd2lsbCBiZSBjbGVhbmVkCisgICAgICogdXAgbGF0ZXIuCisgICAgICovCisgICAgaWYgKFB5X0dFVEVOVigiUFlUSE9ORFVNUFJFRlMiKSkKKyAgICAgICAgX1B5X1ByaW50UmVmZXJlbmNlcyhzdGRlcnIpOwogI2VuZGlmIC8qIFB5X1RSQUNFX1JFRlMgKi8KIAotCS8qIENsZWFyIGludGVycHJldGVyIHN0YXRlICovCi0JUHlJbnRlcnByZXRlclN0YXRlX0NsZWFyKGludGVycCk7CisgICAgLyogQ2xlYXIgaW50ZXJwcmV0ZXIgc3RhdGUgKi8KKyAgICBQeUludGVycHJldGVyU3RhdGVfQ2xlYXIoaW50ZXJwKTsKIAotCS8qIE5vdyB3ZSBkZWNyZWYgdGhlIGV4Y2VwdGlvbiBjbGFzc2VzLiAgQWZ0ZXIgdGhpcyBwb2ludCBub3RoaW5nCi0JICAgY2FuIHJhaXNlIGFuIGV4Y2VwdGlvbi4gIFRoYXQncyBva2F5LCBiZWNhdXNlIGVhY2ggRmluaSgpIG1ldGhvZAotCSAgIGJlbG93IGhhcyBiZWVuIGNoZWNrZWQgdG8gbWFrZSBzdXJlIG5vIGV4Y2VwdGlvbnMgYXJlIGV2ZXIKLQkgICByYWlzZWQuCi0JKi8KKyAgICAvKiBOb3cgd2UgZGVjcmVmIHRoZSBleGNlcHRpb24gY2xhc3Nlcy4gIEFmdGVyIHRoaXMgcG9pbnQgbm90aGluZworICAgICAgIGNhbiByYWlzZSBhbiBleGNlcHRpb24uICBUaGF0J3Mgb2theSwgYmVjYXVzZSBlYWNoIEZpbmkoKSBtZXRob2QKKyAgICAgICBiZWxvdyBoYXMgYmVlbiBjaGVja2VkIHRvIG1ha2Ugc3VyZSBubyBleGNlcHRpb25zIGFyZSBldmVyCisgICAgICAgcmFpc2VkLgorICAgICovCiAKLQlfUHlFeGNfRmluaSgpOworICAgIF9QeUV4Y19GaW5pKCk7CiAKLQkvKiBDbGVhbnVwIGF1dG8tdGhyZWFkLXN0YXRlICovCisgICAgLyogQ2xlYW51cCBhdXRvLXRocmVhZC1zdGF0ZSAqLwogI2lmZGVmIFdJVEhfVEhSRUFECi0JX1B5R0lMU3RhdGVfRmluaSgpOworICAgIF9QeUdJTFN0YXRlX0ZpbmkoKTsKICNlbmRpZiAvKiBXSVRIX1RIUkVBRCAqLwogCi0JLyogRGVsZXRlIGN1cnJlbnQgdGhyZWFkICovCi0JUHlUaHJlYWRTdGF0ZV9Td2FwKE5VTEwpOwotCVB5SW50ZXJwcmV0ZXJTdGF0ZV9EZWxldGUoaW50ZXJwKTsKKyAgICAvKiBEZWxldGUgY3VycmVudCB0aHJlYWQgKi8KKyAgICBQeVRocmVhZFN0YXRlX1N3YXAoTlVMTCk7CisgICAgUHlJbnRlcnByZXRlclN0YXRlX0RlbGV0ZShpbnRlcnApOwogCi0JLyogU3VuZHJ5IGZpbmFsaXplcnMgKi8KLQlQeU1ldGhvZF9GaW5pKCk7Ci0JUHlGcmFtZV9GaW5pKCk7Ci0JUHlDRnVuY3Rpb25fRmluaSgpOwotCVB5VHVwbGVfRmluaSgpOwotCVB5TGlzdF9GaW5pKCk7Ci0JUHlTZXRfRmluaSgpOwotCVB5U3RyaW5nX0ZpbmkoKTsKLQlQeUJ5dGVBcnJheV9GaW5pKCk7Ci0JUHlJbnRfRmluaSgpOwotCVB5RmxvYXRfRmluaSgpOwotCVB5RGljdF9GaW5pKCk7CisgICAgLyogU3VuZHJ5IGZpbmFsaXplcnMgKi8KKyAgICBQeU1ldGhvZF9GaW5pKCk7CisgICAgUHlGcmFtZV9GaW5pKCk7CisgICAgUHlDRnVuY3Rpb25fRmluaSgpOworICAgIFB5VHVwbGVfRmluaSgpOworICAgIFB5TGlzdF9GaW5pKCk7CisgICAgUHlTZXRfRmluaSgpOworICAgIFB5U3RyaW5nX0ZpbmkoKTsKKyAgICBQeUJ5dGVBcnJheV9GaW5pKCk7CisgICAgUHlJbnRfRmluaSgpOworICAgIFB5RmxvYXRfRmluaSgpOworICAgIFB5RGljdF9GaW5pKCk7CiAKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JLyogQ2xlYW51cCBVbmljb2RlIGltcGxlbWVudGF0aW9uICovCi0JX1B5VW5pY29kZV9GaW5pKCk7CisgICAgLyogQ2xlYW51cCBVbmljb2RlIGltcGxlbWVudGF0aW9uICovCisgICAgX1B5VW5pY29kZV9GaW5pKCk7CiAjZW5kaWYKIAotCS8qIFhYWCBTdGlsbCBhbGxvY2F0ZWQ6Ci0JICAgLSB2YXJpb3VzIHN0YXRpYyBhZC1ob2MgcG9pbnRlcnMgdG8gaW50ZXJuZWQgc3RyaW5ncwotCSAgIC0gaW50IGFuZCBmbG9hdCBmcmVlIGxpc3QgYmxvY2tzCi0JICAgLSB3aGF0ZXZlciB2YXJpb3VzIG1vZHVsZXMgYW5kIGxpYnJhcmllcyBhbGxvY2F0ZQotCSovCisgICAgLyogWFhYIFN0aWxsIGFsbG9jYXRlZDoKKyAgICAgICAtIHZhcmlvdXMgc3RhdGljIGFkLWhvYyBwb2ludGVycyB0byBpbnRlcm5lZCBzdHJpbmdzCisgICAgICAgLSBpbnQgYW5kIGZsb2F0IGZyZWUgbGlzdCBibG9ja3MKKyAgICAgICAtIHdoYXRldmVyIHZhcmlvdXMgbW9kdWxlcyBhbmQgbGlicmFyaWVzIGFsbG9jYXRlCisgICAgKi8KIAotCVB5R3JhbW1hcl9SZW1vdmVBY2NlbGVyYXRvcnMoJl9QeVBhcnNlcl9HcmFtbWFyKTsKKyAgICBQeUdyYW1tYXJfUmVtb3ZlQWNjZWxlcmF0b3JzKCZfUHlQYXJzZXJfR3JhbW1hcik7CiAKICNpZmRlZiBQeV9UUkFDRV9SRUZTCi0JLyogRGlzcGxheSBhZGRyZXNzZXMgKCYgcmVmY250cykgb2YgYWxsIG9iamVjdHMgc3RpbGwgYWxpdmUuCi0JICogQW4gYWRkcmVzcyBjYW4gYmUgdXNlZCB0byBmaW5kIHRoZSByZXByIG9mIHRoZSBvYmplY3QsIHByaW50ZWQKLQkgKiBhYm92ZSBieSBfUHlfUHJpbnRSZWZlcmVuY2VzLgotCSAqLwotCWlmIChQeV9HRVRFTlYoIlBZVEhPTkRVTVBSRUZTIikpCi0JCV9QeV9QcmludFJlZmVyZW5jZUFkZHJlc3NlcyhzdGRlcnIpOworICAgIC8qIERpc3BsYXkgYWRkcmVzc2VzICgmIHJlZmNudHMpIG9mIGFsbCBvYmplY3RzIHN0aWxsIGFsaXZlLgorICAgICAqIEFuIGFkZHJlc3MgY2FuIGJlIHVzZWQgdG8gZmluZCB0aGUgcmVwciBvZiB0aGUgb2JqZWN0LCBwcmludGVkCisgICAgICogYWJvdmUgYnkgX1B5X1ByaW50UmVmZXJlbmNlcy4KKyAgICAgKi8KKyAgICBpZiAoUHlfR0VURU5WKCJQWVRIT05EVU1QUkVGUyIpKQorICAgICAgICBfUHlfUHJpbnRSZWZlcmVuY2VBZGRyZXNzZXMoc3RkZXJyKTsKICNlbmRpZiAvKiBQeV9UUkFDRV9SRUZTICovCiAjaWZkZWYgUFlNQUxMT0NfREVCVUcKLQlpZiAoUHlfR0VURU5WKCJQWVRIT05NQUxMT0NTVEFUUyIpKQotCQlfUHlPYmplY3RfRGVidWdNYWxsb2NTdGF0cygpOworICAgIGlmIChQeV9HRVRFTlYoIlBZVEhPTk1BTExPQ1NUQVRTIikpCisgICAgICAgIF9QeU9iamVjdF9EZWJ1Z01hbGxvY1N0YXRzKCk7CiAjZW5kaWYKIAotCWNhbGxfbGxfZXhpdGZ1bmNzKCk7CisgICAgY2FsbF9sbF9leGl0ZnVuY3MoKTsKIH0KIAogLyogQ3JlYXRlIGFuZCBpbml0aWFsaXplIGEgbmV3IGludGVycHJldGVyIGFuZCB0aHJlYWQsIGFuZCByZXR1cm4gdGhlCkBAIC01NjAsNjUgKzU2MCw2NSBAQAogUHlUaHJlYWRTdGF0ZSAqCiBQeV9OZXdJbnRlcnByZXRlcih2b2lkKQogewotCVB5SW50ZXJwcmV0ZXJTdGF0ZSAqaW50ZXJwOwotCVB5VGhyZWFkU3RhdGUgKnRzdGF0ZSwgKnNhdmVfdHN0YXRlOwotCVB5T2JqZWN0ICpiaW1vZCwgKnN5c21vZDsKKyAgICBQeUludGVycHJldGVyU3RhdGUgKmludGVycDsKKyAgICBQeVRocmVhZFN0YXRlICp0c3RhdGUsICpzYXZlX3RzdGF0ZTsKKyAgICBQeU9iamVjdCAqYmltb2QsICpzeXNtb2Q7CiAKLQlpZiAoIWluaXRpYWxpemVkKQotCQlQeV9GYXRhbEVycm9yKCJQeV9OZXdJbnRlcnByZXRlcjogY2FsbCBQeV9Jbml0aWFsaXplIGZpcnN0Iik7CisgICAgaWYgKCFpbml0aWFsaXplZCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiUHlfTmV3SW50ZXJwcmV0ZXI6IGNhbGwgUHlfSW5pdGlhbGl6ZSBmaXJzdCIpOwogCi0JaW50ZXJwID0gUHlJbnRlcnByZXRlclN0YXRlX05ldygpOwotCWlmIChpbnRlcnAgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgaW50ZXJwID0gUHlJbnRlcnByZXRlclN0YXRlX05ldygpOworICAgIGlmIChpbnRlcnAgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQl0c3RhdGUgPSBQeVRocmVhZFN0YXRlX05ldyhpbnRlcnApOwotCWlmICh0c3RhdGUgPT0gTlVMTCkgewotCQlQeUludGVycHJldGVyU3RhdGVfRGVsZXRlKGludGVycCk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICB0c3RhdGUgPSBQeVRocmVhZFN0YXRlX05ldyhpbnRlcnApOworICAgIGlmICh0c3RhdGUgPT0gTlVMTCkgeworICAgICAgICBQeUludGVycHJldGVyU3RhdGVfRGVsZXRlKGludGVycCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXNhdmVfdHN0YXRlID0gUHlUaHJlYWRTdGF0ZV9Td2FwKHRzdGF0ZSk7CisgICAgc2F2ZV90c3RhdGUgPSBQeVRocmVhZFN0YXRlX1N3YXAodHN0YXRlKTsKIAotCS8qIFhYWCBUaGUgZm9sbG93aW5nIGlzIGxheCBpbiBlcnJvciBjaGVja2luZyAqLworICAgIC8qIFhYWCBUaGUgZm9sbG93aW5nIGlzIGxheCBpbiBlcnJvciBjaGVja2luZyAqLwogCi0JaW50ZXJwLT5tb2R1bGVzID0gUHlEaWN0X05ldygpOwotCWludGVycC0+bW9kdWxlc19yZWxvYWRpbmcgPSBQeURpY3RfTmV3KCk7CisgICAgaW50ZXJwLT5tb2R1bGVzID0gUHlEaWN0X05ldygpOworICAgIGludGVycC0+bW9kdWxlc19yZWxvYWRpbmcgPSBQeURpY3RfTmV3KCk7CiAKLQliaW1vZCA9IF9QeUltcG9ydF9GaW5kRXh0ZW5zaW9uKCJfX2J1aWx0aW5fXyIsICJfX2J1aWx0aW5fXyIpOwotCWlmIChiaW1vZCAhPSBOVUxMKSB7Ci0JCWludGVycC0+YnVpbHRpbnMgPSBQeU1vZHVsZV9HZXREaWN0KGJpbW9kKTsKLQkJaWYgKGludGVycC0+YnVpbHRpbnMgPT0gTlVMTCkKLQkJCWdvdG8gaGFuZGxlX2Vycm9yOwotCQlQeV9JTkNSRUYoaW50ZXJwLT5idWlsdGlucyk7Ci0JfQotCXN5c21vZCA9IF9QeUltcG9ydF9GaW5kRXh0ZW5zaW9uKCJzeXMiLCAic3lzIik7Ci0JaWYgKGJpbW9kICE9IE5VTEwgJiYgc3lzbW9kICE9IE5VTEwpIHsKLQkJaW50ZXJwLT5zeXNkaWN0ID0gUHlNb2R1bGVfR2V0RGljdChzeXNtb2QpOwotCQlpZiAoaW50ZXJwLT5zeXNkaWN0ID09IE5VTEwpCi0JCQlnb3RvIGhhbmRsZV9lcnJvcjsKLQkJUHlfSU5DUkVGKGludGVycC0+c3lzZGljdCk7Ci0JCVB5U3lzX1NldFBhdGgoUHlfR2V0UGF0aCgpKTsKLQkJUHlEaWN0X1NldEl0ZW1TdHJpbmcoaW50ZXJwLT5zeXNkaWN0LCAibW9kdWxlcyIsCi0JCQkJICAgICBpbnRlcnAtPm1vZHVsZXMpOwotCQlfUHlJbXBvcnRIb29rc19Jbml0KCk7Ci0JCWluaXRtYWluKCk7Ci0JCWlmICghUHlfTm9TaXRlRmxhZykKLQkJCWluaXRzaXRlKCk7Ci0JfQorICAgIGJpbW9kID0gX1B5SW1wb3J0X0ZpbmRFeHRlbnNpb24oIl9fYnVpbHRpbl9fIiwgIl9fYnVpbHRpbl9fIik7CisgICAgaWYgKGJpbW9kICE9IE5VTEwpIHsKKyAgICAgICAgaW50ZXJwLT5idWlsdGlucyA9IFB5TW9kdWxlX0dldERpY3QoYmltb2QpOworICAgICAgICBpZiAoaW50ZXJwLT5idWlsdGlucyA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBoYW5kbGVfZXJyb3I7CisgICAgICAgIFB5X0lOQ1JFRihpbnRlcnAtPmJ1aWx0aW5zKTsKKyAgICB9CisgICAgc3lzbW9kID0gX1B5SW1wb3J0X0ZpbmRFeHRlbnNpb24oInN5cyIsICJzeXMiKTsKKyAgICBpZiAoYmltb2QgIT0gTlVMTCAmJiBzeXNtb2QgIT0gTlVMTCkgeworICAgICAgICBpbnRlcnAtPnN5c2RpY3QgPSBQeU1vZHVsZV9HZXREaWN0KHN5c21vZCk7CisgICAgICAgIGlmIChpbnRlcnAtPnN5c2RpY3QgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gaGFuZGxlX2Vycm9yOworICAgICAgICBQeV9JTkNSRUYoaW50ZXJwLT5zeXNkaWN0KTsKKyAgICAgICAgUHlTeXNfU2V0UGF0aChQeV9HZXRQYXRoKCkpOworICAgICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhpbnRlcnAtPnN5c2RpY3QsICJtb2R1bGVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJwLT5tb2R1bGVzKTsKKyAgICAgICAgX1B5SW1wb3J0SG9va3NfSW5pdCgpOworICAgICAgICBpbml0bWFpbigpOworICAgICAgICBpZiAoIVB5X05vU2l0ZUZsYWcpCisgICAgICAgICAgICBpbml0c2l0ZSgpOworICAgIH0KIAotCWlmICghUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIHRzdGF0ZTsKKyAgICBpZiAoIVB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiB0c3RhdGU7CiAKIGhhbmRsZV9lcnJvcjoKLQkvKiBPb3BzLCBpdCBkaWRuJ3Qgd29yay4gIFVuZG8gaXQgYWxsLiAqLworICAgIC8qIE9vcHMsIGl0IGRpZG4ndCB3b3JrLiAgVW5kbyBpdCBhbGwuICovCiAKLQlQeUVycl9QcmludCgpOwotCVB5VGhyZWFkU3RhdGVfQ2xlYXIodHN0YXRlKTsKLQlQeVRocmVhZFN0YXRlX1N3YXAoc2F2ZV90c3RhdGUpOwotCVB5VGhyZWFkU3RhdGVfRGVsZXRlKHRzdGF0ZSk7Ci0JUHlJbnRlcnByZXRlclN0YXRlX0RlbGV0ZShpbnRlcnApOworICAgIFB5RXJyX1ByaW50KCk7CisgICAgUHlUaHJlYWRTdGF0ZV9DbGVhcih0c3RhdGUpOworICAgIFB5VGhyZWFkU3RhdGVfU3dhcChzYXZlX3RzdGF0ZSk7CisgICAgUHlUaHJlYWRTdGF0ZV9EZWxldGUodHN0YXRlKTsKKyAgICBQeUludGVycHJldGVyU3RhdGVfRGVsZXRlKGludGVycCk7CiAKLQlyZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogLyogRGVsZXRlIGFuIGludGVycHJldGVyIGFuZCBpdHMgbGFzdCB0aHJlYWQuICBUaGlzIHJlcXVpcmVzIHRoYXQgdGhlCkBAIC02MzYsMTkgKzYzNiwxOSBAQAogdm9pZAogUHlfRW5kSW50ZXJwcmV0ZXIoUHlUaHJlYWRTdGF0ZSAqdHN0YXRlKQogewotCVB5SW50ZXJwcmV0ZXJTdGF0ZSAqaW50ZXJwID0gdHN0YXRlLT5pbnRlcnA7CisgICAgUHlJbnRlcnByZXRlclN0YXRlICppbnRlcnAgPSB0c3RhdGUtPmludGVycDsKIAotCWlmICh0c3RhdGUgIT0gUHlUaHJlYWRTdGF0ZV9HRVQoKSkKLQkJUHlfRmF0YWxFcnJvcigiUHlfRW5kSW50ZXJwcmV0ZXI6IHRocmVhZCBpcyBub3QgY3VycmVudCIpOwotCWlmICh0c3RhdGUtPmZyYW1lICE9IE5VTEwpCi0JCVB5X0ZhdGFsRXJyb3IoIlB5X0VuZEludGVycHJldGVyOiB0aHJlYWQgc3RpbGwgaGFzIGEgZnJhbWUiKTsKLQlpZiAodHN0YXRlICE9IGludGVycC0+dHN0YXRlX2hlYWQgfHwgdHN0YXRlLT5uZXh0ICE9IE5VTEwpCi0JCVB5X0ZhdGFsRXJyb3IoIlB5X0VuZEludGVycHJldGVyOiBub3QgdGhlIGxhc3QgdGhyZWFkIik7CisgICAgaWYgKHRzdGF0ZSAhPSBQeVRocmVhZFN0YXRlX0dFVCgpKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJQeV9FbmRJbnRlcnByZXRlcjogdGhyZWFkIGlzIG5vdCBjdXJyZW50Iik7CisgICAgaWYgKHRzdGF0ZS0+ZnJhbWUgIT0gTlVMTCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiUHlfRW5kSW50ZXJwcmV0ZXI6IHRocmVhZCBzdGlsbCBoYXMgYSBmcmFtZSIpOworICAgIGlmICh0c3RhdGUgIT0gaW50ZXJwLT50c3RhdGVfaGVhZCB8fCB0c3RhdGUtPm5leHQgIT0gTlVMTCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiUHlfRW5kSW50ZXJwcmV0ZXI6IG5vdCB0aGUgbGFzdCB0aHJlYWQiKTsKIAotCVB5SW1wb3J0X0NsZWFudXAoKTsKLQlQeUludGVycHJldGVyU3RhdGVfQ2xlYXIoaW50ZXJwKTsKLQlQeVRocmVhZFN0YXRlX1N3YXAoTlVMTCk7Ci0JUHlJbnRlcnByZXRlclN0YXRlX0RlbGV0ZShpbnRlcnApOworICAgIFB5SW1wb3J0X0NsZWFudXAoKTsKKyAgICBQeUludGVycHJldGVyU3RhdGVfQ2xlYXIoaW50ZXJwKTsKKyAgICBQeVRocmVhZFN0YXRlX1N3YXAoTlVMTCk7CisgICAgUHlJbnRlcnByZXRlclN0YXRlX0RlbGV0ZShpbnRlcnApOwogfQogCiBzdGF0aWMgY2hhciAqcHJvZ25hbWUgPSAicHl0aG9uIjsKQEAgLTY1NiwxNCArNjU2LDE0IEBACiB2b2lkCiBQeV9TZXRQcm9ncmFtTmFtZShjaGFyICpwbikKIHsKLQlpZiAocG4gJiYgKnBuKQotCQlwcm9nbmFtZSA9IHBuOworICAgIGlmIChwbiAmJiAqcG4pCisgICAgICAgIHByb2duYW1lID0gcG47CiB9CiAKIGNoYXIgKgogUHlfR2V0UHJvZ3JhbU5hbWUodm9pZCkKIHsKLQlyZXR1cm4gcHJvZ25hbWU7CisgICAgcmV0dXJuIHByb2duYW1lOwogfQogCiBzdGF0aWMgY2hhciAqZGVmYXVsdF9ob21lID0gTlVMTDsKQEAgLTY3MSwxNiArNjcxLDE2IEBACiB2b2lkCiBQeV9TZXRQeXRob25Ib21lKGNoYXIgKmhvbWUpCiB7Ci0JZGVmYXVsdF9ob21lID0gaG9tZTsKKyAgICBkZWZhdWx0X2hvbWUgPSBob21lOwogfQogCiBjaGFyICoKIFB5X0dldFB5dGhvbkhvbWUodm9pZCkKIHsKLQljaGFyICpob21lID0gZGVmYXVsdF9ob21lOwotCWlmIChob21lID09IE5VTEwgJiYgIVB5X0lnbm9yZUVudmlyb25tZW50RmxhZykKLQkJaG9tZSA9IFB5X0dFVEVOVigiUFlUSE9OSE9NRSIpOwotCXJldHVybiBob21lOworICAgIGNoYXIgKmhvbWUgPSBkZWZhdWx0X2hvbWU7CisgICAgaWYgKGhvbWUgPT0gTlVMTCAmJiAhUHlfSWdub3JlRW52aXJvbm1lbnRGbGFnKQorICAgICAgICBob21lID0gUHlfR0VURU5WKCJQWVRIT05IT01FIik7CisgICAgcmV0dXJuIGhvbWU7CiB9CiAKIC8qIENyZWF0ZSBfX21haW5fXyBtb2R1bGUgKi8KQEAgLTY4OCwxOCArNjg4LDE4IEBACiBzdGF0aWMgdm9pZAogaW5pdG1haW4odm9pZCkKIHsKLQlQeU9iamVjdCAqbSwgKmQ7Ci0JbSA9IFB5SW1wb3J0X0FkZE1vZHVsZSgiX19tYWluX18iKTsKLQlpZiAobSA9PSBOVUxMKQotCQlQeV9GYXRhbEVycm9yKCJjYW4ndCBjcmVhdGUgX19tYWluX18gbW9kdWxlIik7Ci0JZCA9IFB5TW9kdWxlX0dldERpY3QobSk7Ci0JaWYgKFB5RGljdF9HZXRJdGVtU3RyaW5nKGQsICJfX2J1aWx0aW5zX18iKSA9PSBOVUxMKSB7Ci0JCVB5T2JqZWN0ICpiaW1vZCA9IFB5SW1wb3J0X0ltcG9ydE1vZHVsZSgiX19idWlsdGluX18iKTsKLQkJaWYgKGJpbW9kID09IE5VTEwgfHwKLQkJICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJfX2J1aWx0aW5zX18iLCBiaW1vZCkgIT0gMCkKLQkJCVB5X0ZhdGFsRXJyb3IoImNhbid0IGFkZCBfX2J1aWx0aW5zX18gdG8gX19tYWluX18iKTsKLQkJUHlfREVDUkVGKGJpbW9kKTsKLQl9CisgICAgUHlPYmplY3QgKm0sICpkOworICAgIG0gPSBQeUltcG9ydF9BZGRNb2R1bGUoIl9fbWFpbl9fIik7CisgICAgaWYgKG0gPT0gTlVMTCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiY2FuJ3QgY3JlYXRlIF9fbWFpbl9fIG1vZHVsZSIpOworICAgIGQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOworICAgIGlmIChQeURpY3RfR2V0SXRlbVN0cmluZyhkLCAiX19idWlsdGluc19fIikgPT0gTlVMTCkgeworICAgICAgICBQeU9iamVjdCAqYmltb2QgPSBQeUltcG9ydF9JbXBvcnRNb2R1bGUoIl9fYnVpbHRpbl9fIik7CisgICAgICAgIGlmIChiaW1vZCA9PSBOVUxMIHx8CisgICAgICAgICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiX19idWlsdGluc19fIiwgYmltb2QpICE9IDApCisgICAgICAgICAgICBQeV9GYXRhbEVycm9yKCJjYW4ndCBhZGQgX19idWlsdGluc19fIHRvIF9fbWFpbl9fIik7CisgICAgICAgIFB5X0RFQ1JFRihiaW1vZCk7CisgICAgfQogfQogCiAvKiBJbXBvcnQgdGhlIHNpdGUgbW9kdWxlIChub3QgaW50byBfX21haW5fXyB0aG91Z2gpICovCkBAIC03MDcsMTU2ICs3MDcsMTU2IEBACiBzdGF0aWMgdm9pZAogaW5pdHNpdGUodm9pZCkKIHsKLQlQeU9iamVjdCAqbSwgKmY7Ci0JbSA9IFB5SW1wb3J0X0ltcG9ydE1vZHVsZSgic2l0ZSIpOwotCWlmIChtID09IE5VTEwpIHsKLQkJZiA9IFB5U3lzX0dldE9iamVjdCgic3RkZXJyIik7Ci0JCWlmIChQeV9WZXJib3NlRmxhZykgewotCQkJUHlGaWxlX1dyaXRlU3RyaW5nKAotCQkJCSInaW1wb3J0IHNpdGUnIGZhaWxlZDsgdHJhY2ViYWNrOlxuIiwgZik7Ci0JCQlQeUVycl9QcmludCgpOwotCQl9Ci0JCWVsc2UgewotCQkJUHlGaWxlX1dyaXRlU3RyaW5nKAotCQkJICAiJ2ltcG9ydCBzaXRlJyBmYWlsZWQ7IHVzZSAtdiBmb3IgdHJhY2ViYWNrXG4iLCBmKTsKLQkJCVB5RXJyX0NsZWFyKCk7Ci0JCX0KLQl9Ci0JZWxzZSB7Ci0JCVB5X0RFQ1JFRihtKTsKLQl9CisgICAgUHlPYmplY3QgKm0sICpmOworICAgIG0gPSBQeUltcG9ydF9JbXBvcnRNb2R1bGUoInNpdGUiKTsKKyAgICBpZiAobSA9PSBOVUxMKSB7CisgICAgICAgIGYgPSBQeVN5c19HZXRPYmplY3QoInN0ZGVyciIpOworICAgICAgICBpZiAoUHlfVmVyYm9zZUZsYWcpIHsKKyAgICAgICAgICAgIFB5RmlsZV9Xcml0ZVN0cmluZygKKyAgICAgICAgICAgICAgICAiJ2ltcG9ydCBzaXRlJyBmYWlsZWQ7IHRyYWNlYmFjazpcbiIsIGYpOworICAgICAgICAgICAgUHlFcnJfUHJpbnQoKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIFB5RmlsZV9Xcml0ZVN0cmluZygKKyAgICAgICAgICAgICAgIidpbXBvcnQgc2l0ZScgZmFpbGVkOyB1c2UgLXYgZm9yIHRyYWNlYmFja1xuIiwgZik7CisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeV9ERUNSRUYobSk7CisgICAgfQogfQogCiAvKiBQYXJzZSBpbnB1dCBmcm9tIGEgZmlsZSBhbmQgZXhlY3V0ZSBpdCAqLwogCiBpbnQKIFB5UnVuX0FueUZpbGVFeEZsYWdzKEZJTEUgKmZwLCBjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGNsb3NlaXQsCi0JCSAgICAgUHlDb21waWxlckZsYWdzICpmbGFncykKKyAgICAgICAgICAgICAgICAgICAgIFB5Q29tcGlsZXJGbGFncyAqZmxhZ3MpCiB7Ci0JaWYgKGZpbGVuYW1lID09IE5VTEwpCi0JCWZpbGVuYW1lID0gIj8/PyI7Ci0JaWYgKFB5X0ZkSXNJbnRlcmFjdGl2ZShmcCwgZmlsZW5hbWUpKSB7Ci0JCWludCBlcnIgPSBQeVJ1bl9JbnRlcmFjdGl2ZUxvb3BGbGFncyhmcCwgZmlsZW5hbWUsIGZsYWdzKTsKLQkJaWYgKGNsb3NlaXQpCi0JCQlmY2xvc2UoZnApOwotCQlyZXR1cm4gZXJyOwotCX0KLQllbHNlCi0JCXJldHVybiBQeVJ1bl9TaW1wbGVGaWxlRXhGbGFncyhmcCwgZmlsZW5hbWUsIGNsb3NlaXQsIGZsYWdzKTsKKyAgICBpZiAoZmlsZW5hbWUgPT0gTlVMTCkKKyAgICAgICAgZmlsZW5hbWUgPSAiPz8/IjsKKyAgICBpZiAoUHlfRmRJc0ludGVyYWN0aXZlKGZwLCBmaWxlbmFtZSkpIHsKKyAgICAgICAgaW50IGVyciA9IFB5UnVuX0ludGVyYWN0aXZlTG9vcEZsYWdzKGZwLCBmaWxlbmFtZSwgZmxhZ3MpOworICAgICAgICBpZiAoY2xvc2VpdCkKKyAgICAgICAgICAgIGZjbG9zZShmcCk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIFB5UnVuX1NpbXBsZUZpbGVFeEZsYWdzKGZwLCBmaWxlbmFtZSwgY2xvc2VpdCwgZmxhZ3MpOwogfQogCiBpbnQKIFB5UnVuX0ludGVyYWN0aXZlTG9vcEZsYWdzKEZJTEUgKmZwLCBjb25zdCBjaGFyICpmaWxlbmFtZSwgUHlDb21waWxlckZsYWdzICpmbGFncykKIHsKLQlQeU9iamVjdCAqdjsKLQlpbnQgcmV0OwotCVB5Q29tcGlsZXJGbGFncyBsb2NhbF9mbGFnczsKKyAgICBQeU9iamVjdCAqdjsKKyAgICBpbnQgcmV0OworICAgIFB5Q29tcGlsZXJGbGFncyBsb2NhbF9mbGFnczsKIAotCWlmIChmbGFncyA9PSBOVUxMKSB7Ci0JCWZsYWdzID0gJmxvY2FsX2ZsYWdzOwotCQlsb2NhbF9mbGFncy5jZl9mbGFncyA9IDA7Ci0JfQotCXYgPSBQeVN5c19HZXRPYmplY3QoInBzMSIpOwotCWlmICh2ID09IE5VTEwpIHsKLQkJUHlTeXNfU2V0T2JqZWN0KCJwczEiLCB2ID0gUHlTdHJpbmdfRnJvbVN0cmluZygiPj4+ICIpKTsKLQkJUHlfWERFQ1JFRih2KTsKLQl9Ci0JdiA9IFB5U3lzX0dldE9iamVjdCgicHMyIik7Ci0JaWYgKHYgPT0gTlVMTCkgewotCQlQeVN5c19TZXRPYmplY3QoInBzMiIsIHYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCIuLi4gIikpOwotCQlQeV9YREVDUkVGKHYpOwotCX0KLQlmb3IgKDs7KSB7Ci0JCXJldCA9IFB5UnVuX0ludGVyYWN0aXZlT25lRmxhZ3MoZnAsIGZpbGVuYW1lLCBmbGFncyk7Ci0JCVBSSU5UX1RPVEFMX1JFRlMoKTsKLQkJaWYgKHJldCA9PSBFX0VPRikKLQkJCXJldHVybiAwOwotCQkvKgotCQlpZiAocmV0ID09IEVfTk9NRU0pCi0JCQlyZXR1cm4gLTE7Ci0JCSovCi0JfQorICAgIGlmIChmbGFncyA9PSBOVUxMKSB7CisgICAgICAgIGZsYWdzID0gJmxvY2FsX2ZsYWdzOworICAgICAgICBsb2NhbF9mbGFncy5jZl9mbGFncyA9IDA7CisgICAgfQorICAgIHYgPSBQeVN5c19HZXRPYmplY3QoInBzMSIpOworICAgIGlmICh2ID09IE5VTEwpIHsKKyAgICAgICAgUHlTeXNfU2V0T2JqZWN0KCJwczEiLCB2ID0gUHlTdHJpbmdfRnJvbVN0cmluZygiPj4+ICIpKTsKKyAgICAgICAgUHlfWERFQ1JFRih2KTsKKyAgICB9CisgICAgdiA9IFB5U3lzX0dldE9iamVjdCgicHMyIik7CisgICAgaWYgKHYgPT0gTlVMTCkgeworICAgICAgICBQeVN5c19TZXRPYmplY3QoInBzMiIsIHYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCIuLi4gIikpOworICAgICAgICBQeV9YREVDUkVGKHYpOworICAgIH0KKyAgICBmb3IgKDs7KSB7CisgICAgICAgIHJldCA9IFB5UnVuX0ludGVyYWN0aXZlT25lRmxhZ3MoZnAsIGZpbGVuYW1lLCBmbGFncyk7CisgICAgICAgIFBSSU5UX1RPVEFMX1JFRlMoKTsKKyAgICAgICAgaWYgKHJldCA9PSBFX0VPRikKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAvKgorICAgICAgICBpZiAocmV0ID09IEVfTk9NRU0pCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICovCisgICAgfQogfQogCiAjaWYgMAogLyogY29tcHV0ZSBwYXJzZXIgZmxhZ3MgYmFzZWQgb24gY29tcGlsZXIgZmxhZ3MgKi8KICNkZWZpbmUgUEFSU0VSX0ZMQUdTKGZsYWdzKSBcCi0JKChmbGFncykgPyAoKCgoZmxhZ3MpLT5jZl9mbGFncyAmIFB5Q0ZfRE9OVF9JTVBMWV9ERURFTlQpID8gXAotCQkgICAgICBQeVBBUlNFX0RPTlRfSU1QTFlfREVERU5UIDogMCkpIDogMCkKKyAgICAoKGZsYWdzKSA/ICgoKChmbGFncyktPmNmX2ZsYWdzICYgUHlDRl9ET05UX0lNUExZX0RFREVOVCkgPyBcCisgICAgICAgICAgICAgICAgICBQeVBBUlNFX0RPTlRfSU1QTFlfREVERU5UIDogMCkpIDogMCkKICNlbmRpZgogI2lmIDEKIC8qIEtlZXAgYW4gZXhhbXBsZSBvZiBmbGFncyB3aXRoIGZ1dHVyZSBrZXl3b3JkIHN1cHBvcnQuICovCiAjZGVmaW5lIFBBUlNFUl9GTEFHUyhmbGFncykgXAotCSgoZmxhZ3MpID8gKCgoKGZsYWdzKS0+Y2ZfZmxhZ3MgJiBQeUNGX0RPTlRfSU1QTFlfREVERU5UKSA/IFwKLQkJICAgICAgUHlQQVJTRV9ET05UX0lNUExZX0RFREVOVCA6IDApIFwKLQkJICAgIHwgKCgoZmxhZ3MpLT5jZl9mbGFncyAmIENPX0ZVVFVSRV9QUklOVF9GVU5DVElPTikgPyBcCi0JCSAgICAgICBQeVBBUlNFX1BSSU5UX0lTX0ZVTkNUSU9OIDogMCkgXAotCQkgICAgfCAoKChmbGFncyktPmNmX2ZsYWdzICYgQ09fRlVUVVJFX1VOSUNPREVfTElURVJBTFMpID8gXAotCQkgICAgICAgUHlQQVJTRV9VTklDT0RFX0xJVEVSQUxTIDogMCkgXAotCQkgICAgKSA6IDApCisgICAgKChmbGFncykgPyAoKCgoZmxhZ3MpLT5jZl9mbGFncyAmIFB5Q0ZfRE9OVF9JTVBMWV9ERURFTlQpID8gXAorICAgICAgICAgICAgICAgICAgUHlQQVJTRV9ET05UX0lNUExZX0RFREVOVCA6IDApIFwKKyAgICAgICAgICAgICAgICB8ICgoKGZsYWdzKS0+Y2ZfZmxhZ3MgJiBDT19GVVRVUkVfUFJJTlRfRlVOQ1RJT04pID8gXAorICAgICAgICAgICAgICAgICAgIFB5UEFSU0VfUFJJTlRfSVNfRlVOQ1RJT04gOiAwKSBcCisgICAgICAgICAgICAgICAgfCAoKChmbGFncyktPmNmX2ZsYWdzICYgQ09fRlVUVVJFX1VOSUNPREVfTElURVJBTFMpID8gXAorICAgICAgICAgICAgICAgICAgIFB5UEFSU0VfVU5JQ09ERV9MSVRFUkFMUyA6IDApIFwKKyAgICAgICAgICAgICAgICApIDogMCkKICNlbmRpZgogCiBpbnQKIFB5UnVuX0ludGVyYWN0aXZlT25lRmxhZ3MoRklMRSAqZnAsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBQeUNvbXBpbGVyRmxhZ3MgKmZsYWdzKQogewotCVB5T2JqZWN0ICptLCAqZCwgKnYsICp3OwotCW1vZF90eSBtb2Q7Ci0JUHlBcmVuYSAqYXJlbmE7Ci0JY2hhciAqcHMxID0gIiIsICpwczIgPSAiIjsKLQlpbnQgZXJyY29kZSA9IDA7CisgICAgUHlPYmplY3QgKm0sICpkLCAqdiwgKnc7CisgICAgbW9kX3R5IG1vZDsKKyAgICBQeUFyZW5hICphcmVuYTsKKyAgICBjaGFyICpwczEgPSAiIiwgKnBzMiA9ICIiOworICAgIGludCBlcnJjb2RlID0gMDsKIAotCXYgPSBQeVN5c19HZXRPYmplY3QoInBzMSIpOwotCWlmICh2ICE9IE5VTEwpIHsKLQkJdiA9IFB5T2JqZWN0X1N0cih2KTsKLQkJaWYgKHYgPT0gTlVMTCkKLQkJCVB5RXJyX0NsZWFyKCk7Ci0JCWVsc2UgaWYgKFB5U3RyaW5nX0NoZWNrKHYpKQotCQkJcHMxID0gUHlTdHJpbmdfQXNTdHJpbmcodik7Ci0JfQotCXcgPSBQeVN5c19HZXRPYmplY3QoInBzMiIpOwotCWlmICh3ICE9IE5VTEwpIHsKLQkJdyA9IFB5T2JqZWN0X1N0cih3KTsKLQkJaWYgKHcgPT0gTlVMTCkKLQkJCVB5RXJyX0NsZWFyKCk7Ci0JCWVsc2UgaWYgKFB5U3RyaW5nX0NoZWNrKHcpKQotCQkJcHMyID0gUHlTdHJpbmdfQXNTdHJpbmcodyk7Ci0JfQotCWFyZW5hID0gUHlBcmVuYV9OZXcoKTsKLQlpZiAoYXJlbmEgPT0gTlVMTCkgewotCQlQeV9YREVDUkVGKHYpOwotCQlQeV9YREVDUkVGKHcpOwotCQlyZXR1cm4gLTE7Ci0JfQotCW1vZCA9IFB5UGFyc2VyX0FTVEZyb21GaWxlKGZwLCBmaWxlbmFtZSwKLQkJCQkgICBQeV9zaW5nbGVfaW5wdXQsIHBzMSwgcHMyLAotCQkJCSAgIGZsYWdzLCAmZXJyY29kZSwgYXJlbmEpOwotCVB5X1hERUNSRUYodik7Ci0JUHlfWERFQ1JFRih3KTsKLQlpZiAobW9kID09IE5VTEwpIHsKLQkJUHlBcmVuYV9GcmVlKGFyZW5hKTsKLQkJaWYgKGVycmNvZGUgPT0gRV9FT0YpIHsKLQkJCVB5RXJyX0NsZWFyKCk7Ci0JCQlyZXR1cm4gRV9FT0Y7Ci0JCX0KLQkJUHlFcnJfUHJpbnQoKTsKLQkJcmV0dXJuIC0xOwotCX0KLQltID0gUHlJbXBvcnRfQWRkTW9kdWxlKCJfX21haW5fXyIpOwotCWlmIChtID09IE5VTEwpIHsKLQkJUHlBcmVuYV9GcmVlKGFyZW5hKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQl2ID0gcnVuX21vZChtb2QsIGZpbGVuYW1lLCBkLCBkLCBmbGFncywgYXJlbmEpOwotCVB5QXJlbmFfRnJlZShhcmVuYSk7Ci0JaWYgKHYgPT0gTlVMTCkgewotCQlQeUVycl9QcmludCgpOwotCQlyZXR1cm4gLTE7Ci0JfQotCVB5X0RFQ1JFRih2KTsKLQlpZiAoUHlfRmx1c2hMaW5lKCkpCi0JCVB5RXJyX0NsZWFyKCk7Ci0JcmV0dXJuIDA7CisgICAgdiA9IFB5U3lzX0dldE9iamVjdCgicHMxIik7CisgICAgaWYgKHYgIT0gTlVMTCkgeworICAgICAgICB2ID0gUHlPYmplY3RfU3RyKHYpOworICAgICAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgZWxzZSBpZiAoUHlTdHJpbmdfQ2hlY2sodikpCisgICAgICAgICAgICBwczEgPSBQeVN0cmluZ19Bc1N0cmluZyh2KTsKKyAgICB9CisgICAgdyA9IFB5U3lzX0dldE9iamVjdCgicHMyIik7CisgICAgaWYgKHcgIT0gTlVMTCkgeworICAgICAgICB3ID0gUHlPYmplY3RfU3RyKHcpOworICAgICAgICBpZiAodyA9PSBOVUxMKQorICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgZWxzZSBpZiAoUHlTdHJpbmdfQ2hlY2sodykpCisgICAgICAgICAgICBwczIgPSBQeVN0cmluZ19Bc1N0cmluZyh3KTsKKyAgICB9CisgICAgYXJlbmEgPSBQeUFyZW5hX05ldygpOworICAgIGlmIChhcmVuYSA9PSBOVUxMKSB7CisgICAgICAgIFB5X1hERUNSRUYodik7CisgICAgICAgIFB5X1hERUNSRUYodyk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbW9kID0gUHlQYXJzZXJfQVNURnJvbUZpbGUoZnAsIGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NpbmdsZV9pbnB1dCwgcHMxLCBwczIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsICZlcnJjb2RlLCBhcmVuYSk7CisgICAgUHlfWERFQ1JFRih2KTsKKyAgICBQeV9YREVDUkVGKHcpOworICAgIGlmIChtb2QgPT0gTlVMTCkgeworICAgICAgICBQeUFyZW5hX0ZyZWUoYXJlbmEpOworICAgICAgICBpZiAoZXJyY29kZSA9PSBFX0VPRikgeworICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgIHJldHVybiBFX0VPRjsKKyAgICAgICAgfQorICAgICAgICBQeUVycl9QcmludCgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG0gPSBQeUltcG9ydF9BZGRNb2R1bGUoIl9fbWFpbl9fIik7CisgICAgaWYgKG0gPT0gTlVMTCkgeworICAgICAgICBQeUFyZW5hX0ZyZWUoYXJlbmEpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOworICAgIHYgPSBydW5fbW9kKG1vZCwgZmlsZW5hbWUsIGQsIGQsIGZsYWdzLCBhcmVuYSk7CisgICAgUHlBcmVuYV9GcmVlKGFyZW5hKTsKKyAgICBpZiAodiA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1ByaW50KCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgUHlfREVDUkVGKHYpOworICAgIGlmIChQeV9GbHVzaExpbmUoKSkKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICByZXR1cm4gMDsKIH0KIAogLyogQ2hlY2sgd2hldGhlciBhIGZpbGUgbWF5YmUgYSBweWMgZmlsZTogTG9vayBhdCB0aGUgZXh0ZW5zaW9uLApAQCAtODY1LDYyNCArODY1LDYyNCBAQAogc3RhdGljIGludAogbWF5YmVfcHljX2ZpbGUoRklMRSAqZnAsIGNvbnN0IGNoYXIqIGZpbGVuYW1lLCBjb25zdCBjaGFyKiBleHQsIGludCBjbG9zZWl0KQogewotCWlmIChzdHJjbXAoZXh0LCAiLnB5YyIpID09IDAgfHwgc3RyY21wKGV4dCwgIi5weW8iKSA9PSAwKQotCQlyZXR1cm4gMTsKKyAgICBpZiAoc3RyY21wKGV4dCwgIi5weWMiKSA9PSAwIHx8IHN0cmNtcChleHQsICIucHlvIikgPT0gMCkKKyAgICAgICAgcmV0dXJuIDE7CiAKLQkvKiBPbmx5IGxvb2sgaW50byB0aGUgZmlsZSBpZiB3ZSBhcmUgYWxsb3dlZCB0byBjbG9zZSBpdCwgc2luY2UKLQkgICBpdCB0aGVuIHNob3VsZCBhbHNvIGJlIHNlZWthYmxlLiAqLwotCWlmIChjbG9zZWl0KSB7Ci0JCS8qIFJlYWQgb25seSB0d28gYnl0ZXMgb2YgdGhlIG1hZ2ljLiBJZiB0aGUgZmlsZSB3YXMgb3BlbmVkIGluCi0JCSAgIHRleHQgbW9kZSwgdGhlIGJ5dGVzIDMgYW5kIDQgb2YgdGhlIG1hZ2ljIChcclxuKSBtaWdodCBub3QKLQkJICAgYmUgcmVhZCBhcyB0aGV5IGFyZSBvbiBkaXNrLiAqLwotCQl1bnNpZ25lZCBpbnQgaGFsZm1hZ2ljID0gUHlJbXBvcnRfR2V0TWFnaWNOdW1iZXIoKSAmIDB4RkZGRjsKLQkJdW5zaWduZWQgY2hhciBidWZbMl07Ci0JCS8qIE1lc3M6ICBJbiBjYXNlIG9mIC14LCB0aGUgc3RyZWFtIGlzIE5PVCBhdCBpdHMgc3RhcnQgbm93LAotCQkgICBhbmQgdW5nZXRjKCkgd2FzIHVzZWQgdG8gcHVzaCBiYWNrIHRoZSBmaXJzdCBuZXdsaW5lLAotCQkgICB3aGljaCBtYWtlcyB0aGUgY3VycmVudCBzdHJlYW0gcG9zaXRpb24gZm9ybWFsbHkgdW5kZWZpbmVkLAotCQkgICBhbmQgYSB4LXBsYXRmb3JtIG5pZ2h0bWFyZS4KLQkJICAgVW5mb3J0dW5hdGVseSwgd2UgaGF2ZSBubyBkaXJlY3Qgd2F5IHRvIGtub3cgd2hldGhlciAteAotCQkgICB3YXMgc3BlY2lmaWVkLiAgU28gd2UgdXNlIGEgdGVycmlibGUgaGFjazogIGlmIHRoZSBjdXJyZW50Ci0JCSAgIHN0cmVhbSBwb3NpdGlvbiBpcyBub3QgMCwgd2UgYXNzdW1lIC14IHdhcyBzcGVjaWZpZWQsIGFuZAotCQkgICBnaXZlIHVwLiAgQnVnIDEzMjg1MCBvbiBTb3VyY2VGb3JnZSBzcGVsbHMgb3V0IHRoZQotCQkgICBob3BlbGVzc25lc3Mgb2YgdHJ5aW5nIGFueXRoaW5nIGVsc2UgKGZzZWVrIGFuZCBmdGVsbAotCQkgICBkb24ndCB3b3JrIHByZWRpY3RhYmx5IHgtcGxhdGZvcm0gZm9yIHRleHQtbW9kZSBmaWxlcykuCi0JCSovCi0JCWludCBpc3B5YyA9IDA7Ci0JCWlmIChmdGVsbChmcCkgPT0gMCkgewotCQkJaWYgKGZyZWFkKGJ1ZiwgMSwgMiwgZnApID09IDIgJiYKLQkJCSAgICAoKHVuc2lnbmVkIGludClidWZbMV08PDggfCBidWZbMF0pID09IGhhbGZtYWdpYykKLQkJCQlpc3B5YyA9IDE7Ci0JCQlyZXdpbmQoZnApOwotCQl9Ci0JCXJldHVybiBpc3B5YzsKLQl9Ci0JcmV0dXJuIDA7CisgICAgLyogT25seSBsb29rIGludG8gdGhlIGZpbGUgaWYgd2UgYXJlIGFsbG93ZWQgdG8gY2xvc2UgaXQsIHNpbmNlCisgICAgICAgaXQgdGhlbiBzaG91bGQgYWxzbyBiZSBzZWVrYWJsZS4gKi8KKyAgICBpZiAoY2xvc2VpdCkgeworICAgICAgICAvKiBSZWFkIG9ubHkgdHdvIGJ5dGVzIG9mIHRoZSBtYWdpYy4gSWYgdGhlIGZpbGUgd2FzIG9wZW5lZCBpbgorICAgICAgICAgICB0ZXh0IG1vZGUsIHRoZSBieXRlcyAzIGFuZCA0IG9mIHRoZSBtYWdpYyAoXHJcbikgbWlnaHQgbm90CisgICAgICAgICAgIGJlIHJlYWQgYXMgdGhleSBhcmUgb24gZGlzay4gKi8KKyAgICAgICAgdW5zaWduZWQgaW50IGhhbGZtYWdpYyA9IFB5SW1wb3J0X0dldE1hZ2ljTnVtYmVyKCkgJiAweEZGRkY7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgYnVmWzJdOworICAgICAgICAvKiBNZXNzOiAgSW4gY2FzZSBvZiAteCwgdGhlIHN0cmVhbSBpcyBOT1QgYXQgaXRzIHN0YXJ0IG5vdywKKyAgICAgICAgICAgYW5kIHVuZ2V0YygpIHdhcyB1c2VkIHRvIHB1c2ggYmFjayB0aGUgZmlyc3QgbmV3bGluZSwKKyAgICAgICAgICAgd2hpY2ggbWFrZXMgdGhlIGN1cnJlbnQgc3RyZWFtIHBvc2l0aW9uIGZvcm1hbGx5IHVuZGVmaW5lZCwKKyAgICAgICAgICAgYW5kIGEgeC1wbGF0Zm9ybSBuaWdodG1hcmUuCisgICAgICAgICAgIFVuZm9ydHVuYXRlbHksIHdlIGhhdmUgbm8gZGlyZWN0IHdheSB0byBrbm93IHdoZXRoZXIgLXgKKyAgICAgICAgICAgd2FzIHNwZWNpZmllZC4gIFNvIHdlIHVzZSBhIHRlcnJpYmxlIGhhY2s6ICBpZiB0aGUgY3VycmVudAorICAgICAgICAgICBzdHJlYW0gcG9zaXRpb24gaXMgbm90IDAsIHdlIGFzc3VtZSAteCB3YXMgc3BlY2lmaWVkLCBhbmQKKyAgICAgICAgICAgZ2l2ZSB1cC4gIEJ1ZyAxMzI4NTAgb24gU291cmNlRm9yZ2Ugc3BlbGxzIG91dCB0aGUKKyAgICAgICAgICAgaG9wZWxlc3NuZXNzIG9mIHRyeWluZyBhbnl0aGluZyBlbHNlIChmc2VlayBhbmQgZnRlbGwKKyAgICAgICAgICAgZG9uJ3Qgd29yayBwcmVkaWN0YWJseSB4LXBsYXRmb3JtIGZvciB0ZXh0LW1vZGUgZmlsZXMpLgorICAgICAgICAqLworICAgICAgICBpbnQgaXNweWMgPSAwOworICAgICAgICBpZiAoZnRlbGwoZnApID09IDApIHsKKyAgICAgICAgICAgIGlmIChmcmVhZChidWYsIDEsIDIsIGZwKSA9PSAyICYmCisgICAgICAgICAgICAgICAgKCh1bnNpZ25lZCBpbnQpYnVmWzFdPDw4IHwgYnVmWzBdKSA9PSBoYWxmbWFnaWMpCisgICAgICAgICAgICAgICAgaXNweWMgPSAxOworICAgICAgICAgICAgcmV3aW5kKGZwKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaXNweWM7CisgICAgfQorICAgIHJldHVybiAwOwogfQogCiBpbnQKIFB5UnVuX1NpbXBsZUZpbGVFeEZsYWdzKEZJTEUgKmZwLCBjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGNsb3NlaXQsCi0JCQlQeUNvbXBpbGVyRmxhZ3MgKmZsYWdzKQorICAgICAgICAgICAgICAgICAgICAgICAgUHlDb21waWxlckZsYWdzICpmbGFncykKIHsKLQlQeU9iamVjdCAqbSwgKmQsICp2OwotCWNvbnN0IGNoYXIgKmV4dDsKLQlpbnQgc2V0X2ZpbGVfbmFtZSA9IDAsIHJldCwgbGVuOworICAgIFB5T2JqZWN0ICptLCAqZCwgKnY7CisgICAgY29uc3QgY2hhciAqZXh0OworICAgIGludCBzZXRfZmlsZV9uYW1lID0gMCwgcmV0LCBsZW47CiAKLQltID0gUHlJbXBvcnRfQWRkTW9kdWxlKCJfX21haW5fXyIpOwotCWlmIChtID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQlpZiAoUHlEaWN0X0dldEl0ZW1TdHJpbmcoZCwgIl9fZmlsZV9fIikgPT0gTlVMTCkgewotCQlQeU9iamVjdCAqZiA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoZmlsZW5hbWUpOwotCQlpZiAoZiA9PSBOVUxMKQotCQkJcmV0dXJuIC0xOwotCQlpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIl9fZmlsZV9fIiwgZikgPCAwKSB7Ci0JCQlQeV9ERUNSRUYoZik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJc2V0X2ZpbGVfbmFtZSA9IDE7Ci0JCVB5X0RFQ1JFRihmKTsKLQl9Ci0JbGVuID0gc3RybGVuKGZpbGVuYW1lKTsKLQlleHQgPSBmaWxlbmFtZSArIGxlbiAtIChsZW4gPiA0ID8gNCA6IDApOwotCWlmIChtYXliZV9weWNfZmlsZShmcCwgZmlsZW5hbWUsIGV4dCwgY2xvc2VpdCkpIHsKLQkJLyogVHJ5IHRvIHJ1biBhIHB5YyBmaWxlLiBGaXJzdCwgcmUtb3BlbiBpbiBiaW5hcnkgKi8KLQkJaWYgKGNsb3NlaXQpCi0JCQlmY2xvc2UoZnApOwotCQlpZiAoKGZwID0gZm9wZW4oZmlsZW5hbWUsICJyYiIpKSA9PSBOVUxMKSB7Ci0JCQlmcHJpbnRmKHN0ZGVyciwgInB5dGhvbjogQ2FuJ3QgcmVvcGVuIC5weWMgZmlsZVxuIik7Ci0JCQlyZXQgPSAtMTsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCQkvKiBUdXJuIG9uIG9wdGltaXphdGlvbiBpZiBhIC5weW8gZmlsZSBpcyBnaXZlbiAqLwotCQlpZiAoc3RyY21wKGV4dCwgIi5weW8iKSA9PSAwKQotCQkJUHlfT3B0aW1pemVGbGFnID0gMTsKLQkJdiA9IHJ1bl9weWNfZmlsZShmcCwgZmlsZW5hbWUsIGQsIGQsIGZsYWdzKTsKLQl9IGVsc2UgewotCQl2ID0gUHlSdW5fRmlsZUV4RmxhZ3MoZnAsIGZpbGVuYW1lLCBQeV9maWxlX2lucHV0LCBkLCBkLAotCQkJCSAgICAgIGNsb3NlaXQsIGZsYWdzKTsKLQl9Ci0JaWYgKHYgPT0gTlVMTCkgewotCQlQeUVycl9QcmludCgpOwotCQlyZXQgPSAtMTsKLQkJZ290byBkb25lOwotCX0KLQlQeV9ERUNSRUYodik7Ci0JaWYgKFB5X0ZsdXNoTGluZSgpKQotCQlQeUVycl9DbGVhcigpOwotCXJldCA9IDA7CisgICAgbSA9IFB5SW1wb3J0X0FkZE1vZHVsZSgiX19tYWluX18iKTsKKyAgICBpZiAobSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAgZCA9IFB5TW9kdWxlX0dldERpY3QobSk7CisgICAgaWYgKFB5RGljdF9HZXRJdGVtU3RyaW5nKGQsICJfX2ZpbGVfXyIpID09IE5VTEwpIHsKKyAgICAgICAgUHlPYmplY3QgKmYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGZpbGVuYW1lKTsKKyAgICAgICAgaWYgKGYgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJfX2ZpbGVfXyIsIGYpIDwgMCkgeworICAgICAgICAgICAgUHlfREVDUkVGKGYpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIHNldF9maWxlX25hbWUgPSAxOworICAgICAgICBQeV9ERUNSRUYoZik7CisgICAgfQorICAgIGxlbiA9IHN0cmxlbihmaWxlbmFtZSk7CisgICAgZXh0ID0gZmlsZW5hbWUgKyBsZW4gLSAobGVuID4gNCA/IDQgOiAwKTsKKyAgICBpZiAobWF5YmVfcHljX2ZpbGUoZnAsIGZpbGVuYW1lLCBleHQsIGNsb3NlaXQpKSB7CisgICAgICAgIC8qIFRyeSB0byBydW4gYSBweWMgZmlsZS4gRmlyc3QsIHJlLW9wZW4gaW4gYmluYXJ5ICovCisgICAgICAgIGlmIChjbG9zZWl0KQorICAgICAgICAgICAgZmNsb3NlKGZwKTsKKyAgICAgICAgaWYgKChmcCA9IGZvcGVuKGZpbGVuYW1lLCAicmIiKSkgPT0gTlVMTCkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJweXRob246IENhbid0IHJlb3BlbiAucHljIGZpbGVcbiIpOworICAgICAgICAgICAgcmV0ID0gLTE7CisgICAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgIH0KKyAgICAgICAgLyogVHVybiBvbiBvcHRpbWl6YXRpb24gaWYgYSAucHlvIGZpbGUgaXMgZ2l2ZW4gKi8KKyAgICAgICAgaWYgKHN0cmNtcChleHQsICIucHlvIikgPT0gMCkKKyAgICAgICAgICAgIFB5X09wdGltaXplRmxhZyA9IDE7CisgICAgICAgIHYgPSBydW5fcHljX2ZpbGUoZnAsIGZpbGVuYW1lLCBkLCBkLCBmbGFncyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdiA9IFB5UnVuX0ZpbGVFeEZsYWdzKGZwLCBmaWxlbmFtZSwgUHlfZmlsZV9pbnB1dCwgZCwgZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlaXQsIGZsYWdzKTsKKyAgICB9CisgICAgaWYgKHYgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9QcmludCgpOworICAgICAgICByZXQgPSAtMTsKKyAgICAgICAgZ290byBkb25lOworICAgIH0KKyAgICBQeV9ERUNSRUYodik7CisgICAgaWYgKFB5X0ZsdXNoTGluZSgpKQorICAgICAgICBQeUVycl9DbGVhcigpOworICAgIHJldCA9IDA7CiAgIGRvbmU6Ci0JaWYgKHNldF9maWxlX25hbWUgJiYgUHlEaWN0X0RlbEl0ZW1TdHJpbmcoZCwgIl9fZmlsZV9fIikpCi0JCVB5RXJyX0NsZWFyKCk7Ci0JcmV0dXJuIHJldDsKKyAgICBpZiAoc2V0X2ZpbGVfbmFtZSAmJiBQeURpY3RfRGVsSXRlbVN0cmluZyhkLCAiX19maWxlX18iKSkKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICByZXR1cm4gcmV0OwogfQogCiBpbnQKIFB5UnVuX1NpbXBsZVN0cmluZ0ZsYWdzKGNvbnN0IGNoYXIgKmNvbW1hbmQsIFB5Q29tcGlsZXJGbGFncyAqZmxhZ3MpCiB7Ci0JUHlPYmplY3QgKm0sICpkLCAqdjsKLQltID0gUHlJbXBvcnRfQWRkTW9kdWxlKCJfX21haW5fXyIpOwotCWlmIChtID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQl2ID0gUHlSdW5fU3RyaW5nRmxhZ3MoY29tbWFuZCwgUHlfZmlsZV9pbnB1dCwgZCwgZCwgZmxhZ3MpOwotCWlmICh2ID09IE5VTEwpIHsKLQkJUHlFcnJfUHJpbnQoKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlQeV9ERUNSRUYodik7Ci0JaWYgKFB5X0ZsdXNoTGluZSgpKQotCQlQeUVycl9DbGVhcigpOwotCXJldHVybiAwOworICAgIFB5T2JqZWN0ICptLCAqZCwgKnY7CisgICAgbSA9IFB5SW1wb3J0X0FkZE1vZHVsZSgiX19tYWluX18iKTsKKyAgICBpZiAobSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAgZCA9IFB5TW9kdWxlX0dldERpY3QobSk7CisgICAgdiA9IFB5UnVuX1N0cmluZ0ZsYWdzKGNvbW1hbmQsIFB5X2ZpbGVfaW5wdXQsIGQsIGQsIGZsYWdzKTsKKyAgICBpZiAodiA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1ByaW50KCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgUHlfREVDUkVGKHYpOworICAgIGlmIChQeV9GbHVzaExpbmUoKSkKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogcGFyc2Vfc3ludGF4X2Vycm9yKFB5T2JqZWN0ICplcnIsIFB5T2JqZWN0ICoqbWVzc2FnZSwgY29uc3QgY2hhciAqKmZpbGVuYW1lLAotCQkgICBpbnQgKmxpbmVubywgaW50ICpvZmZzZXQsIGNvbnN0IGNoYXIgKip0ZXh0KQorICAgICAgICAgICAgICAgICAgIGludCAqbGluZW5vLCBpbnQgKm9mZnNldCwgY29uc3QgY2hhciAqKnRleHQpCiB7Ci0JbG9uZyBob2xkOwotCVB5T2JqZWN0ICp2OworICAgIGxvbmcgaG9sZDsKKyAgICBQeU9iamVjdCAqdjsKIAotCS8qIG9sZCBzdHlsZSBlcnJvcnMgKi8KLQlpZiAoUHlUdXBsZV9DaGVjayhlcnIpKQotCQlyZXR1cm4gUHlBcmdfUGFyc2VUdXBsZShlcnIsICJPKHppaXopIiwgbWVzc2FnZSwgZmlsZW5hbWUsCi0JCQkJCWxpbmVubywgb2Zmc2V0LCB0ZXh0KTsKKyAgICAvKiBvbGQgc3R5bGUgZXJyb3JzICovCisgICAgaWYgKFB5VHVwbGVfQ2hlY2soZXJyKSkKKyAgICAgICAgcmV0dXJuIFB5QXJnX1BhcnNlVHVwbGUoZXJyLCAiTyh6aWl6KSIsIG1lc3NhZ2UsIGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lbm8sIG9mZnNldCwgdGV4dCk7CiAKLQkvKiBuZXcgc3R5bGUgZXJyb3JzLiAgYGVycicgaXMgYW4gaW5zdGFuY2UgKi8KKyAgICAvKiBuZXcgc3R5bGUgZXJyb3JzLiAgYGVycicgaXMgYW4gaW5zdGFuY2UgKi8KIAotCWlmICghICh2ID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhlcnIsICJtc2ciKSkpCi0JCWdvdG8gZmluYWxseTsKLQkqbWVzc2FnZSA9IHY7CisgICAgaWYgKCEgKHYgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKGVyciwgIm1zZyIpKSkKKyAgICAgICAgZ290byBmaW5hbGx5OworICAgICptZXNzYWdlID0gdjsKIAotCWlmICghKHYgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKGVyciwgImZpbGVuYW1lIikpKQotCQlnb3RvIGZpbmFsbHk7Ci0JaWYgKHYgPT0gUHlfTm9uZSkKLQkJKmZpbGVuYW1lID0gTlVMTDsKLQllbHNlIGlmICghICgqZmlsZW5hbWUgPSBQeVN0cmluZ19Bc1N0cmluZyh2KSkpCi0JCWdvdG8gZmluYWxseTsKKyAgICBpZiAoISh2ID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhlcnIsICJmaWxlbmFtZSIpKSkKKyAgICAgICAgZ290byBmaW5hbGx5OworICAgIGlmICh2ID09IFB5X05vbmUpCisgICAgICAgICpmaWxlbmFtZSA9IE5VTEw7CisgICAgZWxzZSBpZiAoISAoKmZpbGVuYW1lID0gUHlTdHJpbmdfQXNTdHJpbmcodikpKQorICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQlQeV9ERUNSRUYodik7Ci0JaWYgKCEodiA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoZXJyLCAibGluZW5vIikpKQotCQlnb3RvIGZpbmFsbHk7Ci0JaG9sZCA9IFB5SW50X0FzTG9uZyh2KTsKLQlQeV9ERUNSRUYodik7Ci0JdiA9IE5VTEw7Ci0JaWYgKGhvbGQgPCAwICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCWdvdG8gZmluYWxseTsKLQkqbGluZW5vID0gKGludClob2xkOworICAgIFB5X0RFQ1JFRih2KTsKKyAgICBpZiAoISh2ID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhlcnIsICJsaW5lbm8iKSkpCisgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICBob2xkID0gUHlJbnRfQXNMb25nKHYpOworICAgIFB5X0RFQ1JFRih2KTsKKyAgICB2ID0gTlVMTDsKKyAgICBpZiAoaG9sZCA8IDAgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgZ290byBmaW5hbGx5OworICAgICpsaW5lbm8gPSAoaW50KWhvbGQ7CiAKLQlpZiAoISh2ID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhlcnIsICJvZmZzZXQiKSkpCi0JCWdvdG8gZmluYWxseTsKLQlpZiAodiA9PSBQeV9Ob25lKSB7Ci0JCSpvZmZzZXQgPSAtMTsKLQkJUHlfREVDUkVGKHYpOwotCQl2ID0gTlVMTDsKLQl9IGVsc2UgewotCQlob2xkID0gUHlJbnRfQXNMb25nKHYpOwotCQlQeV9ERUNSRUYodik7Ci0JCXYgPSBOVUxMOwotCQlpZiAoaG9sZCA8IDAgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJCWdvdG8gZmluYWxseTsKLQkJKm9mZnNldCA9IChpbnQpaG9sZDsKLQl9CisgICAgaWYgKCEodiA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoZXJyLCAib2Zmc2V0IikpKQorICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgaWYgKHYgPT0gUHlfTm9uZSkgeworICAgICAgICAqb2Zmc2V0ID0gLTE7CisgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgdiA9IE5VTEw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaG9sZCA9IFB5SW50X0FzTG9uZyh2KTsKKyAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICB2ID0gTlVMTDsKKyAgICAgICAgaWYgKGhvbGQgPCAwICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgICAgICpvZmZzZXQgPSAoaW50KWhvbGQ7CisgICAgfQogCi0JaWYgKCEodiA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoZXJyLCAidGV4dCIpKSkKLQkJZ290byBmaW5hbGx5OwotCWlmICh2ID09IFB5X05vbmUpCi0JCSp0ZXh0ID0gTlVMTDsKLQllbHNlIGlmICghICgqdGV4dCA9IFB5U3RyaW5nX0FzU3RyaW5nKHYpKSkKLQkJZ290byBmaW5hbGx5OwotCVB5X0RFQ1JFRih2KTsKLQlyZXR1cm4gMTsKKyAgICBpZiAoISh2ID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhlcnIsICJ0ZXh0IikpKQorICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgaWYgKHYgPT0gUHlfTm9uZSkKKyAgICAgICAgKnRleHQgPSBOVUxMOworICAgIGVsc2UgaWYgKCEgKCp0ZXh0ID0gUHlTdHJpbmdfQXNTdHJpbmcodikpKQorICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgUHlfREVDUkVGKHYpOworICAgIHJldHVybiAxOwogCiBmaW5hbGx5OgotCVB5X1hERUNSRUYodik7Ci0JcmV0dXJuIDA7CisgICAgUHlfWERFQ1JFRih2KTsKKyAgICByZXR1cm4gMDsKIH0KIAogdm9pZAogUHlFcnJfUHJpbnQodm9pZCkKIHsKLQlQeUVycl9QcmludEV4KDEpOworICAgIFB5RXJyX1ByaW50RXgoMSk7CiB9CiAKIHN0YXRpYyB2b2lkCiBwcmludF9lcnJvcl90ZXh0KFB5T2JqZWN0ICpmLCBpbnQgb2Zmc2V0LCBjb25zdCBjaGFyICp0ZXh0KQogewotCWNoYXIgKm5sOwotCWlmIChvZmZzZXQgPj0gMCkgewotCQlpZiAob2Zmc2V0ID4gMCAmJiBvZmZzZXQgPT0gKGludClzdHJsZW4odGV4dCkpCi0JCQlvZmZzZXQtLTsKLQkJZm9yICg7OykgewotCQkJbmwgPSBzdHJjaHIodGV4dCwgJ1xuJyk7Ci0JCQlpZiAobmwgPT0gTlVMTCB8fCBubC10ZXh0ID49IG9mZnNldCkKLQkJCQlicmVhazsKLQkJCW9mZnNldCAtPSAoaW50KShubCsxLXRleHQpOwotCQkJdGV4dCA9IG5sKzE7Ci0JCX0KLQkJd2hpbGUgKCp0ZXh0ID09ICcgJyB8fCAqdGV4dCA9PSAnXHQnKSB7Ci0JCQl0ZXh0Kys7Ci0JCQlvZmZzZXQtLTsKLQkJfQotCX0KLQlQeUZpbGVfV3JpdGVTdHJpbmcoIiAgICAiLCBmKTsKLQlQeUZpbGVfV3JpdGVTdHJpbmcodGV4dCwgZik7Ci0JaWYgKCp0ZXh0ID09ICdcMCcgfHwgdGV4dFtzdHJsZW4odGV4dCktMV0gIT0gJ1xuJykKLQkJUHlGaWxlX1dyaXRlU3RyaW5nKCJcbiIsIGYpOwotCWlmIChvZmZzZXQgPT0gLTEpCi0JCXJldHVybjsKLQlQeUZpbGVfV3JpdGVTdHJpbmcoIiAgICAiLCBmKTsKLQlvZmZzZXQtLTsKLQl3aGlsZSAob2Zmc2V0ID4gMCkgewotCQlQeUZpbGVfV3JpdGVTdHJpbmcoIiAiLCBmKTsKLQkJb2Zmc2V0LS07Ci0JfQotCVB5RmlsZV9Xcml0ZVN0cmluZygiXlxuIiwgZik7CisgICAgY2hhciAqbmw7CisgICAgaWYgKG9mZnNldCA+PSAwKSB7CisgICAgICAgIGlmIChvZmZzZXQgPiAwICYmIG9mZnNldCA9PSAoaW50KXN0cmxlbih0ZXh0KSkKKyAgICAgICAgICAgIG9mZnNldC0tOworICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICBubCA9IHN0cmNocih0ZXh0LCAnXG4nKTsKKyAgICAgICAgICAgIGlmIChubCA9PSBOVUxMIHx8IG5sLXRleHQgPj0gb2Zmc2V0KQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgb2Zmc2V0IC09IChpbnQpKG5sKzEtdGV4dCk7CisgICAgICAgICAgICB0ZXh0ID0gbmwrMTsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAoKnRleHQgPT0gJyAnIHx8ICp0ZXh0ID09ICdcdCcpIHsKKyAgICAgICAgICAgIHRleHQrKzsKKyAgICAgICAgICAgIG9mZnNldC0tOworICAgICAgICB9CisgICAgfQorICAgIFB5RmlsZV9Xcml0ZVN0cmluZygiICAgICIsIGYpOworICAgIFB5RmlsZV9Xcml0ZVN0cmluZyh0ZXh0LCBmKTsKKyAgICBpZiAoKnRleHQgPT0gJ1wwJyB8fCB0ZXh0W3N0cmxlbih0ZXh0KS0xXSAhPSAnXG4nKQorICAgICAgICBQeUZpbGVfV3JpdGVTdHJpbmcoIlxuIiwgZik7CisgICAgaWYgKG9mZnNldCA9PSAtMSkKKyAgICAgICAgcmV0dXJuOworICAgIFB5RmlsZV9Xcml0ZVN0cmluZygiICAgICIsIGYpOworICAgIG9mZnNldC0tOworICAgIHdoaWxlIChvZmZzZXQgPiAwKSB7CisgICAgICAgIFB5RmlsZV9Xcml0ZVN0cmluZygiICIsIGYpOworICAgICAgICBvZmZzZXQtLTsKKyAgICB9CisgICAgUHlGaWxlX1dyaXRlU3RyaW5nKCJeXG4iLCBmKTsKIH0KIAogc3RhdGljIHZvaWQKIGhhbmRsZV9zeXN0ZW1fZXhpdCh2b2lkKQogewotCVB5T2JqZWN0ICpleGNlcHRpb24sICp2YWx1ZSwgKnRiOwotCWludCBleGl0Y29kZSA9IDA7CisgICAgUHlPYmplY3QgKmV4Y2VwdGlvbiwgKnZhbHVlLCAqdGI7CisgICAgaW50IGV4aXRjb2RlID0gMDsKIAotCWlmIChQeV9JbnNwZWN0RmxhZykKLQkJLyogRG9uJ3QgZXhpdCBpZiAtaSBmbGFnIHdhcyBnaXZlbi4gVGhpcyBmbGFnIGlzIHNldCB0byAwCi0JCSAqIHdoZW4gZW50ZXJpbmcgaW50ZXJhY3RpdmUgbW9kZSBmb3IgaW5zcGVjdGluZy4gKi8KLQkJcmV0dXJuOworICAgIGlmIChQeV9JbnNwZWN0RmxhZykKKyAgICAgICAgLyogRG9uJ3QgZXhpdCBpZiAtaSBmbGFnIHdhcyBnaXZlbi4gVGhpcyBmbGFnIGlzIHNldCB0byAwCisgICAgICAgICAqIHdoZW4gZW50ZXJpbmcgaW50ZXJhY3RpdmUgbW9kZSBmb3IgaW5zcGVjdGluZy4gKi8KKyAgICAgICAgcmV0dXJuOwogCi0JUHlFcnJfRmV0Y2goJmV4Y2VwdGlvbiwgJnZhbHVlLCAmdGIpOwotCWlmIChQeV9GbHVzaExpbmUoKSkKLQkJUHlFcnJfQ2xlYXIoKTsKLQlmZmx1c2goc3Rkb3V0KTsKLQlpZiAodmFsdWUgPT0gTlVMTCB8fCB2YWx1ZSA9PSBQeV9Ob25lKQotCQlnb3RvIGRvbmU7Ci0JaWYgKFB5RXhjZXB0aW9uSW5zdGFuY2VfQ2hlY2sodmFsdWUpKSB7Ci0JCS8qIFRoZSBlcnJvciBjb2RlIHNob3VsZCBiZSBpbiB0aGUgYGNvZGUnIGF0dHJpYnV0ZS4gKi8KLQkJUHlPYmplY3QgKmNvZGUgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHZhbHVlLCAiY29kZSIpOwotCQlpZiAoY29kZSkgewotCQkJUHlfREVDUkVGKHZhbHVlKTsKLQkJCXZhbHVlID0gY29kZTsKLQkJCWlmICh2YWx1ZSA9PSBQeV9Ob25lKQotCQkJCWdvdG8gZG9uZTsKLQkJfQotCQkvKiBJZiB3ZSBmYWlsZWQgdG8gZGlnIG91dCB0aGUgJ2NvZGUnIGF0dHJpYnV0ZSwKLQkJICAganVzdCBsZXQgdGhlIGVsc2UgY2xhdXNlIGJlbG93IHByaW50IHRoZSBlcnJvci4gKi8KLQl9Ci0JaWYgKFB5SW50X0NoZWNrKHZhbHVlKSkKLQkJZXhpdGNvZGUgPSAoaW50KVB5SW50X0FzTG9uZyh2YWx1ZSk7Ci0JZWxzZSB7Ci0JCVB5T2JqZWN0X1ByaW50KHZhbHVlLCBzdGRlcnIsIFB5X1BSSU5UX1JBVyk7Ci0JCVB5U3lzX1dyaXRlU3RkZXJyKCJcbiIpOwotCQlleGl0Y29kZSA9IDE7Ci0JfQorICAgIFB5RXJyX0ZldGNoKCZleGNlcHRpb24sICZ2YWx1ZSwgJnRiKTsKKyAgICBpZiAoUHlfRmx1c2hMaW5lKCkpCisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgaWYgKHZhbHVlID09IE5VTEwgfHwgdmFsdWUgPT0gUHlfTm9uZSkKKyAgICAgICAgZ290byBkb25lOworICAgIGlmIChQeUV4Y2VwdGlvbkluc3RhbmNlX0NoZWNrKHZhbHVlKSkgeworICAgICAgICAvKiBUaGUgZXJyb3IgY29kZSBzaG91bGQgYmUgaW4gdGhlIGBjb2RlJyBhdHRyaWJ1dGUuICovCisgICAgICAgIFB5T2JqZWN0ICpjb2RlID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyh2YWx1ZSwgImNvZGUiKTsKKyAgICAgICAgaWYgKGNvZGUpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih2YWx1ZSk7CisgICAgICAgICAgICB2YWx1ZSA9IGNvZGU7CisgICAgICAgICAgICBpZiAodmFsdWUgPT0gUHlfTm9uZSkKKyAgICAgICAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgIH0KKyAgICAgICAgLyogSWYgd2UgZmFpbGVkIHRvIGRpZyBvdXQgdGhlICdjb2RlJyBhdHRyaWJ1dGUsCisgICAgICAgICAgIGp1c3QgbGV0IHRoZSBlbHNlIGNsYXVzZSBiZWxvdyBwcmludCB0aGUgZXJyb3IuICovCisgICAgfQorICAgIGlmIChQeUludF9DaGVjayh2YWx1ZSkpCisgICAgICAgIGV4aXRjb2RlID0gKGludClQeUludF9Bc0xvbmcodmFsdWUpOworICAgIGVsc2UgeworICAgICAgICBQeU9iamVjdF9QcmludCh2YWx1ZSwgc3RkZXJyLCBQeV9QUklOVF9SQVcpOworICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigiXG4iKTsKKyAgICAgICAgZXhpdGNvZGUgPSAxOworICAgIH0KICBkb25lOgotCS8qIFJlc3RvcmUgYW5kIGNsZWFyIHRoZSBleGNlcHRpb24gaW5mbywgaW4gb3JkZXIgdG8gcHJvcGVybHkgZGVjcmVmCi0JICogdGhlIGV4Y2VwdGlvbiwgdmFsdWUsIGFuZCB0cmFjZWJhY2suCSBJZiB3ZSBqdXN0IGV4aXQgaW5zdGVhZCwKLQkgKiB0aGVzZSBsZWFrLCB3aGljaCBjb25mdXNlcyBQWVRIT05EVU1QUkVGUyBvdXRwdXQsIGFuZCBtYXkgcHJldmVudAotCSAqIHNvbWUgZmluYWxpemVycyBmcm9tIHJ1bm5pbmcuCi0JICovCi0JUHlFcnJfUmVzdG9yZShleGNlcHRpb24sIHZhbHVlLCB0Yik7Ci0JUHlFcnJfQ2xlYXIoKTsKLQlQeV9FeGl0KGV4aXRjb2RlKTsKLQkvKiBOT1RSRUFDSEVEICovCisgICAgLyogUmVzdG9yZSBhbmQgY2xlYXIgdGhlIGV4Y2VwdGlvbiBpbmZvLCBpbiBvcmRlciB0byBwcm9wZXJseSBkZWNyZWYKKyAgICAgKiB0aGUgZXhjZXB0aW9uLCB2YWx1ZSwgYW5kIHRyYWNlYmFjay4gICAgICBJZiB3ZSBqdXN0IGV4aXQgaW5zdGVhZCwKKyAgICAgKiB0aGVzZSBsZWFrLCB3aGljaCBjb25mdXNlcyBQWVRIT05EVU1QUkVGUyBvdXRwdXQsIGFuZCBtYXkgcHJldmVudAorICAgICAqIHNvbWUgZmluYWxpemVycyBmcm9tIHJ1bm5pbmcuCisgICAgICovCisgICAgUHlFcnJfUmVzdG9yZShleGNlcHRpb24sIHZhbHVlLCB0Yik7CisgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICBQeV9FeGl0KGV4aXRjb2RlKTsKKyAgICAvKiBOT1RSRUFDSEVEICovCiB9CiAKIHZvaWQKIFB5RXJyX1ByaW50RXgoaW50IHNldF9zeXNfbGFzdF92YXJzKQogewotCVB5T2JqZWN0ICpleGNlcHRpb24sICp2LCAqdGIsICpob29rOworICAgIFB5T2JqZWN0ICpleGNlcHRpb24sICp2LCAqdGIsICpob29rOwogCi0JaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfU3lzdGVtRXhpdCkpIHsKLQkJaGFuZGxlX3N5c3RlbV9leGl0KCk7Ci0JfQotCVB5RXJyX0ZldGNoKCZleGNlcHRpb24sICZ2LCAmdGIpOwotCWlmIChleGNlcHRpb24gPT0gTlVMTCkKLQkJcmV0dXJuOwotCVB5RXJyX05vcm1hbGl6ZUV4Y2VwdGlvbigmZXhjZXB0aW9uLCAmdiwgJnRiKTsKLQlpZiAoZXhjZXB0aW9uID09IE5VTEwpCi0JCXJldHVybjsKLQkvKiBOb3cgd2Uga25vdyB2ICE9IE5VTEwgdG9vICovCi0JaWYgKHNldF9zeXNfbGFzdF92YXJzKSB7Ci0JCVB5U3lzX1NldE9iamVjdCgibGFzdF90eXBlIiwgZXhjZXB0aW9uKTsKLQkJUHlTeXNfU2V0T2JqZWN0KCJsYXN0X3ZhbHVlIiwgdik7Ci0JCVB5U3lzX1NldE9iamVjdCgibGFzdF90cmFjZWJhY2siLCB0Yik7Ci0JfQotCWhvb2sgPSBQeVN5c19HZXRPYmplY3QoImV4Y2VwdGhvb2siKTsKLQlpZiAoaG9vaykgewotCQlQeU9iamVjdCAqYXJncyA9IFB5VHVwbGVfUGFjaygzLAotCQkgICAgZXhjZXB0aW9uLCB2LCB0YiA/IHRiIDogUHlfTm9uZSk7Ci0JCVB5T2JqZWN0ICpyZXN1bHQgPSBQeUV2YWxfQ2FsbE9iamVjdChob29rLCBhcmdzKTsKLQkJaWYgKHJlc3VsdCA9PSBOVUxMKSB7Ci0JCQlQeU9iamVjdCAqZXhjZXB0aW9uMiwgKnYyLCAqdGIyOwotCQkJaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfU3lzdGVtRXhpdCkpIHsKLQkJCQloYW5kbGVfc3lzdGVtX2V4aXQoKTsKLQkJCX0KLQkJCVB5RXJyX0ZldGNoKCZleGNlcHRpb24yLCAmdjIsICZ0YjIpOwotCQkJUHlFcnJfTm9ybWFsaXplRXhjZXB0aW9uKCZleGNlcHRpb24yLCAmdjIsICZ0YjIpOwotCQkJLyogSXQgc2hvdWxkIG5vdCBiZSBwb3NzaWJsZSBmb3IgZXhjZXB0aW9uMiBvciB2MgotCQkJICAgdG8gYmUgTlVMTC4gSG93ZXZlciBQeUVycl9EaXNwbGF5KCkgY2FuJ3QKLQkJCSAgIHRvbGVyYXRlIE5VTExzLCBzbyBqdXN0IGJlIHNhZmUuICovCi0JCQlpZiAoZXhjZXB0aW9uMiA9PSBOVUxMKSB7Ci0JCQkJZXhjZXB0aW9uMiA9IFB5X05vbmU7Ci0JCQkJUHlfSU5DUkVGKGV4Y2VwdGlvbjIpOwotCQkJfQotCQkJaWYgKHYyID09IE5VTEwpIHsKLQkJCQl2MiA9IFB5X05vbmU7Ci0JCQkJUHlfSU5DUkVGKHYyKTsKLQkJCX0KLQkJCWlmIChQeV9GbHVzaExpbmUoKSkKLQkJCQlQeUVycl9DbGVhcigpOwotCQkJZmZsdXNoKHN0ZG91dCk7Ci0JCQlQeVN5c19Xcml0ZVN0ZGVycigiRXJyb3IgaW4gc3lzLmV4Y2VwdGhvb2s6XG4iKTsKLQkJCVB5RXJyX0Rpc3BsYXkoZXhjZXB0aW9uMiwgdjIsIHRiMik7Ci0JCQlQeVN5c19Xcml0ZVN0ZGVycigiXG5PcmlnaW5hbCBleGNlcHRpb24gd2FzOlxuIik7Ci0JCQlQeUVycl9EaXNwbGF5KGV4Y2VwdGlvbiwgdiwgdGIpOwotCQkJUHlfREVDUkVGKGV4Y2VwdGlvbjIpOwotCQkJUHlfREVDUkVGKHYyKTsKLQkJCVB5X1hERUNSRUYodGIyKTsKLQkJfQotCQlQeV9YREVDUkVGKHJlc3VsdCk7Ci0JCVB5X1hERUNSRUYoYXJncyk7Ci0JfSBlbHNlIHsKLQkJUHlTeXNfV3JpdGVTdGRlcnIoInN5cy5leGNlcHRob29rIGlzIG1pc3NpbmdcbiIpOwotCQlQeUVycl9EaXNwbGF5KGV4Y2VwdGlvbiwgdiwgdGIpOwotCX0KLQlQeV9YREVDUkVGKGV4Y2VwdGlvbik7Ci0JUHlfWERFQ1JFRih2KTsKLQlQeV9YREVDUkVGKHRiKTsKKyAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19TeXN0ZW1FeGl0KSkgeworICAgICAgICBoYW5kbGVfc3lzdGVtX2V4aXQoKTsKKyAgICB9CisgICAgUHlFcnJfRmV0Y2goJmV4Y2VwdGlvbiwgJnYsICZ0Yik7CisgICAgaWYgKGV4Y2VwdGlvbiA9PSBOVUxMKQorICAgICAgICByZXR1cm47CisgICAgUHlFcnJfTm9ybWFsaXplRXhjZXB0aW9uKCZleGNlcHRpb24sICZ2LCAmdGIpOworICAgIGlmIChleGNlcHRpb24gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOworICAgIC8qIE5vdyB3ZSBrbm93IHYgIT0gTlVMTCB0b28gKi8KKyAgICBpZiAoc2V0X3N5c19sYXN0X3ZhcnMpIHsKKyAgICAgICAgUHlTeXNfU2V0T2JqZWN0KCJsYXN0X3R5cGUiLCBleGNlcHRpb24pOworICAgICAgICBQeVN5c19TZXRPYmplY3QoImxhc3RfdmFsdWUiLCB2KTsKKyAgICAgICAgUHlTeXNfU2V0T2JqZWN0KCJsYXN0X3RyYWNlYmFjayIsIHRiKTsKKyAgICB9CisgICAgaG9vayA9IFB5U3lzX0dldE9iamVjdCgiZXhjZXB0aG9vayIpOworICAgIGlmIChob29rKSB7CisgICAgICAgIFB5T2JqZWN0ICphcmdzID0gUHlUdXBsZV9QYWNrKDMsCisgICAgICAgICAgICBleGNlcHRpb24sIHYsIHRiID8gdGIgOiBQeV9Ob25lKTsKKyAgICAgICAgUHlPYmplY3QgKnJlc3VsdCA9IFB5RXZhbF9DYWxsT2JqZWN0KGhvb2ssIGFyZ3MpOworICAgICAgICBpZiAocmVzdWx0ID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpleGNlcHRpb24yLCAqdjIsICp0YjI7CisgICAgICAgICAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19TeXN0ZW1FeGl0KSkgeworICAgICAgICAgICAgICAgIGhhbmRsZV9zeXN0ZW1fZXhpdCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlFcnJfRmV0Y2goJmV4Y2VwdGlvbjIsICZ2MiwgJnRiMik7CisgICAgICAgICAgICBQeUVycl9Ob3JtYWxpemVFeGNlcHRpb24oJmV4Y2VwdGlvbjIsICZ2MiwgJnRiMik7CisgICAgICAgICAgICAvKiBJdCBzaG91bGQgbm90IGJlIHBvc3NpYmxlIGZvciBleGNlcHRpb24yIG9yIHYyCisgICAgICAgICAgICAgICB0byBiZSBOVUxMLiBIb3dldmVyIFB5RXJyX0Rpc3BsYXkoKSBjYW4ndAorICAgICAgICAgICAgICAgdG9sZXJhdGUgTlVMTHMsIHNvIGp1c3QgYmUgc2FmZS4gKi8KKyAgICAgICAgICAgIGlmIChleGNlcHRpb24yID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBleGNlcHRpb24yID0gUHlfTm9uZTsKKyAgICAgICAgICAgICAgICBQeV9JTkNSRUYoZXhjZXB0aW9uMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodjIgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHYyID0gUHlfTm9uZTsKKyAgICAgICAgICAgICAgICBQeV9JTkNSRUYodjIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKFB5X0ZsdXNoTGluZSgpKQorICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICAgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCJFcnJvciBpbiBzeXMuZXhjZXB0aG9vazpcbiIpOworICAgICAgICAgICAgUHlFcnJfRGlzcGxheShleGNlcHRpb24yLCB2MiwgdGIyKTsKKyAgICAgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCJcbk9yaWdpbmFsIGV4Y2VwdGlvbiB3YXM6XG4iKTsKKyAgICAgICAgICAgIFB5RXJyX0Rpc3BsYXkoZXhjZXB0aW9uLCB2LCB0Yik7CisgICAgICAgICAgICBQeV9ERUNSRUYoZXhjZXB0aW9uMik7CisgICAgICAgICAgICBQeV9ERUNSRUYodjIpOworICAgICAgICAgICAgUHlfWERFQ1JFRih0YjIpOworICAgICAgICB9CisgICAgICAgIFB5X1hERUNSRUYocmVzdWx0KTsKKyAgICAgICAgUHlfWERFQ1JFRihhcmdzKTsKKyAgICB9IGVsc2UgeworICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigic3lzLmV4Y2VwdGhvb2sgaXMgbWlzc2luZ1xuIik7CisgICAgICAgIFB5RXJyX0Rpc3BsYXkoZXhjZXB0aW9uLCB2LCB0Yik7CisgICAgfQorICAgIFB5X1hERUNSRUYoZXhjZXB0aW9uKTsKKyAgICBQeV9YREVDUkVGKHYpOworICAgIFB5X1hERUNSRUYodGIpOwogfQogCiB2b2lkCiBQeUVycl9EaXNwbGF5KFB5T2JqZWN0ICpleGNlcHRpb24sIFB5T2JqZWN0ICp2YWx1ZSwgUHlPYmplY3QgKnRiKQogewotCWludCBlcnIgPSAwOwotCVB5T2JqZWN0ICpmID0gUHlTeXNfR2V0T2JqZWN0KCJzdGRlcnIiKTsKLQlQeV9JTkNSRUYodmFsdWUpOwotCWlmIChmID09IE5VTEwpCi0JCWZwcmludGYoc3RkZXJyLCAibG9zdCBzeXMuc3RkZXJyXG4iKTsKLQllbHNlIHsKLQkJaWYgKFB5X0ZsdXNoTGluZSgpKQotCQkJUHlFcnJfQ2xlYXIoKTsKLQkJZmZsdXNoKHN0ZG91dCk7Ci0JCWlmICh0YiAmJiB0YiAhPSBQeV9Ob25lKQotCQkJZXJyID0gUHlUcmFjZUJhY2tfUHJpbnQodGIsIGYpOwotCQlpZiAoZXJyID09IDAgJiYKLQkJICAgIFB5T2JqZWN0X0hhc0F0dHJTdHJpbmcodmFsdWUsICJwcmludF9maWxlX2FuZF9saW5lIikpCi0JCXsKLQkJCVB5T2JqZWN0ICptZXNzYWdlOwotCQkJY29uc3QgY2hhciAqZmlsZW5hbWUsICp0ZXh0OwotCQkJaW50IGxpbmVubywgb2Zmc2V0OwotCQkJaWYgKCFwYXJzZV9zeW50YXhfZXJyb3IodmFsdWUsICZtZXNzYWdlLCAmZmlsZW5hbWUsCi0JCQkJCQkmbGluZW5vLCAmb2Zmc2V0LCAmdGV4dCkpCi0JCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCWVsc2UgewotCQkJCWNoYXIgYnVmWzEwXTsKLQkJCQlQeUZpbGVfV3JpdGVTdHJpbmcoIiAgRmlsZSBcIiIsIGYpOwotCQkJCWlmIChmaWxlbmFtZSA9PSBOVUxMKQotCQkJCQlQeUZpbGVfV3JpdGVTdHJpbmcoIjxzdHJpbmc+IiwgZik7Ci0JCQkJZWxzZQotCQkJCQlQeUZpbGVfV3JpdGVTdHJpbmcoZmlsZW5hbWUsIGYpOwotCQkJCVB5RmlsZV9Xcml0ZVN0cmluZygiXCIsIGxpbmUgIiwgZik7Ci0JCQkJUHlPU19zbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJWQiLCBsaW5lbm8pOwotCQkJCVB5RmlsZV9Xcml0ZVN0cmluZyhidWYsIGYpOwotCQkJCVB5RmlsZV9Xcml0ZVN0cmluZygiXG4iLCBmKTsKLQkJCQlpZiAodGV4dCAhPSBOVUxMKQotCQkJCQlwcmludF9lcnJvcl90ZXh0KGYsIG9mZnNldCwgdGV4dCk7Ci0JCQkJUHlfREVDUkVGKHZhbHVlKTsKLQkJCQl2YWx1ZSA9IG1lc3NhZ2U7Ci0JCQkJLyogQ2FuJ3QgYmUgYm90aGVyZWQgdG8gY2hlY2sgYWxsIHRob3NlCi0JCQkJICAgUHlGaWxlX1dyaXRlU3RyaW5nKCkgY2FsbHMgKi8KLQkJCQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkKLQkJCQkJZXJyID0gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVycikgewotCQkJLyogRG9uJ3QgZG8gYW55dGhpbmcgZWxzZSAqLwotCQl9Ci0JCWVsc2UgaWYgKFB5RXhjZXB0aW9uQ2xhc3NfQ2hlY2soZXhjZXB0aW9uKSkgewotCQkJUHlPYmplY3QqIG1vZHVsZU5hbWU7Ci0JCQljaGFyKiBjbGFzc05hbWUgPSBQeUV4Y2VwdGlvbkNsYXNzX05hbWUoZXhjZXB0aW9uKTsKLQkJCWlmIChjbGFzc05hbWUgIT0gTlVMTCkgewotCQkJCWNoYXIgKmRvdCA9IHN0cnJjaHIoY2xhc3NOYW1lLCAnLicpOwotCQkJCWlmIChkb3QgIT0gTlVMTCkKLQkJCQkJY2xhc3NOYW1lID0gZG90KzE7Ci0JCQl9CisgICAgaW50IGVyciA9IDA7CisgICAgUHlPYmplY3QgKmYgPSBQeVN5c19HZXRPYmplY3QoInN0ZGVyciIpOworICAgIFB5X0lOQ1JFRih2YWx1ZSk7CisgICAgaWYgKGYgPT0gTlVMTCkKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJsb3N0IHN5cy5zdGRlcnJcbiIpOworICAgIGVsc2UgeworICAgICAgICBpZiAoUHlfRmx1c2hMaW5lKCkpCisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICAgICAgaWYgKHRiICYmIHRiICE9IFB5X05vbmUpCisgICAgICAgICAgICBlcnIgPSBQeVRyYWNlQmFja19QcmludCh0YiwgZik7CisgICAgICAgIGlmIChlcnIgPT0gMCAmJgorICAgICAgICAgICAgUHlPYmplY3RfSGFzQXR0clN0cmluZyh2YWx1ZSwgInByaW50X2ZpbGVfYW5kX2xpbmUiKSkKKyAgICAgICAgeworICAgICAgICAgICAgUHlPYmplY3QgKm1lc3NhZ2U7CisgICAgICAgICAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwgKnRleHQ7CisgICAgICAgICAgICBpbnQgbGluZW5vLCBvZmZzZXQ7CisgICAgICAgICAgICBpZiAoIXBhcnNlX3N5bnRheF9lcnJvcih2YWx1ZSwgJm1lc3NhZ2UsICZmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsaW5lbm8sICZvZmZzZXQsICZ0ZXh0KSkKKyAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgY2hhciBidWZbMTBdOworICAgICAgICAgICAgICAgIFB5RmlsZV9Xcml0ZVN0cmluZygiICBGaWxlIFwiIiwgZik7CisgICAgICAgICAgICAgICAgaWYgKGZpbGVuYW1lID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIFB5RmlsZV9Xcml0ZVN0cmluZygiPHN0cmluZz4iLCBmKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIFB5RmlsZV9Xcml0ZVN0cmluZyhmaWxlbmFtZSwgZik7CisgICAgICAgICAgICAgICAgUHlGaWxlX1dyaXRlU3RyaW5nKCJcIiwgbGluZSAiLCBmKTsKKyAgICAgICAgICAgICAgICBQeU9TX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlZCIsIGxpbmVubyk7CisgICAgICAgICAgICAgICAgUHlGaWxlX1dyaXRlU3RyaW5nKGJ1ZiwgZik7CisgICAgICAgICAgICAgICAgUHlGaWxlX1dyaXRlU3RyaW5nKCJcbiIsIGYpOworICAgICAgICAgICAgICAgIGlmICh0ZXh0ICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHByaW50X2Vycm9yX3RleHQoZiwgb2Zmc2V0LCB0ZXh0KTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYodmFsdWUpOworICAgICAgICAgICAgICAgIHZhbHVlID0gbWVzc2FnZTsKKyAgICAgICAgICAgICAgICAvKiBDYW4ndCBiZSBib3RoZXJlZCB0byBjaGVjayBhbGwgdGhvc2UKKyAgICAgICAgICAgICAgICAgICBQeUZpbGVfV3JpdGVTdHJpbmcoKSBjYWxscyAqLworICAgICAgICAgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgICAgICAgICBlcnIgPSAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoZXJyKSB7CisgICAgICAgICAgICAvKiBEb24ndCBkbyBhbnl0aGluZyBlbHNlICovCisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoUHlFeGNlcHRpb25DbGFzc19DaGVjayhleGNlcHRpb24pKSB7CisgICAgICAgICAgICBQeU9iamVjdCogbW9kdWxlTmFtZTsKKyAgICAgICAgICAgIGNoYXIqIGNsYXNzTmFtZSA9IFB5RXhjZXB0aW9uQ2xhc3NfTmFtZShleGNlcHRpb24pOworICAgICAgICAgICAgaWYgKGNsYXNzTmFtZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgY2hhciAqZG90ID0gc3RycmNocihjbGFzc05hbWUsICcuJyk7CisgICAgICAgICAgICAgICAgaWYgKGRvdCAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSBkb3QrMTsKKyAgICAgICAgICAgIH0KIAotCQkJbW9kdWxlTmFtZSA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoZXhjZXB0aW9uLCAiX19tb2R1bGVfXyIpOwotCQkJaWYgKG1vZHVsZU5hbWUgPT0gTlVMTCkKLQkJCQllcnIgPSBQeUZpbGVfV3JpdGVTdHJpbmcoIjx1bmtub3duPiIsIGYpOwotCQkJZWxzZSB7Ci0JCQkJY2hhciogbW9kc3RyID0gUHlTdHJpbmdfQXNTdHJpbmcobW9kdWxlTmFtZSk7Ci0JCQkJaWYgKG1vZHN0ciAmJiBzdHJjbXAobW9kc3RyLCAiZXhjZXB0aW9ucyIpKQotCQkJCXsKLQkJCQkJZXJyID0gUHlGaWxlX1dyaXRlU3RyaW5nKG1vZHN0ciwgZik7Ci0JCQkJCWVyciArPSBQeUZpbGVfV3JpdGVTdHJpbmcoIi4iLCBmKTsKLQkJCQl9Ci0JCQkJUHlfREVDUkVGKG1vZHVsZU5hbWUpOwotCQkJfQotCQkJaWYgKGVyciA9PSAwKSB7Ci0JCQkJaWYgKGNsYXNzTmFtZSA9PSBOVUxMKQotCQkJCSAgICAgIGVyciA9IFB5RmlsZV9Xcml0ZVN0cmluZygiPHVua25vd24+IiwgZik7Ci0JCQkJZWxzZQotCQkJCSAgICAgIGVyciA9IFB5RmlsZV9Xcml0ZVN0cmluZyhjbGFzc05hbWUsIGYpOwotCQkJfQotCQl9Ci0JCWVsc2UKLQkJCWVyciA9IFB5RmlsZV9Xcml0ZU9iamVjdChleGNlcHRpb24sIGYsIFB5X1BSSU5UX1JBVyk7Ci0JCWlmIChlcnIgPT0gMCAmJiAodmFsdWUgIT0gUHlfTm9uZSkpIHsKLQkJCVB5T2JqZWN0ICpzID0gUHlPYmplY3RfU3RyKHZhbHVlKTsKLQkJCS8qIG9ubHkgcHJpbnQgY29sb24gaWYgdGhlIHN0cigpIG9mIHRoZQotCQkJICAgb2JqZWN0IGlzIG5vdCB0aGUgZW1wdHkgc3RyaW5nCi0JCQkqLwotCQkJaWYgKHMgPT0gTlVMTCkKLQkJCQllcnIgPSAtMTsKLQkJCWVsc2UgaWYgKCFQeVN0cmluZ19DaGVjayhzKSB8fAotCQkJCSBQeVN0cmluZ19HRVRfU0laRShzKSAhPSAwKQotCQkJCWVyciA9IFB5RmlsZV9Xcml0ZVN0cmluZygiOiAiLCBmKTsKLQkJCWlmIChlcnIgPT0gMCkKLQkJCSAgZXJyID0gUHlGaWxlX1dyaXRlT2JqZWN0KHMsIGYsIFB5X1BSSU5UX1JBVyk7Ci0JCQlQeV9YREVDUkVGKHMpOwotCQl9Ci0JCS8qIHRyeSB0byB3cml0ZSBhIG5ld2xpbmUgaW4gYW55IGNhc2UgKi8KLQkJZXJyICs9IFB5RmlsZV9Xcml0ZVN0cmluZygiXG4iLCBmKTsKLQl9Ci0JUHlfREVDUkVGKHZhbHVlKTsKLQkvKiBJZiBhbiBlcnJvciBoYXBwZW5lZCBoZXJlLCBkb24ndCBzaG93IGl0LgotCSAgIFhYWCBUaGlzIGlzIHdyb25nLCBidXQgdG9vIG1hbnkgY2FsbGVycyByZWx5IG9uIHRoaXMgYmVoYXZpb3IuICovCi0JaWYgKGVyciAhPSAwKQotCQlQeUVycl9DbGVhcigpOworICAgICAgICAgICAgbW9kdWxlTmFtZSA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoZXhjZXB0aW9uLCAiX19tb2R1bGVfXyIpOworICAgICAgICAgICAgaWYgKG1vZHVsZU5hbWUgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBlcnIgPSBQeUZpbGVfV3JpdGVTdHJpbmcoIjx1bmtub3duPiIsIGYpOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgY2hhciogbW9kc3RyID0gUHlTdHJpbmdfQXNTdHJpbmcobW9kdWxlTmFtZSk7CisgICAgICAgICAgICAgICAgaWYgKG1vZHN0ciAmJiBzdHJjbXAobW9kc3RyLCAiZXhjZXB0aW9ucyIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gUHlGaWxlX1dyaXRlU3RyaW5nKG1vZHN0ciwgZik7CisgICAgICAgICAgICAgICAgICAgIGVyciArPSBQeUZpbGVfV3JpdGVTdHJpbmcoIi4iLCBmKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKG1vZHVsZU5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGVyciA9PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKGNsYXNzTmFtZSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgIGVyciA9IFB5RmlsZV9Xcml0ZVN0cmluZygiPHVua25vd24+IiwgZik7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgIGVyciA9IFB5RmlsZV9Xcml0ZVN0cmluZyhjbGFzc05hbWUsIGYpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVyciA9IFB5RmlsZV9Xcml0ZU9iamVjdChleGNlcHRpb24sIGYsIFB5X1BSSU5UX1JBVyk7CisgICAgICAgIGlmIChlcnIgPT0gMCAmJiAodmFsdWUgIT0gUHlfTm9uZSkpIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpzID0gUHlPYmplY3RfU3RyKHZhbHVlKTsKKyAgICAgICAgICAgIC8qIG9ubHkgcHJpbnQgY29sb24gaWYgdGhlIHN0cigpIG9mIHRoZQorICAgICAgICAgICAgICAgb2JqZWN0IGlzIG5vdCB0aGUgZW1wdHkgc3RyaW5nCisgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKHMgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBlcnIgPSAtMTsKKyAgICAgICAgICAgIGVsc2UgaWYgKCFQeVN0cmluZ19DaGVjayhzKSB8fAorICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfR0VUX1NJWkUocykgIT0gMCkKKyAgICAgICAgICAgICAgICBlcnIgPSBQeUZpbGVfV3JpdGVTdHJpbmcoIjogIiwgZik7CisgICAgICAgICAgICBpZiAoZXJyID09IDApCisgICAgICAgICAgICAgIGVyciA9IFB5RmlsZV9Xcml0ZU9iamVjdChzLCBmLCBQeV9QUklOVF9SQVcpOworICAgICAgICAgICAgUHlfWERFQ1JFRihzKTsKKyAgICAgICAgfQorICAgICAgICAvKiB0cnkgdG8gd3JpdGUgYSBuZXdsaW5lIGluIGFueSBjYXNlICovCisgICAgICAgIGVyciArPSBQeUZpbGVfV3JpdGVTdHJpbmcoIlxuIiwgZik7CisgICAgfQorICAgIFB5X0RFQ1JFRih2YWx1ZSk7CisgICAgLyogSWYgYW4gZXJyb3IgaGFwcGVuZWQgaGVyZSwgZG9uJ3Qgc2hvdyBpdC4KKyAgICAgICBYWFggVGhpcyBpcyB3cm9uZywgYnV0IHRvbyBtYW55IGNhbGxlcnMgcmVseSBvbiB0aGlzIGJlaGF2aW9yLiAqLworICAgIGlmIChlcnIgIT0gMCkKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKIH0KIAogUHlPYmplY3QgKgogUHlSdW5fU3RyaW5nRmxhZ3MoY29uc3QgY2hhciAqc3RyLCBpbnQgc3RhcnQsIFB5T2JqZWN0ICpnbG9iYWxzLAotCQkgIFB5T2JqZWN0ICpsb2NhbHMsIFB5Q29tcGlsZXJGbGFncyAqZmxhZ3MpCisgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqbG9jYWxzLCBQeUNvbXBpbGVyRmxhZ3MgKmZsYWdzKQogewotCVB5T2JqZWN0ICpyZXQgPSBOVUxMOwotCW1vZF90eSBtb2Q7Ci0JUHlBcmVuYSAqYXJlbmEgPSBQeUFyZW5hX05ldygpOwotCWlmIChhcmVuYSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQkKLQltb2QgPSBQeVBhcnNlcl9BU1RGcm9tU3RyaW5nKHN0ciwgIjxzdHJpbmc+Iiwgc3RhcnQsIGZsYWdzLCBhcmVuYSk7Ci0JaWYgKG1vZCAhPSBOVUxMKQotCQlyZXQgPSBydW5fbW9kKG1vZCwgIjxzdHJpbmc+IiwgZ2xvYmFscywgbG9jYWxzLCBmbGFncywgYXJlbmEpOwotCVB5QXJlbmFfRnJlZShhcmVuYSk7Ci0JcmV0dXJuIHJldDsKKyAgICBQeU9iamVjdCAqcmV0ID0gTlVMTDsKKyAgICBtb2RfdHkgbW9kOworICAgIFB5QXJlbmEgKmFyZW5hID0gUHlBcmVuYV9OZXcoKTsKKyAgICBpZiAoYXJlbmEgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBtb2QgPSBQeVBhcnNlcl9BU1RGcm9tU3RyaW5nKHN0ciwgIjxzdHJpbmc+Iiwgc3RhcnQsIGZsYWdzLCBhcmVuYSk7CisgICAgaWYgKG1vZCAhPSBOVUxMKQorICAgICAgICByZXQgPSBydW5fbW9kKG1vZCwgIjxzdHJpbmc+IiwgZ2xvYmFscywgbG9jYWxzLCBmbGFncywgYXJlbmEpOworICAgIFB5QXJlbmFfRnJlZShhcmVuYSk7CisgICAgcmV0dXJuIHJldDsKIH0KIAogUHlPYmplY3QgKgogUHlSdW5fRmlsZUV4RmxhZ3MoRklMRSAqZnAsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgc3RhcnQsIFB5T2JqZWN0ICpnbG9iYWxzLAotCQkgIFB5T2JqZWN0ICpsb2NhbHMsIGludCBjbG9zZWl0LCBQeUNvbXBpbGVyRmxhZ3MgKmZsYWdzKQorICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmxvY2FscywgaW50IGNsb3NlaXQsIFB5Q29tcGlsZXJGbGFncyAqZmxhZ3MpCiB7Ci0JUHlPYmplY3QgKnJldDsKLQltb2RfdHkgbW9kOwotCVB5QXJlbmEgKmFyZW5hID0gUHlBcmVuYV9OZXcoKTsKLQlpZiAoYXJlbmEgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JCi0JbW9kID0gUHlQYXJzZXJfQVNURnJvbUZpbGUoZnAsIGZpbGVuYW1lLCBzdGFydCwgMCwgMCwKLQkJCQkgICBmbGFncywgTlVMTCwgYXJlbmEpOwotCWlmIChjbG9zZWl0KQotCQlmY2xvc2UoZnApOwotCWlmIChtb2QgPT0gTlVMTCkgewotCQlQeUFyZW5hX0ZyZWUoYXJlbmEpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0ID0gcnVuX21vZChtb2QsIGZpbGVuYW1lLCBnbG9iYWxzLCBsb2NhbHMsIGZsYWdzLCBhcmVuYSk7Ci0JUHlBcmVuYV9GcmVlKGFyZW5hKTsKLQlyZXR1cm4gcmV0OworICAgIFB5T2JqZWN0ICpyZXQ7CisgICAgbW9kX3R5IG1vZDsKKyAgICBQeUFyZW5hICphcmVuYSA9IFB5QXJlbmFfTmV3KCk7CisgICAgaWYgKGFyZW5hID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgbW9kID0gUHlQYXJzZXJfQVNURnJvbUZpbGUoZnAsIGZpbGVuYW1lLCBzdGFydCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywgTlVMTCwgYXJlbmEpOworICAgIGlmIChjbG9zZWl0KQorICAgICAgICBmY2xvc2UoZnApOworICAgIGlmIChtb2QgPT0gTlVMTCkgeworICAgICAgICBQeUFyZW5hX0ZyZWUoYXJlbmEpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0ID0gcnVuX21vZChtb2QsIGZpbGVuYW1lLCBnbG9iYWxzLCBsb2NhbHMsIGZsYWdzLCBhcmVuYSk7CisgICAgUHlBcmVuYV9GcmVlKGFyZW5hKTsKKyAgICByZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogcnVuX21vZChtb2RfdHkgbW9kLCBjb25zdCBjaGFyICpmaWxlbmFtZSwgUHlPYmplY3QgKmdsb2JhbHMsIFB5T2JqZWN0ICpsb2NhbHMsCi0JIFB5Q29tcGlsZXJGbGFncyAqZmxhZ3MsIFB5QXJlbmEgKmFyZW5hKQorICAgICAgICAgUHlDb21waWxlckZsYWdzICpmbGFncywgUHlBcmVuYSAqYXJlbmEpCiB7Ci0JUHlDb2RlT2JqZWN0ICpjbzsKLQlQeU9iamVjdCAqdjsKLQljbyA9IFB5QVNUX0NvbXBpbGUobW9kLCBmaWxlbmFtZSwgZmxhZ3MsIGFyZW5hKTsKLQlpZiAoY28gPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JdiA9IFB5RXZhbF9FdmFsQ29kZShjbywgZ2xvYmFscywgbG9jYWxzKTsKLQlQeV9ERUNSRUYoY28pOwotCXJldHVybiB2OworICAgIFB5Q29kZU9iamVjdCAqY287CisgICAgUHlPYmplY3QgKnY7CisgICAgY28gPSBQeUFTVF9Db21waWxlKG1vZCwgZmlsZW5hbWUsIGZsYWdzLCBhcmVuYSk7CisgICAgaWYgKGNvID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHYgPSBQeUV2YWxfRXZhbENvZGUoY28sIGdsb2JhbHMsIGxvY2Fscyk7CisgICAgUHlfREVDUkVGKGNvKTsKKyAgICByZXR1cm4gdjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHJ1bl9weWNfZmlsZShGSUxFICpmcCwgY29uc3QgY2hhciAqZmlsZW5hbWUsIFB5T2JqZWN0ICpnbG9iYWxzLAotCSAgICAgUHlPYmplY3QgKmxvY2FscywgUHlDb21waWxlckZsYWdzICpmbGFncykKKyAgICAgICAgICAgICBQeU9iamVjdCAqbG9jYWxzLCBQeUNvbXBpbGVyRmxhZ3MgKmZsYWdzKQogewotCVB5Q29kZU9iamVjdCAqY287Ci0JUHlPYmplY3QgKnY7Ci0JbG9uZyBtYWdpYzsKLQlsb25nIFB5SW1wb3J0X0dldE1hZ2ljTnVtYmVyKHZvaWQpOworICAgIFB5Q29kZU9iamVjdCAqY287CisgICAgUHlPYmplY3QgKnY7CisgICAgbG9uZyBtYWdpYzsKKyAgICBsb25nIFB5SW1wb3J0X0dldE1hZ2ljTnVtYmVyKHZvaWQpOwogCi0JbWFnaWMgPSBQeU1hcnNoYWxfUmVhZExvbmdGcm9tRmlsZShmcCk7Ci0JaWYgKG1hZ2ljICE9IFB5SW1wb3J0X0dldE1hZ2ljTnVtYmVyKCkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKLQkJCSAgICJCYWQgbWFnaWMgbnVtYmVyIGluIC5weWMgZmlsZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JKHZvaWQpIFB5TWFyc2hhbF9SZWFkTG9uZ0Zyb21GaWxlKGZwKTsKLQl2ID0gUHlNYXJzaGFsX1JlYWRMYXN0T2JqZWN0RnJvbUZpbGUoZnApOwotCWZjbG9zZShmcCk7Ci0JaWYgKHYgPT0gTlVMTCB8fCAhUHlDb2RlX0NoZWNrKHYpKSB7Ci0JCVB5X1hERUNSRUYodik7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCi0JCQkgICAiQmFkIGNvZGUgb2JqZWN0IGluIC5weWMgZmlsZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JY28gPSAoUHlDb2RlT2JqZWN0ICopdjsKLQl2ID0gUHlFdmFsX0V2YWxDb2RlKGNvLCBnbG9iYWxzLCBsb2NhbHMpOwotCWlmICh2ICYmIGZsYWdzKQotCQlmbGFncy0+Y2ZfZmxhZ3MgfD0gKGNvLT5jb19mbGFncyAmIFB5Q0ZfTUFTSyk7Ci0JUHlfREVDUkVGKGNvKTsKLQlyZXR1cm4gdjsKKyAgICBtYWdpYyA9IFB5TWFyc2hhbF9SZWFkTG9uZ0Zyb21GaWxlKGZwKTsKKyAgICBpZiAobWFnaWMgIT0gUHlJbXBvcnRfR2V0TWFnaWNOdW1iZXIoKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAorICAgICAgICAgICAgICAgICAgICJCYWQgbWFnaWMgbnVtYmVyIGluIC5weWMgZmlsZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgKHZvaWQpIFB5TWFyc2hhbF9SZWFkTG9uZ0Zyb21GaWxlKGZwKTsKKyAgICB2ID0gUHlNYXJzaGFsX1JlYWRMYXN0T2JqZWN0RnJvbUZpbGUoZnApOworICAgIGZjbG9zZShmcCk7CisgICAgaWYgKHYgPT0gTlVMTCB8fCAhUHlDb2RlX0NoZWNrKHYpKSB7CisgICAgICAgIFB5X1hERUNSRUYodik7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgICAgIkJhZCBjb2RlIG9iamVjdCBpbiAucHljIGZpbGUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGNvID0gKFB5Q29kZU9iamVjdCAqKXY7CisgICAgdiA9IFB5RXZhbF9FdmFsQ29kZShjbywgZ2xvYmFscywgbG9jYWxzKTsKKyAgICBpZiAodiAmJiBmbGFncykKKyAgICAgICAgZmxhZ3MtPmNmX2ZsYWdzIHw9IChjby0+Y29fZmxhZ3MgJiBQeUNGX01BU0spOworICAgIFB5X0RFQ1JFRihjbyk7CisgICAgcmV0dXJuIHY7CiB9CiAKIFB5T2JqZWN0ICoKIFB5X0NvbXBpbGVTdHJpbmdGbGFncyhjb25zdCBjaGFyICpzdHIsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgc3RhcnQsCi0JCSAgICAgIFB5Q29tcGlsZXJGbGFncyAqZmxhZ3MpCisgICAgICAgICAgICAgICAgICAgICAgUHlDb21waWxlckZsYWdzICpmbGFncykKIHsKLQlQeUNvZGVPYmplY3QgKmNvOwotCW1vZF90eSBtb2Q7Ci0JUHlBcmVuYSAqYXJlbmEgPSBQeUFyZW5hX05ldygpOwotCWlmIChhcmVuYSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBQeUNvZGVPYmplY3QgKmNvOworICAgIG1vZF90eSBtb2Q7CisgICAgUHlBcmVuYSAqYXJlbmEgPSBQeUFyZW5hX05ldygpOworICAgIGlmIChhcmVuYSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCW1vZCA9IFB5UGFyc2VyX0FTVEZyb21TdHJpbmcoc3RyLCBmaWxlbmFtZSwgc3RhcnQsIGZsYWdzLCBhcmVuYSk7Ci0JaWYgKG1vZCA9PSBOVUxMKSB7Ci0JCVB5QXJlbmFfRnJlZShhcmVuYSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoZmxhZ3MgJiYgKGZsYWdzLT5jZl9mbGFncyAmIFB5Q0ZfT05MWV9BU1QpKSB7Ci0JCVB5T2JqZWN0ICpyZXN1bHQgPSBQeUFTVF9tb2Qyb2JqKG1vZCk7Ci0JCVB5QXJlbmFfRnJlZShhcmVuYSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCWNvID0gUHlBU1RfQ29tcGlsZShtb2QsIGZpbGVuYW1lLCBmbGFncywgYXJlbmEpOwotCVB5QXJlbmFfRnJlZShhcmVuYSk7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWNvOworICAgIG1vZCA9IFB5UGFyc2VyX0FTVEZyb21TdHJpbmcoc3RyLCBmaWxlbmFtZSwgc3RhcnQsIGZsYWdzLCBhcmVuYSk7CisgICAgaWYgKG1vZCA9PSBOVUxMKSB7CisgICAgICAgIFB5QXJlbmFfRnJlZShhcmVuYSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoZmxhZ3MgJiYgKGZsYWdzLT5jZl9mbGFncyAmIFB5Q0ZfT05MWV9BU1QpKSB7CisgICAgICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBQeUFTVF9tb2Qyb2JqKG1vZCk7CisgICAgICAgIFB5QXJlbmFfRnJlZShhcmVuYSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIGNvID0gUHlBU1RfQ29tcGlsZShtb2QsIGZpbGVuYW1lLCBmbGFncywgYXJlbmEpOworICAgIFB5QXJlbmFfRnJlZShhcmVuYSk7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWNvOwogfQogCiBzdHJ1Y3Qgc3ltdGFibGUgKgogUHlfU3ltdGFibGVTdHJpbmcoY29uc3QgY2hhciAqc3RyLCBjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IHN0YXJ0KQogewotCXN0cnVjdCBzeW10YWJsZSAqc3Q7Ci0JbW9kX3R5IG1vZDsKLQlQeUNvbXBpbGVyRmxhZ3MgZmxhZ3M7Ci0JUHlBcmVuYSAqYXJlbmEgPSBQeUFyZW5hX05ldygpOwotCWlmIChhcmVuYSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBzdHJ1Y3Qgc3ltdGFibGUgKnN0OworICAgIG1vZF90eSBtb2Q7CisgICAgUHlDb21waWxlckZsYWdzIGZsYWdzOworICAgIFB5QXJlbmEgKmFyZW5hID0gUHlBcmVuYV9OZXcoKTsKKyAgICBpZiAoYXJlbmEgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlmbGFncy5jZl9mbGFncyA9IDA7CisgICAgZmxhZ3MuY2ZfZmxhZ3MgPSAwOwogCi0JbW9kID0gUHlQYXJzZXJfQVNURnJvbVN0cmluZyhzdHIsIGZpbGVuYW1lLCBzdGFydCwgJmZsYWdzLCBhcmVuYSk7Ci0JaWYgKG1vZCA9PSBOVUxMKSB7Ci0JCVB5QXJlbmFfRnJlZShhcmVuYSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlzdCA9IFB5U3ltdGFibGVfQnVpbGQobW9kLCBmaWxlbmFtZSwgMCk7Ci0JUHlBcmVuYV9GcmVlKGFyZW5hKTsKLQlyZXR1cm4gc3Q7CisgICAgbW9kID0gUHlQYXJzZXJfQVNURnJvbVN0cmluZyhzdHIsIGZpbGVuYW1lLCBzdGFydCwgJmZsYWdzLCBhcmVuYSk7CisgICAgaWYgKG1vZCA9PSBOVUxMKSB7CisgICAgICAgIFB5QXJlbmFfRnJlZShhcmVuYSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBzdCA9IFB5U3ltdGFibGVfQnVpbGQobW9kLCBmaWxlbmFtZSwgMCk7CisgICAgUHlBcmVuYV9GcmVlKGFyZW5hKTsKKyAgICByZXR1cm4gc3Q7CiB9CiAKIC8qIFByZWZlcnJlZCBhY2Nlc3MgdG8gcGFyc2VyIGlzIHRocm91Z2ggQVNULiAqLwogbW9kX3R5CiBQeVBhcnNlcl9BU1RGcm9tU3RyaW5nKGNvbnN0IGNoYXIgKnMsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgc3RhcnQsCi0JCSAgICAgICBQeUNvbXBpbGVyRmxhZ3MgKmZsYWdzLCBQeUFyZW5hICphcmVuYSkKKyAgICAgICAgICAgICAgICAgICAgICAgUHlDb21waWxlckZsYWdzICpmbGFncywgUHlBcmVuYSAqYXJlbmEpCiB7Ci0JbW9kX3R5IG1vZDsKLQlQeUNvbXBpbGVyRmxhZ3MgbG9jYWxmbGFnczsKLQlwZXJyZGV0YWlsIGVycjsKLQlpbnQgaWZsYWdzID0gUEFSU0VSX0ZMQUdTKGZsYWdzKTsKKyAgICBtb2RfdHkgbW9kOworICAgIFB5Q29tcGlsZXJGbGFncyBsb2NhbGZsYWdzOworICAgIHBlcnJkZXRhaWwgZXJyOworICAgIGludCBpZmxhZ3MgPSBQQVJTRVJfRkxBR1MoZmxhZ3MpOwogCi0Jbm9kZSAqbiA9IFB5UGFyc2VyX1BhcnNlU3RyaW5nRmxhZ3NGaWxlbmFtZUV4KHMsIGZpbGVuYW1lLAotCQkJCQkmX1B5UGFyc2VyX0dyYW1tYXIsIHN0YXJ0LCAmZXJyLAotCQkJCQkmaWZsYWdzKTsKLQlpZiAoZmxhZ3MgPT0gTlVMTCkgewotCQlsb2NhbGZsYWdzLmNmX2ZsYWdzID0gMDsKLQkJZmxhZ3MgPSAmbG9jYWxmbGFnczsKLQl9Ci0JaWYgKG4pIHsKLQkJZmxhZ3MtPmNmX2ZsYWdzIHw9IGlmbGFncyAmIFB5Q0ZfTUFTSzsKLQkJbW9kID0gUHlBU1RfRnJvbU5vZGUobiwgZmxhZ3MsIGZpbGVuYW1lLCBhcmVuYSk7Ci0JCVB5Tm9kZV9GcmVlKG4pOwotCQlyZXR1cm4gbW9kOwotCX0KLQllbHNlIHsKLQkJZXJyX2lucHV0KCZlcnIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgbm9kZSAqbiA9IFB5UGFyc2VyX1BhcnNlU3RyaW5nRmxhZ3NGaWxlbmFtZUV4KHMsIGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJl9QeVBhcnNlcl9HcmFtbWFyLCBzdGFydCwgJmVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpZmxhZ3MpOworICAgIGlmIChmbGFncyA9PSBOVUxMKSB7CisgICAgICAgIGxvY2FsZmxhZ3MuY2ZfZmxhZ3MgPSAwOworICAgICAgICBmbGFncyA9ICZsb2NhbGZsYWdzOworICAgIH0KKyAgICBpZiAobikgeworICAgICAgICBmbGFncy0+Y2ZfZmxhZ3MgfD0gaWZsYWdzICYgUHlDRl9NQVNLOworICAgICAgICBtb2QgPSBQeUFTVF9Gcm9tTm9kZShuLCBmbGFncywgZmlsZW5hbWUsIGFyZW5hKTsKKyAgICAgICAgUHlOb2RlX0ZyZWUobik7CisgICAgICAgIHJldHVybiBtb2Q7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBlcnJfaW5wdXQoJmVycik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIH0KIAogbW9kX3R5CiBQeVBhcnNlcl9BU1RGcm9tRmlsZShGSUxFICpmcCwgY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBzdGFydCwgY2hhciAqcHMxLAotCQkgICAgIGNoYXIgKnBzMiwgUHlDb21waWxlckZsYWdzICpmbGFncywgaW50ICplcnJjb2RlLAotCQkgICAgIFB5QXJlbmEgKmFyZW5hKQorICAgICAgICAgICAgICAgICAgICAgY2hhciAqcHMyLCBQeUNvbXBpbGVyRmxhZ3MgKmZsYWdzLCBpbnQgKmVycmNvZGUsCisgICAgICAgICAgICAgICAgICAgICBQeUFyZW5hICphcmVuYSkKIHsKLQltb2RfdHkgbW9kOwotCVB5Q29tcGlsZXJGbGFncyBsb2NhbGZsYWdzOwotCXBlcnJkZXRhaWwgZXJyOwotCWludCBpZmxhZ3MgPSBQQVJTRVJfRkxBR1MoZmxhZ3MpOworICAgIG1vZF90eSBtb2Q7CisgICAgUHlDb21waWxlckZsYWdzIGxvY2FsZmxhZ3M7CisgICAgcGVycmRldGFpbCBlcnI7CisgICAgaW50IGlmbGFncyA9IFBBUlNFUl9GTEFHUyhmbGFncyk7CiAKLQlub2RlICpuID0gUHlQYXJzZXJfUGFyc2VGaWxlRmxhZ3NFeChmcCwgZmlsZW5hbWUsICZfUHlQYXJzZXJfR3JhbW1hciwKLQkJCQlzdGFydCwgcHMxLCBwczIsICZlcnIsICZpZmxhZ3MpOwotCWlmIChmbGFncyA9PSBOVUxMKSB7Ci0JCWxvY2FsZmxhZ3MuY2ZfZmxhZ3MgPSAwOwotCQlmbGFncyA9ICZsb2NhbGZsYWdzOwotCX0KLQlpZiAobikgewotCQlmbGFncy0+Y2ZfZmxhZ3MgfD0gaWZsYWdzICYgUHlDRl9NQVNLOwotCQltb2QgPSBQeUFTVF9Gcm9tTm9kZShuLCBmbGFncywgZmlsZW5hbWUsIGFyZW5hKTsKLQkJUHlOb2RlX0ZyZWUobik7Ci0JCXJldHVybiBtb2Q7Ci0JfQotCWVsc2UgewotCQllcnJfaW5wdXQoJmVycik7Ci0JCWlmIChlcnJjb2RlKQotCQkJKmVycmNvZGUgPSBlcnIuZXJyb3I7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBub2RlICpuID0gUHlQYXJzZXJfUGFyc2VGaWxlRmxhZ3NFeChmcCwgZmlsZW5hbWUsICZfUHlQYXJzZXJfR3JhbW1hciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCwgcHMxLCBwczIsICZlcnIsICZpZmxhZ3MpOworICAgIGlmIChmbGFncyA9PSBOVUxMKSB7CisgICAgICAgIGxvY2FsZmxhZ3MuY2ZfZmxhZ3MgPSAwOworICAgICAgICBmbGFncyA9ICZsb2NhbGZsYWdzOworICAgIH0KKyAgICBpZiAobikgeworICAgICAgICBmbGFncy0+Y2ZfZmxhZ3MgfD0gaWZsYWdzICYgUHlDRl9NQVNLOworICAgICAgICBtb2QgPSBQeUFTVF9Gcm9tTm9kZShuLCBmbGFncywgZmlsZW5hbWUsIGFyZW5hKTsKKyAgICAgICAgUHlOb2RlX0ZyZWUobik7CisgICAgICAgIHJldHVybiBtb2Q7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBlcnJfaW5wdXQoJmVycik7CisgICAgICAgIGlmIChlcnJjb2RlKQorICAgICAgICAgICAgKmVycmNvZGUgPSBlcnIuZXJyb3I7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIH0KIAogLyogU2ltcGxpZmllZCBpbnRlcmZhY2UgdG8gcGFyc2VmaWxlIC0tIHJldHVybiBub2RlIG9yIHNldCBleGNlcHRpb24gKi8KQEAgLTE0OTAsMTMgKzE0OTAsMTMgQEAKIG5vZGUgKgogUHlQYXJzZXJfU2ltcGxlUGFyc2VGaWxlRmxhZ3MoRklMRSAqZnAsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgc3RhcnQsIGludCBmbGFncykKIHsKLQlwZXJyZGV0YWlsIGVycjsKLQlub2RlICpuID0gUHlQYXJzZXJfUGFyc2VGaWxlRmxhZ3MoZnAsIGZpbGVuYW1lLCAmX1B5UGFyc2VyX0dyYW1tYXIsCi0JCQkJCSAgc3RhcnQsIE5VTEwsIE5VTEwsICZlcnIsIGZsYWdzKTsKLQlpZiAobiA9PSBOVUxMKQotCQllcnJfaW5wdXQoJmVycik7CisgICAgcGVycmRldGFpbCBlcnI7CisgICAgbm9kZSAqbiA9IFB5UGFyc2VyX1BhcnNlRmlsZUZsYWdzKGZwLCBmaWxlbmFtZSwgJl9QeVBhcnNlcl9HcmFtbWFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCwgTlVMTCwgTlVMTCwgJmVyciwgZmxhZ3MpOworICAgIGlmIChuID09IE5VTEwpCisgICAgICAgIGVycl9pbnB1dCgmZXJyKTsKIAotCXJldHVybiBuOworICAgIHJldHVybiBuOwogfQogCiAvKiBTaW1wbGlmaWVkIGludGVyZmFjZSB0byBwYXJzZXN0cmluZyAtLSByZXR1cm4gbm9kZSBvciBzZXQgZXhjZXB0aW9uICovCkBAIC0xNTA0LDMwICsxNTA0LDMwIEBACiBub2RlICoKIFB5UGFyc2VyX1NpbXBsZVBhcnNlU3RyaW5nRmxhZ3MoY29uc3QgY2hhciAqc3RyLCBpbnQgc3RhcnQsIGludCBmbGFncykKIHsKLQlwZXJyZGV0YWlsIGVycjsKLQlub2RlICpuID0gUHlQYXJzZXJfUGFyc2VTdHJpbmdGbGFncyhzdHIsICZfUHlQYXJzZXJfR3JhbW1hciwKLQkJCQkJICAgIHN0YXJ0LCAmZXJyLCBmbGFncyk7Ci0JaWYgKG4gPT0gTlVMTCkKLQkJZXJyX2lucHV0KCZlcnIpOwotCXJldHVybiBuOworICAgIHBlcnJkZXRhaWwgZXJyOworICAgIG5vZGUgKm4gPSBQeVBhcnNlcl9QYXJzZVN0cmluZ0ZsYWdzKHN0ciwgJl9QeVBhcnNlcl9HcmFtbWFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0LCAmZXJyLCBmbGFncyk7CisgICAgaWYgKG4gPT0gTlVMTCkKKyAgICAgICAgZXJyX2lucHV0KCZlcnIpOworICAgIHJldHVybiBuOwogfQogCiBub2RlICoKIFB5UGFyc2VyX1NpbXBsZVBhcnNlU3RyaW5nRmxhZ3NGaWxlbmFtZShjb25zdCBjaGFyICpzdHIsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAotCQkJCQlpbnQgc3RhcnQsIGludCBmbGFncykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnQsIGludCBmbGFncykKIHsKLQlwZXJyZGV0YWlsIGVycjsKLQlub2RlICpuID0gUHlQYXJzZXJfUGFyc2VTdHJpbmdGbGFnc0ZpbGVuYW1lKHN0ciwgZmlsZW5hbWUsCi0JCQkJJl9QeVBhcnNlcl9HcmFtbWFyLCBzdGFydCwgJmVyciwgZmxhZ3MpOwotCWlmIChuID09IE5VTEwpCi0JCWVycl9pbnB1dCgmZXJyKTsKLQlyZXR1cm4gbjsKKyAgICBwZXJyZGV0YWlsIGVycjsKKyAgICBub2RlICpuID0gUHlQYXJzZXJfUGFyc2VTdHJpbmdGbGFnc0ZpbGVuYW1lKHN0ciwgZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJl9QeVBhcnNlcl9HcmFtbWFyLCBzdGFydCwgJmVyciwgZmxhZ3MpOworICAgIGlmIChuID09IE5VTEwpCisgICAgICAgIGVycl9pbnB1dCgmZXJyKTsKKyAgICByZXR1cm4gbjsKIH0KIAogbm9kZSAqCiBQeVBhcnNlcl9TaW1wbGVQYXJzZVN0cmluZ0ZpbGVuYW1lKGNvbnN0IGNoYXIgKnN0ciwgY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBzdGFydCkKIHsKLQlyZXR1cm4gUHlQYXJzZXJfU2ltcGxlUGFyc2VTdHJpbmdGbGFnc0ZpbGVuYW1lKHN0ciwgZmlsZW5hbWUsIHN0YXJ0LCAwKTsKKyAgICByZXR1cm4gUHlQYXJzZXJfU2ltcGxlUGFyc2VTdHJpbmdGbGFnc0ZpbGVuYW1lKHN0ciwgZmlsZW5hbWUsIHN0YXJ0LCAwKTsKIH0KIAogLyogTWF5IHdhbnQgdG8gbW92ZSBhIG1vcmUgZ2VuZXJhbGl6ZWQgZm9ybSBvZiB0aGlzIHRvIHBhcnNldG9rLmMgb3IKQEAgLTE1MzYsNyArMTUzNiw3IEBACiB2b2lkCiBQeVBhcnNlcl9TZXRFcnJvcihwZXJyZGV0YWlsICplcnIpCiB7Ci0JZXJyX2lucHV0KGVycik7CisgICAgZXJyX2lucHV0KGVycik7CiB9CiAKIC8qIFNldCB0aGUgZXJyb3IgYXBwcm9wcmlhdGUgdG8gdGhlIGdpdmVuIGlucHV0IGVycm9yIGNvZGUgKHNlZSBlcnJjb2RlLmgpICovCkBAIC0xNTQ0LDk4ICsxNTQ0LDk4IEBACiBzdGF0aWMgdm9pZAogZXJyX2lucHV0KHBlcnJkZXRhaWwgKmVycikKIHsKLQlQeU9iamVjdCAqdiwgKncsICplcnJ0eXBlOwotCVB5T2JqZWN0KiB1ID0gTlVMTDsKLQljaGFyICptc2cgPSBOVUxMOwotCWVycnR5cGUgPSBQeUV4Y19TeW50YXhFcnJvcjsKLQlzd2l0Y2ggKGVyci0+ZXJyb3IpIHsKLQljYXNlIEVfRVJST1I6Ci0JCXJldHVybjsKLQljYXNlIEVfU1lOVEFYOgotCQllcnJ0eXBlID0gUHlFeGNfSW5kZW50YXRpb25FcnJvcjsKLQkJaWYgKGVyci0+ZXhwZWN0ZWQgPT0gSU5ERU5UKQotCQkJbXNnID0gImV4cGVjdGVkIGFuIGluZGVudGVkIGJsb2NrIjsKLQkJZWxzZSBpZiAoZXJyLT50b2tlbiA9PSBJTkRFTlQpCi0JCQltc2cgPSAidW5leHBlY3RlZCBpbmRlbnQiOwotCQllbHNlIGlmIChlcnItPnRva2VuID09IERFREVOVCkKLQkJCW1zZyA9ICJ1bmV4cGVjdGVkIHVuaW5kZW50IjsKLQkJZWxzZSB7Ci0JCQllcnJ0eXBlID0gUHlFeGNfU3ludGF4RXJyb3I7Ci0JCQltc2cgPSAiaW52YWxpZCBzeW50YXgiOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgRV9UT0tFTjoKLQkJbXNnID0gImludmFsaWQgdG9rZW4iOwotCQlicmVhazsKLQljYXNlIEVfRU9GUzoKLQkJbXNnID0gIkVPRiB3aGlsZSBzY2FubmluZyB0cmlwbGUtcXVvdGVkIHN0cmluZyBsaXRlcmFsIjsKLQkJYnJlYWs7Ci0JY2FzZSBFX0VPTFM6Ci0JCW1zZyA9ICJFT0wgd2hpbGUgc2Nhbm5pbmcgc3RyaW5nIGxpdGVyYWwiOwotCQlicmVhazsKLQljYXNlIEVfSU5UUjoKLQkJaWYgKCFQeUVycl9PY2N1cnJlZCgpKQotCQkJUHlFcnJfU2V0Tm9uZShQeUV4Y19LZXlib2FyZEludGVycnVwdCk7Ci0JCWdvdG8gY2xlYW51cDsKLQljYXNlIEVfTk9NRU06Ci0JCVB5RXJyX05vTWVtb3J5KCk7Ci0JCWdvdG8gY2xlYW51cDsKLQljYXNlIEVfRU9GOgotCQltc2cgPSAidW5leHBlY3RlZCBFT0Ygd2hpbGUgcGFyc2luZyI7Ci0JCWJyZWFrOwotCWNhc2UgRV9UQUJTUEFDRToKLQkJZXJydHlwZSA9IFB5RXhjX1RhYkVycm9yOwotCQltc2cgPSAiaW5jb25zaXN0ZW50IHVzZSBvZiB0YWJzIGFuZCBzcGFjZXMgaW4gaW5kZW50YXRpb24iOwotCQlicmVhazsKLQljYXNlIEVfT1ZFUkZMT1c6Ci0JCW1zZyA9ICJleHByZXNzaW9uIHRvbyBsb25nIjsKLQkJYnJlYWs7Ci0JY2FzZSBFX0RFREVOVDoKLQkJZXJydHlwZSA9IFB5RXhjX0luZGVudGF0aW9uRXJyb3I7Ci0JCW1zZyA9ICJ1bmluZGVudCBkb2VzIG5vdCBtYXRjaCBhbnkgb3V0ZXIgaW5kZW50YXRpb24gbGV2ZWwiOwotCQlicmVhazsKLQljYXNlIEVfVE9PREVFUDoKLQkJZXJydHlwZSA9IFB5RXhjX0luZGVudGF0aW9uRXJyb3I7Ci0JCW1zZyA9ICJ0b28gbWFueSBsZXZlbHMgb2YgaW5kZW50YXRpb24iOwotCQlicmVhazsKLQljYXNlIEVfREVDT0RFOiB7Ci0JCVB5T2JqZWN0ICp0eXBlLCAqdmFsdWUsICp0YjsKLQkJUHlFcnJfRmV0Y2goJnR5cGUsICZ2YWx1ZSwgJnRiKTsKLQkJaWYgKHZhbHVlICE9IE5VTEwpIHsKLQkJCXUgPSBQeU9iamVjdF9TdHIodmFsdWUpOwotCQkJaWYgKHUgIT0gTlVMTCkgewotCQkJCW1zZyA9IFB5U3RyaW5nX0FzU3RyaW5nKHUpOwotCQkJfQotCQl9Ci0JCWlmIChtc2cgPT0gTlVMTCkKLQkJCW1zZyA9ICJ1bmtub3duIGRlY29kZSBlcnJvciI7Ci0JCVB5X1hERUNSRUYodHlwZSk7Ci0JCVB5X1hERUNSRUYodmFsdWUpOwotCQlQeV9YREVDUkVGKHRiKTsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgRV9MSU5FQ09OVDoKLQkJbXNnID0gInVuZXhwZWN0ZWQgY2hhcmFjdGVyIGFmdGVyIGxpbmUgY29udGludWF0aW9uIGNoYXJhY3RlciI7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWZwcmludGYoc3RkZXJyLCAiZXJyb3I9JWRcbiIsIGVyci0+ZXJyb3IpOwotCQltc2cgPSAidW5rbm93biBwYXJzaW5nIGVycm9yIjsKLQkJYnJlYWs7Ci0JfQotCXYgPSBQeV9CdWlsZFZhbHVlKCIoemlpeikiLCBlcnItPmZpbGVuYW1lLAotCQkJICBlcnItPmxpbmVubywgZXJyLT5vZmZzZXQsIGVyci0+dGV4dCk7Ci0JdyA9IE5VTEw7Ci0JaWYgKHYgIT0gTlVMTCkKLQkJdyA9IFB5X0J1aWxkVmFsdWUoIihzTykiLCBtc2csIHYpOwotCVB5X1hERUNSRUYodSk7Ci0JUHlfWERFQ1JFRih2KTsKLQlQeUVycl9TZXRPYmplY3QoZXJydHlwZSwgdyk7Ci0JUHlfWERFQ1JFRih3KTsKKyAgICBQeU9iamVjdCAqdiwgKncsICplcnJ0eXBlOworICAgIFB5T2JqZWN0KiB1ID0gTlVMTDsKKyAgICBjaGFyICptc2cgPSBOVUxMOworICAgIGVycnR5cGUgPSBQeUV4Y19TeW50YXhFcnJvcjsKKyAgICBzd2l0Y2ggKGVyci0+ZXJyb3IpIHsKKyAgICBjYXNlIEVfRVJST1I6CisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIEVfU1lOVEFYOgorICAgICAgICBlcnJ0eXBlID0gUHlFeGNfSW5kZW50YXRpb25FcnJvcjsKKyAgICAgICAgaWYgKGVyci0+ZXhwZWN0ZWQgPT0gSU5ERU5UKQorICAgICAgICAgICAgbXNnID0gImV4cGVjdGVkIGFuIGluZGVudGVkIGJsb2NrIjsKKyAgICAgICAgZWxzZSBpZiAoZXJyLT50b2tlbiA9PSBJTkRFTlQpCisgICAgICAgICAgICBtc2cgPSAidW5leHBlY3RlZCBpbmRlbnQiOworICAgICAgICBlbHNlIGlmIChlcnItPnRva2VuID09IERFREVOVCkKKyAgICAgICAgICAgIG1zZyA9ICJ1bmV4cGVjdGVkIHVuaW5kZW50IjsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBlcnJ0eXBlID0gUHlFeGNfU3ludGF4RXJyb3I7CisgICAgICAgICAgICBtc2cgPSAiaW52YWxpZCBzeW50YXgiOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRV9UT0tFTjoKKyAgICAgICAgbXNnID0gImludmFsaWQgdG9rZW4iOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEVfRU9GUzoKKyAgICAgICAgbXNnID0gIkVPRiB3aGlsZSBzY2FubmluZyB0cmlwbGUtcXVvdGVkIHN0cmluZyBsaXRlcmFsIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFX0VPTFM6CisgICAgICAgIG1zZyA9ICJFT0wgd2hpbGUgc2Nhbm5pbmcgc3RyaW5nIGxpdGVyYWwiOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEVfSU5UUjoKKyAgICAgICAgaWYgKCFQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgUHlFcnJfU2V0Tm9uZShQeUV4Y19LZXlib2FyZEludGVycnVwdCk7CisgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICBjYXNlIEVfTk9NRU06CisgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICBjYXNlIEVfRU9GOgorICAgICAgICBtc2cgPSAidW5leHBlY3RlZCBFT0Ygd2hpbGUgcGFyc2luZyI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRV9UQUJTUEFDRToKKyAgICAgICAgZXJydHlwZSA9IFB5RXhjX1RhYkVycm9yOworICAgICAgICBtc2cgPSAiaW5jb25zaXN0ZW50IHVzZSBvZiB0YWJzIGFuZCBzcGFjZXMgaW4gaW5kZW50YXRpb24iOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEVfT1ZFUkZMT1c6CisgICAgICAgIG1zZyA9ICJleHByZXNzaW9uIHRvbyBsb25nIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFX0RFREVOVDoKKyAgICAgICAgZXJydHlwZSA9IFB5RXhjX0luZGVudGF0aW9uRXJyb3I7CisgICAgICAgIG1zZyA9ICJ1bmluZGVudCBkb2VzIG5vdCBtYXRjaCBhbnkgb3V0ZXIgaW5kZW50YXRpb24gbGV2ZWwiOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEVfVE9PREVFUDoKKyAgICAgICAgZXJydHlwZSA9IFB5RXhjX0luZGVudGF0aW9uRXJyb3I7CisgICAgICAgIG1zZyA9ICJ0b28gbWFueSBsZXZlbHMgb2YgaW5kZW50YXRpb24iOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEVfREVDT0RFOiB7CisgICAgICAgIFB5T2JqZWN0ICp0eXBlLCAqdmFsdWUsICp0YjsKKyAgICAgICAgUHlFcnJfRmV0Y2goJnR5cGUsICZ2YWx1ZSwgJnRiKTsKKyAgICAgICAgaWYgKHZhbHVlICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHUgPSBQeU9iamVjdF9TdHIodmFsdWUpOworICAgICAgICAgICAgaWYgKHUgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIG1zZyA9IFB5U3RyaW5nX0FzU3RyaW5nKHUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChtc2cgPT0gTlVMTCkKKyAgICAgICAgICAgIG1zZyA9ICJ1bmtub3duIGRlY29kZSBlcnJvciI7CisgICAgICAgIFB5X1hERUNSRUYodHlwZSk7CisgICAgICAgIFB5X1hERUNSRUYodmFsdWUpOworICAgICAgICBQeV9YREVDUkVGKHRiKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRV9MSU5FQ09OVDoKKyAgICAgICAgbXNnID0gInVuZXhwZWN0ZWQgY2hhcmFjdGVyIGFmdGVyIGxpbmUgY29udGludWF0aW9uIGNoYXJhY3RlciI7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZXJyb3I9JWRcbiIsIGVyci0+ZXJyb3IpOworICAgICAgICBtc2cgPSAidW5rbm93biBwYXJzaW5nIGVycm9yIjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHYgPSBQeV9CdWlsZFZhbHVlKCIoemlpeikiLCBlcnItPmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgIGVyci0+bGluZW5vLCBlcnItPm9mZnNldCwgZXJyLT50ZXh0KTsKKyAgICB3ID0gTlVMTDsKKyAgICBpZiAodiAhPSBOVUxMKQorICAgICAgICB3ID0gUHlfQnVpbGRWYWx1ZSgiKHNPKSIsIG1zZywgdik7CisgICAgUHlfWERFQ1JFRih1KTsKKyAgICBQeV9YREVDUkVGKHYpOworICAgIFB5RXJyX1NldE9iamVjdChlcnJ0eXBlLCB3KTsKKyAgICBQeV9YREVDUkVGKHcpOwogY2xlYW51cDoKLQlpZiAoZXJyLT50ZXh0ICE9IE5VTEwpIHsKLQkJUHlPYmplY3RfRlJFRShlcnItPnRleHQpOwotCQllcnItPnRleHQgPSBOVUxMOwotCX0KKyAgICBpZiAoZXJyLT50ZXh0ICE9IE5VTEwpIHsKKyAgICAgICAgUHlPYmplY3RfRlJFRShlcnItPnRleHQpOworICAgICAgICBlcnItPnRleHQgPSBOVUxMOworICAgIH0KIH0KIAogLyogUHJpbnQgZmF0YWwgZXJyb3IgbWVzc2FnZSBhbmQgYWJvcnQgKi8KQEAgLTE2NDMsMzAgKzE2NDMsMzAgQEAKIHZvaWQKIFB5X0ZhdGFsRXJyb3IoY29uc3QgY2hhciAqbXNnKQogewotCWZwcmludGYoc3RkZXJyLCAiRmF0YWwgUHl0aG9uIGVycm9yOiAlc1xuIiwgbXNnKTsKLQlmZmx1c2goc3RkZXJyKTsgLyogaXQgaGVscHMgaW4gV2luZG93cyBkZWJ1ZyBidWlsZCAqLworICAgIGZwcmludGYoc3RkZXJyLCAiRmF0YWwgUHl0aG9uIGVycm9yOiAlc1xuIiwgbXNnKTsKKyAgICBmZmx1c2goc3RkZXJyKTsgLyogaXQgaGVscHMgaW4gV2luZG93cyBkZWJ1ZyBidWlsZCAqLwogCiAjaWZkZWYgTVNfV0lORE9XUwotCXsKLQkJc2l6ZV90IGxlbiA9IHN0cmxlbihtc2cpOwotCQlXQ0hBUiogYnVmZmVyOwotCQlzaXplX3QgaTsKKyAgICB7CisgICAgICAgIHNpemVfdCBsZW4gPSBzdHJsZW4obXNnKTsKKyAgICAgICAgV0NIQVIqIGJ1ZmZlcjsKKyAgICAgICAgc2l6ZV90IGk7CiAKLQkJLyogQ29udmVydCB0aGUgbWVzc2FnZSB0byB3Y2hhcl90LiBUaGlzIHVzZXMgYSBzaW1wbGUgb25lLXRvLW9uZQotCQljb252ZXJzaW9uLCBhc3N1bWluZyB0aGF0IHRoZSB0aGlzIGVycm9yIG1lc3NhZ2UgYWN0dWFsbHkgdXNlcyBBU0NJSQotCQlvbmx5LiBJZiB0aGlzIGNlYXNlcyB0byBiZSB0cnVlLCB3ZSB3aWxsIGhhdmUgdG8gY29udmVydC4gKi8KLQkJYnVmZmVyID0gYWxsb2NhKCAobGVuKzEpICogKHNpemVvZiAqYnVmZmVyKSk7Ci0JCWZvciggaT0wOyBpPD1sZW47ICsraSkKLQkJCWJ1ZmZlcltpXSA9IG1zZ1tpXTsKLQkJT3V0cHV0RGVidWdTdHJpbmdXKEwiRmF0YWwgUHl0aG9uIGVycm9yOiAiKTsKLQkJT3V0cHV0RGVidWdTdHJpbmdXKGJ1ZmZlcik7Ci0JCU91dHB1dERlYnVnU3RyaW5nVyhMIlxuIik7Ci0JfQorICAgICAgICAvKiBDb252ZXJ0IHRoZSBtZXNzYWdlIHRvIHdjaGFyX3QuIFRoaXMgdXNlcyBhIHNpbXBsZSBvbmUtdG8tb25lCisgICAgICAgIGNvbnZlcnNpb24sIGFzc3VtaW5nIHRoYXQgdGhlIHRoaXMgZXJyb3IgbWVzc2FnZSBhY3R1YWxseSB1c2VzIEFTQ0lJCisgICAgICAgIG9ubHkuIElmIHRoaXMgY2Vhc2VzIHRvIGJlIHRydWUsIHdlIHdpbGwgaGF2ZSB0byBjb252ZXJ0LiAqLworICAgICAgICBidWZmZXIgPSBhbGxvY2EoIChsZW4rMSkgKiAoc2l6ZW9mICpidWZmZXIpKTsKKyAgICAgICAgZm9yKCBpPTA7IGk8PWxlbjsgKytpKQorICAgICAgICAgICAgYnVmZmVyW2ldID0gbXNnW2ldOworICAgICAgICBPdXRwdXREZWJ1Z1N0cmluZ1coTCJGYXRhbCBQeXRob24gZXJyb3I6ICIpOworICAgICAgICBPdXRwdXREZWJ1Z1N0cmluZ1coYnVmZmVyKTsKKyAgICAgICAgT3V0cHV0RGVidWdTdHJpbmdXKEwiXG4iKTsKKyAgICB9CiAjaWZkZWYgX0RFQlVHCi0JRGVidWdCcmVhaygpOworICAgIERlYnVnQnJlYWsoKTsKICNlbmRpZgogI2VuZGlmIC8qIE1TX1dJTkRPV1MgKi8KLQlhYm9ydCgpOworICAgIGFib3J0KCk7CiB9CiAKIC8qIENsZWFuIHVwIGFuZCBleGl0ICovCkBAIC0xNjgzLDIxICsxNjgzLDIxIEBACiB3YWl0X2Zvcl90aHJlYWRfc2h1dGRvd24odm9pZCkKIHsKICNpZmRlZiBXSVRIX1RIUkVBRAotCVB5T2JqZWN0ICpyZXN1bHQ7Ci0JUHlUaHJlYWRTdGF0ZSAqdHN0YXRlID0gUHlUaHJlYWRTdGF0ZV9HRVQoKTsKLQlQeU9iamVjdCAqdGhyZWFkaW5nID0gUHlNYXBwaW5nX0dldEl0ZW1TdHJpbmcodHN0YXRlLT5pbnRlcnAtPm1vZHVsZXMsCi0JCQkJCQkgICAgICAidGhyZWFkaW5nIik7Ci0JaWYgKHRocmVhZGluZyA9PSBOVUxMKSB7Ci0JCS8qIHRocmVhZGluZyBub3QgaW1wb3J0ZWQgKi8KLQkJUHlFcnJfQ2xlYXIoKTsKLQkJcmV0dXJuOwotCX0KLQlyZXN1bHQgPSBQeU9iamVjdF9DYWxsTWV0aG9kKHRocmVhZGluZywgIl9zaHV0ZG93biIsICIiKTsKLQlpZiAocmVzdWx0ID09IE5VTEwpCi0JCVB5RXJyX1dyaXRlVW5yYWlzYWJsZSh0aHJlYWRpbmcpOwotCWVsc2UKLQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JUHlfREVDUkVGKHRocmVhZGluZyk7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICBQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dFVCgpOworICAgIFB5T2JqZWN0ICp0aHJlYWRpbmcgPSBQeU1hcHBpbmdfR2V0SXRlbVN0cmluZyh0c3RhdGUtPmludGVycC0+bW9kdWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRocmVhZGluZyIpOworICAgIGlmICh0aHJlYWRpbmcgPT0gTlVMTCkgeworICAgICAgICAvKiB0aHJlYWRpbmcgbm90IGltcG9ydGVkICovCisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgcmVzdWx0ID0gUHlPYmplY3RfQ2FsbE1ldGhvZCh0aHJlYWRpbmcsICJfc2h1dGRvd24iLCAiIik7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgICAgICBQeUVycl9Xcml0ZVVucmFpc2FibGUodGhyZWFkaW5nKTsKKyAgICBlbHNlCisgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgIFB5X0RFQ1JFRih0aHJlYWRpbmcpOwogI2VuZGlmCiB9CiAKQEAgLTE3MDcsNjYgKzE3MDcsNjYgQEAKIAogaW50IFB5X0F0RXhpdCh2b2lkICgqZnVuYykodm9pZCkpCiB7Ci0JaWYgKG5leGl0ZnVuY3MgPj0gTkVYSVRGVU5DUykKLQkJcmV0dXJuIC0xOwotCWV4aXRmdW5jc1tuZXhpdGZ1bmNzKytdID0gZnVuYzsKLQlyZXR1cm4gMDsKKyAgICBpZiAobmV4aXRmdW5jcyA+PSBORVhJVEZVTkNTKQorICAgICAgICByZXR1cm4gLTE7CisgICAgZXhpdGZ1bmNzW25leGl0ZnVuY3MrK10gPSBmdW5jOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZAogY2FsbF9zeXNfZXhpdGZ1bmModm9pZCkKIHsKLQlQeU9iamVjdCAqZXhpdGZ1bmMgPSBQeVN5c19HZXRPYmplY3QoImV4aXRmdW5jIik7CisgICAgUHlPYmplY3QgKmV4aXRmdW5jID0gUHlTeXNfR2V0T2JqZWN0KCJleGl0ZnVuYyIpOwogCi0JaWYgKGV4aXRmdW5jKSB7Ci0JCVB5T2JqZWN0ICpyZXM7Ci0JCVB5X0lOQ1JFRihleGl0ZnVuYyk7Ci0JCVB5U3lzX1NldE9iamVjdCgiZXhpdGZ1bmMiLCAoUHlPYmplY3QgKilOVUxMKTsKLQkJcmVzID0gUHlFdmFsX0NhbGxPYmplY3QoZXhpdGZ1bmMsIChQeU9iamVjdCAqKU5VTEwpOwotCQlpZiAocmVzID09IE5VTEwpIHsKLQkJCWlmICghUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19TeXN0ZW1FeGl0KSkgewotCQkJCVB5U3lzX1dyaXRlU3RkZXJyKCJFcnJvciBpbiBzeXMuZXhpdGZ1bmM6XG4iKTsKLQkJCX0KLQkJCVB5RXJyX1ByaW50KCk7Ci0JCX0KLQkJUHlfREVDUkVGKGV4aXRmdW5jKTsKLQl9CisgICAgaWYgKGV4aXRmdW5jKSB7CisgICAgICAgIFB5T2JqZWN0ICpyZXM7CisgICAgICAgIFB5X0lOQ1JFRihleGl0ZnVuYyk7CisgICAgICAgIFB5U3lzX1NldE9iamVjdCgiZXhpdGZ1bmMiLCAoUHlPYmplY3QgKilOVUxMKTsKKyAgICAgICAgcmVzID0gUHlFdmFsX0NhbGxPYmplY3QoZXhpdGZ1bmMsIChQeU9iamVjdCAqKU5VTEwpOworICAgICAgICBpZiAocmVzID09IE5VTEwpIHsKKyAgICAgICAgICAgIGlmICghUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19TeXN0ZW1FeGl0KSkgeworICAgICAgICAgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCJFcnJvciBpbiBzeXMuZXhpdGZ1bmM6XG4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5RXJyX1ByaW50KCk7CisgICAgICAgIH0KKyAgICAgICAgUHlfREVDUkVGKGV4aXRmdW5jKTsKKyAgICB9CiAKLQlpZiAoUHlfRmx1c2hMaW5lKCkpCi0JCVB5RXJyX0NsZWFyKCk7CisgICAgaWYgKFB5X0ZsdXNoTGluZSgpKQorICAgICAgICBQeUVycl9DbGVhcigpOwogfQogCiBzdGF0aWMgdm9pZAogY2FsbF9sbF9leGl0ZnVuY3Modm9pZCkKIHsKLQl3aGlsZSAobmV4aXRmdW5jcyA+IDApCi0JCSgqZXhpdGZ1bmNzWy0tbmV4aXRmdW5jc10pKCk7CisgICAgd2hpbGUgKG5leGl0ZnVuY3MgPiAwKQorICAgICAgICAoKmV4aXRmdW5jc1stLW5leGl0ZnVuY3NdKSgpOwogCi0JZmZsdXNoKHN0ZG91dCk7Ci0JZmZsdXNoKHN0ZGVycik7CisgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgZmZsdXNoKHN0ZGVycik7CiB9CiAKIHZvaWQKIFB5X0V4aXQoaW50IHN0cykKIHsKLQlQeV9GaW5hbGl6ZSgpOworICAgIFB5X0ZpbmFsaXplKCk7CiAKLQlleGl0KHN0cyk7CisgICAgZXhpdChzdHMpOwogfQogCiBzdGF0aWMgdm9pZAogaW5pdHNpZ3Modm9pZCkKIHsKICNpZmRlZiBTSUdQSVBFCi0JUHlPU19zZXRzaWcoU0lHUElQRSwgU0lHX0lHTik7CisgICAgUHlPU19zZXRzaWcoU0lHUElQRSwgU0lHX0lHTik7CiAjZW5kaWYKICNpZmRlZiBTSUdYRloKLQlQeU9TX3NldHNpZyhTSUdYRlosIFNJR19JR04pOworICAgIFB5T1Nfc2V0c2lnKFNJR1hGWiwgU0lHX0lHTik7CiAjZW5kaWYKICNpZmRlZiBTSUdYRlNaCi0JUHlPU19zZXRzaWcoU0lHWEZTWiwgU0lHX0lHTik7CisgICAgUHlPU19zZXRzaWcoU0lHWEZTWiwgU0lHX0lHTik7CiAjZW5kaWYKLQlQeU9TX0luaXRJbnRlcnJ1cHRzKCk7IC8qIE1heSBpbXBseSBpbml0c2lnbmFsKCkgKi8KKyAgICBQeU9TX0luaXRJbnRlcnJ1cHRzKCk7IC8qIE1heSBpbXBseSBpbml0c2lnbmFsKCkgKi8KIH0KIAogCkBAIC0xNzc5LDEzICsxNzc5LDEzIEBACiBpbnQKIFB5X0ZkSXNJbnRlcmFjdGl2ZShGSUxFICpmcCwgY29uc3QgY2hhciAqZmlsZW5hbWUpCiB7Ci0JaWYgKGlzYXR0eSgoaW50KWZpbGVubyhmcCkpKQotCQlyZXR1cm4gMTsKLQlpZiAoIVB5X0ludGVyYWN0aXZlRmxhZykKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIChmaWxlbmFtZSA9PSBOVUxMKSB8fAotCSAgICAgICAoc3RyY21wKGZpbGVuYW1lLCAiPHN0ZGluPiIpID09IDApIHx8Ci0JICAgICAgIChzdHJjbXAoZmlsZW5hbWUsICI/Pz8iKSA9PSAwKTsKKyAgICBpZiAoaXNhdHR5KChpbnQpZmlsZW5vKGZwKSkpCisgICAgICAgIHJldHVybiAxOworICAgIGlmICghUHlfSW50ZXJhY3RpdmVGbGFnKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gKGZpbGVuYW1lID09IE5VTEwpIHx8CisgICAgICAgICAgIChzdHJjbXAoZmlsZW5hbWUsICI8c3RkaW4+IikgPT0gMCkgfHwKKyAgICAgICAgICAgKHN0cmNtcChmaWxlbmFtZSwgIj8/PyIpID09IDApOwogfQogCiAKQEAgLTE4MDMsMjEgKzE4MDMsMjEgQEAKIGludAogUHlPU19DaGVja1N0YWNrKHZvaWQpCiB7Ci0JX190cnkgewotCQkvKiBhbGxvY2EgdGhyb3dzIGEgc3RhY2sgb3ZlcmZsb3cgZXhjZXB0aW9uIGlmIHRoZXJlJ3MKLQkJICAgbm90IGVub3VnaCBzcGFjZSBsZWZ0IG9uIHRoZSBzdGFjayAqLwotCQlhbGxvY2EoUFlPU19TVEFDS19NQVJHSU4gKiBzaXplb2Yodm9pZCopKTsKLQkJcmV0dXJuIDA7Ci0JfSBfX2V4Y2VwdCAoR2V0RXhjZXB0aW9uQ29kZSgpID09IFNUQVRVU19TVEFDS19PVkVSRkxPVyA/Ci0JCSAgICAgICAgRVhDRVBUSU9OX0VYRUNVVEVfSEFORExFUiA6IAotCQkgICAgICAgIEVYQ0VQVElPTl9DT05USU5VRV9TRUFSQ0gpIHsKLQkJaW50IGVycmNvZGUgPSBfcmVzZXRzdGtvZmx3KCk7Ci0JCWlmIChlcnJjb2RlID09IDApCi0JCXsKLQkJCVB5X0ZhdGFsRXJyb3IoIkNvdWxkIG5vdCByZXNldCB0aGUgc3RhY2shIik7Ci0JCX0KLQl9Ci0JcmV0dXJuIDE7CisgICAgX190cnkgeworICAgICAgICAvKiBhbGxvY2EgdGhyb3dzIGEgc3RhY2sgb3ZlcmZsb3cgZXhjZXB0aW9uIGlmIHRoZXJlJ3MKKyAgICAgICAgICAgbm90IGVub3VnaCBzcGFjZSBsZWZ0IG9uIHRoZSBzdGFjayAqLworICAgICAgICBhbGxvY2EoUFlPU19TVEFDS19NQVJHSU4gKiBzaXplb2Yodm9pZCopKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfSBfX2V4Y2VwdCAoR2V0RXhjZXB0aW9uQ29kZSgpID09IFNUQVRVU19TVEFDS19PVkVSRkxPVyA/CisgICAgICAgICAgICAgICAgICAgIEVYQ0VQVElPTl9FWEVDVVRFX0hBTkRMRVIgOgorICAgICAgICAgICAgRVhDRVBUSU9OX0NPTlRJTlVFX1NFQVJDSCkgeworICAgICAgICBpbnQgZXJyY29kZSA9IF9yZXNldHN0a29mbHcoKTsKKyAgICAgICAgaWYgKGVycmNvZGUgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgUHlfRmF0YWxFcnJvcigiQ291bGQgbm90IHJlc2V0IHRoZSBzdGFjayEiKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMTsKIH0KIAogI2VuZGlmIC8qIFdJTjMyICYmIF9NU0NfVkVSICovCkBAIC0xODMzLDMzICsxODMzLDMzIEBACiBQeU9TX2dldHNpZyhpbnQgc2lnKQogewogI2lmZGVmIEhBVkVfU0lHQUNUSU9OCi0Jc3RydWN0IHNpZ2FjdGlvbiBjb250ZXh0OwotCWlmIChzaWdhY3Rpb24oc2lnLCBOVUxMLCAmY29udGV4dCkgPT0gLTEpCi0JCXJldHVybiBTSUdfRVJSOwotCXJldHVybiBjb250ZXh0LnNhX2hhbmRsZXI7CisgICAgc3RydWN0IHNpZ2FjdGlvbiBjb250ZXh0OworICAgIGlmIChzaWdhY3Rpb24oc2lnLCBOVUxMLCAmY29udGV4dCkgPT0gLTEpCisgICAgICAgIHJldHVybiBTSUdfRVJSOworICAgIHJldHVybiBjb250ZXh0LnNhX2hhbmRsZXI7CiAjZWxzZQotCVB5T1Nfc2lnaGFuZGxlcl90IGhhbmRsZXI7CisgICAgUHlPU19zaWdoYW5kbGVyX3QgaGFuZGxlcjsKIC8qIFNwZWNpYWwgc2lnbmFsIGhhbmRsaW5nIGZvciB0aGUgc2VjdXJlIENSVCBpbiBWaXN1YWwgU3R1ZGlvIDIwMDUgKi8KICNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiBfTVNDX1ZFUiA+PSAxNDAwCi0Jc3dpdGNoIChzaWcpIHsKLQkvKiBPbmx5IHRoZXNlIHNpZ25hbHMgYXJlIHZhbGlkICovCi0JY2FzZSBTSUdJTlQ6Ci0JY2FzZSBTSUdJTEw6Ci0JY2FzZSBTSUdGUEU6Ci0JY2FzZSBTSUdTRUdWOgotCWNhc2UgU0lHVEVSTToKLQljYXNlIFNJR0JSRUFLOgotCWNhc2UgU0lHQUJSVDoKLQkJYnJlYWs7Ci0JLyogRG9uJ3QgY2FsbCBzaWduYWwoKSB3aXRoIG90aGVyIHZhbHVlcyBvciBpdCB3aWxsIGFzc2VydCAqLwotCWRlZmF1bHQ6Ci0JCXJldHVybiBTSUdfRVJSOwotCX0KKyAgICBzd2l0Y2ggKHNpZykgeworICAgIC8qIE9ubHkgdGhlc2Ugc2lnbmFscyBhcmUgdmFsaWQgKi8KKyAgICBjYXNlIFNJR0lOVDoKKyAgICBjYXNlIFNJR0lMTDoKKyAgICBjYXNlIFNJR0ZQRToKKyAgICBjYXNlIFNJR1NFR1Y6CisgICAgY2FzZSBTSUdURVJNOgorICAgIGNhc2UgU0lHQlJFQUs6CisgICAgY2FzZSBTSUdBQlJUOgorICAgICAgICBicmVhazsKKyAgICAvKiBEb24ndCBjYWxsIHNpZ25hbCgpIHdpdGggb3RoZXIgdmFsdWVzIG9yIGl0IHdpbGwgYXNzZXJ0ICovCisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIFNJR19FUlI7CisgICAgfQogI2VuZGlmIC8qIF9NU0NfVkVSICYmIF9NU0NfVkVSID49IDE0MDAgKi8KLQloYW5kbGVyID0gc2lnbmFsKHNpZywgU0lHX0lHTik7Ci0JaWYgKGhhbmRsZXIgIT0gU0lHX0VSUikKLQkJc2lnbmFsKHNpZywgaGFuZGxlcik7Ci0JcmV0dXJuIGhhbmRsZXI7CisgICAgaGFuZGxlciA9IHNpZ25hbChzaWcsIFNJR19JR04pOworICAgIGlmIChoYW5kbGVyICE9IFNJR19FUlIpCisgICAgICAgIHNpZ25hbChzaWcsIGhhbmRsZXIpOworICAgIHJldHVybiBoYW5kbGVyOwogI2VuZGlmCiB9CiAKQEAgLTE4NjcsMjQgKzE4NjcsMjQgQEAKIFB5T1Nfc2V0c2lnKGludCBzaWcsIFB5T1Nfc2lnaGFuZGxlcl90IGhhbmRsZXIpCiB7CiAjaWZkZWYgSEFWRV9TSUdBQ1RJT04KLQkvKiBTb21lIGNvZGUgaW4gTW9kdWxlcy9zaWduYWxtb2R1bGUuYyBkZXBlbmRzIG9uIHNpZ2FjdGlvbigpIGJlaW5nCi0JICogdXNlZCBoZXJlIGlmIEhBVkVfU0lHQUNUSU9OIGlzIGRlZmluZWQuICBGaXggdGhhdCBpZiB0aGlzIGNvZGUKLQkgKiBjaGFuZ2VzIHRvIGludmFsaWRhdGUgdGhhdCBhc3N1bXB0aW9uLgotCSAqLwotCXN0cnVjdCBzaWdhY3Rpb24gY29udGV4dCwgb2NvbnRleHQ7Ci0JY29udGV4dC5zYV9oYW5kbGVyID0gaGFuZGxlcjsKLQlzaWdlbXB0eXNldCgmY29udGV4dC5zYV9tYXNrKTsKLQljb250ZXh0LnNhX2ZsYWdzID0gMDsKLQlpZiAoc2lnYWN0aW9uKHNpZywgJmNvbnRleHQsICZvY29udGV4dCkgPT0gLTEpCi0JCXJldHVybiBTSUdfRVJSOwotCXJldHVybiBvY29udGV4dC5zYV9oYW5kbGVyOworICAgIC8qIFNvbWUgY29kZSBpbiBNb2R1bGVzL3NpZ25hbG1vZHVsZS5jIGRlcGVuZHMgb24gc2lnYWN0aW9uKCkgYmVpbmcKKyAgICAgKiB1c2VkIGhlcmUgaWYgSEFWRV9TSUdBQ1RJT04gaXMgZGVmaW5lZC4gIEZpeCB0aGF0IGlmIHRoaXMgY29kZQorICAgICAqIGNoYW5nZXMgdG8gaW52YWxpZGF0ZSB0aGF0IGFzc3VtcHRpb24uCisgICAgICovCisgICAgc3RydWN0IHNpZ2FjdGlvbiBjb250ZXh0LCBvY29udGV4dDsKKyAgICBjb250ZXh0LnNhX2hhbmRsZXIgPSBoYW5kbGVyOworICAgIHNpZ2VtcHR5c2V0KCZjb250ZXh0LnNhX21hc2spOworICAgIGNvbnRleHQuc2FfZmxhZ3MgPSAwOworICAgIGlmIChzaWdhY3Rpb24oc2lnLCAmY29udGV4dCwgJm9jb250ZXh0KSA9PSAtMSkKKyAgICAgICAgcmV0dXJuIFNJR19FUlI7CisgICAgcmV0dXJuIG9jb250ZXh0LnNhX2hhbmRsZXI7CiAjZWxzZQotCVB5T1Nfc2lnaGFuZGxlcl90IG9sZGhhbmRsZXI7Ci0Jb2xkaGFuZGxlciA9IHNpZ25hbChzaWcsIGhhbmRsZXIpOworICAgIFB5T1Nfc2lnaGFuZGxlcl90IG9sZGhhbmRsZXI7CisgICAgb2xkaGFuZGxlciA9IHNpZ25hbChzaWcsIGhhbmRsZXIpOwogI2lmZGVmIEhBVkVfU0lHSU5URVJSVVBUCi0Jc2lnaW50ZXJydXB0KHNpZywgMSk7CisgICAgc2lnaW50ZXJydXB0KHNpZywgMSk7CiAjZW5kaWYKLQlyZXR1cm4gb2xkaGFuZGxlcjsKKyAgICByZXR1cm4gb2xkaGFuZGxlcjsKICNlbmRpZgogfQogCkBAIC0xODk0LDcxICsxODk0LDcxIEBACiBQeUFQSV9GVU5DKG5vZGUgKikKIFB5UGFyc2VyX1NpbXBsZVBhcnNlRmlsZShGSUxFICpmcCwgY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBzdGFydCkKIHsKLQlyZXR1cm4gUHlQYXJzZXJfU2ltcGxlUGFyc2VGaWxlRmxhZ3MoZnAsIGZpbGVuYW1lLCBzdGFydCwgMCk7CisgICAgcmV0dXJuIFB5UGFyc2VyX1NpbXBsZVBhcnNlRmlsZUZsYWdzKGZwLCBmaWxlbmFtZSwgc3RhcnQsIDApOwogfQogCiAjdW5kZWYgUHlQYXJzZXJfU2ltcGxlUGFyc2VTdHJpbmcKIFB5QVBJX0ZVTkMobm9kZSAqKQogUHlQYXJzZXJfU2ltcGxlUGFyc2VTdHJpbmcoY29uc3QgY2hhciAqc3RyLCBpbnQgc3RhcnQpCiB7Ci0JcmV0dXJuIFB5UGFyc2VyX1NpbXBsZVBhcnNlU3RyaW5nRmxhZ3Moc3RyLCBzdGFydCwgMCk7CisgICAgcmV0dXJuIFB5UGFyc2VyX1NpbXBsZVBhcnNlU3RyaW5nRmxhZ3Moc3RyLCBzdGFydCwgMCk7CiB9CiAKICN1bmRlZiBQeVJ1bl9BbnlGaWxlCiBQeUFQSV9GVU5DKGludCkKIFB5UnVuX0FueUZpbGUoRklMRSAqZnAsIGNvbnN0IGNoYXIgKm5hbWUpCiB7Ci0JcmV0dXJuIFB5UnVuX0FueUZpbGVFeEZsYWdzKGZwLCBuYW1lLCAwLCBOVUxMKTsKKyAgICByZXR1cm4gUHlSdW5fQW55RmlsZUV4RmxhZ3MoZnAsIG5hbWUsIDAsIE5VTEwpOwogfQogCiAjdW5kZWYgUHlSdW5fQW55RmlsZUV4CiBQeUFQSV9GVU5DKGludCkKIFB5UnVuX0FueUZpbGVFeChGSUxFICpmcCwgY29uc3QgY2hhciAqbmFtZSwgaW50IGNsb3NlaXQpCiB7Ci0JcmV0dXJuIFB5UnVuX0FueUZpbGVFeEZsYWdzKGZwLCBuYW1lLCBjbG9zZWl0LCBOVUxMKTsKKyAgICByZXR1cm4gUHlSdW5fQW55RmlsZUV4RmxhZ3MoZnAsIG5hbWUsIGNsb3NlaXQsIE5VTEwpOwogfQogCiAjdW5kZWYgUHlSdW5fQW55RmlsZUZsYWdzCiBQeUFQSV9GVU5DKGludCkKIFB5UnVuX0FueUZpbGVGbGFncyhGSUxFICpmcCwgY29uc3QgY2hhciAqbmFtZSwgUHlDb21waWxlckZsYWdzICpmbGFncykKIHsKLQlyZXR1cm4gUHlSdW5fQW55RmlsZUV4RmxhZ3MoZnAsIG5hbWUsIDAsIGZsYWdzKTsKKyAgICByZXR1cm4gUHlSdW5fQW55RmlsZUV4RmxhZ3MoZnAsIG5hbWUsIDAsIGZsYWdzKTsKIH0KIAogI3VuZGVmIFB5UnVuX0ZpbGUKIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikKIFB5UnVuX0ZpbGUoRklMRSAqZnAsIGNvbnN0IGNoYXIgKnAsIGludCBzLCBQeU9iamVjdCAqZywgUHlPYmplY3QgKmwpCiB7Ci0JcmV0dXJuIFB5UnVuX0ZpbGVFeEZsYWdzKGZwLCBwLCBzLCBnLCBsLCAwLCBOVUxMKTsKKyAgICByZXR1cm4gUHlSdW5fRmlsZUV4RmxhZ3MoZnAsIHAsIHMsIGcsIGwsIDAsIE5VTEwpOwogfQogCiAjdW5kZWYgUHlSdW5fRmlsZUV4CiBQeUFQSV9GVU5DKFB5T2JqZWN0ICopCiBQeVJ1bl9GaWxlRXgoRklMRSAqZnAsIGNvbnN0IGNoYXIgKnAsIGludCBzLCBQeU9iamVjdCAqZywgUHlPYmplY3QgKmwsIGludCBjKQogewotCXJldHVybiBQeVJ1bl9GaWxlRXhGbGFncyhmcCwgcCwgcywgZywgbCwgYywgTlVMTCk7CisgICAgcmV0dXJuIFB5UnVuX0ZpbGVFeEZsYWdzKGZwLCBwLCBzLCBnLCBsLCBjLCBOVUxMKTsKIH0KIAogI3VuZGVmIFB5UnVuX0ZpbGVGbGFncwogUHlBUElfRlVOQyhQeU9iamVjdCAqKQogUHlSdW5fRmlsZUZsYWdzKEZJTEUgKmZwLCBjb25zdCBjaGFyICpwLCBpbnQgcywgUHlPYmplY3QgKmcsIFB5T2JqZWN0ICpsLAotCQlQeUNvbXBpbGVyRmxhZ3MgKmZsYWdzKQorICAgICAgICAgICAgICAgIFB5Q29tcGlsZXJGbGFncyAqZmxhZ3MpCiB7Ci0JcmV0dXJuIFB5UnVuX0ZpbGVFeEZsYWdzKGZwLCBwLCBzLCBnLCBsLCAwLCBmbGFncyk7CisgICAgcmV0dXJuIFB5UnVuX0ZpbGVFeEZsYWdzKGZwLCBwLCBzLCBnLCBsLCAwLCBmbGFncyk7CiB9CiAKICN1bmRlZiBQeVJ1bl9TaW1wbGVGaWxlCiBQeUFQSV9GVU5DKGludCkKIFB5UnVuX1NpbXBsZUZpbGUoRklMRSAqZiwgY29uc3QgY2hhciAqcCkKIHsKLQlyZXR1cm4gUHlSdW5fU2ltcGxlRmlsZUV4RmxhZ3MoZiwgcCwgMCwgTlVMTCk7CisgICAgcmV0dXJuIFB5UnVuX1NpbXBsZUZpbGVFeEZsYWdzKGYsIHAsIDAsIE5VTEwpOwogfQogCiAjdW5kZWYgUHlSdW5fU2ltcGxlRmlsZUV4CiBQeUFQSV9GVU5DKGludCkKIFB5UnVuX1NpbXBsZUZpbGVFeChGSUxFICpmLCBjb25zdCBjaGFyICpwLCBpbnQgYykKIHsKLQlyZXR1cm4gUHlSdW5fU2ltcGxlRmlsZUV4RmxhZ3MoZiwgcCwgYywgTlVMTCk7CisgICAgcmV0dXJuIFB5UnVuX1NpbXBsZUZpbGVFeEZsYWdzKGYsIHAsIGMsIE5VTEwpOwogfQogCiAKQEAgLTE5NjYsMzUgKzE5NjYsMzUgQEAKIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikKIFB5UnVuX1N0cmluZyhjb25zdCBjaGFyICpzdHIsIGludCBzLCBQeU9iamVjdCAqZywgUHlPYmplY3QgKmwpCiB7Ci0JcmV0dXJuIFB5UnVuX1N0cmluZ0ZsYWdzKHN0ciwgcywgZywgbCwgTlVMTCk7CisgICAgcmV0dXJuIFB5UnVuX1N0cmluZ0ZsYWdzKHN0ciwgcywgZywgbCwgTlVMTCk7CiB9CiAKICN1bmRlZiBQeVJ1bl9TaW1wbGVTdHJpbmcKIFB5QVBJX0ZVTkMoaW50KQogUHlSdW5fU2ltcGxlU3RyaW5nKGNvbnN0IGNoYXIgKnMpCiB7Ci0JcmV0dXJuIFB5UnVuX1NpbXBsZVN0cmluZ0ZsYWdzKHMsIE5VTEwpOworICAgIHJldHVybiBQeVJ1bl9TaW1wbGVTdHJpbmdGbGFncyhzLCBOVUxMKTsKIH0KIAogI3VuZGVmIFB5X0NvbXBpbGVTdHJpbmcKIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikKIFB5X0NvbXBpbGVTdHJpbmcoY29uc3QgY2hhciAqc3RyLCBjb25zdCBjaGFyICpwLCBpbnQgcykKIHsKLQlyZXR1cm4gUHlfQ29tcGlsZVN0cmluZ0ZsYWdzKHN0ciwgcCwgcywgTlVMTCk7CisgICAgcmV0dXJuIFB5X0NvbXBpbGVTdHJpbmdGbGFncyhzdHIsIHAsIHMsIE5VTEwpOwogfQogCiAjdW5kZWYgUHlSdW5fSW50ZXJhY3RpdmVPbmUKIFB5QVBJX0ZVTkMoaW50KQogUHlSdW5fSW50ZXJhY3RpdmVPbmUoRklMRSAqZiwgY29uc3QgY2hhciAqcCkKIHsKLQlyZXR1cm4gUHlSdW5fSW50ZXJhY3RpdmVPbmVGbGFncyhmLCBwLCBOVUxMKTsKKyAgICByZXR1cm4gUHlSdW5fSW50ZXJhY3RpdmVPbmVGbGFncyhmLCBwLCBOVUxMKTsKIH0KIAogI3VuZGVmIFB5UnVuX0ludGVyYWN0aXZlTG9vcAogUHlBUElfRlVOQyhpbnQpCiBQeVJ1bl9JbnRlcmFjdGl2ZUxvb3AoRklMRSAqZiwgY29uc3QgY2hhciAqcCkKIHsKLQlyZXR1cm4gUHlSdW5fSW50ZXJhY3RpdmVMb29wRmxhZ3MoZiwgcCwgTlVMTCk7CisgICAgcmV0dXJuIFB5UnVuX0ludGVyYWN0aXZlTG9vcEZsYWdzKGYsIHAsIE5VTEwpOwogfQogCiAjaWZkZWYgX19jcGx1c3BsdXMKZGlmZiAtLWdpdCBhL1B5dGhvbi9zdHJ0b2QuYyBiL1B5dGhvbi9zdHJ0b2QuYwppbmRleCBhMjQ4NDYwLi42Nzk4ZWZhIDEwMDY0NAotLS0gYS9QeXRob24vc3RydG9kLmMKKysrIGIvUHl0aG9uL3N0cnRvZC5jCkBAIC0xNCw3ICsxNCw3IEBACiAgICAgRGVmaW5lczogZG91YmxlIHN0cnRvZCAoY2hhciAqc3RyLCBjaGFyKipwdHIpCiAqLwogCi0vKiAgVGhpcyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgc3RydG9kKCkgZnVuY3Rpb24gZGVzY3JpYmVkIGluIHRoZSAKKy8qICBUaGlzIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBzdHJ0b2QoKSBmdW5jdGlvbiBkZXNjcmliZWQgaW4gdGhlCiAgICAgU3lzdGVtIFYgbWFudWFscywgd2l0aCBhIGRpZmZlcmVudCBuYW1lIHRvIGF2b2lkIGxpbmtlciBwcm9ibGVtcy4KICAgICBBbGwgdGhhdCBzdHIyZGJsKCkgZG9lcyBpdHNlbGYgaXMgY2hlY2sgdGhhdCB0aGUgYXJndW1lbnQgaXMgd2VsbC1mb3JtZWQKICAgICBhbmQgaXMgaW4gcmFuZ2UuICBJdCBsZWF2ZXMgdGhlIHdvcmsgb2YgY29udmVyc2lvbiB0byBhdG9mKCksIHdoaWNoIGlzCkBAIC0yMiwxOCArMjIsMTggQEAKIAogICAgIFRoZXJlIGFyZSB0d28gcmVhc29ucyB3aHkgdGhpcyBzaG91bGQgYmUgcHJvdmlkZWQgdG8gdGhlIG5ldDoKICAgICAoYSkgc29tZSBVTklYIHN5c3RlbXMgZG8gbm90IHlldCBoYXZlIHN0cnRvZCgpLCBvciBkbyBub3QgaGF2ZSBpdAotICAgICAgICBhdmFpbGFibGUgaW4gdGhlIEJTRCAidW5pdmVyc2UiIChidXQgdGhleSBkbyBoYXZlIGF0b2YoKSkuCisgICAgYXZhaWxhYmxlIGluIHRoZSBCU0QgInVuaXZlcnNlIiAoYnV0IHRoZXkgZG8gaGF2ZSBhdG9mKCkpLgogICAgIChiKSBzb21lIG9mIHRoZSBVTklYIHN5c3RlbXMgdGhhdCAqZG8qIGhhdmUgaXQgZ2V0IGl0IHdyb25nLgotCShzb21lIGNyYXNoIHdpdGggbGFyZ2UgYXJndW1lbnRzLCBzb21lIGFzc2lnbiB0aGUgd3JvbmcgKnB0ciB2YWx1ZSkuCisgICAgKHNvbWUgY3Jhc2ggd2l0aCBsYXJnZSBhcmd1bWVudHMsIHNvbWUgYXNzaWduIHRoZSB3cm9uZyAqcHRyIHZhbHVlKS4KICAgICBUaGVyZSBpcyBhIHJlYXNvbiB3aHkgKndlKiBhcmUgcHJvdmlkaW5nIGl0OiB3ZSBuZWVkIGEgY29ycmVjdCB2ZXJzaW9uCiAgICAgb2Ygc3RydG9kKCksIGFuZCBpZiB3ZSBnaXZlIHRoaXMgb25lIGF3YXkgbWF5YmUgc29tZW9uZSB3aWxsIGxvb2sgZm9yCiAgICAgbWlzdGFrZXMgaW4gaXQgYW5kIGZpeCB0aGVtIGZvciB1cyAoOi0pLgogKi8KLSAgICAKKwogLyogIFRoZSBmb2xsb3dpbmcgY29uc3RhbnRzIGFyZSBtYWNoaW5lLXNwZWNpZmljLiAgTUR7TUlOLE1BWH1FWFBUIGFyZQogICAgIGludGVnZXJzIGFuZCBNRHtNSU4sTUFYfUZSQUMgYXJlIHN0cmluZ3Mgc3VjaCB0aGF0Ci0JMC4ke01ETUFYRlJBQ31lJHtNRE1BWEVYUFR9IGlzIHRoZSBsYXJnZXN0IHJlcHJlc2VudGFibGUgZG91YmxlLAotCTAuJHtNRE1JTkZSQUN9ZSR7TURNSU5FWFBUfSBpcyB0aGUgc21hbGxlc3QgcmVwcmVzZW50YWJsZSArdmUgZG91YmxlCisgICAgMC4ke01ETUFYRlJBQ31lJHtNRE1BWEVYUFR9IGlzIHRoZSBsYXJnZXN0IHJlcHJlc2VudGFibGUgZG91YmxlLAorICAgIDAuJHtNRE1JTkZSQUN9ZSR7TURNSU5FWFBUfSBpcyB0aGUgc21hbGxlc3QgcmVwcmVzZW50YWJsZSArdmUgZG91YmxlCiAgICAgTUR7TUlOLE1BWH1GUkFDIG11c3Qgbm90IGhhdmUgYW55IHRyYWlsaW5nIHplcm9zLgogICAgIFRoZSB2YWx1ZXMgaGVyZSBhcmUgZm9yIElFRUUtNzU0IDY0LWJpdCBmbG9hdHMuCiAgICAgSXQgaXMgbm90IHBlcmZlY3RseSBjbGVhciB0byBtZSB3aGV0aGVyIGFuIElFRUUgaW5maW5pdHkgc2hvdWxkIGJlCkBAIC00NCwxMTMgKzQ0LDExMyBAQAogICAgIEkgZG8ga25vdyBhYm91dCA8dmFsdWVzLmg+LCBidXQgdGhlIHdob2xlIHBvaW50IG9mIHRoaXMgZmlsZSBpcyB0aGF0CiAgICAgd2UgY2FuJ3QgYWx3YXlzIHRydXN0IHRoYXQgc3R1ZmYgdG8gYmUgdGhlcmUgb3IgdG8gYmUgY29ycmVjdC4KICovCi1zdGF0aWMJaW50CU1ETUlORVhQVAk9IC0zMjM7Ci1zdGF0aWMJY2hhcglNRE1JTkZSQUNbXQk9ICI0OTQwNjU2NDU4NDEyNDY1NDQiOwotc3RhdGljCWRvdWJsZQlaRVJPCQk9IDAuMDsKK3N0YXRpYyAgaW50ICAgICBNRE1JTkVYUFQgICAgICAgPSAtMzIzOworc3RhdGljICBjaGFyICAgIE1ETUlORlJBQ1tdICAgICA9ICI0OTQwNjU2NDU4NDEyNDY1NDQiOworc3RhdGljICBkb3VibGUgIFpFUk8gICAgICAgICAgICA9IDAuMDsKIAotc3RhdGljCWludAlNRE1BWEVYUFQJPSAzMDk7Ci1zdGF0aWMJY2hhcglNRE1BWEZSQUNbXQk9ICIxNzk3NjkzMTM0ODYyMzE1NyI7Ci1zdGF0aWMJZG91YmxlCUhVR0UJCT0gMS43OTc2OTMxMzQ4NjIzMTU3ZTMwODsKK3N0YXRpYyAgaW50ICAgICBNRE1BWEVYUFQgICAgICAgPSAzMDk7CitzdGF0aWMgIGNoYXIgICAgTURNQVhGUkFDW10gICAgID0gIjE3OTc2OTMxMzQ4NjIzMTU3IjsKK3N0YXRpYyAgZG91YmxlICBIVUdFICAgICAgICAgICAgPSAxLjc5NzY5MzEzNDg2MjMxNTdlMzA4OwogCi1leHRlcm4JZG91YmxlCWF0b2YoY29uc3QgY2hhciAqKTsJCS8qIE9ubHkgY2FsbGVkIHdoZW4gcmVzdWx0IGtub3duIHRvIGJlIG9rICovCitleHRlcm4gIGRvdWJsZSAgYXRvZihjb25zdCBjaGFyICopOyAgICAgICAgICAgICAvKiBPbmx5IGNhbGxlZCB3aGVuIHJlc3VsdCBrbm93biB0byBiZSBvayAqLwogCiAjaWZkZWYgSEFWRV9FUlJOT19ICiAjaW5jbHVkZSA8ZXJybm8uaD4KICNlbmRpZgotZXh0ZXJuCWludAllcnJubzsKK2V4dGVybiAgaW50ICAgICBlcnJubzsKIAogZG91YmxlIHN0cnRvZChjaGFyICpzdHIsIGNoYXIgKipwdHIpCiB7Ci0JaW50IHNpZ24sIHNjYWxlLCBkb3RzZWVuOwotCWludCBlc2lnbiwgZXhwdDsKLQljaGFyICpzYXZlOwotCXJlZ2lzdGVyIGNoYXIgKnNwLCAqZHA7Ci0JcmVnaXN0ZXIgaW50IGM7Ci0JY2hhciAqYnVmb3JnLCAqYnVmbGltOwotCWNoYXIgYnVmZmVyWzY0XTsJCS8qIDQ1LWRpZ2l0IHNpZ25pZmljYW50ICsgKi8KLQkJCQkJLyogMTMtZGlnaXQgZXhwb25lbnQgKi8KLQlzcCA9IHN0cjsKLQl3aGlsZSAoKnNwID09ICcgJykgc3ArKzsKLQlzaWduID0gMTsKLQlpZiAoKnNwID09ICctJykgc2lnbiAtPSAyLCBzcCsrOwotCWRvdHNlZW4gPSAwLCBzY2FsZSA9IDA7Ci0JZHAgPSBidWZmZXI7CQotCSpkcCsrID0gJzAnOyAqZHArKyA9ICcuJzsKLQlidWZvcmcgPSBkcCwgYnVmbGltID0gYnVmZmVyKzQ4OwotCWZvciAoc2F2ZSA9IHNwOyBjID0gKnNwOyBzcCsrKQotCSAgICBpZiAoYyA9PSAnLicpIHsKLQkJaWYgKGRvdHNlZW4pIGJyZWFrOwotCQlkb3RzZWVuKys7Ci0JICAgIH0gZWxzZQotCSAgICBpZiAoKHVuc2lnbmVkKShjLScwJykgPiAodW5zaWduZWQpKCc5Jy0nMCcpKSB7Ci0JCWJyZWFrOwotCSAgICB9IGVsc2UKLQkgICAgaWYgKGMgPT0gJzAnKSB7Ci0JCWlmIChkcCAhPSBidWZvcmcpIHsKLQkJICAgIC8qIFRoaXMgaXMgbm90IHRoZSBmaXJzdCBkaWdpdCwgc28gd2Ugd2FudCB0byBrZWVwIGl0ICovCi0JCSAgICBpZiAoZHAgPCBidWZsaW0pICpkcCsrID0gYzsKLQkJICAgIGlmICghZG90c2Vlbikgc2NhbGUrKzsKLQkJfSBlbHNlIHsKLQkJICAgIC8qIE5vIG5vbi16ZXJvIGRpZ2l0cyBzZWVuIHlldCAqLwotCQkgICAgLyogSWYgYSAuIGhhcyBiZWVuIHNlZW4sIHNjYWxlIG11c3QgYmUgYWRqdXN0ZWQgKi8KLQkJICAgIGlmIChkb3RzZWVuKSBzY2FsZS0tOwotCQl9Ci0JICAgIH0gZWxzZSB7Ci0JCS8qIFRoaXMgaXMgYSBub256ZXJvIGRpZ2l0LCBzbyB3ZSB3YW50IHRvIGtlZXAgaXQgKi8KLQkJaWYgKGRwIDwgYnVmbGltKSAqZHArKyA9IGM7Ci0JCS8qIElmIGl0IHByZWNlZGVzIGEgLiwgc2NhbGUgbXVzdCBiZSBhZGp1c3RlZCAqLwotCQlpZiAoIWRvdHNlZW4pIHNjYWxlKys7Ci0JICAgIH0KLQlpZiAoc3AgPT0gc2F2ZSkgewotCSAgICBpZiAocHRyKSAqcHRyID0gc3RyOwotCSAgICBlcnJubyA9IEVET007CQkvKiB3aGF0IHNob3VsZCB0aGlzIGJlPyAqLwotCSAgICByZXR1cm4gWkVSTzsKLQl9Ci0JCi0Jd2hpbGUgKGRwID4gYnVmb3JnICYmIGRwWy0xXSA9PSAnMCcpIC0tZHA7Ci0JaWYgKGRwID09IGJ1Zm9yZykgKmRwKysgPSAnMCc7Ci0JKmRwID0gJ1wwJzsKLQkvKiAgTm93IHRoZSBjb250ZW50cyBvZiBidWZmZXIgYXJlCi0JICAgICstLSstLS0tLS0tLSstKy0tLS0tLS0tKwotCSAgICB8MC58ZnJhY3Rpb258XHxsZWZ0b3ZlcnwKLQkgICAgKy0tKy0tLS0tLS0tKy0rLS0tLS0tLS0rCi0JCQkgXmRwIHBvaW50cyBoZXJlCi0JICAgIHdoZXJlIGZyYWN0aW9uIGJlZ2lucyB3aXRoIDAgaWZmIGl0IGlzICIwIiwgYW5kIGhhcyBhdCBtb3N0Ci0JICAgIDQ1IGRpZ2l0cyBpbiBpdCwgYW5kIGxlZnRvdmVyIGlzIGF0IGxlYXN0IDE2IGNoYXJhY3RlcnMuCi0JKi8KLQlzYXZlID0gc3AsIGV4cHQgPSAwLCBlc2lnbiA9IDE7Ci0JZG8gewotCSAgICBjID0gKnNwKys7Ci0JICAgIGlmIChjICE9ICdlJyAmJiBjICE9ICdFJykgYnJlYWs7Ci0JICAgIGMgPSAqc3ArKzsKLQkgICAgaWYgKGMgPT0gJy0nKSBlc2lnbiAtPSAyLCBjID0gKnNwKys7IGVsc2UKLQkgICAgaWYgKGMgPT0gJysnIC8qIHx8IGMgPT0gJyAnICovICkgYyA9ICpzcCsrOwotCSAgICBpZiAoKHVuc2lnbmVkKShjLScwJykgPiAodW5zaWduZWQpKCc5Jy0nMCcpKSBicmVhazsKLQkgICAgd2hpbGUgKGMgPT0gJzAnKSBjID0gKnNwKys7Ci0JICAgIGZvciAoOyAodW5zaWduZWQpKGMtJzAnKSA8PSAodW5zaWduZWQpKCc5Jy0nMCcpOyBjID0gKnNwKyspCi0JCWV4cHQgPSBleHB0KjEwICsgYy0nMCc7CSAgICAKLQkgICAgaWYgKGVzaWduIDwgMCkgZXhwdCA9IC1leHB0OwotCSAgICBzYXZlID0gc3AtMTsKLQl9IHdoaWxlICgwKTsKLQlpZiAocHRyKSAqcHRyID0gc2F2ZTsKLQlleHB0ICs9IHNjYWxlOwotCS8qICBOb3cgdGhlIG51bWJlciBpcyBzaWduKjAuZnJhY3Rpb24qMTAqKmV4cHQgICovCi0JZXJybm8gPSBFUkFOR0U7Ci0JaWYgKGV4cHQgPiBNRE1BWEVYUFQpIHsKLQkgICAgcmV0dXJuIEhVR0Uqc2lnbjsKLQl9IGVsc2UKLQlpZiAoZXhwdCA9PSBNRE1BWEVYUFQpIHsKLQkgICAgaWYgKHN0cmNtcChidWZvcmcsIE1ETUFYRlJBQykgPiAwKSByZXR1cm4gSFVHRSpzaWduOwotCX0gZWxzZQotCWlmIChleHB0IDwgTURNSU5FWFBUKSB7Ci0JICAgIHJldHVybiBaRVJPKnNpZ247Ci0JfSBlbHNlCi0JaWYgKGV4cHQgPT0gTURNSU5FWFBUKSB7Ci0JICAgIGlmIChzdHJjbXAoYnVmb3JnLCBNRE1JTkZSQUMpIDwgMCkgcmV0dXJuIFpFUk8qc2lnbjsKLQl9Ci0JLyogIFdlIGhhdmUgbm93IGVzdGFibGlzaGVkIHRoYXQgdGhlIG51bWJlciBjYW4gYmUgICovCi0JLyogIHJlcHJlc2VudGVkIHdpdGhvdXQgb3ZlcmZsb3cgb3IgdW5kZXJmbG93ICAqLwotCSh2b2lkKSBzcHJpbnRmKGRwLCAiRSVkIiwgZXhwdCk7Ci0JZXJybm8gPSAwOwotCXJldHVybiBhdG9mKGJ1ZmZlcikqc2lnbjsKKyAgICBpbnQgc2lnbiwgc2NhbGUsIGRvdHNlZW47CisgICAgaW50IGVzaWduLCBleHB0OworICAgIGNoYXIgKnNhdmU7CisgICAgcmVnaXN0ZXIgY2hhciAqc3AsICpkcDsKKyAgICByZWdpc3RlciBpbnQgYzsKKyAgICBjaGFyICpidWZvcmcsICpidWZsaW07CisgICAgY2hhciBidWZmZXJbNjRdOyAgICAgICAgICAgICAgICAgICAgLyogNDUtZGlnaXQgc2lnbmlmaWNhbnQgKyAqLworICAgICAgICAgICAgICAgICAgICAvKiAxMy1kaWdpdCBleHBvbmVudCAqLworICAgIHNwID0gc3RyOworICAgIHdoaWxlICgqc3AgPT0gJyAnKSBzcCsrOworICAgIHNpZ24gPSAxOworICAgIGlmICgqc3AgPT0gJy0nKSBzaWduIC09IDIsIHNwKys7CisgICAgZG90c2VlbiA9IDAsIHNjYWxlID0gMDsKKyAgICBkcCA9IGJ1ZmZlcjsKKyAgICAqZHArKyA9ICcwJzsgKmRwKysgPSAnLic7CisgICAgYnVmb3JnID0gZHAsIGJ1ZmxpbSA9IGJ1ZmZlcis0ODsKKyAgICBmb3IgKHNhdmUgPSBzcDsgYyA9ICpzcDsgc3ArKykKKyAgICAgICAgaWYgKGMgPT0gJy4nKSB7CisgICAgICAgIGlmIChkb3RzZWVuKSBicmVhazsKKyAgICAgICAgZG90c2VlbisrOworICAgICAgICB9IGVsc2UKKyAgICAgICAgaWYgKCh1bnNpZ25lZCkoYy0nMCcpID4gKHVuc2lnbmVkKSgnOSctJzAnKSkgeworICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlCisgICAgICAgIGlmIChjID09ICcwJykgeworICAgICAgICBpZiAoZHAgIT0gYnVmb3JnKSB7CisgICAgICAgICAgICAvKiBUaGlzIGlzIG5vdCB0aGUgZmlyc3QgZGlnaXQsIHNvIHdlIHdhbnQgdG8ga2VlcCBpdCAqLworICAgICAgICAgICAgaWYgKGRwIDwgYnVmbGltKSAqZHArKyA9IGM7CisgICAgICAgICAgICBpZiAoIWRvdHNlZW4pIHNjYWxlKys7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBObyBub24temVybyBkaWdpdHMgc2VlbiB5ZXQgKi8KKyAgICAgICAgICAgIC8qIElmIGEgLiBoYXMgYmVlbiBzZWVuLCBzY2FsZSBtdXN0IGJlIGFkanVzdGVkICovCisgICAgICAgICAgICBpZiAoZG90c2Vlbikgc2NhbGUtLTsKKyAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAvKiBUaGlzIGlzIGEgbm9uemVybyBkaWdpdCwgc28gd2Ugd2FudCB0byBrZWVwIGl0ICovCisgICAgICAgIGlmIChkcCA8IGJ1ZmxpbSkgKmRwKysgPSBjOworICAgICAgICAvKiBJZiBpdCBwcmVjZWRlcyBhIC4sIHNjYWxlIG11c3QgYmUgYWRqdXN0ZWQgKi8KKyAgICAgICAgaWYgKCFkb3RzZWVuKSBzY2FsZSsrOworICAgICAgICB9CisgICAgaWYgKHNwID09IHNhdmUpIHsKKyAgICAgICAgaWYgKHB0cikgKnB0ciA9IHN0cjsKKyAgICAgICAgZXJybm8gPSBFRE9NOyAgICAgICAgICAgICAgICAgICAvKiB3aGF0IHNob3VsZCB0aGlzIGJlPyAqLworICAgICAgICByZXR1cm4gWkVSTzsKKyAgICB9CisKKyAgICB3aGlsZSAoZHAgPiBidWZvcmcgJiYgZHBbLTFdID09ICcwJykgLS1kcDsKKyAgICBpZiAoZHAgPT0gYnVmb3JnKSAqZHArKyA9ICcwJzsKKyAgICAqZHAgPSAnXDAnOworICAgIC8qICBOb3cgdGhlIGNvbnRlbnRzIG9mIGJ1ZmZlciBhcmUKKyAgICAgICAgKy0tKy0tLS0tLS0tKy0rLS0tLS0tLS0rCisgICAgICAgIHwwLnxmcmFjdGlvbnxcfGxlZnRvdmVyfAorICAgICAgICArLS0rLS0tLS0tLS0rLSstLS0tLS0tLSsKKyAgICAgICAgICAgICAgICAgICAgIF5kcCBwb2ludHMgaGVyZQorICAgICAgICB3aGVyZSBmcmFjdGlvbiBiZWdpbnMgd2l0aCAwIGlmZiBpdCBpcyAiMCIsIGFuZCBoYXMgYXQgbW9zdAorICAgICAgICA0NSBkaWdpdHMgaW4gaXQsIGFuZCBsZWZ0b3ZlciBpcyBhdCBsZWFzdCAxNiBjaGFyYWN0ZXJzLgorICAgICovCisgICAgc2F2ZSA9IHNwLCBleHB0ID0gMCwgZXNpZ24gPSAxOworICAgIGRvIHsKKyAgICAgICAgYyA9ICpzcCsrOworICAgICAgICBpZiAoYyAhPSAnZScgJiYgYyAhPSAnRScpIGJyZWFrOworICAgICAgICBjID0gKnNwKys7CisgICAgICAgIGlmIChjID09ICctJykgZXNpZ24gLT0gMiwgYyA9ICpzcCsrOyBlbHNlCisgICAgICAgIGlmIChjID09ICcrJyAvKiB8fCBjID09ICcgJyAqLyApIGMgPSAqc3ArKzsKKyAgICAgICAgaWYgKCh1bnNpZ25lZCkoYy0nMCcpID4gKHVuc2lnbmVkKSgnOSctJzAnKSkgYnJlYWs7CisgICAgICAgIHdoaWxlIChjID09ICcwJykgYyA9ICpzcCsrOworICAgICAgICBmb3IgKDsgKHVuc2lnbmVkKShjLScwJykgPD0gKHVuc2lnbmVkKSgnOSctJzAnKTsgYyA9ICpzcCsrKQorICAgICAgICBleHB0ID0gZXhwdCoxMCArIGMtJzAnOworICAgICAgICBpZiAoZXNpZ24gPCAwKSBleHB0ID0gLWV4cHQ7CisgICAgICAgIHNhdmUgPSBzcC0xOworICAgIH0gd2hpbGUgKDApOworICAgIGlmIChwdHIpICpwdHIgPSBzYXZlOworICAgIGV4cHQgKz0gc2NhbGU7CisgICAgLyogIE5vdyB0aGUgbnVtYmVyIGlzIHNpZ24qMC5mcmFjdGlvbioxMCoqZXhwdCAgKi8KKyAgICBlcnJubyA9IEVSQU5HRTsKKyAgICBpZiAoZXhwdCA+IE1ETUFYRVhQVCkgeworICAgICAgICByZXR1cm4gSFVHRSpzaWduOworICAgIH0gZWxzZQorICAgIGlmIChleHB0ID09IE1ETUFYRVhQVCkgeworICAgICAgICBpZiAoc3RyY21wKGJ1Zm9yZywgTURNQVhGUkFDKSA+IDApIHJldHVybiBIVUdFKnNpZ247CisgICAgfSBlbHNlCisgICAgaWYgKGV4cHQgPCBNRE1JTkVYUFQpIHsKKyAgICAgICAgcmV0dXJuIFpFUk8qc2lnbjsKKyAgICB9IGVsc2UKKyAgICBpZiAoZXhwdCA9PSBNRE1JTkVYUFQpIHsKKyAgICAgICAgaWYgKHN0cmNtcChidWZvcmcsIE1ETUlORlJBQykgPCAwKSByZXR1cm4gWkVSTypzaWduOworICAgIH0KKyAgICAvKiAgV2UgaGF2ZSBub3cgZXN0YWJsaXNoZWQgdGhhdCB0aGUgbnVtYmVyIGNhbiBiZSAgKi8KKyAgICAvKiAgcmVwcmVzZW50ZWQgd2l0aG91dCBvdmVyZmxvdyBvciB1bmRlcmZsb3cgICovCisgICAgKHZvaWQpIHNwcmludGYoZHAsICJFJWQiLCBleHB0KTsKKyAgICBlcnJubyA9IDA7CisgICAgcmV0dXJuIGF0b2YoYnVmZmVyKSpzaWduOwogfQpkaWZmIC0tZ2l0IGEvUHl0aG9uL3N0cnVjdG1lbWJlci5jIGIvUHl0aG9uL3N0cnVjdG1lbWJlci5jCmluZGV4IDJiMDQ3MmIuLjRjZWY0MmYgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9zdHJ1Y3RtZW1iZXIuYworKysgYi9QeXRob24vc3RydWN0bWVtYmVyLmMKQEAgLTgsMzU1ICs4LDM1NSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGxpc3RtZW1iZXJzKHN0cnVjdCBtZW1iZXJsaXN0ICptbGlzdCkKIHsKLQlpbnQgaSwgbjsKLQlQeU9iamVjdCAqdjsKLQlmb3IgKG4gPSAwOyBtbGlzdFtuXS5uYW1lICE9IE5VTEw7IG4rKykKLQkJOwotCXYgPSBQeUxpc3RfTmV3KG4pOwotCWlmICh2ICE9IE5VTEwpIHsKLQkJZm9yIChpID0gMDsgaSA8IG47IGkrKykKLQkJCVB5TGlzdF9TZXRJdGVtKHYsIGksCi0JCQkJICAgICAgIFB5U3RyaW5nX0Zyb21TdHJpbmcobWxpc3RbaV0ubmFtZSkpOwotCQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkgewotCQkJUHlfREVDUkVGKHYpOwotCQkJdiA9IE5VTEw7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlQeUxpc3RfU29ydCh2KTsKLQkJfQotCX0KLQlyZXR1cm4gdjsKKyAgICBpbnQgaSwgbjsKKyAgICBQeU9iamVjdCAqdjsKKyAgICBmb3IgKG4gPSAwOyBtbGlzdFtuXS5uYW1lICE9IE5VTEw7IG4rKykKKyAgICAgICAgOworICAgIHYgPSBQeUxpc3RfTmV3KG4pOworICAgIGlmICh2ICE9IE5VTEwpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgICAgICAgICAgIFB5TGlzdF9TZXRJdGVtKHYsIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19Gcm9tU3RyaW5nKG1saXN0W2ldLm5hbWUpKTsKKyAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgIHYgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgUHlMaXN0X1NvcnQodik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHY7CiB9CiAKIFB5T2JqZWN0ICoKIFB5TWVtYmVyX0dldChjb25zdCBjaGFyICphZGRyLCBzdHJ1Y3QgbWVtYmVybGlzdCAqbWxpc3QsIGNvbnN0IGNoYXIgKm5hbWUpCiB7Ci0Jc3RydWN0IG1lbWJlcmxpc3QgKmw7CisgICAgc3RydWN0IG1lbWJlcmxpc3QgKmw7CiAKLQlpZiAoc3RyY21wKG5hbWUsICJfX21lbWJlcnNfXyIpID09IDApCi0JCXJldHVybiBsaXN0bWVtYmVycyhtbGlzdCk7Ci0JZm9yIChsID0gbWxpc3Q7IGwtPm5hbWUgIT0gTlVMTDsgbCsrKSB7Ci0JCWlmIChzdHJjbXAobC0+bmFtZSwgbmFtZSkgPT0gMCkgewotCQkJUHlNZW1iZXJEZWYgY29weTsKLQkJCWNvcHkubmFtZSA9IGwtPm5hbWU7Ci0JCQljb3B5LnR5cGUgPSBsLT50eXBlOwotCQkJY29weS5vZmZzZXQgPSBsLT5vZmZzZXQ7Ci0JCQljb3B5LmZsYWdzID0gbC0+ZmxhZ3M7Ci0JCQljb3B5LmRvYyA9IE5VTEw7Ci0JCQlyZXR1cm4gUHlNZW1iZXJfR2V0T25lKGFkZHIsICZjb3B5KTsKLQkJfQotCX0KLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfQXR0cmlidXRlRXJyb3IsIG5hbWUpOwotCXJldHVybiBOVUxMOworICAgIGlmIChzdHJjbXAobmFtZSwgIl9fbWVtYmVyc19fIikgPT0gMCkKKyAgICAgICAgcmV0dXJuIGxpc3RtZW1iZXJzKG1saXN0KTsKKyAgICBmb3IgKGwgPSBtbGlzdDsgbC0+bmFtZSAhPSBOVUxMOyBsKyspIHsKKyAgICAgICAgaWYgKHN0cmNtcChsLT5uYW1lLCBuYW1lKSA9PSAwKSB7CisgICAgICAgICAgICBQeU1lbWJlckRlZiBjb3B5OworICAgICAgICAgICAgY29weS5uYW1lID0gbC0+bmFtZTsKKyAgICAgICAgICAgIGNvcHkudHlwZSA9IGwtPnR5cGU7CisgICAgICAgICAgICBjb3B5Lm9mZnNldCA9IGwtPm9mZnNldDsKKyAgICAgICAgICAgIGNvcHkuZmxhZ3MgPSBsLT5mbGFnczsKKyAgICAgICAgICAgIGNvcHkuZG9jID0gTlVMTDsKKyAgICAgICAgICAgIHJldHVybiBQeU1lbWJlcl9HZXRPbmUoYWRkciwgJmNvcHkpOworICAgICAgICB9CisgICAgfQorICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19BdHRyaWJ1dGVFcnJvciwgbmFtZSk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIFB5T2JqZWN0ICoKIFB5TWVtYmVyX0dldE9uZShjb25zdCBjaGFyICphZGRyLCBQeU1lbWJlckRlZiAqbCkKIHsKLQlQeU9iamVjdCAqdjsKLQlpZiAoKGwtPmZsYWdzICYgUkVBRF9SRVNUUklDVEVEKSAmJgotCSAgICBQeUV2YWxfR2V0UmVzdHJpY3RlZCgpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJyZXN0cmljdGVkIGF0dHJpYnV0ZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JYWRkciArPSBsLT5vZmZzZXQ7Ci0Jc3dpdGNoIChsLT50eXBlKSB7Ci0JY2FzZSBUX0JPT0w6Ci0JCXYgPSBQeUJvb2xfRnJvbUxvbmcoKihjaGFyKilhZGRyKTsKLQkJYnJlYWs7Ci0JY2FzZSBUX0JZVEU6Ci0JCXYgPSBQeUludF9Gcm9tTG9uZygqKGNoYXIqKWFkZHIpOwotCQlicmVhazsKLQljYXNlIFRfVUJZVEU6Ci0JCXYgPSBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZygqKHVuc2lnbmVkIGNoYXIqKWFkZHIpOwotCQlicmVhazsKLQljYXNlIFRfU0hPUlQ6Ci0JCXYgPSBQeUludF9Gcm9tTG9uZygqKHNob3J0KilhZGRyKTsKLQkJYnJlYWs7Ci0JY2FzZSBUX1VTSE9SVDoKLQkJdiA9IFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKCoodW5zaWduZWQgc2hvcnQqKWFkZHIpOwotCQlicmVhazsKLQljYXNlIFRfSU5UOgotCQl2ID0gUHlJbnRfRnJvbUxvbmcoKihpbnQqKWFkZHIpOwotCQlicmVhazsKLQljYXNlIFRfVUlOVDoKLQkJdiA9IFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKCoodW5zaWduZWQgaW50KilhZGRyKTsKLQkJYnJlYWs7Ci0JY2FzZSBUX0xPTkc6Ci0JCXYgPSBQeUludF9Gcm9tTG9uZygqKGxvbmcqKWFkZHIpOwotCQlicmVhazsKLQljYXNlIFRfVUxPTkc6Ci0JCXYgPSBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZygqKHVuc2lnbmVkIGxvbmcqKWFkZHIpOwotCQlicmVhazsKLQljYXNlIFRfUFlTU0laRVQ6Ci0JCXYgPSBQeUludF9Gcm9tU3NpemVfdCgqKFB5X3NzaXplX3QqKWFkZHIpOwotCQlicmVhazsKLQljYXNlIFRfRkxPQVQ6Ci0JCXYgPSBQeUZsb2F0X0Zyb21Eb3VibGUoKGRvdWJsZSkqKGZsb2F0KilhZGRyKTsKLQkJYnJlYWs7Ci0JY2FzZSBUX0RPVUJMRToKLQkJdiA9IFB5RmxvYXRfRnJvbURvdWJsZSgqKGRvdWJsZSopYWRkcik7Ci0JCWJyZWFrOwotCWNhc2UgVF9TVFJJTkc6Ci0JCWlmICgqKGNoYXIqKilhZGRyID09IE5VTEwpIHsKLQkJCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJCXYgPSBQeV9Ob25lOwotCQl9Ci0JCWVsc2UKLQkJCXYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCooY2hhcioqKWFkZHIpOwotCQlicmVhazsKLQljYXNlIFRfU1RSSU5HX0lOUExBQ0U6Ci0JCXYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKChjaGFyKilhZGRyKTsKLQkJYnJlYWs7Ci0JY2FzZSBUX0NIQVI6Ci0JCXYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciopYWRkciwgMSk7Ci0JCWJyZWFrOwotCWNhc2UgVF9PQkpFQ1Q6Ci0JCXYgPSAqKFB5T2JqZWN0ICoqKWFkZHI7Ci0JCWlmICh2ID09IE5VTEwpCi0JCQl2ID0gUHlfTm9uZTsKLQkJUHlfSU5DUkVGKHYpOwotCQlicmVhazsKLQljYXNlIFRfT0JKRUNUX0VYOgotCQl2ID0gKihQeU9iamVjdCAqKilhZGRyOwotCQlpZiAodiA9PSBOVUxMKQotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0F0dHJpYnV0ZUVycm9yLCBsLT5uYW1lKTsKLQkJUHlfWElOQ1JFRih2KTsKLQkJYnJlYWs7CisgICAgUHlPYmplY3QgKnY7CisgICAgaWYgKChsLT5mbGFncyAmIFJFQURfUkVTVFJJQ1RFRCkgJiYKKyAgICAgICAgUHlFdmFsX0dldFJlc3RyaWN0ZWQoKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAicmVzdHJpY3RlZCBhdHRyaWJ1dGUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGFkZHIgKz0gbC0+b2Zmc2V0OworICAgIHN3aXRjaCAobC0+dHlwZSkgeworICAgIGNhc2UgVF9CT09MOgorICAgICAgICB2ID0gUHlCb29sX0Zyb21Mb25nKCooY2hhciopYWRkcik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVF9CWVRFOgorICAgICAgICB2ID0gUHlJbnRfRnJvbUxvbmcoKihjaGFyKilhZGRyKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUX1VCWVRFOgorICAgICAgICB2ID0gUHlMb25nX0Zyb21VbnNpZ25lZExvbmcoKih1bnNpZ25lZCBjaGFyKilhZGRyKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUX1NIT1JUOgorICAgICAgICB2ID0gUHlJbnRfRnJvbUxvbmcoKihzaG9ydCopYWRkcik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVF9VU0hPUlQ6CisgICAgICAgIHYgPSBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZygqKHVuc2lnbmVkIHNob3J0KilhZGRyKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUX0lOVDoKKyAgICAgICAgdiA9IFB5SW50X0Zyb21Mb25nKCooaW50KilhZGRyKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUX1VJTlQ6CisgICAgICAgIHYgPSBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZygqKHVuc2lnbmVkIGludCopYWRkcik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVF9MT05HOgorICAgICAgICB2ID0gUHlJbnRfRnJvbUxvbmcoKihsb25nKilhZGRyKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUX1VMT05HOgorICAgICAgICB2ID0gUHlMb25nX0Zyb21VbnNpZ25lZExvbmcoKih1bnNpZ25lZCBsb25nKilhZGRyKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUX1BZU1NJWkVUOgorICAgICAgICB2ID0gUHlJbnRfRnJvbVNzaXplX3QoKihQeV9zc2l6ZV90KilhZGRyKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUX0ZMT0FUOgorICAgICAgICB2ID0gUHlGbG9hdF9Gcm9tRG91YmxlKChkb3VibGUpKihmbG9hdCopYWRkcik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVF9ET1VCTEU6CisgICAgICAgIHYgPSBQeUZsb2F0X0Zyb21Eb3VibGUoKihkb3VibGUqKWFkZHIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFRfU1RSSU5HOgorICAgICAgICBpZiAoKihjaGFyKiopYWRkciA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgICAgICB2ID0gUHlfTm9uZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICB2ID0gUHlTdHJpbmdfRnJvbVN0cmluZygqKGNoYXIqKilhZGRyKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUX1NUUklOR19JTlBMQUNFOgorICAgICAgICB2ID0gUHlTdHJpbmdfRnJvbVN0cmluZygoY2hhciopYWRkcik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVF9DSEFSOgorICAgICAgICB2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIqKWFkZHIsIDEpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFRfT0JKRUNUOgorICAgICAgICB2ID0gKihQeU9iamVjdCAqKilhZGRyOworICAgICAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICAgICAgdiA9IFB5X05vbmU7CisgICAgICAgIFB5X0lOQ1JFRih2KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUX09CSkVDVF9FWDoKKyAgICAgICAgdiA9ICooUHlPYmplY3QgKiopYWRkcjsKKyAgICAgICAgaWYgKHYgPT0gTlVMTCkKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19BdHRyaWJ1dGVFcnJvciwgbC0+bmFtZSk7CisgICAgICAgIFB5X1hJTkNSRUYodik7CisgICAgICAgIGJyZWFrOwogI2lmZGVmIEhBVkVfTE9OR19MT05HCi0JY2FzZSBUX0xPTkdMT05HOgotCQl2ID0gUHlMb25nX0Zyb21Mb25nTG9uZygqKFBZX0xPTkdfTE9ORyAqKWFkZHIpOwotCQlicmVhazsKLQljYXNlIFRfVUxPTkdMT05HOgotCQl2ID0gUHlMb25nX0Zyb21VbnNpZ25lZExvbmdMb25nKCoodW5zaWduZWQgUFlfTE9OR19MT05HICopYWRkcik7Ci0JCWJyZWFrOworICAgIGNhc2UgVF9MT05HTE9ORzoKKyAgICAgICAgdiA9IFB5TG9uZ19Gcm9tTG9uZ0xvbmcoKihQWV9MT05HX0xPTkcgKilhZGRyKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUX1VMT05HTE9ORzoKKyAgICAgICAgdiA9IFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nTG9uZygqKHVuc2lnbmVkIFBZX0xPTkdfTE9ORyAqKWFkZHIpOworICAgICAgICBicmVhazsKICNlbmRpZiAvKiBIQVZFX0xPTkdfTE9ORyAqLwotCWRlZmF1bHQ6Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwgImJhZCBtZW1iZXJkZXNjciB0eXBlIik7Ci0JCXYgPSBOVUxMOwotCX0KLQlyZXR1cm4gdjsKKyAgICBkZWZhdWx0OgorICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsICJiYWQgbWVtYmVyZGVzY3IgdHlwZSIpOworICAgICAgICB2ID0gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIHY7CiB9CiAKIGludAogUHlNZW1iZXJfU2V0KGNoYXIgKmFkZHIsIHN0cnVjdCBtZW1iZXJsaXN0ICptbGlzdCwgY29uc3QgY2hhciAqbmFtZSwgUHlPYmplY3QgKnYpCiB7Ci0Jc3RydWN0IG1lbWJlcmxpc3QgKmw7CisgICAgc3RydWN0IG1lbWJlcmxpc3QgKmw7CiAKLQlmb3IgKGwgPSBtbGlzdDsgbC0+bmFtZSAhPSBOVUxMOyBsKyspIHsKLQkJaWYgKHN0cmNtcChsLT5uYW1lLCBuYW1lKSA9PSAwKSB7Ci0JCQlQeU1lbWJlckRlZiBjb3B5OwotCQkJY29weS5uYW1lID0gbC0+bmFtZTsKLQkJCWNvcHkudHlwZSA9IGwtPnR5cGU7Ci0JCQljb3B5Lm9mZnNldCA9IGwtPm9mZnNldDsKLQkJCWNvcHkuZmxhZ3MgPSBsLT5mbGFnczsKLQkJCWNvcHkuZG9jID0gTlVMTDsKLQkJCXJldHVybiBQeU1lbWJlcl9TZXRPbmUoYWRkciwgJmNvcHksIHYpOwotCQl9Ci0JfQorICAgIGZvciAobCA9IG1saXN0OyBsLT5uYW1lICE9IE5VTEw7IGwrKykgeworICAgICAgICBpZiAoc3RyY21wKGwtPm5hbWUsIG5hbWUpID09IDApIHsKKyAgICAgICAgICAgIFB5TWVtYmVyRGVmIGNvcHk7CisgICAgICAgICAgICBjb3B5Lm5hbWUgPSBsLT5uYW1lOworICAgICAgICAgICAgY29weS50eXBlID0gbC0+dHlwZTsKKyAgICAgICAgICAgIGNvcHkub2Zmc2V0ID0gbC0+b2Zmc2V0OworICAgICAgICAgICAgY29weS5mbGFncyA9IGwtPmZsYWdzOworICAgICAgICAgICAgY29weS5kb2MgPSBOVUxMOworICAgICAgICAgICAgcmV0dXJuIFB5TWVtYmVyX1NldE9uZShhZGRyLCAmY29weSwgdik7CisgICAgICAgIH0KKyAgICB9CiAKLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfQXR0cmlidXRlRXJyb3IsIG5hbWUpOwotCXJldHVybiAtMTsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfQXR0cmlidXRlRXJyb3IsIG5hbWUpOworICAgIHJldHVybiAtMTsKIH0KIAotI2RlZmluZSBXQVJOKG1zZykJCQkJCVwKLSAgICBkbyB7CQkJCQkJXAotCWlmIChQeUVycl9XYXJuKFB5RXhjX1J1bnRpbWVXYXJuaW5nLCBtc2cpIDwgMCkJXAotCQlyZXR1cm4gLTE7CQkJCVwKKyNkZWZpbmUgV0FSTihtc2cpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKFB5RXJyX1dhcm4oUHlFeGNfUnVudGltZVdhcm5pbmcsIG1zZykgPCAwKSAgICAgIFwKKyAgICAgICAgcmV0dXJuIC0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIH0gd2hpbGUgKDApCiAKIGludAogUHlNZW1iZXJfU2V0T25lKGNoYXIgKmFkZHIsIFB5TWVtYmVyRGVmICpsLCBQeU9iamVjdCAqdikKIHsKLQlQeU9iamVjdCAqb2xkdjsKKyAgICBQeU9iamVjdCAqb2xkdjsKIAotCWFkZHIgKz0gbC0+b2Zmc2V0OworICAgIGFkZHIgKz0gbC0+b2Zmc2V0OwogCi0JaWYgKChsLT5mbGFncyAmIFJFQURPTkxZKSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJyZWFkb25seSBhdHRyaWJ1dGUiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoKGwtPmZsYWdzICYgUFlfV1JJVEVfUkVTVFJJQ1RFRCkgJiYgUHlFdmFsX0dldFJlc3RyaWN0ZWQoKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAicmVzdHJpY3RlZCBhdHRyaWJ1dGUiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAodiA9PSBOVUxMKSB7Ci0JCWlmIChsLT50eXBlID09IFRfT0JKRUNUX0VYKSB7Ci0JCQkvKiBDaGVjayBpZiB0aGUgYXR0cmlidXRlIGlzIHNldC4gKi8KLQkJCWlmICgqKFB5T2JqZWN0ICoqKWFkZHIgPT0gTlVMTCkgewotCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19BdHRyaWJ1dGVFcnJvciwgbC0+bmFtZSk7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKGwtPnR5cGUgIT0gVF9PQkpFQ1QpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJCSJjYW4ndCBkZWxldGUgbnVtZXJpYy9jaGFyIGF0dHJpYnV0ZSIpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQotCXN3aXRjaCAobC0+dHlwZSkgewotCWNhc2UgVF9CT09MOnsKLQkJaWYgKCFQeUJvb2xfQ2hlY2sodikpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJCSJhdHRyaWJ1dGUgdmFsdWUgdHlwZSBtdXN0IGJlIGJvb2wiKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlpZiAodiA9PSBQeV9UcnVlKQotCQkJKihjaGFyKilhZGRyID0gKGNoYXIpIDE7Ci0JCWVsc2UKLQkJCSooY2hhciopYWRkciA9IChjaGFyKSAwOwotCQlicmVhazsKLQkJfQotCWNhc2UgVF9CWVRFOnsKLQkJbG9uZyBsb25nX3ZhbCA9IFB5SW50X0FzTG9uZyh2KTsKLQkJaWYgKChsb25nX3ZhbCA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJCXJldHVybiAtMTsKLQkJKihjaGFyKilhZGRyID0gKGNoYXIpbG9uZ192YWw7Ci0JCS8qIFhYWDogRm9yIGNvbXBhdGliaWxpdHksIG9ubHkgd2FybiBhYm91dCB0cnVuY2F0aW9ucwotCQkgICBmb3Igbm93LiAqLwotCQlpZiAoKGxvbmdfdmFsID4gQ0hBUl9NQVgpIHx8IChsb25nX3ZhbCA8IENIQVJfTUlOKSkKLQkJCVdBUk4oIlRydW5jYXRpb24gb2YgdmFsdWUgdG8gY2hhciIpOwotCQlicmVhazsKLQkJfQotCWNhc2UgVF9VQllURTp7Ci0JCWxvbmcgbG9uZ192YWwgPSBQeUludF9Bc0xvbmcodik7Ci0JCWlmICgobG9uZ192YWwgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCQlyZXR1cm4gLTE7Ci0JCSoodW5zaWduZWQgY2hhciopYWRkciA9ICh1bnNpZ25lZCBjaGFyKWxvbmdfdmFsOwotCQlpZiAoKGxvbmdfdmFsID4gVUNIQVJfTUFYKSB8fCAobG9uZ192YWwgPCAwKSkKLQkJCVdBUk4oIlRydW5jYXRpb24gb2YgdmFsdWUgdG8gdW5zaWduZWQgY2hhciIpOwotCQlicmVhazsKLQkJfQotCWNhc2UgVF9TSE9SVDp7Ci0JCWxvbmcgbG9uZ192YWwgPSBQeUludF9Bc0xvbmcodik7Ci0JCWlmICgobG9uZ192YWwgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCQlyZXR1cm4gLTE7Ci0JCSooc2hvcnQqKWFkZHIgPSAoc2hvcnQpbG9uZ192YWw7Ci0JCWlmICgobG9uZ192YWwgPiBTSFJUX01BWCkgfHwgKGxvbmdfdmFsIDwgU0hSVF9NSU4pKQotCQkJV0FSTigiVHJ1bmNhdGlvbiBvZiB2YWx1ZSB0byBzaG9ydCIpOwotCQlicmVhazsKLQkJfQotCWNhc2UgVF9VU0hPUlQ6ewotCQlsb25nIGxvbmdfdmFsID0gUHlJbnRfQXNMb25nKHYpOwotCQlpZiAoKGxvbmdfdmFsID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIC0xOwotCQkqKHVuc2lnbmVkIHNob3J0KilhZGRyID0gKHVuc2lnbmVkIHNob3J0KWxvbmdfdmFsOwotCQlpZiAoKGxvbmdfdmFsID4gVVNIUlRfTUFYKSB8fCAobG9uZ192YWwgPCAwKSkKLQkJCVdBUk4oIlRydW5jYXRpb24gb2YgdmFsdWUgdG8gdW5zaWduZWQgc2hvcnQiKTsKLQkJYnJlYWs7Ci0JCX0KLSAgCWNhc2UgVF9JTlQ6ewotCQlsb25nIGxvbmdfdmFsID0gUHlJbnRfQXNMb25nKHYpOwotCQlpZiAoKGxvbmdfdmFsID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIC0xOwotCQkqKGludCAqKWFkZHIgPSAoaW50KWxvbmdfdmFsOwotCQlpZiAoKGxvbmdfdmFsID4gSU5UX01BWCkgfHwgKGxvbmdfdmFsIDwgSU5UX01JTikpCi0JCQlXQVJOKCJUcnVuY2F0aW9uIG9mIHZhbHVlIHRvIGludCIpOwotCQlicmVhazsKLQkJfQotCWNhc2UgVF9VSU5UOnsKLQkJdW5zaWduZWQgbG9uZyB1bG9uZ192YWwgPSBQeUxvbmdfQXNVbnNpZ25lZExvbmcodik7Ci0JCWlmICgodWxvbmdfdmFsID09ICh1bnNpZ25lZCBpbnQpLTEpICYmIFB5RXJyX09jY3VycmVkKCkpIHsKLQkJCS8qIFhYWDogRm9yIGNvbXBhdGliaWxpdHksIGFjY2VwdCBuZWdhdGl2ZSBpbnQgdmFsdWVzCi0JCQkgICBhcyB3ZWxsLiAqLwotCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCXVsb25nX3ZhbCA9IFB5TG9uZ19Bc0xvbmcodik7Ci0JCQlpZiAoKHVsb25nX3ZhbCA9PSAodW5zaWduZWQgaW50KS0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJCXJldHVybiAtMTsKLQkJCSoodW5zaWduZWQgaW50ICopYWRkciA9ICh1bnNpZ25lZCBpbnQpdWxvbmdfdmFsOwotCQkJV0FSTigiV3JpdGluZyBuZWdhdGl2ZSB2YWx1ZSBpbnRvIHVuc2lnbmVkIGZpZWxkIik7Ci0JCX0gZWxzZQotCQkJKih1bnNpZ25lZCBpbnQgKilhZGRyID0gKHVuc2lnbmVkIGludCl1bG9uZ192YWw7Ci0JCWlmICh1bG9uZ192YWwgPiBVSU5UX01BWCkKLQkJCVdBUk4oIlRydW5jYXRpb24gb2YgdmFsdWUgdG8gdW5zaWduZWQgaW50Iik7Ci0JCWJyZWFrOwotCQl9Ci0JY2FzZSBUX0xPTkc6ewotCQkqKGxvbmcqKWFkZHIgPSBQeUxvbmdfQXNMb25nKHYpOwotCQlpZiAoKCoobG9uZyopYWRkciA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJCXJldHVybiAtMTsKLQkJYnJlYWs7Ci0JCX0KLQljYXNlIFRfVUxPTkc6ewotCQkqKHVuc2lnbmVkIGxvbmcqKWFkZHIgPSBQeUxvbmdfQXNVbnNpZ25lZExvbmcodik7Ci0JCWlmICgoKih1bnNpZ25lZCBsb25nKilhZGRyID09ICh1bnNpZ25lZCBsb25nKS0xKQotCQkgICAgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewotCQkJLyogWFhYOiBGb3IgY29tcGF0aWJpbGl0eSwgYWNjZXB0IG5lZ2F0aXZlIGludCB2YWx1ZXMKLQkJCSAgIGFzIHdlbGwuICovCi0JCQlQeUVycl9DbGVhcigpOwotCQkJKih1bnNpZ25lZCBsb25nKilhZGRyID0gUHlMb25nX0FzTG9uZyh2KTsKLQkJCWlmICgoKih1bnNpZ25lZCBsb25nKilhZGRyID09ICh1bnNpZ25lZCBpbnQpLTEpCi0JCQkgICAgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJCQlyZXR1cm4gLTE7Ci0JCQlXQVJOKCJXcml0aW5nIG5lZ2F0aXZlIHZhbHVlIGludG8gdW5zaWduZWQgZmllbGQiKTsKLQkJfQotCQlicmVhazsKLQkJfQotCWNhc2UgVF9QWVNTSVpFVDp7Ci0JCSooUHlfc3NpemVfdCopYWRkciA9IFB5SW50X0FzU3NpemVfdCh2KTsKLQkJaWYgKCgqKFB5X3NzaXplX3QqKWFkZHIgPT0gKFB5X3NzaXplX3QpLTEpCi0JCSAgICAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJCXJldHVybiAtMTsKLQkJYnJlYWs7Ci0JCX0KLQljYXNlIFRfRkxPQVQ6ewotCQlkb3VibGUgZG91YmxlX3ZhbCA9IFB5RmxvYXRfQXNEb3VibGUodik7Ci0JCWlmICgoZG91YmxlX3ZhbCA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJCXJldHVybiAtMTsKLQkJKihmbG9hdCopYWRkciA9IChmbG9hdClkb3VibGVfdmFsOwotCQlicmVhazsKLQkJfQotCWNhc2UgVF9ET1VCTEU6Ci0JCSooZG91YmxlKilhZGRyID0gUHlGbG9hdF9Bc0RvdWJsZSh2KTsKLQkJaWYgKCgqKGRvdWJsZSopYWRkciA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJCXJldHVybiAtMTsKLQkJYnJlYWs7Ci0JY2FzZSBUX09CSkVDVDoKLQljYXNlIFRfT0JKRUNUX0VYOgotCQlQeV9YSU5DUkVGKHYpOwotCQlvbGR2ID0gKihQeU9iamVjdCAqKilhZGRyOwotCQkqKFB5T2JqZWN0ICoqKWFkZHIgPSB2OwotCQlQeV9YREVDUkVGKG9sZHYpOwotCQlicmVhazsKLQljYXNlIFRfQ0hBUjoKLQkJaWYgKFB5U3RyaW5nX0NoZWNrKHYpICYmIFB5U3RyaW5nX1NpemUodikgPT0gMSkgewotCQkJKihjaGFyKilhZGRyID0gUHlTdHJpbmdfQXNTdHJpbmcodilbMF07Ci0JCX0KLQkJZWxzZSB7Ci0JCQlQeUVycl9CYWRBcmd1bWVudCgpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgVF9TVFJJTkc6Ci0JY2FzZSBUX1NUUklOR19JTlBMQUNFOgotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAicmVhZG9ubHkgYXR0cmlidXRlIik7Ci0JCXJldHVybiAtMTsKKyAgICBpZiAoKGwtPmZsYWdzICYgUkVBRE9OTFkpKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgInJlYWRvbmx5IGF0dHJpYnV0ZSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICgobC0+ZmxhZ3MgJiBQWV9XUklURV9SRVNUUklDVEVEKSAmJiBQeUV2YWxfR2V0UmVzdHJpY3RlZCgpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJyZXN0cmljdGVkIGF0dHJpYnV0ZSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICh2ID09IE5VTEwpIHsKKyAgICAgICAgaWYgKGwtPnR5cGUgPT0gVF9PQkpFQ1RfRVgpIHsKKyAgICAgICAgICAgIC8qIENoZWNrIGlmIHRoZSBhdHRyaWJ1dGUgaXMgc2V0LiAqLworICAgICAgICAgICAgaWYgKCooUHlPYmplY3QgKiopYWRkciA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0F0dHJpYnV0ZUVycm9yLCBsLT5uYW1lKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAobC0+dHlwZSAhPSBUX09CSkVDVCkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2FuJ3QgZGVsZXRlIG51bWVyaWMvY2hhciBhdHRyaWJ1dGUiKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBzd2l0Y2ggKGwtPnR5cGUpIHsKKyAgICBjYXNlIFRfQk9PTDp7CisgICAgICAgIGlmICghUHlCb29sX0NoZWNrKHYpKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhdHRyaWJ1dGUgdmFsdWUgdHlwZSBtdXN0IGJlIGJvb2wiKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBpZiAodiA9PSBQeV9UcnVlKQorICAgICAgICAgICAgKihjaGFyKilhZGRyID0gKGNoYXIpIDE7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICooY2hhciopYWRkciA9IChjaGFyKSAwOworICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIGNhc2UgVF9CWVRFOnsKKyAgICAgICAgbG9uZyBsb25nX3ZhbCA9IFB5SW50X0FzTG9uZyh2KTsKKyAgICAgICAgaWYgKChsb25nX3ZhbCA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgKihjaGFyKilhZGRyID0gKGNoYXIpbG9uZ192YWw7CisgICAgICAgIC8qIFhYWDogRm9yIGNvbXBhdGliaWxpdHksIG9ubHkgd2FybiBhYm91dCB0cnVuY2F0aW9ucworICAgICAgICAgICBmb3Igbm93LiAqLworICAgICAgICBpZiAoKGxvbmdfdmFsID4gQ0hBUl9NQVgpIHx8IChsb25nX3ZhbCA8IENIQVJfTUlOKSkKKyAgICAgICAgICAgIFdBUk4oIlRydW5jYXRpb24gb2YgdmFsdWUgdG8gY2hhciIpOworICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIGNhc2UgVF9VQllURTp7CisgICAgICAgIGxvbmcgbG9uZ192YWwgPSBQeUludF9Bc0xvbmcodik7CisgICAgICAgIGlmICgobG9uZ192YWwgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICoodW5zaWduZWQgY2hhciopYWRkciA9ICh1bnNpZ25lZCBjaGFyKWxvbmdfdmFsOworICAgICAgICBpZiAoKGxvbmdfdmFsID4gVUNIQVJfTUFYKSB8fCAobG9uZ192YWwgPCAwKSkKKyAgICAgICAgICAgIFdBUk4oIlRydW5jYXRpb24gb2YgdmFsdWUgdG8gdW5zaWduZWQgY2hhciIpOworICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIGNhc2UgVF9TSE9SVDp7CisgICAgICAgIGxvbmcgbG9uZ192YWwgPSBQeUludF9Bc0xvbmcodik7CisgICAgICAgIGlmICgobG9uZ192YWwgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICooc2hvcnQqKWFkZHIgPSAoc2hvcnQpbG9uZ192YWw7CisgICAgICAgIGlmICgobG9uZ192YWwgPiBTSFJUX01BWCkgfHwgKGxvbmdfdmFsIDwgU0hSVF9NSU4pKQorICAgICAgICAgICAgV0FSTigiVHJ1bmNhdGlvbiBvZiB2YWx1ZSB0byBzaG9ydCIpOworICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIGNhc2UgVF9VU0hPUlQ6eworICAgICAgICBsb25nIGxvbmdfdmFsID0gUHlJbnRfQXNMb25nKHYpOworICAgICAgICBpZiAoKGxvbmdfdmFsID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAqKHVuc2lnbmVkIHNob3J0KilhZGRyID0gKHVuc2lnbmVkIHNob3J0KWxvbmdfdmFsOworICAgICAgICBpZiAoKGxvbmdfdmFsID4gVVNIUlRfTUFYKSB8fCAobG9uZ192YWwgPCAwKSkKKyAgICAgICAgICAgIFdBUk4oIlRydW5jYXRpb24gb2YgdmFsdWUgdG8gdW5zaWduZWQgc2hvcnQiKTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICBjYXNlIFRfSU5UOnsKKyAgICAgICAgbG9uZyBsb25nX3ZhbCA9IFB5SW50X0FzTG9uZyh2KTsKKyAgICAgICAgaWYgKChsb25nX3ZhbCA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgKihpbnQgKilhZGRyID0gKGludClsb25nX3ZhbDsKKyAgICAgICAgaWYgKChsb25nX3ZhbCA+IElOVF9NQVgpIHx8IChsb25nX3ZhbCA8IElOVF9NSU4pKQorICAgICAgICAgICAgV0FSTigiVHJ1bmNhdGlvbiBvZiB2YWx1ZSB0byBpbnQiKTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICBjYXNlIFRfVUlOVDp7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgdWxvbmdfdmFsID0gUHlMb25nX0FzVW5zaWduZWRMb25nKHYpOworICAgICAgICBpZiAoKHVsb25nX3ZhbCA9PSAodW5zaWduZWQgaW50KS0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgICAgICAvKiBYWFg6IEZvciBjb21wYXRpYmlsaXR5LCBhY2NlcHQgbmVnYXRpdmUgaW50IHZhbHVlcworICAgICAgICAgICAgICAgYXMgd2VsbC4gKi8KKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICB1bG9uZ192YWwgPSBQeUxvbmdfQXNMb25nKHYpOworICAgICAgICAgICAgaWYgKCh1bG9uZ192YWwgPT0gKHVuc2lnbmVkIGludCktMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAqKHVuc2lnbmVkIGludCAqKWFkZHIgPSAodW5zaWduZWQgaW50KXVsb25nX3ZhbDsKKyAgICAgICAgICAgIFdBUk4oIldyaXRpbmcgbmVnYXRpdmUgdmFsdWUgaW50byB1bnNpZ25lZCBmaWVsZCIpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICoodW5zaWduZWQgaW50ICopYWRkciA9ICh1bnNpZ25lZCBpbnQpdWxvbmdfdmFsOworICAgICAgICBpZiAodWxvbmdfdmFsID4gVUlOVF9NQVgpCisgICAgICAgICAgICBXQVJOKCJUcnVuY2F0aW9uIG9mIHZhbHVlIHRvIHVuc2lnbmVkIGludCIpOworICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIGNhc2UgVF9MT05HOnsKKyAgICAgICAgKihsb25nKilhZGRyID0gUHlMb25nX0FzTG9uZyh2KTsKKyAgICAgICAgaWYgKCgqKGxvbmcqKWFkZHIgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgY2FzZSBUX1VMT05HOnsKKyAgICAgICAgKih1bnNpZ25lZCBsb25nKilhZGRyID0gUHlMb25nX0FzVW5zaWduZWRMb25nKHYpOworICAgICAgICBpZiAoKCoodW5zaWduZWQgbG9uZyopYWRkciA9PSAodW5zaWduZWQgbG9uZyktMSkKKyAgICAgICAgICAgICYmIFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgICAgIC8qIFhYWDogRm9yIGNvbXBhdGliaWxpdHksIGFjY2VwdCBuZWdhdGl2ZSBpbnQgdmFsdWVzCisgICAgICAgICAgICAgICBhcyB3ZWxsLiAqLworICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgICoodW5zaWduZWQgbG9uZyopYWRkciA9IFB5TG9uZ19Bc0xvbmcodik7CisgICAgICAgICAgICBpZiAoKCoodW5zaWduZWQgbG9uZyopYWRkciA9PSAodW5zaWduZWQgaW50KS0xKQorICAgICAgICAgICAgICAgICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgV0FSTigiV3JpdGluZyBuZWdhdGl2ZSB2YWx1ZSBpbnRvIHVuc2lnbmVkIGZpZWxkIik7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICBjYXNlIFRfUFlTU0laRVQ6eworICAgICAgICAqKFB5X3NzaXplX3QqKWFkZHIgPSBQeUludF9Bc1NzaXplX3Qodik7CisgICAgICAgIGlmICgoKihQeV9zc2l6ZV90KilhZGRyID09IChQeV9zc2l6ZV90KS0xKQorICAgICAgICAgICAgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICBjYXNlIFRfRkxPQVQ6eworICAgICAgICBkb3VibGUgZG91YmxlX3ZhbCA9IFB5RmxvYXRfQXNEb3VibGUodik7CisgICAgICAgIGlmICgoZG91YmxlX3ZhbCA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgKihmbG9hdCopYWRkciA9IChmbG9hdClkb3VibGVfdmFsOworICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIGNhc2UgVF9ET1VCTEU6CisgICAgICAgICooZG91YmxlKilhZGRyID0gUHlGbG9hdF9Bc0RvdWJsZSh2KTsKKyAgICAgICAgaWYgKCgqKGRvdWJsZSopYWRkciA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUX09CSkVDVDoKKyAgICBjYXNlIFRfT0JKRUNUX0VYOgorICAgICAgICBQeV9YSU5DUkVGKHYpOworICAgICAgICBvbGR2ID0gKihQeU9iamVjdCAqKilhZGRyOworICAgICAgICAqKFB5T2JqZWN0ICoqKWFkZHIgPSB2OworICAgICAgICBQeV9YREVDUkVGKG9sZHYpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFRfQ0hBUjoKKyAgICAgICAgaWYgKFB5U3RyaW5nX0NoZWNrKHYpICYmIFB5U3RyaW5nX1NpemUodikgPT0gMSkgeworICAgICAgICAgICAgKihjaGFyKilhZGRyID0gUHlTdHJpbmdfQXNTdHJpbmcodilbMF07CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBQeUVycl9CYWRBcmd1bWVudCgpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVF9TVFJJTkc6CisgICAgY2FzZSBUX1NUUklOR19JTlBMQUNFOgorICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAicmVhZG9ubHkgYXR0cmlidXRlIik7CisgICAgICAgIHJldHVybiAtMTsKICNpZmRlZiBIQVZFX0xPTkdfTE9ORwotCWNhc2UgVF9MT05HTE9ORzp7Ci0JCVBZX0xPTkdfTE9ORyB2YWx1ZTsKLQkJKihQWV9MT05HX0xPTkcqKWFkZHIgPSB2YWx1ZSA9IFB5TG9uZ19Bc0xvbmdMb25nKHYpOwotCQlpZiAoKHZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIC0xOwotCQlicmVhazsKLQkJfQotCWNhc2UgVF9VTE9OR0xPTkc6ewotCQl1bnNpZ25lZCBQWV9MT05HX0xPTkcgdmFsdWU7Ci0JCS8qID8/PyBQeUxvbmdfQXNMb25nTG9uZyBhY2NlcHRzIGFuIGludCwgYnV0IFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ0xvbmcKLQkJCWRvZXNuJ3QgPz8/ICovCi0JCWlmIChQeUxvbmdfQ2hlY2sodikpCi0JCQkqKHVuc2lnbmVkIFBZX0xPTkdfTE9ORyopYWRkciA9IHZhbHVlID0gUHlMb25nX0FzVW5zaWduZWRMb25nTG9uZyh2KTsKLQkJZWxzZQotCQkJKih1bnNpZ25lZCBQWV9MT05HX0xPTkcqKWFkZHIgPSB2YWx1ZSA9IFB5SW50X0FzTG9uZyh2KTsKLQkJaWYgKCh2YWx1ZSA9PSAodW5zaWduZWQgUFlfTE9OR19MT05HKS0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIC0xOwotCQlicmVhazsKLQkJfQorICAgIGNhc2UgVF9MT05HTE9ORzp7CisgICAgICAgIFBZX0xPTkdfTE9ORyB2YWx1ZTsKKyAgICAgICAgKihQWV9MT05HX0xPTkcqKWFkZHIgPSB2YWx1ZSA9IFB5TG9uZ19Bc0xvbmdMb25nKHYpOworICAgICAgICBpZiAoKHZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIGNhc2UgVF9VTE9OR0xPTkc6eworICAgICAgICB1bnNpZ25lZCBQWV9MT05HX0xPTkcgdmFsdWU7CisgICAgICAgIC8qID8/PyBQeUxvbmdfQXNMb25nTG9uZyBhY2NlcHRzIGFuIGludCwgYnV0IFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ0xvbmcKKyAgICAgICAgICAgIGRvZXNuJ3QgPz8/ICovCisgICAgICAgIGlmIChQeUxvbmdfQ2hlY2sodikpCisgICAgICAgICAgICAqKHVuc2lnbmVkIFBZX0xPTkdfTE9ORyopYWRkciA9IHZhbHVlID0gUHlMb25nX0FzVW5zaWduZWRMb25nTG9uZyh2KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgKih1bnNpZ25lZCBQWV9MT05HX0xPTkcqKWFkZHIgPSB2YWx1ZSA9IFB5SW50X0FzTG9uZyh2KTsKKyAgICAgICAgaWYgKCh2YWx1ZSA9PSAodW5zaWduZWQgUFlfTE9OR19MT05HKS0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBicmVhazsKKyAgICAgICAgfQogI2VuZGlmIC8qIEhBVkVfTE9OR19MT05HICovCi0JZGVmYXVsdDoKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1N5c3RlbUVycm9yLAotCQkJICAgICAiYmFkIG1lbWJlcmRlc2NyIHR5cGUgZm9yICVzIiwgbC0+bmFtZSk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JcmV0dXJuIDA7CisgICAgZGVmYXVsdDoKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgImJhZCBtZW1iZXJkZXNjciB0eXBlIGZvciAlcyIsIGwtPm5hbWUpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvUHl0aG9uL3N5bXRhYmxlLmMgYi9QeXRob24vc3ltdGFibGUuYwppbmRleCBmM2JhMDg4Li5mMzBiYTBmIDEwMDY0NAotLS0gYS9QeXRob24vc3ltdGFibGUuYworKysgYi9QeXRob24vc3ltdGFibGUuYwpAQCAtMTksMTUxICsxOSwxNTEgQEAKIAogc3RhdGljIFB5U1RFbnRyeU9iamVjdCAqCiBzdGVfbmV3KHN0cnVjdCBzeW10YWJsZSAqc3QsIGlkZW50aWZpZXIgbmFtZSwgX1B5X2Jsb2NrX3R5IGJsb2NrLAotCSAgICAgIHZvaWQgKmtleSwgaW50IGxpbmVubykKKyAgICAgICAgICAgICAgdm9pZCAqa2V5LCBpbnQgbGluZW5vKQogewotCVB5U1RFbnRyeU9iamVjdCAqc3RlID0gTlVMTDsKLQlQeU9iamVjdCAqazsKKyAgICBQeVNURW50cnlPYmplY3QgKnN0ZSA9IE5VTEw7CisgICAgUHlPYmplY3QgKms7CiAKLQlrID0gUHlMb25nX0Zyb21Wb2lkUHRyKGtleSk7Ci0JaWYgKGsgPT0gTlVMTCkKLQkJZ290byBmYWlsOwotCXN0ZSA9IFB5T2JqZWN0X05ldyhQeVNURW50cnlPYmplY3QsICZQeVNURW50cnlfVHlwZSk7Ci0JaWYgKHN0ZSA9PSBOVUxMKQotCQlnb3RvIGZhaWw7Ci0Jc3RlLT5zdGVfdGFibGUgPSBzdDsKLQlzdGUtPnN0ZV9pZCA9IGs7Ci0Jc3RlLT5zdGVfdG1wbmFtZSA9IDA7CisgICAgayA9IFB5TG9uZ19Gcm9tVm9pZFB0cihrZXkpOworICAgIGlmIChrID09IE5VTEwpCisgICAgICAgIGdvdG8gZmFpbDsKKyAgICBzdGUgPSBQeU9iamVjdF9OZXcoUHlTVEVudHJ5T2JqZWN0LCAmUHlTVEVudHJ5X1R5cGUpOworICAgIGlmIChzdGUgPT0gTlVMTCkKKyAgICAgICAgZ290byBmYWlsOworICAgIHN0ZS0+c3RlX3RhYmxlID0gc3Q7CisgICAgc3RlLT5zdGVfaWQgPSBrOworICAgIHN0ZS0+c3RlX3RtcG5hbWUgPSAwOwogCi0Jc3RlLT5zdGVfbmFtZSA9IG5hbWU7Ci0JUHlfSU5DUkVGKG5hbWUpOworICAgIHN0ZS0+c3RlX25hbWUgPSBuYW1lOworICAgIFB5X0lOQ1JFRihuYW1lKTsKIAotCXN0ZS0+c3RlX3N5bWJvbHMgPSBOVUxMOwotCXN0ZS0+c3RlX3Zhcm5hbWVzID0gTlVMTDsKLQlzdGUtPnN0ZV9jaGlsZHJlbiA9IE5VTEw7CisgICAgc3RlLT5zdGVfc3ltYm9scyA9IE5VTEw7CisgICAgc3RlLT5zdGVfdmFybmFtZXMgPSBOVUxMOworICAgIHN0ZS0+c3RlX2NoaWxkcmVuID0gTlVMTDsKIAotCXN0ZS0+c3RlX3N5bWJvbHMgPSBQeURpY3RfTmV3KCk7Ci0JaWYgKHN0ZS0+c3RlX3N5bWJvbHMgPT0gTlVMTCkKLQkgICAgZ290byBmYWlsOworICAgIHN0ZS0+c3RlX3N5bWJvbHMgPSBQeURpY3RfTmV3KCk7CisgICAgaWYgKHN0ZS0+c3RlX3N5bWJvbHMgPT0gTlVMTCkKKyAgICAgICAgZ290byBmYWlsOwogCi0Jc3RlLT5zdGVfdmFybmFtZXMgPSBQeUxpc3RfTmV3KDApOwotCWlmIChzdGUtPnN0ZV92YXJuYW1lcyA9PSBOVUxMKQotCSAgICBnb3RvIGZhaWw7CisgICAgc3RlLT5zdGVfdmFybmFtZXMgPSBQeUxpc3RfTmV3KDApOworICAgIGlmIChzdGUtPnN0ZV92YXJuYW1lcyA9PSBOVUxMKQorICAgICAgICBnb3RvIGZhaWw7CiAKLQlzdGUtPnN0ZV9jaGlsZHJlbiA9IFB5TGlzdF9OZXcoMCk7Ci0JaWYgKHN0ZS0+c3RlX2NoaWxkcmVuID09IE5VTEwpCi0JICAgIGdvdG8gZmFpbDsKKyAgICBzdGUtPnN0ZV9jaGlsZHJlbiA9IFB5TGlzdF9OZXcoMCk7CisgICAgaWYgKHN0ZS0+c3RlX2NoaWxkcmVuID09IE5VTEwpCisgICAgICAgIGdvdG8gZmFpbDsKIAotCXN0ZS0+c3RlX3R5cGUgPSBibG9jazsKLQlzdGUtPnN0ZV91bm9wdGltaXplZCA9IDA7Ci0Jc3RlLT5zdGVfbmVzdGVkID0gMDsKLQlzdGUtPnN0ZV9mcmVlID0gMDsKLQlzdGUtPnN0ZV92YXJhcmdzID0gMDsKLQlzdGUtPnN0ZV92YXJrZXl3b3JkcyA9IDA7Ci0Jc3RlLT5zdGVfb3B0X2xpbmVubyA9IDA7Ci0Jc3RlLT5zdGVfdG1wbmFtZSA9IDA7Ci0Jc3RlLT5zdGVfbGluZW5vID0gbGluZW5vOworICAgIHN0ZS0+c3RlX3R5cGUgPSBibG9jazsKKyAgICBzdGUtPnN0ZV91bm9wdGltaXplZCA9IDA7CisgICAgc3RlLT5zdGVfbmVzdGVkID0gMDsKKyAgICBzdGUtPnN0ZV9mcmVlID0gMDsKKyAgICBzdGUtPnN0ZV92YXJhcmdzID0gMDsKKyAgICBzdGUtPnN0ZV92YXJrZXl3b3JkcyA9IDA7CisgICAgc3RlLT5zdGVfb3B0X2xpbmVubyA9IDA7CisgICAgc3RlLT5zdGVfdG1wbmFtZSA9IDA7CisgICAgc3RlLT5zdGVfbGluZW5vID0gbGluZW5vOwogCi0JaWYgKHN0LT5zdF9jdXIgIT0gTlVMTCAmJgotCSAgICAoc3QtPnN0X2N1ci0+c3RlX25lc3RlZCB8fAotCSAgICAgc3QtPnN0X2N1ci0+c3RlX3R5cGUgPT0gRnVuY3Rpb25CbG9jaykpCi0JCXN0ZS0+c3RlX25lc3RlZCA9IDE7Ci0Jc3RlLT5zdGVfY2hpbGRfZnJlZSA9IDA7Ci0Jc3RlLT5zdGVfZ2VuZXJhdG9yID0gMDsKLQlzdGUtPnN0ZV9yZXR1cm5zX3ZhbHVlID0gMDsKKyAgICBpZiAoc3QtPnN0X2N1ciAhPSBOVUxMICYmCisgICAgICAgIChzdC0+c3RfY3VyLT5zdGVfbmVzdGVkIHx8CisgICAgICAgICBzdC0+c3RfY3VyLT5zdGVfdHlwZSA9PSBGdW5jdGlvbkJsb2NrKSkKKyAgICAgICAgc3RlLT5zdGVfbmVzdGVkID0gMTsKKyAgICBzdGUtPnN0ZV9jaGlsZF9mcmVlID0gMDsKKyAgICBzdGUtPnN0ZV9nZW5lcmF0b3IgPSAwOworICAgIHN0ZS0+c3RlX3JldHVybnNfdmFsdWUgPSAwOwogCi0JaWYgKFB5RGljdF9TZXRJdGVtKHN0LT5zdF9zeW1ib2xzLCBzdGUtPnN0ZV9pZCwgKFB5T2JqZWN0ICopc3RlKSA8IDApCi0JICAgIGdvdG8gZmFpbDsKLQkKLQlyZXR1cm4gc3RlOworICAgIGlmIChQeURpY3RfU2V0SXRlbShzdC0+c3Rfc3ltYm9scywgc3RlLT5zdGVfaWQsIChQeU9iamVjdCAqKXN0ZSkgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICByZXR1cm4gc3RlOwogIGZhaWw6Ci0JUHlfWERFQ1JFRihzdGUpOwotCXJldHVybiBOVUxMOworICAgIFB5X1hERUNSRUYoc3RlKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHN0ZV9yZXByKFB5U1RFbnRyeU9iamVjdCAqc3RlKQogewotCWNoYXIgYnVmWzI1Nl07CisgICAgY2hhciBidWZbMjU2XTsKIAotCVB5T1Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwKLQkJICAgICAgIjxzeW10YWJsZSBlbnRyeSAlLjEwMHMoJWxkKSwgbGluZSAlZD4iLAotCQkgICAgICBQeVN0cmluZ19BU19TVFJJTkcoc3RlLT5zdGVfbmFtZSksCi0JCSAgICAgIFB5SW50X0FTX0xPTkcoc3RlLT5zdGVfaWQpLCBzdGUtPnN0ZV9saW5lbm8pOwotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CisgICAgUHlPU19zbnByaW50ZihidWYsIHNpemVvZihidWYpLAorICAgICAgICAgICAgICAgICAgIjxzeW10YWJsZSBlbnRyeSAlLjEwMHMoJWxkKSwgbGluZSAlZD4iLAorICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKHN0ZS0+c3RlX25hbWUpLAorICAgICAgICAgICAgICAgICAgUHlJbnRfQVNfTE9ORyhzdGUtPnN0ZV9pZCksIHN0ZS0+c3RlX2xpbmVubyk7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmKTsKIH0KIAogc3RhdGljIHZvaWQKIHN0ZV9kZWFsbG9jKFB5U1RFbnRyeU9iamVjdCAqc3RlKQogewotCXN0ZS0+c3RlX3RhYmxlID0gTlVMTDsKLQlQeV9YREVDUkVGKHN0ZS0+c3RlX2lkKTsKLQlQeV9YREVDUkVGKHN0ZS0+c3RlX25hbWUpOwotCVB5X1hERUNSRUYoc3RlLT5zdGVfc3ltYm9scyk7Ci0JUHlfWERFQ1JFRihzdGUtPnN0ZV92YXJuYW1lcyk7Ci0JUHlfWERFQ1JFRihzdGUtPnN0ZV9jaGlsZHJlbik7Ci0JUHlPYmplY3RfRGVsKHN0ZSk7CisgICAgc3RlLT5zdGVfdGFibGUgPSBOVUxMOworICAgIFB5X1hERUNSRUYoc3RlLT5zdGVfaWQpOworICAgIFB5X1hERUNSRUYoc3RlLT5zdGVfbmFtZSk7CisgICAgUHlfWERFQ1JFRihzdGUtPnN0ZV9zeW1ib2xzKTsKKyAgICBQeV9YREVDUkVGKHN0ZS0+c3RlX3Zhcm5hbWVzKTsKKyAgICBQeV9YREVDUkVGKHN0ZS0+c3RlX2NoaWxkcmVuKTsKKyAgICBQeU9iamVjdF9EZWwoc3RlKTsKIH0KIAogI2RlZmluZSBPRkYoeCkgb2Zmc2V0b2YoUHlTVEVudHJ5T2JqZWN0LCB4KQogCiBzdGF0aWMgUHlNZW1iZXJEZWYgc3RlX21lbWJlcmxpc3RbXSA9IHsKLQl7ImlkIiwgICAgICAgVF9PQkpFQ1QsIE9GRihzdGVfaWQpLCBSRUFET05MWX0sCi0JeyJuYW1lIiwgICAgIFRfT0JKRUNULCBPRkYoc3RlX25hbWUpLCBSRUFET05MWX0sCi0JeyJzeW1ib2xzIiwgIFRfT0JKRUNULCBPRkYoc3RlX3N5bWJvbHMpLCBSRUFET05MWX0sCi0JeyJ2YXJuYW1lcyIsIFRfT0JKRUNULCBPRkYoc3RlX3Zhcm5hbWVzKSwgUkVBRE9OTFl9LAotCXsiY2hpbGRyZW4iLCBUX09CSkVDVCwgT0ZGKHN0ZV9jaGlsZHJlbiksIFJFQURPTkxZfSwKLSAgICAgICAgeyJvcHRpbWl6ZWQiLFRfSU5ULCAgICBPRkYoc3RlX3Vub3B0aW1pemVkKSwgUkVBRE9OTFl9LAotCXsibmVzdGVkIiwgICBUX0lOVCwgICAgT0ZGKHN0ZV9uZXN0ZWQpLCBSRUFET05MWX0sCi0JeyJ0eXBlIiwgICAgIFRfSU5ULCAgICBPRkYoc3RlX3R5cGUpLCBSRUFET05MWX0sCi0JeyJsaW5lbm8iLCAgIFRfSU5ULCAgICBPRkYoc3RlX2xpbmVubyksIFJFQURPTkxZfSwKLQl7TlVMTH0KKyAgICB7ImlkIiwgICAgICAgVF9PQkpFQ1QsIE9GRihzdGVfaWQpLCBSRUFET05MWX0sCisgICAgeyJuYW1lIiwgICAgIFRfT0JKRUNULCBPRkYoc3RlX25hbWUpLCBSRUFET05MWX0sCisgICAgeyJzeW1ib2xzIiwgIFRfT0JKRUNULCBPRkYoc3RlX3N5bWJvbHMpLCBSRUFET05MWX0sCisgICAgeyJ2YXJuYW1lcyIsIFRfT0JKRUNULCBPRkYoc3RlX3Zhcm5hbWVzKSwgUkVBRE9OTFl9LAorICAgIHsiY2hpbGRyZW4iLCBUX09CSkVDVCwgT0ZGKHN0ZV9jaGlsZHJlbiksIFJFQURPTkxZfSwKKyAgICB7Im9wdGltaXplZCIsVF9JTlQsICAgIE9GRihzdGVfdW5vcHRpbWl6ZWQpLCBSRUFET05MWX0sCisgICAgeyJuZXN0ZWQiLCAgIFRfSU5ULCAgICBPRkYoc3RlX25lc3RlZCksIFJFQURPTkxZfSwKKyAgICB7InR5cGUiLCAgICAgVF9JTlQsICAgIE9GRihzdGVfdHlwZSksIFJFQURPTkxZfSwKKyAgICB7ImxpbmVubyIsICAgVF9JTlQsICAgIE9GRihzdGVfbGluZW5vKSwgUkVBRE9OTFl9LAorICAgIHtOVUxMfQogfTsKIAogUHlUeXBlT2JqZWN0IFB5U1RFbnRyeV9UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCi0JInN5bXRhYmxlIGVudHJ5IiwKLQlzaXplb2YoUHlTVEVudHJ5T2JqZWN0KSwKLQkwLAotCShkZXN0cnVjdG9yKXN0ZV9kZWFsbG9jLCAgICAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCi0JMCwJCQkgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCSAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCi0JKHJlcHJmdW5jKXN0ZV9yZXByLAkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCQkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQsCSAgICAgICAgICAgICAgICAvKiB0cF9mbGFncyAqLwotIAkwLAkJCQkJLyogdHBfZG9jICovCi0JMCwJCQkJCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkJLyogdHBfaXRlcm5leHQgKi8KLQkwLAkJCQkJLyogdHBfbWV0aG9kcyAqLwotCXN0ZV9tZW1iZXJsaXN0LAkJCQkvKiB0cF9tZW1iZXJzICovCi0JMCwJCQkJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJCS8qIHRwX2RpY3QgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2luaXQgKi8KLQkwLAkJCQkJLyogdHBfYWxsb2MgKi8KLQkwLAkJCQkJLyogdHBfbmV3ICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKKyAgICAic3ltdGFibGUgZW50cnkiLAorICAgIHNpemVvZihQeVNURW50cnlPYmplY3QpLAorICAgIDAsCisgICAgKGRlc3RydWN0b3Ipc3RlX2RlYWxsb2MsICAgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIChyZXByZnVuYylzdGVfcmVwciwgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgc3RlX21lbWJlcmxpc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCiB9OwogCiBzdGF0aWMgaW50IHN5bXRhYmxlX2FuYWx5emUoc3RydWN0IHN5bXRhYmxlICpzdCk7CiBzdGF0aWMgaW50IHN5bXRhYmxlX3dhcm4oc3RydWN0IHN5bXRhYmxlICpzdCwgY2hhciAqbXNnLCBpbnQgbGluZW5vKTsKLXN0YXRpYyBpbnQgc3ltdGFibGVfZW50ZXJfYmxvY2soc3RydWN0IHN5bXRhYmxlICpzdCwgaWRlbnRpZmllciBuYW1lLCAKLQkJCQlfUHlfYmxvY2tfdHkgYmxvY2ssIHZvaWQgKmFzdCwgaW50IGxpbmVubyk7CitzdGF0aWMgaW50IHN5bXRhYmxlX2VudGVyX2Jsb2NrKHN0cnVjdCBzeW10YWJsZSAqc3QsIGlkZW50aWZpZXIgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1B5X2Jsb2NrX3R5IGJsb2NrLCB2b2lkICphc3QsIGludCBsaW5lbm8pOwogc3RhdGljIGludCBzeW10YWJsZV9leGl0X2Jsb2NrKHN0cnVjdCBzeW10YWJsZSAqc3QsIHZvaWQgKmFzdCk7CiBzdGF0aWMgaW50IHN5bXRhYmxlX3Zpc2l0X3N0bXQoc3RydWN0IHN5bXRhYmxlICpzdCwgc3RtdF90eSBzKTsKIHN0YXRpYyBpbnQgc3ltdGFibGVfdmlzaXRfZXhwcihzdHJ1Y3Qgc3ltdGFibGUgKnN0LCBleHByX3R5IHMpOwpAQCAtMTgyLDcgKzE4Miw3IEBACiBzdGF0aWMgaWRlbnRpZmllciB0b3AgPSBOVUxMLCBsYW1iZGEgPSBOVUxMLCBnZW5leHByID0gTlVMTDsKIAogI2RlZmluZSBHRVRfSURFTlRJRklFUihWQVIpIFwKLQkoKFZBUikgPyAoVkFSKSA6ICgoVkFSKSA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIyBWQVIpKSkKKyAgICAoKFZBUikgPyAoVkFSKSA6ICgoVkFSKSA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIyBWQVIpKSkKIAogI2RlZmluZSBEVVBMSUNBVEVfQVJHVU1FTlQgXAogImR1cGxpY2F0ZSBhcmd1bWVudCAnJXMnIGluIGZ1bmN0aW9uIGRlZmluaXRpb24iCkBAIC0xOTAsMTM1ICsxOTAsMTM1IEBACiBzdGF0aWMgc3RydWN0IHN5bXRhYmxlICoKIHN5bXRhYmxlX25ldyh2b2lkKQogewotCXN0cnVjdCBzeW10YWJsZSAqc3Q7CisgICAgc3RydWN0IHN5bXRhYmxlICpzdDsKIAotCXN0ID0gKHN0cnVjdCBzeW10YWJsZSAqKVB5TWVtX01hbGxvYyhzaXplb2Yoc3RydWN0IHN5bXRhYmxlKSk7Ci0JaWYgKHN0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIHN0ID0gKHN0cnVjdCBzeW10YWJsZSAqKVB5TWVtX01hbGxvYyhzaXplb2Yoc3RydWN0IHN5bXRhYmxlKSk7CisgICAgaWYgKHN0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0Jc3QtPnN0X2ZpbGVuYW1lID0gTlVMTDsKLQlzdC0+c3Rfc3ltYm9scyA9IE5VTEw7CisgICAgc3QtPnN0X2ZpbGVuYW1lID0gTlVMTDsKKyAgICBzdC0+c3Rfc3ltYm9scyA9IE5VTEw7CiAKLQlpZiAoKHN0LT5zdF9zdGFjayA9IFB5TGlzdF9OZXcoMCkpID09IE5VTEwpCi0JCWdvdG8gZmFpbDsKLQlpZiAoKHN0LT5zdF9zeW1ib2xzID0gUHlEaWN0X05ldygpKSA9PSBOVUxMKQotCQlnb3RvIGZhaWw7IAotCXN0LT5zdF9jdXIgPSBOVUxMOwotCXN0LT5zdF90bXBuYW1lID0gMDsKLQlzdC0+c3RfcHJpdmF0ZSA9IE5VTEw7Ci0JcmV0dXJuIHN0OworICAgIGlmICgoc3QtPnN0X3N0YWNrID0gUHlMaXN0X05ldygwKSkgPT0gTlVMTCkKKyAgICAgICAgZ290byBmYWlsOworICAgIGlmICgoc3QtPnN0X3N5bWJvbHMgPSBQeURpY3RfTmV3KCkpID09IE5VTEwpCisgICAgICAgIGdvdG8gZmFpbDsKKyAgICBzdC0+c3RfY3VyID0gTlVMTDsKKyAgICBzdC0+c3RfdG1wbmFtZSA9IDA7CisgICAgc3QtPnN0X3ByaXZhdGUgPSBOVUxMOworICAgIHJldHVybiBzdDsKICBmYWlsOgotCVB5U3ltdGFibGVfRnJlZShzdCk7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlTeW10YWJsZV9GcmVlKHN0KTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RydWN0IHN5bXRhYmxlICoKIFB5U3ltdGFibGVfQnVpbGQobW9kX3R5IG1vZCwgY29uc3QgY2hhciAqZmlsZW5hbWUsIFB5RnV0dXJlRmVhdHVyZXMgKmZ1dHVyZSkKIHsKLQlzdHJ1Y3Qgc3ltdGFibGUgKnN0ID0gc3ltdGFibGVfbmV3KCk7Ci0JYXNkbF9zZXEgKnNlcTsKLQlpbnQgaTsKKyAgICBzdHJ1Y3Qgc3ltdGFibGUgKnN0ID0gc3ltdGFibGVfbmV3KCk7CisgICAgYXNkbF9zZXEgKnNlcTsKKyAgICBpbnQgaTsKIAotCWlmIChzdCA9PSBOVUxMKQotCQlyZXR1cm4gc3Q7Ci0Jc3QtPnN0X2ZpbGVuYW1lID0gZmlsZW5hbWU7Ci0Jc3QtPnN0X2Z1dHVyZSA9IGZ1dHVyZTsKLQlpZiAoIUdFVF9JREVOVElGSUVSKHRvcCkgfHwKLQkgICAgIXN5bXRhYmxlX2VudGVyX2Jsb2NrKHN0LCB0b3AsIE1vZHVsZUJsb2NrLCAodm9pZCAqKW1vZCwgMCkpIHsKLQkJUHlTeW10YWJsZV9GcmVlKHN0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChzdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gc3Q7CisgICAgc3QtPnN0X2ZpbGVuYW1lID0gZmlsZW5hbWU7CisgICAgc3QtPnN0X2Z1dHVyZSA9IGZ1dHVyZTsKKyAgICBpZiAoIUdFVF9JREVOVElGSUVSKHRvcCkgfHwKKyAgICAgICAgIXN5bXRhYmxlX2VudGVyX2Jsb2NrKHN0LCB0b3AsIE1vZHVsZUJsb2NrLCAodm9pZCAqKW1vZCwgMCkpIHsKKyAgICAgICAgUHlTeW10YWJsZV9GcmVlKHN0KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0Jc3QtPnN0X3RvcCA9IHN0LT5zdF9jdXI7Ci0Jc3QtPnN0X2N1ci0+c3RlX3Vub3B0aW1pemVkID0gT1BUX1RPUExFVkVMOwotCS8qIEFueSBvdGhlciB0b3AtbGV2ZWwgaW5pdGlhbGl6YXRpb24/ICovCi0Jc3dpdGNoIChtb2QtPmtpbmQpIHsKLQljYXNlIE1vZHVsZV9raW5kOgotCQlzZXEgPSBtb2QtPnYuTW9kdWxlLmJvZHk7Ci0JCWZvciAoaSA9IDA7IGkgPCBhc2RsX3NlcV9MRU4oc2VxKTsgaSsrKQotCQkJaWYgKCFzeW10YWJsZV92aXNpdF9zdG10KHN0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdG10X3R5KWFzZGxfc2VxX0dFVChzZXEsIGkpKSkKLQkJCQlnb3RvIGVycm9yOwotCQlicmVhazsKLQljYXNlIEV4cHJlc3Npb25fa2luZDoKLQkJaWYgKCFzeW10YWJsZV92aXNpdF9leHByKHN0LCBtb2QtPnYuRXhwcmVzc2lvbi5ib2R5KSkKLQkJCWdvdG8gZXJyb3I7Ci0JCWJyZWFrOwotCWNhc2UgSW50ZXJhY3RpdmVfa2luZDoKLQkJc2VxID0gbW9kLT52LkludGVyYWN0aXZlLmJvZHk7Ci0JCWZvciAoaSA9IDA7IGkgPCBhc2RsX3NlcV9MRU4oc2VxKTsgaSsrKQotCQkJaWYgKCFzeW10YWJsZV92aXNpdF9zdG10KHN0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdG10X3R5KWFzZGxfc2VxX0dFVChzZXEsIGkpKSkKLQkJCQlnb3RvIGVycm9yOwotCQlicmVhazsKLQljYXNlIFN1aXRlX2tpbmQ6Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCi0JCQkJInRoaXMgY29tcGlsZXIgZG9lcyBub3QgaGFuZGxlIFN1aXRlcyIpOwotCQlnb3RvIGVycm9yOwotCX0KLQlpZiAoIXN5bXRhYmxlX2V4aXRfYmxvY2soc3QsICh2b2lkICopbW9kKSkgewotCQlQeVN5bXRhYmxlX0ZyZWUoc3QpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKHN5bXRhYmxlX2FuYWx5emUoc3QpKQotCQlyZXR1cm4gc3Q7Ci0JUHlTeW10YWJsZV9GcmVlKHN0KTsKLQlyZXR1cm4gTlVMTDsKKyAgICBzdC0+c3RfdG9wID0gc3QtPnN0X2N1cjsKKyAgICBzdC0+c3RfY3VyLT5zdGVfdW5vcHRpbWl6ZWQgPSBPUFRfVE9QTEVWRUw7CisgICAgLyogQW55IG90aGVyIHRvcC1sZXZlbCBpbml0aWFsaXphdGlvbj8gKi8KKyAgICBzd2l0Y2ggKG1vZC0+a2luZCkgeworICAgIGNhc2UgTW9kdWxlX2tpbmQ6CisgICAgICAgIHNlcSA9IG1vZC0+di5Nb2R1bGUuYm9keTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGFzZGxfc2VxX0xFTihzZXEpOyBpKyspCisgICAgICAgICAgICBpZiAoIXN5bXRhYmxlX3Zpc2l0X3N0bXQoc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAoc3RtdF90eSlhc2RsX3NlcV9HRVQoc2VxLCBpKSkpCisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFeHByZXNzaW9uX2tpbmQ6CisgICAgICAgIGlmICghc3ltdGFibGVfdmlzaXRfZXhwcihzdCwgbW9kLT52LkV4cHJlc3Npb24uYm9keSkpCisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEludGVyYWN0aXZlX2tpbmQ6CisgICAgICAgIHNlcSA9IG1vZC0+di5JbnRlcmFjdGl2ZS5ib2R5OworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXNkbF9zZXFfTEVOKHNlcSk7IGkrKykKKyAgICAgICAgICAgIGlmICghc3ltdGFibGVfdmlzaXRfc3RtdChzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIChzdG10X3R5KWFzZGxfc2VxX0dFVChzZXEsIGkpKSkKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFN1aXRlX2tpbmQ6CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBjb21waWxlciBkb2VzIG5vdCBoYW5kbGUgU3VpdGVzIik7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorICAgIGlmICghc3ltdGFibGVfZXhpdF9ibG9jayhzdCwgKHZvaWQgKiltb2QpKSB7CisgICAgICAgIFB5U3ltdGFibGVfRnJlZShzdCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoc3ltdGFibGVfYW5hbHl6ZShzdCkpCisgICAgICAgIHJldHVybiBzdDsKKyAgICBQeVN5bXRhYmxlX0ZyZWUoc3QpOworICAgIHJldHVybiBOVUxMOwogIGVycm9yOgotCSh2b2lkKSBzeW10YWJsZV9leGl0X2Jsb2NrKHN0LCAodm9pZCAqKW1vZCk7Ci0JUHlTeW10YWJsZV9GcmVlKHN0KTsKLQlyZXR1cm4gTlVMTDsKKyAgICAodm9pZCkgc3ltdGFibGVfZXhpdF9ibG9jayhzdCwgKHZvaWQgKiltb2QpOworICAgIFB5U3ltdGFibGVfRnJlZShzdCk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHZvaWQKIFB5U3ltdGFibGVfRnJlZShzdHJ1Y3Qgc3ltdGFibGUgKnN0KQogewotCVB5X1hERUNSRUYoc3QtPnN0X3N5bWJvbHMpOwotCVB5X1hERUNSRUYoc3QtPnN0X3N0YWNrKTsKLQlQeU1lbV9GcmVlKCh2b2lkICopc3QpOworICAgIFB5X1hERUNSRUYoc3QtPnN0X3N5bWJvbHMpOworICAgIFB5X1hERUNSRUYoc3QtPnN0X3N0YWNrKTsKKyAgICBQeU1lbV9GcmVlKCh2b2lkICopc3QpOwogfQogCiBQeVNURW50cnlPYmplY3QgKgogUHlTeW10YWJsZV9Mb29rdXAoc3RydWN0IHN5bXRhYmxlICpzdCwgdm9pZCAqa2V5KQogewotCVB5T2JqZWN0ICprLCAqdjsKKyAgICBQeU9iamVjdCAqaywgKnY7CiAKLQlrID0gUHlMb25nX0Zyb21Wb2lkUHRyKGtleSk7Ci0JaWYgKGsgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JdiA9IFB5RGljdF9HZXRJdGVtKHN0LT5zdF9zeW1ib2xzLCBrKTsKLQlpZiAodikgewotCQlhc3NlcnQoUHlTVEVudHJ5X0NoZWNrKHYpKTsKLQkJUHlfSU5DUkVGKHYpOwotCX0KLQllbHNlIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0tleUVycm9yLAotCQkJCSJ1bmtub3duIHN5bWJvbCB0YWJsZSBlbnRyeSIpOwotCX0KKyAgICBrID0gUHlMb25nX0Zyb21Wb2lkUHRyKGtleSk7CisgICAgaWYgKGsgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgdiA9IFB5RGljdF9HZXRJdGVtKHN0LT5zdF9zeW1ib2xzLCBrKTsKKyAgICBpZiAodikgeworICAgICAgICBhc3NlcnQoUHlTVEVudHJ5X0NoZWNrKHYpKTsKKyAgICAgICAgUHlfSU5DUkVGKHYpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0tleUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInVua25vd24gc3ltYm9sIHRhYmxlIGVudHJ5Iik7CisgICAgfQogCi0JUHlfREVDUkVGKGspOwotCXJldHVybiAoUHlTVEVudHJ5T2JqZWN0ICopdjsKKyAgICBQeV9ERUNSRUYoayk7CisgICAgcmV0dXJuIChQeVNURW50cnlPYmplY3QgKil2OwogfQogCi1pbnQgCitpbnQKIFB5U1RfR2V0U2NvcGUoUHlTVEVudHJ5T2JqZWN0ICpzdGUsIFB5T2JqZWN0ICpuYW1lKQogewotCVB5T2JqZWN0ICp2ID0gUHlEaWN0X0dldEl0ZW0oc3RlLT5zdGVfc3ltYm9scywgbmFtZSk7Ci0JaWYgKCF2KQotCQlyZXR1cm4gMDsKLQlhc3NlcnQoUHlJbnRfQ2hlY2sodikpOwotCXJldHVybiAoUHlJbnRfQVNfTE9ORyh2KSA+PiBTQ09QRV9PRkYpICYgU0NPUEVfTUFTSzsKKyAgICBQeU9iamVjdCAqdiA9IFB5RGljdF9HZXRJdGVtKHN0ZS0+c3RlX3N5bWJvbHMsIG5hbWUpOworICAgIGlmICghdikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgYXNzZXJ0KFB5SW50X0NoZWNrKHYpKTsKKyAgICByZXR1cm4gKFB5SW50X0FTX0xPTkcodikgPj4gU0NPUEVfT0ZGKSAmIFNDT1BFX01BU0s7CiB9CiAKIAogLyogQW5hbHl6ZSByYXcgc3ltYm9sIGluZm9ybWF0aW9uIHRvIGRldGVybWluZSBzY29wZSBvZiBlYWNoIG5hbWUuCiAKICAgIFRoZSBuZXh0IHNldmVyYWwgZnVuY3Rpb25zIGFyZSBoZWxwZXJzIGZvciBQeVN5bXRhYmxlX0FuYWx5emUoKSwKLSAgIHdoaWNoIGRldGVybWluZXMgd2hldGhlciBhIG5hbWUgaXMgbG9jYWwsIGdsb2JhbCwgb3IgZnJlZS4gIEluIGFkZGl0aW9uLCAKKyAgIHdoaWNoIGRldGVybWluZXMgd2hldGhlciBhIG5hbWUgaXMgbG9jYWwsIGdsb2JhbCwgb3IgZnJlZS4gIEluIGFkZGl0aW9uLAogICAgaXQgZGV0ZXJtaW5lcyB3aGljaCBsb2NhbCB2YXJpYWJsZXMgYXJlIGNlbGwgdmFyaWFibGVzOyB0aGV5IHByb3ZpZGUKLSAgIGJpbmRpbmdzIHRoYXQgYXJlIHVzZWQgZm9yIGZyZWUgdmFyaWFibGVzIGluIGVuY2xvc2VkIGJsb2Nrcy4gIAorICAgYmluZGluZ3MgdGhhdCBhcmUgdXNlZCBmb3IgZnJlZSB2YXJpYWJsZXMgaW4gZW5jbG9zZWQgYmxvY2tzLgogCi0gICBUaGVyZSBhcmUgYWxzbyB0d28ga2luZHMgb2YgZnJlZSB2YXJpYWJsZXMsIGltcGxpY2l0IGFuZCBleHBsaWNpdC4gIEFuIAorICAgVGhlcmUgYXJlIGFsc28gdHdvIGtpbmRzIG9mIGZyZWUgdmFyaWFibGVzLCBpbXBsaWNpdCBhbmQgZXhwbGljaXQuICBBbgogICAgZXhwbGljaXQgZ2xvYmFsIGlzIGRlY2xhcmVkIHdpdGggdGhlIGdsb2JhbCBzdGF0ZW1lbnQuICBBbiBpbXBsaWNpdAogICAgZ2xvYmFsIGlzIGEgZnJlZSB2YXJpYWJsZSBmb3Igd2hpY2ggdGhlIGNvbXBpbGVyIGhhcyBmb3VuZCBubyBiaW5kaW5nCiAgICBpbiBhbiBlbmNsb3NpbmcgZnVuY3Rpb24gc2NvcGUuICBUaGUgaW1wbGljaXQgZ2xvYmFsIGlzIGVpdGhlciBhIGdsb2JhbApAQCAtMzI4LDM1ICszMjgsMzUgQEAKICAgIGlzIHRyZWF0ZWQgYXMgYSBsb2NhbC4KIAogICAgVGhlIHN5bWJvbCB0YWJsZSByZXF1aXJlcyB0d28gcGFzc2VzIHRvIGRldGVybWluZSB0aGUgc2NvcGUgb2YgZWFjaCBuYW1lLgotICAgVGhlIGZpcnN0IHBhc3MgY29sbGVjdHMgcmF3IGZhY3RzIGZyb20gdGhlIEFTVDogdGhlIG5hbWUgaXMgYSBwYXJhbWV0ZXIgCisgICBUaGUgZmlyc3QgcGFzcyBjb2xsZWN0cyByYXcgZmFjdHMgZnJvbSB0aGUgQVNUOiB0aGUgbmFtZSBpcyBhIHBhcmFtZXRlcgogICAgaGVyZSwgdGhlIG5hbWUgaXMgdXNlZCBieSBub3QgZGVmaW5lZCBoZXJlLCBldGMuICBUaGUgc2Vjb25kIHBhc3MgYW5hbHl6ZXMKICAgIHRoZXNlIGZhY3RzIGR1cmluZyBhIHBhc3Mgb3ZlciB0aGUgUHlTVEVudHJ5T2JqZWN0cyBjcmVhdGVkIGR1cmluZyBwYXNzIDEuCiAKICAgIFdoZW4gYSBmdW5jdGlvbiBpcyBlbnRlcmVkIGR1cmluZyB0aGUgc2Vjb25kIHBhc3MsIHRoZSBwYXJlbnQgcGFzc2VzCi0gICB0aGUgc2V0IG9mIGFsbCBuYW1lIGJpbmRpbmdzIHZpc2libGUgdG8gaXRzIGNoaWxkcmVuLiAgVGhlc2UgYmluZGluZ3MgCisgICB0aGUgc2V0IG9mIGFsbCBuYW1lIGJpbmRpbmdzIHZpc2libGUgdG8gaXRzIGNoaWxkcmVuLiAgVGhlc2UgYmluZGluZ3MKICAgIGFyZSB1c2VkIHRvIGRldGVybWluZSBpZiB0aGUgdmFyaWFibGUgaXMgZnJlZSBvciBhbiBpbXBsaWNpdCBnbG9iYWwuCiAgICBBZnRlciBkb2luZyB0aGUgbG9jYWwgYW5hbHlzaXMsIGl0IGFuYWx5emVzIGVhY2ggb2YgaXRzIGNoaWxkIGJsb2NrcwotICAgdXNpbmcgYW4gdXBkYXRlZCBzZXQgb2YgbmFtZSBiaW5kaW5ncy4gIAorICAgdXNpbmcgYW4gdXBkYXRlZCBzZXQgb2YgbmFtZSBiaW5kaW5ncy4KIAotICAgVGhlIGNoaWxkcmVuIHVwZGF0ZSB0aGUgZnJlZSB2YXJpYWJsZSBzZXQuICBJZiBhIGxvY2FsIHZhcmlhYmxlIGlzIGZyZWUgCi0gICBpbiBhIGNoaWxkLCB0aGUgdmFyaWFibGUgaXMgbWFya2VkIGFzIGEgY2VsbC4gIFRoZSBjdXJyZW50IGZ1bmN0aW9uIG11c3QgCi0gICBwcm92aWRlIHJ1bnRpbWUgc3RvcmFnZSBmb3IgdGhlIHZhcmlhYmxlIHRoYXQgbWF5IG91dGxpdmUgdGhlIGZ1bmN0aW9uJ3MgCisgICBUaGUgY2hpbGRyZW4gdXBkYXRlIHRoZSBmcmVlIHZhcmlhYmxlIHNldC4gIElmIGEgbG9jYWwgdmFyaWFibGUgaXMgZnJlZQorICAgaW4gYSBjaGlsZCwgdGhlIHZhcmlhYmxlIGlzIG1hcmtlZCBhcyBhIGNlbGwuICBUaGUgY3VycmVudCBmdW5jdGlvbiBtdXN0CisgICBwcm92aWRlIHJ1bnRpbWUgc3RvcmFnZSBmb3IgdGhlIHZhcmlhYmxlIHRoYXQgbWF5IG91dGxpdmUgdGhlIGZ1bmN0aW9uJ3MKICAgIGZyYW1lLiAgQ2VsbCB2YXJpYWJsZXMgYXJlIHJlbW92ZWQgZnJvbSB0aGUgZnJlZSBzZXQgYmVmb3JlIHRoZSBhbmFseXplCiAgICBmdW5jdGlvbiByZXR1cm5zIHRvIGl0cyBwYXJlbnQuCi0gICAKKwogICAgVGhlIHNldHMgb2YgYm91bmQgYW5kIGZyZWUgdmFyaWFibGVzIGFyZSBpbXBsZW1lbnRlZCBhcyBkaWN0aW9uYXJpZXMKICAgIG1hcHBpbmcgc3RyaW5ncyB0byBOb25lLgogKi8KIAogI2RlZmluZSBTRVRfU0NPUEUoRElDVCwgTkFNRSwgSSkgeyBcCi0JUHlPYmplY3QgKm8gPSBQeUludF9Gcm9tTG9uZyhJKTsgXAotCWlmICghbykgXAotCQlyZXR1cm4gMDsgXAotCWlmIChQeURpY3RfU2V0SXRlbSgoRElDVCksIChOQU1FKSwgbykgPCAwKSB7IFwKLQkJUHlfREVDUkVGKG8pOyBcCi0JCXJldHVybiAwOyBcCi0JfSBcCi0JUHlfREVDUkVGKG8pOyBcCisgICAgUHlPYmplY3QgKm8gPSBQeUludF9Gcm9tTG9uZyhJKTsgXAorICAgIGlmICghbykgXAorICAgICAgICByZXR1cm4gMDsgXAorICAgIGlmIChQeURpY3RfU2V0SXRlbSgoRElDVCksIChOQU1FKSwgbykgPCAwKSB7IFwKKyAgICAgICAgUHlfREVDUkVGKG8pOyBcCisgICAgICAgIHJldHVybiAwOyBcCisgICAgfSBcCisgICAgUHlfREVDUkVGKG8pOyBcCiB9CiAKIC8qIERlY2lkZSBvbiBzY29wZSBvZiBuYW1lLCBnaXZlbiBmbGFncy4KQEAgLTM2Niw2OSArMzY2LDY5IEBACiAgICBnbG9iYWwuICBBIG5hbWUgdGhhdCB3YXMgZ2xvYmFsIGNhbiBiZSBjaGFuZ2VkIHRvIGxvY2FsLgogKi8KIAotc3RhdGljIGludCAKK3N0YXRpYyBpbnQKIGFuYWx5emVfbmFtZShQeVNURW50cnlPYmplY3QgKnN0ZSwgUHlPYmplY3QgKmRpY3QsIFB5T2JqZWN0ICpuYW1lLCBsb25nIGZsYWdzLAotCSAgICAgUHlPYmplY3QgKmJvdW5kLCBQeU9iamVjdCAqbG9jYWwsIFB5T2JqZWN0ICpmcmVlLCAKLQkgICAgIFB5T2JqZWN0ICpnbG9iYWwpCisgICAgICAgICAgICAgUHlPYmplY3QgKmJvdW5kLCBQeU9iamVjdCAqbG9jYWwsIFB5T2JqZWN0ICpmcmVlLAorICAgICAgICAgICAgIFB5T2JqZWN0ICpnbG9iYWwpCiB7Ci0JaWYgKGZsYWdzICYgREVGX0dMT0JBTCkgewotCQlpZiAoZmxhZ3MgJiBERUZfUEFSQU0pIHsKLQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19TeW50YXhFcnJvciwKLQkJCQkgICAgICJuYW1lICclcycgaXMgbG9jYWwgYW5kIGdsb2JhbCIsCi0JCQkJICAgICBQeVN0cmluZ19BU19TVFJJTkcobmFtZSkpOwotCQkJUHlFcnJfU3ludGF4TG9jYXRpb24oc3RlLT5zdGVfdGFibGUtPnN0X2ZpbGVuYW1lLAotCQkJCQkgICAgIHN0ZS0+c3RlX2xpbmVubyk7Ci0JCQkKLQkJCXJldHVybiAwOwotCQl9Ci0JCVNFVF9TQ09QRShkaWN0LCBuYW1lLCBHTE9CQUxfRVhQTElDSVQpOwotCQlpZiAoUHlEaWN0X1NldEl0ZW0oZ2xvYmFsLCBuYW1lLCBQeV9Ob25lKSA8IDApCi0JCQlyZXR1cm4gMDsKLQkJaWYgKGJvdW5kICYmIFB5RGljdF9HZXRJdGVtKGJvdW5kLCBuYW1lKSkgewotCQkJaWYgKFB5RGljdF9EZWxJdGVtKGJvdW5kLCBuYW1lKSA8IDApCi0JCQkJcmV0dXJuIDA7Ci0JCX0KLQkJcmV0dXJuIDE7Ci0JfQotCWlmIChmbGFncyAmIERFRl9CT1VORCkgewotCQlTRVRfU0NPUEUoZGljdCwgbmFtZSwgTE9DQUwpOwotCQlpZiAoUHlEaWN0X1NldEl0ZW0obG9jYWwsIG5hbWUsIFB5X05vbmUpIDwgMCkKLQkJCXJldHVybiAwOwotCQlpZiAoUHlEaWN0X0dldEl0ZW0oZ2xvYmFsLCBuYW1lKSkgewotCQkJaWYgKFB5RGljdF9EZWxJdGVtKGdsb2JhbCwgbmFtZSkgPCAwKQotCQkJCXJldHVybiAwOwotCQl9Ci0JCXJldHVybiAxOwotCX0KLQkvKiBJZiBhbiBlbmNsb3NpbmcgYmxvY2sgaGFzIGEgYmluZGluZyBmb3IgdGhpcyBuYW1lLCBpdAotCSAgIGlzIGEgZnJlZSB2YXJpYWJsZSByYXRoZXIgdGhhbiBhIGdsb2JhbCB2YXJpYWJsZS4KLQkgICBOb3RlIHRoYXQgaGF2aW5nIGEgbm9uLU5VTEwgYm91bmQgaW1wbGllcyB0aGF0IHRoZSBibG9jawotCSAgIGlzIG5lc3RlZC4KLQkqLwotCWlmIChib3VuZCAmJiBQeURpY3RfR2V0SXRlbShib3VuZCwgbmFtZSkpIHsKLQkJU0VUX1NDT1BFKGRpY3QsIG5hbWUsIEZSRUUpOwotCQlzdGUtPnN0ZV9mcmVlID0gMTsKLQkJaWYgKFB5RGljdF9TZXRJdGVtKGZyZWUsIG5hbWUsIFB5X05vbmUpIDwgMCkKLQkJCXJldHVybiAwOwotCQlyZXR1cm4gMTsKLQl9Ci0JLyogSWYgYSBwYXJlbnQgaGFzIGEgZ2xvYmFsIHN0YXRlbWVudCwgdGhlbiBjYWxsIGl0IGdsb2JhbAotCSAgIGV4cGxpY2l0PyAgSXQgY291bGQgYWxzbyBiZSBnbG9iYWwgaW1wbGljaXQuCi0JICovCi0JZWxzZSBpZiAoZ2xvYmFsICYmIFB5RGljdF9HZXRJdGVtKGdsb2JhbCwgbmFtZSkpIHsKLQkJU0VUX1NDT1BFKGRpY3QsIG5hbWUsIEdMT0JBTF9JTVBMSUNJVCk7Ci0JCXJldHVybiAxOwotCX0KLQllbHNlIHsKLQkJaWYgKHN0ZS0+c3RlX25lc3RlZCkKLQkJCXN0ZS0+c3RlX2ZyZWUgPSAxOwotCQlTRVRfU0NPUEUoZGljdCwgbmFtZSwgR0xPQkFMX0lNUExJQ0lUKTsKLQkJcmV0dXJuIDE7Ci0JfQotCS8qIFNob3VsZCBuZXZlciBnZXQgaGVyZS4gKi8KLQlQeUVycl9Gb3JtYXQoUHlFeGNfU3lzdGVtRXJyb3IsICJmYWlsZWQgdG8gc2V0IHNjb3BlIGZvciAlcyIsCi0JCSAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKG5hbWUpKTsKLQlyZXR1cm4gMDsKKyAgICBpZiAoZmxhZ3MgJiBERUZfR0xPQkFMKSB7CisgICAgICAgIGlmIChmbGFncyAmIERFRl9QQVJBTSkgeworICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1N5bnRheEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lICclcycgaXMgbG9jYWwgYW5kIGdsb2JhbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKG5hbWUpKTsKKyAgICAgICAgICAgIFB5RXJyX1N5bnRheExvY2F0aW9uKHN0ZS0+c3RlX3RhYmxlLT5zdF9maWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZS0+c3RlX2xpbmVubyk7CisKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIFNFVF9TQ09QRShkaWN0LCBuYW1lLCBHTE9CQUxfRVhQTElDSVQpOworICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW0oZ2xvYmFsLCBuYW1lLCBQeV9Ob25lKSA8IDApCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgaWYgKGJvdW5kICYmIFB5RGljdF9HZXRJdGVtKGJvdW5kLCBuYW1lKSkgeworICAgICAgICAgICAgaWYgKFB5RGljdF9EZWxJdGVtKGJvdW5kLCBuYW1lKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmIChmbGFncyAmIERFRl9CT1VORCkgeworICAgICAgICBTRVRfU0NPUEUoZGljdCwgbmFtZSwgTE9DQUwpOworICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW0obG9jYWwsIG5hbWUsIFB5X05vbmUpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBpZiAoUHlEaWN0X0dldEl0ZW0oZ2xvYmFsLCBuYW1lKSkgeworICAgICAgICAgICAgaWYgKFB5RGljdF9EZWxJdGVtKGdsb2JhbCwgbmFtZSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICAvKiBJZiBhbiBlbmNsb3NpbmcgYmxvY2sgaGFzIGEgYmluZGluZyBmb3IgdGhpcyBuYW1lLCBpdAorICAgICAgIGlzIGEgZnJlZSB2YXJpYWJsZSByYXRoZXIgdGhhbiBhIGdsb2JhbCB2YXJpYWJsZS4KKyAgICAgICBOb3RlIHRoYXQgaGF2aW5nIGEgbm9uLU5VTEwgYm91bmQgaW1wbGllcyB0aGF0IHRoZSBibG9jaworICAgICAgIGlzIG5lc3RlZC4KKyAgICAqLworICAgIGlmIChib3VuZCAmJiBQeURpY3RfR2V0SXRlbShib3VuZCwgbmFtZSkpIHsKKyAgICAgICAgU0VUX1NDT1BFKGRpY3QsIG5hbWUsIEZSRUUpOworICAgICAgICBzdGUtPnN0ZV9mcmVlID0gMTsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtKGZyZWUsIG5hbWUsIFB5X05vbmUpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgLyogSWYgYSBwYXJlbnQgaGFzIGEgZ2xvYmFsIHN0YXRlbWVudCwgdGhlbiBjYWxsIGl0IGdsb2JhbAorICAgICAgIGV4cGxpY2l0PyAgSXQgY291bGQgYWxzbyBiZSBnbG9iYWwgaW1wbGljaXQuCisgICAgICovCisgICAgZWxzZSBpZiAoZ2xvYmFsICYmIFB5RGljdF9HZXRJdGVtKGdsb2JhbCwgbmFtZSkpIHsKKyAgICAgICAgU0VUX1NDT1BFKGRpY3QsIG5hbWUsIEdMT0JBTF9JTVBMSUNJVCk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKHN0ZS0+c3RlX25lc3RlZCkKKyAgICAgICAgICAgIHN0ZS0+c3RlX2ZyZWUgPSAxOworICAgICAgICBTRVRfU0NPUEUoZGljdCwgbmFtZSwgR0xPQkFMX0lNUExJQ0lUKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIC8qIFNob3VsZCBuZXZlciBnZXQgaGVyZS4gKi8KKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfU3lzdGVtRXJyb3IsICJmYWlsZWQgdG8gc2V0IHNjb3BlIGZvciAlcyIsCisgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FTX1NUUklORyhuYW1lKSk7CisgICAgcmV0dXJuIDA7CiB9CiAKICN1bmRlZiBTRVRfU0NPUEUKQEAgLTQ0NCwxNTIgKzQ0NCwxNTIgQEAKIHN0YXRpYyBpbnQKIGFuYWx5emVfY2VsbHMoUHlPYmplY3QgKnNjb3BlLCBQeU9iamVjdCAqZnJlZSkKIHsKLSAgICAgICAgUHlPYmplY3QgKm5hbWUsICp2LCAqdzsKLQlpbnQgc3VjY2VzcyA9IDA7Ci0JUHlfc3NpemVfdCBwb3MgPSAwOworICAgIFB5T2JqZWN0ICpuYW1lLCAqdiwgKnc7CisgICAgaW50IHN1Y2Nlc3MgPSAwOworICAgIFB5X3NzaXplX3QgcG9zID0gMDsKIAotCXcgPSBQeUludF9Gcm9tTG9uZyhDRUxMKTsKLQlpZiAoIXcpCi0JCXJldHVybiAwOwotCXdoaWxlIChQeURpY3RfTmV4dChzY29wZSwgJnBvcywgJm5hbWUsICZ2KSkgewotCQlsb25nIGZsYWdzOwotCQlhc3NlcnQoUHlJbnRfQ2hlY2sodikpOwotCQlmbGFncyA9IFB5SW50X0FTX0xPTkcodik7Ci0JCWlmIChmbGFncyAhPSBMT0NBTCkKLQkJCWNvbnRpbnVlOwotCQlpZiAoIVB5RGljdF9HZXRJdGVtKGZyZWUsIG5hbWUpKQotCQkJY29udGludWU7Ci0JCS8qIFJlcGxhY2UgTE9DQUwgd2l0aCBDRUxMIGZvciB0aGlzIG5hbWUsIGFuZCByZW1vdmUKLQkJICAgZnJvbSBmcmVlLiBJdCBpcyBzYWZlIHRvIHJlcGxhY2UgdGhlIHZhbHVlIG9mIG5hbWUgCi0JCSAgIGluIHRoZSBkaWN0LCBiZWNhdXNlIGl0IHdpbGwgbm90IGNhdXNlIGEgcmVzaXplLgotCQkgKi8KLQkJaWYgKFB5RGljdF9TZXRJdGVtKHNjb3BlLCBuYW1lLCB3KSA8IDApCi0JCQlnb3RvIGVycm9yOwotCQlpZiAoIVB5RGljdF9EZWxJdGVtKGZyZWUsIG5hbWUpIDwgMCkKLQkJCWdvdG8gZXJyb3I7Ci0JfQotCXN1Y2Nlc3MgPSAxOworICAgIHcgPSBQeUludF9Gcm9tTG9uZyhDRUxMKTsKKyAgICBpZiAoIXcpCisgICAgICAgIHJldHVybiAwOworICAgIHdoaWxlIChQeURpY3RfTmV4dChzY29wZSwgJnBvcywgJm5hbWUsICZ2KSkgeworICAgICAgICBsb25nIGZsYWdzOworICAgICAgICBhc3NlcnQoUHlJbnRfQ2hlY2sodikpOworICAgICAgICBmbGFncyA9IFB5SW50X0FTX0xPTkcodik7CisgICAgICAgIGlmIChmbGFncyAhPSBMT0NBTCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoIVB5RGljdF9HZXRJdGVtKGZyZWUsIG5hbWUpKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIC8qIFJlcGxhY2UgTE9DQUwgd2l0aCBDRUxMIGZvciB0aGlzIG5hbWUsIGFuZCByZW1vdmUKKyAgICAgICAgICAgZnJvbSBmcmVlLiBJdCBpcyBzYWZlIHRvIHJlcGxhY2UgdGhlIHZhbHVlIG9mIG5hbWUKKyAgICAgICAgICAgaW4gdGhlIGRpY3QsIGJlY2F1c2UgaXQgd2lsbCBub3QgY2F1c2UgYSByZXNpemUuCisgICAgICAgICAqLworICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW0oc2NvcGUsIG5hbWUsIHcpIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIGlmICghUHlEaWN0X0RlbEl0ZW0oZnJlZSwgbmFtZSkgPCAwKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgc3VjY2VzcyA9IDE7CiAgZXJyb3I6Ci0JUHlfREVDUkVGKHcpOwotCXJldHVybiBzdWNjZXNzOworICAgIFB5X0RFQ1JFRih3KTsKKyAgICByZXR1cm4gc3VjY2VzczsKIH0KIAogLyogQ2hlY2sgZm9yIGlsbGVnYWwgc3RhdGVtZW50cyBpbiB1bm9wdGltaXplZCBuYW1lc3BhY2VzICovCiBzdGF0aWMgaW50CiBjaGVja191bm9wdGltaXplZChjb25zdCBQeVNURW50cnlPYmplY3QqIHN0ZSkgewotCWNoYXIgYnVmWzMwMF07Ci0JY29uc3QgY2hhciogdHJhaWxlcjsKKyAgICBjaGFyIGJ1ZlszMDBdOworICAgIGNvbnN0IGNoYXIqIHRyYWlsZXI7CiAKLQlpZiAoc3RlLT5zdGVfdHlwZSAhPSBGdW5jdGlvbkJsb2NrIHx8ICFzdGUtPnN0ZV91bm9wdGltaXplZAotCSAgICB8fCAhKHN0ZS0+c3RlX2ZyZWUgfHwgc3RlLT5zdGVfY2hpbGRfZnJlZSkpCi0JCXJldHVybiAxOworICAgIGlmIChzdGUtPnN0ZV90eXBlICE9IEZ1bmN0aW9uQmxvY2sgfHwgIXN0ZS0+c3RlX3Vub3B0aW1pemVkCisgICAgICAgIHx8ICEoc3RlLT5zdGVfZnJlZSB8fCBzdGUtPnN0ZV9jaGlsZF9mcmVlKSkKKyAgICAgICAgcmV0dXJuIDE7CiAKLQl0cmFpbGVyID0gKHN0ZS0+c3RlX2NoaWxkX2ZyZWUgPyAKLQkJICAgICAgICJjb250YWlucyBhIG5lc3RlZCBmdW5jdGlvbiB3aXRoIGZyZWUgdmFyaWFibGVzIiA6Ci0JCQkgICAgICAgImlzIGEgbmVzdGVkIGZ1bmN0aW9uIik7CisgICAgdHJhaWxlciA9IChzdGUtPnN0ZV9jaGlsZF9mcmVlID8KKyAgICAgICAgICAgICAgICAgICAiY29udGFpbnMgYSBuZXN0ZWQgZnVuY3Rpb24gd2l0aCBmcmVlIHZhcmlhYmxlcyIgOgorICAgICAgICAgICAgICAgICAgICJpcyBhIG5lc3RlZCBmdW5jdGlvbiIpOwogCi0Jc3dpdGNoIChzdGUtPnN0ZV91bm9wdGltaXplZCkgewotCWNhc2UgT1BUX1RPUExFVkVMOiAvKiBleGVjIC8gaW1wb3J0ICogYXQgdG9wLWxldmVsIGlzIGZpbmUgKi8KLQljYXNlIE9QVF9FWEVDOiAvKiBxdWFsaWZpZWQgZXhlYyBpcyBmaW5lICovCi0JCXJldHVybiAxOwotCWNhc2UgT1BUX0lNUE9SVF9TVEFSOgotCQlQeU9TX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIAotCQkJICAgICAgImltcG9ydCAqIGlzIG5vdCBhbGxvd2VkIGluIGZ1bmN0aW9uICclLjEwMHMnICIKLQkJCSAgICAgICJiZWNhdXNlIGl0IGlzICVzIiwKLQkJCSAgICAgIFB5U3RyaW5nX0FTX1NUUklORyhzdGUtPnN0ZV9uYW1lKSwgdHJhaWxlcik7Ci0JCWJyZWFrOwotCWNhc2UgT1BUX0JBUkVfRVhFQzoKLQkJUHlPU19zbnByaW50ZihidWYsIHNpemVvZihidWYpLAotCQkJICAgICAgInVucXVhbGlmaWVkIGV4ZWMgaXMgbm90IGFsbG93ZWQgaW4gZnVuY3Rpb24gIgotCQkJICAgICAgIiclLjEwMHMnIGl0ICVzIiwKLQkJCSAgICAgIFB5U3RyaW5nX0FTX1NUUklORyhzdGUtPnN0ZV9uYW1lKSwgdHJhaWxlcik7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCVB5T1Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgCi0JCQkgICAgICAiZnVuY3Rpb24gJyUuMTAwcycgdXNlcyBpbXBvcnQgKiBhbmQgYmFyZSBleGVjLCAiCi0JCQkgICAgICAid2hpY2ggYXJlIGlsbGVnYWwgYmVjYXVzZSBpdCAlcyIsCi0JCQkgICAgICBQeVN0cmluZ19BU19TVFJJTkcoc3RlLT5zdGVfbmFtZSksIHRyYWlsZXIpOwotCQlicmVhazsKLQl9CisgICAgc3dpdGNoIChzdGUtPnN0ZV91bm9wdGltaXplZCkgeworICAgIGNhc2UgT1BUX1RPUExFVkVMOiAvKiBleGVjIC8gaW1wb3J0ICogYXQgdG9wLWxldmVsIGlzIGZpbmUgKi8KKyAgICBjYXNlIE9QVF9FWEVDOiAvKiBxdWFsaWZpZWQgZXhlYyBpcyBmaW5lICovCisgICAgICAgIHJldHVybiAxOworICAgIGNhc2UgT1BUX0lNUE9SVF9TVEFSOgorICAgICAgICBQeU9TX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksCisgICAgICAgICAgICAgICAgICAgICAgImltcG9ydCAqIGlzIG5vdCBhbGxvd2VkIGluIGZ1bmN0aW9uICclLjEwMHMnICIKKyAgICAgICAgICAgICAgICAgICAgICAiYmVjYXVzZSBpdCBpcyAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKHN0ZS0+c3RlX25hbWUpLCB0cmFpbGVyKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPUFRfQkFSRV9FWEVDOgorICAgICAgICBQeU9TX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksCisgICAgICAgICAgICAgICAgICAgICAgInVucXVhbGlmaWVkIGV4ZWMgaXMgbm90IGFsbG93ZWQgaW4gZnVuY3Rpb24gIgorICAgICAgICAgICAgICAgICAgICAgICInJS4xMDBzJyBpdCAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKHN0ZS0+c3RlX25hbWUpLCB0cmFpbGVyKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgUHlPU19zbnByaW50ZihidWYsIHNpemVvZihidWYpLAorICAgICAgICAgICAgICAgICAgICAgICJmdW5jdGlvbiAnJS4xMDBzJyB1c2VzIGltcG9ydCAqIGFuZCBiYXJlIGV4ZWMsICIKKyAgICAgICAgICAgICAgICAgICAgICAid2hpY2ggYXJlIGlsbGVnYWwgYmVjYXVzZSBpdCAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKHN0ZS0+c3RlX25hbWUpLCB0cmFpbGVyKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQogCi0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5bnRheEVycm9yLCBidWYpOwotCVB5RXJyX1N5bnRheExvY2F0aW9uKHN0ZS0+c3RlX3RhYmxlLT5zdF9maWxlbmFtZSwgCi0JCQkgICAgIHN0ZS0+c3RlX29wdF9saW5lbm8pOwotCXJldHVybiAwOworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeW50YXhFcnJvciwgYnVmKTsKKyAgICBQeUVycl9TeW50YXhMb2NhdGlvbihzdGUtPnN0ZV90YWJsZS0+c3RfZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RlLT5zdGVfb3B0X2xpbmVubyk7CisgICAgcmV0dXJuIDA7CiB9CiAKLS8qIEVudGVyIHRoZSBmaW5hbCBzY29wZSBpbmZvcm1hdGlvbiBpbnRvIHRoZSBzdF9zeW1ib2xzIGRpY3QuIAotICogCisvKiBFbnRlciB0aGUgZmluYWwgc2NvcGUgaW5mb3JtYXRpb24gaW50byB0aGUgc3Rfc3ltYm9scyBkaWN0LgorICoKICAqIEFsbCBhcmd1bWVudHMgYXJlIGRpY3RzLiAgTW9kaWZpZXMgc3ltYm9scywgb3RoZXJzIGFyZSByZWFkLW9ubHkuCiAqLwogc3RhdGljIGludAotdXBkYXRlX3N5bWJvbHMoUHlPYmplY3QgKnN5bWJvbHMsIFB5T2JqZWN0ICpzY29wZSwgCit1cGRhdGVfc3ltYm9scyhQeU9iamVjdCAqc3ltYm9scywgUHlPYmplY3QgKnNjb3BlLAogICAgICAgICAgICAgICAgUHlPYmplY3QgKmJvdW5kLCBQeU9iamVjdCAqZnJlZSwgaW50IGNsYXNzZmxhZykKIHsKLQlQeU9iamVjdCAqbmFtZSwgKnYsICp1LCAqdywgKmZyZWVfdmFsdWUgPSBOVUxMOwotCVB5X3NzaXplX3QgcG9zID0gMDsKKyAgICBQeU9iamVjdCAqbmFtZSwgKnYsICp1LCAqdywgKmZyZWVfdmFsdWUgPSBOVUxMOworICAgIFB5X3NzaXplX3QgcG9zID0gMDsKIAotCXdoaWxlIChQeURpY3RfTmV4dChzeW1ib2xzLCAmcG9zLCAmbmFtZSwgJnYpKSB7Ci0JCWxvbmcgaSwgZmxhZ3M7Ci0JCWFzc2VydChQeUludF9DaGVjayh2KSk7Ci0JCWZsYWdzID0gUHlJbnRfQVNfTE9ORyh2KTsKLQkJdyA9IFB5RGljdF9HZXRJdGVtKHNjb3BlLCBuYW1lKTsKLQkJYXNzZXJ0KHcgJiYgUHlJbnRfQ2hlY2sodykpOwotCQlpID0gUHlJbnRfQVNfTE9ORyh3KTsKLQkJZmxhZ3MgfD0gKGkgPDwgU0NPUEVfT0ZGKTsKLQkJdSA9IFB5SW50X0Zyb21Mb25nKGZsYWdzKTsKLQkJaWYgKCF1KQotCQkJcmV0dXJuIDA7Ci0JCWlmIChQeURpY3RfU2V0SXRlbShzeW1ib2xzLCBuYW1lLCB1KSA8IDApIHsKLQkJCVB5X0RFQ1JFRih1KTsKLQkJCXJldHVybiAwOwotCQl9Ci0JCVB5X0RFQ1JFRih1KTsKLQl9Ci0KLSAgICAgICAgZnJlZV92YWx1ZSA9IFB5SW50X0Zyb21Mb25nKEZSRUUgPDwgU0NPUEVfT0ZGKTsKLSAgICAgICAgaWYgKCFmcmVlX3ZhbHVlKQotCQlyZXR1cm4gMDsKLQotICAgICAgICAvKiBhZGQgYSBmcmVlIHZhcmlhYmxlIHdoZW4gaXQncyBvbmx5IHVzZSBpcyBmb3IgY3JlYXRpbmcgYSBjbG9zdXJlICovCi0gICAgICAgIHBvcyA9IDA7Ci0Jd2hpbGUgKFB5RGljdF9OZXh0KGZyZWUsICZwb3MsICZuYW1lLCAmdikpIHsKLQkJUHlPYmplY3QgKm8gPSBQeURpY3RfR2V0SXRlbShzeW1ib2xzLCBuYW1lKTsKLQotCQlpZiAobykgewotCQkJLyogSXQgY291bGQgYmUgYSBmcmVlIHZhcmlhYmxlIGluIGEgbWV0aG9kIG9mCi0JCQkgICB0aGUgY2xhc3MgdGhhdCBoYXMgdGhlIHNhbWUgbmFtZSBhcyBhIGxvY2FsCi0JCQkgICBvciBnbG9iYWwgaW4gdGhlIGNsYXNzIHNjb3BlLgotCQkJKi8KLQkJCWlmICAoY2xhc3NmbGFnICYmIAotCQkJICAgICBQeUludF9BU19MT05HKG8pICYgKERFRl9CT1VORCB8IERFRl9HTE9CQUwpKSB7Ci0JCQkJbG9uZyBpID0gUHlJbnRfQVNfTE9ORyhvKSB8IERFRl9GUkVFX0NMQVNTOwotCQkJCW8gPSBQeUludF9Gcm9tTG9uZyhpKTsKLQkJCQlpZiAoIW8pIHsKLQkJCQkJUHlfREVDUkVGKGZyZWVfdmFsdWUpOwotCQkJCQlyZXR1cm4gMDsKLQkJCQl9Ci0JCQkJaWYgKFB5RGljdF9TZXRJdGVtKHN5bWJvbHMsIG5hbWUsIG8pIDwgMCkgewotCQkJCQlQeV9ERUNSRUYobyk7Ci0JCQkJCVB5X0RFQ1JFRihmcmVlX3ZhbHVlKTsKLQkJCQkJcmV0dXJuIDA7Ci0JCQkJfQotCQkJCVB5X0RFQ1JFRihvKTsKLQkJCX0KLQkJCS8qIGVsc2UgaXQncyBub3QgZnJlZSwgcHJvYmFibHkgYSBjZWxsICovCi0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIVB5RGljdF9HZXRJdGVtKGJvdW5kLCBuYW1lKSkKLQkJCWNvbnRpbnVlOyAgICAgICAvKiBpdCdzIGEgZ2xvYmFsICovCi0KLQkJaWYgKFB5RGljdF9TZXRJdGVtKHN5bWJvbHMsIG5hbWUsIGZyZWVfdmFsdWUpIDwgMCkgewotCQkJUHlfREVDUkVGKGZyZWVfdmFsdWUpOwotCQkJcmV0dXJuIDA7Ci0JCX0KKyAgICB3aGlsZSAoUHlEaWN0X05leHQoc3ltYm9scywgJnBvcywgJm5hbWUsICZ2KSkgeworICAgICAgICBsb25nIGksIGZsYWdzOworICAgICAgICBhc3NlcnQoUHlJbnRfQ2hlY2sodikpOworICAgICAgICBmbGFncyA9IFB5SW50X0FTX0xPTkcodik7CisgICAgICAgIHcgPSBQeURpY3RfR2V0SXRlbShzY29wZSwgbmFtZSk7CisgICAgICAgIGFzc2VydCh3ICYmIFB5SW50X0NoZWNrKHcpKTsKKyAgICAgICAgaSA9IFB5SW50X0FTX0xPTkcodyk7CisgICAgICAgIGZsYWdzIHw9IChpIDw8IFNDT1BFX09GRik7CisgICAgICAgIHUgPSBQeUludF9Gcm9tTG9uZyhmbGFncyk7CisgICAgICAgIGlmICghdSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW0oc3ltYm9scywgbmFtZSwgdSkgPCAwKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYodSk7CisgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgfQotICAgICAgICBQeV9ERUNSRUYoZnJlZV92YWx1ZSk7Ci0JcmV0dXJuIDE7Ci19ICAgCisgICAgICAgIFB5X0RFQ1JFRih1KTsKKyAgICB9CisKKyAgICBmcmVlX3ZhbHVlID0gUHlJbnRfRnJvbUxvbmcoRlJFRSA8PCBTQ09QRV9PRkYpOworICAgIGlmICghZnJlZV92YWx1ZSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAvKiBhZGQgYSBmcmVlIHZhcmlhYmxlIHdoZW4gaXQncyBvbmx5IHVzZSBpcyBmb3IgY3JlYXRpbmcgYSBjbG9zdXJlICovCisgICAgcG9zID0gMDsKKyAgICB3aGlsZSAoUHlEaWN0X05leHQoZnJlZSwgJnBvcywgJm5hbWUsICZ2KSkgeworICAgICAgICBQeU9iamVjdCAqbyA9IFB5RGljdF9HZXRJdGVtKHN5bWJvbHMsIG5hbWUpOworCisgICAgICAgIGlmIChvKSB7CisgICAgICAgICAgICAvKiBJdCBjb3VsZCBiZSBhIGZyZWUgdmFyaWFibGUgaW4gYSBtZXRob2Qgb2YKKyAgICAgICAgICAgICAgIHRoZSBjbGFzcyB0aGF0IGhhcyB0aGUgc2FtZSBuYW1lIGFzIGEgbG9jYWwKKyAgICAgICAgICAgICAgIG9yIGdsb2JhbCBpbiB0aGUgY2xhc3Mgc2NvcGUuCisgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgIChjbGFzc2ZsYWcgJiYKKyAgICAgICAgICAgICAgICAgUHlJbnRfQVNfTE9ORyhvKSAmIChERUZfQk9VTkQgfCBERUZfR0xPQkFMKSkgeworICAgICAgICAgICAgICAgIGxvbmcgaSA9IFB5SW50X0FTX0xPTkcobykgfCBERUZfRlJFRV9DTEFTUzsKKyAgICAgICAgICAgICAgICBvID0gUHlJbnRfRnJvbUxvbmcoaSk7CisgICAgICAgICAgICAgICAgaWYgKCFvKSB7CisgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihmcmVlX3ZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbShzeW1ib2xzLCBuYW1lLCBvKSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKG8pOworICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoZnJlZV92YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYobyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBlbHNlIGl0J3Mgbm90IGZyZWUsIHByb2JhYmx5IGEgY2VsbCAqLworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFQeURpY3RfR2V0SXRlbShib3VuZCwgbmFtZSkpCisgICAgICAgICAgICBjb250aW51ZTsgICAgICAgLyogaXQncyBhIGdsb2JhbCAqLworCisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbShzeW1ib2xzLCBuYW1lLCBmcmVlX3ZhbHVlKSA8IDApIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihmcmVlX3ZhbHVlKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorICAgIFB5X0RFQ1JFRihmcmVlX3ZhbHVlKTsKKyAgICByZXR1cm4gMTsKK30KIAogLyogTWFrZSBmaW5hbCBzeW1ib2wgdGFibGUgZGVjaXNpb25zIGZvciBibG9jayBvZiBzdGUuCiAKQEAgLTYxMiwxOTggKzYxMiwxOTggQEAKICovCiAKIHN0YXRpYyBpbnQKLWFuYWx5emVfY2hpbGRfYmxvY2soUHlTVEVudHJ5T2JqZWN0ICplbnRyeSwgUHlPYmplY3QgKmJvdW5kLCBQeU9iamVjdCAqZnJlZSwgCi0JCSAgICBQeU9iamVjdCAqZ2xvYmFsLCBQeU9iamVjdCogY2hpbGRfZnJlZSk7CithbmFseXplX2NoaWxkX2Jsb2NrKFB5U1RFbnRyeU9iamVjdCAqZW50cnksIFB5T2JqZWN0ICpib3VuZCwgUHlPYmplY3QgKmZyZWUsCisgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpnbG9iYWwsIFB5T2JqZWN0KiBjaGlsZF9mcmVlKTsKIAogc3RhdGljIGludAotYW5hbHl6ZV9ibG9jayhQeVNURW50cnlPYmplY3QgKnN0ZSwgUHlPYmplY3QgKmJvdW5kLCBQeU9iamVjdCAqZnJlZSwgCi0JICAgICAgUHlPYmplY3QgKmdsb2JhbCkKK2FuYWx5emVfYmxvY2soUHlTVEVudHJ5T2JqZWN0ICpzdGUsIFB5T2JqZWN0ICpib3VuZCwgUHlPYmplY3QgKmZyZWUsCisgICAgICAgICAgICAgIFB5T2JqZWN0ICpnbG9iYWwpCiB7Ci0JUHlPYmplY3QgKm5hbWUsICp2LCAqbG9jYWwgPSBOVUxMLCAqc2NvcGUgPSBOVUxMOwotCVB5T2JqZWN0ICpuZXdib3VuZCA9IE5VTEwsICpuZXdnbG9iYWwgPSBOVUxMOwotCVB5T2JqZWN0ICpuZXdmcmVlID0gTlVMTCwgKmFsbGZyZWUgPSBOVUxMOwotCWludCBpLCBzdWNjZXNzID0gMDsKLQlQeV9zc2l6ZV90IHBvcyA9IDA7CisgICAgUHlPYmplY3QgKm5hbWUsICp2LCAqbG9jYWwgPSBOVUxMLCAqc2NvcGUgPSBOVUxMOworICAgIFB5T2JqZWN0ICpuZXdib3VuZCA9IE5VTEwsICpuZXdnbG9iYWwgPSBOVUxMOworICAgIFB5T2JqZWN0ICpuZXdmcmVlID0gTlVMTCwgKmFsbGZyZWUgPSBOVUxMOworICAgIGludCBpLCBzdWNjZXNzID0gMDsKKyAgICBQeV9zc2l6ZV90IHBvcyA9IDA7CiAKLQlsb2NhbCA9IFB5RGljdF9OZXcoKTsgIC8qIGNvbGxlY3QgbmV3IG5hbWVzIGJvdW5kIGluIGJsb2NrICovCi0JaWYgKCFsb2NhbCkKLQkJZ290byBlcnJvcjsKLQlzY29wZSA9IFB5RGljdF9OZXcoKTsgLyogY29sbGVjdCBzY29wZXMgZGVmaW5lZCBmb3IgZWFjaCBuYW1lICovCi0JaWYgKCFzY29wZSkKLQkJZ290byBlcnJvcjsKKyAgICBsb2NhbCA9IFB5RGljdF9OZXcoKTsgIC8qIGNvbGxlY3QgbmV3IG5hbWVzIGJvdW5kIGluIGJsb2NrICovCisgICAgaWYgKCFsb2NhbCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBzY29wZSA9IFB5RGljdF9OZXcoKTsgLyogY29sbGVjdCBzY29wZXMgZGVmaW5lZCBmb3IgZWFjaCBuYW1lICovCisgICAgaWYgKCFzY29wZSkKKyAgICAgICAgZ290byBlcnJvcjsKIAotCS8qIEFsbG9jYXRlIG5ldyBnbG9iYWwgYW5kIGJvdW5kIHZhcmlhYmxlIGRpY3Rpb25hcmllcy4gIFRoZXNlCi0JICAgZGljdGlvbmFyaWVzIGhvbGQgdGhlIG5hbWVzIHZpc2libGUgaW4gbmVzdGVkIGJsb2Nrcy4gIEZvcgotCSAgIENsYXNzQmxvY2tzLCB0aGUgYm91bmQgYW5kIGdsb2JhbCBuYW1lcyBhcmUgaW5pdGlhbGl6ZWQKLQkgICBiZWZvcmUgYW5hbHl6aW5nIG5hbWVzLCBiZWNhdXNlIGNsYXNzIGJpbmRpbmdzIGFyZW4ndAotCSAgIHZpc2libGUgaW4gbWV0aG9kcy4gIEZvciBvdGhlciBibG9ja3MsIHRoZXkgYXJlIGluaXRpYWxpemVkCi0JICAgYWZ0ZXIgbmFtZXMgYXJlIGFuYWx5emVkLgotCSAqLworICAgIC8qIEFsbG9jYXRlIG5ldyBnbG9iYWwgYW5kIGJvdW5kIHZhcmlhYmxlIGRpY3Rpb25hcmllcy4gIFRoZXNlCisgICAgICAgZGljdGlvbmFyaWVzIGhvbGQgdGhlIG5hbWVzIHZpc2libGUgaW4gbmVzdGVkIGJsb2Nrcy4gIEZvcgorICAgICAgIENsYXNzQmxvY2tzLCB0aGUgYm91bmQgYW5kIGdsb2JhbCBuYW1lcyBhcmUgaW5pdGlhbGl6ZWQKKyAgICAgICBiZWZvcmUgYW5hbHl6aW5nIG5hbWVzLCBiZWNhdXNlIGNsYXNzIGJpbmRpbmdzIGFyZW4ndAorICAgICAgIHZpc2libGUgaW4gbWV0aG9kcy4gIEZvciBvdGhlciBibG9ja3MsIHRoZXkgYXJlIGluaXRpYWxpemVkCisgICAgICAgYWZ0ZXIgbmFtZXMgYXJlIGFuYWx5emVkLgorICAgICAqLwogCi0JLyogVE9ETyhqaHlsdG9uKTogUGFja2FnZSB0aGVzZSBkaWN0cyBpbiBhIHN0cnVjdCBzbyB0aGF0IHdlCi0JICAgY2FuIHdyaXRlIHJlYXNvbmFibGUgaGVscGVyIGZ1bmN0aW9ucz8KLQkqLwotCW5ld2dsb2JhbCA9IFB5RGljdF9OZXcoKTsKLQlpZiAoIW5ld2dsb2JhbCkKLQkJZ290byBlcnJvcjsKLQluZXdib3VuZCA9IFB5RGljdF9OZXcoKTsKLQlpZiAoIW5ld2JvdW5kKQotCQlnb3RvIGVycm9yOwotCW5ld2ZyZWUgPSBQeURpY3RfTmV3KCk7Ci0JaWYgKCFuZXdmcmVlKQotCQlnb3RvIGVycm9yOworICAgIC8qIFRPRE8oamh5bHRvbik6IFBhY2thZ2UgdGhlc2UgZGljdHMgaW4gYSBzdHJ1Y3Qgc28gdGhhdCB3ZQorICAgICAgIGNhbiB3cml0ZSByZWFzb25hYmxlIGhlbHBlciBmdW5jdGlvbnM/CisgICAgKi8KKyAgICBuZXdnbG9iYWwgPSBQeURpY3RfTmV3KCk7CisgICAgaWYgKCFuZXdnbG9iYWwpCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgbmV3Ym91bmQgPSBQeURpY3RfTmV3KCk7CisgICAgaWYgKCFuZXdib3VuZCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBuZXdmcmVlID0gUHlEaWN0X05ldygpOworICAgIGlmICghbmV3ZnJlZSkKKyAgICAgICAgZ290byBlcnJvcjsKIAotCWlmIChzdGUtPnN0ZV90eXBlID09IENsYXNzQmxvY2spIHsKLQkJaWYgKFB5RGljdF9VcGRhdGUobmV3Z2xvYmFsLCBnbG9iYWwpIDwgMCkKLQkJCWdvdG8gZXJyb3I7Ci0JCWlmIChib3VuZCkKLQkJCWlmIChQeURpY3RfVXBkYXRlKG5ld2JvdW5kLCBib3VuZCkgPCAwKQotCQkJCWdvdG8gZXJyb3I7Ci0JfQorICAgIGlmIChzdGUtPnN0ZV90eXBlID09IENsYXNzQmxvY2spIHsKKyAgICAgICAgaWYgKFB5RGljdF9VcGRhdGUobmV3Z2xvYmFsLCBnbG9iYWwpIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIGlmIChib3VuZCkKKyAgICAgICAgICAgIGlmIChQeURpY3RfVXBkYXRlKG5ld2JvdW5kLCBib3VuZCkgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQogCi0Jd2hpbGUgKFB5RGljdF9OZXh0KHN0ZS0+c3RlX3N5bWJvbHMsICZwb3MsICZuYW1lLCAmdikpIHsKLQkJbG9uZyBmbGFncyA9IFB5SW50X0FTX0xPTkcodik7Ci0JCWlmICghYW5hbHl6ZV9uYW1lKHN0ZSwgc2NvcGUsIG5hbWUsIGZsYWdzLAotCQkJCSAgYm91bmQsIGxvY2FsLCBmcmVlLCBnbG9iYWwpKQotCQkJZ290byBlcnJvcjsKLQl9CisgICAgd2hpbGUgKFB5RGljdF9OZXh0KHN0ZS0+c3RlX3N5bWJvbHMsICZwb3MsICZuYW1lLCAmdikpIHsKKyAgICAgICAgbG9uZyBmbGFncyA9IFB5SW50X0FTX0xPTkcodik7CisgICAgICAgIGlmICghYW5hbHl6ZV9uYW1lKHN0ZSwgc2NvcGUsIG5hbWUsIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBib3VuZCwgbG9jYWwsIGZyZWUsIGdsb2JhbCkpCisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgIH0KIAotCWlmIChzdGUtPnN0ZV90eXBlICE9IENsYXNzQmxvY2spIHsKLQkJaWYgKHN0ZS0+c3RlX3R5cGUgPT0gRnVuY3Rpb25CbG9jaykgewotCQkJaWYgKFB5RGljdF9VcGRhdGUobmV3Ym91bmQsIGxvY2FsKSA8IDApCi0JCQkJZ290byBlcnJvcjsKLQkJfQotCQlpZiAoYm91bmQpIHsKLQkJCWlmIChQeURpY3RfVXBkYXRlKG5ld2JvdW5kLCBib3VuZCkgPCAwKQotCQkJCWdvdG8gZXJyb3I7Ci0JCX0KLQkJaWYgKFB5RGljdF9VcGRhdGUobmV3Z2xvYmFsLCBnbG9iYWwpIDwgMCkKLQkJCWdvdG8gZXJyb3I7Ci0JfQorICAgIGlmIChzdGUtPnN0ZV90eXBlICE9IENsYXNzQmxvY2spIHsKKyAgICAgICAgaWYgKHN0ZS0+c3RlX3R5cGUgPT0gRnVuY3Rpb25CbG9jaykgeworICAgICAgICAgICAgaWYgKFB5RGljdF9VcGRhdGUobmV3Ym91bmQsIGxvY2FsKSA8IDApCisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgICAgICBpZiAoYm91bmQpIHsKKyAgICAgICAgICAgIGlmIChQeURpY3RfVXBkYXRlKG5ld2JvdW5kLCBib3VuZCkgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgaWYgKFB5RGljdF9VcGRhdGUobmV3Z2xvYmFsLCBnbG9iYWwpIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQogCi0JLyogUmVjdXJzaXZlbHkgY2FsbCBhbmFseXplX2Jsb2NrKCkgb24gZWFjaCBjaGlsZCBibG9jay4KKyAgICAvKiBSZWN1cnNpdmVseSBjYWxsIGFuYWx5emVfYmxvY2soKSBvbiBlYWNoIGNoaWxkIGJsb2NrLgogCi0JICAgbmV3Ym91bmQsIG5ld2dsb2JhbCBub3cgY29udGFpbiB0aGUgbmFtZXMgdmlzaWJsZSBpbgotCSAgIG5lc3RlZCBibG9ja3MuICBUaGUgZnJlZSB2YXJpYWJsZXMgaW4gdGhlIGNoaWxkcmVuIHdpbGwKLQkgICBiZSBjb2xsZWN0ZWQgaW4gYWxsZnJlZS4KLQkqLwotCWFsbGZyZWUgPSBQeURpY3RfTmV3KCk7Ci0JaWYgKCFhbGxmcmVlKSAKLQkJZ290byBlcnJvcjsKLQlmb3IgKGkgPSAwOyBpIDwgUHlMaXN0X0dFVF9TSVpFKHN0ZS0+c3RlX2NoaWxkcmVuKTsgKytpKSB7Ci0JCVB5T2JqZWN0ICpjID0gUHlMaXN0X0dFVF9JVEVNKHN0ZS0+c3RlX2NoaWxkcmVuLCBpKTsKLQkJUHlTVEVudHJ5T2JqZWN0KiBlbnRyeTsKLQkJYXNzZXJ0KGMgJiYgUHlTVEVudHJ5X0NoZWNrKGMpKTsKLQkJZW50cnkgPSAoUHlTVEVudHJ5T2JqZWN0KiljOwotCQlpZiAoIWFuYWx5emVfY2hpbGRfYmxvY2soZW50cnksIG5ld2JvdW5kLCBuZXdmcmVlLCBuZXdnbG9iYWwsCi0JCQkJCSBhbGxmcmVlKSkKLQkJCWdvdG8gZXJyb3I7Ci0JCWlmIChlbnRyeS0+c3RlX2ZyZWUgfHwgZW50cnktPnN0ZV9jaGlsZF9mcmVlKQotCQkJc3RlLT5zdGVfY2hpbGRfZnJlZSA9IDE7Ci0JfQorICAgICAgIG5ld2JvdW5kLCBuZXdnbG9iYWwgbm93IGNvbnRhaW4gdGhlIG5hbWVzIHZpc2libGUgaW4KKyAgICAgICBuZXN0ZWQgYmxvY2tzLiAgVGhlIGZyZWUgdmFyaWFibGVzIGluIHRoZSBjaGlsZHJlbiB3aWxsCisgICAgICAgYmUgY29sbGVjdGVkIGluIGFsbGZyZWUuCisgICAgKi8KKyAgICBhbGxmcmVlID0gUHlEaWN0X05ldygpOworICAgIGlmICghYWxsZnJlZSkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBmb3IgKGkgPSAwOyBpIDwgUHlMaXN0X0dFVF9TSVpFKHN0ZS0+c3RlX2NoaWxkcmVuKTsgKytpKSB7CisgICAgICAgIFB5T2JqZWN0ICpjID0gUHlMaXN0X0dFVF9JVEVNKHN0ZS0+c3RlX2NoaWxkcmVuLCBpKTsKKyAgICAgICAgUHlTVEVudHJ5T2JqZWN0KiBlbnRyeTsKKyAgICAgICAgYXNzZXJ0KGMgJiYgUHlTVEVudHJ5X0NoZWNrKGMpKTsKKyAgICAgICAgZW50cnkgPSAoUHlTVEVudHJ5T2JqZWN0KiljOworICAgICAgICBpZiAoIWFuYWx5emVfY2hpbGRfYmxvY2soZW50cnksIG5ld2JvdW5kLCBuZXdmcmVlLCBuZXdnbG9iYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxmcmVlKSkKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIGlmIChlbnRyeS0+c3RlX2ZyZWUgfHwgZW50cnktPnN0ZV9jaGlsZF9mcmVlKQorICAgICAgICAgICAgc3RlLT5zdGVfY2hpbGRfZnJlZSA9IDE7CisgICAgfQogCi0JUHlEaWN0X1VwZGF0ZShuZXdmcmVlLCBhbGxmcmVlKTsKLQlpZiAoc3RlLT5zdGVfdHlwZSA9PSBGdW5jdGlvbkJsb2NrICYmICFhbmFseXplX2NlbGxzKHNjb3BlLCBuZXdmcmVlKSkKLQkJZ290byBlcnJvcjsKLQlpZiAoIXVwZGF0ZV9zeW1ib2xzKHN0ZS0+c3RlX3N5bWJvbHMsIHNjb3BlLCBib3VuZCwgbmV3ZnJlZSwKLQkJCSAgICBzdGUtPnN0ZV90eXBlID09IENsYXNzQmxvY2spKQotCQlnb3RvIGVycm9yOwotCWlmICghY2hlY2tfdW5vcHRpbWl6ZWQoc3RlKSkKLQkJZ290byBlcnJvcjsKKyAgICBQeURpY3RfVXBkYXRlKG5ld2ZyZWUsIGFsbGZyZWUpOworICAgIGlmIChzdGUtPnN0ZV90eXBlID09IEZ1bmN0aW9uQmxvY2sgJiYgIWFuYWx5emVfY2VsbHMoc2NvcGUsIG5ld2ZyZWUpKQorICAgICAgICBnb3RvIGVycm9yOworICAgIGlmICghdXBkYXRlX3N5bWJvbHMoc3RlLT5zdGVfc3ltYm9scywgc2NvcGUsIGJvdW5kLCBuZXdmcmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RlLT5zdGVfdHlwZSA9PSBDbGFzc0Jsb2NrKSkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBpZiAoIWNoZWNrX3Vub3B0aW1pemVkKHN0ZSkpCisgICAgICAgIGdvdG8gZXJyb3I7CiAKLQlpZiAoUHlEaWN0X1VwZGF0ZShmcmVlLCBuZXdmcmVlKSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0Jc3VjY2VzcyA9IDE7CisgICAgaWYgKFB5RGljdF9VcGRhdGUoZnJlZSwgbmV3ZnJlZSkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIHN1Y2Nlc3MgPSAxOwogIGVycm9yOgotCVB5X1hERUNSRUYobG9jYWwpOwotCVB5X1hERUNSRUYoc2NvcGUpOwotCVB5X1hERUNSRUYobmV3Ym91bmQpOwotCVB5X1hERUNSRUYobmV3Z2xvYmFsKTsKLQlQeV9YREVDUkVGKG5ld2ZyZWUpOwotCVB5X1hERUNSRUYoYWxsZnJlZSk7Ci0JaWYgKCFzdWNjZXNzKQotCQlhc3NlcnQoUHlFcnJfT2NjdXJyZWQoKSk7Ci0JcmV0dXJuIHN1Y2Nlc3M7CisgICAgUHlfWERFQ1JFRihsb2NhbCk7CisgICAgUHlfWERFQ1JFRihzY29wZSk7CisgICAgUHlfWERFQ1JFRihuZXdib3VuZCk7CisgICAgUHlfWERFQ1JFRihuZXdnbG9iYWwpOworICAgIFB5X1hERUNSRUYobmV3ZnJlZSk7CisgICAgUHlfWERFQ1JFRihhbGxmcmVlKTsKKyAgICBpZiAoIXN1Y2Nlc3MpCisgICAgICAgIGFzc2VydChQeUVycl9PY2N1cnJlZCgpKTsKKyAgICByZXR1cm4gc3VjY2VzczsKIH0KIAogc3RhdGljIGludAotYW5hbHl6ZV9jaGlsZF9ibG9jayhQeVNURW50cnlPYmplY3QgKmVudHJ5LCBQeU9iamVjdCAqYm91bmQsIFB5T2JqZWN0ICpmcmVlLCAKLQkJICAgIFB5T2JqZWN0ICpnbG9iYWwsIFB5T2JqZWN0KiBjaGlsZF9mcmVlKQorYW5hbHl6ZV9jaGlsZF9ibG9jayhQeVNURW50cnlPYmplY3QgKmVudHJ5LCBQeU9iamVjdCAqYm91bmQsIFB5T2JqZWN0ICpmcmVlLAorICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqZ2xvYmFsLCBQeU9iamVjdCogY2hpbGRfZnJlZSkKIHsKLQlQeU9iamVjdCAqdGVtcF9ib3VuZCA9IE5VTEwsICp0ZW1wX2dsb2JhbCA9IE5VTEwsICp0ZW1wX2ZyZWUgPSBOVUxMOworICAgIFB5T2JqZWN0ICp0ZW1wX2JvdW5kID0gTlVMTCwgKnRlbXBfZ2xvYmFsID0gTlVMTCwgKnRlbXBfZnJlZSA9IE5VTEw7CiAKLQkvKiBDb3B5IHRoZSBib3VuZCBhbmQgZ2xvYmFsIGRpY3Rpb25hcmllcy4KKyAgICAvKiBDb3B5IHRoZSBib3VuZCBhbmQgZ2xvYmFsIGRpY3Rpb25hcmllcy4KIAotCSAgIFRoZXNlIGRpY3Rpb25hcnkgYXJlIHVzZWQgYnkgYWxsIGJsb2NrcyBlbmNsb3NlZCBieSB0aGUKLQkgICBjdXJyZW50IGJsb2NrLiAgVGhlIGFuYWx5emVfYmxvY2soKSBjYWxsIG1vZGlmaWVzIHRoZXNlCi0JICAgZGljdGlvbmFyaWVzLgorICAgICAgIFRoZXNlIGRpY3Rpb25hcnkgYXJlIHVzZWQgYnkgYWxsIGJsb2NrcyBlbmNsb3NlZCBieSB0aGUKKyAgICAgICBjdXJyZW50IGJsb2NrLiAgVGhlIGFuYWx5emVfYmxvY2soKSBjYWxsIG1vZGlmaWVzIHRoZXNlCisgICAgICAgZGljdGlvbmFyaWVzLgogCi0JKi8KLQl0ZW1wX2JvdW5kID0gUHlEaWN0X05ldygpOwotCWlmICghdGVtcF9ib3VuZCkKLQkJZ290byBlcnJvcjsKLQlpZiAoUHlEaWN0X1VwZGF0ZSh0ZW1wX2JvdW5kLCBib3VuZCkgPCAwKQotCQlnb3RvIGVycm9yOwotCXRlbXBfZnJlZSA9IFB5RGljdF9OZXcoKTsKLQlpZiAoIXRlbXBfZnJlZSkKLQkJZ290byBlcnJvcjsKLQlpZiAoUHlEaWN0X1VwZGF0ZSh0ZW1wX2ZyZWUsIGZyZWUpIDwgMCkKLQkJZ290byBlcnJvcjsKLQl0ZW1wX2dsb2JhbCA9IFB5RGljdF9OZXcoKTsKLQlpZiAoIXRlbXBfZ2xvYmFsKQotCQlnb3RvIGVycm9yOwotCWlmIChQeURpY3RfVXBkYXRlKHRlbXBfZ2xvYmFsLCBnbG9iYWwpIDwgMCkKLQkJZ290byBlcnJvcjsKKyAgICAqLworICAgIHRlbXBfYm91bmQgPSBQeURpY3RfTmV3KCk7CisgICAgaWYgKCF0ZW1wX2JvdW5kKQorICAgICAgICBnb3RvIGVycm9yOworICAgIGlmIChQeURpY3RfVXBkYXRlKHRlbXBfYm91bmQsIGJvdW5kKSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgdGVtcF9mcmVlID0gUHlEaWN0X05ldygpOworICAgIGlmICghdGVtcF9mcmVlKQorICAgICAgICBnb3RvIGVycm9yOworICAgIGlmIChQeURpY3RfVXBkYXRlKHRlbXBfZnJlZSwgZnJlZSkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIHRlbXBfZ2xvYmFsID0gUHlEaWN0X05ldygpOworICAgIGlmICghdGVtcF9nbG9iYWwpCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgaWYgKFB5RGljdF9VcGRhdGUodGVtcF9nbG9iYWwsIGdsb2JhbCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOwogCi0JaWYgKCFhbmFseXplX2Jsb2NrKGVudHJ5LCB0ZW1wX2JvdW5kLCB0ZW1wX2ZyZWUsIHRlbXBfZ2xvYmFsKSkKLQkJZ290byBlcnJvcjsKLQlpZiAoUHlEaWN0X1VwZGF0ZShjaGlsZF9mcmVlLCB0ZW1wX2ZyZWUpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYodGVtcF9ib3VuZCk7Ci0JUHlfREVDUkVGKHRlbXBfZnJlZSk7Ci0JUHlfREVDUkVGKHRlbXBfZ2xvYmFsKTsKLQlyZXR1cm4gMTsKKyAgICBpZiAoIWFuYWx5emVfYmxvY2soZW50cnksIHRlbXBfYm91bmQsIHRlbXBfZnJlZSwgdGVtcF9nbG9iYWwpKQorICAgICAgICBnb3RvIGVycm9yOworICAgIGlmIChQeURpY3RfVXBkYXRlKGNoaWxkX2ZyZWUsIHRlbXBfZnJlZSkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih0ZW1wX2JvdW5kKTsKKyAgICBQeV9ERUNSRUYodGVtcF9mcmVlKTsKKyAgICBQeV9ERUNSRUYodGVtcF9nbG9iYWwpOworICAgIHJldHVybiAxOwogIGVycm9yOgotCVB5X1hERUNSRUYodGVtcF9ib3VuZCk7Ci0JUHlfWERFQ1JFRih0ZW1wX2ZyZWUpOwotCVB5X1hERUNSRUYodGVtcF9nbG9iYWwpOwotCXJldHVybiAwOworICAgIFB5X1hERUNSRUYodGVtcF9ib3VuZCk7CisgICAgUHlfWERFQ1JFRih0ZW1wX2ZyZWUpOworICAgIFB5X1hERUNSRUYodGVtcF9nbG9iYWwpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBzeW10YWJsZV9hbmFseXplKHN0cnVjdCBzeW10YWJsZSAqc3QpCiB7Ci0JUHlPYmplY3QgKmZyZWUsICpnbG9iYWw7Ci0JaW50IHI7CisgICAgUHlPYmplY3QgKmZyZWUsICpnbG9iYWw7CisgICAgaW50IHI7CiAKLQlmcmVlID0gUHlEaWN0X05ldygpOwotCWlmICghZnJlZSkKLQkgICAgcmV0dXJuIDA7Ci0JZ2xvYmFsID0gUHlEaWN0X05ldygpOwotCWlmICghZ2xvYmFsKSB7Ci0JICAgIFB5X0RFQ1JFRihmcmVlKTsKLQkgICAgcmV0dXJuIDA7Ci0JfQotCXIgPSBhbmFseXplX2Jsb2NrKHN0LT5zdF90b3AsIE5VTEwsIGZyZWUsIGdsb2JhbCk7Ci0JUHlfREVDUkVGKGZyZWUpOwotCVB5X0RFQ1JFRihnbG9iYWwpOwotCXJldHVybiByOworICAgIGZyZWUgPSBQeURpY3RfTmV3KCk7CisgICAgaWYgKCFmcmVlKQorICAgICAgICByZXR1cm4gMDsKKyAgICBnbG9iYWwgPSBQeURpY3RfTmV3KCk7CisgICAgaWYgKCFnbG9iYWwpIHsKKyAgICAgICAgUHlfREVDUkVGKGZyZWUpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgciA9IGFuYWx5emVfYmxvY2soc3QtPnN0X3RvcCwgTlVMTCwgZnJlZSwgZ2xvYmFsKTsKKyAgICBQeV9ERUNSRUYoZnJlZSk7CisgICAgUHlfREVDUkVGKGdsb2JhbCk7CisgICAgcmV0dXJuIHI7CiB9CiAKIAogc3RhdGljIGludAogc3ltdGFibGVfd2FybihzdHJ1Y3Qgc3ltdGFibGUgKnN0LCBjaGFyICptc2csIGludCBsaW5lbm8pCiB7Ci0JaWYgKFB5RXJyX1dhcm5FeHBsaWNpdChQeUV4Y19TeW50YXhXYXJuaW5nLCBtc2csIHN0LT5zdF9maWxlbmFtZSwKLQkJCSAgICAgICBsaW5lbm8sIE5VTEwsIE5VTEwpIDwgMCkJewotCQlpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19TeW50YXhXYXJuaW5nKSkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5bnRheEVycm9yLCBtc2cpOwotCQkJUHlFcnJfU3ludGF4TG9jYXRpb24oc3QtPnN0X2ZpbGVuYW1lLCAKLQkJCQkJICAgICBzdC0+c3RfY3VyLT5zdGVfbGluZW5vKTsKLQkJfQotCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIDE7CisgICAgaWYgKFB5RXJyX1dhcm5FeHBsaWNpdChQeUV4Y19TeW50YXhXYXJuaW5nLCBtc2csIHN0LT5zdF9maWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVubywgTlVMTCwgTlVMTCkgPCAwKSAgICAgeworICAgICAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19TeW50YXhXYXJuaW5nKSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5bnRheEVycm9yLCBtc2cpOworICAgICAgICAgICAgUHlFcnJfU3ludGF4TG9jYXRpb24oc3QtPnN0X2ZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3QtPnN0X2N1ci0+c3RlX2xpbmVubyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAxOwogfQogCiAvKiBzeW10YWJsZV9lbnRlcl9ibG9jaygpIGdldHMgYSByZWZlcmVuY2UgdmlhIHN0ZV9uZXcuCkBAIC04MTQsNjk5ICs4MTQsNjk5IEBACiBzdGF0aWMgaW50CiBzeW10YWJsZV9leGl0X2Jsb2NrKHN0cnVjdCBzeW10YWJsZSAqc3QsIHZvaWQgKmFzdCkKIHsKLQlQeV9zc2l6ZV90IGVuZDsKKyAgICBQeV9zc2l6ZV90IGVuZDsKIAotCVB5X0NMRUFSKHN0LT5zdF9jdXIpOwotCWVuZCA9IFB5TGlzdF9HRVRfU0laRShzdC0+c3Rfc3RhY2spIC0gMTsKLQlpZiAoZW5kID49IDApIHsKLQkJc3QtPnN0X2N1ciA9IChQeVNURW50cnlPYmplY3QgKilQeUxpc3RfR0VUX0lURU0oc3QtPnN0X3N0YWNrLCAKLQkJCQkJCQkJZW5kKTsKLQkJaWYgKHN0LT5zdF9jdXIgPT0gTlVMTCkKLQkJCXJldHVybiAwOwotCQlQeV9JTkNSRUYoc3QtPnN0X2N1cik7Ci0JCWlmIChQeVNlcXVlbmNlX0RlbEl0ZW0oc3QtPnN0X3N0YWNrLCBlbmQpIDwgMCkKLQkJCXJldHVybiAwOwotCX0KLQlyZXR1cm4gMTsKKyAgICBQeV9DTEVBUihzdC0+c3RfY3VyKTsKKyAgICBlbmQgPSBQeUxpc3RfR0VUX1NJWkUoc3QtPnN0X3N0YWNrKSAtIDE7CisgICAgaWYgKGVuZCA+PSAwKSB7CisgICAgICAgIHN0LT5zdF9jdXIgPSAoUHlTVEVudHJ5T2JqZWN0ICopUHlMaXN0X0dFVF9JVEVNKHN0LT5zdF9zdGFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kKTsKKyAgICAgICAgaWYgKHN0LT5zdF9jdXIgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBQeV9JTkNSRUYoc3QtPnN0X2N1cik7CisgICAgICAgIGlmIChQeVNlcXVlbmNlX0RlbEl0ZW0oc3QtPnN0X3N0YWNrLCBlbmQpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIGludAotc3ltdGFibGVfZW50ZXJfYmxvY2soc3RydWN0IHN5bXRhYmxlICpzdCwgaWRlbnRpZmllciBuYW1lLCBfUHlfYmxvY2tfdHkgYmxvY2ssIAotCQkgICAgIHZvaWQgKmFzdCwgaW50IGxpbmVubykKK3N5bXRhYmxlX2VudGVyX2Jsb2NrKHN0cnVjdCBzeW10YWJsZSAqc3QsIGlkZW50aWZpZXIgbmFtZSwgX1B5X2Jsb2NrX3R5IGJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYXN0LCBpbnQgbGluZW5vKQogewotCVB5U1RFbnRyeU9iamVjdCAqcHJldiA9IE5VTEw7CisgICAgUHlTVEVudHJ5T2JqZWN0ICpwcmV2ID0gTlVMTDsKIAotCWlmIChzdC0+c3RfY3VyKSB7Ci0JCXByZXYgPSBzdC0+c3RfY3VyOwotCQlpZiAoUHlMaXN0X0FwcGVuZChzdC0+c3Rfc3RhY2ssIChQeU9iamVjdCAqKXN0LT5zdF9jdXIpIDwgMCkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJUHlfREVDUkVGKHN0LT5zdF9jdXIpOwotCX0KLQlzdC0+c3RfY3VyID0gc3RlX25ldyhzdCwgbmFtZSwgYmxvY2ssIGFzdCwgbGluZW5vKTsKLQlpZiAoc3QtPnN0X2N1ciA9PSBOVUxMKQotCQlyZXR1cm4gMDsKLQlpZiAobmFtZSA9PSBHRVRfSURFTlRJRklFUih0b3ApKQotCQlzdC0+c3RfZ2xvYmFsID0gc3QtPnN0X2N1ci0+c3RlX3N5bWJvbHM7Ci0JaWYgKHByZXYpIHsKLQkJaWYgKFB5TGlzdF9BcHBlbmQocHJldi0+c3RlX2NoaWxkcmVuLCAKLQkJCQkgIChQeU9iamVjdCAqKXN0LT5zdF9jdXIpIDwgMCkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0JcmV0dXJuIDE7CisgICAgaWYgKHN0LT5zdF9jdXIpIHsKKyAgICAgICAgcHJldiA9IHN0LT5zdF9jdXI7CisgICAgICAgIGlmIChQeUxpc3RfQXBwZW5kKHN0LT5zdF9zdGFjaywgKFB5T2JqZWN0ICopc3QtPnN0X2N1cikgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBQeV9ERUNSRUYoc3QtPnN0X2N1cik7CisgICAgfQorICAgIHN0LT5zdF9jdXIgPSBzdGVfbmV3KHN0LCBuYW1lLCBibG9jaywgYXN0LCBsaW5lbm8pOworICAgIGlmIChzdC0+c3RfY3VyID09IE5VTEwpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChuYW1lID09IEdFVF9JREVOVElGSUVSKHRvcCkpCisgICAgICAgIHN0LT5zdF9nbG9iYWwgPSBzdC0+c3RfY3VyLT5zdGVfc3ltYm9sczsKKyAgICBpZiAocHJldikgeworICAgICAgICBpZiAoUHlMaXN0X0FwcGVuZChwcmV2LT5zdGVfY2hpbGRyZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIChQeU9iamVjdCAqKXN0LT5zdF9jdXIpIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyBsb25nCiBzeW10YWJsZV9sb29rdXAoc3RydWN0IHN5bXRhYmxlICpzdCwgUHlPYmplY3QgKm5hbWUpCiB7Ci0JUHlPYmplY3QgKm87Ci0JUHlPYmplY3QgKm1hbmdsZWQgPSBfUHlfTWFuZ2xlKHN0LT5zdF9wcml2YXRlLCBuYW1lKTsKLQlpZiAoIW1hbmdsZWQpCi0JCXJldHVybiAwOwotCW8gPSBQeURpY3RfR2V0SXRlbShzdC0+c3RfY3VyLT5zdGVfc3ltYm9scywgbWFuZ2xlZCk7Ci0JUHlfREVDUkVGKG1hbmdsZWQpOwotCWlmICghbykKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIFB5SW50X0FzTG9uZyhvKTsKKyAgICBQeU9iamVjdCAqbzsKKyAgICBQeU9iamVjdCAqbWFuZ2xlZCA9IF9QeV9NYW5nbGUoc3QtPnN0X3ByaXZhdGUsIG5hbWUpOworICAgIGlmICghbWFuZ2xlZCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgbyA9IFB5RGljdF9HZXRJdGVtKHN0LT5zdF9jdXItPnN0ZV9zeW1ib2xzLCBtYW5nbGVkKTsKKyAgICBQeV9ERUNSRUYobWFuZ2xlZCk7CisgICAgaWYgKCFvKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gUHlJbnRfQXNMb25nKG8pOwogfQogCiBzdGF0aWMgaW50Ci1zeW10YWJsZV9hZGRfZGVmKHN0cnVjdCBzeW10YWJsZSAqc3QsIFB5T2JqZWN0ICpuYW1lLCBpbnQgZmxhZykgCitzeW10YWJsZV9hZGRfZGVmKHN0cnVjdCBzeW10YWJsZSAqc3QsIFB5T2JqZWN0ICpuYW1lLCBpbnQgZmxhZykKIHsKLQlQeU9iamVjdCAqbzsKLQlQeU9iamVjdCAqZGljdDsKLQlsb25nIHZhbDsKLQlQeU9iamVjdCAqbWFuZ2xlZCA9IF9QeV9NYW5nbGUoc3QtPnN0X3ByaXZhdGUsIG5hbWUpOworICAgIFB5T2JqZWN0ICpvOworICAgIFB5T2JqZWN0ICpkaWN0OworICAgIGxvbmcgdmFsOworICAgIFB5T2JqZWN0ICptYW5nbGVkID0gX1B5X01hbmdsZShzdC0+c3RfcHJpdmF0ZSwgbmFtZSk7CiAKLQlpZiAoIW1hbmdsZWQpCi0JCXJldHVybiAwOwotCWRpY3QgPSBzdC0+c3RfY3VyLT5zdGVfc3ltYm9sczsKLQlpZiAoKG8gPSBQeURpY3RfR2V0SXRlbShkaWN0LCBtYW5nbGVkKSkpIHsKLQkgICAgdmFsID0gUHlJbnRfQVNfTE9ORyhvKTsKLQkgICAgaWYgKChmbGFnICYgREVGX1BBUkFNKSAmJiAodmFsICYgREVGX1BBUkFNKSkgewotCQkgICAgLyogSXMgaXQgYmV0dGVyIHRvIHVzZSAnbWFuZ2xlZCcgb3IgJ25hbWUnIGhlcmU/ICovCi0JCSAgICBQeUVycl9Gb3JtYXQoUHlFeGNfU3ludGF4RXJyb3IsIERVUExJQ0FURV9BUkdVTUVOVCwKLQkJCQkgUHlTdHJpbmdfQXNTdHJpbmcobmFtZSkpOwotCQkgICAgUHlFcnJfU3ludGF4TG9jYXRpb24oc3QtPnN0X2ZpbGVuYW1lLAotCQkJCSAgICAgICBzdC0+c3RfY3VyLT5zdGVfbGluZW5vKTsKLQkJICAgIGdvdG8gZXJyb3I7Ci0JICAgIH0KLQkgICAgdmFsIHw9IGZsYWc7Ci0JfSBlbHNlCi0JICAgIHZhbCA9IGZsYWc7Ci0JbyA9IFB5SW50X0Zyb21Mb25nKHZhbCk7CisgICAgaWYgKCFtYW5nbGVkKQorICAgICAgICByZXR1cm4gMDsKKyAgICBkaWN0ID0gc3QtPnN0X2N1ci0+c3RlX3N5bWJvbHM7CisgICAgaWYgKChvID0gUHlEaWN0X0dldEl0ZW0oZGljdCwgbWFuZ2xlZCkpKSB7CisgICAgICAgIHZhbCA9IFB5SW50X0FTX0xPTkcobyk7CisgICAgICAgIGlmICgoZmxhZyAmIERFRl9QQVJBTSkgJiYgKHZhbCAmIERFRl9QQVJBTSkpIHsKKyAgICAgICAgICAgIC8qIElzIGl0IGJldHRlciB0byB1c2UgJ21hbmdsZWQnIG9yICduYW1lJyBoZXJlPyAqLworICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1N5bnRheEVycm9yLCBEVVBMSUNBVEVfQVJHVU1FTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQXNTdHJpbmcobmFtZSkpOworICAgICAgICAgICAgUHlFcnJfU3ludGF4TG9jYXRpb24oc3QtPnN0X2ZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0LT5zdF9jdXItPnN0ZV9saW5lbm8pOworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgICAgICB2YWwgfD0gZmxhZzsKKyAgICB9IGVsc2UKKyAgICAgICAgdmFsID0gZmxhZzsKKyAgICBvID0gUHlJbnRfRnJvbUxvbmcodmFsKTsKKyAgICBpZiAobyA9PSBOVUxMKQorICAgICAgICBnb3RvIGVycm9yOworICAgIGlmIChQeURpY3RfU2V0SXRlbShkaWN0LCBtYW5nbGVkLCBvKSA8IDApIHsKKyAgICAgICAgUHlfREVDUkVGKG8pOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgICBQeV9ERUNSRUYobyk7CisKKyAgICBpZiAoZmxhZyAmIERFRl9QQVJBTSkgeworICAgICAgICBpZiAoUHlMaXN0X0FwcGVuZChzdC0+c3RfY3VyLT5zdGVfdmFybmFtZXMsIG1hbmdsZWQpIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfSBlbHNlICAgICAgaWYgKGZsYWcgJiBERUZfR0xPQkFMKSB7CisgICAgICAgIC8qIFhYWCBuZWVkIHRvIHVwZGF0ZSBERUZfR0xPQkFMIGZvciBvdGhlciBmbGFncyB0b287CisgICAgICAgICAgIHBlcmhhcHMgb25seSBERUZfRlJFRV9HTE9CQUwgKi8KKyAgICAgICAgdmFsID0gZmxhZzsKKyAgICAgICAgaWYgKChvID0gUHlEaWN0X0dldEl0ZW0oc3QtPnN0X2dsb2JhbCwgbWFuZ2xlZCkpKSB7CisgICAgICAgICAgICB2YWwgfD0gUHlJbnRfQVNfTE9ORyhvKTsKKyAgICAgICAgfQorICAgICAgICBvID0gUHlJbnRfRnJvbUxvbmcodmFsKTsKICAgICAgICAgaWYgKG8gPT0gTlVMTCkKLQkgICAgZ290byBlcnJvcjsKLQlpZiAoUHlEaWN0X1NldEl0ZW0oZGljdCwgbWFuZ2xlZCwgbykgPCAwKSB7Ci0JCVB5X0RFQ1JFRihvKTsKLQkJZ290byBlcnJvcjsKLQl9Ci0JUHlfREVDUkVGKG8pOwotCi0JaWYgKGZsYWcgJiBERUZfUEFSQU0pIHsKLQkJaWYgKFB5TGlzdF9BcHBlbmQoc3QtPnN0X2N1ci0+c3RlX3Zhcm5hbWVzLCBtYW5nbGVkKSA8IDApCi0JCQlnb3RvIGVycm9yOwotCX0gZWxzZQlpZiAoZmxhZyAmIERFRl9HTE9CQUwpIHsKLQkJLyogWFhYIG5lZWQgdG8gdXBkYXRlIERFRl9HTE9CQUwgZm9yIG90aGVyIGZsYWdzIHRvbzsKLQkJICAgcGVyaGFwcyBvbmx5IERFRl9GUkVFX0dMT0JBTCAqLwotCQl2YWwgPSBmbGFnOwotCQlpZiAoKG8gPSBQeURpY3RfR2V0SXRlbShzdC0+c3RfZ2xvYmFsLCBtYW5nbGVkKSkpIHsKLQkJCXZhbCB8PSBQeUludF9BU19MT05HKG8pOwotCQl9Ci0JCW8gPSBQeUludF9Gcm9tTG9uZyh2YWwpOwotCQlpZiAobyA9PSBOVUxMKQotCQkJZ290byBlcnJvcjsKLQkJaWYgKFB5RGljdF9TZXRJdGVtKHN0LT5zdF9nbG9iYWwsIG1hbmdsZWQsIG8pIDwgMCkgewotCQkJUHlfREVDUkVGKG8pOwotCQkJZ290byBlcnJvcjsKLQkJfQotCQlQeV9ERUNSRUYobyk7Ci0JfQotCVB5X0RFQ1JFRihtYW5nbGVkKTsKLQlyZXR1cm4gMTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbShzdC0+c3RfZ2xvYmFsLCBtYW5nbGVkLCBvKSA8IDApIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihvKTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgUHlfREVDUkVGKG8pOworICAgIH0KKyAgICBQeV9ERUNSRUYobWFuZ2xlZCk7CisgICAgcmV0dXJuIDE7CiAKIGVycm9yOgotCVB5X0RFQ1JFRihtYW5nbGVkKTsKLQlyZXR1cm4gMDsKKyAgICBQeV9ERUNSRUYobWFuZ2xlZCk7CisgICAgcmV0dXJuIDA7CiB9CiAKIC8qIFZJU0lULCBWSVNJVF9TRVEgYW5kIFZJU1RfU0VRX1RBSUwgdGFrZSBhbiBBU0RMIHR5cGUgYXMgdGhlaXIgc2Vjb25kIGFyZ3VtZW50LgogICAgVGhleSB1c2UgdGhlIEFTREwgbmFtZSB0byBzeW50aGVzaXplIHRoZSBuYW1lIG9mIHRoZSBDIHR5cGUgYW5kIHRoZSB2aXNpdAotICAgZnVuY3Rpb24uIAotICAgCisgICBmdW5jdGlvbi4KKwogICAgVklTSVRfU0VRX1RBSUwgcGVybWl0cyB0aGUgc3RhcnQgb2YgYW4gQVNETCBzZXF1ZW5jZSB0byBiZSBza2lwcGVkLCB3aGljaCBpcwogICAgdXNlZnVsIGlmIHRoZSBmaXJzdCBub2RlIGluIHRoZSBzZXF1ZW5jZSByZXF1aXJlcyBzcGVjaWFsIHRyZWF0bWVudC4KICovCiAKICNkZWZpbmUgVklTSVQoU1QsIFRZUEUsIFYpIFwKLQlpZiAoIXN5bXRhYmxlX3Zpc2l0XyAjIyBUWVBFKChTVCksIChWKSkpIFwKLQkJcmV0dXJuIDA7IAorICAgIGlmICghc3ltdGFibGVfdmlzaXRfICMjIFRZUEUoKFNUKSwgKFYpKSkgXAorICAgICAgICByZXR1cm4gMDsKIAogI2RlZmluZSBWSVNJVF9JTl9CTE9DSyhTVCwgVFlQRSwgViwgUykgXAotCWlmICghc3ltdGFibGVfdmlzaXRfICMjIFRZUEUoKFNUKSwgKFYpKSkgeyBcCi0JCXN5bXRhYmxlX2V4aXRfYmxvY2soKFNUKSwgKFMpKTsgXAotCQlyZXR1cm4gMDsgXAotCX0KKyAgICBpZiAoIXN5bXRhYmxlX3Zpc2l0XyAjIyBUWVBFKChTVCksIChWKSkpIHsgXAorICAgICAgICBzeW10YWJsZV9leGl0X2Jsb2NrKChTVCksIChTKSk7IFwKKyAgICAgICAgcmV0dXJuIDA7IFwKKyAgICB9CiAKICNkZWZpbmUgVklTSVRfU0VRKFNULCBUWVBFLCBTRVEpIHsgXAotCWludCBpOyBcCi0JYXNkbF9zZXEgKnNlcSA9IChTRVEpOyAvKiBhdm9pZCB2YXJpYWJsZSBjYXB0dXJlICovIFwKLQlmb3IgKGkgPSAwOyBpIDwgYXNkbF9zZXFfTEVOKHNlcSk7IGkrKykgeyBcCi0JCVRZUEUgIyMgX3R5IGVsdCA9IChUWVBFICMjIF90eSlhc2RsX3NlcV9HRVQoc2VxLCBpKTsgXAotCQlpZiAoIXN5bXRhYmxlX3Zpc2l0XyAjIyBUWVBFKChTVCksIGVsdCkpIFwKLQkJCXJldHVybiAwOyBcCi0JfSBcCisgICAgaW50IGk7IFwKKyAgICBhc2RsX3NlcSAqc2VxID0gKFNFUSk7IC8qIGF2b2lkIHZhcmlhYmxlIGNhcHR1cmUgKi8gXAorICAgIGZvciAoaSA9IDA7IGkgPCBhc2RsX3NlcV9MRU4oc2VxKTsgaSsrKSB7IFwKKyAgICAgICAgVFlQRSAjIyBfdHkgZWx0ID0gKFRZUEUgIyMgX3R5KWFzZGxfc2VxX0dFVChzZXEsIGkpOyBcCisgICAgICAgIGlmICghc3ltdGFibGVfdmlzaXRfICMjIFRZUEUoKFNUKSwgZWx0KSkgXAorICAgICAgICAgICAgcmV0dXJuIDA7IFwKKyAgICB9IFwKIH0KIAogI2RlZmluZSBWSVNJVF9TRVFfSU5fQkxPQ0soU1QsIFRZUEUsIFNFUSwgUykgeyBcCi0JaW50IGk7IFwKLQlhc2RsX3NlcSAqc2VxID0gKFNFUSk7IC8qIGF2b2lkIHZhcmlhYmxlIGNhcHR1cmUgKi8gXAotCWZvciAoaSA9IDA7IGkgPCBhc2RsX3NlcV9MRU4oc2VxKTsgaSsrKSB7IFwKLQkJVFlQRSAjIyBfdHkgZWx0ID0gKFRZUEUgIyMgX3R5KWFzZGxfc2VxX0dFVChzZXEsIGkpOyBcCi0JCWlmICghc3ltdGFibGVfdmlzaXRfICMjIFRZUEUoKFNUKSwgZWx0KSkgeyBcCi0JCQlzeW10YWJsZV9leGl0X2Jsb2NrKChTVCksIChTKSk7IFwKLQkJCXJldHVybiAwOyBcCi0JCX0gXAotCX0gXAorICAgIGludCBpOyBcCisgICAgYXNkbF9zZXEgKnNlcSA9IChTRVEpOyAvKiBhdm9pZCB2YXJpYWJsZSBjYXB0dXJlICovIFwKKyAgICBmb3IgKGkgPSAwOyBpIDwgYXNkbF9zZXFfTEVOKHNlcSk7IGkrKykgeyBcCisgICAgICAgIFRZUEUgIyMgX3R5IGVsdCA9IChUWVBFICMjIF90eSlhc2RsX3NlcV9HRVQoc2VxLCBpKTsgXAorICAgICAgICBpZiAoIXN5bXRhYmxlX3Zpc2l0XyAjIyBUWVBFKChTVCksIGVsdCkpIHsgXAorICAgICAgICAgICAgc3ltdGFibGVfZXhpdF9ibG9jaygoU1QpLCAoUykpOyBcCisgICAgICAgICAgICByZXR1cm4gMDsgXAorICAgICAgICB9IFwKKyAgICB9IFwKIH0KIAogI2RlZmluZSBWSVNJVF9TRVFfVEFJTChTVCwgVFlQRSwgU0VRLCBTVEFSVCkgeyBcCi0JaW50IGk7IFwKLQlhc2RsX3NlcSAqc2VxID0gKFNFUSk7IC8qIGF2b2lkIHZhcmlhYmxlIGNhcHR1cmUgKi8gXAotCWZvciAoaSA9IChTVEFSVCk7IGkgPCBhc2RsX3NlcV9MRU4oc2VxKTsgaSsrKSB7IFwKLQkJVFlQRSAjIyBfdHkgZWx0ID0gKFRZUEUgIyMgX3R5KWFzZGxfc2VxX0dFVChzZXEsIGkpOyBcCi0JCWlmICghc3ltdGFibGVfdmlzaXRfICMjIFRZUEUoKFNUKSwgZWx0KSkgXAotCQkJcmV0dXJuIDA7IFwKLQl9IFwKKyAgICBpbnQgaTsgXAorICAgIGFzZGxfc2VxICpzZXEgPSAoU0VRKTsgLyogYXZvaWQgdmFyaWFibGUgY2FwdHVyZSAqLyBcCisgICAgZm9yIChpID0gKFNUQVJUKTsgaSA8IGFzZGxfc2VxX0xFTihzZXEpOyBpKyspIHsgXAorICAgICAgICBUWVBFICMjIF90eSBlbHQgPSAoVFlQRSAjIyBfdHkpYXNkbF9zZXFfR0VUKHNlcSwgaSk7IFwKKyAgICAgICAgaWYgKCFzeW10YWJsZV92aXNpdF8gIyMgVFlQRSgoU1QpLCBlbHQpKSBcCisgICAgICAgICAgICByZXR1cm4gMDsgXAorICAgIH0gXAogfQogCiAjZGVmaW5lIFZJU0lUX1NFUV9UQUlMX0lOX0JMT0NLKFNULCBUWVBFLCBTRVEsIFNUQVJULCBTKSB7IFwKLQlpbnQgaTsgXAotCWFzZGxfc2VxICpzZXEgPSAoU0VRKTsgLyogYXZvaWQgdmFyaWFibGUgY2FwdHVyZSAqLyBcCi0JZm9yIChpID0gKFNUQVJUKTsgaSA8IGFzZGxfc2VxX0xFTihzZXEpOyBpKyspIHsgXAotCQlUWVBFICMjIF90eSBlbHQgPSAoVFlQRSAjIyBfdHkpYXNkbF9zZXFfR0VUKHNlcSwgaSk7IFwKLQkJaWYgKCFzeW10YWJsZV92aXNpdF8gIyMgVFlQRSgoU1QpLCBlbHQpKSB7IFwKLQkJCXN5bXRhYmxlX2V4aXRfYmxvY2soKFNUKSwgKFMpKTsgXAotCQkJcmV0dXJuIDA7IFwKLQkJfSBcCi0JfSBcCisgICAgaW50IGk7IFwKKyAgICBhc2RsX3NlcSAqc2VxID0gKFNFUSk7IC8qIGF2b2lkIHZhcmlhYmxlIGNhcHR1cmUgKi8gXAorICAgIGZvciAoaSA9IChTVEFSVCk7IGkgPCBhc2RsX3NlcV9MRU4oc2VxKTsgaSsrKSB7IFwKKyAgICAgICAgVFlQRSAjIyBfdHkgZWx0ID0gKFRZUEUgIyMgX3R5KWFzZGxfc2VxX0dFVChzZXEsIGkpOyBcCisgICAgICAgIGlmICghc3ltdGFibGVfdmlzaXRfICMjIFRZUEUoKFNUKSwgZWx0KSkgeyBcCisgICAgICAgICAgICBzeW10YWJsZV9leGl0X2Jsb2NrKChTVCksIChTKSk7IFwKKyAgICAgICAgICAgIHJldHVybiAwOyBcCisgICAgICAgIH0gXAorICAgIH0gXAogfQogCiBzdGF0aWMgaW50CiBzeW10YWJsZV9uZXdfdG1wbmFtZShzdHJ1Y3Qgc3ltdGFibGUgKnN0KQogewotCWNoYXIgdG1wbmFtZVsyNTZdOwotCWlkZW50aWZpZXIgdG1wOworICAgIGNoYXIgdG1wbmFtZVsyNTZdOworICAgIGlkZW50aWZpZXIgdG1wOwogCi0JUHlPU19zbnByaW50Zih0bXBuYW1lLCBzaXplb2YodG1wbmFtZSksICJfWyVkXSIsCi0JCSAgICAgICsrc3QtPnN0X2N1ci0+c3RlX3RtcG5hbWUpOwotCXRtcCA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcodG1wbmFtZSk7Ci0JaWYgKCF0bXApCi0JCXJldHVybiAwOwotCWlmICghc3ltdGFibGVfYWRkX2RlZihzdCwgdG1wLCBERUZfTE9DQUwpKQotCQlyZXR1cm4gMDsKLQlQeV9ERUNSRUYodG1wKTsKLQlyZXR1cm4gMTsKKyAgICBQeU9TX3NucHJpbnRmKHRtcG5hbWUsIHNpemVvZih0bXBuYW1lKSwgIl9bJWRdIiwKKyAgICAgICAgICAgICAgICAgICsrc3QtPnN0X2N1ci0+c3RlX3RtcG5hbWUpOworICAgIHRtcCA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcodG1wbmFtZSk7CisgICAgaWYgKCF0bXApCisgICAgICAgIHJldHVybiAwOworICAgIGlmICghc3ltdGFibGVfYWRkX2RlZihzdCwgdG1wLCBERUZfTE9DQUwpKQorICAgICAgICByZXR1cm4gMDsKKyAgICBQeV9ERUNSRUYodG1wKTsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIGludAogc3ltdGFibGVfdmlzaXRfc3RtdChzdHJ1Y3Qgc3ltdGFibGUgKnN0LCBzdG10X3R5IHMpCiB7Ci0Jc3dpdGNoIChzLT5raW5kKSB7Ci0gICAgICAgIGNhc2UgRnVuY3Rpb25EZWZfa2luZDoKLQkJaWYgKCFzeW10YWJsZV9hZGRfZGVmKHN0LCBzLT52LkZ1bmN0aW9uRGVmLm5hbWUsIERFRl9MT0NBTCkpCi0JCQlyZXR1cm4gMDsKLQkJaWYgKHMtPnYuRnVuY3Rpb25EZWYuYXJncy0+ZGVmYXVsdHMpCi0JCQlWSVNJVF9TRVEoc3QsIGV4cHIsIHMtPnYuRnVuY3Rpb25EZWYuYXJncy0+ZGVmYXVsdHMpOwotCQlpZiAocy0+di5GdW5jdGlvbkRlZi5kZWNvcmF0b3JfbGlzdCkKLQkJCVZJU0lUX1NFUShzdCwgZXhwciwgcy0+di5GdW5jdGlvbkRlZi5kZWNvcmF0b3JfbGlzdCk7Ci0JCWlmICghc3ltdGFibGVfZW50ZXJfYmxvY2soc3QsIHMtPnYuRnVuY3Rpb25EZWYubmFtZSwgCi0JCQkJCSAgRnVuY3Rpb25CbG9jaywgKHZvaWQgKilzLCBzLT5saW5lbm8pKQotCQkJcmV0dXJuIDA7Ci0JCVZJU0lUX0lOX0JMT0NLKHN0LCBhcmd1bWVudHMsIHMtPnYuRnVuY3Rpb25EZWYuYXJncywgcyk7Ci0JCVZJU0lUX1NFUV9JTl9CTE9DSyhzdCwgc3RtdCwgcy0+di5GdW5jdGlvbkRlZi5ib2R5LCBzKTsKLQkJaWYgKCFzeW10YWJsZV9leGl0X2Jsb2NrKHN0LCBzKSkKLQkJCXJldHVybiAwOwotCQlicmVhazsKLSAgICAgICAgY2FzZSBDbGFzc0RlZl9raW5kOiB7Ci0JCVB5T2JqZWN0ICp0bXA7Ci0JCWlmICghc3ltdGFibGVfYWRkX2RlZihzdCwgcy0+di5DbGFzc0RlZi5uYW1lLCBERUZfTE9DQUwpKQotCQkJcmV0dXJuIDA7Ci0JCVZJU0lUX1NFUShzdCwgZXhwciwgcy0+di5DbGFzc0RlZi5iYXNlcyk7Ci0JCWlmIChzLT52LkNsYXNzRGVmLmRlY29yYXRvcl9saXN0KQotCQkJVklTSVRfU0VRKHN0LCBleHByLCBzLT52LkNsYXNzRGVmLmRlY29yYXRvcl9saXN0KTsKLQkJaWYgKCFzeW10YWJsZV9lbnRlcl9ibG9jayhzdCwgcy0+di5DbGFzc0RlZi5uYW1lLCBDbGFzc0Jsb2NrLCAKLQkJCQkJICAodm9pZCAqKXMsIHMtPmxpbmVubykpCi0JCQlyZXR1cm4gMDsKLQkJdG1wID0gc3QtPnN0X3ByaXZhdGU7Ci0JCXN0LT5zdF9wcml2YXRlID0gcy0+di5DbGFzc0RlZi5uYW1lOwotCQlWSVNJVF9TRVFfSU5fQkxPQ0soc3QsIHN0bXQsIHMtPnYuQ2xhc3NEZWYuYm9keSwgcyk7Ci0JCXN0LT5zdF9wcml2YXRlID0gdG1wOwotCQlpZiAoIXN5bXRhYmxlX2V4aXRfYmxvY2soc3QsIHMpKQotCQkJcmV0dXJuIDA7Ci0JCWJyZWFrOwotCX0KLSAgICAgICAgY2FzZSBSZXR1cm5fa2luZDoKLQkJaWYgKHMtPnYuUmV0dXJuLnZhbHVlKSB7Ci0JCQlWSVNJVChzdCwgZXhwciwgcy0+di5SZXR1cm4udmFsdWUpOwotCQkJc3QtPnN0X2N1ci0+c3RlX3JldHVybnNfdmFsdWUgPSAxOwotCQkJaWYgKHN0LT5zdF9jdXItPnN0ZV9nZW5lcmF0b3IpIHsKLQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3ludGF4RXJyb3IsCi0JCQkJCVJFVFVSTl9WQUxfSU5fR0VORVJBVE9SKTsKLQkJCSAgICAgICAgUHlFcnJfU3ludGF4TG9jYXRpb24oc3QtPnN0X2ZpbGVuYW1lLAotCQkJCSAgICAgICAgICAgICBzLT5saW5lbm8pOwotCQkJCXJldHVybiAwOwotCQkJfQotCQl9Ci0JCWJyZWFrOwotICAgICAgICBjYXNlIERlbGV0ZV9raW5kOgotCQlWSVNJVF9TRVEoc3QsIGV4cHIsIHMtPnYuRGVsZXRlLnRhcmdldHMpOwotCQlicmVhazsKLSAgICAgICAgY2FzZSBBc3NpZ25fa2luZDoKLQkJVklTSVRfU0VRKHN0LCBleHByLCBzLT52LkFzc2lnbi50YXJnZXRzKTsKLQkJVklTSVQoc3QsIGV4cHIsIHMtPnYuQXNzaWduLnZhbHVlKTsKLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgQXVnQXNzaWduX2tpbmQ6Ci0JCVZJU0lUKHN0LCBleHByLCBzLT52LkF1Z0Fzc2lnbi50YXJnZXQpOwotCQlWSVNJVChzdCwgZXhwciwgcy0+di5BdWdBc3NpZ24udmFsdWUpOwotCQlicmVhazsKLSAgICAgICAgY2FzZSBQcmludF9raW5kOgotCQlpZiAocy0+di5QcmludC5kZXN0KQotCQkJVklTSVQoc3QsIGV4cHIsIHMtPnYuUHJpbnQuZGVzdCk7Ci0JCVZJU0lUX1NFUShzdCwgZXhwciwgcy0+di5QcmludC52YWx1ZXMpOwotCQlicmVhazsKLSAgICAgICAgY2FzZSBGb3Jfa2luZDoKLQkJVklTSVQoc3QsIGV4cHIsIHMtPnYuRm9yLnRhcmdldCk7Ci0JCVZJU0lUKHN0LCBleHByLCBzLT52LkZvci5pdGVyKTsKLQkJVklTSVRfU0VRKHN0LCBzdG10LCBzLT52LkZvci5ib2R5KTsKLQkJaWYgKHMtPnYuRm9yLm9yZWxzZSkKLQkJCVZJU0lUX1NFUShzdCwgc3RtdCwgcy0+di5Gb3Iub3JlbHNlKTsKLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgV2hpbGVfa2luZDoKLQkJVklTSVQoc3QsIGV4cHIsIHMtPnYuV2hpbGUudGVzdCk7Ci0JCVZJU0lUX1NFUShzdCwgc3RtdCwgcy0+di5XaGlsZS5ib2R5KTsKLQkJaWYgKHMtPnYuV2hpbGUub3JlbHNlKQotCQkJVklTSVRfU0VRKHN0LCBzdG10LCBzLT52LldoaWxlLm9yZWxzZSk7Ci0JCWJyZWFrOwotICAgICAgICBjYXNlIElmX2tpbmQ6Ci0JCS8qIFhYWCBpZiAwOiBhbmQgbG9va3VwX3lpZWxkKCkgaGFja3MgKi8KLQkJVklTSVQoc3QsIGV4cHIsIHMtPnYuSWYudGVzdCk7Ci0JCVZJU0lUX1NFUShzdCwgc3RtdCwgcy0+di5JZi5ib2R5KTsKLQkJaWYgKHMtPnYuSWYub3JlbHNlKQotCQkJVklTSVRfU0VRKHN0LCBzdG10LCBzLT52LklmLm9yZWxzZSk7Ci0JCWJyZWFrOwotICAgICAgICBjYXNlIFJhaXNlX2tpbmQ6Ci0JCWlmIChzLT52LlJhaXNlLnR5cGUpIHsKLQkJCVZJU0lUKHN0LCBleHByLCBzLT52LlJhaXNlLnR5cGUpOwotCQkJaWYgKHMtPnYuUmFpc2UuaW5zdCkgewotCQkJCVZJU0lUKHN0LCBleHByLCBzLT52LlJhaXNlLmluc3QpOwotCQkJCWlmIChzLT52LlJhaXNlLnRiYWNrKQotCQkJCQlWSVNJVChzdCwgZXhwciwgcy0+di5SYWlzZS50YmFjayk7Ci0JCQl9Ci0JCX0KLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgVHJ5RXhjZXB0X2tpbmQ6Ci0JCVZJU0lUX1NFUShzdCwgc3RtdCwgcy0+di5UcnlFeGNlcHQuYm9keSk7Ci0JCVZJU0lUX1NFUShzdCwgc3RtdCwgcy0+di5UcnlFeGNlcHQub3JlbHNlKTsKLQkJVklTSVRfU0VRKHN0LCBleGNlcHRoYW5kbGVyLCBzLT52LlRyeUV4Y2VwdC5oYW5kbGVycyk7Ci0JCWJyZWFrOwotICAgICAgICBjYXNlIFRyeUZpbmFsbHlfa2luZDoKLQkJVklTSVRfU0VRKHN0LCBzdG10LCBzLT52LlRyeUZpbmFsbHkuYm9keSk7Ci0JCVZJU0lUX1NFUShzdCwgc3RtdCwgcy0+di5UcnlGaW5hbGx5LmZpbmFsYm9keSk7Ci0JCWJyZWFrOwotICAgICAgICBjYXNlIEFzc2VydF9raW5kOgotCQlWSVNJVChzdCwgZXhwciwgcy0+di5Bc3NlcnQudGVzdCk7Ci0JCWlmIChzLT52LkFzc2VydC5tc2cpCi0JCQlWSVNJVChzdCwgZXhwciwgcy0+di5Bc3NlcnQubXNnKTsKLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgSW1wb3J0X2tpbmQ6Ci0JCVZJU0lUX1NFUShzdCwgYWxpYXMsIHMtPnYuSW1wb3J0Lm5hbWVzKTsKLQkJLyogWFhYIERvbid0IGhhdmUgdGhlIGxpbmVubyBhdmFpbGFibGUgaW5zaWRlCi0JCSAgIHZpc2l0X2FsaWFzICovCi0JCWlmIChzdC0+c3RfY3VyLT5zdGVfdW5vcHRpbWl6ZWQgJiYgIXN0LT5zdF9jdXItPnN0ZV9vcHRfbGluZW5vKQotCQkJc3QtPnN0X2N1ci0+c3RlX29wdF9saW5lbm8gPSBzLT5saW5lbm87Ci0JCWJyZWFrOwotICAgICAgICBjYXNlIEltcG9ydEZyb21fa2luZDoKLQkJVklTSVRfU0VRKHN0LCBhbGlhcywgcy0+di5JbXBvcnRGcm9tLm5hbWVzKTsKLQkJLyogWFhYIERvbid0IGhhdmUgdGhlIGxpbmVubyBhdmFpbGFibGUgaW5zaWRlCi0JCSAgIHZpc2l0X2FsaWFzICovCi0JCWlmIChzdC0+c3RfY3VyLT5zdGVfdW5vcHRpbWl6ZWQgJiYgIXN0LT5zdF9jdXItPnN0ZV9vcHRfbGluZW5vKQotCQkJc3QtPnN0X2N1ci0+c3RlX29wdF9saW5lbm8gPSBzLT5saW5lbm87Ci0JCWJyZWFrOwotICAgICAgICBjYXNlIEV4ZWNfa2luZDoKLQkJVklTSVQoc3QsIGV4cHIsIHMtPnYuRXhlYy5ib2R5KTsKLQkJaWYgKCFzdC0+c3RfY3VyLT5zdGVfb3B0X2xpbmVubykKLQkJCXN0LT5zdF9jdXItPnN0ZV9vcHRfbGluZW5vID0gcy0+bGluZW5vOwotCQlpZiAocy0+di5FeGVjLmdsb2JhbHMpIHsKLQkJCXN0LT5zdF9jdXItPnN0ZV91bm9wdGltaXplZCB8PSBPUFRfRVhFQzsKLQkJCVZJU0lUKHN0LCBleHByLCBzLT52LkV4ZWMuZ2xvYmFscyk7Ci0JCQlpZiAocy0+di5FeGVjLmxvY2FscykgCi0JCQkJVklTSVQoc3QsIGV4cHIsIHMtPnYuRXhlYy5sb2NhbHMpOwotCQl9IGVsc2UgewotCQkJc3QtPnN0X2N1ci0+c3RlX3Vub3B0aW1pemVkIHw9IE9QVF9CQVJFX0VYRUM7Ci0JCX0KLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgR2xvYmFsX2tpbmQ6IHsKLQkJaW50IGk7Ci0JCWFzZGxfc2VxICpzZXEgPSBzLT52Lkdsb2JhbC5uYW1lczsKLQkJZm9yIChpID0gMDsgaSA8IGFzZGxfc2VxX0xFTihzZXEpOyBpKyspIHsKLQkJCWlkZW50aWZpZXIgbmFtZSA9IChpZGVudGlmaWVyKWFzZGxfc2VxX0dFVChzZXEsIGkpOwotCQkJY2hhciAqY19uYW1lID0gUHlTdHJpbmdfQVNfU1RSSU5HKG5hbWUpOwotCQkJbG9uZyBjdXIgPSBzeW10YWJsZV9sb29rdXAoc3QsIG5hbWUpOwotCQkJaWYgKGN1ciA8IDApCi0JCQkJcmV0dXJuIDA7Ci0JCQlpZiAoY3VyICYgKERFRl9MT0NBTCB8IFVTRSkpIHsKLQkJCQljaGFyIGJ1ZlsyNTZdOwotCQkJCWlmIChjdXIgJiBERUZfTE9DQUwpIAotCQkJCQlQeU9TX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksCi0JCQkJCQkgICAgICBHTE9CQUxfQUZURVJfQVNTSUdOLAotCQkJCQkJICAgICAgY19uYW1lKTsKLQkJCQllbHNlCi0JCQkJCVB5T1Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwKLQkJCQkJCSAgICAgIEdMT0JBTF9BRlRFUl9VU0UsCi0JCQkJCQkgICAgICBjX25hbWUpOwotCQkJCWlmICghc3ltdGFibGVfd2FybihzdCwgYnVmLCBzLT5saW5lbm8pKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0JCQl9Ci0JCQlpZiAoIXN5bXRhYmxlX2FkZF9kZWYoc3QsIG5hbWUsIERFRl9HTE9CQUwpKQotCQkJCXJldHVybiAwOwotCQl9Ci0JCWJyZWFrOwotCX0KLSAgICAgICAgY2FzZSBFeHByX2tpbmQ6Ci0JCVZJU0lUKHN0LCBleHByLCBzLT52LkV4cHIudmFsdWUpOwotCQlicmVhazsKLSAgICAgICAgY2FzZSBQYXNzX2tpbmQ6Ci0gICAgICAgIGNhc2UgQnJlYWtfa2luZDoKLSAgICAgICAgY2FzZSBDb250aW51ZV9raW5kOgotCQkvKiBub3RoaW5nIHRvIGRvIGhlcmUgKi8KLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgV2l0aF9raW5kOgotCQlpZiAoIXN5bXRhYmxlX25ld190bXBuYW1lKHN0KSkKLQkJCXJldHVybiAwOwotICAgICAgICAgICAgICAgIFZJU0lUKHN0LCBleHByLCBzLT52LldpdGguY29udGV4dF9leHByKTsKLSAgICAgICAgICAgICAgICBpZiAocy0+di5XaXRoLm9wdGlvbmFsX3ZhcnMpIHsKLQkJCWlmICghc3ltdGFibGVfbmV3X3RtcG5hbWUoc3QpKQotCQkJCXJldHVybiAwOwotICAgICAgICAgICAgICAgICAgICAgICAgVklTSVQoc3QsIGV4cHIsIHMtPnYuV2l0aC5vcHRpb25hbF92YXJzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgVklTSVRfU0VRKHN0LCBzdG10LCBzLT52LldpdGguYm9keSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0JfQotCXJldHVybiAxOworICAgIHN3aXRjaCAocy0+a2luZCkgeworICAgIGNhc2UgRnVuY3Rpb25EZWZfa2luZDoKKyAgICAgICAgaWYgKCFzeW10YWJsZV9hZGRfZGVmKHN0LCBzLT52LkZ1bmN0aW9uRGVmLm5hbWUsIERFRl9MT0NBTCkpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgaWYgKHMtPnYuRnVuY3Rpb25EZWYuYXJncy0+ZGVmYXVsdHMpCisgICAgICAgICAgICBWSVNJVF9TRVEoc3QsIGV4cHIsIHMtPnYuRnVuY3Rpb25EZWYuYXJncy0+ZGVmYXVsdHMpOworICAgICAgICBpZiAocy0+di5GdW5jdGlvbkRlZi5kZWNvcmF0b3JfbGlzdCkKKyAgICAgICAgICAgIFZJU0lUX1NFUShzdCwgZXhwciwgcy0+di5GdW5jdGlvbkRlZi5kZWNvcmF0b3JfbGlzdCk7CisgICAgICAgIGlmICghc3ltdGFibGVfZW50ZXJfYmxvY2soc3QsIHMtPnYuRnVuY3Rpb25EZWYubmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbkJsb2NrLCAodm9pZCAqKXMsIHMtPmxpbmVubykpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgVklTSVRfSU5fQkxPQ0soc3QsIGFyZ3VtZW50cywgcy0+di5GdW5jdGlvbkRlZi5hcmdzLCBzKTsKKyAgICAgICAgVklTSVRfU0VRX0lOX0JMT0NLKHN0LCBzdG10LCBzLT52LkZ1bmN0aW9uRGVmLmJvZHksIHMpOworICAgICAgICBpZiAoIXN5bXRhYmxlX2V4aXRfYmxvY2soc3QsIHMpKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ2xhc3NEZWZfa2luZDogeworICAgICAgICBQeU9iamVjdCAqdG1wOworICAgICAgICBpZiAoIXN5bXRhYmxlX2FkZF9kZWYoc3QsIHMtPnYuQ2xhc3NEZWYubmFtZSwgREVGX0xPQ0FMKSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBWSVNJVF9TRVEoc3QsIGV4cHIsIHMtPnYuQ2xhc3NEZWYuYmFzZXMpOworICAgICAgICBpZiAocy0+di5DbGFzc0RlZi5kZWNvcmF0b3JfbGlzdCkKKyAgICAgICAgICAgIFZJU0lUX1NFUShzdCwgZXhwciwgcy0+di5DbGFzc0RlZi5kZWNvcmF0b3JfbGlzdCk7CisgICAgICAgIGlmICghc3ltdGFibGVfZW50ZXJfYmxvY2soc3QsIHMtPnYuQ2xhc3NEZWYubmFtZSwgQ2xhc3NCbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXMsIHMtPmxpbmVubykpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgdG1wID0gc3QtPnN0X3ByaXZhdGU7CisgICAgICAgIHN0LT5zdF9wcml2YXRlID0gcy0+di5DbGFzc0RlZi5uYW1lOworICAgICAgICBWSVNJVF9TRVFfSU5fQkxPQ0soc3QsIHN0bXQsIHMtPnYuQ2xhc3NEZWYuYm9keSwgcyk7CisgICAgICAgIHN0LT5zdF9wcml2YXRlID0gdG1wOworICAgICAgICBpZiAoIXN5bXRhYmxlX2V4aXRfYmxvY2soc3QsIHMpKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFJldHVybl9raW5kOgorICAgICAgICBpZiAocy0+di5SZXR1cm4udmFsdWUpIHsKKyAgICAgICAgICAgIFZJU0lUKHN0LCBleHByLCBzLT52LlJldHVybi52YWx1ZSk7CisgICAgICAgICAgICBzdC0+c3RfY3VyLT5zdGVfcmV0dXJuc192YWx1ZSA9IDE7CisgICAgICAgICAgICBpZiAoc3QtPnN0X2N1ci0+c3RlX2dlbmVyYXRvcikgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeW50YXhFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgUkVUVVJOX1ZBTF9JTl9HRU5FUkFUT1IpOworICAgICAgICAgICAgICAgIFB5RXJyX1N5bnRheExvY2F0aW9uKHN0LT5zdF9maWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bGluZW5vKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIERlbGV0ZV9raW5kOgorICAgICAgICBWSVNJVF9TRVEoc3QsIGV4cHIsIHMtPnYuRGVsZXRlLnRhcmdldHMpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFzc2lnbl9raW5kOgorICAgICAgICBWSVNJVF9TRVEoc3QsIGV4cHIsIHMtPnYuQXNzaWduLnRhcmdldHMpOworICAgICAgICBWSVNJVChzdCwgZXhwciwgcy0+di5Bc3NpZ24udmFsdWUpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEF1Z0Fzc2lnbl9raW5kOgorICAgICAgICBWSVNJVChzdCwgZXhwciwgcy0+di5BdWdBc3NpZ24udGFyZ2V0KTsKKyAgICAgICAgVklTSVQoc3QsIGV4cHIsIHMtPnYuQXVnQXNzaWduLnZhbHVlKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBQcmludF9raW5kOgorICAgICAgICBpZiAocy0+di5QcmludC5kZXN0KQorICAgICAgICAgICAgVklTSVQoc3QsIGV4cHIsIHMtPnYuUHJpbnQuZGVzdCk7CisgICAgICAgIFZJU0lUX1NFUShzdCwgZXhwciwgcy0+di5QcmludC52YWx1ZXMpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEZvcl9raW5kOgorICAgICAgICBWSVNJVChzdCwgZXhwciwgcy0+di5Gb3IudGFyZ2V0KTsKKyAgICAgICAgVklTSVQoc3QsIGV4cHIsIHMtPnYuRm9yLml0ZXIpOworICAgICAgICBWSVNJVF9TRVEoc3QsIHN0bXQsIHMtPnYuRm9yLmJvZHkpOworICAgICAgICBpZiAocy0+di5Gb3Iub3JlbHNlKQorICAgICAgICAgICAgVklTSVRfU0VRKHN0LCBzdG10LCBzLT52LkZvci5vcmVsc2UpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFdoaWxlX2tpbmQ6CisgICAgICAgIFZJU0lUKHN0LCBleHByLCBzLT52LldoaWxlLnRlc3QpOworICAgICAgICBWSVNJVF9TRVEoc3QsIHN0bXQsIHMtPnYuV2hpbGUuYm9keSk7CisgICAgICAgIGlmIChzLT52LldoaWxlLm9yZWxzZSkKKyAgICAgICAgICAgIFZJU0lUX1NFUShzdCwgc3RtdCwgcy0+di5XaGlsZS5vcmVsc2UpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIElmX2tpbmQ6CisgICAgICAgIC8qIFhYWCBpZiAwOiBhbmQgbG9va3VwX3lpZWxkKCkgaGFja3MgKi8KKyAgICAgICAgVklTSVQoc3QsIGV4cHIsIHMtPnYuSWYudGVzdCk7CisgICAgICAgIFZJU0lUX1NFUShzdCwgc3RtdCwgcy0+di5JZi5ib2R5KTsKKyAgICAgICAgaWYgKHMtPnYuSWYub3JlbHNlKQorICAgICAgICAgICAgVklTSVRfU0VRKHN0LCBzdG10LCBzLT52LklmLm9yZWxzZSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUmFpc2Vfa2luZDoKKyAgICAgICAgaWYgKHMtPnYuUmFpc2UudHlwZSkgeworICAgICAgICAgICAgVklTSVQoc3QsIGV4cHIsIHMtPnYuUmFpc2UudHlwZSk7CisgICAgICAgICAgICBpZiAocy0+di5SYWlzZS5pbnN0KSB7CisgICAgICAgICAgICAgICAgVklTSVQoc3QsIGV4cHIsIHMtPnYuUmFpc2UuaW5zdCk7CisgICAgICAgICAgICAgICAgaWYgKHMtPnYuUmFpc2UudGJhY2spCisgICAgICAgICAgICAgICAgICAgIFZJU0lUKHN0LCBleHByLCBzLT52LlJhaXNlLnRiYWNrKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFRyeUV4Y2VwdF9raW5kOgorICAgICAgICBWSVNJVF9TRVEoc3QsIHN0bXQsIHMtPnYuVHJ5RXhjZXB0LmJvZHkpOworICAgICAgICBWSVNJVF9TRVEoc3QsIHN0bXQsIHMtPnYuVHJ5RXhjZXB0Lm9yZWxzZSk7CisgICAgICAgIFZJU0lUX1NFUShzdCwgZXhjZXB0aGFuZGxlciwgcy0+di5UcnlFeGNlcHQuaGFuZGxlcnMpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFRyeUZpbmFsbHlfa2luZDoKKyAgICAgICAgVklTSVRfU0VRKHN0LCBzdG10LCBzLT52LlRyeUZpbmFsbHkuYm9keSk7CisgICAgICAgIFZJU0lUX1NFUShzdCwgc3RtdCwgcy0+di5UcnlGaW5hbGx5LmZpbmFsYm9keSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQXNzZXJ0X2tpbmQ6CisgICAgICAgIFZJU0lUKHN0LCBleHByLCBzLT52LkFzc2VydC50ZXN0KTsKKyAgICAgICAgaWYgKHMtPnYuQXNzZXJ0Lm1zZykKKyAgICAgICAgICAgIFZJU0lUKHN0LCBleHByLCBzLT52LkFzc2VydC5tc2cpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEltcG9ydF9raW5kOgorICAgICAgICBWSVNJVF9TRVEoc3QsIGFsaWFzLCBzLT52LkltcG9ydC5uYW1lcyk7CisgICAgICAgIC8qIFhYWCBEb24ndCBoYXZlIHRoZSBsaW5lbm8gYXZhaWxhYmxlIGluc2lkZQorICAgICAgICAgICB2aXNpdF9hbGlhcyAqLworICAgICAgICBpZiAoc3QtPnN0X2N1ci0+c3RlX3Vub3B0aW1pemVkICYmICFzdC0+c3RfY3VyLT5zdGVfb3B0X2xpbmVubykKKyAgICAgICAgICAgIHN0LT5zdF9jdXItPnN0ZV9vcHRfbGluZW5vID0gcy0+bGluZW5vOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEltcG9ydEZyb21fa2luZDoKKyAgICAgICAgVklTSVRfU0VRKHN0LCBhbGlhcywgcy0+di5JbXBvcnRGcm9tLm5hbWVzKTsKKyAgICAgICAgLyogWFhYIERvbid0IGhhdmUgdGhlIGxpbmVubyBhdmFpbGFibGUgaW5zaWRlCisgICAgICAgICAgIHZpc2l0X2FsaWFzICovCisgICAgICAgIGlmIChzdC0+c3RfY3VyLT5zdGVfdW5vcHRpbWl6ZWQgJiYgIXN0LT5zdF9jdXItPnN0ZV9vcHRfbGluZW5vKQorICAgICAgICAgICAgc3QtPnN0X2N1ci0+c3RlX29wdF9saW5lbm8gPSBzLT5saW5lbm87CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRXhlY19raW5kOgorICAgICAgICBWSVNJVChzdCwgZXhwciwgcy0+di5FeGVjLmJvZHkpOworICAgICAgICBpZiAoIXN0LT5zdF9jdXItPnN0ZV9vcHRfbGluZW5vKQorICAgICAgICAgICAgc3QtPnN0X2N1ci0+c3RlX29wdF9saW5lbm8gPSBzLT5saW5lbm87CisgICAgICAgIGlmIChzLT52LkV4ZWMuZ2xvYmFscykgeworICAgICAgICAgICAgc3QtPnN0X2N1ci0+c3RlX3Vub3B0aW1pemVkIHw9IE9QVF9FWEVDOworICAgICAgICAgICAgVklTSVQoc3QsIGV4cHIsIHMtPnYuRXhlYy5nbG9iYWxzKTsKKyAgICAgICAgICAgIGlmIChzLT52LkV4ZWMubG9jYWxzKQorICAgICAgICAgICAgICAgIFZJU0lUKHN0LCBleHByLCBzLT52LkV4ZWMubG9jYWxzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0LT5zdF9jdXItPnN0ZV91bm9wdGltaXplZCB8PSBPUFRfQkFSRV9FWEVDOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgR2xvYmFsX2tpbmQ6IHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGFzZGxfc2VxICpzZXEgPSBzLT52Lkdsb2JhbC5uYW1lczsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGFzZGxfc2VxX0xFTihzZXEpOyBpKyspIHsKKyAgICAgICAgICAgIGlkZW50aWZpZXIgbmFtZSA9IChpZGVudGlmaWVyKWFzZGxfc2VxX0dFVChzZXEsIGkpOworICAgICAgICAgICAgY2hhciAqY19uYW1lID0gUHlTdHJpbmdfQVNfU1RSSU5HKG5hbWUpOworICAgICAgICAgICAgbG9uZyBjdXIgPSBzeW10YWJsZV9sb29rdXAoc3QsIG5hbWUpOworICAgICAgICAgICAgaWYgKGN1ciA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICBpZiAoY3VyICYgKERFRl9MT0NBTCB8IFVTRSkpIHsKKyAgICAgICAgICAgICAgICBjaGFyIGJ1ZlsyNTZdOworICAgICAgICAgICAgICAgIGlmIChjdXIgJiBERUZfTE9DQUwpCisgICAgICAgICAgICAgICAgICAgIFB5T1Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTE9CQUxfQUZURVJfQVNTSUdOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNfbmFtZSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBQeU9TX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xPQkFMX0FGVEVSX1VTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX25hbWUpOworICAgICAgICAgICAgICAgIGlmICghc3ltdGFibGVfd2FybihzdCwgYnVmLCBzLT5saW5lbm8pKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghc3ltdGFibGVfYWRkX2RlZihzdCwgbmFtZSwgREVGX0dMT0JBTCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRXhwcl9raW5kOgorICAgICAgICBWSVNJVChzdCwgZXhwciwgcy0+di5FeHByLnZhbHVlKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBQYXNzX2tpbmQ6CisgICAgY2FzZSBCcmVha19raW5kOgorICAgIGNhc2UgQ29udGludWVfa2luZDoKKyAgICAgICAgLyogbm90aGluZyB0byBkbyBoZXJlICovCisgICAgICAgIGJyZWFrOworICAgIGNhc2UgV2l0aF9raW5kOgorICAgICAgICBpZiAoIXN5bXRhYmxlX25ld190bXBuYW1lKHN0KSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBWSVNJVChzdCwgZXhwciwgcy0+di5XaXRoLmNvbnRleHRfZXhwcik7CisgICAgICAgIGlmIChzLT52LldpdGgub3B0aW9uYWxfdmFycykgeworICAgICAgICAgICAgaWYgKCFzeW10YWJsZV9uZXdfdG1wbmFtZShzdCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICBWSVNJVChzdCwgZXhwciwgcy0+di5XaXRoLm9wdGlvbmFsX3ZhcnMpOworICAgICAgICB9CisgICAgICAgIFZJU0lUX1NFUShzdCwgc3RtdCwgcy0+di5XaXRoLmJvZHkpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBpbnQgCitzdGF0aWMgaW50CiBzeW10YWJsZV92aXNpdF9leHByKHN0cnVjdCBzeW10YWJsZSAqc3QsIGV4cHJfdHkgZSkKIHsKLQlzd2l0Y2ggKGUtPmtpbmQpIHsKLSAgICAgICAgY2FzZSBCb29sT3Bfa2luZDoKLQkJVklTSVRfU0VRKHN0LCBleHByLCBlLT52LkJvb2xPcC52YWx1ZXMpOwotCQlicmVhazsKLSAgICAgICAgY2FzZSBCaW5PcF9raW5kOgotCQlWSVNJVChzdCwgZXhwciwgZS0+di5CaW5PcC5sZWZ0KTsKLQkJVklTSVQoc3QsIGV4cHIsIGUtPnYuQmluT3AucmlnaHQpOwotCQlicmVhazsKLSAgICAgICAgY2FzZSBVbmFyeU9wX2tpbmQ6Ci0JCVZJU0lUKHN0LCBleHByLCBlLT52LlVuYXJ5T3Aub3BlcmFuZCk7Ci0JCWJyZWFrOwotICAgICAgICBjYXNlIExhbWJkYV9raW5kOiB7Ci0JCWlmICghR0VUX0lERU5USUZJRVIobGFtYmRhKSB8fAotCQkgICAgIXN5bXRhYmxlX2FkZF9kZWYoc3QsIGxhbWJkYSwgREVGX0xPQ0FMKSkKLQkJCXJldHVybiAwOwotCQlpZiAoZS0+di5MYW1iZGEuYXJncy0+ZGVmYXVsdHMpCi0JCQlWSVNJVF9TRVEoc3QsIGV4cHIsIGUtPnYuTGFtYmRhLmFyZ3MtPmRlZmF1bHRzKTsKLQkJaWYgKCFzeW10YWJsZV9lbnRlcl9ibG9jayhzdCwgbGFtYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb25CbG9jaywgKHZvaWQgKillLCBlLT5saW5lbm8pKQotCQkJcmV0dXJuIDA7Ci0JCVZJU0lUX0lOX0JMT0NLKHN0LCBhcmd1bWVudHMsIGUtPnYuTGFtYmRhLmFyZ3MsICh2b2lkKillKTsKLQkJVklTSVRfSU5fQkxPQ0soc3QsIGV4cHIsIGUtPnYuTGFtYmRhLmJvZHksICh2b2lkKillKTsKLQkJaWYgKCFzeW10YWJsZV9leGl0X2Jsb2NrKHN0LCAodm9pZCAqKWUpKQotCQkJcmV0dXJuIDA7Ci0JCWJyZWFrOwotCX0KLQljYXNlIElmRXhwX2tpbmQ6Ci0JCVZJU0lUKHN0LCBleHByLCBlLT52LklmRXhwLnRlc3QpOwotCQlWSVNJVChzdCwgZXhwciwgZS0+di5JZkV4cC5ib2R5KTsKLQkJVklTSVQoc3QsIGV4cHIsIGUtPnYuSWZFeHAub3JlbHNlKTsKLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgRGljdF9raW5kOgotCQlWSVNJVF9TRVEoc3QsIGV4cHIsIGUtPnYuRGljdC5rZXlzKTsKLQkJVklTSVRfU0VRKHN0LCBleHByLCBlLT52LkRpY3QudmFsdWVzKTsKLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgTGlzdENvbXBfa2luZDoKLQkJaWYgKCFzeW10YWJsZV9uZXdfdG1wbmFtZShzdCkpCi0JCQlyZXR1cm4gMDsKLQkJVklTSVQoc3QsIGV4cHIsIGUtPnYuTGlzdENvbXAuZWx0KTsKLQkJVklTSVRfU0VRKHN0LCBjb21wcmVoZW5zaW9uLCBlLT52Lkxpc3RDb21wLmdlbmVyYXRvcnMpOwotCQlicmVhazsKLSAgICAgICAgY2FzZSBHZW5lcmF0b3JFeHBfa2luZDoKLQkJaWYgKCFzeW10YWJsZV92aXNpdF9nZW5leHAoc3QsIGUpKQotCQkJcmV0dXJuIDA7Ci0JCWJyZWFrOwotICAgICAgICBjYXNlIFlpZWxkX2tpbmQ6Ci0JCWlmIChlLT52LllpZWxkLnZhbHVlKQotCQkJVklTSVQoc3QsIGV4cHIsIGUtPnYuWWllbGQudmFsdWUpOwotICAgICAgICAgICAgICAgIHN0LT5zdF9jdXItPnN0ZV9nZW5lcmF0b3IgPSAxOwotCQlpZiAoc3QtPnN0X2N1ci0+c3RlX3JldHVybnNfdmFsdWUpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19TeW50YXhFcnJvciwKLQkJCQlSRVRVUk5fVkFMX0lOX0dFTkVSQVRPUik7Ci0JCSAgICAgICAgUHlFcnJfU3ludGF4TG9jYXRpb24oc3QtPnN0X2ZpbGVuYW1lLAotCQkJICAgICAgICAgICAgIGUtPmxpbmVubyk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlicmVhazsKLSAgICAgICAgY2FzZSBDb21wYXJlX2tpbmQ6Ci0JCVZJU0lUKHN0LCBleHByLCBlLT52LkNvbXBhcmUubGVmdCk7Ci0JCVZJU0lUX1NFUShzdCwgZXhwciwgZS0+di5Db21wYXJlLmNvbXBhcmF0b3JzKTsKLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgQ2FsbF9raW5kOgotCQlWSVNJVChzdCwgZXhwciwgZS0+di5DYWxsLmZ1bmMpOwotCQlWSVNJVF9TRVEoc3QsIGV4cHIsIGUtPnYuQ2FsbC5hcmdzKTsKLQkJVklTSVRfU0VRKHN0LCBrZXl3b3JkLCBlLT52LkNhbGwua2V5d29yZHMpOwotCQlpZiAoZS0+di5DYWxsLnN0YXJhcmdzKQotCQkJVklTSVQoc3QsIGV4cHIsIGUtPnYuQ2FsbC5zdGFyYXJncyk7Ci0JCWlmIChlLT52LkNhbGwua3dhcmdzKQotCQkJVklTSVQoc3QsIGV4cHIsIGUtPnYuQ2FsbC5rd2FyZ3MpOwotCQlicmVhazsKLSAgICAgICAgY2FzZSBSZXByX2tpbmQ6Ci0JCVZJU0lUKHN0LCBleHByLCBlLT52LlJlcHIudmFsdWUpOwotCQlicmVhazsKLSAgICAgICAgY2FzZSBOdW1fa2luZDoKLSAgICAgICAgY2FzZSBTdHJfa2luZDoKLQkJLyogTm90aGluZyB0byBkbyBoZXJlLiAqLwotCQlicmVhazsKLQkvKiBUaGUgZm9sbG93aW5nIGV4cHJzIGNhbiBiZSBhc3NpZ25tZW50IHRhcmdldHMuICovCi0gICAgICAgIGNhc2UgQXR0cmlidXRlX2tpbmQ6Ci0JCVZJU0lUKHN0LCBleHByLCBlLT52LkF0dHJpYnV0ZS52YWx1ZSk7Ci0JCWJyZWFrOwotICAgICAgICBjYXNlIFN1YnNjcmlwdF9raW5kOgotCQlWSVNJVChzdCwgZXhwciwgZS0+di5TdWJzY3JpcHQudmFsdWUpOwotCQlWSVNJVChzdCwgc2xpY2UsIGUtPnYuU3Vic2NyaXB0LnNsaWNlKTsKLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgTmFtZV9raW5kOgotCQlpZiAoIXN5bXRhYmxlX2FkZF9kZWYoc3QsIGUtPnYuTmFtZS5pZCwgCi0JCQkJICAgICAgZS0+di5OYW1lLmN0eCA9PSBMb2FkID8gVVNFIDogREVGX0xPQ0FMKSkKLQkJCXJldHVybiAwOwotCQlicmVhazsKLQkvKiBjaGlsZCBub2RlcyBvZiBMaXN0IGFuZCBUdXBsZSB3aWxsIGhhdmUgZXhwcl9jb250ZXh0IHNldCAqLwotICAgICAgICBjYXNlIExpc3Rfa2luZDoKLQkJVklTSVRfU0VRKHN0LCBleHByLCBlLT52Lkxpc3QuZWx0cyk7Ci0JCWJyZWFrOwotICAgICAgICBjYXNlIFR1cGxlX2tpbmQ6Ci0JCVZJU0lUX1NFUShzdCwgZXhwciwgZS0+di5UdXBsZS5lbHRzKTsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiAxOworICAgIHN3aXRjaCAoZS0+a2luZCkgeworICAgIGNhc2UgQm9vbE9wX2tpbmQ6CisgICAgICAgIFZJU0lUX1NFUShzdCwgZXhwciwgZS0+di5Cb29sT3AudmFsdWVzKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBCaW5PcF9raW5kOgorICAgICAgICBWSVNJVChzdCwgZXhwciwgZS0+di5CaW5PcC5sZWZ0KTsKKyAgICAgICAgVklTSVQoc3QsIGV4cHIsIGUtPnYuQmluT3AucmlnaHQpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFVuYXJ5T3Bfa2luZDoKKyAgICAgICAgVklTSVQoc3QsIGV4cHIsIGUtPnYuVW5hcnlPcC5vcGVyYW5kKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBMYW1iZGFfa2luZDogeworICAgICAgICBpZiAoIUdFVF9JREVOVElGSUVSKGxhbWJkYSkgfHwKKyAgICAgICAgICAgICFzeW10YWJsZV9hZGRfZGVmKHN0LCBsYW1iZGEsIERFRl9MT0NBTCkpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgaWYgKGUtPnYuTGFtYmRhLmFyZ3MtPmRlZmF1bHRzKQorICAgICAgICAgICAgVklTSVRfU0VRKHN0LCBleHByLCBlLT52LkxhbWJkYS5hcmdzLT5kZWZhdWx0cyk7CisgICAgICAgIGlmICghc3ltdGFibGVfZW50ZXJfYmxvY2soc3QsIGxhbWJkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbkJsb2NrLCAodm9pZCAqKWUsIGUtPmxpbmVubykpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgVklTSVRfSU5fQkxPQ0soc3QsIGFyZ3VtZW50cywgZS0+di5MYW1iZGEuYXJncywgKHZvaWQqKWUpOworICAgICAgICBWSVNJVF9JTl9CTE9DSyhzdCwgZXhwciwgZS0+di5MYW1iZGEuYm9keSwgKHZvaWQqKWUpOworICAgICAgICBpZiAoIXN5bXRhYmxlX2V4aXRfYmxvY2soc3QsICh2b2lkICopZSkpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgSWZFeHBfa2luZDoKKyAgICAgICAgVklTSVQoc3QsIGV4cHIsIGUtPnYuSWZFeHAudGVzdCk7CisgICAgICAgIFZJU0lUKHN0LCBleHByLCBlLT52LklmRXhwLmJvZHkpOworICAgICAgICBWSVNJVChzdCwgZXhwciwgZS0+di5JZkV4cC5vcmVsc2UpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIERpY3Rfa2luZDoKKyAgICAgICAgVklTSVRfU0VRKHN0LCBleHByLCBlLT52LkRpY3Qua2V5cyk7CisgICAgICAgIFZJU0lUX1NFUShzdCwgZXhwciwgZS0+di5EaWN0LnZhbHVlcyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTGlzdENvbXBfa2luZDoKKyAgICAgICAgaWYgKCFzeW10YWJsZV9uZXdfdG1wbmFtZShzdCkpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgVklTSVQoc3QsIGV4cHIsIGUtPnYuTGlzdENvbXAuZWx0KTsKKyAgICAgICAgVklTSVRfU0VRKHN0LCBjb21wcmVoZW5zaW9uLCBlLT52Lkxpc3RDb21wLmdlbmVyYXRvcnMpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEdlbmVyYXRvckV4cF9raW5kOgorICAgICAgICBpZiAoIXN5bXRhYmxlX3Zpc2l0X2dlbmV4cChzdCwgZSkpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBZaWVsZF9raW5kOgorICAgICAgICBpZiAoZS0+di5ZaWVsZC52YWx1ZSkKKyAgICAgICAgICAgIFZJU0lUKHN0LCBleHByLCBlLT52LllpZWxkLnZhbHVlKTsKKyAgICAgICAgc3QtPnN0X2N1ci0+c3RlX2dlbmVyYXRvciA9IDE7CisgICAgICAgIGlmIChzdC0+c3RfY3VyLT5zdGVfcmV0dXJuc192YWx1ZSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5bnRheEVycm9yLAorICAgICAgICAgICAgICAgIFJFVFVSTl9WQUxfSU5fR0VORVJBVE9SKTsKKyAgICAgICAgICAgIFB5RXJyX1N5bnRheExvY2F0aW9uKHN0LT5zdF9maWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBlLT5saW5lbm8pOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDb21wYXJlX2tpbmQ6CisgICAgICAgIFZJU0lUKHN0LCBleHByLCBlLT52LkNvbXBhcmUubGVmdCk7CisgICAgICAgIFZJU0lUX1NFUShzdCwgZXhwciwgZS0+di5Db21wYXJlLmNvbXBhcmF0b3JzKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDYWxsX2tpbmQ6CisgICAgICAgIFZJU0lUKHN0LCBleHByLCBlLT52LkNhbGwuZnVuYyk7CisgICAgICAgIFZJU0lUX1NFUShzdCwgZXhwciwgZS0+di5DYWxsLmFyZ3MpOworICAgICAgICBWSVNJVF9TRVEoc3QsIGtleXdvcmQsIGUtPnYuQ2FsbC5rZXl3b3Jkcyk7CisgICAgICAgIGlmIChlLT52LkNhbGwuc3RhcmFyZ3MpCisgICAgICAgICAgICBWSVNJVChzdCwgZXhwciwgZS0+di5DYWxsLnN0YXJhcmdzKTsKKyAgICAgICAgaWYgKGUtPnYuQ2FsbC5rd2FyZ3MpCisgICAgICAgICAgICBWSVNJVChzdCwgZXhwciwgZS0+di5DYWxsLmt3YXJncyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUmVwcl9raW5kOgorICAgICAgICBWSVNJVChzdCwgZXhwciwgZS0+di5SZXByLnZhbHVlKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBOdW1fa2luZDoKKyAgICBjYXNlIFN0cl9raW5kOgorICAgICAgICAvKiBOb3RoaW5nIHRvIGRvIGhlcmUuICovCisgICAgICAgIGJyZWFrOworICAgIC8qIFRoZSBmb2xsb3dpbmcgZXhwcnMgY2FuIGJlIGFzc2lnbm1lbnQgdGFyZ2V0cy4gKi8KKyAgICBjYXNlIEF0dHJpYnV0ZV9raW5kOgorICAgICAgICBWSVNJVChzdCwgZXhwciwgZS0+di5BdHRyaWJ1dGUudmFsdWUpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFN1YnNjcmlwdF9raW5kOgorICAgICAgICBWSVNJVChzdCwgZXhwciwgZS0+di5TdWJzY3JpcHQudmFsdWUpOworICAgICAgICBWSVNJVChzdCwgc2xpY2UsIGUtPnYuU3Vic2NyaXB0LnNsaWNlKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBOYW1lX2tpbmQ6CisgICAgICAgIGlmICghc3ltdGFibGVfYWRkX2RlZihzdCwgZS0+di5OYW1lLmlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS0+di5OYW1lLmN0eCA9PSBMb2FkID8gVVNFIDogREVGX0xPQ0FMKSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBicmVhazsKKyAgICAvKiBjaGlsZCBub2RlcyBvZiBMaXN0IGFuZCBUdXBsZSB3aWxsIGhhdmUgZXhwcl9jb250ZXh0IHNldCAqLworICAgIGNhc2UgTGlzdF9raW5kOgorICAgICAgICBWSVNJVF9TRVEoc3QsIGV4cHIsIGUtPnYuTGlzdC5lbHRzKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUdXBsZV9raW5kOgorICAgICAgICBWSVNJVF9TRVEoc3QsIGV4cHIsIGUtPnYuVHVwbGUuZWx0cyk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIGludAogc3ltdGFibGVfaW1wbGljaXRfYXJnKHN0cnVjdCBzeW10YWJsZSAqc3QsIGludCBwb3MpCiB7Ci0JUHlPYmplY3QgKmlkID0gUHlTdHJpbmdfRnJvbUZvcm1hdCgiLiVkIiwgcG9zKTsKLQlpZiAoaWQgPT0gTlVMTCkKLQkJcmV0dXJuIDA7Ci0JaWYgKCFzeW10YWJsZV9hZGRfZGVmKHN0LCBpZCwgREVGX1BBUkFNKSkgewotCQlQeV9ERUNSRUYoaWQpOwotCQlyZXR1cm4gMDsKLQl9Ci0JUHlfREVDUkVGKGlkKTsKLQlyZXR1cm4gMTsKKyAgICBQeU9iamVjdCAqaWQgPSBQeVN0cmluZ19Gcm9tRm9ybWF0KCIuJWQiLCBwb3MpOworICAgIGlmIChpZCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoIXN5bXRhYmxlX2FkZF9kZWYoc3QsIGlkLCBERUZfUEFSQU0pKSB7CisgICAgICAgIFB5X0RFQ1JFRihpZCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBQeV9ERUNSRUYoaWQpOworICAgIHJldHVybiAxOwogfQogCi1zdGF0aWMgaW50IAorc3RhdGljIGludAogc3ltdGFibGVfdmlzaXRfcGFyYW1zKHN0cnVjdCBzeW10YWJsZSAqc3QsIGFzZGxfc2VxICphcmdzLCBpbnQgdG9wbGV2ZWwpCiB7Ci0JaW50IGk7Ci0JCi0gICAgICAgIC8qIGdvIHRocm91Z2ggYWxsIHRoZSB0b3BsZXZlbCBhcmd1bWVudHMgZmlyc3QgKi8KLQlmb3IgKGkgPSAwOyBpIDwgYXNkbF9zZXFfTEVOKGFyZ3MpOyBpKyspIHsKLQkJZXhwcl90eSBhcmcgPSAoZXhwcl90eSlhc2RsX3NlcV9HRVQoYXJncywgaSk7Ci0JCWlmIChhcmctPmtpbmQgPT0gTmFtZV9raW5kKSB7Ci0JCQlhc3NlcnQoYXJnLT52Lk5hbWUuY3R4ID09IFBhcmFtIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFyZy0+di5OYW1lLmN0eCA9PSBTdG9yZSAmJiAhdG9wbGV2ZWwpKTsKLQkJCWlmICghc3ltdGFibGVfYWRkX2RlZihzdCwgYXJnLT52Lk5hbWUuaWQsIERFRl9QQVJBTSkpCi0JCQkJcmV0dXJuIDA7Ci0JCX0KLQkJZWxzZSBpZiAoYXJnLT5raW5kID09IFR1cGxlX2tpbmQpIHsKLQkJCWFzc2VydChhcmctPnYuVHVwbGUuY3R4ID09IFN0b3JlKTsKLQkJCWlmICh0b3BsZXZlbCkgewotCQkJCWlmICghc3ltdGFibGVfaW1wbGljaXRfYXJnKHN0LCBpKSkKLQkJCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5bnRheEVycm9yLAotCQkJCQkiaW52YWxpZCBleHByZXNzaW9uIGluIHBhcmFtZXRlciBsaXN0Iik7Ci0JCSAgICAgICAgUHlFcnJfU3ludGF4TG9jYXRpb24oc3QtPnN0X2ZpbGVuYW1lLAotCQkJCSAgICAgICAgICAgICBzdC0+c3RfY3VyLT5zdGVfbGluZW5vKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JfQorICAgIGludCBpOwogCi0JaWYgKCF0b3BsZXZlbCkgewotCQlpZiAoIXN5bXRhYmxlX3Zpc2l0X3BhcmFtc19uZXN0ZWQoc3QsIGFyZ3MpKQotCQkJcmV0dXJuIDA7Ci0JfQorICAgIC8qIGdvIHRocm91Z2ggYWxsIHRoZSB0b3BsZXZlbCBhcmd1bWVudHMgZmlyc3QgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgYXNkbF9zZXFfTEVOKGFyZ3MpOyBpKyspIHsKKyAgICAgICAgZXhwcl90eSBhcmcgPSAoZXhwcl90eSlhc2RsX3NlcV9HRVQoYXJncywgaSk7CisgICAgICAgIGlmIChhcmctPmtpbmQgPT0gTmFtZV9raW5kKSB7CisgICAgICAgICAgICBhc3NlcnQoYXJnLT52Lk5hbWUuY3R4ID09IFBhcmFtIHx8CisgICAgICAgICAgICAgICAgICAgKGFyZy0+di5OYW1lLmN0eCA9PSBTdG9yZSAmJiAhdG9wbGV2ZWwpKTsKKyAgICAgICAgICAgIGlmICghc3ltdGFibGVfYWRkX2RlZihzdCwgYXJnLT52Lk5hbWUuaWQsIERFRl9QQVJBTSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoYXJnLT5raW5kID09IFR1cGxlX2tpbmQpIHsKKyAgICAgICAgICAgIGFzc2VydChhcmctPnYuVHVwbGUuY3R4ID09IFN0b3JlKTsKKyAgICAgICAgICAgIGlmICh0b3BsZXZlbCkgeworICAgICAgICAgICAgICAgIGlmICghc3ltdGFibGVfaW1wbGljaXRfYXJnKHN0LCBpKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3ludGF4RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludmFsaWQgZXhwcmVzc2lvbiBpbiBwYXJhbWV0ZXIgbGlzdCIpOworICAgICAgICAgICAgUHlFcnJfU3ludGF4TG9jYXRpb24oc3QtPnN0X2ZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3QtPnN0X2N1ci0+c3RlX2xpbmVubyk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KIAotCXJldHVybiAxOworICAgIGlmICghdG9wbGV2ZWwpIHsKKyAgICAgICAgaWYgKCFzeW10YWJsZV92aXNpdF9wYXJhbXNfbmVzdGVkKHN0LCBhcmdzKSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgaW50CiBzeW10YWJsZV92aXNpdF9wYXJhbXNfbmVzdGVkKHN0cnVjdCBzeW10YWJsZSAqc3QsIGFzZGxfc2VxICphcmdzKQogewotCWludCBpOwotCWZvciAoaSA9IDA7IGkgPCBhc2RsX3NlcV9MRU4oYXJncyk7IGkrKykgewotCQlleHByX3R5IGFyZyA9IChleHByX3R5KWFzZGxfc2VxX0dFVChhcmdzLCBpKTsKLQkJaWYgKGFyZy0+a2luZCA9PSBUdXBsZV9raW5kICYmCi0JCSAgICAhc3ltdGFibGVfdmlzaXRfcGFyYW1zKHN0LCBhcmctPnYuVHVwbGUuZWx0cywgMCkpCi0JCQlyZXR1cm4gMDsKLQl9Ci0JCi0JcmV0dXJuIDE7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IGFzZGxfc2VxX0xFTihhcmdzKTsgaSsrKSB7CisgICAgICAgIGV4cHJfdHkgYXJnID0gKGV4cHJfdHkpYXNkbF9zZXFfR0VUKGFyZ3MsIGkpOworICAgICAgICBpZiAoYXJnLT5raW5kID09IFR1cGxlX2tpbmQgJiYKKyAgICAgICAgICAgICFzeW10YWJsZV92aXNpdF9wYXJhbXMoc3QsIGFyZy0+di5UdXBsZS5lbHRzLCAwKSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHJldHVybiAxOwogfQogCi1zdGF0aWMgaW50IAorc3RhdGljIGludAogc3ltdGFibGVfdmlzaXRfYXJndW1lbnRzKHN0cnVjdCBzeW10YWJsZSAqc3QsIGFyZ3VtZW50c190eSBhKQogewotCS8qIHNraXAgZGVmYXVsdCBhcmd1bWVudHMgaW5zaWRlIGZ1bmN0aW9uIGJsb2NrCi0JICAgWFhYIHNob3VsZCBhc3QgYmUgZGlmZmVyZW50PwotCSovCi0JaWYgKGEtPmFyZ3MgJiYgIXN5bXRhYmxlX3Zpc2l0X3BhcmFtcyhzdCwgYS0+YXJncywgMSkpCi0JCXJldHVybiAwOwotCWlmIChhLT52YXJhcmcpIHsKLQkJaWYgKCFzeW10YWJsZV9hZGRfZGVmKHN0LCBhLT52YXJhcmcsIERFRl9QQVJBTSkpCi0JCQlyZXR1cm4gMDsKLQkJc3QtPnN0X2N1ci0+c3RlX3ZhcmFyZ3MgPSAxOwotCX0KLQlpZiAoYS0+a3dhcmcpIHsKLQkJaWYgKCFzeW10YWJsZV9hZGRfZGVmKHN0LCBhLT5rd2FyZywgREVGX1BBUkFNKSkKLQkJCXJldHVybiAwOwotCQlzdC0+c3RfY3VyLT5zdGVfdmFya2V5d29yZHMgPSAxOwotCX0KLQlpZiAoYS0+YXJncyAmJiAhc3ltdGFibGVfdmlzaXRfcGFyYW1zX25lc3RlZChzdCwgYS0+YXJncykpCi0JCXJldHVybiAwOwotCXJldHVybiAxOworICAgIC8qIHNraXAgZGVmYXVsdCBhcmd1bWVudHMgaW5zaWRlIGZ1bmN0aW9uIGJsb2NrCisgICAgICAgWFhYIHNob3VsZCBhc3QgYmUgZGlmZmVyZW50PworICAgICovCisgICAgaWYgKGEtPmFyZ3MgJiYgIXN5bXRhYmxlX3Zpc2l0X3BhcmFtcyhzdCwgYS0+YXJncywgMSkpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChhLT52YXJhcmcpIHsKKyAgICAgICAgaWYgKCFzeW10YWJsZV9hZGRfZGVmKHN0LCBhLT52YXJhcmcsIERFRl9QQVJBTSkpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgc3QtPnN0X2N1ci0+c3RlX3ZhcmFyZ3MgPSAxOworICAgIH0KKyAgICBpZiAoYS0+a3dhcmcpIHsKKyAgICAgICAgaWYgKCFzeW10YWJsZV9hZGRfZGVmKHN0LCBhLT5rd2FyZywgREVGX1BBUkFNKSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBzdC0+c3RfY3VyLT5zdGVfdmFya2V5d29yZHMgPSAxOworICAgIH0KKyAgICBpZiAoYS0+YXJncyAmJiAhc3ltdGFibGVfdmlzaXRfcGFyYW1zX25lc3RlZChzdCwgYS0+YXJncykpCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiAxOwogfQogCiAKLXN0YXRpYyBpbnQgCitzdGF0aWMgaW50CiBzeW10YWJsZV92aXNpdF9leGNlcHRoYW5kbGVyKHN0cnVjdCBzeW10YWJsZSAqc3QsIGV4Y2VwdGhhbmRsZXJfdHkgZWgpCiB7Ci0JaWYgKGVoLT52LkV4Y2VwdEhhbmRsZXIudHlwZSkKLQkJVklTSVQoc3QsIGV4cHIsIGVoLT52LkV4Y2VwdEhhbmRsZXIudHlwZSk7Ci0JaWYgKGVoLT52LkV4Y2VwdEhhbmRsZXIubmFtZSkKLQkJVklTSVQoc3QsIGV4cHIsIGVoLT52LkV4Y2VwdEhhbmRsZXIubmFtZSk7Ci0JVklTSVRfU0VRKHN0LCBzdG10LCBlaC0+di5FeGNlcHRIYW5kbGVyLmJvZHkpOwotCXJldHVybiAxOworICAgIGlmIChlaC0+di5FeGNlcHRIYW5kbGVyLnR5cGUpCisgICAgICAgIFZJU0lUKHN0LCBleHByLCBlaC0+di5FeGNlcHRIYW5kbGVyLnR5cGUpOworICAgIGlmIChlaC0+di5FeGNlcHRIYW5kbGVyLm5hbWUpCisgICAgICAgIFZJU0lUKHN0LCBleHByLCBlaC0+di5FeGNlcHRIYW5kbGVyLm5hbWUpOworICAgIFZJU0lUX1NFUShzdCwgc3RtdCwgZWgtPnYuRXhjZXB0SGFuZGxlci5ib2R5KTsKKyAgICByZXR1cm4gMTsKIH0KIAogCi1zdGF0aWMgaW50IAorc3RhdGljIGludAogc3ltdGFibGVfdmlzaXRfYWxpYXMoc3RydWN0IHN5bXRhYmxlICpzdCwgYWxpYXNfdHkgYSkKIHsKLQkvKiBDb21wdXRlIHN0b3JlX25hbWUsIHRoZSBuYW1lIGFjdHVhbGx5IGJvdW5kIGJ5IHRoZSBpbXBvcnQKLQkgICBvcGVyYXRpb24uICBJdCBpcyBkaWZlcmVudCB0aGFuIGEtPm5hbWUgd2hlbiBhLT5uYW1lIGlzIGEKLQkgICBkb3R0ZWQgcGFja2FnZSBuYW1lIChlLmcuIHNwYW0uZWdncykgCi0JKi8KLQlQeU9iamVjdCAqc3RvcmVfbmFtZTsKLQlQeU9iamVjdCAqbmFtZSA9IChhLT5hc25hbWUgPT0gTlVMTCkgPyBhLT5uYW1lIDogYS0+YXNuYW1lOwotCWNvbnN0IGNoYXIgKmJhc2UgPSBQeVN0cmluZ19BU19TVFJJTkcobmFtZSk7Ci0JY2hhciAqZG90ID0gc3RyY2hyKGJhc2UsICcuJyk7Ci0JaWYgKGRvdCkgewotCQlzdG9yZV9uYW1lID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoYmFzZSwgZG90IC0gYmFzZSk7Ci0JCWlmICghc3RvcmVfbmFtZSkKLQkJCXJldHVybiAwOwotCX0KLQllbHNlIHsKLQkJc3RvcmVfbmFtZSA9IG5hbWU7Ci0JCVB5X0lOQ1JFRihzdG9yZV9uYW1lKTsKLQl9Ci0JaWYgKHN0cmNtcChQeVN0cmluZ19BU19TVFJJTkcobmFtZSksICIqIikpIHsKLQkJaW50IHIgPSBzeW10YWJsZV9hZGRfZGVmKHN0LCBzdG9yZV9uYW1lLCBERUZfSU1QT1JUKTsgCi0JCVB5X0RFQ1JFRihzdG9yZV9uYW1lKTsKLQkJcmV0dXJuIHI7Ci0JfQotCWVsc2UgewotICAgICAgICAgICAgaWYgKHN0LT5zdF9jdXItPnN0ZV90eXBlICE9IE1vZHVsZUJsb2NrKSB7Ci0gICAgICAgICAgICAgICAgaW50IGxpbmVubyA9IHN0LT5zdF9jdXItPnN0ZV9saW5lbm87Ci0gICAgICAgICAgICAgICAgaWYgKCFzeW10YWJsZV93YXJuKHN0LCBJTVBPUlRfU1RBUl9XQVJOSU5HLCBsaW5lbm8pKSB7Ci0gICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihzdG9yZV9uYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0JCX0KLSAgICAgICAgICAgIH0KLQkgICAgc3QtPnN0X2N1ci0+c3RlX3Vub3B0aW1pemVkIHw9IE9QVF9JTVBPUlRfU1RBUjsKLQkgICAgUHlfREVDUkVGKHN0b3JlX25hbWUpOwotCSAgICByZXR1cm4gMTsKLQl9CisgICAgLyogQ29tcHV0ZSBzdG9yZV9uYW1lLCB0aGUgbmFtZSBhY3R1YWxseSBib3VuZCBieSB0aGUgaW1wb3J0CisgICAgICAgb3BlcmF0aW9uLiAgSXQgaXMgZGlmZXJlbnQgdGhhbiBhLT5uYW1lIHdoZW4gYS0+bmFtZSBpcyBhCisgICAgICAgZG90dGVkIHBhY2thZ2UgbmFtZSAoZS5nLiBzcGFtLmVnZ3MpCisgICAgKi8KKyAgICBQeU9iamVjdCAqc3RvcmVfbmFtZTsKKyAgICBQeU9iamVjdCAqbmFtZSA9IChhLT5hc25hbWUgPT0gTlVMTCkgPyBhLT5uYW1lIDogYS0+YXNuYW1lOworICAgIGNvbnN0IGNoYXIgKmJhc2UgPSBQeVN0cmluZ19BU19TVFJJTkcobmFtZSk7CisgICAgY2hhciAqZG90ID0gc3RyY2hyKGJhc2UsICcuJyk7CisgICAgaWYgKGRvdCkgeworICAgICAgICBzdG9yZV9uYW1lID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoYmFzZSwgZG90IC0gYmFzZSk7CisgICAgICAgIGlmICghc3RvcmVfbmFtZSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgc3RvcmVfbmFtZSA9IG5hbWU7CisgICAgICAgIFB5X0lOQ1JFRihzdG9yZV9uYW1lKTsKKyAgICB9CisgICAgaWYgKHN0cmNtcChQeVN0cmluZ19BU19TVFJJTkcobmFtZSksICIqIikpIHsKKyAgICAgICAgaW50IHIgPSBzeW10YWJsZV9hZGRfZGVmKHN0LCBzdG9yZV9uYW1lLCBERUZfSU1QT1JUKTsKKyAgICAgICAgUHlfREVDUkVGKHN0b3JlX25hbWUpOworICAgICAgICByZXR1cm4gcjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGlmIChzdC0+c3RfY3VyLT5zdGVfdHlwZSAhPSBNb2R1bGVCbG9jaykgeworICAgICAgICBpbnQgbGluZW5vID0gc3QtPnN0X2N1ci0+c3RlX2xpbmVubzsKKyAgICAgICAgaWYgKCFzeW10YWJsZV93YXJuKHN0LCBJTVBPUlRfU1RBUl9XQVJOSU5HLCBsaW5lbm8pKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoc3RvcmVfbmFtZSk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHN0LT5zdF9jdXItPnN0ZV91bm9wdGltaXplZCB8PSBPUFRfSU1QT1JUX1NUQVI7CisgICAgICAgIFB5X0RFQ1JFRihzdG9yZV9uYW1lKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQogfQogCiAKLXN0YXRpYyBpbnQgCitzdGF0aWMgaW50CiBzeW10YWJsZV92aXNpdF9jb21wcmVoZW5zaW9uKHN0cnVjdCBzeW10YWJsZSAqc3QsIGNvbXByZWhlbnNpb25fdHkgbGMpCiB7Ci0JVklTSVQoc3QsIGV4cHIsIGxjLT50YXJnZXQpOwotCVZJU0lUKHN0LCBleHByLCBsYy0+aXRlcik7Ci0JVklTSVRfU0VRKHN0LCBleHByLCBsYy0+aWZzKTsKLQlyZXR1cm4gMTsKKyAgICBWSVNJVChzdCwgZXhwciwgbGMtPnRhcmdldCk7CisgICAgVklTSVQoc3QsIGV4cHIsIGxjLT5pdGVyKTsKKyAgICBWSVNJVF9TRVEoc3QsIGV4cHIsIGxjLT5pZnMpOworICAgIHJldHVybiAxOwogfQogCiAKLXN0YXRpYyBpbnQgCitzdGF0aWMgaW50CiBzeW10YWJsZV92aXNpdF9rZXl3b3JkKHN0cnVjdCBzeW10YWJsZSAqc3QsIGtleXdvcmRfdHkgaykKIHsKLQlWSVNJVChzdCwgZXhwciwgay0+dmFsdWUpOwotCXJldHVybiAxOworICAgIFZJU0lUKHN0LCBleHByLCBrLT52YWx1ZSk7CisgICAgcmV0dXJuIDE7CiB9CiAKIAotc3RhdGljIGludCAKK3N0YXRpYyBpbnQKIHN5bXRhYmxlX3Zpc2l0X3NsaWNlKHN0cnVjdCBzeW10YWJsZSAqc3QsIHNsaWNlX3R5IHMpCiB7Ci0Jc3dpdGNoIChzLT5raW5kKSB7Ci0JY2FzZSBTbGljZV9raW5kOgotCQlpZiAocy0+di5TbGljZS5sb3dlcikKLQkJCVZJU0lUKHN0LCBleHByLCBzLT52LlNsaWNlLmxvd2VyKQotCQlpZiAocy0+di5TbGljZS51cHBlcikKLQkJCVZJU0lUKHN0LCBleHByLCBzLT52LlNsaWNlLnVwcGVyKQotCQlpZiAocy0+di5TbGljZS5zdGVwKQotCQkJVklTSVQoc3QsIGV4cHIsIHMtPnYuU2xpY2Uuc3RlcCkKLQkJYnJlYWs7Ci0JY2FzZSBFeHRTbGljZV9raW5kOgotCQlWSVNJVF9TRVEoc3QsIHNsaWNlLCBzLT52LkV4dFNsaWNlLmRpbXMpCi0JCWJyZWFrOwotCWNhc2UgSW5kZXhfa2luZDoKLQkJVklTSVQoc3QsIGV4cHIsIHMtPnYuSW5kZXgudmFsdWUpCi0JCWJyZWFrOwotCWNhc2UgRWxsaXBzaXNfa2luZDoKLQkJYnJlYWs7Ci0JfQotCXJldHVybiAxOworICAgIHN3aXRjaCAocy0+a2luZCkgeworICAgIGNhc2UgU2xpY2Vfa2luZDoKKyAgICAgICAgaWYgKHMtPnYuU2xpY2UubG93ZXIpCisgICAgICAgICAgICBWSVNJVChzdCwgZXhwciwgcy0+di5TbGljZS5sb3dlcikKKyAgICAgICAgaWYgKHMtPnYuU2xpY2UudXBwZXIpCisgICAgICAgICAgICBWSVNJVChzdCwgZXhwciwgcy0+di5TbGljZS51cHBlcikKKyAgICAgICAgaWYgKHMtPnYuU2xpY2Uuc3RlcCkKKyAgICAgICAgICAgIFZJU0lUKHN0LCBleHByLCBzLT52LlNsaWNlLnN0ZXApCisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRXh0U2xpY2Vfa2luZDoKKyAgICAgICAgVklTSVRfU0VRKHN0LCBzbGljZSwgcy0+di5FeHRTbGljZS5kaW1zKQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEluZGV4X2tpbmQ6CisgICAgICAgIFZJU0lUKHN0LCBleHByLCBzLT52LkluZGV4LnZhbHVlKQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEVsbGlwc2lzX2tpbmQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gMTsKIH0KIAotc3RhdGljIGludCAKK3N0YXRpYyBpbnQKIHN5bXRhYmxlX3Zpc2l0X2dlbmV4cChzdHJ1Y3Qgc3ltdGFibGUgKnN0LCBleHByX3R5IGUpCiB7Ci0JY29tcHJlaGVuc2lvbl90eSBvdXRlcm1vc3QgPSAoKGNvbXByZWhlbnNpb25fdHkpCi0JCQkgKGFzZGxfc2VxX0dFVChlLT52LkdlbmVyYXRvckV4cC5nZW5lcmF0b3JzLCAwKSkpOwotCS8qIE91dGVybW9zdCBpdGVyYXRvciBpcyBldmFsdWF0ZWQgaW4gY3VycmVudCBzY29wZSAqLwotCVZJU0lUKHN0LCBleHByLCBvdXRlcm1vc3QtPml0ZXIpOwotCS8qIENyZWF0ZSBnZW5lcmF0b3Igc2NvcGUgZm9yIHRoZSByZXN0ICovCi0JaWYgKCFHRVRfSURFTlRJRklFUihnZW5leHByKSB8fAotCSAgICAhc3ltdGFibGVfZW50ZXJfYmxvY2soc3QsIGdlbmV4cHIsIEZ1bmN0aW9uQmxvY2ssICh2b2lkICopZSwgZS0+bGluZW5vKSkgewotCQlyZXR1cm4gMDsKLQl9Ci0Jc3QtPnN0X2N1ci0+c3RlX2dlbmVyYXRvciA9IDE7Ci0JLyogT3V0ZXJtb3N0IGl0ZXIgaXMgcmVjZWl2ZWQgYXMgYW4gYXJndW1lbnQgKi8KLQlpZiAoIXN5bXRhYmxlX2ltcGxpY2l0X2FyZyhzdCwgMCkpIHsKLQkJc3ltdGFibGVfZXhpdF9ibG9jayhzdCwgKHZvaWQgKillKTsKLQkJcmV0dXJuIDA7Ci0JfQotCVZJU0lUX0lOX0JMT0NLKHN0LCBleHByLCBvdXRlcm1vc3QtPnRhcmdldCwgKHZvaWQqKWUpOwotCVZJU0lUX1NFUV9JTl9CTE9DSyhzdCwgZXhwciwgb3V0ZXJtb3N0LT5pZnMsICh2b2lkKillKTsKLQlWSVNJVF9TRVFfVEFJTF9JTl9CTE9DSyhzdCwgY29tcHJlaGVuc2lvbiwKLQkJCQllLT52LkdlbmVyYXRvckV4cC5nZW5lcmF0b3JzLCAxLCAodm9pZCopZSk7Ci0JVklTSVRfSU5fQkxPQ0soc3QsIGV4cHIsIGUtPnYuR2VuZXJhdG9yRXhwLmVsdCwgKHZvaWQqKWUpOwotCXJldHVybiBzeW10YWJsZV9leGl0X2Jsb2NrKHN0LCAodm9pZCAqKWUpOworICAgIGNvbXByZWhlbnNpb25fdHkgb3V0ZXJtb3N0ID0gKChjb21wcmVoZW5zaW9uX3R5KQorICAgICAgICAgICAgICAgICAgICAgKGFzZGxfc2VxX0dFVChlLT52LkdlbmVyYXRvckV4cC5nZW5lcmF0b3JzLCAwKSkpOworICAgIC8qIE91dGVybW9zdCBpdGVyYXRvciBpcyBldmFsdWF0ZWQgaW4gY3VycmVudCBzY29wZSAqLworICAgIFZJU0lUKHN0LCBleHByLCBvdXRlcm1vc3QtPml0ZXIpOworICAgIC8qIENyZWF0ZSBnZW5lcmF0b3Igc2NvcGUgZm9yIHRoZSByZXN0ICovCisgICAgaWYgKCFHRVRfSURFTlRJRklFUihnZW5leHByKSB8fAorICAgICAgICAhc3ltdGFibGVfZW50ZXJfYmxvY2soc3QsIGdlbmV4cHIsIEZ1bmN0aW9uQmxvY2ssICh2b2lkICopZSwgZS0+bGluZW5vKSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgc3QtPnN0X2N1ci0+c3RlX2dlbmVyYXRvciA9IDE7CisgICAgLyogT3V0ZXJtb3N0IGl0ZXIgaXMgcmVjZWl2ZWQgYXMgYW4gYXJndW1lbnQgKi8KKyAgICBpZiAoIXN5bXRhYmxlX2ltcGxpY2l0X2FyZyhzdCwgMCkpIHsKKyAgICAgICAgc3ltdGFibGVfZXhpdF9ibG9jayhzdCwgKHZvaWQgKillKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIFZJU0lUX0lOX0JMT0NLKHN0LCBleHByLCBvdXRlcm1vc3QtPnRhcmdldCwgKHZvaWQqKWUpOworICAgIFZJU0lUX1NFUV9JTl9CTE9DSyhzdCwgZXhwciwgb3V0ZXJtb3N0LT5pZnMsICh2b2lkKillKTsKKyAgICBWSVNJVF9TRVFfVEFJTF9JTl9CTE9DSyhzdCwgY29tcHJlaGVuc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLT52LkdlbmVyYXRvckV4cC5nZW5lcmF0b3JzLCAxLCAodm9pZCopZSk7CisgICAgVklTSVRfSU5fQkxPQ0soc3QsIGV4cHIsIGUtPnYuR2VuZXJhdG9yRXhwLmVsdCwgKHZvaWQqKWUpOworICAgIHJldHVybiBzeW10YWJsZV9leGl0X2Jsb2NrKHN0LCAodm9pZCAqKWUpOwogfQpkaWZmIC0tZ2l0IGEvUHl0aG9uL3N5c21vZHVsZS5jIGIvUHl0aG9uL3N5c21vZHVsZS5jCmluZGV4IDcyMWY3N2QuLjZhYTNjZGIgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9zeXNtb2R1bGUuYworKysgYi9QeXRob24vc3lzbW9kdWxlLmMKQEAgLTQ5LDc4ICs0OSw3OCBAQAogUHlPYmplY3QgKgogUHlTeXNfR2V0T2JqZWN0KGNoYXIgKm5hbWUpCiB7Ci0JUHlUaHJlYWRTdGF0ZSAqdHN0YXRlID0gUHlUaHJlYWRTdGF0ZV9HRVQoKTsKLQlQeU9iamVjdCAqc2QgPSB0c3RhdGUtPmludGVycC0+c3lzZGljdDsKLQlpZiAoc2QgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIFB5RGljdF9HZXRJdGVtU3RyaW5nKHNkLCBuYW1lKTsKKyAgICBQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dFVCgpOworICAgIFB5T2JqZWN0ICpzZCA9IHRzdGF0ZS0+aW50ZXJwLT5zeXNkaWN0OworICAgIGlmIChzZCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gUHlEaWN0X0dldEl0ZW1TdHJpbmcoc2QsIG5hbWUpOwogfQogCiBGSUxFICoKIFB5U3lzX0dldEZpbGUoY2hhciAqbmFtZSwgRklMRSAqZGVmKQogewotCUZJTEUgKmZwID0gTlVMTDsKLQlQeU9iamVjdCAqdiA9IFB5U3lzX0dldE9iamVjdChuYW1lKTsKLQlpZiAodiAhPSBOVUxMICYmIFB5RmlsZV9DaGVjayh2KSkKLQkJZnAgPSBQeUZpbGVfQXNGaWxlKHYpOwotCWlmIChmcCA9PSBOVUxMKQotCQlmcCA9IGRlZjsKLQlyZXR1cm4gZnA7CisgICAgRklMRSAqZnAgPSBOVUxMOworICAgIFB5T2JqZWN0ICp2ID0gUHlTeXNfR2V0T2JqZWN0KG5hbWUpOworICAgIGlmICh2ICE9IE5VTEwgJiYgUHlGaWxlX0NoZWNrKHYpKQorICAgICAgICBmcCA9IFB5RmlsZV9Bc0ZpbGUodik7CisgICAgaWYgKGZwID09IE5VTEwpCisgICAgICAgIGZwID0gZGVmOworICAgIHJldHVybiBmcDsKIH0KIAogaW50CiBQeVN5c19TZXRPYmplY3QoY2hhciAqbmFtZSwgUHlPYmplY3QgKnYpCiB7Ci0JUHlUaHJlYWRTdGF0ZSAqdHN0YXRlID0gUHlUaHJlYWRTdGF0ZV9HRVQoKTsKLQlQeU9iamVjdCAqc2QgPSB0c3RhdGUtPmludGVycC0+c3lzZGljdDsKLQlpZiAodiA9PSBOVUxMKSB7Ci0JCWlmIChQeURpY3RfR2V0SXRlbVN0cmluZyhzZCwgbmFtZSkgPT0gTlVMTCkKLQkJCXJldHVybiAwOwotCQllbHNlCi0JCQlyZXR1cm4gUHlEaWN0X0RlbEl0ZW1TdHJpbmcoc2QsIG5hbWUpOwotCX0KLQllbHNlCi0JCXJldHVybiBQeURpY3RfU2V0SXRlbVN0cmluZyhzZCwgbmFtZSwgdik7CisgICAgUHlUaHJlYWRTdGF0ZSAqdHN0YXRlID0gUHlUaHJlYWRTdGF0ZV9HRVQoKTsKKyAgICBQeU9iamVjdCAqc2QgPSB0c3RhdGUtPmludGVycC0+c3lzZGljdDsKKyAgICBpZiAodiA9PSBOVUxMKSB7CisgICAgICAgIGlmIChQeURpY3RfR2V0SXRlbVN0cmluZyhzZCwgbmFtZSkgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gUHlEaWN0X0RlbEl0ZW1TdHJpbmcoc2QsIG5hbWUpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiBQeURpY3RfU2V0SXRlbVN0cmluZyhzZCwgbmFtZSwgdik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzeXNfZGlzcGxheWhvb2soUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpvKQogewotCVB5T2JqZWN0ICpvdXRmOwotCVB5SW50ZXJwcmV0ZXJTdGF0ZSAqaW50ZXJwID0gUHlUaHJlYWRTdGF0ZV9HRVQoKS0+aW50ZXJwOwotCVB5T2JqZWN0ICptb2R1bGVzID0gaW50ZXJwLT5tb2R1bGVzOwotCVB5T2JqZWN0ICpidWlsdGlucyA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKG1vZHVsZXMsICJfX2J1aWx0aW5fXyIpOworICAgIFB5T2JqZWN0ICpvdXRmOworICAgIFB5SW50ZXJwcmV0ZXJTdGF0ZSAqaW50ZXJwID0gUHlUaHJlYWRTdGF0ZV9HRVQoKS0+aW50ZXJwOworICAgIFB5T2JqZWN0ICptb2R1bGVzID0gaW50ZXJwLT5tb2R1bGVzOworICAgIFB5T2JqZWN0ICpidWlsdGlucyA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKG1vZHVsZXMsICJfX2J1aWx0aW5fXyIpOwogCi0JaWYgKGJ1aWx0aW5zID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgImxvc3QgX19idWlsdGluX18iKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChidWlsdGlucyA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJsb3N0IF9fYnVpbHRpbl9fIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCS8qIFByaW50IHZhbHVlIGV4Y2VwdCBpZiBOb25lICovCi0JLyogQWZ0ZXIgcHJpbnRpbmcsIGFsc28gYXNzaWduIHRvICdfJyAqLwotCS8qIEJlZm9yZSwgc2V0ICdfJyB0byBOb25lIHRvIGF2b2lkIHJlY3Vyc2lvbiAqLwotCWlmIChvID09IFB5X05vbmUpIHsKLQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQlyZXR1cm4gUHlfTm9uZTsKLQl9Ci0JaWYgKFB5T2JqZWN0X1NldEF0dHJTdHJpbmcoYnVpbHRpbnMsICJfIiwgUHlfTm9uZSkgIT0gMCkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKFB5X0ZsdXNoTGluZSgpICE9IDApCi0JCXJldHVybiBOVUxMOwotCW91dGYgPSBQeVN5c19HZXRPYmplY3QoInN0ZG91dCIpOwotCWlmIChvdXRmID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgImxvc3Qgc3lzLnN0ZG91dCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKFB5RmlsZV9Xcml0ZU9iamVjdChvLCBvdXRmLCAwKSAhPSAwKQotCQlyZXR1cm4gTlVMTDsKLQlQeUZpbGVfU29mdFNwYWNlKG91dGYsIDEpOwotCWlmIChQeV9GbHVzaExpbmUoKSAhPSAwKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoUHlPYmplY3RfU2V0QXR0clN0cmluZyhidWlsdGlucywgIl8iLCBvKSAhPSAwKQotCQlyZXR1cm4gTlVMTDsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgLyogUHJpbnQgdmFsdWUgZXhjZXB0IGlmIE5vbmUgKi8KKyAgICAvKiBBZnRlciBwcmludGluZywgYWxzbyBhc3NpZ24gdG8gJ18nICovCisgICAgLyogQmVmb3JlLCBzZXQgJ18nIHRvIE5vbmUgdG8gYXZvaWQgcmVjdXJzaW9uICovCisgICAgaWYgKG8gPT0gUHlfTm9uZSkgeworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIHJldHVybiBQeV9Ob25lOworICAgIH0KKyAgICBpZiAoUHlPYmplY3RfU2V0QXR0clN0cmluZyhidWlsdGlucywgIl8iLCBQeV9Ob25lKSAhPSAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoUHlfRmx1c2hMaW5lKCkgIT0gMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgb3V0ZiA9IFB5U3lzX0dldE9iamVjdCgic3Rkb3V0Iik7CisgICAgaWYgKG91dGYgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAibG9zdCBzeXMuc3Rkb3V0Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoUHlGaWxlX1dyaXRlT2JqZWN0KG8sIG91dGYsIDApICE9IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5RmlsZV9Tb2Z0U3BhY2Uob3V0ZiwgMSk7CisgICAgaWYgKFB5X0ZsdXNoTGluZSgpICE9IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChQeU9iamVjdF9TZXRBdHRyU3RyaW5nKGJ1aWx0aW5zLCAiXyIsIG8pICE9IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogUHlEb2NfU1RSVkFSKGRpc3BsYXlob29rX2RvYywKQEAgLTEzMiwxMiArMTMyLDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3lzX2V4Y2VwdGhvb2soUHlPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKQogewotCVB5T2JqZWN0ICpleGMsICp2YWx1ZSwgKnRiOwotCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImV4Y2VwdGhvb2siLCAzLCAzLCAmZXhjLCAmdmFsdWUsICZ0YikpCi0JCXJldHVybiBOVUxMOwotCVB5RXJyX0Rpc3BsYXkoZXhjLCB2YWx1ZSwgdGIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeU9iamVjdCAqZXhjLCAqdmFsdWUsICp0YjsKKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJleGNlcHRob29rIiwgMywgMywgJmV4YywgJnZhbHVlLCAmdGIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQeUVycl9EaXNwbGF5KGV4YywgdmFsdWUsIHRiKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIFB5RG9jX1NUUlZBUihleGNlcHRob29rX2RvYywKQEAgLTE0OSwxNCArMTQ5LDE0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3lzX2V4Y19pbmZvKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqbm9hcmdzKQogewotCVB5VGhyZWFkU3RhdGUgKnRzdGF0ZTsKLQl0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dFVCgpOwotCXJldHVybiBQeV9CdWlsZFZhbHVlKAotCQkiKE9PTykiLAotCQl0c3RhdGUtPmV4Y190eXBlICE9IE5VTEwgPyB0c3RhdGUtPmV4Y190eXBlIDogUHlfTm9uZSwKLQkJdHN0YXRlLT5leGNfdmFsdWUgIT0gTlVMTCA/IHRzdGF0ZS0+ZXhjX3ZhbHVlIDogUHlfTm9uZSwKLQkJdHN0YXRlLT5leGNfdHJhY2ViYWNrICE9IE5VTEwgPwotCQkJdHN0YXRlLT5leGNfdHJhY2ViYWNrIDogUHlfTm9uZSk7CisgICAgUHlUaHJlYWRTdGF0ZSAqdHN0YXRlOworICAgIHRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfR0VUKCk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoCisgICAgICAgICIoT09PKSIsCisgICAgICAgIHRzdGF0ZS0+ZXhjX3R5cGUgIT0gTlVMTCA/IHRzdGF0ZS0+ZXhjX3R5cGUgOiBQeV9Ob25lLAorICAgICAgICB0c3RhdGUtPmV4Y192YWx1ZSAhPSBOVUxMID8gdHN0YXRlLT5leGNfdmFsdWUgOiBQeV9Ob25lLAorICAgICAgICB0c3RhdGUtPmV4Y190cmFjZWJhY2sgIT0gTlVMTCA/CisgICAgICAgICAgICB0c3RhdGUtPmV4Y190cmFjZWJhY2sgOiBQeV9Ob25lKTsKIH0KIAogUHlEb2NfU1RSVkFSKGV4Y19pbmZvX2RvYywKQEAgLTE2OSwyOSArMTY5LDI5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3lzX2V4Y19jbGVhcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm5vYXJncykKIHsKLQlQeVRocmVhZFN0YXRlICp0c3RhdGU7Ci0JUHlPYmplY3QgKnRtcF90eXBlLCAqdG1wX3ZhbHVlLCAqdG1wX3RiOworICAgIFB5VGhyZWFkU3RhdGUgKnRzdGF0ZTsKKyAgICBQeU9iamVjdCAqdG1wX3R5cGUsICp0bXBfdmFsdWUsICp0bXBfdGI7CiAKLQlpZiAoUHlFcnJfV2FyblB5M2soInN5cy5leGNfY2xlYXIoKSBub3Qgc3VwcG9ydGVkIGluIDMueDsgIgotCQkJICAgInVzZSBleGNlcHQgY2xhdXNlcyIsIDEpIDwgMCkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKFB5RXJyX1dhcm5QeTNrKCJzeXMuZXhjX2NsZWFyKCkgbm90IHN1cHBvcnRlZCBpbiAzLng7ICIKKyAgICAgICAgICAgICAgICAgICAgICAgInVzZSBleGNlcHQgY2xhdXNlcyIsIDEpIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQl0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dFVCgpOwotCXRtcF90eXBlID0gdHN0YXRlLT5leGNfdHlwZTsKLQl0bXBfdmFsdWUgPSB0c3RhdGUtPmV4Y192YWx1ZTsKLQl0bXBfdGIgPSB0c3RhdGUtPmV4Y190cmFjZWJhY2s7Ci0JdHN0YXRlLT5leGNfdHlwZSA9IE5VTEw7Ci0JdHN0YXRlLT5leGNfdmFsdWUgPSBOVUxMOwotCXRzdGF0ZS0+ZXhjX3RyYWNlYmFjayA9IE5VTEw7Ci0JUHlfWERFQ1JFRih0bXBfdHlwZSk7Ci0JUHlfWERFQ1JFRih0bXBfdmFsdWUpOwotCVB5X1hERUNSRUYodG1wX3RiKTsKLQkvKiBGb3IgYi93IGNvbXBhdGliaWxpdHkgKi8KLQlQeVN5c19TZXRPYmplY3QoImV4Y190eXBlIiwgUHlfTm9uZSk7Ci0JUHlTeXNfU2V0T2JqZWN0KCJleGNfdmFsdWUiLCBQeV9Ob25lKTsKLQlQeVN5c19TZXRPYmplY3QoImV4Y190cmFjZWJhY2siLCBQeV9Ob25lKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgdHN0YXRlID0gUHlUaHJlYWRTdGF0ZV9HRVQoKTsKKyAgICB0bXBfdHlwZSA9IHRzdGF0ZS0+ZXhjX3R5cGU7CisgICAgdG1wX3ZhbHVlID0gdHN0YXRlLT5leGNfdmFsdWU7CisgICAgdG1wX3RiID0gdHN0YXRlLT5leGNfdHJhY2ViYWNrOworICAgIHRzdGF0ZS0+ZXhjX3R5cGUgPSBOVUxMOworICAgIHRzdGF0ZS0+ZXhjX3ZhbHVlID0gTlVMTDsKKyAgICB0c3RhdGUtPmV4Y190cmFjZWJhY2sgPSBOVUxMOworICAgIFB5X1hERUNSRUYodG1wX3R5cGUpOworICAgIFB5X1hERUNSRUYodG1wX3ZhbHVlKTsKKyAgICBQeV9YREVDUkVGKHRtcF90Yik7CisgICAgLyogRm9yIGIvdyBjb21wYXRpYmlsaXR5ICovCisgICAgUHlTeXNfU2V0T2JqZWN0KCJleGNfdHlwZSIsIFB5X05vbmUpOworICAgIFB5U3lzX1NldE9iamVjdCgiZXhjX3ZhbHVlIiwgUHlfTm9uZSk7CisgICAgUHlTeXNfU2V0T2JqZWN0KCJleGNfdHJhY2ViYWNrIiwgUHlfTm9uZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBQeURvY19TVFJWQVIoZXhjX2NsZWFyX2RvYywKQEAgLTIwNiwxMiArMjA2LDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3lzX2V4aXQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICpleGl0X2NvZGUgPSAwOwotCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImV4aXQiLCAwLCAxLCAmZXhpdF9jb2RlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JLyogUmFpc2UgU3lzdGVtRXhpdCBzbyBjYWxsZXJzIG1heSBjYXRjaCBpdCBvciBjbGVhbiB1cC4gKi8KLQlQeUVycl9TZXRPYmplY3QoUHlFeGNfU3lzdGVtRXhpdCwgZXhpdF9jb2RlKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeU9iamVjdCAqZXhpdF9jb2RlID0gMDsKKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJleGl0IiwgMCwgMSwgJmV4aXRfY29kZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIC8qIFJhaXNlIFN5c3RlbUV4aXQgc28gY2FsbGVycyBtYXkgY2F0Y2ggaXQgb3IgY2xlYW4gdXAuICovCisgICAgUHlFcnJfU2V0T2JqZWN0KFB5RXhjX1N5c3RlbUV4aXQsIGV4aXRfY29kZSk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIFB5RG9jX1NUUlZBUihleGl0X2RvYywKQEAgLTIyOSw3ICsyMjksNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHN5c19nZXRkZWZhdWx0ZW5jb2RpbmcoUHlPYmplY3QgKnNlbGYpCiB7Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoUHlVbmljb2RlX0dldERlZmF1bHRFbmNvZGluZygpKTsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhQeVVuaWNvZGVfR2V0RGVmYXVsdEVuY29kaW5nKCkpOwogfQogCiBQeURvY19TVFJWQVIoZ2V0ZGVmYXVsdGVuY29kaW5nX2RvYywKQEAgLTI0MiwxMyArMjQyLDEzIEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3lzX3NldGRlZmF1bHRlbmNvZGluZyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqZW5jb2Rpbmc7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOnNldGRlZmF1bHRlbmNvZGluZyIsICZlbmNvZGluZykpCi0JCXJldHVybiBOVUxMOwotCWlmIChQeVVuaWNvZGVfU2V0RGVmYXVsdEVuY29kaW5nKGVuY29kaW5nKSkKLQkgICAgCXJldHVybiBOVUxMOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBjaGFyICplbmNvZGluZzsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6c2V0ZGVmYXVsdGVuY29kaW5nIiwgJmVuY29kaW5nKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKFB5VW5pY29kZV9TZXREZWZhdWx0RW5jb2RpbmcoZW5jb2RpbmcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIFB5RG9jX1NUUlZBUihzZXRkZWZhdWx0ZW5jb2RpbmdfZG9jLApAQCAtMjYwLDEwICsyNjAsMTAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzeXNfZ2V0ZmlsZXN5c3RlbWVuY29kaW5nKFB5T2JqZWN0ICpzZWxmKQogewotCWlmIChQeV9GaWxlU3lzdGVtRGVmYXVsdEVuY29kaW5nKQotCQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhQeV9GaWxlU3lzdGVtRGVmYXVsdEVuY29kaW5nKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKFB5X0ZpbGVTeXN0ZW1EZWZhdWx0RW5jb2RpbmcpCisgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKFB5X0ZpbGVTeXN0ZW1EZWZhdWx0RW5jb2RpbmcpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogUHlEb2NfU1RSVkFSKGdldGZpbGVzeXN0ZW1lbmNvZGluZ19kb2MsCkBAIC0yODQsMTE2ICsyODQsMTE2IEBACiBzdGF0aWMgaW50CiB0cmFjZV9pbml0KHZvaWQpCiB7Ci0Jc3RhdGljIGNoYXIgKndoYXRuYW1lc1s3XSA9IHsiY2FsbCIsICJleGNlcHRpb24iLCAibGluZSIsICJyZXR1cm4iLAotCQkJCQkiY19jYWxsIiwgImNfZXhjZXB0aW9uIiwgImNfcmV0dXJuIn07Ci0JUHlPYmplY3QgKm5hbWU7Ci0JaW50IGk7Ci0JZm9yIChpID0gMDsgaSA8IDc7ICsraSkgewotCQlpZiAod2hhdHN0cmluZ3NbaV0gPT0gTlVMTCkgewotCQkJbmFtZSA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcod2hhdG5hbWVzW2ldKTsKLQkJCWlmIChuYW1lID09IE5VTEwpCi0JCQkJcmV0dXJuIC0xOwotCQkJd2hhdHN0cmluZ3NbaV0gPSBuYW1lOwotICAgICAgICAgICAgICAgIH0KLQl9Ci0JcmV0dXJuIDA7CisgICAgc3RhdGljIGNoYXIgKndoYXRuYW1lc1s3XSA9IHsiY2FsbCIsICJleGNlcHRpb24iLCAibGluZSIsICJyZXR1cm4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNfY2FsbCIsICJjX2V4Y2VwdGlvbiIsICJjX3JldHVybiJ9OworICAgIFB5T2JqZWN0ICpuYW1lOworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCA3OyArK2kpIHsKKyAgICAgICAgaWYgKHdoYXRzdHJpbmdzW2ldID09IE5VTEwpIHsKKyAgICAgICAgICAgIG5hbWUgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKHdoYXRuYW1lc1tpXSk7CisgICAgICAgICAgICBpZiAobmFtZSA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIHdoYXRzdHJpbmdzW2ldID0gbmFtZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogCiBzdGF0aWMgUHlPYmplY3QgKgogY2FsbF90cmFtcG9saW5lKFB5VGhyZWFkU3RhdGUgKnRzdGF0ZSwgUHlPYmplY3QqIGNhbGxiYWNrLAotCQlQeUZyYW1lT2JqZWN0ICpmcmFtZSwgaW50IHdoYXQsIFB5T2JqZWN0ICphcmcpCisgICAgICAgICAgICAgICAgUHlGcmFtZU9iamVjdCAqZnJhbWUsIGludCB3aGF0LCBQeU9iamVjdCAqYXJnKQogewotCVB5T2JqZWN0ICphcmdzID0gUHlUdXBsZV9OZXcoMyk7Ci0JUHlPYmplY3QgKndoYXRzdHI7Ci0JUHlPYmplY3QgKnJlc3VsdDsKKyAgICBQeU9iamVjdCAqYXJncyA9IFB5VHVwbGVfTmV3KDMpOworICAgIFB5T2JqZWN0ICp3aGF0c3RyOworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CiAKLQlpZiAoYXJncyA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlQeV9JTkNSRUYoZnJhbWUpOwotCXdoYXRzdHIgPSB3aGF0c3RyaW5nc1t3aGF0XTsKLQlQeV9JTkNSRUYod2hhdHN0cik7Ci0JaWYgKGFyZyA9PSBOVUxMKQotCQlhcmcgPSBQeV9Ob25lOwotCVB5X0lOQ1JFRihhcmcpOwotCVB5VHVwbGVfU0VUX0lURU0oYXJncywgMCwgKFB5T2JqZWN0ICopZnJhbWUpOwotCVB5VHVwbGVfU0VUX0lURU0oYXJncywgMSwgd2hhdHN0cik7Ci0JUHlUdXBsZV9TRVRfSVRFTShhcmdzLCAyLCBhcmcpOworICAgIGlmIChhcmdzID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5X0lOQ1JFRihmcmFtZSk7CisgICAgd2hhdHN0ciA9IHdoYXRzdHJpbmdzW3doYXRdOworICAgIFB5X0lOQ1JFRih3aGF0c3RyKTsKKyAgICBpZiAoYXJnID09IE5VTEwpCisgICAgICAgIGFyZyA9IFB5X05vbmU7CisgICAgUHlfSU5DUkVGKGFyZyk7CisgICAgUHlUdXBsZV9TRVRfSVRFTShhcmdzLCAwLCAoUHlPYmplY3QgKilmcmFtZSk7CisgICAgUHlUdXBsZV9TRVRfSVRFTShhcmdzLCAxLCB3aGF0c3RyKTsKKyAgICBQeVR1cGxlX1NFVF9JVEVNKGFyZ3MsIDIsIGFyZyk7CiAKLQkvKiBjYWxsIHRoZSBQeXRob24tbGV2ZWwgZnVuY3Rpb24gKi8KLQlQeUZyYW1lX0Zhc3RUb0xvY2FscyhmcmFtZSk7Ci0JcmVzdWx0ID0gUHlFdmFsX0NhbGxPYmplY3QoY2FsbGJhY2ssIGFyZ3MpOwotCVB5RnJhbWVfTG9jYWxzVG9GYXN0KGZyYW1lLCAxKTsKLQlpZiAocmVzdWx0ID09IE5VTEwpCi0JCVB5VHJhY2VCYWNrX0hlcmUoZnJhbWUpOworICAgIC8qIGNhbGwgdGhlIFB5dGhvbi1sZXZlbCBmdW5jdGlvbiAqLworICAgIFB5RnJhbWVfRmFzdFRvTG9jYWxzKGZyYW1lKTsKKyAgICByZXN1bHQgPSBQeUV2YWxfQ2FsbE9iamVjdChjYWxsYmFjaywgYXJncyk7CisgICAgUHlGcmFtZV9Mb2NhbHNUb0Zhc3QoZnJhbWUsIDEpOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICAgICAgUHlUcmFjZUJhY2tfSGVyZShmcmFtZSk7CiAKLQkvKiBjbGVhbnVwICovCi0JUHlfREVDUkVGKGFyZ3MpOwotCXJldHVybiByZXN1bHQ7CisgICAgLyogY2xlYW51cCAqLworICAgIFB5X0RFQ1JFRihhcmdzKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgaW50CiBwcm9maWxlX3RyYW1wb2xpbmUoUHlPYmplY3QgKnNlbGYsIFB5RnJhbWVPYmplY3QgKmZyYW1lLAotCQkgICBpbnQgd2hhdCwgUHlPYmplY3QgKmFyZykKKyAgICAgICAgICAgICAgICAgICBpbnQgd2hhdCwgUHlPYmplY3QgKmFyZykKIHsKLQlQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBmcmFtZS0+Zl90c3RhdGU7Ci0JUHlPYmplY3QgKnJlc3VsdDsKKyAgICBQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBmcmFtZS0+Zl90c3RhdGU7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKIAotCWlmIChhcmcgPT0gTlVMTCkKLQkJYXJnID0gUHlfTm9uZTsKLQlyZXN1bHQgPSBjYWxsX3RyYW1wb2xpbmUodHN0YXRlLCBzZWxmLCBmcmFtZSwgd2hhdCwgYXJnKTsKLQlpZiAocmVzdWx0ID09IE5VTEwpIHsKLQkJUHlFdmFsX1NldFByb2ZpbGUoTlVMTCwgTlVMTCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JUHlfREVDUkVGKHJlc3VsdCk7Ci0JcmV0dXJuIDA7CisgICAgaWYgKGFyZyA9PSBOVUxMKQorICAgICAgICBhcmcgPSBQeV9Ob25lOworICAgIHJlc3VsdCA9IGNhbGxfdHJhbXBvbGluZSh0c3RhdGUsIHNlbGYsIGZyYW1lLCB3aGF0LCBhcmcpOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCkgeworICAgICAgICBQeUV2YWxfU2V0UHJvZmlsZShOVUxMLCBOVUxMKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogdHJhY2VfdHJhbXBvbGluZShQeU9iamVjdCAqc2VsZiwgUHlGcmFtZU9iamVjdCAqZnJhbWUsCi0JCSBpbnQgd2hhdCwgUHlPYmplY3QgKmFyZykKKyAgICAgICAgICAgICAgICAgaW50IHdoYXQsIFB5T2JqZWN0ICphcmcpCiB7Ci0JUHlUaHJlYWRTdGF0ZSAqdHN0YXRlID0gZnJhbWUtPmZfdHN0YXRlOwotCVB5T2JqZWN0ICpjYWxsYmFjazsKLQlQeU9iamVjdCAqcmVzdWx0OworICAgIFB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IGZyYW1lLT5mX3RzdGF0ZTsKKyAgICBQeU9iamVjdCAqY2FsbGJhY2s7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKIAotCWlmICh3aGF0ID09IFB5VHJhY2VfQ0FMTCkKLQkJY2FsbGJhY2sgPSBzZWxmOwotCWVsc2UKLQkJY2FsbGJhY2sgPSBmcmFtZS0+Zl90cmFjZTsKLQlpZiAoY2FsbGJhY2sgPT0gTlVMTCkKLQkJcmV0dXJuIDA7Ci0JcmVzdWx0ID0gY2FsbF90cmFtcG9saW5lKHRzdGF0ZSwgY2FsbGJhY2ssIGZyYW1lLCB3aGF0LCBhcmcpOwotCWlmIChyZXN1bHQgPT0gTlVMTCkgewotCQlQeUV2YWxfU2V0VHJhY2UoTlVMTCwgTlVMTCk7Ci0JCVB5X1hERUNSRUYoZnJhbWUtPmZfdHJhY2UpOwotCQlmcmFtZS0+Zl90cmFjZSA9IE5VTEw7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKHJlc3VsdCAhPSBQeV9Ob25lKSB7Ci0JCVB5T2JqZWN0ICp0ZW1wID0gZnJhbWUtPmZfdHJhY2U7Ci0JCWZyYW1lLT5mX3RyYWNlID0gTlVMTDsKLQkJUHlfWERFQ1JFRih0ZW1wKTsKLQkJZnJhbWUtPmZfdHJhY2UgPSByZXN1bHQ7Ci0JfQotCWVsc2UgewotCQlQeV9ERUNSRUYocmVzdWx0KTsKLQl9Ci0JcmV0dXJuIDA7CisgICAgaWYgKHdoYXQgPT0gUHlUcmFjZV9DQUxMKQorICAgICAgICBjYWxsYmFjayA9IHNlbGY7CisgICAgZWxzZQorICAgICAgICBjYWxsYmFjayA9IGZyYW1lLT5mX3RyYWNlOworICAgIGlmIChjYWxsYmFjayA9PSBOVUxMKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXN1bHQgPSBjYWxsX3RyYW1wb2xpbmUodHN0YXRlLCBjYWxsYmFjaywgZnJhbWUsIHdoYXQsIGFyZyk7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKSB7CisgICAgICAgIFB5RXZhbF9TZXRUcmFjZShOVUxMLCBOVUxMKTsKKyAgICAgICAgUHlfWERFQ1JFRihmcmFtZS0+Zl90cmFjZSk7CisgICAgICAgIGZyYW1lLT5mX3RyYWNlID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAocmVzdWx0ICE9IFB5X05vbmUpIHsKKyAgICAgICAgUHlPYmplY3QgKnRlbXAgPSBmcmFtZS0+Zl90cmFjZTsKKyAgICAgICAgZnJhbWUtPmZfdHJhY2UgPSBOVUxMOworICAgICAgICBQeV9YREVDUkVGKHRlbXApOworICAgICAgICBmcmFtZS0+Zl90cmFjZSA9IHJlc3VsdDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHN5c19zZXR0cmFjZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaWYgKHRyYWNlX2luaXQoKSA9PSAtMSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKGFyZ3MgPT0gUHlfTm9uZSkKLQkJUHlFdmFsX1NldFRyYWNlKE5VTEwsIE5VTEwpOwotCWVsc2UKLQkJUHlFdmFsX1NldFRyYWNlKHRyYWNlX3RyYW1wb2xpbmUsIGFyZ3MpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAodHJhY2VfaW5pdCgpID09IC0xKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoYXJncyA9PSBQeV9Ob25lKQorICAgICAgICBQeUV2YWxfU2V0VHJhY2UoTlVMTCwgTlVMTCk7CisgICAgZWxzZQorICAgICAgICBQeUV2YWxfU2V0VHJhY2UodHJhY2VfdHJhbXBvbGluZSwgYXJncyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBQeURvY19TVFJWQVIoc2V0dHJhY2VfZG9jLApAQCAtNDA2LDEzICs0MDYsMTMgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzeXNfZ2V0dHJhY2UoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfR0VUKCk7Ci0JUHlPYmplY3QgKnRlbXAgPSB0c3RhdGUtPmNfdHJhY2VvYmo7CisgICAgUHlUaHJlYWRTdGF0ZSAqdHN0YXRlID0gUHlUaHJlYWRTdGF0ZV9HRVQoKTsKKyAgICBQeU9iamVjdCAqdGVtcCA9IHRzdGF0ZS0+Y190cmFjZW9iajsKIAotCWlmICh0ZW1wID09IE5VTEwpCi0JCXRlbXAgPSBQeV9Ob25lOwotCVB5X0lOQ1JFRih0ZW1wKTsKLQlyZXR1cm4gdGVtcDsKKyAgICBpZiAodGVtcCA9PSBOVUxMKQorICAgICAgICB0ZW1wID0gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYodGVtcCk7CisgICAgcmV0dXJuIHRlbXA7CiB9CiAKIFB5RG9jX1NUUlZBUihnZXR0cmFjZV9kb2MsCkBAIC00MjUsMTQgKzQyNSwxNCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHN5c19zZXRwcm9maWxlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpZiAodHJhY2VfaW5pdCgpID09IC0xKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoYXJncyA9PSBQeV9Ob25lKQotCQlQeUV2YWxfU2V0UHJvZmlsZShOVUxMLCBOVUxMKTsKLQllbHNlCi0JCVB5RXZhbF9TZXRQcm9maWxlKHByb2ZpbGVfdHJhbXBvbGluZSwgYXJncyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGlmICh0cmFjZV9pbml0KCkgPT0gLTEpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChhcmdzID09IFB5X05vbmUpCisgICAgICAgIFB5RXZhbF9TZXRQcm9maWxlKE5VTEwsIE5VTEwpOworICAgIGVsc2UKKyAgICAgICAgUHlFdmFsX1NldFByb2ZpbGUocHJvZmlsZV90cmFtcG9saW5lLCBhcmdzKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIFB5RG9jX1NUUlZBUihzZXRwcm9maWxlX2RvYywKQEAgLTQ0NSwxMyArNDQ1LDEzIEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3lzX2dldHByb2ZpbGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfR0VUKCk7Ci0JUHlPYmplY3QgKnRlbXAgPSB0c3RhdGUtPmNfcHJvZmlsZW9iajsKKyAgICBQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dFVCgpOworICAgIFB5T2JqZWN0ICp0ZW1wID0gdHN0YXRlLT5jX3Byb2ZpbGVvYmo7CiAKLQlpZiAodGVtcCA9PSBOVUxMKQotCQl0ZW1wID0gUHlfTm9uZTsKLQlQeV9JTkNSRUYodGVtcCk7Ci0JcmV0dXJuIHRlbXA7CisgICAgaWYgKHRlbXAgPT0gTlVMTCkKKyAgICAgICAgdGVtcCA9IFB5X05vbmU7CisgICAgUHlfSU5DUkVGKHRlbXApOworICAgIHJldHVybiB0ZW1wOwogfQogCiBQeURvY19TVFJWQVIoZ2V0cHJvZmlsZV9kb2MsCkBAIC00NjQsMTAgKzQ2NCwxMCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHN5c19zZXRjaGVja2ludGVydmFsKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6c2V0Y2hlY2tpbnRlcnZhbCIsICZfUHlfQ2hlY2tJbnRlcnZhbCkpCi0JCXJldHVybiBOVUxMOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6c2V0Y2hlY2tpbnRlcnZhbCIsICZfUHlfQ2hlY2tJbnRlcnZhbCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogUHlEb2NfU1RSVkFSKHNldGNoZWNraW50ZXJ2YWxfZG9jLApAQCAtNDgwLDcgKzQ4MCw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3lzX2dldGNoZWNraW50ZXJ2YWwoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBQeUludF9Gcm9tTG9uZyhfUHlfQ2hlY2tJbnRlcnZhbCk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKF9QeV9DaGVja0ludGVydmFsKTsKIH0KIAogUHlEb2NfU1RSVkFSKGdldGNoZWNraW50ZXJ2YWxfZG9jLApAQCAtNDkxLDE3ICs0OTEsMTcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzeXNfc2V0dHNjZHVtcChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IGJvb2w7Ci0JUHlUaHJlYWRTdGF0ZSAqdHN0YXRlID0gUHlUaHJlYWRTdGF0ZV9HZXQoKTsKKyAgICBpbnQgYm9vbDsKKyAgICBQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dldCgpOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOnNldHRzY2R1bXAiLCAmYm9vbCkpCi0JCXJldHVybiBOVUxMOwotCWlmIChib29sKQotCQl0c3RhdGUtPmludGVycC0+dHNjZHVtcCA9IDE7Ci0JZWxzZQotCQl0c3RhdGUtPmludGVycC0+dHNjZHVtcCA9IDA7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpzZXR0c2NkdW1wIiwgJmJvb2wpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoYm9vbCkKKyAgICAgICAgdHN0YXRlLT5pbnRlcnAtPnRzY2R1bXAgPSAxOworICAgIGVsc2UKKyAgICAgICAgdHN0YXRlLT5pbnRlcnAtPnRzY2R1bXAgPSAwOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIAogfQogCkBAIC01MTcsMTcgKzUxNywxNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHN5c19zZXRyZWN1cnNpb25saW1pdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IG5ld19saW1pdDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6c2V0cmVjdXJzaW9ubGltaXQiLCAmbmV3X2xpbWl0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKG5ld19saW1pdCA8PSAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJyZWN1cnNpb24gbGltaXQgbXVzdCBiZSBwb3NpdGl2ZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JUHlfU2V0UmVjdXJzaW9uTGltaXQobmV3X2xpbWl0KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaW50IG5ld19saW1pdDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6c2V0cmVjdXJzaW9ubGltaXQiLCAmbmV3X2xpbWl0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKG5ld19saW1pdCA8PSAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInJlY3Vyc2lvbiBsaW1pdCBtdXN0IGJlIHBvc2l0aXZlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeV9TZXRSZWN1cnNpb25MaW1pdChuZXdfbGltaXQpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogUHlEb2NfU1RSVkFSKHNldHJlY3Vyc2lvbmxpbWl0X2RvYywKQEAgLTU0Miw3ICs1NDIsNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHN5c19nZXRyZWN1cnNpb25saW1pdChQeU9iamVjdCAqc2VsZikKIHsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoUHlfR2V0UmVjdXJzaW9uTGltaXQoKSk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKFB5X0dldFJlY3Vyc2lvbkxpbWl0KCkpOwogfQogCiBQeURvY19TVFJWQVIoZ2V0cmVjdXJzaW9ubGltaXRfZG9jLApAQCAtNTY3LDE2ICs1NjcsMTYgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzeXNfZ2V0d2luZG93c3ZlcnNpb24oUHlPYmplY3QgKnNlbGYpCiB7Ci0JT1NWRVJTSU9OSU5GTyB2ZXI7Ci0JdmVyLmR3T1NWZXJzaW9uSW5mb1NpemUgPSBzaXplb2YodmVyKTsKLQlpZiAoIUdldFZlcnNpb25FeCgmdmVyKSkKLQkJcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyKDApOwotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJISEhIcyIsCi0JICAgICAgICAgICAgICAgICAgICAgdmVyLmR3TWFqb3JWZXJzaW9uLAotCSAgICAgICAgICAgICAgICAgICAgIHZlci5kd01pbm9yVmVyc2lvbiwKLQkgICAgICAgICAgICAgICAgICAgICB2ZXIuZHdCdWlsZE51bWJlciwKLQkgICAgICAgICAgICAgICAgICAgICB2ZXIuZHdQbGF0Zm9ybUlkLAotCSAgICAgICAgICAgICAgICAgICAgIHZlci5zekNTRFZlcnNpb24pOworICAgIE9TVkVSU0lPTklORk8gdmVyOworICAgIHZlci5kd09TVmVyc2lvbkluZm9TaXplID0gc2l6ZW9mKHZlcik7CisgICAgaWYgKCFHZXRWZXJzaW9uRXgoJnZlcikpCisgICAgICAgIHJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0VycigwKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiSEhISHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHZlci5kd01ham9yVmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2ZXIuZHdNaW5vclZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgdmVyLmR3QnVpbGROdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgdmVyLmR3UGxhdGZvcm1JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2ZXIuc3pDU0RWZXJzaW9uKTsKIH0KIAogI2VuZGlmIC8qIE1TX1dJTkRPV1MgKi8KQEAgLTU4NSwxNSArNTg1LDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3lzX3NldGRsb3BlbmZsYWdzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgbmV3X3ZhbDsKLSAgICAgICAgUHlUaHJlYWRTdGF0ZSAqdHN0YXRlID0gUHlUaHJlYWRTdGF0ZV9HRVQoKTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6c2V0ZGxvcGVuZmxhZ3MiLCAmbmV3X3ZhbCkpCi0JCXJldHVybiBOVUxMOwotICAgICAgICBpZiAoIXRzdGF0ZSkKLQkJcmV0dXJuIE5VTEw7Ci0gICAgICAgIHRzdGF0ZS0+aW50ZXJwLT5kbG9wZW5mbGFncyA9IG5ld192YWw7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGludCBuZXdfdmFsOworICAgIFB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfR0VUKCk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOnNldGRsb3BlbmZsYWdzIiwgJm5ld192YWwpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIXRzdGF0ZSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgdHN0YXRlLT5pbnRlcnAtPmRsb3BlbmZsYWdzID0gbmV3X3ZhbDsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIFB5RG9jX1NUUlZBUihzZXRkbG9wZW5mbGFnc19kb2MsCkBAIC02MDksMTAgKzYwOSwxMCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHN5c19nZXRkbG9wZW5mbGFncyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0gICAgICAgIFB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfR0VUKCk7Ci0gICAgICAgIGlmICghdHN0YXRlKQotCQlyZXR1cm4gTlVMTDsKLSAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHRzdGF0ZS0+aW50ZXJwLT5kbG9wZW5mbGFncyk7CisgICAgUHlUaHJlYWRTdGF0ZSAqdHN0YXRlID0gUHlUaHJlYWRTdGF0ZV9HRVQoKTsKKyAgICBpZiAoIXRzdGF0ZSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHRzdGF0ZS0+aW50ZXJwLT5kbG9wZW5mbGFncyk7CiB9CiAKIFB5RG9jX1NUUlZBUihnZXRkbG9wZW5mbGFnc19kb2MsCkBAIC02MzAsNzggKzYzMCw3OCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHN5c19tZGVidWcoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBmbGFnOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTptZGVidWciLCAmZmxhZykpCi0JCXJldHVybiBOVUxMOwotCW1hbGxvcHQoTV9ERUJVRywgZmxhZyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGludCBmbGFnOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTptZGVidWciLCAmZmxhZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG1hbGxvcHQoTV9ERUJVRywgZmxhZyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogI2VuZGlmIC8qIFVTRV9NQUxMT1BUICovCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzeXNfZ2V0c2l6ZW9mKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JUHlPYmplY3QgKnJlcyA9IE5VTEw7Ci0Jc3RhdGljIFB5T2JqZWN0ICpzdHJfX3NpemVvZl9fLCAqZ2NfaGVhZF9zaXplID0gTlVMTDsKLQlzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7Im9iamVjdCIsICJkZWZhdWx0IiwgMH07Ci0JUHlPYmplY3QgKm8sICpkZmx0ID0gTlVMTDsKKyAgICBQeU9iamVjdCAqcmVzID0gTlVMTDsKKyAgICBzdGF0aWMgUHlPYmplY3QgKnN0cl9fc2l6ZW9mX18sICpnY19oZWFkX3NpemUgPSBOVUxMOworICAgIHN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsib2JqZWN0IiwgImRlZmF1bHQiLCAwfTsKKyAgICBQeU9iamVjdCAqbywgKmRmbHQgPSBOVUxMOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgIk98TzpnZXRzaXplb2YiLAotCQkJCQkga3dsaXN0LCAmbywgJmRmbHQpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAiT3xPOmdldHNpemVvZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3dsaXN0LCAmbywgJmRmbHQpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCS8qIEluaXRpYWxpemUgc3RhdGljIHZhcmlhYmxlIG5lZWRlZCBieSBfUHlUeXBlX0xvb2t1cCAqLwotCWlmIChzdHJfX3NpemVvZl9fID09IE5VTEwpIHsKLQkJc3RyX19zaXplb2ZfXyA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fc2l6ZW9mX18iKTsKLQkJaWYgKHN0cl9fc2l6ZW9mX18gPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCX0KKyAgICAvKiBJbml0aWFsaXplIHN0YXRpYyB2YXJpYWJsZSBuZWVkZWQgYnkgX1B5VHlwZV9Mb29rdXAgKi8KKyAgICBpZiAoc3RyX19zaXplb2ZfXyA9PSBOVUxMKSB7CisgICAgICAgIHN0cl9fc2l6ZW9mX18gPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX3NpemVvZl9fIik7CisgICAgICAgIGlmIChzdHJfX3NpemVvZl9fID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLSAgICAgICAgLyogSW5pdGlhbGl6ZSBzdGF0aWMgdmFyaWFibGUgZm9yIEdDIGhlYWQgc2l6ZSAqLwotCWlmIChnY19oZWFkX3NpemUgPT0gTlVMTCkgewotCQlnY19oZWFkX3NpemUgPSBQeUludF9Gcm9tU3NpemVfdChzaXplb2YoUHlHQ19IZWFkKSk7Ci0JCWlmIChnY19oZWFkX3NpemUgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCX0KKyAgICAvKiBJbml0aWFsaXplIHN0YXRpYyB2YXJpYWJsZSBmb3IgR0MgaGVhZCBzaXplICovCisgICAgaWYgKGdjX2hlYWRfc2l6ZSA9PSBOVUxMKSB7CisgICAgICAgIGdjX2hlYWRfc2l6ZSA9IFB5SW50X0Zyb21Tc2l6ZV90KHNpemVvZihQeUdDX0hlYWQpKTsKKyAgICAgICAgaWYgKGdjX2hlYWRfc2l6ZSA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JLyogTWFrZSBzdXJlIHRoZSB0eXBlIGlzIGluaXRpYWxpemVkLiBmbG9hdCBnZXRzIGluaXRpYWxpemVkIGxhdGUgKi8KLQlpZiAoUHlUeXBlX1JlYWR5KFB5X1RZUEUobykpIDwgMCkKLQkJcmV0dXJuIE5VTEw7CisgICAgLyogTWFrZSBzdXJlIHRoZSB0eXBlIGlzIGluaXRpYWxpemVkLiBmbG9hdCBnZXRzIGluaXRpYWxpemVkIGxhdGUgKi8KKyAgICBpZiAoUHlUeXBlX1JlYWR5KFB5X1RZUEUobykpIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkvKiBJbnN0YW5jZSBvZiBvbGQtc3R5bGUgY2xhc3MgKi8KLQlpZiAoUHlJbnN0YW5jZV9DaGVjayhvKSkKLQkJcmVzID0gUHlJbnRfRnJvbVNzaXplX3QoUHlJbnN0YW5jZV9UeXBlLnRwX2Jhc2ljc2l6ZSk7Ci0JLyogYWxsIG90aGVyIG9iamVjdHMgKi8KLQllbHNlIHsKLQkJUHlPYmplY3QgKm1ldGhvZCA9IF9QeVR5cGVfTG9va3VwKFB5X1RZUEUobyksCi0JCQkJCQkgIHN0cl9fc2l6ZW9mX18pOwotCQlpZiAobWV0aG9kID09IE5VTEwpCi0JCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJCSAgICAgIlR5cGUgJS4xMDBzIGRvZXNuJ3QgZGVmaW5lIF9fc2l6ZW9mX18iLAotCQkJCSAgICAgUHlfVFlQRShvKS0+dHBfbmFtZSk7Ci0JCWVsc2UKLQkJCXJlcyA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MobWV0aG9kLCBvLCBOVUxMKTsKLQl9Ci0JCi0JLyogSGFzIGEgZGVmYXVsdCB2YWx1ZSBiZWVuIGdpdmVuPyAqLwotCWlmICgocmVzID09IE5VTEwpICYmIChkZmx0ICE9IE5VTEwpICYmCi0JICAgIFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfVHlwZUVycm9yKSkKLQl7Ci0JCVB5RXJyX0NsZWFyKCk7Ci0JCVB5X0lOQ1JFRihkZmx0KTsKLQkJcmV0dXJuIGRmbHQ7Ci0JfQotCWVsc2UgaWYgKHJlcyA9PSBOVUxMKQotCQlyZXR1cm4gcmVzOworICAgIC8qIEluc3RhbmNlIG9mIG9sZC1zdHlsZSBjbGFzcyAqLworICAgIGlmIChQeUluc3RhbmNlX0NoZWNrKG8pKQorICAgICAgICByZXMgPSBQeUludF9Gcm9tU3NpemVfdChQeUluc3RhbmNlX1R5cGUudHBfYmFzaWNzaXplKTsKKyAgICAvKiBhbGwgb3RoZXIgb2JqZWN0cyAqLworICAgIGVsc2UgeworICAgICAgICBQeU9iamVjdCAqbWV0aG9kID0gX1B5VHlwZV9Mb29rdXAoUHlfVFlQRShvKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9fc2l6ZW9mX18pOworICAgICAgICBpZiAobWV0aG9kID09IE5VTEwpCisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICJUeXBlICUuMTAwcyBkb2Vzbid0IGRlZmluZSBfX3NpemVvZl9fIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeV9UWVBFKG8pLT50cF9uYW1lKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmVzID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhtZXRob2QsIG8sIE5VTEwpOworICAgIH0KIAotCS8qIGFkZCBnY19oZWFkIHNpemUgKi8KLQlpZiAoUHlPYmplY3RfSVNfR0MobykpIHsKLQkJUHlPYmplY3QgKnRtcCA9IHJlczsKLQkJcmVzID0gUHlOdW1iZXJfQWRkKHRtcCwgZ2NfaGVhZF9zaXplKTsKLQkJUHlfREVDUkVGKHRtcCk7Ci0JfQotCXJldHVybiByZXM7CisgICAgLyogSGFzIGEgZGVmYXVsdCB2YWx1ZSBiZWVuIGdpdmVuPyAqLworICAgIGlmICgocmVzID09IE5VTEwpICYmIChkZmx0ICE9IE5VTEwpICYmCisgICAgICAgIFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfVHlwZUVycm9yKSkKKyAgICB7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIFB5X0lOQ1JFRihkZmx0KTsKKyAgICAgICAgcmV0dXJuIGRmbHQ7CisgICAgfQorICAgIGVsc2UgaWYgKHJlcyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gcmVzOworCisgICAgLyogYWRkIGdjX2hlYWQgc2l6ZSAqLworICAgIGlmIChQeU9iamVjdF9JU19HQyhvKSkgeworICAgICAgICBQeU9iamVjdCAqdG1wID0gcmVzOworICAgICAgICByZXMgPSBQeU51bWJlcl9BZGQodG1wLCBnY19oZWFkX3NpemUpOworICAgICAgICBQeV9ERUNSRUYodG1wKTsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKIH0KIAogUHlEb2NfU1RSVkFSKGdldHNpemVvZl9kb2MsCkBAIC03MTIsMTQgKzcxMiwxNCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHN5c19nZXRyZWZjb3VudChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZykKIHsKLQlyZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QoYXJnLT5vYl9yZWZjbnQpOworICAgIHJldHVybiBQeUludF9Gcm9tU3NpemVfdChhcmctPm9iX3JlZmNudCk7CiB9CiAKICNpZmRlZiBQeV9SRUZfREVCVUcKIHN0YXRpYyBQeU9iamVjdCAqCiBzeXNfZ2V0dG90YWxyZWZjb3VudChQeU9iamVjdCAqc2VsZikKIHsKLQlyZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QoX1B5X0dldFJlZlRvdGFsKCkpOworICAgIHJldHVybiBQeUludF9Gcm9tU3NpemVfdChfUHlfR2V0UmVmVG90YWwoKSk7CiB9CiAjZW5kaWYgLyogUHlfUkVGX0RFQlVHICovCiAKQEAgLTczNSw5ICs3MzUsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHN5c19nZXRjb3VudHMoUHlPYmplY3QgKnNlbGYpCiB7Ci0JZXh0ZXJuIFB5T2JqZWN0ICpnZXRfY291bnRzKHZvaWQpOworICAgIGV4dGVybiBQeU9iamVjdCAqZ2V0X2NvdW50cyh2b2lkKTsKIAotCXJldHVybiBnZXRfY291bnRzKCk7CisgICAgcmV0dXJuIGdldF9jb3VudHMoKTsKIH0KICNlbmRpZgogCkBAIC03NTYsMjMgKzc1NiwyMyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHN5c19nZXRmcmFtZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlGcmFtZU9iamVjdCAqZiA9IFB5VGhyZWFkU3RhdGVfR0VUKCktPmZyYW1lOwotCWludCBkZXB0aCA9IC0xOworICAgIFB5RnJhbWVPYmplY3QgKmYgPSBQeVRocmVhZFN0YXRlX0dFVCgpLT5mcmFtZTsKKyAgICBpbnQgZGVwdGggPSAtMTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifGk6X2dldGZyYW1lIiwgJmRlcHRoKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8aTpfZ2V0ZnJhbWUiLCAmZGVwdGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXdoaWxlIChkZXB0aCA+IDAgJiYgZiAhPSBOVUxMKSB7Ci0JCWYgPSBmLT5mX2JhY2s7Ci0JCS0tZGVwdGg7Ci0JfQotCWlmIChmID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJImNhbGwgc3RhY2sgaXMgbm90IGRlZXAgZW5vdWdoIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlQeV9JTkNSRUYoZik7Ci0JcmV0dXJuIChQeU9iamVjdCopZjsKKyAgICB3aGlsZSAoZGVwdGggPiAwICYmIGYgIT0gTlVMTCkgeworICAgICAgICBmID0gZi0+Zl9iYWNrOworICAgICAgICAtLWRlcHRoOworICAgIH0KKyAgICBpZiAoZiA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImNhbGwgc3RhY2sgaXMgbm90IGRlZXAgZW5vdWdoIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeV9JTkNSRUYoZik7CisgICAgcmV0dXJuIChQeU9iamVjdCopZjsKIH0KIAogUHlEb2NfU1RSVkFSKGN1cnJlbnRfZnJhbWVzX2RvYywKQEAgLTc4Nyw3ICs3ODcsNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHN5c19jdXJyZW50X2ZyYW1lcyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm5vYXJncykKIHsKLQlyZXR1cm4gX1B5VGhyZWFkX0N1cnJlbnRGcmFtZXMoKTsKKyAgICByZXR1cm4gX1B5VGhyZWFkX0N1cnJlbnRGcmFtZXMoKTsKIH0KIAogUHlEb2NfU1RSVkFSKGNhbGxfdHJhY2luZ19kb2MsCkBAIC04MDEsMTAgKzgwMSwxMCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHN5c19jYWxsX3RyYWNpbmcoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICpmdW5jLCAqZnVuY2FyZ3M7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPTyE6Y2FsbF90cmFjaW5nIiwgJmZ1bmMsICZQeVR1cGxlX1R5cGUsICZmdW5jYXJncykpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBfUHlFdmFsX0NhbGxUcmFjaW5nKGZ1bmMsIGZ1bmNhcmdzKTsKKyAgICBQeU9iamVjdCAqZnVuYywgKmZ1bmNhcmdzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT08hOmNhbGxfdHJhY2luZyIsICZmdW5jLCAmUHlUdXBsZV9UeXBlLCAmZnVuY2FyZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gX1B5RXZhbF9DYWxsVHJhY2luZyhmdW5jLCBmdW5jYXJncyk7CiB9CiAKIFB5RG9jX1NUUlZBUihjYWxsc3RhdHNfZG9jLApAQCAtODUxLDggKzg1MSw4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3lzX2NsZWFyX3R5cGVfY2FjaGUoUHlPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKQogewotCVB5VHlwZV9DbGVhckNhY2hlKCk7Ci0JUHlfUkVUVVJOX05PTkU7CisgICAgUHlUeXBlX0NsZWFyQ2FjaGUoKTsKKyAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAogUHlEb2NfU1RSVkFSKHN5c19jbGVhcl90eXBlX2NhY2hlX19kb2NfXywKQEAgLTg2MSwxMDUgKzg2MSwxMDUgQEAKIAogCiBzdGF0aWMgUHlNZXRob2REZWYgc3lzX21ldGhvZHNbXSA9IHsKLQkvKiBNaWdodCBhcyB3ZWxsIGtlZXAgdGhpcyBpbiBhbHBoYWJldGljIG9yZGVyICovCi0JeyJjYWxsc3RhdHMiLCAoUHlDRnVuY3Rpb24pUHlFdmFsX0dldENhbGxTdGF0cywgTUVUSF9OT0FSR1MsCi0JIGNhbGxzdGF0c19kb2N9LAotCXsiX2NsZWFyX3R5cGVfY2FjaGUiLAlzeXNfY2xlYXJfdHlwZV9jYWNoZSwJICBNRVRIX05PQVJHUywKLQkgc3lzX2NsZWFyX3R5cGVfY2FjaGVfX2RvY19ffSwKLQl7Il9jdXJyZW50X2ZyYW1lcyIsIHN5c19jdXJyZW50X2ZyYW1lcywgTUVUSF9OT0FSR1MsCi0JIGN1cnJlbnRfZnJhbWVzX2RvY30sCi0JeyJkaXNwbGF5aG9vayIsCXN5c19kaXNwbGF5aG9vaywgTUVUSF9PLCBkaXNwbGF5aG9va19kb2N9LAotCXsiZXhjX2luZm8iLAlzeXNfZXhjX2luZm8sIE1FVEhfTk9BUkdTLCBleGNfaW5mb19kb2N9LAotCXsiZXhjX2NsZWFyIiwJc3lzX2V4Y19jbGVhciwgTUVUSF9OT0FSR1MsIGV4Y19jbGVhcl9kb2N9LAotCXsiZXhjZXB0aG9vayIsCXN5c19leGNlcHRob29rLCBNRVRIX1ZBUkFSR1MsIGV4Y2VwdGhvb2tfZG9jfSwKLQl7ImV4aXQiLAlzeXNfZXhpdCwgTUVUSF9WQVJBUkdTLCBleGl0X2RvY30sCisgICAgLyogTWlnaHQgYXMgd2VsbCBrZWVwIHRoaXMgaW4gYWxwaGFiZXRpYyBvcmRlciAqLworICAgIHsiY2FsbHN0YXRzIiwgKFB5Q0Z1bmN0aW9uKVB5RXZhbF9HZXRDYWxsU3RhdHMsIE1FVEhfTk9BUkdTLAorICAgICBjYWxsc3RhdHNfZG9jfSwKKyAgICB7Il9jbGVhcl90eXBlX2NhY2hlIiwgICAgICAgc3lzX2NsZWFyX3R5cGVfY2FjaGUsICAgICBNRVRIX05PQVJHUywKKyAgICAgc3lzX2NsZWFyX3R5cGVfY2FjaGVfX2RvY19ffSwKKyAgICB7Il9jdXJyZW50X2ZyYW1lcyIsIHN5c19jdXJyZW50X2ZyYW1lcywgTUVUSF9OT0FSR1MsCisgICAgIGN1cnJlbnRfZnJhbWVzX2RvY30sCisgICAgeyJkaXNwbGF5aG9vayIsICAgICBzeXNfZGlzcGxheWhvb2ssIE1FVEhfTywgZGlzcGxheWhvb2tfZG9jfSwKKyAgICB7ImV4Y19pbmZvIiwgICAgICAgIHN5c19leGNfaW5mbywgTUVUSF9OT0FSR1MsIGV4Y19pbmZvX2RvY30sCisgICAgeyJleGNfY2xlYXIiLCAgICAgICBzeXNfZXhjX2NsZWFyLCBNRVRIX05PQVJHUywgZXhjX2NsZWFyX2RvY30sCisgICAgeyJleGNlcHRob29rIiwgICAgICBzeXNfZXhjZXB0aG9vaywgTUVUSF9WQVJBUkdTLCBleGNlcHRob29rX2RvY30sCisgICAgeyJleGl0IiwgICAgICAgICAgICBzeXNfZXhpdCwgTUVUSF9WQVJBUkdTLCBleGl0X2RvY30sCiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCXsiZ2V0ZGVmYXVsdGVuY29kaW5nIiwgKFB5Q0Z1bmN0aW9uKXN5c19nZXRkZWZhdWx0ZW5jb2RpbmcsCi0JIE1FVEhfTk9BUkdTLCBnZXRkZWZhdWx0ZW5jb2RpbmdfZG9jfSwKKyAgICB7ImdldGRlZmF1bHRlbmNvZGluZyIsIChQeUNGdW5jdGlvbilzeXNfZ2V0ZGVmYXVsdGVuY29kaW5nLAorICAgICBNRVRIX05PQVJHUywgZ2V0ZGVmYXVsdGVuY29kaW5nX2RvY30sCiAjZW5kaWYKICNpZmRlZiBIQVZFX0RMT1BFTgotCXsiZ2V0ZGxvcGVuZmxhZ3MiLCAoUHlDRnVuY3Rpb24pc3lzX2dldGRsb3BlbmZsYWdzLCBNRVRIX05PQVJHUywKLQkgZ2V0ZGxvcGVuZmxhZ3NfZG9jfSwKKyAgICB7ImdldGRsb3BlbmZsYWdzIiwgKFB5Q0Z1bmN0aW9uKXN5c19nZXRkbG9wZW5mbGFncywgTUVUSF9OT0FSR1MsCisgICAgIGdldGRsb3BlbmZsYWdzX2RvY30sCiAjZW5kaWYKICNpZmRlZiBDT1VOVF9BTExPQ1MKLQl7ImdldGNvdW50cyIsCShQeUNGdW5jdGlvbilzeXNfZ2V0Y291bnRzLCBNRVRIX05PQVJHU30sCisgICAgeyJnZXRjb3VudHMiLCAgICAgICAoUHlDRnVuY3Rpb24pc3lzX2dldGNvdW50cywgTUVUSF9OT0FSR1N9LAogI2VuZGlmCiAjaWZkZWYgRFlOQU1JQ19FWEVDVVRJT05fUFJPRklMRQotCXsiZ2V0ZHhwIiwJX1B5X0dldERYUHJvZmlsZSwgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImdldGR4cCIsICAgICAgICAgIF9QeV9HZXREWFByb2ZpbGUsIE1FVEhfVkFSQVJHU30sCiAjZW5kaWYKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JeyJnZXRmaWxlc3lzdGVtZW5jb2RpbmciLCAoUHlDRnVuY3Rpb24pc3lzX2dldGZpbGVzeXN0ZW1lbmNvZGluZywKLQkgTUVUSF9OT0FSR1MsIGdldGZpbGVzeXN0ZW1lbmNvZGluZ19kb2N9LAorICAgIHsiZ2V0ZmlsZXN5c3RlbWVuY29kaW5nIiwgKFB5Q0Z1bmN0aW9uKXN5c19nZXRmaWxlc3lzdGVtZW5jb2RpbmcsCisgICAgIE1FVEhfTk9BUkdTLCBnZXRmaWxlc3lzdGVtZW5jb2RpbmdfZG9jfSwKICNlbmRpZgogI2lmZGVmIFB5X1RSQUNFX1JFRlMKLQl7ImdldG9iamVjdHMiLAlfUHlfR2V0T2JqZWN0cywgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImdldG9iamVjdHMiLCAgICAgIF9QeV9HZXRPYmplY3RzLCBNRVRIX1ZBUkFSR1N9LAogI2VuZGlmCiAjaWZkZWYgUHlfUkVGX0RFQlVHCi0JeyJnZXR0b3RhbHJlZmNvdW50IiwgKFB5Q0Z1bmN0aW9uKXN5c19nZXR0b3RhbHJlZmNvdW50LCBNRVRIX05PQVJHU30sCisgICAgeyJnZXR0b3RhbHJlZmNvdW50IiwgKFB5Q0Z1bmN0aW9uKXN5c19nZXR0b3RhbHJlZmNvdW50LCBNRVRIX05PQVJHU30sCiAjZW5kaWYKLQl7ImdldHJlZmNvdW50IiwJKFB5Q0Z1bmN0aW9uKXN5c19nZXRyZWZjb3VudCwgTUVUSF9PLCBnZXRyZWZjb3VudF9kb2N9LAotCXsiZ2V0cmVjdXJzaW9ubGltaXQiLCAoUHlDRnVuY3Rpb24pc3lzX2dldHJlY3Vyc2lvbmxpbWl0LCBNRVRIX05PQVJHUywKLQkgZ2V0cmVjdXJzaW9ubGltaXRfZG9jfSwKLQl7ImdldHNpemVvZiIsICAgKFB5Q0Z1bmN0aW9uKXN5c19nZXRzaXplb2YsCi0JIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsIGdldHNpemVvZl9kb2N9LAotCXsiX2dldGZyYW1lIiwgc3lzX2dldGZyYW1lLCBNRVRIX1ZBUkFSR1MsIGdldGZyYW1lX2RvY30sCisgICAgeyJnZXRyZWZjb3VudCIsICAgICAoUHlDRnVuY3Rpb24pc3lzX2dldHJlZmNvdW50LCBNRVRIX08sIGdldHJlZmNvdW50X2RvY30sCisgICAgeyJnZXRyZWN1cnNpb25saW1pdCIsIChQeUNGdW5jdGlvbilzeXNfZ2V0cmVjdXJzaW9ubGltaXQsIE1FVEhfTk9BUkdTLAorICAgICBnZXRyZWN1cnNpb25saW1pdF9kb2N9LAorICAgIHsiZ2V0c2l6ZW9mIiwgICAoUHlDRnVuY3Rpb24pc3lzX2dldHNpemVvZiwKKyAgICAgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywgZ2V0c2l6ZW9mX2RvY30sCisgICAgeyJfZ2V0ZnJhbWUiLCBzeXNfZ2V0ZnJhbWUsIE1FVEhfVkFSQVJHUywgZ2V0ZnJhbWVfZG9jfSwKICNpZmRlZiBNU19XSU5ET1dTCi0JeyJnZXR3aW5kb3dzdmVyc2lvbiIsIChQeUNGdW5jdGlvbilzeXNfZ2V0d2luZG93c3ZlcnNpb24sIE1FVEhfTk9BUkdTLAotCSBnZXR3aW5kb3dzdmVyc2lvbl9kb2N9LAorICAgIHsiZ2V0d2luZG93c3ZlcnNpb24iLCAoUHlDRnVuY3Rpb24pc3lzX2dldHdpbmRvd3N2ZXJzaW9uLCBNRVRIX05PQVJHUywKKyAgICAgZ2V0d2luZG93c3ZlcnNpb25fZG9jfSwKICNlbmRpZiAvKiBNU19XSU5ET1dTICovCiAjaWZkZWYgVVNFX01BTExPUFQKLQl7Im1kZWJ1ZyIsCXN5c19tZGVidWcsIE1FVEhfVkFSQVJHU30sCisgICAgeyJtZGVidWciLCAgICAgICAgICBzeXNfbWRlYnVnLCBNRVRIX1ZBUkFSR1N9LAogI2VuZGlmCiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCXsic2V0ZGVmYXVsdGVuY29kaW5nIiwgc3lzX3NldGRlZmF1bHRlbmNvZGluZywgTUVUSF9WQVJBUkdTLAotCSBzZXRkZWZhdWx0ZW5jb2RpbmdfZG9jfSwKKyAgICB7InNldGRlZmF1bHRlbmNvZGluZyIsIHN5c19zZXRkZWZhdWx0ZW5jb2RpbmcsIE1FVEhfVkFSQVJHUywKKyAgICAgc2V0ZGVmYXVsdGVuY29kaW5nX2RvY30sCiAjZW5kaWYKLQl7InNldGNoZWNraW50ZXJ2YWwiLAlzeXNfc2V0Y2hlY2tpbnRlcnZhbCwgTUVUSF9WQVJBUkdTLAotCSBzZXRjaGVja2ludGVydmFsX2RvY30sCi0JeyJnZXRjaGVja2ludGVydmFsIiwJc3lzX2dldGNoZWNraW50ZXJ2YWwsIE1FVEhfTk9BUkdTLAotCSBnZXRjaGVja2ludGVydmFsX2RvY30sCisgICAgeyJzZXRjaGVja2ludGVydmFsIiwgICAgICAgIHN5c19zZXRjaGVja2ludGVydmFsLCBNRVRIX1ZBUkFSR1MsCisgICAgIHNldGNoZWNraW50ZXJ2YWxfZG9jfSwKKyAgICB7ImdldGNoZWNraW50ZXJ2YWwiLCAgICAgICAgc3lzX2dldGNoZWNraW50ZXJ2YWwsIE1FVEhfTk9BUkdTLAorICAgICBnZXRjaGVja2ludGVydmFsX2RvY30sCiAjaWZkZWYgSEFWRV9ETE9QRU4KLQl7InNldGRsb3BlbmZsYWdzIiwgc3lzX3NldGRsb3BlbmZsYWdzLCBNRVRIX1ZBUkFSR1MsCi0JIHNldGRsb3BlbmZsYWdzX2RvY30sCisgICAgeyJzZXRkbG9wZW5mbGFncyIsIHN5c19zZXRkbG9wZW5mbGFncywgTUVUSF9WQVJBUkdTLAorICAgICBzZXRkbG9wZW5mbGFnc19kb2N9LAogI2VuZGlmCi0JeyJzZXRwcm9maWxlIiwJc3lzX3NldHByb2ZpbGUsIE1FVEhfTywgc2V0cHJvZmlsZV9kb2N9LAotCXsiZ2V0cHJvZmlsZSIsCXN5c19nZXRwcm9maWxlLCBNRVRIX05PQVJHUywgZ2V0cHJvZmlsZV9kb2N9LAotCXsic2V0cmVjdXJzaW9ubGltaXQiLCBzeXNfc2V0cmVjdXJzaW9ubGltaXQsIE1FVEhfVkFSQVJHUywKLQkgc2V0cmVjdXJzaW9ubGltaXRfZG9jfSwKKyAgICB7InNldHByb2ZpbGUiLCAgICAgIHN5c19zZXRwcm9maWxlLCBNRVRIX08sIHNldHByb2ZpbGVfZG9jfSwKKyAgICB7ImdldHByb2ZpbGUiLCAgICAgIHN5c19nZXRwcm9maWxlLCBNRVRIX05PQVJHUywgZ2V0cHJvZmlsZV9kb2N9LAorICAgIHsic2V0cmVjdXJzaW9ubGltaXQiLCBzeXNfc2V0cmVjdXJzaW9ubGltaXQsIE1FVEhfVkFSQVJHUywKKyAgICAgc2V0cmVjdXJzaW9ubGltaXRfZG9jfSwKICNpZmRlZiBXSVRIX1RTQwotCXsic2V0dHNjZHVtcCIsIHN5c19zZXR0c2NkdW1wLCBNRVRIX1ZBUkFSR1MsIHNldHRzY2R1bXBfZG9jfSwKKyAgICB7InNldHRzY2R1bXAiLCBzeXNfc2V0dHNjZHVtcCwgTUVUSF9WQVJBUkdTLCBzZXR0c2NkdW1wX2RvY30sCiAjZW5kaWYKLQl7InNldHRyYWNlIiwJc3lzX3NldHRyYWNlLCBNRVRIX08sIHNldHRyYWNlX2RvY30sCi0JeyJnZXR0cmFjZSIsCXN5c19nZXR0cmFjZSwgTUVUSF9OT0FSR1MsIGdldHRyYWNlX2RvY30sCi0JeyJjYWxsX3RyYWNpbmciLCBzeXNfY2FsbF90cmFjaW5nLCBNRVRIX1ZBUkFSR1MsIGNhbGxfdHJhY2luZ19kb2N9LAotCXtOVUxMLAkJTlVMTH0JCS8qIHNlbnRpbmVsICovCisgICAgeyJzZXR0cmFjZSIsICAgICAgICBzeXNfc2V0dHJhY2UsIE1FVEhfTywgc2V0dHJhY2VfZG9jfSwKKyAgICB7ImdldHRyYWNlIiwgICAgICAgIHN5c19nZXR0cmFjZSwgTUVUSF9OT0FSR1MsIGdldHRyYWNlX2RvY30sCisgICAgeyJjYWxsX3RyYWNpbmciLCBzeXNfY2FsbF90cmFjaW5nLCBNRVRIX1ZBUkFSR1MsIGNhbGxfdHJhY2luZ19kb2N9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKgogbGlzdF9idWlsdGluX21vZHVsZV9uYW1lcyh2b2lkKQogewotCVB5T2JqZWN0ICpsaXN0ID0gUHlMaXN0X05ldygwKTsKLQlpbnQgaTsKLQlpZiAobGlzdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlmb3IgKGkgPSAwOyBQeUltcG9ydF9Jbml0dGFiW2ldLm5hbWUgIT0gTlVMTDsgaSsrKSB7Ci0JCVB5T2JqZWN0ICpuYW1lID0gUHlTdHJpbmdfRnJvbVN0cmluZygKLQkJCVB5SW1wb3J0X0luaXR0YWJbaV0ubmFtZSk7Ci0JCWlmIChuYW1lID09IE5VTEwpCi0JCQlicmVhazsKLQkJUHlMaXN0X0FwcGVuZChsaXN0LCBuYW1lKTsKLQkJUHlfREVDUkVGKG5hbWUpOwotCX0KLQlpZiAoUHlMaXN0X1NvcnQobGlzdCkgIT0gMCkgewotCQlQeV9ERUNSRUYobGlzdCk7Ci0JCWxpc3QgPSBOVUxMOwotCX0KLQlpZiAobGlzdCkgewotCQlQeU9iamVjdCAqdiA9IFB5TGlzdF9Bc1R1cGxlKGxpc3QpOwotCQlQeV9ERUNSRUYobGlzdCk7Ci0JCWxpc3QgPSB2OwotCX0KLQlyZXR1cm4gbGlzdDsKKyAgICBQeU9iamVjdCAqbGlzdCA9IFB5TGlzdF9OZXcoMCk7CisgICAgaW50IGk7CisgICAgaWYgKGxpc3QgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZm9yIChpID0gMDsgUHlJbXBvcnRfSW5pdHRhYltpXS5uYW1lICE9IE5VTEw7IGkrKykgeworICAgICAgICBQeU9iamVjdCAqbmFtZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoCisgICAgICAgICAgICBQeUltcG9ydF9Jbml0dGFiW2ldLm5hbWUpOworICAgICAgICBpZiAobmFtZSA9PSBOVUxMKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIFB5TGlzdF9BcHBlbmQobGlzdCwgbmFtZSk7CisgICAgICAgIFB5X0RFQ1JFRihuYW1lKTsKKyAgICB9CisgICAgaWYgKFB5TGlzdF9Tb3J0KGxpc3QpICE9IDApIHsKKyAgICAgICAgUHlfREVDUkVGKGxpc3QpOworICAgICAgICBsaXN0ID0gTlVMTDsKKyAgICB9CisgICAgaWYgKGxpc3QpIHsKKyAgICAgICAgUHlPYmplY3QgKnYgPSBQeUxpc3RfQXNUdXBsZShsaXN0KTsKKyAgICAgICAgUHlfREVDUkVGKGxpc3QpOworICAgICAgICBsaXN0ID0gdjsKKyAgICB9CisgICAgcmV0dXJuIGxpc3Q7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqd2Fybm9wdGlvbnMgPSBOVUxMOwpAQCAtOTY3LDI3ICs5NjcsMjcgQEAKIHZvaWQKIFB5U3lzX1Jlc2V0V2Fybk9wdGlvbnModm9pZCkKIHsKLQlpZiAod2Fybm9wdGlvbnMgPT0gTlVMTCB8fCAhUHlMaXN0X0NoZWNrKHdhcm5vcHRpb25zKSkKLQkJcmV0dXJuOwotCVB5TGlzdF9TZXRTbGljZSh3YXJub3B0aW9ucywgMCwgUHlMaXN0X0dFVF9TSVpFKHdhcm5vcHRpb25zKSwgTlVMTCk7CisgICAgaWYgKHdhcm5vcHRpb25zID09IE5VTEwgfHwgIVB5TGlzdF9DaGVjayh3YXJub3B0aW9ucykpCisgICAgICAgIHJldHVybjsKKyAgICBQeUxpc3RfU2V0U2xpY2Uod2Fybm9wdGlvbnMsIDAsIFB5TGlzdF9HRVRfU0laRSh3YXJub3B0aW9ucyksIE5VTEwpOwogfQogCiB2b2lkCiBQeVN5c19BZGRXYXJuT3B0aW9uKGNoYXIgKnMpCiB7Ci0JUHlPYmplY3QgKnN0cjsKKyAgICBQeU9iamVjdCAqc3RyOwogCi0JaWYgKHdhcm5vcHRpb25zID09IE5VTEwgfHwgIVB5TGlzdF9DaGVjayh3YXJub3B0aW9ucykpIHsKLQkJUHlfWERFQ1JFRih3YXJub3B0aW9ucyk7Ci0JCXdhcm5vcHRpb25zID0gUHlMaXN0X05ldygwKTsKLQkJaWYgKHdhcm5vcHRpb25zID09IE5VTEwpCi0JCQlyZXR1cm47Ci0JfQotCXN0ciA9IFB5U3RyaW5nX0Zyb21TdHJpbmcocyk7Ci0JaWYgKHN0ciAhPSBOVUxMKSB7Ci0JCVB5TGlzdF9BcHBlbmQod2Fybm9wdGlvbnMsIHN0cik7Ci0JCVB5X0RFQ1JFRihzdHIpOwotCX0KKyAgICBpZiAod2Fybm9wdGlvbnMgPT0gTlVMTCB8fCAhUHlMaXN0X0NoZWNrKHdhcm5vcHRpb25zKSkgeworICAgICAgICBQeV9YREVDUkVGKHdhcm5vcHRpb25zKTsKKyAgICAgICAgd2Fybm9wdGlvbnMgPSBQeUxpc3RfTmV3KDApOworICAgICAgICBpZiAod2Fybm9wdGlvbnMgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3RyID0gUHlTdHJpbmdfRnJvbVN0cmluZyhzKTsKKyAgICBpZiAoc3RyICE9IE5VTEwpIHsKKyAgICAgICAgUHlMaXN0X0FwcGVuZCh3YXJub3B0aW9ucywgc3RyKTsKKyAgICAgICAgUHlfREVDUkVGKHN0cik7CisgICAgfQogfQogCiBpbnQKQEAgLTExMTMsNjkgKzExMTMsNjkgQEAKIHN0YXRpYyB2b2lkCiBzdm52ZXJzaW9uX2luaXQodm9pZCkKIHsKLQljb25zdCBjaGFyICpweXRob24sICpicl9zdGFydCwgKmJyX2VuZCwgKmJyX2VuZDIsICpzdm52ZXJzaW9uOwotCVB5X3NzaXplX3QgbGVuOwotCWludCBpc3RhZzsKKyAgICBjb25zdCBjaGFyICpweXRob24sICpicl9zdGFydCwgKmJyX2VuZCwgKmJyX2VuZDIsICpzdm52ZXJzaW9uOworICAgIFB5X3NzaXplX3QgbGVuOworICAgIGludCBpc3RhZzsKIAotCWlmIChzdm5faW5pdGlhbGl6ZWQpCi0JCXJldHVybjsKKyAgICBpZiAoc3ZuX2luaXRpYWxpemVkKQorICAgICAgICByZXR1cm47CiAKLQlweXRob24gPSBzdHJzdHIoaGVhZHVybCwgIi9weXRob24vIik7Ci0JaWYgKCFweXRob24pIHsKLQkJLyogWFhYIHF1aWNrIGhhY2sgdG8gZ2V0IGJ6ciB3b3JraW5nICovCi0JCSpwYXRjaGxldmVsX3JldmlzaW9uID0gJ1wwJzsKLQkJc3RyY3B5KGJyYW5jaCwgIiIpOwotCQlzdHJjcHkoc2hvcnRicmFuY2gsICJ1bmtub3duIik7Ci0JCXN2bl9yZXZpc2lvbiA9ICIiOwotCQlyZXR1cm47Ci0JCS8qIFB5X0ZhdGFsRXJyb3IoInN1YnZlcnNpb24ga2V5d29yZHMgbWlzc2luZyIpOyAqLwotCX0KKyAgICBweXRob24gPSBzdHJzdHIoaGVhZHVybCwgIi9weXRob24vIik7CisgICAgaWYgKCFweXRob24pIHsKKyAgICAgICAgLyogWFhYIHF1aWNrIGhhY2sgdG8gZ2V0IGJ6ciB3b3JraW5nICovCisgICAgICAgICpwYXRjaGxldmVsX3JldmlzaW9uID0gJ1wwJzsKKyAgICAgICAgc3RyY3B5KGJyYW5jaCwgIiIpOworICAgICAgICBzdHJjcHkoc2hvcnRicmFuY2gsICJ1bmtub3duIik7CisgICAgICAgIHN2bl9yZXZpc2lvbiA9ICIiOworICAgICAgICByZXR1cm47CisgICAgICAgIC8qIFB5X0ZhdGFsRXJyb3IoInN1YnZlcnNpb24ga2V5d29yZHMgbWlzc2luZyIpOyAqLworICAgIH0KIAotCWJyX3N0YXJ0ID0gcHl0aG9uICsgODsKLQlicl9lbmQgPSBzdHJjaHIoYnJfc3RhcnQsICcvJyk7Ci0JYXNzZXJ0KGJyX2VuZCk7CisgICAgYnJfc3RhcnQgPSBweXRob24gKyA4OworICAgIGJyX2VuZCA9IHN0cmNocihicl9zdGFydCwgJy8nKTsKKyAgICBhc3NlcnQoYnJfZW5kKTsKIAotCS8qIFdvcmtzIGV2ZW4gZm9yIHRydW5rLAotCSAgIGFzIHdlIGFyZSBpbiB0cnVuay9QeXRob24vc3lzbW9kdWxlLmMgKi8KLQlicl9lbmQyID0gc3RyY2hyKGJyX2VuZCsxLCAnLycpOworICAgIC8qIFdvcmtzIGV2ZW4gZm9yIHRydW5rLAorICAgICAgIGFzIHdlIGFyZSBpbiB0cnVuay9QeXRob24vc3lzbW9kdWxlLmMgKi8KKyAgICBicl9lbmQyID0gc3RyY2hyKGJyX2VuZCsxLCAnLycpOwogCi0JaXN0YWcgPSBzdHJuY21wKGJyX3N0YXJ0LCAidGFncyIsIDQpID09IDA7Ci0JaWYgKHN0cm5jbXAoYnJfc3RhcnQsICJ0cnVuayIsIDUpID09IDApIHsKLQkJc3RyY3B5KGJyYW5jaCwgInRydW5rIik7Ci0JCXN0cmNweShzaG9ydGJyYW5jaCwgInRydW5rIik7CisgICAgaXN0YWcgPSBzdHJuY21wKGJyX3N0YXJ0LCAidGFncyIsIDQpID09IDA7CisgICAgaWYgKHN0cm5jbXAoYnJfc3RhcnQsICJ0cnVuayIsIDUpID09IDApIHsKKyAgICAgICAgc3RyY3B5KGJyYW5jaCwgInRydW5rIik7CisgICAgICAgIHN0cmNweShzaG9ydGJyYW5jaCwgInRydW5rIik7CiAKLQl9Ci0JZWxzZSBpZiAoaXN0YWcgfHwgc3RybmNtcChicl9zdGFydCwgImJyYW5jaGVzIiwgOCkgPT0gMCkgewotCQlsZW4gPSBicl9lbmQyIC0gYnJfc3RhcnQ7Ci0JCXN0cm5jcHkoYnJhbmNoLCBicl9zdGFydCwgbGVuKTsKLQkJYnJhbmNoW2xlbl0gPSAnXDAnOworICAgIH0KKyAgICBlbHNlIGlmIChpc3RhZyB8fCBzdHJuY21wKGJyX3N0YXJ0LCAiYnJhbmNoZXMiLCA4KSA9PSAwKSB7CisgICAgICAgIGxlbiA9IGJyX2VuZDIgLSBicl9zdGFydDsKKyAgICAgICAgc3RybmNweShicmFuY2gsIGJyX3N0YXJ0LCBsZW4pOworICAgICAgICBicmFuY2hbbGVuXSA9ICdcMCc7CiAKLQkJbGVuID0gYnJfZW5kMiAtIChicl9lbmQgKyAxKTsKLQkJc3RybmNweShzaG9ydGJyYW5jaCwgYnJfZW5kICsgMSwgbGVuKTsKLQkJc2hvcnRicmFuY2hbbGVuXSA9ICdcMCc7Ci0JfQotCWVsc2UgewotCQlQeV9GYXRhbEVycm9yKCJiYWQgSGVhZFVSTCIpOyAKLQkJcmV0dXJuOwotCX0KKyAgICAgICAgbGVuID0gYnJfZW5kMiAtIChicl9lbmQgKyAxKTsKKyAgICAgICAgc3RybmNweShzaG9ydGJyYW5jaCwgYnJfZW5kICsgMSwgbGVuKTsKKyAgICAgICAgc2hvcnRicmFuY2hbbGVuXSA9ICdcMCc7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeV9GYXRhbEVycm9yKCJiYWQgSGVhZFVSTCIpOworICAgICAgICByZXR1cm47CisgICAgfQogCiAKLQlzdm52ZXJzaW9uID0gX1B5X3N2bnZlcnNpb24oKTsKLQlpZiAoc3RyY21wKHN2bnZlcnNpb24sICJVbnZlcnNpb25lZCBkaXJlY3RvcnkiKSAhPSAwICYmIHN0cmNtcChzdm52ZXJzaW9uLCAiZXhwb3J0ZWQiKSAhPSAwKQotCQlzdm5fcmV2aXNpb24gPSBzdm52ZXJzaW9uOwotCWVsc2UgaWYgKGlzdGFnKSB7Ci0JCWxlbiA9IHN0cmxlbihfcGF0Y2hsZXZlbF9yZXZpc2lvbik7Ci0JCWFzc2VydChsZW4gPj0gMTMpOwotCQlhc3NlcnQobGVuIDwgKHNpemVvZihwYXRjaGxldmVsX3JldmlzaW9uKSArIDEzKSk7Ci0JCXN0cm5jcHkocGF0Y2hsZXZlbF9yZXZpc2lvbiwgX3BhdGNobGV2ZWxfcmV2aXNpb24gKyAxMSwKLQkJCWxlbiAtIDEzKTsKLQkJcGF0Y2hsZXZlbF9yZXZpc2lvbltsZW4gLSAxM10gPSAnXDAnOwotCQlzdm5fcmV2aXNpb24gPSBwYXRjaGxldmVsX3JldmlzaW9uOwotCX0KLQllbHNlCi0JCXN2bl9yZXZpc2lvbiA9ICIiOworICAgIHN2bnZlcnNpb24gPSBfUHlfc3ZudmVyc2lvbigpOworICAgIGlmIChzdHJjbXAoc3ZudmVyc2lvbiwgIlVudmVyc2lvbmVkIGRpcmVjdG9yeSIpICE9IDAgJiYgc3RyY21wKHN2bnZlcnNpb24sICJleHBvcnRlZCIpICE9IDApCisgICAgICAgIHN2bl9yZXZpc2lvbiA9IHN2bnZlcnNpb247CisgICAgZWxzZSBpZiAoaXN0YWcpIHsKKyAgICAgICAgbGVuID0gc3RybGVuKF9wYXRjaGxldmVsX3JldmlzaW9uKTsKKyAgICAgICAgYXNzZXJ0KGxlbiA+PSAxMyk7CisgICAgICAgIGFzc2VydChsZW4gPCAoc2l6ZW9mKHBhdGNobGV2ZWxfcmV2aXNpb24pICsgMTMpKTsKKyAgICAgICAgc3RybmNweShwYXRjaGxldmVsX3JldmlzaW9uLCBfcGF0Y2hsZXZlbF9yZXZpc2lvbiArIDExLAorICAgICAgICAgICAgbGVuIC0gMTMpOworICAgICAgICBwYXRjaGxldmVsX3JldmlzaW9uW2xlbiAtIDEzXSA9ICdcMCc7CisgICAgICAgIHN2bl9yZXZpc2lvbiA9IHBhdGNobGV2ZWxfcmV2aXNpb247CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgc3ZuX3JldmlzaW9uID0gIiI7CiAKLQlzdm5faW5pdGlhbGl6ZWQgPSAxOworICAgIHN2bl9pbml0aWFsaXplZCA9IDE7CiB9CiAKIC8qIFJldHVybiBzdm52ZXJzaW9uIG91dHB1dCBpZiBhdmFpbGFibGUuCkBAIC0xMTg0LDE1ICsxMTg0LDE1IEBACiBjb25zdCBjaGFyKgogUHlfU3VidmVyc2lvblJldmlzaW9uKCkKIHsKLQlzdm52ZXJzaW9uX2luaXQoKTsKLQlyZXR1cm4gc3ZuX3JldmlzaW9uOworICAgIHN2bnZlcnNpb25faW5pdCgpOworICAgIHJldHVybiBzdm5fcmV2aXNpb247CiB9CiAKIGNvbnN0IGNoYXIqCiBQeV9TdWJ2ZXJzaW9uU2hvcnRCcmFuY2goKQogewotCXN2bnZlcnNpb25faW5pdCgpOwotCXJldHVybiBzaG9ydGJyYW5jaDsKKyAgICBzdm52ZXJzaW9uX2luaXQoKTsKKyAgICByZXR1cm4gc2hvcnRicmFuY2g7CiB9CiAKIApAQCAtMTIwNCw0MzEgKzEyMDQsNDMxIEBACiBzdGF0aWMgUHlUeXBlT2JqZWN0IEZsYWdzVHlwZSA9IHswLCAwLCAwLCAwLCAwLCAwfTsKIAogc3RhdGljIFB5U3RydWN0U2VxdWVuY2VfRmllbGQgZmxhZ3NfZmllbGRzW10gPSB7Ci0JeyJkZWJ1ZyIsCQkiLWQifSwKLQl7InB5M2tfd2FybmluZyIsCSItMyJ9LAotCXsiZGl2aXNpb25fd2FybmluZyIsCSItUSJ9LAotCXsiZGl2aXNpb25fbmV3IiwJIi1RbmV3In0sCi0JeyJpbnNwZWN0IiwJCSItaSJ9LAotCXsiaW50ZXJhY3RpdmUiLAkJIi1pIn0sCi0JeyJvcHRpbWl6ZSIsCQkiLU8gb3IgLU9PIn0sCi0JeyJkb250X3dyaXRlX2J5dGVjb2RlIiwJIi1CIn0sCi0JeyJub191c2VyX3NpdGUiLAkiLXMifSwKLQl7Im5vX3NpdGUiLAkJIi1TIn0sCi0JeyJpZ25vcmVfZW52aXJvbm1lbnQiLAkiLUUifSwKLQl7InRhYmNoZWNrIiwJCSItdCBvciAtdHQifSwKLQl7InZlcmJvc2UiLAkJIi12In0sCisgICAgeyJkZWJ1ZyIsICAgICAgICAgICAgICAgICAgICItZCJ9LAorICAgIHsicHkza193YXJuaW5nIiwgICAgICAgICAgICAiLTMifSwKKyAgICB7ImRpdmlzaW9uX3dhcm5pbmciLCAgICAgICAgIi1RIn0sCisgICAgeyJkaXZpc2lvbl9uZXciLCAgICAgICAgICAgICItUW5ldyJ9LAorICAgIHsiaW5zcGVjdCIsICAgICAgICAgICAgICAgICAiLWkifSwKKyAgICB7ImludGVyYWN0aXZlIiwgICAgICAgICAgICAgIi1pIn0sCisgICAgeyJvcHRpbWl6ZSIsICAgICAgICAgICAgICAgICItTyBvciAtT08ifSwKKyAgICB7ImRvbnRfd3JpdGVfYnl0ZWNvZGUiLCAgICAgIi1CIn0sCisgICAgeyJub191c2VyX3NpdGUiLCAgICAgICAgICAgICItcyJ9LAorICAgIHsibm9fc2l0ZSIsICAgICAgICAgICAgICAgICAiLVMifSwKKyAgICB7Imlnbm9yZV9lbnZpcm9ubWVudCIsICAgICAgIi1FIn0sCisgICAgeyJ0YWJjaGVjayIsICAgICAgICAgICAgICAgICItdCBvciAtdHQifSwKKyAgICB7InZlcmJvc2UiLCAgICAgICAgICAgICAgICAgIi12In0sCiAjaWZkZWYgUklTQ09TCi0JeyJyaXNjb3Nfd2ltcCIsCQkiPz8/In0sCisgICAgeyJyaXNjb3Nfd2ltcCIsICAgICAgICAgICAgICI/Pz8ifSwKICNlbmRpZgotCS8qIHsidW5idWZmZXJlZCIsCQkiLXUifSwgKi8KLQl7InVuaWNvZGUiLAkJIi1VIn0sCi0JLyogeyJza2lwX2ZpcnN0IiwJCSIteCJ9LCAqLwotCXsiYnl0ZXNfd2FybmluZyIsICItYiJ9LAotCXswfQorICAgIC8qIHsidW5idWZmZXJlZCIsICAgICAgICAgICAgICAgICAgICItdSJ9LCAqLworICAgIHsidW5pY29kZSIsICAgICAgICAgICAgICAgICAiLVUifSwKKyAgICAvKiB7InNraXBfZmlyc3QiLCAgICAgICAgICAgICAgICAgICAiLXgifSwgKi8KKyAgICB7ImJ5dGVzX3dhcm5pbmciLCAiLWIifSwKKyAgICB7MH0KIH07CiAKIHN0YXRpYyBQeVN0cnVjdFNlcXVlbmNlX0Rlc2MgZmxhZ3NfZGVzYyA9IHsKLQkic3lzLmZsYWdzIiwJLyogbmFtZSAqLwotCWZsYWdzX19kb2NfXywJLyogZG9jICovCi0JZmxhZ3NfZmllbGRzLAkvKiBmaWVsZHMgKi8KKyAgICAic3lzLmZsYWdzIiwgICAgICAgIC8qIG5hbWUgKi8KKyAgICBmbGFnc19fZG9jX18sICAgICAgIC8qIGRvYyAqLworICAgIGZsYWdzX2ZpZWxkcywgICAgICAgLyogZmllbGRzICovCiAjaWZkZWYgUklTQ09TCi0JMTYKKyAgICAxNgogI2Vsc2UKLQkxNQorICAgIDE1CiAjZW5kaWYKIH07CiAKIHN0YXRpYyBQeU9iamVjdCoKIG1ha2VfZmxhZ3Modm9pZCkKIHsKLQlpbnQgcG9zID0gMDsKLQlQeU9iamVjdCAqc2VxOworICAgIGludCBwb3MgPSAwOworICAgIFB5T2JqZWN0ICpzZXE7CiAKLQlzZXEgPSBQeVN0cnVjdFNlcXVlbmNlX05ldygmRmxhZ3NUeXBlKTsKLQlpZiAoc2VxID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIHNlcSA9IFB5U3RydWN0U2VxdWVuY2VfTmV3KCZGbGFnc1R5cGUpOworICAgIGlmIChzZXEgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKICNkZWZpbmUgU2V0RmxhZyhmbGFnKSBcCi0JUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTShzZXEsIHBvcysrLCBQeUludF9Gcm9tTG9uZyhmbGFnKSkKKyAgICBQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHNlcSwgcG9zKyssIFB5SW50X0Zyb21Mb25nKGZsYWcpKQogCi0JU2V0RmxhZyhQeV9EZWJ1Z0ZsYWcpOwotCVNldEZsYWcoUHlfUHkza1dhcm5pbmdGbGFnKTsKLQlTZXRGbGFnKFB5X0RpdmlzaW9uV2FybmluZ0ZsYWcpOwotCVNldEZsYWcoX1B5X1FuZXdGbGFnKTsKLQlTZXRGbGFnKFB5X0luc3BlY3RGbGFnKTsKLQlTZXRGbGFnKFB5X0ludGVyYWN0aXZlRmxhZyk7Ci0JU2V0RmxhZyhQeV9PcHRpbWl6ZUZsYWcpOwotCVNldEZsYWcoUHlfRG9udFdyaXRlQnl0ZWNvZGVGbGFnKTsKLQlTZXRGbGFnKFB5X05vVXNlclNpdGVEaXJlY3RvcnkpOwotCVNldEZsYWcoUHlfTm9TaXRlRmxhZyk7Ci0JU2V0RmxhZyhQeV9JZ25vcmVFbnZpcm9ubWVudEZsYWcpOwotCVNldEZsYWcoUHlfVGFiY2hlY2tGbGFnKTsKLQlTZXRGbGFnKFB5X1ZlcmJvc2VGbGFnKTsKKyAgICBTZXRGbGFnKFB5X0RlYnVnRmxhZyk7CisgICAgU2V0RmxhZyhQeV9QeTNrV2FybmluZ0ZsYWcpOworICAgIFNldEZsYWcoUHlfRGl2aXNpb25XYXJuaW5nRmxhZyk7CisgICAgU2V0RmxhZyhfUHlfUW5ld0ZsYWcpOworICAgIFNldEZsYWcoUHlfSW5zcGVjdEZsYWcpOworICAgIFNldEZsYWcoUHlfSW50ZXJhY3RpdmVGbGFnKTsKKyAgICBTZXRGbGFnKFB5X09wdGltaXplRmxhZyk7CisgICAgU2V0RmxhZyhQeV9Eb250V3JpdGVCeXRlY29kZUZsYWcpOworICAgIFNldEZsYWcoUHlfTm9Vc2VyU2l0ZURpcmVjdG9yeSk7CisgICAgU2V0RmxhZyhQeV9Ob1NpdGVGbGFnKTsKKyAgICBTZXRGbGFnKFB5X0lnbm9yZUVudmlyb25tZW50RmxhZyk7CisgICAgU2V0RmxhZyhQeV9UYWJjaGVja0ZsYWcpOworICAgIFNldEZsYWcoUHlfVmVyYm9zZUZsYWcpOwogI2lmZGVmIFJJU0NPUwotCVNldEZsYWcoUHlfUklTQ09TV2ltcEZsYWcpOworICAgIFNldEZsYWcoUHlfUklTQ09TV2ltcEZsYWcpOwogI2VuZGlmCi0JLyogU2V0RmxhZyhzYXdfdW5idWZmZXJlZF9mbGFnKTsgKi8KLQlTZXRGbGFnKFB5X1VuaWNvZGVGbGFnKTsKLQkvKiBTZXRGbGFnKHNraXBmaXJzdGxpbmUpOyAqLworICAgIC8qIFNldEZsYWcoc2F3X3VuYnVmZmVyZWRfZmxhZyk7ICovCisgICAgU2V0RmxhZyhQeV9Vbmljb2RlRmxhZyk7CisgICAgLyogU2V0RmxhZyhza2lwZmlyc3RsaW5lKTsgKi8KICAgICBTZXRGbGFnKFB5X0J5dGVzV2FybmluZ0ZsYWcpOwogI3VuZGVmIFNldEZsYWcKIAotCWlmIChQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gc2VxOworICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gc2VxOwogfQogCiBQeU9iamVjdCAqCiBfUHlTeXNfSW5pdCh2b2lkKQogewotCVB5T2JqZWN0ICptLCAqdiwgKnN5c2RpY3Q7Ci0JUHlPYmplY3QgKnN5c2luLCAqc3lzb3V0LCAqc3lzZXJyOwotCWNoYXIgKnM7CisgICAgUHlPYmplY3QgKm0sICp2LCAqc3lzZGljdDsKKyAgICBQeU9iamVjdCAqc3lzaW4sICpzeXNvdXQsICpzeXNlcnI7CisgICAgY2hhciAqczsKIAotCW0gPSBQeV9Jbml0TW9kdWxlMygic3lzIiwgc3lzX21ldGhvZHMsIHN5c19kb2MpOwotCWlmIChtID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXN5c2RpY3QgPSBQeU1vZHVsZV9HZXREaWN0KG0pOwotI2RlZmluZSBTRVRfU1lTX0ZST01fU1RSSU5HKGtleSwgdmFsdWUpCQkJXAotCXYgPSB2YWx1ZTsJCQkJCVwKLQlpZiAodiAhPSBOVUxMKQkJCQkJXAotCQlQeURpY3RfU2V0SXRlbVN0cmluZyhzeXNkaWN0LCBrZXksIHYpOwlcCi0JUHlfWERFQ1JFRih2KQorICAgIG0gPSBQeV9Jbml0TW9kdWxlMygic3lzIiwgc3lzX21ldGhvZHMsIHN5c19kb2MpOworICAgIGlmIChtID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHN5c2RpY3QgPSBQeU1vZHVsZV9HZXREaWN0KG0pOworI2RlZmluZSBTRVRfU1lTX0ZST01fU1RSSU5HKGtleSwgdmFsdWUpICAgICAgICAgICAgICAgICBcCisgICAgdiA9IHZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAodiAhPSBOVUxMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhzeXNkaWN0LCBrZXksIHYpOyAgICAgICAgICBcCisgICAgUHlfWERFQ1JFRih2KQogCi0JLyogQ2hlY2sgdGhhdCBzdGRpbiBpcyBub3QgYSBkaXJlY3RvcnkKLQlVc2luZyBzaGVsbCByZWRpcmVjdGlvbiwgeW91IGNhbiByZWRpcmVjdCBzdGRpbiB0byBhIGRpcmVjdG9yeSwKLQljcmFzaGluZyB0aGUgUHl0aG9uIGludGVycHJldGVyLiBDYXRjaCB0aGlzIGNvbW1vbiBtaXN0YWtlIGhlcmUKLQlhbmQgb3V0cHV0IGEgdXNlZnVsIGVycm9yIG1lc3NhZ2UuIE5vdGUgdGhhdCB1bmRlciBNUyBXaW5kb3dzLAotCXRoZSBzaGVsbCBhbHJlYWR5IHByZXZlbnRzIHRoYXQuICovCisgICAgLyogQ2hlY2sgdGhhdCBzdGRpbiBpcyBub3QgYSBkaXJlY3RvcnkKKyAgICBVc2luZyBzaGVsbCByZWRpcmVjdGlvbiwgeW91IGNhbiByZWRpcmVjdCBzdGRpbiB0byBhIGRpcmVjdG9yeSwKKyAgICBjcmFzaGluZyB0aGUgUHl0aG9uIGludGVycHJldGVyLiBDYXRjaCB0aGlzIGNvbW1vbiBtaXN0YWtlIGhlcmUKKyAgICBhbmQgb3V0cHV0IGEgdXNlZnVsIGVycm9yIG1lc3NhZ2UuIE5vdGUgdGhhdCB1bmRlciBNUyBXaW5kb3dzLAorICAgIHRoZSBzaGVsbCBhbHJlYWR5IHByZXZlbnRzIHRoYXQuICovCiAjaWYgIWRlZmluZWQoTVNfV0lORE9XUykKLQl7Ci0JCXN0cnVjdCBzdGF0IHNiOwotCQlpZiAoZnN0YXQoZmlsZW5vKHN0ZGluKSwgJnNiKSA9PSAwICYmCi0JCSAgICBTX0lTRElSKHNiLnN0X21vZGUpKSB7Ci0JCQkvKiBUaGVyZSdzIG5vdGhpbmcgbW9yZSB3ZSBjYW4gZG8uICovCi0JCQkvKiBQeV9GYXRhbEVycm9yKCkgd2lsbCBjb3JlIGR1bXAsIHNvIGp1c3QgZXhpdC4gKi8KLQkJCVB5U3lzX1dyaXRlU3RkZXJyKCJQeXRob24gZXJyb3I6IDxzdGRpbj4gaXMgYSBkaXJlY3RvcnksIGNhbm5vdCBjb250aW51ZVxuIik7Ci0JCQlleGl0KEVYSVRfRkFJTFVSRSk7Ci0JCX0KLQl9CisgICAgeworICAgICAgICBzdHJ1Y3Qgc3RhdCBzYjsKKyAgICAgICAgaWYgKGZzdGF0KGZpbGVubyhzdGRpbiksICZzYikgPT0gMCAmJgorICAgICAgICAgICAgU19JU0RJUihzYi5zdF9tb2RlKSkgeworICAgICAgICAgICAgLyogVGhlcmUncyBub3RoaW5nIG1vcmUgd2UgY2FuIGRvLiAqLworICAgICAgICAgICAgLyogUHlfRmF0YWxFcnJvcigpIHdpbGwgY29yZSBkdW1wLCBzbyBqdXN0IGV4aXQuICovCisgICAgICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigiUHl0aG9uIGVycm9yOiA8c3RkaW4+IGlzIGEgZGlyZWN0b3J5LCBjYW5ub3QgY29udGludWVcbiIpOworICAgICAgICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOworICAgICAgICB9CisgICAgfQogI2VuZGlmCiAKLQkvKiBDbG9zaW5nIHRoZSBzdGFuZGFyZCBGSUxFKiBpZiBzeXMuc3RkKiBnb2VzIGF3YXlzIGNhdXNlcyBwcm9ibGVtcwotCSAqIGZvciBlbWJlZGRlZCBQeXRob24gdXNhZ2VzLiBDbG9zaW5nIHRoZW0gd2hlbiBzb21lYm9keSBleHBsaWNpdGx5Ci0JICogaW52b2tlcyAuY2xvc2UoKSBtaWdodCBiZSBwb3NzaWJsZSwgYnV0IHRoZSBGQVEgcHJvbWlzZXMgdGhleSBnZXQKLQkgKiBuZXZlciBjbG9zZWQuIEhvd2V2ZXIsIHdlIHN0aWxsIG5lZWQgdG8gZ2V0IHdyaXRlIGVycm9ycyB3aGVuCi0JICogd3JpdGluZyBmYWlscyAoZS5nLiBiZWNhdXNlIHN0ZG91dCBpcyByZWRpcmVjdGVkKSwgc28gd2UgZmx1c2ggdGhlCi0JICogc3RyZWFtcyBhbmQgY2hlY2sgZm9yIGVycm9ycyBiZWZvcmUgdGhlIGZpbGUgb2JqZWN0cyBhcmUgZGVsZXRlZC4KLQkgKiBPbiBPUyBYLCBmZmx1c2goKWluZyBzdGRpbiBjYXVzZXMgYW4gZXJyb3IsIHNvIHdlIGV4ZW1wdCBzdGRpbgotCSAqIGZyb20gdGhhdCBwcm9jZWR1cmUuCi0JICovCi0Jc3lzaW4gPSBQeUZpbGVfRnJvbUZpbGUoc3RkaW4sICI8c3RkaW4+IiwgInIiLCBOVUxMKTsKLQlzeXNvdXQgPSBQeUZpbGVfRnJvbUZpbGUoc3Rkb3V0LCAiPHN0ZG91dD4iLCAidyIsIF9jaGVja19hbmRfZmx1c2gpOwotCXN5c2VyciA9IFB5RmlsZV9Gcm9tRmlsZShzdGRlcnIsICI8c3RkZXJyPiIsICJ3IiwgX2NoZWNrX2FuZF9mbHVzaCk7Ci0JaWYgKFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiBOVUxMOworICAgIC8qIENsb3NpbmcgdGhlIHN0YW5kYXJkIEZJTEUqIGlmIHN5cy5zdGQqIGdvZXMgYXdheXMgY2F1c2VzIHByb2JsZW1zCisgICAgICogZm9yIGVtYmVkZGVkIFB5dGhvbiB1c2FnZXMuIENsb3NpbmcgdGhlbSB3aGVuIHNvbWVib2R5IGV4cGxpY2l0bHkKKyAgICAgKiBpbnZva2VzIC5jbG9zZSgpIG1pZ2h0IGJlIHBvc3NpYmxlLCBidXQgdGhlIEZBUSBwcm9taXNlcyB0aGV5IGdldAorICAgICAqIG5ldmVyIGNsb3NlZC4gSG93ZXZlciwgd2Ugc3RpbGwgbmVlZCB0byBnZXQgd3JpdGUgZXJyb3JzIHdoZW4KKyAgICAgKiB3cml0aW5nIGZhaWxzIChlLmcuIGJlY2F1c2Ugc3Rkb3V0IGlzIHJlZGlyZWN0ZWQpLCBzbyB3ZSBmbHVzaCB0aGUKKyAgICAgKiBzdHJlYW1zIGFuZCBjaGVjayBmb3IgZXJyb3JzIGJlZm9yZSB0aGUgZmlsZSBvYmplY3RzIGFyZSBkZWxldGVkLgorICAgICAqIE9uIE9TIFgsIGZmbHVzaCgpaW5nIHN0ZGluIGNhdXNlcyBhbiBlcnJvciwgc28gd2UgZXhlbXB0IHN0ZGluCisgICAgICogZnJvbSB0aGF0IHByb2NlZHVyZS4KKyAgICAgKi8KKyAgICBzeXNpbiA9IFB5RmlsZV9Gcm9tRmlsZShzdGRpbiwgIjxzdGRpbj4iLCAiciIsIE5VTEwpOworICAgIHN5c291dCA9IFB5RmlsZV9Gcm9tRmlsZShzdGRvdXQsICI8c3Rkb3V0PiIsICJ3IiwgX2NoZWNrX2FuZF9mbHVzaCk7CisgICAgc3lzZXJyID0gUHlGaWxlX0Zyb21GaWxlKHN0ZGVyciwgIjxzdGRlcnI+IiwgInciLCBfY2hlY2tfYW5kX2ZsdXNoKTsKKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhzeXNkaWN0LCAic3RkaW4iLCBzeXNpbik7Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoc3lzZGljdCwgInN0ZG91dCIsIHN5c291dCk7Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoc3lzZGljdCwgInN0ZGVyciIsIHN5c2Vycik7Ci0JLyogTWFrZSBiYWNrdXAgY29waWVzIGZvciBjbGVhbnVwICovCi0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoc3lzZGljdCwgIl9fc3RkaW5fXyIsIHN5c2luKTsKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhzeXNkaWN0LCAiX19zdGRvdXRfXyIsIHN5c291dCk7Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoc3lzZGljdCwgIl9fc3RkZXJyX18iLCBzeXNlcnIpOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKHN5c2RpY3QsICJfX2Rpc3BsYXlob29rX18iLAotCQkJICAgICBQeURpY3RfR2V0SXRlbVN0cmluZyhzeXNkaWN0LCAiZGlzcGxheWhvb2siKSk7Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoc3lzZGljdCwgIl9fZXhjZXB0aG9va19fIiwKLQkJCSAgICAgUHlEaWN0X0dldEl0ZW1TdHJpbmcoc3lzZGljdCwgImV4Y2VwdGhvb2siKSk7Ci0JUHlfWERFQ1JFRihzeXNpbik7Ci0JUHlfWERFQ1JFRihzeXNvdXQpOwotCVB5X1hERUNSRUYoc3lzZXJyKTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhzeXNkaWN0LCAic3RkaW4iLCBzeXNpbik7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoc3lzZGljdCwgInN0ZG91dCIsIHN5c291dCk7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoc3lzZGljdCwgInN0ZGVyciIsIHN5c2Vycik7CisgICAgLyogTWFrZSBiYWNrdXAgY29waWVzIGZvciBjbGVhbnVwICovCisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoc3lzZGljdCwgIl9fc3RkaW5fXyIsIHN5c2luKTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhzeXNkaWN0LCAiX19zdGRvdXRfXyIsIHN5c291dCk7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoc3lzZGljdCwgIl9fc3RkZXJyX18iLCBzeXNlcnIpOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKHN5c2RpY3QsICJfX2Rpc3BsYXlob29rX18iLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5RGljdF9HZXRJdGVtU3RyaW5nKHN5c2RpY3QsICJkaXNwbGF5aG9vayIpKTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhzeXNkaWN0LCAiX19leGNlcHRob29rX18iLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5RGljdF9HZXRJdGVtU3RyaW5nKHN5c2RpY3QsICJleGNlcHRob29rIikpOworICAgIFB5X1hERUNSRUYoc3lzaW4pOworICAgIFB5X1hERUNSRUYoc3lzb3V0KTsKKyAgICBQeV9YREVDUkVGKHN5c2Vycik7CiAKLQlTRVRfU1lTX0ZST01fU1RSSU5HKCJ2ZXJzaW9uIiwKLQkJCSAgICAgUHlTdHJpbmdfRnJvbVN0cmluZyhQeV9HZXRWZXJzaW9uKCkpKTsKLQlTRVRfU1lTX0ZST01fU1RSSU5HKCJoZXh2ZXJzaW9uIiwKLQkJCSAgICAgUHlJbnRfRnJvbUxvbmcoUFlfVkVSU0lPTl9IRVgpKTsKLQlzdm52ZXJzaW9uX2luaXQoKTsKLQlTRVRfU1lTX0ZST01fU1RSSU5HKCJzdWJ2ZXJzaW9uIiwKLQkJCSAgICAgUHlfQnVpbGRWYWx1ZSgiKHNzeikiLCAiQ1B5dGhvbiIsIGJyYW5jaCwKLQkJCQkJICBzdm5fcmV2aXNpb24pKTsKLQlTRVRfU1lTX0ZST01fU1RSSU5HKCJkb250X3dyaXRlX2J5dGVjb2RlIiwKLQkJCSAgICAgUHlCb29sX0Zyb21Mb25nKFB5X0RvbnRXcml0ZUJ5dGVjb2RlRmxhZykpOwotCS8qCi0JICogVGhlc2UgcmVsZWFzZSBsZXZlbCBjaGVja3MgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZSBhbmQgY292ZXIKLQkgKiB0aGUgZmllbGQsIHNvIGRvbid0IGdldCB0b28gZmFuY3kgd2l0aCB0aGUgcHJlLXByb2Nlc3NvciEKLQkgKi8KKyAgICBTRVRfU1lTX0ZST01fU1RSSU5HKCJ2ZXJzaW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19Gcm9tU3RyaW5nKFB5X0dldFZlcnNpb24oKSkpOworICAgIFNFVF9TWVNfRlJPTV9TVFJJTkcoImhleHZlcnNpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5SW50X0Zyb21Mb25nKFBZX1ZFUlNJT05fSEVYKSk7CisgICAgc3ZudmVyc2lvbl9pbml0KCk7CisgICAgU0VUX1NZU19GUk9NX1NUUklORygic3VidmVyc2lvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlfQnVpbGRWYWx1ZSgiKHNzeikiLCAiQ1B5dGhvbiIsIGJyYW5jaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ZuX3JldmlzaW9uKSk7CisgICAgU0VUX1NZU19GUk9NX1NUUklORygiZG9udF93cml0ZV9ieXRlY29kZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlCb29sX0Zyb21Mb25nKFB5X0RvbnRXcml0ZUJ5dGVjb2RlRmxhZykpOworICAgIC8qCisgICAgICogVGhlc2UgcmVsZWFzZSBsZXZlbCBjaGVja3MgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZSBhbmQgY292ZXIKKyAgICAgKiB0aGUgZmllbGQsIHNvIGRvbid0IGdldCB0b28gZmFuY3kgd2l0aCB0aGUgcHJlLXByb2Nlc3NvciEKKyAgICAgKi8KICNpZiBQWV9SRUxFQVNFX0xFVkVMID09IFBZX1JFTEVBU0VfTEVWRUxfQUxQSEEKLQlzID0gImFscGhhIjsKKyAgICBzID0gImFscGhhIjsKICNlbGlmIFBZX1JFTEVBU0VfTEVWRUwgPT0gUFlfUkVMRUFTRV9MRVZFTF9CRVRBCi0JcyA9ICJiZXRhIjsKKyAgICBzID0gImJldGEiOwogI2VsaWYgUFlfUkVMRUFTRV9MRVZFTCA9PSBQWV9SRUxFQVNFX0xFVkVMX0dBTU1BCi0JcyA9ICJjYW5kaWRhdGUiOworICAgIHMgPSAiY2FuZGlkYXRlIjsKICNlbGlmIFBZX1JFTEVBU0VfTEVWRUwgPT0gUFlfUkVMRUFTRV9MRVZFTF9GSU5BTAotCXMgPSAiZmluYWwiOworICAgIHMgPSAiZmluYWwiOwogI2VuZGlmCiAKLQlTRVRfU1lTX0ZST01fU1RSSU5HKCJ2ZXJzaW9uX2luZm8iLAotCQkJICAgIFB5X0J1aWxkVmFsdWUoImlpaXNpIiwgUFlfTUFKT1JfVkVSU0lPTiwKLQkJCQkJICAgICAgIFBZX01JTk9SX1ZFUlNJT04sCi0JCQkJCSAgICAgICBQWV9NSUNST19WRVJTSU9OLCBzLAotCQkJCQkgICAgICAgUFlfUkVMRUFTRV9TRVJJQUwpKTsKLQlTRVRfU1lTX0ZST01fU1RSSU5HKCJhcGlfdmVyc2lvbiIsCi0JCQkgICAgUHlJbnRfRnJvbUxvbmcoUFlUSE9OX0FQSV9WRVJTSU9OKSk7Ci0JU0VUX1NZU19GUk9NX1NUUklORygiY29weXJpZ2h0IiwKLQkJCSAgICBQeVN0cmluZ19Gcm9tU3RyaW5nKFB5X0dldENvcHlyaWdodCgpKSk7Ci0JU0VUX1NZU19GUk9NX1NUUklORygicGxhdGZvcm0iLAotCQkJICAgIFB5U3RyaW5nX0Zyb21TdHJpbmcoUHlfR2V0UGxhdGZvcm0oKSkpOwotCVNFVF9TWVNfRlJPTV9TVFJJTkcoImV4ZWN1dGFibGUiLAotCQkJICAgIFB5U3RyaW5nX0Zyb21TdHJpbmcoUHlfR2V0UHJvZ3JhbUZ1bGxQYXRoKCkpKTsKLQlTRVRfU1lTX0ZST01fU1RSSU5HKCJwcmVmaXgiLAotCQkJICAgIFB5U3RyaW5nX0Zyb21TdHJpbmcoUHlfR2V0UHJlZml4KCkpKTsKLQlTRVRfU1lTX0ZST01fU1RSSU5HKCJleGVjX3ByZWZpeCIsCi0JCSAgIAkgICAgUHlTdHJpbmdfRnJvbVN0cmluZyhQeV9HZXRFeGVjUHJlZml4KCkpKTsKLQlTRVRfU1lTX0ZST01fU1RSSU5HKCJtYXhzaXplIiwKLQkJCSAgICBQeUludF9Gcm9tU3NpemVfdChQWV9TU0laRV9UX01BWCkpOwotCVNFVF9TWVNfRlJPTV9TVFJJTkcoIm1heGludCIsCi0JCQkgICAgUHlJbnRfRnJvbUxvbmcoUHlJbnRfR2V0TWF4KCkpKTsKLQlTRVRfU1lTX0ZST01fU1RSSU5HKCJweTNrd2FybmluZyIsCi0JCQkgICAgUHlCb29sX0Zyb21Mb25nKFB5X1B5M2tXYXJuaW5nRmxhZykpOwotCVNFVF9TWVNfRlJPTV9TVFJJTkcoImZsb2F0X2luZm8iLAotCQkJICAgIFB5RmxvYXRfR2V0SW5mbygpKTsKKyAgICBTRVRfU1lTX0ZST01fU1RSSU5HKCJ2ZXJzaW9uX2luZm8iLAorICAgICAgICAgICAgICAgICAgICAgICAgUHlfQnVpbGRWYWx1ZSgiaWlpc2kiLCBQWV9NQUpPUl9WRVJTSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBZX01JTk9SX1ZFUlNJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFlfTUlDUk9fVkVSU0lPTiwgcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQWV9SRUxFQVNFX1NFUklBTCkpOworICAgIFNFVF9TWVNfRlJPTV9TVFJJTkcoImFwaV92ZXJzaW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5SW50X0Zyb21Mb25nKFBZVEhPTl9BUElfVkVSU0lPTikpOworICAgIFNFVF9TWVNfRlJPTV9TVFJJTkcoImNvcHlyaWdodCIsCisgICAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19Gcm9tU3RyaW5nKFB5X0dldENvcHlyaWdodCgpKSk7CisgICAgU0VUX1NZU19GUk9NX1NUUklORygicGxhdGZvcm0iLAorICAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfRnJvbVN0cmluZyhQeV9HZXRQbGF0Zm9ybSgpKSk7CisgICAgU0VUX1NZU19GUk9NX1NUUklORygiZXhlY3V0YWJsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19Gcm9tU3RyaW5nKFB5X0dldFByb2dyYW1GdWxsUGF0aCgpKSk7CisgICAgU0VUX1NZU19GUk9NX1NUUklORygicHJlZml4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0Zyb21TdHJpbmcoUHlfR2V0UHJlZml4KCkpKTsKKyAgICBTRVRfU1lTX0ZST01fU1RSSU5HKCJleGVjX3ByZWZpeCIsCisgICAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19Gcm9tU3RyaW5nKFB5X0dldEV4ZWNQcmVmaXgoKSkpOworICAgIFNFVF9TWVNfRlJPTV9TVFJJTkcoIm1heHNpemUiLAorICAgICAgICAgICAgICAgICAgICAgICAgUHlJbnRfRnJvbVNzaXplX3QoUFlfU1NJWkVfVF9NQVgpKTsKKyAgICBTRVRfU1lTX0ZST01fU1RSSU5HKCJtYXhpbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgUHlJbnRfRnJvbUxvbmcoUHlJbnRfR2V0TWF4KCkpKTsKKyAgICBTRVRfU1lTX0ZST01fU1RSSU5HKCJweTNrd2FybmluZyIsCisgICAgICAgICAgICAgICAgICAgICAgICBQeUJvb2xfRnJvbUxvbmcoUHlfUHkza1dhcm5pbmdGbGFnKSk7CisgICAgU0VUX1NZU19GUk9NX1NUUklORygiZmxvYXRfaW5mbyIsCisgICAgICAgICAgICAgICAgICAgICAgICBQeUZsb2F0X0dldEluZm8oKSk7CiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCVNFVF9TWVNfRlJPTV9TVFJJTkcoIm1heHVuaWNvZGUiLAotCQkJICAgIFB5SW50X0Zyb21Mb25nKFB5VW5pY29kZV9HZXRNYXgoKSkpOworICAgIFNFVF9TWVNfRlJPTV9TVFJJTkcoIm1heHVuaWNvZGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgUHlJbnRfRnJvbUxvbmcoUHlVbmljb2RlX0dldE1heCgpKSk7CiAjZW5kaWYKLQlTRVRfU1lTX0ZST01fU1RSSU5HKCJidWlsdGluX21vZHVsZV9uYW1lcyIsCi0JCQkgICAgbGlzdF9idWlsdGluX21vZHVsZV9uYW1lcygpKTsKLQl7Ci0JCS8qIEFzc3VtZXMgdGhhdCBsb25ncyBhcmUgYXQgbGVhc3QgMiBieXRlcyBsb25nLgotCQkgICBTaG91bGQgYmUgc2FmZSEgKi8KLQkJdW5zaWduZWQgbG9uZyBudW1iZXIgPSAxOwotCQljaGFyICp2YWx1ZTsKKyAgICBTRVRfU1lTX0ZST01fU1RSSU5HKCJidWlsdGluX21vZHVsZV9uYW1lcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBsaXN0X2J1aWx0aW5fbW9kdWxlX25hbWVzKCkpOworICAgIHsKKyAgICAgICAgLyogQXNzdW1lcyB0aGF0IGxvbmdzIGFyZSBhdCBsZWFzdCAyIGJ5dGVzIGxvbmcuCisgICAgICAgICAgIFNob3VsZCBiZSBzYWZlISAqLworICAgICAgICB1bnNpZ25lZCBsb25nIG51bWJlciA9IDE7CisgICAgICAgIGNoYXIgKnZhbHVlOwogCi0JCXMgPSAoY2hhciAqKSAmbnVtYmVyOwotCQlpZiAoc1swXSA9PSAwKQotCQkJdmFsdWUgPSAiYmlnIjsKLQkJZWxzZQotCQkJdmFsdWUgPSAibGl0dGxlIjsKLQkJU0VUX1NZU19GUk9NX1NUUklORygiYnl0ZW9yZGVyIiwKLQkJCQkgICAgUHlTdHJpbmdfRnJvbVN0cmluZyh2YWx1ZSkpOwotCX0KKyAgICAgICAgcyA9IChjaGFyICopICZudW1iZXI7CisgICAgICAgIGlmIChzWzBdID09IDApCisgICAgICAgICAgICB2YWx1ZSA9ICJiaWciOworICAgICAgICBlbHNlCisgICAgICAgICAgICB2YWx1ZSA9ICJsaXR0bGUiOworICAgICAgICBTRVRfU1lTX0ZST01fU1RSSU5HKCJieXRlb3JkZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0Zyb21TdHJpbmcodmFsdWUpKTsKKyAgICB9CiAjaWZkZWYgTVNfQ09SRURMTAotCVNFVF9TWVNfRlJPTV9TVFJJTkcoImRsbGhhbmRsZSIsCi0JCQkgICAgUHlMb25nX0Zyb21Wb2lkUHRyKFB5V2luX0RMTGhNb2R1bGUpKTsKLQlTRVRfU1lTX0ZST01fU1RSSU5HKCJ3aW52ZXIiLAotCQkJICAgIFB5U3RyaW5nX0Zyb21TdHJpbmcoUHlXaW5fRExMVmVyc2lvblN0cmluZykpOworICAgIFNFVF9TWVNfRlJPTV9TVFJJTkcoImRsbGhhbmRsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICBQeUxvbmdfRnJvbVZvaWRQdHIoUHlXaW5fRExMaE1vZHVsZSkpOworICAgIFNFVF9TWVNfRlJPTV9TVFJJTkcoIndpbnZlciIsCisgICAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19Gcm9tU3RyaW5nKFB5V2luX0RMTFZlcnNpb25TdHJpbmcpKTsKICNlbmRpZgotCWlmICh3YXJub3B0aW9ucyA9PSBOVUxMKSB7Ci0JCXdhcm5vcHRpb25zID0gUHlMaXN0X05ldygwKTsKLQl9Ci0JZWxzZSB7Ci0JCVB5X0lOQ1JFRih3YXJub3B0aW9ucyk7Ci0JfQotCWlmICh3YXJub3B0aW9ucyAhPSBOVUxMKSB7Ci0JCVB5RGljdF9TZXRJdGVtU3RyaW5nKHN5c2RpY3QsICJ3YXJub3B0aW9ucyIsIHdhcm5vcHRpb25zKTsKLQl9CisgICAgaWYgKHdhcm5vcHRpb25zID09IE5VTEwpIHsKKyAgICAgICAgd2Fybm9wdGlvbnMgPSBQeUxpc3RfTmV3KDApOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgUHlfSU5DUkVGKHdhcm5vcHRpb25zKTsKKyAgICB9CisgICAgaWYgKHdhcm5vcHRpb25zICE9IE5VTEwpIHsKKyAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoc3lzZGljdCwgIndhcm5vcHRpb25zIiwgd2Fybm9wdGlvbnMpOworICAgIH0KIAotCWlmIChGbGFnc1R5cGUudHBfbmFtZSA9PSAwKQotCQlQeVN0cnVjdFNlcXVlbmNlX0luaXRUeXBlKCZGbGFnc1R5cGUsICZmbGFnc19kZXNjKTsKLQlTRVRfU1lTX0ZST01fU1RSSU5HKCJmbGFncyIsIG1ha2VfZmxhZ3MoKSk7Ci0JLyogcHJldmVudCB1c2VyIGZyb20gY3JlYXRpbmcgbmV3IGluc3RhbmNlcyAqLwotCUZsYWdzVHlwZS50cF9pbml0ID0gTlVMTDsKLQlGbGFnc1R5cGUudHBfbmV3ID0gTlVMTDsKKyAgICBpZiAoRmxhZ3NUeXBlLnRwX25hbWUgPT0gMCkKKyAgICAgICAgUHlTdHJ1Y3RTZXF1ZW5jZV9Jbml0VHlwZSgmRmxhZ3NUeXBlLCAmZmxhZ3NfZGVzYyk7CisgICAgU0VUX1NZU19GUk9NX1NUUklORygiZmxhZ3MiLCBtYWtlX2ZsYWdzKCkpOworICAgIC8qIHByZXZlbnQgdXNlciBmcm9tIGNyZWF0aW5nIG5ldyBpbnN0YW5jZXMgKi8KKyAgICBGbGFnc1R5cGUudHBfaW5pdCA9IE5VTEw7CisgICAgRmxhZ3NUeXBlLnRwX25ldyA9IE5VTEw7CiAKICN1bmRlZiBTRVRfU1lTX0ZST01fU1RSSU5HCi0JaWYgKFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBtOworICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gbTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG1ha2VwYXRob2JqZWN0KGNoYXIgKnBhdGgsIGludCBkZWxpbSkKIHsKLQlpbnQgaSwgbjsKLQljaGFyICpwOwotCVB5T2JqZWN0ICp2LCAqdzsKKyAgICBpbnQgaSwgbjsKKyAgICBjaGFyICpwOworICAgIFB5T2JqZWN0ICp2LCAqdzsKIAotCW4gPSAxOwotCXAgPSBwYXRoOwotCXdoaWxlICgocCA9IHN0cmNocihwLCBkZWxpbSkpICE9IE5VTEwpIHsKLQkJbisrOwotCQlwKys7Ci0JfQotCXYgPSBQeUxpc3RfTmV3KG4pOwotCWlmICh2ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWZvciAoaSA9IDA7IDsgaSsrKSB7Ci0JCXAgPSBzdHJjaHIocGF0aCwgZGVsaW0pOwotCQlpZiAocCA9PSBOVUxMKQotCQkJcCA9IHN0cmNocihwYXRoLCAnXDAnKTsgLyogRW5kIG9mIHN0cmluZyAqLwotCQl3ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocGF0aCwgKFB5X3NzaXplX3QpIChwIC0gcGF0aCkpOwotCQlpZiAodyA9PSBOVUxMKSB7Ci0JCQlQeV9ERUNSRUYodik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlQeUxpc3RfU2V0SXRlbSh2LCBpLCB3KTsKLQkJaWYgKCpwID09ICdcMCcpCi0JCQlicmVhazsKLQkJcGF0aCA9IHArMTsKLQl9Ci0JcmV0dXJuIHY7CisgICAgbiA9IDE7CisgICAgcCA9IHBhdGg7CisgICAgd2hpbGUgKChwID0gc3RyY2hyKHAsIGRlbGltKSkgIT0gTlVMTCkgeworICAgICAgICBuKys7CisgICAgICAgIHArKzsKKyAgICB9CisgICAgdiA9IFB5TGlzdF9OZXcobik7CisgICAgaWYgKHYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZm9yIChpID0gMDsgOyBpKyspIHsKKyAgICAgICAgcCA9IHN0cmNocihwYXRoLCBkZWxpbSk7CisgICAgICAgIGlmIChwID09IE5VTEwpCisgICAgICAgICAgICBwID0gc3RyY2hyKHBhdGgsICdcMCcpOyAvKiBFbmQgb2Ygc3RyaW5nICovCisgICAgICAgIHcgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShwYXRoLCAoUHlfc3NpemVfdCkgKHAgLSBwYXRoKSk7CisgICAgICAgIGlmICh3ID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIFB5TGlzdF9TZXRJdGVtKHYsIGksIHcpOworICAgICAgICBpZiAoKnAgPT0gJ1wwJykKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBwYXRoID0gcCsxOworICAgIH0KKyAgICByZXR1cm4gdjsKIH0KIAogdm9pZAogUHlTeXNfU2V0UGF0aChjaGFyICpwYXRoKQogewotCVB5T2JqZWN0ICp2OwotCWlmICgodiA9IG1ha2VwYXRob2JqZWN0KHBhdGgsIERFTElNKSkgPT0gTlVMTCkKLQkJUHlfRmF0YWxFcnJvcigiY2FuJ3QgY3JlYXRlIHN5cy5wYXRoIik7Ci0JaWYgKFB5U3lzX1NldE9iamVjdCgicGF0aCIsIHYpICE9IDApCi0JCVB5X0ZhdGFsRXJyb3IoImNhbid0IGFzc2lnbiBzeXMucGF0aCIpOwotCVB5X0RFQ1JFRih2KTsKKyAgICBQeU9iamVjdCAqdjsKKyAgICBpZiAoKHYgPSBtYWtlcGF0aG9iamVjdChwYXRoLCBERUxJTSkpID09IE5VTEwpCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoImNhbid0IGNyZWF0ZSBzeXMucGF0aCIpOworICAgIGlmIChQeVN5c19TZXRPYmplY3QoInBhdGgiLCB2KSAhPSAwKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJjYW4ndCBhc3NpZ24gc3lzLnBhdGgiKTsKKyAgICBQeV9ERUNSRUYodik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBtYWtlYXJndm9iamVjdChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiB7Ci0JUHlPYmplY3QgKmF2OwotCWlmIChhcmdjIDw9IDAgfHwgYXJndiA9PSBOVUxMKSB7Ci0JCS8qIEVuc3VyZSBhdCBsZWFzdCBvbmUgKGVtcHR5KSBhcmd1bWVudCBpcyBzZWVuICovCi0JCXN0YXRpYyBjaGFyICplbXB0eV9hcmd2WzFdID0geyIifTsKLQkJYXJndiA9IGVtcHR5X2FyZ3Y7Ci0JCWFyZ2MgPSAxOwotCX0KLQlhdiA9IFB5TGlzdF9OZXcoYXJnYyk7Ci0JaWYgKGF2ICE9IE5VTEwpIHsKLQkJaW50IGk7Ci0JCWZvciAoaSA9IDA7IGkgPCBhcmdjOyBpKyspIHsKKyAgICBQeU9iamVjdCAqYXY7CisgICAgaWYgKGFyZ2MgPD0gMCB8fCBhcmd2ID09IE5VTEwpIHsKKyAgICAgICAgLyogRW5zdXJlIGF0IGxlYXN0IG9uZSAoZW1wdHkpIGFyZ3VtZW50IGlzIHNlZW4gKi8KKyAgICAgICAgc3RhdGljIGNoYXIgKmVtcHR5X2FyZ3ZbMV0gPSB7IiJ9OworICAgICAgICBhcmd2ID0gZW1wdHlfYXJndjsKKyAgICAgICAgYXJnYyA9IDE7CisgICAgfQorICAgIGF2ID0gUHlMaXN0X05ldyhhcmdjKTsKKyAgICBpZiAoYXYgIT0gTlVMTCkgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGFyZ2M7IGkrKykgewogI2lmZGVmIF9fVk1TCi0JCQlQeU9iamVjdCAqdjsKKyAgICAgICAgICAgIFB5T2JqZWN0ICp2OwogCi0JCQkvKiBhcmd2WzBdIGlzIHRoZSBzY3JpcHQgcGF0aG5hbWUgaWYga25vd24gKi8KLQkJCWlmIChpID09IDApIHsKLQkJCQljaGFyKiBmbiA9IGRlY2MkdHJhbnNsYXRlX3Ztcyhhcmd2WzBdKTsKLQkJCQlpZiAoKGZuID09IChjaGFyICopMCkgfHwgZm4gPT0gKGNoYXIgKiktMSkKLQkJCQkJdiA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoYXJndlswXSk7Ci0JCQkJZWxzZQotCQkJCQl2ID0gUHlTdHJpbmdfRnJvbVN0cmluZygKLQkJCQkJCWRlY2MkdHJhbnNsYXRlX3Ztcyhhcmd2WzBdKSk7Ci0JCQl9IGVsc2UKLQkJCQl2ID0gUHlTdHJpbmdfRnJvbVN0cmluZyhhcmd2W2ldKTsKKyAgICAgICAgICAgIC8qIGFyZ3ZbMF0gaXMgdGhlIHNjcmlwdCBwYXRobmFtZSBpZiBrbm93biAqLworICAgICAgICAgICAgaWYgKGkgPT0gMCkgeworICAgICAgICAgICAgICAgIGNoYXIqIGZuID0gZGVjYyR0cmFuc2xhdGVfdm1zKGFyZ3ZbMF0pOworICAgICAgICAgICAgICAgIGlmICgoZm4gPT0gKGNoYXIgKikwKSB8fCBmbiA9PSAoY2hhciAqKS0xKQorICAgICAgICAgICAgICAgICAgICB2ID0gUHlTdHJpbmdfRnJvbVN0cmluZyhhcmd2WzBdKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgZGVjYyR0cmFuc2xhdGVfdm1zKGFyZ3ZbMF0pKTsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIHYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGFyZ3ZbaV0pOwogI2Vsc2UKLQkJCVB5T2JqZWN0ICp2ID0gUHlTdHJpbmdfRnJvbVN0cmluZyhhcmd2W2ldKTsKKyAgICAgICAgICAgIFB5T2JqZWN0ICp2ID0gUHlTdHJpbmdfRnJvbVN0cmluZyhhcmd2W2ldKTsKICNlbmRpZgotCQkJaWYgKHYgPT0gTlVMTCkgewotCQkJCVB5X0RFQ1JFRihhdik7Ci0JCQkJYXYgPSBOVUxMOwotCQkJCWJyZWFrOwotCQkJfQotCQkJUHlMaXN0X1NldEl0ZW0oYXYsIGksIHYpOwotCQl9Ci0JfQotCXJldHVybiBhdjsKKyAgICAgICAgICAgIGlmICh2ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoYXYpOworICAgICAgICAgICAgICAgIGF2ID0gTlVMTDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5TGlzdF9TZXRJdGVtKGF2LCBpLCB2KTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gYXY7CiB9CiAKIHZvaWQKIFB5U3lzX1NldEFyZ3YoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogewogI2lmIGRlZmluZWQoSEFWRV9SRUFMUEFUSCkKLQljaGFyIGZ1bGxwYXRoW01BWFBBVEhMRU5dOworICAgIGNoYXIgZnVsbHBhdGhbTUFYUEFUSExFTl07CiAjZWxpZiBkZWZpbmVkKE1TX1dJTkRPV1MpICYmICFkZWZpbmVkKE1TX1dJTkNFKQotCWNoYXIgZnVsbHBhdGhbTUFYX1BBVEhdOworICAgIGNoYXIgZnVsbHBhdGhbTUFYX1BBVEhdOwogI2VuZGlmCi0JUHlPYmplY3QgKmF2ID0gbWFrZWFyZ3ZvYmplY3QoYXJnYywgYXJndik7Ci0JUHlPYmplY3QgKnBhdGggPSBQeVN5c19HZXRPYmplY3QoInBhdGgiKTsKLQlpZiAoYXYgPT0gTlVMTCkKLQkJUHlfRmF0YWxFcnJvcigibm8gbWVtIGZvciBzeXMuYXJndiIpOwotCWlmIChQeVN5c19TZXRPYmplY3QoImFyZ3YiLCBhdikgIT0gMCkKLQkJUHlfRmF0YWxFcnJvcigiY2FuJ3QgYXNzaWduIHN5cy5hcmd2Iik7Ci0JaWYgKHBhdGggIT0gTlVMTCkgewotCQljaGFyICphcmd2MCA9IGFyZ3ZbMF07Ci0JCWNoYXIgKnAgPSBOVUxMOwotCQlQeV9zc2l6ZV90IG4gPSAwOwotCQlQeU9iamVjdCAqYTsKKyAgICBQeU9iamVjdCAqYXYgPSBtYWtlYXJndm9iamVjdChhcmdjLCBhcmd2KTsKKyAgICBQeU9iamVjdCAqcGF0aCA9IFB5U3lzX0dldE9iamVjdCgicGF0aCIpOworICAgIGlmIChhdiA9PSBOVUxMKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJubyBtZW0gZm9yIHN5cy5hcmd2Iik7CisgICAgaWYgKFB5U3lzX1NldE9iamVjdCgiYXJndiIsIGF2KSAhPSAwKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJjYW4ndCBhc3NpZ24gc3lzLmFyZ3YiKTsKKyAgICBpZiAocGF0aCAhPSBOVUxMKSB7CisgICAgICAgIGNoYXIgKmFyZ3YwID0gYXJndlswXTsKKyAgICAgICAgY2hhciAqcCA9IE5VTEw7CisgICAgICAgIFB5X3NzaXplX3QgbiA9IDA7CisgICAgICAgIFB5T2JqZWN0ICphOwogI2lmZGVmIEhBVkVfUkVBRExJTksKLQkJY2hhciBsaW5rW01BWFBBVEhMRU4rMV07Ci0JCWNoYXIgYXJndjBjb3B5WzIqTUFYUEFUSExFTisxXTsKLQkJaW50IG5yID0gMDsKLQkJaWYgKGFyZ2MgPiAwICYmIGFyZ3YwICE9IE5VTEwgJiYgc3RyY21wKGFyZ3YwLCAiLWMiKSAhPSAwKQotCQkJbnIgPSByZWFkbGluayhhcmd2MCwgbGluaywgTUFYUEFUSExFTik7Ci0JCWlmIChuciA+IDApIHsKLQkJCS8qIEl0J3MgYSBzeW1saW5rICovCi0JCQlsaW5rW25yXSA9ICdcMCc7Ci0JCQlpZiAobGlua1swXSA9PSBTRVApCi0JCQkJYXJndjAgPSBsaW5rOyAvKiBMaW5rIHRvIGFic29sdXRlIHBhdGggKi8KLQkJCWVsc2UgaWYgKHN0cmNocihsaW5rLCBTRVApID09IE5VTEwpCi0JCQkJOyAvKiBMaW5rIHdpdGhvdXQgcGF0aCAqLwotCQkJZWxzZSB7Ci0JCQkJLyogTXVzdCBqb2luKGRpcm5hbWUoYXJndjApLCBsaW5rKSAqLwotCQkJCWNoYXIgKnEgPSBzdHJyY2hyKGFyZ3YwLCBTRVApOwotCQkJCWlmIChxID09IE5VTEwpCi0JCQkJCWFyZ3YwID0gbGluazsgLyogYXJndjAgd2l0aG91dCBwYXRoICovCi0JCQkJZWxzZSB7Ci0JCQkJCS8qIE11c3QgbWFrZSBhIGNvcHkgKi8KLQkJCQkJc3RyY3B5KGFyZ3YwY29weSwgYXJndjApOwotCQkJCQlxID0gc3RycmNocihhcmd2MGNvcHksIFNFUCk7Ci0JCQkJCXN0cmNweShxKzEsIGxpbmspOwotCQkJCQlhcmd2MCA9IGFyZ3YwY29weTsKLQkJCQl9Ci0JCQl9Ci0JCX0KKyAgICAgICAgY2hhciBsaW5rW01BWFBBVEhMRU4rMV07CisgICAgICAgIGNoYXIgYXJndjBjb3B5WzIqTUFYUEFUSExFTisxXTsKKyAgICAgICAgaW50IG5yID0gMDsKKyAgICAgICAgaWYgKGFyZ2MgPiAwICYmIGFyZ3YwICE9IE5VTEwgJiYgc3RyY21wKGFyZ3YwLCAiLWMiKSAhPSAwKQorICAgICAgICAgICAgbnIgPSByZWFkbGluayhhcmd2MCwgbGluaywgTUFYUEFUSExFTik7CisgICAgICAgIGlmIChuciA+IDApIHsKKyAgICAgICAgICAgIC8qIEl0J3MgYSBzeW1saW5rICovCisgICAgICAgICAgICBsaW5rW25yXSA9ICdcMCc7CisgICAgICAgICAgICBpZiAobGlua1swXSA9PSBTRVApCisgICAgICAgICAgICAgICAgYXJndjAgPSBsaW5rOyAvKiBMaW5rIHRvIGFic29sdXRlIHBhdGggKi8KKyAgICAgICAgICAgIGVsc2UgaWYgKHN0cmNocihsaW5rLCBTRVApID09IE5VTEwpCisgICAgICAgICAgICAgICAgOyAvKiBMaW5rIHdpdGhvdXQgcGF0aCAqLworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgLyogTXVzdCBqb2luKGRpcm5hbWUoYXJndjApLCBsaW5rKSAqLworICAgICAgICAgICAgICAgIGNoYXIgKnEgPSBzdHJyY2hyKGFyZ3YwLCBTRVApOworICAgICAgICAgICAgICAgIGlmIChxID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIGFyZ3YwID0gbGluazsgLyogYXJndjAgd2l0aG91dCBwYXRoICovCisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8qIE11c3QgbWFrZSBhIGNvcHkgKi8KKyAgICAgICAgICAgICAgICAgICAgc3RyY3B5KGFyZ3YwY29weSwgYXJndjApOworICAgICAgICAgICAgICAgICAgICBxID0gc3RycmNocihhcmd2MGNvcHksIFNFUCk7CisgICAgICAgICAgICAgICAgICAgIHN0cmNweShxKzEsIGxpbmspOworICAgICAgICAgICAgICAgICAgICBhcmd2MCA9IGFyZ3YwY29weTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KICNlbmRpZiAvKiBIQVZFX1JFQURMSU5LICovCiAjaWYgU0VQID09ICdcXCcgLyogU3BlY2lhbCBjYXNlIGZvciBNUyBmaWxlbmFtZSBzeW50YXggKi8KLQkJaWYgKGFyZ2MgPiAwICYmIGFyZ3YwICE9IE5VTEwgJiYgc3RyY21wKGFyZ3YwLCAiLWMiKSAhPSAwKSB7Ci0JCQljaGFyICpxOworICAgICAgICBpZiAoYXJnYyA+IDAgJiYgYXJndjAgIT0gTlVMTCAmJiBzdHJjbXAoYXJndjAsICItYyIpICE9IDApIHsKKyAgICAgICAgICAgIGNoYXIgKnE7CiAjaWYgZGVmaW5lZChNU19XSU5ET1dTKSAmJiAhZGVmaW5lZChNU19XSU5DRSkKLQkJCS8qIFRoaXMgY29kZSBoZXJlIHJlcGxhY2VzIHRoZSBmaXJzdCBlbGVtZW50IGluIGFyZ3Ygd2l0aCB0aGUgZnVsbAotCQkJcGF0aCB0aGF0IGl0IHJlcHJlc2VudHMuIFVuZGVyIENFLCB0aGVyZSBhcmUgbm8gcmVsYXRpdmUgcGF0aHMgc28KLQkJCXRoZSBhcmd1bWVudCBtdXN0IGJlIHRoZSBmdWxsIHBhdGggYW55d2F5LiAqLwotCQkJY2hhciAqcHRlbXA7Ci0JCQlpZiAoR2V0RnVsbFBhdGhOYW1lKGFyZ3YwLAotCQkJCQkgICBzaXplb2YoZnVsbHBhdGgpLAotCQkJCQkgICBmdWxscGF0aCwKLQkJCQkJICAgJnB0ZW1wKSkgewotCQkJCWFyZ3YwID0gZnVsbHBhdGg7Ci0JCQl9CisgICAgICAgICAgICAvKiBUaGlzIGNvZGUgaGVyZSByZXBsYWNlcyB0aGUgZmlyc3QgZWxlbWVudCBpbiBhcmd2IHdpdGggdGhlIGZ1bGwKKyAgICAgICAgICAgIHBhdGggdGhhdCBpdCByZXByZXNlbnRzLiBVbmRlciBDRSwgdGhlcmUgYXJlIG5vIHJlbGF0aXZlIHBhdGhzIHNvCisgICAgICAgICAgICB0aGUgYXJndW1lbnQgbXVzdCBiZSB0aGUgZnVsbCBwYXRoIGFueXdheS4gKi8KKyAgICAgICAgICAgIGNoYXIgKnB0ZW1wOworICAgICAgICAgICAgaWYgKEdldEZ1bGxQYXRoTmFtZShhcmd2MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZnVsbHBhdGgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGxwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwdGVtcCkpIHsKKyAgICAgICAgICAgICAgICBhcmd2MCA9IGZ1bGxwYXRoOworICAgICAgICAgICAgfQogI2VuZGlmCi0JCQlwID0gc3RycmNocihhcmd2MCwgU0VQKTsKLQkJCS8qIFRlc3QgZm9yIGFsdGVybmF0ZSBzZXBhcmF0b3IgKi8KLQkJCXEgPSBzdHJyY2hyKHAgPyBwIDogYXJndjAsICcvJyk7Ci0JCQlpZiAocSAhPSBOVUxMKQotCQkJCXAgPSBxOwotCQkJaWYgKHAgIT0gTlVMTCkgewotCQkJCW4gPSBwICsgMSAtIGFyZ3YwOwotCQkJCWlmIChuID4gMSAmJiBwWy0xXSAhPSAnOicpCi0JCQkJCW4tLTsgLyogRHJvcCB0cmFpbGluZyBzZXBhcmF0b3IgKi8KLQkJCX0KLQkJfQorICAgICAgICAgICAgcCA9IHN0cnJjaHIoYXJndjAsIFNFUCk7CisgICAgICAgICAgICAvKiBUZXN0IGZvciBhbHRlcm5hdGUgc2VwYXJhdG9yICovCisgICAgICAgICAgICBxID0gc3RycmNocihwID8gcCA6IGFyZ3YwLCAnLycpOworICAgICAgICAgICAgaWYgKHEgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICBwID0gcTsKKyAgICAgICAgICAgIGlmIChwICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBuID0gcCArIDEgLSBhcmd2MDsKKyAgICAgICAgICAgICAgICBpZiAobiA+IDEgJiYgcFstMV0gIT0gJzonKQorICAgICAgICAgICAgICAgICAgICBuLS07IC8qIERyb3AgdHJhaWxpbmcgc2VwYXJhdG9yICovCisgICAgICAgICAgICB9CisgICAgICAgIH0KICNlbHNlIC8qIEFsbCBvdGhlciBmaWxlbmFtZSBzeW50YXhlcyAqLwotCQlpZiAoYXJnYyA+IDAgJiYgYXJndjAgIT0gTlVMTCAmJiBzdHJjbXAoYXJndjAsICItYyIpICE9IDApIHsKKyAgICAgICAgaWYgKGFyZ2MgPiAwICYmIGFyZ3YwICE9IE5VTEwgJiYgc3RyY21wKGFyZ3YwLCAiLWMiKSAhPSAwKSB7CiAjaWYgZGVmaW5lZChIQVZFX1JFQUxQQVRIKQotCQkJaWYgKHJlYWxwYXRoKGFyZ3YwLCBmdWxscGF0aCkpIHsKLQkJCQlhcmd2MCA9IGZ1bGxwYXRoOwotCQkJfQorICAgICAgICAgICAgaWYgKHJlYWxwYXRoKGFyZ3YwLCBmdWxscGF0aCkpIHsKKyAgICAgICAgICAgICAgICBhcmd2MCA9IGZ1bGxwYXRoOworICAgICAgICAgICAgfQogI2VuZGlmCi0JCQlwID0gc3RycmNocihhcmd2MCwgU0VQKTsKLQkJfQotCQlpZiAocCAhPSBOVUxMKSB7CisgICAgICAgICAgICBwID0gc3RycmNocihhcmd2MCwgU0VQKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocCAhPSBOVUxMKSB7CiAjaWZuZGVmIFJJU0NPUwotCQkJbiA9IHAgKyAxIC0gYXJndjA7CisgICAgICAgICAgICBuID0gcCArIDEgLSBhcmd2MDsKICNlbHNlIC8qIGRvbid0IGluY2x1ZGUgdHJhaWxpbmcgc2VwYXJhdG9yICovCi0JCQluID0gcCAtIGFyZ3YwOworICAgICAgICAgICAgbiA9IHAgLSBhcmd2MDsKICNlbmRpZiAvKiBSSVNDT1MgKi8KICNpZiBTRVAgPT0gJy8nIC8qIFNwZWNpYWwgY2FzZSBmb3IgVW5peCBmaWxlbmFtZSBzeW50YXggKi8KLQkJCWlmIChuID4gMSkKLQkJCQluLS07IC8qIERyb3AgdHJhaWxpbmcgc2VwYXJhdG9yICovCisgICAgICAgICAgICBpZiAobiA+IDEpCisgICAgICAgICAgICAgICAgbi0tOyAvKiBEcm9wIHRyYWlsaW5nIHNlcGFyYXRvciAqLwogI2VuZGlmIC8qIFVuaXggKi8KLQkJfQorICAgICAgICB9CiAjZW5kaWYgLyogQWxsIG90aGVycyAqLwotCQlhID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoYXJndjAsIG4pOwotCQlpZiAoYSA9PSBOVUxMKQotCQkJUHlfRmF0YWxFcnJvcigibm8gbWVtIGZvciBzeXMucGF0aCBpbnNlcnRpb24iKTsKLQkJaWYgKFB5TGlzdF9JbnNlcnQocGF0aCwgMCwgYSkgPCAwKQotCQkJUHlfRmF0YWxFcnJvcigic3lzLnBhdGguaW5zZXJ0KDApIGZhaWxlZCIpOwotCQlQeV9ERUNSRUYoYSk7Ci0JfQotCVB5X0RFQ1JFRihhdik7CisgICAgICAgIGEgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShhcmd2MCwgbik7CisgICAgICAgIGlmIChhID09IE5VTEwpCisgICAgICAgICAgICBQeV9GYXRhbEVycm9yKCJubyBtZW0gZm9yIHN5cy5wYXRoIGluc2VydGlvbiIpOworICAgICAgICBpZiAoUHlMaXN0X0luc2VydChwYXRoLCAwLCBhKSA8IDApCisgICAgICAgICAgICBQeV9GYXRhbEVycm9yKCJzeXMucGF0aC5pbnNlcnQoMCkgZmFpbGVkIik7CisgICAgICAgIFB5X0RFQ1JFRihhKTsKKyAgICB9CisgICAgUHlfREVDUkVGKGF2KTsKIH0KIAogCkBAIC0xNjU5LDQ4ICsxNjU5LDQ4IEBACiBzdGF0aWMgdm9pZAogbXl3cml0ZShjaGFyICpuYW1lLCBGSUxFICpmcCwgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IHZhKQogewotCVB5T2JqZWN0ICpmaWxlOwotCVB5T2JqZWN0ICplcnJvcl90eXBlLCAqZXJyb3JfdmFsdWUsICplcnJvcl90cmFjZWJhY2s7CisgICAgUHlPYmplY3QgKmZpbGU7CisgICAgUHlPYmplY3QgKmVycm9yX3R5cGUsICplcnJvcl92YWx1ZSwgKmVycm9yX3RyYWNlYmFjazsKIAotCVB5RXJyX0ZldGNoKCZlcnJvcl90eXBlLCAmZXJyb3JfdmFsdWUsICZlcnJvcl90cmFjZWJhY2spOwotCWZpbGUgPSBQeVN5c19HZXRPYmplY3QobmFtZSk7Ci0JaWYgKGZpbGUgPT0gTlVMTCB8fCBQeUZpbGVfQXNGaWxlKGZpbGUpID09IGZwKQotCQl2ZnByaW50ZihmcCwgZm9ybWF0LCB2YSk7Ci0JZWxzZSB7Ci0JCWNoYXIgYnVmZmVyWzEwMDFdOwotCQljb25zdCBpbnQgd3JpdHRlbiA9IFB5T1NfdnNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksCi0JCQkJCQkgICBmb3JtYXQsIHZhKTsKLQkJaWYgKFB5RmlsZV9Xcml0ZVN0cmluZyhidWZmZXIsIGZpbGUpICE9IDApIHsKLQkJCVB5RXJyX0NsZWFyKCk7Ci0JCQlmcHV0cyhidWZmZXIsIGZwKTsKLQkJfQotCQlpZiAod3JpdHRlbiA8IDAgfHwgKHNpemVfdCl3cml0dGVuID49IHNpemVvZihidWZmZXIpKSB7Ci0JCQljb25zdCBjaGFyICp0cnVuY2F0ZWQgPSAiLi4uIHRydW5jYXRlZCI7Ci0JCQlpZiAoUHlGaWxlX1dyaXRlU3RyaW5nKHRydW5jYXRlZCwgZmlsZSkgIT0gMCkgewotCQkJCVB5RXJyX0NsZWFyKCk7Ci0JCQkJZnB1dHModHJ1bmNhdGVkLCBmcCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JUHlFcnJfUmVzdG9yZShlcnJvcl90eXBlLCBlcnJvcl92YWx1ZSwgZXJyb3JfdHJhY2ViYWNrKTsKKyAgICBQeUVycl9GZXRjaCgmZXJyb3JfdHlwZSwgJmVycm9yX3ZhbHVlLCAmZXJyb3JfdHJhY2ViYWNrKTsKKyAgICBmaWxlID0gUHlTeXNfR2V0T2JqZWN0KG5hbWUpOworICAgIGlmIChmaWxlID09IE5VTEwgfHwgUHlGaWxlX0FzRmlsZShmaWxlKSA9PSBmcCkKKyAgICAgICAgdmZwcmludGYoZnAsIGZvcm1hdCwgdmEpOworICAgIGVsc2UgeworICAgICAgICBjaGFyIGJ1ZmZlclsxMDAxXTsKKyAgICAgICAgY29uc3QgaW50IHdyaXR0ZW4gPSBQeU9TX3ZzbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwgdmEpOworICAgICAgICBpZiAoUHlGaWxlX1dyaXRlU3RyaW5nKGJ1ZmZlciwgZmlsZSkgIT0gMCkgeworICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgIGZwdXRzKGJ1ZmZlciwgZnApOworICAgICAgICB9CisgICAgICAgIGlmICh3cml0dGVuIDwgMCB8fCAoc2l6ZV90KXdyaXR0ZW4gPj0gc2l6ZW9mKGJ1ZmZlcikpIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnRydW5jYXRlZCA9ICIuLi4gdHJ1bmNhdGVkIjsKKyAgICAgICAgICAgIGlmIChQeUZpbGVfV3JpdGVTdHJpbmcodHJ1bmNhdGVkLCBmaWxlKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgICAgICBmcHV0cyh0cnVuY2F0ZWQsIGZwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBQeUVycl9SZXN0b3JlKGVycm9yX3R5cGUsIGVycm9yX3ZhbHVlLCBlcnJvcl90cmFjZWJhY2spOwogfQogCiB2b2lkCiBQeVN5c19Xcml0ZVN0ZG91dChjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKIHsKLQl2YV9saXN0IHZhOworICAgIHZhX2xpc3QgdmE7CiAKLQl2YV9zdGFydCh2YSwgZm9ybWF0KTsKLQlteXdyaXRlKCJzdGRvdXQiLCBzdGRvdXQsIGZvcm1hdCwgdmEpOwotCXZhX2VuZCh2YSk7CisgICAgdmFfc3RhcnQodmEsIGZvcm1hdCk7CisgICAgbXl3cml0ZSgic3Rkb3V0Iiwgc3Rkb3V0LCBmb3JtYXQsIHZhKTsKKyAgICB2YV9lbmQodmEpOwogfQogCiB2b2lkCiBQeVN5c19Xcml0ZVN0ZGVycihjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKIHsKLQl2YV9saXN0IHZhOworICAgIHZhX2xpc3QgdmE7CiAKLQl2YV9zdGFydCh2YSwgZm9ybWF0KTsKLQlteXdyaXRlKCJzdGRlcnIiLCBzdGRlcnIsIGZvcm1hdCwgdmEpOwotCXZhX2VuZCh2YSk7CisgICAgdmFfc3RhcnQodmEsIGZvcm1hdCk7CisgICAgbXl3cml0ZSgic3RkZXJyIiwgc3RkZXJyLCBmb3JtYXQsIHZhKTsKKyAgICB2YV9lbmQodmEpOwogfQpkaWZmIC0tZ2l0IGEvUHl0aG9uL3RocmVhZC5jIGIvUHl0aG9uL3RocmVhZC5jCmluZGV4IDAzNTgwZjMuLjA5N2U3MmQgMTAwNjQ0Ci0tLSBhL1B5dGhvbi90aHJlYWQuYworKysgYi9QeXRob24vdGhyZWFkLmMKQEAgLTQ2LDcgKzQ2LDcgQEAKICNlbmRpZgogCiAvKiBDaGVjayBpZiB3ZSdyZSBydW5uaW5nIG9uIEhQLVVYIGFuZCBfU0NfVEhSRUFEUyBpcyBkZWZpbmVkLiBJZiBzbywgdGhlbgotICAgZW5vdWdoIG9mIHRoZSBQb3NpeCB0aHJlYWRzIHBhY2thZ2UgaXMgaW1wbGltZW50ZWQgdG8gc3VwcG9ydCBweXRob24gCisgICBlbm91Z2ggb2YgdGhlIFBvc2l4IHRocmVhZHMgcGFja2FnZSBpcyBpbXBsaW1lbnRlZCB0byBzdXBwb3J0IHB5dGhvbgogICAgdGhyZWFkcy4KIAogICAgVGhpcyBpcyB2YWxpZCBmb3IgSFAtVVggMTEuMjMgcnVubmluZyBvbiBhbiBpYTY0IHN5c3RlbS4gSWYgbmVlZGVkLCBhZGQKQEAgLTY0LDggKzY0LDggQEAKIAogI2lmZGVmIFB5X0RFQlVHCiBzdGF0aWMgaW50IHRocmVhZF9kZWJ1ZyA9IDA7Ci0jZGVmaW5lIGRwcmludGYoYXJncykJKHZvaWQpKCh0aHJlYWRfZGVidWcgJiAxKSAmJiBwcmludGYgYXJncykKLSNkZWZpbmUgZDJwcmludGYoYXJncykJKCh0aHJlYWRfZGVidWcgJiA4KSAmJiBwcmludGYgYXJncykKKyNkZWZpbmUgZHByaW50ZihhcmdzKSAgICh2b2lkKSgodGhyZWFkX2RlYnVnICYgMSkgJiYgcHJpbnRmIGFyZ3MpCisjZGVmaW5lIGQycHJpbnRmKGFyZ3MpICAoKHRocmVhZF9kZWJ1ZyAmIDgpICYmIHByaW50ZiBhcmdzKQogI2Vsc2UKICNkZWZpbmUgZHByaW50ZihhcmdzKQogI2RlZmluZSBkMnByaW50ZihhcmdzKQpAQCAtNzksMjAgKzc5LDIwIEBACiBQeVRocmVhZF9pbml0X3RocmVhZCh2b2lkKQogewogI2lmZGVmIFB5X0RFQlVHCi0JY2hhciAqcCA9IFB5X0dFVEVOVigiUFlUSE9OVEhSRUFEREVCVUciKTsKKyAgICBjaGFyICpwID0gUHlfR0VURU5WKCJQWVRIT05USFJFQURERUJVRyIpOwogCi0JaWYgKHApIHsKLQkJaWYgKCpwKQotCQkJdGhyZWFkX2RlYnVnID0gYXRvaShwKTsKLQkJZWxzZQotCQkJdGhyZWFkX2RlYnVnID0gMTsKLQl9CisgICAgaWYgKHApIHsKKyAgICAgICAgaWYgKCpwKQorICAgICAgICAgICAgdGhyZWFkX2RlYnVnID0gYXRvaShwKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdGhyZWFkX2RlYnVnID0gMTsKKyAgICB9CiAjZW5kaWYgLyogUHlfREVCVUcgKi8KLQlpZiAoaW5pdGlhbGl6ZWQpCi0JCXJldHVybjsKLQlpbml0aWFsaXplZCA9IDE7Ci0JZHByaW50ZigoIlB5VGhyZWFkX2luaXRfdGhyZWFkIGNhbGxlZFxuIikpOwotCVB5VGhyZWFkX19pbml0X3RocmVhZCgpOworICAgIGlmIChpbml0aWFsaXplZCkKKyAgICAgICAgcmV0dXJuOworICAgIGluaXRpYWxpemVkID0gMTsKKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfaW5pdF90aHJlYWQgY2FsbGVkXG4iKSk7CisgICAgUHlUaHJlYWRfX2luaXRfdGhyZWFkKCk7CiB9CiAKIC8qIFN1cHBvcnQgZm9yIHJ1bnRpbWUgdGhyZWFkIHN0YWNrIHNpemUgdHVuaW5nLgpAQCAtMTU5LDIxICsxNTksMjEgQEAKIHNpemVfdAogUHlUaHJlYWRfZ2V0X3N0YWNrc2l6ZSh2b2lkKQogewotCXJldHVybiBfcHl0aHJlYWRfc3RhY2tzaXplOworICAgIHJldHVybiBfcHl0aHJlYWRfc3RhY2tzaXplOwogfQogCiAvKiBPbmx5IHBsYXRmb3JtcyBkZWZpbmluZyBhIFRIUkVBRF9TRVRfU1RBQ0tTSVpFKCkgbWFjcm8KICAgIGluIHRocmVhZF88cGxhdGZvcm0+Lmggc3VwcG9ydCBjaGFuZ2luZyB0aGUgc3RhY2sgc2l6ZS4KICAgIFJldHVybiAwIGlmIHN0YWNrIHNpemUgaXMgdmFsaWQsCi0gICAgICAgICAgLTEgaWYgc3RhY2sgc2l6ZSB2YWx1ZSBpcyBpbnZhbGlkLAotICAgICAgICAgIC0yIGlmIHNldHRpbmcgc3RhY2sgc2l6ZSBpcyBub3Qgc3VwcG9ydGVkLiAqLworICAgICAgLTEgaWYgc3RhY2sgc2l6ZSB2YWx1ZSBpcyBpbnZhbGlkLAorICAgICAgLTIgaWYgc2V0dGluZyBzdGFjayBzaXplIGlzIG5vdCBzdXBwb3J0ZWQuICovCiBpbnQKIFB5VGhyZWFkX3NldF9zdGFja3NpemUoc2l6ZV90IHNpemUpCiB7CiAjaWYgZGVmaW5lZChUSFJFQURfU0VUX1NUQUNLU0laRSkKLQlyZXR1cm4gVEhSRUFEX1NFVF9TVEFDS1NJWkUoc2l6ZSk7CisgICAgcmV0dXJuIFRIUkVBRF9TRVRfU1RBQ0tTSVpFKHNpemUpOwogI2Vsc2UKLQlyZXR1cm4gLTI7CisgICAgcmV0dXJuIC0yOwogI2VuZGlmCiB9CiAKQEAgLTIyNSwxNSArMjI1LDE1IEBACiAgKiB0byBlbmZvcmNlIGV4Y2x1c2lvbiBpbnRlcm5hbGx5LgogICovCiBzdHJ1Y3Qga2V5IHsKLQkvKiBOZXh0IHJlY29yZCBpbiB0aGUgbGlzdCwgb3IgTlVMTCBpZiB0aGlzIGlzIHRoZSBsYXN0IHJlY29yZC4gKi8KLQlzdHJ1Y3Qga2V5ICpuZXh0OworICAgIC8qIE5leHQgcmVjb3JkIGluIHRoZSBsaXN0LCBvciBOVUxMIGlmIHRoaXMgaXMgdGhlIGxhc3QgcmVjb3JkLiAqLworICAgIHN0cnVjdCBrZXkgKm5leHQ7CiAKLQkvKiBUaGUgdGhyZWFkIGlkLCBhY2NvcmRpbmcgdG8gUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpLiAqLwotCWxvbmcgaWQ7CisgICAgLyogVGhlIHRocmVhZCBpZCwgYWNjb3JkaW5nIHRvIFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKS4gKi8KKyAgICBsb25nIGlkOwogCi0JLyogVGhlIGtleSBhbmQgaXRzIGFzc29jaWF0ZWQgdmFsdWUuICovCi0JaW50IGtleTsKLQl2b2lkICp2YWx1ZTsKKyAgICAvKiBUaGUga2V5IGFuZCBpdHMgYXNzb2NpYXRlZCB2YWx1ZS4gKi8KKyAgICBpbnQga2V5OworICAgIHZvaWQgKnZhbHVlOwogfTsKIAogc3RhdGljIHN0cnVjdCBrZXkgKmtleWhlYWQgPSBOVUxMOwpAQCAtMjY0LDQxICsyNjQsNDEgQEAKIHN0YXRpYyBzdHJ1Y3Qga2V5ICoKIGZpbmRfa2V5KGludCBrZXksIHZvaWQgKnZhbHVlKQogewotCXN0cnVjdCBrZXkgKnAsICpwcmV2X3A7Ci0JbG9uZyBpZCA9IFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKTsKKyAgICBzdHJ1Y3Qga2V5ICpwLCAqcHJldl9wOworICAgIGxvbmcgaWQgPSBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCk7CiAKLQlpZiAoIWtleW11dGV4KQotCQlyZXR1cm4gTlVMTDsKLQlQeVRocmVhZF9hY3F1aXJlX2xvY2soa2V5bXV0ZXgsIDEpOwotCXByZXZfcCA9IE5VTEw7Ci0JZm9yIChwID0ga2V5aGVhZDsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkgewotCQlpZiAocC0+aWQgPT0gaWQgJiYgcC0+a2V5ID09IGtleSkKLQkJCWdvdG8gRG9uZTsKLQkJLyogU2FuaXR5IGNoZWNrLiAgVGhlc2Ugc3RhdGVzIHNob3VsZCBuZXZlciBoYXBwZW4gYnV0IGlmCi0JCSAqIHRoZXkgZG8gd2UgbXVzdCBhYm9ydC4gIE90aGVyd2lzZSB3ZSdsbCBlbmQgdXAgc3Bpbm5pbmcgaW4KLQkJICogaW4gYSB0aWdodCBsb29wIHdpdGggdGhlIGxvY2sgaGVsZC4gIEEgc2ltaWxhciBjaGVjayBpcyBkb25lCi0JCSAqIGluIHB5c3RhdGUuYyB0c3RhdGVfZGVsZXRlX2NvbW1vbigpLiAgKi8KLQkJaWYgKHAgPT0gcHJldl9wKQotCQkJUHlfRmF0YWxFcnJvcigidGxzIGZpbmRfa2V5OiBzbWFsbCBjaXJjdWxhciBsaXN0KCEpIik7Ci0JCXByZXZfcCA9IHA7Ci0JCWlmIChwLT5uZXh0ID09IGtleWhlYWQpCi0JCQlQeV9GYXRhbEVycm9yKCJ0bHMgZmluZF9rZXk6IGNpcmN1bGFyIGxpc3QoISkiKTsKLQl9Ci0JaWYgKHZhbHVlID09IE5VTEwpIHsKLQkJYXNzZXJ0KHAgPT0gTlVMTCk7Ci0JCWdvdG8gRG9uZTsKLQl9Ci0JcCA9IChzdHJ1Y3Qga2V5ICopbWFsbG9jKHNpemVvZihzdHJ1Y3Qga2V5KSk7Ci0JaWYgKHAgIT0gTlVMTCkgewotCQlwLT5pZCA9IGlkOwotCQlwLT5rZXkgPSBrZXk7Ci0JCXAtPnZhbHVlID0gdmFsdWU7Ci0JCXAtPm5leHQgPSBrZXloZWFkOwotCQlrZXloZWFkID0gcDsKLQl9CisgICAgaWYgKCFrZXltdXRleCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlUaHJlYWRfYWNxdWlyZV9sb2NrKGtleW11dGV4LCAxKTsKKyAgICBwcmV2X3AgPSBOVUxMOworICAgIGZvciAocCA9IGtleWhlYWQ7IHAgIT0gTlVMTDsgcCA9IHAtPm5leHQpIHsKKyAgICAgICAgaWYgKHAtPmlkID09IGlkICYmIHAtPmtleSA9PSBrZXkpCisgICAgICAgICAgICBnb3RvIERvbmU7CisgICAgICAgIC8qIFNhbml0eSBjaGVjay4gIFRoZXNlIHN0YXRlcyBzaG91bGQgbmV2ZXIgaGFwcGVuIGJ1dCBpZgorICAgICAgICAgKiB0aGV5IGRvIHdlIG11c3QgYWJvcnQuICBPdGhlcndpc2Ugd2UnbGwgZW5kIHVwIHNwaW5uaW5nIGluCisgICAgICAgICAqIGluIGEgdGlnaHQgbG9vcCB3aXRoIHRoZSBsb2NrIGhlbGQuICBBIHNpbWlsYXIgY2hlY2sgaXMgZG9uZQorICAgICAgICAgKiBpbiBweXN0YXRlLmMgdHN0YXRlX2RlbGV0ZV9jb21tb24oKS4gICovCisgICAgICAgIGlmIChwID09IHByZXZfcCkKKyAgICAgICAgICAgIFB5X0ZhdGFsRXJyb3IoInRscyBmaW5kX2tleTogc21hbGwgY2lyY3VsYXIgbGlzdCghKSIpOworICAgICAgICBwcmV2X3AgPSBwOworICAgICAgICBpZiAocC0+bmV4dCA9PSBrZXloZWFkKQorICAgICAgICAgICAgUHlfRmF0YWxFcnJvcigidGxzIGZpbmRfa2V5OiBjaXJjdWxhciBsaXN0KCEpIik7CisgICAgfQorICAgIGlmICh2YWx1ZSA9PSBOVUxMKSB7CisgICAgICAgIGFzc2VydChwID09IE5VTEwpOworICAgICAgICBnb3RvIERvbmU7CisgICAgfQorICAgIHAgPSAoc3RydWN0IGtleSAqKW1hbGxvYyhzaXplb2Yoc3RydWN0IGtleSkpOworICAgIGlmIChwICE9IE5VTEwpIHsKKyAgICAgICAgcC0+aWQgPSBpZDsKKyAgICAgICAgcC0+a2V5ID0ga2V5OworICAgICAgICBwLT52YWx1ZSA9IHZhbHVlOworICAgICAgICBwLT5uZXh0ID0ga2V5aGVhZDsKKyAgICAgICAga2V5aGVhZCA9IHA7CisgICAgfQogIERvbmU6Ci0JUHlUaHJlYWRfcmVsZWFzZV9sb2NrKGtleW11dGV4KTsKLQlyZXR1cm4gcDsKKyAgICBQeVRocmVhZF9yZWxlYXNlX2xvY2soa2V5bXV0ZXgpOworICAgIHJldHVybiBwOwogfQogCiAvKiBSZXR1cm4gYSBuZXcga2V5LiAgVGhpcyBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgYW55IG90aGVyIGZ1bmN0aW9ucyBpbgpAQCAtMzA4LDMyICszMDgsMzIgQEAKIGludAogUHlUaHJlYWRfY3JlYXRlX2tleSh2b2lkKQogewotCS8qIEFsbCBwYXJ0cyBvZiB0aGlzIGZ1bmN0aW9uIGFyZSB3cm9uZyBpZiBpdCdzIGNhbGxlZCBieSBtdWx0aXBsZQotCSAqIHRocmVhZHMgc2ltdWx0YW5lb3VzbHkuCi0JICovCi0JaWYgKGtleW11dGV4ID09IE5VTEwpCi0JCWtleW11dGV4ID0gUHlUaHJlYWRfYWxsb2NhdGVfbG9jaygpOwotCXJldHVybiArK25rZXlzOworICAgIC8qIEFsbCBwYXJ0cyBvZiB0aGlzIGZ1bmN0aW9uIGFyZSB3cm9uZyBpZiBpdCdzIGNhbGxlZCBieSBtdWx0aXBsZQorICAgICAqIHRocmVhZHMgc2ltdWx0YW5lb3VzbHkuCisgICAgICovCisgICAgaWYgKGtleW11dGV4ID09IE5VTEwpCisgICAgICAgIGtleW11dGV4ID0gUHlUaHJlYWRfYWxsb2NhdGVfbG9jaygpOworICAgIHJldHVybiArK25rZXlzOwogfQogCiAvKiBGb3JnZXQgdGhlIGFzc29jaWF0aW9ucyBmb3Iga2V5IGFjcm9zcyAqYWxsKiB0aHJlYWRzLiAqLwogdm9pZAogUHlUaHJlYWRfZGVsZXRlX2tleShpbnQga2V5KQogewotCXN0cnVjdCBrZXkgKnAsICoqcTsKKyAgICBzdHJ1Y3Qga2V5ICpwLCAqKnE7CiAKLQlQeVRocmVhZF9hY3F1aXJlX2xvY2soa2V5bXV0ZXgsIDEpOwotCXEgPSAma2V5aGVhZDsKLQl3aGlsZSAoKHAgPSAqcSkgIT0gTlVMTCkgewotCQlpZiAocC0+a2V5ID09IGtleSkgewotCQkJKnEgPSBwLT5uZXh0OwotCQkJZnJlZSgodm9pZCAqKXApOwotCQkJLyogTkIgVGhpcyBkb2VzICpub3QqIGZyZWUgcC0+dmFsdWUhICovCi0JCX0KLQkJZWxzZQotCQkJcSA9ICZwLT5uZXh0OwotCX0KLQlQeVRocmVhZF9yZWxlYXNlX2xvY2soa2V5bXV0ZXgpOworICAgIFB5VGhyZWFkX2FjcXVpcmVfbG9jayhrZXltdXRleCwgMSk7CisgICAgcSA9ICZrZXloZWFkOworICAgIHdoaWxlICgocCA9ICpxKSAhPSBOVUxMKSB7CisgICAgICAgIGlmIChwLT5rZXkgPT0ga2V5KSB7CisgICAgICAgICAgICAqcSA9IHAtPm5leHQ7CisgICAgICAgICAgICBmcmVlKCh2b2lkICopcCk7CisgICAgICAgICAgICAvKiBOQiBUaGlzIGRvZXMgKm5vdCogZnJlZSBwLT52YWx1ZSEgKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBxID0gJnAtPm5leHQ7CisgICAgfQorICAgIFB5VGhyZWFkX3JlbGVhc2VfbG9jayhrZXltdXRleCk7CiB9CiAKIC8qIENvbmZ1c2luZzogIElmIHRoZSBjdXJyZW50IHRocmVhZCBoYXMgYW4gYXNzb2NpYXRpb24gZm9yIGtleSwKQEAgLTM0NSwxNCArMzQ1LDE0IEBACiBpbnQKIFB5VGhyZWFkX3NldF9rZXlfdmFsdWUoaW50IGtleSwgdm9pZCAqdmFsdWUpCiB7Ci0Jc3RydWN0IGtleSAqcDsKKyAgICBzdHJ1Y3Qga2V5ICpwOwogCi0JYXNzZXJ0KHZhbHVlICE9IE5VTEwpOwotCXAgPSBmaW5kX2tleShrZXksIHZhbHVlKTsKLQlpZiAocCA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0JZWxzZQotCQlyZXR1cm4gMDsKKyAgICBhc3NlcnQodmFsdWUgIT0gTlVMTCk7CisgICAgcCA9IGZpbmRfa2V5KGtleSwgdmFsdWUpOworICAgIGlmIChwID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiAwOwogfQogCiAvKiBSZXRyaWV2ZSB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGtleSBpbiB0aGUgY3VycmVudCB0aHJlYWQsIG9yIE5VTEwKQEAgLTM2MSwzNCArMzYxLDM0IEBACiB2b2lkICoKIFB5VGhyZWFkX2dldF9rZXlfdmFsdWUoaW50IGtleSkKIHsKLQlzdHJ1Y3Qga2V5ICpwID0gZmluZF9rZXkoa2V5LCBOVUxMKTsKKyAgICBzdHJ1Y3Qga2V5ICpwID0gZmluZF9rZXkoa2V5LCBOVUxMKTsKIAotCWlmIChwID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWVsc2UKLQkJcmV0dXJuIHAtPnZhbHVlOworICAgIGlmIChwID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIHAtPnZhbHVlOwogfQogCiAvKiBGb3JnZXQgdGhlIGN1cnJlbnQgdGhyZWFkJ3MgYXNzb2NpYXRpb24gZm9yIGtleSwgaWYgYW55LiAqLwogdm9pZAogUHlUaHJlYWRfZGVsZXRlX2tleV92YWx1ZShpbnQga2V5KQogewotCWxvbmcgaWQgPSBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCk7Ci0Jc3RydWN0IGtleSAqcCwgKipxOworICAgIGxvbmcgaWQgPSBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCk7CisgICAgc3RydWN0IGtleSAqcCwgKipxOwogCi0JUHlUaHJlYWRfYWNxdWlyZV9sb2NrKGtleW11dGV4LCAxKTsKLQlxID0gJmtleWhlYWQ7Ci0Jd2hpbGUgKChwID0gKnEpICE9IE5VTEwpIHsKLQkJaWYgKHAtPmtleSA9PSBrZXkgJiYgcC0+aWQgPT0gaWQpIHsKLQkJCSpxID0gcC0+bmV4dDsKLQkJCWZyZWUoKHZvaWQgKilwKTsKLQkJCS8qIE5CIFRoaXMgZG9lcyAqbm90KiBmcmVlIHAtPnZhbHVlISAqLwotCQkJYnJlYWs7Ci0JCX0KLQkJZWxzZQotCQkJcSA9ICZwLT5uZXh0OwotCX0KLQlQeVRocmVhZF9yZWxlYXNlX2xvY2soa2V5bXV0ZXgpOworICAgIFB5VGhyZWFkX2FjcXVpcmVfbG9jayhrZXltdXRleCwgMSk7CisgICAgcSA9ICZrZXloZWFkOworICAgIHdoaWxlICgocCA9ICpxKSAhPSBOVUxMKSB7CisgICAgICAgIGlmIChwLT5rZXkgPT0ga2V5ICYmIHAtPmlkID09IGlkKSB7CisgICAgICAgICAgICAqcSA9IHAtPm5leHQ7CisgICAgICAgICAgICBmcmVlKCh2b2lkICopcCk7CisgICAgICAgICAgICAvKiBOQiBUaGlzIGRvZXMgKm5vdCogZnJlZSBwLT52YWx1ZSEgKi8KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHEgPSAmcC0+bmV4dDsKKyAgICB9CisgICAgUHlUaHJlYWRfcmVsZWFzZV9sb2NrKGtleW11dGV4KTsKIH0KIAogLyogRm9yZ2V0IGV2ZXJ5dGhpbmcgbm90IGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCB0aHJlYWQgaWQuCkBAIC0zOTksMjcgKzM5OSwyNyBAQAogdm9pZAogUHlUaHJlYWRfUmVJbml0VExTKHZvaWQpCiB7Ci0JbG9uZyBpZCA9IFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKTsKLQlzdHJ1Y3Qga2V5ICpwLCAqKnE7CisgICAgbG9uZyBpZCA9IFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKTsKKyAgICBzdHJ1Y3Qga2V5ICpwLCAqKnE7CiAKLQlpZiAoIWtleW11dGV4KQotCQlyZXR1cm47Ci0JCi0JLyogQXMgd2l0aCBpbnRlcnByZXRlcl9sb2NrIGluIFB5RXZhbF9SZUluaXRUaHJlYWRzKCkKLQkgICB3ZSBqdXN0IGNyZWF0ZSBhIG5ldyBsb2NrIHdpdGhvdXQgZnJlZWluZyB0aGUgb2xkIG9uZSAqLwotCWtleW11dGV4ID0gUHlUaHJlYWRfYWxsb2NhdGVfbG9jaygpOworICAgIGlmICgha2V5bXV0ZXgpCisgICAgICAgIHJldHVybjsKIAotCS8qIERlbGV0ZSBhbGwga2V5cyB3aGljaCBkbyBub3QgbWF0Y2ggdGhlIGN1cnJlbnQgdGhyZWFkIGlkICovCi0JcSA9ICZrZXloZWFkOwotCXdoaWxlICgocCA9ICpxKSAhPSBOVUxMKSB7Ci0JCWlmIChwLT5pZCAhPSBpZCkgewotCQkJKnEgPSBwLT5uZXh0OwotCQkJZnJlZSgodm9pZCAqKXApOwotCQkJLyogTkIgVGhpcyBkb2VzICpub3QqIGZyZWUgcC0+dmFsdWUhICovCi0JCX0KLQkJZWxzZQotCQkJcSA9ICZwLT5uZXh0OwotCX0KKyAgICAvKiBBcyB3aXRoIGludGVycHJldGVyX2xvY2sgaW4gUHlFdmFsX1JlSW5pdFRocmVhZHMoKQorICAgICAgIHdlIGp1c3QgY3JlYXRlIGEgbmV3IGxvY2sgd2l0aG91dCBmcmVlaW5nIHRoZSBvbGQgb25lICovCisgICAga2V5bXV0ZXggPSBQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKCk7CisKKyAgICAvKiBEZWxldGUgYWxsIGtleXMgd2hpY2ggZG8gbm90IG1hdGNoIHRoZSBjdXJyZW50IHRocmVhZCBpZCAqLworICAgIHEgPSAma2V5aGVhZDsKKyAgICB3aGlsZSAoKHAgPSAqcSkgIT0gTlVMTCkgeworICAgICAgICBpZiAocC0+aWQgIT0gaWQpIHsKKyAgICAgICAgICAgICpxID0gcC0+bmV4dDsKKyAgICAgICAgICAgIGZyZWUoKHZvaWQgKilwKTsKKyAgICAgICAgICAgIC8qIE5CIFRoaXMgZG9lcyAqbm90KiBmcmVlIHAtPnZhbHVlISAqLworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHEgPSAmcC0+bmV4dDsKKyAgICB9CiB9CiAKICNlbmRpZiAvKiBQeV9IQVZFX05BVElWRV9UTFMgKi8KZGlmZiAtLWdpdCBhL1B5dGhvbi90aHJlYWRfYXRoZW9zLmggYi9QeXRob24vdGhyZWFkX2F0aGVvcy5oCmluZGV4IGM5ZjVlMjMuLmMzOTBiNTcgMTAwNjQ0Ci0tLSBhL1B5dGhvbi90aHJlYWRfYXRoZW9zLmgKKysrIGIvUHl0aG9uL3RocmVhZF9hdGhlb3MuaApAQCAtMTksOCArMTksOCBAQAogCiAvKiBVc2UgYW4gYXRvbWljIGNvdW50ZXIgYW5kIGEgc2VtYXBob3JlIGZvciBtYXhpbXVtIHNwZWVkLiAqLwogdHlwZWRlZiBzdHJ1Y3QgZmFzdG11dGV4IHsKLQlzZW1faWQgc2VtOwotCWF0b21pY190IGNvdW50OworICAgIHNlbV9pZCBzZW07CisgICAgYXRvbWljX3QgY291bnQ7CiB9IGZhc3RtdXRleF90OwogCiAKQEAgLTMzLDQ5ICszMyw0OSBAQAogCiBzdGF0aWMgaW50IGZhc3RtdXRleF9jcmVhdGUoY29uc3QgY2hhciAqbmFtZSwgZmFzdG11dGV4X3QgKiBtdXRleCkKIHsKLQltdXRleC0+Y291bnQgPSAwOwotCW11dGV4LT5zZW0gPSBjcmVhdGVfc2VtYXBob3JlKG5hbWUsIDAsIDApOwotCXJldHVybiAobXV0ZXgtPnNlbSA8IDApID8gLTEgOiAwOworICAgIG11dGV4LT5jb3VudCA9IDA7CisgICAgbXV0ZXgtPnNlbSA9IGNyZWF0ZV9zZW1hcGhvcmUobmFtZSwgMCwgMCk7CisgICAgcmV0dXJuIChtdXRleC0+c2VtIDwgMCkgPyAtMSA6IDA7CiB9CiAKIAogc3RhdGljIGludCBmYXN0bXV0ZXhfZGVzdHJveShmYXN0bXV0ZXhfdCAqIG11dGV4KQogewotCWlmIChmYXN0bXV0ZXhfdGltZWRsb2NrKG11dGV4LCAwKSA9PSAwIHx8IGVycm5vID09IEVXT1VMREJMT0NLKSB7Ci0JCXJldHVybiBkZWxldGVfc2VtYXBob3JlKG11dGV4LT5zZW0pOwotCX0KLQlyZXR1cm4gMDsKKyAgICBpZiAoZmFzdG11dGV4X3RpbWVkbG9jayhtdXRleCwgMCkgPT0gMCB8fCBlcnJubyA9PSBFV09VTERCTE9DSykgeworICAgICAgICByZXR1cm4gZGVsZXRlX3NlbWFwaG9yZShtdXRleC0+c2VtKTsKKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIAogc3RhdGljIGludCBmYXN0bXV0ZXhfbG9jayhmYXN0bXV0ZXhfdCAqIG11dGV4KQogewotCWF0b21pY190IHByZXYgPSBhdG9taWNfYWRkKCZtdXRleC0+Y291bnQsIDEpOwotCWlmIChwcmV2ID4gMCkKLQkJcmV0dXJuIGxvY2tfc2VtYXBob3JlKG11dGV4LT5zZW0pOwotCXJldHVybiAwOworICAgIGF0b21pY190IHByZXYgPSBhdG9taWNfYWRkKCZtdXRleC0+Y291bnQsIDEpOworICAgIGlmIChwcmV2ID4gMCkKKyAgICAgICAgcmV0dXJuIGxvY2tfc2VtYXBob3JlKG11dGV4LT5zZW0pOworICAgIHJldHVybiAwOwogfQogCiAKIHN0YXRpYyBpbnQgZmFzdG11dGV4X3RpbWVkbG9jayhmYXN0bXV0ZXhfdCAqIG11dGV4LCBiaWd0aW1lX3QgdGltZW91dCkKIHsKLQlhdG9taWNfdCBwcmV2ID0gYXRvbWljX2FkZCgmbXV0ZXgtPmNvdW50LCAxKTsKLQlpZiAocHJldiA+IDApCi0JCXJldHVybiBsb2NrX3NlbWFwaG9yZV94KG11dGV4LT5zZW0sIDEsIDAsIHRpbWVvdXQpOwotCXJldHVybiAwOworICAgIGF0b21pY190IHByZXYgPSBhdG9taWNfYWRkKCZtdXRleC0+Y291bnQsIDEpOworICAgIGlmIChwcmV2ID4gMCkKKyAgICAgICAgcmV0dXJuIGxvY2tfc2VtYXBob3JlX3gobXV0ZXgtPnNlbSwgMSwgMCwgdGltZW91dCk7CisgICAgcmV0dXJuIDA7CiB9CiAKIAogc3RhdGljIGludCBmYXN0bXV0ZXhfdW5sb2NrKGZhc3RtdXRleF90ICogbXV0ZXgpCiB7Ci0JYXRvbWljX3QgcHJldiA9IGF0b21pY19hZGQoJm11dGV4LT5jb3VudCwgLTEpOwotCWlmIChwcmV2ID4gMSkKLQkJcmV0dXJuIHVubG9ja19zZW1hcGhvcmUobXV0ZXgtPnNlbSk7Ci0JcmV0dXJuIDA7CisgICAgYXRvbWljX3QgcHJldiA9IGF0b21pY19hZGQoJm11dGV4LT5jb3VudCwgLTEpOworICAgIGlmIChwcmV2ID4gMSkKKyAgICAgICAgcmV0dXJuIHVubG9ja19zZW1hcGhvcmUobXV0ZXgtPnNlbSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIAotI2VuZGlmCQkJCS8qIEZBU1RMT0NLICovCisjZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZBU1RMT0NLICovCiAKIAogLyoKQEAgLTg0LDggKzg0LDggQEAKICAqLwogc3RhdGljIHZvaWQgUHlUaHJlYWRfX2luaXRfdGhyZWFkKHZvaWQpCiB7Ci0JLyogRG8gbm90aGluZy4gKi8KLQlyZXR1cm47CisgICAgLyogRG8gbm90aGluZy4gKi8KKyAgICByZXR1cm47CiB9CiAKIApAQCAtOTgsOTAgKzk4LDkwIEBACiAKIGxvbmcgUHlUaHJlYWRfc3RhcnRfbmV3X3RocmVhZCh2b2lkICgqZnVuYykgKHZvaWQgKiksIHZvaWQgKmFyZykKIHsKLQlzdGF0dXNfdCBzdWNjZXNzID0gLTE7Ci0JdGhyZWFkX2lkIHRpZDsKLQljaGFyIG5hbWVbT1NfTkFNRV9MRU5HVEhdOwotCWF0b21pY190IHRoaXNfdGhyZWFkOworICAgIHN0YXR1c190IHN1Y2Nlc3MgPSAtMTsKKyAgICB0aHJlYWRfaWQgdGlkOworICAgIGNoYXIgbmFtZVtPU19OQU1FX0xFTkdUSF07CisgICAgYXRvbWljX3QgdGhpc190aHJlYWQ7CiAKLQlkcHJpbnRmKCgiUHlUaHJlYWRfc3RhcnRfbmV3X3RocmVhZCBjYWxsZWRcbiIpKTsKKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfc3RhcnRfbmV3X3RocmVhZCBjYWxsZWRcbiIpKTsKIAotCXRoaXNfdGhyZWFkID0gYXRvbWljX2FkZCgmdGhyZWFkX2NvdW50LCAxKTsKLQlQeU9TX3NucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgInB5dGhvbiB0aHJlYWQgKCVkKSIsIHRoaXNfdGhyZWFkKTsKKyAgICB0aGlzX3RocmVhZCA9IGF0b21pY19hZGQoJnRocmVhZF9jb3VudCwgMSk7CisgICAgUHlPU19zbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICJweXRob24gdGhyZWFkICglZCkiLCB0aGlzX3RocmVhZCk7CiAKLQl0aWQgPSBzcGF3bl90aHJlYWQobmFtZSwgZnVuYywgTk9STUFMX1BSSU9SSVRZLCAwLCBhcmcpOwotCWlmICh0aWQgPCAwKSB7Ci0JCWRwcmludGYoKCJQeVRocmVhZF9zdGFydF9uZXdfdGhyZWFkIHNwYXduX3RocmVhZCBmYWlsZWQ6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpKTsKLQl9IGVsc2UgewotCQlzdWNjZXNzID0gcmVzdW1lX3RocmVhZCh0aWQpOwotCQlpZiAoc3VjY2VzcyA8IDApIHsKLQkJCWRwcmludGYoKCJQeVRocmVhZF9zdGFydF9uZXdfdGhyZWFkIHJlc3VtZV90aHJlYWQgZmFpbGVkOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKSk7Ci0JCX0KLQl9CisgICAgdGlkID0gc3Bhd25fdGhyZWFkKG5hbWUsIGZ1bmMsIE5PUk1BTF9QUklPUklUWSwgMCwgYXJnKTsKKyAgICBpZiAodGlkIDwgMCkgeworICAgICAgICBkcHJpbnRmKCgiUHlUaHJlYWRfc3RhcnRfbmV3X3RocmVhZCBzcGF3bl90aHJlYWQgZmFpbGVkOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3VjY2VzcyA9IHJlc3VtZV90aHJlYWQodGlkKTsKKyAgICAgICAgaWYgKHN1Y2Nlc3MgPCAwKSB7CisgICAgICAgICAgICBkcHJpbnRmKCgiUHlUaHJlYWRfc3RhcnRfbmV3X3RocmVhZCByZXN1bWVfdGhyZWFkIGZhaWxlZDogJXNcbiIsIHN0cmVycm9yKGVycm5vKSkpOworICAgICAgICB9CisgICAgfQogCi0JcmV0dXJuIChzdWNjZXNzIDwgMCA/IC0xIDogdGlkKTsKKyAgICByZXR1cm4gKHN1Y2Nlc3MgPCAwID8gLTEgOiB0aWQpOwogfQogCiAKIGxvbmcgUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCh2b2lkKQogewotCXJldHVybiBnZXRfdGhyZWFkX2lkKE5VTEwpOworICAgIHJldHVybiBnZXRfdGhyZWFkX2lkKE5VTEwpOwogfQogCiAKIHN0YXRpYyB2b2lkIGRvX1B5VGhyZWFkX2V4aXRfdGhyZWFkKGludCBub19jbGVhbnVwKQogewotCWRwcmludGYoKCJQeVRocmVhZF9leGl0X3RocmVhZCBjYWxsZWRcbiIpKTsKKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfZXhpdF90aHJlYWQgY2FsbGVkXG4iKSk7CiAKLQkvKiBUaHJlYWQtc2FmZSB3YXkgdG8gcmVhZCBhIHZhcmlhYmxlIHdpdGhvdXQgYSBtdXRleDogKi8KLQlpZiAoYXRvbWljX2FkZCgmdGhyZWFkX2NvdW50LCAwKSA9PSAwKSB7Ci0JCS8qIE5vIHRocmVhZHMgYXJvdW5kLCBzbyBleGl0IG1haW4oKS4gKi8KLQkJaWYgKG5vX2NsZWFudXApCi0JCQlfZXhpdCgwKTsKLQkJZWxzZQotCQkJZXhpdCgwKTsKLQl9IGVsc2UgewotCQkvKiBXZSdyZSBhIHRocmVhZCAqLwotCQlleGl0X3RocmVhZCgwKTsKLQl9CisgICAgLyogVGhyZWFkLXNhZmUgd2F5IHRvIHJlYWQgYSB2YXJpYWJsZSB3aXRob3V0IGEgbXV0ZXg6ICovCisgICAgaWYgKGF0b21pY19hZGQoJnRocmVhZF9jb3VudCwgMCkgPT0gMCkgeworICAgICAgICAvKiBObyB0aHJlYWRzIGFyb3VuZCwgc28gZXhpdCBtYWluKCkuICovCisgICAgICAgIGlmIChub19jbGVhbnVwKQorICAgICAgICAgICAgX2V4aXQoMCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGV4aXQoMCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogV2UncmUgYSB0aHJlYWQgKi8KKyAgICAgICAgZXhpdF90aHJlYWQoMCk7CisgICAgfQogfQogCiAKIHZvaWQgUHlUaHJlYWRfZXhpdF90aHJlYWQodm9pZCkKIHsKLQlkb19QeVRocmVhZF9leGl0X3RocmVhZCgwKTsKKyAgICBkb19QeVRocmVhZF9leGl0X3RocmVhZCgwKTsKIH0KIAogCiB2b2lkIFB5VGhyZWFkX19leGl0X3RocmVhZCh2b2lkKQogewotCWRvX1B5VGhyZWFkX2V4aXRfdGhyZWFkKDEpOworICAgIGRvX1B5VGhyZWFkX2V4aXRfdGhyZWFkKDEpOwogfQogCiAKICNpZm5kZWYgTk9fRVhJVF9QUk9HCiBzdGF0aWMgdm9pZCBkb19QeVRocmVhZF9leGl0X3Byb2coaW50IHN0YXR1cywgaW50IG5vX2NsZWFudXApCiB7Ci0JZHByaW50ZigoIlB5VGhyZWFkX2V4aXRfcHJvZyglZCkgY2FsbGVkXG4iLCBzdGF0dXMpKTsKKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfZXhpdF9wcm9nKCVkKSBjYWxsZWRcbiIsIHN0YXR1cykpOwogCi0JLyogTm8gbmVlZCB0byBkbyBhbnl0aGluZywgdGhlIHRocmVhZHMgZ2V0IHRvcm4gZG93biBpZiBtYWluKClleGl0cy4gKi8KLQlpZiAobm9fY2xlYW51cCkKLQkJX2V4aXQoc3RhdHVzKTsKLQllbHNlCi0JCWV4aXQoc3RhdHVzKTsKKyAgICAvKiBObyBuZWVkIHRvIGRvIGFueXRoaW5nLCB0aGUgdGhyZWFkcyBnZXQgdG9ybiBkb3duIGlmIG1haW4oKWV4aXRzLiAqLworICAgIGlmIChub19jbGVhbnVwKQorICAgICAgICBfZXhpdChzdGF0dXMpOworICAgIGVsc2UKKyAgICAgICAgZXhpdChzdGF0dXMpOwogfQogCiAKIHZvaWQgUHlUaHJlYWRfZXhpdF9wcm9nKGludCBzdGF0dXMpCiB7Ci0JZG9fUHlUaHJlYWRfZXhpdF9wcm9nKHN0YXR1cywgMCk7CisgICAgZG9fUHlUaHJlYWRfZXhpdF9wcm9nKHN0YXR1cywgMCk7CiB9CiAKIAogdm9pZCBQeVRocmVhZF9fZXhpdF9wcm9nKGludCBzdGF0dXMpCiB7Ci0JZG9fUHlUaHJlYWRfZXhpdF9wcm9nKHN0YXR1cywgMSk7CisgICAgZG9fUHlUaHJlYWRfZXhpdF9wcm9nKHN0YXR1cywgMSk7CiB9Ci0jZW5kaWYJCQkJLyogTk9fRVhJVF9QUk9HICovCisjZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5PX0VYSVRfUFJPRyAqLwogCiAKIC8qCkBAIC0xOTQsMTA3ICsxOTQsMTA3IEBACiBQeVRocmVhZF90eXBlX2xvY2sgUHlUaHJlYWRfYWxsb2NhdGVfbG9jayh2b2lkKQogewogI2lmZGVmIEZBU1RMT0NLCi0JZmFzdG11dGV4X3QgKmxvY2s7CisgICAgZmFzdG11dGV4X3QgKmxvY2s7CiAjZWxzZQotCXNlbV9pZCBzZW1hOworICAgIHNlbV9pZCBzZW1hOwogI2VuZGlmCi0JY2hhciBuYW1lW09TX05BTUVfTEVOR1RIXTsKLQlhdG9taWNfdCB0aGlzX2xvY2s7CisgICAgY2hhciBuYW1lW09TX05BTUVfTEVOR1RIXTsKKyAgICBhdG9taWNfdCB0aGlzX2xvY2s7CiAKLQlkcHJpbnRmKCgiUHlUaHJlYWRfYWxsb2NhdGVfbG9jayBjYWxsZWRcbiIpKTsKKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfYWxsb2NhdGVfbG9jayBjYWxsZWRcbiIpKTsKIAogI2lmZGVmIEZBU1RMT0NLCi0JbG9jayA9IChmYXN0bXV0ZXhfdCAqKSBtYWxsb2Moc2l6ZW9mKGZhc3RtdXRleF90KSk7Ci0JaWYgKGxvY2sgPT0gTlVMTCkgewotCQlkcHJpbnRmKCgiUHlUaHJlYWRfYWxsb2NhdGVfbG9jayBmYWlsZWQ6IG91dCBvZiBtZW1vcnlcbiIpKTsKLQkJcmV0dXJuIChQeVRocmVhZF90eXBlX2xvY2spIE5VTEw7Ci0JfQorICAgIGxvY2sgPSAoZmFzdG11dGV4X3QgKikgbWFsbG9jKHNpemVvZihmYXN0bXV0ZXhfdCkpOworICAgIGlmIChsb2NrID09IE5VTEwpIHsKKyAgICAgICAgZHByaW50ZigoIlB5VGhyZWFkX2FsbG9jYXRlX2xvY2sgZmFpbGVkOiBvdXQgb2YgbWVtb3J5XG4iKSk7CisgICAgICAgIHJldHVybiAoUHlUaHJlYWRfdHlwZV9sb2NrKSBOVUxMOworICAgIH0KICNlbmRpZgotCXRoaXNfbG9jayA9IGF0b21pY19hZGQoJmxvY2tfY291bnQsIDEpOwotCVB5T1Nfc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAicHl0aG9uIGxvY2sgKCVkKSIsIHRoaXNfbG9jayk7CisgICAgdGhpc19sb2NrID0gYXRvbWljX2FkZCgmbG9ja19jb3VudCwgMSk7CisgICAgUHlPU19zbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICJweXRob24gbG9jayAoJWQpIiwgdGhpc19sb2NrKTsKIAogI2lmZGVmIEZBU1RMT0NLCi0JaWYgKGZhc3RtdXRleF9jcmVhdGUobmFtZSwgbG9jaykgPCAwKSB7Ci0JCWRwcmludGYoKCJQeVRocmVhZF9hbGxvY2F0ZV9sb2NrIGZhaWxlZDogJXNcbiIsCi0JCQkgc3RyZXJyb3IoZXJybm8pKSk7Ci0JCWZyZWUobG9jayk7Ci0JCWxvY2sgPSBOVUxMOwotCX0KLQlkcHJpbnRmKCgiUHlUaHJlYWRfYWxsb2NhdGVfbG9jaygpLT4gJXBcbiIsIGxvY2spKTsKLQlyZXR1cm4gKFB5VGhyZWFkX3R5cGVfbG9jaykgbG9jazsKKyAgICBpZiAoZmFzdG11dGV4X2NyZWF0ZShuYW1lLCBsb2NrKSA8IDApIHsKKyAgICAgICAgZHByaW50ZigoIlB5VGhyZWFkX2FsbG9jYXRlX2xvY2sgZmFpbGVkOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pKSk7CisgICAgICAgIGZyZWUobG9jayk7CisgICAgICAgIGxvY2sgPSBOVUxMOworICAgIH0KKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfYWxsb2NhdGVfbG9jaygpLT4gJXBcbiIsIGxvY2spKTsKKyAgICByZXR1cm4gKFB5VGhyZWFkX3R5cGVfbG9jaykgbG9jazsKICNlbHNlCi0Jc2VtYSA9IGNyZWF0ZV9zZW1hcGhvcmUobmFtZSwgMSwgMCk7Ci0JaWYgKHNlbWEgPCAwKSB7Ci0JCWRwcmludGYoKCJQeVRocmVhZF9hbGxvY2F0ZV9sb2NrIGZhaWxlZDogJXNcbiIsCi0JCQkgc3RyZXJyb3IoZXJybm8pKSk7Ci0JCXNlbWEgPSAwOwotCX0KLQlkcHJpbnRmKCgiUHlUaHJlYWRfYWxsb2NhdGVfbG9jaygpLT4gJXBcbiIsIHNlbWEpKTsKLQlyZXR1cm4gKFB5VGhyZWFkX3R5cGVfbG9jaykgc2VtYTsKKyAgICBzZW1hID0gY3JlYXRlX3NlbWFwaG9yZShuYW1lLCAxLCAwKTsKKyAgICBpZiAoc2VtYSA8IDApIHsKKyAgICAgICAgZHByaW50ZigoIlB5VGhyZWFkX2FsbG9jYXRlX2xvY2sgZmFpbGVkOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pKSk7CisgICAgICAgIHNlbWEgPSAwOworICAgIH0KKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfYWxsb2NhdGVfbG9jaygpLT4gJXBcbiIsIHNlbWEpKTsKKyAgICByZXR1cm4gKFB5VGhyZWFkX3R5cGVfbG9jaykgc2VtYTsKICNlbmRpZgogfQogCiAKIHZvaWQgUHlUaHJlYWRfZnJlZV9sb2NrKFB5VGhyZWFkX3R5cGVfbG9jayBsb2NrKQogewotCWRwcmludGYoKCJQeVRocmVhZF9mcmVlX2xvY2soJXApIGNhbGxlZFxuIiwgbG9jaykpOworICAgIGRwcmludGYoKCJQeVRocmVhZF9mcmVlX2xvY2soJXApIGNhbGxlZFxuIiwgbG9jaykpOwogCiAjaWZkZWYgRkFTVExPQ0sKLQlpZiAoZmFzdG11dGV4X2Rlc3Ryb3koKGZhc3RtdXRleF90ICopIGxvY2spIDwgMCkgewotCQlkcHJpbnRmKCgiUHlUaHJlYWRfZnJlZV9sb2NrKCVwKSBmYWlsZWQ6ICVzXG4iLCBsb2NrLAotCQkJIHN0cmVycm9yKGVycm5vKSkpOwotCX0KLQlmcmVlKGxvY2spOworICAgIGlmIChmYXN0bXV0ZXhfZGVzdHJveSgoZmFzdG11dGV4X3QgKikgbG9jaykgPCAwKSB7CisgICAgICAgIGRwcmludGYoKCJQeVRocmVhZF9mcmVlX2xvY2soJXApIGZhaWxlZDogJXNcbiIsIGxvY2ssCisgICAgICAgICAgICAgICAgIHN0cmVycm9yKGVycm5vKSkpOworICAgIH0KKyAgICBmcmVlKGxvY2spOwogI2Vsc2UKLQlpZiAoZGVsZXRlX3NlbWFwaG9yZSgoc2VtX2lkKSBsb2NrKSA8IDApIHsKLQkJZHByaW50ZigoIlB5VGhyZWFkX2ZyZWVfbG9jayglcCkgZmFpbGVkOiAlc1xuIiwgbG9jaywKLQkJCSBzdHJlcnJvcihlcnJubykpKTsKLQl9CisgICAgaWYgKGRlbGV0ZV9zZW1hcGhvcmUoKHNlbV9pZCkgbG9jaykgPCAwKSB7CisgICAgICAgIGRwcmludGYoKCJQeVRocmVhZF9mcmVlX2xvY2soJXApIGZhaWxlZDogJXNcbiIsIGxvY2ssCisgICAgICAgICAgICAgICAgIHN0cmVycm9yKGVycm5vKSkpOworICAgIH0KICNlbmRpZgogfQogCiAKIGludCBQeVRocmVhZF9hY3F1aXJlX2xvY2soUHlUaHJlYWRfdHlwZV9sb2NrIGxvY2ssIGludCB3YWl0ZmxhZykKIHsKLQlpbnQgcmV0dmFsOworICAgIGludCByZXR2YWw7CiAKLQlkcHJpbnRmKCgiUHlUaHJlYWRfYWNxdWlyZV9sb2NrKCVwLCAlZCkgY2FsbGVkXG4iLCBsb2NrLAotCQkgd2FpdGZsYWcpKTsKKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfYWNxdWlyZV9sb2NrKCVwLCAlZCkgY2FsbGVkXG4iLCBsb2NrLAorICAgICAgICAgICAgIHdhaXRmbGFnKSk7CiAKICNpZmRlZiBGQVNUTE9DSwotCWlmICh3YWl0ZmxhZykKLQkJcmV0dmFsID0gZmFzdG11dGV4X2xvY2soKGZhc3RtdXRleF90ICopIGxvY2spOwotCWVsc2UKLQkJcmV0dmFsID0gZmFzdG11dGV4X3RpbWVkbG9jaygoZmFzdG11dGV4X3QgKikgbG9jaywgMCk7CisgICAgaWYgKHdhaXRmbGFnKQorICAgICAgICByZXR2YWwgPSBmYXN0bXV0ZXhfbG9jaygoZmFzdG11dGV4X3QgKikgbG9jayk7CisgICAgZWxzZQorICAgICAgICByZXR2YWwgPSBmYXN0bXV0ZXhfdGltZWRsb2NrKChmYXN0bXV0ZXhfdCAqKSBsb2NrLCAwKTsKICNlbHNlCi0JaWYgKHdhaXRmbGFnKQotCQlyZXR2YWwgPSBsb2NrX3NlbWFwaG9yZSgoc2VtX2lkKSBsb2NrKTsKLQllbHNlCi0JCXJldHZhbCA9IGxvY2tfc2VtYXBob3JlX3goKHNlbV9pZCkgbG9jaywgMSwgMCwgMCk7CisgICAgaWYgKHdhaXRmbGFnKQorICAgICAgICByZXR2YWwgPSBsb2NrX3NlbWFwaG9yZSgoc2VtX2lkKSBsb2NrKTsKKyAgICBlbHNlCisgICAgICAgIHJldHZhbCA9IGxvY2tfc2VtYXBob3JlX3goKHNlbV9pZCkgbG9jaywgMSwgMCwgMCk7CiAjZW5kaWYKLQlpZiAocmV0dmFsIDwgMCkgewotCQlkcHJpbnRmKCgiUHlUaHJlYWRfYWNxdWlyZV9sb2NrKCVwLCAlZCkgZmFpbGVkOiAlc1xuIiwKLQkJCSBsb2NrLCB3YWl0ZmxhZywgc3RyZXJyb3IoZXJybm8pKSk7Ci0JfQotCWRwcmludGYoKCJQeVRocmVhZF9hY3F1aXJlX2xvY2soJXAsICVkKS0+ICVkXG4iLCBsb2NrLCB3YWl0ZmxhZywKLQkJIHJldHZhbCkpOwotCXJldHVybiByZXR2YWwgPCAwID8gMCA6IDE7CisgICAgaWYgKHJldHZhbCA8IDApIHsKKyAgICAgICAgZHByaW50ZigoIlB5VGhyZWFkX2FjcXVpcmVfbG9jayglcCwgJWQpIGZhaWxlZDogJXNcbiIsCisgICAgICAgICAgICAgICAgIGxvY2ssIHdhaXRmbGFnLCBzdHJlcnJvcihlcnJubykpKTsKKyAgICB9CisgICAgZHByaW50ZigoIlB5VGhyZWFkX2FjcXVpcmVfbG9jayglcCwgJWQpLT4gJWRcbiIsIGxvY2ssIHdhaXRmbGFnLAorICAgICAgICAgICAgIHJldHZhbCkpOworICAgIHJldHVybiByZXR2YWwgPCAwID8gMCA6IDE7CiB9CiAKIAogdm9pZCBQeVRocmVhZF9yZWxlYXNlX2xvY2soUHlUaHJlYWRfdHlwZV9sb2NrIGxvY2spCiB7Ci0JZHByaW50ZigoIlB5VGhyZWFkX3JlbGVhc2VfbG9jayglcCkgY2FsbGVkXG4iLCBsb2NrKSk7CisgICAgZHByaW50ZigoIlB5VGhyZWFkX3JlbGVhc2VfbG9jayglcCkgY2FsbGVkXG4iLCBsb2NrKSk7CiAKICNpZmRlZiBGQVNUTE9DSwotCWlmIChmYXN0bXV0ZXhfdW5sb2NrKChmYXN0bXV0ZXhfdCAqKSBsb2NrKSA8IDApIHsKLQkJZHByaW50ZigoIlB5VGhyZWFkX3JlbGVhc2VfbG9jayglcCkgZmFpbGVkOiAlc1xuIiwgbG9jaywKLQkJCSBzdHJlcnJvcihlcnJubykpKTsKLQl9CisgICAgaWYgKGZhc3RtdXRleF91bmxvY2soKGZhc3RtdXRleF90ICopIGxvY2spIDwgMCkgeworICAgICAgICBkcHJpbnRmKCgiUHlUaHJlYWRfcmVsZWFzZV9sb2NrKCVwKSBmYWlsZWQ6ICVzXG4iLCBsb2NrLAorICAgICAgICAgICAgICAgICBzdHJlcnJvcihlcnJubykpKTsKKyAgICB9CiAjZWxzZQotCWlmICh1bmxvY2tfc2VtYXBob3JlKChzZW1faWQpIGxvY2spIDwgMCkgewotCQlkcHJpbnRmKCgiUHlUaHJlYWRfcmVsZWFzZV9sb2NrKCVwKSBmYWlsZWQ6ICVzXG4iLCBsb2NrLAotCQkJIHN0cmVycm9yKGVycm5vKSkpOwotCX0KKyAgICBpZiAodW5sb2NrX3NlbWFwaG9yZSgoc2VtX2lkKSBsb2NrKSA8IDApIHsKKyAgICAgICAgZHByaW50ZigoIlB5VGhyZWFkX3JlbGVhc2VfbG9jayglcCkgZmFpbGVkOiAlc1xuIiwgbG9jaywKKyAgICAgICAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pKSk7CisgICAgfQogI2VuZGlmCiB9CmRpZmYgLS1naXQgYS9QeXRob24vdGhyZWFkX2Jlb3MuaCBiL1B5dGhvbi90aHJlYWRfYmVvcy5oCmluZGV4IDgyZjk5ZGUuLmVkZTQ0ZGYgMTAwNjQ0Ci0tLSBhL1B5dGhvbi90aHJlYWRfYmVvcy5oCisrKyBiL1B5dGhvbi90aHJlYWRfYmVvcy5oCkBAIC03LDggKzcsOCBAQAogICogaW4gdGhlIEJlIERldmVsb3BlcidzIE5ld3NsZXR0ZXIsIElzc3VlICMyNiAoaHR0cDovL3d3dy5iZS5jb20vKS4KICAqLwogdHlwZWRlZiBzdHJ1Y3QgYmVuYXBob3JlIHsKLQlzZW1faWQgX3NlbTsKLQlpbnQzMiAgX2F0b207CisgICAgc2VtX2lkIF9zZW07CisgICAgaW50MzIgIF9hdG9tOwogfSBiZW5hcGhvcmVfdDsKIAogc3RhdGljIHN0YXR1c190IGJlbmFwaG9yZV9jcmVhdGUoIGNvbnN0IGNoYXIgKm5hbWUsIGJlbmFwaG9yZV90ICpiZW4gKTsKQEAgLTE5LDc5ICsxOSw3OSBAQAogCiBzdGF0aWMgc3RhdHVzX3QgYmVuYXBob3JlX2NyZWF0ZSggY29uc3QgY2hhciAqbmFtZSwgYmVuYXBob3JlX3QgKmJlbiApCiB7Ci0JaWYoIGJlbiAhPSBOVUxMICkgewotCQliZW4tPl9hdG9tID0gMDsKLQkJYmVuLT5fc2VtID0gY3JlYXRlX3NlbSggMCwgbmFtZSApOwotCQkKLQkJaWYoIGJlbi0+X3NlbSA8IEJfTk9fRVJST1IgKSB7Ci0JCQlyZXR1cm4gQl9CQURfU0VNX0lEOwotCQl9Ci0JfSBlbHNlIHsKLQkJcmV0dXJuIEVGQVVMVDsKLQl9Ci0JCi0JcmV0dXJuIEVPSzsKKyAgICBpZiggYmVuICE9IE5VTEwgKSB7CisgICAgICAgIGJlbi0+X2F0b20gPSAwOworICAgICAgICBiZW4tPl9zZW0gPSBjcmVhdGVfc2VtKCAwLCBuYW1lICk7CisKKyAgICAgICAgaWYoIGJlbi0+X3NlbSA8IEJfTk9fRVJST1IgKSB7CisgICAgICAgICAgICByZXR1cm4gQl9CQURfU0VNX0lEOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIEVGQVVMVDsKKyAgICB9CisKKyAgICByZXR1cm4gRU9LOwogfQogCiBzdGF0aWMgc3RhdHVzX3QgYmVuYXBob3JlX2Rlc3Ryb3koIGJlbmFwaG9yZV90ICpiZW4gKQogewotCWlmKCBiZW4tPl9zZW0gPj0gQl9OT19FUlJPUiApIHsKLQkJc3RhdHVzX3QgcmV0dmFsID0gYmVuYXBob3JlX3RpbWVkbG9jayggYmVuLCAwICk7Ci0JCQotCQlpZiggcmV0dmFsID09IEVPSyB8fCByZXR2YWwgPT0gRVdPVUxEQkxPQ0sgKSB7Ci0JCQlzdGF0dXNfdCBkZWxfcmV0dmFsID0gZGVsZXRlX3NlbSggYmVuLT5fc2VtICk7Ci0JCQkKLQkJCXJldHVybiBkZWxfcmV0dmFsOwotCQl9Ci0JfQorICAgIGlmKCBiZW4tPl9zZW0gPj0gQl9OT19FUlJPUiApIHsKKyAgICAgICAgc3RhdHVzX3QgcmV0dmFsID0gYmVuYXBob3JlX3RpbWVkbG9jayggYmVuLCAwICk7CiAKLQlyZXR1cm4gQl9CQURfU0VNX0lEOworICAgICAgICBpZiggcmV0dmFsID09IEVPSyB8fCByZXR2YWwgPT0gRVdPVUxEQkxPQ0sgKSB7CisgICAgICAgICAgICBzdGF0dXNfdCBkZWxfcmV0dmFsID0gZGVsZXRlX3NlbSggYmVuLT5fc2VtICk7CisKKyAgICAgICAgICAgIHJldHVybiBkZWxfcmV0dmFsOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJfQkFEX1NFTV9JRDsKIH0KIAogc3RhdGljIHN0YXR1c190IGJlbmFwaG9yZV9sb2NrKCBiZW5hcGhvcmVfdCAqYmVuICkKIHsKLQlpbnQzMiBwcmV2ID0gYXRvbWljX2FkZCggJihiZW4tPl9hdG9tKSwgMSApOwotCQotCWlmKCBwcmV2ID4gMCApIHsKLQkJcmV0dXJuIGFjcXVpcmVfc2VtKCBiZW4tPl9zZW0gKTsKLQl9Ci0JCi0JcmV0dXJuIEVPSzsKKyAgICBpbnQzMiBwcmV2ID0gYXRvbWljX2FkZCggJihiZW4tPl9hdG9tKSwgMSApOworCisgICAgaWYoIHByZXYgPiAwICkgeworICAgICAgICByZXR1cm4gYWNxdWlyZV9zZW0oIGJlbi0+X3NlbSApOworICAgIH0KKworICAgIHJldHVybiBFT0s7CiB9CiAKIHN0YXRpYyBzdGF0dXNfdCBiZW5hcGhvcmVfdGltZWRsb2NrKCBiZW5hcGhvcmVfdCAqYmVuLCBiaWd0aW1lX3QgbWljcm9zICkKIHsKLQlpbnQzMiBwcmV2ID0gYXRvbWljX2FkZCggJihiZW4tPl9hdG9tKSwgMSApOwotCQotCWlmKCBwcmV2ID4gMCApIHsKLQkJc3RhdHVzX3QgcmV0dmFsID0gYWNxdWlyZV9zZW1fZXRjKCBiZW4tPl9zZW0sIDEsIEJfVElNRU9VVCwgbWljcm9zICk7Ci0JCQotCQlzd2l0Y2goIHJldHZhbCApIHsKLQkJY2FzZSBCX1dPVUxEX0JMT0NLOgkvKiBGYWxsIHRocm91Z2guLi4gKi8KLQkJY2FzZSBCX1RJTUVEX09VVDoKLQkJCXJldHVybiBFV09VTERCTE9DSzsKLQkJCWJyZWFrOwotCQljYXNlIEJfT0s6Ci0JCQlyZXR1cm4gRU9LOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gcmV0dmFsOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JCi0JcmV0dXJuIEVPSzsKKyAgICBpbnQzMiBwcmV2ID0gYXRvbWljX2FkZCggJihiZW4tPl9hdG9tKSwgMSApOworCisgICAgaWYoIHByZXYgPiAwICkgeworICAgICAgICBzdGF0dXNfdCByZXR2YWwgPSBhY3F1aXJlX3NlbV9ldGMoIGJlbi0+X3NlbSwgMSwgQl9USU1FT1VULCBtaWNyb3MgKTsKKworICAgICAgICBzd2l0Y2goIHJldHZhbCApIHsKKyAgICAgICAgY2FzZSBCX1dPVUxEX0JMT0NLOiAgICAgICAgICAgICAvKiBGYWxsIHRocm91Z2guLi4gKi8KKyAgICAgICAgY2FzZSBCX1RJTUVEX09VVDoKKyAgICAgICAgICAgIHJldHVybiBFV09VTERCTE9DSzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJfT0s6CisgICAgICAgICAgICByZXR1cm4gRU9LOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gcmV0dmFsOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gRU9LOwogfQogCiBzdGF0aWMgc3RhdHVzX3QgYmVuYXBob3JlX3VubG9jayggYmVuYXBob3JlX3QgKmJlbiApCiB7Ci0JaW50MzIgcHJldiA9IGF0b21pY19hZGQoICYoYmVuLT5fYXRvbSksIC0xICk7Ci0JCi0JaWYoIHByZXYgPiAxICkgewotCQlyZXR1cm4gcmVsZWFzZV9zZW0oIGJlbi0+X3NlbSApOwotCX0KLQkKLQlyZXR1cm4gRU9LOworICAgIGludDMyIHByZXYgPSBhdG9taWNfYWRkKCAmKGJlbi0+X2F0b20pLCAtMSApOworCisgICAgaWYoIHByZXYgPiAxICkgeworICAgICAgICByZXR1cm4gcmVsZWFzZV9zZW0oIGJlbi0+X3NlbSApOworICAgIH0KKworICAgIHJldHVybiBFT0s7CiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTk5LDggKzk5LDggQEAKICAqLwogc3RhdGljIHZvaWQgUHlUaHJlYWRfX2luaXRfdGhyZWFkKCB2b2lkICkKIHsKLQkvKiBEbyBub3RoaW5nLiAqLwotCXJldHVybjsKKyAgICAvKiBEbyBub3RoaW5nLiAqLworICAgIHJldHVybjsKIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTE0LDkwICsxMTQsOTAgQEAKIAogbG9uZyBQeVRocmVhZF9zdGFydF9uZXdfdGhyZWFkKCB2b2lkICgqZnVuYykodm9pZCAqKSwgdm9pZCAqYXJnICkKIHsKLQlzdGF0dXNfdCBzdWNjZXNzID0gMDsKLQl0aHJlYWRfaWQgdGlkOwotCWNoYXIgbmFtZVtCX09TX05BTUVfTEVOR1RIXTsKLQlpbnQzMiB0aGlzX3RocmVhZDsKKyAgICBzdGF0dXNfdCBzdWNjZXNzID0gMDsKKyAgICB0aHJlYWRfaWQgdGlkOworICAgIGNoYXIgbmFtZVtCX09TX05BTUVfTEVOR1RIXTsKKyAgICBpbnQzMiB0aGlzX3RocmVhZDsKIAotCWRwcmludGYoKCJQeVRocmVhZF9zdGFydF9uZXdfdGhyZWFkIGNhbGxlZFxuIikpOworICAgIGRwcmludGYoKCJQeVRocmVhZF9zdGFydF9uZXdfdGhyZWFkIGNhbGxlZFxuIikpOwogCi0JLyogV2UgYXJlIHNvIHZlcnkgdGhyZWFkLXNhZmUuLi4gKi8KLQl0aGlzX3RocmVhZCA9IGF0b21pY19hZGQoICZ0aHJlYWRfY291bnQsIDEgKTsKLQlQeU9TX3NucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwKLQkJICAgICAgInB5dGhvbiB0aHJlYWQgKCVkKSIsIHRoaXNfdGhyZWFkICk7CisgICAgLyogV2UgYXJlIHNvIHZlcnkgdGhyZWFkLXNhZmUuLi4gKi8KKyAgICB0aGlzX3RocmVhZCA9IGF0b21pY19hZGQoICZ0aHJlYWRfY291bnQsIDEgKTsKKyAgICBQeU9TX3NucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwKKyAgICAgICAgICAgICAgICAgICJweXRob24gdGhyZWFkICglZCkiLCB0aGlzX3RocmVhZCApOwogCi0JdGlkID0gc3Bhd25fdGhyZWFkKCAodGhyZWFkX2Z1bmMpZnVuYywgbmFtZSwKLQkgICAgICAgICAgICAgICAgICAgIEJfTk9STUFMX1BSSU9SSVRZLCBhcmcgKTsKLQlpZiggdGlkID4gQl9OT19FUlJPUiApIHsKLQkJc3VjY2VzcyA9IHJlc3VtZV90aHJlYWQoIHRpZCApOwotCX0KKyAgICB0aWQgPSBzcGF3bl90aHJlYWQoICh0aHJlYWRfZnVuYylmdW5jLCBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgQl9OT1JNQUxfUFJJT1JJVFksIGFyZyApOworICAgIGlmKCB0aWQgPiBCX05PX0VSUk9SICkgeworICAgICAgICBzdWNjZXNzID0gcmVzdW1lX3RocmVhZCggdGlkICk7CisgICAgfQogCi0JcmV0dXJuICggc3VjY2VzcyA9PSBCX05PX0VSUk9SID8gdGlkIDogLTEgKTsKKyAgICByZXR1cm4gKCBzdWNjZXNzID09IEJfTk9fRVJST1IgPyB0aWQgOiAtMSApOwogfQogCiBsb25nIFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoIHZvaWQgKQogewotCS8qIFByZXN1bWVkIHRvIHJldHVybiB0aGUgY3VycmVudCB0aHJlYWQncyBJRC4uLiAqLwotCXRocmVhZF9pZCB0aWQ7Ci0JdGlkID0gZmluZF90aHJlYWQoIE5VTEwgKTsKLQkKLQlyZXR1cm4gKCB0aWQgIT0gQl9OQU1FX05PVF9GT1VORCA/IHRpZCA6IC0xICk7CisgICAgLyogUHJlc3VtZWQgdG8gcmV0dXJuIHRoZSBjdXJyZW50IHRocmVhZCdzIElELi4uICovCisgICAgdGhyZWFkX2lkIHRpZDsKKyAgICB0aWQgPSBmaW5kX3RocmVhZCggTlVMTCApOworCisgICAgcmV0dXJuICggdGlkICE9IEJfTkFNRV9OT1RfRk9VTkQgPyB0aWQgOiAtMSApOwogfQogCiBzdGF0aWMgdm9pZCBkb19QeVRocmVhZF9leGl0X3RocmVhZCggaW50IG5vX2NsZWFudXAgKQogewotCWludDMyIHRocmVhZHM7CisgICAgaW50MzIgdGhyZWFkczsKIAotCWRwcmludGYoKCJQeVRocmVhZF9leGl0X3RocmVhZCBjYWxsZWRcbiIpKTsKKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfZXhpdF90aHJlYWQgY2FsbGVkXG4iKSk7CiAKLQkvKiBUaHJlYWQtc2FmZSB3YXkgdG8gcmVhZCBhIHZhcmlhYmxlIHdpdGhvdXQgYSBtdXRleDogKi8KLQl0aHJlYWRzID0gYXRvbWljX2FkZCggJnRocmVhZF9jb3VudCwgMCApOworICAgIC8qIFRocmVhZC1zYWZlIHdheSB0byByZWFkIGEgdmFyaWFibGUgd2l0aG91dCBhIG11dGV4OiAqLworICAgIHRocmVhZHMgPSBhdG9taWNfYWRkKCAmdGhyZWFkX2NvdW50LCAwICk7CiAKLQlpZiggdGhyZWFkcyA9PSAwICkgewotCQkvKiBObyB0aHJlYWRzIGFyb3VuZCwgc28gZXhpdCBtYWluKCkuICovCi0JCWlmKCBub19jbGVhbnVwICkgewotCQkJX2V4aXQoMCk7Ci0JCX0gZWxzZSB7Ci0JCQlleGl0KDApOwotCQl9Ci0JfSBlbHNlIHsKLQkJLyogT2gsIHdlJ3JlIGEgdGhyZWFkLCBsZXQncyB0cnkgdG8gZXhpdCBncmFjZWZ1bGx5Li4uICovCi0JCWV4aXRfdGhyZWFkKCBCX05PX0VSUk9SICk7Ci0JfQorICAgIGlmKCB0aHJlYWRzID09IDAgKSB7CisgICAgICAgIC8qIE5vIHRocmVhZHMgYXJvdW5kLCBzbyBleGl0IG1haW4oKS4gKi8KKyAgICAgICAgaWYoIG5vX2NsZWFudXAgKSB7CisgICAgICAgICAgICBfZXhpdCgwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGV4aXQoMCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvKiBPaCwgd2UncmUgYSB0aHJlYWQsIGxldCdzIHRyeSB0byBleGl0IGdyYWNlZnVsbHkuLi4gKi8KKyAgICAgICAgZXhpdF90aHJlYWQoIEJfTk9fRVJST1IgKTsKKyAgICB9CiB9CiAKIHZvaWQgUHlUaHJlYWRfZXhpdF90aHJlYWQoIHZvaWQgKQogewotCWRvX1B5VGhyZWFkX2V4aXRfdGhyZWFkKDApOworICAgIGRvX1B5VGhyZWFkX2V4aXRfdGhyZWFkKDApOwogfQogCiB2b2lkIFB5VGhyZWFkX19leGl0X3RocmVhZCggdm9pZCApCiB7Ci0JZG9fUHlUaHJlYWRfZXhpdF90aHJlYWQoMSk7CisgICAgZG9fUHlUaHJlYWRfZXhpdF90aHJlYWQoMSk7CiB9CiAKICNpZm5kZWYgTk9fRVhJVF9QUk9HCiBzdGF0aWMgdm9pZCBkb19QeVRocmVhZF9leGl0X3Byb2coIGludCBzdGF0dXMsIGludCBub19jbGVhbnVwICkKIHsKLQlkcHJpbnRmKCgiUHlUaHJlYWRfZXhpdF9wcm9nKCVkKSBjYWxsZWRcbiIsIHN0YXR1cykpOworICAgIGRwcmludGYoKCJQeVRocmVhZF9leGl0X3Byb2coJWQpIGNhbGxlZFxuIiwgc3RhdHVzKSk7CiAKLQkvKiBObyBuZWVkIHRvIGRvIGFueXRoaW5nLCB0aGUgdGhyZWFkcyBnZXQgdG9ybiBkb3duIGlmIG1haW4oKSBleGl0cy4gKi8KKyAgICAvKiBObyBuZWVkIHRvIGRvIGFueXRoaW5nLCB0aGUgdGhyZWFkcyBnZXQgdG9ybiBkb3duIGlmIG1haW4oKSBleGl0cy4gKi8KIAotCWlmIChub19jbGVhbnVwKSB7Ci0JCV9leGl0KHN0YXR1cyk7Ci0JfSBlbHNlIHsKLQkJZXhpdChzdGF0dXMpOwotCX0KKyAgICBpZiAobm9fY2xlYW51cCkgeworICAgICAgICBfZXhpdChzdGF0dXMpOworICAgIH0gZWxzZSB7CisgICAgICAgIGV4aXQoc3RhdHVzKTsKKyAgICB9CiB9CiAKIHZvaWQgUHlUaHJlYWRfZXhpdF9wcm9nKCBpbnQgc3RhdHVzICkKIHsKLQlkb19QeVRocmVhZF9leGl0X3Byb2coc3RhdHVzLCAwKTsKKyAgICBkb19QeVRocmVhZF9leGl0X3Byb2coc3RhdHVzLCAwKTsKIH0KIAogdm9pZCBQeVRocmVhZF9fZXhpdF9wcm9nKCBpbnQgc3RhdHVzICkKIHsKLQlkb19QeVRocmVhZF9leGl0X3Byb2coc3RhdHVzLCAxKTsKKyAgICBkb19QeVRocmVhZF9leGl0X3Byb2coc3RhdHVzLCAxKTsKIH0KICNlbmRpZiAvKiBOT19FWElUX1BST0cgKi8KIApAQCAtMjA5LDc5ICsyMDksNzkgQEAKIAogUHlUaHJlYWRfdHlwZV9sb2NrIFB5VGhyZWFkX2FsbG9jYXRlX2xvY2soIHZvaWQgKQogewotCWJlbmFwaG9yZV90ICpsb2NrOwotCXN0YXR1c190IHJldHZhbDsKLQljaGFyIG5hbWVbQl9PU19OQU1FX0xFTkdUSF07Ci0JaW50MzIgdGhpc19sb2NrOwotCQotCWRwcmludGYoKCJQeVRocmVhZF9hbGxvY2F0ZV9sb2NrIGNhbGxlZFxuIikpOworICAgIGJlbmFwaG9yZV90ICpsb2NrOworICAgIHN0YXR1c190IHJldHZhbDsKKyAgICBjaGFyIG5hbWVbQl9PU19OQU1FX0xFTkdUSF07CisgICAgaW50MzIgdGhpc19sb2NrOwogCi0JbG9jayA9IChiZW5hcGhvcmVfdCAqKW1hbGxvYyggc2l6ZW9mKCBiZW5hcGhvcmVfdCApICk7Ci0JaWYoIGxvY2sgPT0gTlVMTCApIHsKLQkJLyogVE9ETzogdGhhdCdzIGJhZCwgcmFpc2UgTWVtb3J5RXJyb3IgKi8KLQkJcmV0dXJuIChQeVRocmVhZF90eXBlX2xvY2spTlVMTDsKLQl9CisgICAgZHByaW50ZigoIlB5VGhyZWFkX2FsbG9jYXRlX2xvY2sgY2FsbGVkXG4iKSk7CiAKLQl0aGlzX2xvY2sgPSBhdG9taWNfYWRkKCAmbG9ja19jb3VudCwgMSApOwotCVB5T1Nfc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAicHl0aG9uIGxvY2sgKCVkKSIsIHRoaXNfbG9jayk7CisgICAgbG9jayA9IChiZW5hcGhvcmVfdCAqKW1hbGxvYyggc2l6ZW9mKCBiZW5hcGhvcmVfdCApICk7CisgICAgaWYoIGxvY2sgPT0gTlVMTCApIHsKKyAgICAgICAgLyogVE9ETzogdGhhdCdzIGJhZCwgcmFpc2UgTWVtb3J5RXJyb3IgKi8KKyAgICAgICAgcmV0dXJuIChQeVRocmVhZF90eXBlX2xvY2spTlVMTDsKKyAgICB9CiAKLQlyZXR2YWwgPSBiZW5hcGhvcmVfY3JlYXRlKCBuYW1lLCBsb2NrICk7Ci0JaWYoIHJldHZhbCAhPSBFT0sgKSB7Ci0JCS8qIFRPRE86IHRoYXQncyBiYWQsIHJhaXNlIGFuIGV4Y2VwdGlvbiAqLwotCQlyZXR1cm4gKFB5VGhyZWFkX3R5cGVfbG9jaylOVUxMOwotCX0KKyAgICB0aGlzX2xvY2sgPSBhdG9taWNfYWRkKCAmbG9ja19jb3VudCwgMSApOworICAgIFB5T1Nfc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAicHl0aG9uIGxvY2sgKCVkKSIsIHRoaXNfbG9jayk7CiAKLQlkcHJpbnRmKCgiUHlUaHJlYWRfYWxsb2NhdGVfbG9jaygpIC0+ICVwXG4iLCBsb2NrKSk7Ci0JcmV0dXJuIChQeVRocmVhZF90eXBlX2xvY2spIGxvY2s7CisgICAgcmV0dmFsID0gYmVuYXBob3JlX2NyZWF0ZSggbmFtZSwgbG9jayApOworICAgIGlmKCByZXR2YWwgIT0gRU9LICkgeworICAgICAgICAvKiBUT0RPOiB0aGF0J3MgYmFkLCByYWlzZSBhbiBleGNlcHRpb24gKi8KKyAgICAgICAgcmV0dXJuIChQeVRocmVhZF90eXBlX2xvY2spTlVMTDsKKyAgICB9CisKKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfYWxsb2NhdGVfbG9jaygpIC0+ICVwXG4iLCBsb2NrKSk7CisgICAgcmV0dXJuIChQeVRocmVhZF90eXBlX2xvY2spIGxvY2s7CiB9CiAKIHZvaWQgUHlUaHJlYWRfZnJlZV9sb2NrKCBQeVRocmVhZF90eXBlX2xvY2sgbG9jayApCiB7Ci0Jc3RhdHVzX3QgcmV0dmFsOworICAgIHN0YXR1c190IHJldHZhbDsKIAotCWRwcmludGYoKCJQeVRocmVhZF9mcmVlX2xvY2soJXApIGNhbGxlZFxuIiwgbG9jaykpOwotCQotCXJldHZhbCA9IGJlbmFwaG9yZV9kZXN0cm95KCAoYmVuYXBob3JlX3QgKilsb2NrICk7Ci0JaWYoIHJldHZhbCAhPSBFT0sgKSB7Ci0JCS8qIFRPRE86IHRoYXQncyBiYWQsIHJhaXNlIGFuIGV4Y2VwdGlvbiAqLwotCQlyZXR1cm47Ci0JfQorICAgIGRwcmludGYoKCJQeVRocmVhZF9mcmVlX2xvY2soJXApIGNhbGxlZFxuIiwgbG9jaykpOworCisgICAgcmV0dmFsID0gYmVuYXBob3JlX2Rlc3Ryb3koIChiZW5hcGhvcmVfdCAqKWxvY2sgKTsKKyAgICBpZiggcmV0dmFsICE9IEVPSyApIHsKKyAgICAgICAgLyogVE9ETzogdGhhdCdzIGJhZCwgcmFpc2UgYW4gZXhjZXB0aW9uICovCisgICAgICAgIHJldHVybjsKKyAgICB9CiB9CiAKIGludCBQeVRocmVhZF9hY3F1aXJlX2xvY2soIFB5VGhyZWFkX3R5cGVfbG9jayBsb2NrLCBpbnQgd2FpdGZsYWcgKQogewotCWludCBzdWNjZXNzOwotCXN0YXR1c190IHJldHZhbDsKKyAgICBpbnQgc3VjY2VzczsKKyAgICBzdGF0dXNfdCByZXR2YWw7CiAKLQlkcHJpbnRmKCgiUHlUaHJlYWRfYWNxdWlyZV9sb2NrKCVwLCAlZCkgY2FsbGVkXG4iLCBsb2NrLCB3YWl0ZmxhZykpOworICAgIGRwcmludGYoKCJQeVRocmVhZF9hY3F1aXJlX2xvY2soJXAsICVkKSBjYWxsZWRcbiIsIGxvY2ssIHdhaXRmbGFnKSk7CiAKLQlpZiggd2FpdGZsYWcgKSB7Ci0JCXJldHZhbCA9IGJlbmFwaG9yZV9sb2NrKCAoYmVuYXBob3JlX3QgKilsb2NrICk7Ci0JfSBlbHNlIHsKLQkJcmV0dmFsID0gYmVuYXBob3JlX3RpbWVkbG9jayggKGJlbmFwaG9yZV90ICopbG9jaywgMCApOwotCX0KLQkKLQlpZiggcmV0dmFsID09IEVPSyApIHsKLQkJc3VjY2VzcyA9IDE7Ci0JfSBlbHNlIHsKLQkJc3VjY2VzcyA9IDA7Ci0JCQotCQkvKiBUT0RPOiB0aGF0J3MgYmFkLCByYWlzZSBhbiBleGNlcHRpb24gKi8KLQl9CisgICAgaWYoIHdhaXRmbGFnICkgeworICAgICAgICByZXR2YWwgPSBiZW5hcGhvcmVfbG9jayggKGJlbmFwaG9yZV90ICopbG9jayApOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHZhbCA9IGJlbmFwaG9yZV90aW1lZGxvY2soIChiZW5hcGhvcmVfdCAqKWxvY2ssIDAgKTsKKyAgICB9CiAKLQlkcHJpbnRmKCgiUHlUaHJlYWRfYWNxdWlyZV9sb2NrKCVwLCAlZCkgLT4gJWRcbiIsIGxvY2ssIHdhaXRmbGFnLCBzdWNjZXNzKSk7Ci0JcmV0dXJuIHN1Y2Nlc3M7CisgICAgaWYoIHJldHZhbCA9PSBFT0sgKSB7CisgICAgICAgIHN1Y2Nlc3MgPSAxOworICAgIH0gZWxzZSB7CisgICAgICAgIHN1Y2Nlc3MgPSAwOworCisgICAgICAgIC8qIFRPRE86IHRoYXQncyBiYWQsIHJhaXNlIGFuIGV4Y2VwdGlvbiAqLworICAgIH0KKworICAgIGRwcmludGYoKCJQeVRocmVhZF9hY3F1aXJlX2xvY2soJXAsICVkKSAtPiAlZFxuIiwgbG9jaywgd2FpdGZsYWcsIHN1Y2Nlc3MpKTsKKyAgICByZXR1cm4gc3VjY2VzczsKIH0KIAogdm9pZCBQeVRocmVhZF9yZWxlYXNlX2xvY2soIFB5VGhyZWFkX3R5cGVfbG9jayBsb2NrICkKIHsKLQlzdGF0dXNfdCByZXR2YWw7Ci0JCi0JZHByaW50ZigoIlB5VGhyZWFkX3JlbGVhc2VfbG9jayglcCkgY2FsbGVkXG4iLCBsb2NrKSk7Ci0JCi0JcmV0dmFsID0gYmVuYXBob3JlX3VubG9jayggKGJlbmFwaG9yZV90ICopbG9jayApOwotCWlmKCByZXR2YWwgIT0gRU9LICkgewotCQkvKiBUT0RPOiB0aGF0J3MgYmFkLCByYWlzZSBhbiBleGNlcHRpb24gKi8KLQkJcmV0dXJuOwotCX0KKyAgICBzdGF0dXNfdCByZXR2YWw7CisKKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfcmVsZWFzZV9sb2NrKCVwKSBjYWxsZWRcbiIsIGxvY2spKTsKKworICAgIHJldHZhbCA9IGJlbmFwaG9yZV91bmxvY2soIChiZW5hcGhvcmVfdCAqKWxvY2sgKTsKKyAgICBpZiggcmV0dmFsICE9IEVPSyApIHsKKyAgICAgICAgLyogVE9ETzogdGhhdCdzIGJhZCwgcmFpc2UgYW4gZXhjZXB0aW9uICovCisgICAgICAgIHJldHVybjsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9QeXRob24vdGhyZWFkX2N0aHJlYWQuaCBiL1B5dGhvbi90aHJlYWRfY3RocmVhZC5oCmluZGV4IGNhNzc2YzYuLjhjYjUwNDQgMTAwNjQ0Ci0tLSBhL1B5dGhvbi90aHJlYWRfY3RocmVhZC5oCisrKyBiL1B5dGhvbi90aHJlYWRfY3RocmVhZC5oCkBAIC0xNCwxMiArMTQsMTIgQEAKIFB5VGhyZWFkX19pbml0X3RocmVhZCh2b2lkKQogewogI2lmbmRlZiBIVVJEX0NfVEhSRUFEUwotCS8qIFJvbGFuZCBNY0dyYXRoIHNhaWQgdGhpcyBzaG91bGQgbm90IGJlIHVzZWQgc2luY2UgdGhpcyBpcwotCWRvbmUgd2hpbGUgbGlua2luZyB0byB0aHJlYWRzICovCi0JY3RocmVhZF9pbml0KCk7IAorICAgIC8qIFJvbGFuZCBNY0dyYXRoIHNhaWQgdGhpcyBzaG91bGQgbm90IGJlIHVzZWQgc2luY2UgdGhpcyBpcworICAgIGRvbmUgd2hpbGUgbGlua2luZyB0byB0aHJlYWRzICovCisgICAgY3RocmVhZF9pbml0KCk7CiAjZWxzZQogLyogZG8gbm90aGluZyAqLwotCTsKKyAgICA7CiAjZW5kaWYKIH0KIApAQCAtMjksNzcgKzI5LDc3IEBACiBsb25nCiBQeVRocmVhZF9zdGFydF9uZXdfdGhyZWFkKHZvaWQgKCpmdW5jKSh2b2lkICopLCB2b2lkICphcmcpCiB7Ci0JaW50IHN1Y2Nlc3MgPSAwOwkvKiBpbml0IG5vdCBuZWVkZWQgd2hlbiBTT0xBUklTX1RIUkVBRFMgYW5kICovCi0JCQkJLyogQ19USFJFQURTIGltcGxlbWVudGVkIHByb3Blcmx5ICovCisgICAgaW50IHN1Y2Nlc3MgPSAwOyAgICAgICAgICAgIC8qIGluaXQgbm90IG5lZWRlZCB3aGVuIFNPTEFSSVNfVEhSRUFEUyBhbmQgKi8KKyAgICAgICAgICAgICAgICAvKiBDX1RIUkVBRFMgaW1wbGVtZW50ZWQgcHJvcGVybHkgKi8KIAotCWRwcmludGYoKCJQeVRocmVhZF9zdGFydF9uZXdfdGhyZWFkIGNhbGxlZFxuIikpOwotCWlmICghaW5pdGlhbGl6ZWQpCi0JCVB5VGhyZWFkX2luaXRfdGhyZWFkKCk7Ci0JLyogbG9va3MgbGlrZSBzb2xhcmlzIGRldGFjaGVzIHRoZSB0aHJlYWQgdG8gbmV2ZXIgcmVqb2luCi0JICogc28gd2VsbCBkbyBpdCBoZXJlCi0JICovCi0JY3RocmVhZF9kZXRhY2goY3RocmVhZF9mb3JrKChjdGhyZWFkX2ZuX3QpIGZ1bmMsIGFyZykpOwotCXJldHVybiBzdWNjZXNzIDwgMCA/IC0xIDogMDsKKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfc3RhcnRfbmV3X3RocmVhZCBjYWxsZWRcbiIpKTsKKyAgICBpZiAoIWluaXRpYWxpemVkKQorICAgICAgICBQeVRocmVhZF9pbml0X3RocmVhZCgpOworICAgIC8qIGxvb2tzIGxpa2Ugc29sYXJpcyBkZXRhY2hlcyB0aGUgdGhyZWFkIHRvIG5ldmVyIHJlam9pbgorICAgICAqIHNvIHdlbGwgZG8gaXQgaGVyZQorICAgICAqLworICAgIGN0aHJlYWRfZGV0YWNoKGN0aHJlYWRfZm9yaygoY3RocmVhZF9mbl90KSBmdW5jLCBhcmcpKTsKKyAgICByZXR1cm4gc3VjY2VzcyA8IDAgPyAtMSA6IDA7CiB9CiAKIGxvbmcKIFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQodm9pZCkKIHsKLQlpZiAoIWluaXRpYWxpemVkKQotCQlQeVRocmVhZF9pbml0X3RocmVhZCgpOwotCXJldHVybiAobG9uZykgY3RocmVhZF9zZWxmKCk7CisgICAgaWYgKCFpbml0aWFsaXplZCkKKyAgICAgICAgUHlUaHJlYWRfaW5pdF90aHJlYWQoKTsKKyAgICByZXR1cm4gKGxvbmcpIGN0aHJlYWRfc2VsZigpOwogfQogCiBzdGF0aWMgdm9pZAogZG9fUHlUaHJlYWRfZXhpdF90aHJlYWQoaW50IG5vX2NsZWFudXApCiB7Ci0JZHByaW50ZigoIlB5VGhyZWFkX2V4aXRfdGhyZWFkIGNhbGxlZFxuIikpOwotCWlmICghaW5pdGlhbGl6ZWQpCi0JCWlmIChub19jbGVhbnVwKQotCQkJX2V4aXQoMCk7Ci0JCWVsc2UKLQkJCWV4aXQoMCk7Ci0JY3RocmVhZF9leGl0KDApOworICAgIGRwcmludGYoKCJQeVRocmVhZF9leGl0X3RocmVhZCBjYWxsZWRcbiIpKTsKKyAgICBpZiAoIWluaXRpYWxpemVkKQorICAgICAgICBpZiAobm9fY2xlYW51cCkKKyAgICAgICAgICAgIF9leGl0KDApOworICAgICAgICBlbHNlCisgICAgICAgICAgICBleGl0KDApOworICAgIGN0aHJlYWRfZXhpdCgwKTsKIH0KIAogdm9pZAogUHlUaHJlYWRfZXhpdF90aHJlYWQodm9pZCkKIHsKLQlkb19QeVRocmVhZF9leGl0X3RocmVhZCgwKTsKKyAgICBkb19QeVRocmVhZF9leGl0X3RocmVhZCgwKTsKIH0KIAogdm9pZAogUHlUaHJlYWRfX2V4aXRfdGhyZWFkKHZvaWQpCiB7Ci0JZG9fUHlUaHJlYWRfZXhpdF90aHJlYWQoMSk7CisgICAgZG9fUHlUaHJlYWRfZXhpdF90aHJlYWQoMSk7CiB9CiAKICNpZm5kZWYgTk9fRVhJVF9QUk9HCiBzdGF0aWMKIHZvaWQgZG9fUHlUaHJlYWRfZXhpdF9wcm9nKGludCBzdGF0dXMsIGludCBub19jbGVhbnVwKQogewotCWRwcmludGYoKCJQeVRocmVhZF9leGl0X3Byb2coJWQpIGNhbGxlZFxuIiwgc3RhdHVzKSk7Ci0JaWYgKCFpbml0aWFsaXplZCkKLQkJaWYgKG5vX2NsZWFudXApCi0JCQlfZXhpdChzdGF0dXMpOwotCQllbHNlCi0JCQlleGl0KHN0YXR1cyk7Ci0JaWYgKG5vX2NsZWFudXApCi0JCV9leGl0KHN0YXR1cyk7Ci0JZWxzZQotCQlleGl0KHN0YXR1cyk7CisgICAgZHByaW50ZigoIlB5VGhyZWFkX2V4aXRfcHJvZyglZCkgY2FsbGVkXG4iLCBzdGF0dXMpKTsKKyAgICBpZiAoIWluaXRpYWxpemVkKQorICAgICAgICBpZiAobm9fY2xlYW51cCkKKyAgICAgICAgICAgIF9leGl0KHN0YXR1cyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGV4aXQoc3RhdHVzKTsKKyAgICBpZiAobm9fY2xlYW51cCkKKyAgICAgICAgX2V4aXQoc3RhdHVzKTsKKyAgICBlbHNlCisgICAgICAgIGV4aXQoc3RhdHVzKTsKIH0KIAogdm9pZAogUHlUaHJlYWRfZXhpdF9wcm9nKGludCBzdGF0dXMpCiB7Ci0JZG9fUHlUaHJlYWRfZXhpdF9wcm9nKHN0YXR1cywgMCk7CisgICAgZG9fUHlUaHJlYWRfZXhpdF9wcm9nKHN0YXR1cywgMCk7CiB9CiAKIHZvaWQKIFB5VGhyZWFkX19leGl0X3Byb2coaW50IHN0YXR1cykKIHsKLQlkb19QeVRocmVhZF9leGl0X3Byb2coc3RhdHVzLCAxKTsKKyAgICBkb19QeVRocmVhZF9leGl0X3Byb2coc3RhdHVzLCAxKTsKIH0KICNlbmRpZiAvKiBOT19FWElUX1BST0cgKi8KIApAQCAtMTA5LDQ4ICsxMDksNDggQEAKIFB5VGhyZWFkX3R5cGVfbG9jawogUHlUaHJlYWRfYWxsb2NhdGVfbG9jayh2b2lkKQogewotCW11dGV4X3QgbG9jazsKKyAgICBtdXRleF90IGxvY2s7CiAKLQlkcHJpbnRmKCgiUHlUaHJlYWRfYWxsb2NhdGVfbG9jayBjYWxsZWRcbiIpKTsKLQlpZiAoIWluaXRpYWxpemVkKQotCQlQeVRocmVhZF9pbml0X3RocmVhZCgpOworICAgIGRwcmludGYoKCJQeVRocmVhZF9hbGxvY2F0ZV9sb2NrIGNhbGxlZFxuIikpOworICAgIGlmICghaW5pdGlhbGl6ZWQpCisgICAgICAgIFB5VGhyZWFkX2luaXRfdGhyZWFkKCk7CiAKLQlsb2NrID0gbXV0ZXhfYWxsb2MoKTsKLQlpZiAobXV0ZXhfaW5pdChsb2NrKSkgewotCQlwZXJyb3IoIm11dGV4X2luaXQiKTsKLQkJZnJlZSgodm9pZCAqKSBsb2NrKTsKLQkJbG9jayA9IDA7Ci0JfQotCWRwcmludGYoKCJQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKCkgLT4gJXBcbiIsIGxvY2spKTsKLQlyZXR1cm4gKFB5VGhyZWFkX3R5cGVfbG9jaykgbG9jazsKKyAgICBsb2NrID0gbXV0ZXhfYWxsb2MoKTsKKyAgICBpZiAobXV0ZXhfaW5pdChsb2NrKSkgeworICAgICAgICBwZXJyb3IoIm11dGV4X2luaXQiKTsKKyAgICAgICAgZnJlZSgodm9pZCAqKSBsb2NrKTsKKyAgICAgICAgbG9jayA9IDA7CisgICAgfQorICAgIGRwcmludGYoKCJQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKCkgLT4gJXBcbiIsIGxvY2spKTsKKyAgICByZXR1cm4gKFB5VGhyZWFkX3R5cGVfbG9jaykgbG9jazsKIH0KIAogdm9pZAogUHlUaHJlYWRfZnJlZV9sb2NrKFB5VGhyZWFkX3R5cGVfbG9jayBsb2NrKQogewotCWRwcmludGYoKCJQeVRocmVhZF9mcmVlX2xvY2soJXApIGNhbGxlZFxuIiwgbG9jaykpOwotCW11dGV4X2ZyZWUobG9jayk7CisgICAgZHByaW50ZigoIlB5VGhyZWFkX2ZyZWVfbG9jayglcCkgY2FsbGVkXG4iLCBsb2NrKSk7CisgICAgbXV0ZXhfZnJlZShsb2NrKTsKIH0KIAogaW50CiBQeVRocmVhZF9hY3F1aXJlX2xvY2soUHlUaHJlYWRfdHlwZV9sb2NrIGxvY2ssIGludCB3YWl0ZmxhZykKIHsKLQlpbnQgc3VjY2VzcyA9IEZBTFNFOworICAgIGludCBzdWNjZXNzID0gRkFMU0U7CiAKLQlkcHJpbnRmKCgiUHlUaHJlYWRfYWNxdWlyZV9sb2NrKCVwLCAlZCkgY2FsbGVkXG4iLCBsb2NrLCB3YWl0ZmxhZykpOwotCWlmICh3YWl0ZmxhZykgeyAJLyogYmxvY2tpbmcgKi8KLQkJbXV0ZXhfbG9jaygobXV0ZXhfdClsb2NrKTsKLQkJc3VjY2VzcyA9IFRSVUU7Ci0JfSBlbHNlIHsJCS8qIG5vbiBibG9ja2luZyAqLwotCQlzdWNjZXNzID0gbXV0ZXhfdHJ5X2xvY2soKG11dGV4X3QpbG9jayk7Ci0JfQotCWRwcmludGYoKCJQeVRocmVhZF9hY3F1aXJlX2xvY2soJXAsICVkKSAtPiAlZFxuIiwgbG9jaywgd2FpdGZsYWcsIHN1Y2Nlc3MpKTsKLQlyZXR1cm4gc3VjY2VzczsKKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfYWNxdWlyZV9sb2NrKCVwLCAlZCkgY2FsbGVkXG4iLCBsb2NrLCB3YWl0ZmxhZykpOworICAgIGlmICh3YWl0ZmxhZykgeyAgICAgICAgICAgICAvKiBibG9ja2luZyAqLworICAgICAgICBtdXRleF9sb2NrKChtdXRleF90KWxvY2spOworICAgICAgICBzdWNjZXNzID0gVFJVRTsKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgLyogbm9uIGJsb2NraW5nICovCisgICAgICAgIHN1Y2Nlc3MgPSBtdXRleF90cnlfbG9jaygobXV0ZXhfdClsb2NrKTsKKyAgICB9CisgICAgZHByaW50ZigoIlB5VGhyZWFkX2FjcXVpcmVfbG9jayglcCwgJWQpIC0+ICVkXG4iLCBsb2NrLCB3YWl0ZmxhZywgc3VjY2VzcykpOworICAgIHJldHVybiBzdWNjZXNzOwogfQogCiB2b2lkCiBQeVRocmVhZF9yZWxlYXNlX2xvY2soUHlUaHJlYWRfdHlwZV9sb2NrIGxvY2spCiB7Ci0JZHByaW50ZigoIlB5VGhyZWFkX3JlbGVhc2VfbG9jayglcCkgY2FsbGVkXG4iLCBsb2NrKSk7Ci0JbXV0ZXhfdW5sb2NrKChtdXRleF90IClsb2NrKTsKKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfcmVsZWFzZV9sb2NrKCVwKSBjYWxsZWRcbiIsIGxvY2spKTsKKyAgICBtdXRleF91bmxvY2soKG11dGV4X3QgKWxvY2spOwogfQpkaWZmIC0tZ2l0IGEvUHl0aG9uL3RocmVhZF9mb29iYXIuaCBiL1B5dGhvbi90aHJlYWRfZm9vYmFyLmgKaW5kZXggNjc0OTFhMS4uYzJkZmZhNiAxMDA2NDQKLS0tIGEvUHl0aG9uL3RocmVhZF9mb29iYXIuaAorKysgYi9QeXRob24vdGhyZWFkX2Zvb2Jhci5oCkBAIC0xMyw2NyArMTMsNjcgQEAKIGxvbmcKIFB5VGhyZWFkX3N0YXJ0X25ld190aHJlYWQodm9pZCAoKmZ1bmMpKHZvaWQgKiksIHZvaWQgKmFyZykKIHsKLQlpbnQgc3VjY2VzcyA9IDA7CS8qIGluaXQgbm90IG5lZWRlZCB3aGVuIFNPTEFSSVNfVEhSRUFEUyBhbmQgKi8KLQkJCQkvKiBDX1RIUkVBRFMgaW1wbGVtZW50ZWQgcHJvcGVybHkgKi8KKyAgICBpbnQgc3VjY2VzcyA9IDA7ICAgICAgICAgICAgLyogaW5pdCBub3QgbmVlZGVkIHdoZW4gU09MQVJJU19USFJFQURTIGFuZCAqLworICAgICAgICAgICAgICAgIC8qIENfVEhSRUFEUyBpbXBsZW1lbnRlZCBwcm9wZXJseSAqLwogCi0JZHByaW50ZigoIlB5VGhyZWFkX3N0YXJ0X25ld190aHJlYWQgY2FsbGVkXG4iKSk7Ci0JaWYgKCFpbml0aWFsaXplZCkKLQkJUHlUaHJlYWRfaW5pdF90aHJlYWQoKTsKLQlyZXR1cm4gc3VjY2VzcyA8IDAgPyAtMSA6IDA7CisgICAgZHByaW50ZigoIlB5VGhyZWFkX3N0YXJ0X25ld190aHJlYWQgY2FsbGVkXG4iKSk7CisgICAgaWYgKCFpbml0aWFsaXplZCkKKyAgICAgICAgUHlUaHJlYWRfaW5pdF90aHJlYWQoKTsKKyAgICByZXR1cm4gc3VjY2VzcyA8IDAgPyAtMSA6IDA7CiB9CiAKIGxvbmcKIFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQodm9pZCkKIHsKLQlpZiAoIWluaXRpYWxpemVkKQotCQlQeVRocmVhZF9pbml0X3RocmVhZCgpOworICAgIGlmICghaW5pdGlhbGl6ZWQpCisgICAgICAgIFB5VGhyZWFkX2luaXRfdGhyZWFkKCk7CiB9CiAKIHN0YXRpYwogdm9pZCBkb19QeVRocmVhZF9leGl0X3RocmVhZChpbnQgbm9fY2xlYW51cCkKIHsKLQlkcHJpbnRmKCgiUHlUaHJlYWRfZXhpdF90aHJlYWQgY2FsbGVkXG4iKSk7Ci0JaWYgKCFpbml0aWFsaXplZCkKLQkJaWYgKG5vX2NsZWFudXApCi0JCQlfZXhpdCgwKTsKLQkJZWxzZQotCQkJZXhpdCgwKTsKKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfZXhpdF90aHJlYWQgY2FsbGVkXG4iKSk7CisgICAgaWYgKCFpbml0aWFsaXplZCkKKyAgICAgICAgaWYgKG5vX2NsZWFudXApCisgICAgICAgICAgICBfZXhpdCgwKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZXhpdCgwKTsKIH0KIAogdm9pZAogUHlUaHJlYWRfZXhpdF90aHJlYWQodm9pZCkKIHsKLQlkb19QeVRocmVhZF9leGl0X3RocmVhZCgwKTsKKyAgICBkb19QeVRocmVhZF9leGl0X3RocmVhZCgwKTsKIH0KIAogdm9pZAogUHlUaHJlYWRfX2V4aXRfdGhyZWFkKHZvaWQpCiB7Ci0JZG9fUHlUaHJlYWRfZXhpdF90aHJlYWQoMSk7CisgICAgZG9fUHlUaHJlYWRfZXhpdF90aHJlYWQoMSk7CiB9CiAKICNpZm5kZWYgTk9fRVhJVF9QUk9HCiBzdGF0aWMKIHZvaWQgZG9fUHlUaHJlYWRfZXhpdF9wcm9nKGludCBzdGF0dXMsIGludCBub19jbGVhbnVwKQogewotCWRwcmludGYoKCJQeVRocmVhZF9leGl0X3Byb2coJWQpIGNhbGxlZFxuIiwgc3RhdHVzKSk7Ci0JaWYgKCFpbml0aWFsaXplZCkKLQkJaWYgKG5vX2NsZWFudXApCi0JCQlfZXhpdChzdGF0dXMpOwotCQllbHNlCi0JCQlleGl0KHN0YXR1cyk7CisgICAgZHByaW50ZigoIlB5VGhyZWFkX2V4aXRfcHJvZyglZCkgY2FsbGVkXG4iLCBzdGF0dXMpKTsKKyAgICBpZiAoIWluaXRpYWxpemVkKQorICAgICAgICBpZiAobm9fY2xlYW51cCkKKyAgICAgICAgICAgIF9leGl0KHN0YXR1cyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGV4aXQoc3RhdHVzKTsKIH0KIAogdm9pZAogUHlUaHJlYWRfZXhpdF9wcm9nKGludCBzdGF0dXMpCiB7Ci0JZG9fUHlUaHJlYWRfZXhpdF9wcm9nKHN0YXR1cywgMCk7CisgICAgZG9fUHlUaHJlYWRfZXhpdF9wcm9nKHN0YXR1cywgMCk7CiB9CiAKIHZvaWQKIFB5VGhyZWFkX19leGl0X3Byb2coaW50IHN0YXR1cykKIHsKLQlkb19QeVRocmVhZF9leGl0X3Byb2coc3RhdHVzLCAxKTsKKyAgICBkb19QeVRocmVhZF9leGl0X3Byb2coc3RhdHVzLCAxKTsKIH0KICNlbmRpZiAvKiBOT19FWElUX1BST0cgKi8KIApAQCAtODQsMzIgKzg0LDMyIEBACiBQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKHZvaWQpCiB7CiAKLQlkcHJpbnRmKCgiUHlUaHJlYWRfYWxsb2NhdGVfbG9jayBjYWxsZWRcbiIpKTsKLQlpZiAoIWluaXRpYWxpemVkKQotCQlQeVRocmVhZF9pbml0X3RocmVhZCgpOworICAgIGRwcmludGYoKCJQeVRocmVhZF9hbGxvY2F0ZV9sb2NrIGNhbGxlZFxuIikpOworICAgIGlmICghaW5pdGlhbGl6ZWQpCisgICAgICAgIFB5VGhyZWFkX2luaXRfdGhyZWFkKCk7CiAKLQlkcHJpbnRmKCgiUHlUaHJlYWRfYWxsb2NhdGVfbG9jaygpIC0+ICVwXG4iLCBsb2NrKSk7Ci0JcmV0dXJuIChQeVRocmVhZF90eXBlX2xvY2spIGxvY2s7CisgICAgZHByaW50ZigoIlB5VGhyZWFkX2FsbG9jYXRlX2xvY2soKSAtPiAlcFxuIiwgbG9jaykpOworICAgIHJldHVybiAoUHlUaHJlYWRfdHlwZV9sb2NrKSBsb2NrOwogfQogCiB2b2lkCiBQeVRocmVhZF9mcmVlX2xvY2soUHlUaHJlYWRfdHlwZV9sb2NrIGxvY2spCiB7Ci0JZHByaW50ZigoIlB5VGhyZWFkX2ZyZWVfbG9jayglcCkgY2FsbGVkXG4iLCBsb2NrKSk7CisgICAgZHByaW50ZigoIlB5VGhyZWFkX2ZyZWVfbG9jayglcCkgY2FsbGVkXG4iLCBsb2NrKSk7CiB9CiAKIGludAogUHlUaHJlYWRfYWNxdWlyZV9sb2NrKFB5VGhyZWFkX3R5cGVfbG9jayBsb2NrLCBpbnQgd2FpdGZsYWcpCiB7Ci0JaW50IHN1Y2Nlc3M7CisgICAgaW50IHN1Y2Nlc3M7CiAKLQlkcHJpbnRmKCgiUHlUaHJlYWRfYWNxdWlyZV9sb2NrKCVwLCAlZCkgY2FsbGVkXG4iLCBsb2NrLCB3YWl0ZmxhZykpOwotCWRwcmludGYoKCJQeVRocmVhZF9hY3F1aXJlX2xvY2soJXAsICVkKSAtPiAlZFxuIiwgbG9jaywgd2FpdGZsYWcsIHN1Y2Nlc3MpKTsKLQlyZXR1cm4gc3VjY2VzczsKKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfYWNxdWlyZV9sb2NrKCVwLCAlZCkgY2FsbGVkXG4iLCBsb2NrLCB3YWl0ZmxhZykpOworICAgIGRwcmludGYoKCJQeVRocmVhZF9hY3F1aXJlX2xvY2soJXAsICVkKSAtPiAlZFxuIiwgbG9jaywgd2FpdGZsYWcsIHN1Y2Nlc3MpKTsKKyAgICByZXR1cm4gc3VjY2VzczsKIH0KIAogdm9pZAogUHlUaHJlYWRfcmVsZWFzZV9sb2NrKFB5VGhyZWFkX3R5cGVfbG9jayBsb2NrKQogewotCWRwcmludGYoKCJQeVRocmVhZF9yZWxlYXNlX2xvY2soJXApIGNhbGxlZFxuIiwgbG9jaykpOworICAgIGRwcmludGYoKCJQeVRocmVhZF9yZWxlYXNlX2xvY2soJXApIGNhbGxlZFxuIiwgbG9jaykpOwogfQpkaWZmIC0tZ2l0IGEvUHl0aG9uL3RocmVhZF9sd3AuaCBiL1B5dGhvbi90aHJlYWRfbHdwLmgKaW5kZXggZTkzZDY1YS4uNzUxOWNkNCAxMDA2NDQKLS0tIGEvUHl0aG9uL3RocmVhZF9sd3AuaAorKysgYi9QeXRob24vdGhyZWFkX2x3cC5oCkBAIC0zLDEzICszLDEzIEBACiAjaW5jbHVkZSA8bHdwL2x3cC5oPgogI2luY2x1ZGUgPGx3cC9zdGFja2RlcC5oPgogCi0jZGVmaW5lIFNUQUNLU0laRQkxMDAwCS8qIHN0YWNrc2l6ZSBmb3IgYSB0aHJlYWQgKi8KLSNkZWZpbmUgTlNUQUNLUwkJMgkvKiAjIHN0YWNrcyB0byBiZSBwdXQgaW4gY2FjaGUgaW5pdGlhbGx5ICovCisjZGVmaW5lIFNUQUNLU0laRSAgICAgICAxMDAwICAgIC8qIHN0YWNrc2l6ZSBmb3IgYSB0aHJlYWQgKi8KKyNkZWZpbmUgTlNUQUNLUyAgICAgICAgIDIgICAgICAgLyogIyBzdGFja3MgdG8gYmUgcHV0IGluIGNhY2hlIGluaXRpYWxseSAqLwogCiBzdHJ1Y3QgbG9jayB7Ci0JaW50IGxvY2tfbG9ja2VkOwotCWN2X3QgbG9ja19jb25kdmFyOwotCW1vbl90IGxvY2tfbW9uaXRvcjsKKyAgICBpbnQgbG9ja19sb2NrZWQ7CisgICAgY3ZfdCBsb2NrX2NvbmR2YXI7CisgICAgbW9uX3QgbG9ja19tb25pdG9yOwogfTsKIAogCkBAIC0xOCw3ICsxOCw3IEBACiAgKi8KIHN0YXRpYyB2b2lkIFB5VGhyZWFkX19pbml0X3RocmVhZCh2b2lkKQogewotCWx3cF9zZXRzdGtjYWNoZShTVEFDS1NJWkUsIE5TVEFDS1MpOworICAgIGx3cF9zZXRzdGtjYWNoZShTVEFDS1NJWkUsIE5TVEFDS1MpOwogfQogCiAvKgpAQCAtMjgsNjYgKzI4LDY2IEBACiAKIGxvbmcgUHlUaHJlYWRfc3RhcnRfbmV3X3RocmVhZCh2b2lkICgqZnVuYykodm9pZCAqKSwgdm9pZCAqYXJnKQogewotCXRocmVhZF90IHRpZDsKLQlpbnQgc3VjY2VzczsKLQlkcHJpbnRmKCgiUHlUaHJlYWRfc3RhcnRfbmV3X3RocmVhZCBjYWxsZWRcbiIpKTsKLQlpZiAoIWluaXRpYWxpemVkKQotCQlQeVRocmVhZF9pbml0X3RocmVhZCgpOwotCXN1Y2Nlc3MgPSBsd3BfY3JlYXRlKCZ0aWQsIGZ1bmMsIE1JTlBSSU8sIDAsIGx3cF9uZXdzdGsoKSwgMSwgYXJnKTsKLQlyZXR1cm4gc3VjY2VzcyA8IDAgPyAtMSA6IDA7CisgICAgdGhyZWFkX3QgdGlkOworICAgIGludCBzdWNjZXNzOworICAgIGRwcmludGYoKCJQeVRocmVhZF9zdGFydF9uZXdfdGhyZWFkIGNhbGxlZFxuIikpOworICAgIGlmICghaW5pdGlhbGl6ZWQpCisgICAgICAgIFB5VGhyZWFkX2luaXRfdGhyZWFkKCk7CisgICAgc3VjY2VzcyA9IGx3cF9jcmVhdGUoJnRpZCwgZnVuYywgTUlOUFJJTywgMCwgbHdwX25ld3N0aygpLCAxLCBhcmcpOworICAgIHJldHVybiBzdWNjZXNzIDwgMCA/IC0xIDogMDsKIH0KIAogbG9uZyBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KHZvaWQpCiB7Ci0JdGhyZWFkX3QgdGlkOwotCWlmICghaW5pdGlhbGl6ZWQpCi0JCVB5VGhyZWFkX2luaXRfdGhyZWFkKCk7Ci0JaWYgKGx3cF9zZWxmKCZ0aWQpIDwgMCkKLQkJcmV0dXJuIC0xOwotCXJldHVybiB0aWQudGhyZWFkX2lkOworICAgIHRocmVhZF90IHRpZDsKKyAgICBpZiAoIWluaXRpYWxpemVkKQorICAgICAgICBQeVRocmVhZF9pbml0X3RocmVhZCgpOworICAgIGlmIChsd3Bfc2VsZigmdGlkKSA8IDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICByZXR1cm4gdGlkLnRocmVhZF9pZDsKIH0KIAogc3RhdGljIHZvaWQgZG9fUHlUaHJlYWRfZXhpdF90aHJlYWQoaW50IG5vX2NsZWFudXApCiB7Ci0JZHByaW50ZigoIlB5VGhyZWFkX2V4aXRfdGhyZWFkIGNhbGxlZFxuIikpOwotCWlmICghaW5pdGlhbGl6ZWQpCi0JCWlmIChub19jbGVhbnVwKQotCQkJX2V4aXQoMCk7Ci0JCWVsc2UKLQkJCWV4aXQoMCk7Ci0JbHdwX2Rlc3Ryb3koU0VMRik7CisgICAgZHByaW50ZigoIlB5VGhyZWFkX2V4aXRfdGhyZWFkIGNhbGxlZFxuIikpOworICAgIGlmICghaW5pdGlhbGl6ZWQpCisgICAgICAgIGlmIChub19jbGVhbnVwKQorICAgICAgICAgICAgX2V4aXQoMCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGV4aXQoMCk7CisgICAgbHdwX2Rlc3Ryb3koU0VMRik7CiB9CiAKIHZvaWQgUHlUaHJlYWRfZXhpdF90aHJlYWQodm9pZCkKIHsKLQlkb19QeVRocmVhZF9leGl0X3RocmVhZCgwKTsKKyAgICBkb19QeVRocmVhZF9leGl0X3RocmVhZCgwKTsKIH0KIAogdm9pZCBQeVRocmVhZF9fZXhpdF90aHJlYWQodm9pZCkKIHsKLQlkb19QeVRocmVhZF9leGl0X3RocmVhZCgxKTsKKyAgICBkb19QeVRocmVhZF9leGl0X3RocmVhZCgxKTsKIH0KIAogI2lmbmRlZiBOT19FWElUX1BST0cKIHN0YXRpYyB2b2lkIGRvX1B5VGhyZWFkX2V4aXRfcHJvZyhpbnQgc3RhdHVzLCBpbnQgbm9fY2xlYW51cCkKIHsKLQlkcHJpbnRmKCgiUHlUaHJlYWRfZXhpdF9wcm9nKCVkKSBjYWxsZWRcbiIsIHN0YXR1cykpOwotCWlmICghaW5pdGlhbGl6ZWQpCi0JCWlmIChub19jbGVhbnVwKQotCQkJX2V4aXQoc3RhdHVzKTsKLQkJZWxzZQotCQkJZXhpdChzdGF0dXMpOwotCXBvZF9leGl0KHN0YXR1cyk7CisgICAgZHByaW50ZigoIlB5VGhyZWFkX2V4aXRfcHJvZyglZCkgY2FsbGVkXG4iLCBzdGF0dXMpKTsKKyAgICBpZiAoIWluaXRpYWxpemVkKQorICAgICAgICBpZiAobm9fY2xlYW51cCkKKyAgICAgICAgICAgIF9leGl0KHN0YXR1cyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGV4aXQoc3RhdHVzKTsKKyAgICBwb2RfZXhpdChzdGF0dXMpOwogfQogCiB2b2lkIFB5VGhyZWFkX2V4aXRfcHJvZyhpbnQgc3RhdHVzKQogewotCWRvX1B5VGhyZWFkX2V4aXRfcHJvZyhzdGF0dXMsIDApOworICAgIGRvX1B5VGhyZWFkX2V4aXRfcHJvZyhzdGF0dXMsIDApOwogfQogCiB2b2lkIFB5VGhyZWFkX19leGl0X3Byb2coaW50IHN0YXR1cykKIHsKLQlkb19QeVRocmVhZF9leGl0X3Byb2coc3RhdHVzLCAxKTsKKyAgICBkb19QeVRocmVhZF9leGl0X3Byb2coc3RhdHVzLCAxKTsKIH0KICNlbmRpZiAvKiBOT19FWElUX1BST0cgKi8KIApAQCAtOTYsNTQgKzk2LDU0IEBACiAgKi8KIFB5VGhyZWFkX3R5cGVfbG9jayBQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKHZvaWQpCiB7Ci0Jc3RydWN0IGxvY2sgKmxvY2s7Ci0JZXh0ZXJuIGNoYXIgKm1hbGxvYyhzaXplX3QpOworICAgIHN0cnVjdCBsb2NrICpsb2NrOworICAgIGV4dGVybiBjaGFyICptYWxsb2Moc2l6ZV90KTsKIAotCWRwcmludGYoKCJQeVRocmVhZF9hbGxvY2F0ZV9sb2NrIGNhbGxlZFxuIikpOwotCWlmICghaW5pdGlhbGl6ZWQpCi0JCVB5VGhyZWFkX2luaXRfdGhyZWFkKCk7CisgICAgZHByaW50ZigoIlB5VGhyZWFkX2FsbG9jYXRlX2xvY2sgY2FsbGVkXG4iKSk7CisgICAgaWYgKCFpbml0aWFsaXplZCkKKyAgICAgICAgUHlUaHJlYWRfaW5pdF90aHJlYWQoKTsKIAotCWxvY2sgPSAoc3RydWN0IGxvY2sgKikgbWFsbG9jKHNpemVvZihzdHJ1Y3QgbG9jaykpOwotCWxvY2stPmxvY2tfbG9ja2VkID0gMDsKLQkodm9pZCkgbW9uX2NyZWF0ZSgmbG9jay0+bG9ja19tb25pdG9yKTsKLQkodm9pZCkgY3ZfY3JlYXRlKCZsb2NrLT5sb2NrX2NvbmR2YXIsIGxvY2stPmxvY2tfbW9uaXRvcik7Ci0JZHByaW50ZigoIlB5VGhyZWFkX2FsbG9jYXRlX2xvY2soKSAtPiAlcFxuIiwgbG9jaykpOwotCXJldHVybiAoUHlUaHJlYWRfdHlwZV9sb2NrKSBsb2NrOworICAgIGxvY2sgPSAoc3RydWN0IGxvY2sgKikgbWFsbG9jKHNpemVvZihzdHJ1Y3QgbG9jaykpOworICAgIGxvY2stPmxvY2tfbG9ja2VkID0gMDsKKyAgICAodm9pZCkgbW9uX2NyZWF0ZSgmbG9jay0+bG9ja19tb25pdG9yKTsKKyAgICAodm9pZCkgY3ZfY3JlYXRlKCZsb2NrLT5sb2NrX2NvbmR2YXIsIGxvY2stPmxvY2tfbW9uaXRvcik7CisgICAgZHByaW50ZigoIlB5VGhyZWFkX2FsbG9jYXRlX2xvY2soKSAtPiAlcFxuIiwgbG9jaykpOworICAgIHJldHVybiAoUHlUaHJlYWRfdHlwZV9sb2NrKSBsb2NrOwogfQogCiB2b2lkIFB5VGhyZWFkX2ZyZWVfbG9jayhQeVRocmVhZF90eXBlX2xvY2sgbG9jaykKIHsKLQlkcHJpbnRmKCgiUHlUaHJlYWRfZnJlZV9sb2NrKCVwKSBjYWxsZWRcbiIsIGxvY2spKTsKLQltb25fZGVzdHJveSgoKHN0cnVjdCBsb2NrICopIGxvY2spLT5sb2NrX21vbml0b3IpOwotCWZyZWUoKGNoYXIgKikgbG9jayk7CisgICAgZHByaW50ZigoIlB5VGhyZWFkX2ZyZWVfbG9jayglcCkgY2FsbGVkXG4iLCBsb2NrKSk7CisgICAgbW9uX2Rlc3Ryb3koKChzdHJ1Y3QgbG9jayAqKSBsb2NrKS0+bG9ja19tb25pdG9yKTsKKyAgICBmcmVlKChjaGFyICopIGxvY2spOwogfQogCiBpbnQgUHlUaHJlYWRfYWNxdWlyZV9sb2NrKFB5VGhyZWFkX3R5cGVfbG9jayBsb2NrLCBpbnQgd2FpdGZsYWcpCiB7Ci0JaW50IHN1Y2Nlc3M7CisgICAgaW50IHN1Y2Nlc3M7CiAKLQlkcHJpbnRmKCgiUHlUaHJlYWRfYWNxdWlyZV9sb2NrKCVwLCAlZCkgY2FsbGVkXG4iLCBsb2NrLCB3YWl0ZmxhZykpOwotCXN1Y2Nlc3MgPSAwOworICAgIGRwcmludGYoKCJQeVRocmVhZF9hY3F1aXJlX2xvY2soJXAsICVkKSBjYWxsZWRcbiIsIGxvY2ssIHdhaXRmbGFnKSk7CisgICAgc3VjY2VzcyA9IDA7CiAKLQkodm9pZCkgbW9uX2VudGVyKCgoc3RydWN0IGxvY2sgKikgbG9jayktPmxvY2tfbW9uaXRvcik7Ci0JaWYgKHdhaXRmbGFnKQotCQl3aGlsZSAoKChzdHJ1Y3QgbG9jayAqKSBsb2NrKS0+bG9ja19sb2NrZWQpCi0JCQljdl93YWl0KCgoc3RydWN0IGxvY2sgKikgbG9jayktPmxvY2tfY29uZHZhcik7Ci0JaWYgKCEoKHN0cnVjdCBsb2NrICopIGxvY2spLT5sb2NrX2xvY2tlZCkgewotCQlzdWNjZXNzID0gMTsKLQkJKChzdHJ1Y3QgbG9jayAqKSBsb2NrKS0+bG9ja19sb2NrZWQgPSAxOwotCX0KLQljdl9icm9hZGNhc3QoKChzdHJ1Y3QgbG9jayAqKSBsb2NrKS0+bG9ja19jb25kdmFyKTsKLQltb25fZXhpdCgoKHN0cnVjdCBsb2NrICopIGxvY2spLT5sb2NrX21vbml0b3IpOwotCWRwcmludGYoKCJQeVRocmVhZF9hY3F1aXJlX2xvY2soJXAsICVkKSAtPiAlZFxuIiwgbG9jaywgd2FpdGZsYWcsIHN1Y2Nlc3MpKTsKLQlyZXR1cm4gc3VjY2VzczsKKyAgICAodm9pZCkgbW9uX2VudGVyKCgoc3RydWN0IGxvY2sgKikgbG9jayktPmxvY2tfbW9uaXRvcik7CisgICAgaWYgKHdhaXRmbGFnKQorICAgICAgICB3aGlsZSAoKChzdHJ1Y3QgbG9jayAqKSBsb2NrKS0+bG9ja19sb2NrZWQpCisgICAgICAgICAgICBjdl93YWl0KCgoc3RydWN0IGxvY2sgKikgbG9jayktPmxvY2tfY29uZHZhcik7CisgICAgaWYgKCEoKHN0cnVjdCBsb2NrICopIGxvY2spLT5sb2NrX2xvY2tlZCkgeworICAgICAgICBzdWNjZXNzID0gMTsKKyAgICAgICAgKChzdHJ1Y3QgbG9jayAqKSBsb2NrKS0+bG9ja19sb2NrZWQgPSAxOworICAgIH0KKyAgICBjdl9icm9hZGNhc3QoKChzdHJ1Y3QgbG9jayAqKSBsb2NrKS0+bG9ja19jb25kdmFyKTsKKyAgICBtb25fZXhpdCgoKHN0cnVjdCBsb2NrICopIGxvY2spLT5sb2NrX21vbml0b3IpOworICAgIGRwcmludGYoKCJQeVRocmVhZF9hY3F1aXJlX2xvY2soJXAsICVkKSAtPiAlZFxuIiwgbG9jaywgd2FpdGZsYWcsIHN1Y2Nlc3MpKTsKKyAgICByZXR1cm4gc3VjY2VzczsKIH0KIAogdm9pZCBQeVRocmVhZF9yZWxlYXNlX2xvY2soUHlUaHJlYWRfdHlwZV9sb2NrIGxvY2spCiB7Ci0JZHByaW50ZigoIlB5VGhyZWFkX3JlbGVhc2VfbG9jayglcCkgY2FsbGVkXG4iLCBsb2NrKSk7Ci0JKHZvaWQpIG1vbl9lbnRlcigoKHN0cnVjdCBsb2NrICopIGxvY2spLT5sb2NrX21vbml0b3IpOwotCSgoc3RydWN0IGxvY2sgKikgbG9jayktPmxvY2tfbG9ja2VkID0gMDsKLQljdl9icm9hZGNhc3QoKChzdHJ1Y3QgbG9jayAqKSBsb2NrKS0+bG9ja19jb25kdmFyKTsKLQltb25fZXhpdCgoKHN0cnVjdCBsb2NrICopIGxvY2spLT5sb2NrX21vbml0b3IpOworICAgIGRwcmludGYoKCJQeVRocmVhZF9yZWxlYXNlX2xvY2soJXApIGNhbGxlZFxuIiwgbG9jaykpOworICAgICh2b2lkKSBtb25fZW50ZXIoKChzdHJ1Y3QgbG9jayAqKSBsb2NrKS0+bG9ja19tb25pdG9yKTsKKyAgICAoKHN0cnVjdCBsb2NrICopIGxvY2spLT5sb2NrX2xvY2tlZCA9IDA7CisgICAgY3ZfYnJvYWRjYXN0KCgoc3RydWN0IGxvY2sgKikgbG9jayktPmxvY2tfY29uZHZhcik7CisgICAgbW9uX2V4aXQoKChzdHJ1Y3QgbG9jayAqKSBsb2NrKS0+bG9ja19tb25pdG9yKTsKIH0KZGlmZiAtLWdpdCBhL1B5dGhvbi90aHJlYWRfbnQuaCBiL1B5dGhvbi90aHJlYWRfbnQuaAppbmRleCA5NDQ1NTI5Li43NTEyYzczIDEwMDY0NAotLS0gYS9QeXRob24vdGhyZWFkX250LmgKKysrIGIvUHl0aG9uL3RocmVhZF9udC5oCkBAIC0xMCw4MSArMTAsODEgQEAKICNlbmRpZgogCiB0eXBlZGVmIHN0cnVjdCBOUk1VVEVYIHsKLQlMT05HICAgb3duZWQgOwotCURXT1JEICB0aHJlYWRfaWQgOwotCUhBTkRMRSBoZXZlbnQgOworICAgIExPTkcgICBvd25lZCA7CisgICAgRFdPUkQgIHRocmVhZF9pZCA7CisgICAgSEFORExFIGhldmVudCA7CiB9IE5STVVURVgsICpQTlJNVVRFWCA7CiAKIAogQk9PTAogSW5pdGlhbGl6ZU5vblJlY3Vyc2l2ZU11dGV4KFBOUk1VVEVYIG11dGV4KQogewotCW11dGV4LT5vd25lZCA9IC0xIDsgIC8qIE5vIHRocmVhZHMgaGF2ZSBlbnRlcmVkIE5vblJlY3Vyc2l2ZU11dGV4ICovCi0JbXV0ZXgtPnRocmVhZF9pZCA9IDAgOwotCW11dGV4LT5oZXZlbnQgPSBDcmVhdGVFdmVudChOVUxMLCBGQUxTRSwgRkFMU0UsIE5VTEwpIDsKLQlyZXR1cm4gbXV0ZXgtPmhldmVudCAhPSBOVUxMIDsJLyogVFJVRSBpZiB0aGUgbXV0ZXggaXMgY3JlYXRlZCAqLworICAgIG11dGV4LT5vd25lZCA9IC0xIDsgIC8qIE5vIHRocmVhZHMgaGF2ZSBlbnRlcmVkIE5vblJlY3Vyc2l2ZU11dGV4ICovCisgICAgbXV0ZXgtPnRocmVhZF9pZCA9IDAgOworICAgIG11dGV4LT5oZXZlbnQgPSBDcmVhdGVFdmVudChOVUxMLCBGQUxTRSwgRkFMU0UsIE5VTEwpIDsKKyAgICByZXR1cm4gbXV0ZXgtPmhldmVudCAhPSBOVUxMIDsgICAgICAvKiBUUlVFIGlmIHRoZSBtdXRleCBpcyBjcmVhdGVkICovCiB9CiAKIFZPSUQKIERlbGV0ZU5vblJlY3Vyc2l2ZU11dGV4KFBOUk1VVEVYIG11dGV4KQogewotCS8qIE5vIGluLXVzZSBjaGVjayAqLwotCUNsb3NlSGFuZGxlKG11dGV4LT5oZXZlbnQpIDsKLQltdXRleC0+aGV2ZW50ID0gTlVMTCA7IC8qIEp1c3QgaW4gY2FzZSAqLworICAgIC8qIE5vIGluLXVzZSBjaGVjayAqLworICAgIENsb3NlSGFuZGxlKG11dGV4LT5oZXZlbnQpIDsKKyAgICBtdXRleC0+aGV2ZW50ID0gTlVMTCA7IC8qIEp1c3QgaW4gY2FzZSAqLwogfQogCiBEV09SRAogRW50ZXJOb25SZWN1cnNpdmVNdXRleChQTlJNVVRFWCBtdXRleCwgQk9PTCB3YWl0KQogewotCS8qIEFzc3VtZSB0aGF0IHRoZSB0aHJlYWQgd2FpdHMgc3VjY2Vzc2Z1bGx5ICovCi0JRFdPUkQgcmV0IDsKKyAgICAvKiBBc3N1bWUgdGhhdCB0aGUgdGhyZWFkIHdhaXRzIHN1Y2Nlc3NmdWxseSAqLworICAgIERXT1JEIHJldCA7CiAKLQkvKiBJbnRlcmxvY2tlZEluY3JlbWVudCgmbXV0ZXgtPm93bmVkKSA9PSAwIG1lYW5zIHRoYXQgbm8gdGhyZWFkIGN1cnJlbnRseSBvd25zIHRoZSBtdXRleCAqLwotCWlmICghd2FpdCkKLQl7Ci0JCWlmIChJbnRlcmxvY2tlZENvbXBhcmVFeGNoYW5nZSgmbXV0ZXgtPm93bmVkLCAwLCAtMSkgIT0gLTEpCi0JCQlyZXR1cm4gV0FJVF9USU1FT1VUIDsKLQkJcmV0ID0gV0FJVF9PQkpFQ1RfMCA7Ci0JfQotCWVsc2UKLQkJcmV0ID0gSW50ZXJsb2NrZWRJbmNyZW1lbnQoJm11dGV4LT5vd25lZCkgPwotCQkJLyogU29tZSB0aHJlYWQgb3ducyB0aGUgbXV0ZXgsIGxldCdzIHdhaXQuLi4gKi8KLQkJCVdhaXRGb3JTaW5nbGVPYmplY3QobXV0ZXgtPmhldmVudCwgSU5GSU5JVEUpIDogV0FJVF9PQkpFQ1RfMCA7CisgICAgLyogSW50ZXJsb2NrZWRJbmNyZW1lbnQoJm11dGV4LT5vd25lZCkgPT0gMCBtZWFucyB0aGF0IG5vIHRocmVhZCBjdXJyZW50bHkgb3ducyB0aGUgbXV0ZXggKi8KKyAgICBpZiAoIXdhaXQpCisgICAgeworICAgICAgICBpZiAoSW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2UoJm11dGV4LT5vd25lZCwgMCwgLTEpICE9IC0xKQorICAgICAgICAgICAgcmV0dXJuIFdBSVRfVElNRU9VVCA7CisgICAgICAgIHJldCA9IFdBSVRfT0JKRUNUXzAgOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldCA9IEludGVybG9ja2VkSW5jcmVtZW50KCZtdXRleC0+b3duZWQpID8KKyAgICAgICAgICAgIC8qIFNvbWUgdGhyZWFkIG93bnMgdGhlIG11dGV4LCBsZXQncyB3YWl0Li4uICovCisgICAgICAgICAgICBXYWl0Rm9yU2luZ2xlT2JqZWN0KG11dGV4LT5oZXZlbnQsIElORklOSVRFKSA6IFdBSVRfT0JKRUNUXzAgOwogCi0JbXV0ZXgtPnRocmVhZF9pZCA9IEdldEN1cnJlbnRUaHJlYWRJZCgpIDsgLyogV2Ugb3duIGl0ICovCi0JcmV0dXJuIHJldCA7CisgICAgbXV0ZXgtPnRocmVhZF9pZCA9IEdldEN1cnJlbnRUaHJlYWRJZCgpIDsgLyogV2Ugb3duIGl0ICovCisgICAgcmV0dXJuIHJldCA7CiB9CiAKIEJPT0wKIExlYXZlTm9uUmVjdXJzaXZlTXV0ZXgoUE5STVVURVggbXV0ZXgpCiB7Ci0JLyogV2UgZG9uJ3Qgb3duIHRoZSBtdXRleCAqLwotCW11dGV4LT50aHJlYWRfaWQgPSAwIDsKLQlyZXR1cm4KLQkJSW50ZXJsb2NrZWREZWNyZW1lbnQoJm11dGV4LT5vd25lZCkgPCAwIHx8Ci0JCVNldEV2ZW50KG11dGV4LT5oZXZlbnQpIDsgLyogT3RoZXIgdGhyZWFkcyBhcmUgd2FpdGluZywgd2FrZSBvbmUgb24gdGhlbSB1cCAqLworICAgIC8qIFdlIGRvbid0IG93biB0aGUgbXV0ZXggKi8KKyAgICBtdXRleC0+dGhyZWFkX2lkID0gMCA7CisgICAgcmV0dXJuCisgICAgICAgIEludGVybG9ja2VkRGVjcmVtZW50KCZtdXRleC0+b3duZWQpIDwgMCB8fAorICAgICAgICBTZXRFdmVudChtdXRleC0+aGV2ZW50KSA7IC8qIE90aGVyIHRocmVhZHMgYXJlIHdhaXRpbmcsIHdha2Ugb25lIG9uIHRoZW0gdXAgKi8KIH0KIAogUE5STVVURVgKIEFsbG9jTm9uUmVjdXJzaXZlTXV0ZXgodm9pZCkKIHsKLQlQTlJNVVRFWCBtdXRleCA9IChQTlJNVVRFWCltYWxsb2Moc2l6ZW9mKE5STVVURVgpKSA7Ci0JaWYgKG11dGV4ICYmICFJbml0aWFsaXplTm9uUmVjdXJzaXZlTXV0ZXgobXV0ZXgpKQotCXsKLQkJZnJlZShtdXRleCkgOwotCQltdXRleCA9IE5VTEwgOwotCX0KLQlyZXR1cm4gbXV0ZXggOworICAgIFBOUk1VVEVYIG11dGV4ID0gKFBOUk1VVEVYKW1hbGxvYyhzaXplb2YoTlJNVVRFWCkpIDsKKyAgICBpZiAobXV0ZXggJiYgIUluaXRpYWxpemVOb25SZWN1cnNpdmVNdXRleChtdXRleCkpCisgICAgeworICAgICAgICBmcmVlKG11dGV4KSA7CisgICAgICAgIG11dGV4ID0gTlVMTCA7CisgICAgfQorICAgIHJldHVybiBtdXRleCA7CiB9CiAKIHZvaWQKIEZyZWVOb25SZWN1cnNpdmVNdXRleChQTlJNVVRFWCBtdXRleCkKIHsKLQlpZiAobXV0ZXgpCi0JewotCQlEZWxldGVOb25SZWN1cnNpdmVNdXRleChtdXRleCkgOwotCQlmcmVlKG11dGV4KSA7Ci0JfQorICAgIGlmIChtdXRleCkKKyAgICB7CisgICAgICAgIERlbGV0ZU5vblJlY3Vyc2l2ZU11dGV4KG11dGV4KSA7CisgICAgICAgIGZyZWUobXV0ZXgpIDsKKyAgICB9CiB9CiAKIGxvbmcgUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCh2b2lkKTsKQEAgLTEwMiw2NSArMTAyLDY1IEBACiAgKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewotCXZvaWQgKCpmdW5jKSh2b2lkKik7Ci0Jdm9pZCAqYXJnOwotCWxvbmcgaWQ7Ci0JSEFORExFIGRvbmU7CisgICAgdm9pZCAoKmZ1bmMpKHZvaWQqKTsKKyAgICB2b2lkICphcmc7CisgICAgbG9uZyBpZDsKKyAgICBIQU5ETEUgZG9uZTsKIH0gY2FsbG9iajsKIAogc3RhdGljIGludAogYm9vdHN0cmFwKHZvaWQgKmNhbGwpCiB7Ci0JY2FsbG9iaiAqb2JqID0gKGNhbGxvYmoqKWNhbGw7Ci0JLyogY29weSBjYWxsb2JqIHNpbmNlIG90aGVyIHRocmVhZCBtaWdodCBmcmVlIGl0IGJlZm9yZSB3ZSdyZSBkb25lICovCi0Jdm9pZCAoKmZ1bmMpKHZvaWQqKSA9IG9iai0+ZnVuYzsKLQl2b2lkICphcmcgPSBvYmotPmFyZzsKKyAgICBjYWxsb2JqICpvYmogPSAoY2FsbG9iaiopY2FsbDsKKyAgICAvKiBjb3B5IGNhbGxvYmogc2luY2Ugb3RoZXIgdGhyZWFkIG1pZ2h0IGZyZWUgaXQgYmVmb3JlIHdlJ3JlIGRvbmUgKi8KKyAgICB2b2lkICgqZnVuYykodm9pZCopID0gb2JqLT5mdW5jOworICAgIHZvaWQgKmFyZyA9IG9iai0+YXJnOwogCi0Jb2JqLT5pZCA9IFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKTsKLQlSZWxlYXNlU2VtYXBob3JlKG9iai0+ZG9uZSwgMSwgTlVMTCk7Ci0JZnVuYyhhcmcpOwotCXJldHVybiAwOworICAgIG9iai0+aWQgPSBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCk7CisgICAgUmVsZWFzZVNlbWFwaG9yZShvYmotPmRvbmUsIDEsIE5VTEwpOworICAgIGZ1bmMoYXJnKTsKKyAgICByZXR1cm4gMDsKIH0KIAogbG9uZwogUHlUaHJlYWRfc3RhcnRfbmV3X3RocmVhZCh2b2lkICgqZnVuYykodm9pZCAqKSwgdm9pZCAqYXJnKQogewotCVB5X3VpbnRwdHJfdCBydjsKLQljYWxsb2JqIG9iajsKKyAgICBQeV91aW50cHRyX3QgcnY7CisgICAgY2FsbG9iaiBvYmo7CiAKLQlkcHJpbnRmKCgiJWxkOiBQeVRocmVhZF9zdGFydF9uZXdfdGhyZWFkIGNhbGxlZFxuIiwKLQkJIFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSkpOwotCWlmICghaW5pdGlhbGl6ZWQpCi0JCVB5VGhyZWFkX2luaXRfdGhyZWFkKCk7CisgICAgZHByaW50ZigoIiVsZDogUHlUaHJlYWRfc3RhcnRfbmV3X3RocmVhZCBjYWxsZWRcbiIsCisgICAgICAgICAgICAgUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpKSk7CisgICAgaWYgKCFpbml0aWFsaXplZCkKKyAgICAgICAgUHlUaHJlYWRfaW5pdF90aHJlYWQoKTsKIAotCW9iai5pZCA9IC0xOwkvKiBndWlsdHkgdW50aWwgcHJvdmVkIGlubm9jZW50ICovCi0Jb2JqLmZ1bmMgPSBmdW5jOwotCW9iai5hcmcgPSBhcmc7Ci0Jb2JqLmRvbmUgPSBDcmVhdGVTZW1hcGhvcmUoTlVMTCwgMCwgMSwgTlVMTCk7Ci0JaWYgKG9iai5kb25lID09IE5VTEwpCi0JCXJldHVybiAtMTsKKyAgICBvYmouaWQgPSAtMTsgICAgICAgIC8qIGd1aWx0eSB1bnRpbCBwcm92ZWQgaW5ub2NlbnQgKi8KKyAgICBvYmouZnVuYyA9IGZ1bmM7CisgICAgb2JqLmFyZyA9IGFyZzsKKyAgICBvYmouZG9uZSA9IENyZWF0ZVNlbWFwaG9yZShOVUxMLCAwLCAxLCBOVUxMKTsKKyAgICBpZiAob2JqLmRvbmUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0JcnYgPSBfYmVnaW50aHJlYWQoYm9vdHN0cmFwLAotCQkJICBQeV9TQUZFX0RPV05DQVNUKF9weXRocmVhZF9zdGFja3NpemUsCi0JCQkJCSAgIFB5X3NzaXplX3QsIGludCksCi0JCQkgICZvYmopOwotCWlmIChydiA9PSAoUHlfdWludHB0cl90KS0xKSB7Ci0JCS8qIEkndmUgc2VlbiBlcnJubyA9PSBFQUdBSU4gaGVyZSwgd2hpY2ggbWVhbnMgInRoZXJlIGFyZQotCQkgKiB0b28gbWFueSB0aHJlYWRzIi4KLQkJICovCi0JCWRwcmludGYoKCIlbGQ6IFB5VGhyZWFkX3N0YXJ0X25ld190aHJlYWQgZmFpbGVkOiAlcCBlcnJubyAlZFxuIiwKLQkJICAgICAgICAgUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpLCAodm9pZCopcnYsIGVycm5vKSk7Ci0JCW9iai5pZCA9IC0xOwotCX0KLQllbHNlIHsKLQkJZHByaW50ZigoIiVsZDogUHlUaHJlYWRfc3RhcnRfbmV3X3RocmVhZCBzdWNjZWVkZWQ6ICVwXG4iLAotCQkgICAgICAgICBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCksICh2b2lkKilydikpOwotCQkvKiB3YWl0IGZvciB0aHJlYWQgdG8gaW5pdGlhbGl6ZSwgc28gd2UgY2FuIGdldCBpdHMgaWQgKi8KLQkJV2FpdEZvclNpbmdsZU9iamVjdChvYmouZG9uZSwgSU5GSU5JVEUpOwotCQlhc3NlcnQob2JqLmlkICE9IC0xKTsKLQl9Ci0JQ2xvc2VIYW5kbGUoKEhBTkRMRSlvYmouZG9uZSk7Ci0JcmV0dXJuIG9iai5pZDsKKyAgICBydiA9IF9iZWdpbnRocmVhZChib290c3RyYXAsCisgICAgICAgICAgICAgICAgICAgICAgUHlfU0FGRV9ET1dOQ0FTVChfcHl0aHJlYWRfc3RhY2tzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCwgaW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAmb2JqKTsKKyAgICBpZiAocnYgPT0gKFB5X3VpbnRwdHJfdCktMSkgeworICAgICAgICAvKiBJJ3ZlIHNlZW4gZXJybm8gPT0gRUFHQUlOIGhlcmUsIHdoaWNoIG1lYW5zICJ0aGVyZSBhcmUKKyAgICAgICAgICogdG9vIG1hbnkgdGhyZWFkcyIuCisgICAgICAgICAqLworICAgICAgICBkcHJpbnRmKCgiJWxkOiBQeVRocmVhZF9zdGFydF9uZXdfdGhyZWFkIGZhaWxlZDogJXAgZXJybm8gJWRcbiIsCisgICAgICAgICAgICAgICAgIFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSwgKHZvaWQqKXJ2LCBlcnJubykpOworICAgICAgICBvYmouaWQgPSAtMTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGRwcmludGYoKCIlbGQ6IFB5VGhyZWFkX3N0YXJ0X25ld190aHJlYWQgc3VjY2VlZGVkOiAlcFxuIiwKKyAgICAgICAgICAgICAgICAgUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpLCAodm9pZCopcnYpKTsKKyAgICAgICAgLyogd2FpdCBmb3IgdGhyZWFkIHRvIGluaXRpYWxpemUsIHNvIHdlIGNhbiBnZXQgaXRzIGlkICovCisgICAgICAgIFdhaXRGb3JTaW5nbGVPYmplY3Qob2JqLmRvbmUsIElORklOSVRFKTsKKyAgICAgICAgYXNzZXJ0KG9iai5pZCAhPSAtMSk7CisgICAgfQorICAgIENsb3NlSGFuZGxlKChIQU5ETEUpb2JqLmRvbmUpOworICAgIHJldHVybiBvYmouaWQ7CiB9CiAKIC8qCkBAIC0xNzAsNTggKzE3MCw1OCBAQAogbG9uZwogUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCh2b2lkKQogewotCWlmICghaW5pdGlhbGl6ZWQpCi0JCVB5VGhyZWFkX2luaXRfdGhyZWFkKCk7CisgICAgaWYgKCFpbml0aWFsaXplZCkKKyAgICAgICAgUHlUaHJlYWRfaW5pdF90aHJlYWQoKTsKIAotCXJldHVybiBHZXRDdXJyZW50VGhyZWFkSWQoKTsKKyAgICByZXR1cm4gR2V0Q3VycmVudFRocmVhZElkKCk7CiB9CiAKIHN0YXRpYyB2b2lkCiBkb19QeVRocmVhZF9leGl0X3RocmVhZChpbnQgbm9fY2xlYW51cCkKIHsKLQlkcHJpbnRmKCgiJWxkOiBQeVRocmVhZF9leGl0X3RocmVhZCBjYWxsZWRcbiIsIFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSkpOwotCWlmICghaW5pdGlhbGl6ZWQpCi0JCWlmIChub19jbGVhbnVwKQotCQkJX2V4aXQoMCk7Ci0JCWVsc2UKLQkJCWV4aXQoMCk7Ci0JX2VuZHRocmVhZCgpOworICAgIGRwcmludGYoKCIlbGQ6IFB5VGhyZWFkX2V4aXRfdGhyZWFkIGNhbGxlZFxuIiwgUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpKSk7CisgICAgaWYgKCFpbml0aWFsaXplZCkKKyAgICAgICAgaWYgKG5vX2NsZWFudXApCisgICAgICAgICAgICBfZXhpdCgwKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZXhpdCgwKTsKKyAgICBfZW5kdGhyZWFkKCk7CiB9CiAKIHZvaWQKIFB5VGhyZWFkX2V4aXRfdGhyZWFkKHZvaWQpCiB7Ci0JZG9fUHlUaHJlYWRfZXhpdF90aHJlYWQoMCk7CisgICAgZG9fUHlUaHJlYWRfZXhpdF90aHJlYWQoMCk7CiB9CiAKIHZvaWQKIFB5VGhyZWFkX19leGl0X3RocmVhZCh2b2lkKQogewotCWRvX1B5VGhyZWFkX2V4aXRfdGhyZWFkKDEpOworICAgIGRvX1B5VGhyZWFkX2V4aXRfdGhyZWFkKDEpOwogfQogCiAjaWZuZGVmIE5PX0VYSVRfUFJPRwogc3RhdGljIHZvaWQKIGRvX1B5VGhyZWFkX2V4aXRfcHJvZyhpbnQgc3RhdHVzLCBpbnQgbm9fY2xlYW51cCkKIHsKLQlkcHJpbnRmKCgiUHlUaHJlYWRfZXhpdF9wcm9nKCVkKSBjYWxsZWRcbiIsIHN0YXR1cykpOwotCWlmICghaW5pdGlhbGl6ZWQpCi0JCWlmIChub19jbGVhbnVwKQotCQkJX2V4aXQoc3RhdHVzKTsKLQkJZWxzZQotCQkJZXhpdChzdGF0dXMpOworICAgIGRwcmludGYoKCJQeVRocmVhZF9leGl0X3Byb2coJWQpIGNhbGxlZFxuIiwgc3RhdHVzKSk7CisgICAgaWYgKCFpbml0aWFsaXplZCkKKyAgICAgICAgaWYgKG5vX2NsZWFudXApCisgICAgICAgICAgICBfZXhpdChzdGF0dXMpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBleGl0KHN0YXR1cyk7CiB9CiAKIHZvaWQKIFB5VGhyZWFkX2V4aXRfcHJvZyhpbnQgc3RhdHVzKQogewotCWRvX1B5VGhyZWFkX2V4aXRfcHJvZyhzdGF0dXMsIDApOworICAgIGRvX1B5VGhyZWFkX2V4aXRfcHJvZyhzdGF0dXMsIDApOwogfQogCiB2b2lkCiBQeVRocmVhZF9fZXhpdF9wcm9nKGludCBzdGF0dXMpCiB7Ci0JZG9fUHlUaHJlYWRfZXhpdF9wcm9nKHN0YXR1cywgMSk7CisgICAgZG9fUHlUaHJlYWRfZXhpdF9wcm9nKHN0YXR1cywgMSk7CiB9CiAjZW5kaWYgLyogTk9fRVhJVF9QUk9HICovCiAKQEAgLTIzMywyNSArMjMzLDI1IEBACiBQeVRocmVhZF90eXBlX2xvY2sKIFB5VGhyZWFkX2FsbG9jYXRlX2xvY2sodm9pZCkKIHsKLQlQTlJNVVRFWCBhTG9jazsKKyAgICBQTlJNVVRFWCBhTG9jazsKIAotCWRwcmludGYoKCJQeVRocmVhZF9hbGxvY2F0ZV9sb2NrIGNhbGxlZFxuIikpOwotCWlmICghaW5pdGlhbGl6ZWQpCi0JCVB5VGhyZWFkX2luaXRfdGhyZWFkKCk7CisgICAgZHByaW50ZigoIlB5VGhyZWFkX2FsbG9jYXRlX2xvY2sgY2FsbGVkXG4iKSk7CisgICAgaWYgKCFpbml0aWFsaXplZCkKKyAgICAgICAgUHlUaHJlYWRfaW5pdF90aHJlYWQoKTsKIAotCWFMb2NrID0gQWxsb2NOb25SZWN1cnNpdmVNdXRleCgpIDsKKyAgICBhTG9jayA9IEFsbG9jTm9uUmVjdXJzaXZlTXV0ZXgoKSA7CiAKLQlkcHJpbnRmKCgiJWxkOiBQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKCkgLT4gJXBcbiIsIFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSwgYUxvY2spKTsKKyAgICBkcHJpbnRmKCgiJWxkOiBQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKCkgLT4gJXBcbiIsIFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSwgYUxvY2spKTsKIAotCXJldHVybiAoUHlUaHJlYWRfdHlwZV9sb2NrKSBhTG9jazsKKyAgICByZXR1cm4gKFB5VGhyZWFkX3R5cGVfbG9jaykgYUxvY2s7CiB9CiAKIHZvaWQKIFB5VGhyZWFkX2ZyZWVfbG9jayhQeVRocmVhZF90eXBlX2xvY2sgYUxvY2spCiB7Ci0JZHByaW50ZigoIiVsZDogUHlUaHJlYWRfZnJlZV9sb2NrKCVwKSBjYWxsZWRcbiIsIFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSxhTG9jaykpOworICAgIGRwcmludGYoKCIlbGQ6IFB5VGhyZWFkX2ZyZWVfbG9jayglcCkgY2FsbGVkXG4iLCBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCksYUxvY2spKTsKIAotCUZyZWVOb25SZWN1cnNpdmVNdXRleChhTG9jaykgOworICAgIEZyZWVOb25SZWN1cnNpdmVNdXRleChhTG9jaykgOwogfQogCiAvKgpAQCAtMjYzLDI5ICsyNjMsMjkgQEAKIGludAogUHlUaHJlYWRfYWNxdWlyZV9sb2NrKFB5VGhyZWFkX3R5cGVfbG9jayBhTG9jaywgaW50IHdhaXRmbGFnKQogewotCWludCBzdWNjZXNzIDsKKyAgICBpbnQgc3VjY2VzcyA7CiAKLQlkcHJpbnRmKCgiJWxkOiBQeVRocmVhZF9hY3F1aXJlX2xvY2soJXAsICVkKSBjYWxsZWRcbiIsIFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSxhTG9jaywgd2FpdGZsYWcpKTsKKyAgICBkcHJpbnRmKCgiJWxkOiBQeVRocmVhZF9hY3F1aXJlX2xvY2soJXAsICVkKSBjYWxsZWRcbiIsIFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSxhTG9jaywgd2FpdGZsYWcpKTsKIAotCXN1Y2Nlc3MgPSBhTG9jayAmJiBFbnRlck5vblJlY3Vyc2l2ZU11dGV4KChQTlJNVVRFWCkgYUxvY2ssICh3YWl0ZmxhZyA/IElORklOSVRFIDogMCkpID09IFdBSVRfT0JKRUNUXzAgOworICAgIHN1Y2Nlc3MgPSBhTG9jayAmJiBFbnRlck5vblJlY3Vyc2l2ZU11dGV4KChQTlJNVVRFWCkgYUxvY2ssICh3YWl0ZmxhZyA/IElORklOSVRFIDogMCkpID09IFdBSVRfT0JKRUNUXzAgOwogCi0JZHByaW50ZigoIiVsZDogUHlUaHJlYWRfYWNxdWlyZV9sb2NrKCVwLCAlZCkgLT4gJWRcbiIsIFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSxhTG9jaywgd2FpdGZsYWcsIHN1Y2Nlc3MpKTsKKyAgICBkcHJpbnRmKCgiJWxkOiBQeVRocmVhZF9hY3F1aXJlX2xvY2soJXAsICVkKSAtPiAlZFxuIiwgUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpLGFMb2NrLCB3YWl0ZmxhZywgc3VjY2VzcykpOwogCi0JcmV0dXJuIHN1Y2Nlc3M7CisgICAgcmV0dXJuIHN1Y2Nlc3M7CiB9CiAKIHZvaWQKIFB5VGhyZWFkX3JlbGVhc2VfbG9jayhQeVRocmVhZF90eXBlX2xvY2sgYUxvY2spCiB7Ci0JZHByaW50ZigoIiVsZDogUHlUaHJlYWRfcmVsZWFzZV9sb2NrKCVwKSBjYWxsZWRcbiIsIFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSxhTG9jaykpOworICAgIGRwcmludGYoKCIlbGQ6IFB5VGhyZWFkX3JlbGVhc2VfbG9jayglcCkgY2FsbGVkXG4iLCBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCksYUxvY2spKTsKIAotCWlmICghKGFMb2NrICYmIExlYXZlTm9uUmVjdXJzaXZlTXV0ZXgoKFBOUk1VVEVYKSBhTG9jaykpKQotCQlkcHJpbnRmKCgiJWxkOiBDb3VsZCBub3QgUHlUaHJlYWRfcmVsZWFzZV9sb2NrKCVwKSBlcnJvcjogJWxkXG4iLCBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCksIGFMb2NrLCBHZXRMYXN0RXJyb3IoKSkpOworICAgIGlmICghKGFMb2NrICYmIExlYXZlTm9uUmVjdXJzaXZlTXV0ZXgoKFBOUk1VVEVYKSBhTG9jaykpKQorICAgICAgICBkcHJpbnRmKCgiJWxkOiBDb3VsZCBub3QgUHlUaHJlYWRfcmVsZWFzZV9sb2NrKCVwKSBlcnJvcjogJWxkXG4iLCBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCksIGFMb2NrLCBHZXRMYXN0RXJyb3IoKSkpOwogfQogCiAvKiBtaW5pbXVtL21heGltdW0gdGhyZWFkIHN0YWNrIHNpemVzIHN1cHBvcnRlZCAqLwotI2RlZmluZSBUSFJFQURfTUlOX1NUQUNLU0laRQkweDgwMDAJCS8qIDMya0IgKi8KLSNkZWZpbmUgVEhSRUFEX01BWF9TVEFDS1NJWkUJMHgxMDAwMDAwMAkvKiAyNTZNQiAqLworI2RlZmluZSBUSFJFQURfTUlOX1NUQUNLU0laRSAgICAweDgwMDAgICAgICAgICAgLyogMzJrQiAqLworI2RlZmluZSBUSFJFQURfTUFYX1NUQUNLU0laRSAgICAweDEwMDAwMDAwICAgICAgLyogMjU2TUIgKi8KIAogLyogc2V0IHRoZSB0aHJlYWQgc3RhY2sgc2l6ZS4KICAqIFJldHVybiAwIGlmIHNpemUgaXMgdmFsaWQsIC0xIG90aGVyd2lzZS4KQEAgLTI5MywxOSArMjkzLDE5IEBACiBzdGF0aWMgaW50CiBfcHl0aHJlYWRfbnRfc2V0X3N0YWNrc2l6ZShzaXplX3Qgc2l6ZSkKIHsKLQkvKiBzZXQgdG8gZGVmYXVsdCAqLwotCWlmIChzaXplID09IDApIHsKLQkJX3B5dGhyZWFkX3N0YWNrc2l6ZSA9IDA7Ci0JCXJldHVybiAwOwotCX0KKyAgICAvKiBzZXQgdG8gZGVmYXVsdCAqLworICAgIGlmIChzaXplID09IDApIHsKKyAgICAgICAgX3B5dGhyZWFkX3N0YWNrc2l6ZSA9IDA7CisgICAgICAgIHJldHVybiAwOworICAgIH0KIAotCS8qIHZhbGlkIHJhbmdlPyAqLwotCWlmIChzaXplID49IFRIUkVBRF9NSU5fU1RBQ0tTSVpFICYmIHNpemUgPCBUSFJFQURfTUFYX1NUQUNLU0laRSkgewotCQlfcHl0aHJlYWRfc3RhY2tzaXplID0gc2l6ZTsKLQkJcmV0dXJuIDA7Ci0JfQorICAgIC8qIHZhbGlkIHJhbmdlPyAqLworICAgIGlmIChzaXplID49IFRIUkVBRF9NSU5fU1RBQ0tTSVpFICYmIHNpemUgPCBUSFJFQURfTUFYX1NUQUNLU0laRSkgeworICAgICAgICBfcHl0aHJlYWRfc3RhY2tzaXplID0gc2l6ZTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCi0JcmV0dXJuIC0xOworICAgIHJldHVybiAtMTsKIH0KIAotI2RlZmluZSBUSFJFQURfU0VUX1NUQUNLU0laRSh4KQlfcHl0aHJlYWRfbnRfc2V0X3N0YWNrc2l6ZSh4KQorI2RlZmluZSBUSFJFQURfU0VUX1NUQUNLU0laRSh4KSBfcHl0aHJlYWRfbnRfc2V0X3N0YWNrc2l6ZSh4KQpkaWZmIC0tZ2l0IGEvUHl0aG9uL3RocmVhZF9vczIuaCBiL1B5dGhvbi90aHJlYWRfb3MyLmgKaW5kZXggMTJlZWVkNS4uMjgyODRiYiAxMDA2NDQKLS0tIGEvUHl0aG9uL3RocmVhZF9vczIuaAorKysgYi9QeXRob24vdGhyZWFkX29zMi5oCkBAIC0xNiwxMCArMTYsMTAgQEAKIAogLyogZGVmYXVsdCB0aHJlYWQgc3RhY2sgc2l6ZSBvZiA2NGtCICovCiAjaWYgIWRlZmluZWQoVEhSRUFEX1NUQUNLX1NJWkUpCi0jZGVmaW5lCVRIUkVBRF9TVEFDS19TSVpFCTB4MTAwMDAKKyNkZWZpbmUgVEhSRUFEX1NUQUNLX1NJWkUgICAgICAgMHgxMDAwMAogI2VuZGlmCiAKLSNkZWZpbmUgT1MyX1NUQUNLU0laRSh4KQkoeCA/IHggOiBUSFJFQURfU1RBQ0tfU0laRSkKKyNkZWZpbmUgT1MyX1NUQUNLU0laRSh4KSAgICAgICAgKHggPyB4IDogVEhSRUFEX1NUQUNLX1NJWkUpCiAKIC8qCiAgKiBJbml0aWFsaXphdGlvbiBvZiB0aGUgQyBwYWNrYWdlLCBzaG91bGQgbm90IGJlIG5lZWRlZC4KQEAgLTM1LDE1MyArMzUsMTUzIEBACiBsb25nCiBQeVRocmVhZF9zdGFydF9uZXdfdGhyZWFkKHZvaWQgKCpmdW5jKSh2b2lkICopLCB2b2lkICphcmcpCiB7Ci0JaW50IHRocmVhZF9pZDsKKyAgICBpbnQgdGhyZWFkX2lkOwogCi0JdGhyZWFkX2lkID0gX2JlZ2ludGhyZWFkKGZ1bmMsCi0JCQkJTlVMTCwKLQkJCQlPUzJfU1RBQ0tTSVpFKF9weXRocmVhZF9zdGFja3NpemUpLAotCQkJCWFyZyk7CisgICAgdGhyZWFkX2lkID0gX2JlZ2ludGhyZWFkKGZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUzJfU1RBQ0tTSVpFKF9weXRocmVhZF9zdGFja3NpemUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZyk7CiAKLQlpZiAodGhyZWFkX2lkID09IC0xKSB7Ci0JCWRwcmludGYoKCJfYmVnaW50aHJlYWQgZmFpbGVkLiByZXR1cm4gJWxkXG4iLCBlcnJubykpOwotCX0KKyAgICBpZiAodGhyZWFkX2lkID09IC0xKSB7CisgICAgICAgIGRwcmludGYoKCJfYmVnaW50aHJlYWQgZmFpbGVkLiByZXR1cm4gJWxkXG4iLCBlcnJubykpOworICAgIH0KIAotCXJldHVybiB0aHJlYWRfaWQ7CisgICAgcmV0dXJuIHRocmVhZF9pZDsKIH0KIAogbG9uZwogUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCh2b2lkKQogewogI2lmICFkZWZpbmVkKFBZQ0NfR0NDKQotCVBQSUIgcGliOwotCVBUSUIgdGliOworICAgIFBQSUIgcGliOworICAgIFBUSUIgdGliOwogI2VuZGlmCiAKLQlpZiAoIWluaXRpYWxpemVkKQotCQlQeVRocmVhZF9pbml0X3RocmVhZCgpOworICAgIGlmICghaW5pdGlhbGl6ZWQpCisgICAgICAgIFB5VGhyZWFkX2luaXRfdGhyZWFkKCk7CiAKICNpZiBkZWZpbmVkKFBZQ0NfR0NDKQotCXJldHVybiBfZ2V0dGlkKCk7CisgICAgcmV0dXJuIF9nZXR0aWQoKTsKICNlbHNlCi0JRG9zR2V0SW5mb0Jsb2NrcygmdGliLCAmcGliKTsKLQlyZXR1cm4gdGliLT50aWJfcHRpYjItPnRpYjJfdWx0aWQ7CisgICAgRG9zR2V0SW5mb0Jsb2NrcygmdGliLCAmcGliKTsKKyAgICByZXR1cm4gdGliLT50aWJfcHRpYjItPnRpYjJfdWx0aWQ7CiAjZW5kaWYKIH0KIAogc3RhdGljIHZvaWQKIGRvX1B5VGhyZWFkX2V4aXRfdGhyZWFkKGludCBub19jbGVhbnVwKQogewotCWRwcmludGYoKCIlbGQ6IFB5VGhyZWFkX2V4aXRfdGhyZWFkIGNhbGxlZFxuIiwKLQkJIFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSkpOwotCWlmICghaW5pdGlhbGl6ZWQpCi0JCWlmIChub19jbGVhbnVwKQotCQkJX2V4aXQoMCk7Ci0JCWVsc2UKLQkJCWV4aXQoMCk7Ci0JX2VuZHRocmVhZCgpOworICAgIGRwcmludGYoKCIlbGQ6IFB5VGhyZWFkX2V4aXRfdGhyZWFkIGNhbGxlZFxuIiwKKyAgICAgICAgICAgICBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCkpKTsKKyAgICBpZiAoIWluaXRpYWxpemVkKQorICAgICAgICBpZiAobm9fY2xlYW51cCkKKyAgICAgICAgICAgIF9leGl0KDApOworICAgICAgICBlbHNlCisgICAgICAgICAgICBleGl0KDApOworICAgIF9lbmR0aHJlYWQoKTsKIH0KIAotdm9pZCAKK3ZvaWQKIFB5VGhyZWFkX2V4aXRfdGhyZWFkKHZvaWQpCiB7Ci0JZG9fUHlUaHJlYWRfZXhpdF90aHJlYWQoMCk7CisgICAgZG9fUHlUaHJlYWRfZXhpdF90aHJlYWQoMCk7CiB9CiAKLXZvaWQgCit2b2lkCiBQeVRocmVhZF9fZXhpdF90aHJlYWQodm9pZCkKIHsKLQlkb19QeVRocmVhZF9leGl0X3RocmVhZCgxKTsKKyAgICBkb19QeVRocmVhZF9leGl0X3RocmVhZCgxKTsKIH0KIAogI2lmbmRlZiBOT19FWElUX1BST0cKLXN0YXRpYyB2b2lkIAorc3RhdGljIHZvaWQKIGRvX1B5VGhyZWFkX2V4aXRfcHJvZyhpbnQgc3RhdHVzLCBpbnQgbm9fY2xlYW51cCkKIHsKLQlkcHJpbnRmKCgiUHlUaHJlYWRfZXhpdF9wcm9nKCVkKSBjYWxsZWRcbiIsIHN0YXR1cykpOwotCWlmICghaW5pdGlhbGl6ZWQpCi0JCWlmIChub19jbGVhbnVwKQotCQkJX2V4aXQoc3RhdHVzKTsKLQkJZWxzZQotCQkJZXhpdChzdGF0dXMpOworICAgIGRwcmludGYoKCJQeVRocmVhZF9leGl0X3Byb2coJWQpIGNhbGxlZFxuIiwgc3RhdHVzKSk7CisgICAgaWYgKCFpbml0aWFsaXplZCkKKyAgICAgICAgaWYgKG5vX2NsZWFudXApCisgICAgICAgICAgICBfZXhpdChzdGF0dXMpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBleGl0KHN0YXR1cyk7CiB9CiAKLXZvaWQgCit2b2lkCiBQeVRocmVhZF9leGl0X3Byb2coaW50IHN0YXR1cykKIHsKLQlkb19QeVRocmVhZF9leGl0X3Byb2coc3RhdHVzLCAwKTsKKyAgICBkb19QeVRocmVhZF9leGl0X3Byb2coc3RhdHVzLCAwKTsKIH0KIAotdm9pZCAKK3ZvaWQKIFB5VGhyZWFkX19leGl0X3Byb2coaW50IHN0YXR1cykKIHsKLQlkb19QeVRocmVhZF9leGl0X3Byb2coc3RhdHVzLCAxKTsKKyAgICBkb19QeVRocmVhZF9leGl0X3Byb2coc3RhdHVzLCAxKTsKIH0KICNlbmRpZiAvKiBOT19FWElUX1BST0cgKi8KIAogLyoKICAqIExvY2sgc3VwcG9ydC4gIFRoaXMgaXMgaW1wbGVtZW50ZWQgd2l0aCBhbiBldmVudCBzZW1hcGhvcmUgYW5kIGNyaXRpY2FsCi0gKiBzZWN0aW9ucyB0byBtYWtlIGl0IGJlaGF2ZSBtb3JlIGxpa2UgYSBwb3NpeCBtdXRleCB0aGFuIGl0cyBPUy8yIAorICogc2VjdGlvbnMgdG8gbWFrZSBpdCBiZWhhdmUgbW9yZSBsaWtlIGEgcG9zaXggbXV0ZXggdGhhbiBpdHMgT1MvMgogICogY291bnRlcnBhcnRzLgogICovCiAKIHR5cGVkZWYgc3RydWN0IG9zMl9sb2NrX3QgewotCWludCBpc19zZXQ7Ci0JSEVWIGNoYW5nZWQ7CisgICAgaW50IGlzX3NldDsKKyAgICBIRVYgY2hhbmdlZDsKIH0gKnR5cGVfb3MyX2xvY2s7CiAKLVB5VGhyZWFkX3R5cGVfbG9jayAKK1B5VGhyZWFkX3R5cGVfbG9jawogUHlUaHJlYWRfYWxsb2NhdGVfbG9jayh2b2lkKQogewogI2lmIGRlZmluZWQoUFlDQ19HQ0MpCi0JX2ZtdXRleCAqc2VtID0gbWFsbG9jKHNpemVvZihfZm11dGV4KSk7Ci0JaWYgKCFpbml0aWFsaXplZCkKLQkJUHlUaHJlYWRfaW5pdF90aHJlYWQoKTsKLQlkcHJpbnRmKCgiJWxkOiBQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKCkgLT4gJWx4XG4iLAotCQkgUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpLAotCQkgKGxvbmcpc2VtKSk7Ci0JaWYgKF9mbXV0ZXhfY3JlYXRlKHNlbSwgMCkpIHsKLQkJZnJlZShzZW0pOwotCQlzZW0gPSBOVUxMOwotCX0KLQlyZXR1cm4gKFB5VGhyZWFkX3R5cGVfbG9jaylzZW07CisgICAgX2ZtdXRleCAqc2VtID0gbWFsbG9jKHNpemVvZihfZm11dGV4KSk7CisgICAgaWYgKCFpbml0aWFsaXplZCkKKyAgICAgICAgUHlUaHJlYWRfaW5pdF90aHJlYWQoKTsKKyAgICBkcHJpbnRmKCgiJWxkOiBQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKCkgLT4gJWx4XG4iLAorICAgICAgICAgICAgIFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSwKKyAgICAgICAgICAgICAobG9uZylzZW0pKTsKKyAgICBpZiAoX2ZtdXRleF9jcmVhdGUoc2VtLCAwKSkgeworICAgICAgICBmcmVlKHNlbSk7CisgICAgICAgIHNlbSA9IE5VTEw7CisgICAgfQorICAgIHJldHVybiAoUHlUaHJlYWRfdHlwZV9sb2NrKXNlbTsKICNlbHNlCi0JQVBJUkVUIHJjOwotCXR5cGVfb3MyX2xvY2sgbG9jayA9ICh0eXBlX29zMl9sb2NrKW1hbGxvYyhzaXplb2Yoc3RydWN0IG9zMl9sb2NrX3QpKTsKKyAgICBBUElSRVQgcmM7CisgICAgdHlwZV9vczJfbG9jayBsb2NrID0gKHR5cGVfb3MyX2xvY2spbWFsbG9jKHNpemVvZihzdHJ1Y3Qgb3MyX2xvY2tfdCkpOwogCi0JZHByaW50ZigoIlB5VGhyZWFkX2FsbG9jYXRlX2xvY2sgY2FsbGVkXG4iKSk7Ci0JaWYgKCFpbml0aWFsaXplZCkKLQkJUHlUaHJlYWRfaW5pdF90aHJlYWQoKTsKKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfYWxsb2NhdGVfbG9jayBjYWxsZWRcbiIpKTsKKyAgICBpZiAoIWluaXRpYWxpemVkKQorICAgICAgICBQeVRocmVhZF9pbml0X3RocmVhZCgpOwogCi0JbG9jay0+aXNfc2V0ID0gMDsKKyAgICBsb2NrLT5pc19zZXQgPSAwOwogCi0JRG9zQ3JlYXRlRXZlbnRTZW0oTlVMTCwgJmxvY2stPmNoYW5nZWQsIDAsIDApOworICAgIERvc0NyZWF0ZUV2ZW50U2VtKE5VTEwsICZsb2NrLT5jaGFuZ2VkLCAwLCAwKTsKIAotCWRwcmludGYoKCIlbGQ6IFB5VGhyZWFkX2FsbG9jYXRlX2xvY2soKSAtPiAlcFxuIiwgCi0JCSBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCksIAotICAgICAgICAJIGxvY2stPmNoYW5nZWQpKTsKKyAgICBkcHJpbnRmKCgiJWxkOiBQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKCkgLT4gJXBcbiIsCisgICAgICAgICAgICAgUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpLAorICAgICAgICAgICAgIGxvY2stPmNoYW5nZWQpKTsKIAotCXJldHVybiAoUHlUaHJlYWRfdHlwZV9sb2NrKWxvY2s7CisgICAgcmV0dXJuIChQeVRocmVhZF90eXBlX2xvY2spbG9jazsKICNlbmRpZgogfQogCi12b2lkIAordm9pZAogUHlUaHJlYWRfZnJlZV9sb2NrKFB5VGhyZWFkX3R5cGVfbG9jayBhTG9jaykKIHsKICNpZiAhZGVmaW5lZChQWUNDX0dDQykKLQl0eXBlX29zMl9sb2NrIGxvY2sgPSAodHlwZV9vczJfbG9jaylhTG9jazsKKyAgICB0eXBlX29zMl9sb2NrIGxvY2sgPSAodHlwZV9vczJfbG9jaylhTG9jazsKICNlbmRpZgogCi0JZHByaW50ZigoIiVsZDogUHlUaHJlYWRfZnJlZV9sb2NrKCVwKSBjYWxsZWRcbiIsCi0JCSBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCksYUxvY2spKTsKKyAgICBkcHJpbnRmKCgiJWxkOiBQeVRocmVhZF9mcmVlX2xvY2soJXApIGNhbGxlZFxuIiwKKyAgICAgICAgICAgICBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCksYUxvY2spKTsKIAogI2lmIGRlZmluZWQoUFlDQ19HQ0MpCi0JaWYgKGFMb2NrKSB7Ci0JCV9mbXV0ZXhfY2xvc2UoKF9mbXV0ZXggKilhTG9jayk7Ci0JCWZyZWUoKF9mbXV0ZXggKilhTG9jayk7Ci0JfQorICAgIGlmIChhTG9jaykgeworICAgICAgICBfZm11dGV4X2Nsb3NlKChfZm11dGV4ICopYUxvY2spOworICAgICAgICBmcmVlKChfZm11dGV4ICopYUxvY2spOworICAgIH0KICNlbHNlCi0JRG9zQ2xvc2VFdmVudFNlbShsb2NrLT5jaGFuZ2VkKTsKLQlmcmVlKGFMb2NrKTsKKyAgICBEb3NDbG9zZUV2ZW50U2VtKGxvY2stPmNoYW5nZWQpOworICAgIGZyZWUoYUxvY2spOwogI2VuZGlmCiB9CiAKQEAgLTE5MCw5OCArMTkwLDk4IEBACiAgKgogICogYW5kIDAgaWYgdGhlIGxvY2sgd2FzIG5vdCBhY3F1aXJlZC4KICAqLwotaW50IAoraW50CiBQeVRocmVhZF9hY3F1aXJlX2xvY2soUHlUaHJlYWRfdHlwZV9sb2NrIGFMb2NrLCBpbnQgd2FpdGZsYWcpCiB7CiAjaWYgIWRlZmluZWQoUFlDQ19HQ0MpCi0JaW50ICAgZG9uZSA9IDA7Ci0JVUxPTkcgY291bnQ7Ci0JUElEICAgcGlkID0gMDsKLQlUSUQgICB0aWQgPSAwOwotCXR5cGVfb3MyX2xvY2sgbG9jayA9ICh0eXBlX29zMl9sb2NrKWFMb2NrOworICAgIGludCAgIGRvbmUgPSAwOworICAgIFVMT05HIGNvdW50OworICAgIFBJRCAgIHBpZCA9IDA7CisgICAgVElEICAgdGlkID0gMDsKKyAgICB0eXBlX29zMl9sb2NrIGxvY2sgPSAodHlwZV9vczJfbG9jaylhTG9jazsKICNlbmRpZgogCi0JZHByaW50ZigoIiVsZDogUHlUaHJlYWRfYWNxdWlyZV9sb2NrKCVwLCAlZCkgY2FsbGVkXG4iLAotCQkgUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpLAotCQkgYUxvY2ssCi0JCSB3YWl0ZmxhZykpOworICAgIGRwcmludGYoKCIlbGQ6IFB5VGhyZWFkX2FjcXVpcmVfbG9jayglcCwgJWQpIGNhbGxlZFxuIiwKKyAgICAgICAgICAgICBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCksCisgICAgICAgICAgICAgYUxvY2ssCisgICAgICAgICAgICAgd2FpdGZsYWcpKTsKIAogI2lmIGRlZmluZWQoUFlDQ19HQ0MpCi0JLyogYWx3YXlzIHN1Y2Nlc3NmdWwgaWYgdGhlIGxvY2sgZG9lc24ndCBleGlzdCAqLwotCWlmIChhTG9jayAmJgotCSAgICBfZm11dGV4X3JlcXVlc3QoKF9mbXV0ZXggKilhTG9jaywgd2FpdGZsYWcgPyAwIDogX0ZNUl9OT1dBSVQpKQotCQlyZXR1cm4gMDsKKyAgICAvKiBhbHdheXMgc3VjY2Vzc2Z1bCBpZiB0aGUgbG9jayBkb2Vzbid0IGV4aXN0ICovCisgICAgaWYgKGFMb2NrICYmCisgICAgICAgIF9mbXV0ZXhfcmVxdWVzdCgoX2ZtdXRleCAqKWFMb2NrLCB3YWl0ZmxhZyA/IDAgOiBfRk1SX05PV0FJVCkpCisgICAgICAgIHJldHVybiAwOwogI2Vsc2UKLQl3aGlsZSAoIWRvbmUpIHsKLQkJLyogaWYgdGhlIGxvY2sgaXMgY3VycmVudGx5IHNldCwgd2UgaGF2ZSB0byB3YWl0IGZvcgotCQkgKiB0aGUgc3RhdGUgdG8gY2hhbmdlCi0JCSAqLwotCQlpZiAobG9jay0+aXNfc2V0KSB7Ci0JCQlpZiAoIXdhaXRmbGFnKQotCQkJCXJldHVybiAwOwotCQkJRG9zV2FpdEV2ZW50U2VtKGxvY2stPmNoYW5nZWQsIFNFTV9JTkRFRklOSVRFX1dBSVQpOwotCQl9CisgICAgd2hpbGUgKCFkb25lKSB7CisgICAgICAgIC8qIGlmIHRoZSBsb2NrIGlzIGN1cnJlbnRseSBzZXQsIHdlIGhhdmUgdG8gd2FpdCBmb3IKKyAgICAgICAgICogdGhlIHN0YXRlIHRvIGNoYW5nZQorICAgICAgICAgKi8KKyAgICAgICAgaWYgKGxvY2stPmlzX3NldCkgeworICAgICAgICAgICAgaWYgKCF3YWl0ZmxhZykKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIERvc1dhaXRFdmVudFNlbShsb2NrLT5jaGFuZ2VkLCBTRU1fSU5ERUZJTklURV9XQUlUKTsKKyAgICAgICAgfQogCi0JCS8qIGVudGVyIGEgY3JpdGljYWwgc2VjdGlvbiBhbmQgdHJ5IHRvIGdldCB0aGUgc2VtYXBob3JlLiAgSWYKLQkJICogaXQgaXMgc3RpbGwgbG9ja2VkLCB3ZSB3aWxsIHRyeSBhZ2Fpbi4KLQkJICovCi0JCWlmIChEb3NFbnRlckNyaXRTZWMoKSkKLQkJCXJldHVybiAwOworICAgICAgICAvKiBlbnRlciBhIGNyaXRpY2FsIHNlY3Rpb24gYW5kIHRyeSB0byBnZXQgdGhlIHNlbWFwaG9yZS4gIElmCisgICAgICAgICAqIGl0IGlzIHN0aWxsIGxvY2tlZCwgd2Ugd2lsbCB0cnkgYWdhaW4uCisgICAgICAgICAqLworICAgICAgICBpZiAoRG9zRW50ZXJDcml0U2VjKCkpCisgICAgICAgICAgICByZXR1cm4gMDsKIAotCQlpZiAoIWxvY2stPmlzX3NldCkgewotCQkJbG9jay0+aXNfc2V0ID0gMTsKLQkJCURvc1Jlc2V0RXZlbnRTZW0obG9jay0+Y2hhbmdlZCwgJmNvdW50KTsKLQkJCWRvbmUgPSAxOwotCQl9CisgICAgICAgIGlmICghbG9jay0+aXNfc2V0KSB7CisgICAgICAgICAgICBsb2NrLT5pc19zZXQgPSAxOworICAgICAgICAgICAgRG9zUmVzZXRFdmVudFNlbShsb2NrLT5jaGFuZ2VkLCAmY291bnQpOworICAgICAgICAgICAgZG9uZSA9IDE7CisgICAgICAgIH0KIAotCQlEb3NFeGl0Q3JpdFNlYygpOwotCX0KKyAgICAgICAgRG9zRXhpdENyaXRTZWMoKTsKKyAgICB9CiAjZW5kaWYKIAotCXJldHVybiAxOworICAgIHJldHVybiAxOwogfQogCiB2b2lkCiBQeVRocmVhZF9yZWxlYXNlX2xvY2soUHlUaHJlYWRfdHlwZV9sb2NrIGFMb2NrKQogewogI2lmICFkZWZpbmVkKFBZQ0NfR0NDKQotCXR5cGVfb3MyX2xvY2sgbG9jayA9ICh0eXBlX29zMl9sb2NrKWFMb2NrOworICAgIHR5cGVfb3MyX2xvY2sgbG9jayA9ICh0eXBlX29zMl9sb2NrKWFMb2NrOwogI2VuZGlmCiAKLQlkcHJpbnRmKCgiJWxkOiBQeVRocmVhZF9yZWxlYXNlX2xvY2soJXApIGNhbGxlZFxuIiwKLQkJIFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSwKLQkJIGFMb2NrKSk7CisgICAgZHByaW50ZigoIiVsZDogUHlUaHJlYWRfcmVsZWFzZV9sb2NrKCVwKSBjYWxsZWRcbiIsCisgICAgICAgICAgICAgUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpLAorICAgICAgICAgICAgIGFMb2NrKSk7CiAKICNpZiBkZWZpbmVkKFBZQ0NfR0NDKQotCWlmIChhTG9jaykKLQkJX2ZtdXRleF9yZWxlYXNlKChfZm11dGV4ICopYUxvY2spOworICAgIGlmIChhTG9jaykKKyAgICAgICAgX2ZtdXRleF9yZWxlYXNlKChfZm11dGV4ICopYUxvY2spOwogI2Vsc2UKLQlpZiAoIWxvY2stPmlzX3NldCkgewotCQlkcHJpbnRmKCgiJWxkOiBDb3VsZCBub3QgUHlUaHJlYWRfcmVsZWFzZV9sb2NrKCVwKSBlcnJvcjogJWxcbiIsCi0JCQkgUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpLAotCQkJIGFMb2NrLAotCQkJIEdldExhc3RFcnJvcigpKSk7Ci0JCXJldHVybjsKLQl9CisgICAgaWYgKCFsb2NrLT5pc19zZXQpIHsKKyAgICAgICAgZHByaW50ZigoIiVsZDogQ291bGQgbm90IFB5VGhyZWFkX3JlbGVhc2VfbG9jayglcCkgZXJyb3I6ICVsXG4iLAorICAgICAgICAgICAgICAgICBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCksCisgICAgICAgICAgICAgICAgIGFMb2NrLAorICAgICAgICAgICAgICAgICBHZXRMYXN0RXJyb3IoKSkpOworICAgICAgICByZXR1cm47CisgICAgfQogCi0JaWYgKERvc0VudGVyQ3JpdFNlYygpKSB7Ci0JCWRwcmludGYoKCIlbGQ6IENvdWxkIG5vdCBQeVRocmVhZF9yZWxlYXNlX2xvY2soJXApIGVycm9yOiAlbFxuIiwKLQkJCSBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCksCi0JCQkgYUxvY2ssCi0JCQkgR2V0TGFzdEVycm9yKCkpKTsKLQkJcmV0dXJuOwotCX0KKyAgICBpZiAoRG9zRW50ZXJDcml0U2VjKCkpIHsKKyAgICAgICAgZHByaW50ZigoIiVsZDogQ291bGQgbm90IFB5VGhyZWFkX3JlbGVhc2VfbG9jayglcCkgZXJyb3I6ICVsXG4iLAorICAgICAgICAgICAgICAgICBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCksCisgICAgICAgICAgICAgICAgIGFMb2NrLAorICAgICAgICAgICAgICAgICBHZXRMYXN0RXJyb3IoKSkpOworICAgICAgICByZXR1cm47CisgICAgfQogCi0JbG9jay0+aXNfc2V0ID0gMDsKLQlEb3NQb3N0RXZlbnRTZW0obG9jay0+Y2hhbmdlZCk7CisgICAgbG9jay0+aXNfc2V0ID0gMDsKKyAgICBEb3NQb3N0RXZlbnRTZW0obG9jay0+Y2hhbmdlZCk7CiAKLQlEb3NFeGl0Q3JpdFNlYygpOworICAgIERvc0V4aXRDcml0U2VjKCk7CiAjZW5kaWYKIH0KIAogLyogbWluaW11bS9tYXhpbXVtIHRocmVhZCBzdGFjayBzaXplcyBzdXBwb3J0ZWQgKi8KLSNkZWZpbmUgVEhSRUFEX01JTl9TVEFDS1NJWkUJMHg4MDAwCQkvKiAzMmtCICovCi0jZGVmaW5lIFRIUkVBRF9NQVhfU1RBQ0tTSVpFCTB4MjAwMDAwMAkvKiAzMk1CICovCisjZGVmaW5lIFRIUkVBRF9NSU5fU1RBQ0tTSVpFICAgIDB4ODAwMCAgICAgICAgICAvKiAzMmtCICovCisjZGVmaW5lIFRIUkVBRF9NQVhfU1RBQ0tTSVpFICAgIDB4MjAwMDAwMCAgICAgICAvKiAzMk1CICovCiAKIC8qIHNldCB0aGUgdGhyZWFkIHN0YWNrIHNpemUuCiAgKiBSZXR1cm4gMCBpZiBzaXplIGlzIHZhbGlkLCAtMSBvdGhlcndpc2UuCkBAIC0yODksMTkgKzI4OSwxOSBAQAogc3RhdGljIGludAogX3B5dGhyZWFkX29zMl9zZXRfc3RhY2tzaXplKHNpemVfdCBzaXplKQogewotCS8qIHNldCB0byBkZWZhdWx0ICovCi0JaWYgKHNpemUgPT0gMCkgewotCQlfcHl0aHJlYWRfc3RhY2tzaXplID0gMDsKLQkJcmV0dXJuIDA7Ci0JfQorICAgIC8qIHNldCB0byBkZWZhdWx0ICovCisgICAgaWYgKHNpemUgPT0gMCkgeworICAgICAgICBfcHl0aHJlYWRfc3RhY2tzaXplID0gMDsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCi0JLyogdmFsaWQgcmFuZ2U/ICovCi0JaWYgKHNpemUgPj0gVEhSRUFEX01JTl9TVEFDS1NJWkUgJiYgc2l6ZSA8IFRIUkVBRF9NQVhfU1RBQ0tTSVpFKSB7Ci0JCV9weXRocmVhZF9zdGFja3NpemUgPSBzaXplOwotCQlyZXR1cm4gMDsKLQl9CisgICAgLyogdmFsaWQgcmFuZ2U/ICovCisgICAgaWYgKHNpemUgPj0gVEhSRUFEX01JTl9TVEFDS1NJWkUgJiYgc2l6ZSA8IFRIUkVBRF9NQVhfU1RBQ0tTSVpFKSB7CisgICAgICAgIF9weXRocmVhZF9zdGFja3NpemUgPSBzaXplOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLQlyZXR1cm4gLTE7CisgICAgcmV0dXJuIC0xOwogfQogCi0jZGVmaW5lIFRIUkVBRF9TRVRfU1RBQ0tTSVpFKHgpCV9weXRocmVhZF9vczJfc2V0X3N0YWNrc2l6ZSh4KQorI2RlZmluZSBUSFJFQURfU0VUX1NUQUNLU0laRSh4KSBfcHl0aHJlYWRfb3MyX3NldF9zdGFja3NpemUoeCkKZGlmZiAtLWdpdCBhL1B5dGhvbi90aHJlYWRfcHRoLmggYi9QeXRob24vdGhyZWFkX3B0aC5oCmluZGV4IDhjN2RiZTkuLjFmMTY5NGEgMTAwNjQ0Ci0tLSBhL1B5dGhvbi90aHJlYWRfcHRoLmgKKysrIGIvUHl0aG9uL3RocmVhZF9wdGguaApAQCAtMyw3ICszLDcgQEAKICAgIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9wdGgKICAgIDIwMDAtMDUtMDMgQW5keSBEdXN0bWFuIDxhbmR5QGR1c3RtYW4ubmV0PgogCi0gICBBZGFwdGVkIGZyb20gUG9zaXggdGhyZWFkcyBpbnRlcmZhY2UgCisgICBBZGFwdGVkIGZyb20gUG9zaXggdGhyZWFkcyBpbnRlcmZhY2UKICAgIDEyIE1heSAxOTk3IC0tIGRhdmlkIGFybm9sZCA8ZGF2aWRhQHBvYm94LmNvbT4KICAqLwogCkBAIC0yMiwxMCArMjIsMTAgQEAKICAqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JY2hhciAgICAgICAgICAgICBsb2NrZWQ7IC8qIDA9dW5sb2NrZWQsIDE9bG9ja2VkICovCi0JLyogYSA8Y29uZCwgbXV0ZXg+IHBhaXIgdG8gaGFuZGxlIGFuIGFjcXVpcmUgb2YgYSBsb2NrZWQgbG9jayAqLwotCXB0aF9jb25kX3QgICBsb2NrX3JlbGVhc2VkOwotCXB0aF9tdXRleF90ICBtdXQ7CisgICAgY2hhciAgICAgICAgICAgICBsb2NrZWQ7IC8qIDA9dW5sb2NrZWQsIDE9bG9ja2VkICovCisgICAgLyogYSA8Y29uZCwgbXV0ZXg+IHBhaXIgdG8gaGFuZGxlIGFuIGFjcXVpcmUgb2YgYSBsb2NrZWQgbG9jayAqLworICAgIHB0aF9jb25kX3QgICBsb2NrX3JlbGVhc2VkOworICAgIHB0aF9tdXRleF90ICBtdXQ7CiB9IHB0aF9sb2NrOwogCiAjZGVmaW5lIENIRUNLX1NUQVRVUyhuYW1lKSAgaWYgKHN0YXR1cyA9PSAtMSkgeyBwcmludGYoIiVkICIsIHN0YXR1cyk7IHBlcnJvcihuYW1lKTsgZXJyb3IgPSAxOyB9CkBAIC0zOCwxMCArMzgsMTAgQEAKIAogc3RhdGljIHZvaWQgUHlUaHJlYWRfX2luaXRfdGhyZWFkKHZvaWQpCiB7Ci0JcHRoX2luaXQoKTsKLQlQeVRocmVhZF9hdHRyID0gcHRoX2F0dHJfbmV3KCk7Ci0JcHRoX2F0dHJfc2V0KFB5VGhyZWFkX2F0dHIsIFBUSF9BVFRSX1NUQUNLX1NJWkUsIDE8PDE4KTsKLQlwdGhfYXR0cl9zZXQoUHlUaHJlYWRfYXR0ciwgUFRIX0FUVFJfSk9JTkFCTEUsIEZBTFNFKTsKKyAgICBwdGhfaW5pdCgpOworICAgIFB5VGhyZWFkX2F0dHIgPSBwdGhfYXR0cl9uZXcoKTsKKyAgICBwdGhfYXR0cl9zZXQoUHlUaHJlYWRfYXR0ciwgUFRIX0FUVFJfU1RBQ0tfU0laRSwgMTw8MTgpOworICAgIHB0aF9hdHRyX3NldChQeVRocmVhZF9hdHRyLCBQVEhfQVRUUl9KT0lOQUJMRSwgRkFMU0UpOwogfQogCiAvKgpAQCAtNTEsNjkgKzUxLDY5IEBACiAKIGxvbmcgUHlUaHJlYWRfc3RhcnRfbmV3X3RocmVhZCh2b2lkICgqZnVuYykodm9pZCAqKSwgdm9pZCAqYXJnKQogewotCXB0aF90IHRoOwotCWRwcmludGYoKCJQeVRocmVhZF9zdGFydF9uZXdfdGhyZWFkIGNhbGxlZFxuIikpOwotCWlmICghaW5pdGlhbGl6ZWQpCi0JCVB5VGhyZWFkX2luaXRfdGhyZWFkKCk7CisgICAgcHRoX3QgdGg7CisgICAgZHByaW50ZigoIlB5VGhyZWFkX3N0YXJ0X25ld190aHJlYWQgY2FsbGVkXG4iKSk7CisgICAgaWYgKCFpbml0aWFsaXplZCkKKyAgICAgICAgUHlUaHJlYWRfaW5pdF90aHJlYWQoKTsKIAotCXRoID0gcHRoX3NwYXduKFB5VGhyZWFkX2F0dHIsCi0JCQkJICh2b2lkKiAoKikodm9pZCAqKSlmdW5jLAotCQkJCSAodm9pZCAqKWFyZwotCQkJCSApOworICAgIHRoID0gcHRoX3NwYXduKFB5VGhyZWFkX2F0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiAoKikodm9pZCAqKSlmdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWFyZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogCi0JcmV0dXJuIHRoOworICAgIHJldHVybiB0aDsKIH0KIAogbG9uZyBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KHZvaWQpCiB7Ci0Jdm9sYXRpbGUgcHRoX3QgdGhyZWFkaWQ7Ci0JaWYgKCFpbml0aWFsaXplZCkKLQkJUHlUaHJlYWRfaW5pdF90aHJlYWQoKTsKLQkvKiBKdW1wIHRocm91Z2ggc29tZSBob29wcyBmb3IgQWxwaGEgT1NGLzEgKi8KLQl0aHJlYWRpZCA9IHB0aF9zZWxmKCk7Ci0JcmV0dXJuIChsb25nKSAqKGxvbmcgKikgJnRocmVhZGlkOworICAgIHZvbGF0aWxlIHB0aF90IHRocmVhZGlkOworICAgIGlmICghaW5pdGlhbGl6ZWQpCisgICAgICAgIFB5VGhyZWFkX2luaXRfdGhyZWFkKCk7CisgICAgLyogSnVtcCB0aHJvdWdoIHNvbWUgaG9vcHMgZm9yIEFscGhhIE9TRi8xICovCisgICAgdGhyZWFkaWQgPSBwdGhfc2VsZigpOworICAgIHJldHVybiAobG9uZykgKihsb25nICopICZ0aHJlYWRpZDsKIH0KIAogc3RhdGljIHZvaWQgZG9fUHlUaHJlYWRfZXhpdF90aHJlYWQoaW50IG5vX2NsZWFudXApCiB7Ci0JZHByaW50ZigoIlB5VGhyZWFkX2V4aXRfdGhyZWFkIGNhbGxlZFxuIikpOwotCWlmICghaW5pdGlhbGl6ZWQpIHsKLQkJaWYgKG5vX2NsZWFudXApCi0JCQlfZXhpdCgwKTsKLQkJZWxzZQotCQkJZXhpdCgwKTsKLQl9CisgICAgZHByaW50ZigoIlB5VGhyZWFkX2V4aXRfdGhyZWFkIGNhbGxlZFxuIikpOworICAgIGlmICghaW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgaWYgKG5vX2NsZWFudXApCisgICAgICAgICAgICBfZXhpdCgwKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZXhpdCgwKTsKKyAgICB9CiB9CiAKIHZvaWQgUHlUaHJlYWRfZXhpdF90aHJlYWQodm9pZCkKIHsKLQlkb19QeVRocmVhZF9leGl0X3RocmVhZCgwKTsKKyAgICBkb19QeVRocmVhZF9leGl0X3RocmVhZCgwKTsKIH0KIAogdm9pZCBQeVRocmVhZF9fZXhpdF90aHJlYWQodm9pZCkKIHsKLQlkb19QeVRocmVhZF9leGl0X3RocmVhZCgxKTsKKyAgICBkb19QeVRocmVhZF9leGl0X3RocmVhZCgxKTsKIH0KIAogI2lmbmRlZiBOT19FWElUX1BST0cKIHN0YXRpYyB2b2lkIGRvX1B5VGhyZWFkX2V4aXRfcHJvZyhpbnQgc3RhdHVzLCBpbnQgbm9fY2xlYW51cCkKIHsKLQlkcHJpbnRmKCgiUHlUaHJlYWRfZXhpdF9wcm9nKCVkKSBjYWxsZWRcbiIsIHN0YXR1cykpOwotCWlmICghaW5pdGlhbGl6ZWQpCi0JCWlmIChub19jbGVhbnVwKQotCQkJX2V4aXQoc3RhdHVzKTsKLQkJZWxzZQotCQkJZXhpdChzdGF0dXMpOworICAgIGRwcmludGYoKCJQeVRocmVhZF9leGl0X3Byb2coJWQpIGNhbGxlZFxuIiwgc3RhdHVzKSk7CisgICAgaWYgKCFpbml0aWFsaXplZCkKKyAgICAgICAgaWYgKG5vX2NsZWFudXApCisgICAgICAgICAgICBfZXhpdChzdGF0dXMpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBleGl0KHN0YXR1cyk7CiB9CiAKIHZvaWQgUHlUaHJlYWRfZXhpdF9wcm9nKGludCBzdGF0dXMpCiB7Ci0JZG9fUHlUaHJlYWRfZXhpdF9wcm9nKHN0YXR1cywgMCk7CisgICAgZG9fUHlUaHJlYWRfZXhpdF9wcm9nKHN0YXR1cywgMCk7CiB9CiAKIHZvaWQgUHlUaHJlYWRfX2V4aXRfcHJvZyhpbnQgc3RhdHVzKQogewotCWRvX1B5VGhyZWFkX2V4aXRfcHJvZyhzdGF0dXMsIDEpOworICAgIGRvX1B5VGhyZWFkX2V4aXRfcHJvZyhzdGF0dXMsIDEpOwogfQogI2VuZGlmIC8qIE5PX0VYSVRfUFJPRyAqLwogCkBAIC0xMjIsOTIgKzEyMiw5MiBAQAogICovCiBQeVRocmVhZF90eXBlX2xvY2sgUHlUaHJlYWRfYWxsb2NhdGVfbG9jayh2b2lkKQogewotCXB0aF9sb2NrICpsb2NrOwotCWludCBzdGF0dXMsIGVycm9yID0gMDsKKyAgICBwdGhfbG9jayAqbG9jazsKKyAgICBpbnQgc3RhdHVzLCBlcnJvciA9IDA7CiAKLQlkcHJpbnRmKCgiUHlUaHJlYWRfYWxsb2NhdGVfbG9jayBjYWxsZWRcbiIpKTsKLQlpZiAoIWluaXRpYWxpemVkKQotCQlQeVRocmVhZF9pbml0X3RocmVhZCgpOworICAgIGRwcmludGYoKCJQeVRocmVhZF9hbGxvY2F0ZV9sb2NrIGNhbGxlZFxuIikpOworICAgIGlmICghaW5pdGlhbGl6ZWQpCisgICAgICAgIFB5VGhyZWFkX2luaXRfdGhyZWFkKCk7CiAKLQlsb2NrID0gKHB0aF9sb2NrICopIG1hbGxvYyhzaXplb2YocHRoX2xvY2spKTsKLSAgICAgICAgbWVtc2V0KCh2b2lkICopbG9jaywgJ1wwJywgc2l6ZW9mKHB0aF9sb2NrKSk7Ci0JaWYgKGxvY2spIHsKLQkJbG9jay0+bG9ja2VkID0gMDsKLQkJc3RhdHVzID0gcHRoX211dGV4X2luaXQoJmxvY2stPm11dCk7Ci0JCUNIRUNLX1NUQVRVUygicHRoX211dGV4X2luaXQiKTsKLQkJc3RhdHVzID0gcHRoX2NvbmRfaW5pdCgmbG9jay0+bG9ja19yZWxlYXNlZCk7Ci0JCUNIRUNLX1NUQVRVUygicHRoX2NvbmRfaW5pdCIpOwotCQlpZiAoZXJyb3IpIHsKLQkJCWZyZWUoKHZvaWQgKilsb2NrKTsKLQkJCWxvY2sgPSBOVUxMOwotCQl9Ci0JfQotCWRwcmludGYoKCJQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKCkgLT4gJXBcbiIsIGxvY2spKTsKLQlyZXR1cm4gKFB5VGhyZWFkX3R5cGVfbG9jaykgbG9jazsKKyAgICBsb2NrID0gKHB0aF9sb2NrICopIG1hbGxvYyhzaXplb2YocHRoX2xvY2spKTsKKyAgICBtZW1zZXQoKHZvaWQgKilsb2NrLCAnXDAnLCBzaXplb2YocHRoX2xvY2spKTsKKyAgICBpZiAobG9jaykgeworICAgICAgICBsb2NrLT5sb2NrZWQgPSAwOworICAgICAgICBzdGF0dXMgPSBwdGhfbXV0ZXhfaW5pdCgmbG9jay0+bXV0KTsKKyAgICAgICAgQ0hFQ0tfU1RBVFVTKCJwdGhfbXV0ZXhfaW5pdCIpOworICAgICAgICBzdGF0dXMgPSBwdGhfY29uZF9pbml0KCZsb2NrLT5sb2NrX3JlbGVhc2VkKTsKKyAgICAgICAgQ0hFQ0tfU1RBVFVTKCJwdGhfY29uZF9pbml0Iik7CisgICAgICAgIGlmIChlcnJvcikgeworICAgICAgICAgICAgZnJlZSgodm9pZCAqKWxvY2spOworICAgICAgICAgICAgbG9jayA9IE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgZHByaW50ZigoIlB5VGhyZWFkX2FsbG9jYXRlX2xvY2soKSAtPiAlcFxuIiwgbG9jaykpOworICAgIHJldHVybiAoUHlUaHJlYWRfdHlwZV9sb2NrKSBsb2NrOwogfQogCiB2b2lkIFB5VGhyZWFkX2ZyZWVfbG9jayhQeVRocmVhZF90eXBlX2xvY2sgbG9jaykKIHsKLQlwdGhfbG9jayAqdGhlbG9jayA9IChwdGhfbG9jayAqKWxvY2s7CisgICAgcHRoX2xvY2sgKnRoZWxvY2sgPSAocHRoX2xvY2sgKilsb2NrOwogCi0JZHByaW50ZigoIlB5VGhyZWFkX2ZyZWVfbG9jayglcCkgY2FsbGVkXG4iLCBsb2NrKSk7CisgICAgZHByaW50ZigoIlB5VGhyZWFkX2ZyZWVfbG9jayglcCkgY2FsbGVkXG4iLCBsb2NrKSk7CiAKLQlmcmVlKCh2b2lkICopdGhlbG9jayk7CisgICAgZnJlZSgodm9pZCAqKXRoZWxvY2spOwogfQogCiBpbnQgUHlUaHJlYWRfYWNxdWlyZV9sb2NrKFB5VGhyZWFkX3R5cGVfbG9jayBsb2NrLCBpbnQgd2FpdGZsYWcpCiB7Ci0JaW50IHN1Y2Nlc3M7Ci0JcHRoX2xvY2sgKnRoZWxvY2sgPSAocHRoX2xvY2sgKilsb2NrOwotCWludCBzdGF0dXMsIGVycm9yID0gMDsKKyAgICBpbnQgc3VjY2VzczsKKyAgICBwdGhfbG9jayAqdGhlbG9jayA9IChwdGhfbG9jayAqKWxvY2s7CisgICAgaW50IHN0YXR1cywgZXJyb3IgPSAwOwogCi0JZHByaW50ZigoIlB5VGhyZWFkX2FjcXVpcmVfbG9jayglcCwgJWQpIGNhbGxlZFxuIiwgbG9jaywgd2FpdGZsYWcpKTsKKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfYWNxdWlyZV9sb2NrKCVwLCAlZCkgY2FsbGVkXG4iLCBsb2NrLCB3YWl0ZmxhZykpOwogCi0Jc3RhdHVzID0gcHRoX211dGV4X2FjcXVpcmUoJnRoZWxvY2stPm11dCwgIXdhaXRmbGFnLCBOVUxMKTsKLQlDSEVDS19TVEFUVVMoInB0aF9tdXRleF9hY3F1aXJlWzFdIik7Ci0Jc3VjY2VzcyA9IHRoZWxvY2stPmxvY2tlZCA9PSAwOwotICAgICAgICBpZiAoc3VjY2VzcykgdGhlbG9jay0+bG9ja2VkID0gMTsKLSAgICAgICAgc3RhdHVzID0gcHRoX211dGV4X3JlbGVhc2UoICZ0aGVsb2NrLT5tdXQgKTsKLSAgICAgICAgQ0hFQ0tfU1RBVFVTKCJwdGhfbXV0ZXhfcmVsZWFzZVsxXSIpOworICAgIHN0YXR1cyA9IHB0aF9tdXRleF9hY3F1aXJlKCZ0aGVsb2NrLT5tdXQsICF3YWl0ZmxhZywgTlVMTCk7CisgICAgQ0hFQ0tfU1RBVFVTKCJwdGhfbXV0ZXhfYWNxdWlyZVsxXSIpOworICAgIHN1Y2Nlc3MgPSB0aGVsb2NrLT5sb2NrZWQgPT0gMDsKKyAgICBpZiAoc3VjY2VzcykgdGhlbG9jay0+bG9ja2VkID0gMTsKKyAgICBzdGF0dXMgPSBwdGhfbXV0ZXhfcmVsZWFzZSggJnRoZWxvY2stPm11dCApOworICAgIENIRUNLX1NUQVRVUygicHRoX211dGV4X3JlbGVhc2VbMV0iKTsKIAotICAgICAgICBpZiAoICFzdWNjZXNzICYmIHdhaXRmbGFnICkgewotICAgICAgICAgICAgICAgIC8qIGNvbnRpbnVlIHRyeWluZyB1bnRpbCB3ZSBnZXQgdGhlIGxvY2sgKi8KKyAgICBpZiAoICFzdWNjZXNzICYmIHdhaXRmbGFnICkgeworICAgICAgICAvKiBjb250aW51ZSB0cnlpbmcgdW50aWwgd2UgZ2V0IHRoZSBsb2NrICovCiAKLSAgICAgICAgICAgICAgICAvKiBtdXQgbXVzdCBiZSBsb2NrZWQgYnkgbWUgLS0gcGFydCBvZiB0aGUgY29uZGl0aW9uCi0gICAgICAgICAgICAgICAgICogcHJvdG9jb2wgKi8KLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBwdGhfbXV0ZXhfYWNxdWlyZSggJnRoZWxvY2stPm11dCwgIXdhaXRmbGFnLCBOVUxMICk7Ci0gICAgICAgICAgICAgICAgQ0hFQ0tfU1RBVFVTKCJwdGhfbXV0ZXhfYWNxdWlyZVsyXSIpOwotICAgICAgICAgICAgICAgIHdoaWxlICggdGhlbG9jay0+bG9ja2VkICkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gcHRoX2NvbmRfYXdhaXQoJnRoZWxvY2stPmxvY2tfcmVsZWFzZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlbG9jay0+bXV0LCBOVUxMKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLX1NUQVRVUygicHRoX2NvbmRfYXdhaXQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdGhlbG9jay0+bG9ja2VkID0gMTsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBwdGhfbXV0ZXhfcmVsZWFzZSggJnRoZWxvY2stPm11dCApOwotICAgICAgICAgICAgICAgIENIRUNLX1NUQVRVUygicHRoX211dGV4X3JlbGVhc2VbMl0iKTsKLSAgICAgICAgICAgICAgICBzdWNjZXNzID0gMTsKKyAgICAgICAgLyogbXV0IG11c3QgYmUgbG9ja2VkIGJ5IG1lIC0tIHBhcnQgb2YgdGhlIGNvbmRpdGlvbgorICAgICAgICAgKiBwcm90b2NvbCAqLworICAgICAgICBzdGF0dXMgPSBwdGhfbXV0ZXhfYWNxdWlyZSggJnRoZWxvY2stPm11dCwgIXdhaXRmbGFnLCBOVUxMICk7CisgICAgICAgIENIRUNLX1NUQVRVUygicHRoX211dGV4X2FjcXVpcmVbMl0iKTsKKyAgICAgICAgd2hpbGUgKCB0aGVsb2NrLT5sb2NrZWQgKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBwdGhfY29uZF9hd2FpdCgmdGhlbG9jay0+bG9ja19yZWxlYXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVsb2NrLT5tdXQsIE5VTEwpOworICAgICAgICAgICAgQ0hFQ0tfU1RBVFVTKCJwdGhfY29uZF9hd2FpdCIpOwogICAgICAgICB9Ci0gICAgICAgIGlmIChlcnJvcikgc3VjY2VzcyA9IDA7Ci0gICAgICAgIGRwcmludGYoKCJQeVRocmVhZF9hY3F1aXJlX2xvY2soJXAsICVkKSAtPiAlZFxuIiwgbG9jaywgd2FpdGZsYWcsIHN1Y2Nlc3MpKTsKLQlyZXR1cm4gc3VjY2VzczsKKyAgICAgICAgdGhlbG9jay0+bG9ja2VkID0gMTsKKyAgICAgICAgc3RhdHVzID0gcHRoX211dGV4X3JlbGVhc2UoICZ0aGVsb2NrLT5tdXQgKTsKKyAgICAgICAgQ0hFQ0tfU1RBVFVTKCJwdGhfbXV0ZXhfcmVsZWFzZVsyXSIpOworICAgICAgICBzdWNjZXNzID0gMTsKKyAgICB9CisgICAgaWYgKGVycm9yKSBzdWNjZXNzID0gMDsKKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfYWNxdWlyZV9sb2NrKCVwLCAlZCkgLT4gJWRcbiIsIGxvY2ssIHdhaXRmbGFnLCBzdWNjZXNzKSk7CisgICAgcmV0dXJuIHN1Y2Nlc3M7CiB9CiAKIHZvaWQgUHlUaHJlYWRfcmVsZWFzZV9sb2NrKFB5VGhyZWFkX3R5cGVfbG9jayBsb2NrKQogewotICAgICAgICBwdGhfbG9jayAqdGhlbG9jayA9IChwdGhfbG9jayAqKWxvY2s7Ci0gICAgICAgIGludCBzdGF0dXMsIGVycm9yID0gMDsKKyAgICBwdGhfbG9jayAqdGhlbG9jayA9IChwdGhfbG9jayAqKWxvY2s7CisgICAgaW50IHN0YXR1cywgZXJyb3IgPSAwOwogCi0gICAgICAgIGRwcmludGYoKCJQeVRocmVhZF9yZWxlYXNlX2xvY2soJXApIGNhbGxlZFxuIiwgbG9jaykpOworICAgIGRwcmludGYoKCJQeVRocmVhZF9yZWxlYXNlX2xvY2soJXApIGNhbGxlZFxuIiwgbG9jaykpOwogCi0gICAgICAgIHN0YXR1cyA9IHB0aF9tdXRleF9hY3F1aXJlKCAmdGhlbG9jay0+bXV0LCAwLCBOVUxMICk7Ci0gICAgICAgIENIRUNLX1NUQVRVUygicHRoX211dGV4X2FjcXVpcmVbM10iKTsKKyAgICBzdGF0dXMgPSBwdGhfbXV0ZXhfYWNxdWlyZSggJnRoZWxvY2stPm11dCwgMCwgTlVMTCApOworICAgIENIRUNLX1NUQVRVUygicHRoX211dGV4X2FjcXVpcmVbM10iKTsKIAotICAgICAgICB0aGVsb2NrLT5sb2NrZWQgPSAwOworICAgIHRoZWxvY2stPmxvY2tlZCA9IDA7CiAKLSAgICAgICAgc3RhdHVzID0gcHRoX211dGV4X3JlbGVhc2UoICZ0aGVsb2NrLT5tdXQgKTsKLSAgICAgICAgQ0hFQ0tfU1RBVFVTKCJwdGhfbXV0ZXhfcmVsZWFzZVszXSIpOworICAgIHN0YXR1cyA9IHB0aF9tdXRleF9yZWxlYXNlKCAmdGhlbG9jay0+bXV0ICk7CisgICAgQ0hFQ0tfU1RBVFVTKCJwdGhfbXV0ZXhfcmVsZWFzZVszXSIpOwogCi0gICAgICAgIC8qIHdha2UgdXAgc29tZW9uZSAoYW55b25lLCBpZiBhbnkpIHdhaXRpbmcgb24gdGhlIGxvY2sgKi8KLSAgICAgICAgc3RhdHVzID0gcHRoX2NvbmRfbm90aWZ5KCAmdGhlbG9jay0+bG9ja19yZWxlYXNlZCwgMCApOwotICAgICAgICBDSEVDS19TVEFUVVMoInB0aF9jb25kX25vdGlmeSIpOworICAgIC8qIHdha2UgdXAgc29tZW9uZSAoYW55b25lLCBpZiBhbnkpIHdhaXRpbmcgb24gdGhlIGxvY2sgKi8KKyAgICBzdGF0dXMgPSBwdGhfY29uZF9ub3RpZnkoICZ0aGVsb2NrLT5sb2NrX3JlbGVhc2VkLCAwICk7CisgICAgQ0hFQ0tfU1RBVFVTKCJwdGhfY29uZF9ub3RpZnkiKTsKIH0KZGlmZiAtLWdpdCBhL1B5dGhvbi90aHJlYWRfcHRocmVhZC5oIGIvUHl0aG9uL3RocmVhZF9wdGhyZWFkLmgKaW5kZXggNjBkMmZiMi4uMzJmZDJkMCAxMDA2NDQKLS0tIGEvUHl0aG9uL3RocmVhZF9wdGhyZWFkLmgKKysrIGIvUHl0aG9uL3RocmVhZF9wdGhyZWFkLmgKQEAgLTE2LDEwICsxNiwxMCBAQAogICAgYmUgY29uZGl0aW9uYWwgb24gX1BPU0lYX1RIUkVBRF9BVFRSX1NUQUNLU0laRSBiZWluZyBkZWZpbmVkLiAqLwogI2lmZGVmIF9QT1NJWF9USFJFQURfQVRUUl9TVEFDS1NJWkUKICNpZm5kZWYgVEhSRUFEX1NUQUNLX1NJWkUKLSNkZWZpbmUJVEhSRUFEX1NUQUNLX1NJWkUJMAkvKiB1c2UgZGVmYXVsdCBzdGFjayBzaXplICovCisjZGVmaW5lIFRIUkVBRF9TVEFDS19TSVpFICAgICAgIDAgICAgICAgLyogdXNlIGRlZmF1bHQgc3RhY2sgc2l6ZSAqLwogI2VuZGlmCiAvKiBmb3Igc2FmZXR5LCBlbnN1cmUgYSB2aWFibGUgbWluaW11bSBzdGFja3NpemUgKi8KLSNkZWZpbmUJVEhSRUFEX1NUQUNLX01JTgkweDgwMDAJLyogMzJrQiAqLworI2RlZmluZSBUSFJFQURfU1RBQ0tfTUlOICAgICAgICAweDgwMDAgIC8qIDMya0IgKi8KICNlbHNlICAvKiAhX1BPU0lYX1RIUkVBRF9BVFRSX1NUQUNLU0laRSAqLwogI2lmZGVmIFRIUkVBRF9TVEFDS19TSVpFCiAjZXJyb3IgIlRIUkVBRF9TVEFDS19TSVpFIGRlZmluZWQgYnV0IF9QT1NJWF9USFJFQURfQVRUUl9TVEFDS1NJWkUgdW5kZWZpbmVkIgpAQCAtMjgsOSArMjgsOSBAQAogCiAvKiBUaGUgUE9TSVggc3BlYyBzYXlzIHRoYXQgaW1wbGVtZW50YXRpb25zIHN1cHBvcnRpbmcgdGhlIHNlbV8qCiAgICBmYW1pbHkgb2YgZnVuY3Rpb25zIG11c3QgaW5kaWNhdGUgdGhpcyBieSBkZWZpbmluZwotICAgX1BPU0lYX1NFTUFQSE9SRVMuICovICAgCisgICBfUE9TSVhfU0VNQVBIT1JFUy4gKi8KICNpZmRlZiBfUE9TSVhfU0VNQVBIT1JFUwotLyogT24gRnJlZUJTRCA0LngsIF9QT1NJWF9TRU1BUEhPUkVTIGlzIGRlZmluZWQgZW1wdHksIHNvIAorLyogT24gRnJlZUJTRCA0LngsIF9QT1NJWF9TRU1BUEhPUkVTIGlzIGRlZmluZWQgZW1wdHksIHNvCiAgICB3ZSBuZWVkIHRvIGFkZCAwIHRvIG1ha2UgaXQgd29yayB0aGVyZSBhcyB3ZWxsLiAqLwogI2lmIChfUE9TSVhfU0VNQVBIT1JFUyswKSA9PSAtMQogI2RlZmluZSBIQVZFX0JST0tFTl9QT1NJWF9TRU1BUEhPUkVTCkBAIC05OSwxMCArOTksMTAgQEAKICAqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JY2hhciAgICAgICAgICAgICBsb2NrZWQ7IC8qIDA9dW5sb2NrZWQsIDE9bG9ja2VkICovCi0JLyogYSA8Y29uZCwgbXV0ZXg+IHBhaXIgdG8gaGFuZGxlIGFuIGFjcXVpcmUgb2YgYSBsb2NrZWQgbG9jayAqLwotCXB0aHJlYWRfY29uZF90ICAgbG9ja19yZWxlYXNlZDsKLQlwdGhyZWFkX211dGV4X3QgIG11dDsKKyAgICBjaGFyICAgICAgICAgICAgIGxvY2tlZDsgLyogMD11bmxvY2tlZCwgMT1sb2NrZWQgKi8KKyAgICAvKiBhIDxjb25kLCBtdXRleD4gcGFpciB0byBoYW5kbGUgYW4gYWNxdWlyZSBvZiBhIGxvY2tlZCBsb2NrICovCisgICAgcHRocmVhZF9jb25kX3QgICBsb2NrX3JlbGVhc2VkOworICAgIHB0aHJlYWRfbXV0ZXhfdCAgbXV0OwogfSBwdGhyZWFkX2xvY2s7CiAKICNkZWZpbmUgQ0hFQ0tfU1RBVFVTKG5hbWUpICBpZiAoc3RhdHVzICE9IDApIHsgcGVycm9yKG5hbWUpOyBlcnJvciA9IDE7IH0KQEAgLTEyMCwxMSArMTIwLDExIEBACiBzdGF0aWMgdm9pZAogUHlUaHJlYWRfX2luaXRfdGhyZWFkKHZvaWQpCiB7Ci0JLyogRE8gQU4gSU5JVCBCWSBTVEFSVElORyBUSEUgVEhSRUFEICovCi0Jc3RhdGljIGludCBkdW1teSA9IDA7Ci0JcHRocmVhZF90IHRocmVhZDE7Ci0JcHRocmVhZF9jcmVhdGUoJnRocmVhZDEsIE5VTEwsICh2b2lkICopIF9ub29wLCAmZHVtbXkpOwotCXB0aHJlYWRfam9pbih0aHJlYWQxLCBOVUxMKTsKKyAgICAvKiBETyBBTiBJTklUIEJZIFNUQVJUSU5HIFRIRSBUSFJFQUQgKi8KKyAgICBzdGF0aWMgaW50IGR1bW15ID0gMDsKKyAgICBwdGhyZWFkX3QgdGhyZWFkMTsKKyAgICBwdGhyZWFkX2NyZWF0ZSgmdGhyZWFkMSwgTlVMTCwgKHZvaWQgKikgX25vb3AsICZkdW1teSk7CisgICAgcHRocmVhZF9qb2luKHRocmVhZDEsIE5VTEwpOwogfQogCiAjZWxzZSAvKiAhX0hBVkVfQlNESSAqLwpAQCAtMTMzLDcgKzEzMyw3IEBACiBQeVRocmVhZF9faW5pdF90aHJlYWQodm9pZCkKIHsKICNpZiBkZWZpbmVkKF9BSVgpICYmIGRlZmluZWQoX19HTlVDX18pCi0JcHRocmVhZF9pbml0KCk7CisgICAgcHRocmVhZF9pbml0KCk7CiAjZW5kaWYKIH0KIApAQCAtMTQ3LDU5ICsxNDcsNTkgQEAKIGxvbmcKIFB5VGhyZWFkX3N0YXJ0X25ld190aHJlYWQodm9pZCAoKmZ1bmMpKHZvaWQgKiksIHZvaWQgKmFyZykKIHsKLQlwdGhyZWFkX3QgdGg7Ci0JaW50IHN0YXR1czsKKyAgICBwdGhyZWFkX3QgdGg7CisgICAgaW50IHN0YXR1czsKICNpZiBkZWZpbmVkKFRIUkVBRF9TVEFDS19TSVpFKSB8fCBkZWZpbmVkKFBUSFJFQURfU1lTVEVNX1NDSEVEX1NVUFBPUlRFRCkKLQlwdGhyZWFkX2F0dHJfdCBhdHRyczsKKyAgICBwdGhyZWFkX2F0dHJfdCBhdHRyczsKICNlbmRpZgogI2lmIGRlZmluZWQoVEhSRUFEX1NUQUNLX1NJWkUpCi0Jc2l6ZV90CXRzczsKKyAgICBzaXplX3QgICAgICB0c3M7CiAjZW5kaWYKIAotCWRwcmludGYoKCJQeVRocmVhZF9zdGFydF9uZXdfdGhyZWFkIGNhbGxlZFxuIikpOwotCWlmICghaW5pdGlhbGl6ZWQpCi0JCVB5VGhyZWFkX2luaXRfdGhyZWFkKCk7CisgICAgZHByaW50ZigoIlB5VGhyZWFkX3N0YXJ0X25ld190aHJlYWQgY2FsbGVkXG4iKSk7CisgICAgaWYgKCFpbml0aWFsaXplZCkKKyAgICAgICAgUHlUaHJlYWRfaW5pdF90aHJlYWQoKTsKIAogI2lmIGRlZmluZWQoVEhSRUFEX1NUQUNLX1NJWkUpIHx8IGRlZmluZWQoUFRIUkVBRF9TWVNURU1fU0NIRURfU1VQUE9SVEVEKQotCWlmIChwdGhyZWFkX2F0dHJfaW5pdCgmYXR0cnMpICE9IDApCi0JCXJldHVybiAtMTsKKyAgICBpZiAocHRocmVhZF9hdHRyX2luaXQoJmF0dHJzKSAhPSAwKQorICAgICAgICByZXR1cm4gLTE7CiAjZW5kaWYKICNpZiBkZWZpbmVkKFRIUkVBRF9TVEFDS19TSVpFKQotCXRzcyA9IChfcHl0aHJlYWRfc3RhY2tzaXplICE9IDApID8gX3B5dGhyZWFkX3N0YWNrc2l6ZQotCQkJCQkgOiBUSFJFQURfU1RBQ0tfU0laRTsKLQlpZiAodHNzICE9IDApIHsKLQkJaWYgKHB0aHJlYWRfYXR0cl9zZXRzdGFja3NpemUoJmF0dHJzLCB0c3MpICE9IDApIHsKLQkJCXB0aHJlYWRfYXR0cl9kZXN0cm95KCZhdHRycyk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9CisgICAgdHNzID0gKF9weXRocmVhZF9zdGFja3NpemUgIT0gMCkgPyBfcHl0aHJlYWRfc3RhY2tzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBUSFJFQURfU1RBQ0tfU0laRTsKKyAgICBpZiAodHNzICE9IDApIHsKKyAgICAgICAgaWYgKHB0aHJlYWRfYXR0cl9zZXRzdGFja3NpemUoJmF0dHJzLCB0c3MpICE9IDApIHsKKyAgICAgICAgICAgIHB0aHJlYWRfYXR0cl9kZXN0cm95KCZhdHRycyk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CiAjZW5kaWYKICNpZiBkZWZpbmVkKFBUSFJFQURfU1lTVEVNX1NDSEVEX1NVUFBPUlRFRCkKLSAgICAgICAgcHRocmVhZF9hdHRyX3NldHNjb3BlKCZhdHRycywgUFRIUkVBRF9TQ09QRV9TWVNURU0pOworICAgIHB0aHJlYWRfYXR0cl9zZXRzY29wZSgmYXR0cnMsIFBUSFJFQURfU0NPUEVfU1lTVEVNKTsKICNlbmRpZgogCi0Jc3RhdHVzID0gcHRocmVhZF9jcmVhdGUoJnRoLCAKKyAgICBzdGF0dXMgPSBwdGhyZWFkX2NyZWF0ZSgmdGgsCiAjaWYgZGVmaW5lZChUSFJFQURfU1RBQ0tfU0laRSkgfHwgZGVmaW5lZChQVEhSRUFEX1NZU1RFTV9TQ0hFRF9TVVBQT1JURUQpCi0JCQkJICZhdHRycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmF0dHJzLAogI2Vsc2UKLQkJCQkgKHB0aHJlYWRfYXR0cl90KilOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHRocmVhZF9hdHRyX3QqKU5VTEwsCiAjZW5kaWYKLQkJCQkgKHZvaWQqICgqKSh2b2lkICopKWZ1bmMsCi0JCQkJICh2b2lkICopYXJnCi0JCQkJICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiAoKikodm9pZCAqKSlmdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWFyZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogCiAjaWYgZGVmaW5lZChUSFJFQURfU1RBQ0tfU0laRSkgfHwgZGVmaW5lZChQVEhSRUFEX1NZU1RFTV9TQ0hFRF9TVVBQT1JURUQpCi0JcHRocmVhZF9hdHRyX2Rlc3Ryb3koJmF0dHJzKTsKKyAgICBwdGhyZWFkX2F0dHJfZGVzdHJveSgmYXR0cnMpOwogI2VuZGlmCi0JaWYgKHN0YXR1cyAhPSAwKQotICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIGlmIChzdGF0dXMgIT0gMCkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0gICAgICAgIHB0aHJlYWRfZGV0YWNoKHRoKTsKKyAgICBwdGhyZWFkX2RldGFjaCh0aCk7CiAKICNpZiBTSVpFT0ZfUFRIUkVBRF9UIDw9IFNJWkVPRl9MT05HCi0JcmV0dXJuIChsb25nKSB0aDsKKyAgICByZXR1cm4gKGxvbmcpIHRoOwogI2Vsc2UKLQlyZXR1cm4gKGxvbmcpICoobG9uZyAqKSAmdGg7CisgICAgcmV0dXJuIChsb25nKSAqKGxvbmcgKikgJnRoOwogI2VuZGlmCiB9CiAKQEAgLTIxMCw2NyArMjEwLDY3IEBACiAgICAgIC0gSXQgaXMgbm90IGNsZWFyIHRoYXQgdGhlICd2b2xhdGlsZScgKGZvciBBSVg/KSBhbmQgdWdseSBjYXN0aW5nIGluIHRoZQogICAgICAgIGxhdHRlciByZXR1cm4gc3RhdGVtZW50IChmb3IgQWxwaGEgT1NGLzEpIGFyZSBhbnkgbG9uZ2VyIG5lY2Vzc2FyeS4KICovCi1sb25nIAorbG9uZwogUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCh2b2lkKQogewotCXZvbGF0aWxlIHB0aHJlYWRfdCB0aHJlYWRpZDsKLQlpZiAoIWluaXRpYWxpemVkKQotCQlQeVRocmVhZF9pbml0X3RocmVhZCgpOwotCS8qIEp1bXAgdGhyb3VnaCBzb21lIGhvb3BzIGZvciBBbHBoYSBPU0YvMSAqLwotCXRocmVhZGlkID0gcHRocmVhZF9zZWxmKCk7CisgICAgdm9sYXRpbGUgcHRocmVhZF90IHRocmVhZGlkOworICAgIGlmICghaW5pdGlhbGl6ZWQpCisgICAgICAgIFB5VGhyZWFkX2luaXRfdGhyZWFkKCk7CisgICAgLyogSnVtcCB0aHJvdWdoIHNvbWUgaG9vcHMgZm9yIEFscGhhIE9TRi8xICovCisgICAgdGhyZWFkaWQgPSBwdGhyZWFkX3NlbGYoKTsKICNpZiBTSVpFT0ZfUFRIUkVBRF9UIDw9IFNJWkVPRl9MT05HCi0JcmV0dXJuIChsb25nKSB0aHJlYWRpZDsKKyAgICByZXR1cm4gKGxvbmcpIHRocmVhZGlkOwogI2Vsc2UKLQlyZXR1cm4gKGxvbmcpICoobG9uZyAqKSAmdGhyZWFkaWQ7CisgICAgcmV0dXJuIChsb25nKSAqKGxvbmcgKikgJnRocmVhZGlkOwogI2VuZGlmCiB9CiAKLXN0YXRpYyB2b2lkIAorc3RhdGljIHZvaWQKIGRvX1B5VGhyZWFkX2V4aXRfdGhyZWFkKGludCBub19jbGVhbnVwKQogewotCWRwcmludGYoKCJQeVRocmVhZF9leGl0X3RocmVhZCBjYWxsZWRcbiIpKTsKLQlpZiAoIWluaXRpYWxpemVkKSB7Ci0JCWlmIChub19jbGVhbnVwKQotCQkJX2V4aXQoMCk7Ci0JCWVsc2UKLQkJCWV4aXQoMCk7Ci0JfQorICAgIGRwcmludGYoKCJQeVRocmVhZF9leGl0X3RocmVhZCBjYWxsZWRcbiIpKTsKKyAgICBpZiAoIWluaXRpYWxpemVkKSB7CisgICAgICAgIGlmIChub19jbGVhbnVwKQorICAgICAgICAgICAgX2V4aXQoMCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGV4aXQoMCk7CisgICAgfQogfQogCi12b2lkIAordm9pZAogUHlUaHJlYWRfZXhpdF90aHJlYWQodm9pZCkKIHsKLQlkb19QeVRocmVhZF9leGl0X3RocmVhZCgwKTsKKyAgICBkb19QeVRocmVhZF9leGl0X3RocmVhZCgwKTsKIH0KIAotdm9pZCAKK3ZvaWQKIFB5VGhyZWFkX19leGl0X3RocmVhZCh2b2lkKQogewotCWRvX1B5VGhyZWFkX2V4aXRfdGhyZWFkKDEpOworICAgIGRvX1B5VGhyZWFkX2V4aXRfdGhyZWFkKDEpOwogfQogCiAjaWZuZGVmIE5PX0VYSVRfUFJPRwotc3RhdGljIHZvaWQgCitzdGF0aWMgdm9pZAogZG9fUHlUaHJlYWRfZXhpdF9wcm9nKGludCBzdGF0dXMsIGludCBub19jbGVhbnVwKQogewotCWRwcmludGYoKCJQeVRocmVhZF9leGl0X3Byb2coJWQpIGNhbGxlZFxuIiwgc3RhdHVzKSk7Ci0JaWYgKCFpbml0aWFsaXplZCkKLQkJaWYgKG5vX2NsZWFudXApCi0JCQlfZXhpdChzdGF0dXMpOwotCQllbHNlCi0JCQlleGl0KHN0YXR1cyk7CisgICAgZHByaW50ZigoIlB5VGhyZWFkX2V4aXRfcHJvZyglZCkgY2FsbGVkXG4iLCBzdGF0dXMpKTsKKyAgICBpZiAoIWluaXRpYWxpemVkKQorICAgICAgICBpZiAobm9fY2xlYW51cCkKKyAgICAgICAgICAgIF9leGl0KHN0YXR1cyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGV4aXQoc3RhdHVzKTsKIH0KIAotdm9pZCAKK3ZvaWQKIFB5VGhyZWFkX2V4aXRfcHJvZyhpbnQgc3RhdHVzKQogewotCWRvX1B5VGhyZWFkX2V4aXRfcHJvZyhzdGF0dXMsIDApOworICAgIGRvX1B5VGhyZWFkX2V4aXRfcHJvZyhzdGF0dXMsIDApOwogfQogCi12b2lkIAordm9pZAogUHlUaHJlYWRfX2V4aXRfcHJvZyhpbnQgc3RhdHVzKQogewotCWRvX1B5VGhyZWFkX2V4aXRfcHJvZyhzdGF0dXMsIDEpOworICAgIGRvX1B5VGhyZWFkX2V4aXRfcHJvZyhzdGF0dXMsIDEpOwogfQogI2VuZGlmIC8qIE5PX0VYSVRfUFJPRyAqLwogCkBAIC0yODAsNDcgKzI4MCw0NyBAQAogICogTG9jayBzdXBwb3J0LgogICovCiAKLVB5VGhyZWFkX3R5cGVfbG9jayAKK1B5VGhyZWFkX3R5cGVfbG9jawogUHlUaHJlYWRfYWxsb2NhdGVfbG9jayh2b2lkKQogewotCXNlbV90ICpsb2NrOwotCWludCBzdGF0dXMsIGVycm9yID0gMDsKKyAgICBzZW1fdCAqbG9jazsKKyAgICBpbnQgc3RhdHVzLCBlcnJvciA9IDA7CiAKLQlkcHJpbnRmKCgiUHlUaHJlYWRfYWxsb2NhdGVfbG9jayBjYWxsZWRcbiIpKTsKLQlpZiAoIWluaXRpYWxpemVkKQotCQlQeVRocmVhZF9pbml0X3RocmVhZCgpOworICAgIGRwcmludGYoKCJQeVRocmVhZF9hbGxvY2F0ZV9sb2NrIGNhbGxlZFxuIikpOworICAgIGlmICghaW5pdGlhbGl6ZWQpCisgICAgICAgIFB5VGhyZWFkX2luaXRfdGhyZWFkKCk7CiAKLQlsb2NrID0gKHNlbV90ICopbWFsbG9jKHNpemVvZihzZW1fdCkpOworICAgIGxvY2sgPSAoc2VtX3QgKiltYWxsb2Moc2l6ZW9mKHNlbV90KSk7CiAKLQlpZiAobG9jaykgewotCQlzdGF0dXMgPSBzZW1faW5pdChsb2NrLDAsMSk7Ci0JCUNIRUNLX1NUQVRVUygic2VtX2luaXQiKTsKKyAgICBpZiAobG9jaykgeworICAgICAgICBzdGF0dXMgPSBzZW1faW5pdChsb2NrLDAsMSk7CisgICAgICAgIENIRUNLX1NUQVRVUygic2VtX2luaXQiKTsKIAotCQlpZiAoZXJyb3IpIHsKLQkJCWZyZWUoKHZvaWQgKilsb2NrKTsKLQkJCWxvY2sgPSBOVUxMOwotCQl9Ci0JfQorICAgICAgICBpZiAoZXJyb3IpIHsKKyAgICAgICAgICAgIGZyZWUoKHZvaWQgKilsb2NrKTsKKyAgICAgICAgICAgIGxvY2sgPSBOVUxMOworICAgICAgICB9CisgICAgfQogCi0JZHByaW50ZigoIlB5VGhyZWFkX2FsbG9jYXRlX2xvY2soKSAtPiAlcFxuIiwgbG9jaykpOwotCXJldHVybiAoUHlUaHJlYWRfdHlwZV9sb2NrKWxvY2s7CisgICAgZHByaW50ZigoIlB5VGhyZWFkX2FsbG9jYXRlX2xvY2soKSAtPiAlcFxuIiwgbG9jaykpOworICAgIHJldHVybiAoUHlUaHJlYWRfdHlwZV9sb2NrKWxvY2s7CiB9CiAKLXZvaWQgCit2b2lkCiBQeVRocmVhZF9mcmVlX2xvY2soUHlUaHJlYWRfdHlwZV9sb2NrIGxvY2spCiB7Ci0Jc2VtX3QgKnRoZWxvY2sgPSAoc2VtX3QgKilsb2NrOwotCWludCBzdGF0dXMsIGVycm9yID0gMDsKKyAgICBzZW1fdCAqdGhlbG9jayA9IChzZW1fdCAqKWxvY2s7CisgICAgaW50IHN0YXR1cywgZXJyb3IgPSAwOwogCi0JZHByaW50ZigoIlB5VGhyZWFkX2ZyZWVfbG9jayglcCkgY2FsbGVkXG4iLCBsb2NrKSk7CisgICAgZHByaW50ZigoIlB5VGhyZWFkX2ZyZWVfbG9jayglcCkgY2FsbGVkXG4iLCBsb2NrKSk7CiAKLQlpZiAoIXRoZWxvY2spCi0JCXJldHVybjsKKyAgICBpZiAoIXRoZWxvY2spCisgICAgICAgIHJldHVybjsKIAotCXN0YXR1cyA9IHNlbV9kZXN0cm95KHRoZWxvY2spOwotCUNIRUNLX1NUQVRVUygic2VtX2Rlc3Ryb3kiKTsKKyAgICBzdGF0dXMgPSBzZW1fZGVzdHJveSh0aGVsb2NrKTsKKyAgICBDSEVDS19TVEFUVVMoInNlbV9kZXN0cm95Iik7CiAKLQlmcmVlKCh2b2lkICopdGhlbG9jayk7CisgICAgZnJlZSgodm9pZCAqKXRoZWxvY2spOwogfQogCiAvKgpAQCAtMzMyLDQ3ICszMzIsNDcgQEAKIHN0YXRpYyBpbnQKIGZpeF9zdGF0dXMoaW50IHN0YXR1cykKIHsKLQlyZXR1cm4gKHN0YXR1cyA9PSAtMSkgPyBlcnJubyA6IHN0YXR1czsKKyAgICByZXR1cm4gKHN0YXR1cyA9PSAtMSkgPyBlcnJubyA6IHN0YXR1czsKIH0KIAotaW50IAoraW50CiBQeVRocmVhZF9hY3F1aXJlX2xvY2soUHlUaHJlYWRfdHlwZV9sb2NrIGxvY2ssIGludCB3YWl0ZmxhZykKIHsKLQlpbnQgc3VjY2VzczsKLQlzZW1fdCAqdGhlbG9jayA9IChzZW1fdCAqKWxvY2s7Ci0JaW50IHN0YXR1cywgZXJyb3IgPSAwOworICAgIGludCBzdWNjZXNzOworICAgIHNlbV90ICp0aGVsb2NrID0gKHNlbV90ICopbG9jazsKKyAgICBpbnQgc3RhdHVzLCBlcnJvciA9IDA7CiAKLQlkcHJpbnRmKCgiUHlUaHJlYWRfYWNxdWlyZV9sb2NrKCVwLCAlZCkgY2FsbGVkXG4iLCBsb2NrLCB3YWl0ZmxhZykpOworICAgIGRwcmludGYoKCJQeVRocmVhZF9hY3F1aXJlX2xvY2soJXAsICVkKSBjYWxsZWRcbiIsIGxvY2ssIHdhaXRmbGFnKSk7CiAKLQlkbyB7Ci0JCWlmICh3YWl0ZmxhZykKLQkJCXN0YXR1cyA9IGZpeF9zdGF0dXMoc2VtX3dhaXQodGhlbG9jaykpOwotCQllbHNlCi0JCQlzdGF0dXMgPSBmaXhfc3RhdHVzKHNlbV90cnl3YWl0KHRoZWxvY2spKTsKLQl9IHdoaWxlIChzdGF0dXMgPT0gRUlOVFIpOyAvKiBSZXRyeSBpZiBpbnRlcnJ1cHRlZCBieSBhIHNpZ25hbCAqLworICAgIGRvIHsKKyAgICAgICAgaWYgKHdhaXRmbGFnKQorICAgICAgICAgICAgc3RhdHVzID0gZml4X3N0YXR1cyhzZW1fd2FpdCh0aGVsb2NrKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHN0YXR1cyA9IGZpeF9zdGF0dXMoc2VtX3RyeXdhaXQodGhlbG9jaykpOworICAgIH0gd2hpbGUgKHN0YXR1cyA9PSBFSU5UUik7IC8qIFJldHJ5IGlmIGludGVycnVwdGVkIGJ5IGEgc2lnbmFsICovCiAKLQlpZiAod2FpdGZsYWcpIHsKLQkJQ0hFQ0tfU1RBVFVTKCJzZW1fd2FpdCIpOwotCX0gZWxzZSBpZiAoc3RhdHVzICE9IEVBR0FJTikgewotCQlDSEVDS19TVEFUVVMoInNlbV90cnl3YWl0Iik7Ci0JfQotCQotCXN1Y2Nlc3MgPSAoc3RhdHVzID09IDApID8gMSA6IDA7CisgICAgaWYgKHdhaXRmbGFnKSB7CisgICAgICAgIENIRUNLX1NUQVRVUygic2VtX3dhaXQiKTsKKyAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPSBFQUdBSU4pIHsKKyAgICAgICAgQ0hFQ0tfU1RBVFVTKCJzZW1fdHJ5d2FpdCIpOworICAgIH0KIAotCWRwcmludGYoKCJQeVRocmVhZF9hY3F1aXJlX2xvY2soJXAsICVkKSAtPiAlZFxuIiwgbG9jaywgd2FpdGZsYWcsIHN1Y2Nlc3MpKTsKLQlyZXR1cm4gc3VjY2VzczsKKyAgICBzdWNjZXNzID0gKHN0YXR1cyA9PSAwKSA/IDEgOiAwOworCisgICAgZHByaW50ZigoIlB5VGhyZWFkX2FjcXVpcmVfbG9jayglcCwgJWQpIC0+ICVkXG4iLCBsb2NrLCB3YWl0ZmxhZywgc3VjY2VzcykpOworICAgIHJldHVybiBzdWNjZXNzOwogfQogCi12b2lkIAordm9pZAogUHlUaHJlYWRfcmVsZWFzZV9sb2NrKFB5VGhyZWFkX3R5cGVfbG9jayBsb2NrKQogewotCXNlbV90ICp0aGVsb2NrID0gKHNlbV90ICopbG9jazsKLQlpbnQgc3RhdHVzLCBlcnJvciA9IDA7CisgICAgc2VtX3QgKnRoZWxvY2sgPSAoc2VtX3QgKilsb2NrOworICAgIGludCBzdGF0dXMsIGVycm9yID0gMDsKIAotCWRwcmludGYoKCJQeVRocmVhZF9yZWxlYXNlX2xvY2soJXApIGNhbGxlZFxuIiwgbG9jaykpOworICAgIGRwcmludGYoKCJQeVRocmVhZF9yZWxlYXNlX2xvY2soJXApIGNhbGxlZFxuIiwgbG9jaykpOwogCi0Jc3RhdHVzID0gc2VtX3Bvc3QodGhlbG9jayk7Ci0JQ0hFQ0tfU1RBVFVTKCJzZW1fcG9zdCIpOworICAgIHN0YXR1cyA9IHNlbV9wb3N0KHRoZWxvY2spOworICAgIENIRUNLX1NUQVRVUygic2VtX3Bvc3QiKTsKIH0KIAogI2Vsc2UgLyogVVNFX1NFTUFQSE9SRVMgKi8KQEAgLTM4MCwxMDkgKzM4MCwxMDkgQEAKIC8qCiAgKiBMb2NrIHN1cHBvcnQuCiAgKi8KLVB5VGhyZWFkX3R5cGVfbG9jayAKK1B5VGhyZWFkX3R5cGVfbG9jawogUHlUaHJlYWRfYWxsb2NhdGVfbG9jayh2b2lkKQogewotCXB0aHJlYWRfbG9jayAqbG9jazsKLQlpbnQgc3RhdHVzLCBlcnJvciA9IDA7CisgICAgcHRocmVhZF9sb2NrICpsb2NrOworICAgIGludCBzdGF0dXMsIGVycm9yID0gMDsKIAotCWRwcmludGYoKCJQeVRocmVhZF9hbGxvY2F0ZV9sb2NrIGNhbGxlZFxuIikpOwotCWlmICghaW5pdGlhbGl6ZWQpCi0JCVB5VGhyZWFkX2luaXRfdGhyZWFkKCk7CisgICAgZHByaW50ZigoIlB5VGhyZWFkX2FsbG9jYXRlX2xvY2sgY2FsbGVkXG4iKSk7CisgICAgaWYgKCFpbml0aWFsaXplZCkKKyAgICAgICAgUHlUaHJlYWRfaW5pdF90aHJlYWQoKTsKIAotCWxvY2sgPSAocHRocmVhZF9sb2NrICopIG1hbGxvYyhzaXplb2YocHRocmVhZF9sb2NrKSk7Ci0JaWYgKGxvY2spIHsKLQkJbWVtc2V0KCh2b2lkICopbG9jaywgJ1wwJywgc2l6ZW9mKHB0aHJlYWRfbG9jaykpOwotCQlsb2NrLT5sb2NrZWQgPSAwOworICAgIGxvY2sgPSAocHRocmVhZF9sb2NrICopIG1hbGxvYyhzaXplb2YocHRocmVhZF9sb2NrKSk7CisgICAgaWYgKGxvY2spIHsKKyAgICAgICAgbWVtc2V0KCh2b2lkICopbG9jaywgJ1wwJywgc2l6ZW9mKHB0aHJlYWRfbG9jaykpOworICAgICAgICBsb2NrLT5sb2NrZWQgPSAwOwogCi0JCXN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfaW5pdCgmbG9jay0+bXV0LAotCQkJCQkgICAgcHRocmVhZF9tdXRleGF0dHJfZGVmYXVsdCk7Ci0JCUNIRUNLX1NUQVRVUygicHRocmVhZF9tdXRleF9pbml0Iik7CisgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfaW5pdCgmbG9jay0+bXV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRocmVhZF9tdXRleGF0dHJfZGVmYXVsdCk7CisgICAgICAgIENIRUNLX1NUQVRVUygicHRocmVhZF9tdXRleF9pbml0Iik7CiAKLQkJc3RhdHVzID0gcHRocmVhZF9jb25kX2luaXQoJmxvY2stPmxvY2tfcmVsZWFzZWQsCi0JCQkJCSAgIHB0aHJlYWRfY29uZGF0dHJfZGVmYXVsdCk7Ci0JCUNIRUNLX1NUQVRVUygicHRocmVhZF9jb25kX2luaXQiKTsKKyAgICAgICAgc3RhdHVzID0gcHRocmVhZF9jb25kX2luaXQoJmxvY2stPmxvY2tfcmVsZWFzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0aHJlYWRfY29uZGF0dHJfZGVmYXVsdCk7CisgICAgICAgIENIRUNLX1NUQVRVUygicHRocmVhZF9jb25kX2luaXQiKTsKIAotCQlpZiAoZXJyb3IpIHsKLQkJCWZyZWUoKHZvaWQgKilsb2NrKTsKLQkJCWxvY2sgPSAwOwotCQl9Ci0JfQorICAgICAgICBpZiAoZXJyb3IpIHsKKyAgICAgICAgICAgIGZyZWUoKHZvaWQgKilsb2NrKTsKKyAgICAgICAgICAgIGxvY2sgPSAwOworICAgICAgICB9CisgICAgfQogCi0JZHByaW50ZigoIlB5VGhyZWFkX2FsbG9jYXRlX2xvY2soKSAtPiAlcFxuIiwgbG9jaykpOwotCXJldHVybiAoUHlUaHJlYWRfdHlwZV9sb2NrKSBsb2NrOworICAgIGRwcmludGYoKCJQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKCkgLT4gJXBcbiIsIGxvY2spKTsKKyAgICByZXR1cm4gKFB5VGhyZWFkX3R5cGVfbG9jaykgbG9jazsKIH0KIAotdm9pZCAKK3ZvaWQKIFB5VGhyZWFkX2ZyZWVfbG9jayhQeVRocmVhZF90eXBlX2xvY2sgbG9jaykKIHsKLQlwdGhyZWFkX2xvY2sgKnRoZWxvY2sgPSAocHRocmVhZF9sb2NrICopbG9jazsKLQlpbnQgc3RhdHVzLCBlcnJvciA9IDA7CisgICAgcHRocmVhZF9sb2NrICp0aGVsb2NrID0gKHB0aHJlYWRfbG9jayAqKWxvY2s7CisgICAgaW50IHN0YXR1cywgZXJyb3IgPSAwOwogCi0JZHByaW50ZigoIlB5VGhyZWFkX2ZyZWVfbG9jayglcCkgY2FsbGVkXG4iLCBsb2NrKSk7CisgICAgZHByaW50ZigoIlB5VGhyZWFkX2ZyZWVfbG9jayglcCkgY2FsbGVkXG4iLCBsb2NrKSk7CiAKLQlzdGF0dXMgPSBwdGhyZWFkX211dGV4X2Rlc3Ryb3koICZ0aGVsb2NrLT5tdXQgKTsKLQlDSEVDS19TVEFUVVMoInB0aHJlYWRfbXV0ZXhfZGVzdHJveSIpOworICAgIHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfZGVzdHJveSggJnRoZWxvY2stPm11dCApOworICAgIENIRUNLX1NUQVRVUygicHRocmVhZF9tdXRleF9kZXN0cm95Iik7CiAKLQlzdGF0dXMgPSBwdGhyZWFkX2NvbmRfZGVzdHJveSggJnRoZWxvY2stPmxvY2tfcmVsZWFzZWQgKTsKLQlDSEVDS19TVEFUVVMoInB0aHJlYWRfY29uZF9kZXN0cm95Iik7CisgICAgc3RhdHVzID0gcHRocmVhZF9jb25kX2Rlc3Ryb3koICZ0aGVsb2NrLT5sb2NrX3JlbGVhc2VkICk7CisgICAgQ0hFQ0tfU1RBVFVTKCJwdGhyZWFkX2NvbmRfZGVzdHJveSIpOwogCi0JZnJlZSgodm9pZCAqKXRoZWxvY2spOworICAgIGZyZWUoKHZvaWQgKil0aGVsb2NrKTsKIH0KIAotaW50IAoraW50CiBQeVRocmVhZF9hY3F1aXJlX2xvY2soUHlUaHJlYWRfdHlwZV9sb2NrIGxvY2ssIGludCB3YWl0ZmxhZykKIHsKLQlpbnQgc3VjY2VzczsKLQlwdGhyZWFkX2xvY2sgKnRoZWxvY2sgPSAocHRocmVhZF9sb2NrICopbG9jazsKLQlpbnQgc3RhdHVzLCBlcnJvciA9IDA7CisgICAgaW50IHN1Y2Nlc3M7CisgICAgcHRocmVhZF9sb2NrICp0aGVsb2NrID0gKHB0aHJlYWRfbG9jayAqKWxvY2s7CisgICAgaW50IHN0YXR1cywgZXJyb3IgPSAwOwogCi0JZHByaW50ZigoIlB5VGhyZWFkX2FjcXVpcmVfbG9jayglcCwgJWQpIGNhbGxlZFxuIiwgbG9jaywgd2FpdGZsYWcpKTsKKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfYWNxdWlyZV9sb2NrKCVwLCAlZCkgY2FsbGVkXG4iLCBsb2NrLCB3YWl0ZmxhZykpOwogCi0Jc3RhdHVzID0gcHRocmVhZF9tdXRleF9sb2NrKCAmdGhlbG9jay0+bXV0ICk7Ci0JQ0hFQ0tfU1RBVFVTKCJwdGhyZWFkX211dGV4X2xvY2tbMV0iKTsKLQlzdWNjZXNzID0gdGhlbG9jay0+bG9ja2VkID09IDA7CisgICAgc3RhdHVzID0gcHRocmVhZF9tdXRleF9sb2NrKCAmdGhlbG9jay0+bXV0ICk7CisgICAgQ0hFQ0tfU1RBVFVTKCJwdGhyZWFkX211dGV4X2xvY2tbMV0iKTsKKyAgICBzdWNjZXNzID0gdGhlbG9jay0+bG9ja2VkID09IDA7CiAKLQlpZiAoICFzdWNjZXNzICYmIHdhaXRmbGFnICkgewotCQkvKiBjb250aW51ZSB0cnlpbmcgdW50aWwgd2UgZ2V0IHRoZSBsb2NrICovCisgICAgaWYgKCAhc3VjY2VzcyAmJiB3YWl0ZmxhZyApIHsKKyAgICAgICAgLyogY29udGludWUgdHJ5aW5nIHVudGlsIHdlIGdldCB0aGUgbG9jayAqLwogCi0JCS8qIG11dCBtdXN0IGJlIGxvY2tlZCBieSBtZSAtLSBwYXJ0IG9mIHRoZSBjb25kaXRpb24KLQkJICogcHJvdG9jb2wgKi8KLQkJd2hpbGUgKCB0aGVsb2NrLT5sb2NrZWQgKSB7Ci0JCQlzdGF0dXMgPSBwdGhyZWFkX2NvbmRfd2FpdCgmdGhlbG9jay0+bG9ja19yZWxlYXNlZCwKLQkJCQkJCSAgICZ0aGVsb2NrLT5tdXQpOwotCQkJQ0hFQ0tfU1RBVFVTKCJwdGhyZWFkX2NvbmRfd2FpdCIpOwotCQl9Ci0JCXN1Y2Nlc3MgPSAxOwotCX0KLQlpZiAoc3VjY2VzcykgdGhlbG9jay0+bG9ja2VkID0gMTsKLQlzdGF0dXMgPSBwdGhyZWFkX211dGV4X3VubG9jayggJnRoZWxvY2stPm11dCApOwotCUNIRUNLX1NUQVRVUygicHRocmVhZF9tdXRleF91bmxvY2tbMV0iKTsKKyAgICAgICAgLyogbXV0IG11c3QgYmUgbG9ja2VkIGJ5IG1lIC0tIHBhcnQgb2YgdGhlIGNvbmRpdGlvbgorICAgICAgICAgKiBwcm90b2NvbCAqLworICAgICAgICB3aGlsZSAoIHRoZWxvY2stPmxvY2tlZCApIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfY29uZF93YWl0KCZ0aGVsb2NrLT5sb2NrX3JlbGVhc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZWxvY2stPm11dCk7CisgICAgICAgICAgICBDSEVDS19TVEFUVVMoInB0aHJlYWRfY29uZF93YWl0Iik7CisgICAgICAgIH0KKyAgICAgICAgc3VjY2VzcyA9IDE7CisgICAgfQorICAgIGlmIChzdWNjZXNzKSB0aGVsb2NrLT5sb2NrZWQgPSAxOworICAgIHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCAmdGhlbG9jay0+bXV0ICk7CisgICAgQ0hFQ0tfU1RBVFVTKCJwdGhyZWFkX211dGV4X3VubG9ja1sxXSIpOwogCi0JaWYgKGVycm9yKSBzdWNjZXNzID0gMDsKLQlkcHJpbnRmKCgiUHlUaHJlYWRfYWNxdWlyZV9sb2NrKCVwLCAlZCkgLT4gJWRcbiIsIGxvY2ssIHdhaXRmbGFnLCBzdWNjZXNzKSk7Ci0JcmV0dXJuIHN1Y2Nlc3M7CisgICAgaWYgKGVycm9yKSBzdWNjZXNzID0gMDsKKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfYWNxdWlyZV9sb2NrKCVwLCAlZCkgLT4gJWRcbiIsIGxvY2ssIHdhaXRmbGFnLCBzdWNjZXNzKSk7CisgICAgcmV0dXJuIHN1Y2Nlc3M7CiB9CiAKLXZvaWQgCit2b2lkCiBQeVRocmVhZF9yZWxlYXNlX2xvY2soUHlUaHJlYWRfdHlwZV9sb2NrIGxvY2spCiB7Ci0JcHRocmVhZF9sb2NrICp0aGVsb2NrID0gKHB0aHJlYWRfbG9jayAqKWxvY2s7Ci0JaW50IHN0YXR1cywgZXJyb3IgPSAwOworICAgIHB0aHJlYWRfbG9jayAqdGhlbG9jayA9IChwdGhyZWFkX2xvY2sgKilsb2NrOworICAgIGludCBzdGF0dXMsIGVycm9yID0gMDsKIAotCWRwcmludGYoKCJQeVRocmVhZF9yZWxlYXNlX2xvY2soJXApIGNhbGxlZFxuIiwgbG9jaykpOworICAgIGRwcmludGYoKCJQeVRocmVhZF9yZWxlYXNlX2xvY2soJXApIGNhbGxlZFxuIiwgbG9jaykpOwogCi0Jc3RhdHVzID0gcHRocmVhZF9tdXRleF9sb2NrKCAmdGhlbG9jay0+bXV0ICk7Ci0JQ0hFQ0tfU1RBVFVTKCJwdGhyZWFkX211dGV4X2xvY2tbM10iKTsKKyAgICBzdGF0dXMgPSBwdGhyZWFkX211dGV4X2xvY2soICZ0aGVsb2NrLT5tdXQgKTsKKyAgICBDSEVDS19TVEFUVVMoInB0aHJlYWRfbXV0ZXhfbG9ja1szXSIpOwogCi0JdGhlbG9jay0+bG9ja2VkID0gMDsKKyAgICB0aGVsb2NrLT5sb2NrZWQgPSAwOwogCi0Jc3RhdHVzID0gcHRocmVhZF9tdXRleF91bmxvY2soICZ0aGVsb2NrLT5tdXQgKTsKLQlDSEVDS19TVEFUVVMoInB0aHJlYWRfbXV0ZXhfdW5sb2NrWzNdIik7CisgICAgc3RhdHVzID0gcHRocmVhZF9tdXRleF91bmxvY2soICZ0aGVsb2NrLT5tdXQgKTsKKyAgICBDSEVDS19TVEFUVVMoInB0aHJlYWRfbXV0ZXhfdW5sb2NrWzNdIik7CiAKLQkvKiB3YWtlIHVwIHNvbWVvbmUgKGFueW9uZSwgaWYgYW55KSB3YWl0aW5nIG9uIHRoZSBsb2NrICovCi0Jc3RhdHVzID0gcHRocmVhZF9jb25kX3NpZ25hbCggJnRoZWxvY2stPmxvY2tfcmVsZWFzZWQgKTsKLQlDSEVDS19TVEFUVVMoInB0aHJlYWRfY29uZF9zaWduYWwiKTsKKyAgICAvKiB3YWtlIHVwIHNvbWVvbmUgKGFueW9uZSwgaWYgYW55KSB3YWl0aW5nIG9uIHRoZSBsb2NrICovCisgICAgc3RhdHVzID0gcHRocmVhZF9jb25kX3NpZ25hbCggJnRoZWxvY2stPmxvY2tfcmVsZWFzZWQgKTsKKyAgICBDSEVDS19TVEFUVVMoInB0aHJlYWRfY29uZF9zaWduYWwiKTsKIH0KIAogI2VuZGlmIC8qIFVTRV9TRU1BUEhPUkVTICovCkBAIC00OTUsMzkgKzQ5NSwzOSBAQAogX3B5dGhyZWFkX3B0aHJlYWRfc2V0X3N0YWNrc2l6ZShzaXplX3Qgc2l6ZSkKIHsKICNpZiBkZWZpbmVkKFRIUkVBRF9TVEFDS19TSVpFKQotCXB0aHJlYWRfYXR0cl90IGF0dHJzOwotCXNpemVfdCB0c3NfbWluOwotCWludCByYyA9IDA7CisgICAgcHRocmVhZF9hdHRyX3QgYXR0cnM7CisgICAgc2l6ZV90IHRzc19taW47CisgICAgaW50IHJjID0gMDsKICNlbmRpZgogCi0JLyogc2V0IHRvIGRlZmF1bHQgKi8KLQlpZiAoc2l6ZSA9PSAwKSB7Ci0JCV9weXRocmVhZF9zdGFja3NpemUgPSAwOwotCQlyZXR1cm4gMDsKLQl9CisgICAgLyogc2V0IHRvIGRlZmF1bHQgKi8KKyAgICBpZiAoc2l6ZSA9PSAwKSB7CisgICAgICAgIF9weXRocmVhZF9zdGFja3NpemUgPSAwOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKICNpZiBkZWZpbmVkKFRIUkVBRF9TVEFDS19TSVpFKQogI2lmIGRlZmluZWQoUFRIUkVBRF9TVEFDS19NSU4pCi0JdHNzX21pbiA9IFBUSFJFQURfU1RBQ0tfTUlOID4gVEhSRUFEX1NUQUNLX01JTiA/IFBUSFJFQURfU1RBQ0tfTUlOCi0JCQkJCQkgICAgICAgOiBUSFJFQURfU1RBQ0tfTUlOOworICAgIHRzc19taW4gPSBQVEhSRUFEX1NUQUNLX01JTiA+IFRIUkVBRF9TVEFDS19NSU4gPyBQVEhSRUFEX1NUQUNLX01JTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBUSFJFQURfU1RBQ0tfTUlOOwogI2Vsc2UKLQl0c3NfbWluID0gVEhSRUFEX1NUQUNLX01JTjsKKyAgICB0c3NfbWluID0gVEhSRUFEX1NUQUNLX01JTjsKICNlbmRpZgotCWlmIChzaXplID49IHRzc19taW4pIHsKLQkJLyogdmFsaWRhdGUgc3RhY2sgc2l6ZSBieSBzZXR0aW5nIHRocmVhZCBhdHRyaWJ1dGUgKi8KLQkJaWYgKHB0aHJlYWRfYXR0cl9pbml0KCZhdHRycykgPT0gMCkgewotCQkJcmMgPSBwdGhyZWFkX2F0dHJfc2V0c3RhY2tzaXplKCZhdHRycywgc2l6ZSk7Ci0JCQlwdGhyZWFkX2F0dHJfZGVzdHJveSgmYXR0cnMpOwotCQkJaWYgKHJjID09IDApIHsKLQkJCQlfcHl0aHJlYWRfc3RhY2tzaXplID0gc2l6ZTsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJfQotCX0KLQlyZXR1cm4gLTE7CisgICAgaWYgKHNpemUgPj0gdHNzX21pbikgeworICAgICAgICAvKiB2YWxpZGF0ZSBzdGFjayBzaXplIGJ5IHNldHRpbmcgdGhyZWFkIGF0dHJpYnV0ZSAqLworICAgICAgICBpZiAocHRocmVhZF9hdHRyX2luaXQoJmF0dHJzKSA9PSAwKSB7CisgICAgICAgICAgICByYyA9IHB0aHJlYWRfYXR0cl9zZXRzdGFja3NpemUoJmF0dHJzLCBzaXplKTsKKyAgICAgICAgICAgIHB0aHJlYWRfYXR0cl9kZXN0cm95KCZhdHRycyk7CisgICAgICAgICAgICBpZiAocmMgPT0gMCkgeworICAgICAgICAgICAgICAgIF9weXRocmVhZF9zdGFja3NpemUgPSBzaXplOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAtMTsKICNlbHNlCi0JcmV0dXJuIC0yOworICAgIHJldHVybiAtMjsKICNlbmRpZgogfQogCi0jZGVmaW5lIFRIUkVBRF9TRVRfU1RBQ0tTSVpFKHgpCV9weXRocmVhZF9wdGhyZWFkX3NldF9zdGFja3NpemUoeCkKKyNkZWZpbmUgVEhSRUFEX1NFVF9TVEFDS1NJWkUoeCkgX3B5dGhyZWFkX3B0aHJlYWRfc2V0X3N0YWNrc2l6ZSh4KQpkaWZmIC0tZ2l0IGEvUHl0aG9uL3RocmVhZF9zZ2kuaCBiL1B5dGhvbi90aHJlYWRfc2dpLmgKaW5kZXggMjM0NjY1OC4uNjc5ZDExMyAxMDA2NDQKLS0tIGEvUHl0aG9uL3RocmVhZF9zZ2kuaAorKysgYi9QeXRob24vdGhyZWFkX3NnaS5oCkBAIC04LDI1ICs4LDI1IEBACiAjaW5jbHVkZSA8dWxvY2tzLmg+CiAjaW5jbHVkZSA8ZXJybm8uaD4KIAotI2RlZmluZSBIRFJfU0laRQkyNjgwCS8qIHNpemVvZih1c2hkcl90KSAqLwotI2RlZmluZSBNQVhQUk9DCQkxMDAJLyogbWF4ICMgb2YgdGhyZWFkcyB0aGF0IGNhbiBiZSBzdGFydGVkICovCisjZGVmaW5lIEhEUl9TSVpFICAgICAgICAyNjgwICAgIC8qIHNpemVvZih1c2hkcl90KSAqLworI2RlZmluZSBNQVhQUk9DICAgICAgICAgMTAwICAgICAvKiBtYXggIyBvZiB0aHJlYWRzIHRoYXQgY2FuIGJlIHN0YXJ0ZWQgKi8KIAogc3RhdGljIHVzcHRyX3QgKnNoYXJlZF9hcmVuYTsKLXN0YXRpYyB1bG9ja190IGNvdW50X2xvY2s7CS8qIHByb3RlY3Rpb24gZm9yIHNvbWUgdmFyaWFibGVzICovCi1zdGF0aWMgdWxvY2tfdCB3YWl0X2xvY2s7CS8qIGxvY2sgdXNlZCB0byB3YWl0IGZvciBvdGhlciB0aHJlYWRzICovCi1zdGF0aWMgaW50IHdhaXRpbmdfZm9yX3RocmVhZHM7CS8qIHByb3RlY3RlZCBieSBjb3VudF9sb2NrICovCi1zdGF0aWMgaW50IG50aHJlYWRzOwkJLyogcHJvdGVjdGVkIGJ5IGNvdW50X2xvY2sgKi8KK3N0YXRpYyB1bG9ja190IGNvdW50X2xvY2s7ICAgICAgLyogcHJvdGVjdGlvbiBmb3Igc29tZSB2YXJpYWJsZXMgKi8KK3N0YXRpYyB1bG9ja190IHdhaXRfbG9jazsgICAgICAgLyogbG9jayB1c2VkIHRvIHdhaXQgZm9yIG90aGVyIHRocmVhZHMgKi8KK3N0YXRpYyBpbnQgd2FpdGluZ19mb3JfdGhyZWFkczsgLyogcHJvdGVjdGVkIGJ5IGNvdW50X2xvY2sgKi8KK3N0YXRpYyBpbnQgbnRocmVhZHM7ICAgICAgICAgICAgLyogcHJvdGVjdGVkIGJ5IGNvdW50X2xvY2sgKi8KIHN0YXRpYyBpbnQgZXhpdF9zdGF0dXM7CiAjaWZuZGVmIE5PX0VYSVRfUFJPRwotc3RhdGljIGludCBkb19leGl0OwkJLyogaW5kaWNhdGVzIHRoYXQgdGhlIHByb2dyYW0gaXMgdG8gZXhpdCAqLworc3RhdGljIGludCBkb19leGl0OyAgICAgICAgICAgICAvKiBpbmRpY2F0ZXMgdGhhdCB0aGUgcHJvZ3JhbSBpcyB0byBleGl0ICovCiAjZW5kaWYKLXN0YXRpYyBpbnQgZXhpdGluZzsJCS8qIHdlJ3JlIGFscmVhZHkgZXhpdGluZyAoZm9yIG1heWJlX2V4aXQpICovCi1zdGF0aWMgcGlkX3QgbXlfcGlkOwkJLyogUElEIG9mIG1haW4gdGhyZWFkICovCitzdGF0aWMgaW50IGV4aXRpbmc7ICAgICAgICAgICAgIC8qIHdlJ3JlIGFscmVhZHkgZXhpdGluZyAoZm9yIG1heWJlX2V4aXQpICovCitzdGF0aWMgcGlkX3QgbXlfcGlkOyAgICAgICAgICAgIC8qIFBJRCBvZiBtYWluIHRocmVhZCAqLwogc3RhdGljIHN0cnVjdCBwaWRsaXN0IHsKLQlwaWRfdCBwYXJlbnQ7Ci0JcGlkX3QgY2hpbGQ7Ci19IHBpZGxpc3RbTUFYUFJPQ107CS8qIFBJRHMgb2Ygb3RoZXIgdGhyZWFkczsgcHJvdGVjdGVkIGJ5IGNvdW50X2xvY2sgKi8KLXN0YXRpYyBpbnQgbWF4cGlkaW5kZXg7CQkvKiAjIG9mIFBJRHMgaW4gcGlkbGlzdCAqLworICAgIHBpZF90IHBhcmVudDsKKyAgICBwaWRfdCBjaGlsZDsKK30gcGlkbGlzdFtNQVhQUk9DXTsgICAgIC8qIFBJRHMgb2Ygb3RoZXIgdGhyZWFkczsgcHJvdGVjdGVkIGJ5IGNvdW50X2xvY2sgKi8KK3N0YXRpYyBpbnQgbWF4cGlkaW5kZXg7ICAgICAgICAgLyogIyBvZiBQSURzIGluIHBpZGxpc3QgKi8KIAogI2lmbmRlZiBOT19FWElUX1BST0cKIC8qCkBAIC0zNiwxOSArMzYsMTkgQEAKICAqLwogc3RhdGljIHZvaWQgZXhpdF9zaWcodm9pZCkKIHsKLQlkMnByaW50ZigoImV4aXRfc2lnIGNhbGxlZFxuIikpOwotCWlmIChleGl0aW5nICYmIGdldHBpZCgpID09IG15X3BpZCkgewotCQlkMnByaW50ZigoImFscmVhZHkgZXhpdGluZ1xuIikpOwotCQlyZXR1cm47Ci0JfQotCWlmIChkb19leGl0KSB7Ci0JCWQycHJpbnRmKCgiZXhpdGluZyBpbiBleGl0X3NpZ1xuIikpOworICAgIGQycHJpbnRmKCgiZXhpdF9zaWcgY2FsbGVkXG4iKSk7CisgICAgaWYgKGV4aXRpbmcgJiYgZ2V0cGlkKCkgPT0gbXlfcGlkKSB7CisgICAgICAgIGQycHJpbnRmKCgiYWxyZWFkeSBleGl0aW5nXG4iKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKGRvX2V4aXQpIHsKKyAgICAgICAgZDJwcmludGYoKCJleGl0aW5nIGluIGV4aXRfc2lnXG4iKSk7CiAjaWZkZWYgUHlfREVCVUcKLQkJaWYgKCh0aHJlYWRfZGVidWcgJiA4KSA9PSAwKQotCQkJdGhyZWFkX2RlYnVnICY9IH4xOyAvKiBkb24ndCBwcm9kdWNlIGRlYnVnIG1lc3NhZ2VzICovCisgICAgICAgIGlmICgodGhyZWFkX2RlYnVnICYgOCkgPT0gMCkKKyAgICAgICAgICAgIHRocmVhZF9kZWJ1ZyAmPSB+MTsgLyogZG9uJ3QgcHJvZHVjZSBkZWJ1ZyBtZXNzYWdlcyAqLwogI2VuZGlmCi0JCVB5VGhyZWFkX2V4aXRfdGhyZWFkKCk7Ci0JfQorICAgICAgICBQeVRocmVhZF9leGl0X3RocmVhZCgpOworICAgIH0KIH0KIAogLyoKQEAgLTU3LDEyICs1NywxMiBAQAogICovCiBzdGF0aWMgdm9pZCBtYXliZV9leGl0KHZvaWQpCiB7Ci0JZHByaW50ZigoIm1heWJlX2V4aXQgY2FsbGVkXG4iKSk7Ci0JaWYgKGV4aXRpbmcpIHsKLQkJZHByaW50ZigoImFscmVhZHkgZXhpdGluZ1xuIikpOwotCQlyZXR1cm47Ci0JfQotCVB5VGhyZWFkX2V4aXRfcHJvZygwKTsKKyAgICBkcHJpbnRmKCgibWF5YmVfZXhpdCBjYWxsZWRcbiIpKTsKKyAgICBpZiAoZXhpdGluZykgeworICAgICAgICBkcHJpbnRmKCgiYWxyZWFkeSBleGl0aW5nXG4iKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgUHlUaHJlYWRfZXhpdF9wcm9nKDApOwogfQogI2VuZGlmIC8qIE5PX0VYSVRfUFJPRyAqLwogCkBAIC03Miw1OCArNzIsNTggQEAKIHN0YXRpYyB2b2lkIFB5VGhyZWFkX19pbml0X3RocmVhZCh2b2lkKQogewogI2lmbmRlZiBOT19FWElUX1BST0cKLQlzdHJ1Y3Qgc2lnYWN0aW9uIHM7CisgICAgc3RydWN0IHNpZ2FjdGlvbiBzOwogI2VuZGlmIC8qIE5PX0VYSVRfUFJPRyAqLwogI2lmZGVmIFVTRV9ETAotCWxvbmcgYWRkciwgc2l6ZTsKKyAgICBsb25nIGFkZHIsIHNpemU7CiAjZW5kaWYgLyogVVNFX0RMICovCiAKIAogI2lmZGVmIFVTRV9ETAotCWlmICgoc2l6ZSA9IHVzY29uZmlnKENPTkZfSU5JVFNJWkUsIDY0KjEwMjQpKSA8IDApCi0JCXBlcnJvcigidXNjb25maWcgLSBDT05GX0lOSVRTSVpFIChjaGVjaykiKTsKLQlpZiAodXNjb25maWcoQ09ORl9JTklUU0laRSwgc2l6ZSkgPCAwKQotCQlwZXJyb3IoInVzY29uZmlnIC0gQ09ORl9JTklUU0laRSAocmVzZXQpIik7Ci0JYWRkciA9IChsb25nKSBkbF9nZXRyYW5nZShzaXplICsgSERSX1NJWkUpOwotCWRwcmludGYoKCJ0cnlpbmcgdG8gdXNlIGFkZHIgJXAtJXAgZm9yIHNoYXJlZCBhcmVuYVxuIiwgYWRkciwgYWRkcitzaXplKSk7Ci0JZXJybm8gPSAwOwotCWlmICgoYWRkciA9IHVzY29uZmlnKENPTkZfQVRUQUNIQUREUiwgYWRkcikpIDwgMCAmJiBlcnJubyAhPSAwKQotCQlwZXJyb3IoInVzY29uZmlnIC0gQ09ORl9BVFRBQ0hBRERSIChzZXQpIik7CisgICAgaWYgKChzaXplID0gdXNjb25maWcoQ09ORl9JTklUU0laRSwgNjQqMTAyNCkpIDwgMCkKKyAgICAgICAgcGVycm9yKCJ1c2NvbmZpZyAtIENPTkZfSU5JVFNJWkUgKGNoZWNrKSIpOworICAgIGlmICh1c2NvbmZpZyhDT05GX0lOSVRTSVpFLCBzaXplKSA8IDApCisgICAgICAgIHBlcnJvcigidXNjb25maWcgLSBDT05GX0lOSVRTSVpFIChyZXNldCkiKTsKKyAgICBhZGRyID0gKGxvbmcpIGRsX2dldHJhbmdlKHNpemUgKyBIRFJfU0laRSk7CisgICAgZHByaW50ZigoInRyeWluZyB0byB1c2UgYWRkciAlcC0lcCBmb3Igc2hhcmVkIGFyZW5hXG4iLCBhZGRyLCBhZGRyK3NpemUpKTsKKyAgICBlcnJubyA9IDA7CisgICAgaWYgKChhZGRyID0gdXNjb25maWcoQ09ORl9BVFRBQ0hBRERSLCBhZGRyKSkgPCAwICYmIGVycm5vICE9IDApCisgICAgICAgIHBlcnJvcigidXNjb25maWcgLSBDT05GX0FUVEFDSEFERFIgKHNldCkiKTsKICNlbmRpZiAvKiBVU0VfREwgKi8KLQlpZiAodXNjb25maWcoQ09ORl9JTklUVVNFUlMsIDE2KSA8IDApCi0JCXBlcnJvcigidXNjb25maWcgLSBDT05GX0lOSVRVU0VSUyIpOwotCW15X3BpZCA9IGdldHBpZCgpOwkvKiBzbyB0aGF0IHdlIGtub3cgd2hpY2ggaXMgdGhlIG1haW4gdGhyZWFkICovCisgICAgaWYgKHVzY29uZmlnKENPTkZfSU5JVFVTRVJTLCAxNikgPCAwKQorICAgICAgICBwZXJyb3IoInVzY29uZmlnIC0gQ09ORl9JTklUVVNFUlMiKTsKKyAgICBteV9waWQgPSBnZXRwaWQoKTsgICAgICAgICAgLyogc28gdGhhdCB3ZSBrbm93IHdoaWNoIGlzIHRoZSBtYWluIHRocmVhZCAqLwogI2lmbmRlZiBOT19FWElUX1BST0cKLQlhdGV4aXQobWF5YmVfZXhpdCk7Ci0Jcy5zYV9oYW5kbGVyID0gZXhpdF9zaWc7Ci0Jc2lnZW1wdHlzZXQoJnMuc2FfbWFzayk7Ci0JLypzaWdhZGRzZXQoJnMuc2FfbWFzaywgU0lHVVNSMSk7Ki8KLQlzLnNhX2ZsYWdzID0gMDsKLQlzaWdhY3Rpb24oU0lHVVNSMSwgJnMsIDApOwotCWlmIChwcmN0bChQUl9TRVRFWElUU0lHLCBTSUdVU1IxKSA8IDApCi0JCXBlcnJvcigicHJjdGwgLSBQUl9TRVRFWElUU0lHIik7CisgICAgYXRleGl0KG1heWJlX2V4aXQpOworICAgIHMuc2FfaGFuZGxlciA9IGV4aXRfc2lnOworICAgIHNpZ2VtcHR5c2V0KCZzLnNhX21hc2spOworICAgIC8qc2lnYWRkc2V0KCZzLnNhX21hc2ssIFNJR1VTUjEpOyovCisgICAgcy5zYV9mbGFncyA9IDA7CisgICAgc2lnYWN0aW9uKFNJR1VTUjEsICZzLCAwKTsKKyAgICBpZiAocHJjdGwoUFJfU0VURVhJVFNJRywgU0lHVVNSMSkgPCAwKQorICAgICAgICBwZXJyb3IoInByY3RsIC0gUFJfU0VURVhJVFNJRyIpOwogI2VuZGlmIC8qIE5PX0VYSVRfUFJPRyAqLwotCWlmICh1c2NvbmZpZyhDT05GX0FSRU5BVFlQRSwgVVNfU0hBUkVET05MWSkgPCAwKQotCQlwZXJyb3IoInVzY29uZmlnIC0gQ09ORl9BUkVOQVRZUEUiKTsKLQl1c2NvbmZpZyhDT05GX0xPQ0tUWVBFLCBVU19ERUJVRyk7IC8qIFhYWCAqLworICAgIGlmICh1c2NvbmZpZyhDT05GX0FSRU5BVFlQRSwgVVNfU0hBUkVET05MWSkgPCAwKQorICAgICAgICBwZXJyb3IoInVzY29uZmlnIC0gQ09ORl9BUkVOQVRZUEUiKTsKKyAgICB1c2NvbmZpZyhDT05GX0xPQ0tUWVBFLCBVU19ERUJVRyk7IC8qIFhYWCAqLwogI2lmZGVmIFB5X0RFQlVHCi0JaWYgKHRocmVhZF9kZWJ1ZyAmIDQpCi0JCXVzY29uZmlnKENPTkZfTE9DS1RZUEUsIFVTX0RFQlVHUExVUyk7Ci0JZWxzZSBpZiAodGhyZWFkX2RlYnVnICYgMikKLQkJdXNjb25maWcoQ09ORl9MT0NLVFlQRSwgVVNfREVCVUcpOworICAgIGlmICh0aHJlYWRfZGVidWcgJiA0KQorICAgICAgICB1c2NvbmZpZyhDT05GX0xPQ0tUWVBFLCBVU19ERUJVR1BMVVMpOworICAgIGVsc2UgaWYgKHRocmVhZF9kZWJ1ZyAmIDIpCisgICAgICAgIHVzY29uZmlnKENPTkZfTE9DS1RZUEUsIFVTX0RFQlVHKTsKICNlbmRpZiAvKiBQeV9ERUJVRyAqLwotCWlmICgoc2hhcmVkX2FyZW5hID0gdXNpbml0KHRtcG5hbSgwKSkpID09IDApCi0JCXBlcnJvcigidXNpbml0Iik7CisgICAgaWYgKChzaGFyZWRfYXJlbmEgPSB1c2luaXQodG1wbmFtKDApKSkgPT0gMCkKKyAgICAgICAgcGVycm9yKCJ1c2luaXQiKTsKICNpZmRlZiBVU0VfREwKLQlpZiAodXNjb25maWcoQ09ORl9BVFRBQ0hBRERSLCBhZGRyKSA8IDApIC8qIHJlc2V0IGFkZHJlc3MgKi8KLQkJcGVycm9yKCJ1c2NvbmZpZyAtIENPTkZfQVRUQUNIQUREUiAocmVzZXQpIik7CisgICAgaWYgKHVzY29uZmlnKENPTkZfQVRUQUNIQUREUiwgYWRkcikgPCAwKSAvKiByZXNldCBhZGRyZXNzICovCisgICAgICAgIHBlcnJvcigidXNjb25maWcgLSBDT05GX0FUVEFDSEFERFIgKHJlc2V0KSIpOwogI2VuZGlmIC8qIFVTRV9ETCAqLwotCWlmICgoY291bnRfbG9jayA9IHVzbmV3bG9jayhzaGFyZWRfYXJlbmEpKSA9PSBOVUxMKQotCQlwZXJyb3IoInVzbmV3bG9jayAoY291bnRfbG9jaykiKTsKLQkodm9pZCkgdXNpbml0bG9jayhjb3VudF9sb2NrKTsKLQlpZiAoKHdhaXRfbG9jayA9IHVzbmV3bG9jayhzaGFyZWRfYXJlbmEpKSA9PSBOVUxMKQotCQlwZXJyb3IoInVzbmV3bG9jayAod2FpdF9sb2NrKSIpOwotCWRwcmludGYoKCJhcmVuYSBzdGFydDogJXAsIGFyZW5hIHNpemU6ICVsZFxuIiwgIHNoYXJlZF9hcmVuYSwgKGxvbmcpIHVzY29uZmlnKENPTkZfR0VUU0laRSwgc2hhcmVkX2FyZW5hKSkpOworICAgIGlmICgoY291bnRfbG9jayA9IHVzbmV3bG9jayhzaGFyZWRfYXJlbmEpKSA9PSBOVUxMKQorICAgICAgICBwZXJyb3IoInVzbmV3bG9jayAoY291bnRfbG9jaykiKTsKKyAgICAodm9pZCkgdXNpbml0bG9jayhjb3VudF9sb2NrKTsKKyAgICBpZiAoKHdhaXRfbG9jayA9IHVzbmV3bG9jayhzaGFyZWRfYXJlbmEpKSA9PSBOVUxMKQorICAgICAgICBwZXJyb3IoInVzbmV3bG9jayAod2FpdF9sb2NrKSIpOworICAgIGRwcmludGYoKCJhcmVuYSBzdGFydDogJXAsIGFyZW5hIHNpemU6ICVsZFxuIiwgIHNoYXJlZF9hcmVuYSwgKGxvbmcpIHVzY29uZmlnKENPTkZfR0VUU0laRSwgc2hhcmVkX2FyZW5hKSkpOwogfQogCiAvKgpAQCAtMTMyLDE5OCArMTMyLDE5OCBAQAogCiBzdGF0aWMgdm9pZCBjbGVhbl90aHJlYWRzKHZvaWQpCiB7Ci0JaW50IGksIGo7Ci0JcGlkX3QgbXlwaWQsIHBpZDsKKyAgICBpbnQgaSwgajsKKyAgICBwaWRfdCBteXBpZCwgcGlkOwogCi0JLyogY2xlYW4gdXAgYW55IGV4aXRlZCB0aHJlYWRzICovCi0JbXlwaWQgPSBnZXRwaWQoKTsKLQlpID0gMDsKLQl3aGlsZSAoaSA8IG1heHBpZGluZGV4KSB7Ci0JCWlmIChwaWRsaXN0W2ldLnBhcmVudCA9PSBteXBpZCAmJiAocGlkID0gcGlkbGlzdFtpXS5jaGlsZCkgPiAwKSB7Ci0JCQlwaWQgPSB3YWl0cGlkKHBpZCwgMCwgV05PSEFORyk7Ci0JCQlpZiAocGlkID4gMCkgewotCQkJCS8qIGEgdGhyZWFkIGhhcyBleGl0ZWQgKi8KLQkJCQlwaWRsaXN0W2ldID0gcGlkbGlzdFstLW1heHBpZGluZGV4XTsKLQkJCQkvKiByZW1vdmUgcmVmZXJlbmNlcyB0byBjaGlsZHJlbiBvZiBkZWFkIHByb2MgKi8KLQkJCQlmb3IgKGogPSAwOyBqIDwgbWF4cGlkaW5kZXg7IGorKykKLQkJCQkJaWYgKHBpZGxpc3Rbal0ucGFyZW50ID09IHBpZCkKLQkJCQkJCXBpZGxpc3Rbal0uY2hpbGQgPSAtMTsKLQkJCQljb250aW51ZTsgLyogZG9uJ3QgaW5jcmVtZW50IGkgKi8KLQkJCX0KLQkJfQotCQlpKys7Ci0JfQotCS8qIGNsZWFuIHVwIHRoZSBsaXN0ICovCi0JaSA9IDA7Ci0Jd2hpbGUgKGkgPCBtYXhwaWRpbmRleCkgewotCQlpZiAocGlkbGlzdFtpXS5jaGlsZCA9PSAtMSkgewotCQkJcGlkbGlzdFtpXSA9IHBpZGxpc3RbLS1tYXhwaWRpbmRleF07Ci0JCQljb250aW51ZTsgLyogZG9uJ3QgaW5jcmVtZW50IGkgKi8KLQkJfQotCQlpKys7Ci0JfQorICAgIC8qIGNsZWFuIHVwIGFueSBleGl0ZWQgdGhyZWFkcyAqLworICAgIG15cGlkID0gZ2V0cGlkKCk7CisgICAgaSA9IDA7CisgICAgd2hpbGUgKGkgPCBtYXhwaWRpbmRleCkgeworICAgICAgICBpZiAocGlkbGlzdFtpXS5wYXJlbnQgPT0gbXlwaWQgJiYgKHBpZCA9IHBpZGxpc3RbaV0uY2hpbGQpID4gMCkgeworICAgICAgICAgICAgcGlkID0gd2FpdHBpZChwaWQsIDAsIFdOT0hBTkcpOworICAgICAgICAgICAgaWYgKHBpZCA+IDApIHsKKyAgICAgICAgICAgICAgICAvKiBhIHRocmVhZCBoYXMgZXhpdGVkICovCisgICAgICAgICAgICAgICAgcGlkbGlzdFtpXSA9IHBpZGxpc3RbLS1tYXhwaWRpbmRleF07CisgICAgICAgICAgICAgICAgLyogcmVtb3ZlIHJlZmVyZW5jZXMgdG8gY2hpbGRyZW4gb2YgZGVhZCBwcm9jICovCisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IG1heHBpZGluZGV4OyBqKyspCisgICAgICAgICAgICAgICAgICAgIGlmIChwaWRsaXN0W2pdLnBhcmVudCA9PSBwaWQpCisgICAgICAgICAgICAgICAgICAgICAgICBwaWRsaXN0W2pdLmNoaWxkID0gLTE7CisgICAgICAgICAgICAgICAgY29udGludWU7IC8qIGRvbid0IGluY3JlbWVudCBpICovCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaSsrOworICAgIH0KKyAgICAvKiBjbGVhbiB1cCB0aGUgbGlzdCAqLworICAgIGkgPSAwOworICAgIHdoaWxlIChpIDwgbWF4cGlkaW5kZXgpIHsKKyAgICAgICAgaWYgKHBpZGxpc3RbaV0uY2hpbGQgPT0gLTEpIHsKKyAgICAgICAgICAgIHBpZGxpc3RbaV0gPSBwaWRsaXN0Wy0tbWF4cGlkaW5kZXhdOworICAgICAgICAgICAgY29udGludWU7IC8qIGRvbid0IGluY3JlbWVudCBpICovCisgICAgICAgIH0KKyAgICAgICAgaSsrOworICAgIH0KIH0KIAogbG9uZyBQeVRocmVhZF9zdGFydF9uZXdfdGhyZWFkKHZvaWQgKCpmdW5jKSh2b2lkICopLCB2b2lkICphcmcpCiB7CiAjaWZkZWYgVVNFX0RMCi0JbG9uZyBhZGRyLCBzaXplOwotCXN0YXRpYyBpbnQgbG9jYWxfaW5pdGlhbGl6ZWQgPSAwOworICAgIGxvbmcgYWRkciwgc2l6ZTsKKyAgICBzdGF0aWMgaW50IGxvY2FsX2luaXRpYWxpemVkID0gMDsKICNlbmRpZiAvKiBVU0VfREwgKi8KLQlpbnQgc3VjY2VzcyA9IDA7CS8qIGluaXQgbm90IG5lZWRlZCB3aGVuIFNPTEFSSVNfVEhSRUFEUyBhbmQgKi8KLQkJCQkvKiBDX1RIUkVBRFMgaW1wbGVtZW50ZWQgcHJvcGVybHkgKi8KKyAgICBpbnQgc3VjY2VzcyA9IDA7ICAgICAgICAgICAgLyogaW5pdCBub3QgbmVlZGVkIHdoZW4gU09MQVJJU19USFJFQURTIGFuZCAqLworICAgICAgICAgICAgICAgIC8qIENfVEhSRUFEUyBpbXBsZW1lbnRlZCBwcm9wZXJseSAqLwogCi0JZHByaW50ZigoIlB5VGhyZWFkX3N0YXJ0X25ld190aHJlYWQgY2FsbGVkXG4iKSk7Ci0JaWYgKCFpbml0aWFsaXplZCkKLQkJUHlUaHJlYWRfaW5pdF90aHJlYWQoKTsKLQlzd2l0Y2ggKHVzc2V0bG9jayhjb3VudF9sb2NrKSkgewotCWNhc2UgMDogcmV0dXJuIDA7Ci0JY2FzZSAtMTogcGVycm9yKCJ1c3NldGxvY2sgKGNvdW50X2xvY2spIik7Ci0JfQotCWlmIChtYXhwaWRpbmRleCA+PSBNQVhQUk9DKQotCQlzdWNjZXNzID0gLTE7Ci0JZWxzZSB7CisgICAgZHByaW50ZigoIlB5VGhyZWFkX3N0YXJ0X25ld190aHJlYWQgY2FsbGVkXG4iKSk7CisgICAgaWYgKCFpbml0aWFsaXplZCkKKyAgICAgICAgUHlUaHJlYWRfaW5pdF90aHJlYWQoKTsKKyAgICBzd2l0Y2ggKHVzc2V0bG9jayhjb3VudF9sb2NrKSkgeworICAgIGNhc2UgMDogcmV0dXJuIDA7CisgICAgY2FzZSAtMTogcGVycm9yKCJ1c3NldGxvY2sgKGNvdW50X2xvY2spIik7CisgICAgfQorICAgIGlmIChtYXhwaWRpbmRleCA+PSBNQVhQUk9DKQorICAgICAgICBzdWNjZXNzID0gLTE7CisgICAgZWxzZSB7CiAjaWZkZWYgVVNFX0RMCi0JCWlmICghbG9jYWxfaW5pdGlhbGl6ZWQpIHsKLQkJCWlmICgoc2l6ZSA9IHVzY29uZmlnKENPTkZfSU5JVFNJWkUsIDY0KjEwMjQpKSA8IDApCi0JCQkJcGVycm9yKCJ1c2NvbmZpZyAtIENPTkZfSU5JVFNJWkUgKGNoZWNrKSIpOwotCQkJaWYgKHVzY29uZmlnKENPTkZfSU5JVFNJWkUsIHNpemUpIDwgMCkKLQkJCQlwZXJyb3IoInVzY29uZmlnIC0gQ09ORl9JTklUU0laRSAocmVzZXQpIik7Ci0JCQlhZGRyID0gKGxvbmcpIGRsX2dldHJhbmdlKHNpemUgKyBIRFJfU0laRSk7Ci0JCQlkcHJpbnRmKCgidHJ5aW5nIHRvIHVzZSBhZGRyICVwLSVwIGZvciBzcHJvY1xuIiwKLQkJCQkgYWRkciwgYWRkcitzaXplKSk7Ci0JCQllcnJubyA9IDA7Ci0JCQlpZiAoKGFkZHIgPSB1c2NvbmZpZyhDT05GX0FUVEFDSEFERFIsIGFkZHIpKSA8IDAgJiYKLQkJCSAgICBlcnJubyAhPSAwKQotCQkJCXBlcnJvcigidXNjb25maWcgLSBDT05GX0FUVEFDSEFERFIgKHNldCkiKTsKLQkJfQorICAgICAgICBpZiAoIWxvY2FsX2luaXRpYWxpemVkKSB7CisgICAgICAgICAgICBpZiAoKHNpemUgPSB1c2NvbmZpZyhDT05GX0lOSVRTSVpFLCA2NCoxMDI0KSkgPCAwKQorICAgICAgICAgICAgICAgIHBlcnJvcigidXNjb25maWcgLSBDT05GX0lOSVRTSVpFIChjaGVjaykiKTsKKyAgICAgICAgICAgIGlmICh1c2NvbmZpZyhDT05GX0lOSVRTSVpFLCBzaXplKSA8IDApCisgICAgICAgICAgICAgICAgcGVycm9yKCJ1c2NvbmZpZyAtIENPTkZfSU5JVFNJWkUgKHJlc2V0KSIpOworICAgICAgICAgICAgYWRkciA9IChsb25nKSBkbF9nZXRyYW5nZShzaXplICsgSERSX1NJWkUpOworICAgICAgICAgICAgZHByaW50ZigoInRyeWluZyB0byB1c2UgYWRkciAlcC0lcCBmb3Igc3Byb2NcbiIsCisgICAgICAgICAgICAgICAgICAgICBhZGRyLCBhZGRyK3NpemUpKTsKKyAgICAgICAgICAgIGVycm5vID0gMDsKKyAgICAgICAgICAgIGlmICgoYWRkciA9IHVzY29uZmlnKENPTkZfQVRUQUNIQUREUiwgYWRkcikpIDwgMCAmJgorICAgICAgICAgICAgICAgIGVycm5vICE9IDApCisgICAgICAgICAgICAgICAgcGVycm9yKCJ1c2NvbmZpZyAtIENPTkZfQVRUQUNIQUREUiAoc2V0KSIpOworICAgICAgICB9CiAjZW5kaWYgLyogVVNFX0RMICovCi0JCWNsZWFuX3RocmVhZHMoKTsKLQkJaWYgKChzdWNjZXNzID0gc3Byb2MoZnVuYywgUFJfU0FMTCwgYXJnKSkgPCAwKQotCQkJcGVycm9yKCJzcHJvYyIpOworICAgICAgICBjbGVhbl90aHJlYWRzKCk7CisgICAgICAgIGlmICgoc3VjY2VzcyA9IHNwcm9jKGZ1bmMsIFBSX1NBTEwsIGFyZykpIDwgMCkKKyAgICAgICAgICAgIHBlcnJvcigic3Byb2MiKTsKICNpZmRlZiBVU0VfREwKLQkJaWYgKCFsb2NhbF9pbml0aWFsaXplZCkgewotCQkJaWYgKHVzY29uZmlnKENPTkZfQVRUQUNIQUREUiwgYWRkcikgPCAwKQotCQkJCS8qIHJlc2V0IGFkZHJlc3MgKi8KLQkJCQlwZXJyb3IoInVzY29uZmlnIC0gQ09ORl9BVFRBQ0hBRERSIChyZXNldCkiKTsKLQkJCWxvY2FsX2luaXRpYWxpemVkID0gMTsKLQkJfQorICAgICAgICBpZiAoIWxvY2FsX2luaXRpYWxpemVkKSB7CisgICAgICAgICAgICBpZiAodXNjb25maWcoQ09ORl9BVFRBQ0hBRERSLCBhZGRyKSA8IDApCisgICAgICAgICAgICAgICAgLyogcmVzZXQgYWRkcmVzcyAqLworICAgICAgICAgICAgICAgIHBlcnJvcigidXNjb25maWcgLSBDT05GX0FUVEFDSEFERFIgKHJlc2V0KSIpOworICAgICAgICAgICAgbG9jYWxfaW5pdGlhbGl6ZWQgPSAxOworICAgICAgICB9CiAjZW5kaWYgLyogVVNFX0RMICovCi0JCWlmIChzdWNjZXNzID49IDApIHsKLQkJCW50aHJlYWRzKys7Ci0JCQlwaWRsaXN0W21heHBpZGluZGV4XS5wYXJlbnQgPSBnZXRwaWQoKTsKLQkJCXBpZGxpc3RbbWF4cGlkaW5kZXgrK10uY2hpbGQgPSBzdWNjZXNzOwotCQkJZHByaW50ZigoInBpZGxpc3RbJWRdID0gJWRcbiIsCi0JCQkJIG1heHBpZGluZGV4LTEsIHN1Y2Nlc3MpKTsKLQkJfQotCX0KLQlpZiAodXN1bnNldGxvY2soY291bnRfbG9jaykgPCAwKQotCQlwZXJyb3IoInVzdW5zZXRsb2NrIChjb3VudF9sb2NrKSIpOwotCXJldHVybiBzdWNjZXNzOworICAgICAgICBpZiAoc3VjY2VzcyA+PSAwKSB7CisgICAgICAgICAgICBudGhyZWFkcysrOworICAgICAgICAgICAgcGlkbGlzdFttYXhwaWRpbmRleF0ucGFyZW50ID0gZ2V0cGlkKCk7CisgICAgICAgICAgICBwaWRsaXN0W21heHBpZGluZGV4KytdLmNoaWxkID0gc3VjY2VzczsKKyAgICAgICAgICAgIGRwcmludGYoKCJwaWRsaXN0WyVkXSA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgbWF4cGlkaW5kZXgtMSwgc3VjY2VzcykpOworICAgICAgICB9CisgICAgfQorICAgIGlmICh1c3Vuc2V0bG9jayhjb3VudF9sb2NrKSA8IDApCisgICAgICAgIHBlcnJvcigidXN1bnNldGxvY2sgKGNvdW50X2xvY2spIik7CisgICAgcmV0dXJuIHN1Y2Nlc3M7CiB9CiAKIGxvbmcgUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCh2b2lkKQogewotCXJldHVybiBnZXRwaWQoKTsKKyAgICByZXR1cm4gZ2V0cGlkKCk7CiB9CiAKIHN0YXRpYyB2b2lkIGRvX1B5VGhyZWFkX2V4aXRfdGhyZWFkKGludCBub19jbGVhbnVwKQogewotCWRwcmludGYoKCJQeVRocmVhZF9leGl0X3RocmVhZCBjYWxsZWRcbiIpKTsKLQlpZiAoIWluaXRpYWxpemVkKQotCQlpZiAobm9fY2xlYW51cCkKLQkJCV9leGl0KDApOwotCQllbHNlCi0JCQlleGl0KDApOwotCWlmICh1c3NldGxvY2soY291bnRfbG9jaykgPCAwKQotCQlwZXJyb3IoInVzc2V0bG9jayAoY291bnRfbG9jaykiKTsKLQludGhyZWFkcy0tOwotCWlmIChnZXRwaWQoKSA9PSBteV9waWQpIHsKLQkJLyogbWFpbiB0aHJlYWQ7IHdhaXQgZm9yIG90aGVyIHRocmVhZHMgdG8gZXhpdCAqLwotCQlleGl0aW5nID0gMTsKKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfZXhpdF90aHJlYWQgY2FsbGVkXG4iKSk7CisgICAgaWYgKCFpbml0aWFsaXplZCkKKyAgICAgICAgaWYgKG5vX2NsZWFudXApCisgICAgICAgICAgICBfZXhpdCgwKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZXhpdCgwKTsKKyAgICBpZiAodXNzZXRsb2NrKGNvdW50X2xvY2spIDwgMCkKKyAgICAgICAgcGVycm9yKCJ1c3NldGxvY2sgKGNvdW50X2xvY2spIik7CisgICAgbnRocmVhZHMtLTsKKyAgICBpZiAoZ2V0cGlkKCkgPT0gbXlfcGlkKSB7CisgICAgICAgIC8qIG1haW4gdGhyZWFkOyB3YWl0IGZvciBvdGhlciB0aHJlYWRzIHRvIGV4aXQgKi8KKyAgICAgICAgZXhpdGluZyA9IDE7CiAjaWZuZGVmIE5PX0VYSVRfUFJPRwotCQlpZiAoZG9fZXhpdCkgewotCQkJaW50IGk7CisgICAgICAgIGlmIChkb19leGl0KSB7CisgICAgICAgICAgICBpbnQgaTsKIAotCQkJLyogbm90aWZ5IG90aGVyIHRocmVhZHMgKi8KLQkJCWNsZWFuX3RocmVhZHMoKTsKLQkJCWlmIChudGhyZWFkcyA+PSAwKSB7Ci0JCQkJZHByaW50ZigoImtpbGwgb3RoZXIgdGhyZWFkc1xuIikpOwotCQkJCWZvciAoaSA9IDA7IGkgPCBtYXhwaWRpbmRleDsgaSsrKQotCQkJCQlpZiAocGlkbGlzdFtpXS5jaGlsZCA+IDApCi0JCQkJCQkodm9pZCkga2lsbChwaWRsaXN0W2ldLmNoaWxkLAotCQkJCQkJCSAgICBTSUdLSUxMKTsKLQkJCQlfZXhpdChleGl0X3N0YXR1cyk7Ci0JCQl9Ci0JCX0KKyAgICAgICAgICAgIC8qIG5vdGlmeSBvdGhlciB0aHJlYWRzICovCisgICAgICAgICAgICBjbGVhbl90aHJlYWRzKCk7CisgICAgICAgICAgICBpZiAobnRocmVhZHMgPj0gMCkgeworICAgICAgICAgICAgICAgIGRwcmludGYoKCJraWxsIG90aGVyIHRocmVhZHNcbiIpKTsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbWF4cGlkaW5kZXg7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBpZGxpc3RbaV0uY2hpbGQgPiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQpIGtpbGwocGlkbGlzdFtpXS5jaGlsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJR0tJTEwpOworICAgICAgICAgICAgICAgIF9leGl0KGV4aXRfc3RhdHVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogI2VuZGlmIC8qIE5PX0VYSVRfUFJPRyAqLwotCQl3YWl0aW5nX2Zvcl90aHJlYWRzID0gMTsKLQkJaWYgKHVzc2V0bG9jayh3YWl0X2xvY2spIDwgMCkKLQkJCXBlcnJvcigidXNzZXRsb2NrICh3YWl0X2xvY2spIik7Ci0JCWZvciAoOzspIHsKLQkJCWlmIChudGhyZWFkcyA8IDApIHsKLQkJCQlkcHJpbnRmKCgicmVhbGx5IGV4aXQgKCVkKVxuIiwgZXhpdF9zdGF0dXMpKTsKLQkJCQlpZiAobm9fY2xlYW51cCkKLQkJCQkJX2V4aXQoZXhpdF9zdGF0dXMpOwotCQkJCWVsc2UKLQkJCQkJZXhpdChleGl0X3N0YXR1cyk7Ci0JCQl9Ci0JCQlpZiAodXN1bnNldGxvY2soY291bnRfbG9jaykgPCAwKQotCQkJCXBlcnJvcigidXN1bnNldGxvY2sgKGNvdW50X2xvY2spIik7Ci0JCQlkcHJpbnRmKCgid2FpdGluZyBmb3Igb3RoZXIgdGhyZWFkcyAoJWQpXG4iLCBudGhyZWFkcykpOwotCQkJaWYgKHVzc2V0bG9jayh3YWl0X2xvY2spIDwgMCkKLQkJCQlwZXJyb3IoInVzc2V0bG9jayAod2FpdF9sb2NrKSIpOwotCQkJaWYgKHVzc2V0bG9jayhjb3VudF9sb2NrKSA8IDApCi0JCQkJcGVycm9yKCJ1c3NldGxvY2sgKGNvdW50X2xvY2spIik7Ci0JCX0KLQl9Ci0JLyogbm90IHRoZSBtYWluIHRocmVhZCAqLwotCWlmICh3YWl0aW5nX2Zvcl90aHJlYWRzKSB7Ci0JCWRwcmludGYoKCJtYWluIHRocmVhZCBpcyB3YWl0aW5nXG4iKSk7Ci0JCWlmICh1c3Vuc2V0bG9jayh3YWl0X2xvY2spIDwgMCkKLQkJCXBlcnJvcigidXN1bnNldGxvY2sgKHdhaXRfbG9jaykiKTsKLQl9CisgICAgICAgIHdhaXRpbmdfZm9yX3RocmVhZHMgPSAxOworICAgICAgICBpZiAodXNzZXRsb2NrKHdhaXRfbG9jaykgPCAwKQorICAgICAgICAgICAgcGVycm9yKCJ1c3NldGxvY2sgKHdhaXRfbG9jaykiKTsKKyAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgaWYgKG50aHJlYWRzIDwgMCkgeworICAgICAgICAgICAgICAgIGRwcmludGYoKCJyZWFsbHkgZXhpdCAoJWQpXG4iLCBleGl0X3N0YXR1cykpOworICAgICAgICAgICAgICAgIGlmIChub19jbGVhbnVwKQorICAgICAgICAgICAgICAgICAgICBfZXhpdChleGl0X3N0YXR1cyk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBleGl0KGV4aXRfc3RhdHVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh1c3Vuc2V0bG9jayhjb3VudF9sb2NrKSA8IDApCisgICAgICAgICAgICAgICAgcGVycm9yKCJ1c3Vuc2V0bG9jayAoY291bnRfbG9jaykiKTsKKyAgICAgICAgICAgIGRwcmludGYoKCJ3YWl0aW5nIGZvciBvdGhlciB0aHJlYWRzICglZClcbiIsIG50aHJlYWRzKSk7CisgICAgICAgICAgICBpZiAodXNzZXRsb2NrKHdhaXRfbG9jaykgPCAwKQorICAgICAgICAgICAgICAgIHBlcnJvcigidXNzZXRsb2NrICh3YWl0X2xvY2spIik7CisgICAgICAgICAgICBpZiAodXNzZXRsb2NrKGNvdW50X2xvY2spIDwgMCkKKyAgICAgICAgICAgICAgICBwZXJyb3IoInVzc2V0bG9jayAoY291bnRfbG9jaykiKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBub3QgdGhlIG1haW4gdGhyZWFkICovCisgICAgaWYgKHdhaXRpbmdfZm9yX3RocmVhZHMpIHsKKyAgICAgICAgZHByaW50ZigoIm1haW4gdGhyZWFkIGlzIHdhaXRpbmdcbiIpKTsKKyAgICAgICAgaWYgKHVzdW5zZXRsb2NrKHdhaXRfbG9jaykgPCAwKQorICAgICAgICAgICAgcGVycm9yKCJ1c3Vuc2V0bG9jayAod2FpdF9sb2NrKSIpOworICAgIH0KICNpZm5kZWYgTk9fRVhJVF9QUk9HCi0JZWxzZSBpZiAoZG9fZXhpdCkKLQkJKHZvaWQpIGtpbGwobXlfcGlkLCBTSUdVU1IxKTsKKyAgICBlbHNlIGlmIChkb19leGl0KQorICAgICAgICAodm9pZCkga2lsbChteV9waWQsIFNJR1VTUjEpOwogI2VuZGlmIC8qIE5PX0VYSVRfUFJPRyAqLwotCWlmICh1c3Vuc2V0bG9jayhjb3VudF9sb2NrKSA8IDApCi0JCXBlcnJvcigidXN1bnNldGxvY2sgKGNvdW50X2xvY2spIik7Ci0JX2V4aXQoMCk7CisgICAgaWYgKHVzdW5zZXRsb2NrKGNvdW50X2xvY2spIDwgMCkKKyAgICAgICAgcGVycm9yKCJ1c3Vuc2V0bG9jayAoY291bnRfbG9jaykiKTsKKyAgICBfZXhpdCgwKTsKIH0KIAogdm9pZCBQeVRocmVhZF9leGl0X3RocmVhZCh2b2lkKQogewotCWRvX1B5VGhyZWFkX2V4aXRfdGhyZWFkKDApOworICAgIGRvX1B5VGhyZWFkX2V4aXRfdGhyZWFkKDApOwogfQogCiB2b2lkIFB5VGhyZWFkX19leGl0X3RocmVhZCh2b2lkKQogewotCWRvX1B5VGhyZWFkX2V4aXRfdGhyZWFkKDEpOworICAgIGRvX1B5VGhyZWFkX2V4aXRfdGhyZWFkKDEpOwogfQogCiAjaWZuZGVmIE5PX0VYSVRfUFJPRwogc3RhdGljIHZvaWQgZG9fUHlUaHJlYWRfZXhpdF9wcm9nKGludCBzdGF0dXMsIGludCBub19jbGVhbnVwKQogewotCWRwcmludGYoKCJQeVRocmVhZF9leGl0X3Byb2coJWQpIGNhbGxlZFxuIiwgc3RhdHVzKSk7Ci0JaWYgKCFpbml0aWFsaXplZCkKLQkJaWYgKG5vX2NsZWFudXApCi0JCQlfZXhpdChzdGF0dXMpOwotCQllbHNlCi0JCQlleGl0KHN0YXR1cyk7Ci0JZG9fZXhpdCA9IDE7Ci0JZXhpdF9zdGF0dXMgPSBzdGF0dXM7Ci0JZG9fUHlUaHJlYWRfZXhpdF90aHJlYWQobm9fY2xlYW51cCk7CisgICAgZHByaW50ZigoIlB5VGhyZWFkX2V4aXRfcHJvZyglZCkgY2FsbGVkXG4iLCBzdGF0dXMpKTsKKyAgICBpZiAoIWluaXRpYWxpemVkKQorICAgICAgICBpZiAobm9fY2xlYW51cCkKKyAgICAgICAgICAgIF9leGl0KHN0YXR1cyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGV4aXQoc3RhdHVzKTsKKyAgICBkb19leGl0ID0gMTsKKyAgICBleGl0X3N0YXR1cyA9IHN0YXR1czsKKyAgICBkb19QeVRocmVhZF9leGl0X3RocmVhZChub19jbGVhbnVwKTsKIH0KIAogdm9pZCBQeVRocmVhZF9leGl0X3Byb2coaW50IHN0YXR1cykKIHsKLQlkb19QeVRocmVhZF9leGl0X3Byb2coc3RhdHVzLCAwKTsKKyAgICBkb19QeVRocmVhZF9leGl0X3Byb2coc3RhdHVzLCAwKTsKIH0KIAogdm9pZCBQeVRocmVhZF9fZXhpdF9wcm9nKGludCBzdGF0dXMpCiB7Ci0JZG9fUHlUaHJlYWRfZXhpdF9wcm9nKHN0YXR1cywgMSk7CisgICAgZG9fUHlUaHJlYWRfZXhpdF9wcm9nKHN0YXR1cywgMSk7CiB9CiAjZW5kaWYgLyogTk9fRVhJVF9QUk9HICovCiAKQEAgLTMzMiw0NCArMzMyLDQ0IEBACiAgKi8KIFB5VGhyZWFkX3R5cGVfbG9jayBQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKHZvaWQpCiB7Ci0JdWxvY2tfdCBsb2NrOworICAgIHVsb2NrX3QgbG9jazsKIAotCWRwcmludGYoKCJQeVRocmVhZF9hbGxvY2F0ZV9sb2NrIGNhbGxlZFxuIikpOwotCWlmICghaW5pdGlhbGl6ZWQpCi0JCVB5VGhyZWFkX2luaXRfdGhyZWFkKCk7CisgICAgZHByaW50ZigoIlB5VGhyZWFkX2FsbG9jYXRlX2xvY2sgY2FsbGVkXG4iKSk7CisgICAgaWYgKCFpbml0aWFsaXplZCkKKyAgICAgICAgUHlUaHJlYWRfaW5pdF90aHJlYWQoKTsKIAotCWlmICgobG9jayA9IHVzbmV3bG9jayhzaGFyZWRfYXJlbmEpKSA9PSBOVUxMKQotCQlwZXJyb3IoInVzbmV3bG9jayIpOwotCSh2b2lkKSB1c2luaXRsb2NrKGxvY2spOwotCWRwcmludGYoKCJQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKCkgLT4gJXBcbiIsIGxvY2spKTsKLQlyZXR1cm4gKFB5VGhyZWFkX3R5cGVfbG9jaykgbG9jazsKKyAgICBpZiAoKGxvY2sgPSB1c25ld2xvY2soc2hhcmVkX2FyZW5hKSkgPT0gTlVMTCkKKyAgICAgICAgcGVycm9yKCJ1c25ld2xvY2siKTsKKyAgICAodm9pZCkgdXNpbml0bG9jayhsb2NrKTsKKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfYWxsb2NhdGVfbG9jaygpIC0+ICVwXG4iLCBsb2NrKSk7CisgICAgcmV0dXJuIChQeVRocmVhZF90eXBlX2xvY2spIGxvY2s7CiB9CiAKIHZvaWQgUHlUaHJlYWRfZnJlZV9sb2NrKFB5VGhyZWFkX3R5cGVfbG9jayBsb2NrKQogewotCWRwcmludGYoKCJQeVRocmVhZF9mcmVlX2xvY2soJXApIGNhbGxlZFxuIiwgbG9jaykpOwotCXVzZnJlZWxvY2soKHVsb2NrX3QpIGxvY2ssIHNoYXJlZF9hcmVuYSk7CisgICAgZHByaW50ZigoIlB5VGhyZWFkX2ZyZWVfbG9jayglcCkgY2FsbGVkXG4iLCBsb2NrKSk7CisgICAgdXNmcmVlbG9jaygodWxvY2tfdCkgbG9jaywgc2hhcmVkX2FyZW5hKTsKIH0KIAogaW50IFB5VGhyZWFkX2FjcXVpcmVfbG9jayhQeVRocmVhZF90eXBlX2xvY2sgbG9jaywgaW50IHdhaXRmbGFnKQogewotCWludCBzdWNjZXNzOworICAgIGludCBzdWNjZXNzOwogCi0JZHByaW50ZigoIlB5VGhyZWFkX2FjcXVpcmVfbG9jayglcCwgJWQpIGNhbGxlZFxuIiwgbG9jaywgd2FpdGZsYWcpKTsKLQllcnJubyA9IDA7CQkvKiBjbGVhciBpdCBqdXN0IGluIGNhc2UgKi8KLQlpZiAod2FpdGZsYWcpCi0JCXN1Y2Nlc3MgPSB1c3NldGxvY2soKHVsb2NrX3QpIGxvY2spOwotCWVsc2UKLQkJc3VjY2VzcyA9IHVzY3NldGxvY2soKHVsb2NrX3QpIGxvY2ssIDEpOyAvKiBUcnkgaXQgb25jZSAqLwotCWlmIChzdWNjZXNzIDwgMCkKLQkJcGVycm9yKHdhaXRmbGFnID8gInVzc2V0bG9jayIgOiAidXNjc2V0bG9jayIpOwotCWRwcmludGYoKCJQeVRocmVhZF9hY3F1aXJlX2xvY2soJXAsICVkKSAtPiAlZFxuIiwgbG9jaywgd2FpdGZsYWcsIHN1Y2Nlc3MpKTsKLQlyZXR1cm4gc3VjY2VzczsKKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfYWNxdWlyZV9sb2NrKCVwLCAlZCkgY2FsbGVkXG4iLCBsb2NrLCB3YWl0ZmxhZykpOworICAgIGVycm5vID0gMDsgICAgICAgICAgICAgICAgICAvKiBjbGVhciBpdCBqdXN0IGluIGNhc2UgKi8KKyAgICBpZiAod2FpdGZsYWcpCisgICAgICAgIHN1Y2Nlc3MgPSB1c3NldGxvY2soKHVsb2NrX3QpIGxvY2spOworICAgIGVsc2UKKyAgICAgICAgc3VjY2VzcyA9IHVzY3NldGxvY2soKHVsb2NrX3QpIGxvY2ssIDEpOyAvKiBUcnkgaXQgb25jZSAqLworICAgIGlmIChzdWNjZXNzIDwgMCkKKyAgICAgICAgcGVycm9yKHdhaXRmbGFnID8gInVzc2V0bG9jayIgOiAidXNjc2V0bG9jayIpOworICAgIGRwcmludGYoKCJQeVRocmVhZF9hY3F1aXJlX2xvY2soJXAsICVkKSAtPiAlZFxuIiwgbG9jaywgd2FpdGZsYWcsIHN1Y2Nlc3MpKTsKKyAgICByZXR1cm4gc3VjY2VzczsKIH0KIAogdm9pZCBQeVRocmVhZF9yZWxlYXNlX2xvY2soUHlUaHJlYWRfdHlwZV9sb2NrIGxvY2spCiB7Ci0JZHByaW50ZigoIlB5VGhyZWFkX3JlbGVhc2VfbG9jayglcCkgY2FsbGVkXG4iLCBsb2NrKSk7Ci0JaWYgKHVzdW5zZXRsb2NrKCh1bG9ja190KSBsb2NrKSA8IDApCi0JCXBlcnJvcigidXN1bnNldGxvY2siKTsKKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfcmVsZWFzZV9sb2NrKCVwKSBjYWxsZWRcbiIsIGxvY2spKTsKKyAgICBpZiAodXN1bnNldGxvY2soKHVsb2NrX3QpIGxvY2spIDwgMCkKKyAgICAgICAgcGVycm9yKCJ1c3Vuc2V0bG9jayIpOwogfQpkaWZmIC0tZ2l0IGEvUHl0aG9uL3RocmVhZF9zb2xhcmlzLmggYi9QeXRob24vdGhyZWFkX3NvbGFyaXMuaAppbmRleCBmZjNlNmYzLi41NmFjOGFlIDEwMDY0NAotLS0gYS9QeXRob24vdGhyZWFkX3NvbGFyaXMuaAorKysgYi9QeXRob24vdGhyZWFkX3NvbGFyaXMuaApAQCAtMTcsMTU4ICsxNywxNTggQEAKICAqIFRocmVhZCBzdXBwb3J0LgogICovCiBzdHJ1Y3QgZnVuY19hcmcgewotCXZvaWQgKCpmdW5jKSh2b2lkICopOwotCXZvaWQgKmFyZzsKKyAgICB2b2lkICgqZnVuYykodm9pZCAqKTsKKyAgICB2b2lkICphcmc7CiB9OwogCiBzdGF0aWMgdm9pZCAqCiBuZXdfZnVuYyh2b2lkICpmdW5jYXJnKQogewotCXZvaWQgKCpmdW5jKSh2b2lkICopOwotCXZvaWQgKmFyZzsKKyAgICB2b2lkICgqZnVuYykodm9pZCAqKTsKKyAgICB2b2lkICphcmc7CiAKLQlmdW5jID0gKChzdHJ1Y3QgZnVuY19hcmcgKikgZnVuY2FyZyktPmZ1bmM7Ci0JYXJnID0gKChzdHJ1Y3QgZnVuY19hcmcgKikgZnVuY2FyZyktPmFyZzsKLQlmcmVlKGZ1bmNhcmcpOwotCSgqZnVuYykoYXJnKTsKLQlyZXR1cm4gMDsKKyAgICBmdW5jID0gKChzdHJ1Y3QgZnVuY19hcmcgKikgZnVuY2FyZyktPmZ1bmM7CisgICAgYXJnID0gKChzdHJ1Y3QgZnVuY19hcmcgKikgZnVuY2FyZyktPmFyZzsKKyAgICBmcmVlKGZ1bmNhcmcpOworICAgICgqZnVuYykoYXJnKTsKKyAgICByZXR1cm4gMDsKIH0KIAogCiBsb25nCiBQeVRocmVhZF9zdGFydF9uZXdfdGhyZWFkKHZvaWQgKCpmdW5jKSh2b2lkICopLCB2b2lkICphcmcpCiB7Ci0JdGhyZWFkX3QgdGlkOwotCXN0cnVjdCBmdW5jX2FyZyAqZnVuY2FyZzsKKyAgICB0aHJlYWRfdCB0aWQ7CisgICAgc3RydWN0IGZ1bmNfYXJnICpmdW5jYXJnOwogCi0JZHByaW50ZigoIlB5VGhyZWFkX3N0YXJ0X25ld190aHJlYWQgY2FsbGVkXG4iKSk7Ci0JaWYgKCFpbml0aWFsaXplZCkKLQkJUHlUaHJlYWRfaW5pdF90aHJlYWQoKTsKLQlmdW5jYXJnID0gKHN0cnVjdCBmdW5jX2FyZyAqKSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBmdW5jX2FyZykpOwotCWZ1bmNhcmctPmZ1bmMgPSBmdW5jOwotCWZ1bmNhcmctPmFyZyA9IGFyZzsKLQlpZiAodGhyX2NyZWF0ZSgwLCAwLCBuZXdfZnVuYywgZnVuY2FyZywKLQkJICAgICAgIFRIUl9ERVRBQ0hFRCB8IFRIUl9ORVdfTFdQLCAmdGlkKSkgewotCQlwZXJyb3IoInRocl9jcmVhdGUiKTsKLQkJZnJlZSgodm9pZCAqKSBmdW5jYXJnKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlyZXR1cm4gdGlkOworICAgIGRwcmludGYoKCJQeVRocmVhZF9zdGFydF9uZXdfdGhyZWFkIGNhbGxlZFxuIikpOworICAgIGlmICghaW5pdGlhbGl6ZWQpCisgICAgICAgIFB5VGhyZWFkX2luaXRfdGhyZWFkKCk7CisgICAgZnVuY2FyZyA9IChzdHJ1Y3QgZnVuY19hcmcgKikgbWFsbG9jKHNpemVvZihzdHJ1Y3QgZnVuY19hcmcpKTsKKyAgICBmdW5jYXJnLT5mdW5jID0gZnVuYzsKKyAgICBmdW5jYXJnLT5hcmcgPSBhcmc7CisgICAgaWYgKHRocl9jcmVhdGUoMCwgMCwgbmV3X2Z1bmMsIGZ1bmNhcmcsCisgICAgICAgICAgICAgICAgICAgVEhSX0RFVEFDSEVEIHwgVEhSX05FV19MV1AsICZ0aWQpKSB7CisgICAgICAgIHBlcnJvcigidGhyX2NyZWF0ZSIpOworICAgICAgICBmcmVlKCh2b2lkICopIGZ1bmNhcmcpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiB0aWQ7CiB9CiAKIGxvbmcKIFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQodm9pZCkKIHsKLQlpZiAoIWluaXRpYWxpemVkKQotCQlQeVRocmVhZF9pbml0X3RocmVhZCgpOwotCXJldHVybiB0aHJfc2VsZigpOworICAgIGlmICghaW5pdGlhbGl6ZWQpCisgICAgICAgIFB5VGhyZWFkX2luaXRfdGhyZWFkKCk7CisgICAgcmV0dXJuIHRocl9zZWxmKCk7CiB9CiAKLXN0YXRpYyB2b2lkIAorc3RhdGljIHZvaWQKIGRvX1B5VGhyZWFkX2V4aXRfdGhyZWFkKGludCBub19jbGVhbnVwKQogewotCWRwcmludGYoKCJQeVRocmVhZF9leGl0X3RocmVhZCBjYWxsZWRcbiIpKTsKLQlpZiAoIWluaXRpYWxpemVkKQotCQlpZiAobm9fY2xlYW51cCkKLQkJCV9leGl0KDApOwotCQllbHNlCi0JCQlleGl0KDApOwotCXRocl9leGl0KDApOworICAgIGRwcmludGYoKCJQeVRocmVhZF9leGl0X3RocmVhZCBjYWxsZWRcbiIpKTsKKyAgICBpZiAoIWluaXRpYWxpemVkKQorICAgICAgICBpZiAobm9fY2xlYW51cCkKKyAgICAgICAgICAgIF9leGl0KDApOworICAgICAgICBlbHNlCisgICAgICAgICAgICBleGl0KDApOworICAgIHRocl9leGl0KDApOwogfQogCi12b2lkIAordm9pZAogUHlUaHJlYWRfZXhpdF90aHJlYWQodm9pZCkKIHsKLQlkb19QeVRocmVhZF9leGl0X3RocmVhZCgwKTsKKyAgICBkb19QeVRocmVhZF9leGl0X3RocmVhZCgwKTsKIH0KIAotdm9pZCAKK3ZvaWQKIFB5VGhyZWFkX19leGl0X3RocmVhZCh2b2lkKQogewotCWRvX1B5VGhyZWFkX2V4aXRfdGhyZWFkKDEpOworICAgIGRvX1B5VGhyZWFkX2V4aXRfdGhyZWFkKDEpOwogfQogCiAjaWZuZGVmIE5PX0VYSVRfUFJPRwotc3RhdGljIHZvaWQgCitzdGF0aWMgdm9pZAogZG9fUHlUaHJlYWRfZXhpdF9wcm9nKGludCBzdGF0dXMsIGludCBub19jbGVhbnVwKQogewotCWRwcmludGYoKCJQeVRocmVhZF9leGl0X3Byb2coJWQpIGNhbGxlZFxuIiwgc3RhdHVzKSk7Ci0JaWYgKCFpbml0aWFsaXplZCkKLQkJaWYgKG5vX2NsZWFudXApCi0JCQlfZXhpdChzdGF0dXMpOwotCQllbHNlCi0JCQlleGl0KHN0YXR1cyk7Ci0JaWYgKG5vX2NsZWFudXApCi0JCV9leGl0KHN0YXR1cyk7Ci0JZWxzZQotCQlleGl0KHN0YXR1cyk7CisgICAgZHByaW50ZigoIlB5VGhyZWFkX2V4aXRfcHJvZyglZCkgY2FsbGVkXG4iLCBzdGF0dXMpKTsKKyAgICBpZiAoIWluaXRpYWxpemVkKQorICAgICAgICBpZiAobm9fY2xlYW51cCkKKyAgICAgICAgICAgIF9leGl0KHN0YXR1cyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGV4aXQoc3RhdHVzKTsKKyAgICBpZiAobm9fY2xlYW51cCkKKyAgICAgICAgX2V4aXQoc3RhdHVzKTsKKyAgICBlbHNlCisgICAgICAgIGV4aXQoc3RhdHVzKTsKIH0KIAotdm9pZCAKK3ZvaWQKIFB5VGhyZWFkX2V4aXRfcHJvZyhpbnQgc3RhdHVzKQogewotCWRvX1B5VGhyZWFkX2V4aXRfcHJvZyhzdGF0dXMsIDApOworICAgIGRvX1B5VGhyZWFkX2V4aXRfcHJvZyhzdGF0dXMsIDApOwogfQogCi12b2lkIAordm9pZAogUHlUaHJlYWRfX2V4aXRfcHJvZyhpbnQgc3RhdHVzKQogewotCWRvX1B5VGhyZWFkX2V4aXRfcHJvZyhzdGF0dXMsIDEpOworICAgIGRvX1B5VGhyZWFkX2V4aXRfcHJvZyhzdGF0dXMsIDEpOwogfQogI2VuZGlmIC8qIE5PX0VYSVRfUFJPRyAqLwogCiAvKgogICogTG9jayBzdXBwb3J0LgogICovCi1QeVRocmVhZF90eXBlX2xvY2sgCitQeVRocmVhZF90eXBlX2xvY2sKIFB5VGhyZWFkX2FsbG9jYXRlX2xvY2sodm9pZCkKIHsKLQltdXRleF90ICpsb2NrOworICAgIG11dGV4X3QgKmxvY2s7CiAKLQlkcHJpbnRmKCgiUHlUaHJlYWRfYWxsb2NhdGVfbG9jayBjYWxsZWRcbiIpKTsKLQlpZiAoIWluaXRpYWxpemVkKQotCQlQeVRocmVhZF9pbml0X3RocmVhZCgpOworICAgIGRwcmludGYoKCJQeVRocmVhZF9hbGxvY2F0ZV9sb2NrIGNhbGxlZFxuIikpOworICAgIGlmICghaW5pdGlhbGl6ZWQpCisgICAgICAgIFB5VGhyZWFkX2luaXRfdGhyZWFkKCk7CiAKLQlsb2NrID0gKG11dGV4X3QgKikgbWFsbG9jKHNpemVvZihtdXRleF90KSk7Ci0JaWYgKG11dGV4X2luaXQobG9jaywgVVNZTkNfVEhSRUFELCAwKSkgewotCQlwZXJyb3IoIm11dGV4X2luaXQiKTsKLQkJZnJlZSgodm9pZCAqKSBsb2NrKTsKLQkJbG9jayA9IDA7Ci0JfQotCWRwcmludGYoKCJQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKCkgLT4gJXBcbiIsIGxvY2spKTsKLQlyZXR1cm4gKFB5VGhyZWFkX3R5cGVfbG9jaykgbG9jazsKKyAgICBsb2NrID0gKG11dGV4X3QgKikgbWFsbG9jKHNpemVvZihtdXRleF90KSk7CisgICAgaWYgKG11dGV4X2luaXQobG9jaywgVVNZTkNfVEhSRUFELCAwKSkgeworICAgICAgICBwZXJyb3IoIm11dGV4X2luaXQiKTsKKyAgICAgICAgZnJlZSgodm9pZCAqKSBsb2NrKTsKKyAgICAgICAgbG9jayA9IDA7CisgICAgfQorICAgIGRwcmludGYoKCJQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKCkgLT4gJXBcbiIsIGxvY2spKTsKKyAgICByZXR1cm4gKFB5VGhyZWFkX3R5cGVfbG9jaykgbG9jazsKIH0KIAotdm9pZCAKK3ZvaWQKIFB5VGhyZWFkX2ZyZWVfbG9jayhQeVRocmVhZF90eXBlX2xvY2sgbG9jaykKIHsKLQlkcHJpbnRmKCgiUHlUaHJlYWRfZnJlZV9sb2NrKCVwKSBjYWxsZWRcbiIsIGxvY2spKTsKLQltdXRleF9kZXN0cm95KChtdXRleF90ICopIGxvY2spOwotCWZyZWUoKHZvaWQgKikgbG9jayk7CisgICAgZHByaW50ZigoIlB5VGhyZWFkX2ZyZWVfbG9jayglcCkgY2FsbGVkXG4iLCBsb2NrKSk7CisgICAgbXV0ZXhfZGVzdHJveSgobXV0ZXhfdCAqKSBsb2NrKTsKKyAgICBmcmVlKCh2b2lkICopIGxvY2spOwogfQogCi1pbnQgCitpbnQKIFB5VGhyZWFkX2FjcXVpcmVfbG9jayhQeVRocmVhZF90eXBlX2xvY2sgbG9jaywgaW50IHdhaXRmbGFnKQogewotCWludCBzdWNjZXNzOworICAgIGludCBzdWNjZXNzOwogCi0JZHByaW50ZigoIlB5VGhyZWFkX2FjcXVpcmVfbG9jayglcCwgJWQpIGNhbGxlZFxuIiwgbG9jaywgd2FpdGZsYWcpKTsKLQlpZiAod2FpdGZsYWcpCi0JCXN1Y2Nlc3MgPSBtdXRleF9sb2NrKChtdXRleF90ICopIGxvY2spOwotCWVsc2UKLQkJc3VjY2VzcyA9IG11dGV4X3RyeWxvY2soKG11dGV4X3QgKikgbG9jayk7Ci0JaWYgKHN1Y2Nlc3MgPCAwKQotCQlwZXJyb3Iod2FpdGZsYWcgPyAibXV0ZXhfbG9jayIgOiAibXV0ZXhfdHJ5bG9jayIpOwotCWVsc2UKLQkJc3VjY2VzcyA9ICFzdWNjZXNzOyAvKiBzb2xhcmlzIGRvZXMgaXQgdGhlIG90aGVyIHdheSByb3VuZCAqLwotCWRwcmludGYoKCJQeVRocmVhZF9hY3F1aXJlX2xvY2soJXAsICVkKSAtPiAlZFxuIiwgbG9jaywgd2FpdGZsYWcsIHN1Y2Nlc3MpKTsKLQlyZXR1cm4gc3VjY2VzczsKKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfYWNxdWlyZV9sb2NrKCVwLCAlZCkgY2FsbGVkXG4iLCBsb2NrLCB3YWl0ZmxhZykpOworICAgIGlmICh3YWl0ZmxhZykKKyAgICAgICAgc3VjY2VzcyA9IG11dGV4X2xvY2soKG11dGV4X3QgKikgbG9jayk7CisgICAgZWxzZQorICAgICAgICBzdWNjZXNzID0gbXV0ZXhfdHJ5bG9jaygobXV0ZXhfdCAqKSBsb2NrKTsKKyAgICBpZiAoc3VjY2VzcyA8IDApCisgICAgICAgIHBlcnJvcih3YWl0ZmxhZyA/ICJtdXRleF9sb2NrIiA6ICJtdXRleF90cnlsb2NrIik7CisgICAgZWxzZQorICAgICAgICBzdWNjZXNzID0gIXN1Y2Nlc3M7IC8qIHNvbGFyaXMgZG9lcyBpdCB0aGUgb3RoZXIgd2F5IHJvdW5kICovCisgICAgZHByaW50ZigoIlB5VGhyZWFkX2FjcXVpcmVfbG9jayglcCwgJWQpIC0+ICVkXG4iLCBsb2NrLCB3YWl0ZmxhZywgc3VjY2VzcykpOworICAgIHJldHVybiBzdWNjZXNzOwogfQogCi12b2lkIAordm9pZAogUHlUaHJlYWRfcmVsZWFzZV9sb2NrKFB5VGhyZWFkX3R5cGVfbG9jayBsb2NrKQogewotCWRwcmludGYoKCJQeVRocmVhZF9yZWxlYXNlX2xvY2soJXApIGNhbGxlZFxuIiwgbG9jaykpOwotCWlmIChtdXRleF91bmxvY2soKG11dGV4X3QgKikgbG9jaykpCi0JCXBlcnJvcigibXV0ZXhfdW5sb2NrIik7CisgICAgZHByaW50ZigoIlB5VGhyZWFkX3JlbGVhc2VfbG9jayglcCkgY2FsbGVkXG4iLCBsb2NrKSk7CisgICAgaWYgKG11dGV4X3VubG9jaygobXV0ZXhfdCAqKSBsb2NrKSkKKyAgICAgICAgcGVycm9yKCJtdXRleF91bmxvY2siKTsKIH0KZGlmZiAtLWdpdCBhL1B5dGhvbi90aHJlYWRfd2luY2UuaCBiL1B5dGhvbi90aHJlYWRfd2luY2UuaAppbmRleCBlMTZmNWQxLi4zM2NmNWE0IDEwMDY0NAotLS0gYS9QeXRob24vdGhyZWFkX3dpbmNlLmgKKysrIGIvUHl0aG9uL3RocmVhZF93aW5jZS5oCkBAIC0yNCwyMSArMjQsMjEgQEAKICAqLwogbG9uZyBQeVRocmVhZF9zdGFydF9uZXdfdGhyZWFkKHZvaWQgKCpmdW5jKSh2b2lkICopLCB2b2lkICphcmcpCiB7Ci0JbG9uZyBydjsKLQlpbnQgc3VjY2VzcyA9IC0xOworICAgIGxvbmcgcnY7CisgICAgaW50IHN1Y2Nlc3MgPSAtMTsKIAotCWRwcmludGYoKCIlbGQ6IFB5VGhyZWFkX3N0YXJ0X25ld190aHJlYWQgY2FsbGVkXG4iLCBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCkpKTsKLQlpZiAoIWluaXRpYWxpemVkKQotCQlQeVRocmVhZF9pbml0X3RocmVhZCgpOworICAgIGRwcmludGYoKCIlbGQ6IFB5VGhyZWFkX3N0YXJ0X25ld190aHJlYWQgY2FsbGVkXG4iLCBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCkpKTsKKyAgICBpZiAoIWluaXRpYWxpemVkKQorICAgICAgICBQeVRocmVhZF9pbml0X3RocmVhZCgpOwogCi0JcnYgPSBfYmVnaW50aHJlYWQoZnVuYywgMCwgYXJnKTsgLyogdXNlIGRlZmF1bHQgc3RhY2sgc2l6ZSAqLwotIAotCWlmIChydiAhPSAtMSkgewotCQlzdWNjZXNzID0gMDsKLQkJZHByaW50ZigoIiVsZDogUHlUaHJlYWRfc3RhcnRfbmV3X3RocmVhZCBzdWNjZWVkZWQ6XG4iLCBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCkpKTsKLQl9CisgICAgcnYgPSBfYmVnaW50aHJlYWQoZnVuYywgMCwgYXJnKTsgLyogdXNlIGRlZmF1bHQgc3RhY2sgc2l6ZSAqLwogCi0JcmV0dXJuIHN1Y2Nlc3M7CisgICAgaWYgKHJ2ICE9IC0xKSB7CisgICAgICAgIHN1Y2Nlc3MgPSAwOworICAgICAgICBkcHJpbnRmKCgiJWxkOiBQeVRocmVhZF9zdGFydF9uZXdfdGhyZWFkIHN1Y2NlZWRlZDpcbiIsIFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSkpOworICAgIH0KKworICAgIHJldHVybiBzdWNjZXNzOwogfQogCiAvKgpAQCAtNDcsNTIgKzQ3LDUyIEBACiAgKi8KIGxvbmcgUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCh2b2lkKQogewotCWlmICghaW5pdGlhbGl6ZWQpCi0JCVB5VGhyZWFkX2luaXRfdGhyZWFkKCk7Ci0gICAgICAgIAotCXJldHVybiBHZXRDdXJyZW50VGhyZWFkSWQoKTsKKyAgICBpZiAoIWluaXRpYWxpemVkKQorICAgICAgICBQeVRocmVhZF9pbml0X3RocmVhZCgpOworCisgICAgcmV0dXJuIEdldEN1cnJlbnRUaHJlYWRJZCgpOwogfQogCiBzdGF0aWMgdm9pZCBkb19QeVRocmVhZF9leGl0X3RocmVhZChpbnQgbm9fY2xlYW51cCkKIHsKLQlkcHJpbnRmKCgiJWxkOiBkb19QeVRocmVhZF9leGl0X3RocmVhZCBjYWxsZWRcbiIsIFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSkpOwotCWlmICghaW5pdGlhbGl6ZWQpCi0JCWlmIChub19jbGVhbnVwKQotCQkJZXhpdCgwKTsgLyogWFhYIC0gd2FzIF9leGl0KCkhISAqLwotCQllbHNlCi0JCQlleGl0KDApOwotCV9lbmR0aHJlYWQoKTsKKyAgICBkcHJpbnRmKCgiJWxkOiBkb19QeVRocmVhZF9leGl0X3RocmVhZCBjYWxsZWRcbiIsIFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSkpOworICAgIGlmICghaW5pdGlhbGl6ZWQpCisgICAgICAgIGlmIChub19jbGVhbnVwKQorICAgICAgICAgICAgZXhpdCgwKTsgLyogWFhYIC0gd2FzIF9leGl0KCkhISAqLworICAgICAgICBlbHNlCisgICAgICAgICAgICBleGl0KDApOworICAgIF9lbmR0aHJlYWQoKTsKIH0KIAogdm9pZCBQeVRocmVhZF9leGl0X3RocmVhZCh2b2lkKQogewotCWRvX1B5VGhyZWFkX2V4aXRfdGhyZWFkKDApOworICAgIGRvX1B5VGhyZWFkX2V4aXRfdGhyZWFkKDApOwogfQogCiB2b2lkIFB5VGhyZWFkX19leGl0X3RocmVhZCh2b2lkKQogewotCWRvX1B5VGhyZWFkX2V4aXRfdGhyZWFkKDEpOworICAgIGRvX1B5VGhyZWFkX2V4aXRfdGhyZWFkKDEpOwogfQogCiAjaWZuZGVmIE5PX0VYSVRfUFJPRwogc3RhdGljIHZvaWQgZG9fUHlUaHJlYWRfZXhpdF9wcm9nKGludCBzdGF0dXMsIGludCBub19jbGVhbnVwKQogewotCWRwcmludGYoKCJQeVRocmVhZF9leGl0X3Byb2coJWQpIGNhbGxlZFxuIiwgc3RhdHVzKSk7Ci0JaWYgKCFpbml0aWFsaXplZCkKLQkJaWYgKG5vX2NsZWFudXApCi0JCQlfZXhpdChzdGF0dXMpOwotCQllbHNlCi0JCQlleGl0KHN0YXR1cyk7CisgICAgZHByaW50ZigoIlB5VGhyZWFkX2V4aXRfcHJvZyglZCkgY2FsbGVkXG4iLCBzdGF0dXMpKTsKKyAgICBpZiAoIWluaXRpYWxpemVkKQorICAgICAgICBpZiAobm9fY2xlYW51cCkKKyAgICAgICAgICAgIF9leGl0KHN0YXR1cyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGV4aXQoc3RhdHVzKTsKIH0KIAogdm9pZCBQeVRocmVhZF9leGl0X3Byb2coaW50IHN0YXR1cykKIHsKLQlkb19QeVRocmVhZF9leGl0X3Byb2coc3RhdHVzLCAwKTsKKyAgICBkb19QeVRocmVhZF9leGl0X3Byb2coc3RhdHVzLCAwKTsKIH0KIAogdm9pZCBQeVRocmVhZF9fZXhpdF9wcm9nKGludCBzdGF0dXMpCiB7Ci0JZG9fUHlUaHJlYWRfZXhpdF9wcm9nKHN0YXR1cywgMSk7CisgICAgZG9fUHlUaHJlYWRfZXhpdF9wcm9nKHN0YXR1cywgMSk7CiB9CiAjZW5kaWYgLyogTk9fRVhJVF9QUk9HICovCiAKQEAgLTEwNywxMiArMTA3LDEyIEBACiAKICAgICBkcHJpbnRmKCgiUHlUaHJlYWRfYWxsb2NhdGVfbG9jayBjYWxsZWRcbiIpKTsKICAgICBpZiAoIWluaXRpYWxpemVkKQotICAgICAgICBQeVRocmVhZF9pbml0X3RocmVhZCgpOworICAgIFB5VGhyZWFkX2luaXRfdGhyZWFkKCk7CiAKICAgICBhTG9jayA9IENyZWF0ZUV2ZW50KE5VTEwsICAgICAgICAgICAvKiBTZWN1cml0eSBhdHRyaWJ1dGVzICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAvKiBNYW51YWwtUmVzZXQgICAgICAgICAgICAgICAqLwotCQkJCQkJMSwgICAgICAgICAgICAgIC8qIElzIGluaXRpYWxseSBzaWduYWxsZWQgICovCi0gICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsgICAgICAgICAgLyogTmFtZSBvZiBldmVudCAgICAgICAgICAgICovCisgICAgICAgICAgICAwLCAgICAgICAgICAgICAgLyogTWFudWFsLVJlc2V0ICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIDEsICAgICAgICAgICAgICAvKiBJcyBpbml0aWFsbHkgc2lnbmFsbGVkICAqLworICAgICAgICAgICAgTlVMTCk7ICAgICAgICAgIC8qIE5hbWUgb2YgZXZlbnQgICAgICAgICAgICAqLwogCiAgICAgZHByaW50ZigoIiVsZDogUHlUaHJlYWRfYWxsb2NhdGVfbG9jaygpIC0+ICVwXG4iLCBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCksIGFMb2NrKSk7CiAKQEAgLTE0MiwyMiArMTQyLDIyIEBACiAjaWZuZGVmIERFQlVHCiAgICAgd2FpdFJlc3VsdCA9IFdhaXRGb3JTaW5nbGVPYmplY3QoYUxvY2ssICh3YWl0ZmxhZyA/IElORklOSVRFIDogMCkpOwogI2Vsc2UKLQkvKiBUbyBhaWQgaW4gZGVidWdnaW5nLCB3ZSByZWd1bGFybHkgd2FrZSB1cC4gIFRoaXMgYWxsb3dzIHVzIHRvCi0JYnJlYWsgaW50byB0aGUgZGVidWdnZXIgKi8KLQl3aGlsZSAoVFJVRSkgewotCQl3YWl0UmVzdWx0ID0gV2FpdEZvclNpbmdsZU9iamVjdChhTG9jaywgd2FpdGZsYWcgPyAzMDAwIDogMCk7Ci0JCWlmICh3YWl0ZmxhZz09MCB8fCAod2FpdGZsYWcgJiYgd2FpdFJlc3VsdCA9PSBXQUlUX09CSkVDVF8wKSkKLQkJCWJyZWFrOwotCX0KKyAgICAvKiBUbyBhaWQgaW4gZGVidWdnaW5nLCB3ZSByZWd1bGFybHkgd2FrZSB1cC4gIFRoaXMgYWxsb3dzIHVzIHRvCisgICAgYnJlYWsgaW50byB0aGUgZGVidWdnZXIgKi8KKyAgICB3aGlsZSAoVFJVRSkgeworICAgICAgICB3YWl0UmVzdWx0ID0gV2FpdEZvclNpbmdsZU9iamVjdChhTG9jaywgd2FpdGZsYWcgPyAzMDAwIDogMCk7CisgICAgICAgIGlmICh3YWl0ZmxhZz09MCB8fCAod2FpdGZsYWcgJiYgd2FpdFJlc3VsdCA9PSBXQUlUX09CSkVDVF8wKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KICNlbmRpZgogCiAgICAgaWYgKHdhaXRSZXN1bHQgIT0gV0FJVF9PQkpFQ1RfMCkgewotCQlzdWNjZXNzID0gMDsgICAgLyogV2UgZmFpbGVkICovCisgICAgICAgICAgICAgICAgc3VjY2VzcyA9IDA7ICAgIC8qIFdlIGZhaWxlZCAqLwogICAgIH0KIAotCWRwcmludGYoKCIlbGQ6IFB5VGhyZWFkX2FjcXVpcmVfbG9jayglcCwgJWQpIC0+ICVkXG4iLCBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCksYUxvY2ssIHdhaXRmbGFnLCBzdWNjZXNzKSk7CisgICAgZHByaW50ZigoIiVsZDogUHlUaHJlYWRfYWNxdWlyZV9sb2NrKCVwLCAlZCkgLT4gJWRcbiIsIFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSxhTG9jaywgd2FpdGZsYWcsIHN1Y2Nlc3MpKTsKIAotCXJldHVybiBzdWNjZXNzOworICAgIHJldHVybiBzdWNjZXNzOwogfQogCiB2b2lkIFB5VGhyZWFkX3JlbGVhc2VfbG9jayhQeVRocmVhZF90eXBlX2xvY2sgYUxvY2spCkBAIC0xNjUsNyArMTY1LDcgQEAKICAgICBkcHJpbnRmKCgiJWxkOiBQeVRocmVhZF9yZWxlYXNlX2xvY2soJXApIGNhbGxlZFxuIiwgUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpLGFMb2NrKSk7CiAKICAgICBpZiAoIVNldEV2ZW50KGFMb2NrKSkKLSAgICAgICAgZHByaW50ZigoIiVsZDogQ291bGQgbm90IFB5VGhyZWFkX3JlbGVhc2VfbG9jayglcCkgZXJyb3I6ICVsXG4iLCBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCksIGFMb2NrLCBHZXRMYXN0RXJyb3IoKSkpOworICAgIGRwcmludGYoKCIlbGQ6IENvdWxkIG5vdCBQeVRocmVhZF9yZWxlYXNlX2xvY2soJXApIGVycm9yOiAlbFxuIiwgUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpLCBhTG9jaywgR2V0TGFzdEVycm9yKCkpKTsKIH0KIAogCmRpZmYgLS1naXQgYS9QeXRob24vdHJhY2ViYWNrLmMgYi9QeXRob24vdHJhY2ViYWNrLmMKaW5kZXggYzJkN2U3Ny4uYTYwYTE4MyAxMDA2NDQKLS0tIGEvUHl0aG9uL3RyYWNlYmFjay5jCisrKyBiL1B5dGhvbi90cmFjZWJhY2suYwpAQCAtMTIsMjc0ICsxMiwyNzQgQEAKICNkZWZpbmUgT0ZGKHgpIG9mZnNldG9mKFB5VHJhY2ViYWNrT2JqZWN0LCB4KQogCiBzdGF0aWMgUHlNZW1iZXJEZWYgdGJfbWVtYmVybGlzdFtdID0gewotCXsidGJfbmV4dCIsCVRfT0JKRUNULAlPRkYodGJfbmV4dCksIFJFQURPTkxZfSwKLQl7InRiX2ZyYW1lIiwJVF9PQkpFQ1QsCU9GRih0Yl9mcmFtZSksIFJFQURPTkxZfSwKLQl7InRiX2xhc3RpIiwJVF9JTlQsCQlPRkYodGJfbGFzdGkpLCBSRUFET05MWX0sCi0JeyJ0Yl9saW5lbm8iLAlUX0lOVCwJCU9GRih0Yl9saW5lbm8pLCBSRUFET05MWX0sCi0Je05VTEx9CS8qIFNlbnRpbmVsICovCisgICAgeyJ0Yl9uZXh0IiwgICAgICAgICBUX09CSkVDVCwgICAgICAgT0ZGKHRiX25leHQpLCBSRUFET05MWX0sCisgICAgeyJ0Yl9mcmFtZSIsICAgICAgICBUX09CSkVDVCwgICAgICAgT0ZGKHRiX2ZyYW1lKSwgUkVBRE9OTFl9LAorICAgIHsidGJfbGFzdGkiLCAgICAgICAgVF9JTlQsICAgICAgICAgIE9GRih0Yl9sYXN0aSksIFJFQURPTkxZfSwKKyAgICB7InRiX2xpbmVubyIsICAgICAgIFRfSU5ULCAgICAgICAgICBPRkYodGJfbGluZW5vKSwgUkVBRE9OTFl9LAorICAgIHtOVUxMfSAgICAgIC8qIFNlbnRpbmVsICovCiB9OwogCiBzdGF0aWMgdm9pZAogdGJfZGVhbGxvYyhQeVRyYWNlYmFja09iamVjdCAqdGIpCiB7Ci0JUHlPYmplY3RfR0NfVW5UcmFjayh0Yik7Ci0JUHlfVFJBU0hDQU5fU0FGRV9CRUdJTih0YikKLQlQeV9YREVDUkVGKHRiLT50Yl9uZXh0KTsKLQlQeV9YREVDUkVGKHRiLT50Yl9mcmFtZSk7Ci0JUHlPYmplY3RfR0NfRGVsKHRiKTsKLQlQeV9UUkFTSENBTl9TQUZFX0VORCh0YikKKyAgICBQeU9iamVjdF9HQ19VblRyYWNrKHRiKTsKKyAgICBQeV9UUkFTSENBTl9TQUZFX0JFR0lOKHRiKQorICAgIFB5X1hERUNSRUYodGItPnRiX25leHQpOworICAgIFB5X1hERUNSRUYodGItPnRiX2ZyYW1lKTsKKyAgICBQeU9iamVjdF9HQ19EZWwodGIpOworICAgIFB5X1RSQVNIQ0FOX1NBRkVfRU5EKHRiKQogfQogCiBzdGF0aWMgaW50CiB0Yl90cmF2ZXJzZShQeVRyYWNlYmFja09iamVjdCAqdGIsIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotCVB5X1ZJU0lUKHRiLT50Yl9uZXh0KTsKLQlQeV9WSVNJVCh0Yi0+dGJfZnJhbWUpOwotCXJldHVybiAwOworICAgIFB5X1ZJU0lUKHRiLT50Yl9uZXh0KTsKKyAgICBQeV9WSVNJVCh0Yi0+dGJfZnJhbWUpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZAogdGJfY2xlYXIoUHlUcmFjZWJhY2tPYmplY3QgKnRiKQogewotCVB5X0NMRUFSKHRiLT50Yl9uZXh0KTsKLQlQeV9DTEVBUih0Yi0+dGJfZnJhbWUpOworICAgIFB5X0NMRUFSKHRiLT50Yl9uZXh0KTsKKyAgICBQeV9DTEVBUih0Yi0+dGJfZnJhbWUpOwogfQogCiBQeVR5cGVPYmplY3QgUHlUcmFjZUJhY2tfVHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQotCSJ0cmFjZWJhY2siLAotCXNpemVvZihQeVRyYWNlYmFja09iamVjdCksCi0JMCwKLQkoZGVzdHJ1Y3Rvcil0Yl9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsCQkvKnRwX3ByaW50Ki8KLQkwLCAgICAgICAgICAgICAgLyp0cF9nZXRhdHRyKi8KLQkwLAkJLyp0cF9zZXRhdHRyKi8KLQkwLAkJLyp0cF9jb21wYXJlKi8KLQkwLAkJLyp0cF9yZXByKi8KLQkwLAkJLyp0cF9hc19udW1iZXIqLwotCTAsCQkvKnRwX2FzX3NlcXVlbmNlKi8KLQkwLAkJLyp0cF9hc19tYXBwaW5nKi8KLQkwLAkJLyogdHBfaGFzaCAqLwotCTAsCQkvKiB0cF9jYWxsICovCi0JMCwJCS8qIHRwX3N0ciAqLwotCTAsCQkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsLyogdHBfZmxhZ3MgKi8KLQkwLCAgICAgICAgICAgICAJCQkJLyogdHBfZG9jICovCi0gCSh0cmF2ZXJzZXByb2MpdGJfdHJhdmVyc2UsCQkvKiB0cF90cmF2ZXJzZSAqLwotCShpbnF1aXJ5KXRiX2NsZWFyLAkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkJLyogdHBfaXRlcm5leHQgKi8KLQkwLAkJCQkJLyogdHBfbWV0aG9kcyAqLwotCXRiX21lbWJlcmxpc3QsCQkJICAgICAgICAvKiB0cF9tZW1iZXJzICovCi0JMCwJCQkgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkJLyogdHBfZGljdCAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCisgICAgInRyYWNlYmFjayIsCisgICAgc2l6ZW9mKFB5VHJhY2ViYWNrT2JqZWN0KSwKKyAgICAwLAorICAgIChkZXN0cnVjdG9yKXRiX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX3ByaW50Ki8KKyAgICAwLCAgICAgICAgICAgICAgLyp0cF9nZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfc2V0YXR0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX2NvbXBhcmUqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9yZXByKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbnVtYmVyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfYXNfc2VxdWVuY2UqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9hc19tYXBwaW5nKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2MpdGJfdHJhdmVyc2UsICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAoaW5xdWlyeSl0Yl9jbGVhciwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgdGJfbWVtYmVybGlzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KIH07CiAKIHN0YXRpYyBQeVRyYWNlYmFja09iamVjdCAqCiBuZXd0cmFjZWJhY2tvYmplY3QoUHlUcmFjZWJhY2tPYmplY3QgKm5leHQsIFB5RnJhbWVPYmplY3QgKmZyYW1lKQogewotCVB5VHJhY2ViYWNrT2JqZWN0ICp0YjsKLQlpZiAoKG5leHQgIT0gTlVMTCAmJiAhUHlUcmFjZUJhY2tfQ2hlY2sobmV4dCkpIHx8Ci0JCQlmcmFtZSA9PSBOVUxMIHx8ICFQeUZyYW1lX0NoZWNrKGZyYW1lKSkgewotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXRiID0gUHlPYmplY3RfR0NfTmV3KFB5VHJhY2ViYWNrT2JqZWN0LCAmUHlUcmFjZUJhY2tfVHlwZSk7Ci0JaWYgKHRiICE9IE5VTEwpIHsKLQkJUHlfWElOQ1JFRihuZXh0KTsKLQkJdGItPnRiX25leHQgPSBuZXh0OwotCQlQeV9YSU5DUkVGKGZyYW1lKTsKLQkJdGItPnRiX2ZyYW1lID0gZnJhbWU7Ci0JCXRiLT50Yl9sYXN0aSA9IGZyYW1lLT5mX2xhc3RpOwotCQl0Yi0+dGJfbGluZW5vID0gUHlDb2RlX0FkZHIyTGluZShmcmFtZS0+Zl9jb2RlLCAKLQkJCQkJCSBmcmFtZS0+Zl9sYXN0aSk7Ci0JCVB5T2JqZWN0X0dDX1RyYWNrKHRiKTsKLQl9Ci0JcmV0dXJuIHRiOworICAgIFB5VHJhY2ViYWNrT2JqZWN0ICp0YjsKKyAgICBpZiAoKG5leHQgIT0gTlVMTCAmJiAhUHlUcmFjZUJhY2tfQ2hlY2sobmV4dCkpIHx8CisgICAgICAgICAgICAgICAgICAgIGZyYW1lID09IE5VTEwgfHwgIVB5RnJhbWVfQ2hlY2soZnJhbWUpKSB7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgdGIgPSBQeU9iamVjdF9HQ19OZXcoUHlUcmFjZWJhY2tPYmplY3QsICZQeVRyYWNlQmFja19UeXBlKTsKKyAgICBpZiAodGIgIT0gTlVMTCkgeworICAgICAgICBQeV9YSU5DUkVGKG5leHQpOworICAgICAgICB0Yi0+dGJfbmV4dCA9IG5leHQ7CisgICAgICAgIFB5X1hJTkNSRUYoZnJhbWUpOworICAgICAgICB0Yi0+dGJfZnJhbWUgPSBmcmFtZTsKKyAgICAgICAgdGItPnRiX2xhc3RpID0gZnJhbWUtPmZfbGFzdGk7CisgICAgICAgIHRiLT50Yl9saW5lbm8gPSBQeUNvZGVfQWRkcjJMaW5lKGZyYW1lLT5mX2NvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLT5mX2xhc3RpKTsKKyAgICAgICAgUHlPYmplY3RfR0NfVHJhY2sodGIpOworICAgIH0KKyAgICByZXR1cm4gdGI7CiB9CiAKIGludAogUHlUcmFjZUJhY2tfSGVyZShQeUZyYW1lT2JqZWN0ICpmcmFtZSkKIHsKLQlQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dFVCgpOwotCVB5VHJhY2ViYWNrT2JqZWN0ICpvbGR0YiA9IChQeVRyYWNlYmFja09iamVjdCAqKSB0c3RhdGUtPmN1cmV4Y190cmFjZWJhY2s7Ci0JUHlUcmFjZWJhY2tPYmplY3QgKnRiID0gbmV3dHJhY2ViYWNrb2JqZWN0KG9sZHRiLCBmcmFtZSk7Ci0JaWYgKHRiID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQl0c3RhdGUtPmN1cmV4Y190cmFjZWJhY2sgPSAoUHlPYmplY3QgKil0YjsKLQlQeV9YREVDUkVGKG9sZHRiKTsKLQlyZXR1cm4gMDsKKyAgICBQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dFVCgpOworICAgIFB5VHJhY2ViYWNrT2JqZWN0ICpvbGR0YiA9IChQeVRyYWNlYmFja09iamVjdCAqKSB0c3RhdGUtPmN1cmV4Y190cmFjZWJhY2s7CisgICAgUHlUcmFjZWJhY2tPYmplY3QgKnRiID0gbmV3dHJhY2ViYWNrb2JqZWN0KG9sZHRiLCBmcmFtZSk7CisgICAgaWYgKHRiID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKyAgICB0c3RhdGUtPmN1cmV4Y190cmFjZWJhY2sgPSAoUHlPYmplY3QgKil0YjsKKyAgICBQeV9YREVDUkVGKG9sZHRiKTsKKyAgICByZXR1cm4gMDsKIH0KIAogaW50CiBfUHlfRGlzcGxheVNvdXJjZUxpbmUoUHlPYmplY3QgKmYsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgbGluZW5vLCBpbnQgaW5kZW50KQogewotCWludCBlcnIgPSAwOwotCUZJTEUgKnhmcCA9IE5VTEw7Ci0JY2hhciBsaW5lYnVmWzIwMDBdOwotCWludCBpOwotCWNoYXIgbmFtZWJ1ZltNQVhQQVRITEVOKzFdOworICAgIGludCBlcnIgPSAwOworICAgIEZJTEUgKnhmcCA9IE5VTEw7CisgICAgY2hhciBsaW5lYnVmWzIwMDBdOworICAgIGludCBpOworICAgIGNoYXIgbmFtZWJ1ZltNQVhQQVRITEVOKzFdOwogCi0JaWYgKGZpbGVuYW1lID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQkvKiBUaGlzIGlzIG5lZWRlZCBieSBFbWFjcycgY29tcGlsZSBjb21tYW5kICovCisgICAgaWYgKGZpbGVuYW1lID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKyAgICAvKiBUaGlzIGlzIG5lZWRlZCBieSBFbWFjcycgY29tcGlsZSBjb21tYW5kICovCiAjZGVmaW5lIEZNVCAiICBGaWxlIFwiJS41MDBzXCIsIGxpbmUgJWQsIGluICUuNTAwc1xuIgotCXhmcCA9IGZvcGVuKGZpbGVuYW1lLCAiciIgUFlfU1RESU9URVhUTU9ERSk7Ci0JaWYgKHhmcCA9PSBOVUxMKSB7Ci0JCS8qIFNlYXJjaCB0YWlsIG9mIGZpbGVuYW1lIGluIHN5cy5wYXRoIGJlZm9yZSBnaXZpbmcgdXAgKi8KLQkJUHlPYmplY3QgKnBhdGg7Ci0JCWNvbnN0IGNoYXIgKnRhaWwgPSBzdHJyY2hyKGZpbGVuYW1lLCBTRVApOwotCQlpZiAodGFpbCA9PSBOVUxMKQotCQkJdGFpbCA9IGZpbGVuYW1lOwotCQllbHNlCi0JCQl0YWlsKys7Ci0JCXBhdGggPSBQeVN5c19HZXRPYmplY3QoInBhdGgiKTsKLQkJaWYgKHBhdGggIT0gTlVMTCAmJiBQeUxpc3RfQ2hlY2socGF0aCkpIHsKLQkJCVB5X3NzaXplX3QgX25wYXRoID0gUHlMaXN0X1NpemUocGF0aCk7Ci0JCQlpbnQgbnBhdGggPSBQeV9TQUZFX0RPV05DQVNUKF9ucGF0aCwgUHlfc3NpemVfdCwgaW50KTsKLQkJCXNpemVfdCB0YWlsbGVuID0gc3RybGVuKHRhaWwpOwotCQkJZm9yIChpID0gMDsgaSA8IG5wYXRoOyBpKyspIHsKLQkJCQlQeU9iamVjdCAqdiA9IFB5TGlzdF9HZXRJdGVtKHBhdGgsIGkpOwotCQkJCWlmICh2ID09IE5VTEwpIHsKLQkJCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWlmIChQeVN0cmluZ19DaGVjayh2KSkgewotCQkJCQlzaXplX3QgbGVuOwotCQkJCQlsZW4gPSBQeVN0cmluZ19HRVRfU0laRSh2KTsKLQkJCQkJaWYgKGxlbiArIDEgKyB0YWlsbGVuID49IE1BWFBBVEhMRU4pCi0JCQkJCQljb250aW51ZTsgLyogVG9vIGxvbmcgKi8KLQkJCQkJc3RyY3B5KG5hbWVidWYsIFB5U3RyaW5nX0FzU3RyaW5nKHYpKTsKLQkJCQkJaWYgKHN0cmxlbihuYW1lYnVmKSAhPSBsZW4pCi0JCQkJCQljb250aW51ZTsgLyogdiBjb250YWlucyAnXDAnICovCi0JCQkJCWlmIChsZW4gPiAwICYmIG5hbWVidWZbbGVuLTFdICE9IFNFUCkKLQkJCQkJCW5hbWVidWZbbGVuKytdID0gU0VQOwotCQkJCQlzdHJjcHkobmFtZWJ1ZitsZW4sIHRhaWwpOwotCQkJCQl4ZnAgPSBmb3BlbihuYW1lYnVmLCAiciIgUFlfU1RESU9URVhUTU9ERSk7Ci0JCQkJCWlmICh4ZnAgIT0gTlVMTCkgewotCQkJCQkJZmlsZW5hbWUgPSBuYW1lYnVmOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9CisgICAgeGZwID0gZm9wZW4oZmlsZW5hbWUsICJyIiBQWV9TVERJT1RFWFRNT0RFKTsKKyAgICBpZiAoeGZwID09IE5VTEwpIHsKKyAgICAgICAgLyogU2VhcmNoIHRhaWwgb2YgZmlsZW5hbWUgaW4gc3lzLnBhdGggYmVmb3JlIGdpdmluZyB1cCAqLworICAgICAgICBQeU9iamVjdCAqcGF0aDsKKyAgICAgICAgY29uc3QgY2hhciAqdGFpbCA9IHN0cnJjaHIoZmlsZW5hbWUsIFNFUCk7CisgICAgICAgIGlmICh0YWlsID09IE5VTEwpCisgICAgICAgICAgICB0YWlsID0gZmlsZW5hbWU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRhaWwrKzsKKyAgICAgICAgcGF0aCA9IFB5U3lzX0dldE9iamVjdCgicGF0aCIpOworICAgICAgICBpZiAocGF0aCAhPSBOVUxMICYmIFB5TGlzdF9DaGVjayhwYXRoKSkgeworICAgICAgICAgICAgUHlfc3NpemVfdCBfbnBhdGggPSBQeUxpc3RfU2l6ZShwYXRoKTsKKyAgICAgICAgICAgIGludCBucGF0aCA9IFB5X1NBRkVfRE9XTkNBU1QoX25wYXRoLCBQeV9zc2l6ZV90LCBpbnQpOworICAgICAgICAgICAgc2l6ZV90IHRhaWxsZW4gPSBzdHJsZW4odGFpbCk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnBhdGg7IGkrKykgeworICAgICAgICAgICAgICAgIFB5T2JqZWN0ICp2ID0gUHlMaXN0X0dldEl0ZW0ocGF0aCwgaSk7CisgICAgICAgICAgICAgICAgaWYgKHYgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKFB5U3RyaW5nX0NoZWNrKHYpKSB7CisgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW47CisgICAgICAgICAgICAgICAgICAgIGxlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHYpOworICAgICAgICAgICAgICAgICAgICBpZiAobGVuICsgMSArIHRhaWxsZW4gPj0gTUFYUEFUSExFTikKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvKiBUb28gbG9uZyAqLworICAgICAgICAgICAgICAgICAgICBzdHJjcHkobmFtZWJ1ZiwgUHlTdHJpbmdfQXNTdHJpbmcodikpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RybGVuKG5hbWVidWYpICE9IGxlbikKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvKiB2IGNvbnRhaW5zICdcMCcgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKGxlbiA+IDAgJiYgbmFtZWJ1ZltsZW4tMV0gIT0gU0VQKQorICAgICAgICAgICAgICAgICAgICAgICAgbmFtZWJ1ZltsZW4rK10gPSBTRVA7CisgICAgICAgICAgICAgICAgICAgIHN0cmNweShuYW1lYnVmK2xlbiwgdGFpbCk7CisgICAgICAgICAgICAgICAgICAgIHhmcCA9IGZvcGVuKG5hbWVidWYsICJyIiBQWV9TVERJT1RFWFRNT0RFKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHhmcCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IG5hbWVidWY7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIAotICAgICAgICBpZiAoeGZwID09IE5VTEwpCi0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICBpZiAoZXJyICE9IDApIHsKLSAgICAgICAgICAgIGZjbG9zZSh4ZnApOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICBpZiAoeGZwID09IE5VTEwpCisgICAgICAgIHJldHVybiBlcnI7CisgICAgaWYgKGVyciAhPSAwKSB7CisgICAgICAgIGZjbG9zZSh4ZnApOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBsaW5lbm87IGkrKykgeworICAgICAgICBjaGFyKiBwTGFzdENoYXIgPSAmbGluZWJ1ZltzaXplb2YobGluZWJ1ZiktMl07CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgICpwTGFzdENoYXIgPSAnXDAnOworICAgICAgICAgICAgaWYgKFB5X1VuaXZlcnNhbE5ld2xpbmVGZ2V0cyhsaW5lYnVmLCBzaXplb2YgbGluZWJ1ZiwgeGZwLCBOVUxMKSA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgLyogZmdldHMgcmVhZCAqc29tZXRoaW5nKjsgaWYgaXQgZGlkbid0IGdldCBhcworICAgICAgICAgICAgICAgZmFyIGFzIHBMYXN0Q2hhciwgaXQgbXVzdCBoYXZlIGZvdW5kIGEgbmV3bGluZQorICAgICAgICAgICAgICAgb3IgaGl0IHRoZSBlbmQgb2YgdGhlIGZpbGU7ICAgICAgICAgICAgICBpZiBwTGFzdENoYXIgaXMgXG4sCisgICAgICAgICAgICAgICBpdCBvYnZpb3VzbHkgZm91bmQgYSBuZXdsaW5lOyBlbHNlIHdlIGhhdmVuJ3QKKyAgICAgICAgICAgICAgIHlldCBzZWVuIGEgbmV3bGluZSwgc28gbXVzdCBjb250aW51ZSAqLworICAgICAgICB9IHdoaWxlICgqcExhc3RDaGFyICE9ICdcMCcgJiYgKnBMYXN0Q2hhciAhPSAnXG4nKTsKKyAgICB9CisgICAgaWYgKGkgPT0gbGluZW5vKSB7CisgICAgICAgIGNoYXIgYnVmWzExXTsKKyAgICAgICAgY2hhciAqcCA9IGxpbmVidWY7CisgICAgICAgIHdoaWxlICgqcCA9PSAnICcgfHwgKnAgPT0gJ1x0JyB8fCAqcCA9PSAnXDAxNCcpCisgICAgICAgICAgICBwKys7CisKKyAgICAgICAgLyogV3JpdGUgc29tZSBzcGFjZXMgYmVmb3JlIHRoZSBsaW5lICovCisgICAgICAgIHN0cmNweShidWYsICIgICAgICAgICAgIik7CisgICAgICAgIGFzc2VydCAoc3RybGVuKGJ1ZikgPT0gMTApOworICAgICAgICB3aGlsZSAoaW5kZW50ID4gMCkgeworICAgICAgICAgICAgaWYoaW5kZW50IDwgMTApCisgICAgICAgICAgICAgICAgYnVmW2luZGVudF0gPSAnXDAnOworICAgICAgICAgICAgZXJyID0gUHlGaWxlX1dyaXRlU3RyaW5nKGJ1ZiwgZik7CisgICAgICAgICAgICBpZiAoZXJyICE9IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBpbmRlbnQgLT0gMTA7CiAgICAgICAgIH0KIAotCWZvciAoaSA9IDA7IGkgPCBsaW5lbm87IGkrKykgewotCQljaGFyKiBwTGFzdENoYXIgPSAmbGluZWJ1ZltzaXplb2YobGluZWJ1ZiktMl07Ci0JCWRvIHsKLQkJCSpwTGFzdENoYXIgPSAnXDAnOwotCQkJaWYgKFB5X1VuaXZlcnNhbE5ld2xpbmVGZ2V0cyhsaW5lYnVmLCBzaXplb2YgbGluZWJ1ZiwgeGZwLCBOVUxMKSA9PSBOVUxMKQotCQkJCWJyZWFrOwotCQkJLyogZmdldHMgcmVhZCAqc29tZXRoaW5nKjsgaWYgaXQgZGlkbid0IGdldCBhcwotCQkJICAgZmFyIGFzIHBMYXN0Q2hhciwgaXQgbXVzdCBoYXZlIGZvdW5kIGEgbmV3bGluZQotCQkJICAgb3IgaGl0IHRoZSBlbmQgb2YgdGhlIGZpbGU7CWlmIHBMYXN0Q2hhciBpcyBcbiwKLQkJCSAgIGl0IG9idmlvdXNseSBmb3VuZCBhIG5ld2xpbmU7IGVsc2Ugd2UgaGF2ZW4ndAotCQkJICAgeWV0IHNlZW4gYSBuZXdsaW5lLCBzbyBtdXN0IGNvbnRpbnVlICovCi0JCX0gd2hpbGUgKCpwTGFzdENoYXIgIT0gJ1wwJyAmJiAqcExhc3RDaGFyICE9ICdcbicpOwotCX0KLQlpZiAoaSA9PSBsaW5lbm8pIHsKLQkJY2hhciBidWZbMTFdOwotCQljaGFyICpwID0gbGluZWJ1ZjsKLQkJd2hpbGUgKCpwID09ICcgJyB8fCAqcCA9PSAnXHQnIHx8ICpwID09ICdcMDE0JykKLQkJCXArKzsKLQotCQkvKiBXcml0ZSBzb21lIHNwYWNlcyBiZWZvcmUgdGhlIGxpbmUgKi8KLQkJc3RyY3B5KGJ1ZiwgIiAgICAgICAgICAiKTsKLQkJYXNzZXJ0IChzdHJsZW4oYnVmKSA9PSAxMCk7Ci0JCXdoaWxlIChpbmRlbnQgPiAwKSB7Ci0JCQlpZihpbmRlbnQgPCAxMCkKLQkJCQlidWZbaW5kZW50XSA9ICdcMCc7Ci0JCQllcnIgPSBQeUZpbGVfV3JpdGVTdHJpbmcoYnVmLCBmKTsKLQkJCWlmIChlcnIgIT0gMCkKLQkJCQlicmVhazsKLQkJCWluZGVudCAtPSAxMDsKLQkJfQotCi0JCWlmIChlcnIgPT0gMCkKLQkJCWVyciA9IFB5RmlsZV9Xcml0ZVN0cmluZyhwLCBmKTsKLQkJaWYgKGVyciA9PSAwICYmIHN0cmNocihwLCAnXG4nKSA9PSBOVUxMKQotCQkJZXJyID0gUHlGaWxlX1dyaXRlU3RyaW5nKCJcbiIsIGYpOwotCX0KLQlmY2xvc2UoeGZwKTsKLQlyZXR1cm4gZXJyOworICAgICAgICBpZiAoZXJyID09IDApCisgICAgICAgICAgICBlcnIgPSBQeUZpbGVfV3JpdGVTdHJpbmcocCwgZik7CisgICAgICAgIGlmIChlcnIgPT0gMCAmJiBzdHJjaHIocCwgJ1xuJykgPT0gTlVMTCkKKyAgICAgICAgICAgIGVyciA9IFB5RmlsZV9Xcml0ZVN0cmluZygiXG4iLCBmKTsKKyAgICB9CisgICAgZmNsb3NlKHhmcCk7CisgICAgcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIGludAogdGJfZGlzcGxheWxpbmUoUHlPYmplY3QgKmYsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgbGluZW5vLCBjb25zdCBjaGFyICpuYW1lKQogewotCWludCBlcnIgPSAwOwotICAgICAgICBjaGFyIGxpbmVidWZbMjAwMF07CisgICAgaW50IGVyciA9IDA7CisgICAgY2hhciBsaW5lYnVmWzIwMDBdOwogCi0JaWYgKGZpbGVuYW1lID09IE5VTEwgfHwgbmFtZSA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0JLyogVGhpcyBpcyBuZWVkZWQgYnkgRW1hY3MnIGNvbXBpbGUgY29tbWFuZCAqLworICAgIGlmIChmaWxlbmFtZSA9PSBOVUxMIHx8IG5hbWUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIC8qIFRoaXMgaXMgbmVlZGVkIGJ5IEVtYWNzJyBjb21waWxlIGNvbW1hbmQgKi8KICNkZWZpbmUgRk1UICIgIEZpbGUgXCIlLjUwMHNcIiwgbGluZSAlZCwgaW4gJS41MDBzXG4iCi0JUHlPU19zbnByaW50ZihsaW5lYnVmLCBzaXplb2YobGluZWJ1ZiksIEZNVCwgZmlsZW5hbWUsIGxpbmVubywgbmFtZSk7Ci0JZXJyID0gUHlGaWxlX1dyaXRlU3RyaW5nKGxpbmVidWYsIGYpOwotCWlmIChlcnIgIT0gMCkKLQkJcmV0dXJuIGVycjsKLSAgICAgICAgcmV0dXJuIF9QeV9EaXNwbGF5U291cmNlTGluZShmLCBmaWxlbmFtZSwgbGluZW5vLCA0KTsKKyAgICBQeU9TX3NucHJpbnRmKGxpbmVidWYsIHNpemVvZihsaW5lYnVmKSwgRk1ULCBmaWxlbmFtZSwgbGluZW5vLCBuYW1lKTsKKyAgICBlcnIgPSBQeUZpbGVfV3JpdGVTdHJpbmcobGluZWJ1ZiwgZik7CisgICAgaWYgKGVyciAhPSAwKQorICAgICAgICByZXR1cm4gZXJyOworICAgIHJldHVybiBfUHlfRGlzcGxheVNvdXJjZUxpbmUoZiwgZmlsZW5hbWUsIGxpbmVubywgNCk7CiB9CiAKIHN0YXRpYyBpbnQKIHRiX3ByaW50aW50ZXJuYWwoUHlUcmFjZWJhY2tPYmplY3QgKnRiLCBQeU9iamVjdCAqZiwgbG9uZyBsaW1pdCkKIHsKLQlpbnQgZXJyID0gMDsKLQlsb25nIGRlcHRoID0gMDsKLQlQeVRyYWNlYmFja09iamVjdCAqdGIxID0gdGI7Ci0Jd2hpbGUgKHRiMSAhPSBOVUxMKSB7Ci0JCWRlcHRoKys7Ci0JCXRiMSA9IHRiMS0+dGJfbmV4dDsKLQl9Ci0Jd2hpbGUgKHRiICE9IE5VTEwgJiYgZXJyID09IDApIHsKLQkJaWYgKGRlcHRoIDw9IGxpbWl0KSB7Ci0JCQllcnIgPSB0Yl9kaXNwbGF5bGluZShmLAotCQkJICAgIFB5U3RyaW5nX0FzU3RyaW5nKAotCQkJCSAgICB0Yi0+dGJfZnJhbWUtPmZfY29kZS0+Y29fZmlsZW5hbWUpLAotCQkJICAgIHRiLT50Yl9saW5lbm8sCi0JCQkgICAgUHlTdHJpbmdfQXNTdHJpbmcodGItPnRiX2ZyYW1lLT5mX2NvZGUtPmNvX25hbWUpKTsKLQkJfQotCQlkZXB0aC0tOwotCQl0YiA9IHRiLT50Yl9uZXh0OwotCQlpZiAoZXJyID09IDApCi0JCQllcnIgPSBQeUVycl9DaGVja1NpZ25hbHMoKTsKLQl9Ci0JcmV0dXJuIGVycjsKKyAgICBpbnQgZXJyID0gMDsKKyAgICBsb25nIGRlcHRoID0gMDsKKyAgICBQeVRyYWNlYmFja09iamVjdCAqdGIxID0gdGI7CisgICAgd2hpbGUgKHRiMSAhPSBOVUxMKSB7CisgICAgICAgIGRlcHRoKys7CisgICAgICAgIHRiMSA9IHRiMS0+dGJfbmV4dDsKKyAgICB9CisgICAgd2hpbGUgKHRiICE9IE5VTEwgJiYgZXJyID09IDApIHsKKyAgICAgICAgaWYgKGRlcHRoIDw9IGxpbWl0KSB7CisgICAgICAgICAgICBlcnIgPSB0Yl9kaXNwbGF5bGluZShmLAorICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FzU3RyaW5nKAorICAgICAgICAgICAgICAgICAgICB0Yi0+dGJfZnJhbWUtPmZfY29kZS0+Y29fZmlsZW5hbWUpLAorICAgICAgICAgICAgICAgIHRiLT50Yl9saW5lbm8sCisgICAgICAgICAgICAgICAgUHlTdHJpbmdfQXNTdHJpbmcodGItPnRiX2ZyYW1lLT5mX2NvZGUtPmNvX25hbWUpKTsKKyAgICAgICAgfQorICAgICAgICBkZXB0aC0tOworICAgICAgICB0YiA9IHRiLT50Yl9uZXh0OworICAgICAgICBpZiAoZXJyID09IDApCisgICAgICAgICAgICBlcnIgPSBQeUVycl9DaGVja1NpZ25hbHMoKTsKKyAgICB9CisgICAgcmV0dXJuIGVycjsKIH0KIAogaW50CiBQeVRyYWNlQmFja19QcmludChQeU9iamVjdCAqdiwgUHlPYmplY3QgKmYpCiB7Ci0JaW50IGVycjsKLQlQeU9iamVjdCAqbGltaXR2OwotCWxvbmcgbGltaXQgPSAxMDAwOwotCWlmICh2ID09IE5VTEwpCi0JCXJldHVybiAwOwotCWlmICghUHlUcmFjZUJhY2tfQ2hlY2sodikpIHsKLQkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JbGltaXR2ID0gUHlTeXNfR2V0T2JqZWN0KCJ0cmFjZWJhY2tsaW1pdCIpOwotCWlmIChsaW1pdHYgJiYgUHlJbnRfQ2hlY2sobGltaXR2KSkgewotCQlsaW1pdCA9IFB5SW50X0FzTG9uZyhsaW1pdHYpOwotCQlpZiAobGltaXQgPD0gMCkKLQkJCXJldHVybiAwOwotCX0KLQllcnIgPSBQeUZpbGVfV3JpdGVTdHJpbmcoIlRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KTpcbiIsIGYpOwotCWlmICghZXJyKQotCQllcnIgPSB0Yl9wcmludGludGVybmFsKChQeVRyYWNlYmFja09iamVjdCAqKXYsIGYsIGxpbWl0KTsKLQlyZXR1cm4gZXJyOworICAgIGludCBlcnI7CisgICAgUHlPYmplY3QgKmxpbWl0djsKKyAgICBsb25nIGxpbWl0ID0gMTAwMDsKKyAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoIVB5VHJhY2VCYWNrX0NoZWNrKHYpKSB7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGxpbWl0diA9IFB5U3lzX0dldE9iamVjdCgidHJhY2ViYWNrbGltaXQiKTsKKyAgICBpZiAobGltaXR2ICYmIFB5SW50X0NoZWNrKGxpbWl0dikpIHsKKyAgICAgICAgbGltaXQgPSBQeUludF9Bc0xvbmcobGltaXR2KTsKKyAgICAgICAgaWYgKGxpbWl0IDw9IDApCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZXJyID0gUHlGaWxlX1dyaXRlU3RyaW5nKCJUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6XG4iLCBmKTsKKyAgICBpZiAoIWVycikKKyAgICAgICAgZXJyID0gdGJfcHJpbnRpbnRlcm5hbCgoUHlUcmFjZWJhY2tPYmplY3QgKil2LCBmLCBsaW1pdCk7CisgICAgcmV0dXJuIGVycjsKIH0KZGlmZiAtLWdpdCBhL1JJU0NPUy9Nb2R1bGVzL2NvbmZpZy5jIGIvUklTQ09TL01vZHVsZXMvY29uZmlnLmMKaW5kZXggNTRmYmM3OS4uYzQ5OGU5OCAxMDA2NDQKLS0tIGEvUklTQ09TL01vZHVsZXMvY29uZmlnLmMKKysrIGIvUklTQ09TL01vZHVsZXMvY29uZmlnLmMKQEAgLTQ5LDI1ICs0OSwyNSBAQAogCiBzdHJ1Y3QgX2luaXR0YWIgX1B5SW1wb3J0X0luaXR0YWJbXSA9IHsKIAotCXsicmlzY29zIiwgaW5pdHJpc2Nvc30sCisgICAgeyJyaXNjb3MiLCBpbml0cmlzY29zfSwKIAogLyogLS0gQURETU9EVUxFIE1BUktFUiAyIC0tICovCiAKLQkvKiBUaGlzIG1vZHVsZSAibGl2ZXMgaW4iIHdpdGggbWFyc2hhbC5jICovCi0JeyJtYXJzaGFsIiwgUHlNYXJzaGFsX0luaXR9LAorICAgIC8qIFRoaXMgbW9kdWxlICJsaXZlcyBpbiIgd2l0aCBtYXJzaGFsLmMgKi8KKyAgICB7Im1hcnNoYWwiLCBQeU1hcnNoYWxfSW5pdH0sCiAKLQkvKiBUaGlzIGxpdmVzIGl0IHdpdGggaW1wb3J0LmMgKi8KLQl7ImltcCIsIGluaXRpbXB9LAorICAgIC8qIFRoaXMgbGl2ZXMgaXQgd2l0aCBpbXBvcnQuYyAqLworICAgIHsiaW1wIiwgaW5pdGltcH0sCiAKLQkvKiBUaGVzZSBlbnRyaWVzIGFyZSBoZXJlIGZvciBzeXMuYnVpbHRpbl9tb2R1bGVfbmFtZXMgKi8KLQl7Il9fbWFpbl9fIiwgTlVMTH0sCi0JeyJfX2J1aWx0aW5fXyIsIE5VTEx9LAotCXsic3lzIiwgTlVMTH0sCi0JeyJleGNlcHRpb25zIiwgTlVMTH0sCisgICAgLyogVGhlc2UgZW50cmllcyBhcmUgaGVyZSBmb3Igc3lzLmJ1aWx0aW5fbW9kdWxlX25hbWVzICovCisgICAgeyJfX21haW5fXyIsIE5VTEx9LAorICAgIHsiX19idWlsdGluX18iLCBOVUxMfSwKKyAgICB7InN5cyIsIE5VTEx9LAorICAgIHsiZXhjZXB0aW9ucyIsIE5VTEx9LAogCi0JLyogVGhpcyBsaXZlcyBpbiBnY21vZHVsZS5jICovCi0JeyJnYyIsIGluaXRnY30sCisgICAgLyogVGhpcyBsaXZlcyBpbiBnY21vZHVsZS5jICovCisgICAgeyJnYyIsIGluaXRnY30sCiAKLQkvKiBTZW50aW5lbCAqLwotCXswLCAwfQorICAgIC8qIFNlbnRpbmVsICovCisgICAgezAsIDB9CiB9OwpkaWZmIC0tZ2l0IGEvUklTQ09TL01vZHVsZXMvZ2V0cGF0aF9yaXNjb3MuYyBiL1JJU0NPUy9Nb2R1bGVzL2dldHBhdGhfcmlzY29zLmMKaW5kZXggY2U5NzhjNi4uMTFlOTJjMSAxMDA2NDQKLS0tIGEvUklTQ09TL01vZHVsZXMvZ2V0cGF0aF9yaXNjb3MuYworKysgYi9SSVNDT1MvTW9kdWxlcy9nZXRwYXRoX3Jpc2Nvcy5jCkBAIC01LDI0ICs1LDI0IEBACiAKIHN0YXRpYyB2b2lkCiBjYWxjdWxhdGVfcGF0aCgpCi17IAotCWNoYXIgKnB5cGF0aCA9IGdldGVudigiUHl0aG9uJFBhdGgiKTsKLQlpZiAocHlwYXRoKSB7Ci0JCWludCBwYXRobGVuID0gc3RybGVuKHB5cGF0aCk7Ci0JCW1vZHVsZV9zZWFyY2hfcGF0aCA9IG1hbGxvYyhwYXRobGVuICsgMSk7Ci0JCWlmIChtb2R1bGVfc2VhcmNoX3BhdGgpIAotCQkJc3RybmNweShtb2R1bGVfc2VhcmNoX3BhdGgsIHB5cGF0aCwgcGF0aGxlbiArIDEpOwotCQllbHNlIHsKLQkJCWZwcmludGYoc3RkZXJyLCAKLQkJCQkiTm90IGVub3VnaCBtZW1vcnkgZm9yIGR5bmFtaWMgUFlUSE9OUEFUSC5cbiIKLQkJCQkiVXNpbmcgZGVmYXVsdCBzdGF0aWMgUFlUSE9OUEFUSC5cbiIpOwotCQl9Ci0JfQotCWlmICghbW9kdWxlX3NlYXJjaF9wYXRoKSAKLQkJbW9kdWxlX3NlYXJjaF9wYXRoID0gIjxQeXRob24kRGlyPi5MaWIiOwotCXByZWZpeCA9ICI8UHl0aG9uJERpcj4iOwotCWV4ZWNfcHJlZml4ID0gcHJlZml4OwotCXByb2dwYXRoID0gUHlfR2V0UHJvZ3JhbU5hbWUoKTsKK3sKKyAgICBjaGFyICpweXBhdGggPSBnZXRlbnYoIlB5dGhvbiRQYXRoIik7CisgICAgaWYgKHB5cGF0aCkgeworICAgICAgICBpbnQgcGF0aGxlbiA9IHN0cmxlbihweXBhdGgpOworICAgICAgICBtb2R1bGVfc2VhcmNoX3BhdGggPSBtYWxsb2MocGF0aGxlbiArIDEpOworICAgICAgICBpZiAobW9kdWxlX3NlYXJjaF9wYXRoKQorICAgICAgICAgICAgc3RybmNweShtb2R1bGVfc2VhcmNoX3BhdGgsIHB5cGF0aCwgcGF0aGxlbiArIDEpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgICAgICJOb3QgZW5vdWdoIG1lbW9yeSBmb3IgZHluYW1pYyBQWVRIT05QQVRILlxuIgorICAgICAgICAgICAgICAgICJVc2luZyBkZWZhdWx0IHN0YXRpYyBQWVRIT05QQVRILlxuIik7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCFtb2R1bGVfc2VhcmNoX3BhdGgpCisgICAgICAgIG1vZHVsZV9zZWFyY2hfcGF0aCA9ICI8UHl0aG9uJERpcj4uTGliIjsKKyAgICBwcmVmaXggPSAiPFB5dGhvbiREaXI+IjsKKyAgICBleGVjX3ByZWZpeCA9IHByZWZpeDsKKyAgICBwcm9ncGF0aCA9IFB5X0dldFByb2dyYW1OYW1lKCk7CiB9CiAKIC8qIEV4dGVybmFsIGludGVyZmFjZSAqLwpAQCAtMzAsMzEgKzMwLDMxIEBACiBjaGFyICoKIFB5X0dldFBhdGgoKQogewotCWlmICghbW9kdWxlX3NlYXJjaF9wYXRoKQotCQljYWxjdWxhdGVfcGF0aCgpOwotCXJldHVybiBtb2R1bGVfc2VhcmNoX3BhdGg7CisgICAgaWYgKCFtb2R1bGVfc2VhcmNoX3BhdGgpCisgICAgICAgIGNhbGN1bGF0ZV9wYXRoKCk7CisgICAgcmV0dXJuIG1vZHVsZV9zZWFyY2hfcGF0aDsKIH0KIAogY2hhciAqCiBQeV9HZXRQcmVmaXgoKQogewotCWlmICghbW9kdWxlX3NlYXJjaF9wYXRoKQotCQljYWxjdWxhdGVfcGF0aCgpOwotCXJldHVybiBwcmVmaXg7CisgICAgaWYgKCFtb2R1bGVfc2VhcmNoX3BhdGgpCisgICAgICAgIGNhbGN1bGF0ZV9wYXRoKCk7CisgICAgcmV0dXJuIHByZWZpeDsKIH0KIAogY2hhciAqCiBQeV9HZXRFeGVjUHJlZml4KCkKIHsKLQlpZiAoIW1vZHVsZV9zZWFyY2hfcGF0aCkKLQkJY2FsY3VsYXRlX3BhdGgoKTsKLQlyZXR1cm4gZXhlY19wcmVmaXg7CisgICAgaWYgKCFtb2R1bGVfc2VhcmNoX3BhdGgpCisgICAgICAgIGNhbGN1bGF0ZV9wYXRoKCk7CisgICAgcmV0dXJuIGV4ZWNfcHJlZml4OwogfQogCiBjaGFyICoKIFB5X0dldFByb2dyYW1GdWxsUGF0aCgpCiB7Ci0JaWYgKCFtb2R1bGVfc2VhcmNoX3BhdGgpCi0JCWNhbGN1bGF0ZV9wYXRoKCk7Ci0JcmV0dXJuIHByb2dwYXRoOworICAgIGlmICghbW9kdWxlX3NlYXJjaF9wYXRoKQorICAgICAgICBjYWxjdWxhdGVfcGF0aCgpOworICAgIHJldHVybiBwcm9ncGF0aDsKIH0KZGlmZiAtLWdpdCBhL1JJU0NPUy9Nb2R1bGVzL3Jpc2Nvc21vZHVsZS5jIGIvUklTQ09TL01vZHVsZXMvcmlzY29zbW9kdWxlLmMKaW5kZXggM2RhYmI0ZC4uNDM4NzM4MyAxMDA2NDQKLS0tIGEvUklTQ09TL01vZHVsZXMvcmlzY29zbW9kdWxlLmMKKysrIGIvUklTQ09TL01vZHVsZXMvcmlzY29zbW9kdWxlLmMKQEAgLTE5LDEzICsxOSwxMyBAQAogCiBzdGF0aWMgUHlPYmplY3QgKnJpc2Nvc19lcnJvcihjaGFyICpzKQogewotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PU0Vycm9yLCBzKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT1NFcnJvciwgcyk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqcmlzY29zX29zZXJyb3Iodm9pZCkKIHsKLQlyZXR1cm4gcmlzY29zX2Vycm9yKGUtPmVycm1lc3MpOworICAgIHJldHVybiByaXNjb3NfZXJyb3IoZS0+ZXJybWVzcyk7CiB9CiAKIApAQCAtMzUsNDAgKzM1LDQwIEBACiByaXNjb3NfcmVtb3ZlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKICAgICBjaGFyICpwYXRoMTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6cmVtb3ZlIiwgJnBhdGgxKSkgcmV0dXJuIE5VTEw7Ci0JaWYgKHJlbW92ZShwYXRoMSkpIHJldHVybiBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfT1NFcnJvcik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczpyZW1vdmUiLCAmcGF0aDEpKSByZXR1cm4gTlVMTDsKKyAgICBpZiAocmVtb3ZlKHBhdGgxKSkgcmV0dXJuIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19PU0Vycm9yKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiByaXNjb3NfcmVuYW1lKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpwYXRoMSwgKnBhdGgyOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic3M6cmVuYW1lIiwgJnBhdGgxLCAmcGF0aDIpKQotICAgICAgICByZXR1cm4gTlVMTDsKLQlpZiAocmVuYW1lKHBhdGgxLHBhdGgyKSkgcmV0dXJuIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19PU0Vycm9yKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgY2hhciAqcGF0aDEsICpwYXRoMjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInNzOnJlbmFtZSIsICZwYXRoMSwgJnBhdGgyKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAocmVuYW1lKHBhdGgxLHBhdGgyKSkgcmV0dXJuIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19PU0Vycm9yKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiByaXNjb3Nfc3lzdGVtKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpjb21tYW5kOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczpzeXN0ZW0iLCAmY29tbWFuZCkpIHJldHVybiBOVUxMOwotCXJldHVybiBQeUludF9Gcm9tTG9uZyhzeXN0ZW0oY29tbWFuZCkpOworICAgIGNoYXIgKmNvbW1hbmQ7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOnN5c3RlbSIsICZjb21tYW5kKSkgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHN5c3RlbShjb21tYW5kKSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiByaXNjb3NfY2hkaXIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKnBhdGg7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOmNoZGlyIiwgJnBhdGgpKSByZXR1cm4gTlVMTDsKLQllPXhvc2ZzY29udHJvbF9kaXIocGF0aCk7Ci0JaWYoZSkgcmV0dXJuIHJpc2Nvc19vc2Vycm9yKCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGNoYXIgKnBhdGg7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOmNoZGlyIiwgJnBhdGgpKSByZXR1cm4gTlVMTDsKKyAgICBlPXhvc2ZzY29udHJvbF9kaXIocGF0aCk7CisgICAgaWYoZSkgcmV0dXJuIHJpc2Nvc19vc2Vycm9yKCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgpAQCAtOTgsNDYgKzk4LDQ2IEBACiBzdGF0aWMgUHlPYmplY3QgKgogcmlzY29zX2V4cGFuZChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqcGF0aDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6ZXhwYW5kIiwgJnBhdGgpKSByZXR1cm4gTlVMTDsKLSAgICAgICAgcmV0dXJuIGNhbm9uKHBhdGgpOworICAgIGNoYXIgKnBhdGg7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOmV4cGFuZCIsICZwYXRoKSkgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIGNhbm9uKHBhdGgpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogcmlzY29zX21rZGlyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpwYXRoOworICAgIGNoYXIgKnBhdGg7CiAgICAgaW50IG1vZGU7CiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzfGk6bWtkaXIiLCAmcGF0aCwgJm1vZGUpKSByZXR1cm4gTlVMTDsKICAgICBlPXhvc2ZpbGVfY3JlYXRlX2RpcihwYXRoLDApOwogICAgIGlmKGUpIHJldHVybiByaXNjb3Nfb3NlcnJvcigpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiByaXNjb3NfbGlzdGRpcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqcGF0aCxidWZbMjU2XTsKKyAgICBjaGFyICpwYXRoLGJ1ZlsyNTZdOwogICAgIFB5T2JqZWN0ICpkLCAqdjsKICAgICBpbnQgYz0wLGNvdW50OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczpsaXN0ZGlyIiwgJnBhdGgpKSByZXR1cm4gTlVMTDsKLQlkPVB5TGlzdF9OZXcoMCk7Ci0JaWYoIWQpIHJldHVybiBOVUxMOwotCWZvcig7OykKLQl7IGU9eG9zZ2JwYl9kaXJfZW50cmllcyhwYXRoLChvc2dicGJfc3RyaW5nX2xpc3QqKWJ1ZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsYywyNTYsMCwmY291bnQsJmMpOwotCSAgaWYoZSkKLQkgIHsgUHlfREVDUkVGKGQpO3JldHVybiByaXNjb3Nfb3NlcnJvcigpOwotCSAgfQotCSAgaWYoY291bnQpCi0JICB7IHY9UHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOwotCSAgICBpZighdikgeyBQeV9ERUNSRUYoZCk7cmV0dXJuIDA7fQotCSAgICBpZihQeUxpc3RfQXBwZW5kKGQsdikpIHtQeV9ERUNSRUYoZCk7UHlfREVDUkVGKHYpO3JldHVybiAwO30KLQkgIH0KLQkgIGlmKGM9PS0xKSBicmVhazsKLQl9Ci0JcmV0dXJuIGQ7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOmxpc3RkaXIiLCAmcGF0aCkpIHJldHVybiBOVUxMOworICAgIGQ9UHlMaXN0X05ldygwKTsKKyAgICBpZighZCkgcmV0dXJuIE5VTEw7CisgICAgZm9yKDs7KQorICAgIHsgZT14b3NnYnBiX2Rpcl9lbnRyaWVzKHBhdGgsKG9zZ2JwYl9zdHJpbmdfbGlzdCopYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSxjLDI1NiwwLCZjb3VudCwmYyk7CisgICAgICBpZihlKQorICAgICAgeyBQeV9ERUNSRUYoZCk7cmV0dXJuIHJpc2Nvc19vc2Vycm9yKCk7CisgICAgICB9CisgICAgICBpZihjb3VudCkKKyAgICAgIHsgdj1QeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CisgICAgICAgIGlmKCF2KSB7IFB5X0RFQ1JFRihkKTtyZXR1cm4gMDt9CisgICAgICAgIGlmKFB5TGlzdF9BcHBlbmQoZCx2KSkge1B5X0RFQ1JFRihkKTtQeV9ERUNSRUYodik7cmV0dXJuIDA7fQorICAgICAgfQorICAgICAgaWYoYz09LTEpIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gZDsKIH0KIAogUHlEb2NfU1RSVkFSKHN0YXRfcmVzdWx0X19kb2NfXywKQEAgLTE1MSwxNjcgKzE1MSwxNjcgQEAKIFNlZSBvcy5zdGF0IGZvciBtb3JlIGluZm9ybWF0aW9uLiIpOwogCiBzdGF0aWMgUHlTdHJ1Y3RTZXF1ZW5jZV9GaWVsZCBzdGF0X3Jlc3VsdF9maWVsZHNbXSA9IHsKLSAgICAgICAgeyAic3RfbW9kZSIsICAicHJvdGVjdGlvbiBiaXRzIiB9LAotICAgICAgICB7ICJzdF9pbm8iLCAgICJpbm9kZSIgfSwKLSAgICAgICAgeyAic3RfZGV2IiwgICAiZGV2aWNlIiB9LAotICAgICAgICB7ICJzdF9ubGluayIsICJudW1iZXIgb2YgaGFyZCBsaW5rcyIgfSwKLSAgICAgICAgeyAic3RfdWlkIiwgICAidXNlciBJRCBvZiBvd25lciIgfSwKLSAgICAgICAgeyAic3RfZ2lkIiwgICAiZ3JvdXAgSUQgb2Ygb3duZXIiIH0sCi0gICAgICAgIHsgInN0X3NpemUiLCAgInRvdGFsIHNpemUsIGluIGJ5dGVzIiB9LAotICAgICAgICB7ICJzdF9hdGltZSIsICJ0aW1lIG9mIGxhc3QgYWNjZXNzIiB9LAotICAgICAgICB7ICJzdF9tdGltZSIsICJ0aW1lIG9mIGxhc3QgbW9kaWZpY2F0aW9uIiB9LAotICAgICAgICB7ICJzdF9jdGltZSIsICJ0aW1lIG9mIGxhc3QgY2hhbmdlIiB9LAotCXsgInN0X2Z0eXBlIiwgImZpbGUgdHlwZSIgfSwKLQl7ICJzdF9hdHRycyIsICJhdHRyaWJ1dGVzIiB9LAotCXsgInN0X29idHlwZSIsICJvYmplY3QgdHlwZSIgfSwKLQl7IDAgfQorICAgIHsgInN0X21vZGUiLCAgInByb3RlY3Rpb24gYml0cyIgfSwKKyAgICB7ICJzdF9pbm8iLCAgICJpbm9kZSIgfSwKKyAgICB7ICJzdF9kZXYiLCAgICJkZXZpY2UiIH0sCisgICAgeyAic3RfbmxpbmsiLCAibnVtYmVyIG9mIGhhcmQgbGlua3MiIH0sCisgICAgeyAic3RfdWlkIiwgICAidXNlciBJRCBvZiBvd25lciIgfSwKKyAgICB7ICJzdF9naWQiLCAgICJncm91cCBJRCBvZiBvd25lciIgfSwKKyAgICB7ICJzdF9zaXplIiwgICJ0b3RhbCBzaXplLCBpbiBieXRlcyIgfSwKKyAgICB7ICJzdF9hdGltZSIsICJ0aW1lIG9mIGxhc3QgYWNjZXNzIiB9LAorICAgIHsgInN0X210aW1lIiwgInRpbWUgb2YgbGFzdCBtb2RpZmljYXRpb24iIH0sCisgICAgeyAic3RfY3RpbWUiLCAidGltZSBvZiBsYXN0IGNoYW5nZSIgfSwKKyAgICB7ICJzdF9mdHlwZSIsICJmaWxlIHR5cGUiIH0sCisgICAgeyAic3RfYXR0cnMiLCAiYXR0cmlidXRlcyIgfSwKKyAgICB7ICJzdF9vYnR5cGUiLCAib2JqZWN0IHR5cGUiIH0sCisgICAgeyAwIH0KIH07CiAKIHN0YXRpYyBQeVN0cnVjdFNlcXVlbmNlX0Rlc2Mgc3RhdF9yZXN1bHRfZGVzYyA9IHsKLQkicmlzY29zLnN0YXRfcmVzdWx0IiwKLQlzdGF0X3Jlc3VsdF9fZG9jX18sCi0Jc3RhdF9yZXN1bHRfZmllbGRzLAotCTEzCisgICAgInJpc2Nvcy5zdGF0X3Jlc3VsdCIsCisgICAgc3RhdF9yZXN1bHRfX2RvY19fLAorICAgIHN0YXRfcmVzdWx0X2ZpZWxkcywKKyAgICAxMwogfTsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBTdGF0UmVzdWx0VHlwZTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIHJpc2Nvc19zdGF0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKLXsJCi0JUHlPYmplY3QgKnY7Ci0JY2hhciAqcGF0aDsKLSAgICAgICAgaW50IG9iLGxlbjsKLSAgICAgICAgYml0cyB0PTA7Ci0gICAgICAgIGJpdHMgbGQsZXgsYXQsZnQsbW9kZTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6c3RhdCIsICZwYXRoKSkgcmV0dXJuIE5VTEw7Ci0JZT14b3NmaWxlX3JlYWRfc3RhbXBlZF9ub19wYXRoKHBhdGgsJm9iLCZsZCwmZXgsJmxlbiwmYXQsJmZ0KTsKLQlpZihlKSByZXR1cm4gcmlzY29zX29zZXJyb3IoKTsKLQlzd2l0Y2ggKG9iKQotCXsgY2FzZSBvc2ZpbGVfSVNfRklMRTptb2RlPTAxMDAwMDA7YnJlYWs7ICAvKiBPQ1RBTCAqLwotCSAgY2FzZSBvc2ZpbGVfSVNfRElSOm1vZGU9MDQwMDAwO2JyZWFrOwotCSAgY2FzZSBvc2ZpbGVfSVNfSU1BR0U6bW9kZT0wMTQwMDAwO2JyZWFrOwotCSAgZGVmYXVsdDpyZXR1cm4gcmlzY29zX2Vycm9yKCJOb3QgZm91bmQiKTsKLQl9Ci0JaWYoZnQhPS0xKSB0PXVuaXh0aW1lKGxkLGV4KTsKLQltb2RlfD0oYXQmNyk8PDY7Ci0JbW9kZXw9KChhdCYxMTIpKjkpPj40OworeworICAgIFB5T2JqZWN0ICp2OworICAgIGNoYXIgKnBhdGg7CisgICAgaW50IG9iLGxlbjsKKyAgICBiaXRzIHQ9MDsKKyAgICBiaXRzIGxkLGV4LGF0LGZ0LG1vZGU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOnN0YXQiLCAmcGF0aCkpIHJldHVybiBOVUxMOworICAgIGU9eG9zZmlsZV9yZWFkX3N0YW1wZWRfbm9fcGF0aChwYXRoLCZvYiwmbGQsJmV4LCZsZW4sJmF0LCZmdCk7CisgICAgaWYoZSkgcmV0dXJuIHJpc2Nvc19vc2Vycm9yKCk7CisgICAgc3dpdGNoIChvYikKKyAgICB7IGNhc2Ugb3NmaWxlX0lTX0ZJTEU6bW9kZT0wMTAwMDAwO2JyZWFrOyAgLyogT0NUQUwgKi8KKyAgICAgIGNhc2Ugb3NmaWxlX0lTX0RJUjptb2RlPTA0MDAwMDticmVhazsKKyAgICAgIGNhc2Ugb3NmaWxlX0lTX0lNQUdFOm1vZGU9MDE0MDAwMDticmVhazsKKyAgICAgIGRlZmF1bHQ6cmV0dXJuIHJpc2Nvc19lcnJvcigiTm90IGZvdW5kIik7CisgICAgfQorICAgIGlmKGZ0IT0tMSkgdD11bml4dGltZShsZCxleCk7CisgICAgbW9kZXw9KGF0JjcpPDw2OworICAgIG1vZGV8PSgoYXQmMTEyKSo5KT4+NDsKIAotCXYgPSBQeVN0cnVjdFNlcXVlbmNlX05ldygmU3RhdFJlc3VsdFR5cGUpOworICAgIHYgPSBQeVN0cnVjdFNlcXVlbmNlX05ldygmU3RhdFJlc3VsdFR5cGUpOwogCi0JUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTSh2LCAwLCAKLQkJCQkgIFB5SW50X0Zyb21Mb25nKChsb25nKSBtb2RlKSk7IC8qc3RfbW9kZSovCi0JUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTSh2LCAxLCBQeUludF9Gcm9tTG9uZygobG9uZykgMCkpOyAvKnN0X2lubyovCi0JUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTSh2LCAyLCBQeUludF9Gcm9tTG9uZygobG9uZykgMCkpOyAvKnN0X2RldiovCi0JUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTSh2LCAzLCBQeUludF9Gcm9tTG9uZygobG9uZykgMCkpOyAvKnN0X25saW5rKi8KLQlQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHYsIDQsIFB5SW50X0Zyb21Mb25nKChsb25nKSAwKSk7IC8qc3RfdWlkKi8KLQlQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHYsIDUsIFB5SW50X0Zyb21Mb25nKChsb25nKSAwKSk7IC8qc3RfZ2lkKi8KLQlQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHYsIDYsIAotCQkJCSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIGxlbikpOyAvKnN0X3NpemUqLwotCVB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0odiwgNywgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIHQpKTsgLypzdF9hdGltZSovCi0JUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTSh2LCA4LCBQeUludF9Gcm9tTG9uZygobG9uZykgdCkpOyAvKnN0X210aW1lKi8KLQlQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHYsIDksIFB5SW50X0Zyb21Mb25nKChsb25nKSB0KSk7IC8qc3RfY3RpbWUqLwotCVB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0odiwgMTAsIAotCQkJCSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIGZ0KSk7IC8qZmlsZSB0eXBlKi8KLQlQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHYsIDExLCAKLQkJCQkgIFB5SW50X0Zyb21Mb25nKChsb25nKSBhdCkpOyAvKmF0dHJpYnV0ZXMqLwotCVB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0odiwgMTIsIAotCQkJCSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIG9iKSk7IC8qb2JqZWN0IHR5cGUqLworICAgIFB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0odiwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5SW50X0Zyb21Mb25nKChsb25nKSBtb2RlKSk7IC8qc3RfbW9kZSovCisgICAgUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTSh2LCAxLCBQeUludF9Gcm9tTG9uZygobG9uZykgMCkpOyAvKnN0X2lubyovCisgICAgUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTSh2LCAyLCBQeUludF9Gcm9tTG9uZygobG9uZykgMCkpOyAvKnN0X2RldiovCisgICAgUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTSh2LCAzLCBQeUludF9Gcm9tTG9uZygobG9uZykgMCkpOyAvKnN0X25saW5rKi8KKyAgICBQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHYsIDQsIFB5SW50X0Zyb21Mb25nKChsb25nKSAwKSk7IC8qc3RfdWlkKi8KKyAgICBQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHYsIDUsIFB5SW50X0Zyb21Mb25nKChsb25nKSAwKSk7IC8qc3RfZ2lkKi8KKyAgICBQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHYsIDYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUludF9Gcm9tTG9uZygobG9uZykgbGVuKSk7IC8qc3Rfc2l6ZSovCisgICAgUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTSh2LCA3LCBQeUludF9Gcm9tTG9uZygobG9uZykgdCkpOyAvKnN0X2F0aW1lKi8KKyAgICBQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHYsIDgsIFB5SW50X0Zyb21Mb25nKChsb25nKSB0KSk7IC8qc3RfbXRpbWUqLworICAgIFB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0odiwgOSwgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIHQpKTsgLypzdF9jdGltZSovCisgICAgUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTSh2LCAxMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5SW50X0Zyb21Mb25nKChsb25nKSBmdCkpOyAvKmZpbGUgdHlwZSovCisgICAgUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTSh2LCAxMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5SW50X0Zyb21Mb25nKChsb25nKSBhdCkpOyAvKmF0dHJpYnV0ZXMqLworICAgIFB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0odiwgMTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUludF9Gcm9tTG9uZygobG9uZykgb2IpKTsgLypvYmplY3QgdHlwZSovCiAKLSAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYodik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotICAgICAgICByZXR1cm4gdjsKKyAgICByZXR1cm4gdjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHJpc2Nvc19jaG1vZChQeU9iamVjdCAqc2VsZixQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpwYXRoOworICAgIGNoYXIgKnBhdGg7CiAgICAgYml0cyBtb2RlOwogICAgIGJpdHMgYXR0cjsKICAgICBhdHRyPShtb2RlJjB4NzAwKT4+ODsKICAgICBhdHRyfD0obW9kZSY3KTw8NDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInNpOmNobW9kIiwgJnBhdGgsKGludCopJm1vZGUpKSByZXR1cm4gTlVMTDsKLSAgICAgICAgZT14b3NmaWxlX3dyaXRlX2F0dHIocGF0aCxhdHRyKTsKLSAgICAgICAgaWYoZSkgcmV0dXJuIHJpc2Nvc19vc2Vycm9yKCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic2k6Y2htb2QiLCAmcGF0aCwoaW50KikmbW9kZSkpIHJldHVybiBOVUxMOworICAgIGU9eG9zZmlsZV93cml0ZV9hdHRyKHBhdGgsYXR0cik7CisgICAgaWYoZSkgcmV0dXJuIHJpc2Nvc19vc2Vycm9yKCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAKIHN0YXRpYyBQeU9iamVjdCAqCiByaXNjb3NfdXRpbWUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKnBhdGg7Ci0JbG9uZyBhdGltZSwgbXRpbWU7Ci0JUHlPYmplY3QqIGFyZzsKKyAgICBjaGFyICpwYXRoOworICAgIGxvbmcgYXRpbWUsIG10aW1lOworICAgIFB5T2JqZWN0KiBhcmc7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInNPOnV0aW1lIiwgJnBhdGgsICZhcmcpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInNPOnV0aW1lIiwgJnBhdGgsICZhcmcpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChhcmcgPT0gUHlfTm9uZSkgewotCQkvKiBvcHRpb25hbCB0aW1lIHZhbHVlcyBub3QgZ2l2ZW4gKi8KLQkJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCQllPXhvc2ZpbGVfc3RhbXAocGF0aCk7Ci0JCVB5X0VORF9BTExPV19USFJFQURTCi0gICAgICAgIAlpZihlKSByZXR1cm4gcmlzY29zX29zZXJyb3IoKTsKLQl9Ci0JZWxzZSBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIihsbCkiLCAmYXRpbWUsICZtdGltZSkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkidXRpbWUoKSBhcmcgMiBtdXN0IGJlIGEgdHVwbGUgKGF0aW1lLCBtdGltZSkiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWVsc2UgewotCSAgICAgICAgLyogY2F0YWxvZ3VlIGluZm8qLwotCSAgICAgICAgZmlsZXN3aXRjaF9vYmplY3RfdHlwZSBvYmpfdHlwZTsKLQkgICAgICAgIGJpdHMgbG9hZF9hZGRyLCBleGVjX2FkZHI7Ci0JICAgICAgICBpbnQgc2l6ZTsKLQkgICAgICAgIGZpbGVzd2l0Y2hfYXR0ciBhdHRyOworICAgIGlmIChhcmcgPT0gUHlfTm9uZSkgeworICAgICAgICAvKiBvcHRpb25hbCB0aW1lIHZhbHVlcyBub3QgZ2l2ZW4gKi8KKyAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICBlPXhvc2ZpbGVfc3RhbXAocGF0aCk7CisgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgICAgIGlmKGUpIHJldHVybiByaXNjb3Nfb3NlcnJvcigpOworICAgIH0KKyAgICBlbHNlIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiKGxsKSIsICZhdGltZSwgJm10aW1lKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInV0aW1lKCkgYXJnIDIgbXVzdCBiZSBhIHR1cGxlIChhdGltZSwgbXRpbWUpIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLyogY2F0YWxvZ3VlIGluZm8qLworICAgICAgICBmaWxlc3dpdGNoX29iamVjdF90eXBlIG9ial90eXBlOworICAgICAgICBiaXRzIGxvYWRfYWRkciwgZXhlY19hZGRyOworICAgICAgICBpbnQgc2l6ZTsKKyAgICAgICAgZmlsZXN3aXRjaF9hdHRyIGF0dHI7CiAKLQkJLyogcmVhZCBvbGQgY2F0YWxvZ3VlIGluZm8gKi8KLQkJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCQllPXhvc2ZpbGVfcmVhZF9ub19wYXRoKHBhdGgsICZvYmpfdHlwZSwgJmxvYWRfYWRkciwgJmV4ZWNfYWRkciwgJnNpemUsICZhdHRyKTsKLQkJUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQkgICAgICAgIGlmKGUpIHJldHVybiByaXNjb3Nfb3NlcnJvcigpOworICAgICAgICAvKiByZWFkIG9sZCBjYXRhbG9ndWUgaW5mbyAqLworICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgICAgIGU9eG9zZmlsZV9yZWFkX25vX3BhdGgocGF0aCwgJm9ial90eXBlLCAmbG9hZF9hZGRyLCAmZXhlY19hZGRyLCAmc2l6ZSwgJmF0dHIpOworICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgICAgICBpZihlKSByZXR1cm4gcmlzY29zX29zZXJyb3IoKTsKIAotCQkvKiBjaGVjayBpZiBsb2FkIGFuZCBleGVjIGFkZHJlc3MgcmVhbGx5IGNvbnRhaW4gZmlsZXR5cGUgYW5kIGRhdGUgKi8KLQkJaWYgKCAobG9hZF9hZGRyICYgMHhGRkYwMDAwMFUpICE9IDB4RkZGMDAwMDBVKQotCQkJcmV0dXJuIHJpc2Nvc19lcnJvcigiY2FuJ3Qgc2V0IGRhdGUgZm9yIG9iamVjdCB3aXRoIGxvYWQgYW5kIGV4ZWMgYWRkcmVzc2VzIik7CisgICAgICAgIC8qIGNoZWNrIGlmIGxvYWQgYW5kIGV4ZWMgYWRkcmVzcyByZWFsbHkgY29udGFpbiBmaWxldHlwZSBhbmQgZGF0ZSAqLworICAgICAgICBpZiAoIChsb2FkX2FkZHIgJiAweEZGRjAwMDAwVSkgIT0gMHhGRkYwMDAwMFUpCisgICAgICAgICAgICByZXR1cm4gcmlzY29zX2Vycm9yKCJjYW4ndCBzZXQgZGF0ZSBmb3Igb2JqZWN0IHdpdGggbG9hZCBhbmQgZXhlYyBhZGRyZXNzZXMiKTsKIAotCSAgICAgICAgLyogY29udmVydCBhcmd1bWVudCBtdGltZSB0byBSSVNDIE9TIGxvYWQgYW5kIGV4ZWMgYWRkcmVzcyAqLwotCSAgICAgICAgaWYoYWNvcm50aW1lKCZleGVjX2FkZHIsICZsb2FkX2FkZHIsICh0aW1lX3QpIG10aW1lKSkKLQkgICAgICAgIAlyZXR1cm4gcmlzY29zX29zZXJyb3IoKTsKKyAgICAgICAgLyogY29udmVydCBhcmd1bWVudCBtdGltZSB0byBSSVNDIE9TIGxvYWQgYW5kIGV4ZWMgYWRkcmVzcyAqLworICAgICAgICBpZihhY29ybnRpbWUoJmV4ZWNfYWRkciwgJmxvYWRfYWRkciwgKHRpbWVfdCkgbXRpbWUpKQorICAgICAgICAgICAgcmV0dXJuIHJpc2Nvc19vc2Vycm9yKCk7CiAKLQkJLyogd3JpdGUgbmV3IGxvYWQgYW5kIGV4ZWMgYWRkcmVzcyAqLwotCQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JCWUgPSB4b3NmaWxlX3dyaXRlKHBhdGgsIGxvYWRfYWRkciwgZXhlY19hZGRyLCBhdHRyKTsKLQkJUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQkgICAgICAgIGlmKGUpIHJldHVybiByaXNjb3Nfb3NlcnJvcigpOwotCX0KKyAgICAgICAgLyogd3JpdGUgbmV3IGxvYWQgYW5kIGV4ZWMgYWRkcmVzcyAqLworICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgICAgIGUgPSB4b3NmaWxlX3dyaXRlKHBhdGgsIGxvYWRfYWRkciwgZXhlY19hZGRyLCBhdHRyKTsKKyAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgaWYoZSkgcmV0dXJuIHJpc2Nvc19vc2Vycm9yKCk7CisgICAgfQogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHJpc2Nvc19zZXR0eXBlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpwYXRoLCpuYW1lOworICAgIGNoYXIgKnBhdGgsKm5hbWU7CiAgICAgaW50IHR5cGU7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzaTpzZXR0eXBlIiwgJnBhdGgsJnR5cGUpKQotCXsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInNpOnNldHR5cGUiLCAmcGF0aCwmdHlwZSkpCisgICAgewogICAgICAgUHlFcnJfQ2xlYXIoKTsKLQkgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic3M6c2V0dHlwZSIsICZwYXRoLCZuYW1lKSkgcmV0dXJuIE5VTEw7Ci0JICBlPXhvc2ZzY29udHJvbF9maWxlX3R5cGVfZnJvbV9zdHJpbmcobmFtZSwoYml0cyopJnR5cGUpOwotCSAgaWYoZSkgcmV0dXJuIHJpc2Nvc19vc2Vycm9yKCk7Ci0JfQorICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzczpzZXR0eXBlIiwgJnBhdGgsJm5hbWUpKSByZXR1cm4gTlVMTDsKKyAgICAgIGU9eG9zZnNjb250cm9sX2ZpbGVfdHlwZV9mcm9tX3N0cmluZyhuYW1lLChiaXRzKikmdHlwZSk7CisgICAgICBpZihlKSByZXR1cm4gcmlzY29zX29zZXJyb3IoKTsKKyAgICB9CiAgICAgZT14b3NmaWxlX3NldF90eXBlKHBhdGgsdHlwZSk7CiAgICAgaWYoZSkgcmV0dXJuIHJpc2Nvc19vc2Vycm9yKCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKQEAgLTM2OCw3ICszNjgsNyBAQAogICBpZiAoIWRpY3QpIHJldHVybiBOVUxMOwogICAvKiBYWFggVGhpcyBwYXJ0IGlnbm9yZXMgZXJyb3JzICovCiAgIHdoaWxlKCF4b3NfcmVhZF92YXJfdmFsKHdoaWNoLHZhbHVlLHNpemVvZih2YWx1ZSktMSwoaW50KWNvbnRleHQsCi0gICAgICAgICBvc19WQVJUWVBFX0VYUEFOREVELCZzaXplLChpbnQgKikmY29udGV4dCwwKSkKKyAgICAgb3NfVkFSVFlQRV9FWFBBTkRFRCwmc2l6ZSwoaW50ICopJmNvbnRleHQsMCkpCiAgIHsgUHlPYmplY3QgKnY7CiAgICAgdmFsdWVbc2l6ZV09J1wwJzsKICAgICB2ID0gUHlTdHJpbmdfRnJvbVN0cmluZyh2YWx1ZSk7CkBAIC0zODEsMzIgKzM4MSwzMiBAQAogCiBzdGF0aWMgUHlNZXRob2REZWYgcmlzY29zX21ldGhvZHNbXSA9IHsKIAotCXsidW5saW5rIiwJcmlzY29zX3JlbW92ZSwgTUVUSF9WQVJBUkdTfSwKKyAgICB7InVubGluayIsICAgICAgICAgIHJpc2Nvc19yZW1vdmUsIE1FVEhfVkFSQVJHU30sCiAgICAgeyJyZW1vdmUiLCAgcmlzY29zX3JlbW92ZSwgTUVUSF9WQVJBUkdTfSwKLQl7InJlbmFtZSIsCXJpc2Nvc19yZW5hbWUsIE1FVEhfVkFSQVJHU30sCi0JeyJzeXN0ZW0iLAlyaXNjb3Nfc3lzdGVtLCBNRVRIX1ZBUkFSR1N9LAotCXsicm1kaXIiLAlyaXNjb3NfcmVtb3ZlLCBNRVRIX1ZBUkFSR1N9LAotCXsiY2hkaXIiLAlyaXNjb3NfY2hkaXIsICBNRVRIX1ZBUkFSR1N9LAotCXsiZ2V0Y3dkIiwJcmlzY29zX2dldGN3ZCwgTUVUSF9OT0FSR1N9LAotCXsiZXhwYW5kIiwgIHJpc2Nvc19leHBhbmQsIE1FVEhfVkFSQVJHU30sCi0JeyJta2RpciIsCXJpc2Nvc19ta2RpciwgIE1FVEhfVkFSQVJHU30sCi0JeyJsaXN0ZGlyIiwJcmlzY29zX2xpc3RkaXIsIE1FVEhfVkFSQVJHU30sCi0JeyJzdGF0IiwJcmlzY29zX3N0YXQsICAgTUVUSF9WQVJBUkdTfSwKLQl7ImxzdGF0IiwJcmlzY29zX3N0YXQsICAgTUVUSF9WQVJBUkdTfSwKLSAgICB7ImNobW9kIiwJcmlzY29zX2NobW9kLCAgTUVUSF9WQVJBUkdTfSwKLQl7InV0aW1lIiwJcmlzY29zX3V0aW1lLCAgTUVUSF9WQVJBUkdTfSwKLQl7InNldHR5cGUiLAlyaXNjb3Nfc2V0dHlwZSwgTUVUSF9WQVJBUkdTfSwKLQl7ImdldGVudiIsICByaXNjb3NfZ2V0ZW52LCBNRVRIX1ZBUkFSR1N9LAotCXsicHV0ZW52IiwgIHJpc2Nvc19wdXRlbnYsIE1FVEhfVkFSQVJHU30sCi0JeyJkZWxlbnYiLCAgcmlzY29zX2RlbGVudiwgTUVUSF9WQVJBUkdTfSwKLQl7ImdldGVudmRpY3QiLCByaXNjb3NfZ2V0ZW52ZGljdCwgTUVUSF9WQVJBUkdTfSwKLQl7TlVMTCwJCU5VTEx9CQkgLyogU2VudGluZWwgKi8KKyAgICB7InJlbmFtZSIsICAgICAgICAgIHJpc2Nvc19yZW5hbWUsIE1FVEhfVkFSQVJHU30sCisgICAgeyJzeXN0ZW0iLCAgICAgICAgICByaXNjb3Nfc3lzdGVtLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsicm1kaXIiLCAgICAgICAgICAgcmlzY29zX3JlbW92ZSwgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImNoZGlyIiwgICAgICAgICAgIHJpc2Nvc19jaGRpciwgIE1FVEhfVkFSQVJHU30sCisgICAgeyJnZXRjd2QiLCAgICAgICAgICByaXNjb3NfZ2V0Y3dkLCBNRVRIX05PQVJHU30sCisgICAgeyJleHBhbmQiLCAgcmlzY29zX2V4cGFuZCwgTUVUSF9WQVJBUkdTfSwKKyAgICB7Im1rZGlyIiwgICAgICAgICAgIHJpc2Nvc19ta2RpciwgIE1FVEhfVkFSQVJHU30sCisgICAgeyJsaXN0ZGlyIiwgICAgICAgICByaXNjb3NfbGlzdGRpciwgTUVUSF9WQVJBUkdTfSwKKyAgICB7InN0YXQiLCAgICAgICAgICAgIHJpc2Nvc19zdGF0LCAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJsc3RhdCIsICAgICAgICAgICByaXNjb3Nfc3RhdCwgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsiY2htb2QiLCAgIHJpc2Nvc19jaG1vZCwgIE1FVEhfVkFSQVJHU30sCisgICAgeyJ1dGltZSIsICAgICAgICAgICByaXNjb3NfdXRpbWUsICBNRVRIX1ZBUkFSR1N9LAorICAgIHsic2V0dHlwZSIsICAgICAgICAgcmlzY29zX3NldHR5cGUsIE1FVEhfVkFSQVJHU30sCisgICAgeyJnZXRlbnYiLCAgcmlzY29zX2dldGVudiwgTUVUSF9WQVJBUkdTfSwKKyAgICB7InB1dGVudiIsICByaXNjb3NfcHV0ZW52LCBNRVRIX1ZBUkFSR1N9LAorICAgIHsiZGVsZW52IiwgIHJpc2Nvc19kZWxlbnYsIE1FVEhfVkFSQVJHU30sCisgICAgeyJnZXRlbnZkaWN0IiwgcmlzY29zX2dldGVudmRpY3QsIE1FVEhfVkFSQVJHU30sCisgICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgIC8qIFNlbnRpbmVsICovCiB9OwogCiBzdGF0aWMgaW50CiBpbnMoUHlPYmplY3QgKm1vZHVsZSwgY2hhciAqc3ltYm9sLCBsb25nIHZhbHVlKQogewotCXJldHVybiBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtb2R1bGUsIHN5bWJvbCwgdmFsdWUpOworICAgIHJldHVybiBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtb2R1bGUsIHN5bWJvbCwgdmFsdWUpOwogfQogCiAKQEAgLTQxNCwxOTAgKzQxNCwxOTAgQEAKIGFsbF9pbnMoUHlPYmplY3QgKmQpCiB7CiAjaWZkZWYgRl9PSwotICAgICAgICBpZiAoaW5zKGQsICJGX09LIiwgKGxvbmcpRl9PSykpIHJldHVybiAtMTsKKyAgICBpZiAoaW5zKGQsICJGX09LIiwgKGxvbmcpRl9PSykpIHJldHVybiAtMTsKICNlbmRpZgogI2lmZGVmIFJfT0sKLSAgICAgICAgaWYgKGlucyhkLCAiUl9PSyIsIChsb25nKVJfT0spKSByZXR1cm4gLTE7CisgICAgaWYgKGlucyhkLCAiUl9PSyIsIChsb25nKVJfT0spKSByZXR1cm4gLTE7CiAjZW5kaWYKICNpZmRlZiBXX09LCi0gICAgICAgIGlmIChpbnMoZCwgIldfT0siLCAobG9uZylXX09LKSkgcmV0dXJuIC0xOworICAgIGlmIChpbnMoZCwgIldfT0siLCAobG9uZylXX09LKSkgcmV0dXJuIC0xOwogI2VuZGlmCiAjaWZkZWYgWF9PSwotICAgICAgICBpZiAoaW5zKGQsICJYX09LIiwgKGxvbmcpWF9PSykpIHJldHVybiAtMTsKKyAgICBpZiAoaW5zKGQsICJYX09LIiwgKGxvbmcpWF9PSykpIHJldHVybiAtMTsKICNlbmRpZgogI2lmZGVmIE5HUk9VUFNfTUFYCi0gICAgICAgIGlmIChpbnMoZCwgIk5HUk9VUFNfTUFYIiwgKGxvbmcpTkdST1VQU19NQVgpKSByZXR1cm4gLTE7CisgICAgaWYgKGlucyhkLCAiTkdST1VQU19NQVgiLCAobG9uZylOR1JPVVBTX01BWCkpIHJldHVybiAtMTsKICNlbmRpZgogI2lmZGVmIFRNUF9NQVgKLSAgICAgICAgaWYgKGlucyhkLCAiVE1QX01BWCIsIChsb25nKVRNUF9NQVgpKSByZXR1cm4gLTE7CisgICAgaWYgKGlucyhkLCAiVE1QX01BWCIsIChsb25nKVRNUF9NQVgpKSByZXR1cm4gLTE7CiAjZW5kaWYKICNpZmRlZiBXQ09OVElOVUVECi0gICAgICAgIGlmIChpbnMoZCwgIldDT05USU5VRUQiLCAobG9uZylXQ09OVElOVUVEKSkgcmV0dXJuIC0xOworICAgIGlmIChpbnMoZCwgIldDT05USU5VRUQiLCAobG9uZylXQ09OVElOVUVEKSkgcmV0dXJuIC0xOwogI2VuZGlmCiAjaWZkZWYgV05PSEFORwotICAgICAgICBpZiAoaW5zKGQsICJXTk9IQU5HIiwgKGxvbmcpV05PSEFORykpIHJldHVybiAtMTsKKyAgICBpZiAoaW5zKGQsICJXTk9IQU5HIiwgKGxvbmcpV05PSEFORykpIHJldHVybiAtMTsKICNlbmRpZgogI2lmZGVmIFdVTlRSQUNFRAotICAgICAgICBpZiAoaW5zKGQsICJXVU5UUkFDRUQiLCAobG9uZylXVU5UUkFDRUQpKSByZXR1cm4gLTE7CisgICAgaWYgKGlucyhkLCAiV1VOVFJBQ0VEIiwgKGxvbmcpV1VOVFJBQ0VEKSkgcmV0dXJuIC0xOwogI2VuZGlmCiAjaWZkZWYgT19SRE9OTFkKLSAgICAgICAgaWYgKGlucyhkLCAiT19SRE9OTFkiLCAobG9uZylPX1JET05MWSkpIHJldHVybiAtMTsKKyAgICBpZiAoaW5zKGQsICJPX1JET05MWSIsIChsb25nKU9fUkRPTkxZKSkgcmV0dXJuIC0xOwogI2VuZGlmCiAjaWZkZWYgT19XUk9OTFkKLSAgICAgICAgaWYgKGlucyhkLCAiT19XUk9OTFkiLCAobG9uZylPX1dST05MWSkpIHJldHVybiAtMTsKKyAgICBpZiAoaW5zKGQsICJPX1dST05MWSIsIChsb25nKU9fV1JPTkxZKSkgcmV0dXJuIC0xOwogI2VuZGlmCiAjaWZkZWYgT19SRFdSCi0gICAgICAgIGlmIChpbnMoZCwgIk9fUkRXUiIsIChsb25nKU9fUkRXUikpIHJldHVybiAtMTsKKyAgICBpZiAoaW5zKGQsICJPX1JEV1IiLCAobG9uZylPX1JEV1IpKSByZXR1cm4gLTE7CiAjZW5kaWYKICNpZmRlZiBPX05ERUxBWQotICAgICAgICBpZiAoaW5zKGQsICJPX05ERUxBWSIsIChsb25nKU9fTkRFTEFZKSkgcmV0dXJuIC0xOworICAgIGlmIChpbnMoZCwgIk9fTkRFTEFZIiwgKGxvbmcpT19OREVMQVkpKSByZXR1cm4gLTE7CiAjZW5kaWYKICNpZmRlZiBPX05PTkJMT0NLCi0gICAgICAgIGlmIChpbnMoZCwgIk9fTk9OQkxPQ0siLCAobG9uZylPX05PTkJMT0NLKSkgcmV0dXJuIC0xOworICAgIGlmIChpbnMoZCwgIk9fTk9OQkxPQ0siLCAobG9uZylPX05PTkJMT0NLKSkgcmV0dXJuIC0xOwogI2VuZGlmCiAjaWZkZWYgT19BUFBFTkQKLSAgICAgICAgaWYgKGlucyhkLCAiT19BUFBFTkQiLCAobG9uZylPX0FQUEVORCkpIHJldHVybiAtMTsKKyAgICBpZiAoaW5zKGQsICJPX0FQUEVORCIsIChsb25nKU9fQVBQRU5EKSkgcmV0dXJuIC0xOwogI2VuZGlmCiAjaWZkZWYgT19EU1lOQwotICAgICAgICBpZiAoaW5zKGQsICJPX0RTWU5DIiwgKGxvbmcpT19EU1lOQykpIHJldHVybiAtMTsKKyAgICBpZiAoaW5zKGQsICJPX0RTWU5DIiwgKGxvbmcpT19EU1lOQykpIHJldHVybiAtMTsKICNlbmRpZgogI2lmZGVmIE9fUlNZTkMKLSAgICAgICAgaWYgKGlucyhkLCAiT19SU1lOQyIsIChsb25nKU9fUlNZTkMpKSByZXR1cm4gLTE7CisgICAgaWYgKGlucyhkLCAiT19SU1lOQyIsIChsb25nKU9fUlNZTkMpKSByZXR1cm4gLTE7CiAjZW5kaWYKICNpZmRlZiBPX1NZTkMKLSAgICAgICAgaWYgKGlucyhkLCAiT19TWU5DIiwgKGxvbmcpT19TWU5DKSkgcmV0dXJuIC0xOworICAgIGlmIChpbnMoZCwgIk9fU1lOQyIsIChsb25nKU9fU1lOQykpIHJldHVybiAtMTsKICNlbmRpZgogI2lmZGVmIE9fTk9DVFRZCi0gICAgICAgIGlmIChpbnMoZCwgIk9fTk9DVFRZIiwgKGxvbmcpT19OT0NUVFkpKSByZXR1cm4gLTE7CisgICAgaWYgKGlucyhkLCAiT19OT0NUVFkiLCAobG9uZylPX05PQ1RUWSkpIHJldHVybiAtMTsKICNlbmRpZgogI2lmZGVmIE9fQ1JFQVQKLSAgICAgICAgaWYgKGlucyhkLCAiT19DUkVBVCIsIChsb25nKU9fQ1JFQVQpKSByZXR1cm4gLTE7CisgICAgaWYgKGlucyhkLCAiT19DUkVBVCIsIChsb25nKU9fQ1JFQVQpKSByZXR1cm4gLTE7CiAjZW5kaWYKICNpZmRlZiBPX0VYQ0wKLSAgICAgICAgaWYgKGlucyhkLCAiT19FWENMIiwgKGxvbmcpT19FWENMKSkgcmV0dXJuIC0xOworICAgIGlmIChpbnMoZCwgIk9fRVhDTCIsIChsb25nKU9fRVhDTCkpIHJldHVybiAtMTsKICNlbmRpZgogI2lmZGVmIE9fVFJVTkMKLSAgICAgICAgaWYgKGlucyhkLCAiT19UUlVOQyIsIChsb25nKU9fVFJVTkMpKSByZXR1cm4gLTE7CisgICAgaWYgKGlucyhkLCAiT19UUlVOQyIsIChsb25nKU9fVFJVTkMpKSByZXR1cm4gLTE7CiAjZW5kaWYKICNpZmRlZiBPX0JJTkFSWQotICAgICAgICBpZiAoaW5zKGQsICJPX0JJTkFSWSIsIChsb25nKU9fQklOQVJZKSkgcmV0dXJuIC0xOworICAgIGlmIChpbnMoZCwgIk9fQklOQVJZIiwgKGxvbmcpT19CSU5BUlkpKSByZXR1cm4gLTE7CiAjZW5kaWYKICNpZmRlZiBPX1RFWFQKLSAgICAgICAgaWYgKGlucyhkLCAiT19URVhUIiwgKGxvbmcpT19URVhUKSkgcmV0dXJuIC0xOworICAgIGlmIChpbnMoZCwgIk9fVEVYVCIsIChsb25nKU9fVEVYVCkpIHJldHVybiAtMTsKICNlbmRpZgogI2lmZGVmIE9fTEFSR0VGSUxFCi0gICAgICAgIGlmIChpbnMoZCwgIk9fTEFSR0VGSUxFIiwgKGxvbmcpT19MQVJHRUZJTEUpKSByZXR1cm4gLTE7CisgICAgaWYgKGlucyhkLCAiT19MQVJHRUZJTEUiLCAobG9uZylPX0xBUkdFRklMRSkpIHJldHVybiAtMTsKICNlbmRpZgogCiAvKiBNUyBXaW5kb3dzICovCiAjaWZkZWYgT19OT0lOSEVSSVQKLQkvKiBEb24ndCBpbmhlcml0IGluIGNoaWxkIHByb2Nlc3Nlcy4gKi8KLSAgICAgICAgaWYgKGlucyhkLCAiT19OT0lOSEVSSVQiLCAobG9uZylPX05PSU5IRVJJVCkpIHJldHVybiAtMTsKKyAgICAvKiBEb24ndCBpbmhlcml0IGluIGNoaWxkIHByb2Nlc3Nlcy4gKi8KKyAgICBpZiAoaW5zKGQsICJPX05PSU5IRVJJVCIsIChsb25nKU9fTk9JTkhFUklUKSkgcmV0dXJuIC0xOwogI2VuZGlmCiAjaWZkZWYgX09fU0hPUlRfTElWRUQKLQkvKiBPcHRpbWl6ZSBmb3Igc2hvcnQgbGlmZSAoa2VlcCBpbiBtZW1vcnkpLiAqLwotCS8qIE1TIGZvcmdvdCB0byBkZWZpbmUgdGhpcyBvbmUgd2l0aCBhIG5vbi11bmRlcnNjb3JlIGZvcm0gdG9vLiAqLwotICAgICAgICBpZiAoaW5zKGQsICJPX1NIT1JUX0xJVkVEIiwgKGxvbmcpX09fU0hPUlRfTElWRUQpKSByZXR1cm4gLTE7CisgICAgLyogT3B0aW1pemUgZm9yIHNob3J0IGxpZmUgKGtlZXAgaW4gbWVtb3J5KS4gKi8KKyAgICAvKiBNUyBmb3Jnb3QgdG8gZGVmaW5lIHRoaXMgb25lIHdpdGggYSBub24tdW5kZXJzY29yZSBmb3JtIHRvby4gKi8KKyAgICBpZiAoaW5zKGQsICJPX1NIT1JUX0xJVkVEIiwgKGxvbmcpX09fU0hPUlRfTElWRUQpKSByZXR1cm4gLTE7CiAjZW5kaWYKICNpZmRlZiBPX1RFTVBPUkFSWQotCS8qIEF1dG9tYXRpY2FsbHkgZGVsZXRlIHdoZW4gbGFzdCBoYW5kbGUgaXMgY2xvc2VkLiAqLwotICAgICAgICBpZiAoaW5zKGQsICJPX1RFTVBPUkFSWSIsIChsb25nKU9fVEVNUE9SQVJZKSkgcmV0dXJuIC0xOworICAgIC8qIEF1dG9tYXRpY2FsbHkgZGVsZXRlIHdoZW4gbGFzdCBoYW5kbGUgaXMgY2xvc2VkLiAqLworICAgIGlmIChpbnMoZCwgIk9fVEVNUE9SQVJZIiwgKGxvbmcpT19URU1QT1JBUlkpKSByZXR1cm4gLTE7CiAjZW5kaWYKICNpZmRlZiBPX1JBTkRPTQotCS8qIE9wdGltaXplIGZvciByYW5kb20gYWNjZXNzLiAqLwotICAgICAgICBpZiAoaW5zKGQsICJPX1JBTkRPTSIsIChsb25nKU9fUkFORE9NKSkgcmV0dXJuIC0xOworICAgIC8qIE9wdGltaXplIGZvciByYW5kb20gYWNjZXNzLiAqLworICAgIGlmIChpbnMoZCwgIk9fUkFORE9NIiwgKGxvbmcpT19SQU5ET00pKSByZXR1cm4gLTE7CiAjZW5kaWYKICNpZmRlZiBPX1NFUVVFTlRJQUwKLQkvKiBPcHRpbWl6ZSBmb3Igc2VxdWVudGlhbCBhY2Nlc3MuICovCi0gICAgICAgIGlmIChpbnMoZCwgIk9fU0VRVUVOVElBTCIsIChsb25nKU9fU0VRVUVOVElBTCkpIHJldHVybiAtMTsKKyAgICAvKiBPcHRpbWl6ZSBmb3Igc2VxdWVudGlhbCBhY2Nlc3MuICovCisgICAgaWYgKGlucyhkLCAiT19TRVFVRU5USUFMIiwgKGxvbmcpT19TRVFVRU5USUFMKSkgcmV0dXJuIC0xOwogI2VuZGlmCiAKIC8qIEdOVSBleHRlbnNpb25zLiAqLwogI2lmZGVmIE9fRElSRUNUCi0gICAgICAgIC8qIERpcmVjdCBkaXNrIGFjY2Vzcy4gKi8KLSAgICAgICAgaWYgKGlucyhkLCAiT19ESVJFQ1QiLCAobG9uZylPX0RJUkVDVCkpIHJldHVybiAtMTsKKyAgICAvKiBEaXJlY3QgZGlzayBhY2Nlc3MuICovCisgICAgaWYgKGlucyhkLCAiT19ESVJFQ1QiLCAobG9uZylPX0RJUkVDVCkpIHJldHVybiAtMTsKICNlbmRpZgogI2lmZGVmIE9fRElSRUNUT1JZCi0gICAgICAgIC8qIE11c3QgYmUgYSBkaXJlY3RvcnkuCSAqLwotICAgICAgICBpZiAoaW5zKGQsICJPX0RJUkVDVE9SWSIsIChsb25nKU9fRElSRUNUT1JZKSkgcmV0dXJuIC0xOworICAgIC8qIE11c3QgYmUgYSBkaXJlY3RvcnkuICAgICAgKi8KKyAgICBpZiAoaW5zKGQsICJPX0RJUkVDVE9SWSIsIChsb25nKU9fRElSRUNUT1JZKSkgcmV0dXJuIC0xOwogI2VuZGlmCiAjaWZkZWYgT19OT0ZPTExPVwotICAgICAgICAvKiBEbyBub3QgZm9sbG93IGxpbmtzLgkgKi8KLSAgICAgICAgaWYgKGlucyhkLCAiT19OT0ZPTExPVyIsIChsb25nKU9fTk9GT0xMT1cpKSByZXR1cm4gLTE7CisgICAgLyogRG8gbm90IGZvbGxvdyBsaW5rcy4gICAgICAqLworICAgIGlmIChpbnMoZCwgIk9fTk9GT0xMT1ciLCAobG9uZylPX05PRk9MTE9XKSkgcmV0dXJuIC0xOwogI2VuZGlmCiAKLQkvKiBUaGVzZSBjb21lIGZyb20gc3lzZXhpdHMuaCAqLworICAgIC8qIFRoZXNlIGNvbWUgZnJvbSBzeXNleGl0cy5oICovCiAjaWZkZWYgRVhfT0sKLQlpZiAoaW5zKGQsICJFWF9PSyIsIChsb25nKUVYX09LKSkgcmV0dXJuIC0xOworICAgIGlmIChpbnMoZCwgIkVYX09LIiwgKGxvbmcpRVhfT0spKSByZXR1cm4gLTE7CiAjZW5kaWYgLyogRVhfT0sgKi8KICNpZmRlZiBFWF9VU0FHRQotCWlmIChpbnMoZCwgIkVYX1VTQUdFIiwgKGxvbmcpRVhfVVNBR0UpKSByZXR1cm4gLTE7CisgICAgaWYgKGlucyhkLCAiRVhfVVNBR0UiLCAobG9uZylFWF9VU0FHRSkpIHJldHVybiAtMTsKICNlbmRpZiAvKiBFWF9VU0FHRSAqLwogI2lmZGVmIEVYX0RBVEFFUlIKLQlpZiAoaW5zKGQsICJFWF9EQVRBRVJSIiwgKGxvbmcpRVhfREFUQUVSUikpIHJldHVybiAtMTsKKyAgICBpZiAoaW5zKGQsICJFWF9EQVRBRVJSIiwgKGxvbmcpRVhfREFUQUVSUikpIHJldHVybiAtMTsKICNlbmRpZiAvKiBFWF9EQVRBRVJSICovCiAjaWZkZWYgRVhfTk9JTlBVVAotCWlmIChpbnMoZCwgIkVYX05PSU5QVVQiLCAobG9uZylFWF9OT0lOUFVUKSkgcmV0dXJuIC0xOworICAgIGlmIChpbnMoZCwgIkVYX05PSU5QVVQiLCAobG9uZylFWF9OT0lOUFVUKSkgcmV0dXJuIC0xOwogI2VuZGlmIC8qIEVYX05PSU5QVVQgKi8KICNpZmRlZiBFWF9OT1VTRVIKLQlpZiAoaW5zKGQsICJFWF9OT1VTRVIiLCAobG9uZylFWF9OT1VTRVIpKSByZXR1cm4gLTE7CisgICAgaWYgKGlucyhkLCAiRVhfTk9VU0VSIiwgKGxvbmcpRVhfTk9VU0VSKSkgcmV0dXJuIC0xOwogI2VuZGlmIC8qIEVYX05PVVNFUiAqLwogI2lmZGVmIEVYX05PSE9TVAotCWlmIChpbnMoZCwgIkVYX05PSE9TVCIsIChsb25nKUVYX05PSE9TVCkpIHJldHVybiAtMTsKKyAgICBpZiAoaW5zKGQsICJFWF9OT0hPU1QiLCAobG9uZylFWF9OT0hPU1QpKSByZXR1cm4gLTE7CiAjZW5kaWYgLyogRVhfTk9IT1NUICovCiAjaWZkZWYgRVhfVU5BVkFJTEFCTEUKLQlpZiAoaW5zKGQsICJFWF9VTkFWQUlMQUJMRSIsIChsb25nKUVYX1VOQVZBSUxBQkxFKSkgcmV0dXJuIC0xOworICAgIGlmIChpbnMoZCwgIkVYX1VOQVZBSUxBQkxFIiwgKGxvbmcpRVhfVU5BVkFJTEFCTEUpKSByZXR1cm4gLTE7CiAjZW5kaWYgLyogRVhfVU5BVkFJTEFCTEUgKi8KICNpZmRlZiBFWF9TT0ZUV0FSRQotCWlmIChpbnMoZCwgIkVYX1NPRlRXQVJFIiwgKGxvbmcpRVhfU09GVFdBUkUpKSByZXR1cm4gLTE7CisgICAgaWYgKGlucyhkLCAiRVhfU09GVFdBUkUiLCAobG9uZylFWF9TT0ZUV0FSRSkpIHJldHVybiAtMTsKICNlbmRpZiAvKiBFWF9TT0ZUV0FSRSAqLwogI2lmZGVmIEVYX09TRVJSCi0JaWYgKGlucyhkLCAiRVhfT1NFUlIiLCAobG9uZylFWF9PU0VSUikpIHJldHVybiAtMTsKKyAgICBpZiAoaW5zKGQsICJFWF9PU0VSUiIsIChsb25nKUVYX09TRVJSKSkgcmV0dXJuIC0xOwogI2VuZGlmIC8qIEVYX09TRVJSICovCiAjaWZkZWYgRVhfT1NGSUxFCi0JaWYgKGlucyhkLCAiRVhfT1NGSUxFIiwgKGxvbmcpRVhfT1NGSUxFKSkgcmV0dXJuIC0xOworICAgIGlmIChpbnMoZCwgIkVYX09TRklMRSIsIChsb25nKUVYX09TRklMRSkpIHJldHVybiAtMTsKICNlbmRpZiAvKiBFWF9PU0ZJTEUgKi8KICNpZmRlZiBFWF9DQU5UQ1JFQVQKLQlpZiAoaW5zKGQsICJFWF9DQU5UQ1JFQVQiLCAobG9uZylFWF9DQU5UQ1JFQVQpKSByZXR1cm4gLTE7CisgICAgaWYgKGlucyhkLCAiRVhfQ0FOVENSRUFUIiwgKGxvbmcpRVhfQ0FOVENSRUFUKSkgcmV0dXJuIC0xOwogI2VuZGlmIC8qIEVYX0NBTlRDUkVBVCAqLwogI2lmZGVmIEVYX0lPRVJSCi0JaWYgKGlucyhkLCAiRVhfSU9FUlIiLCAobG9uZylFWF9JT0VSUikpIHJldHVybiAtMTsKKyAgICBpZiAoaW5zKGQsICJFWF9JT0VSUiIsIChsb25nKUVYX0lPRVJSKSkgcmV0dXJuIC0xOwogI2VuZGlmIC8qIEVYX0lPRVJSICovCiAjaWZkZWYgRVhfVEVNUEZBSUwKLQlpZiAoaW5zKGQsICJFWF9URU1QRkFJTCIsIChsb25nKUVYX1RFTVBGQUlMKSkgcmV0dXJuIC0xOworICAgIGlmIChpbnMoZCwgIkVYX1RFTVBGQUlMIiwgKGxvbmcpRVhfVEVNUEZBSUwpKSByZXR1cm4gLTE7CiAjZW5kaWYgLyogRVhfVEVNUEZBSUwgKi8KICNpZmRlZiBFWF9QUk9UT0NPTAotCWlmIChpbnMoZCwgIkVYX1BST1RPQ09MIiwgKGxvbmcpRVhfUFJPVE9DT0wpKSByZXR1cm4gLTE7CisgICAgaWYgKGlucyhkLCAiRVhfUFJPVE9DT0wiLCAobG9uZylFWF9QUk9UT0NPTCkpIHJldHVybiAtMTsKICNlbmRpZiAvKiBFWF9QUk9UT0NPTCAqLwogI2lmZGVmIEVYX05PUEVSTQotCWlmIChpbnMoZCwgIkVYX05PUEVSTSIsIChsb25nKUVYX05PUEVSTSkpIHJldHVybiAtMTsKKyAgICBpZiAoaW5zKGQsICJFWF9OT1BFUk0iLCAobG9uZylFWF9OT1BFUk0pKSByZXR1cm4gLTE7CiAjZW5kaWYgLyogRVhfTk9QRVJNICovCiAjaWZkZWYgRVhfQ09ORklHCi0JaWYgKGlucyhkLCAiRVhfQ09ORklHIiwgKGxvbmcpRVhfQ09ORklHKSkgcmV0dXJuIC0xOworICAgIGlmIChpbnMoZCwgIkVYX0NPTkZJRyIsIChsb25nKUVYX0NPTkZJRykpIHJldHVybiAtMTsKICNlbmRpZiAvKiBFWF9DT05GSUcgKi8KICNpZmRlZiBFWF9OT1RGT1VORAotCWlmIChpbnMoZCwgIkVYX05PVEZPVU5EIiwgKGxvbmcpRVhfTk9URk9VTkQpKSByZXR1cm4gLTE7CisgICAgaWYgKGlucyhkLCAiRVhfTk9URk9VTkQiLCAobG9uZylFWF9OT1RGT1VORCkpIHJldHVybiAtMTsKICNlbmRpZiAvKiBFWF9OT1RGT1VORCAqLwogCi0gICAgICAgIHJldHVybiAwOworICAgIHJldHVybiAwOwogfQogCiAKIHZvaWQKIGluaXRyaXNjb3MoKQogewotCVB5T2JqZWN0ICptLCAqZCwgKnN0YXRfbTsKKyAgICBQeU9iamVjdCAqbSwgKmQsICpzdGF0X207CiAKLQltID0gUHlfSW5pdE1vZHVsZSgicmlzY29zIiwgcmlzY29zX21ldGhvZHMpOworICAgIG0gPSBQeV9Jbml0TW9kdWxlKCJyaXNjb3MiLCByaXNjb3NfbWV0aG9kcyk7CiAKLQlpZiAoYWxsX2lucyhtKSkKLQkJcmV0dXJuOworICAgIGlmIChhbGxfaW5zKG0pKQorICAgICAgICByZXR1cm47CiAKLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKIAotCVB5X0lOQ1JFRihQeUV4Y19PU0Vycm9yKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgImVycm9yIiwgUHlFeGNfT1NFcnJvcik7CisgICAgUHlfSU5DUkVGKFB5RXhjX09TRXJyb3IpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiZXJyb3IiLCBQeUV4Y19PU0Vycm9yKTsKIAotCVB5U3RydWN0U2VxdWVuY2VfSW5pdFR5cGUoJlN0YXRSZXN1bHRUeXBlLCAmc3RhdF9yZXN1bHRfZGVzYyk7Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgInN0YXRfcmVzdWx0IiwgKFB5T2JqZWN0KikgJlN0YXRSZXN1bHRUeXBlKTsKKyAgICBQeVN0cnVjdFNlcXVlbmNlX0luaXRUeXBlKCZTdGF0UmVzdWx0VHlwZSwgJnN0YXRfcmVzdWx0X2Rlc2MpOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJzdGF0X3Jlc3VsdCIsIChQeU9iamVjdCopICZTdGF0UmVzdWx0VHlwZSk7CiB9CmRpZmYgLS1naXQgYS9SSVNDT1MvUHl0aG9uL2R5bmxvYWRfcmlzY29zLmMgYi9SSVNDT1MvUHl0aG9uL2R5bmxvYWRfcmlzY29zLmMKaW5kZXggNmI4N2YyZC4uOGVjYjI5ZCAxMDA2NDQKLS0tIGEvUklTQ09TL1B5dGhvbi9keW5sb2FkX3Jpc2Nvcy5jCisrKyBiL1JJU0NPUy9QeXRob24vZHlubG9hZF9yaXNjb3MuYwpAQCAtMzksOCArMzksOCBAQAogCiAKIGNvbnN0IHN0cnVjdCBmaWxlZGVzY3IgX1B5SW1wb3J0X0R5bkxvYWRGaWxldGFiW10gPSB7Ci0JeyIvcHlkIiwgInJiIiwgQ19FWFRFTlNJT059LAotCXswLCAwfQorICAgIHsiL3B5ZCIsICJyYiIsIENfRVhURU5TSU9OfSwKKyAgICB7MCwgMH0KIH07CiAKIHZvaWQgZHlubG9hZF9pbml0X2R1bW15KCkKQEAgLTQ4LDE2ICs0OCwxNiBAQAogfQogCiBkbF9mdW5jcHRyIF9QeUltcG9ydF9HZXREeW5Mb2FkRnVuYyhjb25zdCBjaGFyICpmcW5hbWUsIGNvbnN0IGNoYXIgKnNob3J0bmFtZSwKLQkJCQkgICAgY2hhciAqcGF0aG5hbWUsIEZJTEUgKmZwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqcGF0aG5hbWUsIEZJTEUgKmZwKQogewotCWludCBlcnI7Ci0JY2hhciBlcnJzdHJbMjU2XTsKLQl2b2lkICgqaW5pdF9mdW5jdGlvbikodm9pZCk7CisgICAgaW50IGVycjsKKyAgICBjaGFyIGVycnN0clsyNTZdOworICAgIHZvaWQgKCppbml0X2Z1bmN0aW9uKSh2b2lkKTsKIAotCWVyciA9IGRsa19sb2FkX25vX2luaXQocGF0aG5hbWUsICZpbml0X2Z1bmN0aW9uKTsKLQlpZiAoZXJyKSB7Ci0JICAgIFB5T1Nfc25wcmludGYoZXJyc3RyLCBzaXplb2YoZXJyc3RyKSwgImRsayBmYWlsdXJlICVkIiwgZXJyKTsKLQkgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0ltcG9ydEVycm9yLCBlcnJzdHIpOwotCX0KLQlyZXR1cm4gaW5pdF9mdW5jdGlvbjsKKyAgICBlcnIgPSBkbGtfbG9hZF9ub19pbml0KHBhdGhuYW1lLCAmaW5pdF9mdW5jdGlvbik7CisgICAgaWYgKGVycikgeworICAgICAgICBQeU9TX3NucHJpbnRmKGVycnN0ciwgc2l6ZW9mKGVycnN0ciksICJkbGsgZmFpbHVyZSAlZCIsIGVycik7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwgZXJyc3RyKTsKKyAgICB9CisgICAgcmV0dXJuIGluaXRfZnVuY3Rpb247CiB9CmRpZmYgLS1naXQgYS9SSVNDT1Mvc2xlZXAuYyBiL1JJU0NPUy9zbGVlcC5jCmluZGV4IGM4NWViODYuLmZmZGZmODEgMTAwNjQ0Ci0tLSBhL1JJU0NPUy9zbGVlcC5jCisrKyBiL1JJU0NPUy9zbGVlcC5jCkBAIC05LDMzICs5LDMzIEBACiAKIGludCByaXNjb3Nfc2xlZXAoZG91YmxlIGRlbGF5KQogewotCW9zX3Qgc3RhcnR0aW1lLCBlbmR0aW1lLCB0aW1lOyAvKiBtb25vdG9uaWMgdGltZXMgKGNlbnRpc2Vjb25kcykgKi8KLQlpbnQgKnBvbGx3b3JkLCByZXQ7Ci0Jb3Nib29sIGNsYWltZWQ7CisgICAgb3NfdCBzdGFydHRpbWUsIGVuZHRpbWUsIHRpbWU7IC8qIG1vbm90b25pYyB0aW1lcyAoY2VudGlzZWNvbmRzKSAqLworICAgIGludCAqcG9sbHdvcmQsIHJldDsKKyAgICBvc2Jvb2wgY2xhaW1lZDsKIAotICAgICAgICAvKiBjYWxjdWxhdGUgZW5kIHRpbWUgKi8KLQlzdGFydHRpbWUgPSBvc19yZWFkX21vbm90b25pY190aW1lKCk7Ci0JaWYgKHN0YXJ0dGltZSArIDEwMC4wKmRlbGF5ID5JTlRfTUFYKQotCQllbmR0aW1lID0gSU5UX01BWDsKLQllbHNlCi0JCWVuZHRpbWUgPSAob3NfdCkoc3RhcnR0aW1lICsgMTAwLjAqZGVsYXkpOworICAgIC8qIGNhbGN1bGF0ZSBlbmQgdGltZSAqLworICAgIHN0YXJ0dGltZSA9IG9zX3JlYWRfbW9ub3RvbmljX3RpbWUoKTsKKyAgICBpZiAoc3RhcnR0aW1lICsgMTAwLjAqZGVsYXkgPklOVF9NQVgpCisgICAgICAgIGVuZHRpbWUgPSBJTlRfTUFYOworICAgIGVsc2UKKyAgICAgICAgZW5kdGltZSA9IChvc190KShzdGFydHRpbWUgKyAxMDAuMCpkZWxheSk7CiAKLQkvKiBhbGxvY2F0ZSAoaW4gUk1BKSBhbmQgc2V0IHBvbGx3b3JkIGZvciB4dXBjYWxsX3NsZWVwICovCi0JcG9sbHdvcmQgPSBvc21vZHVsZV9hbGxvYyg0KTsKLQkqcG9sbHdvcmQgPSAxOworICAgIC8qIGFsbG9jYXRlIChpbiBSTUEpIGFuZCBzZXQgcG9sbHdvcmQgZm9yIHh1cGNhbGxfc2xlZXAgKi8KKyAgICBwb2xsd29yZCA9IG9zbW9kdWxlX2FsbG9jKDQpOworICAgICpwb2xsd29yZCA9IDE7CiAKLQl0aW1lID0gc3RhcnR0aW1lOwotCXJldCA9IDA7Ci0Jd2hpbGUgKCB0aW1lPGVuZHRpbWUgJiYgdGltZT49c3RhcnR0aW1lICkgewotCQl4dXBjYWxsX3NsZWVwIChwb2xsd29yZCwgJmNsYWltZWQpOwotCQlpZiAoUHlFcnJfQ2hlY2tTaWduYWxzKCkpIHsKLQkJCXJldCA9IDE7Ci0JCQlicmVhazsKLQkJfQotCQl0aW1lID0gb3NfcmVhZF9tb25vdG9uaWNfdGltZSgpOwotCX0KKyAgICB0aW1lID0gc3RhcnR0aW1lOworICAgIHJldCA9IDA7CisgICAgd2hpbGUgKCB0aW1lPGVuZHRpbWUgJiYgdGltZT49c3RhcnR0aW1lICkgeworICAgICAgICB4dXBjYWxsX3NsZWVwIChwb2xsd29yZCwgJmNsYWltZWQpOworICAgICAgICBpZiAoUHlFcnJfQ2hlY2tTaWduYWxzKCkpIHsKKyAgICAgICAgICAgIHJldCA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB0aW1lID0gb3NfcmVhZF9tb25vdG9uaWNfdGltZSgpOworICAgIH0KIAotCS8qIGRlYWxsb2NhdGUgcG9sbHdvcmQgKi8KLQlvc21vZHVsZV9mcmVlKHBvbGx3b3JkKTsKLQlyZXR1cm4gcmV0OworICAgIC8qIGRlYWxsb2NhdGUgcG9sbHdvcmQgKi8KKyAgICBvc21vZHVsZV9mcmVlKHBvbGx3b3JkKTsKKyAgICByZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvVG9vbHMvbXNpL21zaXN1cHBvcnQuYyBiL1Rvb2xzL21zaS9tc2lzdXBwb3J0LmMKaW5kZXggZjYwYTM1Ni4uMWZkMmVlNCAxMDA2NDQKLS0tIGEvVG9vbHMvbXNpL21zaXN1cHBvcnQuYworKysgYi9Ub29scy9tc2kvbXNpc3VwcG9ydC5jCkBAIC03LDEzICs3LDEzIEBACiAgKi8KIHN0YXRpYyBVSU5UIGRlYnVnKE1TSUhBTkRMRSBoSW5zdGFsbCwgTFBDU1RSIG1zZykKIHsKLQlNU0lIQU5ETEUgaFJlYyA9IE1zaUNyZWF0ZVJlY29yZCgxKTsKLQlpZiAoIWhSZWMgfHwgTXNpUmVjb3JkU2V0U3RyaW5nQShoUmVjLCAxLCBtc2cpICE9IEVSUk9SX1NVQ0NFU1MpIHsKLQkJcmV0dXJuIEVSUk9SX0lOU1RBTExfRkFJTFVSRTsKLQl9Ci0JTXNpUHJvY2Vzc01lc3NhZ2UoaEluc3RhbGwsIElOU1RBTExNRVNTQUdFX0lORk8sIGhSZWMpOwotCU1zaUNsb3NlSGFuZGxlKGhSZWMpOwotCXJldHVybiBFUlJPUl9TVUNDRVNTOworICAgIE1TSUhBTkRMRSBoUmVjID0gTXNpQ3JlYXRlUmVjb3JkKDEpOworICAgIGlmICghaFJlYyB8fCBNc2lSZWNvcmRTZXRTdHJpbmdBKGhSZWMsIDEsIG1zZykgIT0gRVJST1JfU1VDQ0VTUykgeworICAgICAgICByZXR1cm4gRVJST1JfSU5TVEFMTF9GQUlMVVJFOworICAgIH0KKyAgICBNc2lQcm9jZXNzTWVzc2FnZShoSW5zdGFsbCwgSU5TVEFMTE1FU1NBR0VfSU5GTywgaFJlYyk7CisgICAgTXNpQ2xvc2VIYW5kbGUoaFJlYyk7CisgICAgcmV0dXJuIEVSUk9SX1NVQ0NFU1M7CiB9CiAKIC8qIENoZWNrIHdoZXRoZXIgdGhlIFRBUkdFVERJUiBleGlzdHMgYW5kIGlzIGEgZGlyZWN0b3J5LgpAQCAtMjIsMjcgKzIyLDI3IEBACiBVSU5UIF9fZGVjbHNwZWMoZGxsZXhwb3J0KSBfX3N0ZGNhbGwgQ2hlY2tEaXIoTVNJSEFORExFIGhJbnN0YWxsKQogewogI2RlZmluZSBQU0laRSAxMDI0Ci0JV0NIQVIgd3BhdGhbUFNJWkVdOwotCWNoYXIgcGF0aFtQU0laRV07Ci0JVUlOVCByZXN1bHQ7Ci0JRFdPUkQgc2l6ZSA9IFBTSVpFOwotCURXT1JEIGF0dHJpYnV0ZXM7CisgICAgV0NIQVIgd3BhdGhbUFNJWkVdOworICAgIGNoYXIgcGF0aFtQU0laRV07CisgICAgVUlOVCByZXN1bHQ7CisgICAgRFdPUkQgc2l6ZSA9IFBTSVpFOworICAgIERXT1JEIGF0dHJpYnV0ZXM7CiAKLQkKLQlyZXN1bHQgPSBNc2lHZXRQcm9wZXJ0eVcoaEluc3RhbGwsIEwiVEFSR0VURElSIiwgd3BhdGgsICZzaXplKTsKLQlpZiAocmVzdWx0ICE9IEVSUk9SX1NVQ0NFU1MpCi0JCXJldHVybiByZXN1bHQ7Ci0Jd3BhdGhbc2l6ZV0gPSBMJ1wwJzsKLQlwYXRoW3NpemVdID0gTCdcMCc7CiAKLQlhdHRyaWJ1dGVzID0gR2V0RmlsZUF0dHJpYnV0ZXNXKHdwYXRoKTsKLQlpZiAoYXR0cmlidXRlcyA9PSBJTlZBTElEX0ZJTEVfQVRUUklCVVRFUyB8fAotCQkhKGF0dHJpYnV0ZXMgJiBGSUxFX0FUVFJJQlVURV9ESVJFQ1RPUlkpKSAKLQl7Ci0JCXJldHVybiBNc2lTZXRQcm9wZXJ0eUEoaEluc3RhbGwsICJUYXJnZXRFeGlzdHMiLCAiMCIpOwotCX0gZWxzZSB7Ci0JCXJldHVybiBNc2lTZXRQcm9wZXJ0eUEoaEluc3RhbGwsICJUYXJnZXRFeGlzdHMiLCAiMSIpOwotCX0KKyAgICByZXN1bHQgPSBNc2lHZXRQcm9wZXJ0eVcoaEluc3RhbGwsIEwiVEFSR0VURElSIiwgd3BhdGgsICZzaXplKTsKKyAgICBpZiAocmVzdWx0ICE9IEVSUk9SX1NVQ0NFU1MpCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgd3BhdGhbc2l6ZV0gPSBMJ1wwJzsKKyAgICBwYXRoW3NpemVdID0gTCdcMCc7CisKKyAgICBhdHRyaWJ1dGVzID0gR2V0RmlsZUF0dHJpYnV0ZXNXKHdwYXRoKTsKKyAgICBpZiAoYXR0cmlidXRlcyA9PSBJTlZBTElEX0ZJTEVfQVRUUklCVVRFUyB8fAorICAgICAgICAhKGF0dHJpYnV0ZXMgJiBGSUxFX0FUVFJJQlVURV9ESVJFQ1RPUlkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE1zaVNldFByb3BlcnR5QShoSW5zdGFsbCwgIlRhcmdldEV4aXN0cyIsICIwIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIE1zaVNldFByb3BlcnR5QShoSW5zdGFsbCwgIlRhcmdldEV4aXN0cyIsICIxIik7CisgICAgfQogfQogCiAvKiBVcGRhdGUgdGhlIHN0YXRlIG9mIHRoZSBSRUdJU1RSWS50Y2wgY29tcG9uZW50IGFjY29yZGluZyB0byB0aGUKQEAgLTUxLDQxICs1MSw0MSBAQAogICovCiBVSU5UIF9fZGVjbHNwZWMoZGxsZXhwb3J0KSBfX3N0ZGNhbGwgVXBkYXRlRWRpdElETEUoTVNJSEFORExFIGhJbnN0YWxsKQogewotCUlOU1RBTExTVEFURSBleHRfb2xkLCBleHRfbmV3LCB0Y2xfb2xkLCB0Y2xfbmV3LCByZWdfbmV3OwotCVVJTlQgcmVzdWx0OworICAgIElOU1RBTExTVEFURSBleHRfb2xkLCBleHRfbmV3LCB0Y2xfb2xkLCB0Y2xfbmV3LCByZWdfbmV3OworICAgIFVJTlQgcmVzdWx0OwogCi0JcmVzdWx0ID0gTXNpR2V0RmVhdHVyZVN0YXRlQShoSW5zdGFsbCwgIkV4dGVuc2lvbnMiLCAmZXh0X29sZCwgJmV4dF9uZXcpOwotCWlmIChyZXN1bHQgIT0gRVJST1JfU1VDQ0VTUykKLQkJcmV0dXJuIHJlc3VsdDsKLQlyZXN1bHQgPSBNc2lHZXRGZWF0dXJlU3RhdGVBKGhJbnN0YWxsLCAiVGNsVGsiLCAmdGNsX29sZCwgJnRjbF9uZXcpOwotCWlmIChyZXN1bHQgIT0gRVJST1JfU1VDQ0VTUykKLQkJcmV0dXJuIHJlc3VsdDsKKyAgICByZXN1bHQgPSBNc2lHZXRGZWF0dXJlU3RhdGVBKGhJbnN0YWxsLCAiRXh0ZW5zaW9ucyIsICZleHRfb2xkLCAmZXh0X25ldyk7CisgICAgaWYgKHJlc3VsdCAhPSBFUlJPUl9TVUNDRVNTKQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIHJlc3VsdCA9IE1zaUdldEZlYXR1cmVTdGF0ZUEoaEluc3RhbGwsICJUY2xUayIsICZ0Y2xfb2xkLCAmdGNsX25ldyk7CisgICAgaWYgKHJlc3VsdCAhPSBFUlJPUl9TVUNDRVNTKQorICAgICAgICByZXR1cm4gcmVzdWx0OwogCi0JLyogSWYgdGhlIGN1cnJlbnQgc3RhdGUgaXMgQWJzZW50LCBhbmQgdGhlIHVzZXIgZGlkIG5vdCBzZWxlY3QKLQkgICB0aGUgZmVhdHVyZSBpbiB0aGUgVUksIEluc3RhbGxlciBhcHBhcmVudGx5IHNldHMgdGhlICJzZWxlY3RlZCIKLQkgICBzdGF0ZSB0byB1bmtub3duLiBVcGRhdGUgaXQgdG8gdGhlIGN1cnJlbnQgdmFsdWUsIHRoZW4uICovCi0JaWYgKGV4dF9uZXcgPT0gSU5TVEFMTFNUQVRFX1VOS05PV04pCi0JCWV4dF9uZXcgPSBleHRfb2xkOwotCWlmICh0Y2xfbmV3ID09IElOU1RBTExTVEFURV9VTktOT1dOKQotCQl0Y2xfbmV3ID0gdGNsX29sZDsKKyAgICAvKiBJZiB0aGUgY3VycmVudCBzdGF0ZSBpcyBBYnNlbnQsIGFuZCB0aGUgdXNlciBkaWQgbm90IHNlbGVjdAorICAgICAgIHRoZSBmZWF0dXJlIGluIHRoZSBVSSwgSW5zdGFsbGVyIGFwcGFyZW50bHkgc2V0cyB0aGUgInNlbGVjdGVkIgorICAgICAgIHN0YXRlIHRvIHVua25vd24uIFVwZGF0ZSBpdCB0byB0aGUgY3VycmVudCB2YWx1ZSwgdGhlbi4gKi8KKyAgICBpZiAoZXh0X25ldyA9PSBJTlNUQUxMU1RBVEVfVU5LTk9XTikKKyAgICAgICAgZXh0X25ldyA9IGV4dF9vbGQ7CisgICAgaWYgKHRjbF9uZXcgPT0gSU5TVEFMTFNUQVRFX1VOS05PV04pCisgICAgICAgIHRjbF9uZXcgPSB0Y2xfb2xkOwogCi0JLy8gWFhYIGNvbnNpZGVyIGN1cnJlbnQgc3RhdGUgb2YgUkVHSVNUUlkudGNsPwotCWlmICgoKHRjbF9uZXcgPT0gSU5TVEFMTFNUQVRFX0xPQ0FMKSB8fAotCQkgKHRjbF9uZXcgPT0gSU5TVEFMTFNUQVRFX1NPVVJDRSkgfHwKLQkJICh0Y2xfbmV3ID09IElOU1RBTExTVEFURV9ERUZBVUxUKSkgJiYKLQkJKChleHRfbmV3ID09IElOU1RBTExTVEFURV9MT0NBTCkgfHwKLQkJIChleHRfbmV3ID09IElOU1RBTExTVEFURV9TT1VSQ0UpIHx8Ci0JCSAoZXh0X25ldyA9PSBJTlNUQUxMU1RBVEVfREVGQVVMVCkpKSB7Ci0JCXJlZ19uZXcgPSBJTlNUQUxMU1RBVEVfU09VUkNFOwotCX0gZWxzZSB7IAotCQlyZWdfbmV3ID0gSU5TVEFMTFNUQVRFX0FCU0VOVDsKLQl9Ci0JcmVzdWx0ID0gTXNpU2V0Q29tcG9uZW50U3RhdGVBKGhJbnN0YWxsLCAiUkVHSVNUUlkudGNsIiwgcmVnX25ldyk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICAvLyBYWFggY29uc2lkZXIgY3VycmVudCBzdGF0ZSBvZiBSRUdJU1RSWS50Y2w/CisgICAgaWYgKCgodGNsX25ldyA9PSBJTlNUQUxMU1RBVEVfTE9DQUwpIHx8CisgICAgICAgICAgICAgKHRjbF9uZXcgPT0gSU5TVEFMTFNUQVRFX1NPVVJDRSkgfHwKKyAgICAgICAgICAgICAodGNsX25ldyA9PSBJTlNUQUxMU1RBVEVfREVGQVVMVCkpICYmCisgICAgICAgICgoZXh0X25ldyA9PSBJTlNUQUxMU1RBVEVfTE9DQUwpIHx8CisgICAgICAgICAoZXh0X25ldyA9PSBJTlNUQUxMU1RBVEVfU09VUkNFKSB8fAorICAgICAgICAgKGV4dF9uZXcgPT0gSU5TVEFMTFNUQVRFX0RFRkFVTFQpKSkgeworICAgICAgICByZWdfbmV3ID0gSU5TVEFMTFNUQVRFX1NPVVJDRTsKKyAgICB9IGVsc2UgeworICAgICAgICByZWdfbmV3ID0gSU5TVEFMTFNUQVRFX0FCU0VOVDsKKyAgICB9CisgICAgcmVzdWx0ID0gTXNpU2V0Q29tcG9uZW50U3RhdGVBKGhJbnN0YWxsLCAiUkVHSVNUUlkudGNsIiwgcmVnX25ldyk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAotQk9PTCBBUElFTlRSWSBEbGxNYWluKEhBTkRMRSBoTW9kdWxlLCAKLSAgICAgICAgICAgICAgICAgICAgICBEV09SRCAgdWxfcmVhc29uX2Zvcl9jYWxsLCAKK0JPT0wgQVBJRU5UUlkgRGxsTWFpbihIQU5ETEUgaE1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICBEV09SRCAgdWxfcmVhc29uX2Zvcl9jYWxsLAogICAgICAgICAgICAgICAgICAgICAgIExQVk9JRCBscFJlc2VydmVkKQogewogICAgIHJldHVybiBUUlVFOwo=